[
  {
    "path": ".appveyor.yml",
    "content": "version: 1.0.{build}-{branch}\n\nbranches:\n  except:\n    - gh-pages\n\nskip_tags: true\n\nskip_commits:\n  files:\n    - .drone.star\n    - .github/**\n    - android/**\n    - docs/**\n    - src/**/*_posix.*\n    - src/**/*_linux.*\n    - src/**/*_gnulinux.*\n    - src/**/*_x11.*\n    - src/**/*_gtk.*\n    - src/**/*_android.*\n    - src/**/*_mac.*\n    - LICENSE\n    - README.md\n\nskip_branch_with_pr: true\n\npull_requests:\n  do_not_increment_build_number: true\n\nos: Visual Studio 2019\n\ninit:\n  - ps: |\n      If (-Not $env:APPVEYOR_PULL_REQUEST_NUMBER) {\n        $env:is_not_pr = \"true\"\n      }\n      If (-Not $env:APPVEYOR_REPO_COMMIT_MESSAGE_EXTENDED) {\n        $env:APPVEYOR_REPO_COMMIT_MESSAGE_EXTENDED = \" \"\n      }\n\ninstall:\n  - |\n    vcpkg integrate remove\n    xb setup\n\nplatform: Windows\n\nconfiguration: [Release, Checked]\n\nbuild_script:\n  - xb build --config=%CONFIGURATION% --target=src\\xenia-app --target=tests\\xenia-base-tests --target=tests\\xenia-cpu-ppc-tests --target=src\\xenia-vfs-dump\n\nafter_build:\n  - |\n      IF NOT \"%CONFIGURATION%\"==\"Checked\" SET \"ARCHIVE_SUFFIX=%APPVEYOR_REPO_BRANCH%\"\n      IF NOT \"%CONFIGURATION%\"==\"Checked\" SET \"ARCHIVE_SWITCHES=--\"\n      IF     \"%CONFIGURATION%\"==\"Checked\" SET \"ARCHIVE_SUFFIX=%APPVEYOR_REPO_BRANCH%_FOR-DEVS-ONLY\"\n      IF     \"%CONFIGURATION%\"==\"Checked\" SET \"ARCHIVE_SWITCHES=\"-pI know what I am doing.\" --\"\n      7z a xenia_%ARCHIVE_SUFFIX%.zip          %ARCHIVE_SWITCHES% LICENSE \"%APPVEYOR_BUILD_FOLDER%\\build\\bin\\%PLATFORM%\\%CONFIGURATION%\\xenia.exe\"          \"%APPVEYOR_BUILD_FOLDER%\\build\\bin\\%PLATFORM%\\%CONFIGURATION%\\xenia.pdb\"\n      7z a xenia-vfs-dump_%ARCHIVE_SUFFIX%.zip %ARCHIVE_SWITCHES% LICENSE \"%APPVEYOR_BUILD_FOLDER%\\build\\bin\\%PLATFORM%\\%CONFIGURATION%\\xenia-vfs-dump.exe\" \"%APPVEYOR_BUILD_FOLDER%\\build\\bin\\%PLATFORM%\\%CONFIGURATION%\\xenia-vfs-dump.pdb\"\n\nbefore_test:\n  - xb gentests\n\ntest_script:\n  - xb test --config=%CONFIGURATION% --no_build\n\nartifacts:\n  - path: '*.zip'\n  - path: xenia-cpu-ppc-test.log\n\ndeploy:\n  - provider: Environment\n    name: xenia-master\n    release: xenia-$(appveyor_repo_branch)-v$(appveyor_build_version)\n    artifact: '*.zip'\n    draft: false\n    prerelease: true\n    on:\n      branch: master\n      configuration: release\n      appveyor_repo_tag: true\n      is_not_pr: true\n  - provider: GitHub\n    name: xenia-master\n    repository: xenia-project/release-builds-windows\n    auth_token:\n      secure: /8he47z1WnPN7LcCTe5T5KMxxX0SmqFj9QMpeWEa3aZ64kMsfupOT/jKakqTM8af\n    tag: v$(appveyor_build_version)\n    release: v$(appveyor_build_version)\n    description: |\n      Windows release build for https://github.com/xenia-project/xenia/commit/$(APPVEYOR_REPO_COMMIT).\n      \n      $(APPVEYOR_REPO_COMMIT_MESSAGE)\n      \n      $(APPVEYOR_REPO_COMMIT_MESSAGE_EXTENDED)\n    draft: false\n    prerelease: false\n    on:\n      branch: master\n      configuration: release\n      is_not_pr: true\n"
  },
  {
    "path": ".clang-format",
    "content": "---\nBasedOnStyle: Google\nDerivePointerAlignment: false\nPointerAlignment: Left\nSortIncludes: true\n\n# Regroup causes unnecessary noise due to clang-format bug.\nIncludeBlocks: Preserve\n\n---\nLanguage: Java\nDisableFormat: true\nSortIncludes: false\n"
  },
  {
    "path": ".drone.star",
    "content": "def main(ctx):\n    return [\n        pipeline_lint(),\n        pipeline_linux_desktop('x86_64-linux-clang', image_linux_x86_64(), 'amd64', 'clang', True),\n        pipeline_linux_desktop('x86_64-linux-gcc', image_linux_x86_64(), 'amd64', 'gcc', False), # GCC release linking is really slow\n        pipeline_android('x86_64-android', image_linux_x86_64(), 'amd64', 'Android-x86_64'),\n        pipeline_android('aarch64-android', image_linux_x86_64(), 'amd64', 'Android-ARM64'),\n    ]\n\ndef image_linux_x86_64():\n    return 'xeniaproject/buildenv:2022-07-15'\n\ndef volume_build(toolchain, path='/drone/src/build'):\n    return {\n        'name': 'build-' + toolchain,\n        'path': path,\n    }\n\ndef command_cc(cc):\n    # set CC, CXX, ...\n    return 'export $(cat /{}.env | sed \\'s/#.*//g\\' | xargs)'.format(cc)\n\ndef command_ndk_build(platform, configuration, target):\n    return '$ANDROID_NDK_ROOT/build/ndk-build NDK_PROJECT_PATH:=./bin/{configuration} NDK_APPLICATION_MK:=./xenia.Application.mk PREMAKE_ANDROIDNDK_PLATFORMS:={platform} PREMAKE_ANDROIDNDK_CONFIGURATIONS:={configuration} -j$(nproc) {target}'.format(platform=platform, configuration=configuration, target=target)\n\ndef xenia_base_tests_filters():\n    # https://github.com/xenia-project/xenia/issues/2036\n    return 'exclude:\"Wait on Timer\" exclude:\"Wait on Multiple Timers\" exclude:\"HighResolutionTimer\"'\n\n# Run lint in a separate pipeline so that it will try building even if lint fails\ndef pipeline_lint():\n    return {\n        'kind': 'pipeline',\n        'type': 'docker',\n        'name': 'lint',\n        'steps': [\n            {\n                'name': 'lint',\n                'image': image_linux_x86_64(),\n                'commands': [\n                  'clang-format --version',\n                  './xenia-build lint --all',\n                ],\n            },\n        ],\n    }\n\ndef pipeline_linux_desktop(name, image, arch, cc, build_release_all):\n    return {\n        'kind': 'pipeline',\n        'type': 'docker',\n        'name': name,\n        'platform': {\n            'os': 'linux',\n            'arch': arch,\n        },\n        # These volumes will be mounted at the build directory, allowing to\n        # run different premake toolchains from the same source tree\n        'volumes': [\n          {\n            'name': 'build-premake',\n            'temp': {},\n          },\n          {\n            'name': 'build-cmake',\n            'temp': {},\n          },\n        ],\n\n        'steps': [\n            #\n            # Setup the source tree\n            #\n            {\n                'name': 'clone-submodules',\n                  'image': image,\n                  'commands': [\n                      'pwd',\n                      # May miss recursive submodules (but faster than xb setup)\n                      'git submodule update --init --depth 1 -j $(nproc)',\n                  ],\n              },\n\n\n            #\n            # Setup the two build systems\n            #\n\n            # Native premake Makefiles for production\n            {\n                'name': 'toolchain-premake',\n                'image': image,\n                'volumes': [volume_build('premake')],\n                'commands': [\n                    command_cc(cc),\n                    '$CXX --version',\n                    'python3 --version',\n                    './xenia-build premake --cc={}'.format(cc),\n              ],\n              'depends_on': ['clone-submodules'],\n            },\n\n            # Development toolchain\n            {\n                'name': 'toolchain-cmake',\n                'image': image,\n                'volumes': [volume_build('cmake')],\n                'commands': [\n                    command_cc(cc),\n                    '''\n                    ./xenia-build premake --cc={} --devenv=cmake\n                    cd build\n                    for c in Debug Release\n                    do\n                      mkdir cmake-$c\n                      cmake -S . -B cmake-$c -G Ninja -DCMAKE_BUILD_TYPE=$c\n                    done\n                    '''.format(cc),\n                ],\n                # Premake itself needs to be build first:\n                'depends_on': ['toolchain-premake'],\n            },\n\n            #\n            # Building\n            #\n\n            {\n                'name': 'build-premake-debug-tests',\n                'image': image,\n                'volumes': [volume_build('premake')],\n                'commands': [\n                    command_cc(cc),\n                    './xenia-build build --no_premake -j$(nproc) --config=Debug --target=xenia-base-tests',\n                ],\n                'depends_on': ['toolchain-premake'],\n            },\n            {\n                'name': 'build-premake-debug-all',\n                'image': image,\n                'volumes': [volume_build('premake')],\n                'commands': [\n                    command_cc(cc),\n                    './xenia-build build --no_premake -j$(nproc) --config=Debug',\n                ],\n                'depends_on': ['build-premake-debug-tests'],\n            },\n\n            {\n                'name': 'build-premake-release-tests',\n                'image': image,\n                'volumes': [volume_build('premake')],\n                'commands': [\n                    command_cc(cc),\n                    './xenia-build build --no_premake -j$(nproc) --config=Release --target=xenia-base-tests',\n                ],\n                'depends_on': ['toolchain-premake'],\n            },\n        ] + ([\n            {\n                'name': 'build-premake-release-all',\n                'image': image,\n                'volumes': [volume_build('premake')],\n                'commands': [\n                    command_cc(cc),\n                    './xenia-build build --no_premake -j$(nproc) --config=Release',\n                ],\n                'depends_on': ['build-premake-release-tests'],\n            },\n        ] if build_release_all else []) + [\n\n            {\n                'name': 'build-cmake-debug-all',\n                'image': image,\n                'volumes': [volume_build('cmake')],\n                'commands': [\n                    command_cc(cc),\n                    'cd build/cmake-Debug',\n                    'cmake --build . -j$(nproc)',\n                ],\n                'depends_on': ['toolchain-cmake'],\n            },\n\n            {\n                'name': 'build-cmake-release-tests',\n                'image': image,\n                'volumes': [volume_build('cmake')],\n                'commands': [\n                    command_cc(cc),\n                    'cd build/cmake-Release',\n                    'cmake --build . -j$(nproc) --target xenia-base-tests',\n                ],\n                'depends_on': ['toolchain-cmake'],\n            },\n        ] + ([\n            {\n                'name': 'build-cmake-release-all',\n                'image': image,\n                'volumes': [volume_build('cmake')],\n                'commands': [\n                    command_cc(cc),\n                    'cd build/cmake-Release',\n                    'cmake --build . -j$(nproc)',\n                ],\n                'depends_on': ['build-cmake-release-tests'],\n            },\n        ] if build_release_all else []) + [\n\n\n            #\n            # Tests\n            #\n\n            {\n                'name': 'test-premake-debug-valgrind',\n                'image': image,\n                'volumes': [volume_build('premake')],\n                'commands': [\n                    'valgrind --error-exitcode=99 ./build/bin/Linux/Debug/xenia-base-tests --durations yes ' + xenia_base_tests_filters(),\n                ],\n                'depends_on': ['build-premake-debug-tests'],\n            },\n\n            {\n                'name': 'test-premake-release',\n                'image': image,\n                'volumes': [volume_build('premake')],\n                'commands': [\n                    './build/bin/Linux/Release/xenia-base-tests --success --durations yes ' + xenia_base_tests_filters(),\n                ],\n                'depends_on': ['build-premake-release-tests'],\n            },\n\n            {\n                'name': 'test-cmake-release',\n                'image': image,\n                'volumes': [volume_build('cmake')],\n                'commands': [\n                    './build/bin/Linux/Release/xenia-base-tests --success --durations yes ' + xenia_base_tests_filters(),\n                ],\n                'depends_on': ['build-cmake-release-tests'],\n            },\n\n\n            #\n            # Stat\n            #\n\n            {\n                'name': 'stat',\n                'image': image,\n                'volumes': [\n                  volume_build('premake', '/build-premake'),\n                  volume_build('cmake', '/build-cmake'),\n                ],\n                'commands': [\n                    '''\n                    header() {\n                        SEP='============================================================'\n                        echo\n                        echo $SEP\n                        echo $@\n                        echo $SEP\n                    }\n\n                    for v in premake cmake\n                    do\n                        for c in Debug Release\n                        do\n                            header $v $c\n                            p=/build-$v/bin/Linux/$c\n                            ls -la $p\n                            sha256sum $p/*\n                        done\n                    done\n                    '''\n                ],\n                'depends_on': [\n                    'build-premake-debug-all',\n                    'build-cmake-debug-all',\n                ] + ([\n                    'build-premake-release-all',\n                    'build-cmake-release-all',\n                ] if build_release_all else [\n                    'build-premake-release-tests',\n                    'build-cmake-release-tests',\n                ]),\n            },\n        ],\n    }\n\n\ndef pipeline_android(name, image, arch, platform):\n    return {\n        'kind': 'pipeline',\n        'type': 'docker',\n        'name': name,\n        'platform': {\n            'os': 'linux',\n            'arch': arch,\n        },\n\n        'steps': [\n            #\n            # Setup the source tree\n            #\n            {\n                'name': 'clone-submodules',\n                  'image': image,\n                  'commands': [\n                      'pwd',\n                      # May miss recursive submodules (but faster than xb setup)\n                      'git submodule update --init --depth 1 -j $(nproc)',\n                  ],\n              },\n\n\n            #\n            # Build premake and generate NDK makefiles\n            #\n\n            # NDK Makefiles\n            {\n                'name': 'toolchain',\n                'image': image,\n                'commands': [\n                    'c++ --version',\n                    'python3 --version',\n                    './xenia-build premake --target_os android',\n              ],\n              'depends_on': ['clone-submodules'],\n            },\n\n\n            #\n            # Building\n            #\n            {\n                'name': 'build-debug',\n                'image': image,\n                'commands': [\n                    'cd build',\n                    command_ndk_build(platform, 'Debug', 'all'),\n                ],\n                'depends_on': ['toolchain'],\n            },\n\n            {\n                'name': 'build-release',\n                'image': image,\n                'commands': [\n                    'cd build',\n                    command_ndk_build(platform, 'Release', 'all'),\n                ],\n                'depends_on': ['toolchain'],\n            },\n\n\n            #\n            # Stat\n            #\n            {\n                'name': 'stat',\n                'image': image,\n                'commands': [\n                    '''\n                    header() {\n                        SEP='============================================================'\n                        echo\n                        echo $SEP\n                        echo $@\n                        echo $SEP\n                    }\n\n                    for c in Debug Release\n                    do\n                        header $c\n                        p=build/bin/$c/obj/local/*\n                        ls -la $p\n                        sha256sum $p/* || true\n                    done\n                    '''\n                ],\n                'depends_on': [\n                  'build-debug',\n                  'build-release',\n                ],\n            },\n        ],\n    }\n"
  },
  {
    "path": ".gdbinit",
    "content": "# Ignore HighResolutionTimer custom event\nhandle SIG34 nostop noprint\n# Ignore PosixTimer custom event\nhandle SIG35 nostop noprint\n# Ignore PosixThread exit event\nhandle SIG32 nostop noprint\n# Ignore PosixThread suspend event\nhandle SIG36 nostop noprint\n# Ignore PosixThread user callback event\nhandle SIG37 nostop noprint\n"
  },
  {
    "path": ".gitattributes",
    "content": "*           text=auto whitespace=blank-at-eol,tab-in-indent,trailing-space,tabwidth=2\n\n*.bat       text eol=crlf\n*.sh        text eol=lf\n\n*.sln       text eol=crlf -whitespace\n*.csproj    text eol=crlf -whitespace merge=union\n*.vcxproj   text eol=crlf -whitespace merge=union\n*.props     text eol=crlf -whitespace merge=union\n\nsrc/**/shaders/bytecode/** linguist-generated=true\n"
  },
  {
    "path": ".github/CONTRIBUTING.md",
    "content": "# Content Guidelines\n\nThe issue tracker is exclusively for filing and discussing bugs, feature\nrequests, and tracking work items. It is not for technical support or general\ndiscussion. Avoid discussing any illegal activity, such as downloading games.\n\n**Repeated misuses will result in a permanent project ban.**\n\n## Information Sourcing\n\nAll information in xenia has been derived from reverse engineering legally-owned\ngames, hardware, and tools made public by Microsoft (such as the XNA Game Studio\ntooling), scouring documentation made public by Microsoft (such as slide decks\nand other presentations at conferences), and information from code made public\nby 3rd party companies (like the Valve SDKs).\n\nThe official Microsoft Xbox Development Kits (XDKs) are not to be used for any\ninformation added to the project. The contributors do not want the XDKs, nor do\nthey want any information derived from them. The challenge of the project is\nwhat makes it fun! Poisoning the codebase with code obtained by shady means\ncould result in the project being terminated, so just don't do it.\n\n**Posting any information directly from an XDK will result in a project ban.**\n\n# Contributing Code\n\n## Style Guide\n\nPlease read over [style_guide.md](../docs/style_guide.md) before sending pull requests\nand ensure your code is clean as the buildbot (or I) will make you to fix it :)\n[style_guide.md](../docs/style_guide.md) has information about using `xb format` and\nvarious IDE auto formatting tools so that you can avoid having to clean things\nup later, so be sure to check it out.\n\nBasically: run `xb format` before you add a commit and you won't have a problem.\n\n## Referencing Sources\n\nIn code interacting with guest interfaces or protocols, where applicable, please\nleave comments describing how the information included in it was obtained. For\ncode based on analysis of the response of the original Xbox 360 hardware or\nsoftware, please provide reproduction information, such as an outline of the\nalgorithm executed, arguments and results of function calls or processor\ninstructions involved, GPU or XMA commands and state register changes. Having\ntraceable sources helps solve multiple issues:\n\n* The legality of the submitted code can be verified easily.\n* Additional analysis based on reproduction steps from prior research can be\n  done to discover more details or to research the behavior of other related\n  features.\n* The accuracy and completeness of the information can be evaluated. Knowing\n  whether something is ground truth about the console's behavior or an\n  approximation (for example, based on similar functionality in Windows, the\n  Qualcomm Adreno 200 GPU, AMD's desktop GPU architectures; the Direct3D 11.3\n  functional specification, which may be used as a generic fallback when no\n  information specific to the Xenos or Direct3D 9 is available) may help avoid\n  redoing work that has already been done if the findings are accurate, or\n  making potentially wrong conclusions about related functionality if there's no\n  certainty about the correctness of the information. In addition, it's useful\n  to describe how complete the implementation of a feature is — such as edge\n  cases checked and covered. If you are unsure if your code accurately reflects\n  the behavior of the console, or you have deliberately made deviations due to\n  the lack of prerequisites for an accurate implementation or for performance\n  reasons (in case of the latter, it's recommended to provide both options,\n  selectable with a configuration variable), or you just want more research to\n  be done in the future, please leave a TODO comment in the format provided in\n  [style_guide.md](../docs/style_guide.md).\n\nIf you have verified your code by checking the correctness of the behavior of a\ngame, **do not** refer to it by its title trademark. To avoid unnecessary\ndependencies on third parties, instead, use the hexadecimal title ID number\ndisplayed in the title bar beside the name of the game. It's also recommended to\navoid using proper names of game content if they can be replaced with easily\nunderstandable pointers not including them, such as \"first mission\",\n\"protagonist\", \"enemy aircraft\".\n\nDo not leave any hard-coded references to specific games, even in title ID form,\nin any part of the user interface, including the configuration file. If you want\nto provide an example of a game where changing a configuration variable may have\na noticeable effect, use a code comment near the declaration of the variable\nrather than its description string. Any game identifiers referenced in the user\ninterface must be obtained only from information provided by the user such as\ngame data files.\n\nAlso, do not put any conditionals based on hard-coded identifiers of games — the\ntask of the project is researching the Xbox 360 console itself and documenting\nits behavior by creating open implementations of its interfaces. Game-specific\nhacks provide no help in achieving that, instead only complicating research by\nintroducing incorrect state and hiding the symptoms of actual issues. While\ntemporary workarounds, though discouraged, may be added in cases when progress\nwould be blocked otherwise in other areas, they must be expressed and reasoned\nin terms of the common interface rather than logic internal to a specific game.\n\n## Clean Git History\n\nTools such as `git bisect` are used on the repository regularly to check for and\nidentify regressions. Such tools require a clean git history to function\nproperly. Incoming pull requests must follow good git rules, the most basic of\nwhich is that individual commits add functionality in somewhat working form and\nfully compile and run on their own. Small pull requests with a single commit are\nbest and multiple commits in a pull request are allowed only if they are\nkept clean. If not clean, you will be asked to rebase your pulls (and if\nyou don't know what that means, avoid getting into that situation ;).\n\nExample of a bad commit history:\n\n* Adding audio callback, random file loading, networking, etc. (+2000 lines)\n* Whoops.\n* Fixing build break.\n* Fixing lint errors.\n* Adding audio callback, second attempt.\n* ...\n\nHistories like this make it extremely difficult to check out any individual\ncommit and know that the repository is in a good state. Rebasing,\ncherry-picking, or splitting your commits into separate branches will help keep\nthings clean and easy.\n\n# License\n\nAll xenia code is licensed under the 3-clause BSD license as detailed in\n[LICENSE](../LICENSE). Code under `third_party/` is licensed under its original\nlicense.\n\nIncoming code in pull requests are subject to the xenia [LICENSE](../LICENSE).\nOnce code comes into the codebase it is very difficult to ever fully remove so\ncopyright is ascribed to the project to prevent future disputes such as what\noccurred in [Dolphin](https://dolphin-emu.org/blog/2015/05/25/relicensing-dolphin/).\nThat said: xenia will never be sold, never be made closed source, and never\nchange to a fundamentally incompatible license.\n\nAny `third_party/` code added will be reviewed for conformance with the license.\nIn general, GPL code is forbidden unless it is used exclusively for\ndevelopment-time tooling (like compiling). LGPL code is strongly discouraged as\nit complicates building.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.yaml",
    "content": "name: Bug report\ndescription: Template for bug reports.\nlabels: bug\nbody:\n  - id: disclaimer\n    type: markdown\n    attributes:\n      value: |\n        Try to create a very concise title that's straight to the point.\n\n        **THIS IS NOT A SUPPORT FORUM!** For support, first read the wiki: https://github.com/xenia-project/xenia/wiki\n        If your question wasn't answered there or you need help, proceed to #help in the Discord server: https://discord.gg/Q9mxZf9\n\n        DO NOT CREATE ISSUES ABOUT SPECIFIC GAMES IN THIS REPOSITORY!\n        A game specific issue would be e.g. \"Game X crashes after you hit a character a certain way\"\n        A Xenia issue would be e.g. \"Kernel export NtDoSomething does nothing\"\n        For specific games, visit https://github.com/xenia-project/game-compatibility#game-compatibility\n  - id: validation\n    type: checkboxes\n    attributes:\n      label: Validation\n      options:\n      - label: I've read the [FAQ](https://github.com/xenia-project/xenia/wiki/FAQ).\n        required: true\n      - label: The Xenia build used is from the master branch (not MLBS/AlexVS/Canary/pull requests, etc.)\n        required: true\n      - label: This issue isn't for tech support (help with Xenia).\n        required: true\n      - label: If this issue occurs in a specific game, I've done analysis to locate the faulty subsystem of the emulator and a potential reason in it.\n        required: true\n      - label: I've checked if this issue hasn't already been reported.\n        required: true\n      - label: 'My device meets the minimum requirements: https://github.com/xenia-project/xenia/wiki/Quickstart#system-requirements'\n        required: true\n      - label: '(If building) I have read the building doc: https://github.com/xenia-project/xenia/blob/master/docs/building.md'\n  - id: problem\n    type: textarea\n    attributes:\n      label: Describe what's going wrong\n    validations:\n      required: true\n  - id: what-should-happen\n    type: textarea\n    attributes:\n      label: Describe what should happen\n    validations:\n      required: true\n  - id: callstack\n    type: textarea\n    attributes:\n      label: If applicable, provide a callstack here, especially for crashes\n  - id: logfile\n    type: textarea\n    attributes:\n      label: If applicable, upload a logfile and link it here\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "contact_links:\n  - name: Xenia Discord server\n    url: https://discord.gg/Q9mxZf9\n    about: Tech support for Xenia belongs here.\n"
  },
  {
    "path": ".gitignore",
    "content": "# ==============================================================================\n# Misc system junk\n# ==============================================================================\n\n.DS_Store\n._*\n.Spotlight-V100\n.Trashes\n.com.apple.*\nThumbs.db\nDesktop.ini\n.svn\n\n# Microprofile settings\n.microprofilepreset.*\n\n# ==============================================================================\n# Projects/IDE files\n# ==============================================================================\n\n*~\n\n# Sublime Text\n*.sublime-project\n*.sublime-workspace\n\n# VIM\n.*.sw[a-z]\n*.un~\nSession.vim\n\n# TextMate\n*.tmproj\n*.tmproject\ntmtags\n\n# Eclipse\n.project\n.metadata\n\n# WebStorm\n.idea\n\n# VS\n.vs\n*.user\n*.sdf\n*.opensdf\n*.suo\nbin/\nobj/\n\n# VSCode\n.vscode\n\n# ==============================================================================\n# Temp generated code\n# ==============================================================================\n\n*.py[co]\n.coverage\n*.o\n*.aps\n\n# ==============================================================================\n# Logs and dumps\n# ==============================================================================\n\nnpm-debug.log\nprivate/\n*.trace\nimgui.ini\n*.log\n\n# ==============================================================================\n# Build system output\n# ==============================================================================\n\n# npm/node\n.lock-wscript\nnode_modules/\nnode_modules/**/build/\nnode_modules/.bin/\n\n# coverage/etc\n/scratch/\n\n/build/\n\n# ==============================================================================\n# Local-only paths\n# ==============================================================================\n\n.vagrant\n/attic/\n/content/\n/third_party/binutils/binutils-2.24.tar.gz\n/third_party/binutils/bin/\n/third_party/binutils/powerpc-none-elf/\n/third_party/binutils/share/\n/third_party/binutils/binutils*\n/third_party/vasm/\n/tools/shader-playground/*.dll\n"
  },
  {
    "path": ".gitmodules",
    "content": "[submodule \"third_party/xbyak\"]\n\tpath = third_party/xbyak\n\turl = https://github.com/xenia-project/xbyak.git\n[submodule \"third_party/imgui\"]\n\tpath = third_party/imgui\n\turl = https://github.com/ocornut/imgui.git\n[submodule \"third_party/binutils-ppc-cygwin\"]\n\tpath = third_party/binutils-ppc-cygwin\n\turl = https://github.com/benvanik/binutils-ppc-cygwin.git\n[submodule \"third_party/catch\"]\n\tpath = third_party/catch\n\turl = https://github.com/catchorg/Catch2.git\n[submodule \"third_party/premake-core\"]\n\tpath = third_party/premake-core\n\turl = https://github.com/xenia-project/premake-core.git\n[submodule \"third_party/snappy\"]\n\tpath = third_party/snappy\n\turl = https://github.com/xenia-project/snappy.git\n[submodule \"third_party/premake-export-compile-commands\"]\n\tpath = third_party/premake-export-compile-commands\n\turl = https://github.com/xenia-project/premake-export-compile-commands.git\n[submodule \"third_party/discord-rpc\"]\n\tpath = third_party/discord-rpc\n\turl = https://github.com/discordapp/discord-rpc.git\n[submodule \"third_party/rapidjson\"]\n\tpath = third_party/rapidjson\n\turl = https://github.com/Tencent/rapidjson.git\n[submodule \"third_party/aes_128\"]\n\tpath = third_party/aes_128\n\turl = https://github.com/openluopworld/aes_128.git\n[submodule \"third_party/capstone\"]\n\tpath = third_party/capstone\n\turl = https://github.com/xenia-project/capstone.git\n[submodule \"third_party/cpptoml\"]\n\tpath = third_party/cpptoml\n\turl = https://github.com/skystrife/cpptoml.git\n[submodule \"third_party/cxxopts\"]\n\tpath = third_party/cxxopts\n\turl = https://github.com/jarro2783/cxxopts.git\n[submodule \"third_party/SDL2\"]\n\tpath = third_party/SDL2\n\turl = https://github.com/libsdl-org/SDL.git\n[submodule \"third_party/utfcpp\"]\n\tpath = third_party/utfcpp\n\turl = https://github.com/xenia-project/utfcpp.git\n[submodule \"third_party/fmt\"]\n\tpath = third_party/fmt\n\turl = https://github.com/fmtlib/fmt.git\n[submodule \"third_party/disruptorplus\"]\n\tpath = third_party/disruptorplus\n\turl = https://github.com/xenia-project/disruptorplus.git\n[submodule \"third_party/DirectXShaderCompiler\"]\n\tpath = third_party/DirectXShaderCompiler\n\turl = https://github.com/microsoft/DirectXShaderCompiler.git\n[submodule \"third_party/premake-cmake\"]\n\tpath = third_party/premake-cmake\n\turl = https://github.com/JoelLinn/premake-cmake.git\n[submodule \"third_party/date\"]\n\tpath = third_party/date\n\turl = https://github.com/HowardHinnant/date.git\n[submodule \"third_party/xxhash\"]\n\tpath = third_party/xxhash\n\turl = https://github.com/Cyan4973/xxHash.git\n[submodule \"third_party/FFmpeg\"]\n\tpath = third_party/FFmpeg\n\turl = https://github.com/xenia-project/FFmpeg.git\n[submodule \"third_party/premake-androidndk\"]\n\tpath = third_party/premake-androidndk\n\turl = https://github.com/Triang3l/premake-androidndk.git\n[submodule \"third_party/FidelityFX-CAS\"]\n\tpath = third_party/FidelityFX-CAS\n\turl = https://github.com/GPUOpen-Effects/FidelityFX-CAS.git\n[submodule \"third_party/FidelityFX-FSR\"]\n\tpath = third_party/FidelityFX-FSR\n\turl = https://github.com/GPUOpen-Effects/FidelityFX-FSR.git\n[submodule \"third_party/Vulkan-Headers\"]\n\tpath = third_party/Vulkan-Headers\n\turl = https://github.com/KhronosGroup/Vulkan-Headers.git\n[submodule \"third_party/glslang\"]\n\tpath = third_party/glslang\n\turl = https://github.com/KhronosGroup/glslang.git\n[submodule \"third_party/SPIRV-Tools\"]\n\tpath = third_party/SPIRV-Tools\n\turl = https://github.com/KhronosGroup/SPIRV-Tools.git\n[submodule \"third_party/VulkanMemoryAllocator\"]\n\tpath = third_party/VulkanMemoryAllocator\n\turl = https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git\n[submodule \"third_party/DirectX-Headers\"]\n\tpath = third_party/DirectX-Headers\n\turl = https://github.com/microsoft/DirectX-Headers.git\n"
  },
  {
    "path": "LICENSE",
    "content": "Copyright (c) 2015, Ben Vanik.\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n    * Neither the name of the project nor the\n      names of its contributors may be used to endorse or promote products\n      derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL BEN VANIK BE LIABLE FOR ANY\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "README.md",
    "content": "<p align=\"center\">\n    <a href=\"https://github.com/xenia-project/xenia/tree/master/assets/icon\">\n        <img height=\"120px\" src=\"https://raw.githubusercontent.com/xenia-project/xenia/master/assets/icon/128.png\" />\n    </a>\n</p>\n\n<h1 align=\"center\">Xenia - Xbox 360 Emulator</h1>\n\nXenia is an experimental emulator for the Xbox 360. For more information, see the\n[main Xenia wiki](https://github.com/xenia-project/xenia/wiki).\n\n**Interested in supporting the core contributors?** Visit\n[Xenia Project on Patreon](https://www.patreon.com/xenia_project).\n\nCome chat with us about **emulator-related topics** on [Discord](https://discord.gg/Q9mxZf9).\nFor developer chat join `#dev` but stay on topic. Lurking is not only fine, but encouraged!\nPlease check the [FAQ](https://github.com/xenia-project/xenia/wiki/FAQ) page before asking questions.\nWe've got jobs/lives/etc, so don't expect instant answers.\n\nDiscussing illegal activities will get you banned.\n\n## Status\n\nBuildbot | Status | Releases\n-------- | ------ | --------\n[Windows](https://ci.appveyor.com/project/benvanik/xenia/branch/master) | [![Build status](https://ci.appveyor.com/api/projects/status/ftqiy86kdfawyx3a/branch/master?svg=true)](https://ci.appveyor.com/project/benvanik/xenia/branch/master) | [Latest](https://github.com/xenia-project/release-builds-windows/releases/latest) ◦ [All](https://github.com/xenia-project/release-builds-windows/releases)\n[Linux](https://cloud.drone.io/xenia-project/xenia) | [![Build status](https://cloud.drone.io/api/badges/xenia-project/xenia/status.svg)](https://cloud.drone.io/xenia-project/xenia)\n\nQuite a few real games run. Quite a few don't.\nSee the [Game compatibility list](https://github.com/xenia-project/game-compatibility/issues)\nfor currently tracked games, and feel free to contribute your own updates,\nscreenshots, and information there following the [existing conventions](https://github.com/xenia-project/game-compatibility/blob/master/README.md).\n\n## Disclaimer\n\nThe goal of this project is to experiment, research, and educate on the topic\nof emulation of modern devices and operating systems. **It is not for enabling\nillegal activity**. All information is obtained via reverse engineering of\nlegally purchased devices and games and information made public on the internet\n(you'd be surprised what's indexed on Google...).\n\n## Quickstart\n\nSee the [Quickstart](https://github.com/xenia-project/xenia/wiki/Quickstart) page.\n\n## Building\n\nSee [building.md](docs/building.md) for setup and information about the\n`xb` script. When writing code, check the [style guide](docs/style_guide.md)\nand be sure to run clang-format!\n\n## Contributors Wanted!\n\nHave some spare time, know advanced C++, and want to write an emulator?\nContribute! There's a ton of work that needs to be done, a lot of which\nis wide open greenfield fun.\n\n**For general rules and guidelines please see [CONTRIBUTING.md](.github/CONTRIBUTING.md).**\n\nFixes and optimizations are always welcome (please!), but in addition to\nthat there are some major work areas still untouched:\n\n* Help work through [missing functionality/bugs in games](https://github.com/xenia-project/xenia/labels/compat)\n* Reduce the size of Xenia's [huge log files](https://github.com/xenia-project/xenia/issues/1526)\n* Skilled with Linux? A strong contributor is needed to [help with porting](https://github.com/xenia-project/xenia/labels/platform-linux)\n\nSee more projects [good for contributors](https://github.com/xenia-project/xenia/labels/good%20first%20issue). It's a good idea to ask on Discord and check the issues page before beginning work on\nsomething.\n\n## FAQ\n\nSee the [frequently asked questions](https://github.com/xenia-project/xenia/wiki/FAQ) page.\n"
  },
  {
    "path": "android/android_studio_project/.gitignore",
    "content": "*.iml\n.gradle\n/local.properties\n/.idea/caches\n/.idea/libraries\n/.idea/modules.xml\n/.idea/workspace.xml\n/.idea/navEditor.xml\n/.idea/assetWizardSettings.xml\n.DS_Store\n/build\n/captures\n.externalNativeBuild\n.cxx\nlocal.properties\n"
  },
  {
    "path": "android/android_studio_project/app/.gitignore",
    "content": "/build"
  },
  {
    "path": "android/android_studio_project/app/build.gradle",
    "content": "plugins {\n    id 'com.android.application'\n}\n\nandroid {\n    compileSdkVersion 33\n    ndkVersion '25.0.8775105'\n\n    defaultConfig {\n        applicationId 'jp.xenia.emulator'\n        // 24 (7.0) - Vulkan.\n        minSdkVersion 24\n        targetSdkVersion 33\n        versionCode 1\n        versionName 'Prototype'\n        externalNativeBuild {\n            ndkBuild {\n                arguments 'NDK_APPLICATION_MK:=../../../build/xenia.Application.mk',\n                        'PREMAKE_ANDROIDNDK_PLATFORMS:=Android-ARM64',\n                        'PREMAKE_ANDROIDNDK_PLATFORMS+=Android-x86_64',\n                        // ndk.jobs doesn't work as of Gradle 7.1.0.\n                        \"-j${Runtime.runtime.availableProcessors()}\",\n                        // Work around \"Bad file descriptor\" on Windows on NDK r22+.\n                        '--output-sync=none'\n                // For the app, don't build the executables designed for running from a terminal.\n                // To build the executables, run ndk-build manually.\n                targets 'xenia-app'\n            }\n        }\n        ndk {\n            abiFilters 'arm64-v8a', 'x86_64'\n            stl 'c++_static'\n        }\n    }\n\n    buildTypes {\n        release {\n            externalNativeBuild {\n                ndkBuild {\n                    arguments 'PREMAKE_ANDROIDNDK_CONFIGURATIONS:=Release'\n                }\n            }\n            minifyEnabled true\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\n        }\n        debug {\n            applicationIdSuffix '.debug'\n            debuggable true\n            externalNativeBuild {\n                ndkBuild {\n                    arguments 'PREMAKE_ANDROIDNDK_CONFIGURATIONS:=Debug'\n                }\n            }\n        }\n        checked {\n            applicationIdSuffix '.checked'\n            debuggable true\n            externalNativeBuild {\n                ndkBuild {\n                    arguments 'PREMAKE_ANDROIDNDK_CONFIGURATIONS:=Checked'\n                }\n            }\n        }\n    }\n\n    flavorDimensions 'distribution'\n    productFlavors {\n        github {\n            dimension 'distribution'\n            applicationIdSuffix '.github'\n        }\n        googlePlay {\n            dimension 'distribution'\n            // TODO(Triang3l): Provide a signing config for core contributors only.\n        }\n    }\n\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_1_8\n        targetCompatibility JavaVersion.VERSION_1_8\n    }\n\n    externalNativeBuild {\n        ndkBuild {\n            path file('../../../build/xenia.wks.Android.mk')\n        }\n    }\n}\n\ndependencies {\n    implementation 'org.jetbrains:annotations:15.0'\n}"
  },
  {
    "path": "android/android_studio_project/app/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile"
  },
  {
    "path": "android/android_studio_project/app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"jp.xenia.emulator\">\n\n    <uses-feature\n        android:name=\"android.hardware.vulkan.level\"\n        android:required=\"true\"\n        android:version=\"0\" />\n\n    <uses-feature\n        android:name=\"android.hardware.vulkan.version\"\n        android:required=\"true\"\n        android:version=\"0x400000\" />\n\n    <!-- Granted automatically - guest sockets. -->\n    <uses-permission android:name=\"android.permission.INTERNET\" />\n\n    <application\n        android:allowBackup=\"true\"\n        android:icon=\"@mipmap/ic_launcher\"\n        android:label=\"@string/app_name\"\n        android:roundIcon=\"@mipmap/ic_launcher_round\"\n        android:supportsRtl=\"true\"\n        android:theme=\"@android:style/Theme.Material.Light\">\n\n        <activity\n            android:name=\"jp.xenia.emulator.LauncherActivity\"\n            android:exported=\"true\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n        </activity>\n\n        <activity\n            android:name=\"jp.xenia.emulator.GpuTraceViewerActivity\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_label_gpu_trace_viewer\"\n            android:screenOrientation=\"sensorLandscape\"\n            android:theme=\"@android:style/Theme.Material.Light.NoActionBar\" />\n\n        <activity\n            android:name=\"jp.xenia.emulator.WindowDemoActivity\"\n            android:exported=\"true\"\n            android:label=\"@string/activity_label_window_demo\"\n            android:theme=\"@android:style/Theme.Material.Light.NoActionBar\" />\n\n    </application>\n\n</manifest>"
  },
  {
    "path": "android/android_studio_project/app/src/main/java/jp/xenia/XeniaRuntimeException.java",
    "content": "package jp.xenia;\n\n/**\n * Base class for all unchecked exceptions thrown by the Xenia project components.\n */\npublic class XeniaRuntimeException extends RuntimeException {\n    public XeniaRuntimeException() {\n    }\n\n    public XeniaRuntimeException(final String name) {\n        super(name);\n    }\n\n    public XeniaRuntimeException(final String name, final Throwable cause) {\n        super(name, cause);\n    }\n\n    public XeniaRuntimeException(final Exception cause) {\n        super(cause);\n    }\n}\n"
  },
  {
    "path": "android/android_studio_project/app/src/main/java/jp/xenia/emulator/GpuTraceViewerActivity.java",
    "content": "package jp.xenia.emulator;\n\nimport android.os.Bundle;\n\npublic class GpuTraceViewerActivity extends WindowedAppActivity {\n    @Override\n    protected String getWindowedAppIdentifier() {\n        return \"xenia_gpu_vulkan_trace_viewer\";\n    }\n\n    @Override\n    protected void onCreate(final Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n\n        setContentView(R.layout.activity_gpu_trace_viewer);\n        setWindowSurfaceView(findViewById(R.id.gpu_trace_viewer_surface_view));\n    }\n}\n"
  },
  {
    "path": "android/android_studio_project/app/src/main/java/jp/xenia/emulator/LauncherActivity.java",
    "content": "package jp.xenia.emulator;\n\nimport android.app.Activity;\nimport android.content.Intent;\nimport android.net.Uri;\nimport android.os.Bundle;\nimport android.view.View;\n\npublic class LauncherActivity extends Activity {\n    private static final int REQUEST_OPEN_GPU_TRACE_VIEWER = 0;\n\n    @Override\n    protected void onCreate(final Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n\n        setContentView(R.layout.activity_launcher);\n    }\n\n    @Override\n    protected void onActivityResult(\n            final int requestCode, final int resultCode, final Intent data) {\n        if (requestCode == REQUEST_OPEN_GPU_TRACE_VIEWER && resultCode == RESULT_OK) {\n            final Uri uri = data.getData();\n            if (uri != null) {\n                final Intent gpuTraceViewerIntent = new Intent(this, GpuTraceViewerActivity.class);\n                final Bundle gpuTraceViewerLaunchArguments = new Bundle();\n                gpuTraceViewerLaunchArguments.putString(\"target_trace_file\", uri.toString());\n                gpuTraceViewerIntent.putExtra(\n                        WindowedAppActivity.EXTRA_CVARS, gpuTraceViewerLaunchArguments);\n                startActivity(gpuTraceViewerIntent);\n            }\n        }\n    }\n\n    public void onLaunchGpuTraceViewerClick(final View view) {\n        final Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);\n        intent.addCategory(Intent.CATEGORY_OPENABLE);\n        intent.setType(\"application/octet-stream\");\n        startActivityForResult(intent, REQUEST_OPEN_GPU_TRACE_VIEWER);\n    }\n\n    public void onLaunchWindowDemoClick(final View view) {\n        startActivity(new Intent(this, WindowDemoActivity.class));\n    }\n}\n"
  },
  {
    "path": "android/android_studio_project/app/src/main/java/jp/xenia/emulator/WindowDemoActivity.java",
    "content": "package jp.xenia.emulator;\n\nimport android.os.Bundle;\n\npublic class WindowDemoActivity extends WindowedAppActivity {\n    @Override\n    protected String getWindowedAppIdentifier() {\n        return \"xenia_ui_window_vulkan_demo\";\n    }\n\n    @Override\n    protected void onCreate(final Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n\n        setContentView(R.layout.activity_window_demo);\n        setWindowSurfaceView(findViewById(R.id.window_demo_surface_view));\n    }\n}\n"
  },
  {
    "path": "android/android_studio_project/app/src/main/java/jp/xenia/emulator/WindowSurfaceView.java",
    "content": "package jp.xenia.emulator;\n\nimport android.content.Context;\nimport android.graphics.Canvas;\nimport android.util.AttributeSet;\nimport android.view.SurfaceView;\n\npublic class WindowSurfaceView extends SurfaceView {\n    public WindowSurfaceView(final Context context) {\n        super(context);\n        // Native drawing is invoked from onDraw.\n        setWillNotDraw(false);\n    }\n\n    public WindowSurfaceView(final Context context, final AttributeSet attrs) {\n        super(context, attrs);\n        setWillNotDraw(false);\n    }\n\n    public WindowSurfaceView(\n            final Context context, final AttributeSet attrs, final int defStyleAttr) {\n        super(context, attrs, defStyleAttr);\n        setWillNotDraw(false);\n    }\n\n    public WindowSurfaceView(\n            final Context context, final AttributeSet attrs, final int defStyleAttr,\n            final int defStyleRes) {\n        super(context, attrs, defStyleAttr, defStyleRes);\n        setWillNotDraw(false);\n    }\n\n    @Override\n    protected void onDraw(final Canvas canvas) {\n        final Context context = getContext();\n        if (!(context instanceof WindowedAppActivity)) {\n            return;\n        }\n        final WindowedAppActivity activity = (WindowedAppActivity) context;\n        activity.onWindowSurfaceDraw(false);\n    }\n}\n"
  },
  {
    "path": "android/android_studio_project/app/src/main/java/jp/xenia/emulator/WindowedAppActivity.java",
    "content": "package jp.xenia.emulator;\n\nimport android.annotation.SuppressLint;\nimport android.app.Activity;\nimport android.content.res.AssetManager;\nimport android.os.Bundle;\nimport android.view.MotionEvent;\nimport android.view.Surface;\nimport android.view.SurfaceHolder;\nimport android.view.View;\n\nimport org.jetbrains.annotations.Nullable;\n\nimport jp.xenia.XeniaRuntimeException;\n\npublic abstract class WindowedAppActivity extends Activity {\n    // The EXTRA_CVARS value literal is also used in the native code.\n\n    /**\n     * Name of the Bundle intent extra containing Xenia config variable launch arguments.\n     */\n    public static final String EXTRA_CVARS = \"jp.xenia.emulator.WindowedAppActivity.EXTRA_CVARS\";\n\n    static {\n        System.loadLibrary(\"xenia-app\");\n    }\n\n    private final WindowSurfaceListener mWindowSurfaceListener = new WindowSurfaceListener();\n\n    // May be 0 while destroying (mainly while the superclass is).\n    private long mAppContext = 0;\n\n    @Nullable\n    private WindowSurfaceView mWindowSurfaceView = null;\n\n    private native long initializeWindowedAppOnCreate(\n            String windowedAppIdentifier, AssetManager assetManager);\n\n    private native void onDestroyNative(long appContext);\n\n    private native void onWindowSurfaceLayoutChange(\n            long appContext, int left, int top, int right, int bottom);\n\n    private native boolean onWindowSurfaceMotionEvent(long appContext, MotionEvent event);\n\n    private native void onWindowSurfaceChanged(long appContext, Surface windowSurface);\n\n    private native void paintWindow(long appContext, boolean forcePaint);\n\n    protected abstract String getWindowedAppIdentifier();\n\n    protected void setWindowSurfaceView(@Nullable final WindowSurfaceView windowSurfaceView) {\n        if (mWindowSurfaceView == windowSurfaceView) {\n            return;\n        }\n\n        // Detach from the old surface.\n        if (mWindowSurfaceView != null) {\n            mWindowSurfaceView.getHolder().removeCallback(mWindowSurfaceListener);\n            mWindowSurfaceView.setOnTouchListener(null);\n            mWindowSurfaceView.setOnGenericMotionListener(null);\n            mWindowSurfaceView.removeOnLayoutChangeListener(mWindowSurfaceListener);\n            mWindowSurfaceView = null;\n            if (mAppContext != 0) {\n                onWindowSurfaceChanged(mAppContext, null);\n            }\n        }\n\n        if (windowSurfaceView == null) {\n            return;\n        }\n\n        mWindowSurfaceView = windowSurfaceView;\n        // FIXME(Triang3l): This doesn't work if the layout has already been performed.\n        mWindowSurfaceView.addOnLayoutChangeListener(mWindowSurfaceListener);\n        mWindowSurfaceView.setOnGenericMotionListener(mWindowSurfaceListener);\n        mWindowSurfaceView.setOnTouchListener(mWindowSurfaceListener);\n        final SurfaceHolder windowSurfaceHolder = mWindowSurfaceView.getHolder();\n        windowSurfaceHolder.addCallback(mWindowSurfaceListener);\n        // If setting after the creation of the surface.\n        if (mAppContext != 0) {\n            final Surface windowSurface = windowSurfaceHolder.getSurface();\n            if (windowSurface != null) {\n                onWindowSurfaceChanged(mAppContext, windowSurface);\n            }\n        }\n    }\n\n    public void onWindowSurfaceDraw(final boolean forcePaint) {\n        if (mAppContext == 0) {\n            return;\n        }\n        paintWindow(mAppContext, forcePaint);\n    }\n\n    // Used from the native WindowedAppContext. May be called from non-UI threads.\n    @SuppressWarnings(\"UnusedDeclaration\")\n    protected void postInvalidateWindowSurface() {\n        if (mWindowSurfaceView == null) {\n            return;\n        }\n        mWindowSurfaceView.postInvalidate();\n    }\n\n    @Override\n    protected void onCreate(final Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n\n        final String windowedAppIdentifier = getWindowedAppIdentifier();\n        mAppContext = initializeWindowedAppOnCreate(windowedAppIdentifier, getAssets());\n        if (mAppContext == 0) {\n            finish();\n            throw new XeniaRuntimeException(\n                    \"Error initializing the windowed app \" + windowedAppIdentifier);\n        }\n    }\n\n    @Override\n    protected void onDestroy() {\n        setWindowSurfaceView(null);\n        if (mAppContext != 0) {\n            onDestroyNative(mAppContext);\n        }\n        mAppContext = 0;\n        super.onDestroy();\n    }\n\n    private class WindowSurfaceListener implements\n            View.OnGenericMotionListener,\n            View.OnLayoutChangeListener,\n            View.OnTouchListener,\n            SurfaceHolder.Callback2 {\n        @Override\n        public void onLayoutChange(\n                final View v, final int left, final int top, final int right, final int bottom,\n                final int oldLeft, final int oldTop, final int oldRight, final int oldBottom) {\n            if (mAppContext != 0) {\n                onWindowSurfaceLayoutChange(mAppContext, left, top, right, bottom);\n            }\n        }\n\n        @Override\n        public boolean onGenericMotion(final View view, final MotionEvent event) {\n            if (mAppContext == 0) {\n                return false;\n            }\n            return onWindowSurfaceMotionEvent(mAppContext, event);\n        }\n\n        @SuppressLint(\"ClickableViewAccessibility\")\n        @Override\n        public boolean onTouch(final View view, final MotionEvent event) {\n            if (mAppContext == 0) {\n                return false;\n            }\n            return onWindowSurfaceMotionEvent(mAppContext, event);\n        }\n\n        @Override\n        public void surfaceCreated(final SurfaceHolder holder) {\n            if (mAppContext == 0) {\n                return;\n            }\n            onWindowSurfaceChanged(mAppContext, holder.getSurface());\n        }\n\n        @Override\n        public void surfaceChanged(\n                final SurfaceHolder holder, final int format, final int width, final int height) {\n            if (mAppContext == 0) {\n                return;\n            }\n            onWindowSurfaceChanged(mAppContext, holder.getSurface());\n        }\n\n        @Override\n        public void surfaceDestroyed(final SurfaceHolder holder) {\n            if (mAppContext == 0) {\n                return;\n            }\n            onWindowSurfaceChanged(mAppContext, null);\n        }\n\n        @Override\n        public void surfaceRedrawNeeded(final SurfaceHolder holder) {\n            onWindowSurfaceDraw(true);\n        }\n    }\n}\n"
  },
  {
    "path": "android/android_studio_project/app/src/main/res/drawable/ic_launcher_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportWidth=\"108\"\n    android:viewportHeight=\"108\">\n    <path\n        android:fillColor=\"#3DDC84\"\n        android:pathData=\"M0,0h108v108h-108z\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M9,0L9,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,0L19,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M29,0L29,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M39,0L39,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M49,0L49,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M59,0L59,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M69,0L69,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M79,0L79,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M89,0L89,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M99,0L99,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,9L108,9\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,19L108,19\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,29L108,29\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,39L108,39\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,49L108,49\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,59L108,59\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,69L108,69\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,79L108,79\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,89L108,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,99L108,99\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,29L89,29\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,39L89,39\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,49L89,49\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,59L89,59\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,69L89,69\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,79L89,79\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M29,19L29,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M39,19L39,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M49,19L49,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M59,19L59,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M69,19L69,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M79,19L79,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n</vector>\n"
  },
  {
    "path": "android/android_studio_project/app/src/main/res/drawable-v24/ic_launcher_foreground.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportWidth=\"108\"\n    android:viewportHeight=\"108\">\n    <path android:pathData=\"M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z\">\n        <aapt:attr name=\"android:fillColor\">\n            <gradient\n                android:endX=\"85.84757\"\n                android:endY=\"92.4963\"\n                android:startX=\"42.9492\"\n                android:startY=\"49.59793\"\n                android:type=\"linear\">\n                <item\n                    android:color=\"#44000000\"\n                    android:offset=\"0.0\" />\n                <item\n                    android:color=\"#00000000\"\n                    android:offset=\"1.0\" />\n            </gradient>\n        </aapt:attr>\n    </path>\n    <path\n        android:fillColor=\"#FFFFFF\"\n        android:fillType=\"nonZero\"\n        android:pathData=\"M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z\"\n        android:strokeWidth=\"1\"\n        android:strokeColor=\"#00000000\" />\n</vector>"
  },
  {
    "path": "android/android_studio_project/app/src/main/res/layout/activity_gpu_trace_viewer.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<jp.xenia.emulator.WindowSurfaceView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/gpu_trace_viewer_surface_view\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\"jp.xenia.emulator.GpuTraceViewerActivity\" />\n"
  },
  {
    "path": "android/android_studio_project/app/src/main/res/layout/activity_launcher.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ScrollView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\"jp.xenia.emulator.LauncherActivity\">\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"vertical\">\n\n        <Button\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:onClick=\"onLaunchGpuTraceViewerClick\"\n            android:text=\"@string/activity_label_gpu_trace_viewer\" />\n\n        <Button\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:onClick=\"onLaunchWindowDemoClick\"\n            android:text=\"@string/activity_label_window_demo\" />\n\n    </LinearLayout>\n\n</ScrollView>\n"
  },
  {
    "path": "android/android_studio_project/app/src/main/res/layout/activity_window_demo.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<jp.xenia.emulator.WindowSurfaceView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/window_demo_surface_view\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\"jp.xenia.emulator.WindowDemoActivity\" />\n"
  },
  {
    "path": "android/android_studio_project/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@drawable/ic_launcher_background\" />\n    <foreground android:drawable=\"@drawable/ic_launcher_foreground\" />\n</adaptive-icon>"
  },
  {
    "path": "android/android_studio_project/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@drawable/ic_launcher_background\" />\n    <foreground android:drawable=\"@drawable/ic_launcher_foreground\" />\n</adaptive-icon>"
  },
  {
    "path": "android/android_studio_project/app/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">Xenia</string>\n    <string name=\"activity_label_gpu_trace_viewer\">GPU Trace Viewer</string>\n    <string name=\"activity_label_window_demo\">Window Demo</string>\n</resources>"
  },
  {
    "path": "android/android_studio_project/build.gradle",
    "content": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\nbuildscript {\n    repositories {\n        google()\n        mavenCentral()\n    }\n    dependencies {\n        classpath 'com.android.tools.build:gradle:7.2.1'\n\n        // NOTE: Do not place your application dependencies here; they belong\n        // in the individual module build.gradle files\n    }\n}\n\nallprojects {\n    repositories {\n        google()\n        mavenCentral()\n    }\n}\n\ntask clean(type: Delete) {\n    delete rootProject.buildDir\n}"
  },
  {
    "path": "android/android_studio_project/gradle/wrapper/gradle-wrapper.properties",
    "content": "#Mon Nov 01 23:19:20 MSK 2021\ndistributionBase=GRADLE_USER_HOME\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-7.3.3-bin.zip\ndistributionPath=wrapper/dists\nzipStorePath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\n"
  },
  {
    "path": "android/android_studio_project/gradle.properties",
    "content": "# Project-wide Gradle settings.\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will override*\n# any settings specified in this file.\n# For more details on how to configure your build environment visit\n# http://www.gradle.org/docs/current/userguide/build_environment.html\n# Specifies the JVM arguments used for the daemon process.\n# The setting is particularly useful for tweaking memory settings.\norg.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8\n# When configured, Gradle will run in incubating parallel mode.\n# This option should only be used with decoupled projects. More details, visit\n# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects\n# org.gradle.parallel=true\n# AndroidX package structure to make it clearer which packages are bundled with the\n# Android operating system, and which are packaged with your app\"s APK\n# https://developer.android.com/topic/libraries/support-library/androidx-rn\nandroid.useAndroidX=true\n# Automatically convert third-party libraries to use AndroidX\nandroid.enableJetifier=true"
  },
  {
    "path": "android/android_studio_project/gradlew",
    "content": "#!/usr/bin/env sh\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >/dev/null\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >/dev/null\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS=\"\"\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn () {\n    echo \"$*\"\n}\n\ndie () {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\nnonstop=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\n  NONSTOP* )\n    nonstop=true\n    ;;\nesac\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" -a \"$nonstop\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n    JAVACMD=`cygpath --unix \"$JAVACMD\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=$((i+1))\n    done\n    case $i in\n        (0) set -- ;;\n        (1) set -- \"$args0\" ;;\n        (2) set -- \"$args0\" \"$args1\" ;;\n        (3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        (4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        (5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        (6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        (7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        (8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        (9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Escape application args\nsave () {\n    for i do printf %s\\\\n \"$i\" | sed \"s/'/'\\\\\\\\''/g;1s/^/'/;\\$s/\\$/' \\\\\\\\/\" ; done\n    echo \" \"\n}\nAPP_ARGS=$(save \"$@\")\n\n# Collect all arguments for the java command, following the shell quoting and substitution rules\neval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS \"\\\"-Dorg.gradle.appname=$APP_BASE_NAME\\\"\" -classpath \"\\\"$CLASSPATH\\\"\" org.gradle.wrapper.GradleWrapperMain \"$APP_ARGS\"\n\n# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong\nif [ \"$(uname)\" = \"Darwin\" ] && [ \"$HOME\" = \"$PWD\" ]; then\n  cd \"$(dirname \"$0\")\"\nfi\n\nexec \"$JAVACMD\" \"$@\"\n"
  },
  {
    "path": "android/android_studio_project/gradlew.bat",
    "content": "@if \"%DEBUG%\" == \"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@rem  Gradle startup script for Windows\r\n@rem\r\n@rem ##########################################################################\r\n\r\n@rem Set local scope for the variables with windows NT shell\r\nif \"%OS%\"==\"Windows_NT\" setlocal\r\n\r\nset DIRNAME=%~dp0\r\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\r\nset APP_BASE_NAME=%~n0\r\nset APP_HOME=%DIRNAME%\r\n\r\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\r\nset DEFAULT_JVM_OPTS=\r\n\r\n@rem Find java.exe\r\nif defined JAVA_HOME goto findJavaFromJavaHome\r\n\r\nset JAVA_EXE=java.exe\r\n%JAVA_EXE% -version >NUL 2>&1\r\nif \"%ERRORLEVEL%\" == \"0\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:findJavaFromJavaHome\r\nset JAVA_HOME=%JAVA_HOME:\"=%\r\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\r\n\r\nif exist \"%JAVA_EXE%\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:init\r\n@rem Get command-line arguments, handling Windows variants\r\n\r\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\r\n\r\n:win9xME_args\r\n@rem Slurp the command line arguments.\r\nset CMD_LINE_ARGS=\r\nset _SKIP=2\r\n\r\n:win9xME_args_slurp\r\nif \"x%~1\" == \"x\" goto execute\r\n\r\nset CMD_LINE_ARGS=%*\r\n\r\n:execute\r\n@rem Setup the command line\r\n\r\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\r\n\r\n@rem Execute Gradle\r\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%\r\n\r\n:end\r\n@rem End local scope for the variables with windows NT shell\r\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\r\n\r\n:fail\r\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\r\nrem the _cmd.exe /c_ return code!\r\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\r\nexit /b 1\r\n\r\n:mainEnd\r\nif \"%OS%\"==\"Windows_NT\" endlocal\r\n\r\n:omega\r\n"
  },
  {
    "path": "android/android_studio_project/settings.gradle",
    "content": "include ':app'\nrootProject.name = \"Xenia\""
  },
  {
    "path": "assets/icon/LICENSE",
    "content": "Attribution-ShareAlike 4.0 International\n\n=======================================================================\n\nCreative Commons Corporation (\"Creative Commons\") is not a law firm and\ndoes not provide legal services or legal advice. Distribution of\nCreative Commons public licenses does not create a lawyer-client or\nother relationship. Creative Commons makes its licenses and related\ninformation available on an \"as-is\" basis. Creative Commons gives no\nwarranties regarding its licenses, any material licensed under their\nterms and conditions, or any related information. Creative Commons\ndisclaims all liability for damages resulting from their use to the\nfullest extent possible.\n\nUsing Creative Commons Public Licenses\n\nCreative Commons public licenses provide a standard set of terms and\nconditions that creators and other rights holders may use to share\noriginal works of authorship and other material subject to copyright\nand certain other rights specified in the public license below. The\nfollowing considerations are for informational purposes only, are not\nexhaustive, and do not form part of our licenses.\n\n     Considerations for licensors: Our public licenses are\n     intended for use by those authorized to give the public\n     permission to use material in ways otherwise restricted by\n     copyright and certain other rights. Our licenses are\n     irrevocable. Licensors should read and understand the terms\n     and conditions of the license they choose before applying it.\n     Licensors should also secure all rights necessary before\n     applying our licenses so that the public can reuse the\n     material as expected. Licensors should clearly mark any\n     material not subject to the license. This includes other CC-\n     licensed material, or material used under an exception or\n     limitation to copyright. More considerations for licensors:\n\twiki.creativecommons.org/Considerations_for_licensors\n\n     Considerations for the public: By using one of our public\n     licenses, a licensor grants the public permission to use the\n     licensed material under specified terms and conditions. If\n     the licensor's permission is not necessary for any reason--for\n     example, because of any applicable exception or limitation to\n     copyright--then that use is not regulated by the license. Our\n     licenses grant only permissions under copyright and certain\n     other rights that a licensor has authority to grant. Use of\n     the licensed material may still be restricted for other\n     reasons, including because others have copyright or other\n     rights in the material. A licensor may make special requests,\n     such as asking that all changes be marked or described.\n     Although not required by our licenses, you are encouraged to\n     respect those requests where reasonable. More considerations\n     for the public: \n\twiki.creativecommons.org/Considerations_for_licensees\n\n=======================================================================\n\nCreative Commons Attribution-ShareAlike 4.0 International Public\nLicense\n\nBy exercising the Licensed Rights (defined below), You accept and agree\nto be bound by the terms and conditions of this Creative Commons\nAttribution-ShareAlike 4.0 International Public License (\"Public\nLicense\"). To the extent this Public License may be interpreted as a\ncontract, You are granted the Licensed Rights in consideration of Your\nacceptance of these terms and conditions, and the Licensor grants You\nsuch rights in consideration of benefits the Licensor receives from\nmaking the Licensed Material available under these terms and\nconditions.\n\n\nSection 1 -- Definitions.\n\n  a. Adapted Material means material subject to Copyright and Similar\n     Rights that is derived from or based upon the Licensed Material\n     and in which the Licensed Material is translated, altered,\n     arranged, transformed, or otherwise modified in a manner requiring\n     permission under the Copyright and Similar Rights held by the\n     Licensor. For purposes of this Public License, where the Licensed\n     Material is a musical work, performance, or sound recording,\n     Adapted Material is always produced where the Licensed Material is\n     synched in timed relation with a moving image.\n\n  b. Adapter's License means the license You apply to Your Copyright\n     and Similar Rights in Your contributions to Adapted Material in\n     accordance with the terms and conditions of this Public License.\n\n  c. BY-SA Compatible License means a license listed at\n     creativecommons.org/compatiblelicenses, approved by Creative\n     Commons as essentially the equivalent of this Public License.\n\n  d. Copyright and Similar Rights means copyright and/or similar rights\n     closely related to copyright including, without limitation,\n     performance, broadcast, sound recording, and Sui Generis Database\n     Rights, without regard to how the rights are labeled or\n     categorized. For purposes of this Public License, the rights\n     specified in Section 2(b)(1)-(2) are not Copyright and Similar\n     Rights.\n\n  e. Effective Technological Measures means those measures that, in the\n     absence of proper authority, may not be circumvented under laws\n     fulfilling obligations under Article 11 of the WIPO Copyright\n     Treaty adopted on December 20, 1996, and/or similar international\n     agreements.\n\n  f. Exceptions and Limitations means fair use, fair dealing, and/or\n     any other exception or limitation to Copyright and Similar Rights\n     that applies to Your use of the Licensed Material.\n\n  g. License Elements means the license attributes listed in the name\n     of a Creative Commons Public License. The License Elements of this\n     Public License are Attribution and ShareAlike.\n\n  h. Licensed Material means the artistic or literary work, database,\n     or other material to which the Licensor applied this Public\n     License.\n\n  i. Licensed Rights means the rights granted to You subject to the\n     terms and conditions of this Public License, which are limited to\n     all Copyright and Similar Rights that apply to Your use of the\n     Licensed Material and that the Licensor has authority to license.\n\n  j. Licensor means the individual(s) or entity(ies) granting rights\n     under this Public License.\n\n  k. Share means to provide material to the public by any means or\n     process that requires permission under the Licensed Rights, such\n     as reproduction, public display, public performance, distribution,\n     dissemination, communication, or importation, and to make material\n     available to the public including in ways that members of the\n     public may access the material from a place and at a time\n     individually chosen by them.\n\n  l. Sui Generis Database Rights means rights other than copyright\n     resulting from Directive 96/9/EC of the European Parliament and of\n     the Council of 11 March 1996 on the legal protection of databases,\n     as amended and/or succeeded, as well as other essentially\n     equivalent rights anywhere in the world.\n\n  m. You means the individual or entity exercising the Licensed Rights\n     under this Public License. Your has a corresponding meaning.\n\n\nSection 2 -- Scope.\n\n  a. License grant.\n\n       1. Subject to the terms and conditions of this Public License,\n          the Licensor hereby grants You a worldwide, royalty-free,\n          non-sublicensable, non-exclusive, irrevocable license to\n          exercise the Licensed Rights in the Licensed Material to:\n\n            a. reproduce and Share the Licensed Material, in whole or\n               in part; and\n\n            b. produce, reproduce, and Share Adapted Material.\n\n       2. Exceptions and Limitations. For the avoidance of doubt, where\n          Exceptions and Limitations apply to Your use, this Public\n          License does not apply, and You do not need to comply with\n          its terms and conditions.\n\n       3. Term. The term of this Public License is specified in Section\n          6(a).\n\n       4. Media and formats; technical modifications allowed. The\n          Licensor authorizes You to exercise the Licensed Rights in\n          all media and formats whether now known or hereafter created,\n          and to make technical modifications necessary to do so. The\n          Licensor waives and/or agrees not to assert any right or\n          authority to forbid You from making technical modifications\n          necessary to exercise the Licensed Rights, including\n          technical modifications necessary to circumvent Effective\n          Technological Measures. For purposes of this Public License,\n          simply making modifications authorized by this Section 2(a)\n          (4) never produces Adapted Material.\n\n       5. Downstream recipients.\n\n            a. Offer from the Licensor -- Licensed Material. Every\n               recipient of the Licensed Material automatically\n               receives an offer from the Licensor to exercise the\n               Licensed Rights under the terms and conditions of this\n               Public License.\n\n            b. Additional offer from the Licensor -- Adapted Material.\n               Every recipient of Adapted Material from You\n               automatically receives an offer from the Licensor to\n               exercise the Licensed Rights in the Adapted Material\n               under the conditions of the Adapter's License You apply.\n\n            c. No downstream restrictions. You may not offer or impose\n               any additional or different terms or conditions on, or\n               apply any Effective Technological Measures to, the\n               Licensed Material if doing so restricts exercise of the\n               Licensed Rights by any recipient of the Licensed\n               Material.\n\n       6. No endorsement. Nothing in this Public License constitutes or\n          may be construed as permission to assert or imply that You\n          are, or that Your use of the Licensed Material is, connected\n          with, or sponsored, endorsed, or granted official status by,\n          the Licensor or others designated to receive attribution as\n          provided in Section 3(a)(1)(A)(i).\n\n  b. Other rights.\n\n       1. Moral rights, such as the right of integrity, are not\n          licensed under this Public License, nor are publicity,\n          privacy, and/or other similar personality rights; however, to\n          the extent possible, the Licensor waives and/or agrees not to\n          assert any such rights held by the Licensor to the limited\n          extent necessary to allow You to exercise the Licensed\n          Rights, but not otherwise.\n\n       2. Patent and trademark rights are not licensed under this\n          Public License.\n\n       3. To the extent possible, the Licensor waives any right to\n          collect royalties from You for the exercise of the Licensed\n          Rights, whether directly or through a collecting society\n          under any voluntary or waivable statutory or compulsory\n          licensing scheme. In all other cases the Licensor expressly\n          reserves any right to collect such royalties.\n\n\nSection 3 -- License Conditions.\n\nYour exercise of the Licensed Rights is expressly made subject to the\nfollowing conditions.\n\n  a. Attribution.\n\n       1. If You Share the Licensed Material (including in modified\n          form), You must:\n\n            a. retain the following if it is supplied by the Licensor\n               with the Licensed Material:\n\n                 i. identification of the creator(s) of the Licensed\n                    Material and any others designated to receive\n                    attribution, in any reasonable manner requested by\n                    the Licensor (including by pseudonym if\n                    designated);\n\n                ii. a copyright notice;\n\n               iii. a notice that refers to this Public License;\n\n                iv. a notice that refers to the disclaimer of\n                    warranties;\n\n                 v. a URI or hyperlink to the Licensed Material to the\n                    extent reasonably practicable;\n\n            b. indicate if You modified the Licensed Material and\n               retain an indication of any previous modifications; and\n\n            c. indicate the Licensed Material is licensed under this\n               Public License, and include the text of, or the URI or\n               hyperlink to, this Public License.\n\n       2. You may satisfy the conditions in Section 3(a)(1) in any\n          reasonable manner based on the medium, means, and context in\n          which You Share the Licensed Material. For example, it may be\n          reasonable to satisfy the conditions by providing a URI or\n          hyperlink to a resource that includes the required\n          information.\n\n       3. If requested by the Licensor, You must remove any of the\n          information required by Section 3(a)(1)(A) to the extent\n          reasonably practicable.\n\n  b. ShareAlike.\n\n     In addition to the conditions in Section 3(a), if You Share\n     Adapted Material You produce, the following conditions also apply.\n\n       1. The Adapter's License You apply must be a Creative Commons\n          license with the same License Elements, this version or\n          later, or a BY-SA Compatible License.\n\n       2. You must include the text of, or the URI or hyperlink to, the\n          Adapter's License You apply. You may satisfy this condition\n          in any reasonable manner based on the medium, means, and\n          context in which You Share Adapted Material.\n\n       3. You may not offer or impose any additional or different terms\n          or conditions on, or apply any Effective Technological\n          Measures to, Adapted Material that restrict exercise of the\n          rights granted under the Adapter's License You apply.\n\n\nSection 4 -- Sui Generis Database Rights.\n\nWhere the Licensed Rights include Sui Generis Database Rights that\napply to Your use of the Licensed Material:\n\n  a. for the avoidance of doubt, Section 2(a)(1) grants You the right\n     to extract, reuse, reproduce, and Share all or a substantial\n     portion of the contents of the database;\n\n  b. if You include all or a substantial portion of the database\n     contents in a database in which You have Sui Generis Database\n     Rights, then the database in which You have Sui Generis Database\n     Rights (but not its individual contents) is Adapted Material,\n\n     including for purposes of Section 3(b); and\n  c. You must comply with the conditions in Section 3(a) if You Share\n     all or a substantial portion of the contents of the database.\n\nFor the avoidance of doubt, this Section 4 supplements and does not\nreplace Your obligations under this Public License where the Licensed\nRights include other Copyright and Similar Rights.\n\n\nSection 5 -- Disclaimer of Warranties and Limitation of Liability.\n\n  a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE\n     EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS\n     AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF\n     ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,\n     IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,\n     WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR\n     PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,\n     ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT\n     KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT\n     ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.\n\n  b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE\n     TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,\n     NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,\n     INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,\n     COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR\n     USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN\n     ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR\n     DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR\n     IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.\n\n  c. The disclaimer of warranties and limitation of liability provided\n     above shall be interpreted in a manner that, to the extent\n     possible, most closely approximates an absolute disclaimer and\n     waiver of all liability.\n\n\nSection 6 -- Term and Termination.\n\n  a. This Public License applies for the term of the Copyright and\n     Similar Rights licensed here. However, if You fail to comply with\n     this Public License, then Your rights under this Public License\n     terminate automatically.\n\n  b. Where Your right to use the Licensed Material has terminated under\n     Section 6(a), it reinstates:\n\n       1. automatically as of the date the violation is cured, provided\n          it is cured within 30 days of Your discovery of the\n          violation; or\n\n       2. upon express reinstatement by the Licensor.\n\n     For the avoidance of doubt, this Section 6(b) does not affect any\n     right the Licensor may have to seek remedies for Your violations\n     of this Public License.\n\n  c. For the avoidance of doubt, the Licensor may also offer the\n     Licensed Material under separate terms or conditions or stop\n     distributing the Licensed Material at any time; however, doing so\n     will not terminate this Public License.\n\n  d. Sections 1, 5, 6, 7, and 8 survive termination of this Public\n     License.\n\n\nSection 7 -- Other Terms and Conditions.\n\n  a. The Licensor shall not be bound by any additional or different\n     terms or conditions communicated by You unless expressly agreed.\n\n  b. Any arrangements, understandings, or agreements regarding the\n     Licensed Material not stated herein are separate from and\n     independent of the terms and conditions of this Public License.\n\n\nSection 8 -- Interpretation.\n\n  a. For the avoidance of doubt, this Public License does not, and\n     shall not be interpreted to, reduce, limit, restrict, or impose\n     conditions on any use of the Licensed Material that could lawfully\n     be made without permission under this Public License.\n\n  b. To the extent possible, if any provision of this Public License is\n     deemed unenforceable, it shall be automatically reformed to the\n     minimum extent necessary to make it enforceable. If the provision\n     cannot be reformed, it shall be severed from this Public License\n     without affecting the enforceability of the remaining terms and\n     conditions.\n\n  c. No term or condition of this Public License will be waived and no\n     failure to comply consented to unless expressly agreed to by the\n     Licensor.\n\n  d. Nothing in this Public License constitutes or may be interpreted\n     as a limitation upon, or waiver of, any privileges and immunities\n     that apply to the Licensor or You, including from the legal\n     processes of any jurisdiction or authority.\n\n\n=======================================================================\n\nCreative Commons is not a party to its public\nlicenses. Notwithstanding, Creative Commons may elect to apply one of\nits public licenses to material it publishes and in those instances\nwill be considered the “Licensor.” The text of the Creative Commons\npublic licenses is dedicated to the public domain under the CC0 Public\nDomain Dedication. Except for the limited purpose of indicating that\nmaterial is shared under a Creative Commons public license or as\notherwise permitted by the Creative Commons policies published at\ncreativecommons.org/policies, Creative Commons does not authorize the\nuse of the trademark \"Creative Commons\" or any other trademark or logo\nof Creative Commons without its prior written consent including,\nwithout limitation, in connection with any unauthorized modifications\nto any of its public licenses or any other arrangements,\nunderstandings, or agreements concerning use of licensed material. For\nthe avoidance of doubt, this paragraph does not form part of the\npublic licenses.\n\nCreative Commons may be contacted at creativecommons.org.\n\n"
  },
  {
    "path": "docs/building.md",
    "content": "# Building\n\nYou must have a 64-bit machine for building and running the project. Always\nrun your system updater before building and make sure you have the latest\ndrivers.\n\n## Setup\n\n### Windows\n\n* Windows 7 or later\n* [Visual Studio 2022, Visual Studio 2019, or Visual Studio 2017](https://www.visualstudio.com/downloads/)\n  * For Visual Studio 2022, MSBuild `v142` must be used due to a compiler bug; See [#2003](https://github.com/xenia-project/xenia/issues/2003).\n* [Python 3.6+](https://www.python.org/downloads/)\n  * Ensure Python is in PATH.\n* Windows 11 SDK version 10.0.22000.0 (for Visual Studio 2019, this or any newer version)\n\n```\ngit clone https://github.com/xenia-project/xenia.git\ncd xenia\nxb setup\n\n# Build on command line (add --config=release for release):\nxb build\n\n\n# Pull latest changes, rebase, update submodules, and run premake:\nxb pull\n\n# Run premake and open Visual Studio (run the 'xenia-app' project):\nxb devenv\n\n# Run premake to update the sln/vcproj's:\nxb premake\n\n# Format code to the style guide:\nxb format\n```\n<!--\n# Remove intermediate files and build outputs (doesn't work on Linux):\nxb clean\n\n# Check for lint errors with clang-format:\nxb lint\n\n# Run the style checker on all code:\nxb style\n\n# Remove all build/ output and do a hard git reset:\nxb nuke\n\n# Runs the clang-tidy checker on all code:\nxb tidy\n\n\n## Testing:\n\n# Generate tests:\nxb gentests\n\n# Run tests:\nxb test\n\n# Run GPU tests:\nxb gputest\n\n\n## Other:\n\n# Generate SPIR-V binaries and header files:\nxb genspirv\n-->\n\n#### Debugging\n\nVS behaves oddly with the debug paths. Open the 'xenia-app' project properties\nand set the 'Command' to `$(SolutionDir)$(TargetPath)` and the\n'Working Directory' to `$(SolutionDir)..\\..`. You can specify flags and\nthe file to run in the 'Command Arguments' field (or use `--flagfile=flags.txt`).\n\nBy default logs are written to a file with the name of the executable. You can\noverride this with `--log_file=log.txt`.\n\nIf running under Visual Studio and you want to look at the JIT'ed code\n(available around 0xA0000000) you should pass `--emit_source_annotations` to\nget helpful spacers/movs in the disassembly.\n\n### Linux\n\nLinux support is extremely experimental and presently incomplete.\n\nThe build script uses LLVM/Clang 9. GCC while it should work in theory, is not easily\ninterchangeable right now.\n\n* Normal building via `xb build` uses Make.\n* [CodeLite](https://codelite.org) is supported. `xb devenv` will generate a workspace and attempt to open it. Your distribution's version may be out of date so check their website.\n* Experimental CMake generation is available to facilitate use of other IDEs such as [CLion](https://www.jetbrains.com/clion/). If `clion` is available inside `$PATH`, `xb devenv` will start it. Otherwise `build/CMakeLists.txt` needs to be generated by invoking `xb premake --devenv=cmake` manually.\n\nClang-9 or newer should be available from system repositories on all up to date distributions.\nYou will also need some development libraries. To get them on an Ubuntu system:\n\n```bash\nsudo apt-get install libgtk-3-dev libpthread-stubs0-dev liblz4-dev libx11-dev libx11-xcb-dev libvulkan-dev libsdl2-dev libiberty-dev libunwind-dev libc++-dev libc++abi-dev\n```\n\nIn addition, you will need up to date Vulkan libraries and drivers for your hardware, which most distributions have in their standard repositories nowadays.\n\n## Running\n\nTo make life easier you can set the program startup arguments in your IDE to something like `--log_file=stdout /path/to/Default.xex` to log to console rather than a file and start up the emulator right away.\n"
  },
  {
    "path": "docs/cpu.md",
    "content": "# CPU Documentation\n\n## The JIT\n\n![JIT Diagram](images/CPU-JIT.png?raw=true)\n\nThe JIT is the core of Xenia. It translates Xenon PowerPC code into native\ncode runnable on the host computer.\n\nThere are 3 phases to translation:\n1. Translation to IR (intermediate representation)\n2. IR compilation/optimization\n3. Backend emission\n\nPowerPC instructions are translated to Xenia's intermediate representation\nformat in src/xenia/cpu/ppc/ppc_emit_*.cc (e.g. processor control is done in\n[ppc_emit_control.cc](../src/xenia/cpu/ppc/ppc_emit_control.cc)). HIR opcodes\nare relatively simple opcodes such that any host can define an implementation.\n\nAfter the HIR is generated, it is ran through a compiler to prep it for generation.\nThe compiler is ran in a series of passes, the order of which is defined in\n[ppc_translator.cc](../src/xenia/cpu/ppc/ppc_translator.cc). Some passes are\nessential to the successful generation, while others are merely for optimization\npurposes. Compiler passes are defined in src/xenia/cpu/compiler/passes with\ndescriptive class names.\n\nFinally, the backend consumes the HIR and emits code that runs natively on the\nhost. Currently, the only backend that exists is the x64 backend, with all the\nemission done in\n[x64_sequences.cc](../src/xenia/cpu/backend/x64/x64_sequences.cc).\n\n## ABI\n\nXenia guest functions are not directly callable, but rather must be called\nthrough APIs provided by Xenia. Xenia will first execute a thunk to transition\nthe host context to a state dependent on the JIT backend, and that will call the\nguest code.\n\n### x64\n\nTransition thunks defined in [x64_backend.cc](../src/xenia/cpu/backend/x64/x64_backend.cc#L389).\nRegisters are stored on the stack as defined by [StackLayout::Thunk](../src/xenia/cpu/backend/x64/x64_stack_layout.h#L96)\nfor later transitioning back to the host.\n\nSome registers are reserved for usage by the JIT to store temporary variables.\nSee: [X64Emitter::gpr_reg_map_ and X64Emitter::xmm_reg_map_](../src/xenia/cpu/backend/x64/x64_emitter.cc#L57).\n\n#### Integer Registers\n\nRegister | Usage\n---      | ---\nRAX      | Scratch\nRBX      | JIT temp\nRCX      | Scratch\nRDX      | Scratch\nRSP      | Stack Pointer\nRBP      | Unused\nRSI      | PowerPC Context\nRDI      | Virtual Memory Base\nR8-R11   | Unused (parameters)\nR12-R15  | JIT temp\n\n#### Floating Point Registers\nRegister   | Usage\n---        | ---\nXMM0-XMM5  | Scratch\nXMM6-XMM15 | JIT temp\n\n## Memory\n\nXenia defines virtual memory as a mapped range beginning at Memory::virtual_membase(),\nand physical memory as another mapped range from Memory::physical_membase()\n(usually 0x100000000 and 0x200000000, respectively). If the default bases are\nnot available, they are shifted left 1 bit until an available range is found.\n\nThe guest only has access to these ranges, nothing else.\n\n### Map\n```\n0x00000000 - 0x3FFFFFFF (1024mb) - virtual 4k pages\n0x40000000 - 0x7FFFFFFF (1024mb) - virtual 64k pages\n0x80000000 - 0x8BFFFFFF ( 192mb) - xex 64k pages\n0x8C000000 - 0x8FFFFFFF (  64mb) - xex 64k pages (encrypted)\n0x90000000 - 0x9FFFFFFF ( 256mb) - xex 4k pages\n0xA0000000 - 0xBFFFFFFF ( 512mb) - physical 64k pages (overlapped)\n0xC0000000 - 0xDFFFFFFF          - physical 16mb pages (overlapped)\n0xE0000000 - 0xFFFFFFFF          - physical 4k pages (overlapped)\n```\n\nVirtual pages are usually allocated by NtAllocateVirtualMemory, and\nphysical pages are usually allocated by MmAllocatePhysicalMemoryEx.\n\nVirtual pages mapped to physical memory are also mapped to the physical membase,\ni.e. virtual 0xA0000000 == physical 0x00000000\n\nThe 0xE0000000-0xFFFFFFFF range is mapped to physical memory with a single 4 KB\npage offset. On Windows, memory mappings must be aligned to 64 KB, so the offset\nhas to be added when guest addresses are converted to host addresses in the\ntranslated CPU code. This can't be faked other ways because calculations\ninvolving the offset are built into games - see the following sequence:\n\n```\nsrwi      r9, r10, 20       # r9 = r10 >> 20\nclrlwi    r10, r10, 3       # r10 = r10 & 0x1FFFFFFF (physical address)\naddi      r11, r9, 0x200\nrlwinm    r11, r11, 0,19,19 # r11 = r11 & 0x1000\nadd       r11, r11, r10     # add 1 page to addresses > 0xE0000000\n\n# r11 = addess passed to GPU\n```\n\n## Memory Management\n\nTODO\n\n## References\n\n### PowerPC\n\nThe processor in the 360 is a 64-bit PowerPC chip running in 32-bit mode.\nPrograms are still allowed to use 64-bit PowerPC instructions, and registers\nare 64-bit as well, but 32-bit instructions will run in 32-bit mode.\nThe CPU is largely similar to the PPC part in the PS3, so Cell documents\noften line up for the core instructions. The 360 adds some additional AltiVec\ninstructions, though, which are only documented in a few places (like the gcc source code, etc).\n\n* [Free60 Info](https://free60project.github.io/wiki/Xenon_(CPU))\n* [Power ISA docs](https://web.archive.org/web/20140603115759/https://www.power.org/wp-content/uploads/2012/07/PowerISA_V2.06B_V2_PUBLIC.pdf) (aka 'PowerISA')\n* [PowerPC Programming Environments Manual](https://web.archive.org/web/20141028181028/https://www-01.ibm.com/chips/techlib/techlib.nsf/techdocs/F7E732FF811F783187256FDD004D3797/$file/pem_64bit_v3.0.2005jul15.pdf) (aka 'pem_64')\n* [PowerPC Vector PEM](https://web.archive.org/web/20130502201029/https://www-01.ibm.com/chips/techlib/techlib.nsf/techdocs/C40E4C6133B31EE8872570B500791108/$file/vector_simd_pem_v_2.07c_26Oct2006_cell.pdf)\n* [AltiVec PEM](https://web.archive.org/web/20151110180336/https://cache.freescale.com/files/32bit/doc/ref_manual/ALTIVECPEM.pdf)\n* [VMX128 Opcodes](http://biallas.net/doc/vmx128/vmx128.txt)\n* [AltiVec Decoding](https://github.com/kakaroto/ps3ida/blob/master/plugins/PPCAltivec/src/main.cpp)\n\n### x64\n\n* [Intel Manuals](https://software.intel.com/en-us/articles/intel-sdm)\n   * [Combined Intel Manuals](https://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-manual-325462.pdf)\n* [Apple AltiVec/SSE Migration Guide](https://developer.apple.com/legacy/library/documentation/Performance/Conceptual/Accelerate_sse_migration/Accelerate_sse_migration.pdf)\n"
  },
  {
    "path": "docs/cpu_todo.md",
    "content": "# CPU TODO\n\nThere are many improvements that can be done under `xe::cpu` to improve\ndebugging, performance (both to JIT and of generated code), and portability.\nSome are in various states of completion, and others are just thoughts that need\nmore exploring.\n\n## Debugging Improvements\n\n### Reproducable X64 Emission\n\nIt'd be useful to be able to run a PPC function through the entire pipeline and\nspit out x64 that is byte-for-byte identical across runs. This would allow\nautomated verification, bulk analysis, etc. Currently `X64Emitter::Emplace`\nwill relocate the x64 when placing it in memory, which will be at a different\nlocation each time. Instead it would be nice to have the xbyak `calcJmpAddress`\nthat performs the relocations use the address of our choosing.\n\n### Sampling Profiler\n\nOnce we have stack walking it'd be nice to take something like\n[micro-profiler](https://code.google.com/p/micro-profiler/) and augment it to\nsupport our system. This would let us run continuous performance analysis and\ntrack hotspots in JITed code without a large performance impact. Automatically\nshowing the top hot functions in the debugger could help track down poor\ntranslation much faster.\n\n### Intel Architecture Code Analyzer Support\n\nThe [Intel ACA](https://software.intel.com/en-us/articles/intel-architecture-code-analyzer)\nis a nifty tool that, given a kernel of x64, can detail theoretical performance\ncharacteristics on different processors down to cycle timings and potential\nbottlenecks on memory/execution units. It's designed to run on elf/obj/etc files\nhowever it simply looks for special markers in the code. Having something that\nwalks the code cache and dumps a specially formatted file with the markers\naround basic blocks could allow running the tool in bulk, or alternatively being\nable to invoke it one-off by dumping a specific x64 block to disk and processing\nit for display when looking at the code in the debugger would be useful.\n\nI've done some early experiments with this and its possible to pass just a\nbin file with the markers and the x64.\n\n### Function Tracing/Coverage Information\n\n`function_trace_data.h` contains the `FunctionTraceData` struct, which is\ncurrently partially populated by the x64 backend. This enables tracking of which\nthreads a function is called on, function call count, recent callers of the\nfunction, and even instruction-level counts.\n\nThis is all only partially implemented, though, and there's no tool to read it\nout. This would be nice to get integrated into the debugger so that it can\noverlay the information when viewing a function, but also useful in aggregate to\nfind hot functions/code paths or enhance callstacks by automatically annotating\nthread information.\n\n#### Block-level Counting\n\nCurrently the code assumes each instruction has a count, however this is\nexpensive and often unneeded as it can be done on a block level and then the\ninstruction counts can be derived from that. This can reduce the overhead (both\nin memory and accounting time) by an order of magnitude.\n\n### On-Stack Context Inspection\n\nCurrently the debugger only works with `--store_all_context_values`, as it can\nonly get the values of PPC registers when they are stored to the PPC context\nafter each instruction. As this can slow things down by ~10-20% it could be\nuseful to be able to preserve the optimized and register-allocated HIR so that\nhost registers holding context values can be derived on demand. Or, we could\njust make `--store_all_context_values` faster.\n\n## JIT Performance Improvements\n\n### Reduce HIR Size\n\nCurrently there are a lot of pointers stored within `Instr`, `Value`, and\nrelated types. These are big 8B values that eat a lot of memory and really\nhurt the cache (especially with all the block/instruction walking done).\nAligning everything to 16B values in the arena and using 16bit indices\n(or something) could shrink things a lot.\n\n### Serialize Code Cache\n\nThe x64 code cache is currently set up to use fixed memory addresses and is even\nrepresented as mapped memory. It should be fairly easy to back this with a file\nand have all code written to disk. Adding more metadata, or perhaps a side-car\nfile, would allow for the code to be written to disk. On future runs the code\ncache could load this data (by mapping the file containing the code right into\nmemory) and short cut JIT'ing entirely.\n\nIt would be possible to use a common container format (ELF/etc), however there's\nelegance in not requiring any additional steps beyond the memory mapping. Such\ncontainers could be useful for running static tools against, though.\n\n## Portability Improvements\n\n### Emulated Opcode Layer\n\nHaving a way to use emulated variants for any HIR opcode in a backend would\nhelp when writing a new backend as well as when verifying the existing backends.\nThis may look like a C library with functions for each opcode/type pairing and\nutilities to call out to them. Something like the x64 backend could then call\nout to these with CallNativeSafe (or some faster equivalent) and something like\nan interpreter backend would be fairly trivial to write.\n\n## X64 Backend Improvements\n\n### Implement Emulated Instructions\n\nThere are a ton of half-implemented HIR opcodes that call out to C++ to do their\nwork. These are extremely expensive as they incur a full guest-to-host thunk\n(~hundreds of instructions!). Basically, any of the `Emulate*`/`CallNativeSafe`\nfunctions in `x64_sequences.cc` need to be replaced with proper AVX/AVX2\nvariants.\n\n### Increase Register Availability\n\nCurrently only a few x64 registers are usable (due to reservations by the\nbackend or ABI conflicts). Though register pressure is surprisingly light in\nmost cases there are pathological cases that result in a lot of spills. By\nfreeing up some of the registers these spills could be reduced.\n\n### Constant Pooling\n\nThis may make sense as a compiler pass instead.\n\nRight now, particular sequences of instructions are nasty - such as anything\nusing `LoadConstantXmm` to load non-zero or non-1 vec128's. Instead of doing the\nsuper fat (20-30byte!) constant loads as they are done now it may be better to\nkeep a per-function constant table and instead use RIP-relative addressing (or\nsomething) to use the memory-form AVX instructions.\n\nFor example, right now this:\n```\n  v82.v128 = [0,1,2,3]\n  v83.v128 = or v81.v128, v82.128\n```\n\nTranslates to (something like):\n```\n  mov([rsp+0x...], 0x00000000)\n  mov([rsp+0x...+4], 0x00000001)\n  mov([rsp+0x...+8], 0x00000002)\n  mov([rsp+0x...+12], 0x00000003)\n  vmovdqa(xmm2, [rsp+0x...])\n  vor(xmm2, xmm2, xmm2)\n```\n\nWhere as it could be:\n```\n  vor(xmm2, xmm2, [rip+0x...])\n```\n\nWhether the cost of doing the constant de-dupe is worth it remains to be seen.\nRight now it's wasting a lot of instruction cache space, increasing decode time,\nand potentially using a lot more memory bandwidth.\n\n## Optimization Improvements\n\n### Speed Up RegisterAllocationPass\n\nCurrently the slowest pass, this could be improved by requiring less use\ntracking or perhaps maintaining the use tracking in other passes. A faster\nSortUsageList (radix or something fancy?) may be helpful as well.\n\n### More Opcodes in ConstantPropagationPass\n\nThere's a few HIR opcodes with no handling, and others with minimal handling.\nIt'd be nice to know what paths need improvement and add them, as any work here\nmakes things free later on.\n\n### Cross-Block ConstantPropagationPass\n\nConstant propagation currently only occurs within a single block. This makes it\ndifficult to optimize common PPC patterns like loading the constants 0 or 1 into\na register before a loop and other loads of expensive altivec values.\n\nEither ControlFlowAnalysisPass or DataFlowAnalysisPass could be piggy-backed to\ntrack constant load_context/store_context's across block bounds and propagate\nthe values. This is simpler than dynamic values as no phi functions or anything\nfancy needs to happen.\n\n### Add TypePropagationPass\n\nThere are many extensions/truncations in generated code right now due to\nvarious load/stores of varying widths. Being able to find and short-\ncircuit the conversions early on would make following passes cleaner\nand faster as they'd have to trace through fewer value definitions and there'd\nbe less extraneous movs in the final code.\n\nExample (after ContextPromotion):\n```\n  v82.i32 = truncate v81.i64\n  v83.i32 = and v82.i32, 3F\n  v85.i64 = zero_extend v84.i32\n```\n\nBecomes (after DCE/etc):\n```\n  v85.i64 = and v81.i64, 3F\n```\n\n### Enhance MemorySequenceCombinationPass with Extend/Truncate\n\nCurrently this pass will look for byte_swap and merge that into loads/stores.\nThis allows for better final codegen at the cost of making optimization more\ndifficult, so it only happens at the end of the process.\n\nThere's currently TODOs in there for adding extend/truncate support, which\nwill extend what it does with swaps to also merge the\nsign_extend/zero_extend/truncate into the matching load/store. This allows for\nthe x64 backend to generate the proper mov's that do these operations without\nrequiring additional steps. Note that if we had a LIR and a peephole optimizer\nthis would be better done there.\n\nLoad with swap and extend:\n```\n  v1.i32 = load v0\n  v2.i32 = byte_swap v1.i32\n  v3.i64 = zero_extend v2.i32\n```\n\nBecomes:\n```\n  v1.i64 = load_convert v0, [swap|i32->i64,zero]\n```\n\nStore with truncate and swap:\n```\n  v1.i64 = ...\n  v2.i32 = truncate v1.i64\n  v3.i32 = byte_swap v2.i32\n  store v0, v3.i32\n```\n\nBecomes:\n```\n  store_convert v0, v1.i64, [swap|i64->i32,trunc]\n```\n\n### Add DeadStoreEliminationPass\n\nGeneric DSE pass, removing all redundant stores. ContextPromotion may be\nable to take care of most of these, as the input assembly is generally\npretty optimized already. This pass would mainly be looking for introduced\nstores, such as those from comparisons.\n\nCurrently ControlFlowAnalysisPass will annotate blocks with incoming/outgoing\nedges as well as dominators, and that could be used to check whether stores into\nthe context are used in their destination block or instead overwritten\n(currently they almost never are).\n\nIf this pass was able to remove a good number of the stores then the comparisons\nwould also be removed with dead code elimination and dramatically reduce branch\noverhead.\n\nExample:\n```\n<block0>:\n  v0 = compare_ult ...     (later removed by DCE)\n  v1 = compare_ugt ...     (later removed by DCE)\n  v2 = compare_eq ...\n  store_context +300, v0   <-- removed\n  store_context +301, v1   <-- removed\n  store_context +302, v2   <-- removed\n  branch_true v1, ...\n<block1>:\n  v3 = compare_ult ...\n  v4 = compare_ugt ...\n  v5 = compare_eq ...\n  store_context +300, v3   <-- these may be required if at end of function\n  store_context +301, v4       or before a call\n  store_context +302, v5\n  branch_true v5, ...\n```\n\n### Add X64CanonicalizationPass\n\nFor various opcodes add copies/commute the arguments to match x64\noperand semantics. This makes code generation easier and if done\nbefore register allocation can prevent a lot of extra shuffling in\nthe emitted code.\n\nExample:\n```\n<block0>:\n  v0 = ...\n  v1 = ...\n  v2 = add v0, v1          <-- v1 now unused\n```\n\nBecomes:\n```\n  v0 = ...\n  v1 = ...\n  v1 = add v1, v0          <-- src1 = dest/src, so reuse for both\n                               by commuting and setting dest = src1\n```\n\n### Add MergeLocalSlotsPass\n\nAs the RegisterAllocationPass runs it generates load_local/store_local as it\nspills. Currently each set of locals is unique to each block, which in very\nlarge functions can result in a lot of locals that are only used briefly. It\nmay be useful to use the results of the ControlFlowAnalysisPass to track local\nliveness and merge the slots so they are reused when they cannot possibly be\nlive at the same time. This saves stack space and potentially improves cache\nbehavior.\n"
  },
  {
    "path": "docs/gpu.md",
    "content": "# GPU Documentation\n\n## The Xenos Chip\n\nThe [Xenos](https://en.wikipedia.org/wiki/Xenos_\\(graphics_chip\\)) is a graphics\nchip designed by AMD based off of the R5xx architecture.\n\n### Command Processing\n\nThe Xenos runs commands supplied to it directly by the DirectX bare-bones driver\nvia a ringbuffer located in system memory.\n\nThe bulk of the command processing code is located at\n[src/xenia/gpu/command_processor.cc](../src/xenia/gpu/command_processor.cc)\n\n### EDRAM\n\nThe Xenos uses special high-speed memory located on the same die as the chip to \nstore framebuffers/render targets.\n\nTODO: More documentation\n\n## Options\n\n### General\n\nSee the top of [src/xenia/gpu/gpu_flags.cc](../src/xenia/gpu/gpu_flags.cc).\n\n`--vsync=false` will attempt to render the game as fast as possible instead of\nwaiting for a fixed 60hz timer.\n\n### Vulkan\n\nSee the top of [src/xenia/gpu/vulkan/vulkan_gpu_flags.cc](../src/xenia/gpu/vulkan/vulkan_gpu_flags.cc).\n\n`vulkan_dump_disasm=true` \"Dump shader disassembly. NVIDIA only supported.\"\n\n## Tools\n\n### Shaders\n\n#### Shader Dumps\n\nAdding `--dump_shaders=path/` will write all translated shaders to the given\npath with names based on input hash (so they'll be stable across runs).\nBinaries containing the original microcode will be placed side-by-side with\nthe dumped output to make it easy to pipe to `xe-gpu-shader-compiler`.\n\n#### xe-gpu-shader-compiler\n\nA standalone shader compiler exists to allow for quick shader translation\ntesting. You can pass a binary ucode shader in and get either disassembled\nucode or translated source out. This is best used through the Shader\nPlayground tool.\n\n```\n  xe-gpu-shader-compiler \\\n      --shader_input=input_file.bin.vs (or .fs)\n      --shader_output=output_file.txt\n      --shader_output_type=ucode (or spirvtext)\n```\n\n#### Shader Playground\n\nBuilt separately (for now) under [tools/shader-playground/](../tools/shader-playground/)\nis a GUI for interactive shader assembly, disassembly, validation, and\ntranslation.\n\n![Shader Playground Screenshot](images/shader_playground.png?raw=true)\n\nEntering shader microcode on the left will invoke the XNA Game Studio\nD3D compiler to translate the ucode to binary. The D3D compiler is then\nused to disassemble the binary and display the optimized form. If\n`xe-gpu-shader-compiler` has been built the ucode will be passed to that\nfor disassembly and that will then be passed through D3D compiler. If\nthe output of D3D compiler on the xenia disassembly doesn't match the\noriginal D3D compiler output the box will turn red, indicating that the\ndisassembly is broken. Finally, the right most box will show the\ntranslated shader in the desired format.\n\nFor more information and setup instructions see\n[tools/shader-playground/README.md](../tools/shader-playground/README.md).\n\n### xe-gpu-trace-viewer\n\nTo quickly iterate on graphical issues, xenia can dump frames (or sequences of\nframes) while running that can be opened and inspected in a separate app.\n\nThe basic workflow is:\n\n1. Capture the frame in game (using F4) or a stream of frames.\n2. Add the file path to the xe-gpu-trace-viewer Debugging command line in\nVisual Studio.\n3. Launch xe-gpu-trace-viewer.\n4. Poke around, find issues, etc.\n5. Modify code.\n6. Build and relaunch.\n7. Goto 4.\n\n#### Capturing Frames\n\nFirst, specify a path to capture traces to with\n`--trace_gpu_prefix=path/file_prefix_`. All files will have a randomish name\nbased on that.\n\nWhen running xenia.exe you can hit F4 at any time to capture the next frame the\ngame tries to draw (up until a VdSwap call). The file can be used immediately.\n\n#### Capturing Sequences\n\nPassing `--trace_gpu_stream` will write all frames rendered to a file, allowing\nyou to seek through them in the trace viewer. These files will get large.\n\n## References\n\n### Command Buffer/Registers\n\nRegisters documented at [src/xenia/gpu/register_table.inc](../src/xenia/gpu/register_table.inc).\n\nPM4 commands documented at [src/xenia/gpu/xenos.h](../src/xenia/gpu/xenos.h#L521).\n\n#### Performance Counters that may be read back by D3D\n\nThey are 64-bit values and have a high and low 32-bit register as well as a `SELECT` register each:\n\n- CP_PERFCOUNTER0\n\n- RBBM_PERFCOUNTER0\n- RBBM_PERFCOUNTER1\n\n- SQ_PERFCOUNTER0\n- SQ_PERFCOUNTER1\n- SQ_PERFCOUNTER2\n- SQ_PERFCOUNTER3\n\n- VGT_PERFCOUNTER0\n- VGT_PERFCOUNTER1\n- VGT_PERFCOUNTER2\n- VGT_PERFCOUNTER3\n\n- VC_PERFCOUNTER0\n- VC_PERFCOUNTER1\n- VC_PERFCOUNTER2\n- VC_PERFCOUNTER3\n\n- PA_SU_PERFCOUNTER0\n- PA_SU_PERFCOUNTER1\n- PA_SU_PERFCOUNTER2\n- PA_SU_PERFCOUNTER3\n\n- PA_SC_PERFCOUNTER0\n- PA_SC_PERFCOUNTER1\n- PA_SC_PERFCOUNTER2\n- PA_SC_PERFCOUNTER3\n\n- HZ_PERFCOUNTER0\n- HZ_PERFCOUNTER1\n\n- TCR_PERFCOUNTER0\n- TCR_PERFCOUNTER1\n\n- TCM_PERFCOUNTER0\n- TCM_PERFCOUNTER1\n\n- TCF_PERFCOUNTER0\n- TCF_PERFCOUNTER1\n- TCF_PERFCOUNTER2\n- TCF_PERFCOUNTER3\n- TCF_PERFCOUNTER4\n- TCF_PERFCOUNTER5\n- TCF_PERFCOUNTER6\n- TCF_PERFCOUNTER7\n- TCF_PERFCOUNTER8\n- TCF_PERFCOUNTER9\n- TCF_PERFCOUNTER10\n- TCF_PERFCOUNTER11\n\n- TP0_PERFCOUNTER0\n- TP0_PERFCOUNTER1\n- TP1_PERFCOUNTER0\n- TP1_PERFCOUNTER1\n- TP2_PERFCOUNTER0\n- TP2_PERFCOUNTER1\n- TP3_PERFCOUNTER0\n- TP3_PERFCOUNTER1\n\n- SX_PERFCOUNTER0\n\n- BC_PERFCOUNTER0\n- BC_PERFCOUNTER1\n- BC_PERFCOUNTER2\n- BC_PERFCOUNTER3\n\n- MC0_PERFCOUNTER0\n- MC1_PERFCOUNTER0\n\n- MH_PERFCOUNTER0\n- MH_PERFCOUNTER1\n- MH_PERFCOUNTER2\n\n- BIF_PERFCOUNTER0\n\n### Shaders\n\n* [LLVM R600 Tables](https://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AMDGPU/R600Instructions.td)\n** The opcode formats don't match, but the name->psuedo code is correct.\n* [xemit](https://github.com/gligli/libxemit/blob/master/xemitops.c)\n"
  },
  {
    "path": "docs/instruction_tracing.md",
    "content": "In x64_tracers.cc:\n\nEnable tracing:\n```\n#define ITRACE 1  <--- for only ppc instructions\n#define DTRACE 1  <--- add HIR data\n```\n\nIf tracing data, run with the following flags:\n```\n--store_all_context_values\n```\n\nBy default, tracing will start at the beginning and only for the specified\nthread.\n\nChange traced thread by thread creation ID:\n```\n#define TARGET_THREAD 4\n```\n\nTo only trace at a certain point, change default trace flag to false:\n```\nbool trace_enabled = true;\n```\nAdd a breakpoint:\n```\n--break_on_instruction=0x821009A4\n```\nOn break, add the following to the Watch window and set it to true:\n```\nxe::cpu::backend::x64::trace_enabled\n```\nContinue, and watch stuff appear in the log.\n"
  },
  {
    "path": "docs/kernel.md",
    "content": "# Kernel Documentation\n\n## Kernel shims\nXenia implements all kernel APIs as native functions under the host.\n\nWhen a module is loaded, the loader will find all kernel imports, put a syscall in\ntheir place, then lookup a kernel export and link it to each import. The JIT will\ngenerate a sequence of instructions to call into Xenia's export if it encounters a syscall.\n\nCurrently, there are two ways an export can be defined -\n[for example](../src/xenia/kernel/xboxkrnl/xboxkrnl_audio.cc):\n* `SHIM_CALL XAudioGetSpeakerConfig_shim(PPCContext* ppc_context, KernelState* kernel_state)`\n* `dword_result_t XAudioGetSpeakerConfig(lpdword_t config_ptr)`\n\nThe `SHIM_CALL` convention is deprecated, but allows a closer look at the internals of how\ncalls are done. `ppc_context` is the guest PowerPC context, which holds all guest\nregisters. Function parameters are fetched from r3...r10 (`SHIM_GET_ARG_32`), and\nadditional parameters are loaded from the stack. The return value (if there is one)\nis stored in r3 (`SHIM_SET_RETURN_32`).\n\nDetails on how calls transition from guest -> host can be found in the [cpu documentation](cpu.md).\n\nThe newer convention does the same, but uses templates to automate the process\nof loading arguments and setting a return value.\n\n## Kernel Modules\nXenia has an implementation of two xbox kernel modules, xboxkrnl.exe and xam.xex\n\n### xboxkrnl.exe - Xbox kernel\n\nDefined under src/xenia/kernel/xboxkrnl.\n\nThis is a slightly modified version of the NT kernel. Most of the APIs \nare equivalent to ones you'd find on MSDN or other online sources.\n\nSource files are organized into groups of APIs.\n\n### xam.xex - Xbox Auxiliary Methods\n\nDefined under src/xenia/kernel/xam.\n\nThis module implements functionality specific to the Xbox."
  },
  {
    "path": "docs/ppc/vmx128.txt",
    "content": " 2006/09/01                                         Revision 1.2\n-----------------------------------------------------------------\n\n\n   This is a description of the VMX128-type opcodes found on\n   the xbox360 processor. I figured this out by looking at\n   various disassmblies, so there might some errors and\n   missing instructions. Some instructions have unknown\n   semantics for me.\n\n   See comments or corrections to sb#biallas.net\n\n\n=================================================================\nConventions:\n   VD128, VS128:  5 lower bits of a VMX128 vector register \n                  number\n   VDh:\t          upper 2 bits of VD128\n                  (so register number is (VDh << 5 | VD128))\n\t\t \n   VA128:         same as VD128\n   A:             bit 6 of VA128\n   a:             bit 5 of VA128\n                  (so register number is (A<<6 | a<<5 | VA128))\n                     \n   VB128:         same as VD128\n   VBh:           same as VDh\n   \n   VC128:         3 bits of a VMX128 vector register number\n                  (you can only use vr0-vr7 here)\n   \n   RA, RB:        general purpose register number\n\n   UIMM:          unsigned immediate value\n   SIMM:          signed immediate value\n   \n   PERMh:         upper 3 bits of a permutation\n   PERMl:         lower 5 bits of a permutation\n   \n   x, y, z:       unknown immediate values\n\n=================================================================\n   lvewx128                  Load Vector128 Element Word Indexed\n|0 0 0 1 0 0|  VD128  |   RA    |   RB    |0 0 0 1 0 0 0|VDh|1 1|\n\n   lvewx128      vr(VD128), r(RA), r(RB)\n\n\n=================================================================\n   lvlx128                           Load Vector128 Left Indexed\n|0 0 0 1 0 0|  VD128  |   RA    |   RB    |1 0 0 0 0 0 0|VDh|1 1|\n\n   lvlx128       vr(VD128), r(RA), r(RB)\n\n\n=================================================================\n   lvrx128                          Load Vector128 Right Indexed\n|0 0 0 1 0 0|  VD128  |   RA    |   RB    |1 0 0 0 1 0 0|VDh|1 1|\n\n   lvrx128       vr(VD128), r(RA), r(RB)\n\n\n=================================================================\n   lvlxl128                      Load Vector128 Left Indexed LRU\n|0 0 0 1 0 0|  VD128  |   RA    |   RB    |1 1 0 0 0 0 0|VDh|1 1|\n\n   lvlxl128      vr(VD128), r(RA), r(RB)\n\n\n=================================================================\n   lvrxl128                     Load Vector128 Right Indexed LRU\n|0 0 0 1 0 0|  VD128  |   RA    |   RB    |1 1 0 0 1 0 0|VDh|1 1|\n\n   lvrxl128      vr(VD128), r(RA), r(RB)\n\n\n=================================================================\n   lvsl128                         Load Vector128 for Shift Left\n|0 0 0 1 0 0|  VD128  |   RA    |   RB    |0 0 0 0 0 0 0|VDh|1 1|\n\n   lvsl128       vr(VD128), r(RA), r(RB)\n\n\n=================================================================\n   lvsr128                        Load Vector128 for Shift Right\n|0 0 0 1 0 0|  VD128  |   RA    |   RB    |0 0 0 0 1 0 0|VDh|1 1|\n\n   lvsr128       vr(VD128), r(RA), r(RB)\n\n\n=================================================================\n   lvx128                                 Load Vector128 Indexed\n|0 0 0 1 0 0|  VD128  |   RA    |   RB    |0 0 0 1 1 0 0|VDh|1 1|\n\n   lvx128        vr(VD128), r(RA), r(RB)\n\n\n=================================================================\n   lvxl128                            Load Vector128 Indexed LRU\n|0 0 0 1 0 0|  VD128  |   RA    |   RB    |0 1 0 1 1 0 0|VDh|1 1|\n\n   lvxl128       vr(VD128), r(RA), r(RB)\n\n\n=================================================================\n   stewx128                 Store Vector128 Element Word Indexed\n|0 0 0 1 0 0|  VS128  |   RA    |   RB    |0 1 1 0 0 0 0|VDh|1 1|\n\n   stvewx128     vr(VS128), r(RA), r(RB)\n\n\n=================================================================\n   stvlx128                         Store Vector128 Left Indexed\n|0 0 0 1 0 0|  VS128  |   RA    |   RB    |1 0 1 0 0 0 0|VDh|1 1|\n\n   stvlx128      vr(VS128), r(RA), r(RB)\n\n\n=================================================================\n   stvlxl128                    Store Vector128 Left Indexed LRU\n|0 0 0 1 0 0|  VS128  |   RA    |   RB    |1 1 1 0 0 0 0|VDh|1 1|\n\n   lvlxl128      vr(VS128), r(RA), r(RB)\n\n\n=================================================================\n   stvrx128                        Store Vector128 Right Indexed\n|0 0 0 1 0 0|  VS128  |   RA    |   RB    |1 0 1 0 1 0 0|VDh|1 1|\n\n   stvrx128       vr(VS128), r(RA), r(RB)\n\n\n=================================================================\n   stvrxl128                   Store Vector128 Right Indexed LRU\n|0 0 0 1 0 0|  VS128  |   RA    |   RB    |1 1 1 0 1 0 0|VDh|1 1|\n\n   stvrxl128     vr(VS128), r(RA), r(RB)\n\n\n=================================================================\n   stvx128                               Store Vector128 Indexed\n|0 0 0 1 0 0|  VS128  |   RA    |   RB    |0 0 1 1 1 0 0|VDh|1 1|\n\n   stvx128       vr(VS128), r(RA), r(RB)\n\n\n=================================================================\n   stvxl128                          Store Vector128 Indexed LRU\n|0 0 0 1 0 0|  VS128  |   RA    |   RB    |0 1 1 1 1 0 0|VDh|1 1|\n\n   stvxl128      vr(VS128), r(RA), r(RB)\n\n\n=================================================================\n   vaddfp128                        Vector128 Add Floating Point\n|0 0 0 1 0 1|  VD128  |  VA128  |  VB128  |A|0 0 0 0|a|1|VDh|VBh|\n\n   vaddfp128     vr(VD128), vr(VA128), vr(VB128)\n\n\n=================================================================\n   vand128                                 Vector128 Logical AND\n|0 0 0 1 0 1|  VD128  |  VA128  |  VB128  |A|1 0 0 0|a|1|VDh|VBh|\n\n   vand128       vr(VD128), vr(VA128), vr(VB128)\n\n\n=================================================================\n   vandc128                                Vector128 Logical AND \n                                                 with Complement\n|0 0 0 1 0 1|  VD128  |  VA128  |  VB128  |A|1 0 1 0|a|1|VDh|VBh|\n\n   vandc128      vr(VD128), vr(VA128), vr(VB128)\n\n\n=================================================================\n   vcfpsxws128          Vector128 Convert From Floating-Point to \n                                Signed Fixed-Point Word Saturate\n|0 0 0 1 1 0|  VD128  |  SIMM   |  VB128  |0 1 0 0 0 1 1|VDh|VBh|\n\n   vcfpsxws128   vr(VD128), vr(VB128), SIMM\n\n\n=================================================================\n   vcfpuxws128          Vector128 Convert From Floating-Point to \n                              Unsigned Fixed-Point Word Saturate\n|0 0 0 1 1 0|  VD128  |  UIMM   |  VB128  |0 1 0 0 1 1 1|VDh|VBh|\n\n   vcfpuxws128   vr(VD128), vr(VB128), UIMM\n\n\n=================================================================\n   vcmpbfp128                           Vector128 Compare Bounds \n                                                  Floating Point\n|0 0 0 1 1 0|  VD128  |  VA128  |  VB128  |A|0 1 1|R|a|0|VDh|VBh|\n\n   vcmpbfp128    vr(VD128), vr(VA128), vr(VB128)         (R == 0)\n   vcmpbfp128.   vr(VD128), vr(VA128), vr(VB128)         (R == 1)\n\n\n=================================================================\n   vcmpeqfp128                        Vector128 Compare Equal-to\n                                                  Floating Point\n|0 0 0 1 1 0|  VD128  |  VA128  |  VB128  |A|0 0 0|R|a|0|VDh|VBh|\n\n   vcmpeqfp128   vr(VD128), vr(VA128), vr(VB128)         (R == 0)\n   vcmpeqfp128.  vr(VD128), vr(VA128), vr(VB128)         (R == 1)\n\n\n=================================================================\n   vcmpequw128                        Vector128 Compare Equal-to \n                                                   Unsigned Word\n|0 0 0 1 1 0|  VD128  |  VA128  |  VB128  |A|1 0 0|R|a|0|VDh|VBh|\n\n   vcmpequw128   vr(VD128), vr(VA128), vr(VB128)         (R == 0)\n   vcmpequw128.  vr(VD128), vr(VA128), vr(VB128)         (R == 1)\n\n\n=================================================================\n   vcmpgefp128                    Vector128 Compare Greater-Than-\n                                      or-Equal-to Floating Point\n|0 0 0 1 1 0|  VD128  |  VA128  |  VB128  |A|0 0 1|R|a|0|VDh|VBh|\n\n   vcmpgefp128   vr(VD128), vr(VA128), vr(VB128)         (R == 0)\n   vcmpgefp128.  vr(VD128), vr(VA128), vr(VB128)         (R == 1)\n\n\n=================================================================\n   vcmpgtfp128                    Vector128 Compare Greater-Than \n                                                  Floating-Point\n|0 0 0 1 1 0|  VD128  |  VA128  |  VB128  |A|0 1 0|R|a|0|VDh|VBh|\n\n   vcmpgtfp128   vr(VD128), vr(VA128), vr(VB128)         (R == 0)\n   vcmpgtfp128.  vr(VD128), vr(VA128), vr(VB128)         (R == 1)\n\n\n=================================================================\n   vcsxwfp128          Vector128 Convert From Signed Fixed-Point \n                                          Word to Floating-Point\n|0 0 0 1 1 0|  VD128  |  UIMM   |  VB128  |0 1 0 1 0 1 1|VDh|VBh|\n\n   vcsxwfp128    vr(VD128), vr(VB128), SIMM\n\n\n=================================================================\n   vcuxwfp128        Vector128 Convert From Unsigned Fixed-Point\n                                          Word to Floating-Point\n|0 0 0 1 1 0|  VD128  |  UIMM   |  VB128  |0 1 0 1 1 1 1|VDh|VBh|\n\n   vcuxwfp128    vr(VD128), vr(VB128), UIMM\n\n\n=================================================================\n   vexptefp128                Vector128 2 Raised to the Exponent \n                                         Estimate Floating Point\n|0 0 0 1 1 0|  VD128  |0 0 0 0 0|  VB128  |1 1 0 1 0 1 1|VDh|VBh|\n\n   vexptefp128   vr(VD128), vr(VB128)\n\n\n=================================================================\n   vlogefp128                            Vector128 Log2 Estimate \n                                                  Floating Point\n|0 0 0 1 1 0|  VD128  |0 0 0 0 0|  VB128  |1 1 0 1 1 1 1|VDh|VBh|\n\n   vlogefp128    vr(VD128), vr(VB128)\n\n\n=================================================================\n   vmaddcfp128                            Vector128 Multiply Add \n                                                  Floating Point\n|0 0 0 1 0 1|  VDS128 |  VA128  |  VB128  |A|0 1 0 0|a|1|VDh|VBh|\n\n   vmaddcfp128   vr(VDS128), vr(VA128), vr(VSD128), vr(VB128)\n\n\n=================================================================\n   vmaddfp128                             Vector128 Multiply Add \n                                                  Floating Point\n|0 0 0 1 0 1|  VDS128 |  VA128  |  VB128  |A|0 0 1 1|a|1|VDh|VBh|\n\n   vmaddfp128    vr(VDS128), vr(VA128), vr(VB128), vr(VDS128)\n\n\n=================================================================\n   vmaxfp128                                   Vector128 Maximum \n                                                  Floating Point\n|0 0 0 1 1 0|  VD128  |  VA128  |  VB128  |A|1 0 1 0|a|0|VDh|VBh|\n\n   vmaxfp128     vr(VD128), vr(VA128), vr(VB128)\n\n\n=================================================================\n   vminfp128                                   Vector128 Minimum\n                                                  Floating Point\n|0 0 0 1 1 0|  VD128  |  VA128  |  VB128  |A|1 0 1 1|a|0|VDh|VBh|\n\n   vminfp128     vr(VD128), vr(VA128), vr(VB128)\n\n\n=================================================================\n   vmrghw128                           Vector128 Merge High Word\n|0 0 0 1 1 0|  VD128  |  VA128  |  VB128  |A|1 1 0 0|a|0|VDh|VBh|\n\n   vmrghw128     vr(VD128), vr(VA128), vr(VB128)\n\n\n=================================================================\n   vmrglw128                            Vector128 Merge Low Word\n|0 0 0 1 1 0|  VD128  |  VA128  |  VB128  |A|1 1 0 1|a|0|VDh|VBh|\n\n   vmrglw128     vr(VD128), vr(VA128), vr(VB128)\n\n\n=================================================================\n   vmsum3fp128                      Vector128 Multiply Sum 3-way \n                                                  Floating Point\n|0 0 0 1 0 1|  VD128  |  VA128  |  VB128  |A|0 1 1 0|a|1|VDh|VBh|\n\n   vmsub3fp128   vr(VD128), vr(VA128), vr(VB128)\n\n\n=================================================================\n   vmsum4fp128                      Vector128 Multiply Sum 4-way \n                                                  Floating-Point\n|0 0 0 1 0 1|  VD128  |  VA128  |  VB128  |A|0 1 1 1|a|1|VDh|VBh|\n\n   vmsub4fp128   vr(VD128), vr(VA128), vr(VB128)\n\n\n=================================================================\n   vmulfp128                                  Vector128 Multiply\n                                                  Floating-Point\n|0 0 0 1 0 1|  VD128  |  VA128  |  VB128  |A|0 0 1 0|a|1|VDh|VBh|\n\n   vmulfp128     vr(VD128), vr(VA128), vr(VB128)\n\n\n=================================================================\n   vnmsubfp128              Vector128 Negative Multiply-Subtract \n                                                  Floating Point\n|0 0 0 1 0 1|  VDS128 |  VA128  |  VB128  |A|0 1 0 1|a|1|VDh|VBh|\n\n   vnmsubfp128   vr(VDS128), vr(VA128), vr(VB128), vr(VDS128)\n\n\n=================================================================\n   vnor128                                 Vector128 Logical NOR\n|0 0 0 1 0 1|  VD128  |  VA128  |  VB128  |A|1 0 1 0|a|1|VDh|VBh|\n\n   vnor128       vr(VD128), vr(VA128), vr(VB128)\n\n\n=================================================================\n   vor128                                   Vector128 Logical OR\n|0 0 0 1 0 1|  VD128  |  VA128  |  VB128  |A|1 0 1 1|a|1|VDh|VBh|\n\n   vor128        vr(VD128), vr(VA128), vr(VB128)\n\n\n=================================================================\n   vperm128                                Vector128 Permutation\n|0 0 0 1 0 1|  VD128  |  VA128  |  VB128  |A|0| VC  |a|0|VDh|VBh|\n\n   vperm128      vr(VD128), vr(VA128), vr(VB128), vr(VC)\n\n\n=================================================================\n   vpermwi128                 Vector128 Permutate Word Immediate\n|0 0 0 1 1 0|  VD128  |  PERMl  |  VB128  |0|1|PERMh|0|1|VDh|VBh|\n\n   vpermwi128    vr(VD128), vr(VB128), (PERMh << 5 | PERMl)\n\n\n=================================================================\n   vpkd3d128                 Vector128 Pack D3Dtype, Rotate Left \n                                       Immediate and Mask Insert\n|0 0 0 1 1 0|  VD128  |  x  | y |  VB128  |1 1 0| z |0 1|VDh|VBh|\n\n   vpkd3d128     vr(VD128), vr(VB128), x, y, z\n\n\n=================================================================\n   vpkshss128                    Vector128 Pack Signed Half Word \n                                                 Signed Saturate\n|0 0 0 1 0 1|  VD128  |  VA128  |  VB128  |A|1 0 0 0|a|0|VDh|VBh|\n\n   vpkshss128    vr(VD128), vr(VA128), vr(VB128)\n\n\n=================================================================\n   vpkshus128                    Vector128 Pack Signed Half Word \n                                               Unsigned Saturate\n|0 0 0 1 0 1|  VD128  |  VA128  |  VB128  |A|1 0 0 1|a|0|VDh|VBh|\n\n   vpkshus128    vr(VD128), vr(VA128), vr(VB128)\n\n\n=================================================================\n   vpkswss128                         Vector128 Pack Signed Word\n                                                 Signed Saturate\n|0 0 0 1 0 1|  VD128  |  VA128  |  VB128  |A|1 0 1 0|a|0|VDh|VBh|\n\n   vpkswss128    vr(VD128), vr(VA128), vr(VB128)\n\n\n=================================================================\n   vpkswus128                         Vector128 Pack Signed Word   \n                                               Unsigned Saturate\n|0 0 0 1 0 1|  VD128  |  VA128  |  VB128  |A|1 0 1 1|a|0|VDh|VBh|\n\n   vpkswus128    vr(VD128), vr(VA128), vr(VB128)\n\n\n=================================================================\n   vpkuhum128                  Vector128 Pack Unsigned Half Word \n                                                 Unsigned Modulo\n|0 0 0 1 0 1|  VD128  |  VA128  |  VB128  |A|1 1 0 0|a|0|VDh|VBh|\n\n   vpkuhum128    vr(VD128), vr(VA128), vr(VB128)\n\n\n=================================================================\n   vpkuhus128                  Vector128 Pack Unsigned Half Word \n                                               Unsigned Saturate\n|0 0 0 1 0 1|  VD128  |  VA128  |  VB128  |A|1 1 0 1|a|0|VDh|VBh|\n\n   vpkuhus128    vr(VD128), vr(VA128), vr(VB128)\n\n\n=================================================================\n   vpkuwum128                       Vector128 Pack Unsigned Word\n                                                 Unsigned Modulo\n|0 0 0 1 0 1|  VD128  |  VA128  |  VB128  |A|1 1 1 0|a|0|VDh|VBh|\n\n   vpkuwum128    vr(VD128), vr(VA128), vr(VB128)\n\n\n=================================================================\n   vpkuwus128                       Vector128 Pack Unsigned Word\n                                               Unsigned Saturate\n|0 0 0 1 0 1|  VD128  |  VA128  |  VB128  |A|1 1 1 1|a|0|VDh|VBh|\n\n   vpkuwus128    vr(VD128), vr(VA128), vr(VB128)\n\n\n=================================================================\n   vrefp128                        Vector128 Reciprocal Estimate \n                                                  Floating Point\n|0 0 0 1 1 0|  VD128  |0 0 0 0 0|  VB128  |1 1 0 0 0 1 1|VDh|VBh|\n\n   vrefp128      vr(VD128), vr(VB128)\n\n\n=================================================================\n   vrfim128                    Vector128 Round to Floating-Point \n                                              Integer toward -oo\n|0 0 0 1 1 0|  VD128  |0 0 0 0 0|  VB128  |0 1 1 0 0 1 1|VDh|VBh|\n\n   vrfim128      vr(VD128), vr(VB128)\n\n\n=================================================================\n   vrfin128                    Vector128 Round to Floating-Point \n                                          Integer toward Nearest\n|0 0 0 1 1 0|  VD128  |0 0 0 0 0|  VB128  |0 1 1 0 1 1 1|VDh|VBh|\n\n   vrfin128      vr(VD128), vr(VB128)\n\n\n=================================================================\n   vrfip128                    Vector128 Round to Floating-Point \n                                              Integer toward +oo\n|0 0 0 1 1 0|  VD128  |0 0 0 0 0|  VB128  |0 1 1 1 0 1 1|VDh|VBh|\n\n   vrfip128      vr(VD128), vr(VB128)\n\n\n=================================================================\n   vrfiz128                    Vector128 Round to Floating-Point \n                                             Integer toward Zero\n|0 0 0 1 1 0|  VD128  |0 0 0 0 0|  VB128  |0 1 1 1 1 1 1|VDh|VBh|\n\n   vrfiz128      vr(VD128), vr(VB128)\n\n\n=================================================================\n   vrlimi128                     Vector128 Rotate Left Immediate \n                                                 and Mask Insert\n|0 0 0 1 1 0|  VD128  |  UIMM   |  VB128  |1 1 1| z |0 1|VDh|VBh|\n\n   vrlimi128     vr(VD128), vr(VB128), UIMM, z\n\n\n=================================================================\n   vrlw128                            Vector128 Rotate Left Word\n|0 0 0 1 0 1|  VD128  |  VA128  |  VB128  |A|0 0 0 1|a|1|VDh|VBh|\n\n   vrlw128       vr(VD128), vr(VA128), vr(VB128)\n\n\n=================================================================\n   vrsqrtefp128                 Vector128 Reciprocal Square Root \n                                         Estimate Floating Point\n|0 0 0 1 1 0|  VD128  |0 0 0 0 0|  VB128  |1 1 0 0 1 1 1|VDh|VBh|\n\n   vrsqrtefp128  vr(VD128), vr(VB128)\n\n\n=================================================================\n   vsel128                                      Vector128 Select\n|0 0 0 1 0 1| VDS128  |  VA128  |  VB128  |A|1 1 0 1|a|1|VDh|VBh|\n\n   vsel128       vr(VDS128), vr(VA128), vr(VB128), vr(VDS128)\n\n\n=================================================================\n   vsldoi128                         Vector128 Shift Left Double \n                                              by Octet Immediate\n|0 0 0 1 0 0|  VD128  |  VA128  |  VB128  |A|  SHB  |a|1|VDh|VBh|\n\n   vsldoi128     vr(VD128), vr(VA128), vr(VB128), SHB\n\n\n=================================================================\n   vslo128                            Vector128 Shift Left Octet\n|0 0 0 1 0 1|  VD128  |  VA128  |  VB128  |A|1 1 1 0|a|1|VDh|VBh|\n\n   vslo128       vr(VD128), vr(VA128), vr(VB128)\n\n\n=================================================================\n   vslw128                             Vector128 Shift Left Word\n|0 0 0 1 1 0|  VD128  |  VA128  |  VB128  |A|0 0 1 1|a|1|VDh|VBh|\n\n   vslw128       vr(VD128), vr(VA128), vr(VB128)\n\n\n=================================================================\n   vspltisw128                         Vector128 Splat Immediate \n                                                     Signed Word\n|0 0 0 1 1 0|  VD128  |  SIMM   |  VB128  |1 1 1 0 1 1 1|VDh|VBh|\n\n   vspltisw128   vr(VD128), vr(VB128), SIMM\n\n\n=================================================================\n   vspltw128                                Vector128 Splat Word\n|0 0 0 1 1 0|  VD128  |  UIMM   |  VB128  |1 1 1 0 0 1 1|VDh|VBh|\n\n   vspltw128     vr(VD128), vr(VB128), UIMM\n\n\n=================================================================\n   vsraw128                                Vector128 Shift Right \n                                                 Arithmetic Word\n|0 0 0 1 1 0|  VD128  |  VA128  |  VB128  |A|0 1 0 1|a|1|VDh|VBh|\n\n   vsraw128      vr(VD128), vr(VA128), vr(VB128)\n\n\n=================================================================\n   vsro128                           Vector128 Shift Right Octet\n|0 0 0 1 1 0|  VD128  |  VA128  |  VB128  |A|1 1 1 1|a|1|VDh|VBh|\n\n   vsro128       vr(VD128), vr(VA128), vr(VB128)\n\n\n=================================================================\n   vsrw128                            Vector128 Shift Right Word\n|0 0 0 1 1 0|  VD128  |  VA128  |  VB128  |A|0 1 1 1|a|1|VDh|VBh|\n\n   vsrw128       vr(VD128), vr(VA128), vr(VB128)\n\n\n=================================================================\n   vsubfp128                   Vector128 Subtract Floating Point\n|0 0 0 1 0 1|  VD128  |  VA128  |  VB128  |A|0 0 0 1|a|1|VDh|VBh|\n\n   vsubfp128     vr(VD128), vr(VA128), vr(VB128)\n\n\n=================================================================\n   vupkd3d128                           Vector128 Unpack D3Dtype\n|0 0 0 1 1 0|  VD128  |  UIMM   |  VB128  |1 1 1 1 1 1 1|VDh|VBh|\n\n   vupkd3d128    vr(VD128), vr(VB128), UIMM\n\n\n=================================================================\n   vupkhsb128                                   Vector128 Unpack \n                                                High Signed Byte\n|0 0 0 1 1 0|  VD128  |0 0 0 0 0|  VB128  |0 1 1 1 0 0 0|VDh|VBh|\n\n   vupkhsb128    vr(VD128), vr(VB128)\n\n\n=================================================================\n   vupklsb128                                   Vector128 Unpack \n                                                 Low Signed Byte\n|0 0 0 1 1 0|  VD128  |0 0 0 0 0|  VB128  |0 1 1 1 1 0 0|VDh|VBh|\n\n   vupkhsb128    vr(VD128), vr(VB128)\n\n\n=================================================================\n   vxor128                                 Vector128 Logical XOR\n|0 0 0 1 0 1|  VD128  |  VA128  |  VB128  |A|1 1 0 0|a|1|VDh|VBh|\n\n   vxor128       vr(VD128), vr(VA128), vr(VB128)\n"
  },
  {
    "path": "docs/style_guide.md",
    "content": "# C++ Style Guide\n\nThe style guide can be summed up as 'clang-format with the Google style set'.\nIn addition, the [Google Style Guide](https://google.github.io/styleguide/cppguide.html)\nis followed and cpplint is the source of truth. When in doubt, defer to what\ncode in the project already does.\n\nBase rules:\n\n* 80 column line length max\n* LF (Unix-style) line endings\n* 2-space soft tabs, no TABs!\n* [Google Style Guide](https://google.github.io/styleguide/cppguide.html) for naming/casing/etc\n* Sort includes according to the [style guide rules](https://google.github.io/styleguide/cppguide.html#Names_and_Order_of_Includes)\n* Comments are properly punctuated (that means capitalization and periods, etc)\n* TODO's must be attributed like `// TODO(yourgithubname): foo.`\n\nCode that really breaks from the formatting rules will not be accepted, as then\nno one else can use clang-format on the code without also touching all your\nlines.\n\n### Why?\n\nTo quote the [Google Style Guide](https://google.github.io/styleguide/cppguide.html):\n\n```\nOne way in which we keep the code base manageable is by enforcing consistency.\nIt is very important that any programmer be able to look at another's code and\nquickly understand it. Maintaining a uniform style and following conventions\nmeans that we can more easily use \"pattern-matching\" to infer what various\nsymbols are and what invariants are true about them. Creating common, required\nidioms and patterns makes code much easier to understand. In some cases there\nmight be good arguments for changing certain style rules, but we nonetheless\nkeep things as they are in order to preserve consistency.\n```\n\n## Buildbot Verification\n\nThe buildbot runs `xb lint --all` on the master branch, and will run\n`xb lint --origin` on pull requests. Run `xb format` before you commit each\nlocal change so that you are consistently clean, otherwise you may have to\nrebase. If you forget, run `xb format --origin` and rebase your changes (so you\ndon't end up with 5 changes and then a 6th 'whoops' one — that's nasty).\n\nThe buildbot is running LLVM 3.8.0. If you are noticing style differences\nbetween your local lint/format and the buildbot, ensure you are running that\nversion.\n\n## Tools\n\n### clang-format\n\nclang-format with the Google style is used to format all files. I recommend\ninstalling/wiring it up to your editor of choice so that you don't even have to\nthink about tabs and wrapping and such.\n\n#### Command Line\n\nTo use the `xb format` auto-formatter, you need to have a `clang-format` on your\nPATH. If you're on Windows you can do this by installing an LLVM binary package\nfrom [the LLVM downloads page](https://llvm.org/releases/download.html). If you\ninstall it to the default location the `xb format` command will find it\nautomatically even if you don't choose to put all of LLVM onto your PATH.\n\n#### Visual Studio\n\nGrab the official [experimental Visual Studio plugin](https://llvm.org/builds/).\nTo switch to the Google style go Tools -> Options -> LLVM/Clang -> ClangFormat\nand set Style to Google. Then use ctrl-r/ctrl-f to trigger the formatting.\nUnfortunately it only does the cursor by default, so you'll have to select the\nwhole doc and invoke it to get it all done.\n\nIf you have a better option, let me know!\n\n#### Xcode\n\nInstall [Alcatraz](https://github.com/alcatraz/Alcatraz) to get the [ClangFormat](https://github.com/travisjeffery/ClangFormat-Xcode)\npackage. Set it to use the Google style and format on save. Never think about\ntabs or linefeeds or whatever again.\n\n### cpplint\n\nTODO(benvanik): write a cool script to do this/editor plugins.\nIn the future, the linter will run as a git commit hook and on travis.\n\n# Android Style Guide\n\nAndroid Java and Groovy code and XML files currently don't have automatic format\nverification during builds, however, stick to the [AOSP Java Code Style Rules](https://source.android.com/setup/contribute/code-style),\nwhich contain guidelines not only for code formatting, but for the usage of\nlanguage features as well.\n\nThe formatting rules used in Xenia match the default Android Studio settings.\nThey diverge from the C++ code style rules of Xenia in many areas, such as\nindentation width and the maximum line length, however, the goal for Android\nformatting in Xenia is to ensure quick development environment setup.\n\nIn Java code, limit the length of each line to 100 characters. If an assignment\ndoesn't fit in the limit, move the right-hand side of it to a separate line with\n8-space indentation. Similarly, if the argument list of a method declaration or\na call is too long, start the entire argument list on a new line, also indented\nwith 8 spaces — this is one of the differences from the C++ code style in Xenia,\nwhere arguments may be aligned with the opening bracket. In general, follow the\n[rectangle rule](https://github.com/google/google-java-format/wiki/The-Rectangle-Rule)\nso expressions in the code constitute a hierarchy of their bounding rectangles,\nensuring that with 4-space indentation for block contents and 8-space\nindentation for subexpressions.\n\nIn XML files, if the width of the line with an element exceeds 100 characters,\nor in most cases when there are multiple attributes, each attribute should be\nplaced on a separate line with 4-space indentation, with the exception of the\nfirst `xmlns`, which should stay on the same line as the element name.\n\nIn Groovy, use 4-space indentation for blocks and 8-space indentation for\nsplitting arguments into multiple lines. String literals should be written in\nsingle quotes unless string interpolation is used.\n\nYou can use the Code -> Reformat Code and Code -> Reformat File options in\nAndroid Studio to apply coarse formatting rules for different kinds of files\nsupported by Android Studio, such as Java, XML and Groovy. While clang-format is\nvery strict and generates code with the single allowed way of formatting,\nAndroid Studio, however, preserves many style choices in the original code, so\nit's recommended to approximate the final style manually instead of relying\nentirely on automatic formatting. Also use Code -> Rearrange Code to maintain a\nconsistent structure of Java class declarations.\n"
  },
  {
    "path": "premake5.lua",
    "content": "include(\"tools/build\")\nrequire(\"third_party/premake-export-compile-commands/export-compile-commands\")\nrequire(\"third_party/premake-androidndk/androidndk\")\nrequire(\"third_party/premake-cmake/cmake\")\n\nlocation(build_root)\ntargetdir(build_bin)\nobjdir(build_obj)\n\n-- Define an ARCH variable\n-- Only use this to enable architecture-specific functionality.\nif os.istarget(\"linux\") then\n  ARCH = os.outputof(\"uname -p\")\nelse\n  ARCH = \"unknown\"\nend\n\nincludedirs({\n  \".\",\n  \"src\",\n  \"third_party\",\n})\n\ndefines({\n  \"_UNICODE\",\n  \"UNICODE\",\n})\n\ncppdialect(\"C++17\")\nexceptionhandling(\"On\")\nrtti(\"On\")\nsymbols(\"On\")\n\n-- TODO(DrChat): Find a way to disable this on other architectures.\nif ARCH ~= \"ppc64\" then\n  filter(\"architecture:x86_64\")\n    vectorextensions(\"AVX\")\n  filter({})\nend\n\ncharacterset(\"Unicode\")\nflags({\n  \"FatalWarnings\",        -- Treat warnings as errors.\n})\n\nfilter(\"kind:StaticLib\")\n  defines({\n    \"_LIB\",\n  })\n\nfilter(\"configurations:Checked\")\n  runtime(\"Debug\")\n  optimize(\"Off\")\n  defines({\n    \"DEBUG\",\n  })\nfilter({\"configurations:Checked\", \"platforms:Windows\"})\n  buildoptions({\n    \"/RTCsu\",           -- Full Run-Time Checks.\n  })\nfilter({\"configurations:Checked\", \"platforms:Linux\"})\n  defines({\n    \"_GLIBCXX_DEBUG\",   -- libstdc++ debug mode\n  })\n\nfilter(\"configurations:Debug\")\n  runtime(\"Release\")\n  optimize(\"Off\")\n  defines({\n    \"DEBUG\",\n    \"_NO_DEBUG_HEAP=1\",\n  })\nfilter({\"configurations:Debug\", \"platforms:Linux\"})\n  defines({\n    \"_GLIBCXX_DEBUG\",   -- make dbg symbols work on some distros\n  })\n\nfilter(\"configurations:Release\")\n  runtime(\"Release\")\n  defines({\n    \"NDEBUG\",\n    \"_NO_DEBUG_HEAP=1\",\n  })\n  optimize(\"Speed\")\n  inlining(\"Auto\")\n  flags({\n    \"LinkTimeOptimization\",\n  })\n  -- Not using floatingpoint(\"Fast\") - NaN checks are used in some places\n  -- (though rarely), overall preferable to avoid any functional differences\n  -- between debug and release builds, and to have calculations involved in GPU\n  -- (especially anything that may affect vertex position invariance) and CPU\n  -- (such as constant propagation) emulation as predictable as possible,\n  -- including handling of specials since games make assumptions about them.\nfilter(\"platforms:Linux\")\n  system(\"linux\")\n  toolset(\"clang\")\n  buildoptions({\n    -- \"-mlzcnt\",  -- (don't) Assume lzcnt is supported.\n  })\n  pkg_config.all(\"gtk+-x11-3.0\")\n  links({\n    \"stdc++fs\",\n    \"dl\",\n    \"lz4\",\n    \"pthread\",\n    \"rt\",\n  })\n\nfilter({\"platforms:Linux\", \"kind:*App\"})\n  linkgroups(\"On\")\n\nfilter({\"platforms:Linux\", \"language:C++\", \"toolset:gcc\"})\n  disablewarnings({\n    \"unused-result\"\n  })\n\nfilter({\"platforms:Linux\", \"toolset:gcc\"})\n  if ARCH == \"ppc64\" then\n    buildoptions({\n      \"-m32\",\n      \"-mpowerpc64\"\n    })\n    linkoptions({\n      \"-m32\",\n      \"-mpowerpc64\"\n    })\n  end\n\nfilter({\"platforms:Linux\", \"language:C++\", \"toolset:clang\"})\n  disablewarnings({\n    \"deprecated-register\"\n  })\nfilter({\"platforms:Linux\", \"language:C++\", \"toolset:clang\", \"files:*.cc or *.cpp\"})\n  buildoptions({\n    \"-stdlib=libstdc++\",\n  })\n\nfilter(\"platforms:Android-*\")\n  system(\"android\")\n  systemversion(\"24\")\n  cppstl(\"c++\")\n  staticruntime(\"On\")\n  -- Hidden visibility is needed to prevent dynamic relocations in FFmpeg\n  -- AArch64 Neon libavcodec assembly with PIC (accesses extern lookup tables\n  -- using `adrp` and `add`, without the Global Object Table, expecting that all\n  -- FFmpeg symbols that aren't a part of the FFmpeg API are hidden by FFmpeg's\n  -- original build system) by resolving those relocations at link time instead.\n  visibility(\"Hidden\")\n  links({\n    \"android\",\n    \"dl\",\n    \"log\",\n  })\n\nfilter(\"platforms:Windows\")\n  system(\"windows\")\n  toolset(\"msc\")\n  buildoptions({\n    \"/utf-8\",   -- 'build correctly on systems with non-Latin codepages'.\n    -- Mark warnings as severe\n    \"/w14839\",  -- non-standard use of class 'type' as an argument to a variadic function\n    \"/w14840\",  -- non-portable use of class 'type' as an argument to a variadic function\n    -- Disable warnings\n    \"/wd4100\",  -- Unreferenced parameters are ok.\n    \"/wd4201\",  -- Nameless struct/unions are ok.\n    \"/wd4512\",  -- 'assignment operator was implicitly defined as deleted'.\n    \"/wd4127\",  -- 'conditional expression is constant'.\n    \"/wd4324\",  -- 'structure was padded due to alignment specifier'.\n    \"/wd4189\",  -- 'local variable is initialized but not referenced'.\n  })\n  flags({\n    \"MultiProcessorCompile\",  -- Multiprocessor compilation.\n    \"NoMinimalRebuild\",       -- Required for /MP above.\n  })\n\n  defines({\n    \"_CRT_NONSTDC_NO_DEPRECATE\",\n    \"_CRT_SECURE_NO_WARNINGS\",\n    \"WIN32\",\n    \"_WIN64=1\",\n    \"_AMD64=1\",\n  })\n  linkoptions({\n    \"/ignore:4006\",  -- Ignores complaints about empty obj files.\n    \"/ignore:4221\",\n  })\n  links({\n    \"ntdll\",\n    \"wsock32\",\n    \"ws2_32\",\n    \"xinput\",\n    \"comctl32\",\n    \"shcore\",\n    \"shlwapi\",\n    \"dxguid\",\n    \"bcrypt\",\n  })\n\n-- Embed the manifest for things like dependencies and DPI awareness.\nfilter({\"platforms:Windows\", \"kind:ConsoleApp or WindowedApp\"})\n  files({\n    \"src/xenia/base/app_win32.manifest\"\n  })\n\n-- Create scratch/ path\nif not os.isdir(\"scratch\") then\n  os.mkdir(\"scratch\")\nend\n\nworkspace(\"xenia\")\n  uuid(\"931ef4b0-6170-4f7a-aaf2-0fece7632747\")\n  startproject(\"xenia-app\")\n  if os.istarget(\"android\") then\n    platforms({\"Android-ARM64\", \"Android-x86_64\"})\n    filter(\"platforms:Android-ARM64\")\n      architecture(\"ARM64\")\n    filter(\"platforms:Android-x86_64\")\n      architecture(\"x86_64\")\n    filter({})\n  else\n    architecture(\"x86_64\")\n    if os.istarget(\"linux\") then\n      platforms({\"Linux\"})\n    elseif os.istarget(\"macosx\") then\n      platforms({\"Mac\"})\n      xcodebuildsettings({           \n        [\"ARCHS\"] = \"x86_64\"\n      })\n    elseif os.istarget(\"windows\") then\n      platforms({\"Windows\"})\n      -- 10.0.15063.0: ID3D12GraphicsCommandList1::SetSamplePositions.\n      -- 10.0.19041.0: D3D12_HEAP_FLAG_CREATE_NOT_ZEROED.\n      -- 10.0.22000.0: DWMWA_WINDOW_CORNER_PREFERENCE.\n      filter(\"action:vs2017\")\n        systemversion(\"10.0.22000.0\")\n      filter(\"action:vs2019\")\n        systemversion(\"10.0\")\n      filter({})\n    end\n  end\n  configurations({\"Checked\", \"Debug\", \"Release\"})\n\n  include(\"third_party/aes_128.lua\")\n  include(\"third_party/capstone.lua\")\n  include(\"third_party/dxbc.lua\")\n  include(\"third_party/discord-rpc.lua\")\n  include(\"third_party/cxxopts.lua\")\n  include(\"third_party/cpptoml.lua\")\n  include(\"third_party/FFmpeg/premake5.lua\")\n  include(\"third_party/fmt.lua\")\n  include(\"third_party/glslang-spirv.lua\")\n  include(\"third_party/imgui.lua\")\n  include(\"third_party/mspack.lua\")\n  include(\"third_party/snappy.lua\")\n  include(\"third_party/xxhash.lua\")\n\n  if not os.istarget(\"android\") then\n    -- SDL2 requires sdl2-config, and as of November 2020 isn't high-quality on\n    -- Android yet, most importantly in game controllers - the keycode and axis\n    -- enums are being ruined during conversion to SDL2 enums resulting in only\n    -- one controller (Nvidia Shield) being supported, digital triggers are also\n    -- not supported; lifecycle management (especially surface loss) is also\n    -- complicated.\n    include(\"third_party/SDL2.lua\")\n  end\n\n  -- Disable treating warnings as fatal errors for all third party projects, as\n  -- well as other things relevant only to Xenia itself.\n  for _, prj in ipairs(premake.api.scope.current.solution.projects) do\n    project(prj.name)\n    removefiles({\n      \"src/xenia/base/app_win32.manifest\"\n    })\n    removeflags({\n      \"FatalWarnings\",\n    })\n  end\n\n  include(\"src/xenia\")\n  include(\"src/xenia/app\")\n  include(\"src/xenia/app/discord\")\n  include(\"src/xenia/apu\")\n  include(\"src/xenia/apu/nop\")\n  include(\"src/xenia/base\")\n  include(\"src/xenia/cpu\")\n  include(\"src/xenia/cpu/backend/x64\")\n  include(\"src/xenia/debug/ui\")\n  include(\"src/xenia/gpu\")\n  include(\"src/xenia/gpu/null\")\n  include(\"src/xenia/gpu/vulkan\")\n  include(\"src/xenia/hid\")\n  include(\"src/xenia/hid/nop\")\n  include(\"src/xenia/kernel\")\n  include(\"src/xenia/ui\")\n  include(\"src/xenia/ui/vulkan\")\n  include(\"src/xenia/vfs\")\n\n  if not os.istarget(\"android\") then\n    include(\"src/xenia/apu/sdl\")\n    include(\"src/xenia/helper/sdl\")\n    include(\"src/xenia/hid/sdl\")\n  end\n\n  if os.istarget(\"windows\") then\n    include(\"src/xenia/apu/xaudio2\")\n    include(\"src/xenia/gpu/d3d12\")\n    include(\"src/xenia/hid/winkey\")\n    include(\"src/xenia/hid/xinput\")\n    include(\"src/xenia/ui/d3d12\")\n  end\n"
  },
  {
    "path": "src/xenia/app/discord/discord_presence.cc",
    "content": "/**\n******************************************************************************\n* Xenia : Xbox 360 Emulator Research Project                                 *\n******************************************************************************\n* Copyright 2020 Ben Vanik. All rights reserved.                             *\n* Released under the BSD license - see LICENSE in the root for more details. *\n******************************************************************************\n*/\n\n#include \"discord_presence.h\"\n#include \"third_party/discord-rpc/include/discord_rpc.h\"\n#include \"xenia/base/string.h\"\n\nnamespace xe {\nnamespace discord {\n\nvoid HandleDiscordReady(const DiscordUser* request) {}\nvoid HandleDiscordError(int errorCode, const char* message) {}\nvoid HandleDiscordJoinGame(const char* joinSecret) {}\nvoid HandleDiscordJoinRequest(const DiscordUser* request) {}\nvoid HandleDiscordSpectateGame(const char* spectateSecret) {}\n\nvoid DiscordPresence::Initialize() {\n  DiscordEventHandlers handlers = {};\n  handlers.ready = &HandleDiscordReady;\n  handlers.errored = &HandleDiscordError;\n  handlers.joinGame = &HandleDiscordJoinGame;\n  handlers.joinRequest = &HandleDiscordJoinRequest;\n  handlers.spectateGame = &HandleDiscordSpectateGame;\n  Discord_Initialize(\"606840046649081857\", &handlers, 0, \"\");\n}\n\nvoid DiscordPresence::NotPlaying() {\n  DiscordRichPresence discordPresence = {};\n  discordPresence.state = \"Idle\";\n  discordPresence.details = \"Standby\";\n  discordPresence.largeImageKey = \"app\";\n  discordPresence.instance = 1;\n  Discord_UpdatePresence(&discordPresence);\n}\n\nvoid DiscordPresence::PlayingTitle(const std::string_view game_title) {\n  auto details = std::string(game_title);\n  DiscordRichPresence discordPresence = {};\n  discordPresence.state = \"In Game\";\n  discordPresence.details = details.c_str();\n  // TODO(gibbed): we don't have state icons yet.\n  // discordPresence.smallImageKey = \"app\";\n  // discordPresence.largeImageKey = \"state_ingame\";\n  discordPresence.largeImageKey = \"app\";\n  discordPresence.instance = 1;\n  Discord_UpdatePresence(&discordPresence);\n}\n\nvoid DiscordPresence::Shutdown() { Discord_Shutdown(); }\n\n}  // namespace discord\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/app/discord/discord_presence.h",
    "content": "/**\n******************************************************************************\n* Xenia : Xbox 360 Emulator Research Project                                 *\n******************************************************************************\n* Copyright 2020 Ben Vanik. All rights reserved.                             *\n* Released under the BSD license - see LICENSE in the root for more details. *\n******************************************************************************\n*/\n\n#ifndef XENIA_DISCORD_DISCORD_PRESENCE_H_\n#define XENIA_DISCORD_DISCORD_PRESENCE_H_\n\n#include <string>\n\nnamespace xe {\nnamespace discord {\n\nclass DiscordPresence {\n public:\n  static void Initialize();\n  static void NotPlaying();\n  static void PlayingTitle(const std::string_view game_title);\n  static void Shutdown();\n};\n\n}  // namespace discord\n}  // namespace xe\n\n#endif  // XENIA_DISCORD_DISCORD_PRESENCE_H_\n"
  },
  {
    "path": "src/xenia/app/discord/premake5.lua",
    "content": "project_root = \"../../../..\"\ninclude(project_root..\"/tools/build\")\n\ngroup(\"src\")\nproject(\"xenia-app-discord\")\n  uuid(\"d14c0885-22d2-40de-ab28-7b234ef2b949\")\n  kind(\"StaticLib\")\n  language(\"C++\")\n  links({\n    \"discord-rpc\"\n  })\n  defines({\n  })\n  includedirs({\n    project_root..\"/third_party/discord-rpc/src\"\n  })\n  files({\n    \"discord_presence.cc\",\n    \"discord_presence.h\"\n  })\n"
  },
  {
    "path": "src/xenia/app/emulator_window.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/app/emulator_window.h\"\n\n#include <filesystem>\n#include <functional>\n#include <memory>\n#include <mutex>\n#include <string>\n#include <utility>\n\n#include \"third_party/fmt/include/fmt/format.h\"\n#include \"third_party/imgui/imgui.h\"\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/clock.h\"\n#include \"xenia/base/cvar.h\"\n#include \"xenia/base/debugging.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/platform.h\"\n#include \"xenia/base/profiling.h\"\n#include \"xenia/base/system.h\"\n#include \"xenia/base/threading.h\"\n#include \"xenia/cpu/processor.h\"\n#include \"xenia/emulator.h\"\n#include \"xenia/gpu/command_processor.h\"\n#include \"xenia/gpu/graphics_system.h\"\n#include \"xenia/ui/file_picker.h\"\n#include \"xenia/ui/graphics_provider.h\"\n#include \"xenia/ui/imgui_dialog.h\"\n#include \"xenia/ui/imgui_drawer.h\"\n#include \"xenia/ui/immediate_drawer.h\"\n#include \"xenia/ui/presenter.h\"\n#include \"xenia/ui/ui_event.h\"\n#include \"xenia/ui/virtual_key.h\"\n\n// Autogenerated by `xb premake`.\n#include \"build/version.h\"\n\nDECLARE_bool(debug);\n\nDEFINE_bool(fullscreen, false, \"Whether to launch the emulator in fullscreen.\",\n            \"Display\");\n\nDEFINE_string(\n    postprocess_antialiasing, \"\",\n    \"Post-processing anti-aliasing effect to apply to the image output of the \"\n    \"game.\\n\"\n    \"Using post-process anti-aliasing is heavily recommended when AMD \"\n    \"FidelityFX Contrast Adaptive Sharpening or Super Resolution 1.0 is \"\n    \"active.\\n\"\n    \"Use: [none, fxaa, fxaa_extreme]\\n\"\n    \" none (or any value not listed here):\\n\"\n    \"  Don't alter the original image.\\n\"\n    \" fxaa:\\n\"\n    \"  NVIDIA Fast Approximate Anti-Aliasing 3.11, normal quality preset (12).\"\n    \"\\n\"\n    \" fxaa_extreme:\\n\"\n    \"  NVIDIA Fast Approximate Anti-Aliasing 3.11, extreme quality preset \"\n    \"(39).\",\n    \"Display\");\nDEFINE_string(\n    postprocess_scaling_and_sharpening, \"\",\n    \"Post-processing effect to use for resampling and/or sharpening of the \"\n    \"final display output.\\n\"\n    \"Use: [bilinear, cas, fsr]\\n\"\n    \" bilinear (or any value not listed here):\\n\"\n    \"  Original image at 1:1, simple bilinear stretching for resampling.\\n\"\n    \" cas:\\n\"\n    \"  Use AMD FidelityFX Contrast Adaptive Sharpening (CAS) for sharpening \"\n    \"at scaling factors of up to 2x2, with additional bilinear stretching for \"\n    \"larger factors.\\n\"\n    \" fsr:\\n\"\n    \"  Use AMD FidelityFX Super Resolution 1.0 (FSR) for highest-quality \"\n    \"upscaling, or AMD FidelityFX Contrast Adaptive Sharpening for sharpening \"\n    \"while not scaling or downsampling.\\n\"\n    \"  For scaling by factors of more than 2x2, multiple FSR passes are done.\",\n    \"Display\");\nDEFINE_double(\n    postprocess_ffx_cas_additional_sharpness,\n    xe::ui::Presenter::GuestOutputPaintConfig::kCasAdditionalSharpnessDefault,\n    \"Additional sharpness for AMD FidelityFX Contrast Adaptive Sharpening \"\n    \"(CAS), from 0 to 1.\\n\"\n    \"Higher is sharper.\",\n    \"Display\");\nDEFINE_uint32(\n    postprocess_ffx_fsr_max_upsampling_passes,\n    xe::ui::Presenter::GuestOutputPaintConfig::kFsrMaxUpscalingPassesMax,\n    \"Maximum number of upsampling passes performed in AMD FidelityFX Super \"\n    \"Resolution 1.0 (FSR) before falling back to bilinear stretching after the \"\n    \"final pass.\\n\"\n    \"Each pass upscales only to up to 2x2 the previous size. If the game \"\n    \"outputs a 1280x720 image, 1 pass will upscale it to up to 2560x1440 \"\n    \"(below 4K), after 2 passes it will be upscaled to a maximum of 5120x2880 \"\n    \"(including 3840x2160 for 4K), and so on.\\n\"\n    \"This variable has no effect if the display resolution isn't very high, \"\n    \"but may be reduced on resolutions like 4K or 8K in case the performance \"\n    \"impact of multiple FSR upsampling passes is too high, or if softer edges \"\n    \"are desired.\\n\"\n    \"The default value is the maximum internally supported by Xenia.\",\n    \"Display\");\nDEFINE_double(\n    postprocess_ffx_fsr_sharpness_reduction,\n    xe::ui::Presenter::GuestOutputPaintConfig::kFsrSharpnessReductionDefault,\n    \"Sharpness reduction for AMD FidelityFX Super Resolution 1.0 (FSR), in \"\n    \"stops.\\n\"\n    \"Lower is sharper.\",\n    \"Display\");\n// Dithering to 8bpc is enabled by default since the effect is minor, only\n// effects what can't be shown normally by host displays, and nothing is changed\n// by it for 8bpc source without resampling.\nDEFINE_bool(\n    postprocess_dither, true,\n    \"Dither the final image output from the internal precision to 8 bits per \"\n    \"channel so gradients are smoother.\\n\"\n    \"On a 10bpc display, the lower 2 bits will still be kept, but noise will \"\n    \"be added to them - disabling may be recommended for 10bpc, but it \"\n    \"depends on the 10bpc displaying capabilities of the actual display used.\",\n    \"Display\");\n\nnamespace xe {\nnamespace app {\n\nusing xe::ui::FileDropEvent;\nusing xe::ui::KeyEvent;\nusing xe::ui::MenuItem;\nusing xe::ui::UIEvent;\n\nconst std::string kBaseTitle = \"Xenia\";\n\nEmulatorWindow::EmulatorWindow(Emulator* emulator,\n                               ui::WindowedAppContext& app_context)\n    : emulator_(emulator),\n      app_context_(app_context),\n      window_listener_(*this),\n      window_(ui::Window::Create(app_context, kBaseTitle, 1280, 720)),\n      imgui_drawer_(\n          std::make_unique<ui::ImGuiDrawer>(window_.get(), kZOrderImGui)),\n      display_config_game_config_load_callback_(\n          new DisplayConfigGameConfigLoadCallback(*emulator, *this)) {\n  base_title_ = kBaseTitle +\n#ifdef DEBUG\n#if _NO_DEBUG_HEAP == 1\n                \" DEBUG\"\n#else\n                \" CHECKED\"\n#endif\n#endif\n                \" (\"\n#ifdef XE_BUILD_IS_PR\n                \"PR#\" XE_BUILD_PR_NUMBER \" \" XE_BUILD_PR_REPO\n                \" \" XE_BUILD_PR_BRANCH \"@\" XE_BUILD_PR_COMMIT_SHORT \" against \"\n#endif\n                XE_BUILD_BRANCH \"@\" XE_BUILD_COMMIT_SHORT \" on \" XE_BUILD_DATE\n                \")\";\n}\n\nstd::unique_ptr<EmulatorWindow> EmulatorWindow::Create(\n    Emulator* emulator, ui::WindowedAppContext& app_context) {\n  assert_true(app_context.IsInUIThread());\n  std::unique_ptr<EmulatorWindow> emulator_window(\n      new EmulatorWindow(emulator, app_context));\n  if (!emulator_window->Initialize()) {\n    return nullptr;\n  }\n  return emulator_window;\n}\n\nEmulatorWindow::~EmulatorWindow() {\n  // Notify the ImGui drawer that the immediate drawer is being destroyed.\n  ShutdownGraphicsSystemPresenterPainting();\n}\n\nui::Presenter* EmulatorWindow::GetGraphicsSystemPresenter() const {\n  gpu::GraphicsSystem* graphics_system = emulator_->graphics_system();\n  return graphics_system ? graphics_system->presenter() : nullptr;\n}\n\nvoid EmulatorWindow::SetupGraphicsSystemPresenterPainting() {\n  ShutdownGraphicsSystemPresenterPainting();\n\n  if (!window_) {\n    return;\n  }\n\n  ui::Presenter* presenter = GetGraphicsSystemPresenter();\n  if (!presenter) {\n    return;\n  }\n\n  ApplyDisplayConfigForCvars();\n\n  window_->SetPresenter(presenter);\n\n  immediate_drawer_ =\n      emulator_->graphics_system()->provider()->CreateImmediateDrawer();\n  if (immediate_drawer_) {\n    immediate_drawer_->SetPresenter(presenter);\n    imgui_drawer_->SetPresenterAndImmediateDrawer(presenter,\n                                                  immediate_drawer_.get());\n    Profiler::SetUserIO(kZOrderProfiler, window_.get(), presenter,\n                        immediate_drawer_.get());\n  }\n}\n\nvoid EmulatorWindow::ShutdownGraphicsSystemPresenterPainting() {\n  Profiler::SetUserIO(kZOrderProfiler, window_.get(), nullptr, nullptr);\n  imgui_drawer_->SetPresenterAndImmediateDrawer(nullptr, nullptr);\n  immediate_drawer_.reset();\n  if (window_) {\n    window_->SetPresenter(nullptr);\n  }\n}\n\nvoid EmulatorWindow::OnEmulatorInitialized() {\n  emulator_initialized_ = true;\n  window_->SetMainMenuEnabled(true);\n  // When the user can see that the emulator isn't initializing anymore (the\n  // menu isn't disabled), enter fullscreen if requested.\n  if (cvars::fullscreen) {\n    SetFullscreen(true);\n  }\n}\n\nvoid EmulatorWindow::EmulatorWindowListener::OnClosing(ui::UIEvent& e) {\n  emulator_window_.app_context_.QuitFromUIThread();\n}\n\nvoid EmulatorWindow::EmulatorWindowListener::OnFileDrop(ui::FileDropEvent& e) {\n  emulator_window_.FileDrop(e.filename());\n}\n\nvoid EmulatorWindow::EmulatorWindowListener::OnKeyDown(ui::KeyEvent& e) {\n  emulator_window_.OnKeyDown(e);\n}\n\nvoid EmulatorWindow::DisplayConfigGameConfigLoadCallback::PostGameConfigLoad() {\n  emulator_window_.ApplyDisplayConfigForCvars();\n}\n\nvoid EmulatorWindow::DisplayConfigDialog::OnDraw(ImGuiIO& io) {\n  gpu::GraphicsSystem* graphics_system =\n      emulator_window_.emulator_->graphics_system();\n  if (!graphics_system) {\n    return;\n  }\n\n  // In the top-left corner so it's close to the menu bar from where it was\n  // opened.\n  // Origin Y coordinate 20 was taken from the Dear ImGui demo.\n  ImGui::SetNextWindowPos(ImVec2(20, 20), ImGuiCond_FirstUseEver);\n  ImGui::SetNextWindowSize(ImVec2(20, 20), ImGuiCond_FirstUseEver);\n  // Alpha from Dear ImGui tooltips (0.35 from the overlay provides too low\n  // visibility). Translucent so some effect of the changes can still be seen\n  // through it.\n  ImGui::SetNextWindowBgAlpha(0.6f);\n  bool dialog_open = true;\n  if (!ImGui::Begin(\"Post-processing\", &dialog_open,\n                    ImGuiWindowFlags_NoCollapse |\n                        ImGuiWindowFlags_AlwaysAutoResize |\n                        ImGuiWindowFlags_HorizontalScrollbar)) {\n    ImGui::End();\n    return;\n  }\n  // Even if the close button has been pressed, still paint everything not to\n  // have one frame with an empty window.\n\n  // Prevent user confusion which has been reported multiple times.\n  ImGui::TextUnformatted(\"All effects can be used on GPUs of any brand.\");\n  ImGui::Spacing();\n\n  gpu::CommandProcessor* command_processor =\n      graphics_system->command_processor();\n  if (command_processor) {\n    if (ImGui::TreeNodeEx(\n            \"Anti-aliasing\",\n            ImGuiTreeNodeFlags_Framed | ImGuiTreeNodeFlags_DefaultOpen)) {\n      gpu::CommandProcessor::SwapPostEffect current_swap_post_effect =\n          command_processor->GetDesiredSwapPostEffect();\n      int new_swap_post_effect_index = int(current_swap_post_effect);\n      ImGui::RadioButton(\"None\", &new_swap_post_effect_index,\n                         int(gpu::CommandProcessor::SwapPostEffect::kNone));\n      ImGui::RadioButton(\n          \"NVIDIA Fast Approximate Anti-Aliasing 3.11 (FXAA), normal quality\",\n          &new_swap_post_effect_index,\n          int(gpu::CommandProcessor::SwapPostEffect::kFxaa));\n      ImGui::RadioButton(\n          \"NVIDIA Fast Approximate Anti-Aliasing 3.11 (FXAA), extreme quality\",\n          &new_swap_post_effect_index,\n          int(gpu::CommandProcessor::SwapPostEffect::kFxaaExtreme));\n      gpu::CommandProcessor::SwapPostEffect new_swap_post_effect =\n          gpu::CommandProcessor::SwapPostEffect(new_swap_post_effect_index);\n      if (current_swap_post_effect != new_swap_post_effect) {\n        command_processor->SetDesiredSwapPostEffect(new_swap_post_effect);\n      }\n\n      // Override the values in the cvars to save them to the config at exit if\n      // the user has set them to anything new.\n      if (GetSwapPostEffectForCvarValue(cvars::postprocess_antialiasing) !=\n          new_swap_post_effect) {\n        OVERRIDE_string(postprocess_antialiasing,\n                        GetCvarValueForSwapPostEffect(new_swap_post_effect));\n      }\n\n      ImGui::TreePop();\n    }\n  }\n\n  ui::Presenter* presenter = graphics_system->presenter();\n  if (presenter) {\n    const ui::Presenter::GuestOutputPaintConfig& current_presenter_config =\n        presenter->GetGuestOutputPaintConfigFromUIThread();\n    ui::Presenter::GuestOutputPaintConfig new_presenter_config =\n        current_presenter_config;\n\n    if (ImGui::TreeNodeEx(\n            \"Resampling and sharpening\",\n            ImGuiTreeNodeFlags_Framed | ImGuiTreeNodeFlags_DefaultOpen)) {\n      // Filtering effect.\n      int new_effect_index = int(new_presenter_config.GetEffect());\n      ImGui::RadioButton(\n          \"None / bilinear\", &new_effect_index,\n          int(ui::Presenter::GuestOutputPaintConfig::Effect::kBilinear));\n      ImGui::RadioButton(\n          \"AMD FidelityFX Contrast Adaptive Sharpening (CAS)\",\n          &new_effect_index,\n          int(ui::Presenter::GuestOutputPaintConfig::Effect::kCas));\n      ImGui::RadioButton(\n          \"AMD FidelityFX Super Resolution 1.0 (FSR)\", &new_effect_index,\n          int(ui::Presenter::GuestOutputPaintConfig::Effect::kFsr));\n      new_presenter_config.SetEffect(\n          ui::Presenter::GuestOutputPaintConfig::Effect(new_effect_index));\n\n      // effect_description must be one complete, but short enough, sentence per\n      // line, as TextWrapped doesn't work correctly in auto-resizing windows\n      // (in the initial frames, the window becomes extremely tall, and widgets\n      // added after the wrapped text have no effect on the width of the text).\n      const char* effect_description = nullptr;\n      switch (new_presenter_config.GetEffect()) {\n        case ui::Presenter::GuestOutputPaintConfig::Effect::kBilinear:\n          effect_description =\n              \"Simple bilinear filtering is done if resampling is needed.\\n\"\n              \"Otherwise, only anti-aliasing is done if enabled, or displaying \"\n              \"as is.\";\n          break;\n        case ui::Presenter::GuestOutputPaintConfig::Effect::kCas:\n          effect_description =\n              \"Sharpening and resampling to up to 2x2 to improve the fidelity \"\n              \"of details.\\n\"\n              \"For scaling by more than 2x2, bilinear stretching is done \"\n              \"afterwards.\";\n          break;\n        case ui::Presenter::GuestOutputPaintConfig::Effect::kFsr:\n          effect_description =\n              \"High-quality edge-preserving upscaling to arbitrary target \"\n              \"resolutions.\\n\"\n              \"For scaling by more than 2x2, multiple upsampling passes are \"\n              \"done.\\n\"\n              \"If not upscaling, Contrast Adaptive Sharpening (CAS) is used \"\n              \"instead.\";\n          break;\n      }\n      if (effect_description) {\n        ImGui::TextUnformatted(effect_description);\n      }\n\n      if (new_presenter_config.GetEffect() ==\n              ui::Presenter::GuestOutputPaintConfig::Effect::kCas ||\n          new_presenter_config.GetEffect() ==\n              ui::Presenter::GuestOutputPaintConfig::Effect::kFsr) {\n        if (effect_description) {\n          ImGui::Spacing();\n        }\n\n        ImGui::TextUnformatted(\n            \"FXAA is highly recommended when using CAS or FSR.\");\n\n        ImGui::Spacing();\n\n        // 2 decimal places is more or less enough precision for the sharpness\n        // given the minor visual effect of small changes, the width of the\n        // slider, and readability convenience (2 decimal places is like an\n        // integer percentage). However, because Dear ImGui parses the string\n        // representation of the number and snaps the value to it internally,\n        // 2 decimal places actually offer less precision than the slider itself\n        // does. This is especially prominent in the low range of the non-linear\n        // FSR sharpness reduction slider. 3 decimal places are optimal in this\n        // case.\n\n        if (new_presenter_config.GetEffect() ==\n            ui::Presenter::GuestOutputPaintConfig::Effect::kFsr) {\n          float fsr_sharpness_reduction =\n              new_presenter_config.GetFsrSharpnessReduction();\n          ImGui::TextUnformatted(\n              \"FSR sharpness reduction when upscaling (lower is sharper):\");\n          const auto label =\n              fmt::format(\"{:.3f} stops\", fsr_sharpness_reduction);\n          // Power 2.0 scaling as the reduction is in stops, used in exp2.\n          fsr_sharpness_reduction = sqrt(2.f * fsr_sharpness_reduction);\n          ImGui::SliderFloat(\n              \"##FSRSharpnessReduction\", &fsr_sharpness_reduction,\n              ui::Presenter::GuestOutputPaintConfig::kFsrSharpnessReductionMin,\n              ui::Presenter::GuestOutputPaintConfig::kFsrSharpnessReductionMax,\n              label.c_str(), ImGuiSliderFlags_NoInput);\n          fsr_sharpness_reduction =\n              .5f * fsr_sharpness_reduction * fsr_sharpness_reduction;\n          ImGui::SameLine();\n          if (ImGui::Button(\"Reset##ResetFSRSharpnessReduction\")) {\n            fsr_sharpness_reduction = ui::Presenter::GuestOutputPaintConfig ::\n                kFsrSharpnessReductionDefault;\n          }\n          new_presenter_config.SetFsrSharpnessReduction(\n              fsr_sharpness_reduction);\n        }\n\n        float cas_additional_sharpness =\n            new_presenter_config.GetCasAdditionalSharpness();\n        ImGui::TextUnformatted(\n            new_presenter_config.GetEffect() ==\n                    ui::Presenter::GuestOutputPaintConfig::Effect::kFsr\n                ? \"CAS additional sharpness when not upscaling (higher is \"\n                  \"sharper):\"\n                : \"CAS additional sharpness (higher is sharper):\");\n        ImGui::SliderFloat(\n            \"##CASAdditionalSharpness\", &cas_additional_sharpness,\n            ui::Presenter::GuestOutputPaintConfig::kCasAdditionalSharpnessMin,\n            ui::Presenter::GuestOutputPaintConfig::kCasAdditionalSharpnessMax,\n            \"%.3f\");\n        ImGui::SameLine();\n        if (ImGui::Button(\"Reset##ResetCASAdditionalSharpness\")) {\n          cas_additional_sharpness = ui::Presenter::GuestOutputPaintConfig ::\n              kCasAdditionalSharpnessDefault;\n        }\n        new_presenter_config.SetCasAdditionalSharpness(\n            cas_additional_sharpness);\n\n        // There's no need to expose the setting for the maximum number of FSR\n        // EASU passes as it's largely meaningless if the user doesn't have a\n        // very high-resolution monitor compared to the original image size as\n        // most of the values of the slider will have no effect, and that's just\n        // very fine-grained performance control for a fixed-overhead pass only\n        // for huge screen resolutions.\n      }\n\n      ImGui::TreePop();\n    }\n\n    if (ImGui::TreeNodeEx(\"Dithering\", ImGuiTreeNodeFlags_Framed |\n                                           ImGuiTreeNodeFlags_DefaultOpen)) {\n      bool dither = current_presenter_config.GetDither();\n      ImGui::Checkbox(\n          \"Dither the final output to 8bpc to make gradients smoother\",\n          &dither);\n      new_presenter_config.SetDither(dither);\n\n      ImGui::TreePop();\n    }\n\n    presenter->SetGuestOutputPaintConfigFromUIThread(new_presenter_config);\n\n    // Override the values in the cvars to save them to the config at exit if\n    // the user has set them to anything new.\n    ui::Presenter::GuestOutputPaintConfig cvars_presenter_config =\n        GetGuestOutputPaintConfigForCvars();\n    if (cvars_presenter_config.GetEffect() !=\n        new_presenter_config.GetEffect()) {\n      OVERRIDE_string(postprocess_scaling_and_sharpening,\n                      GetCvarValueForGuestOutputPaintEffect(\n                          new_presenter_config.GetEffect()));\n    }\n    if (cvars_presenter_config.GetCasAdditionalSharpness() !=\n        new_presenter_config.GetCasAdditionalSharpness()) {\n      OVERRIDE_double(postprocess_ffx_cas_additional_sharpness,\n                      new_presenter_config.GetCasAdditionalSharpness());\n    }\n    if (cvars_presenter_config.GetFsrSharpnessReduction() !=\n        new_presenter_config.GetFsrSharpnessReduction()) {\n      OVERRIDE_double(postprocess_ffx_fsr_sharpness_reduction,\n                      new_presenter_config.GetFsrSharpnessReduction());\n    }\n    if (cvars_presenter_config.GetDither() !=\n        new_presenter_config.GetDither()) {\n      OVERRIDE_bool(postprocess_dither, new_presenter_config.GetDither());\n    }\n  }\n\n  ImGui::End();\n\n  if (!dialog_open) {\n    emulator_window_.ToggleDisplayConfigDialog();\n    // `this` might have been destroyed by ToggleDisplayConfigDialog.\n    return;\n  }\n}\n\nbool EmulatorWindow::Initialize() {\n  window_->AddListener(&window_listener_);\n  window_->AddInputListener(&window_listener_, kZOrderEmulatorWindowInput);\n\n  // Main menu.\n  // FIXME: This code is really messy.\n  auto main_menu = MenuItem::Create(MenuItem::Type::kNormal);\n  auto file_menu = MenuItem::Create(MenuItem::Type::kPopup, \"&File\");\n  {\n    file_menu->AddChild(\n        MenuItem::Create(MenuItem::Type::kString, \"&Open...\", \"Ctrl+O\",\n                         std::bind(&EmulatorWindow::FileOpen, this)));\n#ifdef DEBUG\n    file_menu->AddChild(\n        MenuItem::Create(MenuItem::Type::kString, \"Close\",\n                         std::bind(&EmulatorWindow::FileClose, this)));\n#endif  // #ifdef DEBUG\n    file_menu->AddChild(MenuItem::Create(MenuItem::Type::kSeparator));\n    file_menu->AddChild(MenuItem::Create(\n        MenuItem::Type::kString, \"Show content directory...\",\n        std::bind(&EmulatorWindow::ShowContentDirectory, this)));\n    file_menu->AddChild(MenuItem::Create(MenuItem::Type::kSeparator));\n    file_menu->AddChild(\n        MenuItem::Create(MenuItem::Type::kString, \"E&xit\", \"Alt+F4\",\n                         [this]() { window_->RequestClose(); }));\n  }\n  main_menu->AddChild(std::move(file_menu));\n\n  // CPU menu.\n  auto cpu_menu = MenuItem::Create(MenuItem::Type::kPopup, \"&CPU\");\n  {\n    cpu_menu->AddChild(MenuItem::Create(\n        MenuItem::Type::kString, \"&Reset Time Scalar\", \"Numpad *\",\n        std::bind(&EmulatorWindow::CpuTimeScalarReset, this)));\n    cpu_menu->AddChild(MenuItem::Create(\n        MenuItem::Type::kString, \"Time Scalar /= 2\", \"Numpad -\",\n        std::bind(&EmulatorWindow::CpuTimeScalarSetHalf, this)));\n    cpu_menu->AddChild(MenuItem::Create(\n        MenuItem::Type::kString, \"Time Scalar *= 2\", \"Numpad +\",\n        std::bind(&EmulatorWindow::CpuTimeScalarSetDouble, this)));\n  }\n  cpu_menu->AddChild(MenuItem::Create(MenuItem::Type::kSeparator));\n  {\n    cpu_menu->AddChild(MenuItem::Create(MenuItem::Type::kString,\n                                        \"Toggle Profiler &Display\", \"F3\",\n                                        []() { Profiler::ToggleDisplay(); }));\n    cpu_menu->AddChild(MenuItem::Create(MenuItem::Type::kString,\n                                        \"&Pause/Resume Profiler\", \"`\",\n                                        []() { Profiler::TogglePause(); }));\n  }\n  cpu_menu->AddChild(MenuItem::Create(MenuItem::Type::kSeparator));\n  {\n    cpu_menu->AddChild(MenuItem::Create(\n        MenuItem::Type::kString, \"&Break and Show Guest Debugger\",\n        \"Pause/Break\", std::bind(&EmulatorWindow::CpuBreakIntoDebugger, this)));\n    cpu_menu->AddChild(MenuItem::Create(\n        MenuItem::Type::kString, \"&Break into Host Debugger\",\n        \"Ctrl+Pause/Break\",\n        std::bind(&EmulatorWindow::CpuBreakIntoHostDebugger, this)));\n  }\n  main_menu->AddChild(std::move(cpu_menu));\n\n  // GPU menu.\n  auto gpu_menu = MenuItem::Create(MenuItem::Type::kPopup, \"&GPU\");\n  {\n    gpu_menu->AddChild(\n        MenuItem::Create(MenuItem::Type::kString, \"&Trace Frame\", \"F4\",\n                         std::bind(&EmulatorWindow::GpuTraceFrame, this)));\n  }\n  gpu_menu->AddChild(MenuItem::Create(MenuItem::Type::kSeparator));\n  {\n    gpu_menu->AddChild(\n        MenuItem::Create(MenuItem::Type::kString, \"&Clear Runtime Caches\", \"F5\",\n                         std::bind(&EmulatorWindow::GpuClearCaches, this)));\n  }\n  main_menu->AddChild(std::move(gpu_menu));\n\n  // Display menu.\n  auto display_menu = MenuItem::Create(MenuItem::Type::kPopup, \"&Display\");\n  {\n    display_menu->AddChild(MenuItem::Create(\n        MenuItem::Type::kString, \"&Post-processing settings\", \"F6\",\n        std::bind(&EmulatorWindow::ToggleDisplayConfigDialog, this)));\n  }\n  display_menu->AddChild(MenuItem::Create(MenuItem::Type::kSeparator));\n  {\n    display_menu->AddChild(\n        MenuItem::Create(MenuItem::Type::kString, \"&Fullscreen\", \"F11\",\n                         std::bind(&EmulatorWindow::ToggleFullscreen, this)));\n  }\n  main_menu->AddChild(std::move(display_menu));\n\n  // Help menu.\n  auto help_menu = MenuItem::Create(MenuItem::Type::kPopup, \"&Help\");\n  {\n    help_menu->AddChild(\n        MenuItem::Create(MenuItem::Type::kString, \"FA&Q...\", \"F1\",\n                         std::bind(&EmulatorWindow::ShowFAQ, this)));\n    help_menu->AddChild(MenuItem::Create(MenuItem::Type::kSeparator));\n    help_menu->AddChild(\n        MenuItem::Create(MenuItem::Type::kString, \"Game &compatibility...\",\n                         std::bind(&EmulatorWindow::ShowCompatibility, this)));\n    help_menu->AddChild(MenuItem::Create(MenuItem::Type::kSeparator));\n    help_menu->AddChild(MenuItem::Create(\n        MenuItem::Type::kString, \"Build commit on GitHub...\", \"F2\",\n        std::bind(&EmulatorWindow::ShowBuildCommit, this)));\n    help_menu->AddChild(MenuItem::Create(\n        MenuItem::Type::kString, \"Recent changes on GitHub...\", [this]() {\n          LaunchWebBrowser(\n              \"https://github.com/xenia-project/xenia/compare/\" XE_BUILD_COMMIT\n              \"...\" XE_BUILD_BRANCH);\n        }));\n    help_menu->AddChild(MenuItem::Create(MenuItem::Type::kSeparator));\n    help_menu->AddChild(MenuItem::Create(\n        MenuItem::Type::kString, \"&About...\",\n        [this]() { LaunchWebBrowser(\"https://xenia.jp/about/\"); }));\n  }\n  main_menu->AddChild(std::move(help_menu));\n\n  window_->SetMainMenu(std::move(main_menu));\n\n  window_->SetMainMenuEnabled(false);\n\n  UpdateTitle();\n\n  if (!window_->Open()) {\n    XELOGE(\"Failed to open the platform window\");\n    return false;\n  }\n\n  Profiler::SetUserIO(kZOrderProfiler, window_.get(), nullptr, nullptr);\n\n  return true;\n}\n\nconst char* EmulatorWindow::GetCvarValueForSwapPostEffect(\n    gpu::CommandProcessor::SwapPostEffect effect) {\n  switch (effect) {\n    case gpu::CommandProcessor::SwapPostEffect::kFxaa:\n      return \"fxaa\";\n    case gpu::CommandProcessor::SwapPostEffect::kFxaaExtreme:\n      return \"fxaa_extreme\";\n    default:\n      return \"\";\n  }\n}\n\ngpu::CommandProcessor::SwapPostEffect\nEmulatorWindow::GetSwapPostEffectForCvarValue(const std::string& cvar_value) {\n  if (cvar_value == GetCvarValueForSwapPostEffect(\n                        gpu::CommandProcessor::SwapPostEffect::kFxaa)) {\n    return gpu::CommandProcessor::SwapPostEffect::kFxaa;\n  }\n  if (cvar_value == GetCvarValueForSwapPostEffect(\n                        gpu::CommandProcessor::SwapPostEffect::kFxaaExtreme)) {\n    return gpu::CommandProcessor::SwapPostEffect::kFxaaExtreme;\n  }\n  return gpu::CommandProcessor::SwapPostEffect::kNone;\n}\n\nconst char* EmulatorWindow::GetCvarValueForGuestOutputPaintEffect(\n    ui::Presenter::GuestOutputPaintConfig::Effect effect) {\n  switch (effect) {\n    case ui::Presenter::GuestOutputPaintConfig::Effect::kCas:\n      return \"cas\";\n    case ui::Presenter::GuestOutputPaintConfig::Effect::kFsr:\n      return \"fsr\";\n    default:\n      return \"\";\n  }\n}\n\nui::Presenter::GuestOutputPaintConfig::Effect\nEmulatorWindow::GetGuestOutputPaintEffectForCvarValue(\n    const std::string& cvar_value) {\n  if (cvar_value == GetCvarValueForGuestOutputPaintEffect(\n                        ui::Presenter::GuestOutputPaintConfig::Effect::kCas)) {\n    return ui::Presenter::GuestOutputPaintConfig::Effect::kCas;\n  }\n  if (cvar_value == GetCvarValueForGuestOutputPaintEffect(\n                        ui::Presenter::GuestOutputPaintConfig::Effect::kFsr)) {\n    return ui::Presenter::GuestOutputPaintConfig::Effect::kFsr;\n  }\n  return ui::Presenter::GuestOutputPaintConfig::Effect::kBilinear;\n}\n\nui::Presenter::GuestOutputPaintConfig\nEmulatorWindow::GetGuestOutputPaintConfigForCvars() {\n  ui::Presenter::GuestOutputPaintConfig paint_config;\n  paint_config.SetAllowOverscanCutoff(true);\n  paint_config.SetEffect(GetGuestOutputPaintEffectForCvarValue(\n      cvars::postprocess_scaling_and_sharpening));\n  paint_config.SetCasAdditionalSharpness(\n      float(cvars::postprocess_ffx_cas_additional_sharpness));\n  paint_config.SetFsrMaxUpsamplingPasses(\n      cvars::postprocess_ffx_fsr_max_upsampling_passes);\n  paint_config.SetFsrSharpnessReduction(\n      float(cvars::postprocess_ffx_fsr_sharpness_reduction));\n  paint_config.SetDither(cvars::postprocess_dither);\n  return paint_config;\n}\n\nvoid EmulatorWindow::ApplyDisplayConfigForCvars() {\n  gpu::GraphicsSystem* graphics_system = emulator_->graphics_system();\n  if (!graphics_system) {\n    return;\n  }\n\n  gpu::CommandProcessor* command_processor =\n      graphics_system->command_processor();\n  if (command_processor) {\n    command_processor->SetDesiredSwapPostEffect(\n        GetSwapPostEffectForCvarValue(cvars::postprocess_antialiasing));\n  }\n\n  ui::Presenter* presenter = graphics_system->presenter();\n  if (presenter) {\n    presenter->SetGuestOutputPaintConfigFromUIThread(\n        GetGuestOutputPaintConfigForCvars());\n  }\n}\n\nvoid EmulatorWindow::OnKeyDown(ui::KeyEvent& e) {\n  if (!emulator_initialized_) {\n    return;\n  }\n\n  switch (e.virtual_key()) {\n    case ui::VirtualKey::kO: {\n      if (!e.is_ctrl_pressed()) {\n        return;\n      }\n      FileOpen();\n    } break;\n    case ui::VirtualKey::kMultiply: {\n      CpuTimeScalarReset();\n    } break;\n    case ui::VirtualKey::kSubtract: {\n      CpuTimeScalarSetHalf();\n    } break;\n    case ui::VirtualKey::kAdd: {\n      CpuTimeScalarSetDouble();\n    } break;\n\n    case ui::VirtualKey::kF3: {\n      Profiler::ToggleDisplay();\n    } break;\n\n    case ui::VirtualKey::kF4: {\n      GpuTraceFrame();\n    } break;\n    case ui::VirtualKey::kF5: {\n      GpuClearCaches();\n    } break;\n\n    case ui::VirtualKey::kF6: {\n      ToggleDisplayConfigDialog();\n    } break;\n    case ui::VirtualKey::kF11: {\n      ToggleFullscreen();\n    } break;\n    case ui::VirtualKey::kEscape: {\n      // Allow users to escape fullscreen (but not enter it).\n      if (!window_->IsFullscreen()) {\n        return;\n      }\n      SetFullscreen(false);\n    } break;\n\n#ifdef DEBUG\n    case ui::VirtualKey::kF7: {\n      // Save to file\n      // TODO: Choose path based on user input, or from options\n      // TODO: Spawn a new thread to do this.\n      emulator()->SaveToFile(\"test.sav\");\n    } break;\n    case ui::VirtualKey::kF8: {\n      // Restore from file\n      // TODO: Choose path from user\n      // TODO: Spawn a new thread to do this.\n      emulator()->RestoreFromFile(\"test.sav\");\n    } break;\n#endif  // #ifdef DEBUG\n\n    case ui::VirtualKey::kPause: {\n      CpuBreakIntoDebugger();\n    } break;\n    case ui::VirtualKey::kCancel: {\n      CpuBreakIntoHostDebugger();\n    } break;\n\n    case ui::VirtualKey::kF1: {\n      ShowFAQ();\n    } break;\n\n    case ui::VirtualKey::kF2: {\n      ShowBuildCommit();\n    } break;\n\n    default:\n      return;\n  }\n\n  e.set_handled(true);\n}\n\nvoid EmulatorWindow::FileDrop(const std::filesystem::path& filename) {\n  if (!emulator_initialized_) {\n    return;\n  }\n  auto result = emulator_->LaunchPath(filename);\n  if (XFAILED(result)) {\n    // TODO: Display a message box.\n    XELOGE(\"Failed to launch target: {:08X}\", result);\n  }\n}\n\nvoid EmulatorWindow::FileOpen() {\n  std::filesystem::path path;\n\n  auto file_picker = xe::ui::FilePicker::Create();\n  file_picker->set_mode(ui::FilePicker::Mode::kOpen);\n  file_picker->set_type(ui::FilePicker::Type::kFile);\n  file_picker->set_multi_selection(false);\n  file_picker->set_title(\"Select Content Package\");\n  file_picker->set_extensions({\n      {\"Supported Files\", \"*.iso;*.xex;*.*\"},\n      {\"Disc Image (*.iso)\", \"*.iso\"},\n      {\"Xbox Executable (*.xex)\", \"*.xex\"},\n      //{\"Content Package (*.xcp)\", \"*.xcp\" },\n      {\"All Files (*.*)\", \"*.*\"},\n  });\n  if (file_picker->Show(window_.get())) {\n    auto selected_files = file_picker->selected_files();\n    if (!selected_files.empty()) {\n      path = selected_files[0];\n    }\n  }\n\n  if (!path.empty()) {\n    // Normalize the path and make absolute.\n    auto abs_path = std::filesystem::absolute(path);\n    auto result = emulator_->LaunchPath(abs_path);\n    if (XFAILED(result)) {\n      // TODO: Display a message box.\n      XELOGE(\"Failed to launch target: {:08X}\", result);\n    }\n  }\n}\n\nvoid EmulatorWindow::FileClose() {\n  if (emulator_->is_title_open()) {\n    emulator_->TerminateTitle();\n  }\n}\n\nvoid EmulatorWindow::ShowContentDirectory() {\n  std::filesystem::path target_path;\n\n  auto content_root = emulator_->content_root();\n  if (!emulator_->is_title_open() || !emulator_->kernel_state()) {\n    target_path = content_root;\n  } else {\n    // TODO(gibbed): expose this via ContentManager?\n    auto title_id =\n        fmt::format(\"{:08X}\", emulator_->kernel_state()->title_id());\n    auto package_root = content_root / title_id;\n    target_path = package_root;\n  }\n\n  if (!std::filesystem::exists(target_path)) {\n    std::filesystem::create_directories(target_path);\n  }\n\n  LaunchFileExplorer(target_path);\n}\n\nvoid EmulatorWindow::CpuTimeScalarReset() {\n  Clock::set_guest_time_scalar(1.0);\n  UpdateTitle();\n}\n\nvoid EmulatorWindow::CpuTimeScalarSetHalf() {\n  Clock::set_guest_time_scalar(Clock::guest_time_scalar() / 2.0);\n  UpdateTitle();\n}\n\nvoid EmulatorWindow::CpuTimeScalarSetDouble() {\n  Clock::set_guest_time_scalar(Clock::guest_time_scalar() * 2.0);\n  UpdateTitle();\n}\n\nvoid EmulatorWindow::CpuBreakIntoDebugger() {\n  if (!cvars::debug) {\n    xe::ui::ImGuiDialog::ShowMessageBox(imgui_drawer_.get(), \"Xenia Debugger\",\n                                        \"Xenia must be launched with the \"\n                                        \"--debug flag in order to enable \"\n                                        \"debugging.\");\n    return;\n  }\n  auto processor = emulator()->processor();\n  if (processor->execution_state() == cpu::ExecutionState::kRunning) {\n    // Currently running, so interrupt (and show the debugger).\n    processor->Pause();\n  } else {\n    // Not running, so just bring the debugger into focus.\n    processor->ShowDebugger();\n  }\n}\n\nvoid EmulatorWindow::CpuBreakIntoHostDebugger() { xe::debugging::Break(); }\n\nvoid EmulatorWindow::GpuTraceFrame() {\n  emulator()->graphics_system()->RequestFrameTrace();\n}\n\nvoid EmulatorWindow::GpuClearCaches() {\n  emulator()->graphics_system()->ClearCaches();\n}\n\nvoid EmulatorWindow::SetFullscreen(bool fullscreen) {\n  if (window_->IsFullscreen() == fullscreen) {\n    return;\n  }\n  window_->SetFullscreen(fullscreen);\n  window_->SetCursorVisibility(fullscreen\n                                   ? ui::Window::CursorVisibility::kAutoHidden\n                                   : ui::Window::CursorVisibility::kVisible);\n}\n\nvoid EmulatorWindow::ToggleFullscreen() {\n  SetFullscreen(!window_->IsFullscreen());\n}\n\nvoid EmulatorWindow::ToggleDisplayConfigDialog() {\n  if (!display_config_dialog_) {\n    display_config_dialog_ = std::unique_ptr<DisplayConfigDialog>(\n        new DisplayConfigDialog(imgui_drawer_.get(), *this));\n  } else {\n    display_config_dialog_.reset();\n  }\n}\n\nvoid EmulatorWindow::ShowCompatibility() {\n  const std::string_view base_url =\n      \"https://github.com/xenia-project/game-compatibility/issues\";\n  std::string url;\n  // Avoid searching for a title ID of \"00000000\".\n  uint32_t title_id = emulator_->title_id();\n  if (!title_id) {\n    url = base_url;\n  } else {\n    url = fmt::format(\"{}?q=is%3Aissue+is%3Aopen+{:08X}\", base_url, title_id);\n  }\n  LaunchWebBrowser(url);\n}\n\nvoid EmulatorWindow::ShowFAQ() {\n  LaunchWebBrowser(\"https://github.com/xenia-project/xenia/wiki/FAQ\");\n}\n\nvoid EmulatorWindow::ShowBuildCommit() {\n#ifdef XE_BUILD_IS_PR\n  LaunchWebBrowser(\n      \"https://github.com/xenia-project/xenia/pull/\" XE_BUILD_PR_NUMBER);\n#else\n  LaunchWebBrowser(\n      \"https://github.com/xenia-project/xenia/commit/\" XE_BUILD_COMMIT);\n#endif\n}\n\nvoid EmulatorWindow::UpdateTitle() {\n  xe::StringBuffer sb;\n  sb.Append(base_title_);\n\n  // Title information, if available\n  if (emulator()->is_title_open()) {\n    sb.AppendFormat(u8\" | [{:08X}\", emulator()->title_id());\n    auto title_version = emulator()->title_version();\n    if (!title_version.empty()) {\n      sb.Append(u8\" v\");\n      sb.Append(title_version);\n    }\n    sb.Append(u8\"]\");\n\n    auto title_name = emulator()->title_name();\n    if (!title_name.empty()) {\n      sb.Append(u8\" \");\n      sb.Append(title_name);\n    }\n  }\n\n  // Graphics system name, if available\n  auto graphics_system = emulator()->graphics_system();\n  if (graphics_system) {\n    auto graphics_name = graphics_system->name();\n    if (!graphics_name.empty()) {\n      sb.Append(u8\" <\");\n      sb.Append(graphics_name);\n      sb.Append(u8\">\");\n    }\n  }\n\n  if (Clock::guest_time_scalar() != 1.0) {\n    sb.AppendFormat(u8\" (@{:.2f}x)\", Clock::guest_time_scalar());\n  }\n\n  if (initializing_shader_storage_) {\n    sb.Append(u8\" (Preloading shaders\\u2026)\");\n  }\n\n  window_->SetTitle(sb.to_string_view());\n}\n\nvoid EmulatorWindow::SetInitializingShaderStorage(bool initializing) {\n  if (initializing_shader_storage_ == initializing) {\n    return;\n  }\n  initializing_shader_storage_ = initializing;\n  UpdateTitle();\n}\n\n}  // namespace app\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/app/emulator_window.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_APP_EMULATOR_WINDOW_H_\n#define XENIA_APP_EMULATOR_WINDOW_H_\n\n#include <memory>\n#include <string>\n\n#include \"xenia/emulator.h\"\n#include \"xenia/gpu/command_processor.h\"\n#include \"xenia/ui/imgui_dialog.h\"\n#include \"xenia/ui/imgui_drawer.h\"\n#include \"xenia/ui/immediate_drawer.h\"\n#include \"xenia/ui/menu_item.h\"\n#include \"xenia/ui/presenter.h\"\n#include \"xenia/ui/window.h\"\n#include \"xenia/ui/window_listener.h\"\n#include \"xenia/ui/windowed_app_context.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace app {\n\nclass EmulatorWindow {\n public:\n  enum : size_t {\n    // The UI is on top of the game and is open in special cases, so\n    // lowest-priority.\n    kZOrderHidInput,\n    kZOrderImGui,\n    kZOrderProfiler,\n    // Emulator window controls are expected to be always accessible by the\n    // user, so highest-priority.\n    kZOrderEmulatorWindowInput,\n  };\n\n  virtual ~EmulatorWindow();\n\n  static std::unique_ptr<EmulatorWindow> Create(\n      Emulator* emulator, ui::WindowedAppContext& app_context);\n\n  Emulator* emulator() const { return emulator_; }\n  ui::WindowedAppContext& app_context() const { return app_context_; }\n  ui::Window* window() const { return window_.get(); }\n  ui::ImGuiDrawer* imgui_drawer() const { return imgui_drawer_.get(); }\n\n  ui::Presenter* GetGraphicsSystemPresenter() const;\n  void SetupGraphicsSystemPresenterPainting();\n  void ShutdownGraphicsSystemPresenterPainting();\n\n  void OnEmulatorInitialized();\n\n  void UpdateTitle();\n  void SetFullscreen(bool fullscreen);\n  void ToggleFullscreen();\n  void SetInitializingShaderStorage(bool initializing);\n\n private:\n  class EmulatorWindowListener final : public ui::WindowListener,\n                                       public ui::WindowInputListener {\n   public:\n    explicit EmulatorWindowListener(EmulatorWindow& emulator_window)\n        : emulator_window_(emulator_window) {}\n\n    void OnClosing(ui::UIEvent& e) override;\n    void OnFileDrop(ui::FileDropEvent& e) override;\n\n    void OnKeyDown(ui::KeyEvent& e) override;\n\n   private:\n    EmulatorWindow& emulator_window_;\n  };\n\n  class DisplayConfigGameConfigLoadCallback\n      : public Emulator::GameConfigLoadCallback {\n   public:\n    DisplayConfigGameConfigLoadCallback(Emulator& emulator,\n                                        EmulatorWindow& emulator_window)\n        : Emulator::GameConfigLoadCallback(emulator),\n          emulator_window_(emulator_window) {}\n\n    void PostGameConfigLoad() override;\n\n   private:\n    EmulatorWindow& emulator_window_;\n  };\n\n  class DisplayConfigDialog final : public ui::ImGuiDialog {\n   public:\n    DisplayConfigDialog(ui::ImGuiDrawer* imgui_drawer,\n                        EmulatorWindow& emulator_window)\n        : ui::ImGuiDialog(imgui_drawer), emulator_window_(emulator_window) {}\n\n   protected:\n    void OnDraw(ImGuiIO& io) override;\n\n   private:\n    EmulatorWindow& emulator_window_;\n  };\n\n  explicit EmulatorWindow(Emulator* emulator,\n                          ui::WindowedAppContext& app_context);\n\n  bool Initialize();\n\n  // For comparisons, use GetSwapPostEffectForCvarValue instead as the default\n  // fallback may be used for multiple values.\n  static const char* GetCvarValueForSwapPostEffect(\n      gpu::CommandProcessor::SwapPostEffect effect);\n  static gpu::CommandProcessor::SwapPostEffect GetSwapPostEffectForCvarValue(\n      const std::string& cvar_value);\n  // For comparisons, use GetGuestOutputPaintEffectForCvarValue instead as the\n  // default fallback may be used for multiple values.\n  static const char* GetCvarValueForGuestOutputPaintEffect(\n      ui::Presenter::GuestOutputPaintConfig::Effect effect);\n  static ui::Presenter::GuestOutputPaintConfig::Effect\n  GetGuestOutputPaintEffectForCvarValue(const std::string& cvar_value);\n  static ui::Presenter::GuestOutputPaintConfig\n  GetGuestOutputPaintConfigForCvars();\n  void ApplyDisplayConfigForCvars();\n\n  void OnKeyDown(ui::KeyEvent& e);\n  void FileDrop(const std::filesystem::path& filename);\n  void FileOpen();\n  void FileClose();\n  void ShowContentDirectory();\n  void CpuTimeScalarReset();\n  void CpuTimeScalarSetHalf();\n  void CpuTimeScalarSetDouble();\n  void CpuBreakIntoDebugger();\n  void CpuBreakIntoHostDebugger();\n  void GpuTraceFrame();\n  void GpuClearCaches();\n  void ToggleDisplayConfigDialog();\n  void ShowCompatibility();\n  void ShowFAQ();\n  void ShowBuildCommit();\n\n  Emulator* emulator_;\n  ui::WindowedAppContext& app_context_;\n  EmulatorWindowListener window_listener_;\n  std::unique_ptr<ui::Window> window_;\n  std::unique_ptr<ui::ImGuiDrawer> imgui_drawer_;\n  std::unique_ptr<DisplayConfigGameConfigLoadCallback>\n      display_config_game_config_load_callback_;\n  // Creation may fail, in this case immediate drawer UI must not be drawn.\n  std::unique_ptr<ui::ImmediateDrawer> immediate_drawer_;\n\n  bool emulator_initialized_ = false;\n\n  std::string base_title_;\n  bool initializing_shader_storage_ = false;\n\n  std::unique_ptr<DisplayConfigDialog> display_config_dialog_;\n};\n\n}  // namespace app\n}  // namespace xe\n\n#endif  // XENIA_APP_EMULATOR_WINDOW_H_\n"
  },
  {
    "path": "src/xenia/app/main_resources.rc",
    "content": "//{{NO_DEPENDENCIES}}\n\nMAINICON               ICON                    \"..\\\\..\\\\..\\\\assets\\\\icon\\\\icon.ico\"\n"
  },
  {
    "path": "src/xenia/app/premake5.lua",
    "content": "project_root = \"../../..\"\ninclude(project_root..\"/tools/build\")\n\ngroup(\"src\")\nproject(\"xenia-app\")\n  uuid(\"d7e98620-d007-4ad8-9dbd-b47c8853a17f\")\n  language(\"C++\")\n  links({\n    \"xenia-apu\",\n    \"xenia-apu-nop\",\n    \"xenia-base\",\n    \"xenia-core\",\n    \"xenia-cpu\",\n    \"xenia-gpu\",\n    \"xenia-gpu-null\",\n    \"xenia-gpu-vulkan\",\n    \"xenia-hid\",\n    \"xenia-hid-nop\",\n    \"xenia-kernel\",\n    \"xenia-ui\",\n    \"xenia-ui-vulkan\",\n    \"xenia-vfs\",\n  })\n  links({\n    \"aes_128\",\n    \"capstone\",\n    \"fmt\",\n    \"dxbc\",\n    \"discord-rpc\",\n    \"glslang-spirv\",\n    \"imgui\",\n    \"libavcodec\",\n    \"libavutil\",\n    \"mspack\",\n    \"snappy\",\n    \"xxhash\",\n  })\n  defines({\n    \"XBYAK_NO_OP_NAMES\",\n    \"XBYAK_ENABLE_OMITTED_OPERAND\",\n  })\n  local_platform_files()\n  files({\n    \"../base/main_init_\"..platform_suffix..\".cc\",\n    \"../ui/windowed_app_main_\"..platform_suffix..\".cc\",\n  })\n\n  resincludedirs({\n    project_root,\n  })\n\n  filter(SINGLE_LIBRARY_FILTER)\n    -- Unified library containing all apps as StaticLibs, not just the main\n    -- emulator windowed app.\n    kind(\"SharedLib\")\n    links({\n      \"xenia-gpu-vulkan-trace-viewer\",\n      \"xenia-hid-demo\",\n      \"xenia-ui-window-vulkan-demo\",\n    })\n  filter(NOT_SINGLE_LIBRARY_FILTER)\n    kind(\"WindowedApp\")\n\n  -- `targetname` is broken if building from Gradle, works only for toggling the\n  -- `lib` prefix, as Gradle uses LOCAL_MODULE_FILENAME, not a derivative of\n  -- LOCAL_MODULE, to specify the targets to build when executing ndk-build.\n  filter(\"platforms:not Android-*\")\n    targetname(\"xenia\")\n\n  filter(\"architecture:x86_64\")\n    links({\n      \"xenia-cpu-backend-x64\",\n    })\n\n  -- TODO(Triang3l): The emulator itself on Android.\n  filter(\"platforms:not Android-*\")\n    files({\n      \"xenia_main.cc\",\n    })\n\n  filter(\"platforms:Windows\")\n    files({\n      \"main_resources.rc\",\n    })\n\n  filter({\"architecture:x86_64\", \"files:../base/main_init_\"..platform_suffix..\".cc\"})\n    vectorextensions(\"IA32\")  -- Disable AVX for main_init_win.cc so our AVX check doesn't use AVX instructions.\n\n  filter(\"platforms:not Android-*\")\n    links({\n      \"xenia-app-discord\",\n      \"xenia-apu-sdl\",\n      -- TODO(Triang3l): CPU debugger on Android.\n      \"xenia-debug-ui\",\n      \"xenia-helper-sdl\",\n      \"xenia-hid-sdl\",\n    })\n\n  filter(\"platforms:Linux\")\n    links({\n      \"X11\",\n      \"xcb\",\n      \"X11-xcb\",\n      \"SDL2\",\n    })\n\n  filter(\"platforms:Windows\")\n    links({\n      \"xenia-apu-xaudio2\",\n      \"xenia-gpu-d3d12\",\n      \"xenia-hid-winkey\",\n      \"xenia-hid-xinput\",\n      \"xenia-ui-d3d12\",\n    })\n\n  filter({\"platforms:Windows\", SINGLE_LIBRARY_FILTER})\n    links({\n      \"xenia-gpu-d3d12-trace-viewer\",\n      \"xenia-ui-window-d3d12-demo\",\n    })\n\n  filter(\"platforms:Windows\")\n    -- Only create the .user file if it doesn't already exist.\n    local user_file = project_root..\"/build/xenia-app.vcxproj.user\"\n    if not os.isfile(user_file) then\n      debugdir(project_root)\n      debugargs({\n      })\n    end\n"
  },
  {
    "path": "src/xenia/app/xenia_main.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include <atomic>\n#include <cstdlib>\n#include <functional>\n#include <memory>\n#include <string>\n#include <thread>\n#include <vector>\n\n#include \"xenia/app/discord/discord_presence.h\"\n#include \"xenia/app/emulator_window.h\"\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/cvar.h\"\n#include \"xenia/base/debugging.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/platform.h\"\n#include \"xenia/base/profiling.h\"\n#include \"xenia/base/threading.h\"\n#include \"xenia/config.h\"\n#include \"xenia/debug/ui/debug_window.h\"\n#include \"xenia/emulator.h\"\n#include \"xenia/ui/file_picker.h\"\n#include \"xenia/ui/window.h\"\n#include \"xenia/ui/window_listener.h\"\n#include \"xenia/ui/windowed_app.h\"\n#include \"xenia/ui/windowed_app_context.h\"\n#include \"xenia/vfs/devices/host_path_device.h\"\n\n// Available audio systems:\n#include \"xenia/apu/nop/nop_audio_system.h\"\n#if !XE_PLATFORM_ANDROID\n#include \"xenia/apu/sdl/sdl_audio_system.h\"\n#endif  // !XE_PLATFORM_ANDROID\n#if XE_PLATFORM_WIN32\n#include \"xenia/apu/xaudio2/xaudio2_audio_system.h\"\n#endif  // XE_PLATFORM_WIN32\n\n// Available graphics systems:\n#include \"xenia/gpu/null/null_graphics_system.h\"\n#include \"xenia/gpu/vulkan/vulkan_graphics_system.h\"\n#if XE_PLATFORM_WIN32\n#include \"xenia/gpu/d3d12/d3d12_graphics_system.h\"\n#endif  // XE_PLATFORM_WIN32\n\n// Available input drivers:\n#include \"xenia/hid/nop/nop_hid.h\"\n#if !XE_PLATFORM_ANDROID\n#include \"xenia/hid/sdl/sdl_hid.h\"\n#endif  // !XE_PLATFORM_ANDROID\n#if XE_PLATFORM_WIN32\n#include \"xenia/hid/winkey/winkey_hid.h\"\n#include \"xenia/hid/xinput/xinput_hid.h\"\n#endif  // XE_PLATFORM_WIN32\n\n#include \"third_party/fmt/include/fmt/format.h\"\n\nDEFINE_string(apu, \"any\", \"Audio system. Use: [any, nop, sdl, xaudio2]\", \"APU\");\nDEFINE_string(gpu, \"any\", \"Graphics system. Use: [any, d3d12, vulkan, null]\",\n              \"GPU\");\nDEFINE_string(hid, \"any\", \"Input system. Use: [any, nop, sdl, winkey, xinput]\",\n              \"HID\");\n\nDEFINE_path(\n    storage_root, \"\",\n    \"Root path for persistent internal data storage (config, etc.), or empty \"\n    \"to use the path preferred for the OS, such as the documents folder, or \"\n    \"the emulator executable directory if portable.txt is present in it.\",\n    \"Storage\");\nDEFINE_path(\n    content_root, \"\",\n    \"Root path for guest content storage (saves, etc.), or empty to use the \"\n    \"content folder under the storage root.\",\n    \"Storage\");\nDEFINE_path(\n    cache_root, \"\",\n    \"Root path for files used to speed up certain parts of the emulator or the \"\n    \"game. These files may be persistent, but they can be deleted without \"\n    \"major side effects such as progress loss. If empty, the cache folder \"\n    \"under the storage root, or, if available, the cache directory preferred \"\n    \"for the OS, will be used.\",\n    \"Storage\");\n\nDEFINE_bool(mount_scratch, false, \"Enable scratch mount\", \"Storage\");\nDEFINE_bool(mount_cache, false, \"Enable cache mount\", \"Storage\");\n\nDEFINE_transient_path(target, \"\",\n                      \"Specifies the target .xex or .iso to execute.\",\n                      \"General\");\nDEFINE_transient_bool(portable, false,\n                      \"Specifies if Xenia should run in portable mode.\",\n                      \"General\");\n\nDECLARE_bool(debug);\n\nDEFINE_bool(discord, true, \"Enable Discord rich presence\", \"General\");\n\nnamespace xe {\nnamespace app {\n\nclass EmulatorApp final : public xe::ui::WindowedApp {\n public:\n  static std::unique_ptr<xe::ui::WindowedApp> Create(\n      xe::ui::WindowedAppContext& app_context) {\n    return std::unique_ptr<xe::ui::WindowedApp>(new EmulatorApp(app_context));\n  }\n\n  ~EmulatorApp();\n\n  bool OnInitialize() override;\n\n protected:\n  void OnDestroy() override;\n\n private:\n  template <typename T, typename... Args>\n  class Factory {\n   private:\n    struct Creator {\n      std::string name;\n      std::function<bool()> is_available;\n      std::function<std::unique_ptr<T>(Args...)> instantiate;\n    };\n\n    std::vector<Creator> creators_;\n\n   public:\n    void Add(const std::string_view name, std::function<bool()> is_available,\n             std::function<std::unique_ptr<T>(Args...)> instantiate) {\n      creators_.push_back({std::string(name), is_available, instantiate});\n    }\n\n    void Add(const std::string_view name,\n             std::function<std::unique_ptr<T>(Args...)> instantiate) {\n      auto always_available = []() { return true; };\n      Add(name, always_available, instantiate);\n    }\n\n    template <typename DT>\n    void Add(const std::string_view name) {\n      Add(name, DT::IsAvailable, [](Args... args) {\n        return std::make_unique<DT>(std::forward<Args>(args)...);\n      });\n    }\n\n    std::unique_ptr<T> Create(const std::string_view name, Args... args) {\n      if (!name.empty() && name != \"any\") {\n        auto it = std::find_if(\n            creators_.cbegin(), creators_.cend(),\n            [&name](const auto& f) { return name.compare(f.name) == 0; });\n        if (it != creators_.cend() && (*it).is_available()) {\n          return (*it).instantiate(std::forward<Args>(args)...);\n        }\n        return nullptr;\n      } else {\n        for (const auto& creator : creators_) {\n          if (!creator.is_available()) continue;\n          auto instance = creator.instantiate(std::forward<Args>(args)...);\n          if (!instance) continue;\n          return instance;\n        }\n        return nullptr;\n      }\n    }\n\n    std::vector<std::unique_ptr<T>> CreateAll(const std::string_view name,\n                                              Args... args) {\n      std::vector<std::unique_ptr<T>> instances;\n      if (!name.empty() && name != \"any\") {\n        auto it = std::find_if(\n            creators_.cbegin(), creators_.cend(),\n            [&name](const auto& f) { return name.compare(f.name) == 0; });\n        if (it != creators_.cend() && (*it).is_available()) {\n          auto instance = (*it).instantiate(std::forward<Args>(args)...);\n          if (instance) {\n            instances.emplace_back(std::move(instance));\n          }\n        }\n      } else {\n        for (const auto& creator : creators_) {\n          if (!creator.is_available()) continue;\n          auto instance = creator.instantiate(std::forward<Args>(args)...);\n          if (instance) {\n            instances.emplace_back(std::move(instance));\n          }\n        }\n      }\n      return instances;\n    }\n  };\n\n  class DebugWindowClosedListener final : public xe::ui::WindowListener {\n   public:\n    explicit DebugWindowClosedListener(EmulatorApp& emulator_app)\n        : emulator_app_(emulator_app) {}\n\n    void OnClosing(xe::ui::UIEvent& e) override;\n\n   private:\n    EmulatorApp& emulator_app_;\n  };\n\n  explicit EmulatorApp(xe::ui::WindowedAppContext& app_context);\n\n  static std::unique_ptr<apu::AudioSystem> CreateAudioSystem(\n      cpu::Processor* processor);\n  static std::unique_ptr<gpu::GraphicsSystem> CreateGraphicsSystem();\n  static std::vector<std::unique_ptr<hid::InputDriver>> CreateInputDrivers(\n      ui::Window* window);\n\n  void EmulatorThread();\n  void ShutdownEmulatorThreadFromUIThread();\n\n  DebugWindowClosedListener debug_window_closed_listener_;\n\n  std::unique_ptr<Emulator> emulator_;\n  std::unique_ptr<EmulatorWindow> emulator_window_;\n\n  // Created on demand, used by the emulator.\n  std::unique_ptr<xe::debug::ui::DebugWindow> debug_window_;\n\n  // Refreshing the emulator - placed after its dependencies.\n  std::atomic<bool> emulator_thread_quit_requested_;\n  std::unique_ptr<xe::threading::Event> emulator_thread_event_;\n  std::thread emulator_thread_;\n};\n\nvoid EmulatorApp::DebugWindowClosedListener::OnClosing(xe::ui::UIEvent& e) {\n  EmulatorApp* emulator_app = &emulator_app_;\n  emulator_app->emulator_->processor()->set_debug_listener(nullptr);\n  emulator_app->debug_window_.reset();\n}\n\nEmulatorApp::EmulatorApp(xe::ui::WindowedAppContext& app_context)\n    : xe::ui::WindowedApp(app_context, \"xenia\", \"[Path to .iso/.xex]\"),\n      debug_window_closed_listener_(*this) {\n  AddPositionalOption(\"target\");\n}\n\nEmulatorApp::~EmulatorApp() {\n  // Should be shut down from OnDestroy if OnInitialize has ever been done, but\n  // for the most safety as a running thread may be destroyed only after\n  // joining.\n  ShutdownEmulatorThreadFromUIThread();\n}\n\nstd::unique_ptr<apu::AudioSystem> EmulatorApp::CreateAudioSystem(\n    cpu::Processor* processor) {\n  Factory<apu::AudioSystem, cpu::Processor*> factory;\n#if XE_PLATFORM_WIN32\n  factory.Add<apu::xaudio2::XAudio2AudioSystem>(\"xaudio2\");\n#endif  // XE_PLATFORM_WIN32\n#if !XE_PLATFORM_ANDROID\n  factory.Add<apu::sdl::SDLAudioSystem>(\"sdl\");\n#endif  // !XE_PLATFORM_ANDROID\n  factory.Add<apu::nop::NopAudioSystem>(\"nop\");\n  return factory.Create(cvars::apu, processor);\n}\n\nstd::unique_ptr<gpu::GraphicsSystem> EmulatorApp::CreateGraphicsSystem() {\n  // While Vulkan is supported by a large variety of operating systems (Windows,\n  // GNU/Linux, Android, also via the MoltenVK translation layer on top of Metal\n  // on macOS and iOS), please don't remove platform-specific GPU backends from\n  // Xenia.\n  //\n  // Regardless of the operating system, having multiple options provides more\n  // stability to users. In case of driver issues, users may try switching\n  // between the available backends. For example, in June 2022, on Nvidia Ampere\n  // (RTX 30xx), Xenia had synchronization issues that resulted in flickering,\n  // most prominently in 4D5307E6, on Direct3D 12 - but the same issue was not\n  // reproducible in the Vulkan backend, however, it used ImageSampleExplicitLod\n  // with explicit gradients for cubemaps, which triggered a different driver\n  // bug on Nvidia (every 1 out of 2x2 pixels receiving junk).\n  //\n  // Specifically on Microsoft platforms, there are a few reasons why supporting\n  // Direct3D 12 is desirable rather than limiting Xenia to Vulkan only:\n  // - Wider hardware support for Direct3D 12 on x86 Windows desktops.\n  //   Direct3D 12 requires the minimum of Nvidia Fermi, or, with a pre-2021\n  //   driver version, Intel HD Graphics 4200. Vulkan, however, is supported\n  //   only starting with Nvidia Kepler and a much more recent Intel UHD\n  //   Graphics generation.\n  // - Wider hardware support on other kinds of Microsoft devices. The Xbox One\n  //   and the Xbox Series X|S only support Direct3D as the GPU API in their UWP\n  //   runtime, and only version 12 can be granted expanded resource access.\n  //   Qualcomm, as of June 2022, also doesn't provide a Vulkan implementation\n  //   for their Arm-based Windows devices, while Direct3D 12 is available.\n  //   - Both older Intel GPUs and the Xbox One apparently, as well as earlier\n  //     Windows 10 versions, also require Shader Model 5.1 DXBC shaders rather\n  //     than Shader Model 6 DXIL ones, so a DXBC shader translator should be\n  //     available in Xenia too, a DXIL one doesn't fully replace it.\n  // - As of June 2022, AMD also refuses to implement the\n  //   VK_EXT_fragment_shader_interlock Vulkan extension in their drivers, as\n  //   well as its OpenGL counterpart, which is heavily utilized for accurate\n  //   support of Xenos render target formats that don't have PC equivalents\n  //   (8_8_8_8_GAMMA, 2_10_10_10_FLOAT, 16_16 and 16_16_16_16 with -32 to 32\n  //   range, D24FS8) with correct blending. Direct3D 12, however, requires\n  //   support for similar functionality (rasterizer-ordered views) on the\n  //   feature level 12_1, and the AMD driver implements it on Direct3D, as well\n  //   as raster order groups in their Metal driver.\n  //\n  // Additionally, different host GPU APIs receive feature support at different\n  // paces. VK_EXT_fragment_shader_interlock first appeared in 2019, for\n  // instance, while Xenia had been taking advantage of rasterizer-ordered views\n  // on Direct3D 12 for over half a year at that point (they have existed in\n  // Direct3D 12 since the first version).\n  //\n  // MoltenVK on top Metal also has its flaws and limitations. Metal, for\n  // instance, as of June 2022, doesn't provide a switch for primitive restart,\n  // while Vulkan does - so MoltenVK is not completely transparent to Xenia,\n  // many of its issues that may be not very obvious (unlike when the Metal API\n  // is used directly) should be taken into account in Xenia. Also, as of June\n  // 2022, MoltenVK translates SPIR-V shaders into the C++-based Metal Shading\n  // Language rather than AIR directly, which likely massively increases\n  // pipeline object creation time - and Xenia translates shaders and creates\n  // pipelines when they're first actually used for a draw command by the game,\n  // thus it can't precompile anything that hasn't ever been encountered before\n  // there's already no time to waste.\n  //\n  // Very old hardware (Direct3D 10 level) is also not supported by most Vulkan\n  // drivers. However, in the future, Xenia may be ported to it using the\n  // Direct3D 11 API with the feature level 10_1 or 10_0. OpenGL, however, had\n  // been lagging behind Direct3D prior to versions 4.x, and didn't receive\n  // compute shaders until a 4.2 extension (while 4.2 already corresponds\n  // roughly to Direct3D 11 features) - and replacing Xenia compute shaders with\n  // transform feedback / stream output is not always trivial (in particular,\n  // will need to rely on GL_ARB_transform_feedback3 for skipping over memory\n  // locations that shouldn't be overwritten).\n  //\n  // For maintainability, as much implementation code as possible should be\n  // placed in `xe::gpu` and shared between the backends rather than duplicated\n  // between them.\n  const std::string gpu_implementation_name = cvars::gpu;\n  if (gpu_implementation_name == \"null\") {\n    return std::make_unique<gpu::null::NullGraphicsSystem>();\n  }\n  Factory<gpu::GraphicsSystem> factory;\n#if XE_PLATFORM_WIN32\n  factory.Add<gpu::d3d12::D3D12GraphicsSystem>(\"d3d12\");\n#endif  // XE_PLATFORM_WIN32\n  factory.Add<gpu::vulkan::VulkanGraphicsSystem>(\"vulkan\");\n  std::unique_ptr<gpu::GraphicsSystem> gpu_implementation =\n      factory.Create(gpu_implementation_name);\n  if (!gpu_implementation) {\n    xe::FatalError(\n        \"Unable to initialize the graphics subsystem.\\n\"\n        \"\\n\"\n#if XE_PLATFORM_ANDROID\n        \"The GPU must support at least Vulkan 1.0 with the 'independentBlend' \"\n        \"feature.\\n\"\n        \"\\n\"\n#else\n#if XE_PLATFORM_WIN32\n        \"For Direct3D 12, at least Windows 10 is required, and the GPU must be \"\n        \"compatible with Direct3D 12 feature level 11_0.\\n\"\n        \"\\n\"\n#endif  // XE_PLATFORM_WIN32\n        \"For Vulkan, the Vulkan runtime must be installed, and the GPU must \"\n        \"support at least Vulkan 1.0. The Vulkan runtime can be downloaded at \"\n        \"https://vulkan.lunarg.com/sdk/home.\\n\"\n        \"\\n\"\n        \"Also, ensure that you have the latest driver installed for your GPU.\\n\"\n        \"\\n\"\n#endif  // XE_PLATFORM_ANDROID\n        \"See https://xenia.jp/faq/ for more information and the system \"\n        \"requirements.\");\n  }\n  return gpu_implementation;\n}\n\nstd::vector<std::unique_ptr<hid::InputDriver>> EmulatorApp::CreateInputDrivers(\n    ui::Window* window) {\n  std::vector<std::unique_ptr<hid::InputDriver>> drivers;\n  if (cvars::hid.compare(\"nop\") == 0) {\n    drivers.emplace_back(\n        xe::hid::nop::Create(window, EmulatorWindow::kZOrderHidInput));\n  } else {\n    Factory<hid::InputDriver, ui::Window*, size_t> factory;\n#if XE_PLATFORM_WIN32\n    factory.Add(\"xinput\", xe::hid::xinput::Create);\n#endif  // XE_PLATFORM_WIN32\n#if !XE_PLATFORM_ANDROID\n    factory.Add(\"sdl\", xe::hid::sdl::Create);\n#endif  // !XE_PLATFORM_ANDROID\n#if XE_PLATFORM_WIN32\n    // WinKey input driver should always be the last input driver added!\n    factory.Add(\"winkey\", xe::hid::winkey::Create);\n#endif  // XE_PLATFORM_WIN32\n    for (auto& driver : factory.CreateAll(cvars::hid, window,\n                                          EmulatorWindow::kZOrderHidInput)) {\n      if (XSUCCEEDED(driver->Setup())) {\n        drivers.emplace_back(std::move(driver));\n      }\n    }\n    if (drivers.empty()) {\n      // Fallback to nop if none created.\n      drivers.emplace_back(\n          xe::hid::nop::Create(window, EmulatorWindow::kZOrderHidInput));\n    }\n  }\n  return drivers;\n}\n\nbool EmulatorApp::OnInitialize() {\n  Profiler::Initialize();\n  Profiler::ThreadEnter(\"Main\");\n\n  // Figure out where internal files and content should go.\n  std::filesystem::path storage_root = cvars::storage_root;\n  if (storage_root.empty()) {\n    storage_root = xe::filesystem::GetExecutableFolder();\n    if (!cvars::portable &&\n        !std::filesystem::exists(storage_root / \"portable.txt\")) {\n      storage_root = xe::filesystem::GetUserFolder();\n#if defined(XE_PLATFORM_WIN32) || defined(XE_PLATFORM_GNU_LINUX)\n      storage_root = storage_root / \"Xenia\";\n#else\n      // TODO(Triang3l): Point to the app's external storage \"files\" directory\n      // on Android.\n#warning Unhandled platform for the data root.\n      storage_root = storage_root / \"Xenia\";\n#endif\n    }\n  }\n  storage_root = std::filesystem::absolute(storage_root);\n  XELOGI(\"Storage root: {}\", xe::path_to_utf8(storage_root));\n\n  config::SetupConfig(storage_root);\n\n  std::filesystem::path content_root = cvars::content_root;\n  if (content_root.empty()) {\n    content_root = storage_root / \"content\";\n  } else {\n    // If content root isn't an absolute path, then it should be relative to the\n    // storage root.\n    if (!content_root.is_absolute()) {\n      content_root = storage_root / content_root;\n    }\n  }\n  content_root = std::filesystem::absolute(content_root);\n  XELOGI(\"Content root: {}\", xe::path_to_utf8(content_root));\n\n  std::filesystem::path cache_root = cvars::cache_root;\n  if (cache_root.empty()) {\n    cache_root = storage_root / \"cache\";\n    // TODO(Triang3l): Point to the app's external storage \"cache\" directory on\n    // Android.\n  } else {\n    // If content root isn't an absolute path, then it should be relative to the\n    // storage root.\n    if (!cache_root.is_absolute()) {\n      cache_root = storage_root / cache_root;\n    }\n  }\n  cache_root = std::filesystem::absolute(cache_root);\n  XELOGI(\"Cache root: {}\", xe::path_to_utf8(cache_root));\n\n  if (cvars::discord) {\n    discord::DiscordPresence::Initialize();\n    discord::DiscordPresence::NotPlaying();\n  }\n\n  // Create the emulator but don't initialize so we can setup the window.\n  emulator_ =\n      std::make_unique<Emulator>(\"\", storage_root, content_root, cache_root);\n\n  // Main emulator display window.\n  emulator_window_ = EmulatorWindow::Create(emulator_.get(), app_context());\n  if (!emulator_window_) {\n    XELOGE(\"Failed to create the main emulator window\");\n    return false;\n  }\n\n  // Setup the emulator and run its loop in a separate thread.\n  emulator_thread_quit_requested_.store(false, std::memory_order_relaxed);\n  emulator_thread_event_ = xe::threading::Event::CreateAutoResetEvent(false);\n  assert_not_null(emulator_thread_event_);\n  emulator_thread_ = std::thread(&EmulatorApp::EmulatorThread, this);\n\n  return true;\n}\n\nvoid EmulatorApp::OnDestroy() {\n  ShutdownEmulatorThreadFromUIThread();\n\n  if (cvars::discord) {\n    discord::DiscordPresence::Shutdown();\n  }\n\n  Profiler::Dump();\n  // The profiler needs to shut down before the graphics context.\n  Profiler::Shutdown();\n\n  // Write all cvar overrides to the config.\n  config::SaveConfig();\n\n  // TODO(DrChat): Remove this code and do a proper exit.\n  XELOGI(\"Cheap-skate exit!\");\n  std::quick_exit(EXIT_SUCCESS);\n}\n\nvoid EmulatorApp::EmulatorThread() {\n  assert_not_null(emulator_thread_event_);\n\n  xe::threading::set_name(\"Emulator\");\n  Profiler::ThreadEnter(\"Emulator\");\n\n  // Setup and initialize all subsystems. If we can't do something\n  // (unsupported system, memory issues, etc) this will fail early.\n  X_STATUS result = emulator_->Setup(\n      emulator_window_->window(), emulator_window_->imgui_drawer(), true,\n      CreateAudioSystem, CreateGraphicsSystem, CreateInputDrivers);\n  if (XFAILED(result)) {\n    XELOGE(\"Failed to setup emulator: {:08X}\", result);\n    app_context().RequestDeferredQuit();\n    return;\n  }\n\n  app_context().CallInUIThread(\n      [this]() { emulator_window_->SetupGraphicsSystemPresenterPainting(); });\n\n  if (cvars::mount_scratch) {\n    auto scratch_device = std::make_unique<xe::vfs::HostPathDevice>(\n        \"\\\\SCRATCH\", \"scratch\", false);\n    if (!scratch_device->Initialize()) {\n      XELOGE(\"Unable to scan scratch path\");\n    } else {\n      if (!emulator_->file_system()->RegisterDevice(\n              std::move(scratch_device))) {\n        XELOGE(\"Unable to register scratch path\");\n      } else {\n        emulator_->file_system()->RegisterSymbolicLink(\"scratch:\", \"\\\\SCRATCH\");\n      }\n    }\n  }\n\n  if (cvars::mount_cache) {\n    auto cache0_device =\n        std::make_unique<xe::vfs::HostPathDevice>(\"\\\\CACHE0\", \"cache0\", false);\n    if (!cache0_device->Initialize()) {\n      XELOGE(\"Unable to scan cache0 path\");\n    } else {\n      if (!emulator_->file_system()->RegisterDevice(std::move(cache0_device))) {\n        XELOGE(\"Unable to register cache0 path\");\n      } else {\n        emulator_->file_system()->RegisterSymbolicLink(\"cache0:\", \"\\\\CACHE0\");\n      }\n    }\n\n    auto cache1_device =\n        std::make_unique<xe::vfs::HostPathDevice>(\"\\\\CACHE1\", \"cache1\", false);\n    if (!cache1_device->Initialize()) {\n      XELOGE(\"Unable to scan cache1 path\");\n    } else {\n      if (!emulator_->file_system()->RegisterDevice(std::move(cache1_device))) {\n        XELOGE(\"Unable to register cache1 path\");\n      } else {\n        emulator_->file_system()->RegisterSymbolicLink(\"cache1:\", \"\\\\CACHE1\");\n      }\n    }\n\n    // Some (older?) games try accessing cache:\\ too\n    // NOTE: this must be registered _after_ the cache0/cache1 devices, due to\n    // substring/start_with logic inside VirtualFileSystem::ResolvePath, else\n    // accesses to those devices will go here instead\n    auto cache_device =\n        std::make_unique<xe::vfs::HostPathDevice>(\"\\\\CACHE\", \"cache\", false);\n    if (!cache_device->Initialize()) {\n      XELOGE(\"Unable to scan cache path\");\n    } else {\n      if (!emulator_->file_system()->RegisterDevice(std::move(cache_device))) {\n        XELOGE(\"Unable to register cache path\");\n      } else {\n        emulator_->file_system()->RegisterSymbolicLink(\"cache:\", \"\\\\CACHE\");\n      }\n    }\n  }\n\n  // Set a debug handler.\n  // This will respond to debugging requests so we can open the debug UI.\n  if (cvars::debug) {\n    emulator_->processor()->set_debug_listener_request_handler(\n        [this](xe::cpu::Processor* processor) {\n          if (debug_window_) {\n            return debug_window_.get();\n          }\n          app_context().CallInUIThreadSynchronous([this]() {\n            debug_window_ = xe::debug::ui::DebugWindow::Create(emulator_.get(),\n                                                               app_context());\n            debug_window_->window()->AddListener(\n                &debug_window_closed_listener_);\n          });\n          // If failed to enqueue the UI thread call, this will just be null.\n          return debug_window_.get();\n        });\n  }\n\n  emulator_->on_launch.AddListener([&](auto title_id, const auto& game_title) {\n    if (cvars::discord) {\n      discord::DiscordPresence::PlayingTitle(\n          game_title.empty() ? \"Unknown Title\" : std::string(game_title));\n    }\n    app_context().CallInUIThread([this]() { emulator_window_->UpdateTitle(); });\n    emulator_thread_event_->Set();\n  });\n\n  emulator_->on_shader_storage_initialization.AddListener(\n      [this](bool initializing) {\n        app_context().CallInUIThread([this, initializing]() {\n          emulator_window_->SetInitializingShaderStorage(initializing);\n        });\n      });\n\n  emulator_->on_terminate.AddListener([]() {\n    if (cvars::discord) {\n      discord::DiscordPresence::NotPlaying();\n    }\n  });\n\n  // Enable emulator input now that the emulator is properly loaded.\n  app_context().CallInUIThread(\n      [this]() { emulator_window_->OnEmulatorInitialized(); });\n\n  // Grab path from the flag or unnamed argument.\n  std::filesystem::path path;\n  if (!cvars::target.empty()) {\n    path = cvars::target;\n  }\n\n  if (!path.empty()) {\n    // Normalize the path and make absolute.\n    auto abs_path = std::filesystem::absolute(path);\n    result = emulator_->LaunchPath(abs_path);\n    if (XFAILED(result)) {\n      xe::FatalError(fmt::format(\"Failed to launch target: {:08X}\", result));\n      app_context().RequestDeferredQuit();\n      return;\n    }\n  }\n\n  // Now, we're going to use this thread to drive events related to emulation.\n  while (!emulator_thread_quit_requested_.load(std::memory_order_relaxed)) {\n    xe::threading::Wait(emulator_thread_event_.get(), false);\n    while (true) {\n      emulator_->WaitUntilExit();\n      if (emulator_->TitleRequested()) {\n        emulator_->LaunchNextTitle();\n      } else {\n        break;\n      }\n    }\n  }\n}\n\nvoid EmulatorApp::ShutdownEmulatorThreadFromUIThread() {\n  // TODO(Triang3l): Proper shutdown of the emulator (relying on std::quick_exit\n  // for now) - currently WaitUntilExit loops forever otherwise (plus possibly\n  // lots of other things not shutting down correctly now). Some parts of the\n  // code call the regular std::exit, which seems to be calling destructors (at\n  // least on Linux), so the entire join is currently commented out.\n#if 0\n  // Same thread as the one created it, to make sure there's zero possibility of\n  // a race with the creation of the emulator thread.\n  assert_true(app_context().IsInUIThread());\n  emulator_thread_quit_requested_.store(true, std::memory_order_relaxed);\n  if (!emulator_thread_.joinable()) {\n    return;\n  }\n  emulator_thread_event_->Set();\n  emulator_thread_.join();\n#endif\n}\n\n}  // namespace app\n}  // namespace xe\n\nXE_DEFINE_WINDOWED_APP(xenia, xe::app::EmulatorApp::Create);\n"
  },
  {
    "path": "src/xenia/apu/apu_flags.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/apu/apu_flags.h\"\n\nDEFINE_bool(mute, false, \"Mutes all audio output.\", \"APU\")\n"
  },
  {
    "path": "src/xenia/apu/apu_flags.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_APU_APU_FLAGS_H_\n#define XENIA_APU_APU_FLAGS_H_\n\n#include \"xenia/base/cvar.h\"\nDECLARE_bool(mute)\n\n#endif  // XENIA_APU_APU_FLAGS_H_\n"
  },
  {
    "path": "src/xenia/apu/audio_driver.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/apu/audio_driver.h\"\n\nnamespace xe {\nnamespace apu {\n\nAudioDriver::AudioDriver(Memory* memory) : memory_(memory) {}\n\nAudioDriver::~AudioDriver() = default;\n\n}  // namespace apu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/apu/audio_driver.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_APU_AUDIO_DRIVER_H_\n#define XENIA_APU_AUDIO_DRIVER_H_\n\n#include \"xenia/memory.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace apu {\n\nclass AudioDriver {\n public:\n  explicit AudioDriver(Memory* memory);\n  virtual ~AudioDriver();\n\n  virtual void SubmitFrame(uint32_t samples_ptr) = 0;\n\n protected:\n  inline uint8_t* TranslatePhysical(uint32_t guest_address) const {\n    return memory_->TranslatePhysical(guest_address);\n  }\n\n  Memory* memory_ = nullptr;\n};\n\n}  // namespace apu\n}  // namespace xe\n\n#endif  // XENIA_APU_AUDIO_DRIVER_H_\n"
  },
  {
    "path": "src/xenia/apu/audio_system.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/apu/audio_system.h\"\n\n#include \"xenia/apu/apu_flags.h\"\n#include \"xenia/apu/audio_driver.h\"\n#include \"xenia/apu/xma_decoder.h\"\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/byte_stream.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/profiling.h\"\n#include \"xenia/base/ring_buffer.h\"\n#include \"xenia/base/string_buffer.h\"\n#include \"xenia/base/threading.h\"\n#include \"xenia/cpu/thread_state.h\"\n\n// As with normal Microsoft, there are like twelve different ways to access\n// the audio APIs. Early games use XMA*() methods almost exclusively to touch\n// decoders. Later games use XAudio*() and direct memory writes to the XMA\n// structures (as opposed to the XMA* calls), meaning that we have to support\n// both.\n//\n// For ease of implementation, most audio related processing is handled in\n// AudioSystem, and the functions here call off to it.\n// The XMA*() functions just manipulate the audio system in the guest context\n// and let the normal AudioSystem handling take it, to prevent duplicate\n// implementations. They can be found in xboxkrnl_audio_xma.cc\n\nnamespace xe {\nnamespace apu {\n\nAudioSystem::AudioSystem(cpu::Processor* processor)\n    : memory_(processor->memory()),\n      processor_(processor),\n      worker_running_(false) {\n  std::memset(clients_, 0, sizeof(clients_));\n\n  for (size_t i = 0; i < kMaximumClientCount; ++i) {\n    client_semaphores_[i] =\n        xe::threading::Semaphore::Create(0, kMaximumQueuedFrames);\n    assert_not_null(client_semaphores_[i]);\n    wait_handles_[i] = client_semaphores_[i].get();\n  }\n  shutdown_event_ = xe::threading::Event::CreateAutoResetEvent(false);\n  assert_not_null(shutdown_event_);\n  wait_handles_[kMaximumClientCount] = shutdown_event_.get();\n\n  xma_decoder_ = std::make_unique<xe::apu::XmaDecoder>(processor_);\n\n  resume_event_ = xe::threading::Event::CreateAutoResetEvent(false);\n  assert_not_null(resume_event_);\n}\n\nAudioSystem::~AudioSystem() {\n  if (xma_decoder_) {\n    xma_decoder_->Shutdown();\n  }\n}\n\nX_STATUS AudioSystem::Setup(kernel::KernelState* kernel_state) {\n  X_STATUS result = xma_decoder_->Setup(kernel_state);\n  if (result) {\n    return result;\n  }\n\n  worker_running_ = true;\n  worker_thread_ = kernel::object_ref<kernel::XHostThread>(\n      new kernel::XHostThread(kernel_state, 128 * 1024, 0, [this]() {\n        WorkerThreadMain();\n        return 0;\n      }));\n  // As we run audio callbacks the debugger must be able to suspend us.\n  worker_thread_->set_can_debugger_suspend(true);\n  worker_thread_->set_name(\"Audio Worker\");\n  worker_thread_->Create();\n\n  return X_STATUS_SUCCESS;\n}\n\nvoid AudioSystem::WorkerThreadMain() {\n  // Initialize driver and ringbuffer.\n  Initialize();\n\n  // Main run loop.\n  while (worker_running_) {\n    // These handles signify the number of submitted samples. Once we reach\n    // 64 samples, we wait until our audio backend releases a semaphore\n    // (signaling a sample has finished playing)\n    auto result =\n        xe::threading::WaitAny(wait_handles_, xe::countof(wait_handles_), true);\n    if (result.first == xe::threading::WaitResult::kFailed) {\n      // TODO: Assert?\n      continue;\n    }\n\n    if (result.first == threading::WaitResult::kSuccess &&\n        result.second == kMaximumClientCount) {\n      // Shutdown event signaled.\n      if (paused_) {\n        pause_fence_.Signal();\n        threading::Wait(resume_event_.get(), false);\n      }\n\n      continue;\n    }\n\n    // Number of clients pumped\n    bool pumped = false;\n    if (result.first == xe::threading::WaitResult::kSuccess) {\n      auto index = result.second;\n\n      auto global_lock = global_critical_region_.Acquire();\n      uint32_t client_callback = clients_[index].callback;\n      uint32_t client_callback_arg = clients_[index].wrapped_callback_arg;\n      global_lock.unlock();\n\n      if (client_callback) {\n        SCOPE_profile_cpu_i(\"apu\", \"xe::apu::AudioSystem->client_callback\");\n        uint64_t args[] = {client_callback_arg};\n        processor_->Execute(worker_thread_->thread_state(), client_callback,\n                            args, xe::countof(args));\n      }\n\n      pumped = true;\n    }\n\n    if (!worker_running_) {\n      break;\n    }\n\n    if (!pumped) {\n      SCOPE_profile_cpu_i(\"apu\", \"Sleep\");\n      xe::threading::Sleep(std::chrono::milliseconds(500));\n    }\n  }\n  worker_running_ = false;\n\n  // TODO(benvanik): call module API to kill?\n}\n\nint AudioSystem::FindFreeClient() {\n  for (int i = 0; i < kMaximumClientCount; i++) {\n    auto& client = clients_[i];\n    if (!client.in_use) {\n      return i;\n    }\n  }\n\n  return -1;\n}\n\nvoid AudioSystem::Initialize() {}\n\nvoid AudioSystem::Shutdown() {\n  worker_running_ = false;\n  shutdown_event_->Set();\n  if (worker_thread_) {\n    worker_thread_->Wait(0, 0, 0, nullptr);\n    worker_thread_.reset();\n  }\n}\n\nX_STATUS AudioSystem::RegisterClient(uint32_t callback, uint32_t callback_arg,\n                                     size_t* out_index) {\n  auto global_lock = global_critical_region_.Acquire();\n\n  auto index = FindFreeClient();\n  assert_true(index >= 0);\n\n  auto client_semaphore = client_semaphores_[index].get();\n  auto ret = client_semaphore->Release(kMaximumQueuedFrames, nullptr);\n  assert_true(ret);\n\n  AudioDriver* driver;\n  auto result = CreateDriver(index, client_semaphore, &driver);\n  if (XFAILED(result)) {\n    return result;\n  }\n  assert_not_null(driver);\n\n  uint32_t ptr = memory()->SystemHeapAlloc(0x4);\n  xe::store_and_swap<uint32_t>(memory()->TranslateVirtual(ptr), callback_arg);\n\n  clients_[index] = {driver, callback, callback_arg, ptr, true};\n\n  if (out_index) {\n    *out_index = index;\n  }\n\n  return X_STATUS_SUCCESS;\n}\n\nvoid AudioSystem::SubmitFrame(size_t index, uint32_t samples_ptr) {\n  SCOPE_profile_cpu_f(\"apu\");\n\n  auto global_lock = global_critical_region_.Acquire();\n  assert_true(index < kMaximumClientCount);\n  assert_true(clients_[index].driver != NULL);\n  (clients_[index].driver)->SubmitFrame(samples_ptr);\n}\n\nvoid AudioSystem::UnregisterClient(size_t index) {\n  SCOPE_profile_cpu_f(\"apu\");\n\n  auto global_lock = global_critical_region_.Acquire();\n  assert_true(index < kMaximumClientCount);\n  DestroyDriver(clients_[index].driver);\n  memory()->SystemHeapFree(clients_[index].wrapped_callback_arg);\n  clients_[index] = {0};\n\n  // Drain the semaphore of its count.\n  auto client_semaphore = client_semaphores_[index].get();\n  xe::threading::WaitResult wait_result;\n  do {\n    wait_result = xe::threading::Wait(client_semaphore, false,\n                                      std::chrono::milliseconds(0));\n  } while (wait_result == xe::threading::WaitResult::kSuccess);\n  assert_true(wait_result == xe::threading::WaitResult::kTimeout);\n}\n\nbool AudioSystem::Save(ByteStream* stream) {\n  stream->Write(kAudioSaveSignature);\n\n  // Count the number of used clients first.\n  // Any gaps should be handled gracefully.\n  uint32_t used_clients = 0;\n  for (int i = 0; i < kMaximumClientCount; i++) {\n    if (clients_[i].in_use) {\n      used_clients++;\n    }\n  }\n\n  stream->Write(used_clients);\n  for (uint32_t i = 0; i < kMaximumClientCount; i++) {\n    auto& client = clients_[i];\n    if (!client.in_use) {\n      continue;\n    }\n\n    stream->Write(i);\n    stream->Write(client.callback);\n    stream->Write(client.callback_arg);\n    stream->Write(client.wrapped_callback_arg);\n  }\n\n  return true;\n}\n\nbool AudioSystem::Restore(ByteStream* stream) {\n  if (stream->Read<uint32_t>() != kAudioSaveSignature) {\n    XELOGE(\"AudioSystem::Restore - Invalid magic value!\");\n    return false;\n  }\n\n  uint32_t num_clients = stream->Read<uint32_t>();\n  for (uint32_t i = 0; i < num_clients; i++) {\n    auto id = stream->Read<uint32_t>();\n    assert_true(id < kMaximumClientCount);\n\n    auto& client = clients_[id];\n\n    // Reset the semaphore and recreate the driver ourselves.\n    if (client.driver) {\n      UnregisterClient(id);\n    }\n\n    client.callback = stream->Read<uint32_t>();\n    client.callback_arg = stream->Read<uint32_t>();\n    client.wrapped_callback_arg = stream->Read<uint32_t>();\n\n    client.in_use = true;\n\n    auto client_semaphore = client_semaphores_[id].get();\n    auto ret = client_semaphore->Release(kMaximumQueuedFrames, nullptr);\n    assert_true(ret);\n\n    AudioDriver* driver = nullptr;\n    auto status = CreateDriver(id, client_semaphore, &driver);\n    if (XFAILED(status)) {\n      XELOGE(\n          \"AudioSystem::Restore - Call to CreateDriver failed with status \"\n          \"{:08X}\",\n          status);\n      return false;\n    }\n\n    assert_not_null(driver);\n    client.driver = driver;\n  }\n\n  return true;\n}\n\nvoid AudioSystem::Pause() {\n  if (paused_) {\n    return;\n  }\n  paused_ = true;\n\n  // Kind of a hack, but it works.\n  shutdown_event_->Set();\n  pause_fence_.Wait();\n\n  xma_decoder_->Pause();\n}\n\nvoid AudioSystem::Resume() {\n  if (!paused_) {\n    return;\n  }\n  paused_ = false;\n\n  resume_event_->Set();\n\n  xma_decoder_->Resume();\n}\n\n}  // namespace apu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/apu/audio_system.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_APU_AUDIO_SYSTEM_H_\n#define XENIA_APU_AUDIO_SYSTEM_H_\n\n#include <atomic>\n#include <queue>\n\n#include \"xenia/base/mutex.h\"\n#include \"xenia/base/threading.h\"\n#include \"xenia/cpu/processor.h\"\n#include \"xenia/kernel/xthread.h\"\n#include \"xenia/memory.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace apu {\n\nconstexpr fourcc_t kAudioSaveSignature = make_fourcc(\"XAUD\");\n\nclass AudioDriver;\nclass XmaDecoder;\n\nclass AudioSystem {\n public:\n  virtual ~AudioSystem();\n\n  Memory* memory() const { return memory_; }\n  cpu::Processor* processor() const { return processor_; }\n  XmaDecoder* xma_decoder() const { return xma_decoder_.get(); }\n\n  virtual X_STATUS Setup(kernel::KernelState* kernel_state);\n  virtual void Shutdown();\n\n  X_STATUS RegisterClient(uint32_t callback, uint32_t callback_arg,\n                          size_t* out_index);\n  void UnregisterClient(size_t index);\n  void SubmitFrame(size_t index, uint32_t samples_ptr);\n\n  bool Save(ByteStream* stream);\n  bool Restore(ByteStream* stream);\n\n  bool is_paused() const { return paused_; }\n  void Pause();\n  void Resume();\n\n protected:\n  explicit AudioSystem(cpu::Processor* processor);\n\n  virtual void Initialize();\n\n  void WorkerThreadMain();\n\n  virtual X_STATUS CreateDriver(size_t index,\n                                xe::threading::Semaphore* semaphore,\n                                AudioDriver** out_driver) = 0;\n  virtual void DestroyDriver(AudioDriver* driver) = 0;\n\n  // TODO(gibbed): respect XAUDIO2_MAX_QUEUED_BUFFERS somehow (ie min(64,\n  // XAUDIO2_MAX_QUEUED_BUFFERS))\n  static const size_t kMaximumQueuedFrames = 64;\n\n  Memory* memory_ = nullptr;\n  cpu::Processor* processor_ = nullptr;\n  std::unique_ptr<XmaDecoder> xma_decoder_;\n\n  std::atomic<bool> worker_running_ = {false};\n  kernel::object_ref<kernel::XHostThread> worker_thread_;\n\n  xe::global_critical_region global_critical_region_;\n  static const size_t kMaximumClientCount = 8;\n  struct {\n    AudioDriver* driver;\n    uint32_t callback;\n    uint32_t callback_arg;\n    uint32_t wrapped_callback_arg;\n    bool in_use;\n  } clients_[kMaximumClientCount];\n\n  int FindFreeClient();\n\n  std::unique_ptr<xe::threading::Semaphore>\n      client_semaphores_[kMaximumClientCount];\n  // Event is always there in case we have no clients.\n  std::unique_ptr<xe::threading::Event> shutdown_event_;\n  xe::threading::WaitHandle* wait_handles_[kMaximumClientCount + 1];\n\n  bool paused_ = false;\n  threading::Fence pause_fence_;\n  std::unique_ptr<threading::Event> resume_event_;\n};\n\n}  // namespace apu\n}  // namespace xe\n\n#endif  // XENIA_APU_AUDIO_SYSTEM_H_\n"
  },
  {
    "path": "src/xenia/apu/conversion.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_APU_CONVERSION_H_\n#define XENIA_APU_CONVERSION_H_\n\n#include <cstdint>\n\n#include \"xenia/base/byte_order.h\"\n#include \"xenia/base/platform.h\"\n\nnamespace xe {\nnamespace apu {\nnamespace conversion {\n\n#if XE_ARCH_AMD64\ninline void sequential_6_BE_to_interleaved_6_LE(float* output,\n                                                const float* input,\n                                                size_t ch_sample_count) {\n  const uint32_t* in = reinterpret_cast<const uint32_t*>(input);\n  uint32_t* out = reinterpret_cast<uint32_t*>(output);\n  const __m128i byte_swap_shuffle =\n      _mm_set_epi8(12, 13, 14, 15, 8, 9, 10, 11, 4, 5, 6, 7, 0, 1, 2, 3);\n  for (size_t sample = 0; sample < ch_sample_count; sample++) {\n    __m128i sample0 = _mm_set_epi32(\n        in[3 * ch_sample_count + sample], in[2 * ch_sample_count + sample],\n        in[1 * ch_sample_count + sample], in[0 * ch_sample_count + sample]);\n    uint32_t sample1 = in[4 * ch_sample_count + sample];\n    uint32_t sample2 = in[5 * ch_sample_count + sample];\n    sample0 = _mm_shuffle_epi8(sample0, byte_swap_shuffle);\n    _mm_storeu_si128(reinterpret_cast<__m128i*>(&out[sample * 6]), sample0);\n    sample1 = xe::byte_swap(sample1);\n    out[sample * 6 + 4] = sample1;\n    sample2 = xe::byte_swap(sample2);\n    out[sample * 6 + 5] = sample2;\n  }\n}\n\ninline void sequential_6_BE_to_interleaved_2_LE(float* output,\n                                                const float* input,\n                                                size_t ch_sample_count) {\n  assert_true(ch_sample_count % 4 == 0);\n  const uint32_t* in = reinterpret_cast<const uint32_t*>(input);\n  uint32_t* out = reinterpret_cast<uint32_t*>(output);\n  const __m128i byte_swap_shuffle =\n      _mm_set_epi8(12, 13, 14, 15, 8, 9, 10, 11, 4, 5, 6, 7, 0, 1, 2, 3);\n  const __m128 half = _mm_set1_ps(0.5f);\n  const __m128 two_fifths = _mm_set1_ps(1.0f / 2.5f);\n\n  // put center on left and right, discard low frequency\n  for (size_t sample = 0; sample < ch_sample_count; sample += 4) {\n    // load 4 samples from 6 channels each\n    __m128 fl = _mm_loadu_ps(&input[0 * ch_sample_count + sample]);\n    __m128 fr = _mm_loadu_ps(&input[1 * ch_sample_count + sample]);\n    __m128 fc = _mm_loadu_ps(&input[2 * ch_sample_count + sample]);\n    __m128 bl = _mm_loadu_ps(&input[4 * ch_sample_count + sample]);\n    __m128 br = _mm_loadu_ps(&input[5 * ch_sample_count + sample]);\n    // byte swap\n    fl = _mm_castsi128_ps(\n        _mm_shuffle_epi8(_mm_castps_si128(fl), byte_swap_shuffle));\n    fr = _mm_castsi128_ps(\n        _mm_shuffle_epi8(_mm_castps_si128(fr), byte_swap_shuffle));\n    fc = _mm_castsi128_ps(\n        _mm_shuffle_epi8(_mm_castps_si128(fc), byte_swap_shuffle));\n    bl = _mm_castsi128_ps(\n        _mm_shuffle_epi8(_mm_castps_si128(bl), byte_swap_shuffle));\n    br = _mm_castsi128_ps(\n        _mm_shuffle_epi8(_mm_castps_si128(br), byte_swap_shuffle));\n\n    __m128 center_halved = _mm_mul_ps(fc, half);\n    __m128 left = _mm_add_ps(_mm_add_ps(fl, bl), center_halved);\n    __m128 right = _mm_add_ps(_mm_add_ps(fr, br), center_halved);\n    left = _mm_mul_ps(left, two_fifths);\n    right = _mm_mul_ps(right, two_fifths);\n    _mm_storeu_ps(&output[sample * 2], _mm_unpacklo_ps(left, right));\n    _mm_storeu_ps(&output[(sample + 2) * 2], _mm_unpackhi_ps(left, right));\n  }\n}\n#else\ninline void sequential_6_BE_to_interleaved_6_LE(float* output,\n                                                const float* input,\n                                                size_t ch_sample_count) {\n  for (size_t sample = 0; sample < ch_sample_count; sample++) {\n    for (size_t channel = 0; channel < 6; channel++) {\n      output[sample * 6 + channel] =\n          xe::byte_swap(input[channel * ch_sample_count + sample]);\n    }\n  }\n}\ninline void sequential_6_BE_to_interleaved_2_LE(float* output,\n                                                const float* input,\n                                                size_t ch_sample_count) {\n  // Default 5.1 channel mapping is fl, fr, fc, lf, bl, br\n  // https://docs.microsoft.com/en-us/windows/win32/xaudio2/xaudio2-default-channel-mapping\n  for (size_t sample = 0; sample < ch_sample_count; sample++) {\n    // put center on left and right, discard low frequency\n    float fl = xe::byte_swap(input[0 * ch_sample_count + sample]);\n    float fr = xe::byte_swap(input[1 * ch_sample_count + sample]);\n    float fc = xe::byte_swap(input[2 * ch_sample_count + sample]);\n    float br = xe::byte_swap(input[4 * ch_sample_count + sample]);\n    float bl = xe::byte_swap(input[5 * ch_sample_count + sample]);\n    float center_halved = fc * 0.5f;\n    output[sample * 2] = (fl + bl + center_halved) * (1.0f / 2.5f);\n    output[sample * 2 + 1] = (fr + br + center_halved) * (1.0f / 2.5f);\n  }\n}\n#endif\n\n}  // namespace conversion\n}  // namespace apu\n}  // namespace xe\n\n#endif\n"
  },
  {
    "path": "src/xenia/apu/debug_visualizers.natvis",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<AutoVisualizer xmlns=\"http://schemas.microsoft.com/vstudio/debugger/natvis/2010\">\n\n  <!-- Shims -->\n  <Type Name=\"xe::apu::XmaContext\">\n    <DisplayString>id={id_}, allocated={is_allocated_}, enabled={is_enabled_}</DisplayString>\n  </Type>\n\n</AutoVisualizer>\n"
  },
  {
    "path": "src/xenia/apu/nop/nop_apu_flags.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/apu/nop/nop_apu_flags.h\"\n"
  },
  {
    "path": "src/xenia/apu/nop/nop_apu_flags.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_APU_NOP_NOP_APU_FLAGS_H_\n#define XENIA_APU_NOP_NOP_APU_FLAGS_H_\n\n#endif  // XENIA_APU_NOP_NOP_APU_FLAGS_H_\n"
  },
  {
    "path": "src/xenia/apu/nop/nop_audio_system.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/apu/nop/nop_audio_system.h\"\n\n#include \"xenia/apu/apu_flags.h\"\n\nnamespace xe {\nnamespace apu {\nnamespace nop {\n\nstd::unique_ptr<AudioSystem> NopAudioSystem::Create(cpu::Processor* processor) {\n  return std::make_unique<NopAudioSystem>(processor);\n}\n\nNopAudioSystem::NopAudioSystem(cpu::Processor* processor)\n    : AudioSystem(processor) {}\n\nNopAudioSystem::~NopAudioSystem() = default;\n\nX_STATUS NopAudioSystem::CreateDriver(size_t index,\n                                      xe::threading::Semaphore* semaphore,\n                                      AudioDriver** out_driver) {\n  return X_STATUS_NOT_IMPLEMENTED;\n}\n\nvoid NopAudioSystem::DestroyDriver(AudioDriver* driver) { assert_always(); }\n\n}  // namespace nop\n}  // namespace apu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/apu/nop/nop_audio_system.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_APU_NOP_NOP_AUDIO_SYSTEM_H_\n#define XENIA_APU_NOP_NOP_AUDIO_SYSTEM_H_\n\n#include \"xenia/apu/audio_system.h\"\n\nnamespace xe {\nnamespace apu {\nnamespace nop {\n\nclass NopAudioSystem : public AudioSystem {\n public:\n  explicit NopAudioSystem(cpu::Processor* processor);\n  ~NopAudioSystem() override;\n\n  static bool IsAvailable() { return true; }\n\n  static std::unique_ptr<AudioSystem> Create(cpu::Processor* processor);\n\n  X_STATUS CreateDriver(size_t index, xe::threading::Semaphore* semaphore,\n                        AudioDriver** out_driver) override;\n  void DestroyDriver(AudioDriver* driver) override;\n};\n\n}  // namespace nop\n}  // namespace apu\n}  // namespace xe\n\n#endif  // XENIA_APU_NOP_NOP_AUDIO_SYSTEM_H_\n"
  },
  {
    "path": "src/xenia/apu/nop/premake5.lua",
    "content": "project_root = \"../../../..\"\ninclude(project_root..\"/tools/build\")\n\ngroup(\"src\")\nproject(\"xenia-apu-nop\")\n  uuid(\"f37dbf3a-d200-4cc0-83f0-f801b1bdd862\")\n  kind(\"StaticLib\")\n  language(\"C++\")\n  links({\n    \"xenia-base\",\n    \"xenia-apu\",\n  })\n  defines({\n  })\n  local_platform_files()\n"
  },
  {
    "path": "src/xenia/apu/premake5.lua",
    "content": "project_root = \"../../..\"\ninclude(project_root..\"/tools/build\")\n\ngroup(\"src\")\nproject(\"xenia-apu\")\n  uuid(\"f4df01f0-50e4-4c67-8f54-61660696cc79\")\n  kind(\"StaticLib\")\n  language(\"C++\")\n  links({\n    \"libavcodec\",\n    \"libavutil\",\n    \"xenia-base\",\n  })\n  defines({\n  })\n  includedirs({\n    project_root..\"/third_party/FFmpeg/\",\n  })\n  local_platform_files()\n"
  },
  {
    "path": "src/xenia/apu/sdl/premake5.lua",
    "content": "project_root = \"../../../..\"\ninclude(project_root..\"/tools/build\")\n\ngroup(\"src\")\nproject(\"xenia-apu-sdl\")\n  uuid(\"153b4e8b-813a-40e6-9366-4b51abc73c45\")\n  kind(\"StaticLib\")\n  language(\"C++\")\n  links({\n    \"xenia-apu\",\n    \"xenia-base\",\n    \"xenia-helper-sdl\",\n    \"SDL2\",\n  })\n  defines({\n  })\n  local_platform_files()\n  sdl2_include()\n"
  },
  {
    "path": "src/xenia/apu/sdl/sdl_audio_driver.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/apu/sdl/sdl_audio_driver.h\"\n\n#include <array>\n#include <cstring>\n\n#include \"xenia/apu/apu_flags.h\"\n#include \"xenia/apu/conversion.h\"\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/profiling.h\"\n#include \"xenia/helper/sdl/sdl_helper.h\"\n\nnamespace xe {\nnamespace apu {\nnamespace sdl {\n\nSDLAudioDriver::SDLAudioDriver(Memory* memory,\n                               xe::threading::Semaphore* semaphore)\n    : AudioDriver(memory), semaphore_(semaphore) {}\n\nSDLAudioDriver::~SDLAudioDriver() {\n  assert_true(frames_queued_.empty());\n  assert_true(frames_unused_.empty());\n};\n\nbool SDLAudioDriver::Initialize() {\n  SDL_version ver = {};\n  SDL_GetVersion(&ver);\n  if ((ver.major < 2) || (ver.major == 2 && ver.minor == 0 && ver.patch < 8)) {\n    XELOGW(\n        \"SDL library version {}.{}.{} is outdated. \"\n        \"You may experience choppy audio.\",\n        ver.major, ver.minor, ver.patch);\n  }\n\n  if (!xe::helper::sdl::SDLHelper::Prepare()) {\n    return false;\n  }\n  if (SDL_InitSubSystem(SDL_INIT_AUDIO) < 0) {\n    return false;\n  }\n  sdl_initialized_ = true;\n\n  SDL_AudioSpec desired_spec = {};\n  SDL_AudioSpec obtained_spec;\n  desired_spec.freq = frame_frequency_;\n  desired_spec.format = AUDIO_F32;\n  desired_spec.channels = frame_channels_;\n  desired_spec.samples = channel_samples_;\n  desired_spec.callback = SDLCallback;\n  desired_spec.userdata = this;\n  // Allow the hardware to decide between 5.1 and stereo\n  int allowed_change = SDL_AUDIO_ALLOW_CHANNELS_CHANGE;\n  for (int i = 0; i < 2; i++) {\n    sdl_device_id_ = SDL_OpenAudioDevice(nullptr, 0, &desired_spec,\n                                         &obtained_spec, allowed_change);\n    if (sdl_device_id_ <= 0) {\n      XELOGE(\"SDL_OpenAudioDevice() failed.\");\n      return false;\n    }\n    if (obtained_spec.channels == 2 || obtained_spec.channels == 6) {\n      break;\n    }\n    // If the system is 4 or 7.1, let SDL convert\n    allowed_change = 0;\n    SDL_CloseAudioDevice(sdl_device_id_);\n    sdl_device_id_ = -1;\n  }\n  if (sdl_device_id_ <= 0) {\n    XELOGE(\"Failed to get a compatible SDL Audio Device.\");\n    return false;\n  }\n  sdl_device_channels_ = obtained_spec.channels;\n\n  SDL_PauseAudioDevice(sdl_device_id_, 0);\n\n  return true;\n}\n\nvoid SDLAudioDriver::SubmitFrame(uint32_t frame_ptr) {\n  const auto input_frame = memory_->TranslateVirtual<float*>(frame_ptr);\n  float* output_frame;\n  {\n    std::unique_lock<std::mutex> guard(frames_mutex_);\n    if (frames_unused_.empty()) {\n      output_frame = new float[frame_samples_];\n    } else {\n      output_frame = frames_unused_.top();\n      frames_unused_.pop();\n    }\n  }\n\n  std::memcpy(output_frame, input_frame, frame_samples_ * sizeof(float));\n\n  {\n    std::unique_lock<std::mutex> guard(frames_mutex_);\n    frames_queued_.push(output_frame);\n  }\n}\n\nvoid SDLAudioDriver::Shutdown() {\n  if (sdl_device_id_ > 0) {\n    SDL_CloseAudioDevice(sdl_device_id_);\n    sdl_device_id_ = -1;\n  }\n  if (sdl_initialized_) {\n    SDL_QuitSubSystem(SDL_INIT_AUDIO);\n    sdl_initialized_ = false;\n  }\n  std::unique_lock<std::mutex> guard(frames_mutex_);\n  while (!frames_unused_.empty()) {\n    delete[] frames_unused_.top();\n    frames_unused_.pop();\n  };\n  while (!frames_queued_.empty()) {\n    delete[] frames_queued_.front();\n    frames_queued_.pop();\n  };\n}\n\nvoid SDLAudioDriver::SDLCallback(void* userdata, Uint8* stream, int len) {\n  SCOPE_profile_cpu_f(\"apu\");\n  if (!userdata || !stream) {\n    XELOGE(\"SDLAudioDriver::sdl_callback called with nullptr.\");\n    return;\n  }\n  const auto driver = static_cast<SDLAudioDriver*>(userdata);\n  assert_true(len ==\n              sizeof(float) * channel_samples_ * driver->sdl_device_channels_);\n\n  std::unique_lock<std::mutex> guard(driver->frames_mutex_);\n  if (driver->frames_queued_.empty()) {\n    std::memset(stream, 0, len);\n  } else {\n    auto buffer = driver->frames_queued_.front();\n    driver->frames_queued_.pop();\n    if (cvars::mute) {\n      std::memset(stream, 0, len);\n    } else {\n      switch (driver->sdl_device_channels_) {\n        case 2:\n          conversion::sequential_6_BE_to_interleaved_2_LE(\n              reinterpret_cast<float*>(stream), buffer, channel_samples_);\n          break;\n        case 6:\n          conversion::sequential_6_BE_to_interleaved_6_LE(\n              reinterpret_cast<float*>(stream), buffer, channel_samples_);\n          break;\n        default:\n          assert_unhandled_case(driver->sdl_device_channels_);\n          break;\n      }\n    }\n    driver->frames_unused_.push(buffer);\n\n    auto ret = driver->semaphore_->Release(1, nullptr);\n    assert_true(ret);\n  }\n};\n}  // namespace sdl\n}  // namespace apu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/apu/sdl/sdl_audio_driver.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_APU_SDL_SDL_AUDIO_DRIVER_H_\n#define XENIA_APU_SDL_SDL_AUDIO_DRIVER_H_\n\n#include <mutex>\n#include <queue>\n#include <stack>\n\n#include \"SDL.h\"\n#include \"xenia/apu/audio_driver.h\"\n#include \"xenia/base/threading.h\"\n\nnamespace xe {\nnamespace apu {\nnamespace sdl {\n\nclass SDLAudioDriver : public AudioDriver {\n public:\n  SDLAudioDriver(Memory* memory, xe::threading::Semaphore* semaphore);\n  ~SDLAudioDriver() override;\n\n  bool Initialize();\n  void SubmitFrame(uint32_t frame_ptr) override;\n  void Shutdown();\n\n protected:\n  static void SDLCallback(void* userdata, Uint8* stream, int len);\n\n  xe::threading::Semaphore* semaphore_ = nullptr;\n\n  SDL_AudioDeviceID sdl_device_id_ = -1;\n  bool sdl_initialized_ = false;\n  uint8_t sdl_device_channels_ = 0;\n\n  static const uint32_t frame_frequency_ = 48000;\n  static const uint32_t frame_channels_ = 6;\n  static const uint32_t channel_samples_ = 256;\n  static const uint32_t frame_samples_ = frame_channels_ * channel_samples_;\n  static const uint32_t frame_size_ = sizeof(float) * frame_samples_;\n  std::queue<float*> frames_queued_ = {};\n  std::stack<float*> frames_unused_ = {};\n  std::mutex frames_mutex_ = {};\n};\n\n}  // namespace sdl\n}  // namespace apu\n}  // namespace xe\n\n#endif  // XENIA_APU_SDL_SDL_AUDIO_DRIVER_H_\n"
  },
  {
    "path": "src/xenia/apu/sdl/sdl_audio_system.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/apu/sdl/sdl_audio_system.h\"\n\n#include \"xenia/apu/apu_flags.h\"\n#include \"xenia/apu/sdl/sdl_audio_driver.h\"\n\nnamespace xe {\nnamespace apu {\nnamespace sdl {\n\nstd::unique_ptr<AudioSystem> SDLAudioSystem::Create(cpu::Processor* processor) {\n  return std::make_unique<SDLAudioSystem>(processor);\n}\n\nSDLAudioSystem::SDLAudioSystem(cpu::Processor* processor)\n    : AudioSystem(processor) {}\n\nSDLAudioSystem::~SDLAudioSystem() {}\n\nvoid SDLAudioSystem::Initialize() { AudioSystem::Initialize(); }\n\nX_STATUS SDLAudioSystem::CreateDriver(size_t index,\n                                      xe::threading::Semaphore* semaphore,\n                                      AudioDriver** out_driver) {\n  assert_not_null(out_driver);\n  auto driver = new SDLAudioDriver(memory_, semaphore);\n  if (!driver->Initialize()) {\n    driver->Shutdown();\n    return X_STATUS_UNSUCCESSFUL;\n  }\n\n  *out_driver = driver;\n  return X_STATUS_SUCCESS;\n}\n\nvoid SDLAudioSystem::DestroyDriver(AudioDriver* driver) {\n  assert_not_null(driver);\n  auto sdldriver = dynamic_cast<SDLAudioDriver*>(driver);\n  assert_not_null(sdldriver);\n  sdldriver->Shutdown();\n  delete sdldriver;\n}\n\n}  // namespace sdl\n}  // namespace apu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/apu/sdl/sdl_audio_system.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_APU_SDL_SDL_AUDIO_SYSTEM_H_\n#define XENIA_APU_SDL_SDL_AUDIO_SYSTEM_H_\n\n#include \"xenia/apu/audio_system.h\"\n\nnamespace xe {\nnamespace apu {\nnamespace sdl {\n\nclass SDLAudioSystem : public AudioSystem {\n public:\n  explicit SDLAudioSystem(cpu::Processor* processor);\n  ~SDLAudioSystem() override;\n\n  static bool IsAvailable() { return true; }\n\n  static std::unique_ptr<AudioSystem> Create(cpu::Processor* processor);\n\n  X_RESULT CreateDriver(size_t index, xe::threading::Semaphore* semaphore,\n                        AudioDriver** out_driver) override;\n  void DestroyDriver(AudioDriver* driver) override;\n\n protected:\n  void Initialize() override;\n};\n\n}  // namespace sdl\n}  // namespace apu\n}  // namespace xe\n\n#endif  // XENIA_APU_SDL_SDL_AUDIO_SYSTEM_H_\n"
  },
  {
    "path": "src/xenia/apu/xaudio2/premake5.lua",
    "content": "project_root = \"../../../..\"\ninclude(project_root..\"/tools/build\")\n\ngroup(\"src\")\nproject(\"xenia-apu-xaudio2\")\n  uuid(\"7a54a497-24d9-4c0e-a013-8507a04231f9\")\n  kind(\"StaticLib\")\n  language(\"C++\")\n  links({\n    \"xenia-base\",\n    \"xenia-apu\",\n  })\n  defines({\n  })\n  local_platform_files()\n"
  },
  {
    "path": "src/xenia/apu/xaudio2/xaudio2_api.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2019 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_APU_XAUDIO2_XAUDIO2_API_H_\n#define XENIA_APU_XAUDIO2_XAUDIO2_API_H_\n\n#include <Audioclient.h>\n\n#include \"xenia/base/platform_win.h\"\n\nnamespace xe {\nnamespace apu {\nnamespace xaudio2 {\nnamespace api {\n\n// Parts of XAudio2.h needed for Xenia. The header in the Windows SDK (for 2.8+)\n// or the DirectX SDK (for 2.7 and below) is for a single version that is chosen\n// for the target OS version at compile time, and cannot be useful for different\n// DLL versions.\n//\n// XAudio 2.8 is also not available on Windows 7, but including the 2.7 header\n// is complicated because it has the same name and include guard as the 2.8 one,\n// and also 2.7 is outdated - support already dropped in Microsoft Store apps,\n// for instance.\n//\n// Copyright (c) Microsoft Corporation.  All rights reserved.\n\nclass __declspec(uuid(\"5a508685-a254-4fba-9b82-9a24b00306af\")) XAudio2_7;\ninterface __declspec(uuid(\"8bcf1f58-9fe7-4583-8ac6-e2adc465c8bb\")) IXAudio2_7;\ninterface __declspec(uuid(\"60d8dac8-5aa1-4e8e-b597-2f5e2883d484\")) IXAudio2_8;\n\n#pragma pack(push, 1)\n\nstatic constexpr UINT32 XE_XAUDIO2_MAX_QUEUED_BUFFERS = 64;\nstatic constexpr float XE_XAUDIO2_MAX_FREQ_RATIO = 1024.0f;\nstatic constexpr float XE_XAUDIO2_DEFAULT_FREQ_RATIO = 2.0f;\n\nstatic constexpr UINT32 XE_XAUDIO2_COMMIT_NOW = 0;\nstatic constexpr UINT32 XE_XAUDIO2_NO_LOOP_REGION = 0;\nstatic constexpr UINT32 XE_XAUDIO2_DEFAULT_CHANNELS = 0;\nstatic constexpr UINT32 XE_XAUDIO2_DEFAULT_SAMPLERATE = 0;\n\n// 2.8+ only.\nstatic constexpr UINT32 XE_XAUDIO2_VOICE_NOSAMPLESPLAYED = 0x0100;\n\ninterface IXAudio2_7;\ninterface IXAudio2_8;\ninterface IXAudio2Voice;\ninterface IXAudio2_7SourceVoice;\ninterface IXAudio2_8SourceVoice;\ninterface IXAudio2SubmixVoice;\ninterface IXAudio2_7MasteringVoice;\ninterface IXAudio2_8MasteringVoice;\ninterface IXAudio2EngineCallback;\ninterface IXAudio2VoiceCallback;\n\ntypedef UINT32 XAUDIO2_PROCESSOR;\nstatic constexpr XAUDIO2_PROCESSOR XE_XAUDIO2_ANY_PROCESSOR = 0xFFFFFFFF;\nstatic constexpr XAUDIO2_PROCESSOR XE_XAUDIO2_7_DEFAULT_PROCESSOR =\n    XE_XAUDIO2_ANY_PROCESSOR;\nstatic constexpr XAUDIO2_PROCESSOR XE_XAUDIO2_8_DEFAULT_PROCESSOR = 0x00000001;\n\n// 2.7 only.\nstruct XAUDIO2_DEVICE_DETAILS;\n\nstruct XAUDIO2_VOICE_DETAILS;\nstruct XAUDIO2_VOICE_SENDS;\nstruct XAUDIO2_EFFECT_CHAIN;\nstruct XAUDIO2_FILTER_PARAMETERS;\n\nstruct XAUDIO2_BUFFER {\n  UINT32 Flags;\n  UINT32 AudioBytes;\n  const BYTE* pAudioData;\n  UINT32 PlayBegin;\n  UINT32 PlayLength;\n  UINT32 LoopBegin;\n  UINT32 LoopLength;\n  UINT32 LoopCount;\n  void* pContext;\n};\n\nstruct XAUDIO2_BUFFER_WMA;\n\nstruct XAUDIO2_VOICE_STATE {\n  void* pCurrentBufferContext;\n  UINT32 BuffersQueued;\n  UINT64 SamplesPlayed;\n};\n\nstruct XAUDIO2_PERFORMANCE_DATA;\n\nstruct XAUDIO2_DEBUG_CONFIGURATION {\n  UINT32 TraceMask;\n  UINT32 BreakMask;\n  BOOL LogThreadID;\n  BOOL LogFileline;\n  BOOL LogFunctionName;\n  BOOL LogTiming;\n};\n\nstatic constexpr UINT32 XE_XAUDIO2_LOG_ERRORS = 0x0001;\nstatic constexpr UINT32 XE_XAUDIO2_LOG_WARNINGS = 0x0002;\n\n// clang-format off\n\n// IXAudio2 2.7.\nDECLARE_INTERFACE_(IXAudio2_7, IUnknown) {\n  STDMETHOD(QueryInterface)(REFIID riid, void** ppvInterface) = 0;\n  STDMETHOD_(ULONG, AddRef)() = 0;\n  STDMETHOD_(ULONG, Release)() = 0;\n  // 2.7 only.\n  STDMETHOD(GetDeviceCount)(UINT32* pCount) = 0;\n  // 2.7 only.\n  STDMETHOD(GetDeviceDetails)(UINT32 Index,\n                              XAUDIO2_DEVICE_DETAILS* pDeviceDetails) = 0;\n  // 2.7 only.\n  STDMETHOD(Initialize)(\n      UINT32 Flags = 0,\n      XAUDIO2_PROCESSOR XAudio2Processor = XE_XAUDIO2_7_DEFAULT_PROCESSOR) = 0;\n  STDMETHOD(RegisterForCallbacks)(IXAudio2EngineCallback* pCallback) = 0;\n  STDMETHOD_(void, UnregisterForCallbacks)(\n      IXAudio2EngineCallback* pCallback) = 0;\n  STDMETHOD(CreateSourceVoice)(\n      IXAudio2_7SourceVoice** ppSourceVoice, const WAVEFORMATEX* pSourceFormat,\n      UINT32 Flags = 0, float MaxFrequencyRatio = XE_XAUDIO2_DEFAULT_FREQ_RATIO,\n      IXAudio2VoiceCallback* pCallback = nullptr,\n      const XAUDIO2_VOICE_SENDS* pSendList = nullptr,\n      const XAUDIO2_EFFECT_CHAIN* pEffectChain = nullptr) = 0;\n  STDMETHOD(CreateSubmixVoice)(\n      IXAudio2SubmixVoice** ppSubmixVoice, UINT32 InputChannels,\n      UINT32 InputSampleRate, UINT32 Flags = 0, UINT32 ProcessingStage = 0,\n      const XAUDIO2_VOICE_SENDS* pSendList = nullptr,\n      const XAUDIO2_EFFECT_CHAIN* pEffectChain = nullptr) = 0;\n  // 2.7: Device index instead of device ID, no stream category.\n  STDMETHOD(CreateMasteringVoice)(\n      IXAudio2_7MasteringVoice** ppMasteringVoice,\n      UINT32 InputChannels = XE_XAUDIO2_DEFAULT_CHANNELS,\n      UINT32 InputSampleRate = XE_XAUDIO2_DEFAULT_SAMPLERATE, UINT32 Flags = 0,\n      UINT32 DeviceIndex = 0,\n      const XAUDIO2_EFFECT_CHAIN* pEffectChain = nullptr) = 0;\n  STDMETHOD(StartEngine)() = 0;\n  STDMETHOD_(void, StopEngine)() = 0;\n  STDMETHOD(CommitChanges)(UINT32 OperationSet) = 0;\n  STDMETHOD_(void, GetPerformanceData)(XAUDIO2_PERFORMANCE_DATA* pPerfData) = 0;\n  STDMETHOD_(void, SetDebugConfiguration)(\n      const XAUDIO2_DEBUG_CONFIGURATION* pDebugConfiguration,\n      void* pReserved = nullptr) = 0;\n};\n\n// IXAudio2 2.8.\nDECLARE_INTERFACE_(IXAudio2_8, IUnknown) {\n  STDMETHOD(QueryInterface)(REFIID riid, void** ppvInterface) = 0;\n  STDMETHOD_(ULONG, AddRef)() = 0;\n  STDMETHOD_(ULONG, Release)() = 0;\n  // 2.8: No GetDeviceCount, GetDeviceDetails and Initialize.\n  STDMETHOD(RegisterForCallbacks)(IXAudio2EngineCallback* pCallback) = 0;\n  STDMETHOD_(void, UnregisterForCallbacks)(\n      IXAudio2EngineCallback* pCallback) = 0;\n  STDMETHOD(CreateSourceVoice)(\n      IXAudio2_8SourceVoice** ppSourceVoice, const WAVEFORMATEX* pSourceFormat,\n      UINT32 Flags = 0, float MaxFrequencyRatio = XE_XAUDIO2_DEFAULT_FREQ_RATIO,\n      IXAudio2VoiceCallback* pCallback = nullptr,\n      const XAUDIO2_VOICE_SENDS* pSendList = nullptr,\n      const XAUDIO2_EFFECT_CHAIN* pEffectChain = nullptr) = 0;\n  STDMETHOD(CreateSubmixVoice)(\n      IXAudio2SubmixVoice** ppSubmixVoice, UINT32 InputChannels,\n      UINT32 InputSampleRate, UINT32 Flags = 0, UINT32 ProcessingStage = 0,\n      const XAUDIO2_VOICE_SENDS* pSendList = nullptr,\n      const XAUDIO2_EFFECT_CHAIN* pEffectChain = nullptr) = 0;\n  // 2.8: Device ID instead of device index, added stream category.\n  STDMETHOD(CreateMasteringVoice)(\n      IXAudio2_8MasteringVoice** ppMasteringVoice,\n      UINT32 InputChannels = XE_XAUDIO2_DEFAULT_CHANNELS,\n      UINT32 InputSampleRate = XE_XAUDIO2_DEFAULT_SAMPLERATE, UINT32 Flags = 0,\n      LPCWSTR szDeviceId = nullptr,\n      const XAUDIO2_EFFECT_CHAIN* pEffectChain = nullptr,\n      AUDIO_STREAM_CATEGORY StreamCategory = AudioCategory_GameEffects) = 0;\n  STDMETHOD(StartEngine)() = 0;\n  STDMETHOD_(void, StopEngine)() = 0;\n  STDMETHOD(CommitChanges)(UINT32 OperationSet) = 0;\n  STDMETHOD_(void, GetPerformanceData)(XAUDIO2_PERFORMANCE_DATA* pPerfData) = 0;\n  STDMETHOD_(void, SetDebugConfiguration)(\n      const XAUDIO2_DEBUG_CONFIGURATION* pDebugConfiguration,\n      void* pReserved = nullptr) = 0;\n};\n\nDECLARE_INTERFACE(IXAudio2Voice) {\n#define XE_APU_XAUDIO2_API_DECLARE_IXAUDIO2VOICE_METHODS \\\n  STDMETHOD_(void, GetVoiceDetails)(XAUDIO2_VOICE_DETAILS* pVoiceDetails) = 0; \\\n  STDMETHOD(SetOutputVoices)(const XAUDIO2_VOICE_SENDS* pSendList) = 0; \\\n  STDMETHOD(SetEffectChain)(const XAUDIO2_EFFECT_CHAIN* pEffectChain) = 0; \\\n  STDMETHOD(EnableEffect)(UINT32 EffectIndex, \\\n                          UINT32 OperationSet = XE_XAUDIO2_COMMIT_NOW) = 0; \\\n  STDMETHOD(DisableEffect)(UINT32 EffectIndex, \\\n                           UINT32 OperationSet = XE_XAUDIO2_COMMIT_NOW) = 0; \\\n  STDMETHOD_(void, GetEffectState)(UINT32 EffectIndex, BOOL* pEnabled) = 0; \\\n  STDMETHOD(SetEffectParameters)( \\\n      UINT32 EffectIndex, const void* pParameters, UINT32 ParametersByteSize, \\\n      UINT32 OperationSet = XE_XAUDIO2_COMMIT_NOW) = 0; \\\n  STDMETHOD(GetEffectParameters)(UINT32 EffectIndex, void* pParameters, \\\n                                 UINT32 ParametersByteSize) = 0; \\\n  STDMETHOD(SetFilterParameters)( \\\n      const XAUDIO2_FILTER_PARAMETERS* pParameters, \\\n      UINT32 OperationSet = XE_XAUDIO2_COMMIT_NOW) = 0; \\\n  STDMETHOD_(void, GetFilterParameters)( \\\n      XAUDIO2_FILTER_PARAMETERS* pParameters) = 0; \\\n  STDMETHOD(SetOutputFilterParameters)( \\\n      IXAudio2Voice* pDestinationVoice, \\\n      const XAUDIO2_FILTER_PARAMETERS* pParameters, \\\n      UINT32 OperationSet = XE_XAUDIO2_COMMIT_NOW) = 0; \\\n  STDMETHOD_(void, GetOutputFilterParameters)( \\\n      IXAudio2Voice* pDestinationVoice, \\\n      XAUDIO2_FILTER_PARAMETERS* pParameters) = 0; \\\n  STDMETHOD(SetVolume)(float Volume, \\\n                       UINT32 OperationSet = XE_XAUDIO2_COMMIT_NOW) = 0; \\\n  STDMETHOD_(void, GetVolume)(float* pVolume) = 0; \\\n  STDMETHOD(SetChannelVolumes)( \\\n      UINT32 Channels, const float* pVolumes, \\\n      UINT32 OperationSet = XE_XAUDIO2_COMMIT_NOW) = 0; \\\n  STDMETHOD_(void, GetChannelVolumes)(UINT32 Channels, float* pVolumes) = 0; \\\n  STDMETHOD(SetOutputMatrix)(IXAudio2Voice* pDestinationVoice, \\\n                             UINT32 SourceChannels, \\\n                             UINT32 DestinationChannels, \\\n                             const float* pLevelMatrix, \\\n                             UINT32 OperationSet = XE_XAUDIO2_COMMIT_NOW) = 0; \\\n  STDMETHOD_(void, GetOutputMatrix)(IXAudio2Voice* pDestinationVoice, \\\n                                    UINT32 SourceChannels, \\\n                                    UINT32 DestinationChannels, \\\n                                    float* pLevelMatrix) = 0; \\\n  STDMETHOD_(void, DestroyVoice)() = 0;\n  XE_APU_XAUDIO2_API_DECLARE_IXAUDIO2VOICE_METHODS\n};\n\n// IXAudio2SourceVoice 2.7.\nDECLARE_INTERFACE_(IXAudio2_7SourceVoice, IXAudio2Voice) {\n  XE_APU_XAUDIO2_API_DECLARE_IXAUDIO2VOICE_METHODS\n  STDMETHOD(Start)(UINT32 Flags = 0,\n                   UINT32 OperationSet = XE_XAUDIO2_COMMIT_NOW) = 0;\n  STDMETHOD(Stop)(UINT32 Flags = 0,\n                  UINT32 OperationSet = XE_XAUDIO2_COMMIT_NOW) = 0;\n  STDMETHOD(SubmitSourceBuffer)(\n      const XAUDIO2_BUFFER* pBuffer,\n      const XAUDIO2_BUFFER_WMA* pBufferWMA = nullptr) = 0;\n  STDMETHOD(FlushSourceBuffers)() = 0;\n  STDMETHOD(Discontinuity)() = 0;\n  STDMETHOD(ExitLoop)(UINT32 OperationSet = XE_XAUDIO2_COMMIT_NOW) = 0;\n  // 2.7: No Flags.\n  STDMETHOD_(void, GetState)(XAUDIO2_VOICE_STATE* pVoiceState) = 0;\n  STDMETHOD(SetFrequencyRatio)(float Ratio,\n                               UINT32 OperationSet = XE_XAUDIO2_COMMIT_NOW) = 0;\n  STDMETHOD_(void, GetFrequencyRatio)(float* pRatio) = 0;\n  STDMETHOD(SetSourceSampleRate)(UINT32 NewSourceSampleRate) = 0;\n};\n\n// IXAudio2SourceVoice 2.8.\nDECLARE_INTERFACE_(IXAudio2_8SourceVoice, IXAudio2Voice) {\n  XE_APU_XAUDIO2_API_DECLARE_IXAUDIO2VOICE_METHODS\n  STDMETHOD(Start)(UINT32 Flags = 0,\n                   UINT32 OperationSet = XE_XAUDIO2_COMMIT_NOW) = 0;\n  STDMETHOD(Stop)(UINT32 Flags = 0,\n                  UINT32 OperationSet = XE_XAUDIO2_COMMIT_NOW) = 0;\n  STDMETHOD(SubmitSourceBuffer)(\n      const XAUDIO2_BUFFER* pBuffer,\n      const XAUDIO2_BUFFER_WMA* pBufferWMA = nullptr) = 0;\n  STDMETHOD(FlushSourceBuffers)() = 0;\n  STDMETHOD(Discontinuity)() = 0;\n  STDMETHOD(ExitLoop)(UINT32 OperationSet = XE_XAUDIO2_COMMIT_NOW) = 0;\n  // 2.8: Flags added.\n  STDMETHOD_(void, GetState)(XAUDIO2_VOICE_STATE* pVoiceState,\n                             UINT32 Flags = 0) = 0;\n  STDMETHOD(SetFrequencyRatio)(float Ratio,\n                               UINT32 OperationSet = XE_XAUDIO2_COMMIT_NOW) = 0;\n  STDMETHOD_(void, GetFrequencyRatio)(float* pRatio) = 0;\n  STDMETHOD(SetSourceSampleRate)(UINT32 NewSourceSampleRate) = 0;\n};\n\n// IXAudio2MasteringVoice 2.7.\nDECLARE_INTERFACE_(IXAudio2_7MasteringVoice, IXAudio2Voice) {\n  XE_APU_XAUDIO2_API_DECLARE_IXAUDIO2VOICE_METHODS\n  // 2.7: No GetChannelMask.\n};\n\n// IXAudio2MasteringVoice 2.8.\nDECLARE_INTERFACE_(IXAudio2_8MasteringVoice, IXAudio2Voice) {\n  XE_APU_XAUDIO2_API_DECLARE_IXAUDIO2VOICE_METHODS\n  // 2.8: GetChannelMask added.\n  STDMETHOD(GetChannelMask)(DWORD* pChannelmask) = 0;\n};\n\nDECLARE_INTERFACE(IXAudio2VoiceCallback) {\n  // Called just before this voice's processing pass begins.\n  STDMETHOD_(void, OnVoiceProcessingPassStart)(UINT32 BytesRequired) = 0;\n  STDMETHOD_(void, OnVoiceProcessingPassEnd)() = 0;\n  STDMETHOD_(void, OnStreamEnd)() = 0;\n  STDMETHOD_(void, OnBufferStart)(void* pBufferContext) = 0;\n  STDMETHOD_(void, OnBufferEnd)(void* pBufferContext) = 0;\n  STDMETHOD_(void, OnLoopEnd)(void* pBufferContext) = 0;\n  STDMETHOD_(void, OnVoiceError)(void* pBufferContext, HRESULT Error) = 0;\n};\n\n#pragma pack(pop)\n\n}  // namespace api\n}  // namespace xaudio2\n}  // namespace apu\n}  // namespace xe\n\n#endif  // XENIA_APU_XAUDIO2_XAUDIO2_API_H_\n"
  },
  {
    "path": "src/xenia/apu/xaudio2/xaudio2_apu_flags.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/apu/xaudio2/xaudio2_apu_flags.h\"\n"
  },
  {
    "path": "src/xenia/apu/xaudio2/xaudio2_apu_flags.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_APU_XAUDIO2_XAUDIO2_APU_FLAGS_H_\n#define XENIA_APU_XAUDIO2_XAUDIO2_APU_FLAGS_H_\n\n#endif  // XENIA_APU_XAUDIO2_XAUDIO2_APU_FLAGS_H_\n"
  },
  {
    "path": "src/xenia/apu/xaudio2/xaudio2_audio_driver.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/apu/xaudio2/xaudio2_audio_driver.h\"\n\n#include \"xenia/apu/apu_flags.h\"\n#include \"xenia/apu/conversion.h\"\n#include \"xenia/apu/xaudio2/xaudio2_api.h\"\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/clock.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/platform_win.h\"\n#include \"xenia/base/threading.h\"\n\nnamespace xe {\nnamespace apu {\nnamespace xaudio2 {\n\nclass XAudio2AudioDriver::VoiceCallback : public api::IXAudio2VoiceCallback {\n public:\n  explicit VoiceCallback(xe::threading::Semaphore* semaphore)\n      : semaphore_(semaphore) {}\n  ~VoiceCallback() {}\n\n  void OnStreamEnd() {}\n  void OnVoiceProcessingPassEnd() {}\n  void OnVoiceProcessingPassStart(uint32_t samples_required) {}\n  void OnBufferEnd(void* context) {\n    auto ret = semaphore_->Release(1, nullptr);\n    assert_true(ret);\n  }\n  void OnBufferStart(void* context) {}\n  void OnLoopEnd(void* context) {}\n  void OnVoiceError(void* context, HRESULT result) {}\n\n private:\n  xe::threading::Semaphore* semaphore_ = nullptr;\n};\n\nXAudio2AudioDriver::XAudio2AudioDriver(Memory* memory,\n                                       xe::threading::Semaphore* semaphore)\n    : AudioDriver(memory), semaphore_(semaphore) {}\n\nXAudio2AudioDriver::~XAudio2AudioDriver() = default;\n\nbool XAudio2AudioDriver::Initialize() {\n  voice_callback_ = new VoiceCallback(semaphore_);\n\n  // Load the XAudio2 DLL dynamically. Needed both for 2.7 and for\n  // differentiating between 2.8 and later versions. Windows 8.1 SDK references\n  // XAudio2_8.dll in xaudio2.lib, which is available on Windows 8.1, however,\n  // Windows 10 SDK references XAudio2_9.dll in it, which is only available in\n  // Windows 10, and XAudio2_8.dll is linked through a different .lib -\n  // xaudio2_8.lib, so easier not to link the .lib at all.\n  xaudio2_module_ = static_cast<void*>(LoadLibraryW(L\"XAudio2_8.dll\"));\n  if (xaudio2_module_) {\n    xaudio2_create_ = reinterpret_cast<decltype(xaudio2_create_)>(\n        GetProcAddress(static_cast<HMODULE>(xaudio2_module_), \"XAudio2Create\"));\n    if (xaudio2_create_) {\n      api_minor_version_ = 8;\n    } else {\n      XELOGE(\"XAudio2Create not found in XAudio2_8.dll\");\n      FreeLibrary(static_cast<HMODULE>(xaudio2_module_));\n      xaudio2_module_ = nullptr;\n    }\n  }\n  if (!xaudio2_module_) {\n    xaudio2_module_ = static_cast<void*>(LoadLibraryW(L\"XAudio2_7.dll\"));\n    if (xaudio2_module_) {\n      api_minor_version_ = 7;\n    } else {\n      XELOGE(\"Failed to load XAudio 2.8 or 2.7 library DLL\");\n      return false;\n    }\n  }\n\n  // We need to be able to accept frames from any non-STA thread - primarily\n  // from any guest thread, so MTA needs to be used. The AudioDriver, however,\n  // may be initialized from the UI thread, which has the STA concurrency model,\n  // or from another thread regardless of its concurrency model. So, all\n  // management of the objects needs to be performed in MTA. Launch the\n  // lifecycle management thread, which will handle initialization and shutdown,\n  // and also provide a scope for implicit MTA in threads that have never\n  // initialized COM explicitly, which lasts until all threads that have\n  // initialized MTA explicitly have uninitialized it - the thread that holds\n  // the MTA scope needs to be running while other threads are able to submit\n  // frames as they might have not initialized MTA explicitly.\n  // https://devblogs.microsoft.com/oldnewthing/?p=4613\n  // This is needed for both XAudio 2.7 (created via explicit CoCreateInstance)\n  // and 2.8 (using XAudio2Create, but still requiring CoInitializeEx).\n  // https://docs.microsoft.com/en-us/windows/win32/xaudio2/how-to--initialize-xaudio2\n  assert_false(mta_thread_.joinable());\n  mta_thread_initialization_attempt_completed_ = false;\n  mta_thread_shutdown_requested_ = false;\n  mta_thread_ = std::thread(&XAudio2AudioDriver::MTAThread, this);\n  {\n    std::unique_lock<std::mutex> mta_thread_initialization_completion_lock(\n        mta_thread_initialization_completion_mutex_);\n    while (true) {\n      if (mta_thread_initialization_attempt_completed_) {\n        break;\n      }\n      mta_thread_initialization_completion_cond_.wait(\n          mta_thread_initialization_completion_lock);\n    }\n  }\n  if (!mta_thread_initialization_completion_result_) {\n    mta_thread_.join();\n    return false;\n  }\n  return true;\n}\n\ntemplate <typename Objects>\nbool XAudio2AudioDriver::InitializeObjects(Objects& objects) {\n  HRESULT hr;\n\n  api::XAUDIO2_DEBUG_CONFIGURATION config;\n  config.TraceMask = api::XE_XAUDIO2_LOG_ERRORS | api::XE_XAUDIO2_LOG_WARNINGS;\n  config.BreakMask = 0;\n  config.LogThreadID = FALSE;\n  config.LogTiming = TRUE;\n  config.LogFunctionName = TRUE;\n  config.LogFileline = TRUE;\n  objects.audio->SetDebugConfiguration(&config);\n\n  hr = objects.audio->CreateMasteringVoice(&objects.mastering_voice);\n  if (FAILED(hr)) {\n    XELOGE(\"IXAudio2::CreateMasteringVoice failed with 0x{:08X}\", hr);\n    ShutdownObjects(objects);\n    return false;\n  }\n\n  WAVEFORMATIEEEFLOATEX waveformat;\n\n  waveformat.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE;\n  waveformat.Format.nChannels = frame_channels_;\n  waveformat.Format.nSamplesPerSec = 48000;\n  waveformat.Format.wBitsPerSample = 32;\n  waveformat.Format.nBlockAlign =\n      (waveformat.Format.nChannels * waveformat.Format.wBitsPerSample) / 8;\n  waveformat.Format.nAvgBytesPerSec =\n      waveformat.Format.nSamplesPerSec * waveformat.Format.nBlockAlign;\n  waveformat.Format.cbSize =\n      sizeof(WAVEFORMATIEEEFLOATEX) - sizeof(WAVEFORMATEX);\n\n  waveformat.SubFormat = KSDATAFORMAT_SUBTYPE_IEEE_FLOAT;\n  waveformat.Samples.wValidBitsPerSample = waveformat.Format.wBitsPerSample;\n  static const DWORD kChannelMasks[] = {\n      0,\n      0,\n      SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT,\n      0,\n      0,\n      0,\n      SPEAKER_FRONT_LEFT | SPEAKER_FRONT_CENTER | SPEAKER_FRONT_RIGHT |\n          SPEAKER_LOW_FREQUENCY | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT,\n      0,\n  };\n  waveformat.dwChannelMask = kChannelMasks[waveformat.Format.nChannels];\n\n  hr = objects.audio->CreateSourceVoice(\n      &objects.pcm_voice, &waveformat.Format,\n      0,  // api::XE_XAUDIO2_VOICE_NOSRC | api::XE_XAUDIO2_VOICE_NOPITCH,\n      api::XE_XAUDIO2_MAX_FREQ_RATIO, voice_callback_);\n  if (FAILED(hr)) {\n    XELOGE(\"IXAudio2::CreateSourceVoice failed with 0x{:08X}\", hr);\n    ShutdownObjects(objects);\n    return false;\n  }\n\n  hr = objects.pcm_voice->Start();\n  if (FAILED(hr)) {\n    XELOGE(\"IXAudio2SourceVoice::Start failed with 0x{:08X}\", hr);\n    ShutdownObjects(objects);\n    return false;\n  }\n\n  if (cvars::mute) {\n    objects.pcm_voice->SetVolume(0.0f);\n  }\n\n  return true;\n}\n\nvoid XAudio2AudioDriver::SubmitFrame(uint32_t frame_ptr) {\n  // Process samples! They are big-endian floats.\n  HRESULT hr;\n\n  api::XAUDIO2_VOICE_STATE state;\n  if (api_minor_version_ >= 8) {\n    objects_.api_2_8.pcm_voice->GetState(&state,\n                                         api::XE_XAUDIO2_VOICE_NOSAMPLESPLAYED);\n  } else {\n    objects_.api_2_7.pcm_voice->GetState(&state);\n  }\n  assert_true(state.BuffersQueued < frame_count_);\n\n  auto input_frame = memory_->TranslateVirtual<float*>(frame_ptr);\n  auto output_frame = reinterpret_cast<float*>(frames_[current_frame_]);\n  auto interleave_channels = frame_channels_;\n\n  // interleave the data\n  conversion::sequential_6_BE_to_interleaved_6_LE(output_frame, input_frame,\n                                                  channel_samples_);\n\n  api::XAUDIO2_BUFFER buffer;\n  buffer.Flags = 0;\n  buffer.pAudioData = reinterpret_cast<BYTE*>(output_frame);\n  buffer.AudioBytes = frame_size_;\n  buffer.PlayBegin = 0;\n  buffer.PlayLength = channel_samples_;\n  buffer.LoopBegin = api::XE_XAUDIO2_NO_LOOP_REGION;\n  buffer.LoopLength = 0;\n  buffer.LoopCount = 0;\n  buffer.pContext = 0;\n  if (api_minor_version_ >= 8) {\n    hr = objects_.api_2_8.pcm_voice->SubmitSourceBuffer(&buffer);\n  } else {\n    hr = objects_.api_2_7.pcm_voice->SubmitSourceBuffer(&buffer);\n  }\n  if (FAILED(hr)) {\n    XELOGE(\"SubmitSourceBuffer failed with 0x{:08X}\", hr);\n    return;\n  }\n\n  current_frame_ = (current_frame_ + 1) % frame_count_;\n\n  // Update playback ratio to our time scalar.\n  // This will keep audio in sync with the game clock.\n  float frequency_ratio = static_cast<float>(xe::Clock::guest_time_scalar());\n  if (api_minor_version_ >= 8) {\n    objects_.api_2_8.pcm_voice->SetFrequencyRatio(frequency_ratio);\n  } else {\n    objects_.api_2_7.pcm_voice->SetFrequencyRatio(frequency_ratio);\n  }\n}\n\nvoid XAudio2AudioDriver::Shutdown() {\n  // XAudio2 lifecycle is managed by the MTA thread.\n  if (mta_thread_.joinable()) {\n    {\n      std::unique_lock<std::mutex> mta_thread_shutdown_request_lock(\n          mta_thread_shutdown_request_mutex_);\n      mta_thread_shutdown_requested_ = true;\n    }\n    mta_thread_shutdown_request_cond_.notify_all();\n    mta_thread_.join();\n  }\n\n  xaudio2_create_ = nullptr;\n  if (xaudio2_module_) {\n    FreeLibrary(static_cast<HMODULE>(xaudio2_module_));\n    xaudio2_module_ = nullptr;\n  }\n\n  if (voice_callback_) {\n    delete voice_callback_;\n    voice_callback_ = nullptr;\n  }\n}\n\ntemplate <typename Objects>\nvoid XAudio2AudioDriver::ShutdownObjects(Objects& objects) {\n  if (objects.pcm_voice) {\n    objects.pcm_voice->Stop();\n    objects.pcm_voice->DestroyVoice();\n    objects.pcm_voice = nullptr;\n  }\n\n  if (objects.mastering_voice) {\n    objects.mastering_voice->DestroyVoice();\n    objects.mastering_voice = nullptr;\n  }\n\n  if (objects.audio) {\n    objects.audio->StopEngine();\n    objects.audio->Release();\n    objects.audio = nullptr;\n  }\n}\n\nvoid XAudio2AudioDriver::MTAThread() {\n  xe::threading::set_name(\"XAudio2 MTA\");\n\n  assert_false(mta_thread_initialization_attempt_completed_);\n\n  bool initialized = false;\n\n  // Initializing MTA COM in this thread, as well making other (guest) threads\n  // that don't explicitly call CoInitializeEx implicitly MTA for the period of\n  // time when they can interact with XAudio through the XAudio2AudioDriver,\n  // until the CoUninitialize (to be more precise, the CoUninitialize for the\n  // last remaining MTA thread, but we need implicit MTA for the audio here).\n  // https://devblogs.microsoft.com/oldnewthing/?p=4613\n  HRESULT hr = CoInitializeEx(nullptr, COINIT_MULTITHREADED);\n  bool com_initialized = SUCCEEDED(hr);\n  if (!com_initialized) {\n    XELOGE(\"XAudio2 MTA thread CoInitializeEx failed with 0x{:08X}\", hr);\n  } else {\n    if (api_minor_version_ >= 8) {\n      hr = xaudio2_create_(&objects_.api_2_8.audio, 0, kProcessor);\n      if (FAILED(hr)) {\n        XELOGE(\"XAudio2Create failed with 0x{:08X}\", hr);\n      } else {\n        initialized = InitializeObjects(objects_.api_2_8);\n      }\n    } else {\n      hr = CoCreateInstance(__uuidof(api::XAudio2_7), nullptr,\n                            CLSCTX_INPROC_SERVER,\n                            IID_PPV_ARGS(&objects_.api_2_7.audio));\n      if (FAILED(hr)) {\n        XELOGE(\"CoCreateInstance for XAudio2 failed with 0x{:08X}\", hr);\n      } else {\n        hr = objects_.api_2_7.audio->Initialize(0, kProcessor);\n        if (FAILED(hr)) {\n          XELOGE(\"IXAudio2::Initialize failed with 0x{:08X}\", hr);\n        } else {\n          initialized = InitializeObjects(objects_.api_2_7);\n        }\n      }\n    }\n  }\n\n  // Notify the threads waiting for the initialization of the result.\n  mta_thread_initialization_completion_result_ = initialized;\n  {\n    std::unique_lock<std::mutex> mta_thread_initialization_completion_lock(\n        mta_thread_initialization_completion_mutex_);\n    mta_thread_initialization_attempt_completed_ = true;\n  }\n  mta_thread_initialization_completion_cond_.notify_all();\n\n  if (initialized) {\n    // Initialized successfully, await a shutdown request while keeping an\n    // implicit COM MTA scope.\n    {\n      std::unique_lock<std::mutex> mta_thread_shutdown_request_lock(\n          mta_thread_shutdown_request_mutex_);\n      while (true) {\n        if (mta_thread_shutdown_requested_) {\n          break;\n        }\n        mta_thread_shutdown_request_cond_.wait(\n            mta_thread_shutdown_request_lock);\n      }\n    }\n\n    if (api_minor_version_ >= 8) {\n      ShutdownObjects(objects_.api_2_8);\n    } else {\n      ShutdownObjects(objects_.api_2_7);\n    }\n  }\n\n  if (com_initialized) {\n    CoUninitialize();\n  }\n}\n\n}  // namespace xaudio2\n}  // namespace apu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/apu/xaudio2/xaudio2_audio_driver.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_APU_XAUDIO2_XAUDIO2_AUDIO_DRIVER_H_\n#define XENIA_APU_XAUDIO2_XAUDIO2_AUDIO_DRIVER_H_\n\n#include <condition_variable>\n#include <mutex>\n#include <thread>\n\n#include \"xenia/apu/audio_driver.h\"\n#include \"xenia/apu/xaudio2/xaudio2_api.h\"\n#include \"xenia/base/platform.h\"\n#include \"xenia/base/threading.h\"\n\nstruct IXAudio2;\nstruct IXAudio2MasteringVoice;\nstruct IXAudio2SourceVoice;\n\nnamespace xe {\nnamespace apu {\nnamespace xaudio2 {\n\nclass XAudio2AudioDriver : public AudioDriver {\n public:\n  XAudio2AudioDriver(Memory* memory, xe::threading::Semaphore* semaphore);\n  ~XAudio2AudioDriver() override;\n\n  bool Initialize();\n  // Must not be called from COM STA threads as MTA XAudio2 will be used. It's\n  // fine to call this from threads that have never initialized COM as\n  // initializing MTA for any thread implicitly initializes it for all threads\n  // not explicitly requesting STA (until COM is uninitialized all threads that\n  // have initialized MTA).\n  // https://devblogs.microsoft.com/oldnewthing/?p=4613\n  void SubmitFrame(uint32_t frame_ptr) override;\n  void Shutdown();\n\n private:\n  // First CPU (2.8 default). XAUDIO2_ANY_PROCESSOR (2.7 default) steals too\n  // much time from other things. Ideally should process audio on what roughly\n  // represents thread 4 (5th) on the Xbox 360 (2.7 default on the console), or\n  // even beyond the 6 guest cores.\n  api::XAUDIO2_PROCESSOR kProcessor = 0x00000001;\n\n  // InitializeObjects and ShutdownObjects must be called only in the lifecycle\n  // management thread with COM MTA initialized.\n  template <typename Objects>\n  bool InitializeObjects(Objects& objects);\n  template <typename Objects>\n  void ShutdownObjects(Objects& objects);\n\n  void MTAThread();\n\n  void* xaudio2_module_ = nullptr;\n  // clang-format off\n  HRESULT (__stdcall* xaudio2_create_)(\n      api::IXAudio2_8** xaudio2_out, UINT32 flags,\n      api::XAUDIO2_PROCESSOR xaudio2_processor) = nullptr;\n  // clang-format on\n  uint32_t api_minor_version_ = 7;\n\n  bool mta_thread_initialization_completion_result_;\n  std::mutex mta_thread_initialization_completion_mutex_;\n  std::condition_variable mta_thread_initialization_completion_cond_;\n  bool mta_thread_initialization_attempt_completed_;\n\n  std::mutex mta_thread_shutdown_request_mutex_;\n  std::condition_variable mta_thread_shutdown_request_cond_;\n  bool mta_thread_shutdown_requested_;\n\n  std::thread mta_thread_;\n\n  union {\n    struct {\n      api::IXAudio2_7* audio;\n      api::IXAudio2_7MasteringVoice* mastering_voice;\n      api::IXAudio2_7SourceVoice* pcm_voice;\n    } api_2_7;\n    struct {\n      api::IXAudio2_8* audio;\n      api::IXAudio2_8MasteringVoice* mastering_voice;\n      api::IXAudio2_8SourceVoice* pcm_voice;\n    } api_2_8;\n  } objects_ = {};\n  xe::threading::Semaphore* semaphore_ = nullptr;\n\n  class VoiceCallback;\n  VoiceCallback* voice_callback_ = nullptr;\n\n  static const uint32_t frame_count_ = api::XE_XAUDIO2_MAX_QUEUED_BUFFERS;\n  static const uint32_t frame_channels_ = 6;\n  static const uint32_t channel_samples_ = 256;\n  static const uint32_t frame_samples_ = frame_channels_ * channel_samples_;\n  static const uint32_t frame_size_ = sizeof(float) * frame_samples_;\n  float frames_[frame_count_][frame_samples_];\n  uint32_t current_frame_ = 0;\n};\n\n}  // namespace xaudio2\n}  // namespace apu\n}  // namespace xe\n\n#endif  // XENIA_APU_XAUDIO2_XAUDIO2_AUDIO_DRIVER_H_\n"
  },
  {
    "path": "src/xenia/apu/xaudio2/xaudio2_audio_system.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/apu/xaudio2/xaudio2_audio_system.h\"\n\n#include \"xenia/apu/apu_flags.h\"\n#include \"xenia/apu/xaudio2/xaudio2_audio_driver.h\"\n\nnamespace xe {\nnamespace apu {\nnamespace xaudio2 {\n\nstd::unique_ptr<AudioSystem> XAudio2AudioSystem::Create(\n    cpu::Processor* processor) {\n  return std::make_unique<XAudio2AudioSystem>(processor);\n}\n\nXAudio2AudioSystem::XAudio2AudioSystem(cpu::Processor* processor)\n    : AudioSystem(processor) {}\n\nXAudio2AudioSystem::~XAudio2AudioSystem() {}\n\nvoid XAudio2AudioSystem::Initialize() { AudioSystem::Initialize(); }\n\nX_STATUS XAudio2AudioSystem::CreateDriver(size_t index,\n                                          xe::threading::Semaphore* semaphore,\n                                          AudioDriver** out_driver) {\n  assert_not_null(out_driver);\n  auto driver = new XAudio2AudioDriver(memory_, semaphore);\n  if (!driver->Initialize()) {\n    driver->Shutdown();\n    return X_STATUS_UNSUCCESSFUL;\n  }\n\n  *out_driver = driver;\n  return X_STATUS_SUCCESS;\n}\n\nvoid XAudio2AudioSystem::DestroyDriver(AudioDriver* driver) {\n  assert_not_null(driver);\n  auto xdriver = static_cast<XAudio2AudioDriver*>(driver);\n  xdriver->Shutdown();\n  assert_not_null(xdriver);\n  delete xdriver;\n}\n\n}  // namespace xaudio2\n}  // namespace apu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/apu/xaudio2/xaudio2_audio_system.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_APU_XAUDIO2_XAUDIO2_AUDIO_SYSTEM_H_\n#define XENIA_APU_XAUDIO2_XAUDIO2_AUDIO_SYSTEM_H_\n\n#include \"xenia/apu/audio_system.h\"\n\nnamespace xe {\nnamespace apu {\nnamespace xaudio2 {\n\nclass XAudio2AudioSystem : public AudioSystem {\n public:\n  explicit XAudio2AudioSystem(cpu::Processor* processor);\n  ~XAudio2AudioSystem() override;\n\n  static bool IsAvailable() { return true; }\n\n  static std::unique_ptr<AudioSystem> Create(cpu::Processor* processor);\n\n  X_RESULT CreateDriver(size_t index, xe::threading::Semaphore* semaphore,\n                        AudioDriver** out_driver) override;\n  void DestroyDriver(AudioDriver* driver) override;\n\n protected:\n  void Initialize() override;\n};\n\n}  // namespace xaudio2\n}  // namespace apu\n}  // namespace xe\n\n#endif  // XENIA_APU_XAUDIO2_XAUDIO2_AUDIO_SYSTEM_H_\n"
  },
  {
    "path": "src/xenia/apu/xma_context.cc",
    "content": "/**\n******************************************************************************\n* Xenia : Xbox 360 Emulator Research Project                                 *\n******************************************************************************\n* Copyright 2021 Ben Vanik. All rights reserved.                             *\n* Released under the BSD license - see LICENSE in the root for more details. *\n******************************************************************************\n*/\n\n#include \"xenia/apu/xma_context.h\"\n\n#include <algorithm>\n#include <cstring>\n\n#include \"xenia/apu/xma_decoder.h\"\n#include \"xenia/apu/xma_helpers.h\"\n#include \"xenia/base/bit_stream.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/platform.h\"\n#include \"xenia/base/profiling.h\"\n#include \"xenia/base/ring_buffer.h\"\n\nextern \"C\" {\n#if XE_COMPILER_MSVC\n#pragma warning(push)\n#pragma warning(disable : 4101 4244 5033)\n#endif\n#include \"third_party/FFmpeg/libavcodec/avcodec.h\"\n#if XE_COMPILER_MSVC\n#pragma warning(pop)\n#endif\n}  // extern \"C\"\n\n// Credits for most of this code goes to:\n// https://github.com/koolkdev/libertyv/blob/master/libav_wrapper/xma2dec.c\n\nnamespace xe {\nnamespace apu {\n\nXmaContext::XmaContext() = default;\n\nXmaContext::~XmaContext() {\n  if (av_context_) {\n    if (avcodec_is_open(av_context_)) {\n      avcodec_close(av_context_);\n    }\n    av_free(av_context_);\n  }\n  if (av_frame_) {\n    av_frame_free(&av_frame_);\n  }\n  // if (current_frame_) {\n  //   delete[] current_frame_;\n  //  }\n}\n\nint XmaContext::Setup(uint32_t id, Memory* memory, uint32_t guest_ptr) {\n  id_ = id;\n  memory_ = memory;\n  guest_ptr_ = guest_ptr;\n\n  // Allocate ffmpeg stuff:\n  av_packet_ = av_packet_alloc();\n  assert_not_null(av_packet_);\n\n  // find the XMA2 audio decoder\n  av_codec_ = avcodec_find_decoder(AV_CODEC_ID_XMAFRAMES);\n  if (!av_codec_) {\n    XELOGE(\"XmaContext {}: Codec not found\", id);\n    return 1;\n  }\n\n  av_context_ = avcodec_alloc_context3(av_codec_);\n  if (!av_context_) {\n    XELOGE(\"XmaContext {}: Couldn't allocate context\", id);\n    return 1;\n  }\n\n  // Initialize these to 0. They'll actually be set later.\n  av_context_->channels = 0;\n  av_context_->sample_rate = 0;\n\n  av_frame_ = av_frame_alloc();\n  if (!av_frame_) {\n    XELOGE(\"XmaContext {}: Couldn't allocate frame\", id);\n    return 1;\n  }\n\n  // FYI: We're purposely not opening the codec here. That is done later.\n  return 0;\n}\n\nbool XmaContext::Work() {\n  std::lock_guard<std::mutex> lock(lock_);\n  if (!is_allocated() || !is_enabled()) {\n    return false;\n  }\n\n  set_is_enabled(false);\n\n  auto context_ptr = memory()->TranslateVirtual(guest_ptr());\n  XMA_CONTEXT_DATA data(context_ptr);\n  Decode(&data);\n  data.Store(context_ptr);\n  return true;\n}\n\nvoid XmaContext::Enable() {\n  std::lock_guard<std::mutex> lock(lock_);\n\n  auto context_ptr = memory()->TranslateVirtual(guest_ptr());\n  XMA_CONTEXT_DATA data(context_ptr);\n\n  XELOGAPU(\"XmaContext: kicking context {} (buffer {} {}/{} bits)\", id(),\n           data.current_buffer, data.input_buffer_read_offset,\n           (data.current_buffer == 0 ? data.input_buffer_0_packet_count\n                                     : data.input_buffer_1_packet_count) *\n               kBitsPerPacket);\n\n  data.Store(context_ptr);\n\n  set_is_enabled(true);\n}\n\nbool XmaContext::Block(bool poll) {\n  if (!lock_.try_lock()) {\n    if (poll) {\n      return false;\n    }\n    lock_.lock();\n  }\n  lock_.unlock();\n  return true;\n}\n\nvoid XmaContext::Clear() {\n  std::lock_guard<std::mutex> lock(lock_);\n  XELOGAPU(\"XmaContext: reset context {}\", id());\n\n  auto context_ptr = memory()->TranslateVirtual(guest_ptr());\n  XMA_CONTEXT_DATA data(context_ptr);\n\n  data.input_buffer_0_valid = 0;\n  data.input_buffer_1_valid = 0;\n  data.output_buffer_valid = 0;\n\n  data.output_buffer_read_offset = 0;\n  data.output_buffer_write_offset = 0;\n\n  data.Store(context_ptr);\n}\n\nvoid XmaContext::Disable() {\n  std::lock_guard<std::mutex> lock(lock_);\n  XELOGAPU(\"XmaContext: disabling context {}\", id());\n  set_is_enabled(false);\n}\n\nvoid XmaContext::Release() {\n  // Lock it in case the decoder thread is working on it now.\n  std::lock_guard<std::mutex> lock(lock_);\n  assert_true(is_allocated_ == true);\n\n  set_is_allocated(false);\n  auto context_ptr = memory()->TranslateVirtual(guest_ptr());\n  std::memset(context_ptr, 0, sizeof(XMA_CONTEXT_DATA));  // Zero it.\n}\n\nvoid XmaContext::SwapInputBuffer(XMA_CONTEXT_DATA* data) {\n  // No more frames.\n  if (data->current_buffer == 0) {\n    data->input_buffer_0_valid = 0;\n  } else {\n    data->input_buffer_1_valid = 0;\n  }\n  data->current_buffer ^= 1;\n  data->input_buffer_read_offset = 0;\n}\n\nbool XmaContext::TrySetupNextLoop(XMA_CONTEXT_DATA* data,\n                                  bool ignore_input_buffer_offset) {\n  // Setup the input buffer offset if next loop exists.\n  // TODO(Pseudo-Kernel): Need to handle loop in the following cases.\n  // 1. loop_start == loop_end == 0\n  // 2. loop_start > loop_end && loop_count > 0\n  if (data->loop_count > 0 && data->loop_start < data->loop_end &&\n      (ignore_input_buffer_offset ||\n       data->input_buffer_read_offset >= data->loop_end)) {\n    // Loop back to the beginning.\n    data->input_buffer_read_offset = data->loop_start;\n    if (data->loop_count < 255) {\n      data->loop_count--;\n    }\n    return true;\n  }\n  return false;\n}\n\n/*\nvoid XmaContext::NextPacket(\n    uint8_t* input_buffer,\n    uint32_t input_size,\n    uint32_t input_buffer_read_offset) {\n*/\nvoid XmaContext::NextPacket(XMA_CONTEXT_DATA* data) {\n  // auto packet_idx = GetFramePacketNumber(input_buffer, input_size,\n  // input_buffer_read_offset);\n\n  // packet_idx++;\n  // if (packet_idx++ >= input_size)\n}\n\nint XmaContext::GetSampleRate(int id) {\n  switch (id) {\n    case 0:\n      return 24000;\n    case 1:\n      return 32000;\n    case 2:\n      return 44100;\n    case 3:\n      return 48000;\n  }\n  assert_always();\n  return 0;\n}\n\nbool XmaContext::ValidFrameOffset(uint8_t* block, size_t size_bytes,\n                                  size_t frame_offset_bits) {\n  uint32_t packet_num =\n      GetFramePacketNumber(block, size_bytes, frame_offset_bits);\n  if (packet_num == -1) {\n    // Invalid packet number\n    return false;\n  }\n\n  uint8_t* packet = block + (packet_num * kBytesPerPacket);\n  size_t relative_offset_bits = frame_offset_bits % kBitsPerPacket;\n\n  uint32_t first_frame_offset = xma::GetPacketFrameOffset(packet);\n  if (first_frame_offset == -1 || first_frame_offset > kBitsPerPacket) {\n    // Packet only contains a partial frame, so no frames can start here.\n    return false;\n  }\n\n  BitStream stream(packet, kBitsPerPacket);\n  stream.SetOffset(first_frame_offset);\n  while (true) {\n    if (stream.offset_bits() == relative_offset_bits) {\n      return true;\n    }\n\n    if (stream.BitsRemaining() < 15) {\n      // Not enough room for another frame header.\n      return false;\n    }\n\n    uint64_t size = stream.Read(15);\n    if ((size - 15) > stream.BitsRemaining()) {\n      // Last frame.\n      return false;\n    } else if (size == 0x7FFF) {\n      // Invalid frame (and last of this packet)\n      return false;\n    }\n\n    stream.Advance(size - 16);\n\n    // Read the trailing bit to see if frames follow\n    if (stream.Read(1) == 0) {\n      break;\n    }\n  }\n\n  return false;\n}\n\nstatic void dump_raw(AVFrame* frame, int id) {\n  FILE* outfile = fopen(fmt::format(\"out{}.raw\", id).c_str(), \"ab\");\n  if (!outfile) {\n    return;\n  }\n  size_t data_size = sizeof(float);\n  for (int i = 0; i < frame->nb_samples; i++) {\n    for (int ch = 0; ch < frame->channels; ch++) {\n      fwrite(frame->data[ch] + data_size * i, 1, data_size, outfile);\n    }\n  }\n  fclose(outfile);\n}\n\nvoid XmaContext::Decode(XMA_CONTEXT_DATA* data) {\n  SCOPE_profile_cpu_f(\"apu\");\n\n  // What I see:\n  // XMA outputs 2 bytes per sample\n  // 512 samples per frame (128 per subframe)\n  // Max output size is data.output_buffer_block_count * 256\n\n  // This decoder is fed packets (max 4095 per buffer)\n  // Packets contain \"some\" frames\n  // 32bit header (big endian)\n\n  // Frames are the smallest thing the SPUs can decode.\n  // They can and usually will span packets.\n\n  // Sample rates (data.sample_rate):\n  // 0 - 24 kHz\n  // 1 - 32 kHz\n  // 2 - 44.1 kHz\n  // 3 - 48 kHz\n\n  // SPUs also support stereo decoding. (data.is_stereo)\n\n  // Check the output buffer - we cannot decode anything else if it's\n  // unavailable.\n  if (!data->output_buffer_valid) {\n    return;\n  }\n\n  // No available data.\n  if (!data->input_buffer_0_valid && !data->input_buffer_1_valid) {\n    data->output_buffer_valid = 0;\n    return;\n  }\n\n  // XAudio Loops\n  // loop_count:\n  //  - XAUDIO2_MAX_LOOP_COUNT = 254\n  //  - XAUDIO2_LOOP_INFINITE = 255\n  // loop_start/loop_end are bit offsets to a specific frame\n\n  // Translate pointers for future use.\n  // Sometimes the game will use rolling input buffers. If they do, we cannot\n  // assume they form a complete block! In addition, the buffers DO NOT have\n  // to be contiguous!\n  uint8_t* in0 = data->input_buffer_0_valid\n                     ? memory()->TranslatePhysical(data->input_buffer_0_ptr)\n                     : nullptr;\n  uint8_t* in1 = data->input_buffer_1_valid\n                     ? memory()->TranslatePhysical(data->input_buffer_1_ptr)\n                     : nullptr;\n  uint8_t* current_input_buffer = data->current_buffer ? in1 : in0;\n\n  XELOGAPU(\"Processing context {} (offset {}, buffer {}, ptr {:p})\", id(),\n           data->input_buffer_read_offset, data->current_buffer,\n           current_input_buffer);\n\n  size_t input_buffer_0_size =\n      data->input_buffer_0_packet_count * kBytesPerPacket;\n  size_t input_buffer_1_size =\n      data->input_buffer_1_packet_count * kBytesPerPacket;\n  size_t input_total_size = input_buffer_0_size + input_buffer_1_size;\n\n  size_t current_input_size =\n      data->current_buffer ? input_buffer_1_size : input_buffer_0_size;\n  size_t current_input_packet_count = current_input_size / kBytesPerPacket;\n\n  // Output buffers are in raw PCM samples, 256 bytes per block.\n  // Output buffer is a ring buffer. We need to write from the write offset\n  // to the read offset.\n  uint8_t* output_buffer = memory()->TranslatePhysical(data->output_buffer_ptr);\n  uint32_t output_capacity =\n      data->output_buffer_block_count * kBytesPerSubframeChannel;\n  uint32_t output_read_offset =\n      data->output_buffer_read_offset * kBytesPerSubframeChannel;\n  uint32_t output_write_offset =\n      data->output_buffer_write_offset * kBytesPerSubframeChannel;\n\n  RingBuffer output_rb(output_buffer, output_capacity);\n  output_rb.set_read_offset(output_read_offset);\n  output_rb.set_write_offset(output_write_offset);\n\n  // We can only decode an entire frame and write it out at a time, so\n  // don't save any samples.\n  // TODO(JoelLinn): subframes when looping\n  size_t output_remaining_bytes = output_rb.write_count();\n  output_remaining_bytes -=\n      output_remaining_bytes % (kBytesPerFrameChannel << data->is_stereo);\n\n  // is_dirty_ = true; // TODO\n  // is_dirty_ = false;  // TODO\n  assert_false(data->stop_when_done);\n  assert_false(data->interrupt_when_done);\n  static int total_samples = 0;\n  bool reuse_input_buffer = false;\n  // Decode until we can't write any more data.\n  while (output_remaining_bytes > 0) {\n    if (!data->input_buffer_0_valid && !data->input_buffer_1_valid) {\n      // Out of data.\n      break;\n    }\n\n    // Setup the input buffer if we are at loop_end.\n    // The input buffer must not be swapped out until all loops are processed.\n    reuse_input_buffer = TrySetupNextLoop(data, false);\n\n    // assert_true(packets_skip_ == 0);\n    // assert_true(split_frame_len_ == 0);\n    // assert_true(split_frame_len_partial_ == 0);\n\n    // Where are we in the buffer (in XMA jargon)\n    int packet_idx, frame_idx, frame_count;\n    uint8_t* packet;\n    bool frame_last_split;\n\n    BitStream stream(current_input_buffer, current_input_size * 8);\n    stream.SetOffset(data->input_buffer_read_offset);\n\n    // if we had a buffer swap try to skip packets first\n    if (packets_skip_ > 0) {\n      packet_idx =\n          GetFramePacketNumber(current_input_buffer, current_input_size,\n                               data->input_buffer_read_offset);\n      while (packets_skip_ > 0) {\n        packets_skip_--;\n        packet_idx++;\n        if (packet_idx >= current_input_packet_count) {\n          if (!reuse_input_buffer) {\n            // Last packet. Try setup once more.\n            reuse_input_buffer = TrySetupNextLoop(data, true);\n          }\n          if (!reuse_input_buffer) {\n            SwapInputBuffer(data);\n          }\n          return;\n        }\n      }\n      // invalid frame pointer but needed for us\n      data->input_buffer_read_offset = packet_idx * kBitsPerPacket;\n      // continue;\n    }\n\n    if (split_frame_len_) {\n      // handle a frame that was split over two packages\n      packet_idx =\n          GetFramePacketNumber(current_input_buffer, current_input_size,\n                               data->input_buffer_read_offset);\n      packet = current_input_buffer + packet_idx * kBytesPerPacket;\n      std::tie(frame_count, frame_last_split) = GetPacketFrameCount(packet);\n      frame_idx = -1;\n\n      stream =\n          BitStream(current_input_buffer, (packet_idx + 1) * kBitsPerPacket);\n      stream.SetOffset(packet_idx * kBitsPerPacket + 32);\n\n      if (split_frame_len_ > xma::kMaxFrameLength) {\n        // TODO write CopyPeekMethod\n        auto offset = stream.offset_bits();\n        stream.Copy(\n            xma_frame_.data() + 1 +\n                ((split_frame_len_partial_ + split_frame_padding_start_) / 8),\n            15 - split_frame_len_partial_);\n        stream.SetOffset(offset);\n        BitStream slen(xma_frame_.data() + 1, 15 + split_frame_padding_start_);\n        slen.Advance(split_frame_padding_start_);\n        split_frame_len_ = static_cast<int>(slen.Read(15));\n      }\n\n      if (frame_count > 0) {\n        assert_true(xma::GetPacketFrameOffset(packet) - 32 ==\n                    split_frame_len_ - split_frame_len_partial_);\n      }\n\n      auto offset = stream.Copy(\n          xma_frame_.data() + 1 +\n              ((split_frame_len_partial_ + split_frame_padding_start_) / 8),\n          split_frame_len_ - split_frame_len_partial_);\n      assert_true(offset ==\n                  (split_frame_padding_start_ + split_frame_len_partial_) % 8);\n    } else {\n      if (data->input_buffer_read_offset % kBitsPerPacket == 0) {\n        // Invalid offset. Go ahead and set it.\n        int packet_number =\n            GetFramePacketNumber(current_input_buffer, current_input_size,\n                                 data->input_buffer_read_offset);\n\n        if (packet_number == -1) {\n          return;\n        }\n\n        auto offset =\n            xma::GetPacketFrameOffset(current_input_buffer +\n                                      kBytesPerPacket * packet_number) +\n            data->input_buffer_read_offset;\n        if (offset == -1) {\n          // No more frames.\n          SwapInputBuffer(data);\n          // TODO partial frames? end?\n          XELOGE(\"XmaContext {}: TODO partial frames? end?\", id());\n          assert_always(\"TODO\");\n          return;\n        } else {\n          data->input_buffer_read_offset = offset;\n        }\n      }\n\n      if (!ValidFrameOffset(current_input_buffer, current_input_size,\n                            data->input_buffer_read_offset)) {\n        XELOGAPU(\"XmaContext {}: Invalid read offset {}!\", id(),\n                 data->input_buffer_read_offset);\n        SwapInputBuffer(data);\n        return;\n      }\n\n      // Where are we in the buffer (in XMA jargon)\n      std::tie(packet_idx, frame_idx) =\n          GetFrameNumber(current_input_buffer, current_input_size,\n                         data->input_buffer_read_offset);\n      // TODO handle\n      assert_true(packet_idx >= 0);\n      assert_true(frame_idx >= 0);\n      packet = current_input_buffer + packet_idx * kBytesPerPacket;\n      // frames that belong to this packet\n      std::tie(frame_count, frame_last_split) = GetPacketFrameCount(packet);\n      assert_true(frame_count >= 0);  // TODO end\n\n      PrepareDecoder(packet, data->sample_rate, bool(data->is_stereo));\n\n      // Current frame is split to next packet:\n      bool frame_is_split = frame_last_split && (frame_idx >= frame_count - 1);\n\n      stream =\n          BitStream(current_input_buffer, (packet_idx + 1) * kBitsPerPacket);\n      stream.SetOffset(data->input_buffer_read_offset);\n      // int frame_len;\n      // int frame_len_partial\n      split_frame_len_partial_ = static_cast<int>(stream.BitsRemaining());\n      if (split_frame_len_partial_ >= 15) {\n        split_frame_len_ = static_cast<int>(stream.Peek(15));\n      } else {\n        // assert_always();\n        split_frame_len_ = xma::kMaxFrameLength + 1;\n      }\n      assert_true(frame_is_split ==\n                  (split_frame_len_ > split_frame_len_partial_));\n\n      // TODO fix bitstream copy\n      std::memset(xma_frame_.data(), 0, xma_frame_.size());\n\n      {\n        auto offset =\n            stream.Copy(xma_frame_.data() + 1,\n                        std::min(split_frame_len_, split_frame_len_partial_));\n        assert_true(offset < 8);\n        split_frame_padding_start_ = static_cast<uint8_t>(offset);\n      }\n\n      if (frame_is_split) {\n        // go to next xma packet of this stream\n        packets_skip_ = xma::GetPacketSkipCount(packet) + 1;\n        while (packets_skip_ > 0) {\n          packets_skip_--;\n          packet += kBytesPerPacket;\n          packet_idx++;\n          if (packet_idx >= current_input_packet_count) {\n            if (!reuse_input_buffer) {\n              // Last packet. Try setup once more.\n              reuse_input_buffer = TrySetupNextLoop(data, true);\n            }\n            if (!reuse_input_buffer) {\n              SwapInputBuffer(data);\n            }\n            return;\n          }\n        }\n        // TODO guest might read this:\n        data->input_buffer_read_offset = packet_idx * kBitsPerPacket;\n        continue;\n      }\n    }\n\n    av_packet_->data = xma_frame_.data();\n    av_packet_->size = static_cast<int>(\n        1 + ((split_frame_padding_start_ + split_frame_len_) / 8) +\n        (((split_frame_padding_start_ + split_frame_len_) % 8) ? 1 : 0));\n\n    auto padding_end = av_packet_->size * 8 -\n                       (8 + split_frame_padding_start_ + split_frame_len_);\n    assert_true(padding_end < 8);\n    xma_frame_[0] =\n        ((split_frame_padding_start_ & 7) << 5) | ((padding_end & 7) << 2);\n\n    split_frame_len_ = 0;\n    split_frame_len_partial_ = 0;\n    split_frame_padding_start_ = 0;\n\n    auto ret = avcodec_send_packet(av_context_, av_packet_);\n    if (ret < 0) {\n      XELOGE(\"XmaContext {}: Error sending packet for decoding\", id());\n      // TODO bail out\n      assert_always();\n    }\n    ret = avcodec_receive_frame(av_context_, av_frame_);\n    /*\n    if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)\n      // TODO AVERROR_EOF???\n      break;\n    else\n    */\n    if (ret < 0) {\n      XELOGE(\"XmaContext {}: Error during decoding\", id());\n      assert_always();\n      return;  // TODO bail out\n    }\n    assert_true(ret == 0);\n\n    {\n      // copy over 1 frame\n      // update input buffer read offset\n\n      // assert(decoded_consumed_samples_ + kSamplesPerFrame <=\n      //       current_frame_.size());\n      assert_true(av_context_->sample_fmt == AV_SAMPLE_FMT_FLTP);\n      // assert_true(frame_is_split == (frame_idx == -1));\n\n      //\t\t\tdump_raw(av_frame_, id());\n      ConvertFrame((const uint8_t**)av_frame_->data, bool(data->is_stereo),\n                   raw_frame_.data());\n      // decoded_consumed_samples_ += kSamplesPerFrame;\n\n      auto byte_count = kBytesPerFrameChannel << data->is_stereo;\n      assert_true(output_remaining_bytes >= byte_count);\n      output_rb.Write(raw_frame_.data(), byte_count);\n      output_remaining_bytes -= byte_count;\n      data->output_buffer_write_offset = output_rb.write_offset() / 256;\n\n      total_samples += id_ == 0 ? kSamplesPerFrame : 0;\n\n      uint32_t offset = data->input_buffer_read_offset;\n      // if (offset % (kBytesPerSample * 8) == 0) {\n      //  offset = xma::GetPacketFrameOffset(packet);\n      //}\n      offset = static_cast<uint32_t>(\n          GetNextFrame(current_input_buffer, current_input_size, offset));\n      // assert_true((offset == 0) ==\n      //            (frame_is_split || (frame_idx + 1 >= frame_count)));\n      if (frame_idx + 1 >= frame_count) {\n        // Skip to next packet (no split frame)\n        packets_skip_ = xma::GetPacketSkipCount(packet) + 1;\n        while (packets_skip_ > 0) {\n          packets_skip_--;\n          packet_idx++;\n          if (packet_idx >= current_input_packet_count) {\n            if (!reuse_input_buffer) {\n              // Last packet. Try setup once more.\n              reuse_input_buffer = TrySetupNextLoop(data, true);\n            }\n            if (!reuse_input_buffer) {\n              SwapInputBuffer(data);\n            }\n            return;\n          }\n        }\n        packet = current_input_buffer + packet_idx * kBytesPerPacket;\n        offset =\n            xma::GetPacketFrameOffset(packet) + packet_idx * kBitsPerPacket;\n      }\n      if (offset == 0 || frame_idx == -1) {\n        // Next packet but we already skipped to it\n        if (packet_idx >= current_input_packet_count) {\n          // Buffer is fully used\n          if (!reuse_input_buffer) {\n            // Last packet. Try setup once more.\n            reuse_input_buffer = TrySetupNextLoop(data, true);\n          }\n          if (!reuse_input_buffer) {\n            SwapInputBuffer(data);\n          }\n          break;\n        }\n        offset =\n            xma::GetPacketFrameOffset(packet) + packet_idx * kBitsPerPacket;\n      }\n      // TODO buffer bounds check\n      assert_true(data->input_buffer_read_offset < offset);\n      data->input_buffer_read_offset = offset;\n    }\n  }\n\n  // assert_true((split_frame_len_ != 0) == (data->input_buffer_read_offset ==\n  // 0));\n\n  // The game will kick us again with a new output buffer later.\n  // It's important that we only invalidate this if we actually wrote to it!!\n  if (output_rb.write_offset() == output_rb.read_offset()) {\n    data->output_buffer_valid = 0;\n  }\n}\n\nsize_t XmaContext::GetNextFrame(uint8_t* block, size_t size,\n                                size_t bit_offset) {\n  // offset = xma::GetPacketFrameOffset(packet);\n  // TODO meh\n  // auto next_packet = bit_offset - bit_offset % kBitsPerPacket +\n  // kBitsPerPacket;\n  auto packet_idx = GetFramePacketNumber(block, size, bit_offset);\n\n  BitStream stream(block, size * 8);\n  stream.SetOffset(bit_offset);\n\n  if (stream.BitsRemaining() < 15) {\n    return 0;\n  }\n\n  uint64_t len = stream.Read(15);\n  if ((len - 15) > stream.BitsRemaining()) {\n    assert_always(\"TODO\");\n    // *bit_offset = next_packet;\n    // return false;\n    // return next_packet;\n    return 0;\n  } else if (len >= xma::kMaxFrameLength) {\n    assert_always(\"TODO\");\n    // *bit_offset = next_packet;\n    // return false;\n    return 0;\n    // return next_packet;\n  }\n\n  stream.Advance(len - (15 + 1));\n  // Read the trailing bit to see if frames follow\n  if (stream.Read(1) == 0) {\n    return 0;\n  }\n\n  bit_offset += len;\n  if (packet_idx < GetFramePacketNumber(block, size, bit_offset)) {\n    return 0;\n  }\n  return bit_offset;\n}\n\nint XmaContext::GetFramePacketNumber(uint8_t* block, size_t size,\n                                     size_t bit_offset) {\n  size *= 8;\n  if (bit_offset >= size) {\n    // Not good :(\n    assert_always();\n    return -1;\n  }\n\n  size_t byte_offset = bit_offset >> 3;\n  size_t packet_number = byte_offset / kBytesPerPacket;\n\n  return (uint32_t)packet_number;\n}\n\nstd::tuple<int, int> XmaContext::GetFrameNumber(uint8_t* block, size_t size,\n                                                size_t bit_offset) {\n  auto packet_idx = GetFramePacketNumber(block, size, bit_offset);\n\n  if (packet_idx < 0 || (packet_idx + 1) * kBytesPerPacket > size) {\n    assert_always();\n    return {packet_idx, -2};\n  }\n\n  if (bit_offset == 0) {\n    return {packet_idx, -1};\n  }\n\n  uint8_t* packet = block + (packet_idx * kBytesPerPacket);\n  auto first_frame_offset = xma::GetPacketFrameOffset(packet);\n  BitStream stream(block, size * 8);\n  stream.SetOffset(packet_idx * kBitsPerPacket + first_frame_offset);\n\n  int frame_idx = 0;\n  while (true) {\n    if (stream.BitsRemaining() < 15) {\n      break;\n    }\n\n    if (stream.offset_bits() == bit_offset) {\n      break;\n    }\n\n    uint64_t size = stream.Read(15);\n    if ((size - 15) > stream.BitsRemaining()) {\n      // Last frame.\n      break;\n    } else if (size == 0x7FFF) {\n      // Invalid frame (and last of this packet)\n      break;\n    }\n\n    stream.Advance(size - (15 + 1));\n\n    // Read the trailing bit to see if frames follow\n    if (stream.Read(1) == 0) {\n      break;\n    }\n    frame_idx++;\n  }\n  return {packet_idx, frame_idx};\n}\n\nstd::tuple<int, bool> XmaContext::GetPacketFrameCount(uint8_t* packet) {\n  auto first_frame_offset = xma::GetPacketFrameOffset(packet);\n  if (first_frame_offset > kBitsPerPacket - kBitsPerHeader) {\n    // frame offset is beyond packet end\n    return {0, false};\n  }\n\n  BitStream stream(packet, kBitsPerPacket);\n  stream.SetOffset(first_frame_offset);\n  int frame_count = 0;\n\n  while (true) {\n    frame_count++;\n    if (stream.BitsRemaining() < 15) {\n      return {frame_count, true};\n    }\n\n    uint64_t size = stream.Read(15);\n    if ((size - 15) > stream.BitsRemaining()) {\n      return {frame_count, true};\n    } else if (size == 0x7FFF) {\n      assert_always();\n      return {frame_count, true};\n    }\n\n    stream.Advance(size - (15 + 1));\n\n    if (stream.Read(1) == 0) {\n      return {frame_count, false};\n    }\n  }\n}\n\nint XmaContext::PrepareDecoder(uint8_t* packet, int sample_rate,\n                               bool is_two_channel) {\n  // Sanity check: Packet metadata is always 1 for XMA2/0 for XMA\n  assert_true((packet[2] & 0x7) == 1 || (packet[2] & 0x7) == 0);\n\n  sample_rate = GetSampleRate(sample_rate);\n\n  // Re-initialize the context with new sample rate and channels.\n  uint32_t channels = is_two_channel ? 2 : 1;\n  if (av_context_->sample_rate != sample_rate ||\n      av_context_->channels != channels) {\n    // We have to reopen the codec so it'll realloc whatever data it needs.\n    // TODO(DrChat): Find a better way.\n    avcodec_close(av_context_);\n\n    av_context_->sample_rate = sample_rate;\n    av_context_->channels = channels;\n\n    if (avcodec_open2(av_context_, av_codec_, NULL) < 0) {\n      XELOGE(\"XmaContext: Failed to reopen FFmpeg context\");\n      return -1;\n    }\n    return 1;\n  }\n  return 0;\n}\n\nvoid XmaContext::ConvertFrame(const uint8_t** samples, bool is_two_channel,\n                              uint8_t* output_buffer) {\n  // Loop through every sample, convert and drop it into the output array.\n  // If more than one channel, we need to interleave the samples from each\n  // channel next to each other. Always saturate because FFmpeg output is\n  // not limited to [-1, 1] (for example 1.095 as seen in 5454082B).\n  constexpr float scale = (1 << 15) - 1;\n  auto out = reinterpret_cast<int16_t*>(output_buffer);\n\n  // For testing of vectorized versions, stereo audio is common in 4D5307E6,\n  // since the first menu frame; the intro cutscene also has more than 2\n  // channels.\n#if XE_ARCH_AMD64\n  static_assert(kSamplesPerFrame % 8 == 0);\n  const auto in_channel_0 = reinterpret_cast<const float*>(samples[0]);\n  const __m128 scale_mm = _mm_set1_ps(scale);\n  if (is_two_channel) {\n    const auto in_channel_1 = reinterpret_cast<const float*>(samples[1]);\n    const __m128i shufmask =\n        _mm_set_epi8(14, 15, 6, 7, 12, 13, 4, 5, 10, 11, 2, 3, 8, 9, 0, 1);\n    for (uint32_t i = 0; i < kSamplesPerFrame; i += 4) {\n      // Load 8 samples, 4 for each channel.\n      __m128 in_mm0 = _mm_loadu_ps(&in_channel_0[i]);\n      __m128 in_mm1 = _mm_loadu_ps(&in_channel_1[i]);\n      // Rescale.\n      in_mm0 = _mm_mul_ps(in_mm0, scale_mm);\n      in_mm1 = _mm_mul_ps(in_mm1, scale_mm);\n      // Cast to int32.\n      __m128i out_mm0 = _mm_cvtps_epi32(in_mm0);\n      __m128i out_mm1 = _mm_cvtps_epi32(in_mm1);\n      // Saturated cast and pack to int16.\n      __m128i out_mm = _mm_packs_epi32(out_mm0, out_mm1);\n      // Interleave channels and byte swap.\n      out_mm = _mm_shuffle_epi8(out_mm, shufmask);\n      // Store, as [out + i * 4] movdqu.\n      _mm_storeu_si128(reinterpret_cast<__m128i*>(&out[i * 2]), out_mm);\n    }\n  } else {\n    const __m128i shufmask =\n        _mm_set_epi8(14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1);\n    for (uint32_t i = 0; i < kSamplesPerFrame; i += 8) {\n      // Load 8 samples, as [in_channel_0 + i * 4] and\n      // [in_channel_0 + i * 4 + 16] movups.\n      __m128 in_mm0 = _mm_loadu_ps(&in_channel_0[i]);\n      __m128 in_mm1 = _mm_loadu_ps(&in_channel_0[i + 4]);\n      // Rescale.\n      in_mm0 = _mm_mul_ps(in_mm0, scale_mm);\n      in_mm1 = _mm_mul_ps(in_mm1, scale_mm);\n      // Cast to int32.\n      __m128i out_mm0 = _mm_cvtps_epi32(in_mm0);\n      __m128i out_mm1 = _mm_cvtps_epi32(in_mm1);\n      // Saturated cast and pack to int16.\n      __m128i out_mm = _mm_packs_epi32(out_mm0, out_mm1);\n      // Byte swap.\n      out_mm = _mm_shuffle_epi8(out_mm, shufmask);\n      // Store, as [out + i * 2] movdqu.\n      _mm_storeu_si128(reinterpret_cast<__m128i*>(&out[i]), out_mm);\n    }\n  }\n#else\n  uint32_t o = 0;\n  for (uint32_t i = 0; i < kSamplesPerFrame; i++) {\n    for (uint32_t j = 0; j <= uint32_t(is_two_channel); j++) {\n      // Select the appropriate array based on the current channel.\n      auto in = reinterpret_cast<const float*>(samples[j]);\n\n      // Raw samples sometimes aren't within [-1, 1]\n      float scaled_sample = xe::clamp_float(in[i], -1.0f, 1.0f) * scale;\n\n      // Convert the sample and output it in big endian.\n      auto sample = static_cast<int16_t>(scaled_sample);\n      out[o++] = xe::byte_swap(sample);\n    }\n  }\n#endif\n}\n\n}  // namespace apu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/apu/xma_context.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_APU_XMA_CONTEXT_H_\n#define XENIA_APU_XMA_CONTEXT_H_\n\n#include <array>\n#include <atomic>\n#include <mutex>\n#include <queue>\n//#include <vector>\n\n#include \"xenia/memory.h\"\n#include \"xenia/xbox.h\"\n\n// XMA audio format:\n// From research, XMA appears to be based on WMA Pro with\n// a few (very slight) modifications.\n// XMA2 is fully backwards-compatible with XMA1.\n\n// Helpful resources:\n// https://github.com/koolkdev/libertyv/blob/master/libav_wrapper/xma2dec.c\n// https://hcs64.com/mboard/forum.php?showthread=14818\n// https://github.com/hrydgard/minidx9/blob/master/Include/xma2defs.h\n\n// Forward declarations\nstruct AVCodec;\nstruct AVCodecParserContext;\nstruct AVCodecContext;\nstruct AVFrame;\nstruct AVPacket;\n\nnamespace xe {\nnamespace apu {\n\n// This is stored in guest space in big-endian order.\n// We load and swap the whole thing to splat here so that we can\n// use bitfields.\n// This could be important:\n// https://www.fmod.org/questions/question/forum-15859\n// Appears to be dumped in order (for the most part)\n\nstruct XMA_CONTEXT_DATA {\n  // DWORD 0\n  uint32_t input_buffer_0_packet_count : 12;  // XMASetInputBuffer0, number of\n                                              // 2KB packets. Max 4095 packets.\n                                              // These packets form a block.\n  uint32_t loop_count : 8;                    // +12bit, XMASetLoopData NumLoops\n  uint32_t input_buffer_0_valid : 1;          // +20bit, XMAIsInputBuffer0Valid\n  uint32_t input_buffer_1_valid : 1;          // +21bit, XMAIsInputBuffer1Valid\n  uint32_t output_buffer_block_count : 5;     // +22bit SizeWrite 256byte blocks\n  uint32_t output_buffer_write_offset : 5;    // +27bit\n                                              // XMAGetOutputBufferWriteOffset\n                                              // AKA OffsetWrite\n\n  // DWORD 1\n  uint32_t input_buffer_1_packet_count : 12;  // XMASetInputBuffer1, number of\n                                              // 2KB packets. Max 4095 packets.\n                                              // These packets form a block.\n  uint32_t loop_subframe_start : 2;           // +12bit, XMASetLoopData\n  uint32_t loop_subframe_end : 3;             // +14bit, XMASetLoopData\n  uint32_t loop_subframe_skip : 3;            // +17bit, XMASetLoopData might be\n                                              // subframe_decode_count\n  uint32_t subframe_decode_count : 4;         // +20bit\n  uint32_t subframe_skip_count : 3;           // +24bit\n  uint32_t sample_rate : 2;                   // +27bit enum of sample rates\n  uint32_t is_stereo : 1;                     // +29bit\n  uint32_t unk_dword_1_c : 1;                 // +30bit\n  uint32_t output_buffer_valid : 1;           // +31bit, XMAIsOutputBufferValid\n\n  // DWORD 2\n  uint32_t input_buffer_read_offset : 26;  // XMAGetInputBufferReadOffset\n  uint32_t unk_dword_2 : 6;                // ErrorStatus/ErrorSet (?)\n\n  // DWORD 3\n  uint32_t loop_start : 26;  // XMASetLoopData LoopStartOffset\n                             // frame offset in bits\n  uint32_t unk_dword_3 : 6;  // ? ParserErrorStatus/ParserErrorSet(?)\n\n  // DWORD 4\n  uint32_t loop_end : 26;        // XMASetLoopData LoopEndOffset\n                                 // frame offset in bits\n  uint32_t packet_metadata : 5;  // XMAGetPacketMetadata\n  uint32_t current_buffer : 1;   // ?\n\n  // DWORD 5\n  uint32_t input_buffer_0_ptr;  // physical address\n  // DWORD 6\n  uint32_t input_buffer_1_ptr;  // physical address\n  // DWORD 7\n  uint32_t output_buffer_ptr;  // physical address\n  // DWORD 8\n  uint32_t work_buffer_ptr;  // PtrOverlapAdd(?)\n\n  // DWORD 9\n  // +0bit, XMAGetOutputBufferReadOffset AKA WriteBufferOffsetRead\n  uint32_t output_buffer_read_offset : 5;\n  uint32_t : 25;\n  uint32_t stop_when_done : 1;       // +30bit\n  uint32_t interrupt_when_done : 1;  // +31bit\n\n  // DWORD 10-15\n  uint32_t unk_dwords_10_15[6];  // reserved?\n\n  explicit XMA_CONTEXT_DATA(const void* ptr) {\n    xe::copy_and_swap(reinterpret_cast<uint32_t*>(this),\n                      reinterpret_cast<const uint32_t*>(ptr),\n                      sizeof(XMA_CONTEXT_DATA) / 4);\n  }\n\n  void Store(void* ptr) {\n    xe::copy_and_swap(reinterpret_cast<uint32_t*>(ptr),\n                      reinterpret_cast<const uint32_t*>(this),\n                      sizeof(XMA_CONTEXT_DATA) / 4);\n  }\n};\nstatic_assert_size(XMA_CONTEXT_DATA, 64);\n\n#pragma pack(push, 1)\n// XMA2WAVEFORMATEX\nstruct Xma2ExtraData {\n  uint8_t raw[34];\n};\nstatic_assert_size(Xma2ExtraData, 34);\n#pragma pack(pop)\n\nclass XmaContext {\n public:\n  static const uint32_t kBytesPerPacket = 2048;\n  static const uint32_t kBitsPerPacket = kBytesPerPacket * 8;\n  static const uint32_t kBitsPerHeader = 33;\n\n  static const uint32_t kBytesPerSample = 2;\n  static const uint32_t kSamplesPerFrame = 512;\n  static const uint32_t kSamplesPerSubframe = 128;\n  static const uint32_t kBytesPerFrameChannel =\n      kSamplesPerFrame * kBytesPerSample;\n  static const uint32_t kBytesPerSubframeChannel =\n      kSamplesPerSubframe * kBytesPerSample;\n\n  // static const uint32_t kOutputBytesPerBlock = 256;\n  // static const uint32_t kOutputMaxSizeBytes = 31 * kOutputBytesPerBlock;\n\n  explicit XmaContext();\n  ~XmaContext();\n\n  int Setup(uint32_t id, Memory* memory, uint32_t guest_ptr);\n  bool Work();\n\n  void Enable();\n  bool Block(bool poll);\n  void Clear();\n  void Disable();\n  void Release();\n\n  Memory* memory() const { return memory_; }\n\n  uint32_t id() { return id_; }\n  uint32_t guest_ptr() { return guest_ptr_; }\n  bool is_allocated() { return is_allocated_; }\n  bool is_enabled() { return is_enabled_; }\n\n  void set_is_allocated(bool is_allocated) { is_allocated_ = is_allocated; }\n  void set_is_enabled(bool is_enabled) { is_enabled_ = is_enabled; }\n\n private:\n  static void SwapInputBuffer(XMA_CONTEXT_DATA* data);\n  static bool TrySetupNextLoop(XMA_CONTEXT_DATA* data,\n                               bool ignore_input_buffer_offset);\n  static void NextPacket(XMA_CONTEXT_DATA* data);\n  static int GetSampleRate(int id);\n  // Get the offset of the next frame. Does not traverse packets.\n  static size_t GetNextFrame(uint8_t* block, size_t size, size_t bit_offset);\n  // Get the containing packet number of the frame pointed to by the offset.\n  static int GetFramePacketNumber(uint8_t* block, size_t size,\n                                  size_t bit_offset);\n  // Get the packet number and the index of the frame inside that packet\n  static std::tuple<int, int> GetFrameNumber(uint8_t* block, size_t size,\n                                             size_t bit_offset);\n  // Get the number of frames contained in the packet (including truncated) and\n  // if the last frame is split.\n  static std::tuple<int, bool> GetPacketFrameCount(uint8_t* packet);\n\n  // Convert sample format and swap bytes\n  static void ConvertFrame(const uint8_t** samples, bool is_two_channel,\n                           uint8_t* output_buffer);\n\n  bool ValidFrameOffset(uint8_t* block, size_t size_bytes,\n                        size_t frame_offset_bits);\n  void Decode(XMA_CONTEXT_DATA* data);\n  int PrepareDecoder(uint8_t* packet, int sample_rate, bool is_two_channel);\n\n  Memory* memory_ = nullptr;\n\n  uint32_t id_ = 0;\n  uint32_t guest_ptr_ = 0;\n  std::mutex lock_;\n  bool is_allocated_ = false;\n  bool is_enabled_ = false;\n  // bool is_dirty_ = true;\n\n  // ffmpeg structures\n  AVPacket* av_packet_ = nullptr;\n  AVCodec* av_codec_ = nullptr;\n  AVCodecContext* av_context_ = nullptr;\n  AVFrame* av_frame_ = nullptr;\n  // uint32_t decoded_consumed_samples_ = 0; // TODO do this dynamically\n  // int decoded_idx_ = -1;\n\n  // bool partial_frame_saved_ = false;\n  // bool partial_frame_size_known_ = false;\n  // size_t partial_frame_total_size_bits_ = 0;\n  // size_t partial_frame_start_offset_bits_ = 0;\n  // size_t partial_frame_offset_bits_ = 0;  // blah internal don't use this\n  // std::vector<uint8_t> partial_frame_buffer_;\n  uint32_t packets_skip_ = 0;\n\n  // bool split_frame_pending_ = false;\n  uint32_t split_frame_len_ = 0;\n  uint32_t split_frame_len_partial_ = 0;\n  uint8_t split_frame_padding_start_ = 0;\n  // first byte contains bit offset information\n  std::array<uint8_t, 1 + 4096> xma_frame_;\n\n  // uint8_t* current_frame_ = nullptr;\n  // conversion buffer for 2 channel frame\n  std::array<uint8_t, kBytesPerFrameChannel * 2> raw_frame_;\n  // std::vector<uint8_t> current_frame_ = std::vector<uint8_t>(0);\n};\n\n}  // namespace apu\n}  // namespace xe\n\n#endif  // XENIA_APU_XMA_CONTEXT_H_\n"
  },
  {
    "path": "src/xenia/apu/xma_decoder.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/apu/xma_decoder.h\"\n\n#include \"xenia/apu/xma_context.h\"\n#include \"xenia/base/cvar.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/profiling.h\"\n#include \"xenia/base/ring_buffer.h\"\n#include \"xenia/base/string_buffer.h\"\n#include \"xenia/cpu/processor.h\"\n#include \"xenia/cpu/thread_state.h\"\n#include \"xenia/kernel/xthread.h\"\n\nextern \"C\" {\n#include \"third_party/FFmpeg/libavutil/log.h\"\n}  // extern \"C\"\n\n// As with normal Microsoft, there are like twelve different ways to access\n// the audio APIs. Early games use XMA*() methods almost exclusively to touch\n// decoders. Later games use XAudio*() and direct memory writes to the XMA\n// structures (as opposed to the XMA* calls), meaning that we have to support\n// both.\n//\n// The XMA*() functions just manipulate the audio system in the guest context\n// and let the normal XmaDecoder handling take it, to prevent duplicate\n// implementations. They can be found in xboxkrnl_audio_xma.cc\n//\n// XMA details:\n// https://devel.nuclex.org/external/svn/directx/trunk/include/xma2defs.h\n// https://github.com/gdawg/fsbext/blob/master/src/xma_header.h\n//\n// XAudio2 uses XMA under the covers, and seems to map with the same\n// restrictions of frame/subframe/etc:\n// https://msdn.microsoft.com/en-us/library/windows/desktop/microsoft.directx_sdk.xaudio2.xaudio2_buffer(v=vs.85).aspx\n//\n// XMA contexts are 64b in size and tight bitfields. They are in physical\n// memory not usually available to games. Games will use MmMapIoSpace to get\n// the 64b pointer in user memory so they can party on it. If the game doesn't\n// do this, it's likely they are either passing the context to XAudio or\n// using the XMA* functions.\n\nDEFINE_bool(ffmpeg_verbose, false, \"Verbose FFmpeg output (debug and above)\",\n            \"APU\");\n\nnamespace xe {\nnamespace apu {\n\nXmaDecoder::XmaDecoder(cpu::Processor* processor)\n    : memory_(processor->memory()), processor_(processor) {}\n\nXmaDecoder::~XmaDecoder() = default;\n\nvoid av_log_callback(void* avcl, int level, const char* fmt, va_list va) {\n  if (!cvars::ffmpeg_verbose && level > AV_LOG_WARNING) {\n    return;\n  }\n\n  char level_char = '?';\n  LogLevel log_level;\n  switch (level) {\n    case AV_LOG_ERROR: {\n      level_char = '!';\n      log_level = xe::LogLevel::Error;\n      break;\n    }\n    case AV_LOG_WARNING: {\n      level_char = 'w';\n      log_level = xe::LogLevel::Warning;\n      break;\n    }\n    case AV_LOG_INFO: {\n      level_char = 'i';\n      log_level = xe::LogLevel::Info;\n      break;\n    }\n    case AV_LOG_VERBOSE: {\n      level_char = 'v';\n      log_level = xe::LogLevel::Debug;\n      break;\n    }\n    case AV_LOG_DEBUG: {\n      level_char = 'd';\n      log_level = xe::LogLevel::Debug;\n      break;\n    }\n    default: {\n      level_char = '?';\n      log_level = xe::LogLevel::Debug;\n      break;\n    }\n  }\n\n  StringBuffer buff;\n  buff.AppendVarargs(fmt, va);\n  xe::logging::AppendLogLineFormat(log_level, level_char, \"ffmpeg: {}\",\n                                   buff.to_string_view());\n}\n\nX_STATUS XmaDecoder::Setup(kernel::KernelState* kernel_state) {\n  // Setup ffmpeg logging callback\n  av_log_set_callback(av_log_callback);\n\n  // Let the processor know we want register access callbacks.\n  memory_->AddVirtualMappedRange(\n      0x7FEA0000, 0xFFFF0000, 0x0000FFFF, this,\n      reinterpret_cast<cpu::MMIOReadCallback>(MMIOReadRegisterThunk),\n      reinterpret_cast<cpu::MMIOWriteCallback>(MMIOWriteRegisterThunk));\n\n  // Setup XMA context data.\n  // The Xbox 360 kernel allocates the contexts with X_PAGE_NOCACHE |\n  // X_PAGE_READWRITE and writes MmGetPhysicalAddress for the address to the\n  // register.\n  context_data_first_ptr_ = memory()->SystemHeapAlloc(\n      sizeof(XMA_CONTEXT_DATA) * kContextCount, 256, kSystemHeapPhysical);\n  context_data_last_ptr_ =\n      context_data_first_ptr_ + (sizeof(XMA_CONTEXT_DATA) * kContextCount - 1);\n  register_file_[XmaRegister::ContextArrayAddress] =\n      memory()->GetPhysicalAddress(context_data_first_ptr_);\n\n  // Setup XMA contexts.\n  for (int i = 0; i < kContextCount; ++i) {\n    uint32_t guest_ptr = context_data_first_ptr_ + i * sizeof(XMA_CONTEXT_DATA);\n    XmaContext& context = contexts_[i];\n    if (context.Setup(i, memory(), guest_ptr)) {\n      assert_always();\n    }\n  }\n  register_file_[XmaRegister::NextContextIndex] = 1;\n  context_bitmap_.Resize(kContextCount);\n\n  worker_running_ = true;\n  work_event_ = xe::threading::Event::CreateAutoResetEvent(false);\n  assert_not_null(work_event_);\n  worker_thread_ = kernel::object_ref<kernel::XHostThread>(\n      new kernel::XHostThread(kernel_state, 128 * 1024, 0, [this]() {\n        WorkerThreadMain();\n        return 0;\n      }));\n  worker_thread_->set_name(\"XMA Decoder\");\n  worker_thread_->set_can_debugger_suspend(true);\n  worker_thread_->Create();\n\n  return X_STATUS_SUCCESS;\n}\n\nvoid XmaDecoder::WorkerThreadMain() {\n  uint32_t idle_loop_count = 0;\n  while (worker_running_) {\n    // Okay, let's loop through XMA contexts to find ones we need to decode!\n    bool did_work = false;\n    for (uint32_t n = 0; n < kContextCount; n++) {\n      XmaContext& context = contexts_[n];\n      did_work = context.Work() || did_work;\n\n      // TODO: Need thread safety to do this.\n      // Probably not too important though.\n      // registers_.current_context = n;\n      // registers_.next_context = (n + 1) % kContextCount;\n    }\n\n    if (paused_) {\n      pause_fence_.Signal();\n      resume_fence_.Wait();\n    }\n\n    if (!did_work) {\n      idle_loop_count++;\n    } else {\n      idle_loop_count = 0;\n    }\n\n    if (idle_loop_count > 500) {\n      // Idle for an extended period. Introduce a 20ms wait.\n      xe::threading::Wait(work_event_.get(), false,\n                          std::chrono::milliseconds(20));\n    }\n\n    xe::threading::MaybeYield();\n  }\n}\n\nvoid XmaDecoder::Shutdown() {\n  worker_running_ = false;\n\n  if (work_event_) {\n    work_event_->Set();\n  }\n\n  if (paused_) {\n    Resume();\n  }\n\n  if (worker_thread_) {\n    // Wait for work thread.\n    xe::threading::Wait(worker_thread_->thread(), false);\n    worker_thread_.reset();\n  }\n\n  if (context_data_first_ptr_) {\n    memory()->SystemHeapFree(context_data_first_ptr_);\n  }\n\n  context_data_first_ptr_ = 0;\n  context_data_last_ptr_ = 0;\n}\n\nint XmaDecoder::GetContextId(uint32_t guest_ptr) {\n  static_assert_size(XMA_CONTEXT_DATA, 64);\n  if (guest_ptr < context_data_first_ptr_ ||\n      guest_ptr > context_data_last_ptr_) {\n    return -1;\n  }\n  assert_zero(guest_ptr & 0x3F);\n  return (guest_ptr - context_data_first_ptr_) >> 6;\n}\n\nuint32_t XmaDecoder::AllocateContext() {\n  size_t index = context_bitmap_.Acquire();\n  if (index == -1) {\n    // Out of contexts.\n    return 0;\n  }\n\n  XmaContext& context = contexts_[index];\n  assert_false(context.is_allocated());\n  context.set_is_allocated(true);\n  return context.guest_ptr();\n}\n\nvoid XmaDecoder::ReleaseContext(uint32_t guest_ptr) {\n  auto context_id = GetContextId(guest_ptr);\n  assert_true(context_id >= 0);\n\n  XmaContext& context = contexts_[context_id];\n  assert_true(context.is_allocated());\n  context.Release();\n  context_bitmap_.Release(context_id);\n}\n\nbool XmaDecoder::BlockOnContext(uint32_t guest_ptr, bool poll) {\n  auto context_id = GetContextId(guest_ptr);\n  assert_true(context_id >= 0);\n\n  XmaContext& context = contexts_[context_id];\n  return context.Block(poll);\n}\n\nuint32_t XmaDecoder::ReadRegister(uint32_t addr) {\n  auto r = (addr & 0xFFFF) / 4;\n\n  assert_true(r < XmaRegisterFile::kRegisterCount);\n\n  switch (r) {\n    case XmaRegister::ContextArrayAddress:\n      break;\n    case XmaRegister::CurrentContextIndex: {\n      // 0606h (1818h) is rotating context processing # set to hardware ID of\n      // context being processed.\n      // If bit 200h is set, the locking code will possibly collide on hardware\n      // IDs and error out, so we should never set it (I think?).\n      uint32_t& current_context_index =\n          register_file_[XmaRegister::CurrentContextIndex];\n      uint32_t& next_context_index =\n          register_file_[XmaRegister::NextContextIndex];\n      // To prevent games from seeing a stuck XMA context, return a rotating\n      // number.\n      current_context_index = next_context_index;\n      next_context_index = (next_context_index + 1) % kContextCount;\n      break;\n    }\n    default:\n      const auto register_info = register_file_.GetRegisterInfo(r);\n      if (register_info) {\n        XELOGW(\"XMA: Read from unhandled register ({:04X}, {})\", r,\n               register_info->name);\n      } else {\n        XELOGW(\"XMA: Read from unknown register ({:04X})\", r);\n      }\n      break;\n  }\n\n  return xe::byte_swap(register_file_[r]);\n}\n\nvoid XmaDecoder::WriteRegister(uint32_t addr, uint32_t value) {\n  SCOPE_profile_cpu_f(\"apu\");\n\n  uint32_t r = (addr & 0xFFFF) / 4;\n  value = xe::byte_swap(value);\n\n  assert_true(r < XmaRegisterFile::kRegisterCount);\n  register_file_[r] = value;\n\n  if (r >= XmaRegister::Context0Kick && r <= XmaRegister::Context9Kick) {\n    // Context kick command.\n    // This will kick off the given hardware contexts.\n    // Basically, this kicks the SPU and says \"hey, decode that audio!\"\n    // XMAEnableContext\n\n    // The context ID is a bit in the range of the entire context array.\n    uint32_t base_context_id = (r - XmaRegister::Context0Kick) * 32;\n    for (int i = 0; value && i < 32; ++i, value >>= 1) {\n      if (value & 1) {\n        uint32_t context_id = base_context_id + i;\n        auto& context = contexts_[context_id];\n        context.Enable();\n      }\n    }\n    // Signal the decoder thread to start processing.\n    work_event_->Set();\n  } else if (r >= XmaRegister::Context0Lock && r <= XmaRegister::Context9Lock) {\n    // Context lock command.\n    // This requests a lock by flagging the context.\n    // XMADisableContext\n    uint32_t base_context_id = (r - XmaRegister::Context0Lock) * 32;\n    for (int i = 0; value && i < 32; ++i, value >>= 1) {\n      if (value & 1) {\n        uint32_t context_id = base_context_id + i;\n        auto& context = contexts_[context_id];\n        context.Disable();\n      }\n    }\n    // Signal the decoder thread to start processing.\n    // work_event_->Set();\n  } else if (r >= XmaRegister::Context0Clear &&\n             r <= XmaRegister::Context9Clear) {\n    // Context clear command.\n    // This will reset the given hardware contexts.\n    uint32_t base_context_id = (r - XmaRegister::Context0Clear) * 32;\n    for (int i = 0; value && i < 32; ++i, value >>= 1) {\n      if (value & 1) {\n        uint32_t context_id = base_context_id + i;\n        XmaContext& context = contexts_[context_id];\n        context.Clear();\n      }\n    }\n  } else {\n    // 0601h (1804h) is written to with 0x02000000 and 0x03000000 around a lock\n    // operation\n    switch (r) {\n      default: {\n        const auto register_info = register_file_.GetRegisterInfo(r);\n        if (register_info) {\n          XELOGW(\"XMA: Write to unhandled register ({:04X}, {}): {:08X}\", r,\n                 register_info->name, value);\n        } else {\n          XELOGW(\"XMA: Write to unknown register ({:04X}): {:08X}\", r, value);\n        }\n        break;\n      }\n#pragma warning(suppress : 4065)\n    }\n  }\n}\n\nvoid XmaDecoder::Pause() {\n  if (paused_) {\n    return;\n  }\n  paused_ = true;\n\n  pause_fence_.Wait();\n}\n\nvoid XmaDecoder::Resume() {\n  if (!paused_) {\n    return;\n  }\n  paused_ = false;\n\n  resume_fence_.Signal();\n}\n\n}  // namespace apu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/apu/xma_decoder.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_APU_XMA_DECODER_H_\n#define XENIA_APU_XMA_DECODER_H_\n\n#include <atomic>\n#include <mutex>\n#include <queue>\n\n#include \"xenia/apu/xma_context.h\"\n#include \"xenia/apu/xma_register_file.h\"\n#include \"xenia/base/bit_map.h\"\n#include \"xenia/kernel/xthread.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace apu {\n\nstruct XMA_CONTEXT_DATA;\n\nclass XmaDecoder {\n public:\n  explicit XmaDecoder(cpu::Processor* processor);\n  ~XmaDecoder();\n\n  Memory* memory() const { return memory_; }\n  cpu::Processor* processor() const { return processor_; }\n\n  X_STATUS Setup(kernel::KernelState* kernel_state);\n  void Shutdown();\n\n  uint32_t context_array_ptr() const {\n    return register_file_[XmaRegister::ContextArrayAddress];\n  }\n\n  uint32_t AllocateContext();\n  void ReleaseContext(uint32_t guest_ptr);\n  bool BlockOnContext(uint32_t guest_ptr, bool poll);\n\n  uint32_t ReadRegister(uint32_t addr);\n  void WriteRegister(uint32_t addr, uint32_t value);\n\n  bool is_paused() const { return paused_; }\n  void Pause();\n  void Resume();\n\n protected:\n  int GetContextId(uint32_t guest_ptr);\n\n private:\n  void WorkerThreadMain();\n\n  static uint32_t MMIOReadRegisterThunk(void* ppc_context, XmaDecoder* as,\n                                        uint32_t addr) {\n    return as->ReadRegister(addr);\n  }\n  static void MMIOWriteRegisterThunk(void* ppc_context, XmaDecoder* as,\n                                     uint32_t addr, uint32_t value) {\n    as->WriteRegister(addr, value);\n  }\n\n protected:\n  Memory* memory_ = nullptr;\n  cpu::Processor* processor_ = nullptr;\n\n  std::atomic<bool> worker_running_ = {false};\n  kernel::object_ref<kernel::XHostThread> worker_thread_;\n  std::unique_ptr<xe::threading::Event> work_event_ = nullptr;\n\n  bool paused_ = false;\n  xe::threading::Fence pause_fence_;   // Signaled when worker paused.\n  xe::threading::Fence resume_fence_;  // Signaled when resume requested.\n\n  XmaRegisterFile register_file_;\n\n  static const uint32_t kContextCount = 320;\n  XmaContext contexts_[kContextCount];\n  BitMap context_bitmap_;\n\n  uint32_t context_data_first_ptr_ = 0;\n  uint32_t context_data_last_ptr_ = 0;\n};\n\n}  // namespace apu\n}  // namespace xe\n\n#endif  // XENIA_APU_XMA_DECODER_H_\n"
  },
  {
    "path": "src/xenia/apu/xma_helpers.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n// This file contains some functions used to help parse XMA data.\n\n#ifndef XENIA_APU_XMA_HELPERS_H_\n#define XENIA_APU_XMA_HELPERS_H_\n\n#include <stdint.h>\n\nnamespace xe {\nnamespace apu {\nnamespace xma {\n\nstatic const uint32_t kMaxFrameLength = 0x7FFF;\n\n// Get number of frames that /begin/ in this packet.\nuint32_t GetPacketFrameCount(uint8_t* packet) {\n  return (uint8_t)(packet[0] >> 2);\n}\n\n// Get the first frame offset in bits\nuint32_t GetPacketFrameOffset(uint8_t* packet) {\n  uint32_t val = (uint16_t)(((packet[0] & 0x3) << 13) | (packet[1] << 5) |\n                            (packet[2] >> 3));\n  // if (val > kBitsPerPacket - kBitsPerHeader) {\n  //   // There is no data in this packet\n  //   return -1;\n  // } else {\n  return val + 32;\n  // }\n}\n\nuint32_t GetPacketMetadata(uint8_t* packet) {\n  return (uint8_t)(packet[2] & 0x7);\n}\n\nuint32_t GetPacketSkipCount(uint8_t* packet) { return (uint8_t)(packet[3]); }\n\n}  // namespace xma\n}  // namespace apu\n}  // namespace xe\n\n#endif  // XENIA_APU_XMA_HELPERS_H_\n"
  },
  {
    "path": "src/xenia/apu/xma_register_file.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/apu/xma_register_file.h\"\n\n#include <cstring>\n\n#include \"xenia/base/math.h\"\n\nnamespace xe {\nnamespace apu {\n\nXmaRegisterFile::XmaRegisterFile() { std::memset(values, 0, sizeof(values)); }\n\nconst XmaRegisterInfo* XmaRegisterFile::GetRegisterInfo(uint32_t index) {\n  switch (index) {\n#define XE_XMA_REGISTER(index, name)          \\\n  case index: {                               \\\n    static const XmaRegisterInfo reg_info = { \\\n        #name,                                \\\n    };                                        \\\n    return &reg_info;                         \\\n  }\n#include \"xenia/apu/xma_register_table.inc\"\n#undef XE_XMA_REGISTER\n    default:\n      return nullptr;\n  }\n}\n\n}  //  namespace apu\n}  //  namespace xe\n"
  },
  {
    "path": "src/xenia/apu/xma_register_file.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_APU_XMA_REGISTER_FILE_H_\n#define XENIA_APU_XMA_REGISTER_FILE_H_\n\n#include <cstdint>\n#include <cstdlib>\n\nnamespace xe {\nnamespace apu {\n\nstruct XmaRegister {\n#define XE_XMA_REGISTER(index, name) static const uint32_t name = index;\n#include \"xenia/apu/xma_register_table.inc\"\n#undef XE_XMA_REGISTER\n};\n\nstruct XmaRegisterInfo {\n  const char* name;\n};\n\nclass XmaRegisterFile {\n public:\n  XmaRegisterFile();\n\n  static const XmaRegisterInfo* GetRegisterInfo(uint32_t index);\n\n  static const size_t kRegisterCount = (0xFFFF + 1) / 4;\n  uint32_t values[kRegisterCount];\n\n  uint32_t operator[](uint32_t reg) const { return values[reg]; }\n  uint32_t& operator[](uint32_t reg) { return values[reg]; }\n};\n\n}  // namespace apu\n}  // namespace xe\n\n#endif  // XENIA_APU_XMA_REGISTER_FILE_H_\n"
  },
  {
    "path": "src/xenia/apu/xma_register_table.inc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n// This is a partial file designed to be included by other files when\n// constructing various tables.\n\n#ifndef XE_XMA_REGISTER\n#define XE_XMA_REGISTER(index, name)\n#define __XE_XMA_REGISTER_UNSET\n#endif\n\n#ifndef XE_XMA_REGISTER_CONTEXT_GROUP\n#define XE_XMA_REGISTER_CONTEXT_GROUP(index, suffix) \\\n  XE_XMA_REGISTER(index + 0, Context0##suffix)       \\\n  XE_XMA_REGISTER(index + 1, Context1##suffix)       \\\n  XE_XMA_REGISTER(index + 2, Context2##suffix)       \\\n  XE_XMA_REGISTER(index + 3, Context3##suffix)       \\\n  XE_XMA_REGISTER(index + 4, Context4##suffix)       \\\n  XE_XMA_REGISTER(index + 5, Context5##suffix)       \\\n  XE_XMA_REGISTER(index + 6, Context6##suffix)       \\\n  XE_XMA_REGISTER(index + 7, Context7##suffix)       \\\n  XE_XMA_REGISTER(index + 8, Context8##suffix)       \\\n  XE_XMA_REGISTER(index + 9, Context9##suffix)\n#endif\n\n// 0x0000..0x001F : ???\n// 0x0020..0x03FF : all 0xFFs?\n// 0x0400..0x043F : ???\n// 0x0440..0x047F : all 0xFFs?\n// 0x0480..0x048B : ???\n// 0x048C..0x04C0 : all 0xFFs?\n// 0x04C1..0x04CB : ???\n// 0x04CC..0x04FF : all 0xFFs?\n// 0x0500..0x051F : ???\n// 0x0520..0x057F : all 0xFFs?\n// 0x0580..0x058F : ???\n// 0x0590..0x05FF : all 0xFFs?\n\n// XMA stuff is probably only 0x0600..0x06FF\n//---------------------------------------------------------------------------//\n\nXE_XMA_REGISTER(0x0600, ContextArrayAddress)\n// 0x0601..0x0605 : ???\nXE_XMA_REGISTER(0x0606, CurrentContextIndex)\nXE_XMA_REGISTER(0x0607, NextContextIndex)\n// 0x0608         : ???\n// 0x0609..0x060F : zero?\nXE_XMA_REGISTER_CONTEXT_GROUP(0x0610, Unknown610)\n// 0x061A..0x061F : zero?\nXE_XMA_REGISTER_CONTEXT_GROUP(0x0620, Unknown620)\n// 0x062A..0x0641 : zero?\n// 0x0642..0x0644 : ???\n// 0x0645..0x064F : zero?\nXE_XMA_REGISTER_CONTEXT_GROUP(0x0650, Kick)\n// 0x065A..0x065F : zero?\nXE_XMA_REGISTER_CONTEXT_GROUP(0x0660, Unknown660)\n// 0x066A..0x0681 : zero?\n// 0x0682..0x0684 : ???\n// 0x0685..0x068F : zero?\nXE_XMA_REGISTER_CONTEXT_GROUP(0x0690, Lock)\n// 0x069A..0x069F : zero?\nXE_XMA_REGISTER_CONTEXT_GROUP(0x06A0, Clear)\n\n//---------------------------------------------------------------------------//\n\n// 0x0700..0x07FF : all 0xFFs?\n// 0x0800..0x17FF : ???\n// 0x1800..0x2FFF : all 0xFFs?\n// 0x3000..0x30FF : ???\n// 0x3100..0x3FFF : all 0xFFs?\n\n#ifdef __XE_XMA_REGISTER_UNSET\n#undef __XE_XMA_REGISTER_UNSET\n#undef XE_XMA_REGISTER\n#endif\n"
  },
  {
    "path": "src/xenia/base/README.md",
    "content": "A lightweight cross-platform/compiler compatibility library.\n\nThis library presupposes C++11/14 support. As more compilers get C++14 it will\nassume that.\n\nOther parts of the project use this to avoid creating spaghetti linkage. Code\nspecific to the emulator should be kept out, as not all of the projects that\ndepend on this need it.\n\nWhere possible, C++11/14 STL should be used instead of adding any code in here,\nand the code should be kept as small as possible (by reusing STL/etc). Third\nparty dependencies should be kept to a minimum.\n\nTarget compilers:\n* MSVC++ 2013+\n* Clang 3.4+\n* GCC 4.8+.\n\nTarget platforms:\n* Windows 8+ (`_win.cc` suffix)\n* Mac OSX 10.9+ (`_mac.cc` suffix, falling back to `_posix.cc`)\n* Linux ? (`_posix.cc` suffix)\n\nAvoid the use of platform-specific #ifdefs and instead try to put all\nplatform-specific code in the appropriately suffixed cc files.\n"
  },
  {
    "path": "src/xenia/base/app_win32.manifest",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<assembly xmlns=\"urn:schemas-microsoft-com:asm.v1\" xmlns:asmv3=\"urn:schemas-microsoft-com:asm.v3\" manifestVersion=\"1.0\">\n  <compatibility xmlns=\"urn:schemas-microsoft-com:compatibility.v1\">\n    <application>\n      <!-- Using Windows 7 APIs unconditionally - Windows Vista is not supported. -->\n      <!-- Windows 7. -->\n      <supportedOS Id=\"{35138b9a-5d96-4fbd-8e2d-a2440225f93a}\" />\n      <!-- Windows 8. -->\n      <supportedOS Id=\"{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}\" />\n      <!-- Windows 8.1. -->\n      <supportedOS Id=\"{1f676c76-80e1-4239-95bb-83d0f6d0da78}\" />\n      <!-- Windows 10, Windows 11. -->\n      <supportedOS Id=\"{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}\" />\n    </application>\n  </compatibility>\n  <dependency>\n    <dependentAssembly>\n      <assemblyIdentity type=\"win32\" name=\"Microsoft.Windows.Common-Controls\" version=\"6.0.0.0\" processorArchitecture=\"*\" publicKeyToken=\"6595b64144ccf1df\" language=\"*\" />\n    </dependentAssembly>\n  </dependency>\n  <asmv3:application>\n    <asmv3:windowsSettings>\n      <!-- System on Windows Vista, per-monitor on Windows 8.1. -->\n      <dpiAware xmlns=\"http://schemas.microsoft.com/SMI/2005/WindowsSettings\">True/PM</dpiAware>\n      <!-- dpiAwareness is an ordered list (most preferred first) of the supported modes. -->\n      <!-- https://blogs.windows.com/windowsdeveloper/2017/04/04/high-dpi-scaling-improvements-desktop-applications-windows-10-creators-update/ -->\n      <!-- PerMonitor on Windows 10 1607, PerMonitorV2 on Windows 10 1703. -->\n      <dpiAwareness xmlns=\"http://schemas.microsoft.com/SMI/2016/WindowsSettings\">PerMonitorV2,PerMonitor</dpiAwareness>\n    </asmv3:windowsSettings>\n  </asmv3:application>\n</assembly>\n"
  },
  {
    "path": "src/xenia/base/arena.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/arena.h\"\n\n#include <cstring>\n#include <memory>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/math.h\"\n\nnamespace xe {\n\nArena::Arena(size_t chunk_size)\n    : chunk_size_(chunk_size), head_chunk_(nullptr), active_chunk_(nullptr) {}\n\nArena::~Arena() {\n  Reset();\n  Chunk* chunk = head_chunk_;\n  while (chunk) {\n    Chunk* next = chunk->next;\n    delete chunk;\n    chunk = next;\n  }\n  head_chunk_ = nullptr;\n}\n\nvoid Arena::Reset() {\n  active_chunk_ = head_chunk_;\n  if (active_chunk_) {\n    active_chunk_->offset = 0;\n  }\n}\n\nvoid Arena::DebugFill() {\n  auto chunk = head_chunk_;\n  while (chunk) {\n    std::memset(chunk->buffer, 0xCD, chunk->capacity);\n    chunk = chunk->next;\n  }\n}\n\nvoid* Arena::Alloc(size_t size, size_t align) {\n  assert_true(\n      align > 0 && xe::is_pow2(align) && align <= 16,\n      \"align needs to be a power of 2 and not greater than Chunk alignment\");\n\n  // for alignment\n  const auto get_padding = [this, align]() -> size_t {\n    const size_t mask = align - 1;\n    size_t deviation = active_chunk_->offset & mask;\n    return (align - deviation) & mask;\n  };\n\n  if (active_chunk_) {\n    if (active_chunk_->capacity - active_chunk_->offset <\n        size + get_padding() + 4_KiB) {\n      Chunk* next = active_chunk_->next;\n      if (!next) {\n        assert_true(size + get_padding() < chunk_size_,\n                    \"need to support larger chunks\");\n        next = new Chunk(chunk_size_);\n        active_chunk_->next = next;\n      }\n      next->offset = 0;\n      active_chunk_ = next;\n    }\n  } else {\n    head_chunk_ = active_chunk_ = new Chunk(chunk_size_);\n  }\n\n  active_chunk_->offset += get_padding();\n  uint8_t* p = active_chunk_->buffer + active_chunk_->offset;\n  active_chunk_->offset += size;\n  assert_true((reinterpret_cast<size_t>(p) & (align - 1)) == 0,\n              \"alignment failed\");\n  return p;\n}\n\nvoid Arena::Rewind(size_t size) { active_chunk_->offset -= size; }\n\nsize_t Arena::CalculateSize() {\n  size_t total_length = 0;\n  Chunk* chunk = head_chunk_;\n  while (chunk) {\n    total_length += chunk->offset;\n    if (chunk == active_chunk_) {\n      break;\n    }\n    chunk = chunk->next;\n  }\n  return total_length;\n}\n\nvoid* Arena::CloneContents() {\n  size_t total_length = CalculateSize();\n  auto result = reinterpret_cast<uint8_t*>(malloc(total_length));\n  auto p = result;\n  Chunk* chunk = head_chunk_;\n  while (chunk) {\n    std::memcpy(p, chunk->buffer, chunk->offset);\n    p += chunk->offset;\n    if (chunk == active_chunk_) {\n      break;\n    }\n    chunk = chunk->next;\n  }\n  return result;\n}\n\nvoid Arena::CloneContents(void* buffer, size_t buffer_length) {\n  uint8_t* p = reinterpret_cast<uint8_t*>(buffer);\n  Chunk* chunk = head_chunk_;\n  while (chunk) {\n    std::memcpy(p, chunk->buffer, chunk->offset);\n    p += chunk->offset;\n    if (chunk == active_chunk_) {\n      break;\n    }\n    chunk = chunk->next;\n  }\n}\n\nArena::Chunk::Chunk(size_t chunk_size)\n    : next(nullptr), capacity(chunk_size), buffer(0), offset(0) {\n  buffer = reinterpret_cast<uint8_t*>(malloc(capacity));\n  assert_true((reinterpret_cast<size_t>(buffer) & size_t(15)) == 0,\n              \"16 byte alignment required\");\n}\n\nArena::Chunk::~Chunk() {\n  if (buffer) {\n    free(buffer);\n  }\n}\n\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/base/arena.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_BASE_ARENA_H_\n#define XENIA_BASE_ARENA_H_\n\n#include <cstddef>\n#include <cstdint>\n#include <vector>\n\n#include \"xenia/base/literals.h\"\n\nnamespace xe {\n\nusing namespace xe::literals;\n\nclass Arena {\n public:\n  explicit Arena(size_t chunk_size = 4_MiB);\n  ~Arena();\n\n  void Reset();\n  void DebugFill();\n\n  void* Alloc(size_t size, size_t align);\n  template <typename T>\n  T* Alloc() {\n    return reinterpret_cast<T*>(Alloc(sizeof(T), alignof(T)));\n  }\n  // When rewinding aligned allocations, any padding that was applied during\n  // allocation will be leaked\n  void Rewind(size_t size);\n\n  void* CloneContents();\n  template <typename T>\n  void CloneContents(std::vector<T>* buffer) {\n    buffer->resize(CalculateSize() / sizeof(T));\n    CloneContents(buffer->data(), buffer->size() * sizeof(T));\n  }\n\n private:\n  class Chunk {\n   public:\n    explicit Chunk(size_t chunk_size);\n    ~Chunk();\n\n    Chunk* next;\n\n    size_t capacity;\n    uint8_t* buffer;\n    size_t offset;\n  };\n\n  size_t CalculateSize();\n  void CloneContents(void* buffer, size_t buffer_length);\n\n  size_t chunk_size_;\n  Chunk* head_chunk_;\n  Chunk* active_chunk_;\n};\n\n}  // namespace xe\n\n#endif  // XENIA_BASE_ARENA_H_\n"
  },
  {
    "path": "src/xenia/base/assert.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_BASE_ASSERT_H_\n#define XENIA_BASE_ASSERT_H_\n\n#include <assert.h>\n\n#include \"xenia/base/platform.h\"\n\nnamespace xe {\n\n#define static_assert_size(type, size) \\\n  static_assert(sizeof(type) == size,  \\\n                \"bad definition for \" #type \": must be \" #size \" bytes\")\n\n// We rely on assert being compiled out in NDEBUG.\n#define xenia_assert assert\n\n#define __XENIA_EXPAND(x) x\n#define __XENIA_ARGC(...)                                                     \\\n  __XENIA_EXPAND(__XENIA_ARGC_IMPL(__VA_ARGS__, 15, 14, 13, 12, 11, 10, 9, 8, \\\n                                   7, 6, 5, 4, 3, 2, 1, 0))\n#define __XENIA_ARGC_IMPL(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, \\\n                          x13, x14, x15, N, ...)                             \\\n  N\n#define __XENIA_MACRO_DISPATCH(func, ...) \\\n  __XENIA_MACRO_DISPATCH_(func, __XENIA_ARGC(__VA_ARGS__))\n#define __XENIA_MACRO_DISPATCH_(func, nargs) \\\n  __XENIA_MACRO_DISPATCH__(func, nargs)\n#define __XENIA_MACRO_DISPATCH__(func, nargs) func##nargs\n\n#define assert_always(...) xenia_assert(false)\n\n#define assert_true(...) \\\n  __XENIA_MACRO_DISPATCH(assert_true, __VA_ARGS__)(__VA_ARGS__)\n#define assert_true1(expr) xenia_assert(expr)\n#define assert_true2(expr, message) xenia_assert((expr) || !message)\n\n#define assert_false(...) \\\n  __XENIA_MACRO_DISPATCH(assert_false, __VA_ARGS__)(__VA_ARGS__)\n#define assert_false1(expr) xenia_assert(!(expr))\n#define assert_false2(expr, message) xenia_assert(!(expr) || !message)\n\n#define assert_zero(...) \\\n  __XENIA_MACRO_DISPATCH(assert_zero, __VA_ARGS__)(__VA_ARGS__)\n#define assert_zero1(expr) xenia_assert((expr) == 0)\n#define assert_zero2(expr, message) xenia_assert((expr) == 0 || !message)\n\n#define assert_not_zero(...) \\\n  __XENIA_MACRO_DISPATCH(assert_not_zero, __VA_ARGS__)(__VA_ARGS__)\n#define assert_not_zero1(expr) xenia_assert((expr) != 0)\n#define assert_not_zero2(expr, message) xenia_assert((expr) != 0 || !message)\n\n#define assert_null(...) \\\n  __XENIA_MACRO_DISPATCH(assert_null, __VA_ARGS__)(__VA_ARGS__)\n#define assert_null1(expr) xenia_assert((expr) == nullptr)\n#define assert_null2(expr, message) xenia_assert((expr) == nullptr || !message)\n\n#define assert_not_null(...) \\\n  __XENIA_MACRO_DISPATCH(assert_not_null, __VA_ARGS__)(__VA_ARGS__)\n#define assert_not_null1(expr) xenia_assert((expr) != nullptr)\n#define assert_not_null2(expr, message) \\\n  xenia_assert((expr) != nullptr || !message)\n\n#define assert_unhandled_case(variable) \\\n  assert_always(\"unhandled switch(\" #variable \") case\")\n\n}  // namespace xe\n\n#endif  // XENIA_BASE_ASSERT_H_\n"
  },
  {
    "path": "src/xenia/base/atomic.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_BASE_ATOMIC_H_\n#define XENIA_BASE_ATOMIC_H_\n\n#include <cstdint>\n\n#include \"xenia/base/platform.h\"\n\nnamespace xe {\n\n#if XE_PLATFORM_WIN32\n\ninline int32_t atomic_inc(volatile int32_t* value) {\n  return _InterlockedIncrement(reinterpret_cast<volatile long*>(value));\n}\ninline int32_t atomic_dec(volatile int32_t* value) {\n  return _InterlockedDecrement(reinterpret_cast<volatile long*>(value));\n}\n\ninline int32_t atomic_exchange(int32_t new_value, volatile int32_t* value) {\n  return _InterlockedExchange(reinterpret_cast<volatile long*>(value),\n                              new_value);\n}\ninline int64_t atomic_exchange(int64_t new_value, volatile int64_t* value) {\n  return _InterlockedExchange64(reinterpret_cast<volatile long long*>(value),\n                                new_value);\n}\n\ninline int32_t atomic_exchange_add(int32_t amount, volatile int32_t* value) {\n  return _InterlockedExchangeAdd(reinterpret_cast<volatile long*>(value),\n                                 amount);\n}\ninline int64_t atomic_exchange_add(int64_t amount, volatile int64_t* value) {\n  return _InterlockedExchangeAdd64(reinterpret_cast<volatile long long*>(value),\n                                   amount);\n}\n\ninline bool atomic_cas(int32_t old_value, int32_t new_value,\n                       volatile int32_t* value) {\n  return _InterlockedCompareExchange(reinterpret_cast<volatile long*>(value),\n                                     new_value, old_value) == old_value;\n}\ninline bool atomic_cas(int64_t old_value, int64_t new_value,\n                       volatile int64_t* value) {\n  return _InterlockedCompareExchange64(\n             reinterpret_cast<volatile long long*>(value), new_value,\n             old_value) == old_value;\n}\n\n#elif XE_PLATFORM_LINUX || XE_PLATFORM_MAC\n\ninline int32_t atomic_inc(volatile int32_t* value) {\n  return __sync_add_and_fetch(value, 1);\n}\ninline int32_t atomic_dec(volatile int32_t* value) {\n  return __sync_sub_and_fetch(value, 1);\n}\n\ninline int32_t atomic_exchange(int32_t new_value, volatile int32_t* value) {\n  return __sync_val_compare_and_swap(value, *value, new_value);\n}\ninline int64_t atomic_exchange(int64_t new_value, volatile int64_t* value) {\n  return __sync_val_compare_and_swap(value, *value, new_value);\n}\n\ninline int32_t atomic_exchange_add(int32_t amount, volatile int32_t* value) {\n  return __sync_fetch_and_add(value, amount);\n}\ninline int64_t atomic_exchange_add(int64_t amount, volatile int64_t* value) {\n  return __sync_fetch_and_add(value, amount);\n}\n\ninline bool atomic_cas(int32_t old_value, int32_t new_value,\n                       volatile int32_t* value) {\n  return __sync_bool_compare_and_swap(\n      reinterpret_cast<volatile int32_t*>(value), old_value, new_value);\n}\ninline bool atomic_cas(int64_t old_value, int64_t new_value,\n                       volatile int64_t* value) {\n  return __sync_bool_compare_and_swap(\n      reinterpret_cast<volatile int64_t*>(value), old_value, new_value);\n}\n\n#else\n\n#error No atomic primitives defined for this platform/cpu combination.\n\n#endif  // XE_PLATFORM\n\ninline uint32_t atomic_inc(volatile uint32_t* value) {\n  return static_cast<uint32_t>(\n      atomic_inc(reinterpret_cast<volatile int32_t*>(value)));\n}\ninline uint32_t atomic_dec(volatile uint32_t* value) {\n  return static_cast<uint32_t>(\n      atomic_dec(reinterpret_cast<volatile int32_t*>(value)));\n}\n\ninline uint32_t atomic_exchange(uint32_t new_value, volatile uint32_t* value) {\n  return static_cast<uint32_t>(\n      atomic_exchange(static_cast<int32_t>(new_value),\n                      reinterpret_cast<volatile int32_t*>(value)));\n}\ninline uint64_t atomic_exchange(uint64_t new_value, volatile uint64_t* value) {\n  return static_cast<uint64_t>(\n      atomic_exchange(static_cast<int64_t>(new_value),\n                      reinterpret_cast<volatile int64_t*>(value)));\n}\n\ninline uint32_t atomic_exchange_add(uint32_t amount, volatile uint32_t* value) {\n  return static_cast<uint32_t>(\n      atomic_exchange_add(static_cast<int32_t>(amount),\n                          reinterpret_cast<volatile int32_t*>(value)));\n}\ninline uint64_t atomic_exchange_add(uint64_t amount, volatile uint64_t* value) {\n  return static_cast<uint64_t>(\n      atomic_exchange_add(static_cast<int64_t>(amount),\n                          reinterpret_cast<volatile int64_t*>(value)));\n}\n\ninline bool atomic_cas(uint32_t old_value, uint32_t new_value,\n                       volatile uint32_t* value) {\n  return atomic_cas(static_cast<int32_t>(old_value),\n                    static_cast<int32_t>(new_value),\n                    reinterpret_cast<volatile int32_t*>(value));\n}\ninline bool atomic_cas(uint64_t old_value, uint64_t new_value,\n                       volatile uint64_t* value) {\n  return atomic_cas(static_cast<int64_t>(old_value),\n                    static_cast<int64_t>(new_value),\n                    reinterpret_cast<volatile int64_t*>(value));\n}\n\n}  // namespace xe\n\n#endif  // XENIA_BASE_ATOMIC_H_\n"
  },
  {
    "path": "src/xenia/base/bit_map.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2015 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/bit_map.h\"\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/atomic.h\"\n#include \"xenia/base/math.h\"\n\nnamespace xe {\n\nBitMap::BitMap() = default;\n\nBitMap::BitMap(size_t size_bits) { Resize(size_bits); }\n\nBitMap::BitMap(uint64_t* data, size_t size_bits) {\n  assert_true(size_bits % kDataSizeBits == 0);\n\n  data_.resize(size_bits / kDataSizeBits);\n  std::memcpy(data_.data(), data, size_bits / kDataSizeBits);\n}\n\nsize_t BitMap::Acquire() {\n  for (size_t i = 0; i < data_.size(); i++) {\n    uint64_t entry = 0;\n    uint64_t new_entry = 0;\n    int64_t acquired_idx = -1;\n\n    do {\n      entry = data_[i];\n      uint8_t index = lzcnt(entry);\n      if (index == kDataSizeBits) {\n        // None free.\n        acquired_idx = -1;\n        break;\n      }\n\n      // Entry has a free bit. Acquire it.\n      uint64_t bit = 1ull << (kDataSizeBits - index - 1);\n      new_entry = entry & ~bit;\n      assert_not_zero(entry & bit);\n\n      acquired_idx = index;\n    } while (!atomic_cas(entry, new_entry, &data_[i]));\n\n    if (acquired_idx != -1) {\n      // Acquired.\n      return (i * kDataSizeBits) + acquired_idx;\n    }\n  }\n\n  return -1;\n}\n\nvoid BitMap::Release(size_t index) {\n  auto slot = index / kDataSizeBits;\n  index -= slot * kDataSizeBits;\n\n  uint64_t bit = 1ull << (kDataSizeBits - index - 1);\n\n  uint64_t entry = 0;\n  uint64_t new_entry = 0;\n  do {\n    entry = data_[slot];\n    assert_zero(entry & bit);\n\n    new_entry = entry | bit;\n  } while (!atomic_cas(entry, new_entry, &data_[slot]));\n}\n\nvoid BitMap::Resize(size_t new_size_bits) {\n  auto old_size = data_.size();\n  assert_true(new_size_bits % kDataSizeBits == 0);\n  data_.resize(new_size_bits / kDataSizeBits);\n\n  // Initialize new entries.\n  if (data_.size() > old_size) {\n    for (size_t i = old_size; i < data_.size(); i++) {\n      data_[i] = -1;\n    }\n  }\n}\n\nvoid BitMap::Reset() {\n  for (size_t i = 0; i < data_.size(); i++) {\n    data_[i] = -1;\n  }\n}\n\n}  // namespace xe"
  },
  {
    "path": "src/xenia/base/bit_map.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2015 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_BASE_BIT_MAP_H_\n#define XENIA_BASE_BIT_MAP_H_\n\n#include <cstddef>\n#include <cstdint>\n#include <vector>\n\nnamespace xe {\n\n// Bit Map: Efficient lookup of free/used entries.\nclass BitMap {\n public:\n  BitMap();\n\n  // Size is the number of entries, must be a multiple of 64.\n  BitMap(size_t size_bits);\n\n  // Data does not have to be aligned to a 4-byte boundary, but it is\n  // preferable.\n  // Size is the number of entries, must be a multiple of 64.\n  BitMap(uint64_t* data, size_t size_bits);\n\n  // (threadsafe) Acquires an entry and returns its index. Returns -1 if there\n  // are no more free entries.\n  size_t Acquire();\n\n  // (threadsafe) Releases an entry by an index.\n  void Release(size_t index);\n\n  // Resize the bitmap. Size is the number of entries, must be a multiple of 64.\n  void Resize(size_t new_size_bits);\n\n  // Sets all entries to free.\n  void Reset();\n\n  const std::vector<uint64_t> data() const { return data_; }\n  std::vector<uint64_t>& data() { return data_; }\n\n private:\n  const static size_t kDataSize = 8;\n  const static size_t kDataSizeBits = kDataSize * 8;\n  std::vector<uint64_t> data_;\n};\n\n}  // namespace xe\n\n#endif  // XENIA_BASE_BIT_MAP_H_\n"
  },
  {
    "path": "src/xenia/base/bit_range.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2019 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_BASE_BIT_RANGE_H_\n#define XENIA_BASE_BIT_RANGE_H_\n\n#include <climits>\n#include <cstddef>\n#include <cstdint>\n#include <cstring>\n#include <utility>\n\n#include \"xenia/base/math.h\"\n\nnamespace xe {\nnamespace bit_range {\n\n// Provided length is in bits since the first. Returns <first, length> of the\n// range in bits, with length == 0 if not found.\ntemplate <typename Block>\nstd::pair<size_t, size_t> NextUnsetRange(const Block* bits, size_t first,\n                                         size_t length) {\n  if (!length) {\n    return std::make_pair(size_t(first), size_t(0));\n  }\n  size_t last = first + length - 1;\n  const size_t block_bits = sizeof(Block) * CHAR_BIT;\n  size_t block_first = first / block_bits;\n  size_t block_last = last / block_bits;\n  size_t range_start = SIZE_MAX;\n  for (size_t i = block_first; i <= block_last; ++i) {\n    Block block = bits[i];\n    // Ignore bits in the block outside the specified range by considering them\n    // set.\n    if (i == block_first) {\n      block |= (Block(1) << (first & (block_bits - 1))) - 1;\n    }\n    if (i == block_last && (last & (block_bits - 1)) != block_bits - 1) {\n      block |= ~((Block(1) << ((last & (block_bits - 1)) + 1)) - 1);\n    }\n    while (true) {\n      uint32_t block_bit;\n      if (range_start == SIZE_MAX) {\n        // Check if need to open a new range.\n        if (!xe::bit_scan_forward(~block, &block_bit)) {\n          break;\n        }\n        range_start = i * block_bits + block_bit;\n      } else {\n        // Check if need to close the range.\n        // Ignore the set bits before the beginning of the range.\n        Block block_bits_set_from_start = block;\n        if (i == range_start / block_bits) {\n          block_bits_set_from_start &=\n              ~((Block(1) << (range_start & (block_bits - 1))) - 1);\n        }\n        if (!xe::bit_scan_forward(block_bits_set_from_start, &block_bit)) {\n          break;\n        }\n        return std::make_pair(range_start,\n                              (i * block_bits) + block_bit - range_start);\n      }\n    }\n  }\n  if (range_start != SIZE_MAX) {\n    return std::make_pair(range_start, last + size_t(1) - range_start);\n  }\n  return std::make_pair(first + length, size_t(0));\n}\n\ntemplate <typename Block>\nvoid SetRange(Block* bits, size_t first, size_t length) {\n  if (!length) {\n    return;\n  }\n  size_t last = first + length - 1;\n  const size_t block_bits = sizeof(Block) * CHAR_BIT;\n  size_t block_first = first / block_bits;\n  size_t block_last = last / block_bits;\n  Block set_first = ~((Block(1) << (first & (block_bits - 1))) - 1);\n  Block set_last = ~Block(0);\n  if ((last & (block_bits - 1)) != (block_bits - 1)) {\n    set_last &= (Block(1) << ((last & (block_bits - 1)) + 1)) - 1;\n  }\n  if (block_first == block_last) {\n    bits[block_first] |= set_first & set_last;\n    return;\n  }\n  bits[block_first] |= set_first;\n  if (block_first + 1 < block_last) {\n    std::memset(bits + block_first + 1, CHAR_MAX,\n                (block_last - (block_first + 1)) * sizeof(Block));\n  }\n  bits[block_last] |= set_last;\n}\n\n}  // namespace bit_range\n}  // namespace xe\n\n#endif  // XENIA_BASE_BIT_RANGE_H_\n"
  },
  {
    "path": "src/xenia/base/bit_stream.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/bit_stream.h\"\n\n#include <algorithm>\n#include <cstring>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/byte_order.h\"\n\nnamespace xe {\n\nBitStream::BitStream(uint8_t* buffer, size_t size_in_bits)\n    : buffer_(buffer), size_bits_(size_in_bits) {}\n\nBitStream::~BitStream() = default;\n\nvoid BitStream::SetOffset(size_t offset_bits) {\n  assert_false(offset_bits > size_bits_);\n  offset_bits_ = std::min(offset_bits, size_bits_);\n}\n\nsize_t BitStream::BitsRemaining() { return size_bits_ - offset_bits_; }\n\nuint64_t BitStream::Peek(size_t num_bits) {\n  // FYI: The reason we can't copy more than 57 bits is:\n  // 57 = 7 * 8 + 1 - that can only span a maximum of 8 bytes.\n  // We can't read in 9 bytes (easily), so we limit it.\n  assert_false(num_bits > 57);\n  assert_false(offset_bits_ + num_bits > size_bits_);\n\n  size_t offset_bytes = offset_bits_ >> 3;\n  size_t rel_offset_bits = offset_bits_ - (offset_bytes << 3);\n\n  // offset -->\n  // ..[junk]..| target bits |....[junk].............\n  uint64_t bits = *(uint64_t*)(buffer_ + offset_bytes);\n\n  // We need the data in little endian.\n  // TODO: Have a flag specifying endianness of data?\n  bits = xe::byte_swap(bits);\n\n  // Shift right\n  // .....[junk]........| target bits |\n  bits >>= 64 - (rel_offset_bits + num_bits);\n\n  // AND with mask\n  // ...................| target bits |\n  bits &= (1ULL << num_bits) - 1;\n\n  return bits;\n}\n\nuint64_t BitStream::Read(size_t num_bits) {\n  uint64_t val = Peek(num_bits);\n  Advance(num_bits);\n\n  return val;\n}\n\n// TODO: This is totally not tested!\nbool BitStream::Write(uint64_t val, size_t num_bits) {\n  assert_false(num_bits > 57);\n  assert_false(offset_bits_ + num_bits >= size_bits_);\n\n  size_t offset_bytes = offset_bits_ >> 3;\n  size_t rel_offset_bits = offset_bits_ - (offset_bytes << 3);\n\n  // Construct a mask\n  uint64_t mask = (1ULL << num_bits) - 1;\n  mask <<= 64 - (rel_offset_bits + num_bits);\n  mask = ~mask;\n\n  // Shift the value left into position.\n  val <<= 64 - (rel_offset_bits + num_bits);\n\n  // offset ----->\n  // ....[junk]...| target bits w/ junk |....[junk]......\n  uint64_t bits = *(uint64_t*)(buffer_ + offset_bytes);\n\n  // AND with mask\n  // ....[junk]...| target bits (0) |........[junk]......\n  bits &= mask;\n\n  // OR with val\n  // ....[junk]...| target bits (val) |......[junk]......\n  bits |= val;\n\n  // Store into the bitstream.\n  *(uint64_t*)(buffer_ + offset_bytes) = bits;\n\n  // Advance the bitstream forward.\n  Advance(num_bits);\n\n  return true;\n}\n\nsize_t BitStream::Copy(uint8_t* dest_buffer, size_t num_bits) {\n  size_t offset_bytes = offset_bits_ >> 3;\n  size_t rel_offset_bits = offset_bits_ - (offset_bytes << 3);\n  size_t bits_left = num_bits;\n  size_t out_offset_bytes = 0;\n\n  // First: Copy the first few bits up to a byte boundary.\n  if (rel_offset_bits) {\n    uint64_t bits = Peek(8 - rel_offset_bits);\n    uint8_t clear_mask = ~((uint8_t(1) << rel_offset_bits) - 1);\n    dest_buffer[out_offset_bytes] &= clear_mask;\n    dest_buffer[out_offset_bytes] |= (uint8_t)bits;\n\n    bits_left -= 8 - rel_offset_bits;\n    Advance(8 - rel_offset_bits);\n    out_offset_bytes++;\n  }\n\n  // Second: Use memcpy for the bytes left.\n  if (bits_left >= 8) {\n    std::memcpy(dest_buffer + out_offset_bytes,\n                buffer_ + offset_bytes + out_offset_bytes, bits_left / 8);\n    out_offset_bytes += (bits_left / 8);\n    Advance((bits_left / 8) * 8);\n    bits_left -= (bits_left / 8) * 8;\n  }\n\n  // Third: Copy the last few bits.\n  if (bits_left) {\n    uint64_t bits = Peek(bits_left);\n    bits <<= 8 - bits_left;\n\n    uint8_t clear_mask = ((uint8_t(1) << bits_left) - 1);\n    dest_buffer[out_offset_bytes] &= clear_mask;\n    dest_buffer[out_offset_bytes] |= (uint8_t)bits;\n    Advance(bits_left);\n  }\n\n  // Return the bit offset to the copied bits.\n  return rel_offset_bits;\n}\n\nvoid BitStream::Advance(size_t num_bits) { SetOffset(offset_bits_ + num_bits); }\n\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/base/bit_stream.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2015 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_BASE_BIT_STREAM_H_\n#define XENIA_BASE_BIT_STREAM_H_\n\n#include <cstddef>\n#include <cstdint>\n\nnamespace xe {\n\nclass BitStream {\n public:\n  BitStream(uint8_t* buffer, size_t size_in_bits);\n  ~BitStream();\n\n  const uint8_t* buffer() const { return buffer_; }\n  uint8_t* buffer() { return buffer_; }\n  size_t offset_bits() const { return offset_bits_; }\n  size_t size_bits() const { return size_bits_; }\n\n  void Advance(size_t num_bits);\n  void SetOffset(size_t offset_bits);\n  size_t BitsRemaining();\n\n  // Note: num_bits MUST be in the range 0-57 (inclusive)\n  uint64_t Peek(size_t num_bits);\n  uint64_t Read(size_t num_bits);\n  bool Write(uint64_t val, size_t num_bits);  // TODO(DrChat): Not tested!\n\n  size_t Copy(uint8_t* dest_buffer, size_t num_bits);\n\n private:\n  uint8_t* buffer_ = nullptr;\n  size_t offset_bits_ = 0;\n  size_t size_bits_ = 0;\n};\n\n}  // namespace xe\n\n#endif  // XENIA_BASE_BIT_STREAM_H_\n"
  },
  {
    "path": "src/xenia/base/byte_order.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_BASE_BYTE_ORDER_H_\n#define XENIA_BASE_BYTE_ORDER_H_\n\n#include <cstdint>\n#if defined __has_include\n#if __has_include(<version>)\n#include <version>\n#endif\n#endif\n#if __cpp_lib_endian\n#include <bit>\n#endif\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/platform.h\"\n\n#if !__cpp_lib_endian\n// Polyfill\n#ifdef __BYTE_ORDER__\nnamespace std {\nenum class endian {\n  little = __ORDER_LITTLE_ENDIAN__,\n  big = __ORDER_BIG_ENDIAN__,\n  native = __BYTE_ORDER__\n};\n}\n#else\n// Hardcode to little endian for now\nnamespace std {\nenum class endian { little = 0, big = 1, native = 0 };\n}\n#endif\n#endif\n// Check for mixed endian\nstatic_assert((std::endian::native == std::endian::big) ||\n              (std::endian::native == std::endian::little));\n\nnamespace xe {\n\n#if XE_COMPILER_MSVC\n#define XENIA_BASE_BYTE_SWAP_16 _byteswap_ushort\n#define XENIA_BASE_BYTE_SWAP_32 _byteswap_ulong\n#define XENIA_BASE_BYTE_SWAP_64 _byteswap_uint64\n#else\n#define XENIA_BASE_BYTE_SWAP_16 __builtin_bswap16\n#define XENIA_BASE_BYTE_SWAP_32 __builtin_bswap32\n#define XENIA_BASE_BYTE_SWAP_64 __builtin_bswap64\n#endif  // XE_PLATFORM_WIN32\n\ntemplate <class T>\ninline T byte_swap(T value) {\n  static_assert(\n      sizeof(T) == 8 || sizeof(T) == 4 || sizeof(T) == 2 || sizeof(T) == 1,\n      \"byte_swap(T value): Type T has illegal size\");\n  if constexpr (sizeof(T) == 8) {\n    uint64_t temp =\n        XENIA_BASE_BYTE_SWAP_64(*reinterpret_cast<uint64_t*>(&value));\n    return *reinterpret_cast<T*>(&temp);\n  } else if constexpr (sizeof(T) == 4) {\n    uint32_t temp =\n        XENIA_BASE_BYTE_SWAP_32(*reinterpret_cast<uint32_t*>(&value));\n    return *reinterpret_cast<T*>(&temp);\n  } else if constexpr (sizeof(T) == 2) {\n    uint16_t temp =\n        XENIA_BASE_BYTE_SWAP_16(*reinterpret_cast<uint16_t*>(&value));\n    return *reinterpret_cast<T*>(&temp);\n  } else if constexpr (sizeof(T) == 1) {\n    return value;\n  }\n}\n\ntemplate <typename T, std::endian E>\nstruct endian_store {\n  endian_store() = default;\n  endian_store(const T& src) { set(src); }\n  endian_store(const endian_store& other) { set(other); }\n  operator T() const { return get(); }\n\n  void set(const T& src) {\n    if constexpr (std::endian::native == E) {\n      value = src;\n    } else {\n      value = xe::byte_swap(src);\n    }\n  }\n  void set(const endian_store& other) { value = other.value; }\n  T get() const {\n    if constexpr (std::endian::native == E) {\n      return value;\n    }\n    return xe::byte_swap(value);\n  }\n\n  endian_store<T, E>& operator+=(int a) {\n    *this = *this + a;\n    return *this;\n  }\n  endian_store<T, E>& operator-=(int a) {\n    *this = *this - a;\n    return *this;\n  }\n  endian_store<T, E>& operator++() {\n    *this += 1;\n    return *this;\n  }  // ++a\n  endian_store<T, E> operator++(int) {\n    *this += 1;\n    return (*this - 1);\n  }  // a++\n  endian_store<T, E>& operator--() {\n    *this -= 1;\n    return *this;\n  }  // --a\n  endian_store<T, E> operator--(int) {\n    *this -= 1;\n    return (*this + 1);\n  }  // a--\n\n  T value;\n};\n\ntemplate <typename T>\nusing be = endian_store<T, std::endian::big>;\ntemplate <typename T>\nusing le = endian_store<T, std::endian::little>;\n\n}  // namespace xe\n\n#endif  // XENIA_BASE_BYTE_ORDER_H_\n"
  },
  {
    "path": "src/xenia/base/byte_stream.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/byte_stream.h\"\n\n#include <cstring>\n\n#include \"xenia/base/assert.h\"\n\nnamespace xe {\n\nByteStream::ByteStream(uint8_t* data, size_t data_length, size_t offset)\n    : data_(data), data_length_(data_length), offset_(offset) {}\n\nByteStream::~ByteStream() = default;\n\nvoid ByteStream::Advance(size_t num_bytes) {\n  assert_true(offset_ + num_bytes <= data_length_);\n  offset_ += num_bytes;\n}\n\nvoid ByteStream::Read(uint8_t* buf, size_t len) {\n  assert_true(offset_ + len <= data_length_);\n  std::memcpy(buf, data_ + offset_, len);\n  Advance(len);\n}\n\nvoid ByteStream::Write(const uint8_t* buf, size_t len) {\n  assert_true(offset_ + len <= data_length_);\n  std::memcpy(data_ + offset_, buf, len);\n  Advance(len);\n}\n\ntemplate <>\nstd::string ByteStream::Read() {\n  std::string str;\n  uint32_t len = Read<uint32_t>();\n  str.resize(len);\n  Read(reinterpret_cast<uint8_t*>(&str[0]), len);\n  return str;\n}\n\ntemplate <>\nstd::u16string ByteStream::Read() {\n  std::u16string str;\n  size_t len = Read<uint32_t>();\n  str.resize(len);\n  Read(reinterpret_cast<uint8_t*>(&str[0]), len * 2);\n  return str;\n}\n\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/base/byte_stream.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_BASE_BYTE_STREAM_H_\n#define XENIA_BASE_BYTE_STREAM_H_\n\n#include <cstdint>\n#include <string>\n\nnamespace xe {\n\nclass ByteStream {\n public:\n  ByteStream(uint8_t* data, size_t data_length, size_t offset = 0);\n  ~ByteStream();\n\n  void Advance(size_t num_bytes);\n  void Read(uint8_t* buf, size_t len);\n  void Write(const uint8_t* buf, size_t len);\n\n  void Read(void* buf, size_t len) {\n    return Read(reinterpret_cast<uint8_t*>(buf), len);\n  }\n  void Write(const void* buf, size_t len) {\n    return Write(reinterpret_cast<const uint8_t*>(buf), len);\n  }\n\n  const uint8_t* data() const { return data_; }\n  uint8_t* data() { return data_; }\n  size_t data_length() const { return data_length_; }\n\n  size_t offset() const { return offset_; }\n  void set_offset(size_t offset) { offset_ = offset; }\n\n  template <typename T>\n  T Read() {\n    T data;\n    Read(reinterpret_cast<uint8_t*>(&data), sizeof(T));\n\n    return data;\n  }\n\n  template <typename T>\n  void Write(T data) {\n    Write(reinterpret_cast<uint8_t*>(&data), sizeof(T));\n  }\n\n  void Write(const std::string_view str) {\n    Write(uint32_t(str.length()));\n    Write(str.data(), str.length() * sizeof(char));\n  }\n\n  void Write(const std::u16string_view str) {\n    Write(uint32_t(str.length()));\n    Write(str.data(), str.length() * sizeof(char16_t));\n  }\n\n private:\n  uint8_t* data_ = nullptr;\n  size_t data_length_ = 0;\n  size_t offset_ = 0;\n};\n\ntemplate <>\nstd::string ByteStream::Read();\n\ntemplate <>\nstd::u16string ByteStream::Read();\n\n}  // namespace xe\n\n#endif  // XENIA_BASE_BYTE_STREAM_H_\n"
  },
  {
    "path": "src/xenia/base/chrono.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_BASE_CHRONO_H_\n#define XENIA_BASE_CHRONO_H_\n\n#include <chrono>\n#include <cstdint>\n\n// https://github.com/HowardHinnant/date/commit/5ba1c1ad8514362dba596f228eb20eb13f63d948#r33275526\n#define HAS_UNCAUGHT_EXCEPTIONS 1\n#include \"third_party/date/include/date/tz.h\"\n\n#include \"xenia/base/clock.h\"\n\nnamespace xe {\nusing hundrednano = std::ratio<1, 10000000>;\n\nnamespace chrono {\n\nusing hundrednanoseconds = std::chrono::duration<int64_t, hundrednano>;\n\n// https://docs.microsoft.com/en-us/windows/win32/sysinfo/converting-a-time-t-value-to-a-file-time\n//  Don't forget the 89 leap days.\nstatic constexpr std::chrono::seconds seconds_1601_to_1970 =\n    (396 * 365 + 89) * std::chrono::seconds(60 * 60 * 24);\n\n// TODO(JoelLinn) define xstead_clock xsystem_clock etc.\n\nnamespace internal {\n// Trick to reduce code duplication and keep all the chrono template magic\n// working\nenum class Domain {\n  // boring host clock:\n  Host,\n  // adheres to guest scaling (differrent speed, changing clock drift etc):\n  Guest\n};\n\ntemplate <Domain domain_>\nstruct NtSystemClock {\n  using rep = int64_t;\n  using period = hundrednano;\n  using duration = hundrednanoseconds;\n  using time_point = std::chrono::time_point<NtSystemClock<domain_>>;\n  // This really depends on the context the clock is used in:\n  // static constexpr bool is_steady = false;\n\n public:\n  // The delta between std::chrono::system_clock (Jan 1 1970) and NT file\n  // time (Jan 1 1601), in seconds. In the spec std::chrono::system_clock's\n  // epoch is undefined, but C++20 cements it as Jan 1 1970.\n  static constexpr std::chrono::seconds unix_epoch_delta() {\n    using std::chrono::steady_clock;\n    auto filetime_epoch = date::year{1601} / date::month{1} / date::day{1};\n    auto system_clock_epoch = date::year{1970} / date::month{1} / date::day{1};\n    auto fp = static_cast<date::sys_seconds>(\n        static_cast<date::sys_days>(filetime_epoch));\n    auto sp = static_cast<date::sys_seconds>(\n        static_cast<date::sys_days>(system_clock_epoch));\n    return fp.time_since_epoch() - sp.time_since_epoch();\n  }\n\n public:\n  static constexpr uint64_t to_file_time(time_point const& tp) noexcept {\n    return static_cast<uint64_t>(tp.time_since_epoch().count());\n  }\n\n  static constexpr time_point from_file_time(uint64_t const& tp) noexcept {\n    return time_point{duration{tp}};\n  }\n\n  // To convert XSystemClock to sys, do clock_cast<WinSystemTime>(tp) first\n  // SFINAE hack https://stackoverflow.com/a/58813009\n  template <Domain domain_fresh_ = domain_>\n  static constexpr std::enable_if_t<domain_fresh_ == Domain::Host,\n                                    std::chrono::system_clock::time_point>\n  to_sys(const time_point& tp) {\n    using sys_duration = std::chrono::system_clock::duration;\n    using sys_time = std::chrono::system_clock::time_point;\n\n    auto dp = tp;\n    dp += unix_epoch_delta();\n    auto cdp = std::chrono::time_point_cast<sys_duration>(dp);\n    return sys_time{cdp.time_since_epoch()};\n  }\n\n  template <Domain domain_fresh_ = domain_>\n  static constexpr std::enable_if_t<domain_fresh_ == Domain::Host, time_point>\n  from_sys(const std::chrono::system_clock::time_point& tp) {\n    auto ctp = std::chrono::time_point_cast<duration>(tp);\n    auto dp = time_point{ctp.time_since_epoch()};\n    dp -= unix_epoch_delta();\n    return dp;\n  }\n\n  [[nodiscard]] static time_point now() noexcept {\n    if constexpr (domain_ == Domain::Host) {\n      // QueryHostSystemTime() returns windows epoch times even on POSIX\n      return from_file_time(Clock::QueryHostSystemTime());\n    } else if constexpr (domain_ == Domain::Guest) {\n      return from_file_time(Clock::QueryGuestSystemTime());\n    }\n  }\n};\n}  // namespace internal\n\n// Unscaled system clock which can be used for filetime <-> system_clock\n// conversion\nusing WinSystemClock = internal::NtSystemClock<internal::Domain::Host>;\n\n// Guest system clock, scaled\nusing XSystemClock = internal::NtSystemClock<internal::Domain::Guest>;\n\n}  // namespace chrono\n}  // namespace xe\n\nnamespace date {\n\ntemplate <>\nstruct clock_time_conversion<::xe::chrono::WinSystemClock,\n                             ::xe::chrono::XSystemClock> {\n  using WClock_ = ::xe::chrono::WinSystemClock;\n  using XClock_ = ::xe::chrono::XSystemClock;\n\n  template <typename Duration>\n  typename WClock_::time_point operator()(\n      const std::chrono::time_point<XClock_, Duration>& t) const {\n    // Consult chrono_steady_cast.h for explanation on this:\n    std::atomic_thread_fence(std::memory_order_acq_rel);\n    auto w_now = WClock_::now();\n    auto x_now = XClock_::now();\n    std::atomic_thread_fence(std::memory_order_acq_rel);\n\n    auto delta = (t - x_now);\n    if (!::cvars::clock_no_scaling) {\n      delta = std::chrono::floor<WClock_::duration>(\n          delta * xe::Clock::guest_time_scalar());\n    }\n    return w_now + delta;\n  }\n};\n\ntemplate <>\nstruct clock_time_conversion<::xe::chrono::XSystemClock,\n                             ::xe::chrono::WinSystemClock> {\n  using WClock_ = ::xe::chrono::WinSystemClock;\n  using XClock_ = ::xe::chrono::XSystemClock;\n\n  template <typename Duration>\n  typename XClock_::time_point operator()(\n      const std::chrono::time_point<WClock_, Duration>& t) const {\n    // Consult chrono_steady_cast.h for explanation on this:\n    std::atomic_thread_fence(std::memory_order_acq_rel);\n    auto w_now = WClock_::now();\n    auto x_now = XClock_::now();\n    std::atomic_thread_fence(std::memory_order_acq_rel);\n\n    xe::chrono::hundrednanoseconds delta = (t - w_now);\n    if (!::cvars::clock_no_scaling) {\n      delta = std::chrono::floor<WClock_::duration>(\n          delta / xe::Clock::guest_time_scalar());\n    }\n    return x_now + delta;\n  }\n};\n\n}  // namespace date\n\n#endif\n"
  },
  {
    "path": "src/xenia/base/chrono_steady_cast.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_BASE_CHRONO_STEADY_CAST_H_\n#define XENIA_BASE_CHRONO_STEADY_CAST_H_\n\n#include <atomic>\n\n#include \"xenia/base/chrono.h\"\n\n// This is in a separate header because casting to and from steady time points\n// usually doesn't make sense and is imprecise. However, NT uses the FileTime\n// epoch as a steady clock in waits. In such cases, include this header and use\n// clock_cast<>().\n\nnamespace date {\n\n// This conveniently works only for Host time domain because Guest needs\n// additional scaling. Convert XSystemClock to WinSystemClock first if\n// necessary.\ntemplate <>\nstruct clock_time_conversion<::xe::chrono::WinSystemClock,\n                             std::chrono::steady_clock> {\n  // using NtSystemClock_ = ::xe::chrono::internal::NtSystemClock<domain_>;\n  using WinSystemClock_ = ::xe::chrono::WinSystemClock;\n  using steady_clock_ = std::chrono::steady_clock;\n\n  template <typename Duration>\n  typename WinSystemClock_::time_point operator()(\n      const std::chrono::time_point<steady_clock_, Duration>& t) const {\n    // Since there is no known epoch for steady_clock and even if, since it can\n    // progress differently than other common clocks (e.g. stopping when the\n    // computer is suspended), we need to use now() which introduces\n    // imprecision.\n    // Memory fences to keep the clock fetches close together to\n    // minimize drift. This pattern was benchmarked to give the lowest\n    // conversion error: error = sty_tpoint -\n    // clock_cast<sty>(clock_cast<nt>(sty_tpoint));\n    std::atomic_thread_fence(std::memory_order_acq_rel);\n    auto steady_now = steady_clock_::now();\n    auto nt_now = WinSystemClock_::now();\n    std::atomic_thread_fence(std::memory_order_acq_rel);\n\n    auto delta = std::chrono::floor<WinSystemClock_::duration>(t - steady_now);\n    return nt_now + delta;\n  }\n};\n\ntemplate <>\nstruct clock_time_conversion<std::chrono::steady_clock,\n                             ::xe::chrono::WinSystemClock> {\n  using WinSystemClock_ = ::xe::chrono::WinSystemClock;\n  using steady_clock_ = std::chrono::steady_clock;\n\n  template <typename Duration>\n  steady_clock_::time_point operator()(\n      const std::chrono::time_point<WinSystemClock_, Duration>& t) const {\n    std::atomic_thread_fence(std::memory_order_acq_rel);\n    auto steady_now = steady_clock_::now();\n    auto nt_now = WinSystemClock_::now();\n    std::atomic_thread_fence(std::memory_order_acq_rel);\n\n    auto delta = t - nt_now;\n    return steady_now + delta;\n  }\n};\n\n}  // namespace date\n\n#endif\n"
  },
  {
    "path": "src/xenia/base/clock.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2019 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/clock.h\"\n\n#include <algorithm>\n#include <limits>\n#include <mutex>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/math.h\"\n\nDEFINE_bool(clock_no_scaling, false,\n            \"Disable scaling code. Time management and locking is bypassed. \"\n            \"Guest system time is directly pulled from host.\",\n            \"CPU\");\nDEFINE_bool(clock_source_raw, false,\n            \"Use the RDTSC instruction as the time source. \"\n            \"Host CPU must support invariant TSC.\",\n            \"CPU\");\n\nnamespace xe {\n\n// Time scalar applied to all time operations.\ndouble guest_time_scalar_ = 1.0;\n// Tick frequency of guest.\nuint64_t guest_tick_frequency_ = Clock::host_tick_frequency_platform();\n// Base FILETIME of the guest system from app start.\nuint64_t guest_system_time_base_ = Clock::QueryHostSystemTime();\n// Combined time and frequency ratio between host and guest.\n// Split in numerator (first) and denominator (second).\n// Computed by RecomputeGuestTickScalar.\nstd::pair<uint64_t, uint64_t> guest_tick_ratio_ = std::make_pair(1, 1);\n\n// Native guest ticks.\nuint64_t last_guest_tick_count_ = 0;\n// Last sampled host tick count.\nuint64_t last_host_tick_count_ = Clock::QueryHostTickCount();\n// Mutex to ensure last_host_tick_count_ and last_guest_tick_count_ are in sync\nstd::mutex tick_mutex_;\n\nvoid RecomputeGuestTickScalar() {\n  // Create a rational number with numerator (first) and denominator (second)\n  auto frac =\n      std::make_pair(guest_tick_frequency_, Clock::QueryHostTickFrequency());\n  // Doing it this way ensures we don't mess up our frequency scaling and\n  // precisely controls the precision the guest_time_scalar_ can have.\n  if (guest_time_scalar_ > 1.0) {\n    frac.first *= static_cast<uint64_t>(guest_time_scalar_ * 10.0);\n    frac.second *= 10;\n  } else {\n    frac.first *= 10;\n    frac.second *= static_cast<uint64_t>(10.0 / guest_time_scalar_);\n  }\n  // Keep this a rational calculation and reduce the fraction\n  reduce_fraction(frac);\n\n  std::lock_guard<std::mutex> lock(tick_mutex_);\n  guest_tick_ratio_ = frac;\n}\n\n// Update the guest timer for all threads.\n// Return a copy of the value so locking is reduced.\nuint64_t UpdateGuestClock() {\n  uint64_t host_tick_count = Clock::QueryHostTickCount();\n\n  if (cvars::clock_no_scaling) {\n    // Nothing to update, calculate on the fly\n    return host_tick_count * guest_tick_ratio_.first / guest_tick_ratio_.second;\n  }\n\n  std::unique_lock<std::mutex> lock(tick_mutex_, std::defer_lock);\n  if (lock.try_lock()) {\n    // Translate host tick count to guest tick count.\n    uint64_t host_tick_delta = host_tick_count > last_host_tick_count_\n                                   ? host_tick_count - last_host_tick_count_\n                                   : 0;\n    last_host_tick_count_ = host_tick_count;\n    uint64_t guest_tick_delta =\n        host_tick_delta * guest_tick_ratio_.first / guest_tick_ratio_.second;\n    last_guest_tick_count_ += guest_tick_delta;\n    return last_guest_tick_count_;\n  } else {\n    // Wait until another thread has finished updating the clock.\n    lock.lock();\n    return last_guest_tick_count_;\n  }\n}\n\n// Offset of the current guest system file time relative to the guest base time.\ninline uint64_t QueryGuestSystemTimeOffset() {\n  if (cvars::clock_no_scaling) {\n    return Clock::QueryHostSystemTime() - guest_system_time_base_;\n  }\n\n  auto guest_tick_count = UpdateGuestClock();\n\n  uint64_t numerator = 10000000;  // 100ns/10MHz resolution\n  uint64_t denominator = guest_tick_frequency_;\n  reduce_fraction(numerator, denominator);\n\n  return guest_tick_count * numerator / denominator;\n}\n\nuint64_t Clock::QueryHostTickFrequency() {\n#if XE_CLOCK_RAW_AVAILABLE\n  if (cvars::clock_source_raw) {\n    return host_tick_frequency_raw();\n  }\n#endif\n  return host_tick_frequency_platform();\n}\nuint64_t Clock::QueryHostTickCount() {\n#if XE_CLOCK_RAW_AVAILABLE\n  if (cvars::clock_source_raw) {\n    return host_tick_count_raw();\n  }\n#endif\n  return host_tick_count_platform();\n}\n\ndouble Clock::guest_time_scalar() { return guest_time_scalar_; }\n\nvoid Clock::set_guest_time_scalar(double scalar) {\n  if (cvars::clock_no_scaling) {\n    return;\n  }\n\n  guest_time_scalar_ = scalar;\n  RecomputeGuestTickScalar();\n}\n\nstd::pair<uint64_t, uint64_t> Clock::guest_tick_ratio() {\n  std::lock_guard<std::mutex> lock(tick_mutex_);\n  return guest_tick_ratio_;\n}\n\nuint64_t Clock::guest_tick_frequency() { return guest_tick_frequency_; }\n\nvoid Clock::set_guest_tick_frequency(uint64_t frequency) {\n  guest_tick_frequency_ = frequency;\n  RecomputeGuestTickScalar();\n}\n\nuint64_t Clock::guest_system_time_base() { return guest_system_time_base_; }\n\nvoid Clock::set_guest_system_time_base(uint64_t time_base) {\n  guest_system_time_base_ = time_base;\n}\n\nuint64_t Clock::QueryGuestTickCount() {\n  auto guest_tick_count = UpdateGuestClock();\n  return guest_tick_count;\n}\n\nuint64_t Clock::QueryGuestSystemTime() {\n  if (cvars::clock_no_scaling) {\n    return Clock::QueryHostSystemTime();\n  }\n\n  auto guest_system_time_offset = QueryGuestSystemTimeOffset();\n  return guest_system_time_base_ + guest_system_time_offset;\n}\n\nuint32_t Clock::QueryGuestUptimeMillis() {\n  return static_cast<uint32_t>(\n      std::min<uint64_t>(QueryGuestSystemTimeOffset() / 10000,\n                         std::numeric_limits<uint32_t>::max()));\n}\n\nvoid Clock::SetGuestSystemTime(uint64_t system_time) {\n  if (cvars::clock_no_scaling) {\n    // Time is fixed to host time.\n    return;\n  }\n\n  // Query the filetime offset to calculate a new base time.\n  auto guest_system_time_offset = QueryGuestSystemTimeOffset();\n  guest_system_time_base_ = system_time - guest_system_time_offset;\n}\n\nuint32_t Clock::ScaleGuestDurationMillis(uint32_t guest_ms) {\n  if (cvars::clock_no_scaling) {\n    return guest_ms;\n  }\n\n  constexpr uint64_t max = std::numeric_limits<uint32_t>::max();\n\n  if (guest_ms >= max) {\n    return max;\n  } else if (!guest_ms) {\n    return 0;\n  }\n  uint64_t scaled_ms = static_cast<uint64_t>(\n      (static_cast<uint64_t>(guest_ms) * guest_time_scalar_));\n  return static_cast<uint32_t>(std::min(scaled_ms, max));\n}\n\nint64_t Clock::ScaleGuestDurationFileTime(int64_t guest_file_time) {\n  if (cvars::clock_no_scaling) {\n    return static_cast<uint64_t>(guest_file_time);\n  }\n\n  if (!guest_file_time) {\n    return 0;\n  } else if (guest_file_time > 0) {\n    // Absolute time.\n    uint64_t guest_time = Clock::QueryGuestSystemTime();\n    int64_t relative_time = guest_file_time - static_cast<int64_t>(guest_time);\n    int64_t scaled_time =\n        static_cast<int64_t>(relative_time * guest_time_scalar_);\n    return static_cast<int64_t>(guest_time) + scaled_time;\n  } else {\n    // Relative time.\n    uint64_t scaled_file_time = static_cast<uint64_t>(\n        (static_cast<uint64_t>(guest_file_time) * guest_time_scalar_));\n    // TODO(benvanik): check for overflow?\n    return scaled_file_time;\n  }\n}\n\nvoid Clock::ScaleGuestDurationTimeval(int32_t* tv_sec, int32_t* tv_usec) {\n  if (cvars::clock_no_scaling) {\n    return;\n  }\n\n  uint64_t scaled_sec = static_cast<uint64_t>(static_cast<uint64_t>(*tv_sec) *\n                                              guest_time_scalar_);\n  uint64_t scaled_usec = static_cast<uint64_t>(static_cast<uint64_t>(*tv_usec) *\n                                               guest_time_scalar_);\n  if (scaled_usec > std::numeric_limits<uint32_t>::max()) {\n    uint64_t overflow_sec = scaled_usec / 1000000;\n    scaled_usec -= overflow_sec * 1000000;\n    scaled_sec += overflow_sec;\n  }\n  *tv_sec = int32_t(scaled_sec);\n  *tv_usec = int32_t(scaled_usec);\n}\n\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/base/clock.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_BASE_CLOCK_H_\n#define XENIA_BASE_CLOCK_H_\n\n#include <chrono>\n#include <cstdint>\n\n#include \"xenia/base/cvar.h\"\n#include \"xenia/base/platform.h\"\n\n#if XE_ARCH_AMD64\n#define XE_CLOCK_RAW_AVAILABLE 1\n#endif\n\nDECLARE_bool(clock_no_scaling);\nDECLARE_bool(clock_source_raw);\n\nnamespace xe {\n\n// chrono APIs in xenia/base/chrono.h are preferred\n\nclass Clock {\n public:\n  // Host ticks-per-second. Generally QueryHostTickFrequency should be used.\n  // Either from platform suplied time source or from hardware directly.\n  static uint64_t host_tick_frequency_platform();\n#if XE_CLOCK_RAW_AVAILABLE\n  static uint64_t host_tick_frequency_raw();\n#endif\n  // Host tick count. Generally QueryHostTickCount() should be used.\n  static uint64_t host_tick_count_platform();\n#if XE_CLOCK_RAW_AVAILABLE\n  static uint64_t host_tick_count_raw();\n#endif\n\n  // Queries the host tick frequency.\n  static uint64_t QueryHostTickFrequency();\n  // Queries the current host tick count.\n  static uint64_t QueryHostTickCount();\n  // Host time, in FILETIME format.\n  static uint64_t QueryHostSystemTime();\n  // Queries the milliseconds since the host began.\n  static uint64_t QueryHostUptimeMillis();\n\n  // Guest time scalar.\n  static double guest_time_scalar();\n  // Sets the guest time scalar, adjusting tick and wall clock speed.\n  // Ex: 1x=normal, 2x=double speed, 1/2x=half speed.\n  static void set_guest_time_scalar(double scalar);\n  // Get the tick ration between host and guest including time scaling if set.\n  static std::pair<uint64_t, uint64_t> guest_tick_ratio();\n  // Guest ticks-per-second.\n  static uint64_t guest_tick_frequency();\n  // Sets the guest ticks-per-second.\n  static void set_guest_tick_frequency(uint64_t frequency);\n  // Time based used for the guest system time.\n  static uint64_t guest_system_time_base();\n  // Sets the guest time base, used for computing the system time.\n  // By default this is the current system time.\n  static void set_guest_system_time_base(uint64_t time_base);\n\n  // Queries the current guest tick count, accounting for frequency adjustment\n  // and scaling.\n  static uint64_t QueryGuestTickCount();\n  // Queries the guest time, in FILETIME format, accounting for scaling.\n  static uint64_t QueryGuestSystemTime();\n  // Queries the milliseconds since the guest began, accounting for scaling.\n  static uint32_t QueryGuestUptimeMillis();\n\n  // Sets the system time of the guest.\n  static void SetGuestSystemTime(uint64_t system_time);\n\n  // Scales a time duration in milliseconds, from guest time.\n  static uint32_t ScaleGuestDurationMillis(uint32_t guest_ms);\n  // Scales a time duration in 100ns ticks like FILETIME, from guest time.\n  static int64_t ScaleGuestDurationFileTime(int64_t guest_file_time);\n  // Scales a time duration represented as a timeval, from guest time.\n  static void ScaleGuestDurationTimeval(int32_t* tv_sec, int32_t* tv_usec);\n};\n\n}  // namespace xe\n\n#endif  // XENIA_BASE_CLOCK_H_\n"
  },
  {
    "path": "src/xenia/base/clock_posix.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include <sys/time.h>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/clock.h\"\n\nnamespace xe {\n\nuint64_t Clock::host_tick_frequency_platform() {\n  timespec res;\n  int error = clock_getres(CLOCK_MONOTONIC_RAW, &res);\n  assert_zero(error);\n  assert_zero(res.tv_sec);  // Sub second resolution is required.\n\n  // Convert nano seconds to hertz. Resolution is 1ns on most systems.\n  return 1000000000ull / res.tv_nsec;\n}\n\nuint64_t Clock::host_tick_count_platform() {\n  timespec tp;\n  int error = clock_gettime(CLOCK_MONOTONIC_RAW, &tp);\n  assert_zero(error);\n\n  return tp.tv_nsec + tp.tv_sec * 1000000000ull;\n}\n\nuint64_t Clock::QueryHostSystemTime() {\n  // https://docs.microsoft.com/en-us/windows/win32/sysinfo/converting-a-time-t-value-to-a-file-time\n  constexpr uint64_t seconds_per_day = 3600 * 24;\n  // Don't forget the 89 leap days.\n  constexpr uint64_t seconds_1601_to_1970 =\n      ((369 * 365 + 89) * seconds_per_day);\n\n  timeval now;\n  int error = gettimeofday(&now, nullptr);\n  assert_zero(error);\n\n  // NT systems use 100ns intervals.\n  return static_cast<uint64_t>(\n      (static_cast<int64_t>(now.tv_sec) + seconds_1601_to_1970) * 10000000ull +\n      now.tv_usec * 10);\n}\n\nuint64_t Clock::QueryHostUptimeMillis() {\n  return host_tick_count_platform() * 1000 / host_tick_frequency_platform();\n}\n\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/base/clock_win.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2019 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/clock.h\"\n\n#include \"xenia/base/platform_win.h\"\n\nnamespace xe {\n\nuint64_t Clock::host_tick_frequency_platform() {\n  LARGE_INTEGER frequency;\n  QueryPerformanceFrequency(&frequency);\n  return frequency.QuadPart;\n}\n\nuint64_t Clock::host_tick_count_platform() {\n  LARGE_INTEGER counter;\n  uint64_t time = 0;\n  if (QueryPerformanceCounter(&counter)) {\n    time = counter.QuadPart;\n  }\n  return time;\n}\n\nuint64_t Clock::QueryHostSystemTime() {\n  FILETIME t;\n  GetSystemTimeAsFileTime(&t);\n  return (uint64_t(t.dwHighDateTime) << 32) | t.dwLowDateTime;\n}\n\nuint64_t Clock::QueryHostUptimeMillis() {\n  return host_tick_count_platform() * 1000 / host_tick_frequency_platform();\n}\n\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/base/clock_x64.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/clock.h\"\n#include \"xenia/base/platform.h\"\n\n#if XE_ARCH_AMD64 && XE_CLOCK_RAW_AVAILABLE\n\n#include \"xenia/base/logging.h\"\n\n// Wrap all these different cpu compiler intrinsics.\n// So no inline assembler here and the compiler will remove the clutter.\n#if XE_COMPILER_MSVC\n#define xe_cpu_cpuid(level, eax, ebx, ecx, edx)              \\\n  {                                                          \\\n    int __xe_cpuid_registers_[4];                            \\\n    __cpuid(__xe_cpuid_registers_, (level));                 \\\n    (eax) = static_cast<uint32_t>(__xe_cpuid_registers_[0]); \\\n    (ebx) = static_cast<uint32_t>(__xe_cpuid_registers_[1]); \\\n    (ecx) = static_cast<uint32_t>(__xe_cpuid_registers_[2]); \\\n    (edx) = static_cast<uint32_t>(__xe_cpuid_registers_[3]); \\\n  }\n#define xe_cpu_rdtsc() __rdtsc()\n#elif XE_COMPILER_CLANG || XE_COMPILER_GNUC\n#include <cpuid.h>\n#define xe_cpu_cpuid(level, eax, ebx, ecx, edx) \\\n  __cpuid((level), (eax), (ebx), (ecx), (edx));\n#define xe_cpu_rdtsc() __rdtsc()\n#else\n#error \"No cpu instruction wrappers for current compiler implemented.\"\n#endif\n\n#define CLOCK_FATAL(msg)                                                    \\\n  xe::FatalError(\"The raw clock source is not supported on your CPU.\\n\" msg \\\n                 \"\\n\"                                                       \\\n                 \"Set the cvar 'clock_source_raw' to 'false'.\");\n\nnamespace xe {\n// Getting the TSC frequency can be a bit tricky. This method here only works on\n// Intel as it seems. There is no easy way to get the frequency outside of ring0\n// on AMD, so we fail gracefully if not possible.\nuint64_t Clock::host_tick_frequency_raw() {\n  uint32_t eax, ebx, ecx, edx;\n\n  // 00H Get max supported cpuid level.\n  xe_cpu_cpuid(0x0, eax, ebx, ecx, edx);\n  auto max_cpuid = eax;\n  // 80000000H Get max extended cpuid level\n  xe_cpu_cpuid(0x80000000, eax, ebx, ecx, edx);\n  auto max_cpuid_ex = eax;\n\n  // 80000007H Get extended power feature info\n  if (max_cpuid_ex >= 0x80000007) {\n    xe_cpu_cpuid(0x80000007, eax, ebx, ecx, edx);\n    // Invariant TSC bit at position 8\n    auto tsc_invariant = edx & (1 << 8);\n    // If the TSC is not invariant it will change its frequency with power\n    // states and across cores.\n    if (!tsc_invariant) {\n      CLOCK_FATAL(\"The CPU has no invariant TSC.\");\n      return 0;\n    }\n  } else {\n    CLOCK_FATAL(\"Unclear if the CPU has an invariant TSC.\")\n    return 0;\n  }\n\n  if (max_cpuid >= 0x15) {\n    // 15H Get TSC/Crystal ratio and Crystal Hz.\n    xe_cpu_cpuid(0x15, eax, ebx, ecx, edx);\n    uint64_t ratio_num = ebx;\n    uint64_t ratio_den = eax;\n    uint64_t cryst_freq = ecx;\n    // For some CPUs, Crystal frequency is not reported.\n    if (ratio_num && ratio_den && cryst_freq) {\n      // If it is, calculate the TSC frequency\n      return cryst_freq * ratio_num / ratio_den;\n    }\n  }\n\n  if (max_cpuid >= 0x16) {\n    // 16H Get CPU base frequency MHz in EAX.\n    xe_cpu_cpuid(0x16, eax, ebx, ecx, edx);\n    uint64_t cpu_base_freq = static_cast<uint64_t>(eax) * 1000000;\n    assert(cpu_base_freq);\n    return cpu_base_freq;\n  }\n\n  CLOCK_FATAL(\"The clock frequency could not be determined.\");\n  return 0;\n}\n\nuint64_t Clock::host_tick_count_raw() { return xe_cpu_rdtsc(); }\n\n}  // namespace xe\n\n#endif\n"
  },
  {
    "path": "src/xenia/base/console.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_BASE_CONSOLE_H_\n#define XENIA_BASE_CONSOLE_H_\n\nnamespace xe {\n\n// Returns true if there is a user-visible console attached to receive stdout.\nbool has_console_attached();\n\nvoid AttachConsole();\n\n}  // namespace xe\n\n#endif  // XENIA_BASE_CONSOLE_H_\n"
  },
  {
    "path": "src/xenia/base/console_app_main.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_BASE_CONSOLE_APP_MAIN_H_\n#define XENIA_BASE_CONSOLE_APP_MAIN_H_\n\n#include <string>\n#include <vector>\n\nnamespace xe {\n\n// Extern defined by user code. This must be present for the application to\n// launch.\nstruct ConsoleAppEntryInfo {\n  std::string name;\n  int (*entry_point)(const std::vector<std::string>& args);\n  bool transparent_options;  // no argument parsing\n  std::string positional_usage;\n  std::vector<std::string> positional_options;\n};\nConsoleAppEntryInfo GetConsoleAppEntryInfo();\n\n// TODO(Triang3l): Multiple console app entry points on Android when a console\n// activity is added. This is currently for individual executables running on\n// Termux.\n\n#define XE_DEFINE_CONSOLE_APP(name, entry_point, positional_usage, ...)    \\\n  xe::ConsoleAppEntryInfo xe::GetConsoleAppEntryInfo() {                   \\\n    std::initializer_list<std::string> positional_options = {__VA_ARGS__}; \\\n    return xe::ConsoleAppEntryInfo{                                        \\\n        name, entry_point, false, positional_usage,                        \\\n        std::vector<std::string>(std::move(positional_options))};          \\\n  }\n\n// TODO(Joel Linn): Add some way to filter consumed arguments in\n// cvar::ParseLaunchArguments()\n#define XE_DEFINE_CONSOLE_APP_TRANSPARENT(name, entry_point)               \\\n  xe::ConsoleAppEntryInfo xe::GetConsoleAppEntryInfo() {                   \\\n    return xe::ConsoleAppEntryInfo{name, entry_point, true, std::string(), \\\n                                   std::vector<std::string>()};            \\\n  }\n\n}  // namespace xe\n\n#endif  // XENIA_BASE_CONSOLE_APP_MAIN_H_\n"
  },
  {
    "path": "src/xenia/base/console_app_main_android.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include <string>\n#include <vector>\n\n#include \"xenia/base/console_app_main.h\"\n#include \"xenia/base/cvar.h\"\n#include \"xenia/base/main_android.h\"\n\nextern \"C\" int main(int argc, char** argv) {\n  xe::ConsoleAppEntryInfo entry_info = xe::GetConsoleAppEntryInfo();\n\n  if (!entry_info.transparent_options) {\n    cvar::ParseLaunchArguments(argc, argv, entry_info.positional_usage,\n                               entry_info.positional_options);\n  }\n\n  // Initialize Android globals, including logging. Needs parsed cvars.\n  // TODO(Triang3l): Obtain the actual API level.\n  xe::InitializeAndroidAppFromMainThread(__ANDROID_API__, nullptr, nullptr,\n                                         nullptr);\n\n  std::vector<std::string> args;\n  for (int n = 0; n < argc; n++) {\n    args.emplace_back(argv[n]);\n  }\n\n  int result = entry_info.entry_point(args);\n\n  xe::ShutdownAndroidAppFromMainThread();\n\n  return result;\n}\n"
  },
  {
    "path": "src/xenia/base/console_app_main_posix.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include <string>\n#include <vector>\n\n#include \"xenia/base/console_app_main.h\"\n#include \"xenia/base/cvar.h\"\n#include \"xenia/base/logging.h\"\n\nextern \"C\" int main(int argc, char** argv) {\n  xe::ConsoleAppEntryInfo entry_info = xe::GetConsoleAppEntryInfo();\n\n  if (!entry_info.transparent_options) {\n    cvar::ParseLaunchArguments(argc, argv, entry_info.positional_usage,\n                               entry_info.positional_options);\n  }\n\n  // Initialize logging. Needs parsed cvars.\n  xe::InitializeLogging(entry_info.name);\n\n  std::vector<std::string> args;\n  for (int n = 0; n < argc; n++) {\n    args.emplace_back(argv[n]);\n  }\n\n  int result = entry_info.entry_point(args);\n\n  xe::ShutdownLogging();\n\n  return result;\n}\n"
  },
  {
    "path": "src/xenia/base/console_app_main_win.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include <cstdlib>\n#include <vector>\n\n#include \"xenia/base/console_app_main.h\"\n#include \"xenia/base/main_win.h\"\n\n// A wide character entry point is required for functions like _get_wpgmptr.\nint wmain(int argc_ignored, wchar_t** argv_ignored) {\n  xe::ConsoleAppEntryInfo entry_info = xe::GetConsoleAppEntryInfo();\n\n  std::vector<std::string> args;\n  if (!xe::ParseWin32LaunchArguments(entry_info.transparent_options,\n                                     entry_info.positional_usage,\n                                     entry_info.positional_options, &args)) {\n    return EXIT_FAILURE;\n  }\n\n  int result = xe::InitializeWin32App(entry_info.name);\n  if (result) {\n    return result;\n  }\n\n  result = entry_info.entry_point(args);\n\n  xe::ShutdownWin32App();\n\n  return result;\n}\n"
  },
  {
    "path": "src/xenia/base/console_posix.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include <stdio.h>\n#include <unistd.h>\n\n#include \"xenia/base/console.h\"\n\nnamespace xe {\n\nbool has_console_attached() { return isatty(fileno(stdin)) == 1; }\n\nvoid AttachConsole() {}\n\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/base/console_win.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include <fcntl.h>\n#include <io.h>\n#include <stdio.h>\n#include <stdlib.h>\n\n#include \"xenia/base/console.h\"\n#include \"xenia/base/platform_win.h\"\n\nnamespace xe {\n\n// TODO(Triang3l): Set the default depending on the actual subsystem. Currently\n// it inhibits message boxes.\nstatic bool has_console_attached_ = true;\n\nbool has_console_attached() { return has_console_attached_; }\n\nstatic bool has_shell_environment_variable() {\n  size_t size = 0;\n  // Check if SHELL exists\n  // If it doesn't, then we are in a Windows Terminal\n  auto error = _wgetenv_s(&size, nullptr, 0, L\"SHELL\");\n  if (error) {\n    return false;\n  }\n  return !!size;\n}\n\nvoid AttachConsole() {\n  bool has_console = ::AttachConsole(ATTACH_PARENT_PROCESS) == TRUE;\n  if (!has_console || !has_shell_environment_variable()) {\n    // We weren't launched from a console, so just return.\n    has_console_attached_ = false;\n    return;\n  }\n\n  AllocConsole();\n\n  has_console_attached_ = true;\n\n  auto std_handle = (intptr_t)GetStdHandle(STD_OUTPUT_HANDLE);\n  auto con_handle = _open_osfhandle(std_handle, _O_TEXT);\n  auto fp = _fdopen(con_handle, \"w\");\n  freopen_s(&fp, \"CONOUT$\", \"w\", stdout);\n\n  std_handle = (intptr_t)GetStdHandle(STD_ERROR_HANDLE);\n  con_handle = _open_osfhandle(std_handle, _O_TEXT);\n  fp = _fdopen(con_handle, \"w\");\n  freopen_s(&fp, \"CONOUT$\", \"w\", stderr);\n}\n\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/base/cvar.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/cvar.h\"\n\n#define UTF_CPP_CPLUSPLUS 201703L\n#include \"third_party/utfcpp/source/utf8.h\"\n\n#include \"xenia/base/console.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/system.h\"\n#include \"xenia/base/utf8.h\"\n\nnamespace utfcpp = utf8;\n\nusing u8_citer = utfcpp::iterator<std::string_view::const_iterator>;\n\nnamespace cvar {\n\ncxxopts::Options options(\"xenia\", \"Xbox 360 Emulator\");\nstd::map<std::string, ICommandVar*>* CmdVars;\nstd::map<std::string, IConfigVar*>* ConfigVars;\nstd::multimap<uint32_t, const IConfigVarUpdate*>* IConfigVarUpdate::updates_;\n\nvoid PrintHelpAndExit() {\n  std::cout << options.help({\"\"}) << std::endl;\n  std::cout << \"For the full list of command line arguments, see xenia.cfg.\"\n            << std::endl;\n  exit(0);\n}\n\nvoid ParseLaunchArguments(int& argc, char**& argv,\n                          const std::string_view positional_help,\n                          const std::vector<std::string>& positional_options) {\n  options.add_options()(\"help\", \"Prints help and exit.\");\n\n  if (!CmdVars) {\n    CmdVars = new std::map<std::string, ICommandVar*>();\n  }\n\n  if (!ConfigVars) {\n    ConfigVars = new std::map<std::string, IConfigVar*>();\n  }\n\n  for (auto& it : *CmdVars) {\n    auto cmdVar = it.second;\n    cmdVar->AddToLaunchOptions(&options);\n  }\n\n  for (const auto& it : *ConfigVars) {\n    auto configVar = it.second;\n    configVar->AddToLaunchOptions(&options);\n  }\n\n  try {\n    options.positional_help(std::string(positional_help));\n    options.parse_positional(positional_options);\n\n    auto result = options.parse(argc, argv);\n    if (result.count(\"help\")) {\n      xe::AttachConsole();\n      if (xe::has_console_attached()) {\n        PrintHelpAndExit();\n      } else {\n        xe::ShowSimpleMessageBox(xe::SimpleMessageBoxType::Help,\n                                 options.help({\"\"}));\n        exit(0);\n      }\n    }\n\n    for (auto& it : *CmdVars) {\n      auto cmdVar = static_cast<ICommandVar*>(it.second);\n      if (result.count(cmdVar->name())) {\n        cmdVar->LoadFromLaunchOptions(&result);\n      }\n    }\n\n    for (auto& it : *ConfigVars) {\n      auto configVar = static_cast<IConfigVar*>(it.second);\n      if (result.count(configVar->name())) {\n        configVar->LoadFromLaunchOptions(&result);\n      }\n    }\n  } catch (const cxxopts::OptionException& e) {\n    xe::AttachConsole();\n    if (xe::has_console_attached()) {\n      std::cout << e.what() << std::endl;\n      PrintHelpAndExit();\n    } else {\n      std::string m =\n          \"Invalid launch options were given.\\n\" + options.help({\"\"});\n      xe::ShowSimpleMessageBox(xe::SimpleMessageBoxType::Error, m);\n      exit(0);\n    }\n  }\n}\n\nnamespace toml {\n\nstd::string EscapeBasicString(const std::string_view view) {\n  std::string result;\n  auto begin = u8_citer(view.cbegin(), view.cbegin(), view.cend());\n  auto end = u8_citer(view.cend(), view.cbegin(), view.cend());\n  for (auto it = begin; it != end; ++it) {\n    auto c = *it;\n    if (c == '\\b') {\n      result += u8\"\\\\b\";\n    } else if (c == '\\t') {\n      result += u8\"\\\\t\";\n    } else if (c == '\\n') {\n      result += u8\"\\\\n\";\n    } else if (c == '\\f') {\n      result += u8\"\\\\f\";\n    } else if (c == '\\r') {\n      result += u8\"\\\\r\";\n    } else if (c == '\"') {\n      result += u8\"\\\\\\\"\";\n    } else if (c == '\\\\') {\n      result += u8\"\\\\\\\\\";\n    } else if (c < 0x20 || c == 0x7F) {\n      if (c <= 0xFFFF) {\n        result += fmt::format(u8\"\\\\u{:04X}\", c);\n      } else {\n        result += fmt::format(u8\"\\\\u{:08X}\", c);\n      }\n    } else {\n      utfcpp::append(static_cast<char32_t>(c), result);\n    }\n  }\n  return result;\n}\n\nstd::string EscapeMultilineBasicString(const std::string_view view) {\n  std::string result;\n  int quote_run = 0;\n  auto begin = u8_citer(view.cbegin(), view.cbegin(), view.cend());\n  auto end = u8_citer(view.cend(), view.cbegin(), view.cend());\n  for (auto it = begin; it != end; ++it) {\n    auto c = *it;\n    if (quote_run > 0) {\n      if (c == '\"') {\n        ++quote_run;\n        continue;\n      }\n      for (int i = 0; i < quote_run; ++i) {\n        if ((i % 3) == 2) {\n          result += u8\"\\\\\";\n        }\n        result += u8\"\\\"\";\n      }\n      quote_run = 0;\n    }\n    if (c == '\\b') {\n      result += u8\"\\\\b\";\n    } else if (c == '\\t' || c == '\\n') {\n      result += c;\n    } else if (c == '\\f') {\n      result += u8\"\\\\f\";\n    } else if (c == '\\r') {\n      // Silently drop \\r.\n      // result += c;\n    } else if (c == '\"') {\n      quote_run = 1;\n    } else if (c == '\\\\') {\n      result += u8\"\\\\\\\\\";\n    } else if (c < 0x20 || c == 0x7F) {\n      if (c <= 0xFFFF) {\n        result += fmt::format(u8\"\\\\u{:04X}\", c);\n      } else {\n        result += fmt::format(u8\"\\\\u{:08X}\", c);\n      }\n    } else {\n      utfcpp::append(static_cast<char32_t>(c), result);\n    }\n  }\n  for (int i = 0; i < quote_run; ++i) {\n    if ((i % 3) == 2) {\n      result += u8\"\\\\\";\n    }\n    result += u8\"\\\"\";\n  }\n  return result;\n}\n\nstd::string EscapeString(const std::string_view view) {\n  const auto multiline_chars = std::string_view(\"\\r\\n\");\n  const auto escape_chars = std::string_view(\n      \"\\0\\b\\v\\f\"\n      \"\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x0E\\x0F\"\n      \"\\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1A\\x1B\\x1C\\x1D\\x1E\\x1F\"\n      \"'\"\n      \"\\x7F\");\n\n  if (xe::utf8::find_any_of(view, multiline_chars) == std::string_view::npos) {\n    // single line\n    if (xe::utf8::find_any_of(view, escape_chars) == std::string_view::npos) {\n      return \"'\" + std::string(view) + \"'\";\n    } else {\n      return \"\\\"\" + toml::EscapeBasicString(view) + \"\\\"\";\n    }\n  } else {\n    // multi line\n    if (xe::utf8::find_any_of(view, escape_chars) == std::string_view::npos &&\n        xe::utf8::find_first_of(view, u8\"'''\") == std::string_view::npos) {\n      return \"'''\\n\" + std::string(view) + \"'''\";\n    } else {\n      return u8\"\\\"\\\"\\\"\\n\" + toml::EscapeMultilineBasicString(view) + u8\"\\\"\\\"\\\"\";\n    }\n  }\n}\n\n}  // namespace toml\n\n}  // namespace cvar\n"
  },
  {
    "path": "src/xenia/base/cvar.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CVAR_H_\n#define XENIA_CVAR_H_\n\n#include <filesystem>\n#include <map>\n#include <string>\n#include <vector>\n\n#include \"third_party/cpptoml/include/cpptoml.h\"\n#include \"third_party/cxxopts/include/cxxopts.hpp\"\n#include \"third_party/fmt/include/fmt/format.h\"\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/filesystem.h\"\n#include \"xenia/base/platform.h\"\n#include \"xenia/base/string_util.h\"\n\n#if XE_PLATFORM_ANDROID\n#include <jni.h>\n#endif  // XE_PLATFORM_ANDROID\n\nnamespace cvar {\n\nnamespace toml {\nstd::string EscapeString(const std::string_view str);\n}\n\nclass ICommandVar {\n public:\n  virtual ~ICommandVar() = default;\n  virtual const std::string& name() const = 0;\n  virtual const std::string& description() const = 0;\n  virtual void UpdateValue() = 0;\n  virtual void AddToLaunchOptions(cxxopts::Options* options) = 0;\n  virtual void LoadFromLaunchOptions(cxxopts::ParseResult* result) = 0;\n};\n\nclass IConfigVar : virtual public ICommandVar {\n public:\n  virtual const std::string& category() const = 0;\n  virtual bool is_transient() const = 0;\n  virtual std::string config_value() const = 0;\n  virtual void LoadConfigValue(std::shared_ptr<cpptoml::base> result) = 0;\n  virtual void LoadGameConfigValue(std::shared_ptr<cpptoml::base> result) = 0;\n  virtual void ResetConfigValueToDefault() = 0;\n};\n\ntemplate <class T>\nclass CommandVar : virtual public ICommandVar {\n public:\n  CommandVar<T>(const char* name, T* default_value, const char* description);\n  const std::string& name() const override;\n  const std::string& description() const override;\n  void AddToLaunchOptions(cxxopts::Options* options) override;\n  void LoadFromLaunchOptions(cxxopts::ParseResult* result) override;\n  void SetCommandLineValue(T val);\n  T* current_value() { return current_value_; }\n\n protected:\n  std::string name_;\n  T default_value_;\n  T* current_value_;\n  std::unique_ptr<T> commandline_value_;\n  std::string description_;\n  T Convert(std::string val);\n  static std::string ToString(T val);\n  void SetValue(T val);\n  void UpdateValue() override;\n};\n#pragma warning(push)\n#pragma warning(disable : 4250)\ntemplate <class T>\nclass ConfigVar : public CommandVar<T>, virtual public IConfigVar {\n public:\n  ConfigVar<T>(const char* name, T* default_value, const char* description,\n               const char* category, bool is_transient);\n  std::string config_value() const override;\n  const T& GetTypedConfigValue() const;\n  const std::string& category() const override;\n  bool is_transient() const override;\n  void AddToLaunchOptions(cxxopts::Options* options) override;\n  void LoadConfigValue(std::shared_ptr<cpptoml::base> result) override;\n  void LoadGameConfigValue(std::shared_ptr<cpptoml::base> result) override;\n  void SetConfigValue(T val);\n  void SetGameConfigValue(T val);\n  // Changes the actual value used to the one specified, and also makes it the\n  // one that will be stored when the global config is written next time. After\n  // overriding, however, the next game config loaded may still change it.\n  void OverrideConfigValue(T val);\n\n private:\n  std::string category_;\n  bool is_transient_;\n  std::unique_ptr<T> config_value_ = nullptr;\n  std::unique_ptr<T> game_config_value_ = nullptr;\n  void UpdateValue() override;\n  void ResetConfigValueToDefault() override;\n};\n\n#pragma warning(pop)\ntemplate <class T>\nconst std::string& CommandVar<T>::name() const {\n  return name_;\n}\ntemplate <class T>\nconst std::string& CommandVar<T>::description() const {\n  return description_;\n}\ntemplate <class T>\nvoid CommandVar<T>::AddToLaunchOptions(cxxopts::Options* options) {\n  options->add_options()(name_, description_, cxxopts::value<T>());\n}\ntemplate <>\ninline void CommandVar<std::filesystem::path>::AddToLaunchOptions(\n    cxxopts::Options* options) {\n  options->add_options()(name_, description_, cxxopts::value<std::string>());\n}\ntemplate <class T>\nvoid ConfigVar<T>::AddToLaunchOptions(cxxopts::Options* options) {\n  options->add_options(category_)(this->name_, this->description_,\n                                  cxxopts::value<T>());\n}\ntemplate <>\ninline void ConfigVar<std::filesystem::path>::AddToLaunchOptions(\n    cxxopts::Options* options) {\n  options->add_options(category_)(this->name_, this->description_,\n                                  cxxopts::value<std::string>());\n}\ntemplate <class T>\nvoid CommandVar<T>::LoadFromLaunchOptions(cxxopts::ParseResult* result) {\n  T value = (*result)[name_].template as<T>();\n  SetCommandLineValue(value);\n}\ntemplate <>\ninline void CommandVar<std::filesystem::path>::LoadFromLaunchOptions(\n    cxxopts::ParseResult* result) {\n  std::string value = (*result)[name_].template as<std::string>();\n  SetCommandLineValue(value);\n}\ntemplate <class T>\nvoid ConfigVar<T>::LoadConfigValue(std::shared_ptr<cpptoml::base> result) {\n  SetConfigValue(*cpptoml::get_impl<T>(result));\n}\ntemplate <>\ninline void ConfigVar<std::filesystem::path>::LoadConfigValue(\n    std::shared_ptr<cpptoml::base> result) {\n  SetConfigValue(\n      xe::utf8::fix_path_separators(*cpptoml::get_impl<std::string>(result)));\n}\ntemplate <class T>\nvoid ConfigVar<T>::LoadGameConfigValue(std::shared_ptr<cpptoml::base> result) {\n  SetGameConfigValue(*cpptoml::get_impl<T>(result));\n}\ntemplate <>\ninline void ConfigVar<std::filesystem::path>::LoadGameConfigValue(\n    std::shared_ptr<cpptoml::base> result) {\n  SetGameConfigValue(\n      xe::utf8::fix_path_separators(*cpptoml::get_impl<std::string>(result)));\n}\ntemplate <class T>\nCommandVar<T>::CommandVar(const char* name, T* default_value,\n                          const char* description)\n    : name_(name),\n      default_value_(*default_value),\n      description_(description),\n      current_value_(default_value) {}\n\ntemplate <class T>\nConfigVar<T>::ConfigVar(const char* name, T* default_value,\n                        const char* description, const char* category,\n                        bool is_transient)\n    : CommandVar<T>(name, default_value, description),\n      category_(category),\n      is_transient_(is_transient) {}\n\ntemplate <class T>\nvoid CommandVar<T>::UpdateValue() {\n  if (commandline_value_) return SetValue(*commandline_value_);\n  return SetValue(default_value_);\n}\ntemplate <class T>\nvoid ConfigVar<T>::UpdateValue() {\n  if (this->commandline_value_) {\n    return this->SetValue(*this->commandline_value_);\n  }\n  if (game_config_value_) return this->SetValue(*game_config_value_);\n  if (config_value_) return this->SetValue(*config_value_);\n  return this->SetValue(this->default_value_);\n}\ntemplate <class T>\nT CommandVar<T>::Convert(std::string val) {\n  return xe::string_util::from_string<T>(val);\n}\ntemplate <>\ninline std::string CommandVar<std::string>::Convert(std::string val) {\n  return val;\n}\ntemplate <>\ninline std::filesystem::path CommandVar<std::filesystem::path>::Convert(\n    std::string val) {\n  return xe::to_path(val);\n}\n\ntemplate <>\ninline std::string CommandVar<bool>::ToString(bool val) {\n  return val ? \"true\" : \"false\";\n}\ntemplate <>\ninline std::string CommandVar<std::string>::ToString(std::string val) {\n  return toml::EscapeString(val);\n}\ntemplate <>\ninline std::string CommandVar<std::filesystem::path>::ToString(\n    std::filesystem::path val) {\n  return toml::EscapeString(\n      xe::utf8::fix_path_separators(xe::path_to_utf8(val), '/'));\n}\n\ntemplate <class T>\nstd::string CommandVar<T>::ToString(T val) {\n  // Use fmt::format instead of std::to_string for locale-neutral formatting of\n  // floats, always with a period rather than a comma, which is treated as an\n  // unidentified trailing character by cpptoml.\n  return fmt::format(\"{}\", val);\n}\n\ntemplate <class T>\nvoid CommandVar<T>::SetValue(T val) {\n  *current_value_ = val;\n}\ntemplate <class T>\nconst std::string& ConfigVar<T>::category() const {\n  return category_;\n}\ntemplate <class T>\nbool ConfigVar<T>::is_transient() const {\n  return is_transient_;\n}\ntemplate <class T>\nstd::string ConfigVar<T>::config_value() const {\n  if (config_value_) return this->ToString(*config_value_);\n  return this->ToString(this->default_value_);\n}\ntemplate <class T>\nconst T& ConfigVar<T>::GetTypedConfigValue() const {\n  return config_value_ ? *config_value_ : this->default_value_;\n}\ntemplate <class T>\nvoid CommandVar<T>::SetCommandLineValue(const T val) {\n  commandline_value_ = std::make_unique<T>(val);\n  UpdateValue();\n}\ntemplate <class T>\nvoid ConfigVar<T>::SetConfigValue(T val) {\n  config_value_ = std::make_unique<T>(val);\n  UpdateValue();\n}\ntemplate <class T>\nvoid ConfigVar<T>::SetGameConfigValue(T val) {\n  game_config_value_ = std::make_unique<T>(val);\n  UpdateValue();\n}\ntemplate <class T>\nvoid ConfigVar<T>::OverrideConfigValue(T val) {\n  config_value_ = std::make_unique<T>(val);\n  // The user explicitly changes the value at runtime and wants it to take\n  // effect immediately. Drop everything with a higher priority. The next game\n  // config load, however, may still change it.\n  game_config_value_.reset();\n  this->commandline_value_.reset();\n  UpdateValue();\n}\ntemplate <class T>\nvoid ConfigVar<T>::ResetConfigValueToDefault() {\n  SetConfigValue(this->default_value_);\n}\n\n// CVars can be initialized before these, thus initialized on-demand using new.\nextern std::map<std::string, ICommandVar*>* CmdVars;\nextern std::map<std::string, IConfigVar*>* ConfigVars;\n\ninline void AddConfigVar(IConfigVar* cv) {\n  if (!ConfigVars) {\n    ConfigVars = new std::map<std::string, IConfigVar*>;\n  }\n  ConfigVars->emplace(cv->name(), cv);\n}\ninline void AddCommandVar(ICommandVar* cv) {\n  if (!CmdVars) {\n    CmdVars = new std::map<std::string, ICommandVar*>;\n  }\n  CmdVars->emplace(cv->name(), cv);\n}\nvoid ParseLaunchArguments(int& argc, char**& argv,\n                          const std::string_view positional_help,\n                          const std::vector<std::string>& positional_options);\n#if XE_PLATFORM_ANDROID\nvoid ParseLaunchArgumentsFromAndroidBundle(jobject bundle);\n#endif  // XE_PLATFORM_ANDROID\n\ntemplate <typename T>\nIConfigVar* define_configvar(const char* name, T* default_value,\n                             const char* description, const char* category,\n                             bool is_transient) {\n  IConfigVar* cfgvar = new ConfigVar<T>(name, default_value, description,\n                                        category, is_transient);\n  AddConfigVar(cfgvar);\n  return cfgvar;\n}\n\ntemplate <typename T>\nICommandVar* define_cmdvar(const char* name, T* default_value,\n                           const char* description) {\n  ICommandVar* cmdvar = new CommandVar<T>(name, default_value, description);\n  AddCommandVar(cmdvar);\n  return cmdvar;\n}\n\n#define DEFINE_bool(name, default_value, description, category) \\\n  DEFINE_CVar(name, default_value, description, category, false, bool)\n\n#define DEFINE_int32(name, default_value, description, category) \\\n  DEFINE_CVar(name, default_value, description, category, false, int32_t)\n\n#define DEFINE_uint32(name, default_value, description, category) \\\n  DEFINE_CVar(name, default_value, description, category, false, uint32_t)\n\n#define DEFINE_uint64(name, default_value, description, category) \\\n  DEFINE_CVar(name, default_value, description, category, false, uint64_t)\n\n#define DEFINE_double(name, default_value, description, category) \\\n  DEFINE_CVar(name, default_value, description, category, false, double)\n\n#define DEFINE_string(name, default_value, description, category) \\\n  DEFINE_CVar(name, default_value, description, category, false, std::string)\n\n#define DEFINE_path(name, default_value, description, category)  \\\n  DEFINE_CVar(name, default_value, description, category, false, \\\n              std::filesystem::path)\n\n#define DEFINE_transient_bool(name, default_value, description, category) \\\n  DEFINE_CVar(name, default_value, description, category, true, bool)\n\n#define DEFINE_transient_string(name, default_value, description, category) \\\n  DEFINE_CVar(name, default_value, description, category, true, std::string)\n\n#define DEFINE_transient_path(name, default_value, description, category) \\\n  DEFINE_CVar(name, default_value, description, category, true,           \\\n              std::filesystem::path)\n\n#define DEFINE_CVar(name, default_value, description, category, is_transient, \\\n                    type)                                                     \\\n  namespace cvars {                                                           \\\n  type name = default_value;                                                  \\\n  }                                                                           \\\n  namespace cv {                                                              \\\n  static cvar::IConfigVar* const cv_##name = cvar::define_configvar(          \\\n      #name, &cvars::name, description, category, is_transient);              \\\n  }\n\n// CmdVars can only be strings for now, we don't need any others\n#define CmdVar(name, default_value, description)             \\\n  namespace cvars {                                          \\\n  std::string name = default_value;                          \\\n  }                                                          \\\n  namespace cv {                                             \\\n  static cvar::ICommandVar* const cv_##name =                \\\n      cvar::define_cmdvar(#name, &cvars::name, description); \\\n  }\n\n#define DECLARE_bool(name) DECLARE_CVar(name, bool)\n\n#define DECLARE_int32(name) DECLARE_CVar(name, int32_t)\n\n#define DECLARE_uint32(name) DECLARE_CVar(name, uint32_t)\n\n#define DECLARE_uint64(name) DECLARE_CVar(name, uint64_t)\n\n#define DECLARE_double(name) DECLARE_CVar(name, double)\n\n#define DECLARE_string(name) DECLARE_CVar(name, std::string)\n\n#define DECLARE_path(name) DECLARE_CVar(name, std::filesystem::path)\n\n#define DECLARE_CVar(name, type) \\\n  namespace cvars {              \\\n  extern type name;              \\\n  }\n\n#define ACCESS_CVar(name) (*cv::cv_##name)\n\n// dynamic_cast is needed because of virtual inheritance.\n#define OVERRIDE_CVar(name, type, value)                   \\\n  dynamic_cast<cvar::ConfigVar<type>*>(&ACCESS_CVar(name)) \\\n      ->OverrideConfigValue(value);\n\n#define OVERRIDE_bool(name, value) OVERRIDE_CVar(name, bool, value)\n\n#define OVERRIDE_int32(name, value) OVERRIDE_CVar(name, int32_t, value)\n\n#define OVERRIDE_uint32(name, value) OVERRIDE_CVar(name, uint32_t, value)\n\n#define OVERRIDE_uint64(name, value) OVERRIDE_CVar(name, uint64_t, value)\n\n#define OVERRIDE_double(name, value) OVERRIDE_CVar(name, double, value)\n\n#define OVERRIDE_string(name, value) OVERRIDE_CVar(name, std::string, value)\n\n#define OVERRIDE_path(name, value) \\\n  OVERRIDE_CVar(name, std::filesystem::path, value)\n\n// Interface for changing the default value of a variable with auto-upgrading of\n// users' configs (to distinguish between a leftover old default and an explicit\n// override), without having to rename the variable.\n//\n// Two types of updates are supported:\n// - Changing the value of the variable (UPDATE_from_type) from an explicitly\n//   specified previous default value to a new one, but keeping the\n//   user-specified value if it was not the default, and thus explicitly\n//   overridden.\n// - Changing the meaning / domain of the variable (UPDATE_from_any), when\n//   previous user-specified overrides also stop making sense. Config variable\n//   type changes are also considered this type of updates (though\n//   UPDATE_from_type, if the new type doesn't match the previous one, is also\n//   safe to use - it behaves like UPDATE_from_any in this case).\n//\n// Rules of using UPDATE_:\n// - Do not remove previous UPDATE_ entries (both typed and from-any) if you're\n//   adding a new UPDATE_from_type.\n//   This ensures that if the default was changed from 1 to 2 and then to 3,\n//   both users who last launched Xenia when it was 1 and when it was 2 receive\n//   the update (however, those who have explicitly changed it from 2 to 1 when\n//   2 was the default will have it kept at 1).\n//   It's safe to remove the history before a new UPDATE_from_any, however.\n// - The date should preferably be in UTC+0 timezone.\n// - No other pull recent pull requests should have the same date (since builds\n//   are made after every commit).\n// - IConfigVarUpdate::kLastCommittedUpdateDate must be updated - see the\n//   comment near its declaration.\n\nconstexpr uint32_t MakeConfigVarUpdateDate(uint32_t year, uint32_t month,\n                                           uint32_t day, uint32_t utc_hour) {\n  // Written to the config as a decimal number - pack as decimal for user\n  // readability.\n  // Using 31 bits in the 3rd millennium already - don't add more digits.\n  return utc_hour + day * 100 + month * 10000 + year * 1000000;\n}\n\nclass IConfigVarUpdate {\n public:\n  // This global highest version constant is used to ensure that version (which\n  // is stored as one value for the whole config file) is monotonically\n  // increased when commits - primarily pull requests - are pushed to the main\n  // branch.\n  //\n  // This is to prevent the following situation:\n  // - Pull request #1 created on day 1.\n  // - Pull request #2 created on day 2.\n  // - Pull request #2 from day 2 merged on day 3.\n  // - User launches the latest version on day 4.\n  //   CVar default changes from PR #2 (day 2) applied because the user's config\n  //   version is day 0, which is < 2.\n  //   User's config has day 2 version now.\n  // - Pull request #1 from day 1 merged on day 5.\n  // - User launches the latest version on day 5.\n  //   CVar default changes from PR #1 (day 1) IGNORED because the user's config\n  //   version is day 2, which is >= 1.\n  //\n  // If this constant is not updated, static_assert will be triggered for a new\n  // DEFINE_, requiring this constant to be raised. But changing this will\n  // result in merge conflicts in all other pull requests also changing cvar\n  // defaults - before they're merged, they will need to be updated, which will\n  // ensure monotonic growth of the versions of all cvars on the main branch. In\n  // the example above, PR #1 will need to be updated before it's merged.\n  //\n  // If you've encountered a merge conflict here in your pull request:\n  //   1) Update any UPDATE_s you've added in the pull request to the current\n  //      date.\n  //   2) Change this value to the same date.\n  // If you're reviewing a pull request with a change here, check if 1) has been\n  // done by the submitter before merging.\n  static constexpr uint32_t kLastCommittedUpdateDate =\n      MakeConfigVarUpdateDate(2020, 12, 31, 13);\n\n  virtual ~IConfigVarUpdate() = default;\n\n  virtual void Apply() const = 0;\n\n  static void ApplyUpdates(uint32_t config_date) {\n    if (!updates_) {\n      return;\n    }\n    auto it_end = updates_->end();\n    for (auto it = updates_->upper_bound(config_date); it != it_end; ++it) {\n      it->second->Apply();\n    }\n  }\n\n  // More reliable than kLastCommittedUpdateDate for actual usage\n  // (kLastCommittedUpdateDate is just a pull request merge order guard), though\n  // usually should be the same, but kLastCommittedUpdateDate may not include\n  // removal of cvars.\n  static uint32_t GetLastUpdateDate() {\n    return (updates_ && !updates_->empty()) ? updates_->crbegin()->first : 0;\n  }\n\n protected:\n  IConfigVarUpdate(IConfigVar* const& config_var, uint32_t year, uint32_t month,\n                   uint32_t day, uint32_t utc_hour)\n      : config_var_(config_var) {\n    if (!updates_) {\n      updates_ = new std::multimap<uint32_t, const IConfigVarUpdate*>;\n    }\n    updates_->emplace(MakeConfigVarUpdateDate(year, month, day, utc_hour),\n                      this);\n  }\n\n  IConfigVar& config_var() const {\n    assert_not_null(config_var_);\n    return *config_var_;\n  }\n\n private:\n  // Reference to pointer to loosen initialization order requirements.\n  IConfigVar* const& config_var_;\n\n  // Updates can be initialized before these, thus initialized on demand using\n  // `new`.\n  static std::multimap<uint32_t, const IConfigVarUpdate*>* updates_;\n};\n\nclass ConfigVarUpdateFromAny : public IConfigVarUpdate {\n public:\n  ConfigVarUpdateFromAny(IConfigVar* const& config_var, uint32_t year,\n                         uint32_t month, uint32_t day, uint32_t utc_hour)\n      : IConfigVarUpdate(config_var, year, month, day, utc_hour) {}\n  void Apply() const override { config_var().ResetConfigValueToDefault(); }\n};\n\ntemplate <typename T>\nclass ConfigVarUpdate : public IConfigVarUpdate {\n public:\n  ConfigVarUpdate(IConfigVar* const& config_var, uint32_t year, uint32_t month,\n                  uint32_t day, uint32_t utc_hour, const T& old_default_value)\n      : IConfigVarUpdate(config_var, year, month, day, utc_hour),\n        old_default_value_(old_default_value) {}\n  void Apply() const override {\n    IConfigVar& config_var_untyped = config_var();\n    ConfigVar<T>* config_var_typed =\n        dynamic_cast<ConfigVar<T>*>(&config_var_untyped);\n    // Update only from the previous default value if the same type,\n    // unconditionally reset if the type has been changed.\n    if (!config_var_typed ||\n        config_var_typed->GetTypedConfigValue() == old_default_value_) {\n      config_var_untyped.ResetConfigValueToDefault();\n    }\n  }\n\n private:\n  T old_default_value_;\n};\n\n#define UPDATE_from_any(name, year, month, day, utc_hour)                     \\\n  static_assert(                                                              \\\n      cvar::MakeConfigVarUpdateDate(year, month, day, utc_hour) <=            \\\n          cvar::IConfigVarUpdate::kLastCommittedUpdateDate,                   \\\n      \"A new config variable default value update was added - raise \"         \\\n      \"cvar::IConfigVarUpdate::kLastCommittedUpdateDate to the same date in \" \\\n      \"base/cvar.h to ensure coherence between different pull requests \"      \\\n      \"updating config variable defaults.\");                                  \\\n  namespace cv {                                                              \\\n  static const cvar::ConfigVarUpdateFromAny                                   \\\n      update_##name_##year_##month_##day_##utc_hour(cv_##name, year, month,   \\\n                                                    day, utc_hour);           \\\n  }\n\n#define UPDATE_CVar(name, year, month, day, utc_hour, old_default_value, type) \\\n  static_assert(                                                               \\\n      cvar::MakeConfigVarUpdateDate(year, month, day, utc_hour) <=             \\\n          cvar::IConfigVarUpdate::kLastCommittedUpdateDate,                    \\\n      \"A new config variable default value update was added - raise \"          \\\n      \"cvar::IConfigVarUpdate::kLastCommittedUpdateDate to the same date in \"  \\\n      \"base/cvar.h to ensure coherence between different pull requests \"       \\\n      \"updating config variable defaults.\");                                   \\\n  namespace cv {                                                               \\\n  static const cvar::ConfigVarUpdate<type>                                     \\\n      update_##name_##year_##month_##day_##utc_hour(cv_##name, year, month,    \\\n                                                    day, utc_hour,             \\\n                                                    old_default_value);        \\\n  }\n\n#define UPDATE_from_bool(name, year, month, day, utc_hour, old_default_value) \\\n  UPDATE_CVar(name, year, month, day, utc_hour, old_default_value, bool)\n\n#define UPDATE_from_int32(name, year, month, day, utc_hour, old_default_value) \\\n  UPDATE_CVar(name, year, month, day, utc_hour, old_default_value, int32_t)\n\n#define UPDATE_from_uint32(name, year, month, day, utc_hour, \\\n                           old_default_value)                \\\n  UPDATE_CVar(name, year, month, day, utc_hour, old_default_value, uint32_t)\n\n#define UPDATE_from_uint64(name, year, month, day, utc_hour, \\\n                           old_default_value)                \\\n  UPDATE_CVar(name, year, month, day, utc_hour, old_default_value, uint64_t)\n\n#define UPDATE_from_double(name, year, month, day, utc_hour, \\\n                           old_default_value)                \\\n  UPDATE_CVar(name, year, month, day, utc_hour, old_default_value, double)\n\n#define UPDATE_from_string(name, year, month, day, utc_hour, \\\n                           old_default_value)                \\\n  UPDATE_CVar(name, year, month, day, utc_hour, old_default_value, std::string)\n\n#define UPDATE_from_path(name, year, month, day, utc_hour, old_default_value) \\\n  UPDATE_CVar(name, year, month, day, utc_hour, old_default_value,            \\\n              std::filesystem::path)\n\n}  // namespace cvar\n\n#endif  // XENIA_CVAR_H_\n"
  },
  {
    "path": "src/xenia/base/cvar_android.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include <jni.h>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/cvar.h\"\n#include \"xenia/base/filesystem.h\"\n#include \"xenia/base/main_android.h\"\n\nnamespace cvar {\n\nvoid ParseLaunchArgumentsFromAndroidBundle(jobject bundle) {\n  if (!ConfigVars) {\n    return;\n  }\n\n  JNIEnv* jni_env = xe::GetAndroidThreadJniEnv();\n  if (!jni_env) {\n    return;\n  }\n\n  jclass bundle_class = jni_env->GetObjectClass(bundle);\n  if (!bundle_class) {\n    return;\n  }\n  bool bundle_methods_obtained = true;\n  jmethodID bundle_get_boolean =\n      jni_env->GetMethodID(bundle_class, \"getBoolean\", \"(Ljava/lang/String;)Z\");\n  bundle_methods_obtained &= (bundle_get_boolean != nullptr);\n  jmethodID bundle_get_double =\n      jni_env->GetMethodID(bundle_class, \"getDouble\", \"(Ljava/lang/String;)D\");\n  bundle_methods_obtained &= (bundle_get_double != nullptr);\n  jmethodID bundle_get_int =\n      jni_env->GetMethodID(bundle_class, \"getInt\", \"(Ljava/lang/String;)I\");\n  bundle_methods_obtained &= (bundle_get_int != nullptr);\n  jmethodID bundle_get_long =\n      jni_env->GetMethodID(bundle_class, \"getLong\", \"(Ljava/lang/String;)J\");\n  bundle_methods_obtained &= (bundle_get_long != nullptr);\n  jmethodID bundle_get_string = jni_env->GetMethodID(\n      bundle_class, \"getString\", \"(Ljava/lang/String;)Ljava/lang/String;\");\n  bundle_methods_obtained &= (bundle_get_string != nullptr);\n  jmethodID bundle_key_set_method_id =\n      jni_env->GetMethodID(bundle_class, \"keySet\", \"()Ljava/util/Set;\");\n  bundle_methods_obtained &= (bundle_key_set_method_id != nullptr);\n  if (!bundle_methods_obtained) {\n    jni_env->DeleteLocalRef(bundle_class);\n    return;\n  }\n\n  jobject key_set = jni_env->CallObjectMethod(bundle, bundle_key_set_method_id);\n  if (!key_set) {\n    jni_env->DeleteLocalRef(bundle_class);\n    return;\n  }\n\n  jclass set_class = jni_env->GetObjectClass(key_set);\n  if (!set_class) {\n    jni_env->DeleteLocalRef(key_set);\n    jni_env->DeleteLocalRef(bundle_class);\n    return;\n  }\n  bool set_methods_obtained = true;\n  jmethodID set_iterator_method_id =\n      jni_env->GetMethodID(set_class, \"iterator\", \"()Ljava/util/Iterator;\");\n  set_methods_obtained &= (set_iterator_method_id != nullptr);\n  if (!set_methods_obtained) {\n    jni_env->DeleteLocalRef(set_class);\n    jni_env->DeleteLocalRef(key_set);\n    jni_env->DeleteLocalRef(bundle_class);\n    return;\n  }\n\n  jobject key_set_iterator =\n      jni_env->CallObjectMethod(key_set, set_iterator_method_id);\n  if (!key_set_iterator) {\n    jni_env->DeleteLocalRef(set_class);\n    jni_env->DeleteLocalRef(key_set);\n    jni_env->DeleteLocalRef(bundle_class);\n    return;\n  }\n\n  jclass iterator_class = jni_env->GetObjectClass(key_set_iterator);\n  if (!iterator_class) {\n    jni_env->DeleteLocalRef(key_set_iterator);\n    jni_env->DeleteLocalRef(set_class);\n    jni_env->DeleteLocalRef(key_set);\n    jni_env->DeleteLocalRef(bundle_class);\n    return;\n  }\n  bool iterator_methods_obtained = true;\n  jmethodID iterator_has_next =\n      jni_env->GetMethodID(iterator_class, \"hasNext\", \"()Z\");\n  iterator_methods_obtained &= (iterator_has_next != nullptr);\n  jmethodID iterator_next =\n      jni_env->GetMethodID(iterator_class, \"next\", \"()Ljava/lang/Object;\");\n  iterator_methods_obtained &= (iterator_next != nullptr);\n  if (!iterator_methods_obtained) {\n    jni_env->DeleteLocalRef(iterator_class);\n    jni_env->DeleteLocalRef(key_set_iterator);\n    jni_env->DeleteLocalRef(set_class);\n    jni_env->DeleteLocalRef(key_set);\n    jni_env->DeleteLocalRef(bundle_class);\n    return;\n  }\n\n  while (jni_env->CallBooleanMethod(key_set_iterator, iterator_has_next)) {\n    jstring key = reinterpret_cast<jstring>(\n        jni_env->CallObjectMethod(key_set_iterator, iterator_next));\n    if (!key) {\n      continue;\n    }\n    const char* key_utf = jni_env->GetStringUTFChars(key, nullptr);\n    if (!key_utf) {\n      jni_env->DeleteLocalRef(key);\n      continue;\n    }\n    auto cvar_it = ConfigVars->find(key_utf);\n    jni_env->ReleaseStringUTFChars(key, key_utf);\n    // key_utf can't be used from now on.\n    if (cvar_it == ConfigVars->end()) {\n      jni_env->DeleteLocalRef(key);\n      continue;\n    }\n    IConfigVar* cvar = cvar_it->second;\n    auto cvar_bool = dynamic_cast<CommandVar<bool>*>(cvar);\n    if (cvar_bool) {\n      cvar_bool->SetCommandLineValue(\n          bool(jni_env->CallBooleanMethod(bundle, bundle_get_boolean, key)));\n      jni_env->DeleteLocalRef(key);\n      continue;\n    }\n    auto cvar_int32 = dynamic_cast<CommandVar<int32_t>*>(cvar);\n    if (cvar_int32) {\n      cvar_int32->SetCommandLineValue(\n          jni_env->CallIntMethod(bundle, bundle_get_int, key));\n      jni_env->DeleteLocalRef(key);\n      continue;\n    }\n    auto cvar_uint32 = dynamic_cast<CommandVar<uint32_t>*>(cvar);\n    if (cvar_uint32) {\n      cvar_uint32->SetCommandLineValue(\n          uint32_t(jni_env->CallIntMethod(bundle, bundle_get_int, key)));\n      jni_env->DeleteLocalRef(key);\n      continue;\n    }\n    auto cvar_uint64 = dynamic_cast<CommandVar<uint64_t>*>(cvar);\n    if (cvar_uint64) {\n      cvar_uint64->SetCommandLineValue(\n          uint64_t(jni_env->CallLongMethod(bundle, bundle_get_long, key)));\n      jni_env->DeleteLocalRef(key);\n      continue;\n    }\n    auto cvar_double = dynamic_cast<CommandVar<double>*>(cvar);\n    if (cvar_double) {\n      cvar_double->SetCommandLineValue(\n          jni_env->CallDoubleMethod(bundle, bundle_get_double, key));\n      jni_env->DeleteLocalRef(key);\n      continue;\n    }\n    auto cvar_string = dynamic_cast<CommandVar<std::string>*>(cvar);\n    if (cvar_string) {\n      jstring cvar_string_value = reinterpret_cast<jstring>(\n          jni_env->CallObjectMethod(bundle, bundle_get_string, key));\n      if (cvar_string_value) {\n        const char* cvar_string_value_utf =\n            jni_env->GetStringUTFChars(cvar_string_value, nullptr);\n        if (cvar_string_value_utf) {\n          cvar_string->SetCommandLineValue(cvar_string_value_utf);\n          jni_env->ReleaseStringUTFChars(cvar_string_value,\n                                         cvar_string_value_utf);\n        }\n        jni_env->DeleteLocalRef(cvar_string_value);\n      }\n      jni_env->DeleteLocalRef(key);\n      continue;\n    }\n    auto cvar_path = dynamic_cast<CommandVar<std::filesystem::path>*>(cvar);\n    if (cvar_path) {\n      jstring cvar_string_value = reinterpret_cast<jstring>(\n          jni_env->CallObjectMethod(bundle, bundle_get_string, key));\n      if (cvar_string_value) {\n        const char* cvar_string_value_utf =\n            jni_env->GetStringUTFChars(cvar_string_value, nullptr);\n        if (cvar_string_value_utf) {\n          cvar_path->SetCommandLineValue(xe::to_path(cvar_string_value_utf));\n          jni_env->ReleaseStringUTFChars(cvar_string_value,\n                                         cvar_string_value_utf);\n        }\n        jni_env->DeleteLocalRef(cvar_string_value);\n      }\n      jni_env->DeleteLocalRef(key);\n      continue;\n    }\n    assert_always(\"Unsupported type of cvar {}\", cvar->name().c_str());\n    jni_env->DeleteLocalRef(key);\n  }\n\n  jni_env->DeleteLocalRef(iterator_class);\n  jni_env->DeleteLocalRef(key_set_iterator);\n  jni_env->DeleteLocalRef(set_class);\n  jni_env->DeleteLocalRef(key_set);\n  jni_env->DeleteLocalRef(bundle_class);\n}\n\n}  // namespace cvar\n"
  },
  {
    "path": "src/xenia/base/debug_visualizers.natvis",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<AutoVisualizer xmlns=\"http://schemas.microsoft.com/vstudio/debugger/natvis/2010\">\n\n  <!-- Automatically convert endianness for xe::endian_store<,1> -->\n  <Type Name=\"xe::endian_store&lt;unsigned __int64, 1&gt;\">\n    <DisplayString>\n      {(((value &amp; 0xFF00000000000000) &gt;&gt; 56) |\n        ((value &amp; 0x00FF000000000000) &gt;&gt; 40) |\n        ((value &amp; 0x0000FF0000000000) &gt;&gt; 24) |\n        ((value &amp; 0x000000FF00000000) &gt;&gt; 8 ) |\n        ((value &amp; 0x00000000FF000000) &lt;&lt; 8 ) |\n        ((value &amp; 0x0000000000FF0000) &lt;&lt; 24) |\n        ((value &amp; 0x000000000000FF00) &lt;&lt; 40) |\n        ((value &amp; 0x00000000000000FF) &lt;&lt; 56))}\n    </DisplayString>\n  </Type>\n  <Type Name=\"xe::endian_store&lt;__int64, 1&gt;\">\n    <DisplayString>\n      {(((value &amp; 0xFF00000000000000) &gt;&gt; 56) |\n        ((value &amp; 0x00FF000000000000) &gt;&gt; 40) |\n        ((value &amp; 0x0000FF0000000000) &gt;&gt; 24) |\n        ((value &amp; 0x000000FF00000000) &gt;&gt; 8 ) |\n        ((value &amp; 0x00000000FF000000) &lt;&lt; 8 ) |\n        ((value &amp; 0x0000000000FF0000) &lt;&lt; 24) |\n        ((value &amp; 0x000000000000FF00) &lt;&lt; 40) |\n        ((value &amp; 0x00000000000000FF) &lt;&lt; 56))}\n    </DisplayString>\n  </Type>\n\n  <Type Name=\"xe::endian_store&lt;unsigned int, 1&gt;\">\n    <DisplayString>\n      {(((value &amp; 0xFF000000) &gt;&gt; 24) |\n        ((value &amp; 0x00FF0000) &gt;&gt;  8) |\n        ((value &amp; 0x0000FF00) &lt;&lt;  8) |\n        ((value &amp; 0x000000FF) &lt;&lt; 24))}\n    </DisplayString>\n  </Type>\n  <Type Name=\"xe::endian_store&lt;int, 1&gt;\">\n    <DisplayString>\n      {(((value &amp; 0xFF000000) &gt;&gt; 24) |\n        ((value &amp; 0x00FF0000) &gt;&gt;  8) |\n        ((value &amp; 0x0000FF00) &lt;&lt;  8) |\n        ((value &amp; 0x000000FF) &lt;&lt; 24))}\n    </DisplayString>\n  </Type>\n\n  <Type Name=\"xe::endian_store&lt;unsigned short, 1&gt;\">\n    <DisplayString>\n      {(((value &amp; 0xFF00) &gt;&gt;  8) |\n        ((value &amp; 0x00FF) &lt;&lt;  8))}\n    </DisplayString>\n  </Type>\n  <Type Name=\"xe::endian_store&lt;short, 1&gt;\">\n    <DisplayString>\n      {(((value &amp; 0xFF00) &gt;&gt;  8) |\n        ((value &amp; 0x00FF) &lt;&lt;  8))}\n    </DisplayString>\n  </Type>\n\n  <Type Name=\"xe::endian_store&lt;unsigned char, 1&gt;\">\n    <DisplayString>\n      {value}\n    </DisplayString>\n  </Type>\n  <Type Name=\"xe::endian_store&lt;char, 1&gt;\">\n    <DisplayString>\n      {value}\n    </DisplayString>\n  </Type>\n  \n  <Type Name=\"xe::bf&lt;*&gt;\">\n    <DisplayString>\n      <!-- (storage & mask()) >> position -->\n      {($T1)((storage &amp; ((((value_type)~0) &gt;&gt; (8 * sizeof(value_type) - $T3)) &lt;&lt; $T2)) &gt;&gt; $T2)}\n    </DisplayString>\n  </Type>\n\n</AutoVisualizer>\n"
  },
  {
    "path": "src/xenia/base/debugging.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_BASE_DEBUGGING_H_\n#define XENIA_BASE_DEBUGGING_H_\n\n#include <cstdint>\n\n#include \"third_party/fmt/include/fmt/format.h\"\n\nnamespace xe {\nnamespace debugging {\n\n// Returns true if a debugger is attached to this process.\n// The state may change at any time (attach after launch, etc), so do not\n// cache this value. Determining if the debugger is attached is expensive,\n// though, so avoid calling it frequently.\nbool IsDebuggerAttached();\n\n// Breaks into the debugger if it is attached.\n// If no debugger is present, a signal will be raised.\nvoid Break();\n\nnamespace internal {\nvoid DebugPrint(const char* s);\n}\n\n// Prints a message to the attached debugger.\n// This bypasses the normal logging mechanism. If no debugger is attached it's\n// likely to no-op.\ntemplate <typename... Args>\nvoid DebugPrint(fmt::string_view format, const Args&... args) {\n  internal::DebugPrint(\n      fmt::vformat(format, fmt::make_format_args(args...)).c_str());\n}\n\n}  // namespace debugging\n}  // namespace xe\n\n#endif  // XENIA_BASE_DEBUGGING_H_\n"
  },
  {
    "path": "src/xenia/base/debugging_mac.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/debugging.h\"\n\n#include <sys/sysctl.h>\n#include <unistd.h>\n\nnamespace xe {\nnamespace debugging {\n\nbool IsDebuggerAttached() {\n  // https://developer.apple.com/library/mac/qa/qa1361/_index.html\n  kinfo_proc info;\n  info.kp_proc.p_flag = 0;\n  int mib[] = {CTL_KERN, KERN_PROC, KERN_PROC_PID, getpid()};\n  size_t size = sizeof(info);\n  sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, nullptr, 0);\n  return (info.kp_proc.p_flag & P_TRACED) != 0;\n}\n\n// TODO(benvanik): find a more reliable way.\nvoid Break() {\n  // __asm__(\"int $3\");\n  __builtin_debugtrap();\n}\n\n}  // namespace debugging\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/base/debugging_posix.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2017 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/debugging.h\"\n\n#include <csignal>\n#include <cstdarg>\n#include <fstream>\n#include <iostream>\n#include <mutex>\n#include <sstream>\n\n#include \"xenia/base/string_buffer.h\"\n\nnamespace xe {\nnamespace debugging {\n\nbool IsDebuggerAttached() {\n  std::ifstream proc_status_stream(\"/proc/self/status\");\n  if (!proc_status_stream.is_open()) {\n    return false;\n  }\n  std::string line;\n  while (std::getline(proc_status_stream, line)) {\n    std::istringstream line_stream(line);\n    std::string key;\n    line_stream >> key;\n    if (key == \"TracerPid:\") {\n      uint32_t tracer_pid;\n      line_stream >> tracer_pid;\n      return tracer_pid != 0;\n    }\n  }\n  return false;\n}\n\nvoid Break() {\n  static std::once_flag flag;\n  std::call_once(flag, []() {\n    // Install handler for sigtrap only once\n    std::signal(SIGTRAP, [](int) {\n      // Forward signal to default handler after being caught\n      std::signal(SIGTRAP, SIG_DFL);\n    });\n  });\n  std::raise(SIGTRAP);\n}\n\nnamespace internal {\nvoid DebugPrint(const char* s) { std::clog << s << std::endl; }\n}  // namespace internal\n\n}  // namespace debugging\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/base/debugging_win.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/debugging.h\"\n\n#include \"xenia/base/platform_win.h\"\n#include \"xenia/base/string_buffer.h\"\n\nnamespace xe {\nnamespace debugging {\n\nbool IsDebuggerAttached() { return IsDebuggerPresent() ? true : false; }\n\nvoid Break() { __debugbreak(); }\n\nnamespace internal {\nvoid DebugPrint(const char* s) { OutputDebugStringA(s); }\n}  // namespace internal\n\n}  // namespace debugging\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/base/delegate.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_BASE_DELEGATE_H_\n#define XENIA_BASE_DELEGATE_H_\n\n#include <functional>\n#include <mutex>\n#include <vector>\n\nnamespace xe {\n\n// TODO(benvanik): go lockfree, and don't hold the lock while emitting.\n\ntemplate <typename... Args>\nclass Delegate {\n public:\n  typedef std::function<void(Args...)> Listener;\n\n  void AddListener(Listener const& listener) {\n    std::lock_guard<std::mutex> guard(lock_);\n    listeners_.push_back(listener);\n  }\n\n  void RemoveAllListeners() {\n    std::lock_guard<std::mutex> guard(lock_);\n    listeners_.clear();\n  }\n\n  void operator()(Args... args) {\n    std::lock_guard<std::mutex> guard(lock_);\n    for (auto& listener : listeners_) {\n      listener(args...);\n    }\n  }\n\n private:\n  std::mutex lock_;\n  std::vector<Listener> listeners_;\n};\n\ntemplate <>\nclass Delegate<void> {\n public:\n  typedef std::function<void()> Listener;\n\n  void AddListener(Listener const& listener) {\n    std::lock_guard<std::mutex> guard(lock_);\n    listeners_.push_back(listener);\n  }\n\n  void RemoveAllListeners() {\n    std::lock_guard<std::mutex> guard(lock_);\n    listeners_.clear();\n  }\n\n  void operator()() {\n    std::lock_guard<std::mutex> guard(lock_);\n    for (auto& listener : listeners_) {\n      listener();\n    }\n  }\n\n private:\n  std::mutex lock_;\n  std::vector<Listener> listeners_;\n};\n\n}  // namespace xe\n\n#endif  // XENIA_BASE_DELEGATE_H_\n"
  },
  {
    "path": "src/xenia/base/exception_handler.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/exception_handler.h\"\n\nnamespace xe {\n\n// Based on VIXL Instruction::IsLoad and IsStore.\n// https://github.com/Linaro/vixl/blob/d48909dd0ac62197edb75d26ed50927e4384a199/src/aarch64/instructions-aarch64.cc#L484\n//\n// Copyright 2015, VIXL authors\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are met:\n//\n//   * Redistributions of source code must retain the above copyright notice,\n//     this list of conditions and the following disclaimer.\n//   * Redistributions in binary form must reproduce the above copyright notice,\n//     this list of conditions and the following disclaimer in the documentation\n//     and/or other materials provided with the distribution.\n//   * Neither the name of ARM Limited nor the names of its contributors may be\n//     used to endorse or promote products derived from this software without\n//     specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS \"AS IS\" AND\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE\n// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\nbool IsArm64LoadPrefetchStore(uint32_t instruction, bool& is_store_out) {\n  if ((instruction & kArm64LoadLiteralFMask) == kArm64LoadLiteralFixed) {\n    return true;\n  }\n  if ((instruction & kArm64LoadStoreAnyFMask) != kArm64LoadStoreAnyFixed) {\n    return false;\n  }\n  if ((instruction & kArm64LoadStorePairAnyFMask) ==\n      kArm64LoadStorePairAnyFixed) {\n    is_store_out = !(instruction & kArm64LoadStorePairLoadBit);\n    return true;\n  }\n  switch (Arm64LoadStoreOp(instruction & kArm64LoadStoreMask)) {\n    case Arm64LoadStoreOp::kLDRB_w:\n    case Arm64LoadStoreOp::kLDRH_w:\n    case Arm64LoadStoreOp::kLDR_w:\n    case Arm64LoadStoreOp::kLDR_x:\n    case Arm64LoadStoreOp::kLDRSB_x:\n    case Arm64LoadStoreOp::kLDRSH_x:\n    case Arm64LoadStoreOp::kLDRSW_x:\n    case Arm64LoadStoreOp::kLDRSB_w:\n    case Arm64LoadStoreOp::kLDRSH_w:\n    case Arm64LoadStoreOp::kLDR_b:\n    case Arm64LoadStoreOp::kLDR_h:\n    case Arm64LoadStoreOp::kLDR_s:\n    case Arm64LoadStoreOp::kLDR_d:\n    case Arm64LoadStoreOp::kLDR_q:\n    case Arm64LoadStoreOp::kPRFM:\n      is_store_out = false;\n      return true;\n    case Arm64LoadStoreOp::kSTRB_w:\n    case Arm64LoadStoreOp::kSTRH_w:\n    case Arm64LoadStoreOp::kSTR_w:\n    case Arm64LoadStoreOp::kSTR_x:\n    case Arm64LoadStoreOp::kSTR_b:\n    case Arm64LoadStoreOp::kSTR_h:\n    case Arm64LoadStoreOp::kSTR_s:\n    case Arm64LoadStoreOp::kSTR_d:\n    case Arm64LoadStoreOp::kSTR_q:\n      is_store_out = true;\n      return true;\n    default:\n      return false;\n  }\n}\n\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/base/exception_handler.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_BASE_EXCEPTION_HANDLER_H_\n#define XENIA_BASE_EXCEPTION_HANDLER_H_\n\n#include <cstdint>\n#include <functional>\n#include <vector>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/host_thread_context.h\"\n\nnamespace xe {\n\n// AArch64 load and store decoding based on VIXL.\n// https://github.com/Linaro/vixl/blob/ae5957cd66517b3f31dbf37e9bf39db6594abfe3/src/aarch64/constants-aarch64.h\n//\n// Copyright 2015, VIXL authors\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are met:\n//\n//   * Redistributions of source code must retain the above copyright notice,\n//     this list of conditions and the following disclaimer.\n//   * Redistributions in binary form must reproduce the above copyright notice,\n//     this list of conditions and the following disclaimer in the documentation\n//     and/or other materials provided with the distribution.\n//   * Neither the name of ARM Limited nor the names of its contributors may be\n//     used to endorse or promote products derived from this software without\n//     specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS \"AS IS\" AND\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE\n// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// `Instruction address + literal offset` loads.\n// This includes PRFM_lit.\nconstexpr uint32_t kArm64LoadLiteralFMask = UINT32_C(0x3B000000);\nconstexpr uint32_t kArm64LoadLiteralFixed = UINT32_C(0x18000000);\n\nconstexpr uint32_t kArm64LoadStoreAnyFMask = UINT32_C(0x0A000000);\nconstexpr uint32_t kArm64LoadStoreAnyFixed = UINT32_C(0x08000000);\n\nconstexpr uint32_t kArm64LoadStorePairAnyFMask = UINT32_C(0x3A000000);\nconstexpr uint32_t kArm64LoadStorePairAnyFixed = UINT32_C(0x28000000);\nconstexpr uint32_t kArm64LoadStorePairLoadBit = UINT32_C(1) << 22;\n\nconstexpr uint32_t kArm64LoadStoreMask = UINT32_C(0xC4C00000);\nenum class Arm64LoadStoreOp : uint32_t {\n  kSTRB_w = UINT32_C(0x00000000),\n  kSTRH_w = UINT32_C(0x40000000),\n  kSTR_w = UINT32_C(0x80000000),\n  kSTR_x = UINT32_C(0xC0000000),\n  kLDRB_w = UINT32_C(0x00400000),\n  kLDRH_w = UINT32_C(0x40400000),\n  kLDR_w = UINT32_C(0x80400000),\n  kLDR_x = UINT32_C(0xC0400000),\n  kLDRSB_x = UINT32_C(0x00800000),\n  kLDRSH_x = UINT32_C(0x40800000),\n  kLDRSW_x = UINT32_C(0x80800000),\n  kLDRSB_w = UINT32_C(0x00C00000),\n  kLDRSH_w = UINT32_C(0x40C00000),\n  kSTR_b = UINT32_C(0x04000000),\n  kSTR_h = UINT32_C(0x44000000),\n  kSTR_s = UINT32_C(0x84000000),\n  kSTR_d = UINT32_C(0xC4000000),\n  kSTR_q = UINT32_C(0x04800000),\n  kLDR_b = UINT32_C(0x04400000),\n  kLDR_h = UINT32_C(0x44400000),\n  kLDR_s = UINT32_C(0x84400000),\n  kLDR_d = UINT32_C(0xC4400000),\n  kLDR_q = UINT32_C(0x04C00000),\n  kPRFM = UINT32_C(0xC0800000),\n};\n\nconstexpr uint32_t kArm64LoadStoreOffsetFMask = UINT32_C(0x3B200C00);\nenum class Arm64LoadStoreOffsetFixed : uint32_t {\n  kUnscaledOffset = UINT32_C(0x38000000),\n  kPostIndex = UINT32_C(0x38000400),\n  kPreIndex = UINT32_C(0x38000C00),\n  kRegisterOffset = UINT32_C(0x38200800),\n};\n\nconstexpr uint32_t kArm64LoadStoreUnsignedOffsetFMask = UINT32_C(0x3B000000);\nconstexpr uint32_t kArm64LoadStoreUnsignedOffsetFixed = UINT32_C(0x39000000);\n\nbool IsArm64LoadPrefetchStore(uint32_t instruction, bool& is_store_out);\n\nclass Exception {\n public:\n  enum class Code {\n    kInvalidException = 0,\n    kAccessViolation,\n    kIllegalInstruction,\n  };\n\n  enum class AccessViolationOperation {\n    kUnknown,\n    kRead,\n    kWrite,\n  };\n\n  void InitializeAccessViolation(HostThreadContext* thread_context,\n                                 uint64_t fault_address,\n                                 AccessViolationOperation operation) {\n    code_ = Code::kAccessViolation;\n    thread_context_ = thread_context;\n    fault_address_ = fault_address;\n    access_violation_operation_ = operation;\n  }\n  void InitializeIllegalInstruction(HostThreadContext* thread_context) {\n    code_ = Code::kIllegalInstruction;\n    thread_context_ = thread_context;\n  }\n\n  Code code() const { return code_; }\n\n  // Returns the platform-specific thread context info.\n  // Note that certain registers must be modified through Modify* proxy\n  // functions rather than directly:\n  // x86-64:\n  // - General-purpose registers (r##, r8-r15).\n  // - XMM registers.\n  // AArch64:\n  // - General-purpose registers (Xn), including FP and LR.\n  // - SIMD and floating-point registers (Vn).\n  HostThreadContext* thread_context() const { return thread_context_; }\n\n  // Returns the program counter where the exception occurred.\n  uint64_t pc() const {\n#if XE_ARCH_AMD64\n    return thread_context_->rip;\n#elif XE_ARCH_ARM64\n    return thread_context_->pc;\n#else\n    assert_always();\n    return 0;\n#endif  // XE_ARCH\n  }\n\n  // Sets the program counter where execution will resume.\n  void set_resume_pc(uint64_t pc) {\n#if XE_ARCH_AMD64\n    thread_context_->rip = pc;\n#elif XE_ARCH_ARM64\n    thread_context_->pc = pc;\n#else\n    assert_always();\n#endif  // XE_ARCH\n  }\n\n#if XE_ARCH_AMD64\n  // The index is relative to X64Register::kIntRegisterFirst.\n  uint64_t& ModifyIntRegister(uint32_t index) {\n    assert_true(index <= 15);\n    modified_int_registers_ |= UINT16_C(1) << index;\n    return thread_context_->int_registers[index];\n  }\n  uint16_t modified_int_registers() const { return modified_int_registers_; }\n  vec128_t& ModifyXmmRegister(uint32_t index) {\n    assert_true(index <= 15);\n    modified_xmm_registers_ |= UINT16_C(1) << index;\n    return thread_context_->xmm_registers[index];\n  }\n  uint16_t modified_xmm_registers() const { return modified_xmm_registers_; }\n#elif XE_ARCH_ARM64\n  uint64_t& ModifyXRegister(uint32_t index) {\n    assert_true(index <= 30);\n    modified_x_registers_ |= UINT32_C(1) << index;\n    return thread_context_->x[index];\n  }\n  uint32_t modified_x_registers() const { return modified_x_registers_; }\n  vec128_t& ModifyVRegister(uint32_t index) {\n    assert_true(index <= 31);\n    modified_v_registers_ |= UINT32_C(1) << index;\n    return thread_context_->v[index];\n  }\n  uint32_t modified_v_registers() const { return modified_v_registers_; }\n#endif  // XE_ARCH\n\n  // In case of AV, address that was read from/written to.\n  uint64_t fault_address() const { return fault_address_; }\n\n  // In case of AV, what kind of operation caused it.\n  AccessViolationOperation access_violation_operation() const {\n    return access_violation_operation_;\n  }\n\n private:\n  Code code_ = Code::kInvalidException;\n  HostThreadContext* thread_context_ = nullptr;\n#if XE_ARCH_AMD64\n  uint16_t modified_int_registers_ = 0;\n  uint16_t modified_xmm_registers_ = 0;\n#elif XE_ARCH_ARM64\n  uint32_t modified_x_registers_ = 0;\n  uint32_t modified_v_registers_ = 0;\n#endif  // XE_ARCH\n  uint64_t fault_address_ = 0;\n  AccessViolationOperation access_violation_operation_ =\n      AccessViolationOperation::kUnknown;\n};\n\nclass ExceptionHandler {\n public:\n  typedef bool (*Handler)(Exception* ex, void* data);\n\n  // Installs an exception handler.\n  // Handlers are called in the order they are installed.\n  static void Install(Handler fn, void* data);\n\n  // Uninstalls a previously-installed exception handler.\n  static void Uninstall(Handler fn, void* data);\n};\n\n}  // namespace xe\n\n#endif  // XENIA_BASE_EXCEPTION_HANDLER_H_\n"
  },
  {
    "path": "src/xenia/base/exception_handler_posix.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/exception_handler.h\"\n\n#include <signal.h>\n#include <ucontext.h>\n#include <cstdint>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/host_thread_context.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/platform.h\"\n\nnamespace xe {\n\nbool signal_handlers_installed_ = false;\nstruct sigaction original_sigill_handler_;\nstruct sigaction original_sigsegv_handler_;\n\n// This can be as large as needed, but isn't often needed.\n// As we will be sometimes firing many exceptions we want to avoid having to\n// scan the table too much or invoke many custom handlers.\nconstexpr size_t kMaxHandlerCount = 8;\n\n// All custom handlers, left-aligned and null terminated.\n// Executed in order.\nstd::pair<ExceptionHandler::Handler, void*> handlers_[kMaxHandlerCount];\n\nstatic void ExceptionHandlerCallback(int signal_number, siginfo_t* signal_info,\n                                     void* signal_context) {\n  mcontext_t& mcontext =\n      reinterpret_cast<ucontext_t*>(signal_context)->uc_mcontext;\n\n  HostThreadContext thread_context;\n\n#if XE_ARCH_AMD64\n  thread_context.rip = uint64_t(mcontext.gregs[REG_RIP]);\n  thread_context.eflags = uint32_t(mcontext.gregs[REG_EFL]);\n  // The REG_ order may be different than the register indices in the\n  // instruction encoding.\n  thread_context.rax = uint64_t(mcontext.gregs[REG_RAX]);\n  thread_context.rcx = uint64_t(mcontext.gregs[REG_RCX]);\n  thread_context.rdx = uint64_t(mcontext.gregs[REG_RDX]);\n  thread_context.rbx = uint64_t(mcontext.gregs[REG_RBX]);\n  thread_context.rsp = uint64_t(mcontext.gregs[REG_RSP]);\n  thread_context.rbp = uint64_t(mcontext.gregs[REG_RBP]);\n  thread_context.rsi = uint64_t(mcontext.gregs[REG_RSI]);\n  thread_context.rdi = uint64_t(mcontext.gregs[REG_RDI]);\n  thread_context.r8 = uint64_t(mcontext.gregs[REG_R8]);\n  thread_context.r9 = uint64_t(mcontext.gregs[REG_R9]);\n  thread_context.r10 = uint64_t(mcontext.gregs[REG_R10]);\n  thread_context.r11 = uint64_t(mcontext.gregs[REG_R11]);\n  thread_context.r12 = uint64_t(mcontext.gregs[REG_R12]);\n  thread_context.r13 = uint64_t(mcontext.gregs[REG_R13]);\n  thread_context.r14 = uint64_t(mcontext.gregs[REG_R14]);\n  thread_context.r15 = uint64_t(mcontext.gregs[REG_R15]);\n  std::memcpy(thread_context.xmm_registers, mcontext.fpregs->_xmm,\n              sizeof(thread_context.xmm_registers));\n#elif XE_ARCH_ARM64\n  std::memcpy(thread_context.x, mcontext.regs, sizeof(thread_context.x));\n  thread_context.sp = mcontext.sp;\n  thread_context.pc = mcontext.pc;\n  thread_context.pstate = mcontext.pstate;\n  struct fpsimd_context* mcontext_fpsimd = nullptr;\n  struct esr_context* mcontext_esr = nullptr;\n  for (struct _aarch64_ctx* mcontext_extension =\n           reinterpret_cast<struct _aarch64_ctx*>(mcontext.__reserved);\n       mcontext_extension->magic;\n       mcontext_extension = reinterpret_cast<struct _aarch64_ctx*>(\n           reinterpret_cast<uint8_t*>(mcontext_extension) +\n           mcontext_extension->size)) {\n    switch (mcontext_extension->magic) {\n      case FPSIMD_MAGIC:\n        mcontext_fpsimd =\n            reinterpret_cast<struct fpsimd_context*>(mcontext_extension);\n        break;\n      case ESR_MAGIC:\n        mcontext_esr =\n            reinterpret_cast<struct esr_context*>(mcontext_extension);\n        break;\n      default:\n        break;\n    }\n  }\n  assert_not_null(mcontext_fpsimd);\n  if (mcontext_fpsimd) {\n    thread_context.fpsr = mcontext_fpsimd->fpsr;\n    thread_context.fpcr = mcontext_fpsimd->fpcr;\n    std::memcpy(thread_context.v, mcontext_fpsimd->vregs,\n                sizeof(thread_context.v));\n  }\n#endif  // XE_ARCH\n\n  Exception ex;\n  switch (signal_number) {\n    case SIGILL:\n      ex.InitializeIllegalInstruction(&thread_context);\n      break;\n    case SIGSEGV: {\n      Exception::AccessViolationOperation access_violation_operation;\n#if XE_ARCH_AMD64\n      // x86_pf_error_code::X86_PF_WRITE\n      constexpr uint64_t kX86PageFaultErrorCodeWrite = UINT64_C(1) << 1;\n      access_violation_operation =\n          (uint64_t(mcontext.gregs[REG_ERR]) & kX86PageFaultErrorCodeWrite)\n              ? Exception::AccessViolationOperation::kWrite\n              : Exception::AccessViolationOperation::kRead;\n#elif XE_ARCH_ARM64\n      // For a Data Abort (EC - ESR_EL1 bits 31:26 - 0b100100 from a lower\n      // Exception Level, 0b100101 without a change in the Exception Level),\n      // bit 6 is 0 for reading from a memory location, 1 for writing to a\n      // memory location.\n      if (mcontext_esr && ((mcontext_esr->esr >> 26) & 0b111110) == 0b100100) {\n        access_violation_operation =\n            (mcontext_esr->esr & (UINT64_C(1) << 6))\n                ? Exception::AccessViolationOperation::kWrite\n                : Exception::AccessViolationOperation::kRead;\n      } else {\n        // Determine the memory access direction based on which instruction has\n        // requested it.\n        // esr_context may be unavailable on certain hosts (for instance, on\n        // Android, it was added only in NDK r16 - which is the first NDK\n        // version to support the Android API level 27, while NDK r15 doesn't\n        // have esr_context in its API 26 sigcontext.h).\n        // On AArch64 (unlike on AArch32), the program counter is the address of\n        // the currently executing instruction.\n        bool instruction_is_store;\n        if (IsArm64LoadPrefetchStore(\n                *reinterpret_cast<const uint32_t*>(mcontext.pc),\n                instruction_is_store)) {\n          access_violation_operation =\n              instruction_is_store ? Exception::AccessViolationOperation::kWrite\n                                   : Exception::AccessViolationOperation::kRead;\n        } else {\n          assert_always(\n              \"No ESR in the exception thread context, or it's not a Data \"\n              \"Abort, and the faulting instruction is not a known load, \"\n              \"prefetch or store instruction\");\n          access_violation_operation =\n              Exception::AccessViolationOperation::kUnknown;\n        }\n      }\n#else\n      access_violation_operation =\n          Exception::AccessViolationOperation::kUnknown;\n#endif  // XE_ARCH\n      ex.InitializeAccessViolation(\n          &thread_context, reinterpret_cast<uint64_t>(signal_info->si_addr),\n          access_violation_operation);\n    } break;\n    default:\n      assert_unhandled_case(signal_number);\n  }\n\n  for (size_t i = 0; i < xe::countof(handlers_) && handlers_[i].first; ++i) {\n    if (handlers_[i].first(&ex, handlers_[i].second)) {\n      // Exception handled.\n#if XE_ARCH_AMD64\n      mcontext.gregs[REG_RIP] = greg_t(thread_context.rip);\n      mcontext.gregs[REG_EFL] = greg_t(thread_context.eflags);\n      uint32_t modified_register_index;\n      // The order must match the order in X64Register.\n      static const size_t kIntRegisterMap[] = {\n          REG_RAX, REG_RCX, REG_RDX, REG_RBX, REG_RSP, REG_RBP,\n          REG_RSI, REG_RDI, REG_R8,  REG_R9,  REG_R10, REG_R11,\n          REG_R12, REG_R13, REG_R14, REG_R15,\n      };\n      uint16_t modified_int_registers_remaining = ex.modified_int_registers();\n      while (xe::bit_scan_forward(modified_int_registers_remaining,\n                                  &modified_register_index)) {\n        modified_int_registers_remaining &=\n            ~(UINT16_C(1) << modified_register_index);\n        mcontext.gregs[kIntRegisterMap[modified_register_index]] =\n            thread_context.int_registers[modified_register_index];\n      }\n      uint16_t modified_xmm_registers_remaining = ex.modified_xmm_registers();\n      while (xe::bit_scan_forward(modified_xmm_registers_remaining,\n                                  &modified_register_index)) {\n        modified_xmm_registers_remaining &=\n            ~(UINT16_C(1) << modified_register_index);\n        std::memcpy(&mcontext.fpregs->_xmm[modified_register_index],\n                    &thread_context.xmm_registers[modified_register_index],\n                    sizeof(vec128_t));\n      }\n#elif XE_ARCH_ARM64\n      uint32_t modified_register_index;\n      uint32_t modified_x_registers_remaining = ex.modified_x_registers();\n      while (xe::bit_scan_forward(modified_x_registers_remaining,\n                                  &modified_register_index)) {\n        modified_x_registers_remaining &=\n            ~(UINT32_C(1) << modified_register_index);\n        mcontext.regs[modified_register_index] =\n            thread_context.x[modified_register_index];\n      }\n      mcontext.sp = thread_context.sp;\n      mcontext.pc = thread_context.pc;\n      mcontext.pstate = thread_context.pstate;\n      if (mcontext_fpsimd) {\n        mcontext_fpsimd->fpsr = thread_context.fpsr;\n        mcontext_fpsimd->fpcr = thread_context.fpcr;\n        uint32_t modified_v_registers_remaining = ex.modified_v_registers();\n        while (xe::bit_scan_forward(modified_v_registers_remaining,\n                                    &modified_register_index)) {\n          modified_v_registers_remaining &=\n              ~(UINT32_C(1) << modified_register_index);\n          std::memcpy(&mcontext_fpsimd->vregs[modified_register_index],\n                      &thread_context.v[modified_register_index],\n                      sizeof(vec128_t));\n          mcontext.regs[modified_register_index] =\n              thread_context.x[modified_register_index];\n        }\n      }\n#endif  // XE_ARCH\n      return;\n    }\n  }\n}\n\nvoid ExceptionHandler::Install(Handler fn, void* data) {\n  if (!signal_handlers_installed_) {\n    struct sigaction signal_handler;\n\n    std::memset(&signal_handler, 0, sizeof(signal_handler));\n    signal_handler.sa_sigaction = ExceptionHandlerCallback;\n    signal_handler.sa_flags = SA_SIGINFO;\n\n    if (sigaction(SIGILL, &signal_handler, &original_sigill_handler_) != 0) {\n      assert_always(\"Failed to install new SIGILL handler\");\n    }\n    if (sigaction(SIGSEGV, &signal_handler, &original_sigsegv_handler_) != 0) {\n      assert_always(\"Failed to install new SIGSEGV handler\");\n    }\n    signal_handlers_installed_ = true;\n  }\n\n  for (size_t i = 0; i < xe::countof(handlers_); ++i) {\n    if (!handlers_[i].first) {\n      handlers_[i].first = fn;\n      handlers_[i].second = data;\n      return;\n    }\n  }\n  assert_always(\"Too many exception handlers installed\");\n}\n\nvoid ExceptionHandler::Uninstall(Handler fn, void* data) {\n  for (size_t i = 0; i < xe::countof(handlers_); ++i) {\n    if (handlers_[i].first == fn && handlers_[i].second == data) {\n      for (; i < xe::countof(handlers_) - 1; ++i) {\n        handlers_[i] = handlers_[i + 1];\n      }\n      handlers_[i].first = nullptr;\n      handlers_[i].second = nullptr;\n      break;\n    }\n  }\n\n  bool has_any = false;\n  for (size_t i = 0; i < xe::countof(handlers_); ++i) {\n    if (handlers_[i].first) {\n      has_any = true;\n      break;\n    }\n  }\n  if (!has_any) {\n    if (signal_handlers_installed_) {\n      if (sigaction(SIGILL, &original_sigill_handler_, NULL) != 0) {\n        assert_always(\"Failed to restore original SIGILL handler\");\n      }\n      if (sigaction(SIGSEGV, &original_sigsegv_handler_, NULL) != 0) {\n        assert_always(\"Failed to restore original SIGSEGV handler\");\n      }\n      signal_handlers_installed_ = false;\n    }\n  }\n}\n\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/base/exception_handler_win.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2015 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/exception_handler.h\"\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/platform_win.h\"\n\nnamespace xe {\n\n// Handle of the added VectoredExceptionHandler.\nvoid* veh_handle_ = nullptr;\n// Handle of the added VectoredContinueHandler.\nvoid* vch_handle_ = nullptr;\n\n// This can be as large as needed, but isn't often needed.\n// As we will be sometimes firing many exceptions we want to avoid having to\n// scan the table too much or invoke many custom handlers.\nconstexpr size_t kMaxHandlerCount = 8;\n\n// All custom handlers, left-aligned and null terminated.\n// Executed in order.\nstd::pair<ExceptionHandler::Handler, void*> handlers_[kMaxHandlerCount];\n\nLONG CALLBACK ExceptionHandlerCallback(PEXCEPTION_POINTERS ex_info) {\n  // Visual Studio SetThreadName.\n  if (ex_info->ExceptionRecord->ExceptionCode == 0x406D1388) {\n    return EXCEPTION_CONTINUE_SEARCH;\n  }\n\n  HostThreadContext thread_context;\n  thread_context.rip = ex_info->ContextRecord->Rip;\n  thread_context.eflags = ex_info->ContextRecord->EFlags;\n  std::memcpy(thread_context.int_registers, &ex_info->ContextRecord->Rax,\n              sizeof(thread_context.int_registers));\n  std::memcpy(thread_context.xmm_registers, &ex_info->ContextRecord->Xmm0,\n              sizeof(thread_context.xmm_registers));\n\n  // https://msdn.microsoft.com/en-us/library/ms679331(v=vs.85).aspx\n  // https://msdn.microsoft.com/en-us/library/aa363082(v=vs.85).aspx\n  Exception ex;\n  switch (ex_info->ExceptionRecord->ExceptionCode) {\n    case STATUS_ILLEGAL_INSTRUCTION:\n      ex.InitializeIllegalInstruction(&thread_context);\n      break;\n    case STATUS_ACCESS_VIOLATION: {\n      Exception::AccessViolationOperation access_violation_operation;\n      switch (ex_info->ExceptionRecord->ExceptionInformation[0]) {\n        case 0:\n          access_violation_operation =\n              Exception::AccessViolationOperation::kRead;\n          break;\n        case 1:\n          access_violation_operation =\n              Exception::AccessViolationOperation::kWrite;\n          break;\n        default:\n          access_violation_operation =\n              Exception::AccessViolationOperation::kUnknown;\n          break;\n      }\n      ex.InitializeAccessViolation(\n          &thread_context, ex_info->ExceptionRecord->ExceptionInformation[1],\n          access_violation_operation);\n    } break;\n    default:\n      // Unknown/unhandled type.\n      return EXCEPTION_CONTINUE_SEARCH;\n  }\n\n  for (size_t i = 0; i < xe::countof(handlers_) && handlers_[i].first; ++i) {\n    if (handlers_[i].first(&ex, handlers_[i].second)) {\n      // Exception handled.\n      ex_info->ContextRecord->Rip = thread_context.rip;\n      ex_info->ContextRecord->EFlags = thread_context.eflags;\n      uint32_t modified_register_index;\n      uint16_t modified_int_registers_remaining = ex.modified_int_registers();\n      while (xe::bit_scan_forward(modified_int_registers_remaining,\n                                  &modified_register_index)) {\n        modified_int_registers_remaining &=\n            ~(UINT16_C(1) << modified_register_index);\n        (&ex_info->ContextRecord->Rax)[modified_register_index] =\n            thread_context.int_registers[modified_register_index];\n      }\n      uint16_t modified_xmm_registers_remaining = ex.modified_xmm_registers();\n      while (xe::bit_scan_forward(modified_xmm_registers_remaining,\n                                  &modified_register_index)) {\n        modified_xmm_registers_remaining &=\n            ~(UINT16_C(1) << modified_register_index);\n        std::memcpy(&ex_info->ContextRecord->Xmm0 + modified_register_index,\n                    &thread_context.xmm_registers[modified_register_index],\n                    sizeof(vec128_t));\n      }\n      return EXCEPTION_CONTINUE_EXECUTION;\n    }\n  }\n  return EXCEPTION_CONTINUE_SEARCH;\n}\n\nvoid ExceptionHandler::Install(Handler fn, void* data) {\n  if (!veh_handle_) {\n    veh_handle_ = AddVectoredExceptionHandler(1, ExceptionHandlerCallback);\n\n    if (IsDebuggerPresent()) {\n      // TODO(benvanik): do we need a continue handler if a debugger is\n      // attached?\n      // vch_handle_ = AddVectoredContinueHandler(1, ExceptionHandlerCallback);\n    }\n  }\n\n  for (size_t i = 0; i < xe::countof(handlers_); ++i) {\n    if (!handlers_[i].first) {\n      handlers_[i].first = fn;\n      handlers_[i].second = data;\n      return;\n    }\n  }\n  assert_always(\"Too many exception handlers installed\");\n}\n\nvoid ExceptionHandler::Uninstall(Handler fn, void* data) {\n  for (size_t i = 0; i < xe::countof(handlers_); ++i) {\n    if (handlers_[i].first == fn && handlers_[i].second == data) {\n      for (; i < xe::countof(handlers_) - 1; ++i) {\n        handlers_[i] = handlers_[i + 1];\n      }\n      handlers_[i].first = nullptr;\n      handlers_[i].second = nullptr;\n      break;\n    }\n  }\n\n  bool has_any = false;\n  for (size_t i = 0; i < xe::countof(handlers_); ++i) {\n    if (handlers_[i].first) {\n      has_any = true;\n      break;\n    }\n  }\n  if (!has_any) {\n    if (veh_handle_) {\n      RemoveVectoredExceptionHandler(veh_handle_);\n      veh_handle_ = nullptr;\n    }\n    if (vch_handle_) {\n      RemoveVectoredContinueHandler(vch_handle_);\n      vch_handle_ = nullptr;\n    }\n  }\n}\n\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/base/filesystem.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/filesystem.h\"\n\n#include <algorithm>\n\nnamespace xe {\nnamespace filesystem {\n\nbool CreateParentFolder(const std::filesystem::path& path) {\n  if (path.has_parent_path()) {\n    auto parent_path = path.parent_path();\n    if (!std::filesystem::exists(parent_path)) {\n      return std::filesystem::create_directories(parent_path);\n    }\n  }\n  return true;\n}\n\n}  // namespace filesystem\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/base/filesystem.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_BASE_FILESYSTEM_H_\n#define XENIA_BASE_FILESYSTEM_H_\n\n#include <filesystem>\n#include <iterator>\n#include <memory>\n#include <string>\n#include <string_view>\n#include <vector>\n\n#include \"xenia/base/platform.h\"\n#include \"xenia/base/string.h\"\n\nnamespace xe {\n\nstd::string path_to_utf8(const std::filesystem::path& path);\nstd::u16string path_to_utf16(const std::filesystem::path& path);\nstd::filesystem::path to_path(const std::string_view source);\nstd::filesystem::path to_path(const std::u16string_view source);\n\nnamespace filesystem {\n\n// Get executable path.\nstd::filesystem::path GetExecutablePath();\n\n// Get executable folder.\nstd::filesystem::path GetExecutableFolder();\n\n// Get user folder.\nstd::filesystem::path GetUserFolder();\n\n// Creates the parent folder of the specified path if needed.\n// This can be used to ensure the destination path for a new file exists before\n// attempting to create it.\nbool CreateParentFolder(const std::filesystem::path& path);\n\n// Creates an empty file at the given path, overwriting if it exists.\nbool CreateEmptyFile(const std::filesystem::path& path);\n\n// Opens the file at the given path with the specified mode.\n// This behaves like fopen and the returned handle can be used with stdio.\nFILE* OpenFile(const std::filesystem::path& path, const std::string_view mode);\n\n// Wrapper for the 64-bit version of fseek, returns true on success.\nbool Seek(FILE* file, int64_t offset, int origin);\n\n// Wrapper for the 64-bit version of ftell, returns a positive value on success.\nint64_t Tell(FILE* file);\n\n// Reduces the size of a stdio file opened for writing. The file pointer is\n// clamped. If this returns false, the size of the file and the file pointer are\n// undefined.\nbool TruncateStdioFile(FILE* file, uint64_t length);\n\nstruct FileAccess {\n  // Implies kFileReadData.\n  static const uint32_t kGenericRead = 0x80000000;\n  // Implies kFileWriteData.\n  static const uint32_t kGenericWrite = 0x40000000;\n  static const uint32_t kGenericExecute = 0x20000000;\n  static const uint32_t kGenericAll = 0x10000000;\n  static const uint32_t kFileReadData = 0x00000001;\n  static const uint32_t kFileWriteData = 0x00000002;\n  static const uint32_t kFileAppendData = 0x00000004;\n};\n\nclass FileHandle {\n public:\n  // Opens the file, failing if it doesn't exist.\n  // The desired_access bitmask denotes the permissions on the file.\n  static std::unique_ptr<FileHandle> OpenExisting(\n      const std::filesystem::path& path, uint32_t desired_access);\n\n  virtual ~FileHandle() = default;\n\n  const std::filesystem::path& path() const { return path_; }\n\n  // Reads the requested number of bytes from the file starting at the given\n  // offset. The total number of bytes read is returned only if the complete\n  // read succeeds.\n  virtual bool Read(size_t file_offset, void* buffer, size_t buffer_length,\n                    size_t* out_bytes_read) = 0;\n\n  // Writes the given buffer to the file starting at the given offset.\n  // The total number of bytes written is returned only if the complete\n  // write succeeds.\n  virtual bool Write(size_t file_offset, const void* buffer,\n                     size_t buffer_length, size_t* out_bytes_written) = 0;\n\n  // Set length of the file in bytes.\n  virtual bool SetLength(size_t length) = 0;\n\n  // Flushes any pending write buffers to the underlying filesystem.\n  virtual void Flush() = 0;\n\n protected:\n  explicit FileHandle(const std::filesystem::path& path) : path_(path) {}\n\n  std::filesystem::path path_;\n};\n\nstruct FileInfo {\n  enum class Type {\n    kFile,\n    kDirectory,\n  };\n  Type type;\n  std::filesystem::path name;\n  std::filesystem::path path;\n  size_t total_size;\n  uint64_t create_timestamp;\n  uint64_t access_timestamp;\n  uint64_t write_timestamp;\n};\nbool GetInfo(const std::filesystem::path& path, FileInfo* out_info);\nstd::vector<FileInfo> ListFiles(const std::filesystem::path& path);\n\n#if XE_PLATFORM_ANDROID\nvoid AndroidInitialize();\nvoid AndroidShutdown();\nbool IsAndroidContentUri(const std::string_view source);\nint OpenAndroidContentFileDescriptor(const std::string_view uri,\n                                     const char* mode);\n#endif  // XE_PLATFORM_ANDROID\n\n}  // namespace filesystem\n}  // namespace xe\n\n#endif  // XENIA_BASE_FILESYSTEM_H_\n"
  },
  {
    "path": "src/xenia/base/filesystem_android.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include <android/log.h>\n#include <jni.h>\n#include <cstring>\n\n#include \"xenia/base/filesystem.h\"\n#include \"xenia/base/main_android.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/string.h\"\n\nnamespace xe {\nnamespace filesystem {\n\n// Using Android logging because the file system may need to be initialized\n// before logging.\n\nstatic jobject android_content_resolver_;\nstatic jclass android_content_resolver_class_;\nstatic jmethodID android_content_resolver_open_file_descriptor_;\n\nstatic jclass android_parcel_file_descriptor_class_;\nstatic jmethodID android_parcel_file_descriptor_detach_fd_;\n\nstatic jclass android_uri_class_;\nstatic jmethodID android_uri_parse_;\n\nstatic bool android_content_resolver_initialized_;\n\nstatic void AndroidShutdownContentResolver() {\n  android_content_resolver_initialized_ = false;\n  android_uri_parse_ = nullptr;\n  android_parcel_file_descriptor_detach_fd_ = nullptr;\n  android_content_resolver_open_file_descriptor_ = nullptr;\n  JNIEnv* jni_env = GetAndroidThreadJniEnv();\n  if (jni_env) {\n    if (android_uri_class_) {\n      jni_env->DeleteGlobalRef(android_uri_class_);\n    }\n    if (android_parcel_file_descriptor_class_) {\n      jni_env->DeleteGlobalRef(\n          reinterpret_cast<jobject>(android_parcel_file_descriptor_class_));\n    }\n    if (android_content_resolver_class_) {\n      jni_env->DeleteGlobalRef(\n          reinterpret_cast<jobject>(android_content_resolver_class_));\n    }\n    if (android_content_resolver_) {\n      jni_env->DeleteGlobalRef(\n          reinterpret_cast<jobject>(android_content_resolver_));\n    }\n  }\n  android_uri_class_ = nullptr;\n  android_parcel_file_descriptor_class_ = nullptr;\n  android_content_resolver_class_ = nullptr;\n  android_content_resolver_ = nullptr;\n}\n\nstatic void AndroidInitializeContentResolver() {\n  JNIEnv* jni_env = GetAndroidThreadJniEnv();\n  if (!jni_env) {\n    return;\n  }\n  jobject application_context = GetAndroidApplicationContext();\n  if (!application_context) {\n    return;\n  }\n  {\n    jclass context_class = jni_env->GetObjectClass(application_context);\n    if (!context_class) {\n      __android_log_write(ANDROID_LOG_ERROR, \"AndroidInitializeContentResolver\",\n                          \"Failed to get the context class\");\n      AndroidShutdownContentResolver();\n      return;\n    }\n    jmethodID context_get_content_resolver =\n        jni_env->GetMethodID(context_class, \"getContentResolver\",\n                             \"()Landroid/content/ContentResolver;\");\n    if (!context_get_content_resolver) {\n      __android_log_write(\n          ANDROID_LOG_ERROR, \"AndroidInitializeContentResolver\",\n          \"Failed to get the getContentResolver method of the context\");\n      jni_env->DeleteLocalRef(reinterpret_cast<jobject>(context_class));\n      AndroidShutdownContentResolver();\n      return;\n    }\n    jobject content_resolver = jni_env->CallObjectMethod(\n        application_context, context_get_content_resolver);\n    jni_env->DeleteLocalRef(reinterpret_cast<jobject>(context_class));\n    if (!content_resolver) {\n      __android_log_write(ANDROID_LOG_ERROR, \"AndroidInitializeContentResolver\",\n                          \"Failed to get the content resolver\");\n      AndroidShutdownContentResolver();\n      return;\n    }\n    android_content_resolver_ = jni_env->NewGlobalRef(content_resolver);\n    jni_env->DeleteLocalRef(content_resolver);\n  }\n  if (!android_content_resolver_) {\n    __android_log_write(\n        ANDROID_LOG_ERROR, \"AndroidInitializeContentResolver\",\n        \"Failed to create a global reference to the content resolver\");\n    AndroidShutdownContentResolver();\n    return;\n  }\n  {\n    jobject content_resolver_class =\n        jni_env->GetObjectClass(android_content_resolver_);\n    if (!content_resolver_class) {\n      __android_log_write(ANDROID_LOG_ERROR, \"AndroidInitializeContentResolver\",\n                          \"Failed to get the content resolver class\");\n      AndroidShutdownContentResolver();\n      return;\n    }\n    android_content_resolver_class_ =\n        reinterpret_cast<jclass>(jni_env->NewGlobalRef(\n            reinterpret_cast<jobject>(content_resolver_class)));\n    jni_env->DeleteLocalRef(reinterpret_cast<jobject>(content_resolver_class));\n  }\n  if (!android_content_resolver_class_) {\n    __android_log_write(\n        ANDROID_LOG_ERROR, \"AndroidInitializeContentResolver\",\n        \"Failed to create a global reference to the content resolver class\");\n    AndroidShutdownContentResolver();\n    return;\n  }\n  android_content_resolver_open_file_descriptor_ = jni_env->GetMethodID(\n      android_content_resolver_class_, \"openFileDescriptor\",\n      \"(Landroid/net/Uri;Ljava/lang/String;)Landroid/os/ParcelFileDescriptor;\");\n  if (!android_content_resolver_open_file_descriptor_) {\n    __android_log_write(\n        ANDROID_LOG_ERROR, \"AndroidInitializeContentResolver\",\n        \"Failed to get the openFileDescriptor method of the content resolver\");\n    AndroidShutdownContentResolver();\n    return;\n  }\n\n  {\n    jclass parcel_file_descriptor_class =\n        jni_env->FindClass(\"android/os/ParcelFileDescriptor\");\n    if (!parcel_file_descriptor_class) {\n      __android_log_write(ANDROID_LOG_ERROR, \"AndroidInitializeContentResolver\",\n                          \"Failed to get the parcel file descriptor class\");\n      AndroidShutdownContentResolver();\n      return;\n    }\n    android_parcel_file_descriptor_class_ =\n        reinterpret_cast<jclass>(jni_env->NewGlobalRef(\n            reinterpret_cast<jobject>(parcel_file_descriptor_class)));\n    jni_env->DeleteLocalRef(\n        reinterpret_cast<jobject>(parcel_file_descriptor_class));\n  }\n  if (!android_parcel_file_descriptor_class_) {\n    __android_log_write(\n        ANDROID_LOG_ERROR, \"AndroidInitializeContentResolver\",\n        \"Failed to create a global reference to the parcel file descriptor \"\n        \"class\");\n    AndroidShutdownContentResolver();\n    return;\n  }\n  android_parcel_file_descriptor_detach_fd_ = jni_env->GetMethodID(\n      android_parcel_file_descriptor_class_, \"detachFd\", \"()I\");\n  if (!android_parcel_file_descriptor_detach_fd_) {\n    __android_log_write(\n        ANDROID_LOG_ERROR, \"AndroidInitializeContentResolver\",\n        \"Failed to get the detachFd method of the parcel file descriptor\");\n    AndroidShutdownContentResolver();\n    return;\n  }\n\n  {\n    jclass uri_class = jni_env->FindClass(\"android/net/Uri\");\n    if (!uri_class) {\n      __android_log_write(ANDROID_LOG_ERROR, \"AndroidInitializeContentResolver\",\n                          \"Failed to get the URI class\");\n      AndroidShutdownContentResolver();\n      return;\n    }\n    android_uri_class_ = reinterpret_cast<jclass>(\n        jni_env->NewGlobalRef(reinterpret_cast<jobject>(uri_class)));\n    jni_env->DeleteLocalRef(reinterpret_cast<jobject>(uri_class));\n  }\n  if (!android_uri_class_) {\n    __android_log_write(ANDROID_LOG_ERROR, \"AndroidInitializeContentResolver\",\n                        \"Failed to create a global reference to the URI class\");\n    AndroidShutdownContentResolver();\n    return;\n  }\n  android_uri_parse_ = jni_env->GetStaticMethodID(\n      android_uri_class_, \"parse\", \"(Ljava/lang/String;)Landroid/net/Uri;\");\n  if (!android_uri_parse_) {\n    __android_log_write(ANDROID_LOG_ERROR, \"AndroidInitializeContentResolver\",\n                        \"Failed to get the parse method of the URI class\");\n    AndroidShutdownContentResolver();\n    return;\n  }\n\n  android_content_resolver_initialized_ = true;\n}\n\nvoid AndroidInitialize() { AndroidInitializeContentResolver(); }\n\nvoid AndroidShutdown() { AndroidShutdownContentResolver(); }\n\nbool IsAndroidContentUri(const std::string_view source) {\n  // A URI schema is case-insensitive. Though just content: defines the schema,\n  // still including // in the comparison to distinguish from a file with a name\n  // starting from content: (as this is the main purpose of this code -\n  // separating URIs from file paths) more clearly.\n  static const char kContentSchema[] = \"content://\";\n  constexpr size_t kContentSchemaLength = xe::countof(kContentSchema) - 1;\n  return source.size() >= kContentSchemaLength &&\n         !xe_strncasecmp(source.data(), kContentSchema, kContentSchemaLength);\n}\n\nint OpenAndroidContentFileDescriptor(const std::string_view uri,\n                                     const char* mode) {\n  if (!android_content_resolver_initialized_) {\n    return -1;\n  }\n  JNIEnv* jni_env = GetAndroidThreadJniEnv();\n  if (!jni_env) {\n    return -1;\n  }\n\n  jobject uri_object;\n  {\n    jstring uri_string;\n    {\n      std::u16string uri_u16 = xe::to_utf16(uri);\n      uri_string = jni_env->NewString(\n          reinterpret_cast<const jchar*>(uri_u16.data()), uri_u16.size());\n    }\n    if (!uri_string) {\n      return -1;\n    }\n    uri_object = jni_env->CallStaticObjectMethod(\n        android_uri_class_, android_uri_parse_, uri_string);\n    jni_env->DeleteLocalRef(uri_string);\n  }\n  if (!uri_object) {\n    return -1;\n  }\n\n  jstring mode_string = jni_env->NewStringUTF(mode);\n  if (!mode_string) {\n    jni_env->DeleteLocalRef(uri_object);\n    return -1;\n  }\n\n  jobject parcel_file_descriptor = jni_env->CallObjectMethod(\n      android_content_resolver_, android_content_resolver_open_file_descriptor_,\n      uri_object, mode_string);\n  jni_env->DeleteLocalRef(mode_string);\n  jni_env->DeleteLocalRef(uri_object);\n  if (jni_env->ExceptionCheck()) {\n    jni_env->ExceptionClear();\n    return -1;\n  }\n  if (!parcel_file_descriptor) {\n    return -1;\n  }\n  int file_descriptor = jni_env->CallIntMethod(\n      parcel_file_descriptor, android_parcel_file_descriptor_detach_fd_);\n  jni_env->DeleteLocalRef(parcel_file_descriptor);\n\n  return file_descriptor;\n}\n\n}  // namespace filesystem\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/base/filesystem_posix.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/filesystem.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/string.h\"\n\n#include <assert.h>\n#include <dirent.h>\n#include <fcntl.h>\n#include <ftw.h>\n#include <libgen.h>\n#include <pwd.h>\n#include <stdio.h>\n#include <string.h>\n#include <sys/stat.h>\n#include <sys/types.h>\n#include <unistd.h>\n#include <iostream>\n\nnamespace xe {\n\nstd::string path_to_utf8(const std::filesystem::path& path) {\n  return path.string();\n}\n\nstd::u16string path_to_utf16(const std::filesystem::path& path) {\n  return xe::to_utf16(path.string());\n}\n\nstd::filesystem::path to_path(const std::string_view source) { return source; }\n\nstd::filesystem::path to_path(const std::u16string_view source) {\n  return xe::to_utf8(source);\n}\n\nnamespace filesystem {\n\nstd::filesystem::path GetExecutablePath() {\n  char buff[FILENAME_MAX] = \"\";\n  readlink(\"/proc/self/exe\", buff, FILENAME_MAX);\n  std::string s(buff);\n  return s;\n}\n\nstd::filesystem::path GetExecutableFolder() {\n  return GetExecutablePath().parent_path();\n}\n\nstd::filesystem::path GetUserFolder() {\n  // get preferred data home\n  char* home = std::getenv(\"XDG_DATA_HOME\");\n  if (home) {\n    return std::string(home);\n  }\n\n  // if XDG_DATA_HOME not set, fallback to HOME directory\n  home = std::getenv(\"HOME\");\n\n  // if HOME not set, fall back to this\n  if (home == NULL) {\n    struct passwd pw1;\n    struct passwd* pw;\n    char buf[4096];  // could potentionally lower this\n    getpwuid_r(getuid(), &pw1, buf, sizeof(buf), &pw);\n    assert(&pw1 == pw);  // sanity check\n    home = pw->pw_dir;\n  }\n\n  return std::filesystem::path(home) / \".local\" / \"share\";\n}\n\nFILE* OpenFile(const std::filesystem::path& path, const std::string_view mode) {\n  return fopen(path.c_str(), std::string(mode).c_str());\n}\n\nbool Seek(FILE* file, int64_t offset, int origin) {\n  return fseeko64(file, off64_t(offset), origin) == 0;\n}\n\nint64_t Tell(FILE* file) { return int64_t(ftello64(file)); }\n\nbool TruncateStdioFile(FILE* file, uint64_t length) {\n  if (fflush(file)) {\n    return false;\n  }\n  int64_t position = Tell(file);\n  if (position < 0) {\n    return false;\n  }\n  if (ftruncate64(fileno(file), off64_t(length))) {\n    return false;\n  }\n  if (uint64_t(position) > length) {\n    if (!Seek(file, 0, SEEK_END)) {\n      return false;\n    }\n  }\n  return true;\n}\n\nstatic int removeCallback(const char* fpath, const struct stat* sb,\n                          int typeflag, struct FTW* ftwbuf) {\n  int rv = remove(fpath);\n  return rv;\n}\n\nstatic uint64_t convertUnixtimeToWinFiletime(time_t unixtime) {\n  // Linux uses number of seconds since 1/1/1970, and Windows uses\n  // number of nanoseconds since 1/1/1601\n  // so we convert linux time to nanoseconds and then add the number of\n  // nanoseconds from 1601 to 1970\n  // see https://msdn.microsoft.com/en-us/library/ms724228\n  uint64_t filetime = filetime = (unixtime * 10000000) + 116444736000000000;\n  return filetime;\n}\n\nbool CreateEmptyFile(const std::filesystem::path& path) {\n  int file = creat(path.c_str(), 0774);\n  if (file >= 0) {\n    close(file);\n    return true;\n  }\n  return false;\n}\n\nclass PosixFileHandle : public FileHandle {\n public:\n  PosixFileHandle(std::filesystem::path path, int handle)\n      : FileHandle(std::move(path)), handle_(handle) {}\n  ~PosixFileHandle() override {\n    close(handle_);\n    handle_ = -1;\n  }\n  bool Read(size_t file_offset, void* buffer, size_t buffer_length,\n            size_t* out_bytes_read) override {\n    ssize_t out = pread(handle_, buffer, buffer_length, file_offset);\n    *out_bytes_read = out;\n    return out >= 0 ? true : false;\n  }\n  bool Write(size_t file_offset, const void* buffer, size_t buffer_length,\n             size_t* out_bytes_written) override {\n    ssize_t out = pwrite(handle_, buffer, buffer_length, file_offset);\n    *out_bytes_written = out;\n    return out >= 0 ? true : false;\n  }\n  bool SetLength(size_t length) override {\n    return ftruncate(handle_, length) >= 0 ? true : false;\n  }\n  void Flush() override { fsync(handle_); }\n\n private:\n  int handle_ = -1;\n};\n\nstd::unique_ptr<FileHandle> FileHandle::OpenExisting(\n    const std::filesystem::path& path, uint32_t desired_access) {\n  int open_access = 0;\n  if (desired_access & FileAccess::kGenericRead) {\n    open_access |= O_RDONLY;\n  }\n  if (desired_access & FileAccess::kGenericWrite) {\n    open_access |= O_WRONLY;\n  }\n  if (desired_access & FileAccess::kGenericExecute) {\n    open_access |= O_RDONLY;\n  }\n  if (desired_access & FileAccess::kGenericAll) {\n    open_access |= O_RDWR;\n  }\n  if (desired_access & FileAccess::kFileReadData) {\n    open_access |= O_RDONLY;\n  }\n  if (desired_access & FileAccess::kFileWriteData) {\n    open_access |= O_WRONLY;\n  }\n  if (desired_access & FileAccess::kFileAppendData) {\n    open_access |= O_APPEND;\n  }\n  int handle = open(path.c_str(), open_access);\n  if (handle == -1) {\n    // TODO(benvanik): pick correct response.\n    return nullptr;\n  }\n  return std::make_unique<PosixFileHandle>(path, handle);\n}\n\nbool GetInfo(const std::filesystem::path& path, FileInfo* out_info) {\n  struct stat st;\n  if (stat(path.c_str(), &st) == 0) {\n    if (S_ISDIR(st.st_mode)) {\n      out_info->type = FileInfo::Type::kDirectory;\n    } else {\n      out_info->type = FileInfo::Type::kFile;\n    }\n    out_info->create_timestamp = convertUnixtimeToWinFiletime(st.st_ctime);\n    out_info->access_timestamp = convertUnixtimeToWinFiletime(st.st_atime);\n    out_info->write_timestamp = convertUnixtimeToWinFiletime(st.st_mtime);\n    return true;\n  }\n  return false;\n}\n\nstd::vector<FileInfo> ListFiles(const std::filesystem::path& path) {\n  std::vector<FileInfo> result;\n\n  DIR* dir = opendir(path.c_str());\n  if (!dir) {\n    return result;\n  }\n\n  while (auto ent = readdir(dir)) {\n    if (strcmp(ent->d_name, \".\") == 0 || strcmp(ent->d_name, \"..\") == 0) {\n      continue;\n    }\n\n    FileInfo info;\n\n    info.name = ent->d_name;\n    struct stat st;\n    stat((path / info.name).c_str(), &st);\n    info.create_timestamp = convertUnixtimeToWinFiletime(st.st_ctime);\n    info.access_timestamp = convertUnixtimeToWinFiletime(st.st_atime);\n    info.write_timestamp = convertUnixtimeToWinFiletime(st.st_mtime);\n    info.path = path;\n    if (ent->d_type == DT_DIR) {\n      info.type = FileInfo::Type::kDirectory;\n      info.total_size = 0;\n    } else {\n      info.type = FileInfo::Type::kFile;\n      info.total_size = st.st_size;\n    }\n    result.push_back(info);\n  }\n  closedir(dir);\n  return result;\n}\n\n}  // namespace filesystem\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/base/filesystem_wildcard.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/filesystem_wildcard.h\"\n\n#include <algorithm>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/string.h\"\n\nnamespace xe::filesystem {\n\nWildcardFlags WildcardFlags::FIRST(true, false, false);\nWildcardFlags WildcardFlags::LAST(false, true, false);\nWildcardFlags WildcardFlags::ANY(false, false, true);\nWildcardFlags WildcardFlags::FIRST_AND_LAST(true, true, false);\n\nWildcardFlags::WildcardFlags()\n    : FromStart(false), ToEnd(false), ExactLength(false) {}\n\nWildcardFlags::WildcardFlags(bool start, bool end, bool exact_length)\n    : FromStart(start), ToEnd(end), ExactLength(exact_length) {}\n\nWildcardRule::WildcardRule(const std::string_view match,\n                           const WildcardFlags& flags)\n    : match_(utf8::lower_ascii(match)), rules_(flags) {}\n\nbool WildcardRule::Check(const std::string_view lower,\n                         std::string::size_type* offset) const {\n  if (match_.empty()) {\n    return true;\n  }\n\n  if ((lower.size() - *offset) < match_.size()) {\n    return false;\n  }\n\n  if (rules_.ExactLength) {\n    *offset += match_.size();\n    return true;\n  }\n\n  std::string_view::size_type result(lower.find(match_, *offset));\n\n  if (result != std::string_view::npos) {\n    if (rules_.FromStart && result != *offset) {\n      return false;\n    }\n\n    if (rules_.ToEnd && result != (lower.size() - match_.size())) {\n      return false;\n    }\n\n    *offset = (result + match_.size());\n    return true;\n  }\n\n  return false;\n}\n\nvoid WildcardEngine::PreparePattern(const std::string_view pattern) {\n  rules_.clear();\n\n  WildcardFlags flags(WildcardFlags::FIRST);\n  size_t n = 0;\n  size_t last = 0;\n  while ((n = pattern.find_first_of(\"*?\", last)) != pattern.npos) {\n    if (last != n) {\n      std::string str_str(pattern.substr(last, n - last));\n      rules_.push_back(WildcardRule(str_str, flags));\n    }\n    if (pattern[n] == '?') {\n      auto end = pattern.find_first_not_of('?', n + 1);\n      auto count = end == pattern.npos ? (pattern.size() - n) : (end - n);\n      rules_.push_back(\n          WildcardRule(pattern.substr(n, count), WildcardFlags::ANY));\n      last = n + count;\n    } else if (pattern[n] == '*') {\n      last = n + 1;\n    } else {\n      assert_always();\n    }\n    flags = WildcardFlags();\n  }\n  if (last != pattern.size()) {\n    std::string str_str(pattern.substr(last));\n    rules_.push_back(WildcardRule(\n        str_str, last ? WildcardFlags::LAST : WildcardFlags::FIRST_AND_LAST));\n  }\n}\n\nvoid WildcardEngine::SetRule(const std::string_view pattern) {\n  PreparePattern(pattern);\n}\n\nbool WildcardEngine::Match(const std::string_view str) const {\n  std::string str_lc = utf8::lower_ascii(str);\n  std::string::size_type offset(0);\n  for (const auto& rule : rules_) {\n    if (!(rule.Check(str_lc, &offset))) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\n}  // namespace xe::filesystem\n"
  },
  {
    "path": "src/xenia/base/filesystem_wildcard.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_BASE_FILESYSTEM_WILDCARD_H_\n#define XENIA_BASE_FILESYSTEM_WILDCARD_H_\n\n#include <iterator>\n#include <memory>\n#include <string>\n#include <vector>\n\n#include \"xenia/base/string.h\"\n\nnamespace xe {\nnamespace filesystem {\n\nclass WildcardFlags {\n public:\n  bool FromStart : 1, ToEnd : 1, ExactLength : 1;\n\n  WildcardFlags();\n  WildcardFlags(bool start, bool end, bool exact_length);\n\n  static WildcardFlags FIRST;\n  static WildcardFlags LAST;\n  static WildcardFlags ANY;\n  static WildcardFlags FIRST_AND_LAST;\n};\n\nclass WildcardRule {\n public:\n  WildcardRule(const std::string_view match, const WildcardFlags& flags);\n  bool Check(const std::string_view lower,\n             std::string_view::size_type* offset) const;\n\n private:\n  std::string match_;\n  WildcardFlags rules_;\n};\n\nclass WildcardEngine {\n public:\n  void SetRule(const std::string_view pattern);\n\n  // Always ignoring case\n  bool Match(const std::string_view str) const;\n\n private:\n  std::vector<WildcardRule> rules_;\n  void PreparePattern(const std::string_view pattern);\n};\n\n}  // namespace filesystem\n}  // namespace xe\n\n#endif  // XENIA_BASE_FILESYSTEM_WILDCARD_H_\n"
  },
  {
    "path": "src/xenia/base/filesystem_win.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include <io.h>\n#include <shlobj.h>\n\n#include <string>\n\n#undef CreateFile\n\n#include \"xenia/base/filesystem.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/platform_win.h\"\n#include \"xenia/base/string.h\"\n\nnamespace xe {\n\nstd::string path_to_utf8(const std::filesystem::path& path) {\n  return xe::to_utf8(path.u16string());\n}\n\nstd::u16string path_to_utf16(const std::filesystem::path& path) {\n  return path.u16string();\n}\n\nstd::filesystem::path to_path(const std::string_view source) {\n  return xe::to_utf16(source);\n}\n\nstd::filesystem::path to_path(const std::u16string_view source) {\n  return source;\n}\n\nnamespace filesystem {\n\nstd::filesystem::path GetExecutablePath() {\n  wchar_t* path;\n  auto error = _get_wpgmptr(&path);\n  return !error ? std::filesystem::path(path) : std::filesystem::path();\n}\n\nstd::filesystem::path GetExecutableFolder() {\n  return GetExecutablePath().parent_path();\n}\n\nstd::filesystem::path GetUserFolder() {\n  std::filesystem::path result;\n  PWSTR path;\n  if (SUCCEEDED(SHGetKnownFolderPath(FOLDERID_Documents, KF_FLAG_DEFAULT,\n                                     nullptr, &path))) {\n    result.assign(path);\n    CoTaskMemFree(path);\n  }\n  return result;\n}\n\nbool CreateEmptyFile(const std::filesystem::path& path) {\n  auto handle = CreateFileW(path.c_str(), 0, 0, nullptr, CREATE_ALWAYS,\n                            FILE_ATTRIBUTE_NORMAL, nullptr);\n  if (handle == INVALID_HANDLE_VALUE) {\n    return false;\n  }\n\n  CloseHandle(handle);\n  return true;\n}\n\nFILE* OpenFile(const std::filesystem::path& path, const std::string_view mode) {\n  // Dumb, but OK.\n  const auto wmode = xe::to_utf16(mode);\n  return _wfopen(path.c_str(), reinterpret_cast<const wchar_t*>(wmode.c_str()));\n}\n\nbool Seek(FILE* file, int64_t offset, int origin) {\n  return _fseeki64(file, offset, origin) == 0;\n}\n\nint64_t Tell(FILE* file) { return _ftelli64(file); }\n\nbool TruncateStdioFile(FILE* file, uint64_t length) {\n  // Flush is necessary - if not flushing, stream position may be out of sync.\n  if (fflush(file)) {\n    return false;\n  }\n  int64_t position = Tell(file);\n  if (position < 0) {\n    return false;\n  }\n  if (_chsize_s(_fileno(file), int64_t(length))) {\n    return false;\n  }\n  if (uint64_t(position) > length) {\n    if (!Seek(file, 0, SEEK_END)) {\n      return false;\n    }\n  }\n  return true;\n}\n\nclass Win32FileHandle : public FileHandle {\n public:\n  Win32FileHandle(const std::filesystem::path& path, HANDLE handle)\n      : FileHandle(path), handle_(handle) {}\n  ~Win32FileHandle() override {\n    CloseHandle(handle_);\n    handle_ = nullptr;\n  }\n  bool Read(size_t file_offset, void* buffer, size_t buffer_length,\n            size_t* out_bytes_read) override {\n    *out_bytes_read = 0;\n    OVERLAPPED overlapped;\n    overlapped.Pointer = (PVOID)file_offset;\n    overlapped.hEvent = NULL;\n    DWORD bytes_read = 0;\n    BOOL read = ReadFile(handle_, buffer, (DWORD)buffer_length, &bytes_read,\n                         &overlapped);\n    if (read) {\n      *out_bytes_read = bytes_read;\n      return true;\n    } else {\n      if (GetLastError() == ERROR_NOACCESS) {\n        XELOGW(\n            \"Win32FileHandle::Read(..., {}, 0x{:X}, ...) returned \"\n            \"ERROR_NOACCESS. Read-only memory?\",\n            buffer, buffer_length);\n      }\n      return false;\n    }\n  }\n  bool Write(size_t file_offset, const void* buffer, size_t buffer_length,\n             size_t* out_bytes_written) override {\n    *out_bytes_written = 0;\n    OVERLAPPED overlapped;\n    overlapped.Pointer = (PVOID)file_offset;\n    overlapped.hEvent = NULL;\n    DWORD bytes_written = 0;\n    BOOL wrote = WriteFile(handle_, buffer, (DWORD)buffer_length,\n                           &bytes_written, &overlapped);\n    if (wrote) {\n      *out_bytes_written = bytes_written;\n      return true;\n    } else {\n      return false;\n    }\n  }\n  bool SetLength(size_t length) {\n    LARGE_INTEGER position;\n    position.QuadPart = length;\n    if (!SetFilePointerEx(handle_, position, nullptr, SEEK_SET)) {\n      return false;\n    }\n    if (!SetEndOfFile(handle_)) {\n      return false;\n    }\n    return true;\n  }\n  void Flush() override { FlushFileBuffers(handle_); }\n\n private:\n  HANDLE handle_ = nullptr;\n};\n\nstd::unique_ptr<FileHandle> FileHandle::OpenExisting(\n    const std::filesystem::path& path, uint32_t desired_access) {\n  DWORD open_access = 0;\n  if (desired_access & FileAccess::kGenericRead) {\n    open_access |= GENERIC_READ;\n  }\n  if (desired_access & FileAccess::kGenericWrite) {\n    open_access |= GENERIC_WRITE;\n  }\n  if (desired_access & FileAccess::kGenericExecute) {\n    open_access |= GENERIC_EXECUTE;\n  }\n  if (desired_access & FileAccess::kGenericAll) {\n    open_access |= GENERIC_READ | GENERIC_WRITE;\n  }\n  if (desired_access & FileAccess::kFileReadData) {\n    open_access |= FILE_READ_DATA;\n  }\n  if (desired_access & FileAccess::kFileWriteData) {\n    open_access |= FILE_WRITE_DATA;\n  }\n  if (desired_access & FileAccess::kFileAppendData) {\n    open_access |= FILE_APPEND_DATA;\n  }\n  DWORD share_mode = FILE_SHARE_READ | FILE_SHARE_WRITE;\n  // We assume we've already created the file in the caller.\n  DWORD creation_disposition = OPEN_EXISTING;\n  HANDLE handle = CreateFileW(\n      path.c_str(), open_access, share_mode, nullptr, creation_disposition,\n      FILE_ATTRIBUTE_NORMAL | FILE_FLAG_BACKUP_SEMANTICS, nullptr);\n  if (handle == INVALID_HANDLE_VALUE) {\n    // TODO(benvanik): pick correct response.\n    return nullptr;\n  }\n  return std::make_unique<Win32FileHandle>(path, handle);\n}\n\n#define COMBINE_TIME(t) (((uint64_t)t.dwHighDateTime << 32) | t.dwLowDateTime)\n\nbool GetInfo(const std::filesystem::path& path, FileInfo* out_info) {\n  std::memset(out_info, 0, sizeof(FileInfo));\n  WIN32_FILE_ATTRIBUTE_DATA data = {0};\n  if (!GetFileAttributesEx(path.c_str(), GetFileExInfoStandard, &data)) {\n    return false;\n  }\n  if (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {\n    out_info->type = FileInfo::Type::kDirectory;\n    out_info->total_size = 0;\n  } else {\n    out_info->type = FileInfo::Type::kFile;\n    out_info->total_size =\n        (data.nFileSizeHigh * (size_t(MAXDWORD) + 1)) + data.nFileSizeLow;\n  }\n  out_info->path = path.parent_path();\n  out_info->name = path.filename();\n  out_info->create_timestamp = COMBINE_TIME(data.ftCreationTime);\n  out_info->access_timestamp = COMBINE_TIME(data.ftLastAccessTime);\n  out_info->write_timestamp = COMBINE_TIME(data.ftLastWriteTime);\n  return true;\n}\n\nstd::vector<FileInfo> ListFiles(const std::filesystem::path& path) {\n  std::vector<FileInfo> result;\n\n  WIN32_FIND_DATA ffd;\n  HANDLE handle = FindFirstFileW((path / \"*\").c_str(), &ffd);\n  if (handle == INVALID_HANDLE_VALUE) {\n    return result;\n  }\n  do {\n    if (std::wcscmp(ffd.cFileName, L\".\") == 0 ||\n        std::wcscmp(ffd.cFileName, L\"..\") == 0) {\n      continue;\n    }\n    FileInfo info;\n    if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {\n      info.type = FileInfo::Type::kDirectory;\n      info.total_size = 0;\n    } else {\n      info.type = FileInfo::Type::kFile;\n      info.total_size =\n          (ffd.nFileSizeHigh * (size_t(MAXDWORD) + 1)) + ffd.nFileSizeLow;\n    }\n    info.path = path;\n    info.name = ffd.cFileName;\n    info.create_timestamp = COMBINE_TIME(ffd.ftCreationTime);\n    info.access_timestamp = COMBINE_TIME(ffd.ftLastAccessTime);\n    info.write_timestamp = COMBINE_TIME(ffd.ftLastWriteTime);\n    result.push_back(info);\n  } while (FindNextFile(handle, &ffd) != 0);\n  FindClose(handle);\n\n  return result;\n}\n\n}  // namespace filesystem\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/base/fuzzy.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/fuzzy.h\"\n\n#include <cctype>\n#include <cstring>\n#include <iostream>\n\n// TODO(gibbed): UTF8 support.\n\nnamespace xe {\n\nint fuzzy_match(const std::string_view pattern, const char* value) {\n  // https://github.com/mattyork/fuzzy/blob/master/lib/fuzzy.js\n  // TODO(benvanik): look at\n  // https://github.com/atom/fuzzaldrin/tree/master/src This does not weight\n  // complete substrings or prefixes right, which kind of sucks.\n  size_t pattern_index = 0;\n  size_t value_length = std::strlen(value);\n  int total_score = 0;\n  int local_score = 0;\n  for (size_t i = 0; i < value_length; ++i) {\n    if (std::tolower(value[i]) == std::tolower(pattern[pattern_index])) {\n      ++pattern_index;\n      local_score += 1 + local_score;\n    } else {\n      local_score = 0;\n    }\n    total_score += local_score;\n  }\n  return total_score;\n}\n\nstd::vector<std::pair<size_t, int>> fuzzy_filter(const std::string_view pattern,\n                                                 const void* const* entries,\n                                                 size_t entry_count,\n                                                 size_t string_offset) {\n  std::vector<std::pair<size_t, int>> results;\n  results.reserve(entry_count);\n  for (size_t i = 0; i < entry_count; ++i) {\n    auto entry_value =\n        reinterpret_cast<const char*>(entries[i]) + string_offset;\n    int score = fuzzy_match(pattern, entry_value);\n    results.emplace_back(i, score);\n  }\n  return results;\n}\n\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/base/fuzzy.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_BASE_FUZZY_H_\n#define XENIA_BASE_FUZZY_H_\n\n#include <string>\n#include <vector>\n\nnamespace xe {\n\n// Tests a match against a case-insensitive fuzzy filter.\n// Returns the score of the match or 0 if none.\nint fuzzy_match(const std::string_view pattern, const char* value);\n\n// Applies a case-insensitive fuzzy filter to the given entries and ranks\n// results.\n// Entries is a list of pointers to opaque structs, each of which contains a\n// char* string at the given offset.\n// Returns an unsorted list of {original index, score}.\nstd::vector<std::pair<size_t, int>> fuzzy_filter(const std::string_view pattern,\n                                                 const void* const* entries,\n                                                 size_t entry_count,\n                                                 size_t string_offset);\ntemplate <typename T>\nstd::vector<std::pair<size_t, int>> fuzzy_filter(const std::string_view pattern,\n                                                 const std::vector<T>& entries,\n                                                 size_t string_offset) {\n  return fuzzy_filter(pattern, reinterpret_cast<void* const*>(entries.data()),\n                      entries.size(), string_offset);\n}\n\n}  // namespace xe\n\n#endif  // XENIA_BASE_FUZZY_H_\n"
  },
  {
    "path": "src/xenia/base/hash.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_BASE_HASH_H_\n#define XENIA_BASE_HASH_H_\n\n#include <cstddef>\n\n#include \"xenia/base/xxhash.h\"\n\nnamespace xe {\nnamespace hash {\n\n// For use in unordered_sets and unordered_maps (primarily multisets and\n// multimaps, with manual collision resolution), where the hash is calculated\n// externally (for instance, as XXH3), possibly requiring context data rather\n// than a pure function to calculate the hash\ntemplate <typename Key>\nstruct IdentityHasher {\n  size_t operator()(const Key& key) const { return static_cast<size_t>(key); }\n};\n\ntemplate <typename Key>\nstruct XXHasher {\n  size_t operator()(const Key& key) const {\n    return static_cast<size_t>(XXH3_64bits(&key, sizeof(key)));\n  }\n};\n\n}  // namespace hash\n}  // namespace xe\n\n#endif  // XENIA_BASE_HASH_H_\n"
  },
  {
    "path": "src/xenia/base/host_thread_context.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/host_thread_context.h\"\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/platform.h\"\n#include \"xenia/base/string_util.h\"\n\nnamespace xe {\n\n// NOTE: this order matches 1:1 with the HostRegister enums.\nstatic const char* kRegisterNames[] = {\n#if XE_ARCH_AMD64\n    \"rip\",   \"eflags\", \"rax\",   \"rcx\",   \"rdx\",   \"rbx\",   \"rsp\",\n    \"rbp\",   \"rsi\",    \"rdi\",   \"r8\",    \"r9\",    \"r10\",   \"r11\",\n    \"r12\",   \"r13\",    \"r14\",   \"r15\",   \"xmm0\",  \"xmm1\",  \"xmm2\",\n    \"xmm3\",  \"xmm4\",   \"xmm5\",  \"xmm6\",  \"xmm7\",  \"xmm8\",  \"xmm9\",\n    \"xmm10\", \"xmm11\",  \"xmm12\", \"xmm13\", \"xmm14\", \"xmm15\",\n#elif XE_ARCH_ARM64\n    \"x0\",  \"x1\",  \"x2\",  \"x3\",     \"x4\",   \"x5\",   \"x6\",  \"x7\",  \"x8\",  \"x9\",\n    \"x10\", \"x11\", \"x12\", \"x13\",    \"x14\",  \"x15\",  \"x16\", \"x17\", \"x18\", \"x19\",\n    \"x20\", \"x21\", \"x22\", \"x23\",    \"x24\",  \"x25\",  \"x26\", \"x27\", \"x28\", \"x29\",\n    \"x30\", \"sp\",  \"pc\",  \"pstate\", \"fpsr\", \"fpcr\", \"v0\",  \"v1\",  \"v2\",  \"v3\",\n    \"v4\",  \"v5\",  \"v6\",  \"v7\",     \"v8\",   \"v9\",   \"v10\", \"v11\", \"v12\", \"v13\",\n    \"v14\", \"v15\", \"v16\", \"v17\",    \"v18\",  \"v19\",  \"v20\", \"v21\", \"v22\", \"v23\",\n    \"v24\", \"v25\", \"v26\", \"v27\",    \"v28\",  \"v29\",  \"v30\", \"v31\",\n#endif  // XE_ARCH\n};\n\nconst char* HostThreadContext::GetRegisterName(HostRegister reg) {\n  return kRegisterNames[int(reg)];\n}\n\nstd::string HostThreadContext::GetStringFromValue(HostRegister reg,\n                                                  bool hex) const {\n#if XE_ARCH_AMD64\n  switch (reg) {\n    case X64Register::kRip:\n      return hex ? string_util::to_hex_string(rip) : std::to_string(rip);\n    case X64Register::kEflags:\n      return hex ? string_util::to_hex_string(eflags) : std::to_string(eflags);\n    default:\n      if (reg >= X64Register::kIntRegisterFirst &&\n          reg <= X64Register::kIntRegisterLast) {\n        auto value =\n            int_registers[int(reg) - int(X64Register::kIntRegisterFirst)];\n        return hex ? string_util::to_hex_string(value) : std::to_string(value);\n      } else if (reg >= X64Register::kXmm0 && reg <= X64Register::kXmm15) {\n        auto value = xmm_registers[int(reg) - int(X64Register::kXmm0)];\n        return hex ? string_util::to_hex_string(value) : xe::to_string(value);\n      } else {\n        assert_unhandled_case(reg);\n        return std::string();\n      }\n  }\n#elif XE_ARCH_ARM64\n  switch (reg) {\n    case Arm64Register::kSp:\n      return hex ? string_util::to_hex_string(sp) : std::to_string(sp);\n    case Arm64Register::kPc:\n      return hex ? string_util::to_hex_string(pc) : std::to_string(pc);\n    case Arm64Register::kPstate:\n      return hex ? string_util::to_hex_string(pstate) : std::to_string(pstate);\n    case Arm64Register::kFpsr:\n      return hex ? string_util::to_hex_string(fpsr) : std::to_string(fpsr);\n    case Arm64Register::kFpcr:\n      return hex ? string_util::to_hex_string(fpcr) : std::to_string(fpcr);\n    default:\n      if (reg >= Arm64Register::kX0 && reg <= Arm64Register::kX30) {\n        auto value = x[int(reg) - int(Arm64Register::kX0)];\n        return hex ? string_util::to_hex_string(value) : std::to_string(value);\n      } else if (reg >= Arm64Register::kV0 && reg <= Arm64Register::kV31) {\n        auto value = v[int(reg) - int(Arm64Register::kV0)];\n        return hex ? string_util::to_hex_string(value) : xe::to_string(value);\n      } else {\n        assert_unhandled_case(reg);\n        return std::string();\n      }\n  }\n#else\n  assert_always(\n      \"HostThreadContext::GetStringFromValue not implemented for the target \"\n      \"CPU architecture\");\n  return std::string();\n#endif  // XE_ARCH\n}\n\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/base/host_thread_context.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_BASE_HOST_THREAD_CONTEXT_H_\n#define XENIA_BASE_HOST_THREAD_CONTEXT_H_\n\n#include <cstdint>\n#include <string>\n\n#include \"xenia/base/platform.h\"\n#include \"xenia/base/vec128.h\"\n\n#if XE_ARCH_AMD64\n#include <xmmintrin.h>\n#endif\n\nnamespace xe {\n\n// NOTE: The order of the registers in the enumerations must match the order in\n// the string table in host_thread_context.cc, as well as remapping tables in\n// exception handler implementations.\n\nenum class X64Register {\n  kRip,\n  kEflags,\n\n  kIntRegisterFirst,\n  // The order matches the indices in the instruction encoding, as well as the\n  // Windows CONTEXT structure.\n  kRax = kIntRegisterFirst,\n  kRcx,\n  kRdx,\n  kRbx,\n  kRsp,\n  kRbp,\n  kRsi,\n  kRdi,\n  kR8,\n  kR9,\n  kR10,\n  kR11,\n  kR12,\n  kR13,\n  kR14,\n  kR15,\n  kIntRegisterLast = kR15,\n\n  kXmm0,\n  kXmm1,\n  kXmm2,\n  kXmm3,\n  kXmm4,\n  kXmm5,\n  kXmm6,\n  kXmm7,\n  kXmm8,\n  kXmm9,\n  kXmm10,\n  kXmm11,\n  kXmm12,\n  kXmm13,\n  kXmm14,\n  kXmm15,\n};\n\nenum class Arm64Register {\n  kX0,\n  kX1,\n  kX2,\n  kX3,\n  kX4,\n  kX5,\n  kX6,\n  kX7,\n  kX8,\n  kX9,\n  kX10,\n  kX11,\n  kX12,\n  kX13,\n  kX14,\n  kX15,\n  kX16,\n  kX17,\n  kX18,\n  kX19,\n  kX20,\n  kX21,\n  kX22,\n  kX23,\n  kX24,\n  kX25,\n  kX26,\n  kX27,\n  kX28,\n  // FP (frame pointer).\n  kX29,\n  // LR (link register).\n  kX30,\n  kSp,\n  kPc,\n  kPstate,\n  kFpsr,\n  kFpcr,\n  // The whole 128 bits of a Vn register are also known as Qn (quadword).\n  kV0,\n  kV1,\n  kV2,\n  kV3,\n  kV4,\n  kV5,\n  kV6,\n  kV7,\n  kV8,\n  kV9,\n  kV10,\n  kV11,\n  kV12,\n  kV13,\n  kV14,\n  kV15,\n  kV16,\n  kV17,\n  kV18,\n  kV19,\n  kV20,\n  kV21,\n  kV22,\n  kV23,\n  kV24,\n  kV25,\n  kV26,\n  kV27,\n  kV28,\n  kV29,\n  kV30,\n  kV31,\n};\n\n#if XE_ARCH_AMD64\nusing HostRegister = X64Register;\n#elif XE_ARCH_ARM64\nusing HostRegister = Arm64Register;\n#else\nenum class HostRegister {};\n#endif  // XE_ARCH\n\nclass HostThreadContext {\n public:\n#if XE_ARCH_AMD64\n  uint64_t rip;\n  uint32_t eflags;\n  union {\n    struct {\n      uint64_t rax;\n      uint64_t rcx;\n      uint64_t rdx;\n      uint64_t rbx;\n      uint64_t rsp;\n      uint64_t rbp;\n      uint64_t rsi;\n      uint64_t rdi;\n      uint64_t r8;\n      uint64_t r9;\n      uint64_t r10;\n      uint64_t r11;\n      uint64_t r12;\n      uint64_t r13;\n      uint64_t r14;\n      uint64_t r15;\n    };\n    uint64_t int_registers[16];\n  };\n  union {\n    struct {\n      vec128_t xmm0;\n      vec128_t xmm1;\n      vec128_t xmm2;\n      vec128_t xmm3;\n      vec128_t xmm4;\n      vec128_t xmm5;\n      vec128_t xmm6;\n      vec128_t xmm7;\n      vec128_t xmm8;\n      vec128_t xmm9;\n      vec128_t xmm10;\n      vec128_t xmm11;\n      vec128_t xmm12;\n      vec128_t xmm13;\n      vec128_t xmm14;\n      vec128_t xmm15;\n    };\n    vec128_t xmm_registers[16];\n  };\n#elif XE_ARCH_ARM64\n  uint64_t x[31];\n  uint64_t sp;\n  uint64_t pc;\n  uint64_t pstate;\n  uint32_t fpsr;\n  uint32_t fpcr;\n  vec128_t v[32];\n#endif  // XE_ARCH\n\n  static const char* GetRegisterName(HostRegister reg);\n  std::string GetStringFromValue(HostRegister reg, bool hex) const;\n};\n\n}  // namespace xe\n\n#endif  // XENIA_BASE_X64_CONTEXT_H_\n"
  },
  {
    "path": "src/xenia/base/literals.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_BASE_LITERALS_H_\n#define XENIA_BASE_LITERALS_H_\n\n#include <cstdint>\n\nnamespace xe::literals {\n\nconstexpr size_t operator\"\"_KiB(unsigned long long int x) {\n  return 1024ULL * x;\n}\n\nconstexpr size_t operator\"\"_MiB(unsigned long long int x) {\n  return 1024_KiB * x;\n}\n\nconstexpr size_t operator\"\"_GiB(unsigned long long int x) {\n  return 1024_MiB * x;\n}\n\nconstexpr size_t operator\"\"_TiB(unsigned long long int x) {\n  return 1024_GiB * x;\n}\n\nconstexpr size_t operator\"\"_PiB(unsigned long long int x) {\n  return 1024_TiB * x;\n}\n\n}  // namespace xe::literals\n\n#endif  // XENIA_BASE_LITERALS_H_\n"
  },
  {
    "path": "src/xenia/base/logging.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/logging.h\"\n\n#include <algorithm>\n#include <atomic>\n#include <cstdlib>\n#include <cstring>\n#include <mutex>\n#include <vector>\n\n#include \"third_party/disruptorplus/include/disruptorplus/multi_threaded_claim_strategy.hpp\"\n#include \"third_party/disruptorplus/include/disruptorplus/ring_buffer.hpp\"\n#include \"third_party/disruptorplus/include/disruptorplus/sequence_barrier.hpp\"\n#include \"third_party/disruptorplus/include/disruptorplus/spin_wait_strategy.hpp\"\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/atomic.h\"\n#include \"xenia/base/console.h\"\n#include \"xenia/base/cvar.h\"\n#include \"xenia/base/debugging.h\"\n#include \"xenia/base/filesystem.h\"\n#include \"xenia/base/literals.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/memory.h\"\n#include \"xenia/base/platform.h\"\n#include \"xenia/base/ring_buffer.h\"\n#include \"xenia/base/string.h\"\n#include \"xenia/base/system.h\"\n#include \"xenia/base/threading.h\"\n\n// TODO(benvanik): generic API? logging_win.cc?\n#if XE_PLATFORM_ANDROID\n#include <android/log.h>\n#elif XE_PLATFORM_WIN32\n// For MessageBox:\n#include \"xenia/base/platform_win.h\"\n#endif  // XE_PLATFORM\n\n#include \"third_party/fmt/include/fmt/format.h\"\n\n#if XE_PLATFORM_ANDROID\nDEFINE_bool(log_to_logcat, true, \"Write log output to Android Logcat.\",\n            \"Logging\");\n#else\nDEFINE_path(log_file, \"\", \"Logs are written to the given file\", \"Logging\");\nDEFINE_bool(log_to_stdout, true, \"Write log output to stdout\", \"Logging\");\nDEFINE_bool(log_to_debugprint, false, \"Dump the log to DebugPrint.\", \"Logging\");\n#endif  // XE_PLATFORM_ANDROID\nDEFINE_bool(flush_log, true, \"Flush log file after each log line batch.\",\n            \"Logging\");\nDEFINE_int32(\n    log_level, 2,\n    \"Maximum level to be logged. (0=error, 1=warning, 2=info, 3=debug)\",\n    \"Logging\");\n\nnamespace dp = disruptorplus;\nusing namespace xe::literals;\n\nnamespace xe {\n\nclass Logger;\n\nLogger* logger_ = nullptr;\n\nstruct LogLine {\n  size_t buffer_length;\n  uint32_t thread_id;\n  uint16_t _pad_0;  // (2b) padding\n  bool terminate;\n  char prefix_char;\n};\n\nthread_local char thread_log_buffer_[64_KiB];\n\nFileLogSink::~FileLogSink() {\n  if (file_) {\n    fflush(file_);\n    if (owns_file_) {\n      fclose(file_);\n    }\n  }\n}\n\nvoid FileLogSink::Write(const char* buf, size_t size) {\n  if (file_) {\n    fwrite(buf, 1, size, file_);\n  }\n}\n\nvoid FileLogSink::Flush() {\n  if (file_) {\n    fflush(file_);\n  }\n}\n\nvoid DebugPrintLogSink::Write(const char* buf, size_t size) {\n  debugging::DebugPrint(\"{}\", std::string_view(buf, size));\n}\n\n#if XE_PLATFORM_ANDROID\nclass AndroidLogSink final : public LogSink {\n public:\n  explicit AndroidLogSink(const std::string_view tag) : tag_(tag) {}\n\n  void Write(const char* buf, size_t size) override;\n  void Flush() override;\n\n private:\n  // May be called with an empty line_buffer_ to write an empty log message (if\n  // the original message contains a blank line as a separator, for instance).\n  void WriteLineBuffer();\n\n  const std::string tag_;\n  android_LogPriority current_priority_ = ANDROID_LOG_INFO;\n  bool is_line_continuation_ = false;\n  size_t line_buffer_used_ = 0;\n  // LOGGER_ENTRY_MAX_PAYLOAD is defined as 4076 on older Android versions and\n  // as 4068 on newer ones. An attempt to write more than that amount to the\n  // kernel logger will result in a truncated log entry. 4000 is the commonly\n  // used limit considered safe.\n  // However, \"Log message text may be truncated to less than an\n  // implementation-specific limit (1023 bytes)\" - android/log.h.\n  char line_buffer_[1023 + 1];\n};\n\nvoid AndroidLogSink::Write(const char* buf, size_t size) {\n  // A null character, if appears, is fine - it will just truncate a single\n  // line, but since every message ends with a newline, and WriteLineBuffer is\n  // done after every line, it won't have lasting effects.\n  // Using memchr and memcpy as they are vectorized in Bionic.\n  while (size) {\n    const void* newline = std::memchr(buf, '\\n', size);\n    size_t line_remaining =\n        newline ? size_t(static_cast<const char*>(newline) - buf) : size;\n    while (line_remaining) {\n      assert_true(line_buffer_used_ < xe::countof(line_buffer_));\n      size_t append_count =\n          std::min(line_remaining,\n                   xe::countof(line_buffer_) - size_t(1) - line_buffer_used_);\n      std::memcpy(line_buffer_ + line_buffer_used_, buf, append_count);\n      buf += append_count;\n      size -= append_count;\n      line_remaining -= append_count;\n      line_buffer_used_ += append_count;\n      if (line_buffer_used_ >= xe::countof(line_buffer_) - size_t(1)) {\n        WriteLineBuffer();\n        // The next WriteLineBuffer belongs to the same line.\n        is_line_continuation_ = true;\n      }\n    }\n    if (newline) {\n      // If the end of the buffer was reached right before a newline character,\n      // so line_buffer_used_ is 0, and is_line_continuation_ has been set, the\n      // line break has already been done by Android itself - don't write an\n      // empty message. However, if the message intentionally contains blank\n      // lines, write them.\n      if (line_buffer_used_ || !is_line_continuation_) {\n        WriteLineBuffer();\n      }\n      is_line_continuation_ = false;\n      ++buf;\n      --size;\n    }\n  }\n}\n\nvoid AndroidLogSink::Flush() {\n  if (line_buffer_used_) {\n    WriteLineBuffer();\n  }\n}\n\nvoid AndroidLogSink::WriteLineBuffer() {\n  // If this is a new line, check if it's a new log message, and if it is,\n  // update the priority based on the prefix.\n  if (!is_line_continuation_ && line_buffer_used_ >= 3 &&\n      line_buffer_[1] == '>' && line_buffer_[2] == ' ') {\n    switch (line_buffer_[0]) {\n      case 'd':\n        current_priority_ = ANDROID_LOG_DEBUG;\n        break;\n      case 'w':\n        current_priority_ = ANDROID_LOG_WARN;\n        break;\n      case '!':\n        current_priority_ = ANDROID_LOG_ERROR;\n        break;\n      case 'x':\n        current_priority_ = ANDROID_LOG_FATAL;\n        break;\n      default:\n        current_priority_ = ANDROID_LOG_INFO;\n        break;\n    }\n  }\n  // Android skips blank lines, but if writing a blank line was requested\n  // explicitly for formatting, write a non-newline character.\n  if (!line_buffer_used_) {\n    line_buffer_[line_buffer_used_++] = ' ';\n  }\n  // Terminate the text.\n  assert_true(line_buffer_used_ < xe::countof(line_buffer_));\n  line_buffer_[line_buffer_used_] = '\\0';\n  // Write.\n  __android_log_write(current_priority_, tag_.c_str(), line_buffer_);\n  line_buffer_used_ = 0;\n}\n#endif  // XE_PLATFORM_ANDROID\n\nclass Logger {\n public:\n  explicit Logger(const std::string_view app_name)\n      : wait_strategy_(),\n        claim_strategy_(kBlockCount, wait_strategy_),\n        consumed_(wait_strategy_) {\n    claim_strategy_.add_claim_barrier(consumed_);\n\n    write_thread_ =\n        xe::threading::Thread::Create({}, [this]() { WriteThread(); });\n    assert_not_null(write_thread_);\n    write_thread_->set_name(\"Logging Writer\");\n  }\n\n  ~Logger() {\n    AppendLine(0, '\\0', nullptr, 0, true);  // append a terminator\n    xe::threading::Wait(write_thread_.get(), true);\n  }\n\n  void AddLogSink(std::unique_ptr<LogSink>&& sink) {\n    sinks_.push_back(std::move(sink));\n  }\n\n private:\n  static const size_t kBufferSize = 8_MiB;\n  uint8_t buffer_[kBufferSize];\n\n  static const size_t kBlockSize = 256;\n  static const size_t kBlockCount = kBufferSize / kBlockSize;\n  static const size_t kBlockIndexMask = kBlockCount - 1;\n\n  static const size_t kClaimStrategyFootprint =\n      sizeof(std::atomic<dp::sequence_t>[kBlockCount]);\n\n  static size_t BlockOffset(dp::sequence_t sequence) {\n    return (sequence & kBlockIndexMask) * kBlockSize;\n  }\n\n  static size_t BlockCount(size_t byte_size) {\n    return (byte_size + (kBlockSize - 1)) / kBlockSize;\n  }\n\n  dp::spin_wait_strategy wait_strategy_;\n  dp::multi_threaded_claim_strategy<dp::spin_wait_strategy> claim_strategy_;\n  dp::sequence_barrier<dp::spin_wait_strategy> consumed_;\n\n  std::vector<std::unique_ptr<LogSink>> sinks_;\n\n  std::unique_ptr<xe::threading::Thread> write_thread_;\n\n  void Write(const char* buf, size_t size) {\n    for (const auto& sink : sinks_) {\n      sink->Write(buf, size);\n    }\n  }\n\n  void WriteThread() {\n    RingBuffer rb(buffer_, kBufferSize);\n\n    size_t idle_loops = 0;\n\n    dp::sequence_t next_sequence = 0;\n    dp::sequence_t last_sequence = -1;\n\n    size_t desired_count = 1;\n    while (true) {\n      // We want one block to find out how many blocks we need or we know how\n      // many blocks needed for at least one log line.\n      auto next_range = dp::sequence_range(next_sequence, desired_count);\n\n      claim_strategy_.wait_until_published(next_range.last(), last_sequence);\n\n      size_t read_count = 0;\n      auto available_range = next_range;\n      auto available_count = available_range.size();\n\n      rb.set_write_offset(BlockOffset(available_range.end()));\n\n      bool terminate = false;\n      for (size_t i = available_range.first(); i != available_range.end();) {\n        rb.set_read_offset(BlockOffset(i));\n\n        LogLine line;\n        rb.Read(&line, sizeof(line));\n\n        auto needed_count = BlockCount(sizeof(LogLine) + line.buffer_length);\n        if (read_count + needed_count > available_count) {\n          // More blocks are needed for a complete line.\n          desired_count = needed_count;\n          break;\n        } else {\n          // Enough blocks to read this log line, advance by that many.\n          read_count += needed_count;\n          i += needed_count;\n\n          if (line.prefix_char) {\n            char prefix[] = {\n                line.prefix_char,\n                '>',\n                ' ',\n                '?',  // Thread ID gets placed here (8 chars).\n                '?',\n                '?',\n                '?',\n                '?',\n                '?',\n                '?',\n                '?',\n                ' ',\n                0,\n            };\n            fmt::format_to_n(prefix + 3, sizeof(prefix) - 3, \"{:08X}\",\n                             line.thread_id);\n            Write(prefix, sizeof(prefix) - 1);\n          }\n\n          if (line.buffer_length) {\n            // Get access to the line data - which may be split in the ring\n            // buffer - and write it out in parts.\n            auto line_range = rb.BeginRead(line.buffer_length);\n            Write(reinterpret_cast<const char*>(line_range.first),\n                  line_range.first_length);\n            if (line_range.second_length) {\n              Write(reinterpret_cast<const char*>(line_range.second),\n                    line_range.second_length);\n            }\n\n            // Always ensure there is a newline.\n            char last_char =\n                line_range.second\n                    ? line_range.second[line_range.second_length - 1]\n                    : line_range.first[line_range.first_length - 1];\n            if (last_char != '\\n') {\n              const char suffix[1] = {'\\n'};\n              Write(suffix, 1);\n            }\n\n            rb.EndRead(std::move(line_range));\n          } else {\n            // Always ensure there is a newline.\n            const char suffix[1] = {'\\n'};\n            Write(suffix, 1);\n          }\n\n          if (line.terminate) {\n            terminate = true;\n            break;\n          }\n        }\n      }\n\n      if (terminate) {\n        break;\n      }\n\n      if (read_count) {\n        // Advance by the number of blocks we read.\n        auto read_range = dp::sequence_range(next_sequence, read_count);\n        next_sequence = read_range.end();\n        last_sequence = read_range.last();\n        consumed_.publish(last_sequence);\n\n        desired_count = 1;\n\n        if (cvars::flush_log) {\n          for (const auto& sink : sinks_) {\n            sink->Flush();\n          }\n        }\n\n        idle_loops = 0;\n      } else {\n        if (idle_loops >= 1000) {\n          // Introduce a waiting period.\n          xe::threading::Sleep(std::chrono::milliseconds(50));\n        } else {\n          idle_loops++;\n        }\n      }\n    }\n  }\n\n public:\n  void AppendLine(uint32_t thread_id, const char prefix_char,\n                  const char* buffer_data, size_t buffer_length,\n                  bool terminate = false) {\n    size_t count = BlockCount(sizeof(LogLine) + buffer_length);\n\n    auto range = claim_strategy_.claim(count);\n    assert_true(range.size() == count);\n\n    RingBuffer rb(buffer_, kBufferSize);\n    rb.set_write_offset(BlockOffset(range.first()));\n    rb.set_read_offset(BlockOffset(range.end()));\n\n    LogLine line = {};\n    line.buffer_length = buffer_length;\n    line.thread_id = thread_id;\n    line.prefix_char = prefix_char;\n    line.terminate = terminate;\n\n    rb.Write(&line, sizeof(LogLine));\n    if (buffer_length) {\n      rb.Write(buffer_data, buffer_length);\n    }\n\n    claim_strategy_.publish(range);\n  }\n};\n\nvoid InitializeLogging(const std::string_view app_name) {\n  auto mem = memory::AlignedAlloc<Logger>(0x10);\n  logger_ = new (mem) Logger(app_name);\n\n#if XE_PLATFORM_ANDROID\n  // TODO(Triang3l): Enable file logging, but not by default as logs may be\n  // huge.\n  if (cvars::log_to_logcat) {\n    logger_->AddLogSink(std::make_unique<AndroidLogSink>(app_name));\n  }\n#else\n  FILE* log_file = nullptr;\n  if (cvars::log_file.empty()) {\n    // Default to app name.\n    auto file_name = fmt::format(\"{}.log\", app_name);\n    auto file_path = std::filesystem::path(file_name);\n    xe::filesystem::CreateParentFolder(file_path);\n\n    log_file = xe::filesystem::OpenFile(file_path, \"wt\");\n  } else {\n    xe::filesystem::CreateParentFolder(cvars::log_file);\n    log_file = xe::filesystem::OpenFile(cvars::log_file, \"wt\");\n  }\n  logger_->AddLogSink(std::make_unique<FileLogSink>(log_file, true));\n\n  if (cvars::log_to_stdout) {\n    logger_->AddLogSink(std::make_unique<FileLogSink>(stdout, false));\n  }\n\n  if (cvars::log_to_debugprint) {\n    logger_->AddLogSink(std::make_unique<DebugPrintLogSink>());\n  }\n#endif  // XE_PLATFORM_ANDROID\n}\n\nvoid ShutdownLogging() {\n  Logger* logger = logger_;\n  logger_ = nullptr;\n\n  logger->~Logger();\n  memory::AlignedFree(logger);\n}\n\nbool logging::ShouldLog(LogLevel log_level) {\n  return logger_ != nullptr &&\n         static_cast<int32_t>(log_level) <= cvars::log_level;\n}\n\nstd::pair<char*, size_t> logging::internal::GetThreadBuffer() {\n  return {thread_log_buffer_, sizeof(thread_log_buffer_)};\n}\n\nvoid logging::internal::AppendLogLine(LogLevel log_level,\n                                      const char prefix_char, size_t written) {\n  if (!ShouldLog(log_level) || !written) {\n    return;\n  }\n  logger_->AppendLine(xe::threading::current_thread_id(), prefix_char,\n                      thread_log_buffer_, written);\n}\n\nvoid logging::AppendLogLine(LogLevel log_level, const char prefix_char,\n                            const std::string_view str) {\n  if (!ShouldLog(log_level) || !str.size()) {\n    return;\n  }\n  logger_->AppendLine(xe::threading::current_thread_id(), prefix_char,\n                      str.data(), str.size());\n}\n\nvoid FatalError(const std::string_view str) {\n  logging::AppendLogLine(LogLevel::Error, 'x', str);\n\n  if (!xe::has_console_attached()) {\n    ShowSimpleMessageBox(SimpleMessageBoxType::Error, str);\n  }\n\n  ShutdownLogging();\n\n#if XE_PLATFORM_ANDROID\n  // Throw an error that can be reported to the developers via the store.\n  std::abort();\n#else\n  std::exit(EXIT_FAILURE);\n#endif  // XE_PLATFORM_ANDROID\n}\n\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/base/logging.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_BASE_LOGGING_H_\n#define XENIA_BASE_LOGGING_H_\n\n#include <cstdarg>\n#include <cstdint>\n#include <string>\n\n#include \"third_party/fmt/include/fmt/format.h\"\n#include \"xenia/base/string.h\"\n\nnamespace xe {\n\n#define XE_OPTION_ENABLE_LOGGING 1\n\n// Log level is a general indication of the importance of a given log line.\n//\n// While log levels are named, they are a rough correlation of what the log line\n// may be related to. These names should not be taken as fact as what a given\n// log line from any log level actually is.\nenum class LogLevel {\n  Error = 0,\n  Warning,\n  Info,\n  Debug,\n  Trace,\n};\n\nclass LogSink {\n public:\n  virtual ~LogSink() = default;\n\n  virtual void Write(const char* buf, size_t size) = 0;\n  virtual void Flush() = 0;\n};\n\nclass FileLogSink final : public LogSink {\n public:\n  explicit FileLogSink(FILE* file, bool own_file)\n      : file_(file), owns_file_(own_file) {}\n  ~FileLogSink();\n\n  void Write(const char* buf, size_t size) override;\n  void Flush() override;\n\n private:\n  FILE* file_;\n  bool owns_file_;\n};\n\nclass DebugPrintLogSink final : public LogSink {\n public:\n  DebugPrintLogSink() = default;\n\n  void Write(const char* buf, size_t size) override;\n  void Flush() override {}\n};\n\n// Initializes the logging system and any outputs requested.\n// Must be called on startup.\nvoid InitializeLogging(const std::string_view app_name);\nvoid ShutdownLogging();\n\nnamespace logging {\n\nconstexpr char kPrefixCharError = '!';\nconstexpr char kPrefixCharWarning = 'w';\nconstexpr char kPrefixCharInfo = 'i';\nconstexpr char kPrefixCharDebug = 'd';\n\nbool ShouldLog(LogLevel log_level);\n\nnamespace internal {\n\nstd::pair<char*, size_t> GetThreadBuffer();\n\nvoid AppendLogLine(LogLevel log_level, const char prefix_char, size_t written);\n\n}  // namespace internal\n\n// Appends a line to the log with {fmt}-style formatting.\ntemplate <typename... Args>\nvoid AppendLogLineFormat(LogLevel log_level, const char prefix_char,\n                         const char* format, const Args&... args) {\n  if (!ShouldLog(log_level)) {\n    return;\n  }\n  auto target = internal::GetThreadBuffer();\n  auto result = fmt::format_to_n(target.first, target.second, format, args...);\n  internal::AppendLogLine(log_level, prefix_char, result.size);\n}\n\n// Appends a line to the log.\nvoid AppendLogLine(LogLevel log_level, const char prefix_char,\n                   const std::string_view str);\n\n}  // namespace logging\n\n// Logs a fatal error and aborts the program.\nvoid FatalError(const std::string_view str);\n\n}  // namespace xe\n\n#if XE_OPTION_ENABLE_LOGGING\n\ntemplate <typename... Args>\nvoid XELOGE(const char* format, const Args&... args) {\n  xe::logging::AppendLogLineFormat(\n      xe::LogLevel::Error, xe::logging::kPrefixCharError, format, args...);\n}\n\ntemplate <typename... Args>\nvoid XELOGW(const char* format, const Args&... args) {\n  xe::logging::AppendLogLineFormat(\n      xe::LogLevel::Warning, xe::logging::kPrefixCharWarning, format, args...);\n}\n\ntemplate <typename... Args>\nvoid XELOGI(const char* format, const Args&... args) {\n  xe::logging::AppendLogLineFormat(\n      xe::LogLevel::Info, xe::logging::kPrefixCharInfo, format, args...);\n}\n\ntemplate <typename... Args>\nvoid XELOGD(const char* format, const Args&... args) {\n  xe::logging::AppendLogLineFormat(\n      xe::LogLevel::Debug, xe::logging::kPrefixCharDebug, format, args...);\n}\n\ntemplate <typename... Args>\nvoid XELOGCPU(const char* format, const Args&... args) {\n  xe::logging::AppendLogLineFormat(xe::LogLevel::Info, 'C', format, args...);\n}\n\ntemplate <typename... Args>\nvoid XELOGAPU(const char* format, const Args&... args) {\n  xe::logging::AppendLogLineFormat(xe::LogLevel::Info, 'A', format, args...);\n}\n\ntemplate <typename... Args>\nvoid XELOGGPU(const char* format, const Args&... args) {\n  xe::logging::AppendLogLineFormat(xe::LogLevel::Info, 'G', format, args...);\n}\n\ntemplate <typename... Args>\nvoid XELOGKERNEL(const char* format, const Args&... args) {\n  xe::logging::AppendLogLineFormat(xe::LogLevel::Info, 'K', format, args...);\n}\n\ntemplate <typename... Args>\nvoid XELOGFS(const char* format, const Args&... args) {\n  xe::logging::AppendLogLineFormat(xe::LogLevel::Info, 'F', format, args...);\n}\n\n#else\n\n#define __XELOGDUMMY \\\n  do {               \\\n  } while (false)\n\n#define XELOGE(...) __XELOGDUMMY\n#define XELOGW(...) __XELOGDUMMY\n#define XELOGI(...) __XELOGDUMMY\n#define XELOGD(...) __XELOGDUMMY\n#define XELOGCPU(...) __XELOGDUMMY\n#define XELOGAPU(...) __XELOGDUMMY\n#define XELOGGPU(...) __XELOGDUMMY\n#define XELOGKERNEL(...) __XELOGDUMMY\n#define XELOGFS(...) __XELOGDUMMY\n\n#endif  // ENABLE_LOGGING\n\n#endif  // XENIA_BASE_LOGGING_H_\n"
  },
  {
    "path": "src/xenia/base/main_android.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/main_android.h\"\n\n#include <android/log.h>\n#include <pthread.h>\n#include <cstddef>\n#include <cstdlib>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/cvar.h\"\n#include \"xenia/base/filesystem.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/memory.h\"\n#include \"xenia/base/system.h\"\n#include \"xenia/base/threading.h\"\n\nnamespace xe {\n\nstatic size_t android_initializations_ = 0;\n\nstatic int32_t android_api_level_ = __ANDROID_API__;\n\nstatic JNIEnv* android_main_thread_jni_env_ = nullptr;\nstatic JavaVM* android_java_vm_ = nullptr;\nstatic pthread_key_t android_thread_jni_env_key_;\nstatic jobject android_application_context_ = nullptr;\n\nstatic void AndroidThreadJNIEnvDestructor(void* jni_env_pointer) {\n  // The JNIEnv pointer for the main thread is taken externally, the lifetime of\n  // the attachment is not managed by the key.\n  JNIEnv* jni_env = static_cast<JNIEnv*>(jni_env_pointer);\n  if (jni_env && jni_env != android_main_thread_jni_env_) {\n    android_java_vm_->DetachCurrentThread();\n  }\n  // Multiple iterations of destructor invocations can be done - clear.\n  pthread_setspecific(android_thread_jni_env_key_, nullptr);\n}\n\nvoid InitializeAndroidAppFromMainThread(int32_t api_level,\n                                        JNIEnv* main_thread_jni_env,\n                                        jobject application_context,\n                                        jobject launch_arguments_bundle) {\n  if (android_initializations_++) {\n    // Already initialized for another component in the process.\n    return;\n  }\n\n  // Set the API level before everything else if available - may be needed by\n  // subsystem initialization itself.\n  android_api_level_ = api_level;\n\n  android_main_thread_jni_env_ = main_thread_jni_env;\n  if (main_thread_jni_env) {\n    // In a Java VM, not just in a process that runs an executable - set up\n    // the attachment of threads to the Java VM.\n    if (main_thread_jni_env->GetJavaVM(&android_java_vm_) < 0) {\n      // Logging has not been initialized yet.\n      __android_log_write(\n          ANDROID_LOG_ERROR, \"InitializeAndroidAppFromMainThread\",\n          \"Failed to get the Java VM from the JNI environment of the main \"\n          \"thread\");\n      std::abort();\n    }\n    if (pthread_key_create(&android_thread_jni_env_key_,\n                           AndroidThreadJNIEnvDestructor)) {\n      __android_log_write(\n          ANDROID_LOG_ERROR, \"InitializeAndroidAppFromMainThread\",\n          \"Failed to create the thread-specific JNI environment key\");\n      std::abort();\n    }\n    if (pthread_setspecific(android_thread_jni_env_key_, main_thread_jni_env)) {\n      __android_log_write(\n          ANDROID_LOG_ERROR, \"InitializeAndroidAppFromMainThread\",\n          \"Failed to set the thread-specific JNI environment pointer for the \"\n          \"main thread\");\n      std::abort();\n    }\n    if (application_context) {\n      android_application_context_ =\n          main_thread_jni_env->NewGlobalRef(application_context);\n      if (!android_application_context_) {\n        __android_log_write(\n            ANDROID_LOG_ERROR, \"InitializeAndroidAppFromMainThread\",\n            \"Failed to create a global reference to the application context \"\n            \"object\");\n        std::abort();\n      }\n    }\n  }\n\n  // Logging uses threading.\n  xe::threading::AndroidInitialize();\n\n  xe::filesystem::AndroidInitialize();\n\n  // Initialize the cvars before logging.\n  if (launch_arguments_bundle) {\n    cvar::ParseLaunchArgumentsFromAndroidBundle(launch_arguments_bundle);\n  }\n\n  // Multiple apps can be launched within one process - don't pass the actual\n  // app name.\n  xe::InitializeLogging(\"xenia\");\n\n  xe::memory::AndroidInitialize();\n\n  if (android_application_context_) {\n    if (!xe::InitializeAndroidSystemForApplicationContext()) {\n      __android_log_write(ANDROID_LOG_ERROR,\n                          \"InitializeAndroidAppFromMainThread\",\n                          \"Failed to initialize system UI interaction\");\n      std::abort();\n    }\n  }\n}\n\nvoid ShutdownAndroidAppFromMainThread() {\n  assert_not_zero(android_initializations_);\n  if (!android_initializations_) {\n    return;\n  }\n  if (--android_initializations_) {\n    // Other components are still running.\n    return;\n  }\n\n  xe::ShutdownAndroidSystem();\n\n  xe::memory::AndroidShutdown();\n\n  xe::ShutdownLogging();\n\n  xe::filesystem::AndroidShutdown();\n\n  xe::threading::AndroidShutdown();\n\n  if (android_application_context_) {\n    android_main_thread_jni_env_->DeleteGlobalRef(android_application_context_);\n    android_application_context_ = nullptr;\n  }\n  if (android_java_vm_) {\n    android_java_vm_ = nullptr;\n    pthread_key_delete(android_thread_jni_env_key_);\n  }\n  android_main_thread_jni_env_ = nullptr;\n\n  android_api_level_ = __ANDROID_API__;\n}\n\nint32_t GetAndroidApiLevel() { return android_api_level_; }\n\nJNIEnv* GetAndroidThreadJniEnv() {\n  if (!android_java_vm_) {\n    return nullptr;\n  }\n  return static_cast<JNIEnv*>(pthread_getspecific(android_thread_jni_env_key_));\n}\n\njobject GetAndroidApplicationContext() { return android_application_context_; }\n\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/base/main_android.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_BASE_MAIN_ANDROID_H_\n#define XENIA_BASE_MAIN_ANDROID_H_\n\n#include <jni.h>\n#include <cstdint>\n\n#include \"xenia/base/platform.h\"\n\nnamespace xe {\n\n// In activities, these functions must be called in onCreate and onDestroy.\n//\n// Multiple components may run in the same process, and they will be\n// instantiated in the main thread, which is, for regular applications (the\n// system application exception doesn't apply to Xenia), the UI thread.\n//\n// For this reason, it's okay to call these functions multiple times if\n// different Xenia windowed applications run in one process - there is call\n// counting internally.\n//\n// In standalone console apps built with $(BUILD_EXECUTABLE), these functions\n// must be called in `main`, with a null main thread JNI environment.\nvoid InitializeAndroidAppFromMainThread(int32_t api_level,\n                                        JNIEnv* main_thread_jni_env,\n                                        jobject application_context,\n                                        jobject launch_arguments_bundle);\nvoid ShutdownAndroidAppFromMainThread();\n\n// May be the minimum supported level if the initialization was done without a\n// configuration.\nint32_t GetAndroidApiLevel();\n\n// Useful notes about JNI usage on Android within Xenia:\n// - All static libraries defining JNI native functions must be linked to shared\n//   libraries via LOCAL_WHOLE_STATIC_LIBRARIES.\n// - If method or field IDs are cached, a global reference to the class needs to\n//   be held - it prevents the class from being unloaded by the class loaders\n//   (in a way that would make the IDs invalid when it's reloaded).\n// - GetStringUTFChars (UTF-8) returns null-terminated strings, GetStringChars\n//   (UTF-16) does not.\n\n// May return null if not in a Java VM process, or in case of a failure to\n// attach on a non-main thread.\nJNIEnv* GetAndroidThreadJniEnv();\n// Returns the global reference if in an application context, or null otherwise.\n// This is the application context, not the activity one, because multiple\n// activities may be running in one process.\njobject GetAndroidApplicationContext();\n\n}  // namespace xe\n\n#endif  // XENIA_BASE_MAIN_ANDROID_H_\n"
  },
  {
    "path": "src/xenia/base/main_init_android.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n// Nothing. Stub.\n"
  },
  {
    "path": "src/xenia/base/main_init_posix.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n// Nothing. Stub.\n"
  },
  {
    "path": "src/xenia/base/main_init_win.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/platform_win.h\"\n\n#include <cstdlib>\n\n// Includes Windows headers, so it goes after platform_win.h.\n#include \"third_party/xbyak/xbyak/xbyak_util.h\"\n\nclass StartupAvxCheck {\n public:\n  StartupAvxCheck() {\n    Xbyak::util::Cpu cpu;\n    if (cpu.has(Xbyak::util::Cpu::tAVX)) {\n      return;\n    }\n    // TODO(gibbed): detect app type and printf instead, if needed?\n    MessageBoxA(\n        nullptr,\n        \"Your CPU does not support AVX, which is required by Xenia. See the \"\n        \"FAQ for system requirements at https://xenia.jp\",\n        \"Xenia Error\", MB_OK | MB_ICONERROR | MB_SETFOREGROUND);\n    ExitProcess(static_cast<uint32_t>(-1));\n  }\n};\n\n// This is a hack to get an instance of StartupAvxCheck\n// constructed before any initialization code,\n// where the AVX check then happens in the constructor.\n//\n// https://docs.microsoft.com/en-us/cpp/preprocessor/init-seg\n#pragma warning(suppress : 4073)\n#pragma init_seg(lib)\nstatic StartupAvxCheck gStartupAvxCheck;\n"
  },
  {
    "path": "src/xenia/base/main_win.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include <malloc.h>\n#include <cstring>\n\n#include \"xenia/base/cvar.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/main_win.h\"\n#include \"xenia/base/platform_win.h\"\n#include \"xenia/base/string.h\"\n\n// Autogenerated by `xb premake`.\n#include \"build/version.h\"\n\n// For RequestWin32MMCSS.\n#include <dwmapi.h>\n// For RequestWin32HighResolutionTimer.\n#include <winternl.h>\n\nDEFINE_bool(win32_high_resolution_timer, true,\n            \"Requests high-resolution timer from the NT kernel\", \"Win32\");\nDEFINE_bool(\n    win32_mmcss, true,\n    \"Opt in the Multimedia Class Scheduler Service (MMCSS) scheduling for \"\n    \"prioritized access to CPU resources\",\n    \"Win32\");\n\nnamespace xe {\n\nstatic void RequestWin32HighResolutionTimer() {\n  HMODULE ntdll_module = GetModuleHandleW(L\"ntdll.dll\");\n  if (!ntdll_module) {\n    return;\n  }\n\n  // clang-format off\n  NTSTATUS (NTAPI* nt_query_timer_resolution)(OUT PULONG MinimumResolution,\n                                              OUT PULONG MaximumResolution,\n                                              OUT PULONG CurrentResolution);\n  NTSTATUS (NTAPI* nt_set_timer_resolution)(IN ULONG DesiredResolution,\n                                            IN BOOLEAN SetResolution,\n                                            OUT PULONG CurrentResolution);\n  // clang-format on\n  nt_query_timer_resolution =\n      reinterpret_cast<decltype(nt_query_timer_resolution)>(\n          GetProcAddress(ntdll_module, \"NtQueryTimerResolution\"));\n  nt_set_timer_resolution = reinterpret_cast<decltype(nt_set_timer_resolution)>(\n      GetProcAddress(ntdll_module, \"NtSetTimerResolution\"));\n  if (!nt_query_timer_resolution || !nt_set_timer_resolution) {\n    return;\n  }\n\n  ULONG minimum_resolution, maximum_resolution, current_resolution;\n  nt_query_timer_resolution(&minimum_resolution, &maximum_resolution,\n                            &current_resolution);\n  nt_set_timer_resolution(maximum_resolution, TRUE, &current_resolution);\n}\n\nstatic void RequestWin32MMCSS() {\n  HMODULE dwmapi_module = LoadLibraryW(L\"dwmapi.dll\");\n  if (!dwmapi_module) {\n    return;\n  }\n  // clang-format off\n  HRESULT (STDAPICALLTYPE* dwm_enable_mmcss)(BOOL fEnableMMCSS);\n  // clang-format on\n  dwm_enable_mmcss = reinterpret_cast<decltype(dwm_enable_mmcss)>(\n      GetProcAddress(dwmapi_module, \"DwmEnableMMCSS\"));\n  if (dwm_enable_mmcss) {\n    dwm_enable_mmcss(TRUE);\n  }\n  FreeLibrary(dwmapi_module);\n}\n\nbool ParseWin32LaunchArguments(\n    bool transparent_options, const std::string_view positional_usage,\n    const std::vector<std::string>& positional_options,\n    std::vector<std::string>* args_out) {\n  auto command_line = GetCommandLineW();\n\n  int wargc;\n  wchar_t** wargv = CommandLineToArgvW(command_line, &wargc);\n  if (!wargv) {\n    return false;\n  }\n\n  // Convert all args to narrow, as cxxopts doesn't support wchar.\n  int argc = wargc;\n  char** argv = reinterpret_cast<char**>(alloca(sizeof(char*) * argc));\n  for (int n = 0; n < argc; n++) {\n    size_t len = std::wcstombs(nullptr, wargv[n], 0);\n    argv[n] = reinterpret_cast<char*>(alloca(sizeof(char) * (len + 1)));\n    std::wcstombs(argv[n], wargv[n], len + 1);\n  }\n\n  LocalFree(wargv);\n\n  if (!transparent_options) {\n    cvar::ParseLaunchArguments(argc, argv, positional_usage,\n                               positional_options);\n  }\n\n  if (args_out) {\n    args_out->clear();\n    for (int n = 0; n < argc; n++) {\n      args_out->push_back(std::string(argv[n]));\n    }\n  }\n\n  return true;\n}\n\nint InitializeWin32App(const std::string_view app_name) {\n  // Initialize logging. Needs parsed FLAGS.\n  xe::InitializeLogging(app_name);\n\n  // Print version info.\n  XELOGI(\n      \"Build: \"\n#ifdef XE_BUILD_IS_PR\n      \"PR#\" XE_BUILD_PR_NUMBER \" \" XE_BUILD_PR_REPO \" \" XE_BUILD_PR_BRANCH\n      \"@\" XE_BUILD_PR_COMMIT_SHORT \" against \"\n#endif\n      XE_BUILD_BRANCH \"@\" XE_BUILD_COMMIT_SHORT \" on \" XE_BUILD_DATE);\n\n  // Request high-performance timing and scheduling.\n  if (cvars::win32_high_resolution_timer) {\n    RequestWin32HighResolutionTimer();\n  }\n  if (cvars::win32_mmcss) {\n    RequestWin32MMCSS();\n  }\n\n  return 0;\n}\n\nvoid ShutdownWin32App() { xe::ShutdownLogging(); }\n\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/base/main_win.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_BASE_MAIN_WIN_H_\n#define XENIA_BASE_MAIN_WIN_H_\n\n#include <string>\n#include <vector>\n\nnamespace xe {\n\n// Functions for calling in both windowed and console entry points.\nbool ParseWin32LaunchArguments(\n    bool transparent_options, const std::string_view positional_usage,\n    const std::vector<std::string>& positional_options,\n    std::vector<std::string>* args_out);\n// InitializeWin32App uses cvars, call ParseWin32LaunchArguments before.\nint InitializeWin32App(const std::string_view app_name);\nvoid ShutdownWin32App();\n\n}  // namespace xe\n\n#endif  // XENIA_BASE_MAIN_WIN_H_\n"
  },
  {
    "path": "src/xenia/base/mapped_memory.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_BASE_MAPPED_MEMORY_H_\n#define XENIA_BASE_MAPPED_MEMORY_H_\n\n#include <filesystem>\n#include <memory>\n#include <string_view>\n\n#include \"xenia/base/platform.h\"\n\nnamespace xe {\n\nclass MappedMemory {\n public:\n  enum class Mode {\n    kRead,\n    kReadWrite,\n  };\n\n  static std::unique_ptr<MappedMemory> Open(const std::filesystem::path& path,\n                                            Mode mode, size_t offset = 0,\n                                            size_t length = 0);\n#if XE_PLATFORM_ANDROID\n  static std::unique_ptr<MappedMemory> OpenForAndroidContentUri(\n      const std::string_view uri, Mode mode, size_t offset = 0,\n      size_t length = 0);\n#endif  // XE_PLATFORM_ANDROID\n\n  MappedMemory() : data_(nullptr), size_(0) {}\n  MappedMemory(void* data, size_t size) : data_(data), size_(size) {}\n  MappedMemory(const MappedMemory& mapped_memory) = delete;\n  MappedMemory& operator=(const MappedMemory& mapped_memory) = delete;\n  MappedMemory(MappedMemory&& mapped_memory) = delete;\n  MappedMemory& operator=(MappedMemory&& mapped_memory) = delete;\n  virtual ~MappedMemory() = default;\n\n  // The mapping is still backed by the object the slice was created from, a\n  // slice is not owning.\n  std::unique_ptr<MappedMemory> Slice(size_t offset, size_t length) {\n    return std::unique_ptr<MappedMemory>(\n        new MappedMemory(data() + offset, length));\n  }\n\n  uint8_t* data() const { return reinterpret_cast<uint8_t*>(data_); }\n  size_t size() const { return size_; }\n\n  // Close, and optionally truncate file to size\n  virtual void Close(uint64_t truncate_size = 0) {}\n  virtual void Flush() {}\n\n  // Changes the offset inside the file. This will update data() and size()!\n  virtual bool Remap(size_t offset, size_t length) { return false; }\n\n protected:\n  void* data_;\n  size_t size_;\n};\n\nclass ChunkedMappedMemoryWriter {\n public:\n  virtual ~ChunkedMappedMemoryWriter() = default;\n\n  static std::unique_ptr<ChunkedMappedMemoryWriter> Open(\n      const std::filesystem::path& path, size_t chunk_size,\n      bool low_address_space = false);\n\n  virtual uint8_t* Allocate(size_t length) = 0;\n  virtual void Flush() = 0;\n  virtual void FlushNew() = 0;\n\n protected:\n  ChunkedMappedMemoryWriter(const std::filesystem::path& path,\n                            size_t chunk_size, bool low_address_space)\n      : path_(path),\n        chunk_size_(chunk_size),\n        low_address_space_(low_address_space) {}\n\n  std::filesystem::path path_;\n  size_t chunk_size_;\n  bool low_address_space_;\n};\n\n}  // namespace xe\n\n#endif  // XENIA_BASE_MAPPED_MEMORY_H_\n"
  },
  {
    "path": "src/xenia/base/mapped_memory_posix.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/mapped_memory.h\"\n\n#include <fcntl.h>\n#include <sys/mman.h>\n#include <sys/stat.h>\n#include <unistd.h>\n#include <memory>\n\n#include \"xenia/base/filesystem.h\"\n#include \"xenia/base/platform.h\"\n\nnamespace xe {\n\nclass PosixMappedMemory : public MappedMemory {\n public:\n  PosixMappedMemory(void* data, size_t size, int file_descriptor)\n      : MappedMemory(data, size), file_descriptor_(file_descriptor) {}\n\n  ~PosixMappedMemory() override {\n    if (data_) {\n      munmap(data_, size());\n    }\n    if (file_descriptor_ >= 0) {\n      close(file_descriptor_);\n    }\n  }\n\n  static std::unique_ptr<PosixMappedMemory> WrapFileDescriptor(\n      int file_descriptor, Mode mode, size_t offset = 0, size_t length = 0) {\n    int protection = 0;\n    switch (mode) {\n      case Mode::kRead:\n        protection |= PROT_READ;\n        break;\n      case Mode::kReadWrite:\n        protection |= PROT_READ | PROT_WRITE;\n        break;\n    }\n\n    size_t map_length = length;\n    if (!length) {\n      struct stat64 file_stat;\n      if (fstat64(file_descriptor, &file_stat)) {\n        close(file_descriptor);\n        return nullptr;\n      }\n      map_length = size_t(file_stat.st_size);\n    }\n\n    void* data =\n        mmap(0, map_length, protection, MAP_SHARED, file_descriptor, offset);\n    if (!data) {\n      close(file_descriptor);\n      return nullptr;\n    }\n\n    return std::make_unique<PosixMappedMemory>(data, map_length,\n                                               file_descriptor);\n  }\n\n  void Close(uint64_t truncate_size) override {\n    if (data_) {\n      munmap(data_, size());\n      data_ = nullptr;\n    }\n    if (file_descriptor_ >= 0) {\n      if (truncate_size) {\n        ftruncate64(file_descriptor_, off64_t(truncate_size));\n      }\n      close(file_descriptor_);\n      file_descriptor_ = -1;\n    }\n  }\n\n  void Flush() override { msync(data(), size(), MS_ASYNC); }\n\n private:\n  int file_descriptor_;\n};\n\nstd::unique_ptr<MappedMemory> MappedMemory::Open(\n    const std::filesystem::path& path, Mode mode, size_t offset,\n    size_t length) {\n  int open_flags = 0;\n  switch (mode) {\n    case Mode::kRead:\n      open_flags |= O_RDONLY;\n      break;\n    case Mode::kReadWrite:\n      open_flags |= O_RDWR;\n      break;\n  }\n  int file_descriptor = open(path.c_str(), open_flags);\n  if (file_descriptor < 0) {\n    return nullptr;\n  }\n  return PosixMappedMemory::WrapFileDescriptor(file_descriptor, mode, offset,\n                                               length);\n}\n\n#if XE_PLATFORM_ANDROID\nstd::unique_ptr<MappedMemory> MappedMemory::OpenForAndroidContentUri(\n    const std::string_view uri, Mode mode, size_t offset, size_t length) {\n  const char* open_mode = nullptr;\n  switch (mode) {\n    case Mode::kRead:\n      open_mode = \"r\";\n      break;\n    case Mode::kReadWrite:\n      open_mode = \"rw\";\n      break;\n  }\n  int file_descriptor =\n      xe::filesystem::OpenAndroidContentFileDescriptor(uri, open_mode);\n  if (file_descriptor < 0) {\n    return nullptr;\n  }\n  return PosixMappedMemory::WrapFileDescriptor(file_descriptor, mode, offset,\n                                               length);\n}\n#endif  // XE_PLATFORM_ANDROID\n\nstd::unique_ptr<ChunkedMappedMemoryWriter> ChunkedMappedMemoryWriter::Open(\n    const std::filesystem::path& path, size_t chunk_size,\n    bool low_address_space) {\n  // TODO(DrChat)\n  return nullptr;\n}\n\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/base/mapped_memory_win.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include <memory>\n#include <mutex>\n#include <vector>\n\n#include \"third_party/fmt/include/fmt/format.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/mapped_memory.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/memory.h\"\n#include \"xenia/base/platform_win.h\"\n\n#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | \\\n                            WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES)\n#define XE_BASE_MAPPED_MEMORY_WIN_USE_DESKTOP_FUNCTIONS\n#endif\n\nnamespace xe {\n\nclass Win32MappedMemory : public MappedMemory {\n public:\n  // CreateFile returns INVALID_HANDLE_VALUE in case of failure.\n  static constexpr HANDLE kFileHandleInvalid = INVALID_HANDLE_VALUE;\n  // CreateFileMapping returns nullptr in case of failure.\n  static constexpr HANDLE kMappingHandleInvalid = nullptr;\n\n  ~Win32MappedMemory() override {\n    if (data_) {\n      UnmapViewOfFile(data_);\n    }\n    if (mapping_handle != kMappingHandleInvalid) {\n      CloseHandle(mapping_handle);\n    }\n    if (file_handle != kFileHandleInvalid) {\n      CloseHandle(file_handle);\n    }\n  }\n\n  void Close(uint64_t truncate_size) override {\n    if (data_) {\n      UnmapViewOfFile(data_);\n      data_ = nullptr;\n    }\n    if (mapping_handle != kMappingHandleInvalid) {\n      CloseHandle(mapping_handle);\n      mapping_handle = kMappingHandleInvalid;\n    }\n    if (file_handle != kFileHandleInvalid) {\n      if (truncate_size) {\n        LONG distance_high = truncate_size >> 32;\n        SetFilePointer(file_handle, truncate_size & 0xFFFFFFFF, &distance_high,\n                       FILE_BEGIN);\n        SetEndOfFile(file_handle);\n      }\n\n      CloseHandle(file_handle);\n      file_handle = kFileHandleInvalid;\n    }\n  }\n\n  void Flush() override { FlushViewOfFile(data(), size()); }\n  bool Remap(size_t offset, size_t length) override {\n    size_t aligned_offset = offset & ~(memory::allocation_granularity() - 1);\n    size_t aligned_length = length + (offset - aligned_offset);\n\n    UnmapViewOfFile(data_);\n#ifdef XE_BASE_MAPPED_MEMORY_WIN_USE_DESKTOP_FUNCTIONS\n    data_ = MapViewOfFile(mapping_handle, view_access_, aligned_offset >> 32,\n                          aligned_offset & 0xFFFFFFFF, aligned_length);\n#else\n    data_ = MapViewOfFileFromApp(mapping_handle, ULONG(view_access_),\n                                 ULONG64(aligned_offset), aligned_length);\n#endif\n    if (!data_) {\n      return false;\n    }\n\n    if (length) {\n      size_ = aligned_length;\n    } else {\n      DWORD length_high;\n      size_t map_length = GetFileSize(file_handle, &length_high);\n      map_length |= static_cast<uint64_t>(length_high) << 32;\n      size_ = map_length - aligned_offset;\n    }\n\n    return true;\n  }\n\n  HANDLE file_handle = kFileHandleInvalid;\n  HANDLE mapping_handle = kMappingHandleInvalid;\n  DWORD view_access_ = 0;\n};\n\nstd::unique_ptr<MappedMemory> MappedMemory::Open(\n    const std::filesystem::path& path, Mode mode, size_t offset,\n    size_t length) {\n  DWORD file_access = 0;\n  DWORD file_share = 0;\n  DWORD create_mode = 0;\n  DWORD mapping_protect = 0;\n  DWORD view_access = 0;\n  switch (mode) {\n    case Mode::kRead:\n      file_access |= GENERIC_READ;\n      file_share |= FILE_SHARE_READ;\n      create_mode |= OPEN_EXISTING;\n      mapping_protect |= PAGE_READONLY;\n      view_access |= FILE_MAP_READ;\n      break;\n    case Mode::kReadWrite:\n      file_access |= GENERIC_READ | GENERIC_WRITE;\n      file_share |= 0;\n      create_mode |= OPEN_EXISTING;\n      mapping_protect |= PAGE_READWRITE;\n      view_access |= FILE_MAP_READ | FILE_MAP_WRITE;\n      break;\n  }\n\n  SYSTEM_INFO system_info;\n  GetSystemInfo(&system_info);\n\n  const size_t aligned_offset =\n      offset & ~static_cast<size_t>(system_info.dwAllocationGranularity - 1);\n  const size_t aligned_length = length + (offset - aligned_offset);\n\n  auto mm = std::make_unique<Win32MappedMemory>();\n  mm->view_access_ = view_access;\n\n  mm->file_handle = CreateFile(path.c_str(), file_access, file_share, nullptr,\n                               create_mode, FILE_ATTRIBUTE_NORMAL, nullptr);\n  if (mm->file_handle == Win32MappedMemory::kFileHandleInvalid) {\n    return nullptr;\n  }\n\n#ifdef XE_BASE_MAPPED_MEMORY_WIN_USE_DESKTOP_FUNCTIONS\n  mm->mapping_handle = CreateFileMapping(\n      mm->file_handle, nullptr, mapping_protect, DWORD(aligned_length >> 32),\n      DWORD(aligned_length), nullptr);\n#else\n  mm->mapping_handle =\n      CreateFileMappingFromApp(mm->file_handle, nullptr, ULONG(mapping_protect),\n                               ULONG64(aligned_length), nullptr);\n#endif\n  if (mm->mapping_handle == Win32MappedMemory::kMappingHandleInvalid) {\n    return nullptr;\n  }\n\n#ifdef XE_BASE_MAPPED_MEMORY_WIN_USE_DESKTOP_FUNCTIONS\n  mm->data_ = reinterpret_cast<uint8_t*>(MapViewOfFile(\n      mm->mapping_handle, view_access, DWORD(aligned_offset >> 32),\n      DWORD(aligned_offset), aligned_length));\n#else\n  mm->data_ = reinterpret_cast<uint8_t*>(\n      MapViewOfFileFromApp(mm->mapping_handle, ULONG(view_access),\n                           ULONG64(aligned_offset), aligned_length));\n#endif\n  if (!mm->data_) {\n    return nullptr;\n  }\n\n  if (length) {\n    mm->size_ = aligned_length;\n  } else {\n    DWORD length_high;\n    size_t map_length = GetFileSize(mm->file_handle, &length_high);\n    map_length |= static_cast<uint64_t>(length_high) << 32;\n    mm->size_ = map_length - aligned_offset;\n  }\n\n  return std::move(mm);\n}\n\nclass Win32ChunkedMappedMemoryWriter : public ChunkedMappedMemoryWriter {\n public:\n  Win32ChunkedMappedMemoryWriter(const std::filesystem::path& path,\n                                 size_t chunk_size, bool low_address_space)\n      : ChunkedMappedMemoryWriter(path, chunk_size, low_address_space) {}\n\n  ~Win32ChunkedMappedMemoryWriter() override {\n    std::lock_guard<std::mutex> lock(mutex_);\n    chunks_.clear();\n  }\n\n  uint8_t* Allocate(size_t length) override {\n    std::lock_guard<std::mutex> lock(mutex_);\n    if (!chunks_.empty()) {\n      uint8_t* result = chunks_.back()->Allocate(length);\n      if (result != nullptr) {\n        return result;\n      }\n    }\n    auto chunk = std::make_unique<Chunk>(chunk_size_);\n    auto chunk_path =\n        path_.replace_extension(fmt::format(\".{}\", chunks_.size()));\n    if (!chunk->Open(chunk_path, low_address_space_)) {\n      return nullptr;\n    }\n    uint8_t* result = chunk->Allocate(length);\n    chunks_.push_back(std::move(chunk));\n    return result;\n  }\n\n  void Flush() override {\n    std::lock_guard<std::mutex> lock(mutex_);\n    for (auto& chunk : chunks_) {\n      chunk->Flush();\n    }\n  }\n\n  void FlushNew() override {\n    std::lock_guard<std::mutex> lock(mutex_);\n    for (auto& chunk : chunks_) {\n      chunk->FlushNew();\n    }\n  }\n\n private:\n  class Chunk {\n   public:\n    explicit Chunk(size_t capacity)\n        : file_handle_(Win32MappedMemory::kFileHandleInvalid),\n          mapping_handle_(Win32MappedMemory::kMappingHandleInvalid),\n          data_(nullptr),\n          offset_(0),\n          capacity_(capacity),\n          last_flush_offset_(0) {}\n\n    ~Chunk() {\n      if (data_) {\n        UnmapViewOfFile(data_);\n      }\n      if (mapping_handle_ != Win32MappedMemory::kMappingHandleInvalid) {\n        CloseHandle(mapping_handle_);\n      }\n      if (file_handle_ != Win32MappedMemory::kFileHandleInvalid) {\n        CloseHandle(file_handle_);\n      }\n    }\n\n    bool Open(const std::filesystem::path& path, bool low_address_space) {\n      DWORD file_access = GENERIC_READ | GENERIC_WRITE;\n      DWORD file_share = FILE_SHARE_READ;\n      DWORD create_mode = CREATE_ALWAYS;\n      DWORD mapping_protect = PAGE_READWRITE;\n      DWORD view_access = FILE_MAP_READ | FILE_MAP_WRITE;\n\n      file_handle_ = CreateFile(path.c_str(), file_access, file_share, nullptr,\n                                create_mode, FILE_ATTRIBUTE_NORMAL, nullptr);\n      if (file_handle_ == Win32MappedMemory::kFileHandleInvalid) {\n        return false;\n      }\n\n#ifdef XE_BASE_MAPPED_MEMORY_WIN_USE_DESKTOP_FUNCTIONS\n      mapping_handle_ =\n          CreateFileMapping(file_handle_, nullptr, mapping_protect,\n                            DWORD(capacity_ >> 32), DWORD(capacity_), nullptr);\n#else\n      mapping_handle_ = CreateFileMappingFromApp(file_handle_, nullptr,\n                                                 ULONG(mapping_protect),\n                                                 ULONG64(capacity_), nullptr);\n#endif\n      if (mapping_handle_ == Win32MappedMemory::kMappingHandleInvalid) {\n        return false;\n      }\n\n      // If specified, ensure the allocation occurs in the lower 32-bit address\n      // space.\n      if (low_address_space) {\n        bool successful = false;\n        data_ = reinterpret_cast<uint8_t*>(0x10000000);\n#ifndef XE_BASE_MAPPED_MEMORY_WIN_USE_DESKTOP_FUNCTIONS\n        HANDLE process = GetCurrentProcess();\n#endif\n        for (int i = 0; i < 1000; ++i) {\n#ifdef XE_BASE_MAPPED_MEMORY_WIN_USE_DESKTOP_FUNCTIONS\n          if (MapViewOfFileEx(mapping_handle_, view_access, 0, 0, capacity_,\n                              data_)) {\n            successful = true;\n          }\n#else\n          // VirtualAlloc2FromApp and MapViewOfFile3FromApp were added in\n          // 10.0.17134.0.\n          // https://docs.microsoft.com/en-us/uwp/win32-and-com/win32-apis\n          if (VirtualAlloc2FromApp(process, data_, capacity_,\n                                   MEM_RESERVE | MEM_RESERVE_PLACEHOLDER,\n                                   PAGE_NOACCESS, nullptr, 0)) {\n            if (MapViewOfFile3FromApp(mapping_handle_, process, data_, 0,\n                                      capacity_, MEM_REPLACE_PLACEHOLDER,\n                                      ULONG(mapping_protect), nullptr, 0)) {\n              successful = true;\n            } else {\n              VirtualFree(data_, capacity_, MEM_RELEASE);\n            }\n          }\n#endif\n          if (successful) {\n            break;\n          }\n          data_ += capacity_;\n          if (!successful) {\n            XELOGE(\"Unable to find space for mapping\");\n            data_ = nullptr;\n            return false;\n          }\n        }\n      } else {\n#ifdef XE_BASE_MAPPED_MEMORY_WIN_USE_DESKTOP_FUNCTIONS\n        data_ = reinterpret_cast<uint8_t*>(\n            MapViewOfFile(mapping_handle_, view_access, 0, 0, capacity_));\n#else\n        data_ = reinterpret_cast<uint8_t*>(MapViewOfFileFromApp(\n            mapping_handle_, ULONG(view_access), 0, capacity_));\n#endif\n      }\n      if (!data_) {\n        return false;\n      }\n\n      return true;\n    }\n\n    uint8_t* Allocate(size_t length) {\n      if (capacity_ - offset_ < length) {\n        return nullptr;\n      }\n      uint8_t* result = data_ + offset_;\n      offset_ += length;\n      return result;\n    }\n\n    void Flush() { FlushViewOfFile(data_, offset_); }\n\n    void FlushNew() {\n      FlushViewOfFile(data_ + last_flush_offset_, offset_ - last_flush_offset_);\n      last_flush_offset_ = offset_;\n    }\n\n   private:\n    HANDLE file_handle_;\n    HANDLE mapping_handle_;\n    uint8_t* data_;\n    size_t offset_;\n    size_t capacity_;\n    size_t last_flush_offset_;\n  };\n\n  std::mutex mutex_;\n  std::vector<std::unique_ptr<Chunk>> chunks_;\n};\n\nstd::unique_ptr<ChunkedMappedMemoryWriter> ChunkedMappedMemoryWriter::Open(\n    const std::filesystem::path& path, size_t chunk_size,\n    bool low_address_space) {\n  SYSTEM_INFO system_info;\n  GetSystemInfo(&system_info);\n  size_t aligned_chunk_size =\n      xe::round_up(chunk_size, system_info.dwAllocationGranularity);\n  return std::make_unique<Win32ChunkedMappedMemoryWriter>(\n      path, aligned_chunk_size, low_address_space);\n}\n\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/base/math.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2019 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_BASE_MATH_H_\n#define XENIA_BASE_MATH_H_\n\n#include <algorithm>\n#include <cmath>\n#include <cstdint>\n#include <cstring>\n#include <limits>\n#include <numeric>\n#include <type_traits>\n\n#if defined __has_include\n#if __has_include(<version>)\n#include <version>\n#endif\n#endif\n#if __cpp_lib_bitops\n#include <bit>\n#endif\n\n#include \"xenia/base/platform.h\"\n\n#if XE_ARCH_AMD64\n#include <xmmintrin.h>\n#endif\n\nnamespace xe {\n\ntemplate <typename T, size_t N>\nconstexpr size_t countof(T (&arr)[N]) {\n  return std::extent<T[N]>::value;\n}\n\ntemplate <typename T>\nconstexpr bool is_pow2(T value) {\n  return (value & (value - 1)) == 0;\n}\n\n// Rounds up the given value to the given alignment.\ntemplate <typename T>\nconstexpr T align(T value, T alignment) {\n  return (value + alignment - 1) & ~(alignment - 1);\n}\n\n// Rounds the given number up to the next highest multiple.\ntemplate <typename T, typename V>\nconstexpr T round_up(T value, V multiple, bool force_non_zero = true) {\n  if (force_non_zero && !value) {\n    return multiple;\n  }\n  return (value + multiple - 1) / multiple * multiple;\n}\n\n// For NaN, returns min_value (or, if it's NaN too, max_value).\n// If either of the boundaries is zero, and if the value is at that boundary or\n// exceeds it, the result will have the sign of that boundary. If both\n// boundaries are zero, which sign is selected among the argument signs is not\n// explicitly defined.\ntemplate <typename T>\nT clamp_float(T value, T min_value, T max_value) {\n  float clamped_to_min = std::isgreater(value, min_value) ? value : min_value;\n  return std::isless(clamped_to_min, max_value) ? clamped_to_min : max_value;\n}\n\n// Using the same conventions as in shading languages, returning 0 for NaN.\n// 0 is always returned as positive.\ntemplate <typename T>\nT saturate(T value) {\n  return clamp_float(value, static_cast<T>(0.0f), static_cast<T>(1.0f));\n}\n\n// Gets the next power of two value that is greater than or equal to the given\n// value.\ntemplate <typename T>\nT next_pow2(T value) {\n  value--;\n  value |= value >> 1;\n  value |= value >> 2;\n  value |= value >> 4;\n  value |= value >> 8;\n  value |= value >> 16;\n  value++;\n  return value;\n}\n\n#if __cpp_lib_gcd_lcm\ntemplate <typename T>\nconstexpr T greatest_common_divisor(T a, T b) {\n  return std::gcd(a, b);\n}\n#else\ntemplate <typename T>\nconstexpr T greatest_common_divisor(T a, T b) {\n  // Use the Euclid algorithm to calculate the greatest common divisor\n  while (b) {\n    a = std::exchange(b, a % b);\n  }\n  return a;\n}\n#endif\n\ntemplate <typename T>\nconstexpr void reduce_fraction(T& numerator, T& denominator) {\n  auto gcd = greatest_common_divisor(numerator, denominator);\n  numerator /= gcd;\n  denominator /= gcd;\n}\n\ntemplate <typename T>\nconstexpr void reduce_fraction(std::pair<T, T>& fraction) {\n  reduce_fraction<T>(fraction.first, fraction.second);\n}\n\nconstexpr uint32_t make_bitmask(uint32_t a, uint32_t b) {\n  return (static_cast<uint32_t>(-1) >> (31 - b)) & ~((1u << a) - 1);\n}\n\nconstexpr uint32_t select_bits(uint32_t value, uint32_t a, uint32_t b) {\n  return (value & make_bitmask(a, b)) >> a;\n}\n\n#if __cpp_lib_bitops\ntemplate <class T>\nconstexpr inline uint32_t bit_count(T v) {\n  return static_cast<uint32_t>(std::popcount(v));\n}\n#else\n#if XE_COMPILER_MSVC || XE_COMPILER_INTEL\ninline uint32_t bit_count(uint32_t v) { return __popcnt(v); }\ninline uint32_t bit_count(uint64_t v) {\n  return static_cast<uint32_t>(__popcnt64(v));\n}\n#elif XE_COMPILER_GCC || XE_COMPILER_CLANG\nstatic_assert(sizeof(unsigned int) == sizeof(uint32_t));\nstatic_assert(sizeof(unsigned long long) == sizeof(uint64_t));\ninline uint32_t bit_count(uint32_t v) { return __builtin_popcount(v); }\ninline uint32_t bit_count(uint64_t v) { return __builtin_popcountll(v); }\n#else\ninline uint32_t bit_count(uint32_t v) {\n  v = v - ((v >> 1) & 0x55555555);\n  v = (v & 0x33333333) + ((v >> 2) & 0x33333333);\n  return ((v + (v >> 4) & 0xF0F0F0F) * 0x1010101) >> 24;\n}\n\ninline uint32_t bit_count(uint64_t v) {\n  v = (v & 0x5555555555555555LU) + (v >> 1 & 0x5555555555555555LU);\n  v = (v & 0x3333333333333333LU) + (v >> 2 & 0x3333333333333333LU);\n  v = v + (v >> 4) & 0x0F0F0F0F0F0F0F0FLU;\n  v = v + (v >> 8);\n  v = v + (v >> 16);\n  v = v + (v >> 32) & 0x0000007F;\n  return static_cast<uint32_t>(v);\n}\n#endif\n#endif\n\n// lzcnt instruction, typed for integers of all sizes.\n// The number of leading zero bits in the value parameter. If value is zero, the\n// return value is the size of the input operand (8, 16, 32, or 64). If the most\n// significant bit of value is one, the return value is zero.\n#if XE_PLATFORM_WIN32\n// TODO(benvanik): runtime magic so these point to an appropriate implementation\n// at runtime based on CPU features\n#if 0\ninline uint8_t lzcnt(uint8_t v) {\n  return static_cast<uint8_t>(__lzcnt16(v) - 8);\n}\ninline uint8_t lzcnt(uint16_t v) { return static_cast<uint8_t>(__lzcnt16(v)); }\ninline uint8_t lzcnt(uint32_t v) { return static_cast<uint8_t>(__lzcnt(v)); }\ninline uint8_t lzcnt(uint64_t v) { return static_cast<uint8_t>(__lzcnt64(v)); }\n#else\ninline uint8_t lzcnt(uint8_t v) {\n  unsigned long index;\n  unsigned long mask = v;\n  unsigned char is_nonzero = _BitScanReverse(&index, mask);\n  return static_cast<uint8_t>(is_nonzero ? int8_t(index) ^ 0x7 : 8);\n}\ninline uint8_t lzcnt(uint16_t v) {\n  unsigned long index;\n  unsigned long mask = v;\n  unsigned char is_nonzero = _BitScanReverse(&index, mask);\n  return static_cast<uint8_t>(is_nonzero ? int8_t(index) ^ 0xF : 16);\n}\ninline uint8_t lzcnt(uint32_t v) {\n  unsigned long index;\n  unsigned long mask = v;\n  unsigned char is_nonzero = _BitScanReverse(&index, mask);\n  return static_cast<uint8_t>(is_nonzero ? int8_t(index) ^ 0x1F : 32);\n}\ninline uint8_t lzcnt(uint64_t v) {\n  unsigned long index;\n  unsigned long long mask = v;\n  unsigned char is_nonzero = _BitScanReverse64(&index, mask);\n  return static_cast<uint8_t>(is_nonzero ? int8_t(index) ^ 0x3F : 64);\n}\n#endif  // LZCNT supported\n\ninline uint8_t tzcnt(uint8_t v) {\n  unsigned long index;\n  unsigned long mask = v;\n  unsigned char is_nonzero = _BitScanForward(&index, mask);\n  return static_cast<uint8_t>(is_nonzero ? int8_t(index) : 8);\n}\n\ninline uint8_t tzcnt(uint16_t v) {\n  unsigned long index;\n  unsigned long mask = v;\n  unsigned char is_nonzero = _BitScanForward(&index, mask);\n  return static_cast<uint8_t>(is_nonzero ? int8_t(index) : 16);\n}\n\ninline uint8_t tzcnt(uint32_t v) {\n  unsigned long index;\n  unsigned long mask = v;\n  unsigned char is_nonzero = _BitScanForward(&index, mask);\n  return static_cast<uint8_t>(is_nonzero ? int8_t(index) : 32);\n}\n\ninline uint8_t tzcnt(uint64_t v) {\n  unsigned long index;\n  unsigned long long mask = v;\n  unsigned char is_nonzero = _BitScanForward64(&index, mask);\n  return static_cast<uint8_t>(is_nonzero ? int8_t(index) : 64);\n}\n\n#else  // XE_PLATFORM_WIN32\ninline uint8_t lzcnt(uint8_t v) {\n  return v == 0 ? 8 : static_cast<uint8_t>(__builtin_clz(v) - 24);\n}\ninline uint8_t lzcnt(uint16_t v) {\n  return v == 0 ? 16 : static_cast<uint8_t>(__builtin_clz(v) - 16);\n}\ninline uint8_t lzcnt(uint32_t v) {\n  return v == 0 ? 32 : static_cast<uint8_t>(__builtin_clz(v));\n}\ninline uint8_t lzcnt(uint64_t v) {\n  return v == 0 ? 64 : static_cast<uint8_t>(__builtin_clzll(v));\n}\n\ninline uint8_t tzcnt(uint8_t v) {\n  return v == 0 ? 8 : static_cast<uint8_t>(__builtin_ctz(v));\n}\ninline uint8_t tzcnt(uint16_t v) {\n  return v == 0 ? 16 : static_cast<uint8_t>(__builtin_ctz(v));\n}\ninline uint8_t tzcnt(uint32_t v) {\n  return v == 0 ? 32 : static_cast<uint8_t>(__builtin_ctz(v));\n}\ninline uint8_t tzcnt(uint64_t v) {\n  return v == 0 ? 64 : static_cast<uint8_t>(__builtin_ctzll(v));\n}\n#endif\ninline uint8_t lzcnt(int8_t v) { return lzcnt(static_cast<uint8_t>(v)); }\ninline uint8_t lzcnt(int16_t v) { return lzcnt(static_cast<uint16_t>(v)); }\ninline uint8_t lzcnt(int32_t v) { return lzcnt(static_cast<uint32_t>(v)); }\ninline uint8_t lzcnt(int64_t v) { return lzcnt(static_cast<uint64_t>(v)); }\ninline uint8_t tzcnt(int8_t v) { return tzcnt(static_cast<uint8_t>(v)); }\ninline uint8_t tzcnt(int16_t v) { return tzcnt(static_cast<uint16_t>(v)); }\ninline uint8_t tzcnt(int32_t v) { return tzcnt(static_cast<uint32_t>(v)); }\ninline uint8_t tzcnt(int64_t v) { return tzcnt(static_cast<uint64_t>(v)); }\n\n// BitScanForward (bsf).\n// Search the value from least significant bit (LSB) to the most significant bit\n// (MSB) for a set bit (1).\n// Returns false if no bits are set and the output index is invalid.\n#if XE_PLATFORM_WIN32\ninline bool bit_scan_forward(uint32_t v, uint32_t* out_first_set_index) {\n  return _BitScanForward(reinterpret_cast<unsigned long*>(out_first_set_index),\n                         v) != 0;\n}\ninline bool bit_scan_forward(uint64_t v, uint32_t* out_first_set_index) {\n  return _BitScanForward64(\n             reinterpret_cast<unsigned long*>(out_first_set_index), v) != 0;\n}\n#else\ninline bool bit_scan_forward(uint32_t v, uint32_t* out_first_set_index) {\n  int i = ffs(v);\n  *out_first_set_index = i - 1;\n  return i != 0;\n}\ninline bool bit_scan_forward(uint64_t v, uint32_t* out_first_set_index) {\n  int i = __builtin_ffsll(v);\n  *out_first_set_index = i - 1;\n  return i != 0;\n}\n#endif  // XE_PLATFORM_WIN32\ninline bool bit_scan_forward(int32_t v, uint32_t* out_first_set_index) {\n  return bit_scan_forward(static_cast<uint32_t>(v), out_first_set_index);\n}\ninline bool bit_scan_forward(int64_t v, uint32_t* out_first_set_index) {\n  return bit_scan_forward(static_cast<uint64_t>(v), out_first_set_index);\n}\n\ntemplate <typename T>\ninline T log2_floor(T v) {\n  return sizeof(T) * 8 - 1 - lzcnt(v);\n}\ntemplate <typename T>\ninline T log2_ceil(T v) {\n  return sizeof(T) * 8 - lzcnt(v - 1);\n}\n\ntemplate <typename T>\ninline T rotate_left(T v, uint8_t sh) {\n  return (T(v) << sh) | (T(v) >> ((sizeof(T) * 8) - sh));\n}\n#if XE_PLATFORM_WIN32\ntemplate <>\ninline uint8_t rotate_left(uint8_t v, uint8_t sh) {\n  return _rotl8(v, sh);\n}\ntemplate <>\ninline uint16_t rotate_left(uint16_t v, uint8_t sh) {\n  return _rotl16(v, sh);\n}\ntemplate <>\ninline uint32_t rotate_left(uint32_t v, uint8_t sh) {\n  return _rotl(v, sh);\n}\ntemplate <>\ninline uint64_t rotate_left(uint64_t v, uint8_t sh) {\n  return _rotl64(v, sh);\n}\n#endif  // XE_PLATFORM_WIN32\n\n#if XE_ARCH_AMD64\n// Utilities for SSE values.\ntemplate <int N>\nfloat m128_f32(const __m128& v) {\n  float ret;\n  _mm_store_ss(&ret, _mm_shuffle_ps(v, v, _MM_SHUFFLE(N, N, N, N)));\n  return ret;\n}\ntemplate <int N>\nint32_t m128_i32(const __m128& v) {\n  union {\n    float f;\n    int32_t i;\n  } ret;\n  _mm_store_ss(&ret.f, _mm_shuffle_ps(v, v, _MM_SHUFFLE(N, N, N, N)));\n  return ret.i;\n}\ntemplate <int N>\ndouble m128_f64(const __m128d& v) {\n  double ret;\n  _mm_store_sd(&ret, _mm_shuffle_pd(v, v, _MM_SHUFFLE2(N, N)));\n  return ret;\n}\ntemplate <int N>\ndouble m128_f64(const __m128& v) {\n  return m128_f64<N>(_mm_castps_pd(v));\n}\ntemplate <int N>\nint64_t m128_i64(const __m128d& v) {\n  union {\n    double f;\n    int64_t i;\n  } ret;\n  _mm_store_sd(&ret.f, _mm_shuffle_pd(v, v, _MM_SHUFFLE2(N, N)));\n  return ret.i;\n}\ntemplate <int N>\nint64_t m128_i64(const __m128& v) {\n  return m128_i64<N>(_mm_castps_pd(v));\n}\n#endif\n\n// Similar to the C++ implementation of XMConvertFloatToHalf and\n// XMConvertHalfToFloat from DirectXMath 3.00 (pre-3.04, which switched from the\n// Xenos encoding to IEEE 754), with the extended range instead of infinity and\n// NaN, and optionally with denormalized numbers - as used in vpkd3d128 (no\n// denormals, rounding towards zero) and on the Xenos (GL_OES_texture_float\n// alternative encoding).\n\ninline uint16_t float_to_xenos_half(float value, bool preserve_denormal = false,\n                                    bool round_to_nearest_even = false) {\n  uint32_t integer_value = *reinterpret_cast<const uint32_t*>(&value);\n  uint32_t abs_value = integer_value & 0x7FFFFFFFu;\n  uint32_t result;\n  if (abs_value >= 0x47FFE000u) {\n    // Saturate.\n    result = 0x7FFFu;\n  } else {\n    if (abs_value < 0x38800000u) {\n      // The number is too small to be represented as a normalized half.\n      if (preserve_denormal) {\n        uint32_t shift =\n            std::min(uint32_t(113u - (abs_value >> 23u)), uint32_t(24u));\n        result = (0x800000u | (abs_value & 0x7FFFFFu)) >> shift;\n      } else {\n        result = 0u;\n      }\n    } else {\n      // Rebias the exponent to represent the value as a normalized half.\n      result = abs_value + 0xC8000000u;\n    }\n    if (round_to_nearest_even) {\n      result += 0xFFFu + ((result >> 13u) & 1u);\n    }\n    result = (result >> 13u) & 0x7FFFu;\n  }\n  return uint16_t(result | ((integer_value & 0x80000000u) >> 16u));\n}\n\ninline float xenos_half_to_float(uint16_t value,\n                                 bool preserve_denormal = false) {\n  uint32_t mantissa = value & 0x3FFu;\n  uint32_t exponent = (value >> 10u) & 0x1Fu;\n  if (!exponent) {\n    if (!preserve_denormal) {\n      mantissa = 0;\n    } else if (mantissa) {\n      // Normalize the value in the resulting float.\n      // do { Exponent--; Mantissa <<= 1; } while ((Mantissa & 0x0400) == 0)\n      uint32_t mantissa_lzcnt = xe::lzcnt(mantissa) - (32u - 11u);\n      exponent = uint32_t(1 - int32_t(mantissa_lzcnt));\n      mantissa = (mantissa << mantissa_lzcnt) & 0x3FFu;\n    }\n    if (!mantissa) {\n      exponent = uint32_t(-112);\n    }\n  }\n  uint32_t result = (uint32_t(value & 0x8000u) << 16u) |\n                    ((exponent + 112u) << 23u) | (mantissa << 13u);\n  return *reinterpret_cast<const float*>(&result);\n}\n\n// https://locklessinc.com/articles/sat_arithmetic/\ntemplate <typename T>\ninline T sat_add(T a, T b) {\n  using TU = typename std::make_unsigned<T>::type;\n  TU result = TU(a) + TU(b);\n  if (std::is_unsigned<T>::value) {\n    result |=\n        TU(-static_cast<typename std::make_signed<T>::type>(result < TU(a)));\n  } else {\n    TU overflowed =\n        (TU(a) >> (sizeof(T) * 8 - 1)) + std::numeric_limits<T>::max();\n    if (T((overflowed ^ TU(b)) | ~(TU(b) ^ result)) >= 0) {\n      result = overflowed;\n    }\n  }\n  return T(result);\n}\ntemplate <typename T>\ninline T sat_sub(T a, T b) {\n  using TU = typename std::make_unsigned<T>::type;\n  TU result = TU(a) - TU(b);\n  if (std::is_unsigned<T>::value) {\n    result &=\n        TU(-static_cast<typename std::make_signed<T>::type>(result <= TU(a)));\n  } else {\n    TU overflowed =\n        (TU(a) >> (sizeof(T) * 8 - 1)) + std::numeric_limits<T>::max();\n    if (T((overflowed ^ TU(b)) & (overflowed ^ result)) < 0) {\n      result = overflowed;\n    }\n  }\n  return T(result);\n}\n\n}  // namespace xe\n\n#endif  // XENIA_BASE_MATH_H_\n"
  },
  {
    "path": "src/xenia/base/memory.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/memory.h\"\n#include \"xenia/base/cvar.h\"\n#include \"xenia/base/platform.h\"\n\n#if XE_ARCH_ARM64\n#include <arm_neon.h>\n#endif\n\n#include <algorithm>\n\nDEFINE_bool(\n    writable_executable_memory, true,\n    \"Allow mapping memory with both write and execute access, for simulating \"\n    \"behavior on platforms where that's not supported\",\n    \"Memory\");\n\nnamespace xe {\nnamespace memory {\n\nbool IsWritableExecutableMemoryPreferred() {\n  return IsWritableExecutableMemorySupported() &&\n         cvars::writable_executable_memory;\n}\n\n}  // namespace memory\n\n// TODO(benvanik): fancy AVX versions.\n// https://github.com/gnuradio/volk/blob/master/kernels/volk/volk_16u_byteswap.h\n// https://github.com/gnuradio/volk/blob/master/kernels/volk/volk_32u_byteswap.h\n// https://github.com/gnuradio/volk/blob/master/kernels/volk/volk_64u_byteswap.h\n// Original links:\n// https://gnuradio.org/redmine/projects/gnuradio/repository/revisions/cb32b70b79f430456208a2cd521d028e0ece5d5b/entry/volk/kernels/volk/volk_16u_byteswap.h\n// https://gnuradio.org/redmine/projects/gnuradio/repository/revisions/f2bc76cc65ffba51a141950f98e75364e49df874/entry/volk/kernels/volk/volk_32u_byteswap.h\n// https://gnuradio.org/redmine/projects/gnuradio/repository/revisions/2c4c371885c31222362f70a1cd714415d1398021/entry/volk/kernels/volk/volk_64u_byteswap.h\n\nvoid copy_128_aligned(void* dest, const void* src, size_t count) {\n  std::memcpy(dest, src, count * 16);\n}\n\n#if XE_ARCH_AMD64\n\n// This works around a GCC bug\n// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100801\n// TODO(Joel Linn): Remove this when fixed GCC versions are common place.\n#if XE_COMPILER_GNUC\n#define XE_WORKAROUND_CONSTANT_RETURN_IF(x) \\\n  if (__builtin_constant_p(x) && (x)) return;\n#else\n#define XE_WORKAROUND_CONSTANT_RETURN_IF(x)\n#endif\nvoid copy_and_swap_16_aligned(void* dest_ptr, const void* src_ptr,\n                              size_t count) {\n  assert_zero(reinterpret_cast<uintptr_t>(dest_ptr) & 0xF);\n  assert_zero(reinterpret_cast<uintptr_t>(src_ptr) & 0xF);\n\n  auto dest = reinterpret_cast<uint16_t*>(dest_ptr);\n  auto src = reinterpret_cast<const uint16_t*>(src_ptr);\n  __m128i shufmask =\n      _mm_set_epi8(0x0E, 0x0F, 0x0C, 0x0D, 0x0A, 0x0B, 0x08, 0x09, 0x06, 0x07,\n                   0x04, 0x05, 0x02, 0x03, 0x00, 0x01);\n\n  size_t i = 0;\n  for (i = 0; i + 8 <= count; i += 8) {\n    __m128i input = _mm_load_si128(reinterpret_cast<const __m128i*>(&src[i]));\n    __m128i output = _mm_shuffle_epi8(input, shufmask);\n    _mm_store_si128(reinterpret_cast<__m128i*>(&dest[i]), output);\n  }\n  XE_WORKAROUND_CONSTANT_RETURN_IF(count % 8 == 0);\n  for (; i < count; ++i) {  // handle residual elements\n    dest[i] = byte_swap(src[i]);\n  }\n}\n\nvoid copy_and_swap_16_unaligned(void* dest_ptr, const void* src_ptr,\n                                size_t count) {\n  auto dest = reinterpret_cast<uint16_t*>(dest_ptr);\n  auto src = reinterpret_cast<const uint16_t*>(src_ptr);\n  __m128i shufmask =\n      _mm_set_epi8(0x0E, 0x0F, 0x0C, 0x0D, 0x0A, 0x0B, 0x08, 0x09, 0x06, 0x07,\n                   0x04, 0x05, 0x02, 0x03, 0x00, 0x01);\n\n  size_t i;\n  for (i = 0; i + 8 <= count; i += 8) {\n    __m128i input = _mm_loadu_si128(reinterpret_cast<const __m128i*>(&src[i]));\n    __m128i output = _mm_shuffle_epi8(input, shufmask);\n    _mm_storeu_si128(reinterpret_cast<__m128i*>(&dest[i]), output);\n  }\n  XE_WORKAROUND_CONSTANT_RETURN_IF(count % 8 == 0);\n  for (; i < count; ++i) {  // handle residual elements\n    dest[i] = byte_swap(src[i]);\n  }\n}\n\nvoid copy_and_swap_32_aligned(void* dest_ptr, const void* src_ptr,\n                              size_t count) {\n  assert_zero(reinterpret_cast<uintptr_t>(dest_ptr) & 0xF);\n  assert_zero(reinterpret_cast<uintptr_t>(src_ptr) & 0xF);\n\n  auto dest = reinterpret_cast<uint32_t*>(dest_ptr);\n  auto src = reinterpret_cast<const uint32_t*>(src_ptr);\n  __m128i shufmask =\n      _mm_set_epi8(0x0C, 0x0D, 0x0E, 0x0F, 0x08, 0x09, 0x0A, 0x0B, 0x04, 0x05,\n                   0x06, 0x07, 0x00, 0x01, 0x02, 0x03);\n\n  size_t i;\n  for (i = 0; i + 4 <= count; i += 4) {\n    __m128i input = _mm_load_si128(reinterpret_cast<const __m128i*>(&src[i]));\n    __m128i output = _mm_shuffle_epi8(input, shufmask);\n    _mm_store_si128(reinterpret_cast<__m128i*>(&dest[i]), output);\n  }\n  XE_WORKAROUND_CONSTANT_RETURN_IF(count % 4 == 0);\n  for (; i < count; ++i) {  // handle residual elements\n    dest[i] = byte_swap(src[i]);\n  }\n}\n\nvoid copy_and_swap_32_unaligned(void* dest_ptr, const void* src_ptr,\n                                size_t count) {\n  auto dest = reinterpret_cast<uint32_t*>(dest_ptr);\n  auto src = reinterpret_cast<const uint32_t*>(src_ptr);\n  __m128i shufmask =\n      _mm_set_epi8(0x0C, 0x0D, 0x0E, 0x0F, 0x08, 0x09, 0x0A, 0x0B, 0x04, 0x05,\n                   0x06, 0x07, 0x00, 0x01, 0x02, 0x03);\n\n  size_t i;\n  for (i = 0; i + 4 <= count; i += 4) {\n    __m128i input = _mm_loadu_si128(reinterpret_cast<const __m128i*>(&src[i]));\n    __m128i output = _mm_shuffle_epi8(input, shufmask);\n    _mm_storeu_si128(reinterpret_cast<__m128i*>(&dest[i]), output);\n  }\n  XE_WORKAROUND_CONSTANT_RETURN_IF(count % 4 == 0);\n  for (; i < count; ++i) {  // handle residual elements\n    dest[i] = byte_swap(src[i]);\n  }\n}\n\nvoid copy_and_swap_64_aligned(void* dest_ptr, const void* src_ptr,\n                              size_t count) {\n  assert_zero(reinterpret_cast<uintptr_t>(dest_ptr) & 0xF);\n  assert_zero(reinterpret_cast<uintptr_t>(src_ptr) & 0xF);\n\n  auto dest = reinterpret_cast<uint64_t*>(dest_ptr);\n  auto src = reinterpret_cast<const uint64_t*>(src_ptr);\n  __m128i shufmask =\n      _mm_set_epi8(0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x00, 0x01,\n                   0x02, 0x03, 0x04, 0x05, 0x06, 0x07);\n\n  size_t i;\n  for (i = 0; i + 2 <= count; i += 2) {\n    __m128i input = _mm_load_si128(reinterpret_cast<const __m128i*>(&src[i]));\n    __m128i output = _mm_shuffle_epi8(input, shufmask);\n    _mm_store_si128(reinterpret_cast<__m128i*>(&dest[i]), output);\n  }\n  XE_WORKAROUND_CONSTANT_RETURN_IF(count % 2 == 0);\n  for (; i < count; ++i) {  // handle residual elements\n    dest[i] = byte_swap(src[i]);\n  }\n}\n\nvoid copy_and_swap_64_unaligned(void* dest_ptr, const void* src_ptr,\n                                size_t count) {\n  auto dest = reinterpret_cast<uint64_t*>(dest_ptr);\n  auto src = reinterpret_cast<const uint64_t*>(src_ptr);\n  __m128i shufmask =\n      _mm_set_epi8(0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x00, 0x01,\n                   0x02, 0x03, 0x04, 0x05, 0x06, 0x07);\n\n  size_t i;\n  for (i = 0; i + 2 <= count; i += 2) {\n    __m128i input = _mm_loadu_si128(reinterpret_cast<const __m128i*>(&src[i]));\n    __m128i output = _mm_shuffle_epi8(input, shufmask);\n    _mm_storeu_si128(reinterpret_cast<__m128i*>(&dest[i]), output);\n  }\n  XE_WORKAROUND_CONSTANT_RETURN_IF(count % 2 == 0);\n  for (; i < count; ++i) {  // handle residual elements\n    dest[i] = byte_swap(src[i]);\n  }\n}\n\nvoid copy_and_swap_16_in_32_aligned(void* dest_ptr, const void* src_ptr,\n                                    size_t count) {\n  auto dest = reinterpret_cast<uint32_t*>(dest_ptr);\n  auto src = reinterpret_cast<const uint32_t*>(src_ptr);\n  size_t i;\n  for (i = 0; i + 4 <= count; i += 4) {\n    __m128i input = _mm_load_si128(reinterpret_cast<const __m128i*>(&src[i]));\n    __m128i output =\n        _mm_or_si128(_mm_slli_epi32(input, 16), _mm_srli_epi32(input, 16));\n    _mm_store_si128(reinterpret_cast<__m128i*>(&dest[i]), output);\n  }\n  XE_WORKAROUND_CONSTANT_RETURN_IF(count % 4 == 0);\n  for (; i < count; ++i) {  // handle residual elements\n    dest[i] = (src[i] >> 16) | (src[i] << 16);\n  }\n}\n\nvoid copy_and_swap_16_in_32_unaligned(void* dest_ptr, const void* src_ptr,\n                                      size_t count) {\n  auto dest = reinterpret_cast<uint32_t*>(dest_ptr);\n  auto src = reinterpret_cast<const uint32_t*>(src_ptr);\n  size_t i;\n  for (i = 0; i + 4 <= count; i += 4) {\n    __m128i input = _mm_loadu_si128(reinterpret_cast<const __m128i*>(&src[i]));\n    __m128i output =\n        _mm_or_si128(_mm_slli_epi32(input, 16), _mm_srli_epi32(input, 16));\n    _mm_storeu_si128(reinterpret_cast<__m128i*>(&dest[i]), output);\n  }\n  XE_WORKAROUND_CONSTANT_RETURN_IF(count % 4 == 0);\n  for (; i < count; ++i) {  // handle residual elements\n    dest[i] = (src[i] >> 16) | (src[i] << 16);\n  }\n}\n\n#elif XE_ARCH_ARM64\n\n// Although NEON offers vector rev instructions (like vrev32q_u8), they are\n// slower in benchmarks. Also, using uint8x16xN_t wasn't any faster in the\n// benchmarks, hence we use just use one SIMD register to minimize residual\n// processing.\n\nvoid copy_and_swap_16_aligned(void* dst_ptr, const void* src_ptr,\n                              size_t count) {\n  copy_and_swap_16_unaligned(dst_ptr, src_ptr, count);\n}\n\nvoid copy_and_swap_16_unaligned(void* dst_ptr, const void* src_ptr,\n                                size_t count) {\n  auto dst = reinterpret_cast<uint8_t*>(dst_ptr);\n  auto src = reinterpret_cast<const uint8_t*>(src_ptr);\n\n  const uint8x16_t tbl_idx =\n      vcombine_u8(vcreate_u8(UINT64_C(0x0607040502030001)),\n                  vcreate_u8(UINT64_C(0x0E0F0C0D0A0B0809)));\n\n  while (count >= 8) {\n    uint8x16_t data = vld1q_u8(src);\n    data = vqtbl1q_u8(data, tbl_idx);\n    vst1q_u8(dst, data);\n\n    count -= 8;\n    // These pointer increments will be combined with the load/stores (ldr/str)\n    // into single instructions (at least by clang)\n    dst += 16;\n    src += 16;\n  }\n\n  while (count > 0) {\n    store_and_swap<uint16_t>(dst, load<uint16_t>(src));\n\n    count--;\n    dst += 2;\n    src += 2;\n  }\n}\n\nvoid copy_and_swap_32_aligned(void* dst, const void* src, size_t count) {\n  copy_and_swap_32_unaligned(dst, src, count);\n}\n\nvoid copy_and_swap_32_unaligned(void* dst_ptr, const void* src_ptr,\n                                size_t count) {\n  auto dst = reinterpret_cast<uint8_t*>(dst_ptr);\n  auto src = reinterpret_cast<const uint8_t*>(src_ptr);\n\n  const uint8x16_t tbl_idx =\n      vcombine_u8(vcreate_u8(UINT64_C(0x405060700010203)),\n                  vcreate_u8(UINT64_C(0x0C0D0E0F08090A0B)));\n\n  while (count >= 4) {\n    uint8x16_t data = vld1q_u8(src);\n    data = vqtbl1q_u8(data, tbl_idx);\n    vst1q_u8(dst, data);\n\n    count -= 4;\n    dst += 16;\n    src += 16;\n  }\n\n  while (count > 0) {\n    store_and_swap<uint32_t>(dst, load<uint32_t>(src));\n\n    count--;\n    dst += 4;\n    src += 4;\n  }\n}\n\nvoid copy_and_swap_64_aligned(void* dst, const void* src, size_t count) {\n  copy_and_swap_64_unaligned(dst, src, count);\n}\n\nvoid copy_and_swap_64_unaligned(void* dst_ptr, const void* src_ptr,\n                                size_t count) {\n  auto dst = reinterpret_cast<uint8_t*>(dst_ptr);\n  auto src = reinterpret_cast<const uint8_t*>(src_ptr);\n\n  const uint8x16_t tbl_idx =\n      vcombine_u8(vcreate_u8(UINT64_C(0x0001020304050607)),\n                  vcreate_u8(UINT64_C(0x08090A0B0C0D0E0F)));\n\n  while (count >= 2) {\n    uint8x16_t data = vld1q_u8(src);\n    data = vqtbl1q_u8(data, tbl_idx);\n    vst1q_u8(dst, data);\n\n    count -= 2;\n    dst += 16;\n    src += 16;\n  }\n\n  while (count > 0) {\n    store_and_swap<uint64_t>(dst, load<uint64_t>(src));\n\n    count--;\n    dst += 8;\n    src += 8;\n  }\n}\n\nvoid copy_and_swap_16_in_32_aligned(void* dst, const void* src, size_t count) {\n  return copy_and_swap_16_in_32_unaligned(dst, src, count);\n}\n\nvoid copy_and_swap_16_in_32_unaligned(void* dst_ptr, const void* src_ptr,\n                                      size_t count) {\n  auto dst = reinterpret_cast<uint16_t*>(dst_ptr);\n  auto src = reinterpret_cast<const uint16_t*>(src_ptr);\n  while (count > 0) {\n    uint16_t word0 = *src++;\n    uint16_t word1 = *src++;\n    *dst++ = word1;\n    *dst++ = word0;\n\n    count--;\n  }\n}\n\n#else\n\n// Generic routines.\nvoid copy_and_swap_16_aligned(void* dest, const void* src, size_t count) {\n  return copy_and_swap_16_unaligned(dest, src, count);\n}\n\nvoid copy_and_swap_16_unaligned(void* dest_ptr, const void* src_ptr,\n                                size_t count) {\n  auto dest = reinterpret_cast<uint16_t*>(dest_ptr);\n  auto src = reinterpret_cast<const uint16_t*>(src_ptr);\n  for (size_t i = 0; i < count; ++i) {\n    dest[i] = byte_swap(src[i]);\n  }\n}\n\nvoid copy_and_swap_32_aligned(void* dest, const void* src, size_t count) {\n  return copy_and_swap_32_unaligned(dest, src, count);\n}\n\nvoid copy_and_swap_32_unaligned(void* dest_ptr, const void* src_ptr,\n                                size_t count) {\n  auto dest = reinterpret_cast<uint32_t*>(dest_ptr);\n  auto src = reinterpret_cast<const uint32_t*>(src_ptr);\n  for (size_t i = 0; i < count; ++i) {\n    dest[i] = byte_swap(src[i]);\n  }\n}\n\nvoid copy_and_swap_64_aligned(void* dest, const void* src, size_t count) {\n  return copy_and_swap_64_unaligned(dest, src, count);\n}\n\nvoid copy_and_swap_64_unaligned(void* dest_ptr, const void* src_ptr,\n                                size_t count) {\n  auto dest = reinterpret_cast<uint64_t*>(dest_ptr);\n  auto src = reinterpret_cast<const uint64_t*>(src_ptr);\n  for (size_t i = 0; i < count; ++i) {\n    dest[i] = byte_swap(src[i]);\n  }\n}\n\nvoid copy_and_swap_16_in_32_aligned(void* dest, const void* src, size_t count) {\n  return copy_and_swap_16_in_32_unaligned(dest, src, count);\n}\n\nvoid copy_and_swap_16_in_32_unaligned(void* dst_ptr, const void* src_ptr,\n                                      size_t count) {\n  auto dst = reinterpret_cast<uint16_t*>(dst_ptr);\n  auto src = reinterpret_cast<const uint16_t*>(src_ptr);\n  while (count > 0) {\n    uint16_t word0 = *src++;\n    uint16_t word1 = *src++;\n    *dst++ = word1;\n    *dst++ = word0;\n\n    count--;\n  }\n}\n\n#endif\n\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/base/memory.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_BASE_MEMORY_H_\n#define XENIA_BASE_MEMORY_H_\n\n#include <cstdlib>\n#include <cstring>\n#include <filesystem>\n#include <functional>\n#include <string>\n#include <string_view>\n#include <type_traits>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/byte_order.h\"\n#include \"xenia/base/platform.h\"\n\nnamespace xe {\nnamespace memory {\n\n// For variable declarations (not return values or `this` pointer).\n// Not propagated.\n#define XE_RESTRICT_VAR __restrict\n\n// Aliasing-safe bit reinterpretation.\n// For more complex cases such as non-trivially-copyable types, write copying\n// code respecting the requirements for them externally instead of using these\n// functions.\n\ntemplate <typename Dst, typename Src>\nvoid Reinterpret(Dst& XE_RESTRICT_VAR dst, const Src& XE_RESTRICT_VAR src) {\n  static_assert(sizeof(Dst) == sizeof(Src));\n  static_assert(std::is_trivially_copyable_v<Dst>);\n  static_assert(std::is_trivially_copyable_v<Src>);\n  std::memcpy(&dst, &src, sizeof(Dst));\n}\n\ntemplate <typename Dst, typename Src>\nDst Reinterpret(const Src& XE_RESTRICT_VAR src) {\n  Dst dst;\n  Reinterpret(dst, src);\n  return dst;\n}\n\n#if XE_PLATFORM_ANDROID\nvoid AndroidInitialize();\nvoid AndroidShutdown();\n#endif\n\n// Returns the native page size of the system, in bytes.\n// This should be ~4KiB.\nsize_t page_size();\n\n// Returns the allocation granularity of the system, in bytes.\n// This is likely 64KiB.\nsize_t allocation_granularity();\n\nenum class PageAccess {\n  kNoAccess = 0,\n  kReadOnly = 1 << 0,\n  kReadWrite = kReadOnly | 1 << 1,\n  kExecuteReadOnly = kReadOnly | 1 << 2,\n  kExecuteReadWrite = kReadWrite | 1 << 2,\n};\n\nenum class AllocationType {\n  kReserve = 1 << 0,\n  kCommit = 1 << 1,\n  kReserveCommit = kReserve | kCommit,\n};\n\nenum class DeallocationType {\n  kRelease = 1 << 0,\n  kDecommit = 1 << 1,\n};\n\n// Whether the host allows the pages to be allocated or mapped with\n// PageAccess::kExecuteReadWrite - if not, separate mappings backed by the same\n// memory-mapped file must be used to write to executable pages.\nbool IsWritableExecutableMemorySupported();\n\n// Whether PageAccess::kExecuteReadWrite is a supported and preferred way of\n// writing executable memory, useful for simulating how Xenia would work without\n// writable executable memory on a system with it.\nbool IsWritableExecutableMemoryPreferred();\n\n// Allocates a block of memory at the given page-aligned base address.\n// Fails if the memory is not available.\n// Specify nullptr for base_address to leave it up to the system.\nvoid* AllocFixed(void* base_address, size_t length,\n                 AllocationType allocation_type, PageAccess access);\n\n// Deallocates and/or releases the given block of memory.\n// When releasing memory length must be zero, as all pages in the region are\n// released.\nbool DeallocFixed(void* base_address, size_t length,\n                  DeallocationType deallocation_type);\n\n// Sets the access rights for the given block of memory and returns the previous\n// access rights. Both base_address and length will be adjusted to page_size().\nbool Protect(void* base_address, size_t length, PageAccess access,\n             PageAccess* out_old_access = nullptr);\n\n// Queries a region of pages to get the access rights. This will modify the\n// length parameter to the length of pages with the same consecutive access\n// rights. The length will start from the first byte of the first page of\n// the region.\nbool QueryProtect(void* base_address, size_t& length, PageAccess& access_out);\n\n// Allocates a block of memory for a type with the given alignment.\n// The memory must be freed with AlignedFree.\ntemplate <typename T>\ninline T* AlignedAlloc(size_t alignment) {\n#if XE_COMPILER_MSVC\n  return reinterpret_cast<T*>(_aligned_malloc(sizeof(T), alignment));\n#else\n  void* ptr = nullptr;\n  if (posix_memalign(&ptr, alignment, sizeof(T))) {\n    return nullptr;\n  }\n  return reinterpret_cast<T*>(ptr);\n#endif  // XE_COMPILER_MSVC\n}\n\n// Frees memory previously allocated with AlignedAlloc.\ntemplate <typename T>\nvoid AlignedFree(T* ptr) {\n#if XE_COMPILER_MSVC\n  _aligned_free(ptr);\n#else\n  free(ptr);\n#endif  // XE_COMPILER_MSVC\n}\n\n#if XE_PLATFORM_WIN32\n// HANDLE.\ntypedef void* FileMappingHandle;\nconstexpr FileMappingHandle kFileMappingHandleInvalid = nullptr;\n#else\n// File descriptor.\ntypedef int FileMappingHandle;\nconstexpr FileMappingHandle kFileMappingHandleInvalid = -1;\n#endif\n\nFileMappingHandle CreateFileMappingHandle(const std::filesystem::path& path,\n                                          size_t length, PageAccess access,\n                                          bool commit);\nvoid CloseFileMappingHandle(FileMappingHandle handle,\n                            const std::filesystem::path& path);\nvoid* MapFileView(FileMappingHandle handle, void* base_address, size_t length,\n                  PageAccess access, size_t file_offset);\nbool UnmapFileView(FileMappingHandle handle, void* base_address, size_t length);\n\ninline size_t hash_combine(size_t seed) { return seed; }\n\ntemplate <typename T, typename... Ts>\nsize_t hash_combine(size_t seed, const T& v, const Ts&... vs) {\n  std::hash<T> hasher;\n  seed ^= hasher(v) + 0x9E3779B9 + (seed << 6) + (seed >> 2);\n  return hash_combine(seed, vs...);\n}\n\n}  // namespace memory\n\n// TODO(benvanik): move into xe::memory::\n\ninline void* low_address(void* address) {\n  return reinterpret_cast<void*>(uint64_t(address) & 0xFFFFFFFF);\n}\n\nvoid copy_128_aligned(void* dest, const void* src, size_t count);\n\nvoid copy_and_swap_16_aligned(void* dest, const void* src, size_t count);\nvoid copy_and_swap_16_unaligned(void* dest, const void* src, size_t count);\nvoid copy_and_swap_32_aligned(void* dest, const void* src, size_t count);\nvoid copy_and_swap_32_unaligned(void* dest, const void* src, size_t count);\nvoid copy_and_swap_64_aligned(void* dest, const void* src, size_t count);\nvoid copy_and_swap_64_unaligned(void* dest, const void* src, size_t count);\nvoid copy_and_swap_16_in_32_aligned(void* dest, const void* src, size_t count);\nvoid copy_and_swap_16_in_32_unaligned(void* dest, const void* src,\n                                      size_t count);\n\ntemplate <typename T>\nvoid copy_and_swap(T* dest, const T* src, size_t count) {\n  bool is_aligned = reinterpret_cast<uintptr_t>(dest) % 32 == 0 &&\n                    reinterpret_cast<uintptr_t>(src) % 32 == 0;\n  if (sizeof(T) == 1) {\n    std::memcpy(dest, src, count);\n  } else if (sizeof(T) == 2) {\n    auto ps = reinterpret_cast<const uint16_t*>(src);\n    auto pd = reinterpret_cast<uint16_t*>(dest);\n    if (is_aligned) {\n      copy_and_swap_16_aligned(pd, ps, count);\n    } else {\n      copy_and_swap_16_unaligned(pd, ps, count);\n    }\n  } else if (sizeof(T) == 4) {\n    auto ps = reinterpret_cast<const uint32_t*>(src);\n    auto pd = reinterpret_cast<uint32_t*>(dest);\n    if (is_aligned) {\n      copy_and_swap_32_aligned(pd, ps, count);\n    } else {\n      copy_and_swap_32_unaligned(pd, ps, count);\n    }\n  } else if (sizeof(T) == 8) {\n    auto ps = reinterpret_cast<const uint64_t*>(src);\n    auto pd = reinterpret_cast<uint64_t*>(dest);\n    if (is_aligned) {\n      copy_and_swap_64_aligned(pd, ps, count);\n    } else {\n      copy_and_swap_64_unaligned(pd, ps, count);\n    }\n  } else {\n    assert_always(\"Invalid xe::copy_and_swap size\");\n  }\n}\n\ntemplate <typename T>\nT load(const void* mem);\ntemplate <>\ninline int8_t load<int8_t>(const void* mem) {\n  return *reinterpret_cast<const int8_t*>(mem);\n}\ntemplate <>\ninline uint8_t load<uint8_t>(const void* mem) {\n  return *reinterpret_cast<const uint8_t*>(mem);\n}\ntemplate <>\ninline int16_t load<int16_t>(const void* mem) {\n  return *reinterpret_cast<const int16_t*>(mem);\n}\ntemplate <>\ninline uint16_t load<uint16_t>(const void* mem) {\n  return *reinterpret_cast<const uint16_t*>(mem);\n}\ntemplate <>\ninline int32_t load<int32_t>(const void* mem) {\n  return *reinterpret_cast<const int32_t*>(mem);\n}\ntemplate <>\ninline uint32_t load<uint32_t>(const void* mem) {\n  return *reinterpret_cast<const uint32_t*>(mem);\n}\ntemplate <>\ninline int64_t load<int64_t>(const void* mem) {\n  return *reinterpret_cast<const int64_t*>(mem);\n}\ntemplate <>\ninline uint64_t load<uint64_t>(const void* mem) {\n  return *reinterpret_cast<const uint64_t*>(mem);\n}\ntemplate <>\ninline float load<float>(const void* mem) {\n  return *reinterpret_cast<const float*>(mem);\n}\ntemplate <>\ninline double load<double>(const void* mem) {\n  return *reinterpret_cast<const double*>(mem);\n}\ntemplate <typename T>\ninline T load(const void* mem) {\n  if (sizeof(T) == 1) {\n    return static_cast<T>(load<uint8_t>(mem));\n  } else if (sizeof(T) == 2) {\n    return static_cast<T>(load<uint16_t>(mem));\n  } else if (sizeof(T) == 4) {\n    return static_cast<T>(load<uint32_t>(mem));\n  } else if (sizeof(T) == 8) {\n    return static_cast<T>(load<uint64_t>(mem));\n  } else {\n    assert_always(\"Invalid xe::load size\");\n  }\n}\n\ntemplate <typename T>\nT load_and_swap(const void* mem);\ntemplate <>\ninline int8_t load_and_swap<int8_t>(const void* mem) {\n  return *reinterpret_cast<const int8_t*>(mem);\n}\ntemplate <>\ninline uint8_t load_and_swap<uint8_t>(const void* mem) {\n  return *reinterpret_cast<const uint8_t*>(mem);\n}\ntemplate <>\ninline int16_t load_and_swap<int16_t>(const void* mem) {\n  return byte_swap(*reinterpret_cast<const int16_t*>(mem));\n}\ntemplate <>\ninline uint16_t load_and_swap<uint16_t>(const void* mem) {\n  return byte_swap(*reinterpret_cast<const uint16_t*>(mem));\n}\ntemplate <>\ninline int32_t load_and_swap<int32_t>(const void* mem) {\n  return byte_swap(*reinterpret_cast<const int32_t*>(mem));\n}\ntemplate <>\ninline uint32_t load_and_swap<uint32_t>(const void* mem) {\n  return byte_swap(*reinterpret_cast<const uint32_t*>(mem));\n}\ntemplate <>\ninline int64_t load_and_swap<int64_t>(const void* mem) {\n  return byte_swap(*reinterpret_cast<const int64_t*>(mem));\n}\ntemplate <>\ninline uint64_t load_and_swap<uint64_t>(const void* mem) {\n  return byte_swap(*reinterpret_cast<const uint64_t*>(mem));\n}\ntemplate <>\ninline float load_and_swap<float>(const void* mem) {\n  return byte_swap(*reinterpret_cast<const float*>(mem));\n}\ntemplate <>\ninline double load_and_swap<double>(const void* mem) {\n  return byte_swap(*reinterpret_cast<const double*>(mem));\n}\ntemplate <>\ninline std::string load_and_swap<std::string>(const void* mem) {\n  std::string value;\n  for (int i = 0;; ++i) {\n    auto c =\n        xe::load_and_swap<uint8_t>(reinterpret_cast<const uint8_t*>(mem) + i);\n    if (!c) {\n      break;\n    }\n    value.push_back(static_cast<char>(c));\n  }\n  return value;\n}\ntemplate <>\ninline std::u16string load_and_swap<std::u16string>(const void* mem) {\n  std::u16string value;\n  for (int i = 0;; ++i) {\n    auto c =\n        xe::load_and_swap<uint16_t>(reinterpret_cast<const uint16_t*>(mem) + i);\n    if (!c) {\n      break;\n    }\n    value.push_back(static_cast<wchar_t>(c));\n  }\n  return value;\n}\n\ntemplate <typename T>\nvoid store(void* mem, const T& value);\ntemplate <>\ninline void store<int8_t>(void* mem, const int8_t& value) {\n  *reinterpret_cast<int8_t*>(mem) = value;\n}\ntemplate <>\ninline void store<uint8_t>(void* mem, const uint8_t& value) {\n  *reinterpret_cast<uint8_t*>(mem) = value;\n}\ntemplate <>\ninline void store<int16_t>(void* mem, const int16_t& value) {\n  *reinterpret_cast<int16_t*>(mem) = value;\n}\ntemplate <>\ninline void store<uint16_t>(void* mem, const uint16_t& value) {\n  *reinterpret_cast<uint16_t*>(mem) = value;\n}\ntemplate <>\ninline void store<int32_t>(void* mem, const int32_t& value) {\n  *reinterpret_cast<int32_t*>(mem) = value;\n}\ntemplate <>\ninline void store<uint32_t>(void* mem, const uint32_t& value) {\n  *reinterpret_cast<uint32_t*>(mem) = value;\n}\ntemplate <>\ninline void store<int64_t>(void* mem, const int64_t& value) {\n  *reinterpret_cast<int64_t*>(mem) = value;\n}\ntemplate <>\ninline void store<uint64_t>(void* mem, const uint64_t& value) {\n  *reinterpret_cast<uint64_t*>(mem) = value;\n}\ntemplate <>\ninline void store<float>(void* mem, const float& value) {\n  *reinterpret_cast<float*>(mem) = value;\n}\ntemplate <>\ninline void store<double>(void* mem, const double& value) {\n  *reinterpret_cast<double*>(mem) = value;\n}\ntemplate <typename T>\nconstexpr inline void store(const void* mem, const T& value) {\n  if constexpr (sizeof(T) == 1) {\n    store<uint8_t>(mem, static_cast<uint8_t>(value));\n  } else if constexpr (sizeof(T) == 2) {\n    store<uint8_t>(mem, static_cast<uint16_t>(value));\n  } else if constexpr (sizeof(T) == 4) {\n    store<uint8_t>(mem, static_cast<uint32_t>(value));\n  } else if constexpr (sizeof(T) == 8) {\n    store<uint8_t>(mem, static_cast<uint64_t>(value));\n  } else {\n    static_assert(\"Invalid xe::store size\");\n  }\n}\n\ntemplate <typename T>\nvoid store_and_swap(void* mem, const T& value);\ntemplate <>\ninline void store_and_swap<int8_t>(void* mem, const int8_t& value) {\n  *reinterpret_cast<int8_t*>(mem) = value;\n}\ntemplate <>\ninline void store_and_swap<uint8_t>(void* mem, const uint8_t& value) {\n  *reinterpret_cast<uint8_t*>(mem) = value;\n}\ntemplate <>\ninline void store_and_swap<int16_t>(void* mem, const int16_t& value) {\n  *reinterpret_cast<int16_t*>(mem) = byte_swap(value);\n}\ntemplate <>\ninline void store_and_swap<uint16_t>(void* mem, const uint16_t& value) {\n  *reinterpret_cast<uint16_t*>(mem) = byte_swap(value);\n}\ntemplate <>\ninline void store_and_swap<int32_t>(void* mem, const int32_t& value) {\n  *reinterpret_cast<int32_t*>(mem) = byte_swap(value);\n}\ntemplate <>\ninline void store_and_swap<uint32_t>(void* mem, const uint32_t& value) {\n  *reinterpret_cast<uint32_t*>(mem) = byte_swap(value);\n}\ntemplate <>\ninline void store_and_swap<int64_t>(void* mem, const int64_t& value) {\n  *reinterpret_cast<int64_t*>(mem) = byte_swap(value);\n}\ntemplate <>\ninline void store_and_swap<uint64_t>(void* mem, const uint64_t& value) {\n  *reinterpret_cast<uint64_t*>(mem) = byte_swap(value);\n}\ntemplate <>\ninline void store_and_swap<float>(void* mem, const float& value) {\n  *reinterpret_cast<float*>(mem) = byte_swap(value);\n}\ntemplate <>\ninline void store_and_swap<double>(void* mem, const double& value) {\n  *reinterpret_cast<double*>(mem) = byte_swap(value);\n}\ntemplate <>\ninline void store_and_swap<std::string_view>(void* mem,\n                                             const std::string_view& value) {\n  for (auto i = 0; i < value.size(); ++i) {\n    xe::store_and_swap<uint8_t>(reinterpret_cast<uint8_t*>(mem) + i, value[i]);\n  }\n}\ntemplate <>\ninline void store_and_swap<std::string>(void* mem, const std::string& value) {\n  return store_and_swap<std::string_view>(mem, value);\n}\ntemplate <>\ninline void store_and_swap<std::u16string_view>(\n    void* mem, const std::u16string_view& value) {\n  for (auto i = 0; i < value.size(); ++i) {\n    xe::store_and_swap<uint16_t>(reinterpret_cast<uint16_t*>(mem) + i,\n                                 value[i]);\n  }\n}\ntemplate <>\ninline void store_and_swap<std::u16string>(void* mem,\n                                           const std::u16string& value) {\n  return store_and_swap<std::u16string_view>(mem, value);\n}\n\nusing fourcc_t = uint32_t;\n\n// Get FourCC in host byte order\n// make_fourcc('a', 'b', 'c', 'd') == 0x61626364\nconstexpr inline fourcc_t make_fourcc(char a, char b, char c, char d) {\n  return fourcc_t((static_cast<fourcc_t>(a) << 24) |\n                  (static_cast<fourcc_t>(b) << 16) |\n                  (static_cast<fourcc_t>(c) << 8) | static_cast<fourcc_t>(d));\n}\n\n// Get FourCC in host byte order\n// This overload requires fourcc.length() == 4\n// make_fourcc(\"abcd\") == 'abcd' == 0x61626364 for most compilers\nconstexpr inline fourcc_t make_fourcc(const std::string_view fourcc) {\n  if (fourcc.length() != 4) {\n    throw std::runtime_error(\"Invalid fourcc length\");\n  }\n  return make_fourcc(fourcc[0], fourcc[1], fourcc[2], fourcc[3]);\n}\n\n}  // namespace xe\n\n#endif  // XENIA_BASE_MEMORY_H_\n"
  },
  {
    "path": "src/xenia/base/memory_posix.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/memory.h\"\n\n#include <fcntl.h>\n#include <sys/mman.h>\n#include <unistd.h>\n#include <cstddef>\n\n#include \"xenia/base/math.h\"\n#include \"xenia/base/platform.h\"\n#include \"xenia/base/string.h\"\n\n#if XE_PLATFORM_ANDROID\n#include <dlfcn.h>\n#include <linux/ashmem.h>\n#include <string.h>\n#include <sys/ioctl.h>\n\n#include \"xenia/base/main_android.h\"\n#endif\n\nnamespace xe {\nnamespace memory {\n\n#if XE_PLATFORM_ANDROID\n// May be null if no dynamically loaded functions are required.\nstatic void* libandroid_;\n// API 26+.\nstatic int (*android_ASharedMemory_create_)(const char* name, size_t size);\n\nvoid AndroidInitialize() {\n  if (xe::GetAndroidApiLevel() >= 26) {\n    libandroid_ = dlopen(\"libandroid.so\", RTLD_NOW);\n    assert_not_null(libandroid_);\n    if (libandroid_) {\n      android_ASharedMemory_create_ =\n          reinterpret_cast<decltype(android_ASharedMemory_create_)>(\n              dlsym(libandroid_, \"ASharedMemory_create\"));\n      assert_not_null(android_ASharedMemory_create_);\n    }\n  }\n}\n\nvoid AndroidShutdown() {\n  android_ASharedMemory_create_ = nullptr;\n  if (libandroid_) {\n    dlclose(libandroid_);\n    libandroid_ = nullptr;\n  }\n}\n#endif\n\nsize_t page_size() { return getpagesize(); }\nsize_t allocation_granularity() { return page_size(); }\n\nuint32_t ToPosixProtectFlags(PageAccess access) {\n  switch (access) {\n    case PageAccess::kNoAccess:\n      return PROT_NONE;\n    case PageAccess::kReadOnly:\n      return PROT_READ;\n    case PageAccess::kReadWrite:\n      return PROT_READ | PROT_WRITE;\n    case PageAccess::kExecuteReadOnly:\n      return PROT_READ | PROT_EXEC;\n    case PageAccess::kExecuteReadWrite:\n      return PROT_READ | PROT_WRITE | PROT_EXEC;\n    default:\n      assert_unhandled_case(access);\n      return PROT_NONE;\n  }\n}\n\nbool IsWritableExecutableMemorySupported() { return true; }\n\nvoid* AllocFixed(void* base_address, size_t length,\n                 AllocationType allocation_type, PageAccess access) {\n  // mmap does not support reserve / commit, so ignore allocation_type.\n  uint32_t prot = ToPosixProtectFlags(access);\n  void* result = mmap(base_address, length, prot,\n                      MAP_PRIVATE | MAP_FIXED | MAP_ANONYMOUS, -1, 0);\n  if (result == MAP_FAILED) {\n    return nullptr;\n  } else {\n    return result;\n  }\n}\n\nbool DeallocFixed(void* base_address, size_t length,\n                  DeallocationType deallocation_type) {\n  return munmap(base_address, length) == 0;\n}\n\nbool Protect(void* base_address, size_t length, PageAccess access,\n             PageAccess* out_old_access) {\n  // Linux does not have a syscall to query memory permissions.\n  assert_null(out_old_access);\n\n  uint32_t prot = ToPosixProtectFlags(access);\n  return mprotect(base_address, length, prot) == 0;\n}\n\nbool QueryProtect(void* base_address, size_t& length, PageAccess& access_out) {\n  return false;\n}\n\nFileMappingHandle CreateFileMappingHandle(const std::filesystem::path& path,\n                                          size_t length, PageAccess access,\n                                          bool commit) {\n#if XE_PLATFORM_ANDROID\n  // TODO(Triang3l): Check if memfd can be used instead on API 30+.\n  if (android_ASharedMemory_create_) {\n    int sharedmem_fd = android_ASharedMemory_create_(path.c_str(), length);\n    return sharedmem_fd >= 0 ? sharedmem_fd : kFileMappingHandleInvalid;\n  }\n\n  // Use /dev/ashmem on API versions below 26, which added ASharedMemory.\n  // /dev/ashmem was disabled on API 29 for apps targeting it.\n  // https://chromium.googlesource.com/chromium/src/+/master/third_party/ashmem/ashmem-dev.c\n  int ashmem_fd = open(\"/\" ASHMEM_NAME_DEF, O_RDWR);\n  if (ashmem_fd < 0) {\n    return kFileMappingHandleInvalid;\n  }\n  char ashmem_name[ASHMEM_NAME_LEN];\n  strlcpy(ashmem_name, path.c_str(), xe::countof(ashmem_name));\n  if (ioctl(ashmem_fd, ASHMEM_SET_NAME, ashmem_name) < 0 ||\n      ioctl(ashmem_fd, ASHMEM_SET_SIZE, length) < 0) {\n    close(ashmem_fd);\n    return kFileMappingHandleInvalid;\n  }\n  return ashmem_fd;\n#else\n  int oflag;\n  switch (access) {\n    case PageAccess::kNoAccess:\n      oflag = 0;\n      break;\n    case PageAccess::kReadOnly:\n    case PageAccess::kExecuteReadOnly:\n      oflag = O_RDONLY;\n      break;\n    case PageAccess::kReadWrite:\n    case PageAccess::kExecuteReadWrite:\n      oflag = O_RDWR;\n      break;\n    default:\n      assert_always();\n      return kFileMappingHandleInvalid;\n  }\n  oflag |= O_CREAT;\n  auto full_path = \"/\" / path;\n  int ret = shm_open(full_path.c_str(), oflag, 0777);\n  if (ret < 0) {\n    return kFileMappingHandleInvalid;\n  }\n  ftruncate64(ret, length);\n  return ret;\n#endif\n}\n\nvoid CloseFileMappingHandle(FileMappingHandle handle,\n                            const std::filesystem::path& path) {\n  close(handle);\n#if !XE_PLATFORM_ANDROID\n  auto full_path = \"/\" / path;\n  shm_unlink(full_path.c_str());\n#endif\n}\n\nvoid* MapFileView(FileMappingHandle handle, void* base_address, size_t length,\n                  PageAccess access, size_t file_offset) {\n  uint32_t prot = ToPosixProtectFlags(access);\n  return mmap64(base_address, length, prot, MAP_PRIVATE | MAP_ANONYMOUS, handle,\n                file_offset);\n}\n\nbool UnmapFileView(FileMappingHandle handle, void* base_address,\n                   size_t length) {\n  return munmap(base_address, length) == 0;\n}\n\n}  // namespace memory\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/base/memory_win.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/memory.h\"\n\n#include \"xenia/base/platform_win.h\"\n\n#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | \\\n                            WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES)\n#define XE_BASE_MEMORY_WIN_USE_DESKTOP_FUNCTIONS\n#endif\n\nnamespace xe {\nnamespace memory {\n\nsize_t page_size() {\n  static size_t value = 0;\n  if (!value) {\n    SYSTEM_INFO si;\n    GetSystemInfo(&si);\n    value = si.dwPageSize;\n  }\n  return value;\n}\n\nsize_t allocation_granularity() {\n  static size_t value = 0;\n  if (!value) {\n    SYSTEM_INFO si;\n    GetSystemInfo(&si);\n    value = si.dwAllocationGranularity;\n  }\n  return value;\n}\n\nDWORD ToWin32ProtectFlags(PageAccess access) {\n  switch (access) {\n    case PageAccess::kNoAccess:\n      return PAGE_NOACCESS;\n    case PageAccess::kReadOnly:\n      return PAGE_READONLY;\n    case PageAccess::kReadWrite:\n      return PAGE_READWRITE;\n    case PageAccess::kExecuteReadOnly:\n      return PAGE_EXECUTE_READ;\n    case PageAccess::kExecuteReadWrite:\n      return PAGE_EXECUTE_READWRITE;\n    default:\n      assert_unhandled_case(access);\n      return PAGE_NOACCESS;\n  }\n}\n\nPageAccess ToXeniaProtectFlags(DWORD access) {\n  if (access & PAGE_GUARD) {\n    // Strip the page guard flag for now...\n    access &= ~PAGE_GUARD;\n  }\n\n  switch (access) {\n    case PAGE_NOACCESS:\n      return PageAccess::kNoAccess;\n    case PAGE_READONLY:\n      return PageAccess::kReadOnly;\n    case PAGE_READWRITE:\n      return PageAccess::kReadWrite;\n    case PAGE_EXECUTE_READ:\n      return PageAccess::kExecuteReadOnly;\n    case PAGE_EXECUTE_READWRITE:\n      return PageAccess::kExecuteReadWrite;\n    default:\n      return PageAccess::kNoAccess;\n  }\n}\n\nbool IsWritableExecutableMemorySupported() {\n#ifdef XE_BASE_MEMORY_WIN_USE_DESKTOP_FUNCTIONS\n  return true;\n#else\n  // To test FromApp functions on desktop, undefine\n  // XE_BASE_MEMORY_WIN_USE_DESKTOP_FUNCTIONS and link to WindowsApp.lib.\n  return false;\n#endif\n}\n\nvoid* AllocFixed(void* base_address, size_t length,\n                 AllocationType allocation_type, PageAccess access) {\n  DWORD alloc_type = 0;\n  switch (allocation_type) {\n    case AllocationType::kReserve:\n      alloc_type = MEM_RESERVE;\n      break;\n    case AllocationType::kCommit:\n      alloc_type = MEM_COMMIT;\n      break;\n    case AllocationType::kReserveCommit:\n      alloc_type = MEM_RESERVE | MEM_COMMIT;\n      break;\n    default:\n      assert_unhandled_case(allocation_type);\n      break;\n  }\n  DWORD protect = ToWin32ProtectFlags(access);\n#ifdef XE_BASE_MEMORY_WIN_USE_DESKTOP_FUNCTIONS\n  return VirtualAlloc(base_address, length, alloc_type, protect);\n#else\n  return VirtualAllocFromApp(base_address, length, ULONG(alloc_type),\n                             ULONG(protect));\n#endif\n}\n\nbool DeallocFixed(void* base_address, size_t length,\n                  DeallocationType deallocation_type) {\n  DWORD free_type = 0;\n  switch (deallocation_type) {\n    case DeallocationType::kRelease:\n      free_type = MEM_RELEASE;\n      length = 0;\n      break;\n    case DeallocationType::kDecommit:\n      free_type = MEM_DECOMMIT;\n      break;\n    default:\n      assert_unhandled_case(deallocation_type);\n      break;\n  }\n  return VirtualFree(base_address, length, free_type) ? true : false;\n}\n\nbool Protect(void* base_address, size_t length, PageAccess access,\n             PageAccess* out_old_access) {\n  if (out_old_access) {\n    *out_old_access = PageAccess::kNoAccess;\n  }\n  DWORD new_protect = ToWin32ProtectFlags(access);\n#ifdef XE_BASE_MEMORY_WIN_USE_DESKTOP_FUNCTIONS\n  DWORD old_protect = 0;\n  BOOL result = VirtualProtect(base_address, length, new_protect, &old_protect);\n#else\n  ULONG old_protect = 0;\n  BOOL result = VirtualProtectFromApp(base_address, length, ULONG(new_protect),\n                                      &old_protect);\n#endif\n  if (!result) {\n    return false;\n  }\n  if (out_old_access) {\n    *out_old_access = ToXeniaProtectFlags(DWORD(old_protect));\n  }\n  return true;\n}\n\nbool QueryProtect(void* base_address, size_t& length, PageAccess& access_out) {\n  access_out = PageAccess::kNoAccess;\n\n  MEMORY_BASIC_INFORMATION info;\n  ZeroMemory(&info, sizeof(info));\n\n  SIZE_T result = VirtualQuery(base_address, &info, sizeof(info));\n  if (!result) {\n    return false;\n  }\n\n  length = info.RegionSize;\n  access_out = ToXeniaProtectFlags(info.Protect);\n  return true;\n}\n\nFileMappingHandle CreateFileMappingHandle(const std::filesystem::path& path,\n                                          size_t length, PageAccess access,\n                                          bool commit) {\n  DWORD protect =\n      ToWin32ProtectFlags(access) | (commit ? SEC_COMMIT : SEC_RESERVE);\n  auto full_path = \"Local\" / path;\n#ifdef XE_BASE_MEMORY_WIN_USE_DESKTOP_FUNCTIONS\n  return CreateFileMappingW(INVALID_HANDLE_VALUE, nullptr, protect,\n                            static_cast<DWORD>(length >> 32),\n                            static_cast<DWORD>(length), full_path.c_str());\n#else\n  return CreateFileMappingFromApp(INVALID_HANDLE_VALUE, nullptr, ULONG(protect),\n                                  ULONG64(length), full_path.c_str());\n#endif\n}\n\nvoid CloseFileMappingHandle(FileMappingHandle handle,\n                            const std::filesystem::path& path) {\n  CloseHandle(handle);\n}\n\nvoid* MapFileView(FileMappingHandle handle, void* base_address, size_t length,\n                  PageAccess access, size_t file_offset) {\n#ifdef XE_BASE_MEMORY_WIN_USE_DESKTOP_FUNCTIONS\n  DWORD target_address_low = static_cast<DWORD>(file_offset);\n  DWORD target_address_high = static_cast<DWORD>(file_offset >> 32);\n  DWORD file_access = 0;\n  switch (access) {\n    case PageAccess::kReadOnly:\n      file_access = FILE_MAP_READ;\n      break;\n    case PageAccess::kReadWrite:\n      file_access = FILE_MAP_ALL_ACCESS;\n      break;\n    case PageAccess::kExecuteReadOnly:\n      file_access = FILE_MAP_READ | FILE_MAP_EXECUTE;\n      break;\n    case PageAccess::kExecuteReadWrite:\n      file_access = FILE_MAP_ALL_ACCESS | FILE_MAP_EXECUTE;\n      break;\n    case PageAccess::kNoAccess:\n    default:\n      assert_unhandled_case(access);\n      return nullptr;\n  }\n  return MapViewOfFileEx(handle, file_access, target_address_high,\n                         target_address_low, length, base_address);\n#else\n  // VirtualAlloc2FromApp and MapViewOfFile3FromApp were added in 10.0.17134.0.\n  // https://docs.microsoft.com/en-us/uwp/win32-and-com/win32-apis\n  HANDLE process = GetCurrentProcess();\n  void* placeholder = VirtualAlloc2FromApp(\n      process, base_address, length, MEM_RESERVE | MEM_RESERVE_PLACEHOLDER,\n      PAGE_NOACCESS, nullptr, 0);\n  if (!placeholder) {\n    return nullptr;\n  }\n  void* mapping = MapViewOfFile3FromApp(\n      handle, process, placeholder, ULONG64(file_offset), length,\n      MEM_REPLACE_PLACEHOLDER, ULONG(ToWin32ProtectFlags(access)), nullptr, 0);\n  if (!mapping) {\n    VirtualFree(placeholder, length, MEM_RELEASE);\n    return nullptr;\n  }\n  return mapping;\n#endif\n}\n\nbool UnmapFileView(FileMappingHandle handle, void* base_address,\n                   size_t length) {\n  return UnmapViewOfFile(base_address) ? true : false;\n}\n\n}  // namespace memory\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/base/mutex.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2015 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/mutex.h\"\n\nnamespace xe {\n\nstd::recursive_mutex& global_critical_region::mutex() {\n  static std::recursive_mutex global_mutex;\n  return global_mutex;\n}\n\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/base/mutex.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2015 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_BASE_MUTEX_H_\n#define XENIA_BASE_MUTEX_H_\n\n#include <mutex>\n\nnamespace xe {\n\n// The global critical region mutex singleton.\n// This must guard any operation that may suspend threads or be sensitive to\n// being suspended such as global table locks and such.\n// To prevent deadlocks this should be the first lock acquired and be held\n// for the entire duration of the critical region (longer than any other lock).\n//\n// As a general rule if some code can only be accessed from the guest you can\n// guard it with only the global critical region and be assured nothing else\n// will touch it. If it will be accessed from non-guest threads you may need\n// some additional protection.\n//\n// You can think of this as disabling interrupts in the guest. The thread in the\n// global critical region has exclusive access to the entire system and cannot\n// be preempted. This also means that all activity done while in the critical\n// region must be extremely fast (no IO!), as it has the chance to block any\n// other thread until its done.\n//\n// For example, in the following situation thread 1 will not be able to suspend\n// thread 0 until it has exited its critical region, preventing it from being\n// suspended while holding the table lock:\n//   [thread 0]:\n//     DoKernelStuff():\n//       auto global_lock = global_critical_region_.Acquire();\n//       std::lock_guard<std::mutex> table_lock(table_mutex_);\n//       table_->InsertStuff();\n//   [thread 1]:\n//     MySuspendThread():\n//       auto global_lock = global_critical_region_.Acquire();\n//       ::SuspendThread(thread0);\n//\n// To use the region it's strongly recommended that you keep an instance near\n// the data requiring it. This makes it clear to those reading that the data\n// is protected by the global critical region. For example:\n// class MyType {\n//   // Implies my_list_ is protected:\n//   xe::global_critical_region global_critical_region_;\n//   std::list<...> my_list_;\n// };\nclass global_critical_region {\n public:\n  static std::recursive_mutex& mutex();\n\n  // Acquires a lock on the global critical section.\n  // Use this when keeping an instance is not possible. Otherwise, prefer\n  // to keep an instance of global_critical_region near the members requiring\n  // it to keep things readable.\n  static std::unique_lock<std::recursive_mutex> AcquireDirect() {\n    return std::unique_lock<std::recursive_mutex>(mutex());\n  }\n\n  // Acquires a lock on the global critical section.\n  inline std::unique_lock<std::recursive_mutex> Acquire() {\n    return std::unique_lock<std::recursive_mutex>(mutex());\n  }\n\n  // Acquires a deferred lock on the global critical section.\n  inline std::unique_lock<std::recursive_mutex> AcquireDeferred() {\n    return std::unique_lock<std::recursive_mutex>(mutex(), std::defer_lock);\n  }\n\n  // Tries to acquire a lock on the glboal critical section.\n  // Check owns_lock() to see if the lock was successfully acquired.\n  inline std::unique_lock<std::recursive_mutex> TryAcquire() {\n    return std::unique_lock<std::recursive_mutex>(mutex(), std::try_to_lock);\n  }\n};\n\n}  // namespace xe\n\n#endif  // XENIA_BASE_MUTEX_H_\n"
  },
  {
    "path": "src/xenia/base/platform.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_BASE_PLATFORM_H_\n#define XENIA_BASE_PLATFORM_H_\n\n// This file contains the main platform switches used by xenia as well as any\n// fixups required to normalize the environment. Everything in here should be\n// largely portable.\n// Platform-specific headers, like platform_win.h, are used to house any\n// super platform-specific stuff that implies code is not platform-agnostic.\n//\n// NOTE: ordering matters here as sometimes multiple flags are defined on\n// certain platforms.\n//\n// Great resource on predefined macros:\n// https://sourceforge.net/p/predef/wiki/OperatingSystems/\n// Original link: https://predef.sourceforge.net/preos.html\n\n#if defined(__APPLE__)\n#include <TargetConditionals.h>\n#endif\n\n#if defined(TARGET_OS_MAC) && TARGET_OS_MAC\n#define XE_PLATFORM_MAC 1\n#elif defined(WIN32) || defined(_WIN32)\n#define XE_PLATFORM_WIN32 1\n#elif defined(__ANDROID__)\n#define XE_PLATFORM_ANDROID 1\n#define XE_PLATFORM_LINUX 1\n#elif defined(__gnu_linux__)\n#define XE_PLATFORM_GNU_LINUX 1\n#define XE_PLATFORM_LINUX 1\n#else\n#error Unsupported target OS.\n#endif\n\n#if defined(__clang__)\n#define XE_COMPILER_CLANG 1\n#elif defined(__GNUC__)\n#define XE_COMPILER_GNUC 1\n#elif defined(_MSC_VER)\n#define XE_COMPILER_MSVC 1\n#elif defined(__MINGW32)\n#define XE_COMPILER_MINGW32 1\n#elif defined(__INTEL_COMPILER)\n#define XE_COMPILER_INTEL 1\n#else\n#define XE_COMPILER_UNKNOWN 1\n#endif\n\n#if defined(_M_AMD64) || defined(__amd64__)\n#define XE_ARCH_AMD64 1\n#elif defined(_M_ARM64) || defined(__aarch64__)\n#define XE_ARCH_ARM64 1\n#elif defined(_M_IX86) || defined(__i386__) || defined(_M_ARM) || \\\n    defined(__arm__)\n#error Xenia is not supported on 32-bit platforms.\n#elif defined(_M_PPC) || defined(__powerpc__)\n#define XE_ARCH_PPC 1\n#endif\n\n#if XE_PLATFORM_WIN32\n#define WIN32_LEAN_AND_MEAN\n#define NOMINMAX  // Don't want windows.h including min/max macros.\n#endif            // XE_PLATFORM_WIN32\n\n#if XE_PLATFORM_WIN32\n#include <intrin.h>\n#elif XE_ARCH_AMD64\n#include <x86intrin.h>\n#endif  // XE_PLATFORM_WIN32\n\n#if XE_PLATFORM_MAC\n#include <libkern/OSByteOrder.h>\n#endif  // XE_PLATFORM_MAC\n\n#if XE_COMPILER_MSVC\n#define _XEPACKEDSCOPE(body) __pragma(pack(push, 1)) body __pragma(pack(pop));\n#else\n#define _XEPACKEDSCOPE(body)     \\\n  _Pragma(\"pack(push, 1)\") body; \\\n  _Pragma(\"pack(pop)\");\n#endif  // XE_PLATFORM_WIN32\n\n#define XEPACKEDSTRUCT(name, value) _XEPACKEDSCOPE(struct name value)\n#define XEPACKEDSTRUCTANONYMOUS(value) _XEPACKEDSCOPE(struct value)\n#define XEPACKEDUNION(name, value) _XEPACKEDSCOPE(union name value)\n\nnamespace xe {\n\n#if XE_PLATFORM_WIN32\nconst char kPathSeparator = '\\\\';\n#else\nconst char kPathSeparator = '/';\n#endif  // XE_PLATFORM_WIN32\n\nconst char kGuestPathSeparator = '\\\\';\n\n}  // namespace xe\n\n#endif  // XENIA_BASE_PLATFORM_H_\n"
  },
  {
    "path": "src/xenia/base/platform_linux.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_BASE_PLATFORM_LINUX_H_\n#define XENIA_BASE_PLATFORM_LINUX_H_\n\n// NOTE: if you're including this file it means you are explicitly depending\n// on Linux headers. Including this file outside of linux platform specific\n// source code will break portability\n#include <cstddef>\n\n#include \"xenia/base/platform.h\"\n\n#endif  // XENIA_BASE_PLATFORM_LINUX_H_\n"
  },
  {
    "path": "src/xenia/base/platform_win.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2015 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_BASE_PLATFORM_WIN_H_\n#define XENIA_BASE_PLATFORM_WIN_H_\n\n// NOTE: if you're including this file it means you are explicitly depending\n// on Windows-specific headers. This is bad for portability and should be\n// avoided!\n\n#include \"xenia/base/platform.h\"\n\n#ifndef WIN32_LEAN_AND_MEAN\n#define WIN32_LEAN_AND_MEAN\n#endif\n#define NOMINMAX\n#include <ObjBase.h>\n#include <SDKDDKVer.h>\n#include <bcrypt.h>\n#include <dwmapi.h>\n#include <shellapi.h>\n#include <shlwapi.h>\n#include <shobjidl.h>\n#include <tpcshrd.h>\n#include <windows.h>\n#include <windowsx.h>\n#undef DeleteBitmap\n#undef DeleteFile\n#undef GetFirstChild\n\n#endif  // XENIA_BASE_PLATFORM_WIN_H_\n"
  },
  {
    "path": "src/xenia/base/premake5.lua",
    "content": "project_root = \"../../..\"\ninclude(project_root..\"/tools/build\")\n\nproject(\"xenia-base\")\n  uuid(\"aeadaf22-2b20-4941-b05f-a802d5679c11\")\n  kind(\"StaticLib\")\n  language(\"C++\")\n  links({\n    \"fmt\",\n  })\n  defines({\n  })\n  local_platform_files()\n  removefiles({\"console_app_main_*.cc\"})\n  removefiles({\"main_init_*.cc\"})\n  files({\n    \"debug_visualizers.natvis\",\n  })\n\ninclude(\"testing\")\n"
  },
  {
    "path": "src/xenia/base/profiling.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include <algorithm>\n#include <string>\n\n// NOTE: this must be included before microprofile as macro expansion needs\n// XELOGI.\n#include \"xenia/base/logging.h\"\n\n#include \"third_party/fmt/include/fmt/printf.h\"\n\n// NOTE: microprofile must be setup first, before profiling.h is included.\n#define MICROPROFILE_ENABLED 1\n#define MICROPROFILEUI_ENABLED 1\n#define MICROPROFILE_IMPL 1\n#define MICROPROFILEUI_IMPL 1\n#define MICROPROFILE_PER_THREAD_BUFFER_SIZE (1024 * 1024 * 10)\n#define MICROPROFILE_USE_THREAD_NAME_CALLBACK 1\n#define MICROPROFILE_WEBSERVER_MAXFRAMES 3\n#define MICROPROFILE_PRINTF(...)                               \\\n  do {                                                         \\\n    auto xenia_profiler_formatted = fmt::sprintf(__VA_ARGS__); \\\n    XELOGI(\"{}\", xenia_profiler_formatted);                    \\\n  } while (false);\n#define MICROPROFILE_WEBSERVER 0\n#define MICROPROFILE_DEBUG 0\n#define MICROPROFILE_MAX_THREADS 128\n#include \"third_party/microprofile/microprofile.h\"\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/cvar.h\"\n#include \"xenia/base/profiling.h\"\n#include \"xenia/ui/ui_event.h\"\n#include \"xenia/ui/virtual_key.h\"\n#include \"xenia/ui/window.h\"\n\n#if XE_OPTION_PROFILING\n#include \"third_party/microprofile/microprofileui.h\"\n#endif  // XE_OPTION_PROFILING\n\n#if XE_OPTION_PROFILING_UI\n#include \"xenia/ui/microprofile_drawer.h\"\n#endif  // XE_OPTION_PROFILING_UI\n\nDEFINE_bool(profiler_dpi_scaling, false,\n            \"Apply window DPI scaling to the profiler.\", \"UI\");\nDEFINE_bool(show_profiler, false, \"Show profiling UI by default.\", \"UI\");\n\nnamespace xe {\n\n#if XE_OPTION_PROFILING\n\nProfiler::ProfilerWindowInputListener Profiler::input_listener_;\nsize_t Profiler::z_order_ = 0;\nui::Window* Profiler::window_ = nullptr;\n#if XE_OPTION_PROFILING_UI\nProfiler::ProfilerUIDrawer Profiler::ui_drawer_;\nui::Presenter* Profiler::presenter_ = nullptr;\nstd::unique_ptr<ui::MicroprofileDrawer> Profiler::drawer_;\nbool Profiler::dpi_scaling_ = false;\n#endif  // XE_OPTION_PROFILING_UI\n\nbool Profiler::is_enabled() { return true; }\n\nbool Profiler::is_visible() { return is_enabled() && MicroProfileIsDrawing(); }\n\nvoid Profiler::Initialize() {\n  // Custom groups.\n  MicroProfileSetEnableAllGroups(false);\n  MicroProfileForceEnableGroup(\"apu\", MicroProfileTokenTypeCpu);\n  MicroProfileForceEnableGroup(\"cpu\", MicroProfileTokenTypeCpu);\n  MicroProfileForceEnableGroup(\"gpu\", MicroProfileTokenTypeCpu);\n  MicroProfileForceEnableGroup(\"internal\", MicroProfileTokenTypeCpu);\n  g_MicroProfile.nGroupMask = g_MicroProfile.nForceGroup;\n  g_MicroProfile.nActiveGroup = g_MicroProfile.nActiveGroupWanted =\n      g_MicroProfile.nGroupMask;\n\n  // Custom timers: time, average.\n  g_MicroProfile.nBars |= 0x1 | 0x2;\n  g_MicroProfile.nActiveBars |= 0x1 | 0x2;\n\n#if XE_OPTION_PROFILING_UI\n  dpi_scaling_ = cvars::profiler_dpi_scaling;\n  MicroProfileInitUI();\n  g_MicroProfileUI.bShowSpikes = true;\n  g_MicroProfileUI.nOpacityBackground = 0x40u << 24;\n  g_MicroProfileUI.nOpacityForeground = 0xc0u << 24;\n  if (cvars::show_profiler) {\n    MicroProfileSetDisplayMode(1);\n  }\n#else\n  MicroProfileSetForceEnable(true);\n  MicroProfileSetEnableAllGroups(true);\n  MicroProfileSetForceMetaCounters(false);\n#endif  // XE_OPTION_PROFILING_UI\n}\n\nvoid Profiler::Dump() {\n#if XE_OPTION_PROFILING_UI\n  MicroProfileDumpTimers();\n#endif  // XE_OPTION_PROFILING_UI\n  // MicroProfileDumpHtml(\"profile.html\");\n  // MicroProfileDumpHtmlToFile();\n}\n\nvoid Profiler::Shutdown() {\n  SetUserIO(0, nullptr, nullptr, nullptr);\n  window_ = nullptr;\n  MicroProfileShutdown();\n}\n\nuint32_t Profiler::GetColor(const char* str) {\n  std::hash<std::string> fn;\n  size_t value = fn(str);\n  return value & 0xFFFFFF;\n}\n\nvoid Profiler::ThreadEnter(const char* name) {\n  MicroProfileOnThreadCreate(name);\n}\n\nvoid Profiler::ThreadExit() { MicroProfileOnThreadExit(); }\n\nvoid Profiler::ProfilerWindowInputListener::OnKeyDown(ui::KeyEvent& e) {\n  // https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx\n  bool handled = true;\n  switch (e.virtual_key()) {\n    case ui::VirtualKey::kOem3:  // `\n      MicroProfileTogglePause();\n      break;\n#if XE_OPTION_PROFILING_UI\n    case ui::VirtualKey::kTab:\n      ToggleDisplay();\n      break;\n    case ui::VirtualKey::k1:\n      MicroProfileModKey(1);\n      break;\n#endif  // XE_OPTION_PROFILING_UI\n    default:\n      handled = false;\n      break;\n  }\n  if (handled) {\n    e.set_handled(true);\n  }\n  PostInputEvent();\n}\n\nvoid Profiler::ProfilerWindowInputListener::OnKeyUp(ui::KeyEvent& e) {\n  bool handled = true;\n  switch (e.virtual_key()) {\n#if XE_OPTION_PROFILING_UI\n    case ui::VirtualKey::k1:\n      MicroProfileModKey(0);\n      break;\n#endif  // XE_OPTION_PROFILING_UI\n    default:\n      handled = false;\n      break;\n  }\n  if (handled) {\n    e.set_handled(true);\n  }\n  PostInputEvent();\n}\n\n#if XE_OPTION_PROFILING_UI\n\nvoid Profiler::ProfilerWindowInputListener::OnMouseDown(ui::MouseEvent& e) {\n  Profiler::SetMousePosition(e.x(), e.y(), 0);\n  MicroProfileMouseButton(e.button() == ui::MouseEvent::Button::kLeft,\n                          e.button() == ui::MouseEvent::Button::kRight);\n  e.set_handled(true);\n  PostInputEvent();\n}\n\nvoid Profiler::ProfilerWindowInputListener::OnMouseUp(ui::MouseEvent& e) {\n  Profiler::SetMousePosition(e.x(), e.y(), 0);\n  MicroProfileMouseButton(0, 0);\n  e.set_handled(true);\n  PostInputEvent();\n}\n\nvoid Profiler::ProfilerWindowInputListener::OnMouseMove(ui::MouseEvent& e) {\n  Profiler::SetMousePosition(e.x(), e.y(), 0);\n  e.set_handled(true);\n  PostInputEvent();\n}\n\nvoid Profiler::ProfilerWindowInputListener::OnMouseWheel(ui::MouseEvent& e) {\n  Profiler::SetMousePosition(e.x(), e.y(), e.scroll_y());\n  e.set_handled(true);\n  PostInputEvent();\n}\n\nvoid Profiler::TogglePause() { MicroProfileTogglePause(); }\n\n#else\n\nvoid Profiler::TogglePause() {}\n\n#endif  // XE_OPTION_PROFILING_UI\n\nvoid Profiler::ToggleDisplay() {\n  bool was_visible = is_visible();\n  MicroProfileToggleDisplayMode();\n  if (is_visible() != was_visible) {\n    if (window_) {\n      if (was_visible) {\n        window_->RemoveInputListener(&input_listener_);\n      } else {\n        window_->AddInputListener(&input_listener_, z_order_);\n      }\n    }\n#if XE_OPTION_PROFILING_UI\n    if (presenter_) {\n      if (was_visible) {\n        presenter_->RemoveUIDrawerFromUIThread(&ui_drawer_);\n      } else {\n        presenter_->AddUIDrawerFromUIThread(&ui_drawer_, z_order_);\n      }\n    }\n#endif  // XE_OPTION_PROFILING_UI\n  }\n}\n\nvoid Profiler::SetUserIO(size_t z_order, ui::Window* window,\n                         ui::Presenter* presenter,\n                         ui::ImmediateDrawer* immediate_drawer) {\n#if XE_OPTION_PROFILING_UI\n  if (presenter_ && is_visible()) {\n    presenter_->RemoveUIDrawerFromUIThread(&ui_drawer_);\n  }\n  drawer_.reset();\n  presenter_ = nullptr;\n#endif  // XE_OPTION_PROFILING_UI\n\n  if (window_) {\n    if (is_visible()) {\n      window_->RemoveInputListener(&input_listener_);\n    }\n    window_ = nullptr;\n  }\n\n  if (!window) {\n    return;\n  }\n\n  z_order_ = z_order;\n  window_ = window;\n\n#if XE_OPTION_PROFILING_UI\n  if (presenter && immediate_drawer) {\n    presenter_ = presenter;\n    drawer_ = std::make_unique<ui::MicroprofileDrawer>(immediate_drawer);\n  }\n#endif  // XE_OPTION_PROFILING_UI\n\n  if (is_visible()) {\n    window_->AddInputListener(&input_listener_, z_order_);\n#if XE_OPTION_PROFILING_UI\n    if (presenter_) {\n      presenter_->AddUIDrawerFromUIThread(&ui_drawer_, z_order_);\n    }\n#endif  // XE_OPTION_PROFILING_UI\n  }\n}\n\nvoid Profiler::Flip() {\n  MicroProfileFlip();\n  // This can be called from non-UI threads, so not trying to access the drawer\n  // to trigger redraw here as it's owned and managed exclusively by the UI\n  // thread. Relying on continuous painting currently.\n}\n\n#if XE_OPTION_PROFILING_UI\nvoid Profiler::ProfilerUIDrawer::Draw(ui::UIDrawContext& ui_draw_context) {\n  if (!window_ || !presenter_ || !drawer_) {\n    return;\n  }\n  SCOPE_profile_cpu_f(\"internal\");\n  uint32_t coordinate_space_width = dpi_scaling_\n                                        ? window_->GetActualLogicalWidth()\n                                        : window_->GetActualPhysicalWidth();\n  uint32_t coordinate_space_height = dpi_scaling_\n                                         ? window_->GetActualLogicalHeight()\n                                         : window_->GetActualPhysicalHeight();\n  drawer_->Begin(ui_draw_context, coordinate_space_width,\n                 coordinate_space_height);\n  MicroProfileDraw(coordinate_space_width, coordinate_space_height);\n  drawer_->End();\n  // Continuous repaint.\n  if (is_visible()) {\n    presenter_->RequestUIPaintFromUIThread();\n  }\n}\n#endif  // XE_OPTION_PROFILING_UI\n\n#if XE_OPTION_PROFILING_UI\nvoid Profiler::SetMousePosition(int32_t x, int32_t y, int32_t wheel_delta) {\n  if (!window_) {\n    return;\n  }\n  if (dpi_scaling_) {\n    x = window_->PositionToLogical(x);\n    y = window_->PositionToLogical(y);\n  }\n  MicroProfileMousePosition(uint32_t(std::max(int32_t(0), x)),\n                            uint32_t(std::max(int32_t(0), y)), wheel_delta);\n}\n#endif  // XE_OPTION_PROFILING_UI\n\nvoid Profiler::PostInputEvent() {\n  // The profiler can be hidden from within the profiler (Mode > Off).\n  if (!is_visible()) {\n    window_->RemoveInputListener(&input_listener_);\n#if XE_OPTION_PROFILING_UI\n    if (presenter_) {\n      presenter_->RemoveUIDrawerFromUIThread(&ui_drawer_);\n    }\n#endif  // XE_OPTION_PROFILING_UI\n    return;\n  }\n  // Relying on continuous painting currently, no need to request drawing.\n}\n\n#else\n\nbool Profiler::is_enabled() { return false; }\nbool Profiler::is_visible() { return false; }\nvoid Profiler::Initialize() {}\nvoid Profiler::Dump() {}\nvoid Profiler::Shutdown() {}\nuint32_t Profiler::GetColor(const char* str) { return 0; }\nvoid Profiler::ThreadEnter(const char* name) {}\nvoid Profiler::ThreadExit() {}\nvoid Profiler::ToggleDisplay() {}\nvoid Profiler::TogglePause() {}\nvoid Profiler::SetUserIO(size_t z_order, ui::Window* window,\n                         ui::Presenter* presenter,\n                         ui::ImmediateDrawer* immediate_drawer) {}\nvoid Profiler::Flip() {}\n\n#endif  // XE_OPTION_PROFILING\n\n}  // namespace xe\n\nuint32_t MicroProfileGpuInsertTimeStamp() { return 0; }\n\nconst char* MicroProfileGetThreadName() { return \"TODO: get thread name!\"; }\n\n#if XE_OPTION_PROFILING\n#if XE_OPTION_PROFILING_UI\n\nvoid MicroProfileDrawBox(int nX, int nY, int nX1, int nY1, uint32_t nColor,\n                         MicroProfileBoxType type) {\n  auto drawer = xe::Profiler::drawer();\n  if (!drawer) {\n    return;\n  }\n  drawer->DrawBox(nX, nY, nX1, nY1, nColor,\n                  static_cast<xe::ui::MicroprofileDrawer::BoxType>(type));\n}\n\nvoid MicroProfileDrawLine2D(uint32_t nVertices, float* pVertices,\n                            uint32_t nColor) {\n  auto drawer = xe::Profiler::drawer();\n  if (!drawer) {\n    return;\n  }\n  drawer->DrawLine2D(nVertices, pVertices, nColor);\n}\n\nvoid MicroProfileDrawText(int nX, int nY, uint32_t nColor, const char* pText,\n                          uint32_t nLen) {\n  auto drawer = xe::Profiler::drawer();\n  if (!drawer) {\n    return;\n  }\n  drawer->DrawTextString(nX, nY, nColor, pText, nLen);\n}\n\n#endif  // XE_OPTION_PROFILING_UI\n\n#endif  // XE_OPTION_PROFILING\n"
  },
  {
    "path": "src/xenia/base/profiling.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_BASE_PROFILING_H_\n#define XENIA_BASE_PROFILING_H_\n\n#include <cstddef>\n#include <cstdint>\n#include <memory>\n\n#include \"xenia/base/platform.h\"\n#include \"xenia/base/string.h\"\n#include \"xenia/ui/ui_drawer.h\"\n#include \"xenia/ui/virtual_key.h\"\n#include \"xenia/ui/window_listener.h\"\n\n#if XE_PLATFORM_WIN32\n#define XE_OPTION_PROFILING 1\n#define XE_OPTION_PROFILING_UI 1\n#else\n#define XE_OPTION_PROFILING 0\n#endif  // XE_PLATFORM_WIN32\n\n#if XE_OPTION_PROFILING\n// Pollutes the global namespace. Yuck.\n#define MICROPROFILE_MAX_THREADS 128\n#include <microprofile/microprofile.h>\n#endif  // XE_OPTION_PROFILING\n\nnamespace xe {\nnamespace ui {\nclass ImmediateDrawer;\nclass MicroprofileDrawer;\nclass Presenter;\nclass Window;\n}  // namespace ui\n}  // namespace xe\n\nnamespace xe {\n\n#if XE_OPTION_PROFILING\n\n// Defines a profiling scope for CPU tasks.\n// Use `SCOPE_profile_cpu(name)` to activate the scope.\n#define DEFINE_profile_cpu(name, group_name, scope_name) \\\n  MICROPROFILE_DEFINE(name, group_name, scope_name,      \\\n                      xe::Profiler::GetColor(scope_name))\n\n// Declares a previously defined profile scope. Use in a translation unit.\n#define DECLARE_profile_cpu(name) MICROPROFILE_DECLARE(name)\n\n// Defines a profiling scope for GPU tasks.\n// Use `COUNT_profile_gpu(name)` to activate the scope.\n#define DEFINE_profile_gpu(name, group_name, scope_name) \\\n  MICROPROFILE_DEFINE_GPU(name, group_name, scope_name,  \\\n                          xe::Profiler::GetColor(scope_name))\n\n// Declares a previously defined profile scope. Use in a translation unit.\n#define DECLARE_profile_gpu(name) MICROPROFILE_DECLARE_GPU(name)\n\n// Enters a previously defined CPU profiling scope, active for the duration\n// of the containing block.\n#define SCOPE_profile_cpu(name) MICROPROFILE_SCOPE(name)\n\n// Enters a CPU profiling scope, active for the duration of the containing\n// block. No previous definition required.\n#define SCOPE_profile_cpu_i(group_name, scope_name) \\\n  MICROPROFILE_SCOPEI(group_name, scope_name,       \\\n                      xe::Profiler::GetColor(scope_name))\n\n// Enters a CPU profiling scope by function name, active for the duration of\n// the containing block. No previous definition required.\n#define SCOPE_profile_cpu_f(group_name)         \\\n  MICROPROFILE_SCOPEI(group_name, __FUNCTION__, \\\n                      xe::Profiler::GetColor(__FUNCTION__))\n\n// Enters a previously defined GPU profiling scope, active for the duration\n// of the containing block.\n#define SCOPE_profile_gpu(name) MICROPROFILE_SCOPEGPU(name)\n\n// Enters a GPU profiling scope, active for the duration of the containing\n// block. No previous definition required.\n#define SCOPE_profile_gpu_i(group_name, scope_name) \\\n  MICROPROFILE_SCOPEGPUI(group_name, scope_name,    \\\n                         xe::Profiler::GetColor(scope_name))\n\n// Enters a GPU profiling scope by function name, active for the duration of\n// the containing block. No previous definition required.\n#define SCOPE_profile_gpu_f(group_name)            \\\n  MICROPROFILE_SCOPEGPUI(group_name, __FUNCTION__, \\\n                         xe::Profiler::GetColor(__FUNCTION__))\n\n// Adds a number to a counter\n#define COUNT_profile_add(name, count) MICROPROFILE_COUNTER_ADD(name, count)\n\n// Subtracts a number to a counter\n#define COUNT_profile_sub(name, count) MICROPROFILE_COUNTER_SUB(name, count)\n\n// Sets a counter's value\n#define COUNT_profile_set(name, count) MICROPROFILE_COUNTER_SET(name, count)\n\n// Tracks a CPU value counter.\n#define COUNT_profile_cpu(name, count) MICROPROFILE_META_CPU(name, count)\n\n// Tracks a GPU value counter.\n#define COUNT_profile_gpu(name, count) MICROPROFILE_META_GPU(name, count)\n\n#else\n\n#define DEFINE_profile_cpu(name, group_name, scope_name)\n#define DEFINE_profile_gpu(name, group_name, scope_name)\n#define DECLARE_profile_cpu(name)\n#define DECLARE_profile_gpu(name)\n#define SCOPE_profile_cpu(name) \\\n  do {                          \\\n  } while (false)\n#define SCOPE_profile_cpu_f(name) \\\n  do {                            \\\n  } while (false)\n#define SCOPE_profile_cpu_i(group_name, scope_name) \\\n  do {                                              \\\n  } while (false)\n#define SCOPE_profile_gpu(name) \\\n  do {                          \\\n  } while (false)\n#define SCOPE_profile_gpu_f(name) \\\n  do {                            \\\n  } while (false)\n#define SCOPE_profile_gpu_i(group_name, scope_name) \\\n  do {                                              \\\n  } while (false)\n#define COUNT_profile_add(name, count) \\\n  do {                                 \\\n  } while (false)\n#define COUNT_profile_sub(name, count) \\\n  do {                                 \\\n  } while (false)\n#define COUNT_profile_set(name, count) \\\n  do {                                 \\\n  } while (false)\n#define COUNT_profile_cpu(name, count) \\\n  do {                                 \\\n  } while (false)\n#define COUNT_profile_gpu(name, count) \\\n  do {                                 \\\n  } while (false)\n\n#ifndef MICROPROFILE_TEXT_WIDTH\n#define MICROPROFILE_TEXT_WIDTH 1\n#define MICROPROFILE_TEXT_HEIGHT 1\n#endif  // !MICROPROFILE_TEXT_WIDTH\n\n#endif  // XE_OPTION_PROFILING\n\nclass Profiler {\n public:\n  static bool is_enabled();\n  static bool is_visible();\n\n  // Initializes the profiler. Call at startup.\n  static void Initialize();\n  // Dumps data to stdout.\n  static void Dump();\n  // Cleans up profiling, releasing all memory.\n  static void Shutdown();\n\n  // Computes a color from the given string.\n  static uint32_t GetColor(const char* str);\n\n  // Activates the calling thread for profiling.\n  // This must be called immediately after launching a thread.\n  static void ThreadEnter(const char* name = nullptr);\n  // Deactivates the calling thread for profiling.\n  static void ThreadExit();\n\n  static void ToggleDisplay();\n  static void TogglePause();\n\n  // Initializes input for the given window and drawing for the given presenter\n  // and immediate drawer.\n  static void SetUserIO(size_t z_order, ui::Window* window,\n                        ui::Presenter* presenter,\n                        ui::ImmediateDrawer* immediate_drawer);\n  // Gets the current drawer, if any.\n  static ui::MicroprofileDrawer* drawer() {\n#if XE_OPTION_PROFILING_UI\n    return drawer_.get();\n#else\n    return nullptr;\n#endif\n  }\n  // Presents the profiler to the bound display, if any.\n  static void Present(ui::UIDrawContext& ui_draw_context);\n  // Starts a new frame on the profiler\n  static void Flip();\n\n private:\n#if XE_OPTION_PROFILING\n  class ProfilerWindowInputListener final : public ui::WindowInputListener {\n   public:\n    void OnKeyDown(ui::KeyEvent& e) override;\n    void OnKeyUp(ui::KeyEvent& e) override;\n#if XE_OPTION_PROFILING_UI\n    void OnMouseDown(ui::MouseEvent& e) override;\n    void OnMouseMove(ui::MouseEvent& e) override;\n    void OnMouseUp(ui::MouseEvent& e) override;\n    void OnMouseWheel(ui::MouseEvent& e) override;\n#endif  // XE_OPTION_PROFILING_UI\n  };\n  // For now, no need for OnDpiChanged in a WindowListener because redrawing is\n  // done continuously.\n\n#if XE_OPTION_PROFILING_UI\n  class ProfilerUIDrawer final : public ui::UIDrawer {\n   public:\n    void Draw(ui::UIDrawContext& context) override;\n  };\n#endif  // XE_OPTION_PROFILING_UI\n\n#if XE_OPTION_PROFILING_UI\n  static void SetMousePosition(int32_t x, int32_t y, int32_t wheel_delta);\n#endif  // XE_OPTION_PROFILING_UI\n  static void PostInputEvent();\n\n  static ProfilerWindowInputListener input_listener_;\n  static size_t z_order_;\n  static ui::Window* window_;\n#if XE_OPTION_PROFILING_UI\n  static ProfilerUIDrawer ui_drawer_;\n  static ui::Presenter* presenter_;\n  static std::unique_ptr<ui::MicroprofileDrawer> drawer_;\n  static bool dpi_scaling_;\n#endif  // XE_OPTION_PROFILING_UI\n#endif  // XE_OPTION_PROFILING\n};\n\n}  // namespace xe\n\n#endif  // XENIA_BASE_PROFILING_H_\n"
  },
  {
    "path": "src/xenia/base/reset_scope.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_BASE_RESET_SCOPE_H_\n#define XENIA_BASE_RESET_SCOPE_H_\n\nnamespace xe {\n\ntemplate <typename T>\nclass ResetScope {\n public:\n  explicit ResetScope(T* value) : value_(value) {}\n  ~ResetScope() {\n    if (value_) {\n      value_->Reset();\n    }\n  }\n\n private:\n  T* value_;\n};\n\ntemplate <typename T>\ninline ResetScope<T> make_reset_scope(T* value) {\n  return ResetScope<T>(value);\n}\n\ntemplate <typename T>\ninline ResetScope<T> make_reset_scope(const std::unique_ptr<T>& value) {\n  return ResetScope<T>(value.get());\n}\n\n}  // namespace xe\n\n#endif  // XENIA_BASE_RESET_SCOPE_H_\n"
  },
  {
    "path": "src/xenia/base/ring_buffer.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2015 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/ring_buffer.h\"\n\n#include <algorithm>\n#include <cstring>\n\nnamespace xe {\n\nRingBuffer::RingBuffer(uint8_t* buffer, size_t capacity)\n    : buffer_(buffer), capacity_(capacity) {}\n\nvoid RingBuffer::AdvanceRead(size_t count) {\n  if (read_offset_ + count < capacity_) {\n    read_offset_ += count;\n  } else {\n    size_t left_half = capacity_ - read_offset_;\n    size_t right_half = count - left_half;\n    read_offset_ = right_half;\n  }\n}\n\nvoid RingBuffer::AdvanceWrite(size_t count) {\n  if (write_offset_ + count < capacity_) {\n    write_offset_ += count;\n  } else {\n    size_t left_half = capacity_ - write_offset_;\n    size_t right_half = count - left_half;\n    write_offset_ = right_half;\n  }\n}\n\nRingBuffer::ReadRange RingBuffer::BeginRead(size_t count) {\n  count = std::min(count, capacity_);\n  if (!count) {\n    return {0};\n  }\n  if (read_offset_ + count < capacity_) {\n    return {buffer_ + read_offset_, count, nullptr, 0};\n  } else {\n    size_t left_half = capacity_ - read_offset_;\n    size_t right_half = count - left_half;\n    return {buffer_ + read_offset_, left_half, buffer_, right_half};\n  }\n}\n\nvoid RingBuffer::EndRead(ReadRange read_range) {\n  if (read_range.second) {\n    read_offset_ = read_range.second_length;\n  } else {\n    read_offset_ += read_range.first_length;\n  }\n}\n\nsize_t RingBuffer::Read(uint8_t* buffer, size_t count) {\n  count = std::min(count, capacity_);\n  if (!count) {\n    return 0;\n  }\n\n  // Sanity check: Make sure we don't read over the write offset.\n  if (read_offset_ < write_offset_) {\n    assert_true(read_offset_ + count <= write_offset_);\n  } else if (read_offset_ + count >= capacity_) {\n    size_t left_half = capacity_ - read_offset_;\n    assert_true(count - left_half <= write_offset_);\n  }\n\n  if (read_offset_ + count < capacity_) {\n    std::memcpy(buffer, buffer_ + read_offset_, count);\n    read_offset_ += count;\n  } else {\n    size_t left_half = capacity_ - read_offset_;\n    size_t right_half = count - left_half;\n    std::memcpy(buffer, buffer_ + read_offset_, left_half);\n    std::memcpy(buffer + left_half, buffer_, right_half);\n    read_offset_ = right_half;\n  }\n\n  return count;\n}\n\nsize_t RingBuffer::Write(const uint8_t* buffer, size_t count) {\n  count = std::min(count, capacity_);\n  if (!count) {\n    return 0;\n  }\n\n  // Sanity check: Make sure we don't write over the read offset.\n  if (write_offset_ < read_offset_) {\n    assert_true(write_offset_ + count <= read_offset_);\n  } else if (write_offset_ + count >= capacity_) {\n    size_t left_half = capacity_ - write_offset_;\n    assert_true(count - left_half <= read_offset_);\n  }\n\n  if (write_offset_ + count < capacity_) {\n    std::memcpy(buffer_ + write_offset_, buffer, count);\n    write_offset_ += count;\n  } else {\n    size_t left_half = capacity_ - write_offset_;\n    size_t right_half = count - left_half;\n    std::memcpy(buffer_ + write_offset_, buffer, left_half);\n    std::memcpy(buffer_, buffer + left_half, right_half);\n    write_offset_ = right_half;\n  }\n\n  return count;\n}\n\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/base/ring_buffer.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2015 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_BASE_RING_BUFFER_H_\n#define XENIA_BASE_RING_BUFFER_H_\n\n#include <cstdint>\n#include <string>\n#include <type_traits>\n#include <vector>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/byte_order.h\"\n\nnamespace xe {\n\nclass RingBuffer {\n public:\n  RingBuffer(uint8_t* buffer, size_t capacity);\n\n  uint8_t* buffer() const { return buffer_; }\n  size_t capacity() const { return capacity_; }\n  bool empty() const { return read_offset_ == write_offset_; }\n\n  size_t read_offset() const { return read_offset_; }\n  uintptr_t read_ptr() const { return uintptr_t(buffer_) + read_offset_; }\n  void set_read_offset(size_t offset) { read_offset_ = offset % capacity_; }\n  size_t read_count() const {\n    if (read_offset_ == write_offset_) {\n      return 0;\n    } else if (read_offset_ < write_offset_) {\n      return write_offset_ - read_offset_;\n    } else {\n      return (capacity_ - read_offset_) + write_offset_;\n    }\n  }\n\n  size_t write_offset() const { return write_offset_; }\n  uintptr_t write_ptr() const { return uintptr_t(buffer_) + write_offset_; }\n  void set_write_offset(size_t offset) { write_offset_ = offset % capacity_; }\n  size_t write_count() const {\n    if (read_offset_ == write_offset_) {\n      return capacity_;\n    } else if (write_offset_ < read_offset_) {\n      return read_offset_ - write_offset_;\n    } else {\n      return (capacity_ - write_offset_) + read_offset_;\n    }\n  }\n\n  void AdvanceRead(size_t count);\n  void AdvanceWrite(size_t count);\n\n  struct ReadRange {\n    const uint8_t* first;\n    size_t first_length;\n    const uint8_t* second;\n    size_t second_length;\n  };\n  ReadRange BeginRead(size_t count);\n  void EndRead(ReadRange read_range);\n\n  size_t Read(uint8_t* buffer, size_t count);\n  template <typename T>\n  size_t Read(T* buffer, size_t count) {\n    return Read(reinterpret_cast<uint8_t*>(buffer), count);\n  }\n\n  template <typename T>\n  T Read() {\n    static_assert(std::is_fundamental<T>::value,\n                  \"Immediate read only supports basic types!\");\n\n    T imm;\n    size_t read = Read(reinterpret_cast<uint8_t*>(&imm), sizeof(T));\n    assert_true(read == sizeof(T));\n    return imm;\n  }\n\n  template <typename T>\n  T ReadAndSwap() {\n    static_assert(std::is_fundamental<T>::value,\n                  \"Immediate read only supports basic types!\");\n\n    T imm;\n    size_t read = Read(reinterpret_cast<uint8_t*>(&imm), sizeof(T));\n    assert_true(read == sizeof(T));\n    imm = xe::byte_swap(imm);\n    return imm;\n  }\n\n  size_t Write(const uint8_t* buffer, size_t count);\n  template <typename T>\n  size_t Write(const T* buffer, size_t count) {\n    return Write(reinterpret_cast<const uint8_t*>(buffer), count);\n  }\n\n  template <typename T>\n  size_t Write(T& data) {\n    return Write(reinterpret_cast<const uint8_t*>(&data), sizeof(T));\n  }\n\n private:\n  uint8_t* buffer_ = nullptr;\n  size_t capacity_ = 0;\n  size_t read_offset_ = 0;\n  size_t write_offset_ = 0;\n};\n\n}  // namespace xe\n\n#endif  // XENIA_BASE_RING_BUFFER_H_\n"
  },
  {
    "path": "src/xenia/base/socket.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_BASE_SOCKET_H_\n#define XENIA_BASE_SOCKET_H_\n\n#include <cstdint>\n#include <functional>\n#include <memory>\n#include <string>\n#include <utility>\n#include <vector>\n\n#include \"xenia/base/threading.h\"\n\nnamespace xe {\n\n// An asynchronous bidirectional socket.\n// Sockets are wait-based and operate in a thread-free manner. Data may be\n// read from or written to a socket from any thread with the wait handle as\n// a mechanism to efficiently wait until new data is available.\n// Consumers should wait on the wait handle and when signalled poll to see\n// if the socket is still connected or new data is available. When reading\n// data Receive should be called until it returns 0 new bytes and then the\n// wait handle should be waited on until new data arrives.\nclass Socket {\n public:\n  // Synchronously connects to the given hostname:port.\n  static std::unique_ptr<Socket> Connect(std::string hostname, uint16_t port);\n\n  virtual ~Socket() = default;\n\n  // TODO(benvanik): socket info? remote IP? etc?\n\n  // Returns a wait handle that can be used to wait on incoming client data or\n  // status updates. When this handle is signalled consumers should poll for\n  // new data and react accordingly.\n  virtual xe::threading::WaitHandle* wait_handle() = 0;\n\n  // Returns true if the client is connected and can send/receive data.\n  virtual bool is_connected() = 0;\n\n  // Closes the socket.\n  // This will signal the wait handle.\n  virtual void Close() = 0;\n\n  // Receives incoming data up to the given capacity and returns the total\n  // number of bytes received.\n  // 0 is returned if there is no data available. -1 is returned if the client\n  // has been closed.\n  virtual size_t Receive(void* buffer, size_t buffer_capacity) = 0;\n\n  // Asynchronously sends a set of buffers.\n  // The buffers are copied and may be modified immediately after the function\n  // returns.\n  // Returns false if the socket is disconnected or the data cannot be sent.\n  virtual bool Send(const std::pair<const void*, size_t>* buffers,\n                    size_t buffer_count) = 0;\n\n  // Asynchronously sends a set of buffers.\n  // The buffers are copied and may be modified immediately after the function\n  // returns.\n  // Returns false if the socket is disconnected or the data cannot be sent.\n  bool Send(std::vector<std::pair<const void*, size_t>> buffers) {\n    return Send(buffers.data(), buffers.size());\n  }\n\n  // Asynchronously sends a buffer of data.\n  // The buffer is copied and may be modified immediately after the function\n  // returns.\n  // Returns false if the socket is disconnected or the data cannot be sent.\n  bool Send(const void* buffer, size_t buffer_length) {\n    auto buffer_list = std::make_pair(buffer, buffer_length);\n    return Send(&buffer_list, 1);\n  }\n\n  // Asynchronously sends a buffer of data.\n  // The buffer is copied and may be modified immediately after the function\n  // returns.\n  // Returns false if the socket is disconnected or the data cannot be sent.\n  bool Send(const std::vector<uint8_t>& buffer) {\n    auto buffer_list = std::make_pair(buffer.data(), buffer.size());\n    return Send(&buffer_list, 1);\n  }\n\n  // Asynchronously sends a string buffer.\n  // Returns false if the socket is disconnected or the data cannot be sent.\n  bool Send(const std::string_view value) {\n    return Send(value.data(), value.size());\n  }\n};\n\n// Runs a socket server on the specified local port.\n// The server accepts clients from a background thread until closed (by\n// deletion). Clients are not tied to their creating server and the server\n// may be closed while clients remain connected.\nclass SocketServer {\n public:\n  // Creates a new socket server bound to the given local port.\n  // The accept callback will be called from a random thread when a new client\n  // connects.\n  // Returns null if the server cannot be bound to the given port (in use, etc).\n  static std::unique_ptr<SocketServer> Create(\n      uint16_t port,\n      std::function<void(std::unique_ptr<Socket> client)> accept_callback);\n\n  virtual ~SocketServer() = default;\n};\n\n}  // namespace xe\n\n#endif  // XENIA_BASE_SOCKET_H_\n"
  },
  {
    "path": "src/xenia/base/socket_win.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/socket.h\"\n\n#include <mutex>\n#include <thread>\n\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/platform_win.h\"\n\n// winsock includes must come after platform_win.h:\n#include <mstcpip.h>   // NOLINT(build/include_order)\n#include <winsock2.h>  // NOLINT(build/include_order)\n#include <ws2tcpip.h>  // NOLINT(build/include_order)\n\nnamespace xe {\n\nvoid InitializeWinsock() {\n  static bool has_initialized = false;\n  if (!has_initialized) {\n    has_initialized = true;\n    WSADATA wsa_data;\n    WSAStartup(MAKEWORD(2, 2), &wsa_data);\n  }\n}\n\nclass Win32Socket : public Socket {\n public:\n  Win32Socket() = default;\n  ~Win32Socket() override { Close(); }\n\n  bool Connect(std::string hostname, uint16_t port) {\n    addrinfo hints = {0};\n    hints.ai_family = AF_UNSPEC;\n    hints.ai_socktype = SOCK_STREAM;\n    hints.ai_protocol = IPPROTO_TCP;\n\n    // Resolve the server address and port.\n    // May return multiple results, so attempt to connect to an address until\n    // one succeeds.\n    addrinfo* result = nullptr;\n    auto port_string = std::to_string(port);\n    int ret =\n        getaddrinfo(hostname.c_str(), port_string.c_str(), &hints, &result);\n    if (ret != 0) {\n      XELOGE(\"getaddrinfo failed with error: {}\", ret);\n      return false;\n    }\n    SOCKET try_socket = INVALID_SOCKET;\n    for (addrinfo* ptr = result; ptr; ptr = ptr->ai_next) {\n      // Create a SOCKET for connecting to server.\n      try_socket = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol);\n      if (try_socket == INVALID_SOCKET) {\n        XELOGE(\"socket failed with error: {}\", WSAGetLastError());\n        freeaddrinfo(result);\n        return false;\n      }\n      // Connect to server.\n      ret =\n          connect(try_socket, ptr->ai_addr, static_cast<int>(ptr->ai_addrlen));\n      if (ret == SOCKET_ERROR) {\n        closesocket(try_socket);\n        try_socket = INVALID_SOCKET;\n        continue;\n      }\n      break;\n    }\n    freeaddrinfo(result);\n    if (try_socket == INVALID_SOCKET) {\n      XELOGE(\"Unable to connect to server\");\n      return false;\n    }\n\n    // Piggyback to setup the socket.\n    return Accept(try_socket);\n  }\n\n  bool Accept(SOCKET socket) {\n    std::lock_guard<std::recursive_mutex> lock(mutex_);\n\n    socket_ = socket;\n\n    // Create event and bind to the socket, waiting for read/close\n    // notifications.\n    // Set true to start so we'll force a query of the socket on first run.\n    event_ = xe::threading::Event::CreateManualResetEvent(true);\n    assert_not_null(event_);\n    WSAEventSelect(socket_, event_->native_handle(), FD_READ | FD_CLOSE);\n\n    // Keepalive for a looong time, as we may be paused by the debugger/etc.\n    struct tcp_keepalive alive;\n    alive.onoff = TRUE;\n    alive.keepalivetime = 7200000;\n    alive.keepaliveinterval = 6000;\n    DWORD bytes_returned;\n    WSAIoctl(socket_, SIO_KEEPALIVE_VALS, &alive, sizeof(alive), nullptr, 0,\n             &bytes_returned, nullptr, nullptr);\n\n    return true;\n  }\n\n  xe::threading::WaitHandle* wait_handle() override { return event_.get(); }\n\n  bool is_connected() override {\n    std::lock_guard<std::recursive_mutex> lock(mutex_);\n    return socket_ != INVALID_SOCKET;\n  }\n\n  void Close() override {\n    std::lock_guard<std::recursive_mutex> lock(mutex_);\n\n    if (socket_ != INVALID_SOCKET) {\n      SOCKET socket = socket_;\n      socket_ = INVALID_SOCKET;\n      shutdown(socket, SD_SEND);\n      closesocket(socket);\n    }\n\n    if (event_) {\n      // Set event so any future waits will immediately succeed.\n      event_->Set();\n    }\n  }\n\n  size_t Receive(void* buffer, size_t buffer_capacity) override {\n    std::lock_guard<std::recursive_mutex> lock(mutex_);\n\n    if (socket_ == INVALID_SOCKET) {\n      return -1;\n    }\n    int ret = recv(socket_, reinterpret_cast<char*>(buffer),\n                   static_cast<int>(buffer_capacity), 0);\n    if (ret == SOCKET_ERROR) {\n      int e = WSAGetLastError();\n      if (e == WSAEWOULDBLOCK) {\n        // Ok - no more data to read.\n        // Reset our event so we'll block next time.\n        event_->Reset();\n        return 0;\n      }\n      XELOGE(\"Socket send error: {}\", e);\n      Close();\n      return -1;\n    } else if (ret == 0) {\n      // Socket gracefully closed.\n      Close();\n      return -1;\n    }\n    return ret;\n  }\n\n  bool Send(const std::pair<const void*, size_t>* buffers,\n            size_t buffer_count) override {\n    std::lock_guard<std::recursive_mutex> lock(mutex_);\n\n    if (socket_ == INVALID_SOCKET) {\n      return false;\n    }\n    std::vector<WSABUF> buffer_data_list;\n    std::vector<DWORD> buffer_data_sent;\n    for (size_t i = 0; i < buffer_count; ++i) {\n      WSABUF buf;\n      buf.len = ULONG(buffers[i].second);\n      buf.buf = reinterpret_cast<char*>(const_cast<void*>(buffers[i].first));\n      buffer_data_list.emplace_back(buf);\n      buffer_data_sent.emplace_back(0);\n    }\n    int ret = WSASend(socket_, buffer_data_list.data(), DWORD(buffer_count),\n                      buffer_data_sent.data(), 0, nullptr, nullptr);\n    if (ret == SOCKET_ERROR) {\n      int e = WSAGetLastError();\n      XELOGE(\"Socket send error: {}\", e);\n      Close();\n      return false;\n    }\n    return true;\n  }\n\n private:\n  std::recursive_mutex mutex_;\n  SOCKET socket_ = INVALID_SOCKET;\n  std::unique_ptr<xe::threading::Event> event_;\n};\n\nstd::unique_ptr<Socket> Socket::Connect(std::string hostname, uint16_t port) {\n  InitializeWinsock();\n\n  auto socket = std::make_unique<Win32Socket>();\n  if (!socket->Connect(std::move(hostname), port)) {\n    return nullptr;\n  }\n  return std::unique_ptr<Socket>(socket.release());\n}\n\nclass Win32SocketServer : public SocketServer {\n public:\n  Win32SocketServer(\n      std::function<void(std::unique_ptr<Socket> client)> accept_callback)\n      : accept_callback_(std::move(accept_callback)) {}\n  ~Win32SocketServer() override {\n    if (socket_ != INVALID_SOCKET) {\n      SOCKET socket = socket_;\n      socket_ = INVALID_SOCKET;\n      linger so_linger;\n      so_linger.l_onoff = TRUE;\n      so_linger.l_linger = 30;\n      setsockopt(socket, SOL_SOCKET, SO_LINGER,\n                 reinterpret_cast<const char*>(&so_linger), sizeof(so_linger));\n      shutdown(socket, SD_SEND);\n      closesocket(socket);\n    }\n\n    if (accept_thread_) {\n      // Join thread, which should die because the socket is now invalid.\n      xe::threading::Wait(accept_thread_.get(), true);\n      accept_thread_.reset();\n    }\n  }\n\n  bool Bind(uint16_t port) {\n    socket_ = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);\n    if (socket_ < 1) {\n      XELOGE(\"Unable to create listen socket\");\n      return false;\n    }\n    struct tcp_keepalive alive;\n    alive.onoff = TRUE;\n    alive.keepalivetime = 7200000;\n    alive.keepaliveinterval = 6000;\n    DWORD bytes_returned;\n    WSAIoctl(socket_, SIO_KEEPALIVE_VALS, &alive, sizeof(alive), nullptr, 0,\n             &bytes_returned, nullptr, nullptr);\n    int opt_value = 1;\n    setsockopt(socket_, SOL_SOCKET, SO_REUSEADDR,\n               reinterpret_cast<const char*>(&opt_value), sizeof(opt_value));\n    opt_value = 1;\n    setsockopt(socket_, IPPROTO_TCP, TCP_NODELAY,\n               reinterpret_cast<const char*>(&opt_value), sizeof(opt_value));\n\n    sockaddr_in socket_addr = {0};\n    socket_addr.sin_family = AF_INET;\n    socket_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);\n    socket_addr.sin_port = htons(port);\n    if (bind(socket_, reinterpret_cast<sockaddr*>(&socket_addr),\n             sizeof(socket_addr)) == SOCKET_ERROR) {\n      int e = WSAGetLastError();\n      XELOGE(\"Unable to bind debug socket: {}\", e);\n      return false;\n    }\n    if (listen(socket_, 5) == SOCKET_ERROR) {\n      int e = WSAGetLastError();\n      XELOGE(\"Unable to listen on accept socket {}\", e);\n      return false;\n    }\n\n    accept_thread_ = xe::threading::Thread::Create({}, [this, port]() {\n      xe::threading::set_name(std::string(\"xe::SocketServer localhost:\") +\n                              std::to_string(port));\n      while (socket_ != INVALID_SOCKET) {\n        sockaddr_in6 client_addr;\n        int client_count = sizeof(client_addr);\n        SOCKET client_socket = accept(\n            socket_, reinterpret_cast<sockaddr*>(&client_addr), &client_count);\n        if (client_socket == INVALID_SOCKET) {\n          continue;\n        }\n\n        auto client = std::make_unique<Win32Socket>();\n        if (!client->Accept(client_socket)) {\n          XELOGE(\"Unable to accept socket; ignoring\");\n          continue;\n        }\n        accept_callback_(std::move(client));\n      }\n    });\n    assert_not_null(accept_thread_);\n\n    return true;\n  }\n\n private:\n  std::function<void(std::unique_ptr<Socket> client)> accept_callback_;\n  std::unique_ptr<xe::threading::Thread> accept_thread_;\n\n  SOCKET socket_ = INVALID_SOCKET;\n};\n\nstd::unique_ptr<SocketServer> SocketServer::Create(\n    uint16_t port,\n    std::function<void(std::unique_ptr<Socket> client)> accept_callback) {\n  InitializeWinsock();\n\n  auto socket_server =\n      std::make_unique<Win32SocketServer>(std::move(accept_callback));\n  if (!socket_server->Bind(port)) {\n    return nullptr;\n  }\n  return std::unique_ptr<SocketServer>(socket_server.release());\n}\n\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/base/string.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/string.h\"\n\n#include <string.h>\n#include <algorithm>\n#include <locale>\n\n#include \"xenia/base/platform.h\"\n\n#if !XE_PLATFORM_WIN32\n#include <strings.h>\n#endif  // !XE_PLATFORM_WIN32\n\n#define UTF_CPP_CPLUSPLUS 201703L\n#include \"third_party/utfcpp/source/utf8.h\"\n\nnamespace utfcpp = utf8;\n\nnamespace xe {\n\nint xe_strcasecmp(const char* string1, const char* string2) {\n#if XE_PLATFORM_WIN32\n  return _stricmp(string1, string2);\n#else\n  return strcasecmp(string1, string2);\n#endif  // XE_PLATFORM_WIN32\n}\n\nint xe_strncasecmp(const char* string1, const char* string2, size_t count) {\n#if XE_PLATFORM_WIN32\n  return _strnicmp(string1, string2, count);\n#else\n  return strncasecmp(string1, string2, count);\n#endif  // XE_PLATFORM_WIN32\n}\n\nchar* xe_strdup(const char* source) {\n#if XE_PLATFORM_WIN32\n  return _strdup(source);\n#else\n  return strdup(source);\n#endif  // XE_PLATFORM_WIN32\n}\n\nstd::string to_utf8(const std::u16string_view source) {\n  return utfcpp::utf16to8(source);\n}\n\nstd::u16string to_utf16(const std::string_view source) {\n  return utfcpp::utf8to16(source);\n}\n\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/base/string.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_BASE_STRING_H_\n#define XENIA_BASE_STRING_H_\n\n#include <string>\n\n#include \"xenia/base/utf8.h\"\n\nnamespace xe {\n\nint xe_strcasecmp(const char* string1, const char* string2);\nint xe_strncasecmp(const char* string1, const char* string2, size_t count);\nchar* xe_strdup(const char* source);\n\nstd::string to_utf8(const std::u16string_view source);\nstd::u16string to_utf16(const std::string_view source);\n\n}  // namespace xe\n\n#endif  // XENIA_BASE_STRING_H_\n"
  },
  {
    "path": "src/xenia/base/string_buffer.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/string_buffer.h\"\n\n#include <algorithm>\n#include <cstdarg>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/literals.h\"\n#include \"xenia/base/math.h\"\n\nnamespace xe {\n\nusing namespace xe::literals;\n\nStringBuffer::StringBuffer(size_t initial_capacity) {\n  buffer_capacity_ = std::max(initial_capacity, static_cast<size_t>(16_KiB));\n  buffer_ = reinterpret_cast<char*>(std::malloc(buffer_capacity_));\n  assert_not_null(buffer_);\n  buffer_[0] = 0;\n}\n\nStringBuffer::~StringBuffer() {\n  free(buffer_);\n  buffer_ = nullptr;\n}\n\nvoid StringBuffer::Reset() {\n  buffer_offset_ = 0;\n  buffer_[0] = 0;\n}\n\nvoid StringBuffer::Grow(size_t additional_length) {\n  if (buffer_offset_ + additional_length <= buffer_capacity_) {\n    return;\n  }\n  size_t old_capacity = buffer_capacity_;\n  size_t new_capacity =\n      std::max(xe::round_up(buffer_offset_ + additional_length, 16_KiB),\n               old_capacity * 2);\n  auto new_buffer = std::realloc(buffer_, new_capacity);\n  assert_not_null(new_buffer);\n  buffer_ = reinterpret_cast<char*>(new_buffer);\n  buffer_capacity_ = new_capacity;\n}\n\nvoid StringBuffer::Append(char c) {\n  AppendBytes(reinterpret_cast<const uint8_t*>(&c), 1);\n}\n\nvoid StringBuffer::Append(char c, size_t count) {\n  Grow(count + 1);\n  std::memset(buffer_ + buffer_offset_, c, count);\n  buffer_offset_ += count;\n  buffer_[buffer_offset_] = 0;\n}\n\nvoid StringBuffer::Append(const char* value) {\n  AppendBytes(reinterpret_cast<const uint8_t*>(value), std::strlen(value));\n}\n\nvoid StringBuffer::Append(const std::string_view value) {\n  AppendBytes(reinterpret_cast<const uint8_t*>(value.data()), value.size());\n}\n\nvoid StringBuffer::AppendVarargs(const char* format, va_list args) {\n  int result = vsnprintf(nullptr, 0, format, args);\n  if (result <= 0) {\n    return;\n  }\n  auto length = static_cast<size_t>(result);\n  Grow(length + 1);\n  vsnprintf(buffer_ + buffer_offset_, buffer_capacity_, format, args);\n  buffer_offset_ += length;\n  buffer_[buffer_offset_] = 0;\n}\n\nvoid StringBuffer::AppendBytes(const uint8_t* buffer, size_t length) {\n  Grow(length + 1);\n  memcpy(buffer_ + buffer_offset_, buffer, length);\n  buffer_offset_ += length;\n  buffer_[buffer_offset_] = 0;\n}\n\nstd::string StringBuffer::to_string() {\n  return std::string(buffer_, buffer_offset_);\n}\n\nstd::string_view StringBuffer::to_string_view() const {\n  return std::string_view(buffer_, buffer_offset_);\n}\n\nstd::vector<uint8_t> StringBuffer::to_bytes() const {\n  std::vector<uint8_t> bytes(buffer_offset_);\n  std::memcpy(bytes.data(), buffer_, buffer_offset_);\n  return bytes;\n}\n\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/base/string_buffer.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_BASE_STRING_BUFFER_H_\n#define XENIA_BASE_STRING_BUFFER_H_\n\n#include <cstdint>\n#include <string>\n#include <vector>\n\n#include \"third_party/fmt/include/fmt/format.h\"\n\nnamespace xe {\n\nclass StringBuffer {\n public:\n  explicit StringBuffer(size_t initial_capacity = 0);\n  ~StringBuffer();\n\n  char* buffer() const { return buffer_; }\n  size_t length() const { return buffer_offset_; }\n\n  void Reset();\n\n  void Append(char c);\n  void Append(char c, size_t count);\n  void Append(const char* value);\n  void Append(const std::string_view value);\n\n  template <typename... Args>\n  void AppendFormat(const char* format, const Args&... args) {\n    auto s = fmt::format(format, args...);\n    Append(s.c_str());\n  }\n\n  void AppendVarargs(const char* format, va_list args);\n  void AppendBytes(const uint8_t* buffer, size_t length);\n\n  std::string to_string();\n  std::string_view to_string_view() const;\n  std::vector<uint8_t> to_bytes() const;\n\n private:\n  void Grow(size_t additional_length);\n\n  char* buffer_ = nullptr;\n  size_t buffer_offset_ = 0;\n  size_t buffer_capacity_ = 0;\n};\n\n}  // namespace xe\n\n#endif  // XENIA_BASE_STRING_BUFFER_H_\n"
  },
  {
    "path": "src/xenia/base/string_key.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_BASE_STRING_KEY_H_\n#define XENIA_BASE_STRING_KEY_H_\n\n#include <string>\n#include <variant>\n\n#include \"utf8.h\"\n\nnamespace xe {\n\nnamespace internal {\n\nstruct string_key_base {\n private:\n  std::variant<std::string, std::string_view> value_;\n\n public:\n  explicit string_key_base(const std::string_view value) : value_(value) {}\n  explicit string_key_base(std::string value) : value_(std::move(value)) {}\n\n  std::string_view view() const {\n    return std::holds_alternative<std::string>(value_)\n               ? std::get<std::string>(value_)\n               : std::get<std::string_view>(value_);\n  }\n};\n\n}  // namespace internal\n\nstruct string_key : internal::string_key_base {\n public:\n  explicit string_key(const std::string_view value) : string_key_base(value) {}\n  explicit string_key(std::string value) : string_key_base(value) {}\n\n  static string_key create(const std::string_view value) {\n    return string_key(std::string(value));\n  }\n\n  static string_key create(std::string value) { return string_key(value); }\n\n  bool operator==(const string_key& other) const {\n    return other.view() == view();\n  }\n\n  size_t hash() const { return utf8::hash_fnv1a(view()); }\n\n  struct Hash {\n    size_t operator()(const string_key& t) const { return t.hash(); }\n  };\n};\n\nstruct string_key_case : internal::string_key_base {\n public:\n  explicit string_key_case(const std::string_view value)\n      : string_key_base(value) {}\n  explicit string_key_case(std::string value) : string_key_base(value) {}\n\n  static string_key_case create(const std::string_view value) {\n    return string_key_case(std::string(value));\n  }\n\n  static string_key_case create(std::string value) {\n    return string_key_case(value);\n  }\n\n  bool operator==(const string_key_case& other) const {\n    return utf8::equal_case(other.view(), view());\n  }\n\n  size_t hash() const { return utf8::hash_fnv1a_case(view()); }\n\n  struct Hash {\n    size_t operator()(const string_key_case& t) const { return t.hash(); }\n  };\n};\n\n}  // namespace xe\n\nnamespace std {\ntemplate <>\nstruct hash<xe::string_key> {\n  std::size_t operator()(const xe::string_key& t) const { return t.hash(); }\n};\n\ntemplate <>\nstruct hash<xe::string_key_case> {\n  std::size_t operator()(const xe::string_key_case& t) const {\n    return t.hash();\n  }\n};\n\n};  // namespace std\n\n#endif  // XENIA_BASE_STRING_KEY_H_\n"
  },
  {
    "path": "src/xenia/base/string_util.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_BASE_STRING_UTIL_H_\n#define XENIA_BASE_STRING_UTIL_H_\n\n#include <algorithm>\n#include <charconv>\n#include <cstddef>\n#include <cstring>\n#include <string>\n\n#include \"third_party/fmt/include/fmt/format.h\"\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/memory.h\"\n#include \"xenia/base/platform.h\"\n#include \"xenia/base/string.h\"\n#include \"xenia/base/vec128.h\"\n\n// TODO(gibbed): Clang and GCC don't have std::from_chars for floating point(!)\n// despite it being part of the C++17 standard. Check this in the future to see\n// if it's been resolved.\n\n#if XE_COMPILER_CLANG || XE_COMPILER_GNUC\n#include <cstdlib>\n#endif\n\nnamespace xe {\nnamespace string_util {\n\nenum class Safety {\n  IDontKnowWhatIAmDoing,\n  IKnowWhatIAmDoing,\n};\n\ninline size_t copy_truncating(char* dest, const std::string_view source,\n                              size_t dest_buffer_count) {\n  if (!dest_buffer_count) {\n    return 0;\n  }\n  size_t chars_copied = std::min(source.size(), dest_buffer_count - size_t(1));\n  std::memcpy(dest, source.data(), chars_copied);\n  dest[chars_copied] = '\\0';\n  return chars_copied;\n}\n\ninline size_t copy_truncating(char16_t* dest, const std::u16string_view source,\n                              size_t dest_buffer_count) {\n  if (!dest_buffer_count) {\n    return 0;\n  }\n  size_t chars_copied = std::min(source.size(), dest_buffer_count - size_t(1));\n  std::memcpy(dest, source.data(), chars_copied * sizeof(char16_t));\n  dest[chars_copied] = u'\\0';\n  return chars_copied;\n}\n\ninline size_t copy_and_swap_truncating(char16_t* dest,\n                                       const std::u16string_view source,\n                                       size_t dest_buffer_count) {\n  if (!dest_buffer_count) {\n    return 0;\n  }\n  size_t chars_copied = std::min(source.size(), dest_buffer_count - size_t(1));\n  xe::copy_and_swap(dest, source.data(), chars_copied);\n  dest[chars_copied] = u'\\0';\n  return chars_copied;\n}\n\ntemplate <Safety safety = Safety::IDontKnowWhatIAmDoing>\ninline size_t copy_maybe_truncating(char* dest, const std::string_view source,\n                                    size_t dest_buffer_count) {\n  static_assert(safety == Safety::IKnowWhatIAmDoing);\n  if (!dest_buffer_count) {\n    return 0;\n  }\n  size_t chars_copied = std::min(source.size(), dest_buffer_count);\n  std::memcpy(dest, source.data(), chars_copied);\n  return chars_copied;\n}\n\ntemplate <Safety safety = Safety::IDontKnowWhatIAmDoing>\ninline size_t copy_maybe_truncating(char16_t* dest,\n                                    const std::u16string_view source,\n                                    size_t dest_buffer_count) {\n  static_assert(safety == Safety::IKnowWhatIAmDoing);\n  if (!dest_buffer_count) {\n    return 0;\n  }\n  size_t chars_copied = std::min(source.size(), dest_buffer_count);\n  std::memcpy(dest, source.data(), chars_copied * sizeof(char16_t));\n  return chars_copied;\n}\n\ntemplate <Safety safety = Safety::IDontKnowWhatIAmDoing>\ninline size_t copy_and_swap_maybe_truncating(char16_t* dest,\n                                             const std::u16string_view source,\n                                             size_t dest_buffer_count) {\n  static_assert(safety == Safety::IKnowWhatIAmDoing);\n  if (!dest_buffer_count) {\n    return 0;\n  }\n  size_t chars_copied = std::min(source.size(), dest_buffer_count);\n  xe::copy_and_swap(dest, source.data(), chars_copied);\n  return chars_copied;\n}\n\ninline std::string to_hex_string(uint32_t value) {\n  return fmt::format(\"{:08X}\", value);\n}\n\ninline std::string to_hex_string(uint64_t value) {\n  return fmt::format(\"{:016X}\", value);\n}\n\ninline std::string to_hex_string(float value) {\n  static_assert(sizeof(uint32_t) == sizeof(value));\n  uint32_t pun;\n  std::memcpy(&pun, &value, sizeof(value));\n  return to_hex_string(pun);\n}\n\ninline std::string to_hex_string(double value) {\n  static_assert(sizeof(uint64_t) == sizeof(value));\n  uint64_t pun;\n  std::memcpy(&pun, &value, sizeof(value));\n  return to_hex_string(pun);\n}\n\ninline std::string to_hex_string(const vec128_t& value) {\n  return fmt::format(\"[{:08X} {:08X} {:08X} {:08X}]\", value.u32[0],\n                     value.u32[1], value.u32[2], value.u32[3]);\n}\n\ntemplate <typename T>\ninline T from_string(const std::string_view value, bool force_hex = false) {\n  // Missing implementation for converting type T from string\n  throw;\n}\n\nnamespace internal {\n\ntemplate <typename T, typename V = std::make_signed_t<T>>\ninline T make_negative(T value) {\n  if constexpr (std::is_unsigned_v<T>) {\n    value = static_cast<T>(-static_cast<V>(value));\n  } else {\n    value = -value;\n  }\n  return value;\n}\n\n// integral_from_string\ntemplate <typename T>\ninline T ifs(const std::string_view value, bool force_hex) {\n  int base = 10;\n  std::string_view range = value;\n  bool is_hex = force_hex;\n  bool is_negative = false;\n  if (utf8::starts_with(range, \"-\")) {\n    is_negative = true;\n    range = range.substr(1);\n  }\n  if (utf8::starts_with(range, \"0x\")) {\n    is_hex = true;\n    range = range.substr(2);\n  }\n  if (utf8::ends_with(range, \"h\")) {\n    is_hex = true;\n    range = range.substr(0, range.length() - 1);\n  }\n  T result;\n  if (is_hex) {\n    base = 16;\n  }\n  // TODO(gibbed): do something more with errors?\n  auto [p, error] =\n      std::from_chars(range.data(), range.data() + range.size(), result, base);\n  if (error != std::errc()) {\n    assert_always();\n    return T();\n  }\n  if (is_negative) {\n    result = make_negative(result);\n  }\n  return result;\n}\n\n// floating_point_from_string\ntemplate <typename T, typename PUN>\ninline T fpfs(const std::string_view value, bool force_hex) {\n  static_assert(sizeof(T) == sizeof(PUN));\n  std::string_view range = value;\n  bool is_hex = force_hex;\n  bool is_negative = false;\n  if (utf8::starts_with(range, \"-\")) {\n    is_negative = true;\n    range = range.substr(1);\n  }\n  if (utf8::starts_with(range, \"0x\")) {\n    is_hex = true;\n    range = range.substr(2);\n  }\n  if (utf8::ends_with(range, \"h\")) {\n    is_hex = true;\n    range = range.substr(0, range.length() - 1);\n  }\n  T result;\n  if (is_hex) {\n    PUN pun = from_string<PUN>(range, true);\n    if (is_negative) {\n      pun = make_negative(pun);\n    }\n    std::memcpy(&result, &pun, sizeof(PUN));\n  } else {\n#if XE_COMPILER_CLANG || XE_COMPILER_GNUC\n    auto temp = std::string(range);\n    result = std::strtod(temp.c_str(), nullptr);\n#else\n    auto [p, error] = std::from_chars(range.data(), range.data() + range.size(),\n                                      result, std::chars_format::general);\n    // TODO(gibbed): do something more with errors?\n    if (error != std::errc()) {\n      assert_always();\n      return T();\n    }\n#endif\n    if (is_negative) {\n      result = -result;\n    }\n  }\n  return result;\n}\n\n}  // namespace internal\n\ntemplate <>\ninline bool from_string<bool>(const std::string_view value, bool force_hex) {\n  return value == \"true\" || value == \"1\";\n}\n\ntemplate <>\ninline int8_t from_string<int8_t>(const std::string_view value,\n                                  bool force_hex) {\n  return internal::ifs<int8_t>(value, force_hex);\n}\n\ntemplate <>\ninline uint8_t from_string<uint8_t>(const std::string_view value,\n                                    bool force_hex) {\n  return internal::ifs<uint8_t>(value, force_hex);\n}\n\ntemplate <>\ninline int16_t from_string<int16_t>(const std::string_view value,\n                                    bool force_hex) {\n  return internal::ifs<int16_t>(value, force_hex);\n}\n\ntemplate <>\ninline uint16_t from_string<uint16_t>(const std::string_view value,\n                                      bool force_hex) {\n  return internal::ifs<uint16_t>(value, force_hex);\n}\n\ntemplate <>\ninline int32_t from_string<int32_t>(const std::string_view value,\n                                    bool force_hex) {\n  return internal::ifs<int32_t>(value, force_hex);\n}\n\ntemplate <>\ninline uint32_t from_string<uint32_t>(const std::string_view value,\n                                      bool force_hex) {\n  return internal::ifs<uint32_t>(value, force_hex);\n}\n\ntemplate <>\ninline int64_t from_string<int64_t>(const std::string_view value,\n                                    bool force_hex) {\n  return internal::ifs<int64_t>(value, force_hex);\n}\n\ntemplate <>\ninline uint64_t from_string<uint64_t>(const std::string_view value,\n                                      bool force_hex) {\n  return internal::ifs<uint64_t>(value, force_hex);\n}\n\ntemplate <>\ninline float from_string<float>(const std::string_view value, bool force_hex) {\n  return internal::fpfs<float, uint32_t>(value, force_hex);\n}\n\ntemplate <>\ninline double from_string<double>(const std::string_view value,\n                                  bool force_hex) {\n  return internal::fpfs<double, uint64_t>(value, force_hex);\n}\n\ntemplate <>\ninline vec128_t from_string<vec128_t>(const std::string_view value,\n                                      bool force_hex) {\n  if (!value.size()) {\n    return vec128_t();\n  }\n  vec128_t v;\n#if XE_COMPILER_CLANG || XE_COMPILER_GNUC\n  auto temp = std::string(value);\n  auto p = temp.c_str();\n  auto end = temp.c_str() + temp.size();\n#else\n  auto p = value.data();\n  auto end = value.data() + value.size();\n#endif\n  bool is_hex = force_hex;\n  if (p != end && *p == '[') {\n    is_hex = true;\n    ++p;\n  } else if (p != end && *p == '(') {\n    is_hex = false;\n    ++p;\n  } else {\n    // Assume hex?\n    is_hex = true;\n  }\n  if (p == end) {\n    assert_always();\n    return vec128_t();\n  }\n  if (is_hex) {\n    for (size_t i = 0; i < 4; i++) {\n      while (p != end && (*p == ' ' || *p == ',')) {\n        ++p;\n      }\n      if (p == end) {\n        assert_always();\n        return vec128_t();\n      }\n      auto result = std::from_chars(p, end, v.u32[i], 16);\n      if (result.ec != std::errc()) {\n        assert_always();\n        return vec128_t();\n      }\n      p = result.ptr;\n    }\n  } else {\n    for (size_t i = 0; i < 4; i++) {\n      while (p != end && (*p == ' ' || *p == ',')) {\n        ++p;\n      }\n      if (p == end) {\n        assert_always();\n        return vec128_t();\n      }\n#if XE_COMPILER_CLANG || XE_COMPILER_GNUC\n      char* next_p;\n      v.f32[i] = std::strtof(p, &next_p);\n      p = next_p;\n#else\n      auto result =\n          std::from_chars(p, end, v.f32[i], std::chars_format::general);\n      if (result.ec != std::errc()) {\n        assert_always();\n        return vec128_t();\n      }\n      p = result.ptr;\n#endif\n    }\n  }\n  return v;\n}\n\n}  // namespace string_util\n}  // namespace xe\n\n#endif  // XENIA_BASE_STRING_UTIL_H_\n"
  },
  {
    "path": "src/xenia/base/system.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_BASE_SYSTEM_H_\n#define XENIA_BASE_SYSTEM_H_\n\n#include <filesystem>\n#include <string_view>\n\n#include \"xenia/base/platform.h\"\n#include \"xenia/base/string.h\"\n\nnamespace xe {\n\n#if XE_PLATFORM_ANDROID\nbool InitializeAndroidSystemForApplicationContext();\nvoid ShutdownAndroidSystem();\n#endif\n\n// The URL must include the protocol.\nvoid LaunchWebBrowser(const std::string_view url);\nvoid LaunchFileExplorer(const std::filesystem::path& path);\n\nenum class SimpleMessageBoxType {\n  Help,\n  Warning,\n  Error,\n};\n\n// This is expected to block the caller until the message box is closed.\nvoid ShowSimpleMessageBox(SimpleMessageBoxType type, std::string_view message);\n\n}  // namespace xe\n\n#endif  // XENIA_BASE_SYSTEM_H_\n"
  },
  {
    "path": "src/xenia/base/system_android.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include <jni.h>\n#include <cstring>\n#include <string>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/main_android.h\"\n#include \"xenia/base/system.h\"\n\nnamespace xe {\n\n// To store method and field IDs persistently, global references to the classes\n// are required to prevent the classes from being unloaded and reloaded,\n// potentially changing the IDs.\n\nstatic jclass android_system_application_context_class_ = nullptr;\nstatic jmethodID android_system_application_context_start_activity_ = nullptr;\n\nstatic jclass android_system_uri_class_ = nullptr;\nstatic jmethodID android_system_uri_parse_ = nullptr;\n\nstatic jclass android_system_intent_class_ = nullptr;\nstatic jmethodID android_system_intent_init_action_uri_ = nullptr;\nstatic jmethodID android_system_intent_add_flags_ = nullptr;\nstatic jobject android_system_intent_action_view_ = nullptr;\nstatic jint android_system_intent_flag_activity_new_task_;\n\nstatic bool android_system_initialized_ = false;\n\nbool InitializeAndroidSystemForApplicationContext() {\n  assert_false(android_system_initialized_);\n\n  JNIEnv* jni_env = GetAndroidThreadJniEnv();\n  if (!jni_env) {\n    return false;\n  }\n  jobject application_context = xe::GetAndroidApplicationContext();\n  if (!application_context) {\n    return false;\n  }\n\n  // Application context.\n  {\n    {\n      jclass application_context_class_local_ref =\n          jni_env->GetObjectClass(application_context);\n      if (!application_context_class_local_ref) {\n        XELOGE(\n            \"InitializeAndroidSystemForApplicationContext: Failed to get the \"\n            \"class of the application context\");\n        ShutdownAndroidSystem();\n        return false;\n      }\n      android_system_application_context_class_ =\n          reinterpret_cast<jclass>(jni_env->NewGlobalRef(\n              reinterpret_cast<jobject>(application_context_class_local_ref)));\n      jni_env->DeleteLocalRef(application_context_class_local_ref);\n    }\n    if (!android_system_application_context_class_) {\n      XELOGE(\n          \"InitializeAndroidSystemForApplicationContext: Failed to create a \"\n          \"global reference to the class of the application context\");\n      ShutdownAndroidSystem();\n      return false;\n    }\n    bool application_context_ids_obtained = true;\n    application_context_ids_obtained &=\n        (android_system_application_context_start_activity_ =\n             jni_env->GetMethodID(android_system_application_context_class_,\n                                  \"startActivity\",\n                                  \"(Landroid/content/Intent;)V\")) != nullptr;\n    if (!application_context_ids_obtained) {\n      XELOGE(\n          \"InitializeAndroidSystemForApplicationContext: Failed to get the \"\n          \"application context class IDs\");\n      ShutdownAndroidSystem();\n      return false;\n    }\n  }\n\n  // URI.\n  {\n    {\n      jclass uri_class_local_ref = jni_env->FindClass(\"android/net/Uri\");\n      if (!uri_class_local_ref) {\n        XELOGE(\n            \"InitializeAndroidSystemForApplicationContext: Failed to find the \"\n            \"URI class\");\n        ShutdownAndroidSystem();\n        return false;\n      }\n      android_system_uri_class_ =\n          reinterpret_cast<jclass>(jni_env->NewGlobalRef(\n              reinterpret_cast<jobject>(uri_class_local_ref)));\n      jni_env->DeleteLocalRef(uri_class_local_ref);\n    }\n    if (!android_system_uri_class_) {\n      XELOGE(\n          \"InitializeAndroidSystemForApplicationContext: Failed to create a \"\n          \"global reference to the URI class\");\n      ShutdownAndroidSystem();\n      return false;\n    }\n    bool uri_ids_obtained = true;\n    uri_ids_obtained &=\n        (android_system_uri_parse_ = jni_env->GetStaticMethodID(\n             android_system_uri_class_, \"parse\",\n             \"(Ljava/lang/String;)Landroid/net/Uri;\")) != nullptr;\n    if (!uri_ids_obtained) {\n      XELOGE(\n          \"InitializeAndroidSystemForApplicationContext: Failed to get the URI \"\n          \"class IDs\");\n      ShutdownAndroidSystem();\n      return false;\n    }\n  }\n\n  // Intent.\n  {\n    {\n      jclass intent_class_local_ref =\n          jni_env->FindClass(\"android/content/Intent\");\n      if (!intent_class_local_ref) {\n        XELOGE(\n            \"InitializeAndroidSystemForApplicationContext: Failed to find the \"\n            \"intent class\");\n        ShutdownAndroidSystem();\n        return false;\n      }\n      android_system_intent_class_ =\n          reinterpret_cast<jclass>(jni_env->NewGlobalRef(\n              reinterpret_cast<jobject>(intent_class_local_ref)));\n      jni_env->DeleteLocalRef(intent_class_local_ref);\n    }\n    if (!android_system_intent_class_) {\n      XELOGE(\n          \"InitializeAndroidSystemForApplicationContext: Failed to create a \"\n          \"global reference to the intent class\");\n      ShutdownAndroidSystem();\n      return false;\n    }\n    bool intent_ids_obtained = true;\n    jfieldID intent_action_view_id;\n    intent_ids_obtained &= (intent_action_view_id = jni_env->GetStaticFieldID(\n                                android_system_intent_class_, \"ACTION_VIEW\",\n                                \"Ljava/lang/String;\")) != nullptr;\n    jfieldID intent_flag_activity_new_task_id;\n    intent_ids_obtained &=\n        (intent_flag_activity_new_task_id = jni_env->GetStaticFieldID(\n             android_system_intent_class_, \"FLAG_ACTIVITY_NEW_TASK\", \"I\")) !=\n        nullptr;\n    intent_ids_obtained &=\n        (android_system_intent_init_action_uri_ = jni_env->GetMethodID(\n             android_system_intent_class_, \"<init>\",\n             \"(Ljava/lang/String;Landroid/net/Uri;)V\")) != nullptr;\n    intent_ids_obtained &=\n        (android_system_intent_add_flags_ =\n             jni_env->GetMethodID(android_system_intent_class_, \"addFlags\",\n                                  \"(I)Landroid/content/Intent;\")) != nullptr;\n    if (!intent_ids_obtained) {\n      XELOGE(\n          \"InitializeAndroidSystemForApplicationContext: Failed to get the \"\n          \"intent class IDs\");\n      ShutdownAndroidSystem();\n      return false;\n    }\n    {\n      jobject intent_action_view_local_ref = jni_env->GetStaticObjectField(\n          android_system_intent_class_, intent_action_view_id);\n      if (!intent_action_view_local_ref) {\n        XELOGE(\n            \"InitializeAndroidSystemForApplicationContext: Failed to get the \"\n            \"intent view action string\");\n        ShutdownAndroidSystem();\n        return false;\n      }\n      android_system_intent_action_view_ =\n          jni_env->NewGlobalRef(intent_action_view_local_ref);\n      jni_env->DeleteLocalRef(intent_action_view_local_ref);\n      if (!android_system_intent_action_view_) {\n        XELOGE(\n            \"InitializeAndroidSystemForApplicationContext: Failed to create a \"\n            \"global reference to the intent view action string\");\n        ShutdownAndroidSystem();\n        return false;\n      }\n    }\n    android_system_intent_flag_activity_new_task_ = jni_env->GetStaticIntField(\n        android_system_intent_class_, intent_flag_activity_new_task_id);\n  }\n\n  android_system_initialized_ = true;\n  return true;\n}\n\nvoid ShutdownAndroidSystem() {\n  // May be called from InitializeAndroidSystemForApplicationContext as well.\n  android_system_initialized_ = false;\n  android_system_intent_add_flags_ = nullptr;\n  android_system_intent_init_action_uri_ = nullptr;\n  android_system_uri_parse_ = nullptr;\n  android_system_application_context_start_activity_ = nullptr;\n  JNIEnv* jni_env = GetAndroidThreadJniEnv();\n  if (jni_env) {\n    if (android_system_intent_action_view_) {\n      jni_env->DeleteGlobalRef(android_system_intent_action_view_);\n    }\n    if (android_system_intent_class_) {\n      jni_env->DeleteGlobalRef(android_system_intent_class_);\n    }\n    if (android_system_uri_class_) {\n      jni_env->DeleteGlobalRef(android_system_uri_class_);\n    }\n    if (android_system_application_context_class_) {\n      jni_env->DeleteGlobalRef(android_system_application_context_class_);\n    }\n  }\n  android_system_intent_action_view_ = nullptr;\n  android_system_intent_class_ = nullptr;\n  android_system_uri_class_ = nullptr;\n  android_system_application_context_class_ = nullptr;\n}\n\nvoid LaunchWebBrowser(const std::string_view url) {\n  if (!android_system_initialized_) {\n    return;\n  }\n  JNIEnv* jni_env = GetAndroidThreadJniEnv();\n  if (!jni_env) {\n    return;\n  }\n  jobject application_context = GetAndroidApplicationContext();\n  if (!application_context) {\n    return;\n  }\n\n  jstring uri_string = jni_env->NewStringUTF(std::string(url).c_str());\n  if (!uri_string) {\n    XELOGE(\"LaunchWebBrowser: Failed to create the URI string\");\n    return;\n  }\n  jobject uri = jni_env->CallStaticObjectMethod(\n      android_system_uri_class_, android_system_uri_parse_, uri_string);\n  jni_env->DeleteLocalRef(uri_string);\n  if (!uri) {\n    XELOGE(\"LaunchWebBrowser: Failed to parse the URI\");\n    return;\n  }\n  jobject intent = jni_env->NewObject(android_system_intent_class_,\n                                      android_system_intent_init_action_uri_,\n                                      android_system_intent_action_view_, uri);\n  jni_env->DeleteLocalRef(uri);\n  if (!intent) {\n    XELOGE(\"LaunchWebBrowser: Failed to create the intent\");\n    return;\n  }\n  // Start a new task - the user may want to be able to switch between the\n  // emulator and the newly opened web browser, without having to quit the web\n  // browser to return to the emulator. Also, since the application context, not\n  // the activity, is used, the new task flag is required.\n  {\n    jobject intent_add_flags_result_local_ref = jni_env->CallObjectMethod(\n        intent, android_system_intent_add_flags_,\n        android_system_intent_flag_activity_new_task_);\n    if (intent_add_flags_result_local_ref) {\n      jni_env->DeleteLocalRef(intent_add_flags_result_local_ref);\n    }\n  }\n  jni_env->CallVoidMethod(application_context,\n                          android_system_application_context_start_activity_,\n                          intent);\n  jni_env->DeleteLocalRef(intent);\n}\n\nvoid LaunchFileExplorer(const std::filesystem::path& path) { assert_always(); }\n\nvoid ShowSimpleMessageBox(SimpleMessageBoxType type, std::string_view message) {\n  // TODO(Triang3l): Likely not needed much at all. ShowSimpleMessageBox is a\n  // concept pretty unfriendly to platforms like Android because it's blocking,\n  // and because it can be called from threads other than the UI thread. In the\n  // normal execution flow, dialogs should preferably be asynchronous, and used\n  // only in the UI thread. However, non-blocking messages may be good for error\n  // reporting - investigate the usage of Toasts with respect to threads, and\n  // aborting the process immediately after showing a Toast. For a Toast, the\n  // Java VM for the calling thread is needed.\n}\n\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/base/system_gnulinux.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include <alloca.h>\n#include <dlfcn.h>\n#include <stdlib.h>\n\n#include <cstring>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/string.h\"\n#include \"xenia/base/system.h\"\n\n// Use headers in third party to not depend on system sdl headers for building\n#include \"third_party/SDL2/include/SDL.h\"\n\nnamespace xe {\n\nvoid LaunchWebBrowser(const std::string_view url) {\n  auto cmd = std::string(\"xdg-open \");\n  cmd.append(url);\n  system(cmd.c_str());\n}\n\nvoid LaunchFileExplorer(const std::filesystem::path& path) { assert_always(); }\n\nvoid ShowSimpleMessageBox(SimpleMessageBoxType type, std::string_view message) {\n  void* libsdl2 = dlopen(\"libSDL2.so\", RTLD_LAZY | RTLD_LOCAL);\n  assert_not_null(libsdl2);\n  if (libsdl2) {\n    auto* pSDL_ShowSimpleMessageBox =\n        reinterpret_cast<decltype(SDL_ShowSimpleMessageBox)*>(\n            dlsym(libsdl2, \"SDL_ShowSimpleMessageBox\"));\n    assert_not_null(pSDL_ShowSimpleMessageBox);\n    if (pSDL_ShowSimpleMessageBox) {\n      Uint32 flags;\n      const char* title;\n      char* message_copy = reinterpret_cast<char*>(alloca(message.size() + 1));\n      std::memcpy(message_copy, message.data(), message.size());\n      message_copy[message.size()] = '\\0';\n\n      switch (type) {\n        default:\n        case SimpleMessageBoxType::Help:\n          title = \"Xenia Help\";\n          flags = SDL_MESSAGEBOX_INFORMATION;\n          break;\n        case SimpleMessageBoxType::Warning:\n          title = \"Xenia Warning\";\n          flags = SDL_MESSAGEBOX_WARNING;\n          break;\n        case SimpleMessageBoxType::Error:\n          title = \"Xenia Error\";\n          flags = SDL_MESSAGEBOX_ERROR;\n          break;\n      }\n      pSDL_ShowSimpleMessageBox(flags, title, message_copy, NULL);\n    }\n    dlclose(libsdl2);\n  }\n}\n\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/base/system_win.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/platform_win.h\"\n#include \"xenia/base/string.h\"\n#include \"xenia/base/system.h\"\n\nnamespace xe {\n\nvoid LaunchWebBrowser(const std::string_view url) {\n  auto wide_url = xe::to_utf16(url);\n  ShellExecuteW(nullptr, L\"open\", reinterpret_cast<LPCWSTR>(wide_url.c_str()),\n                nullptr, nullptr, SW_SHOWNORMAL);\n}\n\nvoid LaunchFileExplorer(const std::filesystem::path& url) {\n  ShellExecuteW(nullptr, L\"explore\", url.c_str(), nullptr, nullptr,\n                SW_SHOWNORMAL);\n}\n\nvoid ShowSimpleMessageBox(SimpleMessageBoxType type,\n                          const std::string_view message) {\n  const wchar_t* title;\n  std::u16string wide_message = xe::to_utf16(message);\n  DWORD type_flags = MB_OK | MB_APPLMODAL | MB_SETFOREGROUND;\n  switch (type) {\n    default:\n    case SimpleMessageBoxType::Help:\n      title = L\"Xenia Help\";\n      type_flags |= MB_ICONINFORMATION;\n      break;\n    case SimpleMessageBoxType::Warning:\n      title = L\"Xenia Warning\";\n      type_flags |= MB_ICONWARNING;\n      break;\n    case SimpleMessageBoxType::Error:\n      title = L\"Xenia Error\";\n      type_flags |= MB_ICONERROR;\n      break;\n  }\n  MessageBoxW(nullptr, reinterpret_cast<LPCWSTR>(wide_message.c_str()), title,\n              type_flags);\n}\n\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/base/testing/chrono_test.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/chrono.h\"\n\n#define CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER\n#include \"third_party/catch/include/catch.hpp\"\n\nnamespace xe::base::test {\n\n// If the tests run fast, the time duration may be zero. So we artificially\n// raise it to allow for some error.\ntemplate <typename _Rep, typename _Period>\nauto dur_bound(std::chrono::duration<_Rep, _Period> dur) {\n  using namespace std::chrono_literals;\n  return std::max<std::common_type_t<std::chrono::milliseconds,\n                                     std::chrono::duration<_Rep, _Period>>>(\n      dur, 1ms);\n}\n\nTEST_CASE(\"WinSystemClock <-> system_clock\", \"[clock_cast]\") {\n  using namespace xe::chrono;\n  using namespace date;\n  using sys_clock = std::chrono::system_clock;\n\n  // First check some assumptions made in chrono.h\n\n  SECTION(\"C++20 unix epoch\") {\n    auto epoch = date::year{1970} / date::month{1} / date::day{1};\n    std::chrono::system_clock::time_point epoch_tp{\n        static_cast<date::sys_days>(epoch)};\n    REQUIRE(epoch_tp.time_since_epoch().count() == 0);\n  }\n\n  SECTION(\"Epoch delta\") {\n    std::chrono::seconds sys_delta = WinSystemClock::unix_epoch_delta();\n    REQUIRE(sys_delta.count() == INT64_C(-11644473600));\n  }\n\n  SECTION(\"1993/12/21\") {\n    static constexpr sys_days sys(1993_y / dec / 21);\n\n    static constexpr auto wsys = WinSystemClock::from_sys(sys);\n    REQUIRE(wsys.time_since_epoch().count() == 124009056000000000);\n\n    REQUIRE(clock_cast<sys_clock>(wsys) == sys);\n    REQUIRE(clock_cast<WinSystemClock>(sys) == wsys);\n  }\n\n  SECTION(\"2100/3/1\") {\n    static constexpr sys_days sys(2100_y / mar / 1);\n\n    static constexpr auto wsys = WinSystemClock::from_sys(sys);\n    REQUIRE(wsys.time_since_epoch().count() == 157520160000000000);\n\n    REQUIRE(clock_cast<sys_clock>(wsys) == sys);\n    REQUIRE(clock_cast<WinSystemClock>(sys) == wsys);\n  }\n}\n\nTEST_CASE(\"WinSystemClock <-> XSystemClock\", \"[clock_cast]\") {\n  using namespace std::chrono_literals;\n  using namespace xe::chrono;\n  using namespace date;\n  using sys_clock = std::chrono::system_clock;\n\n  SECTION(\"1993/12/21, clock_no_scaling = true\") {\n    static constexpr sys_days sys(1993_y / dec / 21);\n    cvars::clock_no_scaling = true;\n    Clock::set_guest_time_scalar(1.0);\n\n    static constexpr auto wsys = WinSystemClock::from_sys(sys);\n\n    auto start = std::chrono::system_clock::now();\n\n    auto xsys = date::clock_cast<XSystemClock>(wsys);\n    auto wxsys = date::clock_cast<WinSystemClock>(xsys);\n\n    auto duration = dur_bound(std::chrono::system_clock::now() - start);\n\n    auto error = wsys.time_since_epoch() - wxsys.time_since_epoch();\n    REQUIRE(error < duration);\n    REQUIRE(error > -duration);\n  }\n\n  SECTION(\"1993/12/21, clock_no_scaling = false\") {\n    static constexpr sys_days sys(1993_y / dec / 21);\n    cvars::clock_no_scaling = false;\n    Clock::set_guest_time_scalar(1.0);\n\n    static constexpr auto wsys = WinSystemClock::from_sys(sys);\n\n    auto start = std::chrono::system_clock::now();\n\n    auto xsys = date::clock_cast<XSystemClock>(wsys);\n    auto wxsys = date::clock_cast<WinSystemClock>(xsys);\n\n    auto duration = dur_bound(std::chrono::system_clock::now() - start);\n\n    auto error1 = wsys.time_since_epoch() - xsys.time_since_epoch();\n    auto error2 = xsys.time_since_epoch() - wxsys.time_since_epoch();\n    auto error3 = wsys - wxsys;\n\n    // In AppVeyor, the difference often can be as large as roughly 16ms.\n    REQUIRE(error1 < 20ms);\n    REQUIRE(error1 > -20ms);\n    REQUIRE(error2 < 20ms);\n    REQUIRE(error2 > -20ms);\n    REQUIRE(error3 < duration);\n    REQUIRE(error3 > -duration);\n  }\n}\n\n}  // namespace xe::base::test\n\n// only make these available now\n#include \"xenia/base/chrono_steady_cast.h\"\n\nnamespace xe::base::test {\n\nTEST_CASE(\"WinSystemClock <-> steady_clock\", \"[clock_cast]\") {\n  using namespace xe::chrono;\n  using namespace date;\n  using sty_clock = std::chrono::steady_clock;\n\n  // steady conversion is mostly used to convert wait times\n\n  SECTION(\"now\") {\n    auto sty = sty_clock::now();\n\n    // Because steady casts are imprecise, we need to allow some margin of error\n    auto start = sty_clock::now();\n\n    auto wsty = clock_cast<WinSystemClock>(sty);\n    auto sty2 = clock_cast<sty_clock>(wsty);\n\n    auto duration = dur_bound(sty_clock::now() - start).count();\n    auto error = std::abs((sty2 - sty).count());\n    REQUIRE(error <= duration);\n  }\n}\n\n}  // namespace xe::base::test\n"
  },
  {
    "path": "src/xenia/base/testing/memory_test.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/memory.h\"\n\n#include \"third_party/catch/include/catch.hpp\"\n#include \"third_party/fmt/include/fmt/format.h\"\n\n#include \"xenia/base/clock.h\"\n\n#include <array>\n\nnamespace xe {\nnamespace base {\nnamespace test {\n\nTEST_CASE(\"copy_128_aligned\", \"[copy_and_swap]\") {\n  alignas(128) uint8_t src[256], dest[256];\n  for (uint8_t i = 0; i < 255; ++i) {\n    src[i] = 255 - i;\n  }\n  std::memset(dest, 0, sizeof(dest));\n  copy_128_aligned(dest, src, 1);\n  REQUIRE(std::memcmp(dest, src, 128));\n  REQUIRE(dest[128] == 0);\n\n  std::memset(dest, 0, sizeof(dest));\n  copy_128_aligned(dest, src, 2);\n  REQUIRE(std::memcmp(dest, src, 256));\n\n  std::memset(dest, 0, sizeof(dest));\n  copy_128_aligned(dest, src + 1, 1);\n  REQUIRE(std::memcmp(dest, src + 1, 128));\n}\n\nTEST_CASE(\"copy_and_swap_16_aligned\", \"[copy_and_swap]\") {\n  alignas(16) uint16_t a = 0x1111, b = 0xABCD;\n  copy_and_swap_16_aligned(&a, &b, 1);\n  REQUIRE(a == 0xCDAB);\n  REQUIRE(b == 0xABCD);\n\n  alignas(16) uint16_t c[] = {0x0000, 0x0000, 0x0000, 0x0000};\n  alignas(16) uint16_t d[] = {0x0123, 0x4567, 0x89AB, 0xCDEF};\n  copy_and_swap_16_aligned(c, d, 1);\n  REQUIRE(c[0] == 0x2301);\n  REQUIRE(c[1] == 0x0000);\n  REQUIRE(c[2] == 0x0000);\n  REQUIRE(c[3] == 0x0000);\n\n  copy_and_swap_16_aligned(c, d, 3);\n  REQUIRE(c[0] == 0x2301);\n  REQUIRE(c[1] == 0x6745);\n  REQUIRE(c[2] == 0xAB89);\n  REQUIRE(c[3] == 0x0000);\n\n  copy_and_swap_16_aligned(c, d, 4);\n  REQUIRE(c[0] == 0x2301);\n  REQUIRE(c[1] == 0x6745);\n  REQUIRE(c[2] == 0xAB89);\n  REQUIRE(c[3] == 0xEFCD);\n\n  alignas(16) uint64_t e;\n  copy_and_swap_16_aligned(&e, d, 4);\n  REQUIRE(e == 0xEFCDAB8967452301);\n\n  alignas(16) char f[85] = {0x00};\n  alignas(16) char g[] =\n      \"This is a 85 byte long string... \"\n      \"It's supposed to be longer than standard alignment.\";\n  copy_and_swap_16_aligned(f, g, 42);\n  REQUIRE(std::strcmp(f,\n                      \"hTsii  s a58b ty eolgns rtni.g..I 't susppsodet  oebl \"\n                      \"noeg rhtnas atdnra dlagimnne.t\") == 0);\n\n  std::memset(f, 0, sizeof(f));\n  copy_and_swap_16_aligned(f, g + 16, 34);\n  REQUIRE(std::strcmp(f,\n                      \" eolgns rtni.g..I 't susppsodet  oebl \"\n                      \"noeg rhtnas atdnra dlagimnne.t\") == 0);\n\n  std::memset(f, 0, sizeof(f));\n  copy_and_swap_16_aligned(f, g + 32, 26);\n  REQUIRE(std::strcmp(f,\n                      \"I 't susppsodet  oebl \"\n                      \"noeg rhtnas atdnra dlagimnne.t\") == 0);\n\n  std::memset(f, 0, sizeof(f));\n  copy_and_swap_16_aligned(f, g + 64, 10);\n  REQUIRE(std::strcmp(f, \"s atdnra dlagimnne.t\") == 0);\n}\n\nTEST_CASE(\"copy_and_swap_16_unaligned\", \"[copy_and_swap]\") {\n  uint16_t a = 0x1111, b = 0xABCD;\n  copy_and_swap_16_unaligned(&a, &b, 1);\n  REQUIRE(a == 0xCDAB);\n  REQUIRE(b == 0xABCD);\n\n  uint16_t c[] = {0x0000, 0x0000, 0x0000, 0x0000};\n  uint16_t d[] = {0x0123, 0x4567, 0x89AB, 0xCDEF};\n  copy_and_swap_16_unaligned(c, d, 1);\n  REQUIRE(c[0] == 0x2301);\n  REQUIRE(c[1] == 0x0000);\n  REQUIRE(c[2] == 0x0000);\n  REQUIRE(c[3] == 0x0000);\n\n  copy_and_swap_16_unaligned(c, d, 4);\n  REQUIRE(c[0] == 0x2301);\n  REQUIRE(c[1] == 0x6745);\n  REQUIRE(c[2] == 0xAB89);\n  REQUIRE(c[3] == 0xEFCD);\n\n  {\n    constexpr size_t count = 100;\n    std::array<uint8_t, count * 2> src{};\n    std::array<uint8_t, count * 2> dst{};\n    for (size_t i = 0; i < src.size(); ++i) {\n      src[i] = static_cast<uint8_t>(i) + 1;  // no zero in array\n    }\n    copy_and_swap_16_unaligned(dst.data(), src.data(), count);\n    for (size_t i = 0; i < src.size(); i += 2) {\n      // Check src is untouched\n      REQUIRE(static_cast<size_t>(src[i + 0]) == i + 1);\n      REQUIRE(static_cast<size_t>(src[i + 1]) == i + 2);\n      // Check swapped bytes\n      REQUIRE(static_cast<size_t>(dst[i]) == static_cast<size_t>(src[i + 1]));\n      REQUIRE(static_cast<size_t>(dst[i + 1]) == static_cast<size_t>(src[i]));\n    }\n  }\n\n  uint64_t e;\n  copy_and_swap_16_unaligned(&e, d, 4);\n  REQUIRE(e == 0xEFCDAB8967452301);\n\n  char f[85] = {0x00};\n  char g[] =\n      \"This is a 85 byte long string... \"\n      \"It's supposed to be longer than standard alignment.\";\n  copy_and_swap_16_unaligned(f, g, 42);\n  REQUIRE(std::strcmp(f,\n                      \"hTsii  s a58b ty eolgns rtni.g..I 't susppsodet  oebl \"\n                      \"noeg rhtnas atdnra dlagimnne.t\") == 0);\n\n  std::memset(f, 0, sizeof(f));\n  copy_and_swap_16_unaligned(f, g + 1, 41);\n  REQUIRE(std::strcmp(f,\n                      \"ih ssia 8  5ybetl no gtsirgn.. .tIs's puopes dotb  \"\n                      \"eolgnret ah ntsnaaddra ilngemtn\") == 0);\n\n  std::memset(f, 0, sizeof(f));\n  copy_and_swap_16_unaligned(f, g + 2, 41);\n  REQUIRE(std::strcmp(f,\n                      \"sii  s a58b ty eolgns rtni.g..I 't susppsodet  oebl \"\n                      \"noeg rhtnas atdnra dlagimnne.t\") == 0);\n}\n\nTEST_CASE(\"copy_and_swap_32_aligned\", \"[copy_and_swap]\") {\n  alignas(32) uint32_t a = 0x11111111, b = 0x89ABCDEF;\n  copy_and_swap_32_aligned(&a, &b, 1);\n  REQUIRE(a == 0xEFCDAB89);\n  REQUIRE(b == 0x89ABCDEF);\n\n  alignas(32) uint32_t c[] = {0x00000000, 0x00000000, 0x00000000, 0x00000000};\n  alignas(32) uint32_t d[] = {0x01234567, 0x89ABCDEF, 0xE887EEED, 0xD8514199};\n  copy_and_swap_32_aligned(c, d, 1);\n  REQUIRE(c[0] == 0x67452301);\n  REQUIRE(c[1] == 0x00000000);\n  REQUIRE(c[2] == 0x00000000);\n  REQUIRE(c[3] == 0x00000000);\n\n  copy_and_swap_32_aligned(c, d, 3);\n  REQUIRE(c[0] == 0x67452301);\n  REQUIRE(c[1] == 0xEFCDAB89);\n  REQUIRE(c[2] == 0xEDEE87E8);\n  REQUIRE(c[3] == 0x00000000);\n\n  copy_and_swap_32_aligned(c, d, 4);\n  REQUIRE(c[0] == 0x67452301);\n  REQUIRE(c[1] == 0xEFCDAB89);\n  REQUIRE(c[2] == 0xEDEE87E8);\n  REQUIRE(c[3] == 0x994151D8);\n\n  alignas(32) uint64_t e;\n  copy_and_swap_32_aligned(&e, d, 2);\n  REQUIRE(e == 0xEFCDAB8967452301);\n\n  alignas(32) char f[85] = {0x00};\n  alignas(32) char g[] =\n      \"This is a 85 byte long string... \"\n      \"It's supposed to be longer than standard alignment.\";\n  copy_and_swap_32_aligned(f, g, 21);\n  REQUIRE(std::strcmp(f,\n                      \"sihT si 58 atyb ol es gnnirt...g'tI us ssoppt deeb \"\n                      \"onol  regnahtats radnla dmngi.tne\") == 0);\n\n  std::memset(f, 0, sizeof(f));\n  copy_and_swap_32_aligned(f, g + 16, 17);\n  REQUIRE(std::strcmp(f,\n                      \"ol es gnnirt...g'tI us ssoppt deeb \"\n                      \"onol  regnahtats radnla dmngi.tne\") == 0);\n\n  std::memset(f, 0, sizeof(f));\n  copy_and_swap_32_aligned(f, g + 32, 13);\n  REQUIRE(std::strcmp(f,\n                      \"'tI us ssoppt deeb \"\n                      \"onol  regnahtats radnla dmngi.tne\") == 0);\n\n  std::memset(f, 0, sizeof(f));\n  copy_and_swap_32_aligned(f, g + 64, 5);\n  REQUIRE(std::strcmp(f, \"ats radnla dmngi.tne\") == 0);\n}\n\nTEST_CASE(\"copy_and_swap_32_unaligned\", \"[copy_and_swap]\") {\n  uint32_t a = 0x11111111, b = 0x89ABCDEF;\n  copy_and_swap_32_unaligned(&a, &b, 1);\n  REQUIRE(a == 0xEFCDAB89);\n  REQUIRE(b == 0x89ABCDEF);\n\n  uint32_t c[] = {0x00000000, 0x00000000, 0x00000000, 0x00000000};\n  uint32_t d[] = {0x01234567, 0x89ABCDEF, 0xE887EEED, 0xD8514199};\n  copy_and_swap_32_unaligned(c, d, 1);\n  REQUIRE(c[0] == 0x67452301);\n  REQUIRE(c[1] == 0x00000000);\n  REQUIRE(c[2] == 0x00000000);\n  REQUIRE(c[3] == 0x00000000);\n\n  copy_and_swap_32_unaligned(c, d, 3);\n  REQUIRE(c[0] == 0x67452301);\n  REQUIRE(c[1] == 0xEFCDAB89);\n  REQUIRE(c[2] == 0xEDEE87E8);\n  REQUIRE(c[3] == 0x00000000);\n\n  copy_and_swap_32_unaligned(c, d, 4);\n  REQUIRE(c[0] == 0x67452301);\n  REQUIRE(c[1] == 0xEFCDAB89);\n  REQUIRE(c[2] == 0xEDEE87E8);\n  REQUIRE(c[3] == 0x994151D8);\n\n  {\n    constexpr size_t count = 17;\n    std::array<uint8_t, count * 4> src{};\n    std::array<uint8_t, count * 4> dst{};\n    for (size_t i = 0; i < src.size(); ++i) {\n      src[i] = static_cast<uint8_t>(i) + 1;  // no zero in array\n    }\n    copy_and_swap_32_unaligned(dst.data(), src.data(), count);\n    for (size_t i = 0; i < src.size(); i += 4) {\n      // Check src is untouched\n      REQUIRE(static_cast<size_t>(src[i + 0]) == i + 1);\n      REQUIRE(static_cast<size_t>(src[i + 1]) == i + 2);\n      REQUIRE(static_cast<size_t>(src[i + 2]) == i + 3);\n      REQUIRE(static_cast<size_t>(src[i + 3]) == i + 4);\n      // Check swapped bytes\n      REQUIRE(static_cast<size_t>(dst[i + 0]) ==\n              static_cast<size_t>(src[i + 3]));\n      REQUIRE(static_cast<size_t>(dst[i + 1]) ==\n              static_cast<size_t>(src[i + 2]));\n      REQUIRE(static_cast<size_t>(dst[i + 2]) ==\n              static_cast<size_t>(src[i + 1]));\n      REQUIRE(static_cast<size_t>(dst[i + 3]) ==\n              static_cast<size_t>(src[i + 0]));\n    }\n  }\n\n  uint64_t e;\n  copy_and_swap_32_unaligned(&e, d, 2);\n  REQUIRE(e == 0xEFCDAB8967452301);\n\n  char f[85] = {0x00};\n  char g[] =\n      \"This is a 85 byte long string... \"\n      \"It's supposed to be longer than standard alignment.\";\n  copy_and_swap_32_unaligned(f, g, 21);\n  REQUIRE(std::strcmp(f,\n                      \"sihT si 58 atyb ol es gnnirt...g'tI us ssoppt deeb \"\n                      \"onol  regnahtats radnla dmngi.tne\") == 0);\n\n  std::memset(f, 0, sizeof(f));\n  copy_and_swap_32_unaligned(f, g + 1, 20);\n  REQUIRE(std::strcmp(f,\n                      \" siha si 58 etybnol ts ggnir ...s'tIpus esopot d eb \"\n                      \"gnolt re nahnatsdradila emng\") == 0);\n\n  std::memset(f, 0, sizeof(f));\n  copy_and_swap_32_unaligned(f, g + 2, 20);\n  REQUIRE(std::strcmp(f,\n                      \"i si a sb 58 etygnolrts .gniI .. s'tppusdeso ot l \"\n                      \"ebegnoht rs nadnat dragilanemn\") == 0);\n\n  std::memset(f, 0, sizeof(f));\n  copy_and_swap_32_unaligned(f, g + 3, 20);\n  REQUIRE(std::strcmp(f,\n                      \"si s8 a yb 5l et gnoirts..gntI .s s'oppu desb otol \"\n                      \"eregnaht ts nadnaa drngiltnem\") == 0);\n\n  std::memset(f, 0, sizeof(f));\n  copy_and_swap_32_unaligned(f, g + 4, 20);\n  REQUIRE(std::strcmp(f,\n                      \" si 58 atyb ol es gnnirt...g'tI us ssoppt deeb onol  \"\n                      \"regnahtats radnla dmngi.tne\") == 0);\n}\n\nTEST_CASE(\"copy_and_swap_64_aligned\", \"[copy_and_swap]\") {\n  alignas(64) uint64_t a = 0x1111111111111111, b = 0x0123456789ABCDEF;\n  copy_and_swap_64_aligned(&a, &b, 1);\n  REQUIRE(a == 0xEFCDAB8967452301);\n  REQUIRE(b == 0x0123456789ABCDEF);\n\n  alignas(64) uint64_t c[] = {0x0000000000000000, 0x0000000000000000,\n                              0x0000000000000000, 0x0000000000000000};\n  alignas(64) uint64_t d[] = {0x0123456789ABCDEF, 0xE887EEEDD8514199,\n                              0x21D4745A1D4A7706, 0xA4174FED675766E3};\n  copy_and_swap_64_aligned(c, d, 1);\n  REQUIRE(c[0] == 0xEFCDAB8967452301);\n  REQUIRE(c[1] == 0x0000000000000000);\n  REQUIRE(c[2] == 0x0000000000000000);\n  REQUIRE(c[3] == 0x0000000000000000);\n\n  copy_and_swap_64_aligned(c, d, 3);\n  REQUIRE(c[0] == 0xEFCDAB8967452301);\n  REQUIRE(c[1] == 0x994151D8EDEE87E8);\n  REQUIRE(c[2] == 0x06774A1D5A74D421);\n  REQUIRE(c[3] == 0x0000000000000000);\n\n  copy_and_swap_64_aligned(c, d, 4);\n  REQUIRE(c[0] == 0xEFCDAB8967452301);\n  REQUIRE(c[1] == 0x994151D8EDEE87E8);\n  REQUIRE(c[2] == 0x06774A1D5A74D421);\n  REQUIRE(c[3] == 0xE3665767ED4F17A4);\n\n  alignas(64) uint64_t e;\n  copy_and_swap_64_aligned(&e, d, 1);\n  REQUIRE(e == 0xEFCDAB8967452301);\n\n  alignas(64) char f[85] = {0x00};\n  alignas(64) char g[] =\n      \"This is a 85 byte long string... \"\n      \"It's supposed to be longer than standard alignment.\";\n  copy_and_swap_64_aligned(f, g, 10);\n  REQUIRE(std::strcmp(f,\n                      \" si sihTtyb 58 as gnol e...gnirtus s'tI t desoppnol eb \"\n                      \"onaht regradnats mngila d\") == 0);\n\n  std::memset(f, 0, sizeof(f));\n  copy_and_swap_64_aligned(f, g + 16, 8);\n  REQUIRE(std::strcmp(f,\n                      \"s gnol e...gnirtus s'tI t desoppnol eb \"\n                      \"onaht regradnats mngila d\") == 0);\n\n  std::memset(f, 0, sizeof(f));\n  copy_and_swap_64_aligned(f, g + 32, 6);\n  REQUIRE(std::strcmp(f,\n                      \"us s'tI t desoppnol eb \"\n                      \"onaht regradnats mngila d\") == 0);\n\n  std::memset(f, 0, sizeof(f));\n  copy_and_swap_64_aligned(f, g + 64, 2);\n  REQUIRE(std::strcmp(f, \"radnats mngila d\") == 0);\n}\n\nTEST_CASE(\"copy_and_swap_64_unaligned\", \"[copy_and_swap]\") {\n  uint64_t a = 0x1111111111111111, b = 0x0123456789ABCDEF;\n  copy_and_swap_64_unaligned(&a, &b, 1);\n  REQUIRE(a == 0xEFCDAB8967452301);\n  REQUIRE(b == 0x0123456789ABCDEF);\n\n  uint64_t c[] = {0x0000000000000000, 0x0000000000000000, 0x0000000000000000,\n                  0x0000000000000000};\n  uint64_t d[] = {0x0123456789ABCDEF, 0xE887EEEDD8514199, 0x21D4745A1D4A7706,\n                  0xA4174FED675766E3};\n  copy_and_swap_64_unaligned(c, d, 1);\n  REQUIRE(c[0] == 0xEFCDAB8967452301);\n  REQUIRE(c[1] == 0x0000000000000000);\n  REQUIRE(c[2] == 0x0000000000000000);\n  REQUIRE(c[3] == 0x0000000000000000);\n\n  copy_and_swap_64_unaligned(c, d, 3);\n  REQUIRE(c[0] == 0xEFCDAB8967452301);\n  REQUIRE(c[1] == 0x994151D8EDEE87E8);\n  REQUIRE(c[2] == 0x06774A1D5A74D421);\n  REQUIRE(c[3] == 0x0000000000000000);\n\n  copy_and_swap_64_unaligned(c, d, 4);\n  REQUIRE(c[0] == 0xEFCDAB8967452301);\n  REQUIRE(c[1] == 0x994151D8EDEE87E8);\n  REQUIRE(c[2] == 0x06774A1D5A74D421);\n  REQUIRE(c[3] == 0xE3665767ED4F17A4);\n\n  uint64_t e;\n  copy_and_swap_64_unaligned(&e, d, 1);\n  REQUIRE(e == 0xEFCDAB8967452301);\n\n  char f[85] = {0x00};\n  char g[] =\n      \"This is a 85 byte long string... \"\n      \"It's supposed to be longer than standard alignment.\";\n  copy_and_swap_64_unaligned(f, g, 10);\n  REQUIRE(std::strcmp(f,\n                      \" si sihTtyb 58 as gnol e...gnirtus s'tI t desoppnol eb \"\n                      \"onaht regradnats mngila d\") == 0);\n\n  std::memset(f, 0, sizeof(f));\n  copy_and_swap_64_unaligned(f, g + 1, 10);\n  REQUIRE(std::strcmp(f,\n                      \"a si sihetyb 58 ts gnol  ...gnirpus s'tIot desopgnol \"\n                      \"eb  naht redradnatsemngila \") == 0);\n\n  std::memset(f, 0, sizeof(f));\n  copy_and_swap_64_unaligned(f, g + 2, 10);\n  REQUIRE(std::strcmp(f,\n                      \" a si si etyb 58rts gnolI ...gnippus s't ot desoegnol \"\n                      \"ebs naht r dradnatnemngila\") == 0);\n\n  std::memset(f, 0, sizeof(f));\n  copy_and_swap_64_unaligned(f, g + 3, 10);\n  REQUIRE(std::strcmp(f,\n                      \"8 a si sl etyb 5irts gnotI ...gnoppus s'b ot desregnol \"\n                      \"ets naht a dradnatnemngil\") == 0);\n\n  std::memset(f, 0, sizeof(f));\n  copy_and_swap_64_unaligned(f, g + 4, 10);\n  REQUIRE(std::strcmp(f,\n                      \"58 a si ol etyb nirts gn'tI ...gsoppus seb ot de \"\n                      \"regnol ats nahtla dradn.tnemngi\") == 0);\n\n  std::memset(f, 0, sizeof(f));\n  copy_and_swap_64_unaligned(f, g + 5, 9);\n  REQUIRE(std::strcmp(f,\n                      \" 58 a sinol etybgnirts gs'tI ...esoppus  eb ot dt \"\n                      \"regnolnats nahila drad\") == 0);\n\n  std::memset(f, 0, sizeof(f));\n  copy_and_swap_64_unaligned(f, g + 6, 9);\n  REQUIRE(std::strcmp(f,\n                      \"b 58 a sgnol ety.gnirts  s'tI ..desoppusl eb ot ht \"\n                      \"regnodnats nagila dra\") == 0);\n\n  std::memset(f, 0, sizeof(f));\n  copy_and_swap_64_unaligned(f, g + 7, 9);\n  REQUIRE(std::strcmp(f,\n                      \"yb 58 a  gnol et..gnirtss s'tI . desoppuol eb otaht \"\n                      \"regnadnats nngila dr\") == 0);\n\n  std::memset(f, 0, sizeof(f));\n  copy_and_swap_64_unaligned(f, g + 8, 9);\n  REQUIRE(std::strcmp(f,\n                      \"tyb 58 as gnol e...gnirtus s'tI t desoppnol eb onaht \"\n                      \"regradnats mngila d\") == 0);\n}\n\nTEST_CASE(\"copy_and_swap_16_in_32_aligned\", \"[copy_and_swap]\") {\n  constexpr size_t count = 17;\n  alignas(16) std::array<uint8_t, count * 4> src{};\n  alignas(16) std::array<uint8_t, count * 4> dst{};\n\n  // Check alignment (if this fails, adjust allocation)\n  REQUIRE((reinterpret_cast<uintptr_t>(src.data()) & 0xF) == 0);\n  REQUIRE((reinterpret_cast<uintptr_t>(dst.data()) & 0xF) == 0);\n\n  for (size_t i = 0; i < src.size(); ++i) {\n    src[i] = static_cast<uint8_t>(i) + 1;  // no zero in array\n  }\n\n  copy_and_swap_16_in_32_aligned(dst.data(), src.data(), count);\n\n  for (size_t i = 0; i < src.size(); i += 4) {\n    // Check src is untouched\n    REQUIRE(static_cast<size_t>(src[i + 0]) == i + 1);\n    REQUIRE(static_cast<size_t>(src[i + 1]) == i + 2);\n    REQUIRE(static_cast<size_t>(src[i + 2]) == i + 3);\n    REQUIRE(static_cast<size_t>(src[i + 3]) == i + 4);\n    // Check swapped bytes\n    REQUIRE(static_cast<size_t>(dst[i + 0]) == static_cast<size_t>(src[i + 2]));\n    REQUIRE(static_cast<size_t>(dst[i + 1]) == static_cast<size_t>(src[i + 3]));\n    REQUIRE(static_cast<size_t>(dst[i + 2]) == static_cast<size_t>(src[i + 0]));\n    REQUIRE(static_cast<size_t>(dst[i + 3]) == static_cast<size_t>(src[i + 1]));\n  }\n}\n\nTEST_CASE(\"copy_and_swap_16_in_32_unaligned\", \"[copy_and_swap]\") {\n  constexpr size_t count = 17;\n  std::array<uint8_t, count * 4> src{};\n  std::array<uint8_t, count * 4> dst{};\n  for (size_t i = 0; i < src.size(); ++i) {\n    src[i] = static_cast<uint8_t>(i) + 1;  // no zero in array\n  }\n\n  copy_and_swap_16_in_32_unaligned(dst.data(), src.data(), count);\n\n  for (size_t i = 0; i < src.size(); i += 4) {\n    // Check src is untouched\n    REQUIRE(static_cast<size_t>(src[i + 0]) == i + 1);\n    REQUIRE(static_cast<size_t>(src[i + 1]) == i + 2);\n    REQUIRE(static_cast<size_t>(src[i + 2]) == i + 3);\n    REQUIRE(static_cast<size_t>(src[i + 3]) == i + 4);\n    // Check swapped bytes\n    REQUIRE(static_cast<size_t>(dst[i + 0]) == static_cast<size_t>(src[i + 2]));\n    REQUIRE(static_cast<size_t>(dst[i + 1]) == static_cast<size_t>(src[i + 3]));\n    REQUIRE(static_cast<size_t>(dst[i + 2]) == static_cast<size_t>(src[i + 0]));\n    REQUIRE(static_cast<size_t>(dst[i + 3]) == static_cast<size_t>(src[i + 1]));\n  }\n}\n\nTEST_CASE(\"create_and_close_file_mapping\", \"Virtual Memory Mapping\") {\n  auto path = fmt::format(\"xenia_test_{}\", Clock::QueryHostTickCount());\n  auto memory = xe::memory::CreateFileMappingHandle(\n      path, 0x100, xe::memory::PageAccess::kReadWrite, true);\n  REQUIRE(memory != xe::memory::kFileMappingHandleInvalid);\n  xe::memory::CloseFileMappingHandle(memory, path);\n}\n\nTEST_CASE(\"map_view\", \"[virtual_memory_mapping]\") {\n  auto path = fmt::format(\"xenia_test_{}\", Clock::QueryHostTickCount());\n  const size_t length = 0x100;\n  auto memory = xe::memory::CreateFileMappingHandle(\n      path, length, xe::memory::PageAccess::kReadWrite, true);\n  REQUIRE(memory != xe::memory::kFileMappingHandleInvalid);\n\n  uintptr_t address = 0x100000000;\n  auto view =\n      xe::memory::MapFileView(memory, reinterpret_cast<void*>(address), length,\n                              xe::memory::PageAccess::kReadWrite, 0);\n  REQUIRE(reinterpret_cast<uintptr_t>(view) == address);\n\n  xe::memory::UnmapFileView(memory, reinterpret_cast<void*>(address), length);\n  xe::memory::CloseFileMappingHandle(memory, path);\n}\n\nTEST_CASE(\"read_write_view\", \"[virtual_memory_mapping]\") {\n  const size_t length = 0x100;\n  auto path = fmt::format(\"xenia_test_{}\", Clock::QueryHostTickCount());\n  auto memory = xe::memory::CreateFileMappingHandle(\n      path, length, xe::memory::PageAccess::kReadWrite, true);\n  REQUIRE(memory != xe::memory::kFileMappingHandleInvalid);\n\n  uintptr_t address = 0x100000000;\n  auto view =\n      xe::memory::MapFileView(memory, reinterpret_cast<void*>(address), length,\n                              xe::memory::PageAccess::kReadWrite, 0);\n  REQUIRE(reinterpret_cast<uintptr_t>(view) == address);\n\n  for (uint32_t i = 0; i < length; i += sizeof(uint8_t)) {\n    auto p_value = reinterpret_cast<uint8_t*>(address + i);\n    *p_value = i;\n  }\n  for (uint32_t i = 0; i < length; i += sizeof(uint8_t)) {\n    auto p_value = reinterpret_cast<uint8_t*>(address + i);\n    uint8_t value = *p_value;\n    REQUIRE(value == i);\n  }\n\n  xe::memory::UnmapFileView(memory, reinterpret_cast<void*>(address), length);\n  xe::memory::CloseFileMappingHandle(memory, path);\n}\n\nTEST_CASE(\"make_fourcc\", \"[fourcc]\") {\n  SECTION(\"'1234'\") {\n    const uint32_t fourcc_host = 0x31323334;\n    constexpr fourcc_t fourcc_1 = make_fourcc('1', '2', '3', '4');\n    constexpr fourcc_t fourcc_2 = make_fourcc(\"1234\");\n    REQUIRE(fourcc_1 == fourcc_host);\n    REQUIRE(fourcc_2 == fourcc_host);\n    REQUIRE(fourcc_1 == fourcc_2);\n    REQUIRE(fourcc_2 == fourcc_1);\n  }\n\n  SECTION(\"'ABcd'\") {\n    const uint32_t fourcc_host = 0x41426364;\n    constexpr fourcc_t fourcc_1 = make_fourcc('A', 'B', 'c', 'd');\n    constexpr fourcc_t fourcc_2 = make_fourcc(\"ABcd\");\n    REQUIRE(fourcc_1 == fourcc_host);\n    REQUIRE(fourcc_2 == fourcc_host);\n    REQUIRE(fourcc_1 == fourcc_2);\n    REQUIRE(fourcc_2 == fourcc_1);\n  }\n\n  SECTION(\"'XEN\\\\0'\") {\n    const uint32_t fourcc_host = 0x58454E00;\n    constexpr fourcc_t fourcc = make_fourcc('X', 'E', 'N', '\\0');\n    REQUIRE(fourcc == fourcc_host);\n  }\n\n  SECTION(\"length()!=4\") {\n    REQUIRE_THROWS(make_fourcc(\"AB\\0\\0\"));\n    REQUIRE_THROWS(make_fourcc(\"AB\\0\\0AB\"));\n    REQUIRE_THROWS(make_fourcc(\"ABCDEFGH\"));\n  }\n}\n\n}  // namespace test\n}  // namespace base\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/base/testing/premake5.lua",
    "content": "project_root = \"../../../..\"\ninclude(project_root..\"/tools/build\")\n\ntest_suite(\"xenia-base-tests\", project_root, \".\", {\n  links = {\n    \"fmt\",\n    \"xenia-base\",\n  },\n})\n"
  },
  {
    "path": "src/xenia/base/testing/threading_test.cc",
    "content": "/**\n******************************************************************************\n* Xenia : Xbox 360 Emulator Research Project                                 *\n******************************************************************************\n* Copyright 2022 Ben Vanik. All rights reserved.                             *\n* Released under the BSD license - see LICENSE in the root for more details. *\n******************************************************************************\n*/\n\n#include <array>\n\n#include \"xenia/base/threading.h\"\n\n#define CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER\n#include \"third_party/catch/include/catch.hpp\"\n\n#include \"third_party/disruptorplus/include/disruptorplus/spin_wait.hpp\"\n\nnamespace xe {\nnamespace base {\nnamespace test {\nusing namespace threading;\nusing namespace std::chrono_literals;\n\n// Helpers to wait on a predicate which do not depend on complex sync primitives\ntemplate <class Clock, class Duration, class Predicate>\nbool spin_wait_until(\n    const std::chrono::time_point<Clock, Duration>& timeout_time,\n    Predicate stop_waiting) {\n  disruptorplus::spin_wait spinner;\n  while (!stop_waiting()) {\n    if (std::chrono::steady_clock::now() >= timeout_time) {\n      return false;\n    }\n    spinner.spin_once();\n  }\n  return true;\n}\ntemplate <class Period, class Rep, class Predicate>\nbool spin_wait_for(const std::chrono::duration<Rep, Period>& rel_time,\n                   Predicate stop_waiting) {\n  return spin_wait_until(std::chrono::steady_clock::now() + rel_time,\n                         stop_waiting);\n}\n\ntemplate <class Predicate>\nvoid spin_wait(Predicate stop_waiting) {\n  disruptorplus::spin_wait spinner;\n  while (!stop_waiting()) {\n    spinner.spin_once();\n  }\n}\n\nTEST_CASE(\"Fence\") {\n  std::unique_ptr<threading::Fence> pFence;\n  std::unique_ptr<threading::HighResolutionTimer> pTimer;\n\n  // Signal without wait\n  pFence = std::make_unique<threading::Fence>();\n  pFence->Signal();\n\n  // Signal once and wait\n  pFence = std::make_unique<threading::Fence>();\n  pFence->Signal();\n  pFence->Wait();\n\n  // Signal twice and wait\n  pFence = std::make_unique<threading::Fence>();\n  pFence->Signal();\n  pFence->Signal();\n  pFence->Wait();\n\n  // Signal and wait two times\n  pFence = std::make_unique<threading::Fence>();\n  pFence->Signal();\n  pFence->Wait();\n  pFence->Signal();\n  pFence->Wait();\n\n  // Test to synchronize multiple threads\n  std::atomic<int> started(0);\n  std::atomic<int> finished(0);\n  pFence = std::make_unique<threading::Fence>();\n  auto func = [&pFence, &started, &finished] {\n    started.fetch_add(1);\n    pFence->Wait();\n    finished.fetch_add(1);\n  };\n\n  auto threads = std::array<std::thread, 5>({\n      std::thread(func),\n      std::thread(func),\n      std::thread(func),\n      std::thread(func),\n      std::thread(func),\n  });\n\n  REQUIRE(spin_wait_for(1s, [&] { return started == threads.size(); }));\n  REQUIRE(finished.load() == 0);\n\n  pFence->Signal();\n\n  for (auto& t : threads) t.join();\n  REQUIRE(finished.load() == threads.size());\n}  // namespace test\n\nTEST_CASE(\"Get number of logical processors\") {\n  auto count = std::thread::hardware_concurrency();\n  REQUIRE(logical_processor_count() == count);\n  REQUIRE(logical_processor_count() == count);\n  REQUIRE(logical_processor_count() == count);\n}\n\nTEST_CASE(\"Enable process to set thread affinity\") {\n  EnableAffinityConfiguration();\n}\n\nTEST_CASE(\"Yield Current Thread\", \"[maybe_yield]\") {\n  // Run to see if there are any errors\n  MaybeYield();\n}\n\nTEST_CASE(\"Sync with Memory Barrier\", \"[sync_memory]\") {\n  // Run to see if there are any errors\n  SyncMemory();\n}\n\nTEST_CASE(\"Sleep Current Thread\", \"[sleep]\") {\n  auto wait_time = 50ms;\n  auto start = std::chrono::steady_clock::now();\n  Sleep(wait_time);\n  auto duration = std::chrono::steady_clock::now() - start;\n  REQUIRE(duration >= wait_time);\n}\n\nTEST_CASE(\"Sleep Current Thread in Alertable State\", \"[sleep]\") {\n  auto wait_time = 50ms;\n  auto start = std::chrono::steady_clock::now();\n  auto result = threading::AlertableSleep(wait_time);\n  auto duration = std::chrono::steady_clock::now() - start;\n  REQUIRE(duration >= wait_time);\n  REQUIRE(result == threading::SleepResult::kSuccess);\n\n  // TODO(bwrsandman): Test a Thread to return kAlerted.\n  // Need callback to call extended I/O function (ReadFileEx or WriteFileEx)\n}\n\nTEST_CASE(\"TlsHandle\") {\n  // Test Allocate\n  auto handle = threading::AllocateTlsHandle();\n\n  // Test Free\n  REQUIRE(threading::FreeTlsHandle(handle));\n  REQUIRE(!threading::FreeTlsHandle(handle));\n  REQUIRE(!threading::FreeTlsHandle(threading::kInvalidTlsHandle));\n\n  // Test setting values\n  handle = threading::AllocateTlsHandle();\n  REQUIRE(threading::GetTlsValue(handle) == 0);\n  uint32_t value = 0xDEADBEEF;\n  threading::SetTlsValue(handle, reinterpret_cast<uintptr_t>(&value));\n  auto p_received_value = threading::GetTlsValue(handle);\n  REQUIRE(threading::GetTlsValue(handle) != 0);\n  auto received_value = *reinterpret_cast<uint32_t*>(p_received_value);\n  REQUIRE(received_value == value);\n\n  uintptr_t non_thread_local_value = 0;\n  auto thread = Thread::Create({}, [&non_thread_local_value, &handle] {\n    non_thread_local_value = threading::GetTlsValue(handle);\n  });\n  REQUIRE(thread);\n\n  auto result = Wait(thread.get(), false, 50ms);\n  REQUIRE(result == WaitResult::kSuccess);\n  REQUIRE(non_thread_local_value == 0);\n\n  // Cleanup\n  REQUIRE(threading::FreeTlsHandle(handle));\n}\n\nTEST_CASE(\"HighResolutionTimer\") {\n  // The wait time is 500ms with an interval of 50ms\n  // Smaller values are not as precise and fail the test\n  const auto wait_time = 500ms;\n\n  const Thread* timer_thread = nullptr;\n\n  // Time the actual sleep duration\n  {\n    const auto interval = 50ms;\n    std::atomic<uint64_t> counter(0);\n    auto start = std::chrono::steady_clock::now();\n    auto cb = [&counter, &timer_thread] {\n      if (counter == 0) {\n        timer_thread = Thread::GetCurrentThread();\n      } else {\n        REQUIRE(Thread::GetCurrentThread() == timer_thread);\n      }\n      ++counter;\n    };\n    auto pTimer = HighResolutionTimer::CreateRepeating(interval, cb);\n    Sleep(wait_time);\n    pTimer.reset();\n    auto duration = std::chrono::steady_clock::now() - start;\n\n    // Should have run as many times as wait_time / timer_interval plus or\n    // minus 1 due to imprecision of Sleep\n    REQUIRE(duration.count() >= wait_time.count());\n    auto ratio = static_cast<uint64_t>(duration / interval);\n    REQUIRE(counter >= ratio - 1);\n    REQUIRE(counter <= ratio + 1);\n  }\n\n  // Test concurrent timers\n  {\n    const auto interval1 = 100ms;\n    const auto interval2 = 200ms;\n    std::atomic<uint64_t> counter1(0);\n    std::atomic<uint64_t> counter2(0);\n    auto start = std::chrono::steady_clock::now();\n    auto cb1 = [&counter1, timer_thread] {\n      ++counter1;\n      REQUIRE(Thread::GetCurrentThread() == timer_thread);\n    };\n    auto cb2 = [&counter2, timer_thread] {\n      ++counter2;\n      REQUIRE(Thread::GetCurrentThread() == timer_thread);\n    };\n    auto pTimer1 = HighResolutionTimer::CreateRepeating(interval1, cb1);\n    auto pTimer2 = HighResolutionTimer::CreateRepeating(interval2, cb2);\n    Sleep(wait_time);\n    pTimer1.reset();\n    pTimer2.reset();\n    auto duration = std::chrono::steady_clock::now() - start;\n\n    // Should have run as many times as wait_time / timer_interval plus or\n    // minus 1 due to imprecision of Sleep\n    REQUIRE(duration.count() >= wait_time.count());\n    auto ratio1 = static_cast<uint64_t>(duration / interval1);\n    auto ratio2 = static_cast<uint64_t>(duration / interval2);\n    REQUIRE(counter1 >= ratio1 - 1);\n    REQUIRE(counter1 <= ratio1 + 1);\n    REQUIRE(counter2 >= ratio2 - 1);\n    REQUIRE(counter2 <= ratio2 + 1);\n  }\n\n  // Test many timers\n  {\n    const auto interval = 50ms;\n    const size_t timer_count = 128;\n    std::atomic<uint64_t> counter(0);\n    auto cb = [&counter, &timer_thread] {\n      ++counter;\n      REQUIRE(Thread::GetCurrentThread() == timer_thread);\n    };\n    std::vector<std::unique_ptr<HighResolutionTimer>> timers;\n    auto start = std::chrono::steady_clock::now();\n    for (size_t i = 0; i < timer_count; i++) {\n      timers.emplace_back(HighResolutionTimer::CreateRepeating(interval, cb));\n    }\n    Sleep(wait_time);\n    timers.clear();\n    auto duration = std::chrono::steady_clock::now() - start;\n\n    REQUIRE(duration.count() >= wait_time.count());\n    auto ratio = static_cast<uint64_t>(timer_count * duration / interval);\n    REQUIRE(counter >= ratio - timer_count);\n    REQUIRE(counter <= ratio + timer_count);\n  }\n\n  // Check timer order\n  {\n    constexpr size_t timer_count = 16;\n    using pair_t = std::pair<std::atomic<uint64_t>,\n                             std::chrono::high_resolution_clock::time_point>;\n    std::array<pair_t, timer_count> time_points{};\n    auto start = std::chrono::steady_clock::now();\n    auto gen_callback = [&timer_thread, &time_points](size_t i) {\n      return [&timer_thread, &time_points, i]() {\n        auto& pair = time_points[i];\n        if (pair.first.fetch_add(1) == 1) {\n          pair.second = std::chrono::high_resolution_clock::now();\n          pair.first++;\n        }\n        REQUIRE(Thread::GetCurrentThread() == timer_thread);\n      };\n    };\n    std::vector<std::unique_ptr<HighResolutionTimer>> timers;\n    for (size_t i = 0; i < timer_count; i++) {\n      timers.emplace_back(HighResolutionTimer::CreateRepeating(\n          10ms * (timer_count - i), gen_callback(timer_count - i - 1)));\n    }\n    REQUIRE(spin_wait_for(2s, [&] {\n      return std::all_of(time_points.cbegin(), time_points.cend(),\n                         [](auto& pair) { return pair.first >= 3; });\n    }));\n\n    timers.clear();\n\n    REQUIRE(std::is_sorted(\n        time_points.cbegin(), time_points.cend(),\n        [](auto& left, auto& right) { return left.second < right.second; }));\n  }\n}\n\nTEST_CASE(\"Wait on Multiple Handles\", \"[wait]\") {\n  auto mutant = Mutant::Create(true);\n  REQUIRE(mutant);\n  auto semaphore = Semaphore::Create(10, 10);\n  REQUIRE(semaphore);\n  auto event_ = Event::CreateManualResetEvent(false);\n  REQUIRE(event_);\n  auto thread = Thread::Create({}, [&mutant, &semaphore, &event_] {\n    event_->Set();\n    Wait(mutant.get(), false, 25ms);\n    semaphore->Release(1, nullptr);\n    Wait(mutant.get(), false, 25ms);\n    mutant->Release();\n  });\n\n  std::vector<WaitHandle*> handles = {\n      mutant.get(),\n      semaphore.get(),\n      event_.get(),\n      thread.get(),\n  };\n\n  auto any_result = WaitAny(handles, false, 100ms);\n  REQUIRE(any_result.first == WaitResult::kSuccess);\n  REQUIRE(any_result.second == 0);\n\n  auto all_result = WaitAll(handles, false, 100ms);\n  REQUIRE(all_result == WaitResult::kSuccess);\n}\n\nTEST_CASE(\"Signal and Wait\") {\n  WaitResult result;\n  auto mutant = Mutant::Create(true);\n  REQUIRE(mutant);\n  auto event_ = Event::CreateAutoResetEvent(false);\n  REQUIRE(event_);\n  auto thread = Thread::Create({}, [&mutant, &event_] {\n    Wait(mutant.get(), false);\n    event_->Set();\n  });\n  result = Wait(event_.get(), false, 50ms);\n  REQUIRE(result == WaitResult::kTimeout);\n  result = SignalAndWait(mutant.get(), event_.get(), false, 50ms);\n  REQUIRE(result == WaitResult::kSuccess);\n  result = Wait(thread.get(), false, 50ms);\n  REQUIRE(result == WaitResult::kSuccess);\n}\n\nTEST_CASE(\"Wait on Event\", \"[event]\") {\n  auto evt = Event::CreateAutoResetEvent(false);\n  REQUIRE(evt);\n  WaitResult result;\n\n  // Call wait on unset Event\n  result = Wait(evt.get(), false, 50ms);\n  REQUIRE(result == WaitResult::kTimeout);\n\n  // Call wait on set Event\n  evt->Set();\n  result = Wait(evt.get(), false, 50ms);\n  REQUIRE(result == WaitResult::kSuccess);\n\n  // Call wait on now consumed Event\n  result = Wait(evt.get(), false, 50ms);\n  REQUIRE(result == WaitResult::kTimeout);\n}\n\nTEST_CASE(\"Reset Event\", \"[event]\") {\n  auto evt = Event::CreateAutoResetEvent(false);\n  REQUIRE(evt);\n  WaitResult result;\n\n  // Call wait on reset Event\n  evt->Set();\n  evt->Reset();\n  result = Wait(evt.get(), false, 50ms);\n  REQUIRE(result == WaitResult::kTimeout);\n\n  // Test resetting the unset event\n  evt->Reset();\n  result = Wait(evt.get(), false, 50ms);\n  REQUIRE(result == WaitResult::kTimeout);\n\n  // Test setting the reset event\n  evt->Set();\n  result = Wait(evt.get(), false, 50ms);\n  REQUIRE(result == WaitResult::kSuccess);\n}\n\nTEST_CASE(\"Wait on Multiple Events\", \"[event]\") {\n  auto events = std::array<std::unique_ptr<Event>, 4>{\n      Event::CreateAutoResetEvent(false),\n      Event::CreateAutoResetEvent(false),\n      Event::CreateAutoResetEvent(false),\n      Event::CreateManualResetEvent(false),\n  };\n  for (auto& event : events) {\n    REQUIRE(event.get() != nullptr);\n  }\n\n  std::atomic_uint threads_started(0);\n  std::array<char, 8> order = {0};\n  std::atomic_uint index(0);\n  auto sign_in = [&order, &index](uint32_t id) {\n    auto i = index.fetch_add(1, std::memory_order::memory_order_relaxed);\n    order[i] = static_cast<char>('0' + id);\n  };\n\n  auto threads = std::array<std::thread, 4>{\n      std::thread([&events, &sign_in, &threads_started] {\n        set_name(\"1\");\n        threads_started++;\n        auto res = WaitAll({events[1].get(), events[3].get()}, false);\n        REQUIRE(res == WaitResult::kSuccess);\n        if (res == WaitResult::kSuccess) {\n          sign_in(1);\n        }\n      }),\n      std::thread([&events, &sign_in, &threads_started] {\n        set_name(\"2\");\n        threads_started++;\n        auto res = WaitAny({events[0].get(), events[2].get()}, false);\n        REQUIRE(res.first == WaitResult::kSuccess);\n        if (res.first == WaitResult::kSuccess) {\n          sign_in(2);\n        }\n      }),\n      std::thread([&events, &sign_in, &threads_started] {\n        set_name(\"3\");\n        threads_started++;\n        auto res =\n            WaitAll({events[0].get(), events[2].get(), events[3].get()}, false);\n        REQUIRE(res == WaitResult::kSuccess);\n        if (res == WaitResult::kSuccess) {\n          sign_in(3);\n        }\n      }),\n      std::thread([&events, &sign_in, &threads_started] {\n        set_name(\"4\");\n        threads_started++;\n        auto res = WaitAny({events[1].get(), events[3].get()}, false);\n        REQUIRE(res.first == WaitResult::kSuccess);\n        if (res.first == WaitResult::kSuccess) {\n          sign_in(4);\n        }\n      }),\n  };\n\n  // wait for all threads starting up\n  REQUIRE(spin_wait_for(1s, [&] { return threads_started == 4; }));\n  events[3]->Set();  // Signals thread id=4 and stays on for 1 and 3\n  REQUIRE(spin_wait_for(1s, [&] { return index == 1; }));\n  events[1]->Set();  // Signals thread id=1\n  REQUIRE(spin_wait_for(1s, [&] { return index == 2; }));\n  events[0]->Set();  // Signals thread id=2\n  REQUIRE(spin_wait_for(1s, [&] { return index == 3; }));\n  events[2]->Set();  // Partial signals thread id=3\n  events[0]->Set();  // Signals thread id=3\n\n  for (auto& t : threads) {\n    t.join();\n  }\n\n  REQUIRE(index == 4);\n\n  INFO(order.data());\n  REQUIRE(order[0] == '4');\n  REQUIRE(order[1] == '1');\n  REQUIRE(order[2] == '2');\n  REQUIRE(order[3] == '3');\n}\n\nTEST_CASE(\"Wait on Semaphore\", \"[semaphore]\") {\n  WaitResult result;\n  std::unique_ptr<Semaphore> sem;\n  int previous_count = 0;\n\n  // Wait on semaphore with no room\n  sem = Semaphore::Create(0, 5);\n  REQUIRE(sem);\n  result = Wait(sem.get(), false, 10ms);\n  REQUIRE(result == WaitResult::kTimeout);\n\n  // Add room in semaphore\n  REQUIRE(sem->Release(2, &previous_count));\n  REQUIRE(previous_count == 0);\n  REQUIRE(sem->Release(1, &previous_count));\n  REQUIRE(previous_count == 2);\n  result = Wait(sem.get(), false, 10ms);\n  REQUIRE(result == WaitResult::kSuccess);\n  REQUIRE(sem->Release(1, &previous_count));\n  REQUIRE(previous_count == 2);\n\n  // Set semaphore over maximum_count\n  sem = Semaphore::Create(5, 5);\n  REQUIRE(sem);\n  previous_count = -1;\n  REQUIRE_FALSE(sem->Release(1, &previous_count));\n  REQUIRE(previous_count == -1);\n  REQUIRE_FALSE(sem->Release(10, &previous_count));\n  REQUIRE(previous_count == -1);\n  sem = Semaphore::Create(0, 5);\n  REQUIRE(sem);\n  REQUIRE_FALSE(sem->Release(10, &previous_count));\n  REQUIRE(previous_count == -1);\n  REQUIRE_FALSE(sem->Release(10, &previous_count));\n  REQUIRE(previous_count == -1);\n\n  // Test invalid Release parameters\n  REQUIRE_FALSE(sem->Release(0, &previous_count));\n  REQUIRE(previous_count == -1);\n  REQUIRE_FALSE(sem->Release(-1, &previous_count));\n  REQUIRE(previous_count == -1);\n\n  // Wait on fully available semaphore\n  sem = Semaphore::Create(5, 5);\n  REQUIRE(sem);\n  result = Wait(sem.get(), false, 10ms);\n  REQUIRE(result == WaitResult::kSuccess);\n  result = Wait(sem.get(), false, 10ms);\n  REQUIRE(result == WaitResult::kSuccess);\n  result = Wait(sem.get(), false, 10ms);\n  REQUIRE(result == WaitResult::kSuccess);\n  result = Wait(sem.get(), false, 10ms);\n  REQUIRE(result == WaitResult::kSuccess);\n  result = Wait(sem.get(), false, 10ms);\n  REQUIRE(result == WaitResult::kSuccess);\n  result = Wait(sem.get(), false, 10ms);\n  REQUIRE(result == WaitResult::kTimeout);\n\n  // Semaphore between threads\n  sem = Semaphore::Create(5, 5);\n  REQUIRE(sem);\n  // Occupy the semaphore with 5 threads\n  std::atomic<int> wait_count(0);\n  std::atomic<bool> threads_terminate(false);\n  auto func = [&sem, &wait_count, &threads_terminate] {\n    auto res = Wait(sem.get(), false, 100ms);\n    wait_count++;\n\n    REQUIRE(spin_wait_for(2s, [&] { return threads_terminate.load(); }));\n\n    REQUIRE(res == WaitResult::kSuccess);\n    sem->Release(1, nullptr);\n  };\n  auto threads = std::array<std::thread, 5>{\n      std::thread(func), std::thread(func), std::thread(func),\n      std::thread(func), std::thread(func),\n  };\n  // Wait for threads to finish semaphore calls\n  REQUIRE(spin_wait_for(1s, [&] { return wait_count == 5; }));\n  // Attempt to acquire full semaphore with current (6th) thread\n  result = Wait(sem.get(), false, 20ms);\n  REQUIRE(result == WaitResult::kTimeout);\n  // Give threads time to release semaphore\n  threads_terminate = true;\n  for (auto& t : threads) {\n    t.join();\n  }\n  result = Wait(sem.get(), false, 10ms);\n  REQUIRE(result == WaitResult::kSuccess);\n  sem->Release(1, &previous_count);\n  REQUIRE(previous_count == 4);\n}\n\nTEST_CASE(\"Invalid semaphore parameters\", \"[semaphore]\") {\n  std::unique_ptr<Semaphore> sem;\n\n  // Test invalid construction parameters\n  // These are invalid according to documentation\n  sem = Semaphore::Create(-1, 5);\n  REQUIRE(sem == nullptr);\n  sem = Semaphore::Create(10, 5);\n  REQUIRE(sem == nullptr);\n  sem = Semaphore::Create(0, 0);\n  REQUIRE(sem == nullptr);\n  sem = Semaphore::Create(0, -1);\n  REQUIRE(sem == nullptr);\n  sem = Semaphore::Create(-1, 0);\n  REQUIRE(sem == nullptr);\n}\n\nTEST_CASE(\"Wait on Multiple Semaphores\", \"[semaphore]\") {\n  WaitResult all_result;\n  std::pair<WaitResult, size_t> any_result;\n  int previous_count;\n  std::unique_ptr<Semaphore> sem0, sem1;\n\n  // Test Wait all which should fail\n  sem0 = Semaphore::Create(0, 5);\n  sem1 = Semaphore::Create(5, 5);\n  REQUIRE(sem0);\n  REQUIRE(sem1);\n  all_result = WaitAll({sem0.get(), sem1.get()}, false, 10ms);\n  REQUIRE(all_result == WaitResult::kTimeout);\n  previous_count = -1;\n  REQUIRE(sem0->Release(1, &previous_count));\n  REQUIRE(previous_count == 0);\n  previous_count = -1;\n  REQUIRE_FALSE(sem1->Release(1, &previous_count));\n  REQUIRE(previous_count == -1);\n\n  // Test Wait all again which should succeed\n  sem0 = Semaphore::Create(1, 5);\n  sem1 = Semaphore::Create(5, 5);\n  REQUIRE(sem0);\n  REQUIRE(sem1);\n  all_result = WaitAll({sem0.get(), sem1.get()}, false, 10ms);\n  REQUIRE(all_result == WaitResult::kSuccess);\n  previous_count = -1;\n  REQUIRE(sem0->Release(1, &previous_count));\n  REQUIRE(previous_count == 0);\n  previous_count = -1;\n  REQUIRE(sem1->Release(1, &previous_count));\n  REQUIRE(previous_count == 4);\n\n  // Test Wait Any which should fail\n  sem0 = Semaphore::Create(0, 5);\n  sem1 = Semaphore::Create(0, 5);\n  REQUIRE(sem0);\n  REQUIRE(sem1);\n  any_result = WaitAny({sem0.get(), sem1.get()}, false, 10ms);\n  REQUIRE(any_result.first == WaitResult::kTimeout);\n  REQUIRE(any_result.second == 0);\n  previous_count = -1;\n  REQUIRE(sem0->Release(1, &previous_count));\n  REQUIRE(previous_count == 0);\n  previous_count = -1;\n  REQUIRE(sem1->Release(1, &previous_count));\n  REQUIRE(previous_count == 0);\n\n  // Test Wait Any which should succeed\n  sem0 = Semaphore::Create(0, 5);\n  sem1 = Semaphore::Create(5, 5);\n  REQUIRE(sem0);\n  REQUIRE(sem1);\n  any_result = WaitAny({sem0.get(), sem1.get()}, false, 10ms);\n  REQUIRE(any_result.first == WaitResult::kSuccess);\n  REQUIRE(any_result.second == 1);\n  previous_count = -1;\n  REQUIRE(sem0->Release(1, &previous_count));\n  REQUIRE(previous_count == 0);\n  previous_count = -1;\n  REQUIRE(sem1->Release(1, &previous_count));\n  REQUIRE(previous_count == 4);\n}\n\nTEST_CASE(\"Wait on Mutant\", \"[mutant]\") {\n  WaitResult result;\n  std::unique_ptr<Mutant> mut;\n\n  // Release on initially owned mutant\n  mut = Mutant::Create(true);\n  REQUIRE(mut->Release());\n  REQUIRE_FALSE(mut->Release());\n\n  // Release on initially not-owned mutant\n  mut = Mutant::Create(false);\n  REQUIRE_FALSE(mut->Release());\n\n  // Wait on initially owned mutant\n  mut = Mutant::Create(true);\n  result = Wait(mut.get(), false, 1ms);\n  REQUIRE(result == WaitResult::kSuccess);\n  REQUIRE(mut->Release());\n  REQUIRE(mut->Release());\n  REQUIRE_FALSE(mut->Release());\n\n  // Wait on initially not owned mutant\n  mut = Mutant::Create(false);\n  result = Wait(mut.get(), false, 1ms);\n  REQUIRE(result == WaitResult::kSuccess);\n  REQUIRE(mut->Release());\n  REQUIRE_FALSE(mut->Release());\n\n  // Multiple waits (or locks)\n  mut = Mutant::Create(false);\n  for (int i = 0; i < 10; ++i) {\n    result = Wait(mut.get(), false, 1ms);\n    REQUIRE(result == WaitResult::kSuccess);\n  }\n  for (int i = 0; i < 10; ++i) {\n    REQUIRE(mut->Release());\n  }\n  REQUIRE_FALSE(mut->Release());\n\n  // Test mutants on other threads\n  std::atomic<unsigned int> step(0);\n  auto thread1 = std::thread([&mut, &step] {\n    mut = Mutant::Create(true);\n    step++;  // 1\n    REQUIRE(spin_wait_for(2s, [&] { return step == 2; }));\n    mut->Release();\n  });\n  REQUIRE(spin_wait_for(1s, [&] { return step == 1; }));\n  REQUIRE_FALSE(mut->Release());\n  result = Wait(mut.get(), false, 50ms);\n  REQUIRE(result == WaitResult::kTimeout);\n  step++;  // 2\n  thread1.join();\n  result = Wait(mut.get(), false, 1ms);\n  REQUIRE(result == WaitResult::kSuccess);\n  REQUIRE(mut->Release());\n}\n\nTEST_CASE(\"Wait on Multiple Mutants\", \"[mutant]\") {\n  WaitResult all_result;\n  std::pair<WaitResult, size_t> any_result;\n  std::unique_ptr<Mutant> mut0, mut1;\n  std::atomic<unsigned int> step(0);\n\n  // Test which should fail for WaitAll and WaitAny\n  auto thread0 = std::thread([&mut0, &mut1, &step] {\n    mut0 = Mutant::Create(true);\n    mut1 = Mutant::Create(true);\n    step++;  // 1\n    REQUIRE(spin_wait_for(2s, [&] { return step == 2; }));\n    mut0->Release();\n    mut1->Release();\n  });\n  REQUIRE(spin_wait_for(1s, [&] { return step == 1; }));\n  all_result = WaitAll({mut0.get(), mut1.get()}, false, 10ms);\n  REQUIRE(all_result == WaitResult::kTimeout);\n  REQUIRE_FALSE(mut0->Release());\n  REQUIRE_FALSE(mut1->Release());\n  any_result = WaitAny({mut0.get(), mut1.get()}, false, 10ms);\n  REQUIRE(any_result.first == WaitResult::kTimeout);\n  REQUIRE(any_result.second == 0);\n  REQUIRE_FALSE(mut0->Release());\n  REQUIRE_FALSE(mut1->Release());\n  step++;  // 2\n  thread0.join();\n\n  // Test which should fail for WaitAll but not WaitAny\n  step = 0;\n  auto thread1 = std::thread([&mut0, &mut1, &step] {\n    mut0 = Mutant::Create(true);\n    mut1 = Mutant::Create(false);\n    step++;  // 1\n    REQUIRE(spin_wait_for(2s, [&] { return step == 2; }));\n    mut0->Release();\n  });\n  REQUIRE(spin_wait_for(1s, [&] { return step == 1; }));\n  all_result = WaitAll({mut0.get(), mut1.get()}, false, 10ms);\n  REQUIRE(all_result == WaitResult::kTimeout);\n  REQUIRE_FALSE(mut0->Release());\n  REQUIRE_FALSE(mut1->Release());\n  any_result = WaitAny({mut0.get(), mut1.get()}, false, 10ms);\n  REQUIRE(any_result.first == WaitResult::kSuccess);\n  REQUIRE(any_result.second == 1);\n  REQUIRE_FALSE(mut0->Release());\n  REQUIRE(mut1->Release());\n  step++;  // 2\n  thread1.join();\n\n  // Test which should pass for WaitAll and WaitAny\n  step = 0;\n  auto thread2 = std::thread([&mut0, &mut1, &step] {\n    mut0 = Mutant::Create(false);\n    mut1 = Mutant::Create(false);\n    step++;  // 1\n    REQUIRE(spin_wait_for(2s, [&] { return step == 2; }));\n  });\n  REQUIRE(spin_wait_for(1s, [&] { return step == 1; }));\n  all_result = WaitAll({mut0.get(), mut1.get()}, false, 10ms);\n  REQUIRE(all_result == WaitResult::kSuccess);\n  REQUIRE(mut0->Release());\n  REQUIRE(mut1->Release());\n  any_result = WaitAny({mut0.get(), mut1.get()}, false, 10ms);\n  REQUIRE(any_result.first == WaitResult::kSuccess);\n  REQUIRE(any_result.second == 0);\n  REQUIRE(mut0->Release());\n  REQUIRE_FALSE(mut1->Release());\n  step++;  // 2\n  thread2.join();\n}\n\nTEST_CASE(\"Wait on Timer\", \"[timer]\") {\n  WaitResult result;\n  std::unique_ptr<Timer> timer;\n\n  // Test Manual Reset\n  timer = Timer::CreateManualResetTimer();\n  REQUIRE(timer);\n  result = Wait(timer.get(), false, 1ms);\n  REQUIRE(result == WaitResult::kTimeout);\n  REQUIRE(timer->SetOnceAfter(1ms));  // Signals it\n  result = Wait(timer.get(), false, 20ms);\n  REQUIRE(result == WaitResult::kSuccess);\n  result = Wait(timer.get(), false, 1ms);\n  REQUIRE(result == WaitResult::kSuccess);  // Did not reset\n\n  // Test Synchronization\n  timer = Timer::CreateSynchronizationTimer();\n  REQUIRE(timer);\n  result = Wait(timer.get(), false, 1ms);\n  REQUIRE(result == WaitResult::kTimeout);\n  REQUIRE(timer->SetOnceAfter(1ms));  // Signals it\n  result = Wait(timer.get(), false, 20ms);\n  REQUIRE(result == WaitResult::kSuccess);\n  result = Wait(timer.get(), false, 1ms);\n  REQUIRE(result == WaitResult::kTimeout);  // Did reset\n\n  // Test long due time\n  timer = Timer::CreateSynchronizationTimer();\n  REQUIRE(timer->SetOnceAfter(10s));\n  result = Wait(timer.get(), false, 10ms);\n  REQUIRE(result == WaitResult::kTimeout);\n\n  // Test Repeating\n  REQUIRE(timer->SetRepeatingAfter(1ms, 10ms));\n  for (int i = 0; i < 10; ++i) {\n    result = Wait(timer.get(), false, 20ms);\n    INFO(i);\n    REQUIRE(result == WaitResult::kSuccess);\n  }\n  MaybeYield();\n  Sleep(10ms);  // Skip a few events\n  for (int i = 0; i < 10; ++i) {\n    result = Wait(timer.get(), false, 20ms);\n    REQUIRE(result == WaitResult::kSuccess);\n  }\n  // Cancel it\n  timer->Cancel();\n  result = Wait(timer.get(), false, 20ms);\n  REQUIRE(result == WaitResult::kTimeout);\n  MaybeYield();\n  Sleep(10ms);  // Skip a few events\n  result = Wait(timer.get(), false, 20ms);\n  REQUIRE(result == WaitResult::kTimeout);\n  // Cancel with SetOnce\n  REQUIRE(timer->SetRepeatingAfter(1ms, 10ms));\n  for (int i = 0; i < 10; ++i) {\n    result = Wait(timer.get(), false, 20ms);\n    REQUIRE(result == WaitResult::kSuccess);\n  }\n  REQUIRE(timer->SetOnceAfter(1ms));\n  result = Wait(timer.get(), false, 20ms);\n  REQUIRE(result == WaitResult::kSuccess);  // Signal from Set Once\n  result = Wait(timer.get(), false, 20ms);\n  REQUIRE(result == WaitResult::kTimeout);  // No more signals from repeating\n}\n\nTEST_CASE(\"Wait on Multiple Timers\", \"[timer]\") {\n  WaitResult all_result;\n  std::pair<WaitResult, size_t> any_result;\n\n  auto timer0 = Timer::CreateSynchronizationTimer();\n  auto timer1 = Timer::CreateManualResetTimer();\n\n  // None signaled\n  all_result = WaitAll({timer0.get(), timer1.get()}, false, 1ms);\n  REQUIRE(all_result == WaitResult::kTimeout);\n  any_result = WaitAny({timer0.get(), timer1.get()}, false, 1ms);\n  REQUIRE(any_result.first == WaitResult::kTimeout);\n  REQUIRE(any_result.second == 0);\n\n  // Some signaled\n  REQUIRE(timer1->SetOnceAfter(1ms));\n  all_result = WaitAll({timer0.get(), timer1.get()}, false, 100ms);\n  REQUIRE(all_result == WaitResult::kTimeout);\n  any_result = WaitAny({timer0.get(), timer1.get()}, false, 100ms);\n  REQUIRE(any_result.first == WaitResult::kSuccess);\n  REQUIRE(any_result.second == 1);\n\n  // All signaled\n  REQUIRE(timer0->SetOnceAfter(1ms));\n  all_result = WaitAll({timer0.get(), timer1.get()}, false, 100ms);\n  REQUIRE(all_result == WaitResult::kSuccess);\n  REQUIRE(timer0->SetOnceAfter(1ms));\n  Sleep(2ms);\n  any_result = WaitAny({timer0.get(), timer1.get()}, false, 100ms);\n  REQUIRE(any_result.first == WaitResult::kSuccess);\n  REQUIRE(any_result.second == 0);\n\n  // Check that timer0 reset\n  any_result = WaitAny({timer0.get(), timer1.get()}, false, 100ms);\n  REQUIRE(any_result.first == WaitResult::kSuccess);\n  REQUIRE(any_result.second == 1);\n}\n\nTEST_CASE(\"Create and Trigger Timer Callbacks\", \"[timer]\") {\n  // TODO(bwrsandman): Check which thread performs callback and timing of\n  // callback\n  REQUIRE(true);\n}\n\nTEST_CASE(\"Set and Test Current Thread ID\", \"[thread]\") {\n  // System ID\n  auto system_id = current_thread_system_id();\n  REQUIRE(system_id > 0);\n\n  // Thread ID\n  auto thread_id = current_thread_id();\n  REQUIRE(thread_id == system_id);\n\n  // Set a new thread id\n  const uint32_t new_thread_id = 0xDEADBEEF;\n  set_current_thread_id(new_thread_id);\n  REQUIRE(current_thread_id() == new_thread_id);\n\n  // Set back original thread id of system\n  set_current_thread_id(std::numeric_limits<uint32_t>::max());\n  REQUIRE(current_thread_id() == system_id);\n\n  // TODO(bwrsandman): Test on Thread object\n}\n\nTEST_CASE(\"Set and Test Current Thread Name\", \"[thread]\") {\n  auto current_thread = Thread::GetCurrentThread();\n  REQUIRE(current_thread);\n  auto old_thread_name = current_thread->name();\n\n  std::string new_thread_name = \"Threading Test\";\n  REQUIRE_NOTHROW(set_name(new_thread_name));\n\n  // Restore the old catch.hpp thread name\n  REQUIRE_NOTHROW(set_name(old_thread_name));\n}\n\nTEST_CASE(\"Create and Run Thread\", \"[thread]\") {\n  std::unique_ptr<Thread> thread;\n  WaitResult result;\n  Thread::CreationParameters params = {};\n  std::atomic<unsigned int> fence(0);\n  auto func = [&fence] {\n    REQUIRE(spin_wait_for(1s, [&] { return fence == 1; }));\n    fence++;\n  };\n\n  SECTION(\"Create most basic case of thread\") {\n    fence = 0;\n    thread = Thread::Create(params, func);\n    REQUIRE(thread->native_handle() != nullptr);\n    REQUIRE_NOTHROW(thread->affinity_mask());\n    REQUIRE(thread->name().empty());\n    fence++;\n    result = Wait(thread.get(), false, 1s);\n    REQUIRE(result == WaitResult::kSuccess);\n  }\n\n  SECTION(\"Add thread name\") {\n    fence = 0;\n    std::string new_name = \"Test thread name\";\n    thread = Thread::Create(params, func);\n    auto name = thread->name();\n    INFO(name.c_str());\n    REQUIRE(name.empty());\n    thread->set_name(new_name);\n    REQUIRE(thread->name() == new_name);\n    fence++;\n    result = Wait(thread.get(), false, 1s);\n    REQUIRE(result == WaitResult::kSuccess);\n  }\n\n  SECTION(\"Use Terminate to end an infinitely looping thread\") {\n    thread = Thread::Create(params, [] {\n      while (true) {\n        Sleep(1ms);\n      }\n    });\n    result = Wait(thread.get(), false, 1s);\n    REQUIRE(result == WaitResult::kTimeout);\n    thread->Terminate(-1);\n    result = Wait(thread.get(), false, 1s);\n    REQUIRE(result == WaitResult::kSuccess);\n  }\n\n  SECTION(\"Call Exit from inside an infinitely looping thread\") {\n    thread = Thread::Create(params, [] {\n      Thread::Exit(-1);\n      FAIL(\"Function must not return\");\n      while (true)\n        ;\n    });\n    result = Wait(thread.get(), false, 1s);\n    REQUIRE(result == WaitResult::kSuccess);\n  }\n\n  SECTION(\"Call timeout wait on self\") {\n    result = Wait(Thread::GetCurrentThread(), false, 50ms);\n    REQUIRE(result == WaitResult::kTimeout);\n  }\n\n  SECTION(\"16Mb stack size\") {\n    params.stack_size = 16_MiB;\n    thread = Thread::Create(params, [] {\n      Thread::Exit(-1);\n      FAIL(\"Function must not return\");\n      while (true)\n        ;\n    });\n    REQUIRE(thread != nullptr);\n    result = Wait(thread.get(), false, 1s);\n    REQUIRE(result == WaitResult::kSuccess);\n  }\n\n  // TODO(bwrsandman): Test with different priorities\n  // TODO(bwrsandman): Test setting and getting thread affinity\n}\n\nTEST_CASE(\"Test Suspending Thread\", \"[thread]\") {\n  std::unique_ptr<Thread> thread;\n  WaitResult result;\n  Thread::CreationParameters params = {};\n  auto func = [] { Sleep(20ms); };\n\n  // Create initially suspended\n  params.create_suspended = true;\n  thread = threading::Thread::Create(params, func);\n  result = threading::Wait(thread.get(), false, 50ms);\n  REQUIRE(result == threading::WaitResult::kTimeout);\n  thread->Resume();\n  result = threading::Wait(thread.get(), false, 50ms);\n  REQUIRE(result == threading::WaitResult::kSuccess);\n  params.create_suspended = false;\n\n  // Create and then suspend\n  thread = threading::Thread::Create(params, func);\n  thread->Suspend();\n  result = threading::Wait(thread.get(), false, 50ms);\n  REQUIRE(result == threading::WaitResult::kTimeout);\n  thread->Resume();\n  result = threading::Wait(thread.get(), false, 50ms);\n  REQUIRE(result == threading::WaitResult::kSuccess);\n\n  // Test recursive suspend\n  thread = threading::Thread::Create(params, func);\n  thread->Suspend();\n  thread->Suspend();\n  result = threading::Wait(thread.get(), false, 50ms);\n  REQUIRE(result == threading::WaitResult::kTimeout);\n  thread->Resume();\n  result = threading::Wait(thread.get(), false, 50ms);\n  REQUIRE(result == threading::WaitResult::kTimeout);\n  thread->Resume();\n  result = threading::Wait(thread.get(), false, 50ms);\n  REQUIRE(result == threading::WaitResult::kSuccess);\n\n  // Test suspend count\n  uint32_t suspend_count = 0;\n  thread = threading::Thread::Create(params, func);\n  thread->Suspend(&suspend_count);\n  REQUIRE(suspend_count == 0);\n  thread->Suspend(&suspend_count);\n  REQUIRE(suspend_count == 1);\n  thread->Suspend(&suspend_count);\n  REQUIRE(suspend_count == 2);\n  thread->Resume(&suspend_count);\n  REQUIRE(suspend_count == 3);\n  thread->Resume(&suspend_count);\n  REQUIRE(suspend_count == 2);\n  thread->Resume(&suspend_count);\n  REQUIRE(suspend_count == 1);\n  thread->Suspend(&suspend_count);\n  REQUIRE(suspend_count == 0);\n  thread->Resume(&suspend_count);\n  REQUIRE(suspend_count == 1);\n  result = threading::Wait(thread.get(), false, 50ms);\n  REQUIRE(result == threading::WaitResult::kSuccess);\n}\n\nTEST_CASE(\"Test Thread QueueUserCallback\", \"[thread]\") {\n  std::unique_ptr<Thread> thread;\n  WaitResult result;\n  Thread::CreationParameters params = {};\n  std::atomic_int order;\n  int is_modified;\n  int has_finished;\n  auto callback = [&is_modified, &order] {\n    is_modified = std::atomic_fetch_add_explicit(\n        &order, 1, std::memory_order::memory_order_relaxed);\n  };\n\n  // Without alertable\n  order = 0;\n  is_modified = -1;\n  has_finished = -1;\n  thread = Thread::Create(params, [&has_finished, &order] {\n    // Not using Alertable so callback is not registered\n    order++;  // 1\n    Sleep(90ms);\n    order++;  // 2\n    has_finished = std::atomic_fetch_add_explicit(\n        &order, 1, std::memory_order::memory_order_relaxed);\n  });\n  REQUIRE(!spin_wait_for(50ms, [&] { return order == 2; }));\n  REQUIRE(is_modified == -1);\n  thread->QueueUserCallback(callback);\n  result = Wait(thread.get(), true, 200ms);\n  REQUIRE(result == WaitResult::kSuccess);\n  REQUIRE(is_modified == -1);\n  REQUIRE(has_finished == 2);\n\n  // With alertable\n  order = 0;\n  is_modified = -1;\n  has_finished = -1;\n  thread = Thread::Create(params, [&has_finished, &order] {\n    // Using Alertable so callback is registered\n    order++;  // 1\n    AlertableSleep(90ms);\n    order++;  // 3\n    has_finished = std::atomic_fetch_add_explicit(\n        &order, 1, std::memory_order::memory_order_relaxed);\n  });\n  REQUIRE(!spin_wait_for(50ms, [&] { return order == 2; }));\n  REQUIRE(is_modified == -1);\n  thread->QueueUserCallback(callback);\n  result = Wait(thread.get(), true, 200ms);\n  REQUIRE(result == WaitResult::kSuccess);\n  REQUIRE(is_modified == 1);\n  REQUIRE(has_finished == 3);\n\n  // Test Exit command with QueueUserCallback\n  order = 0;\n  is_modified = -1;\n  has_finished = -1;\n  thread = Thread::Create(params, [&is_modified, &has_finished, &order] {\n    is_modified = std::atomic_fetch_add_explicit(\n        &order, 1, std::memory_order::memory_order_relaxed);\n    // Using Alertable so callback is registered\n    order++;  // 2\n    AlertableSleep(1s);\n    FAIL(\"Thread should have been terminated during alertable sleep\");\n    while (true)\n      ;\n  });\n  REQUIRE(!spin_wait_for(100ms, [&] { return order == 3; }));  // timeout\n  thread->QueueUserCallback([] { Thread::Exit(0); });\n  result = Wait(thread.get(), true, 500ms);\n  REQUIRE(result == WaitResult::kSuccess);\n  REQUIRE(is_modified == 0);\n  REQUIRE(order == 2);\n\n  // TODO(bwrsandman): Test alertable wait returning kUserCallback by using IO\n  // callbacks.\n}\n\n}  // namespace test\n}  // namespace base\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/base/testing/utf8_test.cc",
    "content": "﻿/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include <string>\n#include <vector>\n\n#include \"xenia/base/string.h\"\n\n#include \"third_party/catch/include/catch.hpp\"\n\nnamespace xe::base::test {\n\n// TODO(gibbed): bit messy?\n// TODO(gibbed): predicate variant?\n\n#define TEST_EXAMPLE(func, left, right) REQUIRE(func(left) == right)\n\n#define TEST_EXAMPLES_1(func, language, results) \\\n  TEST_EXAMPLE(func, examples::k##language##Values[0], results.language[0])\n#define TEST_EXAMPLES_2(func, language, results)                             \\\n  TEST_EXAMPLE(func, examples::k##language##Values[0], results.language[0]); \\\n  TEST_EXAMPLE(func, examples::k##language##Values[1], results.language[1])\n#define TEST_EXAMPLES_3(func, language, results)                             \\\n  TEST_EXAMPLE(func, examples::k##language##Values[0], results.language[0]); \\\n  TEST_EXAMPLE(func, examples::k##language##Values[1], results.language[1]); \\\n  TEST_EXAMPLE(func, examples::k##language##Values[2], results.language[2])\n\nnamespace examples {\n\n// https://www.cl.cam.ac.uk/~mgk25/ucs/examples/quickbrown.txt\n\nconst size_t kDanishCount = 1;\nconst char* kDanishValues[kDanishCount] = {\n    u8\"Quizdeltagerne spiste jordbær med fløde, mens cirkusklovnen Wolther \"\n    u8\"spillede på xylofon.\",\n};\n#define TEST_LANGUAGE_EXAMPLES_Danish(func, results) \\\n  TEST_EXAMPLES_1(func, Danish, results)\n\nconst size_t kGermanCount = 3;\nconst char* kGermanValues[kGermanCount] = {\n    u8\"Falsches Üben von Xylophonmusik quält jeden größeren Zwerg\",\n    u8\"Zwölf Boxkämpfer jagten Eva quer über den Sylter Deich\",\n    u8\"Heizölrückstoßabdämpfung\",\n};\n#define TEST_LANGUAGE_EXAMPLES_German(func, results) \\\n  TEST_EXAMPLES_2(func, German, results)\n\nconst size_t kGreekCount = 2;\nconst char* kGreekValues[kGreekCount] = {\n    u8\"Γαζέες καὶ μυρτιὲς δὲν θὰ βρῶ πιὰ στὸ χρυσαφὶ ξέφωτο\",\n    u8\"Ξεσκεπάζω τὴν ψυχοφθόρα βδελυγμία\",\n};\n#define TEST_LANGUAGE_EXAMPLES_Greek(func, results) \\\n  TEST_EXAMPLES_2(func, Greek, results)\n\nconst size_t kEnglishCount = 1;\nconst char* kEnglishValues[kEnglishCount] = {\n    u8\"The quick brown fox jumps over the lazy dog\",\n};\n#define TEST_LANGUAGE_EXAMPLES_English(func, results) \\\n  TEST_EXAMPLES_1(func, English, results)\n\nconst size_t kSpanishCount = 1;\nconst char* kSpanishValues[kSpanishCount] = {\n    u8\"El pingüino Wenceslao hizo kilómetros bajo exhaustiva lluvia y frío, \"\n    u8\"añoraba a su querido cachorro.\",\n};\n#define TEST_LANGUAGE_EXAMPLES_Spanish(func, results) \\\n  TEST_EXAMPLES_1(func, Spanish, results)\n\nconst size_t kFrenchCount = 3;\nconst char* kFrenchValues[kFrenchCount] = {\n    u8\"Portez ce vieux whisky au juge blond qui fume sur son île intérieure, à \"\n    u8\"côté de l'alcôve ovoïde, où les bûches se consument dans l'âtre, ce qui \"\n    u8\"lui permet de penser à la cænogenèse de l'être dont il est question \"\n    u8\"dans la cause ambiguë entendue à Moÿ, dans un capharnaüm qui, \"\n    u8\"pense-t-il, diminue çà et là la qualité de son œuvre.\",\n    u8\"l'île exiguë\\n\"\n    u8\"Où l'obèse jury mûr\\n\"\n    u8\"Fête l'haï volapük,\\n\"\n    u8\"Âne ex aéquo au whist,\\n\"\n    u8\"Ôtez ce vœu déçu.\",\n    u8\"Le cœur déçu mais l'âme plutôt naïve, Louÿs rêva de crapaüter en canoë \"\n    u8\"au delà des îles, près du mälström où brûlent les novæ.\",\n};\n#define TEST_LANGUAGE_EXAMPLES_French(func, results) \\\n  TEST_EXAMPLES_3(func, French, results)\n\nconst size_t kIrishGaelicCount = 1;\nconst char* kIrishGaelicValues[kIrishGaelicCount] = {\n    u8\"D'fhuascail Íosa, Úrmhac na hÓighe Beannaithe, pór Éava agus Ádhaimh\",\n};\n#define TEST_LANGUAGE_EXAMPLES_IrishGaelic(func, results) \\\n  TEST_EXAMPLES_1(func, IrishGaelic, results)\n\nconst size_t kHungarianCount = 1;\nconst char* kHungarianValues[kHungarianCount] = {\n    u8\"Árvíztűrő tükörfúrógép\",\n};\n#define TEST_LANGUAGE_EXAMPLES_Hungarian(func, results) \\\n  TEST_EXAMPLES_1(func, Hungarian, results)\n\nconst size_t kIcelandicCount = 2;\nconst char* kIcelandicValues[kIcelandicCount] = {\n    u8\"Kæmi ný öxi hér ykist þjófum nú bæði víl og ádrepa\",\n    u8\"Sævör grét áðan því úlpan var ónýt\",\n};\n#define TEST_LANGUAGE_EXAMPLES_Icelandic(func, results) \\\n  TEST_EXAMPLES_2(func, Icelandic, results)\n\nconst size_t kJapaneseCount = 2;\nconst char* kJapaneseValues[kJapaneseCount] = {\n    u8\"いろはにほへとちりぬるを\\n\"\n    u8\"わかよたれそつねならむ\\n\"\n    u8\"うゐのおくやまけふこえて\\n\"\n    u8\"あさきゆめみしゑひもせす\\n\",\n    u8\"イロハニホヘト チリヌルヲ ワカヨタレソ ツネナラム\\n\"\n    u8\"ウヰノオクヤマ ケフコエテ アサキユメミシ ヱヒモセスン\",\n};\n#define TEST_LANGUAGE_EXAMPLES_Japanese(func, results) \\\n  TEST_EXAMPLES_2(func, Japanese, results)\n\nconst size_t kHebrewCount = 1;\nconst char* kHebrewValues[kHebrewCount] = {\n    u8\"? דג סקרן שט בים מאוכזב ולפתע מצא לו חברה איך הקליטה\",\n};\n#define TEST_LANGUAGE_EXAMPLES_Hebrew(func, results) \\\n  TEST_EXAMPLES_1(func, Hebrew, results)\n\nconst size_t kPolishCount = 1;\nconst char* kPolishValues[kPolishCount] = {\n    u8\"Pchnąć w tę łódź jeża lub ośm skrzyń fig\",\n};\n#define TEST_LANGUAGE_EXAMPLES_Polish(func, results) \\\n  TEST_EXAMPLES_1(func, Polish, results)\n\nconst size_t kRussianCount = 2;\nconst char* kRussianValues[kRussianCount] = {\n    u8\"В чащах юга жил бы цитрус? Да, но фальшивый экземпляр!\",\n    u8\"Съешь же ещё этих мягких французских булок да выпей чаю\",\n};\n#define TEST_LANGUAGE_EXAMPLES_Russian(func, results) \\\n  TEST_EXAMPLES_2(func, Russian, results)\n\nconst size_t kTurkishCount = 1;\nconst char* kTurkishValues[kTurkishCount] = {\n    u8\"Pijamalı hasta, yağız şoföre çabucak güvendi.\",\n};\n#define TEST_LANGUAGE_EXAMPLES_Turkish(func, results) \\\n  TEST_EXAMPLES_1(func, Turkish, results)\n\n#define TEST_LANGUAGE_EXAMPLES(func, results)        \\\n  TEST_LANGUAGE_EXAMPLES_Danish(func, results);      \\\n  TEST_LANGUAGE_EXAMPLES_German(func, results);      \\\n  TEST_LANGUAGE_EXAMPLES_Greek(func, results);       \\\n  TEST_LANGUAGE_EXAMPLES_English(func, results);     \\\n  TEST_LANGUAGE_EXAMPLES_Spanish(func, results);     \\\n  TEST_LANGUAGE_EXAMPLES_French(func, results);      \\\n  TEST_LANGUAGE_EXAMPLES_IrishGaelic(func, results); \\\n  TEST_LANGUAGE_EXAMPLES_Hungarian(func, results);   \\\n  TEST_LANGUAGE_EXAMPLES_Icelandic(func, results);   \\\n  TEST_LANGUAGE_EXAMPLES_Japanese(func, results);    \\\n  TEST_LANGUAGE_EXAMPLES_Hebrew(func, results);      \\\n  TEST_LANGUAGE_EXAMPLES_Polish(func, results);      \\\n  TEST_LANGUAGE_EXAMPLES_Russian(func, results);     \\\n  TEST_LANGUAGE_EXAMPLES_Turkish(func, results)\n\n}  // namespace examples\n\n#define TEST_EXAMPLE_RESULT(language) T language[examples::k##language##Count]\ntemplate <typename T>\nstruct example_results {\n  TEST_EXAMPLE_RESULT(Danish);\n  TEST_EXAMPLE_RESULT(German);\n  TEST_EXAMPLE_RESULT(Greek);\n  TEST_EXAMPLE_RESULT(English);\n  TEST_EXAMPLE_RESULT(Spanish);\n  TEST_EXAMPLE_RESULT(French);\n  TEST_EXAMPLE_RESULT(IrishGaelic);\n  TEST_EXAMPLE_RESULT(Hungarian);\n  TEST_EXAMPLE_RESULT(Icelandic);\n  TEST_EXAMPLE_RESULT(Japanese);\n  TEST_EXAMPLE_RESULT(Hebrew);\n  TEST_EXAMPLE_RESULT(Polish);\n  TEST_EXAMPLE_RESULT(Russian);\n  TEST_EXAMPLE_RESULT(Turkish);\n};\n#undef TEST_EXAMPLE_RESULT\n\nTEST_CASE(\"UTF-8 Count\", \"[utf8]\") {\n  example_results<size_t> results = {};\n  results.Danish[0] = 88;\n  results.German[0] = 58;\n  results.German[1] = 54;\n  results.Greek[0] = 52;\n  results.Greek[1] = 33;\n  results.English[0] = 43;\n  results.Spanish[0] = 99;\n  results.French[0] = 327;\n  results.French[1] = 93;\n  results.French[2] = 126;\n  results.IrishGaelic[0] = 68;\n  results.Hungarian[0] = 22;\n  results.Icelandic[0] = 50;\n  results.Icelandic[1] = 34;\n  results.Japanese[0] = 51;\n  results.Japanese[1] = 55;\n  results.Hebrew[0] = 52;\n  results.Polish[0] = 40;\n  results.Russian[0] = 54;\n  results.Russian[1] = 55;\n  results.Turkish[0] = 45;\n  TEST_LANGUAGE_EXAMPLES(utf8::count, results);\n}\n\n// TODO(gibbed): lower_ascii\n// TODO(gibbed): upper_ascii\n// TODO(gibbed): hash_fnv1a\n// TODO(gibbed): hash_fnv1a_case\n\nTEST_CASE(\"UTF-8 Split\", \"[utf8]\") {\n  std::vector<std::string_view> parts;\n\n  // Danish\n  parts = utf8::split(examples::kDanishValues[0], u8\"æcå\");\n  REQUIRE(parts.size() == 4);\n  REQUIRE(parts[0] == u8\"Quizdeltagerne spiste jordb\");\n  REQUIRE(parts[1] == u8\"r med fløde, mens \");\n  REQUIRE(parts[2] == u8\"irkusklovnen Wolther spillede p\");\n  REQUIRE(parts[3] == u8\" xylofon.\");\n\n  // German\n  parts = utf8::split(examples::kGermanValues[0], u8\"ßS\");\n  REQUIRE(parts.size() == 2);\n  REQUIRE(parts[0] == u8\"Falsches Üben von Xylophonmusik quält jeden grö\");\n  REQUIRE(parts[1] == u8\"eren Zwerg\");\n  parts = utf8::split(examples::kGermanValues[1], u8\"ßS\");\n  REQUIRE(parts.size() == 2);\n  REQUIRE(parts[0] == u8\"Zwölf Boxkämpfer jagten Eva quer über den \");\n  REQUIRE(parts[1] == u8\"ylter Deich\");\n  parts = utf8::split(examples::kGermanValues[2], u8\"ßS\");\n  REQUIRE(parts.size() == 2);\n  REQUIRE(parts[0] == u8\"Heizölrücksto\");\n  REQUIRE(parts[1] == u8\"abdämpfung\");\n\n  // Greek\n  parts = utf8::split(examples::kGreekValues[0], u8\"πφ\");\n  REQUIRE(parts.size() == 4);\n  REQUIRE(parts[0] == u8\"Γαζέες καὶ μυρτιὲς δὲν θὰ βρῶ \");\n  REQUIRE(parts[1] == u8\"ιὰ στὸ χρυσα\");\n  REQUIRE(parts[2] == u8\"ὶ ξέ\");\n  REQUIRE(parts[3] == u8\"ωτο\");\n  parts = utf8::split(examples::kGreekValues[1], u8\"πφ\");\n  REQUIRE(parts.size() == 3);\n  REQUIRE(parts[0] == u8\"Ξεσκε\");\n  REQUIRE(parts[1] == u8\"άζω τὴν ψυχο\");\n  REQUIRE(parts[2] == u8\"θόρα βδελυγμία\");\n\n  // English\n  parts = utf8::split(examples::kEnglishValues[0], \"xy\");\n  REQUIRE(parts.size() == 3);\n  REQUIRE(parts[0] == u8\"The quick brown fo\");\n  REQUIRE(parts[1] == u8\" jumps over the laz\");\n  REQUIRE(parts[2] == u8\" dog\");\n\n  // Spanish\n  parts = utf8::split(examples::kSpanishValues[0], u8\"ójd\");\n  REQUIRE(parts.size() == 4);\n  REQUIRE(parts[0] == u8\"El pingüino Wenceslao hizo kil\");\n  REQUIRE(parts[1] == u8\"metros ba\");\n  REQUIRE(parts[2] == u8\"o exhaustiva lluvia y frío, añoraba a su queri\");\n  REQUIRE(parts[3] == u8\"o cachorro.\");\n\n  // TODO(gibbed): French\n  // TODO(gibbed): Irish Gaelic\n  // TODO(gibbed): Hungarian\n  // TODO(gibbed): Icelandic\n  // TODO(gibbed): Japanese\n  // TODO(gibbed): Hebrew\n  // TODO(gibbed): Polish\n  // TODO(gibbed): Russian\n  // TODO(gibbed): Thai\n  // TODO(gibbed): Turkish\n}\n\nTEST_CASE(\"UTF-8 Equal Z\", \"[utf8]\") {\n  REQUIRE(utf8::equal_z(u8\"foo\", u8\"foo\\0\"));\n  REQUIRE_FALSE(utf8::equal_z(u8\"bar\", u8\"baz\\0\"));\n}\n\nTEST_CASE(\"UTF-8 Equal Case\", \"[utf8]\") {\n  REQUIRE(utf8::equal_case(u8\"foo\", u8\"foo\\0\"));\n  REQUIRE_FALSE(utf8::equal_case(u8\"bar\", u8\"baz\\0\"));\n}\n\nTEST_CASE(\"UTF-8 Equal Case Z\", \"[utf8]\") {\n  REQUIRE(utf8::equal_case_z(u8\"foo\", u8\"foo\\0\"));\n  REQUIRE_FALSE(utf8::equal_case_z(u8\"bar\", u8\"baz\\0\"));\n}\n\n// TODO(gibbed): find_any_of\n// TODO(gibbed): find_any_of_case\n// TODO(gibbed): find_first_of\n// TODO(gibbed): find_first_of_case\n// TODO(gibbed): starts_with\n// TODO(gibbed): starts_with_case\n// TODO(gibbed): ends_with\n// TODO(gibbed): ends_with_case\n// TODO(gibbed): split_path\n\n#define TEST_PATH(func, input, output)                                 \\\n  do {                                                                 \\\n    std::string input_value = input;                                   \\\n    std::string output_value = output;                                 \\\n    REQUIRE(func(input_value, '/') == output_value);                   \\\n    std::replace(input_value.begin(), input_value.end(), '/', '\\\\');   \\\n    std::replace(output_value.begin(), output_value.end(), '/', '\\\\'); \\\n    REQUIRE(func(input_value, '\\\\') == output_value);                  \\\n  } while (0)\n\n#define TEST_PATH_RAW(func, input, output)                             \\\n  do {                                                                 \\\n    std::string output_value = output;                                 \\\n    REQUIRE(func(input, '/') == output_value);                         \\\n    std::replace(output_value.begin(), output_value.end(), '/', '\\\\'); \\\n    REQUIRE(func(input, '\\\\') == output_value);                        \\\n  } while (0)\n\n#define TEST_PATHS(func, output, ...)                                      \\\n  do {                                                                     \\\n    std::vector<std::string> input_values = {__VA_ARGS__};                 \\\n    std::string output_value = output;                                     \\\n    REQUIRE(func(input_values, '/') == output_value);                      \\\n    for (auto it = input_values.begin(); it != input_values.end(); ++it) { \\\n      std::replace((*it).begin(), (*it).end(), '/', '\\\\');                 \\\n    }                                                                      \\\n    std::replace(output_value.begin(), output_value.end(), '/', '\\\\');     \\\n    REQUIRE(func(input_values, '\\\\') == output_value);                     \\\n  } while (0)\n\nTEST_CASE(\"UTF-8 Join Paths\", \"[utf8]\") {\n  TEST_PATHS(utf8::join_paths, u8\"\");\n  TEST_PATHS(utf8::join_paths, u8\"foo\", u8\"foo\");\n  TEST_PATHS(utf8::join_paths, u8\"foo/bar\", u8\"foo\", u8\"bar\");\n  TEST_PATHS(utf8::join_paths, \"X:/foo/bar/baz/qux\", u8\"X:\", u8\"foo\", u8\"bar\",\n             u8\"baz\", u8\"qux\");\n}\n\n// TODO(gibbed): join_guest_paths\n\nTEST_CASE(\"UTF-8 Fix Path Separators\", \"[utf8]\") {\n  TEST_PATH_RAW(utf8::fix_path_separators, \"\", \"\");\n  TEST_PATH_RAW(utf8::fix_path_separators, \"\\\\\", \"/\");\n  TEST_PATH_RAW(utf8::fix_path_separators, \"/\", \"/\");\n  TEST_PATH_RAW(utf8::fix_path_separators, \"\\\\foo\", \"/foo\");\n  TEST_PATH_RAW(utf8::fix_path_separators, \"\\\\foo/\", \"/foo/\");\n  TEST_PATH_RAW(utf8::fix_path_separators, \"/foo\", \"/foo\");\n  TEST_PATH_RAW(utf8::fix_path_separators, \"\\\\foo/bar\\\\baz/qux\",\n                \"/foo/bar/baz/qux\");\n  TEST_PATH_RAW(utf8::fix_path_separators, \"\\\\\\\\foo//bar\\\\\\\\baz//qux\",\n                \"/foo/bar/baz/qux\");\n  TEST_PATH_RAW(utf8::fix_path_separators, \"foo\", \"foo\");\n  TEST_PATH_RAW(utf8::fix_path_separators, \"foo/\", \"foo/\");\n  TEST_PATH_RAW(utf8::fix_path_separators, \"foo/bar\\\\baz/qux\",\n                \"foo/bar/baz/qux\");\n  TEST_PATH_RAW(utf8::fix_path_separators, \"foo//bar\\\\\\\\baz//qux\",\n                \"foo/bar/baz/qux\");\n  TEST_PATH_RAW(utf8::fix_path_separators, \"X:\", \"X:\");\n  TEST_PATH_RAW(utf8::fix_path_separators, \"X:\\\\\", \"X:/\");\n  TEST_PATH_RAW(utf8::fix_path_separators, \"X:/\", \"X:/\");\n  TEST_PATH_RAW(utf8::fix_path_separators, \"X:\\\\foo\", \"X:/foo\");\n  TEST_PATH_RAW(utf8::fix_path_separators, \"X:\\\\foo/\", \"X:/foo/\");\n  TEST_PATH_RAW(utf8::fix_path_separators, \"X:/foo\", \"X:/foo\");\n  TEST_PATH_RAW(utf8::fix_path_separators, \"X:\\\\foo/bar\\\\baz/qux\",\n                \"X:/foo/bar/baz/qux\");\n  TEST_PATH_RAW(utf8::fix_path_separators, \"X:\\\\\\\\foo//bar\\\\\\\\baz//qux\",\n                \"X:/foo/bar/baz/qux\");\n}\n\n// TODO(gibbed): fix_guest_path_separators\n\nTEST_CASE(\"UTF-8 Find Name From Path\", \"[utf8]\") {\n  TEST_PATH(utf8::find_name_from_path, \"/\", \"\");\n  TEST_PATH(utf8::find_name_from_path, \"//\", \"\");\n  TEST_PATH(utf8::find_name_from_path, \"///\", \"\");\n  TEST_PATH(utf8::find_name_from_path, \"C/\", \"C\");\n  TEST_PATH(utf8::find_name_from_path, \"/C/\", \"C\");\n  TEST_PATH(utf8::find_name_from_path, \"C/D/\", \"D\");\n  TEST_PATH(utf8::find_name_from_path, \"/C/D/E/\", \"E\");\n  TEST_PATH(utf8::find_name_from_path, \"foo/bar/D/\", \"D\");\n  TEST_PATH(utf8::find_name_from_path, \"/foo/bar/E/qux/\", \"qux\");\n  TEST_PATH(utf8::find_name_from_path, \"foo/bar/baz/qux/\", \"qux\");\n  TEST_PATH(utf8::find_name_from_path, \"foo/bar/baz/qux//\", \"qux\");\n  TEST_PATH(utf8::find_name_from_path, \"foo/bar/baz/qux///\", \"qux\");\n  TEST_PATH(utf8::find_name_from_path, \"foo/bar/baz/qux.txt\", \"qux.txt\");\n  TEST_PATH(utf8::find_name_from_path, \"ほげ/ぴよ/ふが/ほげら/ほげほげ/\",\n            \"ほげほげ\");\n  TEST_PATH(utf8::find_name_from_path, \"ほげ/ぴよ/ふが/ほげら/ほげほげ//\",\n            \"ほげほげ\");\n  TEST_PATH(utf8::find_name_from_path, \"ほげ/ぴよ/ふが/ほげら/ほげほげ///\",\n            \"ほげほげ\");\n  TEST_PATH(utf8::find_name_from_path, \"ほげ/ぴよ/ふが/ほげら/ほげほげ.txt\",\n            \"ほげほげ.txt\");\n  TEST_PATH(utf8::find_name_from_path, \"/foo\", \"foo\");\n  TEST_PATH(utf8::find_name_from_path, \"//foo\", \"foo\");\n  TEST_PATH(utf8::find_name_from_path, \"///foo\", \"foo\");\n  TEST_PATH(utf8::find_name_from_path, \"/foo/bar/baz/qux.txt\", \"qux.txt\");\n  TEST_PATH(utf8::find_name_from_path, \"/ほげ/ぴよ/ふが/ほげら/ほげほげ/\",\n            \"ほげほげ\");\n  TEST_PATH(utf8::find_name_from_path, \"/ほげ/ぴよ/ふが/ほげら/ほげほげ//\",\n            \"ほげほげ\");\n  TEST_PATH(utf8::find_name_from_path, \"/ほげ/ぴよ/ふが/ほげら/ほげほげ///\",\n            \"ほげほげ\");\n  TEST_PATH(utf8::find_name_from_path, \"/ほげ/ぴよ/ふが/ほげら/ほげほげ.txt\",\n            \"ほげほげ.txt\");\n  TEST_PATH(utf8::find_name_from_path, \"X:/foo/bar/baz/qux.txt\", \"qux.txt\");\n  TEST_PATH(utf8::find_name_from_path, \"X:/ほげ/ぴよ/ふが/ほげら/ほげほげ/\",\n            \"ほげほげ\");\n  TEST_PATH(utf8::find_name_from_path, \"X:/ほげ/ぴよ/ふが/ほげら/ほげほげ//\",\n            \"ほげほげ\");\n  TEST_PATH(utf8::find_name_from_path, \"X:/ほげ/ぴよ/ふが/ほげら/ほげほげ///\",\n            \"ほげほげ\");\n  TEST_PATH(utf8::find_name_from_path, \"X:/ほげ/ぴよ/ふが/ほげら/ほげほげ.txt\",\n            \"ほげほげ.txt\");\n  TEST_PATH(utf8::find_name_from_path, \"X:/ほげ/ぴよ/ふが/ほげら.ほげほげ\",\n            \"ほげら.ほげほげ\");\n}\n\n// TODO(gibbed): find_name_from_guest_path\n\nTEST_CASE(\"UTF-8 Find Base Name From Path\", \"[utf8]\") {\n  TEST_PATH(utf8::find_base_name_from_path, \"foo/bar/baz/qux.txt\", \"qux\");\n  TEST_PATH(utf8::find_base_name_from_path, \"foo/bar/baz/qux/\", \"qux\");\n  TEST_PATH(utf8::find_base_name_from_path, \"foo/bar/baz/qux//\", \"qux\");\n  TEST_PATH(utf8::find_base_name_from_path, \"foo/bar/baz/qux///\", \"qux\");\n  TEST_PATH(utf8::find_base_name_from_path, \"C/\", \"C\");\n  TEST_PATH(utf8::find_base_name_from_path, \"/C/\", \"C\");\n  TEST_PATH(utf8::find_base_name_from_path, \"C/D/\", \"D\");\n  TEST_PATH(utf8::find_base_name_from_path, \"/C/D/E/\", \"E\");\n  TEST_PATH(utf8::find_base_name_from_path, \"foo/bar/D/\", \"D\");\n  TEST_PATH(utf8::find_base_name_from_path,\n            \"ほげ/ぴよ/ふが/ほげら/ほげほげ.txt\", \"ほげほげ\");\n  TEST_PATH(utf8::find_base_name_from_path, \"ほげ/ぴよ/ふが/ほげら/ほげほげ/\",\n            \"ほげほげ\");\n  TEST_PATH(utf8::find_base_name_from_path, \"ほげ/ぴよ/ふが/ほげら/ほげほげ//\",\n            \"ほげほげ\");\n  TEST_PATH(utf8::find_base_name_from_path, \"ほげ/ぴよ/ふが/ほげら/ほげほげ///\",\n            \"ほげほげ\");\n  TEST_PATH(utf8::find_base_name_from_path, \"ほげ/ぴよ/ふが/ほげら.ほげほげ\",\n            \"ほげら\");\n  TEST_PATH(utf8::find_base_name_from_path, \"/foo/bar/baz/qux.txt\", \"qux\");\n  TEST_PATH(utf8::find_base_name_from_path, \"/foo/bar/baz/qux/\", \"qux\");\n  TEST_PATH(utf8::find_base_name_from_path, \"/foo/bar/baz/qux//\", \"qux\");\n  TEST_PATH(utf8::find_base_name_from_path, \"/foo/bar/baz/qux///\", \"qux\");\n  TEST_PATH(utf8::find_base_name_from_path,\n            \"/ほげ/ぴよ/ふが/ほげら/ほげほげ.txt\", \"ほげほげ\");\n  TEST_PATH(utf8::find_base_name_from_path, \"/ほげ/ぴよ/ふが/ほげら/ほげほげ/\",\n            \"ほげほげ\");\n  TEST_PATH(utf8::find_base_name_from_path, \"/ほげ/ぴよ/ふが/ほげら/ほげほげ//\",\n            \"ほげほげ\");\n  TEST_PATH(utf8::find_base_name_from_path,\n            \"/ほげ/ぴよ/ふが/ほげら/ほげほげ///\", \"ほげほげ\");\n  TEST_PATH(utf8::find_base_name_from_path, \"/ほげ/ぴよ/ふが/ほげら.ほげほげ\",\n            \"ほげら\");\n  TEST_PATH(utf8::find_base_name_from_path, \"X:/foo/bar/baz/qux.txt\", \"qux\");\n  TEST_PATH(utf8::find_base_name_from_path, \"X:/foo/bar/baz/qux/\", \"qux\");\n  TEST_PATH(utf8::find_base_name_from_path, \"X:/foo/bar/baz/qux//\", \"qux\");\n  TEST_PATH(utf8::find_base_name_from_path, \"X:/foo/bar/baz/qux///\", \"qux\");\n  TEST_PATH(utf8::find_base_name_from_path,\n            \"X:/ほげ/ぴよ/ふが/ほげら/ほげほげ.txt\", \"ほげほげ\");\n  TEST_PATH(utf8::find_base_name_from_path,\n            \"X:/ほげ/ぴよ/ふが/ほげら/ほげほげ/\", \"ほげほげ\");\n  TEST_PATH(utf8::find_base_name_from_path,\n            \"X:/ほげ/ぴよ/ふが/ほげら/ほげほげ//\", \"ほげほげ\");\n  TEST_PATH(utf8::find_base_name_from_path,\n            \"X:/ほげ/ぴよ/ふが/ほげら/ほげほげ///\", \"ほげほげ\");\n  TEST_PATH(utf8::find_base_name_from_path, \"X:/ほげ/ぴよ/ふが/ほげら.ほげほげ\",\n            \"ほげら\");\n}\n\n// TODO(gibbed): find_base_name_from_guest_path\n\nTEST_CASE(\"UTF-8 Find Base Path\", \"[utf8]\") {\n  TEST_PATH(utf8::find_base_path, \"\", \"\");\n  TEST_PATH(utf8::find_base_path, \"/\", \"\");\n  TEST_PATH(utf8::find_base_path, \"//\", \"\");\n  TEST_PATH(utf8::find_base_path, \"///\", \"\");\n  TEST_PATH(utf8::find_base_path, \"/foo\", \"\");\n  TEST_PATH(utf8::find_base_path, \"//foo\", \"\");\n  TEST_PATH(utf8::find_base_path, \"///foo\", \"\");\n  TEST_PATH(utf8::find_base_path, \"/foo/\", \"\");\n  TEST_PATH(utf8::find_base_path, \"/foo//\", \"\");\n  TEST_PATH(utf8::find_base_path, \"/foo///\", \"\");\n  TEST_PATH(utf8::find_base_path, \"//foo/\", \"\");\n  TEST_PATH(utf8::find_base_path, \"//foo//\", \"\");\n  TEST_PATH(utf8::find_base_path, \"//foo///\", \"\");\n  TEST_PATH(utf8::find_base_path, \"///foo/\", \"\");\n  TEST_PATH(utf8::find_base_path, \"///foo//\", \"\");\n  TEST_PATH(utf8::find_base_path, \"///foo///\", \"\");\n  TEST_PATH(utf8::find_base_path, \"/foo/bar\", \"/foo\");\n  TEST_PATH(utf8::find_base_path, \"/foo/bar/\", \"/foo\");\n  TEST_PATH(utf8::find_base_path, \"/foo/bar//\", \"/foo\");\n  TEST_PATH(utf8::find_base_path, \"/foo/bar///\", \"/foo\");\n  TEST_PATH(utf8::find_base_path, \"/foo/bar/baz/qux\", \"/foo/bar/baz\");\n  TEST_PATH(utf8::find_base_path, \"/foo/bar/baz/qux/\", \"/foo/bar/baz\");\n  TEST_PATH(utf8::find_base_path, \"/foo/bar/baz/qux//\", \"/foo/bar/baz\");\n  TEST_PATH(utf8::find_base_path, \"/foo/bar/baz/qux///\", \"/foo/bar/baz\");\n  TEST_PATH(utf8::find_base_path, \"/ほげ/ぴよ/ふが/ほげら/ほげほげ\",\n            \"/ほげ/ぴよ/ふが/ほげら\");\n  TEST_PATH(utf8::find_base_path, \"/ほげ/ぴよ/ふが/ほげら/ほげほげ/\",\n            \"/ほげ/ぴよ/ふが/ほげら\");\n  TEST_PATH(utf8::find_base_path, \"/ほげ/ぴよ/ふが/ほげら/ほげほげ//\",\n            \"/ほげ/ぴよ/ふが/ほげら\");\n  TEST_PATH(utf8::find_base_path, \"/ほげ/ぴよ/ふが/ほげら/ほげほげ///\",\n            \"/ほげ/ぴよ/ふが/ほげら\");\n  TEST_PATH(utf8::find_base_path, \"foo\", \"\");\n  TEST_PATH(utf8::find_base_path, \"foo/\", \"\");\n  TEST_PATH(utf8::find_base_path, \"foo//\", \"\");\n  TEST_PATH(utf8::find_base_path, \"foo///\", \"\");\n  TEST_PATH(utf8::find_base_path, \"foo/bar\", \"foo\");\n  TEST_PATH(utf8::find_base_path, \"foo/bar/\", \"foo\");\n  TEST_PATH(utf8::find_base_path, \"foo/bar//\", \"foo\");\n  TEST_PATH(utf8::find_base_path, \"foo/bar///\", \"foo\");\n  TEST_PATH(utf8::find_base_path, \"foo/bar/baz/qux\", \"foo/bar/baz\");\n  TEST_PATH(utf8::find_base_path, \"foo/bar/baz/qux/\", \"foo/bar/baz\");\n  TEST_PATH(utf8::find_base_path, \"foo/bar/baz/qux//\", \"foo/bar/baz\");\n  TEST_PATH(utf8::find_base_path, \"foo/bar/baz/qux///\", \"foo/bar/baz\");\n  TEST_PATH(utf8::find_base_path, \"ほげ/ぴよ/ふが/ほげら/ほげほげ\",\n            \"ほげ/ぴよ/ふが/ほげら\");\n  TEST_PATH(utf8::find_base_path, \"ほげ/ぴよ/ふが/ほげら/ほげほげ/\",\n            \"ほげ/ぴよ/ふが/ほげら\");\n  TEST_PATH(utf8::find_base_path, \"ほげ/ぴよ/ふが/ほげら/ほげほげ//\",\n            \"ほげ/ぴよ/ふが/ほげら\");\n  TEST_PATH(utf8::find_base_path, \"ほげ/ぴよ/ふが/ほげら/ほげほげ///\",\n            \"ほげ/ぴよ/ふが/ほげら\");\n  TEST_PATH(utf8::find_base_path, \"X:\", \"\");\n  TEST_PATH(utf8::find_base_path, \"X:/\", \"\");\n  TEST_PATH(utf8::find_base_path, \"X://\", \"\");\n  TEST_PATH(utf8::find_base_path, \"X:///\", \"\");\n  TEST_PATH(utf8::find_base_path, \"X:/foo\", \"X:\");\n  TEST_PATH(utf8::find_base_path, \"X:/foo/\", \"X:\");\n  TEST_PATH(utf8::find_base_path, \"X:/foo//\", \"X:\");\n  TEST_PATH(utf8::find_base_path, \"X:/foo///\", \"X:\");\n  TEST_PATH(utf8::find_base_path, \"X:/foo/bar\", \"X:/foo\");\n  TEST_PATH(utf8::find_base_path, \"X:/foo/bar/\", \"X:/foo\");\n  TEST_PATH(utf8::find_base_path, \"X:/foo/bar//\", \"X:/foo\");\n  TEST_PATH(utf8::find_base_path, \"X:/foo/bar///\", \"X:/foo\");\n  TEST_PATH(utf8::find_base_path, \"X:/foo/bar/baz/qux\", \"X:/foo/bar/baz\");\n  TEST_PATH(utf8::find_base_path, \"X:/foo/bar/baz/qux/\", \"X:/foo/bar/baz\");\n  TEST_PATH(utf8::find_base_path, \"X:/foo/bar/baz/qux//\", \"X:/foo/bar/baz\");\n  TEST_PATH(utf8::find_base_path, \"X:/foo/bar/baz/qux///\", \"X:/foo/bar/baz\");\n  TEST_PATH(utf8::find_base_path, \"X:/ほげ/ぴよ/ふが/ほげら/ほげほげ\",\n            \"X:/ほげ/ぴよ/ふが/ほげら\");\n  TEST_PATH(utf8::find_base_path, \"X:/ほげ/ぴよ/ふが/ほげら/ほげほげ/\",\n            \"X:/ほげ/ぴよ/ふが/ほげら\");\n  TEST_PATH(utf8::find_base_path, \"X:/ほげ/ぴよ/ふが/ほげら/ほげほげ//\",\n            \"X:/ほげ/ぴよ/ふが/ほげら\");\n  TEST_PATH(utf8::find_base_path, \"X:/ほげ/ぴよ/ふが/ほげら/ほげほげ///\",\n            \"X:/ほげ/ぴよ/ふが/ほげら\");\n}\n\n// TODO(gibbed): find_base_guest_path\n\nTEST_CASE(\"UTF-8 Canonicalize Path\", \"[utf8]\") {\n  TEST_PATH(utf8::canonicalize_path, \"foo/bar/baz/qux\", \"foo/bar/baz/qux\");\n  TEST_PATH(utf8::canonicalize_path, \"foo/bar/baz/qux/\", \"foo/bar/baz/qux\");\n  TEST_PATH(utf8::canonicalize_path, \"foo/bar/baz/qux//\", \"foo/bar/baz/qux\");\n  TEST_PATH(utf8::canonicalize_path, \"foo/bar/baz/qux///\", \"foo/bar/baz/qux\");\n  TEST_PATH(utf8::canonicalize_path, \"foo/./baz/qux\", \"foo/baz/qux\");\n  TEST_PATH(utf8::canonicalize_path, \"foo/./baz/qux/\", \"foo/baz/qux\");\n  TEST_PATH(utf8::canonicalize_path, \"foo/../baz/qux\", \"baz/qux\");\n  TEST_PATH(utf8::canonicalize_path, \"foo/../baz/qux/\", \"baz/qux\");\n  TEST_PATH(utf8::canonicalize_path, \"foo/./baz/../qux\", \"foo/qux\");\n  TEST_PATH(utf8::canonicalize_path, \"foo/./baz/../qux/\", \"foo/qux\");\n  TEST_PATH(utf8::canonicalize_path, \"foo/./../baz/qux\", \"baz/qux\");\n  TEST_PATH(utf8::canonicalize_path, \"foo/./../baz/qux/\", \"baz/qux\");\n  TEST_PATH(utf8::canonicalize_path, \"./bar/baz/qux\", \"bar/baz/qux\");\n  TEST_PATH(utf8::canonicalize_path, \"./bar/baz/qux/\", \"bar/baz/qux\");\n  TEST_PATH(utf8::canonicalize_path, \"../bar/baz/qux\", \"bar/baz/qux\");\n  TEST_PATH(utf8::canonicalize_path, \"../bar/baz/qux/\", \"bar/baz/qux\");\n  TEST_PATH(utf8::canonicalize_path, \"ほげ/ぴよ/./ふが/../ほげら/ほげほげ\",\n            \"ほげ/ぴよ/ほげら/ほげほげ\");\n  TEST_PATH(utf8::canonicalize_path, \"ほげ/ぴよ/./ふが/../ほげら/ほげほげ/\",\n            \"ほげ/ぴよ/ほげら/ほげほげ\");\n  TEST_PATH(utf8::canonicalize_path, \"/foo/bar/baz/qux\", \"/foo/bar/baz/qux\");\n  TEST_PATH(utf8::canonicalize_path, \"/foo/bar/baz/qux/\", \"/foo/bar/baz/qux\");\n  TEST_PATH(utf8::canonicalize_path, \"/foo/./baz/qux\", \"/foo/baz/qux\");\n  TEST_PATH(utf8::canonicalize_path, \"/foo/./baz/qux/\", \"/foo/baz/qux\");\n  TEST_PATH(utf8::canonicalize_path, \"/foo/../baz/qux\", \"/baz/qux\");\n  TEST_PATH(utf8::canonicalize_path, \"/foo/../baz/qux/\", \"/baz/qux\");\n  TEST_PATH(utf8::canonicalize_path, \"/foo/./baz/../qux\", \"/foo/qux\");\n  TEST_PATH(utf8::canonicalize_path, \"/foo/./baz/../qux/\", \"/foo/qux\");\n  TEST_PATH(utf8::canonicalize_path, \"/foo/./../baz/qux\", \"/baz/qux\");\n  TEST_PATH(utf8::canonicalize_path, \"/foo/./../baz/qux/\", \"/baz/qux\");\n  TEST_PATH(utf8::canonicalize_path, \"/./bar/baz/qux\", \"/bar/baz/qux\");\n  TEST_PATH(utf8::canonicalize_path, \"/./bar/baz/qux/\", \"/bar/baz/qux\");\n  TEST_PATH(utf8::canonicalize_path, \"/../bar/baz/qux\", \"/bar/baz/qux\");\n  TEST_PATH(utf8::canonicalize_path, \"/../bar/baz/qux/\", \"/bar/baz/qux\");\n  TEST_PATH(utf8::canonicalize_path, \"/ほげ/ぴよ/./ふが/../ほげら/ほげほげ\",\n            \"/ほげ/ぴよ/ほげら/ほげほげ\");\n  TEST_PATH(utf8::canonicalize_path, \"/ほげ/ぴよ/./ふが/../ほげら/ほげほげ/\",\n            \"/ほげ/ぴよ/ほげら/ほげほげ\");\n  TEST_PATH(utf8::canonicalize_path, \"X:/foo/bar/baz/qux\",\n            \"X:/foo/bar/baz/qux\");\n  TEST_PATH(utf8::canonicalize_path, \"X:/foo/bar/baz/qux/\",\n            \"X:/foo/bar/baz/qux\");\n  TEST_PATH(utf8::canonicalize_path, \"X:/foo/./baz/qux\", \"X:/foo/baz/qux\");\n  TEST_PATH(utf8::canonicalize_path, \"X:/foo/./baz/qux/\", \"X:/foo/baz/qux\");\n  TEST_PATH(utf8::canonicalize_path, \"X:/foo/../baz/qux\", \"X:/baz/qux\");\n  TEST_PATH(utf8::canonicalize_path, \"X:/foo/../baz/qux/\", \"X:/baz/qux\");\n  TEST_PATH(utf8::canonicalize_path, \"X:/foo/./baz/../qux\", \"X:/foo/qux\");\n  TEST_PATH(utf8::canonicalize_path, \"X:/foo/./baz/../qux/\", \"X:/foo/qux\");\n  TEST_PATH(utf8::canonicalize_path, \"X:/foo/./../baz/qux\", \"X:/baz/qux\");\n  TEST_PATH(utf8::canonicalize_path, \"X:/foo/./../baz/qux/\", \"X:/baz/qux\");\n  TEST_PATH(utf8::canonicalize_path, \"X:/./bar/baz/qux\", \"X:/bar/baz/qux\");\n  TEST_PATH(utf8::canonicalize_path, \"X:/./bar/baz/qux/\", \"X:/bar/baz/qux\");\n  TEST_PATH(utf8::canonicalize_path, \"X:/../bar/baz/qux\", \"X:/bar/baz/qux\");\n  TEST_PATH(utf8::canonicalize_path, \"X:/../bar/baz/qux/\", \"X:/bar/baz/qux\");\n  TEST_PATH(utf8::canonicalize_path, \"X:/ほげ/ぴよ/./ふが/../ほげら/ほげほげ\",\n            \"X:/ほげ/ぴよ/ほげら/ほげほげ\");\n  TEST_PATH(utf8::canonicalize_path, \"X:/ほげ/ぴよ/./ふが/../ほげら/ほげほげ/\",\n            \"X:/ほげ/ぴよ/ほげら/ほげほげ\");\n}\n\n// TODO(gibbed): canonicalize_guest_path\n\n}  // namespace xe::base::test\n"
  },
  {
    "path": "src/xenia/base/threading.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2015 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/threading.h\"\n\nnamespace xe {\nnamespace threading {\n\nuint32_t logical_processor_count() {\n  static uint32_t value = 0;\n  if (!value) {\n    value = std::thread::hardware_concurrency();\n  }\n  return value;\n}\n\nthread_local uint32_t current_thread_id_ = UINT_MAX;\n\nuint32_t current_thread_id() {\n  return current_thread_id_ == UINT_MAX ? current_thread_system_id()\n                                        : current_thread_id_;\n}\n\nvoid set_current_thread_id(uint32_t id) { current_thread_id_ = id; }\n\n}  // namespace threading\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/base/threading.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_BASE_THREADING_H_\n#define XENIA_BASE_THREADING_H_\n\n#include <algorithm>\n#include <atomic>\n#include <chrono>\n#include <climits>\n#include <condition_variable>\n#include <cstdint>\n#include <functional>\n#include <memory>\n#include <mutex>\n#include <string>\n#include <thread>\n#include <utility>\n#include <vector>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/chrono.h\"\n#include \"xenia/base/literals.h\"\n#include \"xenia/base/platform.h\"\n#include \"xenia/base/threading_timer_queue.h\"\n\nnamespace xe {\nnamespace threading {\n\nusing namespace xe::literals;\n\n#if XE_PLATFORM_ANDROID\nvoid AndroidInitialize();\nvoid AndroidShutdown();\n#endif\n\n// This is more like an Event with self-reset when returning from Wait()\nclass Fence {\n public:\n  Fence() : signal_state_(0) {}\n\n  void Signal() {\n    std::unique_lock<std::mutex> lock(mutex_);\n    signal_state_ |= SIGMASK_;\n    cond_.notify_all();\n  }\n\n  // Wait for the Fence to be signaled. Clears the signal on return.\n  void Wait() {\n    std::unique_lock<std::mutex> lock(mutex_);\n    assert_true((signal_state_ & ~SIGMASK_) < (SIGMASK_ - 1) &&\n                \"Too many threads?\");\n\n    // keep local copy to minimize loads\n    auto signal_state = ++signal_state_;\n    for (; !(signal_state & SIGMASK_); signal_state = signal_state_) {\n      cond_.wait(lock);\n    }\n\n    // We can't just clear the signal as other threads may not have read it yet\n    assert_true((signal_state & ~SIGMASK_) > 0);  // wait_count > 0\n    if (signal_state == (1 | SIGMASK_)) {         // wait_count == 1\n      // Last one out turn off the lights\n      signal_state_ = 0;\n    } else {\n      // Oops, another thread is still waiting, set the new count and keep the\n      // signal.\n      signal_state_ = --signal_state;\n    }\n  }\n\n private:\n  using state_t_ = uint_fast32_t;\n  static constexpr state_t_ SIGMASK_ = state_t_(1)\n                                       << (sizeof(state_t_) * 8 - 1);\n\n  std::mutex mutex_;\n  std::condition_variable cond_;\n  // Use the highest bit (sign bit) as the signal flag and the rest to count\n  // waiting threads.\n  volatile state_t_ signal_state_;\n};\n\n// Returns the total number of logical processors in the host system.\nuint32_t logical_processor_count();\n\n// Enables the current process to set thread affinity.\n// Must be called at startup before attempting to set thread affinity.\nvoid EnableAffinityConfiguration();\n\n// Gets a stable thread-specific ID, but may not be. Use for informative\n// purposes only.\nuint32_t current_thread_system_id();\n\n// Gets a stable thread-specific ID that defaults to the same value as\n// current_thread_system_id but may be overridden.\n// Guest threads often change this to the guest thread handle.\nuint32_t current_thread_id();\nvoid set_current_thread_id(uint32_t id);\n\n// Sets the current thread name.\nvoid set_name(const std::string_view name);\n\n// Yields the current thread to the scheduler. Maybe.\nvoid MaybeYield();\n\n// Memory barrier (request - may be ignored).\nvoid SyncMemory();\n\n// Sleeps the current thread for at least as long as the given duration.\nvoid Sleep(std::chrono::microseconds duration);\ntemplate <typename Rep, typename Period>\nvoid Sleep(std::chrono::duration<Rep, Period> duration) {\n  Sleep(std::chrono::duration_cast<std::chrono::microseconds>(duration));\n}\n\nenum class SleepResult {\n  kSuccess,\n  kAlerted,\n};\n// Sleeps the current thread for at least as long as the given duration.\n// The thread is put in an alertable state and may wake to dispatch user\n// callbacks. If this happens the sleep returns early with\n// SleepResult::kAlerted.\nSleepResult AlertableSleep(std::chrono::microseconds duration);\ntemplate <typename Rep, typename Period>\nSleepResult AlertableSleep(std::chrono::duration<Rep, Period> duration) {\n  return AlertableSleep(\n      std::chrono::duration_cast<std::chrono::microseconds>(duration));\n}\n\ntypedef uint32_t TlsHandle;\nconstexpr TlsHandle kInvalidTlsHandle = UINT_MAX;\n\nTlsHandle AllocateTlsHandle();\nbool FreeTlsHandle(TlsHandle handle);\nuintptr_t GetTlsValue(TlsHandle handle);\nbool SetTlsValue(TlsHandle handle, uintptr_t value);\n\n// A high-resolution timer capable of firing at millisecond-precision. All\n// timers created in this way are executed in the same thread so callbacks must\n// be kept short or else all timers will be impacted. This is a simplified\n// wrapper around QueueTimerRecurring which automatically cancels the timer on\n// destruction.\nclass HighResolutionTimer {\n  HighResolutionTimer(std::chrono::milliseconds interval,\n                      std::function<void()> callback) {\n    assert_not_null(callback);\n    wait_item_ = QueueTimerRecurring(\n        [callback = std::move(callback)](void*) { callback(); }, nullptr,\n        TimerQueueWaitItem::clock::now(), interval);\n  }\n\n public:\n  ~HighResolutionTimer() {\n    if (auto wait_item = wait_item_.lock()) {\n      wait_item->Disarm();\n    }\n  }\n\n  // Creates a new repeating timer with the given period.\n  // The given function will be called back as close to the given period as\n  // possible.\n  static std::unique_ptr<HighResolutionTimer> CreateRepeating(\n      std::chrono::milliseconds period, std::function<void()> callback) {\n    return std::unique_ptr<HighResolutionTimer>(\n        new HighResolutionTimer(period, std::move(callback)));\n  }\n\n private:\n  std::weak_ptr<TimerQueueWaitItem> wait_item_;\n};\n\n// Results for a WaitHandle operation.\nenum class WaitResult {\n  // The state of the specified object is signaled.\n  // In a WaitAny the tuple will contain the index of the wait handle that\n  // caused the wait to be satisfied.\n  kSuccess,\n  // The wait was ended by one or more user-mode callbacks queued to the thread.\n  // This will occur when is_alertable is set true.\n  kUserCallback,\n  // The time-out interval elapsed, and the object's state is nonsignaled.\n  kTimeout,\n  // The specified object is a mutex object that was not released by the thread\n  // that owned the mutex object before the owning thread terminated. Ownership\n  // of the mutex object is granted to the calling thread and the mutex is set\n  // to nonsignaled.\n  // In a WaitAny the tuple will contain the index of the wait handle that\n  // caused the wait to be abandoned.\n  kAbandoned,\n  // The function has failed.\n  kFailed,\n};\n\nclass WaitHandle {\n public:\n  virtual ~WaitHandle() = default;\n\n  // Returns the native handle of the object on the host system.\n  // This value is platform specific.\n  virtual void* native_handle() const = 0;\n\n protected:\n  WaitHandle() = default;\n};\n\n// Waits until the wait handle is in the signaled state, an alert triggers and\n// a user callback is queued to the thread, or the timeout interval elapses.\n// If timeout is zero the call will return immediately instead of waiting and\n// if the timeout is max() the wait will not time out.\nWaitResult Wait(\n    WaitHandle* wait_handle, bool is_alertable,\n    std::chrono::milliseconds timeout = std::chrono::milliseconds::max());\n\n// Signals one object and waits on another object as a single operation.\n// Waits until the wait handle is in the signaled state, an alert triggers and\n// a user callback is queued to the thread, or the timeout interval elapses.\n// If timeout is zero the call will return immediately instead of waiting and\n// if the timeout is max() the wait will not time out.\nWaitResult SignalAndWait(\n    WaitHandle* wait_handle_to_signal, WaitHandle* wait_handle_to_wait_on,\n    bool is_alertable,\n    std::chrono::milliseconds timeout = std::chrono::milliseconds::max());\n\nstd::pair<WaitResult, size_t> WaitMultiple(\n    WaitHandle* wait_handles[], size_t wait_handle_count, bool wait_all,\n    bool is_alertable,\n    std::chrono::milliseconds timeout = std::chrono::milliseconds::max());\n\n// Waits until all of the specified objects are in the signaled state, a\n// user callback is queued to the thread, or the time-out interval elapses.\n// If timeout is zero the call will return immediately instead of waiting and\n// if the timeout is max() the wait will not time out.\ninline WaitResult WaitAll(\n    WaitHandle* wait_handles[], size_t wait_handle_count, bool is_alertable,\n    std::chrono::milliseconds timeout = std::chrono::milliseconds::max()) {\n  return WaitMultiple(wait_handles, wait_handle_count, true, is_alertable,\n                      timeout)\n      .first;\n}\ninline WaitResult WaitAll(\n    std::vector<WaitHandle*> wait_handles, bool is_alertable,\n    std::chrono::milliseconds timeout = std::chrono::milliseconds::max()) {\n  return WaitAll(wait_handles.data(), wait_handles.size(), is_alertable,\n                 timeout);\n}\n\n// Waits until any of the specified objects are in the signaled state, a\n// user callback is queued to the thread, or the time-out interval elapses.\n// If timeout is zero the call will return immediately instead of waiting and\n// if the timeout is max() the wait will not time out.\n// The second argument of the return tuple indicates which wait handle caused\n// the wait to be satisfied or abandoned.\ninline std::pair<WaitResult, size_t> WaitAny(\n    WaitHandle* wait_handles[], size_t wait_handle_count, bool is_alertable,\n    std::chrono::milliseconds timeout = std::chrono::milliseconds::max()) {\n  return WaitMultiple(wait_handles, wait_handle_count, false, is_alertable,\n                      timeout);\n}\ninline std::pair<WaitResult, size_t> WaitAny(\n    std::vector<WaitHandle*> wait_handles, bool is_alertable,\n    std::chrono::milliseconds timeout = std::chrono::milliseconds::max()) {\n  return WaitAny(wait_handles.data(), wait_handles.size(), is_alertable,\n                 timeout);\n}\n\n// Models a Win32-like event object.\n// https://msdn.microsoft.com/en-us/library/windows/desktop/ms682396(v=vs.85).aspx\nclass Event : public WaitHandle {\n public:\n  // Creates a manual-reset event object, which requires the use of the\n  // Reset() function to set the event state to nonsignaled.\n  // If initial_state is true the event will start in the signaled state.\n  static std::unique_ptr<Event> CreateManualResetEvent(bool initial_state);\n\n  // Creates an auto-reset event object, and system automatically resets the\n  // event state to nonsignaled after a single waiting thread has been released.\n  // If initial_state is true the event will start in the signaled state.\n  static std::unique_ptr<Event> CreateAutoResetEvent(bool initial_state);\n\n  // Sets the specified event object to the signaled state.\n  // If this is a manual reset event the event stays signaled until Reset() is\n  // called. If this is an auto reset event until exactly one wait is satisfied.\n  virtual void Set() = 0;\n\n  // Sets the specified event object to the nonsignaled state.\n  // Resetting an event that is already reset has no effect.\n  virtual void Reset() = 0;\n\n  // Sets the specified event object to the signaled state and then resets it to\n  // the nonsignaled state after releasing the appropriate number of waiting\n  // threads.\n  virtual void Pulse() = 0;\n};\n\n// Models a Win32-like semaphore object.\n// https://msdn.microsoft.com/en-us/library/windows/desktop/ms682438(v=vs.85).aspx\nclass Semaphore : public WaitHandle {\n public:\n  // Creates a new semaphore object.\n  // The initial_count must be greater than or equal to zero and less than or\n  // equal to maximum_count. The state of a semaphore is signaled when its count\n  // is greater than zero and nonsignaled when it is zero. The count is\n  // decreased by one whenever a wait function releases a thread that was\n  // waiting for the semaphore. The count is increased  by a specified amount by\n  // calling the Release() function.\n  static std::unique_ptr<Semaphore> Create(int initial_count,\n                                           int maximum_count);\n\n  // Increases the count of the specified semaphore object by a specified\n  // amount.\n  // release_count must be greater than zero.\n  // Returns false if adding release_count would set the semaphore over the\n  // initially specified maximum_count.\n  virtual bool Release(int release_count, int* out_previous_count) = 0;\n};\n\n// Models a Win32-like mutant (mutex) object.\n// https://msdn.microsoft.com/en-us/library/windows/desktop/ms682411(v=vs.85).aspx\nclass Mutant : public WaitHandle {\n public:\n  // Creates a new mutant object, initially owned by the calling thread if\n  // specified.\n  static std::unique_ptr<Mutant> Create(bool initial_owner);\n\n  // Releases ownership of the specified mutex object.\n  // Returns false if the calling thread does not own the mutant object.\n  virtual bool Release() = 0;\n};\n\n// Models a Win32-like timer object.\n// https://msdn.microsoft.com/en-us/library/windows/desktop/ms687012(v=vs.85).aspx\nclass Timer : public WaitHandle {\n public:\n  // Make vtable entries for both so we can defer conversions and only do them\n  // if really necessary (let the calling code what clock it prefers). Windows\n  // kernel sync primitives will work with WinSystemClock while our own\n  // implementation works with steady_clock.\n  using WClock_ = xe::chrono::WinSystemClock;\n  using GClock_ = std::chrono::steady_clock;  // generic\n\n  // Creates a timer whose state remains signaled until SetOnce() or\n  // SetRepeating() is called to establish a new due time.\n  static std::unique_ptr<Timer> CreateManualResetTimer();\n\n  // Creates a timer whose state remains signaled until a thread completes a\n  // wait operation on the timer object.\n  static std::unique_ptr<Timer> CreateSynchronizationTimer();\n\n  // Activates the specified waitable timer. When the due time arrives, the\n  // timer is signaled and the thread that set the timer calls the optional\n  // completion routine.\n  // Returns true on success.\n  virtual bool SetOnceAfter(xe::chrono::hundrednanoseconds rel_time,\n                            std::function<void()> opt_callback = nullptr) = 0;\n  virtual bool SetOnceAt(WClock_::time_point due_time,\n                         std::function<void()> opt_callback = nullptr) = 0;\n  virtual bool SetOnceAt(GClock_::time_point due_time,\n                         std::function<void()> opt_callback = nullptr) = 0;\n\n  // Activates the specified waitable timer. When the due time arrives, the\n  // timer is signaled and the thread that set the timer calls the optional\n  // completion routine. A periodic timer automatically reactivates each time\n  // the period elapses, until the timer is canceled or reset.\n  // Returns true on success.\n  virtual bool SetRepeatingAfter(\n      xe::chrono::hundrednanoseconds rel_time, std::chrono::milliseconds period,\n      std::function<void()> opt_callback = nullptr) = 0;\n  virtual bool SetRepeatingAt(WClock_::time_point due_time,\n                              std::chrono::milliseconds period,\n                              std::function<void()> opt_callback = nullptr) = 0;\n  virtual bool SetRepeatingAt(GClock_::time_point due_time,\n                              std::chrono::milliseconds period,\n                              std::function<void()> opt_callback = nullptr) = 0;\n\n  // Stops the timer before it can be set to the signaled state and cancels\n  // outstanding callbacks. Threads performing a wait operation on the timer\n  // remain waiting until they time out or the timer is reactivated and its\n  // state is set to signaled. If the timer is already in the signaled state, it\n  // remains in that state.\n  // Returns true on success.\n  virtual bool Cancel() = 0;\n};\n\nstruct ThreadPriority {\n  static const int32_t kLowest = -2;\n  static const int32_t kBelowNormal = -1;\n  static const int32_t kNormal = 0;\n  static const int32_t kAboveNormal = 1;\n  static const int32_t kHighest = 2;\n};\n\n// Models a Win32-like thread object.\n// https://msdn.microsoft.com/en-us/library/windows/desktop/ms682453(v=vs.85).aspx\nclass Thread : public WaitHandle {\n public:\n  struct CreationParameters {\n    size_t stack_size = 4_MiB;\n    bool create_suspended = false;\n    int32_t initial_priority = 0;\n  };\n\n  // Creates a thread with the given parameters and calls the start routine from\n  // within that thread.\n  static std::unique_ptr<Thread> Create(CreationParameters params,\n                                        std::function<void()> start_routine);\n  static Thread* GetCurrentThread();\n\n  // Ends the calling thread.\n  // No destructors are called, and this function does not return.\n  // The state of the thread object becomes signaled, releasing any other\n  // threads that had been waiting for the thread to terminate.\n  static void Exit(int exit_code);\n\n  // Returns the ID of the thread.\n  virtual uint32_t system_id() const = 0;\n\n  // Returns the current name of the thread, if previously specified.\n  const std::string& name() const { return name_; }\n\n  // Sets the name of the thread, used in debugging and logging.\n  virtual void set_name(std::string name) { name_ = std::move(name); }\n\n  // Returns the current priority value for the thread.\n  virtual int32_t priority() = 0;\n\n  // Sets the priority value for the thread. This value, together with the\n  // priority class of the thread's process, determines the thread's base\n  // priority level. ThreadPriority contains useful constants.\n  virtual void set_priority(int32_t new_priority) = 0;\n\n  // Returns the current processor affinity mask for the thread.\n  virtual uint64_t affinity_mask() = 0;\n\n  // Sets a processor affinity mask for the thread.\n  // A thread affinity mask is a bit vector in which each bit represents a\n  // logical processor that a thread is allowed to run on. A thread affinity\n  // mask must be a subset of the process affinity mask for the containing\n  // process of a thread.\n  virtual void set_affinity_mask(uint64_t new_affinity_mask) = 0;\n\n  // Adds a user-mode asynchronous procedure call request to the thread queue.\n  // When a user-mode APC is queued, the thread is not directed to call the APC\n  // function unless it is in an alertable state. After the thread is in an\n  // alertable state, the thread handles all pending APCs in first in, first out\n  // (FIFO) order, and the wait operation returns WaitResult::kUserCallback.\n  virtual void QueueUserCallback(std::function<void()> callback) = 0;\n\n  // Decrements a thread's suspend count. When the suspend count is decremented\n  // to zero, the execution of the thread is resumed.\n  virtual bool Resume(uint32_t* out_previous_suspend_count = nullptr) = 0;\n\n  // Suspends the specified thread.\n  virtual bool Suspend(uint32_t* out_previous_suspend_count = nullptr) = 0;\n\n  // Terminates the thread.\n  // No destructors are called, and this function does not return.\n  // The state of the thread object becomes signaled, releasing any other\n  // threads that had been waiting for the thread to terminate.\n  virtual void Terminate(int exit_code) = 0;\n\n protected:\n  std::string name_;\n};\n\n}  // namespace threading\n}  // namespace xe\n\n#endif  // XENIA_BASE_THREADING_H_\n"
  },
  {
    "path": "src/xenia/base/threading_mac.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/threading.h\"\n\n#include <mach/mach.h>\n#include <mach/mach_time.h>\n#include <pthread.h>\n#include <time.h>\n\nnamespace xe {\nnamespace threading {\n\nuint64_t ticks() { return mach_absolute_time(); }\n\nuint32_t current_thread_id() {\n  mach_port_t tid = pthread_mach_thread_np(pthread_self());\n  return static_cast<uint32_t>(tid);\n}\n\nvoid set_name(const std::string& name) { pthread_setname_np(name.c_str()); }\n\nvoid MaybeYield() { pthread_yield_np(); }\n\nvoid Sleep(std::chrono::microseconds duration) {\n  timespec rqtp = {duration.count() / 1000000, duration.count() % 1000};\n  nanosleep(&rqtp, nullptr);\n  // TODO(benvanik): spin while rmtp >0?\n}\n\n}  // namespace threading\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/base/threading_posix.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/threading.h\"\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/chrono_steady_cast.h\"\n#include \"xenia/base/platform.h\"\n#include \"xenia/base/threading_timer_queue.h\"\n\n#include <pthread.h>\n#include <sched.h>\n#include <signal.h>\n#include <sys/eventfd.h>\n#include <sys/syscall.h>\n#include <sys/time.h>\n#include <sys/types.h>\n#include <unistd.h>\n#include <array>\n#include <cstddef>\n#include <ctime>\n#include <memory>\n\n#if XE_PLATFORM_ANDROID\n#include <dlfcn.h>\n\n#include \"xenia/base/main_android.h\"\n#include \"xenia/base/string_util.h\"\n#endif\n\n#if XE_PLATFORM_LINUX\n// SIGEV_THREAD_ID in timer_create(...) is a Linux extension\n#define XE_HAS_SIGEV_THREAD_ID 1\n#ifdef __GLIBC__\n#define sigev_notify_thread_id _sigev_un._tid\n#endif\n#if __GLIBC__ == 2 && __GLIBC_MINOR__ < 30\n#define gettid() syscall(SYS_gettid)\n#endif\n#else\n#define XE_HAS_SIGEV_THREAD_ID 0\n#endif\n\nnamespace xe {\nnamespace threading {\n\n#if XE_PLATFORM_ANDROID\n// May be null if no dynamically loaded functions are required.\nstatic void* android_libc_;\n// API 26+.\nstatic int (*android_pthread_getname_np_)(pthread_t pthread, char* buf,\n                                          size_t n);\n\nvoid AndroidInitialize() {\n  if (xe::GetAndroidApiLevel() >= 26) {\n    android_libc_ = dlopen(\"libc.so\", RTLD_NOW);\n    assert_not_null(android_libc_);\n    if (android_libc_) {\n      android_pthread_getname_np_ =\n          reinterpret_cast<decltype(android_pthread_getname_np_)>(\n              dlsym(android_libc_, \"pthread_getname_np\"));\n      assert_not_null(android_pthread_getname_np_);\n    }\n  }\n}\n\nvoid AndroidShutdown() {\n  android_pthread_getname_np_ = nullptr;\n  if (android_libc_) {\n    dlclose(android_libc_);\n    android_libc_ = nullptr;\n  }\n}\n#endif\n\ntemplate <typename _Rep, typename _Period>\ninline timespec DurationToTimeSpec(\n    std::chrono::duration<_Rep, _Period> duration) {\n  auto nanoseconds =\n      std::chrono::duration_cast<std::chrono::nanoseconds>(duration);\n  auto div = ldiv(nanoseconds.count(), 1000000000L);\n  return timespec{div.quot, div.rem};\n}\n\n// Thread interruption is done using user-defined signals\n// This implementation uses the SIGRTMAX - SIGRTMIN to signal to a thread\n// gdb tip, for SIG = SIGRTMIN + SignalType : handle SIG nostop\n// lldb tip, for SIG = SIGRTMIN + SignalType : process handle SIG -s false\nenum class SignalType {\n  kThreadSuspend,\n  kThreadUserCallback,\n#if XE_PLATFORM_ANDROID\n  // pthread_cancel is not available on Android, using a signal handler for\n  // simplified PTHREAD_CANCEL_ASYNCHRONOUS-like behavior - not disabling\n  // cancellation currently, so should be enough.\n  kThreadTerminate,\n#endif\n  k_Count\n};\n\nint GetSystemSignal(SignalType num) {\n  auto result = SIGRTMIN + static_cast<int>(num);\n  assert_true(result < SIGRTMAX);\n  return result;\n}\n\nSignalType GetSystemSignalType(int num) {\n  return static_cast<SignalType>(num - SIGRTMIN);\n}\n\nthread_local std::array<bool, static_cast<size_t>(SignalType::k_Count)>\n    signal_handler_installed = {};\n\nstatic void signal_handler(int signal, siginfo_t* info, void* context);\n\nvoid install_signal_handler(SignalType type) {\n  if (signal_handler_installed[static_cast<size_t>(type)]) return;\n  struct sigaction action {};\n  action.sa_flags = SA_SIGINFO;\n  action.sa_sigaction = signal_handler;\n  sigemptyset(&action.sa_mask);\n  if (sigaction(GetSystemSignal(type), &action, nullptr) == -1)\n    signal_handler_installed[static_cast<size_t>(type)] = true;\n}\n\n// TODO(dougvj)\nvoid EnableAffinityConfiguration() {}\n\n// uint64_t ticks() { return mach_absolute_time(); }\n\nuint32_t current_thread_system_id() {\n  return static_cast<uint32_t>(syscall(SYS_gettid));\n}\n\nvoid MaybeYield() {\n  sched_yield();\n  __sync_synchronize();\n}\n\nvoid SyncMemory() { __sync_synchronize(); }\n\nvoid Sleep(std::chrono::microseconds duration) {\n  timespec rqtp = DurationToTimeSpec(duration);\n  timespec rmtp = {};\n  auto p_rqtp = &rqtp;\n  auto p_rmtp = &rmtp;\n  int ret = 0;\n  do {\n    ret = nanosleep(p_rqtp, p_rmtp);\n    // Swap requested for remaining in case of signal interruption\n    // in which case, we start sleeping again for the remainder\n    std::swap(p_rqtp, p_rmtp);\n  } while (ret == -1 && errno == EINTR);\n}\n\n// TODO(bwrsandman) Implement by allowing alert interrupts from IO operations\nthread_local bool alertable_state_ = false;\nSleepResult AlertableSleep(std::chrono::microseconds duration) {\n  alertable_state_ = true;\n  Sleep(duration);\n  alertable_state_ = false;\n  return SleepResult::kSuccess;\n}\n\nTlsHandle AllocateTlsHandle() {\n  auto key = static_cast<pthread_key_t>(-1);\n  auto res = pthread_key_create(&key, nullptr);\n  assert_zero(res);\n  assert_true(key != static_cast<pthread_key_t>(-1));\n  return static_cast<TlsHandle>(key);\n}\n\nbool FreeTlsHandle(TlsHandle handle) {\n  return pthread_key_delete(static_cast<pthread_key_t>(handle)) == 0;\n}\n\nuintptr_t GetTlsValue(TlsHandle handle) {\n  return reinterpret_cast<uintptr_t>(\n      pthread_getspecific(static_cast<pthread_key_t>(handle)));\n}\n\nbool SetTlsValue(TlsHandle handle, uintptr_t value) {\n  return pthread_setspecific(static_cast<pthread_key_t>(handle),\n                             reinterpret_cast<void*>(value)) == 0;\n}\n\nclass PosixConditionBase {\n public:\n  virtual bool Signal() = 0;\n\n  WaitResult Wait(std::chrono::milliseconds timeout) {\n    bool executed;\n    auto predicate = [this] { return this->signaled(); };\n    auto lock = std::unique_lock<std::mutex>(mutex_);\n    if (predicate()) {\n      executed = true;\n    } else {\n      if (timeout == std::chrono::milliseconds::max()) {\n        cond_.wait(lock, predicate);\n        executed = true;  // Did not time out;\n      } else {\n        executed = cond_.wait_for(lock, timeout, predicate);\n      }\n    }\n    if (executed) {\n      post_execution();\n      return WaitResult::kSuccess;\n    } else {\n      return WaitResult::kTimeout;\n    }\n  }\n\n  static std::pair<WaitResult, size_t> WaitMultiple(\n      std::vector<PosixConditionBase*>&& handles, bool wait_all,\n      std::chrono::milliseconds timeout) {\n    assert_true(handles.size() > 0);\n\n    // Construct a condition for all or any depending on wait_all\n    std::function<bool()> predicate;\n    {\n      using iter_t = std::vector<PosixConditionBase*>::const_iterator;\n      const auto predicate_inner = [](auto h) { return h->signaled(); };\n      const auto operation =\n          wait_all ? std::all_of<iter_t, decltype(predicate_inner)>\n                   : std::any_of<iter_t, decltype(predicate_inner)>;\n      predicate = [&handles, operation, predicate_inner] {\n        return operation(handles.cbegin(), handles.cend(), predicate_inner);\n      };\n    }\n\n    // TODO(bwrsandman, Triang3l) This is controversial, see issue #1677\n    // This will probably cause a deadlock on the next thread doing any waiting\n    // if the thread is suspended between locking and waiting\n    std::unique_lock<std::mutex> lock(PosixConditionBase::mutex_);\n\n    bool wait_success = true;\n    // If the timeout is infinite, wait without timeout.\n    // The predicate will be checked before beginning the wait\n    if (timeout == std::chrono::milliseconds::max()) {\n      PosixConditionBase::cond_.wait(lock, predicate);\n    } else {\n      // Wait with timeout.\n      wait_success =\n          PosixConditionBase::cond_.wait_for(lock, timeout, predicate);\n    }\n    if (wait_success) {\n      auto first_signaled = std::numeric_limits<size_t>::max();\n      for (auto i = 0u; i < handles.size(); ++i) {\n        if (handles[i]->signaled()) {\n          if (first_signaled > i) {\n            first_signaled = i;\n          }\n          handles[i]->post_execution();\n          if (!wait_all) break;\n        }\n      }\n      assert_true(std::numeric_limits<size_t>::max() != first_signaled);\n      return std::make_pair(WaitResult::kSuccess, first_signaled);\n    } else {\n      return std::make_pair<WaitResult, size_t>(WaitResult::kTimeout, 0);\n    }\n  }\n\n  virtual void* native_handle() const { return cond_.native_handle(); }\n\n protected:\n  inline virtual bool signaled() const = 0;\n  inline virtual void post_execution() = 0;\n  static std::condition_variable cond_;\n  static std::mutex mutex_;\n};\n\nstd::condition_variable PosixConditionBase::cond_;\nstd::mutex PosixConditionBase::mutex_;\n\n// There really is no native POSIX handle for a single wait/signal construct\n// pthreads is at a lower level with more handles for such a mechanism.\n// This simple wrapper class functions as our handle and uses conditional\n// variables for waits and signals.\ntemplate <typename T>\nclass PosixCondition {};\n\ntemplate <>\nclass PosixCondition<Event> : public PosixConditionBase {\n public:\n  PosixCondition(bool manual_reset, bool initial_state)\n      : signal_(initial_state), manual_reset_(manual_reset) {}\n  virtual ~PosixCondition() = default;\n\n  bool Signal() override {\n    auto lock = std::unique_lock<std::mutex>(mutex_);\n    signal_ = true;\n    cond_.notify_all();\n    return true;\n  }\n\n  void Reset() {\n    auto lock = std::unique_lock<std::mutex>(mutex_);\n    signal_ = false;\n  }\n\n private:\n  inline bool signaled() const override { return signal_; }\n  inline void post_execution() override {\n    if (!manual_reset_) {\n      signal_ = false;\n    }\n  }\n  bool signal_;\n  const bool manual_reset_;\n};\n\ntemplate <>\nclass PosixCondition<Semaphore> : public PosixConditionBase {\n public:\n  PosixCondition(uint32_t initial_count, uint32_t maximum_count)\n      : count_(initial_count), maximum_count_(maximum_count) {}\n\n  bool Signal() override { return Release(1, nullptr); }\n\n  bool Release(uint32_t release_count, int* out_previous_count) {\n    if (maximum_count_ - count_ >= release_count) {\n      auto lock = std::unique_lock<std::mutex>(mutex_);\n      if (out_previous_count) *out_previous_count = count_;\n      count_ += release_count;\n      cond_.notify_all();\n      return true;\n    }\n    return false;\n  }\n\n private:\n  inline bool signaled() const override { return count_ > 0; }\n  inline void post_execution() override {\n    count_--;\n    cond_.notify_all();\n  }\n  uint32_t count_;\n  const uint32_t maximum_count_;\n};\n\ntemplate <>\nclass PosixCondition<Mutant> : public PosixConditionBase {\n public:\n  explicit PosixCondition(bool initial_owner) : count_(0) {\n    if (initial_owner) {\n      count_ = 1;\n      owner_ = std::this_thread::get_id();\n    }\n  }\n\n  bool Signal() override { return Release(); }\n\n  bool Release() {\n    if (owner_ == std::this_thread::get_id() && count_ > 0) {\n      auto lock = std::unique_lock<std::mutex>(mutex_);\n      --count_;\n      // Free to be acquired by another thread\n      if (count_ == 0) {\n        cond_.notify_all();\n      }\n      return true;\n    }\n    return false;\n  }\n\n  void* native_handle() const override { return mutex_.native_handle(); }\n\n private:\n  inline bool signaled() const override {\n    return count_ == 0 || owner_ == std::this_thread::get_id();\n  }\n  inline void post_execution() override {\n    count_++;\n    owner_ = std::this_thread::get_id();\n  }\n  uint32_t count_;\n  std::thread::id owner_;\n};\n\ntemplate <>\nclass PosixCondition<Timer> : public PosixConditionBase {\n public:\n  explicit PosixCondition(bool manual_reset)\n      : callback_(nullptr), signal_(false), manual_reset_(manual_reset) {}\n\n  virtual ~PosixCondition() { Cancel(); }\n\n  bool Signal() override {\n    std::lock_guard<std::mutex> lock(mutex_);\n    signal_ = true;\n    cond_.notify_all();\n    return true;\n  }\n\n  void SetOnce(std::chrono::steady_clock::time_point due_time,\n               std::function<void()> opt_callback) {\n    Cancel();\n\n    std::lock_guard<std::mutex> lock(mutex_);\n\n    callback_ = std::move(opt_callback);\n    signal_ = false;\n    wait_item_ = QueueTimerOnce(&CompletionRoutine, this, due_time);\n  }\n\n  void SetRepeating(std::chrono::steady_clock::time_point due_time,\n                    std::chrono::milliseconds period,\n                    std::function<void()> opt_callback) {\n    Cancel();\n\n    std::lock_guard<std::mutex> lock(mutex_);\n\n    callback_ = std::move(opt_callback);\n    signal_ = false;\n    wait_item_ =\n        QueueTimerRecurring(&CompletionRoutine, this, due_time, period);\n  }\n\n  void Cancel() {\n    if (auto wait_item = wait_item_.lock()) {\n      wait_item->Disarm();\n    }\n  }\n\n  void* native_handle() const override {\n    assert_always();\n    return nullptr;\n  }\n\n private:\n  static void CompletionRoutine(void* userdata) {\n    assert_not_null(userdata);\n    auto timer = reinterpret_cast<PosixCondition<Timer>*>(userdata);\n    timer->Signal();\n    // As the callback may reset the timer, store local.\n    std::function<void()> callback;\n    {\n      std::lock_guard<std::mutex> lock(timer->mutex_);\n      callback = timer->callback_;\n    }\n    if (callback) {\n      callback();\n    }\n  }\n\n private:\n  inline bool signaled() const override { return signal_; }\n  inline void post_execution() override {\n    if (!manual_reset_) {\n      signal_ = false;\n    }\n  }\n  std::weak_ptr<TimerQueueWaitItem> wait_item_;\n  std::function<void()> callback_;\n  volatile bool signal_;\n  const bool manual_reset_;\n};\n\nstruct ThreadStartData {\n  std::function<void()> start_routine;\n  bool create_suspended;\n  Thread* thread_obj;\n};\n\ntemplate <>\nclass PosixCondition<Thread> : public PosixConditionBase {\n  enum class State {\n    kUninitialized,\n    kRunning,\n    kSuspended,\n    kFinished,\n  };\n\n public:\n  PosixCondition()\n      : thread_(0),\n        signaled_(false),\n        exit_code_(0),\n        state_(State::kUninitialized),\n        suspend_count_(0) {\n#if XE_PLATFORM_ANDROID\n    android_pre_api_26_name_[0] = '\\0';\n#endif\n  }\n  bool Initialize(Thread::CreationParameters params,\n                  ThreadStartData* start_data) {\n    start_data->create_suspended = params.create_suspended;\n    pthread_attr_t attr;\n    if (pthread_attr_init(&attr) != 0) return false;\n    if (pthread_attr_setstacksize(&attr, params.stack_size) != 0) {\n      pthread_attr_destroy(&attr);\n      return false;\n    }\n    if (params.initial_priority != 0) {\n      sched_param sched{};\n      sched.sched_priority = params.initial_priority + 1;\n      if (pthread_attr_setschedpolicy(&attr, SCHED_FIFO) != 0) {\n        pthread_attr_destroy(&attr);\n        return false;\n      }\n      if (pthread_attr_setschedparam(&attr, &sched) != 0) {\n        pthread_attr_destroy(&attr);\n        return false;\n      }\n    }\n    if (pthread_create(&thread_, &attr, ThreadStartRoutine, start_data) != 0) {\n      pthread_attr_destroy(&attr);\n      return false;\n    }\n    pthread_attr_destroy(&attr);\n    return true;\n  }\n\n  /// Constructor for existing thread. This should only happen once called by\n  /// Thread::GetCurrentThread() on the main thread\n  explicit PosixCondition(pthread_t thread)\n      : thread_(thread),\n        signaled_(false),\n        exit_code_(0),\n        state_(State::kRunning) {\n#if XE_PLATFORM_ANDROID\n    android_pre_api_26_name_[0] = '\\0';\n#endif\n  }\n\n  virtual ~PosixCondition() {\n    if (thread_ && !signaled_) {\n#if XE_PLATFORM_ANDROID\n      if (pthread_kill(thread_,\n                       GetSystemSignal(SignalType::kThreadTerminate)) != 0) {\n        assert_always();\n      }\n#else\n      if (pthread_cancel(thread_) != 0) {\n        assert_always();\n      }\n#endif\n      if (pthread_join(thread_, nullptr) != 0) {\n        assert_always();\n      }\n    }\n  }\n\n  bool Signal() override { return true; }\n\n  std::string name() const {\n    WaitStarted();\n    auto result = std::array<char, 17>{'\\0'};\n    std::unique_lock<std::mutex> lock(state_mutex_);\n    if (state_ != State::kUninitialized && state_ != State::kFinished) {\n#if XE_PLATFORM_ANDROID\n      // pthread_getname_np was added in API 26 - below that, store the name in\n      // this object, which may be only modified through Xenia threading, but\n      // should be enough in most cases.\n      if (android_pthread_getname_np_) {\n        if (android_pthread_getname_np_(thread_, result.data(),\n                                        result.size() - 1) != 0) {\n          assert_always();\n        }\n      } else {\n        std::lock_guard<std::mutex> lock(android_pre_api_26_name_mutex_);\n        std::strcpy(result.data(), android_pre_api_26_name_);\n      }\n#else\n      if (pthread_getname_np(thread_, result.data(), result.size() - 1) != 0) {\n        assert_always();\n      }\n#endif\n    }\n    return std::string(result.data());\n  }\n\n  void set_name(const std::string& name) {\n    WaitStarted();\n    std::unique_lock<std::mutex> lock(state_mutex_);\n    if (state_ != State::kUninitialized && state_ != State::kFinished) {\n      pthread_setname_np(thread_, std::string(name).c_str());\n#if XE_PLATFORM_ANDROID\n      SetAndroidPreApi26Name(name);\n#endif\n    }\n  }\n\n#if XE_PLATFORM_ANDROID\n  void SetAndroidPreApi26Name(const std::string_view name) {\n    if (android_pthread_getname_np_) {\n      return;\n    }\n    std::lock_guard<std::mutex> lock(android_pre_api_26_name_mutex_);\n    xe::string_util::copy_truncating(android_pre_api_26_name_, name,\n                                     xe::countof(android_pre_api_26_name_));\n  }\n#endif\n\n  uint32_t system_id() const { return static_cast<uint32_t>(thread_); }\n\n  uint64_t affinity_mask() {\n    WaitStarted();\n    cpu_set_t cpu_set;\n#if XE_PLATFORM_ANDROID\n    if (sched_getaffinity(pthread_gettid_np(thread_), sizeof(cpu_set_t),\n                          &cpu_set) != 0) {\n      assert_always();\n    }\n#else\n    if (pthread_getaffinity_np(thread_, sizeof(cpu_set_t), &cpu_set) != 0) {\n      assert_always();\n    }\n#endif\n    uint64_t result = 0;\n    auto cpu_count = std::min(CPU_SETSIZE, 64);\n    for (auto i = 0u; i < cpu_count; i++) {\n      auto set = CPU_ISSET(i, &cpu_set);\n      result |= set << i;\n    }\n    return result;\n  }\n\n  void set_affinity_mask(uint64_t mask) {\n    WaitStarted();\n    cpu_set_t cpu_set;\n    CPU_ZERO(&cpu_set);\n    for (auto i = 0u; i < 64; i++) {\n      if (mask & (1 << i)) {\n        CPU_SET(i, &cpu_set);\n      }\n    }\n#if XE_PLATFORM_ANDROID\n    if (sched_setaffinity(pthread_gettid_np(thread_), sizeof(cpu_set_t),\n                          &cpu_set) != 0) {\n      assert_always();\n    }\n#else\n    if (pthread_setaffinity_np(thread_, sizeof(cpu_set_t), &cpu_set) != 0) {\n      assert_always();\n    }\n#endif\n  }\n\n  int priority() {\n    WaitStarted();\n    int policy;\n    sched_param param{};\n    int ret = pthread_getschedparam(thread_, &policy, &param);\n    if (ret != 0) {\n      return -1;\n    }\n\n    return param.sched_priority;\n  }\n\n  void set_priority(int new_priority) {\n    WaitStarted();\n    sched_param param{};\n    param.sched_priority = new_priority;\n    if (pthread_setschedparam(thread_, SCHED_FIFO, &param) != 0)\n      assert_always();\n  }\n\n  void QueueUserCallback(std::function<void()> callback) {\n    WaitStarted();\n    std::unique_lock<std::mutex> lock(callback_mutex_);\n    user_callback_ = std::move(callback);\n    sigval value{};\n    value.sival_ptr = this;\n#if XE_PLATFORM_ANDROID\n    sigqueue(pthread_gettid_np(thread_),\n             GetSystemSignal(SignalType::kThreadUserCallback), value);\n#else\n    pthread_sigqueue(thread_, GetSystemSignal(SignalType::kThreadUserCallback),\n                     value);\n#endif\n  }\n\n  void CallUserCallback() {\n    std::unique_lock<std::mutex> lock(callback_mutex_);\n    user_callback_();\n  }\n\n  bool Resume(uint32_t* out_previous_suspend_count = nullptr) {\n    if (out_previous_suspend_count) {\n      *out_previous_suspend_count = 0;\n    }\n    WaitStarted();\n    std::unique_lock<std::mutex> lock(state_mutex_);\n    if (state_ != State::kSuspended) return false;\n    if (out_previous_suspend_count) {\n      *out_previous_suspend_count = suspend_count_;\n    }\n    --suspend_count_;\n    state_signal_.notify_all();\n    return true;\n  }\n\n  bool Suspend(uint32_t* out_previous_suspend_count = nullptr) {\n    if (out_previous_suspend_count) {\n      *out_previous_suspend_count = 0;\n    }\n    WaitStarted();\n    {\n      if (out_previous_suspend_count) {\n        *out_previous_suspend_count = suspend_count_;\n      }\n      state_ = State::kSuspended;\n      ++suspend_count_;\n    }\n    int result =\n        pthread_kill(thread_, GetSystemSignal(SignalType::kThreadSuspend));\n    return result == 0;\n  }\n\n  void Terminate(int exit_code) {\n    bool is_current_thread = pthread_self() == thread_;\n    {\n      std::unique_lock<std::mutex> lock(state_mutex_);\n      if (state_ == State::kFinished) {\n        if (is_current_thread) {\n          // This is really bad. Some thread must have called Terminate() on us\n          // just before we decided to terminate ourselves\n          assert_always();\n          for (;;) {\n            // Wait for pthread_cancel() to actually happen.\n          }\n        }\n        return;\n      }\n      state_ = State::kFinished;\n    }\n\n    {\n      std::lock_guard<std::mutex> lock(mutex_);\n\n      exit_code_ = exit_code;\n      signaled_ = true;\n      cond_.notify_all();\n    }\n    if (is_current_thread) {\n      pthread_exit(reinterpret_cast<void*>(exit_code));\n    } else {\n#ifdef XE_PLATFORM_ANDROID\n      if (pthread_kill(thread_,\n                       GetSystemSignal(SignalType::kThreadTerminate)) != 0) {\n        assert_always();\n      }\n#else\n      if (pthread_cancel(thread_) != 0) {\n        assert_always();\n      }\n#endif\n    }\n  }\n\n  void WaitStarted() const {\n    std::unique_lock<std::mutex> lock(state_mutex_);\n    state_signal_.wait(lock,\n                       [this] { return state_ != State::kUninitialized; });\n  }\n\n  /// Set state to suspended and wait until it reset by another thread\n  void WaitSuspended() {\n    std::unique_lock<std::mutex> lock(state_mutex_);\n    state_signal_.wait(lock, [this] { return suspend_count_ == 0; });\n    state_ = State::kRunning;\n  }\n\n  void* native_handle() const override {\n    return reinterpret_cast<void*>(thread_);\n  }\n\n private:\n  static void* ThreadStartRoutine(void* parameter);\n  inline bool signaled() const override { return signaled_; }\n  inline void post_execution() override {\n    if (thread_) {\n      pthread_join(thread_, nullptr);\n    }\n  }\n  pthread_t thread_;\n  bool signaled_;\n  int exit_code_;\n  volatile State state_;\n  volatile uint32_t suspend_count_;\n  mutable std::mutex state_mutex_;\n  mutable std::mutex callback_mutex_;\n  mutable std::condition_variable state_signal_;\n  std::function<void()> user_callback_;\n#if XE_PLATFORM_ANDROID\n  // Name accessible via name() on Android before API 26 which added\n  // pthread_getname_np.\n  mutable std::mutex android_pre_api_26_name_mutex_;\n  char android_pre_api_26_name_[16];\n#endif\n};\n\nclass PosixWaitHandle {\n public:\n  virtual PosixConditionBase& condition() = 0;\n};\n\n// This wraps a condition object as our handle because posix has no single\n// native handle for higher level concurrency constructs such as semaphores\ntemplate <typename T>\nclass PosixConditionHandle : public T, public PosixWaitHandle {\n public:\n  PosixConditionHandle() = default;\n  explicit PosixConditionHandle(bool);\n  explicit PosixConditionHandle(pthread_t thread);\n  PosixConditionHandle(bool manual_reset, bool initial_state);\n  PosixConditionHandle(uint32_t initial_count, uint32_t maximum_count);\n  ~PosixConditionHandle() override = default;\n\n  PosixCondition<T>& condition() override { return handle_; }\n  void* native_handle() const override { return handle_.native_handle(); }\n\n protected:\n  PosixCondition<T> handle_;\n  friend PosixCondition<T>;\n};\n\ntemplate <>\nPosixConditionHandle<Semaphore>::PosixConditionHandle(uint32_t initial_count,\n                                                      uint32_t maximum_count)\n    : handle_(initial_count, maximum_count) {}\n\ntemplate <>\nPosixConditionHandle<Mutant>::PosixConditionHandle(bool initial_owner)\n    : handle_(initial_owner) {}\n\ntemplate <>\nPosixConditionHandle<Timer>::PosixConditionHandle(bool manual_reset)\n    : handle_(manual_reset) {}\n\ntemplate <>\nPosixConditionHandle<Event>::PosixConditionHandle(bool manual_reset,\n                                                  bool initial_state)\n    : handle_(manual_reset, initial_state) {}\n\ntemplate <>\nPosixConditionHandle<Thread>::PosixConditionHandle(pthread_t thread)\n    : handle_(thread) {}\n\nWaitResult Wait(WaitHandle* wait_handle, bool is_alertable,\n                std::chrono::milliseconds timeout) {\n  auto posix_wait_handle = dynamic_cast<PosixWaitHandle*>(wait_handle);\n  if (posix_wait_handle == nullptr) {\n    return WaitResult::kFailed;\n  }\n  if (is_alertable) alertable_state_ = true;\n  auto result = posix_wait_handle->condition().Wait(timeout);\n  if (is_alertable) alertable_state_ = false;\n  return result;\n}\n\nWaitResult SignalAndWait(WaitHandle* wait_handle_to_signal,\n                         WaitHandle* wait_handle_to_wait_on, bool is_alertable,\n                         std::chrono::milliseconds timeout) {\n  auto result = WaitResult::kFailed;\n  auto posix_wait_handle_to_signal =\n      dynamic_cast<PosixWaitHandle*>(wait_handle_to_signal);\n  auto posix_wait_handle_to_wait_on =\n      dynamic_cast<PosixWaitHandle*>(wait_handle_to_wait_on);\n  if (posix_wait_handle_to_signal == nullptr ||\n      posix_wait_handle_to_wait_on == nullptr) {\n    return WaitResult::kFailed;\n  }\n  if (is_alertable) alertable_state_ = true;\n  if (posix_wait_handle_to_signal->condition().Signal()) {\n    result = posix_wait_handle_to_wait_on->condition().Wait(timeout);\n  }\n  if (is_alertable) alertable_state_ = false;\n  return result;\n}\n\nstd::pair<WaitResult, size_t> WaitMultiple(WaitHandle* wait_handles[],\n                                           size_t wait_handle_count,\n                                           bool wait_all, bool is_alertable,\n                                           std::chrono::milliseconds timeout) {\n  std::vector<PosixConditionBase*> conditions;\n  conditions.reserve(wait_handle_count);\n  for (size_t i = 0u; i < wait_handle_count; ++i) {\n    auto handle = dynamic_cast<PosixWaitHandle*>(wait_handles[i]);\n    if (handle == nullptr) {\n      return std::make_pair(WaitResult::kFailed, 0);\n    }\n    conditions.push_back(&handle->condition());\n  }\n  if (is_alertable) alertable_state_ = true;\n  auto result = PosixConditionBase::WaitMultiple(std::move(conditions),\n                                                 wait_all, timeout);\n  if (is_alertable) alertable_state_ = false;\n  return result;\n}\n\nclass PosixEvent : public PosixConditionHandle<Event> {\n public:\n  PosixEvent(bool manual_reset, bool initial_state)\n      : PosixConditionHandle(manual_reset, initial_state) {}\n  ~PosixEvent() override = default;\n  void Set() override { handle_.Signal(); }\n  void Reset() override { handle_.Reset(); }\n  void Pulse() override {\n    using namespace std::chrono_literals;\n    handle_.Signal();\n    MaybeYield();\n    Sleep(10us);\n    handle_.Reset();\n  }\n};\n\nstd::unique_ptr<Event> Event::CreateManualResetEvent(bool initial_state) {\n  return std::make_unique<PosixEvent>(true, initial_state);\n}\n\nstd::unique_ptr<Event> Event::CreateAutoResetEvent(bool initial_state) {\n  return std::make_unique<PosixEvent>(false, initial_state);\n}\n\nclass PosixSemaphore : public PosixConditionHandle<Semaphore> {\n public:\n  PosixSemaphore(int initial_count, int maximum_count)\n      : PosixConditionHandle(static_cast<uint32_t>(initial_count),\n                             static_cast<uint32_t>(maximum_count)) {}\n  ~PosixSemaphore() override = default;\n  bool Release(int release_count, int* out_previous_count) override {\n    if (release_count < 1) {\n      return false;\n    }\n    return handle_.Release(static_cast<uint32_t>(release_count),\n                           out_previous_count);\n  }\n};\n\nstd::unique_ptr<Semaphore> Semaphore::Create(int initial_count,\n                                             int maximum_count) {\n  if (initial_count < 0 || initial_count > maximum_count ||\n      maximum_count <= 0) {\n    return nullptr;\n  }\n  return std::make_unique<PosixSemaphore>(initial_count, maximum_count);\n}\n\nclass PosixMutant : public PosixConditionHandle<Mutant> {\n public:\n  explicit PosixMutant(bool initial_owner)\n      : PosixConditionHandle(initial_owner) {}\n  ~PosixMutant() override = default;\n  bool Release() override { return handle_.Release(); }\n};\n\nstd::unique_ptr<Mutant> Mutant::Create(bool initial_owner) {\n  return std::make_unique<PosixMutant>(initial_owner);\n}\n\nclass PosixTimer : public PosixConditionHandle<Timer> {\n  using WClock_ = Timer::WClock_;\n  using GClock_ = Timer::GClock_;\n\n public:\n  explicit PosixTimer(bool manual_reset) : PosixConditionHandle(manual_reset) {}\n  ~PosixTimer() override = default;\n\n  bool SetOnceAfter(xe::chrono::hundrednanoseconds rel_time,\n                    std::function<void()> opt_callback = nullptr) override {\n    return SetOnceAt(GClock_::now() + rel_time, std::move(opt_callback));\n  }\n  bool SetOnceAt(WClock_::time_point due_time,\n                 std::function<void()> opt_callback = nullptr) override {\n    return SetOnceAt(date::clock_cast<GClock_>(due_time),\n                     std::move(opt_callback));\n  };\n  bool SetOnceAt(GClock_::time_point due_time,\n                 std::function<void()> opt_callback = nullptr) override {\n    handle_.SetOnce(due_time, std::move(opt_callback));\n    return true;\n  }\n\n  bool SetRepeatingAfter(\n      xe::chrono::hundrednanoseconds rel_time, std::chrono::milliseconds period,\n      std::function<void()> opt_callback = nullptr) override {\n    return SetRepeatingAt(GClock_::now() + rel_time, period,\n                          std::move(opt_callback));\n  }\n  bool SetRepeatingAt(WClock_::time_point due_time,\n                      std::chrono::milliseconds period,\n                      std::function<void()> opt_callback = nullptr) override {\n    return SetRepeatingAt(date::clock_cast<GClock_>(due_time), period,\n                          std::move(opt_callback));\n  }\n  bool SetRepeatingAt(GClock_::time_point due_time,\n                      std::chrono::milliseconds period,\n                      std::function<void()> opt_callback = nullptr) override {\n    handle_.SetRepeating(due_time, period, std::move(opt_callback));\n    return true;\n  }\n  bool Cancel() override {\n    handle_.Cancel();\n    return true;\n  }\n};\n\nstd::unique_ptr<Timer> Timer::CreateManualResetTimer() {\n  return std::make_unique<PosixTimer>(true);\n}\n\nstd::unique_ptr<Timer> Timer::CreateSynchronizationTimer() {\n  return std::make_unique<PosixTimer>(false);\n}\n\nclass PosixThread : public PosixConditionHandle<Thread> {\n public:\n  PosixThread() = default;\n  explicit PosixThread(pthread_t thread) : PosixConditionHandle(thread) {}\n  ~PosixThread() override = default;\n\n  bool Initialize(CreationParameters params,\n                  std::function<void()> start_routine) {\n    auto start_data =\n        new ThreadStartData({std::move(start_routine), false, this});\n    return handle_.Initialize(params, start_data);\n  }\n\n  void set_name(std::string name) override {\n    handle_.WaitStarted();\n    Thread::set_name(name);\n    if (name.length() > 15) {\n      name = name.substr(0, 15);\n    }\n    handle_.set_name(name);\n  }\n\n  uint32_t system_id() const override { return handle_.system_id(); }\n\n  uint64_t affinity_mask() override { return handle_.affinity_mask(); }\n  void set_affinity_mask(uint64_t mask) override {\n    handle_.set_affinity_mask(mask);\n  }\n\n  int priority() override { return handle_.priority(); }\n  void set_priority(int new_priority) override {\n    handle_.set_priority(new_priority);\n  }\n\n  void QueueUserCallback(std::function<void()> callback) override {\n    handle_.QueueUserCallback(std::move(callback));\n  }\n\n  bool Resume(uint32_t* out_previous_suspend_count) override {\n    return handle_.Resume(out_previous_suspend_count);\n  }\n\n  bool Suspend(uint32_t* out_previous_suspend_count) override {\n    return handle_.Suspend(out_previous_suspend_count);\n  }\n\n  void Terminate(int exit_code) override { handle_.Terminate(exit_code); }\n\n  void WaitSuspended() { handle_.WaitSuspended(); }\n};\n\nthread_local PosixThread* current_thread_ = nullptr;\n\nvoid* PosixCondition<Thread>::ThreadStartRoutine(void* parameter) {\n#if !XE_PLATFORM_ANDROID\n  if (pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, nullptr) != 0) {\n    assert_always();\n  }\n#endif\n  threading::set_name(\"\");\n\n  auto start_data = static_cast<ThreadStartData*>(parameter);\n  assert_not_null(start_data);\n  assert_not_null(start_data->thread_obj);\n\n  auto thread = dynamic_cast<PosixThread*>(start_data->thread_obj);\n  auto start_routine = std::move(start_data->start_routine);\n  auto create_suspended = start_data->create_suspended;\n  delete start_data;\n\n  current_thread_ = thread;\n  {\n    std::unique_lock<std::mutex> lock(thread->handle_.state_mutex_);\n    thread->handle_.state_ =\n        create_suspended ? State::kSuspended : State::kRunning;\n    thread->handle_.state_signal_.notify_all();\n  }\n\n  if (create_suspended) {\n    std::unique_lock<std::mutex> lock(thread->handle_.state_mutex_);\n    thread->handle_.suspend_count_ = 1;\n    thread->handle_.state_signal_.wait(\n        lock, [thread] { return thread->handle_.suspend_count_ == 0; });\n  }\n\n  start_routine();\n\n  {\n    std::unique_lock<std::mutex> lock(thread->handle_.state_mutex_);\n    thread->handle_.state_ = State::kFinished;\n  }\n\n  std::unique_lock<std::mutex> lock(mutex_);\n  thread->handle_.exit_code_ = 0;\n  thread->handle_.signaled_ = true;\n  cond_.notify_all();\n\n  current_thread_ = nullptr;\n  return nullptr;\n}\n\nstd::unique_ptr<Thread> Thread::Create(CreationParameters params,\n                                       std::function<void()> start_routine) {\n  install_signal_handler(SignalType::kThreadSuspend);\n  install_signal_handler(SignalType::kThreadUserCallback);\n#if XE_PLATFORM_ANDROID\n  install_signal_handler(SignalType::kThreadTerminate);\n#endif\n  auto thread = std::make_unique<PosixThread>();\n  if (!thread->Initialize(params, std::move(start_routine))) return nullptr;\n  assert_not_null(thread);\n  return thread;\n}\n\nThread* Thread::GetCurrentThread() {\n  if (current_thread_) {\n    return current_thread_;\n  }\n\n  // Should take this route only for threads not created by Thread::Create.\n  // The only thread not created by Thread::Create should be the main thread.\n  pthread_t handle = pthread_self();\n\n  current_thread_ = new PosixThread(handle);\n  // TODO(bwrsandman): Disabling deleting thread_local current thread to prevent\n  //                   assert in destructor. Since this is thread local, the\n  //                   \"memory leaking\" is controlled.\n  // atexit([] { delete current_thread_; });\n\n  return current_thread_;\n}\n\nvoid Thread::Exit(int exit_code) {\n  if (current_thread_) {\n    current_thread_->Terminate(exit_code);\n  } else {\n    // Should only happen with the main thread\n    pthread_exit(reinterpret_cast<void*>(exit_code));\n  }\n  // Function must not return\n  assert_always();\n}\n\nvoid set_name(const std::string_view name) {\n  pthread_setname_np(pthread_self(), std::string(name).c_str());\n#if XE_PLATFORM_ANDROID\n  if (!android_pthread_getname_np_ && current_thread_) {\n    current_thread_->condition().SetAndroidPreApi26Name(name);\n  }\n#endif\n}\n\nstatic void signal_handler(int signal, siginfo_t* info, void* /*context*/) {\n  switch (GetSystemSignalType(signal)) {\n    case SignalType::kThreadSuspend: {\n      assert_not_null(current_thread_);\n      current_thread_->WaitSuspended();\n    } break;\n    case SignalType::kThreadUserCallback: {\n      assert_not_null(info->si_value.sival_ptr);\n      auto p_thread =\n          static_cast<PosixCondition<Thread>*>(info->si_value.sival_ptr);\n      if (alertable_state_) {\n        p_thread->CallUserCallback();\n      }\n    } break;\n#if XE_PLATFORM_ANDROID\n    case SignalType::kThreadTerminate: {\n      pthread_exit(reinterpret_cast<void*>(-1));\n    } break;\n#endif\n    default:\n      assert_always();\n  }\n}\n\n}  // namespace threading\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/base/threading_timer_queue.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include <algorithm>\n#include <forward_list>\n\n#include \"third_party/disruptorplus/include/disruptorplus/multi_threaded_claim_strategy.hpp\"\n#include \"third_party/disruptorplus/include/disruptorplus/ring_buffer.hpp\"\n#include \"third_party/disruptorplus/include/disruptorplus/sequence_barrier.hpp\"\n#include \"third_party/disruptorplus/include/disruptorplus/spin_wait.hpp\"\n#include \"third_party/disruptorplus/include/disruptorplus/spin_wait_strategy.hpp\"\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/threading.h\"\n#include \"xenia/base/threading_timer_queue.h\"\n\nnamespace dp = disruptorplus;\n\nnamespace xe {\nnamespace threading {\n\nusing WaitItem = TimerQueueWaitItem;\n\nclass TimerQueue {\n public:\n  using clock = WaitItem::clock;\n  static_assert(clock::is_steady);\n\n public:\n  TimerQueue()\n      : buffer_(kWaitCount),\n        wait_strategy_(),\n        claim_strategy_(kWaitCount, wait_strategy_),\n        consumed_(wait_strategy_),\n        shutdown_(false) {\n    claim_strategy_.add_claim_barrier(consumed_);\n    dispatch_thread_ = std::thread(&TimerQueue::TimerThreadMain, this);\n  }\n\n  ~TimerQueue() {\n    shutdown_.store(true, std::memory_order_release);\n\n    // Kick dispatch thread to check shutdown flag\n    auto wait_item = std::make_shared<WaitItem>(nullptr, nullptr, this,\n                                                clock::time_point::min(),\n                                                clock::duration::zero());\n    wait_item->Disarm();\n    QueueTimer(std::move(wait_item));\n\n    dispatch_thread_.join();\n  }\n\n  void TimerThreadMain() {\n    dp::sequence_t next_sequence = 0;\n    const auto comp = [](const std::shared_ptr<WaitItem>& left,\n                         const std::shared_ptr<WaitItem>& right) {\n      return left->due_ < right->due_;\n    };\n\n    xe::threading::set_name(\"xe::threading::TimerQueue\");\n\n    while (!shutdown_.load(std::memory_order_relaxed)) {\n      {\n        // Consume new wait items and add them to sorted wait queue\n        dp::sequence_t available = claim_strategy_.wait_until_published(\n            next_sequence, next_sequence - 1,\n            wait_queue_.empty() ? clock::time_point::max()\n                                : wait_queue_.front()->due_);\n\n        // Check for timeout\n        if (available != next_sequence - 1) {\n          std::forward_list<std::shared_ptr<WaitItem>> wait_items;\n          do {\n            wait_items.push_front(std::move(buffer_[next_sequence]));\n          } while (next_sequence++ != available);\n\n          consumed_.publish(available);\n\n          wait_items.sort(comp);\n          wait_queue_.merge(wait_items, comp);\n        }\n      }\n\n      {\n        // Check wait queue, invoke callbacks and reschedule\n        std::forward_list<std::shared_ptr<WaitItem>> wait_items;\n        while (!wait_queue_.empty() &&\n               wait_queue_.front()->due_ <= clock::now()) {\n          auto wait_item = std::move(wait_queue_.front());\n          wait_queue_.pop_front();\n\n          // Ensure that it isn't disarmed\n          auto state = WaitItem::State::kIdle;\n          if (wait_item->state_.compare_exchange_strong(\n                  state, WaitItem::State::kInCallback,\n                  std::memory_order_acq_rel)) {\n            // Possibility to dispatch to a thread pool here\n            assert_not_null(wait_item->callback_);\n            wait_item->callback_(wait_item->userdata_);\n\n            if (wait_item->interval_ != clock::duration::zero() &&\n                wait_item->state_.load(std::memory_order_acquire) !=\n                    WaitItem::State::kInCallbackSelfDisarmed) {\n              // Item is recurring and didn't self-disarm during callback:\n              wait_item->due_ += wait_item->interval_;\n              wait_item->state_.store(WaitItem::State::kIdle,\n                                      std::memory_order_release);\n              wait_items.push_front(std::move(wait_item));\n            } else {\n              wait_item->state_.store(WaitItem::State::kDisarmed,\n                                      std::memory_order_release);\n            }\n          } else {\n            // Specifically, kInCallback is illegal here\n            assert_true(WaitItem::State::kDisarmed == state);\n          }\n        }\n        wait_items.sort(comp);\n        wait_queue_.merge(wait_items, comp);\n      }\n    }\n  }\n\n  std::weak_ptr<WaitItem> QueueTimer(std::shared_ptr<WaitItem> wait_item) {\n    auto wait_item_weak = std::weak_ptr<WaitItem>(wait_item);\n\n    // Mitigate callback flooding\n    wait_item->due_ =\n        std::max(clock::now() - wait_item->interval_, wait_item->due_);\n\n    auto sequence = claim_strategy_.claim_one();\n    buffer_[sequence] = std::move(wait_item);\n    claim_strategy_.publish(sequence);\n\n    return wait_item_weak;\n  }\n\n  const std::thread& dispatch_thread() const { return dispatch_thread_; }\n\n private:\n  // This ring buffer will be used to introduce timers queued by the public API\n  static constexpr size_t kWaitCount = 512;\n  dp::ring_buffer<std::shared_ptr<WaitItem>> buffer_;\n  dp::spin_wait_strategy wait_strategy_;\n  dp::multi_threaded_claim_strategy<dp::spin_wait_strategy> claim_strategy_;\n  dp::sequence_barrier<dp::spin_wait_strategy> consumed_;\n\n  // This is a _sorted_ (ascending due_) list of active timers managed by a\n  // dedicated thread\n  std::forward_list<std::shared_ptr<WaitItem>> wait_queue_;\n  std::atomic_bool shutdown_;\n  std::thread dispatch_thread_;\n};\n\nxe::threading::TimerQueue timer_queue_;\n\nvoid TimerQueueWaitItem::Disarm() {\n  State state;\n\n  // Special case for calling from a callback itself\n  if (std::this_thread::get_id() == parent_queue_->dispatch_thread().get_id()) {\n    state = State::kInCallback;\n    if (state_.compare_exchange_strong(state, State::kInCallbackSelfDisarmed,\n                                       std::memory_order_acq_rel)) {\n      // If we are self disarming from the callback set this special state and\n      // exit\n      return;\n    }\n    // Normal case can handle the rest\n  }\n\n  dp::spin_wait spinner;\n  state = State::kIdle;\n  // Classes which hold WaitItems will often call Disarm() to cancel them during\n  // destruction. This may lead to race conditions when the dispatch thread\n  // executes a callback which accesses memory that is freed simultaneously due\n  // to this. Therefore, we need to guarantee that no callbacks will be running\n  // once Disarm() has returned.\n  while (!state_.compare_exchange_weak(state, State::kDisarmed,\n                                       std::memory_order_acq_rel)) {\n    if (state == State::kDisarmed) {\n      // Do not break for kInCallbackSelfDisarmed and keep spinning in order to\n      // meet guarantees\n      break;\n    }\n    state = State::kIdle;\n    spinner.spin_once();\n  }\n}\n\nstd::weak_ptr<WaitItem> QueueTimerOnce(std::function<void(void*)> callback,\n                                       void* userdata,\n                                       WaitItem::clock::time_point due) {\n  return timer_queue_.QueueTimer(\n      std::make_shared<WaitItem>(std::move(callback), userdata, &timer_queue_,\n                                 due, WaitItem::clock::duration::zero()));\n}\n\nstd::weak_ptr<WaitItem> QueueTimerRecurring(\n    std::function<void(void*)> callback, void* userdata,\n    WaitItem::clock::time_point due, WaitItem::clock::duration interval) {\n  return timer_queue_.QueueTimer(std::make_shared<WaitItem>(\n      std::move(callback), userdata, &timer_queue_, due, interval));\n}\n\n}  // namespace threading\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/base/threading_timer_queue.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_BASE_THREADING_TIMER_QUEUE_H_\n#define XENIA_BASE_THREADING_TIMER_QUEUE_H_\n\n#include <atomic>\n#include <chrono>\n#include <functional>\n#include <memory>\n\n// This is a platform independent implementation of a timer queue similar to\n// Windows CreateTimerQueueTimer with WT_EXECUTEINTIMERTHREAD.\n\nnamespace xe::threading {\n\nclass TimerQueue;\n\nstruct TimerQueueWaitItem {\n  using clock = std::chrono::steady_clock;\n\n  TimerQueueWaitItem(std::function<void(void*)> callback, void* userdata,\n                     TimerQueue* parent_queue, clock::time_point due,\n                     clock::duration interval)\n      : callback_(std::move(callback)),\n        userdata_(userdata),\n        parent_queue_(parent_queue),\n        due_(due),\n        interval_(interval),\n        state_(State::kIdle) {}\n\n  // Cancel the pending wait item. No callbacks will be running after this call.\n  // The function blocks if a callback is running and returns only after the\n  // callback has finished (except when called from the corresponding callback\n  // itself, where it will mark the wait item for disarmament and return\n  // immediately). Deadlocks are possible when a lock is held during disamament\n  // and the corresponding callback is running concurrently, trying to acquire\n  // said lock.\n  void Disarm();\n\n  friend TimerQueue;\n\n private:\n  enum class State : uint_least8_t {\n    kIdle = 0,                // Waiting for the due time\n    kInCallback,              // Callback is being executed\n    kInCallbackSelfDisarmed,  // Callback is being executed and disarmed itself\n    kDisarmed                 // Disarmed, waiting for destruction\n  };\n  static_assert(std::atomic<State>::is_always_lock_free);\n\n  std::function<void(void*)> callback_;\n  void* userdata_;\n  TimerQueue* parent_queue_;\n  clock::time_point due_;\n  clock::duration interval_;  // zero if not recurring\n  std::atomic<State> state_;\n};\n\nstd::weak_ptr<TimerQueueWaitItem> QueueTimerOnce(\n    std::function<void(void*)> callback, void* userdata,\n    TimerQueueWaitItem::clock::time_point due);\n\n// Callback is first executed at due, then again repeatedly after interval\n// passes (unless interval == 0). The first callback will be scheduled at\n// `max(now() - interval, due)` to mitigate callback flooding.\nstd::weak_ptr<TimerQueueWaitItem> QueueTimerRecurring(\n    std::function<void(void*)> callback, void* userdata,\n    TimerQueueWaitItem::clock::time_point due,\n    TimerQueueWaitItem::clock::duration interval);\n}  // namespace xe::threading\n\n#endif\n"
  },
  {
    "path": "src/xenia/base/threading_win.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/chrono_steady_cast.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/platform_win.h\"\n#include \"xenia/base/threading.h\"\n#include \"xenia/base/threading_timer_queue.h\"\n\n#define LOG_LASTERROR() \\\n  { XELOGI(\"Win32 Error 0x{:08X} in \" __FUNCTION__ \"(...)\", GetLastError()); }\n\ntypedef HANDLE (*SetThreadDescriptionFn)(HANDLE hThread,\n                                         PCWSTR lpThreadDescription);\n\nnamespace xe {\nnamespace threading {\n\nvoid EnableAffinityConfiguration() {\n  HANDLE process_handle = GetCurrentProcess();\n  DWORD_PTR process_affinity_mask;\n  DWORD_PTR system_affinity_mask;\n  GetProcessAffinityMask(process_handle, &process_affinity_mask,\n                         &system_affinity_mask);\n  SetProcessAffinityMask(process_handle, system_affinity_mask);\n}\n\nuint32_t current_thread_system_id() {\n  return static_cast<uint32_t>(GetCurrentThreadId());\n}\n\n// https://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx\n#pragma pack(push, 8)\nstruct THREADNAME_INFO {\n  DWORD dwType;      // Must be 0x1000.\n  LPCSTR szName;     // Pointer to name (in user addr space).\n  DWORD dwThreadID;  // Thread ID (-1=caller thread).\n  DWORD dwFlags;     // Reserved for future use, must be zero.\n};\n#pragma pack(pop)\n\nvoid raise_thread_name_exception(HANDLE thread, const std::string& name) {\n  if (!IsDebuggerPresent()) {\n    return;\n  }\n  THREADNAME_INFO info;\n  info.dwType = 0x1000;\n  info.szName = name.c_str();\n  info.dwThreadID = ::GetThreadId(thread);\n  info.dwFlags = 0;\n  __try {\n    RaiseException(0x406D1388, 0, sizeof(info) / sizeof(ULONG_PTR),\n                   reinterpret_cast<ULONG_PTR*>(&info));\n  } __except (EXCEPTION_EXECUTE_HANDLER) {  // NOLINT\n  }\n}\n\nstatic void set_name(HANDLE thread, const std::string_view name) {\n  auto kernel = GetModuleHandleW(L\"kernel32.dll\");\n  if (kernel) {\n    auto func =\n        (SetThreadDescriptionFn)GetProcAddress(kernel, \"SetThreadDescription\");\n    if (func) {\n      auto u16name = xe::to_utf16(name);\n      func(thread, reinterpret_cast<PCWSTR>(u16name.c_str()));\n    }\n  }\n  raise_thread_name_exception(thread, std::string(name));\n}\n\nvoid set_name(const std::string_view name) {\n  set_name(GetCurrentThread(), name);\n}\n\nvoid MaybeYield() {\n  SwitchToThread();\n  MemoryBarrier();\n}\n\nvoid SyncMemory() { MemoryBarrier(); }\n\nvoid Sleep(std::chrono::microseconds duration) {\n  if (duration.count() < 100) {\n    MaybeYield();\n  } else {\n    ::Sleep(static_cast<DWORD>(duration.count() / 1000));\n  }\n}\n\nSleepResult AlertableSleep(std::chrono::microseconds duration) {\n  if (SleepEx(static_cast<DWORD>(duration.count() / 1000), TRUE) ==\n      WAIT_IO_COMPLETION) {\n    return SleepResult::kAlerted;\n  }\n  return SleepResult::kSuccess;\n}\n\nTlsHandle AllocateTlsHandle() { return TlsAlloc(); }\n\nbool FreeTlsHandle(TlsHandle handle) { return TlsFree(handle) ? true : false; }\n\nuintptr_t GetTlsValue(TlsHandle handle) {\n  return reinterpret_cast<uintptr_t>(TlsGetValue(handle));\n}\n\nbool SetTlsValue(TlsHandle handle, uintptr_t value) {\n  return TlsSetValue(handle, reinterpret_cast<void*>(value)) ? true : false;\n}\n\ntemplate <typename T>\nclass Win32Handle : public T {\n public:\n  explicit Win32Handle(HANDLE handle) : handle_(handle) {\n    assert_not_null(handle);\n  }\n  ~Win32Handle() override {\n    CloseHandle(handle_);\n    handle_ = nullptr;\n  }\n\n protected:\n  void* native_handle() const override { return handle_; }\n\n  HANDLE handle_ = nullptr;\n};\n\nWaitResult Wait(WaitHandle* wait_handle, bool is_alertable,\n                std::chrono::milliseconds timeout) {\n  HANDLE handle = wait_handle->native_handle();\n  DWORD result = WaitForSingleObjectEx(handle, DWORD(timeout.count()),\n                                       is_alertable ? TRUE : FALSE);\n  switch (result) {\n    case WAIT_OBJECT_0:\n      return WaitResult::kSuccess;\n    case WAIT_ABANDONED:\n      return WaitResult::kAbandoned;\n    case WAIT_IO_COMPLETION:\n      return WaitResult::kUserCallback;\n    case WAIT_TIMEOUT:\n      return WaitResult::kTimeout;\n    default:\n    case WAIT_FAILED:\n      return WaitResult::kFailed;\n  }\n}\n\nWaitResult SignalAndWait(WaitHandle* wait_handle_to_signal,\n                         WaitHandle* wait_handle_to_wait_on, bool is_alertable,\n                         std::chrono::milliseconds timeout) {\n  HANDLE handle_to_signal = wait_handle_to_signal->native_handle();\n  HANDLE handle_to_wait_on = wait_handle_to_wait_on->native_handle();\n  DWORD result =\n      SignalObjectAndWait(handle_to_signal, handle_to_wait_on,\n                          DWORD(timeout.count()), is_alertable ? TRUE : FALSE);\n  switch (result) {\n    case WAIT_OBJECT_0:\n      return WaitResult::kSuccess;\n    case WAIT_ABANDONED:\n      return WaitResult::kAbandoned;\n    case WAIT_IO_COMPLETION:\n      return WaitResult::kUserCallback;\n    case WAIT_TIMEOUT:\n      return WaitResult::kTimeout;\n    default:\n    case WAIT_FAILED:\n      return WaitResult::kFailed;\n  }\n}\n\nstd::pair<WaitResult, size_t> WaitMultiple(WaitHandle* wait_handles[],\n                                           size_t wait_handle_count,\n                                           bool wait_all, bool is_alertable,\n                                           std::chrono::milliseconds timeout) {\n  std::vector<HANDLE> handles(wait_handle_count);\n  for (size_t i = 0; i < wait_handle_count; ++i) {\n    handles[i] = wait_handles[i]->native_handle();\n  }\n  DWORD result = WaitForMultipleObjectsEx(\n      DWORD(handles.size()), handles.data(), wait_all ? TRUE : FALSE,\n      DWORD(timeout.count()), is_alertable ? TRUE : FALSE);\n  if (result >= WAIT_OBJECT_0 && result < WAIT_OBJECT_0 + handles.size()) {\n    return std::pair<WaitResult, size_t>(WaitResult::kSuccess,\n                                         result - WAIT_OBJECT_0);\n  } else if (result >= WAIT_ABANDONED_0 &&\n             result < WAIT_ABANDONED_0 + handles.size()) {\n    return std::pair<WaitResult, size_t>(WaitResult::kAbandoned,\n                                         result - WAIT_ABANDONED_0);\n  }\n  switch (result) {\n    case WAIT_IO_COMPLETION:\n      return std::pair<WaitResult, size_t>(WaitResult::kUserCallback, 0);\n    case WAIT_TIMEOUT:\n      return std::pair<WaitResult, size_t>(WaitResult::kTimeout, 0);\n    default:\n    case WAIT_FAILED:\n      return std::pair<WaitResult, size_t>(WaitResult::kFailed, 0);\n  }\n}\n\nclass Win32Event : public Win32Handle<Event> {\n public:\n  explicit Win32Event(HANDLE handle) : Win32Handle(handle) {}\n  ~Win32Event() override = default;\n  void Set() override { SetEvent(handle_); }\n  void Reset() override { ResetEvent(handle_); }\n  void Pulse() override { PulseEvent(handle_); }\n};\n\nstd::unique_ptr<Event> Event::CreateManualResetEvent(bool initial_state) {\n  HANDLE handle =\n      CreateEvent(nullptr, TRUE, initial_state ? TRUE : FALSE, nullptr);\n  if (handle) {\n    return std::make_unique<Win32Event>(handle);\n  } else {\n    LOG_LASTERROR();\n    return nullptr;\n  }\n}\n\nstd::unique_ptr<Event> Event::CreateAutoResetEvent(bool initial_state) {\n  HANDLE handle =\n      CreateEvent(nullptr, FALSE, initial_state ? TRUE : FALSE, nullptr);\n  if (handle) {\n    return std::make_unique<Win32Event>(handle);\n  } else {\n    LOG_LASTERROR();\n    return nullptr;\n  }\n}\n\nclass Win32Semaphore : public Win32Handle<Semaphore> {\n public:\n  explicit Win32Semaphore(HANDLE handle) : Win32Handle(handle) {}\n  ~Win32Semaphore() override = default;\n  bool Release(int release_count, int* out_previous_count) override {\n    return ReleaseSemaphore(handle_, release_count,\n                            reinterpret_cast<LPLONG>(out_previous_count))\n               ? true\n               : false;\n  }\n};\n\nstd::unique_ptr<Semaphore> Semaphore::Create(int initial_count,\n                                             int maximum_count) {\n  HANDLE handle =\n      CreateSemaphore(nullptr, initial_count, maximum_count, nullptr);\n  if (handle) {\n    return std::make_unique<Win32Semaphore>(handle);\n  } else {\n    LOG_LASTERROR();\n    return nullptr;\n  }\n}\n\nclass Win32Mutant : public Win32Handle<Mutant> {\n public:\n  explicit Win32Mutant(HANDLE handle) : Win32Handle(handle) {}\n  ~Win32Mutant() = default;\n  bool Release() override { return ReleaseMutex(handle_) ? true : false; }\n};\n\nstd::unique_ptr<Mutant> Mutant::Create(bool initial_owner) {\n  HANDLE handle = CreateMutex(nullptr, initial_owner ? TRUE : FALSE, nullptr);\n  if (handle) {\n    return std::make_unique<Win32Mutant>(handle);\n  } else {\n    LOG_LASTERROR();\n    return nullptr;\n  }\n}\n\nclass Win32Timer : public Win32Handle<Timer> {\n  using WClock_ = Timer::WClock_;\n  using GClock_ = Timer::GClock_;\n\n public:\n  explicit Win32Timer(HANDLE handle) : Win32Handle(handle) {}\n  ~Win32Timer() = default;\n\n  bool SetOnceAfter(xe::chrono::hundrednanoseconds rel_time,\n                    std::function<void()> opt_callback) override {\n    return SetOnceAt(WClock_::now() + rel_time, std::move(opt_callback));\n  }\n  bool SetOnceAt(GClock_::time_point due_time,\n                 std::function<void()> opt_callback) override {\n    return SetOnceAt(date::clock_cast<WClock_>(due_time),\n                     std::move(opt_callback));\n  }\n  bool SetOnceAt(WClock_::time_point due_time,\n                 std::function<void()> opt_callback) override {\n    std::lock_guard<std::mutex> lock(mutex_);\n    callback_ = std::move(opt_callback);\n    LARGE_INTEGER due_time_li;\n    due_time_li.QuadPart = WClock_::to_file_time(due_time);\n    auto completion_routine =\n        callback_ ? reinterpret_cast<PTIMERAPCROUTINE>(CompletionRoutine)\n                  : NULL;\n    return SetWaitableTimer(handle_, &due_time_li, 0, completion_routine, this,\n                            FALSE)\n               ? true\n               : false;\n  }\n\n  bool SetRepeatingAfter(\n      xe::chrono::hundrednanoseconds rel_time, std::chrono::milliseconds period,\n      std::function<void()> opt_callback = nullptr) override {\n    return SetRepeatingAt(WClock_::now() + rel_time, period,\n                          std::move(opt_callback));\n  }\n  bool SetRepeatingAt(GClock_::time_point due_time,\n                      std::chrono::milliseconds period,\n                      std::function<void()> opt_callback = nullptr) {\n    return SetRepeatingAt(date::clock_cast<WClock_>(due_time), period,\n                          std::move(opt_callback));\n  }\n  bool SetRepeatingAt(WClock_::time_point due_time,\n                      std::chrono::milliseconds period,\n                      std::function<void()> opt_callback) override {\n    std::lock_guard<std::mutex> lock(mutex_);\n    callback_ = std::move(opt_callback);\n    LARGE_INTEGER due_time_li;\n    due_time_li.QuadPart = WClock_::to_file_time(due_time);\n    auto completion_routine =\n        callback_ ? reinterpret_cast<PTIMERAPCROUTINE>(CompletionRoutine)\n                  : NULL;\n    return SetWaitableTimer(handle_, &due_time_li, int32_t(period.count()),\n                            completion_routine, this, FALSE)\n               ? true\n               : false;\n  }\n\n  bool Cancel() override {\n    // Reset the callback immediately so that any completions don't call it.\n    std::lock_guard<std::mutex> lock(mutex_);\n    callback_ = nullptr;\n    return CancelWaitableTimer(handle_) ? true : false;\n  }\n\n private:\n  static void CompletionRoutine(Win32Timer* timer, DWORD timer_low,\n                                DWORD timer_high) {\n    // As the callback may reset the timer, store local.\n    std::function<void()> callback;\n    {\n      std::lock_guard<std::mutex> lock(timer->mutex_);\n      callback = timer->callback_;\n    }\n    callback();\n  }\n\n  std::mutex mutex_;\n  std::function<void()> callback_;\n};\n\nstd::unique_ptr<Timer> Timer::CreateManualResetTimer() {\n  HANDLE handle = CreateWaitableTimer(NULL, TRUE, NULL);\n  if (handle) {\n    return std::make_unique<Win32Timer>(handle);\n  } else {\n    LOG_LASTERROR();\n    return nullptr;\n  }\n}\n\nstd::unique_ptr<Timer> Timer::CreateSynchronizationTimer() {\n  HANDLE handle = CreateWaitableTimer(NULL, FALSE, NULL);\n  if (handle) {\n    return std::make_unique<Win32Timer>(handle);\n  } else {\n    LOG_LASTERROR();\n    return nullptr;\n  }\n}\n\nclass Win32Thread : public Win32Handle<Thread> {\n public:\n  explicit Win32Thread(HANDLE handle) : Win32Handle(handle) {}\n  ~Win32Thread() = default;\n\n  void set_name(std::string name) override {\n    xe::threading::set_name(handle_, name);\n    Thread::set_name(name);\n  }\n\n  int32_t priority() override { return GetThreadPriority(handle_); }\n  uint32_t system_id() const override { return GetThreadId(handle_); }\n\n  void set_priority(int32_t new_priority) override {\n    SetThreadPriority(handle_, new_priority);\n  }\n\n  uint64_t affinity_mask() override {\n    uint64_t value = 0;\n    SetThreadAffinityMask(handle_, reinterpret_cast<DWORD_PTR>(&value));\n    return value;\n  }\n\n  void set_affinity_mask(uint64_t new_affinity_mask) override {\n    SetThreadAffinityMask(handle_, new_affinity_mask);\n  }\n\n  struct ApcData {\n    std::function<void()> callback;\n  };\n  static void NTAPI DispatchApc(ULONG_PTR parameter) {\n    auto apc_data = reinterpret_cast<ApcData*>(parameter);\n    apc_data->callback();\n    delete apc_data;\n  }\n\n  void QueueUserCallback(std::function<void()> callback) override {\n    auto apc_data = new ApcData({std::move(callback)});\n    QueueUserAPC(DispatchApc, handle_, reinterpret_cast<ULONG_PTR>(apc_data));\n  }\n\n  bool Resume(uint32_t* out_previous_suspend_count = nullptr) override {\n    if (out_previous_suspend_count) {\n      *out_previous_suspend_count = 0;\n    }\n    DWORD result = ResumeThread(handle_);\n    if (result == UINT_MAX) {\n      return false;\n    }\n    if (out_previous_suspend_count) {\n      *out_previous_suspend_count = result;\n    }\n    return true;\n  }\n\n  bool Suspend(uint32_t* out_previous_suspend_count = nullptr) override {\n    if (out_previous_suspend_count) {\n      *out_previous_suspend_count = 0;\n    }\n    DWORD result = SuspendThread(handle_);\n    if (result == UINT_MAX) {\n      return false;\n    }\n    if (out_previous_suspend_count) {\n      *out_previous_suspend_count = result;\n    }\n    return true;\n  }\n\n  void Terminate(int exit_code) override {\n    TerminateThread(handle_, exit_code);\n  }\n\n private:\n  void AssertCallingThread() {\n    assert_true(GetCurrentThreadId() == GetThreadId(handle_));\n  }\n};\n\nthread_local std::unique_ptr<Win32Thread> current_thread_ = nullptr;\n\nstruct ThreadStartData {\n  std::function<void()> start_routine;\n};\nDWORD WINAPI ThreadStartRoutine(LPVOID parameter) {\n  current_thread_ = std::make_unique<Win32Thread>(::GetCurrentThread());\n\n  auto start_data = reinterpret_cast<ThreadStartData*>(parameter);\n  start_data->start_routine();\n  delete start_data;\n  return 0;\n}\n\nstd::unique_ptr<Thread> Thread::Create(CreationParameters params,\n                                       std::function<void()> start_routine) {\n  auto start_data = new ThreadStartData({std::move(start_routine)});\n  HANDLE handle =\n      CreateThread(NULL, params.stack_size, ThreadStartRoutine, start_data,\n                   params.create_suspended ? CREATE_SUSPENDED : 0, NULL);\n  if (handle) {\n    return std::make_unique<Win32Thread>(handle);\n  } else {\n    LOG_LASTERROR();\n    delete start_data;\n    return nullptr;\n  }\n}\n\nThread* Thread::GetCurrentThread() {\n  if (current_thread_) {\n    return current_thread_.get();\n  }\n\n  HANDLE handle = ::GetCurrentThread();\n  if (handle == INVALID_HANDLE_VALUE) {\n    return nullptr;\n  }\n\n  current_thread_ = std::make_unique<Win32Thread>(handle);\n  return current_thread_.get();\n}\n\nvoid Thread::Exit(int exit_code) { ExitThread(exit_code); }\n\n}  // namespace threading\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/base/type_pool.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_BASE_TYPE_POOL_H_\n#define XENIA_BASE_TYPE_POOL_H_\n\n#include <mutex>\n#include <vector>\n\nnamespace xe {\n\ntemplate <class T, typename A>\nclass TypePool {\n public:\n  ~TypePool() { Reset(); }\n\n  void Reset() {\n    std::lock_guard<std::mutex> guard(lock_);\n    for (auto it = list_.begin(); it != list_.end(); ++it) {\n      T* value = *it;\n      delete value;\n    }\n    list_.clear();\n  }\n\n  T* Allocate(A arg0) {\n    T* result = 0;\n    {\n      std::lock_guard<std::mutex> guard(lock_);\n      if (list_.size()) {\n        result = list_.back();\n        list_.pop_back();\n      }\n    }\n    if (!result) {\n      result = new T(arg0);\n    }\n    return result;\n  }\n\n  void Release(T* value) {\n    std::lock_guard<std::mutex> guard(lock_);\n    list_.push_back(value);\n  }\n\n private:\n  std::mutex lock_;\n  std::vector<T*> list_;\n};\n\n}  // namespace xe\n\n#endif  // XENIA_BASE_TYPE_POOL_H_\n"
  },
  {
    "path": "src/xenia/base/utf8.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/utf8.h\"\n\n#include <algorithm>\n#include <cstdint>\n#include <locale>\n#include <numeric>\n#include <tuple>\n\n#define UTF_CPP_CPLUSPLUS 201703L\n#include \"third_party/utfcpp/source/utf8.h\"\n\nnamespace utfcpp = utf8;\n\nusing citer = std::string_view::const_iterator;\nusing utf8_citer = utfcpp::iterator<std::string_view::const_iterator>;\n\nnamespace xe::utf8 {\n\nstd::string to_string(char32_t c) {\n  std::string result;\n  utfcpp::append(c, result);\n  return result;\n}\n\nuint32_t lower_ascii(const uint32_t c) {\n  return c >= 'A' && c <= 'Z' ? c + 32 : c;\n}\n\nuint32_t upper_ascii(const uint32_t c) {\n  return c >= 'A' && c <= 'Z' ? c + 32 : c;\n}\n\nbool equal_ascii_case(const uint32_t l, const uint32_t r) {\n  return l == r || lower_ascii(l) == lower_ascii(r);\n}\n\nstd::pair<utf8_citer, utf8_citer> make_citer(const std::string_view view) {\n  return {utf8_citer(view.cbegin(), view.cbegin(), view.cend()),\n          utf8_citer(view.cend(), view.cbegin(), view.cend())};\n}\n\nstd::pair<utf8_citer, utf8_citer> make_citer(const utf8_citer begin,\n                                             const utf8_citer end) {\n  return {utf8_citer(begin.base(), begin.base(), end.base()),\n          utf8_citer(end.base(), begin.base(), end.base())};\n}\n\nsize_t byte_length(utf8_citer begin, utf8_citer end) {\n  return size_t(std::distance(begin.base(), end.base()));\n}\n\nsize_t count(const std::string_view view) {\n  return size_t(utfcpp::distance(view.cbegin(), view.cend()));\n}\n\nstd::string lower_ascii(const std::string_view view) {\n  auto [begin, end] = make_citer(view);\n  std::string result;\n  for (auto it = begin; it != end; ++it) {\n    utfcpp::append(char32_t(lower_ascii(*it)), result);\n  }\n  return result;\n}\n\nstd::string upper_ascii(const std::string_view view) {\n  auto [begin, end] = make_citer(view);\n  std::string result;\n  for (auto it = begin; it != end; ++it) {\n    utfcpp::append(char32_t(upper_ascii(*it)), result);\n  }\n  return result;\n}\n\ntemplate <bool LOWER>\ninline size_t hash_fnv1a(const std::string_view view) {\n  const size_t offset_basis = 0xCBF29CE484222325ull;\n  const size_t prime = 0x00000100000001B3ull;\n  auto work = [&prime](size_t hash, uint8_t byte_of_data) {\n    hash ^= byte_of_data;\n    hash *= prime;\n    return hash;\n  };\n  auto hash = offset_basis;\n  auto [begin, end] = make_citer(view);\n  for (auto it = begin; it != end; ++it) {\n    uint32_t c;\n    if constexpr (LOWER) {\n      c = lower_ascii(*it);\n    } else {\n      c = *it;\n    }\n    hash = work(hash, uint8_t((c >> 0) & 0xFF));\n    hash = work(hash, uint8_t((c >> 8) & 0xFF));\n    hash = work(hash, uint8_t((c >> 16) & 0xFF));\n    hash = work(hash, uint8_t((c >> 24) & 0xFF));\n  }\n  return hash;\n}\n\nsize_t hash_fnv1a(const std::string_view view) {\n  return hash_fnv1a<false>(view);\n}\n\nsize_t hash_fnv1a_case(const std::string_view view) {\n  return hash_fnv1a<true>(view);\n}\n\n// TODO(gibbed): this is a separate inline function instead of inline within\n// split due to a Clang bug: reference to local binding 'needle_begin' declared\n// in enclosing function 'split'.\ninline utf8_citer find_needle(utf8_citer haystack_it, utf8_citer haystack_end,\n                              utf8_citer needle_begin, utf8_citer needle_end) {\n  return std::find_if(haystack_it, haystack_end, [&](const auto& c) {\n    for (auto needle = needle_begin; needle != needle_end; ++needle) {\n      if (c == *needle) {\n        return true;\n      }\n    }\n    return false;\n  });\n}\n\ninline utf8_citer find_needle_case(utf8_citer haystack_it,\n                                   utf8_citer haystack_end,\n                                   utf8_citer needle_begin,\n                                   utf8_citer needle_end) {\n  return std::find_if(haystack_it, haystack_end, [&](const auto& c) {\n    for (auto needle = needle_begin; needle != needle_end; ++needle) {\n      if (equal_ascii_case(c, *needle)) {\n        return true;\n      }\n    }\n    return false;\n  });\n}\n\nstd::vector<std::string_view> split(const std::string_view haystack,\n                                    const std::string_view needles,\n                                    bool remove_empty) {\n  std::vector<std::string_view> result;\n\n  auto [haystack_begin, haystack_end] = make_citer(haystack);\n  auto [needle_begin, needle_end] = make_citer(needles);\n\n  auto it = haystack_begin;\n  auto last = it;\n  for (;;) {\n    it = find_needle(it, haystack_end, needle_begin, needle_end);\n    if (it == haystack_end) {\n      break;\n    }\n\n    if (it != last) {\n      auto offset = byte_length(haystack_begin, last);\n      auto length = byte_length(haystack_begin, it) - offset;\n      result.push_back(haystack.substr(offset, length));\n    } else if (!remove_empty) {\n      result.push_back(\"\");\n    }\n\n    ++it;\n    last = it;\n  }\n\n  if (last != haystack_end) {\n    auto offset = byte_length(haystack_begin, last);\n    result.push_back(haystack.substr(offset));\n  }\n\n  return result;\n}\n\nbool equal_z(const std::string_view left, const std::string_view right) {\n  if (!left.size()) {\n    return !right.size();\n  } else if (!right.size()) {\n    return false;\n  }\n  auto [left_begin, left_end] = make_citer(left);\n  auto [right_begin, right_end] = make_citer(right);\n  auto left_it = left_begin;\n  auto right_it = right_begin;\n  for (; left_it != left_end && *left_it != 0 && right_it != right_end &&\n         *right_it != 0;\n       ++left_it, ++right_it) {\n    if (*left_it != *right_it) {\n      return false;\n    }\n  }\n  return (left_it == left_end || *left_it == 0) &&\n         (right_it == right_end || *right_it == 0);\n}\n\nbool equal_case(const std::string_view left, const std::string_view right) {\n  if (!left.size()) {\n    return !right.size();\n  } else if (!right.size()) {\n    return false;\n  }\n  auto [left_begin, left_end] = make_citer(left);\n  auto [right_begin, right_end] = make_citer(right);\n  return std::equal(left_begin, left_end, right_begin, right_end,\n                    equal_ascii_case);\n}\n\nbool equal_case_z(const std::string_view left, const std::string_view right) {\n  if (!left.size()) {\n    return !right.size();\n  } else if (!right.size()) {\n    return false;\n  }\n  auto [left_begin, left_end] = make_citer(left);\n  auto [right_begin, right_end] = make_citer(right);\n  auto left_it = left_begin;\n  auto right_it = right_begin;\n  for (; left_it != left_end && *left_it != 0 && right_it != right_end &&\n         *right_it != 0;\n       ++left_it, ++right_it) {\n    if (!equal_ascii_case(*left_it, *right_it)) {\n      return false;\n    }\n  }\n  return (left_it == left_end || *left_it == 0) &&\n         (right_it == right_end || *right_it == 0);\n}\n\nstd::string_view::size_type find_any_of(const std::string_view haystack,\n                                        const std::string_view needles) {\n  if (needles.empty()) {\n    return std::string_view::size_type(0);\n  } else if (haystack.empty()) {\n    return std::string_view::npos;\n  }\n\n  auto [haystack_begin, haystack_end] = make_citer(haystack);\n  auto [needle_begin, needle_end] = make_citer(needles);\n\n  auto it = find_needle(haystack_begin, haystack_end, needle_begin, needle_end);\n  if (it == haystack_end) {\n    return std::string_view::npos;\n  }\n\n  return std::string_view::size_type(byte_length(haystack_begin, it));\n}\n\nstd::string_view::size_type find_any_of_case(const std::string_view haystack,\n                                             const std::string_view needles) {\n  if (needles.empty()) {\n    return std::string_view::size_type(0);\n  } else if (haystack.empty()) {\n    return std::string_view::npos;\n  }\n\n  auto [haystack_begin, haystack_end] = make_citer(haystack);\n  auto [needle_begin, needle_end] = make_citer(needles);\n\n  auto it =\n      find_needle_case(haystack_begin, haystack_end, needle_begin, needle_end);\n  if (it == haystack_end) {\n    return std::string_view::npos;\n  }\n\n  return std::string_view::size_type(byte_length(haystack_begin, it));\n}\n\nstd::string_view::size_type find_first_of(const std::string_view haystack,\n                                          const std::string_view needle) {\n  if (needle.empty()) {\n    return std::string_view::size_type(0);\n  } else if (haystack.empty()) {\n    return std::string_view::npos;\n  }\n\n  auto [haystack_begin, haystack_end] = make_citer(haystack);\n  auto [needle_begin, needle_end] = make_citer(needle);\n  auto needle_count = count(needle);\n\n  auto it = haystack_begin;\n  for (; it != haystack_end; ++it) {\n    it = std::find(it, haystack_end, *needle_begin);\n    if (it == haystack_end) {\n      return std::string_view::npos;\n    }\n\n    auto end = it;\n    for (size_t i = 0; i < needle_count; ++i) {\n      if (end == haystack_end) {\n        // not enough room in target for search\n        return std::string_view::npos;\n      }\n      ++end;\n    }\n\n    auto [sub_start, sub_end] = make_citer(it, end);\n    if (std::equal(needle_begin, needle_end, sub_start, sub_end)) {\n      return std::string_view::size_type(byte_length(haystack_begin, it));\n    }\n  }\n\n  return std::string_view::npos;\n}\n\nstd::string_view::size_type find_first_of_case(const std::string_view haystack,\n                                               const std::string_view needle) {\n  if (needle.empty()) {\n    return std::string_view::size_type(0);\n  } else if (haystack.empty()) {\n    return std::string_view::npos;\n  }\n\n  auto [haystack_begin, haystack_end] = make_citer(haystack);\n  auto [needle_begin, needle_end] = make_citer(needle);\n  auto needle_count = count(needle);\n  auto nc = *needle_begin;\n\n  auto it = haystack_begin;\n  for (; it != haystack_end; ++it) {\n    it = std::find_if(it, haystack_end, [&nc](const uint32_t& c) {\n      return equal_ascii_case(nc, c);\n    });\n    if (it == haystack_end) {\n      return std::string_view::npos;\n    }\n\n    auto end = it;\n    for (size_t i = 0; i < needle_count; ++i) {\n      if (end == haystack_end) {\n        // not enough room in target for search\n        return std::string_view::npos;\n      }\n      ++end;\n    }\n\n    auto [sub_start, sub_end] = make_citer(it, end);\n    if (std::equal(needle_begin, needle_end, sub_start, sub_end,\n                   equal_ascii_case)) {\n      return std::string_view::size_type(byte_length(haystack_begin, it));\n    }\n  }\n\n  return std::string_view::npos;\n}\n\nbool starts_with(const std::string_view haystack, char32_t needle) {\n  if (haystack.empty()) {\n    return false;\n  }\n  auto [it, end] = make_citer(haystack);\n  return *it == uint32_t(needle);\n}\n\nbool starts_with(const std::string_view haystack,\n                 const std::string_view needle) {\n  if (needle.empty()) {\n    return true;\n  } else if (haystack.empty()) {\n    return false;\n  }\n\n  auto [haystack_begin, haystack_end] = make_citer(haystack);\n  auto [needle_begin, needle_end] = make_citer(needle);\n  auto needle_count = count(needle);\n\n  auto it = haystack_begin;\n  auto end = it;\n  for (size_t i = 0; i < needle_count; ++i) {\n    if (end == haystack_end) {\n      // not enough room in target for search\n      return false;\n    }\n    ++end;\n  }\n\n  auto [sub_start, sub_end] = make_citer(it, end);\n  return std::equal(needle_begin, needle_end, sub_start, sub_end);\n}\n\nbool starts_with_case(const std::string_view haystack,\n                      const std::string_view needle) {\n  if (needle.empty()) {\n    return true;\n  } else if (haystack.empty()) {\n    return false;\n  }\n\n  auto [haystack_begin, haystack_end] = make_citer(haystack);\n  auto [needle_begin, needle_end] = make_citer(needle);\n  auto needle_count = count(needle);\n\n  auto it = haystack_begin;\n  auto end = it;\n  for (size_t i = 0; i < needle_count; ++i) {\n    if (end == haystack_end) {\n      // not enough room in target for search\n      return false;\n    }\n    ++end;\n  }\n\n  auto [sub_start, sub_end] = make_citer(it, end);\n  return std::equal(needle_begin, needle_end, sub_start, sub_end,\n                    equal_ascii_case);\n}\n\nbool ends_with(const std::string_view haystack, const std::string_view needle) {\n  if (needle.empty()) {\n    return true;\n  } else if (haystack.empty()) {\n    return false;\n  }\n\n  auto [haystack_begin, haystack_end] = make_citer(haystack);\n  auto [needle_begin, needle_end] = make_citer(needle);\n  auto needle_count = count(needle);\n\n  auto it = haystack_end;\n  auto end = it;\n  --it;\n\n  for (size_t i = 1; i < needle_count; ++i) {\n    if (it == haystack_begin) {\n      // not enough room in target for search\n      return false;\n    }\n    --it;\n  }\n\n  auto [sub_start, sub_end] = make_citer(it, end);\n  return std::equal(needle_begin, needle_end, sub_start, sub_end);\n}\n\nbool ends_with_case(const std::string_view haystack,\n                    const std::string_view needle) {\n  if (needle.empty()) {\n    return true;\n  } else if (haystack.empty()) {\n    return false;\n  }\n\n  auto [haystack_begin, haystack_end] = make_citer(haystack);\n  auto [needle_begin, needle_end] = make_citer(needle);\n  auto needle_count = count(needle);\n\n  auto it = haystack_end;\n  auto end = it;\n  --it;\n\n  for (size_t i = 0; i < needle_count; ++i) {\n    if (it == haystack_begin) {\n      // not enough room in target for search\n      return false;\n    }\n    --it;\n  }\n\n  auto [sub_start, sub_end] = make_citer(it, end);\n  return std::equal(needle_begin, needle_end, sub_start, sub_end,\n                    equal_ascii_case);\n}\n\nstd::vector<std::string_view> split_path(const std::string_view path) {\n  return split(path, u8\"\\\\/\", true);\n}\n\nstd::string join_paths(const std::string_view left_path,\n                       const std::string_view right_path, char32_t separator) {\n  if (!left_path.length()) {\n    return std::string(right_path);\n  } else if (!right_path.length()) {\n    return std::string(left_path);\n  }\n\n  utf8_citer it;\n  std::tie(std::ignore, it) = make_citer(left_path);\n  --it;\n\n  std::string result = std::string(left_path);\n  if (*it != static_cast<uint32_t>(separator)) {\n    utfcpp::append(separator, result);\n  }\n  return result + std::string(right_path);\n}\n\nstd::string join_paths(const std::vector<std::string>& paths,\n                       char32_t separator) {\n  std::string result;\n  auto it = paths.cbegin();\n  if (it != paths.cend()) {\n    result = *it++;\n    for (; it != paths.cend(); ++it) {\n      result = join_paths(result, *it, separator);\n    }\n  }\n  return result;\n}\n\nstd::string join_paths(const std::vector<std::string_view>& paths,\n                       char32_t separator) {\n  std::string result;\n  auto it = paths.cbegin();\n  if (it != paths.cend()) {\n    result = *it++;\n    for (; it != paths.cend(); ++it) {\n      result = join_paths(result, *it, separator);\n    }\n  }\n  return result;\n}\n\nstd::string fix_path_separators(const std::string_view path,\n                                char32_t new_separator) {\n  if (path.empty()) {\n    return std::string();\n  }\n\n  // Swap all separators to new_sep.\n  const char32_t old_separator = new_separator == U'\\\\' ? U'/' : U'\\\\';\n\n  auto [path_begin, path_end] = make_citer(path);\n\n  std::string result;\n  auto it = path_begin;\n  auto last = it;\n\n  auto is_separator = [old_separator, new_separator](char32_t c) {\n    return c == uint32_t(old_separator) || c == uint32_t(new_separator);\n  };\n\n  // Begins with a separator\n  if (is_separator(*it)) {\n    utfcpp::append(new_separator, result);\n    ++it;\n    last = it;\n  }\n\n  for (;;) {\n    it = std::find_if(it, path_end, is_separator);\n    if (it == path_end) {\n      break;\n    }\n\n    if (it != last) {\n      auto offset = byte_length(path_begin, last);\n      auto length = byte_length(path_begin, it) - offset;\n      result += path.substr(offset, length);\n      utfcpp::append(new_separator, result);\n    }\n\n    ++it;\n    last = it;\n  }\n\n  if (last == path_begin) {\n    return std::string(path);\n  }\n\n  if (last != path_end) {\n    auto offset = byte_length(path_begin, last);\n    result += path.substr(offset);\n  }\n\n  return result;\n}\n\nstd::string find_name_from_path(const std::string_view path,\n                                char32_t separator) {\n  if (path.empty()) {\n    return std::string();\n  }\n\n  auto [begin, end] = make_citer(path);\n\n  auto it = end;\n  --it;\n\n  // skip trailing separators at the end of the path\n  while (*it == uint32_t(separator)) {\n    if (it == begin) {\n      // path is all separators, name is empty\n      return std::string();\n    }\n    --it;\n  }\n\n  // update end so it is before any trailing separators\n  end = std::next(it);\n\n  // skip non-separators\n  while (*it != uint32_t(separator)) {\n    if (it == begin) {\n      break;\n    }\n    --it;\n  }\n\n  // if the iterator is on a separator, advance\n  if (*it == uint32_t(separator)) {\n    ++it;\n  }\n\n  auto offset = byte_length(begin, it);\n  auto length = byte_length(it, end);\n  return std::string(path.substr(offset, length));\n}\n\nstd::string find_base_name_from_path(const std::string_view path,\n                                     char32_t separator) {\n  auto name = find_name_from_path(path, separator);\n  if (!name.length()) {\n    return std::string();\n  }\n\n  auto [begin, end] = make_citer(name);\n\n  auto it = end;\n  --it;\n\n  while (it != begin) {\n    if (*it == uint32_t('.')) {\n      break;\n    }\n    --it;\n  }\n\n  if (it == begin) {\n    return name;\n  }\n\n  auto length = byte_length(it, end);\n  auto offset = name.length() - length;\n  return std::string(name.substr(0, offset));\n}\n\nstd::string find_base_path(const std::string_view path, char32_t separator) {\n  if (path.empty()) {\n    return std::string();\n  }\n\n  auto [begin, end] = make_citer(path);\n\n  auto it = end;\n  --it;\n\n  // skip trailing separators at the end of the path\n  while (*it == uint32_t(separator)) {\n    if (it == begin) {\n      return std::string();\n    }\n    --it;\n  }\n\n  // skip non-separators\n  while (*it != uint32_t(separator)) {\n    if (it == begin) {\n      // there are no separators, base path is empty\n      return std::string();\n    }\n    --it;\n  }\n\n  // skip trailing separators at the end of the base path\n  while (*it == uint32_t(separator)) {\n    if (it == begin) {\n      // base path is all separators, base path is empty\n      return std::string();\n    }\n    --it;\n  }\n\n  auto length = byte_length(begin, std::next(it));\n  return std::string(path.substr(0, length));\n}\n\nstd::string canonicalize_path(const std::string_view path, char32_t separator) {\n  if (path.empty()) {\n    return std::string();\n  }\n\n  auto is_rooted = starts_with(path, separator);\n\n  auto parts = split_path(path);\n  for (auto it = parts.begin(); it != parts.end();) {\n    const auto& part = *it;\n    if (part == \".\") {\n      // Potential marker for current directory.\n      it = parts.erase(it);\n    } else if (part == \"..\") {\n      // Ensure we don't override the device name.\n      if (it != parts.begin()) {\n        auto prev = std::prev(it);\n        if (!ends_with(*prev, \":\")) {\n          it = parts.erase(prev);\n        }\n      }\n      it = parts.erase(it);\n    } else {\n      ++it;\n    }\n  }\n\n  return !is_rooted ? join_paths(parts, separator)\n                    : to_string(separator) + join_paths(parts, separator);\n}\n\n}  // namespace xe::utf8\n"
  },
  {
    "path": "src/xenia/base/utf8.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_BASE_UTF8_H_\n#define XENIA_BASE_UTF8_H_\n\n#include <string>\n#include <vector>\n\n#include \"xenia/base/platform.h\"\n\nnamespace xe::utf8 {\n\nsize_t count(const std::string_view view);\n\nstd::string lower_ascii(const std::string_view view);\nstd::string upper_ascii(const std::string_view view);\n\nsize_t hash_fnv1a(const std::string_view view);\nsize_t hash_fnv1a_case(const std::string_view view);\n\n// Splits the given haystack on any delimiters (needles) and returns all parts.\nstd::vector<std::string_view> split(const std::string_view haystack,\n                                    const std::string_view needles,\n                                    bool remove_empty = false);\n\nbool equal_z(const std::string_view left, const std::string_view right);\n\nbool equal_case(const std::string_view left, const std::string_view right);\n\nbool equal_case_z(const std::string_view left, const std::string_view right);\n\nstd::string_view::size_type find_any_of(const std::string_view haystack,\n                                        const std::string_view needles);\n\nstd::string_view::size_type find_any_of_case(const std::string_view haystack,\n                                             const std::string_view needles);\n\nstd::string_view::size_type find_first_of(const std::string_view haystack,\n                                          const std::string_view needle);\n\n// find_first_of string, case insensitive.\nstd::string_view::size_type find_first_of_case(const std::string_view haystack,\n                                               const std::string_view needle);\n\nbool starts_with(const std::string_view haystack,\n                 const std::string_view needle);\n\nbool starts_with_case(const std::string_view haystack,\n                      const std::string_view needle);\n\nbool ends_with(const std::string_view haystack, const std::string_view needle);\n\nbool ends_with_case(const std::string_view haystack,\n                    const std::string_view needle);\n\n// Splits the given path on any valid path separator and returns all parts.\nstd::vector<std::string_view> split_path(const std::string_view path);\n\n// Joins two path segments with the given separator.\nstd::string join_paths(const std::string_view left_path,\n                       const std::string_view right_path,\n                       char32_t separator = kPathSeparator);\n\nstd::string join_paths(const std::vector<std::string>& paths,\n                       char32_t separator = kPathSeparator);\n\nstd::string join_paths(const std::vector<std::string_view>& paths,\n                       char32_t separator = kPathSeparator);\n\ninline std::string join_paths(\n    std::initializer_list<const std::string_view> paths,\n    char32_t separator = kPathSeparator) {\n  std::string result;\n  for (auto path : paths) {\n    result = join_paths(result, path, separator);\n  }\n  return result;\n}\n\ninline std::string join_guest_paths(const std::string_view left_path,\n                                    const std::string_view right_path) {\n  return join_paths(left_path, right_path, kGuestPathSeparator);\n}\n\ninline std::string join_guest_paths(const std::vector<std::string>& paths) {\n  return join_paths(paths, kGuestPathSeparator);\n}\n\ninline std::string join_guest_paths(\n    const std::vector<std::string_view>& paths) {\n  return join_paths(paths, kGuestPathSeparator);\n}\n\ninline std::string join_guest_paths(\n    std::initializer_list<const std::string_view> paths) {\n  return join_paths(paths, kGuestPathSeparator);\n}\n\n// Replaces all path separators with the given value and removes redundant\n// separators.\nstd::string fix_path_separators(const std::string_view path,\n                                char32_t new_separator = kPathSeparator);\n\ninline std::string fix_guest_path_separators(const std::string_view path) {\n  return fix_path_separators(path, kGuestPathSeparator);\n}\n\n// Find the top directory name or filename from a path.\nstd::string find_name_from_path(const std::string_view path,\n                                char32_t separator = kPathSeparator);\n\ninline std::string find_name_from_guest_path(const std::string_view path) {\n  return find_name_from_path(path, kGuestPathSeparator);\n}\n\nstd::string find_base_name_from_path(const std::string_view path,\n                                     char32_t separator = kPathSeparator);\n\ninline std::string find_base_name_from_guest_path(const std::string_view path) {\n  return find_base_name_from_path(path, kGuestPathSeparator);\n}\n\n// Get parent path of the given directory or filename.\nstd::string find_base_path(const std::string_view path,\n                           char32_t separator = kPathSeparator);\n\ninline std::string find_base_guest_path(const std::string_view path) {\n  return find_base_path(path, kGuestPathSeparator);\n}\n\n// Canonicalizes a path, removing ..'s.\nstd::string canonicalize_path(const std::string_view path,\n                              char32_t separator = kPathSeparator);\n\ninline std::string canonicalize_guest_path(const std::string_view path) {\n  return canonicalize_path(path, kGuestPathSeparator);\n}\n\n}  // namespace xe::utf8\n\n#endif  // XENIA_BASE_UTF8_H_\n"
  },
  {
    "path": "src/xenia/base/vec128.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include <cstddef>\n#include <ostream>\n#include <string>\n\n#include \"third_party/fmt/include/fmt/format.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/platform.h\"\n#include \"xenia/base/string_util.h\"\n#include \"xenia/base/vec128.h\"\n\nnamespace xe {\n\nstd::string to_string(const vec128_t& value) {\n  return fmt::format(\"({}, {}, {}, {})\", value.x, value.y, value.z, value.w);\n}\n\nstd::ostream& operator<<(std::ostream& os, const vec128_t& value) {\n  os << string_util::to_hex_string(value);\n  return os;\n}\n\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/base/vec128.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_BASE_VEC128_H_\n#define XENIA_BASE_VEC128_H_\n\n#include <cstddef>\n#include <string>\n\n#include \"xenia/base/math.h\"\n#include \"xenia/base/platform.h\"\n\nnamespace xe {\n\n// The first rule of vector programming is to only rely on exact positions\n// when absolutely required - prefer dumb loops to exact offsets.\n// Vectors in memory are laid out as in AVX registers on little endian\n// machines. Note that little endian is dumb, so the byte at index 0 in\n// the vector is is really byte 15 (or the high byte of short 7 or int 3).\n// Because of this, all byte access should be via the accessors instead of\n// the direct array.\n\n// Altivec big endian layout:         AVX little endian layout:\n// +---------+---------+---------+    +---------+---------+---------+\n// | int32 0 | int16 0 | int8  0 |    | int32 3 | int16 7 | int8 15 |\n// |         |         +---------+    |         |         +---------+\n// |         |         | int8  1 |    |         |         | int8 14 |\n// |         +---------+---------+    |         +---------+---------+\n// |         | int16 1 | int8  2 |    |         | int16 6 | int8 13 |\n// |         |         +---------+    |         |         +---------+\n// |         |         | int8  3 |    |         |         | int8 12 |\n// +---------+---------+---------+    +---------+---------+---------+\n// | int32 1 | int16 2 | int8  4 |    | int32 2 | int16 5 | int8 11 |\n// |         |         +---------+    |         |         +---------+\n// |         |         | int8  5 |    |         |         | int8 10 |\n// |         +---------+---------+    |         +---------+---------+\n// |         | int16 3 | int8  6 |    |         | int16 4 | int8  9 |\n// |         |         +---------+    |         |         +---------+\n// |         |         | int8  7 |    |         |         | int8  8 |\n// +---------+---------+---------+    +---------+---------+---------+\n// | int32 2 | int16 4 | int8  8 |    | int32 1 | int16 3 | int8  7 |\n// |         |         +---------+    |         |         +---------+\n// |         |         | int8  9 |    |         |         | int8  6 |\n// |         +---------+---------+    |         +---------+---------+\n// |         | int16 5 | int8 10 |    |         | int16 2 | int8  5 |\n// |         |         +---------+    |         |         +---------+\n// |         |         | int8 11 |    |         |         | int8  4 |\n// +---------+---------+---------+    +---------+---------+---------+\n// | int32 3 | int16 6 | int8 12 |    | int32 0 | int16 1 | int8  3 |\n// |         |         +---------+    |         |         +---------+\n// |         |         | int8 13 |    |         |         | int8  2 |\n// |         +---------+---------+    |         +---------+---------+\n// |         | int16 7 | int8 14 |    |         | int16 0 | int8  1 |\n// |         |         +---------+    |         |         +---------+\n// |         |         | int8 15 |    |         |         | int8  0 |\n// +---------+---------+---------+    +---------+---------+---------+\n//\n// Logical order:\n// +-----+-----+-----+-----+          +-----+-----+-----+-----+\n// |  X  |  Y  |  Z  |  W  |          |  W  |  Z  |  Y  |  X  |\n// +-----+-----+-----+-----+          +-----+-----+-----+-----+\n//\n// Mapping indices is easy:\n// int32[i ^ 0x3]\n// int16[i ^ 0x7]\n//  int8[i ^ 0xF]\ntypedef struct alignas(16) vec128_s {\n  union {\n    struct {\n      float x;\n      float y;\n      float z;\n      float w;\n    };\n    struct {\n      int32_t ix;\n      int32_t iy;\n      int32_t iz;\n      int32_t iw;\n    };\n    struct {\n      uint32_t ux;\n      uint32_t uy;\n      uint32_t uz;\n      uint32_t uw;\n    };\n    float f32[4];\n    double f64[2];\n    int8_t i8[16];\n    uint8_t u8[16];\n    int16_t i16[8];\n    uint16_t u16[8];\n    int32_t i32[4];\n    uint32_t u32[4];\n    int64_t i64[2];\n    uint64_t u64[2];\n    struct {\n      uint64_t low;\n      uint64_t high;\n    };\n  };\n\n  bool operator==(const vec128_s& b) const {\n    return low == b.low && high == b.high;\n  }\n  bool operator!=(const vec128_s& b) const {\n    return low != b.low || high != b.high;\n  }\n  vec128_s operator^(const vec128_s& b) const {\n    vec128_s a = *this;\n    a.high ^= b.high;\n    a.low ^= b.low;\n    return a;\n  };\n  vec128_s& operator^=(const vec128_s& b) {\n    *this = *this ^ b;\n    return *this;\n  };\n  vec128_s operator&(const vec128_s& b) const {\n    vec128_s a = *this;\n    a.high &= b.high;\n    a.low &= b.low;\n    return a;\n  };\n  vec128_s& operator&=(const vec128_s& b) {\n    *this = *this & b;\n    return *this;\n  };\n  vec128_s operator|(const vec128_s& b) const {\n    vec128_s a = *this;\n    a.high |= b.high;\n    a.low |= b.low;\n    return a;\n  };\n  vec128_s& operator|=(const vec128_s& b) {\n    *this = *this | b;\n    return *this;\n  };\n} vec128_t;\n\nstatic inline vec128_t vec128i(uint32_t src) {\n  vec128_t v;\n  for (auto i = 0; i < 4; ++i) {\n    v.u32[i] = src;\n  }\n  return v;\n}\nstatic inline vec128_t vec128i(uint32_t x, uint32_t y, uint32_t z, uint32_t w) {\n  vec128_t v;\n  v.u32[0] = x;\n  v.u32[1] = y;\n  v.u32[2] = z;\n  v.u32[3] = w;\n  return v;\n}\nstatic inline vec128_t vec128q(uint64_t src) {\n  vec128_t v;\n  for (auto i = 0; i < 2; ++i) {\n    v.i64[i] = src;\n  }\n  return v;\n}\nstatic inline vec128_t vec128q(uint64_t x, uint64_t y) {\n  vec128_t v;\n  v.i64[0] = x;\n  v.i64[1] = y;\n  return v;\n}\nstatic inline vec128_t vec128d(double src) {\n  vec128_t v;\n  for (auto i = 0; i < 2; ++i) {\n    v.f64[i] = src;\n  }\n  return v;\n}\nstatic inline vec128_t vec128d(double x, double y) {\n  vec128_t v;\n  v.f64[0] = x;\n  v.f64[1] = y;\n  return v;\n}\nstatic inline vec128_t vec128f(float src) {\n  vec128_t v;\n  for (auto i = 0; i < 4; ++i) {\n    v.f32[i] = src;\n  }\n  return v;\n}\nstatic inline vec128_t vec128f(float x, float y, float z, float w) {\n  vec128_t v;\n  v.f32[0] = x;\n  v.f32[1] = y;\n  v.f32[2] = z;\n  v.f32[3] = w;\n  return v;\n}\nstatic inline vec128_t vec128s(uint16_t src) {\n  vec128_t v;\n  for (auto i = 0; i < 8; ++i) {\n    v.u16[i] = src;\n  }\n  return v;\n}\nstatic inline vec128_t vec128s(uint16_t x0, uint16_t x1, uint16_t y0,\n                               uint16_t y1, uint16_t z0, uint16_t z1,\n                               uint16_t w0, uint16_t w1) {\n  vec128_t v;\n  v.u16[0] = x1;\n  v.u16[1] = x0;\n  v.u16[2] = y1;\n  v.u16[3] = y0;\n  v.u16[4] = z1;\n  v.u16[5] = z0;\n  v.u16[6] = w1;\n  v.u16[7] = w0;\n  return v;\n}\nstatic inline vec128_t vec128b(uint8_t src) {\n  vec128_t v;\n  for (auto i = 0; i < 16; ++i) {\n    v.u8[i] = src;\n  }\n  return v;\n}\nstatic inline vec128_t vec128b(uint8_t x0, uint8_t x1, uint8_t x2, uint8_t x3,\n                               uint8_t y0, uint8_t y1, uint8_t y2, uint8_t y3,\n                               uint8_t z0, uint8_t z1, uint8_t z2, uint8_t z3,\n                               uint8_t w0, uint8_t w1, uint8_t w2, uint8_t w3) {\n  vec128_t v;\n  v.u8[0] = x3;\n  v.u8[1] = x2;\n  v.u8[2] = x1;\n  v.u8[3] = x0;\n  v.u8[4] = y3;\n  v.u8[5] = y2;\n  v.u8[6] = y1;\n  v.u8[7] = y0;\n  v.u8[8] = z3;\n  v.u8[9] = z2;\n  v.u8[10] = z1;\n  v.u8[11] = z0;\n  v.u8[12] = w3;\n  v.u8[13] = w2;\n  v.u8[14] = w1;\n  v.u8[15] = w0;\n  return v;\n}\n\n// TODO(gibbed): Figure out why clang doesn't line forward declarations of\n// inline functions.\n\nstd::string to_string(const vec128_t& value);\n\nstd::ostream& operator<<(std::ostream& os, const vec128_t& value);\n\n}  // namespace xe\n\n#endif  // XENIA_BASE_VEC128_H_\n"
  },
  {
    "path": "src/xenia/base/xxhash.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_BASE_XXHASH_H_\n#define XENIA_BASE_XXHASH_H_\n\n#define XXH_INLINE_ALL\n\n// Can't use XXH_X86DISPATCH because XXH is calculated on multiple threads,\n// while the dispatch writes the result (multiple pointers without any\n// synchronization) to XXH_g_dispatch at the first call.\n\n#include \"third_party/xxhash/xxhash.h\"\n\n#endif  // XENIA_BASE_XXHASH_H_\n"
  },
  {
    "path": "src/xenia/config.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"config.h\"\n\n#include \"third_party/cpptoml/include/cpptoml.h\"\n#include \"third_party/fmt/include/fmt/format.h\"\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/cvar.h\"\n#include \"xenia/base/filesystem.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/string.h\"\n#include \"xenia/base/string_buffer.h\"\n\nstd::shared_ptr<cpptoml::table> ParseFile(\n    const std::filesystem::path& filename) {\n  std::ifstream file(filename);\n  if (!file.is_open()) {\n    throw cpptoml::parse_exception(xe::path_to_utf8(filename) +\n                                   \" could not be opened for parsing\");\n  }\n  // since cpptoml can't parse files with a UTF-8 BOM we need to skip them\n  char bom[3];\n  file.read(bom, sizeof(bom));\n  if (file.fail() || bom[0] != '\\xEF' || bom[1] != '\\xBB' || bom[2] != '\\xBF') {\n    file.clear();\n    file.seekg(0);\n  }\n\n  cpptoml::parser p(file);\n  return p.parse();\n}\n\nCmdVar(config, \"\", \"Specifies the target config to load.\");\n\nDEFINE_uint32(\n    defaults_date, 0,\n    \"Do not modify - internal version of the default values in the config, for \"\n    \"seamless updates if default value of any option is changed.\",\n    \"Config\");\n\nnamespace config {\nstd::string config_name = \"xenia.config.toml\";\nstd::filesystem::path config_folder;\nstd::filesystem::path config_path;\nstd::string game_config_suffix = \".config.toml\";\n\nstd::shared_ptr<cpptoml::table> ParseConfig(\n    const std::filesystem::path& config_path) {\n  try {\n    return ParseFile(config_path);\n  } catch (cpptoml::parse_exception e) {\n    xe::FatalError(fmt::format(\"Failed to parse config file '{}':\\n\\n{}\",\n                               xe::path_to_utf8(config_path), e.what()));\n    return nullptr;\n  }\n}\n\nvoid ReadConfig(const std::filesystem::path& file_path,\n                bool update_if_no_version_stored) {\n  if (!cvar::ConfigVars) {\n    return;\n  }\n  const auto config = ParseConfig(file_path);\n  // Loading an actual global config file that exists - if there's no\n  // defaults_date in it, it's very old (before updating was added at all, thus\n  // all defaults need to be updated).\n  auto defaults_date_cvar =\n      dynamic_cast<cvar::ConfigVar<uint32_t>*>(cv::cv_defaults_date);\n  assert_not_null(defaults_date_cvar);\n  defaults_date_cvar->SetConfigValue(0);\n  for (auto& it : *cvar::ConfigVars) {\n    auto config_var = static_cast<cvar::IConfigVar*>(it.second);\n    auto config_key = config_var->category() + \".\" + config_var->name();\n    if (config->contains_qualified(config_key)) {\n      config_var->LoadConfigValue(config->get_qualified(config_key));\n    }\n  }\n  uint32_t config_defaults_date = defaults_date_cvar->GetTypedConfigValue();\n  if (update_if_no_version_stored || config_defaults_date) {\n    cvar::IConfigVarUpdate::ApplyUpdates(config_defaults_date);\n  }\n  XELOGI(\"Loaded config: {}\", xe::path_to_utf8(file_path));\n}\n\nvoid ReadGameConfig(const std::filesystem::path& file_path) {\n  if (!cvar::ConfigVars) {\n    return;\n  }\n  const auto config = ParseConfig(file_path);\n  for (auto& it : *cvar::ConfigVars) {\n    auto config_var = static_cast<cvar::IConfigVar*>(it.second);\n    auto config_key = config_var->category() + \".\" + config_var->name();\n    if (config->contains_qualified(config_key)) {\n      config_var->LoadGameConfigValue(config->get_qualified(config_key));\n    }\n  }\n  XELOGI(\"Loaded game config: {}\", xe::path_to_utf8(file_path));\n}\n\nvoid SaveConfig() {\n  if (config_path.empty()) {\n    return;\n  }\n\n  // All cvar defaults have been updated on loading - store the current date.\n  auto defaults_date_cvar =\n      dynamic_cast<cvar::ConfigVar<uint32_t>*>(cv::cv_defaults_date);\n  assert_not_null(defaults_date_cvar);\n  defaults_date_cvar->SetConfigValue(\n      cvar::IConfigVarUpdate::GetLastUpdateDate());\n\n  std::vector<cvar::IConfigVar*> vars;\n  if (cvar::ConfigVars) {\n    for (const auto& s : *cvar::ConfigVars) {\n      vars.push_back(s.second);\n    }\n  }\n  std::sort(vars.begin(), vars.end(), [](auto a, auto b) {\n    if (a->category() < b->category()) return true;\n    if (a->category() > b->category()) return false;\n    if (a->name() < b->name()) return true;\n    return false;\n  });\n\n  // we use our own write logic because cpptoml doesn't\n  // allow us to specify comments :(\n  std::string last_category;\n  bool last_multiline_description = false;\n  xe::StringBuffer sb;\n  for (auto config_var : vars) {\n    if (config_var->is_transient()) {\n      continue;\n    }\n\n    if (last_category != config_var->category()) {\n      if (!last_category.empty()) {\n        sb.Append('\\n', 2);\n      }\n      last_category = config_var->category();\n      last_multiline_description = false;\n      sb.AppendFormat(\"[{}]\\n\", last_category);\n    } else if (last_multiline_description) {\n      last_multiline_description = false;\n      sb.Append('\\n');\n    }\n\n    auto value = config_var->config_value();\n    size_t line_count;\n    if (xe::utf8::find_any_of(value, \"\\n\") == std::string_view::npos) {\n      auto line = fmt::format(\"{} = {}\", config_var->name(),\n                              config_var->config_value());\n      sb.Append(line);\n      line_count = xe::utf8::count(line);\n    } else {\n      auto lines = xe::utf8::split(value, \"\\n\");\n      auto first = lines.cbegin();\n      sb.AppendFormat(\"{} = {}\\n\", config_var->name(), *first);\n      auto last = std::prev(lines.cend());\n      for (auto it = std::next(first); it != last; ++it) {\n        sb.Append(*it);\n        sb.Append('\\n');\n      }\n      sb.Append(*last);\n      line_count = xe::utf8::count(*last);\n    }\n\n    const size_t value_alignment = 50;\n    const auto& description = config_var->description();\n    if (!description.empty()) {\n      if (line_count < value_alignment) {\n        sb.Append(' ', value_alignment - line_count);\n      }\n      if (xe::utf8::find_any_of(description, \"\\n\") == std::string_view::npos) {\n        sb.AppendFormat(\"\\t# {}\\n\", config_var->description());\n      } else {\n        auto lines = xe::utf8::split(description, \"\\n\");\n        auto first = lines.cbegin();\n        sb.Append(\"\\t# \");\n        sb.Append(*first);\n        sb.Append('\\n');\n        for (auto it = std::next(first); it != lines.cend(); ++it) {\n          sb.Append(' ', value_alignment);\n          sb.Append(\"\\t# \");\n          sb.Append(*it);\n          sb.Append('\\n');\n        }\n        last_multiline_description = true;\n      }\n    }\n  }\n\n  // save the config file\n  xe::filesystem::CreateParentFolder(config_path);\n\n  auto handle = xe::filesystem::OpenFile(config_path, \"wb\");\n  if (!handle) {\n    XELOGE(\"Failed to open '{}' for writing.\", xe::path_to_utf8(config_path));\n  } else {\n    fwrite(sb.buffer(), 1, sb.length(), handle);\n    fclose(handle);\n  }\n}\n\nvoid SetupConfig(const std::filesystem::path& config_folder) {\n  config::config_folder = config_folder;\n  // check if the user specified a specific config to load\n  if (!cvars::config.empty()) {\n    config_path = xe::to_path(cvars::config);\n    if (std::filesystem::exists(config_path)) {\n      // An external config file may contain only explicit overrides - in this\n      // case, it will likely not contain the defaults version; don't update\n      // from the version 0 in this case. Or, it may be a full config - in this\n      // case, if it's recent enough (created at least in 2021), it will contain\n      // the version number - updates the defaults in it.\n      ReadConfig(config_path, false);\n      return;\n    }\n  }\n  // if the user specified a --config argument, but the file doesn't exist,\n  // let's also load the default config\n  if (!config_folder.empty()) {\n    config_path = config_folder / config_name;\n    if (std::filesystem::exists(config_path)) {\n      ReadConfig(config_path, true);\n    }\n    // Re-save the loaded config to present the most up-to-date list of\n    // parameters to the user, if new options were added, descriptions were\n    // updated, or default values were changed.\n    SaveConfig();\n  }\n}\n\nvoid LoadGameConfig(const std::string_view title_id) {\n  const auto game_config_folder = config_folder / \"config\";\n  const auto game_config_path =\n      game_config_folder / (std::string(title_id) + game_config_suffix);\n  if (std::filesystem::exists(game_config_path)) {\n    ReadGameConfig(game_config_path);\n  }\n}\n\n}  // namespace config\n"
  },
  {
    "path": "src/xenia/config.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CONFIG_H_\n#define XENIA_CONFIG_H_\n\n#include <filesystem>\n\nnamespace config {\nvoid SetupConfig(const std::filesystem::path& config_folder);\nvoid LoadGameConfig(const std::string_view title_id);\nvoid SaveConfig();\n}  // namespace config\n\n#endif  // XENIA_CONFIG_H_\n"
  },
  {
    "path": "src/xenia/cpp.hint",
    "content": "// Hint files help the Visual Studio IDE interpret Visual C++ identifiers\n// such as names of functions and macros.\n// For more information see https://go.microsoft.com/fwlink/?linkid=865984\n\n#define DECLARE_XAM_EXPORT_(name, category, tags)\n#define DECLARE_XAM_EXPORT1(name, category, tag)\n#define DECLARE_XAM_EXPORT2(name, category, tag1, tag2)\n\n#define DECLARE_XBDM_EXPORT_(name, category, tags)\n#define DECLARE_XBDM_EXPORT1(name, category, tag)\n\n#define DECLARE_XBOXKRNL_EXPORT_(name, category, tags)\n#define DECLARE_XBOXKRNL_EXPORT1(name, category, tag)\n#define DECLARE_XBOXKRNL_EXPORT2(name, category, tag1, tag2)\n#define DECLARE_XBOXKRNL_EXPORT3(name, category, tag1, tag2, tag3)\n#define DECLARE_XBOXKRNL_EXPORT4(name, category, tag1, tag2, tag3, tag4)\n"
  },
  {
    "path": "src/xenia/cpu/backend/assembler.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/backend/assembler.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace backend {\n\nAssembler::Assembler(Backend* backend) : backend_(backend) {}\n\nAssembler::~Assembler() { Reset(); }\n\nbool Assembler::Initialize() { return true; }\n\nvoid Assembler::Reset() {}\n\n}  // namespace backend\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/backend/assembler.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_BACKEND_ASSEMBLER_H_\n#define XENIA_CPU_BACKEND_ASSEMBLER_H_\n\n#include <memory>\n\nnamespace xe {\nnamespace cpu {\nclass FunctionDebugInfo;\nclass GuestFunction;\nnamespace hir {\nclass HIRBuilder;\n}  // namespace hir\n}  // namespace cpu\n}  // namespace xe\n\nnamespace xe {\nnamespace cpu {\nnamespace backend {\n\nclass Backend;\n\nclass Assembler {\n public:\n  explicit Assembler(Backend* backend);\n  virtual ~Assembler();\n\n  virtual bool Initialize();\n\n  virtual void Reset();\n\n  virtual bool Assemble(GuestFunction* function, hir::HIRBuilder* builder,\n                        uint32_t debug_info_flags,\n                        std::unique_ptr<FunctionDebugInfo> debug_info) = 0;\n\n protected:\n  Backend* backend_;\n};\n\n}  // namespace backend\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_BACKEND_ASSEMBLER_H_\n"
  },
  {
    "path": "src/xenia/cpu/backend/backend.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/backend/backend.h\"\n\n#include <cstring>\n\nnamespace xe {\nnamespace cpu {\nnamespace backend {\n\nBackend::Backend() { std::memset(&machine_info_, 0, sizeof(machine_info_)); }\nBackend::~Backend() = default;\n\nbool Backend::Initialize(Processor* processor) {\n  processor_ = processor;\n  return true;\n}\n\nvoid* Backend::AllocThreadData() { return nullptr; }\n\nvoid Backend::FreeThreadData(void* thread_data) {}\n\n}  // namespace backend\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/backend/backend.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_BACKEND_BACKEND_H_\n#define XENIA_CPU_BACKEND_BACKEND_H_\n\n#include <memory>\n\n#include \"xenia/cpu/backend/machine_info.h\"\n#include \"xenia/cpu/thread_debug_info.h\"\n\nnamespace xe {\nnamespace cpu {\nclass Breakpoint;\nclass Function;\nclass GuestFunction;\nclass Module;\nclass Processor;\n}  // namespace cpu\n}  // namespace xe\n\nnamespace xe {\nnamespace cpu {\nnamespace backend {\n\nclass Assembler;\nclass CodeCache;\n\nclass Backend {\n public:\n  explicit Backend();\n  virtual ~Backend();\n\n  Processor* processor() const { return processor_; }\n  const MachineInfo* machine_info() const { return &machine_info_; }\n  CodeCache* code_cache() const { return code_cache_; }\n\n  virtual bool Initialize(Processor* processor);\n\n  virtual void* AllocThreadData();\n  virtual void FreeThreadData(void* thread_data);\n\n  virtual void CommitExecutableRange(uint32_t guest_low,\n                                     uint32_t guest_high) = 0;\n\n  virtual std::unique_ptr<Assembler> CreateAssembler() = 0;\n\n  virtual std::unique_ptr<GuestFunction> CreateGuestFunction(\n      Module* module, uint32_t address) = 0;\n\n  // Calculates the next host instruction based on the current thread state and\n  // current PC. This will look for branches and other control flow\n  // instructions.\n  virtual uint64_t CalculateNextHostInstruction(ThreadDebugInfo* thread_info,\n                                                uint64_t current_pc) = 0;\n\n  virtual void InstallBreakpoint(Breakpoint* breakpoint) {}\n  virtual void InstallBreakpoint(Breakpoint* breakpoint, Function* fn) {}\n  virtual void UninstallBreakpoint(Breakpoint* breakpoint) {}\n\n protected:\n  Processor* processor_ = nullptr;\n  MachineInfo machine_info_;\n  CodeCache* code_cache_ = nullptr;\n};\n\n}  // namespace backend\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_BACKEND_BACKEND_H_\n"
  },
  {
    "path": "src/xenia/cpu/backend/code_cache.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_BACKEND_CODE_CACHE_H_\n#define XENIA_CPU_BACKEND_CODE_CACHE_H_\n\n#include <cstddef>\n#include <cstdint>\n#include <string>\n\n#include \"xenia/cpu/function.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace backend {\n\nclass CodeCache {\n public:\n  CodeCache() = default;\n  virtual ~CodeCache() = default;\n\n  virtual const std::filesystem::path& file_name() const = 0;\n  virtual uintptr_t execute_base_address() const = 0;\n  virtual size_t total_size() const = 0;\n\n  // Finds a function based on the given host PC (that may be within a\n  // function).\n  virtual GuestFunction* LookupFunction(uint64_t host_pc) = 0;\n\n  // Finds platform-specific function unwind info for the given host PC.\n  virtual void* LookupUnwindInfo(uint64_t host_pc) = 0;\n};\n\n}  // namespace backend\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_BACKEND_CODE_CACHE_H_\n"
  },
  {
    "path": "src/xenia/cpu/backend/machine_info.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_BACKEND_MACHINE_INFO_H_\n#define XENIA_CPU_BACKEND_MACHINE_INFO_H_\n\n#include <cstdint>\n\nnamespace xe {\nnamespace cpu {\nnamespace backend {\n\nstruct MachineInfo {\n  bool supports_extended_load_store;\n\n  struct RegisterSet {\n    enum Types {\n      INT_TYPES = (1 << 1),\n      FLOAT_TYPES = (1 << 2),\n      VEC_TYPES = (1 << 3),\n    };\n    uint8_t id;\n    char name[4];\n    uint32_t types;\n    uint32_t count;\n  } register_sets[8];\n};\n\n}  // namespace backend\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_BACKEND_MACHINE_INFO_H_\n"
  },
  {
    "path": "src/xenia/cpu/backend/null_backend.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/backend/null_backend.h\"\n\n#include \"xenia/cpu/backend/assembler.h\"\n#include \"xenia/cpu/function.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace backend {\n\nvoid NullBackend::CommitExecutableRange(uint32_t guest_low,\n                                        uint32_t guest_high) {}\n\nstd::unique_ptr<Assembler> NullBackend::CreateAssembler() { return nullptr; }\n\nstd::unique_ptr<GuestFunction> NullBackend::CreateGuestFunction(\n    Module* module, uint32_t address) {\n  return nullptr;\n}\n\nuint64_t NullBackend::CalculateNextHostInstruction(ThreadDebugInfo* thread_info,\n                                                   uint64_t current_pc) {\n  return current_pc;\n}\n\n}  // namespace backend\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/backend/null_backend.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_BACKEND_NULL_BACKEND_H_\n#define XENIA_CPU_BACKEND_NULL_BACKEND_H_\n\n#include \"xenia/cpu/backend/backend.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace backend {\n\nclass NullBackend : public Backend {\n public:\n  void CommitExecutableRange(uint32_t guest_low, uint32_t guest_high) override;\n\n  std::unique_ptr<Assembler> CreateAssembler() override;\n\n  std::unique_ptr<GuestFunction> CreateGuestFunction(Module* module,\n                                                     uint32_t address) override;\n\n  uint64_t CalculateNextHostInstruction(ThreadDebugInfo* thread_info,\n                                        uint64_t current_pc) override;\n};\n\n}  // namespace backend\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_BACKEND_NULL_BACKEND_H_\n"
  },
  {
    "path": "src/xenia/cpu/backend/x64/premake5.lua",
    "content": "project_root = \"../../../../..\"\ninclude(project_root..\"/tools/build\")\n\ngroup(\"src\")\nproject(\"xenia-cpu-backend-x64\")\n  uuid(\"7d8d5dce-4696-4197-952a-09506f725afe\")\n  kind(\"StaticLib\")\n  language(\"C++\")\n  links({\n    \"capstone\",\n    \"fmt\",\n    \"xenia-base\",\n    \"xenia-cpu\",\n  })\n  defines({\n    \"CAPSTONE_X86_ATT_DISABLE\",\n    \"CAPSTONE_DIET_NO\",\n    \"CAPSTONE_X86_REDUCE_NO\",\n    \"CAPSTONE_HAS_X86\",\n    \"CAPSTONE_USE_SYS_DYN_MEM\",\n    \"XBYAK_NO_OP_NAMES\",\n    \"XBYAK_ENABLE_OMITTED_OPERAND\",\n  })\n  -- Enable VTune, if it's installed.\n  if os.isdir(project_root..\"/third_party/vtune\") then\n    defines { \"ENABLE_VTUNE=1\" }\n  end\n\n  includedirs({\n    project_root..\"/third_party/capstone/include\",\n  })\n  local_platform_files()\n"
  },
  {
    "path": "src/xenia/cpu/backend/x64/x64_assembler.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/backend/x64/x64_assembler.h\"\n\n#include <climits>\n\n#include \"third_party/capstone/include/capstone/capstone.h\"\n#include \"third_party/capstone/include/capstone/x86.h\"\n#include \"xenia/base/profiling.h\"\n#include \"xenia/base/reset_scope.h\"\n#include \"xenia/base/string.h\"\n#include \"xenia/cpu/backend/x64/x64_backend.h\"\n#include \"xenia/cpu/backend/x64/x64_code_cache.h\"\n#include \"xenia/cpu/backend/x64/x64_emitter.h\"\n#include \"xenia/cpu/backend/x64/x64_function.h\"\n#include \"xenia/cpu/cpu_flags.h\"\n#include \"xenia/cpu/hir/hir_builder.h\"\n#include \"xenia/cpu/hir/label.h\"\n#include \"xenia/cpu/processor.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace backend {\nnamespace x64 {\n\nusing xe::cpu::hir::HIRBuilder;\n\nX64Assembler::X64Assembler(X64Backend* backend)\n    : Assembler(backend), x64_backend_(backend), capstone_handle_(0) {\n  if (cs_open(CS_ARCH_X86, CS_MODE_64, &capstone_handle_) != CS_ERR_OK) {\n    assert_always(\"Failed to initialize capstone\");\n  }\n  cs_option(capstone_handle_, CS_OPT_SYNTAX, CS_OPT_SYNTAX_INTEL);\n  cs_option(capstone_handle_, CS_OPT_DETAIL, CS_OPT_OFF);\n}\n\nX64Assembler::~X64Assembler() {\n  // Emitter must be freed before the allocator.\n  emitter_.reset();\n  allocator_.reset();\n\n  if (capstone_handle_) {\n    cs_close(&capstone_handle_);\n  }\n}\n\nbool X64Assembler::Initialize() {\n  if (!Assembler::Initialize()) {\n    return false;\n  }\n\n  allocator_.reset(new XbyakAllocator());\n  emitter_.reset(new X64Emitter(x64_backend_, allocator_.get()));\n\n  return true;\n}\n\nvoid X64Assembler::Reset() {\n  string_buffer_.Reset();\n  Assembler::Reset();\n}\n\nbool X64Assembler::Assemble(GuestFunction* function, HIRBuilder* builder,\n                            uint32_t debug_info_flags,\n                            std::unique_ptr<FunctionDebugInfo> debug_info) {\n  SCOPE_profile_cpu_f(\"cpu\");\n\n  // Reset when we leave.\n  xe::make_reset_scope(this);\n\n  // Lower HIR -> x64.\n  void* machine_code = nullptr;\n  size_t code_size = 0;\n  if (!emitter_->Emit(function, builder, debug_info_flags, debug_info.get(),\n                      &machine_code, &code_size, &function->source_map())) {\n    return false;\n  }\n\n  // Stash generated machine code.\n  if (debug_info_flags & DebugInfoFlags::kDebugInfoDisasmMachineCode) {\n    DumpMachineCode(machine_code, code_size, function->source_map(),\n                    &string_buffer_);\n    debug_info->set_machine_code_disasm(xe_strdup(string_buffer_.buffer()));\n    string_buffer_.Reset();\n  }\n\n  function->set_debug_info(std::move(debug_info));\n  static_cast<X64Function*>(function)->Setup(\n      reinterpret_cast<uint8_t*>(machine_code), code_size);\n\n  // Install into indirection table.\n  uint64_t host_address = reinterpret_cast<uint64_t>(machine_code);\n  assert_true((host_address >> 32) == 0);\n  reinterpret_cast<X64CodeCache*>(backend_->code_cache())\n      ->AddIndirection(function->address(),\n                       static_cast<uint32_t>(host_address));\n\n  return true;\n}\n\nvoid X64Assembler::DumpMachineCode(\n    void* machine_code, size_t code_size,\n    const std::vector<SourceMapEntry>& source_map, StringBuffer* str) {\n  if (source_map.empty()) {\n    return;\n  }\n  auto source_map_index = 0;\n  uint32_t next_code_offset = source_map[0].code_offset;\n\n  const uint8_t* code_ptr = reinterpret_cast<uint8_t*>(machine_code);\n  size_t remaining_code_size = code_size;\n  uint64_t address = uint64_t(machine_code);\n  cs_insn insn = {0};\n  while (remaining_code_size &&\n         cs_disasm_iter(capstone_handle_, &code_ptr, &remaining_code_size,\n                        &address, &insn)) {\n    // Look up source offset.\n    auto code_offset =\n        uint32_t(code_ptr - reinterpret_cast<uint8_t*>(machine_code));\n    if (code_offset >= next_code_offset &&\n        source_map_index < source_map.size()) {\n      auto& source_map_entry = source_map[source_map_index];\n      str->AppendFormat(\"{:08X} \", source_map_entry.guest_address);\n      ++source_map_index;\n      next_code_offset = source_map_index < source_map.size()\n                             ? source_map[source_map_index].code_offset\n                             : UINT_MAX;\n    } else {\n      str->Append(\"         \");\n    }\n\n    str->AppendFormat(\"{:08X}      {:<6} {}\\n\", uint32_t(insn.address),\n                      insn.mnemonic, insn.op_str);\n  }\n}\n\n}  // namespace x64\n}  // namespace backend\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/backend/x64/x64_assembler.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_BACKEND_X64_X64_ASSEMBLER_H_\n#define XENIA_CPU_BACKEND_X64_X64_ASSEMBLER_H_\n\n#include <memory>\n#include <vector>\n\n#include \"xenia/base/string_buffer.h\"\n#include \"xenia/cpu/backend/assembler.h\"\n#include \"xenia/cpu/function.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace backend {\nnamespace x64 {\n\nclass X64Backend;\nclass X64Emitter;\nclass XbyakAllocator;\n\nclass X64Assembler : public Assembler {\n public:\n  explicit X64Assembler(X64Backend* backend);\n  ~X64Assembler() override;\n\n  bool Initialize() override;\n\n  void Reset() override;\n\n  bool Assemble(GuestFunction* function, hir::HIRBuilder* builder,\n                uint32_t debug_info_flags,\n                std::unique_ptr<FunctionDebugInfo> debug_info) override;\n\n private:\n  void DumpMachineCode(void* machine_code, size_t code_size,\n                       const std::vector<SourceMapEntry>& source_map,\n                       StringBuffer* str);\n\n private:\n  X64Backend* x64_backend_;\n  std::unique_ptr<X64Emitter> emitter_;\n  std::unique_ptr<XbyakAllocator> allocator_;\n  uintptr_t capstone_handle_;\n\n  StringBuffer string_buffer_;\n};\n\n}  // namespace x64\n}  // namespace backend\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_BACKEND_X64_X64_ASSEMBLER_H_\n"
  },
  {
    "path": "src/xenia/cpu/backend/x64/x64_backend.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2019 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/backend/x64/x64_backend.h\"\n\n#include <stddef.h>\n\n#include \"third_party/capstone/include/capstone/capstone.h\"\n#include \"third_party/capstone/include/capstone/x86.h\"\n\n#include \"xenia/base/exception_handler.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/cpu/backend/x64/x64_assembler.h\"\n#include \"xenia/cpu/backend/x64/x64_code_cache.h\"\n#include \"xenia/cpu/backend/x64/x64_emitter.h\"\n#include \"xenia/cpu/backend/x64/x64_function.h\"\n#include \"xenia/cpu/backend/x64/x64_sequences.h\"\n#include \"xenia/cpu/backend/x64/x64_stack_layout.h\"\n#include \"xenia/cpu/breakpoint.h\"\n#include \"xenia/cpu/processor.h\"\n#include \"xenia/cpu/stack_walker.h\"\n\nDEFINE_int32(x64_extension_mask, -1,\n             \"Allow the detection and utilization of specific instruction set \"\n             \"features.\\n\"\n             \"    0 = x86_64 + AVX1\\n\"\n             \"    1 = AVX2\\n\"\n             \"    2 = FMA\\n\"\n             \"    4 = LZCNT\\n\"\n             \"    8 = BMI1\\n\"\n             \"   16 = BMI2\\n\"\n             \"   32 = F16C\\n\"\n             \"   64 = Movbe\\n\"\n             \"  128 = GFNI\\n\"\n             \"  256 = AVX512F\\n\"\n             \"  512 = AVX512VL\\n\"\n             \" 1024 = AVX512BW\\n\"\n             \" 2048 = AVX512DQ\\n\"\n             \" 4096 = AVX512VBMI\\n\"\n             \"   -1 = Detect and utilize all possible processor features\\n\",\n             \"x64\");\n\nnamespace xe {\nnamespace cpu {\nnamespace backend {\nnamespace x64 {\n\nclass X64ThunkEmitter : public X64Emitter {\n public:\n  X64ThunkEmitter(X64Backend* backend, XbyakAllocator* allocator);\n  ~X64ThunkEmitter() override;\n  HostToGuestThunk EmitHostToGuestThunk();\n  GuestToHostThunk EmitGuestToHostThunk();\n  ResolveFunctionThunk EmitResolveFunctionThunk();\n\n private:\n  // The following four functions provide save/load functionality for registers.\n  // They assume at least StackLayout::THUNK_STACK_SIZE bytes have been\n  // allocated on the stack.\n  void EmitSaveVolatileRegs();\n  void EmitLoadVolatileRegs();\n  void EmitSaveNonvolatileRegs();\n  void EmitLoadNonvolatileRegs();\n};\n\nX64Backend::X64Backend() : Backend(), code_cache_(nullptr) {\n  if (cs_open(CS_ARCH_X86, CS_MODE_64, &capstone_handle_) != CS_ERR_OK) {\n    assert_always(\"Failed to initialize capstone\");\n  }\n  cs_option(capstone_handle_, CS_OPT_SYNTAX, CS_OPT_SYNTAX_INTEL);\n  cs_option(capstone_handle_, CS_OPT_DETAIL, CS_OPT_ON);\n  cs_option(capstone_handle_, CS_OPT_SKIPDATA, CS_OPT_OFF);\n}\n\nX64Backend::~X64Backend() {\n  if (capstone_handle_) {\n    cs_close(&capstone_handle_);\n  }\n\n  X64Emitter::FreeConstData(emitter_data_);\n  ExceptionHandler::Uninstall(&ExceptionCallbackThunk, this);\n}\n\nbool X64Backend::Initialize(Processor* processor) {\n  if (!Backend::Initialize(processor)) {\n    return false;\n  }\n\n  Xbyak::util::Cpu cpu;\n  if (!cpu.has(Xbyak::util::Cpu::tAVX)) {\n    XELOGE(\"This CPU does not support AVX. The emulator will now crash.\");\n    return false;\n  }\n\n  // Need movbe to do advanced LOAD/STORE tricks.\n  if (cvars::x64_extension_mask & kX64EmitMovbe) {\n    machine_info_.supports_extended_load_store =\n        cpu.has(Xbyak::util::Cpu::tMOVBE);\n  } else {\n    machine_info_.supports_extended_load_store = false;\n  }\n\n  auto& gprs = machine_info_.register_sets[0];\n  gprs.id = 0;\n  std::strcpy(gprs.name, \"gpr\");\n  gprs.types = MachineInfo::RegisterSet::INT_TYPES;\n  gprs.count = X64Emitter::GPR_COUNT;\n\n  auto& xmms = machine_info_.register_sets[1];\n  xmms.id = 1;\n  std::strcpy(xmms.name, \"xmm\");\n  xmms.types = MachineInfo::RegisterSet::FLOAT_TYPES |\n               MachineInfo::RegisterSet::VEC_TYPES;\n  xmms.count = X64Emitter::XMM_COUNT;\n\n  code_cache_ = X64CodeCache::Create();\n  Backend::code_cache_ = code_cache_.get();\n  if (!code_cache_->Initialize()) {\n    return false;\n  }\n\n  // Generate thunks used to transition between jitted code and host code.\n  XbyakAllocator allocator;\n  X64ThunkEmitter thunk_emitter(this, &allocator);\n  host_to_guest_thunk_ = thunk_emitter.EmitHostToGuestThunk();\n  guest_to_host_thunk_ = thunk_emitter.EmitGuestToHostThunk();\n  resolve_function_thunk_ = thunk_emitter.EmitResolveFunctionThunk();\n\n  // Set the code cache to use the ResolveFunction thunk for default\n  // indirections.\n  assert_zero(uint64_t(resolve_function_thunk_) & 0xFFFFFFFF00000000ull);\n  code_cache_->set_indirection_default(\n      uint32_t(uint64_t(resolve_function_thunk_)));\n\n  // Allocate some special indirections.\n  code_cache_->CommitExecutableRange(0x9FFF0000, 0x9FFFFFFF);\n\n  // Allocate emitter constant data.\n  emitter_data_ = X64Emitter::PlaceConstData();\n\n  // Setup exception callback\n  ExceptionHandler::Install(&ExceptionCallbackThunk, this);\n\n  return true;\n}\n\nvoid X64Backend::CommitExecutableRange(uint32_t guest_low,\n                                       uint32_t guest_high) {\n  code_cache_->CommitExecutableRange(guest_low, guest_high);\n}\n\nstd::unique_ptr<Assembler> X64Backend::CreateAssembler() {\n  return std::make_unique<X64Assembler>(this);\n}\n\nstd::unique_ptr<GuestFunction> X64Backend::CreateGuestFunction(\n    Module* module, uint32_t address) {\n  return std::make_unique<X64Function>(module, address);\n}\n\nuint64_t ReadCapstoneReg(HostThreadContext* context, x86_reg reg) {\n  switch (reg) {\n    case X86_REG_RAX:\n      return context->rax;\n    case X86_REG_RCX:\n      return context->rcx;\n    case X86_REG_RDX:\n      return context->rdx;\n    case X86_REG_RBX:\n      return context->rbx;\n    case X86_REG_RSP:\n      return context->rsp;\n    case X86_REG_RBP:\n      return context->rbp;\n    case X86_REG_RSI:\n      return context->rsi;\n    case X86_REG_RDI:\n      return context->rdi;\n    case X86_REG_R8:\n      return context->r8;\n    case X86_REG_R9:\n      return context->r9;\n    case X86_REG_R10:\n      return context->r10;\n    case X86_REG_R11:\n      return context->r11;\n    case X86_REG_R12:\n      return context->r12;\n    case X86_REG_R13:\n      return context->r13;\n    case X86_REG_R14:\n      return context->r14;\n    case X86_REG_R15:\n      return context->r15;\n    default:\n      assert_unhandled_case(reg);\n      return 0;\n  }\n}\n\n#define X86_EFLAGS_CF 0x00000001  // Carry Flag\n#define X86_EFLAGS_PF 0x00000004  // Parity Flag\n#define X86_EFLAGS_ZF 0x00000040  // Zero Flag\n#define X86_EFLAGS_SF 0x00000080  // Sign Flag\n#define X86_EFLAGS_OF 0x00000800  // Overflow Flag\nbool TestCapstoneEflags(uint32_t eflags, uint32_t insn) {\n  // https://www.felixcloutier.com/x86/Jcc.html\n  switch (insn) {\n    case X86_INS_JAE:\n      // CF=0 && ZF=0\n      return ((eflags & X86_EFLAGS_CF) == 0) && ((eflags & X86_EFLAGS_ZF) == 0);\n    case X86_INS_JA:\n      // CF=0\n      return (eflags & X86_EFLAGS_CF) == 0;\n    case X86_INS_JBE:\n      // CF=1 || ZF=1\n      return ((eflags & X86_EFLAGS_CF) == X86_EFLAGS_CF) ||\n             ((eflags & X86_EFLAGS_ZF) == X86_EFLAGS_ZF);\n    case X86_INS_JB:\n      // CF=1\n      return (eflags & X86_EFLAGS_CF) == X86_EFLAGS_CF;\n    case X86_INS_JE:\n      // ZF=1\n      return (eflags & X86_EFLAGS_ZF) == X86_EFLAGS_ZF;\n    case X86_INS_JGE:\n      // SF=OF\n      return (eflags & X86_EFLAGS_SF) == (eflags & X86_EFLAGS_OF);\n    case X86_INS_JG:\n      // ZF=0 && SF=OF\n      return ((eflags & X86_EFLAGS_ZF) == 0) &&\n             ((eflags & X86_EFLAGS_SF) == (eflags & X86_EFLAGS_OF));\n    case X86_INS_JLE:\n      // ZF=1 || SF!=OF\n      return ((eflags & X86_EFLAGS_ZF) == X86_EFLAGS_ZF) ||\n             ((eflags & X86_EFLAGS_SF) != X86_EFLAGS_OF);\n    case X86_INS_JL:\n      // SF!=OF\n      return (eflags & X86_EFLAGS_SF) != (eflags & X86_EFLAGS_OF);\n    case X86_INS_JNE:\n      // ZF=0\n      return (eflags & X86_EFLAGS_ZF) == 0;\n    case X86_INS_JNO:\n      // OF=0\n      return (eflags & X86_EFLAGS_OF) == 0;\n    case X86_INS_JNP:\n      // PF=0\n      return (eflags & X86_EFLAGS_PF) == 0;\n    case X86_INS_JNS:\n      // SF=0\n      return (eflags & X86_EFLAGS_SF) == 0;\n    case X86_INS_JO:\n      // OF=1\n      return (eflags & X86_EFLAGS_OF) == X86_EFLAGS_OF;\n    case X86_INS_JP:\n      // PF=1\n      return (eflags & X86_EFLAGS_PF) == X86_EFLAGS_PF;\n    case X86_INS_JS:\n      // SF=1\n      return (eflags & X86_EFLAGS_SF) == X86_EFLAGS_SF;\n    default:\n      assert_unhandled_case(insn);\n      return false;\n  }\n}\n\nuint64_t X64Backend::CalculateNextHostInstruction(ThreadDebugInfo* thread_info,\n                                                  uint64_t current_pc) {\n  auto machine_code_ptr = reinterpret_cast<const uint8_t*>(current_pc);\n  size_t remaining_machine_code_size = 64;\n  uint64_t host_address = current_pc;\n  cs_insn insn = {0};\n  cs_detail all_detail = {0};\n  insn.detail = &all_detail;\n  cs_disasm_iter(capstone_handle_, &machine_code_ptr,\n                 &remaining_machine_code_size, &host_address, &insn);\n  auto& detail = all_detail.x86;\n  switch (insn.id) {\n    default:\n      // Not a branching instruction - just move over it.\n      return current_pc + insn.size;\n    case X86_INS_CALL: {\n      assert_true(detail.op_count == 1);\n      assert_true(detail.operands[0].type == X86_OP_REG);\n      uint64_t target_pc =\n          ReadCapstoneReg(&thread_info->host_context, detail.operands[0].reg);\n      return target_pc;\n    } break;\n    case X86_INS_RET: {\n      assert_zero(detail.op_count);\n      auto stack_ptr =\n          reinterpret_cast<uint64_t*>(thread_info->host_context.rsp);\n      uint64_t target_pc = stack_ptr[0];\n      return target_pc;\n    } break;\n    case X86_INS_JMP: {\n      assert_true(detail.op_count == 1);\n      if (detail.operands[0].type == X86_OP_IMM) {\n        uint64_t target_pc = static_cast<uint64_t>(detail.operands[0].imm);\n        return target_pc;\n      } else if (detail.operands[0].type == X86_OP_REG) {\n        uint64_t target_pc =\n            ReadCapstoneReg(&thread_info->host_context, detail.operands[0].reg);\n        return target_pc;\n      } else {\n        // TODO(benvanik): find some more uses of this.\n        assert_always(\"jmp branch emulation not yet implemented\");\n        return current_pc + insn.size;\n      }\n    } break;\n    case X86_INS_JCXZ:\n    case X86_INS_JECXZ:\n    case X86_INS_JRCXZ:\n      assert_always(\"j*cxz branch emulation not yet implemented\");\n      return current_pc + insn.size;\n    case X86_INS_JAE:\n    case X86_INS_JA:\n    case X86_INS_JBE:\n    case X86_INS_JB:\n    case X86_INS_JE:\n    case X86_INS_JGE:\n    case X86_INS_JG:\n    case X86_INS_JLE:\n    case X86_INS_JL:\n    case X86_INS_JNE:\n    case X86_INS_JNO:\n    case X86_INS_JNP:\n    case X86_INS_JNS:\n    case X86_INS_JO:\n    case X86_INS_JP:\n    case X86_INS_JS: {\n      assert_true(detail.op_count == 1);\n      assert_true(detail.operands[0].type == X86_OP_IMM);\n      uint64_t target_pc = static_cast<uint64_t>(detail.operands[0].imm);\n      bool test_passed =\n          TestCapstoneEflags(thread_info->host_context.eflags, insn.id);\n      if (test_passed) {\n        return target_pc;\n      } else {\n        return current_pc + insn.size;\n      }\n    } break;\n  }\n}\n\nvoid X64Backend::InstallBreakpoint(Breakpoint* breakpoint) {\n  breakpoint->ForEachHostAddress([breakpoint](uint64_t host_address) {\n    auto ptr = reinterpret_cast<void*>(host_address);\n    auto original_bytes = xe::load_and_swap<uint16_t>(ptr);\n    assert_true(original_bytes != 0x0F0B);\n    xe::store_and_swap<uint16_t>(ptr, 0x0F0B);\n    breakpoint->backend_data().emplace_back(host_address, original_bytes);\n  });\n}\n\nvoid X64Backend::InstallBreakpoint(Breakpoint* breakpoint, Function* fn) {\n  assert_true(breakpoint->address_type() == Breakpoint::AddressType::kGuest);\n  assert_true(fn->is_guest());\n  auto guest_function = reinterpret_cast<cpu::GuestFunction*>(fn);\n  auto host_address =\n      guest_function->MapGuestAddressToMachineCode(breakpoint->guest_address());\n  if (!host_address) {\n    assert_always();\n    return;\n  }\n\n  // Assume we haven't already installed a breakpoint in this spot.\n  auto ptr = reinterpret_cast<void*>(host_address);\n  auto original_bytes = xe::load_and_swap<uint16_t>(ptr);\n  assert_true(original_bytes != 0x0F0B);\n  xe::store_and_swap<uint16_t>(ptr, 0x0F0B);\n  breakpoint->backend_data().emplace_back(host_address, original_bytes);\n}\n\nvoid X64Backend::UninstallBreakpoint(Breakpoint* breakpoint) {\n  for (auto& pair : breakpoint->backend_data()) {\n    auto ptr = reinterpret_cast<uint8_t*>(pair.first);\n    auto instruction_bytes = xe::load_and_swap<uint16_t>(ptr);\n    assert_true(instruction_bytes == 0x0F0B);\n    xe::store_and_swap<uint16_t>(ptr, static_cast<uint16_t>(pair.second));\n  }\n  breakpoint->backend_data().clear();\n}\n\nbool X64Backend::ExceptionCallbackThunk(Exception* ex, void* data) {\n  auto backend = reinterpret_cast<X64Backend*>(data);\n  return backend->ExceptionCallback(ex);\n}\n\nbool X64Backend::ExceptionCallback(Exception* ex) {\n  if (ex->code() != Exception::Code::kIllegalInstruction) {\n    // We only care about illegal instructions. Other things will be handled by\n    // other handlers (probably). If nothing else picks it up we'll be called\n    // with OnUnhandledException to do real crash handling.\n    return false;\n  }\n\n  // Verify an expected illegal instruction.\n  auto instruction_bytes =\n      xe::load_and_swap<uint16_t>(reinterpret_cast<void*>(ex->pc()));\n  if (instruction_bytes != 0x0F0B) {\n    // Not our ud2 - not us.\n    return false;\n  }\n\n  // Let the processor handle things.\n  return processor()->OnThreadBreakpointHit(ex);\n}\n\nX64ThunkEmitter::X64ThunkEmitter(X64Backend* backend, XbyakAllocator* allocator)\n    : X64Emitter(backend, allocator) {}\n\nX64ThunkEmitter::~X64ThunkEmitter() {}\n\nHostToGuestThunk X64ThunkEmitter::EmitHostToGuestThunk() {\n  // rcx = target\n  // rdx = arg0 (context)\n  // r8 = arg1 (guest return address)\n\n  struct _code_offsets {\n    size_t prolog;\n    size_t prolog_stack_alloc;\n    size_t body;\n    size_t epilog;\n    size_t tail;\n  } code_offsets = {};\n\n  const size_t stack_size = StackLayout::THUNK_STACK_SIZE;\n\n  code_offsets.prolog = getSize();\n\n  // rsp + 0 = return address\n  mov(qword[rsp + 8 * 3], r8);\n  mov(qword[rsp + 8 * 2], rdx);\n  mov(qword[rsp + 8 * 1], rcx);\n  sub(rsp, stack_size);\n\n  code_offsets.prolog_stack_alloc = getSize();\n  code_offsets.body = getSize();\n\n  // Save nonvolatile registers.\n  EmitSaveNonvolatileRegs();\n\n  mov(rax, rcx);\n  mov(rsi, rdx);  // context\n  mov(rcx, r8);   // return address\n  call(rax);\n\n  EmitLoadNonvolatileRegs();\n\n  code_offsets.epilog = getSize();\n\n  add(rsp, stack_size);\n  mov(rcx, qword[rsp + 8 * 1]);\n  mov(rdx, qword[rsp + 8 * 2]);\n  mov(r8, qword[rsp + 8 * 3]);\n  ret();\n\n  code_offsets.tail = getSize();\n\n  assert_zero(code_offsets.prolog);\n  EmitFunctionInfo func_info = {};\n  func_info.code_size.total = getSize();\n  func_info.code_size.prolog = code_offsets.body - code_offsets.prolog;\n  func_info.code_size.body = code_offsets.epilog - code_offsets.body;\n  func_info.code_size.epilog = code_offsets.tail - code_offsets.epilog;\n  func_info.code_size.tail = getSize() - code_offsets.tail;\n  func_info.prolog_stack_alloc_offset =\n      code_offsets.prolog_stack_alloc - code_offsets.prolog;\n  func_info.stack_size = stack_size;\n\n  void* fn = Emplace(func_info);\n  return (HostToGuestThunk)fn;\n}\n\nGuestToHostThunk X64ThunkEmitter::EmitGuestToHostThunk() {\n  // rcx = target function\n  // rdx = arg0\n  // r8  = arg1\n  // r9  = arg2\n\n  struct _code_offsets {\n    size_t prolog;\n    size_t prolog_stack_alloc;\n    size_t body;\n    size_t epilog;\n    size_t tail;\n  } code_offsets = {};\n\n  const size_t stack_size = StackLayout::THUNK_STACK_SIZE;\n\n  code_offsets.prolog = getSize();\n\n  // rsp + 0 = return address\n  sub(rsp, stack_size);\n\n  code_offsets.prolog_stack_alloc = getSize();\n  code_offsets.body = getSize();\n\n  // Save off volatile registers.\n  EmitSaveVolatileRegs();\n\n  mov(rax, rcx);              // function\n  mov(rcx, GetContextReg());  // context\n  call(rax);\n\n  EmitLoadVolatileRegs();\n\n  code_offsets.epilog = getSize();\n\n  add(rsp, stack_size);\n  ret();\n\n  code_offsets.tail = getSize();\n\n  assert_zero(code_offsets.prolog);\n  EmitFunctionInfo func_info = {};\n  func_info.code_size.total = getSize();\n  func_info.code_size.prolog = code_offsets.body - code_offsets.prolog;\n  func_info.code_size.body = code_offsets.epilog - code_offsets.body;\n  func_info.code_size.epilog = code_offsets.tail - code_offsets.epilog;\n  func_info.code_size.tail = getSize() - code_offsets.tail;\n  func_info.prolog_stack_alloc_offset =\n      code_offsets.prolog_stack_alloc - code_offsets.prolog;\n  func_info.stack_size = stack_size;\n\n  void* fn = Emplace(func_info);\n  return (GuestToHostThunk)fn;\n}\n\n// X64Emitter handles actually resolving functions.\nuint64_t ResolveFunction(void* raw_context, uint64_t target_address);\n\nResolveFunctionThunk X64ThunkEmitter::EmitResolveFunctionThunk() {\n  // ebx = target PPC address\n  // rcx = context\n\n  struct _code_offsets {\n    size_t prolog;\n    size_t prolog_stack_alloc;\n    size_t body;\n    size_t epilog;\n    size_t tail;\n  } code_offsets = {};\n\n  const size_t stack_size = StackLayout::THUNK_STACK_SIZE;\n\n  code_offsets.prolog = getSize();\n\n  // rsp + 0 = return address\n  sub(rsp, stack_size);\n\n  code_offsets.prolog_stack_alloc = getSize();\n  code_offsets.body = getSize();\n\n  // Save volatile registers\n  EmitSaveVolatileRegs();\n\n  mov(rcx, rsi);  // context\n  mov(rdx, rbx);\n  mov(rax, reinterpret_cast<uint64_t>(&ResolveFunction));\n  call(rax);\n\n  EmitLoadVolatileRegs();\n\n  code_offsets.epilog = getSize();\n\n  add(rsp, stack_size);\n  jmp(rax);\n\n  code_offsets.tail = getSize();\n\n  assert_zero(code_offsets.prolog);\n  EmitFunctionInfo func_info = {};\n  func_info.code_size.total = getSize();\n  func_info.code_size.prolog = code_offsets.body - code_offsets.prolog;\n  func_info.code_size.body = code_offsets.epilog - code_offsets.body;\n  func_info.code_size.epilog = code_offsets.tail - code_offsets.epilog;\n  func_info.code_size.tail = getSize() - code_offsets.tail;\n  func_info.prolog_stack_alloc_offset =\n      code_offsets.prolog_stack_alloc - code_offsets.prolog;\n  func_info.stack_size = stack_size;\n\n  void* fn = Emplace(func_info);\n  return (ResolveFunctionThunk)fn;\n}\n\nvoid X64ThunkEmitter::EmitSaveVolatileRegs() {\n  // Save off volatile registers.\n  // mov(qword[rsp + offsetof(StackLayout::Thunk, r[0])], rax);\n  mov(qword[rsp + offsetof(StackLayout::Thunk, r[1])], rcx);\n  mov(qword[rsp + offsetof(StackLayout::Thunk, r[2])], rdx);\n#if XE_PLATFORM_LINUX\n  mov(qword[rsp + offsetof(StackLayout::Thunk, r[3])], rsi);\n  mov(qword[rsp + offsetof(StackLayout::Thunk, r[4])], rdi);\n#endif\n  mov(qword[rsp + offsetof(StackLayout::Thunk, r[5])], r8);\n  mov(qword[rsp + offsetof(StackLayout::Thunk, r[6])], r9);\n  mov(qword[rsp + offsetof(StackLayout::Thunk, r[7])], r10);\n  mov(qword[rsp + offsetof(StackLayout::Thunk, r[8])], r11);\n\n  // vmovaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[0])], xmm0);\n  vmovaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[1])], xmm1);\n  vmovaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[2])], xmm2);\n  vmovaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[3])], xmm3);\n  vmovaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[4])], xmm4);\n  vmovaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[5])], xmm5);\n}\n\nvoid X64ThunkEmitter::EmitLoadVolatileRegs() {\n  // mov(rax, qword[rsp + offsetof(StackLayout::Thunk, r[0])]);\n  mov(rcx, qword[rsp + offsetof(StackLayout::Thunk, r[1])]);\n  mov(rdx, qword[rsp + offsetof(StackLayout::Thunk, r[2])]);\n#if XE_PLATFORM_LINUX\n  mov(rsi, qword[rsp + offsetof(StackLayout::Thunk, r[3])]);\n  mov(rdi, qword[rsp + offsetof(StackLayout::Thunk, r[4])]);\n#endif\n  mov(r8, qword[rsp + offsetof(StackLayout::Thunk, r[5])]);\n  mov(r9, qword[rsp + offsetof(StackLayout::Thunk, r[6])]);\n  mov(r10, qword[rsp + offsetof(StackLayout::Thunk, r[7])]);\n  mov(r11, qword[rsp + offsetof(StackLayout::Thunk, r[8])]);\n\n  // vmovaps(xmm0, qword[rsp + offsetof(StackLayout::Thunk, xmm[0])]);\n  vmovaps(xmm1, qword[rsp + offsetof(StackLayout::Thunk, xmm[1])]);\n  vmovaps(xmm2, qword[rsp + offsetof(StackLayout::Thunk, xmm[2])]);\n  vmovaps(xmm3, qword[rsp + offsetof(StackLayout::Thunk, xmm[3])]);\n  vmovaps(xmm4, qword[rsp + offsetof(StackLayout::Thunk, xmm[4])]);\n  vmovaps(xmm5, qword[rsp + offsetof(StackLayout::Thunk, xmm[5])]);\n}\n\nvoid X64ThunkEmitter::EmitSaveNonvolatileRegs() {\n  mov(qword[rsp + offsetof(StackLayout::Thunk, r[0])], rbx);\n  mov(qword[rsp + offsetof(StackLayout::Thunk, r[1])], rbp);\n#if XE_PLATFORM_WIN32\n  mov(qword[rsp + offsetof(StackLayout::Thunk, r[2])], rcx);\n  mov(qword[rsp + offsetof(StackLayout::Thunk, r[3])], rsi);\n  mov(qword[rsp + offsetof(StackLayout::Thunk, r[4])], rdi);\n#endif\n  mov(qword[rsp + offsetof(StackLayout::Thunk, r[5])], r12);\n  mov(qword[rsp + offsetof(StackLayout::Thunk, r[6])], r13);\n  mov(qword[rsp + offsetof(StackLayout::Thunk, r[7])], r14);\n  mov(qword[rsp + offsetof(StackLayout::Thunk, r[8])], r15);\n\n  // SysV does not have nonvolatile XMM registers.\n#if XE_PLATFORM_WIN32\n  vmovaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[0])], xmm6);\n  vmovaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[1])], xmm7);\n  vmovaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[2])], xmm8);\n  vmovaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[3])], xmm9);\n  vmovaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[4])], xmm10);\n  vmovaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[5])], xmm11);\n  vmovaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[6])], xmm12);\n  vmovaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[7])], xmm13);\n  vmovaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[8])], xmm14);\n  vmovaps(qword[rsp + offsetof(StackLayout::Thunk, xmm[9])], xmm15);\n#endif\n}\n\nvoid X64ThunkEmitter::EmitLoadNonvolatileRegs() {\n  mov(rbx, qword[rsp + offsetof(StackLayout::Thunk, r[0])]);\n  mov(rbp, qword[rsp + offsetof(StackLayout::Thunk, r[1])]);\n#if XE_PLATFORM_WIN32\n  mov(rcx, qword[rsp + offsetof(StackLayout::Thunk, r[2])]);\n  mov(rsi, qword[rsp + offsetof(StackLayout::Thunk, r[3])]);\n  mov(rdi, qword[rsp + offsetof(StackLayout::Thunk, r[4])]);\n#endif\n  mov(r12, qword[rsp + offsetof(StackLayout::Thunk, r[5])]);\n  mov(r13, qword[rsp + offsetof(StackLayout::Thunk, r[6])]);\n  mov(r14, qword[rsp + offsetof(StackLayout::Thunk, r[7])]);\n  mov(r15, qword[rsp + offsetof(StackLayout::Thunk, r[8])]);\n\n#if XE_PLATFORM_WIN32\n  vmovaps(xmm6, qword[rsp + offsetof(StackLayout::Thunk, xmm[0])]);\n  vmovaps(xmm7, qword[rsp + offsetof(StackLayout::Thunk, xmm[1])]);\n  vmovaps(xmm8, qword[rsp + offsetof(StackLayout::Thunk, xmm[2])]);\n  vmovaps(xmm9, qword[rsp + offsetof(StackLayout::Thunk, xmm[3])]);\n  vmovaps(xmm10, qword[rsp + offsetof(StackLayout::Thunk, xmm[4])]);\n  vmovaps(xmm11, qword[rsp + offsetof(StackLayout::Thunk, xmm[5])]);\n  vmovaps(xmm12, qword[rsp + offsetof(StackLayout::Thunk, xmm[6])]);\n  vmovaps(xmm13, qword[rsp + offsetof(StackLayout::Thunk, xmm[7])]);\n  vmovaps(xmm14, qword[rsp + offsetof(StackLayout::Thunk, xmm[8])]);\n  vmovaps(xmm15, qword[rsp + offsetof(StackLayout::Thunk, xmm[9])]);\n#endif\n}\n\n}  // namespace x64\n}  // namespace backend\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/backend/x64/x64_backend.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_BACKEND_X64_X64_BACKEND_H_\n#define XENIA_CPU_BACKEND_X64_X64_BACKEND_H_\n\n#include <memory>\n\n#include \"xenia/base/cvar.h\"\n#include \"xenia/cpu/backend/backend.h\"\n\nDECLARE_int32(x64_extension_mask);\n\nnamespace xe {\nclass Exception;\n}  // namespace xe\nnamespace xe {\nnamespace cpu {\nnamespace backend {\nnamespace x64 {\n\nclass X64CodeCache;\n\ntypedef void* (*HostToGuestThunk)(void* target, void* arg0, void* arg1);\ntypedef void* (*GuestToHostThunk)(void* target, void* arg0, void* arg1);\ntypedef void (*ResolveFunctionThunk)();\n\nclass X64Backend : public Backend {\n public:\n  static const uint32_t kForceReturnAddress = 0x9FFF0000u;\n\n  explicit X64Backend();\n  ~X64Backend() override;\n\n  X64CodeCache* code_cache() const { return code_cache_.get(); }\n  uintptr_t emitter_data() const { return emitter_data_; }\n\n  // Call a generated function, saving all stack parameters.\n  HostToGuestThunk host_to_guest_thunk() const { return host_to_guest_thunk_; }\n  // Function that guest code can call to transition into host code.\n  GuestToHostThunk guest_to_host_thunk() const { return guest_to_host_thunk_; }\n  // Function that thunks to the ResolveFunction in X64Emitter.\n  ResolveFunctionThunk resolve_function_thunk() const {\n    return resolve_function_thunk_;\n  }\n\n  bool Initialize(Processor* processor) override;\n\n  void CommitExecutableRange(uint32_t guest_low, uint32_t guest_high) override;\n\n  std::unique_ptr<Assembler> CreateAssembler() override;\n\n  std::unique_ptr<GuestFunction> CreateGuestFunction(Module* module,\n                                                     uint32_t address) override;\n\n  uint64_t CalculateNextHostInstruction(ThreadDebugInfo* thread_info,\n                                        uint64_t current_pc) override;\n\n  void InstallBreakpoint(Breakpoint* breakpoint) override;\n  void InstallBreakpoint(Breakpoint* breakpoint, Function* fn) override;\n  void UninstallBreakpoint(Breakpoint* breakpoint) override;\n\n private:\n  static bool ExceptionCallbackThunk(Exception* ex, void* data);\n  bool ExceptionCallback(Exception* ex);\n\n  uintptr_t capstone_handle_ = 0;\n\n  std::unique_ptr<X64CodeCache> code_cache_;\n  uintptr_t emitter_data_ = 0;\n\n  HostToGuestThunk host_to_guest_thunk_;\n  GuestToHostThunk guest_to_host_thunk_;\n  ResolveFunctionThunk resolve_function_thunk_;\n};\n\n}  // namespace x64\n}  // namespace backend\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_BACKEND_X64_X64_BACKEND_H_\n"
  },
  {
    "path": "src/xenia/cpu/backend/x64/x64_code_cache.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/backend/x64/x64_code_cache.h\"\n\n#include <cstdlib>\n#include <cstring>\n\n#if ENABLE_VTUNE\n#include \"third_party/vtune/include/jitprofiling.h\"\n#pragma comment(lib, \"../third_party/vtune/lib64/jitprofiling.lib\")\n#endif\n\n#include \"third_party/fmt/include/fmt/format.h\"\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/clock.h\"\n#include \"xenia/base/literals.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/memory.h\"\n#include \"xenia/cpu/function.h\"\n#include \"xenia/cpu/module.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace backend {\nnamespace x64 {\n\nusing namespace xe::literals;\n\nX64CodeCache::X64CodeCache() = default;\n\nX64CodeCache::~X64CodeCache() {\n  if (indirection_table_base_) {\n    xe::memory::DeallocFixed(indirection_table_base_, 0,\n                             xe::memory::DeallocationType::kRelease);\n  }\n\n  // Unmap all views and close mapping.\n  if (mapping_ != xe::memory::kFileMappingHandleInvalid) {\n    if (generated_code_write_base_ &&\n        generated_code_write_base_ != generated_code_execute_base_) {\n      xe::memory::UnmapFileView(mapping_, generated_code_write_base_,\n                                kGeneratedCodeSize);\n    }\n    if (generated_code_execute_base_) {\n      xe::memory::UnmapFileView(mapping_, generated_code_execute_base_,\n                                kGeneratedCodeSize);\n    }\n    xe::memory::CloseFileMappingHandle(mapping_, file_name_);\n    mapping_ = xe::memory::kFileMappingHandleInvalid;\n  }\n}\n\nbool X64CodeCache::Initialize() {\n  indirection_table_base_ = reinterpret_cast<uint8_t*>(xe::memory::AllocFixed(\n      reinterpret_cast<void*>(kIndirectionTableBase), kIndirectionTableSize,\n      xe::memory::AllocationType::kReserve,\n      xe::memory::PageAccess::kReadWrite));\n  if (!indirection_table_base_) {\n    XELOGE(\"Unable to allocate code cache indirection table\");\n    XELOGE(\n        \"This is likely because the {:X}-{:X} range is in use by some other \"\n        \"system DLL\",\n        static_cast<uint64_t>(kIndirectionTableBase),\n        kIndirectionTableBase + kIndirectionTableSize);\n  }\n\n  // Create mmap file. This allows us to share the code cache with the debugger.\n  file_name_ = fmt::format(\"xenia_code_cache_{}\", Clock::QueryHostTickCount());\n  mapping_ = xe::memory::CreateFileMappingHandle(\n      file_name_, kGeneratedCodeSize, xe::memory::PageAccess::kExecuteReadWrite,\n      false);\n  if (mapping_ == xe::memory::kFileMappingHandleInvalid) {\n    XELOGE(\"Unable to create code cache mmap\");\n    return false;\n  }\n\n  // Map generated code region into the file. Pages are committed as required.\n  if (xe::memory::IsWritableExecutableMemoryPreferred()) {\n    generated_code_execute_base_ =\n        reinterpret_cast<uint8_t*>(xe::memory::MapFileView(\n            mapping_, reinterpret_cast<void*>(kGeneratedCodeExecuteBase),\n            kGeneratedCodeSize, xe::memory::PageAccess::kExecuteReadWrite, 0));\n    generated_code_write_base_ = generated_code_execute_base_;\n    if (!generated_code_execute_base_ || !generated_code_write_base_) {\n      XELOGE(\"Unable to allocate code cache generated code storage\");\n      XELOGE(\n          \"This is likely because the {:X}-{:X} range is in use by some other \"\n          \"system DLL\",\n          uint64_t(kGeneratedCodeExecuteBase),\n          uint64_t(kGeneratedCodeExecuteBase + kGeneratedCodeSize));\n      return false;\n    }\n  } else {\n    generated_code_execute_base_ =\n        reinterpret_cast<uint8_t*>(xe::memory::MapFileView(\n            mapping_, reinterpret_cast<void*>(kGeneratedCodeExecuteBase),\n            kGeneratedCodeSize, xe::memory::PageAccess::kExecuteReadOnly, 0));\n    generated_code_write_base_ =\n        reinterpret_cast<uint8_t*>(xe::memory::MapFileView(\n            mapping_, reinterpret_cast<void*>(kGeneratedCodeWriteBase),\n            kGeneratedCodeSize, xe::memory::PageAccess::kReadWrite, 0));\n    if (!generated_code_execute_base_ || !generated_code_write_base_) {\n      XELOGE(\"Unable to allocate code cache generated code storage\");\n      XELOGE(\n          \"This is likely because the {:X}-{:X} and {:X}-{:X} ranges are in \"\n          \"use by some other system DLL\",\n          uint64_t(kGeneratedCodeExecuteBase),\n          uint64_t(kGeneratedCodeExecuteBase + kGeneratedCodeSize),\n          uint64_t(kGeneratedCodeWriteBase),\n          uint64_t(kGeneratedCodeWriteBase + kGeneratedCodeSize));\n      return false;\n    }\n  }\n\n  // Preallocate the function map to a large, reasonable size.\n  generated_code_map_.reserve(kMaximumFunctionCount);\n\n  return true;\n}\n\nvoid X64CodeCache::set_indirection_default(uint32_t default_value) {\n  indirection_default_value_ = default_value;\n}\n\nvoid X64CodeCache::AddIndirection(uint32_t guest_address,\n                                  uint32_t host_address) {\n  if (!indirection_table_base_) {\n    return;\n  }\n\n  uint32_t* indirection_slot = reinterpret_cast<uint32_t*>(\n      indirection_table_base_ + (guest_address - kIndirectionTableBase));\n  *indirection_slot = host_address;\n}\n\nvoid X64CodeCache::CommitExecutableRange(uint32_t guest_low,\n                                         uint32_t guest_high) {\n  if (!indirection_table_base_) {\n    return;\n  }\n\n  // Commit the memory.\n  xe::memory::AllocFixed(\n      indirection_table_base_ + (guest_low - kIndirectionTableBase),\n      guest_high - guest_low, xe::memory::AllocationType::kCommit,\n      xe::memory::PageAccess::kReadWrite);\n\n  // Fill memory with the default value.\n  uint32_t* p = reinterpret_cast<uint32_t*>(indirection_table_base_);\n  for (uint32_t address = guest_low; address < guest_high; ++address) {\n    p[(address - kIndirectionTableBase) / 4] = indirection_default_value_;\n  }\n}\n\nvoid X64CodeCache::PlaceHostCode(uint32_t guest_address, void* machine_code,\n                                 const EmitFunctionInfo& func_info,\n                                 void*& code_execute_address_out,\n                                 void*& code_write_address_out) {\n  // Same for now. We may use different pools or whatnot later on, like when\n  // we only want to place guest code in a serialized cache on disk.\n  PlaceGuestCode(guest_address, machine_code, func_info, nullptr,\n                 code_execute_address_out, code_write_address_out);\n}\n\nvoid X64CodeCache::PlaceGuestCode(uint32_t guest_address, void* machine_code,\n                                  const EmitFunctionInfo& func_info,\n                                  GuestFunction* function_info,\n                                  void*& code_execute_address_out,\n                                  void*& code_write_address_out) {\n  // Hold a lock while we bump the pointers up. This is important as the\n  // unwind table requires entries AND code to be sorted in order.\n  size_t low_mark;\n  size_t high_mark;\n  uint8_t* code_execute_address;\n  UnwindReservation unwind_reservation;\n  {\n    auto global_lock = global_critical_region_.Acquire();\n\n    low_mark = generated_code_offset_;\n\n    // Reserve code.\n    // Always move the code to land on 16b alignment.\n    code_execute_address =\n        generated_code_execute_base_ + generated_code_offset_;\n    code_execute_address_out = code_execute_address;\n    uint8_t* code_write_address =\n        generated_code_write_base_ + generated_code_offset_;\n    code_write_address_out = code_write_address;\n    generated_code_offset_ += xe::round_up(func_info.code_size.total, 16);\n\n    auto tail_write_address =\n        generated_code_write_base_ + generated_code_offset_;\n\n    // Reserve unwind info.\n    // We go on the high size of the unwind info as we don't know how big we\n    // need it, and a few extra bytes of padding isn't the worst thing.\n    unwind_reservation = RequestUnwindReservation(generated_code_write_base_ +\n                                                  generated_code_offset_);\n    generated_code_offset_ += xe::round_up(unwind_reservation.data_size, 16);\n\n    auto end_write_address =\n        generated_code_write_base_ + generated_code_offset_;\n\n    high_mark = generated_code_offset_;\n\n    // Store in map. It is maintained in sorted order of host PC dependent on\n    // us also being append-only.\n    generated_code_map_.emplace_back(\n        (uint64_t(code_execute_address - generated_code_execute_base_) << 32) |\n            generated_code_offset_,\n        function_info);\n\n    // TODO(DrChat): The following code doesn't really need to be under the\n    // global lock except for PlaceCode (but it depends on the previous code\n    // already being ran)\n\n    // If we are going above the high water mark of committed memory, commit\n    // some more. It's ok if multiple threads do this, as redundant commits\n    // aren't harmful.\n    size_t old_commit_mark, new_commit_mark;\n    do {\n      old_commit_mark = generated_code_commit_mark_;\n      if (high_mark <= old_commit_mark) break;\n\n      new_commit_mark = old_commit_mark + 16_MiB;\n      if (generated_code_execute_base_ == generated_code_write_base_) {\n        xe::memory::AllocFixed(generated_code_execute_base_, new_commit_mark,\n                               xe::memory::AllocationType::kCommit,\n                               xe::memory::PageAccess::kExecuteReadWrite);\n      } else {\n        xe::memory::AllocFixed(generated_code_execute_base_, new_commit_mark,\n                               xe::memory::AllocationType::kCommit,\n                               xe::memory::PageAccess::kExecuteReadOnly);\n        xe::memory::AllocFixed(generated_code_write_base_, new_commit_mark,\n                               xe::memory::AllocationType::kCommit,\n                               xe::memory::PageAccess::kReadWrite);\n      }\n    } while (generated_code_commit_mark_.compare_exchange_weak(\n        old_commit_mark, new_commit_mark));\n\n    // Copy code.\n    std::memcpy(code_write_address, machine_code, func_info.code_size.total);\n\n    // Fill unused slots with 0xCC\n    std::memset(tail_write_address, 0xCC,\n                static_cast<size_t>(end_write_address - tail_write_address));\n\n    // Notify subclasses of placed code.\n    PlaceCode(guest_address, machine_code, func_info, code_execute_address,\n              unwind_reservation);\n  }\n\n#if ENABLE_VTUNE\n  if (iJIT_IsProfilingActive() == iJIT_SAMPLING_ON) {\n    std::string method_name;\n    if (function_info && function_info->name().size() != 0) {\n      method_name = function_info->name();\n    } else {\n      method_name = xe::format_string(\"sub_%.8X\", guest_address);\n    }\n\n    iJIT_Method_Load_V2 method = {0};\n    method.method_id = iJIT_GetNewMethodID();\n    method.method_load_address = code_execute_address;\n    method.method_size = uint32_t(code_size);\n    method.method_name = const_cast<char*>(method_name.data());\n    method.module_name = function_info\n                             ? (char*)function_info->module()->name().c_str()\n                             : nullptr;\n    iJIT_NotifyEvent(iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED_V2, (void*)&method);\n  }\n#endif\n\n  // Now that everything is ready, fix up the indirection table.\n  // Note that we do support code that doesn't have an indirection fixup, so\n  // ignore those when we see them.\n  if (guest_address && indirection_table_base_) {\n    uint32_t* indirection_slot = reinterpret_cast<uint32_t*>(\n        indirection_table_base_ + (guest_address - kIndirectionTableBase));\n    *indirection_slot =\n        uint32_t(reinterpret_cast<uint64_t>(code_execute_address));\n  }\n}\n\nuint32_t X64CodeCache::PlaceData(const void* data, size_t length) {\n  // Hold a lock while we bump the pointers up.\n  size_t high_mark;\n  uint8_t* data_address = nullptr;\n  {\n    auto global_lock = global_critical_region_.Acquire();\n\n    // Reserve code.\n    // Always move the code to land on 16b alignment.\n    data_address = generated_code_write_base_ + generated_code_offset_;\n    generated_code_offset_ += xe::round_up(length, 16);\n\n    high_mark = generated_code_offset_;\n  }\n\n  // If we are going above the high water mark of committed memory, commit some\n  // more. It's ok if multiple threads do this, as redundant commits aren't\n  // harmful.\n  size_t old_commit_mark, new_commit_mark;\n  do {\n    old_commit_mark = generated_code_commit_mark_;\n    if (high_mark <= old_commit_mark) break;\n\n    new_commit_mark = old_commit_mark + 16_MiB;\n    if (generated_code_execute_base_ == generated_code_write_base_) {\n      xe::memory::AllocFixed(generated_code_execute_base_, new_commit_mark,\n                             xe::memory::AllocationType::kCommit,\n                             xe::memory::PageAccess::kExecuteReadWrite);\n    } else {\n      xe::memory::AllocFixed(generated_code_execute_base_, new_commit_mark,\n                             xe::memory::AllocationType::kCommit,\n                             xe::memory::PageAccess::kExecuteReadOnly);\n      xe::memory::AllocFixed(generated_code_write_base_, new_commit_mark,\n                             xe::memory::AllocationType::kCommit,\n                             xe::memory::PageAccess::kReadWrite);\n    }\n  } while (generated_code_commit_mark_.compare_exchange_weak(old_commit_mark,\n                                                             new_commit_mark));\n\n  // Copy code.\n  std::memcpy(data_address, data, length);\n\n  return uint32_t(uintptr_t(data_address));\n}\n\nGuestFunction* X64CodeCache::LookupFunction(uint64_t host_pc) {\n  uint32_t key = uint32_t(host_pc - kGeneratedCodeExecuteBase);\n  void* fn_entry = std::bsearch(\n      &key, generated_code_map_.data(), generated_code_map_.size() + 1,\n      sizeof(std::pair<uint32_t, Function*>),\n      [](const void* key_ptr, const void* element_ptr) {\n        auto key = *reinterpret_cast<const uint32_t*>(key_ptr);\n        auto element =\n            reinterpret_cast<const std::pair<uint64_t, GuestFunction*>*>(\n                element_ptr);\n        if (key < (element->first >> 32)) {\n          return -1;\n        } else if (key > uint32_t(element->first)) {\n          return 1;\n        } else {\n          return 0;\n        }\n      });\n  if (fn_entry) {\n    return reinterpret_cast<const std::pair<uint64_t, GuestFunction*>*>(\n               fn_entry)\n        ->second;\n  } else {\n    return nullptr;\n  }\n}\n\n}  // namespace x64\n}  // namespace backend\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/backend/x64/x64_code_cache.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_BACKEND_X64_X64_CODE_CACHE_H_\n#define XENIA_CPU_BACKEND_X64_X64_CODE_CACHE_H_\n\n#include <atomic>\n#include <cstddef>\n#include <cstdint>\n#include <memory>\n#include <string>\n#include <utility>\n#include <vector>\n\n#include \"xenia/base/memory.h\"\n#include \"xenia/base/mutex.h\"\n#include \"xenia/cpu/backend/code_cache.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace backend {\nnamespace x64 {\n\nstruct EmitFunctionInfo {\n  struct _code_size {\n    size_t prolog;\n    size_t body;\n    size_t epilog;\n    size_t tail;\n    size_t total;\n  } code_size;\n  size_t prolog_stack_alloc_offset;  // offset of instruction after stack alloc\n  size_t stack_size;\n};\n\nclass X64CodeCache : public CodeCache {\n public:\n  ~X64CodeCache() override;\n\n  static std::unique_ptr<X64CodeCache> Create();\n\n  virtual bool Initialize();\n\n  const std::filesystem::path& file_name() const override { return file_name_; }\n  uintptr_t execute_base_address() const override {\n    return kGeneratedCodeExecuteBase;\n  }\n  size_t total_size() const override { return kGeneratedCodeSize; }\n\n  // TODO(benvanik): ELF serialization/etc\n  // TODO(benvanik): keep track of code blocks\n  // TODO(benvanik): padding/guards/etc\n\n  bool has_indirection_table() { return indirection_table_base_ != nullptr; }\n  void set_indirection_default(uint32_t default_value);\n  void AddIndirection(uint32_t guest_address, uint32_t host_address);\n\n  void CommitExecutableRange(uint32_t guest_low, uint32_t guest_high);\n\n  void PlaceHostCode(uint32_t guest_address, void* machine_code,\n                     const EmitFunctionInfo& func_info,\n                     void*& code_execute_address_out,\n                     void*& code_write_address_out);\n  void PlaceGuestCode(uint32_t guest_address, void* machine_code,\n                      const EmitFunctionInfo& func_info,\n                      GuestFunction* function_info,\n                      void*& code_execute_address_out,\n                      void*& code_write_address_out);\n  uint32_t PlaceData(const void* data, size_t length);\n\n  GuestFunction* LookupFunction(uint64_t host_pc) override;\n\n protected:\n  // All executable code falls within 0x80000000 to 0x9FFFFFFF, so we can\n  // only map enough for lookups within that range.\n  static const size_t kIndirectionTableSize = 0x1FFFFFFF;\n  static const uintptr_t kIndirectionTableBase = 0x80000000;\n  // The code range is 512MB, but we know the total code games will have is\n  // pretty small (dozens of mb at most) and our expansion is reasonablish\n  // so 256MB should be more than enough.\n  static const size_t kGeneratedCodeSize = 0x0FFFFFFF;\n  static const uintptr_t kGeneratedCodeExecuteBase = 0xA0000000;\n  // Used for writing when PageAccess::kExecuteReadWrite is not supported.\n  static const uintptr_t kGeneratedCodeWriteBase =\n      kGeneratedCodeExecuteBase + kGeneratedCodeSize + 1;\n\n  // This is picked to be high enough to cover whatever we can reasonably\n  // expect. If we hit issues with this it probably means some corner case\n  // in analysis triggering.\n  static const size_t kMaximumFunctionCount = 100000;\n\n  struct UnwindReservation {\n    size_t data_size = 0;\n    size_t table_slot = 0;\n    uint8_t* entry_address = 0;\n  };\n\n  X64CodeCache();\n\n  virtual UnwindReservation RequestUnwindReservation(uint8_t* entry_address) {\n    return UnwindReservation();\n  }\n  virtual void PlaceCode(uint32_t guest_address, void* machine_code,\n                         const EmitFunctionInfo& func_info,\n                         void* code_execute_address,\n                         UnwindReservation unwind_reservation) {}\n\n  std::filesystem::path file_name_;\n  xe::memory::FileMappingHandle mapping_ =\n      xe::memory::kFileMappingHandleInvalid;\n\n  // NOTE: the global critical region must be held when manipulating the offsets\n  // or counts of anything, to keep the tables consistent and ordered.\n  xe::global_critical_region global_critical_region_;\n\n  // Value that the indirection table will be initialized with upon commit.\n  uint32_t indirection_default_value_ = 0xFEEDF00D;\n\n  // Fixed at kIndirectionTableBase in host space, holding 4 byte pointers into\n  // the generated code table that correspond to the PPC functions in guest\n  // space.\n  uint8_t* indirection_table_base_ = nullptr;\n  // Fixed at kGeneratedCodeExecuteBase and holding all generated code, growing\n  // as needed.\n  uint8_t* generated_code_execute_base_ = nullptr;\n  // View of the memory that backs generated_code_execute_base_ when\n  // PageAccess::kExecuteReadWrite is not supported, for writing the generated\n  // code. Equals to generated_code_execute_base_ when it's supported.\n  uint8_t* generated_code_write_base_ = nullptr;\n  // Current offset to empty space in generated code.\n  size_t generated_code_offset_ = 0;\n  // Current high water mark of COMMITTED code.\n  std::atomic<size_t> generated_code_commit_mark_ = {0};\n  // Sorted map by host PC base offsets to source function info.\n  // This can be used to bsearch on host PC to find the guest function.\n  // The key is [start address | end address].\n  std::vector<std::pair<uint64_t, GuestFunction*>> generated_code_map_;\n};\n\n}  // namespace x64\n}  // namespace backend\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_BACKEND_X64_X64_CODE_CACHE_H_\n"
  },
  {
    "path": "src/xenia/cpu/backend/x64/x64_code_cache_posix.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2017 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/backend/x64/x64_code_cache.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace backend {\nnamespace x64 {\n\nclass PosixX64CodeCache : public X64CodeCache {\n public:\n  PosixX64CodeCache();\n  ~PosixX64CodeCache() override;\n\n  bool Initialize() override;\n\n  void* LookupUnwindInfo(uint64_t host_pc) override { return nullptr; }\n\n private:\n  /*\n  UnwindReservation RequestUnwindReservation(uint8_t* entry_address) override;\n  void PlaceCode(uint32_t guest_address, void* machine_code, size_t code_size,\n                 size_t stack_size, void* code_execute_address,\n                 UnwindReservation unwind_reservation) override;\n\n  void InitializeUnwindEntry(uint8_t* unwind_entry_address,\n                             size_t unwind_table_slot, void* code_address,\n                             size_t code_size, size_t stack_size);\n  */\n};\n\nstd::unique_ptr<X64CodeCache> X64CodeCache::Create() {\n  return std::make_unique<PosixX64CodeCache>();\n}\n\nPosixX64CodeCache::PosixX64CodeCache() = default;\nPosixX64CodeCache::~PosixX64CodeCache() = default;\n\nbool PosixX64CodeCache::Initialize() { return X64CodeCache::Initialize(); }\n\n}  // namespace x64\n}  // namespace backend\n}  // namespace cpu\n}  // namespace xe"
  },
  {
    "path": "src/xenia/cpu/backend/x64/x64_code_cache_win.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2019 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/backend/x64/x64_code_cache.h\"\n\n#include <cstdlib>\n#include <cstring>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/clock.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/memory.h\"\n#include \"xenia/base/platform_win.h\"\n#include \"xenia/cpu/function.h\"\n\n// Function pointer definitions\nusing FnRtlAddGrowableFunctionTable = decltype(&RtlAddGrowableFunctionTable);\nusing FnRtlGrowFunctionTable = decltype(&RtlGrowFunctionTable);\nusing FnRtlDeleteGrowableFunctionTable =\n    decltype(&RtlDeleteGrowableFunctionTable);\n\nnamespace xe {\nnamespace cpu {\nnamespace backend {\nnamespace x64 {\n\n// https://msdn.microsoft.com/en-us/library/ssa62fwe.aspx\ntypedef enum _UNWIND_OP_CODES {\n  UWOP_PUSH_NONVOL = 0, /* info == register number */\n  UWOP_ALLOC_LARGE,     /* no info, alloc size in next 2 slots */\n  UWOP_ALLOC_SMALL,     /* info == size of allocation / 8 - 1 */\n  UWOP_SET_FPREG,       /* no info, FP = RSP + UNWIND_INFO.FPRegOffset*16 */\n  UWOP_SAVE_NONVOL,     /* info == register number, offset in next slot */\n  UWOP_SAVE_NONVOL_FAR, /* info == register number, offset in next 2 slots */\n  UWOP_SAVE_XMM128,     /* info == XMM reg number, offset in next slot */\n  UWOP_SAVE_XMM128_FAR, /* info == XMM reg number, offset in next 2 slots */\n  UWOP_PUSH_MACHFRAME   /* info == 0: no error-code, 1: error-code */\n} UNWIND_CODE_OPS;\nclass UNWIND_REGISTER {\n public:\n  enum _ {\n    RAX = 0,\n    RCX = 1,\n    RDX = 2,\n    RBX = 3,\n    RSP = 4,\n    RBP = 5,\n    RSI = 6,\n    RDI = 7,\n    R8 = 8,\n    R9 = 9,\n    R10 = 10,\n    R11 = 11,\n    R12 = 12,\n    R13 = 13,\n    R14 = 14,\n    R15 = 15,\n  };\n};\n\ntypedef union _UNWIND_CODE {\n  struct {\n    uint8_t CodeOffset;\n    uint8_t UnwindOp : 4;\n    uint8_t OpInfo : 4;\n  };\n  USHORT FrameOffset;\n} UNWIND_CODE, *PUNWIND_CODE;\n\ntypedef struct _UNWIND_INFO {\n  uint8_t Version : 3;\n  uint8_t Flags : 5;\n  uint8_t SizeOfProlog;\n  uint8_t CountOfCodes;\n  uint8_t FrameRegister : 4;\n  uint8_t FrameOffset : 4;\n  UNWIND_CODE UnwindCode[1];\n  /*  UNWIND_CODE MoreUnwindCode[((CountOfCodes + 1) & ~1) - 1];\n   *   union {\n   *       OPTIONAL ULONG ExceptionHandler;\n   *       OPTIONAL ULONG FunctionEntry;\n   *   };\n   *   OPTIONAL ULONG ExceptionData[]; */\n} UNWIND_INFO, *PUNWIND_INFO;\n\n// Size of unwind info per function.\n// TODO(benvanik): move this to emitter.\nstatic const uint32_t kUnwindInfoSize =\n    sizeof(UNWIND_INFO) + (sizeof(UNWIND_CODE) * (6 - 1));\n\nclass Win32X64CodeCache : public X64CodeCache {\n public:\n  Win32X64CodeCache();\n  ~Win32X64CodeCache() override;\n\n  bool Initialize() override;\n\n  void* LookupUnwindInfo(uint64_t host_pc) override;\n\n private:\n  UnwindReservation RequestUnwindReservation(uint8_t* entry_address) override;\n  void PlaceCode(uint32_t guest_address, void* machine_code,\n                 const EmitFunctionInfo& func_info, void* code_execute_address,\n                 UnwindReservation unwind_reservation) override;\n\n  void InitializeUnwindEntry(uint8_t* unwind_entry_address,\n                             size_t unwind_table_slot,\n                             void* code_execute_address,\n                             const EmitFunctionInfo& func_info);\n\n  // Growable function table system handle.\n  void* unwind_table_handle_ = nullptr;\n  // Actual unwind table entries.\n  std::vector<RUNTIME_FUNCTION> unwind_table_;\n  // Current number of entries in the table.\n  std::atomic<uint32_t> unwind_table_count_ = {0};\n  // Does this version of Windows support growable funciton tables?\n  bool supports_growable_table_ = false;\n\n  FnRtlAddGrowableFunctionTable add_growable_table_ = nullptr;\n  FnRtlDeleteGrowableFunctionTable delete_growable_table_ = nullptr;\n  FnRtlGrowFunctionTable grow_table_ = nullptr;\n};\n\nstd::unique_ptr<X64CodeCache> X64CodeCache::Create() {\n  return std::make_unique<Win32X64CodeCache>();\n}\n\nWin32X64CodeCache::Win32X64CodeCache() = default;\n\nWin32X64CodeCache::~Win32X64CodeCache() {\n  if (supports_growable_table_) {\n    if (unwind_table_handle_) {\n      delete_growable_table_(unwind_table_handle_);\n    }\n  } else {\n    if (generated_code_execute_base_) {\n      RtlDeleteFunctionTable(reinterpret_cast<PRUNTIME_FUNCTION>(\n          reinterpret_cast<DWORD64>(generated_code_execute_base_) | 0x3));\n    }\n  }\n}\n\nbool Win32X64CodeCache::Initialize() {\n  if (!X64CodeCache::Initialize()) {\n    return false;\n  }\n\n  // Compute total number of unwind entries we should allocate.\n  // We don't support reallocing right now, so this should be high.\n  unwind_table_.resize(kMaximumFunctionCount);\n\n  // Check if this version of Windows supports growable function tables.\n  auto ntdll_handle = GetModuleHandleW(L\"ntdll.dll\");\n  if (!ntdll_handle) {\n    add_growable_table_ = nullptr;\n    delete_growable_table_ = nullptr;\n    grow_table_ = nullptr;\n  } else {\n    add_growable_table_ = (FnRtlAddGrowableFunctionTable)GetProcAddress(\n        ntdll_handle, \"RtlAddGrowableFunctionTable\");\n    delete_growable_table_ = (FnRtlDeleteGrowableFunctionTable)GetProcAddress(\n        ntdll_handle, \"RtlDeleteGrowableFunctionTable\");\n    grow_table_ = (FnRtlGrowFunctionTable)GetProcAddress(\n        ntdll_handle, \"RtlGrowFunctionTable\");\n  }\n  supports_growable_table_ =\n      add_growable_table_ && delete_growable_table_ && grow_table_;\n\n  // Create table and register with the system. It's empty now, but we'll grow\n  // it as functions are added.\n  if (supports_growable_table_) {\n    if (add_growable_table_(\n            &unwind_table_handle_, unwind_table_.data(), unwind_table_count_,\n            DWORD(unwind_table_.size()),\n            reinterpret_cast<ULONG_PTR>(generated_code_execute_base_),\n            reinterpret_cast<ULONG_PTR>(generated_code_execute_base_ +\n                                        kGeneratedCodeSize))) {\n      XELOGE(\"Unable to create unwind function table\");\n      return false;\n    }\n  } else {\n    // Install a callback that the debugger will use to lookup unwind info on\n    // demand.\n    if (!RtlInstallFunctionTableCallback(\n            reinterpret_cast<DWORD64>(generated_code_execute_base_) | 0x3,\n            reinterpret_cast<DWORD64>(generated_code_execute_base_),\n            kGeneratedCodeSize,\n            [](DWORD64 control_pc, PVOID context) {\n              auto code_cache = reinterpret_cast<Win32X64CodeCache*>(context);\n              return reinterpret_cast<PRUNTIME_FUNCTION>(\n                  code_cache->LookupUnwindInfo(control_pc));\n            },\n            this, nullptr)) {\n      XELOGE(\"Unable to install function table callback\");\n      return false;\n    }\n  }\n\n  return true;\n}\n\nWin32X64CodeCache::UnwindReservation\nWin32X64CodeCache::RequestUnwindReservation(uint8_t* entry_address) {\n  assert_false(unwind_table_count_ >= kMaximumFunctionCount);\n  UnwindReservation unwind_reservation;\n  unwind_reservation.data_size = xe::round_up(kUnwindInfoSize, 16);\n  unwind_reservation.table_slot = unwind_table_count_++;\n  unwind_reservation.entry_address = entry_address;\n  return unwind_reservation;\n}\n\nvoid Win32X64CodeCache::PlaceCode(uint32_t guest_address, void* machine_code,\n                                  const EmitFunctionInfo& func_info,\n                                  void* code_execute_address,\n                                  UnwindReservation unwind_reservation) {\n  // Add unwind info.\n  InitializeUnwindEntry(unwind_reservation.entry_address,\n                        unwind_reservation.table_slot, code_execute_address,\n                        func_info);\n\n  if (supports_growable_table_) {\n    // Notify that the unwind table has grown.\n    // We do this outside of the lock, but with the latest total count.\n    grow_table_(unwind_table_handle_, unwind_table_count_);\n  }\n\n  // This isn't needed on x64 (probably), but is convention.\n  // On UWP, FlushInstructionCache available starting from 10.0.16299.0.\n  // https://docs.microsoft.com/en-us/uwp/win32-and-com/win32-apis\n  FlushInstructionCache(GetCurrentProcess(), code_execute_address,\n                        func_info.code_size.total);\n}\n\nvoid Win32X64CodeCache::InitializeUnwindEntry(\n    uint8_t* unwind_entry_address, size_t unwind_table_slot,\n    void* code_execute_address, const EmitFunctionInfo& func_info) {\n  auto unwind_info = reinterpret_cast<UNWIND_INFO*>(unwind_entry_address);\n  UNWIND_CODE* unwind_code = nullptr;\n\n  assert_true(func_info.code_size.prolog < 256);  // needs to fit into a uint8_t\n  auto prolog_size = static_cast<uint8_t>(func_info.code_size.prolog);\n  assert_true(func_info.prolog_stack_alloc_offset <\n              256);  // needs to fit into a uint8_t\n  auto prolog_stack_alloc_offset =\n      static_cast<uint8_t>(func_info.prolog_stack_alloc_offset);\n\n  if (!func_info.stack_size) {\n    // https://docs.microsoft.com/en-us/cpp/build/exception-handling-x64#struct-unwind_info\n    unwind_info->Version = 1;\n    unwind_info->Flags = 0;\n    unwind_info->SizeOfProlog = prolog_size;\n    unwind_info->CountOfCodes = 0;\n    unwind_info->FrameRegister = 0;\n    unwind_info->FrameOffset = 0;\n  } else if (func_info.stack_size <= 128) {\n    // https://docs.microsoft.com/en-us/cpp/build/exception-handling-x64#struct-unwind_info\n    unwind_info->Version = 1;\n    unwind_info->Flags = 0;\n    unwind_info->SizeOfProlog = prolog_size;\n    unwind_info->CountOfCodes = 0;\n    unwind_info->FrameRegister = 0;\n    unwind_info->FrameOffset = 0;\n\n    // https://docs.microsoft.com/en-us/cpp/build/exception-handling-x64#struct-unwind_code\n    unwind_code = &unwind_info->UnwindCode[unwind_info->CountOfCodes++];\n    unwind_code->CodeOffset = prolog_stack_alloc_offset;\n    unwind_code->UnwindOp = UWOP_ALLOC_SMALL;\n    unwind_code->OpInfo = (func_info.stack_size / 8) - 1;\n  } else {\n    // TODO(benvanik): take as parameters?\n\n    // https://docs.microsoft.com/en-us/cpp/build/exception-handling-x64#struct-unwind_info\n    unwind_info->Version = 1;\n    unwind_info->Flags = 0;\n    unwind_info->SizeOfProlog = prolog_size;\n    unwind_info->CountOfCodes = 0;\n    unwind_info->FrameRegister = 0;\n    unwind_info->FrameOffset = 0;\n\n    // https://docs.microsoft.com/en-us/cpp/build/exception-handling-x64#struct-unwind_code\n    unwind_code = &unwind_info->UnwindCode[unwind_info->CountOfCodes++];\n    unwind_code->CodeOffset = prolog_stack_alloc_offset;\n    unwind_code->UnwindOp = UWOP_ALLOC_LARGE;\n    unwind_code->OpInfo = 0;  // One slot for size\n\n    assert_true((func_info.stack_size / 8) < 65536u);\n    unwind_code = &unwind_info->UnwindCode[unwind_info->CountOfCodes++];\n    unwind_code->FrameOffset = (USHORT)(func_info.stack_size) / 8;\n  }\n\n  if (unwind_info->CountOfCodes % 1) {\n    // Count of unwind codes must always be even.\n    std::memset(&unwind_info->UnwindCode[unwind_info->CountOfCodes + 1], 0,\n                sizeof(UNWIND_CODE));\n  }\n\n  // Add entry.\n  auto& fn_entry = unwind_table_[unwind_table_slot];\n  fn_entry.BeginAddress =\n      DWORD(reinterpret_cast<uint8_t*>(code_execute_address) -\n            generated_code_execute_base_);\n  fn_entry.EndAddress =\n      DWORD(fn_entry.BeginAddress + func_info.code_size.total);\n  fn_entry.UnwindData =\n      DWORD(unwind_entry_address - generated_code_execute_base_);\n}\n\nvoid* Win32X64CodeCache::LookupUnwindInfo(uint64_t host_pc) {\n  return std::bsearch(\n      &host_pc, unwind_table_.data(), unwind_table_count_,\n      sizeof(RUNTIME_FUNCTION),\n      [](const void* key_ptr, const void* element_ptr) {\n        auto key = *reinterpret_cast<const uintptr_t*>(key_ptr) -\n                   kGeneratedCodeExecuteBase;\n        auto element = reinterpret_cast<const RUNTIME_FUNCTION*>(element_ptr);\n        if (key < element->BeginAddress) {\n          return -1;\n        } else if (key > element->EndAddress) {\n          return 1;\n        } else {\n          return 0;\n        }\n      });\n}\n\n}  // namespace x64\n}  // namespace backend\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/backend/x64/x64_emitter.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/backend/x64/x64_emitter.h\"\n\n#include <stddef.h>\n\n#include <climits>\n#include <cstring>\n\n#include \"third_party/fmt/include/fmt/format.h\"\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/atomic.h\"\n#include \"xenia/base/debugging.h\"\n#include \"xenia/base/literals.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/memory.h\"\n#include \"xenia/base/profiling.h\"\n#include \"xenia/base/vec128.h\"\n#include \"xenia/cpu/backend/x64/x64_backend.h\"\n#include \"xenia/cpu/backend/x64/x64_code_cache.h\"\n#include \"xenia/cpu/backend/x64/x64_function.h\"\n#include \"xenia/cpu/backend/x64/x64_sequences.h\"\n#include \"xenia/cpu/backend/x64/x64_stack_layout.h\"\n#include \"xenia/cpu/cpu_flags.h\"\n#include \"xenia/cpu/function.h\"\n#include \"xenia/cpu/function_debug_info.h\"\n#include \"xenia/cpu/processor.h\"\n#include \"xenia/cpu/symbol.h\"\n#include \"xenia/cpu/thread_state.h\"\n\nDEFINE_bool(debugprint_trap_log, false,\n            \"Log debugprint traps to the active debugger\", \"CPU\");\nDEFINE_bool(ignore_undefined_externs, true,\n            \"Don't exit when an undefined extern is called.\", \"CPU\");\nDEFINE_bool(emit_source_annotations, false,\n            \"Add extra movs and nops to make disassembly easier to read.\",\n            \"CPU\");\n\nnamespace xe {\nnamespace cpu {\nnamespace backend {\nnamespace x64 {\n\nusing xe::cpu::hir::HIRBuilder;\nusing xe::cpu::hir::Instr;\nusing namespace xe::literals;\n\nstatic const size_t kMaxCodeSize = 1_MiB;\n\nstatic const size_t kStashOffset = 32;\n// static const size_t kStashOffsetHigh = 32 + 32;\n\nconst uint32_t X64Emitter::gpr_reg_map_[X64Emitter::GPR_COUNT] = {\n    Xbyak::Operand::RBX, Xbyak::Operand::R10, Xbyak::Operand::R11,\n    Xbyak::Operand::R12, Xbyak::Operand::R13, Xbyak::Operand::R14,\n    Xbyak::Operand::R15,\n};\n\nconst uint32_t X64Emitter::xmm_reg_map_[X64Emitter::XMM_COUNT] = {\n    4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,\n};\n\nX64Emitter::X64Emitter(X64Backend* backend, XbyakAllocator* allocator)\n    : CodeGenerator(kMaxCodeSize, Xbyak::AutoGrow, allocator),\n      processor_(backend->processor()),\n      backend_(backend),\n      code_cache_(backend->code_cache()),\n      allocator_(allocator) {\n  if (!cpu_.has(Xbyak::util::Cpu::tAVX)) {\n    xe::FatalError(\n        \"Your CPU does not support AVX, which is required by Xenia. See the \"\n        \"FAQ for system requirements at https://xenia.jp\");\n    return;\n  }\n\n#define TEST_EMIT_FEATURE(emit, ext)                \\\n  if ((cvars::x64_extension_mask & emit) == emit) { \\\n    feature_flags_ |= (cpu_.has(ext) ? emit : 0);   \\\n  }\n\n  TEST_EMIT_FEATURE(kX64EmitAVX2, Xbyak::util::Cpu::tAVX2);\n  TEST_EMIT_FEATURE(kX64EmitFMA, Xbyak::util::Cpu::tFMA);\n  TEST_EMIT_FEATURE(kX64EmitLZCNT, Xbyak::util::Cpu::tLZCNT);\n  TEST_EMIT_FEATURE(kX64EmitBMI1, Xbyak::util::Cpu::tBMI1);\n  TEST_EMIT_FEATURE(kX64EmitBMI2, Xbyak::util::Cpu::tBMI2);\n  TEST_EMIT_FEATURE(kX64EmitF16C, Xbyak::util::Cpu::tF16C);\n  TEST_EMIT_FEATURE(kX64EmitMovbe, Xbyak::util::Cpu::tMOVBE);\n  TEST_EMIT_FEATURE(kX64EmitGFNI, Xbyak::util::Cpu::tGFNI);\n  TEST_EMIT_FEATURE(kX64EmitAVX512F, Xbyak::util::Cpu::tAVX512F);\n  TEST_EMIT_FEATURE(kX64EmitAVX512VL, Xbyak::util::Cpu::tAVX512VL);\n  TEST_EMIT_FEATURE(kX64EmitAVX512BW, Xbyak::util::Cpu::tAVX512BW);\n  TEST_EMIT_FEATURE(kX64EmitAVX512DQ, Xbyak::util::Cpu::tAVX512DQ);\n  TEST_EMIT_FEATURE(kX64EmitAVX512VBMI, Xbyak::util::Cpu::tAVX512_VBMI);\n\n#undef TEST_EMIT_FEATURE\n}\n\nX64Emitter::~X64Emitter() = default;\n\nbool X64Emitter::Emit(GuestFunction* function, HIRBuilder* builder,\n                      uint32_t debug_info_flags, FunctionDebugInfo* debug_info,\n                      void** out_code_address, size_t* out_code_size,\n                      std::vector<SourceMapEntry>* out_source_map) {\n  SCOPE_profile_cpu_f(\"cpu\");\n\n  // Reset.\n  debug_info_ = debug_info;\n  debug_info_flags_ = debug_info_flags;\n  trace_data_ = &function->trace_data();\n  source_map_arena_.Reset();\n\n  // Fill the generator with code.\n  EmitFunctionInfo func_info = {};\n  if (!Emit(builder, func_info)) {\n    return false;\n  }\n\n  // Copy the final code to the cache and relocate it.\n  *out_code_size = getSize();\n  *out_code_address = Emplace(func_info, function);\n\n  // Stash source map.\n  source_map_arena_.CloneContents(out_source_map);\n\n  return true;\n}\n\nvoid* X64Emitter::Emplace(const EmitFunctionInfo& func_info,\n                          GuestFunction* function) {\n  // To avoid changing xbyak, we do a switcharoo here.\n  // top_ points to the Xbyak buffer, and since we are in AutoGrow mode\n  // it has pending relocations. We copy the top_ to our buffer, swap the\n  // pointer, relocate, then return the original scratch pointer for use.\n  // top_ is used by Xbyak's ready() as both write base pointer and the absolute\n  // address base, which would not work on platforms not supporting writable\n  // executable memory, but Xenia doesn't use absolute label addresses in the\n  // generated code.\n  uint8_t* old_address = top_;\n  void* new_execute_address;\n  void* new_write_address;\n  assert_true(func_info.code_size.total == size_);\n  if (function) {\n    code_cache_->PlaceGuestCode(function->address(), top_, func_info, function,\n                                new_execute_address, new_write_address);\n  } else {\n    code_cache_->PlaceHostCode(0, top_, func_info, new_execute_address,\n                               new_write_address);\n  }\n  top_ = reinterpret_cast<uint8_t*>(new_write_address);\n  ready();\n  top_ = old_address;\n  reset();\n  return new_execute_address;\n}\n\nbool X64Emitter::Emit(HIRBuilder* builder, EmitFunctionInfo& func_info) {\n  Xbyak::Label epilog_label;\n  epilog_label_ = &epilog_label;\n\n  // Calculate stack size. We need to align things to their natural sizes.\n  // This could be much better (sort by type/etc).\n  auto locals = builder->locals();\n  size_t stack_offset = StackLayout::GUEST_STACK_SIZE;\n  for (auto it = locals.begin(); it != locals.end(); ++it) {\n    auto slot = *it;\n    size_t type_size = GetTypeSize(slot->type);\n\n    // Align to natural size.\n    stack_offset = xe::align(stack_offset, type_size);\n    slot->set_constant((uint32_t)stack_offset);\n    stack_offset += type_size;\n  }\n\n  // Ensure 16b alignment.\n  stack_offset -= StackLayout::GUEST_STACK_SIZE;\n  stack_offset = xe::align(stack_offset, static_cast<size_t>(16));\n\n  struct _code_offsets {\n    size_t prolog;\n    size_t prolog_stack_alloc;\n    size_t body;\n    size_t epilog;\n    size_t tail;\n  } code_offsets = {};\n\n  code_offsets.prolog = getSize();\n\n  // Function prolog.\n  // Must be 16b aligned.\n  // Windows is very strict about the form of this and the epilog:\n  // https://docs.microsoft.com/en-us/cpp/build/prolog-and-epilog?view=vs-2017\n  // IMPORTANT: any changes to the prolog must be kept in sync with\n  //     X64CodeCache, which dynamically generates exception information.\n  //     Adding or changing anything here must be matched!\n  const size_t stack_size = StackLayout::GUEST_STACK_SIZE + stack_offset;\n  assert_true((stack_size + 8) % 16 == 0);\n  func_info.stack_size = stack_size;\n  stack_size_ = stack_size;\n\n  sub(rsp, (uint32_t)stack_size);\n\n  code_offsets.prolog_stack_alloc = getSize();\n  code_offsets.body = getSize();\n\n  mov(qword[rsp + StackLayout::GUEST_CTX_HOME], GetContextReg());\n  mov(qword[rsp + StackLayout::GUEST_RET_ADDR], rcx);\n  mov(qword[rsp + StackLayout::GUEST_CALL_RET_ADDR], 0);\n\n  // Safe now to do some tracing.\n  if (debug_info_flags_ & DebugInfoFlags::kDebugInfoTraceFunctions) {\n    // We require 32-bit addresses.\n    assert_true(uint64_t(trace_data_->header()) < UINT_MAX);\n    auto trace_header = trace_data_->header();\n\n    // Call count.\n    lock();\n    inc(qword[low_address(&trace_header->function_call_count)]);\n\n    // Get call history slot.\n    static_assert(FunctionTraceData::kFunctionCallerHistoryCount == 4,\n                  \"bitmask depends on count\");\n    mov(rax, qword[low_address(&trace_header->function_call_count)]);\n    and_(rax, 0b00000011);\n\n    // Record call history value into slot (guest addr in RDX).\n    mov(dword[Xbyak::RegExp(uint32_t(uint64_t(\n                  low_address(&trace_header->function_caller_history)))) +\n              rax * 4],\n        edx);\n\n    // Calling thread. Load ax with thread ID.\n    EmitGetCurrentThreadId();\n    lock();\n    bts(qword[low_address(&trace_header->function_thread_use)], rax);\n  }\n\n  // Load membase.\n  mov(GetMembaseReg(),\n      qword[GetContextReg() + offsetof(ppc::PPCContext, virtual_membase)]);\n\n  // Body.\n  auto block = builder->first_block();\n  while (block) {\n    // Mark block labels.\n    auto label = block->label_head;\n    while (label) {\n      L(label->name);\n      label = label->next;\n    }\n\n    // Process instructions.\n    const Instr* instr = block->instr_head;\n    while (instr) {\n      const Instr* new_tail = instr;\n      if (!SelectSequence(this, instr, &new_tail)) {\n        // No sequence found!\n        // NOTE: If you encounter this after adding a new instruction, do a full\n        // rebuild!\n        assert_always();\n        XELOGE(\"Unable to process HIR opcode {}\", instr->opcode->name);\n        break;\n      }\n      instr = new_tail;\n    }\n\n    block = block->next;\n  }\n\n  // Function epilog.\n  L(epilog_label);\n  epilog_label_ = nullptr;\n  EmitTraceUserCallReturn();\n  mov(GetContextReg(), qword[rsp + StackLayout::GUEST_CTX_HOME]);\n\n  code_offsets.epilog = getSize();\n\n  add(rsp, (uint32_t)stack_size);\n  ret();\n\n  code_offsets.tail = getSize();\n\n  if (cvars::emit_source_annotations) {\n    nop();\n    nop();\n    nop();\n    nop();\n    nop();\n  }\n\n  assert_zero(code_offsets.prolog);\n  func_info.code_size.total = getSize();\n  func_info.code_size.prolog = code_offsets.body - code_offsets.prolog;\n  func_info.code_size.body = code_offsets.epilog - code_offsets.body;\n  func_info.code_size.epilog = code_offsets.tail - code_offsets.epilog;\n  func_info.code_size.tail = getSize() - code_offsets.tail;\n  func_info.prolog_stack_alloc_offset =\n      code_offsets.prolog_stack_alloc - code_offsets.prolog;\n\n  return true;\n}\n\nvoid X64Emitter::MarkSourceOffset(const Instr* i) {\n  auto entry = source_map_arena_.Alloc<SourceMapEntry>();\n  entry->guest_address = static_cast<uint32_t>(i->src1.offset);\n  entry->hir_offset = uint32_t(i->block->ordinal << 16) | i->ordinal;\n  entry->code_offset = static_cast<uint32_t>(getSize());\n\n  if (cvars::emit_source_annotations) {\n    nop();\n    nop();\n    mov(eax, entry->guest_address);\n    nop();\n    nop();\n  }\n\n  if (debug_info_flags_ & DebugInfoFlags::kDebugInfoTraceFunctionCoverage) {\n    uint32_t instruction_index =\n        (entry->guest_address - trace_data_->start_address()) / 4;\n    lock();\n    inc(qword[low_address(trace_data_->instruction_execute_counts() +\n                          instruction_index * 8)]);\n  }\n}\n\nvoid X64Emitter::EmitGetCurrentThreadId() {\n  // rsi must point to context. We could fetch from the stack if needed.\n  mov(ax, word[GetContextReg() + offsetof(ppc::PPCContext, thread_id)]);\n}\n\nvoid X64Emitter::EmitTraceUserCallReturn() {}\n\nvoid X64Emitter::DebugBreak() {\n  // TODO(benvanik): notify debugger.\n  db(0xCC);\n}\n\nuint64_t TrapDebugPrint(void* raw_context, uint64_t address) {\n  auto thread_state = *reinterpret_cast<ThreadState**>(raw_context);\n  uint32_t str_ptr = uint32_t(thread_state->context()->r[3]);\n  // uint16_t str_len = uint16_t(thread_state->context()->r[4]);\n  auto str = thread_state->memory()->TranslateVirtual<const char*>(str_ptr);\n  // TODO(benvanik): truncate to length?\n  XELOGD(\"(DebugPrint) {}\", str);\n\n  if (cvars::debugprint_trap_log) {\n    debugging::DebugPrint(\"(DebugPrint) {}\", str);\n  }\n\n  return 0;\n}\n\nuint64_t TrapDebugBreak(void* raw_context, uint64_t address) {\n  auto thread_state = *reinterpret_cast<ThreadState**>(raw_context);\n  XELOGE(\"tw/td forced trap hit! This should be a crash!\");\n  if (cvars::break_on_debugbreak) {\n    xe::debugging::Break();\n  }\n  return 0;\n}\n\nvoid X64Emitter::Trap(uint16_t trap_type) {\n  switch (trap_type) {\n    case 20:\n    case 26:\n      // 0x0FE00014 is a 'debug print' where r3 = buffer r4 = length\n      CallNative(TrapDebugPrint, 0);\n      break;\n    case 0:\n    case 22:\n      // Always trap?\n      // TODO(benvanik): post software interrupt to debugger.\n      CallNative(TrapDebugBreak, 0);\n      break;\n    case 25:\n      // ?\n      break;\n    default:\n      XELOGW(\"Unknown trap type {}\", trap_type);\n      db(0xCC);\n      break;\n  }\n}\n\nvoid X64Emitter::UnimplementedInstr(const hir::Instr* i) {\n  // TODO(benvanik): notify debugger.\n  db(0xCC);\n  assert_always();\n}\n\n// This is used by the X64ThunkEmitter's ResolveFunctionThunk.\nuint64_t ResolveFunction(void* raw_context, uint64_t target_address) {\n  auto thread_state = *reinterpret_cast<ThreadState**>(raw_context);\n\n  // TODO(benvanik): required?\n  assert_not_zero(target_address);\n\n  auto fn = thread_state->processor()->ResolveFunction(\n      static_cast<uint32_t>(target_address));\n  assert_not_null(fn);\n  auto x64_fn = static_cast<X64Function*>(fn);\n  uint64_t addr = reinterpret_cast<uint64_t>(x64_fn->machine_code());\n\n  return addr;\n}\n\nvoid X64Emitter::Call(const hir::Instr* instr, GuestFunction* function) {\n  assert_not_null(function);\n  auto fn = static_cast<X64Function*>(function);\n  // Resolve address to the function to call and store in rax.\n  if (fn->machine_code()) {\n    // TODO(benvanik): is it worth it to do this? It removes the need for\n    // a ResolveFunction call, but makes the table less useful.\n    assert_zero(uint64_t(fn->machine_code()) & 0xFFFFFFFF00000000);\n    mov(eax, uint32_t(uint64_t(fn->machine_code())));\n  } else if (code_cache_->has_indirection_table()) {\n    // Load the pointer to the indirection table maintained in X64CodeCache.\n    // The target dword will either contain the address of the generated code\n    // or a thunk to ResolveAddress.\n    mov(ebx, function->address());\n    mov(eax, dword[ebx]);\n  } else {\n    // Old-style resolve.\n    // Not too important because indirection table is almost always available.\n    // TODO: Overwrite the call-site with a straight call.\n    CallNative(&ResolveFunction, function->address());\n  }\n\n  // Actually jump/call to rax.\n  if (instr->flags & hir::CALL_TAIL) {\n    // Since we skip the prolog we need to mark the return here.\n    EmitTraceUserCallReturn();\n\n    // Pass the callers return address over.\n    mov(rcx, qword[rsp + StackLayout::GUEST_RET_ADDR]);\n\n    add(rsp, static_cast<uint32_t>(stack_size()));\n    jmp(rax);\n  } else {\n    // Return address is from the previous SET_RETURN_ADDRESS.\n    mov(rcx, qword[rsp + StackLayout::GUEST_CALL_RET_ADDR]);\n\n    call(rax);\n  }\n}\n\nvoid X64Emitter::CallIndirect(const hir::Instr* instr,\n                              const Xbyak::Reg64& reg) {\n  // Check if return.\n  if (instr->flags & hir::CALL_POSSIBLE_RETURN) {\n    cmp(reg.cvt32(), dword[rsp + StackLayout::GUEST_RET_ADDR]);\n    je(epilog_label(), CodeGenerator::T_NEAR);\n  }\n\n  // Load the pointer to the indirection table maintained in X64CodeCache.\n  // The target dword will either contain the address of the generated code\n  // or a thunk to ResolveAddress.\n  if (code_cache_->has_indirection_table()) {\n    if (reg.cvt32() != ebx) {\n      mov(ebx, reg.cvt32());\n    }\n    mov(eax, dword[ebx]);\n  } else {\n    // Old-style resolve.\n    // Not too important because indirection table is almost always available.\n    mov(edx, reg.cvt32());\n    mov(rax, reinterpret_cast<uint64_t>(ResolveFunction));\n    mov(rcx, GetContextReg());\n    call(rax);\n  }\n\n  // Actually jump/call to rax.\n  if (instr->flags & hir::CALL_TAIL) {\n    // Since we skip the prolog we need to mark the return here.\n    EmitTraceUserCallReturn();\n\n    // Pass the callers return address over.\n    mov(rcx, qword[rsp + StackLayout::GUEST_RET_ADDR]);\n\n    add(rsp, static_cast<uint32_t>(stack_size()));\n    jmp(rax);\n  } else {\n    // Return address is from the previous SET_RETURN_ADDRESS.\n    mov(rcx, qword[rsp + StackLayout::GUEST_CALL_RET_ADDR]);\n\n    call(rax);\n  }\n}\n\nuint64_t UndefinedCallExtern(void* raw_context, uint64_t function_ptr) {\n  auto function = reinterpret_cast<Function*>(function_ptr);\n  if (!cvars::ignore_undefined_externs) {\n    xe::FatalError(fmt::format(\"undefined extern call to {:08X} {}\",\n                               function->address(), function->name().c_str()));\n  } else {\n    XELOGE(\"undefined extern call to {:08X} {}\", function->address(),\n           function->name());\n  }\n  return 0;\n}\nvoid X64Emitter::CallExtern(const hir::Instr* instr, const Function* function) {\n  bool undefined = true;\n  if (function->behavior() == Function::Behavior::kBuiltin) {\n    auto builtin_function = static_cast<const BuiltinFunction*>(function);\n    if (builtin_function->handler()) {\n      undefined = false;\n      // rcx = target function\n      // rdx = arg0\n      // r8  = arg1\n      // r9  = arg2\n      auto thunk = backend()->guest_to_host_thunk();\n      mov(rax, reinterpret_cast<uint64_t>(thunk));\n      mov(rcx, reinterpret_cast<uint64_t>(builtin_function->handler()));\n      mov(rdx, reinterpret_cast<uint64_t>(builtin_function->arg0()));\n      mov(r8, reinterpret_cast<uint64_t>(builtin_function->arg1()));\n      call(rax);\n      // rax = host return\n    }\n  } else if (function->behavior() == Function::Behavior::kExtern) {\n    auto extern_function = static_cast<const GuestFunction*>(function);\n    if (extern_function->extern_handler()) {\n      undefined = false;\n      // rcx = target function\n      // rdx = arg0\n      // r8  = arg1\n      // r9  = arg2\n      auto thunk = backend()->guest_to_host_thunk();\n      mov(rax, reinterpret_cast<uint64_t>(thunk));\n      mov(rcx, reinterpret_cast<uint64_t>(extern_function->extern_handler()));\n      mov(rdx,\n          qword[GetContextReg() + offsetof(ppc::PPCContext, kernel_state)]);\n      call(rax);\n      // rax = host return\n    }\n  }\n  if (undefined) {\n    CallNative(UndefinedCallExtern, reinterpret_cast<uint64_t>(function));\n  }\n}\n\nvoid X64Emitter::CallNative(void* fn) { CallNativeSafe(fn); }\n\nvoid X64Emitter::CallNative(uint64_t (*fn)(void* raw_context)) {\n  CallNativeSafe(reinterpret_cast<void*>(fn));\n}\n\nvoid X64Emitter::CallNative(uint64_t (*fn)(void* raw_context, uint64_t arg0)) {\n  CallNativeSafe(reinterpret_cast<void*>(fn));\n}\n\nvoid X64Emitter::CallNative(uint64_t (*fn)(void* raw_context, uint64_t arg0),\n                            uint64_t arg0) {\n  mov(GetNativeParam(0), arg0);\n  CallNativeSafe(reinterpret_cast<void*>(fn));\n}\n\nvoid X64Emitter::CallNativeSafe(void* fn) {\n  // rcx = target function\n  // rdx = arg0\n  // r8  = arg1\n  // r9  = arg2\n  auto thunk = backend()->guest_to_host_thunk();\n  mov(rax, reinterpret_cast<uint64_t>(thunk));\n  mov(rcx, reinterpret_cast<uint64_t>(fn));\n  call(rax);\n  // rax = host return\n}\n\nvoid X64Emitter::SetReturnAddress(uint64_t value) {\n  mov(rax, value);\n  mov(qword[rsp + StackLayout::GUEST_CALL_RET_ADDR], rax);\n}\n\nXbyak::Reg64 X64Emitter::GetNativeParam(uint32_t param) {\n  if (param == 0)\n    return rdx;\n  else if (param == 1)\n    return r8;\n  else if (param == 2)\n    return r9;\n\n  assert_always();\n  return r9;\n}\n\n// Important: If you change these, you must update the thunks in x64_backend.cc!\nXbyak::Reg64 X64Emitter::GetContextReg() { return rsi; }\nXbyak::Reg64 X64Emitter::GetMembaseReg() { return rdi; }\n\nvoid X64Emitter::ReloadContext() {\n  mov(GetContextReg(), qword[rsp + StackLayout::GUEST_CTX_HOME]);\n}\n\nvoid X64Emitter::ReloadMembase() {\n  mov(GetMembaseReg(), qword[GetContextReg() + 8]);  // membase\n}\n\n// Len Assembly                                   Byte Sequence\n// ============================================================================\n// 1b  NOP                                        90H\n// 2b  66 NOP                                     66 90H\n// 3b  NOP DWORD ptr [EAX]                        0F 1F 00H\n// 4b  NOP DWORD ptr [EAX + 00H]                  0F 1F 40 00H\n// 5b  NOP DWORD ptr [EAX + EAX*1 + 00H]          0F 1F 44 00 00H\n// 6b  66 NOP DWORD ptr [EAX + EAX*1 + 00H]       66 0F 1F 44 00 00H\n// 7b  NOP DWORD ptr [EAX + 00000000H]            0F 1F 80 00 00 00 00H\n// 8b  NOP DWORD ptr [EAX + EAX*1 + 00000000H]    0F 1F 84 00 00 00 00 00H\n// 9b  66 NOP DWORD ptr [EAX + EAX*1 + 00000000H] 66 0F 1F 84 00 00 00 00 00H\nvoid X64Emitter::nop(size_t length) {\n  // TODO(benvanik): fat nop\n  for (size_t i = 0; i < length; ++i) {\n    db(0x90);\n  }\n}\n\nbool X64Emitter::ConstantFitsIn32Reg(uint64_t v) {\n  if ((v & ~0x7FFFFFFF) == 0) {\n    // Fits under 31 bits, so just load using normal mov.\n    return true;\n  } else if ((v & ~0x7FFFFFFF) == ~0x7FFFFFFF) {\n    // Negative number that fits in 32bits.\n    return true;\n  }\n  return false;\n}\n\nvoid X64Emitter::MovMem64(const Xbyak::RegExp& addr, uint64_t v) {\n  if ((v & ~0x7FFFFFFF) == 0) {\n    // Fits under 31 bits, so just load using normal mov.\n    mov(qword[addr], v);\n  } else if ((v & ~0x7FFFFFFF) == ~0x7FFFFFFF) {\n    // Negative number that fits in 32bits.\n    mov(qword[addr], v);\n  } else if (!(v >> 32)) {\n    // All high bits are zero. It'd be nice if we had a way to load a 32bit\n    // immediate without sign extending!\n    // TODO(benvanik): this is super common, find a better way.\n    mov(dword[addr], static_cast<uint32_t>(v));\n    mov(dword[addr + 4], 0);\n  } else {\n    // 64bit number that needs double movs.\n    mov(dword[addr], static_cast<uint32_t>(v));\n    mov(dword[addr + 4], static_cast<uint32_t>(v >> 32));\n  }\n}\n\nstatic const vec128_t xmm_consts[] = {\n    /* XMMZero                */ vec128f(0.0f),\n    /* XMMOne                 */ vec128f(1.0f),\n    /* XMMOnePD               */ vec128d(1.0),\n    /* XMMNegativeOne         */ vec128f(-1.0f, -1.0f, -1.0f, -1.0f),\n    /* XMMFFFF                */\n    vec128i(0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu),\n    /* XMMMaskX16Y16          */\n    vec128i(0x0000FFFFu, 0xFFFF0000u, 0x00000000u, 0x00000000u),\n    /* XMMFlipX16Y16          */\n    vec128i(0x00008000u, 0x00000000u, 0x00000000u, 0x00000000u),\n    /* XMMFixX16Y16           */ vec128f(-32768.0f, 0.0f, 0.0f, 0.0f),\n    /* XMMNormalizeX16Y16     */\n    vec128f(1.0f / 32767.0f, 1.0f / (32767.0f * 65536.0f), 0.0f, 0.0f),\n    /* XMM0001                */ vec128f(0.0f, 0.0f, 0.0f, 1.0f),\n    /* XMM3301                */ vec128f(3.0f, 3.0f, 0.0f, 1.0f),\n    /* XMM3331                */ vec128f(3.0f, 3.0f, 3.0f, 1.0f),\n    /* XMM3333                */ vec128f(3.0f, 3.0f, 3.0f, 3.0f),\n    /* XMMSignMaskPS          */\n    vec128i(0x80000000u, 0x80000000u, 0x80000000u, 0x80000000u),\n    /* XMMSignMaskPD          */\n    vec128i(0x00000000u, 0x80000000u, 0x00000000u, 0x80000000u),\n    /* XMMAbsMaskPS           */\n    vec128i(0x7FFFFFFFu, 0x7FFFFFFFu, 0x7FFFFFFFu, 0x7FFFFFFFu),\n    /* XMMAbsMaskPD           */\n    vec128i(0xFFFFFFFFu, 0x7FFFFFFFu, 0xFFFFFFFFu, 0x7FFFFFFFu),\n    /* XMMByteSwapMask        */\n    vec128i(0x00010203u, 0x04050607u, 0x08090A0Bu, 0x0C0D0E0Fu),\n    /* XMMByteOrderMask       */\n    vec128i(0x01000302u, 0x05040706u, 0x09080B0Au, 0x0D0C0F0Eu),\n    /* XMMPermuteControl15    */ vec128b(15),\n    /* XMMPermuteByteMask     */ vec128b(0x1F),\n    /* XMMPackD3DCOLORSat     */ vec128i(0x404000FFu),\n    /* XMMPackD3DCOLOR        */\n    vec128i(0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x0C000408u),\n    /* XMMUnpackD3DCOLOR      */\n    vec128i(0xFFFFFF0Eu, 0xFFFFFF0Du, 0xFFFFFF0Cu, 0xFFFFFF0Fu),\n    /* XMMPackFLOAT16_2       */\n    vec128i(0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x01000302u),\n    /* XMMUnpackFLOAT16_2     */\n    vec128i(0x0D0C0F0Eu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu),\n    /* XMMPackFLOAT16_4       */\n    vec128i(0xFFFFFFFFu, 0xFFFFFFFFu, 0x01000302u, 0x05040706u),\n    /* XMMUnpackFLOAT16_4     */\n    vec128i(0x09080B0Au, 0x0D0C0F0Eu, 0xFFFFFFFFu, 0xFFFFFFFFu),\n    /* XMMPackSHORT_Min       */ vec128i(0x403F8001u),\n    /* XMMPackSHORT_Max       */ vec128i(0x40407FFFu),\n    /* XMMPackSHORT_2         */\n    vec128i(0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x01000504u),\n    /* XMMPackSHORT_4         */\n    vec128i(0xFFFFFFFFu, 0xFFFFFFFFu, 0x01000504u, 0x09080D0Cu),\n    /* XMMUnpackSHORT_2       */\n    vec128i(0xFFFF0F0Eu, 0xFFFF0D0Cu, 0xFFFFFFFFu, 0xFFFFFFFFu),\n    /* XMMUnpackSHORT_4       */\n    vec128i(0xFFFF0B0Au, 0xFFFF0908u, 0xFFFF0F0Eu, 0xFFFF0D0Cu),\n    /* XMMUnpackSHORT_Overflow */ vec128i(0x403F8000u),\n    /* XMMPackUINT_2101010_MinUnpacked */\n    vec128i(0x403FFE01u, 0x403FFE01u, 0x403FFE01u, 0x40400000u),\n    /* XMMPackUINT_2101010_MaxUnpacked */\n    vec128i(0x404001FFu, 0x404001FFu, 0x404001FFu, 0x40400003u),\n    /* XMMPackUINT_2101010_MaskUnpacked */\n    vec128i(0x3FFu, 0x3FFu, 0x3FFu, 0x3u),\n    /* XMMPackUINT_2101010_MaskPacked */\n    vec128i(0x3FFu, 0x3FFu << 10, 0x3FFu << 20, 0x3u << 30),\n    /* XMMPackUINT_2101010_Shift */ vec128i(0, 10, 20, 30),\n    /* XMMUnpackUINT_2101010_Overflow */ vec128i(0x403FFE00u),\n    /* XMMPackULONG_4202020_MinUnpacked */\n    vec128i(0x40380001u, 0x40380001u, 0x40380001u, 0x40400000u),\n    /* XMMPackULONG_4202020_MaxUnpacked */\n    vec128i(0x4047FFFFu, 0x4047FFFFu, 0x4047FFFFu, 0x4040000Fu),\n    /* XMMPackULONG_4202020_MaskUnpacked */\n    vec128i(0xFFFFFu, 0xFFFFFu, 0xFFFFFu, 0xFu),\n    /* XMMPackULONG_4202020_PermuteXZ */\n    vec128i(0xFFFFFFFFu, 0xFFFFFFFFu, 0x0A0908FFu, 0xFF020100u),\n    /* XMMPackULONG_4202020_PermuteYW */\n    vec128i(0xFFFFFFFFu, 0xFFFFFFFFu, 0x0CFFFF06u, 0x0504FFFFu),\n    /* XMMUnpackULONG_4202020_Permute */\n    vec128i(0xFF0E0D0Cu, 0xFF0B0A09u, 0xFF080F0Eu, 0xFFFFFF0Bu),\n    /* XMMUnpackULONG_4202020_Overflow */ vec128i(0x40380000u),\n    /* XMMOneOver255          */ vec128f(1.0f / 255.0f),\n    /* XMMMaskEvenPI16        */\n    vec128i(0x0000FFFFu, 0x0000FFFFu, 0x0000FFFFu, 0x0000FFFFu),\n    /* XMMShiftMaskEvenPI16   */\n    vec128i(0x0000000Fu, 0x0000000Fu, 0x0000000Fu, 0x0000000Fu),\n    /* XMMShiftMaskPS         */\n    vec128i(0x0000001Fu, 0x0000001Fu, 0x0000001Fu, 0x0000001Fu),\n    /* XMMShiftByteMask       */\n    vec128i(0x000000FFu, 0x000000FFu, 0x000000FFu, 0x000000FFu),\n    /* XMMSwapWordMask        */\n    vec128i(0x03030303u, 0x03030303u, 0x03030303u, 0x03030303u),\n    /* XMMUnsignedDwordMax    */\n    vec128i(0xFFFFFFFFu, 0x00000000u, 0xFFFFFFFFu, 0x00000000u),\n    /* XMM255                 */ vec128f(255.0f),\n    /* XMMPI32                */ vec128i(32),\n    /* XMMSignMaskI8          */\n    vec128i(0x80808080u, 0x80808080u, 0x80808080u, 0x80808080u),\n    /* XMMSignMaskI16         */\n    vec128i(0x80008000u, 0x80008000u, 0x80008000u, 0x80008000u),\n    /* XMMSignMaskI32         */\n    vec128i(0x80000000u, 0x80000000u, 0x80000000u, 0x80000000u),\n    /* XMMSignMaskF32         */\n    vec128i(0x80000000u, 0x80000000u, 0x80000000u, 0x80000000u),\n    /* XMMShortMinPS          */ vec128f(SHRT_MIN),\n    /* XMMShortMaxPS          */ vec128f(SHRT_MAX),\n    /* XMMIntMin              */ vec128i(INT_MIN),\n    /* XMMIntMax              */ vec128i(INT_MAX),\n    /* XMMIntMaxPD            */ vec128d(INT_MAX),\n    /* XMMPosIntMinPS         */ vec128f((float)0x80000000u),\n    /* XMMQNaN                */ vec128i(0x7FC00000u),\n    /* XMMInt127              */ vec128i(0x7Fu),\n    /* XMM2To32               */ vec128f(0x1.0p32f),\n};\n\n// First location to try and place constants.\nstatic const uintptr_t kConstDataLocation = 0x20000000;\nstatic const uintptr_t kConstDataSize = sizeof(xmm_consts);\n\n// Increment the location by this amount for every allocation failure.\nstatic const uintptr_t kConstDataIncrement = 0x00001000;\n\n// This function places constant data that is used by the emitter later on.\n// Only called once and used by multiple instances of the emitter.\n//\n// TODO(DrChat): This should be placed in the code cache with the code, but\n// doing so requires RIP-relative addressing, which is difficult to support\n// given the current setup.\nuintptr_t X64Emitter::PlaceConstData() {\n  uint8_t* ptr = reinterpret_cast<uint8_t*>(kConstDataLocation);\n  void* mem = nullptr;\n  while (!mem) {\n    mem = memory::AllocFixed(\n        ptr, xe::round_up(kConstDataSize, memory::page_size()),\n        memory::AllocationType::kReserveCommit, memory::PageAccess::kReadWrite);\n\n    ptr += kConstDataIncrement;\n  }\n\n  // The pointer must not be greater than 31 bits.\n  assert_zero(reinterpret_cast<uintptr_t>(mem) & ~0x7FFFFFFF);\n  std::memcpy(mem, xmm_consts, sizeof(xmm_consts));\n  memory::Protect(mem, kConstDataSize, memory::PageAccess::kReadOnly, nullptr);\n\n  return reinterpret_cast<uintptr_t>(mem);\n}\n\nvoid X64Emitter::FreeConstData(uintptr_t data) {\n  memory::DeallocFixed(reinterpret_cast<void*>(data), 0,\n                       memory::DeallocationType::kRelease);\n}\n\nXbyak::Address X64Emitter::GetXmmConstPtr(XmmConst id) {\n  // Load through fixed constant table setup by PlaceConstData.\n  // It's important that the pointer is not signed, as it will be sign-extended.\n  return ptr[reinterpret_cast<void*>(backend_->emitter_data() +\n                                     sizeof(vec128_t) * id)];\n}\n\n// Implies possible StashXmm(0, ...)!\nvoid X64Emitter::LoadConstantXmm(Xbyak::Xmm dest, const vec128_t& v) {\n  // https://www.agner.org/optimize/optimizing_assembly.pdf\n  // 13.4 Generating constants\n  if (!v.low && !v.high) {\n    // 0000...\n    vpxor(dest, dest);\n  } else if (v.low == ~uint64_t(0) && v.high == ~uint64_t(0)) {\n    // 1111...\n    vpcmpeqb(dest, dest);\n  } else {\n    // TODO(benvanik): see what other common values are.\n    // TODO(benvanik): build constant table - 99% are reused.\n    MovMem64(rsp + kStashOffset, v.low);\n    MovMem64(rsp + kStashOffset + 8, v.high);\n    vmovdqa(dest, ptr[rsp + kStashOffset]);\n  }\n}\n\nvoid X64Emitter::LoadConstantXmm(Xbyak::Xmm dest, float v) {\n  union {\n    float f;\n    uint32_t i;\n  } x = {v};\n  if (!x.i) {\n    // +0.0f (but not -0.0f because it may be used to flip the sign via xor).\n    vpxor(dest, dest);\n  } else if (x.i == ~uint32_t(0)) {\n    // 1111...\n    vpcmpeqb(dest, dest);\n  } else {\n    // TODO(benvanik): see what other common values are.\n    // TODO(benvanik): build constant table - 99% are reused.\n    mov(eax, x.i);\n    vmovd(dest, eax);\n  }\n}\n\nvoid X64Emitter::LoadConstantXmm(Xbyak::Xmm dest, double v) {\n  union {\n    double d;\n    uint64_t i;\n  } x = {v};\n  if (!x.i) {\n    // +0.0 (but not -0.0 because it may be used to flip the sign via xor).\n    vpxor(dest, dest);\n  } else if (x.i == ~uint64_t(0)) {\n    // 1111...\n    vpcmpeqb(dest, dest);\n  } else {\n    // TODO(benvanik): see what other common values are.\n    // TODO(benvanik): build constant table - 99% are reused.\n    mov(rax, x.i);\n    vmovq(dest, rax);\n  }\n}\n\nXbyak::Address X64Emitter::StashXmm(int index, const Xbyak::Xmm& r) {\n  auto addr = ptr[rsp + kStashOffset + (index * 16)];\n  vmovups(addr, r);\n  return addr;\n}\n\nXbyak::Address X64Emitter::StashConstantXmm(int index, float v) {\n  union {\n    float f;\n    uint32_t i;\n  } x = {v};\n  auto addr = rsp + kStashOffset + (index * 16);\n  MovMem64(addr, x.i);\n  MovMem64(addr + 8, 0);\n  return ptr[addr];\n}\n\nXbyak::Address X64Emitter::StashConstantXmm(int index, double v) {\n  union {\n    double d;\n    uint64_t i;\n  } x = {v};\n  auto addr = rsp + kStashOffset + (index * 16);\n  MovMem64(addr, x.i);\n  MovMem64(addr + 8, 0);\n  return ptr[addr];\n}\n\nXbyak::Address X64Emitter::StashConstantXmm(int index, const vec128_t& v) {\n  auto addr = rsp + kStashOffset + (index * 16);\n  MovMem64(addr, v.low);\n  MovMem64(addr + 8, v.high);\n  return ptr[addr];\n}\n\n}  // namespace x64\n}  // namespace backend\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/backend/x64/x64_emitter.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_BACKEND_X64_X64_EMITTER_H_\n#define XENIA_CPU_BACKEND_X64_X64_EMITTER_H_\n\n#include <vector>\n\n#include \"xenia/base/arena.h\"\n#include \"xenia/cpu/function.h\"\n#include \"xenia/cpu/function_trace_data.h\"\n#include \"xenia/cpu/hir/hir_builder.h\"\n#include \"xenia/cpu/hir/instr.h\"\n#include \"xenia/cpu/hir/value.h\"\n#include \"xenia/memory.h\"\n\n// NOTE: must be included last as it expects windows.h to already be included.\n#include \"third_party/xbyak/xbyak/xbyak.h\"\n#include \"third_party/xbyak/xbyak/xbyak_util.h\"\n\nnamespace xe {\nnamespace cpu {\nclass Processor;\n}  // namespace cpu\n}  // namespace xe\n\nnamespace xe {\nnamespace cpu {\nnamespace backend {\nnamespace x64 {\n\nclass X64Backend;\nclass X64CodeCache;\n\nstruct EmitFunctionInfo;\n\nenum RegisterFlags {\n  REG_DEST = (1 << 0),\n  REG_ABCD = (1 << 1),\n};\n\nenum XmmConst {\n  XMMZero = 0,\n  XMMOne,\n  XMMOnePD,\n  XMMNegativeOne,\n  XMMFFFF,\n  XMMMaskX16Y16,\n  XMMFlipX16Y16,\n  XMMFixX16Y16,\n  XMMNormalizeX16Y16,\n  XMM0001,\n  XMM3301,\n  XMM3331,\n  XMM3333,\n  XMMSignMaskPS,\n  XMMSignMaskPD,\n  XMMAbsMaskPS,\n  XMMAbsMaskPD,\n  XMMByteSwapMask,\n  XMMByteOrderMask,\n  XMMPermuteControl15,\n  XMMPermuteByteMask,\n  XMMPackD3DCOLORSat,\n  XMMPackD3DCOLOR,\n  XMMUnpackD3DCOLOR,\n  XMMPackFLOAT16_2,\n  XMMUnpackFLOAT16_2,\n  XMMPackFLOAT16_4,\n  XMMUnpackFLOAT16_4,\n  XMMPackSHORT_Min,\n  XMMPackSHORT_Max,\n  XMMPackSHORT_2,\n  XMMPackSHORT_4,\n  XMMUnpackSHORT_2,\n  XMMUnpackSHORT_4,\n  XMMUnpackSHORT_Overflow,\n  XMMPackUINT_2101010_MinUnpacked,\n  XMMPackUINT_2101010_MaxUnpacked,\n  XMMPackUINT_2101010_MaskUnpacked,\n  XMMPackUINT_2101010_MaskPacked,\n  XMMPackUINT_2101010_Shift,\n  XMMUnpackUINT_2101010_Overflow,\n  XMMPackULONG_4202020_MinUnpacked,\n  XMMPackULONG_4202020_MaxUnpacked,\n  XMMPackULONG_4202020_MaskUnpacked,\n  XMMPackULONG_4202020_PermuteXZ,\n  XMMPackULONG_4202020_PermuteYW,\n  XMMUnpackULONG_4202020_Permute,\n  XMMUnpackULONG_4202020_Overflow,\n  XMMOneOver255,\n  XMMMaskEvenPI16,\n  XMMShiftMaskEvenPI16,\n  XMMShiftMaskPS,\n  XMMShiftByteMask,\n  XMMSwapWordMask,\n  XMMUnsignedDwordMax,\n  XMM255,\n  XMMPI32,\n  XMMSignMaskI8,\n  XMMSignMaskI16,\n  XMMSignMaskI32,\n  XMMSignMaskF32,\n  XMMShortMinPS,\n  XMMShortMaxPS,\n  XMMIntMin,\n  XMMIntMax,\n  XMMIntMaxPD,\n  XMMPosIntMinPS,\n  XMMQNaN,\n  XMMInt127,\n  XMM2To32,\n};\n\n// Unfortunately due to the design of xbyak we have to pass this to the ctor.\nclass XbyakAllocator : public Xbyak::Allocator {\n public:\n  virtual bool useProtect() const { return false; }\n};\n\nenum X64EmitterFeatureFlags {\n  kX64EmitAVX2 = 1 << 0,\n  kX64EmitFMA = 1 << 1,\n  kX64EmitLZCNT = 1 << 2,\n  kX64EmitBMI1 = 1 << 3,\n  kX64EmitBMI2 = 1 << 4,\n  kX64EmitF16C = 1 << 5,\n  kX64EmitMovbe = 1 << 6,\n  kX64EmitGFNI = 1 << 7,\n\n  kX64EmitAVX512F = 1 << 8,\n  kX64EmitAVX512VL = 1 << 9,\n\n  kX64EmitAVX512BW = 1 << 10,\n  kX64EmitAVX512DQ = 1 << 11,\n\n  kX64EmitAVX512VBMI = 1 << 12,\n\n  kX64EmitAVX512Ortho = kX64EmitAVX512F | kX64EmitAVX512VL,\n  kX64EmitAVX512Ortho64 = kX64EmitAVX512Ortho | kX64EmitAVX512DQ\n};\n\nclass X64Emitter : public Xbyak::CodeGenerator {\n public:\n  X64Emitter(X64Backend* backend, XbyakAllocator* allocator);\n  virtual ~X64Emitter();\n\n  Processor* processor() const { return processor_; }\n  X64Backend* backend() const { return backend_; }\n\n  static uintptr_t PlaceConstData();\n  static void FreeConstData(uintptr_t data);\n\n  bool Emit(GuestFunction* function, hir::HIRBuilder* builder,\n            uint32_t debug_info_flags, FunctionDebugInfo* debug_info,\n            void** out_code_address, size_t* out_code_size,\n            std::vector<SourceMapEntry>* out_source_map);\n\n public:\n  // Reserved:  rsp, rsi, rdi\n  // Scratch:   rax/rcx/rdx\n  //            xmm0-2\n  // Available: rbx, r10-r15\n  //            xmm4-xmm15 (save to get xmm3)\n  static const int GPR_COUNT = 7;\n  static const int XMM_COUNT = 12;\n\n  static void SetupReg(const hir::Value* v, Xbyak::Reg8& r) {\n    auto idx = gpr_reg_map_[v->reg.index];\n    r = Xbyak::Reg8(idx);\n  }\n  static void SetupReg(const hir::Value* v, Xbyak::Reg16& r) {\n    auto idx = gpr_reg_map_[v->reg.index];\n    r = Xbyak::Reg16(idx);\n  }\n  static void SetupReg(const hir::Value* v, Xbyak::Reg32& r) {\n    auto idx = gpr_reg_map_[v->reg.index];\n    r = Xbyak::Reg32(idx);\n  }\n  static void SetupReg(const hir::Value* v, Xbyak::Reg64& r) {\n    auto idx = gpr_reg_map_[v->reg.index];\n    r = Xbyak::Reg64(idx);\n  }\n  static void SetupReg(const hir::Value* v, Xbyak::Xmm& r) {\n    auto idx = xmm_reg_map_[v->reg.index];\n    r = Xbyak::Xmm(idx);\n  }\n\n  Xbyak::Label& epilog_label() { return *epilog_label_; }\n\n  void MarkSourceOffset(const hir::Instr* i);\n\n  void DebugBreak();\n  void Trap(uint16_t trap_type = 0);\n  void UnimplementedInstr(const hir::Instr* i);\n\n  void Call(const hir::Instr* instr, GuestFunction* function);\n  void CallIndirect(const hir::Instr* instr, const Xbyak::Reg64& reg);\n  void CallExtern(const hir::Instr* instr, const Function* function);\n  void CallNative(void* fn);\n  void CallNative(uint64_t (*fn)(void* raw_context));\n  void CallNative(uint64_t (*fn)(void* raw_context, uint64_t arg0));\n  void CallNative(uint64_t (*fn)(void* raw_context, uint64_t arg0),\n                  uint64_t arg0);\n  void CallNativeSafe(void* fn);\n  void SetReturnAddress(uint64_t value);\n\n  Xbyak::Reg64 GetNativeParam(uint32_t param);\n\n  Xbyak::Reg64 GetContextReg();\n  Xbyak::Reg64 GetMembaseReg();\n  void ReloadContext();\n  void ReloadMembase();\n\n  void nop(size_t length = 1);\n\n  // Moves a 64bit immediate into memory.\n  bool ConstantFitsIn32Reg(uint64_t v);\n  void MovMem64(const Xbyak::RegExp& addr, uint64_t v);\n\n  Xbyak::Address GetXmmConstPtr(XmmConst id);\n  void LoadConstantXmm(Xbyak::Xmm dest, float v);\n  void LoadConstantXmm(Xbyak::Xmm dest, double v);\n  void LoadConstantXmm(Xbyak::Xmm dest, const vec128_t& v);\n  Xbyak::Address StashXmm(int index, const Xbyak::Xmm& r);\n  Xbyak::Address StashConstantXmm(int index, float v);\n  Xbyak::Address StashConstantXmm(int index, double v);\n  Xbyak::Address StashConstantXmm(int index, const vec128_t& v);\n\n  bool IsFeatureEnabled(uint32_t feature_flag) const {\n    return (feature_flags_ & feature_flag) == feature_flag;\n  }\n\n  FunctionDebugInfo* debug_info() const { return debug_info_; }\n\n  size_t stack_size() const { return stack_size_; }\n\n protected:\n  void* Emplace(const EmitFunctionInfo& func_info,\n                GuestFunction* function = nullptr);\n  bool Emit(hir::HIRBuilder* builder, EmitFunctionInfo& func_info);\n  void EmitGetCurrentThreadId();\n  void EmitTraceUserCallReturn();\n\n protected:\n  Processor* processor_ = nullptr;\n  X64Backend* backend_ = nullptr;\n  X64CodeCache* code_cache_ = nullptr;\n  XbyakAllocator* allocator_ = nullptr;\n  Xbyak::util::Cpu cpu_;\n  uint32_t feature_flags_ = 0;\n\n  Xbyak::Label* epilog_label_ = nullptr;\n\n  hir::Instr* current_instr_ = nullptr;\n\n  FunctionDebugInfo* debug_info_ = nullptr;\n  uint32_t debug_info_flags_ = 0;\n  FunctionTraceData* trace_data_ = nullptr;\n  Arena source_map_arena_;\n\n  size_t stack_size_ = 0;\n\n  static const uint32_t gpr_reg_map_[GPR_COUNT];\n  static const uint32_t xmm_reg_map_[XMM_COUNT];\n};\n\n}  // namespace x64\n}  // namespace backend\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_BACKEND_X64_X64_EMITTER_H_\n"
  },
  {
    "path": "src/xenia/cpu/backend/x64/x64_function.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/backend/x64/x64_function.h\"\n\n#include \"xenia/cpu/backend/x64/x64_backend.h\"\n#include \"xenia/cpu/processor.h\"\n#include \"xenia/cpu/thread_state.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace backend {\nnamespace x64 {\n\nX64Function::X64Function(Module* module, uint32_t address)\n    : GuestFunction(module, address) {}\n\nX64Function::~X64Function() {\n  // machine_code_ is freed by code cache.\n}\n\nvoid X64Function::Setup(uint8_t* machine_code, size_t machine_code_length) {\n  machine_code_ = machine_code;\n  machine_code_length_ = machine_code_length;\n}\n\nbool X64Function::CallImpl(ThreadState* thread_state, uint32_t return_address) {\n  auto backend =\n      reinterpret_cast<X64Backend*>(thread_state->processor()->backend());\n  auto thunk = backend->host_to_guest_thunk();\n  thunk(machine_code_, thread_state->context(),\n        reinterpret_cast<void*>(uintptr_t(return_address)));\n  return true;\n}\n\n}  // namespace x64\n}  // namespace backend\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/backend/x64/x64_function.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_BACKEND_X64_X64_FUNCTION_H_\n#define XENIA_CPU_BACKEND_X64_X64_FUNCTION_H_\n\n#include \"xenia/cpu/function.h\"\n#include \"xenia/cpu/thread_state.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace backend {\nnamespace x64 {\n\nclass X64Function : public GuestFunction {\n public:\n  X64Function(Module* module, uint32_t address);\n  ~X64Function() override;\n\n  uint8_t* machine_code() const override { return machine_code_; }\n  size_t machine_code_length() const override { return machine_code_length_; }\n\n  void Setup(uint8_t* machine_code, size_t machine_code_length);\n\n protected:\n  bool CallImpl(ThreadState* thread_state, uint32_t return_address) override;\n\n private:\n  uint8_t* machine_code_ = nullptr;\n  size_t machine_code_length_ = 0;\n};\n\n}  // namespace x64\n}  // namespace backend\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_BACKEND_X64_X64_FUNCTION_H_\n"
  },
  {
    "path": "src/xenia/cpu/backend/x64/x64_op.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2018 Xenia Developers. All rights reserved.                      *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n#ifndef XENIA_CPU_BACKEND_X64_X64_OP_H_\n#define XENIA_CPU_BACKEND_X64_X64_OP_H_\n\n#include \"xenia/cpu/backend/x64/x64_emitter.h\"\n\n#include \"xenia/cpu/hir/instr.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace backend {\nnamespace x64 {\n\n// TODO(benvanik): direct usings.\nusing namespace xe::cpu;\nusing namespace xe::cpu::hir;\nusing namespace Xbyak;\n\n// Selects the right byte/word/etc from a vector. We need to flip logical\n// indices (0,1,2,3,4,5,6,7,...) = (3,2,1,0,7,6,5,4,...)\n#define VEC128_B(n) ((n) ^ 0x3)\n#define VEC128_W(n) ((n) ^ 0x1)\n#define VEC128_D(n) (n)\n#define VEC128_F(n) (n)\n\nenum KeyType {\n  KEY_TYPE_X = OPCODE_SIG_TYPE_X,\n  KEY_TYPE_L = OPCODE_SIG_TYPE_L,\n  KEY_TYPE_O = OPCODE_SIG_TYPE_O,\n  KEY_TYPE_S = OPCODE_SIG_TYPE_S,\n  KEY_TYPE_V_I8 = OPCODE_SIG_TYPE_V + INT8_TYPE,\n  KEY_TYPE_V_I16 = OPCODE_SIG_TYPE_V + INT16_TYPE,\n  KEY_TYPE_V_I32 = OPCODE_SIG_TYPE_V + INT32_TYPE,\n  KEY_TYPE_V_I64 = OPCODE_SIG_TYPE_V + INT64_TYPE,\n  KEY_TYPE_V_F32 = OPCODE_SIG_TYPE_V + FLOAT32_TYPE,\n  KEY_TYPE_V_F64 = OPCODE_SIG_TYPE_V + FLOAT64_TYPE,\n  KEY_TYPE_V_V128 = OPCODE_SIG_TYPE_V + VEC128_TYPE,\n};\n\n#pragma pack(push, 1)\nunion InstrKey {\n  uint32_t value;\n  struct {\n    uint32_t opcode : 8;\n    uint32_t dest : 5;\n    uint32_t src1 : 5;\n    uint32_t src2 : 5;\n    uint32_t src3 : 5;\n    uint32_t reserved : 4;\n  };\n\n  operator uint32_t() const { return value; }\n\n  InstrKey() : value(0) { static_assert_size(*this, sizeof(value)); }\n  InstrKey(uint32_t v) : value(v) {}\n  InstrKey(const Instr* i) : value(0) {\n    opcode = i->opcode->num;\n    uint32_t sig = i->opcode->signature;\n    dest =\n        GET_OPCODE_SIG_TYPE_DEST(sig) ? OPCODE_SIG_TYPE_V + i->dest->type : 0;\n    src1 = GET_OPCODE_SIG_TYPE_SRC1(sig);\n    if (src1 == OPCODE_SIG_TYPE_V) {\n      src1 += i->src1.value->type;\n    }\n    src2 = GET_OPCODE_SIG_TYPE_SRC2(sig);\n    if (src2 == OPCODE_SIG_TYPE_V) {\n      src2 += i->src2.value->type;\n    }\n    src3 = GET_OPCODE_SIG_TYPE_SRC3(sig);\n    if (src3 == OPCODE_SIG_TYPE_V) {\n      src3 += i->src3.value->type;\n    }\n  }\n\n  template <Opcode OPCODE, KeyType DEST = KEY_TYPE_X, KeyType SRC1 = KEY_TYPE_X,\n            KeyType SRC2 = KEY_TYPE_X, KeyType SRC3 = KEY_TYPE_X>\n  struct Construct {\n    static const uint32_t value =\n        (OPCODE) | (DEST << 8) | (SRC1 << 13) | (SRC2 << 18) | (SRC3 << 23);\n  };\n};\n#pragma pack(pop)\nstatic_assert(sizeof(InstrKey) <= 4, \"Key must be 4 bytes\");\n\ntemplate <typename... Ts>\nstruct CombinedStruct;\ntemplate <>\nstruct CombinedStruct<> {};\ntemplate <typename T, typename... Ts>\nstruct CombinedStruct<T, Ts...> : T, CombinedStruct<Ts...> {};\n\nstruct OpBase {};\n\ntemplate <typename T, KeyType KEY_TYPE>\nstruct Op : OpBase {\n  static const KeyType key_type = KEY_TYPE;\n};\n\nstruct VoidOp : Op<VoidOp, KEY_TYPE_X> {\n protected:\n  friend struct Op<VoidOp, KEY_TYPE_X>;\n  template <hir::Opcode OPCODE, typename... Ts>\n  friend struct I;\n  void Load(const Instr::Op& op) {}\n};\n\nstruct OffsetOp : Op<OffsetOp, KEY_TYPE_O> {\n  uint64_t value;\n\n protected:\n  friend struct Op<OffsetOp, KEY_TYPE_O>;\n  template <hir::Opcode OPCODE, typename... Ts>\n  friend struct I;\n  void Load(const Instr::Op& op) { this->value = op.offset; }\n};\n\nstruct SymbolOp : Op<SymbolOp, KEY_TYPE_S> {\n  Function* value;\n\n protected:\n  friend struct Op<SymbolOp, KEY_TYPE_S>;\n  template <hir::Opcode OPCODE, typename... Ts>\n  friend struct I;\n  bool Load(const Instr::Op& op) {\n    this->value = op.symbol;\n    return true;\n  }\n};\n\nstruct LabelOp : Op<LabelOp, KEY_TYPE_L> {\n  hir::Label* value;\n\n protected:\n  friend struct Op<LabelOp, KEY_TYPE_L>;\n  template <hir::Opcode OPCODE, typename... Ts>\n  friend struct I;\n  void Load(const Instr::Op& op) { this->value = op.label; }\n};\n\ntemplate <typename T, KeyType KEY_TYPE, typename REG_TYPE, typename CONST_TYPE>\nstruct ValueOp : Op<ValueOp<T, KEY_TYPE, REG_TYPE, CONST_TYPE>, KEY_TYPE> {\n  typedef REG_TYPE reg_type;\n  const Value* value;\n  bool is_constant;\n  virtual bool ConstantFitsIn32Reg() const { return true; }\n  const REG_TYPE& reg() const {\n    assert_true(!is_constant);\n    return reg_;\n  }\n  operator const REG_TYPE&() const { return reg(); }\n  bool IsEqual(const T& b) const {\n    if (is_constant && b.is_constant) {\n      return reinterpret_cast<const T*>(this)->constant() == b.constant();\n    } else if (!is_constant && !b.is_constant) {\n      return reg_.getIdx() == b.reg_.getIdx();\n    } else {\n      return false;\n    }\n  }\n  bool IsEqual(const Xbyak::Reg& b) const {\n    if (is_constant) {\n      return false;\n    } else if (!is_constant) {\n      return reg_.getIdx() == b.getIdx();\n    } else {\n      return false;\n    }\n  }\n  bool operator==(const T& b) const { return IsEqual(b); }\n  bool operator!=(const T& b) const { return !IsEqual(b); }\n  bool operator==(const Xbyak::Reg& b) const { return IsEqual(b); }\n  bool operator!=(const Xbyak::Reg& b) const { return !IsEqual(b); }\n  void Load(const Instr::Op& op) {\n    value = op.value;\n    is_constant = value->IsConstant();\n    if (!is_constant) {\n      X64Emitter::SetupReg(value, reg_);\n    }\n  }\n\n protected:\n  REG_TYPE reg_;\n};\n\nstruct I8Op : ValueOp<I8Op, KEY_TYPE_V_I8, Reg8, int8_t> {\n  typedef ValueOp<I8Op, KEY_TYPE_V_I8, Reg8, int8_t> BASE;\n  const int8_t constant() const {\n    assert_true(BASE::is_constant);\n    return BASE::value->constant.i8;\n  }\n};\nstruct I16Op : ValueOp<I16Op, KEY_TYPE_V_I16, Reg16, int16_t> {\n  typedef ValueOp<I16Op, KEY_TYPE_V_I16, Reg16, int16_t> BASE;\n  const int16_t constant() const {\n    assert_true(BASE::is_constant);\n    return BASE::value->constant.i16;\n  }\n};\nstruct I32Op : ValueOp<I32Op, KEY_TYPE_V_I32, Reg32, int32_t> {\n  typedef ValueOp<I32Op, KEY_TYPE_V_I32, Reg32, int32_t> BASE;\n  const int32_t constant() const {\n    assert_true(BASE::is_constant);\n    return BASE::value->constant.i32;\n  }\n};\nstruct I64Op : ValueOp<I64Op, KEY_TYPE_V_I64, Reg64, int64_t> {\n  typedef ValueOp<I64Op, KEY_TYPE_V_I64, Reg64, int64_t> BASE;\n  const int64_t constant() const {\n    assert_true(BASE::is_constant);\n    return BASE::value->constant.i64;\n  }\n  bool ConstantFitsIn32Reg() const override {\n    int64_t v = BASE::value->constant.i64;\n    if ((v & ~0x7FFFFFFF) == 0) {\n      // Fits under 31 bits, so just load using normal mov.\n      return true;\n    } else if ((v & ~0x7FFFFFFF) == ~0x7FFFFFFF) {\n      // Negative number that fits in 32bits.\n      return true;\n    }\n    return false;\n  }\n};\nstruct F32Op : ValueOp<F32Op, KEY_TYPE_V_F32, Xmm, float> {\n  typedef ValueOp<F32Op, KEY_TYPE_V_F32, Xmm, float> BASE;\n  const float constant() const {\n    assert_true(BASE::is_constant);\n    return BASE::value->constant.f32;\n  }\n};\nstruct F64Op : ValueOp<F64Op, KEY_TYPE_V_F64, Xmm, double> {\n  typedef ValueOp<F64Op, KEY_TYPE_V_F64, Xmm, double> BASE;\n  const double constant() const {\n    assert_true(BASE::is_constant);\n    return BASE::value->constant.f64;\n  }\n};\nstruct V128Op : ValueOp<V128Op, KEY_TYPE_V_V128, Xmm, vec128_t> {\n  typedef ValueOp<V128Op, KEY_TYPE_V_V128, Xmm, vec128_t> BASE;\n  const vec128_t& constant() const {\n    assert_true(BASE::is_constant);\n    return BASE::value->constant.v128;\n  }\n};\n\ntemplate <typename DEST, typename... Tf>\nstruct DestField;\ntemplate <typename DEST>\nstruct DestField<DEST> {\n  DEST dest;\n\n protected:\n  bool LoadDest(const Instr* i) {\n    Instr::Op op;\n    op.value = i->dest;\n    dest.Load(op);\n    return true;\n  }\n};\ntemplate <>\nstruct DestField<VoidOp> {\n protected:\n  bool LoadDest(const Instr* i) { return true; }\n};\n\ntemplate <hir::Opcode OPCODE, typename... Ts>\nstruct I;\ntemplate <hir::Opcode OPCODE, typename DEST>\nstruct I<OPCODE, DEST> : DestField<DEST> {\n  typedef DestField<DEST> BASE;\n  static const hir::Opcode opcode = OPCODE;\n  static const uint32_t key =\n      InstrKey::Construct<OPCODE, DEST::key_type>::value;\n  static const KeyType dest_type = DEST::key_type;\n  const Instr* instr;\n\n protected:\n  template <typename SEQ, typename T>\n  friend struct Sequence;\n  bool Load(const Instr* i) {\n    if (InstrKey(i).value == key && BASE::LoadDest(i)) {\n      instr = i;\n      return true;\n    }\n    return false;\n  }\n};\ntemplate <hir::Opcode OPCODE, typename DEST, typename SRC1>\nstruct I<OPCODE, DEST, SRC1> : DestField<DEST> {\n  typedef DestField<DEST> BASE;\n  static const hir::Opcode opcode = OPCODE;\n  static const uint32_t key =\n      InstrKey::Construct<OPCODE, DEST::key_type, SRC1::key_type>::value;\n  static const KeyType dest_type = DEST::key_type;\n  static const KeyType src1_type = SRC1::key_type;\n  const Instr* instr;\n  SRC1 src1;\n\n protected:\n  template <typename SEQ, typename T>\n  friend struct Sequence;\n  bool Load(const Instr* i) {\n    if (InstrKey(i).value == key && BASE::LoadDest(i)) {\n      instr = i;\n      src1.Load(i->src1);\n      return true;\n    }\n    return false;\n  }\n};\ntemplate <hir::Opcode OPCODE, typename DEST, typename SRC1, typename SRC2>\nstruct I<OPCODE, DEST, SRC1, SRC2> : DestField<DEST> {\n  typedef DestField<DEST> BASE;\n  static const hir::Opcode opcode = OPCODE;\n  static const uint32_t key =\n      InstrKey::Construct<OPCODE, DEST::key_type, SRC1::key_type,\n                          SRC2::key_type>::value;\n  static const KeyType dest_type = DEST::key_type;\n  static const KeyType src1_type = SRC1::key_type;\n  static const KeyType src2_type = SRC2::key_type;\n  const Instr* instr;\n  SRC1 src1;\n  SRC2 src2;\n\n protected:\n  template <typename SEQ, typename T>\n  friend struct Sequence;\n  bool Load(const Instr* i) {\n    if (InstrKey(i).value == key && BASE::LoadDest(i)) {\n      instr = i;\n      src1.Load(i->src1);\n      src2.Load(i->src2);\n      return true;\n    }\n    return false;\n  }\n};\ntemplate <hir::Opcode OPCODE, typename DEST, typename SRC1, typename SRC2,\n          typename SRC3>\nstruct I<OPCODE, DEST, SRC1, SRC2, SRC3> : DestField<DEST> {\n  typedef DestField<DEST> BASE;\n  static const hir::Opcode opcode = OPCODE;\n  static const uint32_t key =\n      InstrKey::Construct<OPCODE, DEST::key_type, SRC1::key_type,\n                          SRC2::key_type, SRC3::key_type>::value;\n  static const KeyType dest_type = DEST::key_type;\n  static const KeyType src1_type = SRC1::key_type;\n  static const KeyType src2_type = SRC2::key_type;\n  static const KeyType src3_type = SRC3::key_type;\n  const Instr* instr;\n  SRC1 src1;\n  SRC2 src2;\n  SRC3 src3;\n\n protected:\n  template <typename SEQ, typename T>\n  friend struct Sequence;\n  bool Load(const Instr* i) {\n    if (InstrKey(i).value == key && BASE::LoadDest(i)) {\n      instr = i;\n      src1.Load(i->src1);\n      src2.Load(i->src2);\n      src3.Load(i->src3);\n      return true;\n    }\n    return false;\n  }\n};\n\ntemplate <typename T>\nstatic const T GetTempReg(X64Emitter& e);\ntemplate <>\nconst Reg8 GetTempReg<Reg8>(X64Emitter& e) {\n  return e.al;\n}\ntemplate <>\nconst Reg16 GetTempReg<Reg16>(X64Emitter& e) {\n  return e.ax;\n}\ntemplate <>\nconst Reg32 GetTempReg<Reg32>(X64Emitter& e) {\n  return e.eax;\n}\ntemplate <>\nconst Reg64 GetTempReg<Reg64>(X64Emitter& e) {\n  return e.rax;\n}\n\ntemplate <typename SEQ, typename T>\nstruct Sequence {\n  typedef T EmitArgType;\n\n  static constexpr uint32_t head_key() { return T::key; }\n\n  static bool Select(X64Emitter& e, const Instr* i) {\n    T args;\n    if (!args.Load(i)) {\n      return false;\n    }\n    SEQ::Emit(e, args);\n    return true;\n  }\n\n  template <typename REG_FN>\n  static void EmitUnaryOp(X64Emitter& e, const EmitArgType& i,\n                          const REG_FN& reg_fn) {\n    if (i.src1.is_constant) {\n      e.mov(i.dest, i.src1.constant());\n      reg_fn(e, i.dest);\n    } else {\n      if (i.dest != i.src1) {\n        e.mov(i.dest, i.src1);\n      }\n      reg_fn(e, i.dest);\n    }\n  }\n\n  template <typename REG_REG_FN, typename REG_CONST_FN>\n  static void EmitCommutativeBinaryOp(X64Emitter& e, const EmitArgType& i,\n                                      const REG_REG_FN& reg_reg_fn,\n                                      const REG_CONST_FN& reg_const_fn) {\n    if (i.src1.is_constant) {\n      if (i.src2.is_constant) {\n        // Both constants.\n        if (i.src1.ConstantFitsIn32Reg()) {\n          e.mov(i.dest, i.src2.constant());\n          reg_const_fn(e, i.dest, static_cast<int32_t>(i.src1.constant()));\n        } else if (i.src2.ConstantFitsIn32Reg()) {\n          e.mov(i.dest, i.src1.constant());\n          reg_const_fn(e, i.dest, static_cast<int32_t>(i.src2.constant()));\n        } else {\n          e.mov(i.dest, i.src1.constant());\n          auto temp = GetTempReg<typename decltype(i.src2)::reg_type>(e);\n          e.mov(temp, i.src2.constant());\n          reg_reg_fn(e, i.dest, temp);\n        }\n      } else {\n        // src1 constant.\n        if (i.dest == i.src2) {\n          if (i.src1.ConstantFitsIn32Reg()) {\n            reg_const_fn(e, i.dest, static_cast<int32_t>(i.src1.constant()));\n          } else {\n            auto temp = GetTempReg<typename decltype(i.src1)::reg_type>(e);\n            e.mov(temp, i.src1.constant());\n            reg_reg_fn(e, i.dest, temp);\n          }\n        } else {\n          e.mov(i.dest, i.src1.constant());\n          reg_reg_fn(e, i.dest, i.src2);\n        }\n      }\n    } else if (i.src2.is_constant) {\n      if (i.dest == i.src1) {\n        if (i.src2.ConstantFitsIn32Reg()) {\n          reg_const_fn(e, i.dest, static_cast<int32_t>(i.src2.constant()));\n        } else {\n          auto temp = GetTempReg<typename decltype(i.src2)::reg_type>(e);\n          e.mov(temp, i.src2.constant());\n          reg_reg_fn(e, i.dest, temp);\n        }\n      } else {\n        e.mov(i.dest, i.src2.constant());\n        reg_reg_fn(e, i.dest, i.src1);\n      }\n    } else {\n      if (i.dest == i.src1) {\n        reg_reg_fn(e, i.dest, i.src2);\n      } else if (i.dest == i.src2) {\n        reg_reg_fn(e, i.dest, i.src1);\n      } else {\n        e.mov(i.dest, i.src1);\n        reg_reg_fn(e, i.dest, i.src2);\n      }\n    }\n  }\n  template <typename REG_REG_FN, typename REG_CONST_FN>\n  static void EmitAssociativeBinaryOp(X64Emitter& e, const EmitArgType& i,\n                                      const REG_REG_FN& reg_reg_fn,\n                                      const REG_CONST_FN& reg_const_fn) {\n    if (i.src1.is_constant) {\n      assert_true(!i.src2.is_constant);\n      if (i.dest == i.src2) {\n        auto temp = GetTempReg<typename decltype(i.src2)::reg_type>(e);\n        e.mov(temp, i.src2);\n        e.mov(i.dest, i.src1.constant());\n        reg_reg_fn(e, i.dest, temp);\n      } else {\n        e.mov(i.dest, i.src1.constant());\n        reg_reg_fn(e, i.dest, i.src2);\n      }\n    } else if (i.src2.is_constant) {\n      if (i.dest == i.src1) {\n        if (i.src2.ConstantFitsIn32Reg()) {\n          reg_const_fn(e, i.dest, static_cast<int32_t>(i.src2.constant()));\n        } else {\n          auto temp = GetTempReg<typename decltype(i.src2)::reg_type>(e);\n          e.mov(temp, i.src2.constant());\n          reg_reg_fn(e, i.dest, temp);\n        }\n      } else {\n        e.mov(i.dest, i.src1);\n        if (i.src2.ConstantFitsIn32Reg()) {\n          reg_const_fn(e, i.dest, static_cast<int32_t>(i.src2.constant()));\n        } else {\n          auto temp = GetTempReg<typename decltype(i.src2)::reg_type>(e);\n          e.mov(temp, i.src2.constant());\n          reg_reg_fn(e, i.dest, temp);\n        }\n      }\n    } else {\n      if (i.dest == i.src1) {\n        reg_reg_fn(e, i.dest, i.src2);\n      } else if (i.dest == i.src2) {\n        auto temp = GetTempReg<typename decltype(i.src2)::reg_type>(e);\n        e.mov(temp, i.src2);\n        e.mov(i.dest, i.src1);\n        reg_reg_fn(e, i.dest, temp);\n      } else {\n        e.mov(i.dest, i.src1);\n        reg_reg_fn(e, i.dest, i.src2);\n      }\n    }\n  }\n\n  template <typename FN>\n  static void EmitCommutativeBinaryXmmOp(X64Emitter& e, const EmitArgType& i,\n                                         const FN& fn) {\n    if (i.src1.is_constant) {\n      assert_true(!i.src2.is_constant);\n      e.LoadConstantXmm(e.xmm0, i.src1.constant());\n      fn(e, i.dest, e.xmm0, i.src2);\n    } else if (i.src2.is_constant) {\n      assert_true(!i.src1.is_constant);\n      e.LoadConstantXmm(e.xmm0, i.src2.constant());\n      fn(e, i.dest, i.src1, e.xmm0);\n    } else {\n      fn(e, i.dest, i.src1, i.src2);\n    }\n  }\n\n  template <typename FN>\n  static void EmitAssociativeBinaryXmmOp(X64Emitter& e, const EmitArgType& i,\n                                         const FN& fn) {\n    if (i.src1.is_constant) {\n      assert_true(!i.src2.is_constant);\n      e.LoadConstantXmm(e.xmm0, i.src1.constant());\n      fn(e, i.dest, e.xmm0, i.src2);\n    } else if (i.src2.is_constant) {\n      assert_true(!i.src1.is_constant);\n      e.LoadConstantXmm(e.xmm0, i.src2.constant());\n      fn(e, i.dest, i.src1, e.xmm0);\n    } else {\n      fn(e, i.dest, i.src1, i.src2);\n    }\n  }\n\n  template <typename REG_REG_FN, typename REG_CONST_FN>\n  static void EmitCommutativeCompareOp(X64Emitter& e, const EmitArgType& i,\n                                       const REG_REG_FN& reg_reg_fn,\n                                       const REG_CONST_FN& reg_const_fn) {\n    if (i.src1.is_constant) {\n      assert_true(!i.src2.is_constant);\n      if (i.src1.ConstantFitsIn32Reg()) {\n        reg_const_fn(e, i.src2, static_cast<int32_t>(i.src1.constant()));\n      } else {\n        auto temp = GetTempReg<typename decltype(i.src1)::reg_type>(e);\n        e.mov(temp, i.src1.constant());\n        reg_reg_fn(e, i.src2, temp);\n      }\n    } else if (i.src2.is_constant) {\n      assert_true(!i.src1.is_constant);\n      if (i.src2.ConstantFitsIn32Reg()) {\n        reg_const_fn(e, i.src1, static_cast<int32_t>(i.src2.constant()));\n      } else {\n        auto temp = GetTempReg<typename decltype(i.src2)::reg_type>(e);\n        e.mov(temp, i.src2.constant());\n        reg_reg_fn(e, i.src1, temp);\n      }\n    } else {\n      reg_reg_fn(e, i.src1, i.src2);\n    }\n  }\n  template <typename REG_REG_FN, typename REG_CONST_FN>\n  static void EmitAssociativeCompareOp(X64Emitter& e, const EmitArgType& i,\n                                       const REG_REG_FN& reg_reg_fn,\n                                       const REG_CONST_FN& reg_const_fn) {\n    if (i.src1.is_constant) {\n      assert_true(!i.src2.is_constant);\n      if (i.src1.ConstantFitsIn32Reg()) {\n        reg_const_fn(e, i.dest, i.src2, static_cast<int32_t>(i.src1.constant()),\n                     true);\n      } else {\n        auto temp = GetTempReg<typename decltype(i.src1)::reg_type>(e);\n        e.mov(temp, i.src1.constant());\n        reg_reg_fn(e, i.dest, i.src2, temp, true);\n      }\n    } else if (i.src2.is_constant) {\n      assert_true(!i.src1.is_constant);\n      if (i.src2.ConstantFitsIn32Reg()) {\n        reg_const_fn(e, i.dest, i.src1, static_cast<int32_t>(i.src2.constant()),\n                     false);\n      } else {\n        auto temp = GetTempReg<typename decltype(i.src2)::reg_type>(e);\n        e.mov(temp, i.src2.constant());\n        reg_reg_fn(e, i.dest, i.src1, temp, false);\n      }\n    } else {\n      reg_reg_fn(e, i.dest, i.src1, i.src2, false);\n    }\n  }\n};\n\n}  // namespace x64\n}  // namespace backend\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_BACKEND_X64_X64_OP_H_\n"
  },
  {
    "path": "src/xenia/cpu/backend/x64/x64_seq_control.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2018 Xenia Developers. All rights reserved.                      *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/backend/x64/x64_sequences.h\"\n\n#include <algorithm>\n#include <cstring>\n\n#include \"xenia/cpu/backend/x64/x64_op.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace backend {\nnamespace x64 {\n\nvolatile int anchor_control = 0;\n\n// ============================================================================\n// OPCODE_DEBUG_BREAK\n// ============================================================================\nstruct DEBUG_BREAK : Sequence<DEBUG_BREAK, I<OPCODE_DEBUG_BREAK, VoidOp>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) { e.DebugBreak(); }\n};\nEMITTER_OPCODE_TABLE(OPCODE_DEBUG_BREAK, DEBUG_BREAK);\n\n// ============================================================================\n// OPCODE_DEBUG_BREAK_TRUE\n// ============================================================================\nstruct DEBUG_BREAK_TRUE_I8\n    : Sequence<DEBUG_BREAK_TRUE_I8, I<OPCODE_DEBUG_BREAK_TRUE, VoidOp, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.test(i.src1, i.src1);\n    Xbyak::Label skip;\n    e.jz(skip);\n    e.DebugBreak();\n    e.L(skip);\n  }\n};\nstruct DEBUG_BREAK_TRUE_I16\n    : Sequence<DEBUG_BREAK_TRUE_I16,\n               I<OPCODE_DEBUG_BREAK_TRUE, VoidOp, I16Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.test(i.src1, i.src1);\n    Xbyak::Label skip;\n    e.jz(skip);\n    e.DebugBreak();\n    e.L(skip);\n  }\n};\nstruct DEBUG_BREAK_TRUE_I32\n    : Sequence<DEBUG_BREAK_TRUE_I32,\n               I<OPCODE_DEBUG_BREAK_TRUE, VoidOp, I32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.test(i.src1, i.src1);\n    Xbyak::Label skip;\n    e.jz(skip);\n    e.DebugBreak();\n    e.L(skip);\n  }\n};\nstruct DEBUG_BREAK_TRUE_I64\n    : Sequence<DEBUG_BREAK_TRUE_I64,\n               I<OPCODE_DEBUG_BREAK_TRUE, VoidOp, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.test(i.src1, i.src1);\n    Xbyak::Label skip;\n    e.jz(skip);\n    e.DebugBreak();\n    e.L(skip);\n  }\n};\nstruct DEBUG_BREAK_TRUE_F32\n    : Sequence<DEBUG_BREAK_TRUE_F32,\n               I<OPCODE_DEBUG_BREAK_TRUE, VoidOp, F32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.vptest(i.src1, i.src1);\n    Xbyak::Label skip;\n    e.jz(skip);\n    e.DebugBreak();\n    e.L(skip);\n  }\n};\nstruct DEBUG_BREAK_TRUE_F64\n    : Sequence<DEBUG_BREAK_TRUE_F64,\n               I<OPCODE_DEBUG_BREAK_TRUE, VoidOp, F64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.vptest(i.src1, i.src1);\n    Xbyak::Label skip;\n    e.jz(skip);\n    e.DebugBreak();\n    e.L(skip);\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_DEBUG_BREAK_TRUE, DEBUG_BREAK_TRUE_I8,\n                     DEBUG_BREAK_TRUE_I16, DEBUG_BREAK_TRUE_I32,\n                     DEBUG_BREAK_TRUE_I64, DEBUG_BREAK_TRUE_F32,\n                     DEBUG_BREAK_TRUE_F64);\n\n// ============================================================================\n// OPCODE_TRAP\n// ============================================================================\nstruct TRAP : Sequence<TRAP, I<OPCODE_TRAP, VoidOp>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.Trap(i.instr->flags);\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_TRAP, TRAP);\n\n// ============================================================================\n// OPCODE_TRAP_TRUE\n// ============================================================================\nstruct TRAP_TRUE_I8\n    : Sequence<TRAP_TRUE_I8, I<OPCODE_TRAP_TRUE, VoidOp, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.test(i.src1, i.src1);\n    Xbyak::Label skip;\n    e.jz(skip);\n    e.Trap(i.instr->flags);\n    e.L(skip);\n  }\n};\nstruct TRAP_TRUE_I16\n    : Sequence<TRAP_TRUE_I16, I<OPCODE_TRAP_TRUE, VoidOp, I16Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.test(i.src1, i.src1);\n    Xbyak::Label skip;\n    e.jz(skip);\n    e.Trap(i.instr->flags);\n    e.L(skip);\n  }\n};\nstruct TRAP_TRUE_I32\n    : Sequence<TRAP_TRUE_I32, I<OPCODE_TRAP_TRUE, VoidOp, I32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.test(i.src1, i.src1);\n    Xbyak::Label skip;\n    e.jz(skip);\n    e.Trap(i.instr->flags);\n    e.L(skip);\n  }\n};\nstruct TRAP_TRUE_I64\n    : Sequence<TRAP_TRUE_I64, I<OPCODE_TRAP_TRUE, VoidOp, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.test(i.src1, i.src1);\n    Xbyak::Label skip;\n    e.jz(skip);\n    e.Trap(i.instr->flags);\n    e.L(skip);\n  }\n};\nstruct TRAP_TRUE_F32\n    : Sequence<TRAP_TRUE_F32, I<OPCODE_TRAP_TRUE, VoidOp, F32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.vptest(i.src1, i.src1);\n    Xbyak::Label skip;\n    e.jz(skip);\n    e.Trap(i.instr->flags);\n    e.L(skip);\n  }\n};\nstruct TRAP_TRUE_F64\n    : Sequence<TRAP_TRUE_F64, I<OPCODE_TRAP_TRUE, VoidOp, F64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.vptest(i.src1, i.src1);\n    Xbyak::Label skip;\n    e.jz(skip);\n    e.Trap(i.instr->flags);\n    e.L(skip);\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_TRAP_TRUE, TRAP_TRUE_I8, TRAP_TRUE_I16,\n                     TRAP_TRUE_I32, TRAP_TRUE_I64, TRAP_TRUE_F32,\n                     TRAP_TRUE_F64);\n\n// ============================================================================\n// OPCODE_CALL\n// ============================================================================\nstruct CALL : Sequence<CALL, I<OPCODE_CALL, VoidOp, SymbolOp>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    assert_true(i.src1.value->is_guest());\n    e.Call(i.instr, static_cast<GuestFunction*>(i.src1.value));\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_CALL, CALL);\n\n// ============================================================================\n// OPCODE_CALL_TRUE\n// ============================================================================\nstruct CALL_TRUE_I8\n    : Sequence<CALL_TRUE_I8, I<OPCODE_CALL_TRUE, VoidOp, I8Op, SymbolOp>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    assert_true(i.src2.value->is_guest());\n    e.test(i.src1, i.src1);\n    Xbyak::Label skip;\n    e.jz(skip);\n    e.Call(i.instr, static_cast<GuestFunction*>(i.src2.value));\n    e.L(skip);\n  }\n};\nstruct CALL_TRUE_I16\n    : Sequence<CALL_TRUE_I16, I<OPCODE_CALL_TRUE, VoidOp, I16Op, SymbolOp>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    assert_true(i.src2.value->is_guest());\n    e.test(i.src1, i.src1);\n    Xbyak::Label skip;\n    e.jz(skip);\n    e.Call(i.instr, static_cast<GuestFunction*>(i.src2.value));\n    e.L(skip);\n  }\n};\nstruct CALL_TRUE_I32\n    : Sequence<CALL_TRUE_I32, I<OPCODE_CALL_TRUE, VoidOp, I32Op, SymbolOp>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    assert_true(i.src2.value->is_guest());\n    e.test(i.src1, i.src1);\n    Xbyak::Label skip;\n    e.jz(skip);\n    e.Call(i.instr, static_cast<GuestFunction*>(i.src2.value));\n    e.L(skip);\n  }\n};\nstruct CALL_TRUE_I64\n    : Sequence<CALL_TRUE_I64, I<OPCODE_CALL_TRUE, VoidOp, I64Op, SymbolOp>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    assert_true(i.src2.value->is_guest());\n    e.test(i.src1, i.src1);\n    Xbyak::Label skip;\n    e.jz(skip);\n    e.Call(i.instr, static_cast<GuestFunction*>(i.src2.value));\n    e.L(skip);\n  }\n};\nstruct CALL_TRUE_F32\n    : Sequence<CALL_TRUE_F32, I<OPCODE_CALL_TRUE, VoidOp, F32Op, SymbolOp>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    assert_true(i.src2.value->is_guest());\n    e.vptest(i.src1, i.src1);\n    Xbyak::Label skip;\n    e.jz(skip);\n    e.Call(i.instr, static_cast<GuestFunction*>(i.src2.value));\n    e.L(skip);\n  }\n};\nstruct CALL_TRUE_F64\n    : Sequence<CALL_TRUE_F64, I<OPCODE_CALL_TRUE, VoidOp, F64Op, SymbolOp>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    assert_true(i.src2.value->is_guest());\n    e.vptest(i.src1, i.src1);\n    Xbyak::Label skip;\n    e.jz(skip);\n    e.Call(i.instr, static_cast<GuestFunction*>(i.src2.value));\n    e.L(skip);\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_CALL_TRUE, CALL_TRUE_I8, CALL_TRUE_I16,\n                     CALL_TRUE_I32, CALL_TRUE_I64, CALL_TRUE_F32,\n                     CALL_TRUE_F64);\n\n// ============================================================================\n// OPCODE_CALL_INDIRECT\n// ============================================================================\nstruct CALL_INDIRECT\n    : Sequence<CALL_INDIRECT, I<OPCODE_CALL_INDIRECT, VoidOp, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.CallIndirect(i.instr, i.src1);\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_CALL_INDIRECT, CALL_INDIRECT);\n\n// ============================================================================\n// OPCODE_CALL_INDIRECT_TRUE\n// ============================================================================\nstruct CALL_INDIRECT_TRUE_I8\n    : Sequence<CALL_INDIRECT_TRUE_I8,\n               I<OPCODE_CALL_INDIRECT_TRUE, VoidOp, I8Op, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.test(i.src1, i.src1);\n    Xbyak::Label skip;\n    e.jz(skip, CodeGenerator::T_NEAR);\n    e.CallIndirect(i.instr, i.src2);\n    e.L(skip);\n  }\n};\nstruct CALL_INDIRECT_TRUE_I16\n    : Sequence<CALL_INDIRECT_TRUE_I16,\n               I<OPCODE_CALL_INDIRECT_TRUE, VoidOp, I16Op, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.test(i.src1, i.src1);\n    Xbyak::Label skip;\n    e.jz(skip, CodeGenerator::T_NEAR);\n    e.CallIndirect(i.instr, i.src2);\n    e.L(skip);\n  }\n};\nstruct CALL_INDIRECT_TRUE_I32\n    : Sequence<CALL_INDIRECT_TRUE_I32,\n               I<OPCODE_CALL_INDIRECT_TRUE, VoidOp, I32Op, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.test(i.src1, i.src1);\n    Xbyak::Label skip;\n    e.jz(skip, CodeGenerator::T_NEAR);\n    e.CallIndirect(i.instr, i.src2);\n    e.L(skip);\n  }\n};\nstruct CALL_INDIRECT_TRUE_I64\n    : Sequence<CALL_INDIRECT_TRUE_I64,\n               I<OPCODE_CALL_INDIRECT_TRUE, VoidOp, I64Op, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.test(i.src1, i.src1);\n    Xbyak::Label skip;\n    e.jz(skip, CodeGenerator::T_NEAR);\n    e.CallIndirect(i.instr, i.src2);\n    e.L(skip);\n  }\n};\nstruct CALL_INDIRECT_TRUE_F32\n    : Sequence<CALL_INDIRECT_TRUE_F32,\n               I<OPCODE_CALL_INDIRECT_TRUE, VoidOp, F32Op, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.vptest(i.src1, i.src1);\n    Xbyak::Label skip;\n    e.jz(skip, CodeGenerator::T_NEAR);\n    e.CallIndirect(i.instr, i.src2);\n    e.L(skip);\n  }\n};\nstruct CALL_INDIRECT_TRUE_F64\n    : Sequence<CALL_INDIRECT_TRUE_F64,\n               I<OPCODE_CALL_INDIRECT_TRUE, VoidOp, F64Op, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.vptest(i.src1, i.src1);\n    Xbyak::Label skip;\n    e.jz(skip, CodeGenerator::T_NEAR);\n    e.CallIndirect(i.instr, i.src2);\n    e.L(skip);\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_CALL_INDIRECT_TRUE, CALL_INDIRECT_TRUE_I8,\n                     CALL_INDIRECT_TRUE_I16, CALL_INDIRECT_TRUE_I32,\n                     CALL_INDIRECT_TRUE_I64, CALL_INDIRECT_TRUE_F32,\n                     CALL_INDIRECT_TRUE_F64);\n\n// ============================================================================\n// OPCODE_CALL_EXTERN\n// ============================================================================\nstruct CALL_EXTERN\n    : Sequence<CALL_EXTERN, I<OPCODE_CALL_EXTERN, VoidOp, SymbolOp>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.CallExtern(i.instr, i.src1.value);\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_CALL_EXTERN, CALL_EXTERN);\n\n// ============================================================================\n// OPCODE_RETURN\n// ============================================================================\nstruct RETURN : Sequence<RETURN, I<OPCODE_RETURN, VoidOp>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    // If this is the last instruction in the last block, just let us\n    // fall through.\n    if (i.instr->next || i.instr->block->next) {\n      e.jmp(e.epilog_label(), CodeGenerator::T_NEAR);\n    }\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_RETURN, RETURN);\n\n// ============================================================================\n// OPCODE_RETURN_TRUE\n// ============================================================================\nstruct RETURN_TRUE_I8\n    : Sequence<RETURN_TRUE_I8, I<OPCODE_RETURN_TRUE, VoidOp, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.test(i.src1, i.src1);\n    e.jnz(e.epilog_label(), CodeGenerator::T_NEAR);\n  }\n};\nstruct RETURN_TRUE_I16\n    : Sequence<RETURN_TRUE_I16, I<OPCODE_RETURN_TRUE, VoidOp, I16Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.test(i.src1, i.src1);\n    e.jnz(e.epilog_label(), CodeGenerator::T_NEAR);\n  }\n};\nstruct RETURN_TRUE_I32\n    : Sequence<RETURN_TRUE_I32, I<OPCODE_RETURN_TRUE, VoidOp, I32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.test(i.src1, i.src1);\n    e.jnz(e.epilog_label(), CodeGenerator::T_NEAR);\n  }\n};\nstruct RETURN_TRUE_I64\n    : Sequence<RETURN_TRUE_I64, I<OPCODE_RETURN_TRUE, VoidOp, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.test(i.src1, i.src1);\n    e.jnz(e.epilog_label(), CodeGenerator::T_NEAR);\n  }\n};\nstruct RETURN_TRUE_F32\n    : Sequence<RETURN_TRUE_F32, I<OPCODE_RETURN_TRUE, VoidOp, F32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.vptest(i.src1, i.src1);\n    e.jnz(e.epilog_label(), CodeGenerator::T_NEAR);\n  }\n};\nstruct RETURN_TRUE_F64\n    : Sequence<RETURN_TRUE_F64, I<OPCODE_RETURN_TRUE, VoidOp, F64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.vptest(i.src1, i.src1);\n    e.jnz(e.epilog_label(), CodeGenerator::T_NEAR);\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_RETURN_TRUE, RETURN_TRUE_I8, RETURN_TRUE_I16,\n                     RETURN_TRUE_I32, RETURN_TRUE_I64, RETURN_TRUE_F32,\n                     RETURN_TRUE_F64);\n\n// ============================================================================\n// OPCODE_SET_RETURN_ADDRESS\n// ============================================================================\nstruct SET_RETURN_ADDRESS\n    : Sequence<SET_RETURN_ADDRESS,\n               I<OPCODE_SET_RETURN_ADDRESS, VoidOp, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.SetReturnAddress(i.src1.constant());\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_SET_RETURN_ADDRESS, SET_RETURN_ADDRESS);\n\n// ============================================================================\n// OPCODE_BRANCH\n// ============================================================================\nstruct BRANCH : Sequence<BRANCH, I<OPCODE_BRANCH, VoidOp, LabelOp>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.jmp(i.src1.value->name, e.T_NEAR);\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_BRANCH, BRANCH);\n\n// ============================================================================\n// OPCODE_BRANCH_TRUE\n// ============================================================================\nstruct BRANCH_TRUE_I8\n    : Sequence<BRANCH_TRUE_I8, I<OPCODE_BRANCH_TRUE, VoidOp, I8Op, LabelOp>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.test(i.src1, i.src1);\n    e.jnz(i.src2.value->name, e.T_NEAR);\n  }\n};\nstruct BRANCH_TRUE_I16\n    : Sequence<BRANCH_TRUE_I16, I<OPCODE_BRANCH_TRUE, VoidOp, I16Op, LabelOp>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.test(i.src1, i.src1);\n    e.jnz(i.src2.value->name, e.T_NEAR);\n  }\n};\nstruct BRANCH_TRUE_I32\n    : Sequence<BRANCH_TRUE_I32, I<OPCODE_BRANCH_TRUE, VoidOp, I32Op, LabelOp>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.test(i.src1, i.src1);\n    e.jnz(i.src2.value->name, e.T_NEAR);\n  }\n};\nstruct BRANCH_TRUE_I64\n    : Sequence<BRANCH_TRUE_I64, I<OPCODE_BRANCH_TRUE, VoidOp, I64Op, LabelOp>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.test(i.src1, i.src1);\n    e.jnz(i.src2.value->name, e.T_NEAR);\n  }\n};\nstruct BRANCH_TRUE_F32\n    : Sequence<BRANCH_TRUE_F32, I<OPCODE_BRANCH_TRUE, VoidOp, F32Op, LabelOp>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.vptest(i.src1, i.src1);\n    e.jnz(i.src2.value->name, e.T_NEAR);\n  }\n};\nstruct BRANCH_TRUE_F64\n    : Sequence<BRANCH_TRUE_F64, I<OPCODE_BRANCH_TRUE, VoidOp, F64Op, LabelOp>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.vptest(i.src1, i.src1);\n    e.jnz(i.src2.value->name, e.T_NEAR);\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_BRANCH_TRUE, BRANCH_TRUE_I8, BRANCH_TRUE_I16,\n                     BRANCH_TRUE_I32, BRANCH_TRUE_I64, BRANCH_TRUE_F32,\n                     BRANCH_TRUE_F64);\n\n// ============================================================================\n// OPCODE_BRANCH_FALSE\n// ============================================================================\nstruct BRANCH_FALSE_I8\n    : Sequence<BRANCH_FALSE_I8, I<OPCODE_BRANCH_FALSE, VoidOp, I8Op, LabelOp>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.test(i.src1, i.src1);\n    e.jz(i.src2.value->name, e.T_NEAR);\n  }\n};\nstruct BRANCH_FALSE_I16\n    : Sequence<BRANCH_FALSE_I16,\n               I<OPCODE_BRANCH_FALSE, VoidOp, I16Op, LabelOp>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.test(i.src1, i.src1);\n    e.jz(i.src2.value->name, e.T_NEAR);\n  }\n};\nstruct BRANCH_FALSE_I32\n    : Sequence<BRANCH_FALSE_I32,\n               I<OPCODE_BRANCH_FALSE, VoidOp, I32Op, LabelOp>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.test(i.src1, i.src1);\n    e.jz(i.src2.value->name, e.T_NEAR);\n  }\n};\nstruct BRANCH_FALSE_I64\n    : Sequence<BRANCH_FALSE_I64,\n               I<OPCODE_BRANCH_FALSE, VoidOp, I64Op, LabelOp>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.test(i.src1, i.src1);\n    e.jz(i.src2.value->name, e.T_NEAR);\n  }\n};\nstruct BRANCH_FALSE_F32\n    : Sequence<BRANCH_FALSE_F32,\n               I<OPCODE_BRANCH_FALSE, VoidOp, F32Op, LabelOp>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.vptest(i.src1, i.src1);\n    e.jz(i.src2.value->name, e.T_NEAR);\n  }\n};\nstruct BRANCH_FALSE_F64\n    : Sequence<BRANCH_FALSE_F64,\n               I<OPCODE_BRANCH_FALSE, VoidOp, F64Op, LabelOp>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.vptest(i.src1, i.src1);\n    e.jz(i.src2.value->name, e.T_NEAR);\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_BRANCH_FALSE, BRANCH_FALSE_I8, BRANCH_FALSE_I16,\n                     BRANCH_FALSE_I32, BRANCH_FALSE_I64, BRANCH_FALSE_F32,\n                     BRANCH_FALSE_F64);\n\n}  // namespace x64\n}  // namespace backend\n}  // namespace cpu\n}  // namespace xe"
  },
  {
    "path": "src/xenia/cpu/backend/x64/x64_seq_memory.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2018 Xenia Developers. All rights reserved.                      *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/backend/x64/x64_sequences.h\"\n\n#include <algorithm>\n#include <cstring>\n\n#include \"xenia/base/memory.h\"\n#include \"xenia/cpu/backend/x64/x64_op.h\"\n#include \"xenia/cpu/backend/x64/x64_tracers.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace backend {\nnamespace x64 {\n\nvolatile int anchor_memory = 0;\n\n// Note: all types are always aligned in the context.\nRegExp ComputeContextAddress(X64Emitter& e, const OffsetOp& offset) {\n  return e.GetContextReg() + offset.value;\n}\n\ntemplate <typename T>\nRegExp ComputeMemoryAddressOffset(X64Emitter& e, const T& guest,\n                                  const T& offset) {\n  assert_true(offset.is_constant);\n  int32_t offset_const = static_cast<int32_t>(offset.constant());\n\n  if (guest.is_constant) {\n    uint32_t address = static_cast<uint32_t>(guest.constant());\n    address += offset_const;\n    if (address < 0x80000000) {\n      return e.GetMembaseReg() + address;\n    } else {\n      if (address >= 0xE0000000 &&\n          xe::memory::allocation_granularity() > 0x1000) {\n        e.mov(e.eax, address + 0x1000);\n      } else {\n        e.mov(e.eax, address);\n      }\n      return e.GetMembaseReg() + e.rax;\n    }\n  } else {\n    if (xe::memory::allocation_granularity() > 0x1000) {\n      // Emulate the 4 KB physical address offset in 0xE0000000+ when can't do\n      // it via memory mapping.\n      e.cmp(guest.reg().cvt32(), 0xE0000000 - offset_const);\n      e.setae(e.al);\n      e.movzx(e.eax, e.al);\n      e.shl(e.eax, 12);\n      e.add(e.eax, guest.reg().cvt32());\n    } else {\n      // Clear the top 32 bits, as they are likely garbage.\n      // TODO(benvanik): find a way to avoid doing this.\n      e.mov(e.eax, guest.reg().cvt32());\n    }\n    return e.GetMembaseReg() + e.rax + offset_const;\n  }\n}\n\n// Note: most *should* be aligned, but needs to be checked!\ntemplate <typename T>\nRegExp ComputeMemoryAddress(X64Emitter& e, const T& guest) {\n  if (guest.is_constant) {\n    // TODO(benvanik): figure out how to do this without a temp.\n    // Since the constant is often 0x8... if we tried to use that as a\n    // displacement it would be sign extended and mess things up.\n    uint32_t address = static_cast<uint32_t>(guest.constant());\n    if (address < 0x80000000) {\n      return e.GetMembaseReg() + address;\n    } else {\n      if (address >= 0xE0000000 &&\n          xe::memory::allocation_granularity() > 0x1000) {\n        e.mov(e.eax, address + 0x1000);\n      } else {\n        e.mov(e.eax, address);\n      }\n      return e.GetMembaseReg() + e.rax;\n    }\n  } else {\n    if (xe::memory::allocation_granularity() > 0x1000) {\n      // Emulate the 4 KB physical address offset in 0xE0000000+ when can't do\n      // it via memory mapping.\n      e.cmp(guest.reg().cvt32(), 0xE0000000);\n      e.setae(e.al);\n      e.movzx(e.eax, e.al);\n      e.shl(e.eax, 12);\n      e.add(e.eax, guest.reg().cvt32());\n    } else {\n      // Clear the top 32 bits, as they are likely garbage.\n      // TODO(benvanik): find a way to avoid doing this.\n      e.mov(e.eax, guest.reg().cvt32());\n    }\n    return e.GetMembaseReg() + e.rax;\n  }\n}\n\n// ============================================================================\n// OPCODE_ATOMIC_EXCHANGE\n// ============================================================================\n// Note that the address we use here is a real, host address!\n// This is weird, and should be fixed.\ntemplate <typename SEQ, typename REG, typename ARGS>\nvoid EmitAtomicExchangeXX(X64Emitter& e, const ARGS& i) {\n  if (i.dest == i.src1) {\n    e.mov(e.rax, i.src1);\n    if (i.dest != i.src2) {\n      if (i.src2.is_constant) {\n        e.mov(i.dest, i.src2.constant());\n      } else {\n        e.mov(i.dest, i.src2);\n      }\n    }\n    e.lock();\n    e.xchg(e.dword[e.rax], i.dest);\n  } else {\n    if (i.dest != i.src2) {\n      if (i.src2.is_constant) {\n        e.mov(i.dest, i.src2.constant());\n      } else {\n        e.mov(i.dest, i.src2);\n      }\n    }\n    e.lock();\n    e.xchg(e.dword[i.src1.reg()], i.dest);\n  }\n}\nstruct ATOMIC_EXCHANGE_I8\n    : Sequence<ATOMIC_EXCHANGE_I8,\n               I<OPCODE_ATOMIC_EXCHANGE, I8Op, I64Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitAtomicExchangeXX<ATOMIC_EXCHANGE_I8, Reg8>(e, i);\n  }\n};\nstruct ATOMIC_EXCHANGE_I16\n    : Sequence<ATOMIC_EXCHANGE_I16,\n               I<OPCODE_ATOMIC_EXCHANGE, I16Op, I64Op, I16Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitAtomicExchangeXX<ATOMIC_EXCHANGE_I16, Reg16>(e, i);\n  }\n};\nstruct ATOMIC_EXCHANGE_I32\n    : Sequence<ATOMIC_EXCHANGE_I32,\n               I<OPCODE_ATOMIC_EXCHANGE, I32Op, I64Op, I32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitAtomicExchangeXX<ATOMIC_EXCHANGE_I32, Reg32>(e, i);\n  }\n};\nstruct ATOMIC_EXCHANGE_I64\n    : Sequence<ATOMIC_EXCHANGE_I64,\n               I<OPCODE_ATOMIC_EXCHANGE, I64Op, I64Op, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitAtomicExchangeXX<ATOMIC_EXCHANGE_I64, Reg64>(e, i);\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_ATOMIC_EXCHANGE, ATOMIC_EXCHANGE_I8,\n                     ATOMIC_EXCHANGE_I16, ATOMIC_EXCHANGE_I32,\n                     ATOMIC_EXCHANGE_I64);\n\n// ============================================================================\n// OPCODE_ATOMIC_COMPARE_EXCHANGE\n// ============================================================================\nstruct ATOMIC_COMPARE_EXCHANGE_I32\n    : Sequence<ATOMIC_COMPARE_EXCHANGE_I32,\n               I<OPCODE_ATOMIC_COMPARE_EXCHANGE, I8Op, I64Op, I32Op, I32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.mov(e.eax, i.src2);\n    if (xe::memory::allocation_granularity() > 0x1000) {\n      // Emulate the 4 KB physical address offset in 0xE0000000+ when can't do\n      // it via memory mapping.\n      e.cmp(i.src1.reg().cvt32(), 0xE0000000);\n      e.setae(e.cl);\n      e.movzx(e.ecx, e.cl);\n      e.shl(e.ecx, 12);\n      e.add(e.ecx, i.src1.reg().cvt32());\n    } else {\n      e.mov(e.ecx, i.src1.reg().cvt32());\n    }\n    e.lock();\n    e.cmpxchg(e.dword[e.GetMembaseReg() + e.rcx], i.src3);\n    e.sete(i.dest);\n  }\n};\nstruct ATOMIC_COMPARE_EXCHANGE_I64\n    : Sequence<ATOMIC_COMPARE_EXCHANGE_I64,\n               I<OPCODE_ATOMIC_COMPARE_EXCHANGE, I8Op, I64Op, I64Op, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.mov(e.rax, i.src2);\n    if (xe::memory::allocation_granularity() > 0x1000) {\n      // Emulate the 4 KB physical address offset in 0xE0000000+ when can't do\n      // it via memory mapping.\n      e.cmp(i.src1.reg().cvt32(), 0xE0000000);\n      e.setae(e.cl);\n      e.movzx(e.ecx, e.cl);\n      e.shl(e.ecx, 12);\n      e.add(e.ecx, i.src1.reg().cvt32());\n    } else {\n      e.mov(e.ecx, i.src1.reg().cvt32());\n    }\n    e.lock();\n    e.cmpxchg(e.qword[e.GetMembaseReg() + e.rcx], i.src3);\n    e.sete(i.dest);\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_ATOMIC_COMPARE_EXCHANGE,\n                     ATOMIC_COMPARE_EXCHANGE_I32, ATOMIC_COMPARE_EXCHANGE_I64);\n\n// ============================================================================\n// OPCODE_LOAD_LOCAL\n// ============================================================================\n// Note: all types are always aligned on the stack.\nstruct LOAD_LOCAL_I8\n    : Sequence<LOAD_LOCAL_I8, I<OPCODE_LOAD_LOCAL, I8Op, I32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.mov(i.dest, e.byte[e.rsp + i.src1.constant()]);\n    // e.TraceLoadI8(DATA_LOCAL, i.src1.constant, i.dest);\n  }\n};\nstruct LOAD_LOCAL_I16\n    : Sequence<LOAD_LOCAL_I16, I<OPCODE_LOAD_LOCAL, I16Op, I32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.mov(i.dest, e.word[e.rsp + i.src1.constant()]);\n    // e.TraceLoadI16(DATA_LOCAL, i.src1.constant, i.dest);\n  }\n};\nstruct LOAD_LOCAL_I32\n    : Sequence<LOAD_LOCAL_I32, I<OPCODE_LOAD_LOCAL, I32Op, I32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.mov(i.dest, e.dword[e.rsp + i.src1.constant()]);\n    // e.TraceLoadI32(DATA_LOCAL, i.src1.constant, i.dest);\n  }\n};\nstruct LOAD_LOCAL_I64\n    : Sequence<LOAD_LOCAL_I64, I<OPCODE_LOAD_LOCAL, I64Op, I32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.mov(i.dest, e.qword[e.rsp + i.src1.constant()]);\n    // e.TraceLoadI64(DATA_LOCAL, i.src1.constant, i.dest);\n  }\n};\nstruct LOAD_LOCAL_F32\n    : Sequence<LOAD_LOCAL_F32, I<OPCODE_LOAD_LOCAL, F32Op, I32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.vmovss(i.dest, e.dword[e.rsp + i.src1.constant()]);\n    // e.TraceLoadF32(DATA_LOCAL, i.src1.constant, i.dest);\n  }\n};\nstruct LOAD_LOCAL_F64\n    : Sequence<LOAD_LOCAL_F64, I<OPCODE_LOAD_LOCAL, F64Op, I32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.vmovsd(i.dest, e.qword[e.rsp + i.src1.constant()]);\n    // e.TraceLoadF64(DATA_LOCAL, i.src1.constant, i.dest);\n  }\n};\nstruct LOAD_LOCAL_V128\n    : Sequence<LOAD_LOCAL_V128, I<OPCODE_LOAD_LOCAL, V128Op, I32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.vmovaps(i.dest, e.ptr[e.rsp + i.src1.constant()]);\n    // e.TraceLoadV128(DATA_LOCAL, i.src1.constant, i.dest);\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_LOAD_LOCAL, LOAD_LOCAL_I8, LOAD_LOCAL_I16,\n                     LOAD_LOCAL_I32, LOAD_LOCAL_I64, LOAD_LOCAL_F32,\n                     LOAD_LOCAL_F64, LOAD_LOCAL_V128);\n\n// ============================================================================\n// OPCODE_STORE_LOCAL\n// ============================================================================\n// Note: all types are always aligned on the stack.\nstruct STORE_LOCAL_I8\n    : Sequence<STORE_LOCAL_I8, I<OPCODE_STORE_LOCAL, VoidOp, I32Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    // e.TraceStoreI8(DATA_LOCAL, i.src1.constant, i.src2);\n    e.mov(e.byte[e.rsp + i.src1.constant()], i.src2);\n  }\n};\nstruct STORE_LOCAL_I16\n    : Sequence<STORE_LOCAL_I16, I<OPCODE_STORE_LOCAL, VoidOp, I32Op, I16Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    // e.TraceStoreI16(DATA_LOCAL, i.src1.constant, i.src2);\n    e.mov(e.word[e.rsp + i.src1.constant()], i.src2);\n  }\n};\nstruct STORE_LOCAL_I32\n    : Sequence<STORE_LOCAL_I32, I<OPCODE_STORE_LOCAL, VoidOp, I32Op, I32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    // e.TraceStoreI32(DATA_LOCAL, i.src1.constant, i.src2);\n    e.mov(e.dword[e.rsp + i.src1.constant()], i.src2);\n  }\n};\nstruct STORE_LOCAL_I64\n    : Sequence<STORE_LOCAL_I64, I<OPCODE_STORE_LOCAL, VoidOp, I32Op, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    // e.TraceStoreI64(DATA_LOCAL, i.src1.constant, i.src2);\n    e.mov(e.qword[e.rsp + i.src1.constant()], i.src2);\n  }\n};\nstruct STORE_LOCAL_F32\n    : Sequence<STORE_LOCAL_F32, I<OPCODE_STORE_LOCAL, VoidOp, I32Op, F32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    // e.TraceStoreF32(DATA_LOCAL, i.src1.constant, i.src2);\n    e.vmovss(e.dword[e.rsp + i.src1.constant()], i.src2);\n  }\n};\nstruct STORE_LOCAL_F64\n    : Sequence<STORE_LOCAL_F64, I<OPCODE_STORE_LOCAL, VoidOp, I32Op, F64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    // e.TraceStoreF64(DATA_LOCAL, i.src1.constant, i.src2);\n    e.vmovsd(e.qword[e.rsp + i.src1.constant()], i.src2);\n  }\n};\nstruct STORE_LOCAL_V128\n    : Sequence<STORE_LOCAL_V128, I<OPCODE_STORE_LOCAL, VoidOp, I32Op, V128Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    // e.TraceStoreV128(DATA_LOCAL, i.src1.constant, i.src2);\n    e.vmovaps(e.ptr[e.rsp + i.src1.constant()], i.src2);\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_STORE_LOCAL, STORE_LOCAL_I8, STORE_LOCAL_I16,\n                     STORE_LOCAL_I32, STORE_LOCAL_I64, STORE_LOCAL_F32,\n                     STORE_LOCAL_F64, STORE_LOCAL_V128);\n\n// ============================================================================\n// OPCODE_LOAD_CONTEXT\n// ============================================================================\nstruct LOAD_CONTEXT_I8\n    : Sequence<LOAD_CONTEXT_I8, I<OPCODE_LOAD_CONTEXT, I8Op, OffsetOp>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    auto addr = ComputeContextAddress(e, i.src1);\n    e.mov(i.dest, e.byte[addr]);\n    if (IsTracingData()) {\n      e.mov(e.GetNativeParam(0), i.src1.value);\n      e.mov(e.GetNativeParam(1), e.byte[addr]);\n      e.CallNative(reinterpret_cast<void*>(TraceContextLoadI8));\n    }\n  }\n};\nstruct LOAD_CONTEXT_I16\n    : Sequence<LOAD_CONTEXT_I16, I<OPCODE_LOAD_CONTEXT, I16Op, OffsetOp>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    auto addr = ComputeContextAddress(e, i.src1);\n    e.mov(i.dest, e.word[addr]);\n    if (IsTracingData()) {\n      e.mov(e.GetNativeParam(1), e.word[addr]);\n      e.mov(e.GetNativeParam(0), i.src1.value);\n      e.CallNative(reinterpret_cast<void*>(TraceContextLoadI16));\n    }\n  }\n};\nstruct LOAD_CONTEXT_I32\n    : Sequence<LOAD_CONTEXT_I32, I<OPCODE_LOAD_CONTEXT, I32Op, OffsetOp>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    auto addr = ComputeContextAddress(e, i.src1);\n    e.mov(i.dest, e.dword[addr]);\n    if (IsTracingData()) {\n      e.mov(e.GetNativeParam(1), e.dword[addr]);\n      e.mov(e.GetNativeParam(0), i.src1.value);\n      e.CallNative(reinterpret_cast<void*>(TraceContextLoadI32));\n    }\n  }\n};\nstruct LOAD_CONTEXT_I64\n    : Sequence<LOAD_CONTEXT_I64, I<OPCODE_LOAD_CONTEXT, I64Op, OffsetOp>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    auto addr = ComputeContextAddress(e, i.src1);\n    e.mov(i.dest, e.qword[addr]);\n    if (IsTracingData()) {\n      e.mov(e.GetNativeParam(1), e.qword[addr]);\n      e.mov(e.GetNativeParam(0), i.src1.value);\n      e.CallNative(reinterpret_cast<void*>(TraceContextLoadI64));\n    }\n  }\n};\nstruct LOAD_CONTEXT_F32\n    : Sequence<LOAD_CONTEXT_F32, I<OPCODE_LOAD_CONTEXT, F32Op, OffsetOp>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    auto addr = ComputeContextAddress(e, i.src1);\n    e.vmovss(i.dest, e.dword[addr]);\n    if (IsTracingData()) {\n      e.lea(e.GetNativeParam(1), e.dword[addr]);\n      e.mov(e.GetNativeParam(0), i.src1.value);\n      e.CallNative(reinterpret_cast<void*>(TraceContextLoadF32));\n    }\n  }\n};\nstruct LOAD_CONTEXT_F64\n    : Sequence<LOAD_CONTEXT_F64, I<OPCODE_LOAD_CONTEXT, F64Op, OffsetOp>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    auto addr = ComputeContextAddress(e, i.src1);\n    e.vmovsd(i.dest, e.qword[addr]);\n    if (IsTracingData()) {\n      e.lea(e.GetNativeParam(1), e.qword[addr]);\n      e.mov(e.GetNativeParam(0), i.src1.value);\n      e.CallNative(reinterpret_cast<void*>(TraceContextLoadF64));\n    }\n  }\n};\nstruct LOAD_CONTEXT_V128\n    : Sequence<LOAD_CONTEXT_V128, I<OPCODE_LOAD_CONTEXT, V128Op, OffsetOp>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    auto addr = ComputeContextAddress(e, i.src1);\n    e.vmovaps(i.dest, e.ptr[addr]);\n    if (IsTracingData()) {\n      e.lea(e.GetNativeParam(1), e.ptr[addr]);\n      e.mov(e.GetNativeParam(0), i.src1.value);\n      e.CallNative(reinterpret_cast<void*>(TraceContextLoadV128));\n    }\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_LOAD_CONTEXT, LOAD_CONTEXT_I8, LOAD_CONTEXT_I16,\n                     LOAD_CONTEXT_I32, LOAD_CONTEXT_I64, LOAD_CONTEXT_F32,\n                     LOAD_CONTEXT_F64, LOAD_CONTEXT_V128);\n\n// ============================================================================\n// OPCODE_STORE_CONTEXT\n// ============================================================================\n// Note: all types are always aligned on the stack.\nstruct STORE_CONTEXT_I8\n    : Sequence<STORE_CONTEXT_I8,\n               I<OPCODE_STORE_CONTEXT, VoidOp, OffsetOp, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    auto addr = ComputeContextAddress(e, i.src1);\n    if (i.src2.is_constant) {\n      e.mov(e.byte[addr], i.src2.constant());\n    } else {\n      e.mov(e.byte[addr], i.src2);\n    }\n    if (IsTracingData()) {\n      e.mov(e.GetNativeParam(1), e.byte[addr]);\n      e.mov(e.GetNativeParam(0), i.src1.value);\n      e.CallNative(reinterpret_cast<void*>(TraceContextStoreI8));\n    }\n  }\n};\nstruct STORE_CONTEXT_I16\n    : Sequence<STORE_CONTEXT_I16,\n               I<OPCODE_STORE_CONTEXT, VoidOp, OffsetOp, I16Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    auto addr = ComputeContextAddress(e, i.src1);\n    if (i.src2.is_constant) {\n      e.mov(e.word[addr], i.src2.constant());\n    } else {\n      e.mov(e.word[addr], i.src2);\n    }\n    if (IsTracingData()) {\n      e.mov(e.GetNativeParam(1), e.word[addr]);\n      e.mov(e.GetNativeParam(0), i.src1.value);\n      e.CallNative(reinterpret_cast<void*>(TraceContextStoreI16));\n    }\n  }\n};\nstruct STORE_CONTEXT_I32\n    : Sequence<STORE_CONTEXT_I32,\n               I<OPCODE_STORE_CONTEXT, VoidOp, OffsetOp, I32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    auto addr = ComputeContextAddress(e, i.src1);\n    if (i.src2.is_constant) {\n      e.mov(e.dword[addr], i.src2.constant());\n    } else {\n      e.mov(e.dword[addr], i.src2);\n    }\n    if (IsTracingData()) {\n      e.mov(e.GetNativeParam(1), e.dword[addr]);\n      e.mov(e.GetNativeParam(0), i.src1.value);\n      e.CallNative(reinterpret_cast<void*>(TraceContextStoreI32));\n    }\n  }\n};\nstruct STORE_CONTEXT_I64\n    : Sequence<STORE_CONTEXT_I64,\n               I<OPCODE_STORE_CONTEXT, VoidOp, OffsetOp, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    auto addr = ComputeContextAddress(e, i.src1);\n    if (i.src2.is_constant) {\n      e.MovMem64(addr, i.src2.constant());\n    } else {\n      e.mov(e.qword[addr], i.src2);\n    }\n    if (IsTracingData()) {\n      e.mov(e.GetNativeParam(1), e.qword[addr]);\n      e.mov(e.GetNativeParam(0), i.src1.value);\n      e.CallNative(reinterpret_cast<void*>(TraceContextStoreI64));\n    }\n  }\n};\nstruct STORE_CONTEXT_F32\n    : Sequence<STORE_CONTEXT_F32,\n               I<OPCODE_STORE_CONTEXT, VoidOp, OffsetOp, F32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    auto addr = ComputeContextAddress(e, i.src1);\n    if (i.src2.is_constant) {\n      e.mov(e.dword[addr], i.src2.value->constant.i32);\n    } else {\n      e.vmovss(e.dword[addr], i.src2);\n    }\n    if (IsTracingData()) {\n      e.lea(e.GetNativeParam(1), e.dword[addr]);\n      e.mov(e.GetNativeParam(0), i.src1.value);\n      e.CallNative(reinterpret_cast<void*>(TraceContextStoreF32));\n    }\n  }\n};\nstruct STORE_CONTEXT_F64\n    : Sequence<STORE_CONTEXT_F64,\n               I<OPCODE_STORE_CONTEXT, VoidOp, OffsetOp, F64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    auto addr = ComputeContextAddress(e, i.src1);\n    if (i.src2.is_constant) {\n      e.MovMem64(addr, i.src2.value->constant.i64);\n    } else {\n      e.vmovsd(e.qword[addr], i.src2);\n    }\n    if (IsTracingData()) {\n      e.lea(e.GetNativeParam(1), e.qword[addr]);\n      e.mov(e.GetNativeParam(0), i.src1.value);\n      e.CallNative(reinterpret_cast<void*>(TraceContextStoreF64));\n    }\n  }\n};\nstruct STORE_CONTEXT_V128\n    : Sequence<STORE_CONTEXT_V128,\n               I<OPCODE_STORE_CONTEXT, VoidOp, OffsetOp, V128Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    auto addr = ComputeContextAddress(e, i.src1);\n    if (i.src2.is_constant) {\n      e.LoadConstantXmm(e.xmm0, i.src2.constant());\n      e.vmovaps(e.ptr[addr], e.xmm0);\n    } else {\n      e.vmovaps(e.ptr[addr], i.src2);\n    }\n    if (IsTracingData()) {\n      e.lea(e.GetNativeParam(1), e.ptr[addr]);\n      e.mov(e.GetNativeParam(0), i.src1.value);\n      e.CallNative(reinterpret_cast<void*>(TraceContextStoreV128));\n    }\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_STORE_CONTEXT, STORE_CONTEXT_I8, STORE_CONTEXT_I16,\n                     STORE_CONTEXT_I32, STORE_CONTEXT_I64, STORE_CONTEXT_F32,\n                     STORE_CONTEXT_F64, STORE_CONTEXT_V128);\n\n// ============================================================================\n// OPCODE_LOAD_MMIO\n// ============================================================================\n// Note: all types are always aligned in the context.\nstruct LOAD_MMIO_I32\n    : Sequence<LOAD_MMIO_I32, I<OPCODE_LOAD_MMIO, I32Op, OffsetOp, OffsetOp>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    // uint64_t (context, addr)\n    auto mmio_range = reinterpret_cast<MMIORange*>(i.src1.value);\n    auto read_address = uint32_t(i.src2.value);\n    e.mov(e.GetNativeParam(0), uint64_t(mmio_range->callback_context));\n    e.mov(e.GetNativeParam(1).cvt32(), read_address);\n    e.CallNativeSafe(reinterpret_cast<void*>(mmio_range->read));\n    e.bswap(e.eax);\n    e.mov(i.dest, e.eax);\n    if (IsTracingData()) {\n      e.mov(e.GetNativeParam(0), i.dest);\n      e.mov(e.edx, read_address);\n      e.CallNative(reinterpret_cast<void*>(TraceContextLoadI32));\n    }\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_LOAD_MMIO, LOAD_MMIO_I32);\n\n// ============================================================================\n// OPCODE_STORE_MMIO\n// ============================================================================\n// Note: all types are always aligned on the stack.\nstruct STORE_MMIO_I32\n    : Sequence<STORE_MMIO_I32,\n               I<OPCODE_STORE_MMIO, VoidOp, OffsetOp, OffsetOp, I32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    // void (context, addr, value)\n    auto mmio_range = reinterpret_cast<MMIORange*>(i.src1.value);\n    auto write_address = uint32_t(i.src2.value);\n    e.mov(e.GetNativeParam(0), uint64_t(mmio_range->callback_context));\n    e.mov(e.GetNativeParam(1).cvt32(), write_address);\n    if (i.src3.is_constant) {\n      e.mov(e.GetNativeParam(2).cvt32(), xe::byte_swap(i.src3.constant()));\n    } else {\n      e.mov(e.GetNativeParam(2).cvt32(), i.src3);\n      e.bswap(e.GetNativeParam(2).cvt32());\n    }\n    e.CallNativeSafe(reinterpret_cast<void*>(mmio_range->write));\n    if (IsTracingData()) {\n      if (i.src3.is_constant) {\n        e.mov(e.GetNativeParam(0).cvt32(), i.src3.constant());\n      } else {\n        e.mov(e.GetNativeParam(0).cvt32(), i.src3);\n      }\n      e.mov(e.edx, write_address);\n      e.CallNative(reinterpret_cast<void*>(TraceContextStoreI32));\n    }\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_STORE_MMIO, STORE_MMIO_I32);\n\n// ============================================================================\n// OPCODE_LOAD_OFFSET\n// ============================================================================\nstruct LOAD_OFFSET_I8\n    : Sequence<LOAD_OFFSET_I8, I<OPCODE_LOAD_OFFSET, I8Op, I64Op, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    auto addr = ComputeMemoryAddressOffset(e, i.src1, i.src2);\n    e.mov(i.dest, e.byte[addr]);\n  }\n};\n\nstruct LOAD_OFFSET_I16\n    : Sequence<LOAD_OFFSET_I16, I<OPCODE_LOAD_OFFSET, I16Op, I64Op, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    auto addr = ComputeMemoryAddressOffset(e, i.src1, i.src2);\n    if (i.instr->flags & LoadStoreFlags::LOAD_STORE_BYTE_SWAP) {\n      if (e.IsFeatureEnabled(kX64EmitMovbe)) {\n        e.movbe(i.dest, e.word[addr]);\n      } else {\n        e.mov(i.dest, e.word[addr]);\n        e.ror(i.dest, 8);\n      }\n    } else {\n      e.mov(i.dest, e.word[addr]);\n    }\n  }\n};\n\nstruct LOAD_OFFSET_I32\n    : Sequence<LOAD_OFFSET_I32, I<OPCODE_LOAD_OFFSET, I32Op, I64Op, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    auto addr = ComputeMemoryAddressOffset(e, i.src1, i.src2);\n    if (i.instr->flags & LoadStoreFlags::LOAD_STORE_BYTE_SWAP) {\n      if (e.IsFeatureEnabled(kX64EmitMovbe)) {\n        e.movbe(i.dest, e.dword[addr]);\n      } else {\n        e.mov(i.dest, e.dword[addr]);\n        e.bswap(i.dest);\n      }\n    } else {\n      e.mov(i.dest, e.dword[addr]);\n    }\n  }\n};\n\nstruct LOAD_OFFSET_I64\n    : Sequence<LOAD_OFFSET_I64, I<OPCODE_LOAD_OFFSET, I64Op, I64Op, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    auto addr = ComputeMemoryAddressOffset(e, i.src1, i.src2);\n    if (i.instr->flags & LoadStoreFlags::LOAD_STORE_BYTE_SWAP) {\n      if (e.IsFeatureEnabled(kX64EmitMovbe)) {\n        e.movbe(i.dest, e.qword[addr]);\n      } else {\n        e.mov(i.dest, e.qword[addr]);\n        e.bswap(i.dest);\n      }\n    } else {\n      e.mov(i.dest, e.qword[addr]);\n    }\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_LOAD_OFFSET, LOAD_OFFSET_I8, LOAD_OFFSET_I16,\n                     LOAD_OFFSET_I32, LOAD_OFFSET_I64);\n\n// ============================================================================\n// OPCODE_STORE_OFFSET\n// ============================================================================\nstruct STORE_OFFSET_I8\n    : Sequence<STORE_OFFSET_I8,\n               I<OPCODE_STORE_OFFSET, VoidOp, I64Op, I64Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    auto addr = ComputeMemoryAddressOffset(e, i.src1, i.src2);\n    if (i.src3.is_constant) {\n      e.mov(e.byte[addr], i.src3.constant());\n    } else {\n      e.mov(e.byte[addr], i.src3);\n    }\n  }\n};\n\nstruct STORE_OFFSET_I16\n    : Sequence<STORE_OFFSET_I16,\n               I<OPCODE_STORE_OFFSET, VoidOp, I64Op, I64Op, I16Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    auto addr = ComputeMemoryAddressOffset(e, i.src1, i.src2);\n    if (i.instr->flags & LoadStoreFlags::LOAD_STORE_BYTE_SWAP) {\n      assert_false(i.src3.is_constant);\n      if (e.IsFeatureEnabled(kX64EmitMovbe)) {\n        e.movbe(e.word[addr], i.src3);\n      } else {\n        assert_always(\"not implemented\");\n      }\n    } else {\n      if (i.src3.is_constant) {\n        e.mov(e.word[addr], i.src3.constant());\n      } else {\n        e.mov(e.word[addr], i.src3);\n      }\n    }\n  }\n};\n\nstruct STORE_OFFSET_I32\n    : Sequence<STORE_OFFSET_I32,\n               I<OPCODE_STORE_OFFSET, VoidOp, I64Op, I64Op, I32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    auto addr = ComputeMemoryAddressOffset(e, i.src1, i.src2);\n    if (i.instr->flags & LoadStoreFlags::LOAD_STORE_BYTE_SWAP) {\n      assert_false(i.src3.is_constant);\n      if (e.IsFeatureEnabled(kX64EmitMovbe)) {\n        e.movbe(e.dword[addr], i.src3);\n      } else {\n        assert_always(\"not implemented\");\n      }\n    } else {\n      if (i.src3.is_constant) {\n        e.mov(e.dword[addr], i.src3.constant());\n      } else {\n        e.mov(e.dword[addr], i.src3);\n      }\n    }\n  }\n};\n\nstruct STORE_OFFSET_I64\n    : Sequence<STORE_OFFSET_I64,\n               I<OPCODE_STORE_OFFSET, VoidOp, I64Op, I64Op, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    auto addr = ComputeMemoryAddressOffset(e, i.src1, i.src2);\n    if (i.instr->flags & LoadStoreFlags::LOAD_STORE_BYTE_SWAP) {\n      assert_false(i.src3.is_constant);\n      if (e.IsFeatureEnabled(kX64EmitMovbe)) {\n        e.movbe(e.qword[addr], i.src3);\n      } else {\n        assert_always(\"not implemented\");\n      }\n    } else {\n      if (i.src3.is_constant) {\n        e.MovMem64(addr, i.src3.constant());\n      } else {\n        e.mov(e.qword[addr], i.src3);\n      }\n    }\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_STORE_OFFSET, STORE_OFFSET_I8, STORE_OFFSET_I16,\n                     STORE_OFFSET_I32, STORE_OFFSET_I64);\n\n// ============================================================================\n// OPCODE_LOAD\n// ============================================================================\nstruct LOAD_I8 : Sequence<LOAD_I8, I<OPCODE_LOAD, I8Op, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    auto addr = ComputeMemoryAddress(e, i.src1);\n    e.mov(i.dest, e.byte[addr]);\n    if (IsTracingData()) {\n      e.mov(e.GetNativeParam(1).cvt8(), i.dest);\n      e.lea(e.GetNativeParam(0), e.ptr[addr]);\n      e.CallNative(reinterpret_cast<void*>(TraceMemoryLoadI8));\n    }\n  }\n};\nstruct LOAD_I16 : Sequence<LOAD_I16, I<OPCODE_LOAD, I16Op, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    auto addr = ComputeMemoryAddress(e, i.src1);\n    if (i.instr->flags & LoadStoreFlags::LOAD_STORE_BYTE_SWAP) {\n      if (e.IsFeatureEnabled(kX64EmitMovbe)) {\n        e.movbe(i.dest, e.word[addr]);\n      } else {\n        e.mov(i.dest, e.word[addr]);\n        e.ror(i.dest, 8);\n      }\n    } else {\n      e.mov(i.dest, e.word[addr]);\n    }\n    if (IsTracingData()) {\n      e.mov(e.GetNativeParam(1).cvt16(), i.dest);\n      e.lea(e.GetNativeParam(0), e.ptr[addr]);\n      e.CallNative(reinterpret_cast<void*>(TraceMemoryLoadI16));\n    }\n  }\n};\nstruct LOAD_I32 : Sequence<LOAD_I32, I<OPCODE_LOAD, I32Op, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    auto addr = ComputeMemoryAddress(e, i.src1);\n    if (i.instr->flags & LoadStoreFlags::LOAD_STORE_BYTE_SWAP) {\n      if (e.IsFeatureEnabled(kX64EmitMovbe)) {\n        e.movbe(i.dest, e.dword[addr]);\n      } else {\n        e.mov(i.dest, e.dword[addr]);\n        e.bswap(i.dest);\n      }\n    } else {\n      e.mov(i.dest, e.dword[addr]);\n    }\n    if (IsTracingData()) {\n      e.mov(e.GetNativeParam(1).cvt32(), i.dest);\n      e.lea(e.GetNativeParam(0), e.ptr[addr]);\n      e.CallNative(reinterpret_cast<void*>(TraceMemoryLoadI32));\n    }\n  }\n};\nstruct LOAD_I64 : Sequence<LOAD_I64, I<OPCODE_LOAD, I64Op, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    auto addr = ComputeMemoryAddress(e, i.src1);\n    if (i.instr->flags & LoadStoreFlags::LOAD_STORE_BYTE_SWAP) {\n      if (e.IsFeatureEnabled(kX64EmitMovbe)) {\n        e.movbe(i.dest, e.qword[addr]);\n      } else {\n        e.mov(i.dest, e.qword[addr]);\n        e.bswap(i.dest);\n      }\n    } else {\n      e.mov(i.dest, e.qword[addr]);\n    }\n    if (IsTracingData()) {\n      e.mov(e.GetNativeParam(1), i.dest);\n      e.lea(e.GetNativeParam(0), e.ptr[addr]);\n      e.CallNative(reinterpret_cast<void*>(TraceMemoryLoadI64));\n    }\n  }\n};\nstruct LOAD_F32 : Sequence<LOAD_F32, I<OPCODE_LOAD, F32Op, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    auto addr = ComputeMemoryAddress(e, i.src1);\n    e.vmovss(i.dest, e.dword[addr]);\n    if (i.instr->flags & LoadStoreFlags::LOAD_STORE_BYTE_SWAP) {\n      assert_always(\"not implemented yet\");\n    }\n    if (IsTracingData()) {\n      e.lea(e.GetNativeParam(1), e.dword[addr]);\n      e.lea(e.GetNativeParam(0), e.ptr[addr]);\n      e.CallNative(reinterpret_cast<void*>(TraceMemoryLoadF32));\n    }\n  }\n};\nstruct LOAD_F64 : Sequence<LOAD_F64, I<OPCODE_LOAD, F64Op, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    auto addr = ComputeMemoryAddress(e, i.src1);\n    e.vmovsd(i.dest, e.qword[addr]);\n    if (i.instr->flags & LoadStoreFlags::LOAD_STORE_BYTE_SWAP) {\n      assert_always(\"not implemented yet\");\n    }\n    if (IsTracingData()) {\n      e.lea(e.GetNativeParam(1), e.qword[addr]);\n      e.lea(e.GetNativeParam(0), e.ptr[addr]);\n      e.CallNative(reinterpret_cast<void*>(TraceMemoryLoadF64));\n    }\n  }\n};\nstruct LOAD_V128 : Sequence<LOAD_V128, I<OPCODE_LOAD, V128Op, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    auto addr = ComputeMemoryAddress(e, i.src1);\n    // TODO(benvanik): we should try to stick to movaps if possible.\n    e.vmovups(i.dest, e.ptr[addr]);\n    if (i.instr->flags & LoadStoreFlags::LOAD_STORE_BYTE_SWAP) {\n      // TODO(benvanik): find a way to do this without the memory load.\n      e.vpshufb(i.dest, i.dest, e.GetXmmConstPtr(XMMByteSwapMask));\n    }\n    if (IsTracingData()) {\n      e.lea(e.GetNativeParam(1), e.ptr[addr]);\n      e.lea(e.GetNativeParam(0), e.ptr[addr]);\n      e.CallNative(reinterpret_cast<void*>(TraceMemoryLoadV128));\n    }\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_LOAD, LOAD_I8, LOAD_I16, LOAD_I32, LOAD_I64,\n                     LOAD_F32, LOAD_F64, LOAD_V128);\n\n// ============================================================================\n// OPCODE_STORE\n// ============================================================================\n// Note: most *should* be aligned, but needs to be checked!\nstruct STORE_I8 : Sequence<STORE_I8, I<OPCODE_STORE, VoidOp, I64Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    auto addr = ComputeMemoryAddress(e, i.src1);\n    if (i.src2.is_constant) {\n      e.mov(e.byte[addr], i.src2.constant());\n    } else {\n      e.mov(e.byte[addr], i.src2);\n    }\n    if (IsTracingData()) {\n      addr = ComputeMemoryAddress(e, i.src1);\n      e.mov(e.GetNativeParam(1).cvt8(), e.byte[addr]);\n      e.lea(e.GetNativeParam(0), e.ptr[addr]);\n      e.CallNative(reinterpret_cast<void*>(TraceMemoryStoreI8));\n    }\n  }\n};\nstruct STORE_I16 : Sequence<STORE_I16, I<OPCODE_STORE, VoidOp, I64Op, I16Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    auto addr = ComputeMemoryAddress(e, i.src1);\n    if (i.instr->flags & LoadStoreFlags::LOAD_STORE_BYTE_SWAP) {\n      assert_false(i.src2.is_constant);\n      if (e.IsFeatureEnabled(kX64EmitMovbe)) {\n        e.movbe(e.word[addr], i.src2);\n      } else {\n        assert_always(\"not implemented\");\n      }\n    } else {\n      if (i.src2.is_constant) {\n        e.mov(e.word[addr], i.src2.constant());\n      } else {\n        e.mov(e.word[addr], i.src2);\n      }\n    }\n    if (IsTracingData()) {\n      addr = ComputeMemoryAddress(e, i.src1);\n      e.mov(e.GetNativeParam(1).cvt16(), e.word[addr]);\n      e.lea(e.GetNativeParam(0), e.ptr[addr]);\n      e.CallNative(reinterpret_cast<void*>(TraceMemoryStoreI16));\n    }\n  }\n};\nstruct STORE_I32 : Sequence<STORE_I32, I<OPCODE_STORE, VoidOp, I64Op, I32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    auto addr = ComputeMemoryAddress(e, i.src1);\n    if (i.instr->flags & LoadStoreFlags::LOAD_STORE_BYTE_SWAP) {\n      assert_false(i.src2.is_constant);\n      if (e.IsFeatureEnabled(kX64EmitMovbe)) {\n        e.movbe(e.dword[addr], i.src2);\n      } else {\n        assert_always(\"not implemented\");\n      }\n    } else {\n      if (i.src2.is_constant) {\n        e.mov(e.dword[addr], i.src2.constant());\n      } else {\n        e.mov(e.dword[addr], i.src2);\n      }\n    }\n    if (IsTracingData()) {\n      addr = ComputeMemoryAddress(e, i.src1);\n      e.mov(e.GetNativeParam(1).cvt32(), e.dword[addr]);\n      e.lea(e.GetNativeParam(0), e.ptr[addr]);\n      e.CallNative(reinterpret_cast<void*>(TraceMemoryStoreI32));\n    }\n  }\n};\nstruct STORE_I64 : Sequence<STORE_I64, I<OPCODE_STORE, VoidOp, I64Op, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    auto addr = ComputeMemoryAddress(e, i.src1);\n    if (i.instr->flags & LoadStoreFlags::LOAD_STORE_BYTE_SWAP) {\n      assert_false(i.src2.is_constant);\n      if (e.IsFeatureEnabled(kX64EmitMovbe)) {\n        e.movbe(e.qword[addr], i.src2);\n      } else {\n        assert_always(\"not implemented\");\n      }\n    } else {\n      if (i.src2.is_constant) {\n        e.MovMem64(addr, i.src2.constant());\n      } else {\n        e.mov(e.qword[addr], i.src2);\n      }\n    }\n    if (IsTracingData()) {\n      addr = ComputeMemoryAddress(e, i.src1);\n      e.mov(e.GetNativeParam(1), e.qword[addr]);\n      e.lea(e.GetNativeParam(0), e.ptr[addr]);\n      e.CallNative(reinterpret_cast<void*>(TraceMemoryStoreI64));\n    }\n  }\n};\nstruct STORE_F32 : Sequence<STORE_F32, I<OPCODE_STORE, VoidOp, I64Op, F32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    auto addr = ComputeMemoryAddress(e, i.src1);\n    if (i.instr->flags & LoadStoreFlags::LOAD_STORE_BYTE_SWAP) {\n      assert_false(i.src2.is_constant);\n      assert_always(\"not yet implemented\");\n    } else {\n      if (i.src2.is_constant) {\n        e.mov(e.dword[addr], i.src2.value->constant.i32);\n      } else {\n        e.vmovss(e.dword[addr], i.src2);\n      }\n    }\n    if (IsTracingData()) {\n      addr = ComputeMemoryAddress(e, i.src1);\n      e.lea(e.GetNativeParam(1), e.ptr[addr]);\n      e.lea(e.GetNativeParam(0), e.ptr[addr]);\n      e.CallNative(reinterpret_cast<void*>(TraceMemoryStoreF32));\n    }\n  }\n};\nstruct STORE_F64 : Sequence<STORE_F64, I<OPCODE_STORE, VoidOp, I64Op, F64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    auto addr = ComputeMemoryAddress(e, i.src1);\n    if (i.instr->flags & LoadStoreFlags::LOAD_STORE_BYTE_SWAP) {\n      assert_false(i.src2.is_constant);\n      assert_always(\"not yet implemented\");\n    } else {\n      if (i.src2.is_constant) {\n        e.MovMem64(addr, i.src2.value->constant.i64);\n      } else {\n        e.vmovsd(e.qword[addr], i.src2);\n      }\n    }\n    if (IsTracingData()) {\n      addr = ComputeMemoryAddress(e, i.src1);\n      e.lea(e.GetNativeParam(1), e.ptr[addr]);\n      e.lea(e.GetNativeParam(0), e.ptr[addr]);\n      e.CallNative(reinterpret_cast<void*>(TraceMemoryStoreF64));\n    }\n  }\n};\nstruct STORE_V128\n    : Sequence<STORE_V128, I<OPCODE_STORE, VoidOp, I64Op, V128Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    auto addr = ComputeMemoryAddress(e, i.src1);\n    if (i.instr->flags & LoadStoreFlags::LOAD_STORE_BYTE_SWAP) {\n      assert_false(i.src2.is_constant);\n      e.vpshufb(e.xmm0, i.src2, e.GetXmmConstPtr(XMMByteSwapMask));\n      e.vmovaps(e.ptr[addr], e.xmm0);\n    } else {\n      if (i.src2.is_constant) {\n        e.LoadConstantXmm(e.xmm0, i.src2.constant());\n        e.vmovaps(e.ptr[addr], e.xmm0);\n      } else {\n        e.vmovaps(e.ptr[addr], i.src2);\n      }\n    }\n    if (IsTracingData()) {\n      addr = ComputeMemoryAddress(e, i.src1);\n      e.lea(e.GetNativeParam(1), e.ptr[addr]);\n      e.lea(e.GetNativeParam(0), e.ptr[addr]);\n      e.CallNative(reinterpret_cast<void*>(TraceMemoryStoreV128));\n    }\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_STORE, STORE_I8, STORE_I16, STORE_I32, STORE_I64,\n                     STORE_F32, STORE_F64, STORE_V128);\n\n// ============================================================================\n// OPCODE_CACHE_CONTROL\n// ============================================================================\nstruct CACHE_CONTROL\n    : Sequence<CACHE_CONTROL,\n               I<OPCODE_CACHE_CONTROL, VoidOp, I64Op, OffsetOp>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    bool is_clflush = false, is_prefetch = false;\n    switch (CacheControlType(i.instr->flags)) {\n      case CacheControlType::CACHE_CONTROL_TYPE_DATA_TOUCH:\n      case CacheControlType::CACHE_CONTROL_TYPE_DATA_TOUCH_FOR_STORE:\n        is_prefetch = true;\n        break;\n      case CacheControlType::CACHE_CONTROL_TYPE_DATA_STORE:\n      case CacheControlType::CACHE_CONTROL_TYPE_DATA_STORE_AND_FLUSH:\n        is_clflush = true;\n        break;\n      default:\n        assert_unhandled_case(CacheControlType(i.instr->flags));\n        return;\n    }\n    size_t cache_line_size = i.src2.value;\n\n    RegExp addr;\n    uint32_t address_constant;\n    if (i.src1.is_constant) {\n      // TODO(benvanik): figure out how to do this without a temp.\n      // Since the constant is often 0x8... if we tried to use that as a\n      // displacement it would be sign extended and mess things up.\n      address_constant = static_cast<uint32_t>(i.src1.constant());\n      if (address_constant < 0x80000000) {\n        addr = e.GetMembaseReg() + address_constant;\n      } else {\n        if (address_constant >= 0xE0000000 &&\n            xe::memory::allocation_granularity() > 0x1000) {\n          e.mov(e.eax, address_constant + 0x1000);\n        } else {\n          e.mov(e.eax, address_constant);\n        }\n        addr = e.GetMembaseReg() + e.rax;\n      }\n    } else {\n      if (xe::memory::allocation_granularity() > 0x1000) {\n        // Emulate the 4 KB physical address offset in 0xE0000000+ when can't do\n        // it via memory mapping.\n        e.cmp(i.src1.reg().cvt32(), 0xE0000000);\n        e.setae(e.al);\n        e.movzx(e.eax, e.al);\n        e.shl(e.eax, 12);\n        e.add(e.eax, i.src1.reg().cvt32());\n      } else {\n        // Clear the top 32 bits, as they are likely garbage.\n        // TODO(benvanik): find a way to avoid doing this.\n        e.mov(e.eax, i.src1.reg().cvt32());\n      }\n      addr = e.GetMembaseReg() + e.rax;\n    }\n    if (is_clflush) {\n      e.clflush(e.ptr[addr]);\n    }\n    if (is_prefetch) {\n      e.prefetcht0(e.ptr[addr]);\n    }\n\n    if (cache_line_size >= 128) {\n      // Prefetch the other 64 bytes of the 128-byte cache line.\n      if (i.src1.is_constant && address_constant < 0x80000000) {\n        addr = e.GetMembaseReg() + (address_constant ^ 64);\n      } else {\n        e.xor_(e.eax, 64);\n      }\n      if (is_clflush) {\n        e.clflush(e.ptr[addr]);\n      }\n      if (is_prefetch) {\n        e.prefetcht0(e.ptr[addr]);\n      }\n      assert_true(cache_line_size == 128);\n    }\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_CACHE_CONTROL, CACHE_CONTROL);\n\n// ============================================================================\n// OPCODE_MEMORY_BARRIER\n// ============================================================================\nstruct MEMORY_BARRIER\n    : Sequence<MEMORY_BARRIER, I<OPCODE_MEMORY_BARRIER, VoidOp>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) { e.mfence(); }\n};\nEMITTER_OPCODE_TABLE(OPCODE_MEMORY_BARRIER, MEMORY_BARRIER);\n\n// ============================================================================\n// OPCODE_MEMSET\n// ============================================================================\nstruct MEMSET_I64_I8_I64\n    : Sequence<MEMSET_I64_I8_I64,\n               I<OPCODE_MEMSET, VoidOp, I64Op, I8Op, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    assert_true(i.src2.is_constant);\n    assert_true(i.src3.is_constant);\n    assert_true(i.src2.constant() == 0);\n    e.vpxor(e.xmm0, e.xmm0);\n    auto addr = ComputeMemoryAddress(e, i.src1);\n    switch (i.src3.constant()) {\n      case 32:\n        e.vmovaps(e.ptr[addr + 0 * 16], e.xmm0);\n        e.vmovaps(e.ptr[addr + 1 * 16], e.xmm0);\n        break;\n      case 128:\n        e.vmovaps(e.ptr[addr + 0 * 16], e.xmm0);\n        e.vmovaps(e.ptr[addr + 1 * 16], e.xmm0);\n        e.vmovaps(e.ptr[addr + 2 * 16], e.xmm0);\n        e.vmovaps(e.ptr[addr + 3 * 16], e.xmm0);\n        e.vmovaps(e.ptr[addr + 4 * 16], e.xmm0);\n        e.vmovaps(e.ptr[addr + 5 * 16], e.xmm0);\n        e.vmovaps(e.ptr[addr + 6 * 16], e.xmm0);\n        e.vmovaps(e.ptr[addr + 7 * 16], e.xmm0);\n        break;\n      default:\n        assert_unhandled_case(i.src3.constant());\n        break;\n    }\n    if (IsTracingData()) {\n      addr = ComputeMemoryAddress(e, i.src1);\n      e.mov(e.GetNativeParam(2), i.src3.constant());\n      e.mov(e.GetNativeParam(1), i.src2.constant());\n      e.lea(e.GetNativeParam(0), e.ptr[addr]);\n      e.CallNative(reinterpret_cast<void*>(TraceMemset));\n    }\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_MEMSET, MEMSET_I64_I8_I64);\n\n}  // namespace x64\n}  // namespace backend\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/backend/x64/x64_seq_vector.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Xenia Developers. All rights reserved.                      *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/backend/x64/x64_sequences.h\"\n\n#include <algorithm>\n#include <cstring>\n\n#include \"xenia/cpu/backend/x64/x64_op.h\"\n\n// For OPCODE_PACK/OPCODE_UNPACK\n#include \"third_party/half/include/half.hpp\"\n\nnamespace xe {\nnamespace cpu {\nnamespace backend {\nnamespace x64 {\n\nvolatile int anchor_vector = 0;\n\n// ============================================================================\n// OPCODE_VECTOR_CONVERT_I2F\n// ============================================================================\nstruct VECTOR_CONVERT_I2F\n    : Sequence<VECTOR_CONVERT_I2F,\n               I<OPCODE_VECTOR_CONVERT_I2F, V128Op, V128Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    // flags = ARITHMETIC_UNSIGNED\n    if (i.instr->flags & ARITHMETIC_UNSIGNED) {\n      // Round manually to (1.stored mantissa bits * 2^31) or to 2^32 to the\n      // nearest even (the only rounding mode used on AltiVec) if the number is\n      // 0x80000000 or greater, instead of converting src & 0x7FFFFFFF and then\n      // adding 2147483648.0f, which results in double rounding that can give a\n      // result larger than needed - see OPCODE_VECTOR_CONVERT_I2F notes.\n\n      // [0x80000000, 0xFFFFFFFF] case:\n\n      // Round to the nearest even, from (0x80000000 | 31 stored mantissa bits)\n      // to ((-1 << 23) | 23 stored mantissa bits), or to 0 if the result should\n      // be 4294967296.0f.\n      // xmm0 = src + 0b01111111 + ((src >> 8) & 1)\n      // (xmm1 also used to launch reg + mem early and to require it late)\n      e.vpaddd(e.xmm1, i.src1, e.GetXmmConstPtr(XMMInt127));\n      e.vpslld(e.xmm0, i.src1, 31 - 8);\n      e.vpsrld(e.xmm0, e.xmm0, 31);\n      e.vpaddd(e.xmm0, e.xmm0, e.xmm1);\n      // xmm0 = (0xFF800000 | 23 explicit mantissa bits), or 0 if overflowed\n      e.vpsrad(e.xmm0, e.xmm0, 8);\n      // Calculate the result for the [0x80000000, 0xFFFFFFFF] case - take the\n      // rounded mantissa, and add -1 or 0 to the exponent of 32, depending on\n      // whether the number should be (1.stored mantissa bits * 2^31) or 2^32.\n      // xmm0 = [0x80000000, 0xFFFFFFFF] case result\n      e.vpaddd(e.xmm0, e.xmm0, e.GetXmmConstPtr(XMM2To32));\n\n      // [0x00000000, 0x7FFFFFFF] case\n      // (during vblendvps reg -> vpaddd reg -> vpaddd mem dependency):\n\n      // Convert from signed integer to float.\n      // xmm1 = [0x00000000, 0x7FFFFFFF] case result\n      e.vcvtdq2ps(e.xmm1, i.src1);\n\n      // Merge the two ways depending on whether the number is >= 0x80000000\n      // (has high bit set).\n      e.vblendvps(i.dest, e.xmm1, e.xmm0, i.src1);\n    } else {\n      e.vcvtdq2ps(i.dest, i.src1);\n    }\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_VECTOR_CONVERT_I2F, VECTOR_CONVERT_I2F);\n\n// ============================================================================\n// OPCODE_VECTOR_CONVERT_F2I\n// ============================================================================\nstruct VECTOR_CONVERT_F2I\n    : Sequence<VECTOR_CONVERT_F2I,\n               I<OPCODE_VECTOR_CONVERT_F2I, V128Op, V128Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    if (i.instr->flags & ARITHMETIC_UNSIGNED) {\n      if (e.IsFeatureEnabled(kX64EmitAVX512Ortho)) {\n        Opmask mask = e.k1;\n        // Mask positive values and unordered values\n        // _CMP_NLT_UQ\n        e.vcmpps(mask, i.src1, e.GetXmmConstPtr(XMMZero), 0x15);\n\n        // vcvttps2udq will saturate overflowing positive values and unordered\n        // values to UINT_MAX. Mask registers will write zero everywhere\n        // else (negative values)\n        e.vcvttps2udq(i.dest.reg() | mask | e.T_z, i.src1);\n        return;\n      }\n\n      // clamp to min 0\n      e.vmaxps(e.xmm0, i.src1, e.GetXmmConstPtr(XMMZero));\n\n      // xmm1 = mask of values >= (unsigned)INT_MIN\n      e.vcmpgeps(e.xmm1, e.xmm0, e.GetXmmConstPtr(XMMPosIntMinPS));\n\n      // scale any values >= (unsigned)INT_MIN back to [0, ...]\n      e.vsubps(e.xmm2, e.xmm0, e.GetXmmConstPtr(XMMPosIntMinPS));\n      e.vblendvps(e.xmm0, e.xmm0, e.xmm2, e.xmm1);\n\n      // xmm0 = [0, INT_MAX]\n      // this may still contain values > INT_MAX (if src has vals > UINT_MAX)\n      e.vcvttps2dq(i.dest, e.xmm0);\n\n      // xmm0 = mask of values that need saturation\n      e.vpcmpeqd(e.xmm0, i.dest, e.GetXmmConstPtr(XMMIntMin));\n\n      // scale values back above [INT_MIN, UINT_MAX]\n      e.vpand(e.xmm1, e.xmm1, e.GetXmmConstPtr(XMMIntMin));\n      e.vpaddd(i.dest, i.dest, e.xmm1);\n\n      // saturate values > UINT_MAX\n      e.vpor(i.dest, i.dest, e.xmm0);\n    } else {\n      // xmm2 = NaN mask\n      e.vcmpunordps(e.xmm2, i.src1, i.src1);\n\n      // convert packed floats to packed dwords\n      e.vcvttps2dq(e.xmm0, i.src1);\n\n      // (high bit) xmm1 = dest is indeterminate and i.src1 >= 0\n      e.vpcmpeqd(e.xmm1, e.xmm0, e.GetXmmConstPtr(XMMIntMin));\n      e.vpandn(e.xmm1, i.src1, e.xmm1);\n\n      // saturate positive values\n      e.vblendvps(i.dest, e.xmm0, e.GetXmmConstPtr(XMMIntMax), e.xmm1);\n\n      // mask NaNs\n      e.vpandn(i.dest, e.xmm2, i.dest);\n    }\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_VECTOR_CONVERT_F2I, VECTOR_CONVERT_F2I);\n\n// ============================================================================\n// OPCODE_LOAD_VECTOR_SHL\n// ============================================================================\nstatic const vec128_t lvsl_table[16] = {\n    vec128b(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15),\n    vec128b(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16),\n    vec128b(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17),\n    vec128b(3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18),\n    vec128b(4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19),\n    vec128b(5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20),\n    vec128b(6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21),\n    vec128b(7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22),\n    vec128b(8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23),\n    vec128b(9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24),\n    vec128b(10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25),\n    vec128b(11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26),\n    vec128b(12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27),\n    vec128b(13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28),\n    vec128b(14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29),\n    vec128b(15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30),\n};\nstruct LOAD_VECTOR_SHL_I8\n    : Sequence<LOAD_VECTOR_SHL_I8, I<OPCODE_LOAD_VECTOR_SHL, V128Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    if (i.src1.is_constant) {\n      auto sh = i.src1.constant();\n      assert_true(sh < xe::countof(lvsl_table));\n      e.mov(e.rax, (uintptr_t)&lvsl_table[sh]);\n      e.vmovaps(i.dest, e.ptr[e.rax]);\n    } else {\n      // TODO(benvanik): find a cheaper way of doing this.\n      e.movzx(e.rdx, i.src1);\n      e.and_(e.dx, 0xF);\n      e.shl(e.dx, 4);\n      e.mov(e.rax, (uintptr_t)lvsl_table);\n      e.vmovaps(i.dest, e.ptr[e.rax + e.rdx]);\n    }\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_LOAD_VECTOR_SHL, LOAD_VECTOR_SHL_I8);\n\n// ============================================================================\n// OPCODE_LOAD_VECTOR_SHR\n// ============================================================================\nstatic const vec128_t lvsr_table[16] = {\n    vec128b(16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31),\n    vec128b(15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30),\n    vec128b(14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29),\n    vec128b(13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28),\n    vec128b(12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27),\n    vec128b(11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26),\n    vec128b(10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25),\n    vec128b(9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24),\n    vec128b(8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23),\n    vec128b(7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22),\n    vec128b(6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21),\n    vec128b(5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20),\n    vec128b(4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19),\n    vec128b(3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18),\n    vec128b(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17),\n    vec128b(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16),\n};\nstruct LOAD_VECTOR_SHR_I8\n    : Sequence<LOAD_VECTOR_SHR_I8, I<OPCODE_LOAD_VECTOR_SHR, V128Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    if (i.src1.is_constant) {\n      auto sh = i.src1.constant();\n      assert_true(sh < xe::countof(lvsr_table));\n      e.mov(e.rax, (uintptr_t)&lvsr_table[sh]);\n      e.vmovaps(i.dest, e.ptr[e.rax]);\n    } else {\n      // TODO(benvanik): find a cheaper way of doing this.\n      e.movzx(e.rdx, i.src1);\n      e.and_(e.dx, 0xF);\n      e.shl(e.dx, 4);\n      e.mov(e.rax, (uintptr_t)lvsr_table);\n      e.vmovaps(i.dest, e.ptr[e.rax + e.rdx]);\n    }\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_LOAD_VECTOR_SHR, LOAD_VECTOR_SHR_I8);\n\n// ============================================================================\n// OPCODE_VECTOR_MAX\n// ============================================================================\nstruct VECTOR_MAX\n    : Sequence<VECTOR_MAX, I<OPCODE_VECTOR_MAX, V128Op, V128Op, V128Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitCommutativeBinaryXmmOp(\n        e, i, [&i](X64Emitter& e, Xmm dest, Xmm src1, Xmm src2) {\n          uint32_t part_type = i.instr->flags >> 8;\n          if (i.instr->flags & ARITHMETIC_UNSIGNED) {\n            switch (part_type) {\n              case INT8_TYPE:\n                e.vpmaxub(dest, src1, src2);\n                break;\n              case INT16_TYPE:\n                e.vpmaxuw(dest, src1, src2);\n                break;\n              case INT32_TYPE:\n                e.vpmaxud(dest, src1, src2);\n                break;\n              default:\n                assert_unhandled_case(part_type);\n                break;\n            }\n          } else {\n            switch (part_type) {\n              case INT8_TYPE:\n                e.vpmaxsb(dest, src1, src2);\n                break;\n              case INT16_TYPE:\n                e.vpmaxsw(dest, src1, src2);\n                break;\n              case INT32_TYPE:\n                e.vpmaxsd(dest, src1, src2);\n                break;\n              default:\n                assert_unhandled_case(part_type);\n                break;\n            }\n          }\n        });\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_VECTOR_MAX, VECTOR_MAX);\n\n// ============================================================================\n// OPCODE_VECTOR_MIN\n// ============================================================================\nstruct VECTOR_MIN\n    : Sequence<VECTOR_MIN, I<OPCODE_VECTOR_MIN, V128Op, V128Op, V128Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitCommutativeBinaryXmmOp(\n        e, i, [&i](X64Emitter& e, Xmm dest, Xmm src1, Xmm src2) {\n          uint32_t part_type = i.instr->flags >> 8;\n          if (i.instr->flags & ARITHMETIC_UNSIGNED) {\n            switch (part_type) {\n              case INT8_TYPE:\n                e.vpminub(dest, src1, src2);\n                break;\n              case INT16_TYPE:\n                e.vpminuw(dest, src1, src2);\n                break;\n              case INT32_TYPE:\n                e.vpminud(dest, src1, src2);\n                break;\n              default:\n                assert_unhandled_case(part_type);\n                break;\n            }\n          } else {\n            switch (part_type) {\n              case INT8_TYPE:\n                e.vpminsb(dest, src1, src2);\n                break;\n              case INT16_TYPE:\n                e.vpminsw(dest, src1, src2);\n                break;\n              case INT32_TYPE:\n                e.vpminsd(dest, src1, src2);\n                break;\n              default:\n                assert_unhandled_case(part_type);\n                break;\n            }\n          }\n        });\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_VECTOR_MIN, VECTOR_MIN);\n\n// ============================================================================\n// OPCODE_VECTOR_COMPARE_EQ\n// ============================================================================\nstruct VECTOR_COMPARE_EQ_V128\n    : Sequence<VECTOR_COMPARE_EQ_V128,\n               I<OPCODE_VECTOR_COMPARE_EQ, V128Op, V128Op, V128Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitCommutativeBinaryXmmOp(\n        e, i, [&i](X64Emitter& e, Xmm dest, Xmm src1, Xmm src2) {\n          switch (i.instr->flags) {\n            case INT8_TYPE:\n              e.vpcmpeqb(dest, src1, src2);\n              break;\n            case INT16_TYPE:\n              e.vpcmpeqw(dest, src1, src2);\n              break;\n            case INT32_TYPE:\n              e.vpcmpeqd(dest, src1, src2);\n              break;\n            case FLOAT32_TYPE:\n              e.vcmpeqps(dest, src1, src2);\n              break;\n          }\n        });\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_VECTOR_COMPARE_EQ, VECTOR_COMPARE_EQ_V128);\n\n// ============================================================================\n// OPCODE_VECTOR_COMPARE_SGT\n// ============================================================================\nstruct VECTOR_COMPARE_SGT_V128\n    : Sequence<VECTOR_COMPARE_SGT_V128,\n               I<OPCODE_VECTOR_COMPARE_SGT, V128Op, V128Op, V128Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitAssociativeBinaryXmmOp(\n        e, i, [&i](X64Emitter& e, Xmm dest, Xmm src1, Xmm src2) {\n          switch (i.instr->flags) {\n            case INT8_TYPE:\n              e.vpcmpgtb(dest, src1, src2);\n              break;\n            case INT16_TYPE:\n              e.vpcmpgtw(dest, src1, src2);\n              break;\n            case INT32_TYPE:\n              e.vpcmpgtd(dest, src1, src2);\n              break;\n            case FLOAT32_TYPE:\n              e.vcmpgtps(dest, src1, src2);\n              break;\n          }\n        });\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_VECTOR_COMPARE_SGT, VECTOR_COMPARE_SGT_V128);\n\n// ============================================================================\n// OPCODE_VECTOR_COMPARE_SGE\n// ============================================================================\nstruct VECTOR_COMPARE_SGE_V128\n    : Sequence<VECTOR_COMPARE_SGE_V128,\n               I<OPCODE_VECTOR_COMPARE_SGE, V128Op, V128Op, V128Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitAssociativeBinaryXmmOp(\n        e, i, [&i](X64Emitter& e, Xmm dest, Xmm src1, Xmm src2) {\n          switch (i.instr->flags) {\n            case INT8_TYPE:\n              e.vpcmpeqb(e.xmm0, src1, src2);\n              e.vpcmpgtb(dest, src1, src2);\n              e.vpor(dest, e.xmm0);\n              break;\n            case INT16_TYPE:\n              e.vpcmpeqw(e.xmm0, src1, src2);\n              e.vpcmpgtw(dest, src1, src2);\n              e.vpor(dest, e.xmm0);\n              break;\n            case INT32_TYPE:\n              e.vpcmpeqd(e.xmm0, src1, src2);\n              e.vpcmpgtd(dest, src1, src2);\n              e.vpor(dest, e.xmm0);\n              break;\n            case FLOAT32_TYPE:\n              e.vcmpgeps(dest, src1, src2);\n              break;\n          }\n        });\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_VECTOR_COMPARE_SGE, VECTOR_COMPARE_SGE_V128);\n\n// ============================================================================\n// OPCODE_VECTOR_COMPARE_UGT\n// ============================================================================\nstruct VECTOR_COMPARE_UGT_V128\n    : Sequence<VECTOR_COMPARE_UGT_V128,\n               I<OPCODE_VECTOR_COMPARE_UGT, V128Op, V128Op, V128Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    if (e.IsFeatureEnabled(kX64EmitAVX512Ortho | kX64EmitAVX512BW |\n                           kX64EmitAVX512DQ) &&\n        (i.instr->flags != FLOAT32_TYPE)) {\n      Xmm src1 = e.xmm0;\n      if (i.src1.is_constant) {\n        e.LoadConstantXmm(src1, i.src1.constant());\n      } else {\n        src1 = i.src1;\n      }\n\n      Xmm src2 = e.xmm1;\n      if (i.src2.is_constant) {\n        e.LoadConstantXmm(src2, i.src2.constant());\n      } else {\n        src2 = i.src2;\n      }\n\n      switch (i.instr->flags) {\n        case INT8_TYPE:\n          e.vpcmpub(e.k1, src1, src2, 0x6);\n          e.vpmovm2b(i.dest, e.k1);\n          break;\n        case INT16_TYPE:\n          e.vpcmpuw(e.k1, src1, src2, 0x6);\n          e.vpmovm2w(i.dest, e.k1);\n          break;\n        case INT32_TYPE:\n          e.vpcmpud(e.k1, src1, src2, 0x6);\n          e.vpmovm2d(i.dest, e.k1);\n          break;\n        default:\n          assert_always();\n          break;\n      }\n      return;\n    }\n\n    Xbyak::Address sign_addr = e.ptr[e.rax];  // dummy\n    switch (i.instr->flags) {\n      case INT8_TYPE:\n        sign_addr = e.GetXmmConstPtr(XMMSignMaskI8);\n        break;\n      case INT16_TYPE:\n        sign_addr = e.GetXmmConstPtr(XMMSignMaskI16);\n        break;\n      case INT32_TYPE:\n        sign_addr = e.GetXmmConstPtr(XMMSignMaskI32);\n        break;\n      case FLOAT32_TYPE:\n        sign_addr = e.GetXmmConstPtr(XMMSignMaskF32);\n        break;\n      default:\n        assert_always();\n        break;\n    }\n    if (i.src1.is_constant) {\n      // TODO(benvanik): make this constant.\n      e.LoadConstantXmm(e.xmm0, i.src1.constant());\n      e.vpxor(e.xmm0, sign_addr);\n    } else {\n      e.vpxor(e.xmm0, i.src1, sign_addr);\n    }\n    if (i.src2.is_constant) {\n      // TODO(benvanik): make this constant.\n      e.LoadConstantXmm(e.xmm1, i.src2.constant());\n      e.vpxor(e.xmm1, sign_addr);\n    } else {\n      e.vpxor(e.xmm1, i.src2, sign_addr);\n    }\n    switch (i.instr->flags) {\n      case INT8_TYPE:\n        e.vpcmpgtb(i.dest, e.xmm0, e.xmm1);\n        break;\n      case INT16_TYPE:\n        e.vpcmpgtw(i.dest, e.xmm0, e.xmm1);\n        break;\n      case INT32_TYPE:\n        e.vpcmpgtd(i.dest, e.xmm0, e.xmm1);\n        break;\n      case FLOAT32_TYPE:\n        e.vcmpgtps(i.dest, e.xmm0, e.xmm1);\n        break;\n    }\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_VECTOR_COMPARE_UGT, VECTOR_COMPARE_UGT_V128);\n\n// ============================================================================\n// OPCODE_VECTOR_COMPARE_UGE\n// ============================================================================\nstruct VECTOR_COMPARE_UGE_V128\n    : Sequence<VECTOR_COMPARE_UGE_V128,\n               I<OPCODE_VECTOR_COMPARE_UGE, V128Op, V128Op, V128Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    Xbyak::Address sign_addr = e.ptr[e.rax];  // dummy\n    switch (i.instr->flags) {\n      case INT8_TYPE:\n        sign_addr = e.GetXmmConstPtr(XMMSignMaskI8);\n        break;\n      case INT16_TYPE:\n        sign_addr = e.GetXmmConstPtr(XMMSignMaskI16);\n        break;\n      case INT32_TYPE:\n        sign_addr = e.GetXmmConstPtr(XMMSignMaskI32);\n        break;\n      case FLOAT32_TYPE:\n        sign_addr = e.GetXmmConstPtr(XMMSignMaskF32);\n        break;\n    }\n    if (i.src1.is_constant) {\n      // TODO(benvanik): make this constant.\n      e.LoadConstantXmm(e.xmm0, i.src1.constant());\n      e.vpxor(e.xmm0, sign_addr);\n    } else {\n      e.vpxor(e.xmm0, i.src1, sign_addr);\n    }\n    if (i.src2.is_constant) {\n      // TODO(benvanik): make this constant.\n      e.LoadConstantXmm(e.xmm1, i.src2.constant());\n      e.vpxor(e.xmm1, sign_addr);\n    } else {\n      e.vpxor(e.xmm1, i.src2, sign_addr);\n    }\n    switch (i.instr->flags) {\n      case INT8_TYPE:\n        e.vpcmpeqb(e.xmm2, e.xmm0, e.xmm1);\n        e.vpcmpgtb(i.dest, e.xmm0, e.xmm1);\n        e.vpor(i.dest, e.xmm2);\n        break;\n      case INT16_TYPE:\n        e.vpcmpeqw(e.xmm2, e.xmm0, e.xmm1);\n        e.vpcmpgtw(i.dest, e.xmm0, e.xmm1);\n        e.vpor(i.dest, e.xmm2);\n        break;\n      case INT32_TYPE:\n        e.vpcmpeqd(e.xmm2, e.xmm0, e.xmm1);\n        e.vpcmpgtd(i.dest, e.xmm0, e.xmm1);\n        e.vpor(i.dest, e.xmm2);\n        break;\n      case FLOAT32_TYPE:\n        e.vcmpgeps(i.dest, e.xmm0, e.xmm1);\n        break;\n    }\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_VECTOR_COMPARE_UGE, VECTOR_COMPARE_UGE_V128);\n\n// ============================================================================\n// OPCODE_VECTOR_ADD\n// ============================================================================\nstruct VECTOR_ADD\n    : Sequence<VECTOR_ADD, I<OPCODE_VECTOR_ADD, V128Op, V128Op, V128Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitCommutativeBinaryXmmOp(\n        e, i, [&i](X64Emitter& e, const Xmm& dest, Xmm src1, Xmm src2) {\n          const TypeName part_type =\n              static_cast<TypeName>(i.instr->flags & 0xFF);\n          const uint32_t arithmetic_flags = i.instr->flags >> 8;\n          bool is_unsigned = !!(arithmetic_flags & ARITHMETIC_UNSIGNED);\n          bool saturate = !!(arithmetic_flags & ARITHMETIC_SATURATE);\n          switch (part_type) {\n            case INT8_TYPE:\n              if (saturate) {\n                // TODO(benvanik): trace DID_SATURATE\n                if (is_unsigned) {\n                  e.vpaddusb(dest, src1, src2);\n                } else {\n                  e.vpaddsb(dest, src1, src2);\n                }\n              } else {\n                e.vpaddb(dest, src1, src2);\n              }\n              break;\n            case INT16_TYPE:\n              if (saturate) {\n                // TODO(benvanik): trace DID_SATURATE\n                if (is_unsigned) {\n                  e.vpaddusw(dest, src1, src2);\n                } else {\n                  e.vpaddsw(dest, src1, src2);\n                }\n              } else {\n                e.vpaddw(dest, src1, src2);\n              }\n              break;\n            case INT32_TYPE:\n              if (saturate) {\n                if (is_unsigned) {\n                  if (e.IsFeatureEnabled(kX64EmitAVX512Ortho)) {\n                    e.vpaddd(dest, src1, src2);\n                    Opmask saturate = e.k1;\n                    // _mm_cmplt_epu32_mask\n                    e.vpcmpud(saturate, dest, src1, 0x1);\n                    e.vpternlogd(dest | saturate, dest, dest, 0xFF);\n                    return;\n                  }\n\n                  // xmm0 is the only temp register that can be used by\n                  // src1/src2.\n                  e.vpaddd(e.xmm1, src1, src2);\n\n                  // If result is smaller than either of the inputs, we've\n                  // overflowed (only need to check one input)\n                  // if (src1 > res) then overflowed\n                  // http://locklessinc.com/articles/sat_arithmetic/\n                  e.vpxor(e.xmm2, src1, e.GetXmmConstPtr(XMMSignMaskI32));\n                  e.vpxor(e.xmm0, e.xmm1, e.GetXmmConstPtr(XMMSignMaskI32));\n                  e.vpcmpgtd(e.xmm0, e.xmm2, e.xmm0);\n                  e.vpor(dest, e.xmm1, e.xmm0);\n                } else {\n                  e.vpaddd(e.xmm1, src1, src2);\n\n                  if (e.IsFeatureEnabled(kX64EmitAVX512Ortho |\n                                         kX64EmitAVX512DQ)) {\n                    e.vmovdqa32(e.xmm3, src1);\n                    e.vpternlogd(e.xmm3, e.xmm1, src2, 0b00100100);\n\n                    const Opmask saturate = e.k1;\n                    e.vpmovd2m(saturate, e.xmm3);\n\n                    e.vpsrad(e.xmm2, e.xmm1, 31);\n                    e.vpxord(e.xmm2, e.xmm2, e.GetXmmConstPtr(XMMSignMaskI32));\n                    e.vpblendmd(dest | saturate, e.xmm1, e.xmm2);\n                    return;\n                  }\n\n                  // Overflow results if two inputs are the same sign and the\n                  // result isn't the same sign. if ((s32b)(~(src1 ^ src2) &\n                  // (src1 ^ res)) < 0) then overflowed\n                  // http://locklessinc.com/articles/sat_arithmetic/\n                  e.vpxor(e.xmm2, src1, src2);\n                  e.vpxor(e.xmm3, src1, e.xmm1);\n                  e.vpandn(e.xmm2, e.xmm2, e.xmm3);\n\n                  // Set any negative overflowed elements of src1 to INT_MIN\n                  e.vpand(e.xmm3, src1, e.xmm2);\n                  e.vblendvps(e.xmm1, e.xmm1, e.GetXmmConstPtr(XMMSignMaskI32),\n                              e.xmm3);\n\n                  // Set any positive overflowed elements of src1 to INT_MAX\n                  e.vpandn(e.xmm3, src1, e.xmm2);\n                  e.vblendvps(dest, e.xmm1, e.GetXmmConstPtr(XMMAbsMaskPS),\n                              e.xmm3);\n                }\n              } else {\n                e.vpaddd(dest, src1, src2);\n              }\n              break;\n            case FLOAT32_TYPE:\n              assert_false(is_unsigned);\n              assert_false(saturate);\n              e.vaddps(dest, src1, src2);\n              break;\n            default:\n              assert_unhandled_case(part_type);\n              break;\n          }\n        });\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_VECTOR_ADD, VECTOR_ADD);\n\n// ============================================================================\n// OPCODE_VECTOR_SUB\n// ============================================================================\nstruct VECTOR_SUB\n    : Sequence<VECTOR_SUB, I<OPCODE_VECTOR_SUB, V128Op, V128Op, V128Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitCommutativeBinaryXmmOp(\n        e, i, [&i](X64Emitter& e, const Xmm& dest, Xmm src1, Xmm src2) {\n          const TypeName part_type =\n              static_cast<TypeName>(i.instr->flags & 0xFF);\n          const uint32_t arithmetic_flags = i.instr->flags >> 8;\n          bool is_unsigned = !!(arithmetic_flags & ARITHMETIC_UNSIGNED);\n          bool saturate = !!(arithmetic_flags & ARITHMETIC_SATURATE);\n          switch (part_type) {\n            case INT8_TYPE:\n              if (saturate) {\n                // TODO(benvanik): trace DID_SATURATE\n                if (is_unsigned) {\n                  e.vpsubusb(dest, src1, src2);\n                } else {\n                  e.vpsubsb(dest, src1, src2);\n                }\n              } else {\n                e.vpsubb(dest, src1, src2);\n              }\n              break;\n            case INT16_TYPE:\n              if (saturate) {\n                // TODO(benvanik): trace DID_SATURATE\n                if (is_unsigned) {\n                  e.vpsubusw(dest, src1, src2);\n                } else {\n                  e.vpsubsw(dest, src1, src2);\n                }\n              } else {\n                e.vpsubw(dest, src1, src2);\n              }\n              break;\n            case INT32_TYPE:\n              if (saturate) {\n                if (is_unsigned) {\n                  // xmm0 is the only temp register that can be used by\n                  // src1/src2.\n                  e.vpsubd(e.xmm1, src1, src2);\n\n                  if (e.IsFeatureEnabled(kX64EmitAVX512Ortho)) {\n                    // If the result is less or equal to the first operand then\n                    // we did not underflow\n                    Opmask not_underflow = e.k1;\n                    // _mm_cmple_epu32_mask\n                    e.vpcmpud(not_underflow, e.xmm1, src1, 0x2);\n\n                    // Copy over values that did not underflow, write zero\n                    // everywhere else\n                    e.vmovdqa32(dest | not_underflow | e.T_z, e.xmm1);\n                    return;\n                  }\n\n                  // If result is greater than either of the inputs, we've\n                  // underflowed (only need to check one input)\n                  // if (res > src1) then underflowed\n                  // http://locklessinc.com/articles/sat_arithmetic/\n                  e.vpxor(e.xmm2, src1, e.GetXmmConstPtr(XMMSignMaskI32));\n                  e.vpxor(e.xmm0, e.xmm1, e.GetXmmConstPtr(XMMSignMaskI32));\n                  e.vpcmpgtd(e.xmm0, e.xmm0, e.xmm2);\n                  e.vpandn(dest, e.xmm0, e.xmm1);\n                } else {\n                  e.vpsubd(e.xmm1, src1, src2);\n\n                  if (e.IsFeatureEnabled(kX64EmitAVX512Ortho |\n                                         kX64EmitAVX512DQ)) {\n                    e.vmovdqa32(e.xmm3, src1);\n                    e.vpternlogd(e.xmm3, e.xmm1, src2, 0b00011000);\n\n                    const Opmask saturate = e.k1;\n                    e.vpmovd2m(saturate, e.xmm3);\n\n                    e.vpsrad(e.xmm2, e.xmm1, 31);\n                    e.vpxord(e.xmm2, e.xmm2, e.GetXmmConstPtr(XMMSignMaskI32));\n\n                    e.vpblendmd(dest | saturate, e.xmm1, e.xmm2);\n                    return;\n                  }\n\n                  // We can only overflow if the signs of the operands are\n                  // opposite. If signs are opposite and result sign isn't the\n                  // same as src1's sign, we've overflowed. if ((s32b)((src1 ^\n                  // src2) & (src1 ^ res)) < 0) then overflowed\n                  // http://locklessinc.com/articles/sat_arithmetic/\n                  e.vpxor(e.xmm2, src1, src2);\n                  e.vpxor(e.xmm3, src1, e.xmm1);\n                  e.vpand(e.xmm2, e.xmm2, e.xmm3);\n\n                  // Set any negative overflowed elements of src1 to INT_MIN\n                  e.vpand(e.xmm3, src1, e.xmm2);\n                  e.vblendvps(e.xmm1, e.xmm1, e.GetXmmConstPtr(XMMSignMaskI32),\n                              e.xmm3);\n\n                  // Set any positive overflowed elements of src1 to INT_MAX\n                  e.vpandn(e.xmm3, src1, e.xmm2);\n                  e.vblendvps(dest, e.xmm1, e.GetXmmConstPtr(XMMAbsMaskPS),\n                              e.xmm3);\n                }\n              } else {\n                e.vpsubd(dest, src1, src2);\n              }\n              break;\n            case FLOAT32_TYPE:\n              e.vsubps(dest, src1, src2);\n              break;\n            default:\n              assert_unhandled_case(part_type);\n              break;\n          }\n        });\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_VECTOR_SUB, VECTOR_SUB);\n\n// ============================================================================\n// OPCODE_VECTOR_SHL\n// ============================================================================\ntemplate <typename T, std::enable_if_t<std::is_integral<T>::value, int> = 0>\nstatic __m128i EmulateVectorShl(void*, __m128i src1, __m128i src2) {\n  alignas(16) T value[16 / sizeof(T)];\n  alignas(16) T shamt[16 / sizeof(T)];\n\n  // Load SSE registers into a C array.\n  _mm_store_si128(reinterpret_cast<__m128i*>(value), src1);\n  _mm_store_si128(reinterpret_cast<__m128i*>(shamt), src2);\n\n  for (size_t i = 0; i < (16 / sizeof(T)); ++i) {\n    value[i] = value[i] << (shamt[i] & ((sizeof(T) * 8) - 1));\n  }\n\n  // Store result and return it.\n  return _mm_load_si128(reinterpret_cast<__m128i*>(value));\n}\n\nstruct VECTOR_SHL_V128\n    : Sequence<VECTOR_SHL_V128, I<OPCODE_VECTOR_SHL, V128Op, V128Op, V128Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    switch (i.instr->flags) {\n      case INT8_TYPE:\n        EmitInt8(e, i);\n        break;\n      case INT16_TYPE:\n        EmitInt16(e, i);\n        break;\n      case INT32_TYPE:\n        EmitInt32(e, i);\n        break;\n      default:\n        assert_always();\n        break;\n    }\n  }\n\n  static void EmitInt8(X64Emitter& e, const EmitArgType& i) {\n    // TODO(benvanik): native version (with shift magic).\n    if (i.src2.is_constant) {\n      if (e.IsFeatureEnabled(kX64EmitGFNI)) {\n        const auto& shamt = i.src2.constant();\n        bool all_same = true;\n        for (size_t n = 0; n < 16 - n; ++n) {\n          if (shamt.u8[n] != shamt.u8[n + 1]) {\n            all_same = false;\n            break;\n          }\n        }\n        if (all_same) {\n          // Every count is the same, so we can use gf2p8affineqb.\n          const uint8_t shift_amount = shamt.u8[0] & 0b111;\n          const uint64_t shift_matrix =\n              UINT64_C(0x0102040810204080) >> (shift_amount * 8);\n          e.vgf2p8affineqb(i.dest, i.src1,\n                           e.StashConstantXmm(0, vec128q(shift_matrix)), 0);\n          return;\n        }\n      }\n      e.lea(e.GetNativeParam(1), e.StashConstantXmm(1, i.src2.constant()));\n    } else {\n      e.lea(e.GetNativeParam(1), e.StashXmm(1, i.src2));\n    }\n    e.lea(e.GetNativeParam(0), e.StashXmm(0, i.src1));\n    e.CallNativeSafe(reinterpret_cast<void*>(EmulateVectorShl<uint8_t>));\n    e.vmovaps(i.dest, e.xmm0);\n  }\n\n  static void EmitInt16(X64Emitter& e, const EmitArgType& i) {\n    Xmm src1;\n    if (i.src1.is_constant) {\n      src1 = e.xmm2;\n      e.LoadConstantXmm(src1, i.src1.constant());\n    } else {\n      src1 = i.src1;\n    }\n\n    if (i.src2.is_constant) {\n      const auto& shamt = i.src2.constant();\n      bool all_same = true;\n      for (size_t n = 0; n < 8 - n; ++n) {\n        if (shamt.u16[n] != shamt.u16[n + 1]) {\n          all_same = false;\n          break;\n        }\n      }\n      if (all_same) {\n        // Every count is the same, so we can use vpsllw.\n        e.vpsllw(i.dest, src1, shamt.u16[0] & 0xF);\n        return;\n      }\n    }\n\n    // Shift 8 words in src1 by amount specified in src2.\n    Xbyak::Label emu, end;\n\n    // Only bother with this check if shift amt isn't constant.\n    if (!i.src2.is_constant) {\n      // See if the shift is equal first for a shortcut.\n      e.vpshuflw(e.xmm0, i.src2, 0b00000000);\n      e.vpshufd(e.xmm0, e.xmm0, 0b00000000);\n      e.vpxor(e.xmm1, e.xmm0, i.src2);\n      e.vptest(e.xmm1, e.xmm1);\n      e.jnz(emu);\n\n      // Equal. Shift using vpsllw.\n      e.mov(e.rax, 0xF);\n      e.vmovq(e.xmm1, e.rax);\n      e.vpand(e.xmm0, e.xmm0, e.xmm1);\n      e.vpsllw(i.dest, src1, e.xmm0);\n      e.jmp(end);\n    }\n\n    // TODO(benvanik): native version (with shift magic).\n    e.L(emu);\n    if (i.src2.is_constant) {\n      e.lea(e.GetNativeParam(1), e.StashConstantXmm(1, i.src2.constant()));\n    } else {\n      e.lea(e.GetNativeParam(1), e.StashXmm(1, i.src2));\n    }\n    e.lea(e.GetNativeParam(0), e.StashXmm(0, src1));\n    e.CallNativeSafe(reinterpret_cast<void*>(EmulateVectorShl<uint16_t>));\n    e.vmovaps(i.dest, e.xmm0);\n\n    e.L(end);\n  }\n\n  static void EmitInt32(X64Emitter& e, const EmitArgType& i) {\n    Xmm src1;\n    if (i.src1.is_constant) {\n      src1 = e.xmm2;\n      e.LoadConstantXmm(src1, i.src1.constant());\n    } else {\n      src1 = i.src1;\n    }\n\n    if (i.src2.is_constant) {\n      const auto& shamt = i.src2.constant();\n      bool all_same = true;\n      for (size_t n = 0; n < 4 - n; ++n) {\n        if (shamt.u32[n] != shamt.u32[n + 1]) {\n          all_same = false;\n          break;\n        }\n      }\n      if (all_same) {\n        // Every count is the same, so we can use vpslld.\n        e.vpslld(i.dest, src1, shamt.u8[0] & 0x1F);\n        return;\n      }\n    }\n\n    if (e.IsFeatureEnabled(kX64EmitAVX2)) {\n      if (i.src2.is_constant) {\n        const auto& shamt = i.src2.constant();\n        // Counts differ, so pre-mask and load constant.\n        vec128_t masked = i.src2.constant();\n        for (size_t n = 0; n < 4; ++n) {\n          masked.u32[n] &= 0x1F;\n        }\n        e.LoadConstantXmm(e.xmm0, masked);\n        e.vpsllvd(i.dest, src1, e.xmm0);\n      } else {\n        // Fully variable shift.\n        // src shift mask may have values >31, and x86 sets to zero when\n        // that happens so we mask.\n        e.vandps(e.xmm0, i.src2, e.GetXmmConstPtr(XMMShiftMaskPS));\n        e.vpsllvd(i.dest, src1, e.xmm0);\n      }\n    } else {\n      // Shift 4 words in src1 by amount specified in src2.\n      Xbyak::Label emu, end;\n\n      // See if the shift is equal first for a shortcut.\n      // Only bother with this check if shift amt isn't constant.\n      if (!i.src2.is_constant) {\n        e.vpshufd(e.xmm0, i.src2, 0b00000000);\n        e.vpxor(e.xmm1, e.xmm0, i.src2);\n        e.vptest(e.xmm1, e.xmm1);\n        e.jnz(emu);\n\n        // Equal. Shift using vpsrad.\n        e.mov(e.rax, 0x1F);\n        e.vmovq(e.xmm1, e.rax);\n        e.vpand(e.xmm0, e.xmm0, e.xmm1);\n        e.vpslld(i.dest, src1, e.xmm0);\n        e.jmp(end);\n      }\n\n      // TODO(benvanik): native version (with shift magic).\n      e.L(emu);\n      if (i.src2.is_constant) {\n        e.lea(e.GetNativeParam(1), e.StashConstantXmm(1, i.src2.constant()));\n      } else {\n        e.lea(e.GetNativeParam(1), e.StashXmm(1, i.src2));\n      }\n      e.lea(e.GetNativeParam(0), e.StashXmm(0, src1));\n      e.CallNativeSafe(reinterpret_cast<void*>(EmulateVectorShl<uint32_t>));\n      e.vmovaps(i.dest, e.xmm0);\n\n      e.L(end);\n    }\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_VECTOR_SHL, VECTOR_SHL_V128);\n\n// ============================================================================\n// OPCODE_VECTOR_SHR\n// ============================================================================\ntemplate <typename T, std::enable_if_t<std::is_integral<T>::value, int> = 0>\nstatic __m128i EmulateVectorShr(void*, __m128i src1, __m128i src2) {\n  alignas(16) T value[16 / sizeof(T)];\n  alignas(16) T shamt[16 / sizeof(T)];\n\n  // Load SSE registers into a C array.\n  _mm_store_si128(reinterpret_cast<__m128i*>(value), src1);\n  _mm_store_si128(reinterpret_cast<__m128i*>(shamt), src2);\n\n  for (size_t i = 0; i < (16 / sizeof(T)); ++i) {\n    value[i] = value[i] >> (shamt[i] & ((sizeof(T) * 8) - 1));\n  }\n\n  // Store result and return it.\n  return _mm_load_si128(reinterpret_cast<__m128i*>(value));\n}\n\nstruct VECTOR_SHR_V128\n    : Sequence<VECTOR_SHR_V128, I<OPCODE_VECTOR_SHR, V128Op, V128Op, V128Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    switch (i.instr->flags) {\n      case INT8_TYPE:\n        EmitInt8(e, i);\n        break;\n      case INT16_TYPE:\n        EmitInt16(e, i);\n        break;\n      case INT32_TYPE:\n        EmitInt32(e, i);\n        break;\n      default:\n        assert_always();\n        break;\n    }\n  }\n\n  static void EmitInt8(X64Emitter& e, const EmitArgType& i) {\n    // TODO(benvanik): native version (with shift magic).\n    if (i.src2.is_constant) {\n      if (e.IsFeatureEnabled(kX64EmitGFNI)) {\n        const auto& shamt = i.src2.constant();\n        bool all_same = true;\n        for (size_t n = 0; n < 16 - n; ++n) {\n          if (shamt.u8[n] != shamt.u8[n + 1]) {\n            all_same = false;\n            break;\n          }\n        }\n        if (all_same) {\n          // Every count is the same, so we can use gf2p8affineqb.\n          const uint8_t shift_amount = shamt.u8[0] & 0b111;\n          const uint64_t shift_matrix = UINT64_C(0x0102040810204080)\n                                        << (shift_amount * 8);\n          e.vgf2p8affineqb(i.dest, i.src1,\n                           e.StashConstantXmm(0, vec128q(shift_matrix)), 0);\n          return;\n        }\n      }\n      e.lea(e.GetNativeParam(1), e.StashConstantXmm(1, i.src2.constant()));\n    } else {\n      e.lea(e.GetNativeParam(1), e.StashXmm(1, i.src2));\n    }\n    e.lea(e.GetNativeParam(0), e.StashXmm(0, i.src1));\n    e.CallNativeSafe(reinterpret_cast<void*>(EmulateVectorShr<uint8_t>));\n    e.vmovaps(i.dest, e.xmm0);\n  }\n\n  static void EmitInt16(X64Emitter& e, const EmitArgType& i) {\n    if (i.src2.is_constant) {\n      const auto& shamt = i.src2.constant();\n      bool all_same = true;\n      for (size_t n = 0; n < 8 - n; ++n) {\n        if (shamt.u16[n] != shamt.u16[n + 1]) {\n          all_same = false;\n          break;\n        }\n      }\n      if (all_same) {\n        // Every count is the same, so we can use vpsllw.\n        e.vpsrlw(i.dest, i.src1, shamt.u16[0] & 0xF);\n        return;\n      }\n    }\n\n    // Shift 8 words in src1 by amount specified in src2.\n    Xbyak::Label emu, end;\n\n    // See if the shift is equal first for a shortcut.\n    // Only bother with this check if shift amt isn't constant.\n    if (!i.src2.is_constant) {\n      e.vpshuflw(e.xmm0, i.src2, 0b00000000);\n      e.vpshufd(e.xmm0, e.xmm0, 0b00000000);\n      e.vpxor(e.xmm1, e.xmm0, i.src2);\n      e.vptest(e.xmm1, e.xmm1);\n      e.jnz(emu);\n\n      // Equal. Shift using vpsrlw.\n      e.mov(e.rax, 0xF);\n      e.vmovq(e.xmm1, e.rax);\n      e.vpand(e.xmm0, e.xmm0, e.xmm1);\n      e.vpsrlw(i.dest, i.src1, e.xmm0);\n      e.jmp(end);\n    }\n\n    // TODO(benvanik): native version (with shift magic).\n    e.L(emu);\n    if (i.src2.is_constant) {\n      e.lea(e.GetNativeParam(1), e.StashConstantXmm(1, i.src2.constant()));\n    } else {\n      e.lea(e.GetNativeParam(1), e.StashXmm(1, i.src2));\n    }\n    e.lea(e.GetNativeParam(0), e.StashXmm(0, i.src1));\n    e.CallNativeSafe(reinterpret_cast<void*>(EmulateVectorShr<uint16_t>));\n    e.vmovaps(i.dest, e.xmm0);\n\n    e.L(end);\n  }\n\n  static void EmitInt32(X64Emitter& e, const EmitArgType& i) {\n    Xmm src1;\n    if (i.src1.is_constant) {\n      src1 = e.xmm2;\n      e.LoadConstantXmm(src1, i.src1.constant());\n    } else {\n      src1 = i.src1;\n    }\n\n    if (i.src2.is_constant) {\n      const auto& shamt = i.src2.constant();\n      bool all_same = true;\n      for (size_t n = 0; n < 4 - n; ++n) {\n        if (shamt.u32[n] != shamt.u32[n + 1]) {\n          all_same = false;\n          break;\n        }\n      }\n      if (all_same) {\n        // Every count is the same, so we can use vpsrld.\n        e.vpsrld(i.dest, src1, shamt.u8[0] & 0x1F);\n        return;\n      } else {\n        if (e.IsFeatureEnabled(kX64EmitAVX2)) {\n          // Counts differ, so pre-mask and load constant.\n          vec128_t masked = i.src2.constant();\n          for (size_t n = 0; n < 4; ++n) {\n            masked.u32[n] &= 0x1F;\n          }\n          e.LoadConstantXmm(e.xmm0, masked);\n          e.vpsrlvd(i.dest, src1, e.xmm0);\n          return;\n        }\n      }\n    }\n\n    if (e.IsFeatureEnabled(kX64EmitAVX2)) {\n      // Fully variable shift.\n      // src shift mask may have values >31, and x86 sets to zero when\n      // that happens so we mask.\n      e.vandps(e.xmm0, i.src2, e.GetXmmConstPtr(XMMShiftMaskPS));\n      e.vpsrlvd(i.dest, src1, e.xmm0);\n    } else {\n      // Shift 4 words in src1 by amount specified in src2.\n      Xbyak::Label emu, end;\n\n      // See if the shift is equal first for a shortcut.\n      // Only bother with this check if shift amt isn't constant.\n      if (!i.src2.is_constant) {\n        e.vpshufd(e.xmm0, i.src2, 0b00000000);\n        e.vpxor(e.xmm1, e.xmm0, i.src2);\n        e.vptest(e.xmm1, e.xmm1);\n        e.jnz(emu);\n\n        // Equal. Shift using vpsrld.\n        e.mov(e.rax, 0x1F);\n        e.vmovq(e.xmm1, e.rax);\n        e.vpand(e.xmm0, e.xmm0, e.xmm1);\n        e.vpsrld(i.dest, src1, e.xmm0);\n        e.jmp(end);\n      }\n\n      // TODO(benvanik): native version.\n      e.L(emu);\n      if (i.src2.is_constant) {\n        e.lea(e.GetNativeParam(1), e.StashConstantXmm(1, i.src2.constant()));\n      } else {\n        e.lea(e.GetNativeParam(1), e.StashXmm(1, i.src2));\n      }\n      e.lea(e.GetNativeParam(0), e.StashXmm(0, src1));\n      e.CallNativeSafe(reinterpret_cast<void*>(EmulateVectorShr<uint32_t>));\n      e.vmovaps(i.dest, e.xmm0);\n\n      e.L(end);\n    }\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_VECTOR_SHR, VECTOR_SHR_V128);\n\n// ============================================================================\n// OPCODE_VECTOR_SHA\n// ============================================================================\nstruct VECTOR_SHA_V128\n    : Sequence<VECTOR_SHA_V128, I<OPCODE_VECTOR_SHA, V128Op, V128Op, V128Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    switch (i.instr->flags) {\n      case INT8_TYPE:\n        EmitInt8(e, i);\n        break;\n      case INT16_TYPE:\n        EmitInt16(e, i);\n        break;\n      case INT32_TYPE:\n        EmitInt32(e, i);\n        break;\n      default:\n        assert_always();\n        break;\n    }\n  }\n\n  static void EmitInt8(X64Emitter& e, const EmitArgType& i) {\n    // TODO(benvanik): native version (with shift magic).\n    if (i.src2.is_constant) {\n      if (e.IsFeatureEnabled(kX64EmitGFNI)) {\n        const auto& shamt = i.src2.constant();\n        bool all_same = true;\n        for (size_t n = 0; n < 16 - n; ++n) {\n          if (shamt.u8[n] != shamt.u8[n + 1]) {\n            all_same = false;\n            break;\n          }\n        }\n        if (all_same) {\n          // Every count is the same, so we can use gf2p8affineqb.\n          const uint8_t shift_amount = shamt.u8[0] & 0b111;\n          const uint64_t shift_matrix =\n              (UINT64_C(0x0102040810204080) << (shift_amount * 8)) |\n              (UINT64_C(0x8080808080808080) >> (64 - shift_amount * 8));\n          ;\n          e.vgf2p8affineqb(i.dest, i.src1,\n                           e.StashConstantXmm(0, vec128q(shift_matrix)), 0);\n          return;\n        }\n      }\n      e.lea(e.GetNativeParam(1), e.StashConstantXmm(1, i.src2.constant()));\n    } else {\n      e.lea(e.GetNativeParam(1), e.StashXmm(1, i.src2));\n    }\n    e.lea(e.GetNativeParam(0), e.StashXmm(0, i.src1));\n    e.CallNativeSafe(reinterpret_cast<void*>(EmulateVectorShr<int8_t>));\n    e.vmovaps(i.dest, e.xmm0);\n  }\n\n  static void EmitInt16(X64Emitter& e, const EmitArgType& i) {\n    if (i.src2.is_constant) {\n      const auto& shamt = i.src2.constant();\n      bool all_same = true;\n      for (size_t n = 0; n < 8 - n; ++n) {\n        if (shamt.u16[n] != shamt.u16[n + 1]) {\n          all_same = false;\n          break;\n        }\n      }\n      if (all_same) {\n        // Every count is the same, so we can use vpsraw.\n        e.vpsraw(i.dest, i.src1, shamt.u16[0] & 0xF);\n        return;\n      }\n    }\n\n    // Shift 8 words in src1 by amount specified in src2.\n    Xbyak::Label emu, end;\n\n    // See if the shift is equal first for a shortcut.\n    // Only bother with this check if shift amt isn't constant.\n    if (!i.src2.is_constant) {\n      e.vpshuflw(e.xmm0, i.src2, 0b00000000);\n      e.vpshufd(e.xmm0, e.xmm0, 0b00000000);\n      e.vpxor(e.xmm1, e.xmm0, i.src2);\n      e.vptest(e.xmm1, e.xmm1);\n      e.jnz(emu);\n\n      // Equal. Shift using vpsraw.\n      e.mov(e.rax, 0xF);\n      e.vmovq(e.xmm1, e.rax);\n      e.vpand(e.xmm0, e.xmm0, e.xmm1);\n      e.vpsraw(i.dest, i.src1, e.xmm0);\n      e.jmp(end);\n    }\n\n    // TODO(benvanik): native version (with shift magic).\n    e.L(emu);\n    if (i.src2.is_constant) {\n      e.lea(e.GetNativeParam(1), e.StashConstantXmm(1, i.src2.constant()));\n    } else {\n      e.lea(e.GetNativeParam(1), e.StashXmm(1, i.src2));\n    }\n    e.lea(e.GetNativeParam(0), e.StashXmm(0, i.src1));\n    e.CallNativeSafe(reinterpret_cast<void*>(EmulateVectorShr<int16_t>));\n    e.vmovaps(i.dest, e.xmm0);\n\n    e.L(end);\n  }\n\n  static void EmitInt32(X64Emitter& e, const EmitArgType& i) {\n    if (i.src2.is_constant) {\n      const auto& shamt = i.src2.constant();\n      bool all_same = true;\n      for (size_t n = 0; n < 4 - n; ++n) {\n        if (shamt.u32[n] != shamt.u32[n + 1]) {\n          all_same = false;\n          break;\n        }\n      }\n      if (all_same) {\n        // Every count is the same, so we can use vpsrad.\n        e.vpsrad(i.dest, i.src1, shamt.u32[0] & 0x1F);\n        return;\n      }\n    }\n\n    if (e.IsFeatureEnabled(kX64EmitAVX2)) {\n      // src shift mask may have values >31, and x86 sets to zero when\n      // that happens so we mask.\n      if (i.src2.is_constant) {\n        e.LoadConstantXmm(e.xmm0, i.src2.constant());\n        e.vandps(e.xmm0, e.GetXmmConstPtr(XMMShiftMaskPS));\n      } else {\n        e.vandps(e.xmm0, i.src2, e.GetXmmConstPtr(XMMShiftMaskPS));\n      }\n      e.vpsravd(i.dest, i.src1, e.xmm0);\n    } else {\n      // Shift 4 words in src1 by amount specified in src2.\n      Xbyak::Label emu, end;\n\n      // See if the shift is equal first for a shortcut.\n      // Only bother with this check if shift amt isn't constant.\n      if (!i.src2.is_constant) {\n        e.vpshufd(e.xmm0, i.src2, 0b00000000);\n        e.vpxor(e.xmm1, e.xmm0, i.src2);\n        e.vptest(e.xmm1, e.xmm1);\n        e.jnz(emu);\n\n        // Equal. Shift using vpsrad.\n        e.mov(e.rax, 0x1F);\n        e.vmovq(e.xmm1, e.rax);\n        e.vpand(e.xmm0, e.xmm0, e.xmm1);\n        e.vpsrad(i.dest, i.src1, e.xmm0);\n        e.jmp(end);\n      }\n\n      // TODO(benvanik): native version.\n      e.L(emu);\n      if (i.src2.is_constant) {\n        e.lea(e.GetNativeParam(1), e.StashConstantXmm(1, i.src2.constant()));\n      } else {\n        e.lea(e.GetNativeParam(1), e.StashXmm(1, i.src2));\n      }\n      e.lea(e.GetNativeParam(0), e.StashXmm(0, i.src1));\n      e.CallNativeSafe(reinterpret_cast<void*>(EmulateVectorShr<int32_t>));\n      e.vmovaps(i.dest, e.xmm0);\n\n      e.L(end);\n    }\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_VECTOR_SHA, VECTOR_SHA_V128);\n\n// ============================================================================\n// OPCODE_VECTOR_ROTATE_LEFT\n// ============================================================================\ntemplate <typename T, std::enable_if_t<std::is_integral<T>::value, int> = 0>\nstatic __m128i EmulateVectorRotateLeft(void*, __m128i src1, __m128i src2) {\n  alignas(16) T value[16 / sizeof(T)];\n  alignas(16) T shamt[16 / sizeof(T)];\n\n  // Load SSE registers into a C array.\n  _mm_store_si128(reinterpret_cast<__m128i*>(value), src1);\n  _mm_store_si128(reinterpret_cast<__m128i*>(shamt), src2);\n\n  for (size_t i = 0; i < (16 / sizeof(T)); ++i) {\n    value[i] = xe::rotate_left<T>(value[i], shamt[i] & ((sizeof(T) * 8) - 1));\n  }\n\n  // Store result and return it.\n  return _mm_load_si128(reinterpret_cast<__m128i*>(value));\n}\n\nstruct VECTOR_ROTATE_LEFT_V128\n    : Sequence<VECTOR_ROTATE_LEFT_V128,\n               I<OPCODE_VECTOR_ROTATE_LEFT, V128Op, V128Op, V128Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    switch (i.instr->flags) {\n      case INT8_TYPE:\n        // TODO(benvanik): native version (with shift magic).\n        if (i.src2.is_constant) {\n          e.lea(e.GetNativeParam(1), e.StashConstantXmm(1, i.src2.constant()));\n        } else {\n          e.lea(e.GetNativeParam(1), e.StashXmm(1, i.src2));\n        }\n        e.lea(e.GetNativeParam(0), e.StashXmm(0, i.src1));\n        e.CallNativeSafe(\n            reinterpret_cast<void*>(EmulateVectorRotateLeft<uint8_t>));\n        e.vmovaps(i.dest, e.xmm0);\n        break;\n      case INT16_TYPE:\n        // TODO(benvanik): native version (with shift magic).\n        if (i.src2.is_constant) {\n          e.lea(e.GetNativeParam(1), e.StashConstantXmm(1, i.src2.constant()));\n        } else {\n          e.lea(e.GetNativeParam(1), e.StashXmm(1, i.src2));\n        }\n        e.lea(e.GetNativeParam(0), e.StashXmm(0, i.src1));\n        e.CallNativeSafe(\n            reinterpret_cast<void*>(EmulateVectorRotateLeft<uint16_t>));\n        e.vmovaps(i.dest, e.xmm0);\n        break;\n      case INT32_TYPE: {\n        if (e.IsFeatureEnabled(kX64EmitAVX512Ortho)) {\n          e.vprolvd(i.dest, i.src1, i.src2);\n        } else if (e.IsFeatureEnabled(kX64EmitAVX2)) {\n          Xmm temp = i.dest;\n          if (i.dest == i.src1 || i.dest == i.src2) {\n            temp = e.xmm2;\n          }\n          // Shift left (to get high bits):\n          if (i.src2.is_constant) {\n            e.LoadConstantXmm(temp, i.src2.constant());\n            e.vpand(e.xmm0, temp, e.GetXmmConstPtr(XMMShiftMaskPS));\n          } else {\n            e.vpand(e.xmm0, i.src2, e.GetXmmConstPtr(XMMShiftMaskPS));\n          }\n          e.vpsllvd(e.xmm1, i.src1, e.xmm0);\n          // Shift right (to get low bits):\n          e.vmovaps(temp, e.GetXmmConstPtr(XMMPI32));\n          e.vpsubd(temp, e.xmm0);\n          e.vpsrlvd(i.dest, i.src1, temp);\n          // Merge:\n          e.vpor(i.dest, e.xmm1);\n        } else {\n          // TODO(benvanik): non-AVX2 native version.\n          if (i.src2.is_constant) {\n            e.lea(e.GetNativeParam(1),\n                  e.StashConstantXmm(1, i.src2.constant()));\n          } else {\n            e.lea(e.GetNativeParam(1), e.StashXmm(1, i.src2));\n          }\n          e.lea(e.GetNativeParam(0), e.StashXmm(0, i.src1));\n          e.CallNativeSafe(\n              reinterpret_cast<void*>(EmulateVectorRotateLeft<uint32_t>));\n          e.vmovaps(i.dest, e.xmm0);\n        }\n        break;\n      }\n      default:\n        assert_always();\n        break;\n    }\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_VECTOR_ROTATE_LEFT, VECTOR_ROTATE_LEFT_V128);\n\n// ============================================================================\n// OPCODE_VECTOR_AVERAGE\n// ============================================================================\ntemplate <typename T, std::enable_if_t<std::is_integral<T>::value, int> = 0>\nstatic __m128i EmulateVectorAverage(void*, __m128i src1, __m128i src2) {\n  alignas(16) T src1v[16 / sizeof(T)];\n  alignas(16) T src2v[16 / sizeof(T)];\n  alignas(16) T value[16 / sizeof(T)];\n\n  // Load SSE registers into a C array.\n  _mm_store_si128(reinterpret_cast<__m128i*>(src1v), src1);\n  _mm_store_si128(reinterpret_cast<__m128i*>(src2v), src2);\n\n  for (size_t i = 0; i < (16 / sizeof(T)); ++i) {\n    auto t = (uint64_t(src1v[i]) + uint64_t(src2v[i]) + 1) / 2;\n    value[i] = T(t);\n  }\n\n  // Store result and return it.\n  return _mm_load_si128(reinterpret_cast<__m128i*>(value));\n}\n\nstruct VECTOR_AVERAGE\n    : Sequence<VECTOR_AVERAGE,\n               I<OPCODE_VECTOR_AVERAGE, V128Op, V128Op, V128Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitCommutativeBinaryXmmOp(\n        e, i,\n        [&i](X64Emitter& e, const Xmm& dest, const Xmm& src1, const Xmm& src2) {\n          const TypeName part_type =\n              static_cast<TypeName>(i.instr->flags & 0xFF);\n          const uint32_t arithmetic_flags = i.instr->flags >> 8;\n          bool is_unsigned = !!(arithmetic_flags & ARITHMETIC_UNSIGNED);\n          switch (part_type) {\n            case INT8_TYPE:\n              if (is_unsigned) {\n                e.vpavgb(dest, src1, src2);\n              } else {\n                assert_always();\n              }\n              break;\n            case INT16_TYPE:\n              if (is_unsigned) {\n                e.vpavgw(dest, src1, src2);\n              } else {\n                assert_always();\n              }\n              break;\n            case INT32_TYPE:\n              // No 32bit averages in AVX.\n              if (is_unsigned) {\n                if (i.src2.is_constant) {\n                  e.lea(e.GetNativeParam(1),\n                        e.StashConstantXmm(1, i.src2.constant()));\n                } else {\n                  e.lea(e.GetNativeParam(1), e.StashXmm(1, i.src2));\n                }\n                e.lea(e.GetNativeParam(0), e.StashXmm(0, i.src1));\n                e.CallNativeSafe(\n                    reinterpret_cast<void*>(EmulateVectorAverage<uint32_t>));\n                e.vmovaps(i.dest, e.xmm0);\n              } else {\n                if (i.src2.is_constant) {\n                  e.lea(e.GetNativeParam(1),\n                        e.StashConstantXmm(1, i.src2.constant()));\n                } else {\n                  e.lea(e.GetNativeParam(1), e.StashXmm(1, i.src2));\n                }\n                e.lea(e.GetNativeParam(0), e.StashXmm(0, i.src1));\n                e.CallNativeSafe(\n                    reinterpret_cast<void*>(EmulateVectorAverage<int32_t>));\n                e.vmovaps(i.dest, e.xmm0);\n              }\n              break;\n            default:\n              assert_unhandled_case(part_type);\n              break;\n          }\n        });\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_VECTOR_AVERAGE, VECTOR_AVERAGE);\n\n// ============================================================================\n// OPCODE_INSERT\n// ============================================================================\nstruct INSERT_I8\n    : Sequence<INSERT_I8, I<OPCODE_INSERT, V128Op, V128Op, I8Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    assert_true(i.src2.is_constant);\n    e.vpinsrb(i.dest, i.src3.reg().cvt32(), i.src2.constant() ^ 0x3);\n  }\n};\nstruct INSERT_I16\n    : Sequence<INSERT_I16, I<OPCODE_INSERT, V128Op, V128Op, I8Op, I16Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    assert_true(i.src2.is_constant);\n    e.vpinsrw(i.dest, i.src3.reg().cvt32(), i.src2.constant() ^ 0x1);\n  }\n};\nstruct INSERT_I32\n    : Sequence<INSERT_I32, I<OPCODE_INSERT, V128Op, V128Op, I8Op, I32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    assert_true(i.src2.is_constant);\n    e.vpinsrd(i.dest, i.src3, i.src2.constant());\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_INSERT, INSERT_I8, INSERT_I16, INSERT_I32);\n\n// ============================================================================\n// OPCODE_EXTRACT\n// ============================================================================\n// TODO(benvanik): sequence extract/splat:\n//  v0.i32 = extract v0.v128, 0\n//  v0.v128 = splat v0.i32\n// This can be a single broadcast.\nstruct EXTRACT_I8\n    : Sequence<EXTRACT_I8, I<OPCODE_EXTRACT, I8Op, V128Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    if (i.src2.is_constant) {\n      e.vpextrb(i.dest.reg().cvt32(), i.src1, VEC128_B(i.src2.constant()));\n    } else {\n      e.mov(e.eax, 0x00000003);\n      e.xor_(e.al, i.src2);\n      e.and_(e.al, 0x1F);\n      e.vmovd(e.xmm0, e.eax);\n      e.vpshufb(e.xmm0, i.src1, e.xmm0);\n      e.vmovd(i.dest.reg().cvt32(), e.xmm0);\n      e.and_(i.dest, uint8_t(0xFF));\n    }\n  }\n};\nstruct EXTRACT_I16\n    : Sequence<EXTRACT_I16, I<OPCODE_EXTRACT, I16Op, V128Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    if (i.src2.is_constant) {\n      e.vpextrw(i.dest.reg().cvt32(), i.src1, VEC128_W(i.src2.constant()));\n    } else {\n      e.mov(e.al, i.src2);\n      e.xor_(e.al, 0x01);\n      e.shl(e.al, 1);\n      e.mov(e.ah, e.al);\n      e.add(e.ah, 1);\n      e.vmovd(e.xmm0, e.eax);\n      e.vpshufb(e.xmm0, i.src1, e.xmm0);\n      e.vmovd(i.dest.reg().cvt32(), e.xmm0);\n      e.and_(i.dest.reg().cvt32(), 0xFFFFu);\n    }\n  }\n};\nstruct EXTRACT_I32\n    : Sequence<EXTRACT_I32, I<OPCODE_EXTRACT, I32Op, V128Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    static const vec128_t extract_table_32[4] = {\n        vec128b(3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),\n        vec128b(7, 6, 5, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),\n        vec128b(11, 10, 9, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),\n        vec128b(15, 14, 13, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),\n    };\n    if (i.src2.is_constant) {\n      // TODO(gibbed): add support to constant propagation pass for\n      // OPCODE_EXTRACT.\n      Xmm src1;\n      if (i.src1.is_constant) {\n        src1 = e.xmm0;\n        e.LoadConstantXmm(src1, i.src1.constant());\n      } else {\n        src1 = i.src1;\n      }\n      if (i.src2.constant() == 0) {\n        e.vmovd(i.dest, src1);\n      } else {\n        e.vpextrd(i.dest, src1, VEC128_D(i.src2.constant()));\n      }\n    } else {\n      // TODO(benvanik): try out hlide's version:\n      // e.mov(e.eax, 3);\n      // e.and_(e.al, i.src2);       // eax = [(i&3), 0, 0, 0]\n      // e.imul(e.eax, 0x04040404); // [(i&3)*4, (i&3)*4, (i&3)*4, (i&3)*4]\n      // e.add(e.eax, 0x00010203);  // [((i&3)*4)+3, ((i&3)*4)+2, ((i&3)*4)+1,\n      // ((i&3)*4)+0]\n      // e.vmovd(e.xmm0, e.eax);\n      // e.vpshufb(e.xmm0, i.src1, e.xmm0);\n      // e.vmovd(i.dest.reg().cvt32(), e.xmm0);\n      // Get the desired word in xmm0, then extract that.\n      Xmm src1;\n      if (i.src1.is_constant) {\n        src1 = e.xmm1;\n        e.LoadConstantXmm(src1, i.src1.constant());\n      } else {\n        src1 = i.src1.reg();\n      }\n\n      e.xor_(e.rax, e.rax);\n      e.mov(e.al, i.src2);\n      e.and_(e.al, 0x03);\n      e.shl(e.al, 4);\n      e.mov(e.rdx, reinterpret_cast<uint64_t>(extract_table_32));\n      e.vmovaps(e.xmm0, e.ptr[e.rdx + e.rax]);\n      e.vpshufb(e.xmm0, src1, e.xmm0);\n      e.vpextrd(i.dest, e.xmm0, 0);\n    }\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_EXTRACT, EXTRACT_I8, EXTRACT_I16, EXTRACT_I32);\n\n// ============================================================================\n// OPCODE_SPLAT\n// ============================================================================\n// Copy a value into all elements of a vector\nstruct SPLAT_I8 : Sequence<SPLAT_I8, I<OPCODE_SPLAT, V128Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    if (i.src1.is_constant) {\n      if (e.IsFeatureEnabled(kX64EmitGFNI)) {\n        e.pxor(e.xmm0, e.xmm0);\n        e.gf2p8affineqb(i.dest, e.xmm0, i.src1.constant());\n        return;\n      }\n      e.mov(e.eax, i.src1.constant());\n      e.vmovd(e.xmm0, e.eax);\n    } else {\n      e.vmovd(e.xmm0, i.src1.reg().cvt32());\n    }\n\n    if (e.IsFeatureEnabled(kX64EmitAVX2)) {\n      e.vpbroadcastb(i.dest, e.xmm0);\n    } else {\n      e.vpunpcklbw(e.xmm0, e.xmm0);\n      e.vpunpcklwd(e.xmm0, e.xmm0);\n      e.vpshufd(i.dest, e.xmm0, 0);\n    }\n  }\n};\nstruct SPLAT_I16 : Sequence<SPLAT_I16, I<OPCODE_SPLAT, V128Op, I16Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    if (i.src1.is_constant) {\n      // TODO(benvanik): faster constant splats.\n      e.mov(e.eax, i.src1.constant());\n      e.vmovd(e.xmm0, e.eax);\n    } else {\n      e.vmovd(e.xmm0, i.src1.reg().cvt32());\n    }\n\n    if (e.IsFeatureEnabled(kX64EmitAVX2)) {\n      e.vpbroadcastw(i.dest, e.xmm0);\n    } else {\n      e.vpunpcklwd(e.xmm0, e.xmm0);  // unpack low word data\n      e.vpshufd(i.dest, e.xmm0, 0);\n    }\n  }\n};\nstruct SPLAT_I32 : Sequence<SPLAT_I32, I<OPCODE_SPLAT, V128Op, I32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    if (i.src1.is_constant) {\n      // TODO(benvanik): faster constant splats.\n      e.mov(e.eax, i.src1.constant());\n      e.vmovd(e.xmm0, e.eax);\n    } else {\n      e.vmovd(e.xmm0, i.src1);\n    }\n\n    if (e.IsFeatureEnabled(kX64EmitAVX2)) {\n      e.vpbroadcastd(i.dest, e.xmm0);\n    } else {\n      e.vpshufd(i.dest, e.xmm0, 0);\n    }\n  }\n};\nstruct SPLAT_F32 : Sequence<SPLAT_F32, I<OPCODE_SPLAT, V128Op, F32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    if (e.IsFeatureEnabled(kX64EmitAVX2)) {\n      if (i.src1.is_constant) {\n        // TODO(benvanik): faster constant splats.\n        e.mov(e.eax, i.src1.value->constant.i32);\n        e.vmovd(e.xmm0, e.eax);\n        e.vbroadcastss(i.dest, e.xmm0);\n      } else {\n        e.vbroadcastss(i.dest, i.src1);\n      }\n    } else {\n      if (i.src1.is_constant) {\n        e.mov(e.eax, i.src1.value->constant.i32);\n        e.vmovd(i.dest, e.eax);\n        e.vshufps(i.dest, i.dest, i.dest, 0);\n      } else {\n        e.vshufps(i.dest, i.src1, i.src1, 0);\n      }\n    }\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_SPLAT, SPLAT_I8, SPLAT_I16, SPLAT_I32, SPLAT_F32);\n\n// ============================================================================\n// OPCODE_PERMUTE\n// ============================================================================\nstruct PERMUTE_I32\n    : Sequence<PERMUTE_I32, I<OPCODE_PERMUTE, V128Op, I32Op, V128Op, V128Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    assert_true(i.instr->flags == INT32_TYPE);\n    // Permute words between src2 and src3.\n    // TODO(benvanik): check src3 for zero. if 0, we can use pshufb.\n    if (i.src1.is_constant) {\n      uint32_t control = i.src1.constant();\n      // Shuffle things into the right places in dest & xmm0,\n      // then we blend them together.\n      uint32_t src_control =\n          (((control >> 24) & 0x3) << 6) | (((control >> 16) & 0x3) << 4) |\n          (((control >> 8) & 0x3) << 2) | (((control >> 0) & 0x3) << 0);\n\n      uint32_t blend_control = 0;\n      if (e.IsFeatureEnabled(kX64EmitAVX2)) {\n        // Blender for vpblendd\n        blend_control =\n            (((control >> 26) & 0x1) << 3) | (((control >> 18) & 0x1) << 2) |\n            (((control >> 10) & 0x1) << 1) | (((control >> 2) & 0x1) << 0);\n      } else {\n        // Blender for vpblendw\n        blend_control =\n            (((control >> 26) & 0x1) << 6) | (((control >> 18) & 0x1) << 4) |\n            (((control >> 10) & 0x1) << 2) | (((control >> 2) & 0x1) << 0);\n        blend_control |= blend_control << 1;\n      }\n\n      // TODO(benvanik): if src2/src3 are constants, shuffle now!\n      Xmm src2;\n      if (i.src2.is_constant) {\n        src2 = e.xmm1;\n        e.LoadConstantXmm(src2, i.src2.constant());\n      } else {\n        src2 = i.src2;\n      }\n      Xmm src3;\n      if (i.src3.is_constant) {\n        src3 = e.xmm2;\n        e.LoadConstantXmm(src3, i.src3.constant());\n      } else {\n        src3 = i.src3;\n      }\n      if (i.dest != src3) {\n        e.vpshufd(i.dest, src2, src_control);\n        e.vpshufd(e.xmm0, src3, src_control);\n      } else {\n        e.vmovaps(e.xmm0, src3);\n        e.vpshufd(i.dest, src2, src_control);\n        e.vpshufd(e.xmm0, e.xmm0, src_control);\n      }\n\n      if (e.IsFeatureEnabled(kX64EmitAVX2)) {\n        e.vpblendd(i.dest, e.xmm0, blend_control);  // $0 = $1 <blend> $2\n      } else {\n        e.vpblendw(i.dest, e.xmm0, blend_control);  // $0 = $1 <blend> $2\n      }\n    } else {\n      // Permute by non-constant.\n      assert_always();\n    }\n  }\n};\nstruct PERMUTE_V128\n    : Sequence<PERMUTE_V128,\n               I<OPCODE_PERMUTE, V128Op, V128Op, V128Op, V128Op>> {\n  static void EmitByInt8(X64Emitter& e, const EmitArgType& i) {\n    // TODO(benvanik): find out how to do this with only one temp register!\n    // Permute bytes between src2 and src3.\n    // src1 is an array of indices corresponding to positions within src2 and\n    // src3.\n    if (i.src3.value->IsConstantZero()) {\n      // Permuting with src2/zero, so just shuffle/mask.\n      if (i.src2.value->IsConstantZero()) {\n        // src2 & src3 are zero, so result will always be zero.\n        e.vpxor(i.dest, i.dest);\n      } else {\n        // Control mask needs to be shuffled.\n        if (i.src1.is_constant) {\n          e.LoadConstantXmm(e.xmm0, i.src1.constant());\n          e.vxorps(e.xmm0, e.xmm0, e.GetXmmConstPtr(XMMSwapWordMask));\n        } else {\n          e.vxorps(e.xmm0, i.src1, e.GetXmmConstPtr(XMMSwapWordMask));\n        }\n\n        if (e.IsFeatureEnabled(kX64EmitAVX512Ortho | kX64EmitAVX512VBMI)) {\n          Xmm table_lo = e.xmm1;\n          if (i.src2.is_constant) {\n            e.LoadConstantXmm(table_lo, i.src2.constant());\n          } else {\n            table_lo = i.src2;\n          }\n          Opmask zeroes = e.k1;\n          // _mm_cmple_epu8_mask\n          e.vpcmpub(zeroes, e.xmm0, e.GetXmmConstPtr(XMMPermuteControl15), 2);\n          e.vpermb(i.dest.reg() | zeroes | e.T_z, e.xmm0, table_lo);\n          return;\n        }\n\n        e.vpand(e.xmm0, e.GetXmmConstPtr(XMMPermuteByteMask));\n\n        if (i.src2.is_constant) {\n          e.LoadConstantXmm(i.dest, i.src2.constant());\n          e.vpshufb(i.dest, i.dest, e.xmm0);\n        } else {\n          e.vpshufb(i.dest, i.src2, e.xmm0);\n        }\n        // Build a mask with values in src2 having 0 and values in src3 having\n        // 1.\n        e.vpcmpgtb(e.xmm0, e.xmm0, e.GetXmmConstPtr(XMMPermuteControl15));\n        e.vpandn(i.dest, e.xmm0, i.dest);\n      }\n    } else {\n      // General permute.\n      // Control mask needs to be shuffled.\n      // TODO(benvanik): do constants here instead of in generated code.\n      if (e.IsFeatureEnabled(kX64EmitAVX512Ortho | kX64EmitAVX512BW |\n                             kX64EmitAVX512VBMI)) {\n        Xmm table_idx = e.xmm0;\n        if (i.src1.is_constant) {\n          e.LoadConstantXmm(table_idx, i.src1.constant());\n          e.vxorps(table_idx, table_idx, e.GetXmmConstPtr(XMMSwapWordMask));\n        } else {\n          e.vxorps(table_idx, i.src1, e.GetXmmConstPtr(XMMSwapWordMask));\n        }\n\n        Xmm table_lo = e.xmm1;\n        if (i.src2.value->IsConstantZero()) {\n          e.vpxor(table_lo, table_lo);\n        } else if (i.src2.is_constant) {\n          e.LoadConstantXmm(table_lo, i.src2.constant());\n        } else {\n          table_lo = i.src2;\n        }\n\n        Xmm table_hi = e.xmm2;\n        if (i.src3.value->IsConstantZero()) {\n          e.vpxor(table_hi, table_hi);\n        } else if (i.src3.is_constant) {\n          e.LoadConstantXmm(table_hi, i.src3.constant());\n        } else {\n          table_hi = i.src3;\n        }\n\n        e.vpermi2b(table_idx, table_lo, table_hi);\n        e.vmovdqu8(i.dest, table_idx);\n        return;\n      }\n\n      if (i.src1.is_constant) {\n        e.LoadConstantXmm(e.xmm2, i.src1.constant());\n        e.vxorps(e.xmm2, e.xmm2, e.GetXmmConstPtr(XMMSwapWordMask));\n      } else {\n        e.vxorps(e.xmm2, i.src1, e.GetXmmConstPtr(XMMSwapWordMask));\n      }\n      e.vpand(e.xmm2, e.GetXmmConstPtr(XMMPermuteByteMask));\n\n      Xmm src2_shuf = e.xmm0;\n      if (i.src2.value->IsConstantZero()) {\n        e.vpxor(src2_shuf, src2_shuf);\n      } else if (i.src2.is_constant) {\n        e.LoadConstantXmm(src2_shuf, i.src2.constant());\n        e.vpshufb(src2_shuf, src2_shuf, e.xmm2);\n      } else {\n        e.vpshufb(src2_shuf, i.src2, e.xmm2);\n      }\n      Xmm src3_shuf = e.xmm1;\n      if (i.src3.value->IsConstantZero()) {\n        e.vpxor(src3_shuf, src3_shuf);\n      } else if (i.src3.is_constant) {\n        e.LoadConstantXmm(src3_shuf, i.src3.constant());\n        e.vpshufb(src3_shuf, src3_shuf, e.xmm2);\n      } else {\n        e.vpshufb(src3_shuf, i.src3, e.xmm2);\n      }\n      // Build a mask with values in src2 having 0 and values in src3 having 1.\n      e.vpcmpgtb(i.dest, e.xmm2, e.GetXmmConstPtr(XMMPermuteControl15));\n      e.vpblendvb(i.dest, src2_shuf, src3_shuf, i.dest);\n    }\n  }\n\n  static void EmitByInt16(X64Emitter& e, const EmitArgType& i) {\n    // src1 is an array of indices corresponding to positions within src2 and\n    // src3\n    if (e.IsFeatureEnabled(kX64EmitAVX512Ortho | kX64EmitAVX512BW)) {\n      e.LoadConstantXmm(e.xmm1, vec128s(0x1));\n\n      Xmm table_idx = e.xmm0;\n      if (i.src1.is_constant) {\n        e.LoadConstantXmm(table_idx, i.src1.constant());\n        e.vpxord(table_idx, table_idx, e.xmm1);\n      } else {\n        e.vpxord(table_idx, i.src1, e.xmm1);\n      }\n\n      Xmm table_lo = e.xmm1;\n      if (i.src2.is_constant) {\n        e.LoadConstantXmm(table_lo, i.src2.constant());\n      } else {\n        table_lo = i.src2;\n      }\n\n      Xmm table_hi = e.xmm2;\n      if (i.src3.is_constant) {\n        e.LoadConstantXmm(table_hi, i.src3.constant());\n      } else {\n        table_hi = i.src3;\n      }\n\n      e.vpermi2w(table_idx, table_lo, table_hi);\n      e.vmovdqu8(i.dest, table_idx);\n      return;\n    }\n\n    assert_true(i.src1.is_constant);\n\n    vec128_t perm = (i.src1.constant() & vec128s(0xF)) ^ vec128s(0x1);\n    vec128_t perm_ctrl = vec128b(0);\n    for (int i = 0; i < 8; i++) {\n      perm_ctrl.i16[i] = perm.i16[i] > 7 ? -1 : 0;\n\n      auto v = uint8_t(perm.u16[i]);\n      perm.u8[i * 2] = v * 2;\n      perm.u8[i * 2 + 1] = v * 2 + 1;\n    }\n    e.LoadConstantXmm(e.xmm0, perm);\n\n    if (i.src2.is_constant) {\n      e.LoadConstantXmm(e.xmm1, i.src2.constant());\n    } else {\n      e.vmovdqa(e.xmm1, i.src2);\n    }\n    if (i.src3.is_constant) {\n      e.LoadConstantXmm(e.xmm2, i.src3.constant());\n    } else {\n      e.vmovdqa(e.xmm2, i.src3);\n    }\n\n    e.vpshufb(e.xmm1, e.xmm1, e.xmm0);\n    e.vpshufb(e.xmm2, e.xmm2, e.xmm0);\n\n    uint8_t mask = 0;\n    for (int i = 0; i < 8; i++) {\n      if (perm_ctrl.i16[i] == 0) {\n        mask |= 1 << (7 - i);\n      }\n    }\n    e.vpblendw(i.dest, e.xmm1, e.xmm2, mask);\n  }\n\n  static void EmitByInt32(X64Emitter& e, const EmitArgType& i) {\n    assert_always();\n  }\n\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    switch (i.instr->flags) {\n      case INT8_TYPE:\n        EmitByInt8(e, i);\n        break;\n      case INT16_TYPE:\n        EmitByInt16(e, i);\n        break;\n      case INT32_TYPE:\n        EmitByInt32(e, i);\n        break;\n      default:\n        assert_unhandled_case(i.instr->flags);\n        return;\n    }\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_PERMUTE, PERMUTE_I32, PERMUTE_V128);\n\n// ============================================================================\n// OPCODE_SWIZZLE\n// ============================================================================\nstruct SWIZZLE\n    : Sequence<SWIZZLE, I<OPCODE_SWIZZLE, V128Op, V128Op, OffsetOp>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    auto element_type = i.instr->flags;\n    if (element_type == INT8_TYPE) {\n      assert_always();\n    } else if (element_type == INT16_TYPE) {\n      assert_always();\n    } else if (element_type == INT32_TYPE || element_type == FLOAT32_TYPE) {\n      uint8_t swizzle_mask = static_cast<uint8_t>(i.src2.value);\n      Xmm src1;\n      if (i.src1.is_constant) {\n        src1 = e.xmm0;\n        e.LoadConstantXmm(src1, i.src1.constant());\n      } else {\n        src1 = i.src1;\n      }\n      e.vpshufd(i.dest, src1, swizzle_mask);\n    } else if (element_type == INT64_TYPE || element_type == FLOAT64_TYPE) {\n      assert_always();\n    } else {\n      assert_always();\n    }\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_SWIZZLE, SWIZZLE);\n\n// ============================================================================\n// OPCODE_PACK\n// ============================================================================\nstruct PACK : Sequence<PACK, I<OPCODE_PACK, V128Op, V128Op, V128Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    switch (i.instr->flags & PACK_TYPE_MODE) {\n      case PACK_TYPE_D3DCOLOR:\n        EmitD3DCOLOR(e, i);\n        break;\n      case PACK_TYPE_FLOAT16_2:\n        EmitFLOAT16_2(e, i);\n        break;\n      case PACK_TYPE_FLOAT16_4:\n        EmitFLOAT16_4(e, i);\n        break;\n      case PACK_TYPE_SHORT_2:\n        EmitSHORT_2(e, i);\n        break;\n      case PACK_TYPE_SHORT_4:\n        EmitSHORT_4(e, i);\n        break;\n      case PACK_TYPE_UINT_2101010:\n        EmitUINT_2101010(e, i);\n        break;\n      case PACK_TYPE_ULONG_4202020:\n        EmitULONG_4202020(e, i);\n        break;\n      case PACK_TYPE_8_IN_16:\n        Emit8_IN_16(e, i, i.instr->flags);\n        break;\n      case PACK_TYPE_16_IN_32:\n        Emit16_IN_32(e, i, i.instr->flags);\n        break;\n      default:\n        assert_unhandled_case(i.instr->flags);\n        break;\n    }\n  }\n  static void EmitD3DCOLOR(X64Emitter& e, const EmitArgType& i) {\n    assert_true(i.src2.value->IsConstantZero());\n    Xmm src;\n    if (i.src1.is_constant) {\n      src = i.dest;\n      e.LoadConstantXmm(src, i.src1.constant());\n    } else {\n      src = i.src1;\n    }\n    // Saturate to [3,3....] so that only values between 3...[00] and 3...[FF]\n    // are valid - max before min to pack NaN as zero (5454082B is heavily\n    // affected by the order - packs 0xFFFFFFFF in matrix code to get a 0\n    // constant).\n    e.vmaxps(i.dest, src, e.GetXmmConstPtr(XMM3333));\n    e.vminps(i.dest, i.dest, e.GetXmmConstPtr(XMMPackD3DCOLORSat));\n    // Extract bytes.\n    // RGBA (XYZW) -> ARGB (WXYZ)\n    // w = ((src1.uw & 0xFF) << 24) | ((src1.ux & 0xFF) << 16) |\n    //     ((src1.uy & 0xFF) << 8) | (src1.uz & 0xFF)\n    e.vpshufb(i.dest, i.dest, e.GetXmmConstPtr(XMMPackD3DCOLOR));\n  }\n  static __m128i EmulateFLOAT16_2(void*, __m128 src1) {\n    alignas(16) float a[4];\n    alignas(16) uint16_t b[8];\n    _mm_store_ps(a, src1);\n    std::memset(b, 0, sizeof(b));\n\n    for (int i = 0; i < 2; i++) {\n      b[7 - i] = half_float::detail::float2half<std::round_toward_zero>(a[i]);\n    }\n\n    return _mm_load_si128(reinterpret_cast<__m128i*>(b));\n  }\n  static void EmitFLOAT16_2(X64Emitter& e, const EmitArgType& i) {\n    assert_true(i.src2.value->IsConstantZero());\n    // http://blogs.msdn.com/b/chuckw/archive/2012/09/11/directxmath-f16c-and-fma.aspx\n    // dest = [(src1.x | src1.y), 0, 0, 0]\n\n    if (e.IsFeatureEnabled(kX64EmitF16C)) {\n      Xmm src;\n      if (i.src1.is_constant) {\n        src = i.dest;\n        e.LoadConstantXmm(src, i.src1.constant());\n      } else {\n        src = i.src1;\n      }\n      // 0|0|0|0|W|Z|Y|X\n      e.vcvtps2ph(i.dest, src, 0b00000011);\n      // Shuffle to X|Y|0|0|0|0|0|0\n      e.vpshufb(i.dest, i.dest, e.GetXmmConstPtr(XMMPackFLOAT16_2));\n    } else {\n      if (i.src1.is_constant) {\n        e.lea(e.GetNativeParam(0), e.StashConstantXmm(0, i.src1.constant()));\n      } else {\n        e.lea(e.GetNativeParam(0), e.StashXmm(0, i.src1));\n      }\n      e.CallNativeSafe(reinterpret_cast<void*>(EmulateFLOAT16_2));\n      e.vmovaps(i.dest, e.xmm0);\n    }\n  }\n  static __m128i EmulateFLOAT16_4(void*, __m128 src1) {\n    alignas(16) float a[4];\n    alignas(16) uint16_t b[8];\n    _mm_store_ps(a, src1);\n    std::memset(b, 0, sizeof(b));\n\n    for (int i = 0; i < 4; i++) {\n      b[7 - (i ^ 2)] =\n          half_float::detail::float2half<std::round_toward_zero>(a[i]);\n    }\n\n    return _mm_load_si128(reinterpret_cast<__m128i*>(b));\n  }\n  static void EmitFLOAT16_4(X64Emitter& e, const EmitArgType& i) {\n    assert_true(i.src2.value->IsConstantZero());\n    // dest = [(src1.z | src1.w), (src1.x | src1.y), 0, 0]\n\n    if (e.IsFeatureEnabled(kX64EmitF16C)) {\n      Xmm src;\n      if (i.src1.is_constant) {\n        src = i.dest;\n        e.LoadConstantXmm(src, i.src1.constant());\n      } else {\n        src = i.src1;\n      }\n      // 0|0|0|0|W|Z|Y|X\n      e.vcvtps2ph(i.dest, src, 0b00000011);\n      // Shuffle to Z|W|X|Y|0|0|0|0\n      e.vpshufb(i.dest, i.dest, e.GetXmmConstPtr(XMMPackFLOAT16_4));\n    } else {\n      if (i.src1.is_constant) {\n        e.lea(e.GetNativeParam(0), e.StashConstantXmm(0, i.src1.constant()));\n      } else {\n        e.lea(e.GetNativeParam(0), e.StashXmm(0, i.src1));\n      }\n      e.CallNativeSafe(reinterpret_cast<void*>(EmulateFLOAT16_4));\n      e.vmovaps(i.dest, e.xmm0);\n    }\n  }\n  static void EmitSHORT_2(X64Emitter& e, const EmitArgType& i) {\n    assert_true(i.src2.value->IsConstantZero());\n    Xmm src;\n    if (i.src1.is_constant) {\n      src = i.dest;\n      e.LoadConstantXmm(src, i.src1.constant());\n    } else {\n      src = i.src1;\n    }\n    // Saturate.\n    e.vmaxps(i.dest, src, e.GetXmmConstPtr(XMMPackSHORT_Min));\n    e.vminps(i.dest, i.dest, e.GetXmmConstPtr(XMMPackSHORT_Max));\n    // Pack.\n    e.vpshufb(i.dest, i.dest, e.GetXmmConstPtr(XMMPackSHORT_2));\n  }\n  static void EmitSHORT_4(X64Emitter& e, const EmitArgType& i) {\n    assert_true(i.src2.value->IsConstantZero());\n    Xmm src;\n    if (i.src1.is_constant) {\n      src = i.dest;\n      e.LoadConstantXmm(src, i.src1.constant());\n    } else {\n      src = i.src1;\n    }\n    // Saturate.\n    e.vmaxps(i.dest, src, e.GetXmmConstPtr(XMMPackSHORT_Min));\n    e.vminps(i.dest, i.dest, e.GetXmmConstPtr(XMMPackSHORT_Max));\n    // Pack.\n    e.vpshufb(i.dest, i.dest, e.GetXmmConstPtr(XMMPackSHORT_4));\n  }\n  static void EmitUINT_2101010(X64Emitter& e, const EmitArgType& i) {\n    // https://www.opengl.org/registry/specs/ARB/vertex_type_2_10_10_10_rev.txt\n    // XYZ are 10 bits, signed and saturated.\n    // W is 2 bits, unsigned and saturated.\n    Xmm src;\n    if (i.src1.is_constant) {\n      src = i.dest;\n      e.LoadConstantXmm(src, i.src1.constant());\n    } else {\n      src = i.src1;\n    }\n    // Saturate.\n    e.vmaxps(i.dest, src, e.GetXmmConstPtr(XMMPackUINT_2101010_MinUnpacked));\n    e.vminps(i.dest, i.dest, e.GetXmmConstPtr(XMMPackUINT_2101010_MaxUnpacked));\n    // Remove the unneeded bits of the floats.\n    e.vpand(i.dest, e.GetXmmConstPtr(XMMPackUINT_2101010_MaskUnpacked));\n    if (e.IsFeatureEnabled(kX64EmitAVX2)) {\n      // Shift the components up.\n      e.vpsllvd(i.dest, i.dest, e.GetXmmConstPtr(XMMPackUINT_2101010_Shift));\n    } else {\n      // Duplicate all the components into bits 10-19.\n      e.vpslld(e.xmm0, i.dest, 10);\n      e.vpor(i.dest, e.xmm0);\n      // Duplicate all the components into bits 20-39\n      // (so alpha will be in 30-31).\n      e.vpslld(e.xmm0, i.dest, 20);\n      e.vpor(i.dest, e.xmm0);\n      // Leave only the needed components.\n      e.vpand(i.dest, e.GetXmmConstPtr(XMMPackUINT_2101010_MaskPacked));\n    }\n    // Combine the components.\n    e.vshufps(e.xmm0, i.dest, i.dest, _MM_SHUFFLE(2, 3, 0, 1));\n    e.vorps(i.dest, e.xmm0);\n    e.vshufps(e.xmm0, i.dest, i.dest, _MM_SHUFFLE(1, 0, 3, 2));\n    e.vorps(i.dest, e.xmm0);\n  }\n  static void EmitULONG_4202020(X64Emitter& e, const EmitArgType& i) {\n    // XYZ are 20 bits, signed and saturated.\n    // W is 4 bits, unsigned and saturated.\n    Xmm src;\n    if (i.src1.is_constant) {\n      src = i.dest;\n      e.LoadConstantXmm(src, i.src1.constant());\n    } else {\n      src = i.src1;\n    }\n    // Saturate.\n    e.vmaxps(i.dest, src, e.GetXmmConstPtr(XMMPackULONG_4202020_MinUnpacked));\n    e.vminps(i.dest, i.dest,\n             e.GetXmmConstPtr(XMMPackULONG_4202020_MaxUnpacked));\n    // Remove the unneeded bits of the floats (so excess nibbles will also be\n    // cleared).\n    e.vpand(i.dest, e.GetXmmConstPtr(XMMPackULONG_4202020_MaskUnpacked));\n    // Store Y and W shifted left by 4 so vpshufb can be used with them.\n    e.vpslld(e.xmm0, i.dest, 4);\n    // Place XZ where they're supposed to be.\n    e.vpshufb(i.dest, i.dest, e.GetXmmConstPtr(XMMPackULONG_4202020_PermuteXZ));\n    // Place YW.\n    e.vpshufb(e.xmm0, e.xmm0, e.GetXmmConstPtr(XMMPackULONG_4202020_PermuteYW));\n    // Merge XZ and YW.\n    e.vorps(i.dest, e.xmm0);\n  }\n  static __m128i EmulatePack8_IN_16_UN_UN_SAT(void*, __m128i src1,\n                                              __m128i src2) {\n    alignas(16) uint16_t a[8];\n    alignas(16) uint16_t b[8];\n    alignas(16) uint8_t c[16];\n    _mm_store_si128(reinterpret_cast<__m128i*>(a), src1);\n    _mm_store_si128(reinterpret_cast<__m128i*>(b), src2);\n    for (int i = 0; i < 8; ++i) {\n      c[i] = uint8_t(std::max(uint16_t(0), std::min(uint16_t(255), a[i])));\n      c[i + 8] = uint8_t(std::max(uint16_t(0), std::min(uint16_t(255), b[i])));\n    }\n    return _mm_load_si128(reinterpret_cast<__m128i*>(c));\n  }\n  static __m128i EmulatePack8_IN_16_UN_UN(void*, __m128i src1, __m128i src2) {\n    alignas(16) uint8_t a[16];\n    alignas(16) uint8_t b[16];\n    alignas(16) uint8_t c[16];\n    _mm_store_si128(reinterpret_cast<__m128i*>(a), src1);\n    _mm_store_si128(reinterpret_cast<__m128i*>(b), src2);\n    for (int i = 0; i < 8; ++i) {\n      c[i] = a[i * 2];\n      c[i + 8] = b[i * 2];\n    }\n    return _mm_load_si128(reinterpret_cast<__m128i*>(c));\n  }\n  static void Emit8_IN_16(X64Emitter& e, const EmitArgType& i, uint32_t flags) {\n    // TODO(benvanik): handle src2 (or src1) being constant zero\n    if (IsPackInUnsigned(flags)) {\n      if (IsPackOutUnsigned(flags)) {\n        if (IsPackOutSaturate(flags)) {\n          // unsigned -> unsigned + saturate\n          if (i.src2.is_constant) {\n            e.lea(e.GetNativeParam(1),\n                  e.StashConstantXmm(1, i.src2.constant()));\n          } else {\n            e.lea(e.GetNativeParam(1), e.StashXmm(1, i.src2));\n          }\n          e.lea(e.GetNativeParam(0), e.StashXmm(0, i.src1));\n          e.CallNativeSafe(\n              reinterpret_cast<void*>(EmulatePack8_IN_16_UN_UN_SAT));\n          e.vmovaps(i.dest, e.xmm0);\n          e.vpshufb(i.dest, i.dest, e.GetXmmConstPtr(XMMByteOrderMask));\n        } else {\n          // unsigned -> unsigned\n          e.lea(e.GetNativeParam(1), e.StashXmm(1, i.src2));\n          e.lea(e.GetNativeParam(0), e.StashXmm(0, i.src1));\n          e.CallNativeSafe(reinterpret_cast<void*>(EmulatePack8_IN_16_UN_UN));\n          e.vmovaps(i.dest, e.xmm0);\n          e.vpshufb(i.dest, i.dest, e.GetXmmConstPtr(XMMByteOrderMask));\n        }\n      } else {\n        if (IsPackOutSaturate(flags)) {\n          // unsigned -> signed + saturate\n          assert_always();\n        } else {\n          // unsigned -> signed\n          assert_always();\n        }\n      }\n    } else {\n      if (IsPackOutUnsigned(flags)) {\n        if (IsPackOutSaturate(flags)) {\n          // signed -> unsigned + saturate\n          // PACKUSWB / SaturateSignedWordToUnsignedByte\n          Xbyak::Xmm src2 = i.src2.is_constant ? e.xmm0 : i.src2;\n          if (i.src2.is_constant) {\n            e.LoadConstantXmm(src2, i.src2.constant());\n          }\n\n          e.vpackuswb(i.dest, i.src1, src2);\n          e.vpshufb(i.dest, i.dest, e.GetXmmConstPtr(XMMByteOrderMask));\n        } else {\n          // signed -> unsigned\n          assert_always();\n        }\n      } else {\n        if (IsPackOutSaturate(flags)) {\n          // signed -> signed + saturate\n          // PACKSSWB / SaturateSignedWordToSignedByte\n          e.vpacksswb(i.dest, i.src1, i.src2);\n          e.vpshufb(i.dest, i.dest, e.GetXmmConstPtr(XMMByteOrderMask));\n        } else {\n          // signed -> signed\n          assert_always();\n        }\n      }\n    }\n  }\n  // Pack 2 32-bit vectors into a 16-bit vector.\n  static void Emit16_IN_32(X64Emitter& e, const EmitArgType& i,\n                           uint32_t flags) {\n    // TODO(benvanik): handle src2 (or src1) being constant zero\n    if (IsPackInUnsigned(flags)) {\n      if (IsPackOutUnsigned(flags)) {\n        if (IsPackOutSaturate(flags)) {\n          // unsigned -> unsigned + saturate\n          // Construct a saturation max value\n          e.mov(e.eax, 0xFFFFu);\n          e.vmovd(e.xmm0, e.eax);\n          e.vpshufd(e.xmm0, e.xmm0, 0b00000000);\n\n          if (!i.src1.is_constant) {\n            e.vpminud(e.xmm1, i.src1, e.xmm0);  // Saturate src1\n            e.vpshuflw(e.xmm1, e.xmm1, 0b00100010);\n            e.vpshufhw(e.xmm1, e.xmm1, 0b00100010);\n            e.vpshufd(e.xmm1, e.xmm1, 0b00001000);\n          } else {\n            // TODO(DrChat): Non-zero constants\n            assert_true(i.src1.constant().u64[0] == 0 &&\n                        i.src1.constant().u64[1] == 0);\n            e.vpxor(e.xmm1, e.xmm1);\n          }\n\n          if (!i.src2.is_constant) {\n            e.vpminud(i.dest, i.src2, e.xmm0);  // Saturate src2\n            e.vpshuflw(i.dest, i.dest, 0b00100010);\n            e.vpshufhw(i.dest, i.dest, 0b00100010);\n            e.vpshufd(i.dest, i.dest, 0b10000000);\n          } else {\n            // TODO(DrChat): Non-zero constants\n            assert_true(i.src2.constant().u64[0] == 0 &&\n                        i.src2.constant().u64[1] == 0);\n            e.vpxor(i.dest, i.dest);\n          }\n\n          e.vpblendw(i.dest, i.dest, e.xmm1, 0b00001111);\n        } else {\n          // unsigned -> unsigned\n          e.vmovaps(e.xmm0, i.src1);\n          e.vpshuflw(e.xmm0, e.xmm0, 0b00100010);\n          e.vpshufhw(e.xmm0, e.xmm0, 0b00100010);\n          e.vpshufd(e.xmm0, e.xmm0, 0b00001000);\n\n          e.vmovaps(i.dest, i.src2);\n          e.vpshuflw(i.dest, i.dest, 0b00100010);\n          e.vpshufhw(i.dest, i.dest, 0b00100010);\n          e.vpshufd(i.dest, i.dest, 0b10000000);\n\n          e.vpblendw(i.dest, i.dest, e.xmm0, 0b00001111);\n        }\n      } else {\n        if (IsPackOutSaturate(flags)) {\n          // unsigned -> signed + saturate\n          assert_always();\n        } else {\n          // unsigned -> signed\n          assert_always();\n        }\n      }\n    } else {\n      if (IsPackOutUnsigned(flags)) {\n        if (IsPackOutSaturate(flags)) {\n          // signed -> unsigned + saturate\n          // PACKUSDW\n          // TMP[15:0] <- (DEST[31:0] < 0) ? 0 : DEST[15:0];\n          // DEST[15:0] <- (DEST[31:0] > FFFFH) ? FFFFH : TMP[15:0];\n          e.vpackusdw(i.dest, i.src1, i.src2);\n          e.vpshuflw(i.dest, i.dest, 0b10110001);\n          e.vpshufhw(i.dest, i.dest, 0b10110001);\n        } else {\n          // signed -> unsigned\n          assert_always();\n        }\n      } else {\n        if (IsPackOutSaturate(flags)) {\n          // signed -> signed + saturate\n          // PACKSSDW / SaturateSignedDwordToSignedWord\n          Xmm src2;\n          if (!i.src2.is_constant) {\n            src2 = i.src2;\n          } else {\n            assert_false(i.src1 == e.xmm0);\n            src2 = e.xmm0;\n            e.LoadConstantXmm(src2, i.src2.constant());\n          }\n          e.vpackssdw(i.dest, i.src1, src2);\n          e.vpshuflw(i.dest, i.dest, 0b10110001);\n          e.vpshufhw(i.dest, i.dest, 0b10110001);\n        } else {\n          // signed -> signed\n          assert_always();\n        }\n      }\n    }\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_PACK, PACK);\n\n// ============================================================================\n// OPCODE_UNPACK\n// ============================================================================\nstruct UNPACK : Sequence<UNPACK, I<OPCODE_UNPACK, V128Op, V128Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    switch (i.instr->flags & PACK_TYPE_MODE) {\n      case PACK_TYPE_D3DCOLOR:\n        EmitD3DCOLOR(e, i);\n        break;\n      case PACK_TYPE_FLOAT16_2:\n        EmitFLOAT16_2(e, i);\n        break;\n      case PACK_TYPE_FLOAT16_4:\n        EmitFLOAT16_4(e, i);\n        break;\n      case PACK_TYPE_SHORT_2:\n        EmitSHORT_2(e, i);\n        break;\n      case PACK_TYPE_SHORT_4:\n        EmitSHORT_4(e, i);\n        break;\n      case PACK_TYPE_UINT_2101010:\n        EmitUINT_2101010(e, i);\n        break;\n      case PACK_TYPE_ULONG_4202020:\n        EmitULONG_4202020(e, i);\n        break;\n      case PACK_TYPE_8_IN_16:\n        Emit8_IN_16(e, i, i.instr->flags);\n        break;\n      case PACK_TYPE_16_IN_32:\n        Emit16_IN_32(e, i, i.instr->flags);\n        break;\n      default:\n        assert_unhandled_case(i.instr->flags);\n        break;\n    }\n  }\n  static void EmitD3DCOLOR(X64Emitter& e, const EmitArgType& i) {\n    // ARGB (WXYZ) -> RGBA (XYZW)\n    Xmm src;\n    if (i.src1.is_constant) {\n      if (i.src1.value->IsConstantZero()) {\n        e.vmovaps(i.dest, e.GetXmmConstPtr(XMMOne));\n        return;\n      }\n      src = i.dest;\n      e.LoadConstantXmm(src, i.src1.constant());\n    } else {\n      src = i.src1;\n    }\n    // src = ZZYYXXWW\n    // Unpack to 000000ZZ,000000YY,000000XX,000000WW\n    e.vpshufb(i.dest, src, e.GetXmmConstPtr(XMMUnpackD3DCOLOR));\n    // Add 1.0f to each.\n    e.vpor(i.dest, e.GetXmmConstPtr(XMMOne));\n    // To convert to 0 to 1, games multiply by 0x47008081 and add 0xC7008081.\n  }\n  static __m128 EmulateFLOAT16_2(void*, __m128i src1) {\n    alignas(16) uint16_t a[8];\n    alignas(16) float b[4];\n    _mm_store_si128(reinterpret_cast<__m128i*>(a), src1);\n\n    for (int i = 0; i < 2; i++) {\n      b[i] = half_float::detail::half2float(a[VEC128_W(6 + i)]);\n    }\n\n    // Constants, or something\n    b[2] = 0.f;\n    b[3] = 1.f;\n\n    return _mm_load_ps(b);\n  }\n  static void EmitFLOAT16_2(X64Emitter& e, const EmitArgType& i) {\n    // 1 bit sign, 5 bit exponent, 10 bit mantissa\n    // D3D10 half float format\n    // TODO(benvanik):\n    // http://blogs.msdn.com/b/chuckw/archive/2012/09/11/directxmath-f16c-and-fma.aspx\n    // Use _mm_cvtph_ps -- requires very modern processors (SSE5+)\n    // Unpacking half floats:\n    // http://fgiesen.wordpress.com/2012/03/28/half-to-float-done-quic/\n    // Packing half floats: https://gist.github.com/rygorous/2156668\n    // Load source, move from tight pack of X16Y16.... to X16...Y16...\n    // Also zero out the high end.\n    // TODO(benvanik): special case constant unpacks that just get 0/1/etc.\n\n    if (e.IsFeatureEnabled(kX64EmitF16C)) {\n      Xmm src;\n      if (i.src1.is_constant) {\n        src = i.dest;\n        e.LoadConstantXmm(src, i.src1.constant());\n      } else {\n        src = i.src1;\n      }\n      // sx = src.iw >> 16;\n      // sy = src.iw & 0xFFFF;\n      // dest = { XMConvertHalfToFloat(sx),\n      //          XMConvertHalfToFloat(sy),\n      //          0.0,\n      //          1.0 };\n      // Shuffle to 0|0|0|0|0|0|Y|X\n      e.vpshufb(i.dest, src, e.GetXmmConstPtr(XMMUnpackFLOAT16_2));\n      e.vcvtph2ps(i.dest, i.dest);\n      e.vpshufd(i.dest, i.dest, 0b10100100);\n      e.vpor(i.dest, e.GetXmmConstPtr(XMM0001));\n    } else {\n      if (i.src1.is_constant) {\n        e.lea(e.GetNativeParam(0), e.StashConstantXmm(0, i.src1.constant()));\n      } else {\n        e.lea(e.GetNativeParam(0), e.StashXmm(0, i.src1));\n      }\n      e.CallNativeSafe(reinterpret_cast<void*>(EmulateFLOAT16_2));\n      e.vmovaps(i.dest, e.xmm0);\n    }\n  }\n  static __m128 EmulateFLOAT16_4(void*, __m128i src1) {\n    alignas(16) uint16_t a[8];\n    alignas(16) float b[4];\n    _mm_store_si128(reinterpret_cast<__m128i*>(a), src1);\n\n    for (int i = 0; i < 4; i++) {\n      b[i] = half_float::detail::half2float(a[VEC128_W(4 + i)]);\n    }\n\n    return _mm_load_ps(b);\n  }\n  static void EmitFLOAT16_4(X64Emitter& e, const EmitArgType& i) {\n    // src = [(dest.x | dest.y), (dest.z | dest.w), 0, 0]\n    if (e.IsFeatureEnabled(kX64EmitF16C)) {\n      Xmm src;\n      if (i.src1.is_constant) {\n        src = i.dest;\n        e.LoadConstantXmm(src, i.src1.constant());\n      } else {\n        src = i.src1;\n      }\n      // Shuffle to 0|0|0|0|W|Z|Y|X\n      e.vpshufb(i.dest, src, e.GetXmmConstPtr(XMMUnpackFLOAT16_4));\n      e.vcvtph2ps(i.dest, i.dest);\n    } else {\n      if (i.src1.is_constant) {\n        e.lea(e.GetNativeParam(0), e.StashConstantXmm(0, i.src1.constant()));\n      } else {\n        e.lea(e.GetNativeParam(0), e.StashXmm(0, i.src1));\n      }\n      e.CallNativeSafe(reinterpret_cast<void*>(EmulateFLOAT16_4));\n      e.vmovaps(i.dest, e.xmm0);\n    }\n  }\n  static void EmitSHORT_2(X64Emitter& e, const EmitArgType& i) {\n    // (VD.x) = 3.0 + (VB.x>>16)*2^-22\n    // (VD.y) = 3.0 + (VB.x)*2^-22\n    // (VD.z) = 0.0\n    // (VD.w) = 1.0 (games splat W after unpacking to get vectors of 1.0f)\n    // src is (xx,xx,xx,VALUE)\n    Xmm src;\n    if (i.src1.is_constant) {\n      if (i.src1.value->IsConstantZero()) {\n        e.vmovdqa(i.dest, e.GetXmmConstPtr(XMM3301));\n        return;\n      }\n      // TODO(benvanik): check other common constants/perform shuffle/or here.\n      src = i.dest;\n      e.LoadConstantXmm(src, i.src1.constant());\n    } else {\n      src = i.src1;\n    }\n    // Shuffle bytes.\n    e.vpshufb(i.dest, src, e.GetXmmConstPtr(XMMUnpackSHORT_2));\n    // If negative, make smaller than 3 - sign extend before adding.\n    e.vpslld(i.dest, 16);\n    e.vpsrad(i.dest, 16);\n    // Add 3,3,0,1.\n    e.vpaddd(i.dest, e.GetXmmConstPtr(XMM3301));\n    // Return quiet NaNs in case of negative overflow.\n    e.vcmpeqps(e.xmm0, i.dest, e.GetXmmConstPtr(XMMUnpackSHORT_Overflow));\n    e.vblendvps(i.dest, i.dest, e.GetXmmConstPtr(XMMQNaN), e.xmm0);\n  }\n  static void EmitSHORT_4(X64Emitter& e, const EmitArgType& i) {\n    // (VD.x) = 3.0 + (VB.x>>16)*2^-22\n    // (VD.y) = 3.0 + (VB.x)*2^-22\n    // (VD.z) = 3.0 + (VB.y>>16)*2^-22\n    // (VD.w) = 3.0 + (VB.y)*2^-22\n    // src is (xx,xx,VALUE,VALUE)\n    Xmm src;\n    if (i.src1.is_constant) {\n      if (i.src1.value->IsConstantZero()) {\n        e.vmovdqa(i.dest, e.GetXmmConstPtr(XMM3333));\n        return;\n      }\n      // TODO(benvanik): check other common constants/perform shuffle/or here.\n      src = i.dest;\n      e.LoadConstantXmm(src, i.src1.constant());\n    } else {\n      src = i.src1;\n    }\n    // Shuffle bytes.\n    e.vpshufb(i.dest, src, e.GetXmmConstPtr(XMMUnpackSHORT_4));\n    // If negative, make smaller than 3 - sign extend before adding.\n    e.vpslld(i.dest, 16);\n    e.vpsrad(i.dest, 16);\n    // Add 3,3,3,3.\n    e.vpaddd(i.dest, e.GetXmmConstPtr(XMM3333));\n    // Return quiet NaNs in case of negative overflow.\n    e.vcmpeqps(e.xmm0, i.dest, e.GetXmmConstPtr(XMMUnpackSHORT_Overflow));\n    e.vblendvps(i.dest, i.dest, e.GetXmmConstPtr(XMMQNaN), e.xmm0);\n  }\n  static void EmitUINT_2101010(X64Emitter& e, const EmitArgType& i) {\n    Xmm src;\n    if (i.src1.is_constant) {\n      if (i.src1.value->IsConstantZero()) {\n        e.vmovdqa(i.dest, e.GetXmmConstPtr(XMM3331));\n        return;\n      }\n      src = i.dest;\n      e.LoadConstantXmm(src, i.src1.constant());\n    } else {\n      src = i.src1;\n    }\n    // Splat W.\n    e.vshufps(i.dest, src, src, _MM_SHUFFLE(3, 3, 3, 3));\n    // Keep only the needed components.\n    // Red in 0-9 now, green in 10-19, blue in 20-29, alpha in 30-31.\n    e.vpand(i.dest, e.GetXmmConstPtr(XMMPackUINT_2101010_MaskPacked));\n    if (e.IsFeatureEnabled(kX64EmitAVX2)) {\n      // Shift the components down.\n      e.vpsrlvd(i.dest, i.dest, e.GetXmmConstPtr(XMMPackUINT_2101010_Shift));\n    } else {\n      // Duplicate green in 0-9 and alpha in 20-21.\n      e.vpsrld(e.xmm0, i.dest, 10);\n      e.vpor(i.dest, e.xmm0);\n      // Duplicate blue in 0-9 and alpha in 0-1.\n      e.vpsrld(e.xmm0, i.dest, 20);\n      e.vpor(i.dest, e.xmm0);\n      // Remove higher duplicate components.\n      e.vpand(i.dest, e.GetXmmConstPtr(XMMPackUINT_2101010_MaskUnpacked));\n    }\n    // If XYZ are negative, make smaller than 3 - sign extend XYZ before adding.\n    // W is unsigned.\n    e.vpslld(i.dest, 22);\n    e.vpsrad(i.dest, 22);\n    // Add 3,3,3,1.\n    e.vpaddd(i.dest, e.GetXmmConstPtr(XMM3331));\n    // Return quiet NaNs in case of negative overflow.\n    e.vcmpeqps(e.xmm0, i.dest,\n               e.GetXmmConstPtr(XMMUnpackUINT_2101010_Overflow));\n    e.vblendvps(i.dest, i.dest, e.GetXmmConstPtr(XMMQNaN), e.xmm0);\n    // To convert XYZ to -1 to 1, games multiply by 0x46004020 & sub 0x46C06030.\n    // For W to 0 to 1, they multiply by and subtract 0x4A2AAAAB.\n  }\n  static void EmitULONG_4202020(X64Emitter& e, const EmitArgType& i) {\n    Xmm src;\n    if (i.src1.is_constant) {\n      if (i.src1.value->IsConstantZero()) {\n        e.vmovdqa(i.dest, e.GetXmmConstPtr(XMM3331));\n        return;\n      }\n      src = i.dest;\n      e.LoadConstantXmm(src, i.src1.constant());\n    } else {\n      src = i.src1;\n    }\n    // Extract pairs of nibbles to XZYW. XZ will have excess 4 upper bits, YW\n    // will have excess 4 lower bits.\n    e.vpshufb(i.dest, src, e.GetXmmConstPtr(XMMUnpackULONG_4202020_Permute));\n    // Drop the excess nibble of YW.\n    e.vpsrld(e.xmm0, i.dest, 4);\n    // Merge XZ and YW now both starting at offset 0.\n    e.vshufps(i.dest, i.dest, e.xmm0, _MM_SHUFFLE(3, 2, 1, 0));\n    // Reorder as XYZW.\n    e.vshufps(i.dest, i.dest, _MM_SHUFFLE(3, 1, 2, 0));\n    // Drop the excess upper nibble in XZ and sign-extend XYZ.\n    e.vpslld(i.dest, 12);\n    e.vpsrad(i.dest, 12);\n    // Add 3,3,3,1.\n    e.vpaddd(i.dest, e.GetXmmConstPtr(XMM3331));\n    // Return quiet NaNs in case of negative overflow.\n    e.vcmpeqps(e.xmm0, i.dest,\n               e.GetXmmConstPtr(XMMUnpackULONG_4202020_Overflow));\n    e.vblendvps(i.dest, i.dest, e.GetXmmConstPtr(XMMQNaN), e.xmm0);\n  }\n  static void Emit8_IN_16(X64Emitter& e, const EmitArgType& i, uint32_t flags) {\n    assert_false(IsPackOutSaturate(flags));\n    Xmm src;\n    if (i.src1.is_constant) {\n      src = i.dest;\n      e.LoadConstantXmm(src, i.src1.constant());\n    } else {\n      src = i.src1;\n    }\n    if (IsPackToLo(flags)) {\n      // Unpack to LO.\n      if (IsPackInUnsigned(flags)) {\n        if (IsPackOutUnsigned(flags)) {\n          // unsigned -> unsigned\n          assert_always();\n        } else {\n          // unsigned -> signed\n          assert_always();\n        }\n      } else {\n        if (IsPackOutUnsigned(flags)) {\n          // signed -> unsigned\n          assert_always();\n        } else {\n          // signed -> signed\n          e.vpshufb(i.dest, src, e.GetXmmConstPtr(XMMByteOrderMask));\n          e.vpunpckhbw(i.dest, i.dest, i.dest);\n          e.vpsraw(i.dest, 8);\n        }\n      }\n    } else {\n      // Unpack to HI.\n      if (IsPackInUnsigned(flags)) {\n        if (IsPackOutUnsigned(flags)) {\n          // unsigned -> unsigned\n          assert_always();\n        } else {\n          // unsigned -> signed\n          assert_always();\n        }\n      } else {\n        if (IsPackOutUnsigned(flags)) {\n          // signed -> unsigned\n          assert_always();\n        } else {\n          // signed -> signed\n          e.vpshufb(i.dest, src, e.GetXmmConstPtr(XMMByteOrderMask));\n          e.vpunpcklbw(i.dest, i.dest, i.dest);\n          e.vpsraw(i.dest, 8);\n        }\n      }\n    }\n  }\n  static void Emit16_IN_32(X64Emitter& e, const EmitArgType& i,\n                           uint32_t flags) {\n    assert_false(IsPackOutSaturate(flags));\n    Xmm src;\n    if (i.src1.is_constant) {\n      src = i.dest;\n      e.LoadConstantXmm(src, i.src1.constant());\n    } else {\n      src = i.src1;\n    }\n    if (IsPackToLo(flags)) {\n      // Unpack to LO.\n      if (IsPackInUnsigned(flags)) {\n        if (IsPackOutUnsigned(flags)) {\n          // unsigned -> unsigned\n          assert_always();\n        } else {\n          // unsigned -> signed\n          assert_always();\n        }\n      } else {\n        if (IsPackOutUnsigned(flags)) {\n          // signed -> unsigned\n          assert_always();\n        } else {\n          // signed -> signed\n          e.vpunpckhwd(i.dest, src, src);\n          e.vpsrad(i.dest, 16);\n        }\n      }\n    } else {\n      // Unpack to HI.\n      if (IsPackInUnsigned(flags)) {\n        if (IsPackOutUnsigned(flags)) {\n          // unsigned -> unsigned\n          assert_always();\n        } else {\n          // unsigned -> signed\n          assert_always();\n        }\n      } else {\n        if (IsPackOutUnsigned(flags)) {\n          // signed -> unsigned\n          assert_always();\n        } else {\n          // signed -> signed\n          e.vpunpcklwd(i.dest, src, src);\n          e.vpsrad(i.dest, 16);\n        }\n      }\n    }\n    e.vpshufd(i.dest, i.dest, 0xB1);\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_UNPACK, UNPACK);\n\n}  // namespace x64\n}  // namespace backend\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/backend/x64/x64_sequences.cc",
    "content": "﻿/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n// A note about vectors:\n// Xenia represents vectors as xyzw pairs, with indices 0123.\n// XMM registers are xyzw pairs with indices 3210, making them more like wzyx.\n// This makes things somewhat confusing. It'd be nice to just shuffle the\n// registers around on load/store, however certain operations require that\n// data be in the right offset.\n// Basically, this identity must hold:\n//   shuffle(vec, b00011011) -> {x,y,z,w} => {x,y,z,w}\n// All indices and operations must respect that.\n//\n// Memory (big endian):\n// [00 01 02 03] [04 05 06 07] [08 09 0A 0B] [0C 0D 0E 0F] (x, y, z, w)\n// load into xmm register:\n// [0F 0E 0D 0C] [0B 0A 09 08] [07 06 05 04] [03 02 01 00] (w, z, y, x)\n\n#include \"xenia/cpu/backend/x64/x64_sequences.h\"\n\n#include <algorithm>\n#include <unordered_map>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/clock.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/string.h\"\n#include \"xenia/base/threading.h\"\n#include \"xenia/cpu/backend/x64/x64_emitter.h\"\n#include \"xenia/cpu/backend/x64/x64_op.h\"\n#include \"xenia/cpu/backend/x64/x64_tracers.h\"\n#include \"xenia/cpu/backend/x64/x64_util.h\"\n#include \"xenia/cpu/hir/hir_builder.h\"\n#include \"xenia/cpu/processor.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace backend {\nnamespace x64 {\n\nusing namespace Xbyak;\n\n// TODO(benvanik): direct usings.\nusing namespace xe::cpu;\nusing namespace xe::cpu::hir;\n\nusing xe::cpu::hir::Instr;\n\ntypedef bool (*SequenceSelectFn)(X64Emitter&, const Instr*);\nstd::unordered_map<uint32_t, SequenceSelectFn> sequence_table;\n\n// ============================================================================\n// OPCODE_COMMENT\n// ============================================================================\nstruct COMMENT : Sequence<COMMENT, I<OPCODE_COMMENT, VoidOp, OffsetOp>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    if (IsTracingInstr()) {\n      auto str = reinterpret_cast<const char*>(i.src1.value);\n      // TODO(benvanik): pass through.\n      // TODO(benvanik): don't just leak this memory.\n      auto str_copy = xe_strdup(str);\n      e.mov(e.rdx, reinterpret_cast<uint64_t>(str_copy));\n      e.CallNative(reinterpret_cast<void*>(TraceString));\n    }\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_COMMENT, COMMENT);\n\n// ============================================================================\n// OPCODE_NOP\n// ============================================================================\nstruct NOP : Sequence<NOP, I<OPCODE_NOP, VoidOp>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) { e.nop(); }\n};\nEMITTER_OPCODE_TABLE(OPCODE_NOP, NOP);\n\n// ============================================================================\n// OPCODE_SOURCE_OFFSET\n// ============================================================================\nstruct SOURCE_OFFSET\n    : Sequence<SOURCE_OFFSET, I<OPCODE_SOURCE_OFFSET, VoidOp, OffsetOp>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.MarkSourceOffset(i.instr);\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_SOURCE_OFFSET, SOURCE_OFFSET);\n\n// ============================================================================\n// OPCODE_ASSIGN\n// ============================================================================\nstruct ASSIGN_I8 : Sequence<ASSIGN_I8, I<OPCODE_ASSIGN, I8Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.mov(i.dest, i.src1);\n  }\n};\nstruct ASSIGN_I16 : Sequence<ASSIGN_I16, I<OPCODE_ASSIGN, I16Op, I16Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.mov(i.dest, i.src1);\n  }\n};\nstruct ASSIGN_I32 : Sequence<ASSIGN_I32, I<OPCODE_ASSIGN, I32Op, I32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.mov(i.dest, i.src1);\n  }\n};\nstruct ASSIGN_I64 : Sequence<ASSIGN_I64, I<OPCODE_ASSIGN, I64Op, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.mov(i.dest, i.src1);\n  }\n};\nstruct ASSIGN_F32 : Sequence<ASSIGN_F32, I<OPCODE_ASSIGN, F32Op, F32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.vmovaps(i.dest, i.src1);\n  }\n};\nstruct ASSIGN_F64 : Sequence<ASSIGN_F64, I<OPCODE_ASSIGN, F64Op, F64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.vmovaps(i.dest, i.src1);\n  }\n};\nstruct ASSIGN_V128 : Sequence<ASSIGN_V128, I<OPCODE_ASSIGN, V128Op, V128Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.vmovaps(i.dest, i.src1);\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_ASSIGN, ASSIGN_I8, ASSIGN_I16, ASSIGN_I32,\n                     ASSIGN_I64, ASSIGN_F32, ASSIGN_F64, ASSIGN_V128);\n\n// ============================================================================\n// OPCODE_CAST\n// ============================================================================\nstruct CAST_I32_F32 : Sequence<CAST_I32_F32, I<OPCODE_CAST, I32Op, F32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.vmovd(i.dest, i.src1);\n  }\n};\nstruct CAST_I64_F64 : Sequence<CAST_I64_F64, I<OPCODE_CAST, I64Op, F64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.vmovq(i.dest, i.src1);\n  }\n};\nstruct CAST_F32_I32 : Sequence<CAST_F32_I32, I<OPCODE_CAST, F32Op, I32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.vmovd(i.dest, i.src1);\n  }\n};\nstruct CAST_F64_I64 : Sequence<CAST_F64_I64, I<OPCODE_CAST, F64Op, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.vmovq(i.dest, i.src1);\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_CAST, CAST_I32_F32, CAST_I64_F64, CAST_F32_I32,\n                     CAST_F64_I64);\n\n// ============================================================================\n// OPCODE_ZERO_EXTEND\n// ============================================================================\nstruct ZERO_EXTEND_I16_I8\n    : Sequence<ZERO_EXTEND_I16_I8, I<OPCODE_ZERO_EXTEND, I16Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.movzx(i.dest, i.src1);\n  }\n};\nstruct ZERO_EXTEND_I32_I8\n    : Sequence<ZERO_EXTEND_I32_I8, I<OPCODE_ZERO_EXTEND, I32Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.movzx(i.dest, i.src1);\n  }\n};\nstruct ZERO_EXTEND_I64_I8\n    : Sequence<ZERO_EXTEND_I64_I8, I<OPCODE_ZERO_EXTEND, I64Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.movzx(i.dest, i.src1);\n  }\n};\nstruct ZERO_EXTEND_I32_I16\n    : Sequence<ZERO_EXTEND_I32_I16, I<OPCODE_ZERO_EXTEND, I32Op, I16Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.movzx(i.dest, i.src1);\n  }\n};\nstruct ZERO_EXTEND_I64_I16\n    : Sequence<ZERO_EXTEND_I64_I16, I<OPCODE_ZERO_EXTEND, I64Op, I16Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.movzx(i.dest, i.src1);\n  }\n};\nstruct ZERO_EXTEND_I64_I32\n    : Sequence<ZERO_EXTEND_I64_I32, I<OPCODE_ZERO_EXTEND, I64Op, I32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.mov(i.dest.reg().cvt32(), i.src1);\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_ZERO_EXTEND, ZERO_EXTEND_I16_I8, ZERO_EXTEND_I32_I8,\n                     ZERO_EXTEND_I64_I8, ZERO_EXTEND_I32_I16,\n                     ZERO_EXTEND_I64_I16, ZERO_EXTEND_I64_I32);\n\n// ============================================================================\n// OPCODE_SIGN_EXTEND\n// ============================================================================\nstruct SIGN_EXTEND_I16_I8\n    : Sequence<SIGN_EXTEND_I16_I8, I<OPCODE_SIGN_EXTEND, I16Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.movsx(i.dest, i.src1);\n  }\n};\nstruct SIGN_EXTEND_I32_I8\n    : Sequence<SIGN_EXTEND_I32_I8, I<OPCODE_SIGN_EXTEND, I32Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.movsx(i.dest, i.src1);\n  }\n};\nstruct SIGN_EXTEND_I64_I8\n    : Sequence<SIGN_EXTEND_I64_I8, I<OPCODE_SIGN_EXTEND, I64Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.movsx(i.dest, i.src1);\n  }\n};\nstruct SIGN_EXTEND_I32_I16\n    : Sequence<SIGN_EXTEND_I32_I16, I<OPCODE_SIGN_EXTEND, I32Op, I16Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.movsx(i.dest, i.src1);\n  }\n};\nstruct SIGN_EXTEND_I64_I16\n    : Sequence<SIGN_EXTEND_I64_I16, I<OPCODE_SIGN_EXTEND, I64Op, I16Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.movsx(i.dest, i.src1);\n  }\n};\nstruct SIGN_EXTEND_I64_I32\n    : Sequence<SIGN_EXTEND_I64_I32, I<OPCODE_SIGN_EXTEND, I64Op, I32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.movsxd(i.dest, i.src1);\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_SIGN_EXTEND, SIGN_EXTEND_I16_I8, SIGN_EXTEND_I32_I8,\n                     SIGN_EXTEND_I64_I8, SIGN_EXTEND_I32_I16,\n                     SIGN_EXTEND_I64_I16, SIGN_EXTEND_I64_I32);\n\n// ============================================================================\n// OPCODE_TRUNCATE\n// ============================================================================\nstruct TRUNCATE_I8_I16\n    : Sequence<TRUNCATE_I8_I16, I<OPCODE_TRUNCATE, I8Op, I16Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.movzx(i.dest.reg().cvt32(), i.src1.reg().cvt8());\n  }\n};\nstruct TRUNCATE_I8_I32\n    : Sequence<TRUNCATE_I8_I32, I<OPCODE_TRUNCATE, I8Op, I32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.movzx(i.dest.reg().cvt32(), i.src1.reg().cvt8());\n  }\n};\nstruct TRUNCATE_I8_I64\n    : Sequence<TRUNCATE_I8_I64, I<OPCODE_TRUNCATE, I8Op, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.movzx(i.dest.reg().cvt32(), i.src1.reg().cvt8());\n  }\n};\nstruct TRUNCATE_I16_I32\n    : Sequence<TRUNCATE_I16_I32, I<OPCODE_TRUNCATE, I16Op, I32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.movzx(i.dest.reg().cvt32(), i.src1.reg().cvt16());\n  }\n};\nstruct TRUNCATE_I16_I64\n    : Sequence<TRUNCATE_I16_I64, I<OPCODE_TRUNCATE, I16Op, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.movzx(i.dest.reg().cvt32(), i.src1.reg().cvt16());\n  }\n};\nstruct TRUNCATE_I32_I64\n    : Sequence<TRUNCATE_I32_I64, I<OPCODE_TRUNCATE, I32Op, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.mov(i.dest, i.src1.reg().cvt32());\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_TRUNCATE, TRUNCATE_I8_I16, TRUNCATE_I8_I32,\n                     TRUNCATE_I8_I64, TRUNCATE_I16_I32, TRUNCATE_I16_I64,\n                     TRUNCATE_I32_I64);\n\n// ============================================================================\n// OPCODE_CONVERT\n// ============================================================================\nstruct CONVERT_I32_F32\n    : Sequence<CONVERT_I32_F32, I<OPCODE_CONVERT, I32Op, F32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    // TODO(benvanik): saturation check? cvtt* (trunc?)\n    if (i.instr->flags == ROUND_TO_ZERO) {\n      e.vcvttss2si(i.dest, i.src1);\n    } else {\n      e.vcvtss2si(i.dest, i.src1);\n    }\n  }\n};\nstruct CONVERT_I32_F64\n    : Sequence<CONVERT_I32_F64, I<OPCODE_CONVERT, I32Op, F64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    // Intel returns 0x80000000 if the double value does not fit within an int32\n    // PPC saturates the value instead.\n    // So, we can clamp the double value to (double)0x7FFFFFFF.\n    e.vminsd(e.xmm0, i.src1, e.GetXmmConstPtr(XMMIntMaxPD));\n    if (i.instr->flags == ROUND_TO_ZERO) {\n      e.vcvttsd2si(i.dest, e.xmm0);\n    } else {\n      e.vcvtsd2si(i.dest, e.xmm0);\n    }\n  }\n};\nstruct CONVERT_I64_F64\n    : Sequence<CONVERT_I64_F64, I<OPCODE_CONVERT, I64Op, F64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    // Copy src1.\n    e.movq(e.rcx, i.src1);\n\n    // TODO(benvanik): saturation check? cvtt* (trunc?)\n    if (i.instr->flags == ROUND_TO_ZERO) {\n      e.vcvttsd2si(i.dest, i.src1);\n    } else {\n      e.vcvtsd2si(i.dest, i.src1);\n    }\n\n    // 0x8000000000000000\n    e.mov(e.rax, 0x1);\n    e.shl(e.rax, 63);\n\n    // Saturate positive overflow\n    // TODO(DrChat): Find a shorter equivalent sequence.\n    // if (result ind. && src1 >= 0)\n    //   result = 0x7FFFFFFFFFFFFFFF;\n    e.cmp(e.rax, i.dest);\n    e.sete(e.al);\n    e.movzx(e.rax, e.al);\n    e.shr(e.rcx, 63);\n    e.xor_(e.rcx, 0x01);\n    e.and_(e.rax, e.rcx);\n\n    e.sub(i.dest, e.rax);\n  }\n};\nstruct CONVERT_F32_I32\n    : Sequence<CONVERT_F32_I32, I<OPCODE_CONVERT, F32Op, I32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    // TODO(benvanik): saturation check? cvtt* (trunc?)\n    e.vcvtsi2ss(i.dest, i.src1);\n  }\n};\nstruct CONVERT_F32_F64\n    : Sequence<CONVERT_F32_F64, I<OPCODE_CONVERT, F32Op, F64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    // TODO(benvanik): saturation check? cvtt* (trunc?)\n    e.vcvtsd2ss(i.dest, i.src1);\n  }\n};\nstruct CONVERT_F64_I64\n    : Sequence<CONVERT_F64_I64, I<OPCODE_CONVERT, F64Op, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    // TODO(benvanik): saturation check? cvtt* (trunc?)\n    e.vcvtsi2sd(i.dest, i.src1);\n  }\n};\nstruct CONVERT_F64_F32\n    : Sequence<CONVERT_F64_F32, I<OPCODE_CONVERT, F64Op, F32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.vcvtss2sd(i.dest, i.src1);\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_CONVERT, CONVERT_I32_F32, CONVERT_I32_F64,\n                     CONVERT_I64_F64, CONVERT_F32_I32, CONVERT_F32_F64,\n                     CONVERT_F64_I64, CONVERT_F64_F32);\n\n// ============================================================================\n// OPCODE_ROUND\n// ============================================================================\nstruct ROUND_F32 : Sequence<ROUND_F32, I<OPCODE_ROUND, F32Op, F32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    switch (i.instr->flags) {\n      case ROUND_TO_ZERO:\n        e.vroundss(i.dest, i.src1, 0b00000011);\n        break;\n      case ROUND_TO_NEAREST:\n        e.vroundss(i.dest, i.src1, 0b00000000);\n        break;\n      case ROUND_TO_MINUS_INFINITY:\n        e.vroundss(i.dest, i.src1, 0b00000001);\n        break;\n      case ROUND_TO_POSITIVE_INFINITY:\n        e.vroundss(i.dest, i.src1, 0b00000010);\n        break;\n    }\n  }\n};\nstruct ROUND_F64 : Sequence<ROUND_F64, I<OPCODE_ROUND, F64Op, F64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    switch (i.instr->flags) {\n      case ROUND_TO_ZERO:\n        e.vroundsd(i.dest, i.src1, 0b00000011);\n        break;\n      case ROUND_TO_NEAREST:\n        e.vroundsd(i.dest, i.src1, 0b00000000);\n        break;\n      case ROUND_TO_MINUS_INFINITY:\n        e.vroundsd(i.dest, i.src1, 0b00000001);\n        break;\n      case ROUND_TO_POSITIVE_INFINITY:\n        e.vroundsd(i.dest, i.src1, 0b00000010);\n        break;\n    }\n  }\n};\nstruct ROUND_V128 : Sequence<ROUND_V128, I<OPCODE_ROUND, V128Op, V128Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    switch (i.instr->flags) {\n      case ROUND_TO_ZERO:\n        e.vroundps(i.dest, i.src1, 0b00000011);\n        break;\n      case ROUND_TO_NEAREST:\n        e.vroundps(i.dest, i.src1, 0b00000000);\n        break;\n      case ROUND_TO_MINUS_INFINITY:\n        e.vroundps(i.dest, i.src1, 0b00000001);\n        break;\n      case ROUND_TO_POSITIVE_INFINITY:\n        e.vroundps(i.dest, i.src1, 0b00000010);\n        break;\n    }\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_ROUND, ROUND_F32, ROUND_F64, ROUND_V128);\n\n// ============================================================================\n// OPCODE_LOAD_CLOCK\n// ============================================================================\nstruct LOAD_CLOCK : Sequence<LOAD_CLOCK, I<OPCODE_LOAD_CLOCK, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    // When scaling is disabled and the raw clock source is selected, the code\n    // in the Clock class is actually just forwarding tick counts after one\n    // simple multiply and division. In that case we rather bake the scaling in\n    // here to cut extra function calls with CPU cache misses and stack frame\n    // overhead.\n    if (cvars::clock_no_scaling && cvars::clock_source_raw) {\n      auto ratio = Clock::guest_tick_ratio();\n      // The 360 CPU is an in-order CPU, AMD64 usually isn't. Without\n      // mfence/lfence magic the rdtsc instruction can be executed sooner or\n      // later in the cache window. Since it's resolution however is much higher\n      // than the 360's mftb instruction this can safely be ignored.\n\n      // Read time stamp in edx (high part) and eax (low part).\n      e.rdtsc();\n      // Make it a 64 bit number in rax.\n      e.shl(e.rdx, 32);\n      e.or_(e.rax, e.rdx);\n      // Apply tick frequency scaling.\n      e.mov(e.rcx, ratio.first);\n      e.mul(e.rcx);\n      // We actually now have a 128 bit number in rdx:rax.\n      e.mov(e.rcx, ratio.second);\n      e.div(e.rcx);\n      e.mov(i.dest, e.rax);\n    } else {\n      e.CallNative(LoadClock);\n      e.mov(i.dest, e.rax);\n    }\n  }\n  static uint64_t LoadClock(void* raw_context) {\n    return Clock::QueryGuestTickCount();\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_LOAD_CLOCK, LOAD_CLOCK);\n\n// ============================================================================\n// OPCODE_CONTEXT_BARRIER\n// ============================================================================\nstruct CONTEXT_BARRIER\n    : Sequence<CONTEXT_BARRIER, I<OPCODE_CONTEXT_BARRIER, VoidOp>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {}\n};\nEMITTER_OPCODE_TABLE(OPCODE_CONTEXT_BARRIER, CONTEXT_BARRIER);\n\n// ============================================================================\n// OPCODE_MAX\n// ============================================================================\nstruct MAX_F32 : Sequence<MAX_F32, I<OPCODE_MAX, F32Op, F32Op, F32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitCommutativeBinaryXmmOp(e, i,\n                               [](X64Emitter& e, Xmm dest, Xmm src1, Xmm src2) {\n                                 e.vmaxss(dest, src1, src2);\n                               });\n  }\n};\nstruct MAX_F64 : Sequence<MAX_F64, I<OPCODE_MAX, F64Op, F64Op, F64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitCommutativeBinaryXmmOp(e, i,\n                               [](X64Emitter& e, Xmm dest, Xmm src1, Xmm src2) {\n                                 e.vmaxsd(dest, src1, src2);\n                               });\n  }\n};\nstruct MAX_V128 : Sequence<MAX_V128, I<OPCODE_MAX, V128Op, V128Op, V128Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitCommutativeBinaryXmmOp(e, i,\n                               [](X64Emitter& e, Xmm dest, Xmm src1, Xmm src2) {\n                                 e.vmaxps(dest, src1, src2);\n                               });\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_MAX, MAX_F32, MAX_F64, MAX_V128);\n\n// ============================================================================\n// OPCODE_MIN\n// ============================================================================\nstruct MIN_I8 : Sequence<MIN_I8, I<OPCODE_MIN, I8Op, I8Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitCommutativeBinaryOp(\n        e, i,\n        [](X64Emitter& e, const Reg8& dest_src, const Reg8& src) {\n          e.cmp(dest_src, src);\n          e.cmovg(dest_src.cvt32(), src.cvt32());\n        },\n        [](X64Emitter& e, const Reg8& dest_src, int32_t constant) {\n          e.mov(e.al, constant);\n          e.cmp(dest_src, e.al);\n          e.cmovg(dest_src.cvt32(), e.eax);\n        });\n  }\n};\nstruct MIN_I16 : Sequence<MIN_I16, I<OPCODE_MIN, I16Op, I16Op, I16Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitCommutativeBinaryOp(\n        e, i,\n        [](X64Emitter& e, const Reg16& dest_src, const Reg16& src) {\n          e.cmp(dest_src, src);\n          e.cmovg(dest_src.cvt32(), src.cvt32());\n        },\n        [](X64Emitter& e, const Reg16& dest_src, int32_t constant) {\n          e.mov(e.ax, constant);\n          e.cmp(dest_src, e.ax);\n          e.cmovg(dest_src.cvt32(), e.eax);\n        });\n  }\n};\nstruct MIN_I32 : Sequence<MIN_I32, I<OPCODE_MIN, I32Op, I32Op, I32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitCommutativeBinaryOp(\n        e, i,\n        [](X64Emitter& e, const Reg32& dest_src, const Reg32& src) {\n          e.cmp(dest_src, src);\n          e.cmovg(dest_src, src);\n        },\n        [](X64Emitter& e, const Reg32& dest_src, int32_t constant) {\n          e.mov(e.eax, constant);\n          e.cmp(dest_src, e.eax);\n          e.cmovg(dest_src, e.eax);\n        });\n  }\n};\nstruct MIN_I64 : Sequence<MIN_I64, I<OPCODE_MIN, I64Op, I64Op, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitCommutativeBinaryOp(\n        e, i,\n        [](X64Emitter& e, const Reg64& dest_src, const Reg64& src) {\n          e.cmp(dest_src, src);\n          e.cmovg(dest_src, src);\n        },\n        [](X64Emitter& e, const Reg64& dest_src, int64_t constant) {\n          e.mov(e.rax, constant);\n          e.cmp(dest_src, e.rax);\n          e.cmovg(dest_src, e.rax);\n        });\n  }\n};\nstruct MIN_F32 : Sequence<MIN_F32, I<OPCODE_MIN, F32Op, F32Op, F32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitCommutativeBinaryXmmOp(e, i,\n                               [](X64Emitter& e, Xmm dest, Xmm src1, Xmm src2) {\n                                 e.vminss(dest, src1, src2);\n                               });\n  }\n};\nstruct MIN_F64 : Sequence<MIN_F64, I<OPCODE_MIN, F64Op, F64Op, F64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitCommutativeBinaryXmmOp(e, i,\n                               [](X64Emitter& e, Xmm dest, Xmm src1, Xmm src2) {\n                                 e.vminsd(dest, src1, src2);\n                               });\n  }\n};\nstruct MIN_V128 : Sequence<MIN_V128, I<OPCODE_MIN, V128Op, V128Op, V128Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitCommutativeBinaryXmmOp(e, i,\n                               [](X64Emitter& e, Xmm dest, Xmm src1, Xmm src2) {\n                                 e.vminps(dest, src1, src2);\n                               });\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_MIN, MIN_I8, MIN_I16, MIN_I32, MIN_I64, MIN_F32,\n                     MIN_F64, MIN_V128);\n\n// ============================================================================\n// OPCODE_SELECT\n// ============================================================================\n// dest = src1 ? src2 : src3\n// TODO(benvanik): match compare + select sequences, as often it's something\n//     like SELECT(VECTOR_COMPARE_SGE(a, b), a, b)\nstruct SELECT_I8\n    : Sequence<SELECT_I8, I<OPCODE_SELECT, I8Op, I8Op, I8Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    Reg8 src2;\n    if (i.src2.is_constant) {\n      src2 = e.al;\n      e.mov(src2, i.src2.constant());\n    } else {\n      src2 = i.src2;\n    }\n    e.test(i.src1, i.src1);\n    e.cmovnz(i.dest.reg().cvt32(), src2.cvt32());\n    e.cmovz(i.dest.reg().cvt32(), i.src3.reg().cvt32());\n  }\n};\nstruct SELECT_I16\n    : Sequence<SELECT_I16, I<OPCODE_SELECT, I16Op, I8Op, I16Op, I16Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    Reg16 src2;\n    if (i.src2.is_constant) {\n      src2 = e.ax;\n      e.mov(src2, i.src2.constant());\n    } else {\n      src2 = i.src2;\n    }\n    e.test(i.src1, i.src1);\n    e.cmovnz(i.dest.reg().cvt32(), src2.cvt32());\n    e.cmovz(i.dest.reg().cvt32(), i.src3.reg().cvt32());\n  }\n};\nstruct SELECT_I32\n    : Sequence<SELECT_I32, I<OPCODE_SELECT, I32Op, I8Op, I32Op, I32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    Reg32 src2;\n    if (i.src2.is_constant) {\n      src2 = e.eax;\n      e.mov(src2, i.src2.constant());\n    } else {\n      src2 = i.src2;\n    }\n    e.test(i.src1, i.src1);\n    e.cmovnz(i.dest, src2);\n    e.cmovz(i.dest, i.src3);\n  }\n};\nstruct SELECT_I64\n    : Sequence<SELECT_I64, I<OPCODE_SELECT, I64Op, I8Op, I64Op, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    Reg64 src2;\n    if (i.src2.is_constant) {\n      src2 = e.rax;\n      e.mov(src2, i.src2.constant());\n    } else {\n      src2 = i.src2;\n    }\n    e.test(i.src1, i.src1);\n    e.cmovnz(i.dest, src2);\n    e.cmovz(i.dest, i.src3);\n  }\n};\nstruct SELECT_F32\n    : Sequence<SELECT_F32, I<OPCODE_SELECT, F32Op, I8Op, F32Op, F32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    // TODO(benvanik): find a shorter sequence.\n    // dest = src1 != 0 ? src2 : src3\n    e.movzx(e.eax, i.src1);\n    e.vmovd(e.xmm1, e.eax);\n    e.vxorps(e.xmm0, e.xmm0);\n    e.vpcmpeqd(e.xmm0, e.xmm1);\n\n    Xmm src2 = i.src2.is_constant ? e.xmm2 : i.src2;\n    if (i.src2.is_constant) {\n      e.LoadConstantXmm(src2, i.src2.constant());\n    }\n    e.vpandn(e.xmm1, e.xmm0, src2);\n\n    Xmm src3 = i.src3.is_constant ? e.xmm2 : i.src3;\n    if (i.src3.is_constant) {\n      e.LoadConstantXmm(src3, i.src3.constant());\n    }\n    e.vpand(i.dest, e.xmm0, src3);\n    e.vpor(i.dest, e.xmm1);\n  }\n};\nstruct SELECT_F64\n    : Sequence<SELECT_F64, I<OPCODE_SELECT, F64Op, I8Op, F64Op, F64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    // dest = src1 != 0 ? src2 : src3\n\n    if (e.IsFeatureEnabled(kX64EmitAVX512Ortho)) {\n      e.movzx(e.rax, i.src1);\n      e.vmovq(e.xmm0, e.rax);\n      e.vptestmq(e.k1, e.xmm0, e.xmm0);\n\n      const Xmm src2 = i.src2.is_constant ? e.xmm1 : i.src2;\n      if (i.src2.is_constant) {\n        e.LoadConstantXmm(src2, i.src2.constant());\n      }\n\n      const Xmm src3 = i.src3.is_constant ? e.xmm2 : i.src3;\n      if (i.src3.is_constant) {\n        e.LoadConstantXmm(src3, i.src3.constant());\n      }\n\n      e.vpblendmq(i.dest.reg() | e.k1, src3, src2);\n      return;\n    }\n\n    e.movzx(e.eax, i.src1);\n    e.vmovd(e.xmm1, e.eax);\n    e.vpxor(e.xmm0, e.xmm0);\n    e.vpcmpeqq(e.xmm0, e.xmm1);\n\n    Xmm src2 = i.src2.is_constant ? e.xmm2 : i.src2;\n    if (i.src2.is_constant) {\n      e.LoadConstantXmm(src2, i.src2.constant());\n    }\n    e.vpandn(e.xmm1, e.xmm0, src2);\n\n    Xmm src3 = i.src3.is_constant ? e.xmm2 : i.src3;\n    if (i.src3.is_constant) {\n      e.LoadConstantXmm(src3, i.src3.constant());\n    }\n    e.vpand(i.dest, e.xmm0, src3);\n    e.vpor(i.dest, e.xmm1);\n  }\n};\nstruct SELECT_V128_I8\n    : Sequence<SELECT_V128_I8, I<OPCODE_SELECT, V128Op, I8Op, V128Op, V128Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    // TODO(benvanik): find a shorter sequence.\n    // dest = src1 != 0 ? src2 : src3\n    e.movzx(e.eax, i.src1);\n    e.vmovd(e.xmm1, e.eax);\n    e.vpbroadcastd(e.xmm1, e.xmm1);\n    e.vxorps(e.xmm0, e.xmm0);\n    e.vpcmpeqd(e.xmm0, e.xmm1);\n\n    Xmm src2 = i.src2.is_constant ? e.xmm2 : i.src2;\n    if (i.src2.is_constant) {\n      e.LoadConstantXmm(src2, i.src2.constant());\n    }\n    e.vpandn(e.xmm1, e.xmm0, src2);\n\n    Xmm src3 = i.src3.is_constant ? e.xmm2 : i.src3;\n    if (i.src3.is_constant) {\n      e.LoadConstantXmm(src3, i.src3.constant());\n    }\n    e.vpand(i.dest, e.xmm0, src3);\n    e.vpor(i.dest, e.xmm1);\n  }\n};\nstruct SELECT_V128_V128\n    : Sequence<SELECT_V128_V128,\n               I<OPCODE_SELECT, V128Op, V128Op, V128Op, V128Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    const Xmm src1 = i.src1.is_constant ? e.xmm0 : i.src1;\n    if (i.src1.is_constant) {\n      e.LoadConstantXmm(src1, i.src1.constant());\n    }\n\n    const Xmm src2 = i.src2.is_constant ? e.xmm1 : i.src2;\n    if (i.src2.is_constant) {\n      e.LoadConstantXmm(src2, i.src2.constant());\n    }\n\n    const Xmm src3 = i.src3.is_constant ? e.xmm2 : i.src3;\n    if (i.src3.is_constant) {\n      e.LoadConstantXmm(src3, i.src3.constant());\n    }\n\n    if (e.IsFeatureEnabled(kX64EmitAVX512Ortho)) {\n      e.vmovdqa(e.xmm3, src1);\n      e.vpternlogd(e.xmm3, src2, src3,\n                   (~TernaryOperand::a & TernaryOperand::b) |\n                       (TernaryOperand::c & TernaryOperand::a));\n      e.vmovdqa(i.dest, e.xmm3);\n      return;\n    }\n\n    // src1 ? src2 : src3;\n    e.vpandn(e.xmm3, src1, src2);\n    e.vpand(i.dest, src1, src3);\n    e.vpor(i.dest, i.dest, e.xmm3);\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_SELECT, SELECT_I8, SELECT_I16, SELECT_I32,\n                     SELECT_I64, SELECT_F32, SELECT_F64, SELECT_V128_I8,\n                     SELECT_V128_V128);\n\n// ============================================================================\n// OPCODE_IS_TRUE\n// ============================================================================\nstruct IS_TRUE_I8 : Sequence<IS_TRUE_I8, I<OPCODE_IS_TRUE, I8Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.test(i.src1, i.src1);\n    e.setnz(i.dest);\n  }\n};\nstruct IS_TRUE_I16 : Sequence<IS_TRUE_I16, I<OPCODE_IS_TRUE, I8Op, I16Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.test(i.src1, i.src1);\n    e.setnz(i.dest);\n  }\n};\nstruct IS_TRUE_I32 : Sequence<IS_TRUE_I32, I<OPCODE_IS_TRUE, I8Op, I32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.test(i.src1, i.src1);\n    e.setnz(i.dest);\n  }\n};\nstruct IS_TRUE_I64 : Sequence<IS_TRUE_I64, I<OPCODE_IS_TRUE, I8Op, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.test(i.src1, i.src1);\n    e.setnz(i.dest);\n  }\n};\nstruct IS_TRUE_F32 : Sequence<IS_TRUE_F32, I<OPCODE_IS_TRUE, I8Op, F32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.vptest(i.src1, i.src1);\n    e.setnz(i.dest);\n  }\n};\nstruct IS_TRUE_F64 : Sequence<IS_TRUE_F64, I<OPCODE_IS_TRUE, I8Op, F64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.vptest(i.src1, i.src1);\n    e.setnz(i.dest);\n  }\n};\nstruct IS_TRUE_V128 : Sequence<IS_TRUE_V128, I<OPCODE_IS_TRUE, I8Op, V128Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.vptest(i.src1, i.src1);\n    e.setnz(i.dest);\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_IS_TRUE, IS_TRUE_I8, IS_TRUE_I16, IS_TRUE_I32,\n                     IS_TRUE_I64, IS_TRUE_F32, IS_TRUE_F64, IS_TRUE_V128);\n\n// ============================================================================\n// OPCODE_IS_FALSE\n// ============================================================================\nstruct IS_FALSE_I8 : Sequence<IS_FALSE_I8, I<OPCODE_IS_FALSE, I8Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.test(i.src1, i.src1);\n    e.setz(i.dest);\n  }\n};\nstruct IS_FALSE_I16 : Sequence<IS_FALSE_I16, I<OPCODE_IS_FALSE, I8Op, I16Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.test(i.src1, i.src1);\n    e.setz(i.dest);\n  }\n};\nstruct IS_FALSE_I32 : Sequence<IS_FALSE_I32, I<OPCODE_IS_FALSE, I8Op, I32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.test(i.src1, i.src1);\n    e.setz(i.dest);\n  }\n};\nstruct IS_FALSE_I64 : Sequence<IS_FALSE_I64, I<OPCODE_IS_FALSE, I8Op, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.test(i.src1, i.src1);\n    e.setz(i.dest);\n  }\n};\nstruct IS_FALSE_F32 : Sequence<IS_FALSE_F32, I<OPCODE_IS_FALSE, I8Op, F32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.vptest(i.src1, i.src1);\n    e.setz(i.dest);\n  }\n};\nstruct IS_FALSE_F64 : Sequence<IS_FALSE_F64, I<OPCODE_IS_FALSE, I8Op, F64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.vptest(i.src1, i.src1);\n    e.setz(i.dest);\n  }\n};\nstruct IS_FALSE_V128\n    : Sequence<IS_FALSE_V128, I<OPCODE_IS_FALSE, I8Op, V128Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.vptest(i.src1, i.src1);\n    e.setz(i.dest);\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_IS_FALSE, IS_FALSE_I8, IS_FALSE_I16, IS_FALSE_I32,\n                     IS_FALSE_I64, IS_FALSE_F32, IS_FALSE_F64, IS_FALSE_V128);\n\n// ============================================================================\n// OPCODE_IS_NAN\n// ============================================================================\nstruct IS_NAN_F32 : Sequence<IS_NAN_F32, I<OPCODE_IS_NAN, I8Op, F32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.vucomiss(i.src1, i.src1);\n    e.setp(i.dest);\n  }\n};\n\nstruct IS_NAN_F64 : Sequence<IS_NAN_F64, I<OPCODE_IS_NAN, I8Op, F64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.vucomisd(i.src1, i.src1);\n    e.setp(i.dest);\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_IS_NAN, IS_NAN_F32, IS_NAN_F64);\n\n// ============================================================================\n// OPCODE_COMPARE_EQ\n// ============================================================================\nstruct COMPARE_EQ_I8\n    : Sequence<COMPARE_EQ_I8, I<OPCODE_COMPARE_EQ, I8Op, I8Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitCommutativeCompareOp(\n        e, i,\n        [](X64Emitter& e, const Reg8& src1, const Reg8& src2) {\n          e.cmp(src1, src2);\n        },\n        [](X64Emitter& e, const Reg8& src1, int32_t constant) {\n          e.cmp(src1, constant);\n        });\n    e.sete(i.dest);\n  }\n};\nstruct COMPARE_EQ_I16\n    : Sequence<COMPARE_EQ_I16, I<OPCODE_COMPARE_EQ, I8Op, I16Op, I16Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitCommutativeCompareOp(\n        e, i,\n        [](X64Emitter& e, const Reg16& src1, const Reg16& src2) {\n          e.cmp(src1, src2);\n        },\n        [](X64Emitter& e, const Reg16& src1, int32_t constant) {\n          e.cmp(src1, constant);\n        });\n    e.sete(i.dest);\n  }\n};\nstruct COMPARE_EQ_I32\n    : Sequence<COMPARE_EQ_I32, I<OPCODE_COMPARE_EQ, I8Op, I32Op, I32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitCommutativeCompareOp(\n        e, i,\n        [](X64Emitter& e, const Reg32& src1, const Reg32& src2) {\n          e.cmp(src1, src2);\n        },\n        [](X64Emitter& e, const Reg32& src1, int32_t constant) {\n          e.cmp(src1, constant);\n        });\n    e.sete(i.dest);\n  }\n};\nstruct COMPARE_EQ_I64\n    : Sequence<COMPARE_EQ_I64, I<OPCODE_COMPARE_EQ, I8Op, I64Op, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitCommutativeCompareOp(\n        e, i,\n        [](X64Emitter& e, const Reg64& src1, const Reg64& src2) {\n          e.cmp(src1, src2);\n        },\n        [](X64Emitter& e, const Reg64& src1, int32_t constant) {\n          e.cmp(src1, constant);\n        });\n    e.sete(i.dest);\n  }\n};\nstruct COMPARE_EQ_F32\n    : Sequence<COMPARE_EQ_F32, I<OPCODE_COMPARE_EQ, I8Op, F32Op, F32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitCommutativeBinaryXmmOp(\n        e, i, [&i](X64Emitter& e, I8Op dest, const Xmm& src1, const Xmm& src2) {\n          e.vcomiss(src1, src2);\n        });\n    e.sete(i.dest);\n  }\n};\nstruct COMPARE_EQ_F64\n    : Sequence<COMPARE_EQ_F64, I<OPCODE_COMPARE_EQ, I8Op, F64Op, F64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitCommutativeBinaryXmmOp(\n        e, i, [&i](X64Emitter& e, I8Op dest, const Xmm& src1, const Xmm& src2) {\n          e.vcomisd(src1, src2);\n        });\n    e.sete(i.dest);\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_COMPARE_EQ, COMPARE_EQ_I8, COMPARE_EQ_I16,\n                     COMPARE_EQ_I32, COMPARE_EQ_I64, COMPARE_EQ_F32,\n                     COMPARE_EQ_F64);\n\n// ============================================================================\n// OPCODE_COMPARE_NE\n// ============================================================================\nstruct COMPARE_NE_I8\n    : Sequence<COMPARE_NE_I8, I<OPCODE_COMPARE_NE, I8Op, I8Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitCommutativeCompareOp(\n        e, i,\n        [](X64Emitter& e, const Reg8& src1, const Reg8& src2) {\n          e.cmp(src1, src2);\n        },\n        [](X64Emitter& e, const Reg8& src1, int32_t constant) {\n          e.cmp(src1, constant);\n        });\n    e.setne(i.dest);\n  }\n};\nstruct COMPARE_NE_I16\n    : Sequence<COMPARE_NE_I16, I<OPCODE_COMPARE_NE, I8Op, I16Op, I16Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitCommutativeCompareOp(\n        e, i,\n        [](X64Emitter& e, const Reg16& src1, const Reg16& src2) {\n          e.cmp(src1, src2);\n        },\n        [](X64Emitter& e, const Reg16& src1, int32_t constant) {\n          e.cmp(src1, constant);\n        });\n    e.setne(i.dest);\n  }\n};\nstruct COMPARE_NE_I32\n    : Sequence<COMPARE_NE_I32, I<OPCODE_COMPARE_NE, I8Op, I32Op, I32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitCommutativeCompareOp(\n        e, i,\n        [](X64Emitter& e, const Reg32& src1, const Reg32& src2) {\n          e.cmp(src1, src2);\n        },\n        [](X64Emitter& e, const Reg32& src1, int32_t constant) {\n          e.cmp(src1, constant);\n        });\n    e.setne(i.dest);\n  }\n};\nstruct COMPARE_NE_I64\n    : Sequence<COMPARE_NE_I64, I<OPCODE_COMPARE_NE, I8Op, I64Op, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitCommutativeCompareOp(\n        e, i,\n        [](X64Emitter& e, const Reg64& src1, const Reg64& src2) {\n          e.cmp(src1, src2);\n        },\n        [](X64Emitter& e, const Reg64& src1, int32_t constant) {\n          e.cmp(src1, constant);\n        });\n    e.setne(i.dest);\n  }\n};\nstruct COMPARE_NE_F32\n    : Sequence<COMPARE_NE_F32, I<OPCODE_COMPARE_NE, I8Op, F32Op, F32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.vcomiss(i.src1, i.src2);\n    e.setne(i.dest);\n  }\n};\nstruct COMPARE_NE_F64\n    : Sequence<COMPARE_NE_F64, I<OPCODE_COMPARE_NE, I8Op, F64Op, F64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.vcomisd(i.src1, i.src2);\n    e.setne(i.dest);\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_COMPARE_NE, COMPARE_NE_I8, COMPARE_NE_I16,\n                     COMPARE_NE_I32, COMPARE_NE_I64, COMPARE_NE_F32,\n                     COMPARE_NE_F64);\n\n// ============================================================================\n// OPCODE_COMPARE_*\n// ============================================================================\n#define EMITTER_ASSOCIATIVE_COMPARE_INT(op, instr, inverse_instr, type, \\\n                                        reg_type)                       \\\n  struct COMPARE_##op##_##type                                          \\\n      : Sequence<COMPARE_##op##_##type,                                 \\\n                 I<OPCODE_COMPARE_##op, I8Op, type, type>> {            \\\n    static void Emit(X64Emitter& e, const EmitArgType& i) {             \\\n      EmitAssociativeCompareOp(                                         \\\n          e, i,                                                         \\\n          [](X64Emitter& e, const Reg8& dest, const reg_type& src1,     \\\n             const reg_type& src2, bool inverse) {                      \\\n            e.cmp(src1, src2);                                          \\\n            if (!inverse) {                                             \\\n              e.instr(dest);                                            \\\n            } else {                                                    \\\n              e.inverse_instr(dest);                                    \\\n            }                                                           \\\n          },                                                            \\\n          [](X64Emitter& e, const Reg8& dest, const reg_type& src1,     \\\n             int32_t constant, bool inverse) {                          \\\n            e.cmp(src1, constant);                                      \\\n            if (!inverse) {                                             \\\n              e.instr(dest);                                            \\\n            } else {                                                    \\\n              e.inverse_instr(dest);                                    \\\n            }                                                           \\\n          });                                                           \\\n    }                                                                   \\\n  };\n#define EMITTER_ASSOCIATIVE_COMPARE_XX(op, instr, inverse_instr)           \\\n  EMITTER_ASSOCIATIVE_COMPARE_INT(op, instr, inverse_instr, I8Op, Reg8);   \\\n  EMITTER_ASSOCIATIVE_COMPARE_INT(op, instr, inverse_instr, I16Op, Reg16); \\\n  EMITTER_ASSOCIATIVE_COMPARE_INT(op, instr, inverse_instr, I32Op, Reg32); \\\n  EMITTER_ASSOCIATIVE_COMPARE_INT(op, instr, inverse_instr, I64Op, Reg64); \\\n  EMITTER_OPCODE_TABLE(OPCODE_COMPARE_##op, COMPARE_##op##_I8Op,           \\\n                       COMPARE_##op##_I16Op, COMPARE_##op##_I32Op,         \\\n                       COMPARE_##op##_I64Op);\nEMITTER_ASSOCIATIVE_COMPARE_XX(SLT, setl, setg);\nEMITTER_ASSOCIATIVE_COMPARE_XX(SLE, setle, setge);\nEMITTER_ASSOCIATIVE_COMPARE_XX(SGT, setg, setl);\nEMITTER_ASSOCIATIVE_COMPARE_XX(SGE, setge, setle);\nEMITTER_ASSOCIATIVE_COMPARE_XX(ULT, setb, seta);\nEMITTER_ASSOCIATIVE_COMPARE_XX(ULE, setbe, setae);\nEMITTER_ASSOCIATIVE_COMPARE_XX(UGT, seta, setb);\nEMITTER_ASSOCIATIVE_COMPARE_XX(UGE, setae, setbe);\n\n// https://web.archive.org/web/20171129015931/https://x86.renejeschke.de/html/file_module_x86_id_288.html\n// Original link: https://x86.renejeschke.de/html/file_module_x86_id_288.html\n#define EMITTER_ASSOCIATIVE_COMPARE_FLT_XX(op, instr)                 \\\n  struct COMPARE_##op##_F32                                           \\\n      : Sequence<COMPARE_##op##_F32,                                  \\\n                 I<OPCODE_COMPARE_##op, I8Op, F32Op, F32Op>> {        \\\n    static void Emit(X64Emitter& e, const EmitArgType& i) {           \\\n      e.vcomiss(i.src1, i.src2);                                      \\\n      e.instr(i.dest);                                                \\\n    }                                                                 \\\n  };                                                                  \\\n  struct COMPARE_##op##_F64                                           \\\n      : Sequence<COMPARE_##op##_F64,                                  \\\n                 I<OPCODE_COMPARE_##op, I8Op, F64Op, F64Op>> {        \\\n    static void Emit(X64Emitter& e, const EmitArgType& i) {           \\\n      if (i.src1.is_constant) {                                       \\\n        e.LoadConstantXmm(e.xmm0, i.src1.constant());                 \\\n        e.vcomisd(e.xmm0, i.src2);                                    \\\n      } else if (i.src2.is_constant) {                                \\\n        e.LoadConstantXmm(e.xmm0, i.src2.constant());                 \\\n        e.vcomisd(i.src1, e.xmm0);                                    \\\n      } else {                                                        \\\n        e.vcomisd(i.src1, i.src2);                                    \\\n      }                                                               \\\n      e.instr(i.dest);                                                \\\n    }                                                                 \\\n  };                                                                  \\\n  EMITTER_OPCODE_TABLE(OPCODE_COMPARE_##op##_FLT, COMPARE_##op##_F32, \\\n                       COMPARE_##op##_F64);\nEMITTER_ASSOCIATIVE_COMPARE_FLT_XX(SLT, setb);\nEMITTER_ASSOCIATIVE_COMPARE_FLT_XX(SLE, setbe);\nEMITTER_ASSOCIATIVE_COMPARE_FLT_XX(SGT, seta);\nEMITTER_ASSOCIATIVE_COMPARE_FLT_XX(SGE, setae);\nEMITTER_ASSOCIATIVE_COMPARE_FLT_XX(ULT, setb);\nEMITTER_ASSOCIATIVE_COMPARE_FLT_XX(ULE, setbe);\nEMITTER_ASSOCIATIVE_COMPARE_FLT_XX(UGT, seta);\nEMITTER_ASSOCIATIVE_COMPARE_FLT_XX(UGE, setae);\n\n// ============================================================================\n// OPCODE_DID_SATURATE\n// ============================================================================\nstruct DID_SATURATE\n    : Sequence<DID_SATURATE, I<OPCODE_DID_SATURATE, I8Op, V128Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    // TODO(benvanik): implement saturation check (VECTOR_ADD, etc).\n    e.xor_(i.dest, i.dest);\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_DID_SATURATE, DID_SATURATE);\n\n// ============================================================================\n// OPCODE_ADD\n// ============================================================================\n// TODO(benvanik): put dest/src1|2 together.\ntemplate <typename SEQ, typename REG, typename ARGS>\nvoid EmitAddXX(X64Emitter& e, const ARGS& i) {\n  SEQ::EmitCommutativeBinaryOp(\n      e, i,\n      [](X64Emitter& e, const REG& dest_src, const REG& src) {\n        e.add(dest_src, src);\n      },\n      [](X64Emitter& e, const REG& dest_src, int32_t constant) {\n        e.add(dest_src, constant);\n      });\n}\nstruct ADD_I8 : Sequence<ADD_I8, I<OPCODE_ADD, I8Op, I8Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitAddXX<ADD_I8, Reg8>(e, i);\n  }\n};\nstruct ADD_I16 : Sequence<ADD_I16, I<OPCODE_ADD, I16Op, I16Op, I16Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitAddXX<ADD_I16, Reg16>(e, i);\n  }\n};\nstruct ADD_I32 : Sequence<ADD_I32, I<OPCODE_ADD, I32Op, I32Op, I32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitAddXX<ADD_I32, Reg32>(e, i);\n  }\n};\nstruct ADD_I64 : Sequence<ADD_I64, I<OPCODE_ADD, I64Op, I64Op, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitAddXX<ADD_I64, Reg64>(e, i);\n  }\n};\nstruct ADD_F32 : Sequence<ADD_F32, I<OPCODE_ADD, F32Op, F32Op, F32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitCommutativeBinaryXmmOp(e, i,\n                               [](X64Emitter& e, Xmm dest, Xmm src1, Xmm src2) {\n                                 e.vaddss(dest, src1, src2);\n                               });\n  }\n};\nstruct ADD_F64 : Sequence<ADD_F64, I<OPCODE_ADD, F64Op, F64Op, F64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitCommutativeBinaryXmmOp(e, i,\n                               [](X64Emitter& e, Xmm dest, Xmm src1, Xmm src2) {\n                                 e.vaddsd(dest, src1, src2);\n                               });\n  }\n};\nstruct ADD_V128 : Sequence<ADD_V128, I<OPCODE_ADD, V128Op, V128Op, V128Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitCommutativeBinaryXmmOp(e, i,\n                               [](X64Emitter& e, Xmm dest, Xmm src1, Xmm src2) {\n                                 e.vaddps(dest, src1, src2);\n                               });\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_ADD, ADD_I8, ADD_I16, ADD_I32, ADD_I64, ADD_F32,\n                     ADD_F64, ADD_V128);\n\n// ============================================================================\n// OPCODE_ADD_CARRY\n// ============================================================================\n// TODO(benvanik): put dest/src1|2 together.\ntemplate <typename SEQ, typename REG, typename ARGS>\nvoid EmitAddCarryXX(X64Emitter& e, const ARGS& i) {\n  // TODO(benvanik): faster setting? we could probably do some fun math tricks\n  // here to get the carry flag set.\n  if (i.src3.is_constant) {\n    if (i.src3.constant()) {\n      e.stc();\n    } else {\n      e.clc();\n    }\n  } else {\n    if (i.src3.reg().getIdx() <= 4) {\n      // Can move from A/B/C/DX to AH.\n      e.mov(e.ah, i.src3.reg().cvt8());\n    } else {\n      e.mov(e.al, i.src3);\n      e.mov(e.ah, e.al);\n    }\n    e.sahf();\n  }\n  SEQ::EmitCommutativeBinaryOp(\n      e, i,\n      [](X64Emitter& e, const REG& dest_src, const REG& src) {\n        e.adc(dest_src, src);\n      },\n      [](X64Emitter& e, const REG& dest_src, int32_t constant) {\n        e.adc(dest_src, constant);\n      });\n}\nstruct ADD_CARRY_I8\n    : Sequence<ADD_CARRY_I8, I<OPCODE_ADD_CARRY, I8Op, I8Op, I8Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitAddCarryXX<ADD_CARRY_I8, Reg8>(e, i);\n  }\n};\nstruct ADD_CARRY_I16\n    : Sequence<ADD_CARRY_I16, I<OPCODE_ADD_CARRY, I16Op, I16Op, I16Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitAddCarryXX<ADD_CARRY_I16, Reg16>(e, i);\n  }\n};\nstruct ADD_CARRY_I32\n    : Sequence<ADD_CARRY_I32, I<OPCODE_ADD_CARRY, I32Op, I32Op, I32Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitAddCarryXX<ADD_CARRY_I32, Reg32>(e, i);\n  }\n};\nstruct ADD_CARRY_I64\n    : Sequence<ADD_CARRY_I64, I<OPCODE_ADD_CARRY, I64Op, I64Op, I64Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitAddCarryXX<ADD_CARRY_I64, Reg64>(e, i);\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_ADD_CARRY, ADD_CARRY_I8, ADD_CARRY_I16,\n                     ADD_CARRY_I32, ADD_CARRY_I64);\n\n// ============================================================================\n// OPCODE_SUB\n// ============================================================================\n// TODO(benvanik): put dest/src1|2 together.\ntemplate <typename SEQ, typename REG, typename ARGS>\nvoid EmitSubXX(X64Emitter& e, const ARGS& i) {\n  SEQ::EmitAssociativeBinaryOp(\n      e, i,\n      [](X64Emitter& e, const REG& dest_src, const REG& src) {\n        e.sub(dest_src, src);\n      },\n      [](X64Emitter& e, const REG& dest_src, int32_t constant) {\n        e.sub(dest_src, constant);\n      });\n}\nstruct SUB_I8 : Sequence<SUB_I8, I<OPCODE_SUB, I8Op, I8Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitSubXX<SUB_I8, Reg8>(e, i);\n  }\n};\nstruct SUB_I16 : Sequence<SUB_I16, I<OPCODE_SUB, I16Op, I16Op, I16Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitSubXX<SUB_I16, Reg16>(e, i);\n  }\n};\nstruct SUB_I32 : Sequence<SUB_I32, I<OPCODE_SUB, I32Op, I32Op, I32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitSubXX<SUB_I32, Reg32>(e, i);\n  }\n};\nstruct SUB_I64 : Sequence<SUB_I64, I<OPCODE_SUB, I64Op, I64Op, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitSubXX<SUB_I64, Reg64>(e, i);\n  }\n};\nstruct SUB_F32 : Sequence<SUB_F32, I<OPCODE_SUB, F32Op, F32Op, F32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    assert_true(!i.instr->flags);\n    EmitAssociativeBinaryXmmOp(e, i,\n                               [](X64Emitter& e, Xmm dest, Xmm src1, Xmm src2) {\n                                 e.vsubss(dest, src1, src2);\n                               });\n  }\n};\nstruct SUB_F64 : Sequence<SUB_F64, I<OPCODE_SUB, F64Op, F64Op, F64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    assert_true(!i.instr->flags);\n    EmitAssociativeBinaryXmmOp(e, i,\n                               [](X64Emitter& e, Xmm dest, Xmm src1, Xmm src2) {\n                                 e.vsubsd(dest, src1, src2);\n                               });\n  }\n};\nstruct SUB_V128 : Sequence<SUB_V128, I<OPCODE_SUB, V128Op, V128Op, V128Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    assert_true(!i.instr->flags);\n    EmitAssociativeBinaryXmmOp(e, i,\n                               [](X64Emitter& e, Xmm dest, Xmm src1, Xmm src2) {\n                                 e.vsubps(dest, src1, src2);\n                               });\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_SUB, SUB_I8, SUB_I16, SUB_I32, SUB_I64, SUB_F32,\n                     SUB_F64, SUB_V128);\n\n// ============================================================================\n// OPCODE_MUL\n// ============================================================================\n// Sign doesn't matter here, as we don't use the high bits.\n// We exploit mulx here to avoid creating too much register pressure.\nstruct MUL_I8 : Sequence<MUL_I8, I<OPCODE_MUL, I8Op, I8Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    if (e.IsFeatureEnabled(kX64EmitBMI2)) {\n      // mulx: $1:$2 = EDX * $3\n\n      // TODO(benvanik): place src2 in edx?\n      if (i.src1.is_constant) {\n        assert_true(!i.src2.is_constant);\n        e.movzx(e.edx, i.src2);\n        e.mov(e.eax, static_cast<uint8_t>(i.src1.constant()));\n        e.mulx(e.edx, i.dest.reg().cvt32(), e.eax);\n      } else if (i.src2.is_constant) {\n        e.movzx(e.edx, i.src1);\n        e.mov(e.eax, static_cast<uint8_t>(i.src2.constant()));\n        e.mulx(e.edx, i.dest.reg().cvt32(), e.eax);\n      } else {\n        e.movzx(e.edx, i.src2);\n        e.mulx(e.edx, i.dest.reg().cvt32(), i.src1.reg().cvt32());\n      }\n    } else {\n      // x86 mul instruction\n      // AH:AL = AL * $1;\n\n      if (i.src1.is_constant) {\n        assert_true(!i.src2.is_constant);\n        e.mov(e.al, i.src1.constant());\n        e.mul(i.src2);\n        e.mov(i.dest, e.al);\n      } else if (i.src2.is_constant) {\n        assert_true(!i.src1.is_constant);\n        e.mov(e.al, i.src2.constant());\n        e.mul(i.src1);\n        e.mov(i.dest, e.al);\n      } else {\n        e.movzx(e.al, i.src1);\n        e.mul(i.src2);\n        e.mov(i.dest, e.al);\n      }\n    }\n  }\n};\nstruct MUL_I16 : Sequence<MUL_I16, I<OPCODE_MUL, I16Op, I16Op, I16Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    if (e.IsFeatureEnabled(kX64EmitBMI2)) {\n      // mulx: $1:$2 = EDX * $3\n\n      // TODO(benvanik): place src2 in edx?\n      if (i.src1.is_constant) {\n        assert_true(!i.src2.is_constant);\n        e.movzx(e.edx, i.src2);\n        e.mov(e.ax, static_cast<uint16_t>(i.src1.constant()));\n        e.mulx(e.edx, i.dest.reg().cvt32(), e.eax);\n      } else if (i.src2.is_constant) {\n        e.movzx(e.edx, i.src1);\n        e.mov(e.ax, static_cast<uint16_t>(i.src2.constant()));\n        e.mulx(e.edx, i.dest.reg().cvt32(), e.eax);\n      } else {\n        e.movzx(e.edx, i.src2);\n        e.mulx(e.edx, i.dest.reg().cvt32(), i.src1.reg().cvt32());\n      }\n    } else {\n      // x86 mul instruction\n      // DX:AX = AX * $1;\n\n      if (i.src1.is_constant) {\n        assert_true(!i.src2.is_constant);\n        e.mov(e.ax, i.src1.constant());\n        e.mul(i.src2);\n        e.movzx(i.dest, e.ax);\n      } else if (i.src2.is_constant) {\n        assert_true(!i.src1.is_constant);\n        e.mov(e.ax, i.src2.constant());\n        e.mul(i.src1);\n        e.movzx(i.dest, e.ax);\n      } else {\n        e.movzx(e.ax, i.src1);\n        e.mul(i.src2);\n        e.movzx(i.dest, e.ax);\n      }\n    }\n  }\n};\nstruct MUL_I32 : Sequence<MUL_I32, I<OPCODE_MUL, I32Op, I32Op, I32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    if (e.IsFeatureEnabled(kX64EmitBMI2)) {\n      // mulx: $1:$2 = EDX * $3\n\n      // TODO(benvanik): place src2 in edx?\n      if (i.src1.is_constant) {\n        assert_true(!i.src2.is_constant);\n        e.mov(e.edx, i.src2);\n        e.mov(e.eax, i.src1.constant());\n        e.mulx(e.edx, i.dest, e.eax);\n      } else if (i.src2.is_constant) {\n        e.mov(e.edx, i.src1);\n        e.mov(e.eax, i.src2.constant());\n        e.mulx(e.edx, i.dest, e.eax);\n      } else {\n        e.mov(e.edx, i.src2);\n        e.mulx(e.edx, i.dest, i.src1);\n      }\n    } else {\n      // x86 mul instruction\n      // EDX:EAX = EAX * $1;\n\n      // is_constant AKA not a register\n      if (i.src1.is_constant) {\n        assert_true(!i.src2.is_constant);  // can't multiply 2 constants\n        e.mov(e.eax, i.src1.constant());\n        e.mul(i.src2);\n        e.mov(i.dest, e.eax);\n      } else if (i.src2.is_constant) {\n        assert_true(!i.src1.is_constant);  // can't multiply 2 constants\n        e.mov(e.eax, i.src2.constant());\n        e.mul(i.src1);\n        e.mov(i.dest, e.eax);\n      } else {\n        e.mov(e.eax, i.src1);\n        e.mul(i.src2);\n        e.mov(i.dest, e.eax);\n      }\n    }\n  }\n};\nstruct MUL_I64 : Sequence<MUL_I64, I<OPCODE_MUL, I64Op, I64Op, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    if (e.IsFeatureEnabled(kX64EmitBMI2)) {\n      // mulx: $1:$2 = RDX * $3\n\n      // TODO(benvanik): place src2 in edx?\n      if (i.src1.is_constant) {\n        assert_true(!i.src2.is_constant);\n        e.mov(e.rdx, i.src2);\n        e.mov(e.rax, i.src1.constant());\n        e.mulx(e.rdx, i.dest, e.rax);\n      } else if (i.src2.is_constant) {\n        e.mov(e.rdx, i.src1);\n        e.mov(e.rax, i.src2.constant());\n        e.mulx(e.rdx, i.dest, e.rax);\n      } else {\n        e.mov(e.rdx, i.src2);\n        e.mulx(e.rdx, i.dest, i.src1);\n      }\n    } else {\n      // x86 mul instruction\n      // RDX:RAX = RAX * $1;\n\n      if (i.src1.is_constant) {\n        assert_true(!i.src2.is_constant);  // can't multiply 2 constants\n        e.mov(e.rax, i.src1.constant());\n        e.mul(i.src2);\n        e.mov(i.dest, e.rax);\n      } else if (i.src2.is_constant) {\n        assert_true(!i.src1.is_constant);  // can't multiply 2 constants\n        e.mov(e.rax, i.src2.constant());\n        e.mul(i.src1);\n        e.mov(i.dest, e.rax);\n      } else {\n        e.mov(e.rax, i.src1);\n        e.mul(i.src2);\n        e.mov(i.dest, e.rax);\n      }\n    }\n  }\n};\nstruct MUL_F32 : Sequence<MUL_F32, I<OPCODE_MUL, F32Op, F32Op, F32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    assert_true(!i.instr->flags);\n    EmitCommutativeBinaryXmmOp(e, i,\n                               [](X64Emitter& e, Xmm dest, Xmm src1, Xmm src2) {\n                                 e.vmulss(dest, src1, src2);\n                               });\n  }\n};\nstruct MUL_F64 : Sequence<MUL_F64, I<OPCODE_MUL, F64Op, F64Op, F64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    assert_true(!i.instr->flags);\n    EmitCommutativeBinaryXmmOp(e, i,\n                               [](X64Emitter& e, Xmm dest, Xmm src1, Xmm src2) {\n                                 e.vmulsd(dest, src1, src2);\n                               });\n  }\n};\nstruct MUL_V128 : Sequence<MUL_V128, I<OPCODE_MUL, V128Op, V128Op, V128Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    assert_true(!i.instr->flags);\n    EmitCommutativeBinaryXmmOp(e, i,\n                               [](X64Emitter& e, Xmm dest, Xmm src1, Xmm src2) {\n                                 e.vmulps(dest, src1, src2);\n                               });\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_MUL, MUL_I8, MUL_I16, MUL_I32, MUL_I64, MUL_F32,\n                     MUL_F64, MUL_V128);\n\n// ============================================================================\n// OPCODE_MUL_HI\n// ============================================================================\nstruct MUL_HI_I8 : Sequence<MUL_HI_I8, I<OPCODE_MUL_HI, I8Op, I8Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    if (i.instr->flags & ARITHMETIC_UNSIGNED) {\n      // mulx: $1:$2 = EDX * $3\n\n      if (e.IsFeatureEnabled(kX64EmitBMI2)) {\n        // TODO(benvanik): place src1 in eax? still need to sign extend\n        e.movzx(e.edx, i.src1);\n        e.mulx(i.dest.reg().cvt32(), e.eax, i.src2.reg().cvt32());\n      } else {\n        // x86 mul instruction\n        // AH:AL = AL * $1;\n        if (i.src1.is_constant) {\n          assert_true(!i.src2.is_constant);  // can't multiply 2 constants\n          e.mov(e.al, i.src1.constant());\n          e.mul(i.src2);\n          e.mov(i.dest, e.ah);\n        } else if (i.src2.is_constant) {\n          assert_true(!i.src1.is_constant);  // can't multiply 2 constants\n          e.mov(e.al, i.src2.constant());\n          e.mul(i.src1);\n          e.mov(i.dest, e.ah);\n        } else {\n          e.mov(e.al, i.src1);\n          e.mul(i.src2);\n          e.mov(i.dest, e.ah);\n        }\n      }\n    } else {\n      if (i.src1.is_constant) {\n        e.mov(e.al, i.src1.constant());\n      } else {\n        e.mov(e.al, i.src1);\n      }\n      if (i.src2.is_constant) {\n        e.mov(e.al, i.src2.constant());\n        e.imul(e.al);\n      } else {\n        e.imul(i.src2);\n      }\n      e.mov(i.dest, e.ah);\n    }\n  }\n};\nstruct MUL_HI_I16\n    : Sequence<MUL_HI_I16, I<OPCODE_MUL_HI, I16Op, I16Op, I16Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    if (i.instr->flags & ARITHMETIC_UNSIGNED) {\n      if (e.IsFeatureEnabled(kX64EmitBMI2)) {\n        // TODO(benvanik): place src1 in eax? still need to sign extend\n        e.movzx(e.edx, i.src1);\n        e.mulx(i.dest.reg().cvt32(), e.eax, i.src2.reg().cvt32());\n      } else {\n        // x86 mul instruction\n        // DX:AX = AX * $1;\n        if (i.src1.is_constant) {\n          assert_true(!i.src2.is_constant);  // can't multiply 2 constants\n          e.mov(e.ax, i.src1.constant());\n          e.mul(i.src2);\n          e.mov(i.dest, e.dx);\n        } else if (i.src2.is_constant) {\n          assert_true(!i.src1.is_constant);  // can't multiply 2 constants\n          e.mov(e.ax, i.src2.constant());\n          e.mul(i.src1);\n          e.mov(i.dest, e.dx);\n        } else {\n          e.mov(e.ax, i.src1);\n          e.mul(i.src2);\n          e.mov(i.dest, e.dx);\n        }\n      }\n    } else {\n      if (i.src1.is_constant) {\n        e.mov(e.ax, i.src1.constant());\n      } else {\n        e.mov(e.ax, i.src1);\n      }\n      if (i.src2.is_constant) {\n        e.mov(e.dx, i.src2.constant());\n        e.imul(e.dx);\n      } else {\n        e.imul(i.src2);\n      }\n      e.mov(i.dest, e.dx);\n    }\n  }\n};\nstruct MUL_HI_I32\n    : Sequence<MUL_HI_I32, I<OPCODE_MUL_HI, I32Op, I32Op, I32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    if (i.instr->flags & ARITHMETIC_UNSIGNED) {\n      if (e.IsFeatureEnabled(kX64EmitBMI2)) {\n        // TODO(benvanik): place src1 in eax? still need to sign extend\n        e.mov(e.edx, i.src1);\n        if (i.src2.is_constant) {\n          e.mov(e.eax, i.src2.constant());\n          e.mulx(i.dest, e.edx, e.eax);\n        } else {\n          e.mulx(i.dest, e.edx, i.src2);\n        }\n      } else {\n        // x86 mul instruction\n        // EDX:EAX = EAX * $1;\n        if (i.src1.is_constant) {\n          assert_true(!i.src2.is_constant);  // can't multiply 2 constants\n          e.mov(e.eax, i.src1.constant());\n          e.mul(i.src2);\n          e.mov(i.dest, e.edx);\n        } else if (i.src2.is_constant) {\n          assert_true(!i.src1.is_constant);  // can't multiply 2 constants\n          e.mov(e.eax, i.src2.constant());\n          e.mul(i.src1);\n          e.mov(i.dest, e.edx);\n        } else {\n          e.mov(e.eax, i.src1);\n          e.mul(i.src2);\n          e.mov(i.dest, e.edx);\n        }\n      }\n    } else {\n      if (i.src1.is_constant) {\n        e.mov(e.eax, i.src1.constant());\n      } else {\n        e.mov(e.eax, i.src1);\n      }\n      if (i.src2.is_constant) {\n        e.mov(e.edx, i.src2.constant());\n        e.imul(e.edx);\n      } else {\n        e.imul(i.src2);\n      }\n      e.mov(i.dest, e.edx);\n    }\n  }\n};\nstruct MUL_HI_I64\n    : Sequence<MUL_HI_I64, I<OPCODE_MUL_HI, I64Op, I64Op, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    if (i.instr->flags & ARITHMETIC_UNSIGNED) {\n      if (e.IsFeatureEnabled(kX64EmitBMI2)) {\n        // TODO(benvanik): place src1 in eax? still need to sign extend\n        e.mov(e.rdx, i.src1);\n        if (i.src2.is_constant) {\n          e.mov(e.rax, i.src2.constant());\n          e.mulx(i.dest, e.rdx, e.rax);\n        } else {\n          e.mulx(i.dest, e.rax, i.src2);\n        }\n      } else {\n        // x86 mul instruction\n        // RDX:RAX < RAX * REG(op1);\n        if (i.src1.is_constant) {\n          assert_true(!i.src2.is_constant);  // can't multiply 2 constants\n          e.mov(e.rax, i.src1.constant());\n          e.mul(i.src2);\n          e.mov(i.dest, e.rdx);\n        } else if (i.src2.is_constant) {\n          assert_true(!i.src1.is_constant);  // can't multiply 2 constants\n          e.mov(e.rax, i.src2.constant());\n          e.mul(i.src1);\n          e.mov(i.dest, e.rdx);\n        } else {\n          e.mov(e.rax, i.src1);\n          e.mul(i.src2);\n          e.mov(i.dest, e.rdx);\n        }\n      }\n    } else {\n      if (i.src1.is_constant) {\n        e.mov(e.rax, i.src1.constant());\n      } else {\n        e.mov(e.rax, i.src1);\n      }\n      if (i.src2.is_constant) {\n        e.mov(e.rdx, i.src2.constant());\n        e.imul(e.rdx);\n      } else {\n        e.imul(i.src2);\n      }\n      e.mov(i.dest, e.rdx);\n    }\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_MUL_HI, MUL_HI_I8, MUL_HI_I16, MUL_HI_I32,\n                     MUL_HI_I64);\n\n// ============================================================================\n// OPCODE_DIV\n// ============================================================================\n// TODO(benvanik): optimize common constant cases.\n// TODO(benvanik): simplify code!\nstruct DIV_I8 : Sequence<DIV_I8, I<OPCODE_DIV, I8Op, I8Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    Xbyak::Label skip;\n    e.inLocalLabel();\n\n    if (i.src2.is_constant) {\n      assert_true(!i.src1.is_constant);\n      e.mov(e.cl, i.src2.constant());\n      if (i.instr->flags & ARITHMETIC_UNSIGNED) {\n        e.movzx(e.ax, i.src1);\n        e.div(e.cl);\n      } else {\n        e.movsx(e.ax, i.src1);\n        e.idiv(e.cl);\n      }\n    } else {\n      // Skip if src2 is zero.\n      e.test(i.src2, i.src2);\n      e.jz(skip, CodeGenerator::T_SHORT);\n\n      if (i.instr->flags & ARITHMETIC_UNSIGNED) {\n        if (i.src1.is_constant) {\n          e.mov(e.ax, static_cast<int16_t>(i.src1.constant()));\n        } else {\n          e.movzx(e.ax, i.src1);\n        }\n        e.div(i.src2);\n      } else {\n        if (i.src1.is_constant) {\n          e.mov(e.ax, static_cast<int16_t>(i.src1.constant()));\n        } else {\n          e.movsx(e.ax, i.src1);\n        }\n        e.idiv(i.src2);\n      }\n    }\n\n    e.L(skip);\n    e.outLocalLabel();\n    e.mov(i.dest, e.al);\n  }\n};\nstruct DIV_I16 : Sequence<DIV_I16, I<OPCODE_DIV, I16Op, I16Op, I16Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    Xbyak::Label skip;\n    e.inLocalLabel();\n\n    if (i.src2.is_constant) {\n      assert_true(!i.src1.is_constant);\n      e.mov(e.cx, i.src2.constant());\n      if (i.instr->flags & ARITHMETIC_UNSIGNED) {\n        e.mov(e.ax, i.src1);\n        // Zero upper bits.\n        e.xor_(e.dx, e.dx);\n        e.div(e.cx);\n      } else {\n        e.mov(e.ax, i.src1);\n        e.cwd();  // dx:ax = sign-extend ax\n        e.idiv(e.cx);\n      }\n    } else {\n      // Skip if src2 is zero.\n      e.test(i.src2, i.src2);\n      e.jz(skip, CodeGenerator::T_SHORT);\n\n      if (i.instr->flags & ARITHMETIC_UNSIGNED) {\n        if (i.src1.is_constant) {\n          e.mov(e.ax, i.src1.constant());\n        } else {\n          e.mov(e.ax, i.src1);\n        }\n        // Zero upper bits.\n        e.xor_(e.dx, e.dx);\n        e.div(i.src2);\n      } else {\n        if (i.src1.is_constant) {\n          e.mov(e.ax, i.src1.constant());\n        } else {\n          e.mov(e.ax, i.src1);\n        }\n        e.cwd();  // dx:ax = sign-extend ax\n        e.idiv(i.src2);\n      }\n    }\n\n    e.L(skip);\n    e.outLocalLabel();\n    e.mov(i.dest, e.ax);\n  }\n};\nstruct DIV_I32 : Sequence<DIV_I32, I<OPCODE_DIV, I32Op, I32Op, I32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    Xbyak::Label skip;\n    e.inLocalLabel();\n\n    if (i.src2.is_constant) {\n      assert_true(!i.src1.is_constant);\n      e.mov(e.ecx, i.src2.constant());\n      if (i.instr->flags & ARITHMETIC_UNSIGNED) {\n        e.mov(e.eax, i.src1);\n        // Zero upper bits.\n        e.xor_(e.edx, e.edx);\n        e.div(e.ecx);\n      } else {\n        e.mov(e.eax, i.src1);\n        e.cdq();  // edx:eax = sign-extend eax\n        e.idiv(e.ecx);\n      }\n    } else {\n      // Skip if src2 is zero.\n      e.test(i.src2, i.src2);\n      e.jz(skip, CodeGenerator::T_SHORT);\n\n      if (i.instr->flags & ARITHMETIC_UNSIGNED) {\n        if (i.src1.is_constant) {\n          e.mov(e.eax, i.src1.constant());\n        } else {\n          e.mov(e.eax, i.src1);\n        }\n        // Zero upper bits.\n        e.xor_(e.edx, e.edx);\n        e.div(i.src2);\n      } else {\n        if (i.src1.is_constant) {\n          e.mov(e.eax, i.src1.constant());\n        } else {\n          e.mov(e.eax, i.src1);\n        }\n        e.cdq();  // edx:eax = sign-extend eax\n        e.idiv(i.src2);\n      }\n    }\n\n    e.L(skip);\n    e.outLocalLabel();\n    e.mov(i.dest, e.eax);\n  }\n};\nstruct DIV_I64 : Sequence<DIV_I64, I<OPCODE_DIV, I64Op, I64Op, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    Xbyak::Label skip;\n    e.inLocalLabel();\n\n    if (i.src2.is_constant) {\n      assert_true(!i.src1.is_constant);\n      e.mov(e.rcx, i.src2.constant());\n      if (i.instr->flags & ARITHMETIC_UNSIGNED) {\n        e.mov(e.rax, i.src1);\n        // Zero upper bits.\n        e.xor_(e.rdx, e.rdx);\n        e.div(e.rcx);\n      } else {\n        e.mov(e.rax, i.src1);\n        e.cqo();  // rdx:rax = sign-extend rax\n        e.idiv(e.rcx);\n      }\n    } else {\n      // Skip if src2 is zero.\n      e.test(i.src2, i.src2);\n      e.jz(skip, CodeGenerator::T_SHORT);\n\n      if (i.instr->flags & ARITHMETIC_UNSIGNED) {\n        if (i.src1.is_constant) {\n          e.mov(e.rax, i.src1.constant());\n        } else {\n          e.mov(e.rax, i.src1);\n        }\n        // Zero upper bits.\n        e.xor_(e.rdx, e.rdx);\n        e.div(i.src2);\n      } else {\n        if (i.src1.is_constant) {\n          e.mov(e.rax, i.src1.constant());\n        } else {\n          e.mov(e.rax, i.src1);\n        }\n        e.cqo();  // rdx:rax = sign-extend rax\n        e.idiv(i.src2);\n      }\n    }\n\n    e.L(skip);\n    e.outLocalLabel();\n    e.mov(i.dest, e.rax);\n  }\n};\nstruct DIV_F32 : Sequence<DIV_F32, I<OPCODE_DIV, F32Op, F32Op, F32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    assert_true(!i.instr->flags);\n    EmitAssociativeBinaryXmmOp(e, i,\n                               [](X64Emitter& e, Xmm dest, Xmm src1, Xmm src2) {\n                                 e.vdivss(dest, src1, src2);\n                               });\n  }\n};\nstruct DIV_F64 : Sequence<DIV_F64, I<OPCODE_DIV, F64Op, F64Op, F64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    assert_true(!i.instr->flags);\n    EmitAssociativeBinaryXmmOp(e, i,\n                               [](X64Emitter& e, Xmm dest, Xmm src1, Xmm src2) {\n                                 e.vdivsd(dest, src1, src2);\n                               });\n  }\n};\nstruct DIV_V128 : Sequence<DIV_V128, I<OPCODE_DIV, V128Op, V128Op, V128Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    assert_true(!i.instr->flags);\n    EmitAssociativeBinaryXmmOp(e, i,\n                               [](X64Emitter& e, Xmm dest, Xmm src1, Xmm src2) {\n                                 e.vdivps(dest, src1, src2);\n                               });\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_DIV, DIV_I8, DIV_I16, DIV_I32, DIV_I64, DIV_F32,\n                     DIV_F64, DIV_V128);\n\n// ============================================================================\n// OPCODE_MUL_ADD\n// ============================================================================\n// d = 1 * 2 + 3\n// $0 = $1x$0 + $2\n// Forms of vfmadd/vfmsub:\n// - 132 -> $1 = $1 * $3 + $2\n// - 213 -> $1 = $2 * $1 + $3\n// - 231 -> $1 = $2 * $3 + $1\nstruct MUL_ADD_F32\n    : Sequence<MUL_ADD_F32, I<OPCODE_MUL_ADD, F32Op, F32Op, F32Op, F32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    // FMA extension\n    if (e.IsFeatureEnabled(kX64EmitFMA)) {\n      EmitCommutativeBinaryXmmOp(e, i,\n                                 [&i](X64Emitter& e, const Xmm& dest,\n                                      const Xmm& src1, const Xmm& src2) {\n                                   Xmm src3 =\n                                       i.src3.is_constant ? e.xmm1 : i.src3;\n                                   if (i.src3.is_constant) {\n                                     e.LoadConstantXmm(src3, i.src3.constant());\n                                   }\n                                   if (i.dest == src1) {\n                                     e.vfmadd213ss(i.dest, src2, src3);\n                                   } else if (i.dest == src2) {\n                                     e.vfmadd213ss(i.dest, src1, src3);\n                                   } else if (i.dest == i.src3) {\n                                     e.vfmadd231ss(i.dest, src1, src2);\n                                   } else {\n                                     // Dest not equal to anything\n                                     e.vmovss(i.dest, src1);\n                                     e.vfmadd213ss(i.dest, src2, src3);\n                                   }\n                                 });\n    } else {\n      Xmm src3;\n      if (i.src3.is_constant) {\n        src3 = e.xmm1;\n        e.LoadConstantXmm(src3, i.src3.constant());\n      } else {\n        // If i.dest == i.src3, back up i.src3 so we don't overwrite it.\n        src3 = i.src3;\n        if (i.dest == i.src3) {\n          e.vmovss(e.xmm1, i.src3);\n          src3 = e.xmm1;\n        }\n      }\n\n      // Multiply operation is commutative.\n      EmitCommutativeBinaryXmmOp(\n          e, i, [&i](X64Emitter& e, Xmm dest, Xmm src1, Xmm src2) {\n            e.vmulss(dest, src1, src2);  // $0 = $1 * $2\n          });\n\n      e.vaddss(i.dest, i.dest, src3);  // $0 = $1 + $2\n    }\n  }\n};\nstruct MUL_ADD_F64\n    : Sequence<MUL_ADD_F64, I<OPCODE_MUL_ADD, F64Op, F64Op, F64Op, F64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    // FMA extension\n    if (e.IsFeatureEnabled(kX64EmitFMA)) {\n      EmitCommutativeBinaryXmmOp(e, i,\n                                 [&i](X64Emitter& e, const Xmm& dest,\n                                      const Xmm& src1, const Xmm& src2) {\n                                   Xmm src3 =\n                                       i.src3.is_constant ? e.xmm1 : i.src3;\n                                   if (i.src3.is_constant) {\n                                     e.LoadConstantXmm(src3, i.src3.constant());\n                                   }\n                                   if (i.dest == src1) {\n                                     e.vfmadd213sd(i.dest, src2, src3);\n                                   } else if (i.dest == src2) {\n                                     e.vfmadd213sd(i.dest, src1, src3);\n                                   } else if (i.dest == i.src3) {\n                                     e.vfmadd231sd(i.dest, src1, src2);\n                                   } else {\n                                     // Dest not equal to anything\n                                     e.vmovsd(i.dest, src1);\n                                     e.vfmadd213sd(i.dest, src2, src3);\n                                   }\n                                 });\n    } else {\n      Xmm src3;\n      if (i.src3.is_constant) {\n        src3 = e.xmm1;\n        e.LoadConstantXmm(src3, i.src3.constant());\n      } else {\n        // If i.dest == i.src3, back up i.src3 so we don't overwrite it.\n        src3 = i.src3;\n        if (i.dest == i.src3) {\n          e.vmovsd(e.xmm1, i.src3);\n          src3 = e.xmm1;\n        }\n      }\n\n      // Multiply operation is commutative.\n      EmitCommutativeBinaryXmmOp(\n          e, i, [&i](X64Emitter& e, Xmm dest, Xmm src1, Xmm src2) {\n            e.vmulsd(dest, src1, src2);  // $0 = $1 * $2\n          });\n\n      e.vaddsd(i.dest, i.dest, src3);  // $0 = $1 + $2\n    }\n  }\n};\nstruct MUL_ADD_V128\n    : Sequence<MUL_ADD_V128,\n               I<OPCODE_MUL_ADD, V128Op, V128Op, V128Op, V128Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    // TODO(benvanik): the vfmadd sequence produces slightly different results\n    // than vmul+vadd and it'd be nice to know why. Until we know, it's\n    // disabled so tests pass.\n    if (false && e.IsFeatureEnabled(kX64EmitFMA)) {\n      EmitCommutativeBinaryXmmOp(e, i,\n                                 [&i](X64Emitter& e, const Xmm& dest,\n                                      const Xmm& src1, const Xmm& src2) {\n                                   Xmm src3 =\n                                       i.src3.is_constant ? e.xmm1 : i.src3;\n                                   if (i.src3.is_constant) {\n                                     e.LoadConstantXmm(src3, i.src3.constant());\n                                   }\n                                   if (i.dest == src1) {\n                                     e.vfmadd213ps(i.dest, src2, src3);\n                                   } else if (i.dest == src2) {\n                                     e.vfmadd213ps(i.dest, src1, src3);\n                                   } else if (i.dest == i.src3) {\n                                     e.vfmadd231ps(i.dest, src1, src2);\n                                   } else {\n                                     // Dest not equal to anything\n                                     e.vmovdqa(i.dest, src1);\n                                     e.vfmadd213ps(i.dest, src2, src3);\n                                   }\n                                 });\n    } else {\n      Xmm src3;\n      if (i.src3.is_constant) {\n        src3 = e.xmm1;\n        e.LoadConstantXmm(src3, i.src3.constant());\n      } else {\n        // If i.dest == i.src3, back up i.src3 so we don't overwrite it.\n        src3 = i.src3;\n        if (i.dest == i.src3) {\n          e.vmovdqa(e.xmm1, i.src3);\n          src3 = e.xmm1;\n        }\n      }\n\n      // Multiply operation is commutative.\n      EmitCommutativeBinaryXmmOp(\n          e, i, [&i](X64Emitter& e, Xmm dest, Xmm src1, Xmm src2) {\n            e.vmulps(dest, src1, src2);  // $0 = $1 * $2\n          });\n\n      e.vaddps(i.dest, i.dest, src3);  // $0 = $1 + $2\n    }\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_MUL_ADD, MUL_ADD_F32, MUL_ADD_F64, MUL_ADD_V128);\n\n// ============================================================================\n// OPCODE_MUL_SUB\n// ============================================================================\n// d = 1 * 2 - 3\n// $0 = $2x$0 - $3\n// TODO(benvanik): use other forms (132/213/etc) to avoid register shuffling.\n// dest could be src2 or src3 - need to ensure it's not before overwriting dest\n// perhaps use other 132/213/etc\n// Forms:\n// - 132 -> $1 = $1 * $3 - $2\n// - 213 -> $1 = $2 * $1 - $3\n// - 231 -> $1 = $2 * $3 - $1\nstruct MUL_SUB_F32\n    : Sequence<MUL_SUB_F32, I<OPCODE_MUL_SUB, F32Op, F32Op, F32Op, F32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    // FMA extension\n    if (e.IsFeatureEnabled(kX64EmitFMA)) {\n      EmitCommutativeBinaryXmmOp(e, i,\n                                 [&i](X64Emitter& e, const Xmm& dest,\n                                      const Xmm& src1, const Xmm& src2) {\n                                   Xmm src3 =\n                                       i.src3.is_constant ? e.xmm1 : i.src3;\n                                   if (i.src3.is_constant) {\n                                     e.LoadConstantXmm(src3, i.src3.constant());\n                                   }\n                                   if (i.dest == src1) {\n                                     e.vfmsub213ss(i.dest, src2, src3);\n                                   } else if (i.dest == src2) {\n                                     e.vfmsub213ss(i.dest, src1, src3);\n                                   } else if (i.dest == i.src3) {\n                                     e.vfmsub231ss(i.dest, src1, src2);\n                                   } else {\n                                     // Dest not equal to anything\n                                     e.vmovss(i.dest, src1);\n                                     e.vfmsub213ss(i.dest, src2, src3);\n                                   }\n                                 });\n    } else {\n      Xmm src3;\n      if (i.src3.is_constant) {\n        src3 = e.xmm1;\n        e.LoadConstantXmm(src3, i.src3.constant());\n      } else {\n        // If i.dest == i.src3, back up i.src3 so we don't overwrite it.\n        src3 = i.src3;\n        if (i.dest == i.src3) {\n          e.vmovss(e.xmm1, i.src3);\n          src3 = e.xmm1;\n        }\n      }\n\n      // Multiply operation is commutative.\n      EmitCommutativeBinaryXmmOp(\n          e, i, [&i](X64Emitter& e, Xmm dest, Xmm src1, Xmm src2) {\n            e.vmulss(dest, src1, src2);  // $0 = $1 * $2\n          });\n\n      e.vsubss(i.dest, i.dest, src3);  // $0 = $1 - $2\n    }\n  }\n};\nstruct MUL_SUB_F64\n    : Sequence<MUL_SUB_F64, I<OPCODE_MUL_SUB, F64Op, F64Op, F64Op, F64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    // FMA extension\n    if (e.IsFeatureEnabled(kX64EmitFMA)) {\n      EmitCommutativeBinaryXmmOp(e, i,\n                                 [&i](X64Emitter& e, const Xmm& dest,\n                                      const Xmm& src1, const Xmm& src2) {\n                                   Xmm src3 =\n                                       i.src3.is_constant ? e.xmm1 : i.src3;\n                                   if (i.src3.is_constant) {\n                                     e.LoadConstantXmm(src3, i.src3.constant());\n                                   }\n                                   if (i.dest == src1) {\n                                     e.vfmsub213sd(i.dest, src2, src3);\n                                   } else if (i.dest == src2) {\n                                     e.vfmsub213sd(i.dest, src1, src3);\n                                   } else if (i.dest == i.src3) {\n                                     e.vfmsub231sd(i.dest, src1, src2);\n                                   } else {\n                                     // Dest not equal to anything\n                                     e.vmovsd(i.dest, src1);\n                                     e.vfmsub213sd(i.dest, src2, src3);\n                                   }\n                                 });\n    } else {\n      Xmm src3;\n      if (i.src3.is_constant) {\n        src3 = e.xmm1;\n        e.LoadConstantXmm(src3, i.src3.constant());\n      } else {\n        // If i.dest == i.src3, back up i.src3 so we don't overwrite it.\n        src3 = i.src3;\n        if (i.dest == i.src3) {\n          e.vmovsd(e.xmm1, i.src3);\n          src3 = e.xmm1;\n        }\n      }\n\n      // Multiply operation is commutative.\n      EmitCommutativeBinaryXmmOp(\n          e, i, [&i](X64Emitter& e, Xmm dest, Xmm src1, Xmm src2) {\n            e.vmulsd(dest, src1, src2);  // $0 = $1 * $2\n          });\n\n      e.vsubsd(i.dest, i.dest, src3);  // $0 = $1 - $2\n    }\n  }\n};\nstruct MUL_SUB_V128\n    : Sequence<MUL_SUB_V128,\n               I<OPCODE_MUL_SUB, V128Op, V128Op, V128Op, V128Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    // FMA extension\n    if (e.IsFeatureEnabled(kX64EmitFMA)) {\n      EmitCommutativeBinaryXmmOp(e, i,\n                                 [&i](X64Emitter& e, const Xmm& dest,\n                                      const Xmm& src1, const Xmm& src2) {\n                                   Xmm src3 =\n                                       i.src3.is_constant ? e.xmm1 : i.src3;\n                                   if (i.src3.is_constant) {\n                                     e.LoadConstantXmm(src3, i.src3.constant());\n                                   }\n                                   if (i.dest == src1) {\n                                     e.vfmsub213ps(i.dest, src2, src3);\n                                   } else if (i.dest == src2) {\n                                     e.vfmsub213ps(i.dest, src1, src3);\n                                   } else if (i.dest == i.src3) {\n                                     e.vfmsub231ps(i.dest, src1, src2);\n                                   } else {\n                                     // Dest not equal to anything\n                                     e.vmovdqa(i.dest, src1);\n                                     e.vfmsub213ps(i.dest, src2, src3);\n                                   }\n                                 });\n    } else {\n      Xmm src3;\n      if (i.src3.is_constant) {\n        src3 = e.xmm1;\n        e.LoadConstantXmm(src3, i.src3.constant());\n      } else {\n        // If i.dest == i.src3, back up i.src3 so we don't overwrite it.\n        src3 = i.src3;\n        if (i.dest == i.src3) {\n          e.vmovdqa(e.xmm1, i.src3);\n          src3 = e.xmm1;\n        }\n      }\n\n      // Multiply operation is commutative.\n      EmitCommutativeBinaryXmmOp(\n          e, i, [&i](X64Emitter& e, Xmm dest, Xmm src1, Xmm src2) {\n            e.vmulps(dest, src1, src2);  // $0 = $1 * $2\n          });\n\n      e.vsubps(i.dest, i.dest, src3);  // $0 = $1 - $2\n    }\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_MUL_SUB, MUL_SUB_F32, MUL_SUB_F64, MUL_SUB_V128);\n\n// ============================================================================\n// OPCODE_NEG\n// ============================================================================\n// TODO(benvanik): put dest/src1 together.\ntemplate <typename SEQ, typename REG, typename ARGS>\nvoid EmitNegXX(X64Emitter& e, const ARGS& i) {\n  SEQ::EmitUnaryOp(e, i,\n                   [](X64Emitter& e, const REG& dest_src) { e.neg(dest_src); });\n}\nstruct NEG_I8 : Sequence<NEG_I8, I<OPCODE_NEG, I8Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitNegXX<NEG_I8, Reg8>(e, i);\n  }\n};\nstruct NEG_I16 : Sequence<NEG_I16, I<OPCODE_NEG, I16Op, I16Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitNegXX<NEG_I16, Reg16>(e, i);\n  }\n};\nstruct NEG_I32 : Sequence<NEG_I32, I<OPCODE_NEG, I32Op, I32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitNegXX<NEG_I32, Reg32>(e, i);\n  }\n};\nstruct NEG_I64 : Sequence<NEG_I64, I<OPCODE_NEG, I64Op, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitNegXX<NEG_I64, Reg64>(e, i);\n  }\n};\nstruct NEG_F32 : Sequence<NEG_F32, I<OPCODE_NEG, F32Op, F32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.vxorps(i.dest, i.src1, e.GetXmmConstPtr(XMMSignMaskPS));\n  }\n};\nstruct NEG_F64 : Sequence<NEG_F64, I<OPCODE_NEG, F64Op, F64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.vxorpd(i.dest, i.src1, e.GetXmmConstPtr(XMMSignMaskPD));\n  }\n};\nstruct NEG_V128 : Sequence<NEG_V128, I<OPCODE_NEG, V128Op, V128Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    assert_true(!i.instr->flags);\n    e.vxorps(i.dest, i.src1, e.GetXmmConstPtr(XMMSignMaskPS));\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_NEG, NEG_I8, NEG_I16, NEG_I32, NEG_I64, NEG_F32,\n                     NEG_F64, NEG_V128);\n\n// ============================================================================\n// OPCODE_ABS\n// ============================================================================\nstruct ABS_F32 : Sequence<ABS_F32, I<OPCODE_ABS, F32Op, F32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.vpand(i.dest, i.src1, e.GetXmmConstPtr(XMMAbsMaskPS));\n  }\n};\nstruct ABS_F64 : Sequence<ABS_F64, I<OPCODE_ABS, F64Op, F64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.vpand(i.dest, i.src1, e.GetXmmConstPtr(XMMAbsMaskPD));\n  }\n};\nstruct ABS_V128 : Sequence<ABS_V128, I<OPCODE_ABS, V128Op, V128Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.vpand(i.dest, i.src1, e.GetXmmConstPtr(XMMAbsMaskPS));\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_ABS, ABS_F32, ABS_F64, ABS_V128);\n\n// ============================================================================\n// OPCODE_SQRT\n// ============================================================================\nstruct SQRT_F32 : Sequence<SQRT_F32, I<OPCODE_SQRT, F32Op, F32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.vsqrtss(i.dest, i.src1);\n  }\n};\nstruct SQRT_F64 : Sequence<SQRT_F64, I<OPCODE_SQRT, F64Op, F64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.vsqrtsd(i.dest, i.src1);\n  }\n};\nstruct SQRT_V128 : Sequence<SQRT_V128, I<OPCODE_SQRT, V128Op, V128Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.vsqrtps(i.dest, i.src1);\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_SQRT, SQRT_F32, SQRT_F64, SQRT_V128);\n\n// ============================================================================\n// OPCODE_RSQRT\n// ============================================================================\n// Altivec guarantees an error of < 1/4096 for vrsqrtefp while AVX only gives\n// < 1.5*2^-12 ≈ 1/2730 for vrsqrtps.\nstruct RSQRT_F32 : Sequence<RSQRT_F32, I<OPCODE_RSQRT, F32Op, F32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    if (e.IsFeatureEnabled(kX64EmitAVX512Ortho)) {\n      e.vrsqrt14ss(i.dest, i.src1, i.src1);\n    } else {\n      e.vmovaps(e.xmm0, e.GetXmmConstPtr(XMMOne));\n      e.vsqrtss(e.xmm1, i.src1, i.src1);\n      e.vdivss(i.dest, e.xmm0, e.xmm1);\n    }\n  }\n};\nstruct RSQRT_F64 : Sequence<RSQRT_F64, I<OPCODE_RSQRT, F64Op, F64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    if (e.IsFeatureEnabled(kX64EmitAVX512Ortho)) {\n      e.vrsqrt14sd(i.dest, i.src1, i.src1);\n    } else {\n      e.vmovapd(e.xmm0, e.GetXmmConstPtr(XMMOnePD));\n      e.vsqrtsd(e.xmm1, i.src1, i.src1);\n      e.vdivsd(i.dest, e.xmm0, e.xmm1);\n    }\n  }\n};\nstruct RSQRT_V128 : Sequence<RSQRT_V128, I<OPCODE_RSQRT, V128Op, V128Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    if (e.IsFeatureEnabled(kX64EmitAVX512Ortho)) {\n      e.vrsqrt14ps(i.dest, i.src1);\n    } else {\n      e.vmovaps(e.xmm0, e.GetXmmConstPtr(XMMOne));\n      e.vsqrtps(e.xmm1, i.src1);\n      e.vdivps(i.dest, e.xmm0, e.xmm1);\n    }\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_RSQRT, RSQRT_F32, RSQRT_F64, RSQRT_V128);\n\n// ============================================================================\n// OPCODE_RECIP\n// ============================================================================\n// Altivec guarantees an error of < 1/4096 for vrefp while AVX only gives\n// < 1.5*2^-12 ≈ 1/2730 for rcpps. This breaks camp, horse and random event\n// spawning, breaks cactus collision as well as flickering grass in 5454082B\nstruct RECIP_F32 : Sequence<RECIP_F32, I<OPCODE_RECIP, F32Op, F32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    if (e.IsFeatureEnabled(kX64EmitAVX512Ortho)) {\n      e.vrcp14ss(i.dest, i.src1, i.src1);\n    } else {\n      e.vmovaps(e.xmm0, e.GetXmmConstPtr(XMMOne));\n      e.vdivss(i.dest, e.xmm0, i.src1);\n    }\n  }\n};\nstruct RECIP_F64 : Sequence<RECIP_F64, I<OPCODE_RECIP, F64Op, F64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    if (e.IsFeatureEnabled(kX64EmitAVX512Ortho)) {\n      e.vrcp14sd(i.dest, i.src1, i.src1);\n    } else {\n      e.vmovapd(e.xmm0, e.GetXmmConstPtr(XMMOnePD));\n      e.vdivsd(i.dest, e.xmm0, i.src1);\n    }\n  }\n};\nstruct RECIP_V128 : Sequence<RECIP_V128, I<OPCODE_RECIP, V128Op, V128Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    if (e.IsFeatureEnabled(kX64EmitAVX512Ortho)) {\n      e.vrcp14ps(i.dest, i.src1);\n    } else {\n      e.vmovaps(e.xmm0, e.GetXmmConstPtr(XMMOne));\n      e.vdivps(i.dest, e.xmm0, i.src1);\n    }\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_RECIP, RECIP_F32, RECIP_F64, RECIP_V128);\n\n// ============================================================================\n// OPCODE_POW2\n// ============================================================================\n// TODO(benvanik): use approx here:\n//     https://jrfonseca.blogspot.com/2008/09/fast-sse2-pow-tables-or-polynomials.html\nstruct POW2_F32 : Sequence<POW2_F32, I<OPCODE_POW2, F32Op, F32Op>> {\n  static __m128 EmulatePow2(void*, __m128 src) {\n    float src_value;\n    _mm_store_ss(&src_value, src);\n    float result = std::exp2(src_value);\n    return _mm_load_ss(&result);\n  }\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    assert_always();\n    e.lea(e.GetNativeParam(0), e.StashXmm(0, i.src1));\n    e.CallNativeSafe(reinterpret_cast<void*>(EmulatePow2));\n    e.vmovaps(i.dest, e.xmm0);\n  }\n};\nstruct POW2_F64 : Sequence<POW2_F64, I<OPCODE_POW2, F64Op, F64Op>> {\n  static __m128d EmulatePow2(void*, __m128d src) {\n    double src_value;\n    _mm_store_sd(&src_value, src);\n    double result = std::exp2(src_value);\n    return _mm_load_sd(&result);\n  }\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    assert_always();\n    e.lea(e.GetNativeParam(0), e.StashXmm(0, i.src1));\n    e.CallNativeSafe(reinterpret_cast<void*>(EmulatePow2));\n    e.vmovaps(i.dest, e.xmm0);\n  }\n};\nstruct POW2_V128 : Sequence<POW2_V128, I<OPCODE_POW2, V128Op, V128Op>> {\n  static __m128 EmulatePow2(void*, __m128 src) {\n    alignas(16) float values[4];\n    _mm_store_ps(values, src);\n    for (size_t i = 0; i < 4; ++i) {\n      values[i] = std::exp2(values[i]);\n    }\n    return _mm_load_ps(values);\n  }\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.lea(e.GetNativeParam(0), e.StashXmm(0, i.src1));\n    e.CallNativeSafe(reinterpret_cast<void*>(EmulatePow2));\n    e.vmovaps(i.dest, e.xmm0);\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_POW2, POW2_F32, POW2_F64, POW2_V128);\n\n// ============================================================================\n// OPCODE_LOG2\n// ============================================================================\n// TODO(benvanik): use approx here:\n//     https://jrfonseca.blogspot.com/2008/09/fast-sse2-pow-tables-or-polynomials.html\n// TODO(benvanik): this emulated fn destroys all xmm registers! don't do it!\nstruct LOG2_F32 : Sequence<LOG2_F32, I<OPCODE_LOG2, F32Op, F32Op>> {\n  static __m128 EmulateLog2(void*, __m128 src) {\n    float src_value;\n    _mm_store_ss(&src_value, src);\n    float result = std::log2(src_value);\n    return _mm_load_ss(&result);\n  }\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    assert_always();\n    if (i.src1.is_constant) {\n      e.lea(e.GetNativeParam(0), e.StashConstantXmm(0, i.src1.constant()));\n    } else {\n      e.lea(e.GetNativeParam(0), e.StashXmm(0, i.src1));\n    }\n    e.CallNativeSafe(reinterpret_cast<void*>(EmulateLog2));\n    e.vmovaps(i.dest, e.xmm0);\n  }\n};\nstruct LOG2_F64 : Sequence<LOG2_F64, I<OPCODE_LOG2, F64Op, F64Op>> {\n  static __m128d EmulateLog2(void*, __m128d src) {\n    double src_value;\n    _mm_store_sd(&src_value, src);\n    double result = std::log2(src_value);\n    return _mm_load_sd(&result);\n  }\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    assert_always();\n    if (i.src1.is_constant) {\n      e.lea(e.GetNativeParam(0), e.StashConstantXmm(0, i.src1.constant()));\n    } else {\n      e.lea(e.GetNativeParam(0), e.StashXmm(0, i.src1));\n    }\n    e.CallNativeSafe(reinterpret_cast<void*>(EmulateLog2));\n    e.vmovaps(i.dest, e.xmm0);\n  }\n};\nstruct LOG2_V128 : Sequence<LOG2_V128, I<OPCODE_LOG2, V128Op, V128Op>> {\n  static __m128 EmulateLog2(void*, __m128 src) {\n    alignas(16) float values[4];\n    _mm_store_ps(values, src);\n    for (size_t i = 0; i < 4; ++i) {\n      values[i] = std::log2(values[i]);\n    }\n    return _mm_load_ps(values);\n  }\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    if (i.src1.is_constant) {\n      e.lea(e.GetNativeParam(0), e.StashConstantXmm(0, i.src1.constant()));\n    } else {\n      e.lea(e.GetNativeParam(0), e.StashXmm(0, i.src1));\n    }\n    e.CallNativeSafe(reinterpret_cast<void*>(EmulateLog2));\n    e.vmovaps(i.dest, e.xmm0);\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_LOG2, LOG2_F32, LOG2_F64, LOG2_V128);\n\nstruct DOT_PRODUCT_V128 {\n  static void Emit(X64Emitter& e, Xmm dest, Xmm src1, Xmm src2, uint8_t imm) {\n    // TODO(benvanik): apparently this is very slow\n    // - find alternative?\n    Xbyak::Label end;\n    e.inLocalLabel();\n\n    // Grab space to put MXCSR.\n    // TODO(gibbed): stick this in TLS or\n    // something?\n    e.sub(e.rsp, 8);\n\n    // Grab MXCSR and mask off the overflow flag,\n    // because it's sticky.\n    e.vstmxcsr(e.dword[e.rsp]);\n    e.mov(e.eax, e.dword[e.rsp]);\n    e.and_(e.eax, uint32_t(~8));\n    e.mov(e.dword[e.rsp], e.eax);\n    e.vldmxcsr(e.dword[e.rsp]);\n\n    // Hey we can do the dot product now.\n    e.vdpps(dest, src1, src2, imm);\n\n    // Load MXCSR...\n    e.vstmxcsr(e.dword[e.rsp]);\n\n    // ..free our temporary space and get MXCSR at\n    // the same time\n    e.pop(e.rax);\n\n    // Did we overflow?\n    e.test(e.al, 8);\n    e.jz(end);\n\n    // Infinity? HA! Give NAN.\n    e.vmovdqa(dest, e.GetXmmConstPtr(XMMQNaN));\n\n    e.L(end);\n    e.outLocalLabel();\n  }\n};\n\n// ============================================================================\n// OPCODE_DOT_PRODUCT_3\n// ============================================================================\nstruct DOT_PRODUCT_3_V128\n    : Sequence<DOT_PRODUCT_3_V128,\n               I<OPCODE_DOT_PRODUCT_3, F32Op, V128Op, V128Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    // https://msdn.microsoft.com/en-us/library/bb514054(v=vs.90).aspx\n    EmitCommutativeBinaryXmmOp(\n        e, i, [](X64Emitter& e, Xmm dest, Xmm src1, Xmm src2) {\n          DOT_PRODUCT_V128::Emit(e, dest, src1, src2, 0b01110001);\n        });\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_DOT_PRODUCT_3, DOT_PRODUCT_3_V128);\n\n// ============================================================================\n// OPCODE_DOT_PRODUCT_4\n// ============================================================================\nstruct DOT_PRODUCT_4_V128\n    : Sequence<DOT_PRODUCT_4_V128,\n               I<OPCODE_DOT_PRODUCT_4, F32Op, V128Op, V128Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    // https://msdn.microsoft.com/en-us/library/bb514054(v=vs.90).aspx\n    EmitCommutativeBinaryXmmOp(\n        e, i, [](X64Emitter& e, Xmm dest, Xmm src1, Xmm src2) {\n          DOT_PRODUCT_V128::Emit(e, dest, src1, src2, 0b11110001);\n        });\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_DOT_PRODUCT_4, DOT_PRODUCT_4_V128);\n\n// ============================================================================\n// OPCODE_AND\n// ============================================================================\n// TODO(benvanik): put dest/src1|2 together.\ntemplate <typename SEQ, typename REG, typename ARGS>\nvoid EmitAndXX(X64Emitter& e, const ARGS& i) {\n  SEQ::EmitCommutativeBinaryOp(\n      e, i,\n      [](X64Emitter& e, const REG& dest_src, const REG& src) {\n        e.and_(dest_src, src);\n      },\n      [](X64Emitter& e, const REG& dest_src, int32_t constant) {\n        e.and_(dest_src, constant);\n      });\n}\nstruct AND_I8 : Sequence<AND_I8, I<OPCODE_AND, I8Op, I8Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitAndXX<AND_I8, Reg8>(e, i);\n  }\n};\nstruct AND_I16 : Sequence<AND_I16, I<OPCODE_AND, I16Op, I16Op, I16Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitAndXX<AND_I16, Reg16>(e, i);\n  }\n};\nstruct AND_I32 : Sequence<AND_I32, I<OPCODE_AND, I32Op, I32Op, I32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitAndXX<AND_I32, Reg32>(e, i);\n  }\n};\nstruct AND_I64 : Sequence<AND_I64, I<OPCODE_AND, I64Op, I64Op, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitAndXX<AND_I64, Reg64>(e, i);\n  }\n};\nstruct AND_V128 : Sequence<AND_V128, I<OPCODE_AND, V128Op, V128Op, V128Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitCommutativeBinaryXmmOp(e, i,\n                               [](X64Emitter& e, Xmm dest, Xmm src1, Xmm src2) {\n                                 e.vpand(dest, src1, src2);\n                               });\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_AND, AND_I8, AND_I16, AND_I32, AND_I64, AND_V128);\n\n// ============================================================================\n// OPCODE_AND_NOT\n// ============================================================================\ntemplate <typename SEQ, typename REG, typename ARGS>\nvoid EmitAndNotXX(X64Emitter& e, const ARGS& i) {\n  if (i.src1.is_constant) {\n    // src1 constant.\n    // `and` instruction only supports up to 32-bit immediate constants\n    // 64-bit constants will need a temp register\n    if (i.dest.reg().getBit() == 64) {\n      auto temp = GetTempReg<typename decltype(i.src1)::reg_type>(e);\n      e.mov(temp, i.src1.constant());\n\n      if (e.IsFeatureEnabled(kX64EmitBMI1)) {\n        if (i.dest.reg().getBit() == 64) {\n          e.andn(i.dest.reg().cvt64(), i.src2.reg().cvt64(), temp.cvt64());\n        } else {\n          e.andn(i.dest.reg().cvt32(), i.src2.reg().cvt32(), temp.cvt32());\n        }\n      } else {\n        e.mov(i.dest, i.src2);\n        e.not_(i.dest);\n        e.and_(i.dest, temp);\n      }\n    } else {\n      e.mov(i.dest, i.src2);\n      e.not_(i.dest);\n      e.and_(i.dest, uint32_t(i.src1.constant()));\n    }\n  } else if (i.src2.is_constant) {\n    // src2 constant.\n    if (i.dest == i.src1) {\n      auto temp = GetTempReg<typename decltype(i.src2)::reg_type>(e);\n      e.mov(temp, ~i.src2.constant());\n      e.and_(i.dest, temp);\n    } else {\n      e.mov(i.dest, i.src1);\n      auto temp = GetTempReg<typename decltype(i.src2)::reg_type>(e);\n      e.mov(temp, ~i.src2.constant());\n      e.and_(i.dest, temp);\n    }\n  } else {\n    // neither are constant\n    if (e.IsFeatureEnabled(kX64EmitBMI1)) {\n      if (i.dest.reg().getBit() == 64) {\n        e.andn(i.dest.reg().cvt64(), i.src2.reg().cvt64(),\n               i.src1.reg().cvt64());\n      } else {\n        e.andn(i.dest.reg().cvt32(), i.src2.reg().cvt32(),\n               i.src1.reg().cvt32());\n      }\n    } else {\n      if (i.dest == i.src2) {\n        e.not_(i.dest);\n        e.and_(i.dest, i.src1);\n      } else if (i.dest == i.src1) {\n        auto temp = GetTempReg<typename decltype(i.dest)::reg_type>(e);\n        e.mov(temp, i.src2);\n        e.not_(temp);\n        e.and_(i.dest, temp);\n      } else {\n        e.mov(i.dest, i.src2);\n        e.not_(i.dest);\n        e.and_(i.dest, i.src1);\n      }\n    }\n  }\n}\nstruct AND_NOT_I8 : Sequence<AND_NOT_I8, I<OPCODE_AND_NOT, I8Op, I8Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitAndNotXX<AND_NOT_I8, Reg8>(e, i);\n  }\n};\nstruct AND_NOT_I16\n    : Sequence<AND_NOT_I16, I<OPCODE_AND_NOT, I16Op, I16Op, I16Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitAndNotXX<AND_NOT_I16, Reg16>(e, i);\n  }\n};\nstruct AND_NOT_I32\n    : Sequence<AND_NOT_I32, I<OPCODE_AND_NOT, I32Op, I32Op, I32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitAndNotXX<AND_NOT_I32, Reg32>(e, i);\n  }\n};\nstruct AND_NOT_I64\n    : Sequence<AND_NOT_I64, I<OPCODE_AND_NOT, I64Op, I64Op, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitAndNotXX<AND_NOT_I64, Reg64>(e, i);\n  }\n};\nstruct AND_NOT_V128\n    : Sequence<AND_NOT_V128, I<OPCODE_AND_NOT, V128Op, V128Op, V128Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitCommutativeBinaryXmmOp(e, i,\n                               [](X64Emitter& e, Xmm dest, Xmm src1, Xmm src2) {\n                                 e.vpandn(dest, src2, src1);\n                               });\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_AND_NOT, AND_NOT_I8, AND_NOT_I16, AND_NOT_I32,\n                     AND_NOT_I64, AND_NOT_V128);\n\n// ============================================================================\n// OPCODE_OR\n// ============================================================================\n// TODO(benvanik): put dest/src1|2 together.\ntemplate <typename SEQ, typename REG, typename ARGS>\nvoid EmitOrXX(X64Emitter& e, const ARGS& i) {\n  SEQ::EmitCommutativeBinaryOp(\n      e, i,\n      [](X64Emitter& e, const REG& dest_src, const REG& src) {\n        e.or_(dest_src, src);\n      },\n      [](X64Emitter& e, const REG& dest_src, int32_t constant) {\n        e.or_(dest_src, constant);\n      });\n}\nstruct OR_I8 : Sequence<OR_I8, I<OPCODE_OR, I8Op, I8Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitOrXX<OR_I8, Reg8>(e, i);\n  }\n};\nstruct OR_I16 : Sequence<OR_I16, I<OPCODE_OR, I16Op, I16Op, I16Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitOrXX<OR_I16, Reg16>(e, i);\n  }\n};\nstruct OR_I32 : Sequence<OR_I32, I<OPCODE_OR, I32Op, I32Op, I32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitOrXX<OR_I32, Reg32>(e, i);\n  }\n};\nstruct OR_I64 : Sequence<OR_I64, I<OPCODE_OR, I64Op, I64Op, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitOrXX<OR_I64, Reg64>(e, i);\n  }\n};\nstruct OR_V128 : Sequence<OR_V128, I<OPCODE_OR, V128Op, V128Op, V128Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitCommutativeBinaryXmmOp(e, i,\n                               [](X64Emitter& e, Xmm dest, Xmm src1, Xmm src2) {\n                                 e.vpor(dest, src1, src2);\n                               });\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_OR, OR_I8, OR_I16, OR_I32, OR_I64, OR_V128);\n\n// ============================================================================\n// OPCODE_XOR\n// ============================================================================\n// TODO(benvanik): put dest/src1|2 together.\ntemplate <typename SEQ, typename REG, typename ARGS>\nvoid EmitXorXX(X64Emitter& e, const ARGS& i) {\n  SEQ::EmitCommutativeBinaryOp(\n      e, i,\n      [](X64Emitter& e, const REG& dest_src, const REG& src) {\n        e.xor_(dest_src, src);\n      },\n      [](X64Emitter& e, const REG& dest_src, int32_t constant) {\n        e.xor_(dest_src, constant);\n      });\n}\nstruct XOR_I8 : Sequence<XOR_I8, I<OPCODE_XOR, I8Op, I8Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitXorXX<XOR_I8, Reg8>(e, i);\n  }\n};\nstruct XOR_I16 : Sequence<XOR_I16, I<OPCODE_XOR, I16Op, I16Op, I16Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitXorXX<XOR_I16, Reg16>(e, i);\n  }\n};\nstruct XOR_I32 : Sequence<XOR_I32, I<OPCODE_XOR, I32Op, I32Op, I32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitXorXX<XOR_I32, Reg32>(e, i);\n  }\n};\nstruct XOR_I64 : Sequence<XOR_I64, I<OPCODE_XOR, I64Op, I64Op, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitXorXX<XOR_I64, Reg64>(e, i);\n  }\n};\nstruct XOR_V128 : Sequence<XOR_V128, I<OPCODE_XOR, V128Op, V128Op, V128Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitCommutativeBinaryXmmOp(e, i,\n                               [](X64Emitter& e, Xmm dest, Xmm src1, Xmm src2) {\n                                 e.vpxor(dest, src1, src2);\n                               });\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_XOR, XOR_I8, XOR_I16, XOR_I32, XOR_I64, XOR_V128);\n\n// ============================================================================\n// OPCODE_NOT\n// ============================================================================\n// TODO(benvanik): put dest/src1 together.\ntemplate <typename SEQ, typename REG, typename ARGS>\nvoid EmitNotXX(X64Emitter& e, const ARGS& i) {\n  SEQ::EmitUnaryOp(\n      e, i, [](X64Emitter& e, const REG& dest_src) { e.not_(dest_src); });\n}\nstruct NOT_I8 : Sequence<NOT_I8, I<OPCODE_NOT, I8Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitNotXX<NOT_I8, Reg8>(e, i);\n  }\n};\nstruct NOT_I16 : Sequence<NOT_I16, I<OPCODE_NOT, I16Op, I16Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitNotXX<NOT_I16, Reg16>(e, i);\n  }\n};\nstruct NOT_I32 : Sequence<NOT_I32, I<OPCODE_NOT, I32Op, I32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitNotXX<NOT_I32, Reg32>(e, i);\n  }\n};\nstruct NOT_I64 : Sequence<NOT_I64, I<OPCODE_NOT, I64Op, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitNotXX<NOT_I64, Reg64>(e, i);\n  }\n};\nstruct NOT_V128 : Sequence<NOT_V128, I<OPCODE_NOT, V128Op, V128Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    if (e.IsFeatureEnabled(kX64EmitAVX512Ortho)) {\n      e.vpternlogd(i.dest, i.src1, i.src1, 0b01010101);\n      return;\n    }\n    // dest = src ^ 0xFFFF...\n    e.vpxor(i.dest, i.src1, e.GetXmmConstPtr(XMMFFFF /* FF... */));\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_NOT, NOT_I8, NOT_I16, NOT_I32, NOT_I64, NOT_V128);\n\n// ============================================================================\n// OPCODE_SHL\n// ============================================================================\n// TODO(benvanik): optimize common shifts.\ntemplate <typename SEQ, typename REG, typename ARGS>\nvoid EmitShlXX(X64Emitter& e, const ARGS& i) {\n  SEQ::EmitAssociativeBinaryOp(\n      e, i,\n      [](X64Emitter& e, const REG& dest_src, const Reg8& src) {\n        // shlx: $1 = $2 << $3\n        // shl: $1 = $1 << $2\n        if (e.IsFeatureEnabled(kX64EmitBMI2)) {\n          if (dest_src.getBit() == 64) {\n            e.shlx(dest_src.cvt64(), dest_src.cvt64(), src.cvt64());\n          } else {\n            e.shlx(dest_src.cvt32(), dest_src.cvt32(), src.cvt32());\n          }\n        } else {\n          e.mov(e.cl, src);\n          e.shl(dest_src, e.cl);\n        }\n      },\n      [](X64Emitter& e, const REG& dest_src, int8_t constant) {\n        e.shl(dest_src, constant);\n      });\n}\nstruct SHL_I8 : Sequence<SHL_I8, I<OPCODE_SHL, I8Op, I8Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitShlXX<SHL_I8, Reg8>(e, i);\n  }\n};\nstruct SHL_I16 : Sequence<SHL_I16, I<OPCODE_SHL, I16Op, I16Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitShlXX<SHL_I16, Reg16>(e, i);\n  }\n};\nstruct SHL_I32 : Sequence<SHL_I32, I<OPCODE_SHL, I32Op, I32Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitShlXX<SHL_I32, Reg32>(e, i);\n  }\n};\nstruct SHL_I64 : Sequence<SHL_I64, I<OPCODE_SHL, I64Op, I64Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitShlXX<SHL_I64, Reg64>(e, i);\n  }\n};\nstruct SHL_V128 : Sequence<SHL_V128, I<OPCODE_SHL, V128Op, V128Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    // TODO(benvanik): native version (with shift magic).\n    if (i.src2.is_constant) {\n      e.mov(e.GetNativeParam(1), i.src2.constant());\n    } else {\n      e.mov(e.GetNativeParam(1), i.src2);\n    }\n    e.lea(e.GetNativeParam(0), e.StashXmm(0, i.src1));\n    e.CallNativeSafe(reinterpret_cast<void*>(EmulateShlV128));\n    e.vmovaps(i.dest, e.xmm0);\n  }\n  static __m128i EmulateShlV128(void*, __m128i src1, uint8_t src2) {\n    // Almost all instances are shamt = 1, but non-constant.\n    // shamt is [0,7]\n    uint8_t shamt = src2 & 0x7;\n    alignas(16) vec128_t value;\n    _mm_store_si128(reinterpret_cast<__m128i*>(&value), src1);\n    for (int i = 0; i < 15; ++i) {\n      value.u8[i ^ 0x3] = (value.u8[i ^ 0x3] << shamt) |\n                          (value.u8[(i + 1) ^ 0x3] >> (8 - shamt));\n    }\n    value.u8[15 ^ 0x3] = value.u8[15 ^ 0x3] << shamt;\n    return _mm_load_si128(reinterpret_cast<__m128i*>(&value));\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_SHL, SHL_I8, SHL_I16, SHL_I32, SHL_I64, SHL_V128);\n\n// ============================================================================\n// OPCODE_SHR\n// ============================================================================\n// TODO(benvanik): optimize common shifts.\ntemplate <typename SEQ, typename REG, typename ARGS>\nvoid EmitShrXX(X64Emitter& e, const ARGS& i) {\n  SEQ::EmitAssociativeBinaryOp(\n      e, i,\n      [](X64Emitter& e, const REG& dest_src, const Reg8& src) {\n        // shrx: op1 dest, op2 src, op3 count\n        // shr: op1 src/dest, op2 count\n        if (e.IsFeatureEnabled(kX64EmitBMI2)) {\n          if (dest_src.getBit() == 64) {\n            e.shrx(dest_src.cvt64(), dest_src.cvt64(), src.cvt64());\n          } else if (dest_src.getBit() == 32) {\n            e.shrx(dest_src.cvt32(), dest_src.cvt32(), src.cvt32());\n          } else {\n            e.movzx(dest_src.cvt32(), dest_src);\n            e.shrx(dest_src.cvt32(), dest_src.cvt32(), src.cvt32());\n          }\n        } else {\n          e.mov(e.cl, src);\n          e.shr(dest_src, e.cl);\n        }\n      },\n      [](X64Emitter& e, const REG& dest_src, int8_t constant) {\n        e.shr(dest_src, constant);\n      });\n}\nstruct SHR_I8 : Sequence<SHR_I8, I<OPCODE_SHR, I8Op, I8Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitShrXX<SHR_I8, Reg8>(e, i);\n  }\n};\nstruct SHR_I16 : Sequence<SHR_I16, I<OPCODE_SHR, I16Op, I16Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitShrXX<SHR_I16, Reg16>(e, i);\n  }\n};\nstruct SHR_I32 : Sequence<SHR_I32, I<OPCODE_SHR, I32Op, I32Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitShrXX<SHR_I32, Reg32>(e, i);\n  }\n};\nstruct SHR_I64 : Sequence<SHR_I64, I<OPCODE_SHR, I64Op, I64Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitShrXX<SHR_I64, Reg64>(e, i);\n  }\n};\nstruct SHR_V128 : Sequence<SHR_V128, I<OPCODE_SHR, V128Op, V128Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    // TODO(benvanik): native version (with shift magic).\n    if (i.src2.is_constant) {\n      e.mov(e.GetNativeParam(1), i.src2.constant());\n    } else {\n      e.mov(e.GetNativeParam(1), i.src2);\n    }\n    e.lea(e.GetNativeParam(0), e.StashXmm(0, i.src1));\n    e.CallNativeSafe(reinterpret_cast<void*>(EmulateShrV128));\n    e.vmovaps(i.dest, e.xmm0);\n  }\n  static __m128i EmulateShrV128(void*, __m128i src1, uint8_t src2) {\n    // Almost all instances are shamt = 1, but non-constant.\n    // shamt is [0,7]\n    uint8_t shamt = src2 & 0x7;\n    alignas(16) vec128_t value;\n    _mm_store_si128(reinterpret_cast<__m128i*>(&value), src1);\n    for (int i = 15; i > 0; --i) {\n      value.u8[i ^ 0x3] = (value.u8[i ^ 0x3] >> shamt) |\n                          (value.u8[(i - 1) ^ 0x3] << (8 - shamt));\n    }\n    value.u8[0 ^ 0x3] = value.u8[0 ^ 0x3] >> shamt;\n    return _mm_load_si128(reinterpret_cast<__m128i*>(&value));\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_SHR, SHR_I8, SHR_I16, SHR_I32, SHR_I64, SHR_V128);\n\n// ============================================================================\n// OPCODE_SHA\n// ============================================================================\n// TODO(benvanik): optimize common shifts.\ntemplate <typename SEQ, typename REG, typename ARGS>\nvoid EmitSarXX(X64Emitter& e, const ARGS& i) {\n  SEQ::EmitAssociativeBinaryOp(\n      e, i,\n      [](X64Emitter& e, const REG& dest_src, const Reg8& src) {\n        if (e.IsFeatureEnabled(kX64EmitBMI2)) {\n          if (dest_src.getBit() == 64) {\n            e.sarx(dest_src.cvt64(), dest_src.cvt64(), src.cvt64());\n          } else if (dest_src.getBit() == 32) {\n            e.sarx(dest_src.cvt32(), dest_src.cvt32(), src.cvt32());\n          } else {\n            e.movsx(dest_src.cvt32(), dest_src);\n            e.sarx(dest_src.cvt32(), dest_src.cvt32(), src.cvt32());\n          }\n        } else {\n          e.mov(e.cl, src);\n          e.sar(dest_src, e.cl);\n        }\n      },\n      [](X64Emitter& e, const REG& dest_src, int8_t constant) {\n        e.sar(dest_src, constant);\n      });\n}\nstruct SHA_I8 : Sequence<SHA_I8, I<OPCODE_SHA, I8Op, I8Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitSarXX<SHA_I8, Reg8>(e, i);\n  }\n};\nstruct SHA_I16 : Sequence<SHA_I16, I<OPCODE_SHA, I16Op, I16Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitSarXX<SHA_I16, Reg16>(e, i);\n  }\n};\nstruct SHA_I32 : Sequence<SHA_I32, I<OPCODE_SHA, I32Op, I32Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitSarXX<SHA_I32, Reg32>(e, i);\n  }\n};\nstruct SHA_I64 : Sequence<SHA_I64, I<OPCODE_SHA, I64Op, I64Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitSarXX<SHA_I64, Reg64>(e, i);\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_SHA, SHA_I8, SHA_I16, SHA_I32, SHA_I64);\n\n// ============================================================================\n// OPCODE_ROTATE_LEFT\n// ============================================================================\n// TODO(benvanik): put dest/src1 together, src2 in cl.\ntemplate <typename SEQ, typename REG, typename ARGS>\nvoid EmitRotateLeftXX(X64Emitter& e, const ARGS& i) {\n  if (i.src2.is_constant) {\n    // Constant rotate.\n    if (i.dest != i.src1) {\n      if (i.src1.is_constant) {\n        e.mov(i.dest, i.src1.constant());\n      } else {\n        e.mov(i.dest, i.src1);\n      }\n    }\n    e.rol(i.dest, i.src2.constant());\n  } else {\n    // Variable rotate.\n    if (i.src2.reg().getIdx() != e.cl.getIdx()) {\n      e.mov(e.cl, i.src2);\n    }\n    if (i.dest != i.src1) {\n      if (i.src1.is_constant) {\n        e.mov(i.dest, i.src1.constant());\n      } else {\n        e.mov(i.dest, i.src1);\n      }\n    }\n    e.rol(i.dest, e.cl);\n  }\n}\nstruct ROTATE_LEFT_I8\n    : Sequence<ROTATE_LEFT_I8, I<OPCODE_ROTATE_LEFT, I8Op, I8Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitRotateLeftXX<ROTATE_LEFT_I8, Reg8>(e, i);\n  }\n};\nstruct ROTATE_LEFT_I16\n    : Sequence<ROTATE_LEFT_I16, I<OPCODE_ROTATE_LEFT, I16Op, I16Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitRotateLeftXX<ROTATE_LEFT_I16, Reg16>(e, i);\n  }\n};\nstruct ROTATE_LEFT_I32\n    : Sequence<ROTATE_LEFT_I32, I<OPCODE_ROTATE_LEFT, I32Op, I32Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitRotateLeftXX<ROTATE_LEFT_I32, Reg32>(e, i);\n  }\n};\nstruct ROTATE_LEFT_I64\n    : Sequence<ROTATE_LEFT_I64, I<OPCODE_ROTATE_LEFT, I64Op, I64Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitRotateLeftXX<ROTATE_LEFT_I64, Reg64>(e, i);\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_ROTATE_LEFT, ROTATE_LEFT_I8, ROTATE_LEFT_I16,\n                     ROTATE_LEFT_I32, ROTATE_LEFT_I64);\n\n// ============================================================================\n// OPCODE_BYTE_SWAP\n// ============================================================================\n// TODO(benvanik): put dest/src1 together.\nstruct BYTE_SWAP_I16\n    : Sequence<BYTE_SWAP_I16, I<OPCODE_BYTE_SWAP, I16Op, I16Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitUnaryOp(\n        e, i, [](X64Emitter& e, const Reg16& dest_src) { e.ror(dest_src, 8); });\n  }\n};\nstruct BYTE_SWAP_I32\n    : Sequence<BYTE_SWAP_I32, I<OPCODE_BYTE_SWAP, I32Op, I32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitUnaryOp(\n        e, i, [](X64Emitter& e, const Reg32& dest_src) { e.bswap(dest_src); });\n  }\n};\nstruct BYTE_SWAP_I64\n    : Sequence<BYTE_SWAP_I64, I<OPCODE_BYTE_SWAP, I64Op, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    EmitUnaryOp(\n        e, i, [](X64Emitter& e, const Reg64& dest_src) { e.bswap(dest_src); });\n  }\n};\nstruct BYTE_SWAP_V128\n    : Sequence<BYTE_SWAP_V128, I<OPCODE_BYTE_SWAP, V128Op, V128Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    // TODO(benvanik): find a way to do this without the memory load.\n    e.vpshufb(i.dest, i.src1, e.GetXmmConstPtr(XMMByteSwapMask));\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_BYTE_SWAP, BYTE_SWAP_I16, BYTE_SWAP_I32,\n                     BYTE_SWAP_I64, BYTE_SWAP_V128);\n\n// ============================================================================\n// OPCODE_CNTLZ\n// Count leading zeroes\n// ============================================================================\nstruct CNTLZ_I8 : Sequence<CNTLZ_I8, I<OPCODE_CNTLZ, I8Op, I8Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    if (e.IsFeatureEnabled(kX64EmitLZCNT)) {\n      // No 8bit lzcnt, so do 16 and sub 8.\n      e.movzx(i.dest.reg().cvt16(), i.src1);\n      e.lzcnt(i.dest.reg().cvt16(), i.dest.reg().cvt16());\n      e.sub(i.dest, 8);\n    } else {\n      Xbyak::Label end;\n      e.inLocalLabel();\n\n      e.bsr(e.rax, i.src1);  // ZF set if i.src1 is 0\n      e.mov(i.dest, 0x8);\n      e.jz(end);\n\n      e.xor_(e.rax, 0x7);\n      e.mov(i.dest, e.rax);\n\n      e.L(end);\n      e.outLocalLabel();\n    }\n  }\n};\nstruct CNTLZ_I16 : Sequence<CNTLZ_I16, I<OPCODE_CNTLZ, I8Op, I16Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    if (e.IsFeatureEnabled(kX64EmitLZCNT)) {\n      // LZCNT: searches $2 until MSB 1 found, stores idx (from last bit) in $1\n      e.lzcnt(i.dest.reg().cvt32(), i.src1);\n    } else {\n      Xbyak::Label end;\n      e.inLocalLabel();\n\n      e.bsr(e.rax, i.src1);  // ZF set if i.src1 is 0\n      e.mov(i.dest, 0x10);\n      e.jz(end);\n\n      e.xor_(e.rax, 0x0F);\n      e.mov(i.dest, e.rax);\n\n      e.L(end);\n      e.outLocalLabel();\n    }\n  }\n};\nstruct CNTLZ_I32 : Sequence<CNTLZ_I32, I<OPCODE_CNTLZ, I8Op, I32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    if (e.IsFeatureEnabled(kX64EmitLZCNT)) {\n      e.lzcnt(i.dest.reg().cvt32(), i.src1);\n    } else {\n      Xbyak::Label end;\n      e.inLocalLabel();\n\n      e.bsr(e.rax, i.src1);  // ZF set if i.src1 is 0\n      e.mov(i.dest, 0x20);\n      e.jz(end);\n\n      e.xor_(e.rax, 0x1F);\n      e.mov(i.dest, e.rax);\n\n      e.L(end);\n      e.outLocalLabel();\n    }\n  }\n};\nstruct CNTLZ_I64 : Sequence<CNTLZ_I64, I<OPCODE_CNTLZ, I8Op, I64Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    if (e.IsFeatureEnabled(kX64EmitLZCNT)) {\n      e.lzcnt(i.dest.reg().cvt64(), i.src1);\n    } else {\n      Xbyak::Label end;\n      e.inLocalLabel();\n\n      e.bsr(e.rax, i.src1);  // ZF set if i.src1 is 0\n      e.mov(i.dest, 0x40);\n      e.jz(end);\n\n      e.xor_(e.rax, 0x3F);\n      e.mov(i.dest, e.rax);\n\n      e.L(end);\n      e.outLocalLabel();\n    }\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_CNTLZ, CNTLZ_I8, CNTLZ_I16, CNTLZ_I32, CNTLZ_I64);\n\n// ============================================================================\n// OPCODE_SET_ROUNDING_MODE\n// ============================================================================\n// Input: FPSCR (PPC format)\nstatic const uint32_t mxcsr_table[] = {\n    0x1F80, 0x7F80, 0x5F80, 0x3F80, 0x9F80, 0xFF80, 0xDF80, 0xBF80,\n};\nstruct SET_ROUNDING_MODE_I32\n    : Sequence<SET_ROUNDING_MODE_I32,\n               I<OPCODE_SET_ROUNDING_MODE, VoidOp, I32Op>> {\n  static void Emit(X64Emitter& e, const EmitArgType& i) {\n    e.mov(e.rcx, i.src1);\n    e.and_(e.rcx, 0x7);\n    e.mov(e.rax, uintptr_t(mxcsr_table));\n    e.vldmxcsr(e.ptr[e.rax + e.rcx * 4]);\n  }\n};\nEMITTER_OPCODE_TABLE(OPCODE_SET_ROUNDING_MODE, SET_ROUNDING_MODE_I32);\n\n// Include anchors to other sequence sources so they get included in the build.\nextern volatile int anchor_control;\nstatic int anchor_control_dest = anchor_control;\n\nextern volatile int anchor_memory;\nstatic int anchor_memory_dest = anchor_memory;\n\nextern volatile int anchor_vector;\nstatic int anchor_vector_dest = anchor_vector;\n\nbool SelectSequence(X64Emitter* e, const Instr* i, const Instr** new_tail) {\n  const InstrKey key(i);\n  auto it = sequence_table.find(key);\n  if (it != sequence_table.end()) {\n    if (it->second(*e, i)) {\n      *new_tail = i->next;\n      return true;\n    }\n  }\n  XELOGE(\"No sequence match for variant {}\", i->opcode->name);\n  return false;\n}\n\n}  // namespace x64\n}  // namespace backend\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/backend/x64/x64_sequences.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_BACKEND_X64_X64_SEQUENCES_H_\n#define XENIA_CPU_BACKEND_X64_X64_SEQUENCES_H_\n\n#include \"xenia/cpu/hir/instr.h\"\n\n#include <unordered_map>\n\nnamespace xe {\nnamespace cpu {\nnamespace backend {\nnamespace x64 {\n\nclass X64Emitter;\n\ntypedef bool (*SequenceSelectFn)(X64Emitter&, const hir::Instr*);\nextern std::unordered_map<uint32_t, SequenceSelectFn> sequence_table;\n\ntemplate <typename T>\nbool Register() {\n  sequence_table.insert({T::head_key(), T::Select});\n  return true;\n}\n\ntemplate <typename T, typename Tn, typename... Ts>\nstatic bool Register() {\n  bool b = true;\n  b = b && Register<T>();          // Call the above function\n  b = b && Register<Tn, Ts...>();  // Call ourself again (recursively)\n  return b;\n}\n#define EMITTER_OPCODE_TABLE(name, ...) \\\n  const auto X64_INSTR_##name = Register<__VA_ARGS__>();\n\nbool SelectSequence(X64Emitter* e, const hir::Instr* i,\n                    const hir::Instr** new_tail);\n\n}  // namespace x64\n}  // namespace backend\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_BACKEND_X64_X64_SEQUENCES_H_\n"
  },
  {
    "path": "src/xenia/cpu/backend/x64/x64_stack_layout.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2015 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_BACKEND_X64_X64_STACK_LAYOUT_H_\n#define XENIA_CPU_BACKEND_X64_X64_STACK_LAYOUT_H_\n\n#include \"xenia/base/vec128.h\"\n#include \"xenia/cpu/backend/x64/x64_backend.h\"\n#include \"xenia/cpu/backend/x64/x64_emitter.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace backend {\nnamespace x64 {\n\nclass StackLayout {\n public:\n  /**\n   * Stack Layout\n   * ----------------------------\n   * NOTE: stack must always be 16b aligned.\n   *\n   * Thunk stack:\n   *      Non-Volatile         Volatile\n   *  +------------------+------------------+\n   *  | arg temp, 3 * 8  | arg temp, 3 * 8  | rsp + 0x000\n   *  |                  |                  |\n   *  |                  |                  |\n   *  +------------------+------------------+\n   *  | rbx              | (unused)         | rsp + 0x018\n   *  +------------------+------------------+\n   *  | rbp              | rcx              | rsp + 0x020\n   *  +------------------+------------------+\n   *  | rcx (Win32)      | rdx              | rsp + 0x028\n   *  +------------------+------------------+\n   *  | rsi (Win32)      | rsi (Linux)      | rsp + 0x030\n   *  +------------------+------------------+\n   *  | rdi (Win32)      | rdi (Linux)      | rsp + 0x038\n   *  +------------------+------------------+\n   *  | r12              | r8               | rsp + 0x040\n   *  +------------------+------------------+\n   *  | r13              | r9               | rsp + 0x048\n   *  +------------------+------------------+\n   *  | r14              | r10              | rsp + 0x050\n   *  +------------------+------------------+\n   *  | r15              | r11              | rsp + 0x058\n   *  +------------------+------------------+\n   *  | xmm6 (Win32)     | (unused)         | rsp + 0x060\n   *  |                  |                  |\n   *  +------------------+------------------+\n   *  | xmm7 (Win32)     | xmm1             | rsp + 0x070\n   *  |                  |                  |\n   *  +------------------+------------------+\n   *  | xmm8 (Win32)     | xmm2             | rsp + 0x080\n   *  |                  |                  |\n   *  +------------------+------------------+\n   *  | xmm9 (Win32)     | xmm3             | rsp + 0x090\n   *  |                  |                  |\n   *  +------------------+------------------+\n   *  | xmm10 (Win32)    | xmm4             | rsp + 0x0A0\n   *  |                  |                  |\n   *  +------------------+------------------+\n   *  | xmm11 (Win32)    | xmm5             | rsp + 0x0B0\n   *  |                  |                  |\n   *  +------------------+------------------+\n   *  | xmm12 (Win32)    | (unused)         | rsp + 0x0C0\n   *  |                  |                  |\n   *  +------------------+------------------+\n   *  | xmm13 (Win32)    | (unused)         | rsp + 0x0D0\n   *  |                  |                  |\n   *  +------------------+------------------+\n   *  | xmm14 (Win32)    | (unused)         | rsp + 0x0E0\n   *  |                  |                  |\n   *  +------------------+------------------+\n   *  | xmm15 (Win32)    | (unused)         | rsp + 0x0F0\n   *  |                  |                  |\n   *  +------------------+------------------+\n   *  | (return address) | (return address) | rsp + 0x100\n   *  +------------------+------------------+\n   *  | (rcx home)       | (rcx home)       | rsp + 0x108\n   *  +------------------+------------------+\n   *  | (rdx home)       | (rdx home)       | rsp + 0x110\n   *  +------------------+------------------+\n   */\n  XEPACKEDSTRUCT(Thunk, {\n    uint64_t arg_temp[3];\n    uint64_t r[9];\n    vec128_t xmm[10];\n  });\n  static_assert(sizeof(Thunk) % 16 == 0,\n                \"sizeof(Thunk) must be a multiple of 16!\");\n  static const size_t THUNK_STACK_SIZE = sizeof(Thunk) + 8;\n\n  /**\n   *\n   *\n   * Guest stack:\n   *  +------------------+\n   *  | arg temp, 3 * 8  | rsp + 0\n   *  |                  |\n   *  |                  |\n   *  +------------------+\n   *  | scratch, 48b     | rsp + 32\n   *  |                  |\n   *  +------------------+\n   *  | rcx / context    | rsp + 80\n   *  +------------------+\n   *  | guest ret addr   | rsp + 88\n   *  +------------------+\n   *  | call ret addr    | rsp + 96\n   *  +------------------+\n   *    ... locals ...\n   *  +------------------+\n   *  | (return address) |\n   *  +------------------+\n   *\n   */\n  static const size_t GUEST_STACK_SIZE = 104;\n  static const size_t GUEST_CTX_HOME = 80;\n  static const size_t GUEST_RET_ADDR = 88;\n  static const size_t GUEST_CALL_RET_ADDR = 96;\n};\n\n}  // namespace x64\n}  // namespace backend\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_BACKEND_X64_X64_STACK_LAYOUT_H_\n"
  },
  {
    "path": "src/xenia/cpu/backend/x64/x64_tracers.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/backend/x64/x64_tracers.h\"\n\n#include <cinttypes>\n\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/vec128.h\"\n#include \"xenia/cpu/backend/x64/x64_emitter.h\"\n#include \"xenia/cpu/processor.h\"\n#include \"xenia/cpu/thread_state.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace backend {\nnamespace x64 {\n\n#define ITRACE 0\n#define DTRACE 0\n\n#define TARGET_THREAD 0\n\nbool trace_enabled = true;\n\n#define THREAD_MATCH \\\n  (!TARGET_THREAD || thread_state->thread_id() == TARGET_THREAD)\n#define IFLUSH()\n#define IPRINT(s)                    \\\n  if (trace_enabled && THREAD_MATCH) \\\n  xe::logging::AppendLogLine(xe::LogLevel::Debug, 't', s)\n#define DFLUSH()\n#define DPRINT(...)                  \\\n  if (trace_enabled && THREAD_MATCH) \\\n  xe::logging::AppendLogLineFormat(xe::LogLevel::Debug, 't', __VA_ARGS__)\n\nuint32_t GetTracingMode() {\n  uint32_t mode = 0;\n#if ITRACE\n  mode |= TRACING_INSTR;\n#endif  // ITRACE\n#if DTRACE\n  mode |= TRACING_DATA;\n#endif  // DTRACE\n  return mode;\n}\n\nvoid TraceString(void* raw_context, const char* str) {\n  auto thread_state = *reinterpret_cast<ThreadState**>(raw_context);\n  IPRINT(str);\n  IFLUSH();\n}\n\nvoid TraceContextLoadI8(void* raw_context, uint64_t offset, uint8_t value) {\n  auto thread_state = *reinterpret_cast<ThreadState**>(raw_context);\n  DPRINT(\"{} ({:X}) = ctx i8 +{}\\n\", (int8_t)value, value, offset);\n}\nvoid TraceContextLoadI16(void* raw_context, uint64_t offset, uint16_t value) {\n  auto thread_state = *reinterpret_cast<ThreadState**>(raw_context);\n  DPRINT(\"{} ({:X}) = ctx i16 +{}\\n\", (int16_t)value, value, offset);\n}\nvoid TraceContextLoadI32(void* raw_context, uint64_t offset, uint32_t value) {\n  auto thread_state = *reinterpret_cast<ThreadState**>(raw_context);\n  DPRINT(\"{} ({:X}) = ctx i32 +{}\\n\", (int32_t)value, value, offset);\n}\nvoid TraceContextLoadI64(void* raw_context, uint64_t offset, uint64_t value) {\n  auto thread_state = *reinterpret_cast<ThreadState**>(raw_context);\n  DPRINT(\"{} ({:X}) = ctx i64 +{}\\n\", (int64_t)value, value, offset);\n}\nvoid TraceContextLoadF32(void* raw_context, uint64_t offset, __m128 value) {\n  auto thread_state = *reinterpret_cast<ThreadState**>(raw_context);\n  DPRINT(\"{} ({:X}) = ctx f32 +{}\\n\", xe::m128_f32<0>(value),\n         xe::m128_i32<0>(value), offset);\n}\nvoid TraceContextLoadF64(void* raw_context, uint64_t offset,\n                         const double* value) {\n  auto thread_state = *reinterpret_cast<ThreadState**>(raw_context);\n  auto v = _mm_loadu_pd(value);\n  DPRINT(\"{} ({:X}) = ctx f64 +{}\\n\", xe::m128_f64<0>(v), xe::m128_i64<0>(v),\n         offset);\n}\nvoid TraceContextLoadV128(void* raw_context, uint64_t offset, __m128 value) {\n  auto thread_state = *reinterpret_cast<ThreadState**>(raw_context);\n  DPRINT(\"[{}, {}, {}, {}] [{:08X}, {:08X}, {:08X}, {:08X}] = ctx v128 +{}\\n\",\n         xe::m128_f32<0>(value), xe::m128_f32<1>(value), xe::m128_f32<2>(value),\n         xe::m128_f32<3>(value), xe::m128_i32<0>(value), xe::m128_i32<1>(value),\n         xe::m128_i32<2>(value), xe::m128_i32<3>(value), offset);\n}\n\nvoid TraceContextStoreI8(void* raw_context, uint64_t offset, uint8_t value) {\n  auto thread_state = *reinterpret_cast<ThreadState**>(raw_context);\n  DPRINT(\"ctx i8 +{} = {} ({:X})\\n\", offset, (int8_t)value, value);\n}\nvoid TraceContextStoreI16(void* raw_context, uint64_t offset, uint16_t value) {\n  auto thread_state = *reinterpret_cast<ThreadState**>(raw_context);\n  DPRINT(\"ctx i16 +{} = {} ({:X})\\n\", offset, (int16_t)value, value);\n}\nvoid TraceContextStoreI32(void* raw_context, uint64_t offset, uint32_t value) {\n  auto thread_state = *reinterpret_cast<ThreadState**>(raw_context);\n  DPRINT(\"ctx i32 +{} = {} ({:X})\\n\", offset, (int32_t)value, value);\n}\nvoid TraceContextStoreI64(void* raw_context, uint64_t offset, uint64_t value) {\n  auto thread_state = *reinterpret_cast<ThreadState**>(raw_context);\n  DPRINT(\"ctx i64 +{} = {} ({:X})\\n\", offset, (int64_t)value, value);\n}\nvoid TraceContextStoreF32(void* raw_context, uint64_t offset, __m128 value) {\n  auto thread_state = *reinterpret_cast<ThreadState**>(raw_context);\n  DPRINT(\"ctx f32 +{} = {} ({:X})\\n\", offset, xe::m128_f32<0>(value),\n         xe::m128_i32<0>(value));\n}\nvoid TraceContextStoreF64(void* raw_context, uint64_t offset,\n                          const double* value) {\n  auto thread_state = *reinterpret_cast<ThreadState**>(raw_context);\n  auto v = _mm_loadu_pd(value);\n  DPRINT(\"ctx f64 +{} = {} ({:X})\\n\", offset, xe::m128_f64<0>(v),\n         xe::m128_i64<0>(v));\n}\nvoid TraceContextStoreV128(void* raw_context, uint64_t offset, __m128 value) {\n  auto thread_state = *reinterpret_cast<ThreadState**>(raw_context);\n  DPRINT(\"ctx v128 +{} = [{}, {}, {}, {}] [{:08X}, {:08X}, {:08X}, {:08X}]\\n\",\n         offset, xe::m128_f32<0>(value), xe::m128_f32<1>(value),\n         xe::m128_f32<2>(value), xe::m128_f32<3>(value), xe::m128_i32<0>(value),\n         xe::m128_i32<1>(value), xe::m128_i32<2>(value),\n         xe::m128_i32<3>(value));\n}\n\nvoid TraceMemoryLoadI8(void* raw_context, uint32_t address, uint8_t value) {\n  auto thread_state = *reinterpret_cast<ThreadState**>(raw_context);\n  DPRINT(\"{} ({:X}) = load.i8 {:08X}\\n\", (int8_t)value, value, address);\n}\nvoid TraceMemoryLoadI16(void* raw_context, uint32_t address, uint16_t value) {\n  auto thread_state = *reinterpret_cast<ThreadState**>(raw_context);\n  DPRINT(\"{} ({:X}) = load.i16 {:08X}\\n\", (int16_t)value, value, address);\n}\nvoid TraceMemoryLoadI32(void* raw_context, uint32_t address, uint32_t value) {\n  auto thread_state = *reinterpret_cast<ThreadState**>(raw_context);\n  DPRINT(\"{} ({:X}) = load.i32 {:08X}\\n\", (int32_t)value, value, address);\n}\nvoid TraceMemoryLoadI64(void* raw_context, uint32_t address, uint64_t value) {\n  auto thread_state = *reinterpret_cast<ThreadState**>(raw_context);\n  DPRINT(\"{} ({:X}) = load.i64 {:08X}\\n\", (int64_t)value, value, address);\n}\nvoid TraceMemoryLoadF32(void* raw_context, uint32_t address, __m128 value) {\n  auto thread_state = *reinterpret_cast<ThreadState**>(raw_context);\n  DPRINT(\"{} ({:X}) = load.f32 {:08X}\\n\", xe::m128_f32<0>(value),\n         xe::m128_i32<0>(value), address);\n}\nvoid TraceMemoryLoadF64(void* raw_context, uint32_t address, __m128 value) {\n  auto thread_state = *reinterpret_cast<ThreadState**>(raw_context);\n  DPRINT(\"{} ({:X}) = load.f64 {:08X}\\n\", xe::m128_f64<0>(value),\n         xe::m128_i64<0>(value), address);\n}\nvoid TraceMemoryLoadV128(void* raw_context, uint32_t address, __m128 value) {\n  auto thread_state = *reinterpret_cast<ThreadState**>(raw_context);\n  DPRINT(\n      \"[{}, {}, {}, {}] [{:08X}, {:08X}, {:08X}, {:08X}] = load.v128 {:08X}\\n\",\n      xe::m128_f32<0>(value), xe::m128_f32<1>(value), xe::m128_f32<2>(value),\n      xe::m128_f32<3>(value), xe::m128_i32<0>(value), xe::m128_i32<1>(value),\n      xe::m128_i32<2>(value), xe::m128_i32<3>(value), address);\n}\n\nvoid TraceMemoryStoreI8(void* raw_context, uint32_t address, uint8_t value) {\n  auto thread_state = *reinterpret_cast<ThreadState**>(raw_context);\n  DPRINT(\"store.i8 {:08X} = {} ({:X})\\n\", address, (int8_t)value, value);\n}\nvoid TraceMemoryStoreI16(void* raw_context, uint32_t address, uint16_t value) {\n  auto thread_state = *reinterpret_cast<ThreadState**>(raw_context);\n  DPRINT(\"store.i16 {:08X} = {} ({:X})\\n\", address, (int16_t)value, value);\n}\nvoid TraceMemoryStoreI32(void* raw_context, uint32_t address, uint32_t value) {\n  auto thread_state = *reinterpret_cast<ThreadState**>(raw_context);\n  DPRINT(\"store.i32 {:08X} = {} ({:X})\\n\", address, (int32_t)value, value);\n}\nvoid TraceMemoryStoreI64(void* raw_context, uint32_t address, uint64_t value) {\n  auto thread_state = *reinterpret_cast<ThreadState**>(raw_context);\n  DPRINT(\"store.i64 {:08X} = {} ({:X})\\n\", address, (int64_t)value, value);\n}\nvoid TraceMemoryStoreF32(void* raw_context, uint32_t address, __m128 value) {\n  auto thread_state = *reinterpret_cast<ThreadState**>(raw_context);\n  DPRINT(\"store.f32 {:08X} = {} ({:X})\\n\", address, xe::m128_f32<0>(value),\n         xe::m128_i32<0>(value));\n}\nvoid TraceMemoryStoreF64(void* raw_context, uint32_t address, __m128 value) {\n  auto thread_state = *reinterpret_cast<ThreadState**>(raw_context);\n  DPRINT(\"store.f64 {:08X} = {} ({:X})\\n\", address, xe::m128_f64<0>(value),\n         xe::m128_i64<0>(value));\n}\nvoid TraceMemoryStoreV128(void* raw_context, uint32_t address, __m128 value) {\n  auto thread_state = *reinterpret_cast<ThreadState**>(raw_context);\n  DPRINT(\n      \"store.v128 {:08X} = [{}, {}, {}, {}] [{:08X}, {:08X}, {:08X}, {:08X}]\\n\",\n      address, xe::m128_f32<0>(value), xe::m128_f32<1>(value),\n      xe::m128_f32<2>(value), xe::m128_f32<3>(value), xe::m128_i32<0>(value),\n      xe::m128_i32<1>(value), xe::m128_i32<2>(value), xe::m128_i32<3>(value));\n}\n\nvoid TraceMemset(void* raw_context, uint32_t address, uint8_t value,\n                 uint32_t length) {\n  auto thread_state = *reinterpret_cast<ThreadState**>(raw_context);\n  DPRINT(\"memset {:08X}-{:08X} ({}) = {:02X}\", address, address + length,\n         length, value);\n}\n\n}  // namespace x64\n}  // namespace backend\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/backend/x64/x64_tracers.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_BACKEND_X64_X64_TRACERS_H_\n#define XENIA_CPU_BACKEND_X64_X64_TRACERS_H_\n\n#include <xmmintrin.h>\n#include <cstdint>\n\nnamespace xe {\nnamespace cpu {\nnamespace backend {\nnamespace x64 {\nclass X64Emitter;\n\nenum TracingMode {\n  TRACING_INSTR = (1 << 1),\n  TRACING_DATA = (1 << 2),\n};\n\nuint32_t GetTracingMode();\ninline bool IsTracingInstr() { return (GetTracingMode() & TRACING_INSTR) != 0; }\ninline bool IsTracingData() { return (GetTracingMode() & TRACING_DATA) != 0; }\n\nvoid TraceString(void* raw_context, const char* str);\n\nvoid TraceContextLoadI8(void* raw_context, uint64_t offset, uint8_t value);\nvoid TraceContextLoadI16(void* raw_context, uint64_t offset, uint16_t value);\nvoid TraceContextLoadI32(void* raw_context, uint64_t offset, uint32_t value);\nvoid TraceContextLoadI64(void* raw_context, uint64_t offset, uint64_t value);\nvoid TraceContextLoadF32(void* raw_context, uint64_t offset, __m128 value);\nvoid TraceContextLoadF64(void* raw_context, uint64_t offset,\n                         const double* value);\nvoid TraceContextLoadV128(void* raw_context, uint64_t offset, __m128 value);\n\nvoid TraceContextStoreI8(void* raw_context, uint64_t offset, uint8_t value);\nvoid TraceContextStoreI16(void* raw_context, uint64_t offset, uint16_t value);\nvoid TraceContextStoreI32(void* raw_context, uint64_t offset, uint32_t value);\nvoid TraceContextStoreI64(void* raw_context, uint64_t offset, uint64_t value);\nvoid TraceContextStoreF32(void* raw_context, uint64_t offset, __m128 value);\nvoid TraceContextStoreF64(void* raw_context, uint64_t offset,\n                          const double* value);\nvoid TraceContextStoreV128(void* raw_context, uint64_t offset, __m128 value);\n\nvoid TraceMemoryLoadI8(void* raw_context, uint32_t address, uint8_t value);\nvoid TraceMemoryLoadI16(void* raw_context, uint32_t address, uint16_t value);\nvoid TraceMemoryLoadI32(void* raw_context, uint32_t address, uint32_t value);\nvoid TraceMemoryLoadI64(void* raw_context, uint32_t address, uint64_t value);\nvoid TraceMemoryLoadF32(void* raw_context, uint32_t address, __m128 value);\nvoid TraceMemoryLoadF64(void* raw_context, uint32_t address, __m128 value);\nvoid TraceMemoryLoadV128(void* raw_context, uint32_t address, __m128 value);\n\nvoid TraceMemoryStoreI8(void* raw_context, uint32_t address, uint8_t value);\nvoid TraceMemoryStoreI16(void* raw_context, uint32_t address, uint16_t value);\nvoid TraceMemoryStoreI32(void* raw_context, uint32_t address, uint32_t value);\nvoid TraceMemoryStoreI64(void* raw_context, uint32_t address, uint64_t value);\nvoid TraceMemoryStoreF32(void* raw_context, uint32_t address, __m128 value);\nvoid TraceMemoryStoreF64(void* raw_context, uint32_t address, __m128 value);\nvoid TraceMemoryStoreV128(void* raw_context, uint32_t address, __m128 value);\n\nvoid TraceMemset(void* raw_context, uint32_t address, uint8_t value,\n                 uint32_t length);\n\n}  // namespace x64\n}  // namespace backend\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_BACKEND_X64_X64_TRACERS_H_\n"
  },
  {
    "path": "src/xenia/cpu/backend/x64/x64_util.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_BACKEND_X64_X64_UTIL_H_\n#define XENIA_CPU_BACKEND_X64_X64_UTIL_H_\n\n#include \"xenia/base/vec128.h\"\n#include \"xenia/cpu/backend/x64/x64_backend.h\"\n#include \"xenia/cpu/backend/x64/x64_emitter.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace backend {\nnamespace x64 {\n\n// Used to generate ternary logic truth-tables for vpternlog\n// Use these to directly refer to terms and perform binary operations upon them\n// and the resulting value will be the ternary lookup table\n// ex:\n//  (TernaryOperand::a | ~TernaryOperand::b) & TernaryOperand::c\n//      = 0b10100010\n//      = 0xa2\n//  vpternlog a, b, c, 0xa2\n//\n//  ~(TernaryOperand::a ^ TernaryOperand::b) & TernaryOperand::c\n//      = 0b10000010\n//      = 0x82\n//  vpternlog a, b, c, 0x82\nnamespace TernaryOperand {\nconstexpr uint8_t a = 0b11110000;\nconstexpr uint8_t b = 0b11001100;\nconstexpr uint8_t c = 0b10101010;\n}  // namespace TernaryOperand\n\n}  // namespace x64\n}  // namespace backend\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_BACKEND_X64_X64_UTIL_H_\n"
  },
  {
    "path": "src/xenia/cpu/breakpoint.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2015 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/breakpoint.h\"\n\n#include \"xenia/base/string_util.h\"\n#include \"xenia/cpu/backend/backend.h\"\n#include \"xenia/cpu/backend/code_cache.h\"\n\nnamespace xe {\nnamespace cpu {\n\nBreakpoint::Breakpoint(Processor* processor, AddressType address_type,\n                       uint64_t address, HitCallback hit_callback)\n    : processor_(processor),\n      address_type_(address_type),\n      address_(address),\n      hit_callback_(hit_callback) {}\n\nBreakpoint::~Breakpoint() { assert_false(installed_); }\n\nvoid Breakpoint::Install() {\n  assert_false(installed_);\n  processor_->backend()->InstallBreakpoint(this);\n  installed_ = true;\n}\n\nvoid Breakpoint::Uninstall() {\n  assert_true(installed_);\n  processor_->backend()->UninstallBreakpoint(this);\n  installed_ = false;\n}\n\nstd::string Breakpoint::to_string() const {\n  if (address_type_ == AddressType::kGuest) {\n    auto str =\n        std::string(\"PPC \") + xe::string_util::to_hex_string(guest_address());\n    auto functions = processor_->FindFunctionsWithAddress(guest_address());\n    if (functions.empty()) {\n      return str;\n    }\n    str += \" \" + functions[0]->name();\n    return str;\n  } else {\n    return std::string(\"x64 \") + xe::string_util::to_hex_string(host_address());\n  }\n}\n\nGuestFunction* Breakpoint::guest_function() const {\n  if (address_type_ == AddressType::kGuest) {\n    auto functions = processor_->FindFunctionsWithAddress(guest_address());\n    if (functions.empty()) {\n      return nullptr;\n    } else if (functions[0]->is_guest()) {\n      return static_cast<xe::cpu::GuestFunction*>(functions[0]);\n    }\n    return nullptr;\n  } else {\n    return processor_->backend()->code_cache()->LookupFunction(host_address());\n  }\n}\n\nbool Breakpoint::ContainsHostAddress(uintptr_t search_address) const {\n  bool contains = false;\n  ForEachHostAddress([&contains, search_address](uintptr_t host_address) {\n    if (host_address == search_address) {\n      contains = true;\n    }\n  });\n  return contains;\n}\n\nvoid Breakpoint::ForEachHostAddress(\n    std::function<void(uintptr_t)> callback) const {\n  if (address_type_ == AddressType::kGuest) {\n    auto guest_address = this->guest_address();\n\n    // Lookup all functions that contain this guest address and patch them.\n    auto functions = processor_->FindFunctionsWithAddress(guest_address);\n\n    if (functions.empty()) {\n      // If function does not exist demand it, as we need someplace to put our\n      // breakpoint. Note that this follows the same resolution rules as the\n      // JIT, so what's returned is the function the JIT would have jumped to.\n      auto fn = processor_->ResolveFunction(guest_address);\n      if (!fn) {\n        // TODO(benvanik): error out better with 'invalid breakpoint'?\n        assert_not_null(fn);\n        return;\n      }\n      functions.push_back(fn);\n    }\n    assert_false(functions.empty());\n\n    for (auto function : functions) {\n      // TODO(benvanik): other function types.\n      assert_true(function->is_guest());\n      auto guest_function = reinterpret_cast<GuestFunction*>(function);\n      uintptr_t host_address =\n          guest_function->MapGuestAddressToMachineCode(guest_address);\n      assert_not_zero(host_address);\n      callback(host_address);\n    }\n  } else {\n    // Direct host address patching.\n    callback(host_address());\n  }\n}\n\n}  // namespace cpu\n}  // namespace xe"
  },
  {
    "path": "src/xenia/cpu/breakpoint.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2015 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_BREAKPOINT_H_\n#define XENIA_CPU_BREAKPOINT_H_\n\n#include \"xenia/cpu/processor.h\"\n\nnamespace xe {\nnamespace cpu {\n\nclass Breakpoint {\n public:\n  enum class AddressType {\n    kGuest,\n    kHost,\n  };\n  typedef std::function<void(Breakpoint*, ThreadDebugInfo*, uint64_t)>\n      HitCallback;\n\n  Breakpoint(Processor* processor, AddressType address_type, uint64_t address,\n             HitCallback hit_callback);\n  ~Breakpoint();\n\n  AddressType address_type() const { return address_type_; }\n  uint64_t address() const { return address_; }\n  uint32_t guest_address() const {\n    assert_true(address_type_ == AddressType::kGuest);\n    return static_cast<uint32_t>(address_);\n  }\n  uintptr_t host_address() const {\n    assert_true(address_type_ == AddressType::kHost);\n    return static_cast<uintptr_t>(address_);\n  }\n\n  // Whether the breakpoint has been enabled by the user.\n  bool is_enabled() const { return enabled_; }\n\n  // Toggles the breakpoint state.\n  // Assumes the caller holds the global lock.\n  void set_enabled(bool is_enabled) {\n    enabled_ = is_enabled;\n    if (!enabled_ && installed_) {\n      Uninstall();\n    } else if (enabled_ && !installed_ && !suspend_count_) {\n      Install();\n    }\n  }\n\n  // Whether the breakpoint is currently installed and active.\n  bool is_installed() const { return installed_; }\n\n  std::string to_string() const;\n\n  // Returns a guest function that contains the guest address, if any.\n  // If there are multiple functions that contain the address a random one will\n  // be returned. If this is a host-address code breakpoint this will attempt to\n  // find a function with that address and otherwise return nullptr.\n  GuestFunction* guest_function() const;\n\n  // Returns true if this breakpoint, when installed, contains the given host\n  // address.\n  bool ContainsHostAddress(uintptr_t search_address) const;\n\n  // Enumerates all host addresses that correspond to this breakpoint.\n  // If this is a host type it will return the single host address, if it is a\n  // guest type it may return multiple host addresses.\n  void ForEachHostAddress(std::function<void(uintptr_t)> callback) const;\n\n  // CPU backend data. Implementation specific - DO NOT TOUCH THIS!\n  std::vector<std::pair<uint64_t, uint64_t>> backend_data() const {\n    return backend_data_;\n  }\n  std::vector<std::pair<uint64_t, uint64_t>>& backend_data() {\n    return backend_data_;\n  }\n\n private:\n  friend class Processor;\n\n  void OnHit(ThreadDebugInfo* thread_info, uint64_t host_pc) {\n    hit_callback_(this, thread_info, host_pc);\n  }\n\n  // Suspends the breakpoint until it is resumed with Resume.\n  // This preserves the user enabled state.\n  // Assumes the caller holds the global lock.\n  void Suspend() {\n    ++suspend_count_;\n    if (installed_) {\n      Uninstall();\n    }\n  }\n\n  // Resumes a previously-suspended breakpoint, reinstalling it if required.\n  // Assumes the caller holds the global lock.\n  void Resume() {\n    --suspend_count_;\n    if (!suspend_count_ && enabled_) {\n      Install();\n    }\n  }\n\n private:\n  Processor* processor_ = nullptr;\n\n  void Install();\n  void Uninstall();\n\n  // True if patched into code.\n  bool installed_ = false;\n  // True if user enabled.\n  bool enabled_ = true;\n  // Depth of suspends (must be 0 to be installed). Defaults to suspended so\n  // that it's never installed unless the debugger knows about it.\n  int suspend_count_ = 1;\n\n  AddressType address_type_;\n  uint64_t address_ = 0;\n\n  HitCallback hit_callback_;\n\n  // Opaque backend data. Don't touch this.\n  std::vector<std::pair<uint64_t, uint64_t>> backend_data_;\n};\n\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_BREAKPOINT_H_"
  },
  {
    "path": "src/xenia/cpu/compiler/compiler.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/compiler/compiler.h\"\n\n#include \"xenia/base/profiling.h\"\n#include \"xenia/cpu/compiler/compiler_pass.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace compiler {\n\nCompiler::Compiler(Processor* processor) : processor_(processor) {}\n\nCompiler::~Compiler() { Reset(); }\n\nvoid Compiler::AddPass(std::unique_ptr<CompilerPass> pass) {\n  pass->Initialize(this);\n  passes_.push_back(std::move(pass));\n}\n\nvoid Compiler::Reset() {}\n\nbool Compiler::Compile(xe::cpu::hir::HIRBuilder* builder) {\n  // TODO(benvanik): sophisticated stuff. Run passes in parallel, run until they\n  //                 stop changing things, etc.\n  for (size_t i = 0; i < passes_.size(); ++i) {\n    auto& pass = passes_[i];\n    scratch_arena_.Reset();\n    if (!pass->Run(builder)) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\n}  // namespace compiler\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/compiler/compiler.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_COMPILER_COMPILER_H_\n#define XENIA_CPU_COMPILER_COMPILER_H_\n\n#include <memory>\n#include <vector>\n\n#include \"xenia/base/arena.h\"\n#include \"xenia/cpu/hir/hir_builder.h\"\n\nnamespace xe {\nnamespace cpu {\nclass Processor;\n}  // namespace cpu\n}  // namespace xe\n\nnamespace xe {\nnamespace cpu {\nnamespace compiler {\n\nclass CompilerPass;\n\nclass Compiler {\n public:\n  explicit Compiler(Processor* processor);\n  ~Compiler();\n\n  Processor* processor() const { return processor_; }\n  Arena* scratch_arena() { return &scratch_arena_; }\n\n  void AddPass(std::unique_ptr<CompilerPass> pass);\n\n  void Reset();\n\n  bool Compile(hir::HIRBuilder* builder);\n\n private:\n  Processor* processor_;\n  Arena scratch_arena_;\n\n  std::vector<std::unique_ptr<CompilerPass>> passes_;\n};\n\n}  // namespace compiler\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_COMPILER_COMPILER_H_\n"
  },
  {
    "path": "src/xenia/cpu/compiler/compiler_pass.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/compiler/compiler_pass.h\"\n\n#include \"xenia/cpu/compiler/compiler.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace compiler {\n\nCompilerPass::CompilerPass() : processor_(nullptr), compiler_(nullptr) {}\n\nCompilerPass::~CompilerPass() = default;\n\nbool CompilerPass::Initialize(Compiler* compiler) {\n  processor_ = compiler->processor();\n  compiler_ = compiler;\n  return true;\n}\n\nArena* CompilerPass::scratch_arena() const {\n  return compiler_->scratch_arena();\n}\n\n}  // namespace compiler\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/compiler/compiler_pass.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_COMPILER_COMPILER_PASS_H_\n#define XENIA_CPU_COMPILER_COMPILER_PASS_H_\n\n#include \"xenia/base/arena.h\"\n#include \"xenia/cpu/hir/hir_builder.h\"\n\nnamespace xe {\nnamespace cpu {\nclass Processor;\n}  // namespace cpu\n}  // namespace xe\n\nnamespace xe {\nnamespace cpu {\nnamespace compiler {\n\nclass Compiler;\n\nclass CompilerPass {\n public:\n  CompilerPass();\n  virtual ~CompilerPass();\n\n  virtual bool Initialize(Compiler* compiler);\n\n  virtual bool Run(hir::HIRBuilder* builder) = 0;\n\n protected:\n  Arena* scratch_arena() const;\n\n protected:\n  Processor* processor_;\n  Compiler* compiler_;\n};\n\n}  // namespace compiler\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_COMPILER_COMPILER_PASS_H_\n"
  },
  {
    "path": "src/xenia/cpu/compiler/compiler_passes.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_COMPILER_COMPILER_PASSES_H_\n#define XENIA_CPU_COMPILER_COMPILER_PASSES_H_\n\n#include \"xenia/cpu/compiler/passes/conditional_group_pass.h\"\n#include \"xenia/cpu/compiler/passes/conditional_group_subpass.h\"\n#include \"xenia/cpu/compiler/passes/constant_propagation_pass.h\"\n#include \"xenia/cpu/compiler/passes/context_promotion_pass.h\"\n#include \"xenia/cpu/compiler/passes/control_flow_analysis_pass.h\"\n#include \"xenia/cpu/compiler/passes/control_flow_simplification_pass.h\"\n#include \"xenia/cpu/compiler/passes/data_flow_analysis_pass.h\"\n#include \"xenia/cpu/compiler/passes/dead_code_elimination_pass.h\"\n#include \"xenia/cpu/compiler/passes/finalization_pass.h\"\n#include \"xenia/cpu/compiler/passes/memory_sequence_combination_pass.h\"\n#include \"xenia/cpu/compiler/passes/register_allocation_pass.h\"\n#include \"xenia/cpu/compiler/passes/simplification_pass.h\"\n#include \"xenia/cpu/compiler/passes/validation_pass.h\"\n#include \"xenia/cpu/compiler/passes/value_reduction_pass.h\"\n\n#endif  // XENIA_CPU_COMPILER_COMPILER_PASSES_H_\n"
  },
  {
    "path": "src/xenia/cpu/compiler/passes/conditional_group_pass.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/compiler/passes/conditional_group_pass.h\"\n\n#include \"xenia/base/profiling.h\"\n#include \"xenia/cpu/compiler/compiler.h\"\n#include \"xenia/cpu/ppc/ppc_context.h\"\n#include \"xenia/cpu/processor.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace compiler {\nnamespace passes {\n\n// TODO(benvanik): remove when enums redefined.\nusing namespace xe::cpu::hir;\n\nusing xe::cpu::hir::Block;\nusing xe::cpu::hir::HIRBuilder;\nusing xe::cpu::hir::Instr;\nusing xe::cpu::hir::Value;\n\nConditionalGroupPass::ConditionalGroupPass() : CompilerPass() {}\n\nConditionalGroupPass::~ConditionalGroupPass() {}\n\nbool ConditionalGroupPass::Initialize(Compiler* compiler) {\n  if (!CompilerPass::Initialize(compiler)) {\n    return false;\n  }\n\n  for (size_t i = 0; i < passes_.size(); ++i) {\n    auto& pass = passes_[i];\n    if (!pass->Initialize(compiler)) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\nbool ConditionalGroupPass::Run(HIRBuilder* builder) {\n  bool dirty;\n  int loops = 0;\n  do {\n    assert_true(loops < 20);  // arbitrary number\n    dirty = false;\n    for (size_t i = 0; i < passes_.size(); ++i) {\n      scratch_arena()->Reset();\n      auto& pass = passes_[i];\n      auto subpass = dynamic_cast<ConditionalGroupSubpass*>(pass.get());\n      if (!subpass) {\n        if (!pass->Run(builder)) {\n          return false;\n        }\n      } else {\n        bool result = false;\n        if (!subpass->Run(builder, result)) {\n          return false;\n        }\n        dirty |= result;\n      }\n    }\n    loops++;\n  } while (dirty);\n  return true;\n}\n\nvoid ConditionalGroupPass::AddPass(std::unique_ptr<CompilerPass> pass) {\n  passes_.push_back(std::move(pass));\n}\n\n}  // namespace passes\n}  // namespace compiler\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/compiler/passes/conditional_group_pass.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_COMPILER_PASSES_CONDITIONAL_GROUP_PASS_H_\n#define XENIA_CPU_COMPILER_PASSES_CONDITIONAL_GROUP_PASS_H_\n\n#include <cmath>\n#include <vector>\n\n#include \"xenia/base/platform.h\"\n#include \"xenia/cpu/compiler/compiler_pass.h\"\n#include \"xenia/cpu/compiler/passes/conditional_group_subpass.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace compiler {\nnamespace passes {\n\nclass ConditionalGroupPass : public CompilerPass {\n public:\n  ConditionalGroupPass();\n  virtual ~ConditionalGroupPass() override;\n\n  bool Initialize(Compiler* compiler) override;\n\n  bool Run(hir::HIRBuilder* builder) override;\n\n  void AddPass(std::unique_ptr<CompilerPass> pass);\n\n private:\n  std::vector<std::unique_ptr<CompilerPass>> passes_;\n};\n\n}  // namespace passes\n}  // namespace compiler\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_COMPILER_PASSES_CONDITIONAL_GROUP_PASS_H_\n"
  },
  {
    "path": "src/xenia/cpu/compiler/passes/conditional_group_subpass.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/compiler/passes/conditional_group_subpass.h\"\n\n#include \"xenia/cpu/compiler/compiler.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace compiler {\nnamespace passes {\n\nConditionalGroupSubpass::ConditionalGroupSubpass() : CompilerPass() {}\n\nConditionalGroupSubpass::~ConditionalGroupSubpass() = default;\n\n}  // namespace passes\n}  // namespace compiler\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/compiler/passes/conditional_group_subpass.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_COMPILER_PASSES_CONDITIONAL_GROUP_SUBPASS_H_\n#define XENIA_CPU_COMPILER_PASSES_CONDITIONAL_GROUP_SUBPASS_H_\n\n#include \"xenia/base/arena.h\"\n#include \"xenia/cpu/compiler/compiler_pass.h\"\n#include \"xenia/cpu/hir/hir_builder.h\"\n\nnamespace xe {\nnamespace cpu {\nclass Processor;\n}  // namespace cpu\n}  // namespace xe\n\nnamespace xe {\nnamespace cpu {\nnamespace compiler {\nclass Compiler;\nnamespace passes {\n\nclass ConditionalGroupSubpass : public CompilerPass {\n public:\n  ConditionalGroupSubpass();\n  virtual ~ConditionalGroupSubpass();\n\n  bool Run(hir::HIRBuilder* builder) override {\n    bool dummy;\n    return Run(builder, dummy);\n  }\n\n  virtual bool Run(hir::HIRBuilder* builder, bool& result) = 0;\n};\n\n}  // namespace passes\n}  // namespace compiler\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_COMPILER_PASSES_CONDITIONAL_GROUP_SUBPASS_H_\n"
  },
  {
    "path": "src/xenia/cpu/compiler/passes/constant_propagation_pass.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/compiler/passes/constant_propagation_pass.h\"\n\n#include <cmath>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/cvar.h\"\n#include \"xenia/base/profiling.h\"\n#include \"xenia/cpu/function.h\"\n#include \"xenia/cpu/processor.h\"\n\nDEFINE_bool(inline_mmio_access, true, \"Inline constant MMIO loads and stores.\",\n            \"CPU\");\n\nnamespace xe {\nnamespace cpu {\nnamespace compiler {\nnamespace passes {\n\n// TODO(benvanik): remove when enums redefined.\nusing namespace xe::cpu::hir;\n\nusing xe::cpu::hir::HIRBuilder;\nusing xe::cpu::hir::TypeName;\nusing xe::cpu::hir::Value;\n\nConstantPropagationPass::ConstantPropagationPass()\n    : ConditionalGroupSubpass() {}\n\nConstantPropagationPass::~ConstantPropagationPass() {}\n\nbool ConstantPropagationPass::Run(HIRBuilder* builder, bool& result) {\n  // Once ContextPromotion has run there will likely be a whole slew of\n  // constants that can be pushed through the function.\n  // Example:\n  //   store_context +100, 1000\n  //   v0 = load_context +100\n  //   v1 = add v0, v0\n  //   store_context +200, v1\n  // after PromoteContext:\n  //   store_context +100, 1000\n  //   v0 = 1000\n  //   v1 = add v0, v0\n  //   store_context +200, v1\n  // after PropagateConstants:\n  //   store_context +100, 1000\n  //   v0 = 1000\n  //   v1 = add 1000, 1000\n  //   store_context +200, 2000\n  // A DCE run after this should clean up any of the values no longer needed.\n  //\n  // Special care needs to be taken with paired instructions. For example,\n  // DID_CARRY needs to be set as a constant:\n  //   v1 = sub.2 20, 1\n  //   v2 = did_carry v1\n  // should become:\n  //   v1 = 19\n  //   v2 = 0\n\n  result = false;\n  auto block = builder->first_block();\n  while (block) {\n    auto i = block->instr_head;\n    while (i) {\n      auto v = i->dest;\n      switch (i->opcode->num) {\n        case OPCODE_DEBUG_BREAK_TRUE:\n          if (i->src1.value->IsConstant()) {\n            if (i->src1.value->IsConstantTrue()) {\n              i->Replace(&OPCODE_DEBUG_BREAK_info, i->flags);\n            } else {\n              i->Remove();\n            }\n            result = true;\n          }\n          break;\n\n        case OPCODE_TRAP_TRUE:\n          if (i->src1.value->IsConstant()) {\n            if (i->src1.value->IsConstantTrue()) {\n              i->Replace(&OPCODE_TRAP_info, i->flags);\n            } else {\n              i->Remove();\n            }\n            result = true;\n          }\n          break;\n\n        case OPCODE_CALL_TRUE:\n          if (i->src1.value->IsConstant()) {\n            if (i->src1.value->IsConstantTrue()) {\n              auto symbol = i->src2.symbol;\n              i->Replace(&OPCODE_CALL_info, i->flags);\n              i->src1.symbol = symbol;\n            } else {\n              i->Remove();\n            }\n            result = true;\n          }\n          break;\n        case OPCODE_CALL_INDIRECT:\n          if (i->src1.value->IsConstant()) {\n            auto function = processor_->LookupFunction(\n                uint32_t(i->src1.value->constant.i32));\n            if (!function) {\n              break;\n            }\n            i->Replace(&OPCODE_CALL_info, i->flags);\n            i->src1.symbol = function;\n            result = true;\n          }\n          break;\n        case OPCODE_CALL_INDIRECT_TRUE:\n          if (i->src1.value->IsConstant()) {\n            if (i->src1.value->IsConstantTrue()) {\n              auto value = i->src2.value;\n              i->Replace(&OPCODE_CALL_INDIRECT_info, i->flags);\n              i->set_src1(value);\n            } else {\n              i->Remove();\n            }\n            result = true;\n          }\n          break;\n\n        case OPCODE_BRANCH_TRUE:\n          if (i->src1.value->IsConstant()) {\n            if (i->src1.value->IsConstantTrue()) {\n              auto label = i->src2.label;\n              i->Replace(&OPCODE_BRANCH_info, i->flags);\n              i->src1.label = label;\n            } else {\n              i->Remove();\n            }\n            result = true;\n          }\n          break;\n        case OPCODE_BRANCH_FALSE:\n          if (i->src1.value->IsConstant()) {\n            if (i->src1.value->IsConstantFalse()) {\n              auto label = i->src2.label;\n              i->Replace(&OPCODE_BRANCH_info, i->flags);\n              i->src1.label = label;\n            } else {\n              i->Remove();\n            }\n            result = true;\n          }\n          break;\n\n        case OPCODE_CAST:\n          if (i->src1.value->IsConstant()) {\n            TypeName target_type = v->type;\n            v->set_from(i->src1.value);\n            v->Cast(target_type);\n            i->Remove();\n            result = true;\n          }\n          break;\n        case OPCODE_CONVERT:\n          if (i->src1.value->IsConstant()) {\n            TypeName target_type = v->type;\n            v->set_from(i->src1.value);\n            v->Convert(target_type, RoundMode(i->flags));\n            i->Remove();\n            result = true;\n          }\n          break;\n        case OPCODE_ROUND:\n          if (i->src1.value->IsConstant()) {\n            v->set_from(i->src1.value);\n            v->Round(RoundMode(i->flags));\n            i->Remove();\n            result = true;\n          }\n          break;\n        case OPCODE_ZERO_EXTEND:\n          if (i->src1.value->IsConstant()) {\n            TypeName target_type = v->type;\n            v->set_from(i->src1.value);\n            v->ZeroExtend(target_type);\n            i->Remove();\n            result = true;\n          }\n          break;\n        case OPCODE_SIGN_EXTEND:\n          if (i->src1.value->IsConstant()) {\n            TypeName target_type = v->type;\n            v->set_from(i->src1.value);\n            v->SignExtend(target_type);\n            i->Remove();\n            result = true;\n          }\n          break;\n        case OPCODE_TRUNCATE:\n          if (i->src1.value->IsConstant()) {\n            TypeName target_type = v->type;\n            v->set_from(i->src1.value);\n            v->Truncate(target_type);\n            i->Remove();\n            result = true;\n          }\n          break;\n\n        case OPCODE_LOAD:\n        case OPCODE_LOAD_OFFSET:\n          if (i->src1.value->IsConstant()) {\n            assert_false(i->flags & LOAD_STORE_BYTE_SWAP);\n            auto memory = processor_->memory();\n            auto address = i->src1.value->constant.i32;\n            if (i->opcode->num == OPCODE_LOAD_OFFSET) {\n              address += i->src2.value->constant.i32;\n            }\n\n            auto mmio_range =\n                processor_->memory()->LookupVirtualMappedRange(address);\n            if (cvars::inline_mmio_access && mmio_range) {\n              i->Replace(&OPCODE_LOAD_MMIO_info, 0);\n              i->src1.offset = reinterpret_cast<uint64_t>(mmio_range);\n              i->src2.offset = address;\n              result = true;\n            } else {\n              auto heap = memory->LookupHeap(address);\n              uint32_t protect;\n              if (heap && heap->QueryProtect(address, &protect) &&\n                  !(protect & kMemoryProtectWrite) &&\n                  (protect & kMemoryProtectRead)) {\n                // Memory is readonly - can just return the value.\n                auto host_addr = memory->TranslateVirtual(address);\n                switch (v->type) {\n                  case INT8_TYPE:\n                    v->set_constant(xe::load<uint8_t>(host_addr));\n                    i->Remove();\n                    result = true;\n                    break;\n                  case INT16_TYPE:\n                    v->set_constant(xe::load<uint16_t>(host_addr));\n                    i->Remove();\n                    result = true;\n                    break;\n                  case INT32_TYPE:\n                    v->set_constant(xe::load<uint32_t>(host_addr));\n                    i->Remove();\n                    result = true;\n                    break;\n                  case INT64_TYPE:\n                    v->set_constant(xe::load<uint64_t>(host_addr));\n                    i->Remove();\n                    result = true;\n                    break;\n                  case VEC128_TYPE:\n                    vec128_t val;\n                    val.low = xe::load<uint64_t>(host_addr);\n                    val.high = xe::load<uint64_t>(host_addr + 8);\n                    v->set_constant(val);\n                    i->Remove();\n                    result = true;\n                    break;\n                  default:\n                    assert_unhandled_case(v->type);\n                    break;\n                }\n              }\n            }\n          }\n          break;\n        case OPCODE_STORE:\n        case OPCODE_STORE_OFFSET:\n          if (cvars::inline_mmio_access && i->src1.value->IsConstant()) {\n            auto address = i->src1.value->constant.i32;\n            if (i->opcode->num == OPCODE_STORE_OFFSET) {\n              address += i->src2.value->constant.i32;\n            }\n\n            auto mmio_range =\n                processor_->memory()->LookupVirtualMappedRange(address);\n            if (mmio_range) {\n              auto value = i->src2.value;\n              if (i->opcode->num == OPCODE_STORE_OFFSET) {\n                value = i->src3.value;\n              }\n\n              i->Replace(&OPCODE_STORE_MMIO_info, 0);\n              i->src1.offset = reinterpret_cast<uint64_t>(mmio_range);\n              i->src2.offset = address;\n              i->set_src3(value);\n              result = true;\n            }\n          }\n          break;\n\n        case OPCODE_SELECT:\n          if (i->src1.value->IsConstant()) {\n            if (i->src1.value->type != VEC128_TYPE) {\n              if (i->src1.value->IsConstantTrue()) {\n                auto src2 = i->src2.value;\n                i->Replace(&OPCODE_ASSIGN_info, 0);\n                i->set_src1(src2);\n                result = true;\n              } else if (i->src1.value->IsConstantFalse()) {\n                auto src3 = i->src3.value;\n                i->Replace(&OPCODE_ASSIGN_info, 0);\n                i->set_src1(src3);\n                result = true;\n              } else if (i->src2.value->IsConstant() &&\n                         i->src3.value->IsConstant()) {\n                // TODO: Select\n                // v->set_from(i->src2.value);\n                // v->Select(i->src3.value, i->src1.value);\n                // i->Remove();\n              }\n            } else {\n              // TODO: vec128 select\n            }\n          }\n          break;\n        case OPCODE_IS_TRUE:\n          if (i->src1.value->IsConstant()) {\n            if (i->src1.value->IsConstantTrue()) {\n              v->set_constant(uint8_t(1));\n            } else {\n              v->set_constant(uint8_t(0));\n            }\n            i->Remove();\n            result = true;\n          }\n          break;\n        case OPCODE_IS_FALSE:\n          if (i->src1.value->IsConstant()) {\n            if (i->src1.value->IsConstantFalse()) {\n              v->set_constant(uint8_t(1));\n            } else {\n              v->set_constant(uint8_t(0));\n            }\n            i->Remove();\n            result = true;\n          }\n          break;\n        case OPCODE_IS_NAN:\n          if (i->src1.value->IsConstant()) {\n            if (i->src1.value->type == FLOAT32_TYPE &&\n                std::isnan(i->src1.value->constant.f32)) {\n              v->set_constant(uint8_t(1));\n            } else if (i->src1.value->type == FLOAT64_TYPE &&\n                       std::isnan(i->src1.value->constant.f64)) {\n              v->set_constant(uint8_t(1));\n            } else {\n              v->set_constant(uint8_t(0));\n            }\n            i->Remove();\n            result = true;\n          }\n          break;\n\n        // TODO(benvanik): compares\n        case OPCODE_COMPARE_EQ:\n          if (i->src1.value->IsConstant() && i->src2.value->IsConstant()) {\n            bool value = i->src1.value->IsConstantEQ(i->src2.value);\n            i->dest->set_constant(uint8_t(value));\n            i->Remove();\n            result = true;\n          }\n          break;\n        case OPCODE_COMPARE_NE:\n          if (i->src1.value->IsConstant() && i->src2.value->IsConstant()) {\n            bool value = i->src1.value->IsConstantNE(i->src2.value);\n            i->dest->set_constant(uint8_t(value));\n            i->Remove();\n            result = true;\n          }\n          break;\n        case OPCODE_COMPARE_SLT:\n          if (i->src1.value->IsConstant() && i->src2.value->IsConstant()) {\n            bool value = i->src1.value->IsConstantSLT(i->src2.value);\n            i->dest->set_constant(uint8_t(value));\n            i->Remove();\n            result = true;\n          }\n          break;\n        case OPCODE_COMPARE_SLE:\n          if (i->src1.value->IsConstant() && i->src2.value->IsConstant()) {\n            bool value = i->src1.value->IsConstantSLE(i->src2.value);\n            i->dest->set_constant(uint8_t(value));\n            i->Remove();\n            result = true;\n          }\n          break;\n        case OPCODE_COMPARE_SGT:\n          if (i->src1.value->IsConstant() && i->src2.value->IsConstant()) {\n            bool value = i->src1.value->IsConstantSGT(i->src2.value);\n            i->dest->set_constant(uint8_t(value));\n            i->Remove();\n            result = true;\n          }\n          break;\n        case OPCODE_COMPARE_SGE:\n          if (i->src1.value->IsConstant() && i->src2.value->IsConstant()) {\n            bool value = i->src1.value->IsConstantSGE(i->src2.value);\n            i->dest->set_constant(uint8_t(value));\n            i->Remove();\n            result = true;\n          }\n          break;\n        case OPCODE_COMPARE_ULT:\n          if (i->src1.value->IsConstant() && i->src2.value->IsConstant()) {\n            bool value = i->src1.value->IsConstantULT(i->src2.value);\n            i->dest->set_constant(uint8_t(value));\n            i->Remove();\n            result = true;\n          }\n          break;\n        case OPCODE_COMPARE_ULE:\n          if (i->src1.value->IsConstant() && i->src2.value->IsConstant()) {\n            bool value = i->src1.value->IsConstantULE(i->src2.value);\n            i->dest->set_constant(uint8_t(value));\n            i->Remove();\n            result = true;\n          }\n          break;\n        case OPCODE_COMPARE_UGT:\n          if (i->src1.value->IsConstant() && i->src2.value->IsConstant()) {\n            bool value = i->src1.value->IsConstantUGT(i->src2.value);\n            i->dest->set_constant(uint8_t(value));\n            i->Remove();\n            result = true;\n          }\n          break;\n        case OPCODE_COMPARE_UGE:\n          if (i->src1.value->IsConstant() && i->src2.value->IsConstant()) {\n            bool value = i->src1.value->IsConstantUGE(i->src2.value);\n            i->dest->set_constant(uint8_t(value));\n            i->Remove();\n            result = true;\n          }\n          break;\n\n        case OPCODE_DID_SATURATE:\n          // assert_true(!i->src1.value->IsConstant());\n          break;\n\n        case OPCODE_ADD:\n          if (i->src1.value->IsConstant() && i->src2.value->IsConstant()) {\n            v->set_from(i->src1.value);\n            v->Add(i->src2.value);\n            i->Remove();\n            result = true;\n          }\n          break;\n        case OPCODE_ADD_CARRY:\n          if (i->src1.value->IsConstantZero() &&\n              i->src2.value->IsConstantZero()) {\n            Value* ca = i->src3.value;\n            if (ca->IsConstant()) {\n              TypeName target_type = v->type;\n              v->set_from(ca);\n              v->ZeroExtend(target_type);\n              i->Remove();\n            } else {\n              if (i->dest->type == ca->type) {\n                i->Replace(&OPCODE_ASSIGN_info, 0);\n                i->set_src1(ca);\n              } else {\n                i->Replace(&OPCODE_ZERO_EXTEND_info, 0);\n                i->set_src1(ca);\n              }\n            }\n            result = true;\n          }\n          break;\n        case OPCODE_SUB:\n          if (i->src1.value->IsConstant() && i->src2.value->IsConstant()) {\n            v->set_from(i->src1.value);\n            v->Sub(i->src2.value);\n            i->Remove();\n            result = true;\n          }\n          break;\n        case OPCODE_MUL:\n          if (i->src1.value->IsConstant() && i->src2.value->IsConstant()) {\n            v->set_from(i->src1.value);\n            v->Mul(i->src2.value);\n            i->Remove();\n            result = true;\n          } else if (i->src1.value->IsConstant() ||\n                     i->src2.value->IsConstant()) {\n            // Reorder the sources to make things simpler.\n            // s1 = non-const, s2 = const\n            auto s1 =\n                i->src1.value->IsConstant() ? i->src2.value : i->src1.value;\n            auto s2 =\n                i->src1.value->IsConstant() ? i->src1.value : i->src2.value;\n\n            // Multiplication by one = no-op\n            if (s2->type != VEC128_TYPE && s2->IsConstantOne()) {\n              i->Replace(&OPCODE_ASSIGN_info, 0);\n              i->set_src1(s1);\n              result = true;\n            } else if (s2->type == VEC128_TYPE) {\n              auto& c = s2->constant;\n              if (c.v128.f32[0] == 1.f && c.v128.f32[1] == 1.f &&\n                  c.v128.f32[2] == 1.f && c.v128.f32[3] == 1.f) {\n                i->Replace(&OPCODE_ASSIGN_info, 0);\n                i->set_src1(s1);\n                result = true;\n              }\n            }\n          }\n          break;\n        case OPCODE_MUL_HI:\n          if (i->src1.value->IsConstant() && i->src2.value->IsConstant()) {\n            v->set_from(i->src1.value);\n            v->MulHi(i->src2.value, (i->flags & ARITHMETIC_UNSIGNED) != 0);\n            i->Remove();\n            result = true;\n          }\n          break;\n        case OPCODE_DIV:\n          if (i->src1.value->IsConstant() && i->src2.value->IsConstant()) {\n            v->set_from(i->src1.value);\n            v->Div(i->src2.value, (i->flags & ARITHMETIC_UNSIGNED) != 0);\n            i->Remove();\n            result = true;\n          } else if (i->src2.value->IsConstant()) {\n            // Division by one = no-op.\n            Value* src1 = i->src1.value;\n            if (i->src2.value->type != VEC128_TYPE &&\n                i->src2.value->IsConstantOne()) {\n              i->Replace(&OPCODE_ASSIGN_info, 0);\n              i->set_src1(src1);\n              result = true;\n            } else if (i->src2.value->type == VEC128_TYPE) {\n              auto& c = i->src2.value->constant;\n              if (c.v128.f32[0] == 1.f && c.v128.f32[1] == 1.f &&\n                  c.v128.f32[2] == 1.f && c.v128.f32[3] == 1.f) {\n                i->Replace(&OPCODE_ASSIGN_info, 0);\n                i->set_src1(src1);\n                result = true;\n              }\n            }\n          }\n          break;\n        case OPCODE_MUL_ADD:\n          if (i->src1.value->IsConstant() && i->src2.value->IsConstant()) {\n            if (i->src3.value->IsConstant()) {\n              v->set_from(i->src1.value);\n              Value::MulAdd(v, i->src1.value, i->src2.value, i->src3.value);\n              i->Remove();\n              result = true;\n            } else {\n              // Multiply part is constant.\n              Value* mul = builder->AllocValue();\n              mul->set_from(i->src1.value);\n              mul->Mul(i->src2.value);\n\n              Value* add = i->src3.value;\n              i->Replace(&OPCODE_ADD_info, 0);\n              i->set_src1(mul);\n              i->set_src2(add);\n\n              result = true;\n            }\n          }\n          break;\n        case OPCODE_MUL_SUB:\n          if (i->src1.value->IsConstant() && i->src2.value->IsConstant()) {\n            // Multiply part is constant.\n            if (i->src3.value->IsConstant()) {\n              v->set_from(i->src1.value);\n              Value::MulSub(v, i->src1.value, i->src2.value, i->src3.value);\n              i->Remove();\n              result = true;\n            } else {\n              // Multiply part is constant.\n              Value* mul = builder->AllocValue();\n              mul->set_from(i->src1.value);\n              mul->Mul(i->src2.value);\n\n              Value* add = i->src3.value;\n              i->Replace(&OPCODE_SUB_info, 0);\n              i->set_src1(mul);\n              i->set_src2(add);\n\n              result = true;\n            }\n          }\n          break;\n        case OPCODE_MAX:\n          if (i->src1.value->IsConstant() && i->src2.value->IsConstant()) {\n            v->set_from(i->src1.value);\n            v->Max(i->src2.value);\n            i->Remove();\n            result = true;\n          }\n          break;\n        case OPCODE_NEG:\n          if (i->src1.value->IsConstant()) {\n            v->set_from(i->src1.value);\n            v->Neg();\n            i->Remove();\n            result = true;\n          }\n          break;\n        case OPCODE_ABS:\n          if (i->src1.value->IsConstant()) {\n            v->set_from(i->src1.value);\n            v->Abs();\n            i->Remove();\n            result = true;\n          }\n          break;\n        case OPCODE_SQRT:\n          if (i->src1.value->IsConstant()) {\n            v->set_from(i->src1.value);\n            v->Sqrt();\n            i->Remove();\n            result = true;\n          }\n          break;\n        case OPCODE_RSQRT:\n          if (i->src1.value->IsConstant()) {\n            v->set_from(i->src1.value);\n            v->RSqrt();\n            i->Remove();\n            result = true;\n          }\n          break;\n        case OPCODE_RECIP:\n          if (i->src1.value->IsConstant()) {\n            v->set_from(i->src1.value);\n            v->Recip();\n            i->Remove();\n            result = true;\n          }\n          break;\n        case OPCODE_AND:\n          if (i->src1.value->IsConstant() && i->src2.value->IsConstant()) {\n            v->set_from(i->src1.value);\n            v->And(i->src2.value);\n            i->Remove();\n            result = true;\n          }\n          break;\n        case OPCODE_AND_NOT:\n          if (i->src1.value->IsConstant() && i->src2.value->IsConstant()) {\n            v->set_from(i->src2.value);\n            v->Not();\n            v->And(i->src1.value);\n            i->Remove();\n            result = true;\n          }\n          break;\n        case OPCODE_OR:\n          if (i->src1.value->IsConstant() && i->src2.value->IsConstant()) {\n            v->set_from(i->src1.value);\n            v->Or(i->src2.value);\n            i->Remove();\n            result = true;\n          }\n          break;\n        case OPCODE_XOR:\n          if (i->src1.value->IsConstant() && i->src2.value->IsConstant()) {\n            v->set_from(i->src1.value);\n            v->Xor(i->src2.value);\n            i->Remove();\n            result = true;\n          } else if (!i->src1.value->IsConstant() &&\n                     !i->src2.value->IsConstant() &&\n                     i->src1.value == i->src2.value) {\n            v->set_zero(v->type);\n            i->Remove();\n            result = true;\n          }\n          break;\n        case OPCODE_NOT:\n          if (i->src1.value->IsConstant()) {\n            v->set_from(i->src1.value);\n            v->Not();\n            i->Remove();\n            result = true;\n          }\n          break;\n        case OPCODE_SHL:\n          if (i->src1.value->IsConstant() && i->src2.value->IsConstant()) {\n            v->set_from(i->src1.value);\n            v->Shl(i->src2.value);\n            i->Remove();\n            result = true;\n          } else if (i->src2.value->IsConstantZero()) {\n            auto src1 = i->src1.value;\n            i->Replace(&OPCODE_ASSIGN_info, 0);\n            i->set_src1(src1);\n            result = true;\n          }\n          break;\n        case OPCODE_SHR:\n          if (i->src1.value->IsConstant() && i->src2.value->IsConstant()) {\n            v->set_from(i->src1.value);\n            v->Shr(i->src2.value);\n            i->Remove();\n            result = true;\n          } else if (i->src2.value->IsConstantZero()) {\n            auto src1 = i->src1.value;\n            i->Replace(&OPCODE_ASSIGN_info, 0);\n            i->set_src1(src1);\n            result = true;\n          }\n          break;\n        case OPCODE_SHA:\n          if (i->src1.value->IsConstant() && i->src2.value->IsConstant()) {\n            v->set_from(i->src1.value);\n            v->Sha(i->src2.value);\n            i->Remove();\n            result = true;\n          }\n          break;\n        // TODO(benvanik): ROTATE_LEFT\n        case OPCODE_BYTE_SWAP:\n          if (i->src1.value->IsConstant()) {\n            v->set_from(i->src1.value);\n            v->ByteSwap();\n            i->Remove();\n            result = true;\n          }\n          break;\n        case OPCODE_CNTLZ:\n          if (i->src1.value->IsConstant()) {\n            v->set_zero(v->type);\n            v->CountLeadingZeros(i->src1.value);\n            i->Remove();\n            result = true;\n          }\n          break;\n        // TODO(benvanik): INSERT/EXTRACT\n        // TODO(benvanik): PERMUTE/SWIZZLE\n        case OPCODE_EXTRACT:\n          if (i->src1.value->IsConstant() && i->src2.value->IsConstant()) {\n            v->set_zero(v->type);\n            v->Extract(i->src1.value, i->src2.value);\n            i->Remove();\n            result = true;\n          }\n          break;\n        case OPCODE_SPLAT:\n          if (i->src1.value->IsConstant()) {\n            v->set_zero(v->type);\n            v->Splat(i->src1.value);\n            i->Remove();\n            result = true;\n          }\n          break;\n        case OPCODE_VECTOR_COMPARE_EQ:\n          if (i->src1.value->IsConstant() && i->src2.value->IsConstant()) {\n            v->set_from(i->src1.value);\n            v->VectorCompareEQ(i->src2.value, hir::TypeName(i->flags));\n            i->Remove();\n            result = true;\n          }\n          break;\n        case OPCODE_VECTOR_COMPARE_SGT:\n          if (i->src1.value->IsConstant() && i->src2.value->IsConstant()) {\n            v->set_from(i->src1.value);\n            v->VectorCompareSGT(i->src2.value, hir::TypeName(i->flags));\n            i->Remove();\n            result = true;\n          }\n          break;\n        case OPCODE_VECTOR_COMPARE_SGE:\n          if (i->src1.value->IsConstant() && i->src2.value->IsConstant()) {\n            v->set_from(i->src1.value);\n            v->VectorCompareSGE(i->src2.value, hir::TypeName(i->flags));\n            i->Remove();\n            result = true;\n          }\n          break;\n        case OPCODE_VECTOR_COMPARE_UGT:\n          if (i->src1.value->IsConstant() && i->src2.value->IsConstant()) {\n            v->set_from(i->src1.value);\n            v->VectorCompareUGT(i->src2.value, hir::TypeName(i->flags));\n            i->Remove();\n            result = true;\n          }\n          break;\n        case OPCODE_VECTOR_COMPARE_UGE:\n          if (i->src1.value->IsConstant() && i->src2.value->IsConstant()) {\n            v->set_from(i->src1.value);\n            v->VectorCompareUGE(i->src2.value, hir::TypeName(i->flags));\n            i->Remove();\n            result = true;\n          }\n          break;\n        case OPCODE_VECTOR_CONVERT_F2I:\n          if (i->src1.value->IsConstant()) {\n            v->set_zero(VEC128_TYPE);\n            v->VectorConvertF2I(i->src1.value,\n                                !!(i->flags & ARITHMETIC_UNSIGNED));\n            i->Remove();\n            result = true;\n          }\n          break;\n        case OPCODE_VECTOR_CONVERT_I2F:\n          if (i->src1.value->IsConstant()) {\n            v->set_zero(VEC128_TYPE);\n            v->VectorConvertI2F(i->src1.value,\n                                !!(i->flags & ARITHMETIC_UNSIGNED));\n            i->Remove();\n            result = true;\n          }\n          break;\n        case OPCODE_VECTOR_SHL:\n          if (i->src1.value->IsConstant() && i->src2.value->IsConstant()) {\n            v->set_from(i->src1.value);\n            v->VectorShl(i->src2.value, hir::TypeName(i->flags));\n            i->Remove();\n            result = true;\n          }\n          break;\n        case OPCODE_VECTOR_SHR:\n          if (i->src1.value->IsConstant() && i->src2.value->IsConstant()) {\n            v->set_from(i->src1.value);\n            v->VectorShr(i->src2.value, hir::TypeName(i->flags));\n            i->Remove();\n            result = true;\n          }\n          break;\n        case OPCODE_VECTOR_ROTATE_LEFT:\n          if (i->src1.value->IsConstant() && i->src2.value->IsConstant()) {\n            v->set_from(i->src1.value);\n            v->VectorRol(i->src2.value, hir::TypeName(i->flags));\n            i->Remove();\n            result = true;\n          }\n          break;\n        case OPCODE_VECTOR_ADD:\n          if (i->src1.value->IsConstant() && i->src2.value->IsConstant()) {\n            v->set_from(i->src1.value);\n            uint32_t arith_flags = i->flags >> 8;\n            v->VectorAdd(i->src2.value, hir::TypeName(i->flags & 0xFF),\n                         !!(arith_flags & ARITHMETIC_UNSIGNED),\n                         !!(arith_flags & ARITHMETIC_SATURATE));\n            i->Remove();\n            result = true;\n          }\n          break;\n        case OPCODE_VECTOR_SUB:\n          if (i->src1.value->IsConstant() && i->src2.value->IsConstant()) {\n            v->set_from(i->src1.value);\n            uint32_t arith_flags = i->flags >> 8;\n            v->VectorSub(i->src2.value, hir::TypeName(i->flags & 0xFF),\n                         !!(arith_flags & ARITHMETIC_UNSIGNED),\n                         !!(arith_flags & ARITHMETIC_SATURATE));\n            i->Remove();\n            result = true;\n          }\n          break;\n\n        case OPCODE_DOT_PRODUCT_3:\n          if (i->src1.value->IsConstant() && i->src2.value->IsConstant()) {\n            v->set_from(i->src1.value);\n            v->DotProduct3(i->src2.value);\n            i->Remove();\n            result = true;\n          }\n          break;\n\n        case OPCODE_DOT_PRODUCT_4:\n          if (i->src1.value->IsConstant() && i->src2.value->IsConstant()) {\n            v->set_from(i->src1.value);\n            v->DotProduct4(i->src2.value);\n            i->Remove();\n            result = true;\n          }\n          break;\n\n        case OPCODE_VECTOR_AVERAGE:\n          if (i->src1.value->IsConstant() && i->src2.value->IsConstant()) {\n            v->set_from(i->src1.value);\n            uint32_t arith_flags = i->flags >> 8;\n            v->VectorAverage(i->src2.value, hir::TypeName(i->flags & 0xFF),\n                             !!(arith_flags & ARITHMETIC_UNSIGNED),\n                             !!(arith_flags & ARITHMETIC_SATURATE));\n            i->Remove();\n            result = true;\n          }\n          break;\n\n        default:\n          // Ignored.\n          break;\n      }\n      i = i->next;\n    }\n\n    block = block->next;\n  }\n\n  return true;\n}\n\n}  // namespace passes\n}  // namespace compiler\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/compiler/passes/constant_propagation_pass.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_COMPILER_PASSES_CONSTANT_PROPAGATION_PASS_H_\n#define XENIA_CPU_COMPILER_PASSES_CONSTANT_PROPAGATION_PASS_H_\n\n#include \"xenia/cpu/compiler/passes/conditional_group_subpass.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace compiler {\nnamespace passes {\n\nclass ConstantPropagationPass : public ConditionalGroupSubpass {\n public:\n  ConstantPropagationPass();\n  ~ConstantPropagationPass() override;\n\n  bool Run(hir::HIRBuilder* builder, bool& result) override;\n\n private:\n};\n\n}  // namespace passes\n}  // namespace compiler\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_COMPILER_PASSES_CONSTANT_PROPAGATION_PASS_H_\n"
  },
  {
    "path": "src/xenia/cpu/compiler/passes/context_promotion_pass.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/compiler/passes/context_promotion_pass.h\"\n\n#include \"xenia/apu/apu_flags.h\"\n#include \"xenia/base/cvar.h\"\n#include \"xenia/base/profiling.h\"\n#include \"xenia/cpu/compiler/compiler.h\"\n#include \"xenia/cpu/ppc/ppc_context.h\"\n#include \"xenia/cpu/processor.h\"\n\nDECLARE_bool(debug);\n\nDEFINE_bool(store_all_context_values, false,\n            \"Don't strip dead context stores to aid in debugging.\", \"CPU\");\n\nnamespace xe {\nnamespace cpu {\nnamespace compiler {\nnamespace passes {\n\n// TODO(benvanik): remove when enums redefined.\nusing namespace xe::cpu::hir;\n\nusing xe::cpu::hir::Block;\nusing xe::cpu::hir::HIRBuilder;\nusing xe::cpu::hir::Instr;\nusing xe::cpu::hir::Value;\n\nContextPromotionPass::ContextPromotionPass() : CompilerPass() {}\n\nContextPromotionPass::~ContextPromotionPass() {}\n\nbool ContextPromotionPass::Initialize(Compiler* compiler) {\n  if (!CompilerPass::Initialize(compiler)) {\n    return false;\n  }\n\n  // This is a terrible implementation.\n  context_values_.resize(sizeof(ppc::PPCContext));\n  context_validity_.resize(static_cast<uint32_t>(sizeof(ppc::PPCContext)));\n\n  return true;\n}\n\nbool ContextPromotionPass::Run(HIRBuilder* builder) {\n  // Like mem2reg, but because context memory is unaliasable it's easier to\n  // check and convert LoadContext/StoreContext into value operations.\n  // Example of load->value promotion:\n  //   v0 = load_context +100\n  //   store_context +200, v0\n  //   v1 = load_context +100  <-- replace with v1 = v0\n  //   store_context +200, v1\n  //\n  // It'd be possible in this stage to also remove redundant context stores:\n  // Example of dead store elimination:\n  //   store_context +100, v0  <-- removed due to following store\n  //   store_context +100, v1\n  // This is more generally done by DSE, however if it could be done here\n  // instead as it may be faster (at least on the block-level).\n\n  // Promote loads to values.\n  // Process each block independently, for now.\n  auto block = builder->first_block();\n  while (block) {\n    PromoteBlock(block);\n    block = block->next;\n  }\n\n  // Remove all dead stores.\n  // This will break debugging as we can't recover this information when\n  // trying to extract stack traces/register values, so we don't do that.\n  if (!cvars::debug && !cvars::store_all_context_values) {\n    block = builder->first_block();\n    while (block) {\n      RemoveDeadStoresBlock(block);\n      block = block->next;\n    }\n  }\n\n  return true;\n}\n\nvoid ContextPromotionPass::PromoteBlock(Block* block) {\n  auto& validity = context_validity_;\n  validity.reset();\n\n  Instr* i = block->instr_head;\n  while (i) {\n    auto next = i->next;\n    if (i->opcode->flags & OPCODE_FLAG_VOLATILE) {\n      // Volatile instruction - requires all context values be flushed.\n      validity.reset();\n    } else if (i->opcode == &OPCODE_LOAD_CONTEXT_info) {\n      size_t offset = i->src1.offset;\n      if (validity.test(static_cast<uint32_t>(offset))) {\n        // Legit previous value, reuse.\n        Value* previous_value = context_values_[offset];\n        i->opcode = &hir::OPCODE_ASSIGN_info;\n        i->set_src1(previous_value);\n      } else {\n        // Store the loaded value into the table.\n        context_values_[offset] = i->dest;\n        validity.set(static_cast<uint32_t>(offset));\n      }\n    } else if (i->opcode == &OPCODE_STORE_CONTEXT_info) {\n      size_t offset = i->src1.offset;\n      Value* value = i->src2.value;\n      // Store value into the table for later.\n      context_values_[offset] = value;\n      validity.set(static_cast<uint32_t>(offset));\n    }\n    i = next;\n  }\n}\n\nvoid ContextPromotionPass::RemoveDeadStoresBlock(Block* block) {\n  auto& validity = context_validity_;\n  validity.reset();\n\n  // Walk backwards and mark offsets that are written to.\n  // If the offset was written to earlier, ignore the store.\n  Instr* i = block->instr_tail;\n  while (i) {\n    Instr* prev = i->prev;\n    if (i->opcode->flags & (OPCODE_FLAG_VOLATILE | OPCODE_FLAG_BRANCH)) {\n      // Volatile instruction - requires all context values be flushed.\n      validity.reset();\n    } else if (i->opcode == &OPCODE_STORE_CONTEXT_info) {\n      size_t offset = i->src1.offset;\n      if (!validity.test(static_cast<uint32_t>(offset))) {\n        // Offset not yet written, mark and continue.\n        validity.set(static_cast<uint32_t>(offset));\n      } else {\n        // Already written to. Remove this store.\n        i->Remove();\n      }\n    }\n    i = prev;\n  }\n}\n\n}  // namespace passes\n}  // namespace compiler\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/compiler/passes/context_promotion_pass.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_COMPILER_PASSES_CONTEXT_PROMOTION_PASS_H_\n#define XENIA_CPU_COMPILER_PASSES_CONTEXT_PROMOTION_PASS_H_\n\n#include <cmath>\n#include <vector>\n\n#include \"xenia/base/platform.h\"\n#include \"xenia/cpu/compiler/compiler_pass.h\"\n\n#if XE_COMPILER_MSVC\n#pragma warning(push)\n#pragma warning(disable : 4244)\n#pragma warning(disable : 4267)\n#include <llvm/ADT/BitVector.h>\n#pragma warning(pop)\n#else\n#include <llvm/ADT/BitVector.h>\n#endif  // XE_COMPILER_MSVC\n\nnamespace xe {\nnamespace cpu {\nnamespace compiler {\nnamespace passes {\n\nclass ContextPromotionPass : public CompilerPass {\n public:\n  ContextPromotionPass();\n  virtual ~ContextPromotionPass() override;\n\n  bool Initialize(Compiler* compiler) override;\n\n  bool Run(hir::HIRBuilder* builder) override;\n\n private:\n  void PromoteBlock(hir::Block* block);\n  void RemoveDeadStoresBlock(hir::Block* block);\n\n private:\n  std::vector<hir::Value*> context_values_;\n  llvm::BitVector context_validity_;\n};\n\n}  // namespace passes\n}  // namespace compiler\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_COMPILER_PASSES_CONTEXT_PROMOTION_PASS_H_\n"
  },
  {
    "path": "src/xenia/cpu/compiler/passes/control_flow_analysis_pass.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/compiler/passes/control_flow_analysis_pass.h\"\n\n#include \"xenia/base/profiling.h\"\n#include \"xenia/cpu/backend/backend.h\"\n#include \"xenia/cpu/compiler/compiler.h\"\n#include \"xenia/cpu/processor.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace compiler {\nnamespace passes {\n\n// TODO(benvanik): remove when enums redefined.\nusing namespace xe::cpu::hir;\n\nusing xe::cpu::hir::Edge;\nusing xe::cpu::hir::HIRBuilder;\n\nControlFlowAnalysisPass::ControlFlowAnalysisPass() : CompilerPass() {}\n\nControlFlowAnalysisPass::~ControlFlowAnalysisPass() {}\n\nbool ControlFlowAnalysisPass::Run(HIRBuilder* builder) {\n  // Reset edges for all blocks. Needed to be re-runnable.\n  // Note that this wastes a bunch of arena memory, so we shouldn't\n  // re-run too often.\n  auto block = builder->first_block();\n  while (block) {\n    block->incoming_edge_head = nullptr;\n    block->outgoing_edge_head = nullptr;\n    block = block->next;\n  }\n\n  // Add edges.\n  block = builder->first_block();\n  while (block) {\n    auto instr = block->instr_tail;\n    while (instr) {\n      if ((instr->opcode->flags & OPCODE_FLAG_BRANCH) == 0) {\n        break;\n      }\n      if (instr->opcode == &OPCODE_BRANCH_info) {\n        auto label = instr->src1.label;\n        builder->AddEdge(block, label->block, Edge::UNCONDITIONAL);\n      } else if (instr->opcode == &OPCODE_BRANCH_TRUE_info ||\n                 instr->opcode == &OPCODE_BRANCH_FALSE_info) {\n        auto label = instr->src2.label;\n        builder->AddEdge(block, label->block, 0);\n      }\n      instr = instr->prev;\n    }\n    block = block->next;\n  }\n\n  // Mark dominators.\n  block = builder->first_block();\n  while (block) {\n    if (block->incoming_edge_head &&\n        !block->incoming_edge_head->incoming_next) {\n      block->incoming_edge_head->flags |= Edge::DOMINATES;\n    }\n    block = block->next;\n  }\n\n  return true;\n}\n\n}  // namespace passes\n}  // namespace compiler\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/compiler/passes/control_flow_analysis_pass.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_COMPILER_PASSES_CONTROL_FLOW_ANALYSIS_PASS_H_\n#define XENIA_CPU_COMPILER_PASSES_CONTROL_FLOW_ANALYSIS_PASS_H_\n\n#include \"xenia/cpu/compiler/compiler_pass.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace compiler {\nnamespace passes {\n\nclass ControlFlowAnalysisPass : public CompilerPass {\n public:\n  ControlFlowAnalysisPass();\n  ~ControlFlowAnalysisPass() override;\n\n  bool Run(hir::HIRBuilder* builder) override;\n\n private:\n};\n\n}  // namespace passes\n}  // namespace compiler\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_COMPILER_PASSES_CONTROL_FLOW_ANALYSIS_PASS_H_\n"
  },
  {
    "path": "src/xenia/cpu/compiler/passes/control_flow_simplification_pass.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/compiler/passes/control_flow_simplification_pass.h\"\n\n#include \"xenia/base/profiling.h\"\n#include \"xenia/cpu/backend/backend.h\"\n#include \"xenia/cpu/compiler/compiler.h\"\n#include \"xenia/cpu/processor.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace compiler {\nnamespace passes {\n\n// TODO(benvanik): remove when enums redefined.\nusing namespace xe::cpu::hir;\n\nusing xe::cpu::hir::Edge;\nusing xe::cpu::hir::HIRBuilder;\n\nControlFlowSimplificationPass::ControlFlowSimplificationPass()\n    : CompilerPass() {}\n\nControlFlowSimplificationPass::~ControlFlowSimplificationPass() {}\n\nbool ControlFlowSimplificationPass::Run(HIRBuilder* builder) {\n  // Walk forwards and kill any unreachable blocks.\n  // Do this before merging.\n  auto block = builder->first_block();\n  while (block) {\n    auto next_block = block->next;\n    if (!block->incoming_edge_head && block->prev) {\n      // Block is in the interior and has no incoming edges - kill it.\n      builder->RemoveBlock(block);\n    }\n    block = next_block;\n  }\n\n  // Walk backwards and merge blocks if possible.\n  bool merged_any = false;\n  block = builder->last_block();\n  while (block) {\n    auto prev_block = block->prev;\n    const uint32_t expected = Edge::DOMINATES | Edge::UNCONDITIONAL;\n    if (block->incoming_edge_head &&\n        (block->incoming_edge_head->flags & expected) == expected) {\n      // Dominated by the incoming block.\n      // If that block comes immediately before us then we can merge the\n      // two blocks (assuming it's not a volatile instruction like Trap).\n      if (block->prev == block->incoming_edge_head->src &&\n          block->prev->instr_tail &&\n          !(block->prev->instr_tail->opcode->flags & OPCODE_FLAG_VOLATILE)) {\n        builder->MergeAdjacentBlocks(block->prev, block);\n        merged_any = true;\n      }\n    }\n    block = prev_block;\n  }\n\n  return true;\n}\n\n}  // namespace passes\n}  // namespace compiler\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/compiler/passes/control_flow_simplification_pass.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_COMPILER_PASSES_CONTROL_FLOW_SIMPLIFICATION_PASS_H_\n#define XENIA_CPU_COMPILER_PASSES_CONTROL_FLOW_SIMPLIFICATION_PASS_H_\n\n#include \"xenia/cpu/compiler/compiler_pass.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace compiler {\nnamespace passes {\n\nclass ControlFlowSimplificationPass : public CompilerPass {\n public:\n  ControlFlowSimplificationPass();\n  ~ControlFlowSimplificationPass() override;\n\n  bool Run(hir::HIRBuilder* builder) override;\n\n private:\n};\n\n}  // namespace passes\n}  // namespace compiler\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_COMPILER_PASSES_CONTROL_FLOW_SIMPLIFICATION_PASS_H_\n"
  },
  {
    "path": "src/xenia/cpu/compiler/passes/data_flow_analysis_pass.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/compiler/passes/data_flow_analysis_pass.h\"\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/platform.h\"\n#include \"xenia/base/profiling.h\"\n#include \"xenia/cpu/backend/backend.h\"\n#include \"xenia/cpu/compiler/compiler.h\"\n#include \"xenia/cpu/processor.h\"\n\n#if XE_COMPILER_MSVC\n#pragma warning(push)\n#pragma warning(disable : 4244)\n#pragma warning(disable : 4267)\n#include <llvm/ADT/BitVector.h>\n#pragma warning(pop)\n#else\n#include <llvm/ADT/BitVector.h>\n#include <cmath>\n#endif  // XE_COMPILER_MSVC\n\nnamespace xe {\nnamespace cpu {\nnamespace compiler {\nnamespace passes {\n\n// TODO(benvanik): remove when enums redefined.\nusing namespace xe::cpu::hir;\n\nusing xe::cpu::hir::HIRBuilder;\nusing xe::cpu::hir::OpcodeSignatureType;\nusing xe::cpu::hir::Value;\n\nDataFlowAnalysisPass::DataFlowAnalysisPass() : CompilerPass() {}\n\nDataFlowAnalysisPass::~DataFlowAnalysisPass() {}\n\nbool DataFlowAnalysisPass::Run(HIRBuilder* builder) {\n  // Linearize blocks so that we can detect cycles and propagate dependencies.\n  uint32_t block_count = LinearizeBlocks(builder);\n\n  // Analyze value flow and add locals as needed.\n  AnalyzeFlow(builder, block_count);\n\n  return true;\n}\n\nuint32_t DataFlowAnalysisPass::LinearizeBlocks(HIRBuilder* builder) {\n  // TODO(benvanik): actually do this - we cheat now knowing that they are in\n  //     sequential order.\n  uint16_t block_ordinal = 0;\n  auto block = builder->first_block();\n  while (block) {\n    block->ordinal = block_ordinal++;\n    block = block->next;\n  }\n  return block_ordinal;\n}\n\nvoid DataFlowAnalysisPass::AnalyzeFlow(HIRBuilder* builder,\n                                       uint32_t block_count) {\n  uint32_t max_value_estimate =\n      builder->max_value_ordinal() + 1 + block_count * 4;\n\n  // Stash for value map. We may want to maintain this during building.\n  auto arena = builder->arena();\n  auto value_map = reinterpret_cast<Value**>(\n      arena->Alloc(sizeof(Value*) * max_value_estimate, alignof(Value)));\n\n  // Allocate incoming bitvectors for use by blocks. We don't need outgoing\n  // because they are only used during the block iteration.\n  // Mapped by block ordinal.\n  // TODO(benvanik): cache this list, grow as needed, etc.\n  auto incoming_bitvectors = (llvm::BitVector**)arena->Alloc(\n      sizeof(llvm::BitVector*) * block_count, alignof(llvm::BitVector));\n  for (auto n = 0u; n < block_count; n++) {\n    incoming_bitvectors[n] = new llvm::BitVector(max_value_estimate);\n  }\n\n  // Walk blocks in reverse and calculate incoming/outgoing values.\n  auto block = builder->last_block();\n  while (block) {\n    // Allocate bitsets based on max value number.\n    block->incoming_values = incoming_bitvectors[block->ordinal];\n    auto& incoming_values = *block->incoming_values;\n\n    // Walk instructions and gather up incoming values.\n    auto instr = block->instr_head;\n    while (instr) {\n      uint32_t signature = instr->opcode->signature;\n#define SET_INCOMING_VALUE(v)                   \\\n  if (v->def && v->def->block != block) {       \\\n    incoming_values.set(v->ordinal);            \\\n  }                                             \\\n  assert_true(v->ordinal < max_value_estimate); \\\n  value_map[v->ordinal] = v;\n      if (GET_OPCODE_SIG_TYPE_SRC1(signature) == OPCODE_SIG_TYPE_V) {\n        SET_INCOMING_VALUE(instr->src1.value);\n      }\n      if (GET_OPCODE_SIG_TYPE_SRC2(signature) == OPCODE_SIG_TYPE_V) {\n        SET_INCOMING_VALUE(instr->src2.value);\n      }\n      if (GET_OPCODE_SIG_TYPE_SRC3(signature) == OPCODE_SIG_TYPE_V) {\n        SET_INCOMING_VALUE(instr->src3.value);\n      }\n#undef SET_INCOMING_VALUE\n      instr = instr->next;\n    }\n\n    // Add all successor incoming values to our outgoing, as we need to\n    // pass them through.\n    llvm::BitVector outgoing_values(max_value_estimate);\n    auto outgoing_edge = block->outgoing_edge_head;\n    while (outgoing_edge) {\n      if (outgoing_edge->dest->ordinal > block->ordinal) {\n        outgoing_values |= *outgoing_edge->dest->incoming_values;\n      }\n      outgoing_edge = outgoing_edge->outgoing_next;\n    }\n    incoming_values |= outgoing_values;\n\n    // Add stores for all outgoing values.\n    auto outgoing_ordinal = outgoing_values.find_first();\n    while (outgoing_ordinal != -1) {\n      Value* src_value = value_map[outgoing_ordinal];\n      assert_not_null(src_value);\n      if (!src_value->local_slot) {\n        src_value->local_slot = builder->AllocLocal(src_value->type);\n      }\n      builder->StoreLocal(src_value->local_slot, src_value);\n\n      // If we are in the block the value was defined in:\n      if (src_value->def->block == block) {\n        // Move the store to right after the def, or as soon after\n        // as we can (respecting PAIRED flags).\n        auto def_next = src_value->def->next;\n        while (def_next && def_next->opcode->flags & OPCODE_FLAG_PAIRED_PREV) {\n          def_next = def_next->next;\n        }\n        assert_not_null(def_next);\n        builder->last_instr()->MoveBefore(def_next);\n\n        // We don't need it in the incoming list.\n        incoming_values.reset(outgoing_ordinal);\n      } else {\n        // Eh, just throw at the end, before the first branch.\n        auto tail = block->instr_tail;\n        while (tail && tail->opcode->flags & OPCODE_FLAG_BRANCH) {\n          tail = tail->prev;\n        }\n        assert_not_zero(tail);\n        builder->last_instr()->MoveBefore(tail->next);\n      }\n\n      outgoing_ordinal = outgoing_values.find_next(outgoing_ordinal);\n    }\n\n    // Add loads for all incoming values and rename them in the block.\n    auto incoming_ordinal = incoming_values.find_first();\n    while (incoming_ordinal != -1) {\n      Value* src_value = value_map[incoming_ordinal];\n      assert_not_null(src_value);\n      if (!src_value->local_slot) {\n        src_value->local_slot = builder->AllocLocal(src_value->type);\n      }\n      Value* local_value = builder->LoadLocal(src_value->local_slot);\n      builder->last_instr()->MoveBefore(block->instr_head);\n\n      // Swap uses of original value with the local value.\n      instr = block->instr_head;\n      while (instr) {\n        uint32_t signature = instr->opcode->signature;\n        if (GET_OPCODE_SIG_TYPE_SRC1(signature) == OPCODE_SIG_TYPE_V) {\n          if (instr->src1.value == src_value) {\n            instr->set_src1(local_value);\n          }\n        }\n        if (GET_OPCODE_SIG_TYPE_SRC2(signature) == OPCODE_SIG_TYPE_V) {\n          if (instr->src2.value == src_value) {\n            instr->set_src2(local_value);\n          }\n        }\n        if (GET_OPCODE_SIG_TYPE_SRC3(signature) == OPCODE_SIG_TYPE_V) {\n          if (instr->src3.value == src_value) {\n            instr->set_src3(local_value);\n          }\n        }\n        instr = instr->next;\n      }\n\n      incoming_ordinal = incoming_values.find_next(incoming_ordinal);\n    }\n\n    block = block->prev;\n  }\n\n  // Cleanup bitvectors.\n  for (auto n = 0u; n < block_count; n++) {\n    delete incoming_bitvectors[n];\n  }\n}\n\n}  // namespace passes\n}  // namespace compiler\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/compiler/passes/data_flow_analysis_pass.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_COMPILER_PASSES_DATA_FLOW_ANALYSIS_PASS_H_\n#define XENIA_CPU_COMPILER_PASSES_DATA_FLOW_ANALYSIS_PASS_H_\n\n#include \"xenia/cpu/compiler/compiler_pass.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace compiler {\nnamespace passes {\n\nclass DataFlowAnalysisPass : public CompilerPass {\n public:\n  DataFlowAnalysisPass();\n  ~DataFlowAnalysisPass() override;\n\n  bool Run(hir::HIRBuilder* builder) override;\n\n private:\n  uint32_t LinearizeBlocks(hir::HIRBuilder* builder);\n  void AnalyzeFlow(hir::HIRBuilder* builder, uint32_t block_count);\n};\n\n}  // namespace passes\n}  // namespace compiler\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_COMPILER_PASSES_DATA_FLOW_ANALYSIS_PASS_H_\n"
  },
  {
    "path": "src/xenia/cpu/compiler/passes/dead_code_elimination_pass.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/compiler/passes/dead_code_elimination_pass.h\"\n\n#include \"xenia/base/profiling.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace compiler {\nnamespace passes {\n\n// TODO(benvanik): remove when enums redefined.\nusing namespace xe::cpu::hir;\n\nusing xe::cpu::hir::HIRBuilder;\nusing xe::cpu::hir::Instr;\nusing xe::cpu::hir::Value;\n\nDeadCodeEliminationPass::DeadCodeEliminationPass() : CompilerPass() {}\n\nDeadCodeEliminationPass::~DeadCodeEliminationPass() {}\n\nbool DeadCodeEliminationPass::Run(HIRBuilder* builder) {\n  // ContextPromotion/DSE will likely leave around a lot of dead statements.\n  // Code generated for comparison/testing produces many unused statements and\n  // with proper use analysis it should be possible to remove most of them:\n  // After context promotion/simplification:\n  //   v33.i8 = compare_ult v31.i32, 0\n  //   v34.i8 = compare_ugt v31.i32, 0\n  //   v35.i8 = compare_eq v31.i32, 0\n  //   store_context +300, v33.i8\n  //   store_context +301, v34.i8\n  //   store_context +302, v35.i8\n  //   branch_true v35.i8, loc_8201A484\n  // After DSE:\n  //   v33.i8 = compare_ult v31.i32, 0\n  //   v34.i8 = compare_ugt v31.i32, 0\n  //   v35.i8 = compare_eq v31.i32, 0\n  //   branch_true v35.i8, loc_8201A484\n  // After DCE:\n  //   v35.i8 = compare_eq v31.i32, 0\n  //   branch_true v35.i8, loc_8201A484\n\n  // This also removes useless ASSIGNs:\n  //   v1 = v0\n  //   v2 = add v1, v1\n  // becomes:\n  //   v2 = add v0, v0\n\n  // We process DCE by reverse iterating over instructions and looking at the\n  // use count of the dest value. If it's zero, we can safely remove the\n  // instruction. Once we do that, the use counts of any of the src ops may\n  // go to zero and we recursively kill up the graph. This is kind of\n  // nasty in that we walk randomly and scribble all over memory, but (I think)\n  // it's better than doing passes over all instructions until we quiesce.\n  // To prevent our iteration from getting all messed up we just replace\n  // all removed ops with NOP and then do a single pass that removes them\n  // all.\n\n  bool any_instr_removed = false;\n  bool any_locals_removed = false;\n  auto block = builder->first_block();\n  while (block) {\n    // Walk instructions in reverse.\n    Instr* i = block->instr_tail;\n    while (i) {\n      auto prev = i->prev;\n\n      auto opcode = i->opcode;\n      if (!(opcode->flags & OPCODE_FLAG_VOLATILE) && i->dest &&\n          !i->dest->use_head) {\n        // Has no uses and is not volatile. This instruction can die!\n        MakeNopRecursive(i);\n        any_instr_removed = true;\n      } else if (opcode == &OPCODE_ASSIGN_info) {\n        // Assignment. These are useless, so just try to remove by completely\n        // replacing the value.\n        ReplaceAssignment(i);\n      }\n\n      i = prev;\n    }\n\n    // Walk instructions forward.\n    i = block->instr_head;\n    while (i) {\n      auto next = i->next;\n\n      auto opcode = i->opcode;\n      if (opcode == &OPCODE_STORE_LOCAL_info) {\n        // Check to see if the store has any interceeding uses after the load.\n        // If not, it can be removed (as the local is just passing through the\n        // function).\n        // We do this after the previous pass so that removed code doesn't keep\n        // the local alive.\n        if (!CheckLocalUse(i)) {\n          any_locals_removed = true;\n        }\n      }\n\n      i = next;\n    }\n\n    block = block->next;\n  }\n\n  // Remove all nops.\n  if (any_instr_removed) {\n    block = builder->first_block();\n    while (block) {\n      Instr* i = block->instr_head;\n      while (i) {\n        Instr* next = i->next;\n        if (i->opcode == &OPCODE_NOP_info) {\n          // Nop - remove!\n          i->Remove();\n        }\n        i = next;\n      }\n      block = block->next;\n    }\n  }\n\n  // Remove any locals that no longer have uses.\n  if (any_locals_removed) {\n    // TODO(benvanik): local removal/dealloc.\n    auto locals = builder->locals();\n    for (auto it = locals.begin(); it != locals.end();) {\n      auto next = ++it;\n      auto value = *it;\n      if (!value->use_head) {\n        // Unused, can be removed.\n        locals.erase(it);\n      }\n      it = next;\n    }\n  }\n\n  return true;\n}\n\nvoid DeadCodeEliminationPass::MakeNopRecursive(Instr* i) {\n  i->opcode = &hir::OPCODE_NOP_info;\n  i->dest->def = NULL;\n  i->dest = NULL;\n\n#define MAKE_NOP_SRC(n)                                  \\\n  if (i->src##n##_use) {                                 \\\n    Value::Use* use = i->src##n##_use;                   \\\n    Value* value = i->src##n.value;                      \\\n    i->src##n##_use = NULL;                              \\\n    i->src##n.value = NULL;                              \\\n    value->RemoveUse(use);                               \\\n    if (!value->use_head) {                              \\\n      /* Value is now unused, so recursively kill it. */ \\\n      if (value->def && value->def != i) {               \\\n        MakeNopRecursive(value->def);                    \\\n      }                                                  \\\n    }                                                    \\\n  }\n  MAKE_NOP_SRC(1);\n  MAKE_NOP_SRC(2);\n  MAKE_NOP_SRC(3);\n}\n\nvoid DeadCodeEliminationPass::ReplaceAssignment(Instr* i) {\n  auto src = i->src1.value;\n  auto dest = i->dest;\n\n  auto use = dest->use_head;\n  while (use) {\n    auto use_instr = use->instr;\n    if (use_instr->src1.value == dest) {\n      use_instr->set_src1(src);\n    }\n    if (use_instr->src2.value == dest) {\n      use_instr->set_src2(src);\n    }\n    if (use_instr->src3.value == dest) {\n      use_instr->set_src3(src);\n    }\n    use = use->next;\n  }\n\n  i->Remove();\n}\n\nbool DeadCodeEliminationPass::CheckLocalUse(Instr* i) {\n  auto src = i->src2.value;\n\n  auto use = src->use_head;\n  if (use) {\n    auto use_instr = use->instr;\n    if (use_instr->opcode != &OPCODE_LOAD_LOCAL_info) {\n      // A valid use (probably). Keep it.\n      return true;\n    }\n\n    // Load/store are paired. They can both be removed.\n    use_instr->Remove();\n  }\n\n  i->Remove();\n\n  return false;\n}\n\n}  // namespace passes\n}  // namespace compiler\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/compiler/passes/dead_code_elimination_pass.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_COMPILER_PASSES_DEAD_CODE_ELIMINATION_PASS_H_\n#define XENIA_CPU_COMPILER_PASSES_DEAD_CODE_ELIMINATION_PASS_H_\n\n#include \"xenia/cpu/compiler/compiler_pass.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace compiler {\nnamespace passes {\n\nclass DeadCodeEliminationPass : public CompilerPass {\n public:\n  DeadCodeEliminationPass();\n  ~DeadCodeEliminationPass() override;\n\n  bool Run(hir::HIRBuilder* builder) override;\n\n private:\n  void MakeNopRecursive(hir::Instr* i);\n  void ReplaceAssignment(hir::Instr* i);\n  bool CheckLocalUse(hir::Instr* i);\n};\n\n}  // namespace passes\n}  // namespace compiler\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_COMPILER_PASSES_DEAD_CODE_ELIMINATION_PASS_H_\n"
  },
  {
    "path": "src/xenia/cpu/compiler/passes/finalization_pass.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/compiler/passes/finalization_pass.h\"\n\n#include \"third_party/fmt/include/fmt/format.h\"\n#include \"xenia/base/profiling.h\"\n#include \"xenia/cpu/backend/backend.h\"\n#include \"xenia/cpu/compiler/compiler.h\"\n#include \"xenia/cpu/processor.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace compiler {\nnamespace passes {\n\n// TODO(benvanik): remove when enums redefined.\nusing namespace xe::cpu::hir;\n\nusing xe::cpu::hir::HIRBuilder;\n\nFinalizationPass::FinalizationPass() : CompilerPass() {}\n\nFinalizationPass::~FinalizationPass() {}\n\nbool FinalizationPass::Run(HIRBuilder* builder) {\n  // Process the HIR and prepare it for lowering.\n  // After this is done the HIR should be ready for emitting.\n\n  auto arena = builder->arena();\n\n  uint16_t block_ordinal = 0;\n  auto block = builder->first_block();\n  while (block) {\n    block->ordinal = block_ordinal++;\n\n    // Ensure all labels have names.\n    auto label = block->label_head;\n    while (label) {\n      if (!label->name) {\n        const size_t label_len = 6 + 4;\n        char* name = reinterpret_cast<char*>(arena->Alloc(label_len + 1, 1));\n        assert_true(label->id <= 65535);\n        auto end = fmt::format_to_n(name, label_len, \"_label{:04X}\", label->id);\n        name[end.size] = '\\0';\n        label->name = name;\n      }\n      label = label->next;\n    }\n\n    // Remove unneeded jumps.\n    auto tail = block->instr_tail;\n    if (tail && tail->opcode == &OPCODE_BRANCH_info) {\n      // Jump. Check target.\n      auto target = tail->src1.label;\n      if (target->block == block->next) {\n        // Jumping to subsequent block. Remove.\n        tail->Remove();\n      }\n    }\n\n    block = block->next;\n  }\n\n  return true;\n}\n\n}  // namespace passes\n}  // namespace compiler\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/compiler/passes/finalization_pass.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_COMPILER_PASSES_FINALIZATION_PASS_H_\n#define XENIA_CPU_COMPILER_PASSES_FINALIZATION_PASS_H_\n\n#include \"xenia/cpu/compiler/compiler_pass.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace compiler {\nnamespace passes {\n\nclass FinalizationPass : public CompilerPass {\n public:\n  FinalizationPass();\n  ~FinalizationPass() override;\n\n  bool Run(hir::HIRBuilder* builder) override;\n\n private:\n};\n\n}  // namespace passes\n}  // namespace compiler\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_COMPILER_PASSES_FINALIZATION_PASS_H_\n"
  },
  {
    "path": "src/xenia/cpu/compiler/passes/memory_sequence_combination_pass.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2015 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/compiler/passes/memory_sequence_combination_pass.h\"\n\n#include \"xenia/base/profiling.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace compiler {\nnamespace passes {\n\n// TODO(benvanik): remove when enums redefined.\nusing namespace xe::cpu::hir;\n\nusing xe::cpu::hir::HIRBuilder;\nusing xe::cpu::hir::Instr;\nusing xe::cpu::hir::Value;\n\nMemorySequenceCombinationPass::MemorySequenceCombinationPass()\n    : CompilerPass() {}\n\nMemorySequenceCombinationPass::~MemorySequenceCombinationPass() = default;\n\nbool MemorySequenceCombinationPass::Run(HIRBuilder* builder) {\n  // Run over all loads and stores and see if we can collapse sequences into the\n  // fat opcodes. See the respective utility functions for examples.\n  auto block = builder->first_block();\n  while (block) {\n    auto i = block->instr_head;\n    while (i) {\n      if (i->opcode == &OPCODE_LOAD_info ||\n          i->opcode == &OPCODE_LOAD_OFFSET_info) {\n        CombineLoadSequence(i);\n      } else if (i->opcode == &OPCODE_STORE_info ||\n                 i->opcode == &OPCODE_STORE_OFFSET_info) {\n        CombineStoreSequence(i);\n      }\n      i = i->next;\n    }\n    block = block->next;\n  }\n  return true;\n}\n\nvoid MemorySequenceCombinationPass::CombineLoadSequence(Instr* i) {\n  // Load with swap:\n  //   v1.i32 = load v0\n  //   v2.i32 = byte_swap v1.i32\n  // becomes:\n  //   v1.i32 = load v0, [swap]\n  //\n  // Load with swap and extend:\n  //   v1.i32 = load v0\n  //   v2.i32 = byte_swap v1.i32\n  //   v3.i64 = zero_extend v2.i32\n  // becomes:\n  //   v1.i64 = load_convert v0, [swap|i32->i64,zero]\n\n  if (!i->dest->use_head) {\n    // No uses of the load result - ignore. Will be killed by DCE.\n    return;\n  }\n\n  // Ensure all uses of the load result are BYTE_SWAP - if it's mixed we\n  // shouldn't transform as we'd have to introduce new swaps!\n  auto use = i->dest->use_head;\n  while (use) {\n    if (use->instr->opcode != &OPCODE_BYTE_SWAP_info) {\n      // Not a swap.\n      return;\n    }\n    // TODO(benvanik): allow uses by STORE (we can make that swap).\n    use = use->next;\n  }\n\n  // Merge byte swap into load.\n  // Note that we may have already been a swapped operation - this inverts that.\n  i->flags ^= LoadStoreFlags::LOAD_STORE_BYTE_SWAP;\n\n  // Replace use of byte swap value with loaded value.\n  // It's byte_swap vN -> assign vN, so not much to do.\n  use = i->dest->use_head;\n  while (use) {\n    auto next_use = use->next;\n    use->instr->opcode = &OPCODE_ASSIGN_info;\n    use->instr->flags = 0;\n    use = next_use;\n  }\n\n  // TODO(benvanik): merge in extend/truncate.\n}\n\nvoid MemorySequenceCombinationPass::CombineStoreSequence(Instr* i) {\n  // Store with swap:\n  //   v1.i32 = ...\n  //   v2.i32 = byte_swap v1.i32\n  //   store v0, v2.i32\n  // becomes:\n  //   store v0, v1.i32, [swap]\n  //\n  // Store with truncate and swap:\n  //   v1.i64 = ...\n  //   v2.i32 = truncate v1.i64\n  //   v3.i32 = byte_swap v2.i32\n  //   store v0, v3.i32\n  // becomes:\n  //   store_convert v0, v1.i64, [swap|i64->i32,trunc]\n\n  auto src = i->src2.value;\n  if (i->opcode == &OPCODE_STORE_OFFSET_info) {\n    src = i->src3.value;\n  }\n\n  if (src->IsConstant()) {\n    // Constant value write - ignore.\n    return;\n  }\n\n  // Find source and ensure it is a byte swap.\n  auto def = src->def;\n  while (def && def->opcode == &OPCODE_ASSIGN_info) {\n    // Skip asignments.\n    def = def->src1.value->def;\n  }\n  if (!def || def->opcode != &OPCODE_BYTE_SWAP_info) {\n    // Not a swap/not defined?\n    return;\n  }\n\n  // Merge byte swap into store.\n  // Note that we may have already been a swapped operation - this inverts\n  // that.\n  i->flags ^= LoadStoreFlags::LOAD_STORE_BYTE_SWAP;\n\n  // Pull the original value (from before the byte swap).\n  // The byte swap itself will go away in DCE.\n  if (i->opcode == &OPCODE_STORE_info) {\n    i->set_src2(def->src1.value);\n  } else if (i->opcode == &OPCODE_STORE_OFFSET_info) {\n    i->set_src3(def->src1.value);\n  }\n\n  // TODO(benvanik): extend/truncate.\n}\n\n}  // namespace passes\n}  // namespace compiler\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/compiler/passes/memory_sequence_combination_pass.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2015 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_COMPILER_PASSES_MEMORY_SEQUENCE_COMBINATION_PASS_H_\n#define XENIA_CPU_COMPILER_PASSES_MEMORY_SEQUENCE_COMBINATION_PASS_H_\n\n#include \"xenia/cpu/compiler/compiler_pass.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace compiler {\nnamespace passes {\n\nclass MemorySequenceCombinationPass : public CompilerPass {\n public:\n  MemorySequenceCombinationPass();\n  ~MemorySequenceCombinationPass() override;\n\n  bool Run(hir::HIRBuilder* builder) override;\n\n private:\n  void CombineMemorySequences(hir::HIRBuilder* builder);\n  void CombineLoadSequence(hir::Instr* i);\n  void CombineStoreSequence(hir::Instr* i);\n};\n\n}  // namespace passes\n}  // namespace compiler\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_COMPILER_PASSES_MEMORY_SEQUENCE_COMBINATION_PASS_H_\n"
  },
  {
    "path": "src/xenia/cpu/compiler/passes/register_allocation_pass.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/compiler/passes/register_allocation_pass.h\"\n\n#include <algorithm>\n#include <cstring>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/profiling.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace compiler {\nnamespace passes {\n\n// TODO(benvanik): remove when enums redefined.\nusing namespace xe::cpu::hir;\n\nusing xe::cpu::backend::MachineInfo;\nusing xe::cpu::hir::HIRBuilder;\nusing xe::cpu::hir::Instr;\nusing xe::cpu::hir::OpcodeSignatureType;\nusing xe::cpu::hir::RegAssignment;\nusing xe::cpu::hir::TypeName;\nusing xe::cpu::hir::Value;\n\n#define ASSERT_NO_CYCLES 0\n\nRegisterAllocationPass::RegisterAllocationPass(const MachineInfo* machine_info)\n    : CompilerPass() {\n  // Initialize register sets.\n  // TODO(benvanik): rewrite in a way that makes sense - this is terrible.\n  auto mi_sets = machine_info->register_sets;\n  std::memset(&usage_sets_, 0, sizeof(usage_sets_));\n  uint32_t n = 0;\n  while (mi_sets[n].count) {\n    auto& mi_set = mi_sets[n];\n    auto usage_set = new RegisterSetUsage();\n    usage_sets_.all_sets[n] = usage_set;\n    usage_set->count = mi_set.count;\n    usage_set->set = &mi_set;\n    if (mi_set.types & MachineInfo::RegisterSet::INT_TYPES) {\n      usage_sets_.int_set = usage_set;\n    }\n    if (mi_set.types & MachineInfo::RegisterSet::FLOAT_TYPES) {\n      usage_sets_.float_set = usage_set;\n    }\n    if (mi_set.types & MachineInfo::RegisterSet::VEC_TYPES) {\n      usage_sets_.vec_set = usage_set;\n    }\n    n++;\n  }\n}\n\nRegisterAllocationPass::~RegisterAllocationPass() {\n  for (size_t n = 0; n < xe::countof(usage_sets_.all_sets); n++) {\n    if (!usage_sets_.all_sets[n]) {\n      break;\n    }\n    delete usage_sets_.all_sets[n];\n  }\n}\n\nbool RegisterAllocationPass::Run(HIRBuilder* builder) {\n  // Simple per-block allocator that operates on SSA form.\n  // Registers do not move across blocks, though this could be\n  // optimized with some intra-block analysis (dominators/etc).\n  // Really, it'd just be nice to have someone who knew what they\n  // were doing lower SSA and do this right.\n\n  uint16_t block_ordinal = 0;\n  uint32_t instr_ordinal = 0;\n  auto block = builder->first_block();\n  while (block) {\n    // Sequential block ordinals.\n    block->ordinal = block_ordinal++;\n\n    // Reset all state.\n    PrepareBlockState();\n\n    // Renumber all instructions in the block. This is required so that\n    // we can sort the usage pointers below.\n    auto instr = block->instr_head;\n    while (instr) {\n      // Sequential global instruction ordinals.\n      instr->ordinal = instr_ordinal++;\n      instr = instr->next;\n    }\n\n    instr = block->instr_head;\n    while (instr) {\n      const auto info = instr->opcode;\n      uint32_t signature = info->signature;\n\n      // Update the register use heaps.\n      AdvanceUses(instr);\n\n      // Check sources for retirement. If any are unused after this instruction\n      // we can eagerly evict them to speed up register allocation.\n      // Since X64 (and other platforms) can often take advantage of dest==src1\n      // register mappings we track retired src1 so that we can attempt to\n      // reuse it.\n      // NOTE: these checks require that the usage list be sorted!\n      bool has_preferred_reg = false;\n      RegAssignment preferred_reg = {0};\n      if (GET_OPCODE_SIG_TYPE_SRC1(signature) == OPCODE_SIG_TYPE_V &&\n          !instr->src1.value->IsConstant()) {\n        if (!instr->src1_use->next) {\n          // Pull off preferred register. We will try to reuse this for the\n          // dest.\n          // NOTE: set may be null if this is a store local.\n          if (preferred_reg.set) {\n            has_preferred_reg = true;\n            preferred_reg = instr->src1.value->reg;\n          }\n        }\n      }\n\n      if (GET_OPCODE_SIG_TYPE_DEST(signature) == OPCODE_SIG_TYPE_V) {\n        // Must not have been set already.\n        assert_null(instr->dest->reg.set);\n\n        // Sort the usage list. We depend on this in future uses of this\n        // variable.\n        SortUsageList(instr->dest);\n\n        // If we have a preferred register, use that.\n        // This way we can help along the stupid X86 two opcode instructions.\n        bool allocated;\n        if (has_preferred_reg) {\n          // Allocate with the given preferred register. If the register is in\n          // the wrong set it will not be reused.\n          allocated = TryAllocateRegister(instr->dest, preferred_reg);\n        } else {\n          // Allocate a register. This will either reserve a free one or\n          // spill and reuse an active one.\n          allocated = TryAllocateRegister(instr->dest);\n        }\n        if (!allocated) {\n          // Failed to allocate register -- need to spill and try again.\n          // We spill only those registers we aren't using.\n          if (!SpillOneRegister(builder, block, instr->dest->type)) {\n            // Unable to spill anything - this shouldn't happen.\n            XELOGE(\"Unable to spill any registers\");\n            assert_always();\n            return false;\n          }\n\n          // Demand allocation.\n          if (!TryAllocateRegister(instr->dest)) {\n            // Boned.\n            XELOGE(\"Register allocation failed\");\n            assert_always();\n            return false;\n          }\n        }\n      }\n\n      instr = instr->next;\n    }\n    block = block->next;\n  }\n\n  return true;\n}\n\nvoid RegisterAllocationPass::DumpUsage(const char* name) {\n#if 0\n  fprintf(stdout, \"\\n%s:\\n\", name);\n  for (size_t i = 0; i < xe::countof(usage_sets_.all_sets); ++i) {\n    auto usage_set = usage_sets_.all_sets[i];\n    if (usage_set) {\n      fprintf(stdout, \"set %s:\\n\", usage_set->set->name);\n      fprintf(stdout, \"  avail: %s\\n\",\n              usage_set->availability.to_string().c_str());\n      fprintf(stdout, \"  upcoming uses:\\n\");\n      for (auto it = usage_set->upcoming_uses.begin();\n           it != usage_set->upcoming_uses.end(); ++it) {\n        fprintf(stdout, \"    v%d, used at %d\\n\",\n                it->value->ordinal,\n                it->use->instr->ordinal);\n      }\n    }\n  }\n  fflush(stdout);\n#endif\n}\n\nvoid RegisterAllocationPass::PrepareBlockState() {\n  for (size_t i = 0; i < xe::countof(usage_sets_.all_sets); ++i) {\n    auto usage_set = usage_sets_.all_sets[i];\n    if (usage_set) {\n      usage_set->availability.set();\n      usage_set->upcoming_uses.clear();\n    }\n  }\n  DumpUsage(\"PrepareBlockState\");\n}\n\nvoid RegisterAllocationPass::AdvanceUses(Instr* instr) {\n  for (size_t i = 0; i < xe::countof(usage_sets_.all_sets); ++i) {\n    auto usage_set = usage_sets_.all_sets[i];\n    if (!usage_set) {\n      break;\n    }\n    auto& upcoming_uses = usage_set->upcoming_uses;\n    for (size_t j = 0; j < upcoming_uses.size();) {\n      auto& upcoming_use = upcoming_uses.at(j);\n      if (!upcoming_use.use) {\n        // No uses at all - we can remove right away.\n        // This comes up from instructions where the dest is never used,\n        // like the ATOMIC ops.\n        MarkRegAvailable(upcoming_use.value->reg);\n        upcoming_uses.erase(upcoming_uses.begin() + j);\n        // i remains the same.\n        continue;\n      }\n      if (upcoming_use.use->instr != instr) {\n        // Not yet at this instruction.\n        ++j;\n        continue;\n      }\n      // The use is from this instruction.\n      if (!upcoming_use.use->next) {\n        // Last use of the value. We can retire it now.\n        MarkRegAvailable(upcoming_use.value->reg);\n        upcoming_uses.erase(upcoming_uses.begin() + j);\n        // i remains the same.\n        continue;\n      } else {\n        // Used again. Push back the next use.\n        // Note that we may be used multiple times this instruction, so\n        // eat those.\n        auto next_use = upcoming_use.use->next;\n        while (next_use->next && next_use->instr == instr) {\n          next_use = next_use->next;\n        }\n        // Remove the iterator.\n        auto value = upcoming_use.value;\n        upcoming_uses.erase(upcoming_uses.begin() + j);\n        assert_true(next_use->instr->block == instr->block);\n        assert_true(value->def->block == instr->block);\n        upcoming_uses.emplace_back(value, next_use);\n        // i remains the same.\n        continue;\n      }\n    }\n  }\n  DumpUsage(\"AdvanceUses\");\n}\n\nbool RegisterAllocationPass::IsRegInUse(const RegAssignment& reg) {\n  RegisterSetUsage* usage_set;\n  if (reg.set == usage_sets_.int_set->set) {\n    usage_set = usage_sets_.int_set;\n  } else if (reg.set == usage_sets_.float_set->set) {\n    usage_set = usage_sets_.float_set;\n  } else {\n    usage_set = usage_sets_.vec_set;\n  }\n  return !usage_set->availability.test(reg.index);\n}\n\nRegisterAllocationPass::RegisterSetUsage* RegisterAllocationPass::MarkRegUsed(\n    const RegAssignment& reg, Value* value, Value::Use* use) {\n  auto usage_set = RegisterSetForValue(value);\n  usage_set->availability.set(reg.index, false);\n  usage_set->upcoming_uses.emplace_back(value, use);\n  DumpUsage(\"MarkRegUsed\");\n  return usage_set;\n}\n\nRegisterAllocationPass::RegisterSetUsage*\nRegisterAllocationPass::MarkRegAvailable(const hir::RegAssignment& reg) {\n  RegisterSetUsage* usage_set;\n  if (reg.set == usage_sets_.int_set->set) {\n    usage_set = usage_sets_.int_set;\n  } else if (reg.set == usage_sets_.float_set->set) {\n    usage_set = usage_sets_.float_set;\n  } else {\n    usage_set = usage_sets_.vec_set;\n  }\n  usage_set->availability.set(reg.index, true);\n  return usage_set;\n}\n\nbool RegisterAllocationPass::TryAllocateRegister(\n    Value* value, const RegAssignment& preferred_reg) {\n  // If the preferred register matches type and is available, use it.\n  auto usage_set = RegisterSetForValue(value);\n  if (usage_set->set == preferred_reg.set) {\n    // Check if available.\n    if (!IsRegInUse(preferred_reg)) {\n      // Mark as in-use and return. Best case.\n      MarkRegUsed(preferred_reg, value, value->use_head);\n      value->reg = preferred_reg;\n      return true;\n    }\n  }\n\n  // Otherwise, fallback to allocating like normal.\n  return TryAllocateRegister(value);\n}\n\nbool RegisterAllocationPass::TryAllocateRegister(Value* value) {\n  // Get the set this register is in.\n  RegisterSetUsage* usage_set = RegisterSetForValue(value);\n\n  // Find the first free register, if any.\n  // We have to ensure it's a valid one (in our count).\n  uint32_t first_unused = 0;\n  bool none_used = xe::bit_scan_forward(\n      static_cast<uint32_t>(usage_set->availability.to_ulong()), &first_unused);\n  if (none_used && first_unused < usage_set->count) {\n    // Available! Use it!\n    value->reg.set = usage_set->set;\n    value->reg.index = first_unused;\n    MarkRegUsed(value->reg, value, value->use_head);\n    return true;\n  }\n\n  // None available! Spill required.\n  return false;\n}\n\nbool RegisterAllocationPass::SpillOneRegister(HIRBuilder* builder, Block* block,\n                                              TypeName required_type) {\n  // Get the set that we will be picking from.\n  RegisterSetUsage* usage_set;\n  if (required_type <= INT64_TYPE) {\n    usage_set = usage_sets_.int_set;\n  } else if (required_type <= FLOAT64_TYPE) {\n    usage_set = usage_sets_.float_set;\n  } else {\n    usage_set = usage_sets_.vec_set;\n  }\n\n  DumpUsage(\"SpillOneRegister (pre)\");\n  // Pick the one with the furthest next use.\n  assert_true(!usage_set->upcoming_uses.empty());\n  auto furthest_usage =\n      std::max_element(usage_set->upcoming_uses.begin(),\n                       usage_set->upcoming_uses.end(), &RegisterUsage::Compare);\n  assert_true(furthest_usage->value->def->block == block);\n  assert_true(furthest_usage->use->instr->block == block);\n  auto spill_value = furthest_usage->value;\n  Value::Use* prev_use = furthest_usage->use->prev;\n  Value::Use* next_use = furthest_usage->use;\n  assert_not_null(next_use);\n  usage_set->upcoming_uses.erase(furthest_usage);\n  DumpUsage(\"SpillOneRegister (post)\");\n  const auto reg = spill_value->reg;\n\n  // We know the spill_value use list is sorted, so we can cut it right now.\n  // This makes it easier down below.\n  auto new_head_use = next_use;\n\n  // Allocate local.\n  if (spill_value->local_slot) {\n    // Value is already assigned a slot. Since we allocate in order and this is\n    // all SSA we know the stored value will be exactly what we want. Yay,\n    // we can prevent the redundant store!\n    // In fact, we may even want to pin this spilled value so that we always\n    // use the spilled value and prevent the need for more locals.\n  } else {\n    // Allocate a local slot.\n    spill_value->local_slot = builder->AllocLocal(spill_value->type);\n\n    // Add store.\n    builder->StoreLocal(spill_value->local_slot, spill_value);\n    auto spill_store = builder->last_instr();\n    auto spill_store_use = spill_store->src2_use;\n    assert_null(spill_store_use->prev);\n    if (prev_use && prev_use->instr->opcode->flags & OPCODE_FLAG_PAIRED_PREV) {\n      // Instruction is paired. This is bad. We will insert the spill after the\n      // paired instruction.\n      assert_not_null(prev_use->instr->next);\n      spill_store->MoveBefore(prev_use->instr->next);\n\n      // Update last use.\n      spill_value->last_use = spill_store;\n    } else if (prev_use) {\n      // We insert the store immediately before the previous use.\n      // If we were smarter we could then re-run allocation and reuse the\n      // register\n      // once dropped.\n      spill_store->MoveBefore(prev_use->instr);\n\n      // Update last use.\n      spill_value->last_use = prev_use->instr;\n    } else {\n      // This is the first use, so the only thing we have is the define.\n      // Move the store to right after that.\n      spill_store->MoveBefore(spill_value->def->next);\n\n      // Update last use.\n      spill_value->last_use = spill_store;\n    }\n  }\n\n#if ASSERT_NO_CYCLES\n  builder->AssertNoCycles();\n  spill_value->def->block->AssertNoCycles();\n#endif  // ASSERT_NO_CYCLES\n\n  // Add load.\n  // Inserted immediately before the next use. Since by definition the next\n  // use is after the instruction requesting the spill we know we haven't\n  // done allocation for that code yet and can let that be handled\n  // automatically when we get to it.\n  auto new_value = builder->LoadLocal(spill_value->local_slot);\n  auto spill_load = builder->last_instr();\n  spill_load->MoveBefore(next_use->instr);\n  // Note: implicit first use added.\n\n#if ASSERT_NO_CYCLES\n  builder->AssertNoCycles();\n  spill_value->def->block->AssertNoCycles();\n#endif  // ASSERT_NO_CYCLES\n\n  // Set the local slot of the new value to our existing one. This way we will\n  // reuse that same memory if needed.\n  new_value->local_slot = spill_value->local_slot;\n\n  // Rename all future uses of the SSA value to the new value as loaded\n  // from the local.\n  // We can quickly do this by walking the use list. Because the list is\n  // already sorted we know we are going to end up with a sorted list.\n  auto walk_use = new_head_use;\n  auto new_use_tail = walk_use;\n  while (walk_use) {\n    auto next_walk_use = walk_use->next;\n    auto instr = walk_use->instr;\n\n    uint32_t signature = instr->opcode->signature;\n    if (GET_OPCODE_SIG_TYPE_SRC1(signature) == OPCODE_SIG_TYPE_V) {\n      if (instr->src1.value == spill_value) {\n        instr->set_src1(new_value);\n      }\n    }\n    if (GET_OPCODE_SIG_TYPE_SRC2(signature) == OPCODE_SIG_TYPE_V) {\n      if (instr->src2.value == spill_value) {\n        instr->set_src2(new_value);\n      }\n    }\n    if (GET_OPCODE_SIG_TYPE_SRC3(signature) == OPCODE_SIG_TYPE_V) {\n      if (instr->src3.value == spill_value) {\n        instr->set_src3(new_value);\n      }\n    }\n\n    walk_use = next_walk_use;\n    if (walk_use) {\n      new_use_tail = walk_use;\n    }\n  }\n  new_value->last_use = new_use_tail->instr;\n\n  // Update tracking.\n  MarkRegAvailable(reg);\n\n  return true;\n}\n\nRegisterAllocationPass::RegisterSetUsage*\nRegisterAllocationPass::RegisterSetForValue(const Value* value) {\n  if (value->type <= INT64_TYPE) {\n    return usage_sets_.int_set;\n  } else if (value->type <= FLOAT64_TYPE) {\n    return usage_sets_.float_set;\n  } else {\n    return usage_sets_.vec_set;\n  }\n}\n\nnamespace {\nint CompareValueUse(const Value::Use* a, const Value::Use* b) {\n  return a->instr->ordinal - b->instr->ordinal;\n}\n}  // namespace\nvoid RegisterAllocationPass::SortUsageList(Value* value) {\n  // Modified in-place linked list sort from:\n  // https://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.c\n  if (!value->use_head) {\n    return;\n  }\n  Value::Use* head = value->use_head;\n  Value::Use* tail = nullptr;\n  int insize = 1;\n  while (true) {\n    auto p = head;\n    head = nullptr;\n    tail = nullptr;\n    // count number of merges we do in this pass\n    int nmerges = 0;\n    while (p) {\n      // there exists a merge to be done\n      nmerges++;\n      // step 'insize' places along from p\n      auto q = p;\n      int psize = 0;\n      for (int i = 0; i < insize; i++) {\n        psize++;\n        q = q->next;\n        if (!q) break;\n      }\n      // if q hasn't fallen off end, we have two lists to merge\n      int qsize = insize;\n      // now we have two lists; merge them\n      while (psize > 0 || (qsize > 0 && q)) {\n        // decide whether next element of merge comes from p or q\n        Value::Use* e = nullptr;\n        if (psize == 0) {\n          // p is empty; e must come from q\n          e = q;\n          q = q->next;\n          qsize--;\n        } else if (qsize == 0 || !q) {\n          // q is empty; e must come from p\n          e = p;\n          p = p->next;\n          psize--;\n        } else if (CompareValueUse(p, q) <= 0) {\n          // First element of p is lower (or same); e must come from p\n          e = p;\n          p = p->next;\n          psize--;\n        } else {\n          // First element of q is lower; e must come from q\n          e = q;\n          q = q->next;\n          qsize--;\n        }\n        // add the next element to the merged list\n        if (tail) {\n          tail->next = e;\n        } else {\n          head = e;\n        }\n        // Maintain reverse pointers in a doubly linked list.\n        e->prev = tail;\n        tail = e;\n      }\n      // now p has stepped 'insize' places along, and q has too\n      p = q;\n    }\n    if (tail) {\n      tail->next = nullptr;\n    }\n    // If we have done only one merge, we're finished\n    if (nmerges <= 1) {\n      // allow for nmerges==0, the empty list case\n      break;\n    }\n    // Otherwise repeat, merging lists twice the size\n    insize *= 2;\n  }\n\n  value->use_head = head;\n  value->last_use = tail->instr;\n}\n\n}  // namespace passes\n}  // namespace compiler\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/compiler/passes/register_allocation_pass.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_COMPILER_PASSES_REGISTER_ALLOCATION_PASS_H_\n#define XENIA_CPU_COMPILER_PASSES_REGISTER_ALLOCATION_PASS_H_\n\n#include <algorithm>\n#include <bitset>\n#include <functional>\n#include <vector>\n\n#include \"xenia/cpu/backend/machine_info.h\"\n#include \"xenia/cpu/compiler/compiler_pass.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace compiler {\nnamespace passes {\n\nclass RegisterAllocationPass : public CompilerPass {\n public:\n  explicit RegisterAllocationPass(const backend::MachineInfo* machine_info);\n  ~RegisterAllocationPass() override;\n\n  bool Run(hir::HIRBuilder* builder) override;\n\n private:\n  // TODO(benvanik): rewrite all this set shit -- too much indirection, the\n  // complexity is not needed.\n  struct RegisterUsage {\n    hir::Value* value;\n    hir::Value::Use* use;\n    RegisterUsage() : value(nullptr), use(nullptr) {}\n    RegisterUsage(hir::Value* value_, hir::Value::Use* use_)\n        : value(value_), use(use_) {}\n    static bool Compare(const RegisterUsage& a, const RegisterUsage& b) {\n      return a.use->instr->ordinal < b.use->instr->ordinal;\n    }\n  };\n  struct RegisterSetUsage {\n    const backend::MachineInfo::RegisterSet* set = nullptr;\n    uint32_t count = 0;\n    std::bitset<32> availability = 0;\n    // TODO(benvanik): another data type.\n    std::vector<RegisterUsage> upcoming_uses;\n  };\n\n  void DumpUsage(const char* name);\n  void PrepareBlockState();\n  void AdvanceUses(hir::Instr* instr);\n  bool IsRegInUse(const hir::RegAssignment& reg);\n  RegisterSetUsage* MarkRegUsed(const hir::RegAssignment& reg,\n                                hir::Value* value, hir::Value::Use* use);\n  RegisterSetUsage* MarkRegAvailable(const hir::RegAssignment& reg);\n\n  bool TryAllocateRegister(hir::Value* value,\n                           const hir::RegAssignment& preferred_reg);\n  bool TryAllocateRegister(hir::Value* value);\n  bool SpillOneRegister(hir::HIRBuilder* builder, hir::Block* block,\n                        hir::TypeName required_type);\n\n  RegisterSetUsage* RegisterSetForValue(const hir::Value* value);\n\n  void SortUsageList(hir::Value* value);\n\n private:\n  struct {\n    RegisterSetUsage* int_set = nullptr;\n    RegisterSetUsage* float_set = nullptr;\n    RegisterSetUsage* vec_set = nullptr;\n    RegisterSetUsage* all_sets[3];\n  } usage_sets_;\n};\n\n}  // namespace passes\n}  // namespace compiler\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_COMPILER_PASSES_REGISTER_ALLOCATION_PASS_H_\n"
  },
  {
    "path": "src/xenia/cpu/compiler/passes/simplification_pass.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/compiler/passes/simplification_pass.h\"\n\n#include \"xenia/base/profiling.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace compiler {\nnamespace passes {\n\n// TODO(benvanik): remove when enums redefined.\nusing namespace xe::cpu::hir;\n\nusing xe::cpu::hir::HIRBuilder;\nusing xe::cpu::hir::Instr;\nusing xe::cpu::hir::Value;\n\nSimplificationPass::SimplificationPass() : ConditionalGroupSubpass() {}\n\nSimplificationPass::~SimplificationPass() {}\n\nbool SimplificationPass::Run(HIRBuilder* builder, bool& result) {\n  result = false;\n  result |= EliminateConversions(builder);\n  result |= SimplifyAssignments(builder);\n  return true;\n}\n\nbool SimplificationPass::EliminateConversions(HIRBuilder* builder) {\n  // First, we check for truncates/extensions that can be skipped.\n  // This generates some assignments which then the second step will clean up.\n  // Both zero/sign extends can be skipped:\n  //   v1.i64 = zero/sign_extend v0.i32\n  //   v2.i32 = truncate v1.i64\n  // becomes:\n  //   v1.i64 = zero/sign_extend v0.i32 (may be dead code removed later)\n  //   v2.i32 = v0.i32\n\n  bool result = false;\n  auto block = builder->first_block();\n  while (block) {\n    auto i = block->instr_head;\n    while (i) {\n      // To make things easier we check in reverse (source of truncate/extend\n      // back to definition).\n      if (i->opcode == &OPCODE_TRUNCATE_info) {\n        // Matches zero/sign_extend + truncate.\n        result |= CheckTruncate(i);\n      } else if (i->opcode == &OPCODE_BYTE_SWAP_info) {\n        // Matches byte swap + byte swap.\n        // This is pretty rare within the same basic block, but is in the\n        // memcpy hot path and (probably) worth it. Maybe.\n        result |= CheckByteSwap(i);\n      }\n      i = i->next;\n    }\n    block = block->next;\n  }\n  return result;\n}\n\nbool SimplificationPass::CheckTruncate(Instr* i) {\n  // Walk backward up src's chain looking for an extend. We may have\n  // assigns, so skip those.\n  auto src = i->src1.value;\n  auto def = src->def;\n  while (def && def->opcode == &OPCODE_ASSIGN_info) {\n    // Skip asignments.\n    def = def->src1.value->def;\n  }\n  if (def) {\n    if (def->opcode == &OPCODE_SIGN_EXTEND_info) {\n      // Value comes from a sign extend.\n      if (def->src1.value->type == i->dest->type) {\n        // Types match, use original by turning this into an assign.\n        i->Replace(&OPCODE_ASSIGN_info, 0);\n        i->set_src1(def->src1.value);\n        return true;\n      }\n    } else if (def->opcode == &OPCODE_ZERO_EXTEND_info) {\n      // Value comes from a zero extend.\n      if (def->src1.value->type == i->dest->type) {\n        // Types match, use original by turning this into an assign.\n        i->Replace(&OPCODE_ASSIGN_info, 0);\n        i->set_src1(def->src1.value);\n        return true;\n      }\n    }\n  }\n  return false;\n}\n\nbool SimplificationPass::CheckByteSwap(Instr* i) {\n  // Walk backward up src's chain looking for a byte swap. We may have\n  // assigns, so skip those.\n  auto src = i->src1.value;\n  auto def = src->def;\n  while (def && def->opcode == &OPCODE_ASSIGN_info) {\n    // Skip asignments.\n    def = def->src1.value->def;\n  }\n  if (def && def->opcode == &OPCODE_BYTE_SWAP_info) {\n    // Value comes from a byte swap.\n    if (def->src1.value->type == i->dest->type) {\n      // Types match, use original by turning this into an assign.\n      i->Replace(&OPCODE_ASSIGN_info, 0);\n      i->set_src1(def->src1.value);\n      return true;\n    }\n  }\n  return false;\n}\n\nbool SimplificationPass::SimplifyAssignments(HIRBuilder* builder) {\n  // Run over the instructions and rename assigned variables:\n  //   v1 = v0\n  //   v2 = v1\n  //   v3 = add v0, v2\n  // becomes:\n  //   v1 = v0\n  //   v2 = v0\n  //   v3 = add v0, v0\n  // This could be run several times, as it could make other passes faster\n  // to compute (for example, ConstantPropagation). DCE will take care of\n  // the useless assigns.\n  //\n  // We do this by walking each instruction. For each value op we\n  // look at its def instr to see if it's an assign - if so, we use the src\n  // of that instr. Because we may have chains, we do this recursively until\n  // we find a non-assign def.\n\n  bool result = false;\n  auto block = builder->first_block();\n  while (block) {\n    auto i = block->instr_head;\n    while (i) {\n      uint32_t signature = i->opcode->signature;\n      if (GET_OPCODE_SIG_TYPE_SRC1(signature) == OPCODE_SIG_TYPE_V) {\n        bool modified = false;\n        i->set_src1(CheckValue(i->src1.value, modified));\n        result |= modified;\n      }\n      if (GET_OPCODE_SIG_TYPE_SRC2(signature) == OPCODE_SIG_TYPE_V) {\n        bool modified = false;\n        i->set_src2(CheckValue(i->src2.value, modified));\n        result |= modified;\n      }\n      if (GET_OPCODE_SIG_TYPE_SRC3(signature) == OPCODE_SIG_TYPE_V) {\n        bool modified = false;\n        i->set_src3(CheckValue(i->src3.value, modified));\n        result |= modified;\n      }\n      i = i->next;\n    }\n    block = block->next;\n  }\n  return result;\n}\n\nValue* SimplificationPass::CheckValue(Value* value, bool& result) {\n  auto def = value->def;\n  if (def && def->opcode == &OPCODE_ASSIGN_info) {\n    // Value comes from an assignment - recursively find if it comes from\n    // another assignment. It probably doesn't, if we already replaced it.\n    auto replacement = def->src1.value;\n    while (true) {\n      def = replacement->def;\n      if (!def || def->opcode != &OPCODE_ASSIGN_info) {\n        break;\n      }\n      replacement = def->src1.value;\n    }\n    result = true;\n    return replacement;\n  }\n  result = false;\n  return value;\n}\n\n}  // namespace passes\n}  // namespace compiler\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/compiler/passes/simplification_pass.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_COMPILER_PASSES_SIMPLIFICATION_PASS_H_\n#define XENIA_CPU_COMPILER_PASSES_SIMPLIFICATION_PASS_H_\n\n#include \"xenia/cpu/compiler/passes/conditional_group_subpass.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace compiler {\nnamespace passes {\n\nclass SimplificationPass : public ConditionalGroupSubpass {\n public:\n  SimplificationPass();\n  ~SimplificationPass() override;\n\n  bool Run(hir::HIRBuilder* builder, bool& result) override;\n\n private:\n  bool EliminateConversions(hir::HIRBuilder* builder);\n  bool CheckTruncate(hir::Instr* i);\n  bool CheckByteSwap(hir::Instr* i);\n\n  bool SimplifyAssignments(hir::HIRBuilder* builder);\n  hir::Value* CheckValue(hir::Value* value, bool& result);\n};\n\n}  // namespace passes\n}  // namespace compiler\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_COMPILER_PASSES_SIMPLIFICATION_PASS_H_\n"
  },
  {
    "path": "src/xenia/cpu/compiler/passes/validation_pass.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/compiler/passes/validation_pass.h\"\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/profiling.h\"\n#include \"xenia/cpu/backend/backend.h\"\n#include \"xenia/cpu/compiler/compiler.h\"\n#include \"xenia/cpu/processor.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace compiler {\nnamespace passes {\n\n// TODO(benvanik): remove when enums redefined.\nusing namespace xe::cpu::hir;\n\nusing xe::cpu::hir::Block;\nusing xe::cpu::hir::HIRBuilder;\nusing xe::cpu::hir::Instr;\nusing xe::cpu::hir::OpcodeSignatureType;\nusing xe::cpu::hir::Value;\n\nValidationPass::ValidationPass() : CompilerPass() {}\n\nValidationPass::~ValidationPass() {}\n\nbool ValidationPass::Run(HIRBuilder* builder) {\n#if 0\n  StringBuffer str;\n  builder->Dump(&str);\n  printf(\"%s\", str.GetString());\n  fflush(stdout);\n  str.Reset();\n#endif  // 0\n\n  auto block = builder->first_block();\n  while (block) {\n    auto label = block->label_head;\n    while (label) {\n      assert_true(label->block == block);\n      if (label->block != block) {\n        return false;\n      }\n      label = label->next;\n    }\n\n    auto instr = block->instr_head;\n    while (instr) {\n      if (!ValidateInstruction(block, instr)) {\n        return false;\n      }\n      instr = instr->next;\n    }\n\n    block = block->next;\n  }\n\n  return true;\n}\n\nbool ValidationPass::ValidateInstruction(Block* block, Instr* instr) {\n  assert_true(instr->block == block);\n  if (instr->block != block) {\n    return false;\n  }\n\n  if (instr->dest) {\n    assert_true(instr->dest->def == instr);\n    auto use = instr->dest->use_head;\n    while (use) {\n      assert_true(use->instr->block == block);\n      use = use->next;\n    }\n  }\n\n  uint32_t signature = instr->opcode->signature;\n  if (GET_OPCODE_SIG_TYPE_SRC1(signature) == OPCODE_SIG_TYPE_V) {\n    if (!ValidateValue(block, instr, instr->src1.value)) {\n      return false;\n    }\n  }\n  if (GET_OPCODE_SIG_TYPE_SRC2(signature) == OPCODE_SIG_TYPE_V) {\n    if (!ValidateValue(block, instr, instr->src2.value)) {\n      return false;\n    }\n  }\n  if (GET_OPCODE_SIG_TYPE_SRC3(signature) == OPCODE_SIG_TYPE_V) {\n    if (!ValidateValue(block, instr, instr->src3.value)) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\nbool ValidationPass::ValidateValue(Block* block, Instr* instr, Value* value) {\n  // if (value->def) {\n  //  auto def = value->def;\n  //  assert_true(def->block == block);\n  //  if (def->block != block) {\n  //    return false;\n  //  }\n  //}\n  return true;\n}\n\n}  // namespace passes\n}  // namespace compiler\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/compiler/passes/validation_pass.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_COMPILER_PASSES_VALIDATION_PASS_H_\n#define XENIA_CPU_COMPILER_PASSES_VALIDATION_PASS_H_\n\n#include \"xenia/cpu/compiler/compiler_pass.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace compiler {\nnamespace passes {\n\nclass ValidationPass : public CompilerPass {\n public:\n  ValidationPass();\n  ~ValidationPass() override;\n\n  bool Run(hir::HIRBuilder* builder) override;\n\n private:\n  bool ValidateInstruction(hir::Block* block, hir::Instr* instr);\n  bool ValidateValue(hir::Block* block, hir::Instr* instr, hir::Value* value);\n};\n\n}  // namespace passes\n}  // namespace compiler\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_COMPILER_PASSES_VALIDATION_PASS_H_\n"
  },
  {
    "path": "src/xenia/cpu/compiler/passes/value_reduction_pass.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/compiler/passes/value_reduction_pass.h\"\n\n#include \"xenia/base/platform.h\"\n#include \"xenia/base/profiling.h\"\n#include \"xenia/cpu/backend/backend.h\"\n#include \"xenia/cpu/compiler/compiler.h\"\n#include \"xenia/cpu/processor.h\"\n\n#if XE_COMPILER_MSVC\n#pragma warning(push)\n#pragma warning(disable : 4244)\n#pragma warning(disable : 4267)\n#include <llvm/ADT/BitVector.h>\n#pragma warning(pop)\n#else\n#include <llvm/ADT/BitVector.h>\n#include <cmath>\n#endif  // XE_COMPILER_MSVC\n\nnamespace xe {\nnamespace cpu {\nnamespace compiler {\nnamespace passes {\n\n// TODO(benvanik): remove when enums redefined.\nusing namespace xe::cpu::hir;\n\nusing xe::cpu::hir::HIRBuilder;\nusing xe::cpu::hir::OpcodeInfo;\nusing xe::cpu::hir::Value;\n\nValueReductionPass::ValueReductionPass() : CompilerPass() {}\n\nValueReductionPass::~ValueReductionPass() {}\n\nvoid ValueReductionPass::ComputeLastUse(Value* value) {\n  // TODO(benvanik): compute during construction?\n  // Note that this list isn't sorted (unfortunately), so we have to scan\n  // them all.\n  uint32_t max_ordinal = 0;\n  Value::Use* last_use = nullptr;\n  auto use = value->use_head;\n  while (use) {\n    if (!last_use || use->instr->ordinal >= max_ordinal) {\n      last_use = use;\n      max_ordinal = use->instr->ordinal;\n    }\n    use = use->next;\n  }\n  value->last_use = last_use ? last_use->instr : nullptr;\n}\n\nbool ValueReductionPass::Run(HIRBuilder* builder) {\n  // Walk each block and reuse variable ordinals as much as possible.\n\n  llvm::BitVector ordinals(builder->max_value_ordinal());\n\n  auto block = builder->first_block();\n  while (block) {\n    // Reset used ordinals.\n    ordinals.reset();\n\n    // Renumber all instructions to make liveness tracking easier.\n    uint32_t instr_ordinal = 0;\n    auto instr = block->instr_head;\n    while (instr) {\n      instr->ordinal = instr_ordinal++;\n      instr = instr->next;\n    }\n\n    instr = block->instr_head;\n    while (instr) {\n      const OpcodeInfo* info = instr->opcode;\n      auto dest_type = GET_OPCODE_SIG_TYPE_DEST(info->signature);\n      auto src1_type = GET_OPCODE_SIG_TYPE_SRC1(info->signature);\n      auto src2_type = GET_OPCODE_SIG_TYPE_SRC2(info->signature);\n      auto src3_type = GET_OPCODE_SIG_TYPE_SRC3(info->signature);\n      if (src1_type == OPCODE_SIG_TYPE_V) {\n        auto v = instr->src1.value;\n        if (!v->last_use) {\n          ComputeLastUse(v);\n        }\n        if (v->last_use == instr) {\n          // Available.\n          if (!instr->src1.value->IsConstant()) {\n            ordinals.reset(v->ordinal);\n          }\n        }\n      }\n      if (src2_type == OPCODE_SIG_TYPE_V) {\n        auto v = instr->src2.value;\n        if (!v->last_use) {\n          ComputeLastUse(v);\n        }\n        if (v->last_use == instr) {\n          // Available.\n          if (!instr->src2.value->IsConstant()) {\n            ordinals.reset(v->ordinal);\n          }\n        }\n      }\n      if (src3_type == OPCODE_SIG_TYPE_V) {\n        auto v = instr->src3.value;\n        if (!v->last_use) {\n          ComputeLastUse(v);\n        }\n        if (v->last_use == instr) {\n          // Available.\n          if (!instr->src3.value->IsConstant()) {\n            ordinals.reset(v->ordinal);\n          }\n        }\n      }\n      if (dest_type == OPCODE_SIG_TYPE_V) {\n        // Dest values are processed last, as they may be able to reuse a\n        // source value ordinal.\n        auto v = instr->dest;\n        // Find a lower ordinal.\n        for (auto n = 0u; n < ordinals.size(); n++) {\n          if (!ordinals.test(n)) {\n            ordinals.set(n);\n            v->ordinal = n;\n            break;\n          }\n        }\n      }\n\n      instr = instr->next;\n    }\n\n    block = block->next;\n  }\n\n  return true;\n}\n\n}  // namespace passes\n}  // namespace compiler\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/compiler/passes/value_reduction_pass.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_COMPILER_PASSES_VALUE_REDUCTION_PASS_H_\n#define XENIA_CPU_COMPILER_PASSES_VALUE_REDUCTION_PASS_H_\n\n#include \"xenia/cpu/compiler/compiler_pass.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace compiler {\nnamespace passes {\n\nclass ValueReductionPass : public CompilerPass {\n public:\n  ValueReductionPass();\n  ~ValueReductionPass() override;\n\n  bool Run(hir::HIRBuilder* builder) override;\n\n private:\n  void ComputeLastUse(hir::Value* value);\n};\n\n}  // namespace passes\n}  // namespace compiler\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_COMPILER_PASSES_VALUE_REDUCTION_PASS_H_\n"
  },
  {
    "path": "src/xenia/cpu/cpu_flags.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/cpu_flags.h\"\n\nDEFINE_string(cpu, \"any\", \"CPU backend [any, x64].\", \"CPU\");\n\nDEFINE_string(\n    load_module_map, \"\",\n    \"Loads a .map for symbol names and to diff with the generated symbol \"\n    \"database.\",\n    \"CPU\");\n\nDEFINE_bool(disassemble_functions, false,\n            \"Disassemble functions during generation.\", \"CPU\");\n\nDEFINE_bool(trace_functions, false, \"Generate tracing for function statistics.\",\n            \"CPU\");\nDEFINE_bool(trace_function_coverage, false,\n            \"Generate tracing for function instruction coverage statistics.\",\n            \"CPU\");\nDEFINE_bool(trace_function_references, false,\n            \"Generate tracing for function address references.\", \"CPU\");\nDEFINE_bool(trace_function_data, false,\n            \"Generate tracing for function result data.\", \"CPU\");\n\nDEFINE_bool(\n    disable_global_lock, false,\n    \"Disables global lock usage in guest code. Does not affect host code.\",\n    \"CPU\");\n\nDEFINE_bool(validate_hir, false,\n            \"Perform validation checks on the HIR during compilation.\", \"CPU\");\n\nDEFINE_uint64(\n    pvr, 0x710700,\n    \"Processor version and revision number.\\nBits 0 to 15 are the version \"\n    \"number.\\nBits 16 to 31 are the revision number.\\nNote: Some XEXs (such as \"\n    \"mfgbootlauncher.xex) may check for a value that's less than 0x710700.\",\n    \"CPU\");\n\n// Breakpoints:\nDEFINE_uint64(break_on_instruction, 0,\n              \"int3 before the given guest address is executed.\", \"CPU\");\nDEFINE_int32(break_condition_gpr, -1, \"GPR compared to\", \"CPU\");\nDEFINE_uint64(break_condition_value, 0, \"value compared against\", \"CPU\");\nDEFINE_string(break_condition_op, \"eq\", \"comparison operator\", \"CPU\");\nDEFINE_bool(break_condition_truncate, true, \"truncate value to 32-bits\", \"CPU\");\n\nDEFINE_bool(break_on_debugbreak, true, \"int3 on JITed __debugbreak requests.\",\n            \"CPU\");\n"
  },
  {
    "path": "src/xenia/cpu/cpu_flags.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_CPU_FLAGS_H_\n#define XENIA_CPU_CPU_FLAGS_H_\n#include \"xenia/base/cvar.h\"\n\nDECLARE_string(cpu);\n\nDECLARE_string(load_module_map);\n\nDECLARE_bool(disassemble_functions);\n\nDECLARE_bool(trace_functions);\nDECLARE_bool(trace_function_coverage);\nDECLARE_bool(trace_function_references);\nDECLARE_bool(trace_function_data);\n\nDECLARE_bool(disable_global_lock);\n\nDECLARE_bool(validate_hir);\n\nDECLARE_uint64(pvr);\n\n// Breakpoints:\nDECLARE_uint64(break_on_instruction);\nDECLARE_int32(break_condition_gpr);\nDECLARE_uint64(break_condition_value);\nDECLARE_string(break_condition_op);\nDECLARE_bool(break_condition_truncate);\n\nDECLARE_bool(break_on_debugbreak);\n\n#endif  // XENIA_CPU_CPU_FLAGS_H_\n"
  },
  {
    "path": "src/xenia/cpu/debug_listener.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2016 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_DEBUG_LISTENER_H_\n#define XENIA_CPU_DEBUG_LISTENER_H_\n\nnamespace xe {\nnamespace cpu {\n\nclass Breakpoint;\nstruct ThreadDebugInfo;\n\n// Debug event listener interface.\n// Implementations will receive calls from arbitrary threads and must marshal\n// them as required.\nclass DebugListener {\n public:\n  // Handles request for debugger focus (such as when the user requests the\n  // debugger be brought to the front).\n  virtual void OnFocus() = 0;\n\n  // Handles the debugger detaching from the target.\n  // This will be called on shutdown or when the user requests the debug session\n  // end.\n  virtual void OnDetached() = 0;\n\n  // Handles execution being interrupted and transitioning to\n  // ExceutionState::kPaused.\n  virtual void OnExecutionPaused() = 0;\n  // Handles execution continuing when transitioning to\n  // ExecutionState::kRunning or ExecutionState::kStepping.\n  virtual void OnExecutionContinued() = 0;\n  // Handles execution ending when transitioning to ExecutionState::kEnded.\n  virtual void OnExecutionEnded() = 0;\n\n  // Handles step completion events when a requested step operation completes.\n  // The thread is the one that hit its step target. Note that because multiple\n  // threads could be stepping simultaneously (such as a run-to-cursor) use the\n  // thread passed instead of keeping any other state.\n  virtual void OnStepCompleted(ThreadDebugInfo* thread_info) = 0;\n\n  // Handles breakpoint events as they are hit per-thread.\n  // Breakpoints may be hit during stepping.\n  virtual void OnBreakpointHit(Breakpoint* breakpoint,\n                               ThreadDebugInfo* thread_info) = 0;\n};\n\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_DEBUG_LISTENER_H_\n"
  },
  {
    "path": "src/xenia/cpu/elf_module.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/elf_module.h\"\n\n#include <algorithm>\n#include <memory>\n\n#include \"xenia/base/byte_order.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/cpu/processor.h\"\n\nnamespace xe {\nnamespace cpu {\n\nElfModule::ElfModule(Processor* processor, kernel::KernelState* kernel_state)\n    : Module(processor), kernel_state_(kernel_state) {}\n\nElfModule::~ElfModule() = default;\n\n// ELF structures\nstruct elf32_ehdr {\n  uint8_t e_ident[16];\n  xe::be<uint16_t> e_type;\n  xe::be<uint16_t> e_machine;\n  xe::be<uint32_t> e_version;\n  xe::be<uint32_t> e_entry;\n  xe::be<uint32_t> e_phoff;\n  xe::be<uint32_t> e_shoff;\n  xe::be<uint32_t> e_flags;\n  xe::be<uint16_t> e_ehsize;\n  xe::be<uint16_t> e_phentsize;\n  xe::be<uint16_t> e_phnum;\n  xe::be<uint16_t> e_shentsize;\n  xe::be<uint16_t> e_shnum;\n  xe::be<uint16_t> e_shtrndx;\n};\n\nstruct elf32_phdr {\n  xe::be<uint32_t> p_type;\n  xe::be<uint32_t> p_offset;\n  xe::be<uint32_t> p_vaddr;\n  xe::be<uint32_t> p_paddr;\n  xe::be<uint32_t> p_filesz;\n  xe::be<uint32_t> p_memsz;\n  xe::be<uint32_t> p_flags;\n  xe::be<uint32_t> p_align;\n};\n\nbool ElfModule::is_executable() const {\n  auto hdr = reinterpret_cast<const elf32_ehdr*>(elf_header_mem_.data());\n  return hdr->e_entry != 0;\n}\n\nbool ElfModule::Load(const std::string_view name, const std::string_view path,\n                     const void* elf_addr, size_t elf_length) {\n  name_ = name;\n  path_ = path;\n\n  uint8_t* pelf = (uint8_t*)elf_addr;\n  elf32_ehdr* hdr = (elf32_ehdr*)(pelf + 0x0);\n  if (hdr->e_ident[0] != 0x7F || hdr->e_ident[1] != 'E' ||\n      hdr->e_ident[2] != 'L' || hdr->e_ident[3] != 'F') {\n    // Not an ELF file!\n    return false;\n  }\n\n  assert_true(hdr->e_ident[4] == 1);  // 32bit\n\n  if (hdr->e_type != 2 /* ET_EXEC */) {\n    // Not executable (shared objects not supported yet)\n    XELOGE(\"ELF: Could not load ELF because it isn't executable!\");\n    return false;\n  }\n\n  if (hdr->e_machine != 20 /* EM_PPC */) {\n    // Not a PPC ELF!\n    XELOGE(\n        \"ELF: Could not load ELF because target machine is not PPC! (target: \"\n        \"{})\",\n        uint32_t(hdr->e_machine));\n    return false;\n  }\n\n  // Parse LOAD program headers and load into memory.\n  if (!hdr->e_phoff) {\n    XELOGE(\"ELF: File doesn't have a program header!\");\n    return false;\n  }\n\n  if (!hdr->e_entry) {\n    XELOGE(\"ELF: Executable has no entry point!\");\n    return false;\n  }\n\n  // Entry point virtual address\n  entry_point_ = hdr->e_entry;\n\n  // Copy the ELF header\n  elf_header_mem_.resize(hdr->e_ehsize);\n  std::memcpy(elf_header_mem_.data(), hdr, hdr->e_ehsize);\n\n  assert_true(hdr->e_phentsize == sizeof(elf32_phdr));\n  elf32_phdr* phdr = (elf32_phdr*)(pelf + hdr->e_phoff);\n  for (uint32_t i = 0; i < hdr->e_phnum; i++) {\n    if (phdr[i].p_type == 1 /* PT_LOAD */ ||\n        phdr[i].p_type == 2 /* PT_DYNAMIC */) {\n      // Allocate and copy into memory.\n      // Base address @ 0x80000000\n      if (phdr[i].p_vaddr < 0x80000000 || phdr[i].p_vaddr > 0x9FFFFFFF) {\n        XELOGE(\"ELF: Could not allocate memory for section @ address 0x{:08X}\",\n               uint32_t(phdr[i].p_vaddr));\n        return false;\n      }\n\n      uint32_t virtual_addr = phdr[i].p_vaddr & ~(phdr[i].p_align - 1);\n      uint32_t virtual_size = xe::round_up(phdr[i].p_vaddr + phdr[i].p_memsz,\n                                           uint32_t(phdr[i].p_align)) -\n                              virtual_addr;\n      if (!memory()\n               ->LookupHeap(virtual_addr)\n               ->AllocFixed(\n                   virtual_addr, virtual_size, phdr[i].p_align,\n                   xe::kMemoryAllocationReserve | xe::kMemoryAllocationCommit,\n                   xe::kMemoryProtectRead | xe::kMemoryProtectWrite)) {\n        XELOGE(\"ELF: Could not allocate memory!\");\n      }\n\n      auto p = memory()->TranslateVirtual(phdr[i].p_vaddr);\n      std::memset(p, 0, phdr[i].p_memsz);\n      std::memcpy(p, pelf + phdr[i].p_offset, phdr[i].p_filesz);\n\n      // Notify backend about executable code.\n      if (phdr[i].p_flags & 0x1 /* PF_X */) {\n        processor_->backend()->CommitExecutableRange(\n            virtual_addr, virtual_addr + virtual_size);\n      }\n    }\n  }\n\n  return true;\n}\n\nstd::unique_ptr<Function> ElfModule::CreateFunction(uint32_t address) {\n  return std::unique_ptr<Function>(\n      processor_->backend()->CreateGuestFunction(this, address));\n}\n\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/elf_module.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_ELF_MODULE_H_\n#define XENIA_CPU_ELF_MODULE_H_\n\n#include <string>\n#include <vector>\n\n#include \"xenia/cpu/module.h\"\n\nnamespace xe {\nnamespace kernel {\nclass KernelState;\n}  // namespace kernel\n\nnamespace cpu {\n\n// ELF module: Used to load libxenon executables.\nclass ElfModule : public xe::cpu::Module {\n public:\n  ElfModule(Processor* processor, kernel::KernelState* kernel_state);\n  virtual ~ElfModule();\n\n  bool loaded() const { return loaded_; }\n  uint32_t entry_point() const { return entry_point_; }\n  const std::string& name() const override { return name_; }\n  bool is_executable() const override;\n  const std::string& path() const { return path_; }\n\n  bool Load(const std::string_view name, const std::string_view path,\n            const void* elf_addr, size_t elf_length);\n  bool Unload();\n\n protected:\n  std::unique_ptr<Function> CreateFunction(uint32_t address) override;\n\n private:\n  std::string name_;\n  std::string path_;\n  kernel::KernelState* kernel_state_;\n\n  bool loaded_;\n  std::vector<uint8_t> elf_header_mem_;  // Holds the ELF header\n  uint32_t entry_point_;\n};\n\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_ELF_MODULE_H_\n"
  },
  {
    "path": "src/xenia/cpu/entry_table.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/entry_table.h\"\n\n#include \"xenia/base/profiling.h\"\n#include \"xenia/base/threading.h\"\n\nnamespace xe {\nnamespace cpu {\n\nEntryTable::EntryTable() = default;\n\nEntryTable::~EntryTable() {\n  auto global_lock = global_critical_region_.Acquire();\n  for (auto it : map_) {\n    Entry* entry = it.second;\n    delete entry;\n  }\n}\n\nEntry* EntryTable::Get(uint32_t address) {\n  auto global_lock = global_critical_region_.Acquire();\n  const auto& it = map_.find(address);\n  Entry* entry = it != map_.end() ? it->second : nullptr;\n  if (entry) {\n    // TODO(benvanik): wait if needed?\n    if (entry->status != Entry::STATUS_READY) {\n      entry = nullptr;\n    }\n  }\n  return entry;\n}\n\nEntry::Status EntryTable::GetOrCreate(uint32_t address, Entry** out_entry) {\n  // TODO(benvanik): replace with a map with wait-free for find.\n  // https://github.com/facebook/folly/blob/master/folly/AtomicHashMap.h\n\n  auto global_lock = global_critical_region_.Acquire();\n  const auto& it = map_.find(address);\n  Entry* entry = it != map_.end() ? it->second : nullptr;\n  Entry::Status status;\n  if (entry) {\n    // If we aren't ready yet spin and wait.\n    if (entry->status == Entry::STATUS_COMPILING) {\n      // Still compiling, so spin.\n      do {\n        global_lock.unlock();\n        // TODO(benvanik): sleep for less time?\n        xe::threading::Sleep(std::chrono::microseconds(10));\n        global_lock.lock();\n      } while (entry->status == Entry::STATUS_COMPILING);\n    }\n    status = entry->status;\n  } else {\n    // Create and return for initialization.\n    entry = new Entry();\n    entry->address = address;\n    entry->end_address = 0;\n    entry->status = Entry::STATUS_COMPILING;\n    entry->function = 0;\n    map_[address] = entry;\n    status = Entry::STATUS_NEW;\n  }\n  global_lock.unlock();\n  *out_entry = entry;\n  return status;\n}\n\nstd::vector<Function*> EntryTable::FindWithAddress(uint32_t address) {\n  auto global_lock = global_critical_region_.Acquire();\n  std::vector<Function*> fns;\n  for (auto& it : map_) {\n    Entry* entry = it.second;\n    if (address >= entry->address && address <= entry->end_address) {\n      if (entry->status == Entry::STATUS_READY) {\n        fns.push_back(entry->function);\n      }\n    }\n  }\n  return fns;\n}\n\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/entry_table.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_ENTRY_TABLE_H_\n#define XENIA_CPU_ENTRY_TABLE_H_\n\n#include <unordered_map>\n#include <vector>\n\n#include \"xenia/base/mutex.h\"\n\nnamespace xe {\nnamespace cpu {\n\nclass Function;\n\ntypedef struct Entry_t {\n  typedef enum {\n    STATUS_NEW = 0,\n    STATUS_COMPILING,\n    STATUS_READY,\n    STATUS_FAILED,\n  } Status;\n\n  uint32_t address;\n  uint32_t end_address;\n  Status status;\n  Function* function;\n} Entry;\n\nclass EntryTable {\n public:\n  EntryTable();\n  ~EntryTable();\n\n  Entry* Get(uint32_t address);\n  Entry::Status GetOrCreate(uint32_t address, Entry** out_entry);\n\n  std::vector<Function*> FindWithAddress(uint32_t address);\n\n private:\n  xe::global_critical_region global_critical_region_;\n  // TODO(benvanik): replace with a better data structure.\n  std::unordered_map<uint32_t, Entry*> map_;\n};\n\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_ENTRY_TABLE_H_\n"
  },
  {
    "path": "src/xenia/cpu/export_resolver.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/export_resolver.h\"\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/string.h\"\n\nnamespace xe {\nnamespace cpu {\n\nExportResolver::Table::Table(const std::string_view module_name,\n                             const std::vector<Export*>* exports_by_ordinal)\n    : exports_by_ordinal_(exports_by_ordinal) {\n  module_name_ = utf8::find_base_name_from_guest_path(module_name);\n\n  exports_by_name_.reserve(exports_by_ordinal_->size());\n  for (size_t i = 0; i < exports_by_ordinal_->size(); ++i) {\n    auto export_entry = exports_by_ordinal_->at(i);\n    if (export_entry) {\n      exports_by_name_.push_back(export_entry);\n    }\n  }\n  std::sort(\n      exports_by_name_.begin(), exports_by_name_.end(),\n      [](Export* a, Export* b) { return std::strcmp(a->name, b->name) < 0; });\n}\n\nExportResolver::ExportResolver() = default;\n\nExportResolver::~ExportResolver() = default;\n\nvoid ExportResolver::RegisterTable(\n    const std::string_view module_name,\n    const std::vector<xe::cpu::Export*>* exports) {\n  tables_.emplace_back(module_name, exports);\n\n  all_exports_by_name_.reserve(all_exports_by_name_.size() + exports->size());\n  for (size_t i = 0; i < exports->size(); ++i) {\n    auto export_entry = exports->at(i);\n    if (export_entry) {\n      all_exports_by_name_.push_back(export_entry);\n    }\n  }\n  std::sort(\n      all_exports_by_name_.begin(), all_exports_by_name_.end(),\n      [](Export* a, Export* b) { return std::strcmp(a->name, b->name) < 0; });\n}\n\nExport* ExportResolver::GetExportByOrdinal(const std::string_view module_name,\n                                           uint16_t ordinal) {\n  for (const auto& table : tables_) {\n    if (xe::utf8::starts_with_case(module_name, table.module_name())) {\n      if (ordinal >= table.exports_by_ordinal().size()) {\n        return nullptr;\n      }\n      return table.exports_by_ordinal().at(ordinal);\n    }\n  }\n  return nullptr;\n}\n\nvoid ExportResolver::SetVariableMapping(const std::string_view module_name,\n                                        uint16_t ordinal, uint32_t value) {\n  auto export_entry = GetExportByOrdinal(module_name, ordinal);\n  assert_not_null(export_entry);\n  export_entry->tags |= ExportTag::kImplemented;\n  export_entry->variable_ptr = value;\n}\n\nvoid ExportResolver::SetFunctionMapping(const std::string_view module_name,\n                                        uint16_t ordinal,\n                                        xe_kernel_export_shim_fn shim) {\n  auto export_entry = GetExportByOrdinal(module_name, ordinal);\n  assert_not_null(export_entry);\n  export_entry->tags |= ExportTag::kImplemented;\n  export_entry->function_data.shim = shim;\n}\n\nvoid ExportResolver::SetFunctionMapping(const std::string_view module_name,\n                                        uint16_t ordinal,\n                                        ExportTrampoline trampoline) {\n  auto export_entry = GetExportByOrdinal(module_name, ordinal);\n  assert_not_null(export_entry);\n  export_entry->tags |= ExportTag::kImplemented;\n  export_entry->function_data.trampoline = trampoline;\n}\n\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/export_resolver.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_EXPORT_RESOLVER_H_\n#define XENIA_CPU_EXPORT_RESOLVER_H_\n\n#include <string>\n#include <vector>\n\n#include \"xenia/base/math.h\"\n#include \"xenia/cpu/ppc/ppc_context.h\"\n\nnamespace xe {\nnamespace cpu {\n\nenum class ExportCategory : uint8_t {\n  kNone = 0,\n  kAudio,\n  kAvatars,\n  kContent,\n  kDebug,\n  kFileSystem,\n  kInput,\n  kLocale,\n  kMemory,\n  kMisc,\n  kModules,\n  kNetworking,\n  kThreading,\n  kUI,\n  kUserProfiles,\n  kVideo,\n};\n\nstruct ExportTag {\n  using type = uint32_t;\n\n  // packed like so:\n  // ll...... cccccccc ........ ..bihssi\n\n  static const int CategoryShift = 16;\n\n  // Export is implemented in some form and can be used.\n  static const type kImplemented = 1u << 0;\n  // Export is a stub and is probably bad.\n  static const type kStub = 1u << 1;\n  // Export is known to cause problems, or may not be complete.\n  static const type kSketchy = 1u << 2;\n  // Export is called *a lot*.\n  static const type kHighFrequency = 1u << 3;\n  // Export is important and should always be logged.\n  static const type kImportant = 1u << 4;\n  // Export blocks the calling thread\n  static const type kBlocking = 1u << 5;\n\n  // Export will be logged on each call.\n  static const type kLog = 1u << 30;\n  // Export's result will be logged on each call.\n  static const type kLogResult = 1u << 31;\n};\n\n// DEPRECATED\ntypedef void (*xe_kernel_export_shim_fn)(void*, void*);\n\ntypedef void (*ExportTrampoline)(ppc::PPCContext* ppc_context);\n\nclass Export {\n public:\n  enum class Type {\n    kFunction = 0,\n    kVariable = 1,\n  };\n\n  Export(uint16_t ordinal, Type type, const char* name,\n         ExportTag::type tags = 0)\n      : ordinal(ordinal),\n        type(type),\n        tags(tags),\n        function_data({nullptr, nullptr, 0}) {\n    std::strncpy(this->name, name, xe::countof(this->name));\n  }\n\n  uint16_t ordinal;\n  Type type;\n  char name[96];\n  ExportTag::type tags;\n\n  bool is_implemented() const {\n    return (tags & ExportTag::kImplemented) == ExportTag::kImplemented;\n  }\n\n  union {\n    // Variable data. Only valid when kXEKernelExportFlagVariable is set.\n    // This is an address in the client memory space that the variable can\n    // be found at.\n    uint32_t variable_ptr;\n\n    struct {\n      // DEPRECATED\n      xe_kernel_export_shim_fn shim;\n\n      // Trampoline that is called from the guest-to-host thunk.\n      // Expects only PPC context as first arg.\n      ExportTrampoline trampoline;\n      uint64_t call_count;\n    } function_data;\n  };\n};\n\nclass ExportResolver {\n public:\n  class Table {\n   public:\n    Table(const std::string_view module_name,\n          const std::vector<Export*>* exports);\n\n    const std::string& module_name() const { return module_name_; }\n    const std::vector<Export*>& exports_by_ordinal() const {\n      return *exports_by_ordinal_;\n    }\n    const std::vector<Export*>& exports_by_name() const {\n      return exports_by_name_;\n    }\n\n   private:\n    std::string module_name_;\n    const std::vector<Export*>* exports_by_ordinal_ = nullptr;\n    std::vector<Export*> exports_by_name_;\n  };\n\n  ExportResolver();\n  ~ExportResolver();\n\n  void RegisterTable(const std::string_view module_name,\n                     const std::vector<Export*>* exports);\n  const std::vector<Table>& tables() const { return tables_; }\n  const std::vector<Export*>& all_exports_by_name() const {\n    return all_exports_by_name_;\n  }\n\n  Export* GetExportByOrdinal(const std::string_view module_name,\n                             uint16_t ordinal);\n\n  void SetVariableMapping(const std::string_view module_name, uint16_t ordinal,\n                          uint32_t value);\n  void SetFunctionMapping(const std::string_view module_name, uint16_t ordinal,\n                          xe_kernel_export_shim_fn shim);\n  void SetFunctionMapping(const std::string_view module_name, uint16_t ordinal,\n                          ExportTrampoline trampoline);\n\n private:\n  std::vector<Table> tables_;\n  std::vector<Export*> all_exports_by_name_;\n};\n\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_EXPORT_RESOLVER_H_\n"
  },
  {
    "path": "src/xenia/cpu/function.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/function.h\"\n\n#include \"xenia/base/logging.h\"\n#include \"xenia/cpu/symbol.h\"\n#include \"xenia/cpu/thread_state.h\"\n\nnamespace xe {\nnamespace cpu {\n\nFunction::Function(Module* module, uint32_t address)\n    : Symbol(Symbol::Type::kFunction, module, address) {}\n\nFunction::~Function() = default;\n\nBuiltinFunction::BuiltinFunction(Module* module, uint32_t address)\n    : Function(module, address) {\n  behavior_ = Behavior::kBuiltin;\n}\n\nBuiltinFunction::~BuiltinFunction() = default;\n\nvoid BuiltinFunction::SetupBuiltin(Handler handler, void* arg0, void* arg1) {\n  behavior_ = Behavior::kBuiltin;\n  handler_ = handler;\n  arg0_ = arg0;\n  arg1_ = arg1;\n}\n\nbool BuiltinFunction::Call(ThreadState* thread_state, uint32_t return_address) {\n  // SCOPE_profile_cpu_f(\"cpu\");\n\n  ThreadState* original_thread_state = ThreadState::Get();\n  if (original_thread_state != thread_state) {\n    ThreadState::Bind(thread_state);\n  }\n\n  assert_not_null(handler_);\n  handler_(thread_state->context(), arg0_, arg1_);\n\n  if (original_thread_state != thread_state) {\n    ThreadState::Bind(original_thread_state);\n  }\n\n  return true;\n}\n\nGuestFunction::GuestFunction(Module* module, uint32_t address)\n    : Function(module, address) {\n  behavior_ = Behavior::kDefault;\n}\n\nGuestFunction::~GuestFunction() = default;\n\nvoid GuestFunction::SetupExtern(ExternHandler handler, Export* export_data) {\n  behavior_ = Behavior::kExtern;\n  extern_handler_ = handler;\n  export_data_ = export_data;\n}\n\nconst SourceMapEntry* GuestFunction::LookupGuestAddress(\n    uint32_t guest_address) const {\n  // TODO(benvanik): binary search? We know the list is sorted by code order.\n  for (size_t i = 0; i < source_map_.size(); ++i) {\n    const auto& entry = source_map_[i];\n    if (entry.guest_address == guest_address) {\n      return &entry;\n    }\n  }\n  return nullptr;\n}\n\nconst SourceMapEntry* GuestFunction::LookupHIROffset(uint32_t offset) const {\n  // TODO(benvanik): binary search? We know the list is sorted by code order.\n  for (size_t i = 0; i < source_map_.size(); ++i) {\n    const auto& entry = source_map_[i];\n    if (entry.hir_offset >= offset) {\n      return &entry;\n    }\n  }\n  return nullptr;\n}\n\nconst SourceMapEntry* GuestFunction::LookupMachineCodeOffset(\n    uint32_t offset) const {\n  // TODO(benvanik): binary search? We know the list is sorted by code order.\n  for (int64_t i = source_map_.size() - 1; i >= 0; --i) {\n    const auto& entry = source_map_[i];\n    if (entry.code_offset <= offset) {\n      return &entry;\n    }\n  }\n  return source_map_.empty() ? nullptr : &source_map_[0];\n}\n\nuint32_t GuestFunction::MapGuestAddressToMachineCodeOffset(\n    uint32_t guest_address) const {\n  auto entry = LookupGuestAddress(guest_address);\n  return entry ? entry->code_offset : 0;\n}\n\nuintptr_t GuestFunction::MapGuestAddressToMachineCode(\n    uint32_t guest_address) const {\n  auto entry = LookupGuestAddress(guest_address);\n  return reinterpret_cast<uintptr_t>(machine_code()) +\n         (entry ? entry->code_offset : 0);\n}\n\nuint32_t GuestFunction::MapMachineCodeToGuestAddress(\n    uintptr_t host_address) const {\n  auto entry = LookupMachineCodeOffset(static_cast<uint32_t>(\n      host_address - reinterpret_cast<uintptr_t>(machine_code())));\n  return entry ? entry->guest_address : address();\n}\n\nbool GuestFunction::Call(ThreadState* thread_state, uint32_t return_address) {\n  // SCOPE_profile_cpu_f(\"cpu\");\n\n  ThreadState* original_thread_state = ThreadState::Get();\n  if (original_thread_state != thread_state) {\n    ThreadState::Bind(thread_state);\n  }\n\n  bool result = CallImpl(thread_state, return_address);\n\n  if (original_thread_state != thread_state) {\n    ThreadState::Bind(original_thread_state);\n  }\n\n  return result;\n}\n\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/function.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_FUNCTION_H_\n#define XENIA_CPU_FUNCTION_H_\n\n#include <memory>\n#include <vector>\n\n#include \"xenia/cpu/function_debug_info.h\"\n#include \"xenia/cpu/function_trace_data.h\"\n#include \"xenia/cpu/ppc/ppc_context.h\"\n#include \"xenia/cpu/symbol.h\"\n#include \"xenia/cpu/thread_state.h\"\n\nnamespace xe {\nnamespace cpu {\nclass Export;\n}  // namespace cpu\n\nnamespace cpu {\n\nstruct SourceMapEntry {\n  uint32_t guest_address;  // PPC guest address (0x82....).\n  uint32_t hir_offset;     // Block ordinal (16b) | Instr ordinal (16b)\n  uint32_t code_offset;    // Offset from emitted code start.\n};\n\nclass Function : public Symbol {\n public:\n  enum class Behavior {\n    kDefault = 0,\n    kProlog,\n    kEpilog,\n    kEpilogReturn,\n    kBuiltin,\n    kExtern,\n  };\n\n  ~Function() override;\n\n  uint32_t address() const { return address_; }\n  bool has_end_address() const { return end_address_ > 0; }\n  uint32_t end_address() const { return end_address_; }\n  void set_end_address(uint32_t value) { end_address_ = value; }\n  Behavior behavior() const { return behavior_; }\n  void set_behavior(Behavior value) { behavior_ = value; }\n  bool is_guest() const { return behavior_ != Behavior::kBuiltin; }\n\n  bool ContainsAddress(uint32_t address) const {\n    if (!address_ || !end_address_) {\n      return false;\n    }\n\n    if (address >= address_ && address < end_address_) {\n      return true;\n    }\n\n    return false;\n  }\n\n  virtual bool Call(ThreadState* thread_state, uint32_t return_address) = 0;\n\n protected:\n  Function(Module* module, uint32_t address);\n\n  uint32_t end_address_ = 0;\n  Behavior behavior_ = Behavior::kDefault;\n};\n\nclass BuiltinFunction : public Function {\n public:\n  typedef void (*Handler)(ppc::PPCContext* ppc_context, void* arg0, void* arg1);\n\n  BuiltinFunction(Module* module, uint32_t address);\n  ~BuiltinFunction() override;\n\n  void SetupBuiltin(Handler handler, void* arg0, void* arg1);\n\n  Handler handler() const { return handler_; }\n  void* arg0() const { return arg0_; }\n  void* arg1() const { return arg1_; }\n\n  bool Call(ThreadState* thread_state, uint32_t return_address) override;\n\n protected:\n  Handler handler_ = nullptr;\n  void* arg0_ = nullptr;\n  void* arg1_ = nullptr;\n};\n\nclass GuestFunction : public Function {\n public:\n  typedef void (*ExternHandler)(ppc::PPCContext* ppc_context,\n                                kernel::KernelState* kernel_state);\n\n  GuestFunction(Module* module, uint32_t address);\n  ~GuestFunction() override;\n\n  uint32_t address() const { return address_; }\n  bool has_end_address() const { return end_address_ > 0; }\n  uint32_t end_address() const { return end_address_; }\n  void set_end_address(uint32_t value) { end_address_ = value; }\n\n  virtual uint8_t* machine_code() const = 0;\n  virtual size_t machine_code_length() const = 0;\n\n  FunctionDebugInfo* debug_info() const { return debug_info_.get(); }\n  void set_debug_info(std::unique_ptr<FunctionDebugInfo> debug_info) {\n    debug_info_ = std::move(debug_info);\n  }\n  FunctionTraceData& trace_data() { return trace_data_; }\n  std::vector<SourceMapEntry>& source_map() { return source_map_; }\n\n  ExternHandler extern_handler() const { return extern_handler_; }\n  Export* export_data() const { return export_data_; }\n  void SetupExtern(ExternHandler handler, Export* export_data = nullptr);\n\n  const SourceMapEntry* LookupGuestAddress(uint32_t guest_address) const;\n  const SourceMapEntry* LookupHIROffset(uint32_t offset) const;\n  const SourceMapEntry* LookupMachineCodeOffset(uint32_t offset) const;\n\n  uint32_t MapGuestAddressToMachineCodeOffset(uint32_t guest_address) const;\n  uintptr_t MapGuestAddressToMachineCode(uint32_t guest_address) const;\n  uint32_t MapMachineCodeToGuestAddress(uintptr_t host_address) const;\n\n  bool Call(ThreadState* thread_state, uint32_t return_address) override;\n\n protected:\n  virtual bool CallImpl(ThreadState* thread_state, uint32_t return_address) = 0;\n\n protected:\n  std::unique_ptr<FunctionDebugInfo> debug_info_;\n  FunctionTraceData trace_data_;\n  std::vector<SourceMapEntry> source_map_;\n  ExternHandler extern_handler_ = nullptr;\n  Export* export_data_ = nullptr;\n};\n\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_FUNCTION_H_\n"
  },
  {
    "path": "src/xenia/cpu/function_debug_info.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/function_debug_info.h\"\n\n#include <cstdio>\n#include <cstdlib>\n\n#include \"xenia/base/logging.h\"\n\nnamespace xe {\nnamespace cpu {\n\nFunctionDebugInfo::FunctionDebugInfo()\n    : source_disasm_(nullptr),\n      raw_hir_disasm_(nullptr),\n      hir_disasm_(nullptr),\n      machine_code_disasm_(nullptr) {}\n\nFunctionDebugInfo::~FunctionDebugInfo() {\n  free(source_disasm_);\n  free(raw_hir_disasm_);\n  free(hir_disasm_);\n  free(machine_code_disasm_);\n}\n\nvoid FunctionDebugInfo::Dump() {\n  if (source_disasm_) {\n    XELOGD(\"PPC:\\n{}\\n\", source_disasm_);\n  }\n  if (raw_hir_disasm_) {\n    XELOGD(\"Unoptimized HIR:\\n{}\\n\", raw_hir_disasm_);\n  }\n  if (hir_disasm_) {\n    XELOGD(\"Optimized HIR:\\n{}\\n\", hir_disasm_);\n  }\n  if (machine_code_disasm_) {\n    XELOGD(\"Machine Code:\\n{}\\n\", machine_code_disasm_);\n  }\n}\n\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/function_debug_info.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_FUNCTION_DEBUG_INFO_H_\n#define XENIA_CPU_FUNCTION_DEBUG_INFO_H_\n\n#include <cstddef>\n#include <cstdint>\n\nnamespace xe {\nnamespace cpu {\n\nenum DebugInfoFlags : uint32_t {\n  kDebugInfoNone = 0,\n  kDebugInfoDisasmSource = (1 << 1),\n  kDebugInfoDisasmRawHir = (1 << 2),\n  kDebugInfoDisasmHir = (1 << 3),\n  kDebugInfoDisasmMachineCode = (1 << 4),\n  kDebugInfoAllDisasm = kDebugInfoDisasmSource | kDebugInfoDisasmRawHir |\n                        kDebugInfoDisasmHir | kDebugInfoDisasmMachineCode,\n  kDebugInfoTraceFunctions = (1 << 6),\n  kDebugInfoTraceFunctionCoverage = (1 << 7) | kDebugInfoTraceFunctions,\n  kDebugInfoTraceFunctionReferences = (1 << 8) | kDebugInfoTraceFunctions,\n  kDebugInfoTraceFunctionData = (1 << 9) | kDebugInfoTraceFunctions,\n\n  kDebugInfoAllTracing =\n      kDebugInfoTraceFunctions | kDebugInfoTraceFunctionCoverage |\n      kDebugInfoTraceFunctionReferences | kDebugInfoTraceFunctionData,\n  kDebugInfoAll = 0xFFFFFFFF,\n};\n\n// DEPRECATED\n// This will be getting removed or refactored to contain only on-demand\n// disassembly data.\nclass FunctionDebugInfo {\n public:\n  FunctionDebugInfo();\n  ~FunctionDebugInfo();\n\n  uint32_t address_reference_count() const { return address_reference_count_; }\n  void set_address_reference_count(uint32_t value) {\n    address_reference_count_ = value;\n  }\n  uint32_t instruction_result_count() const {\n    return instruction_result_count_;\n  }\n  void set_instruction_result_count(uint32_t value) {\n    instruction_result_count_ = value;\n  }\n\n  const char* source_disasm() const { return source_disasm_; }\n  void set_source_disasm(char* value) { source_disasm_ = value; }\n  const char* raw_hir_disasm() const { return raw_hir_disasm_; }\n  void set_raw_hir_disasm(char* value) { raw_hir_disasm_ = value; }\n  const char* hir_disasm() const { return hir_disasm_; }\n  void set_hir_disasm(char* value) { hir_disasm_ = value; }\n  const char* machine_code_disasm() const { return machine_code_disasm_; }\n  void set_machine_code_disasm(char* value) { machine_code_disasm_ = value; }\n\n  void Dump();\n\n private:\n  uint32_t address_reference_count_;\n  uint32_t instruction_result_count_;\n\n  char* source_disasm_;\n  char* raw_hir_disasm_;\n  char* hir_disasm_;\n  char* machine_code_disasm_;\n};\n\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_FUNCTION_DEBUG_INFO_H_\n"
  },
  {
    "path": "src/xenia/cpu/function_trace_data.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2015 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_FUNCTION_TRACE_DATA_H_\n#define XENIA_CPU_FUNCTION_TRACE_DATA_H_\n\n#include <cstdint>\n#include <cstring>\n\n#include \"xenia/base/memory.h\"\n\nnamespace xe {\nnamespace cpu {\n\nclass FunctionTraceData {\n public:\n  static const int kFunctionCallerHistoryCount = 4;\n\n  struct Header {\n    // Format is used by tooling, changes must be made across all targets.\n    // + 0   4b  (data size)\n    // + 4   4b  start_address\n    // + 8   4b  end_address\n    // +12   4b  type (user, external, etc)\n    // +16   8b  function_thread_use  // bitmask of thread id\n    // +24   8b  function_call_count\n    // +32   4b+ function_caller_history[4]\n    // +48   8b+ instruction_execute_count[instruction count]\n    uint32_t data_size;\n    uint32_t start_address;\n    uint32_t end_address;\n    uint32_t type;\n    uint64_t function_thread_use;\n    uint64_t function_call_count;\n    uint32_t function_caller_history[kFunctionCallerHistoryCount];\n    // uint64_t instruction_execute_count[];\n  };\n\n  FunctionTraceData() : header_(nullptr) {}\n\n  void Reset(uint8_t* trace_data, size_t trace_data_size,\n             uint32_t start_address, uint32_t end_address) {\n    header_ = reinterpret_cast<Header*>(trace_data);\n    header_->data_size = uint32_t(trace_data_size);\n    header_->start_address = start_address;\n    header_->end_address = end_address;\n    header_->type = 0;\n    header_->function_thread_use = 0;\n    header_->function_call_count = 0;\n    for (int i = 0; i < kFunctionCallerHistoryCount; ++i) {\n      header_->function_caller_history[i] = 0;\n    }\n    // Clear any remaining.\n    std::memset(trace_data + sizeof(Header), 0,\n                trace_data_size - sizeof(Header));\n  }\n\n  bool is_valid() const { return header_ != nullptr; }\n\n  uint32_t start_address() const { return header_->start_address; }\n  uint32_t end_address() const { return header_->end_address; }\n  uint32_t instruction_count() const {\n    return (header_->end_address - header_->start_address) / 4 + 1;\n  }\n\n  Header* header() const { return header_; }\n\n  uint8_t* instruction_execute_counts() const {\n    return reinterpret_cast<uint8_t*>(header_) + sizeof(Header);\n  }\n\n  static size_t SizeOfHeader() { return sizeof(Header); }\n\n  static size_t SizeOfInstructionCounts(uint32_t start_address,\n                                        uint32_t end_address) {\n    uint32_t instruction_count = (end_address - start_address) / 4 + 1;\n    return instruction_count * 8;\n  }\n\n private:\n  Header* header_;\n};\n\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_FUNCTION_TRACE_DATA_H_\n"
  },
  {
    "path": "src/xenia/cpu/hir/block.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/hir/block.h\"\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/cpu/hir/instr.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace hir {\n\nvoid Block::AssertNoCycles() {\n  Instr* hare = instr_head;\n  Instr* tortoise = instr_head;\n  if (!hare) {\n    return;\n  }\n  while ((hare = hare->next)) {\n    if (hare == tortoise) {\n      // Cycle!\n      assert_always();\n    }\n    hare = hare->next;\n    if (hare == tortoise) {\n      // Cycle!\n      assert_always();\n    }\n    tortoise = tortoise->next;\n    if (!hare || !tortoise) {\n      return;\n    }\n  }\n}\n\n}  // namespace hir\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/hir/block.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_HIR_BLOCK_H_\n#define XENIA_CPU_HIR_BLOCK_H_\n\n#include \"xenia/base/arena.h\"\n\nnamespace llvm {\nclass BitVector;\n}  // namespace llvm\n\nnamespace xe {\nnamespace cpu {\nnamespace hir {\n\nclass Block;\nclass HIRBuilder;\nclass Instr;\nclass Label;\n\nclass Edge {\n public:\n  enum EdgeFlags {\n    UNCONDITIONAL = (1 << 0),\n    DOMINATES = (1 << 1),\n  };\n\n public:\n  Edge* outgoing_next;\n  Edge* outgoing_prev;\n  Edge* incoming_next;\n  Edge* incoming_prev;\n\n  Block* src;\n  Block* dest;\n\n  uint32_t flags;\n};\n\nclass Block {\n public:\n  Arena* arena;\n\n  Block* next;\n  Block* prev;\n\n  Edge* incoming_edge_head;\n  Edge* outgoing_edge_head;\n  llvm::BitVector* incoming_values;\n\n  Label* label_head;\n  Label* label_tail;\n\n  Instr* instr_head;\n  Instr* instr_tail;\n\n  uint16_t ordinal;\n\n  void AssertNoCycles();\n};\n\n}  // namespace hir\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_HIR_BLOCK_H_\n"
  },
  {
    "path": "src/xenia/cpu/hir/hir_builder.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/hir/hir_builder.h\"\n\n#include <cinttypes>\n#include <cstdarg>\n#include <cstring>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/profiling.h\"\n#include \"xenia/cpu/function.h\"\n#include \"xenia/cpu/hir/block.h\"\n#include \"xenia/cpu/hir/instr.h\"\n#include \"xenia/cpu/hir/label.h\"\n#include \"xenia/cpu/symbol.h\"\n\n// Will scribble arena memory to hopefully find use before clears.\n// #define SCRIBBLE_ARENA_ON_RESET\n\nnamespace xe {\nnamespace cpu {\nnamespace hir {\n\n#define ASSERT_ADDRESS_TYPE(value) \\\n  assert_true((value->type) == INT32_TYPE || (value->type) == INT64_TYPE)\n#define ASSERT_CALL_ADDRESS_TYPE(value) \\\n  assert_true((value->type) == INT32_TYPE || (value->type) == INT64_TYPE)\n#define ASSERT_INTEGER_TYPE(value)                                         \\\n  assert_true((value->type) == INT8_TYPE || (value->type) == INT16_TYPE || \\\n              (value->type) == INT32_TYPE || (value->type) == INT64_TYPE)\n#define ASSERT_FLOAT_TYPE(value) \\\n  assert_true((value->type) == FLOAT32_TYPE || (value->type) == FLOAT64_TYPE)\n#define ASSERT_NON_FLOAT_TYPE(value) \\\n  assert_true((value->type) != FLOAT32_TYPE && (value->type) != FLOAT64_TYPE)\n#define ASSERT_NON_VECTOR_TYPE(value) assert_false((value->type) == VEC128_TYPE)\n#define ASSERT_VECTOR_TYPE(value) assert_true((value->type) == VEC128_TYPE)\n#define ASSERT_FLOAT_OR_VECTOR_TYPE(value)     \\\n  assert_true((value->type) == FLOAT32_TYPE || \\\n              (value->type) == FLOAT64_TYPE || (value->type) == VEC128_TYPE)\n#define ASSERT_TYPES_EQUAL(value1, value2) \\\n  assert_true((value1->type) == (value2->type))\n\nHIRBuilder::HIRBuilder() {\n  arena_ = new Arena();\n  Reset();\n}\n\nHIRBuilder::~HIRBuilder() {\n  Reset();\n  delete arena_;\n}\n\nvoid HIRBuilder::Reset() {\n  attributes_ = 0;\n  next_label_id_ = 0;\n  next_value_ordinal_ = 0;\n  locals_.clear();\n  block_head_ = block_tail_ = NULL;\n  current_block_ = NULL;\n#if SCRIBBLE_ARENA_ON_RESET\n  arena_->DebugFill();\n#endif\n  arena_->Reset();\n}\n\nbool HIRBuilder::Finalize() {\n  // Scan blocks in order and add fallthrough branches. These are needed for\n  // analysis passes to work. We may have also added blocks out of order and\n  // need to ensure they fall through in the right order.\n  for (auto block = block_head_; block != NULL; block = block->next) {\n    bool needs_branch = false;\n    if (block->instr_tail) {\n      if (!IsUnconditionalJump(block->instr_tail)) {\n        // Add tail branch to block that falls through.\n        needs_branch = true;\n      }\n    } else {\n      // Add tail branch to block with no instructions.\n      // Hopefully an optimization pass will clean this up later.\n      needs_branch = true;\n    }\n    if (needs_branch) {\n      current_block_ = block;\n      if (!block->next) {\n        // No following block.\n        // Sometimes VC++ generates functions with bl at the end even if they\n        // will never return. Just add a return to satisfy things.\n        // XELOGW(\"Fall-through out of the function.\");\n        Trap();\n        Return();\n        current_block_ = NULL;\n        break;\n      }\n      // Add branch.\n      Branch(block->next, BRANCH_LIKELY);\n      current_block_ = NULL;\n    }\n  }\n  return true;\n}\n\nvoid HIRBuilder::DumpValue(StringBuffer* str, Value* value) {\n  if (value->IsConstant()) {\n    switch (value->type) {\n      case INT8_TYPE:\n        str->AppendFormat(\"{:X}\", value->constant.i8);\n        break;\n      case INT16_TYPE:\n        str->AppendFormat(\"{:X}\", value->constant.i16);\n        break;\n      case INT32_TYPE:\n        str->AppendFormat(\"{:X}\", value->constant.i32);\n        break;\n      case INT64_TYPE:\n        str->AppendFormat(\"{:X}\", value->constant.i64);\n        break;\n      case FLOAT32_TYPE:\n        str->AppendFormat(\"{:F}\", value->constant.f32);\n        break;\n      case FLOAT64_TYPE:\n        str->AppendFormat(\"{:F}\", value->constant.f64);\n        break;\n      case VEC128_TYPE:\n        str->AppendFormat(\"({:F},{:F},{:F},{:F})\", value->constant.v128.x,\n                          value->constant.v128.y, value->constant.v128.z,\n                          value->constant.v128.w);\n        break;\n      default:\n        assert_always();\n        break;\n    }\n  } else {\n    static const char* type_names[] = {\n        \"i8\", \"i16\", \"i32\", \"i64\", \"f32\", \"f64\", \"v128\",\n    };\n    str->AppendFormat(\"v{}.{}\", value->ordinal, type_names[value->type]);\n  }\n  if (value->reg.index != -1) {\n    str->AppendFormat(\"<{}{}>\", value->reg.set->name, value->reg.index);\n  }\n}\n\nvoid HIRBuilder::DumpOp(StringBuffer* str, OpcodeSignatureType sig_type,\n                        Instr::Op* op) {\n  switch (sig_type) {\n    case OPCODE_SIG_TYPE_X:\n      break;\n    case OPCODE_SIG_TYPE_L:\n      if (op->label->name) {\n        str->Append(op->label->name);\n      } else {\n        str->AppendFormat(\"label{}\", op->label->id);\n      }\n      break;\n    case OPCODE_SIG_TYPE_O:\n      str->AppendFormat(\"+{}\", op->offset);\n      break;\n    case OPCODE_SIG_TYPE_S:\n      if (true) {\n        auto target = op->symbol;\n        str->Append(!target->name().empty() ? target->name() : \"<fn>\");\n      }\n      break;\n    case OPCODE_SIG_TYPE_V:\n      DumpValue(str, op->value);\n      break;\n  }\n}\n\nvoid HIRBuilder::Dump(StringBuffer* str) {\n  if (attributes_) {\n    str->AppendFormat(\"; attributes = {:08X}\\n\", attributes_);\n  }\n\n  for (auto it = locals_.begin(); it != locals_.end(); ++it) {\n    auto local = *it;\n    str->Append(\"  ; local \");\n    DumpValue(str, local);\n    str->Append('\\n');\n  }\n\n  uint32_t block_ordinal = 0;\n  Block* block = block_head_;\n  while (block) {\n    if (block == block_head_) {\n      str->Append(\"<entry>:\\n\");\n    } else if (!block->label_head) {\n      str->AppendFormat(\"<block{}>:\\n\", block_ordinal);\n    }\n    block_ordinal++;\n\n    Label* label = block->label_head;\n    while (label) {\n      if (label->name) {\n        str->AppendFormat(\"{}:\\n\", label->name);\n      } else {\n        str->AppendFormat(\"label{}:\\n\", label->id);\n      }\n      label = label->next;\n    }\n\n    Edge* incoming_edge = block->incoming_edge_head;\n    while (incoming_edge) {\n      auto src_label = incoming_edge->src->label_head;\n      if (src_label && src_label->name) {\n        str->AppendFormat(\"  ; in: {}\", src_label->name);\n      } else if (src_label) {\n        str->AppendFormat(\"  ; in: label{}\", src_label->id);\n      } else {\n        str->AppendFormat(\"  ; in: <block{}>\", incoming_edge->src->ordinal);\n      }\n      str->AppendFormat(\", dom:{}, uncond:{}\\n\",\n                        (incoming_edge->flags & Edge::DOMINATES) ? 1 : 0,\n                        (incoming_edge->flags & Edge::UNCONDITIONAL) ? 1 : 0);\n      incoming_edge = incoming_edge->incoming_next;\n    }\n    Edge* outgoing_edge = block->outgoing_edge_head;\n    while (outgoing_edge) {\n      auto dest_label = outgoing_edge->dest->label_head;\n      if (dest_label && dest_label->name) {\n        str->AppendFormat(\"  ; out: {}\", dest_label->name);\n      } else if (dest_label) {\n        str->AppendFormat(\"  ; out: label{}\", dest_label->id);\n      } else {\n        str->AppendFormat(\"  ; out: <block{}>\", outgoing_edge->dest->ordinal);\n      }\n      str->AppendFormat(\", dom:{}, uncond:{}\\n\",\n                        (outgoing_edge->flags & Edge::DOMINATES) ? 1 : 0,\n                        (outgoing_edge->flags & Edge::UNCONDITIONAL) ? 1 : 0);\n      outgoing_edge = outgoing_edge->outgoing_next;\n    }\n\n    Instr* i = block->instr_head;\n    while (i) {\n      if (i->opcode->flags & OPCODE_FLAG_HIDE) {\n        i = i->next;\n        continue;\n      }\n      if (i->opcode == &OPCODE_COMMENT_info) {\n        str->AppendFormat(\"  ; {}\\n\", reinterpret_cast<char*>(i->src1.offset));\n        i = i->next;\n        continue;\n      }\n\n      const OpcodeInfo* info = i->opcode;\n      OpcodeSignatureType dest_type = GET_OPCODE_SIG_TYPE_DEST(info->signature);\n      OpcodeSignatureType src1_type = GET_OPCODE_SIG_TYPE_SRC1(info->signature);\n      OpcodeSignatureType src2_type = GET_OPCODE_SIG_TYPE_SRC2(info->signature);\n      OpcodeSignatureType src3_type = GET_OPCODE_SIG_TYPE_SRC3(info->signature);\n      str->Append(\"  \");\n      if (dest_type) {\n        DumpValue(str, i->dest);\n        str->Append(\" = \");\n      }\n      if (i->flags) {\n        str->AppendFormat(\"{}.{}\", info->name, i->flags);\n      } else {\n        str->Append(info->name);\n      }\n      if (src1_type) {\n        str->Append(' ');\n        DumpOp(str, src1_type, &i->src1);\n      }\n      if (src2_type) {\n        str->Append(\", \");\n        DumpOp(str, src2_type, &i->src2);\n      }\n      if (src3_type) {\n        str->Append(\", \");\n        DumpOp(str, src3_type, &i->src3);\n      }\n      str->Append('\\n');\n      i = i->next;\n    }\n\n    block = block->next;\n  }\n}\n\nvoid HIRBuilder::AssertNoCycles() {\n  Block* hare = block_head_;\n  Block* tortoise = block_head_;\n  if (!hare) {\n    return;\n  }\n  while ((hare = hare->next)) {\n    if (hare == tortoise) {\n      // Cycle!\n      assert_always();\n    }\n    hare = hare->next;\n    if (hare == tortoise) {\n      // Cycle!\n      assert_always();\n    }\n    tortoise = tortoise->next;\n    if (!hare || !tortoise) {\n      return;\n    }\n  }\n}\n\nBlock* HIRBuilder::current_block() const { return current_block_; }\n\nInstr* HIRBuilder::last_instr() const {\n  if (current_block_ && current_block_->instr_tail) {\n    return current_block_->instr_tail;\n  } else if (block_tail_) {\n    return block_tail_->instr_tail;\n  }\n  return NULL;\n}\n\nLabel* HIRBuilder::NewLabel() {\n  Label* label = arena_->Alloc<Label>();\n  label->next = label->prev = NULL;\n  label->block = NULL;\n  label->id = next_label_id_++;\n  label->name = NULL;\n  label->tag = NULL;\n  return label;\n}\n\nvoid HIRBuilder::MarkLabel(Label* label, Block* block) {\n  if (!block) {\n    if (current_block_ && current_block_->instr_tail) {\n      EndBlock();\n    }\n    if (!current_block_) {\n      AppendBlock();\n    }\n    block = current_block_;\n  }\n  label->block = block;\n  label->prev = block->label_tail;\n  label->next = NULL;\n  if (label->prev) {\n    label->prev->next = label;\n    block->label_tail = label;\n  } else {\n    block->label_head = block->label_tail = label;\n  }\n}\n\nvoid HIRBuilder::InsertLabel(Label* label, Instr* prev_instr) {\n  // If we are adding to the end just use the normal path.\n  if (prev_instr == last_instr()) {\n    MarkLabel(label);\n    return;\n  }\n\n  // If we are adding at the last instruction in a block just mark\n  // the following block with a label.\n  if (!prev_instr->next) {\n    Block* next_block = prev_instr->block->next;\n    if (next_block) {\n      label->block = next_block;\n      label->next = NULL;\n      label->prev = next_block->label_tail;\n      next_block->label_tail = label;\n      if (label->prev) {\n        label->prev->next = label;\n      } else {\n        next_block->label_head = label;\n      }\n      return;\n    } else {\n      // No next block, which means we are at the end.\n      MarkLabel(label);\n      return;\n    }\n  }\n\n  // In the middle of a block. Split the block in two and insert\n  // the new block in the middle.\n  // B1.I, B1.I, <insert> B1.I, B1.I\n  // B1.I, B1.I, <insert> BN.I, BN.I\n  Block* prev_block = prev_instr->block;\n  Block* next_block = prev_instr->block->next;\n\n  Block* new_block = arena_->Alloc<Block>();\n  new_block->ordinal = UINT16_MAX;\n  new_block->incoming_values = nullptr;\n  new_block->arena = arena_;\n  new_block->prev = prev_block;\n  new_block->next = next_block;\n  if (prev_block) {\n    prev_block->next = new_block;\n  } else {\n    block_head_ = new_block;\n  }\n  if (next_block) {\n    next_block->prev = new_block;\n  } else {\n    block_tail_ = new_block;\n  }\n  new_block->label_head = new_block->label_tail = label;\n  new_block->incoming_edge_head = new_block->outgoing_edge_head = NULL;\n  label->block = new_block;\n  label->prev = label->next = NULL;\n\n  Instr* prev_next = prev_instr->next;\n  Instr* old_prev_tail = prev_block ? prev_block->instr_tail : NULL;\n  if (prev_instr->next) {\n    Instr* prev_last = prev_instr->next->prev;\n    prev_last->next = NULL;\n    prev_block->instr_tail = prev_last;\n  }\n  new_block->instr_head = prev_next;\n  if (new_block->instr_head) {\n    new_block->instr_head->prev = NULL;\n    new_block->instr_tail = old_prev_tail;\n  }\n\n  for (auto instr = new_block->instr_head; instr; instr = instr->next) {\n    instr->block = new_block;\n  }\n\n  if (current_block_ == prev_block) {\n    current_block_ = new_block;\n  }\n}\n\nvoid HIRBuilder::ResetLabelTags() {\n  // TODO(benvanik): make this faster?\n  auto block = block_head_;\n  while (block) {\n    auto label = block->label_head;\n    while (label) {\n      label->tag = 0;\n      label = label->next;\n    }\n    block = block->next;\n  }\n}\n\nvoid HIRBuilder::AddEdge(Block* src, Block* dest, uint32_t flags) {\n  bool dest_was_dominated =\n      dest->incoming_edge_head && !dest->incoming_edge_head->incoming_next;\n\n  Edge* edge = arena_->Alloc<Edge>();\n  edge->src = src;\n  edge->dest = dest;\n  edge->flags = flags;\n  edge->outgoing_prev = nullptr;\n  edge->outgoing_next = src->outgoing_edge_head;\n  if (edge->outgoing_next) {\n    edge->outgoing_next->outgoing_prev = edge;\n  }\n  src->outgoing_edge_head = edge;\n  edge->incoming_prev = nullptr;\n  edge->incoming_next = dest->incoming_edge_head;\n  if (edge->incoming_next) {\n    edge->incoming_next->incoming_prev = edge;\n  }\n  dest->incoming_edge_head = edge;\n\n  if (dest_was_dominated) {\n    // If dest was previously dominated it no longer is.\n    auto incoming_edge = dest->incoming_edge_head;\n    while (incoming_edge) {\n      incoming_edge->flags &= ~Edge::DOMINATES;\n      incoming_edge = incoming_edge->incoming_next;\n    }\n  }\n}\n\nvoid HIRBuilder::RemoveEdge(Block* src, Block* dest) {\n  auto edge = src->outgoing_edge_head;\n  while (edge) {\n    if (edge->dest == dest) {\n      RemoveEdge(edge);\n      break;\n    }\n    edge = edge->outgoing_next;\n  }\n}\n\nvoid HIRBuilder::RemoveEdge(Edge* edge) {\n  if (edge->outgoing_prev) {\n    edge->outgoing_prev->outgoing_next = edge->outgoing_next;\n  }\n  if (edge->outgoing_next) {\n    edge->outgoing_next->outgoing_prev = edge->outgoing_prev;\n  }\n  if (edge == edge->src->outgoing_edge_head) {\n    edge->src->outgoing_edge_head = edge->outgoing_next;\n  }\n  if (edge->incoming_prev) {\n    edge->incoming_prev->incoming_next = edge->incoming_next;\n  }\n  if (edge->incoming_next) {\n    edge->incoming_next->incoming_prev = edge->incoming_prev;\n  }\n  if (edge == edge->dest->incoming_edge_head) {\n    edge->dest->incoming_edge_head = edge->incoming_next;\n  }\n  edge->incoming_next = edge->incoming_prev = nullptr;\n  edge->outgoing_next = edge->outgoing_prev = nullptr;\n\n  if (edge->dest->incoming_edge_head &&\n      !edge->dest->incoming_edge_head->incoming_next) {\n    // Dest is now dominated by the last remaining edge.\n    edge->dest->incoming_edge_head->flags |= Edge::DOMINATES;\n  }\n}\n\nvoid HIRBuilder::RemoveBlock(Block* block) {\n  while (block->incoming_edge_head) {\n    RemoveEdge(block->incoming_edge_head);\n  }\n  while (block->outgoing_edge_head) {\n    RemoveEdge(block->outgoing_edge_head);\n  }\n  if (block->prev) {\n    block->prev->next = block->next;\n  }\n  if (block->next) {\n    block->next->prev = block->prev;\n  }\n  if (block == block_head_) {\n    block_head_ = block->next;\n  }\n  if (block == block_tail_) {\n    block_tail_ = block->prev;\n  }\n  block->next = block->prev = nullptr;\n}\n\nvoid HIRBuilder::MergeAdjacentBlocks(Block* left, Block* right) {\n  assert_true(left->next == right && right->prev == left);\n  assert_true(!right->incoming_edge_head ||\n              right->incoming_edge_head->flags & Edge::DOMINATES);\n\n  // If the left block ends with a branch to the right block, drop it.\n  if (left->instr_tail &&\n      left->instr_tail->opcode->flags & OPCODE_FLAG_BRANCH) {\n    auto sig = left->instr_tail->opcode->signature;\n    if (GET_OPCODE_SIG_TYPE_SRC1(sig) == OPCODE_SIG_TYPE_L) {\n      if (left->instr_tail->src1.label->block == right) {\n        left->instr_tail->Remove();\n      }\n    }\n    if (GET_OPCODE_SIG_TYPE_SRC2(sig) == OPCODE_SIG_TYPE_L) {\n      if (left->instr_tail->src2.label->block == right) {\n        left->instr_tail->Remove();\n      }\n    }\n  }\n\n  // Walk through the right instructions and shift each one back into the left.\n  while (right->instr_head) {\n    auto instr = right->instr_head;\n    auto next = instr->next;\n\n    // Link into block list.\n    instr->next = nullptr;\n    instr->prev = left->instr_tail;\n    if (left->instr_tail) {\n      left->instr_tail->next = instr;\n    } else {\n      left->instr_head = left->instr_tail = instr;\n    }\n    left->instr_tail = instr;\n\n    // Unlink from old block list.\n    right->instr_head = next;\n    if (right->instr_tail == instr) {\n      right->instr_tail = nullptr;\n    }\n    if (next) {\n      next->prev = nullptr;\n    }\n\n    // Update state.\n    instr->block = left;\n  }\n\n  // Move/remove labels.\n  // We only need to preserve named labels.\n  while (right->label_head) {\n    auto label = right->label_head;\n    if (label->name) {\n      // Label is named - move it.\n      label->block = left;\n      label->prev = left->label_tail;\n      if (left->label_tail) {\n        left->label_tail->next = label;\n      }\n      left->label_tail = label;\n      if (!left->label_head) {\n        left->label_head = label;\n      }\n    }\n    right->label_head = label->next;\n    if (right->label_tail == label) {\n      right->label_tail = nullptr;\n    }\n    label->next = nullptr;\n  }\n\n  // Remove edge between left and right.\n  RemoveEdge(left, right);\n\n  // Move right's outgoing edges to left.\n  assert_null(right->incoming_edge_head);\n  auto edge = right->outgoing_edge_head;\n  while (edge) {\n    auto next_edge = edge->outgoing_next;\n    RemoveEdge(edge);\n    AddEdge(left, edge->dest, edge->flags);\n    edge = next_edge;\n  }\n\n  // Remove the right block from the block list.\n  left->next = right->next;\n  if (right->next) {\n    right->next->prev = left;\n  }\n  if (block_tail_ == right) {\n    block_tail_ = left;\n  }\n}\n\nBlock* HIRBuilder::AppendBlock() {\n  Block* block = arena_->Alloc<Block>();\n  block->ordinal = UINT16_MAX;\n  block->incoming_values = nullptr;\n  block->arena = arena_;\n  block->next = NULL;\n  block->prev = block_tail_;\n  if (block_tail_) {\n    block_tail_->next = block;\n  }\n  block_tail_ = block;\n  if (!block_head_) {\n    block_head_ = block;\n  }\n  current_block_ = block;\n  block->label_head = block->label_tail = NULL;\n  block->incoming_edge_head = block->outgoing_edge_head = NULL;\n  block->instr_head = block->instr_tail = NULL;\n  return block;\n}\n\nvoid HIRBuilder::EndBlock() {\n  if (current_block_ && !current_block_->instr_tail) {\n    // Block never had anything added to it. Since it likely has an\n    // incoming edge, just keep it around.\n    return;\n  }\n  current_block_ = NULL;\n}\n\nbool HIRBuilder::IsUnconditionalJump(Instr* instr) {\n  if (instr->opcode == &OPCODE_CALL_info ||\n      instr->opcode == &OPCODE_CALL_INDIRECT_info) {\n    return (instr->flags & CALL_TAIL) != 0;\n  } else if (instr->opcode == &OPCODE_BRANCH_info) {\n    return true;\n  } else if (instr->opcode == &OPCODE_RETURN_info) {\n    return true;\n  }\n  return false;\n}\n\nInstr* HIRBuilder::AppendInstr(const OpcodeInfo& opcode_info, uint16_t flags,\n                               Value* dest) {\n  if (!current_block_) {\n    AppendBlock();\n  }\n  Block* block = current_block_;\n\n  Instr* instr = arena_->Alloc<Instr>();\n  instr->next = NULL;\n  instr->prev = block->instr_tail;\n  if (block->instr_tail) {\n    block->instr_tail->next = instr;\n  }\n  block->instr_tail = instr;\n  if (!block->instr_head) {\n    block->instr_head = instr;\n  }\n  instr->ordinal = UINT32_MAX;\n  instr->block = block;\n  instr->opcode = &opcode_info;\n  instr->flags = flags;\n  instr->dest = dest;\n  instr->src1.value = instr->src2.value = instr->src3.value = NULL;\n  instr->src1_use = instr->src2_use = instr->src3_use = NULL;\n  if (dest) {\n    dest->def = instr;\n  }\n  // Rely on callers to set src args.\n  // This prevents redundant stores.\n  return instr;\n}\n\nValue* HIRBuilder::AllocValue(TypeName type) {\n  Value* value = arena_->Alloc<Value>();\n  value->ordinal = next_value_ordinal_++;\n  value->type = type;\n  value->flags = 0;\n  value->def = NULL;\n  value->use_head = NULL;\n  value->last_use = NULL;\n  value->local_slot = NULL;\n  value->tag = NULL;\n  value->reg.set = NULL;\n  value->reg.index = -1;\n  return value;\n}\n\nValue* HIRBuilder::CloneValue(Value* source) {\n  Value* value = arena_->Alloc<Value>();\n  value->ordinal = next_value_ordinal_++;\n  value->type = source->type;\n  value->flags = source->flags;\n  value->constant.v128 = source->constant.v128;\n  value->def = NULL;\n  value->use_head = NULL;\n  value->last_use = NULL;\n  value->local_slot = NULL;\n  value->tag = NULL;\n  value->reg.set = NULL;\n  value->reg.index = -1;\n  return value;\n}\n\nvoid HIRBuilder::Comment(std::string_view value) {\n  if (value.empty()) {\n    return;\n  }\n  auto size = value.size();\n  auto p = reinterpret_cast<char*>(arena_->Alloc(size + 1, 1));\n  std::memcpy(p, value.data(), size);\n  p[size] = '\\0';\n  Instr* i = AppendInstr(OPCODE_COMMENT_info, 0);\n  i->src1.offset = (uint64_t)p;\n  i->src2.value = i->src3.value = NULL;\n}\n\nvoid HIRBuilder::Comment(const StringBuffer& value) {\n  if (!value.length()) {\n    return;\n  }\n  auto size = value.length();\n  auto p = reinterpret_cast<char*>(arena_->Alloc(size + 1, 1));\n  std::memcpy(p, value.buffer(), size);\n  p[size] = '\\0';\n  Instr* i = AppendInstr(OPCODE_COMMENT_info, 0);\n  i->src1.offset = (uint64_t)p;\n  i->src2.value = i->src3.value = NULL;\n}\n\nvoid HIRBuilder::CommentBuffer(const char* p) {\n  Instr* i = AppendInstr(OPCODE_COMMENT_info, 0);\n  i->src1.offset = (uint64_t)p;\n  i->src2.value = i->src3.value = NULL;\n}\n\nvoid HIRBuilder::Nop() {\n  Instr* i = AppendInstr(OPCODE_NOP_info, 0);\n  i->src1.value = i->src2.value = i->src3.value = NULL;\n}\n\nvoid HIRBuilder::SourceOffset(uint32_t offset) {\n  Instr* i = AppendInstr(OPCODE_SOURCE_OFFSET_info, 0);\n  i->src1.offset = offset;\n  i->src2.value = i->src3.value = NULL;\n}\n\nvoid HIRBuilder::DebugBreak() {\n  Instr* i = AppendInstr(OPCODE_DEBUG_BREAK_info, 0);\n  i->src1.value = i->src2.value = i->src3.value = NULL;\n  EndBlock();\n}\n\nvoid HIRBuilder::DebugBreakTrue(Value* cond) {\n  if (cond->IsConstant()) {\n    if (cond->IsConstantTrue()) {\n      DebugBreak();\n    }\n    return;\n  }\n\n  Instr* i = AppendInstr(OPCODE_DEBUG_BREAK_TRUE_info, 0);\n  i->set_src1(cond);\n  i->src2.value = i->src3.value = NULL;\n  EndBlock();\n}\n\nvoid HIRBuilder::Trap(uint16_t trap_code) {\n  Instr* i = AppendInstr(OPCODE_TRAP_info, trap_code);\n  i->src1.value = i->src2.value = i->src3.value = NULL;\n  EndBlock();\n}\n\nvoid HIRBuilder::TrapTrue(Value* cond, uint16_t trap_code) {\n  if (cond->IsConstant()) {\n    if (cond->IsConstantTrue()) {\n      Trap(trap_code);\n    }\n    return;\n  }\n\n  Instr* i = AppendInstr(OPCODE_TRAP_TRUE_info, trap_code);\n  i->set_src1(cond);\n  i->src2.value = i->src3.value = NULL;\n  EndBlock();\n}\n\nvoid HIRBuilder::Call(Function* symbol, uint16_t call_flags) {\n  Instr* i = AppendInstr(OPCODE_CALL_info, call_flags);\n  i->src1.symbol = symbol;\n  i->src2.value = i->src3.value = NULL;\n  EndBlock();\n}\n\nvoid HIRBuilder::CallTrue(Value* cond, Function* symbol, uint16_t call_flags) {\n  if (cond->IsConstant()) {\n    if (cond->IsConstantTrue()) {\n      Call(symbol, call_flags);\n    }\n    return;\n  }\n\n  Instr* i = AppendInstr(OPCODE_CALL_TRUE_info, call_flags);\n  i->set_src1(cond);\n  i->src2.symbol = symbol;\n  i->src3.value = NULL;\n  EndBlock();\n}\n\nvoid HIRBuilder::CallIndirect(Value* value, uint16_t call_flags) {\n  ASSERT_CALL_ADDRESS_TYPE(value);\n  Instr* i = AppendInstr(OPCODE_CALL_INDIRECT_info, call_flags);\n  i->set_src1(value);\n  i->src2.value = i->src3.value = NULL;\n  EndBlock();\n}\n\nvoid HIRBuilder::CallIndirectTrue(Value* cond, Value* value,\n                                  uint16_t call_flags) {\n  if (cond->IsConstant()) {\n    if (cond->IsConstantTrue()) {\n      CallIndirect(value, call_flags);\n    }\n    return;\n  }\n\n  ASSERT_CALL_ADDRESS_TYPE(value);\n  Instr* i = AppendInstr(OPCODE_CALL_INDIRECT_TRUE_info, call_flags);\n  i->set_src1(cond);\n  i->set_src2(value);\n  i->src3.value = NULL;\n  EndBlock();\n}\n\nvoid HIRBuilder::CallExtern(Function* symbol) {\n  Instr* i = AppendInstr(OPCODE_CALL_EXTERN_info, 0);\n  i->src1.symbol = symbol;\n  i->src2.value = i->src3.value = NULL;\n  EndBlock();\n}\n\nvoid HIRBuilder::Return() {\n  Instr* i = AppendInstr(OPCODE_RETURN_info, 0);\n  i->src1.value = i->src2.value = i->src3.value = NULL;\n  EndBlock();\n}\n\nvoid HIRBuilder::ReturnTrue(Value* cond) {\n  if (cond->IsConstant()) {\n    if (cond->IsConstantTrue()) {\n      Return();\n    }\n    return;\n  }\n\n  ASSERT_ADDRESS_TYPE(cond);\n  Instr* i = AppendInstr(OPCODE_RETURN_TRUE_info, 0);\n  i->set_src1(cond);\n  i->src2.value = i->src3.value = NULL;\n  EndBlock();\n}\n\nvoid HIRBuilder::SetReturnAddress(Value* value) {\n  ASSERT_CALL_ADDRESS_TYPE(value);\n  Instr* i = AppendInstr(OPCODE_SET_RETURN_ADDRESS_info, 0);\n  i->set_src1(value);\n  i->src2.value = i->src3.value = NULL;\n}\n\nvoid HIRBuilder::Branch(Label* label, uint16_t branch_flags) {\n  Instr* i = AppendInstr(OPCODE_BRANCH_info, branch_flags);\n  i->src1.label = label;\n  i->src2.value = i->src3.value = NULL;\n  EndBlock();\n}\n\nvoid HIRBuilder::Branch(Block* block, uint16_t branch_flags) {\n  if (!block->label_head) {\n    // Block needs a label.\n    Label* label = NewLabel();\n    MarkLabel(label, block);\n  }\n  Branch(block->label_head, branch_flags);\n}\n\nvoid HIRBuilder::BranchTrue(Value* cond, Label* label, uint16_t branch_flags) {\n  if (cond->IsConstant()) {\n    if (cond->IsConstantTrue()) {\n      Branch(label, branch_flags);\n    }\n    return;\n  }\n\n  Instr* i = AppendInstr(OPCODE_BRANCH_TRUE_info, branch_flags);\n  i->set_src1(cond);\n  i->src2.label = label;\n  i->src3.value = NULL;\n  EndBlock();\n}\n\nvoid HIRBuilder::BranchFalse(Value* cond, Label* label, uint16_t branch_flags) {\n  if (cond->IsConstant()) {\n    if (cond->IsConstantFalse()) {\n      Branch(label, branch_flags);\n    }\n    return;\n  }\n\n  Instr* i = AppendInstr(OPCODE_BRANCH_FALSE_info, branch_flags);\n  i->set_src1(cond);\n  i->src2.label = label;\n  i->src3.value = NULL;\n  EndBlock();\n}\n\n// phi type_name, Block* b1, Value* v1, Block* b2, Value* v2, etc\n\nValue* HIRBuilder::Assign(Value* value) {\n  if (value->IsConstant()) {\n    return value;\n  }\n\n  Instr* i = AppendInstr(OPCODE_ASSIGN_info, 0, AllocValue(value->type));\n  i->set_src1(value);\n  i->src2.value = i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::Cast(Value* value, TypeName target_type) {\n  if (value->type == target_type) {\n    return value;\n  } else if (value->IsConstant()) {\n    Value* dest = CloneValue(value);\n    dest->Cast(target_type);\n    return dest;\n  }\n\n  Instr* i = AppendInstr(OPCODE_CAST_info, 0, AllocValue(target_type));\n  i->set_src1(value);\n  i->src2.value = i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::ZeroExtend(Value* value, TypeName target_type) {\n  if (value->type == target_type) {\n    return value;\n  } else if (value->IsConstant()) {\n    Value* dest = CloneValue(value);\n    dest->ZeroExtend(target_type);\n    return dest;\n  }\n\n  Instr* i = AppendInstr(OPCODE_ZERO_EXTEND_info, 0, AllocValue(target_type));\n  i->set_src1(value);\n  i->src2.value = i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::SignExtend(Value* value, TypeName target_type) {\n  if (value->type == target_type) {\n    return value;\n  } else if (value->IsConstant()) {\n    Value* dest = CloneValue(value);\n    dest->SignExtend(target_type);\n    return dest;\n  }\n\n  Instr* i = AppendInstr(OPCODE_SIGN_EXTEND_info, 0, AllocValue(target_type));\n  i->set_src1(value);\n  i->src2.value = i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::Truncate(Value* value, TypeName target_type) {\n  ASSERT_INTEGER_TYPE(value);\n  assert_true(target_type == INT8_TYPE || target_type == INT16_TYPE ||\n              target_type == INT32_TYPE || target_type == INT64_TYPE);\n\n  if (value->type == target_type) {\n    return value;\n  } else if (value->IsConstant()) {\n    Value* dest = CloneValue(value);\n    dest->Truncate(target_type);\n    return dest;\n  }\n\n  Instr* i = AppendInstr(OPCODE_TRUNCATE_info, 0, AllocValue(target_type));\n  i->set_src1(value);\n  i->src2.value = i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::Convert(Value* value, TypeName target_type,\n                           RoundMode round_mode) {\n  if (value->type == target_type) {\n    return value;\n  } else if (value->IsConstant()) {\n    Value* dest = CloneValue(value);\n    dest->Convert(target_type, round_mode);\n    return dest;\n  }\n\n  Instr* i =\n      AppendInstr(OPCODE_CONVERT_info, round_mode, AllocValue(target_type));\n  i->set_src1(value);\n  i->src2.value = i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::Round(Value* value, RoundMode round_mode) {\n  ASSERT_FLOAT_OR_VECTOR_TYPE(value);\n\n  if (value->IsConstant()) {\n    Value* dest = CloneValue(value);\n    dest->Round(round_mode);\n    return dest;\n  }\n\n  Instr* i =\n      AppendInstr(OPCODE_ROUND_info, round_mode, AllocValue(value->type));\n  i->set_src1(value);\n  i->src2.value = i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::VectorConvertI2F(Value* value, uint32_t arithmetic_flags) {\n  ASSERT_VECTOR_TYPE(value);\n\n  Instr* i = AppendInstr(OPCODE_VECTOR_CONVERT_I2F_info, arithmetic_flags,\n                         AllocValue(value->type));\n  i->set_src1(value);\n  i->src2.value = i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::VectorConvertF2I(Value* value, uint32_t arithmetic_flags) {\n  ASSERT_VECTOR_TYPE(value);\n\n  Instr* i = AppendInstr(OPCODE_VECTOR_CONVERT_F2I_info, arithmetic_flags,\n                         AllocValue(value->type));\n  i->set_src1(value);\n  i->src2.value = i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::LoadZero(TypeName type) {\n  // TODO(benvanik): cache zeros per block/fn? Prevents tons of dupes.\n  Value* dest = AllocValue();\n  dest->set_zero(type);\n  return dest;\n}\n\nValue* HIRBuilder::LoadConstantInt8(int8_t value) {\n  Value* dest = AllocValue();\n  dest->set_constant(value);\n  return dest;\n}\n\nValue* HIRBuilder::LoadConstantUint8(uint8_t value) {\n  Value* dest = AllocValue();\n  dest->set_constant(value);\n  return dest;\n}\n\nValue* HIRBuilder::LoadConstantInt16(int16_t value) {\n  Value* dest = AllocValue();\n  dest->set_constant(value);\n  return dest;\n}\n\nValue* HIRBuilder::LoadConstantUint16(uint16_t value) {\n  Value* dest = AllocValue();\n  dest->set_constant(value);\n  return dest;\n}\n\nValue* HIRBuilder::LoadConstantInt32(int32_t value) {\n  Value* dest = AllocValue();\n  dest->set_constant(value);\n  return dest;\n}\n\nValue* HIRBuilder::LoadConstantUint32(uint32_t value) {\n  Value* dest = AllocValue();\n  dest->set_constant(value);\n  return dest;\n}\n\nValue* HIRBuilder::LoadConstantInt64(int64_t value) {\n  Value* dest = AllocValue();\n  dest->set_constant(value);\n  return dest;\n}\n\nValue* HIRBuilder::LoadConstantUint64(uint64_t value) {\n  Value* dest = AllocValue();\n  dest->set_constant(value);\n  return dest;\n}\n\nValue* HIRBuilder::LoadConstantFloat32(float value) {\n  Value* dest = AllocValue();\n  dest->set_constant(value);\n  return dest;\n}\n\nValue* HIRBuilder::LoadConstantFloat64(double value) {\n  Value* dest = AllocValue();\n  dest->set_constant(value);\n  return dest;\n}\n\nValue* HIRBuilder::LoadConstantVec128(const vec128_t& value) {\n  Value* dest = AllocValue();\n  dest->set_constant(value);\n  return dest;\n}\n\nValue* HIRBuilder::LoadVectorShl(Value* sh) {\n  assert_true(sh->type == INT8_TYPE);\n  Instr* i =\n      AppendInstr(OPCODE_LOAD_VECTOR_SHL_info, 0, AllocValue(VEC128_TYPE));\n  i->set_src1(sh);\n  i->src2.value = i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::LoadVectorShr(Value* sh) {\n  assert_true(sh->type == INT8_TYPE);\n  Instr* i =\n      AppendInstr(OPCODE_LOAD_VECTOR_SHR_info, 0, AllocValue(VEC128_TYPE));\n  i->set_src1(sh);\n  i->src2.value = i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::LoadClock() {\n  Instr* i = AppendInstr(OPCODE_LOAD_CLOCK_info, 0, AllocValue(INT64_TYPE));\n  i->src1.value = i->src2.value = i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::AllocLocal(TypeName type) {\n  Value* slot = AllocValue(type);\n  locals_.push_back(slot);\n  return slot;\n}\n\nValue* HIRBuilder::LoadLocal(Value* slot) {\n  Instr* i = AppendInstr(OPCODE_LOAD_LOCAL_info, 0, AllocValue(slot->type));\n  i->set_src1(slot);\n  i->src2.value = i->src3.value = NULL;\n  return i->dest;\n}\n\nvoid HIRBuilder::StoreLocal(Value* slot, Value* value) {\n  Instr* i = AppendInstr(OPCODE_STORE_LOCAL_info, 0);\n  i->set_src1(slot);\n  i->set_src2(value);\n  i->src3.value = NULL;\n}\n\nValue* HIRBuilder::LoadContext(size_t offset, TypeName type) {\n  Instr* i = AppendInstr(OPCODE_LOAD_CONTEXT_info, 0, AllocValue(type));\n  i->src1.offset = offset;\n  i->src2.value = i->src3.value = NULL;\n  return i->dest;\n}\n\nvoid HIRBuilder::StoreContext(size_t offset, Value* value) {\n  Instr* i = AppendInstr(OPCODE_STORE_CONTEXT_info, 0);\n  i->src1.offset = offset;\n  i->set_src2(value);\n  i->src3.value = NULL;\n}\n\nvoid HIRBuilder::ContextBarrier() {\n  AppendInstr(OPCODE_CONTEXT_BARRIER_info, 0);\n}\n\nValue* HIRBuilder::LoadMmio(cpu::MMIORange* mmio_range, uint32_t address,\n                            TypeName type) {\n  Instr* i = AppendInstr(OPCODE_LOAD_MMIO_info, 0, AllocValue(type));\n  i->src1.offset = reinterpret_cast<uint64_t>(mmio_range);\n  i->src2.offset = address;\n  i->src3.value = NULL;\n  return i->dest;\n}\n\nvoid HIRBuilder::StoreMmio(cpu::MMIORange* mmio_range, uint32_t address,\n                           Value* value) {\n  Instr* i = AppendInstr(OPCODE_STORE_MMIO_info, 0);\n  i->src1.offset = reinterpret_cast<uint64_t>(mmio_range);\n  i->src2.offset = address;\n  i->set_src3(value);\n}\n\nValue* HIRBuilder::LoadOffset(Value* address, Value* offset, TypeName type,\n                              uint32_t load_flags) {\n  ASSERT_ADDRESS_TYPE(address);\n  Instr* i = AppendInstr(OPCODE_LOAD_OFFSET_info, load_flags, AllocValue(type));\n  i->set_src1(address);\n  i->set_src2(offset);\n  i->src3.value = NULL;\n  return i->dest;\n}\n\nvoid HIRBuilder::StoreOffset(Value* address, Value* offset, Value* value,\n                             uint32_t store_flags) {\n  ASSERT_ADDRESS_TYPE(address);\n  Instr* i = AppendInstr(OPCODE_STORE_OFFSET_info, store_flags);\n  i->set_src1(address);\n  i->set_src2(offset);\n  i->set_src3(value);\n}\n\nValue* HIRBuilder::Load(Value* address, TypeName type, uint32_t load_flags) {\n  ASSERT_ADDRESS_TYPE(address);\n  Instr* i = AppendInstr(OPCODE_LOAD_info, load_flags, AllocValue(type));\n  i->set_src1(address);\n  i->src2.value = i->src3.value = NULL;\n  return i->dest;\n}\n\nvoid HIRBuilder::Store(Value* address, Value* value, uint32_t store_flags) {\n  ASSERT_ADDRESS_TYPE(address);\n  Instr* i = AppendInstr(OPCODE_STORE_info, store_flags);\n  i->set_src1(address);\n  i->set_src2(value);\n  i->src3.value = NULL;\n}\n\nvoid HIRBuilder::Memset(Value* address, Value* value, Value* length) {\n  ASSERT_ADDRESS_TYPE(address);\n  ASSERT_TYPES_EQUAL(address, length);\n  assert_true(value->type == INT8_TYPE);\n  Instr* i = AppendInstr(OPCODE_MEMSET_info, 0);\n  i->set_src1(address);\n  i->set_src2(value);\n  i->set_src3(length);\n}\n\nvoid HIRBuilder::CacheControl(Value* address, size_t cache_line_size,\n                              CacheControlType type) {\n  ASSERT_ADDRESS_TYPE(address);\n  Instr* i = AppendInstr(OPCODE_CACHE_CONTROL_info, uint32_t(type));\n  i->set_src1(address);\n  i->src2.offset = cache_line_size;\n  i->src3.value = NULL;\n}\n\nvoid HIRBuilder::MemoryBarrier() { AppendInstr(OPCODE_MEMORY_BARRIER_info, 0); }\n\nvoid HIRBuilder::SetRoundingMode(Value* value) {\n  ASSERT_INTEGER_TYPE(value);\n  Instr* i = AppendInstr(OPCODE_SET_ROUNDING_MODE_info, 0);\n  i->set_src1(value);\n}\n\nValue* HIRBuilder::Max(Value* value1, Value* value2) {\n  ASSERT_TYPES_EQUAL(value1, value2);\n\n  if (value1->type != VEC128_TYPE && value1->IsConstant() &&\n      value2->IsConstant()) {\n    return value1->Compare(OPCODE_COMPARE_SLT, value2) ? value2 : value1;\n  }\n\n  Instr* i = AppendInstr(OPCODE_MAX_info, 0, AllocValue(value1->type));\n  i->set_src1(value1);\n  i->set_src2(value2);\n  i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::VectorMax(Value* value1, Value* value2, TypeName part_type,\n                             uint32_t arithmetic_flags) {\n  ASSERT_TYPES_EQUAL(value1, value2);\n\n  uint16_t flags = arithmetic_flags | (part_type << 8);\n  Instr* i =\n      AppendInstr(OPCODE_VECTOR_MAX_info, flags, AllocValue(value1->type));\n  i->set_src1(value1);\n  i->set_src2(value2);\n  i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::Min(Value* value1, Value* value2) {\n  ASSERT_TYPES_EQUAL(value1, value2);\n\n  if (value1->type != VEC128_TYPE && value1->IsConstant() &&\n      value2->IsConstant()) {\n    return value1->Compare(OPCODE_COMPARE_SLT, value2) ? value1 : value2;\n  }\n\n  Instr* i = AppendInstr(OPCODE_MIN_info, 0, AllocValue(value1->type));\n  i->set_src1(value1);\n  i->set_src2(value2);\n  i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::VectorMin(Value* value1, Value* value2, TypeName part_type,\n                             uint32_t arithmetic_flags) {\n  ASSERT_TYPES_EQUAL(value1, value2);\n\n  uint16_t flags = arithmetic_flags | (part_type << 8);\n  Instr* i =\n      AppendInstr(OPCODE_VECTOR_MIN_info, flags, AllocValue(value1->type));\n  i->set_src1(value1);\n  i->set_src2(value2);\n  i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::Select(Value* cond, Value* value1, Value* value2) {\n  assert_true(cond->type == INT8_TYPE || cond->type == VEC128_TYPE);  // for now\n  ASSERT_TYPES_EQUAL(value1, value2);\n\n  if (cond->IsConstant()) {\n    return cond->IsConstantTrue() ? value1 : value2;\n  }\n\n  Instr* i = AppendInstr(OPCODE_SELECT_info, 0, AllocValue(value1->type));\n  i->set_src1(cond);\n  i->set_src2(value1);\n  i->set_src3(value2);\n  return i->dest;\n}\n\nValue* HIRBuilder::IsTrue(Value* value) {\n  if (value->IsConstant()) {\n    return LoadConstantInt8(value->IsConstantTrue() ? 1 : 0);\n  }\n\n  Instr* i = AppendInstr(OPCODE_IS_TRUE_info, 0, AllocValue(INT8_TYPE));\n  i->set_src1(value);\n  i->src2.value = i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::IsFalse(Value* value) {\n  if (value->IsConstant()) {\n    return LoadConstantInt8(value->IsConstantFalse() ? 1 : 0);\n  }\n\n  Instr* i = AppendInstr(OPCODE_IS_FALSE_info, 0, AllocValue(INT8_TYPE));\n  i->set_src1(value);\n  i->src2.value = i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::IsNan(Value* value) {\n  Instr* i = AppendInstr(OPCODE_IS_NAN_info, 0, AllocValue(INT8_TYPE));\n  i->set_src1(value);\n  i->src2.value = i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::CompareXX(const OpcodeInfo& opcode, Value* value1,\n                             Value* value2) {\n  ASSERT_TYPES_EQUAL(value1, value2);\n  if (value1->IsConstant() && value2->IsConstant()) {\n    return LoadConstantInt8(value1->Compare(opcode.num, value2) ? 1 : 0);\n  }\n\n  Instr* i = AppendInstr(opcode, 0, AllocValue(INT8_TYPE));\n  i->set_src1(value1);\n  i->set_src2(value2);\n  i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::CompareEQ(Value* value1, Value* value2) {\n  return CompareXX(OPCODE_COMPARE_EQ_info, value1, value2);\n}\n\nValue* HIRBuilder::CompareNE(Value* value1, Value* value2) {\n  return CompareXX(OPCODE_COMPARE_NE_info, value1, value2);\n}\n\nValue* HIRBuilder::CompareSLT(Value* value1, Value* value2) {\n  return CompareXX(OPCODE_COMPARE_SLT_info, value1, value2);\n}\n\nValue* HIRBuilder::CompareSLE(Value* value1, Value* value2) {\n  return CompareXX(OPCODE_COMPARE_SLE_info, value1, value2);\n}\n\nValue* HIRBuilder::CompareSGT(Value* value1, Value* value2) {\n  return CompareXX(OPCODE_COMPARE_SGT_info, value1, value2);\n}\n\nValue* HIRBuilder::CompareSGE(Value* value1, Value* value2) {\n  return CompareXX(OPCODE_COMPARE_SGE_info, value1, value2);\n}\n\nValue* HIRBuilder::CompareULT(Value* value1, Value* value2) {\n  return CompareXX(OPCODE_COMPARE_ULT_info, value1, value2);\n}\n\nValue* HIRBuilder::CompareULE(Value* value1, Value* value2) {\n  return CompareXX(OPCODE_COMPARE_ULE_info, value1, value2);\n}\n\nValue* HIRBuilder::CompareUGT(Value* value1, Value* value2) {\n  return CompareXX(OPCODE_COMPARE_UGT_info, value1, value2);\n}\n\nValue* HIRBuilder::CompareUGE(Value* value1, Value* value2) {\n  return CompareXX(OPCODE_COMPARE_UGE_info, value1, value2);\n}\n\nValue* HIRBuilder::DidSaturate(Value* value) {\n  Instr* i = AppendInstr(OPCODE_DID_SATURATE_info, 0, AllocValue(INT8_TYPE));\n  i->set_src1(value);\n  i->src2.value = i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::VectorCompareXX(const OpcodeInfo& opcode, Value* value1,\n                                   Value* value2, TypeName part_type) {\n  ASSERT_TYPES_EQUAL(value1, value2);\n\n  // TODO(benvanik): check how this is used - sometimes I think it's used to\n  //     load bitmasks and may be worth checking constants on.\n\n  Instr* i = AppendInstr(opcode, part_type, AllocValue(value1->type));\n  i->set_src1(value1);\n  i->set_src2(value2);\n  i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::VectorCompareEQ(Value* value1, Value* value2,\n                                   TypeName part_type) {\n  return VectorCompareXX(OPCODE_VECTOR_COMPARE_EQ_info, value1, value2,\n                         part_type);\n}\n\nValue* HIRBuilder::VectorCompareSGT(Value* value1, Value* value2,\n                                    TypeName part_type) {\n  return VectorCompareXX(OPCODE_VECTOR_COMPARE_SGT_info, value1, value2,\n                         part_type);\n}\n\nValue* HIRBuilder::VectorCompareSGE(Value* value1, Value* value2,\n                                    TypeName part_type) {\n  return VectorCompareXX(OPCODE_VECTOR_COMPARE_SGE_info, value1, value2,\n                         part_type);\n}\n\nValue* HIRBuilder::VectorCompareUGT(Value* value1, Value* value2,\n                                    TypeName part_type) {\n  return VectorCompareXX(OPCODE_VECTOR_COMPARE_UGT_info, value1, value2,\n                         part_type);\n}\n\nValue* HIRBuilder::VectorCompareUGE(Value* value1, Value* value2,\n                                    TypeName part_type) {\n  return VectorCompareXX(OPCODE_VECTOR_COMPARE_UGE_info, value1, value2,\n                         part_type);\n}\n\nValue* HIRBuilder::Add(Value* value1, Value* value2,\n                       uint32_t arithmetic_flags) {\n  ASSERT_TYPES_EQUAL(value1, value2);\n\n  // TODO(benvanik): optimize when flags set.\n  if (!arithmetic_flags) {\n    if (value1->IsConstantZero()) {\n      return value2;\n    } else if (value2->IsConstantZero()) {\n      return value1;\n    } else if (value1->IsConstant() && value2->IsConstant()) {\n      Value* dest = CloneValue(value1);\n      dest->Add(value2);\n      return dest;\n    }\n  }\n\n  Instr* i =\n      AppendInstr(OPCODE_ADD_info, arithmetic_flags, AllocValue(value1->type));\n  i->set_src1(value1);\n  i->set_src2(value2);\n  i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::AddWithCarry(Value* value1, Value* value2, Value* value3,\n                                uint32_t arithmetic_flags) {\n  ASSERT_TYPES_EQUAL(value1, value2);\n  assert_true(value3->type == INT8_TYPE);\n\n  Instr* i = AppendInstr(OPCODE_ADD_CARRY_info, arithmetic_flags,\n                         AllocValue(value1->type));\n  i->set_src1(value1);\n  i->set_src2(value2);\n  i->set_src3(value3);\n  return i->dest;\n}\n\nValue* HIRBuilder::VectorAdd(Value* value1, Value* value2, TypeName part_type,\n                             uint32_t arithmetic_flags) {\n  ASSERT_VECTOR_TYPE(value1);\n  ASSERT_VECTOR_TYPE(value2);\n\n  // This is shady.\n  uint32_t flags = part_type | (arithmetic_flags << 8);\n  assert_zero(flags >> 16);\n\n  Instr* i = AppendInstr(OPCODE_VECTOR_ADD_info, (uint16_t)flags,\n                         AllocValue(value1->type));\n  i->set_src1(value1);\n  i->set_src2(value2);\n  i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::Sub(Value* value1, Value* value2,\n                       uint32_t arithmetic_flags) {\n  ASSERT_TYPES_EQUAL(value1, value2);\n\n  Instr* i =\n      AppendInstr(OPCODE_SUB_info, arithmetic_flags, AllocValue(value1->type));\n  i->set_src1(value1);\n  i->set_src2(value2);\n  i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::VectorSub(Value* value1, Value* value2, TypeName part_type,\n                             uint32_t arithmetic_flags) {\n  ASSERT_VECTOR_TYPE(value1);\n  ASSERT_VECTOR_TYPE(value2);\n\n  // This is shady.\n  uint32_t flags = part_type | (arithmetic_flags << 8);\n  assert_zero(flags >> 16);\n\n  Instr* i = AppendInstr(OPCODE_VECTOR_SUB_info, (uint16_t)flags,\n                         AllocValue(value1->type));\n  i->set_src1(value1);\n  i->set_src2(value2);\n  i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::Mul(Value* value1, Value* value2,\n                       uint32_t arithmetic_flags) {\n  ASSERT_TYPES_EQUAL(value1, value2);\n\n  Instr* i =\n      AppendInstr(OPCODE_MUL_info, arithmetic_flags, AllocValue(value1->type));\n  i->set_src1(value1);\n  i->set_src2(value2);\n  i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::MulHi(Value* value1, Value* value2,\n                         uint32_t arithmetic_flags) {\n  ASSERT_TYPES_EQUAL(value1, value2);\n\n  Instr* i = AppendInstr(OPCODE_MUL_HI_info, arithmetic_flags,\n                         AllocValue(value1->type));\n  i->set_src1(value1);\n  i->set_src2(value2);\n  i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::Div(Value* value1, Value* value2,\n                       uint32_t arithmetic_flags) {\n  ASSERT_TYPES_EQUAL(value1, value2);\n\n  Instr* i =\n      AppendInstr(OPCODE_DIV_info, arithmetic_flags, AllocValue(value1->type));\n  i->set_src1(value1);\n  i->set_src2(value2);\n  i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::MulAdd(Value* value1, Value* value2, Value* value3) {\n  ASSERT_TYPES_EQUAL(value1, value2);\n  ASSERT_TYPES_EQUAL(value1, value3);\n\n  bool c1 = value1->IsConstant();\n  bool c2 = value2->IsConstant();\n  if (c1 && c2) {\n    Value* dest = CloneValue(value1);\n    dest->Mul(value2);\n    return Add(dest, value3);\n  }\n\n  Instr* i = AppendInstr(OPCODE_MUL_ADD_info, 0, AllocValue(value1->type));\n  i->set_src1(value1);\n  i->set_src2(value2);\n  i->set_src3(value3);\n  return i->dest;\n}\n\nValue* HIRBuilder::MulSub(Value* value1, Value* value2, Value* value3) {\n  ASSERT_TYPES_EQUAL(value1, value2);\n  ASSERT_TYPES_EQUAL(value1, value3);\n\n  bool c1 = value1->IsConstant();\n  bool c2 = value2->IsConstant();\n  if (c1 && c2) {\n    Value* dest = CloneValue(value1);\n    dest->Mul(value2);\n    return Sub(dest, value3);\n  }\n\n  Instr* i = AppendInstr(OPCODE_MUL_SUB_info, 0, AllocValue(value1->type));\n  i->set_src1(value1);\n  i->set_src2(value2);\n  i->set_src3(value3);\n  return i->dest;\n}\n\nValue* HIRBuilder::Neg(Value* value) {\n  Instr* i = AppendInstr(OPCODE_NEG_info, 0, AllocValue(value->type));\n  i->set_src1(value);\n  i->src2.value = i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::Abs(Value* value) {\n  ASSERT_FLOAT_OR_VECTOR_TYPE(value);\n\n  Instr* i = AppendInstr(OPCODE_ABS_info, 0, AllocValue(value->type));\n  i->set_src1(value);\n  i->src2.value = i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::Sqrt(Value* value) {\n  ASSERT_FLOAT_OR_VECTOR_TYPE(value);\n\n  Instr* i = AppendInstr(OPCODE_SQRT_info, 0, AllocValue(value->type));\n  i->set_src1(value);\n  i->src2.value = i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::RSqrt(Value* value) {\n  ASSERT_FLOAT_OR_VECTOR_TYPE(value);\n\n  Instr* i = AppendInstr(OPCODE_RSQRT_info, 0, AllocValue(value->type));\n  i->set_src1(value);\n  i->src2.value = i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::Recip(Value* value) {\n  ASSERT_FLOAT_OR_VECTOR_TYPE(value);\n\n  Instr* i = AppendInstr(OPCODE_RECIP_info, 0, AllocValue(value->type));\n  i->set_src1(value);\n  i->src2.value = i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::Pow2(Value* value) {\n  ASSERT_FLOAT_OR_VECTOR_TYPE(value);\n\n  Instr* i = AppendInstr(OPCODE_POW2_info, 0, AllocValue(value->type));\n  i->set_src1(value);\n  i->src2.value = i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::Log2(Value* value) {\n  ASSERT_FLOAT_OR_VECTOR_TYPE(value);\n\n  Instr* i = AppendInstr(OPCODE_LOG2_info, 0, AllocValue(value->type));\n  i->set_src1(value);\n  i->src2.value = i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::DotProduct3(Value* value1, Value* value2) {\n  ASSERT_VECTOR_TYPE(value1);\n  ASSERT_VECTOR_TYPE(value2);\n  ASSERT_TYPES_EQUAL(value1, value2);\n\n  Instr* i =\n      AppendInstr(OPCODE_DOT_PRODUCT_3_info, 0, AllocValue(FLOAT32_TYPE));\n  i->set_src1(value1);\n  i->set_src2(value2);\n  i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::DotProduct4(Value* value1, Value* value2) {\n  ASSERT_VECTOR_TYPE(value1);\n  ASSERT_VECTOR_TYPE(value2);\n  ASSERT_TYPES_EQUAL(value1, value2);\n\n  Instr* i =\n      AppendInstr(OPCODE_DOT_PRODUCT_4_info, 0, AllocValue(FLOAT32_TYPE));\n  i->set_src1(value1);\n  i->set_src2(value2);\n  i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::And(Value* value1, Value* value2) {\n  ASSERT_NON_FLOAT_TYPE(value1);\n  ASSERT_NON_FLOAT_TYPE(value2);\n  ASSERT_TYPES_EQUAL(value1, value2);\n\n  if (value1 == value2) {\n    return value1;\n  } else if (value1->IsConstantZero()) {\n    return value1;\n  } else if (value2->IsConstantZero()) {\n    return value2;\n  }\n\n  Instr* i = AppendInstr(OPCODE_AND_info, 0, AllocValue(value1->type));\n  i->set_src1(value1);\n  i->set_src2(value2);\n  i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::AndNot(Value* value1, Value* value2) {\n  ASSERT_NON_FLOAT_TYPE(value1);\n  ASSERT_NON_FLOAT_TYPE(value2);\n  ASSERT_TYPES_EQUAL(value1, value2);\n\n  if (value1 == value2) {\n    return LoadZero(value1->type);\n  } else if (value1->IsConstantZero()) {\n    return value1;\n  } else if (value2->IsConstantZero()) {\n    return value1;\n  }\n\n  Instr* i = AppendInstr(OPCODE_AND_NOT_info, 0, AllocValue(value1->type));\n  i->set_src1(value1);\n  i->set_src2(value2);\n  i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::Or(Value* value1, Value* value2) {\n  ASSERT_NON_FLOAT_TYPE(value1);\n  ASSERT_NON_FLOAT_TYPE(value2);\n  ASSERT_TYPES_EQUAL(value1, value2);\n\n  if (value1 == value2) {\n    return value1;\n  } else if (value1->IsConstantZero()) {\n    return value2;\n  } else if (value2->IsConstantZero()) {\n    return value1;\n  }\n\n  Instr* i = AppendInstr(OPCODE_OR_info, 0, AllocValue(value1->type));\n  i->set_src1(value1);\n  i->set_src2(value2);\n  i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::Xor(Value* value1, Value* value2) {\n  ASSERT_NON_FLOAT_TYPE(value1);\n  ASSERT_NON_FLOAT_TYPE(value2);\n  ASSERT_TYPES_EQUAL(value1, value2);\n\n  if (value1 == value2) {\n    return LoadZero(value1->type);\n  }\n\n  Instr* i = AppendInstr(OPCODE_XOR_info, 0, AllocValue(value1->type));\n  i->set_src1(value1);\n  i->set_src2(value2);\n  i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::Not(Value* value) {\n  ASSERT_NON_FLOAT_TYPE(value);\n\n  if (value->IsConstant()) {\n    Value* dest = CloneValue(value);\n    dest->Not();\n    return dest;\n  }\n\n  Instr* i = AppendInstr(OPCODE_NOT_info, 0, AllocValue(value->type));\n  i->set_src1(value);\n  i->src2.value = i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::Shl(Value* value1, Value* value2) {\n  ASSERT_NON_FLOAT_TYPE(value1);\n  ASSERT_INTEGER_TYPE(value2);\n\n  // NOTE AND value2 with 0x3F for 64bit, 0x1F for 32bit, etc..\n\n  if (value2->IsConstantZero()) {\n    return value1;\n  }\n  if (value2->type != INT8_TYPE) {\n    value2 = Truncate(value2, INT8_TYPE);\n  }\n\n  Instr* i = AppendInstr(OPCODE_SHL_info, 0, AllocValue(value1->type));\n  i->set_src1(value1);\n  i->set_src2(value2);\n  i->src3.value = NULL;\n  return i->dest;\n}\nValue* HIRBuilder::Shl(Value* value1, int8_t value2) {\n  return Shl(value1, LoadConstantInt8(value2));\n}\n\nValue* HIRBuilder::VectorShl(Value* value1, Value* value2, TypeName part_type) {\n  ASSERT_VECTOR_TYPE(value1);\n  ASSERT_VECTOR_TYPE(value2);\n\n  Instr* i =\n      AppendInstr(OPCODE_VECTOR_SHL_info, part_type, AllocValue(value1->type));\n  i->set_src1(value1);\n  i->set_src2(value2);\n  i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::Shr(Value* value1, Value* value2) {\n  ASSERT_NON_FLOAT_TYPE(value1);\n  ASSERT_INTEGER_TYPE(value2);\n\n  if (value2->IsConstantZero()) {\n    return value1;\n  }\n  if (value2->type != INT8_TYPE) {\n    value2 = Truncate(value2, INT8_TYPE);\n  }\n\n  Instr* i = AppendInstr(OPCODE_SHR_info, 0, AllocValue(value1->type));\n  i->set_src1(value1);\n  i->set_src2(value2);\n  i->src3.value = NULL;\n  return i->dest;\n}\nValue* HIRBuilder::Shr(Value* value1, int8_t value2) {\n  return Shr(value1, LoadConstantInt8(value2));\n}\n\nValue* HIRBuilder::VectorShr(Value* value1, Value* value2, TypeName part_type) {\n  ASSERT_VECTOR_TYPE(value1);\n  ASSERT_VECTOR_TYPE(value2);\n\n  Instr* i =\n      AppendInstr(OPCODE_VECTOR_SHR_info, part_type, AllocValue(value1->type));\n  i->set_src1(value1);\n  i->set_src2(value2);\n  i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::Sha(Value* value1, Value* value2) {\n  ASSERT_INTEGER_TYPE(value1);\n  ASSERT_INTEGER_TYPE(value2);\n\n  if (value2->IsConstantZero()) {\n    return value1;\n  }\n  if (value2->type != INT8_TYPE) {\n    value2 = Truncate(value2, INT8_TYPE);\n  }\n\n  Instr* i = AppendInstr(OPCODE_SHA_info, 0, AllocValue(value1->type));\n  i->set_src1(value1);\n  i->set_src2(value2);\n  i->src3.value = NULL;\n  return i->dest;\n}\nValue* HIRBuilder::Sha(Value* value1, int8_t value2) {\n  return Sha(value1, LoadConstantInt8(value2));\n}\n\nValue* HIRBuilder::VectorSha(Value* value1, Value* value2, TypeName part_type) {\n  ASSERT_VECTOR_TYPE(value1);\n  ASSERT_VECTOR_TYPE(value2);\n\n  Instr* i =\n      AppendInstr(OPCODE_VECTOR_SHA_info, part_type, AllocValue(value1->type));\n  i->set_src1(value1);\n  i->set_src2(value2);\n  i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::RotateLeft(Value* value1, Value* value2) {\n  ASSERT_INTEGER_TYPE(value1);\n  ASSERT_INTEGER_TYPE(value2);\n\n  if (value2->IsConstantZero()) {\n    return value1;\n  }\n\n  if (value2->type != INT8_TYPE) {\n    value2 = Truncate(value2, INT8_TYPE);\n  }\n\n  Instr* i = AppendInstr(OPCODE_ROTATE_LEFT_info, 0, AllocValue(value1->type));\n  i->set_src1(value1);\n  i->set_src2(value2);\n  i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::VectorRotateLeft(Value* value1, Value* value2,\n                                    TypeName part_type) {\n  ASSERT_VECTOR_TYPE(value1);\n  ASSERT_VECTOR_TYPE(value2);\n\n  Instr* i = AppendInstr(OPCODE_VECTOR_ROTATE_LEFT_info, part_type,\n                         AllocValue(value1->type));\n  i->set_src1(value1);\n  i->set_src2(value2);\n  i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::VectorAverage(Value* value1, Value* value2,\n                                 TypeName part_type,\n                                 uint32_t arithmetic_flags) {\n  ASSERT_VECTOR_TYPE(value1);\n  ASSERT_VECTOR_TYPE(value2);\n\n  // This is shady.\n  uint32_t flags = part_type | (arithmetic_flags << 8);\n  assert_zero(flags >> 16);\n\n  Instr* i = AppendInstr(OPCODE_VECTOR_AVERAGE_info, uint16_t(flags),\n                         AllocValue(value1->type));\n  i->set_src1(value1);\n  i->set_src2(value2);\n  i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::ByteSwap(Value* value) {\n  if (value->type == INT8_TYPE) {\n    return value;\n  }\n\n  Instr* i = AppendInstr(OPCODE_BYTE_SWAP_info, 0, AllocValue(value->type));\n  i->set_src1(value);\n  i->src2.value = i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::CountLeadingZeros(Value* value) {\n  ASSERT_INTEGER_TYPE(value);\n\n  if (value->IsConstantZero()) {\n    static const uint8_t zeros[] = {\n        8,\n        16,\n        32,\n        64,\n    };\n    assert_true(value->type <= INT64_TYPE);\n    return LoadConstantUint8(zeros[value->type]);\n  }\n\n  Instr* i = AppendInstr(OPCODE_CNTLZ_info, 0, AllocValue(INT8_TYPE));\n  i->set_src1(value);\n  i->src2.value = i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::Insert(Value* value, Value* index, Value* part) {\n  // TODO(benvanik): could do some of this as constants.\n\n  Value* trunc_index =\n      index->type != INT8_TYPE ? Truncate(index, INT8_TYPE) : index;\n\n  Instr* i = AppendInstr(OPCODE_INSERT_info, 0, AllocValue(value->type));\n  i->set_src1(value);\n  i->set_src2(trunc_index);\n  i->set_src3(part);\n  return i->dest;\n}\n\nValue* HIRBuilder::Insert(Value* value, uint64_t index, Value* part) {\n  return Insert(value, LoadConstantUint64(index), part);\n}\n\nValue* HIRBuilder::Extract(Value* value, Value* index, TypeName target_type) {\n  // TODO(benvanik): could do some of this as constants.\n\n  Value* trunc_index =\n      index->type != INT8_TYPE ? Truncate(index, INT8_TYPE) : index;\n\n  Instr* i = AppendInstr(OPCODE_EXTRACT_info, 0, AllocValue(target_type));\n  i->set_src1(value);\n  i->set_src2(trunc_index);\n  i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::Extract(Value* value, uint8_t index, TypeName target_type) {\n  return Extract(value, LoadConstantUint8(index), target_type);\n}\n\nValue* HIRBuilder::Splat(Value* value, TypeName target_type) {\n  // TODO(benvanik): could do some of this as constants.\n\n  Instr* i = AppendInstr(OPCODE_SPLAT_info, 0, AllocValue(target_type));\n  i->set_src1(value);\n  i->src2.value = i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::Permute(Value* control, Value* value1, Value* value2,\n                           TypeName part_type) {\n  ASSERT_TYPES_EQUAL(value1, value2);\n  assert_true(part_type >= INT8_TYPE && part_type <= INT32_TYPE);\n\n  // TODO(benvanik): could do some of this as constants.\n\n  Instr* i =\n      AppendInstr(OPCODE_PERMUTE_info, part_type, AllocValue(value1->type));\n  i->set_src1(control);\n  i->set_src2(value1);\n  i->set_src3(value2);\n  return i->dest;\n}\n\nValue* HIRBuilder::Swizzle(Value* value, TypeName part_type,\n                           uint32_t swizzle_mask) {\n  // For now.\n  assert_true(part_type == INT32_TYPE || part_type == FLOAT32_TYPE);\n\n  if (swizzle_mask == SWIZZLE_XYZW_TO_XYZW) {\n    return Assign(value);\n  }\n\n  // TODO(benvanik): could do some of this as constants.\n\n  Instr* i =\n      AppendInstr(OPCODE_SWIZZLE_info, part_type, AllocValue(value->type));\n  i->set_src1(value);\n  i->src2.offset = swizzle_mask;\n  i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::Pack(Value* value, uint32_t pack_flags) {\n  return Pack(value, LoadZeroVec128(), pack_flags);\n}\n\nValue* HIRBuilder::Pack(Value* value1, Value* value2, uint32_t pack_flags) {\n  ASSERT_VECTOR_TYPE(value1);\n  ASSERT_VECTOR_TYPE(value2);\n  switch (pack_flags & PACK_TYPE_MODE) {\n    case PACK_TYPE_D3DCOLOR:\n    case PACK_TYPE_FLOAT16_2:\n    case PACK_TYPE_FLOAT16_4:\n    case PACK_TYPE_SHORT_2:\n      assert_true(value2->IsConstantZero());\n      break;\n  }\n  Instr* i = AppendInstr(OPCODE_PACK_info, pack_flags, AllocValue(VEC128_TYPE));\n  i->set_src1(value1);\n  i->set_src2(value2);\n  i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::Unpack(Value* value, uint32_t pack_flags) {\n  ASSERT_VECTOR_TYPE(value);\n  // TODO(benvanik): check if this is a constant - sometimes this is just used\n  //     to initialize registers.\n  Instr* i =\n      AppendInstr(OPCODE_UNPACK_info, pack_flags, AllocValue(VEC128_TYPE));\n  i->set_src1(value);\n  i->src2.value = i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::AtomicExchange(Value* address, Value* new_value) {\n  ASSERT_ADDRESS_TYPE(address);\n  ASSERT_INTEGER_TYPE(new_value);\n  Instr* i =\n      AppendInstr(OPCODE_ATOMIC_EXCHANGE_info, 0, AllocValue(new_value->type));\n  i->set_src1(address);\n  i->set_src2(new_value);\n  i->src3.value = NULL;\n  return i->dest;\n}\n\nValue* HIRBuilder::AtomicCompareExchange(Value* address, Value* old_value,\n                                         Value* new_value) {\n  ASSERT_ADDRESS_TYPE(address);\n  Instr* i = AppendInstr(OPCODE_ATOMIC_COMPARE_EXCHANGE_info, 0,\n                         AllocValue(INT8_TYPE));\n  i->set_src1(address);\n  i->set_src2(old_value);\n  i->set_src3(new_value);\n  return i->dest;\n}\n\n}  // namespace hir\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/hir/hir_builder.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_HIR_HIR_BUILDER_H_\n#define XENIA_CPU_HIR_HIR_BUILDER_H_\n\n#include <vector>\n\n#include \"third_party/fmt/include/fmt/format.h\"\n#include \"xenia/base/arena.h\"\n#include \"xenia/base/string_buffer.h\"\n#include \"xenia/cpu/hir/block.h\"\n#include \"xenia/cpu/hir/instr.h\"\n#include \"xenia/cpu/hir/label.h\"\n#include \"xenia/cpu/hir/opcodes.h\"\n#include \"xenia/cpu/hir/value.h\"\n#include \"xenia/cpu/mmio_handler.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace hir {\n\nenum FunctionAttributes {\n  FUNCTION_ATTRIB_INLINE = (1 << 1),\n};\n\nclass HIRBuilder {\n public:\n  HIRBuilder();\n  virtual ~HIRBuilder();\n\n  virtual void Reset();\n  virtual bool Finalize();\n\n  void Dump(StringBuffer* str);\n  void AssertNoCycles();\n\n  Arena* arena() const { return arena_; }\n\n  uint32_t attributes() const { return attributes_; }\n  void set_attributes(uint32_t value) { attributes_ = value; }\n\n  std::vector<Value*>& locals() { return locals_; }\n\n  uint32_t max_value_ordinal() const { return next_value_ordinal_; }\n\n  Block* first_block() const { return block_head_; }\n  Block* last_block() const { return block_tail_; }\n  Block* current_block() const;\n  Instr* last_instr() const;\n\n  Label* NewLabel();\n  void MarkLabel(Label* label, Block* block = 0);\n  void InsertLabel(Label* label, Instr* prev_instr);\n  void ResetLabelTags();\n\n  void AddEdge(Block* src, Block* dest, uint32_t flags);\n  void RemoveEdge(Block* src, Block* dest);\n  void RemoveEdge(Edge* edge);\n  void RemoveBlock(Block* block);\n  void MergeAdjacentBlocks(Block* left, Block* right);\n\n  // static allocations:\n  // Value* AllocStatic(size_t length);\n\n  void Comment(const std::string_view value);\n  void Comment(const StringBuffer& value);\n\n  template <typename... Args>\n  void CommentFormat(const std::string_view format, const Args&... args) {\n    static const uint32_t kMaxCommentSize = 1024;\n    char* p = reinterpret_cast<char*>(arena_->Alloc(kMaxCommentSize, 1));\n    auto result = fmt::format_to_n(p, kMaxCommentSize - 1, format, args...);\n    p[result.size] = '\\0';\n    size_t rewind = kMaxCommentSize - 1 - result.size;\n    arena_->Rewind(rewind);\n    CommentBuffer(p);\n  }\n\n  void Nop();\n\n  void SourceOffset(uint32_t offset);\n\n  // trace info/etc\n  void DebugBreak();\n  void DebugBreakTrue(Value* cond);\n\n  void Trap(uint16_t trap_code = 0);\n  void TrapTrue(Value* cond, uint16_t trap_code = 0);\n\n  void Call(Function* symbol, uint16_t call_flags = 0);\n  void CallTrue(Value* cond, Function* symbol, uint16_t call_flags = 0);\n  void CallIndirect(Value* value, uint16_t call_flags = 0);\n  void CallIndirectTrue(Value* cond, Value* value, uint16_t call_flags = 0);\n  void CallExtern(Function* symbol);\n  void Return();\n  void ReturnTrue(Value* cond);\n  void SetReturnAddress(Value* value);\n\n  void Branch(Label* label, uint16_t branch_flags = 0);\n  void Branch(Block* block, uint16_t branch_flags = 0);\n  void BranchTrue(Value* cond, Label* label, uint16_t branch_flags = 0);\n  void BranchFalse(Value* cond, Label* label, uint16_t branch_flags = 0);\n\n  Value* AllocValue(TypeName type = INT64_TYPE);\n  Value* CloneValue(Value* source);\n\n  // phi type_name, Block* b1, Value* v1, Block* b2, Value* v2, etc\n  Value* Assign(Value* value);\n  Value* Cast(Value* value, TypeName target_type);\n  Value* ZeroExtend(Value* value, TypeName target_type);\n  Value* SignExtend(Value* value, TypeName target_type);\n  Value* Truncate(Value* value, TypeName target_type);\n  Value* Convert(Value* value, TypeName target_type,\n                 RoundMode round_mode = ROUND_TO_ZERO);\n  Value* Round(Value* value, RoundMode round_mode);\n  Value* VectorConvertI2F(Value* value, uint32_t arithmetic_flags = 0);\n  Value* VectorConvertF2I(Value* value, uint32_t arithmetic_flags = 0);\n\n  Value* LoadZero(TypeName type);\n  Value* LoadZeroInt8() { return LoadZero(INT8_TYPE); }\n  Value* LoadZeroInt16() { return LoadZero(INT16_TYPE); }\n  Value* LoadZeroInt32() { return LoadZero(INT32_TYPE); }\n  Value* LoadZeroInt64() { return LoadZero(INT64_TYPE); }\n  Value* LoadZeroFloat32() { return LoadZero(FLOAT32_TYPE); }\n  Value* LoadZeroFloat64() { return LoadZero(FLOAT64_TYPE); }\n  Value* LoadZeroVec128() { return LoadZero(VEC128_TYPE); }\n\n  Value* LoadConstantInt8(int8_t value);\n  Value* LoadConstantUint8(uint8_t value);\n  Value* LoadConstantInt16(int16_t value);\n  Value* LoadConstantUint16(uint16_t value);\n  Value* LoadConstantInt32(int32_t value);\n  Value* LoadConstantUint32(uint32_t value);\n  Value* LoadConstantInt64(int64_t value);\n  Value* LoadConstantUint64(uint64_t value);\n  Value* LoadConstantFloat32(float value);\n  Value* LoadConstantFloat64(double value);\n  Value* LoadConstantVec128(const vec128_t& value);\n\n  Value* LoadVectorShl(Value* sh);\n  Value* LoadVectorShr(Value* sh);\n\n  Value* LoadClock();\n\n  Value* AllocLocal(TypeName type);\n  Value* LoadLocal(Value* slot);\n  void StoreLocal(Value* slot, Value* value);\n\n  Value* LoadContext(size_t offset, TypeName type);\n  void StoreContext(size_t offset, Value* value);\n  void ContextBarrier();\n\n  Value* LoadMmio(cpu::MMIORange* mmio_range, uint32_t address, TypeName type);\n  void StoreMmio(cpu::MMIORange* mmio_range, uint32_t address, Value* value);\n\n  Value* LoadOffset(Value* address, Value* offset, TypeName type,\n                    uint32_t load_flags = 0);\n  void StoreOffset(Value* address, Value* offset, Value* value,\n                   uint32_t store_flags = 0);\n\n  Value* Load(Value* address, TypeName type, uint32_t load_flags = 0);\n  void Store(Value* address, Value* value, uint32_t store_flags = 0);\n  void Memset(Value* address, Value* value, Value* length);\n  void CacheControl(Value* address, size_t cache_line_size,\n                    CacheControlType type);\n  void MemoryBarrier();\n\n  void SetRoundingMode(Value* value);\n  Value* Max(Value* value1, Value* value2);\n  Value* VectorMax(Value* value1, Value* value2, TypeName part_type,\n                   uint32_t arithmetic_flags = 0);\n  Value* Min(Value* value1, Value* value2);\n  Value* VectorMin(Value* value1, Value* value2, TypeName part_type,\n                   uint32_t arithmetic_flags = 0);\n  Value* Select(Value* cond, Value* value1, Value* value2);\n  Value* IsTrue(Value* value);\n  Value* IsFalse(Value* value);\n  Value* IsNan(Value* value);\n  Value* CompareEQ(Value* value1, Value* value2);\n  Value* CompareNE(Value* value1, Value* value2);\n  Value* CompareSLT(Value* value1, Value* value2);\n  Value* CompareSLE(Value* value1, Value* value2);\n  Value* CompareSGT(Value* value1, Value* value2);\n  Value* CompareSGE(Value* value1, Value* value2);\n  Value* CompareULT(Value* value1, Value* value2);\n  Value* CompareULE(Value* value1, Value* value2);\n  Value* CompareUGT(Value* value1, Value* value2);\n  Value* CompareUGE(Value* value1, Value* value2);\n  Value* DidSaturate(Value* value);\n  Value* VectorCompareEQ(Value* value1, Value* value2, TypeName part_type);\n  Value* VectorCompareSGT(Value* value1, Value* value2, TypeName part_type);\n  Value* VectorCompareSGE(Value* value1, Value* value2, TypeName part_type);\n  Value* VectorCompareUGT(Value* value1, Value* value2, TypeName part_type);\n  Value* VectorCompareUGE(Value* value1, Value* value2, TypeName part_type);\n\n  Value* Add(Value* value1, Value* value2, uint32_t arithmetic_flags = 0);\n  Value* AddWithCarry(Value* value1, Value* value2, Value* value3,\n                      uint32_t arithmetic_flags = 0);\n  Value* VectorAdd(Value* value1, Value* value2, TypeName part_type,\n                   uint32_t arithmetic_flags = 0);\n  Value* Sub(Value* value1, Value* value2, uint32_t arithmetic_flags = 0);\n  Value* VectorSub(Value* value1, Value* value2, TypeName part_type,\n                   uint32_t arithmetic_flags = 0);\n  Value* Mul(Value* value1, Value* value2, uint32_t arithmetic_flags = 0);\n  Value* MulHi(Value* value1, Value* value2, uint32_t arithmetic_flags = 0);\n  Value* Div(Value* value1, Value* value2, uint32_t arithmetic_flags = 0);\n  Value* MulAdd(Value* value1, Value* value2, Value* value3);  // (1 * 2) + 3\n  Value* MulSub(Value* value1, Value* value2, Value* value3);  // (1 * 2) - 3\n  Value* Neg(Value* value);\n  Value* Abs(Value* value);\n  Value* Sqrt(Value* value);\n  Value* RSqrt(Value* value);\n  Value* Recip(Value* value);\n  Value* Pow2(Value* value);\n  Value* Log2(Value* value);\n  Value* DotProduct3(Value* value1, Value* value2);\n  Value* DotProduct4(Value* value1, Value* value2);\n\n  Value* And(Value* value1, Value* value2);\n  Value* AndNot(Value* value1, Value* value2);\n  Value* Or(Value* value1, Value* value2);\n  Value* Xor(Value* value1, Value* value2);\n  Value* Not(Value* value);\n  Value* Shl(Value* value1, Value* value2);\n  Value* Shl(Value* value1, int8_t value2);\n  Value* VectorShl(Value* value1, Value* value2, TypeName part_type);\n  Value* Shr(Value* value1, Value* value2);\n  Value* Shr(Value* value1, int8_t value2);\n  Value* VectorShr(Value* value1, Value* value2, TypeName part_type);\n  Value* Sha(Value* value1, Value* value2);\n  Value* Sha(Value* value1, int8_t value2);\n  Value* VectorSha(Value* value1, Value* value2, TypeName part_type);\n  Value* RotateLeft(Value* value1, Value* value2);\n  Value* VectorRotateLeft(Value* value1, Value* value2, TypeName part_type);\n  Value* VectorAverage(Value* value1, Value* value2, TypeName part_type,\n                       uint32_t arithmetic_flags);\n  Value* ByteSwap(Value* value);\n  Value* CountLeadingZeros(Value* value);\n  Value* Insert(Value* value, Value* index, Value* part);\n  Value* Insert(Value* value, uint64_t index, Value* part);\n  Value* Extract(Value* value, Value* index, TypeName target_type);\n  Value* Extract(Value* value, uint8_t index, TypeName target_type);\n  // i8->i16/i32/... (i8|i8 / i8|i8|i8|i8 / ...)\n  // i8/i16/i32 -> vec128\n  Value* Splat(Value* value, TypeName target_type);\n  Value* Permute(Value* control, Value* value1, Value* value2,\n                 TypeName part_type);\n  Value* Swizzle(Value* value, TypeName part_type, uint32_t swizzle_mask);\n  // SelectBits(cond, value1, value2)\n  Value* Pack(Value* value, uint32_t pack_flags = 0);\n  Value* Pack(Value* value1, Value* value2, uint32_t pack_flags = 0);\n  Value* Unpack(Value* value, uint32_t pack_flags = 0);\n\n  Value* AtomicExchange(Value* address, Value* new_value);\n  Value* AtomicCompareExchange(Value* address, Value* old_value,\n                               Value* new_value);\n  Value* AtomicAdd(Value* address, Value* value);\n  Value* AtomicSub(Value* address, Value* value);\n\n protected:\n  void DumpValue(StringBuffer* str, Value* value);\n  void DumpOp(StringBuffer* str, OpcodeSignatureType sig_type, Instr::Op* op);\n\n private:\n  Block* AppendBlock();\n  void EndBlock();\n  bool IsUnconditionalJump(Instr* instr);\n  Instr* AppendInstr(const OpcodeInfo& opcode, uint16_t flags, Value* dest = 0);\n  void CommentBuffer(const char* p);\n  Value* CompareXX(const OpcodeInfo& opcode, Value* value1, Value* value2);\n  Value* VectorCompareXX(const OpcodeInfo& opcode, Value* value1, Value* value2,\n                         TypeName part_type);\n\n protected:\n  Arena* arena_;\n\n  uint32_t attributes_;\n\n  uint32_t next_label_id_;\n  uint32_t next_value_ordinal_;\n\n  std::vector<Value*> locals_;\n\n  Block* block_head_;\n  Block* block_tail_;\n  Block* current_block_;\n};\n\n}  // namespace hir\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_HIR_HIR_BUILDER_H_\n"
  },
  {
    "path": "src/xenia/cpu/hir/instr.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/hir/instr.h\"\n\n#include \"xenia/cpu/hir/block.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace hir {\n\nvoid Instr::set_src1(Value* value) {\n  if (src1.value == value) {\n    return;\n  }\n  if (src1_use) {\n    src1.value->RemoveUse(src1_use);\n  }\n  src1.value = value;\n  src1_use = value ? value->AddUse(block->arena, this) : NULL;\n}\n\nvoid Instr::set_src2(Value* value) {\n  if (src2.value == value) {\n    return;\n  }\n  if (src2_use) {\n    src2.value->RemoveUse(src2_use);\n  }\n  src2.value = value;\n  src2_use = value ? value->AddUse(block->arena, this) : NULL;\n}\n\nvoid Instr::set_src3(Value* value) {\n  if (src3.value == value) {\n    return;\n  }\n  if (src3_use) {\n    src3.value->RemoveUse(src3_use);\n  }\n  src3.value = value;\n  src3_use = value ? value->AddUse(block->arena, this) : NULL;\n}\n\nvoid Instr::MoveBefore(Instr* other) {\n  if (next == other) {\n    return;\n  }\n\n  // Remove from current location.\n  if (prev) {\n    prev->next = next;\n  } else {\n    block->instr_head = next;\n  }\n  if (next) {\n    next->prev = prev;\n  } else {\n    block->instr_tail = prev;\n  }\n\n  // Insert into new location.\n  block = other->block;\n  next = other;\n  prev = other->prev;\n  other->prev = this;\n  if (prev) {\n    prev->next = this;\n  }\n  if (other == block->instr_head) {\n    block->instr_head = this;\n  }\n}\n\nvoid Instr::Replace(const OpcodeInfo* new_opcode, uint16_t new_flags) {\n  opcode = new_opcode;\n  flags = new_flags;\n\n  if (src1_use) {\n    src1.value->RemoveUse(src1_use);\n    src1.value = NULL;\n    src1_use = NULL;\n  }\n  if (src2_use) {\n    src2.value->RemoveUse(src2_use);\n    src2.value = NULL;\n    src2_use = NULL;\n  }\n  if (src3_use) {\n    src3.value->RemoveUse(src3_use);\n    src3.value = NULL;\n    src3_use = NULL;\n  }\n}\n\nvoid Instr::Remove() {\n  // Remove all srcs/dest.\n  Replace(&OPCODE_NOP_info, 0);\n\n  if (prev) {\n    prev->next = next;\n  } else {\n    block->instr_head = next;\n  }\n  if (next) {\n    next->prev = prev;\n  } else {\n    block->instr_tail = prev;\n  }\n}\n\n}  // namespace hir\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/hir/instr.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_HIR_INSTR_H_\n#define XENIA_CPU_HIR_INSTR_H_\n\n#include \"xenia/cpu/hir/opcodes.h\"\n#include \"xenia/cpu/hir/value.h\"\n\nnamespace xe {\nnamespace cpu {\nclass Function;\n}  // namespace cpu\n}  // namespace xe\n\nnamespace xe {\nnamespace cpu {\nnamespace hir {\n\nclass Block;\nclass Label;\n\nclass Instr {\n public:\n  Block* block;\n  Instr* next;\n  Instr* prev;\n\n  const OpcodeInfo* opcode;\n  uint16_t flags;\n  uint32_t ordinal;\n\n  typedef union {\n    Function* symbol;\n    Label* label;\n    Value* value;\n    uint64_t offset;\n  } Op;\n\n  Value* dest;\n  Op src1;\n  Op src2;\n  Op src3;\n\n  Value::Use* src1_use;\n  Value::Use* src2_use;\n  Value::Use* src3_use;\n\n  void set_src1(Value* value);\n  void set_src2(Value* value);\n  void set_src3(Value* value);\n\n  void MoveBefore(Instr* other);\n  void Replace(const OpcodeInfo* new_opcode, uint16_t new_flags);\n  void Remove();\n};\n\n}  // namespace hir\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_HIR_INSTR_H_\n"
  },
  {
    "path": "src/xenia/cpu/hir/label.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_HIR_LABEL_H_\n#define XENIA_CPU_HIR_LABEL_H_\n\nnamespace xe {\nnamespace cpu {\nnamespace hir {\n\nclass Block;\n\nclass Label {\n public:\n  Block* block;\n  Label* next;\n  Label* prev;\n\n  uint32_t id;\n  char* name;\n\n  void* tag;\n};\n\n}  // namespace hir\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_HIR_LABEL_H_\n"
  },
  {
    "path": "src/xenia/cpu/hir/opcodes.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/hir/opcodes.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace hir {\n\n#define DEFINE_OPCODE(num, name, sig, flags) \\\n  const OpcodeInfo num##_info = {            \\\n      flags,                                 \\\n      sig,                                   \\\n      name,                                  \\\n      num,                                   \\\n  };\n#include \"xenia/cpu/hir/opcodes.inl\"\n#undef DEFINE_OPCODE\n\n}  // namespace hir\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/hir/opcodes.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_HIR_OPCODES_H_\n#define XENIA_CPU_HIR_OPCODES_H_\n\n#include <cstdint>\n\nnamespace xe {\nnamespace cpu {\nnamespace hir {\n\nenum CallFlags {\n  CALL_TAIL = (1 << 1),\n  CALL_POSSIBLE_RETURN = (1 << 2),\n};\n\nenum BranchFlags {\n  BRANCH_LIKELY = (1 << 1),\n  BRANCH_UNLIKELY = (1 << 2),\n};\n\nenum RoundMode {\n  // to zero/nearest/etc\n  ROUND_TO_ZERO = 0,\n  ROUND_TO_NEAREST,\n  ROUND_TO_MINUS_INFINITY,\n  ROUND_TO_POSITIVE_INFINITY,\n  ROUND_DYNAMIC,  // Round based on the host's rounding mode.\n};\n\nenum LoadStoreFlags {\n  LOAD_STORE_BYTE_SWAP = 1 << 0,\n};\n\nenum CacheControlType {\n  CACHE_CONTROL_TYPE_DATA_TOUCH,\n  CACHE_CONTROL_TYPE_DATA_TOUCH_FOR_STORE,\n  CACHE_CONTROL_TYPE_DATA_STORE,\n  CACHE_CONTROL_TYPE_DATA_STORE_AND_FLUSH,\n};\n\nenum ArithmeticFlags {\n  ARITHMETIC_UNSIGNED = (1 << 2),\n  ARITHMETIC_SATURATE = (1 << 3),\n};\n\nconstexpr uint32_t MakePermuteMask(uint32_t sel_x, uint32_t x, uint32_t sel_y,\n                                   uint32_t y, uint32_t sel_z, uint32_t z,\n                                   uint32_t sel_w, uint32_t w) {\n  return ((x & 0x3) << 0) | (sel_x << 2) | ((y & 0x3) << 8) | (sel_y << 10) |\n         ((z & 0x3) << 16) | (sel_z << 18) | ((w & 0x3) << 24) | (sel_w << 26);\n}\n\nenum PermuteMasks : uint32_t {\n  kIdentityPermuteMask = MakePermuteMask(0, 0, 0, 1, 0, 2, 0, 3),\n};\n\nconstexpr uint32_t MakeSwizzleMask(uint32_t x, uint32_t y, uint32_t z,\n                                   uint32_t w) {\n  return ((x & 0x3) << 0) | ((y & 0x3) << 2) | ((z & 0x3) << 4) |\n         ((w & 0x3) << 6);\n}\n\nenum Swizzles {\n  SWIZZLE_XYZW_TO_XYZW = MakeSwizzleMask(0, 1, 2, 3),\n  SWIZZLE_XYZW_TO_YZWX = MakeSwizzleMask(1, 2, 3, 0),\n  SWIZZLE_XYZW_TO_ZWXY = MakeSwizzleMask(2, 3, 0, 1),\n  SWIZZLE_XYZW_TO_WXYZ = MakeSwizzleMask(3, 0, 1, 2),\n};\n\nenum PackType : uint16_t {\n  // Special types:\n  PACK_TYPE_D3DCOLOR = 0,\n  PACK_TYPE_FLOAT16_2 = 1,\n  PACK_TYPE_SHORT_4 = 2,\n  PACK_TYPE_FLOAT16_4 = 3,\n  PACK_TYPE_SHORT_2 = 4,\n  PACK_TYPE_UINT_2101010 = 5,\n  PACK_TYPE_ULONG_4202020 = 6,\n\n  // Types which use the bitmasks below for configuration:\n  PACK_TYPE_8_IN_16 = 7,\n  PACK_TYPE_16_IN_32 = 8,\n\n  PACK_TYPE_MODE = 0x000F,  // just to get the mode\n                            // Unpack to low or high parts.\n  PACK_TYPE_TO_LO = 0 << 12,\n  PACK_TYPE_TO_HI = 1 << 12,\n\n  // Input/output arithmetic flags:\n  PACK_TYPE_IN_SIGNED = 0 << 13,\n  PACK_TYPE_IN_UNSIGNED = 1 << 13,\n  PACK_TYPE_OUT_SIGNED = 0 << 14,\n  PACK_TYPE_OUT_UNSIGNED = 1 << 14,\n  PACK_TYPE_OUT_UNSATURATE = 0 << 15,\n  PACK_TYPE_OUT_SATURATE = 1 << 15,\n};\n\ninline bool IsPackToHi(uint32_t flags) {\n  return (flags & PACK_TYPE_TO_HI) == PACK_TYPE_TO_HI;\n}\ninline bool IsPackToLo(uint32_t flags) { return !IsPackToHi(flags); }\ninline bool IsPackInUnsigned(uint32_t flags) {\n  return (flags & PACK_TYPE_IN_UNSIGNED) == PACK_TYPE_IN_UNSIGNED;\n}\ninline bool IsPackOutUnsigned(uint32_t flags) {\n  return (flags & PACK_TYPE_OUT_UNSIGNED) == PACK_TYPE_OUT_UNSIGNED;\n}\ninline bool IsPackOutSaturate(uint32_t flags) {\n  return (flags & PACK_TYPE_OUT_SATURATE) == PACK_TYPE_OUT_SATURATE;\n}\n\nenum Opcode {\n  OPCODE_COMMENT,\n  OPCODE_NOP,\n  OPCODE_SOURCE_OFFSET,\n  OPCODE_DEBUG_BREAK,\n  OPCODE_DEBUG_BREAK_TRUE,\n  OPCODE_TRAP,\n  OPCODE_TRAP_TRUE,\n  OPCODE_CALL,\n  OPCODE_CALL_TRUE,\n  OPCODE_CALL_INDIRECT,\n  OPCODE_CALL_INDIRECT_TRUE,\n  OPCODE_CALL_EXTERN,\n  OPCODE_RETURN,\n  OPCODE_RETURN_TRUE,\n  OPCODE_SET_RETURN_ADDRESS,\n  OPCODE_BRANCH,\n  OPCODE_BRANCH_TRUE,\n  OPCODE_BRANCH_FALSE,\n  OPCODE_ASSIGN,\n  OPCODE_CAST,\n  OPCODE_ZERO_EXTEND,\n  OPCODE_SIGN_EXTEND,\n  OPCODE_TRUNCATE,\n  OPCODE_CONVERT,\n  OPCODE_ROUND,\n  // Note that 2147483648.0 + (src & 0x7FFFFFFF) is not a correct way of\n  // performing the uint -> float conversion for large numbers on backends where\n  // only sint -> float is available.\n  //\n  // Take 0b11000000000000000000000101000001 as an example,\n  // or 1.1000000000000000000000101000001 * 2^31.\n  // This one has 31 mantissa bits (excluding the implicit 1.), and needs to be\n  // rounded to 23 bits - 8 mantissa bits need to be dropped:\n  // 10000000000000000000001_01000001\n  //\n  // Rounding to the nearest even (the only rounding mode that exists on\n  // AltiVec, and the likely rounding mode in the implementations) should be\n  // done downwards - 01000001 of 1_01000001 is in [00000000, 01111111].\n  // The correct mantissa in this case is:\n  // 1.10000000000000000000001 * 2^31.\n  //\n  // With a two-step conversion, rounding is done twice instead, which gives an\n  // incorrect result.\n  //\n  // First, converting the low 31 bits to float:\n  // The number is 0.1000000000000000000000101000001 * 2^31.\n  // Normalizing it, we get 1.000000000000000000000101000001 (30 significand\n  // bits).\n  // We need to round 30 bits to 23 - 7 bits need to be dropped:\n  // 00000000000000000000010_1000001\n  //\n  // Rounding to the nearest even is done upwards in this case - 1000001 of\n  // 0_1000001 is in [1000001, 1111111].\n  // The result of the sint -> float conversion is:\n  // 1.00000000000000000000011 * 2^30.\n  //\n  // Now 2147483648.0 (1 * 2^31) needs to be added. Aligning the exponents, we\n  // get:\n  //   0.|10000000000000000000001|1 * 2^31\n  // + 1.|00000000000000000000000|  * 2^31\n  // = 1.|10000000000000000000001|1 * 2^31\n  //\n  // At \"infinite precision\", the result has 24 significand bits, but only 23\n  // can be stored, thus rounding to the nearest even needs to be done. 1_1 is\n  // (odd + 0.5). 0.5 is ambiguous, thus tie-breaking to the nearest even -\n  // which is above in this case - is done. The result is:\n  // 1.10000000000000000000010 * 2^31.\n  //\n  // This is incorrect - larger than the correctly rounded result, which is:\n  // 1.10000000000000000000001 * 2^31.\n  //\n  // Test cases checked on real hardware via vcfux: 0xFFFDFF7E, 0xFFFCFF7D -\n  // should be 0x4F7FFDFF and 0x4F7FFCFF respectively, not 0x4F7FFE00 and\n  // 0x4F7FFD00.\n  OPCODE_VECTOR_CONVERT_I2F,\n  OPCODE_VECTOR_CONVERT_F2I,\n  OPCODE_LOAD_VECTOR_SHL,\n  OPCODE_LOAD_VECTOR_SHR,\n  OPCODE_LOAD_CLOCK,\n  OPCODE_LOAD_LOCAL,\n  OPCODE_STORE_LOCAL,\n  OPCODE_LOAD_CONTEXT,\n  OPCODE_STORE_CONTEXT,\n  OPCODE_CONTEXT_BARRIER,\n  OPCODE_LOAD_MMIO,\n  OPCODE_STORE_MMIO,\n  OPCODE_LOAD_OFFSET,\n  OPCODE_STORE_OFFSET,\n  OPCODE_LOAD,\n  OPCODE_STORE,\n  OPCODE_MEMSET,\n  OPCODE_CACHE_CONTROL,\n  OPCODE_MEMORY_BARRIER,\n  OPCODE_MAX,\n  OPCODE_VECTOR_MAX,\n  OPCODE_MIN,\n  OPCODE_VECTOR_MIN,\n  OPCODE_SELECT,\n  OPCODE_IS_TRUE,\n  OPCODE_IS_FALSE,\n  OPCODE_IS_NAN,\n  OPCODE_COMPARE_EQ,\n  OPCODE_COMPARE_NE,\n  OPCODE_COMPARE_SLT,\n  OPCODE_COMPARE_SLE,\n  OPCODE_COMPARE_SGT,\n  OPCODE_COMPARE_SGE,\n  OPCODE_COMPARE_ULT,\n  OPCODE_COMPARE_ULE,\n  OPCODE_COMPARE_UGT,\n  OPCODE_COMPARE_UGE,\n  OPCODE_DID_SATURATE,\n  OPCODE_VECTOR_COMPARE_EQ,\n  OPCODE_VECTOR_COMPARE_SGT,\n  OPCODE_VECTOR_COMPARE_SGE,\n  OPCODE_VECTOR_COMPARE_UGT,\n  OPCODE_VECTOR_COMPARE_UGE,\n  OPCODE_ADD,\n  OPCODE_ADD_CARRY,\n  OPCODE_VECTOR_ADD,\n  OPCODE_SUB,\n  OPCODE_VECTOR_SUB,\n  OPCODE_MUL,\n  OPCODE_MUL_HI,  // TODO(benvanik): remove this and add INT128 type.\n  OPCODE_DIV,\n  OPCODE_MUL_ADD,\n  OPCODE_MUL_SUB,\n  OPCODE_NEG,\n  OPCODE_ABS,\n  OPCODE_SQRT,\n  OPCODE_RSQRT,\n  OPCODE_RECIP,\n  OPCODE_POW2,\n  OPCODE_LOG2,\n  OPCODE_DOT_PRODUCT_3,\n  OPCODE_DOT_PRODUCT_4,\n  OPCODE_AND,\n  OPCODE_AND_NOT,\n  OPCODE_OR,\n  OPCODE_XOR,\n  OPCODE_NOT,\n  OPCODE_SHL,\n  OPCODE_VECTOR_SHL,\n  OPCODE_SHR,\n  OPCODE_VECTOR_SHR,\n  OPCODE_SHA,\n  OPCODE_VECTOR_SHA,\n  OPCODE_ROTATE_LEFT,\n  OPCODE_VECTOR_ROTATE_LEFT,\n  OPCODE_VECTOR_AVERAGE,\n  OPCODE_BYTE_SWAP,\n  OPCODE_CNTLZ,\n  OPCODE_INSERT,\n  OPCODE_EXTRACT,\n  OPCODE_SPLAT,\n  OPCODE_PERMUTE,\n  OPCODE_SWIZZLE,\n  OPCODE_PACK,\n  OPCODE_UNPACK,\n  OPCODE_ATOMIC_EXCHANGE,\n  OPCODE_ATOMIC_COMPARE_EXCHANGE,\n  OPCODE_SET_ROUNDING_MODE,\n  __OPCODE_MAX_VALUE,  // Keep at end.\n};\n\nenum OpcodeFlags {\n  OPCODE_FLAG_BRANCH = (1 << 1),\n  OPCODE_FLAG_MEMORY = (1 << 2),\n  OPCODE_FLAG_COMMUNATIVE = (1 << 3),\n  OPCODE_FLAG_VOLATILE = (1 << 4),\n  OPCODE_FLAG_IGNORE = (1 << 5),\n  OPCODE_FLAG_HIDE = (1 << 6),\n  OPCODE_FLAG_PAIRED_PREV = (1 << 7),\n};\n\nenum OpcodeSignatureType {\n  // 3 bits max (0-7)\n  OPCODE_SIG_TYPE_X = 0,\n  OPCODE_SIG_TYPE_L = 1,\n  OPCODE_SIG_TYPE_O = 2,\n  OPCODE_SIG_TYPE_S = 3,\n  OPCODE_SIG_TYPE_V = 4,\n};\n\nenum OpcodeSignature {\n  OPCODE_SIG_X = (OPCODE_SIG_TYPE_X),\n  OPCODE_SIG_X_L = (OPCODE_SIG_TYPE_X) | (OPCODE_SIG_TYPE_L << 3),\n  OPCODE_SIG_X_O = (OPCODE_SIG_TYPE_X) | (OPCODE_SIG_TYPE_O << 3),\n  OPCODE_SIG_X_O_V =\n      (OPCODE_SIG_TYPE_X) | (OPCODE_SIG_TYPE_O << 3) | (OPCODE_SIG_TYPE_V << 6),\n  OPCODE_SIG_X_O_V_V = (OPCODE_SIG_TYPE_X) | (OPCODE_SIG_TYPE_O << 3) |\n                       (OPCODE_SIG_TYPE_V << 6) | (OPCODE_SIG_TYPE_V << 9),\n  OPCODE_SIG_X_O_O_V = (OPCODE_SIG_TYPE_X) | (OPCODE_SIG_TYPE_O << 3) |\n                       (OPCODE_SIG_TYPE_O << 6) | (OPCODE_SIG_TYPE_V << 9),\n  OPCODE_SIG_X_S = (OPCODE_SIG_TYPE_X) | (OPCODE_SIG_TYPE_S << 3),\n  OPCODE_SIG_X_V = (OPCODE_SIG_TYPE_X) | (OPCODE_SIG_TYPE_V << 3),\n  OPCODE_SIG_X_V_L =\n      (OPCODE_SIG_TYPE_X) | (OPCODE_SIG_TYPE_V << 3) | (OPCODE_SIG_TYPE_L << 6),\n  OPCODE_SIG_X_V_L_L = (OPCODE_SIG_TYPE_X) | (OPCODE_SIG_TYPE_V << 3) |\n                       (OPCODE_SIG_TYPE_L << 6) | (OPCODE_SIG_TYPE_L << 9),\n  OPCODE_SIG_X_V_O =\n      (OPCODE_SIG_TYPE_X) | (OPCODE_SIG_TYPE_V << 3) | (OPCODE_SIG_TYPE_O << 6),\n  OPCODE_SIG_X_V_S =\n      (OPCODE_SIG_TYPE_X) | (OPCODE_SIG_TYPE_V << 3) | (OPCODE_SIG_TYPE_S << 6),\n  OPCODE_SIG_X_V_V =\n      (OPCODE_SIG_TYPE_X) | (OPCODE_SIG_TYPE_V << 3) | (OPCODE_SIG_TYPE_V << 6),\n  OPCODE_SIG_X_V_V_V = (OPCODE_SIG_TYPE_X) | (OPCODE_SIG_TYPE_V << 3) |\n                       (OPCODE_SIG_TYPE_V << 6) | (OPCODE_SIG_TYPE_V << 9),\n  OPCODE_SIG_V = (OPCODE_SIG_TYPE_V),\n  OPCODE_SIG_V_O = (OPCODE_SIG_TYPE_V) | (OPCODE_SIG_TYPE_O << 3),\n  OPCODE_SIG_V_V = (OPCODE_SIG_TYPE_V) | (OPCODE_SIG_TYPE_V << 3),\n  OPCODE_SIG_V_O_O =\n      (OPCODE_SIG_TYPE_V) | (OPCODE_SIG_TYPE_O << 3) | (OPCODE_SIG_TYPE_O << 6),\n  OPCODE_SIG_V_V_O =\n      (OPCODE_SIG_TYPE_V) | (OPCODE_SIG_TYPE_V << 3) | (OPCODE_SIG_TYPE_O << 6),\n  OPCODE_SIG_V_V_O_V = (OPCODE_SIG_TYPE_V) | (OPCODE_SIG_TYPE_V << 3) |\n                       (OPCODE_SIG_TYPE_O << 6) | (OPCODE_SIG_TYPE_V << 9),\n  OPCODE_SIG_V_V_V =\n      (OPCODE_SIG_TYPE_V) | (OPCODE_SIG_TYPE_V << 3) | (OPCODE_SIG_TYPE_V << 6),\n  OPCODE_SIG_V_V_V_O = (OPCODE_SIG_TYPE_V) | (OPCODE_SIG_TYPE_V << 3) |\n                       (OPCODE_SIG_TYPE_V << 6) | (OPCODE_SIG_TYPE_O << 9),\n  OPCODE_SIG_V_V_V_V = (OPCODE_SIG_TYPE_V) | (OPCODE_SIG_TYPE_V << 3) |\n                       (OPCODE_SIG_TYPE_V << 6) | (OPCODE_SIG_TYPE_V << 9),\n};\n\n#define GET_OPCODE_SIG_TYPE_DEST(sig) (OpcodeSignatureType)(sig & 0x7)\n#define GET_OPCODE_SIG_TYPE_SRC1(sig) (OpcodeSignatureType)((sig >> 3) & 0x7)\n#define GET_OPCODE_SIG_TYPE_SRC2(sig) (OpcodeSignatureType)((sig >> 6) & 0x7)\n#define GET_OPCODE_SIG_TYPE_SRC3(sig) (OpcodeSignatureType)((sig >> 9) & 0x7)\n\ntypedef struct {\n  uint32_t flags;\n  uint32_t signature;\n  const char* name;\n  Opcode num;\n} OpcodeInfo;\n\n#define DEFINE_OPCODE(num, name, sig, flags) extern const OpcodeInfo num##_info;\n#include \"xenia/cpu/hir/opcodes.inl\"\n#undef DEFINE_OPCODE\n\n}  // namespace hir\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_HIR_OPCODES_H_\n"
  },
  {
    "path": "src/xenia/cpu/hir/opcodes.inl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n// clang-format off\n\nDEFINE_OPCODE(\n    OPCODE_COMMENT,\n    \"comment\",\n    OPCODE_SIG_X_O,\n    OPCODE_FLAG_IGNORE)\n\nDEFINE_OPCODE(\n    OPCODE_NOP,\n    \"nop\",\n    OPCODE_SIG_X,\n    OPCODE_FLAG_IGNORE)\n\nDEFINE_OPCODE(\n    OPCODE_SOURCE_OFFSET,\n    \"source_offset\",\n    OPCODE_SIG_X_O,\n    OPCODE_FLAG_IGNORE | OPCODE_FLAG_HIDE)\n\nDEFINE_OPCODE(\n    OPCODE_DEBUG_BREAK,\n    \"debug_break\",\n    OPCODE_SIG_X,\n    OPCODE_FLAG_VOLATILE)\n\nDEFINE_OPCODE(\n    OPCODE_DEBUG_BREAK_TRUE,\n    \"debug_break_true\",\n    OPCODE_SIG_X_V,\n    OPCODE_FLAG_VOLATILE)\n\nDEFINE_OPCODE(\n    OPCODE_TRAP,\n    \"trap\",\n    OPCODE_SIG_X,\n    OPCODE_FLAG_VOLATILE)\n\nDEFINE_OPCODE(\n    OPCODE_TRAP_TRUE,\n    \"trap_true\",\n    OPCODE_SIG_X_V,\n    OPCODE_FLAG_VOLATILE)\n\nDEFINE_OPCODE(\n    OPCODE_CALL,\n    \"call\",\n    OPCODE_SIG_X_S,\n    OPCODE_FLAG_BRANCH | OPCODE_FLAG_VOLATILE)\n\nDEFINE_OPCODE(\n    OPCODE_CALL_TRUE,\n    \"call_true\",\n    OPCODE_SIG_X_V_S,\n    OPCODE_FLAG_BRANCH | OPCODE_FLAG_VOLATILE)\n\nDEFINE_OPCODE(\n    OPCODE_CALL_INDIRECT,\n    \"call_indirect\",\n    OPCODE_SIG_X_V,\n    OPCODE_FLAG_BRANCH | OPCODE_FLAG_VOLATILE)\n\nDEFINE_OPCODE(\n    OPCODE_CALL_INDIRECT_TRUE,\n    \"call_indirect_true\",\n    OPCODE_SIG_X_V_V,\n    OPCODE_FLAG_BRANCH | OPCODE_FLAG_VOLATILE)\n\nDEFINE_OPCODE(\n    OPCODE_CALL_EXTERN,\n    \"call_extern\",\n    OPCODE_SIG_X_S,\n    OPCODE_FLAG_BRANCH | OPCODE_FLAG_VOLATILE)\n\nDEFINE_OPCODE(\n    OPCODE_RETURN,\n    \"return\",\n    OPCODE_SIG_X,\n    OPCODE_FLAG_BRANCH | OPCODE_FLAG_VOLATILE)\n\nDEFINE_OPCODE(\n    OPCODE_RETURN_TRUE,\n    \"return_true\",\n    OPCODE_SIG_X_V,\n    OPCODE_FLAG_BRANCH | OPCODE_FLAG_VOLATILE)\n\nDEFINE_OPCODE(\n    OPCODE_SET_RETURN_ADDRESS,\n    \"set_return_address\",\n    OPCODE_SIG_X_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_BRANCH,\n    \"branch\",\n    OPCODE_SIG_X_L,\n    OPCODE_FLAG_BRANCH)\n\nDEFINE_OPCODE(\n    OPCODE_BRANCH_TRUE,\n    \"branch_true\",\n    OPCODE_SIG_X_V_L,\n    OPCODE_FLAG_BRANCH | OPCODE_FLAG_VOLATILE)\n\nDEFINE_OPCODE(\n    OPCODE_BRANCH_FALSE,\n    \"branch_false\",\n    OPCODE_SIG_X_V_L,\n    OPCODE_FLAG_BRANCH | OPCODE_FLAG_VOLATILE)\n\nDEFINE_OPCODE(\n    OPCODE_ASSIGN,\n    \"assign\",\n    OPCODE_SIG_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_CAST,\n    \"cast\",\n    OPCODE_SIG_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_ZERO_EXTEND,\n    \"zero_extend\",\n    OPCODE_SIG_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_SIGN_EXTEND,\n    \"sign_extend\",\n    OPCODE_SIG_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_TRUNCATE,\n    \"truncate\",\n    OPCODE_SIG_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_CONVERT,\n    \"convert\",\n    OPCODE_SIG_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_ROUND,\n    \"round\",\n    OPCODE_SIG_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_VECTOR_CONVERT_I2F,\n    \"vector_convert_i2f\",\n    OPCODE_SIG_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_VECTOR_CONVERT_F2I,\n    \"vector_convert_f2i\",\n    OPCODE_SIG_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_LOAD_VECTOR_SHL,\n    \"load_vector_shl\",\n    OPCODE_SIG_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_LOAD_VECTOR_SHR,\n    \"load_vector_shr\",\n    OPCODE_SIG_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_LOAD_CLOCK,\n    \"load_clock\",\n    OPCODE_SIG_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_LOAD_LOCAL,\n    \"load_local\",\n    OPCODE_SIG_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_STORE_LOCAL,\n    \"store_local\",\n    OPCODE_SIG_X_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_LOAD_CONTEXT,\n    \"load_context\",\n    OPCODE_SIG_V_O,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_STORE_CONTEXT,\n    \"store_context\",\n    OPCODE_SIG_X_O_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_CONTEXT_BARRIER,\n    \"context_barrier\",\n    OPCODE_SIG_X,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_LOAD_MMIO,\n    \"load_mmio\",\n    OPCODE_SIG_V_O_O,\n    OPCODE_FLAG_MEMORY)\n\nDEFINE_OPCODE(\n    OPCODE_STORE_MMIO,\n    \"store_mmio\",\n    OPCODE_SIG_X_O_O_V,\n    OPCODE_FLAG_MEMORY)\n\nDEFINE_OPCODE(\n    OPCODE_LOAD_OFFSET,\n    \"load_offset\",\n    OPCODE_SIG_V_V_V,\n    OPCODE_FLAG_MEMORY)\n\nDEFINE_OPCODE(\n    OPCODE_STORE_OFFSET,\n    \"store_offset\",\n    OPCODE_SIG_X_V_V_V,\n    OPCODE_FLAG_MEMORY)\n\nDEFINE_OPCODE(\n    OPCODE_LOAD,\n    \"load\",\n    OPCODE_SIG_V_V,\n    OPCODE_FLAG_MEMORY)\n\nDEFINE_OPCODE(\n    OPCODE_STORE,\n    \"store\",\n    OPCODE_SIG_X_V_V,\n    OPCODE_FLAG_MEMORY)\n\nDEFINE_OPCODE(\n    OPCODE_MEMSET,\n    \"memset\",\n    OPCODE_SIG_X_V_V_V,\n    OPCODE_FLAG_MEMORY)\n\nDEFINE_OPCODE(\n    OPCODE_CACHE_CONTROL,\n    \"cache_control\",\n    OPCODE_SIG_X_V_O,\n    OPCODE_FLAG_MEMORY)\n\nDEFINE_OPCODE(\n    OPCODE_MEMORY_BARRIER,\n    \"memory_barrier\",\n    OPCODE_SIG_X,\n    OPCODE_FLAG_MEMORY | OPCODE_FLAG_VOLATILE)\n\nDEFINE_OPCODE(\n    OPCODE_MAX,\n    \"max\",\n    OPCODE_SIG_V_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_VECTOR_MAX,\n    \"vector_max\",\n    OPCODE_SIG_V_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_MIN,\n    \"min\",\n    OPCODE_SIG_V_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_VECTOR_MIN,\n    \"vector_min\",\n    OPCODE_SIG_V_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_SELECT,\n    \"select\",\n    OPCODE_SIG_V_V_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_IS_TRUE,\n    \"is_true\",\n    OPCODE_SIG_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_IS_FALSE,\n    \"is_false\",\n    OPCODE_SIG_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_IS_NAN,\n    \"is_nan\",\n    OPCODE_SIG_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_COMPARE_EQ,\n    \"compare_eq\",\n    OPCODE_SIG_V_V_V,\n    OPCODE_FLAG_COMMUNATIVE)\nDEFINE_OPCODE(\n    OPCODE_COMPARE_NE,\n    \"compare_ne\",\n    OPCODE_SIG_V_V_V,\n    OPCODE_FLAG_COMMUNATIVE)\nDEFINE_OPCODE(\n    OPCODE_COMPARE_SLT,\n    \"compare_slt\",\n    OPCODE_SIG_V_V_V,\n    0)\nDEFINE_OPCODE(\n    OPCODE_COMPARE_SLE,\n    \"compare_sle\",\n    OPCODE_SIG_V_V_V,\n    0)\nDEFINE_OPCODE(\n    OPCODE_COMPARE_SGT,\n    \"compare_sgt\",\n    OPCODE_SIG_V_V_V,\n    0)\nDEFINE_OPCODE(\n    OPCODE_COMPARE_SGE,\n    \"compare_sge\",\n    OPCODE_SIG_V_V_V,\n    0)\nDEFINE_OPCODE(\n    OPCODE_COMPARE_ULT,\n    \"compare_ult\",\n    OPCODE_SIG_V_V_V,\n    0)\nDEFINE_OPCODE(\n    OPCODE_COMPARE_ULE,\n    \"compare_ule\",\n    OPCODE_SIG_V_V_V,\n    0)\nDEFINE_OPCODE(\n    OPCODE_COMPARE_UGT,\n    \"compare_ugt\",\n    OPCODE_SIG_V_V_V,\n    0)\nDEFINE_OPCODE(\n    OPCODE_COMPARE_UGE,\n    \"compare_uge\",\n    OPCODE_SIG_V_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_DID_SATURATE,\n    \"did_saturate\",\n    OPCODE_SIG_V_V,\n    OPCODE_FLAG_PAIRED_PREV)\n\nDEFINE_OPCODE(\n    OPCODE_VECTOR_COMPARE_EQ,\n    \"vector_compare_eq\",\n    OPCODE_SIG_V_V_V,\n    OPCODE_FLAG_COMMUNATIVE)\nDEFINE_OPCODE(\n    OPCODE_VECTOR_COMPARE_SGT,\n    \"vector_compare_sgt\",\n    OPCODE_SIG_V_V_V,\n    0)\nDEFINE_OPCODE(\n    OPCODE_VECTOR_COMPARE_SGE,\n    \"vector_compare_sge\",\n    OPCODE_SIG_V_V_V,\n    0)\nDEFINE_OPCODE(\n    OPCODE_VECTOR_COMPARE_UGT,\n    \"vector_compare_ugt\",\n    OPCODE_SIG_V_V_V,\n    0)\nDEFINE_OPCODE(\n    OPCODE_VECTOR_COMPARE_UGE,\n    \"vector_compare_uge\",\n    OPCODE_SIG_V_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_ADD,\n    \"add\",\n    OPCODE_SIG_V_V_V,\n    OPCODE_FLAG_COMMUNATIVE)\n\nDEFINE_OPCODE(\n    OPCODE_ADD_CARRY,\n    \"add_carry\",\n    OPCODE_SIG_V_V_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_VECTOR_ADD,\n    \"vector_add\",\n    OPCODE_SIG_V_V_V,\n    OPCODE_FLAG_COMMUNATIVE)\n\nDEFINE_OPCODE(\n    OPCODE_SUB,\n    \"sub\",\n    OPCODE_SIG_V_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_VECTOR_SUB,\n    \"vector_sub\",\n    OPCODE_SIG_V_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_MUL,\n    \"mul\",\n    OPCODE_SIG_V_V_V,\n    OPCODE_FLAG_COMMUNATIVE)\n\nDEFINE_OPCODE(\n    OPCODE_MUL_HI,\n    \"mul_hi\",\n    OPCODE_SIG_V_V_V,\n    OPCODE_FLAG_COMMUNATIVE)\n\nDEFINE_OPCODE(\n    OPCODE_DIV,\n    \"div\",\n    OPCODE_SIG_V_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_MUL_ADD,\n    \"mul_add\",\n    OPCODE_SIG_V_V_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_MUL_SUB,\n    \"mul_sub\",\n    OPCODE_SIG_V_V_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_NEG,\n    \"neg\",\n    OPCODE_SIG_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_ABS,\n    \"abs\",\n    OPCODE_SIG_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_SQRT,\n    \"sqrt\",\n    OPCODE_SIG_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_RSQRT,\n    \"rsqrt\",\n    OPCODE_SIG_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_RECIP,\n    \"recip\",\n    OPCODE_SIG_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_POW2,\n    \"pow2\",\n    OPCODE_SIG_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_LOG2,\n    \"log2\",\n    OPCODE_SIG_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_DOT_PRODUCT_3,\n    \"dot_product_3\",\n    OPCODE_SIG_V_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_DOT_PRODUCT_4,\n    \"dot_product_4\",\n    OPCODE_SIG_V_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_AND,\n    \"and\",\n    OPCODE_SIG_V_V_V,\n    OPCODE_FLAG_COMMUNATIVE)\n\nDEFINE_OPCODE(\n    OPCODE_AND_NOT,\n    \"and_not\",\n    OPCODE_SIG_V_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_OR,\n    \"or\",\n    OPCODE_SIG_V_V_V,\n    OPCODE_FLAG_COMMUNATIVE)\n\nDEFINE_OPCODE(\n    OPCODE_XOR,\n    \"xor\",\n    OPCODE_SIG_V_V_V,\n    OPCODE_FLAG_COMMUNATIVE)\n\nDEFINE_OPCODE(\n    OPCODE_NOT,\n    \"not\",\n    OPCODE_SIG_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_SHL,\n    \"shl\",\n    OPCODE_SIG_V_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_VECTOR_SHL,\n    \"vector_shl\",\n    OPCODE_SIG_V_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_SHR,\n    \"shr\",\n    OPCODE_SIG_V_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_VECTOR_SHR,\n    \"vector_shr\",\n    OPCODE_SIG_V_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_SHA,\n    \"sha\",\n    OPCODE_SIG_V_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_VECTOR_SHA,\n    \"vector_sha\",\n    OPCODE_SIG_V_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_ROTATE_LEFT,\n    \"rotate_left\",\n    OPCODE_SIG_V_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_VECTOR_ROTATE_LEFT,\n    \"vector_rotate_left\",\n    OPCODE_SIG_V_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_VECTOR_AVERAGE,\n    \"vector_average\",\n    OPCODE_SIG_V_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_BYTE_SWAP,\n    \"byte_swap\",\n    OPCODE_SIG_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_CNTLZ,\n    \"cntlz\",\n    OPCODE_SIG_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_INSERT,\n    \"insert\",\n    OPCODE_SIG_V_V_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_EXTRACT,\n    \"extract\",\n    OPCODE_SIG_V_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_SPLAT,\n    \"splat\",\n    OPCODE_SIG_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_PERMUTE,\n    \"permute\",\n    OPCODE_SIG_V_V_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_SWIZZLE,\n    \"swizzle\",\n    OPCODE_SIG_V_V_O,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_PACK,\n    \"pack\",\n    OPCODE_SIG_V_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_UNPACK,\n    \"unpack\",\n    OPCODE_SIG_V_V,\n    0)\n\nDEFINE_OPCODE(\n    OPCODE_ATOMIC_EXCHANGE,\n    \"atomic_exchange\",\n    OPCODE_SIG_V_V_V,\n    OPCODE_FLAG_VOLATILE)\n\nDEFINE_OPCODE(\n    OPCODE_ATOMIC_COMPARE_EXCHANGE,\n    \"atomic_compare_exchange\",\n    OPCODE_SIG_V_V_V_V,\n    OPCODE_FLAG_VOLATILE)\n\nDEFINE_OPCODE(\n    OPCODE_SET_ROUNDING_MODE,\n    \"set_rounding_mode\",\n    OPCODE_SIG_X_V,\n    0)\n"
  },
  {
    "path": "src/xenia/cpu/hir/value.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/hir/value.h\"\n\n#include <cmath>\n#include <cstdlib>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/byte_order.h\"\n#include \"xenia/base/math.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace hir {\n\nValue::Use* Value::AddUse(Arena* arena, Instr* instr) {\n  Use* use = arena->Alloc<Use>();\n  use->instr = instr;\n  use->prev = NULL;\n  use->next = use_head;\n  if (use_head) {\n    use_head->prev = use;\n  }\n  use_head = use;\n  return use;\n}\n\nvoid Value::RemoveUse(Use* use) {\n  if (use == use_head) {\n    use_head = use->next;\n  } else {\n    use->prev->next = use->next;\n  }\n  if (use->next) {\n    use->next->prev = use->prev;\n  }\n}\n\nuint32_t Value::AsUint32() {\n  assert_true(IsConstant());\n  switch (type) {\n    case INT8_TYPE:\n      return constant.u8;\n    case INT16_TYPE:\n      return constant.u16;\n    case INT32_TYPE:\n      return constant.u32;\n    case INT64_TYPE:\n      return (uint32_t)constant.u64;\n    default:\n      assert_unhandled_case(type);\n      return 0;\n  }\n}\n\nuint64_t Value::AsUint64() {\n  assert_true(IsConstant());\n  switch (type) {\n    case INT8_TYPE:\n      return constant.u8;\n    case INT16_TYPE:\n      return constant.u16;\n    case INT32_TYPE:\n      return constant.u32;\n    case INT64_TYPE:\n      return constant.u64;\n    default:\n      assert_unhandled_case(type);\n      return 0;\n  }\n}\n\nvoid Value::Cast(TypeName target_type) {\n  // Only need a type change.\n  type = target_type;\n}\n\nvoid Value::ZeroExtend(TypeName target_type) {\n  switch (type) {\n    case INT8_TYPE:\n      type = target_type;\n      constant.u64 = constant.u8;\n      return;\n    case INT16_TYPE:\n      type = target_type;\n      constant.u64 = constant.u16;\n      return;\n    case INT32_TYPE:\n      type = target_type;\n      constant.u64 = constant.u32;\n      return;\n    default:\n      assert_unhandled_case(type);\n      break;\n  }\n}\n\nvoid Value::SignExtend(TypeName target_type) {\n  switch (type) {\n    case INT8_TYPE:\n      type = target_type;\n      switch (target_type) {\n        case INT16_TYPE:\n          constant.i16 = constant.i8;\n          return;\n        case INT32_TYPE:\n          constant.i32 = constant.i8;\n          return;\n        case INT64_TYPE:\n          constant.i64 = constant.i8;\n          return;\n        default:\n          assert_unhandled_case(target_type);\n          return;\n      }\n    case INT16_TYPE:\n      type = target_type;\n      switch (target_type) {\n        case INT32_TYPE:\n          constant.i32 = constant.i16;\n          return;\n        case INT64_TYPE:\n          constant.i64 = constant.i16;\n          return;\n        default:\n          assert_unhandled_case(target_type);\n          return;\n      }\n    case INT32_TYPE:\n      type = target_type;\n      switch (target_type) {\n        case INT64_TYPE:\n          constant.i64 = constant.i32;\n          return;\n        default:\n          assert_unhandled_case(target_type);\n          return;\n      }\n    default:\n      assert_unhandled_case(type);\n      return;\n  }\n}\n\nvoid Value::Truncate(TypeName target_type) {\n  switch (type) {\n    case INT16_TYPE:\n      switch (target_type) {\n        case INT8_TYPE:\n          type = target_type;\n          constant.i64 = constant.i64 & 0xFF;\n          return;\n        default:\n          assert_unhandled_case(target_type);\n          return;\n      }\n    case INT32_TYPE:\n      switch (target_type) {\n        case INT8_TYPE:\n          type = target_type;\n          constant.i64 = constant.i64 & 0xFF;\n          return;\n        case INT16_TYPE:\n          type = target_type;\n          constant.i64 = constant.i64 & 0xFFFF;\n          return;\n        default:\n          assert_unhandled_case(target_type);\n          return;\n      }\n    case INT64_TYPE:\n      switch (target_type) {\n        case INT8_TYPE:\n          type = target_type;\n          constant.i64 = constant.i64 & 0xFF;\n          return;\n        case INT16_TYPE:\n          type = target_type;\n          constant.i64 = constant.i64 & 0xFFFF;\n          return;\n        case INT32_TYPE:\n          type = target_type;\n          constant.i64 = constant.i64 & 0xFFFFFFFF;\n          return;\n        default:\n          assert_unhandled_case(target_type);\n          return;\n      }\n    default:\n      assert_unhandled_case(type);\n      return;\n  }\n}\n\nvoid Value::Convert(TypeName target_type, RoundMode round_mode) {\n  switch (type) {\n    case FLOAT32_TYPE:\n      switch (target_type) {\n        case FLOAT64_TYPE:\n          type = target_type;\n          constant.f64 = constant.f32;\n          return;\n        default:\n          assert_unhandled_case(target_type);\n          return;\n      }\n    case INT64_TYPE:\n      switch (target_type) {\n        case FLOAT64_TYPE:\n          type = target_type;\n          constant.f64 = (double)constant.i64;\n          return;\n        default:\n          assert_unhandled_case(target_type);\n          return;\n      }\n    case FLOAT64_TYPE:\n      switch (target_type) {\n        case FLOAT32_TYPE:\n          type = target_type;\n          constant.f32 = (float)constant.f64;\n          return;\n        case INT32_TYPE:\n          type = target_type;\n          constant.i32 = (int32_t)constant.f64;\n          return;\n        case INT64_TYPE:\n          type = target_type;\n          constant.i64 = (int64_t)constant.f64;\n          return;\n        default:\n          assert_unhandled_case(target_type);\n          return;\n      }\n    default:\n      assert_unhandled_case(type);\n      return;\n  }\n}\n\ntemplate <typename T>\nT __inline RoundValue(RoundMode round_mode, T value) {\n  switch (round_mode) {\n    case ROUND_TO_ZERO:\n      return std::trunc(value);\n    case ROUND_TO_NEAREST:\n      return std::round(value);\n    case ROUND_TO_MINUS_INFINITY:\n      return std::floor(value);\n    case ROUND_TO_POSITIVE_INFINITY:\n      return std::ceil(value);\n    default:\n      assert_unhandled_case(round_mode);\n      return value;\n  }\n}\n\nvoid Value::Round(RoundMode round_mode) {\n  switch (type) {\n    case FLOAT32_TYPE:\n      constant.f32 = RoundValue(round_mode, constant.f32);\n      return;\n    case FLOAT64_TYPE:\n      constant.f64 = RoundValue(round_mode, constant.f64);\n      return;\n    case VEC128_TYPE:\n      for (int i = 0; i < 4; i++) {\n        constant.v128.f32[i] = RoundValue(round_mode, constant.v128.f32[i]);\n      }\n      return;\n    default:\n      assert_unhandled_case(type);\n      return;\n  }\n}\n\nbool Value::Add(Value* other) {\n#define CHECK_DID_CARRY(v1, v2) (((uint64_t)v2) > ~((uint64_t)v1))\n#define ADD_DID_CARRY(a, b) CHECK_DID_CARRY(a, b)\n  assert_true(type == other->type);\n  bool did_carry = false;\n  switch (type) {\n    case INT8_TYPE:\n      did_carry = ADD_DID_CARRY(constant.i8, other->constant.i8);\n      constant.i8 += other->constant.i8;\n      break;\n    case INT16_TYPE:\n      did_carry = ADD_DID_CARRY(constant.i16, other->constant.i16);\n      constant.i16 += other->constant.i16;\n      break;\n    case INT32_TYPE:\n      did_carry = ADD_DID_CARRY(constant.i32, other->constant.i32);\n      constant.i32 += other->constant.i32;\n      break;\n    case INT64_TYPE:\n      did_carry = ADD_DID_CARRY(constant.i64, other->constant.i64);\n      constant.i64 += other->constant.i64;\n      break;\n    case FLOAT32_TYPE:\n      constant.f32 += other->constant.f32;\n      break;\n    case FLOAT64_TYPE:\n      constant.f64 += other->constant.f64;\n      break;\n    default:\n      assert_unhandled_case(type);\n      break;\n  }\n  return did_carry;\n}\n\nbool Value::Sub(Value* other) {\n#define SUB_DID_CARRY(a, b) (b == 0 || a > (~(0 - b)))\n  assert_true(type == other->type);\n  bool did_carry = false;\n  switch (type) {\n    case INT8_TYPE:\n      did_carry =\n          SUB_DID_CARRY(uint16_t(constant.i8), uint16_t(other->constant.i8));\n      constant.i8 -= other->constant.i8;\n      break;\n    case INT16_TYPE:\n      did_carry =\n          SUB_DID_CARRY(uint16_t(constant.i16), uint16_t(other->constant.i16));\n      constant.i16 -= other->constant.i16;\n      break;\n    case INT32_TYPE:\n      did_carry =\n          SUB_DID_CARRY(uint32_t(constant.i32), uint32_t(other->constant.i32));\n      constant.i32 -= other->constant.i32;\n      break;\n    case INT64_TYPE:\n      did_carry =\n          SUB_DID_CARRY(uint64_t(constant.i64), uint64_t(other->constant.i64));\n      constant.i64 -= other->constant.i64;\n      break;\n    case FLOAT32_TYPE:\n      constant.f32 -= other->constant.f32;\n      break;\n    case FLOAT64_TYPE:\n      constant.f64 -= other->constant.f64;\n      break;\n    default:\n      assert_unhandled_case(type);\n      break;\n  }\n  return did_carry;\n}\n\nvoid Value::Mul(Value* other) {\n  assert_true(type == other->type);\n  switch (type) {\n    case INT8_TYPE:\n      constant.i8 *= other->constant.i8;\n      break;\n    case INT16_TYPE:\n      constant.i16 *= other->constant.i16;\n      break;\n    case INT32_TYPE:\n      constant.i32 *= other->constant.i32;\n      break;\n    case INT64_TYPE:\n      constant.i64 *= other->constant.i64;\n      break;\n    case FLOAT32_TYPE:\n      constant.f32 *= other->constant.f32;\n      break;\n    case FLOAT64_TYPE:\n      constant.f64 *= other->constant.f64;\n      break;\n    case VEC128_TYPE:\n      for (int i = 0; i < 4; i++) {\n        constant.v128.f32[i] *= other->constant.v128.f32[i];\n      }\n      break;\n    default:\n      assert_unhandled_case(type);\n      break;\n  }\n}\n\nvoid Value::MulHi(Value* other, bool is_unsigned) {\n  assert_true(type == other->type);\n  switch (type) {\n    case INT32_TYPE:\n      if (is_unsigned) {\n        constant.i32 = (int32_t)(((uint64_t)((uint32_t)constant.i32) *\n                                  (uint32_t)other->constant.i32) >>\n                                 32);\n      } else {\n        constant.i32 =\n            (int32_t)(((int64_t)constant.i32 * (int64_t)other->constant.i32) >>\n                      32);\n      }\n      break;\n    case INT64_TYPE:\n#if XE_COMPILER_MSVC\n      if (is_unsigned) {\n        constant.i64 = __umulh(constant.i64, other->constant.i64);\n      } else {\n        constant.i64 = __mulh(constant.i64, other->constant.i64);\n      }\n#else\n      if (is_unsigned) {\n        constant.i64 = static_cast<uint64_t>(\n            (static_cast<unsigned __int128>(constant.i64) *\n             static_cast<unsigned __int128>(other->constant.i64)) >>\n            64);\n      } else {\n        constant.i64 = static_cast<uint64_t>(\n            (static_cast<__int128>(constant.i64) *\n             static_cast<__int128>(other->constant.i64)) >>\n            64);\n      }\n#endif  // XE_COMPILER_MSVC\n      break;\n    default:\n      assert_unhandled_case(type);\n      break;\n  }\n}\n\nvoid Value::Div(Value* other, bool is_unsigned) {\n  assert_true(type == other->type);\n  switch (type) {\n    case INT8_TYPE:\n      if (is_unsigned) {\n        constant.i8 /= uint8_t(other->constant.i8);\n      } else {\n        constant.i8 /= other->constant.i8;\n      }\n      break;\n    case INT16_TYPE:\n      if (is_unsigned) {\n        constant.i16 /= uint16_t(other->constant.i16);\n      } else {\n        constant.i16 /= other->constant.i16;\n      }\n      break;\n    case INT32_TYPE:\n      if (is_unsigned) {\n        constant.i32 /= uint32_t(other->constant.i32);\n      } else {\n        constant.i32 /= other->constant.i32;\n      }\n      break;\n    case INT64_TYPE:\n      if (is_unsigned) {\n        constant.i64 /= uint64_t(other->constant.i64);\n      } else {\n        constant.i64 /= other->constant.i64;\n      }\n      break;\n    case FLOAT32_TYPE:\n      constant.f32 /= other->constant.f32;\n      break;\n    case FLOAT64_TYPE:\n      constant.f64 /= other->constant.f64;\n      break;\n    case VEC128_TYPE:\n      for (int i = 0; i < 4; i++) {\n        constant.v128.f32[i] /= other->constant.v128.f32[i];\n      }\n      break;\n    default:\n      assert_unhandled_case(type);\n      break;\n  }\n}\n\nvoid Value::Max(Value* other) {\n  assert_true(type == other->type);\n  switch (type) {\n    case FLOAT32_TYPE:\n      constant.f32 = std::max(constant.f32, other->constant.f32);\n      break;\n    case FLOAT64_TYPE:\n      constant.f64 = std::max(constant.f64, other->constant.f64);\n      break;\n    case VEC128_TYPE:\n      for (int i = 0; i < 4; i++) {\n        constant.v128.f32[i] =\n            std::max(constant.v128.f32[i], other->constant.v128.f32[i]);\n      }\n      break;\n    default:\n      assert_unhandled_case(type);\n      break;\n  }\n}\n\nvoid Value::MulAdd(Value* dest, Value* value1, Value* value2, Value* value3) {\n  switch (dest->type) {\n    case VEC128_TYPE:\n      for (int i = 0; i < 4; i++) {\n        dest->constant.v128.f32[i] =\n            (value1->constant.v128.f32[i] * value2->constant.v128.f32[i]) +\n            value3->constant.v128.f32[i];\n      }\n      break;\n    case FLOAT32_TYPE:\n      dest->constant.f32 =\n          (value1->constant.f32 * value2->constant.f32) + value3->constant.f32;\n      break;\n    case FLOAT64_TYPE:\n      dest->constant.f64 =\n          (value1->constant.f64 * value2->constant.f64) + value3->constant.f64;\n      break;\n    default:\n      assert_unhandled_case(dest->type);\n      break;\n  }\n}\n\nvoid Value::MulSub(Value* dest, Value* value1, Value* value2, Value* value3) {\n  switch (dest->type) {\n    case VEC128_TYPE:\n      for (int i = 0; i < 4; i++) {\n        dest->constant.v128.f32[i] =\n            (value1->constant.v128.f32[i] * value2->constant.v128.f32[i]) -\n            value3->constant.v128.f32[i];\n      }\n      break;\n    case FLOAT32_TYPE:\n      dest->constant.f32 =\n          (value1->constant.f32 * value2->constant.f32) - value3->constant.f32;\n      break;\n    case FLOAT64_TYPE:\n      dest->constant.f64 =\n          (value1->constant.f64 * value2->constant.f64) - value3->constant.f64;\n      break;\n    default:\n      assert_unhandled_case(dest->type);\n      break;\n  }\n}\n\nvoid Value::Neg() {\n  switch (type) {\n    case INT8_TYPE:\n      constant.i8 = -constant.i8;\n      break;\n    case INT16_TYPE:\n      constant.i16 = -constant.i16;\n      break;\n    case INT32_TYPE:\n      constant.i32 = -constant.i32;\n      break;\n    case INT64_TYPE:\n      constant.i64 = -constant.i64;\n      break;\n    case FLOAT32_TYPE:\n      constant.f32 = -constant.f32;\n      break;\n    case FLOAT64_TYPE:\n      constant.f64 = -constant.f64;\n      break;\n    case VEC128_TYPE:\n      for (int i = 0; i < 4; ++i) {\n        constant.v128.f32[i] = -constant.v128.f32[i];\n      }\n      break;\n    default:\n      assert_unhandled_case(type);\n      break;\n  }\n}\n\nvoid Value::Abs() {\n  switch (type) {\n    case INT8_TYPE:\n      constant.i8 = int8_t(std::abs(constant.i8));\n      break;\n    case INT16_TYPE:\n      constant.i16 = int16_t(std::abs(constant.i16));\n      break;\n    case INT32_TYPE:\n      constant.i32 = std::abs(constant.i32);\n      break;\n    case INT64_TYPE:\n      constant.i64 = std::abs(constant.i64);\n      break;\n    case FLOAT32_TYPE:\n      constant.f32 = std::abs(constant.f32);\n      break;\n    case FLOAT64_TYPE:\n      constant.f64 = std::abs(constant.f64);\n      break;\n    case VEC128_TYPE:\n      for (int i = 0; i < 4; ++i) {\n        constant.v128.f32[i] = std::abs(constant.v128.f32[i]);\n      }\n      break;\n    default:\n      assert_unhandled_case(type);\n      break;\n  }\n}\n\nvoid Value::Sqrt() {\n  switch (type) {\n    case FLOAT32_TYPE:\n      constant.f32 = std::sqrt(constant.f32);\n      break;\n    case FLOAT64_TYPE:\n      constant.f64 = std::sqrt(constant.f64);\n      break;\n    default:\n      assert_unhandled_case(type);\n      break;\n  }\n}\n\nvoid Value::RSqrt() {\n  switch (type) {\n    case FLOAT32_TYPE:\n      constant.f32 = 1.0f / std::sqrt(constant.f32);\n      break;\n    case FLOAT64_TYPE:\n      constant.f64 = 1.0f / std::sqrt(constant.f64);\n      break;\n    case VEC128_TYPE:\n      for (int i = 0; i < 4; ++i) {\n        constant.v128.f32[i] = 1.0f / std::sqrt(constant.v128.f32[i]);\n      }\n      break;\n    default:\n      assert_unhandled_case(type);\n      break;\n  }\n}\n\nvoid Value::Recip() {\n  switch (type) {\n    case FLOAT32_TYPE:\n      constant.f32 = 1.0f / constant.f32;\n      break;\n    case FLOAT64_TYPE:\n      constant.f64 = 1.0f / constant.f64;\n      break;\n    case VEC128_TYPE:\n      for (int i = 0; i < 4; i++) {\n        constant.v128.f32[i] = 1.0f / constant.v128.f32[i];\n      }\n      break;\n    default:\n      assert_unhandled_case(type);\n      break;\n  }\n}\n\nvoid Value::And(Value* other) {\n  assert_true(type == other->type);\n  switch (type) {\n    case INT8_TYPE:\n      constant.i8 &= other->constant.i8;\n      break;\n    case INT16_TYPE:\n      constant.i16 &= other->constant.i16;\n      break;\n    case INT32_TYPE:\n      constant.i32 &= other->constant.i32;\n      break;\n    case INT64_TYPE:\n      constant.i64 &= other->constant.i64;\n      break;\n    case VEC128_TYPE:\n      constant.v128 &= other->constant.v128;\n      break;\n    default:\n      assert_unhandled_case(type);\n      break;\n  }\n}\n\nvoid Value::Or(Value* other) {\n  assert_true(type == other->type);\n  switch (type) {\n    case INT8_TYPE:\n      constant.i8 |= other->constant.i8;\n      break;\n    case INT16_TYPE:\n      constant.i16 |= other->constant.i16;\n      break;\n    case INT32_TYPE:\n      constant.i32 |= other->constant.i32;\n      break;\n    case INT64_TYPE:\n      constant.i64 |= other->constant.i64;\n      break;\n    case VEC128_TYPE:\n      constant.v128 |= other->constant.v128;\n      break;\n    default:\n      assert_unhandled_case(type);\n      break;\n  }\n}\n\nvoid Value::Xor(Value* other) {\n  assert_true(type == other->type);\n  switch (type) {\n    case INT8_TYPE:\n      constant.i8 ^= other->constant.i8;\n      break;\n    case INT16_TYPE:\n      constant.i16 ^= other->constant.i16;\n      break;\n    case INT32_TYPE:\n      constant.i32 ^= other->constant.i32;\n      break;\n    case INT64_TYPE:\n      constant.i64 ^= other->constant.i64;\n      break;\n    case VEC128_TYPE:\n      constant.v128 ^= other->constant.v128;\n      break;\n    default:\n      assert_unhandled_case(type);\n      break;\n  }\n}\n\nvoid Value::Not() {\n  switch (type) {\n    case INT8_TYPE:\n      constant.i8 = ~constant.i8;\n      break;\n    case INT16_TYPE:\n      constant.i16 = ~constant.i16;\n      break;\n    case INT32_TYPE:\n      constant.i32 = ~constant.i32;\n      break;\n    case INT64_TYPE:\n      constant.i64 = ~constant.i64;\n      break;\n    case VEC128_TYPE:\n      constant.v128.low = ~constant.v128.low;\n      constant.v128.high = ~constant.v128.high;\n      break;\n    default:\n      assert_unhandled_case(type);\n      break;\n  }\n}\n\nvoid Value::Shl(Value* other) {\n  assert_true(other->type == INT8_TYPE);\n  switch (type) {\n    case INT8_TYPE:\n      constant.u8 <<= other->constant.u8;\n      break;\n    case INT16_TYPE:\n      constant.u16 <<= other->constant.u8;\n      break;\n    case INT32_TYPE:\n      constant.u32 <<= other->constant.u8;\n      break;\n    case INT64_TYPE:\n      constant.u64 <<= other->constant.u8;\n      break;\n    default:\n      assert_unhandled_case(type);\n      break;\n  }\n}\n\nvoid Value::Shr(Value* other) {\n  assert_true(other->type == INT8_TYPE);\n  switch (type) {\n    case INT8_TYPE:\n      constant.u8 = constant.u8 >> other->constant.u8;\n      break;\n    case INT16_TYPE:\n      constant.u16 = constant.u16 >> other->constant.u8;\n      break;\n    case INT32_TYPE:\n      constant.u32 = constant.u32 >> other->constant.u8;\n      break;\n    case INT64_TYPE:\n      constant.u64 = constant.u64 >> other->constant.u8;\n      break;\n    default:\n      assert_unhandled_case(type);\n      break;\n  }\n}\n\nvoid Value::Sha(Value* other) {\n  assert_true(other->type == INT8_TYPE);\n  switch (type) {\n    case INT8_TYPE:\n      constant.i8 = constant.i8 >> other->constant.u8;\n      break;\n    case INT16_TYPE:\n      constant.i16 = constant.i16 >> other->constant.u8;\n      break;\n    case INT32_TYPE:\n      constant.i32 = constant.i32 >> other->constant.u8;\n      break;\n    case INT64_TYPE:\n      constant.i64 = constant.i64 >> other->constant.u8;\n      break;\n    default:\n      assert_unhandled_case(type);\n      break;\n  }\n}\n\nvoid Value::Extract(Value* vec, Value* index) {\n  assert_true(vec->type == VEC128_TYPE);\n  switch (type) {\n    case INT8_TYPE:\n      constant.u8 = vec->constant.v128.u8[index->constant.u8 & 0x1F];\n      break;\n    case INT16_TYPE:\n      constant.u16 = vec->constant.v128.u16[index->constant.u16 & 0x7];\n      break;\n    case INT32_TYPE:\n      constant.u32 = vec->constant.v128.u32[index->constant.u32 & 0x3];\n      break;\n    case INT64_TYPE:\n      constant.u64 = vec->constant.v128.u64[index->constant.u64 & 0x1];\n      break;\n    default:\n      assert_unhandled_case(type);\n      break;\n  }\n}\n\nvoid Value::Select(Value* other, Value* ctrl) {\n  // TODO\n  assert_always();\n}\n\nvoid Value::Splat(Value* other) {\n  assert_true(type == VEC128_TYPE);\n  switch (other->type) {\n    case INT8_TYPE:\n      for (int i = 0; i < 16; i++) {\n        constant.v128.i8[i] = other->constant.i8;\n      }\n      break;\n    case INT16_TYPE:\n      for (int i = 0; i < 8; i++) {\n        constant.v128.i16[i] = other->constant.i16;\n      }\n      break;\n    case INT32_TYPE:\n    case FLOAT32_TYPE:\n      for (int i = 0; i < 4; i++) {\n        constant.v128.i32[i] = other->constant.i32;\n      }\n      break;\n    case INT64_TYPE:\n    case FLOAT64_TYPE:\n      for (int i = 0; i < 2; i++) {\n        constant.v128.i64[i] = other->constant.i64;\n      }\n      break;\n    default:\n      assert_unhandled_case(other->type);\n      break;\n  }\n}\n\nvoid Value::VectorCompareEQ(Value* other, TypeName type) {\n  assert_true(this->type == VEC128_TYPE && other->type == VEC128_TYPE);\n  switch (type) {\n    case INT8_TYPE:\n      for (int i = 0; i < 16; i++) {\n        constant.v128.u8[i] =\n            constant.v128.u8[i] == other->constant.v128.u8[i] ? -1 : 0;\n      }\n      break;\n    case INT16_TYPE:\n      for (int i = 0; i < 8; i++) {\n        constant.v128.u16[i] =\n            constant.v128.u16[i] == other->constant.v128.u16[i] ? -1 : 0;\n      }\n      break;\n    case INT32_TYPE:\n    case FLOAT32_TYPE:\n      for (int i = 0; i < 4; i++) {\n        constant.v128.u32[i] =\n            constant.v128.u32[i] == other->constant.v128.u32[i] ? -1 : 0;\n      }\n      break;\n    case INT64_TYPE:\n    case FLOAT64_TYPE:\n      for (int i = 0; i < 2; i++) {\n        constant.v128.u64[i] =\n            constant.v128.u64[i] == other->constant.v128.u64[i] ? -1 : 0;\n      }\n      break;\n    default:\n      assert_unhandled_case(type);\n      break;\n  }\n}\n\nvoid Value::VectorCompareSGT(Value* other, TypeName type) {\n  assert_true(this->type == VEC128_TYPE && other->type == VEC128_TYPE);\n  switch (type) {\n    case INT8_TYPE:\n      for (int i = 0; i < 16; i++) {\n        constant.v128.u8[i] =\n            constant.v128.i8[i] > other->constant.v128.i8[i] ? -1 : 0;\n      }\n      break;\n    case INT16_TYPE:\n      for (int i = 0; i < 8; i++) {\n        constant.v128.u16[i] =\n            constant.v128.i16[i] > other->constant.v128.i16[i] ? -1 : 0;\n      }\n      break;\n    case INT32_TYPE:\n      for (int i = 0; i < 4; i++) {\n        constant.v128.u32[i] =\n            constant.v128.i32[i] > other->constant.v128.i32[i] ? -1 : 0;\n      }\n      break;\n    case INT64_TYPE:\n      for (int i = 0; i < 2; i++) {\n        constant.v128.u64[i] =\n            constant.v128.i64[i] > other->constant.v128.i64[i] ? -1 : 0;\n      }\n      break;\n    case FLOAT32_TYPE:\n      for (int i = 0; i < 4; i++) {\n        constant.v128.u32[i] =\n            constant.v128.f32[i] > other->constant.v128.f32[i] ? -1 : 0;\n      }\n      break;\n    default:\n      assert_unhandled_case(type);\n      break;\n  }\n}\n\nvoid Value::VectorCompareSGE(Value* other, TypeName type) {\n  assert_true(this->type == VEC128_TYPE && other->type == VEC128_TYPE);\n  switch (type) {\n    case INT8_TYPE:\n      for (int i = 0; i < 16; i++) {\n        constant.v128.u8[i] =\n            constant.v128.i8[i] >= other->constant.v128.i8[i] ? -1 : 0;\n      }\n      break;\n    case INT16_TYPE:\n      for (int i = 0; i < 8; i++) {\n        constant.v128.u16[i] =\n            constant.v128.i16[i] >= other->constant.v128.i16[i] ? -1 : 0;\n      }\n      break;\n    case INT32_TYPE:\n      for (int i = 0; i < 4; i++) {\n        constant.v128.u32[i] =\n            constant.v128.i32[i] >= other->constant.v128.i32[i] ? -1 : 0;\n      }\n      break;\n    case INT64_TYPE:\n      for (int i = 0; i < 2; i++) {\n        constant.v128.u64[i] =\n            constant.v128.i64[i] >= other->constant.v128.i64[i] ? -1 : 0;\n      }\n      break;\n    case FLOAT32_TYPE:\n      for (int i = 0; i < 4; i++) {\n        constant.v128.u32[i] =\n            constant.v128.f32[i] >= other->constant.v128.f32[i] ? -1 : 0;\n      }\n      break;\n    default:\n      assert_unhandled_case(type);\n      break;\n  }\n}\n\nvoid Value::VectorCompareUGT(Value* other, TypeName type) {\n  assert_true(this->type == VEC128_TYPE && other->type == VEC128_TYPE);\n  switch (type) {\n    case INT8_TYPE:\n      for (int i = 0; i < 16; i++) {\n        constant.v128.u8[i] =\n            constant.v128.u8[i] > other->constant.v128.u8[i] ? -1 : 0;\n      }\n      break;\n    case INT16_TYPE:\n      for (int i = 0; i < 8; i++) {\n        constant.v128.u16[i] =\n            constant.v128.u16[i] > other->constant.v128.u16[i] ? -1 : 0;\n      }\n      break;\n    case INT32_TYPE:\n      for (int i = 0; i < 4; i++) {\n        constant.v128.u32[i] =\n            constant.v128.u32[i] > other->constant.v128.u32[i] ? -1 : 0;\n      }\n      break;\n    case INT64_TYPE:\n      for (int i = 0; i < 2; i++) {\n        constant.v128.u64[i] =\n            constant.v128.u64[i] > other->constant.v128.u64[i] ? -1 : 0;\n      }\n      break;\n    default:\n      assert_unhandled_case(type);\n      break;\n  }\n}\n\nvoid Value::VectorCompareUGE(Value* other, TypeName type) {\n  assert_true(this->type == VEC128_TYPE && other->type == VEC128_TYPE);\n  switch (type) {\n    case INT8_TYPE:\n      for (int i = 0; i < 16; i++) {\n        constant.v128.u8[i] =\n            constant.v128.u8[i] >= other->constant.v128.u8[i] ? -1 : 0;\n      }\n      break;\n    case INT16_TYPE:\n      for (int i = 0; i < 8; i++) {\n        constant.v128.u16[i] =\n            constant.v128.u16[i] >= other->constant.v128.u16[i] ? -1 : 0;\n      }\n      break;\n    case INT32_TYPE:\n      for (int i = 0; i < 4; i++) {\n        constant.v128.u32[i] =\n            constant.v128.u32[i] >= other->constant.v128.u32[i] ? -1 : 0;\n      }\n      break;\n    case INT64_TYPE:\n      for (int i = 0; i < 2; i++) {\n        constant.v128.u64[i] =\n            constant.v128.u64[i] >= other->constant.v128.u64[i] ? -1 : 0;\n      }\n      break;\n    default:\n      assert_unhandled_case(type);\n      break;\n  }\n}\n\nvoid Value::VectorConvertI2F(Value* other, bool is_unsigned) {\n  assert_true(type == VEC128_TYPE);\n  for (int i = 0; i < 4; i++) {\n    if (is_unsigned) {\n      constant.v128.f32[i] = (float)other->constant.v128.u32[i];\n    } else {\n      constant.v128.f32[i] = (float)other->constant.v128.i32[i];\n    }\n  }\n}\n\nvoid Value::VectorConvertF2I(Value* other, bool is_unsigned) {\n  assert_true(type == VEC128_TYPE);\n\n  // FIXME(DrChat): This does not saturate!\n  for (int i = 0; i < 4; i++) {\n    if (is_unsigned) {\n      constant.v128.u32[i] = (uint32_t)other->constant.v128.f32[i];\n    } else {\n      constant.v128.i32[i] = (int32_t)other->constant.v128.f32[i];\n    }\n  }\n}\n\nvoid Value::VectorShl(Value* other, TypeName type) {\n  assert_true(this->type == VEC128_TYPE && other->type == VEC128_TYPE);\n  switch (type) {\n    case INT8_TYPE:\n      for (int i = 0; i < 16; i++) {\n        constant.v128.u8[i] <<= other->constant.v128.u8[i] & 0x7;\n      }\n      break;\n    case INT16_TYPE:\n      for (int i = 0; i < 8; i++) {\n        constant.v128.u16[i] <<= other->constant.v128.u16[i] & 0xF;\n      }\n      break;\n    case INT32_TYPE:\n      for (int i = 0; i < 4; i++) {\n        constant.v128.u32[i] <<= other->constant.v128.u32[i] & 0x1F;\n      }\n      break;\n    default:\n      assert_unhandled_case(type);\n      break;\n  }\n}\n\nvoid Value::VectorShr(Value* other, TypeName type) {\n  assert_true(this->type == VEC128_TYPE && other->type == VEC128_TYPE);\n  switch (type) {\n    case INT8_TYPE:\n      for (int i = 0; i < 16; i++) {\n        constant.v128.u8[i] >>= other->constant.v128.u8[i] & 0x7;\n      }\n      break;\n    case INT16_TYPE:\n      for (int i = 0; i < 8; i++) {\n        constant.v128.u16[i] >>= other->constant.v128.u16[i] & 0xF;\n      }\n      break;\n    case INT32_TYPE:\n      for (int i = 0; i < 4; i++) {\n        constant.v128.u32[i] >>= other->constant.v128.u32[i] & 0x1F;\n      }\n      break;\n    default:\n      assert_unhandled_case(type);\n      break;\n  }\n}\n\nvoid Value::VectorRol(Value* other, TypeName type) {\n  assert_true(this->type == VEC128_TYPE && other->type == VEC128_TYPE);\n  switch (type) {\n    case INT8_TYPE:\n      for (int i = 0; i < 16; i++) {\n        constant.v128.u8[i] = xe::rotate_left(constant.v128.u8[i],\n                                              other->constant.v128.i8[i] & 0x7);\n      }\n      break;\n    case INT16_TYPE:\n      for (int i = 0; i < 8; i++) {\n        constant.v128.u16[i] = xe::rotate_left(\n            constant.v128.u16[i], other->constant.v128.u16[i] & 0xF);\n      }\n      break;\n    case INT32_TYPE:\n      for (int i = 0; i < 4; i++) {\n        constant.v128.u32[i] = xe::rotate_left(\n            constant.v128.u32[i], other->constant.v128.u32[i] & 0x1F);\n      }\n      break;\n    default:\n      assert_unhandled_case(type);\n      break;\n  }\n}\n\nvoid Value::VectorAdd(Value* other, TypeName type, bool is_unsigned,\n                      bool saturate) {\n  assert_true(this->type == VEC128_TYPE && other->type == VEC128_TYPE);\n  switch (type) {\n    case FLOAT32_TYPE:\n      if (saturate) {\n        assert_always();\n      } else {\n        constant.v128.x += other->constant.v128.x;\n        constant.v128.y += other->constant.v128.y;\n        constant.v128.z += other->constant.v128.z;\n        constant.v128.w += other->constant.v128.w;\n      }\n      break;\n    case FLOAT64_TYPE:\n      if (saturate) {\n        assert_always();\n      } else {\n        constant.v128.f64[0] += other->constant.v128.f64[0];\n        constant.v128.f64[1] += other->constant.v128.f64[1];\n      }\n      break;\n    case INT8_TYPE:\n      if (saturate) {\n        for (int i = 0; i < 16; i++) {\n          if (is_unsigned) {\n            constant.v128.u8[i] =\n                xe::sat_add(constant.v128.u8[i], other->constant.v128.u8[i]);\n          } else {\n            constant.v128.i8[i] =\n                xe::sat_add(constant.v128.i8[i], other->constant.v128.i8[i]);\n          }\n        }\n        // TODO(Triang3l): Trace DID_SATURATE.\n      } else {\n        for (int i = 0; i < 16; i++) {\n          if (is_unsigned) {\n            constant.v128.u8[i] += other->constant.v128.u8[i];\n          } else {\n            constant.v128.i8[i] += other->constant.v128.i8[i];\n          }\n        }\n      }\n      break;\n    case INT16_TYPE:\n      if (saturate) {\n        for (int i = 0; i < 8; i++) {\n          if (is_unsigned) {\n            constant.v128.u16[i] =\n                xe::sat_add(constant.v128.u16[i], other->constant.v128.u16[i]);\n          } else {\n            constant.v128.i16[i] =\n                xe::sat_add(constant.v128.i16[i], other->constant.v128.i16[i]);\n          }\n        }\n        // TODO(Triang3l): Trace DID_SATURATE.\n      } else {\n        for (int i = 0; i < 8; i++) {\n          if (is_unsigned) {\n            constant.v128.u16[i] += other->constant.v128.u16[i];\n          } else {\n            constant.v128.i16[i] += other->constant.v128.i16[i];\n          }\n        }\n      }\n      break;\n    case INT32_TYPE:\n      if (saturate) {\n        for (int i = 0; i < 4; i++) {\n          if (is_unsigned) {\n            constant.v128.u32[i] =\n                xe::sat_add(constant.v128.u32[i], other->constant.v128.u32[i]);\n          } else {\n            constant.v128.i32[i] =\n                xe::sat_add(constant.v128.i32[i], other->constant.v128.i32[i]);\n          }\n        }\n        // TODO(Triang3l): Trace DID_SATURATE.\n      } else {\n        for (int i = 0; i < 4; i++) {\n          if (is_unsigned) {\n            constant.v128.u32[i] += other->constant.v128.u32[i];\n          } else {\n            constant.v128.i32[i] += other->constant.v128.i32[i];\n          }\n        }\n      }\n      break;\n    case INT64_TYPE:\n      if (saturate) {\n        for (int i = 0; i < 2; i++) {\n          if (is_unsigned) {\n            constant.v128.u64[i] =\n                xe::sat_add(constant.v128.u64[i], other->constant.v128.u64[i]);\n          } else {\n            constant.v128.i64[i] =\n                xe::sat_add(constant.v128.i64[i], other->constant.v128.i64[i]);\n          }\n        }\n        // TODO(Triang3l): Trace DID_SATURATE.\n      } else {\n        if (is_unsigned) {\n          constant.v128.u64[0] += other->constant.v128.u64[0];\n          constant.v128.u64[1] += other->constant.v128.u64[1];\n        } else {\n          constant.v128.i64[0] += other->constant.v128.i64[0];\n          constant.v128.i64[1] += other->constant.v128.i64[1];\n        }\n      }\n      break;\n    default:\n      assert_unhandled_case(type);\n      break;\n  }\n}\n\nvoid Value::VectorSub(Value* other, TypeName type, bool is_unsigned,\n                      bool saturate) {\n  assert_true(this->type == VEC128_TYPE && other->type == VEC128_TYPE);\n  switch (type) {\n    case FLOAT32_TYPE:\n      if (saturate) {\n        assert_always();\n      } else {\n        constant.v128.x -= other->constant.v128.x;\n        constant.v128.y -= other->constant.v128.y;\n        constant.v128.z -= other->constant.v128.z;\n        constant.v128.w -= other->constant.v128.w;\n      }\n      break;\n    case FLOAT64_TYPE:\n      if (saturate) {\n        assert_always();\n      } else {\n        constant.v128.f64[0] -= other->constant.v128.f64[0];\n        constant.v128.f64[1] -= other->constant.v128.f64[1];\n      }\n      break;\n    case INT8_TYPE:\n      if (saturate) {\n        for (int i = 0; i < 16; i++) {\n          if (is_unsigned) {\n            constant.v128.u8[i] =\n                xe::sat_sub(constant.v128.u8[i], other->constant.v128.u8[i]);\n          } else {\n            constant.v128.i8[i] =\n                xe::sat_sub(constant.v128.i8[i], other->constant.v128.i8[i]);\n          }\n        }\n        // TODO(Triang3l): Trace DID_SATURATE.\n      } else {\n        for (int i = 0; i < 16; i++) {\n          if (is_unsigned) {\n            constant.v128.u8[i] -= other->constant.v128.u8[i];\n          } else {\n            constant.v128.i8[i] -= other->constant.v128.i8[i];\n          }\n        }\n      }\n      break;\n    case INT16_TYPE:\n      if (saturate) {\n        for (int i = 0; i < 8; i++) {\n          if (is_unsigned) {\n            constant.v128.u16[i] =\n                xe::sat_sub(constant.v128.u16[i], other->constant.v128.u16[i]);\n          } else {\n            constant.v128.i16[i] =\n                xe::sat_sub(constant.v128.i16[i], other->constant.v128.i16[i]);\n          }\n        }\n        // TODO(Triang3l): Trace DID_SATURATE.\n      } else {\n        for (int i = 0; i < 8; i++) {\n          if (is_unsigned) {\n            constant.v128.u16[i] -= other->constant.v128.u16[i];\n          } else {\n            constant.v128.i16[i] -= other->constant.v128.i16[i];\n          }\n        }\n      }\n      break;\n    case INT32_TYPE:\n      if (saturate) {\n        for (int i = 0; i < 4; i++) {\n          if (is_unsigned) {\n            constant.v128.u32[i] =\n                xe::sat_sub(constant.v128.u32[i], other->constant.v128.u32[i]);\n          } else {\n            constant.v128.i32[i] =\n                xe::sat_sub(constant.v128.i32[i], other->constant.v128.i32[i]);\n          }\n        }\n        // TODO(Triang3l): Trace DID_SATURATE.\n      } else {\n        for (int i = 0; i < 4; i++) {\n          if (is_unsigned) {\n            constant.v128.u32[i] -= other->constant.v128.u32[i];\n          } else {\n            constant.v128.i32[i] -= other->constant.v128.i32[i];\n          }\n        }\n      }\n      break;\n    case INT64_TYPE:\n      if (saturate) {\n        for (int i = 0; i < 2; i++) {\n          if (is_unsigned) {\n            constant.v128.u64[i] =\n                xe::sat_sub(constant.v128.u64[i], other->constant.v128.u64[i]);\n          } else {\n            constant.v128.i64[i] =\n                xe::sat_sub(constant.v128.i64[i], other->constant.v128.i64[i]);\n          }\n        }\n        // TODO(Triang3l): Trace DID_SATURATE.\n      } else {\n        if (is_unsigned) {\n          constant.v128.u64[0] -= other->constant.v128.u64[0];\n          constant.v128.u64[1] -= other->constant.v128.u64[1];\n        } else {\n          constant.v128.i64[0] -= other->constant.v128.i64[0];\n          constant.v128.i64[1] -= other->constant.v128.i64[1];\n        }\n      }\n      break;\n    default:\n      assert_unhandled_case(type);\n      break;\n  }\n}\n\nvoid Value::DotProduct3(Value* other) {\n  assert_true(this->type == VEC128_TYPE && other->type == VEC128_TYPE);\n  switch (type) {\n    case VEC128_TYPE: {\n      // TODO(rick): is this sane?\n      type = FLOAT32_TYPE;\n      // Using x86 DPPS ordering for consistency with x86-64 code generation:\n      // (X1 * X2 + Y1 * Y2) + (Z1 * Z2 + 0.0f)\n      // (+ 0.0f for zero sign, as zero imm8[4:7] bits result in zero terms,\n      // not in complete exclusion of them)\n      // TODO(Triang3l): NaN on overflow.\n      constant.f32 =\n          (constant.v128.f32[0] * other->constant.v128.f32[0] +\n           constant.v128.f32[1] * other->constant.v128.f32[1]) +\n          (constant.v128.f32[2] * other->constant.v128.f32[2] + 0.0f);\n    } break;\n    default:\n      assert_unhandled_case(type);\n      break;\n  }\n}\n\nvoid Value::DotProduct4(Value* other) {\n  assert_true(this->type == VEC128_TYPE && other->type == VEC128_TYPE);\n  switch (type) {\n    case VEC128_TYPE: {\n      // TODO(rick): is this sane?\n      type = FLOAT32_TYPE;\n      // Using x86 DPPS ordering for consistency with x86-64 code generation:\n      // (X1 * X2 + Y1 * Y2) + (Z1 * Z2 + W1 * W2)\n      // TODO(Triang3l): NaN on overflow.\n      constant.f32 = (constant.v128.f32[0] * other->constant.v128.f32[0] +\n                      constant.v128.f32[1] * other->constant.v128.f32[1]) +\n                     (constant.v128.f32[2] * other->constant.v128.f32[2] +\n                      constant.v128.f32[3] * other->constant.v128.f32[3]);\n    } break;\n    default:\n      assert_unhandled_case(type);\n      break;\n  }\n}\n\nvoid Value::VectorAverage(Value* other, TypeName type, bool is_unsigned,\n                          bool saturate) {\n  assert_true(this->type == VEC128_TYPE && other->type == VEC128_TYPE);\n  switch (type) {\n    case INT8_TYPE: {\n      for (int i = 0; i < 16; i++) {\n        if (is_unsigned) {\n          constant.v128.u8[i] =\n              uint8_t((uint16_t(constant.v128.u8[i]) +\n                       uint16_t(other->constant.v128.u8[i]) + 1) >>\n                      1);\n        } else {\n          constant.v128.i8[i] =\n              int8_t((int16_t(constant.v128.i8[i]) +\n                      int16_t(other->constant.v128.i8[i]) + 1) >>\n                     1);\n        }\n      }\n    } break;\n    case INT16_TYPE: {\n      for (int i = 0; i < 8; i++) {\n        if (is_unsigned) {\n          constant.v128.u16[i] =\n              uint16_t((uint32_t(constant.v128.u16[i]) +\n                        uint32_t(other->constant.v128.u16[i]) + 1) >>\n                       1);\n        } else {\n          constant.v128.i16[i] =\n              int16_t((int32_t(constant.v128.i16[i]) +\n                       int32_t(other->constant.v128.i16[i]) + 1) >>\n                      1);\n        }\n      }\n    } break;\n    case INT32_TYPE: {\n      for (int i = 0; i < 4; i++) {\n        if (is_unsigned) {\n          constant.v128.u32[i] =\n              uint32_t((uint64_t(constant.v128.u32[i]) +\n                        uint64_t(other->constant.v128.u32[i]) + 1) >>\n                       1);\n        } else {\n          constant.v128.i32[i] =\n              int32_t((int64_t(constant.v128.i32[i]) +\n                       int64_t(other->constant.v128.i32[i]) + 1) >>\n                      1);\n        }\n      }\n    } break;\n    default:\n      assert_unhandled_case(type);\n      break;\n  }\n}\n\nvoid Value::ByteSwap() {\n  switch (type) {\n    case INT8_TYPE:\n      constant.i8 = constant.i8;\n      break;\n    case INT16_TYPE:\n      constant.i16 = xe::byte_swap(constant.i16);\n      break;\n    case INT32_TYPE:\n      constant.i32 = xe::byte_swap(constant.i32);\n      break;\n    case INT64_TYPE:\n      constant.i64 = xe::byte_swap(constant.i64);\n      break;\n    case VEC128_TYPE:\n      for (int n = 0; n < 4; n++) {\n        constant.v128.u32[n] = xe::byte_swap(constant.v128.u32[n]);\n      }\n      break;\n    default:\n      assert_unhandled_case(type);\n      break;\n  }\n}\n\nvoid Value::CountLeadingZeros(const Value* other) {\n  switch (other->type) {\n    case INT8_TYPE:\n      constant.i8 = xe::lzcnt(other->constant.i8);\n      break;\n    case INT16_TYPE:\n      constant.i8 = xe::lzcnt(other->constant.i16);\n      break;\n    case INT32_TYPE:\n      constant.i8 = xe::lzcnt(other->constant.i32);\n      break;\n    case INT64_TYPE:\n      constant.i8 = xe::lzcnt(other->constant.i64);\n      break;\n    default:\n      assert_unhandled_case(type);\n      break;\n  }\n}\n\nbool Value::Compare(Opcode opcode, Value* other) {\n  assert_true(type == other->type);\n  switch (other->type) {\n    case INT8_TYPE:\n      return CompareInt8(opcode, this, other);\n    case INT16_TYPE:\n      return CompareInt16(opcode, this, other);\n    case INT32_TYPE:\n      return CompareInt32(opcode, this, other);\n    case INT64_TYPE:\n      return CompareInt64(opcode, this, other);\n    default:\n      assert_unhandled_case(type);\n      return false;\n  }\n}\n\nbool Value::CompareInt8(Opcode opcode, Value* a, Value* b) {\n  switch (opcode) {\n    case OPCODE_COMPARE_EQ:\n      return a->constant.i8 == b->constant.i8;\n    case OPCODE_COMPARE_NE:\n      return a->constant.i8 != b->constant.i8;\n    case OPCODE_COMPARE_SLT:\n      return a->constant.i8 < b->constant.i8;\n    case OPCODE_COMPARE_SLE:\n      return a->constant.i8 <= b->constant.i8;\n    case OPCODE_COMPARE_SGT:\n      return a->constant.i8 > b->constant.i8;\n    case OPCODE_COMPARE_SGE:\n      return a->constant.i8 >= b->constant.i8;\n    case OPCODE_COMPARE_ULT:\n      return uint8_t(a->constant.i8) < uint8_t(b->constant.i8);\n    case OPCODE_COMPARE_ULE:\n      return uint8_t(a->constant.i8) <= uint8_t(b->constant.i8);\n    case OPCODE_COMPARE_UGT:\n      return uint8_t(a->constant.i8) > uint8_t(b->constant.i8);\n    case OPCODE_COMPARE_UGE:\n      return uint8_t(a->constant.i8) >= uint8_t(b->constant.i8);\n    default:\n      assert_unhandled_case(opcode);\n      return false;\n  }\n}\n\nbool Value::CompareInt16(Opcode opcode, Value* a, Value* b) {\n  switch (opcode) {\n    case OPCODE_COMPARE_EQ:\n      return a->constant.i16 == b->constant.i16;\n    case OPCODE_COMPARE_NE:\n      return a->constant.i16 != b->constant.i16;\n    case OPCODE_COMPARE_SLT:\n      return a->constant.i16 < b->constant.i16;\n    case OPCODE_COMPARE_SLE:\n      return a->constant.i16 <= b->constant.i16;\n    case OPCODE_COMPARE_SGT:\n      return a->constant.i16 > b->constant.i16;\n    case OPCODE_COMPARE_SGE:\n      return a->constant.i16 >= b->constant.i16;\n    case OPCODE_COMPARE_ULT:\n      return uint16_t(a->constant.i16) < uint16_t(b->constant.i16);\n    case OPCODE_COMPARE_ULE:\n      return uint16_t(a->constant.i16) <= uint16_t(b->constant.i16);\n    case OPCODE_COMPARE_UGT:\n      return uint16_t(a->constant.i16) > uint16_t(b->constant.i16);\n    case OPCODE_COMPARE_UGE:\n      return uint16_t(a->constant.i16) >= uint16_t(b->constant.i16);\n    default:\n      assert_unhandled_case(opcode);\n      return false;\n  }\n}\n\nbool Value::CompareInt32(Opcode opcode, Value* a, Value* b) {\n  switch (opcode) {\n    case OPCODE_COMPARE_EQ:\n      return a->constant.i32 == b->constant.i32;\n    case OPCODE_COMPARE_NE:\n      return a->constant.i32 != b->constant.i32;\n    case OPCODE_COMPARE_SLT:\n      return a->constant.i32 < b->constant.i32;\n    case OPCODE_COMPARE_SLE:\n      return a->constant.i32 <= b->constant.i32;\n    case OPCODE_COMPARE_SGT:\n      return a->constant.i32 > b->constant.i32;\n    case OPCODE_COMPARE_SGE:\n      return a->constant.i32 >= b->constant.i32;\n    case OPCODE_COMPARE_ULT:\n      return uint32_t(a->constant.i32) < uint32_t(b->constant.i32);\n    case OPCODE_COMPARE_ULE:\n      return uint32_t(a->constant.i32) <= uint32_t(b->constant.i32);\n    case OPCODE_COMPARE_UGT:\n      return uint32_t(a->constant.i32) > uint32_t(b->constant.i32);\n    case OPCODE_COMPARE_UGE:\n      return uint32_t(a->constant.i32) >= uint32_t(b->constant.i32);\n    default:\n      assert_unhandled_case(opcode);\n      return false;\n  }\n}\n\nbool Value::CompareInt64(Opcode opcode, Value* a, Value* b) {\n  switch (opcode) {\n    case OPCODE_COMPARE_EQ:\n      return a->constant.i64 == b->constant.i64;\n    case OPCODE_COMPARE_NE:\n      return a->constant.i64 != b->constant.i64;\n    case OPCODE_COMPARE_SLT:\n      return a->constant.i64 < b->constant.i64;\n    case OPCODE_COMPARE_SLE:\n      return a->constant.i64 <= b->constant.i64;\n    case OPCODE_COMPARE_SGT:\n      return a->constant.i64 > b->constant.i64;\n    case OPCODE_COMPARE_SGE:\n      return a->constant.i64 >= b->constant.i64;\n    case OPCODE_COMPARE_ULT:\n      return uint64_t(a->constant.i64) < uint64_t(b->constant.i64);\n    case OPCODE_COMPARE_ULE:\n      return uint64_t(a->constant.i64) <= uint64_t(b->constant.i64);\n    case OPCODE_COMPARE_UGT:\n      return uint64_t(a->constant.i64) > uint64_t(b->constant.i64);\n    case OPCODE_COMPARE_UGE:\n      return uint64_t(a->constant.i64) >= uint64_t(b->constant.i64);\n    default:\n      assert_unhandled_case(opcode);\n      return false;\n  }\n}\n\n}  // namespace hir\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/hir/value.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_HIR_VALUE_H_\n#define XENIA_CPU_HIR_VALUE_H_\n\n#include \"xenia/base/arena.h\"\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/vec128.h\"\n#include \"xenia/cpu/backend/machine_info.h\"\n#include \"xenia/cpu/hir/opcodes.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace hir {\n\nclass Instr;\n\nusing vec128_t = xe::vec128_t;\n\nenum TypeName {\n  // Many tables rely on this ordering.\n  INT8_TYPE = 0,\n  INT16_TYPE = 1,\n  INT32_TYPE = 2,\n  INT64_TYPE = 3,\n  FLOAT32_TYPE = 4,\n  FLOAT64_TYPE = 5,\n  VEC128_TYPE = 6,\n  MAX_TYPENAME,\n};\n\ninline size_t GetTypeSize(TypeName type_name) {\n  switch (type_name) {\n    case INT8_TYPE:\n      return 1;\n    case INT16_TYPE:\n      return 2;\n    case INT32_TYPE:\n      return 4;\n    case INT64_TYPE:\n      return 8;\n    case FLOAT32_TYPE:\n      return 4;\n    case FLOAT64_TYPE:\n      return 8;\n    case VEC128_TYPE:\n      return 16;\n    default:\n      assert_unhandled_case(type_name);\n      return 0;\n  }\n}\n\nenum ValueFlags {\n  VALUE_IS_CONSTANT = (1 << 1),\n  VALUE_IS_ALLOCATED = (1 << 2),  // Used by backends. Do not set.\n};\n\nstruct RegAssignment {\n  const backend::MachineInfo::RegisterSet* set;\n  int32_t index;\n};\n\nclass Value {\n public:\n  typedef struct Use_s {\n    Instr* instr;\n    Use_s* prev;\n    Use_s* next;\n  } Use;\n  typedef union {\n    int8_t i8;\n    uint8_t u8;\n    int16_t i16;\n    uint16_t u16;\n    int32_t i32;\n    uint32_t u32;\n    int64_t i64;\n    uint64_t u64;\n    float f32;\n    double f64;\n    vec128_t v128;\n  } ConstantValue;\n\n public:\n  uint32_t ordinal;\n  TypeName type;\n\n  uint32_t flags;\n  RegAssignment reg;\n  ConstantValue constant;\n\n  Instr* def;\n  Use* use_head;\n  // NOTE: for performance reasons this is not maintained during construction.\n  Instr* last_use;\n  Value* local_slot;\n\n  // TODO(benvanik): remove to shrink size.\n  void* tag;\n\n  Use* AddUse(Arena* arena, Instr* instr);\n  void RemoveUse(Use* use);\n\n  void set_zero(TypeName new_type) {\n    type = new_type;\n    flags |= VALUE_IS_CONSTANT;\n    constant.v128.low = constant.v128.high = 0;\n  }\n  void set_constant(int8_t value) {\n    type = INT8_TYPE;\n    flags |= VALUE_IS_CONSTANT;\n    constant.i64 = int64_t(value);\n  }\n  void set_constant(uint8_t value) {\n    type = INT8_TYPE;\n    flags |= VALUE_IS_CONSTANT;\n    constant.i64 = uint64_t(value);\n  }\n  void set_constant(int16_t value) {\n    type = INT16_TYPE;\n    flags |= VALUE_IS_CONSTANT;\n    constant.i64 = int64_t(value);\n  }\n  void set_constant(uint16_t value) {\n    type = INT16_TYPE;\n    flags |= VALUE_IS_CONSTANT;\n    constant.i64 = uint64_t(value);\n  }\n  void set_constant(int32_t value) {\n    type = INT32_TYPE;\n    flags |= VALUE_IS_CONSTANT;\n    constant.i64 = int64_t(value);\n  }\n  void set_constant(uint32_t value) {\n    type = INT32_TYPE;\n    flags |= VALUE_IS_CONSTANT;\n    constant.i64 = uint64_t(value);\n  }\n  void set_constant(int64_t value) {\n    type = INT64_TYPE;\n    flags |= VALUE_IS_CONSTANT;\n    constant.i64 = value;\n  }\n  void set_constant(uint64_t value) {\n    type = INT64_TYPE;\n    flags |= VALUE_IS_CONSTANT;\n    constant.i64 = value;\n  }\n  void set_constant(float value) {\n    type = FLOAT32_TYPE;\n    flags |= VALUE_IS_CONSTANT;\n    constant.f32 = value;\n  }\n  void set_constant(double value) {\n    type = FLOAT64_TYPE;\n    flags |= VALUE_IS_CONSTANT;\n    constant.f64 = value;\n  }\n  void set_constant(const vec128_t& value) {\n    type = VEC128_TYPE;\n    flags |= VALUE_IS_CONSTANT;\n    constant.v128 = value;\n  }\n  void set_from(const Value* other) {\n    assert_true(other->IsConstant());\n    type = other->type;\n    flags = other->flags;\n    constant.v128 = other->constant.v128;\n  }\n\n  inline bool IsConstant() const { return !!(flags & VALUE_IS_CONSTANT); }\n  bool IsConstantTrue() const {\n    if (type == VEC128_TYPE) {\n      assert_always();\n    }\n    if (flags & VALUE_IS_CONSTANT) {\n      switch (type) {\n        case INT8_TYPE:\n          return !!constant.i8;\n        case INT16_TYPE:\n          return !!constant.i16;\n        case INT32_TYPE:\n          return !!constant.i32;\n        case INT64_TYPE:\n          return !!constant.i64;\n        case FLOAT32_TYPE:\n          return !!constant.f32;\n        case FLOAT64_TYPE:\n          return !!constant.f64;\n        case VEC128_TYPE:\n          return constant.v128.low || constant.v128.high;\n        default:\n          assert_unhandled_case(type);\n          return false;\n      }\n    } else {\n      return false;\n    }\n  }\n  bool IsConstantFalse() const {\n    if (flags & VALUE_IS_CONSTANT) {\n      switch (type) {\n        case INT8_TYPE:\n          return !constant.i8;\n        case INT16_TYPE:\n          return !constant.i16;\n        case INT32_TYPE:\n          return !constant.i32;\n        case INT64_TYPE:\n          return !constant.i64;\n        case FLOAT32_TYPE:\n          return !constant.f32;\n        case FLOAT64_TYPE:\n          return !constant.f64;\n        case VEC128_TYPE:\n          return !(constant.v128.low || constant.v128.high);\n        default:\n          assert_unhandled_case(type);\n          return false;\n      }\n    } else {\n      return false;\n    }\n  }\n  bool IsConstantZero() const {\n    if (flags & VALUE_IS_CONSTANT) {\n      switch (type) {\n        case INT8_TYPE:\n          return !constant.i8;\n        case INT16_TYPE:\n          return !constant.i16;\n        case INT32_TYPE:\n          return !constant.i32;\n        case INT64_TYPE:\n          return !constant.i64;\n        case FLOAT32_TYPE:\n          return !constant.f32;\n        case FLOAT64_TYPE:\n          return !constant.f64;\n        case VEC128_TYPE:\n          return !constant.v128.low && !constant.v128.high;\n        default:\n          assert_unhandled_case(type);\n          return false;\n      }\n    } else {\n      return false;\n    }\n  }\n  bool IsConstantOne() const {\n    if (flags & VALUE_IS_CONSTANT) {\n      switch (type) {\n        case INT8_TYPE:\n          return constant.i8 == 1;\n        case INT16_TYPE:\n          return constant.i16 == 1;\n        case INT32_TYPE:\n          return constant.i32 == 1;\n        case INT64_TYPE:\n          return constant.i64 == 1;\n        case FLOAT32_TYPE:\n          return constant.f32 == 1.f;\n        case FLOAT64_TYPE:\n          return constant.f64 == 1.0;\n        default:\n          assert_unhandled_case(type);\n          return false;\n      }\n    } else {\n      return false;\n    }\n  }\n  bool IsConstantEQ(Value* other) const {\n    if (type == VEC128_TYPE) {\n      assert_always();\n    }\n    if ((flags & VALUE_IS_CONSTANT) && (other->flags & VALUE_IS_CONSTANT)) {\n      switch (type) {\n        case INT8_TYPE:\n          return constant.i8 == other->constant.i8;\n        case INT16_TYPE:\n          return constant.i16 == other->constant.i16;\n        case INT32_TYPE:\n          return constant.i32 == other->constant.i32;\n        case INT64_TYPE:\n          return constant.i64 == other->constant.i64;\n        case FLOAT32_TYPE:\n          return constant.f32 == other->constant.f32;\n        case FLOAT64_TYPE:\n          return constant.f64 == other->constant.f64;\n        default:\n          assert_unhandled_case(type);\n          return false;\n      }\n    } else {\n      return false;\n    }\n  }\n  bool IsConstantNE(Value* other) const {\n    if (type == VEC128_TYPE) {\n      assert_always();\n    }\n    if ((flags & VALUE_IS_CONSTANT) && (other->flags & VALUE_IS_CONSTANT)) {\n      switch (type) {\n        case INT8_TYPE:\n          return constant.i8 != other->constant.i8;\n        case INT16_TYPE:\n          return constant.i16 != other->constant.i16;\n        case INT32_TYPE:\n          return constant.i32 != other->constant.i32;\n        case INT64_TYPE:\n          return constant.i64 != other->constant.i64;\n        case FLOAT32_TYPE:\n          return constant.f32 != other->constant.f32;\n        case FLOAT64_TYPE:\n          return constant.f64 != other->constant.f64;\n        default:\n          assert_unhandled_case(type);\n          return false;\n      }\n    } else {\n      return false;\n    }\n  }\n  bool IsConstantSLT(Value* other) const {\n    assert_true(flags & VALUE_IS_CONSTANT && other->flags & VALUE_IS_CONSTANT);\n    switch (type) {\n      case INT8_TYPE:\n        return constant.i8 < other->constant.i8;\n      case INT16_TYPE:\n        return constant.i16 < other->constant.i16;\n      case INT32_TYPE:\n        return constant.i32 < other->constant.i32;\n      case INT64_TYPE:\n        return constant.i64 < other->constant.i64;\n      case FLOAT32_TYPE:\n        return constant.f32 < other->constant.f32;\n      case FLOAT64_TYPE:\n        return constant.f64 < other->constant.f64;\n      default:\n        assert_always();\n        return false;\n    }\n  }\n  bool IsConstantSLE(Value* other) const {\n    assert_true(flags & VALUE_IS_CONSTANT && other->flags & VALUE_IS_CONSTANT);\n    switch (type) {\n      case INT8_TYPE:\n        return constant.i8 <= other->constant.i8;\n      case INT16_TYPE:\n        return constant.i16 <= other->constant.i16;\n      case INT32_TYPE:\n        return constant.i32 <= other->constant.i32;\n      case INT64_TYPE:\n        return constant.i64 <= other->constant.i64;\n      case FLOAT32_TYPE:\n        return constant.f32 <= other->constant.f32;\n      case FLOAT64_TYPE:\n        return constant.f64 <= other->constant.f64;\n      default:\n        assert_always();\n        return false;\n    }\n  }\n  bool IsConstantSGT(Value* other) const {\n    assert_true(flags & VALUE_IS_CONSTANT && other->flags & VALUE_IS_CONSTANT);\n    switch (type) {\n      case INT8_TYPE:\n        return constant.i8 > other->constant.i8;\n      case INT16_TYPE:\n        return constant.i16 > other->constant.i16;\n      case INT32_TYPE:\n        return constant.i32 > other->constant.i32;\n      case INT64_TYPE:\n        return constant.i64 > other->constant.i64;\n      case FLOAT32_TYPE:\n        return constant.f32 > other->constant.f32;\n      case FLOAT64_TYPE:\n        return constant.f64 > other->constant.f64;\n      default:\n        assert_always();\n        return false;\n    }\n  }\n  bool IsConstantSGE(Value* other) const {\n    assert_true(flags & VALUE_IS_CONSTANT && other->flags & VALUE_IS_CONSTANT);\n    switch (type) {\n      case INT8_TYPE:\n        return constant.i8 >= other->constant.i8;\n      case INT16_TYPE:\n        return constant.i16 >= other->constant.i16;\n      case INT32_TYPE:\n        return constant.i32 >= other->constant.i32;\n      case INT64_TYPE:\n        return constant.i64 >= other->constant.i64;\n      case FLOAT32_TYPE:\n        return constant.f32 >= other->constant.f32;\n      case FLOAT64_TYPE:\n        return constant.f64 >= other->constant.f64;\n      default:\n        assert_always();\n        return false;\n    }\n  }\n  bool IsConstantULT(Value* other) const {\n    assert_true(flags & VALUE_IS_CONSTANT && other->flags & VALUE_IS_CONSTANT);\n    switch (type) {\n      case INT8_TYPE:\n        return (uint8_t)constant.i8 < (uint8_t)other->constant.i8;\n      case INT16_TYPE:\n        return (uint16_t)constant.i16 < (uint16_t)other->constant.i16;\n      case INT32_TYPE:\n        return (uint32_t)constant.i32 < (uint32_t)other->constant.i32;\n      case INT64_TYPE:\n        return (uint64_t)constant.i64 < (uint64_t)other->constant.i64;\n      case FLOAT32_TYPE:\n        return constant.f32 < other->constant.f32;\n      case FLOAT64_TYPE:\n        return constant.f64 < other->constant.f64;\n      default:\n        assert_always();\n        return false;\n    }\n  }\n  bool IsConstantULE(Value* other) const {\n    assert_true(flags & VALUE_IS_CONSTANT && other->flags & VALUE_IS_CONSTANT);\n    switch (type) {\n      case INT8_TYPE:\n        return (uint8_t)constant.i8 <= (uint8_t)other->constant.i8;\n      case INT16_TYPE:\n        return (uint16_t)constant.i16 <= (uint16_t)other->constant.i16;\n      case INT32_TYPE:\n        return (uint32_t)constant.i32 <= (uint32_t)other->constant.i32;\n      case INT64_TYPE:\n        return (uint64_t)constant.i64 <= (uint64_t)other->constant.i64;\n      case FLOAT32_TYPE:\n        return constant.f32 <= other->constant.f32;\n      case FLOAT64_TYPE:\n        return constant.f64 <= other->constant.f64;\n      default:\n        assert_always();\n        return false;\n    }\n  }\n  bool IsConstantUGT(Value* other) const {\n    assert_true(flags & VALUE_IS_CONSTANT && other->flags & VALUE_IS_CONSTANT);\n    switch (type) {\n      case INT8_TYPE:\n        return (uint8_t)constant.i8 > (uint8_t)other->constant.i8;\n      case INT16_TYPE:\n        return (uint16_t)constant.i16 > (uint16_t)other->constant.i16;\n      case INT32_TYPE:\n        return (uint32_t)constant.i32 > (uint32_t)other->constant.i32;\n      case INT64_TYPE:\n        return (uint64_t)constant.i64 > (uint64_t)other->constant.i64;\n      case FLOAT32_TYPE:\n        return constant.f32 > other->constant.f32;\n      case FLOAT64_TYPE:\n        return constant.f64 > other->constant.f64;\n      default:\n        assert_always();\n        return false;\n    }\n  }\n  bool IsConstantUGE(Value* other) const {\n    assert_true(flags & VALUE_IS_CONSTANT && other->flags & VALUE_IS_CONSTANT);\n    switch (type) {\n      case INT8_TYPE:\n        return (uint8_t)constant.i8 >= (uint8_t)other->constant.i8;\n      case INT16_TYPE:\n        return (uint16_t)constant.i16 >= (uint16_t)other->constant.i16;\n      case INT32_TYPE:\n        return (uint32_t)constant.i32 >= (uint32_t)other->constant.i32;\n      case INT64_TYPE:\n        return (uint64_t)constant.i64 >= (uint64_t)other->constant.i64;\n      case FLOAT32_TYPE:\n        return constant.f32 >= other->constant.f32;\n      case FLOAT64_TYPE:\n        return constant.f64 >= other->constant.f64;\n      default:\n        assert_always();\n        return false;\n    }\n  }\n  uint32_t AsUint32();\n  uint64_t AsUint64();\n\n  void Cast(TypeName target_type);\n  void ZeroExtend(TypeName target_type);\n  void SignExtend(TypeName target_type);\n  void Truncate(TypeName target_type);\n  void Convert(TypeName target_type, RoundMode round_mode);\n  void Round(RoundMode round_mode);\n  bool Add(Value* other);\n  bool Sub(Value* other);\n  void Mul(Value* other);\n  void MulHi(Value* other, bool is_unsigned);\n  void Div(Value* other, bool is_unsigned);\n  void Max(Value* other);\n  static void MulAdd(Value* dest, Value* value1, Value* value2, Value* value3);\n  static void MulSub(Value* dest, Value* value1, Value* value2, Value* value3);\n  void Neg();\n  void Abs();\n  void Sqrt();\n  void RSqrt();\n  void Recip();\n  void And(Value* other);\n  void Or(Value* other);\n  void Xor(Value* other);\n  void Not();\n  void Shl(Value* other);\n  void Shr(Value* other);\n  void Sha(Value* other);\n  void Extract(Value* vec, Value* index);\n  void Select(Value* other, Value* ctrl);\n  void Splat(Value* other);\n  void VectorCompareEQ(Value* other, TypeName type);\n  void VectorCompareSGT(Value* other, TypeName type);\n  void VectorCompareSGE(Value* other, TypeName type);\n  void VectorCompareUGT(Value* other, TypeName type);\n  void VectorCompareUGE(Value* other, TypeName type);\n  void VectorConvertI2F(Value* other, bool is_unsigned);\n  void VectorConvertF2I(Value* other, bool is_unsigned);\n  void VectorShl(Value* other, TypeName type);\n  void VectorShr(Value* other, TypeName type);\n  void VectorRol(Value* other, TypeName type);\n  void VectorAdd(Value* other, TypeName type, bool is_unsigned, bool saturate);\n  void VectorSub(Value* other, TypeName type, bool is_unsigned, bool saturate);\n  void DotProduct3(Value* other);\n  void DotProduct4(Value* other);\n  void VectorAverage(Value* other, TypeName type, bool is_unsigned,\n                     bool saturate);\n  void ByteSwap();\n  void CountLeadingZeros(const Value* other);\n  bool Compare(Opcode opcode, Value* other);\n\n private:\n  static bool CompareInt8(Opcode opcode, Value* a, Value* b);\n  static bool CompareInt16(Opcode opcode, Value* a, Value* b);\n  static bool CompareInt32(Opcode opcode, Value* a, Value* b);\n  static bool CompareInt64(Opcode opcode, Value* a, Value* b);\n};\n\n}  // namespace hir\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_HIR_VALUE_H_\n"
  },
  {
    "path": "src/xenia/cpu/lzx.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/lzx.h\"\n\n#include <algorithm>\n#include <climits>\n\n#include \"xenia/base/byte_order.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/memory.h\"\n#include \"xenia/kernel/util/xex2_info.h\"\n\n#include \"third_party/mspack/lzx.h\"\n#include \"third_party/mspack/mspack.h\"\n\ntypedef struct mspack_memory_file_t {\n  mspack_system sys;\n  void* buffer;\n  off_t buffer_size;\n  off_t offset;\n} mspack_memory_file;\n\nmspack_memory_file* mspack_memory_open(mspack_system* sys, void* buffer,\n                                       const size_t buffer_size) {\n  assert_true(buffer_size < INT_MAX);\n  if (buffer_size >= INT_MAX) {\n    return NULL;\n  }\n  auto memfile =\n      (mspack_memory_file*)std::calloc(1, sizeof(mspack_memory_file));\n  if (!memfile) {\n    return NULL;\n  }\n  memfile->buffer = buffer;\n  memfile->buffer_size = (off_t)buffer_size;\n  memfile->offset = 0;\n  return memfile;\n}\n\nvoid mspack_memory_close(mspack_memory_file* file) {\n  auto memfile = (mspack_memory_file*)file;\n  std::free(memfile);\n}\n\nint mspack_memory_read(mspack_file* file, void* buffer, int chars) {\n  auto memfile = (mspack_memory_file*)file;\n  const off_t remaining = memfile->buffer_size - memfile->offset;\n  const off_t total = std::min(static_cast<off_t>(chars), remaining);\n  std::memcpy(buffer, (uint8_t*)memfile->buffer + memfile->offset, total);\n  memfile->offset += total;\n  return (int)total;\n}\n\nint mspack_memory_write(mspack_file* file, void* buffer, int chars) {\n  auto memfile = (mspack_memory_file*)file;\n  const off_t remaining = memfile->buffer_size - memfile->offset;\n  const off_t total = std::min(static_cast<off_t>(chars), remaining);\n  std::memcpy((uint8_t*)memfile->buffer + memfile->offset, buffer, total);\n  memfile->offset += total;\n  return (int)total;\n}\n\nvoid* mspack_memory_alloc(mspack_system* sys, size_t chars) {\n  return std::calloc(chars, 1);\n}\n\nvoid mspack_memory_free(void* ptr) { std::free(ptr); }\n\nvoid mspack_memory_copy(void* src, void* dest, size_t chars) {\n  std::memcpy(dest, src, chars);\n}\n\nmspack_system* mspack_memory_sys_create() {\n  auto sys = (mspack_system*)std::calloc(1, sizeof(mspack_system));\n  if (!sys) {\n    return NULL;\n  }\n  sys->read = mspack_memory_read;\n  sys->write = mspack_memory_write;\n  sys->alloc = mspack_memory_alloc;\n  sys->free = mspack_memory_free;\n  sys->copy = mspack_memory_copy;\n  return sys;\n}\n\nvoid mspack_memory_sys_destroy(struct mspack_system* sys) { free(sys); }\n\nint lzx_decompress(const void* lzx_data, size_t lzx_len, void* dest,\n                   size_t dest_len, uint32_t window_size, void* window_data,\n                   size_t window_data_len) {\n  int result_code = 1;\n\n  uint32_t window_bits;\n  if (!xe::bit_scan_forward(window_size, &window_bits)) {\n    return result_code;\n  }\n\n  mspack_system* sys = mspack_memory_sys_create();\n  mspack_memory_file* lzxsrc =\n      mspack_memory_open(sys, (void*)lzx_data, lzx_len);\n  mspack_memory_file* lzxdst = mspack_memory_open(sys, dest, dest_len);\n  lzxd_stream* lzxd = lzxd_init(sys, (mspack_file*)lzxsrc, (mspack_file*)lzxdst,\n                                window_bits, 0, 0x8000, (off_t)dest_len, 0);\n\n  if (lzxd) {\n    if (window_data) {\n      // zero the window and then copy window_data to the end of it\n      auto padding_len = window_size - window_data_len;\n      std::memset(&lzxd->window[0], 0, padding_len);\n      std::memcpy(&lzxd->window[padding_len], window_data, window_data_len);\n      // TODO(gibbed): should this be set regardless if source window data is\n      // available or not?\n      lzxd->ref_data_size = window_size;\n    }\n\n    result_code = lzxd_decompress(lzxd, (off_t)dest_len);\n\n    lzxd_free(lzxd);\n    lzxd = NULL;\n  }\n\n  if (lzxsrc) {\n    mspack_memory_close(lzxsrc);\n    lzxsrc = NULL;\n  }\n\n  if (lzxdst) {\n    mspack_memory_close(lzxdst);\n    lzxdst = NULL;\n  }\n\n  if (sys) {\n    mspack_memory_sys_destroy(sys);\n    sys = NULL;\n  }\n\n  return result_code;\n}\n\nint lzxdelta_apply_patch(xe::xex2_delta_patch* patch, size_t patch_len,\n                         uint32_t window_size, void* dest) {\n  void* patch_end = (char*)patch + patch_len;\n  auto* cur_patch = patch;\n\n  while (patch_end > cur_patch) {\n    int patch_sz = -4;  // 0 byte patches need us to remove 4 byte from next\n                        // patch addr because of patch_data field\n    if (cur_patch->compressed_len == 0 && cur_patch->uncompressed_len == 0 &&\n        cur_patch->new_addr == 0 && cur_patch->old_addr == 0)\n      break;\n    switch (cur_patch->compressed_len) {\n      case 0:  // fill with 0\n        std::memset((char*)dest + cur_patch->new_addr, 0,\n                    cur_patch->uncompressed_len);\n        break;\n      case 1:  // copy from old -> new\n        std::memcpy((char*)dest + cur_patch->new_addr,\n                    (char*)dest + cur_patch->old_addr,\n                    cur_patch->uncompressed_len);\n        break;\n      default:  // delta patch\n        patch_sz =\n            cur_patch->compressed_len - 4;  // -4 because of patch_data field\n\n        int result = lzx_decompress(\n            cur_patch->patch_data, cur_patch->compressed_len,\n            (char*)dest + cur_patch->new_addr, cur_patch->uncompressed_len,\n            window_size, (char*)dest + cur_patch->old_addr,\n            cur_patch->uncompressed_len);\n\n        if (result) {\n          return result;\n        }\n        break;\n    }\n\n    cur_patch++;\n    cur_patch = (xe::xex2_delta_patch*)((char*)cur_patch +\n                                        patch_sz);  // TODO: make this less ugly\n  }\n\n  return 0;\n}\n"
  },
  {
    "path": "src/xenia/cpu/lzx.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_LZX_H_\n#define XENIA_CPU_LZX_H_\n\n#include <string>\n#include <vector>\n\n#include \"xenia/cpu/module.h\"\n\nnamespace xe {\nstruct xex2_delta_patch;\n}  // namespace xe\n\nint lzx_decompress(const void* lzx_data, size_t lzx_len, void* dest,\n                   size_t dest_len, uint32_t window_size, void* window_data,\n                   size_t window_data_len);\n\nint lzxdelta_apply_patch(xe::xex2_delta_patch* patch, size_t patch_len,\n                         uint32_t window_size, void* dest);\n\n#endif  // XENIA_CPU_LZX_H_\n"
  },
  {
    "path": "src/xenia/cpu/mmio_handler.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/mmio_handler.h\"\n\n#include <algorithm>\n#include <cstring>\n#include <utility>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/byte_order.h\"\n#include \"xenia/base/exception_handler.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/memory.h\"\n#include \"xenia/base/platform.h\"\n\nnamespace xe {\nnamespace cpu {\n\nMMIOHandler* MMIOHandler::global_handler_ = nullptr;\n\nstd::unique_ptr<MMIOHandler> MMIOHandler::Install(\n    uint8_t* virtual_membase, uint8_t* physical_membase, uint8_t* membase_end,\n    HostToGuestVirtual host_to_guest_virtual,\n    const void* host_to_guest_virtual_context,\n    AccessViolationCallback access_violation_callback,\n    void* access_violation_callback_context) {\n  // There can be only one handler at a time.\n  assert_null(global_handler_);\n  if (global_handler_) {\n    return nullptr;\n  }\n\n  auto handler = std::unique_ptr<MMIOHandler>(new MMIOHandler(\n      virtual_membase, physical_membase, membase_end, host_to_guest_virtual,\n      host_to_guest_virtual_context, access_violation_callback,\n      access_violation_callback_context));\n\n  // Install the exception handler directed at the MMIOHandler.\n  ExceptionHandler::Install(ExceptionCallbackThunk, handler.get());\n\n  global_handler_ = handler.get();\n  return handler;\n}\n\nMMIOHandler::MMIOHandler(uint8_t* virtual_membase, uint8_t* physical_membase,\n                         uint8_t* membase_end,\n                         HostToGuestVirtual host_to_guest_virtual,\n                         const void* host_to_guest_virtual_context,\n                         AccessViolationCallback access_violation_callback,\n                         void* access_violation_callback_context)\n    : virtual_membase_(virtual_membase),\n      physical_membase_(physical_membase),\n      memory_end_(membase_end),\n      host_to_guest_virtual_(host_to_guest_virtual),\n      host_to_guest_virtual_context_(host_to_guest_virtual_context),\n      access_violation_callback_(access_violation_callback),\n      access_violation_callback_context_(access_violation_callback_context) {}\n\nMMIOHandler::~MMIOHandler() {\n  ExceptionHandler::Uninstall(ExceptionCallbackThunk, this);\n\n  assert_true(global_handler_ == this);\n  global_handler_ = nullptr;\n}\n\nbool MMIOHandler::RegisterRange(uint32_t virtual_address, uint32_t mask,\n                                uint32_t size, void* context,\n                                MMIOReadCallback read_callback,\n                                MMIOWriteCallback write_callback) {\n  mapped_ranges_.push_back({\n      virtual_address,\n      mask,\n      size,\n      context,\n      read_callback,\n      write_callback,\n  });\n  return true;\n}\n\nMMIORange* MMIOHandler::LookupRange(uint32_t virtual_address) {\n  for (auto& range : mapped_ranges_) {\n    if ((virtual_address & range.mask) == range.address) {\n      return &range;\n    }\n  }\n  return nullptr;\n}\n\nbool MMIOHandler::CheckLoad(uint32_t virtual_address, uint32_t* out_value) {\n  for (const auto& range : mapped_ranges_) {\n    if ((virtual_address & range.mask) == range.address) {\n      *out_value = static_cast<uint32_t>(\n          range.read(nullptr, range.callback_context, virtual_address));\n      return true;\n    }\n  }\n  return false;\n}\n\nbool MMIOHandler::CheckStore(uint32_t virtual_address, uint32_t value) {\n  for (const auto& range : mapped_ranges_) {\n    if ((virtual_address & range.mask) == range.address) {\n      range.write(nullptr, range.callback_context, virtual_address, value);\n      return true;\n    }\n  }\n  return false;\n}\n\nbool MMIOHandler::TryDecodeLoadStore(const uint8_t* p,\n                                     DecodedLoadStore& decoded_out) {\n  std::memset(&decoded_out, 0, sizeof(decoded_out));\n#if XE_ARCH_AMD64\n  uint8_t i = 0;  // Current byte decode index.\n  uint8_t rex = 0;\n  if ((p[i] & 0xF0) == 0x40) {\n    rex = p[0];\n    ++i;\n  }\n  if (p[i] == 0x0F && p[i + 1] == 0x38 && p[i + 2] == 0xF1) {\n    // MOVBE m32, r32 (store)\n    // https://web.archive.org/web/20170629091435/https://www.tptp.cc/mirrors/siyobik.info/instruction/MOVBE.html\n    // 44 0f 38 f1 a4 02 00     movbe  DWORD PTR [rdx+rax*1+0x0],r12d\n    // 42 0f 38 f1 8c 22 00     movbe  DWORD PTR [rdx+r12*1+0x0],ecx\n    // 0f 38 f1 8c 02 00 00     movbe  DWORD PTR [rdx + rax * 1 + 0x0], ecx\n    decoded_out.is_load = false;\n    decoded_out.byte_swap = true;\n    i += 3;\n  } else if (p[i] == 0x0F && p[i + 1] == 0x38 && p[i + 2] == 0xF0) {\n    // MOVBE r32, m32 (load)\n    // https://web.archive.org/web/20170629091435/https://www.tptp.cc/mirrors/siyobik.info/instruction/MOVBE.html\n    // 44 0f 38 f0 a4 02 00     movbe  r12d,DWORD PTR [rdx+rax*1+0x0]\n    // 42 0f 38 f0 8c 22 00     movbe  ecx,DWORD PTR [rdx+r12*1+0x0]\n    // 46 0f 38 f0 a4 22 00     movbe  r12d,DWORD PTR [rdx+r12*1+0x0]\n    // 0f 38 f0 8c 02 00 00     movbe  ecx,DWORD PTR [rdx+rax*1+0x0]\n    // 0F 38 F0 1C 02           movbe  ebx,dword ptr [rdx+rax]\n    decoded_out.is_load = true;\n    decoded_out.byte_swap = true;\n    i += 3;\n  } else if (p[i] == 0x89) {\n    // MOV m32, r32 (store)\n    // https://web.archive.org/web/20170629072136/https://www.tptp.cc/mirrors/siyobik.info/instruction/MOV.html\n    // 44 89 24 02              mov  DWORD PTR[rdx + rax * 1], r12d\n    // 42 89 0c 22              mov  DWORD PTR[rdx + r12 * 1], ecx\n    // 89 0c 02                 mov  DWORD PTR[rdx + rax * 1], ecx\n    decoded_out.is_load = false;\n    decoded_out.byte_swap = false;\n    ++i;\n  } else if (p[i] == 0x8B) {\n    // MOV r32, m32 (load)\n    // https://web.archive.org/web/20170629072136/https://www.tptp.cc/mirrors/siyobik.info/instruction/MOV.html\n    // 44 8b 24 02              mov  r12d, DWORD PTR[rdx + rax * 1]\n    // 42 8b 0c 22              mov  ecx, DWORD PTR[rdx + r12 * 1]\n    // 46 8b 24 22              mov  r12d, DWORD PTR[rdx + r12 * 1]\n    // 8b 0c 02                 mov  ecx, DWORD PTR[rdx + rax * 1]\n    decoded_out.is_load = true;\n    decoded_out.byte_swap = false;\n    ++i;\n  } else if (p[i] == 0xC7) {\n    // MOV m32, simm32\n    // https://web.archive.org/web/20161017042413/https://www.asmpedia.org/index.php?title=MOV\n    // C7 04 02 02 00 00 00     mov  dword ptr [rdx+rax],2\n    decoded_out.is_load = false;\n    decoded_out.byte_swap = false;\n    decoded_out.is_constant = true;\n    ++i;\n  } else {\n    return false;\n  }\n\n  uint8_t rex_b = rex & 0b0001;\n  uint8_t rex_x = rex & 0b0010;\n  uint8_t rex_r = rex & 0b0100;\n  uint8_t rex_w = rex & 0b1000;\n\n  // http://www.sandpile.org/x86/opc_rm.htm\n  // http://www.sandpile.org/x86/opc_sib.htm\n  uint8_t modrm = p[i++];\n  uint8_t mod = (modrm & 0b11000000) >> 6;\n  uint8_t reg = (modrm & 0b00111000) >> 3;\n  uint8_t rm = (modrm & 0b00000111);\n  decoded_out.value_reg = reg + (rex_r ? 8 : 0);\n  decoded_out.mem_has_base = false;\n  decoded_out.mem_base_reg = 0;\n  decoded_out.mem_has_index = false;\n  decoded_out.mem_index_reg = 0;\n  decoded_out.mem_scale = 1;\n  decoded_out.mem_displacement = 0;\n  bool has_sib = false;\n  switch (rm) {\n    case 0b100:  // SIB\n      has_sib = true;\n      break;\n    case 0b101:\n      if (mod == 0b00) {\n        // RIP-relative not supported.\n        return false;\n      }\n      decoded_out.mem_has_base = true;\n      decoded_out.mem_base_reg = rm + (rex_b ? 8 : 0);\n      break;\n    default:\n      decoded_out.mem_has_base = true;\n      decoded_out.mem_base_reg = rm + (rex_b ? 8 : 0);\n      break;\n  }\n  if (has_sib) {\n    uint8_t sib = p[i++];\n    decoded_out.mem_scale = 1 << ((sib & 0b11000000) >> 8);\n    uint8_t sib_index = (sib & 0b00111000) >> 3;\n    uint8_t sib_base = (sib & 0b00000111);\n    switch (sib_index) {\n      case 0b100:\n        // No index.\n        break;\n      default:\n        decoded_out.mem_has_index = true;\n        decoded_out.mem_index_reg = sib_index + (rex_x ? 8 : 0);\n        decoded_out.mem_index_size = sizeof(uint64_t);\n        break;\n    }\n    switch (sib_base) {\n      case 0b101:\n        // Alternate rbp-relative addressing not supported.\n        assert_zero(mod);\n        return false;\n      default:\n        decoded_out.mem_has_base = true;\n        decoded_out.mem_base_reg = sib_base + (rex_b ? 8 : 0);\n        break;\n    }\n  }\n  switch (mod) {\n    case 0b00: {\n      decoded_out.mem_displacement += 0;\n    } break;\n    case 0b01: {\n      decoded_out.mem_displacement += int8_t(p[i++]);\n    } break;\n    case 0b10: {\n      decoded_out.mem_displacement += xe::load<int32_t>(p + i);\n      i += 4;\n    } break;\n  }\n  if (decoded_out.is_constant) {\n    decoded_out.constant = xe::load<int32_t>(p + i);\n    i += 4;\n  }\n  decoded_out.length = i;\n  return true;\n\n#elif XE_ARCH_ARM64\n  decoded_out.length = sizeof(uint32_t);\n  uint32_t instruction = *reinterpret_cast<const uint32_t*>(p);\n\n  // Literal loading (PC-relative) is not handled.\n\n  if ((instruction & kArm64LoadStoreAnyFMask) != kArm64LoadStoreAnyFixed) {\n    // Not a load or a store instruction.\n    return false;\n  }\n\n  if ((instruction & kArm64LoadStorePairAnyFMask) ==\n      kArm64LoadStorePairAnyFixed) {\n    // Handling MMIO only for single 32-bit values, not for pairs.\n    return false;\n  }\n\n  uint8_t value_reg_base;\n  switch (Arm64LoadStoreOp(instruction & kArm64LoadStoreMask)) {\n    case Arm64LoadStoreOp::kSTR_w:\n      decoded_out.is_load = false;\n      value_reg_base = DecodedLoadStore::kArm64ValueRegX0;\n      break;\n    case Arm64LoadStoreOp::kLDR_w:\n      decoded_out.is_load = true;\n      value_reg_base = DecodedLoadStore::kArm64ValueRegX0;\n      break;\n    case Arm64LoadStoreOp::kSTR_s:\n      decoded_out.is_load = false;\n      value_reg_base = DecodedLoadStore::kArm64ValueRegV0;\n      break;\n    case Arm64LoadStoreOp::kLDR_s:\n      decoded_out.is_load = true;\n      value_reg_base = DecodedLoadStore::kArm64ValueRegV0;\n      break;\n    default:\n      return false;\n  }\n\n  // `Rt` field (load / store register).\n  decoded_out.value_reg = value_reg_base + (instruction & 31);\n  if (decoded_out.is_load &&\n      decoded_out.value_reg == DecodedLoadStore::kArm64ValueRegZero) {\n    // Zero constant rather than a register read.\n    decoded_out.is_constant = true;\n    decoded_out.constant = 0;\n  }\n\n  decoded_out.mem_has_base = true;\n  // The base is Xn (for 0...30) or SP (for 31).\n  // `Rn` field (first source register).\n  decoded_out.mem_base_reg = (instruction >> 5) & 31;\n\n  bool is_unsigned_offset =\n      (instruction & kArm64LoadStoreUnsignedOffsetFMask) ==\n      kArm64LoadStoreUnsignedOffsetFixed;\n  if (is_unsigned_offset) {\n    // LDR|STR Wt|St, [Xn|SP{, #pimm}]\n    // pimm (positive immediate) is scaled by the size of the data (4 for\n    // words).\n    // `ImmLSUnsigned` field.\n    uint32_t unsigned_offset = (instruction >> 10) & 4095;\n    decoded_out.mem_displacement =\n        ptrdiff_t(sizeof(uint32_t) * unsigned_offset);\n  } else {\n    Arm64LoadStoreOffsetFixed offset =\n        Arm64LoadStoreOffsetFixed(instruction & kArm64LoadStoreOffsetFMask);\n    // simm (signed immediate) is not scaled.\n    // Only applicable to kUnscaledOffset, kPostIndex and kPreIndex.\n    // `ImmLS` field.\n    int32_t signed_offset = int32_t(instruction << (32 - (9 + 12))) >> (32 - 9);\n    // For both post- and pre-indexing, the new address is written to the\n    // register after the data register write, thus if Xt and Xn are the same,\n    // the final value in the register will be the new address.\n    // https://developer.arm.com/documentation/ddi0596/2020-12/Base-Instructions/LDR--immediate---Load-Register--immediate--\n    switch (offset) {\n      case Arm64LoadStoreOffsetFixed::kUnscaledOffset: {\n        // LDUR|STUR Wt|St, [Xn|SP{, #simm}]\n        decoded_out.mem_displacement = signed_offset;\n      } break;\n      case Arm64LoadStoreOffsetFixed::kPostIndex: {\n        // LDR|STR Wt|St, [Xn|SP], #simm\n        decoded_out.mem_base_writeback = true;\n        decoded_out.mem_base_writeback_offset = signed_offset;\n      } break;\n      case Arm64LoadStoreOffsetFixed::kPreIndex: {\n        // LDR|STR Wt|St, [Xn|SP, #simm]!\n        decoded_out.mem_base_writeback = true;\n        decoded_out.mem_base_writeback_offset = signed_offset;\n        decoded_out.mem_displacement = signed_offset;\n      } break;\n      case Arm64LoadStoreOffsetFixed::kRegisterOffset: {\n        // LDR|STR Wt|St, [Xn|SP, (Wm|Xm){, extend {amount}}]\n        // `Rm` field.\n        decoded_out.mem_index_reg = (instruction >> 16) & 31;\n        if (decoded_out.mem_index_reg != DecodedLoadStore::kArm64RegZero) {\n          decoded_out.mem_has_index = true;\n          // Allowed extend types in the `option` field are UXTW (0b010), LSL\n          // (0b011 - identical to UXTX), SXTW (0b110), SXTX (0b111).\n          // The shift (0 or 2 for 32-bit LDR/STR) can be applied regardless of\n          // the extend type (\"LSL\" is just a term for assembly readability,\n          // internally it's treated simply as UXTX).\n          // If bit 0 of the `option` field is 0 (UXTW, SXTW), the index\n          // register is treated as 32-bit (Wm) extended to 64-bit. If it's 1\n          // (LSL aka UXTX, SXTX), the index register is treated as 64-bit (Xm).\n          // `ExtendMode` (`option`) field.\n          uint32_t extend_mode = (instruction >> 13) & 0b111;\n          if (!(extend_mode & 0b010)) {\n            // Sub-word index - undefined.\n            return false;\n          }\n          decoded_out.mem_index_size =\n              (extend_mode & 0b001) ? sizeof(uint64_t) : sizeof(uint32_t);\n          decoded_out.mem_index_sign_extend = (extend_mode & 0b100) != 0;\n          // Shift is either 0 or log2(sizeof(load or store size)).\n          // Supporting MMIO only for 4-byte words.\n          // `ImmShiftLS` field.\n          decoded_out.mem_scale =\n              (instruction & (UINT32_C(1) << 12)) ? sizeof(uint32_t) : 1;\n        }\n      } break;\n      default:\n        return false;\n    }\n  }\n\n  return true;\n\n#else\n#error TryDecodeLoadStore not implemented for the target CPU architecture.\n  return false;\n#endif  // XE_ARCH\n}\n\nbool MMIOHandler::ExceptionCallbackThunk(Exception* ex, void* data) {\n  return reinterpret_cast<MMIOHandler*>(data)->ExceptionCallback(ex);\n}\n\nbool MMIOHandler::ExceptionCallback(Exception* ex) {\n  if (ex->code() != Exception::Code::kAccessViolation) {\n    return false;\n  }\n  Exception::AccessViolationOperation operation =\n      ex->access_violation_operation();\n  if (operation != Exception::AccessViolationOperation::kRead &&\n      operation != Exception::AccessViolationOperation::kWrite) {\n    // Data Execution Prevention or something else uninteresting.\n    return false;\n  }\n  bool is_write = operation == Exception::AccessViolationOperation::kWrite;\n  if (ex->fault_address() < uint64_t(virtual_membase_) ||\n      ex->fault_address() > uint64_t(memory_end_)) {\n    // Quick kill anything outside our mapping.\n    return false;\n  }\n  void* fault_host_address = reinterpret_cast<void*>(ex->fault_address());\n\n  // Access violations are pretty rare, so we can do a linear search here.\n  // Only check if in the virtual range, as we only support virtual ranges.\n  const MMIORange* range = nullptr;\n  uint32_t fault_guest_virtual_address = 0;\n  if (ex->fault_address() < uint64_t(physical_membase_)) {\n    fault_guest_virtual_address = host_to_guest_virtual_(\n        host_to_guest_virtual_context_, fault_host_address);\n    for (const auto& test_range : mapped_ranges_) {\n      if ((fault_guest_virtual_address & test_range.mask) ==\n          test_range.address) {\n        // Address is within the range of this mapping.\n        range = &test_range;\n        break;\n      }\n    }\n  }\n  if (!range) {\n    // Recheck if the pages are still protected (race condition - another thread\n    // clears the watch we just hit).\n    // Do this under the lock so we don't introduce another race condition.\n    auto lock = global_critical_region_.Acquire();\n    memory::PageAccess cur_access;\n    size_t page_length = memory::page_size();\n    memory::QueryProtect(fault_host_address, page_length, cur_access);\n    if (cur_access != memory::PageAccess::kNoAccess &&\n        (!is_write || cur_access != memory::PageAccess::kReadOnly)) {\n      // Another thread has cleared this watch. Abort.\n      return true;\n    }\n    // The address is not found within any range, so either a write watch or an\n    // actual access violation.\n    if (access_violation_callback_) {\n      return access_violation_callback_(std::move(lock),\n                                        access_violation_callback_context_,\n                                        fault_host_address, is_write);\n    }\n    return false;\n  }\n\n  auto rip = ex->pc();\n  auto p = reinterpret_cast<const uint8_t*>(rip);\n  DecodedLoadStore decoded_load_store;\n  if (!TryDecodeLoadStore(p, decoded_load_store)) {\n    XELOGE(\"Unable to decode MMIO load or store instruction at {}\", p);\n    assert_always(\"Unknown MMIO instruction type\");\n    return false;\n  }\n\n  HostThreadContext& thread_context = *ex->thread_context();\n\n#if XE_ARCH_ARM64\n  // Preserve the base address with the pre- or the post-index offset to write\n  // it after writing the result (since the base address register and the\n  // register to load to may be the same, in which case it should receive the\n  // original base address with the offset).\n  uintptr_t mem_base_writeback_address = 0;\n  if (decoded_load_store.mem_has_base &&\n      decoded_load_store.mem_base_writeback) {\n    if (decoded_load_store.mem_base_reg ==\n        DecodedLoadStore::kArm64MemBaseRegSp) {\n      mem_base_writeback_address = thread_context.sp;\n    } else {\n      assert_true(decoded_load_store.mem_base_reg <= 30);\n      mem_base_writeback_address =\n          thread_context.x[decoded_load_store.mem_base_reg];\n    }\n    mem_base_writeback_address += decoded_load_store.mem_base_writeback_offset;\n  }\n#endif  // XE_ARCH_ARM64\n\n  uint8_t value_reg = decoded_load_store.value_reg;\n  if (decoded_load_store.is_load) {\n    // Load of a memory value - read from range, swap, and store in the\n    // register.\n    uint32_t value = range->read(nullptr, range->callback_context,\n                                 fault_guest_virtual_address);\n    if (!decoded_load_store.byte_swap) {\n      // We swap only if it's not a movbe, as otherwise we are swapping twice.\n      value = xe::byte_swap(value);\n    }\n#if XE_ARCH_AMD64\n    ex->ModifyIntRegister(value_reg) = value;\n#elif XE_ARCH_ARM64\n    if (value_reg >= DecodedLoadStore::kArm64ValueRegX0 &&\n        value_reg <= (DecodedLoadStore::kArm64ValueRegX0 + 30)) {\n      ex->ModifyXRegister(value_reg - DecodedLoadStore::kArm64ValueRegX0) =\n          value;\n    } else if (value_reg >= DecodedLoadStore::kArm64ValueRegV0 &&\n               value_reg <= (DecodedLoadStore::kArm64ValueRegV0 + 31)) {\n      ex->ModifyVRegister(value_reg - DecodedLoadStore::kArm64ValueRegV0)\n          .u32[0] = value;\n    } else {\n      assert_true(value_reg == DecodedLoadStore::kArm64ValueRegZero);\n      // Register write is ignored for X31.\n    }\n#else\n#error Register value writing not implemented for the target CPU architecture.\n#endif  // XE_ARCH\n  } else {\n    // Store of a register value - read register, swap, write to range.\n    uint32_t value;\n    if (decoded_load_store.is_constant) {\n      value = uint32_t(decoded_load_store.constant);\n    } else {\n#if XE_ARCH_AMD64\n      value = uint32_t(thread_context.int_registers[value_reg]);\n#elif XE_ARCH_ARM64\n      if (value_reg >= DecodedLoadStore::kArm64ValueRegX0 &&\n          value_reg <= (DecodedLoadStore::kArm64ValueRegX0 + 30)) {\n        value = uint32_t(\n            thread_context.x[value_reg - DecodedLoadStore::kArm64ValueRegX0]);\n      } else if (value_reg >= DecodedLoadStore::kArm64ValueRegV0 &&\n                 value_reg <= (DecodedLoadStore::kArm64ValueRegV0 + 31)) {\n        value = thread_context.v[value_reg - DecodedLoadStore::kArm64ValueRegV0]\n                    .u32[0];\n      } else {\n        assert_true(value_reg == DecodedLoadStore::kArm64ValueRegZero);\n        value = 0;\n      }\n#else\n#error Register value reading not implemented for the target CPU architecture.\n#endif  // XE_ARCH\n      if (!decoded_load_store.byte_swap) {\n        // We swap only if it's not a movbe, as otherwise we are swapping twice.\n        value = xe::byte_swap(value);\n      }\n    }\n    range->write(nullptr, range->callback_context, fault_guest_virtual_address,\n                 value);\n  }\n\n#if XE_ARCH_ARM64\n  // Write the base address with the pre- or the post-index offset, overwriting\n  // the register to load to if it's the same.\n  if (decoded_load_store.mem_has_base &&\n      decoded_load_store.mem_base_writeback) {\n    if (decoded_load_store.mem_base_reg ==\n        DecodedLoadStore::kArm64MemBaseRegSp) {\n      thread_context.sp = mem_base_writeback_address;\n    } else {\n      assert_true(decoded_load_store.mem_base_reg <= 30);\n      ex->ModifyXRegister(decoded_load_store.mem_base_reg) =\n          mem_base_writeback_address;\n    }\n  }\n#endif  // XE_ARCH_ARM64\n\n  // Advance RIP to the next instruction so that we resume properly.\n  ex->set_resume_pc(rip + decoded_load_store.length);\n\n  return true;\n}\n\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/mmio_handler.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_MMIO_HANDLER_H_\n#define XENIA_CPU_MMIO_HANDLER_H_\n\n#include <memory>\n#include <mutex>\n#include <vector>\n\n#include \"xenia/base/mutex.h\"\n#include \"xenia/base/platform.h\"\n\nnamespace xe {\nclass Exception;\nclass HostThreadContext;\n}  // namespace xe\n\nnamespace xe {\nnamespace cpu {\n\ntypedef uint32_t (*MMIOReadCallback)(void* ppc_context, void* callback_context,\n                                     uint32_t addr);\ntypedef void (*MMIOWriteCallback)(void* ppc_context, void* callback_context,\n                                  uint32_t addr, uint32_t value);\n\nstruct MMIORange {\n  uint32_t address;\n  uint32_t mask;\n  uint32_t size;\n  void* callback_context;\n  MMIOReadCallback read;\n  MMIOWriteCallback write;\n};\n\n// NOTE: only one can exist at a time!\nclass MMIOHandler {\n public:\n  virtual ~MMIOHandler();\n\n  typedef uint32_t (*HostToGuestVirtual)(const void* context,\n                                         const void* host_address);\n  typedef bool (*AccessViolationCallback)(\n      std::unique_lock<std::recursive_mutex> global_lock_locked_once,\n      void* context, void* host_address, bool is_write);\n\n  // access_violation_callback is called with global_critical_region locked once\n  // on the thread, so if multiple threads trigger an access violation in the\n  // same page, the callback will be called only once.\n  static std::unique_ptr<MMIOHandler> Install(\n      uint8_t* virtual_membase, uint8_t* physical_membase, uint8_t* membase_end,\n      HostToGuestVirtual host_to_guest_virtual,\n      const void* host_to_guest_virtual_context,\n      AccessViolationCallback access_violation_callback,\n      void* access_violation_callback_context);\n  static MMIOHandler* global_handler() { return global_handler_; }\n\n  bool RegisterRange(uint32_t virtual_address, uint32_t mask, uint32_t size,\n                     void* context, MMIOReadCallback read_callback,\n                     MMIOWriteCallback write_callback);\n  MMIORange* LookupRange(uint32_t virtual_address);\n\n  bool CheckLoad(uint32_t virtual_address, uint32_t* out_value);\n  bool CheckStore(uint32_t virtual_address, uint32_t value);\n\n protected:\n  MMIOHandler(uint8_t* virtual_membase, uint8_t* physical_membase,\n              uint8_t* membase_end, HostToGuestVirtual host_to_guest_virtual,\n              const void* host_to_guest_virtual_context,\n              AccessViolationCallback access_violation_callback,\n              void* access_violation_callback_context);\n\n  static bool ExceptionCallbackThunk(Exception* ex, void* data);\n  bool ExceptionCallback(Exception* ex);\n\n  uint8_t* virtual_membase_;\n  uint8_t* physical_membase_;\n  uint8_t* memory_end_;\n\n  std::vector<MMIORange> mapped_ranges_;\n\n  HostToGuestVirtual host_to_guest_virtual_;\n  const void* host_to_guest_virtual_context_;\n\n  AccessViolationCallback access_violation_callback_;\n  void* access_violation_callback_context_;\n\n  static MMIOHandler* global_handler_;\n\n  xe::global_critical_region global_critical_region_;\n\n private:\n  struct DecodedLoadStore {\n    // Matches the Xn/Wn register number for 0 reads and ignored writes in many\n    // usage cases.\n    static constexpr uint8_t kArm64RegZero = 31;\n\n    // Matches the actual register number encoding for an SP base in AArch64\n    // load and store instructions.\n    static constexpr uint8_t kArm64MemBaseRegSp = kArm64RegZero;\n\n    static constexpr uint8_t kArm64ValueRegX0 = 0;\n    static constexpr uint8_t kArm64ValueRegZero =\n        kArm64ValueRegX0 + kArm64RegZero;\n    static constexpr uint8_t kArm64ValueRegV0 = 32;\n\n    size_t length;\n    // Inidicates this is a load (or conversely a store).\n    bool is_load;\n    // Indicates the memory must be swapped.\n    bool byte_swap;\n    // Source (for store) or target (for load) register.\n    // For x86-64:\n    // AX  CX  DX  BX  SP  BP  SI  DI   // REX.R=0\n    // R8  R9  R10 R11 R12 R13 R14 R15  // REX.R=1\n    // For AArch64:\n    // - kArm64ValueRegX0 + [0...30]: Xn (Wn for 32 bits - upper 32 bits of Xn\n    //   are zeroed on Wn write).\n    // - kArm64ValueRegZero: Zero constant for register read, ignored register\n    //   write (though memory must still be accessed - a MMIO load may have side\n    //   effects even if the result is discarded).\n    // - kArm64ValueRegV0 + [0...31]: Vn (Sn for 32 bits).\n    uint8_t value_reg;\n    // [base + (index * scale) + displacement]\n    bool mem_has_base;\n    // On AArch64, if mem_base_reg is kArm64MemBaseRegSp, the base register is\n    // SP, not Xn.\n    uint8_t mem_base_reg;\n    // For AArch64 pre- and post-indexing. In case of a load, the base register\n    // is written back after the loaded data is written to the register,\n    // overwriting the value register if it's the same.\n    bool mem_base_writeback;\n    int32_t mem_base_writeback_offset;\n    bool mem_has_index;\n    uint8_t mem_index_reg;\n    uint8_t mem_index_size;\n    bool mem_index_sign_extend;\n    uint8_t mem_scale;\n    ptrdiff_t mem_displacement;\n    bool is_constant;\n    int32_t constant;\n  };\n\n  static bool TryDecodeLoadStore(const uint8_t* p,\n                                 DecodedLoadStore& decoded_out);\n};\n\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_MMIO_HANDLER_H_\n"
  },
  {
    "path": "src/xenia/cpu/module.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/module.h\"\n\n#include <algorithm>\n#include <fstream>\n#include <sstream>  // NOLINT(readability/streams): should be replaced.\n#include <string>\n\n#include \"xenia/base/profiling.h\"\n#include \"xenia/base/threading.h\"\n#include \"xenia/cpu/processor.h\"\n\nnamespace xe {\nnamespace cpu {\n\nModule::Module(Processor* processor)\n    : processor_(processor), memory_(processor->memory()) {}\n\nModule::~Module() = default;\n\nbool Module::ContainsAddress(uint32_t address) { return true; }\n\nSymbol* Module::LookupSymbol(uint32_t address, bool wait) {\n  auto global_lock = global_critical_region_.Acquire();\n  const auto it = map_.find(address);\n  Symbol* symbol = it != map_.end() ? it->second : nullptr;\n  if (symbol) {\n    if (symbol->status() == Symbol::Status::kDeclaring) {\n      // Some other thread is declaring the symbol - wait.\n      if (wait) {\n        do {\n          global_lock.unlock();\n          // TODO(benvanik): sleep for less time?\n          xe::threading::Sleep(std::chrono::microseconds(100));\n          global_lock.lock();\n        } while (symbol->status() == Symbol::Status::kDeclaring);\n      } else {\n        // Immediate request, just return.\n        symbol = nullptr;\n      }\n    }\n  }\n  global_lock.unlock();\n  return symbol;\n}\n\nSymbol::Status Module::DeclareSymbol(Symbol::Type type, uint32_t address,\n                                     Symbol** out_symbol) {\n  *out_symbol = nullptr;\n  auto global_lock = global_critical_region_.Acquire();\n  auto it = map_.find(address);\n  Symbol* symbol = it != map_.end() ? it->second : nullptr;\n  Symbol::Status status;\n  if (symbol) {\n    // If we exist but are the wrong type, die.\n    if (symbol->type() != type) {\n      global_lock.unlock();\n      return Symbol::Status::kFailed;\n    }\n    // If we aren't ready yet spin and wait.\n    if (symbol->status() == Symbol::Status::kDeclaring) {\n      // Still declaring, so spin.\n      do {\n        global_lock.unlock();\n        // TODO(benvanik): sleep for less time?\n        xe::threading::Sleep(std::chrono::microseconds(100));\n        global_lock.lock();\n      } while (symbol->status() == Symbol::Status::kDeclaring);\n    }\n    status = symbol->status();\n  } else {\n    // Create and return for initialization.\n    switch (type) {\n      case Symbol::Type::kFunction:\n        symbol = CreateFunction(address).release();\n        break;\n      case Symbol::Type::kVariable:\n        symbol = new Symbol(Symbol::Type::kVariable, this, address);\n        break;\n    }\n    map_[address] = symbol;\n    list_.emplace_back(symbol);\n    status = Symbol::Status::kNew;\n  }\n  global_lock.unlock();\n  *out_symbol = symbol;\n\n  // Get debug info from providers, if this is new.\n  if (status == Symbol::Status::kNew) {\n    // TODO(benvanik): lookup in map data/dwarf/etc?\n  }\n\n  return status;\n}\n\nSymbol::Status Module::DeclareFunction(uint32_t address,\n                                       Function** out_function) {\n  Symbol* symbol;\n  Symbol::Status status =\n      DeclareSymbol(Symbol::Type::kFunction, address, &symbol);\n  *out_function = static_cast<Function*>(symbol);\n  return status;\n}\n\nSymbol::Status Module::DeclareVariable(uint32_t address, Symbol** out_symbol) {\n  Symbol::Status status =\n      DeclareSymbol(Symbol::Type::kVariable, address, out_symbol);\n  return status;\n}\n\nSymbol::Status Module::DefineSymbol(Symbol* symbol) {\n  auto global_lock = global_critical_region_.Acquire();\n  Symbol::Status status;\n  if (symbol->status() == Symbol::Status::kDeclared) {\n    // Declared but undefined, so request caller define it.\n    symbol->set_status(Symbol::Status::kDefining);\n    status = Symbol::Status::kNew;\n  } else if (symbol->status() == Symbol::Status::kDefining) {\n    // Still defining, so spin.\n    do {\n      global_lock.unlock();\n      // TODO(benvanik): sleep for less time?\n      xe::threading::Sleep(std::chrono::microseconds(100));\n      global_lock.lock();\n    } while (symbol->status() == Symbol::Status::kDefining);\n    status = symbol->status();\n  } else {\n    status = symbol->status();\n  }\n  global_lock.unlock();\n  return status;\n}\n\nSymbol::Status Module::DefineFunction(Function* symbol) {\n  return DefineSymbol(symbol);\n}\n\nSymbol::Status Module::DefineVariable(Symbol* symbol) {\n  return DefineSymbol(symbol);\n}\n\nvoid Module::ForEachFunction(std::function<void(Function*)> callback) {\n  auto global_lock = global_critical_region_.Acquire();\n  for (auto& symbol : list_) {\n    if (symbol->type() == Symbol::Type::kFunction) {\n      Function* info = static_cast<Function*>(symbol.get());\n      callback(info);\n    }\n  }\n}\n\nvoid Module::ForEachSymbol(size_t start_index, size_t end_index,\n                           std::function<void(Symbol*)> callback) {\n  auto global_lock = global_critical_region_.Acquire();\n  start_index = std::min(start_index, list_.size());\n  end_index = std::min(end_index, list_.size());\n  for (size_t i = start_index; i <= end_index; ++i) {\n    auto& symbol = list_[i];\n    callback(symbol.get());\n  }\n}\n\nsize_t Module::QuerySymbolCount() {\n  auto global_lock = global_critical_region_.Acquire();\n  return list_.size();\n}\n\nbool Module::ReadMap(const char* file_name) {\n  std::ifstream infile(file_name);\n\n  // Skip until '  Address'. Skip the next blank line.\n  std::string line;\n  while (std::getline(infile, line)) {\n    if (line.find(\"  Address\") == 0) {\n      // Skip the next line.\n      std::getline(infile, line);\n      break;\n    }\n  }\n\n  std::stringstream sstream;\n  std::string ignore;\n  std::string name;\n  std::string addr_str;\n  std::string type_str;\n  while (std::getline(infile, line)) {\n    // Remove newline.\n    while (line.size() &&\n           (line[line.size() - 1] == '\\r' || line[line.size() - 1] == '\\n')) {\n      line.erase(line.end() - 1);\n    }\n\n    // End when we hit the first whitespace.\n    if (line.size() == 0) {\n      break;\n    }\n\n    // Line is [ws][ignore][ws][name][ws][hex addr][ws][(f)][ws][library]\n    sstream.clear();\n    sstream.str(line);\n    sstream >> std::ws;\n    sstream >> ignore;\n    sstream >> std::ws;\n    sstream >> name;\n    sstream >> std::ws;\n    sstream >> addr_str;\n    sstream >> std::ws;\n    sstream >> type_str;\n\n    uint32_t address = (uint32_t)strtoul(addr_str.c_str(), NULL, 16);\n    if (!address) {\n      continue;\n    }\n\n    if (type_str == \"f\") {\n      // Function.\n      auto function = processor_->LookupFunction(this, address);\n      if (!function) {\n        continue;\n      }\n      // Don't overwrite names we've set elsewhere.\n      if (function->name().empty()) {\n        // If it's a mangled C++ name (?name@...) just use the name.\n        // TODO(benvanik): better demangling, or leave it to clients.\n        /*if (name[0] == '?') {\n          size_t at = name.find('@');\n          name = name.substr(1, at - 1);\n        }*/\n        function->set_name(name.c_str());\n      }\n    } else {\n      // Variable.\n    }\n  }\n\n  return true;\n}\n\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/module.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_MODULE_H_\n#define XENIA_CPU_MODULE_H_\n\n#include <functional>\n#include <memory>\n#include <string>\n#include <unordered_map>\n#include <vector>\n\n#include \"xenia/base/mutex.h\"\n#include \"xenia/cpu/function.h\"\n#include \"xenia/cpu/symbol.h\"\n#include \"xenia/memory.h\"\n\nnamespace xe {\nnamespace cpu {\n\nclass Processor;\n\nclass Module {\n public:\n  explicit Module(Processor* processor);\n  virtual ~Module();\n\n  Memory* memory() const { return memory_; }\n\n  virtual const std::string& name() const = 0;\n  virtual bool is_executable() const = 0;\n\n  virtual bool ContainsAddress(uint32_t address);\n\n  Symbol* LookupSymbol(uint32_t address, bool wait = true);\n  virtual Symbol::Status DeclareFunction(uint32_t address,\n                                         Function** out_function);\n  virtual Symbol::Status DeclareVariable(uint32_t address, Symbol** out_symbol);\n\n  Symbol::Status DefineFunction(Function* symbol);\n  Symbol::Status DefineVariable(Symbol* symbol);\n\n  void ForEachFunction(std::function<void(Function*)> callback);\n  void ForEachSymbol(size_t start_index, size_t end_index,\n                     std::function<void(Symbol*)> callback);\n  size_t QuerySymbolCount();\n\n  bool ReadMap(const char* file_name);\n\n protected:\n  virtual std::unique_ptr<Function> CreateFunction(uint32_t address) = 0;\n\n  Processor* processor_ = nullptr;\n  Memory* memory_ = nullptr;\n\n private:\n  Symbol::Status DeclareSymbol(Symbol::Type type, uint32_t address,\n                               Symbol** out_symbol);\n  Symbol::Status DefineSymbol(Symbol* symbol);\n\n  xe::global_critical_region global_critical_region_;\n  // TODO(benvanik): replace with a better data structure.\n  std::unordered_map<uint32_t, Symbol*> map_;\n  std::vector<std::unique_ptr<Symbol>> list_;\n};\n\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_MODULE_H_\n"
  },
  {
    "path": "src/xenia/cpu/ppc/ppc_context.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/ppc/ppc_context.h\"\n\n#include <cinttypes>\n#include <cstdlib>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/string_util.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace ppc {\n\nuint64_t PPCContext::cr() const {\n  uint64_t final_bits = 0;\n  for (int i = 0; i < 8; ++i) {\n    union {\n      uint32_t value;\n      struct {\n        uint8_t lt;\n        uint8_t gt;\n        uint8_t eq;\n        uint8_t so;\n      };\n    } crf;\n    crf.value = *(&cr0.value + i);\n    uint64_t bits = (crf.lt & 0x1) << 3 | (crf.gt & 0x1) << 2 |\n                    (crf.eq & 0x1) << 1 | (crf.so & 0x1) << 0;\n    final_bits |= bits << ((7 - i) * 4);\n  }\n  return final_bits;\n}\n\nvoid PPCContext::set_cr(uint64_t value) {\n  assert_always(\"not yet implemented\");\n}\n\nstd::string PPCContext::GetRegisterName(PPCRegister reg) {\n  switch (reg) {\n    case PPCRegister::kLR:\n      return \"lr\";\n    case PPCRegister::kCTR:\n      return \"ctr\";\n    case PPCRegister::kXER:\n      return \"xer\";\n    case PPCRegister::kFPSCR:\n      return \"fpscr\";\n    case PPCRegister::kVSCR:\n      return \"vscr\";\n    case PPCRegister::kCR:\n      return \"cr\";\n    default:\n      if (static_cast<int>(reg) >= static_cast<int>(PPCRegister::kR0) &&\n          static_cast<int>(reg) <= static_cast<int>(PPCRegister::kR31)) {\n        return std::string(\"r\") +\n               std::to_string(static_cast<int>(reg) -\n                              static_cast<int>(PPCRegister::kR0));\n      } else if (static_cast<int>(reg) >= static_cast<int>(PPCRegister::kFR0) &&\n                 static_cast<int>(reg) <=\n                     static_cast<int>(PPCRegister::kFR31)) {\n        return std::string(\"fr\") +\n               std::to_string(static_cast<int>(reg) -\n                              static_cast<int>(PPCRegister::kFR0));\n      } else if (static_cast<int>(reg) >= static_cast<int>(PPCRegister::kVR0) &&\n                 static_cast<int>(reg) <=\n                     static_cast<int>(PPCRegister::kVR128)) {\n        return std::string(\"vr\") +\n               std::to_string(static_cast<int>(reg) -\n                              static_cast<int>(PPCRegister::kVR0));\n      } else {\n        assert_unhandled_case(reg);\n        return \"?\";\n      }\n  }\n}\n\nstd::string PPCContext::GetStringFromValue(PPCRegister reg) const {\n  switch (reg) {\n    case PPCRegister::kLR:\n      return string_util::to_hex_string(lr);\n    case PPCRegister::kCTR:\n      return string_util::to_hex_string(ctr);\n    case PPCRegister::kXER:\n      // return Int64ToHex(xer_ca);\n      return \"?\";\n    case PPCRegister::kFPSCR:\n      // return Int64ToHex(fpscr);\n      return \"?\";\n    case PPCRegister::kVSCR:\n      // return Int64ToHex(vscr_sat);\n      return \"?\";\n    case PPCRegister::kCR:\n      // return Int64ToHex(cr);\n      return \"?\";\n    default:\n      if (static_cast<int>(reg) >= static_cast<int>(PPCRegister::kR0) &&\n          static_cast<int>(reg) <= static_cast<int>(PPCRegister::kR31)) {\n        return string_util::to_hex_string(\n            r[static_cast<int>(reg) - static_cast<int>(PPCRegister::kR0)]);\n      } else if (static_cast<int>(reg) >= static_cast<int>(PPCRegister::kFR0) &&\n                 static_cast<int>(reg) <=\n                     static_cast<int>(PPCRegister::kFR31)) {\n        return string_util::to_hex_string(\n            f[static_cast<int>(reg) - static_cast<int>(PPCRegister::kFR0)]);\n      } else if (static_cast<int>(reg) >= static_cast<int>(PPCRegister::kVR0) &&\n                 static_cast<int>(reg) <=\n                     static_cast<int>(PPCRegister::kVR128)) {\n        return string_util::to_hex_string(\n            v[static_cast<int>(reg) - static_cast<int>(PPCRegister::kVR0)]);\n      } else {\n        assert_unhandled_case(reg);\n        return \"\";\n      }\n  }\n}\n\nvoid PPCContext::SetValueFromString(PPCRegister reg, std::string value) {\n  // TODO(benvanik): set value from string to replace SetRegFromString?\n  assert_always(false);\n}\n\nvoid PPCContext::SetRegFromString(const char* name, const char* value) {\n  int n;\n  if (sscanf(name, \"r%d\", &n) == 1) {\n    this->r[n] = string_util::from_string<uint64_t>(value);\n  } else if (sscanf(name, \"f%d\", &n) == 1) {\n    this->f[n] = string_util::from_string<double>(value);\n  } else if (sscanf(name, \"v%d\", &n) == 1) {\n    this->v[n] = string_util::from_string<vec128_t>(value);\n  } else if (std::strcmp(name, \"cr\") == 0) {\n    this->set_cr(string_util::from_string<uint64_t>(value));\n  } else {\n    printf(\"Unrecognized register name: %s\\n\", name);\n  }\n}\n\nbool PPCContext::CompareRegWithString(const char* name, const char* value,\n                                      std::string& result) const {\n  int n;\n  if (sscanf(name, \"r%d\", &n) == 1) {\n    uint64_t expected = string_util::from_string<uint64_t>(value);\n    if (this->r[n] != expected) {\n      result = fmt::format(\"{:016X}\", this->r[n]);\n      return false;\n    }\n    return true;\n  } else if (sscanf(name, \"f%d\", &n) == 1) {\n    if (std::strstr(value, \"0x\")) {\n      // Special case: Treat float as integer.\n      uint64_t expected = string_util::from_string<uint64_t>(value, true);\n      uint64_t pun;\n      std::memcpy(&pun, &this->f[n], sizeof(pun));\n      if (pun != expected) {\n        result = fmt::format(\"{:016X}\", pun);\n        return false;\n      }\n    } else {\n      double expected = string_util::from_string<double>(value);\n      // TODO(benvanik): epsilon\n      if (this->f[n] != expected) {\n        result = fmt::format(\"{:.17f}\", this->f[n]);\n        return false;\n      }\n    }\n    return true;\n  } else if (sscanf(name, \"v%d\", &n) == 1) {\n    vec128_t expected = string_util::from_string<vec128_t>(value);\n    if (this->v[n] != expected) {\n      result =\n          fmt::format(\"[{:08X}, {:08X}, {:08X}, {:08X}]\", this->v[n].i32[0],\n                      this->v[n].i32[1], this->v[n].i32[2], this->v[n].i32[3]);\n      return false;\n    }\n    return true;\n  } else if (std::strcmp(name, \"cr\") == 0) {\n    uint64_t actual = this->cr();\n    uint64_t expected = string_util::from_string<uint64_t>(value);\n    if (actual != expected) {\n      result = fmt::format(\"{:016X}\", actual);\n      return false;\n    }\n    return true;\n  } else {\n    assert_always(\"Unrecognized register name: %s\\n\", name);\n    return false;\n  }\n}\n\n}  // namespace ppc\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/ppc/ppc_context.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_PPC_PPC_CONTEXT_H_\n#define XENIA_CPU_PPC_PPC_CONTEXT_H_\n\n#include <cstdint>\n#include <mutex>\n#include <string>\n\n#include \"xenia/base/vec128.h\"\n\nnamespace xe {\nnamespace cpu {\nclass Processor;\nclass ThreadState;\n}  // namespace cpu\nnamespace kernel {\nclass KernelState;\n}  // namespace kernel\n}  // namespace xe\n\nnamespace xe {\nnamespace cpu {\nnamespace ppc {\n\n// Map:\n// 0-31: GPR\n// 32-63: FPR\n// 64: LR\n// 65: CTR\n// 66: XER\n// 67: FPSCR\n// 68: VSCR\n// 69-76: CR0-7\n// 100: invalid\n// 128-256: VR\n\nenum class PPCRegister {\n  kR0 = 0,\n  kR1,\n  kR2,\n  kR3,\n  kR4,\n  kR5,\n  kR6,\n  kR7,\n  kR8,\n  kR9,\n  kR10,\n  kR11,\n  kR12,\n  kR13,\n  kR14,\n  kR15,\n  kR16,\n  kR17,\n  kR18,\n  kR19,\n  kR20,\n  kR21,\n  kR22,\n  kR23,\n  kR24,\n  kR25,\n  kR26,\n  kR27,\n  kR28,\n  kR29,\n  kR30,\n  kR31,\n  kFR0 = 32,\n  kFR1,\n  kFR2,\n  kFR3,\n  kFR4,\n  kFR5,\n  kFR6,\n  kFR7,\n  kFR8,\n  kFR9,\n  kFR10,\n  kFR11,\n  kFR12,\n  kFR13,\n  kFR14,\n  kFR15,\n  kFR16,\n  kFR17,\n  kFR18,\n  kFR19,\n  kFR20,\n  kFR21,\n  kFR22,\n  kFR23,\n  kFR24,\n  kFR25,\n  kFR26,\n  kFR27,\n  kFR28,\n  kFR29,\n  kFR30,\n  kFR31,\n  kVR0 = 64,\n  kVR1,\n  kVR2,\n  kVR3,\n  kVR4,\n  kVR5,\n  kVR6,\n  kVR7,\n  kVR8,\n  kVR9,\n  kVR10,\n  kVR11,\n  kVR12,\n  kVR13,\n  kVR14,\n  kVR15,\n  kVR16,\n  kVR17,\n  kVR18,\n  kVR19,\n  kVR20,\n  kVR21,\n  kVR22,\n  kVR23,\n  kVR24,\n  kVR25,\n  kVR26,\n  kVR27,\n  kVR28,\n  kVR29,\n  kVR30,\n  kVR31,\n  kVR32,\n  kVR33,\n  kVR34,\n  kVR35,\n  kVR36,\n  kVR37,\n  kVR38,\n  kVR39,\n  kVR40,\n  kVR41,\n  kVR42,\n  kVR43,\n  kVR44,\n  kVR45,\n  kVR46,\n  kVR47,\n  kVR48,\n  kVR49,\n  kVR50,\n  kVR51,\n  kVR52,\n  kVR53,\n  kVR54,\n  kVR55,\n  kVR56,\n  kVR57,\n  kVR58,\n  kVR59,\n  kVR60,\n  kVR61,\n  kVR62,\n  kVR63,\n  kVR64,\n  kVR65,\n  kVR66,\n  kVR67,\n  kVR68,\n  kVR69,\n  kVR70,\n  kVR71,\n  kVR72,\n  kVR73,\n  kVR74,\n  kVR75,\n  kVR76,\n  kVR77,\n  kVR78,\n  kVR79,\n  kVR80,\n  kVR81,\n  kVR82,\n  kVR83,\n  kVR84,\n  kVR85,\n  kVR86,\n  kVR87,\n  kVR88,\n  kVR89,\n  kVR90,\n  kVR91,\n  kVR92,\n  kVR93,\n  kVR94,\n  kVR95,\n  kVR96,\n  kVR97,\n  kVR98,\n  kVR99,\n  kVR100,\n  kVR101,\n  kVR102,\n  kVR103,\n  kVR104,\n  kVR105,\n  kVR106,\n  kVR107,\n  kVR108,\n  kVR109,\n  kVR110,\n  kVR111,\n  kVR112,\n  kVR113,\n  kVR114,\n  kVR115,\n  kVR116,\n  kVR117,\n  kVR118,\n  kVR119,\n  kVR120,\n  kVR121,\n  kVR122,\n  kVR123,\n  kVR124,\n  kVR125,\n  kVR126,\n  kVR127,\n  kVR128,\n\n  kLR,\n  kCTR,\n  kXER,\n  kFPSCR,\n  kVSCR,\n  kCR,\n};\n\n#pragma pack(push, 8)\ntypedef struct PPCContext_s {\n  // Must be stored at 0x0 for now.\n  // TODO(benvanik): find a nice way to describe this to the JIT.\n  ThreadState* thread_state;  // 0x0\n  // TODO(benvanik): this is getting nasty. Must be here.\n  uint8_t* virtual_membase;  // 0x8\n\n  // Most frequently used registers first.\n  uint64_t lr;      // 0x10 Link register\n  uint64_t ctr;     // 0x18 Count register\n  uint64_t r[32];   // 0x20 General purpose registers\n  double f[32];     // 0x120 Floating-point registers\n  vec128_t v[128];  // 0x220 VMX128 vector registers\n\n  // XER register:\n  // Split to make it easier to do individual updates.\n  uint8_t xer_ca;  // 0xA20\n  uint8_t xer_ov;  // 0xA21\n  uint8_t xer_so;  // 0xA22\n\n  // Condition registers:\n  // These are split to make it easier to do DCE on unused stores.\n  uint64_t cr() const;\n  void set_cr(uint64_t value);\n  union {\n    uint32_t value;\n    struct {\n      uint8_t cr0_lt;  // Negative (LT) - result is negative\n      uint8_t cr0_gt;  // Positive (GT) - result is positive (and not zero)\n      uint8_t cr0_eq;  // Zero (EQ) - result is zero or a stwcx/stdcx completed\n                       // successfully\n      uint8_t cr0_so;  // Summary Overflow (SO) - copy of XER[SO]\n    };\n  } cr0;  // 0xA24\n  union {\n    uint32_t value;\n    struct {\n      uint8_t cr1_fx;   // FP exception summary - copy of FPSCR[FX]\n      uint8_t cr1_fex;  // FP enabled exception summary - copy of FPSCR[FEX]\n      uint8_t\n          cr1_vx;  // FP invalid operation exception summary - copy of FPSCR[VX]\n      uint8_t cr1_ox;  // FP overflow exception - copy of FPSCR[OX]\n    };\n  } cr1;\n  union {\n    uint32_t value;\n    struct {\n      uint8_t cr2_0;\n      uint8_t cr2_1;\n      uint8_t cr2_2;\n      uint8_t cr2_3;\n    };\n  } cr2;\n  union {\n    uint32_t value;\n    struct {\n      uint8_t cr3_0;\n      uint8_t cr3_1;\n      uint8_t cr3_2;\n      uint8_t cr3_3;\n    };\n  } cr3;\n  union {\n    uint32_t value;\n    struct {\n      uint8_t cr4_0;\n      uint8_t cr4_1;\n      uint8_t cr4_2;\n      uint8_t cr4_3;\n    };\n  } cr4;\n  union {\n    uint32_t value;\n    struct {\n      uint8_t cr5_0;\n      uint8_t cr5_1;\n      uint8_t cr5_2;\n      uint8_t cr5_3;\n    };\n  } cr5;\n  union {\n    uint32_t value;\n    struct {\n      uint8_t cr6_all_equal;\n      uint8_t cr6_1;\n      uint8_t cr6_none_equal;\n      uint8_t cr6_3;\n    };\n  } cr6;\n  union {\n    uint32_t value;\n    struct {\n      uint8_t cr7_0;\n      uint8_t cr7_1;\n      uint8_t cr7_2;\n      uint8_t cr7_3;\n    };\n  } cr7;\n\n  union {\n    uint32_t value;\n    struct {\n      uint32_t rn : 2;      // FP rounding control: 00 = nearest\n                            //                      01 = toward zero\n                            //                      10 = toward +infinity\n                            //                      11 = toward -infinity\n      uint32_t ni : 1;      // Floating-point non-IEEE mode\n      uint32_t xe : 1;      // IEEE floating-point inexact exception enable\n      uint32_t ze : 1;      // IEEE floating-point zero divide exception enable\n      uint32_t ue : 1;      // IEEE floating-point underflow exception enable\n      uint32_t oe : 1;      // IEEE floating-point overflow exception enable\n      uint32_t ve : 1;      // FP invalid op exception enable\n      uint32_t vxcvi : 1;   // FP invalid op exception: invalid integer convert\n                            // -- sticky\n      uint32_t vxsqrt : 1;  // FP invalid op exception: invalid sqrt -- sticky\n      uint32_t vxsoft : 1;  // FP invalid op exception: software request\n                            // -- sticky\n      uint32_t reserved : 1;\n      uint32_t fprf_un : 1;  // FP result unordered or NaN (FU or ?)\n      uint32_t fprf_eq : 1;  // FP result equal or zero (FE or =)\n      uint32_t fprf_gt : 1;  // FP result greater than or positive (FG or >)\n      uint32_t fprf_lt : 1;  // FP result less than or negative (FL or <)\n      uint32_t fprf_c : 1;   // FP result class\n      uint32_t fi : 1;       // FP fraction inexact\n      uint32_t fr : 1;       // FP fraction rounded\n      uint32_t vxvc : 1;  // FP invalid op exception: invalid compare         --\n                          // sticky\n      uint32_t vximz : 1;   // FP invalid op exception: infinity * 0 -- sticky\n      uint32_t vxzdz : 1;   // FP invalid op exception: 0 / 0 -- sticky\n      uint32_t vxidi : 1;   // FP invalid op exception: infinity / infinity\n                            // -- sticky\n      uint32_t vxisi : 1;   // FP invalid op exception: infinity - infinity\n                            // -- sticky\n      uint32_t vxsnan : 1;  // FP invalid op exception: SNaN -- sticky\n      uint32_t\n          xx : 1;  // FP inexact exception                             -- sticky\n      uint32_t\n          zx : 1;  // FP zero divide exception                         -- sticky\n      uint32_t\n          ux : 1;  // FP underflow exception                           -- sticky\n      uint32_t\n          ox : 1;  // FP overflow exception                            -- sticky\n      uint32_t vx : 1;   // FP invalid operation exception summary\n      uint32_t fex : 1;  // FP enabled exception summary\n      uint32_t\n          fx : 1;  // FP exception summary                             -- sticky\n    } bits;\n  } fpscr;  // Floating-point status and control register\n\n  uint8_t vscr_sat;\n\n  // uint32_t get_fprf() {\n  //   return fpscr.value & 0x000F8000;\n  // }\n  // void set_fprf(const uint32_t v) {\n  //   fpscr.value = (fpscr.value & ~0x000F8000) | v;\n  // }\n\n  // Thread ID assigned to this context.\n  uint32_t thread_id;\n\n  // Global interrupt lock, held while interrupts are disabled or interrupts are\n  // executing. This is shared among all threads and comes from the processor.\n  std::recursive_mutex* global_mutex;\n\n  // Used to shuttle data into externs. Contents volatile.\n  uint64_t scratch;\n\n  // Processor-specific data pointer. Used on callbacks to get access to the\n  // current runtime and its data.\n  Processor* processor;\n\n  // Shared kernel state, for easy access from kernel exports.\n  xe::kernel::KernelState* kernel_state;\n\n  uint8_t* physical_membase;\n\n  // Value of last reserved load\n  uint64_t reserved_val;\n\n  static std::string GetRegisterName(PPCRegister reg);\n  std::string GetStringFromValue(PPCRegister reg) const;\n  void SetValueFromString(PPCRegister reg, std::string value);\n\n  void SetRegFromString(const char* name, const char* value);\n  bool CompareRegWithString(const char* name, const char* value,\n                            std::string& result) const;\n} PPCContext;\n#pragma pack(pop)\nstatic_assert(sizeof(PPCContext) % 64 == 0, \"64b padded\");\n\n}  // namespace ppc\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_PPC_PPC_CONTEXT_H_\n"
  },
  {
    "path": "src/xenia/cpu/ppc/ppc_decode_data.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2015 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_PPC_PPC_DECODE_DATA_H_\n#define XENIA_CPU_PPC_PPC_DECODE_DATA_H_\n\n#include <cstdint>\n\n#include \"xenia/base/math.h\"\n#include \"xenia/base/string_buffer.h\"\n#include \"xenia/cpu/ppc/ppc_instr.h\"\n#include \"xenia/cpu/ppc/ppc_opcode_info.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace ppc {\n\nconstexpr int64_t XEEXTS16(uint32_t v) { return (int64_t)((int16_t)v); }\nconstexpr int64_t XEEXTS26(uint32_t v) {\n  return (int64_t)(v & 0x02000000 ? (int32_t)v | 0xFC000000 : (int32_t)(v));\n}\nconstexpr uint64_t XEEXTZ16(uint32_t v) { return (uint64_t)((uint16_t)v); }\nstatic inline uint64_t XEMASK(uint32_t mstart, uint32_t mstop) {\n  // if mstart ≤ mstop then\n  //   mask[mstart:mstop] = ones\n  //   mask[all other bits] = zeros\n  // else\n  //   mask[mstart:63] = ones\n  //   mask[0:mstop] = ones\n  //   mask[all other bits] = zeros\n  mstart &= 0x3F;\n  mstop &= 0x3F;\n  uint64_t value =\n      (UINT64_MAX >> mstart) ^ ((mstop >= 63) ? 0 : UINT64_MAX >> (mstop + 1));\n  return mstart <= mstop ? value : ~value;\n}\n\nstruct PPCDecodeData {\n  struct FormatSC {\n    uint32_t LEV() const { return bits_.LEV; }\n\n   private:\n    uint32_t address_;\n    union {\n      uint32_t value_;\n      struct {\n        uint32_t : 5;\n        uint32_t LEV : 7;\n        uint32_t : 20;\n      } bits_;\n    };\n  };\n  struct FormatD {\n    uint32_t RT() const { return bits_.RT; }\n    uint32_t RD() const { return RT(); }\n    uint32_t RS() const { return RT(); }\n    uint32_t FD() const { return RT(); }\n    uint32_t FS() const { return RT(); }\n    uint32_t TO() const { return RT(); }\n    uint32_t RA() const { return bits_.RA; }\n    uint32_t RA0() const { return RA(); }\n    uint32_t DS() const { return bits_.DS; }\n    int32_t d() const { return static_cast<int32_t>(XEEXTS16(DS())); }\n    int32_t SIMM() const { return d(); }\n    uint32_t UIMM() const { return static_cast<uint32_t>(XEEXTZ16(DS())); }\n\n    uint32_t CRFD() const { return bits_.RT >> 2; }\n    uint32_t L() const { return bits_.RT & 0x1; }\n\n   private:\n    uint32_t address_;\n    union {\n      uint32_t value_;\n      struct {\n        uint32_t DS : 16;\n        uint32_t RA : 5;\n        uint32_t RT : 5;\n        uint32_t : 6;\n      } bits_;\n    };\n  };\n  struct FormatDS {\n    uint32_t RT() const { return bits_.RT; }\n    uint32_t RD() const { return RT(); }\n    uint32_t RS() const { return RT(); }\n    uint32_t RA() const { return bits_.RA; }\n    uint32_t RA0() const { return RA(); }\n    uint32_t DS() const { return bits_.DS; }\n    int32_t ds() const { return static_cast<int32_t>(XEEXTS16(DS() << 2)); }\n\n   private:\n    uint32_t address_;\n    union {\n      uint32_t value_;\n      struct {\n        uint32_t : 2;\n        uint32_t DS : 14;\n        uint32_t RA : 5;\n        uint32_t RT : 5;\n        uint32_t : 6;\n      } bits_;\n    };\n  };\n  struct FormatB {\n    uint32_t BO() const { return bits_.BO; }\n    uint32_t BI() const { return bits_.BI; }\n    uint32_t BD() const { return bits_.BD; }\n    uint32_t ADDR() const {\n      return static_cast<uint32_t>(XEEXTS16(BD() << 2)) + (AA() ? 0 : address_);\n    }\n    bool AA() const { return bits_.AA ? true : false; }\n    bool LK() const { return bits_.LK ? true : false; }\n\n   private:\n    uint32_t address_;\n    union {\n      uint32_t value_;\n      struct {\n        uint32_t LK : 1;\n        uint32_t AA : 1;\n        uint32_t BD : 14;\n        uint32_t BI : 5;\n        uint32_t BO : 5;\n        uint32_t : 6;\n      } bits_;\n    };\n  };\n  struct FormatI {\n    uint32_t LI() const { return bits_.LI; }\n    uint32_t ADDR() const {\n      return static_cast<uint32_t>(XEEXTS26(LI() << 2)) + (AA() ? 0 : address_);\n    }\n    bool AA() const { return bits_.AA ? true : false; }\n    bool LK() const { return bits_.LK ? true : false; }\n\n   private:\n    uint32_t address_;\n    union {\n      uint32_t value_;\n      struct {\n        uint32_t LK : 1;\n        uint32_t AA : 1;\n        uint32_t LI : 24;\n        uint32_t : 6;\n      } bits_;\n    };\n  };\n  struct FormatX {\n    uint32_t RT() const { return bits_.RT; }\n    uint32_t RD() const { return RT(); }\n    uint32_t RS() const { return RT(); }\n    uint32_t FD() const { return RT(); }\n    uint32_t FS() const { return RT(); }\n    uint32_t VD() const { return RT(); }\n    uint32_t VS() const { return RT(); }\n    uint32_t TO() const { return RT(); }\n    uint32_t RA() const { return bits_.RA; }\n    uint32_t RA0() const { return RA(); }\n    uint32_t FA() const { return RA(); }\n    uint32_t RB() const { return bits_.RB; }\n    uint32_t FB() const { return RB(); }\n    uint32_t SH() const { return RB(); }\n    uint32_t IMM() const { return RB(); }\n    bool Rc() const { return bits_.Rc ? true : false; }\n\n    uint32_t CRFD() const { return bits_.RT >> 2; }\n    uint32_t L() const { return bits_.RT & 0x1; }\n    uint32_t CRFS() const { return bits_.RA >> 2; }\n\n   private:\n    uint32_t address_;\n    union {\n      uint32_t value_;\n      struct {\n        uint32_t Rc : 1;\n        uint32_t : 10;\n        uint32_t RB : 5;\n        uint32_t RA : 5;\n        uint32_t RT : 5;\n        uint32_t : 6;\n      } bits_;\n    };\n  };\n  struct FormatXL {\n    uint32_t BO() const { return bits_.BO; }\n    uint32_t CRBD() const { return BO(); }\n    uint32_t BI() const { return bits_.BI; }\n    uint32_t CRBA() const { return BI(); }\n    uint32_t BB() const { return bits_.BB; }\n    uint32_t CRBB() const { return BB(); }\n    bool LK() const { return bits_.LK ? true : false; }\n\n    uint32_t CRFD() const { return CRBD() >> 2; }\n    uint32_t CRFS() const { return CRBA() >> 2; }\n\n   private:\n    uint32_t address_;\n    union {\n      uint32_t value_;\n      struct {\n        uint32_t LK : 1;\n        uint32_t : 10;\n        uint32_t BB : 5;\n        uint32_t BI : 5;\n        uint32_t BO : 5;\n        uint32_t : 6;\n      } bits_;\n    };\n  };\n  struct FormatXFX {\n    uint32_t RT() const { return bits_.RT; }\n    uint32_t RD() const { return RT(); }\n    uint32_t RS() const { return RT(); }\n    uint32_t SPR() const { return bits_.SPR; }\n    uint32_t TBR() const {\n      return ((bits_.SPR & 0x1F) << 5) | ((bits_.SPR >> 5) & 0x1F);\n    }\n\n   private:\n    uint32_t address_;\n    union {\n      uint32_t value_;\n      struct {\n        uint32_t : 1;\n        uint32_t : 10;\n        uint32_t SPR : 10;\n        uint32_t RT : 5;\n        uint32_t : 6;\n      } bits_;\n    };\n  };\n  struct FormatXFL {\n    bool L() const { return bits_.L ? true : false; }\n    uint32_t FM() const { return bits_.FM; }\n    bool W() const { return bits_.W ? true : false; }\n    uint32_t RB() const { return bits_.RB; }\n    uint32_t FB() const { return RB(); }\n    bool Rc() const { return bits_.Rc ? true : false; }\n\n   private:\n    uint32_t address_;\n    union {\n      uint32_t value_;\n      struct {\n        uint32_t Rc : 1;\n        uint32_t : 10;\n        uint32_t RB : 5;\n        uint32_t W : 1;\n        uint32_t FM : 8;\n        uint32_t L : 1;\n        uint32_t : 6;\n      } bits_;\n    };\n  };\n  struct FormatXS {\n    uint32_t RT() const { return bits_.RT; }\n    uint32_t RS() const { return RT(); }\n    uint32_t RA() const { return bits_.RA; }\n    uint32_t SH() const { return (bits_.SH5 << 5) | bits_.SH; }\n    bool Rc() const { return bits_.Rc ? true : false; }\n\n   private:\n    uint32_t address_;\n    union {\n      uint32_t value_;\n      struct {\n        uint32_t Rc : 1;\n        uint32_t SH5 : 1;\n        uint32_t : 9;\n        uint32_t SH : 5;\n        uint32_t RA : 5;\n        uint32_t RT : 5;\n        uint32_t : 6;\n      } bits_;\n    };\n  };\n  struct FormatXO {\n    uint32_t RT() const { return bits_.RT; }\n    uint32_t RD() const { return RT(); }\n    uint32_t RA() const { return bits_.RA; }\n    uint32_t RB() const { return bits_.RB; }\n    bool OE() const { return bits_.OE ? true : false; }\n    bool Rc() const { return bits_.Rc ? true : false; }\n\n   private:\n    uint32_t address_;\n    union {\n      uint32_t value_;\n      struct {\n        uint32_t Rc : 1;\n        uint32_t : 9;\n        uint32_t OE : 1;\n        uint32_t RB : 5;\n        uint32_t RA : 5;\n        uint32_t RT : 5;\n        uint32_t : 6;\n      } bits_;\n    };\n  };\n  struct FormatA {\n    uint32_t FT() const { return bits_.FT; }\n    uint32_t FD() const { return FT(); }\n    uint32_t FS() const { return FT(); }\n    uint32_t FA() const { return bits_.FA; }\n    uint32_t FB() const { return bits_.FB; }\n    uint32_t FC() const { return bits_.FC; }\n    uint32_t XO() const { return bits_.XO; }\n    bool Rc() const { return bits_.Rc ? true : false; }\n\n   private:\n    uint32_t address_;\n    union {\n      uint32_t value_;\n      struct {\n        uint32_t Rc : 1;\n        uint32_t XO : 5;\n        uint32_t FC : 5;\n        uint32_t FB : 5;\n        uint32_t FA : 5;\n        uint32_t FT : 5;\n        uint32_t : 6;\n      } bits_;\n    };\n  };\n  struct FormatM {\n    uint32_t RT() const { return bits_.RT; }\n    uint32_t RS() const { return RT(); }\n    uint32_t RA() const { return bits_.RA; }\n    uint32_t SH() const { return bits_.SH; }\n    uint32_t RB() const { return SH(); }\n    uint32_t MB() const { return bits_.MB; }\n    uint32_t ME() const { return bits_.ME; }\n    bool Rc() const { return bits_.Rc ? true : false; }\n\n   private:\n    uint32_t address_;\n    union {\n      uint32_t value_;\n      struct {\n        uint32_t Rc : 1;\n        uint32_t ME : 5;\n        uint32_t MB : 5;\n        uint32_t SH : 5;\n        uint32_t RA : 5;\n        uint32_t RT : 5;\n        uint32_t : 6;\n      } bits_;\n    };\n  };\n  struct FormatMD {\n    uint32_t RT() const { return bits_.RT; }\n    uint32_t RS() const { return RT(); }\n    uint32_t RA() const { return bits_.RA; }\n    uint32_t SH() const { return (bits_.SH5 << 5) | bits_.SH; }\n    uint32_t MB() const { return (bits_.MB5 << 5) | bits_.MB; }\n    uint32_t ME() const { return MB(); }\n    bool Rc() const { return bits_.Rc ? true : false; }\n\n   private:\n    uint32_t address_;\n    union {\n      uint32_t value_;\n      struct {\n        uint32_t Rc : 1;\n        uint32_t SH5 : 1;\n        uint32_t : 3;\n        uint32_t MB5 : 1;\n        uint32_t MB : 5;\n        uint32_t SH : 5;\n        uint32_t RA : 5;\n        uint32_t RT : 5;\n        uint32_t : 6;\n      } bits_;\n    };\n  };\n  struct FormatMDS {\n    uint32_t RT() const { return bits_.RT; }\n    uint32_t RS() const { return RT(); }\n    uint32_t RA() const { return bits_.RA; }\n    uint32_t RB() const { return bits_.RB; }\n    uint32_t MB() const { return (bits_.MB5 << 5) | bits_.MB; }\n    uint32_t ME() const { return MB(); }\n    bool Rc() const { return bits_.Rc ? true : false; }\n\n   private:\n    uint32_t address_;\n    union {\n      uint32_t value_;\n      struct {\n        uint32_t Rc : 1;\n        uint32_t : 4;\n        uint32_t MB5 : 1;\n        uint32_t MB : 5;\n        uint32_t RB : 5;\n        uint32_t RA : 5;\n        uint32_t RT : 5;\n        uint32_t : 6;\n      } bits_;\n    };\n  };\n  struct FormatVX {\n    uint32_t VD() const { return bits_.VD; }\n    uint32_t VA() const { return bits_.VA; }\n    uint32_t VB() const { return bits_.VB; }\n    uint32_t UIMM() const { return VA(); }\n    int32_t SIMM() const { return static_cast<int32_t>(XEEXTS16(VA())); }\n\n   private:\n    uint32_t address_;\n    union {\n      uint32_t value_;\n      struct {\n        uint32_t : 11;\n        uint32_t VB : 5;\n        uint32_t VA : 5;\n        uint32_t VD : 5;\n        uint32_t : 6;\n      } bits_;\n    };\n  };\n  struct FormatVC {\n    uint32_t VD() const { return bits_.VD; }\n    uint32_t VA() const { return bits_.VA; }\n    uint32_t VB() const { return bits_.VB; }\n    bool Rc() const { return bits_.Rc ? true : false; }\n\n   private:\n    uint32_t address_;\n    union {\n      uint32_t value_;\n      struct {\n        uint32_t : 10;\n        uint32_t Rc : 1;\n        uint32_t VB : 5;\n        uint32_t VA : 5;\n        uint32_t VD : 5;\n        uint32_t : 6;\n      } bits_;\n    };\n  };\n  struct FormatVA {\n    uint32_t VD() const { return bits_.VD; }\n    uint32_t VA() const { return bits_.VA; }\n    uint32_t VB() const { return bits_.VB; }\n    uint32_t VC() const { return bits_.VC; }\n    uint32_t SHB() const { return VC() & 0xF; }\n\n   private:\n    uint32_t address_;\n    union {\n      uint32_t value_;\n      struct {\n        uint32_t : 6;\n        uint32_t VC : 5;\n        uint32_t VB : 5;\n        uint32_t VA : 5;\n        uint32_t VD : 5;\n        uint32_t : 6;\n      } bits_;\n    };\n  };\n  struct FormatVX128 {\n    uint32_t VD() const { return bits_.VD128l | (bits_.VD128h << 5); }\n    uint32_t VA() const {\n      return bits_.VA128l | (bits_.VA128h << 5) | (bits_.VA128H << 6);\n    }\n    uint32_t VB() const { return bits_.VB128l | (bits_.VB128h << 5); }\n\n   private:\n    uint32_t address_;\n    union {\n      uint32_t value_;\n      struct {\n        uint32_t VB128h : 2;\n        uint32_t VD128h : 2;\n        uint32_t : 1;\n        uint32_t VA128h : 1;\n        uint32_t : 4;\n        uint32_t VA128H : 1;\n        uint32_t VB128l : 5;\n        uint32_t VA128l : 5;\n        uint32_t VD128l : 5;\n        uint32_t : 6;\n      } bits_;\n    };\n  };\n  struct FormatVX128_1 {\n    uint32_t VD() const { return bits_.VD128l | (bits_.VD128h << 5); }\n    uint32_t VS() const { return VD(); }\n    uint32_t RA() const { return bits_.RA; }\n    uint32_t RA0() const { return RA(); }\n    uint32_t RB() const { return bits_.RB; }\n\n   private:\n    uint32_t address_;\n    union {\n      uint32_t value_;\n      struct {\n        uint32_t : 2;\n        uint32_t VD128h : 2;\n        uint32_t : 7;\n        uint32_t RB : 5;\n        uint32_t RA : 5;\n        uint32_t VD128l : 5;\n        uint32_t : 6;\n      } bits_;\n    };\n  };\n  struct FormatVX128_2 {\n    uint32_t VD() const { return bits_.VD128l | (bits_.VD128h << 5); }\n    uint32_t VA() const {\n      return bits_.VA128l | (bits_.VA128h << 5) | (bits_.VA128H << 6);\n    }\n    uint32_t VB() const { return bits_.VB128l | (bits_.VB128h << 5); }\n    uint32_t VC() const { return bits_.VC; }\n\n   private:\n    uint32_t address_;\n    union {\n      uint32_t value_;\n      struct {\n        uint32_t VB128h : 2;\n        uint32_t VD128h : 2;\n        uint32_t : 1;\n        uint32_t VA128h : 1;\n        uint32_t VC : 3;\n        uint32_t : 1;\n        uint32_t VA128H : 1;\n        uint32_t VB128l : 5;\n        uint32_t VA128l : 5;\n        uint32_t VD128l : 5;\n        uint32_t : 6;\n      } bits_;\n    };\n  };\n  struct FormatVX128_3 {\n    uint32_t VD() const { return bits_.VD128l | (bits_.VD128h << 5); }\n    uint32_t VB() const { return bits_.VB128l | (bits_.VB128h << 5); }\n    uint32_t UIMM() const { return bits_.UIMM; }\n    int32_t SIMM() const { return static_cast<int32_t>(XEEXTS16(bits_.UIMM)); }\n\n   private:\n    uint32_t address_;\n    union {\n      uint32_t value_;\n      struct {\n        uint32_t VB128h : 2;\n        uint32_t VD128h : 2;\n        uint32_t : 7;\n        uint32_t VB128l : 5;\n        uint32_t UIMM : 5;\n        uint32_t VD128l : 5;\n        uint32_t : 6;\n      } bits_;\n    };\n  };\n  struct FormatVX128_4 {\n    uint32_t VD() const { return bits_.VD128l | (bits_.VD128h << 5); }\n    uint32_t VB() const { return bits_.VB128l | (bits_.VB128h << 5); }\n    uint32_t IMM() const { return bits_.IMM; }\n    uint32_t z() const { return bits_.z; }\n\n   private:\n    uint32_t address_;\n    union {\n      uint32_t value_;\n      struct {\n        uint32_t VB128h : 2;\n        uint32_t VD128h : 2;\n        uint32_t : 2;\n        uint32_t z : 2;\n        uint32_t : 3;\n        uint32_t VB128l : 5;\n        uint32_t IMM : 5;\n        uint32_t VD128l : 5;\n        uint32_t : 6;\n      } bits_;\n    };\n  };\n  struct FormatVX128_5 {\n    uint32_t VD() const { return bits_.VD128l | (bits_.VD128h << 5); }\n    uint32_t VA() const {\n      return bits_.VA128l | (bits_.VA128h << 5) | (bits_.VA128H << 6);\n    }\n    uint32_t VB() const { return bits_.VB128l | (bits_.VB128h << 5); }\n    uint32_t SH() const { return bits_.SH; }\n\n   private:\n    uint32_t address_;\n    union {\n      uint32_t value_;\n      struct {\n        uint32_t VB128h : 2;\n        uint32_t VD128h : 2;\n        uint32_t : 1;\n        uint32_t VA128h : 1;\n        uint32_t SH : 4;\n        uint32_t VA128H : 1;\n        uint32_t VB128l : 5;\n        uint32_t VA128l : 5;\n        uint32_t VD128l : 5;\n        uint32_t : 6;\n      } bits_;\n    };\n  };\n  struct FormatVX128_R {\n    uint32_t VD() const { return bits_.VD128l | (bits_.VD128h << 5); }\n    uint32_t VA() const {\n      return bits_.VA128l | (bits_.VA128h << 5) | (bits_.VA128H << 6);\n    }\n    uint32_t VB() const { return bits_.VB128l | (bits_.VB128h << 5); }\n    bool Rc() const { return bits_.Rc ? true : false; }\n\n   private:\n    uint32_t address_;\n    union {\n      uint32_t value_;\n      struct {\n        uint32_t VB128h : 2;\n        uint32_t VD128h : 2;\n        uint32_t : 1;\n        uint32_t VA128h : 1;\n        uint32_t Rc : 1;\n        uint32_t : 3;\n        uint32_t VA128H : 1;\n        uint32_t VB128l : 5;\n        uint32_t VA128l : 5;\n        uint32_t VD128l : 5;\n        uint32_t : 6;\n      } bits_;\n    };\n  };\n  struct FormatVX128_P {\n    uint32_t VD() const { return bits_.VD128l | (bits_.VD128h << 5); }\n    uint32_t VB() const { return bits_.VB128l | (bits_.VB128h << 5); }\n    uint32_t UIMM() const { return bits_.PERMl | (bits_.PERMh << 5); }\n\n   private:\n    uint32_t address_;\n    union {\n      uint32_t value_;\n      struct {\n        uint32_t VB128h : 2;\n        uint32_t VD128h : 2;\n        uint32_t : 2;\n        uint32_t PERMh : 3;\n        uint32_t : 2;\n        uint32_t VB128l : 5;\n        uint32_t PERMl : 5;\n        uint32_t VD128l : 5;\n        uint32_t : 6;\n      } bits_;\n    };\n  };\n\n  union {\n    struct {\n      uint32_t address;\n      uint32_t code;\n    };\n    FormatSC SC;\n    FormatD D;\n    FormatDS DS;\n    FormatB B;\n    FormatI I;\n    FormatX X;\n    FormatXL XL;\n    FormatXFX XFX;\n    FormatXFL XFL;\n    FormatXS XS;\n    FormatXO XO;\n    FormatA A;\n    FormatM M;\n    FormatMD MD;\n    FormatMDS MDS;\n    FormatX DCBZ;\n    FormatVX VX;\n    FormatVC VC;\n    FormatVA VA;\n    FormatVX128 VX128;\n    FormatVX128_1 VX128_1;\n    FormatVX128_2 VX128_2;\n    FormatVX128_3 VX128_3;\n    FormatVX128_4 VX128_4;\n    FormatVX128_5 VX128_5;\n    FormatVX128_R VX128_R;\n    FormatVX128_P VX128_P;\n  };\n};\n\n}  // namespace ppc\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_PPC_PPC_DECODE_DATA_H_\n"
  },
  {
    "path": "src/xenia/cpu/ppc/ppc_emit-private.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_PPC_PPC_EMIT_PRIVATE_H_\n#define XENIA_CPU_PPC_PPC_EMIT_PRIVATE_H_\n\n#include \"xenia/base/logging.h\"\n#include \"xenia/cpu/ppc/ppc_decode_data.h\"\n#include \"xenia/cpu/ppc/ppc_emit.h\"\n#include \"xenia/cpu/ppc/ppc_opcode_info.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace ppc {\n\n#define XEREGISTERINSTR(name) \\\n  RegisterOpcodeEmitter(PPCOpcode::name, InstrEmit_##name);\n\n#define XEINSTRNOTIMPLEMENTED()                      \\\n  XELOGE(\"Unimplemented instruction: {}\", __func__); \\\n  assert_always(\"Instruction not implemented\");\n\n}  // namespace ppc\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_PPC_PPC_EMIT_PRIVATE_H_\n"
  },
  {
    "path": "src/xenia/cpu/ppc/ppc_emit.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_PPC_PPC_EMIT_H_\n#define XENIA_CPU_PPC_PPC_EMIT_H_\n\nnamespace xe {\nnamespace cpu {\nnamespace ppc {\n\nvoid RegisterEmitCategoryAltivec();\nvoid RegisterEmitCategoryALU();\nvoid RegisterEmitCategoryControl();\nvoid RegisterEmitCategoryFPU();\nvoid RegisterEmitCategoryMemory();\n\n}  // namespace ppc\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_PPC_PPC_EMIT_H_\n"
  },
  {
    "path": "src/xenia/cpu/ppc/ppc_emit_altivec.cc",
    "content": "/*\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/ppc/ppc_emit-private.h\"\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/cpu/ppc/ppc_context.h\"\n#include \"xenia/cpu/ppc/ppc_hir_builder.h\"\n\n#include <cmath>\n\nnamespace xe {\nnamespace cpu {\nnamespace ppc {\n\n// TODO(benvanik): remove when enums redefined.\nusing namespace xe::cpu::hir;\n\nusing xe::cpu::hir::Value;\n\nValue* CalculateEA_0(PPCHIRBuilder& f, uint32_t ra, uint32_t rb);\n\n#define SHUFPS_SWAP_DWORDS 0x1B\n\n// Most of this file comes from:\n// http://biallas.net/doc/vmx128/vmx128.txt\n// https://github.com/kakaroto/ps3ida/blob/master/plugins/PPCAltivec/src/main.cpp\n// https://sannybuilder.com/forums/viewtopic.php?id=190\n\n#define OP(x) ((((uint32_t)(x)) & 0x3f) << 26)\n#define VX128(op, xop) (OP(op) | (((uint32_t)(xop)) & 0x3d0))\n#define VX128_1(op, xop) (OP(op) | (((uint32_t)(xop)) & 0x7f3))\n#define VX128_2(op, xop) (OP(op) | (((uint32_t)(xop)) & 0x210))\n#define VX128_3(op, xop) (OP(op) | (((uint32_t)(xop)) & 0x7f0))\n#define VX128_4(op, xop) (OP(op) | (((uint32_t)(xop)) & 0x730))\n#define VX128_5(op, xop) (OP(op) | (((uint32_t)(xop)) & 0x10))\n#define VX128_P(op, xop) (OP(op) | (((uint32_t)(xop)) & 0x630))\n\n#define VX128_VD128 (i.VX128.VD128l | (i.VX128.VD128h << 5))\n#define VX128_VA128 \\\n  (i.VX128.VA128l | (i.VX128.VA128h << 5) | (i.VX128.VA128H << 6))\n#define VX128_VB128 (i.VX128.VB128l | (i.VX128.VB128h << 5))\n#define VX128_1_VD128 (i.VX128_1.VD128l | (i.VX128_1.VD128h << 5))\n#define VX128_2_VD128 (i.VX128_2.VD128l | (i.VX128_2.VD128h << 5))\n#define VX128_2_VA128 \\\n  (i.VX128_2.VA128l | (i.VX128_2.VA128h << 5) | (i.VX128_2.VA128H << 6))\n#define VX128_2_VB128 (i.VX128_2.VB128l | (i.VX128_2.VB128h << 5))\n#define VX128_2_VC (i.VX128_2.VC)\n#define VX128_3_VD128 (i.VX128_3.VD128l | (i.VX128_3.VD128h << 5))\n#define VX128_3_VB128 (i.VX128_3.VB128l | (i.VX128_3.VB128h << 5))\n#define VX128_3_IMM (i.VX128_3.IMM)\n#define VX128_5_VD128 (i.VX128_5.VD128l | (i.VX128_5.VD128h << 5))\n#define VX128_5_VA128 \\\n  (i.VX128_5.VA128l | (i.VX128_5.VA128h << 5)) | (i.VX128_5.VA128H << 6)\n#define VX128_5_VB128 (i.VX128_5.VB128l | (i.VX128_5.VB128h << 5))\n#define VX128_5_SH (i.VX128_5.SH)\n#define VX128_R_VD128 (i.VX128_R.VD128l | (i.VX128_R.VD128h << 5))\n#define VX128_R_VA128 \\\n  (i.VX128_R.VA128l | (i.VX128_R.VA128h << 5) | (i.VX128_R.VA128H << 6))\n#define VX128_R_VB128 (i.VX128_R.VB128l | (i.VX128_R.VB128h << 5))\n\nunsigned int xerotl(unsigned int value, unsigned int shift) {\n  assert_true(shift < 32);\n  return shift == 0 ? value : ((value << shift) | (value >> (32 - shift)));\n}\n\nint InstrEmit_lvebx(PPCHIRBuilder& f, const InstrData& i) {\n  // Same as lvx.\n  Value* ea =\n      f.And(CalculateEA_0(f, i.X.RA, i.X.RB), f.LoadConstantUint64(~0xFull));\n  f.StoreVR(i.X.RT, f.ByteSwap(f.Load(ea, VEC128_TYPE)));\n  return 0;\n}\n\nint InstrEmit_lvehx(PPCHIRBuilder& f, const InstrData& i) {\n  // Same as lvx.\n  Value* ea =\n      f.And(CalculateEA_0(f, i.X.RA, i.X.RB), f.LoadConstantUint64(~0xFull));\n  f.StoreVR(i.X.RT, f.ByteSwap(f.Load(ea, VEC128_TYPE)));\n  return 0;\n}\n\nint InstrEmit_lvewx_(PPCHIRBuilder& f, const InstrData& i, uint32_t vd,\n                     uint32_t ra, uint32_t rb) {\n  // Same as lvx.\n  Value* ea = f.And(CalculateEA_0(f, ra, rb), f.LoadConstantUint64(~0xFull));\n  f.StoreVR(vd, f.ByteSwap(f.Load(ea, VEC128_TYPE)));\n  return 0;\n}\nint InstrEmit_lvewx(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_lvewx_(f, i, i.X.RT, i.X.RA, i.X.RB);\n}\nint InstrEmit_lvewx128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_lvewx_(f, i, VX128_1_VD128, i.VX128_1.RA, i.VX128_1.RB);\n}\n\nint InstrEmit_lvsl_(PPCHIRBuilder& f, const InstrData& i, uint32_t vd,\n                    uint32_t ra, uint32_t rb) {\n  Value* ea = CalculateEA_0(f, ra, rb);\n  Value* sh = f.Truncate(f.And(ea, f.LoadConstantInt64(0xF)), INT8_TYPE);\n  Value* v = f.LoadVectorShl(sh);\n  f.StoreVR(vd, v);\n  return 0;\n}\nint InstrEmit_lvsl(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_lvsl_(f, i, i.X.RT, i.X.RA, i.X.RB);\n}\nint InstrEmit_lvsl128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_lvsl_(f, i, VX128_1_VD128, i.VX128_1.RA, i.VX128_1.RB);\n}\n\nint InstrEmit_lvsr_(PPCHIRBuilder& f, const InstrData& i, uint32_t vd,\n                    uint32_t ra, uint32_t rb) {\n  Value* ea = CalculateEA_0(f, ra, rb);\n  Value* sh = f.Truncate(f.And(ea, f.LoadConstantInt64(0xF)), INT8_TYPE);\n  Value* v = f.LoadVectorShr(sh);\n  f.StoreVR(vd, v);\n  return 0;\n}\nint InstrEmit_lvsr(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_lvsr_(f, i, i.X.RT, i.X.RA, i.X.RB);\n}\nint InstrEmit_lvsr128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_lvsr_(f, i, VX128_1_VD128, i.VX128_1.RA, i.VX128_1.RB);\n}\n\nint InstrEmit_lvx_(PPCHIRBuilder& f, const InstrData& i, uint32_t vd,\n                   uint32_t ra, uint32_t rb) {\n  Value* ea = f.And(CalculateEA_0(f, ra, rb), f.LoadConstantInt64(~0xFull));\n  f.StoreVR(vd, f.ByteSwap(f.Load(ea, VEC128_TYPE)));\n  return 0;\n}\nint InstrEmit_lvx(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_lvx_(f, i, i.X.RT, i.X.RA, i.X.RB);\n}\nint InstrEmit_lvx128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_lvx_(f, i, VX128_1_VD128, i.VX128_1.RA, i.VX128_1.RB);\n}\nint InstrEmit_lvxl(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_lvx(f, i);\n}\nint InstrEmit_lvxl128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_lvx128(f, i);\n}\n\nint InstrEmit_stvebx(PPCHIRBuilder& f, const InstrData& i) {\n  Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB);\n  Value* el = f.And(f.Truncate(ea, INT8_TYPE), f.LoadConstantUint8(0xF));\n  Value* v = f.Extract(f.LoadVR(i.X.RT), el, INT8_TYPE);\n  f.Store(ea, v);\n  return 0;\n}\n\nint InstrEmit_stvehx(PPCHIRBuilder& f, const InstrData& i) {\n  Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB);\n  ea = f.And(ea, f.LoadConstantUint64(~0x1ull));\n  Value* el =\n      f.Shr(f.And(f.Truncate(ea, INT8_TYPE), f.LoadConstantUint8(0xF)), 1);\n  Value* v = f.Extract(f.LoadVR(i.X.RT), el, INT16_TYPE);\n  f.Store(ea, f.ByteSwap(v));\n  return 0;\n}\n\nint InstrEmit_stvewx_(PPCHIRBuilder& f, const InstrData& i, uint32_t vd,\n                      uint32_t ra, uint32_t rb) {\n  Value* ea = CalculateEA_0(f, ra, rb);\n  ea = f.And(ea, f.LoadConstantUint64(~0x3ull));\n  Value* el =\n      f.Shr(f.And(f.Truncate(ea, INT8_TYPE), f.LoadConstantUint8(0xF)), 2);\n  Value* v = f.Extract(f.LoadVR(vd), el, INT32_TYPE);\n  f.Store(ea, f.ByteSwap(v));\n  return 0;\n}\nint InstrEmit_stvewx(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_stvewx_(f, i, i.X.RT, i.X.RA, i.X.RB);\n}\nint InstrEmit_stvewx128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_stvewx_(f, i, VX128_1_VD128, i.VX128_1.RA, i.VX128_1.RB);\n}\n\nint InstrEmit_stvx_(PPCHIRBuilder& f, const InstrData& i, uint32_t vd,\n                    uint32_t ra, uint32_t rb) {\n  Value* ea = f.And(CalculateEA_0(f, ra, rb), f.LoadConstantUint64(~0xFull));\n  f.Store(ea, f.ByteSwap(f.LoadVR(vd)));\n  return 0;\n}\nint InstrEmit_stvx(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_stvx_(f, i, i.X.RT, i.X.RA, i.X.RB);\n}\nint InstrEmit_stvx128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_stvx_(f, i, VX128_1_VD128, i.VX128_1.RA, i.VX128_1.RB);\n}\nint InstrEmit_stvxl(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_stvx(f, i);\n}\nint InstrEmit_stvxl128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_stvx128(f, i);\n}\n\n// The lvlx/lvrx/etc instructions are in Cell docs only:\n// https://www-01.ibm.com/chips/techlib/techlib.nsf/techdocs/C40E4C6133B31EE8872570B500791108/$file/vector_simd_pem_v_2.07c_26Oct2006_cell.pdf\nint InstrEmit_lvlx_(PPCHIRBuilder& f, const InstrData& i, uint32_t vd,\n                    uint32_t ra, uint32_t rb) {\n  Value* ea = CalculateEA_0(f, ra, rb);\n  Value* eb = f.And(f.Truncate(ea, INT8_TYPE), f.LoadConstantInt8(0xF));\n  // ea &= ~0xF\n  ea = f.And(ea, f.LoadConstantUint64(~0xFull));\n  // v = (new << eb)\n  Value* v = f.Permute(f.LoadVectorShl(eb), f.ByteSwap(f.Load(ea, VEC128_TYPE)),\n                       f.LoadZeroVec128(), INT8_TYPE);\n  f.StoreVR(vd, v);\n  return 0;\n}\nint InstrEmit_lvlx(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_lvlx_(f, i, i.X.RT, i.X.RA, i.X.RB);\n}\nint InstrEmit_lvlx128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_lvlx_(f, i, VX128_1_VD128, i.VX128_1.RA, i.VX128_1.RB);\n}\nint InstrEmit_lvlxl(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_lvlx(f, i);\n}\nint InstrEmit_lvlxl128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_lvlx128(f, i);\n}\n\nint InstrEmit_lvrx_(PPCHIRBuilder& f, const InstrData& i, uint32_t vd,\n                    uint32_t ra, uint32_t rb) {\n  // NOTE: if eb == 0 (so 16b aligned) then no data is loaded. This is important\n  // as often times memcpy's will use this to handle the remaining <=16b of a\n  // buffer, which sometimes may be nothing and hang off the end of the valid\n  // page area. We still need to zero the resulting register, though.\n  Value* ea = CalculateEA_0(f, ra, rb);\n  Value* eb = f.And(f.Truncate(ea, INT8_TYPE), f.LoadConstantInt8(0xF));\n  // Skip if %16=0 (just load zero).\n  auto load_label = f.NewLabel();\n  auto end_label = f.NewLabel();\n  f.BranchTrue(eb, load_label);\n  f.StoreVR(vd, f.LoadZeroVec128());\n  f.Branch(end_label);\n  f.MarkLabel(load_label);\n  // ea &= ~0xF\n  // NOTE: need to recalculate ea and eb because after Branch we start a new\n  // block and we can't use their previous instantiation in the new block\n  ea = CalculateEA_0(f, ra, rb);\n  eb = f.And(f.Truncate(ea, INT8_TYPE), f.LoadConstantInt8(0xF));\n  ea = f.And(ea, f.LoadConstantUint64(~0xFull));\n  // v = (new >> (16 - eb))\n  Value* v = f.Permute(f.LoadVectorShl(eb), f.LoadZeroVec128(),\n                       f.ByteSwap(f.Load(ea, VEC128_TYPE)), INT8_TYPE);\n  f.StoreVR(vd, v);\n  f.MarkLabel(end_label);\n  return 0;\n}\nint InstrEmit_lvrx(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_lvrx_(f, i, i.X.RT, i.X.RA, i.X.RB);\n}\nint InstrEmit_lvrx128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_lvrx_(f, i, VX128_1_VD128, i.VX128_1.RA, i.VX128_1.RB);\n}\nint InstrEmit_lvrxl(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_lvrx(f, i);\n}\nint InstrEmit_lvrxl128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_lvrx128(f, i);\n}\n\nint InstrEmit_stvlx_(PPCHIRBuilder& f, const InstrData& i, uint32_t vd,\n                     uint32_t ra, uint32_t rb) {\n  // NOTE: if eb == 0 (so 16b aligned) this equals new_value\n  //       we could optimize this to prevent the other load/mask, in that case.\n  Value* ea = CalculateEA_0(f, ra, rb);\n  Value* eb = f.And(f.Truncate(ea, INT8_TYPE), f.LoadConstantInt8(0xF));\n  // ea &= ~0xF\n  ea = f.And(ea, f.LoadConstantUint64(~0xFull));\n  // v = (old & ~mask) | ((new >> eb) & mask)\n  Value* new_value = f.Permute(f.LoadVectorShr(eb), f.LoadZeroVec128(),\n                               f.LoadVR(vd), INT8_TYPE);\n  Value* old_value = f.ByteSwap(f.Load(ea, VEC128_TYPE));\n  // mask = FFFF... >> eb\n  Value* mask = f.Permute(f.LoadVectorShr(eb), f.LoadZeroVec128(),\n                          f.Not(f.LoadZeroVec128()), INT8_TYPE);\n  Value* v = f.Or(f.AndNot(old_value, mask), f.And(new_value, mask));\n  // ea &= ~0xF (handled above)\n  f.Store(ea, f.ByteSwap(v));\n  return 0;\n}\nint InstrEmit_stvlx(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_stvlx_(f, i, i.X.RT, i.X.RA, i.X.RB);\n}\nint InstrEmit_stvlx128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_stvlx_(f, i, VX128_1_VD128, i.VX128_1.RA, i.VX128_1.RB);\n}\nint InstrEmit_stvlxl(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_stvlx(f, i);\n}\nint InstrEmit_stvlxl128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_stvlx128(f, i);\n}\n\nint InstrEmit_stvrx_(PPCHIRBuilder& f, const InstrData& i, uint32_t vd,\n                     uint32_t ra, uint32_t rb) {\n  // NOTE: if eb == 0 (so 16b aligned) then no data is loaded. This is important\n  // as often times memcpy's will use this to handle the remaining <=16b of a\n  // buffer, which sometimes may be nothing and hang off the end of the valid\n  // page area.\n  Value* ea = CalculateEA_0(f, ra, rb);\n  Value* eb = f.And(f.Truncate(ea, INT8_TYPE), f.LoadConstantInt8(0xF));\n  // Skip if %16=0 (no data to store).\n  auto skip_label = f.NewLabel();\n  f.BranchFalse(eb, skip_label);\n  // ea &= ~0xF\n  // NOTE: need to recalculate ea and eb because after Branch we start a new\n  // block and we can't use their previous instantiation in the new block\n  ea = CalculateEA_0(f, ra, rb);\n  eb = f.And(f.Truncate(ea, INT8_TYPE), f.LoadConstantInt8(0xF));\n  ea = f.And(ea, f.LoadConstantUint64(~0xFull));\n  // v = (old & ~mask) | ((new << eb) & mask)\n  Value* new_value = f.Permute(f.LoadVectorShr(eb), f.LoadVR(vd),\n                               f.LoadZeroVec128(), INT8_TYPE);\n  Value* old_value = f.ByteSwap(f.Load(ea, VEC128_TYPE));\n  // mask = ~FFFF... >> eb\n  Value* mask = f.Permute(f.LoadVectorShr(eb), f.Not(f.LoadZeroVec128()),\n                          f.LoadZeroVec128(), INT8_TYPE);\n  Value* v = f.Or(f.AndNot(old_value, mask), f.And(new_value, mask));\n  // ea &= ~0xF (handled above)\n  f.Store(ea, f.ByteSwap(v));\n  f.MarkLabel(skip_label);\n  return 0;\n}\nint InstrEmit_stvrx(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_stvrx_(f, i, i.X.RT, i.X.RA, i.X.RB);\n}\nint InstrEmit_stvrx128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_stvrx_(f, i, VX128_1_VD128, i.VX128_1.RA, i.VX128_1.RB);\n}\nint InstrEmit_stvrxl(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_stvrx(f, i);\n}\nint InstrEmit_stvrxl128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_stvrx128(f, i);\n}\n\nint InstrEmit_mfvscr(PPCHIRBuilder& f, const InstrData& i) {\n  XEINSTRNOTIMPLEMENTED();\n  return 1;\n}\n\nint InstrEmit_mtvscr(PPCHIRBuilder& f, const InstrData& i) {\n  XEINSTRNOTIMPLEMENTED();\n  return 1;\n}\n\nint InstrEmit_vaddcuw(PPCHIRBuilder& f, const InstrData& i) {\n  Value* sum = f.VectorAdd(f.LoadVR(i.VX.VA), f.LoadVR(i.VX.VB), INT32_TYPE,\n                           ARITHMETIC_UNSIGNED);\n  Value* overflow = f.VectorCompareUGT(f.LoadVR(i.VX.VA), sum, INT32_TYPE);\n  Value* carry =\n      f.VectorShr(overflow, f.LoadConstantVec128(vec128i(31)), INT32_TYPE);\n  f.StoreVR(i.VX.VD, carry);\n  return 0;\n}\n\nint InstrEmit_vaddfp_(PPCHIRBuilder& f, uint32_t vd, uint32_t va, uint32_t vb) {\n  // (VD) <- (VA) + (VB) (4 x fp)\n  Value* v = f.VectorAdd(f.LoadVR(va), f.LoadVR(vb), FLOAT32_TYPE);\n  f.StoreVR(vd, v);\n  return 0;\n}\nint InstrEmit_vaddfp(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vaddfp_(f, i.VX.VD, i.VX.VA, i.VX.VB);\n}\nint InstrEmit_vaddfp128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vaddfp_(f, VX128_VD128, VX128_VA128, VX128_VB128);\n}\n\nint InstrEmit_vaddsbs(PPCHIRBuilder& f, const InstrData& i) {\n  Value* v = f.VectorAdd(f.LoadVR(i.VX.VA), f.LoadVR(i.VX.VB), INT8_TYPE,\n                         ARITHMETIC_SATURATE);\n  f.StoreSAT(f.DidSaturate(v));\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vaddshs(PPCHIRBuilder& f, const InstrData& i) {\n  Value* v = f.VectorAdd(f.LoadVR(i.VX.VA), f.LoadVR(i.VX.VB), INT16_TYPE,\n                         ARITHMETIC_SATURATE);\n  f.StoreSAT(f.DidSaturate(v));\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vaddsws(PPCHIRBuilder& f, const InstrData& i) {\n  Value* v = f.VectorAdd(f.LoadVR(i.VX.VA), f.LoadVR(i.VX.VB), INT32_TYPE,\n                         ARITHMETIC_SATURATE);\n  f.StoreSAT(f.DidSaturate(v));\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vaddubm(PPCHIRBuilder& f, const InstrData& i) {\n  Value* v = f.VectorAdd(f.LoadVR(i.VX.VA), f.LoadVR(i.VX.VB), INT8_TYPE,\n                         ARITHMETIC_UNSIGNED);\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vaddubs(PPCHIRBuilder& f, const InstrData& i) {\n  Value* v = f.VectorAdd(f.LoadVR(i.VX.VA), f.LoadVR(i.VX.VB), INT8_TYPE,\n                         ARITHMETIC_UNSIGNED | ARITHMETIC_SATURATE);\n  f.StoreSAT(f.DidSaturate(v));\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vadduhm(PPCHIRBuilder& f, const InstrData& i) {\n  Value* v = f.VectorAdd(f.LoadVR(i.VX.VA), f.LoadVR(i.VX.VB), INT16_TYPE,\n                         ARITHMETIC_UNSIGNED);\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vadduhs(PPCHIRBuilder& f, const InstrData& i) {\n  Value* v = f.VectorAdd(f.LoadVR(i.VX.VA), f.LoadVR(i.VX.VB), INT16_TYPE,\n                         ARITHMETIC_UNSIGNED | ARITHMETIC_SATURATE);\n  f.StoreSAT(f.DidSaturate(v));\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vadduwm(PPCHIRBuilder& f, const InstrData& i) {\n  Value* v = f.VectorAdd(f.LoadVR(i.VX.VA), f.LoadVR(i.VX.VB), INT32_TYPE,\n                         ARITHMETIC_UNSIGNED);\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vadduws(PPCHIRBuilder& f, const InstrData& i) {\n  Value* v = f.VectorAdd(f.LoadVR(i.VX.VA), f.LoadVR(i.VX.VB), INT32_TYPE,\n                         ARITHMETIC_UNSIGNED | ARITHMETIC_SATURATE);\n  f.StoreSAT(f.DidSaturate(v));\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vand_(PPCHIRBuilder& f, uint32_t vd, uint32_t va, uint32_t vb) {\n  // VD <- (VA) & (VB)\n  Value* v = f.And(f.LoadVR(va), f.LoadVR(vb));\n  f.StoreVR(vd, v);\n  return 0;\n}\nint InstrEmit_vand(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vand_(f, i.VX.VD, i.VX.VA, i.VX.VB);\n}\nint InstrEmit_vand128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vand_(f, VX128_VD128, VX128_VA128, VX128_VB128);\n}\n\nint InstrEmit_vandc_(PPCHIRBuilder& f, uint32_t vd, uint32_t va, uint32_t vb) {\n  // VD <- (VA) & ¬(VB)\n  Value* v = f.AndNot(f.LoadVR(va), f.LoadVR(vb));\n  f.StoreVR(vd, v);\n  return 0;\n}\nint InstrEmit_vandc(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vandc_(f, i.VX.VD, i.VX.VA, i.VX.VB);\n}\nint InstrEmit_vandc128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vandc_(f, VX128_VD128, VX128_VA128, VX128_VB128);\n}\n\nint InstrEmit_vavgsb(PPCHIRBuilder& f, const InstrData& i) {\n  Value* v =\n      f.VectorAverage(f.LoadVR(i.VX.VA), f.LoadVR(i.VX.VB), INT8_TYPE, 0);\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vavgsh(PPCHIRBuilder& f, const InstrData& i) {\n  Value* v =\n      f.VectorAverage(f.LoadVR(i.VX.VA), f.LoadVR(i.VX.VB), INT16_TYPE, 0);\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vavgsw(PPCHIRBuilder& f, const InstrData& i) {\n  // do i = 0 to 127 by 32\n  //   aop = EXTS((VRA)i:i + 31)\n  //   bop = EXTS((VRB)i:i + 31)\n  //   VRTi:i + 31 = Chop((aop + int bop + int 1) >> 1, 32)\n  Value* v =\n      f.VectorAverage(f.LoadVR(i.VX.VA), f.LoadVR(i.VX.VB), INT32_TYPE, 0);\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vavgub(PPCHIRBuilder& f, const InstrData& i) {\n  Value* v = f.VectorAverage(f.LoadVR(i.VX.VA), f.LoadVR(i.VX.VB), INT8_TYPE,\n                             ARITHMETIC_UNSIGNED);\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vavguh(PPCHIRBuilder& f, const InstrData& i) {\n  Value* v = f.VectorAverage(f.LoadVR(i.VX.VA), f.LoadVR(i.VX.VB), INT16_TYPE,\n                             ARITHMETIC_UNSIGNED);\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vavguw(PPCHIRBuilder& f, const InstrData& i) {\n  Value* v = f.VectorAverage(f.LoadVR(i.VX.VA), f.LoadVR(i.VX.VB), INT32_TYPE,\n                             ARITHMETIC_UNSIGNED);\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vcfsx_(PPCHIRBuilder& f, uint32_t vd, uint32_t vb,\n                     uint32_t uimm) {\n  // (VD) <- float(VB as signed) / 2^uimm\n  Value* v = f.VectorConvertI2F(f.LoadVR(vb));\n  if (uimm) {\n    float fuimm = std::ldexp(1.0f, -int(uimm));\n    v = f.Mul(v, f.Splat(f.LoadConstantFloat32(fuimm), VEC128_TYPE));\n  }\n  f.StoreVR(vd, v);\n  return 0;\n}\nint InstrEmit_vcfsx(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vcfsx_(f, i.VX.VD, i.VX.VB, i.VX.VA);\n}\nint InstrEmit_vcsxwfp128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vcfsx_(f, VX128_3_VD128, VX128_3_VB128, VX128_3_IMM);\n}\n\nint InstrEmit_vcfux_(PPCHIRBuilder& f, uint32_t vd, uint32_t vb,\n                     uint32_t uimm) {\n  // (VD) <- float(VB as unsigned) / 2^uimm\n  Value* v = f.VectorConvertI2F(f.LoadVR(vb), ARITHMETIC_UNSIGNED);\n  if (uimm) {\n    float fuimm = std::ldexp(1.0f, -int(uimm));\n    v = f.Mul(v, f.Splat(f.LoadConstantFloat32(fuimm), VEC128_TYPE));\n  }\n  f.StoreVR(vd, v);\n  return 0;\n}\nint InstrEmit_vcfux(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vcfux_(f, i.VX.VD, i.VX.VB, i.VX.VA);\n}\nint InstrEmit_vcuxwfp128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vcfux_(f, VX128_3_VD128, VX128_3_VB128, VX128_3_IMM);\n}\n\nint InstrEmit_vctsxs_(PPCHIRBuilder& f, uint32_t vd, uint32_t vb,\n                      uint32_t uimm) {\n  // (VD) <- int_sat(VB as signed * 2^uimm)\n  float fuimm = static_cast<float>(std::exp2(uimm));\n  Value* v =\n      f.Mul(f.LoadVR(vb), f.Splat(f.LoadConstantFloat32(fuimm), VEC128_TYPE));\n  v = f.VectorConvertF2I(v);\n  f.StoreSAT(f.DidSaturate(v));\n  f.StoreVR(vd, v);\n  return 0;\n}\nint InstrEmit_vctsxs(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vctsxs_(f, i.VX.VD, i.VX.VB, i.VX.VA);\n}\nint InstrEmit_vcfpsxws128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vctsxs_(f, VX128_3_VD128, VX128_3_VB128, VX128_3_IMM);\n}\n\nint InstrEmit_vctuxs_(PPCHIRBuilder& f, uint32_t vd, uint32_t vb,\n                      uint32_t uimm) {\n  // (VD) <- int_sat(VB as unsigned * 2^uimm)\n  float fuimm = static_cast<float>(std::exp2(uimm));\n  Value* v =\n      f.Mul(f.LoadVR(vb), f.Splat(f.LoadConstantFloat32(fuimm), VEC128_TYPE));\n  v = f.VectorConvertF2I(v, ARITHMETIC_UNSIGNED);\n  f.StoreSAT(f.DidSaturate(v));\n  f.StoreVR(vd, v);\n  return 0;\n}\nint InstrEmit_vctuxs(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vctuxs_(f, i.VX.VD, i.VX.VB, i.VX.VA);\n}\nint InstrEmit_vcfpuxws128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vctuxs_(f, VX128_3_VD128, VX128_3_VB128, VX128_3_IMM);\n}\n\nint InstrEmit_vcmpbfp_(PPCHIRBuilder& f, const InstrData& i, uint32_t vd,\n                       uint32_t va, uint32_t vb, uint32_t rc) {\n  // if vA or vB are NaN, the 2 high-order bits are set (0xC0000000)\n  Value* va_value = f.LoadVR(va);\n  Value* vb_value = f.LoadVR(vb);\n  Value* gt = f.VectorCompareSGT(va_value, vb_value, FLOAT32_TYPE);\n  Value* lt =\n      f.Not(f.VectorCompareSGE(va_value, f.Neg(vb_value), FLOAT32_TYPE));\n  Value* v =\n      f.Or(f.And(gt, f.LoadConstantVec128(vec128i(0x80000000, 0x80000000,\n                                                  0x80000000, 0x80000000))),\n           f.And(lt, f.LoadConstantVec128(vec128i(0x40000000, 0x40000000,\n                                                  0x40000000, 0x40000000))));\n  f.StoreVR(vd, v);\n  if (rc) {\n    // CR0:4 = 0; CR0:5 = VT == 0; CR0:6 = CR0:7 = 0;\n    // If all of the elements are within bounds, CR6[2] is set\n    // FIXME: Does not affect CR6[0], but the following function does.\n    f.UpdateCR6(f.Or(gt, lt));\n  }\n  return 0;\n}\nint InstrEmit_vcmpbfp(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vcmpbfp_(f, i, i.VXR.VD, i.VXR.VA, i.VXR.VB, i.VXR.Rc);\n}\nint InstrEmit_vcmpbfp128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vcmpbfp_(f, i, VX128_R_VD128, VX128_R_VA128, VX128_R_VB128,\n                            i.VX128_R.Rc);\n}\n\nenum vcmpxxfp_op {\n  vcmpxxfp_eq,\n  vcmpxxfp_gt,\n  vcmpxxfp_ge,\n};\nint InstrEmit_vcmpxxfp_(PPCHIRBuilder& f, const InstrData& i, vcmpxxfp_op cmpop,\n                        uint32_t vd, uint32_t va, uint32_t vb, uint32_t rc) {\n  // (VD.xyzw) = (VA.xyzw) OP (VB.xyzw) ? 0xFFFFFFFF : 0x00000000\n  // if (Rc) CR6 = all_equal | 0 | none_equal | 0\n  // If an element in either VA or VB is NaN the result will be 0x00000000\n  Value* v;\n  switch (cmpop) {\n    case vcmpxxfp_eq:\n      v = f.VectorCompareEQ(f.LoadVR(va), f.LoadVR(vb), FLOAT32_TYPE);\n      break;\n    case vcmpxxfp_gt:\n      v = f.VectorCompareSGT(f.LoadVR(va), f.LoadVR(vb), FLOAT32_TYPE);\n      break;\n    case vcmpxxfp_ge:\n      v = f.VectorCompareSGE(f.LoadVR(va), f.LoadVR(vb), FLOAT32_TYPE);\n      break;\n    default:\n      assert_unhandled_case(cmpop);\n      return 1;\n  }\n  if (rc) {\n    f.UpdateCR6(v);\n  }\n  f.StoreVR(vd, v);\n  return 0;\n}\n\nint InstrEmit_vcmpeqfp(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vcmpxxfp_(f, i, vcmpxxfp_eq, i.VXR.VD, i.VXR.VA, i.VXR.VB,\n                             i.VXR.Rc);\n}\nint InstrEmit_vcmpeqfp128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vcmpxxfp_(f, i, vcmpxxfp_eq, VX128_R_VD128, VX128_R_VA128,\n                             VX128_R_VB128, i.VX128_R.Rc);\n}\nint InstrEmit_vcmpgefp(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vcmpxxfp_(f, i, vcmpxxfp_ge, i.VXR.VD, i.VXR.VA, i.VXR.VB,\n                             i.VXR.Rc);\n}\nint InstrEmit_vcmpgefp128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vcmpxxfp_(f, i, vcmpxxfp_ge, VX128_R_VD128, VX128_R_VA128,\n                             VX128_R_VB128, i.VX128_R.Rc);\n}\nint InstrEmit_vcmpgtfp(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vcmpxxfp_(f, i, vcmpxxfp_gt, i.VXR.VD, i.VXR.VA, i.VXR.VB,\n                             i.VXR.Rc);\n}\nint InstrEmit_vcmpgtfp128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vcmpxxfp_(f, i, vcmpxxfp_gt, VX128_R_VD128, VX128_R_VA128,\n                             VX128_R_VB128, i.VX128_R.Rc);\n}\n\nenum vcmpxxi_op {\n  vcmpxxi_eq,\n  vcmpxxi_gt_signed,\n  vcmpxxi_gt_unsigned,\n};\nint InstrEmit_vcmpxxi_(PPCHIRBuilder& f, const InstrData& i, vcmpxxi_op cmpop,\n                       uint32_t width, uint32_t vd, uint32_t va, uint32_t vb,\n                       uint32_t rc) {\n  // (VD.xyzw) = (VA.xyzw) OP (VB.xyzw) ? 0xFFFFFFFF : 0x00000000\n  // if (Rc) CR6 = all_equal | 0 | none_equal | 0\n  // If an element in either VA or VB is NaN the result will be 0x00000000\n  Value* v;\n  switch (cmpop) {\n    case vcmpxxi_eq:\n      switch (width) {\n        case 1:\n          v = f.VectorCompareEQ(f.LoadVR(va), f.LoadVR(vb), INT8_TYPE);\n          break;\n        case 2:\n          v = f.VectorCompareEQ(f.LoadVR(va), f.LoadVR(vb), INT16_TYPE);\n          break;\n        case 4:\n          v = f.VectorCompareEQ(f.LoadVR(va), f.LoadVR(vb), INT32_TYPE);\n          break;\n        default:\n          assert_unhandled_case(width);\n          return 1;\n      }\n      break;\n    case vcmpxxi_gt_signed:\n      switch (width) {\n        case 1:\n          v = f.VectorCompareSGT(f.LoadVR(va), f.LoadVR(vb), INT8_TYPE);\n          break;\n        case 2:\n          v = f.VectorCompareSGT(f.LoadVR(va), f.LoadVR(vb), INT16_TYPE);\n          break;\n        case 4:\n          v = f.VectorCompareSGT(f.LoadVR(va), f.LoadVR(vb), INT32_TYPE);\n          break;\n        default:\n          assert_unhandled_case(width);\n          return 1;\n      }\n      break;\n    case vcmpxxi_gt_unsigned:\n      switch (width) {\n        case 1:\n          v = f.VectorCompareUGT(f.LoadVR(va), f.LoadVR(vb), INT8_TYPE);\n          break;\n        case 2:\n          v = f.VectorCompareUGT(f.LoadVR(va), f.LoadVR(vb), INT16_TYPE);\n          break;\n        case 4:\n          v = f.VectorCompareUGT(f.LoadVR(va), f.LoadVR(vb), INT32_TYPE);\n          break;\n        default:\n          assert_unhandled_case(width);\n          return 1;\n      }\n      break;\n    default:\n      assert_unhandled_case(cmpop);\n      return 1;\n  }\n  if (rc) {\n    f.UpdateCR6(v);\n  }\n  f.StoreVR(vd, v);\n  return 0;\n}\nint InstrEmit_vcmpequb(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vcmpxxi_(f, i, vcmpxxi_eq, 1, i.VXR.VD, i.VXR.VA, i.VXR.VB,\n                            i.VXR.Rc);\n}\nint InstrEmit_vcmpequh(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vcmpxxi_(f, i, vcmpxxi_eq, 2, i.VXR.VD, i.VXR.VA, i.VXR.VB,\n                            i.VXR.Rc);\n}\nint InstrEmit_vcmpequw(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vcmpxxi_(f, i, vcmpxxi_eq, 4, i.VXR.VD, i.VXR.VA, i.VXR.VB,\n                            i.VXR.Rc);\n}\nint InstrEmit_vcmpequw128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vcmpxxi_(f, i, vcmpxxi_eq, 4, VX128_R_VD128, VX128_R_VA128,\n                            VX128_R_VB128, i.VX128_R.Rc);\n}\nint InstrEmit_vcmpgtsb(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vcmpxxi_(f, i, vcmpxxi_gt_signed, 1, i.VXR.VD, i.VXR.VA,\n                            i.VXR.VB, i.VXR.Rc);\n}\nint InstrEmit_vcmpgtsh(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vcmpxxi_(f, i, vcmpxxi_gt_signed, 2, i.VXR.VD, i.VXR.VA,\n                            i.VXR.VB, i.VXR.Rc);\n}\nint InstrEmit_vcmpgtsw(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vcmpxxi_(f, i, vcmpxxi_gt_signed, 4, i.VXR.VD, i.VXR.VA,\n                            i.VXR.VB, i.VXR.Rc);\n}\nint InstrEmit_vcmpgtub(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vcmpxxi_(f, i, vcmpxxi_gt_unsigned, 1, i.VXR.VD, i.VXR.VA,\n                            i.VXR.VB, i.VXR.Rc);\n}\nint InstrEmit_vcmpgtuh(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vcmpxxi_(f, i, vcmpxxi_gt_unsigned, 2, i.VXR.VD, i.VXR.VA,\n                            i.VXR.VB, i.VXR.Rc);\n}\nint InstrEmit_vcmpgtuw(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vcmpxxi_(f, i, vcmpxxi_gt_unsigned, 4, i.VXR.VD, i.VXR.VA,\n                            i.VXR.VB, i.VXR.Rc);\n}\n\nint InstrEmit_vexptefp_(PPCHIRBuilder& f, uint32_t vd, uint32_t vb) {\n  // (VD) <- pow2(VB)\n  Value* v = f.Pow2(f.LoadVR(vb));\n  f.StoreVR(vd, v);\n  return 0;\n}\nint InstrEmit_vexptefp(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vexptefp_(f, i.VX.VD, i.VX.VB);\n}\nint InstrEmit_vexptefp128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vexptefp_(f, VX128_3_VD128, VX128_3_VB128);\n}\n\nint InstrEmit_vlogefp_(PPCHIRBuilder& f, uint32_t vd, uint32_t vb) {\n  // (VD) <- log2(VB)\n  Value* v = f.Log2(f.LoadVR(vb));\n  f.StoreVR(vd, v);\n  return 0;\n}\nint InstrEmit_vlogefp(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vlogefp_(f, i.VX.VD, i.VX.VB);\n}\nint InstrEmit_vlogefp128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vlogefp_(f, VX128_3_VD128, VX128_3_VB128);\n}\n\nint InstrEmit_vmaddfp_(PPCHIRBuilder& f, uint32_t vd, uint32_t va, uint32_t vb,\n                       uint32_t vc) {\n  // (VD) <- ((VA) * (VC)) + (VB)\n  Value* v = f.MulAdd(f.LoadVR(va), f.LoadVR(vc), f.LoadVR(vb));\n  f.StoreVR(vd, v);\n  return 0;\n}\nint InstrEmit_vmaddfp(PPCHIRBuilder& f, const InstrData& i) {\n  // (VD) <- ((VA) * (VC)) + (VB)\n  return InstrEmit_vmaddfp_(f, i.VXA.VD, i.VXA.VA, i.VXA.VB, i.VXA.VC);\n}\nint InstrEmit_vmaddfp128(PPCHIRBuilder& f, const InstrData& i) {\n  // (VD) <- ((VA) * (VB)) + (VD)\n  // NOTE: this resuses VD and swaps the arg order!\n  return InstrEmit_vmaddfp_(f, VX128_VD128, VX128_VA128, VX128_VD128,\n                            VX128_VB128);\n}\n\nint InstrEmit_vmaddcfp128(PPCHIRBuilder& f, const InstrData& i) {\n  // (VD) <- ((VA) * (VD)) + (VB)\n  Value* v = f.MulAdd(f.LoadVR(VX128_VA128), f.LoadVR(VX128_VD128),\n                      f.LoadVR(VX128_VB128));\n  f.StoreVR(VX128_VD128, v);\n  return 0;\n}\n\nint InstrEmit_vmaxfp_(PPCHIRBuilder& f, uint32_t vd, uint32_t va, uint32_t vb) {\n  // (VD) <- max((VA), (VB))\n  Value* v = f.Max(f.LoadVR(va), f.LoadVR(vb));\n  f.StoreVR(vd, v);\n  return 0;\n}\nint InstrEmit_vmaxfp(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vmaxfp_(f, i.VX.VD, i.VX.VA, i.VX.VB);\n}\nint InstrEmit_vmaxfp128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vmaxfp_(f, VX128_VD128, VX128_VA128, VX128_VB128);\n}\n\nint InstrEmit_vmaxsb(PPCHIRBuilder& f, const InstrData& i) {\n  // (VD) <- max((VA), (VB)) (signed int8)\n  Value* v = f.VectorMax(f.LoadVR(i.VX.VA), f.LoadVR(i.VX.VB), INT8_TYPE);\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vmaxsh(PPCHIRBuilder& f, const InstrData& i) {\n  // (VD) <- max((VA), (VB)) (signed int16)\n  Value* v = f.VectorMax(f.LoadVR(i.VX.VA), f.LoadVR(i.VX.VB), INT16_TYPE);\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vmaxsw(PPCHIRBuilder& f, const InstrData& i) {\n  // (VD) <- max((VA), (VB)) (signed int32)\n  Value* v = f.VectorMax(f.LoadVR(i.VX.VA), f.LoadVR(i.VX.VB), INT32_TYPE);\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vmaxub(PPCHIRBuilder& f, const InstrData& i) {\n  // (VD) <- max((VA), (VB)) (unsigned int8)\n  Value* v = f.VectorMax(f.LoadVR(i.VX.VA), f.LoadVR(i.VX.VB), INT8_TYPE,\n                         ARITHMETIC_UNSIGNED);\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vmaxuh(PPCHIRBuilder& f, const InstrData& i) {\n  // (VD) <- max((VA), (VB)) (unsigned int16)\n  Value* v = f.VectorMax(f.LoadVR(i.VX.VA), f.LoadVR(i.VX.VB), INT16_TYPE,\n                         ARITHMETIC_UNSIGNED);\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vmaxuw(PPCHIRBuilder& f, const InstrData& i) {\n  // (VD) <- max((VA), (VB)) (unsigned int32)\n  Value* v = f.VectorMax(f.LoadVR(i.VX.VA), f.LoadVR(i.VX.VB), INT32_TYPE,\n                         ARITHMETIC_UNSIGNED);\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vmhaddshs(PPCHIRBuilder& f, const InstrData& i) {\n  XEINSTRNOTIMPLEMENTED();\n  return 1;\n}\n\nint InstrEmit_vmhraddshs(PPCHIRBuilder& f, const InstrData& i) {\n  XEINSTRNOTIMPLEMENTED();\n  return 1;\n}\n\nint InstrEmit_vminfp_(PPCHIRBuilder& f, uint32_t vd, uint32_t va, uint32_t vb) {\n  // (VD) <- min((VA), (VB))\n  Value* v = f.Min(f.LoadVR(va), f.LoadVR(vb));\n  f.StoreVR(vd, v);\n  return 0;\n}\nint InstrEmit_vminfp(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vminfp_(f, i.VX.VD, i.VX.VA, i.VX.VB);\n}\nint InstrEmit_vminfp128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vminfp_(f, VX128_VD128, VX128_VA128, VX128_VB128);\n}\n\nint InstrEmit_vminsb(PPCHIRBuilder& f, const InstrData& i) {\n  // (VD) <- min((VA), (VB)) (signed int8)\n  Value* v = f.VectorMin(f.LoadVR(i.VX.VA), f.LoadVR(i.VX.VB), INT8_TYPE);\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vminsh(PPCHIRBuilder& f, const InstrData& i) {\n  // (VD) <- min((VA), (VB)) (signed int16)\n  Value* v = f.VectorMin(f.LoadVR(i.VX.VA), f.LoadVR(i.VX.VB), INT16_TYPE);\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vminsw(PPCHIRBuilder& f, const InstrData& i) {\n  // (VD) <- min((VA), (VB)) (signed int32)\n  Value* v = f.VectorMin(f.LoadVR(i.VX.VA), f.LoadVR(i.VX.VB), INT32_TYPE);\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vminub(PPCHIRBuilder& f, const InstrData& i) {\n  // (VD) <- min((VA), (VB)) (unsigned int8)\n  Value* v = f.VectorMin(f.LoadVR(i.VX.VA), f.LoadVR(i.VX.VB), INT8_TYPE,\n                         ARITHMETIC_UNSIGNED);\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vminuh(PPCHIRBuilder& f, const InstrData& i) {\n  // (VD) <- min((VA), (VB)) (unsigned int16)\n  Value* v = f.VectorMin(f.LoadVR(i.VX.VA), f.LoadVR(i.VX.VB), INT16_TYPE,\n                         ARITHMETIC_UNSIGNED);\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vminuw(PPCHIRBuilder& f, const InstrData& i) {\n  // (VD) <- min((VA), (VB)) (unsigned int32)\n  Value* v = f.VectorMin(f.LoadVR(i.VX.VA), f.LoadVR(i.VX.VB), INT32_TYPE,\n                         ARITHMETIC_UNSIGNED);\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vmladduhm(PPCHIRBuilder& f, const InstrData& i) {\n  XEINSTRNOTIMPLEMENTED();\n  return 1;\n}\n\nint InstrEmit_vmrghb(PPCHIRBuilder& f, const InstrData& i) {\n  // (VD.b[i]) = (VA.b[i])\n  // (VD.b[i+1]) = (VB.b[i+1])\n  // ...\n  Value* v =\n      f.Permute(f.LoadConstantVec128(vec128b(0, 16, 1, 17, 2, 18, 3, 19, 4, 20,\n                                             5, 21, 6, 22, 7, 23)),\n                f.LoadVR(i.VX.VA), f.LoadVR(i.VX.VB), INT8_TYPE);\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vmrghh(PPCHIRBuilder& f, const InstrData& i) {\n  // (VD.w[i]) = (VA.w[i])\n  // (VD.w[i+1]) = (VB.w[i+1])\n  // ...\n  Value* v = f.Permute(f.LoadConstantVec128(vec128s(0, 8, 1, 9, 2, 10, 3, 11)),\n                       f.LoadVR(i.VX.VA), f.LoadVR(i.VX.VB), INT16_TYPE);\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vmrghw_(PPCHIRBuilder& f, uint32_t vd, uint32_t va, uint32_t vb) {\n  // (VD.x) = (VA.x)\n  // (VD.y) = (VB.x)\n  // (VD.z) = (VA.y)\n  // (VD.w) = (VB.y)\n  Value* v =\n      f.Permute(f.LoadConstantUint32(MakePermuteMask(0, 0, 1, 0, 0, 1, 1, 1)),\n                f.LoadVR(va), f.LoadVR(vb), INT32_TYPE);\n  f.StoreVR(vd, v);\n  return 0;\n}\nint InstrEmit_vmrghw(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vmrghw_(f, i.VX.VD, i.VX.VA, i.VX.VB);\n}\nint InstrEmit_vmrghw128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vmrghw_(f, VX128_VD128, VX128_VA128, VX128_VB128);\n}\n\nint InstrEmit_vmrglb(PPCHIRBuilder& f, const InstrData& i) {\n  // (VD.b[i]) = (VA.b[i])\n  // (VD.b[i+1]) = (VB.b[i+1])\n  // ...\n  Value* v =\n      f.Permute(f.LoadConstantVec128(vec128b(8, 24, 9, 25, 10, 26, 11, 27, 12,\n                                             28, 13, 29, 14, 30, 15, 31)),\n                f.LoadVR(i.VX.VA), f.LoadVR(i.VX.VB), INT8_TYPE);\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vmrglh(PPCHIRBuilder& f, const InstrData& i) {\n  // (VD.w[i]) = (VA.w[i])\n  // (VD.w[i+1]) = (VB.w[i+1])\n  // ...\n  Value* v =\n      f.Permute(f.LoadConstantVec128(vec128s(4, 12, 5, 13, 6, 14, 7, 15)),\n                f.LoadVR(i.VX.VA), f.LoadVR(i.VX.VB), INT16_TYPE);\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vmrglw_(PPCHIRBuilder& f, uint32_t vd, uint32_t va, uint32_t vb) {\n  // (VD.x) = (VA.z)\n  // (VD.y) = (VB.z)\n  // (VD.z) = (VA.w)\n  // (VD.w) = (VB.w)\n  Value* v =\n      f.Permute(f.LoadConstantUint32(MakePermuteMask(0, 2, 1, 2, 0, 3, 1, 3)),\n                f.LoadVR(va), f.LoadVR(vb), INT32_TYPE);\n  f.StoreVR(vd, v);\n  return 0;\n}\nint InstrEmit_vmrglw(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vmrglw_(f, i.VX.VD, i.VX.VA, i.VX.VB);\n}\nint InstrEmit_vmrglw128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vmrglw_(f, VX128_VD128, VX128_VA128, VX128_VB128);\n}\n\nint InstrEmit_vmsummbm(PPCHIRBuilder& f, const InstrData& i) {\n  XEINSTRNOTIMPLEMENTED();\n  return 1;\n}\n\nint InstrEmit_vmsumshm(PPCHIRBuilder& f, const InstrData& i) {\n  XEINSTRNOTIMPLEMENTED();\n  return 1;\n}\n\nint InstrEmit_vmsumshs(PPCHIRBuilder& f, const InstrData& i) {\n  XEINSTRNOTIMPLEMENTED();\n  return 1;\n}\n\nint InstrEmit_vmsumubm(PPCHIRBuilder& f, const InstrData& i) {\n  XEINSTRNOTIMPLEMENTED();\n  return 1;\n}\n\nint InstrEmit_vmsumuhm(PPCHIRBuilder& f, const InstrData& i) {\n  XEINSTRNOTIMPLEMENTED();\n  return 1;\n}\n\nint InstrEmit_vmsumuhs(PPCHIRBuilder& f, const InstrData& i) {\n  XEINSTRNOTIMPLEMENTED();\n  return 1;\n}\n\nint InstrEmit_vmsum3fp128(PPCHIRBuilder& f, const InstrData& i) {\n  // Dot product XYZ.\n  // (VD.xyzw) = (VA.x * VB.x) + (VA.y * VB.y) + (VA.z * VB.z)\n  Value* v = f.DotProduct3(f.LoadVR(VX128_VA128), f.LoadVR(VX128_VB128));\n  v = f.Splat(v, VEC128_TYPE);\n  f.StoreVR(VX128_VD128, v);\n  return 0;\n}\n\nint InstrEmit_vmsum4fp128(PPCHIRBuilder& f, const InstrData& i) {\n  // Dot product XYZW.\n  // (VD.xyzw) = (VA.x * VB.x) + (VA.y * VB.y) + (VA.z * VB.z) + (VA.w * VB.w)\n  Value* v = f.DotProduct4(f.LoadVR(VX128_VA128), f.LoadVR(VX128_VB128));\n  v = f.Splat(v, VEC128_TYPE);\n  f.StoreVR(VX128_VD128, v);\n  return 0;\n}\n\nint InstrEmit_vmulesb(PPCHIRBuilder& f, const InstrData& i) {\n  XEINSTRNOTIMPLEMENTED();\n  return 1;\n}\n\nint InstrEmit_vmulesh(PPCHIRBuilder& f, const InstrData& i) {\n  XEINSTRNOTIMPLEMENTED();\n  return 1;\n}\n\nint InstrEmit_vmuleub(PPCHIRBuilder& f, const InstrData& i) {\n  XEINSTRNOTIMPLEMENTED();\n  return 1;\n}\n\nint InstrEmit_vmuleuh(PPCHIRBuilder& f, const InstrData& i) {\n  XEINSTRNOTIMPLEMENTED();\n  return 1;\n}\n\nint InstrEmit_vmulosb(PPCHIRBuilder& f, const InstrData& i) {\n  XEINSTRNOTIMPLEMENTED();\n  return 1;\n}\n\nint InstrEmit_vmulosh(PPCHIRBuilder& f, const InstrData& i) {\n  XEINSTRNOTIMPLEMENTED();\n  return 1;\n}\n\nint InstrEmit_vmuloub(PPCHIRBuilder& f, const InstrData& i) {\n  XEINSTRNOTIMPLEMENTED();\n  return 1;\n}\n\nint InstrEmit_vmulouh(PPCHIRBuilder& f, const InstrData& i) {\n  XEINSTRNOTIMPLEMENTED();\n  return 1;\n}\n\nint InstrEmit_vmulfp128(PPCHIRBuilder& f, const InstrData& i) {\n  // (VD) <- (VA) * (VB) (4 x fp)\n  Value* v = f.Mul(f.LoadVR(VX128_VA128), f.LoadVR(VX128_VB128));\n  f.StoreVR(VX128_VD128, v);\n  return 0;\n}\n\nint InstrEmit_vnmsubfp_(PPCHIRBuilder& f, uint32_t vd, uint32_t va, uint32_t vb,\n                        uint32_t vc) {\n  // (VD) <- -(((VA) * (VC)) - (VB))\n  // NOTE: only one rounding should take place, but that's hard...\n  // This really needs VFNMSUB132PS/VFNMSUB213PS/VFNMSUB231PS but that's AVX.\n  Value* v = f.Neg(f.MulSub(f.LoadVR(va), f.LoadVR(vc), f.LoadVR(vb)));\n  f.StoreVR(vd, v);\n  return 0;\n}\nint InstrEmit_vnmsubfp(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vnmsubfp_(f, i.VXA.VD, i.VXA.VA, i.VXA.VB, i.VXA.VC);\n}\nint InstrEmit_vnmsubfp128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vnmsubfp_(f, VX128_VD128, VX128_VA128, VX128_VD128,\n                             VX128_VB128);\n}\n\nint InstrEmit_vnor_(PPCHIRBuilder& f, uint32_t vd, uint32_t va, uint32_t vb) {\n  // VD <- ¬((VA) | (VB))\n  Value* v = f.Not(f.Or(f.LoadVR(va), f.LoadVR(vb)));\n  f.StoreVR(vd, v);\n  return 0;\n}\nint InstrEmit_vnor(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vnor_(f, i.VX.VD, i.VX.VA, i.VX.VB);\n}\nint InstrEmit_vnor128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vnor_(f, VX128_VD128, VX128_VA128, VX128_VB128);\n}\n\nint InstrEmit_vor_(PPCHIRBuilder& f, uint32_t vd, uint32_t va, uint32_t vb) {\n  // VD <- (VA) | (VB)\n  if (va == vb) {\n    // Copy VA==VB into VD.\n    f.StoreVR(vd, f.LoadVR(va));\n  } else {\n    Value* v = f.Or(f.LoadVR(va), f.LoadVR(vb));\n    f.StoreVR(vd, v);\n  }\n  return 0;\n}\nint InstrEmit_vor(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vor_(f, i.VX.VD, i.VX.VA, i.VX.VB);\n}\nint InstrEmit_vor128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vor_(f, VX128_VD128, VX128_VA128, VX128_VB128);\n}\n\nint InstrEmit_vperm_(PPCHIRBuilder& f, uint32_t vd, uint32_t va, uint32_t vb,\n                     uint32_t vc) {\n  Value* v = f.Permute(f.LoadVR(vc), f.LoadVR(va), f.LoadVR(vb), INT8_TYPE);\n  f.StoreVR(vd, v);\n  return 0;\n}\nint InstrEmit_vperm(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vperm_(f, i.VXA.VD, i.VXA.VA, i.VXA.VB, i.VXA.VC);\n}\nint InstrEmit_vperm128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vperm_(f, VX128_2_VD128, VX128_2_VA128, VX128_2_VB128,\n                          VX128_2_VC);\n}\n\nint InstrEmit_vpermwi128(PPCHIRBuilder& f, const InstrData& i) {\n  // (VD.x) = (VB.uimm[6-7])\n  // (VD.y) = (VB.uimm[4-5])\n  // (VD.z) = (VB.uimm[2-3])\n  // (VD.w) = (VB.uimm[0-1])\n  const uint32_t vd = i.VX128_P.VD128l | (i.VX128_P.VD128h << 5);\n  const uint32_t vb = i.VX128_P.VB128l | (i.VX128_P.VB128h << 5);\n  uint32_t uimm = i.VX128_P.PERMl | (i.VX128_P.PERMh << 5);\n  uint32_t mask = MakeSwizzleMask(uimm >> 6, uimm >> 4, uimm >> 2, uimm >> 0);\n  Value* v = f.Swizzle(f.LoadVR(vb), INT32_TYPE, mask);\n  f.StoreVR(vd, v);\n  return 0;\n}\n\nint InstrEmit_vrefp_(PPCHIRBuilder& f, uint32_t vd, uint32_t vb) {\n  // (VD) <- 1/(VB)\n  Value* v = f.Recip(f.LoadVR(vb));\n  f.StoreVR(vd, v);\n  return 0;\n}\nint InstrEmit_vrefp(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vrefp_(f, i.VX.VD, i.VX.VB);\n}\nint InstrEmit_vrefp128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vrefp_(f, VX128_3_VD128, VX128_3_VB128);\n}\n\nint InstrEmit_vrfim_(PPCHIRBuilder& f, uint32_t vd, uint32_t vb) {\n  // (VD) <- RndToFPInt32Floor(VB)\n  Value* v = f.Round(f.LoadVR(vb), ROUND_TO_MINUS_INFINITY);\n  f.StoreVR(vd, v);\n  return 0;\n}\nint InstrEmit_vrfim(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vrfim_(f, i.VX.VD, i.VX.VB);\n}\nint InstrEmit_vrfim128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vrfim_(f, VX128_3_VD128, VX128_3_VB128);\n}\n\nint InstrEmit_vrfin_(PPCHIRBuilder& f, uint32_t vd, uint32_t vb) {\n  // (VD) <- RoundToNearest(VB)\n  Value* v = f.Round(f.LoadVR(vb), ROUND_TO_NEAREST);\n  f.StoreVR(vd, v);\n  return 0;\n}\nint InstrEmit_vrfin(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vrfin_(f, i.VX.VD, i.VX.VB);\n}\nint InstrEmit_vrfin128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vrfin_(f, VX128_3_VD128, VX128_3_VB128);\n}\n\nint InstrEmit_vrfip_(PPCHIRBuilder& f, uint32_t vd, uint32_t vb) {\n  // (VD) <- RndToFPInt32Ceil(VB)\n  Value* v = f.Round(f.LoadVR(vb), ROUND_TO_POSITIVE_INFINITY);\n  f.StoreVR(vd, v);\n  return 0;\n}\nint InstrEmit_vrfip(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vrfip_(f, i.VX.VD, i.VX.VB);\n}\nint InstrEmit_vrfip128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vrfip_(f, VX128_3_VD128, VX128_3_VB128);\n}\n\nint InstrEmit_vrfiz_(PPCHIRBuilder& f, uint32_t vd, uint32_t vb) {\n  // (VD) <- RndToFPInt32Trunc(VB)\n  Value* v = f.Round(f.LoadVR(vb), ROUND_TO_ZERO);\n  f.StoreVR(vd, v);\n  return 0;\n}\nint InstrEmit_vrfiz(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vrfiz_(f, i.VX.VD, i.VX.VB);\n}\nint InstrEmit_vrfiz128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vrfiz_(f, VX128_3_VD128, VX128_3_VB128);\n}\n\nint InstrEmit_vrlb(PPCHIRBuilder& f, const InstrData& i) {\n  // (VD) <- ROTL((VA), (VB)&0x3)\n  Value* v =\n      f.VectorRotateLeft(f.LoadVR(i.VX.VA), f.LoadVR(i.VX.VB), INT8_TYPE);\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vrlh(PPCHIRBuilder& f, const InstrData& i) {\n  // (VD) <- ROTL((VA), (VB)&0xF)\n  Value* v =\n      f.VectorRotateLeft(f.LoadVR(i.VX.VA), f.LoadVR(i.VX.VB), INT16_TYPE);\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vrlw_(PPCHIRBuilder& f, uint32_t vd, uint32_t va, uint32_t vb) {\n  // (VD) <- ROTL((VA), (VB)&0x1F)\n  Value* v = f.VectorRotateLeft(f.LoadVR(va), f.LoadVR(vb), INT32_TYPE);\n  f.StoreVR(vd, v);\n  return 0;\n}\nint InstrEmit_vrlw(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vrlw_(f, i.VX.VD, i.VX.VA, i.VX.VB);\n}\nint InstrEmit_vrlw128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vrlw_(f, VX128_VD128, VX128_VA128, VX128_VB128);\n}\n\nint InstrEmit_vrlimi128(PPCHIRBuilder& f, const InstrData& i) {\n  const uint32_t vd = i.VX128_4.VD128l | (i.VX128_4.VD128h << 5);\n  const uint32_t vb = i.VX128_4.VB128l | (i.VX128_4.VB128h << 5);\n  uint32_t blend_mask_src = i.VX128_4.IMM;\n  uint32_t blend_mask = 0;\n  blend_mask |= (((blend_mask_src >> 3) & 0x1) ? 0 : 4) << 0;\n  blend_mask |= (((blend_mask_src >> 2) & 0x1) ? 1 : 5) << 8;\n  blend_mask |= (((blend_mask_src >> 1) & 0x1) ? 2 : 6) << 16;\n  blend_mask |= (((blend_mask_src >> 0) & 0x1) ? 3 : 7) << 24;\n  uint32_t rotate = i.VX128_4.z;\n  // This is just a fancy permute.\n  // X Y Z W, rotated left by 2 = Z W X Y\n  // Then mask select the results into the dest.\n  // Sometimes rotation is zero, so fast path.\n  Value* v;\n  if (rotate) {\n    // TODO(benvanik): constants need conversion.\n    uint32_t swizzle_mask;\n    switch (rotate) {\n      case 1:\n        // X Y Z W -> Y Z W X\n        swizzle_mask = SWIZZLE_XYZW_TO_YZWX;\n        break;\n      case 2:\n        // X Y Z W -> Z W X Y\n        swizzle_mask = SWIZZLE_XYZW_TO_ZWXY;\n        break;\n      case 3:\n        // X Y Z W -> W X Y Z\n        swizzle_mask = SWIZZLE_XYZW_TO_WXYZ;\n        break;\n      default:\n        XEINSTRNOTIMPLEMENTED();\n        return 1;\n    }\n    v = f.Swizzle(f.LoadVR(vb), FLOAT32_TYPE, swizzle_mask);\n  } else {\n    v = f.LoadVR(vb);\n  }\n  if (blend_mask != kIdentityPermuteMask) {\n    v = f.Permute(f.LoadConstantUint32(blend_mask), v, f.LoadVR(vd),\n                  INT32_TYPE);\n  }\n  f.StoreVR(vd, v);\n  return 0;\n}\n\nint InstrEmit_vrsqrtefp_(PPCHIRBuilder& f, uint32_t vd, uint32_t vb) {\n  // (VD) <- 1 / sqrt(VB)\n  // There are a lot of rules in the Altivec_PEM docs for handlings that\n  // result in nan/infinity/etc. They are ignored here. I hope games would\n  // never rely on them.\n  Value* v = f.RSqrt(f.LoadVR(vb));\n  f.StoreVR(vd, v);\n  return 0;\n}\nint InstrEmit_vrsqrtefp(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vrsqrtefp_(f, i.VX.VD, i.VX.VB);\n}\nint InstrEmit_vrsqrtefp128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vrsqrtefp_(f, VX128_3_VD128, VX128_3_VB128);\n}\n\nint InstrEmit_vsel_(PPCHIRBuilder& f, uint32_t vd, uint32_t va, uint32_t vb,\n                    uint32_t vc) {\n  // For each bit:\n  // VRTi <- ((VRC)i=0) ? (VRA)i : (VRB)i\n  Value* v = f.Select(f.LoadVR(vc), f.LoadVR(va), f.LoadVR(vb));\n  f.StoreVR(vd, v);\n  return 0;\n}\nint InstrEmit_vsel(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vsel_(f, i.VXA.VD, i.VXA.VA, i.VXA.VB, i.VXA.VC);\n}\nint InstrEmit_vsel128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vsel_(f, VX128_VD128, VX128_VA128, VX128_VB128, VX128_VD128);\n}\n\nint InstrEmit_vsl(PPCHIRBuilder& f, const InstrData& i) {\n  Value* v = f.Shl(f.LoadVR(i.VX.VA),\n                   f.And(f.Extract(f.LoadVR(i.VX.VB), 15, INT8_TYPE),\n                         f.LoadConstantInt8(0b111)));\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vslb(PPCHIRBuilder& f, const InstrData& i) {\n  Value* v = f.VectorShl(f.LoadVR(i.VX.VA), f.LoadVR(i.VX.VB), INT8_TYPE);\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vslh(PPCHIRBuilder& f, const InstrData& i) {\n  Value* v = f.VectorShl(f.LoadVR(i.VX.VA), f.LoadVR(i.VX.VB), INT16_TYPE);\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vslw_(PPCHIRBuilder& f, uint32_t vd, uint32_t va, uint32_t vb) {\n  // VA = |xxxxx|yyyyy|zzzzz|wwwww|\n  // VB = |...sh|...sh|...sh|...sh|\n  // VD = |x<<sh|y<<sh|z<<sh|w<<sh|\n  Value* v = f.VectorShl(f.LoadVR(va), f.LoadVR(vb), INT32_TYPE);\n  f.StoreVR(vd, v);\n  return 0;\n}\nint InstrEmit_vslw(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vslw_(f, i.VX.VD, i.VX.VA, i.VX.VB);\n}\nint InstrEmit_vslw128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vslw_(f, VX128_VD128, VX128_VA128, VX128_VB128);\n}\n\nstatic const vec128_t __vsldoi_table[16] = {\n    vec128b(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15),\n    vec128b(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16),\n    vec128b(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17),\n    vec128b(3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18),\n    vec128b(4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19),\n    vec128b(5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20),\n    vec128b(6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21),\n    vec128b(7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22),\n    vec128b(8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23),\n    vec128b(9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24),\n    vec128b(10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25),\n    vec128b(11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26),\n    vec128b(12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27),\n    vec128b(13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28),\n    vec128b(14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29),\n    vec128b(15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30),\n};\nint InstrEmit_vsldoi_(PPCHIRBuilder& f, uint32_t vd, uint32_t va, uint32_t vb,\n                      uint32_t sh) {\n  // (VD) <- ((VA) || (VB)) << (SH << 3)\n  if (!sh) {\n    f.StoreVR(vd, f.LoadVR(va));\n    return 0;\n  } else if (sh == 16) {\n    f.StoreVR(vd, f.LoadVR(vb));\n    return 0;\n  }\n  // TODO(benvanik): optimize for the rotation case:\n  // vsldoi128 vr63,vr63,vr63,4\n  // (ABCD ABCD) << 4b = (BCDA)\n  // (VA << SH) OR (VB >> (16 - SH))\n  Value* control = f.LoadConstantVec128(__vsldoi_table[sh]);\n  Value* v = f.Permute(control, f.LoadVR(va), f.LoadVR(vb), INT8_TYPE);\n  f.StoreVR(vd, v);\n  return 0;\n}\nint InstrEmit_vsldoi(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vsldoi_(f, i.VXA.VD, i.VXA.VA, i.VXA.VB, i.VXA.VC & 0xF);\n}\nint InstrEmit_vsldoi128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vsldoi_(f, VX128_5_VD128, VX128_5_VA128, VX128_5_VB128,\n                           VX128_5_SH);\n}\n\nint InstrEmit_vslo_(PPCHIRBuilder& f, uint32_t vd, uint32_t va, uint32_t vb) {\n  // (VD) <- (VA) << (VB.b[F] & 0x78) (by octet)\n  // TODO(benvanik): flag for shift-by-octet as optimization.\n  Value* sh = f.Shr(\n      f.And(f.Extract(f.LoadVR(vb), 15, INT8_TYPE), f.LoadConstantInt8(0x78)),\n      3);\n  Value* v = f.Permute(f.LoadVectorShl(sh), f.LoadVR(va), f.LoadZeroVec128(),\n                       INT8_TYPE);\n  f.StoreVR(vd, v);\n  return 0;\n}\nint InstrEmit_vslo(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vslo_(f, i.VX.VD, i.VX.VA, i.VX.VB);\n}\nint InstrEmit_vslo128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vslo_(f, VX128_VD128, VX128_VA128, VX128_VB128);\n}\n\nint InstrEmit_vspltb(PPCHIRBuilder& f, const InstrData& i) {\n  // b <- UIMM*8\n  // do i = 0 to 127 by 8\n  //  (VD)[i:i+7] <- (VB)[b:b+7]\n  Value* b = f.Extract(f.LoadVR(i.VX.VB), i.VX.VA & 0xF, INT8_TYPE);\n  Value* v = f.Splat(b, VEC128_TYPE);\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vsplth(PPCHIRBuilder& f, const InstrData& i) {\n  // (VD.xyzw) <- (VB.uimm)\n  Value* h = f.Extract(f.LoadVR(i.VX.VB), i.VX.VA & 0x7, INT16_TYPE);\n  Value* v = f.Splat(h, VEC128_TYPE);\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vspltw_(PPCHIRBuilder& f, uint32_t vd, uint32_t vb,\n                      uint32_t uimm) {\n  // (VD.xyzw) <- (VB.uimm)\n  Value* w = f.Extract(f.LoadVR(vb), uimm & 0x3, INT32_TYPE);\n  Value* v = f.Splat(w, VEC128_TYPE);\n  f.StoreVR(vd, v);\n  return 0;\n}\nint InstrEmit_vspltw(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vspltw_(f, i.VX.VD, i.VX.VB, i.VX.VA);\n}\nint InstrEmit_vspltw128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vspltw_(f, VX128_3_VD128, VX128_3_VB128, VX128_3_IMM);\n}\n\nint InstrEmit_vspltisb(PPCHIRBuilder& f, const InstrData& i) {\n  // (VD.xyzw) <- sign_extend(uimm)\n  Value* v;\n  if (i.VX.VA) {\n    // Sign extend from 5bits -> 8 and load.\n    int8_t simm = (i.VX.VA & 0x10) ? (i.VX.VA | 0xF0) : i.VX.VA;\n    v = f.Splat(f.LoadConstantInt8(simm), VEC128_TYPE);\n  } else {\n    // Zero out the register.\n    v = f.LoadZeroVec128();\n  }\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vspltish(PPCHIRBuilder& f, const InstrData& i) {\n  // (VD.xyzw) <- sign_extend(uimm)\n  Value* v;\n  if (i.VX.VA) {\n    // Sign extend from 5bits -> 16 and load.\n    int16_t simm = (i.VX.VA & 0x10) ? (i.VX.VA | 0xFFF0) : i.VX.VA;\n    v = f.Splat(f.LoadConstantInt16(simm), VEC128_TYPE);\n  } else {\n    // Zero out the register.\n    v = f.LoadZeroVec128();\n  }\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vspltisw_(PPCHIRBuilder& f, uint32_t vd, uint32_t uimm) {\n  // (VD.xyzw) <- sign_extend(uimm)\n  Value* v;\n  if (uimm) {\n    // Sign extend from 5bits -> 32 and load.\n    int32_t simm = (uimm & 0x10) ? (uimm | 0xFFFFFFF0) : uimm;\n    v = f.Splat(f.LoadConstantInt32(simm), VEC128_TYPE);\n  } else {\n    // Zero out the register.\n    v = f.LoadZeroVec128();\n  }\n  f.StoreVR(vd, v);\n  return 0;\n}\nint InstrEmit_vspltisw(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vspltisw_(f, i.VX.VD, i.VX.VA);\n}\nint InstrEmit_vspltisw128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vspltisw_(f, VX128_3_VD128, VX128_3_IMM);\n}\n\nint InstrEmit_vsr(PPCHIRBuilder& f, const InstrData& i) {\n  Value* v = f.Shr(f.LoadVR(i.VX.VA),\n                   f.And(f.Extract(f.LoadVR(i.VX.VB), 15, INT8_TYPE),\n                         f.LoadConstantInt8(0b111)));\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vsrab(PPCHIRBuilder& f, const InstrData& i) {\n  // (VD) <- (VA) >>a (VB) by bytes\n  Value* v = f.VectorSha(f.LoadVR(i.VX.VA), f.LoadVR(i.VX.VB), INT8_TYPE);\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vsrah(PPCHIRBuilder& f, const InstrData& i) {\n  // (VD) <- (VA) >>a (VB) by halfwords\n  Value* v = f.VectorSha(f.LoadVR(i.VX.VA), f.LoadVR(i.VX.VB), INT16_TYPE);\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vsraw_(PPCHIRBuilder& f, uint32_t vd, uint32_t va, uint32_t vb) {\n  // (VD) <- (VA) >>a (VB) by words\n  Value* v = f.VectorSha(f.LoadVR(va), f.LoadVR(vb), INT32_TYPE);\n  f.StoreVR(vd, v);\n  return 0;\n}\nint InstrEmit_vsraw(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vsraw_(f, i.VX.VD, i.VX.VA, i.VX.VB);\n}\nint InstrEmit_vsraw128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vsraw_(f, VX128_VD128, VX128_VA128, VX128_VB128);\n}\n\nint InstrEmit_vsrb(PPCHIRBuilder& f, const InstrData& i) {\n  // (VD) <- (VA) >> (VB) by bytes\n  Value* v = f.VectorShr(f.LoadVR(i.VX.VA), f.LoadVR(i.VX.VB), INT8_TYPE);\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vsrh(PPCHIRBuilder& f, const InstrData& i) {\n  // (VD) <- (VA) >> (VB) by halfwords\n  Value* v = f.VectorShr(f.LoadVR(i.VX.VA), f.LoadVR(i.VX.VB), INT16_TYPE);\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vsro_(PPCHIRBuilder& f, uint32_t vd, uint32_t va, uint32_t vb) {\n  // (VD) <- (VA) >> (VB.b[F] & 0x78) (by octet)\n  // TODO(benvanik): flag for shift-by-octet as optimization.\n  Value* sh = f.Shr(\n      f.And(f.Extract(f.LoadVR(vb), 15, INT8_TYPE), f.LoadConstantInt8(0x78)),\n      3);\n  Value* v = f.Permute(f.LoadVectorShr(sh), f.LoadZeroVec128(), f.LoadVR(va),\n                       INT8_TYPE);\n  f.StoreVR(vd, v);\n  return 0;\n}\nint InstrEmit_vsro(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vsro_(f, i.VX.VD, i.VX.VA, i.VX.VB);\n}\nint InstrEmit_vsro128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vsro_(f, VX128_VD128, VX128_VA128, VX128_VB128);\n}\n\nint InstrEmit_vsrw_(PPCHIRBuilder& f, uint32_t vd, uint32_t va, uint32_t vb) {\n  // (VD) <- (VA) >> (VB) by words\n  Value* v = f.VectorShr(f.LoadVR(va), f.LoadVR(vb), INT32_TYPE);\n  f.StoreVR(vd, v);\n  return 0;\n}\nint InstrEmit_vsrw(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vsrw_(f, i.VX.VD, i.VX.VA, i.VX.VB);\n}\nint InstrEmit_vsrw128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vsrw_(f, VX128_VD128, VX128_VA128, VX128_VB128);\n}\n\nint InstrEmit_vsubcuw(PPCHIRBuilder& f, const InstrData& i) {\n  Value* underflow =\n      f.VectorCompareUGE(f.LoadVR(i.VX.VA), f.LoadVR(i.VX.VB), INT32_TYPE);\n  Value* borrow =\n      f.VectorShr(underflow, f.LoadConstantVec128(vec128i(31)), INT32_TYPE);\n  f.StoreVR(i.VX.VD, borrow);\n  return 1;\n}\n\nint InstrEmit_vsubfp_(PPCHIRBuilder& f, uint32_t vd, uint32_t va, uint32_t vb) {\n  // (VD) <- (VA) - (VB) (4 x fp)\n  Value* v = f.VectorSub(f.LoadVR(va), f.LoadVR(vb), FLOAT32_TYPE);\n  f.StoreVR(vd, v);\n  return 0;\n}\nint InstrEmit_vsubfp(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vsubfp_(f, i.VX.VD, i.VX.VA, i.VX.VB);\n}\nint InstrEmit_vsubfp128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vsubfp_(f, VX128_VD128, VX128_VA128, VX128_VB128);\n}\n\nint InstrEmit_vsubsbs(PPCHIRBuilder& f, const InstrData& i) {\n  // (VD) <- clamp(EXTS(VA) + ¬EXTS(VB) + 1, -128, 127)\n  Value* v = f.VectorSub(f.LoadVR(i.VX.VA), f.LoadVR(i.VX.VB), INT8_TYPE,\n                         ARITHMETIC_SATURATE);\n  f.StoreSAT(f.DidSaturate(v));\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vsubshs(PPCHIRBuilder& f, const InstrData& i) {\n  // (VD) <- clamp(EXTS(VA) + ¬EXTS(VB) + 1, -2^15, 2^15-1)\n  Value* v = f.VectorSub(f.LoadVR(i.VX.VA), f.LoadVR(i.VX.VB), INT16_TYPE,\n                         ARITHMETIC_SATURATE);\n  f.StoreSAT(f.DidSaturate(v));\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vsubsws(PPCHIRBuilder& f, const InstrData& i) {\n  // (VD) <- clamp(EXTS(VA) + ¬EXTS(VB) + 1, -2^31, 2^31-1)\n  Value* v = f.VectorSub(f.LoadVR(i.VX.VA), f.LoadVR(i.VX.VB), INT32_TYPE,\n                         ARITHMETIC_SATURATE);\n  f.StoreSAT(f.DidSaturate(v));\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vsububm(PPCHIRBuilder& f, const InstrData& i) {\n  // (VD) <- (EXTZ(VA) + ¬EXTZ(VB) + 1) % 256\n  Value* v = f.VectorSub(f.LoadVR(i.VX.VA), f.LoadVR(i.VX.VB), INT8_TYPE,\n                         ARITHMETIC_UNSIGNED);\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vsubuhm(PPCHIRBuilder& f, const InstrData& i) {\n  // (VD) <- (EXTZ(VA) + ¬EXTZ(VB) + 1) % 2^16\n  Value* v = f.VectorSub(f.LoadVR(i.VX.VA), f.LoadVR(i.VX.VB), INT16_TYPE,\n                         ARITHMETIC_UNSIGNED);\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vsubuwm(PPCHIRBuilder& f, const InstrData& i) {\n  // (VD) <- (EXTZ(VA) + ¬EXTZ(VB) + 1) % 2^32\n  Value* v = f.VectorSub(f.LoadVR(i.VX.VA), f.LoadVR(i.VX.VB), INT32_TYPE,\n                         ARITHMETIC_UNSIGNED);\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vsububs(PPCHIRBuilder& f, const InstrData& i) {\n  // (VD) <- clamp(EXTZ(VA) + ¬EXTZ(VB) + 1, 0, 256)\n  Value* v = f.VectorSub(f.LoadVR(i.VX.VA), f.LoadVR(i.VX.VB), INT8_TYPE,\n                         ARITHMETIC_SATURATE | ARITHMETIC_UNSIGNED);\n  f.StoreSAT(f.DidSaturate(v));\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vsubuhs(PPCHIRBuilder& f, const InstrData& i) {\n  // (VD) <- clamp(EXTZ(VA) + ¬EXTZ(VB) + 1, 0, 2^16-1)\n  Value* v = f.VectorSub(f.LoadVR(i.VX.VA), f.LoadVR(i.VX.VB), INT16_TYPE,\n                         ARITHMETIC_SATURATE | ARITHMETIC_UNSIGNED);\n  f.StoreSAT(f.DidSaturate(v));\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vsubuws(PPCHIRBuilder& f, const InstrData& i) {\n  // (VD) <- clamp(EXTZ(VA) + ¬EXTZ(VB) + 1, 0, 2^32-1)\n  Value* v = f.VectorSub(f.LoadVR(i.VX.VA), f.LoadVR(i.VX.VB), INT32_TYPE,\n                         ARITHMETIC_SATURATE | ARITHMETIC_UNSIGNED);\n  f.StoreSAT(f.DidSaturate(v));\n  f.StoreVR(i.VX.VD, v);\n  return 0;\n}\n\nint InstrEmit_vsumsws(PPCHIRBuilder& f, const InstrData& i) {\n  XEINSTRNOTIMPLEMENTED();\n  return 1;\n}\n\nint InstrEmit_vsum2sws(PPCHIRBuilder& f, const InstrData& i) {\n  XEINSTRNOTIMPLEMENTED();\n  return 1;\n}\n\nint InstrEmit_vsum4sbs(PPCHIRBuilder& f, const InstrData& i) {\n  XEINSTRNOTIMPLEMENTED();\n  return 1;\n}\n\nint InstrEmit_vsum4shs(PPCHIRBuilder& f, const InstrData& i) {\n  XEINSTRNOTIMPLEMENTED();\n  return 1;\n}\n\nint InstrEmit_vsum4ubs(PPCHIRBuilder& f, const InstrData& i) {\n  XEINSTRNOTIMPLEMENTED();\n  return 1;\n}\n\nint InstrEmit_vpkpx(PPCHIRBuilder& f, const InstrData& i) {\n  XEINSTRNOTIMPLEMENTED();\n  return 1;\n}\n\nint InstrEmit_vpkshss_(PPCHIRBuilder& f, uint32_t vd, uint32_t va,\n                       uint32_t vb) {\n  // Vector Pack Signed Halfword Signed Saturate\n  // Convert VA and VB from signed words to signed saturated bytes then\n  // concat:\n  // for each i in VA + VB:\n  //   i = int8_t(Clamp(EXTS(int16_t(t)), -128, 127))\n  // dest = VA | VB (lower 8bit values)\n  Value* v = f.Pack(f.LoadVR(va), f.LoadVR(vb),\n                    PACK_TYPE_8_IN_16 | PACK_TYPE_IN_SIGNED |\n                        PACK_TYPE_OUT_SIGNED | PACK_TYPE_OUT_SATURATE);\n  f.StoreSAT(f.DidSaturate(v));\n  f.StoreVR(vd, v);\n  return 0;\n}\nint InstrEmit_vpkshss(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vpkshss_(f, i.VX.VD, i.VX.VA, i.VX.VB);\n}\nint InstrEmit_vpkshss128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vpkshss_(f, VX128_VD128, VX128_VA128, VX128_VB128);\n}\n\nint InstrEmit_vpkswss_(PPCHIRBuilder& f, uint32_t vd, uint32_t va,\n                       uint32_t vb) {\n  // Vector Pack Signed Word Signed Saturate\n  // Convert VA and VB from signed int words to signed saturated shorts then\n  // concat:\n  // for each i in VA + VB:\n  //   i = int16_t(Clamp(EXTS(int32_t(t)), -2^15, 2^15-1))\n  // dest = VA | VB (lower 16bit values)\n  Value* v = f.Pack(f.LoadVR(va), f.LoadVR(vb),\n                    PACK_TYPE_16_IN_32 | PACK_TYPE_IN_SIGNED |\n                        PACK_TYPE_OUT_SIGNED | PACK_TYPE_OUT_SATURATE);\n  f.StoreSAT(f.DidSaturate(v));\n  f.StoreVR(vd, v);\n  return 0;\n}\nint InstrEmit_vpkswss(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vpkswss_(f, i.VX.VD, i.VX.VA, i.VX.VB);\n}\nint InstrEmit_vpkswss128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vpkswss_(f, VX128_VD128, VX128_VA128, VX128_VB128);\n}\n\nint InstrEmit_vpkswus_(PPCHIRBuilder& f, uint32_t vd, uint32_t va,\n                       uint32_t vb) {\n  // Vector Pack Signed Word Unsigned Saturate\n  // Convert VA and VB from signed int words to unsigned saturated shorts then\n  // concat:\n  // for each i in VA + VB:\n  //   i = uint16_t(Clamp(EXTS(int32_t(t)), 0, 2^16-1))\n  // dest = VA | VB (lower 16bit values)\n  Value* v = f.Pack(f.LoadVR(va), f.LoadVR(vb),\n                    PACK_TYPE_16_IN_32 | PACK_TYPE_IN_SIGNED |\n                        PACK_TYPE_OUT_UNSIGNED | PACK_TYPE_OUT_SATURATE);\n  f.StoreSAT(f.DidSaturate(v));\n  f.StoreVR(vd, v);\n  return 0;\n}\nint InstrEmit_vpkswus(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vpkswus_(f, i.VX.VD, i.VX.VA, i.VX.VB);\n}\nint InstrEmit_vpkswus128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vpkswus_(f, VX128_VD128, VX128_VA128, VX128_VB128);\n}\n\nint InstrEmit_vpkuhum_(PPCHIRBuilder& f, uint32_t vd, uint32_t va,\n                       uint32_t vb) {\n  // Vector Pack Unsigned Halfword Unsigned Modulo\n  // Convert VA and VB from unsigned shorts to unsigned bytes then concat:\n  // for each i in VA + VB:\n  //   i = uint8_t(uint16_t(i))\n  // dest = VA | VB (lower 8bit values)\n  Value* v = f.Pack(f.LoadVR(va), f.LoadVR(vb),\n                    PACK_TYPE_8_IN_16 | PACK_TYPE_IN_UNSIGNED |\n                        PACK_TYPE_OUT_UNSIGNED | PACK_TYPE_OUT_UNSATURATE);\n  f.StoreVR(vd, v);\n  return 0;\n}\nint InstrEmit_vpkuhum(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vpkuhum_(f, i.VX.VD, i.VX.VA, i.VX.VB);\n}\nint InstrEmit_vpkuhum128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vpkuhum_(f, VX128_VD128, VX128_VA128, VX128_VB128);\n}\n\nint InstrEmit_vpkuhus_(PPCHIRBuilder& f, uint32_t vd, uint32_t va,\n                       uint32_t vb) {\n  // Vector Pack Unsigned Halfword Unsigned Saturate\n  // Convert VA and VB from unsigned shorts to unsigned saturated bytes then\n  // concat:\n  // for each i in VA + VB:\n  //   i = uint8_t(Clamp(EXTZ(uint16_t(i)), 0, 255))\n  // dest = VA | VB (lower 8bit values)\n  Value* v = f.Pack(f.LoadVR(va), f.LoadVR(vb),\n                    PACK_TYPE_8_IN_16 | PACK_TYPE_IN_UNSIGNED |\n                        PACK_TYPE_OUT_UNSIGNED | PACK_TYPE_OUT_SATURATE);\n  f.StoreSAT(f.DidSaturate(v));\n  f.StoreVR(vd, v);\n  return 0;\n}\nint InstrEmit_vpkuhus(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vpkuhus_(f, i.VX.VD, i.VX.VA, i.VX.VB);\n}\nint InstrEmit_vpkuhus128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vpkuhus_(f, VX128_VD128, VX128_VA128, VX128_VB128);\n}\n\nint InstrEmit_vpkshus_(PPCHIRBuilder& f, uint32_t vd, uint32_t va,\n                       uint32_t vb) {\n  // Vector Pack Signed Halfword Unsigned Saturate\n  // Convert VA and VB from signed shorts to unsigned saturated bytes then\n  // concat:\n  // for each i in VA + VB:\n  //   i = uint8_t(Clamp(EXTS(int16_t(i)), 0, 255))\n  // dest = VA | VB (lower 8bit values)\n  Value* v = f.Pack(f.LoadVR(va), f.LoadVR(vb),\n                    PACK_TYPE_8_IN_16 | PACK_TYPE_IN_SIGNED |\n                        PACK_TYPE_OUT_UNSIGNED | PACK_TYPE_OUT_SATURATE);\n  f.StoreSAT(f.DidSaturate(v));\n  f.StoreVR(vd, v);\n  return 0;\n}\nint InstrEmit_vpkshus(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vpkshus_(f, i.VX.VD, i.VX.VA, i.VX.VB);\n}\nint InstrEmit_vpkshus128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vpkshus_(f, VX128_VD128, VX128_VA128, VX128_VB128);\n}\n\nint InstrEmit_vpkuwum_(PPCHIRBuilder& f, uint32_t vd, uint32_t va,\n                       uint32_t vb) {\n  // Vector Pack Unsigned Word Unsigned Modulo\n  // Concat low shorts from VA + VB:\n  // for each i in VA + VB:\n  //   i = uint16_t(uint32_t(i))\n  // dest = VA | VB (lower 16bit values)\n  Value* v = f.Pack(f.LoadVR(va), f.LoadVR(vb),\n                    PACK_TYPE_16_IN_32 | PACK_TYPE_IN_UNSIGNED |\n                        PACK_TYPE_OUT_UNSIGNED | PACK_TYPE_OUT_UNSATURATE);\n  f.StoreVR(vd, v);\n  return 0;\n}\nint InstrEmit_vpkuwum(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vpkuwum_(f, i.VX.VD, i.VX.VA, i.VX.VB);\n}\nint InstrEmit_vpkuwum128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vpkuwum_(f, VX128_VD128, VX128_VA128, VX128_VB128);\n}\n\nint InstrEmit_vpkuwus_(PPCHIRBuilder& f, uint32_t vd, uint32_t va,\n                       uint32_t vb) {\n  // Vector Pack Unsigned Word Unsigned Saturate\n  // Convert VA and VB from unsigned int words to unsigned saturated shorts then\n  // concat:\n  // for each i in VA + VB:\n  //   i = uint16_t(Clamp(EXTZ(uint32_t(t)), 0, 2^16-1))\n  // dest = VA | VB (lower 16bit values)\n  Value* v = f.Pack(f.LoadVR(va), f.LoadVR(vb),\n                    PACK_TYPE_16_IN_32 | PACK_TYPE_IN_UNSIGNED |\n                        PACK_TYPE_OUT_UNSIGNED | PACK_TYPE_OUT_SATURATE);\n  f.StoreSAT(f.DidSaturate(v));\n  f.StoreVR(vd, v);\n  return 0;\n}\nint InstrEmit_vpkuwus(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vpkuwus_(f, i.VX.VD, i.VX.VA, i.VX.VB);\n}\nint InstrEmit_vpkuwus128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vpkuwus_(f, VX128_VD128, VX128_VA128, VX128_VB128);\n}\n\nint InstrEmit_vupkhpx(PPCHIRBuilder& f, const InstrData& i) {\n  XEINSTRNOTIMPLEMENTED();\n  return 1;\n}\n\nint InstrEmit_vupklpx(PPCHIRBuilder& f, const InstrData& i) {\n  XEINSTRNOTIMPLEMENTED();\n  return 1;\n}\n\nint InstrEmit_vupkhsh_(PPCHIRBuilder& f, uint32_t vd, uint32_t vb) {\n  // Vector Unpack High Signed Halfword\n  // halfwords 0-3 expanded to words 0-3 and sign extended\n  Value* v =\n      f.Unpack(f.LoadVR(vb), PACK_TYPE_TO_HI | PACK_TYPE_16_IN_32 |\n                                 PACK_TYPE_IN_SIGNED | PACK_TYPE_OUT_SIGNED);\n  f.StoreVR(vd, v);\n  return 0;\n}\nint InstrEmit_vupkhsh(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vupkhsh_(f, i.VX.VD, i.VX.VB);\n}\nint InstrEmit_vupkhsh128(PPCHIRBuilder& f, const InstrData& i) {\n  uint32_t va = VX128_VA128;\n  assert_zero(va);\n  return InstrEmit_vupkhsh_(f, VX128_VD128, VX128_VB128);\n}\n\nint InstrEmit_vupklsh_(PPCHIRBuilder& f, uint32_t vd, uint32_t vb) {\n  // Vector Unpack Low Signed Halfword\n  // halfwords 4-7 expanded to words 0-3 and sign extended\n  Value* v =\n      f.Unpack(f.LoadVR(vb), PACK_TYPE_TO_LO | PACK_TYPE_16_IN_32 |\n                                 PACK_TYPE_IN_SIGNED | PACK_TYPE_OUT_SIGNED);\n  f.StoreVR(vd, v);\n  return 0;\n}\nint InstrEmit_vupklsh(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vupklsh_(f, i.VX.VD, i.VX.VB);\n}\nint InstrEmit_vupklsh128(PPCHIRBuilder& f, const InstrData& i) {\n  uint32_t va = VX128_VA128;\n  assert_zero(va);\n  return InstrEmit_vupklsh_(f, VX128_VD128, VX128_VB128);\n}\n\nint InstrEmit_vupkhsb_(PPCHIRBuilder& f, uint32_t vd, uint32_t vb) {\n  // Vector Unpack High Signed Byte\n  // bytes 0-7 expanded to halfwords 0-7 and sign extended\n  Value* v =\n      f.Unpack(f.LoadVR(vb), PACK_TYPE_TO_HI | PACK_TYPE_8_IN_16 |\n                                 PACK_TYPE_IN_SIGNED | PACK_TYPE_OUT_SIGNED);\n  f.StoreVR(vd, v);\n  return 0;\n}\nint InstrEmit_vupkhsb(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vupkhsb_(f, i.VX.VD, i.VX.VB);\n}\nint InstrEmit_vupkhsb128(PPCHIRBuilder& f, const InstrData& i) {\n  uint32_t va = VX128_VA128;\n  if (va == 0x60) {\n    // Hrm, my instruction tables suck.\n    return InstrEmit_vupkhsh_(f, VX128_VD128, VX128_VB128);\n  }\n  return InstrEmit_vupkhsb_(f, VX128_VD128, VX128_VB128);\n}\n\nint InstrEmit_vupklsb_(PPCHIRBuilder& f, uint32_t vd, uint32_t vb) {\n  // Vector Unpack Low Signed Byte\n  // bytes 8-15 expanded to halfwords 0-7 and sign extended\n  Value* v =\n      f.Unpack(f.LoadVR(vb), PACK_TYPE_TO_LO | PACK_TYPE_8_IN_16 |\n                                 PACK_TYPE_IN_SIGNED | PACK_TYPE_OUT_SIGNED);\n  f.StoreVR(vd, v);\n  return 0;\n}\nint InstrEmit_vupklsb(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vupklsb_(f, i.VX.VD, i.VX.VB);\n}\nint InstrEmit_vupklsb128(PPCHIRBuilder& f, const InstrData& i) {\n  uint32_t va = VX128_VA128;\n  if (va == 0x60) {\n    // Hrm, my instruction tables suck.\n    return InstrEmit_vupklsh_(f, VX128_VD128, VX128_VB128);\n  }\n  return InstrEmit_vupklsb_(f, VX128_VD128, VX128_VB128);\n}\n\nint InstrEmit_vpkd3d128(PPCHIRBuilder& f, const InstrData& i) {\n  const uint32_t vd = i.VX128_4.VD128l | (i.VX128_4.VD128h << 5);\n  const uint32_t vb = i.VX128_4.VB128l | (i.VX128_4.VB128h << 5);\n  uint32_t type = i.VX128_4.IMM >> 2;\n  uint32_t pack = i.VX128_4.IMM & 0x3;\n  uint32_t shift = i.VX128_4.z;\n  Value* v = f.LoadVR(vb);\n  switch (type) {\n    case 0:  // VPACK_D3DCOLOR\n      v = f.Pack(v, PACK_TYPE_D3DCOLOR);\n      break;\n    case 1:  // VPACK_NORMSHORT2\n      v = f.Pack(v, PACK_TYPE_SHORT_2);\n      break;\n    case 2:  // VPACK_NORMPACKED32 2_10_10_10 w_z_y_x\n      v = f.Pack(v, PACK_TYPE_UINT_2101010);\n      break;\n    case 3:  // VPACK_FLOAT16_2 DXGI_FORMAT_R16G16_FLOAT\n      v = f.Pack(v, PACK_TYPE_FLOAT16_2);\n      break;\n    case 4:  // VPACK_NORMSHORT4\n      v = f.Pack(v, PACK_TYPE_SHORT_4);\n      break;\n    case 5:  // VPACK_FLOAT16_4 DXGI_FORMAT_R16G16B16A16_FLOAT\n      v = f.Pack(v, PACK_TYPE_FLOAT16_4);\n      break;\n    case 6:  // VPACK_NORMPACKED64 4_20_20_20 w_z_y_x\n      // Used in 54540829 and other installments in the series, pretty rarely in\n      // general.\n      v = f.Pack(v, PACK_TYPE_ULONG_4202020);\n      break;\n    default:\n      assert_unhandled_case(type);\n      return 1;\n  }\n  // https://hlssmod.net/he_code/public/pixelwriter.h\n  // control = prev:0123 | new:4567\n  uint32_t control = kIdentityPermuteMask;  // original\n  switch (pack) {\n    case 1:  // VPACK_32\n             // VPACK_32 & shift = 3 puts lower 32 bits in x (leftmost slot).\n      switch (shift) {\n        case 0:\n          control = MakePermuteMask(0, 0, 0, 1, 0, 2, 1, 3);\n          break;\n        case 1:\n          control = MakePermuteMask(0, 0, 0, 1, 1, 3, 0, 3);\n          break;\n        case 2:\n          control = MakePermuteMask(0, 0, 1, 3, 0, 2, 0, 3);\n          break;\n        case 3:\n          control = MakePermuteMask(1, 3, 0, 1, 0, 2, 0, 3);\n          break;\n        default:\n          assert_unhandled_case(shift);\n          return 1;\n      }\n      break;\n    case 2:  // 64bit\n      switch (shift) {\n        case 0:\n          control = MakePermuteMask(0, 0, 0, 1, 1, 2, 1, 3);\n          break;\n        case 1:\n          control = MakePermuteMask(0, 0, 1, 2, 1, 3, 0, 3);\n          break;\n        case 2:\n          control = MakePermuteMask(1, 2, 1, 3, 0, 2, 0, 3);\n          break;\n        case 3:\n          control = MakePermuteMask(1, 3, 0, 1, 0, 2, 0, 3);\n          break;\n        default:\n          assert_unhandled_case(shift);\n          return 1;\n      }\n      break;\n    case 3:  // 64bit\n      switch (shift) {\n        case 0:\n          control = MakePermuteMask(0, 0, 0, 1, 1, 2, 1, 3);\n          break;\n        case 1:\n          control = MakePermuteMask(0, 0, 1, 2, 1, 3, 0, 3);\n          break;\n        case 2:\n          control = MakePermuteMask(1, 2, 1, 3, 0, 2, 0, 3);\n          break;\n        case 3:\n          control = MakePermuteMask(0, 0, 0, 1, 0, 2, 1, 2);\n          break;\n        default:\n          assert_unhandled_case(shift);\n          return 1;\n      }\n      break;\n    default:\n      assert_unhandled_case(pack);\n      return 1;\n  }\n  v = f.Permute(f.LoadConstantUint32(control), f.LoadVR(vd), v, INT32_TYPE);\n  f.StoreVR(vd, v);\n  return 0;\n}\n\nint InstrEmit_vupkd3d128(PPCHIRBuilder& f, const InstrData& i) {\n  // Can't find many docs on this. Best reference is\n  // https://code.google.com/archive/p/worldcraft/source/default/source?page=4\n  // (qylib/math/xmmatrix.inl)\n  // which shows how it's used in some cases. Since it's all intrinsics,\n  // finding it in code is pretty easy.\n  const uint32_t vd = i.VX128_3.VD128l | (i.VX128_3.VD128h << 5);\n  const uint32_t vb = i.VX128_3.VB128l | (i.VX128_3.VB128h << 5);\n  const uint32_t type = i.VX128_3.IMM >> 2;\n  Value* v = f.LoadVR(vb);\n  switch (type) {\n    case 0:  // VPACK_D3DCOLOR\n      v = f.Unpack(v, PACK_TYPE_D3DCOLOR);\n      break;\n    case 1:  // VPACK_NORMSHORT2\n      v = f.Unpack(v, PACK_TYPE_SHORT_2);\n      break;\n    case 2:  // VPACK_NORMPACKED32 2_10_10_10 w_z_y_x\n      v = f.Unpack(v, PACK_TYPE_UINT_2101010);\n      break;\n    case 3:  // VPACK_FLOAT16_2 DXGI_FORMAT_R16G16_FLOAT\n      v = f.Unpack(v, PACK_TYPE_FLOAT16_2);\n      break;\n    case 4:  // VPACK_NORMSHORT4\n      v = f.Unpack(v, PACK_TYPE_SHORT_4);\n      break;\n    case 5:  // VPACK_FLOAT16_4 DXGI_FORMAT_R16G16B16A16_FLOAT\n      v = f.Unpack(v, PACK_TYPE_FLOAT16_4);\n      break;\n    case 6:  // VPACK_NORMPACKED64 4_20_20_20 w_z_y_x\n      v = f.Unpack(v, PACK_TYPE_ULONG_4202020);\n      break;\n    default:\n      assert_unhandled_case(type);\n      return 1;\n  }\n  f.StoreVR(vd, v);\n  return 0;\n}\n\nint InstrEmit_vxor_(PPCHIRBuilder& f, uint32_t vd, uint32_t va, uint32_t vb) {\n  // VD <- (VA) ^ (VB)\n  Value* v;\n  if (va == vb) {\n    // Fast clear.\n    v = f.LoadZeroVec128();\n  } else {\n    v = f.Xor(f.LoadVR(va), f.LoadVR(vb));\n  }\n  f.StoreVR(vd, v);\n  return 0;\n}\nint InstrEmit_vxor(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vxor_(f, i.VX.VD, i.VX.VA, i.VX.VB);\n}\nint InstrEmit_vxor128(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_vxor_(f, VX128_VD128, VX128_VA128, VX128_VB128);\n}\n\nvoid RegisterEmitCategoryAltivec() {\n  XEREGISTERINSTR(lvebx);\n  XEREGISTERINSTR(lvehx);\n  XEREGISTERINSTR(lvewx);\n  XEREGISTERINSTR(lvewx128);\n  XEREGISTERINSTR(lvsl);\n  XEREGISTERINSTR(lvsl128);\n  XEREGISTERINSTR(lvsr);\n  XEREGISTERINSTR(lvsr128);\n  XEREGISTERINSTR(lvx);\n  XEREGISTERINSTR(lvx128);\n  XEREGISTERINSTR(lvxl);\n  XEREGISTERINSTR(lvxl128);\n  XEREGISTERINSTR(stvebx);\n  XEREGISTERINSTR(stvehx);\n  XEREGISTERINSTR(stvewx);\n  XEREGISTERINSTR(stvewx128);\n  XEREGISTERINSTR(stvx);\n  XEREGISTERINSTR(stvx128);\n  XEREGISTERINSTR(stvxl);\n  XEREGISTERINSTR(stvxl128);\n  XEREGISTERINSTR(lvlx);\n  XEREGISTERINSTR(lvlx128);\n  XEREGISTERINSTR(lvlxl);\n  XEREGISTERINSTR(lvlxl128);\n  XEREGISTERINSTR(lvrx);\n  XEREGISTERINSTR(lvrx128);\n  XEREGISTERINSTR(lvrxl);\n  XEREGISTERINSTR(lvrxl128);\n  XEREGISTERINSTR(stvlx);\n  XEREGISTERINSTR(stvlx128);\n  XEREGISTERINSTR(stvlxl);\n  XEREGISTERINSTR(stvlxl128);\n  XEREGISTERINSTR(stvrx);\n  XEREGISTERINSTR(stvrx128);\n  XEREGISTERINSTR(stvrxl);\n  XEREGISTERINSTR(stvrxl128);\n\n  XEREGISTERINSTR(mfvscr);\n  XEREGISTERINSTR(mtvscr);\n  XEREGISTERINSTR(vaddcuw);\n  XEREGISTERINSTR(vaddfp);\n  XEREGISTERINSTR(vaddfp128);\n  XEREGISTERINSTR(vaddsbs);\n  XEREGISTERINSTR(vaddshs);\n  XEREGISTERINSTR(vaddsws);\n  XEREGISTERINSTR(vaddubm);\n  XEREGISTERINSTR(vaddubs);\n  XEREGISTERINSTR(vadduhm);\n  XEREGISTERINSTR(vadduhs);\n  XEREGISTERINSTR(vadduwm);\n  XEREGISTERINSTR(vadduws);\n  XEREGISTERINSTR(vand);\n  XEREGISTERINSTR(vand128);\n  XEREGISTERINSTR(vandc);\n  XEREGISTERINSTR(vandc128);\n  XEREGISTERINSTR(vavgsb);\n  XEREGISTERINSTR(vavgsh);\n  XEREGISTERINSTR(vavgsw);\n  XEREGISTERINSTR(vavgub);\n  XEREGISTERINSTR(vavguh);\n  XEREGISTERINSTR(vavguw);\n  XEREGISTERINSTR(vcfsx);\n  XEREGISTERINSTR(vcsxwfp128);\n  XEREGISTERINSTR(vcfpsxws128);\n  XEREGISTERINSTR(vcfux);\n  XEREGISTERINSTR(vcuxwfp128);\n  XEREGISTERINSTR(vcfpuxws128);\n  XEREGISTERINSTR(vcmpbfp);\n  XEREGISTERINSTR(vcmpbfp128);\n  XEREGISTERINSTR(vcmpeqfp);\n  XEREGISTERINSTR(vcmpeqfp128);\n  XEREGISTERINSTR(vcmpgefp);\n  XEREGISTERINSTR(vcmpgefp128);\n  XEREGISTERINSTR(vcmpgtfp);\n  XEREGISTERINSTR(vcmpgtfp128);\n  XEREGISTERINSTR(vcmpgtsb);\n  XEREGISTERINSTR(vcmpgtsh);\n  XEREGISTERINSTR(vcmpgtsw);\n  XEREGISTERINSTR(vcmpequb);\n  XEREGISTERINSTR(vcmpgtub);\n  XEREGISTERINSTR(vcmpequh);\n  XEREGISTERINSTR(vcmpgtuh);\n  XEREGISTERINSTR(vcmpequw);\n  XEREGISTERINSTR(vcmpequw128);\n  XEREGISTERINSTR(vcmpgtuw);\n  XEREGISTERINSTR(vctsxs);\n  XEREGISTERINSTR(vctuxs);\n  XEREGISTERINSTR(vexptefp);\n  XEREGISTERINSTR(vexptefp128);\n  XEREGISTERINSTR(vlogefp);\n  XEREGISTERINSTR(vlogefp128);\n  XEREGISTERINSTR(vmaddfp);\n  XEREGISTERINSTR(vmaddfp128);\n  XEREGISTERINSTR(vmaddcfp128);\n  XEREGISTERINSTR(vmaxfp);\n  XEREGISTERINSTR(vmaxfp128);\n  XEREGISTERINSTR(vmaxsb);\n  XEREGISTERINSTR(vmaxsh);\n  XEREGISTERINSTR(vmaxsw);\n  XEREGISTERINSTR(vmaxub);\n  XEREGISTERINSTR(vmaxuh);\n  XEREGISTERINSTR(vmaxuw);\n  XEREGISTERINSTR(vmhaddshs);\n  XEREGISTERINSTR(vmhraddshs);\n  XEREGISTERINSTR(vminfp);\n  XEREGISTERINSTR(vminfp128);\n  XEREGISTERINSTR(vminsb);\n  XEREGISTERINSTR(vminsh);\n  XEREGISTERINSTR(vminsw);\n  XEREGISTERINSTR(vminub);\n  XEREGISTERINSTR(vminuh);\n  XEREGISTERINSTR(vminuw);\n  XEREGISTERINSTR(vmladduhm);\n  XEREGISTERINSTR(vmrghb);\n  XEREGISTERINSTR(vmrghh);\n  XEREGISTERINSTR(vmrghw);\n  XEREGISTERINSTR(vmrghw128);\n  XEREGISTERINSTR(vmrglb);\n  XEREGISTERINSTR(vmrglh);\n  XEREGISTERINSTR(vmrglw);\n  XEREGISTERINSTR(vmrglw128);\n  XEREGISTERINSTR(vmsummbm);\n  XEREGISTERINSTR(vmsumshm);\n  XEREGISTERINSTR(vmsumshs);\n  XEREGISTERINSTR(vmsumubm);\n  XEREGISTERINSTR(vmsumuhm);\n  XEREGISTERINSTR(vmsumuhs);\n  XEREGISTERINSTR(vmsum3fp128);\n  XEREGISTERINSTR(vmsum4fp128);\n  XEREGISTERINSTR(vmulesb);\n  XEREGISTERINSTR(vmulesh);\n  XEREGISTERINSTR(vmuleub);\n  XEREGISTERINSTR(vmuleuh);\n  XEREGISTERINSTR(vmulosb);\n  XEREGISTERINSTR(vmulosh);\n  XEREGISTERINSTR(vmuloub);\n  XEREGISTERINSTR(vmulouh);\n  XEREGISTERINSTR(vmulfp128);\n  XEREGISTERINSTR(vnmsubfp);\n  XEREGISTERINSTR(vnmsubfp128);\n  XEREGISTERINSTR(vnor);\n  XEREGISTERINSTR(vnor128);\n  XEREGISTERINSTR(vor);\n  XEREGISTERINSTR(vor128);\n  XEREGISTERINSTR(vperm);\n  XEREGISTERINSTR(vperm128);\n  XEREGISTERINSTR(vpermwi128);\n  XEREGISTERINSTR(vpkpx);\n  XEREGISTERINSTR(vpkshss);\n  XEREGISTERINSTR(vpkshss128);\n  XEREGISTERINSTR(vpkshus);\n  XEREGISTERINSTR(vpkshus128);\n  XEREGISTERINSTR(vpkswss);\n  XEREGISTERINSTR(vpkswss128);\n  XEREGISTERINSTR(vpkswus);\n  XEREGISTERINSTR(vpkswus128);\n  XEREGISTERINSTR(vpkuhum);\n  XEREGISTERINSTR(vpkuhum128);\n  XEREGISTERINSTR(vpkuhus);\n  XEREGISTERINSTR(vpkuhus128);\n  XEREGISTERINSTR(vpkuwum);\n  XEREGISTERINSTR(vpkuwum128);\n  XEREGISTERINSTR(vpkuwus);\n  XEREGISTERINSTR(vpkuwus128);\n  XEREGISTERINSTR(vpkd3d128);\n  XEREGISTERINSTR(vrefp);\n  XEREGISTERINSTR(vrefp128);\n  XEREGISTERINSTR(vrfim);\n  XEREGISTERINSTR(vrfim128);\n  XEREGISTERINSTR(vrfin);\n  XEREGISTERINSTR(vrfin128);\n  XEREGISTERINSTR(vrfip);\n  XEREGISTERINSTR(vrfip128);\n  XEREGISTERINSTR(vrfiz);\n  XEREGISTERINSTR(vrfiz128);\n  XEREGISTERINSTR(vrlb);\n  XEREGISTERINSTR(vrlh);\n  XEREGISTERINSTR(vrlw);\n  XEREGISTERINSTR(vrlw128);\n  XEREGISTERINSTR(vrlimi128);\n  XEREGISTERINSTR(vrsqrtefp);\n  XEREGISTERINSTR(vrsqrtefp128);\n  XEREGISTERINSTR(vsel);\n  XEREGISTERINSTR(vsel128);\n  XEREGISTERINSTR(vsl);\n  XEREGISTERINSTR(vslb);\n  XEREGISTERINSTR(vslh);\n  XEREGISTERINSTR(vslo);\n  XEREGISTERINSTR(vslo128);\n  XEREGISTERINSTR(vslw);\n  XEREGISTERINSTR(vslw128);\n  XEREGISTERINSTR(vsldoi);\n  XEREGISTERINSTR(vsldoi128);\n  XEREGISTERINSTR(vspltb);\n  XEREGISTERINSTR(vsplth);\n  XEREGISTERINSTR(vspltw);\n  XEREGISTERINSTR(vspltw128);\n  XEREGISTERINSTR(vspltisb);\n  XEREGISTERINSTR(vspltish);\n  XEREGISTERINSTR(vspltisw);\n  XEREGISTERINSTR(vspltisw128);\n  XEREGISTERINSTR(vsr);\n  XEREGISTERINSTR(vsrab);\n  XEREGISTERINSTR(vsrah);\n  XEREGISTERINSTR(vsraw);\n  XEREGISTERINSTR(vsraw128);\n  XEREGISTERINSTR(vsrb);\n  XEREGISTERINSTR(vsrh);\n  XEREGISTERINSTR(vsro);\n  XEREGISTERINSTR(vsro128);\n  XEREGISTERINSTR(vsrw);\n  XEREGISTERINSTR(vsrw128);\n  XEREGISTERINSTR(vsubcuw);\n  XEREGISTERINSTR(vsubfp);\n  XEREGISTERINSTR(vsubfp128);\n  XEREGISTERINSTR(vsubsbs);\n  XEREGISTERINSTR(vsubshs);\n  XEREGISTERINSTR(vsubsws);\n  XEREGISTERINSTR(vsububm);\n  XEREGISTERINSTR(vsubuhm);\n  XEREGISTERINSTR(vsubuwm);\n  XEREGISTERINSTR(vsububs);\n  XEREGISTERINSTR(vsubuhs);\n  XEREGISTERINSTR(vsubuws);\n  XEREGISTERINSTR(vsumsws);\n  XEREGISTERINSTR(vsum2sws);\n  XEREGISTERINSTR(vsum4sbs);\n  XEREGISTERINSTR(vsum4shs);\n  XEREGISTERINSTR(vsum4ubs);\n  XEREGISTERINSTR(vupkhpx);\n  XEREGISTERINSTR(vupkhsb);\n  XEREGISTERINSTR(vupkhsb128);\n  XEREGISTERINSTR(vupkhsh);\n  XEREGISTERINSTR(vupklpx);\n  XEREGISTERINSTR(vupklsb);\n  XEREGISTERINSTR(vupklsb128);\n  XEREGISTERINSTR(vupklsh);\n  XEREGISTERINSTR(vupkd3d128);\n  XEREGISTERINSTR(vxor);\n  XEREGISTERINSTR(vxor128);\n}\n\n}  // namespace ppc\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/ppc/ppc_emit_alu.cc",
    "content": "/*\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/ppc/ppc_emit-private.h\"\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/cpu/ppc/ppc_context.h\"\n#include \"xenia/cpu/ppc/ppc_hir_builder.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace ppc {\n\n// TODO(benvanik): remove when enums redefined.\nusing namespace xe::cpu::hir;\n\nusing xe::cpu::hir::Value;\n\n// Integer arithmetic (A-3)\n\nValue* AddDidCarry(PPCHIRBuilder& f, Value* v1, Value* v2) {\n  return f.CompareUGT(f.Truncate(v2, INT32_TYPE),\n                      f.Not(f.Truncate(v1, INT32_TYPE)));\n}\n\nValue* SubDidCarry(PPCHIRBuilder& f, Value* v1, Value* v2) {\n  return f.Or(f.CompareUGT(f.Truncate(v1, INT32_TYPE),\n                           f.Not(f.Neg(f.Truncate(v2, INT32_TYPE)))),\n              f.IsFalse(f.Truncate(v2, INT32_TYPE)));\n}\n\n// https://github.com/sebastianbiallas/pearpc/blob/0b3c823f61456faa677f6209545a7b906e797421/src/cpu/cpu_generic/ppc_tools.h#L26\nValue* AddWithCarryDidCarry(PPCHIRBuilder& f, Value* v1, Value* v2, Value* v3) {\n  v1 = f.Truncate(v1, INT32_TYPE);\n  v2 = f.Truncate(v2, INT32_TYPE);\n  assert_true(v3->type == INT8_TYPE);\n  v3 = f.ZeroExtend(v3, INT32_TYPE);\n  return f.Or(f.CompareULT(f.Add(f.Add(v1, v2), v3), v3),\n              f.CompareULT(f.Add(v1, v2), v1));\n}\n\nint InstrEmit_addx(PPCHIRBuilder& f, const InstrData& i) {\n  // RD <- (RA) + (RB)\n  Value* v = f.Add(f.LoadGPR(i.XO.RA), f.LoadGPR(i.XO.RB));\n  f.StoreGPR(i.XO.RT, v);\n  if (i.XO.OE) {\n    XEINSTRNOTIMPLEMENTED();\n    // e.update_xer_with_overflow(EFLAGS OF?);\n  }\n  if (i.XO.Rc) {\n    f.UpdateCR(0, v);\n  }\n  return 0;\n}\n\nint InstrEmit_addcx(PPCHIRBuilder& f, const InstrData& i) {\n  // RD <- (RA) + (RB)\n  // CA <- carry bit\n  Value* ra = f.LoadGPR(i.XO.RA);\n  Value* rb = f.LoadGPR(i.XO.RB);\n  Value* v = f.Add(ra, rb);\n  f.StoreGPR(i.XO.RT, v);\n  if (i.XO.OE) {\n    XEINSTRNOTIMPLEMENTED();\n    // e.update_xer_with_overflow(EFLAGS OF?);\n  } else {\n    f.StoreCA(AddDidCarry(f, ra, rb));\n  }\n  if (i.XO.Rc) {\n    f.UpdateCR(0, v);\n  }\n  return 0;\n}\n\nint InstrEmit_addex(PPCHIRBuilder& f, const InstrData& i) {\n  // RD <- (RA) + (RB) + XER[CA]\n  // CA <- carry bit\n  Value* ra = f.LoadGPR(i.XO.RA);\n  Value* rb = f.LoadGPR(i.XO.RB);\n  Value* v = f.AddWithCarry(ra, rb, f.LoadCA());\n  f.StoreGPR(i.XO.RT, v);\n  if (i.XO.OE) {\n    XEINSTRNOTIMPLEMENTED();\n    // e.update_xer_with_overflow(EFLAGS OF?);\n  } else {\n    f.StoreCA(AddWithCarryDidCarry(f, ra, rb, f.LoadCA()));\n  }\n  if (i.XO.Rc) {\n    f.UpdateCR(0, v);\n  }\n  return 0;\n}\n\nint InstrEmit_addi(PPCHIRBuilder& f, const InstrData& i) {\n  // if RA = 0 then\n  //   RT <- EXTS(SI)\n  // else\n  //   RT <- (RA) + EXTS(SI)\n  Value* si = f.LoadConstantInt64(XEEXTS16(i.D.DS));\n  Value* v = si;\n  if (i.D.RA) {\n    v = f.Add(f.LoadGPR(i.D.RA), si);\n  }\n  f.StoreGPR(i.D.RT, v);\n  return 0;\n}\n\nint InstrEmit_addic(PPCHIRBuilder& f, const InstrData& i) {\n  // RT <- (RA) + EXTS(SI)\n  // CA <- carry bit\n  Value* ra = f.LoadGPR(i.D.RA);\n  Value* v = f.Add(ra, f.LoadConstantInt64(XEEXTS16(i.D.DS)));\n  f.StoreGPR(i.D.RT, v);\n  f.StoreCA(AddDidCarry(f, ra, f.LoadConstantInt64(XEEXTS16(i.D.DS))));\n  return 0;\n}\n\nint InstrEmit_addicx(PPCHIRBuilder& f, const InstrData& i) {\n  // RT <- (RA) + EXTS(SI)\n  // CA <- carry bit\n  Value* ra = f.LoadGPR(i.D.RA);\n  Value* v = f.Add(f.LoadGPR(i.D.RA), f.LoadConstantInt64(XEEXTS16(i.D.DS)));\n  f.StoreGPR(i.D.RT, v);\n  f.StoreCA(AddDidCarry(f, ra, f.LoadConstantInt64(XEEXTS16(i.D.DS))));\n  f.UpdateCR(0, v);\n  return 0;\n}\n\nint InstrEmit_addis(PPCHIRBuilder& f, const InstrData& i) {\n  // if RA = 0 then\n  //   RT <- EXTS(SI) || i16.0\n  // else\n  //   RT <- (RA) + EXTS(SI) || i16.0\n  Value* si = f.LoadConstantInt64(XEEXTS16(i.D.DS) << 16);\n  Value* v = si;\n  if (i.D.RA) {\n    v = f.Add(f.LoadGPR(i.D.RA), si);\n  }\n  f.StoreGPR(i.D.RT, v);\n  return 0;\n}\n\nint InstrEmit_addmex(PPCHIRBuilder& f, const InstrData& i) {\n  // RT <- (RA) + CA - 1\n  // CA <- carry bit\n  Value* ra = f.LoadGPR(i.XO.RA);\n  Value* v = f.AddWithCarry(ra, f.LoadConstantInt64(-1), f.LoadCA());\n  f.StoreGPR(i.XO.RT, v);\n  if (i.XO.OE) {\n    // With XER[SO] update too.\n    // e.update_xer_with_overflow_and_carry(b.CreateExtractValue(v, 1));\n    XEINSTRNOTIMPLEMENTED();\n  } else {\n    // Just CA update.\n    f.StoreCA(AddWithCarryDidCarry(f, ra, f.LoadConstantInt64(-1), f.LoadCA()));\n  }\n  if (i.XO.Rc) {\n    f.UpdateCR(0, v);\n  }\n  return 0;\n}\n\nint InstrEmit_addzex(PPCHIRBuilder& f, const InstrData& i) {\n  // RT <- (RA) + CA\n  // CA <- carry bit\n  Value* ra = f.LoadGPR(i.XO.RA);\n  Value* v = f.AddWithCarry(ra, f.LoadZeroInt64(), f.LoadCA());\n  f.StoreGPR(i.XO.RT, v);\n  if (i.XO.OE) {\n    // With XER[SO] update too.\n    // e.update_xer_with_overflow_and_carry(b.CreateExtractValue(v, 1));\n    XEINSTRNOTIMPLEMENTED();\n    return 1;\n  } else {\n    // Just CA update.\n    f.StoreCA(AddWithCarryDidCarry(f, ra, f.LoadZeroInt64(), f.LoadCA()));\n  }\n  if (i.XO.Rc) {\n    f.UpdateCR(0, v);\n  }\n  return 0;\n}\n\nint InstrEmit_divdx(PPCHIRBuilder& f, const InstrData& i) {\n  // dividend <- (RA)\n  // divisor <- (RB)\n  // if divisor = 0 then\n  //   if OE = 1 then\n  //     XER[OV] <- 1\n  //   return\n  // RT <- dividend ÷ divisor\n  Value* divisor = f.LoadGPR(i.XO.RB);\n  // TODO(benvanik): check if zero\n  //                 if OE=1, set XER[OV] = 1\n  //                 else skip the divide\n  Value* v = f.Div(f.LoadGPR(i.XO.RA), divisor);\n  f.StoreGPR(i.XO.RT, v);\n  if (i.XO.OE) {\n    // If we are OE=1 we need to clear the overflow bit.\n    // e.update_xer_with_overflow(e.get_uint64(0));\n    XEINSTRNOTIMPLEMENTED();\n    return 1;\n  }\n  if (i.XO.Rc) {\n    f.UpdateCR(0, v);\n  }\n  return 0;\n}\n\nint InstrEmit_divdux(PPCHIRBuilder& f, const InstrData& i) {\n  // dividend <- (RA)\n  // divisor <- (RB)\n  // if divisor = 0 then\n  //   if OE = 1 then\n  //     XER[OV] <- 1\n  //   return\n  // RT <- dividend ÷ divisor\n  Value* divisor = f.LoadGPR(i.XO.RB);\n  // TODO(benvanik): check if zero\n  //                 if OE=1, set XER[OV] = 1\n  //                 else skip the divide\n  Value* v = f.Div(f.LoadGPR(i.XO.RA), divisor, ARITHMETIC_UNSIGNED);\n  f.StoreGPR(i.XO.RT, v);\n  if (i.XO.OE) {\n    // If we are OE=1 we need to clear the overflow bit.\n    // e.update_xer_with_overflow(e.get_uint64(0));\n    XEINSTRNOTIMPLEMENTED();\n    return 1;\n  }\n  if (i.XO.Rc) {\n    f.UpdateCR(0, v);\n  }\n  return 0;\n}\n\nint InstrEmit_divwx(PPCHIRBuilder& f, const InstrData& i) {\n  // dividend[0:31] <- (RA)[32:63]\n  // divisor[0:31] <- (RB)[32:63]\n  // if divisor = 0 then\n  //   if OE = 1 then\n  //     XER[OV] <- 1\n  //   return\n  // RT[32:63] <- dividend ÷ divisor\n  // RT[0:31] <- undefined\n  Value* divisor = f.Truncate(f.LoadGPR(i.XO.RB), INT32_TYPE);\n  // TODO(benvanik): check if zero\n  //                 if OE=1, set XER[OV] = 1\n  //                 else skip the divide\n  Value* v = f.Div(f.Truncate(f.LoadGPR(i.XO.RA), INT32_TYPE), divisor);\n  v = f.ZeroExtend(v, INT64_TYPE);\n  f.StoreGPR(i.XO.RT, v);\n  if (i.XO.OE) {\n    // If we are OE=1 we need to clear the overflow bit.\n    // e.update_xer_with_overflow(e.get_uint64(0));\n    XEINSTRNOTIMPLEMENTED();\n    return 1;\n  }\n  if (i.XO.Rc) {\n    f.UpdateCR(0, v);\n  }\n  return 0;\n}\n\nint InstrEmit_divwux(PPCHIRBuilder& f, const InstrData& i) {\n  // dividend[0:31] <- (RA)[32:63]\n  // divisor[0:31] <- (RB)[32:63]\n  // if divisor = 0 then\n  //   if OE = 1 then\n  //     XER[OV] <- 1\n  //   return\n  // RT[32:63] <- dividend ÷ divisor\n  // RT[0:31] <- undefined\n  Value* divisor = f.Truncate(f.LoadGPR(i.XO.RB), INT32_TYPE);\n  // TODO(benvanik): check if zero\n  //                 if OE=1, set XER[OV] = 1\n  //                 else skip the divide\n  Value* v = f.Div(f.Truncate(f.LoadGPR(i.XO.RA), INT32_TYPE), divisor,\n                   ARITHMETIC_UNSIGNED);\n  v = f.ZeroExtend(v, INT64_TYPE);\n  f.StoreGPR(i.XO.RT, v);\n  if (i.XO.OE) {\n    // If we are OE=1 we need to clear the overflow bit.\n    // e.update_xer_with_overflow(e.get_uint64(0));\n    XEINSTRNOTIMPLEMENTED();\n    return 1;\n  }\n  if (i.XO.Rc) {\n    f.UpdateCR(0, v);\n  }\n  return 0;\n}\n\nint InstrEmit_mulhdx(PPCHIRBuilder& f, const InstrData& i) {\n  // RT <- ((RA) × (RB) as 128)[0:63]\n  if (i.XO.OE) {\n    // With XER update.\n    XEINSTRNOTIMPLEMENTED();\n    return 1;\n  }\n  Value* v = f.MulHi(f.LoadGPR(i.XO.RA), f.LoadGPR(i.XO.RB));\n  f.StoreGPR(i.XO.RT, v);\n  if (i.XO.Rc) {\n    f.UpdateCR(0, v);\n  }\n  return 0;\n}\n\nint InstrEmit_mulhdux(PPCHIRBuilder& f, const InstrData& i) {\n  // RT <- ((RA) × (RB) as 128)[0:63]\n  if (i.XO.OE) {\n    // With XER update.\n    XEINSTRNOTIMPLEMENTED();\n    return 1;\n  }\n  Value* v =\n      f.MulHi(f.LoadGPR(i.XO.RA), f.LoadGPR(i.XO.RB), ARITHMETIC_UNSIGNED);\n  f.StoreGPR(i.XO.RT, v);\n  if (i.XO.Rc) {\n    f.UpdateCR(0, v);\n  }\n  return 0;\n}\n\nint InstrEmit_mulhwx(PPCHIRBuilder& f, const InstrData& i) {\n  // RT[32:64] <- ((RA)[32:63] × (RB)[32:63])[0:31]\n  if (i.XO.OE) {\n    // With XER update.\n    XEINSTRNOTIMPLEMENTED();\n    return 1;\n  }\n  Value* v = f.SignExtend(f.MulHi(f.Truncate(f.LoadGPR(i.XO.RA), INT32_TYPE),\n                                  f.Truncate(f.LoadGPR(i.XO.RB), INT32_TYPE)),\n                          INT64_TYPE);\n  f.StoreGPR(i.XO.RT, v);\n  if (i.XO.Rc) {\n    f.UpdateCR(0, v);\n  }\n  return 0;\n}\n\nint InstrEmit_mulhwux(PPCHIRBuilder& f, const InstrData& i) {\n  // RT[32:64] <- ((RA)[32:63] × (RB)[32:63])[0:31]\n  if (i.XO.OE) {\n    // With XER update.\n    XEINSTRNOTIMPLEMENTED();\n    return 1;\n  }\n  Value* v = f.ZeroExtend(\n      f.MulHi(f.Truncate(f.LoadGPR(i.XO.RA), INT32_TYPE),\n              f.Truncate(f.LoadGPR(i.XO.RB), INT32_TYPE), ARITHMETIC_UNSIGNED),\n      INT64_TYPE);\n  f.StoreGPR(i.XO.RT, v);\n  if (i.XO.Rc) {\n    f.UpdateCR(0, v);\n  }\n  return 0;\n}\n\nint InstrEmit_mulldx(PPCHIRBuilder& f, const InstrData& i) {\n  // RT <- ((RA) × (RB))[64:127]\n  if (i.XO.OE) {\n    // With XER update.\n    XEINSTRNOTIMPLEMENTED();\n    return 1;\n  }\n  Value* v = f.Mul(f.LoadGPR(i.XO.RA), f.LoadGPR(i.XO.RB));\n  f.StoreGPR(i.XO.RT, v);\n  if (i.XO.Rc) {\n    f.UpdateCR(0, v);\n  }\n  return 0;\n}\n\nint InstrEmit_mulli(PPCHIRBuilder& f, const InstrData& i) {\n  // prod[0:127] <- (RA) × EXTS(SI)\n  // RT <- prod[64:127]\n  Value* v = f.Mul(f.LoadGPR(i.D.RA), f.LoadConstantInt64(XEEXTS16(i.D.DS)));\n  f.StoreGPR(i.D.RT, v);\n  return 0;\n}\n\nint InstrEmit_mullwx(PPCHIRBuilder& f, const InstrData& i) {\n  // RT <- (RA)[32:63] × (RB)[32:63]\n  if (i.XO.OE) {\n    // With XER update.\n    XEINSTRNOTIMPLEMENTED();\n    return 1;\n  }\n  Value* v = f.Mul(\n      f.SignExtend(f.Truncate(f.LoadGPR(i.XO.RA), INT32_TYPE), INT64_TYPE),\n      f.SignExtend(f.Truncate(f.LoadGPR(i.XO.RB), INT32_TYPE), INT64_TYPE));\n  f.StoreGPR(i.XO.RT, v);\n  if (i.XO.Rc) {\n    f.UpdateCR(0, v);\n  }\n  return 0;\n}\n\nint InstrEmit_negx(PPCHIRBuilder& f, const InstrData& i) {\n  // RT <- ¬(RA) + 1\n  if (i.XO.OE) {\n    // With XER update.\n    // This is a different codepath as we need to use llvm.ssub.with.overflow.\n\n    // if RA == 0x8000000000000000 then no-op and set OV=1\n    // This may just magically do that...\n\n    XEINSTRNOTIMPLEMENTED();\n    return 1;\n    // Function* ssub_with_overflow = Intrinsic::getDeclaration(\n    //    e.gen_module(), Intrinsic::ssub_with_overflow, jit_type_nint);\n    // jit_value_t v = b.CreateCall2(ssub_with_overflow,\n    //                         e.get_int64(0), f.LoadGPR(i.XO.RA));\n    // jit_value_t v0 = b.CreateExtractValue(v, 0);\n    // f.StoreGPR(i.XO.RT, v0);\n    // e.update_xer_with_overflow(b.CreateExtractValue(v, 1));\n\n    // if (i.XO.Rc) {\n    //  // With cr0 update.\n    //  f.UpdateCR(0, v0, e.get_int64(0), true);\n    //}\n  } else {\n    // No OE bit setting.\n    Value* v = f.Neg(f.LoadGPR(i.XO.RA));\n    f.StoreGPR(i.XO.RT, v);\n    if (i.XO.Rc) {\n      f.UpdateCR(0, v);\n    }\n  }\n  return 0;\n}\n\nint InstrEmit_subfx(PPCHIRBuilder& f, const InstrData& i) {\n  // RT <- ¬(RA) + (RB) + 1\n  Value* v = f.Sub(f.LoadGPR(i.XO.RB), f.LoadGPR(i.XO.RA));\n  f.StoreGPR(i.XO.RT, v);\n  if (i.XO.OE) {\n    XEINSTRNOTIMPLEMENTED();\n    return 1;\n    // e.update_xer_with_overflow(EFLAGS??);\n  }\n  if (i.XO.Rc) {\n    f.UpdateCR(0, v);\n  }\n  return 0;\n}\n\nint InstrEmit_subfcx(PPCHIRBuilder& f, const InstrData& i) {\n  // RT <- ¬(RA) + (RB) + 1\n  Value* ra = f.LoadGPR(i.XO.RA);\n  Value* rb = f.LoadGPR(i.XO.RB);\n  Value* v = f.Sub(rb, ra);\n  f.StoreGPR(i.XO.RT, v);\n  if (i.XO.OE) {\n    XEINSTRNOTIMPLEMENTED();\n    return 1;\n    // e.update_xer_with_overflow(EFLAGS??);\n  } else {\n    f.StoreCA(SubDidCarry(f, rb, ra));\n  }\n  if (i.XO.Rc) {\n    f.UpdateCR(0, v);\n  }\n  return 0;\n}\n\nint InstrEmit_subficx(PPCHIRBuilder& f, const InstrData& i) {\n  // RT <- ¬(RA) + EXTS(SI) + 1\n  Value* ra = f.LoadGPR(i.D.RA);\n  Value* v = f.Sub(f.LoadConstantInt64(XEEXTS16(i.D.DS)), ra);\n  f.StoreGPR(i.D.RT, v);\n  f.StoreCA(SubDidCarry(f, f.LoadConstantInt64(XEEXTS16(i.D.DS)), ra));\n  return 0;\n}\n\nint InstrEmit_subfex(PPCHIRBuilder& f, const InstrData& i) {\n  // RT <- ¬(RA) + (RB) + CA\n  Value* not_ra = f.Not(f.LoadGPR(i.XO.RA));\n  Value* rb = f.LoadGPR(i.XO.RB);\n  Value* v = f.AddWithCarry(not_ra, rb, f.LoadCA());\n  f.StoreGPR(i.XO.RT, v);\n  if (i.XO.OE) {\n    XEINSTRNOTIMPLEMENTED();\n    return 1;\n    // e.update_xer_with_overflow_and_carry(b.CreateExtractValue(v, 1));\n  } else {\n    f.StoreCA(AddWithCarryDidCarry(f, not_ra, rb, f.LoadCA()));\n  }\n  if (i.XO.Rc) {\n    f.UpdateCR(0, v);\n  }\n  return 0;\n}\n\nint InstrEmit_subfmex(PPCHIRBuilder& f, const InstrData& i) {\n  // RT <- ¬(RA) + CA - 1\n  Value* not_ra = f.Not(f.LoadGPR(i.XO.RA));\n  Value* v = f.AddWithCarry(not_ra, f.LoadConstantInt64(-1), f.LoadCA());\n  f.StoreGPR(i.XO.RT, v);\n  if (i.XO.OE) {\n    XEINSTRNOTIMPLEMENTED();\n    return 1;\n    // e.update_xer_with_overflow_and_carry(b.CreateExtractValue(v, 1));\n  } else {\n    f.StoreCA(\n        AddWithCarryDidCarry(f, not_ra, f.LoadConstantInt64(-1), f.LoadCA()));\n  }\n  if (i.XO.Rc) {\n    f.UpdateCR(0, v);\n  }\n  return 0;\n}\n\nint InstrEmit_subfzex(PPCHIRBuilder& f, const InstrData& i) {\n  // RT <- ¬(RA) + CA\n  Value* not_ra = f.Not(f.LoadGPR(i.XO.RA));\n  Value* v = f.AddWithCarry(not_ra, f.LoadZeroInt64(), f.LoadCA());\n  f.StoreGPR(i.XO.RT, v);\n  if (i.XO.OE) {\n    XEINSTRNOTIMPLEMENTED();\n    return 1;\n    // e.update_xer_with_overflow_and_carry(b.CreateExtractValue(v, 1));\n  } else {\n    f.StoreCA(AddWithCarryDidCarry(f, not_ra, f.LoadZeroInt64(), f.LoadCA()));\n  }\n  if (i.XO.Rc) {\n    f.UpdateCR(0, v);\n  }\n  return 0;\n}\n\n// Integer compare (A-4)\n\nint InstrEmit_cmp(PPCHIRBuilder& f, const InstrData& i) {\n  // if L = 0 then\n  //   a <- EXTS((RA)[32:63])\n  //   b <- EXTS((RB)[32:63])\n  // else\n  //   a <- (RA)\n  //   b <- (RB)\n  // if a < b then\n  //   c <- 0b100\n  // else if a > b then\n  //   c <- 0b010\n  // else\n  //   c <- 0b001\n  // CR[4×BF+32:4×BF+35] <- c || XER[SO]\n  uint32_t BF = i.X.RT >> 2;\n  uint32_t L = i.X.RT & 1;\n  Value* lhs;\n  Value* rhs;\n  if (L) {\n    lhs = f.LoadGPR(i.X.RA);\n    rhs = f.LoadGPR(i.X.RB);\n  } else {\n    lhs = f.Truncate(f.LoadGPR(i.X.RA), INT32_TYPE);\n    rhs = f.Truncate(f.LoadGPR(i.X.RB), INT32_TYPE);\n  }\n  f.UpdateCR(BF, lhs, rhs);\n  return 0;\n}\n\nint InstrEmit_cmpi(PPCHIRBuilder& f, const InstrData& i) {\n  // if L = 0 then\n  //   a <- EXTS((RA)[32:63])\n  // else\n  //   a <- (RA)\n  // if a < EXTS(SI) then\n  //   c <- 0b100\n  // else if a > EXTS(SI) then\n  //   c <- 0b010\n  // else\n  //   c <- 0b001\n  // CR[4×BF+32:4×BF+35] <- c || XER[SO]\n  uint32_t BF = i.D.RT >> 2;\n  uint32_t L = i.D.RT & 1;\n  Value* lhs;\n  Value* rhs;\n  if (L) {\n    lhs = f.LoadGPR(i.D.RA);\n    rhs = f.LoadConstantInt64(XEEXTS16(i.D.DS));\n  } else {\n    lhs = f.Truncate(f.LoadGPR(i.D.RA), INT32_TYPE);\n    rhs = f.LoadConstantInt32(int32_t(XEEXTS16(i.D.DS)));\n  }\n  f.UpdateCR(BF, lhs, rhs);\n  return 0;\n}\n\nint InstrEmit_cmpl(PPCHIRBuilder& f, const InstrData& i) {\n  // if L = 0 then\n  //   a <- i32.0 || (RA)[32:63]\n  //   b <- i32.0 || (RB)[32:63]\n  // else\n  //   a <- (RA)\n  //   b <- (RB)\n  // if a <u b then\n  //   c <- 0b100\n  // else if a >u b then\n  //   c <- 0b010\n  // else\n  //   c <- 0b001\n  // CR[4×BF+32:4×BF+35] <- c || XER[SO]\n  uint32_t BF = i.X.RT >> 2;\n  uint32_t L = i.X.RT & 1;\n  Value* lhs;\n  Value* rhs;\n  if (L) {\n    lhs = f.LoadGPR(i.X.RA);\n    rhs = f.LoadGPR(i.X.RB);\n  } else {\n    lhs = f.Truncate(f.LoadGPR(i.X.RA), INT32_TYPE);\n    rhs = f.Truncate(f.LoadGPR(i.X.RB), INT32_TYPE);\n  }\n  f.UpdateCR(BF, lhs, rhs, false);\n  return 0;\n}\n\nint InstrEmit_cmpli(PPCHIRBuilder& f, const InstrData& i) {\n  // if L = 0 then\n  //   a <- i32.0 || (RA)[32:63]\n  // else\n  //   a <- (RA)\n  // if a <u i48.0 || SI then\n  //   c <- 0b100\n  // else if a >u i48.0 || SI then\n  //   c <- 0b010\n  // else\n  //   c <- 0b001\n  // CR[4×BF+32:4×BF+35] <- c || XER[SO]\n  uint32_t BF = i.D.RT >> 2;\n  uint32_t L = i.D.RT & 1;\n  Value* lhs;\n  Value* rhs;\n  if (L) {\n    lhs = f.LoadGPR(i.D.RA);\n    rhs = f.LoadConstantUint64(i.D.DS);\n  } else {\n    lhs = f.Truncate(f.LoadGPR(i.D.RA), INT32_TYPE);\n    rhs = f.LoadConstantUint32(i.D.DS);\n  }\n  f.UpdateCR(BF, lhs, rhs, false);\n  return 0;\n}\n\n// Integer logical (A-5)\n\nint InstrEmit_andx(PPCHIRBuilder& f, const InstrData& i) {\n  // RA <- (RS) & (RB)\n  Value* ra = f.And(f.LoadGPR(i.X.RT), f.LoadGPR(i.X.RB));\n  f.StoreGPR(i.X.RA, ra);\n  if (i.X.Rc) {\n    f.UpdateCR(0, ra);\n  }\n  return 0;\n}\n\nint InstrEmit_andcx(PPCHIRBuilder& f, const InstrData& i) {\n  // RA <- (RS) & ¬(RB)\n  Value* ra = f.AndNot(f.LoadGPR(i.X.RT), f.LoadGPR(i.X.RB));\n  f.StoreGPR(i.X.RA, ra);\n  if (i.X.Rc) {\n    f.UpdateCR(0, ra);\n  }\n  return 0;\n}\n\nint InstrEmit_andix(PPCHIRBuilder& f, const InstrData& i) {\n  // RA <- (RS) & (i48.0 || UI)\n  Value* ra = f.And(f.LoadGPR(i.D.RT), f.LoadConstantUint64(XEEXTZ16(i.D.DS)));\n  f.StoreGPR(i.D.RA, ra);\n  f.UpdateCR(0, ra);\n  return 0;\n}\n\nint InstrEmit_andisx(PPCHIRBuilder& f, const InstrData& i) {\n  // RA <- (RS) & (i32.0 || UI || i16.0)\n  Value* ra =\n      f.And(f.LoadGPR(i.D.RT), f.LoadConstantUint64(XEEXTZ16(i.D.DS) << 16));\n  f.StoreGPR(i.D.RA, ra);\n  f.UpdateCR(0, ra);\n  return 0;\n}\n\nint InstrEmit_cntlzdx(PPCHIRBuilder& f, const InstrData& i) {\n  // n <- 0\n  // do while n < 64\n  //   if (RS)[n] = 1 then leave n\n  //   n <- n + 1\n  // RA <- n\n  Value* v = f.CountLeadingZeros(f.LoadGPR(i.X.RT));\n  v = f.ZeroExtend(v, INT64_TYPE);\n  f.StoreGPR(i.X.RA, v);\n  if (i.X.Rc) {\n    f.UpdateCR(0, v);\n  }\n  return 0;\n}\n\nint InstrEmit_cntlzwx(PPCHIRBuilder& f, const InstrData& i) {\n  // n <- 32\n  // do while n < 64\n  //   if (RS)[n] = 1 then leave n\n  //   n <- n + 1\n  // RA <- n - 32\n  Value* v = f.CountLeadingZeros(f.Truncate(f.LoadGPR(i.X.RT), INT32_TYPE));\n  v = f.ZeroExtend(v, INT64_TYPE);\n  f.StoreGPR(i.X.RA, v);\n  if (i.X.Rc) {\n    f.UpdateCR(0, v);\n  }\n  return 0;\n}\n\nint InstrEmit_eqvx(PPCHIRBuilder& f, const InstrData& i) {\n  // RA <- (RS) == (RB)\n  Value* ra = f.Not(f.Xor(f.LoadGPR(i.X.RT), f.LoadGPR(i.X.RB)));\n  f.StoreGPR(i.X.RA, ra);\n  if (i.X.Rc) {\n    f.UpdateCR(0, ra);\n  }\n  return 0;\n}\n\nint InstrEmit_extsbx(PPCHIRBuilder& f, const InstrData& i) {\n  // s <- (RS)[56]\n  // RA[56:63] <- (RS)[56:63]\n  // RA[0:55] <- i56.s\n  Value* rt = f.LoadGPR(i.X.RT);\n  rt = f.SignExtend(f.Truncate(rt, INT8_TYPE), INT64_TYPE);\n  f.StoreGPR(i.X.RA, rt);\n  if (i.X.Rc) {\n    f.UpdateCR(0, rt);\n  }\n  return 0;\n}\n\nint InstrEmit_extshx(PPCHIRBuilder& f, const InstrData& i) {\n  // s <- (RS)[48]\n  // RA[48:63] <- (RS)[48:63]\n  // RA[0:47] <- 48.s\n  Value* rt = f.LoadGPR(i.X.RT);\n  rt = f.SignExtend(f.Truncate(rt, INT16_TYPE), INT64_TYPE);\n  f.StoreGPR(i.X.RA, rt);\n  if (i.X.Rc) {\n    f.UpdateCR(0, rt);\n  }\n  return 0;\n}\n\nint InstrEmit_extswx(PPCHIRBuilder& f, const InstrData& i) {\n  // s <- (RS)[32]\n  // RA[32:63] <- (RS)[32:63]\n  // RA[0:31] <- i32.s\n  Value* rt = f.LoadGPR(i.X.RT);\n  rt = f.SignExtend(f.Truncate(rt, INT32_TYPE), INT64_TYPE);\n  f.StoreGPR(i.X.RA, rt);\n  if (i.X.Rc) {\n    f.UpdateCR(0, rt);\n  }\n  return 0;\n}\n\nint InstrEmit_nandx(PPCHIRBuilder& f, const InstrData& i) {\n  // RA <- ¬((RS) & (RB))\n  Value* ra = f.Not(f.And(f.LoadGPR(i.X.RT), f.LoadGPR(i.X.RB)));\n  f.StoreGPR(i.X.RA, ra);\n  if (i.X.Rc) {\n    f.UpdateCR(0, ra);\n  }\n  return 0;\n}\n\nint InstrEmit_norx(PPCHIRBuilder& f, const InstrData& i) {\n  // RA <- ¬((RS) | (RB))\n  Value* ra = f.Not(f.Or(f.LoadGPR(i.X.RT), f.LoadGPR(i.X.RB)));\n  f.StoreGPR(i.X.RA, ra);\n  if (i.X.Rc) {\n    f.UpdateCR(0, ra);\n  }\n  return 0;\n}\n\nint InstrEmit_orx(PPCHIRBuilder& f, const InstrData& i) {\n  // RA <- (RS) | (RB)\n  if (i.X.RT == i.X.RB && i.X.RT == i.X.RA && !i.X.Rc) {\n    // Sometimes used as no-op.\n    f.Nop();\n    return 0;\n  }\n  Value* ra;\n  if (i.X.RT == i.X.RB) {\n    ra = f.LoadGPR(i.X.RT);\n  } else {\n    ra = f.Or(f.LoadGPR(i.X.RT), f.LoadGPR(i.X.RB));\n  }\n  f.StoreGPR(i.X.RA, ra);\n  if (i.X.Rc) {\n    f.UpdateCR(0, ra);\n  }\n  return 0;\n}\n\nint InstrEmit_orcx(PPCHIRBuilder& f, const InstrData& i) {\n  // RA <- (RS) | ¬(RB)\n  Value* ra = f.Or(f.LoadGPR(i.X.RT), f.Not(f.LoadGPR(i.X.RB)));\n  f.StoreGPR(i.X.RA, ra);\n  if (i.X.Rc) {\n    f.UpdateCR(0, ra);\n  }\n  return 0;\n}\n\nint InstrEmit_ori(PPCHIRBuilder& f, const InstrData& i) {\n  // RA <- (RS) | (i48.0 || UI)\n  if (!i.D.RA && !i.D.RT && !i.D.DS) {\n    f.Nop();\n    return 0;\n  }\n  Value* ra = f.Or(f.LoadGPR(i.D.RT), f.LoadConstantUint64(XEEXTZ16(i.D.DS)));\n  f.StoreGPR(i.D.RA, ra);\n  return 0;\n}\n\nint InstrEmit_oris(PPCHIRBuilder& f, const InstrData& i) {\n  // RA <- (RS) | (i32.0 || UI || i16.0)\n  Value* ra =\n      f.Or(f.LoadGPR(i.D.RT), f.LoadConstantUint64(XEEXTZ16(i.D.DS) << 16));\n  f.StoreGPR(i.D.RA, ra);\n  return 0;\n}\n\nint InstrEmit_xorx(PPCHIRBuilder& f, const InstrData& i) {\n  // RA <- (RS) XOR (RB)\n  Value* ra = f.Xor(f.LoadGPR(i.X.RT), f.LoadGPR(i.X.RB));\n  f.StoreGPR(i.X.RA, ra);\n  if (i.X.Rc) {\n    f.UpdateCR(0, ra);\n  }\n  return 0;\n}\n\nint InstrEmit_xori(PPCHIRBuilder& f, const InstrData& i) {\n  // RA <- (RS) XOR (i48.0 || UI)\n  Value* ra = f.Xor(f.LoadGPR(i.D.RT), f.LoadConstantUint64(XEEXTZ16(i.D.DS)));\n  f.StoreGPR(i.D.RA, ra);\n  return 0;\n}\n\nint InstrEmit_xoris(PPCHIRBuilder& f, const InstrData& i) {\n  // RA <- (RS) XOR (i32.0 || UI || i16.0)\n  Value* ra =\n      f.Xor(f.LoadGPR(i.D.RT), f.LoadConstantUint64(XEEXTZ16(i.D.DS) << 16));\n  f.StoreGPR(i.D.RA, ra);\n  return 0;\n}\n\n// Integer rotate (A-6)\n\nint InstrEmit_rldclx(PPCHIRBuilder& f, const InstrData& i) {\n  // n <- rB[58:63]\n  // r <- ROTL[64](rS, n)\n  // b <- mb[5] || mb[0:4]\n  // m <- MASK(b, 63)\n  // rA <- r & m\n  Value* n = f.And(f.Truncate(f.LoadGPR(i.MDS.RB), INT8_TYPE),\n                   f.LoadConstantInt8(0x3F));\n\n  uint32_t mb = (i.MDS.MB5 << 5) | i.MDS.MB;\n  uint64_t m = XEMASK(mb, 63);\n  Value* v = f.LoadGPR(i.MDS.RT);\n\n  v = f.RotateLeft(v, n);\n  if (m != 0xFFFFFFFFFFFFFFFF) {\n    v = f.And(v, f.LoadConstantUint64(m));\n  }\n\n  f.StoreGPR(i.MDS.RA, v);\n  if (i.MDS.Rc) {\n    f.UpdateCR(0, v);\n  }\n  return 0;\n}\n\nint InstrEmit_rldcrx(PPCHIRBuilder& f, const InstrData& i) {\n  // n <- rB[58:63]\n  // r <- ROTL[64](rS, n)\n  // b <- mb[5] || mb[0:4]\n  // m <- MASK(0, b)\n  // rA <- r & m\n  Value* n = f.And(f.Truncate(f.LoadGPR(i.MDS.RB), INT8_TYPE),\n                   f.LoadConstantInt8(0x3F));\n\n  uint32_t mb = (i.MDS.MB5 << 5) | i.MDS.MB;\n  uint64_t m = XEMASK(0, mb);\n  Value* v = f.LoadGPR(i.MDS.RT);\n\n  v = f.RotateLeft(v, n);\n  if (m != 0xFFFFFFFFFFFFFFFF) {\n    v = f.And(v, f.LoadConstantUint64(m));\n  }\n\n  f.StoreGPR(i.MDS.RA, v);\n  if (i.MDS.Rc) {\n    f.UpdateCR(0, v);\n  }\n  return 0;\n}\n\nint InstrEmit_rldicx(PPCHIRBuilder& f, const InstrData& i) {\n  XEINSTRNOTIMPLEMENTED();\n  return 1;\n}\n\nint InstrEmit_rldiclx(PPCHIRBuilder& f, const InstrData& i) {\n  // n <- sh[5] || sh[0:4]\n  // r <- ROTL64((RS), n)\n  // b <- mb[5] || mb[0:4]\n  // m <- MASK(b, 63)\n  // RA <- r & m\n  uint32_t sh = (i.MD.SH5 << 5) | i.MD.SH;\n  uint32_t mb = (i.MD.MB5 << 5) | i.MD.MB;\n  uint64_t m = XEMASK(mb, 63);\n  Value* v = f.LoadGPR(i.MD.RT);\n  if (sh == 64 - mb) {\n    // srdi == rldicl ra,rs,64-n,n\n    v = f.Shr(v, int8_t(mb));\n  } else {\n    if (sh) {\n      v = f.RotateLeft(v, f.LoadConstantInt8(sh));\n    }\n    if (m != 0xFFFFFFFFFFFFFFFF) {\n      v = f.And(v, f.LoadConstantUint64(m));\n    }\n  }\n  f.StoreGPR(i.MD.RA, v);\n  if (i.MD.Rc) {\n    f.UpdateCR(0, v);\n  }\n  return 0;\n}\n\nint InstrEmit_rldicrx(PPCHIRBuilder& f, const InstrData& i) {\n  // n <- sh[5] || sh[0:4]\n  // r <- ROTL64((RS), n)\n  // e <- me[5] || me[0:4]\n  // m <- MASK(0, e)\n  // RA <- r & m\n  uint32_t sh = (i.MD.SH5 << 5) | i.MD.SH;\n  uint32_t mb = (i.MD.MB5 << 5) | i.MD.MB;\n  uint64_t m = XEMASK(0, mb);\n  Value* v = f.LoadGPR(i.MD.RT);\n  if (mb == 63 - sh) {\n    // sldi ==  rldicr ra,rs,n,63-n\n    v = f.Shl(v, int8_t(sh));\n  } else {\n    if (sh) {\n      v = f.RotateLeft(v, f.LoadConstantInt8(sh));\n    }\n    if (m != 0xFFFFFFFFFFFFFFFF) {\n      v = f.And(v, f.LoadConstantUint64(m));\n    }\n  }\n  f.StoreGPR(i.MD.RA, v);\n  if (i.MD.Rc) {\n    f.UpdateCR(0, v);\n  }\n  return 0;\n}\n\nint InstrEmit_rldimix(PPCHIRBuilder& f, const InstrData& i) {\n  // n <- sh[5] || sh[0:4]\n  // r <- ROTL64((RS), n)\n  // b <- me[5] || me[0:4]\n  // m <- MASK(b, ¬n)\n  // RA <- (r & m) | ((RA)&¬m)\n  uint32_t sh = (i.MD.SH5 << 5) | i.MD.SH;\n  uint32_t mb = (i.MD.MB5 << 5) | i.MD.MB;\n  uint64_t m = XEMASK(mb, ~sh);\n  Value* v = f.LoadGPR(i.MD.RT);\n  if (sh) {\n    v = f.RotateLeft(v, f.LoadConstantInt8(sh));\n  }\n  if (m != 0xFFFFFFFFFFFFFFFF) {\n    Value* ra = f.LoadGPR(i.MD.RA);\n    v = f.Or(f.And(v, f.LoadConstantUint64(m)),\n             f.And(ra, f.LoadConstantUint64(~m)));\n  }\n  f.StoreGPR(i.MD.RA, v);\n  if (i.MD.Rc) {\n    f.UpdateCR(0, v);\n  }\n  return 0;\n}\n\nint InstrEmit_rlwimix(PPCHIRBuilder& f, const InstrData& i) {\n  // n <- SH\n  // r <- ROTL32((RS)[32:63], n)\n  // m <- MASK(MB+32, ME+32)\n  // RA <- r&m | (RA)&¬m\n  Value* v = f.LoadGPR(i.M.RT);\n  // (x||x)\n  v = f.Or(f.Shl(v, 32), f.ZeroExtend(f.Truncate(v, INT32_TYPE), INT64_TYPE));\n  if (i.M.SH) {\n    v = f.RotateLeft(v, f.LoadConstantInt8(i.M.SH));\n  }\n  // Compiler sometimes masks with 0xFFFFFFFF (identity) - avoid the work here\n  // as our truncation/zero-extend does it for us.\n  uint64_t m = XEMASK(i.M.MB + 32, i.M.ME + 32);\n  if (m != 0xFFFFFFFFFFFFFFFFull) {\n    v = f.And(v, f.LoadConstantUint64(m));\n  }\n  v = f.Or(v, f.And(f.LoadGPR(i.M.RA), f.LoadConstantUint64(~m)));\n  f.StoreGPR(i.M.RA, v);\n  if (i.M.Rc) {\n    f.UpdateCR(0, v);\n  }\n  return 0;\n}\n\nint InstrEmit_rlwinmx(PPCHIRBuilder& f, const InstrData& i) {\n  // n <- SH\n  // r <- ROTL32((RS)[32:63], n)\n  // m <- MASK(MB+32, ME+32)\n  // RA <- r & m\n  Value* v = f.LoadGPR(i.M.RT);\n\n  // (x||x)\n  v = f.Or(f.Shl(v, 32), f.ZeroExtend(f.Truncate(v, INT32_TYPE), INT64_TYPE));\n\n  // TODO(benvanik): optimize srwi\n  // TODO(benvanik): optimize slwi\n  // The compiler will generate a bunch of these for the special case of SH=0.\n  // Which seems to just select some bits and set cr0 for use with a branch.\n  // We can detect this and do less work.\n  if (i.M.SH) {\n    v = f.RotateLeft(v, f.LoadConstantInt8(i.M.SH));\n  }\n  // Compiler sometimes masks with 0xFFFFFFFF (identity) - avoid the work here\n  // as our truncation/zero-extend does it for us.\n  uint64_t m = XEMASK(i.M.MB + 32, i.M.ME + 32);\n  if (m != 0xFFFFFFFFFFFFFFFFull) {\n    v = f.And(v, f.LoadConstantUint64(m));\n  }\n  f.StoreGPR(i.M.RA, v);\n  if (i.M.Rc) {\n    f.UpdateCR(0, v);\n  }\n  return 0;\n}\n\nint InstrEmit_rlwnmx(PPCHIRBuilder& f, const InstrData& i) {\n  // n <- (RB)[59:63]\n  // r <- ROTL32((RS)[32:63], n)\n  // m <- MASK(MB+32, ME+32)\n  // RA <- r & m\n  Value* sh =\n      f.And(f.Truncate(f.LoadGPR(i.M.SH), INT8_TYPE), f.LoadConstantInt8(0x1F));\n  Value* v = f.LoadGPR(i.M.RT);\n  // (x||x)\n  v = f.Or(f.Shl(v, 32), f.ZeroExtend(f.Truncate(v, INT32_TYPE), INT64_TYPE));\n  v = f.RotateLeft(v, sh);\n  v = f.And(v, f.LoadConstantUint64(XEMASK(i.M.MB + 32, i.M.ME + 32)));\n  f.StoreGPR(i.M.RA, v);\n  if (i.M.Rc) {\n    f.UpdateCR(0, v);\n  }\n  return 0;\n}\n\n// Integer shift (A-7)\n\nint InstrEmit_sldx(PPCHIRBuilder& f, const InstrData& i) {\n  // n <- (RB)[58:63]\n  // r <- ROTL64((RS), n)\n  // if (RB)[57] = 0 then\n  //   m <- MASK(0, 63-n)\n  // else\n  //   m <- i64.0\n  // RA <- r & m\n  Value* sh =\n      f.And(f.Truncate(f.LoadGPR(i.X.RB), INT8_TYPE), f.LoadConstantInt8(0x7F));\n  Value* v = f.Select(f.IsTrue(f.Shr(sh, 6)), f.LoadZeroInt64(),\n                      f.Shl(f.LoadGPR(i.X.RT), sh));\n  f.StoreGPR(i.X.RA, v);\n  if (i.X.Rc) {\n    f.UpdateCR(0, v);\n  }\n  return 0;\n}\n\nint InstrEmit_slwx(PPCHIRBuilder& f, const InstrData& i) {\n  // n <- (RB)[59:63]\n  // r <- ROTL32((RS)[32:63], n)\n  // if (RB)[58] = 0 then\n  //   m <- MASK(32, 63-n)\n  // else\n  //   m <- i64.0\n  // RA <- r & m\n  Value* sh =\n      f.And(f.Truncate(f.LoadGPR(i.X.RB), INT8_TYPE), f.LoadConstantInt8(0x3F));\n  Value* v = f.Select(f.IsTrue(f.Shr(sh, 5)), f.LoadZeroInt32(),\n                      f.Shl(f.Truncate(f.LoadGPR(i.X.RT), INT32_TYPE), sh));\n  v = f.ZeroExtend(v, INT64_TYPE);\n  f.StoreGPR(i.X.RA, v);\n  if (i.X.Rc) {\n    f.UpdateCR(0, v);\n  }\n  return 0;\n}\n\nint InstrEmit_srdx(PPCHIRBuilder& f, const InstrData& i) {\n  // n <- (RB)[58:63]\n  // r <- ROTL64((RS), 64-n)\n  // if (RB)[57] = 0 then\n  //   m <- MASK(n, 63)\n  // else\n  //   m <- i64.0\n  // RA <- r & m\n  Value* sh =\n      f.And(f.Truncate(f.LoadGPR(i.X.RB), INT8_TYPE), f.LoadConstantInt8(0x7F));\n  Value* v = f.Select(f.IsTrue(f.And(sh, f.LoadConstantInt8(0x40))),\n                      f.LoadZeroInt64(), f.Shr(f.LoadGPR(i.X.RT), sh));\n  f.StoreGPR(i.X.RA, v);\n  if (i.X.Rc) {\n    f.UpdateCR(0, v);\n  }\n  return 0;\n}\n\nint InstrEmit_srwx(PPCHIRBuilder& f, const InstrData& i) {\n  // n <- (RB)[59:63]\n  // r <- ROTL32((RS)[32:63], 64-n)\n  // if (RB)[58] = 0 then\n  //   m <- MASK(n+32, 63)\n  // else\n  //   m <- i64.0\n  // RA <- r & m\n  Value* sh =\n      f.And(f.Truncate(f.LoadGPR(i.X.RB), INT8_TYPE), f.LoadConstantInt8(0x3F));\n  Value* v =\n      f.Select(f.IsTrue(f.And(sh, f.LoadConstantInt8(0x20))), f.LoadZeroInt32(),\n               f.Shr(f.Truncate(f.LoadGPR(i.X.RT), INT32_TYPE), sh));\n  v = f.ZeroExtend(v, INT64_TYPE);\n  f.StoreGPR(i.X.RA, v);\n  if (i.X.Rc) {\n    f.UpdateCR(0, v);\n  }\n  return 0;\n}\n\nint InstrEmit_sradx(PPCHIRBuilder& f, const InstrData& i) {\n  // n <- rB[58-63]\n  // r <- ROTL[64](rS, 64 - n)\n  // if rB[57] = 0 then m ← MASK(n, 63)\n  // else m ← (64)0\n  // S ← rS[0]\n  // rA <- (r & m) | (((64)S) & ¬ m)\n  // XER[CA] <- S & ((r & ¬ m) ¦ 0)\n  // if n == 0: rA <- rS, XER[CA] = 0\n  // if n >= 64: rA <- 64 sign bits of rS, XER[CA] = sign bit of rS\n  Value* rt = f.LoadGPR(i.X.RT);\n  Value* sh =\n      f.And(f.Truncate(f.LoadGPR(i.X.RB), INT8_TYPE), f.LoadConstantInt8(0x7F));\n  Value* clamp_sh = f.Min(sh, f.LoadConstantInt8(0x3F));\n  Value* v = f.Sha(rt, clamp_sh);\n\n  // CA is set if any bits are shifted out of the right and if the result\n  // is negative.\n  Value* ca =\n      f.And(f.IsTrue(f.Shr(rt, 63)), f.CompareNE(f.Shl(v, clamp_sh), rt));\n  f.StoreCA(ca);\n\n  f.StoreGPR(i.X.RA, v);\n  if (i.X.Rc) {\n    f.UpdateCR(0, v);\n  }\n  return 0;\n}\n\nint InstrEmit_sradix(PPCHIRBuilder& f, const InstrData& i) {\n  // n <- sh[5] || sh[0-4]\n  // r <- ROTL[64](rS, 64 - n)\n  // m ← MASK(n, 63)\n  // S ← rS[0]\n  // rA <- (r & m) | (((64)S) & ¬ m)\n  // XER[CA] <- S & ((r & ¬ m) ¦ 0)\n  // if n == 0: rA <- rS, XER[CA] = 0\n  // if n >= 64: rA <- 64 sign bits of rS, XER[CA] = sign bit of rS\n  Value* v = f.LoadGPR(i.XS.RT);\n  int8_t sh = (i.XS.SH5 << 5) | i.XS.SH;\n\n  // CA is set if any bits are shifted out of the right and if the result\n  // is negative.\n  if (sh) {\n    uint64_t mask = XEMASK(64 - sh, 63);\n    Value* ca = f.And(f.Truncate(f.Shr(v, 63), INT8_TYPE),\n                      f.IsTrue(f.And(v, f.LoadConstantUint64(mask))));\n    f.StoreCA(ca);\n\n    v = f.Sha(v, sh);\n  } else {\n    f.StoreCA(f.LoadZeroInt8());\n  }\n\n  f.StoreGPR(i.XS.RA, v);\n  if (i.XS.Rc) {\n    f.UpdateCR(0, v);\n  }\n  return 0;\n}\n\nint InstrEmit_srawx(PPCHIRBuilder& f, const InstrData& i) {\n  // n <- rB[59-63]\n  // r <- ROTL32((RS)[32:63], 64-n)\n  // m <- MASK(n+32, 63)\n  // s <- (RS)[32]\n  // RA <- r&m | (i64.s)&¬m\n  // CA <- s & ((r&¬m)[32:63]≠0)\n  // if n == 0: rA <- sign_extend(rS), XER[CA] = 0\n  // if n >= 32: rA <- 64 sign bits of rS, XER[CA] = sign bit of lo_32(rS)\n  Value* rt = f.Truncate(f.LoadGPR(i.X.RT), INT32_TYPE);\n  Value* sh =\n      f.And(f.Truncate(f.LoadGPR(i.X.RB), INT8_TYPE), f.LoadConstantInt8(0x3F));\n  Value* clamp_sh = f.Min(sh, f.LoadConstantInt8(0x1F));\n  Value* v = f.Sha(rt, f.Min(sh, clamp_sh));\n\n  // CA is set if any bits are shifted out of the right and if the result\n  // is negative.\n  Value* ca =\n      f.And(f.IsTrue(f.Shr(rt, 31)), f.CompareNE(f.Shl(v, clamp_sh), rt));\n  f.StoreCA(ca);\n\n  v = f.SignExtend(v, INT64_TYPE);\n  f.StoreGPR(i.X.RA, v);\n  if (i.X.Rc) {\n    f.UpdateCR(0, v);\n  }\n  return 0;\n}\n\nint InstrEmit_srawix(PPCHIRBuilder& f, const InstrData& i) {\n  // n <- SH\n  // r <- ROTL32((RS)[32:63], 64-n)\n  // m <- MASK(n+32, 63)\n  // s <- (RS)[32]\n  // RA <- r&m | (i64.s)&¬m\n  // CA <- s & ((r&¬m)[32:63]≠0)\n  // if n == 0: rA <- sign_extend(rS), XER[CA] = 0\n  // if n >= 32: rA <- 64 sign bits of rS, XER[CA] = sign bit of lo_32(rS)\n  Value* v = f.Truncate(f.LoadGPR(i.X.RT), INT32_TYPE);\n  Value* ca;\n  if (!i.X.RB) {\n    // No shift, just a fancy sign extend and CA clearer.\n    v = f.SignExtend(v, INT64_TYPE);\n    ca = f.LoadZeroInt8();\n  } else {\n    // CA is set if any bits are shifted out of the right and if the result\n    // is negative.\n    uint32_t mask = (uint32_t)XEMASK(64 - i.X.RB, 63);\n    ca = f.And(f.Truncate(f.Shr(v, 31), INT8_TYPE),\n               f.IsTrue(f.And(v, f.LoadConstantUint32(mask))));\n\n    v = f.Sha(v, (int8_t)i.X.RB), v = f.SignExtend(v, INT64_TYPE);\n  }\n  f.StoreCA(ca);\n  f.StoreGPR(i.X.RA, v);\n  if (i.X.Rc) {\n    f.UpdateCR(0, v);\n  }\n  return 0;\n}\n\nvoid RegisterEmitCategoryALU() {\n  XEREGISTERINSTR(addx);\n  XEREGISTERINSTR(addcx);\n  XEREGISTERINSTR(addex);\n  XEREGISTERINSTR(addi);\n  XEREGISTERINSTR(addic);\n  XEREGISTERINSTR(addicx);\n  XEREGISTERINSTR(addis);\n  XEREGISTERINSTR(addmex);\n  XEREGISTERINSTR(addzex);\n  XEREGISTERINSTR(divdx);\n  XEREGISTERINSTR(divdux);\n  XEREGISTERINSTR(divwx);\n  XEREGISTERINSTR(divwux);\n  XEREGISTERINSTR(mulhdx);\n  XEREGISTERINSTR(mulhdux);\n  XEREGISTERINSTR(mulhwx);\n  XEREGISTERINSTR(mulhwux);\n  XEREGISTERINSTR(mulldx);\n  XEREGISTERINSTR(mulli);\n  XEREGISTERINSTR(mullwx);\n  XEREGISTERINSTR(negx);\n  XEREGISTERINSTR(subfx);\n  XEREGISTERINSTR(subfcx);\n  XEREGISTERINSTR(subficx);\n  XEREGISTERINSTR(subfex);\n  XEREGISTERINSTR(subfmex);\n  XEREGISTERINSTR(subfzex);\n  XEREGISTERINSTR(cmp);\n  XEREGISTERINSTR(cmpi);\n  XEREGISTERINSTR(cmpl);\n  XEREGISTERINSTR(cmpli);\n  XEREGISTERINSTR(andx);\n  XEREGISTERINSTR(andcx);\n  XEREGISTERINSTR(andix);\n  XEREGISTERINSTR(andisx);\n  XEREGISTERINSTR(cntlzdx);\n  XEREGISTERINSTR(cntlzwx);\n  XEREGISTERINSTR(eqvx);\n  XEREGISTERINSTR(extsbx);\n  XEREGISTERINSTR(extshx);\n  XEREGISTERINSTR(extswx);\n  XEREGISTERINSTR(nandx);\n  XEREGISTERINSTR(norx);\n  XEREGISTERINSTR(orx);\n  XEREGISTERINSTR(orcx);\n  XEREGISTERINSTR(ori);\n  XEREGISTERINSTR(oris);\n  XEREGISTERINSTR(xorx);\n  XEREGISTERINSTR(xori);\n  XEREGISTERINSTR(xoris);\n  XEREGISTERINSTR(rldclx);\n  XEREGISTERINSTR(rldcrx);\n  XEREGISTERINSTR(rldicx);\n  XEREGISTERINSTR(rldiclx);\n  XEREGISTERINSTR(rldicrx);\n  XEREGISTERINSTR(rldimix);\n  XEREGISTERINSTR(rlwimix);\n  XEREGISTERINSTR(rlwinmx);\n  XEREGISTERINSTR(rlwnmx);\n  XEREGISTERINSTR(sldx);\n  XEREGISTERINSTR(slwx);\n  XEREGISTERINSTR(srdx);\n  XEREGISTERINSTR(srwx);\n  XEREGISTERINSTR(sradx);\n  XEREGISTERINSTR(sradix);\n  XEREGISTERINSTR(srawx);\n  XEREGISTERINSTR(srawix);\n}\n\n}  // namespace ppc\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/ppc/ppc_emit_control.cc",
    "content": "/*\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/ppc/ppc_emit-private.h\"\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/cpu/cpu_flags.h\"\n#include \"xenia/cpu/ppc/ppc_context.h\"\n#include \"xenia/cpu/ppc/ppc_frontend.h\"\n#include \"xenia/cpu/ppc/ppc_hir_builder.h\"\n\n#include <stddef.h>\n\nnamespace xe {\nnamespace cpu {\nnamespace ppc {\n\n// TODO(benvanik): remove when enums redefined.\nusing namespace xe::cpu::hir;\n\nusing xe::cpu::hir::Label;\nusing xe::cpu::hir::Value;\n\nint InstrEmit_branch(PPCHIRBuilder& f, const char* src, uint64_t cia,\n                     Value* nia, bool lk, Value* cond = NULL,\n                     bool expect_true = true, bool nia_is_lr = false) {\n  uint32_t call_flags = 0;\n\n  // TODO(benvanik): this may be wrong and overwrite LRs when not desired!\n  // The docs say always, though...\n  // Note that we do the update before we branch/call as we need it to\n  // be correct for returns.\n  if (lk) {\n    Value* return_address = f.LoadConstantUint64(cia + 4);\n    f.SetReturnAddress(return_address);\n    f.StoreLR(return_address);\n  }\n\n  if (!lk) {\n    // If LR is not set this call will never return here.\n    call_flags |= CALL_TAIL;\n  }\n\n  // TODO(benvanik): set CALL_TAIL if !lk and the last block in the fn.\n  //                 This is almost always a jump to restore gpr.\n\n  if (nia->IsConstant()) {\n    // Direct branch to address.\n    // If it's a block inside of ourself, setup a fast jump.\n    // Unless it's to ourselves directly, in which case it's\n    // recursion.\n    uint32_t nia_value = nia->AsUint64() & 0xFFFFFFFF;\n    bool is_recursion = false;\n    if (nia_value == f.function()->address() && lk) {\n      is_recursion = true;\n    }\n    Label* label = is_recursion ? NULL : f.LookupLabel(nia_value);\n    if (label) {\n      // Branch to label.\n      uint32_t branch_flags = 0;\n      if (cond) {\n        if (expect_true) {\n          f.BranchTrue(cond, label, branch_flags);\n        } else {\n          f.BranchFalse(cond, label, branch_flags);\n        }\n      } else {\n        f.Branch(label, branch_flags);\n      }\n    } else {\n      // Call function.\n      auto function = f.LookupFunction(nia_value);\n      if (cond) {\n        if (!expect_true) {\n          cond = f.IsFalse(cond);\n        }\n        f.CallTrue(cond, function, call_flags);\n      } else {\n        f.Call(function, call_flags);\n      }\n    }\n  } else {\n// Indirect branch to pointer.\n\n// TODO(benvanik): runtime recursion detection?\n\n// TODO(benvanik): run a DFA pass to see if we can detect whether this is\n//     a normal function return that is pulling the LR from the stack that\n//     it set in the prolog. If so, we can omit the dynamic check!\n\n//// Dynamic test when branching to LR, which is usually used for the return.\n//// We only do this if LK=0 as returns wouldn't set LR.\n//// Ideally it's a return and we can just do a simple ret and be done.\n//// If it's not, we fall through to the full indirection logic.\n// if (!lk && reg == kXEPPCRegLR) {\n//  // The return block will spill registers for us.\n//  // TODO(benvanik): 'lr_mismatch' debug info.\n//  // Note: we need to test on *only* the 32-bit target, as the target ptr may\n//  //     have garbage in the upper 32 bits.\n//  c.cmp(target.r32(), c.getGpArg(1).r32());\n//  // TODO(benvanik): evaluate hint here.\n//  c.je(e.GetReturnLabel(), kCondHintLikely);\n//}\n#if 0\n    // This breaks longjump, as that uses blr with a non-return lr.\n    // It'd be nice to move SET_RETURN_ADDRESS semantics up into context\n    // so that we can just use this.\n    if (!lk && nia_is_lr) {\n      // Return (most likely).\n      // TODO(benvanik): test? ReturnCheck()?\n      if (cond) {\n        if (!expect_true) {\n          cond = f.IsFalse(cond);\n        }\n        f.ReturnTrue(cond);\n      } else {\n        f.Return();\n      }\n    } else {\n#else\n    {\n#endif\n    // Jump to pointer.\n    bool likely_return = !lk && nia_is_lr;\n    if (likely_return) {\n      call_flags |= CALL_POSSIBLE_RETURN;\n    }\n    if (cond) {\n      if (!expect_true) {\n        cond = f.IsFalse(cond);\n      }\n      f.CallIndirectTrue(cond, nia, call_flags);\n    } else {\n      f.CallIndirect(nia, call_flags);\n    }\n  }\n}\n\nreturn 0;\n}  // namespace ppc\n\nint InstrEmit_bx(PPCHIRBuilder& f, const InstrData& i) {\n  // if AA then\n  //   NIA <- EXTS(LI || 0b00)\n  // else\n  //   NIA <- CIA + EXTS(LI || 0b00)\n  // if LK then\n  //   LR <- CIA + 4\n\n  uint32_t nia;\n  if (i.I.AA) {\n    nia = (uint32_t)XEEXTS26(i.I.LI << 2);\n  } else {\n    nia = (uint32_t)(i.address + XEEXTS26(i.I.LI << 2));\n  }\n\n  return InstrEmit_branch(f, \"bx\", i.address, f.LoadConstantUint32(nia),\n                          i.I.LK);\n}\n\nint InstrEmit_bcx(PPCHIRBuilder& f, const InstrData& i) {\n  // if ¬BO[2] then\n  //   CTR <- CTR - 1\n  // ctr_ok <- BO[2] | ((CTR[0:63] != 0) XOR BO[3])\n  // cond_ok <- BO[0] | (CR[BI+32] ≡ BO[1])\n  // if ctr_ok & cond_ok then\n  //   if AA then\n  //     NIA <- EXTS(BD || 0b00)\n  //   else\n  //     NIA <- CIA + EXTS(BD || 0b00)\n  // if LK then\n  //   LR <- CIA + 4\n\n  // NOTE: the condition bits are reversed!\n  // 01234 (docs)\n  // 43210 (real)\n\n  Value* ctr_ok = NULL;\n  if (select_bits(i.B.BO, 2, 2)) {\n    // Ignore ctr.\n  } else {\n    // Decrement counter.\n    Value* ctr = f.LoadCTR();\n    ctr = f.Sub(ctr, f.LoadConstantUint64(1));\n    f.StoreCTR(ctr);\n    // Ctr check.\n    ctr = f.Truncate(ctr, INT32_TYPE);\n    // TODO(benvanik): could do something similar to cond and avoid the\n    // is_true/branch_true pairing.\n    if (select_bits(i.B.BO, 1, 1)) {\n      ctr_ok = f.IsFalse(ctr);\n    } else {\n      ctr_ok = f.IsTrue(ctr);\n    }\n  }\n\n  Value* cond_ok = NULL;\n  bool not_cond_ok = false;\n  if (select_bits(i.B.BO, 4, 4)) {\n    // Ignore cond.\n  } else {\n    Value* cr = f.LoadCRField(i.B.BI >> 2, i.B.BI & 3);\n    cond_ok = cr;\n    if (select_bits(i.B.BO, 3, 3)) {\n      // Expect true.\n      not_cond_ok = false;\n    } else {\n      // Expect false.\n      not_cond_ok = true;\n    }\n  }\n\n  // We do a bit of optimization here to make the llvm assembly easier to read.\n  Value* ok = NULL;\n  bool expect_true = true;\n  if (ctr_ok && cond_ok) {\n    if (not_cond_ok) {\n      cond_ok = f.IsFalse(cond_ok);\n    }\n    ok = f.And(ctr_ok, cond_ok);\n  } else if (ctr_ok) {\n    ok = ctr_ok;\n  } else if (cond_ok) {\n    ok = cond_ok;\n    expect_true = !not_cond_ok;\n  }\n\n  uint32_t nia;\n  if (i.B.AA) {\n    nia = (uint32_t)XEEXTS16(i.B.BD << 2);\n  } else {\n    nia = (uint32_t)(i.address + XEEXTS16(i.B.BD << 2));\n  }\n  return InstrEmit_branch(f, \"bcx\", i.address, f.LoadConstantUint32(nia),\n                          i.B.LK, ok, expect_true);\n}\n\nint InstrEmit_bcctrx(PPCHIRBuilder& f, const InstrData& i) {\n  // cond_ok <- BO[0] | (CR[BI+32] ≡ BO[1])\n  // if cond_ok then\n  //   NIA <- CTR[0:61] || 0b00\n  // if LK then\n  //   LR <- CIA + 4\n\n  // NOTE: the condition bits are reversed!\n  // 01234 (docs)\n  // 43210 (real)\n\n  Value* cond_ok = NULL;\n  bool not_cond_ok = false;\n  if (select_bits(i.XL.BO, 4, 4)) {\n    // Ignore cond.\n  } else {\n    Value* cr = f.LoadCRField(i.XL.BI >> 2, i.XL.BI & 3);\n    cond_ok = cr;\n    if (select_bits(i.XL.BO, 3, 3)) {\n      // Expect true.\n      not_cond_ok = false;\n    } else {\n      // Expect false.\n      not_cond_ok = true;\n    }\n  }\n\n  bool expect_true = !not_cond_ok;\n  return InstrEmit_branch(f, \"bcctrx\", i.address, f.LoadCTR(), i.XL.LK, cond_ok,\n                          expect_true);\n}\n\nint InstrEmit_bclrx(PPCHIRBuilder& f, const InstrData& i) {\n  // if ¬BO[2] then\n  //   CTR <- CTR - 1\n  // ctr_ok <- BO[2] | ((CTR[0:63] != 0) XOR BO[3]\n  // cond_ok <- BO[0] | (CR[BI+32] ≡ BO[1])\n  // if ctr_ok & cond_ok then\n  //   NIA <- LR[0:61] || 0b00\n  // if LK then\n  //   LR <- CIA + 4\n\n  // NOTE: the condition bits are reversed!\n  // 01234 (docs)\n  // 43210 (real)\n\n  Value* ctr_ok = NULL;\n  if (select_bits(i.XL.BO, 2, 2)) {\n    // Ignore ctr.\n  } else {\n    // Decrement counter.\n    Value* ctr = f.LoadCTR();\n    ctr = f.Sub(ctr, f.LoadConstantUint64(1));\n    f.StoreCTR(ctr);\n    // Ctr check.\n    ctr = f.Truncate(ctr, INT32_TYPE);\n    // TODO(benvanik): could do something similar to cond and avoid the\n    // is_true/branch_true pairing.\n    if (select_bits(i.XL.BO, 1, 1)) {\n      ctr_ok = f.IsFalse(ctr);\n    } else {\n      ctr_ok = f.IsTrue(ctr);\n    }\n  }\n\n  Value* cond_ok = NULL;\n  bool not_cond_ok = false;\n  if (select_bits(i.XL.BO, 4, 4)) {\n    // Ignore cond.\n  } else {\n    Value* cr = f.LoadCRField(i.XL.BI >> 2, i.XL.BI & 3);\n    cond_ok = cr;\n    if (select_bits(i.XL.BO, 3, 3)) {\n      // Expect true.\n      not_cond_ok = false;\n    } else {\n      // Expect false.\n      not_cond_ok = true;\n    }\n  }\n\n  // We do a bit of optimization here to make the llvm assembly easier to read.\n  Value* ok = NULL;\n  bool expect_true = true;\n  if (ctr_ok && cond_ok) {\n    if (not_cond_ok) {\n      cond_ok = f.IsFalse(cond_ok);\n    }\n    ok = f.And(ctr_ok, cond_ok);\n  } else if (ctr_ok) {\n    ok = ctr_ok;\n  } else if (cond_ok) {\n    ok = cond_ok;\n    expect_true = !not_cond_ok;\n  }\n\n  return InstrEmit_branch(f, \"bclrx\", i.address, f.LoadLR(), i.XL.LK, ok,\n                          expect_true, true);\n}\n\n// Condition register logical (A-23)\n\nint InstrEmit_crand(PPCHIRBuilder& f, const InstrData& i) {\n  // CR[bt] <- CR[ba] & CR[bb]   bt=bo, ba=bi, bb=bb\n  Value* ba = f.LoadCRField(i.XL.BI >> 2, i.XL.BI & 3);\n  Value* bb = f.LoadCRField(i.XL.BB >> 2, i.XL.BB & 3);\n  Value* bt = f.And(ba, bb);\n  f.StoreCRField(i.XL.BO >> 2, i.XL.BO & 3, bt);\n  return 0;\n}\n\nint InstrEmit_crandc(PPCHIRBuilder& f, const InstrData& i) {\n  // CR[bt] <- CR[ba] & ¬CR[bb]   bt=bo, ba=bi, bb=bb\n  Value* ba = f.LoadCRField(i.XL.BI >> 2, i.XL.BI & 3);\n  Value* bb = f.LoadCRField(i.XL.BB >> 2, i.XL.BB & 3);\n  Value* bt = f.And(ba, f.And(f.Not(bb), f.LoadConstantInt8(0x01)));\n  f.StoreCRField(i.XL.BO >> 2, i.XL.BO & 3, bt);\n  return 0;\n}\n\nint InstrEmit_creqv(PPCHIRBuilder& f, const InstrData& i) {\n  // CR[bt] <- CR[ba] == CR[bb]   bt=bo, ba=bi, bb=bb\n  Value* ba = f.LoadCRField(i.XL.BI >> 2, i.XL.BI & 3);\n  Value* bb = f.LoadCRField(i.XL.BB >> 2, i.XL.BB & 3);\n  Value* bt = f.CompareEQ(ba, bb);\n  f.StoreCRField(i.XL.BO >> 2, i.XL.BO & 3, bt);\n  return 0;\n}\n\nint InstrEmit_crnand(PPCHIRBuilder& f, const InstrData& i) {\n  // CR[bt] <- ¬(CR[ba] & CR[bb])   bt=bo, ba=bi, bb=bb\n  Value* ba = f.LoadCRField(i.XL.BI >> 2, i.XL.BI & 3);\n  Value* bb = f.LoadCRField(i.XL.BB >> 2, i.XL.BB & 3);\n  Value* bt = f.And(f.Not(f.And(ba, bb)), f.LoadConstantInt8(0x01));\n  f.StoreCRField(i.XL.BO >> 2, i.XL.BO & 3, bt);\n  return 0;\n}\n\nint InstrEmit_crnor(PPCHIRBuilder& f, const InstrData& i) {\n  // CR[bt] <- ¬(CR[ba] | CR[bb])   bt=bo, ba=bi, bb=bb\n  Value* ba = f.LoadCRField(i.XL.BI >> 2, i.XL.BI & 3);\n  Value* bb = f.LoadCRField(i.XL.BB >> 2, i.XL.BB & 3);\n  Value* bt = f.And(f.Not(f.Or(ba, bb)), f.LoadConstantInt8(0x01));\n  f.StoreCRField(i.XL.BO >> 2, i.XL.BO & 3, bt);\n  return 0;\n}\n\nint InstrEmit_cror(PPCHIRBuilder& f, const InstrData& i) {\n  // CR[bt] <- CR[ba] | CR[bb]   bt=bo, ba=bi, bb=bb\n  Value* ba = f.LoadCRField(i.XL.BI >> 2, i.XL.BI & 3);\n  Value* bb = f.LoadCRField(i.XL.BB >> 2, i.XL.BB & 3);\n  Value* bt = f.Or(ba, bb);\n  f.StoreCRField(i.XL.BO >> 2, i.XL.BO & 3, bt);\n  return 0;\n}\n\nint InstrEmit_crorc(PPCHIRBuilder& f, const InstrData& i) {\n  // CR[bt] <- CR[ba] | ¬CR[bb]   bt=bo, ba=bi, bb=bb\n  Value* ba = f.LoadCRField(i.XL.BI >> 2, i.XL.BI & 3);\n  Value* bb = f.LoadCRField(i.XL.BB >> 2, i.XL.BB & 3);\n  Value* bt = f.Or(ba, f.And(f.Not(bb), f.LoadConstantInt8(0x01)));\n  f.StoreCRField(i.XL.BO >> 2, i.XL.BO & 3, bt);\n  return 0;\n}\n\nint InstrEmit_crxor(PPCHIRBuilder& f, const InstrData& i) {\n  // CR[bt] <- CR[ba] xor CR[bb]   bt=bo, ba=bi, bb=bb\n  Value* ba = f.LoadCRField(i.XL.BI >> 2, i.XL.BI & 3);\n  Value* bb = f.LoadCRField(i.XL.BB >> 2, i.XL.BB & 3);\n  Value* bt = f.Xor(ba, bb);\n  f.StoreCRField(i.XL.BO >> 2, i.XL.BO & 3, bt);\n  return 0;\n}\n\nint InstrEmit_mcrf(PPCHIRBuilder& f, const InstrData& i) {\n  XEINSTRNOTIMPLEMENTED();\n  return 1;\n}\n\n// System linkage (A-24)\n\nint InstrEmit_sc(PPCHIRBuilder& f, const InstrData& i) {\n  // Game code should only ever use LEV=0.\n  // LEV=2 is to signify 'call import' from Xenia.\n  // TODO(gibbed): syscalls!\n  if (i.SC.LEV == 0) {\n    f.CallExtern(f.builtins()->syscall_handler);\n    return 0;\n  }\n  if (i.SC.LEV == 2) {\n    f.CallExtern(f.function());\n    return 0;\n  }\n  XEINSTRNOTIMPLEMENTED();\n  return 1;\n}\n\n// Trap (A-25)\n\nint InstrEmit_trap(PPCHIRBuilder& f, const InstrData& i, Value* va, Value* vb,\n                   uint32_t TO) {\n  // if (a < b) & TO[0] then TRAP\n  // if (a > b) & TO[1] then TRAP\n  // if (a = b) & TO[2] then TRAP\n  // if (a <u b) & TO[3] then TRAP\n  // if (a >u b) & TO[4] then TRAP\n  // Bits swapped:\n  // 01234\n  // 43210\n  if (!TO) {\n    return 0;\n  }\n  Value* v = nullptr;\n  if (TO & (1 << 4)) {\n    // a < b\n    auto cmp = f.CompareSLT(va, vb);\n    v = v ? f.Or(v, cmp) : cmp;\n  }\n  if (TO & (1 << 3)) {\n    // a > b\n    auto cmp = f.CompareSGT(va, vb);\n    v = v ? f.Or(v, cmp) : cmp;\n  }\n  if (TO & (1 << 2)) {\n    // a = b\n    auto cmp = f.CompareEQ(va, vb);\n    v = v ? f.Or(v, cmp) : cmp;\n  }\n  if (TO & (1 << 1)) {\n    // a <u b\n    auto cmp = f.CompareULT(va, vb);\n    v = v ? f.Or(v, cmp) : cmp;\n  }\n  if (TO & (1 << 0)) {\n    // a >u b\n    auto cmp = f.CompareUGT(va, vb);\n    v = v ? f.Or(v, cmp) : cmp;\n  }\n  if (v) {\n    f.TrapTrue(v);\n  }\n  return 0;\n}\n\nint InstrEmit_td(PPCHIRBuilder& f, const InstrData& i) {\n  // a <- (RA)\n  // b <- (RB)\n  // if (a < b) & TO[0] then TRAP\n  // if (a > b) & TO[1] then TRAP\n  // if (a = b) & TO[2] then TRAP\n  // if (a <u b) & TO[3] then TRAP\n  // if (a >u b) & TO[4] then TRAP\n  Value* ra = f.LoadGPR(i.X.RA);\n  Value* rb = f.LoadGPR(i.X.RB);\n  return InstrEmit_trap(f, i, ra, rb, i.X.RT);\n}\n\nint InstrEmit_tdi(PPCHIRBuilder& f, const InstrData& i) {\n  // a <- (RA)\n  // if (a < EXTS(SI)) & TO[0] then TRAP\n  // if (a > EXTS(SI)) & TO[1] then TRAP\n  // if (a = EXTS(SI)) & TO[2] then TRAP\n  // if (a <u EXTS(SI)) & TO[3] then TRAP\n  // if (a >u EXTS(SI)) & TO[4] then TRAP\n  Value* ra = f.LoadGPR(i.D.RA);\n  Value* rb = f.LoadConstantInt64(XEEXTS16(i.D.DS));\n  return InstrEmit_trap(f, i, ra, rb, i.D.RT);\n}\n\nint InstrEmit_tw(PPCHIRBuilder& f, const InstrData& i) {\n  // a <- EXTS((RA)[32:63])\n  // b <- EXTS((RB)[32:63])\n  // if (a < b) & TO[0] then TRAP\n  // if (a > b) & TO[1] then TRAP\n  // if (a = b) & TO[2] then TRAP\n  // if (a <u b) & TO[3] then TRAP\n  // if (a >u b) & TO[4] then TRAP\n  Value* ra =\n      f.SignExtend(f.Truncate(f.LoadGPR(i.X.RA), INT32_TYPE), INT64_TYPE);\n  Value* rb =\n      f.SignExtend(f.Truncate(f.LoadGPR(i.X.RB), INT32_TYPE), INT64_TYPE);\n  return InstrEmit_trap(f, i, ra, rb, i.X.RT);\n}\n\nint InstrEmit_twi(PPCHIRBuilder& f, const InstrData& i) {\n  // a <- EXTS((RA)[32:63])\n  // if (a < EXTS(SI)) & TO[0] then TRAP\n  // if (a > EXTS(SI)) & TO[1] then TRAP\n  // if (a = EXTS(SI)) & TO[2] then TRAP\n  // if (a <u EXTS(SI)) & TO[3] then TRAP\n  // if (a >u EXTS(SI)) & TO[4] then TRAP\n  if (i.D.RA == 0 && i.D.RT == 0x1F) {\n    // This is a special trap. Probably.\n    uint16_t type = (uint16_t)XEEXTS16(i.D.DS);\n    f.Trap(type);\n    return 0;\n  }\n  Value* ra =\n      f.SignExtend(f.Truncate(f.LoadGPR(i.D.RA), INT32_TYPE), INT64_TYPE);\n  Value* rb = f.LoadConstantInt64(XEEXTS16(i.D.DS));\n  return InstrEmit_trap(f, i, ra, rb, i.D.RT);\n}\n\n// Processor control (A-26)\n\nint InstrEmit_mfcr(PPCHIRBuilder& f, const InstrData& i) {\n  // mfocrf RT,FXM\n  // RT <- undefined\n  // count <- 0\n  // do i = 0 to 7\n  // if FXMi = 1 then\n  //   n <- i\n  //   count <- count + 1\n  // if count = 1 then\n  //   RT4un + 32:4un + 35 <- CR4un + 32 : 4un + 35\n\n  // TODO(benvanik): optimize mfcr sequences.\n  // Often look something like this:\n  //   mfocrf  r11, cr6\n  //   not r10, r11\n  //   extrwi    r3, r10, 1, 26\n  // Could recognize this and only load the appropriate CR bit.\n\n  Value* v;\n  if (i.XFX.spr & (1 << 9)) {\n    uint32_t bits = (i.XFX.spr & 0x1FF) >> 1;\n    int count = 0;\n    int cri = 0;\n    for (int b = 0; b <= 7; ++b) {\n      if (bits & (1 << b)) {\n        cri = 7 - b;\n        ++count;\n      }\n    }\n    if (count == 1) {\n      v = f.LoadCR(cri);\n    } else {\n      v = f.LoadZeroInt64();\n    }\n  } else {\n    v = f.LoadCR();\n  }\n  f.StoreGPR(i.XFX.RT, v);\n  return 0;\n}\n\nint InstrEmit_mfspr(PPCHIRBuilder& f, const InstrData& i) {\n  // n <- spr[5:9] || spr[0:4]\n  // if length(SPR(n)) = 64 then\n  //   RT <- SPR(n)\n  // else\n  //   RT <- i32.0 || SPR(n)\n  Value* v;\n  const uint32_t n = ((i.XFX.spr & 0x1F) << 5) | ((i.XFX.spr >> 5) & 0x1F);\n  switch (n) {\n    case 1:\n      // XER\n      v = f.LoadXER();\n      break;\n    case 8:\n      // LR\n      v = f.LoadLR();\n      break;\n    case 9:\n      // CTR\n      v = f.LoadCTR();\n      break;\n    case 256:\n      // VRSAVE\n      v = f.LoadZeroInt64();\n      break;\n    case 268:\n      // TB\n      v = f.LoadClock();\n      break;\n    case 269:\n      // TBU\n      v = f.Shr(f.LoadClock(), 32);\n      break;\n    case 287:\n      // [ Processor Version Register (PVR) ]\n      // PVR is a 32 bit, read-only register within the supervisor level.\n      // Bits 0 to 15 are the version number.\n      // Bits 16 to 31 are the revision number.\n      // Known Values: 0x710600?, 0x710700, 0x710800 (Corona?);\n      // Note: Some XEXs (such as mfgbootlauncher.xex) may check for a value\n      // that's less than 0x710700.\n      v = f.LoadConstantUint64(cvars::pvr);\n      break;\n    default:\n      XEINSTRNOTIMPLEMENTED();\n      return 1;\n  }\n  f.StoreGPR(i.XFX.RT, v);\n  return 0;\n}\n\nint InstrEmit_mftb(PPCHIRBuilder& f, const InstrData& i) {\n  Value* time = f.LoadClock();\n  const uint32_t n = ((i.XFX.spr & 0x1F) << 5) | ((i.XFX.spr >> 5) & 0x1F);\n  if (n == 268) {\n    // TB - full bits.\n  } else {\n    // TBU - upper bits only.\n    time = f.Shr(time, 32);\n  }\n  f.StoreGPR(i.XFX.RT, time);\n  return 0;\n}\n\nint InstrEmit_mtcrf(PPCHIRBuilder& f, const InstrData& i) {\n  // mtocrf FXM,RS\n  // count <- 0\n  // do i = 0 to 7\n  //   if FXMi = 1 then\n  //     n <- i\n  //     count <- count + 1\n  // if count = 1 then\n  //   CR4un + 32 : 4un + 35 <- RS4un + 32:4un + 35\n\n  Value* v = f.LoadGPR(i.XFX.RT);\n  if (i.XFX.spr & (1 << 9)) {\n    uint32_t bits = (i.XFX.spr & 0x1FF) >> 1;\n    int count = 0;\n    int cri = 0;\n    for (int b = 0; b <= 7; ++b) {\n      if (bits & (1 << b)) {\n        cri = 7 - b;\n        ++count;\n      }\n    }\n    if (count == 1) {\n      f.StoreCR(cri, v);\n    } else {\n      // Invalid; store zero to CR.\n      f.StoreCR(f.LoadZeroInt64());\n    }\n  } else {\n    uint32_t bits = (i.XFX.spr & 0x1FF) >> 1;\n    for (int b = 0; b <= 7; ++b) {\n      if (bits & (1 << b)) {\n        int cri = 7 - b;\n        f.StoreCR(cri, v);\n      }\n    }\n  }\n  return 0;\n}\n\nint InstrEmit_mtspr(PPCHIRBuilder& f, const InstrData& i) {\n  // n <- spr[5:9] || spr[0:4]\n  // if length(SPR(n)) = 64 then\n  //   SPR(n) <- (RS)\n  // else\n  //   SPR(n) <- (RS)[32:63]\n\n  Value* rt = f.LoadGPR(i.XFX.RT);\n\n  const uint32_t n = ((i.XFX.spr & 0x1F) << 5) | ((i.XFX.spr >> 5) & 0x1F);\n  switch (n) {\n    case 1:\n      // XER\n      f.StoreXER(rt);\n      break;\n    case 8:\n      // LR\n      f.StoreLR(rt);\n      break;\n    case 9:\n      // CTR\n      f.StoreCTR(rt);\n      break;\n    case 256:\n      // VRSAVE\n      break;\n    default:\n      XEINSTRNOTIMPLEMENTED();\n      return 1;\n  }\n\n  return 0;\n}\n\n// MSR is used for toggling interrupts (among other things).\n// We track it here for taking a global processor lock, as lots of lockfree\n// code requires it. Sequences of mtmsr/lwar/stcw/mtmsr come up a lot, and\n// without the lock here threads can livelock.\n\nint InstrEmit_mfmsr(PPCHIRBuilder& f, const InstrData& i) {\n  // bit 48 = EE; interrupt enabled\n  // bit 62 = RI; recoverable interrupt\n  // return 8000h if unlocked (interrupts enabled), else 0\n  f.MemoryBarrier();\n  f.CallExtern(f.builtins()->check_global_lock);\n  f.StoreGPR(i.X.RT, f.LoadContext(offsetof(PPCContext, scratch), INT64_TYPE));\n  return 0;\n}\n\nint InstrEmit_mtmsr(PPCHIRBuilder& f, const InstrData& i) {\n  if (i.X.RA & 0x01) {\n    // L = 1\n    // iff storing from r13\n    f.MemoryBarrier();\n    f.StoreContext(\n        offsetof(PPCContext, scratch),\n        f.ZeroExtend(f.ZeroExtend(f.LoadGPR(i.X.RT), INT64_TYPE), INT64_TYPE));\n    if (i.X.RT == 13) {\n      // iff storing from r13 we are taking a lock (disable interrupts).\n      if (!cvars::disable_global_lock) {\n        f.CallExtern(f.builtins()->enter_global_lock);\n      }\n    } else {\n      // Otherwise we are restoring interrupts (probably).\n      if (!cvars::disable_global_lock) {\n        f.CallExtern(f.builtins()->leave_global_lock);\n      }\n    }\n    return 0;\n  } else {\n    // L = 0\n    XEINSTRNOTIMPLEMENTED();\n    return 1;\n  }\n}\n\nint InstrEmit_mtmsrd(PPCHIRBuilder& f, const InstrData& i) {\n  if (i.X.RA & 0x01) {\n    // L = 1\n    f.MemoryBarrier();\n    f.StoreContext(offsetof(PPCContext, scratch),\n                   f.ZeroExtend(f.LoadGPR(i.X.RT), INT64_TYPE));\n    if (i.X.RT == 13) {\n      // iff storing from r13 we are taking a lock (disable interrupts).\n      if (!cvars::disable_global_lock) {\n        f.CallExtern(f.builtins()->enter_global_lock);\n      }\n    } else {\n      // Otherwise we are restoring interrupts (probably).\n      if (!cvars::disable_global_lock) {\n        f.CallExtern(f.builtins()->leave_global_lock);\n      }\n    }\n    return 0;\n  } else {\n    // L = 0\n    XEINSTRNOTIMPLEMENTED();\n    return 1;\n  }\n}\n\nvoid RegisterEmitCategoryControl() {\n  XEREGISTERINSTR(bx);\n  XEREGISTERINSTR(bcx);\n  XEREGISTERINSTR(bcctrx);\n  XEREGISTERINSTR(bclrx);\n  XEREGISTERINSTR(crand);\n  XEREGISTERINSTR(crandc);\n  XEREGISTERINSTR(creqv);\n  XEREGISTERINSTR(crnand);\n  XEREGISTERINSTR(crnor);\n  XEREGISTERINSTR(cror);\n  XEREGISTERINSTR(crorc);\n  XEREGISTERINSTR(crxor);\n  XEREGISTERINSTR(mcrf);\n  XEREGISTERINSTR(sc);\n  XEREGISTERINSTR(td);\n  XEREGISTERINSTR(tdi);\n  XEREGISTERINSTR(tw);\n  XEREGISTERINSTR(twi);\n  XEREGISTERINSTR(mfcr);\n  XEREGISTERINSTR(mfspr);\n  XEREGISTERINSTR(mftb);\n  XEREGISTERINSTR(mtcrf);\n  XEREGISTERINSTR(mtspr);\n  XEREGISTERINSTR(mfmsr);\n  XEREGISTERINSTR(mtmsr);\n  XEREGISTERINSTR(mtmsrd);\n}\n\n}  // namespace ppc\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/ppc/ppc_emit_fpu.cc",
    "content": "/*\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/ppc/ppc_emit-private.h\"\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/cpu/ppc/ppc_context.h\"\n#include \"xenia/cpu/ppc/ppc_hir_builder.h\"\n\n#include <stddef.h>\n\nnamespace xe {\nnamespace cpu {\nnamespace ppc {\n\n// TODO(benvanik): remove when enums redefined.\nusing namespace xe::cpu::hir;\n\nusing xe::cpu::hir::RoundMode;\nusing xe::cpu::hir::Value;\n\n// Good source of information:\n// https://github.com/mamedev/historic-mame/blob/master/src/emu/cpu/powerpc/ppc_ops.c\n// The correctness of that code is not reflected here yet -_-\n\n// Enable rounding numbers to single precision as required.\n// This adds a bunch of work per operation and I'm not sure it's required.\n#define ROUND_TO_SINGLE\n\n// Floating-point arithmetic (A-8)\n\nint InstrEmit_faddx(PPCHIRBuilder& f, const InstrData& i) {\n  // frD <- (frA) + (frB)\n  Value* v = f.Add(f.LoadFPR(i.A.FRA), f.LoadFPR(i.A.FRB));\n  f.StoreFPR(i.A.FRT, v);\n  f.UpdateFPSCR(v, i.A.Rc);\n  return 0;\n}\n\nint InstrEmit_faddsx(PPCHIRBuilder& f, const InstrData& i) {\n  // frD <- (frA) + (frB)\n  Value* v = f.Add(f.LoadFPR(i.A.FRA), f.LoadFPR(i.A.FRB));\n  v = f.Convert(f.Convert(v, FLOAT32_TYPE), FLOAT64_TYPE);\n  f.StoreFPR(i.A.FRT, v);\n  f.UpdateFPSCR(v, i.A.Rc);\n  return 0;\n}\n\nint InstrEmit_fdivx(PPCHIRBuilder& f, const InstrData& i) {\n  // frD <- frA / frB\n  Value* v = f.Div(f.LoadFPR(i.A.FRA), f.LoadFPR(i.A.FRB));\n  f.StoreFPR(i.A.FRT, v);\n  f.UpdateFPSCR(v, i.A.Rc);\n  return 0;\n}\n\nint InstrEmit_fdivsx(PPCHIRBuilder& f, const InstrData& i) {\n  // frD <- frA / frB\n  Value* v = f.Div(f.LoadFPR(i.A.FRA), f.LoadFPR(i.A.FRB));\n  v = f.Convert(f.Convert(v, FLOAT32_TYPE), FLOAT64_TYPE);\n  f.StoreFPR(i.A.FRT, v);\n  f.UpdateFPSCR(v, i.A.Rc);\n  return 0;\n}\n\nint InstrEmit_fmulx(PPCHIRBuilder& f, const InstrData& i) {\n  // frD <- (frA) x (frC)\n  Value* v = f.Mul(f.LoadFPR(i.A.FRA), f.LoadFPR(i.A.FRC));\n  f.StoreFPR(i.A.FRT, v);\n  f.UpdateFPSCR(v, i.A.Rc);\n  return 0;\n}\n\nint InstrEmit_fmulsx(PPCHIRBuilder& f, const InstrData& i) {\n  // frD <- (frA) x (frC)\n  Value* v = f.Mul(f.LoadFPR(i.A.FRA), f.LoadFPR(i.A.FRC));\n  v = f.Convert(f.Convert(v, FLOAT32_TYPE), FLOAT64_TYPE);\n  f.StoreFPR(i.A.FRT, v);\n  f.UpdateFPSCR(v, i.A.Rc);\n  return 0;\n}\n\nint InstrEmit_fresx(PPCHIRBuilder& f, const InstrData& i) {\n  // frD <- 1.0 / (frB)\n  Value* v = f.Convert(f.Div(f.LoadConstantFloat32(1.0f),\n                             f.Convert(f.LoadFPR(i.A.FRB), FLOAT32_TYPE)),\n                       FLOAT64_TYPE);\n  f.StoreFPR(i.A.FRT, v);\n  f.UpdateFPSCR(v, i.A.Rc);\n  return 0;\n}\n\nint InstrEmit_frsqrtex(PPCHIRBuilder& f, const InstrData& i) {\n  // Double precision:\n  // frD <- 1/sqrt(frB)\n  Value* v = f.RSqrt(f.LoadFPR(i.A.FRB));\n  f.StoreFPR(i.A.FRT, v);\n  f.UpdateFPSCR(v, i.A.Rc);\n  return 0;\n}\n\nint InstrEmit_fsubx(PPCHIRBuilder& f, const InstrData& i) {\n  // frD <- (frA) - (frB)\n  Value* v = f.Sub(f.LoadFPR(i.A.FRA), f.LoadFPR(i.A.FRB));\n  f.StoreFPR(i.A.FRT, v);\n  f.UpdateFPSCR(v, i.A.Rc);\n  return 0;\n}\n\nint InstrEmit_fsubsx(PPCHIRBuilder& f, const InstrData& i) {\n  // frD <- (frA) - (frB)\n  Value* v = f.Sub(f.LoadFPR(i.A.FRA), f.LoadFPR(i.A.FRB));\n  v = f.Convert(f.Convert(v, FLOAT32_TYPE), FLOAT64_TYPE);\n  f.StoreFPR(i.A.FRT, v);\n  f.UpdateFPSCR(v, i.A.Rc);\n  return 0;\n}\n\nint InstrEmit_fselx(PPCHIRBuilder& f, const InstrData& i) {\n  // if (frA) >= 0.0\n  // then frD <- (frC)\n  // else frD <- (frB)\n  Value* ge = f.CompareSGE(f.LoadFPR(i.A.FRA), f.LoadZeroFloat64());\n  Value* v = f.Select(ge, f.LoadFPR(i.A.FRC), f.LoadFPR(i.A.FRB));\n  f.StoreFPR(i.A.FRT, v);\n  f.UpdateFPSCR(v, i.A.Rc);\n  return 0;\n}\n\nint InstrEmit_fsqrtx(PPCHIRBuilder& f, const InstrData& i) {\n  // Double precision:\n  // frD <- sqrt(frB)\n  Value* v = f.Sqrt(f.LoadFPR(i.A.FRB));\n  f.StoreFPR(i.A.FRT, v);\n  f.UpdateFPSCR(v, i.A.Rc);\n  return 0;\n}\n\nint InstrEmit_fsqrtsx(PPCHIRBuilder& f, const InstrData& i) {\n  // Single precision:\n  // frD <- sqrt(frB)\n  Value* v = f.Sqrt(f.LoadFPR(i.A.FRB));\n  v = f.Convert(f.Convert(v, FLOAT32_TYPE), FLOAT64_TYPE);\n  f.StoreFPR(i.A.FRT, v);\n  f.UpdateFPSCR(v, i.A.Rc);\n  return 0;\n}\n\n// Floating-point multiply-add (A-9)\n\nint InstrEmit_fmaddx(PPCHIRBuilder& f, const InstrData& i) {\n  // frD <- (frA x frC) + frB\n  Value* v =\n      f.MulAdd(f.LoadFPR(i.A.FRA), f.LoadFPR(i.A.FRC), f.LoadFPR(i.A.FRB));\n  f.StoreFPR(i.A.FRT, v);\n  f.UpdateFPSCR(v, i.A.Rc);\n  return 0;\n}\n\nint InstrEmit_fmaddsx(PPCHIRBuilder& f, const InstrData& i) {\n  // frD <- (frA x frC) + frB\n  Value* v =\n      f.MulAdd(f.LoadFPR(i.A.FRA), f.LoadFPR(i.A.FRC), f.LoadFPR(i.A.FRB));\n  v = f.Convert(f.Convert(v, FLOAT32_TYPE), FLOAT64_TYPE);\n  f.StoreFPR(i.A.FRT, v);\n  f.UpdateFPSCR(v, i.A.Rc);\n  return 0;\n}\n\nint InstrEmit_fmsubx(PPCHIRBuilder& f, const InstrData& i) {\n  // frD <- (frA x frC) - frB\n  Value* v =\n      f.MulSub(f.LoadFPR(i.A.FRA), f.LoadFPR(i.A.FRC), f.LoadFPR(i.A.FRB));\n  f.StoreFPR(i.A.FRT, v);\n  f.UpdateFPSCR(v, i.A.Rc);\n  return 0;\n}\n\nint InstrEmit_fmsubsx(PPCHIRBuilder& f, const InstrData& i) {\n  // frD <- (frA x frC) - frB\n  Value* v =\n      f.MulSub(f.LoadFPR(i.A.FRA), f.LoadFPR(i.A.FRC), f.LoadFPR(i.A.FRB));\n  v = f.Convert(f.Convert(v, FLOAT32_TYPE), FLOAT64_TYPE);\n  f.StoreFPR(i.A.FRT, v);\n  f.UpdateFPSCR(v, i.A.Rc);\n  return 0;\n}\n\nint InstrEmit_fnmaddx(PPCHIRBuilder& f, const InstrData& i) {\n  // frD <- -([frA x frC] + frB)\n  Value* v = f.Neg(\n      f.MulAdd(f.LoadFPR(i.A.FRA), f.LoadFPR(i.A.FRC), f.LoadFPR(i.A.FRB)));\n  f.StoreFPR(i.A.FRT, v);\n  f.UpdateFPSCR(v, i.A.Rc);\n  return 0;\n}\n\nint InstrEmit_fnmaddsx(PPCHIRBuilder& f, const InstrData& i) {\n  // frD <- -([frA x frC] + frB)\n  Value* v = f.Neg(\n      f.MulAdd(f.LoadFPR(i.A.FRA), f.LoadFPR(i.A.FRC), f.LoadFPR(i.A.FRB)));\n  v = f.Convert(f.Convert(v, FLOAT32_TYPE), FLOAT64_TYPE);\n  f.StoreFPR(i.A.FRT, v);\n  f.UpdateFPSCR(v, i.A.Rc);\n  return 0;\n}\n\nint InstrEmit_fnmsubx(PPCHIRBuilder& f, const InstrData& i) {\n  // frD <- -([frA x frC] - frB)\n  Value* v = f.Neg(\n      f.MulSub(f.LoadFPR(i.A.FRA), f.LoadFPR(i.A.FRC), f.LoadFPR(i.A.FRB)));\n  f.StoreFPR(i.A.FRT, v);\n  f.UpdateFPSCR(v, i.A.Rc);\n  return 0;\n}\n\nint InstrEmit_fnmsubsx(PPCHIRBuilder& f, const InstrData& i) {\n  // frD <- -([frA x frC] - frB)\n  Value* v = f.Neg(\n      f.MulSub(f.LoadFPR(i.A.FRA), f.LoadFPR(i.A.FRC), f.LoadFPR(i.A.FRB)));\n  v = f.Convert(f.Convert(v, FLOAT32_TYPE), FLOAT64_TYPE);\n  f.StoreFPR(i.A.FRT, v);\n  f.UpdateFPSCR(v, i.A.Rc);\n  return 0;\n}\n\n// Floating-point rounding and conversion (A-10)\n\nint InstrEmit_fcfidx(PPCHIRBuilder& f, const InstrData& i) {\n  // frD <- signed_int64_to_double( frB )\n  Value* v = f.Convert(f.Cast(f.LoadFPR(i.X.RB), INT64_TYPE), FLOAT64_TYPE);\n  f.StoreFPR(i.X.RT, v);\n  f.UpdateFPSCR(v, i.A.Rc);\n  return 0;\n}\n\nint InstrEmit_fctidxx_(PPCHIRBuilder& f, const InstrData& i,\n                       RoundMode round_mode) {\n  auto end = f.NewLabel();\n  auto isnan = f.NewLabel();\n  Value* v;\n  f.BranchTrue(f.IsNan(f.LoadFPR(i.X.RB)), isnan);\n  v = f.Convert(f.LoadFPR(i.X.RB), INT64_TYPE, round_mode);\n  v = f.Cast(v, FLOAT64_TYPE);\n  f.StoreFPR(i.X.RT, v);\n  f.UpdateFPSCR(v, i.X.Rc);\n  f.Branch(end);\n  f.MarkLabel(isnan);\n  v = f.Cast(f.LoadConstantUint64(0x8000000000000000u), FLOAT64_TYPE);\n  f.StoreFPR(i.X.RT, v);\n  f.UpdateFPSCR(v, i.X.Rc);\n  f.MarkLabel(end);\n  return 0;\n}\n\nint InstrEmit_fctidx(PPCHIRBuilder& f, const InstrData& i) {\n  // frD <- double_to_signed_int64( frB )\n  return InstrEmit_fctidxx_(f, i, ROUND_DYNAMIC);\n}\n\nint InstrEmit_fctidzx(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_fctidxx_(f, i, ROUND_TO_ZERO);\n}\n\nint InstrEmit_fctiwxx_(PPCHIRBuilder& f, const InstrData& i,\n                       RoundMode round_mode) {\n  auto end = f.NewLabel();\n  auto isnan = f.NewLabel();\n  Value* v;\n  f.BranchTrue(f.IsNan(f.LoadFPR(i.X.RB)), isnan);\n  v = f.Convert(f.LoadFPR(i.X.RB), INT32_TYPE, round_mode);\n  v = f.Cast(f.SignExtend(v, INT64_TYPE), FLOAT64_TYPE);\n  f.StoreFPR(i.X.RT, v);\n  f.UpdateFPSCR(v, i.X.Rc);\n  f.Branch(end);\n  f.MarkLabel(isnan);\n  v = f.Cast(f.LoadConstantUint32(0x80000000u), FLOAT64_TYPE);\n  f.StoreFPR(i.X.RT, v);\n  f.UpdateFPSCR(v, i.X.Rc);\n  f.MarkLabel(end);\n  return 0;\n}\n\nint InstrEmit_fctiwx(PPCHIRBuilder& f, const InstrData& i) {\n  // frD <- double_to_signed_int32( frB )\n  return InstrEmit_fctiwxx_(f, i, ROUND_DYNAMIC);\n}\n\nint InstrEmit_fctiwzx(PPCHIRBuilder& f, const InstrData& i) {\n  // TODO(benvanik): assuming round to zero is always set, is that ok?\n  return InstrEmit_fctiwxx_(f, i, ROUND_TO_ZERO);\n}\n\nint InstrEmit_frspx(PPCHIRBuilder& f, const InstrData& i) {\n  // frD <- Round_single(frB)\n  Value* v = f.Convert(f.LoadFPR(i.X.RB), FLOAT32_TYPE, ROUND_DYNAMIC);\n  v = f.Convert(v, FLOAT64_TYPE);\n  f.StoreFPR(i.X.RT, v);\n  f.UpdateFPSCR(v, i.X.Rc);\n  return 0;\n}\n\n// Floating-point compare (A-11)\n\nint InstrEmit_fcmpx_(PPCHIRBuilder& f, const InstrData& i, bool ordered) {\n  // if (FRA) is a NaN or (FRB) is a NaN then\n  //   c <- 0b0001\n  // else if (FRA) < (FRB) then\n  //   c <- 0b1000\n  // else if (FRA) > (FRB) then\n  //   c <- 0b0100\n  // else {\n  //   c <- 0b0010\n  // }\n  // FPCC <- c\n  // CR[4*BF:4*BF+3] <- c\n  // if (FRA) is an SNaN or (FRB) is an SNaN then\n  //   VXSNAN <- 1\n\n  // TODO(benvanik): update FPCC for mffsx/etc\n  // TODO(benvanik): update VXSNAN\n  const uint32_t crf = i.X.RT >> 2;\n  Value* ra = f.LoadFPR(i.X.RA);\n  Value* rb = f.LoadFPR(i.X.RB);\n\n  Value* nan = f.Or(f.IsNan(ra), f.IsNan(rb));\n  f.StoreContext(offsetof(PPCContext, cr0) + (4 * crf) + 3, nan);\n  Value* not_nan = f.Xor(nan, f.LoadConstantInt8(0x01));\n\n  Value* lt = f.And(not_nan, f.CompareSLT(ra, rb));\n  f.StoreContext(offsetof(PPCContext, cr0) + (4 * crf) + 0, lt);\n  Value* gt = f.And(not_nan, f.CompareSGT(ra, rb));\n  f.StoreContext(offsetof(PPCContext, cr0) + (4 * crf) + 1, gt);\n  Value* eq = f.And(not_nan, f.CompareEQ(ra, rb));\n  f.StoreContext(offsetof(PPCContext, cr0) + (4 * crf) + 2, eq);\n  return 0;\n}\nint InstrEmit_fcmpo(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_fcmpx_(f, i, true);\n}\nint InstrEmit_fcmpu(PPCHIRBuilder& f, const InstrData& i) {\n  return InstrEmit_fcmpx_(f, i, false);\n}\n\n// Floating-point status and control register (A\n\nint InstrEmit_mcrfs(PPCHIRBuilder& f, const InstrData& i) {\n  XEINSTRNOTIMPLEMENTED();\n  return 1;\n}\n\nint InstrEmit_mffsx(PPCHIRBuilder& f, const InstrData& i) {\n  if (i.X.Rc) {\n    XEINSTRNOTIMPLEMENTED();\n    return 1;\n  }\n  Value* v = f.Cast(f.ZeroExtend(f.LoadFPSCR(), INT64_TYPE), FLOAT64_TYPE);\n  f.StoreFPR(i.X.RT, v);\n  return 0;\n}\n\nint InstrEmit_mtfsb0x(PPCHIRBuilder& f, const InstrData& i) {\n  XEINSTRNOTIMPLEMENTED();\n  return 1;\n}\n\nint InstrEmit_mtfsb1x(PPCHIRBuilder& f, const InstrData& i) {\n  XEINSTRNOTIMPLEMENTED();\n  return 1;\n}\n\nint InstrEmit_mtfsfx(PPCHIRBuilder& f, const InstrData& i) {\n  if (i.XFL.L) {\n    // Move/shift.\n    f.StoreFPSCR(\n        f.Truncate(f.Cast(f.LoadFPR(i.XFL.RB), INT64_TYPE), INT32_TYPE));\n    return 1;\n  } else {\n    assert_zero(i.XFL.W);\n\n    // Store under control of mask.\n    // Expand the mask from 8 bits -> 32 bits.\n    uint32_t mask = 0;\n    for (int j = 0; j < 8; j++) {\n      if (i.XFL.FM & (1 << (j ^ 7))) {\n        mask |= 0xF << (4 * j);\n      }\n    }\n\n    Value* v = f.Truncate(f.Cast(f.LoadFPR(i.XFL.RB), INT64_TYPE), INT32_TYPE);\n    if (mask != 0xFFFFFFFF) {\n      Value* fpscr = f.LoadFPSCR();\n      v = f.And(v, f.LoadConstantInt32(mask));\n      v = f.Or(v, f.And(fpscr, f.LoadConstantInt32(~mask)));\n    }\n    f.StoreFPSCR(v);\n\n    // Update the system rounding mode.\n    if (mask & 0x7) {\n      f.SetRoundingMode(v);\n    }\n  }\n  if (i.XFL.Rc) {\n    f.CopyFPSCRToCR1();\n  }\n  return 0;\n}\n\nint InstrEmit_mtfsfix(PPCHIRBuilder& f, const InstrData& i) {\n  // FPSCR[crfD] <- IMM\n\n  // Create a mask.\n  uint32_t mask = 0xF << (0x1C - (i.X.RT & 0x1C));\n  uint32_t value = i.X.RB << (0x1C - (i.X.RT & 0x1C));\n\n  Value* fpscr = f.LoadFPSCR();\n  fpscr = f.And(fpscr, f.LoadConstantInt32(~mask));\n  fpscr = f.Or(fpscr, f.LoadConstantInt32(value));\n  f.StoreFPSCR(fpscr);\n\n  // Update the system rounding mode.\n  if (mask & 0x7) {\n    f.SetRoundingMode(fpscr);\n  }\n\n  if (i.X.Rc) {\n    f.CopyFPSCRToCR1();\n  }\n\n  return 0;\n}\n\n// Floating-point move (A-21)\n\nint InstrEmit_fabsx(PPCHIRBuilder& f, const InstrData& i) {\n  // frD <- abs(frB)\n  Value* v = f.Abs(f.LoadFPR(i.X.RB));\n  f.StoreFPR(i.X.RT, v);\n  f.UpdateFPSCR(v, i.X.Rc);\n  return 0;\n}\n\nint InstrEmit_fmrx(PPCHIRBuilder& f, const InstrData& i) {\n  // frD <- (frB)\n  Value* v = f.LoadFPR(i.X.RB);\n  f.StoreFPR(i.X.RT, v);\n  f.UpdateFPSCR(v, i.X.Rc);\n  return 0;\n}\n\nint InstrEmit_fnabsx(PPCHIRBuilder& f, const InstrData& i) {\n  // frD <- !abs(frB)\n  Value* v = f.Neg(f.Abs(f.LoadFPR(i.X.RB)));\n  f.StoreFPR(i.X.RT, v);\n  f.UpdateFPSCR(v, i.X.Rc);\n  return 0;\n}\n\nint InstrEmit_fnegx(PPCHIRBuilder& f, const InstrData& i) {\n  // frD <- ¬ frB[0] || frB[1-63]\n  Value* v = f.Neg(f.LoadFPR(i.X.RB));\n  f.StoreFPR(i.X.RT, v);\n  f.UpdateFPSCR(v, i.X.Rc);\n  return 0;\n}\n\nvoid RegisterEmitCategoryFPU() {\n  XEREGISTERINSTR(faddx);\n  XEREGISTERINSTR(faddsx);\n  XEREGISTERINSTR(fdivx);\n  XEREGISTERINSTR(fdivsx);\n  XEREGISTERINSTR(fmulx);\n  XEREGISTERINSTR(fmulsx);\n  XEREGISTERINSTR(fresx);\n  XEREGISTERINSTR(frsqrtex);\n  XEREGISTERINSTR(fsubx);\n  XEREGISTERINSTR(fsubsx);\n  XEREGISTERINSTR(fselx);\n  XEREGISTERINSTR(fsqrtx);\n  XEREGISTERINSTR(fsqrtsx);\n  XEREGISTERINSTR(fmaddx);\n  XEREGISTERINSTR(fmaddsx);\n  XEREGISTERINSTR(fmsubx);\n  XEREGISTERINSTR(fmsubsx);\n  XEREGISTERINSTR(fnmaddx);\n  XEREGISTERINSTR(fnmaddsx);\n  XEREGISTERINSTR(fnmsubx);\n  XEREGISTERINSTR(fnmsubsx);\n  XEREGISTERINSTR(fcfidx);\n  XEREGISTERINSTR(fctidx);\n  XEREGISTERINSTR(fctidzx);\n  XEREGISTERINSTR(fctiwx);\n  XEREGISTERINSTR(fctiwzx);\n  XEREGISTERINSTR(frspx);\n  XEREGISTERINSTR(fcmpo);\n  XEREGISTERINSTR(fcmpu);\n  XEREGISTERINSTR(mcrfs);\n  XEREGISTERINSTR(mffsx);\n  XEREGISTERINSTR(mtfsb0x);\n  XEREGISTERINSTR(mtfsb1x);\n  XEREGISTERINSTR(mtfsfx);\n  XEREGISTERINSTR(mtfsfix);\n  XEREGISTERINSTR(fabsx);\n  XEREGISTERINSTR(fmrx);\n  XEREGISTERINSTR(fnabsx);\n  XEREGISTERINSTR(fnegx);\n}\n\n}  // namespace ppc\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/ppc/ppc_emit_memory.cc",
    "content": "/*\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/ppc/ppc_emit-private.h\"\n\n#include <stddef.h>\n#include \"xenia/base/assert.h\"\n#include \"xenia/cpu/ppc/ppc_context.h\"\n#include \"xenia/cpu/ppc/ppc_hir_builder.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace ppc {\n\n// TODO(benvanik): remove when enums redefined.\nusing namespace xe::cpu::hir;\n\nusing xe::cpu::hir::Value;\n\nValue* CalculateEA(PPCHIRBuilder& f, uint32_t ra, uint32_t rb) {\n  return f.Add(f.LoadGPR(ra), f.LoadGPR(rb));\n}\n\nValue* CalculateEA_0(PPCHIRBuilder& f, uint32_t ra, uint32_t rb) {\n  if (ra) {\n    return f.Add(f.LoadGPR(ra), f.LoadGPR(rb));\n  } else {\n    return f.LoadGPR(rb);\n  }\n}\n\nValue* CalculateEA_i(PPCHIRBuilder& f, uint32_t ra, uint64_t imm) {\n  return f.Add(f.LoadGPR(ra), f.LoadConstantUint64(imm));\n}\n\nValue* CalculateEA_0_i(PPCHIRBuilder& f, uint32_t ra, uint64_t imm) {\n  if (ra) {\n    return f.Add(f.LoadGPR(ra), f.LoadConstantUint64(imm));\n  } else {\n    return f.LoadConstantUint64(imm);\n  }\n}\n\nvoid StoreEA(PPCHIRBuilder& f, uint32_t rt, Value* ea) {\n  // Stored back as 64bit right after the add, it seems.\n  // f.StoreGPR(rt, f.ZeroExtend(f.Truncate(ea, INT32_TYPE), INT64_TYPE));\n  f.StoreGPR(rt, ea);\n}\n\n// Integer load (A-13)\n\nint InstrEmit_lbz(PPCHIRBuilder& f, const InstrData& i) {\n  // if RA = 0 then\n  //   b <- 0\n  // else\n  //   b <- (RA)\n  // EA <- b + EXTS(D)\n  // RT <- i56.0 || MEM(EA, 1)\n  Value* b;\n  if (i.D.RA == 0) {\n    b = f.LoadZeroInt64();\n  } else {\n    b = f.LoadGPR(i.D.RA);\n  }\n\n  Value* offset = f.LoadConstantInt64(XEEXTS16(i.D.DS));\n  Value* rt = f.ZeroExtend(f.LoadOffset(b, offset, INT8_TYPE), INT64_TYPE);\n  f.StoreGPR(i.D.RT, rt);\n  return 0;\n}\n\nint InstrEmit_lbzu(PPCHIRBuilder& f, const InstrData& i) {\n  // EA <- (RA) + EXTS(D)\n  // RT <- i56.0 || MEM(EA, 1)\n  // RA <- EA\n  Value* ra = f.LoadGPR(i.D.RA);\n  Value* offset = f.LoadConstantInt64(XEEXTS16(i.D.DS));\n  Value* rt = f.ZeroExtend(f.LoadOffset(ra, offset, INT8_TYPE), INT64_TYPE);\n  f.StoreGPR(i.D.RT, rt);\n  StoreEA(f, i.D.RA, f.Add(ra, offset));\n  return 0;\n}\n\nint InstrEmit_lbzux(PPCHIRBuilder& f, const InstrData& i) {\n  // EA <- (RA) + (RB)\n  // RT <- i56.0 || MEM(EA, 1)\n  // RA <- EA\n  Value* ea = CalculateEA(f, i.X.RA, i.X.RB);\n  Value* rt = f.ZeroExtend(f.Load(ea, INT8_TYPE), INT64_TYPE);\n  f.StoreGPR(i.X.RT, rt);\n  StoreEA(f, i.X.RA, ea);\n  return 0;\n}\n\nint InstrEmit_lbzx(PPCHIRBuilder& f, const InstrData& i) {\n  // if RA = 0 then\n  //   b <- 0\n  // else\n  //   b <- (RA)\n  // EA <- b + (RB)\n  // RT <- i56.0 || MEM(EA, 1)\n  Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB);\n  Value* rt = f.ZeroExtend(f.Load(ea, INT8_TYPE), INT64_TYPE);\n  f.StoreGPR(i.X.RT, rt);\n  return 0;\n}\n\nint InstrEmit_lha(PPCHIRBuilder& f, const InstrData& i) {\n  // if RA = 0 then\n  //   b <- 0\n  // else\n  //   b <- (RA)\n  // EA <- b + EXTS(D)\n  // RT <- EXTS(MEM(EA, 2))\n  Value* b;\n  if (i.D.RA == 0) {\n    b = f.LoadZeroInt64();\n  } else {\n    b = f.LoadGPR(i.D.RA);\n  }\n\n  Value* offset = f.LoadConstantInt64(XEEXTS16(i.D.DS));\n  Value* rt =\n      f.SignExtend(f.ByteSwap(f.LoadOffset(b, offset, INT16_TYPE)), INT64_TYPE);\n  f.StoreGPR(i.D.RT, rt);\n  return 0;\n}\n\nint InstrEmit_lhau(PPCHIRBuilder& f, const InstrData& i) {\n  // EA <- (RA) + EXTS(D)\n  // RT <- EXTS(MEM(EA, 2))\n  // RA <- EA\n  Value* ra = f.LoadGPR(i.D.RA);\n  Value* offset = f.LoadConstantInt64(XEEXTS16(i.D.DS));\n  Value* rt = f.SignExtend(f.ByteSwap(f.LoadOffset(ra, offset, INT16_TYPE)),\n                           INT64_TYPE);\n  f.StoreGPR(i.D.RT, rt);\n  StoreEA(f, i.D.RA, f.Add(ra, offset));\n  return 0;\n}\n\nint InstrEmit_lhaux(PPCHIRBuilder& f, const InstrData& i) {\n  // EA <- (RA) + (RB)\n  // RT <- EXTS(MEM(EA, 2))\n  // RA <- EA\n  Value* ea = CalculateEA(f, i.X.RA, i.X.RB);\n  Value* rt = f.SignExtend(f.ByteSwap(f.Load(ea, INT16_TYPE)), INT64_TYPE);\n  f.StoreGPR(i.X.RT, rt);\n  StoreEA(f, i.X.RA, ea);\n  return 0;\n}\n\nint InstrEmit_lhax(PPCHIRBuilder& f, const InstrData& i) {\n  // if RA = 0 then\n  //   b <- 0\n  // else\n  //   b <- (RA)\n  // EA <- b + (RB)\n  // RT <- EXTS(MEM(EA, 2))\n  Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB);\n  Value* rt = f.SignExtend(f.ByteSwap(f.Load(ea, INT16_TYPE)), INT64_TYPE);\n  f.StoreGPR(i.X.RT, rt);\n  return 0;\n}\n\nint InstrEmit_lhz(PPCHIRBuilder& f, const InstrData& i) {\n  // if RA = 0 then\n  //   b <- 0\n  // else\n  //   b <- (RA)\n  // EA <- b + EXTS(D)\n  // RT <- i48.0 || MEM(EA, 2)\n  Value* b;\n  if (i.D.RA == 0) {\n    b = f.LoadZeroInt64();\n  } else {\n    b = f.LoadGPR(i.D.RA);\n  }\n\n  Value* offset = f.LoadConstantInt64(XEEXTS16(i.D.DS));\n  Value* rt =\n      f.ZeroExtend(f.ByteSwap(f.LoadOffset(b, offset, INT16_TYPE)), INT64_TYPE);\n  f.StoreGPR(i.D.RT, rt);\n  return 0;\n}\n\nint InstrEmit_lhzu(PPCHIRBuilder& f, const InstrData& i) {\n  // EA <- (RA) + EXTS(D)\n  // RT <- i48.0 || MEM(EA, 2)\n  // RA <- EA\n  Value* ra = f.LoadGPR(i.D.RA);\n  Value* offset = f.LoadConstantInt64(XEEXTS16(i.D.DS));\n  Value* rt = f.ZeroExtend(f.ByteSwap(f.LoadOffset(ra, offset, INT16_TYPE)),\n                           INT64_TYPE);\n  f.StoreGPR(i.D.RT, rt);\n  StoreEA(f, i.D.RA, f.Add(ra, offset));\n  return 0;\n}\n\nint InstrEmit_lhzux(PPCHIRBuilder& f, const InstrData& i) {\n  // EA <- (RA) + (RB)\n  // RT <- i48.0 || MEM(EA, 2)\n  // RA <- EA\n  Value* ea = CalculateEA(f, i.X.RA, i.X.RB);\n  Value* rt = f.ZeroExtend(f.ByteSwap(f.Load(ea, INT16_TYPE)), INT64_TYPE);\n  f.StoreGPR(i.X.RT, rt);\n  StoreEA(f, i.X.RA, ea);\n  return 0;\n}\n\nint InstrEmit_lhzx(PPCHIRBuilder& f, const InstrData& i) {\n  // if RA = 0 then\n  //   b <- 0\n  // else\n  //   b <- (RA)\n  // EA <- b + (RB)\n  // RT <- i48.0 || MEM(EA, 2)\n  Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB);\n  Value* rt = f.ZeroExtend(f.ByteSwap(f.Load(ea, INT16_TYPE)), INT64_TYPE);\n  f.StoreGPR(i.X.RT, rt);\n  return 0;\n}\n\nint InstrEmit_lwa(PPCHIRBuilder& f, const InstrData& i) {\n  // if RA = 0 then\n  //   b <- 0\n  // else\n  //   b <- (RA)\n  // EA <- b + EXTS(D || 00)\n  // RT <- EXTS(MEM(EA, 4))\n  Value* b;\n  if (i.DS.RA == 0) {\n    b = f.LoadZeroInt64();\n  } else {\n    b = f.LoadGPR(i.DS.RA);\n  }\n\n  Value* offset = f.LoadConstantInt64(XEEXTS16(i.DS.DS << 2));\n  Value* rt =\n      f.SignExtend(f.ByteSwap(f.LoadOffset(b, offset, INT32_TYPE)), INT64_TYPE);\n  f.StoreGPR(i.DS.RT, rt);\n  return 0;\n}\n\nint InstrEmit_lwaux(PPCHIRBuilder& f, const InstrData& i) {\n  // EA <- (RA) + (RB)\n  // RT <- EXTS(MEM(EA, 4))\n  // RA <- EA\n  Value* ea = CalculateEA(f, i.X.RA, i.X.RB);\n  Value* rt = f.SignExtend(f.ByteSwap(f.Load(ea, INT32_TYPE)), INT64_TYPE);\n  f.StoreGPR(i.X.RT, rt);\n  StoreEA(f, i.X.RA, ea);\n  return 0;\n}\n\nint InstrEmit_lwax(PPCHIRBuilder& f, const InstrData& i) {\n  // if RA = 0 then\n  //   b <- 0\n  // else\n  //   b <- (RA)\n  // EA <- b + (RB)\n  // RT <- EXTS(MEM(EA, 4))\n  Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB);\n  Value* rt = f.SignExtend(f.ByteSwap(f.Load(ea, INT32_TYPE)), INT64_TYPE);\n  f.StoreGPR(i.X.RT, rt);\n  return 0;\n}\n\nint InstrEmit_lwz(PPCHIRBuilder& f, const InstrData& i) {\n  // if RA = 0 then\n  //   b <- 0\n  // else\n  //   b <- (RA)\n  // EA <- b + EXTS(D)\n  // RT <- i32.0 || MEM(EA, 4)\n  Value* b;\n  if (i.D.RA == 0) {\n    b = f.LoadZeroInt64();\n  } else {\n    b = f.LoadGPR(i.D.RA);\n  }\n\n  Value* offset = f.LoadConstantInt64(XEEXTS16(i.D.DS));\n  Value* rt =\n      f.ZeroExtend(f.ByteSwap(f.LoadOffset(b, offset, INT32_TYPE)), INT64_TYPE);\n  f.StoreGPR(i.D.RT, rt);\n  return 0;\n}\n\nint InstrEmit_lwzu(PPCHIRBuilder& f, const InstrData& i) {\n  // EA <- (RA) + EXTS(D)\n  // RT <- i32.0 || MEM(EA, 4)\n  // RA <- EA\n  Value* ra = f.LoadGPR(i.D.RA);\n  Value* offset = f.LoadConstantInt64(XEEXTS16(i.D.DS));\n  Value* rt = f.ZeroExtend(f.ByteSwap(f.LoadOffset(ra, offset, INT32_TYPE)),\n                           INT64_TYPE);\n  f.StoreGPR(i.D.RT, rt);\n  StoreEA(f, i.D.RA, f.Add(ra, offset));\n  return 0;\n}\n\nint InstrEmit_lwzux(PPCHIRBuilder& f, const InstrData& i) {\n  // EA <- (RA) + (RB)\n  // RT <- i32.0 || MEM(EA, 4)\n  // RA <- EA\n  Value* ea = CalculateEA(f, i.X.RA, i.X.RB);\n  Value* rt = f.ZeroExtend(f.ByteSwap(f.Load(ea, INT32_TYPE)), INT64_TYPE);\n  f.StoreGPR(i.X.RT, rt);\n  StoreEA(f, i.X.RA, ea);\n  return 0;\n}\n\nint InstrEmit_lwzx(PPCHIRBuilder& f, const InstrData& i) {\n  // if RA = 0 then\n  //   b <- 0\n  // else\n  //   b <- (RA)\n  // EA <- b + (RB)\n  // RT <- i32.0 || MEM(EA, 4)\n  Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB);\n  Value* rt = f.ZeroExtend(f.ByteSwap(f.Load(ea, INT32_TYPE)), INT64_TYPE);\n  f.StoreGPR(i.X.RT, rt);\n  return 0;\n}\n\nint InstrEmit_ld(PPCHIRBuilder& f, const InstrData& i) {\n  // if RA = 0 then\n  //   b <- 0\n  // else\n  //   b <- (RA)\n  // EA <- b + EXTS(DS || 0b00)\n  // RT <- MEM(EA, 8)\n  Value* b;\n  if (i.DS.RA == 0) {\n    b = f.LoadZeroInt64();\n  } else {\n    b = f.LoadGPR(i.DS.RA);\n  }\n\n  Value* offset = f.LoadConstantInt64(XEEXTS16(i.DS.DS << 2));\n  Value* rt = f.ByteSwap(f.LoadOffset(b, offset, INT64_TYPE));\n  f.StoreGPR(i.DS.RT, rt);\n  return 0;\n}\n\nint InstrEmit_ldu(PPCHIRBuilder& f, const InstrData& i) {\n  // EA <- (RA) + EXTS(DS || 0b00)\n  // RT <- MEM(EA, 8)\n  // RA <- EA\n  Value* ea = CalculateEA_i(f, i.DS.RA, XEEXTS16(i.DS.DS << 2));\n  Value* rt = f.ByteSwap(f.Load(ea, INT64_TYPE));\n  f.StoreGPR(i.DS.RT, rt);\n  StoreEA(f, i.DS.RA, ea);\n  return 0;\n}\n\nint InstrEmit_ldux(PPCHIRBuilder& f, const InstrData& i) {\n  // EA <- (RA) + (RB)\n  // RT <- MEM(EA, 8)\n  // RA <- EA\n  Value* ea = CalculateEA(f, i.X.RA, i.X.RB);\n  Value* rt = f.ByteSwap(f.Load(ea, INT64_TYPE));\n  f.StoreGPR(i.X.RT, rt);\n  StoreEA(f, i.X.RA, ea);\n  return 0;\n}\n\nint InstrEmit_ldx(PPCHIRBuilder& f, const InstrData& i) {\n  // if RA = 0 then\n  //   b <- 0\n  // else\n  //   b <- (RA)\n  // EA <- b + (RB)\n  // RT <- MEM(EA, 8)\n  Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB);\n  Value* rt = f.ByteSwap(f.Load(ea, INT64_TYPE));\n  f.StoreGPR(i.X.RT, rt);\n  return 0;\n}\n\n// Integer store (A-14)\n\nint InstrEmit_stb(PPCHIRBuilder& f, const InstrData& i) {\n  // if RA = 0 then\n  //   b <- 0\n  // else\n  //   b <- (RA)\n  // EA <- b + EXTS(D)\n  // MEM(EA, 1) <- (RS)[56:63]\n  Value* b;\n  if (i.D.RA == 0) {\n    b = f.LoadZeroInt64();\n  } else {\n    b = f.LoadGPR(i.D.RA);\n  }\n\n  Value* offset = f.LoadConstantInt64(XEEXTS16(i.D.DS));\n  f.StoreOffset(b, offset, f.Truncate(f.LoadGPR(i.D.RT), INT8_TYPE));\n  return 0;\n}\n\nint InstrEmit_stbu(PPCHIRBuilder& f, const InstrData& i) {\n  // EA <- (RA) + EXTS(D)\n  // MEM(EA, 1) <- (RS)[56:63]\n  // RA <- EA\n  Value* ea = CalculateEA_i(f, i.D.RA, XEEXTS16(i.D.DS));\n  f.Store(ea, f.Truncate(f.LoadGPR(i.D.RT), INT8_TYPE));\n  StoreEA(f, i.D.RA, ea);\n  return 0;\n}\n\nint InstrEmit_stbux(PPCHIRBuilder& f, const InstrData& i) {\n  // EA <- (RA) + (RB)\n  // MEM(EA, 1) <- (RS)[56:63]\n  // RA <- EA\n  Value* ea = CalculateEA(f, i.X.RA, i.X.RB);\n  f.Store(ea, f.Truncate(f.LoadGPR(i.X.RT), INT8_TYPE));\n  StoreEA(f, i.X.RA, ea);\n  return 0;\n}\n\nint InstrEmit_stbx(PPCHIRBuilder& f, const InstrData& i) {\n  // if RA = 0 then\n  //   b <- 0\n  // else\n  //   b <- (RA)\n  // EA <- b + (RB)\n  // MEM(EA, 1) <- (RS)[56:63]\n  Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB);\n  f.Store(ea, f.Truncate(f.LoadGPR(i.X.RT), INT8_TYPE));\n  return 0;\n}\n\nint InstrEmit_sth(PPCHIRBuilder& f, const InstrData& i) {\n  // if RA = 0 then\n  //   b <- 0\n  // else\n  //   b <- (RA)\n  // EA <- b + EXTS(D)\n  // MEM(EA, 2) <- (RS)[48:63]\n  Value* b;\n  if (i.D.RA == 0) {\n    b = f.LoadZeroInt64();\n  } else {\n    b = f.LoadGPR(i.D.RA);\n  }\n\n  Value* offset = f.LoadConstantInt64(XEEXTS16(i.D.DS));\n  f.StoreOffset(b, offset,\n                f.ByteSwap(f.Truncate(f.LoadGPR(i.D.RT), INT16_TYPE)));\n  return 0;\n}\n\nint InstrEmit_sthu(PPCHIRBuilder& f, const InstrData& i) {\n  // EA <- (RA) + EXTS(D)\n  // MEM(EA, 2) <- (RS)[48:63]\n  // RA <- EA\n  Value* ea = CalculateEA_i(f, i.D.RA, XEEXTS16(i.D.DS));\n  f.Store(ea, f.ByteSwap(f.Truncate(f.LoadGPR(i.D.RT), INT16_TYPE)));\n  StoreEA(f, i.D.RA, ea);\n  return 0;\n}\n\nint InstrEmit_sthux(PPCHIRBuilder& f, const InstrData& i) {\n  // EA <- (RA) + (RB)\n  // MEM(EA, 2) <- (RS)[48:63]\n  // RA <- EA\n  Value* ea = CalculateEA(f, i.X.RA, i.X.RB);\n  f.Store(ea, f.ByteSwap(f.Truncate(f.LoadGPR(i.X.RT), INT16_TYPE)));\n  StoreEA(f, i.X.RA, ea);\n  return 0;\n}\n\nint InstrEmit_sthx(PPCHIRBuilder& f, const InstrData& i) {\n  // if RA = 0 then\n  //   b <- 0\n  // else\n  //   b <- (RA)\n  // EA <- b + (RB)\n  // MEM(EA, 2) <- (RS)[48:63]\n  Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB);\n  f.Store(ea, f.ByteSwap(f.Truncate(f.LoadGPR(i.X.RT), INT16_TYPE)));\n  return 0;\n}\n\nint InstrEmit_stw(PPCHIRBuilder& f, const InstrData& i) {\n  // if RA = 0 then\n  //   b <- 0\n  // else\n  //   b <- (RA)\n  // EA <- b + EXTS(D)\n  // MEM(EA, 4) <- (RS)[32:63]\n  Value* b;\n  if (i.D.RA == 0) {\n    b = f.LoadZeroInt64();\n  } else {\n    b = f.LoadGPR(i.D.RA);\n  }\n  Value* offset = f.LoadConstantInt64(XEEXTS16(i.D.DS));\n  f.StoreOffset(b, offset,\n                f.ByteSwap(f.Truncate(f.LoadGPR(i.D.RT), INT32_TYPE)));\n\n  return 0;\n}\n\nint InstrEmit_stmw(PPCHIRBuilder& f, const InstrData& i) {\n  Value* b;\n  if (i.D.RA == 0) {\n    b = f.LoadZeroInt64();\n  } else {\n    b = f.LoadGPR(i.D.RA);\n  }\n\n  for (uint32_t j = 0; j < 32 - i.D.RT; ++j) {\n    Value* offset = f.LoadConstantInt64(XEEXTS16(i.D.DS) + j * 4);\n    f.StoreOffset(b, offset,\n                  f.ByteSwap(f.Truncate(f.LoadGPR(i.D.RT + j), INT32_TYPE)));\n  }\n  return 0;\n}\n\nint InstrEmit_stwu(PPCHIRBuilder& f, const InstrData& i) {\n  // EA <- (RA) + EXTS(D)\n  // MEM(EA, 4) <- (RS)[32:63]\n  // RA <- EA\n  Value* ea = CalculateEA_i(f, i.D.RA, XEEXTS16(i.D.DS));\n  f.Store(ea, f.ByteSwap(f.Truncate(f.LoadGPR(i.D.RT), INT32_TYPE)));\n  StoreEA(f, i.D.RA, ea);\n  return 0;\n}\n\nint InstrEmit_stwux(PPCHIRBuilder& f, const InstrData& i) {\n  // EA <- (RA) + (RB)\n  // MEM(EA, 4) <- (RS)[32:63]\n  // RA <- EA\n  Value* ea = CalculateEA(f, i.X.RA, i.X.RB);\n  f.Store(ea, f.ByteSwap(f.Truncate(f.LoadGPR(i.X.RT), INT32_TYPE)));\n  StoreEA(f, i.X.RA, ea);\n  return 0;\n}\n\nint InstrEmit_stwx(PPCHIRBuilder& f, const InstrData& i) {\n  // if RA = 0 then\n  //   b <- 0\n  // else\n  //   b <- (RA)\n  // EA <- b + (RB)\n  // MEM(EA, 4) <- (RS)[32:63]\n  Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB);\n  f.Store(ea, f.ByteSwap(f.Truncate(f.LoadGPR(i.X.RT), INT32_TYPE)));\n  return 0;\n}\n\nint InstrEmit_std(PPCHIRBuilder& f, const InstrData& i) {\n  // if RA = 0 then\n  //   b <- 0\n  // else\n  //   b <- (RA)\n  // EA <- b + EXTS(DS || 0b00)\n  // MEM(EA, 8) <- (RS)\n  Value* b;\n  if (i.DS.RA == 0) {\n    b = f.LoadZeroInt64();\n  } else {\n    b = f.LoadGPR(i.DS.RA);\n  }\n\n  Value* offset = f.LoadConstantInt64(XEEXTS16(i.DS.DS << 2));\n  f.StoreOffset(b, offset, f.ByteSwap(f.LoadGPR(i.DS.RT)));\n  return 0;\n}\n\nint InstrEmit_stdu(PPCHIRBuilder& f, const InstrData& i) {\n  // EA <- (RA) + EXTS(DS || 0b00)\n  // MEM(EA, 8) <- (RS)\n  // RA <- EA\n  Value* ea = CalculateEA_i(f, i.DS.RA, XEEXTS16(i.DS.DS << 2));\n  f.Store(ea, f.ByteSwap(f.LoadGPR(i.DS.RT)));\n  StoreEA(f, i.DS.RA, ea);\n  return 0;\n}\n\nint InstrEmit_stdux(PPCHIRBuilder& f, const InstrData& i) {\n  // EA <- (RA) + (RB)\n  // MEM(EA, 8) <- (RS)\n  // RA <- EA\n  Value* ea = CalculateEA(f, i.X.RA, i.X.RB);\n  f.Store(ea, f.ByteSwap(f.LoadGPR(i.X.RT)));\n  StoreEA(f, i.X.RA, ea);\n  return 0;\n}\n\nint InstrEmit_stdx(PPCHIRBuilder& f, const InstrData& i) {\n  // if RA = 0 then\n  //   b <- 0\n  // else\n  //   b <- (RA)\n  // EA <- b + (RB)\n  // MEM(EA, 8) <- (RS)\n  Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB);\n  f.Store(ea, f.ByteSwap(f.LoadGPR(i.X.RT)));\n  return 0;\n}\n\n// Integer load and store with byte reverse (A-1\n\nint InstrEmit_lhbrx(PPCHIRBuilder& f, const InstrData& i) {\n  // if RA = 0 then\n  //   b <- 0\n  // else\n  //   b <- (RA)\n  // EA <- b + (RB)\n  // RT <- i48.0 || bswap(MEM(EA, 2))\n  Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB);\n  Value* rt = f.ZeroExtend(f.Load(ea, INT16_TYPE), INT64_TYPE);\n  StoreEA(f, i.X.RT, rt);\n  return 0;\n}\n\nint InstrEmit_lwbrx(PPCHIRBuilder& f, const InstrData& i) {\n  // if RA = 0 then\n  //   b <- 0\n  // else\n  //   b <- (RA)\n  // EA <- b + (RB)\n  // RT <- i32.0 || bswap(MEM(EA, 4))\n  Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB);\n  Value* rt = f.ZeroExtend(f.Load(ea, INT32_TYPE), INT64_TYPE);\n  f.StoreGPR(i.X.RT, rt);\n  return 0;\n}\n\nint InstrEmit_ldbrx(PPCHIRBuilder& f, const InstrData& i) {\n  // if RA = 0 then\n  //   b <- 0\n  // else\n  //   b <- (RA)\n  // EA <- b + (RB)\n  // RT <- bswap(MEM(EA, 8))\n  Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB);\n  Value* rt = f.Load(ea, INT64_TYPE);\n  f.StoreGPR(i.X.RT, rt);\n  return 0;\n}\n\nint InstrEmit_sthbrx(PPCHIRBuilder& f, const InstrData& i) {\n  // if RA = 0 then\n  //   b <- 0\n  // else\n  //   b <- (RA)\n  // EA <- b + (RB)\n  // MEM(EA, 2) <- bswap((RS)[48:63])\n  Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB);\n  f.Store(ea, f.Truncate(f.LoadGPR(i.X.RT), INT16_TYPE));\n  return 0;\n}\n\nint InstrEmit_stwbrx(PPCHIRBuilder& f, const InstrData& i) {\n  // if RA = 0 then\n  //   b <- 0\n  // else\n  //   b <- (RA)\n  // EA <- b + (RB)\n  // MEM(EA, 4) <- bswap((RS)[32:63])\n  Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB);\n  f.Store(ea, f.Truncate(f.LoadGPR(i.X.RT), INT32_TYPE));\n  return 0;\n}\n\nint InstrEmit_stdbrx(PPCHIRBuilder& f, const InstrData& i) {\n  // if RA = 0 then\n  //   b <- 0\n  // else\n  //   b <- (RA)\n  // EA <- b + (RB)\n  // MEM(EA, 8) <- bswap(RS)\n  Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB);\n  f.Store(ea, f.LoadGPR(i.X.RT));\n  return 0;\n}\n\n// Integer load and store multiple (A-16)\n\nint InstrEmit_lmw(PPCHIRBuilder& f, const InstrData& i) {\n  Value* b;\n  if (i.D.RA == 0) {\n    b = f.LoadZeroInt64();\n  } else {\n    b = f.LoadGPR(i.D.RA);\n  }\n\n  for (uint32_t j = 0; j < 32 - i.D.RT; ++j) {\n    if (i.D.RT + j == i.D.RA) {\n      continue;\n    }\n    Value* offset = f.LoadConstantInt64(XEEXTS16(i.D.DS) + j * 4);\n    Value* rt = f.ZeroExtend(f.ByteSwap(f.LoadOffset(b, offset, INT32_TYPE)),\n                             INT64_TYPE);\n    f.StoreGPR(i.D.RT + j, rt);\n  }\n  return 0;\n}\n\n// Integer load and store string (A-17)\n\nint InstrEmit_lswi(PPCHIRBuilder& f, const InstrData& i) {\n  XEINSTRNOTIMPLEMENTED();\n  return 1;\n}\n\nint InstrEmit_lswx(PPCHIRBuilder& f, const InstrData& i) {\n  XEINSTRNOTIMPLEMENTED();\n  return 1;\n}\n\nint InstrEmit_stswi(PPCHIRBuilder& f, const InstrData& i) {\n  XEINSTRNOTIMPLEMENTED();\n  return 1;\n}\n\nint InstrEmit_stswx(PPCHIRBuilder& f, const InstrData& i) {\n  XEINSTRNOTIMPLEMENTED();\n  return 1;\n}\n\n// Memory synchronization (A-18)\n\nint InstrEmit_eieio(PPCHIRBuilder& f, const InstrData& i) {\n  f.MemoryBarrier();\n  return 0;\n}\n\nint InstrEmit_sync(PPCHIRBuilder& f, const InstrData& i) {\n  f.MemoryBarrier();\n  return 0;\n}\n\nint InstrEmit_isync(PPCHIRBuilder& f, const InstrData& i) {\n  // XEINSTRNOTIMPLEMENTED();\n  f.Nop();\n  return 0;\n}\n\nint InstrEmit_ldarx(PPCHIRBuilder& f, const InstrData& i) {\n  // if RA = 0 then\n  //   b <- 0\n  // else\n  //   b <- (RA)\n  // EA <- b + (RB)\n  // RESERVE <- 1\n  // RESERVE_LENGTH <- 8\n  // RESERVE_ADDR <- real_addr(EA)\n  // RT <- MEM(EA, 8)\n\n  // NOTE: we assume we are within a global lock.\n  // We could assert here that the block (or its parent) has taken a global lock\n  // already, but I haven't see anything but interrupt callbacks (which are\n  // always under a global lock) do that yet.\n  // We issue a memory barrier here to make sure that we get good values.\n  f.MemoryBarrier();\n\n  Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB);\n  Value* rt = f.ByteSwap(f.Load(ea, INT64_TYPE));\n  f.StoreReserved(rt);\n  f.StoreGPR(i.X.RT, rt);\n  return 0;\n}\n\nint InstrEmit_lwarx(PPCHIRBuilder& f, const InstrData& i) {\n  // if RA = 0 then\n  //   b <- 0\n  // else\n  //   b <- (RA)\n  // EA <- b + (RB)\n  // RESERVE <- 1\n  // RESERVE_LENGTH <- 4\n  // RESERVE_ADDR <- real_addr(EA)\n  // RT <- i32.0 || MEM(EA, 4)\n\n  // NOTE: we assume we are within a global lock.\n  // We could assert here that the block (or its parent) has taken a global lock\n  // already, but I haven't see anything but interrupt callbacks (which are\n  // always under a global lock) do that yet.\n  // We issue a memory barrier here to make sure that we get good values.\n  f.MemoryBarrier();\n\n  Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB);\n  Value* rt = f.ZeroExtend(f.ByteSwap(f.Load(ea, INT32_TYPE)), INT64_TYPE);\n  f.StoreReserved(rt);\n  f.StoreGPR(i.X.RT, rt);\n  return 0;\n}\n\nint InstrEmit_stdcx(PPCHIRBuilder& f, const InstrData& i) {\n  // if RA = 0 then\n  //   b <- 0\n  // else\n  //   b <- (RA)\n  // EA <- b + (RB)\n  // RESERVE stuff...\n  // MEM(EA, 8) <- (RS)\n  // n <- 1 if store performed\n  // CR0[LT GT EQ SO] = 0b00 || n || XER[SO]\n\n  // NOTE: we assume we are within a global lock.\n  // As we have been exclusively executing this entire time, we assume that no\n  // one else could have possibly touched the memory and must always succeed.\n  // We use atomic compare exchange here to support reserved load/store without\n  // being under the global lock (flag disable_global_lock - see mtmsr/mtmsrd).\n  // This will always succeed if under the global lock, however.\n\n  Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB);\n  Value* rt = f.ByteSwap(f.LoadGPR(i.X.RT));\n  Value* res = f.ByteSwap(f.LoadReserved());\n  Value* v = f.AtomicCompareExchange(ea, res, rt);\n  f.StoreContext(offsetof(PPCContext, cr0.cr0_eq), v);\n  f.StoreContext(offsetof(PPCContext, cr0.cr0_lt), f.LoadZeroInt8());\n  f.StoreContext(offsetof(PPCContext, cr0.cr0_gt), f.LoadZeroInt8());\n\n  // Issue memory barrier for when we go out of lock and want others to see our\n  // updates.\n  f.MemoryBarrier();\n\n  return 0;\n}\n\nint InstrEmit_stwcx(PPCHIRBuilder& f, const InstrData& i) {\n  // if RA = 0 then\n  //   b <- 0\n  // else\n  //   b <- (RA)\n  // EA <- b + (RB)\n  // RESERVE stuff...\n  // MEM(EA, 4) <- (RS)[32:63]\n  // n <- 1 if store performed\n  // CR0[LT GT EQ SO] = 0b00 || n || XER[SO]\n\n  // NOTE: we assume we are within a global lock.\n  // As we have been exclusively executing this entire time, we assume that no\n  // one else could have possibly touched the memory and must always succeed.\n  // We use atomic compare exchange here to support reserved load/store without\n  // being under the global lock (flag disable_global_lock - see mtmsr/mtmsrd).\n  // This will always succeed if under the global lock, however.\n\n  Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB);\n  Value* rt = f.ByteSwap(f.Truncate(f.LoadGPR(i.X.RT), INT32_TYPE));\n  Value* res = f.ByteSwap(f.Truncate(f.LoadReserved(), INT32_TYPE));\n  Value* v = f.AtomicCompareExchange(ea, res, rt);\n  f.StoreContext(offsetof(PPCContext, cr0.cr0_eq), v);\n  f.StoreContext(offsetof(PPCContext, cr0.cr0_lt), f.LoadZeroInt8());\n  f.StoreContext(offsetof(PPCContext, cr0.cr0_gt), f.LoadZeroInt8());\n\n  // Issue memory barrier for when we go out of lock and want others to see our\n  // updates.\n  f.MemoryBarrier();\n\n  return 0;\n}\n\n// Floating-point load (A-19)\n\nint InstrEmit_lfd(PPCHIRBuilder& f, const InstrData& i) {\n  // if RA = 0 then\n  //   b <- 0\n  // else\n  //   b <- (RA)\n  // EA <- b + EXTS(D)\n  // FRT <- MEM(EA, 8)\n  Value* ea = CalculateEA_0_i(f, i.D.RA, XEEXTS16(i.D.DS));\n  Value* rt = f.Cast(f.ByteSwap(f.Load(ea, INT64_TYPE)), FLOAT64_TYPE);\n  f.StoreFPR(i.D.RT, rt);\n  return 0;\n}\n\nint InstrEmit_lfdu(PPCHIRBuilder& f, const InstrData& i) {\n  // EA <- (RA) + EXTS(D)\n  // FRT <- MEM(EA, 8)\n  // RA <- EA\n  Value* ea = CalculateEA_i(f, i.D.RA, XEEXTS16(i.D.DS));\n  Value* rt = f.Cast(f.ByteSwap(f.Load(ea, INT64_TYPE)), FLOAT64_TYPE);\n  f.StoreFPR(i.D.RT, rt);\n  StoreEA(f, i.D.RA, ea);\n  return 0;\n}\n\nint InstrEmit_lfdux(PPCHIRBuilder& f, const InstrData& i) {\n  // EA <- (RA) + (RB)\n  // FRT <- MEM(EA, 8)\n  // RA <- EA\n  Value* ea = CalculateEA(f, i.X.RA, i.X.RB);\n  Value* rt = f.Cast(f.ByteSwap(f.Load(ea, INT64_TYPE)), FLOAT64_TYPE);\n  f.StoreFPR(i.X.RT, rt);\n  StoreEA(f, i.X.RA, ea);\n  return 0;\n}\n\nint InstrEmit_lfdx(PPCHIRBuilder& f, const InstrData& i) {\n  // if RA = 0 then\n  //   b <- 0\n  // else\n  //   b <- (RA)\n  // EA <- b + (RB)\n  // FRT <- MEM(EA, 8)\n  Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB);\n  Value* rt = f.Cast(f.ByteSwap(f.Load(ea, INT64_TYPE)), FLOAT64_TYPE);\n  f.StoreFPR(i.X.RT, rt);\n  return 0;\n}\n\nint InstrEmit_lfs(PPCHIRBuilder& f, const InstrData& i) {\n  // if RA = 0 then\n  //   b <- 0\n  // else\n  //   b <- (RA)\n  // EA <- b + EXTS(D)\n  // FRT <- DOUBLE(MEM(EA, 4))\n  Value* ea = CalculateEA_0_i(f, i.D.RA, XEEXTS16(i.D.DS));\n  Value* rt = f.Convert(\n      f.Cast(f.ByteSwap(f.Load(ea, INT32_TYPE)), FLOAT32_TYPE), FLOAT64_TYPE);\n  f.StoreFPR(i.D.RT, rt);\n  return 0;\n}\n\nint InstrEmit_lfsu(PPCHIRBuilder& f, const InstrData& i) {\n  // EA <- (RA) + EXTS(D)\n  // FRT <- DOUBLE(MEM(EA, 4))\n  // RA <- EA\n  Value* ea = CalculateEA_i(f, i.D.RA, XEEXTS16(i.D.DS));\n  Value* rt = f.Convert(\n      f.Cast(f.ByteSwap(f.Load(ea, INT32_TYPE)), FLOAT32_TYPE), FLOAT64_TYPE);\n  f.StoreFPR(i.D.RT, rt);\n  StoreEA(f, i.D.RA, ea);\n  return 0;\n}\n\nint InstrEmit_lfsux(PPCHIRBuilder& f, const InstrData& i) {\n  // EA <- (RA) + (RB)\n  // FRT <- DOUBLE(MEM(EA, 4))\n  // RA <- EA\n  Value* ea = CalculateEA(f, i.X.RA, i.X.RB);\n  Value* rt = f.Convert(\n      f.Cast(f.ByteSwap(f.Load(ea, INT32_TYPE)), FLOAT32_TYPE), FLOAT64_TYPE);\n  f.StoreFPR(i.X.RT, rt);\n  StoreEA(f, i.X.RA, ea);\n  return 0;\n}\n\nint InstrEmit_lfsx(PPCHIRBuilder& f, const InstrData& i) {\n  // if RA = 0 then\n  //   b <- 0\n  // else\n  //   b <- (RA)\n  // EA <- b + (RB)\n  // FRT <- DOUBLE(MEM(EA, 4))\n  Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB);\n  Value* rt = f.Convert(\n      f.Cast(f.ByteSwap(f.Load(ea, INT32_TYPE)), FLOAT32_TYPE), FLOAT64_TYPE);\n  f.StoreFPR(i.X.RT, rt);\n  return 0;\n}\n\n// Floating-point store (A-20)\n\nint InstrEmit_stfd(PPCHIRBuilder& f, const InstrData& i) {\n  // if RA = 0 then\n  //   b <- 0\n  // else\n  //   b <- (RA)\n  // EA <- b + EXTS(D)\n  // MEM(EA, 8) <- (FRS)\n  Value* ea = CalculateEA_0_i(f, i.D.RA, XEEXTS16(i.D.DS));\n  f.Store(ea, f.ByteSwap(f.Cast(f.LoadFPR(i.D.RT), INT64_TYPE)));\n  return 0;\n}\n\nint InstrEmit_stfdu(PPCHIRBuilder& f, const InstrData& i) {\n  // EA <- (RA) + EXTS(D)\n  // MEM(EA, 8) <- (FRS)\n  // RA <- EA\n  Value* ea = CalculateEA_i(f, i.D.RA, XEEXTS16(i.D.DS));\n  f.Store(ea, f.ByteSwap(f.Cast(f.LoadFPR(i.D.RT), INT64_TYPE)));\n  StoreEA(f, i.D.RA, ea);\n  return 0;\n}\n\nint InstrEmit_stfdux(PPCHIRBuilder& f, const InstrData& i) {\n  // EA <- (RA) + (RB)\n  // MEM(EA, 8) <- (FRS)\n  // RA <- EA\n  Value* ea = CalculateEA(f, i.X.RA, i.X.RB);\n  f.Store(ea, f.ByteSwap(f.Cast(f.LoadFPR(i.X.RT), INT64_TYPE)));\n  StoreEA(f, i.X.RA, ea);\n  return 0;\n}\n\nint InstrEmit_stfdx(PPCHIRBuilder& f, const InstrData& i) {\n  // if RA = 0 then\n  //   b <- 0\n  // else\n  //   b <- (RA)\n  // EA <- b + (RB)\n  // MEM(EA, 8) <- (FRS)\n  Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB);\n  f.Store(ea, f.ByteSwap(f.Cast(f.LoadFPR(i.X.RT), INT64_TYPE)));\n  return 0;\n}\n\nint InstrEmit_stfiwx(PPCHIRBuilder& f, const InstrData& i) {\n  // if RA = 0 then\n  //   b <- 0\n  // else\n  //   b <- (RA)\n  // EA <- b + (RB)\n  // MEM(EA, 4) <- (FRS)[32:63]\n  Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB);\n  f.Store(ea, f.ByteSwap(f.Truncate(f.Cast(f.LoadFPR(i.X.RT), INT64_TYPE),\n                                    INT32_TYPE)));\n  return 0;\n}\n\nint InstrEmit_stfs(PPCHIRBuilder& f, const InstrData& i) {\n  // if RA = 0 then\n  //   b <- 0\n  // else\n  //   b <- (RA)\n  // EA <- b + EXTS(D)\n  // MEM(EA, 4) <- SINGLE(FRS)\n  Value* ea = CalculateEA_0_i(f, i.D.RA, XEEXTS16(i.D.DS));\n  f.Store(ea, f.ByteSwap(f.Cast(f.Convert(f.LoadFPR(i.D.RT), FLOAT32_TYPE),\n                                INT32_TYPE)));\n  return 0;\n}\n\nint InstrEmit_stfsu(PPCHIRBuilder& f, const InstrData& i) {\n  // EA <- (RA) + EXTS(D)\n  // MEM(EA, 4) <- SINGLE(FRS)\n  // RA <- EA\n  Value* ea = CalculateEA_i(f, i.D.RA, XEEXTS16(i.D.DS));\n  f.Store(ea, f.ByteSwap(f.Cast(f.Convert(f.LoadFPR(i.D.RT), FLOAT32_TYPE),\n                                INT32_TYPE)));\n  StoreEA(f, i.D.RA, ea);\n  return 0;\n}\n\nint InstrEmit_stfsux(PPCHIRBuilder& f, const InstrData& i) {\n  // EA <- (RA) + (RB)\n  // MEM(EA, 4) <- SINGLE(FRS)\n  // RA <- EA\n  Value* ea = CalculateEA(f, i.X.RA, i.X.RB);\n  f.Store(ea, f.ByteSwap(f.Cast(f.Convert(f.LoadFPR(i.X.RT), FLOAT32_TYPE),\n                                INT32_TYPE)));\n  StoreEA(f, i.X.RA, ea);\n  return 0;\n}\n\nint InstrEmit_stfsx(PPCHIRBuilder& f, const InstrData& i) {\n  // if RA = 0 then\n  //   b <- 0\n  // else\n  //   b <- (RA)\n  // EA <- b + (RB)\n  // MEM(EA, 4) <- SINGLE(FRS)\n  Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB);\n  f.Store(ea, f.ByteSwap(f.Cast(f.Convert(f.LoadFPR(i.X.RT), FLOAT32_TYPE),\n                                INT32_TYPE)));\n  return 0;\n}\n\n// Cache management (A-27)\n// dcbf, dcbst, dcbt, dcbtst work with 128-byte cache lines, not 32-byte cache\n// blocks, on the Xenon:\n// https://github.com/ValveSoftware/source-sdk-2013/blob/master/mp/src/mathlib/sseconst.cpp#L321\n// https://randomascii.wordpress.com/2018/01/07/finding-a-cpu-design-bug-in-the-xbox-360/\n\nint InstrEmit_dcbf(PPCHIRBuilder& f, const InstrData& i) {\n  Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB);\n  f.CacheControl(ea, 128,\n                 CacheControlType::CACHE_CONTROL_TYPE_DATA_STORE_AND_FLUSH);\n  return 0;\n}\n\nint InstrEmit_dcbst(PPCHIRBuilder& f, const InstrData& i) {\n  Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB);\n  f.CacheControl(ea, 128, CacheControlType::CACHE_CONTROL_TYPE_DATA_STORE);\n  return 0;\n}\n\nint InstrEmit_dcbt(PPCHIRBuilder& f, const InstrData& i) {\n  Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB);\n  f.CacheControl(ea, 128, CacheControlType::CACHE_CONTROL_TYPE_DATA_TOUCH);\n  return 0;\n}\n\nint InstrEmit_dcbtst(PPCHIRBuilder& f, const InstrData& i) {\n  Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB);\n  f.CacheControl(ea, 128,\n                 CacheControlType::CACHE_CONTROL_TYPE_DATA_TOUCH_FOR_STORE);\n  return 0;\n}\n\nint InstrEmit_dcbz(PPCHIRBuilder& f, const InstrData& i) {\n  // EA <- (RA) + (RB)\n  // memset(EA & ~31, 0, 32)\n  Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB);\n  // dcbz - 32 byte set\n  int block_size = 32;\n  int address_mask = ~31;\n  f.Memset(f.And(ea, f.LoadConstantInt64(address_mask)), f.LoadZeroInt8(),\n           f.LoadConstantInt64(block_size));\n  return 0;\n}\n\nint InstrEmit_dcbz128(PPCHIRBuilder& f, const InstrData& i) {\n  // EA <- (RA) + (RB)\n  // memset(EA & ~31, 0, 32)\n  Value* ea = CalculateEA_0(f, i.X.RA, i.X.RB);\n  // dcbz128 - 128 byte set\n  int block_size = 128;\n  int address_mask = ~127;\n  f.Memset(f.And(ea, f.LoadConstantInt64(address_mask)), f.LoadZeroInt8(),\n           f.LoadConstantInt64(block_size));\n  return 0;\n}\n\nint InstrEmit_icbi(PPCHIRBuilder& f, const InstrData& i) {\n  // XEINSTRNOTIMPLEMENTED();\n  f.Nop();\n  return 0;\n}\n\nvoid RegisterEmitCategoryMemory() {\n  XEREGISTERINSTR(lbz);\n  XEREGISTERINSTR(lbzu);\n  XEREGISTERINSTR(lbzux);\n  XEREGISTERINSTR(lbzx);\n  XEREGISTERINSTR(lha);\n  XEREGISTERINSTR(lhau);\n  XEREGISTERINSTR(lhaux);\n  XEREGISTERINSTR(lhax);\n  XEREGISTERINSTR(lhz);\n  XEREGISTERINSTR(lhzu);\n  XEREGISTERINSTR(lhzux);\n  XEREGISTERINSTR(lhzx);\n  XEREGISTERINSTR(lwa);\n  XEREGISTERINSTR(lwaux);\n  XEREGISTERINSTR(lwax);\n  XEREGISTERINSTR(lwz);\n  XEREGISTERINSTR(lwzu);\n  XEREGISTERINSTR(lwzux);\n  XEREGISTERINSTR(lwzx);\n  XEREGISTERINSTR(ld);\n  XEREGISTERINSTR(ldu);\n  XEREGISTERINSTR(ldux);\n  XEREGISTERINSTR(ldx);\n  XEREGISTERINSTR(stb);\n  XEREGISTERINSTR(stbu);\n  XEREGISTERINSTR(stbux);\n  XEREGISTERINSTR(stbx);\n  XEREGISTERINSTR(sth);\n  XEREGISTERINSTR(sthu);\n  XEREGISTERINSTR(sthux);\n  XEREGISTERINSTR(sthx);\n  XEREGISTERINSTR(stw);\n  XEREGISTERINSTR(stwu);\n  XEREGISTERINSTR(stwux);\n  XEREGISTERINSTR(stwx);\n  XEREGISTERINSTR(std);\n  XEREGISTERINSTR(stdu);\n  XEREGISTERINSTR(stdux);\n  XEREGISTERINSTR(stdx);\n  XEREGISTERINSTR(lhbrx);\n  XEREGISTERINSTR(lwbrx);\n  XEREGISTERINSTR(ldbrx);\n  XEREGISTERINSTR(sthbrx);\n  XEREGISTERINSTR(stwbrx);\n  XEREGISTERINSTR(stdbrx);\n  XEREGISTERINSTR(lmw);\n  XEREGISTERINSTR(stmw);\n  XEREGISTERINSTR(lswi);\n  XEREGISTERINSTR(lswx);\n  XEREGISTERINSTR(stswi);\n  XEREGISTERINSTR(stswx);\n  XEREGISTERINSTR(eieio);\n  XEREGISTERINSTR(sync);\n  XEREGISTERINSTR(isync);\n  XEREGISTERINSTR(ldarx);\n  XEREGISTERINSTR(lwarx);\n  XEREGISTERINSTR(stdcx);\n  XEREGISTERINSTR(stwcx);\n  XEREGISTERINSTR(lfd);\n  XEREGISTERINSTR(lfdu);\n  XEREGISTERINSTR(lfdux);\n  XEREGISTERINSTR(lfdx);\n  XEREGISTERINSTR(lfs);\n  XEREGISTERINSTR(lfsu);\n  XEREGISTERINSTR(lfsux);\n  XEREGISTERINSTR(lfsx);\n  XEREGISTERINSTR(stfd);\n  XEREGISTERINSTR(stfdu);\n  XEREGISTERINSTR(stfdux);\n  XEREGISTERINSTR(stfdx);\n  XEREGISTERINSTR(stfiwx);\n  XEREGISTERINSTR(stfs);\n  XEREGISTERINSTR(stfsu);\n  XEREGISTERINSTR(stfsux);\n  XEREGISTERINSTR(stfsx);\n  XEREGISTERINSTR(dcbf);\n  XEREGISTERINSTR(dcbst);\n  XEREGISTERINSTR(dcbt);\n  XEREGISTERINSTR(dcbtst);\n  XEREGISTERINSTR(dcbz);\n  XEREGISTERINSTR(dcbz128);\n  XEREGISTERINSTR(icbi);\n}\n\n}  // namespace ppc\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/ppc/ppc_frontend.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/ppc/ppc_frontend.h\"\n\n#include \"xenia/base/atomic.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/cpu/ppc/ppc_context.h\"\n#include \"xenia/cpu/ppc/ppc_emit.h\"\n#include \"xenia/cpu/ppc/ppc_opcode_info.h\"\n#include \"xenia/cpu/ppc/ppc_translator.h\"\n#include \"xenia/cpu/processor.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace ppc {\n\nvoid InitializeIfNeeded();\nvoid CleanupOnShutdown();\n\nvoid InitializeIfNeeded() {\n  static bool has_initialized = false;\n  if (has_initialized) {\n    return;\n  }\n  has_initialized = true;\n\n  RegisterEmitCategoryAltivec();\n  RegisterEmitCategoryALU();\n  RegisterEmitCategoryControl();\n  RegisterEmitCategoryFPU();\n  RegisterEmitCategoryMemory();\n\n  atexit(CleanupOnShutdown);\n}\n\nvoid CleanupOnShutdown() {}\n\nPPCFrontend::PPCFrontend(Processor* processor) : processor_(processor) {\n  InitializeIfNeeded();\n}\n\nPPCFrontend::~PPCFrontend() {\n  // Force cleanup now before we deinit.\n  translator_pool_.Reset();\n}\n\nMemory* PPCFrontend::memory() const { return processor_->memory(); }\n\n// Checks the state of the global lock and sets scratch to the current MSR\n// value.\nvoid CheckGlobalLock(PPCContext* ppc_context, void* arg0, void* arg1) {\n  auto global_mutex = reinterpret_cast<std::recursive_mutex*>(arg0);\n  auto global_lock_count = reinterpret_cast<int32_t*>(arg1);\n  std::lock_guard<std::recursive_mutex> lock(*global_mutex);\n  ppc_context->scratch = *global_lock_count ? 0 : 0x8000;\n}\n\n// Enters the global lock. Safe to recursion.\nvoid EnterGlobalLock(PPCContext* ppc_context, void* arg0, void* arg1) {\n  auto global_mutex = reinterpret_cast<std::recursive_mutex*>(arg0);\n  auto global_lock_count = reinterpret_cast<int32_t*>(arg1);\n  global_mutex->lock();\n  xe::atomic_inc(global_lock_count);\n}\n\n// Leaves the global lock. Safe to recursion.\nvoid LeaveGlobalLock(PPCContext* ppc_context, void* arg0, void* arg1) {\n  auto global_mutex = reinterpret_cast<std::recursive_mutex*>(arg0);\n  auto global_lock_count = reinterpret_cast<int32_t*>(arg1);\n  auto new_lock_count = xe::atomic_dec(global_lock_count);\n  assert_true(new_lock_count >= 0);\n  global_mutex->unlock();\n}\n\nvoid SyscallHandler(PPCContext* ppc_context, void* arg0, void* arg1) {\n  uint64_t syscall_number = ppc_context->r[0];\n  switch (syscall_number) {\n    default:\n      assert_unhandled_case(syscall_number);\n      XELOGE(\"Unhandled syscall {}!\", syscall_number);\n      break;\n#pragma warning(suppress : 4065)\n  }\n}\n\nbool PPCFrontend::Initialize() {\n  void* arg0 = reinterpret_cast<void*>(&xe::global_critical_region::mutex());\n  void* arg1 = reinterpret_cast<void*>(&builtins_.global_lock_count);\n  builtins_.check_global_lock =\n      processor_->DefineBuiltin(\"CheckGlobalLock\", CheckGlobalLock, arg0, arg1);\n  builtins_.enter_global_lock =\n      processor_->DefineBuiltin(\"EnterGlobalLock\", EnterGlobalLock, arg0, arg1);\n  builtins_.leave_global_lock =\n      processor_->DefineBuiltin(\"LeaveGlobalLock\", LeaveGlobalLock, arg0, arg1);\n  builtins_.syscall_handler = processor_->DefineBuiltin(\n      \"SyscallHandler\", SyscallHandler, nullptr, nullptr);\n  return true;\n}\n\nbool PPCFrontend::DeclareFunction(GuestFunction* function) {\n  // Could scan or something here.\n  // Could also check to see if it's a well-known function type and classify\n  // for later.\n  // Could also kick off a precompiler, since we know it's likely the function\n  // will be demanded soon.\n  return true;\n}\n\nbool PPCFrontend::DefineFunction(GuestFunction* function,\n                                 uint32_t debug_info_flags) {\n  auto translator = translator_pool_.Allocate(this);\n  bool result = translator->Translate(function, debug_info_flags);\n  translator_pool_.Release(translator);\n  return result;\n}\n\n}  // namespace ppc\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/ppc/ppc_frontend.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_PPC_PPC_FRONTEND_H_\n#define XENIA_CPU_PPC_PPC_FRONTEND_H_\n\n#include <memory>\n\n#include \"xenia/base/type_pool.h\"\n#include \"xenia/cpu/function.h\"\n#include \"xenia/memory.h\"\n\nnamespace xe {\nnamespace cpu {\nclass Processor;\n}  // namespace cpu\n}  // namespace xe\n\nnamespace xe {\nnamespace cpu {\nnamespace ppc {\n\nclass PPCTranslator;\n\nstruct PPCBuiltins {\n  int32_t global_lock_count;\n  Function* check_global_lock;\n  Function* enter_global_lock;\n  Function* leave_global_lock;\n  Function* syscall_handler;\n};\n\nclass PPCFrontend {\n public:\n  explicit PPCFrontend(Processor* processor);\n  ~PPCFrontend();\n\n  bool Initialize();\n\n  Processor* processor() const { return processor_; }\n  Memory* memory() const;\n  PPCBuiltins* builtins() { return &builtins_; }\n\n  bool DeclareFunction(GuestFunction* function);\n  bool DefineFunction(GuestFunction* function, uint32_t debug_info_flags);\n\n private:\n  Processor* processor_;\n  PPCBuiltins builtins_ = {0};\n  TypePool<PPCTranslator, PPCFrontend*> translator_pool_;\n};\n\n}  // namespace ppc\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_PPC_PPC_FRONTEND_H_\n"
  },
  {
    "path": "src/xenia/cpu/ppc/ppc_hir_builder.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/ppc/ppc_hir_builder.h\"\n\n#include <stddef.h>\n#include <cstring>\n\n#include \"third_party/fmt/include/fmt/format.h\"\n\n#include \"xenia/base/byte_order.h\"\n#include \"xenia/base/cvar.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/memory.h\"\n#include \"xenia/base/profiling.h\"\n#include \"xenia/base/string.h\"\n#include \"xenia/cpu/cpu_flags.h\"\n#include \"xenia/cpu/hir/label.h\"\n#include \"xenia/cpu/ppc/ppc_context.h\"\n#include \"xenia/cpu/ppc/ppc_decode_data.h\"\n#include \"xenia/cpu/ppc/ppc_frontend.h\"\n#include \"xenia/cpu/ppc/ppc_opcode_info.h\"\n#include \"xenia/cpu/processor.h\"\n\nDEFINE_bool(\n    break_on_unimplemented_instructions, true,\n    \"Break to the host debugger (or crash if no debugger attached) if an \"\n    \"unimplemented PowerPC instruction is encountered.\",\n    \"CPU\");\n\nnamespace xe {\nnamespace cpu {\nnamespace ppc {\n\n// TODO(benvanik): remove when enums redefined.\nusing namespace xe::cpu::hir;\n\nusing xe::cpu::hir::Label;\nusing xe::cpu::hir::TypeName;\nusing xe::cpu::hir::Value;\n\n// The number of times each opcode has been translated.\n// Accumulated across the entire run.\nuint32_t opcode_translation_counts[static_cast<int>(PPCOpcode::kInvalid)] = {0};\n\nvoid DumpAllOpcodeCounts() {\n  StringBuffer sb;\n  sb.Append(\"Instruction translation counts:\\n\");\n  for (size_t i = 0; i < xe::countof(opcode_translation_counts); ++i) {\n    auto opcode = static_cast<PPCOpcode>(i);\n    auto& opcode_info = GetOpcodeInfo(opcode);\n    auto& disasm_info = GetOpcodeDisasmInfo(opcode);\n    auto translation_count = opcode_translation_counts[i];\n    if (translation_count) {\n      sb.AppendFormat(\"{:8d} : {}\\n\", translation_count, disasm_info.name);\n    }\n  }\n  fprintf(stdout, \"%s\", sb.to_string().c_str());\n  fflush(stdout);\n}\n\nPPCHIRBuilder::PPCHIRBuilder(PPCFrontend* frontend)\n    : HIRBuilder(), frontend_(frontend), comment_buffer_(4096) {}\n\nPPCHIRBuilder::~PPCHIRBuilder() = default;\n\nPPCBuiltins* PPCHIRBuilder::builtins() const { return frontend_->builtins(); }\n\nvoid PPCHIRBuilder::Reset() {\n  function_ = nullptr;\n  start_address_ = 0;\n  instr_count_ = 0;\n  instr_offset_list_ = NULL;\n  label_list_ = NULL;\n  with_debug_info_ = false;\n  HIRBuilder::Reset();\n}\n\nbool PPCHIRBuilder::Emit(GuestFunction* function, uint32_t flags) {\n  SCOPE_profile_cpu_f(\"cpu\");\n\n  Memory* memory = frontend_->memory();\n\n  function_ = function;\n  start_address_ = function_->address();\n  instr_count_ = (function_->end_address() - function_->address()) / 4 + 1;\n\n  with_debug_info_ = (flags & EMIT_DEBUG_COMMENTS) == EMIT_DEBUG_COMMENTS;\n  if (with_debug_info_) {\n    CommentFormat(\"{} fn {:08X}-{:08X} {}\", function_->module()->name().c_str(),\n                  function_->address(), function_->end_address(),\n                  function_->name().c_str());\n  }\n\n  // Allocate offset list.\n  // This is used to quickly map labels to instructions.\n  // The list is built as the instructions are traversed, with the values\n  // being the previous HIR Instr before the given instruction. An\n  // instruction may have a label assigned to it if it hasn't been hit\n  // yet.\n  size_t list_size = instr_count_ * sizeof(void*);\n  instr_offset_list_ = (Instr**)arena_->Alloc(list_size, alignof(void*));\n  label_list_ = (Label**)arena_->Alloc(list_size, alignof(void*));\n  std::memset(instr_offset_list_, 0, list_size);\n  std::memset(label_list_, 0, list_size);\n\n  // Always mark entry with label.\n  label_list_[0] = NewLabel();\n\n  uint32_t start_address = function_->address();\n  uint32_t end_address = function_->end_address();\n  for (uint32_t address = start_address, offset = 0; address <= end_address;\n       address += 4, offset++) {\n    trace_info_.dest_count = 0;\n    uint32_t code =\n        xe::load_and_swap<uint32_t>(memory->TranslateVirtual(address));\n    auto opcode = LookupOpcode(code);\n    auto& opcode_info = GetOpcodeInfo(opcode);\n\n    // Mark label, if we were assigned one earlier on in the walk.\n    // We may still get a label, but it'll be inserted by LookupLabel\n    // as needed.\n    Label* label = label_list_[offset];\n    if (label) {\n      MarkLabel(label);\n    }\n\n    Instr* first_instr = 0;\n    if (with_debug_info_) {\n      if (label) {\n        AnnotateLabel(address, label);\n      }\n      comment_buffer_.Reset();\n      comment_buffer_.AppendFormat(\"{:08X} {:08X} \", address, code);\n      DisasmPPC(address, code, &comment_buffer_);\n      Comment(comment_buffer_);\n      first_instr = last_instr();\n    }\n\n    // Mark source offset for debugging.\n    // We could omit this if we never wanted to debug.\n    SourceOffset(address);\n    if (!first_instr) {\n      first_instr = last_instr();\n    }\n\n    // Stash instruction offset. It's either the SOURCE_OFFSET or the COMMENT.\n    instr_offset_list_[offset] = first_instr;\n\n    if (opcode == PPCOpcode::kInvalid) {\n      XELOGE(\"Invalid instruction {:08X} {:08X}\", address, code);\n      Comment(\"INVALID!\");\n      // TraceInvalidInstruction(i);\n      continue;\n    }\n    ++opcode_translation_counts[static_cast<int>(opcode)];\n\n    // Synchronize the PPC context as required.\n    // This will ensure all registers are saved to the PPC context before this\n    // instruction executes.\n    if (opcode_info.type == PPCOpcodeType::kSync) {\n      ContextBarrier();\n    }\n\n    MaybeBreakOnInstruction(address);\n\n    InstrData i;\n    i.address = address;\n    i.code = code;\n    i.opcode = opcode;\n    i.opcode_info = &opcode_info;\n    if (!opcode_info.emit || opcode_info.emit(*this, i)) {\n      auto& disasm_info = GetOpcodeDisasmInfo(opcode);\n      XELOGE(\n          \"Unimplemented instr {:08X} {:08X} {} - report the game to Xenia \"\n          \"developers; to skip, disable break_on_unimplemented_instructions\",\n          address, code, disasm_info.name);\n      Comment(\"UNIMPLEMENTED!\");\n      if (cvars::break_on_unimplemented_instructions) {\n        DebugBreak();\n      }\n    }\n  }\n\n  if (false) {\n    DumpAllOpcodeCounts();\n  }\n\n  return Finalize();\n}\n\nvoid PPCHIRBuilder::MaybeBreakOnInstruction(uint32_t address) {\n  if (address != cvars::break_on_instruction) {\n    return;\n  }\n\n  Comment(\"--break-on-instruction target\");\n\n  if (cvars::break_condition_gpr < 0) {\n    DebugBreak();\n    return;\n  }\n\n  auto left = LoadGPR(cvars::break_condition_gpr);\n  auto right = LoadConstantUint64(cvars::break_condition_value);\n  if (cvars::break_condition_truncate) {\n    left = Truncate(left, INT32_TYPE);\n    right = Truncate(right, INT32_TYPE);\n  }\n\n  auto op = cvars::break_condition_op.c_str();\n  // TODO(rick): table?\n  if (xe_strcasecmp(op, \"eq\") == 0) {\n    TrapTrue(CompareEQ(left, right));\n  } else if (xe_strcasecmp(op, \"ne\") == 0) {\n    TrapTrue(CompareNE(left, right));\n  } else if (xe_strcasecmp(op, \"slt\") == 0) {\n    TrapTrue(CompareSLT(left, right));\n  } else if (xe_strcasecmp(op, \"sle\") == 0) {\n    TrapTrue(CompareSLE(left, right));\n  } else if (xe_strcasecmp(op, \"sgt\") == 0) {\n    TrapTrue(CompareSGT(left, right));\n  } else if (xe_strcasecmp(op, \"sge\") == 0) {\n    TrapTrue(CompareSGE(left, right));\n  } else if (xe_strcasecmp(op, \"ult\") == 0) {\n    TrapTrue(CompareULT(left, right));\n  } else if (xe_strcasecmp(op, \"ule\") == 0) {\n    TrapTrue(CompareULE(left, right));\n  } else if (xe_strcasecmp(op, \"ugt\") == 0) {\n    TrapTrue(CompareUGT(left, right));\n  } else if (xe_strcasecmp(op, \"uge\") == 0) {\n    TrapTrue(CompareUGE(left, right));\n  } else {\n    assert_always();\n  }\n}\n\nvoid PPCHIRBuilder::AnnotateLabel(uint32_t address, Label* label) {\n  char name_buffer[13];\n  auto format_result = fmt::format_to_n(name_buffer, 12, \"loc_{:08X}\", address);\n  name_buffer[format_result.size] = '\\0';\n  label->name = (char*)arena_->Alloc(sizeof(name_buffer), 1);\n  memcpy(label->name, name_buffer, sizeof(name_buffer));\n}\n\nFunction* PPCHIRBuilder::LookupFunction(uint32_t address) {\n  return frontend_->processor()->LookupFunction(address);\n}\n\nLabel* PPCHIRBuilder::LookupLabel(uint32_t address) {\n  if (address < start_address_) {\n    return nullptr;\n  }\n  size_t offset = (address - start_address_) / 4;\n  if (offset >= instr_count_) {\n    return nullptr;\n  }\n  Label* label = label_list_[offset];\n  if (label) {\n    return label;\n  }\n  // No label. If we haven't yet hit the instruction in the walk\n  // then create a label. Otherwise, we must go back and insert\n  // the label.\n  label = NewLabel();\n  label_list_[offset] = label;\n  Instr* instr = instr_offset_list_[offset];\n  if (instr) {\n    if (instr->prev) {\n      // Insert label, breaking up existing instructions.\n      InsertLabel(label, instr->prev);\n    } else {\n      // Instruction is at the head of a block, so just add the label.\n      MarkLabel(label, instr->block);\n    }\n\n    // Annotate the label, as we won't do it later.\n    if (with_debug_info_) {\n      AnnotateLabel(address, label);\n    }\n  }\n  return label;\n}\n\n// Value* PPCHIRBuilder::LoadXER() {\n//}\n//\n// void PPCHIRBuilder::StoreXER(Value* value) {\n//}\n\nValue* PPCHIRBuilder::LoadLR() {\n  return LoadContext(offsetof(PPCContext, lr), INT64_TYPE);\n}\n\nvoid PPCHIRBuilder::StoreLR(Value* value) {\n  assert_true(value->type == INT64_TYPE);\n  StoreContext(offsetof(PPCContext, lr), value);\n\n  auto& trace_reg = trace_info_.dests[trace_info_.dest_count++];\n  trace_reg.reg = 64;\n  trace_reg.value = value;\n}\n\nValue* PPCHIRBuilder::LoadCTR() {\n  return LoadContext(offsetof(PPCContext, ctr), INT64_TYPE);\n}\n\nvoid PPCHIRBuilder::StoreCTR(Value* value) {\n  assert_true(value->type == INT64_TYPE);\n  StoreContext(offsetof(PPCContext, ctr), value);\n\n  auto& trace_reg = trace_info_.dests[trace_info_.dest_count++];\n  trace_reg.reg = 65;\n  trace_reg.value = value;\n}\n\nValue* PPCHIRBuilder::LoadCR() {\n  // All bits. This is expensive, but seems to be less used than the\n  // field-specific LoadCR.\n  Value* v = LoadCR(0);\n  for (int i = 1; i <= 7; ++i) {\n    v = Or(v, LoadCR(i));\n  }\n  return v;\n}\n\nValue* PPCHIRBuilder::LoadCR(uint32_t n) {\n  // Construct the entire word of just the bits we care about.\n  // This makes it easier for the optimizer to exclude things, though\n  // we could be even more clever and watch sequences.\n  Value* v = Shl(ZeroExtend(LoadContext(offsetof(PPCContext, cr0) + (4 * n) + 0,\n                                        INT8_TYPE),\n                            INT64_TYPE),\n                 4 * (7 - n) + 3);\n  v = Or(v, Shl(ZeroExtend(LoadContext(offsetof(PPCContext, cr0) + (4 * n) + 1,\n                                       INT8_TYPE),\n                           INT64_TYPE),\n                4 * (7 - n) + 2));\n  v = Or(v, Shl(ZeroExtend(LoadContext(offsetof(PPCContext, cr0) + (4 * n) + 2,\n                                       INT8_TYPE),\n                           INT64_TYPE),\n                4 * (7 - n) + 1));\n  v = Or(v, Shl(ZeroExtend(LoadContext(offsetof(PPCContext, cr0) + (4 * n) + 3,\n                                       INT8_TYPE),\n                           INT64_TYPE),\n                4 * (7 - n) + 0));\n  return v;\n}\n\nValue* PPCHIRBuilder::LoadCRField(uint32_t n, uint32_t bit) {\n  return LoadContext(offsetof(PPCContext, cr0) + (4 * n) + bit, INT8_TYPE);\n}\n\nvoid PPCHIRBuilder::StoreCR(Value* value) {\n  // All bits. This is expensive, but seems to be less used than the\n  // field-specific StoreCR.\n  for (int i = 0; i <= 7; ++i) {\n    StoreCR(i, value);\n  }\n}\n\nvoid PPCHIRBuilder::StoreCR(uint32_t n, Value* value) {\n  // Pull out the bits we are interested in.\n  // Optimization passes will kill any unneeded stores (mostly).\n  StoreContext(offsetof(PPCContext, cr0) + (4 * n) + 0,\n               And(Truncate(Shr(value, 4 * (7 - n) + 3), INT8_TYPE),\n                   LoadConstantUint8(1)));\n  StoreContext(offsetof(PPCContext, cr0) + (4 * n) + 1,\n               And(Truncate(Shr(value, 4 * (7 - n) + 2), INT8_TYPE),\n                   LoadConstantUint8(1)));\n  StoreContext(offsetof(PPCContext, cr0) + (4 * n) + 2,\n               And(Truncate(Shr(value, 4 * (7 - n) + 1), INT8_TYPE),\n                   LoadConstantUint8(1)));\n  StoreContext(offsetof(PPCContext, cr0) + (4 * n) + 3,\n               And(Truncate(Shr(value, 4 * (7 - n) + 0), INT8_TYPE),\n                   LoadConstantUint8(1)));\n}\n\nvoid PPCHIRBuilder::StoreCRField(uint32_t n, uint32_t bit, Value* value) {\n  StoreContext(offsetof(PPCContext, cr0) + (4 * n) + bit, value);\n\n  // TODO(benvanik): trace CR.\n}\n\nvoid PPCHIRBuilder::UpdateCR(uint32_t n, Value* lhs, bool is_signed) {\n  UpdateCR(n, Truncate(lhs, INT32_TYPE), LoadZeroInt32(), is_signed);\n}\n\nvoid PPCHIRBuilder::UpdateCR(uint32_t n, Value* lhs, Value* rhs,\n                             bool is_signed) {\n  if (is_signed) {\n    Value* lt = CompareSLT(lhs, rhs);\n    StoreContext(offsetof(PPCContext, cr0) + (4 * n) + 0, lt);\n    Value* gt = CompareSGT(lhs, rhs);\n    StoreContext(offsetof(PPCContext, cr0) + (4 * n) + 1, gt);\n  } else {\n    Value* lt = CompareULT(lhs, rhs);\n    StoreContext(offsetof(PPCContext, cr0) + (4 * n) + 0, lt);\n    Value* gt = CompareUGT(lhs, rhs);\n    StoreContext(offsetof(PPCContext, cr0) + (4 * n) + 1, gt);\n  }\n  Value* eq = CompareEQ(lhs, rhs);\n  StoreContext(offsetof(PPCContext, cr0) + (4 * n) + 2, eq);\n\n  // Value* so = AllocValue(UINT8_TYPE);\n  // StoreContext(offsetof(PPCContext, cr) + (4 * n) + 3, so);\n\n  // TOOD(benvanik): trace CR.\n}\n\nvoid PPCHIRBuilder::UpdateCR6(Value* src_value) {\n  // Testing for all 1's and all 0's.\n  // if (Rc) CR6 = all_equal | 0 | none_equal | 0\n  // TODO(benvanik): efficient instruction?\n  StoreContext(offsetof(PPCContext, cr6.cr6_1), LoadZeroInt8());\n  StoreContext(offsetof(PPCContext, cr6.cr6_3), LoadZeroInt8());\n  StoreContext(offsetof(PPCContext, cr6.cr6_all_equal),\n               IsFalse(Not(src_value)));\n  StoreContext(offsetof(PPCContext, cr6.cr6_none_equal), IsFalse(src_value));\n\n  // TOOD(benvanik): trace CR.\n}\n\nValue* PPCHIRBuilder::LoadFPSCR() {\n  return LoadContext(offsetof(PPCContext, fpscr), INT32_TYPE);\n}\n\nvoid PPCHIRBuilder::StoreFPSCR(Value* value) {\n  assert_true(value->type == INT32_TYPE);\n  StoreContext(offsetof(PPCContext, fpscr), value);\n\n  auto& trace_reg = trace_info_.dests[trace_info_.dest_count++];\n  trace_reg.reg = 67;\n  trace_reg.value = value;\n}\n\nvoid PPCHIRBuilder::UpdateFPSCR(Value* result, bool update_cr1) {\n  // TODO(benvanik): detect overflow and nan cases.\n  // fx and vx are the most important.\n  Value* fx = LoadConstantInt8(0);\n  Value* fex = LoadConstantInt8(0);\n  Value* vx = LoadConstantInt8(0);\n  Value* ox = LoadConstantInt8(0);\n\n  if (update_cr1) {\n    // Store into the CR1 field.\n    // We do this instead of just calling CopyFPSCRToCR1 so that we don't\n    // have to read back the bits and do shifting work.\n    StoreContext(offsetof(PPCContext, cr1.cr1_fx), fx);\n    StoreContext(offsetof(PPCContext, cr1.cr1_fex), fex);\n    StoreContext(offsetof(PPCContext, cr1.cr1_vx), vx);\n    StoreContext(offsetof(PPCContext, cr1.cr1_ox), ox);\n  }\n\n  // Generate our new bits.\n  Value* new_bits = Shl(ZeroExtend(fx, INT32_TYPE), 31);\n  new_bits = Or(new_bits, Shl(ZeroExtend(fex, INT32_TYPE), 30));\n  new_bits = Or(new_bits, Shl(ZeroExtend(vx, INT32_TYPE), 29));\n  new_bits = Or(new_bits, Shl(ZeroExtend(ox, INT32_TYPE), 28));\n\n  // Mix into fpscr while preserving sticky bits (FX and OX).\n  Value* bits = LoadFPSCR();\n  bits = Or(And(bits, LoadConstantUint32(0x9FFFFFFF)), new_bits);\n  StoreFPSCR(bits);\n}\n\nvoid PPCHIRBuilder::CopyFPSCRToCR1() {\n  // Pull out of FPSCR.\n  Value* fpscr = LoadFPSCR();\n  StoreContext(offsetof(PPCContext, cr1.cr1_fx),\n               And(Truncate(Shr(fpscr, 31), INT8_TYPE), LoadConstantInt8(1)));\n  StoreContext(offsetof(PPCContext, cr1.cr1_fex),\n               And(Truncate(Shr(fpscr, 30), INT8_TYPE), LoadConstantInt8(1)));\n  StoreContext(offsetof(PPCContext, cr1.cr1_vx),\n               And(Truncate(Shr(fpscr, 29), INT8_TYPE), LoadConstantInt8(1)));\n  StoreContext(offsetof(PPCContext, cr1.cr1_ox),\n               And(Truncate(Shr(fpscr, 28), INT8_TYPE), LoadConstantInt8(1)));\n}\n\nValue* PPCHIRBuilder::LoadXER() {\n  Value* v = Shl(ZeroExtend(LoadCA(), INT64_TYPE), 29);\n  // TODO(benvanik): construct with other flags; overflow, etc?\n  return v;\n}\n\nvoid PPCHIRBuilder::StoreXER(Value* value) {\n  // TODO(benvanik): use other fields? For now, just pull out CA.\n  StoreCA(Truncate(And(Shr(value, 29), LoadConstantInt64(1)), INT8_TYPE));\n}\n\nValue* PPCHIRBuilder::LoadCA() {\n  return LoadContext(offsetof(PPCContext, xer_ca), INT8_TYPE);\n}\n\nvoid PPCHIRBuilder::StoreCA(Value* value) {\n  assert_true(value->type == INT8_TYPE);\n  StoreContext(offsetof(PPCContext, xer_ca), value);\n\n  auto& trace_reg = trace_info_.dests[trace_info_.dest_count++];\n  trace_reg.reg = 66;\n  trace_reg.value = value;\n}\n\nValue* PPCHIRBuilder::LoadSAT() {\n  return LoadContext(offsetof(PPCContext, vscr_sat), INT8_TYPE);\n}\n\nvoid PPCHIRBuilder::StoreSAT(Value* value) {\n  value = Truncate(value, INT8_TYPE);\n  StoreContext(offsetof(PPCContext, vscr_sat), value);\n\n  auto& trace_reg = trace_info_.dests[trace_info_.dest_count++];\n  trace_reg.reg = 44;\n  trace_reg.value = value;\n}\n\nValue* PPCHIRBuilder::LoadGPR(uint32_t reg) {\n  return LoadContext(offsetof(PPCContext, r) + reg * 8, INT64_TYPE);\n}\n\nvoid PPCHIRBuilder::StoreGPR(uint32_t reg, Value* value) {\n  assert_true(value->type == INT64_TYPE);\n  StoreContext(offsetof(PPCContext, r) + reg * 8, value);\n\n  auto& trace_reg = trace_info_.dests[trace_info_.dest_count++];\n  trace_reg.reg = reg;\n  trace_reg.value = value;\n}\n\nValue* PPCHIRBuilder::LoadFPR(uint32_t reg) {\n  return LoadContext(offsetof(PPCContext, f) + reg * 8, FLOAT64_TYPE);\n}\n\nvoid PPCHIRBuilder::StoreFPR(uint32_t reg, Value* value) {\n  assert_true(value->type == FLOAT64_TYPE);\n  StoreContext(offsetof(PPCContext, f) + reg * 8, value);\n\n  auto& trace_reg = trace_info_.dests[trace_info_.dest_count++];\n  trace_reg.reg = reg + 32;\n  trace_reg.value = value;\n}\n\nValue* PPCHIRBuilder::LoadVR(uint32_t reg) {\n  return LoadContext(offsetof(PPCContext, v) + reg * 16, VEC128_TYPE);\n}\n\nvoid PPCHIRBuilder::StoreVR(uint32_t reg, Value* value) {\n  assert_true(value->type == VEC128_TYPE);\n  StoreContext(offsetof(PPCContext, v) + reg * 16, value);\n\n  auto& trace_reg = trace_info_.dests[trace_info_.dest_count++];\n  trace_reg.reg = 128 + reg;\n  trace_reg.value = value;\n}\n\nvoid PPCHIRBuilder::StoreReserved(Value* val) {\n  assert_true(val->type == INT64_TYPE);\n  StoreContext(offsetof(PPCContext, reserved_val), val);\n}\n\nValue* PPCHIRBuilder::LoadReserved() {\n  return LoadContext(offsetof(PPCContext, reserved_val), INT64_TYPE);\n}\n\n}  // namespace ppc\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/ppc/ppc_hir_builder.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_PPC_PPC_HIR_BUILDER_H_\n#define XENIA_CPU_PPC_PPC_HIR_BUILDER_H_\n\n#include \"xenia/base/string_buffer.h\"\n#include \"xenia/cpu/function.h\"\n#include \"xenia/cpu/hir/hir_builder.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace ppc {\n\nstruct PPCBuiltins;\nclass PPCFrontend;\n\nclass PPCHIRBuilder : public hir::HIRBuilder {\n  using Instr = xe::cpu::hir::Instr;\n  using Label = xe::cpu::hir::Label;\n  using Value = xe::cpu::hir::Value;\n\n public:\n  explicit PPCHIRBuilder(PPCFrontend* frontend);\n  ~PPCHIRBuilder() override;\n\n  PPCBuiltins* builtins() const;\n\n  void Reset() override;\n\n  enum EmitFlags {\n    // Emit comment nodes.\n    EMIT_DEBUG_COMMENTS = 1 << 0,\n  };\n  bool Emit(GuestFunction* function, uint32_t flags);\n\n  GuestFunction* function() const { return function_; }\n  Function* LookupFunction(uint32_t address);\n  Label* LookupLabel(uint32_t address);\n\n  Value* LoadLR();\n  void StoreLR(Value* value);\n  Value* LoadCTR();\n  void StoreCTR(Value* value);\n  Value* LoadCR();\n  Value* LoadCR(uint32_t n);\n  Value* LoadCRField(uint32_t n, uint32_t bit);\n  void StoreCR(Value* value);\n  void StoreCR(uint32_t n, Value* value);\n  void StoreCRField(uint32_t n, uint32_t bit, Value* value);\n  void UpdateCR(uint32_t n, Value* lhs, bool is_signed = true);\n  void UpdateCR(uint32_t n, Value* lhs, Value* rhs, bool is_signed = true);\n  void UpdateCR6(Value* src_value);\n  Value* LoadFPSCR();\n  void StoreFPSCR(Value* value);\n  void UpdateFPSCR(Value* result, bool update_cr1);\n  void CopyFPSCRToCR1();\n  Value* LoadXER();\n  void StoreXER(Value* value);\n  // void UpdateXERWithOverflow();\n  // void UpdateXERWithOverflowAndCarry();\n  // void StoreOV(Value* value);\n  Value* LoadCA();\n  void StoreCA(Value* value);\n  Value* LoadSAT();\n  void StoreSAT(Value* value);\n\n  Value* LoadGPR(uint32_t reg);\n  void StoreGPR(uint32_t reg, Value* value);\n  Value* LoadFPR(uint32_t reg);\n  void StoreFPR(uint32_t reg, Value* value);\n  Value* LoadVR(uint32_t reg);\n  void StoreVR(uint32_t reg, Value* value);\n\n  void StoreReserved(Value* val);\n  Value* LoadReserved();\n\n private:\n  void MaybeBreakOnInstruction(uint32_t address);\n  void AnnotateLabel(uint32_t address, Label* label);\n\n  PPCFrontend* frontend_;\n\n  // Reset whenever needed:\n  StringBuffer comment_buffer_;\n\n  // Reset each Emit:\n  bool with_debug_info_;\n  GuestFunction* function_;\n  uint64_t start_address_;\n  uint64_t instr_count_;\n  Instr** instr_offset_list_;\n  Label** label_list_;\n\n  // Reset each instruction.\n  struct {\n    uint32_t dest_count;\n    struct {\n      uint8_t reg;\n      Value* value;\n    } dests[4];\n  } trace_info_;\n};\n\n}  // namespace ppc\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_PPC_PPC_HIR_BUILDER_H_\n"
  },
  {
    "path": "src/xenia/cpu/ppc/ppc_instr.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_PPC_PPC_INSTR_H_\n#define XENIA_CPU_PPC_PPC_INSTR_H_\n\n#include <cstdint>\n#include <string>\n#include <vector>\n\n#include \"xenia/base/string_buffer.h\"\n#include \"xenia/cpu/ppc/ppc_opcode_info.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace ppc {\n\n// DEPRECATED\n// TODO(benvanik): move code to PPCDecodeData.\nstruct InstrData {\n  PPCOpcode opcode;\n  const PPCOpcodeInfo* opcode_info;\n  uint32_t address;\n\n  union {\n    uint32_t code;\n\n    // kXEPPCInstrFormatI\n    struct {\n      uint32_t LK : 1;\n      uint32_t AA : 1;\n      uint32_t LI : 24;\n      uint32_t : 6;\n    } I;\n    // kXEPPCInstrFormatB\n    struct {\n      uint32_t LK : 1;\n      uint32_t AA : 1;\n      uint32_t BD : 14;\n      uint32_t BI : 5;\n      uint32_t BO : 5;\n      uint32_t : 6;\n    } B;\n\n    // kXEPPCInstrFormatSC\n    struct {\n      uint32_t : 5;\n      uint32_t LEV : 7;\n      uint32_t : 20;\n    } SC;\n    // kXEPPCInstrFormatD\n    struct {\n      uint32_t DS : 16;\n      uint32_t RA : 5;\n      uint32_t RT : 5;\n      uint32_t : 6;\n    } D;\n    // kXEPPCInstrFormatDS\n    struct {\n      uint32_t : 2;\n      uint32_t DS : 14;\n      uint32_t RA : 5;\n      uint32_t RT : 5;\n      uint32_t : 6;\n    } DS;\n    // kXEPPCInstrFormatX\n    struct {\n      uint32_t Rc : 1;\n      uint32_t : 10;\n      uint32_t RB : 5;\n      uint32_t RA : 5;\n      uint32_t RT : 5;\n      uint32_t : 6;\n    } X;\n    // kXEPPCInstrFormatXL\n    struct {\n      uint32_t LK : 1;\n      uint32_t : 10;\n      uint32_t BB : 5;\n      uint32_t BI : 5;\n      uint32_t BO : 5;\n      uint32_t : 6;\n    } XL;\n    // kXEPPCInstrFormatXFX\n    struct {\n      uint32_t : 1;\n      uint32_t : 10;\n      uint32_t spr : 10;\n      uint32_t RT : 5;\n      uint32_t : 6;\n    } XFX;\n    // kXEPPCInstrFormatXFL\n    struct {\n      uint32_t Rc : 1;\n      uint32_t : 10;\n      uint32_t RB : 5;\n      uint32_t W : 1;\n      uint32_t FM : 8;\n      uint32_t L : 1;\n      uint32_t : 6;\n    } XFL;\n    // kXEPPCInstrFormatXS\n    struct {\n      uint32_t Rc : 1;\n      uint32_t SH5 : 1;\n      uint32_t : 9;\n      uint32_t SH : 5;\n      uint32_t RA : 5;\n      uint32_t RT : 5;\n      uint32_t : 6;\n    } XS;\n    // kXEPPCInstrFormatXO\n    struct {\n      uint32_t Rc : 1;\n      uint32_t : 9;\n      uint32_t OE : 1;\n      uint32_t RB : 5;\n      uint32_t RA : 5;\n      uint32_t RT : 5;\n      uint32_t : 6;\n    } XO;\n    // kXEPPCInstrFormatA\n    struct {\n      uint32_t Rc : 1;\n      uint32_t XO : 5;\n      uint32_t FRC : 5;\n      uint32_t FRB : 5;\n      uint32_t FRA : 5;\n      uint32_t FRT : 5;\n      uint32_t : 6;\n    } A;\n    // kXEPPCInstrFormatM\n    struct {\n      uint32_t Rc : 1;\n      uint32_t ME : 5;\n      uint32_t MB : 5;\n      uint32_t SH : 5;\n      uint32_t RA : 5;\n      uint32_t RT : 5;\n      uint32_t : 6;\n    } M;\n    // kXEPPCInstrFormatMD\n    struct {\n      uint32_t Rc : 1;\n      uint32_t SH5 : 1;\n      uint32_t idx : 3;\n      uint32_t MB5 : 1;\n      uint32_t MB : 5;\n      uint32_t SH : 5;\n      uint32_t RA : 5;\n      uint32_t RT : 5;\n      uint32_t : 6;\n    } MD;\n    // kXEPPCInstrFormatMDS\n    struct {\n      uint32_t Rc : 1;\n      uint32_t idx : 4;\n      uint32_t MB5 : 1;\n      uint32_t MB : 5;\n      uint32_t RB : 5;\n      uint32_t RA : 5;\n      uint32_t RT : 5;\n      uint32_t : 6;\n    } MDS;\n    // kXEPPCInstrFormatMDSH\n    struct {\n      uint32_t Rc : 1;\n      uint32_t idx : 4;\n      uint32_t MB5 : 1;\n      uint32_t MB : 5;\n      uint32_t RB : 5;\n      uint32_t RA : 5;\n      uint32_t RT : 5;\n      uint32_t : 6;\n    } MDSH;\n    // kXEPPCInstrFormatVXA\n    struct {\n      uint32_t : 6;\n      uint32_t VC : 5;\n      uint32_t VB : 5;\n      uint32_t VA : 5;\n      uint32_t VD : 5;\n      uint32_t : 6;\n    } VXA;\n    // kXEPPCInstrFormatVX\n    struct {\n      uint32_t : 11;\n      uint32_t VB : 5;\n      uint32_t VA : 5;\n      uint32_t VD : 5;\n      uint32_t : 6;\n    } VX;\n    // kXEPPCInstrFormatVXR\n    struct {\n      uint32_t : 10;\n      uint32_t Rc : 1;\n      uint32_t VB : 5;\n      uint32_t VA : 5;\n      uint32_t VD : 5;\n      uint32_t : 6;\n    } VXR;\n    // kXEPPCInstrFormatVX128\n    struct {\n      // VD128 = VD128l | (VD128h << 5)\n      // VA128 = VA128l | (VA128h << 5) | (VA128H << 6)\n      // VB128 = VB128l | (VB128h << 5)\n      uint32_t VB128h : 2;\n      uint32_t VD128h : 2;\n      uint32_t : 1;\n      uint32_t VA128h : 1;\n      uint32_t : 4;\n      uint32_t VA128H : 1;\n      uint32_t VB128l : 5;\n      uint32_t VA128l : 5;\n      uint32_t VD128l : 5;\n      uint32_t : 6;\n    } VX128;\n    // kXEPPCInstrFormatVX128_1\n    struct {\n      // VD128 = VD128l | (VD128h << 5)\n      uint32_t : 2;\n      uint32_t VD128h : 2;\n      uint32_t : 7;\n      uint32_t RB : 5;\n      uint32_t RA : 5;\n      uint32_t VD128l : 5;\n      uint32_t : 6;\n    } VX128_1;\n    // kXEPPCInstrFormatVX128_2\n    struct {\n      // VD128 = VD128l | (VD128h << 5)\n      // VA128 = VA128l | (VA128h << 5) | (VA128H << 6)\n      // VB128 = VB128l | (VB128h << 5)\n      uint32_t VB128h : 2;\n      uint32_t VD128h : 2;\n      uint32_t : 1;\n      uint32_t VA128h : 1;\n      uint32_t VC : 3;\n      uint32_t : 1;\n      uint32_t VA128H : 1;\n      uint32_t VB128l : 5;\n      uint32_t VA128l : 5;\n      uint32_t VD128l : 5;\n      uint32_t : 6;\n    } VX128_2;\n    // kXEPPCInstrFormatVX128_3\n    struct {\n      // VD128 = VD128l | (VD128h << 5)\n      // VB128 = VB128l | (VB128h << 5)\n      uint32_t VB128h : 2;\n      uint32_t VD128h : 2;\n      uint32_t : 7;\n      uint32_t VB128l : 5;\n      uint32_t IMM : 5;\n      uint32_t VD128l : 5;\n      uint32_t : 6;\n    } VX128_3;\n    // kXEPPCInstrFormatVX128_4\n    struct {\n      // VD128 = VD128l | (VD128h << 5)\n      // VB128 = VB128l | (VB128h << 5)\n      uint32_t VB128h : 2;\n      uint32_t VD128h : 2;\n      uint32_t : 2;\n      uint32_t z : 2;\n      uint32_t : 3;\n      uint32_t VB128l : 5;\n      uint32_t IMM : 5;\n      uint32_t VD128l : 5;\n      uint32_t : 6;\n    } VX128_4;\n    // kXEPPCInstrFormatVX128_5\n    struct {\n      // VD128 = VD128l | (VD128h << 5)\n      // VA128 = VA128l | (VA128h << 5) | (VA128H << 6)\n      // VB128 = VB128l | (VB128h << 5)\n      uint32_t VB128h : 2;\n      uint32_t VD128h : 2;\n      uint32_t : 1;\n      uint32_t VA128h : 1;\n      uint32_t SH : 4;\n      uint32_t VA128H : 1;\n      uint32_t VB128l : 5;\n      uint32_t VA128l : 5;\n      uint32_t VD128l : 5;\n      uint32_t : 6;\n    } VX128_5;\n    // kXEPPCInstrFormatVX128_P\n    struct {\n      // VD128 = VD128l | (VD128h << 5)\n      // VB128 = VB128l | (VB128h << 5)\n      // PERM = PERMl | (PERMh << 5)\n      uint32_t VB128h : 2;\n      uint32_t VD128h : 2;\n      uint32_t : 2;\n      uint32_t PERMh : 3;\n      uint32_t : 2;\n      uint32_t VB128l : 5;\n      uint32_t PERMl : 5;\n      uint32_t VD128l : 5;\n      uint32_t : 6;\n    } VX128_P;\n    // kXEPPCInstrFormatVX128_R\n    struct {\n      // VD128 = VD128l | (VD128h << 5)\n      // VA128 = VA128l | (VA128h << 5) | (VA128H << 6)\n      // VB128 = VB128l | (VB128h << 5)\n      uint32_t VB128h : 2;\n      uint32_t VD128h : 2;\n      uint32_t : 1;\n      uint32_t VA128h : 1;\n      uint32_t Rc : 1;\n      uint32_t : 3;\n      uint32_t VA128H : 1;\n      uint32_t VB128l : 5;\n      uint32_t VA128l : 5;\n      uint32_t VD128l : 5;\n      uint32_t : 6;\n    } VX128_R;\n    // kXEPPCInstrFormatXDSS\n    struct {\n    } XDSS;\n  };\n};\n\n}  // namespace ppc\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_PPC_PPC_INSTR_H_\n"
  },
  {
    "path": "src/xenia/cpu/ppc/ppc_opcode.h",
    "content": "// This code was autogenerated by ./tools/ppc-table-gen. Do not modify!\n// clang-format off\n#ifndef XENIA_CPU_PPC_PPC_OPCODE_H_\n#define XENIA_CPU_PPC_PPC_OPCODE_H_\n\n#include <cstdint>\n#include <cstdlib>\n\nnamespace xe {\nnamespace cpu {\nnamespace ppc {\n\n// All PPC opcodes in the same order they appear in ppc_opcode_table.h:\nenum class PPCOpcode : uint32_t {\n  addcx,\n  addex,\n  addi,\n  addic,\n  addicx,\n  addis,\n  addmex,\n  addx,\n  addzex,\n  andcx,\n  andisx,\n  andix,\n  andx,\n  bcctrx,\n  bclrx,\n  bcx,\n  bx,\n  cmp,\n  cmpi,\n  cmpl,\n  cmpli,\n  cntlzdx,\n  cntlzwx,\n  crand,\n  crandc,\n  creqv,\n  crnand,\n  crnor,\n  cror,\n  crorc,\n  crxor,\n  dcbf,\n  dcbi,\n  dcbst,\n  dcbt,\n  dcbtst,\n  dcbz,\n  dcbz128,\n  divdux,\n  divdx,\n  divwux,\n  divwx,\n  eieio,\n  eqvx,\n  extsbx,\n  extshx,\n  extswx,\n  fabsx,\n  faddsx,\n  faddx,\n  fcfidx,\n  fcmpo,\n  fcmpu,\n  fctidx,\n  fctidzx,\n  fctiwx,\n  fctiwzx,\n  fdivsx,\n  fdivx,\n  fmaddsx,\n  fmaddx,\n  fmrx,\n  fmsubsx,\n  fmsubx,\n  fmulsx,\n  fmulx,\n  fnabsx,\n  fnegx,\n  fnmaddsx,\n  fnmaddx,\n  fnmsubsx,\n  fnmsubx,\n  fresx,\n  frspx,\n  frsqrtex,\n  fselx,\n  fsqrtsx,\n  fsqrtx,\n  fsubsx,\n  fsubx,\n  icbi,\n  isync,\n  lbz,\n  lbzu,\n  lbzux,\n  lbzx,\n  ld,\n  ldarx,\n  ldbrx,\n  ldu,\n  ldux,\n  ldx,\n  lfd,\n  lfdu,\n  lfdux,\n  lfdx,\n  lfs,\n  lfsu,\n  lfsux,\n  lfsx,\n  lha,\n  lhau,\n  lhaux,\n  lhax,\n  lhbrx,\n  lhz,\n  lhzu,\n  lhzux,\n  lhzx,\n  lmw,\n  lswi,\n  lswx,\n  lvebx,\n  lvehx,\n  lvewx,\n  lvewx128,\n  lvlx,\n  lvlx128,\n  lvlxl,\n  lvlxl128,\n  lvrx,\n  lvrx128,\n  lvrxl,\n  lvrxl128,\n  lvsl,\n  lvsl128,\n  lvsr,\n  lvsr128,\n  lvx,\n  lvx128,\n  lvxl,\n  lvxl128,\n  lwa,\n  lwarx,\n  lwaux,\n  lwax,\n  lwbrx,\n  lwz,\n  lwzu,\n  lwzux,\n  lwzx,\n  mcrf,\n  mcrfs,\n  mcrxr,\n  mfcr,\n  mffsx,\n  mfmsr,\n  mfspr,\n  mftb,\n  mfvscr,\n  mtcrf,\n  mtfsb0x,\n  mtfsb1x,\n  mtfsfix,\n  mtfsfx,\n  mtmsr,\n  mtmsrd,\n  mtspr,\n  mtvscr,\n  mulhdux,\n  mulhdx,\n  mulhwux,\n  mulhwx,\n  mulldx,\n  mulli,\n  mullwx,\n  nandx,\n  negx,\n  norx,\n  orcx,\n  ori,\n  oris,\n  orx,\n  rldclx,\n  rldcrx,\n  rldiclx,\n  rldicrx,\n  rldicx,\n  rldimix,\n  rlwimix,\n  rlwinmx,\n  rlwnmx,\n  sc,\n  sldx,\n  slwx,\n  sradix,\n  sradx,\n  srawix,\n  srawx,\n  srdx,\n  srwx,\n  stb,\n  stbu,\n  stbux,\n  stbx,\n  std,\n  stdbrx,\n  stdcx,\n  stdu,\n  stdux,\n  stdx,\n  stfd,\n  stfdu,\n  stfdux,\n  stfdx,\n  stfiwx,\n  stfs,\n  stfsu,\n  stfsux,\n  stfsx,\n  sth,\n  sthbrx,\n  sthu,\n  sthux,\n  sthx,\n  stmw,\n  stswi,\n  stswx,\n  stvebx,\n  stvehx,\n  stvewx,\n  stvewx128,\n  stvlx,\n  stvlx128,\n  stvlxl,\n  stvlxl128,\n  stvrx,\n  stvrx128,\n  stvrxl,\n  stvrxl128,\n  stvx,\n  stvx128,\n  stvxl,\n  stvxl128,\n  stw,\n  stwbrx,\n  stwcx,\n  stwu,\n  stwux,\n  stwx,\n  subfcx,\n  subfex,\n  subficx,\n  subfmex,\n  subfx,\n  subfzex,\n  sync,\n  td,\n  tdi,\n  tw,\n  twi,\n  vaddcuw,\n  vaddfp,\n  vaddfp128,\n  vaddsbs,\n  vaddshs,\n  vaddsws,\n  vaddubm,\n  vaddubs,\n  vadduhm,\n  vadduhs,\n  vadduwm,\n  vadduws,\n  vand,\n  vand128,\n  vandc,\n  vandc128,\n  vavgsb,\n  vavgsh,\n  vavgsw,\n  vavgub,\n  vavguh,\n  vavguw,\n  vcfpsxws128,\n  vcfpuxws128,\n  vcfsx,\n  vcfux,\n  vcmpbfp,\n  vcmpbfp128,\n  vcmpeqfp,\n  vcmpeqfp128,\n  vcmpequb,\n  vcmpequh,\n  vcmpequw,\n  vcmpequw128,\n  vcmpgefp,\n  vcmpgefp128,\n  vcmpgtfp,\n  vcmpgtfp128,\n  vcmpgtsb,\n  vcmpgtsh,\n  vcmpgtsw,\n  vcmpgtub,\n  vcmpgtuh,\n  vcmpgtuw,\n  vcsxwfp128,\n  vctsxs,\n  vctuxs,\n  vcuxwfp128,\n  vexptefp,\n  vexptefp128,\n  vlogefp,\n  vlogefp128,\n  vmaddcfp128,\n  vmaddfp,\n  vmaddfp128,\n  vmaxfp,\n  vmaxfp128,\n  vmaxsb,\n  vmaxsh,\n  vmaxsw,\n  vmaxub,\n  vmaxuh,\n  vmaxuw,\n  vmhaddshs,\n  vmhraddshs,\n  vminfp,\n  vminfp128,\n  vminsb,\n  vminsh,\n  vminsw,\n  vminub,\n  vminuh,\n  vminuw,\n  vmladduhm,\n  vmrghb,\n  vmrghh,\n  vmrghw,\n  vmrghw128,\n  vmrglb,\n  vmrglh,\n  vmrglw,\n  vmrglw128,\n  vmsum3fp128,\n  vmsum4fp128,\n  vmsummbm,\n  vmsumshm,\n  vmsumshs,\n  vmsumubm,\n  vmsumuhm,\n  vmsumuhs,\n  vmulesb,\n  vmulesh,\n  vmuleub,\n  vmuleuh,\n  vmulfp128,\n  vmulosb,\n  vmulosh,\n  vmuloub,\n  vmulouh,\n  vnmsubfp,\n  vnmsubfp128,\n  vnor,\n  vnor128,\n  vor,\n  vor128,\n  vperm,\n  vperm128,\n  vpermwi128,\n  vpkd3d128,\n  vpkpx,\n  vpkshss,\n  vpkshss128,\n  vpkshus,\n  vpkshus128,\n  vpkswss,\n  vpkswss128,\n  vpkswus,\n  vpkswus128,\n  vpkuhum,\n  vpkuhum128,\n  vpkuhus,\n  vpkuhus128,\n  vpkuwum,\n  vpkuwum128,\n  vpkuwus,\n  vpkuwus128,\n  vrefp,\n  vrefp128,\n  vrfim,\n  vrfim128,\n  vrfin,\n  vrfin128,\n  vrfip,\n  vrfip128,\n  vrfiz,\n  vrfiz128,\n  vrlb,\n  vrlh,\n  vrlimi128,\n  vrlw,\n  vrlw128,\n  vrsqrtefp,\n  vrsqrtefp128,\n  vsel,\n  vsel128,\n  vsl,\n  vslb,\n  vsldoi,\n  vsldoi128,\n  vslh,\n  vslo,\n  vslo128,\n  vslw,\n  vslw128,\n  vspltb,\n  vsplth,\n  vspltisb,\n  vspltish,\n  vspltisw,\n  vspltisw128,\n  vspltw,\n  vspltw128,\n  vsr,\n  vsrab,\n  vsrah,\n  vsraw,\n  vsraw128,\n  vsrb,\n  vsrh,\n  vsro,\n  vsro128,\n  vsrw,\n  vsrw128,\n  vsubcuw,\n  vsubfp,\n  vsubfp128,\n  vsubsbs,\n  vsubshs,\n  vsubsws,\n  vsububm,\n  vsububs,\n  vsubuhm,\n  vsubuhs,\n  vsubuwm,\n  vsubuws,\n  vsum2sws,\n  vsum4sbs,\n  vsum4shs,\n  vsum4ubs,\n  vsumsws,\n  vupkd3d128,\n  vupkhpx,\n  vupkhsb,\n  vupkhsb128,\n  vupkhsh,\n  vupklpx,\n  vupklsb,\n  vupklsb128,\n  vupklsh,\n  vxor,\n  vxor128,\n  xori,\n  xoris,\n  xorx,\n  kInvalid,\n};\n\n}  // namespace ppc\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_PPC_PPC_OPCODE_H_\n"
  },
  {
    "path": "src/xenia/cpu/ppc/ppc_opcode_disasm.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2015 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include <cstdint>\n#include <cstdlib>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/cpu/ppc/ppc_decode_data.h\"\n#include \"xenia/cpu/ppc/ppc_opcode.h\"\n#include \"xenia/cpu/ppc/ppc_opcode_disasm.h\"\n#include \"xenia/cpu/ppc/ppc_opcode_info.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace ppc {\n\nvoid PadStringBuffer(StringBuffer* str, size_t base, size_t pad) {\n  size_t added_len = str->length() - base;\n  if (added_len < pad) str->AppendBytes(kSpaces, kNamePad - added_len);\n}\n\nvoid PrintDisasm_bcx(const PPCDecodeData& d, StringBuffer* str) {\n  // [bc][LK][AA][+-] [BO], [BI], [ADDR]\n  size_t str_start = str->length();\n\n  const uint32_t bo = d.B.BO();\n  const uint32_t bi = d.B.BI();\n  const uint32_t addr = d.B.ADDR();\n\n  const bool bo0 = bo & 0x10;\n  const bool bo1 = bo & 0x08;\n  const bool bo2 = bo & 0x04;\n  const bool bo3 = bo & 0x02;\n  const bool bo4 = bo & 0x01;\n  int sign_char = 0;  // Default no sign\n\n  if (bo0 && !bo1 && !bo2 && bo3 && !bo4) {\n    str->Append(\"bdz\");\n  } else if (bo0 && bo1 && !bo2 && bo3 && !bo4) {\n    str->Append(\"bdz\");\n    sign_char = -1;\n  } else if (bo0 && bo1 && !bo2 && bo3 && bo4) {\n    str->Append(\"bdz\");\n    sign_char = +1;\n  } else if (bo0 && !bo1 && !bo2 && !bo3 && !bo4) {\n    str->Append(\"bdnz\");\n  } else if (bo0 && bo1 && !bo2 && !bo3 && !bo4) {\n    str->Append(\"bdnz\");\n    sign_char = -1;\n  } else if (bo0 && bo1 && !bo2 && !bo3 && bo4) {\n    str->Append(\"bdnz\");\n    sign_char = +1;\n  } else if (!bo0 && !bo1 && bo2 && !bo3 && !bo4) {\n    switch (bi % 4) {\n      case 0x0:\n        str->Append(\"bge\");\n        break;\n      case 0x1:\n        str->Append(\"ble\");\n        break;\n      case 0x2:\n        str->Append(\"bne\");\n        break;\n    }\n  } else if (!bo0 && !bo1 && bo2 && bo3 && !bo4) {\n    switch (bi % 4) {\n      case 0x0:\n        str->Append(\"bge\");\n        sign_char = -1;\n        break;\n      case 0x1:\n        str->Append(\"ble\");\n        sign_char = -1;\n        break;\n      case 0x2:\n        str->Append(\"bne\");\n        sign_char = -1;\n        break;\n    }\n  } else if (!bo0 && !bo1 && bo2 && bo3 && bo4) {\n    switch (bi % 4) {\n      case 0x0:\n        str->Append(\"bge\");\n        sign_char = +1;\n        break;\n      case 0x1:\n        str->Append(\"ble\");\n        sign_char = +1;\n        break;\n      case 0x2:\n        str->Append(\"bne\");\n        sign_char = +1;\n        break;\n    }\n  } else if (!bo0 && bo1 && bo2 && !bo3 && !bo4) {\n    switch (bi % 4) {\n      case 0x0:\n        str->Append(\"blt\");\n        break;\n      case 0x1:\n        str->Append(\"bgt\");\n        break;\n      case 0x2:\n        str->Append(\"beq\");\n        break;\n    }\n  } else if (!bo0 && bo1 && bo2 && bo3 && !bo4) {\n    switch (bi % 4) {\n      case 0x0:\n        str->Append(\"blt\");\n        sign_char = -1;\n        break;\n      case 0x1:\n        str->Append(\"bgt\");\n        sign_char = -1;\n        break;\n      case 0x2:\n        str->Append(\"beq\");\n        sign_char = -1;\n        break;\n    }\n  } else if (!bo0 && bo1 && bo2 && bo3 && bo4) {\n    switch (bi % 4) {\n      case 0x0:\n        str->Append(\"blt\");\n        sign_char = +1;\n        break;\n      case 0x1:\n        str->Append(\"bgt\");\n        sign_char = +1;\n        break;\n      case 0x2:\n        str->Append(\"beq\");\n        sign_char = +1;\n        break;\n    }\n  }\n\n  if (str_start == str->length()) {\n    // Default\n    str->Append(\"bc\");\n    if (d.B.LK()) str->Append('l');\n    if (d.B.AA()) str->Append('a');\n    PadStringBuffer(str, str_start, kNamePad);\n    str->AppendFormat(\"{}\", bo);\n    str->Append(\", \");\n    str->AppendFormat(\"{}\", bi);\n  } else {\n    if (d.B.LK()) str->Append('l');\n    if (d.B.AA()) str->Append('a');\n\n    if (sign_char > 0) {\n      str->Append('+');\n    } else if (sign_char < 0) {\n      str->Append('-');\n    }\n\n    PadStringBuffer(str, str_start, kNamePad);\n    str->AppendFormat(\"crf{}\", bi / 4);\n  }\n\n  str->Append(\", \");\n  str->AppendFormat(\"0x{:X}\", addr);\n}\n\n}  // namespace ppc\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/ppc/ppc_opcode_disasm.h",
    "content": "﻿/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2015 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_PPC_PPC_OPCODE_DISASM_H_\n#define XENIA_CPU_PPC_PPC_OPCODE_DISASM_H_\n\n#include <cstdint>\n\n#include \"xenia/base/string_buffer.h\"\n#include \"xenia/cpu/ppc/ppc_opcode.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace ppc {\n\nconstexpr size_t kNamePad = 11;\nconst uint8_t kSpaces[kNamePad] = {0x20, 0x20, 0x20, 0x20, 0x20,\n                                   0x20, 0x20, 0x20, 0x20, 0x20};\nvoid PadStringBuffer(StringBuffer* str, size_t base, size_t pad);\n\nvoid PrintDisasm_bcx(const PPCDecodeData& d, StringBuffer* str);\n\n}  // namespace ppc\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_PPC_PPC_OPCODE_DISASM_H_\n"
  },
  {
    "path": "src/xenia/cpu/ppc/ppc_opcode_disasm_gen.cc",
    "content": "// This code was autogenerated by ./tools/ppc-table-gen. Do not modify!\n// clang-format off\n#include <cstdint>\n#include <cstdlib>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/cpu/ppc/ppc_decode_data.h\"\n#include \"xenia/cpu/ppc/ppc_opcode.h\"\n#include \"xenia/cpu/ppc/ppc_opcode_disasm.h\"\n#include \"xenia/cpu/ppc/ppc_opcode_info.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace ppc {\n\nvoid PrintDisasm_addcx(const PPCDecodeData& d, StringBuffer* str) {\n  // addc[OE][Rc] [RD], [RA], [RB]\n  size_t str_start = str->length();\n  str->Append(\"addc\");\n  if (d.XO.OE()) str->Append('o');\n  if (d.XO.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.XO.RD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.XO.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.XO.RB());\n}\nvoid PrintDisasm_addex(const PPCDecodeData& d, StringBuffer* str) {\n  // adde[OE][Rc] [RD], [RA], [RB]\n  size_t str_start = str->length();\n  str->Append(\"adde\");\n  if (d.XO.OE()) str->Append('o');\n  if (d.XO.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.XO.RD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.XO.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.XO.RB());\n}\nvoid PrintDisasm_addi(const PPCDecodeData& d, StringBuffer* str) {\n  // addi [RD], [RA0], [SIMM]\n  size_t str_start = str->length();\n  str->Append(\"addi\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.D.RD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.D.RA0());\n  str->Append(\", \");\n  str->AppendFormat(d.D.SIMM() < 0 ? \"-0x{:X}\" : \"0x{:X}\", std::abs(d.D.SIMM()));\n}\nvoid PrintDisasm_addic(const PPCDecodeData& d, StringBuffer* str) {\n  // addic [RD], [RA], [SIMM]\n  size_t str_start = str->length();\n  str->Append(\"addic\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.D.RD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.D.RA());\n  str->Append(\", \");\n  str->AppendFormat(d.D.SIMM() < 0 ? \"-0x{:X}\" : \"0x{:X}\", std::abs(d.D.SIMM()));\n}\nvoid PrintDisasm_addicx(const PPCDecodeData& d, StringBuffer* str) {\n  // addic. [RD], [RA], [SIMM]\n  size_t str_start = str->length();\n  str->Append(\"addic.\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.D.RD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.D.RA());\n  str->Append(\", \");\n  str->AppendFormat(d.D.SIMM() < 0 ? \"-0x{:X}\" : \"0x{:X}\", std::abs(d.D.SIMM()));\n}\nvoid PrintDisasm_addis(const PPCDecodeData& d, StringBuffer* str) {\n  // addis [RD], [RA0], [SIMM]\n  size_t str_start = str->length();\n  str->Append(\"addis\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.D.RD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.D.RA0());\n  str->Append(\", \");\n  str->AppendFormat(d.D.SIMM() < 0 ? \"-0x{:X}\" : \"0x{:X}\", std::abs(d.D.SIMM()));\n}\nvoid PrintDisasm_addmex(const PPCDecodeData& d, StringBuffer* str) {\n  // addme[OE][Rc] [RD], [RA]\n  size_t str_start = str->length();\n  str->Append(\"addme\");\n  if (d.XO.OE()) str->Append('o');\n  if (d.XO.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.XO.RD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.XO.RA());\n}\nvoid PrintDisasm_addx(const PPCDecodeData& d, StringBuffer* str) {\n  // add[OE][Rc] [RD], [RA], [RB]\n  size_t str_start = str->length();\n  str->Append(\"add\");\n  if (d.XO.OE()) str->Append('o');\n  if (d.XO.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.XO.RD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.XO.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.XO.RB());\n}\nvoid PrintDisasm_addzex(const PPCDecodeData& d, StringBuffer* str) {\n  // addze[OE][Rc] [RD], [RA]\n  size_t str_start = str->length();\n  str->Append(\"addze\");\n  if (d.XO.OE()) str->Append('o');\n  if (d.XO.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.XO.RD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.XO.RA());\n}\nvoid PrintDisasm_andcx(const PPCDecodeData& d, StringBuffer* str) {\n  // andc[Rc] [RA], [RS], [RB]\n  size_t str_start = str->length();\n  str->Append(\"andc\");\n  if (d.X.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RS());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_andisx(const PPCDecodeData& d, StringBuffer* str) {\n  // andis. [RA], [RS], [UIMM]\n  size_t str_start = str->length();\n  str->Append(\"andis.\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.D.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.D.RS());\n  str->Append(\", \");\n  str->AppendFormat(\"0x{:X}\", d.D.UIMM());\n}\nvoid PrintDisasm_andix(const PPCDecodeData& d, StringBuffer* str) {\n  // andi. [RA], [RS], [UIMM]\n  size_t str_start = str->length();\n  str->Append(\"andi.\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.D.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.D.RS());\n  str->Append(\", \");\n  str->AppendFormat(\"0x{:X}\", d.D.UIMM());\n}\nvoid PrintDisasm_andx(const PPCDecodeData& d, StringBuffer* str) {\n  // and[Rc] [RA], [RS], [RB]\n  size_t str_start = str->length();\n  str->Append(\"and\");\n  if (d.X.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RS());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_bcctrx(const PPCDecodeData& d, StringBuffer* str) {\n  // bcctr[LK] [BO], [BI]\n  size_t str_start = str->length();\n  str->Append(\"bcctr\");\n  if (d.XL.LK()) str->Append('l');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"{}\", d.XL.BO());\n  str->Append(\", \");\n  str->AppendFormat(\"{}\", d.XL.BI());\n}\nvoid PrintDisasm_bclrx(const PPCDecodeData& d, StringBuffer* str) {\n  // bclr[LK] [BO], [BI]\n  size_t str_start = str->length();\n  str->Append(\"bclr\");\n  if (d.XL.LK()) str->Append('l');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"{}\", d.XL.BO());\n  str->Append(\", \");\n  str->AppendFormat(\"{}\", d.XL.BI());\n}\nvoid PrintDisasm_bx(const PPCDecodeData& d, StringBuffer* str) {\n  // b[LK][AA] [ADDR]\n  size_t str_start = str->length();\n  str->Append(\"b\");\n  if (d.I.LK()) str->Append('l');\n  if (d.I.AA()) str->Append('a');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"0x{:X}\", d.I.ADDR());\n}\nvoid PrintDisasm_cmp(const PPCDecodeData& d, StringBuffer* str) {\n  // cmp [CRFD], [L], [RA], [RB]\n  size_t str_start = str->length();\n  str->Append(\"cmp\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"crf{}\", d.X.CRFD());\n  str->Append(\", \");\n  str->AppendFormat(\"{}\", d.X.L());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_cmpi(const PPCDecodeData& d, StringBuffer* str) {\n  // cmpi [CRFD], [L], [RA], [SIMM]\n  size_t str_start = str->length();\n  str->Append(\"cmpi\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"crf{}\", d.D.CRFD());\n  str->Append(\", \");\n  str->AppendFormat(\"{}\", d.D.L());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.D.RA());\n  str->Append(\", \");\n  str->AppendFormat(d.D.SIMM() < 0 ? \"-0x{:X}\" : \"0x{:X}\", std::abs(d.D.SIMM()));\n}\nvoid PrintDisasm_cmpl(const PPCDecodeData& d, StringBuffer* str) {\n  // cmpl [CRFD], [L], [RA], [RB]\n  size_t str_start = str->length();\n  str->Append(\"cmpl\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"crf{}\", d.X.CRFD());\n  str->Append(\", \");\n  str->AppendFormat(\"{}\", d.X.L());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_cmpli(const PPCDecodeData& d, StringBuffer* str) {\n  // cmpli [CRFD], [L], [RA], [UIMM]\n  size_t str_start = str->length();\n  str->Append(\"cmpli\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"crf{}\", d.D.CRFD());\n  str->Append(\", \");\n  str->AppendFormat(\"{}\", d.D.L());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.D.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"0x{:X}\", d.D.UIMM());\n}\nvoid PrintDisasm_cntlzdx(const PPCDecodeData& d, StringBuffer* str) {\n  // cntlzd [RA], [RS]\n  size_t str_start = str->length();\n  str->Append(\"cntlzd\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RS());\n}\nvoid PrintDisasm_cntlzwx(const PPCDecodeData& d, StringBuffer* str) {\n  // cntlzw[Rc] [RA], [RS]\n  size_t str_start = str->length();\n  str->Append(\"cntlzw\");\n  if (d.X.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RS());\n}\nvoid PrintDisasm_crand(const PPCDecodeData& d, StringBuffer* str) {\n  // crand [CRBD], [CRBA], [CRBB]\n  size_t str_start = str->length();\n  str->Append(\"crand\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"crb{}\", d.XL.CRBD());\n  str->Append(\", \");\n  str->AppendFormat(\"crb{}\", d.XL.CRBA());\n  str->Append(\", \");\n  str->AppendFormat(\"crb{}\", d.XL.CRBB());\n}\nvoid PrintDisasm_crandc(const PPCDecodeData& d, StringBuffer* str) {\n  // crandc [CRBD], [CRBA], [CRBB]\n  size_t str_start = str->length();\n  str->Append(\"crandc\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"crb{}\", d.XL.CRBD());\n  str->Append(\", \");\n  str->AppendFormat(\"crb{}\", d.XL.CRBA());\n  str->Append(\", \");\n  str->AppendFormat(\"crb{}\", d.XL.CRBB());\n}\nvoid PrintDisasm_creqv(const PPCDecodeData& d, StringBuffer* str) {\n  // creqv [CRBD], [CRBA], [CRBB]\n  size_t str_start = str->length();\n  str->Append(\"creqv\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"crb{}\", d.XL.CRBD());\n  str->Append(\", \");\n  str->AppendFormat(\"crb{}\", d.XL.CRBA());\n  str->Append(\", \");\n  str->AppendFormat(\"crb{}\", d.XL.CRBB());\n}\nvoid PrintDisasm_crnand(const PPCDecodeData& d, StringBuffer* str) {\n  // crnand [CRBD], [CRBA], [CRBB]\n  size_t str_start = str->length();\n  str->Append(\"crnand\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"crb{}\", d.XL.CRBD());\n  str->Append(\", \");\n  str->AppendFormat(\"crb{}\", d.XL.CRBA());\n  str->Append(\", \");\n  str->AppendFormat(\"crb{}\", d.XL.CRBB());\n}\nvoid PrintDisasm_crnor(const PPCDecodeData& d, StringBuffer* str) {\n  // crnor [CRBD], [CRBA], [CRBB]\n  size_t str_start = str->length();\n  str->Append(\"crnor\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"crb{}\", d.XL.CRBD());\n  str->Append(\", \");\n  str->AppendFormat(\"crb{}\", d.XL.CRBA());\n  str->Append(\", \");\n  str->AppendFormat(\"crb{}\", d.XL.CRBB());\n}\nvoid PrintDisasm_cror(const PPCDecodeData& d, StringBuffer* str) {\n  // cror [CRBD], [CRBA], [CRBB]\n  size_t str_start = str->length();\n  str->Append(\"cror\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"crb{}\", d.XL.CRBD());\n  str->Append(\", \");\n  str->AppendFormat(\"crb{}\", d.XL.CRBA());\n  str->Append(\", \");\n  str->AppendFormat(\"crb{}\", d.XL.CRBB());\n}\nvoid PrintDisasm_crorc(const PPCDecodeData& d, StringBuffer* str) {\n  // crorc [CRBD], [CRBA], [CRBB]\n  size_t str_start = str->length();\n  str->Append(\"crorc\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"crb{}\", d.XL.CRBD());\n  str->Append(\", \");\n  str->AppendFormat(\"crb{}\", d.XL.CRBA());\n  str->Append(\", \");\n  str->AppendFormat(\"crb{}\", d.XL.CRBB());\n}\nvoid PrintDisasm_crxor(const PPCDecodeData& d, StringBuffer* str) {\n  // crxor [CRBD], [CRBA], [CRBB]\n  size_t str_start = str->length();\n  str->Append(\"crxor\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"crb{}\", d.XL.CRBD());\n  str->Append(\", \");\n  str->AppendFormat(\"crb{}\", d.XL.CRBA());\n  str->Append(\", \");\n  str->AppendFormat(\"crb{}\", d.XL.CRBB());\n}\nvoid PrintDisasm_dcbf(const PPCDecodeData& d, StringBuffer* str) {\n  // dcbf [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"dcbf\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_dcbi(const PPCDecodeData& d, StringBuffer* str) {\n  // dcbi [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"dcbi\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_dcbst(const PPCDecodeData& d, StringBuffer* str) {\n  // dcbst [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"dcbst\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_dcbt(const PPCDecodeData& d, StringBuffer* str) {\n  // dcbt [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"dcbt\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_dcbtst(const PPCDecodeData& d, StringBuffer* str) {\n  // dcbtst [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"dcbtst\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_dcbz(const PPCDecodeData& d, StringBuffer* str) {\n  // dcbz [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"dcbz\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.DCBZ.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.DCBZ.RB());\n}\nvoid PrintDisasm_dcbz128(const PPCDecodeData& d, StringBuffer* str) {\n  // dcbz128 [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"dcbz128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.DCBZ.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.DCBZ.RB());\n}\nvoid PrintDisasm_divdux(const PPCDecodeData& d, StringBuffer* str) {\n  // divdu[OE][Rc] [RD], [RA], [RB]\n  size_t str_start = str->length();\n  str->Append(\"divdu\");\n  if (d.XO.OE()) str->Append('o');\n  if (d.XO.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.XO.RD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.XO.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.XO.RB());\n}\nvoid PrintDisasm_divdx(const PPCDecodeData& d, StringBuffer* str) {\n  // divd[OE][Rc] [RD], [RA], [RB]\n  size_t str_start = str->length();\n  str->Append(\"divd\");\n  if (d.XO.OE()) str->Append('o');\n  if (d.XO.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.XO.RD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.XO.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.XO.RB());\n}\nvoid PrintDisasm_divwux(const PPCDecodeData& d, StringBuffer* str) {\n  // divwu[OE][Rc] [RD], [RA], [RB]\n  size_t str_start = str->length();\n  str->Append(\"divwu\");\n  if (d.XO.OE()) str->Append('o');\n  if (d.XO.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.XO.RD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.XO.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.XO.RB());\n}\nvoid PrintDisasm_divwx(const PPCDecodeData& d, StringBuffer* str) {\n  // divw[OE][Rc] [RD], [RA], [RB]\n  size_t str_start = str->length();\n  str->Append(\"divw\");\n  if (d.XO.OE()) str->Append('o');\n  if (d.XO.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.XO.RD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.XO.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.XO.RB());\n}\nvoid PrintDisasm_eieio(const PPCDecodeData& d, StringBuffer* str) {\n  // eieio\n  size_t str_start = str->length();\n  str->Append(\"eieio\");\n  PadStringBuffer(str, str_start, kNamePad);\n}\nvoid PrintDisasm_eqvx(const PPCDecodeData& d, StringBuffer* str) {\n  // eqv[Rc] [RA], [RS], [RB]\n  size_t str_start = str->length();\n  str->Append(\"eqv\");\n  if (d.X.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RS());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_extsbx(const PPCDecodeData& d, StringBuffer* str) {\n  // extsb[Rc] [RA], [RS]\n  size_t str_start = str->length();\n  str->Append(\"extsb\");\n  if (d.X.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RS());\n}\nvoid PrintDisasm_extshx(const PPCDecodeData& d, StringBuffer* str) {\n  // extsh[Rc] [RA], [RS]\n  size_t str_start = str->length();\n  str->Append(\"extsh\");\n  if (d.X.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RS());\n}\nvoid PrintDisasm_extswx(const PPCDecodeData& d, StringBuffer* str) {\n  // extsw[Rc] [RA], [RS]\n  size_t str_start = str->length();\n  str->Append(\"extsw\");\n  if (d.X.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RS());\n}\nvoid PrintDisasm_fabsx(const PPCDecodeData& d, StringBuffer* str) {\n  // fabs[Rc] [FD], [FB]\n  size_t str_start = str->length();\n  str->Append(\"fabs\");\n  if (d.X.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"fr{}\", d.X.FD());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.X.FB());\n}\nvoid PrintDisasm_faddsx(const PPCDecodeData& d, StringBuffer* str) {\n  // fadds[Rc] [FD], [FA], [FB]\n  size_t str_start = str->length();\n  str->Append(\"fadds\");\n  if (d.A.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"fr{}\", d.A.FD());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.A.FA());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.A.FB());\n}\nvoid PrintDisasm_faddx(const PPCDecodeData& d, StringBuffer* str) {\n  // fadd[Rc] [FD], [FA], [FB]\n  size_t str_start = str->length();\n  str->Append(\"fadd\");\n  if (d.A.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"fr{}\", d.A.FD());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.A.FA());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.A.FB());\n}\nvoid PrintDisasm_fcfidx(const PPCDecodeData& d, StringBuffer* str) {\n  // fcfid[Rc] [FD], [FB]\n  size_t str_start = str->length();\n  str->Append(\"fcfid\");\n  if (d.X.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"fr{}\", d.X.FD());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.X.FB());\n}\nvoid PrintDisasm_fcmpo(const PPCDecodeData& d, StringBuffer* str) {\n  // fcmpo [CRFD], [FA], [FB]\n  size_t str_start = str->length();\n  str->Append(\"fcmpo\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"crf{}\", d.X.CRFD());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.X.FA());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.X.FB());\n}\nvoid PrintDisasm_fcmpu(const PPCDecodeData& d, StringBuffer* str) {\n  // fcmpu [CRFD], [FA], [FB]\n  size_t str_start = str->length();\n  str->Append(\"fcmpu\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"crf{}\", d.X.CRFD());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.X.FA());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.X.FB());\n}\nvoid PrintDisasm_fctidx(const PPCDecodeData& d, StringBuffer* str) {\n  // fctid[Rc] [FD], [FB]\n  size_t str_start = str->length();\n  str->Append(\"fctid\");\n  if (d.X.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"fr{}\", d.X.FD());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.X.FB());\n}\nvoid PrintDisasm_fctidzx(const PPCDecodeData& d, StringBuffer* str) {\n  // fctidz[Rc] [FD], [FB]\n  size_t str_start = str->length();\n  str->Append(\"fctidz\");\n  if (d.X.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"fr{}\", d.X.FD());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.X.FB());\n}\nvoid PrintDisasm_fctiwx(const PPCDecodeData& d, StringBuffer* str) {\n  // fctiw[Rc] [FD], [FB]\n  size_t str_start = str->length();\n  str->Append(\"fctiw\");\n  if (d.X.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"fr{}\", d.X.FD());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.X.FB());\n}\nvoid PrintDisasm_fctiwzx(const PPCDecodeData& d, StringBuffer* str) {\n  // fctiwz[Rc] [FD], [FB]\n  size_t str_start = str->length();\n  str->Append(\"fctiwz\");\n  if (d.X.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"fr{}\", d.X.FD());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.X.FB());\n}\nvoid PrintDisasm_fdivsx(const PPCDecodeData& d, StringBuffer* str) {\n  // fdivs[Rc] [FD], [FA], [FB]\n  size_t str_start = str->length();\n  str->Append(\"fdivs\");\n  if (d.A.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"fr{}\", d.A.FD());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.A.FA());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.A.FB());\n}\nvoid PrintDisasm_fdivx(const PPCDecodeData& d, StringBuffer* str) {\n  // fdiv[Rc] [FD], [FA], [FB]\n  size_t str_start = str->length();\n  str->Append(\"fdiv\");\n  if (d.A.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"fr{}\", d.A.FD());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.A.FA());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.A.FB());\n}\nvoid PrintDisasm_fmaddsx(const PPCDecodeData& d, StringBuffer* str) {\n  // fmadds[Rc] [FD], [FA], [FC], [FB]\n  size_t str_start = str->length();\n  str->Append(\"fmadds\");\n  if (d.A.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"fr{}\", d.A.FD());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.A.FA());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.A.FC());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.A.FB());\n}\nvoid PrintDisasm_fmaddx(const PPCDecodeData& d, StringBuffer* str) {\n  // fmadd[Rc] [FD], [FA], [FC], [FB]\n  size_t str_start = str->length();\n  str->Append(\"fmadd\");\n  if (d.A.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"fr{}\", d.A.FD());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.A.FA());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.A.FC());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.A.FB());\n}\nvoid PrintDisasm_fmrx(const PPCDecodeData& d, StringBuffer* str) {\n  // fmr[Rc] [FD], [FB]\n  size_t str_start = str->length();\n  str->Append(\"fmr\");\n  if (d.X.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"fr{}\", d.X.FD());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.X.FB());\n}\nvoid PrintDisasm_fmsubsx(const PPCDecodeData& d, StringBuffer* str) {\n  // fmsubs[Rc] [FD], [FA], [FC], [FB]\n  size_t str_start = str->length();\n  str->Append(\"fmsubs\");\n  if (d.A.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"fr{}\", d.A.FD());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.A.FA());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.A.FC());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.A.FB());\n}\nvoid PrintDisasm_fmsubx(const PPCDecodeData& d, StringBuffer* str) {\n  // fmsub[Rc] [FD], [FA], [FC], [FB]\n  size_t str_start = str->length();\n  str->Append(\"fmsub\");\n  if (d.A.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"fr{}\", d.A.FD());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.A.FA());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.A.FC());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.A.FB());\n}\nvoid PrintDisasm_fmulsx(const PPCDecodeData& d, StringBuffer* str) {\n  // fmuls[Rc] [FD], [FA], [FC]\n  size_t str_start = str->length();\n  str->Append(\"fmuls\");\n  if (d.A.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"fr{}\", d.A.FD());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.A.FA());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.A.FC());\n}\nvoid PrintDisasm_fmulx(const PPCDecodeData& d, StringBuffer* str) {\n  // fmul[Rc] [FD], [FA], [FC]\n  size_t str_start = str->length();\n  str->Append(\"fmul\");\n  if (d.A.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"fr{}\", d.A.FD());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.A.FA());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.A.FC());\n}\nvoid PrintDisasm_fnabsx(const PPCDecodeData& d, StringBuffer* str) {\n  // fnabs[Rc] [FD], [FB]\n  size_t str_start = str->length();\n  str->Append(\"fnabs\");\n  if (d.X.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"fr{}\", d.X.FD());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.X.FB());\n}\nvoid PrintDisasm_fnegx(const PPCDecodeData& d, StringBuffer* str) {\n  // fneg[Rc] [FD], [FB]\n  size_t str_start = str->length();\n  str->Append(\"fneg\");\n  if (d.X.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"fr{}\", d.X.FD());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.X.FB());\n}\nvoid PrintDisasm_fnmaddsx(const PPCDecodeData& d, StringBuffer* str) {\n  // fnmadds[Rc] [FD], [FA], [FC], [FB]\n  size_t str_start = str->length();\n  str->Append(\"fnmadds\");\n  if (d.A.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"fr{}\", d.A.FD());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.A.FA());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.A.FC());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.A.FB());\n}\nvoid PrintDisasm_fnmaddx(const PPCDecodeData& d, StringBuffer* str) {\n  // fnmadd[Rc] [FD], [FA], [FC], [FB]\n  size_t str_start = str->length();\n  str->Append(\"fnmadd\");\n  if (d.A.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"fr{}\", d.A.FD());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.A.FA());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.A.FC());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.A.FB());\n}\nvoid PrintDisasm_fnmsubsx(const PPCDecodeData& d, StringBuffer* str) {\n  // fnmsubs[Rc] [FD], [FA], [FC], [FB]\n  size_t str_start = str->length();\n  str->Append(\"fnmsubs\");\n  if (d.A.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"fr{}\", d.A.FD());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.A.FA());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.A.FC());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.A.FB());\n}\nvoid PrintDisasm_fnmsubx(const PPCDecodeData& d, StringBuffer* str) {\n  // fnmsub[Rc] [FD], [FA], [FC], [FB]\n  size_t str_start = str->length();\n  str->Append(\"fnmsub\");\n  if (d.A.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"fr{}\", d.A.FD());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.A.FA());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.A.FC());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.A.FB());\n}\nvoid PrintDisasm_fresx(const PPCDecodeData& d, StringBuffer* str) {\n  // fres[Rc] [FD], [FB]\n  size_t str_start = str->length();\n  str->Append(\"fres\");\n  if (d.A.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"fr{}\", d.A.FD());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.A.FB());\n}\nvoid PrintDisasm_frspx(const PPCDecodeData& d, StringBuffer* str) {\n  // frsp[Rc] [FD], [FB]\n  size_t str_start = str->length();\n  str->Append(\"frsp\");\n  if (d.X.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"fr{}\", d.X.FD());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.X.FB());\n}\nvoid PrintDisasm_frsqrtex(const PPCDecodeData& d, StringBuffer* str) {\n  // frsqrte[Rc] [FD], [FB]\n  size_t str_start = str->length();\n  str->Append(\"frsqrte\");\n  if (d.A.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"fr{}\", d.A.FD());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.A.FB());\n}\nvoid PrintDisasm_fselx(const PPCDecodeData& d, StringBuffer* str) {\n  // fsel[Rc] [FD], [FA], [FC], [FB]\n  size_t str_start = str->length();\n  str->Append(\"fsel\");\n  if (d.A.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"fr{}\", d.A.FD());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.A.FA());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.A.FC());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.A.FB());\n}\nvoid PrintDisasm_fsqrtsx(const PPCDecodeData& d, StringBuffer* str) {\n  // fsqrts[Rc] [FD], [FB]\n  size_t str_start = str->length();\n  str->Append(\"fsqrts\");\n  if (d.A.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"fr{}\", d.A.FD());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.A.FB());\n}\nvoid PrintDisasm_fsqrtx(const PPCDecodeData& d, StringBuffer* str) {\n  // fsqrt[Rc] [FD], [FB]\n  size_t str_start = str->length();\n  str->Append(\"fsqrt\");\n  if (d.A.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"fr{}\", d.A.FD());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.A.FB());\n}\nvoid PrintDisasm_fsubsx(const PPCDecodeData& d, StringBuffer* str) {\n  // fsubs[Rc] [FD], [FA], [FB]\n  size_t str_start = str->length();\n  str->Append(\"fsubs\");\n  if (d.A.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"fr{}\", d.A.FD());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.A.FA());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.A.FB());\n}\nvoid PrintDisasm_fsubx(const PPCDecodeData& d, StringBuffer* str) {\n  // fsub[Rc] [FD], [FA], [FB]\n  size_t str_start = str->length();\n  str->Append(\"fsub\");\n  if (d.A.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"fr{}\", d.A.FD());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.A.FA());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.A.FB());\n}\nvoid PrintDisasm_icbi(const PPCDecodeData& d, StringBuffer* str) {\n  // icbi [RA], [RB]\n  size_t str_start = str->length();\n  str->Append(\"icbi\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_isync(const PPCDecodeData& d, StringBuffer* str) {\n  // isync\n  size_t str_start = str->length();\n  str->Append(\"isync\");\n  PadStringBuffer(str, str_start, kNamePad);\n}\nvoid PrintDisasm_lbz(const PPCDecodeData& d, StringBuffer* str) {\n  // lbz [RD], [d]([RA0])\n  size_t str_start = str->length();\n  str->Append(\"lbz\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.D.RD());\n  str->Append(\", \");\n  str->AppendFormat(d.D.d() < 0 ? \"-0x{:X}\" : \"0x{:X}\", std::abs(d.D.d()));\n  str->Append(\"(\");\n  str->AppendFormat(\"r{}\", d.D.RA0());\n  str->Append(\")\");\n}\nvoid PrintDisasm_lbzu(const PPCDecodeData& d, StringBuffer* str) {\n  // lbzu [RD], [d]([RA])\n  size_t str_start = str->length();\n  str->Append(\"lbzu\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.D.RD());\n  str->Append(\", \");\n  str->AppendFormat(d.D.d() < 0 ? \"-0x{:X}\" : \"0x{:X}\", std::abs(d.D.d()));\n  str->Append(\"(\");\n  str->AppendFormat(\"r{}\", d.D.RA());\n  str->Append(\")\");\n}\nvoid PrintDisasm_lbzux(const PPCDecodeData& d, StringBuffer* str) {\n  // lbzux [RD], [RA], [RB]\n  size_t str_start = str->length();\n  str->Append(\"lbzux\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_lbzx(const PPCDecodeData& d, StringBuffer* str) {\n  // lbzx [RD], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"lbzx\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_ld(const PPCDecodeData& d, StringBuffer* str) {\n  // ld [RD], [ds]([RA0])\n  size_t str_start = str->length();\n  str->Append(\"ld\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.DS.RD());\n  str->Append(\", \");\n  str->AppendFormat(d.DS.ds() < 0 ? \"-0x{:X}\" : \"0x{:X}\", std::abs(d.DS.ds()));\n  str->Append(\"(\");\n  str->AppendFormat(\"r{}\", d.DS.RA0());\n  str->Append(\")\");\n}\nvoid PrintDisasm_ldarx(const PPCDecodeData& d, StringBuffer* str) {\n  // ldarx [RD], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"ldarx\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_ldbrx(const PPCDecodeData& d, StringBuffer* str) {\n  // ldbrx [RD], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"ldbrx\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_ldu(const PPCDecodeData& d, StringBuffer* str) {\n  // ldu [RD], [ds]([RA])\n  size_t str_start = str->length();\n  str->Append(\"ldu\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.DS.RD());\n  str->Append(\", \");\n  str->AppendFormat(d.DS.ds() < 0 ? \"-0x{:X}\" : \"0x{:X}\", std::abs(d.DS.ds()));\n  str->Append(\"(\");\n  str->AppendFormat(\"r{}\", d.DS.RA());\n  str->Append(\")\");\n}\nvoid PrintDisasm_ldux(const PPCDecodeData& d, StringBuffer* str) {\n  // ldux [RD], [RA], [RB]\n  size_t str_start = str->length();\n  str->Append(\"ldux\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_ldx(const PPCDecodeData& d, StringBuffer* str) {\n  // ldx [RD], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"ldx\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_lfd(const PPCDecodeData& d, StringBuffer* str) {\n  // lfd [FD], [d]([RA0])\n  size_t str_start = str->length();\n  str->Append(\"lfd\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"fr{}\", d.D.FD());\n  str->Append(\", \");\n  str->AppendFormat(d.D.d() < 0 ? \"-0x{:X}\" : \"0x{:X}\", std::abs(d.D.d()));\n  str->Append(\"(\");\n  str->AppendFormat(\"r{}\", d.D.RA0());\n  str->Append(\")\");\n}\nvoid PrintDisasm_lfdu(const PPCDecodeData& d, StringBuffer* str) {\n  // lfdu [FD], [d]([RA])\n  size_t str_start = str->length();\n  str->Append(\"lfdu\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"fr{}\", d.D.FD());\n  str->Append(\", \");\n  str->AppendFormat(d.D.d() < 0 ? \"-0x{:X}\" : \"0x{:X}\", std::abs(d.D.d()));\n  str->Append(\"(\");\n  str->AppendFormat(\"r{}\", d.D.RA());\n  str->Append(\")\");\n}\nvoid PrintDisasm_lfdux(const PPCDecodeData& d, StringBuffer* str) {\n  // lfdux [FD], [RA], [RB]\n  size_t str_start = str->length();\n  str->Append(\"lfdux\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"fr{}\", d.X.FD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_lfdx(const PPCDecodeData& d, StringBuffer* str) {\n  // lfdx [FD], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"lfdx\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"fr{}\", d.X.FD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_lfs(const PPCDecodeData& d, StringBuffer* str) {\n  // lfs [FD], [d]([RA0])\n  size_t str_start = str->length();\n  str->Append(\"lfs\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"fr{}\", d.D.FD());\n  str->Append(\", \");\n  str->AppendFormat(d.D.d() < 0 ? \"-0x{:X}\" : \"0x{:X}\", std::abs(d.D.d()));\n  str->Append(\"(\");\n  str->AppendFormat(\"r{}\", d.D.RA0());\n  str->Append(\")\");\n}\nvoid PrintDisasm_lfsu(const PPCDecodeData& d, StringBuffer* str) {\n  // lfsu [FD], [d]([RA])\n  size_t str_start = str->length();\n  str->Append(\"lfsu\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"fr{}\", d.D.FD());\n  str->Append(\", \");\n  str->AppendFormat(d.D.d() < 0 ? \"-0x{:X}\" : \"0x{:X}\", std::abs(d.D.d()));\n  str->Append(\"(\");\n  str->AppendFormat(\"r{}\", d.D.RA());\n  str->Append(\")\");\n}\nvoid PrintDisasm_lfsux(const PPCDecodeData& d, StringBuffer* str) {\n  // lfsux [FD], [RA], [RB]\n  size_t str_start = str->length();\n  str->Append(\"lfsux\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"fr{}\", d.X.FD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_lfsx(const PPCDecodeData& d, StringBuffer* str) {\n  // lfsx [FD], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"lfsx\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"fr{}\", d.X.FD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_lha(const PPCDecodeData& d, StringBuffer* str) {\n  // lha [RD], [d]([RA0])\n  size_t str_start = str->length();\n  str->Append(\"lha\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.D.RD());\n  str->Append(\", \");\n  str->AppendFormat(d.D.d() < 0 ? \"-0x{:X}\" : \"0x{:X}\", std::abs(d.D.d()));\n  str->Append(\"(\");\n  str->AppendFormat(\"r{}\", d.D.RA0());\n  str->Append(\")\");\n}\nvoid PrintDisasm_lhau(const PPCDecodeData& d, StringBuffer* str) {\n  // lhau [RD], [d]([RA])\n  size_t str_start = str->length();\n  str->Append(\"lhau\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.D.RD());\n  str->Append(\", \");\n  str->AppendFormat(d.D.d() < 0 ? \"-0x{:X}\" : \"0x{:X}\", std::abs(d.D.d()));\n  str->Append(\"(\");\n  str->AppendFormat(\"r{}\", d.D.RA());\n  str->Append(\")\");\n}\nvoid PrintDisasm_lhaux(const PPCDecodeData& d, StringBuffer* str) {\n  // lhaux [RD], [RA], [RB]\n  size_t str_start = str->length();\n  str->Append(\"lhaux\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_lhax(const PPCDecodeData& d, StringBuffer* str) {\n  // lhax [RD], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"lhax\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_lhbrx(const PPCDecodeData& d, StringBuffer* str) {\n  // lhbrx [RD], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"lhbrx\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_lhz(const PPCDecodeData& d, StringBuffer* str) {\n  // lhz [RD], [d]([RA0])\n  size_t str_start = str->length();\n  str->Append(\"lhz\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.D.RD());\n  str->Append(\", \");\n  str->AppendFormat(d.D.d() < 0 ? \"-0x{:X}\" : \"0x{:X}\", std::abs(d.D.d()));\n  str->Append(\"(\");\n  str->AppendFormat(\"r{}\", d.D.RA0());\n  str->Append(\")\");\n}\nvoid PrintDisasm_lhzu(const PPCDecodeData& d, StringBuffer* str) {\n  // lhzu [RD], [d]([RA])\n  size_t str_start = str->length();\n  str->Append(\"lhzu\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.D.RD());\n  str->Append(\", \");\n  str->AppendFormat(d.D.d() < 0 ? \"-0x{:X}\" : \"0x{:X}\", std::abs(d.D.d()));\n  str->Append(\"(\");\n  str->AppendFormat(\"r{}\", d.D.RA());\n  str->Append(\")\");\n}\nvoid PrintDisasm_lhzux(const PPCDecodeData& d, StringBuffer* str) {\n  // lhzux [RD], [RA], [RB]\n  size_t str_start = str->length();\n  str->Append(\"lhzux\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_lhzx(const PPCDecodeData& d, StringBuffer* str) {\n  // lhzx [RD], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"lhzx\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_lvebx(const PPCDecodeData& d, StringBuffer* str) {\n  // lvebx [VD], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"lvebx\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.X.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_lvehx(const PPCDecodeData& d, StringBuffer* str) {\n  // lvehx [VD], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"lvehx\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.X.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_lvewx(const PPCDecodeData& d, StringBuffer* str) {\n  // lvewx [VD], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"lvewx\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.X.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_lvewx128(const PPCDecodeData& d, StringBuffer* str) {\n  // lvewx128 [VD], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"lvewx128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128_1.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.VX128_1.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.VX128_1.RB());\n}\nvoid PrintDisasm_lvlx(const PPCDecodeData& d, StringBuffer* str) {\n  // lvlx [VD], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"lvlx\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.X.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_lvlx128(const PPCDecodeData& d, StringBuffer* str) {\n  // lvlx128 [VD], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"lvlx128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128_1.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.VX128_1.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.VX128_1.RB());\n}\nvoid PrintDisasm_lvlxl(const PPCDecodeData& d, StringBuffer* str) {\n  // lvlxl [VD], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"lvlxl\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.X.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_lvlxl128(const PPCDecodeData& d, StringBuffer* str) {\n  // lvlxl128 [VD], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"lvlxl128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128_1.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.VX128_1.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.VX128_1.RB());\n}\nvoid PrintDisasm_lvrx(const PPCDecodeData& d, StringBuffer* str) {\n  // lvrx [VD], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"lvrx\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.X.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_lvrx128(const PPCDecodeData& d, StringBuffer* str) {\n  // lvrx128 [VD], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"lvrx128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128_1.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.VX128_1.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.VX128_1.RB());\n}\nvoid PrintDisasm_lvrxl(const PPCDecodeData& d, StringBuffer* str) {\n  // lvrxl [VD], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"lvrxl\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.X.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_lvrxl128(const PPCDecodeData& d, StringBuffer* str) {\n  // lvrxl128 [VD], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"lvrxl128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128_1.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.VX128_1.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.VX128_1.RB());\n}\nvoid PrintDisasm_lvsl(const PPCDecodeData& d, StringBuffer* str) {\n  // lvsl [VD], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"lvsl\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.X.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_lvsl128(const PPCDecodeData& d, StringBuffer* str) {\n  // lvsl128 [VD], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"lvsl128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128_1.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.VX128_1.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.VX128_1.RB());\n}\nvoid PrintDisasm_lvsr(const PPCDecodeData& d, StringBuffer* str) {\n  // lvsr [VD], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"lvsr\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.X.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_lvsr128(const PPCDecodeData& d, StringBuffer* str) {\n  // lvsr128 [VD], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"lvsr128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128_1.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.VX128_1.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.VX128_1.RB());\n}\nvoid PrintDisasm_lvx(const PPCDecodeData& d, StringBuffer* str) {\n  // lvx [VD], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"lvx\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.X.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_lvx128(const PPCDecodeData& d, StringBuffer* str) {\n  // lvx128 [VD], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"lvx128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128_1.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.VX128_1.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.VX128_1.RB());\n}\nvoid PrintDisasm_lvxl(const PPCDecodeData& d, StringBuffer* str) {\n  // lvslx [VD], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"lvslx\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.X.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_lvxl128(const PPCDecodeData& d, StringBuffer* str) {\n  // lvxl128 [VD], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"lvxl128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128_1.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.VX128_1.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.VX128_1.RB());\n}\nvoid PrintDisasm_lwa(const PPCDecodeData& d, StringBuffer* str) {\n  // lwa [RD], [ds]([RA0])\n  size_t str_start = str->length();\n  str->Append(\"lwa\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.DS.RD());\n  str->Append(\", \");\n  str->AppendFormat(d.DS.ds() < 0 ? \"-0x{:X}\" : \"0x{:X}\", std::abs(d.DS.ds()));\n  str->Append(\"(\");\n  str->AppendFormat(\"r{}\", d.DS.RA0());\n  str->Append(\")\");\n}\nvoid PrintDisasm_lwarx(const PPCDecodeData& d, StringBuffer* str) {\n  // lwarx [RD], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"lwarx\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_lwaux(const PPCDecodeData& d, StringBuffer* str) {\n  // lwaux [RD], [RA], [RB]\n  size_t str_start = str->length();\n  str->Append(\"lwaux\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_lwax(const PPCDecodeData& d, StringBuffer* str) {\n  // lwax [RD], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"lwax\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_lwbrx(const PPCDecodeData& d, StringBuffer* str) {\n  // lwbrx [RD], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"lwbrx\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_lwz(const PPCDecodeData& d, StringBuffer* str) {\n  // lwz [RD], [d]([RA0])\n  size_t str_start = str->length();\n  str->Append(\"lwz\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.D.RD());\n  str->Append(\", \");\n  str->AppendFormat(d.D.d() < 0 ? \"-0x{:X}\" : \"0x{:X}\", std::abs(d.D.d()));\n  str->Append(\"(\");\n  str->AppendFormat(\"r{}\", d.D.RA0());\n  str->Append(\")\");\n}\nvoid PrintDisasm_lwzu(const PPCDecodeData& d, StringBuffer* str) {\n  // lwzu [RD], [d]([RA])\n  size_t str_start = str->length();\n  str->Append(\"lwzu\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.D.RD());\n  str->Append(\", \");\n  str->AppendFormat(d.D.d() < 0 ? \"-0x{:X}\" : \"0x{:X}\", std::abs(d.D.d()));\n  str->Append(\"(\");\n  str->AppendFormat(\"r{}\", d.D.RA());\n  str->Append(\")\");\n}\nvoid PrintDisasm_lwzux(const PPCDecodeData& d, StringBuffer* str) {\n  // lwzux [RD], [RA], [RB]\n  size_t str_start = str->length();\n  str->Append(\"lwzux\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_lwzx(const PPCDecodeData& d, StringBuffer* str) {\n  // lwzx [RD], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"lwzx\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_mcrf(const PPCDecodeData& d, StringBuffer* str) {\n  // mcrf [CRFD], [CRFS]\n  size_t str_start = str->length();\n  str->Append(\"mcrf\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"crf{}\", d.XL.CRFD());\n  str->Append(\", \");\n  str->AppendFormat(\"crf{}\", d.XL.CRFS());\n}\nvoid PrintDisasm_mcrfs(const PPCDecodeData& d, StringBuffer* str) {\n  // mcrfs [CRFD], [CRFS]\n  size_t str_start = str->length();\n  str->Append(\"mcrfs\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"crf{}\", d.X.CRFD());\n  str->Append(\", \");\n  str->AppendFormat(\"crf{}\", d.X.CRFS());\n}\nvoid PrintDisasm_mcrxr(const PPCDecodeData& d, StringBuffer* str) {\n  // mcrxr [CRFD]\n  size_t str_start = str->length();\n  str->Append(\"mcrxr\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"crf{}\", d.X.CRFD());\n}\nvoid PrintDisasm_mfcr(const PPCDecodeData& d, StringBuffer* str) {\n  // mfcr [RD]\n  size_t str_start = str->length();\n  str->Append(\"mfcr\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RD());\n}\nvoid PrintDisasm_mffsx(const PPCDecodeData& d, StringBuffer* str) {\n  // mffs[Rc] [RD]\n  size_t str_start = str->length();\n  str->Append(\"mffs\");\n  if (d.X.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RD());\n}\nvoid PrintDisasm_mfmsr(const PPCDecodeData& d, StringBuffer* str) {\n  // mfmsr [RD]\n  size_t str_start = str->length();\n  str->Append(\"mfmsr\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RD());\n}\nvoid PrintDisasm_mfspr(const PPCDecodeData& d, StringBuffer* str) {\n  // mfspr [RD], [SPR]\n  size_t str_start = str->length();\n  str->Append(\"mfspr\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.XFX.RD());\n  str->Append(\", \");\n  str->AppendFormat(\"{}\", d.XFX.SPR());\n}\nvoid PrintDisasm_mftb(const PPCDecodeData& d, StringBuffer* str) {\n  // mftb [RD], [TBR]\n  size_t str_start = str->length();\n  str->Append(\"mftb\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.XFX.RD());\n  str->Append(\", \");\n  str->AppendFormat(\"{}\", d.XFX.TBR());\n}\nvoid PrintDisasm_mtcrf(const PPCDecodeData& d, StringBuffer* str) {\n  // mtcrf [CRM], [RS]\n  size_t str_start = str->length();\n  str->Append(\"mtcrf\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"(UNHANDLED CRM)\");\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.XFX.RS());\n}\nvoid PrintDisasm_mtfsb0x(const PPCDecodeData& d, StringBuffer* str) {\n  // mtfsb0[Rc] [FPSCRD]\n  size_t str_start = str->length();\n  str->Append(\"mtfsb0\");\n  if (d.X.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"(UNHANDLED FPSCRD)\");\n}\nvoid PrintDisasm_mtfsb1x(const PPCDecodeData& d, StringBuffer* str) {\n  // mtfsb1[Rc] [FPSCRD]\n  size_t str_start = str->length();\n  str->Append(\"mtfsb1\");\n  if (d.X.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"(UNHANDLED FPSCRD)\");\n}\nvoid PrintDisasm_mtfsfix(const PPCDecodeData& d, StringBuffer* str) {\n  // mtfsfi[Rc] [CRFD], [IMM]\n  size_t str_start = str->length();\n  str->Append(\"mtfsfi\");\n  if (d.X.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"crf{}\", d.X.CRFD());\n  str->Append(\", \");\n  str->AppendFormat(\"{}\", d.X.IMM());\n}\nvoid PrintDisasm_mtfsfx(const PPCDecodeData& d, StringBuffer* str) {\n  // mtfsf[Rc] [FM], [FB]\n  size_t str_start = str->length();\n  str->Append(\"mtfsf\");\n  if (d.XFL.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"{}\", d.XFL.FM());\n  str->Append(\", \");\n  str->AppendFormat(\"fr{}\", d.XFL.FB());\n}\nvoid PrintDisasm_mtmsr(const PPCDecodeData& d, StringBuffer* str) {\n  // mtmsr [RS]\n  size_t str_start = str->length();\n  str->Append(\"mtmsr\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RS());\n}\nvoid PrintDisasm_mtmsrd(const PPCDecodeData& d, StringBuffer* str) {\n  // mtmsrd [RS]\n  size_t str_start = str->length();\n  str->Append(\"mtmsrd\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RS());\n}\nvoid PrintDisasm_mtspr(const PPCDecodeData& d, StringBuffer* str) {\n  // mtspr [SPR], [RS]\n  size_t str_start = str->length();\n  str->Append(\"mtspr\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"{}\", d.XFX.SPR());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.XFX.RS());\n}\nvoid PrintDisasm_mulhdux(const PPCDecodeData& d, StringBuffer* str) {\n  // mulhdu[Rc] [RD], [RA], [RB]\n  size_t str_start = str->length();\n  str->Append(\"mulhdu\");\n  if (d.XO.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.XO.RD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.XO.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.XO.RB());\n}\nvoid PrintDisasm_mulhdx(const PPCDecodeData& d, StringBuffer* str) {\n  // mulhd[Rc] [RD], [RA], [RB]\n  size_t str_start = str->length();\n  str->Append(\"mulhd\");\n  if (d.XO.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.XO.RD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.XO.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.XO.RB());\n}\nvoid PrintDisasm_mulhwux(const PPCDecodeData& d, StringBuffer* str) {\n  // mulhwu[Rc] [RD], [RA], [RB]\n  size_t str_start = str->length();\n  str->Append(\"mulhwu\");\n  if (d.XO.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.XO.RD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.XO.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.XO.RB());\n}\nvoid PrintDisasm_mulhwx(const PPCDecodeData& d, StringBuffer* str) {\n  // mulhw[Rc] [RD], [RA], [RB]\n  size_t str_start = str->length();\n  str->Append(\"mulhw\");\n  if (d.XO.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.XO.RD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.XO.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.XO.RB());\n}\nvoid PrintDisasm_mulldx(const PPCDecodeData& d, StringBuffer* str) {\n  // mulld[OE][Rc] [RD], [RA], [RB]\n  size_t str_start = str->length();\n  str->Append(\"mulld\");\n  if (d.XO.OE()) str->Append('o');\n  if (d.XO.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.XO.RD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.XO.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.XO.RB());\n}\nvoid PrintDisasm_mulli(const PPCDecodeData& d, StringBuffer* str) {\n  // mulli [RD], [RA], [SIMM]\n  size_t str_start = str->length();\n  str->Append(\"mulli\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.D.RD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.D.RA());\n  str->Append(\", \");\n  str->AppendFormat(d.D.SIMM() < 0 ? \"-0x{:X}\" : \"0x{:X}\", std::abs(d.D.SIMM()));\n}\nvoid PrintDisasm_mullwx(const PPCDecodeData& d, StringBuffer* str) {\n  // mullw[OE][Rc] [RD], [RA], [RB]\n  size_t str_start = str->length();\n  str->Append(\"mullw\");\n  if (d.XO.OE()) str->Append('o');\n  if (d.XO.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.XO.RD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.XO.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.XO.RB());\n}\nvoid PrintDisasm_nandx(const PPCDecodeData& d, StringBuffer* str) {\n  // nand[Rc] [RA], [RS], [RB]\n  size_t str_start = str->length();\n  str->Append(\"nand\");\n  if (d.X.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RS());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_negx(const PPCDecodeData& d, StringBuffer* str) {\n  // neg[OE][Rc] [RD], [RA]\n  size_t str_start = str->length();\n  str->Append(\"neg\");\n  if (d.XO.OE()) str->Append('o');\n  if (d.XO.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.XO.RD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.XO.RA());\n}\nvoid PrintDisasm_norx(const PPCDecodeData& d, StringBuffer* str) {\n  // nor[Rc] [RA], [RS], [RB]\n  size_t str_start = str->length();\n  str->Append(\"nor\");\n  if (d.X.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RS());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_orcx(const PPCDecodeData& d, StringBuffer* str) {\n  // orc[Rc] [RA], [RS], [RB]\n  size_t str_start = str->length();\n  str->Append(\"orc\");\n  if (d.X.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RS());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_ori(const PPCDecodeData& d, StringBuffer* str) {\n  // ori [RA], [RS], [UIMM]\n  size_t str_start = str->length();\n  str->Append(\"ori\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.D.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.D.RS());\n  str->Append(\", \");\n  str->AppendFormat(\"0x{:X}\", d.D.UIMM());\n}\nvoid PrintDisasm_oris(const PPCDecodeData& d, StringBuffer* str) {\n  // oris [RA], [RS], [UIMM]\n  size_t str_start = str->length();\n  str->Append(\"oris\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.D.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.D.RS());\n  str->Append(\", \");\n  str->AppendFormat(\"0x{:X}\", d.D.UIMM());\n}\nvoid PrintDisasm_orx(const PPCDecodeData& d, StringBuffer* str) {\n  // or[Rc] [RA], [RS], [RB]\n  size_t str_start = str->length();\n  str->Append(\"or\");\n  if (d.X.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RS());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_rldclx(const PPCDecodeData& d, StringBuffer* str) {\n  // rldcl[Rc] [RA], [RS], [RB], [MB]\n  size_t str_start = str->length();\n  str->Append(\"rldcl\");\n  if (d.MDS.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.MDS.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.MDS.RS());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.MDS.RB());\n  str->Append(\", \");\n  str->AppendFormat(\"{}\", d.MDS.MB());\n}\nvoid PrintDisasm_rldcrx(const PPCDecodeData& d, StringBuffer* str) {\n  // rldcr[Rc] [RA], [RS], [RB], [ME]\n  size_t str_start = str->length();\n  str->Append(\"rldcr\");\n  if (d.MDS.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.MDS.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.MDS.RS());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.MDS.RB());\n  str->Append(\", \");\n  str->AppendFormat(\"{}\", d.MDS.ME());\n}\nvoid PrintDisasm_rldiclx(const PPCDecodeData& d, StringBuffer* str) {\n  // rldicl[Rc] [RA], [RS], [SH], [MB]\n  size_t str_start = str->length();\n  str->Append(\"rldicl\");\n  if (d.MD.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.MD.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.MD.RS());\n  str->Append(\", \");\n  str->AppendFormat(\"{}\", d.MD.SH());\n  str->Append(\", \");\n  str->AppendFormat(\"{}\", d.MD.MB());\n}\nvoid PrintDisasm_rldicrx(const PPCDecodeData& d, StringBuffer* str) {\n  // rldicr[Rc] [RA], [RS], [SH], [ME]\n  size_t str_start = str->length();\n  str->Append(\"rldicr\");\n  if (d.MD.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.MD.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.MD.RS());\n  str->Append(\", \");\n  str->AppendFormat(\"{}\", d.MD.SH());\n  str->Append(\", \");\n  str->AppendFormat(\"{}\", d.MD.ME());\n}\nvoid PrintDisasm_rldicx(const PPCDecodeData& d, StringBuffer* str) {\n  // rldic[Rc] [RA], [RS], [SH], [MB]\n  size_t str_start = str->length();\n  str->Append(\"rldic\");\n  if (d.MD.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.MD.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.MD.RS());\n  str->Append(\", \");\n  str->AppendFormat(\"{}\", d.MD.SH());\n  str->Append(\", \");\n  str->AppendFormat(\"{}\", d.MD.MB());\n}\nvoid PrintDisasm_rldimix(const PPCDecodeData& d, StringBuffer* str) {\n  // rldimi[Rc] [RA], [RS], [SH], [MB]\n  size_t str_start = str->length();\n  str->Append(\"rldimi\");\n  if (d.MD.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.MD.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.MD.RS());\n  str->Append(\", \");\n  str->AppendFormat(\"{}\", d.MD.SH());\n  str->Append(\", \");\n  str->AppendFormat(\"{}\", d.MD.MB());\n}\nvoid PrintDisasm_rlwimix(const PPCDecodeData& d, StringBuffer* str) {\n  // rlwimi[Rc] [RA], [RS], [SH], [MB], [ME]\n  size_t str_start = str->length();\n  str->Append(\"rlwimi\");\n  if (d.M.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.M.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.M.RS());\n  str->Append(\", \");\n  str->AppendFormat(\"{}\", d.M.SH());\n  str->Append(\", \");\n  str->AppendFormat(\"{}\", d.M.MB());\n  str->Append(\", \");\n  str->AppendFormat(\"{}\", d.M.ME());\n}\nvoid PrintDisasm_rlwinmx(const PPCDecodeData& d, StringBuffer* str) {\n  // rlwinm[Rc] [RA], [RS], [SH], [MB], [ME]\n  size_t str_start = str->length();\n  str->Append(\"rlwinm\");\n  if (d.M.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.M.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.M.RS());\n  str->Append(\", \");\n  str->AppendFormat(\"{}\", d.M.SH());\n  str->Append(\", \");\n  str->AppendFormat(\"{}\", d.M.MB());\n  str->Append(\", \");\n  str->AppendFormat(\"{}\", d.M.ME());\n}\nvoid PrintDisasm_rlwnmx(const PPCDecodeData& d, StringBuffer* str) {\n  // rlwnm[Rc] [RA], [RS], [RB], [MB], [ME]\n  size_t str_start = str->length();\n  str->Append(\"rlwnm\");\n  if (d.M.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.M.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.M.RS());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.M.RB());\n  str->Append(\", \");\n  str->AppendFormat(\"{}\", d.M.MB());\n  str->Append(\", \");\n  str->AppendFormat(\"{}\", d.M.ME());\n}\nvoid PrintDisasm_sc(const PPCDecodeData& d, StringBuffer* str) {\n  // sc [LEV]\n  size_t str_start = str->length();\n  str->Append(\"sc\");\n  PadStringBuffer(str, str_start, kNamePad);\n  if (d.SC.LEV()) str->AppendFormat(\"{}\", d.SC.LEV());\n}\nvoid PrintDisasm_sldx(const PPCDecodeData& d, StringBuffer* str) {\n  // sld[Rc] [RA], [RS], [RB]\n  size_t str_start = str->length();\n  str->Append(\"sld\");\n  if (d.X.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RS());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_slwx(const PPCDecodeData& d, StringBuffer* str) {\n  // slw[Rc] [RA], [RS], [RB]\n  size_t str_start = str->length();\n  str->Append(\"slw\");\n  if (d.X.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RS());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_sradix(const PPCDecodeData& d, StringBuffer* str) {\n  // sradi[Rc] [RA], [RS], [SH]\n  size_t str_start = str->length();\n  str->Append(\"sradi\");\n  if (d.XS.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.XS.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.XS.RS());\n  str->Append(\", \");\n  str->AppendFormat(\"{}\", d.XS.SH());\n}\nvoid PrintDisasm_sradx(const PPCDecodeData& d, StringBuffer* str) {\n  // srad[Rc] [RA], [RS], [RB]\n  size_t str_start = str->length();\n  str->Append(\"srad\");\n  if (d.X.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RS());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_srawix(const PPCDecodeData& d, StringBuffer* str) {\n  // srawi[Rc] [RA], [RS], [SH]\n  size_t str_start = str->length();\n  str->Append(\"srawi\");\n  if (d.X.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RS());\n  str->Append(\", \");\n  str->AppendFormat(\"{}\", d.X.SH());\n}\nvoid PrintDisasm_srawx(const PPCDecodeData& d, StringBuffer* str) {\n  // sraw[Rc] [RA], [RS], [RB]\n  size_t str_start = str->length();\n  str->Append(\"sraw\");\n  if (d.X.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RS());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_srdx(const PPCDecodeData& d, StringBuffer* str) {\n  // srd[Rc] [RA], [RS], [RB]\n  size_t str_start = str->length();\n  str->Append(\"srd\");\n  if (d.X.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RS());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_srwx(const PPCDecodeData& d, StringBuffer* str) {\n  // srw[Rc] [RA], [RS], [RB]\n  size_t str_start = str->length();\n  str->Append(\"srw\");\n  if (d.X.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RS());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_stb(const PPCDecodeData& d, StringBuffer* str) {\n  // stb [RS], [d]([RA0])\n  size_t str_start = str->length();\n  str->Append(\"stb\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.D.RS());\n  str->Append(\", \");\n  str->AppendFormat(d.D.d() < 0 ? \"-0x{:X}\" : \"0x{:X}\", std::abs(d.D.d()));\n  str->Append(\"(\");\n  str->AppendFormat(\"r{}\", d.D.RA0());\n  str->Append(\")\");\n}\nvoid PrintDisasm_stbu(const PPCDecodeData& d, StringBuffer* str) {\n  // stbu [RS], [d]([RA])\n  size_t str_start = str->length();\n  str->Append(\"stbu\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.D.RS());\n  str->Append(\", \");\n  str->AppendFormat(d.D.d() < 0 ? \"-0x{:X}\" : \"0x{:X}\", std::abs(d.D.d()));\n  str->Append(\"(\");\n  str->AppendFormat(\"r{}\", d.D.RA());\n  str->Append(\")\");\n}\nvoid PrintDisasm_stbux(const PPCDecodeData& d, StringBuffer* str) {\n  // stbux [RS], [RA], [RB]\n  size_t str_start = str->length();\n  str->Append(\"stbux\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RS());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_stbx(const PPCDecodeData& d, StringBuffer* str) {\n  // stbx [RS], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"stbx\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RS());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_std(const PPCDecodeData& d, StringBuffer* str) {\n  // std [RS], [ds]([RA0])\n  size_t str_start = str->length();\n  str->Append(\"std\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.DS.RS());\n  str->Append(\", \");\n  str->AppendFormat(d.DS.ds() < 0 ? \"-0x{:X}\" : \"0x{:X}\", std::abs(d.DS.ds()));\n  str->Append(\"(\");\n  str->AppendFormat(\"r{}\", d.DS.RA0());\n  str->Append(\")\");\n}\nvoid PrintDisasm_stdbrx(const PPCDecodeData& d, StringBuffer* str) {\n  // stdbrx [RS], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"stdbrx\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RS());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_stdcx(const PPCDecodeData& d, StringBuffer* str) {\n  // stdcx. [RS], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"stdcx.\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RS());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_stdu(const PPCDecodeData& d, StringBuffer* str) {\n  // stdu [RS], [ds]([RA])\n  size_t str_start = str->length();\n  str->Append(\"stdu\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.DS.RS());\n  str->Append(\", \");\n  str->AppendFormat(d.DS.ds() < 0 ? \"-0x{:X}\" : \"0x{:X}\", std::abs(d.DS.ds()));\n  str->Append(\"(\");\n  str->AppendFormat(\"r{}\", d.DS.RA());\n  str->Append(\")\");\n}\nvoid PrintDisasm_stdux(const PPCDecodeData& d, StringBuffer* str) {\n  // stdux [RS], [RA], [RB]\n  size_t str_start = str->length();\n  str->Append(\"stdux\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RS());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_stdx(const PPCDecodeData& d, StringBuffer* str) {\n  // stdx [RS], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"stdx\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RS());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_stfd(const PPCDecodeData& d, StringBuffer* str) {\n  // stfd [FS], [d]([RA0])\n  size_t str_start = str->length();\n  str->Append(\"stfd\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"fr{}\", d.D.FS());\n  str->Append(\", \");\n  str->AppendFormat(d.D.d() < 0 ? \"-0x{:X}\" : \"0x{:X}\", std::abs(d.D.d()));\n  str->Append(\"(\");\n  str->AppendFormat(\"r{}\", d.D.RA0());\n  str->Append(\")\");\n}\nvoid PrintDisasm_stfdu(const PPCDecodeData& d, StringBuffer* str) {\n  // stfdu [FS], [d]([RA])\n  size_t str_start = str->length();\n  str->Append(\"stfdu\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"fr{}\", d.D.FS());\n  str->Append(\", \");\n  str->AppendFormat(d.D.d() < 0 ? \"-0x{:X}\" : \"0x{:X}\", std::abs(d.D.d()));\n  str->Append(\"(\");\n  str->AppendFormat(\"r{}\", d.D.RA());\n  str->Append(\")\");\n}\nvoid PrintDisasm_stfdux(const PPCDecodeData& d, StringBuffer* str) {\n  // stfdux [FS], [RA], [RB]\n  size_t str_start = str->length();\n  str->Append(\"stfdux\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"fr{}\", d.X.FS());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_stfdx(const PPCDecodeData& d, StringBuffer* str) {\n  // stfdx [FS], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"stfdx\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"fr{}\", d.X.FS());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_stfiwx(const PPCDecodeData& d, StringBuffer* str) {\n  // stfiwx [FS], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"stfiwx\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"fr{}\", d.X.FS());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_stfs(const PPCDecodeData& d, StringBuffer* str) {\n  // stfs [FS], [d]([RA0])\n  size_t str_start = str->length();\n  str->Append(\"stfs\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"fr{}\", d.D.FS());\n  str->Append(\", \");\n  str->AppendFormat(d.D.d() < 0 ? \"-0x{:X}\" : \"0x{:X}\", std::abs(d.D.d()));\n  str->Append(\"(\");\n  str->AppendFormat(\"r{}\", d.D.RA0());\n  str->Append(\")\");\n}\nvoid PrintDisasm_stfsu(const PPCDecodeData& d, StringBuffer* str) {\n  // stfsu [FS], [d]([RA])\n  size_t str_start = str->length();\n  str->Append(\"stfsu\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"fr{}\", d.D.FS());\n  str->Append(\", \");\n  str->AppendFormat(d.D.d() < 0 ? \"-0x{:X}\" : \"0x{:X}\", std::abs(d.D.d()));\n  str->Append(\"(\");\n  str->AppendFormat(\"r{}\", d.D.RA());\n  str->Append(\")\");\n}\nvoid PrintDisasm_stfsux(const PPCDecodeData& d, StringBuffer* str) {\n  // stfsux [FS], [RA], [RB]\n  size_t str_start = str->length();\n  str->Append(\"stfsux\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"fr{}\", d.X.FS());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_stfsx(const PPCDecodeData& d, StringBuffer* str) {\n  // stfsx [FS], [RA], [RB]\n  size_t str_start = str->length();\n  str->Append(\"stfsx\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"fr{}\", d.X.FS());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_sth(const PPCDecodeData& d, StringBuffer* str) {\n  // sth [RS], [d]([RA0])\n  size_t str_start = str->length();\n  str->Append(\"sth\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.D.RS());\n  str->Append(\", \");\n  str->AppendFormat(d.D.d() < 0 ? \"-0x{:X}\" : \"0x{:X}\", std::abs(d.D.d()));\n  str->Append(\"(\");\n  str->AppendFormat(\"r{}\", d.D.RA0());\n  str->Append(\")\");\n}\nvoid PrintDisasm_sthbrx(const PPCDecodeData& d, StringBuffer* str) {\n  // sthbrx [RS], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"sthbrx\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RS());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_sthu(const PPCDecodeData& d, StringBuffer* str) {\n  // sthu [RS], [d]([RA])\n  size_t str_start = str->length();\n  str->Append(\"sthu\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.D.RS());\n  str->Append(\", \");\n  str->AppendFormat(d.D.d() < 0 ? \"-0x{:X}\" : \"0x{:X}\", std::abs(d.D.d()));\n  str->Append(\"(\");\n  str->AppendFormat(\"r{}\", d.D.RA());\n  str->Append(\")\");\n}\nvoid PrintDisasm_sthux(const PPCDecodeData& d, StringBuffer* str) {\n  // sthux [RS], [RA], [RB]\n  size_t str_start = str->length();\n  str->Append(\"sthux\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RS());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_sthx(const PPCDecodeData& d, StringBuffer* str) {\n  // sthx [RS], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"sthx\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RS());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_stvebx(const PPCDecodeData& d, StringBuffer* str) {\n  // stvebx [VS], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"stvebx\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.X.VS());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_stvehx(const PPCDecodeData& d, StringBuffer* str) {\n  // stvehx [VS], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"stvehx\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.X.VS());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_stvewx(const PPCDecodeData& d, StringBuffer* str) {\n  // stvewx [VS], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"stvewx\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.X.VS());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_stvewx128(const PPCDecodeData& d, StringBuffer* str) {\n  // stvewx128 [VS], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"stvewx128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128_1.VS());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.VX128_1.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.VX128_1.RB());\n}\nvoid PrintDisasm_stvlx(const PPCDecodeData& d, StringBuffer* str) {\n  // stvlx [VS], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"stvlx\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.X.VS());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_stvlx128(const PPCDecodeData& d, StringBuffer* str) {\n  // stvlx128 [VS], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"stvlx128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128_1.VS());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.VX128_1.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.VX128_1.RB());\n}\nvoid PrintDisasm_stvlxl(const PPCDecodeData& d, StringBuffer* str) {\n  // stvlxl [VS], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"stvlxl\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.X.VS());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_stvlxl128(const PPCDecodeData& d, StringBuffer* str) {\n  // stvlxl128 [VS], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"stvlxl128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128_1.VS());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.VX128_1.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.VX128_1.RB());\n}\nvoid PrintDisasm_stvrx(const PPCDecodeData& d, StringBuffer* str) {\n  // stvrx [VS], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"stvrx\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.X.VS());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_stvrx128(const PPCDecodeData& d, StringBuffer* str) {\n  // stvrx128 [VS], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"stvrx128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128_1.VS());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.VX128_1.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.VX128_1.RB());\n}\nvoid PrintDisasm_stvrxl(const PPCDecodeData& d, StringBuffer* str) {\n  // stvrxl [VS], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"stvrxl\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.X.VS());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_stvrxl128(const PPCDecodeData& d, StringBuffer* str) {\n  // stvrxl128 [VS], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"stvrxl128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128_1.VS());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.VX128_1.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.VX128_1.RB());\n}\nvoid PrintDisasm_stvx(const PPCDecodeData& d, StringBuffer* str) {\n  // stvx [VS], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"stvx\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.X.VS());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_stvx128(const PPCDecodeData& d, StringBuffer* str) {\n  // stvx128 [VS], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"stvx128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128_1.VS());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.VX128_1.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.VX128_1.RB());\n}\nvoid PrintDisasm_stvxl(const PPCDecodeData& d, StringBuffer* str) {\n  // stvxl [VS], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"stvxl\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.X.VS());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_stvxl128(const PPCDecodeData& d, StringBuffer* str) {\n  // stvxl128 [VS], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"stvxl128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128_1.VS());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.VX128_1.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.VX128_1.RB());\n}\nvoid PrintDisasm_stw(const PPCDecodeData& d, StringBuffer* str) {\n  // stw [RS], [d]([RA0])\n  size_t str_start = str->length();\n  str->Append(\"stw\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.D.RS());\n  str->Append(\", \");\n  str->AppendFormat(d.D.d() < 0 ? \"-0x{:X}\" : \"0x{:X}\", std::abs(d.D.d()));\n  str->Append(\"(\");\n  str->AppendFormat(\"r{}\", d.D.RA0());\n  str->Append(\")\");\n}\nvoid PrintDisasm_stwbrx(const PPCDecodeData& d, StringBuffer* str) {\n  // stwbrx [RS], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"stwbrx\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RS());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_stwcx(const PPCDecodeData& d, StringBuffer* str) {\n  // stwcx. [RS], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"stwcx.\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RS());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_stwu(const PPCDecodeData& d, StringBuffer* str) {\n  // stwu [RS], [d]([RA])\n  size_t str_start = str->length();\n  str->Append(\"stwu\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.D.RS());\n  str->Append(\", \");\n  str->AppendFormat(d.D.d() < 0 ? \"-0x{:X}\" : \"0x{:X}\", std::abs(d.D.d()));\n  str->Append(\"(\");\n  str->AppendFormat(\"r{}\", d.D.RA());\n  str->Append(\")\");\n}\nvoid PrintDisasm_stwux(const PPCDecodeData& d, StringBuffer* str) {\n  // stwux [RS], [RA], [RB]\n  size_t str_start = str->length();\n  str->Append(\"stwux\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RS());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_stwx(const PPCDecodeData& d, StringBuffer* str) {\n  // stwx [RS], [RA0], [RB]\n  size_t str_start = str->length();\n  str->Append(\"stwx\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RS());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA0());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_subfcx(const PPCDecodeData& d, StringBuffer* str) {\n  // subfc[OE][Rc] [RD], [RA], [RB]\n  size_t str_start = str->length();\n  str->Append(\"subfc\");\n  if (d.XO.OE()) str->Append('o');\n  if (d.XO.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.XO.RD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.XO.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.XO.RB());\n}\nvoid PrintDisasm_subfex(const PPCDecodeData& d, StringBuffer* str) {\n  // subfe[OE][Rc] [RD], [RA], [RB]\n  size_t str_start = str->length();\n  str->Append(\"subfe\");\n  if (d.XO.OE()) str->Append('o');\n  if (d.XO.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.XO.RD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.XO.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.XO.RB());\n}\nvoid PrintDisasm_subficx(const PPCDecodeData& d, StringBuffer* str) {\n  // subfic [RD], [RA], [SIMM]\n  size_t str_start = str->length();\n  str->Append(\"subfic\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.D.RD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.D.RA());\n  str->Append(\", \");\n  str->AppendFormat(d.D.SIMM() < 0 ? \"-0x{:X}\" : \"0x{:X}\", std::abs(d.D.SIMM()));\n}\nvoid PrintDisasm_subfmex(const PPCDecodeData& d, StringBuffer* str) {\n  // subfme[OE][Rc] [RD], [RA]\n  size_t str_start = str->length();\n  str->Append(\"subfme\");\n  if (d.XO.OE()) str->Append('o');\n  if (d.XO.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.XO.RD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.XO.RA());\n}\nvoid PrintDisasm_subfx(const PPCDecodeData& d, StringBuffer* str) {\n  // subf[OE][Rc] [RD], [RA], [RB]\n  size_t str_start = str->length();\n  str->Append(\"subf\");\n  if (d.XO.OE()) str->Append('o');\n  if (d.XO.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.XO.RD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.XO.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.XO.RB());\n}\nvoid PrintDisasm_subfzex(const PPCDecodeData& d, StringBuffer* str) {\n  // subfze[OE][Rc] [RD], [RA]\n  size_t str_start = str->length();\n  str->Append(\"subfze\");\n  if (d.XO.OE()) str->Append('o');\n  if (d.XO.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.XO.RD());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.XO.RA());\n}\nvoid PrintDisasm_sync(const PPCDecodeData& d, StringBuffer* str) {\n  // sync\n  size_t str_start = str->length();\n  str->Append(\"sync\");\n  PadStringBuffer(str, str_start, kNamePad);\n}\nvoid PrintDisasm_td(const PPCDecodeData& d, StringBuffer* str) {\n  // td [TO], [RA], [RB]\n  size_t str_start = str->length();\n  str->Append(\"td\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"{}\", d.X.TO());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_tdi(const PPCDecodeData& d, StringBuffer* str) {\n  // tdi [TO], [RA], [SIMM]\n  size_t str_start = str->length();\n  str->Append(\"tdi\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"{}\", d.D.TO());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.D.RA());\n  str->Append(\", \");\n  str->AppendFormat(d.D.SIMM() < 0 ? \"-0x{:X}\" : \"0x{:X}\", std::abs(d.D.SIMM()));\n}\nvoid PrintDisasm_tw(const PPCDecodeData& d, StringBuffer* str) {\n  // tw [TO], [RA], [RB]\n  size_t str_start = str->length();\n  str->Append(\"tw\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"{}\", d.X.TO());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\nvoid PrintDisasm_twi(const PPCDecodeData& d, StringBuffer* str) {\n  // tw [TO], [RA], [SIMM]\n  size_t str_start = str->length();\n  str->Append(\"tw\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"{}\", d.D.TO());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.D.RA());\n  str->Append(\", \");\n  str->AppendFormat(d.D.SIMM() < 0 ? \"-0x{:X}\" : \"0x{:X}\", std::abs(d.D.SIMM()));\n}\nvoid PrintDisasm_vaddcuw(const PPCDecodeData& d, StringBuffer* str) {\n  // vaddcuw [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vaddcuw\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vaddfp(const PPCDecodeData& d, StringBuffer* str) {\n  // vaddfp [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vaddfp\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vaddfp128(const PPCDecodeData& d, StringBuffer* str) {\n  // vaddfp128 [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vaddfp128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VB());\n}\nvoid PrintDisasm_vaddsbs(const PPCDecodeData& d, StringBuffer* str) {\n  // vaddsbs [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vaddsbs\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vaddshs(const PPCDecodeData& d, StringBuffer* str) {\n  // vaddshs [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vaddshs\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vaddsws(const PPCDecodeData& d, StringBuffer* str) {\n  // vaddsws [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vaddsws\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vaddubm(const PPCDecodeData& d, StringBuffer* str) {\n  // vaddubm [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vaddubm\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vaddubs(const PPCDecodeData& d, StringBuffer* str) {\n  // vaddubs [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vaddubs\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vadduhm(const PPCDecodeData& d, StringBuffer* str) {\n  // vadduhm [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vadduhm\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vadduhs(const PPCDecodeData& d, StringBuffer* str) {\n  // vadduhs [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vadduhs\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vadduwm(const PPCDecodeData& d, StringBuffer* str) {\n  // vadduwm [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vadduwm\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vadduws(const PPCDecodeData& d, StringBuffer* str) {\n  // vadduws [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vadduws\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vand(const PPCDecodeData& d, StringBuffer* str) {\n  // vand [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vand\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vand128(const PPCDecodeData& d, StringBuffer* str) {\n  // vand128 [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vand128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VB());\n}\nvoid PrintDisasm_vandc(const PPCDecodeData& d, StringBuffer* str) {\n  // vandc [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vandc\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vandc128(const PPCDecodeData& d, StringBuffer* str) {\n  // vandc128 [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vandc128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VB());\n}\nvoid PrintDisasm_vavgsb(const PPCDecodeData& d, StringBuffer* str) {\n  // vavgsb [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vavgsb\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vavgsh(const PPCDecodeData& d, StringBuffer* str) {\n  // vavgsh [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vavgsh\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vavgsw(const PPCDecodeData& d, StringBuffer* str) {\n  // vavgsw [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vavgsw\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vavgub(const PPCDecodeData& d, StringBuffer* str) {\n  // vavgub [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vavgub\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vavguh(const PPCDecodeData& d, StringBuffer* str) {\n  // vavguh [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vavguh\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vavguw(const PPCDecodeData& d, StringBuffer* str) {\n  // vavguw [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vavguw\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vcfpsxws128(const PPCDecodeData& d, StringBuffer* str) {\n  // vcfpsxws128 [VD], [VB], [UIMM]\n  size_t str_start = str->length();\n  str->Append(\"vcfpsxws128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128_3.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128_3.VB());\n  str->Append(\", \");\n  str->AppendFormat(\"0x{:X}\", d.VX128_3.UIMM());\n}\nvoid PrintDisasm_vcfpuxws128(const PPCDecodeData& d, StringBuffer* str) {\n  // vcfpuxws128 [VD], [VB], [UIMM]\n  size_t str_start = str->length();\n  str->Append(\"vcfpuxws128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128_3.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128_3.VB());\n  str->Append(\", \");\n  str->AppendFormat(\"0x{:X}\", d.VX128_3.UIMM());\n}\nvoid PrintDisasm_vcfsx(const PPCDecodeData& d, StringBuffer* str) {\n  // vcfsx [VD], [VB], [UIMM]\n  size_t str_start = str->length();\n  str->Append(\"vcfsx\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n  str->Append(\", \");\n  str->AppendFormat(\"0x{:X}\", d.VX.UIMM());\n}\nvoid PrintDisasm_vcfux(const PPCDecodeData& d, StringBuffer* str) {\n  // vcfux [VD], [VB], [UIMM]\n  size_t str_start = str->length();\n  str->Append(\"vcfux\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n  str->Append(\", \");\n  str->AppendFormat(\"0x{:X}\", d.VX.UIMM());\n}\nvoid PrintDisasm_vcmpbfp(const PPCDecodeData& d, StringBuffer* str) {\n  // vcmpbfp[Rc] [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vcmpbfp\");\n  if (d.VC.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VC.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VC.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VC.VB());\n}\nvoid PrintDisasm_vcmpbfp128(const PPCDecodeData& d, StringBuffer* str) {\n  // vcmpbfp128[Rc] [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vcmpbfp128\");\n  if (d.VX128_R.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128_R.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128_R.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128_R.VB());\n}\nvoid PrintDisasm_vcmpeqfp(const PPCDecodeData& d, StringBuffer* str) {\n  // vcmpeqfp[Rc] [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vcmpeqfp\");\n  if (d.VC.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VC.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VC.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VC.VB());\n}\nvoid PrintDisasm_vcmpeqfp128(const PPCDecodeData& d, StringBuffer* str) {\n  // vcmpeqfp128[Rc] [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vcmpeqfp128\");\n  if (d.VX128_R.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128_R.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128_R.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128_R.VB());\n}\nvoid PrintDisasm_vcmpequb(const PPCDecodeData& d, StringBuffer* str) {\n  // vcmpequb[Rc] [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vcmpequb\");\n  if (d.VC.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VC.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VC.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VC.VB());\n}\nvoid PrintDisasm_vcmpequh(const PPCDecodeData& d, StringBuffer* str) {\n  // vcmpequh[Rc] [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vcmpequh\");\n  if (d.VC.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VC.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VC.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VC.VB());\n}\nvoid PrintDisasm_vcmpequw(const PPCDecodeData& d, StringBuffer* str) {\n  // vcmpequw[Rc] [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vcmpequw\");\n  if (d.VC.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VC.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VC.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VC.VB());\n}\nvoid PrintDisasm_vcmpequw128(const PPCDecodeData& d, StringBuffer* str) {\n  // vcmpequw128[Rc] [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vcmpequw128\");\n  if (d.VX128_R.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128_R.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128_R.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128_R.VB());\n}\nvoid PrintDisasm_vcmpgefp(const PPCDecodeData& d, StringBuffer* str) {\n  // vcmpgefp[Rc] [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vcmpgefp\");\n  if (d.VC.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VC.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VC.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VC.VB());\n}\nvoid PrintDisasm_vcmpgefp128(const PPCDecodeData& d, StringBuffer* str) {\n  // vcmpgefp128[Rc] [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vcmpgefp128\");\n  if (d.VX128_R.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128_R.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128_R.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128_R.VB());\n}\nvoid PrintDisasm_vcmpgtfp(const PPCDecodeData& d, StringBuffer* str) {\n  // vcmpgtfp[Rc] [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vcmpgtfp\");\n  if (d.VC.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VC.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VC.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VC.VB());\n}\nvoid PrintDisasm_vcmpgtfp128(const PPCDecodeData& d, StringBuffer* str) {\n  // vcmpgtfp128[Rc] [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vcmpgtfp128\");\n  if (d.VX128_R.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128_R.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128_R.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128_R.VB());\n}\nvoid PrintDisasm_vcmpgtsb(const PPCDecodeData& d, StringBuffer* str) {\n  // vcmpgtsb[Rc] [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vcmpgtsb\");\n  if (d.VC.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VC.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VC.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VC.VB());\n}\nvoid PrintDisasm_vcmpgtsh(const PPCDecodeData& d, StringBuffer* str) {\n  // vcmpgtsh[Rc] [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vcmpgtsh\");\n  if (d.VC.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VC.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VC.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VC.VB());\n}\nvoid PrintDisasm_vcmpgtsw(const PPCDecodeData& d, StringBuffer* str) {\n  // vcmpgtsw[Rc] [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vcmpgtsw\");\n  if (d.VC.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VC.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VC.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VC.VB());\n}\nvoid PrintDisasm_vcmpgtub(const PPCDecodeData& d, StringBuffer* str) {\n  // vcmpgtub[Rc] [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vcmpgtub\");\n  if (d.VC.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VC.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VC.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VC.VB());\n}\nvoid PrintDisasm_vcmpgtuh(const PPCDecodeData& d, StringBuffer* str) {\n  // vcmpgtuh[Rc] [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vcmpgtuh\");\n  if (d.VC.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VC.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VC.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VC.VB());\n}\nvoid PrintDisasm_vcmpgtuw(const PPCDecodeData& d, StringBuffer* str) {\n  // vcmpgtuw[Rc] [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vcmpgtuw\");\n  if (d.VC.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VC.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VC.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VC.VB());\n}\nvoid PrintDisasm_vcsxwfp128(const PPCDecodeData& d, StringBuffer* str) {\n  // vcsxwfp128 [VD], [VB], [UIMM]\n  size_t str_start = str->length();\n  str->Append(\"vcsxwfp128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128_3.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128_3.VB());\n  str->Append(\", \");\n  str->AppendFormat(\"0x{:X}\", d.VX128_3.UIMM());\n}\nvoid PrintDisasm_vctsxs(const PPCDecodeData& d, StringBuffer* str) {\n  // vctsxs [VD], [VB], [UIMM]\n  size_t str_start = str->length();\n  str->Append(\"vctsxs\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n  str->Append(\", \");\n  str->AppendFormat(\"0x{:X}\", d.VX.UIMM());\n}\nvoid PrintDisasm_vctuxs(const PPCDecodeData& d, StringBuffer* str) {\n  // vctuxs [VD], [VB], [UIMM]\n  size_t str_start = str->length();\n  str->Append(\"vctuxs\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n  str->Append(\", \");\n  str->AppendFormat(\"0x{:X}\", d.VX.UIMM());\n}\nvoid PrintDisasm_vcuxwfp128(const PPCDecodeData& d, StringBuffer* str) {\n  // vcuxwfp128 [VD], [VB], [UIMM]\n  size_t str_start = str->length();\n  str->Append(\"vcuxwfp128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128_3.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128_3.VB());\n  str->Append(\", \");\n  str->AppendFormat(\"0x{:X}\", d.VX128_3.UIMM());\n}\nvoid PrintDisasm_vexptefp(const PPCDecodeData& d, StringBuffer* str) {\n  // vexptefp [VD], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vexptefp\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vexptefp128(const PPCDecodeData& d, StringBuffer* str) {\n  // vexptefp128 [VD], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vexptefp128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128_3.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128_3.VB());\n}\nvoid PrintDisasm_vlogefp(const PPCDecodeData& d, StringBuffer* str) {\n  // vlogefp [VD], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vlogefp\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vlogefp128(const PPCDecodeData& d, StringBuffer* str) {\n  // vlogefp128 [VD], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vlogefp128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128_3.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128_3.VB());\n}\nvoid PrintDisasm_vmaddcfp128(const PPCDecodeData& d, StringBuffer* str) {\n  // vmaddcfp128 [VD], [VA], [VD], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vmaddcfp128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VB());\n}\nvoid PrintDisasm_vmaddfp(const PPCDecodeData& d, StringBuffer* str) {\n  // vmaddfp [VD], [VA], [VC], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vmaddfp\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VA.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VA.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VA.VC());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VA.VB());\n}\nvoid PrintDisasm_vmaddfp128(const PPCDecodeData& d, StringBuffer* str) {\n  // vmaddfp128 [VD], [VA], [VB], [VD]\n  size_t str_start = str->length();\n  str->Append(\"vmaddfp128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VB());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VD());\n}\nvoid PrintDisasm_vmaxfp(const PPCDecodeData& d, StringBuffer* str) {\n  // vmaxfp [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vmaxfp\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vmaxfp128(const PPCDecodeData& d, StringBuffer* str) {\n  // vmaxfp128 [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vmaxfp128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VB());\n}\nvoid PrintDisasm_vmaxsb(const PPCDecodeData& d, StringBuffer* str) {\n  // vmaxsb [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vmaxsb\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vmaxsh(const PPCDecodeData& d, StringBuffer* str) {\n  // vmaxsh [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vmaxsh\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vmaxsw(const PPCDecodeData& d, StringBuffer* str) {\n  // vmaxsw [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vmaxsw\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vmaxub(const PPCDecodeData& d, StringBuffer* str) {\n  // vmaxub [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vmaxub\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vmaxuh(const PPCDecodeData& d, StringBuffer* str) {\n  // vmaxuh [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vmaxuh\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vmaxuw(const PPCDecodeData& d, StringBuffer* str) {\n  // vmaxuw [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vmaxuw\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vmhaddshs(const PPCDecodeData& d, StringBuffer* str) {\n  // vmhaddshs [VD], [VA], [VB], [VC]\n  size_t str_start = str->length();\n  str->Append(\"vmhaddshs\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VA.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VA.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VA.VB());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VA.VC());\n}\nvoid PrintDisasm_vmhraddshs(const PPCDecodeData& d, StringBuffer* str) {\n  // vmhraddshs [VD], [VA], [VB], [VC]\n  size_t str_start = str->length();\n  str->Append(\"vmhraddshs\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VA.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VA.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VA.VB());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VA.VC());\n}\nvoid PrintDisasm_vminfp(const PPCDecodeData& d, StringBuffer* str) {\n  // vminfp [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vminfp\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vminfp128(const PPCDecodeData& d, StringBuffer* str) {\n  // vminfp128 [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vminfp128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VB());\n}\nvoid PrintDisasm_vminsb(const PPCDecodeData& d, StringBuffer* str) {\n  // vminsb [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vminsb\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vminsh(const PPCDecodeData& d, StringBuffer* str) {\n  // vminsh [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vminsh\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vminsw(const PPCDecodeData& d, StringBuffer* str) {\n  // vminsw [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vminsw\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vminub(const PPCDecodeData& d, StringBuffer* str) {\n  // vminub [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vminub\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vminuh(const PPCDecodeData& d, StringBuffer* str) {\n  // vminuh [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vminuh\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vminuw(const PPCDecodeData& d, StringBuffer* str) {\n  // vminuw [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vminuw\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vmladduhm(const PPCDecodeData& d, StringBuffer* str) {\n  // vmladduhm [VD], [VA], [VB], [VC]\n  size_t str_start = str->length();\n  str->Append(\"vmladduhm\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VA.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VA.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VA.VB());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VA.VC());\n}\nvoid PrintDisasm_vmrghb(const PPCDecodeData& d, StringBuffer* str) {\n  // vmrghb [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vmrghb\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vmrghh(const PPCDecodeData& d, StringBuffer* str) {\n  // vmrghh [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vmrghh\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vmrghw(const PPCDecodeData& d, StringBuffer* str) {\n  // vmrghw [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vmrghw\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vmrghw128(const PPCDecodeData& d, StringBuffer* str) {\n  // vmrghw128 [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vmrghw128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VB());\n}\nvoid PrintDisasm_vmrglb(const PPCDecodeData& d, StringBuffer* str) {\n  // vmrglb [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vmrglb\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vmrglh(const PPCDecodeData& d, StringBuffer* str) {\n  // vmrglh [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vmrglh\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vmrglw(const PPCDecodeData& d, StringBuffer* str) {\n  // vmrglw [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vmrglw\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vmrglw128(const PPCDecodeData& d, StringBuffer* str) {\n  // vmrglw128 [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vmrglw128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VB());\n}\nvoid PrintDisasm_vmsum3fp128(const PPCDecodeData& d, StringBuffer* str) {\n  // vmsum3fp128 [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vmsum3fp128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VB());\n}\nvoid PrintDisasm_vmsum4fp128(const PPCDecodeData& d, StringBuffer* str) {\n  // vmsum4fp128 [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vmsum4fp128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VB());\n}\nvoid PrintDisasm_vmsummbm(const PPCDecodeData& d, StringBuffer* str) {\n  // vmsummbm [VD], [VA], [VB], [VC]\n  size_t str_start = str->length();\n  str->Append(\"vmsummbm\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VA.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VA.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VA.VB());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VA.VC());\n}\nvoid PrintDisasm_vmsumshm(const PPCDecodeData& d, StringBuffer* str) {\n  // vmsumshm [VD], [VA], [VB], [VC]\n  size_t str_start = str->length();\n  str->Append(\"vmsumshm\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VA.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VA.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VA.VB());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VA.VC());\n}\nvoid PrintDisasm_vmsumshs(const PPCDecodeData& d, StringBuffer* str) {\n  // vmsumshs [VD], [VA], [VB], [VC]\n  size_t str_start = str->length();\n  str->Append(\"vmsumshs\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VA.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VA.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VA.VB());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VA.VC());\n}\nvoid PrintDisasm_vmsumubm(const PPCDecodeData& d, StringBuffer* str) {\n  // vmsumubm [VD], [VA], [VB], [VC]\n  size_t str_start = str->length();\n  str->Append(\"vmsumubm\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VA.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VA.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VA.VB());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VA.VC());\n}\nvoid PrintDisasm_vmsumuhm(const PPCDecodeData& d, StringBuffer* str) {\n  // vmsumuhm [VD], [VA], [VB], [VC]\n  size_t str_start = str->length();\n  str->Append(\"vmsumuhm\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VA.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VA.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VA.VB());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VA.VC());\n}\nvoid PrintDisasm_vmsumuhs(const PPCDecodeData& d, StringBuffer* str) {\n  // vmsumuhs [VD], [VA], [VB], [VC]\n  size_t str_start = str->length();\n  str->Append(\"vmsumuhs\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VA.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VA.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VA.VB());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VA.VC());\n}\nvoid PrintDisasm_vmulesb(const PPCDecodeData& d, StringBuffer* str) {\n  // vmulesb [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vmulesb\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vmulesh(const PPCDecodeData& d, StringBuffer* str) {\n  // vmulesh [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vmulesh\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vmuleub(const PPCDecodeData& d, StringBuffer* str) {\n  // vmuleub [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vmuleub\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vmuleuh(const PPCDecodeData& d, StringBuffer* str) {\n  // vmuleuh [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vmuleuh\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vmulfp128(const PPCDecodeData& d, StringBuffer* str) {\n  // vmulfp128 [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vmulfp128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VB());\n}\nvoid PrintDisasm_vmulosb(const PPCDecodeData& d, StringBuffer* str) {\n  // vmulosb [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vmulosb\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vmulosh(const PPCDecodeData& d, StringBuffer* str) {\n  // vmulosh [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vmulosh\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vmuloub(const PPCDecodeData& d, StringBuffer* str) {\n  // vmuloub [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vmuloub\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vmulouh(const PPCDecodeData& d, StringBuffer* str) {\n  // vmulouh [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vmulouh\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vnmsubfp(const PPCDecodeData& d, StringBuffer* str) {\n  // vnmsubfp [VD], [VA], [VC], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vnmsubfp\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VA.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VA.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VA.VC());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VA.VB());\n}\nvoid PrintDisasm_vnmsubfp128(const PPCDecodeData& d, StringBuffer* str) {\n  // vnmsubfp128 [VD], [VA], [VD], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vnmsubfp128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VB());\n}\nvoid PrintDisasm_vnor(const PPCDecodeData& d, StringBuffer* str) {\n  // vnor [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vnor\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vnor128(const PPCDecodeData& d, StringBuffer* str) {\n  // vnor128 [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vnor128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VB());\n}\nvoid PrintDisasm_vor(const PPCDecodeData& d, StringBuffer* str) {\n  // vor [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vor\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vor128(const PPCDecodeData& d, StringBuffer* str) {\n  // vor128 [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vor128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VB());\n}\nvoid PrintDisasm_vperm(const PPCDecodeData& d, StringBuffer* str) {\n  // vperm [VD], [VA], [VB], [VC]\n  size_t str_start = str->length();\n  str->Append(\"vperm\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VA.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VA.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VA.VB());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VA.VC());\n}\nvoid PrintDisasm_vperm128(const PPCDecodeData& d, StringBuffer* str) {\n  // vperm128 [VD], [VA], [VB], [VC]\n  size_t str_start = str->length();\n  str->Append(\"vperm128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128_2.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128_2.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128_2.VB());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128_2.VC());\n}\nvoid PrintDisasm_vpermwi128(const PPCDecodeData& d, StringBuffer* str) {\n  // vpermwi128 [VD], [VB], [UIMM]\n  size_t str_start = str->length();\n  str->Append(\"vpermwi128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128_P.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128_P.VB());\n  str->Append(\", \");\n  str->AppendFormat(\"0x{:X}\", d.VX128_P.UIMM());\n}\nvoid PrintDisasm_vpkpx(const PPCDecodeData& d, StringBuffer* str) {\n  // vpkpx [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vpkpx\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vpkshss(const PPCDecodeData& d, StringBuffer* str) {\n  // vpkshss [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vpkshss\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vpkshss128(const PPCDecodeData& d, StringBuffer* str) {\n  // vpkshss128 [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vpkshss128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VB());\n}\nvoid PrintDisasm_vpkshus(const PPCDecodeData& d, StringBuffer* str) {\n  // vpkshus [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vpkshus\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vpkshus128(const PPCDecodeData& d, StringBuffer* str) {\n  // vpkshus128 [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vpkshus128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VB());\n}\nvoid PrintDisasm_vpkswss(const PPCDecodeData& d, StringBuffer* str) {\n  // vpkswss [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vpkswss\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vpkswss128(const PPCDecodeData& d, StringBuffer* str) {\n  // vpkswss128 [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vpkswss128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VB());\n}\nvoid PrintDisasm_vpkswus(const PPCDecodeData& d, StringBuffer* str) {\n  // vpkswus [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vpkswus\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vpkswus128(const PPCDecodeData& d, StringBuffer* str) {\n  // vpkswus128 [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vpkswus128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VB());\n}\nvoid PrintDisasm_vpkuhum(const PPCDecodeData& d, StringBuffer* str) {\n  // vpkuhum [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vpkuhum\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vpkuhum128(const PPCDecodeData& d, StringBuffer* str) {\n  // vpkuhum128 [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vpkuhum128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VB());\n}\nvoid PrintDisasm_vpkuhus(const PPCDecodeData& d, StringBuffer* str) {\n  // vpkuhus [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vpkuhus\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vpkuhus128(const PPCDecodeData& d, StringBuffer* str) {\n  // vpkuhus128 [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vpkuhus128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VB());\n}\nvoid PrintDisasm_vpkuwum(const PPCDecodeData& d, StringBuffer* str) {\n  // vpkuwum [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vpkuwum\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vpkuwum128(const PPCDecodeData& d, StringBuffer* str) {\n  // vpkuwum128 [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vpkuwum128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VB());\n}\nvoid PrintDisasm_vpkuwus(const PPCDecodeData& d, StringBuffer* str) {\n  // vpkuwus [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vpkuwus\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vpkuwus128(const PPCDecodeData& d, StringBuffer* str) {\n  // vpkuwus128 [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vpkuwus128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VB());\n}\nvoid PrintDisasm_vrefp(const PPCDecodeData& d, StringBuffer* str) {\n  // vrefp [VD], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vrefp\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vrefp128(const PPCDecodeData& d, StringBuffer* str) {\n  // vrefp128 [VD], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vrefp128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128_3.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128_3.VB());\n}\nvoid PrintDisasm_vrfim(const PPCDecodeData& d, StringBuffer* str) {\n  // vrfim [VD], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vrfim\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vrfim128(const PPCDecodeData& d, StringBuffer* str) {\n  // vrfim128 [VD], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vrfim128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128_3.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128_3.VB());\n}\nvoid PrintDisasm_vrfin(const PPCDecodeData& d, StringBuffer* str) {\n  // vrfin [VD], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vrfin\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vrfin128(const PPCDecodeData& d, StringBuffer* str) {\n  // vrfin128 [VD], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vrfin128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128_3.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128_3.VB());\n}\nvoid PrintDisasm_vrfip(const PPCDecodeData& d, StringBuffer* str) {\n  // vrfip [VD], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vrfip\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vrfip128(const PPCDecodeData& d, StringBuffer* str) {\n  // vrfip128 [VD], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vrfip128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128_3.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128_3.VB());\n}\nvoid PrintDisasm_vrfiz(const PPCDecodeData& d, StringBuffer* str) {\n  // vrfiz [VD], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vrfiz\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vrfiz128(const PPCDecodeData& d, StringBuffer* str) {\n  // vrfiz128 [VD], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vrfiz128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128_3.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128_3.VB());\n}\nvoid PrintDisasm_vrlb(const PPCDecodeData& d, StringBuffer* str) {\n  // vrlb [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vrlb\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vrlh(const PPCDecodeData& d, StringBuffer* str) {\n  // vrlh [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vrlh\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vrlimi128(const PPCDecodeData& d, StringBuffer* str) {\n  // vrlimi128 [VD], [VB], [IMM], [z]\n  size_t str_start = str->length();\n  str->Append(\"vrlimi128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128_4.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128_4.VB());\n  str->Append(\", \");\n  str->AppendFormat(\"{}\", d.VX128_4.IMM());\n  str->Append(\", \");\n  str->AppendFormat(\"{}\", d.VX128_4.z());\n}\nvoid PrintDisasm_vrlw(const PPCDecodeData& d, StringBuffer* str) {\n  // vrlw [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vrlw\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vrlw128(const PPCDecodeData& d, StringBuffer* str) {\n  // vrlw128 [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vrlw128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VB());\n}\nvoid PrintDisasm_vrsqrtefp(const PPCDecodeData& d, StringBuffer* str) {\n  // vrsqrtefp [VD], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vrsqrtefp\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vrsqrtefp128(const PPCDecodeData& d, StringBuffer* str) {\n  // vrsqrtefp128 [VD], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vrsqrtefp128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128_3.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128_3.VB());\n}\nvoid PrintDisasm_vsel(const PPCDecodeData& d, StringBuffer* str) {\n  // vsel [VD], [VA], [VB], [VC]\n  size_t str_start = str->length();\n  str->Append(\"vsel\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VA.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VA.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VA.VB());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VA.VC());\n}\nvoid PrintDisasm_vsel128(const PPCDecodeData& d, StringBuffer* str) {\n  // vsel128 [VD], [VA], [VB], [VD]\n  size_t str_start = str->length();\n  str->Append(\"vsel128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VB());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VD());\n}\nvoid PrintDisasm_vsl(const PPCDecodeData& d, StringBuffer* str) {\n  // vsl [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vsl\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vslb(const PPCDecodeData& d, StringBuffer* str) {\n  // vslb [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vslb\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vsldoi(const PPCDecodeData& d, StringBuffer* str) {\n  // vsldoi [VD], [VA], [VB], [SHB]\n  size_t str_start = str->length();\n  str->Append(\"vsldoi\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VA.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VA.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VA.VB());\n  str->Append(\", \");\n  str->AppendFormat(\"(UNHANDLED SHB)\");\n}\nvoid PrintDisasm_vsldoi128(const PPCDecodeData& d, StringBuffer* str) {\n  // vsldoi128 [VD], [VA], [VB], [SHB]\n  size_t str_start = str->length();\n  str->Append(\"vsldoi128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128_5.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128_5.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128_5.VB());\n  str->Append(\", \");\n  str->AppendFormat(\"(UNHANDLED SHB)\");\n}\nvoid PrintDisasm_vslh(const PPCDecodeData& d, StringBuffer* str) {\n  // vslh [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vslh\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vslo(const PPCDecodeData& d, StringBuffer* str) {\n  // vslo [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vslo\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vslo128(const PPCDecodeData& d, StringBuffer* str) {\n  // vslo128 [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vslo128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VB());\n}\nvoid PrintDisasm_vslw(const PPCDecodeData& d, StringBuffer* str) {\n  // vslw [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vslw\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vslw128(const PPCDecodeData& d, StringBuffer* str) {\n  // vslw128 [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vslw128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VB());\n}\nvoid PrintDisasm_vspltb(const PPCDecodeData& d, StringBuffer* str) {\n  // vspltb [VD], [VB], [UIMM]\n  size_t str_start = str->length();\n  str->Append(\"vspltb\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n  str->Append(\", \");\n  str->AppendFormat(\"0x{:X}\", d.VX.UIMM());\n}\nvoid PrintDisasm_vsplth(const PPCDecodeData& d, StringBuffer* str) {\n  // vsplth [VD], [VB], [UIMM]\n  size_t str_start = str->length();\n  str->Append(\"vsplth\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n  str->Append(\", \");\n  str->AppendFormat(\"0x{:X}\", d.VX.UIMM());\n}\nvoid PrintDisasm_vspltisb(const PPCDecodeData& d, StringBuffer* str) {\n  // vspltisb [VD], [SIMM]\n  size_t str_start = str->length();\n  str->Append(\"vspltisb\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(d.VX.SIMM() < 0 ? \"-0x{:X}\" : \"0x{:X}\", std::abs(d.VX.SIMM()));\n}\nvoid PrintDisasm_vspltish(const PPCDecodeData& d, StringBuffer* str) {\n  // vspltish [VD], [SIMM]\n  size_t str_start = str->length();\n  str->Append(\"vspltish\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(d.VX.SIMM() < 0 ? \"-0x{:X}\" : \"0x{:X}\", std::abs(d.VX.SIMM()));\n}\nvoid PrintDisasm_vspltisw(const PPCDecodeData& d, StringBuffer* str) {\n  // vspltisw [VD], [SIMM]\n  size_t str_start = str->length();\n  str->Append(\"vspltisw\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(d.VX.SIMM() < 0 ? \"-0x{:X}\" : \"0x{:X}\", std::abs(d.VX.SIMM()));\n}\nvoid PrintDisasm_vspltisw128(const PPCDecodeData& d, StringBuffer* str) {\n  // vspltisw128 [VD], [SIMM]\n  size_t str_start = str->length();\n  str->Append(\"vspltisw128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128_3.VD());\n  str->Append(\", \");\n  str->AppendFormat(d.VX128_3.SIMM() < 0 ? \"-0x{:X}\" : \"0x{:X}\", std::abs(d.VX128_3.SIMM()));\n}\nvoid PrintDisasm_vspltw(const PPCDecodeData& d, StringBuffer* str) {\n  // vspltw [VD], [VB], [UIMM]\n  size_t str_start = str->length();\n  str->Append(\"vspltw\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n  str->Append(\", \");\n  str->AppendFormat(\"0x{:X}\", d.VX.UIMM());\n}\nvoid PrintDisasm_vspltw128(const PPCDecodeData& d, StringBuffer* str) {\n  // vspltw128 [VD], [VB], [UIMM]\n  size_t str_start = str->length();\n  str->Append(\"vspltw128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128_3.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128_3.VB());\n  str->Append(\", \");\n  str->AppendFormat(\"0x{:X}\", d.VX128_3.UIMM());\n}\nvoid PrintDisasm_vsr(const PPCDecodeData& d, StringBuffer* str) {\n  // vsr [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vsr\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vsrab(const PPCDecodeData& d, StringBuffer* str) {\n  // vsrab [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vsrab\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vsrah(const PPCDecodeData& d, StringBuffer* str) {\n  // vsrah [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vsrah\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vsraw(const PPCDecodeData& d, StringBuffer* str) {\n  // vsraw [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vsraw\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vsraw128(const PPCDecodeData& d, StringBuffer* str) {\n  // vsraw128 [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vsraw128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VB());\n}\nvoid PrintDisasm_vsrb(const PPCDecodeData& d, StringBuffer* str) {\n  // vsrb [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vsrb\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vsrh(const PPCDecodeData& d, StringBuffer* str) {\n  // vsrh [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vsrh\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vsro(const PPCDecodeData& d, StringBuffer* str) {\n  // vsro [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vsro\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vsro128(const PPCDecodeData& d, StringBuffer* str) {\n  // vsro128 [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vsro128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VB());\n}\nvoid PrintDisasm_vsrw(const PPCDecodeData& d, StringBuffer* str) {\n  // vsrw [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vsrw\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vsrw128(const PPCDecodeData& d, StringBuffer* str) {\n  // vsrw128 [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vsrw128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VB());\n}\nvoid PrintDisasm_vsubcuw(const PPCDecodeData& d, StringBuffer* str) {\n  // vsubcuw [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vsubcuw\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vsubfp(const PPCDecodeData& d, StringBuffer* str) {\n  // vsubfp [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vsubfp\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vsubfp128(const PPCDecodeData& d, StringBuffer* str) {\n  // vsubfp128 [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vsubfp128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VB());\n}\nvoid PrintDisasm_vsubsbs(const PPCDecodeData& d, StringBuffer* str) {\n  // vsubsbs [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vsubsbs\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vsubshs(const PPCDecodeData& d, StringBuffer* str) {\n  // vsubshs [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vsubshs\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vsubsws(const PPCDecodeData& d, StringBuffer* str) {\n  // vsubsws [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vsubsws\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vsububm(const PPCDecodeData& d, StringBuffer* str) {\n  // vsububm [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vsububm\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vsububs(const PPCDecodeData& d, StringBuffer* str) {\n  // vsububs [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vsububs\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vsubuhm(const PPCDecodeData& d, StringBuffer* str) {\n  // vsubuhm [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vsubuhm\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vsubuhs(const PPCDecodeData& d, StringBuffer* str) {\n  // vsubuhs [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vsubuhs\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vsubuwm(const PPCDecodeData& d, StringBuffer* str) {\n  // vsubuwm [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vsubuwm\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vsubuws(const PPCDecodeData& d, StringBuffer* str) {\n  // vsubuws [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vsubuws\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vsum2sws(const PPCDecodeData& d, StringBuffer* str) {\n  // vsum2sws [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vsum2sws\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vsum4sbs(const PPCDecodeData& d, StringBuffer* str) {\n  // vsum4sbs [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vsum4sbs\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vsum4shs(const PPCDecodeData& d, StringBuffer* str) {\n  // vsum4shs [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vsum4shs\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vsum4ubs(const PPCDecodeData& d, StringBuffer* str) {\n  // vsum4ubs [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vsum4ubs\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vsumsws(const PPCDecodeData& d, StringBuffer* str) {\n  // vsumsws [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vsumsws\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vupkhpx(const PPCDecodeData& d, StringBuffer* str) {\n  // vupkhpx [VD], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vupkhpx\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vupkhsb(const PPCDecodeData& d, StringBuffer* str) {\n  // vupkhsb [VD], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vupkhsb\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vupkhsb128(const PPCDecodeData& d, StringBuffer* str) {\n  // vupkhsb128 [VD], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vupkhsb128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VB());\n}\nvoid PrintDisasm_vupkhsh(const PPCDecodeData& d, StringBuffer* str) {\n  // vupkhsh [VD], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vupkhsh\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vupklpx(const PPCDecodeData& d, StringBuffer* str) {\n  // vupklpx [VD], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vupklpx\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vupklsb(const PPCDecodeData& d, StringBuffer* str) {\n  // vupklsb [VD], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vupklsb\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vupklsb128(const PPCDecodeData& d, StringBuffer* str) {\n  // vupklsb128 [VD], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vupklsb128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VB());\n}\nvoid PrintDisasm_vupklsh(const PPCDecodeData& d, StringBuffer* str) {\n  // vupklsh [VD], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vupklsh\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vxor(const PPCDecodeData& d, StringBuffer* str) {\n  // vxor [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vxor\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX.VB());\n}\nvoid PrintDisasm_vxor128(const PPCDecodeData& d, StringBuffer* str) {\n  // vxor128 [VD], [VA], [VB]\n  size_t str_start = str->length();\n  str->Append(\"vxor128\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"vr{}\", d.VX128.VD());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VA());\n  str->Append(\", \");\n  str->AppendFormat(\"vr{}\", d.VX128.VB());\n}\nvoid PrintDisasm_xori(const PPCDecodeData& d, StringBuffer* str) {\n  // xori [RA], [RS], [UIMM]\n  size_t str_start = str->length();\n  str->Append(\"xori\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.D.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.D.RS());\n  str->Append(\", \");\n  str->AppendFormat(\"0x{:X}\", d.D.UIMM());\n}\nvoid PrintDisasm_xoris(const PPCDecodeData& d, StringBuffer* str) {\n  // xoris [RA], [RS], [UIMM]\n  size_t str_start = str->length();\n  str->Append(\"xoris\");\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.D.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.D.RS());\n  str->Append(\", \");\n  str->AppendFormat(\"0x{:X}\", d.D.UIMM());\n}\nvoid PrintDisasm_xorx(const PPCDecodeData& d, StringBuffer* str) {\n  // xor[Rc] [RA], [RS], [RB]\n  size_t str_start = str->length();\n  str->Append(\"xor\");\n  if (d.X.Rc()) str->Append('.');\n  PadStringBuffer(str, str_start, kNamePad);\n  str->AppendFormat(\"r{}\", d.X.RA());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RS());\n  str->Append(\", \");\n  str->AppendFormat(\"r{}\", d.X.RB());\n}\n#define INIT_LIST(...) {__VA_ARGS__}\n#define INSTRUCTION(opcode, mnem, form, group, type, desc, reads, writes, fn) \\\n    {PPCOpcodeGroup::group, PPCOpcodeFormat::form, opcode, mnem, desc, INIT_LIST reads, INIT_LIST writes, fn}\nPPCOpcodeDisasmInfo ppc_opcode_disasm_table[] = {\n  INSTRUCTION(0x7c000014, \"addcx\"       , kXO     , kI, kGeneral, \"Add Carrying\"                                                               , (PPCOpcodeField::kRA,PPCOpcodeField::kRB), (PPCOpcodeField::kRD,PPCOpcodeField::kCA,PPCOpcodeField::kOEcond,PPCOpcodeField::kCRcond), PrintDisasm_addcx),\n  INSTRUCTION(0x7c000114, \"addex\"       , kXO     , kI, kGeneral, \"Add Extended\"                                                               , (PPCOpcodeField::kRA,PPCOpcodeField::kRB,PPCOpcodeField::kCA), (PPCOpcodeField::kRD,PPCOpcodeField::kOEcond,PPCOpcodeField::kCRcond), PrintDisasm_addex),\n  INSTRUCTION(0x38000000, \"addi\"        , kD      , kI, kGeneral, \"Add Immediate\"                                                              , (PPCOpcodeField::kRA0,PPCOpcodeField::kSIMM), (PPCOpcodeField::kRD), PrintDisasm_addi),\n  INSTRUCTION(0x30000000, \"addic\"       , kD      , kI, kGeneral, \"Add Immediate Carrying\"                                                     , (PPCOpcodeField::kRA,PPCOpcodeField::kSIMM), (PPCOpcodeField::kRD,PPCOpcodeField::kCA), PrintDisasm_addic),\n  INSTRUCTION(0x34000000, \"addicx\"      , kD      , kI, kGeneral, \"Add Immediate Carrying and Record\"                                          , (PPCOpcodeField::kRA,PPCOpcodeField::kSIMM), (PPCOpcodeField::kRD,PPCOpcodeField::kCA,PPCOpcodeField::kCR), PrintDisasm_addicx),\n  INSTRUCTION(0x3c000000, \"addis\"       , kD      , kI, kGeneral, \"Add Immediate Shifted\"                                                      , (PPCOpcodeField::kRA0,PPCOpcodeField::kSIMM), (PPCOpcodeField::kRD), PrintDisasm_addis),\n  INSTRUCTION(0x7c0001d4, \"addmex\"      , kXO     , kI, kGeneral, \"Add to Minus One Extended\"                                                  , (PPCOpcodeField::kRA,PPCOpcodeField::kCA), (PPCOpcodeField::kRD,PPCOpcodeField::kCA,PPCOpcodeField::kOEcond,PPCOpcodeField::kCRcond), PrintDisasm_addmex),\n  INSTRUCTION(0x7c000214, \"addx\"        , kXO     , kI, kGeneral, \"Add\"                                                                        , (PPCOpcodeField::kRA,PPCOpcodeField::kRB), (PPCOpcodeField::kRD,PPCOpcodeField::kOEcond,PPCOpcodeField::kCRcond), PrintDisasm_addx),\n  INSTRUCTION(0x7c000194, \"addzex\"      , kXO     , kI, kGeneral, \"Add to Zero Extended\"                                                       , (PPCOpcodeField::kRA,PPCOpcodeField::kCA), (PPCOpcodeField::kRD,PPCOpcodeField::kCA,PPCOpcodeField::kOEcond,PPCOpcodeField::kCRcond), PrintDisasm_addzex),\n  INSTRUCTION(0x7c000078, \"andcx\"       , kX      , kI, kGeneral, \"AND with Complement\"                                                        , (PPCOpcodeField::kRS,PPCOpcodeField::kRB), (PPCOpcodeField::kRA,PPCOpcodeField::kCRcond), PrintDisasm_andcx),\n  INSTRUCTION(0x74000000, \"andisx\"      , kD      , kI, kGeneral, \"AND Immediate Shifted\"                                                      , (PPCOpcodeField::kRS,PPCOpcodeField::kUIMM), (PPCOpcodeField::kRA,PPCOpcodeField::kCR), PrintDisasm_andisx),\n  INSTRUCTION(0x70000000, \"andix\"       , kD      , kI, kGeneral, \"AND Immediate\"                                                              , (PPCOpcodeField::kRS,PPCOpcodeField::kUIMM), (PPCOpcodeField::kRA,PPCOpcodeField::kCR), PrintDisasm_andix),\n  INSTRUCTION(0x7c000038, \"andx\"        , kX      , kI, kGeneral, \"AND\"                                                                        , (PPCOpcodeField::kRS,PPCOpcodeField::kRB), (PPCOpcodeField::kRA,PPCOpcodeField::kCRcond), PrintDisasm_andx),\n  INSTRUCTION(0x4c000420, \"bcctrx\"      , kXL     , kB, kSync   , \"Branch Conditional to Count Register\"                                       , (PPCOpcodeField::kLK,PPCOpcodeField::kBO,PPCOpcodeField::kBI,PPCOpcodeField::kCR,PPCOpcodeField::kCTR), (PPCOpcodeField::kLRcond), PrintDisasm_bcctrx),\n  INSTRUCTION(0x4c000020, \"bclrx\"       , kXL     , kB, kSync   , \"Branch Conditional to Link Register\"                                        , (PPCOpcodeField::kLK,PPCOpcodeField::kBO,PPCOpcodeField::kBI,PPCOpcodeField::kCRcond,PPCOpcodeField::kCTRcond), (PPCOpcodeField::kCTRcond,PPCOpcodeField::kLRcond), PrintDisasm_bclrx),\n  INSTRUCTION(0x40000000, \"bcx\"         , kB      , kB, kSync   , \"Branch Conditional\"                                                         , (PPCOpcodeField::kLK,PPCOpcodeField::kAA,PPCOpcodeField::kBO,PPCOpcodeField::kBI,PPCOpcodeField::kADDR,PPCOpcodeField::kCRcond,PPCOpcodeField::kCTRcond), (PPCOpcodeField::kCTRcond,PPCOpcodeField::kLRcond), PrintDisasm_bcx),\n  INSTRUCTION(0x48000000, \"bx\"          , kI      , kB, kSync   , \"Branch\"                                                                     , (PPCOpcodeField::kLK,PPCOpcodeField::kAA,PPCOpcodeField::kADDR), (PPCOpcodeField::kLRcond), PrintDisasm_bx),\n  INSTRUCTION(0x7c000000, \"cmp\"         , kX      , kI, kGeneral, \"Compare\"                                                                    , (PPCOpcodeField::kL,PPCOpcodeField::kRA,PPCOpcodeField::kRB), (PPCOpcodeField::kCRFD), PrintDisasm_cmp),\n  INSTRUCTION(0x2c000000, \"cmpi\"        , kD      , kI, kGeneral, \"Compare Immediate\"                                                          , (PPCOpcodeField::kL,PPCOpcodeField::kRA,PPCOpcodeField::kSIMM), (PPCOpcodeField::kRD,PPCOpcodeField::kCRFD), PrintDisasm_cmpi),\n  INSTRUCTION(0x7c000040, \"cmpl\"        , kX      , kI, kGeneral, \"Compare Logical\"                                                            , (PPCOpcodeField::kL,PPCOpcodeField::kRA,PPCOpcodeField::kRB), (PPCOpcodeField::kCRFD), PrintDisasm_cmpl),\n  INSTRUCTION(0x28000000, \"cmpli\"       , kD      , kI, kGeneral, \"Compare Logical Immediate\"                                                  , (PPCOpcodeField::kL,PPCOpcodeField::kRA,PPCOpcodeField::kUIMM), (PPCOpcodeField::kCRFD), PrintDisasm_cmpli),\n  INSTRUCTION(0x7c000074, \"cntlzdx\"     , kX      , kI, kGeneral, \"Count Leading Zeros Doubleword\"                                             , (PPCOpcodeField::kRS), (PPCOpcodeField::kRA,PPCOpcodeField::kCRcond), PrintDisasm_cntlzdx),\n  INSTRUCTION(0x7c000034, \"cntlzwx\"     , kX      , kI, kGeneral, \"Count Leading Zeros Word\"                                                   , (PPCOpcodeField::kRS), (PPCOpcodeField::kRA,PPCOpcodeField::kCRcond), PrintDisasm_cntlzwx),\n  INSTRUCTION(0x4c000202, \"crand\"       , kXL     , kC, kGeneral, \"Condition Register AND\"                                                     , (PPCOpcodeField::kCRBA,PPCOpcodeField::kCRBB), (PPCOpcodeField::kCRBD), PrintDisasm_crand),\n  INSTRUCTION(0x4c000102, \"crandc\"      , kXL     , kC, kGeneral, \"Condition Register AND with Complement\"                                     , (PPCOpcodeField::kCRBA,PPCOpcodeField::kCRBB), (PPCOpcodeField::kCRBD), PrintDisasm_crandc),\n  INSTRUCTION(0x4c000242, \"creqv\"       , kXL     , kC, kGeneral, \"Condition Register Equivalent\"                                              , (PPCOpcodeField::kCRBA,PPCOpcodeField::kCRBB), (PPCOpcodeField::kCRBD), PrintDisasm_creqv),\n  INSTRUCTION(0x4c0001c2, \"crnand\"      , kXL     , kC, kGeneral, \"Condition Register NAND\"                                                    , (PPCOpcodeField::kCRBA,PPCOpcodeField::kCRBB), (PPCOpcodeField::kCRBD), PrintDisasm_crnand),\n  INSTRUCTION(0x4c000042, \"crnor\"       , kXL     , kC, kGeneral, \"Condition Register NOR\"                                                     , (PPCOpcodeField::kCRBA,PPCOpcodeField::kCRBB), (PPCOpcodeField::kCRBD), PrintDisasm_crnor),\n  INSTRUCTION(0x4c000382, \"cror\"        , kXL     , kC, kGeneral, \"Condition Register OR\"                                                      , (PPCOpcodeField::kCRBA,PPCOpcodeField::kCRBB), (PPCOpcodeField::kCRBD), PrintDisasm_cror),\n  INSTRUCTION(0x4c000342, \"crorc\"       , kXL     , kC, kGeneral, \"Condition Register OR with Complement\"                                      , (PPCOpcodeField::kCRBA,PPCOpcodeField::kCRBB), (PPCOpcodeField::kCRBD), PrintDisasm_crorc),\n  INSTRUCTION(0x4c000182, \"crxor\"       , kXL     , kC, kGeneral, \"Condition Register XOR\"                                                     , (PPCOpcodeField::kCRBA,PPCOpcodeField::kCRBB), (PPCOpcodeField::kCRBD), PrintDisasm_crxor),\n  INSTRUCTION(0x7c0000ac, \"dcbf\"        , kX      , kM, kGeneral, \"Data Cache Block Flush\"                                                     , (PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (), PrintDisasm_dcbf),\n  INSTRUCTION(0x7c0003ac, \"dcbi\"        , kX      , kM, kGeneral, \"Data Cache Block Invalidate\"                                                , (PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (), PrintDisasm_dcbi),\n  INSTRUCTION(0x7c00006c, \"dcbst\"       , kX      , kM, kGeneral, \"Data Cache Block Store\"                                                     , (PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (), PrintDisasm_dcbst),\n  INSTRUCTION(0x7c00022c, \"dcbt\"        , kX      , kM, kGeneral, \"Data Cache Block Touch\"                                                     , (PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (), PrintDisasm_dcbt),\n  INSTRUCTION(0x7c0001ec, \"dcbtst\"      , kX      , kM, kGeneral, \"Data Cache Block Touch for Store\"                                           , (PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (), PrintDisasm_dcbtst),\n  INSTRUCTION(0x7c0007ec, \"dcbz\"        , kDCBZ   , kM, kGeneral, \"Data Cache Block Clear to Zero\"                                             , (PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (), PrintDisasm_dcbz),\n  INSTRUCTION(0x7c2007ec, \"dcbz128\"     , kDCBZ   , kM, kGeneral, \"Data Cache Block Clear to Zero 128\"                                         , (PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (), PrintDisasm_dcbz128),\n  INSTRUCTION(0x7c000392, \"divdux\"      , kXO     , kI, kGeneral, \"Divide Doubleword Unsigned\"                                                 , (PPCOpcodeField::kRA,PPCOpcodeField::kRB), (PPCOpcodeField::kRD,PPCOpcodeField::kOEcond,PPCOpcodeField::kCRcond), PrintDisasm_divdux),\n  INSTRUCTION(0x7c0003d2, \"divdx\"       , kXO     , kI, kGeneral, \"Divide Doubleword\"                                                          , (PPCOpcodeField::kRA,PPCOpcodeField::kRB), (PPCOpcodeField::kRD,PPCOpcodeField::kOEcond,PPCOpcodeField::kCRcond), PrintDisasm_divdx),\n  INSTRUCTION(0x7c000396, \"divwux\"      , kXO     , kI, kGeneral, \"Divide Word Unsigned\"                                                       , (PPCOpcodeField::kRA,PPCOpcodeField::kRB), (PPCOpcodeField::kRD,PPCOpcodeField::kOEcond,PPCOpcodeField::kCRcond), PrintDisasm_divwux),\n  INSTRUCTION(0x7c0003d6, \"divwx\"       , kXO     , kI, kGeneral, \"Divide Word\"                                                                , (PPCOpcodeField::kRA,PPCOpcodeField::kRB), (PPCOpcodeField::kRD,PPCOpcodeField::kOEcond,PPCOpcodeField::kCRcond), PrintDisasm_divwx),\n  INSTRUCTION(0x7c0006ac, \"eieio\"       , kX      , kI, kGeneral, \"Enforce In-Order Execution of I/O\"                                          , (), (), PrintDisasm_eieio),\n  INSTRUCTION(0x7c000238, \"eqvx\"        , kX      , kI, kGeneral, \"Equivalent\"                                                                 , (PPCOpcodeField::kRS,PPCOpcodeField::kRB), (PPCOpcodeField::kRA,PPCOpcodeField::kCRcond), PrintDisasm_eqvx),\n  INSTRUCTION(0x7c000774, \"extsbx\"      , kX      , kI, kGeneral, \"Extend Sign Byte\"                                                           , (PPCOpcodeField::kRS), (PPCOpcodeField::kRA,PPCOpcodeField::kCRcond), PrintDisasm_extsbx),\n  INSTRUCTION(0x7c000734, \"extshx\"      , kX      , kI, kGeneral, \"Extend Sign Half Word\"                                                      , (PPCOpcodeField::kRS), (PPCOpcodeField::kRA,PPCOpcodeField::kCRcond), PrintDisasm_extshx),\n  INSTRUCTION(0x7c0007b4, \"extswx\"      , kX      , kI, kGeneral, \"Extend Sign Word\"                                                           , (PPCOpcodeField::kRS), (PPCOpcodeField::kRA,PPCOpcodeField::kCRcond), PrintDisasm_extswx),\n  INSTRUCTION(0xfc000210, \"fabsx\"       , kX      , kF, kGeneral, \"Floating Absolute Value\"                                                    , (PPCOpcodeField::kFB), (PPCOpcodeField::kFD,PPCOpcodeField::kCRcond), PrintDisasm_fabsx),\n  INSTRUCTION(0xec00002a, \"faddsx\"      , kA      , kF, kGeneral, \"Floating Add Single\"                                                        , (PPCOpcodeField::kFA,PPCOpcodeField::kFB), (PPCOpcodeField::kFD,PPCOpcodeField::kCRcond,PPCOpcodeField::kFPSCR), PrintDisasm_faddsx),\n  INSTRUCTION(0xfc00002a, \"faddx\"       , kA      , kF, kGeneral, \"Floating Add\"                                                               , (PPCOpcodeField::kFA,PPCOpcodeField::kFB), (PPCOpcodeField::kFD,PPCOpcodeField::kCRcond,PPCOpcodeField::kFPSCR), PrintDisasm_faddx),\n  INSTRUCTION(0xfc00069c, \"fcfidx\"      , kX      , kF, kGeneral, \"Floating Convert From Integer Doubleword\"                                   , (PPCOpcodeField::kFB), (PPCOpcodeField::kFD,PPCOpcodeField::kCRcond,PPCOpcodeField::kFPSCR), PrintDisasm_fcfidx),\n  INSTRUCTION(0xfc000040, \"fcmpo\"       , kX      , kF, kGeneral, \"Floating Compare Ordered\"                                                   , (PPCOpcodeField::kFA,PPCOpcodeField::kFB), (PPCOpcodeField::kCRFD,PPCOpcodeField::kFPSCR), PrintDisasm_fcmpo),\n  INSTRUCTION(0xfc000000, \"fcmpu\"       , kX      , kF, kGeneral, \"Floating Compare Unordered\"                                                 , (PPCOpcodeField::kFA,PPCOpcodeField::kFB), (PPCOpcodeField::kCRFD,PPCOpcodeField::kFPSCR), PrintDisasm_fcmpu),\n  INSTRUCTION(0xfc00065c, \"fctidx\"      , kX      , kF, kGeneral, \"Floating Convert to Integer Doubleword\"                                     , (PPCOpcodeField::kFB), (PPCOpcodeField::kFD,PPCOpcodeField::kCRcond,PPCOpcodeField::kFPSCR), PrintDisasm_fctidx),\n  INSTRUCTION(0xfc00065e, \"fctidzx\"     , kX      , kF, kGeneral, \"Floating Convert to Integer Doubleword with Round Toward Zero\"              , (PPCOpcodeField::kFB), (PPCOpcodeField::kFD,PPCOpcodeField::kCRcond,PPCOpcodeField::kFPSCR), PrintDisasm_fctidzx),\n  INSTRUCTION(0xfc00001c, \"fctiwx\"      , kX      , kF, kGeneral, \"Floating Convert to Integer Word\"                                           , (PPCOpcodeField::kFB), (PPCOpcodeField::kFD,PPCOpcodeField::kCRcond,PPCOpcodeField::kFPSCR), PrintDisasm_fctiwx),\n  INSTRUCTION(0xfc00001e, \"fctiwzx\"     , kX      , kF, kGeneral, \"Floating Convert to Integer Word with Round Toward Zero\"                    , (PPCOpcodeField::kFB), (PPCOpcodeField::kFD,PPCOpcodeField::kCRcond,PPCOpcodeField::kFPSCR), PrintDisasm_fctiwzx),\n  INSTRUCTION(0xec000024, \"fdivsx\"      , kA      , kF, kGeneral, \"Floating Divide Single\"                                                     , (PPCOpcodeField::kFA,PPCOpcodeField::kFB), (PPCOpcodeField::kFD,PPCOpcodeField::kCRcond,PPCOpcodeField::kFPSCR), PrintDisasm_fdivsx),\n  INSTRUCTION(0xfc000024, \"fdivx\"       , kA      , kF, kGeneral, \"Floating Divide\"                                                            , (PPCOpcodeField::kFA,PPCOpcodeField::kFB), (PPCOpcodeField::kFD,PPCOpcodeField::kCRcond,PPCOpcodeField::kFPSCR), PrintDisasm_fdivx),\n  INSTRUCTION(0xec00003a, \"fmaddsx\"     , kA      , kF, kGeneral, \"Floating Multiply-Add Single\"                                               , (PPCOpcodeField::kFA,PPCOpcodeField::kFC,PPCOpcodeField::kFB), (PPCOpcodeField::kFD,PPCOpcodeField::kCRcond,PPCOpcodeField::kFPSCR), PrintDisasm_fmaddsx),\n  INSTRUCTION(0xfc00003a, \"fmaddx\"      , kA      , kF, kGeneral, \"Floating Multiply-Add\"                                                      , (PPCOpcodeField::kFA,PPCOpcodeField::kFC,PPCOpcodeField::kFB), (PPCOpcodeField::kFD,PPCOpcodeField::kCRcond,PPCOpcodeField::kFPSCR), PrintDisasm_fmaddx),\n  INSTRUCTION(0xfc000090, \"fmrx\"        , kX      , kF, kGeneral, \"Floating Move Register\"                                                     , (PPCOpcodeField::kFB), (PPCOpcodeField::kFD,PPCOpcodeField::kCRcond), PrintDisasm_fmrx),\n  INSTRUCTION(0xec000038, \"fmsubsx\"     , kA      , kF, kGeneral, \"Floating Multiply-Subtract Single\"                                          , (PPCOpcodeField::kFA,PPCOpcodeField::kFC,PPCOpcodeField::kFB), (PPCOpcodeField::kFD,PPCOpcodeField::kCRcond,PPCOpcodeField::kFPSCR), PrintDisasm_fmsubsx),\n  INSTRUCTION(0xfc000038, \"fmsubx\"      , kA      , kF, kGeneral, \"Floating Multiply-Subtract\"                                                 , (PPCOpcodeField::kFA,PPCOpcodeField::kFC,PPCOpcodeField::kFB), (PPCOpcodeField::kFD,PPCOpcodeField::kCRcond,PPCOpcodeField::kFPSCR), PrintDisasm_fmsubx),\n  INSTRUCTION(0xec000032, \"fmulsx\"      , kA      , kF, kGeneral, \"Floating Multiply Single\"                                                   , (PPCOpcodeField::kFA,PPCOpcodeField::kFC), (PPCOpcodeField::kFD,PPCOpcodeField::kCRcond,PPCOpcodeField::kFPSCR), PrintDisasm_fmulsx),\n  INSTRUCTION(0xfc000032, \"fmulx\"       , kA      , kF, kGeneral, \"Floating Multiply\"                                                          , (PPCOpcodeField::kFA,PPCOpcodeField::kFC), (PPCOpcodeField::kFD,PPCOpcodeField::kCRcond,PPCOpcodeField::kFPSCR), PrintDisasm_fmulx),\n  INSTRUCTION(0xfc000110, \"fnabsx\"      , kX      , kF, kGeneral, \"Floating Negative Absolute Value\"                                           , (PPCOpcodeField::kFB), (PPCOpcodeField::kFD,PPCOpcodeField::kCRcond), PrintDisasm_fnabsx),\n  INSTRUCTION(0xfc000050, \"fnegx\"       , kX      , kF, kGeneral, \"Floating Negate\"                                                            , (PPCOpcodeField::kFB), (PPCOpcodeField::kFD,PPCOpcodeField::kCRcond), PrintDisasm_fnegx),\n  INSTRUCTION(0xec00003e, \"fnmaddsx\"    , kA      , kF, kGeneral, \"Floating Negative Multiply-Add Single\"                                      , (PPCOpcodeField::kFA,PPCOpcodeField::kFC,PPCOpcodeField::kFB), (PPCOpcodeField::kFD,PPCOpcodeField::kCRcond,PPCOpcodeField::kFPSCR), PrintDisasm_fnmaddsx),\n  INSTRUCTION(0xfc00003e, \"fnmaddx\"     , kA      , kF, kGeneral, \"Floating Negative Multiply-Add\"                                             , (PPCOpcodeField::kFA,PPCOpcodeField::kFC,PPCOpcodeField::kFB), (PPCOpcodeField::kFD,PPCOpcodeField::kCRcond,PPCOpcodeField::kFPSCR), PrintDisasm_fnmaddx),\n  INSTRUCTION(0xec00003c, \"fnmsubsx\"    , kA      , kF, kGeneral, \"Floating Negative Multiply-Subtract Single\"                                 , (PPCOpcodeField::kFA,PPCOpcodeField::kFC,PPCOpcodeField::kFB), (PPCOpcodeField::kFD,PPCOpcodeField::kCRcond,PPCOpcodeField::kFPSCR), PrintDisasm_fnmsubsx),\n  INSTRUCTION(0xfc00003c, \"fnmsubx\"     , kA      , kF, kGeneral, \"Floating Negative Multiply-Subtract\"                                        , (PPCOpcodeField::kFA,PPCOpcodeField::kFC,PPCOpcodeField::kFB), (PPCOpcodeField::kFD,PPCOpcodeField::kCRcond,PPCOpcodeField::kFPSCR), PrintDisasm_fnmsubx),\n  INSTRUCTION(0xec000030, \"fresx\"       , kA      , kF, kGeneral, \"Floating Reciprocal Estimate Single\"                                        , (PPCOpcodeField::kFB), (PPCOpcodeField::kFD,PPCOpcodeField::kCRcond,PPCOpcodeField::kFPSCR), PrintDisasm_fresx),\n  INSTRUCTION(0xfc000018, \"frspx\"       , kX      , kF, kGeneral, \"Floating Round to Single\"                                                   , (PPCOpcodeField::kFB), (PPCOpcodeField::kFD,PPCOpcodeField::kCRcond,PPCOpcodeField::kFPSCR), PrintDisasm_frspx),\n  INSTRUCTION(0xfc000034, \"frsqrtex\"    , kA      , kF, kGeneral, \"Floating Reciprocal Square Root Estimate\"                                   , (PPCOpcodeField::kFB), (PPCOpcodeField::kFD,PPCOpcodeField::kCRcond,PPCOpcodeField::kFPSCR), PrintDisasm_frsqrtex),\n  INSTRUCTION(0xfc00002e, \"fselx\"       , kA      , kF, kGeneral, \"Floating Select\"                                                            , (PPCOpcodeField::kFA,PPCOpcodeField::kFC,PPCOpcodeField::kFB), (PPCOpcodeField::kFD,PPCOpcodeField::kCRcond), PrintDisasm_fselx),\n  INSTRUCTION(0xec00002c, \"fsqrtsx\"     , kA      , kF, kGeneral, \"Floating Square Root Single\"                                                , (PPCOpcodeField::kFB), (PPCOpcodeField::kFD,PPCOpcodeField::kCRcond,PPCOpcodeField::kFPSCR), PrintDisasm_fsqrtsx),\n  INSTRUCTION(0xfc00002c, \"fsqrtx\"      , kA      , kF, kGeneral, \"Floating Square Root\"                                                       , (PPCOpcodeField::kFB), (PPCOpcodeField::kFD,PPCOpcodeField::kCRcond,PPCOpcodeField::kFPSCR), PrintDisasm_fsqrtx),\n  INSTRUCTION(0xec000028, \"fsubsx\"      , kA      , kF, kGeneral, \"Floating Subtract Single\"                                                   , (PPCOpcodeField::kFA,PPCOpcodeField::kFB), (PPCOpcodeField::kFD,PPCOpcodeField::kCRcond,PPCOpcodeField::kFPSCR), PrintDisasm_fsubsx),\n  INSTRUCTION(0xfc000028, \"fsubx\"       , kA      , kF, kGeneral, \"Floating Subtract\"                                                          , (PPCOpcodeField::kFA,PPCOpcodeField::kFB), (PPCOpcodeField::kFD,PPCOpcodeField::kCRcond,PPCOpcodeField::kFPSCR), PrintDisasm_fsubx),\n  INSTRUCTION(0x7c0007ac, \"icbi\"        , kX      , kM, kGeneral, \"Instruction Cache Block Invalidate\"                                         , (PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (), PrintDisasm_icbi),\n  INSTRUCTION(0x4c00012c, \"isync\"       , kXL     , kI, kGeneral, \"Instruction Synchronize\"                                                    , (), (), PrintDisasm_isync),\n  INSTRUCTION(0x88000000, \"lbz\"         , kD      , kM, kGeneral, \"Load Byte and Zero\"                                                         , (PPCOpcodeField::kRA0,PPCOpcodeField::kd), (PPCOpcodeField::kRD), PrintDisasm_lbz),\n  INSTRUCTION(0x8c000000, \"lbzu\"        , kD      , kM, kGeneral, \"Load Byte and Zero with Update\"                                             , (PPCOpcodeField::kRA,PPCOpcodeField::kd), (PPCOpcodeField::kRD,PPCOpcodeField::kRA), PrintDisasm_lbzu),\n  INSTRUCTION(0x7c0000ee, \"lbzux\"       , kX      , kM, kGeneral, \"Load Byte and Zero with Update Indexed\"                                     , (PPCOpcodeField::kRA,PPCOpcodeField::kRB), (PPCOpcodeField::kRD,PPCOpcodeField::kRA), PrintDisasm_lbzux),\n  INSTRUCTION(0x7c0000ae, \"lbzx\"        , kX      , kM, kGeneral, \"Load Byte and Zero Indexed\"                                                 , (PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (PPCOpcodeField::kRD), PrintDisasm_lbzx),\n  INSTRUCTION(0xe8000000, \"ld\"          , kDS     , kM, kGeneral, \"Load Doubleword\"                                                            , (PPCOpcodeField::kRA0,PPCOpcodeField::kds), (PPCOpcodeField::kRD), PrintDisasm_ld),\n  INSTRUCTION(0x7c0000a8, \"ldarx\"       , kX      , kM, kGeneral, \"Load Doubleword and Reserve Indexed\"                                        , (PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (PPCOpcodeField::kRD), PrintDisasm_ldarx),\n  INSTRUCTION(0x7c000428, \"ldbrx\"       , kX      , kM, kGeneral, \"Load Doubleword Byte-Reverse Indexed\"                                       , (PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (PPCOpcodeField::kRD), PrintDisasm_ldbrx),\n  INSTRUCTION(0xe8000001, \"ldu\"         , kDS     , kM, kGeneral, \"Load Doubleword with Update\"                                                , (PPCOpcodeField::kRA,PPCOpcodeField::kds), (PPCOpcodeField::kRD,PPCOpcodeField::kRA), PrintDisasm_ldu),\n  INSTRUCTION(0x7c00006a, \"ldux\"        , kX      , kM, kGeneral, \"Load Doubleword with Update Indexed\"                                        , (PPCOpcodeField::kRA,PPCOpcodeField::kRB), (PPCOpcodeField::kRD,PPCOpcodeField::kRA), PrintDisasm_ldux),\n  INSTRUCTION(0x7c00002a, \"ldx\"         , kX      , kM, kGeneral, \"Load Doubleword Indexed\"                                                    , (PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (PPCOpcodeField::kRD), PrintDisasm_ldx),\n  INSTRUCTION(0xc8000000, \"lfd\"         , kD      , kM, kGeneral, \"Load Floating-Point Double\"                                                 , (PPCOpcodeField::kRA0,PPCOpcodeField::kd), (PPCOpcodeField::kFD), PrintDisasm_lfd),\n  INSTRUCTION(0xcc000000, \"lfdu\"        , kD      , kM, kGeneral, \"Load Floating-Point Double with Update\"                                     , (PPCOpcodeField::kRA,PPCOpcodeField::kd), (PPCOpcodeField::kFD,PPCOpcodeField::kRA), PrintDisasm_lfdu),\n  INSTRUCTION(0x7c0004ee, \"lfdux\"       , kX      , kM, kGeneral, \"Load Floating-Point Double with Update Indexed\"                             , (PPCOpcodeField::kRA,PPCOpcodeField::kRB), (PPCOpcodeField::kFD,PPCOpcodeField::kRA), PrintDisasm_lfdux),\n  INSTRUCTION(0x7c0004ae, \"lfdx\"        , kX      , kM, kGeneral, \"Load Floating-Point Double Indexed\"                                         , (PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (PPCOpcodeField::kFD), PrintDisasm_lfdx),\n  INSTRUCTION(0xc0000000, \"lfs\"         , kD      , kM, kGeneral, \"Load Floating-Point Single\"                                                 , (PPCOpcodeField::kRA0,PPCOpcodeField::kd), (PPCOpcodeField::kFD), PrintDisasm_lfs),\n  INSTRUCTION(0xc4000000, \"lfsu\"        , kD      , kM, kGeneral, \"Load Floating-Point Single with Update\"                                     , (PPCOpcodeField::kRA,PPCOpcodeField::kd), (PPCOpcodeField::kFD,PPCOpcodeField::kRA), PrintDisasm_lfsu),\n  INSTRUCTION(0x7c00046e, \"lfsux\"       , kX      , kM, kGeneral, \"Load Floating-Point Single with Update Indexed\"                             , (PPCOpcodeField::kRA,PPCOpcodeField::kRB), (PPCOpcodeField::kFD,PPCOpcodeField::kRA), PrintDisasm_lfsux),\n  INSTRUCTION(0x7c00042e, \"lfsx\"        , kX      , kM, kGeneral, \"Load Floating-Point Single Indexed\"                                         , (PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (PPCOpcodeField::kFD), PrintDisasm_lfsx),\n  INSTRUCTION(0xa8000000, \"lha\"         , kD      , kM, kGeneral, \"Load Half Word Algebraic\"                                                   , (PPCOpcodeField::kRA0,PPCOpcodeField::kd), (PPCOpcodeField::kRD), PrintDisasm_lha),\n  INSTRUCTION(0xac000000, \"lhau\"        , kD      , kM, kGeneral, \"Load Half Word Algebraic with Update\"                                       , (PPCOpcodeField::kRA,PPCOpcodeField::kd), (PPCOpcodeField::kRD,PPCOpcodeField::kRA), PrintDisasm_lhau),\n  INSTRUCTION(0x7c0002ee, \"lhaux\"       , kX      , kM, kGeneral, \"Load Half Word Algebraic with Update Indexed\"                               , (PPCOpcodeField::kRA,PPCOpcodeField::kRB), (PPCOpcodeField::kRD,PPCOpcodeField::kRA), PrintDisasm_lhaux),\n  INSTRUCTION(0x7c0002ae, \"lhax\"        , kX      , kM, kGeneral, \"Load Half Word Algebraic Indexed\"                                           , (PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (PPCOpcodeField::kRD), PrintDisasm_lhax),\n  INSTRUCTION(0x7c00062c, \"lhbrx\"       , kX      , kM, kGeneral, \"Load Half Word Byte-Reverse Indexed\"                                        , (PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (PPCOpcodeField::kRD), PrintDisasm_lhbrx),\n  INSTRUCTION(0xa0000000, \"lhz\"         , kD      , kM, kGeneral, \"Load Half Word and Zero\"                                                    , (PPCOpcodeField::kRA0,PPCOpcodeField::kd), (PPCOpcodeField::kRD), PrintDisasm_lhz),\n  INSTRUCTION(0xa4000000, \"lhzu\"        , kD      , kM, kGeneral, \"Load Half Word and Zero with Update\"                                        , (PPCOpcodeField::kRA,PPCOpcodeField::kd), (PPCOpcodeField::kRD,PPCOpcodeField::kRA), PrintDisasm_lhzu),\n  INSTRUCTION(0x7c00026e, \"lhzux\"       , kX      , kM, kGeneral, \"Load Half Word and Zero with Update Indexed\"                                , (PPCOpcodeField::kRA,PPCOpcodeField::kRB), (PPCOpcodeField::kRD,PPCOpcodeField::kRA), PrintDisasm_lhzux),\n  INSTRUCTION(0x7c00022e, \"lhzx\"        , kX      , kM, kGeneral, \"Load Half Word and Zero Indexed\"                                            , (PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (PPCOpcodeField::kRD), PrintDisasm_lhzx),\n  INSTRUCTION(0xb8000000, \"lmw\"         , kD      , kM, kGeneral, \"Load Multiple Word\"                                                         , (), (), nullptr),\n  INSTRUCTION(0x7c0004aa, \"lswi\"        , kX      , kM, kGeneral, \"Load String Word Immediate\"                                                 , (), (), nullptr),\n  INSTRUCTION(0x7c00042a, \"lswx\"        , kX      , kM, kGeneral, \"Load String Word Indexed\"                                                   , (), (), nullptr),\n  INSTRUCTION(0x7c00000e, \"lvebx\"       , kX      , kM, kGeneral, \"Load Vector Element Byte Indexed\"                                           , (PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (PPCOpcodeField::kVD), PrintDisasm_lvebx),\n  INSTRUCTION(0x7c00004e, \"lvehx\"       , kX      , kM, kGeneral, \"Load Vector Element Half Word Indexed\"                                      , (PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (PPCOpcodeField::kVD), PrintDisasm_lvehx),\n  INSTRUCTION(0x7c00008e, \"lvewx\"       , kX      , kM, kGeneral, \"Load Vector Element Word Indexed\"                                           , (PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (PPCOpcodeField::kVD), PrintDisasm_lvewx),\n  INSTRUCTION(0x10000083, \"lvewx128\"    , kVX128_1, kM, kGeneral, \"Load Vector Element Word Indexed 128\"                                       , (PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (PPCOpcodeField::kVD), PrintDisasm_lvewx128),\n  INSTRUCTION(0x7c00040e, \"lvlx\"        , kX      , kM, kGeneral, \"Load Vector Left Indexed\"                                                   , (PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (PPCOpcodeField::kVD), PrintDisasm_lvlx),\n  INSTRUCTION(0x10000403, \"lvlx128\"     , kVX128_1, kM, kGeneral, \"Load Vector Left Indexed 128\"                                               , (PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (PPCOpcodeField::kVD), PrintDisasm_lvlx128),\n  INSTRUCTION(0x7c00060e, \"lvlxl\"       , kX      , kM, kGeneral, \"Load Vector Left Indexed LRU\"                                               , (PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (PPCOpcodeField::kVD), PrintDisasm_lvlxl),\n  INSTRUCTION(0x10000603, \"lvlxl128\"    , kVX128_1, kM, kGeneral, \"Load Vector Left Indexed LRU 128\"                                           , (PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (PPCOpcodeField::kVD), PrintDisasm_lvlxl128),\n  INSTRUCTION(0x7c00044e, \"lvrx\"        , kX      , kM, kGeneral, \"Load Vector Right Indexed\"                                                  , (PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (PPCOpcodeField::kVD), PrintDisasm_lvrx),\n  INSTRUCTION(0x10000443, \"lvrx128\"     , kVX128_1, kM, kGeneral, \"Load Vector Right Indexed 128\"                                              , (PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (PPCOpcodeField::kVD), PrintDisasm_lvrx128),\n  INSTRUCTION(0x7c00064e, \"lvrxl\"       , kX      , kM, kGeneral, \"Load Vector Right Indexed LRU\"                                              , (PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (PPCOpcodeField::kVD), PrintDisasm_lvrxl),\n  INSTRUCTION(0x10000643, \"lvrxl128\"    , kVX128_1, kM, kGeneral, \"Load Vector Right Indexed LRU 128\"                                          , (PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (PPCOpcodeField::kVD), PrintDisasm_lvrxl128),\n  INSTRUCTION(0x7c00000c, \"lvsl\"        , kX      , kV, kGeneral, \"Load Vector for Shift Left Indexed\"                                         , (PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (PPCOpcodeField::kVD), PrintDisasm_lvsl),\n  INSTRUCTION(0x10000003, \"lvsl128\"     , kVX128_1, kV, kGeneral, \"Load Vector for Shift Left Indexed 128\"                                     , (PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (PPCOpcodeField::kVD), PrintDisasm_lvsl128),\n  INSTRUCTION(0x7c00004c, \"lvsr\"        , kX      , kV, kGeneral, \"Load Vector for Shift Right Indexed\"                                        , (PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (PPCOpcodeField::kVD), PrintDisasm_lvsr),\n  INSTRUCTION(0x10000043, \"lvsr128\"     , kVX128_1, kV, kGeneral, \"Load Vector for Shift Right Indexed 128\"                                    , (PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (PPCOpcodeField::kVD), PrintDisasm_lvsr128),\n  INSTRUCTION(0x7c0000ce, \"lvx\"         , kX      , kM, kGeneral, \"Load Vector Indexed\"                                                        , (PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (PPCOpcodeField::kVD), PrintDisasm_lvx),\n  INSTRUCTION(0x100000c3, \"lvx128\"      , kVX128_1, kM, kGeneral, \"Load Vector Indexed 128\"                                                    , (PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (PPCOpcodeField::kVD), PrintDisasm_lvx128),\n  INSTRUCTION(0x7c0002ce, \"lvxl\"        , kX      , kM, kGeneral, \"Load Vector Indexed LRU\"                                                    , (PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (PPCOpcodeField::kVD), PrintDisasm_lvxl),\n  INSTRUCTION(0x100002c3, \"lvxl128\"     , kVX128_1, kM, kGeneral, \"Load Vector Indexed LRU 128\"                                                , (PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (PPCOpcodeField::kVD), PrintDisasm_lvxl128),\n  INSTRUCTION(0xe8000002, \"lwa\"         , kDS     , kM, kGeneral, \"Load Word Algebraic\"                                                        , (PPCOpcodeField::kRA0,PPCOpcodeField::kds), (PPCOpcodeField::kRD), PrintDisasm_lwa),\n  INSTRUCTION(0x7c000028, \"lwarx\"       , kX      , kM, kGeneral, \"Load Word and Reserve Indexed\"                                              , (PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (PPCOpcodeField::kRD), PrintDisasm_lwarx),\n  INSTRUCTION(0x7c0002ea, \"lwaux\"       , kX      , kM, kGeneral, \"Load Word Algebraic with Update Indexed\"                                    , (PPCOpcodeField::kRA,PPCOpcodeField::kRB), (PPCOpcodeField::kRD,PPCOpcodeField::kRA), PrintDisasm_lwaux),\n  INSTRUCTION(0x7c0002aa, \"lwax\"        , kX      , kM, kGeneral, \"Load Word Algebraic Indexed\"                                                , (PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (PPCOpcodeField::kRD), PrintDisasm_lwax),\n  INSTRUCTION(0x7c00042c, \"lwbrx\"       , kX      , kM, kGeneral, \"Load Word Byte-Reverse Indexed\"                                             , (PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (PPCOpcodeField::kRD), PrintDisasm_lwbrx),\n  INSTRUCTION(0x80000000, \"lwz\"         , kD      , kM, kGeneral, \"Load Word and Zero\"                                                         , (PPCOpcodeField::kRA0,PPCOpcodeField::kd), (PPCOpcodeField::kRD), PrintDisasm_lwz),\n  INSTRUCTION(0x84000000, \"lwzu\"        , kD      , kM, kGeneral, \"Load Word and Zero with Update\"                                             , (PPCOpcodeField::kRA,PPCOpcodeField::kd), (PPCOpcodeField::kRD,PPCOpcodeField::kRA), PrintDisasm_lwzu),\n  INSTRUCTION(0x7c00006e, \"lwzux\"       , kX      , kM, kGeneral, \"Load Word and Zero with Update Indexed\"                                     , (PPCOpcodeField::kRA,PPCOpcodeField::kRB), (PPCOpcodeField::kRD,PPCOpcodeField::kRA), PrintDisasm_lwzux),\n  INSTRUCTION(0x7c00002e, \"lwzx\"        , kX      , kM, kGeneral, \"Load Word and Zero Indexed\"                                                 , (PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (PPCOpcodeField::kRD), PrintDisasm_lwzx),\n  INSTRUCTION(0x4c000000, \"mcrf\"        , kXL     , kC, kGeneral, \"Move Condition Register Field\"                                              , (PPCOpcodeField::kCRFS), (PPCOpcodeField::kCRFD), PrintDisasm_mcrf),\n  INSTRUCTION(0xfc000080, \"mcrfs\"       , kX      , kC, kGeneral, \"Move to Condition Register from FPSCR\"                                      , (PPCOpcodeField::kCRFS,PPCOpcodeField::kFPSCR), (PPCOpcodeField::kCRFD,PPCOpcodeField::kFPSCR), PrintDisasm_mcrfs),\n  INSTRUCTION(0x7c000400, \"mcrxr\"       , kX      , kC, kGeneral, \"Move to Condition Register from XER\"                                        , (PPCOpcodeField::kCR), (PPCOpcodeField::kCRFD), PrintDisasm_mcrxr),\n  INSTRUCTION(0x7c000026, \"mfcr\"        , kX      , kC, kGeneral, \"Move from Condition Register\"                                               , (PPCOpcodeField::kCR), (PPCOpcodeField::kRD), PrintDisasm_mfcr),\n  INSTRUCTION(0xfc00048e, \"mffsx\"       , kX      , kC, kGeneral, \"Move from FPSCR\"                                                            , (PPCOpcodeField::kFPSCR), (PPCOpcodeField::kFD,PPCOpcodeField::kCRcond), PrintDisasm_mffsx),\n  INSTRUCTION(0x7c0000a6, \"mfmsr\"       , kX      , kC, kSync   , \"Move from Machine State Register\"                                           , (PPCOpcodeField::kMSR), (PPCOpcodeField::kRD), PrintDisasm_mfmsr),\n  INSTRUCTION(0x7c0002a6, \"mfspr\"       , kXFX    , kC, kGeneral, \"Move from Special-Purpose Register\"                                         , (PPCOpcodeField::kSPR), (PPCOpcodeField::kRD), PrintDisasm_mfspr),\n  INSTRUCTION(0x7c0002e6, \"mftb\"        , kXFX    , kC, kGeneral, \"Move from Time Base\"                                                        , (PPCOpcodeField::kTBR), (PPCOpcodeField::kRD), PrintDisasm_mftb),\n  INSTRUCTION(0x10000604, \"mfvscr\"      , kVX     , kC, kGeneral, \"Move from VSCR\"                                                             , (PPCOpcodeField::kVSCR), (PPCOpcodeField::kVD), nullptr),\n  INSTRUCTION(0x7c000120, \"mtcrf\"       , kXFX    , kC, kGeneral, \"Move to Condition Register Fields\"                                          , (PPCOpcodeField::kRS), (PPCOpcodeField::kCRM), PrintDisasm_mtcrf),\n  INSTRUCTION(0xfc00008c, \"mtfsb0x\"     , kX      , kC, kGeneral, \"Move to FPSCR Bit 0\"                                                        , (), (PPCOpcodeField::kFPSCRD,PPCOpcodeField::kCRcond), PrintDisasm_mtfsb0x),\n  INSTRUCTION(0xfc00004c, \"mtfsb1x\"     , kX      , kC, kGeneral, \"Move to FPSCR Bit 1\"                                                        , (), (PPCOpcodeField::kFPSCRD,PPCOpcodeField::kCRcond), PrintDisasm_mtfsb1x),\n  INSTRUCTION(0xfc00010c, \"mtfsfix\"     , kX      , kC, kGeneral, \"Move to FPSCR Field Immediate\"                                              , (PPCOpcodeField::kIMM), (PPCOpcodeField::kCRFD,PPCOpcodeField::kCRcond), PrintDisasm_mtfsfix),\n  INSTRUCTION(0xfc00058e, \"mtfsfx\"      , kXFL    , kC, kGeneral, \"Move to FPSCR Fields\"                                                       , (PPCOpcodeField::kFM,PPCOpcodeField::kFB), (PPCOpcodeField::kFPSCR,PPCOpcodeField::kCRcond), PrintDisasm_mtfsfx),\n  INSTRUCTION(0x7c000124, \"mtmsr\"       , kX      , kC, kSync   , \"Move to Machine State Register\"                                             , (PPCOpcodeField::kRS), (PPCOpcodeField::kMSR), PrintDisasm_mtmsr),\n  INSTRUCTION(0x7c000164, \"mtmsrd\"      , kX      , kC, kSync   , \"Move to Machine State Register Doubleword\"                                  , (PPCOpcodeField::kRS), (PPCOpcodeField::kMSR), PrintDisasm_mtmsrd),\n  INSTRUCTION(0x7c0003a6, \"mtspr\"       , kXFX    , kC, kGeneral, \"Move to Special-Purpose Register\"                                           , (PPCOpcodeField::kRS), (PPCOpcodeField::kSPR), PrintDisasm_mtspr),\n  INSTRUCTION(0x10000644, \"mtvscr\"      , kVX     , kC, kGeneral, \"Move to VSCR\"                                                               , (PPCOpcodeField::kVB), (PPCOpcodeField::kVSCR), nullptr),\n  INSTRUCTION(0x7c000012, \"mulhdux\"     , kXO     , kI, kGeneral, \"Multiply High Doubleword Unsigned\"                                          , (PPCOpcodeField::kRA,PPCOpcodeField::kRB), (PPCOpcodeField::kRD,PPCOpcodeField::kCRcond), PrintDisasm_mulhdux),\n  INSTRUCTION(0x7c000092, \"mulhdx\"      , kXO     , kI, kGeneral, \"Multiply High Doubleword\"                                                   , (PPCOpcodeField::kRA,PPCOpcodeField::kRB), (PPCOpcodeField::kRD,PPCOpcodeField::kCRcond), PrintDisasm_mulhdx),\n  INSTRUCTION(0x7c000016, \"mulhwux\"     , kXO     , kI, kGeneral, \"Multiply High Word Unsigned\"                                                , (PPCOpcodeField::kRA,PPCOpcodeField::kRB), (PPCOpcodeField::kRD,PPCOpcodeField::kCRcond), PrintDisasm_mulhwux),\n  INSTRUCTION(0x7c000096, \"mulhwx\"      , kXO     , kI, kGeneral, \"Multiply High Word\"                                                         , (PPCOpcodeField::kRA,PPCOpcodeField::kRB), (PPCOpcodeField::kRD,PPCOpcodeField::kCRcond), PrintDisasm_mulhwx),\n  INSTRUCTION(0x7c0001d2, \"mulldx\"      , kXO     , kI, kGeneral, \"Multiply Low Doubleword\"                                                    , (PPCOpcodeField::kRA,PPCOpcodeField::kRB), (PPCOpcodeField::kRD,PPCOpcodeField::kCRcond,PPCOpcodeField::kOEcond), PrintDisasm_mulldx),\n  INSTRUCTION(0x1c000000, \"mulli\"       , kD      , kI, kGeneral, \"Multiply Low Immediate\"                                                     , (PPCOpcodeField::kRA,PPCOpcodeField::kSIMM), (PPCOpcodeField::kRD), PrintDisasm_mulli),\n  INSTRUCTION(0x7c0001d6, \"mullwx\"      , kXO     , kI, kGeneral, \"Multiply Low Word\"                                                          , (PPCOpcodeField::kRA,PPCOpcodeField::kRB), (PPCOpcodeField::kRD,PPCOpcodeField::kCRcond,PPCOpcodeField::kOEcond), PrintDisasm_mullwx),\n  INSTRUCTION(0x7c0003b8, \"nandx\"       , kX      , kI, kGeneral, \"NAND\"                                                                       , (PPCOpcodeField::kRS,PPCOpcodeField::kRB), (PPCOpcodeField::kRA,PPCOpcodeField::kCRcond), PrintDisasm_nandx),\n  INSTRUCTION(0x7c0000d0, \"negx\"        , kXO     , kI, kGeneral, \"Negate\"                                                                     , (PPCOpcodeField::kRA), (PPCOpcodeField::kRD,PPCOpcodeField::kCRcond,PPCOpcodeField::kOEcond), PrintDisasm_negx),\n  INSTRUCTION(0x7c0000f8, \"norx\"        , kX      , kI, kGeneral, \"NOR\"                                                                        , (PPCOpcodeField::kRS,PPCOpcodeField::kRB), (PPCOpcodeField::kRA,PPCOpcodeField::kCRcond), PrintDisasm_norx),\n  INSTRUCTION(0x7c000338, \"orcx\"        , kX      , kI, kGeneral, \"OR with Complement\"                                                         , (PPCOpcodeField::kRS,PPCOpcodeField::kRB), (PPCOpcodeField::kRA,PPCOpcodeField::kCRcond), PrintDisasm_orcx),\n  INSTRUCTION(0x60000000, \"ori\"         , kD      , kI, kGeneral, \"OR Immediate\"                                                               , (PPCOpcodeField::kRS,PPCOpcodeField::kUIMM), (PPCOpcodeField::kRA), PrintDisasm_ori),\n  INSTRUCTION(0x64000000, \"oris\"        , kD      , kI, kGeneral, \"OR Immediate Shifted\"                                                       , (PPCOpcodeField::kRS,PPCOpcodeField::kUIMM), (PPCOpcodeField::kRA), PrintDisasm_oris),\n  INSTRUCTION(0x7c000378, \"orx\"         , kX      , kI, kGeneral, \"OR\"                                                                         , (PPCOpcodeField::kRS,PPCOpcodeField::kRB), (PPCOpcodeField::kRA,PPCOpcodeField::kCRcond), PrintDisasm_orx),\n  INSTRUCTION(0x78000010, \"rldclx\"      , kMDS    , kI, kGeneral, \"Rotate Left Doubleword then Clear Left\"                                     , (PPCOpcodeField::kRS,PPCOpcodeField::kRB,PPCOpcodeField::kMB), (PPCOpcodeField::kRA,PPCOpcodeField::kCRcond), PrintDisasm_rldclx),\n  INSTRUCTION(0x78000012, \"rldcrx\"      , kMDS    , kI, kGeneral, \"Rotate Left Doubleword then Clear Right\"                                    , (PPCOpcodeField::kRS,PPCOpcodeField::kRB,PPCOpcodeField::kME), (PPCOpcodeField::kRA,PPCOpcodeField::kCRcond), PrintDisasm_rldcrx),\n  INSTRUCTION(0x78000000, \"rldiclx\"     , kMD     , kI, kGeneral, \"Rotate Left Doubleword Immediate then Clear Left\"                           , (PPCOpcodeField::kRS,PPCOpcodeField::kSH,PPCOpcodeField::kMB), (PPCOpcodeField::kRA,PPCOpcodeField::kCRcond), PrintDisasm_rldiclx),\n  INSTRUCTION(0x78000004, \"rldicrx\"     , kMD     , kI, kGeneral, \"Rotate Left Doubleword Immediate then Clear Right\"                          , (PPCOpcodeField::kRS,PPCOpcodeField::kSH,PPCOpcodeField::kME), (PPCOpcodeField::kRA,PPCOpcodeField::kCRcond), PrintDisasm_rldicrx),\n  INSTRUCTION(0x78000008, \"rldicx\"      , kMD     , kI, kGeneral, \"Rotate Left Doubleword Immediate then Clear\"                                , (PPCOpcodeField::kRS,PPCOpcodeField::kSH,PPCOpcodeField::kMB), (PPCOpcodeField::kRA,PPCOpcodeField::kCRcond), PrintDisasm_rldicx),\n  INSTRUCTION(0x7800000c, \"rldimix\"     , kMD     , kI, kGeneral, \"Rotate Left Doubleword Immediate then Mask Insert\"                          , (PPCOpcodeField::kRS,PPCOpcodeField::kSH,PPCOpcodeField::kMB), (PPCOpcodeField::kRA,PPCOpcodeField::kCRcond), PrintDisasm_rldimix),\n  INSTRUCTION(0x50000000, \"rlwimix\"     , kM      , kI, kGeneral, \"Rotate Left Word Immediate then Mask Insert\"                                , (PPCOpcodeField::kRS,PPCOpcodeField::kSH,PPCOpcodeField::kMB,PPCOpcodeField::kME), (PPCOpcodeField::kRA,PPCOpcodeField::kCRcond), PrintDisasm_rlwimix),\n  INSTRUCTION(0x54000000, \"rlwinmx\"     , kM      , kI, kGeneral, \"Rotate Left Word Immediate then AND with Mask\"                              , (PPCOpcodeField::kRS,PPCOpcodeField::kSH,PPCOpcodeField::kMB,PPCOpcodeField::kME), (PPCOpcodeField::kRA,PPCOpcodeField::kCRcond), PrintDisasm_rlwinmx),\n  INSTRUCTION(0x5c000000, \"rlwnmx\"      , kM      , kI, kGeneral, \"Rotate Left Word then AND with Mask\"                                        , (PPCOpcodeField::kRS,PPCOpcodeField::kRB,PPCOpcodeField::kMB,PPCOpcodeField::kME), (PPCOpcodeField::kRA,PPCOpcodeField::kCRcond), PrintDisasm_rlwnmx),\n  INSTRUCTION(0x44000002, \"sc\"          , kSC     , kB, kSync   , \"System Call\"                                                                , (PPCOpcodeField::kLEV), (), PrintDisasm_sc),\n  INSTRUCTION(0x7c000036, \"sldx\"        , kX      , kI, kGeneral, \"Shift Left Doubleword\"                                                      , (PPCOpcodeField::kRS,PPCOpcodeField::kRB), (PPCOpcodeField::kRA,PPCOpcodeField::kCRcond), PrintDisasm_sldx),\n  INSTRUCTION(0x7c000030, \"slwx\"        , kX      , kI, kGeneral, \"Shift Left Word\"                                                            , (PPCOpcodeField::kRS,PPCOpcodeField::kRB), (PPCOpcodeField::kRA,PPCOpcodeField::kCRcond), PrintDisasm_slwx),\n  INSTRUCTION(0x7c000674, \"sradix\"      , kXS     , kI, kGeneral, \"Shift Right Algebraic Doubleword Immediate\"                                 , (PPCOpcodeField::kRS,PPCOpcodeField::kSH), (PPCOpcodeField::kRA,PPCOpcodeField::kCRcond,PPCOpcodeField::kCA), PrintDisasm_sradix),\n  INSTRUCTION(0x7c000634, \"sradx\"       , kX      , kI, kGeneral, \"Shift Right Algebraic Doubleword\"                                           , (PPCOpcodeField::kRS,PPCOpcodeField::kRB), (PPCOpcodeField::kRA,PPCOpcodeField::kCRcond,PPCOpcodeField::kCA), PrintDisasm_sradx),\n  INSTRUCTION(0x7c000670, \"srawix\"      , kX      , kI, kGeneral, \"Shift Right Algebraic Word Immediate\"                                       , (PPCOpcodeField::kRS,PPCOpcodeField::kSH), (PPCOpcodeField::kRA,PPCOpcodeField::kCRcond,PPCOpcodeField::kCA), PrintDisasm_srawix),\n  INSTRUCTION(0x7c000630, \"srawx\"       , kX      , kI, kGeneral, \"Shift Right Algebraic Word\"                                                 , (PPCOpcodeField::kRS,PPCOpcodeField::kRB), (PPCOpcodeField::kRA,PPCOpcodeField::kCRcond,PPCOpcodeField::kCA), PrintDisasm_srawx),\n  INSTRUCTION(0x7c000436, \"srdx\"        , kX      , kI, kGeneral, \"Shift Right Doubleword\"                                                     , (PPCOpcodeField::kRS,PPCOpcodeField::kRB), (PPCOpcodeField::kRA,PPCOpcodeField::kCRcond), PrintDisasm_srdx),\n  INSTRUCTION(0x7c000430, \"srwx\"        , kX      , kI, kGeneral, \"Shift Right Word\"                                                           , (PPCOpcodeField::kRS,PPCOpcodeField::kRB), (PPCOpcodeField::kRA,PPCOpcodeField::kCRcond), PrintDisasm_srwx),\n  INSTRUCTION(0x98000000, \"stb\"         , kD      , kM, kGeneral, \"Store Byte\"                                                                 , (PPCOpcodeField::kRS,PPCOpcodeField::kRA0,PPCOpcodeField::kd), (), PrintDisasm_stb),\n  INSTRUCTION(0x9c000000, \"stbu\"        , kD      , kM, kGeneral, \"Store Byte with Update\"                                                     , (PPCOpcodeField::kRS,PPCOpcodeField::kRA,PPCOpcodeField::kd), (PPCOpcodeField::kRA), PrintDisasm_stbu),\n  INSTRUCTION(0x7c0001ee, \"stbux\"       , kX      , kM, kGeneral, \"Store Byte with Update Indexed\"                                             , (PPCOpcodeField::kRS,PPCOpcodeField::kRA,PPCOpcodeField::kRB), (PPCOpcodeField::kRA), PrintDisasm_stbux),\n  INSTRUCTION(0x7c0001ae, \"stbx\"        , kX      , kM, kGeneral, \"Store Byte Indexed\"                                                         , (PPCOpcodeField::kRS,PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (), PrintDisasm_stbx),\n  INSTRUCTION(0xf8000000, \"std\"         , kDS     , kM, kGeneral, \"Store Doubleword\"                                                           , (PPCOpcodeField::kRS,PPCOpcodeField::kRA,PPCOpcodeField::kds), (), PrintDisasm_std),\n  INSTRUCTION(0x7c000528, \"stdbrx\"      , kX      , kM, kGeneral, \"Store Doubleword Byte-Reverse Indexed\"                                      , (PPCOpcodeField::kRS,PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (), PrintDisasm_stdbrx),\n  INSTRUCTION(0x7c0001ad, \"stdcx\"       , kX      , kM, kGeneral, \"Store Doubleword Conditional Indexed\"                                       , (PPCOpcodeField::kRS,PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (PPCOpcodeField::kCR), PrintDisasm_stdcx),\n  INSTRUCTION(0xf8000001, \"stdu\"        , kDS     , kM, kGeneral, \"Store Doubleword with Update\"                                               , (PPCOpcodeField::kRS,PPCOpcodeField::kRA,PPCOpcodeField::kds), (PPCOpcodeField::kRA), PrintDisasm_stdu),\n  INSTRUCTION(0x7c00016a, \"stdux\"       , kX      , kM, kGeneral, \"Store Doubleword with Update Indexed\"                                       , (PPCOpcodeField::kRS,PPCOpcodeField::kRA,PPCOpcodeField::kRB), (PPCOpcodeField::kRA), PrintDisasm_stdux),\n  INSTRUCTION(0x7c00012a, \"stdx\"        , kX      , kM, kGeneral, \"Store Doubleword Indexed\"                                                   , (PPCOpcodeField::kRS,PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (), PrintDisasm_stdx),\n  INSTRUCTION(0xd8000000, \"stfd\"        , kD      , kM, kGeneral, \"Store Floating-Point Double\"                                                , (PPCOpcodeField::kFS,PPCOpcodeField::kRA0,PPCOpcodeField::kd), (), PrintDisasm_stfd),\n  INSTRUCTION(0xdc000000, \"stfdu\"       , kD      , kM, kGeneral, \"Store Floating-Point Double with Update\"                                    , (PPCOpcodeField::kFS,PPCOpcodeField::kRA,PPCOpcodeField::kd), (PPCOpcodeField::kRA), PrintDisasm_stfdu),\n  INSTRUCTION(0x7c0005ee, \"stfdux\"      , kX      , kM, kGeneral, \"Store Floating-Point Double with Update Indexed\"                            , (PPCOpcodeField::kFS,PPCOpcodeField::kRA,PPCOpcodeField::kRB), (PPCOpcodeField::kRA), PrintDisasm_stfdux),\n  INSTRUCTION(0x7c0005ae, \"stfdx\"       , kX      , kM, kGeneral, \"Store Floating-Point Double Indexed\"                                        , (PPCOpcodeField::kFS,PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (), PrintDisasm_stfdx),\n  INSTRUCTION(0x7c0007ae, \"stfiwx\"      , kX      , kM, kGeneral, \"Store Floating-Point as Integer Word Indexed\"                               , (PPCOpcodeField::kFS,PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (), PrintDisasm_stfiwx),\n  INSTRUCTION(0xd0000000, \"stfs\"        , kD      , kM, kGeneral, \"Store Floating-Point Single\"                                                , (PPCOpcodeField::kFS,PPCOpcodeField::kRA0,PPCOpcodeField::kd), (), PrintDisasm_stfs),\n  INSTRUCTION(0xd4000000, \"stfsu\"       , kD      , kM, kGeneral, \"Store Floating-Point Single with Update\"                                    , (PPCOpcodeField::kFS,PPCOpcodeField::kRA,PPCOpcodeField::kd), (PPCOpcodeField::kRA), PrintDisasm_stfsu),\n  INSTRUCTION(0x7c00056e, \"stfsux\"      , kX      , kM, kGeneral, \"Store Floating-Point Single with Update Indexed\"                            , (PPCOpcodeField::kFS,PPCOpcodeField::kRA,PPCOpcodeField::kRB), (PPCOpcodeField::kRA), PrintDisasm_stfsux),\n  INSTRUCTION(0x7c00052e, \"stfsx\"       , kX      , kM, kGeneral, \"Store Floating-Point Single Indexed\"                                        , (PPCOpcodeField::kFS,PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (), PrintDisasm_stfsx),\n  INSTRUCTION(0xb0000000, \"sth\"         , kD      , kM, kGeneral, \"Store Half Word\"                                                            , (PPCOpcodeField::kRS,PPCOpcodeField::kRA0,PPCOpcodeField::kd), (), PrintDisasm_sth),\n  INSTRUCTION(0x7c00072c, \"sthbrx\"      , kX      , kM, kGeneral, \"Store Half Word Byte-Reverse Indexed\"                                       , (PPCOpcodeField::kRS,PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (), PrintDisasm_sthbrx),\n  INSTRUCTION(0xb4000000, \"sthu\"        , kD      , kM, kGeneral, \"Store Half Word with Update\"                                                , (PPCOpcodeField::kRS,PPCOpcodeField::kRA,PPCOpcodeField::kd), (PPCOpcodeField::kRA), PrintDisasm_sthu),\n  INSTRUCTION(0x7c00036e, \"sthux\"       , kX      , kM, kGeneral, \"Store Half Word with Update Indexed\"                                        , (PPCOpcodeField::kRS,PPCOpcodeField::kRA,PPCOpcodeField::kRB), (PPCOpcodeField::kRA), PrintDisasm_sthux),\n  INSTRUCTION(0x7c00032e, \"sthx\"        , kX      , kM, kGeneral, \"Store Half Word Indexed\"                                                    , (PPCOpcodeField::kRS,PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (), PrintDisasm_sthx),\n  INSTRUCTION(0xbc000000, \"stmw\"        , kD      , kM, kGeneral, \"Store Multiple Word\"                                                        , (), (), nullptr),\n  INSTRUCTION(0x7c0005aa, \"stswi\"       , kX      , kM, kGeneral, \"Store String Word Immediate\"                                                , (), (), nullptr),\n  INSTRUCTION(0x7c00052a, \"stswx\"       , kX      , kM, kGeneral, \"Store String Word Indexed\"                                                  , (), (), nullptr),\n  INSTRUCTION(0x7c00010e, \"stvebx\"      , kX      , kM, kGeneral, \"Store Vector Element Byte Indexed\"                                          , (PPCOpcodeField::kVS,PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (), PrintDisasm_stvebx),\n  INSTRUCTION(0x7c00014e, \"stvehx\"      , kX      , kM, kGeneral, \"Store Vector Element Half Word Indexed\"                                     , (PPCOpcodeField::kVS,PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (), PrintDisasm_stvehx),\n  INSTRUCTION(0x7c00018e, \"stvewx\"      , kX      , kM, kGeneral, \"Store Vector Element Word Indexed\"                                          , (PPCOpcodeField::kVS,PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (), PrintDisasm_stvewx),\n  INSTRUCTION(0x10000183, \"stvewx128\"   , kVX128_1, kM, kGeneral, \"Store Vector Element Word Indexed 128\"                                      , (PPCOpcodeField::kVS,PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (), PrintDisasm_stvewx128),\n  INSTRUCTION(0x7c00050e, \"stvlx\"       , kX      , kM, kGeneral, \"Store Vector Left Indexed\"                                                  , (PPCOpcodeField::kVS,PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (), PrintDisasm_stvlx),\n  INSTRUCTION(0x10000503, \"stvlx128\"    , kVX128_1, kM, kGeneral, \"Store Vector Left Indexed 128\"                                              , (PPCOpcodeField::kVS,PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (), PrintDisasm_stvlx128),\n  INSTRUCTION(0x7c00070e, \"stvlxl\"      , kX      , kM, kGeneral, \"Store Vector Left Indexed LRU\"                                              , (PPCOpcodeField::kVS,PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (), PrintDisasm_stvlxl),\n  INSTRUCTION(0x10000703, \"stvlxl128\"   , kVX128_1, kM, kGeneral, \"Store Vector Left Indexed LRU 128\"                                          , (PPCOpcodeField::kVS,PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (), PrintDisasm_stvlxl128),\n  INSTRUCTION(0x7c00054e, \"stvrx\"       , kX      , kM, kGeneral, \"Store Vector Right Indexed\"                                                 , (PPCOpcodeField::kVS,PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (), PrintDisasm_stvrx),\n  INSTRUCTION(0x10000543, \"stvrx128\"    , kVX128_1, kM, kGeneral, \"Store Vector Right Indexed 128\"                                             , (PPCOpcodeField::kVS,PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (), PrintDisasm_stvrx128),\n  INSTRUCTION(0x7c00074e, \"stvrxl\"      , kX      , kM, kGeneral, \"Store Vector Right Indexed LRU\"                                             , (PPCOpcodeField::kVS,PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (), PrintDisasm_stvrxl),\n  INSTRUCTION(0x10000743, \"stvrxl128\"   , kVX128_1, kM, kGeneral, \"Store Vector Right Indexed LRU 128\"                                         , (PPCOpcodeField::kVS,PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (), PrintDisasm_stvrxl128),\n  INSTRUCTION(0x7c0001ce, \"stvx\"        , kX      , kM, kGeneral, \"Store Vector Indexed\"                                                       , (PPCOpcodeField::kVS,PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (), PrintDisasm_stvx),\n  INSTRUCTION(0x100001c3, \"stvx128\"     , kVX128_1, kM, kGeneral, \"Store Vector Indexed 128\"                                                   , (PPCOpcodeField::kVS,PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (), PrintDisasm_stvx128),\n  INSTRUCTION(0x7c0003ce, \"stvxl\"       , kX      , kM, kGeneral, \"Store Vector Indexed LRU\"                                                   , (PPCOpcodeField::kVS,PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (), PrintDisasm_stvxl),\n  INSTRUCTION(0x100003c3, \"stvxl128\"    , kVX128_1, kM, kGeneral, \"Store Vector Indexed LRU 128\"                                               , (PPCOpcodeField::kVS,PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (), PrintDisasm_stvxl128),\n  INSTRUCTION(0x90000000, \"stw\"         , kD      , kM, kGeneral, \"Store Word\"                                                                 , (PPCOpcodeField::kRS,PPCOpcodeField::kRA0,PPCOpcodeField::kd), (), PrintDisasm_stw),\n  INSTRUCTION(0x7c00052c, \"stwbrx\"      , kX      , kM, kGeneral, \"Store Word Byte-Reverse Indexed\"                                            , (PPCOpcodeField::kRS,PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (), PrintDisasm_stwbrx),\n  INSTRUCTION(0x7c00012d, \"stwcx\"       , kX      , kM, kGeneral, \"Store Word Conditional Indexed\"                                             , (PPCOpcodeField::kRS,PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (PPCOpcodeField::kCR), PrintDisasm_stwcx),\n  INSTRUCTION(0x94000000, \"stwu\"        , kD      , kM, kGeneral, \"Store Word with Update\"                                                     , (PPCOpcodeField::kRS,PPCOpcodeField::kRA,PPCOpcodeField::kd), (PPCOpcodeField::kRA), PrintDisasm_stwu),\n  INSTRUCTION(0x7c00016e, \"stwux\"       , kX      , kM, kGeneral, \"Store Word with Update Indexed\"                                             , (PPCOpcodeField::kRS,PPCOpcodeField::kRA,PPCOpcodeField::kRB), (PPCOpcodeField::kRA), PrintDisasm_stwux),\n  INSTRUCTION(0x7c00012e, \"stwx\"        , kX      , kM, kGeneral, \"Store Word Indexed\"                                                         , (PPCOpcodeField::kRS,PPCOpcodeField::kRA0,PPCOpcodeField::kRB), (), PrintDisasm_stwx),\n  INSTRUCTION(0x7c000010, \"subfcx\"      , kXO     , kI, kGeneral, \"Subtract From Carrying\"                                                     , (PPCOpcodeField::kRA,PPCOpcodeField::kRB), (PPCOpcodeField::kRD,PPCOpcodeField::kCRcond,PPCOpcodeField::kOEcond), PrintDisasm_subfcx),\n  INSTRUCTION(0x7c000110, \"subfex\"      , kXO     , kI, kGeneral, \"Subtract From Extended\"                                                     , (PPCOpcodeField::kRA,PPCOpcodeField::kRB), (PPCOpcodeField::kRD,PPCOpcodeField::kCRcond,PPCOpcodeField::kOEcond), PrintDisasm_subfex),\n  INSTRUCTION(0x20000000, \"subficx\"     , kD      , kI, kGeneral, \"Subtract From Immediate Carrying\"                                           , (PPCOpcodeField::kRA,PPCOpcodeField::kSIMM), (PPCOpcodeField::kRD,PPCOpcodeField::kCA), PrintDisasm_subficx),\n  INSTRUCTION(0x7c0001d0, \"subfmex\"     , kXO     , kI, kGeneral, \"Subtract From Minus One Extended\"                                           , (PPCOpcodeField::kRA,PPCOpcodeField::kCA), (PPCOpcodeField::kRD,PPCOpcodeField::kCRcond,PPCOpcodeField::kOEcond,PPCOpcodeField::kCA), PrintDisasm_subfmex),\n  INSTRUCTION(0x7c000050, \"subfx\"       , kXO     , kI, kGeneral, \"Subtract From\"                                                              , (PPCOpcodeField::kRA,PPCOpcodeField::kRB), (PPCOpcodeField::kRD,PPCOpcodeField::kCRcond,PPCOpcodeField::kOEcond), PrintDisasm_subfx),\n  INSTRUCTION(0x7c000190, \"subfzex\"     , kXO     , kI, kGeneral, \"Subtract From Zero Extended\"                                                , (PPCOpcodeField::kRA,PPCOpcodeField::kCA), (PPCOpcodeField::kRD,PPCOpcodeField::kCRcond,PPCOpcodeField::kOEcond,PPCOpcodeField::kCA), PrintDisasm_subfzex),\n  INSTRUCTION(0x7c0004ac, \"sync\"        , kX      , kI, kGeneral, \"Synchronize\"                                                                , (), (), PrintDisasm_sync),\n  INSTRUCTION(0x7c000088, \"td\"          , kX      , kB, kGeneral, \"Trap Doubleword\"                                                            , (PPCOpcodeField::kTO,PPCOpcodeField::kRA,PPCOpcodeField::kRB), (), PrintDisasm_td),\n  INSTRUCTION(0x08000000, \"tdi\"         , kD      , kB, kGeneral, \"Trap Doubleword Immediate\"                                                  , (PPCOpcodeField::kTO,PPCOpcodeField::kRA,PPCOpcodeField::kSIMM), (), PrintDisasm_tdi),\n  INSTRUCTION(0x7c000008, \"tw\"          , kX      , kB, kGeneral, \"Trap Word\"                                                                  , (PPCOpcodeField::kTO,PPCOpcodeField::kRA,PPCOpcodeField::kRB), (), PrintDisasm_tw),\n  INSTRUCTION(0x0c000000, \"twi\"         , kD      , kB, kGeneral, \"Trap Word Immediate\"                                                        , (PPCOpcodeField::kTO,PPCOpcodeField::kRA,PPCOpcodeField::kSIMM), (), PrintDisasm_twi),\n  INSTRUCTION(0x10000180, \"vaddcuw\"     , kVX     , kV, kGeneral, \"Vector Add Carryout Unsigned Word\"                                          , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vaddcuw),\n  INSTRUCTION(0x1000000a, \"vaddfp\"      , kVX     , kV, kGeneral, \"Vector Add Floating Point\"                                                  , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vaddfp),\n  INSTRUCTION(0x14000010, \"vaddfp128\"   , kVX128  , kV, kGeneral, \"Vector128 Add Floating Point\"                                               , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vaddfp128),\n  INSTRUCTION(0x10000300, \"vaddsbs\"     , kVX     , kV, kGeneral, \"Vector Add Signed Byte Saturate\"                                            , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD,PPCOpcodeField::kVSCR), PrintDisasm_vaddsbs),\n  INSTRUCTION(0x10000340, \"vaddshs\"     , kVX     , kV, kGeneral, \"Vector Add Signed Half Word Saturate\"                                       , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD,PPCOpcodeField::kVSCR), PrintDisasm_vaddshs),\n  INSTRUCTION(0x10000380, \"vaddsws\"     , kVX     , kV, kGeneral, \"Vector Add Signed Word Saturate\"                                            , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD,PPCOpcodeField::kVSCR), PrintDisasm_vaddsws),\n  INSTRUCTION(0x10000000, \"vaddubm\"     , kVX     , kV, kGeneral, \"Vector Add Unsigned Byte Modulo\"                                            , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vaddubm),\n  INSTRUCTION(0x10000200, \"vaddubs\"     , kVX     , kV, kGeneral, \"Vector Add Unsigned Byte Saturate\"                                          , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD,PPCOpcodeField::kVSCR), PrintDisasm_vaddubs),\n  INSTRUCTION(0x10000040, \"vadduhm\"     , kVX     , kV, kGeneral, \"Vector Add Unsigned Half Word Modulo\"                                       , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vadduhm),\n  INSTRUCTION(0x10000240, \"vadduhs\"     , kVX     , kV, kGeneral, \"Vector Add Unsigned Half Word Saturate\"                                     , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD,PPCOpcodeField::kVSCR), PrintDisasm_vadduhs),\n  INSTRUCTION(0x10000080, \"vadduwm\"     , kVX     , kV, kGeneral, \"Vector Add Unsigned Word Modulo\"                                            , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vadduwm),\n  INSTRUCTION(0x10000280, \"vadduws\"     , kVX     , kV, kGeneral, \"Vector Add Unsigned Word Saturate\"                                          , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD,PPCOpcodeField::kVSCR), PrintDisasm_vadduws),\n  INSTRUCTION(0x10000404, \"vand\"        , kVX     , kV, kGeneral, \"Vector Logical AND\"                                                         , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vand),\n  INSTRUCTION(0x14000210, \"vand128\"     , kVX128  , kV, kGeneral, \"Vector128 Logical AND\"                                                      , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vand128),\n  INSTRUCTION(0x10000444, \"vandc\"       , kVX     , kV, kGeneral, \"Vector Logical AND with Complement\"                                         , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vandc),\n  INSTRUCTION(0x14000250, \"vandc128\"    , kVX128  , kV, kGeneral, \"Vector128 Logical AND with Complement\"                                      , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vandc128),\n  INSTRUCTION(0x10000502, \"vavgsb\"      , kVX     , kV, kGeneral, \"Vector Average Signed Byte\"                                                 , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vavgsb),\n  INSTRUCTION(0x10000542, \"vavgsh\"      , kVX     , kV, kGeneral, \"Vector Average Signed Half Word\"                                            , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vavgsh),\n  INSTRUCTION(0x10000582, \"vavgsw\"      , kVX     , kV, kGeneral, \"Vector Average Signed Word\"                                                 , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vavgsw),\n  INSTRUCTION(0x10000402, \"vavgub\"      , kVX     , kV, kGeneral, \"Vector Average Unsigned Byte\"                                               , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vavgub),\n  INSTRUCTION(0x10000442, \"vavguh\"      , kVX     , kV, kGeneral, \"Vector Average Unsigned Half Word\"                                          , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vavguh),\n  INSTRUCTION(0x10000482, \"vavguw\"      , kVX     , kV, kGeneral, \"Vector Average Unsigned Word\"                                               , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vavguw),\n  INSTRUCTION(0x18000230, \"vcfpsxws128\" , kVX128_3, kV, kGeneral, \"Vector128 Convert From Floating-Point to Signed Fixed-Point Word Saturate\"  , (PPCOpcodeField::kVB,PPCOpcodeField::kUIMM), (PPCOpcodeField::kVD,PPCOpcodeField::kVSCR), PrintDisasm_vcfpsxws128),\n  INSTRUCTION(0x18000270, \"vcfpuxws128\" , kVX128_3, kV, kGeneral, \"Vector128 Convert From Floating-Point to Unsigned Fixed-Point Word Saturate\", (PPCOpcodeField::kVB,PPCOpcodeField::kUIMM), (PPCOpcodeField::kVD,PPCOpcodeField::kVSCR), PrintDisasm_vcfpuxws128),\n  INSTRUCTION(0x1000034a, \"vcfsx\"       , kVX     , kV, kGeneral, \"Vector Convert from Signed Fixed-Point Word\"                                , (PPCOpcodeField::kVB,PPCOpcodeField::kUIMM), (PPCOpcodeField::kVD), PrintDisasm_vcfsx),\n  INSTRUCTION(0x1000030a, \"vcfux\"       , kVX     , kV, kGeneral, \"Vector Convert from Unsigned Fixed-Point Word\"                              , (PPCOpcodeField::kVB,PPCOpcodeField::kUIMM), (PPCOpcodeField::kVD), PrintDisasm_vcfux),\n  INSTRUCTION(0x100003c6, \"vcmpbfp\"     , kVC     , kV, kGeneral, \"Vector Compare Bounds Floating Point\"                                       , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD,PPCOpcodeField::kCRcond), PrintDisasm_vcmpbfp),\n  INSTRUCTION(0x18000180, \"vcmpbfp128\"  , kVX128_R, kV, kGeneral, \"Vector128 Compare Bounds Floating Point\"                                    , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD,PPCOpcodeField::kCRcond), PrintDisasm_vcmpbfp128),\n  INSTRUCTION(0x100000c6, \"vcmpeqfp\"    , kVC     , kV, kGeneral, \"Vector Compare Equal-to Floating Point\"                                     , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD,PPCOpcodeField::kCRcond), PrintDisasm_vcmpeqfp),\n  INSTRUCTION(0x18000000, \"vcmpeqfp128\" , kVX128_R, kV, kGeneral, \"Vector128 Compare Equal-to Floating Point\"                                  , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD,PPCOpcodeField::kCRcond), PrintDisasm_vcmpeqfp128),\n  INSTRUCTION(0x10000006, \"vcmpequb\"    , kVC     , kV, kGeneral, \"Vector Compare Equal-to Unsigned Byte\"                                      , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD,PPCOpcodeField::kCRcond), PrintDisasm_vcmpequb),\n  INSTRUCTION(0x10000046, \"vcmpequh\"    , kVC     , kV, kGeneral, \"Vector Compare Equal-to Unsigned Half Word\"                                 , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD,PPCOpcodeField::kCRcond), PrintDisasm_vcmpequh),\n  INSTRUCTION(0x10000086, \"vcmpequw\"    , kVC     , kV, kGeneral, \"Vector Compare Equal-to Unsigned Word\"                                      , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD,PPCOpcodeField::kCRcond), PrintDisasm_vcmpequw),\n  INSTRUCTION(0x18000200, \"vcmpequw128\" , kVX128_R, kV, kGeneral, \"Vector128 Compare Equal-to Unsigned Word\"                                   , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD,PPCOpcodeField::kCRcond), PrintDisasm_vcmpequw128),\n  INSTRUCTION(0x100001c6, \"vcmpgefp\"    , kVC     , kV, kGeneral, \"Vector Compare Greater-Than-or-Equal-to Floating Point\"                     , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD,PPCOpcodeField::kCRcond), PrintDisasm_vcmpgefp),\n  INSTRUCTION(0x18000080, \"vcmpgefp128\" , kVX128_R, kV, kGeneral, \"Vector128 Compare Greater-Than-or-Equal-to Floating Point\"                  , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD,PPCOpcodeField::kCRcond), PrintDisasm_vcmpgefp128),\n  INSTRUCTION(0x100002c6, \"vcmpgtfp\"    , kVC     , kV, kGeneral, \"Vector Compare Greater-Than Floating Point\"                                 , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD,PPCOpcodeField::kCRcond), PrintDisasm_vcmpgtfp),\n  INSTRUCTION(0x18000100, \"vcmpgtfp128\" , kVX128_R, kV, kGeneral, \"Vector128 Compare Greater-Than Floating-Point\"                              , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD,PPCOpcodeField::kCRcond), PrintDisasm_vcmpgtfp128),\n  INSTRUCTION(0x10000306, \"vcmpgtsb\"    , kVC     , kV, kGeneral, \"Vector Compare Greater-Than Signed Byte\"                                    , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD,PPCOpcodeField::kCRcond), PrintDisasm_vcmpgtsb),\n  INSTRUCTION(0x10000346, \"vcmpgtsh\"    , kVC     , kV, kGeneral, \"Vector Compare Greater-Than Signed Half Word\"                               , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD,PPCOpcodeField::kCRcond), PrintDisasm_vcmpgtsh),\n  INSTRUCTION(0x10000386, \"vcmpgtsw\"    , kVC     , kV, kGeneral, \"Vector Compare Greater-Than Signed Word\"                                    , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD,PPCOpcodeField::kCRcond), PrintDisasm_vcmpgtsw),\n  INSTRUCTION(0x10000206, \"vcmpgtub\"    , kVC     , kV, kGeneral, \"Vector Compare Greater-Than Unsigned Byte\"                                  , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD,PPCOpcodeField::kCRcond), PrintDisasm_vcmpgtub),\n  INSTRUCTION(0x10000246, \"vcmpgtuh\"    , kVC     , kV, kGeneral, \"Vector Compare Greater-Than Unsigned Half Word\"                             , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD,PPCOpcodeField::kCRcond), PrintDisasm_vcmpgtuh),\n  INSTRUCTION(0x10000286, \"vcmpgtuw\"    , kVC     , kV, kGeneral, \"Vector Compare Greater-Than Unsigned Word\"                                  , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD,PPCOpcodeField::kCRcond), PrintDisasm_vcmpgtuw),\n  INSTRUCTION(0x180002b0, \"vcsxwfp128\"  , kVX128_3, kV, kGeneral, \"Vector128 Convert From Signed Fixed-Point Word to Floating-Point\"           , (PPCOpcodeField::kVB,PPCOpcodeField::kUIMM), (PPCOpcodeField::kVD), PrintDisasm_vcsxwfp128),\n  INSTRUCTION(0x100003ca, \"vctsxs\"      , kVX     , kV, kGeneral, \"Vector Convert to Signed Fixed-Point Word Saturate\"                         , (PPCOpcodeField::kVB,PPCOpcodeField::kUIMM), (PPCOpcodeField::kVD,PPCOpcodeField::kVSCR), PrintDisasm_vctsxs),\n  INSTRUCTION(0x1000038a, \"vctuxs\"      , kVX     , kV, kGeneral, \"Vector Convert to Unsigned Fixed-Point Word Saturate\"                       , (PPCOpcodeField::kVB,PPCOpcodeField::kUIMM), (PPCOpcodeField::kVD,PPCOpcodeField::kVSCR), PrintDisasm_vctuxs),\n  INSTRUCTION(0x180002f0, \"vcuxwfp128\"  , kVX128_3, kV, kGeneral, \"Vector128 Convert From Unsigned Fixed-Point Word to Floating-Point\"         , (PPCOpcodeField::kVB,PPCOpcodeField::kUIMM), (PPCOpcodeField::kVD), PrintDisasm_vcuxwfp128),\n  INSTRUCTION(0x1000018a, \"vexptefp\"    , kVX     , kV, kGeneral, \"Vector 2 Raised to the Exponent Estimate Floating Point\"                    , (PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vexptefp),\n  INSTRUCTION(0x180006b0, \"vexptefp128\" , kVX128_3, kV, kGeneral, \"Vector128 Log2 Estimate Floating Point\"                                     , (PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vexptefp128),\n  INSTRUCTION(0x100001ca, \"vlogefp\"     , kVX     , kV, kGeneral, \"Vector Log2 Estimate Floating Point\"                                        , (PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vlogefp),\n  INSTRUCTION(0x180006f0, \"vlogefp128\"  , kVX128_3, kV, kGeneral, \"Vector128 Log2 Estimate Floating Point\"                                     , (PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vlogefp128),\n  INSTRUCTION(0x14000110, \"vmaddcfp128\" , kVX128  , kV, kGeneral, \"Vector128 Multiply Add Floating Point\"                                      , (PPCOpcodeField::kVA,PPCOpcodeField::kVD,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vmaddcfp128),\n  INSTRUCTION(0x1000002e, \"vmaddfp\"     , kVA     , kV, kGeneral, \"Vector Multiply-Add Floating Point\"                                         , (PPCOpcodeField::kVA,PPCOpcodeField::kVC,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vmaddfp),\n  INSTRUCTION(0x140000d0, \"vmaddfp128\"  , kVX128  , kV, kGeneral, \"Vector128 Multiply Add Floating Point\"                                      , (PPCOpcodeField::kVA,PPCOpcodeField::kVC,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vmaddfp128),\n  INSTRUCTION(0x1000040a, \"vmaxfp\"      , kVX     , kV, kGeneral, \"Vector Maximum Floating Point\"                                              , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vmaxfp),\n  INSTRUCTION(0x18000280, \"vmaxfp128\"   , kVX128  , kV, kGeneral, \"Vector128 Maximum Floating Point\"                                           , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vmaxfp128),\n  INSTRUCTION(0x10000102, \"vmaxsb\"      , kVX     , kV, kGeneral, \"Vector Maximum Signed Byte\"                                                 , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vmaxsb),\n  INSTRUCTION(0x10000142, \"vmaxsh\"      , kVX     , kV, kGeneral, \"Vector Maximum Signed Half Word\"                                            , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vmaxsh),\n  INSTRUCTION(0x10000182, \"vmaxsw\"      , kVX     , kV, kGeneral, \"Vector Maximum Signed Word\"                                                 , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vmaxsw),\n  INSTRUCTION(0x10000002, \"vmaxub\"      , kVX     , kV, kGeneral, \"Vector Maximum Unsigned Byte\"                                               , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vmaxub),\n  INSTRUCTION(0x10000042, \"vmaxuh\"      , kVX     , kV, kGeneral, \"Vector Maximum Unsigned Half Word\"                                          , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vmaxuh),\n  INSTRUCTION(0x10000082, \"vmaxuw\"      , kVX     , kV, kGeneral, \"Vector Maximum Unsigned Word\"                                               , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vmaxuw),\n  INSTRUCTION(0x10000020, \"vmhaddshs\"   , kVA     , kV, kGeneral, \"Vector Multiply-High and Add Signed Signed Half Word Saturate\"              , (PPCOpcodeField::kVA,PPCOpcodeField::kVB,PPCOpcodeField::kVC), (PPCOpcodeField::kVD,PPCOpcodeField::kVSCR), PrintDisasm_vmhaddshs),\n  INSTRUCTION(0x10000021, \"vmhraddshs\"  , kVA     , kV, kGeneral, \"Vector Multiply-High Round and Add Signed Signed Half Word Saturate\"        , (PPCOpcodeField::kVA,PPCOpcodeField::kVB,PPCOpcodeField::kVC), (PPCOpcodeField::kVD,PPCOpcodeField::kVSCR), PrintDisasm_vmhraddshs),\n  INSTRUCTION(0x1000044a, \"vminfp\"      , kVX     , kV, kGeneral, \"Vector Minimum Floating Point\"                                              , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vminfp),\n  INSTRUCTION(0x180002c0, \"vminfp128\"   , kVX128  , kV, kGeneral, \"Vector128 Minimum Floating Point\"                                           , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vminfp128),\n  INSTRUCTION(0x10000302, \"vminsb\"      , kVX     , kV, kGeneral, \"Vector Minimum Signed Byte\"                                                 , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vminsb),\n  INSTRUCTION(0x10000342, \"vminsh\"      , kVX     , kV, kGeneral, \"Vector Minimum Signed Half Word\"                                            , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vminsh),\n  INSTRUCTION(0x10000382, \"vminsw\"      , kVX     , kV, kGeneral, \"Vector Minimum Signed Word\"                                                 , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vminsw),\n  INSTRUCTION(0x10000202, \"vminub\"      , kVX     , kV, kGeneral, \"Vector Minimum Unsigned Byte\"                                               , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vminub),\n  INSTRUCTION(0x10000242, \"vminuh\"      , kVX     , kV, kGeneral, \"Vector Minimum Unsigned Half Word\"                                          , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vminuh),\n  INSTRUCTION(0x10000282, \"vminuw\"      , kVX     , kV, kGeneral, \"Vector Minimum Unsigned Word\"                                               , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vminuw),\n  INSTRUCTION(0x10000022, \"vmladduhm\"   , kVA     , kV, kGeneral, \"Vector Multiply-Low and Add Unsigned Half Word Modulo\"                      , (PPCOpcodeField::kVA,PPCOpcodeField::kVB,PPCOpcodeField::kVC), (PPCOpcodeField::kVD), PrintDisasm_vmladduhm),\n  INSTRUCTION(0x1000000c, \"vmrghb\"      , kVX     , kV, kGeneral, \"Vector Merge High Byte\"                                                     , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vmrghb),\n  INSTRUCTION(0x1000004c, \"vmrghh\"      , kVX     , kV, kGeneral, \"Vector Merge High Half Word\"                                                , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vmrghh),\n  INSTRUCTION(0x1000008c, \"vmrghw\"      , kVX     , kV, kGeneral, \"Vector Merge High Word\"                                                     , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vmrghw),\n  INSTRUCTION(0x18000300, \"vmrghw128\"   , kVX128  , kV, kGeneral, \"Vector128 Merge High Word\"                                                  , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vmrghw128),\n  INSTRUCTION(0x1000010c, \"vmrglb\"      , kVX     , kV, kGeneral, \"Vector Merge Low Byte\"                                                      , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vmrglb),\n  INSTRUCTION(0x1000014c, \"vmrglh\"      , kVX     , kV, kGeneral, \"Vector Merge Low Half Word\"                                                 , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vmrglh),\n  INSTRUCTION(0x1000018c, \"vmrglw\"      , kVX     , kV, kGeneral, \"Vector Merge Low Word\"                                                      , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vmrglw),\n  INSTRUCTION(0x18000340, \"vmrglw128\"   , kVX128  , kV, kGeneral, \"Vector128 Merge Low Word\"                                                   , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vmrglw128),\n  INSTRUCTION(0x14000190, \"vmsum3fp128\" , kVX128  , kV, kGeneral, \"Vector128 Multiply Sum 3-way Floating Point\"                                , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vmsum3fp128),\n  INSTRUCTION(0x140001d0, \"vmsum4fp128\" , kVX128  , kV, kGeneral, \"Vector128 Multiply Sum 4-way Floating-Point\"                                , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vmsum4fp128),\n  INSTRUCTION(0x10000025, \"vmsummbm\"    , kVA     , kV, kGeneral, \"Vector Multiply-Sum Mixed-Sign Byte Modulo\"                                 , (PPCOpcodeField::kVA,PPCOpcodeField::kVB,PPCOpcodeField::kVC), (PPCOpcodeField::kVD), PrintDisasm_vmsummbm),\n  INSTRUCTION(0x10000028, \"vmsumshm\"    , kVA     , kV, kGeneral, \"Vector Multiply-Sum Signed Half Word Modulo\"                                , (PPCOpcodeField::kVA,PPCOpcodeField::kVB,PPCOpcodeField::kVC), (PPCOpcodeField::kVD), PrintDisasm_vmsumshm),\n  INSTRUCTION(0x10000029, \"vmsumshs\"    , kVA     , kV, kGeneral, \"Vector Multiply-Sum Signed Half Word Saturate\"                              , (PPCOpcodeField::kVA,PPCOpcodeField::kVB,PPCOpcodeField::kVC), (PPCOpcodeField::kVD,PPCOpcodeField::kVSCR), PrintDisasm_vmsumshs),\n  INSTRUCTION(0x10000024, \"vmsumubm\"    , kVA     , kV, kGeneral, \"Vector Multiply-Sum Unsigned Byte Modulo\"                                   , (PPCOpcodeField::kVA,PPCOpcodeField::kVB,PPCOpcodeField::kVC), (PPCOpcodeField::kVD), PrintDisasm_vmsumubm),\n  INSTRUCTION(0x10000026, \"vmsumuhm\"    , kVA     , kV, kGeneral, \"Vector Multiply-Sum Unsigned Half Word Modulo\"                              , (PPCOpcodeField::kVA,PPCOpcodeField::kVB,PPCOpcodeField::kVC), (PPCOpcodeField::kVD), PrintDisasm_vmsumuhm),\n  INSTRUCTION(0x10000027, \"vmsumuhs\"    , kVA     , kV, kGeneral, \"Vector Multiply-Sum Unsigned Half Word Saturate\"                            , (PPCOpcodeField::kVA,PPCOpcodeField::kVB,PPCOpcodeField::kVC), (PPCOpcodeField::kVD,PPCOpcodeField::kVSCR), PrintDisasm_vmsumuhs),\n  INSTRUCTION(0x10000308, \"vmulesb\"     , kVX     , kV, kGeneral, \"Vector Multiply Even Signed Byte\"                                           , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vmulesb),\n  INSTRUCTION(0x10000348, \"vmulesh\"     , kVX     , kV, kGeneral, \"Vector Multiply Even Signed Half Word\"                                      , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vmulesh),\n  INSTRUCTION(0x10000208, \"vmuleub\"     , kVX     , kV, kGeneral, \"Vector Multiply Even Unsigned Byte\"                                         , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vmuleub),\n  INSTRUCTION(0x10000248, \"vmuleuh\"     , kVX     , kV, kGeneral, \"Vector Multiply Even Unsigned Half Word\"                                    , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vmuleuh),\n  INSTRUCTION(0x14000090, \"vmulfp128\"   , kVX128  , kV, kGeneral, \"Vector128 Multiply Floating-Point\"                                          , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vmulfp128),\n  INSTRUCTION(0x10000108, \"vmulosb\"     , kVX     , kV, kGeneral, \"Vector Multiply Odd Signed Byte\"                                            , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vmulosb),\n  INSTRUCTION(0x10000148, \"vmulosh\"     , kVX     , kV, kGeneral, \"Vector Multiply Odd Signed Half Word\"                                       , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vmulosh),\n  INSTRUCTION(0x10000008, \"vmuloub\"     , kVX     , kV, kGeneral, \"Vector Multiply Odd Unsigned Byte\"                                          , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vmuloub),\n  INSTRUCTION(0x10000048, \"vmulouh\"     , kVX     , kV, kGeneral, \"Vector Multiply Odd Unsigned Half Word\"                                     , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vmulouh),\n  INSTRUCTION(0x1000002f, \"vnmsubfp\"    , kVA     , kV, kGeneral, \"Vector Negative Multiply-Subtract Floating Point\"                           , (PPCOpcodeField::kVA,PPCOpcodeField::kVC,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vnmsubfp),\n  INSTRUCTION(0x14000150, \"vnmsubfp128\" , kVX128  , kV, kGeneral, \"Vector128 Negative Multiply-Subtract Floating Point\"                        , (PPCOpcodeField::kVA,PPCOpcodeField::kVD,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vnmsubfp128),\n  INSTRUCTION(0x10000504, \"vnor\"        , kVX     , kV, kGeneral, \"Vector Logical NOR\"                                                         , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vnor),\n  INSTRUCTION(0x14000290, \"vnor128\"     , kVX128  , kV, kGeneral, \"Vector128 Logical NOR\"                                                      , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vnor128),\n  INSTRUCTION(0x10000484, \"vor\"         , kVX     , kV, kGeneral, \"Vector Logical OR\"                                                          , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vor),\n  INSTRUCTION(0x140002d0, \"vor128\"      , kVX128  , kV, kGeneral, \"Vector128 Logical OR\"                                                       , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vor128),\n  INSTRUCTION(0x1000002b, \"vperm\"       , kVA     , kV, kGeneral, \"Vector Permute\"                                                             , (PPCOpcodeField::kVA,PPCOpcodeField::kVB,PPCOpcodeField::kVC), (PPCOpcodeField::kVD), PrintDisasm_vperm),\n  INSTRUCTION(0x14000000, \"vperm128\"    , kVX128_2, kV, kGeneral, \"Vector128 Permute\"                                                          , (PPCOpcodeField::kVA,PPCOpcodeField::kVB,PPCOpcodeField::kVC), (PPCOpcodeField::kVD), PrintDisasm_vperm128),\n  INSTRUCTION(0x18000210, \"vpermwi128\"  , kVX128_P, kV, kGeneral, \"Vector128 Permutate Word Immediate\"                                         , (PPCOpcodeField::kVB,PPCOpcodeField::kUIMM), (PPCOpcodeField::kVD), PrintDisasm_vpermwi128),\n  INSTRUCTION(0x18000610, \"vpkd3d128\"   , kVX128_4, kV, kGeneral, \"Vector128 Pack D3Dtype, Rotate Left Immediate and Mask Insert\"              , (PPCOpcodeField::kVB), (PPCOpcodeField::kVD), nullptr),\n  INSTRUCTION(0x1000030e, \"vpkpx\"       , kVX     , kV, kGeneral, \"Vector Pack Pixel\"                                                          , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vpkpx),\n  INSTRUCTION(0x1000018e, \"vpkshss\"     , kVX     , kV, kGeneral, \"Vector Pack Signed Half Word Signed Saturate\"                               , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD,PPCOpcodeField::kVSCR), PrintDisasm_vpkshss),\n  INSTRUCTION(0x14000200, \"vpkshss128\"  , kVX128  , kV, kGeneral, \"Vector128 Pack Signed Half Word Signed Saturate\"                            , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD,PPCOpcodeField::kVSCR), PrintDisasm_vpkshss128),\n  INSTRUCTION(0x1000010e, \"vpkshus\"     , kVX     , kV, kGeneral, \"Vector Pack Signed Half Word Unsigned Saturate\"                             , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD,PPCOpcodeField::kVSCR), PrintDisasm_vpkshus),\n  INSTRUCTION(0x14000240, \"vpkshus128\"  , kVX128  , kV, kGeneral, \"Vector128 Pack Signed Half Word Unsigned Saturate\"                          , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD,PPCOpcodeField::kVSCR), PrintDisasm_vpkshus128),\n  INSTRUCTION(0x100001ce, \"vpkswss\"     , kVX     , kV, kGeneral, \"Vector Pack Signed Word Signed Saturate\"                                    , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD,PPCOpcodeField::kVSCR), PrintDisasm_vpkswss),\n  INSTRUCTION(0x14000280, \"vpkswss128\"  , kVX128  , kV, kGeneral, \"Vector128 Pack Signed Word Signed Saturate\"                                 , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD,PPCOpcodeField::kVSCR), PrintDisasm_vpkswss128),\n  INSTRUCTION(0x1000014e, \"vpkswus\"     , kVX     , kV, kGeneral, \"Vector Pack Signed Word Unsigned Saturate\"                                  , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD,PPCOpcodeField::kVSCR), PrintDisasm_vpkswus),\n  INSTRUCTION(0x140002c0, \"vpkswus128\"  , kVX128  , kV, kGeneral, \"Vector128 Pack Signed Word Unsigned Saturate\"                               , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD,PPCOpcodeField::kVSCR), PrintDisasm_vpkswus128),\n  INSTRUCTION(0x1000000e, \"vpkuhum\"     , kVX     , kV, kGeneral, \"Vector Pack Unsigned Half Word Unsigned Modulo\"                             , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vpkuhum),\n  INSTRUCTION(0x14000300, \"vpkuhum128\"  , kVX128  , kV, kGeneral, \"Vector128 Pack Unsigned Half Word Unsigned Modulo\"                          , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vpkuhum128),\n  INSTRUCTION(0x1000008e, \"vpkuhus\"     , kVX     , kV, kGeneral, \"Vector Pack Unsigned Half Word Unsigned Saturate\"                           , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD,PPCOpcodeField::kVSCR), PrintDisasm_vpkuhus),\n  INSTRUCTION(0x14000340, \"vpkuhus128\"  , kVX128  , kV, kGeneral, \"Vector128 Pack Unsigned Half Word Unsigned Saturate\"                        , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD,PPCOpcodeField::kVSCR), PrintDisasm_vpkuhus128),\n  INSTRUCTION(0x1000004e, \"vpkuwum\"     , kVX     , kV, kGeneral, \"Vector Pack Unsigned Word Unsigned Modulo\"                                  , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vpkuwum),\n  INSTRUCTION(0x14000380, \"vpkuwum128\"  , kVX128  , kV, kGeneral, \"Vector128 Pack Unsigned Word Unsigned Modulo\"                               , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vpkuwum128),\n  INSTRUCTION(0x100000ce, \"vpkuwus\"     , kVX     , kV, kGeneral, \"Vector Pack Unsigned Word Unsigned Saturate\"                                , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD,PPCOpcodeField::kVSCR), PrintDisasm_vpkuwus),\n  INSTRUCTION(0x140003c0, \"vpkuwus128\"  , kVX128  , kV, kGeneral, \"Vector128 Pack Unsigned Word Unsigned Saturate\"                             , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD,PPCOpcodeField::kVSCR), PrintDisasm_vpkuwus128),\n  INSTRUCTION(0x1000010a, \"vrefp\"       , kVX     , kV, kGeneral, \"Vector Reciprocal Estimate Floating Point\"                                  , (PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vrefp),\n  INSTRUCTION(0x18000630, \"vrefp128\"    , kVX128_3, kV, kGeneral, \"Vector128 Reciprocal Estimate Floating Point\"                               , (PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vrefp128),\n  INSTRUCTION(0x100002ca, \"vrfim\"       , kVX     , kV, kGeneral, \"Vector Round to Floating-Point Integer toward -Infinity\"                    , (PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vrfim),\n  INSTRUCTION(0x18000330, \"vrfim128\"    , kVX128_3, kV, kGeneral, \"Vector128 Round to Floating-Point Integer toward -Infinity\"                 , (PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vrfim128),\n  INSTRUCTION(0x1000020a, \"vrfin\"       , kVX     , kV, kGeneral, \"Vector Round to Floating-Point Integer Nearest\"                             , (PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vrfin),\n  INSTRUCTION(0x18000370, \"vrfin128\"    , kVX128_3, kV, kGeneral, \"Vector128 Round to Floating-Point Integer Nearest\"                          , (PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vrfin128),\n  INSTRUCTION(0x1000028a, \"vrfip\"       , kVX     , kV, kGeneral, \"Vector Round to Floating-Point Integer toward +Infinity\"                    , (PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vrfip),\n  INSTRUCTION(0x180003b0, \"vrfip128\"    , kVX128_3, kV, kGeneral, \"Vector128 Round to Floating-Point Integer toward +Infinity\"                 , (PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vrfip128),\n  INSTRUCTION(0x1000024a, \"vrfiz\"       , kVX     , kV, kGeneral, \"Vector Round to Floating-Point Integer toward Zero\"                         , (PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vrfiz),\n  INSTRUCTION(0x180003f0, \"vrfiz128\"    , kVX128_3, kV, kGeneral, \"Vector128 Round to Floating-Point Integer toward Zero\"                      , (PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vrfiz128),\n  INSTRUCTION(0x10000004, \"vrlb\"        , kVX     , kV, kGeneral, \"Vector Rotate Left Integer Byte\"                                            , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vrlb),\n  INSTRUCTION(0x10000044, \"vrlh\"        , kVX     , kV, kGeneral, \"Vector Rotate Left Integer Half Word\"                                       , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vrlh),\n  INSTRUCTION(0x18000710, \"vrlimi128\"   , kVX128_4, kV, kGeneral, \"Vector128 Rotate Left Immediate and Mask Insert\"                            , (PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vrlimi128),\n  INSTRUCTION(0x10000084, \"vrlw\"        , kVX     , kV, kGeneral, \"Vector Rotate Left Integer Word\"                                            , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vrlw),\n  INSTRUCTION(0x18000050, \"vrlw128\"     , kVX128  , kV, kGeneral, \"Vector128 Rotate Left Word\"                                                 , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vrlw128),\n  INSTRUCTION(0x1000014a, \"vrsqrtefp\"   , kVX     , kV, kGeneral, \"Vector Reciprocal Square Root Estimate Floating Point\"                      , (PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vrsqrtefp),\n  INSTRUCTION(0x18000670, \"vrsqrtefp128\", kVX128_3, kV, kGeneral, \"Vector128 Reciprocal Square Root Estimate Floating Point\"                   , (PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vrsqrtefp128),\n  INSTRUCTION(0x1000002a, \"vsel\"        , kVA     , kV, kGeneral, \"Vector Conditional Select\"                                                  , (PPCOpcodeField::kVA,PPCOpcodeField::kVB,PPCOpcodeField::kVC), (PPCOpcodeField::kVD), PrintDisasm_vsel),\n  INSTRUCTION(0x14000350, \"vsel128\"     , kVX128  , kV, kGeneral, \"Vector128 Conditional Select\"                                               , (PPCOpcodeField::kVA,PPCOpcodeField::kVB,PPCOpcodeField::kVD), (PPCOpcodeField::kVD), PrintDisasm_vsel128),\n  INSTRUCTION(0x100001c4, \"vsl\"         , kVX     , kV, kGeneral, \"Vector Shift Left\"                                                          , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vsl),\n  INSTRUCTION(0x10000104, \"vslb\"        , kVX     , kV, kGeneral, \"Vector Shift Left Integer Byte\"                                             , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vslb),\n  INSTRUCTION(0x1000002c, \"vsldoi\"      , kVA     , kV, kGeneral, \"Vector Shift Left Double by Octet Immediate\"                                , (PPCOpcodeField::kVA,PPCOpcodeField::kVB,PPCOpcodeField::kSHB), (PPCOpcodeField::kVD), PrintDisasm_vsldoi),\n  INSTRUCTION(0x10000010, \"vsldoi128\"   , kVX128_5, kV, kGeneral, \"Vector128 Shift Left Double by Octet Immediate\"                             , (PPCOpcodeField::kVA,PPCOpcodeField::kVB,PPCOpcodeField::kSHB), (PPCOpcodeField::kVD), PrintDisasm_vsldoi128),\n  INSTRUCTION(0x10000144, \"vslh\"        , kVX     , kV, kGeneral, \"Vector Shift Left Integer Half Word\"                                        , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vslh),\n  INSTRUCTION(0x1000040c, \"vslo\"        , kVX     , kV, kGeneral, \"Vector Shift Left by Octet\"                                                 , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vslo),\n  INSTRUCTION(0x14000390, \"vslo128\"     , kVX128  , kV, kGeneral, \"Vector128 Shift Left Octet\"                                                 , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vslo128),\n  INSTRUCTION(0x10000184, \"vslw\"        , kVX     , kV, kGeneral, \"Vector Shift Left Integer Word\"                                             , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vslw),\n  INSTRUCTION(0x180000d0, \"vslw128\"     , kVX128  , kV, kGeneral, \"Vector128 Shift Left Integer Word\"                                          , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vslw128),\n  INSTRUCTION(0x1000020c, \"vspltb\"      , kVX     , kV, kGeneral, \"Vector Splat Byte\"                                                          , (PPCOpcodeField::kVB,PPCOpcodeField::kUIMM), (PPCOpcodeField::kVD), PrintDisasm_vspltb),\n  INSTRUCTION(0x1000024c, \"vsplth\"      , kVX     , kV, kGeneral, \"Vector Splat Half Word\"                                                     , (PPCOpcodeField::kVB,PPCOpcodeField::kUIMM), (PPCOpcodeField::kVD), PrintDisasm_vsplth),\n  INSTRUCTION(0x1000030c, \"vspltisb\"    , kVX     , kV, kGeneral, \"Vector Splat Immediate Signed Byte\"                                         , (PPCOpcodeField::kSIMM), (PPCOpcodeField::kVD), PrintDisasm_vspltisb),\n  INSTRUCTION(0x1000034c, \"vspltish\"    , kVX     , kV, kGeneral, \"Vector Splat Immediate Signed Half Word\"                                    , (PPCOpcodeField::kSIMM), (PPCOpcodeField::kVD), PrintDisasm_vspltish),\n  INSTRUCTION(0x1000038c, \"vspltisw\"    , kVX     , kV, kGeneral, \"Vector Splat Immediate Signed Word\"                                         , (PPCOpcodeField::kSIMM), (PPCOpcodeField::kVD), PrintDisasm_vspltisw),\n  INSTRUCTION(0x18000770, \"vspltisw128\" , kVX128_3, kV, kGeneral, \"Vector128 Splat Immediate Signed Word\"                                      , (PPCOpcodeField::kSIMM), (PPCOpcodeField::kVD), PrintDisasm_vspltisw128),\n  INSTRUCTION(0x1000028c, \"vspltw\"      , kVX     , kV, kGeneral, \"Vector Splat Word\"                                                          , (PPCOpcodeField::kVB,PPCOpcodeField::kUIMM), (PPCOpcodeField::kVD), PrintDisasm_vspltw),\n  INSTRUCTION(0x18000730, \"vspltw128\"   , kVX128_3, kV, kGeneral, \"Vector128 Splat Word\"                                                       , (PPCOpcodeField::kVB,PPCOpcodeField::kUIMM), (PPCOpcodeField::kVD), PrintDisasm_vspltw128),\n  INSTRUCTION(0x100002c4, \"vsr\"         , kVX     , kV, kGeneral, \"Vector Shift Right\"                                                         , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vsr),\n  INSTRUCTION(0x10000304, \"vsrab\"       , kVX     , kV, kGeneral, \"Vector Shift Right Algebraic Byte\"                                          , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vsrab),\n  INSTRUCTION(0x10000344, \"vsrah\"       , kVX     , kV, kGeneral, \"Vector Shift Right Algebraic Half Word\"                                     , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vsrah),\n  INSTRUCTION(0x10000384, \"vsraw\"       , kVX     , kV, kGeneral, \"Vector Shift Right Algebraic Word\"                                          , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vsraw),\n  INSTRUCTION(0x18000150, \"vsraw128\"    , kVX128  , kV, kGeneral, \"Vector128 Shift Right Arithmetic Word\"                                      , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vsraw128),\n  INSTRUCTION(0x10000204, \"vsrb\"        , kVX     , kV, kGeneral, \"Vector Shift Right Byte\"                                                    , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vsrb),\n  INSTRUCTION(0x10000244, \"vsrh\"        , kVX     , kV, kGeneral, \"Vector Shift Right Half Word\"                                               , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vsrh),\n  INSTRUCTION(0x1000044c, \"vsro\"        , kVX     , kV, kGeneral, \"Vector Shift Right Octet\"                                                   , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vsro),\n  INSTRUCTION(0x140003d0, \"vsro128\"     , kVX128  , kV, kGeneral, \"Vector128 Shift Right Octet\"                                                , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vsro128),\n  INSTRUCTION(0x10000284, \"vsrw\"        , kVX     , kV, kGeneral, \"Vector Shift Right Word\"                                                    , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vsrw),\n  INSTRUCTION(0x180001d0, \"vsrw128\"     , kVX128  , kV, kGeneral, \"Vector128 Shift Right Word\"                                                 , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vsrw128),\n  INSTRUCTION(0x10000580, \"vsubcuw\"     , kVX     , kV, kGeneral, \"Vector Subtract Carryout Unsigned Word\"                                     , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vsubcuw),\n  INSTRUCTION(0x1000004a, \"vsubfp\"      , kVX     , kV, kGeneral, \"Vector Subtract Floating Point\"                                             , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vsubfp),\n  INSTRUCTION(0x14000050, \"vsubfp128\"   , kVX128  , kV, kGeneral, \"Vector128 Subtract Floating Point\"                                          , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vsubfp128),\n  INSTRUCTION(0x10000700, \"vsubsbs\"     , kVX     , kV, kGeneral, \"Vector Subtract Signed Byte Saturate\"                                       , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD,PPCOpcodeField::kVSCR), PrintDisasm_vsubsbs),\n  INSTRUCTION(0x10000740, \"vsubshs\"     , kVX     , kV, kGeneral, \"Vector Subtract Signed Half Word Saturate\"                                  , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD,PPCOpcodeField::kVSCR), PrintDisasm_vsubshs),\n  INSTRUCTION(0x10000780, \"vsubsws\"     , kVX     , kV, kGeneral, \"Vector Subtract Signed Word Saturate\"                                       , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD,PPCOpcodeField::kVSCR), PrintDisasm_vsubsws),\n  INSTRUCTION(0x10000400, \"vsububm\"     , kVX     , kV, kGeneral, \"Vector Subtract Unsigned Byte Modulo\"                                       , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vsububm),\n  INSTRUCTION(0x10000600, \"vsububs\"     , kVX     , kV, kGeneral, \"Vector Subtract Unsigned Byte Saturate\"                                     , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD,PPCOpcodeField::kVSCR), PrintDisasm_vsububs),\n  INSTRUCTION(0x10000440, \"vsubuhm\"     , kVX     , kV, kGeneral, \"Vector Subtract Unsigned Half Word Modulo\"                                  , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vsubuhm),\n  INSTRUCTION(0x10000640, \"vsubuhs\"     , kVX     , kV, kGeneral, \"Vector Subtract Unsigned Half Word Saturate\"                                , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD,PPCOpcodeField::kVSCR), PrintDisasm_vsubuhs),\n  INSTRUCTION(0x10000480, \"vsubuwm\"     , kVX     , kV, kGeneral, \"Vector Subtract Unsigned Word Modulo\"                                       , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vsubuwm),\n  INSTRUCTION(0x10000680, \"vsubuws\"     , kVX     , kV, kGeneral, \"Vector Subtract Unsigned Word Saturate\"                                     , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD,PPCOpcodeField::kVSCR), PrintDisasm_vsubuws),\n  INSTRUCTION(0x10000688, \"vsum2sws\"    , kVX     , kV, kGeneral, \"Vector Sum Across Partial (1/2) Signed Word Saturate\"                       , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD,PPCOpcodeField::kVSCR), PrintDisasm_vsum2sws),\n  INSTRUCTION(0x10000708, \"vsum4sbs\"    , kVX     , kV, kGeneral, \"Vector Sum Across Partial (1/4) Signed Byte Saturate\"                       , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD,PPCOpcodeField::kVSCR), PrintDisasm_vsum4sbs),\n  INSTRUCTION(0x10000648, \"vsum4shs\"    , kVX     , kV, kGeneral, \"Vector Sum Across Partial (1/4) Signed Half Word Saturate\"                  , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD,PPCOpcodeField::kVSCR), PrintDisasm_vsum4shs),\n  INSTRUCTION(0x10000608, \"vsum4ubs\"    , kVX     , kV, kGeneral, \"Vector Sum Across Partial (1/4) Unsigned Byte Saturate\"                     , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD,PPCOpcodeField::kVSCR), PrintDisasm_vsum4ubs),\n  INSTRUCTION(0x10000788, \"vsumsws\"     , kVX     , kV, kGeneral, \"Vector Sum Across Signed Word Saturate\"                                     , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD,PPCOpcodeField::kVSCR), PrintDisasm_vsumsws),\n  INSTRUCTION(0x180007f0, \"vupkd3d128\"  , kVX128_3, kV, kGeneral, \"Vector128 Unpack D3Dtype\"                                                   , (PPCOpcodeField::kVB), (PPCOpcodeField::kVD), nullptr),\n  INSTRUCTION(0x1000034e, \"vupkhpx\"     , kVX     , kV, kGeneral, \"Vector Unpack High Pixel\"                                                   , (PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vupkhpx),\n  INSTRUCTION(0x1000020e, \"vupkhsb\"     , kVX     , kV, kGeneral, \"Vector Unpack High Signed Byte\"                                             , (PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vupkhsb),\n  INSTRUCTION(0x18000380, \"vupkhsb128\"  , kVX128  , kV, kGeneral, \"Vector128 Unpack High Signed Byte\"                                          , (PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vupkhsb128),\n  INSTRUCTION(0x1000024e, \"vupkhsh\"     , kVX     , kV, kGeneral, \"Vector Unpack High Signed Half Word\"                                        , (PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vupkhsh),\n  INSTRUCTION(0x100003ce, \"vupklpx\"     , kVX     , kV, kGeneral, \"Vector Unpack Low Pixel\"                                                    , (PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vupklpx),\n  INSTRUCTION(0x1000028e, \"vupklsb\"     , kVX     , kV, kGeneral, \"Vector Unpack Low Signed Byte\"                                              , (PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vupklsb),\n  INSTRUCTION(0x180003c0, \"vupklsb128\"  , kVX128  , kV, kGeneral, \"Vector128 Unpack Low Signed Byte\"                                           , (PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vupklsb128),\n  INSTRUCTION(0x100002ce, \"vupklsh\"     , kVX     , kV, kGeneral, \"Vector Unpack Low Signed Half Word\"                                         , (PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vupklsh),\n  INSTRUCTION(0x100004c4, \"vxor\"        , kVX     , kV, kGeneral, \"Vector Logical XOR\"                                                         , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vxor),\n  INSTRUCTION(0x14000310, \"vxor128\"     , kVX128  , kV, kGeneral, \"Vector128 Logical XOR\"                                                      , (PPCOpcodeField::kVA,PPCOpcodeField::kVB), (PPCOpcodeField::kVD), PrintDisasm_vxor128),\n  INSTRUCTION(0x68000000, \"xori\"        , kD      , kI, kGeneral, \"XOR Immediate\"                                                              , (PPCOpcodeField::kRS,PPCOpcodeField::kUIMM), (PPCOpcodeField::kRA), PrintDisasm_xori),\n  INSTRUCTION(0x6c000000, \"xoris\"       , kD      , kI, kGeneral, \"XOR Immediate Shifted\"                                                      , (PPCOpcodeField::kRS,PPCOpcodeField::kUIMM), (PPCOpcodeField::kRA), PrintDisasm_xoris),\n  INSTRUCTION(0x7c000278, \"xorx\"        , kX      , kI, kGeneral, \"XOR\"                                                                        , (PPCOpcodeField::kRS,PPCOpcodeField::kRB), (PPCOpcodeField::kRA,PPCOpcodeField::kCRcond), PrintDisasm_xorx),\n};\nstatic_assert(sizeof(ppc_opcode_disasm_table) / sizeof(PPCOpcodeDisasmInfo) == static_cast<int>(PPCOpcode::kInvalid), \"PPC table mismatch - rerun ppc-table-gen\");\n\nconst PPCOpcodeDisasmInfo& GetOpcodeDisasmInfo(PPCOpcode opcode) {\n  return ppc_opcode_disasm_table[static_cast<int>(opcode)];\n}\nvoid RegisterOpcodeDisasm(PPCOpcode opcode, InstrDisasmFn fn) {\n  assert_null(ppc_opcode_disasm_table[static_cast<int>(opcode)].disasm);\n  ppc_opcode_disasm_table[static_cast<int>(opcode)].disasm = fn;\n}\n\n}  // namespace ppc\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/ppc/ppc_opcode_info.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2015 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/ppc/ppc_opcode_info.h\"\n\n#include \"xenia/cpu/ppc/ppc_decode_data.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace ppc {\n\nbool DisasmPPC(uint32_t address, uint32_t code, StringBuffer* str) {\n  auto opcode = LookupOpcode(code);\n  if (opcode == PPCOpcode::kInvalid) {\n    str->Append(\"DISASM ERROR\");\n    return false;\n  }\n  auto& disasm_info = GetOpcodeDisasmInfo(opcode);\n  if (disasm_info.disasm) {\n    PPCDecodeData d;\n    d.address = address;\n    d.code = code;\n    disasm_info.disasm(d, str);\n  } else {\n    str->AppendFormat(\"{:<8}\", disasm_info.name);\n  }\n  return true;\n}\n\n}  // namespace ppc\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/ppc/ppc_opcode_info.h",
    "content": "﻿/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2015 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_PPC_PPC_OPCODE_INFO_H_\n#define XENIA_CPU_PPC_PPC_OPCODE_INFO_H_\n\n#include <cstdint>\n\n#include \"xenia/base/string_buffer.h\"\n#include \"xenia/cpu/ppc/ppc_opcode.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace ppc {\n\nstruct InstrData;\nclass PPCHIRBuilder;\n\nenum class PPCOpcodeFormat {\n  kSC,\n  kD,\n  kDS,\n  kB,\n  kI,\n  kX,\n  kXL,\n  kXFX,\n  kXFL,\n  kXS,\n  kXO,\n  kA,\n  kM,\n  kMD,\n  kMDS,\n  kDCBZ,\n  kVX,\n  kVC,\n  kVA,\n  kVX128,\n  kVX128_1,\n  kVX128_2,\n  kVX128_3,\n  kVX128_4,\n  kVX128_5,\n  kVX128_R,\n  kVX128_P,\n};\n\nenum class PPCOpcodeGroup {\n  kB,  // Branching/traps/etc.\n  kC,  // Control.\n  kM,  // Memory load/store (of all types).\n  kI,  // Integer.\n  kF,  // Floating-point.\n  kV,  // VMX.\n};\n\nenum class PPCOpcodeType {\n  kGeneral,\n  kSync,\n};\n\ntypedef int (*InstrEmitFn)(PPCHIRBuilder& f, const InstrData& i);\n\nstruct PPCOpcodeInfo {\n  PPCOpcodeGroup group;\n  PPCOpcodeType type;\n  InstrEmitFn emit;\n};\n\nstruct PPCDecodeData;\ntypedef void (*InstrDisasmFn)(const PPCDecodeData& d, StringBuffer* str);\n\nenum class PPCOpcodeField : uint32_t {\n  kRA,\n  kRA0,  // 0 if RA==0 else RA\n  kRB,\n  kRD,\n  kRS,  // alias for RD\n  kOE,\n  kOEcond,  // iff OE=1\n  kCR,\n  kCRcond,  // iff Rc=1\n  kCA,\n  kCRM,\n  kIMM,\n  kSIMM,\n  kUIMM,\n  kd,  // displacement\n  kds,\n  kLR,\n  kLRcond,\n  kADDR,\n  kBI,\n  kBO,\n  kCTR,\n  kCTRcond,\n  kL,\n  kLK,\n  kAA,\n  kCRFD,\n  kCRFS,\n  kCRBA,\n  kCRBB,\n  kCRBD,\n  kFPSCR,\n  kFPSCRD,\n  kMSR,\n  kSPR,\n  kVSCR,\n  kTBR,\n  kFM,\n  kFA,\n  kFB,\n  kFC,\n  kFD,\n  kFS,\n  kVA,\n  kVB,\n  kVC,\n  kVD,\n  kVS,\n  kSH,\n  kSHB,\n  kME,\n  kMB,\n  kTO,\n  kLEV,\n};\n\nstruct PPCOpcodeDisasmInfo {\n  PPCOpcodeGroup group;\n  PPCOpcodeFormat format;\n  uint32_t opcode;\n  const char* name;\n  const char* description;\n  std::vector<PPCOpcodeField> reads;\n  std::vector<PPCOpcodeField> writes;\n  InstrDisasmFn disasm;\n};\n\nPPCOpcode LookupOpcode(uint32_t code);\n\nconst PPCOpcodeInfo& GetOpcodeInfo(PPCOpcode opcode);\nconst PPCOpcodeDisasmInfo& GetOpcodeDisasmInfo(PPCOpcode opcode);\n\nvoid RegisterOpcodeEmitter(PPCOpcode opcode, InstrEmitFn fn);\nvoid RegisterOpcodeDisasm(PPCOpcode opcode, InstrDisasmFn fn);\n\ninline const PPCOpcodeInfo& LookupOpcodeInfo(uint32_t code) {\n  return GetOpcodeInfo(LookupOpcode(code));\n}\n\nbool DisasmPPC(uint32_t address, uint32_t code, StringBuffer* str);\n\n}  // namespace ppc\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_PPC_PPC_OPCODE_INFO_H_\n"
  },
  {
    "path": "src/xenia/cpu/ppc/ppc_opcode_lookup_gen.cc",
    "content": "// This code was autogenerated by ./tools/ppc-table-gen. Do not modify!\n// clang-format off\n#include <cstdint>\n#include <cstdlib>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/cpu/ppc/ppc_opcode.h\"\n#include \"xenia/cpu/ppc/ppc_opcode_info.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace ppc {\n\nconstexpr uint32_t ExtractBits(uint32_t v, uint32_t a, uint32_t b) {\n  return (v >> (32 - 1 - b)) & ((1 << (b - a + 1)) - 1);\n}\n\n#define PPC_DECODER_MISS assert_always(); return PPCOpcode::kInvalid\n#define PPC_DECODER_HIT(name) return PPCOpcode::name;\n\nPPCOpcode LookupOpcode(uint32_t code) {\n  switch (ExtractBits(code, 0, 5)) {\n  case 2: PPC_DECODER_HIT(tdi);\n  case 3: PPC_DECODER_HIT(twi);\n  case 4:\n    switch ((ExtractBits(code, 21, 27) << 4)|(ExtractBits(code, 30, 31) << 0)) {\n      case 0b00000000011: PPC_DECODER_HIT(lvsl128);\n      case 0b00001000011: PPC_DECODER_HIT(lvsr128);\n      case 0b00010000011: PPC_DECODER_HIT(lvewx128);\n      case 0b00011000011: PPC_DECODER_HIT(lvx128);\n      case 0b00110000011: PPC_DECODER_HIT(stvewx128);\n      case 0b00111000011: PPC_DECODER_HIT(stvx128);\n      case 0b01011000011: PPC_DECODER_HIT(lvxl128);\n      case 0b01111000011: PPC_DECODER_HIT(stvxl128);\n      case 0b10000000011: PPC_DECODER_HIT(lvlx128);\n      case 0b10001000011: PPC_DECODER_HIT(lvrx128);\n      case 0b10100000011: PPC_DECODER_HIT(stvlx128);\n      case 0b10101000011: PPC_DECODER_HIT(stvrx128);\n      case 0b11000000011: PPC_DECODER_HIT(lvlxl128);\n      case 0b11001000011: PPC_DECODER_HIT(lvrxl128);\n      case 0b11100000011: PPC_DECODER_HIT(stvlxl128);\n      case 0b11101000011: PPC_DECODER_HIT(stvrxl128);\n    }\n    switch ((ExtractBits(code, 21, 31) << 0)) {\n      case 0b00000000000: PPC_DECODER_HIT(vaddubm);\n      case 0b00000000010: PPC_DECODER_HIT(vmaxub);\n      case 0b00000000100: PPC_DECODER_HIT(vrlb);\n      case 0b00000001000: PPC_DECODER_HIT(vmuloub);\n      case 0b00000001010: PPC_DECODER_HIT(vaddfp);\n      case 0b00000001100: PPC_DECODER_HIT(vmrghb);\n      case 0b00000001110: PPC_DECODER_HIT(vpkuhum);\n      case 0b00001000000: PPC_DECODER_HIT(vadduhm);\n      case 0b00001000010: PPC_DECODER_HIT(vmaxuh);\n      case 0b00001000100: PPC_DECODER_HIT(vrlh);\n      case 0b00001001000: PPC_DECODER_HIT(vmulouh);\n      case 0b00001001010: PPC_DECODER_HIT(vsubfp);\n      case 0b00001001100: PPC_DECODER_HIT(vmrghh);\n      case 0b00001001110: PPC_DECODER_HIT(vpkuwum);\n      case 0b00010000000: PPC_DECODER_HIT(vadduwm);\n      case 0b00010000010: PPC_DECODER_HIT(vmaxuw);\n      case 0b00010000100: PPC_DECODER_HIT(vrlw);\n      case 0b00010001100: PPC_DECODER_HIT(vmrghw);\n      case 0b00010001110: PPC_DECODER_HIT(vpkuhus);\n      case 0b00011001110: PPC_DECODER_HIT(vpkuwus);\n      case 0b00100000010: PPC_DECODER_HIT(vmaxsb);\n      case 0b00100000100: PPC_DECODER_HIT(vslb);\n      case 0b00100001000: PPC_DECODER_HIT(vmulosb);\n      case 0b00100001010: PPC_DECODER_HIT(vrefp);\n      case 0b00100001100: PPC_DECODER_HIT(vmrglb);\n      case 0b00100001110: PPC_DECODER_HIT(vpkshus);\n      case 0b00101000010: PPC_DECODER_HIT(vmaxsh);\n      case 0b00101000100: PPC_DECODER_HIT(vslh);\n      case 0b00101001000: PPC_DECODER_HIT(vmulosh);\n      case 0b00101001010: PPC_DECODER_HIT(vrsqrtefp);\n      case 0b00101001100: PPC_DECODER_HIT(vmrglh);\n      case 0b00101001110: PPC_DECODER_HIT(vpkswus);\n      case 0b00110000000: PPC_DECODER_HIT(vaddcuw);\n      case 0b00110000010: PPC_DECODER_HIT(vmaxsw);\n      case 0b00110000100: PPC_DECODER_HIT(vslw);\n      case 0b00110001010: PPC_DECODER_HIT(vexptefp);\n      case 0b00110001100: PPC_DECODER_HIT(vmrglw);\n      case 0b00110001110: PPC_DECODER_HIT(vpkshss);\n      case 0b00111000100: PPC_DECODER_HIT(vsl);\n      case 0b00111001010: PPC_DECODER_HIT(vlogefp);\n      case 0b00111001110: PPC_DECODER_HIT(vpkswss);\n      case 0b01000000000: PPC_DECODER_HIT(vaddubs);\n      case 0b01000000010: PPC_DECODER_HIT(vminub);\n      case 0b01000000100: PPC_DECODER_HIT(vsrb);\n      case 0b01000001000: PPC_DECODER_HIT(vmuleub);\n      case 0b01000001010: PPC_DECODER_HIT(vrfin);\n      case 0b01000001100: PPC_DECODER_HIT(vspltb);\n      case 0b01000001110: PPC_DECODER_HIT(vupkhsb);\n      case 0b01001000000: PPC_DECODER_HIT(vadduhs);\n      case 0b01001000010: PPC_DECODER_HIT(vminuh);\n      case 0b01001000100: PPC_DECODER_HIT(vsrh);\n      case 0b01001001000: PPC_DECODER_HIT(vmuleuh);\n      case 0b01001001010: PPC_DECODER_HIT(vrfiz);\n      case 0b01001001100: PPC_DECODER_HIT(vsplth);\n      case 0b01001001110: PPC_DECODER_HIT(vupkhsh);\n      case 0b01010000000: PPC_DECODER_HIT(vadduws);\n      case 0b01010000010: PPC_DECODER_HIT(vminuw);\n      case 0b01010000100: PPC_DECODER_HIT(vsrw);\n      case 0b01010001010: PPC_DECODER_HIT(vrfip);\n      case 0b01010001100: PPC_DECODER_HIT(vspltw);\n      case 0b01010001110: PPC_DECODER_HIT(vupklsb);\n      case 0b01011000100: PPC_DECODER_HIT(vsr);\n      case 0b01011001010: PPC_DECODER_HIT(vrfim);\n      case 0b01011001110: PPC_DECODER_HIT(vupklsh);\n      case 0b01100000000: PPC_DECODER_HIT(vaddsbs);\n      case 0b01100000010: PPC_DECODER_HIT(vminsb);\n      case 0b01100000100: PPC_DECODER_HIT(vsrab);\n      case 0b01100001000: PPC_DECODER_HIT(vmulesb);\n      case 0b01100001010: PPC_DECODER_HIT(vcfux);\n      case 0b01100001100: PPC_DECODER_HIT(vspltisb);\n      case 0b01100001110: PPC_DECODER_HIT(vpkpx);\n      case 0b01101000000: PPC_DECODER_HIT(vaddshs);\n      case 0b01101000010: PPC_DECODER_HIT(vminsh);\n      case 0b01101000100: PPC_DECODER_HIT(vsrah);\n      case 0b01101001000: PPC_DECODER_HIT(vmulesh);\n      case 0b01101001010: PPC_DECODER_HIT(vcfsx);\n      case 0b01101001100: PPC_DECODER_HIT(vspltish);\n      case 0b01101001110: PPC_DECODER_HIT(vupkhpx);\n      case 0b01110000000: PPC_DECODER_HIT(vaddsws);\n      case 0b01110000010: PPC_DECODER_HIT(vminsw);\n      case 0b01110000100: PPC_DECODER_HIT(vsraw);\n      case 0b01110001010: PPC_DECODER_HIT(vctuxs);\n      case 0b01110001100: PPC_DECODER_HIT(vspltisw);\n      case 0b01111001010: PPC_DECODER_HIT(vctsxs);\n      case 0b01111001110: PPC_DECODER_HIT(vupklpx);\n      case 0b10000000000: PPC_DECODER_HIT(vsububm);\n      case 0b10000000010: PPC_DECODER_HIT(vavgub);\n      case 0b10000000100: PPC_DECODER_HIT(vand);\n      case 0b10000001010: PPC_DECODER_HIT(vmaxfp);\n      case 0b10000001100: PPC_DECODER_HIT(vslo);\n      case 0b10001000000: PPC_DECODER_HIT(vsubuhm);\n      case 0b10001000010: PPC_DECODER_HIT(vavguh);\n      case 0b10001000100: PPC_DECODER_HIT(vandc);\n      case 0b10001001010: PPC_DECODER_HIT(vminfp);\n      case 0b10001001100: PPC_DECODER_HIT(vsro);\n      case 0b10010000000: PPC_DECODER_HIT(vsubuwm);\n      case 0b10010000010: PPC_DECODER_HIT(vavguw);\n      case 0b10010000100: PPC_DECODER_HIT(vor);\n      case 0b10011000100: PPC_DECODER_HIT(vxor);\n      case 0b10100000010: PPC_DECODER_HIT(vavgsb);\n      case 0b10100000100: PPC_DECODER_HIT(vnor);\n      case 0b10101000010: PPC_DECODER_HIT(vavgsh);\n      case 0b10110000000: PPC_DECODER_HIT(vsubcuw);\n      case 0b10110000010: PPC_DECODER_HIT(vavgsw);\n      case 0b11000000000: PPC_DECODER_HIT(vsububs);\n      case 0b11000000100: PPC_DECODER_HIT(mfvscr);\n      case 0b11000001000: PPC_DECODER_HIT(vsum4ubs);\n      case 0b11001000000: PPC_DECODER_HIT(vsubuhs);\n      case 0b11001000100: PPC_DECODER_HIT(mtvscr);\n      case 0b11001001000: PPC_DECODER_HIT(vsum4shs);\n      case 0b11010000000: PPC_DECODER_HIT(vsubuws);\n      case 0b11010001000: PPC_DECODER_HIT(vsum2sws);\n      case 0b11100000000: PPC_DECODER_HIT(vsubsbs);\n      case 0b11100001000: PPC_DECODER_HIT(vsum4sbs);\n      case 0b11101000000: PPC_DECODER_HIT(vsubshs);\n      case 0b11110000000: PPC_DECODER_HIT(vsubsws);\n      case 0b11110001000: PPC_DECODER_HIT(vsumsws);\n    }\n    switch ((ExtractBits(code, 22, 31) << 0)) {\n      case 0b0000000110: PPC_DECODER_HIT(vcmpequb);\n      case 0b0001000110: PPC_DECODER_HIT(vcmpequh);\n      case 0b0010000110: PPC_DECODER_HIT(vcmpequw);\n      case 0b0011000110: PPC_DECODER_HIT(vcmpeqfp);\n      case 0b0111000110: PPC_DECODER_HIT(vcmpgefp);\n      case 0b1000000110: PPC_DECODER_HIT(vcmpgtub);\n      case 0b1001000110: PPC_DECODER_HIT(vcmpgtuh);\n      case 0b1010000110: PPC_DECODER_HIT(vcmpgtuw);\n      case 0b1011000110: PPC_DECODER_HIT(vcmpgtfp);\n      case 0b1100000110: PPC_DECODER_HIT(vcmpgtsb);\n      case 0b1101000110: PPC_DECODER_HIT(vcmpgtsh);\n      case 0b1110000110: PPC_DECODER_HIT(vcmpgtsw);\n      case 0b1111000110: PPC_DECODER_HIT(vcmpbfp);\n    }\n    switch ((ExtractBits(code, 26, 31) << 0)) {\n      case 0b100000: PPC_DECODER_HIT(vmhaddshs);\n      case 0b100001: PPC_DECODER_HIT(vmhraddshs);\n      case 0b100010: PPC_DECODER_HIT(vmladduhm);\n      case 0b100100: PPC_DECODER_HIT(vmsumubm);\n      case 0b100101: PPC_DECODER_HIT(vmsummbm);\n      case 0b100110: PPC_DECODER_HIT(vmsumuhm);\n      case 0b100111: PPC_DECODER_HIT(vmsumuhs);\n      case 0b101000: PPC_DECODER_HIT(vmsumshm);\n      case 0b101001: PPC_DECODER_HIT(vmsumshs);\n      case 0b101010: PPC_DECODER_HIT(vsel);\n      case 0b101011: PPC_DECODER_HIT(vperm);\n      case 0b101100: PPC_DECODER_HIT(vsldoi);\n      case 0b101110: PPC_DECODER_HIT(vmaddfp);\n      case 0b101111: PPC_DECODER_HIT(vnmsubfp);\n    }\n    switch ((ExtractBits(code, 27, 27) << 0)) {\n      case 0b1: PPC_DECODER_HIT(vsldoi128);\n    }\n    PPC_DECODER_MISS;\n  case 5:\n    switch ((ExtractBits(code, 22, 22) << 5)|(ExtractBits(code, 27, 27) << 0)) {\n      case 0b000000: PPC_DECODER_HIT(vperm128);\n    }\n    switch ((ExtractBits(code, 22, 25) << 2)|(ExtractBits(code, 27, 27) << 0)) {\n      case 0b000001: PPC_DECODER_HIT(vaddfp128);\n      case 0b000101: PPC_DECODER_HIT(vsubfp128);\n      case 0b001001: PPC_DECODER_HIT(vmulfp128);\n      case 0b001101: PPC_DECODER_HIT(vmaddfp128);\n      case 0b010001: PPC_DECODER_HIT(vmaddcfp128);\n      case 0b010101: PPC_DECODER_HIT(vnmsubfp128);\n      case 0b011001: PPC_DECODER_HIT(vmsum3fp128);\n      case 0b011101: PPC_DECODER_HIT(vmsum4fp128);\n      case 0b100000: PPC_DECODER_HIT(vpkshss128);\n      case 0b100001: PPC_DECODER_HIT(vand128);\n      case 0b100100: PPC_DECODER_HIT(vpkshus128);\n      case 0b100101: PPC_DECODER_HIT(vandc128);\n      case 0b101000: PPC_DECODER_HIT(vpkswss128);\n      case 0b101001: PPC_DECODER_HIT(vnor128);\n      case 0b101100: PPC_DECODER_HIT(vpkswus128);\n      case 0b101101: PPC_DECODER_HIT(vor128);\n      case 0b110000: PPC_DECODER_HIT(vpkuhum128);\n      case 0b110001: PPC_DECODER_HIT(vxor128);\n      case 0b110100: PPC_DECODER_HIT(vpkuhus128);\n      case 0b110101: PPC_DECODER_HIT(vsel128);\n      case 0b111000: PPC_DECODER_HIT(vpkuwum128);\n      case 0b111001: PPC_DECODER_HIT(vslo128);\n      case 0b111100: PPC_DECODER_HIT(vpkuwus128);\n      case 0b111101: PPC_DECODER_HIT(vsro128);\n    }\n    PPC_DECODER_MISS;\n  case 6:\n    switch ((ExtractBits(code, 21, 22) << 5)|(ExtractBits(code, 26, 27) << 0)) {\n      case 0b0100001: PPC_DECODER_HIT(vpermwi128);\n    }\n    switch ((ExtractBits(code, 21, 23) << 4)|(ExtractBits(code, 26, 27) << 0)) {\n      case 0b1100001: PPC_DECODER_HIT(vpkd3d128);\n      case 0b1110001: PPC_DECODER_HIT(vrlimi128);\n    }\n    switch ((ExtractBits(code, 21, 27) << 0)) {\n      case 0b0100011: PPC_DECODER_HIT(vcfpsxws128);\n      case 0b0100111: PPC_DECODER_HIT(vcfpuxws128);\n      case 0b0101011: PPC_DECODER_HIT(vcsxwfp128);\n      case 0b0101111: PPC_DECODER_HIT(vcuxwfp128);\n      case 0b0110011: PPC_DECODER_HIT(vrfim128);\n      case 0b0110111: PPC_DECODER_HIT(vrfin128);\n      case 0b0111011: PPC_DECODER_HIT(vrfip128);\n      case 0b0111111: PPC_DECODER_HIT(vrfiz128);\n      case 0b1100011: PPC_DECODER_HIT(vrefp128);\n      case 0b1100111: PPC_DECODER_HIT(vrsqrtefp128);\n      case 0b1101011: PPC_DECODER_HIT(vexptefp128);\n      case 0b1101111: PPC_DECODER_HIT(vlogefp128);\n      case 0b1110011: PPC_DECODER_HIT(vspltw128);\n      case 0b1110111: PPC_DECODER_HIT(vspltisw128);\n      case 0b1111111: PPC_DECODER_HIT(vupkd3d128);\n    }\n    switch ((ExtractBits(code, 22, 24) << 3)|(ExtractBits(code, 27, 27) << 0)) {\n      case 0b000000: PPC_DECODER_HIT(vcmpeqfp128);\n      case 0b001000: PPC_DECODER_HIT(vcmpgefp128);\n      case 0b010000: PPC_DECODER_HIT(vcmpgtfp128);\n      case 0b011000: PPC_DECODER_HIT(vcmpbfp128);\n      case 0b100000: PPC_DECODER_HIT(vcmpequw128);\n    }\n    switch ((ExtractBits(code, 22, 25) << 2)|(ExtractBits(code, 27, 27) << 0)) {\n      case 0b000101: PPC_DECODER_HIT(vrlw128);\n      case 0b001101: PPC_DECODER_HIT(vslw128);\n      case 0b010101: PPC_DECODER_HIT(vsraw128);\n      case 0b011101: PPC_DECODER_HIT(vsrw128);\n      case 0b101000: PPC_DECODER_HIT(vmaxfp128);\n      case 0b101100: PPC_DECODER_HIT(vminfp128);\n      case 0b110000: PPC_DECODER_HIT(vmrghw128);\n      case 0b110100: PPC_DECODER_HIT(vmrglw128);\n      case 0b111000: PPC_DECODER_HIT(vupkhsb128);\n      case 0b111100: PPC_DECODER_HIT(vupklsb128);\n    }\n    PPC_DECODER_MISS;\n  case 7: PPC_DECODER_HIT(mulli);\n  case 8: PPC_DECODER_HIT(subficx);\n  case 10: PPC_DECODER_HIT(cmpli);\n  case 11: PPC_DECODER_HIT(cmpi);\n  case 12: PPC_DECODER_HIT(addic);\n  case 13: PPC_DECODER_HIT(addicx);\n  case 14: PPC_DECODER_HIT(addi);\n  case 15: PPC_DECODER_HIT(addis);\n  case 16: PPC_DECODER_HIT(bcx);\n  case 17: PPC_DECODER_HIT(sc);\n  case 18: PPC_DECODER_HIT(bx);\n  case 19:\n    switch ((ExtractBits(code, 21, 30) << 0)) {\n      case 0b0000000000: PPC_DECODER_HIT(mcrf);\n      case 0b0000010000: PPC_DECODER_HIT(bclrx);\n      case 0b0000100001: PPC_DECODER_HIT(crnor);\n      case 0b0010000001: PPC_DECODER_HIT(crandc);\n      case 0b0010010110: PPC_DECODER_HIT(isync);\n      case 0b0011000001: PPC_DECODER_HIT(crxor);\n      case 0b0011100001: PPC_DECODER_HIT(crnand);\n      case 0b0100000001: PPC_DECODER_HIT(crand);\n      case 0b0100100001: PPC_DECODER_HIT(creqv);\n      case 0b0110100001: PPC_DECODER_HIT(crorc);\n      case 0b0111000001: PPC_DECODER_HIT(cror);\n      case 0b1000010000: PPC_DECODER_HIT(bcctrx);\n    }\n    PPC_DECODER_MISS;\n  case 20: PPC_DECODER_HIT(rlwimix);\n  case 21: PPC_DECODER_HIT(rlwinmx);\n  case 23: PPC_DECODER_HIT(rlwnmx);\n  case 24: PPC_DECODER_HIT(ori);\n  case 25: PPC_DECODER_HIT(oris);\n  case 26: PPC_DECODER_HIT(xori);\n  case 27: PPC_DECODER_HIT(xoris);\n  case 28: PPC_DECODER_HIT(andix);\n  case 29: PPC_DECODER_HIT(andisx);\n  case 30:\n    switch ((ExtractBits(code, 27, 29) << 0)) {\n      case 0b000: PPC_DECODER_HIT(rldiclx);\n      case 0b001: PPC_DECODER_HIT(rldicrx);\n      case 0b010: PPC_DECODER_HIT(rldicx);\n      case 0b011: PPC_DECODER_HIT(rldimix);\n    }\n    switch ((ExtractBits(code, 27, 30) << 0)) {\n      case 0b1000: PPC_DECODER_HIT(rldclx);\n      case 0b1001: PPC_DECODER_HIT(rldcrx);\n    }\n    PPC_DECODER_MISS;\n  case 31:\n    switch ((ExtractBits(code, 21, 29) << 0)) {\n      case 0b110011101: PPC_DECODER_HIT(sradix);\n    }\n    switch ((ExtractBits(code, 21, 30) << 0)) {\n      case 0b0000000000: PPC_DECODER_HIT(cmp);\n      case 0b0000000100: PPC_DECODER_HIT(tw);\n      case 0b0000000110: PPC_DECODER_HIT(lvsl);\n      case 0b0000000111: PPC_DECODER_HIT(lvebx);\n      case 0b0000010011: PPC_DECODER_HIT(mfcr);\n      case 0b0000010100: PPC_DECODER_HIT(lwarx);\n      case 0b0000010101: PPC_DECODER_HIT(ldx);\n      case 0b0000010111: PPC_DECODER_HIT(lwzx);\n      case 0b0000011000: PPC_DECODER_HIT(slwx);\n      case 0b0000011010: PPC_DECODER_HIT(cntlzwx);\n      case 0b0000011011: PPC_DECODER_HIT(sldx);\n      case 0b0000011100: PPC_DECODER_HIT(andx);\n      case 0b0000100000: PPC_DECODER_HIT(cmpl);\n      case 0b0000100110: PPC_DECODER_HIT(lvsr);\n      case 0b0000100111: PPC_DECODER_HIT(lvehx);\n      case 0b0000110101: PPC_DECODER_HIT(ldux);\n      case 0b0000110110: PPC_DECODER_HIT(dcbst);\n      case 0b0000110111: PPC_DECODER_HIT(lwzux);\n      case 0b0000111010: PPC_DECODER_HIT(cntlzdx);\n      case 0b0000111100: PPC_DECODER_HIT(andcx);\n      case 0b0001000100: PPC_DECODER_HIT(td);\n      case 0b0001000111: PPC_DECODER_HIT(lvewx);\n      case 0b0001010011: PPC_DECODER_HIT(mfmsr);\n      case 0b0001010100: PPC_DECODER_HIT(ldarx);\n      case 0b0001010110: PPC_DECODER_HIT(dcbf);\n      case 0b0001010111: PPC_DECODER_HIT(lbzx);\n      case 0b0001100111: PPC_DECODER_HIT(lvx);\n      case 0b0001110111: PPC_DECODER_HIT(lbzux);\n      case 0b0001111100: PPC_DECODER_HIT(norx);\n      case 0b0010000111: PPC_DECODER_HIT(stvebx);\n      case 0b0010010000: PPC_DECODER_HIT(mtcrf);\n      case 0b0010010010: PPC_DECODER_HIT(mtmsr);\n      case 0b0010010101: PPC_DECODER_HIT(stdx);\n      case 0b0010010110: PPC_DECODER_HIT(stwcx);\n      case 0b0010010111: PPC_DECODER_HIT(stwx);\n      case 0b0010100111: PPC_DECODER_HIT(stvehx);\n      case 0b0010110010: PPC_DECODER_HIT(mtmsrd);\n      case 0b0010110101: PPC_DECODER_HIT(stdux);\n      case 0b0010110111: PPC_DECODER_HIT(stwux);\n      case 0b0011000111: PPC_DECODER_HIT(stvewx);\n      case 0b0011010110: PPC_DECODER_HIT(stdcx);\n      case 0b0011010111: PPC_DECODER_HIT(stbx);\n      case 0b0011100111: PPC_DECODER_HIT(stvx);\n      case 0b0011110110: PPC_DECODER_HIT(dcbtst);\n      case 0b0011110111: PPC_DECODER_HIT(stbux);\n      case 0b0100010110: PPC_DECODER_HIT(dcbt);\n      case 0b0100010111: PPC_DECODER_HIT(lhzx);\n      case 0b0100011100: PPC_DECODER_HIT(eqvx);\n      case 0b0100110111: PPC_DECODER_HIT(lhzux);\n      case 0b0100111100: PPC_DECODER_HIT(xorx);\n      case 0b0101010011: PPC_DECODER_HIT(mfspr);\n      case 0b0101010101: PPC_DECODER_HIT(lwax);\n      case 0b0101010111: PPC_DECODER_HIT(lhax);\n      case 0b0101100111: PPC_DECODER_HIT(lvxl);\n      case 0b0101110011: PPC_DECODER_HIT(mftb);\n      case 0b0101110101: PPC_DECODER_HIT(lwaux);\n      case 0b0101110111: PPC_DECODER_HIT(lhaux);\n      case 0b0110010111: PPC_DECODER_HIT(sthx);\n      case 0b0110011100: PPC_DECODER_HIT(orcx);\n      case 0b0110110111: PPC_DECODER_HIT(sthux);\n      case 0b0110111100: PPC_DECODER_HIT(orx);\n      case 0b0111010011: PPC_DECODER_HIT(mtspr);\n      case 0b0111010110: PPC_DECODER_HIT(dcbi);\n      case 0b0111011100: PPC_DECODER_HIT(nandx);\n      case 0b0111100111: PPC_DECODER_HIT(stvxl);\n      case 0b1000000000: PPC_DECODER_HIT(mcrxr);\n      case 0b1000000111: PPC_DECODER_HIT(lvlx);\n      case 0b1000010100: PPC_DECODER_HIT(ldbrx);\n      case 0b1000010101: PPC_DECODER_HIT(lswx);\n      case 0b1000010110: PPC_DECODER_HIT(lwbrx);\n      case 0b1000010111: PPC_DECODER_HIT(lfsx);\n      case 0b1000011000: PPC_DECODER_HIT(srwx);\n      case 0b1000011011: PPC_DECODER_HIT(srdx);\n      case 0b1000100111: PPC_DECODER_HIT(lvrx);\n      case 0b1000110111: PPC_DECODER_HIT(lfsux);\n      case 0b1001010101: PPC_DECODER_HIT(lswi);\n      case 0b1001010110: PPC_DECODER_HIT(sync);\n      case 0b1001010111: PPC_DECODER_HIT(lfdx);\n      case 0b1001110111: PPC_DECODER_HIT(lfdux);\n      case 0b1010000111: PPC_DECODER_HIT(stvlx);\n      case 0b1010010100: PPC_DECODER_HIT(stdbrx);\n      case 0b1010010101: PPC_DECODER_HIT(stswx);\n      case 0b1010010110: PPC_DECODER_HIT(stwbrx);\n      case 0b1010010111: PPC_DECODER_HIT(stfsx);\n      case 0b1010100111: PPC_DECODER_HIT(stvrx);\n      case 0b1010110111: PPC_DECODER_HIT(stfsux);\n      case 0b1011010101: PPC_DECODER_HIT(stswi);\n      case 0b1011010111: PPC_DECODER_HIT(stfdx);\n      case 0b1011110111: PPC_DECODER_HIT(stfdux);\n      case 0b1100000111: PPC_DECODER_HIT(lvlxl);\n      case 0b1100010110: PPC_DECODER_HIT(lhbrx);\n      case 0b1100011000: PPC_DECODER_HIT(srawx);\n      case 0b1100011010: PPC_DECODER_HIT(sradx);\n      case 0b1100100111: PPC_DECODER_HIT(lvrxl);\n      case 0b1100111000: PPC_DECODER_HIT(srawix);\n      case 0b1101010110: PPC_DECODER_HIT(eieio);\n      case 0b1110000111: PPC_DECODER_HIT(stvlxl);\n      case 0b1110010110: PPC_DECODER_HIT(sthbrx);\n      case 0b1110011010: PPC_DECODER_HIT(extshx);\n      case 0b1110100111: PPC_DECODER_HIT(stvrxl);\n      case 0b1110111010: PPC_DECODER_HIT(extsbx);\n      case 0b1111010110: PPC_DECODER_HIT(icbi);\n      case 0b1111010111: PPC_DECODER_HIT(stfiwx);\n      case 0b1111011010: PPC_DECODER_HIT(extswx);\n    }\n    switch ((ExtractBits(code, 22, 30) << 0)) {\n      case 0b000001000: PPC_DECODER_HIT(subfcx);\n      case 0b000001001: PPC_DECODER_HIT(mulhdux);\n      case 0b000001010: PPC_DECODER_HIT(addcx);\n      case 0b000001011: PPC_DECODER_HIT(mulhwux);\n      case 0b000101000: PPC_DECODER_HIT(subfx);\n      case 0b001001001: PPC_DECODER_HIT(mulhdx);\n      case 0b001001011: PPC_DECODER_HIT(mulhwx);\n      case 0b001101000: PPC_DECODER_HIT(negx);\n      case 0b010001000: PPC_DECODER_HIT(subfex);\n      case 0b010001010: PPC_DECODER_HIT(addex);\n      case 0b011001000: PPC_DECODER_HIT(subfzex);\n      case 0b011001010: PPC_DECODER_HIT(addzex);\n      case 0b011101000: PPC_DECODER_HIT(subfmex);\n      case 0b011101001: PPC_DECODER_HIT(mulldx);\n      case 0b011101010: PPC_DECODER_HIT(addmex);\n      case 0b011101011: PPC_DECODER_HIT(mullwx);\n      case 0b100001010: PPC_DECODER_HIT(addx);\n      case 0b111001001: PPC_DECODER_HIT(divdux);\n      case 0b111001011: PPC_DECODER_HIT(divwux);\n      case 0b111101001: PPC_DECODER_HIT(divdx);\n      case 0b111101011: PPC_DECODER_HIT(divwx);\n    }\n    switch ((ExtractBits(code, 6, 10) << 20)|(ExtractBits(code, 21, 30) << 0)) {\n      case 0b0000000000000001111110110: PPC_DECODER_HIT(dcbz);\n      case 0b0000100000000001111110110: PPC_DECODER_HIT(dcbz128);\n    }\n    PPC_DECODER_MISS;\n  case 32: PPC_DECODER_HIT(lwz);\n  case 33: PPC_DECODER_HIT(lwzu);\n  case 34: PPC_DECODER_HIT(lbz);\n  case 35: PPC_DECODER_HIT(lbzu);\n  case 36: PPC_DECODER_HIT(stw);\n  case 37: PPC_DECODER_HIT(stwu);\n  case 38: PPC_DECODER_HIT(stb);\n  case 39: PPC_DECODER_HIT(stbu);\n  case 40: PPC_DECODER_HIT(lhz);\n  case 41: PPC_DECODER_HIT(lhzu);\n  case 42: PPC_DECODER_HIT(lha);\n  case 43: PPC_DECODER_HIT(lhau);\n  case 44: PPC_DECODER_HIT(sth);\n  case 45: PPC_DECODER_HIT(sthu);\n  case 46: PPC_DECODER_HIT(lmw);\n  case 47: PPC_DECODER_HIT(stmw);\n  case 48: PPC_DECODER_HIT(lfs);\n  case 49: PPC_DECODER_HIT(lfsu);\n  case 50: PPC_DECODER_HIT(lfd);\n  case 51: PPC_DECODER_HIT(lfdu);\n  case 52: PPC_DECODER_HIT(stfs);\n  case 53: PPC_DECODER_HIT(stfsu);\n  case 54: PPC_DECODER_HIT(stfd);\n  case 55: PPC_DECODER_HIT(stfdu);\n  case 58:\n    switch ((ExtractBits(code, 30, 31) << 0)) {\n      case 0b00: PPC_DECODER_HIT(ld);\n      case 0b01: PPC_DECODER_HIT(ldu);\n      case 0b10: PPC_DECODER_HIT(lwa);\n    }\n    PPC_DECODER_MISS;\n  case 59:\n    switch ((ExtractBits(code, 26, 30) << 0)) {\n      case 0b10010: PPC_DECODER_HIT(fdivsx);\n      case 0b10100: PPC_DECODER_HIT(fsubsx);\n      case 0b10101: PPC_DECODER_HIT(faddsx);\n      case 0b10110: PPC_DECODER_HIT(fsqrtsx);\n      case 0b11000: PPC_DECODER_HIT(fresx);\n      case 0b11001: PPC_DECODER_HIT(fmulsx);\n      case 0b11100: PPC_DECODER_HIT(fmsubsx);\n      case 0b11101: PPC_DECODER_HIT(fmaddsx);\n      case 0b11110: PPC_DECODER_HIT(fnmsubsx);\n      case 0b11111: PPC_DECODER_HIT(fnmaddsx);\n    }\n    PPC_DECODER_MISS;\n  case 62:\n    switch ((ExtractBits(code, 30, 31) << 0)) {\n      case 0b00: PPC_DECODER_HIT(std);\n      case 0b01: PPC_DECODER_HIT(stdu);\n    }\n    PPC_DECODER_MISS;\n  case 63:\n    switch ((ExtractBits(code, 21, 30) << 0)) {\n      case 0b0000000000: PPC_DECODER_HIT(fcmpu);\n      case 0b0000001100: PPC_DECODER_HIT(frspx);\n      case 0b0000001110: PPC_DECODER_HIT(fctiwx);\n      case 0b0000001111: PPC_DECODER_HIT(fctiwzx);\n      case 0b0000100000: PPC_DECODER_HIT(fcmpo);\n      case 0b0000100110: PPC_DECODER_HIT(mtfsb1x);\n      case 0b0000101000: PPC_DECODER_HIT(fnegx);\n      case 0b0001000000: PPC_DECODER_HIT(mcrfs);\n      case 0b0001000110: PPC_DECODER_HIT(mtfsb0x);\n      case 0b0001001000: PPC_DECODER_HIT(fmrx);\n      case 0b0010000110: PPC_DECODER_HIT(mtfsfix);\n      case 0b0010001000: PPC_DECODER_HIT(fnabsx);\n      case 0b0100001000: PPC_DECODER_HIT(fabsx);\n      case 0b1001000111: PPC_DECODER_HIT(mffsx);\n      case 0b1011000111: PPC_DECODER_HIT(mtfsfx);\n      case 0b1100101110: PPC_DECODER_HIT(fctidx);\n      case 0b1100101111: PPC_DECODER_HIT(fctidzx);\n      case 0b1101001110: PPC_DECODER_HIT(fcfidx);\n    }\n    switch ((ExtractBits(code, 26, 30) << 0)) {\n      case 0b10010: PPC_DECODER_HIT(fdivx);\n      case 0b10100: PPC_DECODER_HIT(fsubx);\n      case 0b10101: PPC_DECODER_HIT(faddx);\n      case 0b10110: PPC_DECODER_HIT(fsqrtx);\n      case 0b10111: PPC_DECODER_HIT(fselx);\n      case 0b11001: PPC_DECODER_HIT(fmulx);\n      case 0b11010: PPC_DECODER_HIT(frsqrtex);\n      case 0b11100: PPC_DECODER_HIT(fmsubx);\n      case 0b11101: PPC_DECODER_HIT(fmaddx);\n      case 0b11110: PPC_DECODER_HIT(fnmsubx);\n      case 0b11111: PPC_DECODER_HIT(fnmaddx);\n    }\n    PPC_DECODER_MISS;\n  default: PPC_DECODER_MISS;\n  }\n}\n\n}  // namespace ppc\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/ppc/ppc_opcode_table_gen.cc",
    "content": "// This code was autogenerated by ./tools/ppc-table-gen. Do not modify!\n// clang-format off\n#include <cstdint>\n#include <cstdlib>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/cpu/ppc/ppc_opcode.h\"\n#include \"xenia/cpu/ppc/ppc_opcode_info.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace ppc {\n\n#define INSTRUCTION(opcode, mnem, form, group, type) \\\n    {PPCOpcodeGroup::group, PPCOpcodeType::type, nullptr}\nPPCOpcodeInfo ppc_opcode_table[] = {\n  INSTRUCTION(0x7c000014, \"addcx\"       , kXO     , kI, kGeneral),\n  INSTRUCTION(0x7c000114, \"addex\"       , kXO     , kI, kGeneral),\n  INSTRUCTION(0x38000000, \"addi\"        , kD      , kI, kGeneral),\n  INSTRUCTION(0x30000000, \"addic\"       , kD      , kI, kGeneral),\n  INSTRUCTION(0x34000000, \"addicx\"      , kD      , kI, kGeneral),\n  INSTRUCTION(0x3c000000, \"addis\"       , kD      , kI, kGeneral),\n  INSTRUCTION(0x7c0001d4, \"addmex\"      , kXO     , kI, kGeneral),\n  INSTRUCTION(0x7c000214, \"addx\"        , kXO     , kI, kGeneral),\n  INSTRUCTION(0x7c000194, \"addzex\"      , kXO     , kI, kGeneral),\n  INSTRUCTION(0x7c000078, \"andcx\"       , kX      , kI, kGeneral),\n  INSTRUCTION(0x74000000, \"andisx\"      , kD      , kI, kGeneral),\n  INSTRUCTION(0x70000000, \"andix\"       , kD      , kI, kGeneral),\n  INSTRUCTION(0x7c000038, \"andx\"        , kX      , kI, kGeneral),\n  INSTRUCTION(0x4c000420, \"bcctrx\"      , kXL     , kB, kSync   ),\n  INSTRUCTION(0x4c000020, \"bclrx\"       , kXL     , kB, kSync   ),\n  INSTRUCTION(0x40000000, \"bcx\"         , kB      , kB, kSync   ),\n  INSTRUCTION(0x48000000, \"bx\"          , kI      , kB, kSync   ),\n  INSTRUCTION(0x7c000000, \"cmp\"         , kX      , kI, kGeneral),\n  INSTRUCTION(0x2c000000, \"cmpi\"        , kD      , kI, kGeneral),\n  INSTRUCTION(0x7c000040, \"cmpl\"        , kX      , kI, kGeneral),\n  INSTRUCTION(0x28000000, \"cmpli\"       , kD      , kI, kGeneral),\n  INSTRUCTION(0x7c000074, \"cntlzdx\"     , kX      , kI, kGeneral),\n  INSTRUCTION(0x7c000034, \"cntlzwx\"     , kX      , kI, kGeneral),\n  INSTRUCTION(0x4c000202, \"crand\"       , kXL     , kC, kGeneral),\n  INSTRUCTION(0x4c000102, \"crandc\"      , kXL     , kC, kGeneral),\n  INSTRUCTION(0x4c000242, \"creqv\"       , kXL     , kC, kGeneral),\n  INSTRUCTION(0x4c0001c2, \"crnand\"      , kXL     , kC, kGeneral),\n  INSTRUCTION(0x4c000042, \"crnor\"       , kXL     , kC, kGeneral),\n  INSTRUCTION(0x4c000382, \"cror\"        , kXL     , kC, kGeneral),\n  INSTRUCTION(0x4c000342, \"crorc\"       , kXL     , kC, kGeneral),\n  INSTRUCTION(0x4c000182, \"crxor\"       , kXL     , kC, kGeneral),\n  INSTRUCTION(0x7c0000ac, \"dcbf\"        , kX      , kM, kGeneral),\n  INSTRUCTION(0x7c0003ac, \"dcbi\"        , kX      , kM, kGeneral),\n  INSTRUCTION(0x7c00006c, \"dcbst\"       , kX      , kM, kGeneral),\n  INSTRUCTION(0x7c00022c, \"dcbt\"        , kX      , kM, kGeneral),\n  INSTRUCTION(0x7c0001ec, \"dcbtst\"      , kX      , kM, kGeneral),\n  INSTRUCTION(0x7c0007ec, \"dcbz\"        , kDCBZ   , kM, kGeneral),\n  INSTRUCTION(0x7c2007ec, \"dcbz128\"     , kDCBZ   , kM, kGeneral),\n  INSTRUCTION(0x7c000392, \"divdux\"      , kXO     , kI, kGeneral),\n  INSTRUCTION(0x7c0003d2, \"divdx\"       , kXO     , kI, kGeneral),\n  INSTRUCTION(0x7c000396, \"divwux\"      , kXO     , kI, kGeneral),\n  INSTRUCTION(0x7c0003d6, \"divwx\"       , kXO     , kI, kGeneral),\n  INSTRUCTION(0x7c0006ac, \"eieio\"       , kX      , kI, kGeneral),\n  INSTRUCTION(0x7c000238, \"eqvx\"        , kX      , kI, kGeneral),\n  INSTRUCTION(0x7c000774, \"extsbx\"      , kX      , kI, kGeneral),\n  INSTRUCTION(0x7c000734, \"extshx\"      , kX      , kI, kGeneral),\n  INSTRUCTION(0x7c0007b4, \"extswx\"      , kX      , kI, kGeneral),\n  INSTRUCTION(0xfc000210, \"fabsx\"       , kX      , kF, kGeneral),\n  INSTRUCTION(0xec00002a, \"faddsx\"      , kA      , kF, kGeneral),\n  INSTRUCTION(0xfc00002a, \"faddx\"       , kA      , kF, kGeneral),\n  INSTRUCTION(0xfc00069c, \"fcfidx\"      , kX      , kF, kGeneral),\n  INSTRUCTION(0xfc000040, \"fcmpo\"       , kX      , kF, kGeneral),\n  INSTRUCTION(0xfc000000, \"fcmpu\"       , kX      , kF, kGeneral),\n  INSTRUCTION(0xfc00065c, \"fctidx\"      , kX      , kF, kGeneral),\n  INSTRUCTION(0xfc00065e, \"fctidzx\"     , kX      , kF, kGeneral),\n  INSTRUCTION(0xfc00001c, \"fctiwx\"      , kX      , kF, kGeneral),\n  INSTRUCTION(0xfc00001e, \"fctiwzx\"     , kX      , kF, kGeneral),\n  INSTRUCTION(0xec000024, \"fdivsx\"      , kA      , kF, kGeneral),\n  INSTRUCTION(0xfc000024, \"fdivx\"       , kA      , kF, kGeneral),\n  INSTRUCTION(0xec00003a, \"fmaddsx\"     , kA      , kF, kGeneral),\n  INSTRUCTION(0xfc00003a, \"fmaddx\"      , kA      , kF, kGeneral),\n  INSTRUCTION(0xfc000090, \"fmrx\"        , kX      , kF, kGeneral),\n  INSTRUCTION(0xec000038, \"fmsubsx\"     , kA      , kF, kGeneral),\n  INSTRUCTION(0xfc000038, \"fmsubx\"      , kA      , kF, kGeneral),\n  INSTRUCTION(0xec000032, \"fmulsx\"      , kA      , kF, kGeneral),\n  INSTRUCTION(0xfc000032, \"fmulx\"       , kA      , kF, kGeneral),\n  INSTRUCTION(0xfc000110, \"fnabsx\"      , kX      , kF, kGeneral),\n  INSTRUCTION(0xfc000050, \"fnegx\"       , kX      , kF, kGeneral),\n  INSTRUCTION(0xec00003e, \"fnmaddsx\"    , kA      , kF, kGeneral),\n  INSTRUCTION(0xfc00003e, \"fnmaddx\"     , kA      , kF, kGeneral),\n  INSTRUCTION(0xec00003c, \"fnmsubsx\"    , kA      , kF, kGeneral),\n  INSTRUCTION(0xfc00003c, \"fnmsubx\"     , kA      , kF, kGeneral),\n  INSTRUCTION(0xec000030, \"fresx\"       , kA      , kF, kGeneral),\n  INSTRUCTION(0xfc000018, \"frspx\"       , kX      , kF, kGeneral),\n  INSTRUCTION(0xfc000034, \"frsqrtex\"    , kA      , kF, kGeneral),\n  INSTRUCTION(0xfc00002e, \"fselx\"       , kA      , kF, kGeneral),\n  INSTRUCTION(0xec00002c, \"fsqrtsx\"     , kA      , kF, kGeneral),\n  INSTRUCTION(0xfc00002c, \"fsqrtx\"      , kA      , kF, kGeneral),\n  INSTRUCTION(0xec000028, \"fsubsx\"      , kA      , kF, kGeneral),\n  INSTRUCTION(0xfc000028, \"fsubx\"       , kA      , kF, kGeneral),\n  INSTRUCTION(0x7c0007ac, \"icbi\"        , kX      , kM, kGeneral),\n  INSTRUCTION(0x4c00012c, \"isync\"       , kXL     , kI, kGeneral),\n  INSTRUCTION(0x88000000, \"lbz\"         , kD      , kM, kGeneral),\n  INSTRUCTION(0x8c000000, \"lbzu\"        , kD      , kM, kGeneral),\n  INSTRUCTION(0x7c0000ee, \"lbzux\"       , kX      , kM, kGeneral),\n  INSTRUCTION(0x7c0000ae, \"lbzx\"        , kX      , kM, kGeneral),\n  INSTRUCTION(0xe8000000, \"ld\"          , kDS     , kM, kGeneral),\n  INSTRUCTION(0x7c0000a8, \"ldarx\"       , kX      , kM, kGeneral),\n  INSTRUCTION(0x7c000428, \"ldbrx\"       , kX      , kM, kGeneral),\n  INSTRUCTION(0xe8000001, \"ldu\"         , kDS     , kM, kGeneral),\n  INSTRUCTION(0x7c00006a, \"ldux\"        , kX      , kM, kGeneral),\n  INSTRUCTION(0x7c00002a, \"ldx\"         , kX      , kM, kGeneral),\n  INSTRUCTION(0xc8000000, \"lfd\"         , kD      , kM, kGeneral),\n  INSTRUCTION(0xcc000000, \"lfdu\"        , kD      , kM, kGeneral),\n  INSTRUCTION(0x7c0004ee, \"lfdux\"       , kX      , kM, kGeneral),\n  INSTRUCTION(0x7c0004ae, \"lfdx\"        , kX      , kM, kGeneral),\n  INSTRUCTION(0xc0000000, \"lfs\"         , kD      , kM, kGeneral),\n  INSTRUCTION(0xc4000000, \"lfsu\"        , kD      , kM, kGeneral),\n  INSTRUCTION(0x7c00046e, \"lfsux\"       , kX      , kM, kGeneral),\n  INSTRUCTION(0x7c00042e, \"lfsx\"        , kX      , kM, kGeneral),\n  INSTRUCTION(0xa8000000, \"lha\"         , kD      , kM, kGeneral),\n  INSTRUCTION(0xac000000, \"lhau\"        , kD      , kM, kGeneral),\n  INSTRUCTION(0x7c0002ee, \"lhaux\"       , kX      , kM, kGeneral),\n  INSTRUCTION(0x7c0002ae, \"lhax\"        , kX      , kM, kGeneral),\n  INSTRUCTION(0x7c00062c, \"lhbrx\"       , kX      , kM, kGeneral),\n  INSTRUCTION(0xa0000000, \"lhz\"         , kD      , kM, kGeneral),\n  INSTRUCTION(0xa4000000, \"lhzu\"        , kD      , kM, kGeneral),\n  INSTRUCTION(0x7c00026e, \"lhzux\"       , kX      , kM, kGeneral),\n  INSTRUCTION(0x7c00022e, \"lhzx\"        , kX      , kM, kGeneral),\n  INSTRUCTION(0xb8000000, \"lmw\"         , kD      , kM, kGeneral),\n  INSTRUCTION(0x7c0004aa, \"lswi\"        , kX      , kM, kGeneral),\n  INSTRUCTION(0x7c00042a, \"lswx\"        , kX      , kM, kGeneral),\n  INSTRUCTION(0x7c00000e, \"lvebx\"       , kX      , kM, kGeneral),\n  INSTRUCTION(0x7c00004e, \"lvehx\"       , kX      , kM, kGeneral),\n  INSTRUCTION(0x7c00008e, \"lvewx\"       , kX      , kM, kGeneral),\n  INSTRUCTION(0x10000083, \"lvewx128\"    , kVX128_1, kM, kGeneral),\n  INSTRUCTION(0x7c00040e, \"lvlx\"        , kX      , kM, kGeneral),\n  INSTRUCTION(0x10000403, \"lvlx128\"     , kVX128_1, kM, kGeneral),\n  INSTRUCTION(0x7c00060e, \"lvlxl\"       , kX      , kM, kGeneral),\n  INSTRUCTION(0x10000603, \"lvlxl128\"    , kVX128_1, kM, kGeneral),\n  INSTRUCTION(0x7c00044e, \"lvrx\"        , kX      , kM, kGeneral),\n  INSTRUCTION(0x10000443, \"lvrx128\"     , kVX128_1, kM, kGeneral),\n  INSTRUCTION(0x7c00064e, \"lvrxl\"       , kX      , kM, kGeneral),\n  INSTRUCTION(0x10000643, \"lvrxl128\"    , kVX128_1, kM, kGeneral),\n  INSTRUCTION(0x7c00000c, \"lvsl\"        , kX      , kV, kGeneral),\n  INSTRUCTION(0x10000003, \"lvsl128\"     , kVX128_1, kV, kGeneral),\n  INSTRUCTION(0x7c00004c, \"lvsr\"        , kX      , kV, kGeneral),\n  INSTRUCTION(0x10000043, \"lvsr128\"     , kVX128_1, kV, kGeneral),\n  INSTRUCTION(0x7c0000ce, \"lvx\"         , kX      , kM, kGeneral),\n  INSTRUCTION(0x100000c3, \"lvx128\"      , kVX128_1, kM, kGeneral),\n  INSTRUCTION(0x7c0002ce, \"lvxl\"        , kX      , kM, kGeneral),\n  INSTRUCTION(0x100002c3, \"lvxl128\"     , kVX128_1, kM, kGeneral),\n  INSTRUCTION(0xe8000002, \"lwa\"         , kDS     , kM, kGeneral),\n  INSTRUCTION(0x7c000028, \"lwarx\"       , kX      , kM, kGeneral),\n  INSTRUCTION(0x7c0002ea, \"lwaux\"       , kX      , kM, kGeneral),\n  INSTRUCTION(0x7c0002aa, \"lwax\"        , kX      , kM, kGeneral),\n  INSTRUCTION(0x7c00042c, \"lwbrx\"       , kX      , kM, kGeneral),\n  INSTRUCTION(0x80000000, \"lwz\"         , kD      , kM, kGeneral),\n  INSTRUCTION(0x84000000, \"lwzu\"        , kD      , kM, kGeneral),\n  INSTRUCTION(0x7c00006e, \"lwzux\"       , kX      , kM, kGeneral),\n  INSTRUCTION(0x7c00002e, \"lwzx\"        , kX      , kM, kGeneral),\n  INSTRUCTION(0x4c000000, \"mcrf\"        , kXL     , kC, kGeneral),\n  INSTRUCTION(0xfc000080, \"mcrfs\"       , kX      , kC, kGeneral),\n  INSTRUCTION(0x7c000400, \"mcrxr\"       , kX      , kC, kGeneral),\n  INSTRUCTION(0x7c000026, \"mfcr\"        , kX      , kC, kGeneral),\n  INSTRUCTION(0xfc00048e, \"mffsx\"       , kX      , kC, kGeneral),\n  INSTRUCTION(0x7c0000a6, \"mfmsr\"       , kX      , kC, kSync   ),\n  INSTRUCTION(0x7c0002a6, \"mfspr\"       , kXFX    , kC, kGeneral),\n  INSTRUCTION(0x7c0002e6, \"mftb\"        , kXFX    , kC, kGeneral),\n  INSTRUCTION(0x10000604, \"mfvscr\"      , kVX     , kC, kGeneral),\n  INSTRUCTION(0x7c000120, \"mtcrf\"       , kXFX    , kC, kGeneral),\n  INSTRUCTION(0xfc00008c, \"mtfsb0x\"     , kX      , kC, kGeneral),\n  INSTRUCTION(0xfc00004c, \"mtfsb1x\"     , kX      , kC, kGeneral),\n  INSTRUCTION(0xfc00010c, \"mtfsfix\"     , kX      , kC, kGeneral),\n  INSTRUCTION(0xfc00058e, \"mtfsfx\"      , kXFL    , kC, kGeneral),\n  INSTRUCTION(0x7c000124, \"mtmsr\"       , kX      , kC, kSync   ),\n  INSTRUCTION(0x7c000164, \"mtmsrd\"      , kX      , kC, kSync   ),\n  INSTRUCTION(0x7c0003a6, \"mtspr\"       , kXFX    , kC, kGeneral),\n  INSTRUCTION(0x10000644, \"mtvscr\"      , kVX     , kC, kGeneral),\n  INSTRUCTION(0x7c000012, \"mulhdux\"     , kXO     , kI, kGeneral),\n  INSTRUCTION(0x7c000092, \"mulhdx\"      , kXO     , kI, kGeneral),\n  INSTRUCTION(0x7c000016, \"mulhwux\"     , kXO     , kI, kGeneral),\n  INSTRUCTION(0x7c000096, \"mulhwx\"      , kXO     , kI, kGeneral),\n  INSTRUCTION(0x7c0001d2, \"mulldx\"      , kXO     , kI, kGeneral),\n  INSTRUCTION(0x1c000000, \"mulli\"       , kD      , kI, kGeneral),\n  INSTRUCTION(0x7c0001d6, \"mullwx\"      , kXO     , kI, kGeneral),\n  INSTRUCTION(0x7c0003b8, \"nandx\"       , kX      , kI, kGeneral),\n  INSTRUCTION(0x7c0000d0, \"negx\"        , kXO     , kI, kGeneral),\n  INSTRUCTION(0x7c0000f8, \"norx\"        , kX      , kI, kGeneral),\n  INSTRUCTION(0x7c000338, \"orcx\"        , kX      , kI, kGeneral),\n  INSTRUCTION(0x60000000, \"ori\"         , kD      , kI, kGeneral),\n  INSTRUCTION(0x64000000, \"oris\"        , kD      , kI, kGeneral),\n  INSTRUCTION(0x7c000378, \"orx\"         , kX      , kI, kGeneral),\n  INSTRUCTION(0x78000010, \"rldclx\"      , kMDS    , kI, kGeneral),\n  INSTRUCTION(0x78000012, \"rldcrx\"      , kMDS    , kI, kGeneral),\n  INSTRUCTION(0x78000000, \"rldiclx\"     , kMD     , kI, kGeneral),\n  INSTRUCTION(0x78000004, \"rldicrx\"     , kMD     , kI, kGeneral),\n  INSTRUCTION(0x78000008, \"rldicx\"      , kMD     , kI, kGeneral),\n  INSTRUCTION(0x7800000c, \"rldimix\"     , kMD     , kI, kGeneral),\n  INSTRUCTION(0x50000000, \"rlwimix\"     , kM      , kI, kGeneral),\n  INSTRUCTION(0x54000000, \"rlwinmx\"     , kM      , kI, kGeneral),\n  INSTRUCTION(0x5c000000, \"rlwnmx\"      , kM      , kI, kGeneral),\n  INSTRUCTION(0x44000002, \"sc\"          , kSC     , kB, kSync   ),\n  INSTRUCTION(0x7c000036, \"sldx\"        , kX      , kI, kGeneral),\n  INSTRUCTION(0x7c000030, \"slwx\"        , kX      , kI, kGeneral),\n  INSTRUCTION(0x7c000674, \"sradix\"      , kXS     , kI, kGeneral),\n  INSTRUCTION(0x7c000634, \"sradx\"       , kX      , kI, kGeneral),\n  INSTRUCTION(0x7c000670, \"srawix\"      , kX      , kI, kGeneral),\n  INSTRUCTION(0x7c000630, \"srawx\"       , kX      , kI, kGeneral),\n  INSTRUCTION(0x7c000436, \"srdx\"        , kX      , kI, kGeneral),\n  INSTRUCTION(0x7c000430, \"srwx\"        , kX      , kI, kGeneral),\n  INSTRUCTION(0x98000000, \"stb\"         , kD      , kM, kGeneral),\n  INSTRUCTION(0x9c000000, \"stbu\"        , kD      , kM, kGeneral),\n  INSTRUCTION(0x7c0001ee, \"stbux\"       , kX      , kM, kGeneral),\n  INSTRUCTION(0x7c0001ae, \"stbx\"        , kX      , kM, kGeneral),\n  INSTRUCTION(0xf8000000, \"std\"         , kDS     , kM, kGeneral),\n  INSTRUCTION(0x7c000528, \"stdbrx\"      , kX      , kM, kGeneral),\n  INSTRUCTION(0x7c0001ad, \"stdcx\"       , kX      , kM, kGeneral),\n  INSTRUCTION(0xf8000001, \"stdu\"        , kDS     , kM, kGeneral),\n  INSTRUCTION(0x7c00016a, \"stdux\"       , kX      , kM, kGeneral),\n  INSTRUCTION(0x7c00012a, \"stdx\"        , kX      , kM, kGeneral),\n  INSTRUCTION(0xd8000000, \"stfd\"        , kD      , kM, kGeneral),\n  INSTRUCTION(0xdc000000, \"stfdu\"       , kD      , kM, kGeneral),\n  INSTRUCTION(0x7c0005ee, \"stfdux\"      , kX      , kM, kGeneral),\n  INSTRUCTION(0x7c0005ae, \"stfdx\"       , kX      , kM, kGeneral),\n  INSTRUCTION(0x7c0007ae, \"stfiwx\"      , kX      , kM, kGeneral),\n  INSTRUCTION(0xd0000000, \"stfs\"        , kD      , kM, kGeneral),\n  INSTRUCTION(0xd4000000, \"stfsu\"       , kD      , kM, kGeneral),\n  INSTRUCTION(0x7c00056e, \"stfsux\"      , kX      , kM, kGeneral),\n  INSTRUCTION(0x7c00052e, \"stfsx\"       , kX      , kM, kGeneral),\n  INSTRUCTION(0xb0000000, \"sth\"         , kD      , kM, kGeneral),\n  INSTRUCTION(0x7c00072c, \"sthbrx\"      , kX      , kM, kGeneral),\n  INSTRUCTION(0xb4000000, \"sthu\"        , kD      , kM, kGeneral),\n  INSTRUCTION(0x7c00036e, \"sthux\"       , kX      , kM, kGeneral),\n  INSTRUCTION(0x7c00032e, \"sthx\"        , kX      , kM, kGeneral),\n  INSTRUCTION(0xbc000000, \"stmw\"        , kD      , kM, kGeneral),\n  INSTRUCTION(0x7c0005aa, \"stswi\"       , kX      , kM, kGeneral),\n  INSTRUCTION(0x7c00052a, \"stswx\"       , kX      , kM, kGeneral),\n  INSTRUCTION(0x7c00010e, \"stvebx\"      , kX      , kM, kGeneral),\n  INSTRUCTION(0x7c00014e, \"stvehx\"      , kX      , kM, kGeneral),\n  INSTRUCTION(0x7c00018e, \"stvewx\"      , kX      , kM, kGeneral),\n  INSTRUCTION(0x10000183, \"stvewx128\"   , kVX128_1, kM, kGeneral),\n  INSTRUCTION(0x7c00050e, \"stvlx\"       , kX      , kM, kGeneral),\n  INSTRUCTION(0x10000503, \"stvlx128\"    , kVX128_1, kM, kGeneral),\n  INSTRUCTION(0x7c00070e, \"stvlxl\"      , kX      , kM, kGeneral),\n  INSTRUCTION(0x10000703, \"stvlxl128\"   , kVX128_1, kM, kGeneral),\n  INSTRUCTION(0x7c00054e, \"stvrx\"       , kX      , kM, kGeneral),\n  INSTRUCTION(0x10000543, \"stvrx128\"    , kVX128_1, kM, kGeneral),\n  INSTRUCTION(0x7c00074e, \"stvrxl\"      , kX      , kM, kGeneral),\n  INSTRUCTION(0x10000743, \"stvrxl128\"   , kVX128_1, kM, kGeneral),\n  INSTRUCTION(0x7c0001ce, \"stvx\"        , kX      , kM, kGeneral),\n  INSTRUCTION(0x100001c3, \"stvx128\"     , kVX128_1, kM, kGeneral),\n  INSTRUCTION(0x7c0003ce, \"stvxl\"       , kX      , kM, kGeneral),\n  INSTRUCTION(0x100003c3, \"stvxl128\"    , kVX128_1, kM, kGeneral),\n  INSTRUCTION(0x90000000, \"stw\"         , kD      , kM, kGeneral),\n  INSTRUCTION(0x7c00052c, \"stwbrx\"      , kX      , kM, kGeneral),\n  INSTRUCTION(0x7c00012d, \"stwcx\"       , kX      , kM, kGeneral),\n  INSTRUCTION(0x94000000, \"stwu\"        , kD      , kM, kGeneral),\n  INSTRUCTION(0x7c00016e, \"stwux\"       , kX      , kM, kGeneral),\n  INSTRUCTION(0x7c00012e, \"stwx\"        , kX      , kM, kGeneral),\n  INSTRUCTION(0x7c000010, \"subfcx\"      , kXO     , kI, kGeneral),\n  INSTRUCTION(0x7c000110, \"subfex\"      , kXO     , kI, kGeneral),\n  INSTRUCTION(0x20000000, \"subficx\"     , kD      , kI, kGeneral),\n  INSTRUCTION(0x7c0001d0, \"subfmex\"     , kXO     , kI, kGeneral),\n  INSTRUCTION(0x7c000050, \"subfx\"       , kXO     , kI, kGeneral),\n  INSTRUCTION(0x7c000190, \"subfzex\"     , kXO     , kI, kGeneral),\n  INSTRUCTION(0x7c0004ac, \"sync\"        , kX      , kI, kGeneral),\n  INSTRUCTION(0x7c000088, \"td\"          , kX      , kB, kGeneral),\n  INSTRUCTION(0x08000000, \"tdi\"         , kD      , kB, kGeneral),\n  INSTRUCTION(0x7c000008, \"tw\"          , kX      , kB, kGeneral),\n  INSTRUCTION(0x0c000000, \"twi\"         , kD      , kB, kGeneral),\n  INSTRUCTION(0x10000180, \"vaddcuw\"     , kVX     , kV, kGeneral),\n  INSTRUCTION(0x1000000a, \"vaddfp\"      , kVX     , kV, kGeneral),\n  INSTRUCTION(0x14000010, \"vaddfp128\"   , kVX128  , kV, kGeneral),\n  INSTRUCTION(0x10000300, \"vaddsbs\"     , kVX     , kV, kGeneral),\n  INSTRUCTION(0x10000340, \"vaddshs\"     , kVX     , kV, kGeneral),\n  INSTRUCTION(0x10000380, \"vaddsws\"     , kVX     , kV, kGeneral),\n  INSTRUCTION(0x10000000, \"vaddubm\"     , kVX     , kV, kGeneral),\n  INSTRUCTION(0x10000200, \"vaddubs\"     , kVX     , kV, kGeneral),\n  INSTRUCTION(0x10000040, \"vadduhm\"     , kVX     , kV, kGeneral),\n  INSTRUCTION(0x10000240, \"vadduhs\"     , kVX     , kV, kGeneral),\n  INSTRUCTION(0x10000080, \"vadduwm\"     , kVX     , kV, kGeneral),\n  INSTRUCTION(0x10000280, \"vadduws\"     , kVX     , kV, kGeneral),\n  INSTRUCTION(0x10000404, \"vand\"        , kVX     , kV, kGeneral),\n  INSTRUCTION(0x14000210, \"vand128\"     , kVX128  , kV, kGeneral),\n  INSTRUCTION(0x10000444, \"vandc\"       , kVX     , kV, kGeneral),\n  INSTRUCTION(0x14000250, \"vandc128\"    , kVX128  , kV, kGeneral),\n  INSTRUCTION(0x10000502, \"vavgsb\"      , kVX     , kV, kGeneral),\n  INSTRUCTION(0x10000542, \"vavgsh\"      , kVX     , kV, kGeneral),\n  INSTRUCTION(0x10000582, \"vavgsw\"      , kVX     , kV, kGeneral),\n  INSTRUCTION(0x10000402, \"vavgub\"      , kVX     , kV, kGeneral),\n  INSTRUCTION(0x10000442, \"vavguh\"      , kVX     , kV, kGeneral),\n  INSTRUCTION(0x10000482, \"vavguw\"      , kVX     , kV, kGeneral),\n  INSTRUCTION(0x18000230, \"vcfpsxws128\" , kVX128_3, kV, kGeneral),\n  INSTRUCTION(0x18000270, \"vcfpuxws128\" , kVX128_3, kV, kGeneral),\n  INSTRUCTION(0x1000034a, \"vcfsx\"       , kVX     , kV, kGeneral),\n  INSTRUCTION(0x1000030a, \"vcfux\"       , kVX     , kV, kGeneral),\n  INSTRUCTION(0x100003c6, \"vcmpbfp\"     , kVC     , kV, kGeneral),\n  INSTRUCTION(0x18000180, \"vcmpbfp128\"  , kVX128_R, kV, kGeneral),\n  INSTRUCTION(0x100000c6, \"vcmpeqfp\"    , kVC     , kV, kGeneral),\n  INSTRUCTION(0x18000000, \"vcmpeqfp128\" , kVX128_R, kV, kGeneral),\n  INSTRUCTION(0x10000006, \"vcmpequb\"    , kVC     , kV, kGeneral),\n  INSTRUCTION(0x10000046, \"vcmpequh\"    , kVC     , kV, kGeneral),\n  INSTRUCTION(0x10000086, \"vcmpequw\"    , kVC     , kV, kGeneral),\n  INSTRUCTION(0x18000200, \"vcmpequw128\" , kVX128_R, kV, kGeneral),\n  INSTRUCTION(0x100001c6, \"vcmpgefp\"    , kVC     , kV, kGeneral),\n  INSTRUCTION(0x18000080, \"vcmpgefp128\" , kVX128_R, kV, kGeneral),\n  INSTRUCTION(0x100002c6, \"vcmpgtfp\"    , kVC     , kV, kGeneral),\n  INSTRUCTION(0x18000100, \"vcmpgtfp128\" , kVX128_R, kV, kGeneral),\n  INSTRUCTION(0x10000306, \"vcmpgtsb\"    , kVC     , kV, kGeneral),\n  INSTRUCTION(0x10000346, \"vcmpgtsh\"    , kVC     , kV, kGeneral),\n  INSTRUCTION(0x10000386, \"vcmpgtsw\"    , kVC     , kV, kGeneral),\n  INSTRUCTION(0x10000206, \"vcmpgtub\"    , kVC     , kV, kGeneral),\n  INSTRUCTION(0x10000246, \"vcmpgtuh\"    , kVC     , kV, kGeneral),\n  INSTRUCTION(0x10000286, \"vcmpgtuw\"    , kVC     , kV, kGeneral),\n  INSTRUCTION(0x180002b0, \"vcsxwfp128\"  , kVX128_3, kV, kGeneral),\n  INSTRUCTION(0x100003ca, \"vctsxs\"      , kVX     , kV, kGeneral),\n  INSTRUCTION(0x1000038a, \"vctuxs\"      , kVX     , kV, kGeneral),\n  INSTRUCTION(0x180002f0, \"vcuxwfp128\"  , kVX128_3, kV, kGeneral),\n  INSTRUCTION(0x1000018a, \"vexptefp\"    , kVX     , kV, kGeneral),\n  INSTRUCTION(0x180006b0, \"vexptefp128\" , kVX128_3, kV, kGeneral),\n  INSTRUCTION(0x100001ca, \"vlogefp\"     , kVX     , kV, kGeneral),\n  INSTRUCTION(0x180006f0, \"vlogefp128\"  , kVX128_3, kV, kGeneral),\n  INSTRUCTION(0x14000110, \"vmaddcfp128\" , kVX128  , kV, kGeneral),\n  INSTRUCTION(0x1000002e, \"vmaddfp\"     , kVA     , kV, kGeneral),\n  INSTRUCTION(0x140000d0, \"vmaddfp128\"  , kVX128  , kV, kGeneral),\n  INSTRUCTION(0x1000040a, \"vmaxfp\"      , kVX     , kV, kGeneral),\n  INSTRUCTION(0x18000280, \"vmaxfp128\"   , kVX128  , kV, kGeneral),\n  INSTRUCTION(0x10000102, \"vmaxsb\"      , kVX     , kV, kGeneral),\n  INSTRUCTION(0x10000142, \"vmaxsh\"      , kVX     , kV, kGeneral),\n  INSTRUCTION(0x10000182, \"vmaxsw\"      , kVX     , kV, kGeneral),\n  INSTRUCTION(0x10000002, \"vmaxub\"      , kVX     , kV, kGeneral),\n  INSTRUCTION(0x10000042, \"vmaxuh\"      , kVX     , kV, kGeneral),\n  INSTRUCTION(0x10000082, \"vmaxuw\"      , kVX     , kV, kGeneral),\n  INSTRUCTION(0x10000020, \"vmhaddshs\"   , kVA     , kV, kGeneral),\n  INSTRUCTION(0x10000021, \"vmhraddshs\"  , kVA     , kV, kGeneral),\n  INSTRUCTION(0x1000044a, \"vminfp\"      , kVX     , kV, kGeneral),\n  INSTRUCTION(0x180002c0, \"vminfp128\"   , kVX128  , kV, kGeneral),\n  INSTRUCTION(0x10000302, \"vminsb\"      , kVX     , kV, kGeneral),\n  INSTRUCTION(0x10000342, \"vminsh\"      , kVX     , kV, kGeneral),\n  INSTRUCTION(0x10000382, \"vminsw\"      , kVX     , kV, kGeneral),\n  INSTRUCTION(0x10000202, \"vminub\"      , kVX     , kV, kGeneral),\n  INSTRUCTION(0x10000242, \"vminuh\"      , kVX     , kV, kGeneral),\n  INSTRUCTION(0x10000282, \"vminuw\"      , kVX     , kV, kGeneral),\n  INSTRUCTION(0x10000022, \"vmladduhm\"   , kVA     , kV, kGeneral),\n  INSTRUCTION(0x1000000c, \"vmrghb\"      , kVX     , kV, kGeneral),\n  INSTRUCTION(0x1000004c, \"vmrghh\"      , kVX     , kV, kGeneral),\n  INSTRUCTION(0x1000008c, \"vmrghw\"      , kVX     , kV, kGeneral),\n  INSTRUCTION(0x18000300, \"vmrghw128\"   , kVX128  , kV, kGeneral),\n  INSTRUCTION(0x1000010c, \"vmrglb\"      , kVX     , kV, kGeneral),\n  INSTRUCTION(0x1000014c, \"vmrglh\"      , kVX     , kV, kGeneral),\n  INSTRUCTION(0x1000018c, \"vmrglw\"      , kVX     , kV, kGeneral),\n  INSTRUCTION(0x18000340, \"vmrglw128\"   , kVX128  , kV, kGeneral),\n  INSTRUCTION(0x14000190, \"vmsum3fp128\" , kVX128  , kV, kGeneral),\n  INSTRUCTION(0x140001d0, \"vmsum4fp128\" , kVX128  , kV, kGeneral),\n  INSTRUCTION(0x10000025, \"vmsummbm\"    , kVA     , kV, kGeneral),\n  INSTRUCTION(0x10000028, \"vmsumshm\"    , kVA     , kV, kGeneral),\n  INSTRUCTION(0x10000029, \"vmsumshs\"    , kVA     , kV, kGeneral),\n  INSTRUCTION(0x10000024, \"vmsumubm\"    , kVA     , kV, kGeneral),\n  INSTRUCTION(0x10000026, \"vmsumuhm\"    , kVA     , kV, kGeneral),\n  INSTRUCTION(0x10000027, \"vmsumuhs\"    , kVA     , kV, kGeneral),\n  INSTRUCTION(0x10000308, \"vmulesb\"     , kVX     , kV, kGeneral),\n  INSTRUCTION(0x10000348, \"vmulesh\"     , kVX     , kV, kGeneral),\n  INSTRUCTION(0x10000208, \"vmuleub\"     , kVX     , kV, kGeneral),\n  INSTRUCTION(0x10000248, \"vmuleuh\"     , kVX     , kV, kGeneral),\n  INSTRUCTION(0x14000090, \"vmulfp128\"   , kVX128  , kV, kGeneral),\n  INSTRUCTION(0x10000108, \"vmulosb\"     , kVX     , kV, kGeneral),\n  INSTRUCTION(0x10000148, \"vmulosh\"     , kVX     , kV, kGeneral),\n  INSTRUCTION(0x10000008, \"vmuloub\"     , kVX     , kV, kGeneral),\n  INSTRUCTION(0x10000048, \"vmulouh\"     , kVX     , kV, kGeneral),\n  INSTRUCTION(0x1000002f, \"vnmsubfp\"    , kVA     , kV, kGeneral),\n  INSTRUCTION(0x14000150, \"vnmsubfp128\" , kVX128  , kV, kGeneral),\n  INSTRUCTION(0x10000504, \"vnor\"        , kVX     , kV, kGeneral),\n  INSTRUCTION(0x14000290, \"vnor128\"     , kVX128  , kV, kGeneral),\n  INSTRUCTION(0x10000484, \"vor\"         , kVX     , kV, kGeneral),\n  INSTRUCTION(0x140002d0, \"vor128\"      , kVX128  , kV, kGeneral),\n  INSTRUCTION(0x1000002b, \"vperm\"       , kVA     , kV, kGeneral),\n  INSTRUCTION(0x14000000, \"vperm128\"    , kVX128_2, kV, kGeneral),\n  INSTRUCTION(0x18000210, \"vpermwi128\"  , kVX128_P, kV, kGeneral),\n  INSTRUCTION(0x18000610, \"vpkd3d128\"   , kVX128_4, kV, kGeneral),\n  INSTRUCTION(0x1000030e, \"vpkpx\"       , kVX     , kV, kGeneral),\n  INSTRUCTION(0x1000018e, \"vpkshss\"     , kVX     , kV, kGeneral),\n  INSTRUCTION(0x14000200, \"vpkshss128\"  , kVX128  , kV, kGeneral),\n  INSTRUCTION(0x1000010e, \"vpkshus\"     , kVX     , kV, kGeneral),\n  INSTRUCTION(0x14000240, \"vpkshus128\"  , kVX128  , kV, kGeneral),\n  INSTRUCTION(0x100001ce, \"vpkswss\"     , kVX     , kV, kGeneral),\n  INSTRUCTION(0x14000280, \"vpkswss128\"  , kVX128  , kV, kGeneral),\n  INSTRUCTION(0x1000014e, \"vpkswus\"     , kVX     , kV, kGeneral),\n  INSTRUCTION(0x140002c0, \"vpkswus128\"  , kVX128  , kV, kGeneral),\n  INSTRUCTION(0x1000000e, \"vpkuhum\"     , kVX     , kV, kGeneral),\n  INSTRUCTION(0x14000300, \"vpkuhum128\"  , kVX128  , kV, kGeneral),\n  INSTRUCTION(0x1000008e, \"vpkuhus\"     , kVX     , kV, kGeneral),\n  INSTRUCTION(0x14000340, \"vpkuhus128\"  , kVX128  , kV, kGeneral),\n  INSTRUCTION(0x1000004e, \"vpkuwum\"     , kVX     , kV, kGeneral),\n  INSTRUCTION(0x14000380, \"vpkuwum128\"  , kVX128  , kV, kGeneral),\n  INSTRUCTION(0x100000ce, \"vpkuwus\"     , kVX     , kV, kGeneral),\n  INSTRUCTION(0x140003c0, \"vpkuwus128\"  , kVX128  , kV, kGeneral),\n  INSTRUCTION(0x1000010a, \"vrefp\"       , kVX     , kV, kGeneral),\n  INSTRUCTION(0x18000630, \"vrefp128\"    , kVX128_3, kV, kGeneral),\n  INSTRUCTION(0x100002ca, \"vrfim\"       , kVX     , kV, kGeneral),\n  INSTRUCTION(0x18000330, \"vrfim128\"    , kVX128_3, kV, kGeneral),\n  INSTRUCTION(0x1000020a, \"vrfin\"       , kVX     , kV, kGeneral),\n  INSTRUCTION(0x18000370, \"vrfin128\"    , kVX128_3, kV, kGeneral),\n  INSTRUCTION(0x1000028a, \"vrfip\"       , kVX     , kV, kGeneral),\n  INSTRUCTION(0x180003b0, \"vrfip128\"    , kVX128_3, kV, kGeneral),\n  INSTRUCTION(0x1000024a, \"vrfiz\"       , kVX     , kV, kGeneral),\n  INSTRUCTION(0x180003f0, \"vrfiz128\"    , kVX128_3, kV, kGeneral),\n  INSTRUCTION(0x10000004, \"vrlb\"        , kVX     , kV, kGeneral),\n  INSTRUCTION(0x10000044, \"vrlh\"        , kVX     , kV, kGeneral),\n  INSTRUCTION(0x18000710, \"vrlimi128\"   , kVX128_4, kV, kGeneral),\n  INSTRUCTION(0x10000084, \"vrlw\"        , kVX     , kV, kGeneral),\n  INSTRUCTION(0x18000050, \"vrlw128\"     , kVX128  , kV, kGeneral),\n  INSTRUCTION(0x1000014a, \"vrsqrtefp\"   , kVX     , kV, kGeneral),\n  INSTRUCTION(0x18000670, \"vrsqrtefp128\", kVX128_3, kV, kGeneral),\n  INSTRUCTION(0x1000002a, \"vsel\"        , kVA     , kV, kGeneral),\n  INSTRUCTION(0x14000350, \"vsel128\"     , kVX128  , kV, kGeneral),\n  INSTRUCTION(0x100001c4, \"vsl\"         , kVX     , kV, kGeneral),\n  INSTRUCTION(0x10000104, \"vslb\"        , kVX     , kV, kGeneral),\n  INSTRUCTION(0x1000002c, \"vsldoi\"      , kVA     , kV, kGeneral),\n  INSTRUCTION(0x10000010, \"vsldoi128\"   , kVX128_5, kV, kGeneral),\n  INSTRUCTION(0x10000144, \"vslh\"        , kVX     , kV, kGeneral),\n  INSTRUCTION(0x1000040c, \"vslo\"        , kVX     , kV, kGeneral),\n  INSTRUCTION(0x14000390, \"vslo128\"     , kVX128  , kV, kGeneral),\n  INSTRUCTION(0x10000184, \"vslw\"        , kVX     , kV, kGeneral),\n  INSTRUCTION(0x180000d0, \"vslw128\"     , kVX128  , kV, kGeneral),\n  INSTRUCTION(0x1000020c, \"vspltb\"      , kVX     , kV, kGeneral),\n  INSTRUCTION(0x1000024c, \"vsplth\"      , kVX     , kV, kGeneral),\n  INSTRUCTION(0x1000030c, \"vspltisb\"    , kVX     , kV, kGeneral),\n  INSTRUCTION(0x1000034c, \"vspltish\"    , kVX     , kV, kGeneral),\n  INSTRUCTION(0x1000038c, \"vspltisw\"    , kVX     , kV, kGeneral),\n  INSTRUCTION(0x18000770, \"vspltisw128\" , kVX128_3, kV, kGeneral),\n  INSTRUCTION(0x1000028c, \"vspltw\"      , kVX     , kV, kGeneral),\n  INSTRUCTION(0x18000730, \"vspltw128\"   , kVX128_3, kV, kGeneral),\n  INSTRUCTION(0x100002c4, \"vsr\"         , kVX     , kV, kGeneral),\n  INSTRUCTION(0x10000304, \"vsrab\"       , kVX     , kV, kGeneral),\n  INSTRUCTION(0x10000344, \"vsrah\"       , kVX     , kV, kGeneral),\n  INSTRUCTION(0x10000384, \"vsraw\"       , kVX     , kV, kGeneral),\n  INSTRUCTION(0x18000150, \"vsraw128\"    , kVX128  , kV, kGeneral),\n  INSTRUCTION(0x10000204, \"vsrb\"        , kVX     , kV, kGeneral),\n  INSTRUCTION(0x10000244, \"vsrh\"        , kVX     , kV, kGeneral),\n  INSTRUCTION(0x1000044c, \"vsro\"        , kVX     , kV, kGeneral),\n  INSTRUCTION(0x140003d0, \"vsro128\"     , kVX128  , kV, kGeneral),\n  INSTRUCTION(0x10000284, \"vsrw\"        , kVX     , kV, kGeneral),\n  INSTRUCTION(0x180001d0, \"vsrw128\"     , kVX128  , kV, kGeneral),\n  INSTRUCTION(0x10000580, \"vsubcuw\"     , kVX     , kV, kGeneral),\n  INSTRUCTION(0x1000004a, \"vsubfp\"      , kVX     , kV, kGeneral),\n  INSTRUCTION(0x14000050, \"vsubfp128\"   , kVX128  , kV, kGeneral),\n  INSTRUCTION(0x10000700, \"vsubsbs\"     , kVX     , kV, kGeneral),\n  INSTRUCTION(0x10000740, \"vsubshs\"     , kVX     , kV, kGeneral),\n  INSTRUCTION(0x10000780, \"vsubsws\"     , kVX     , kV, kGeneral),\n  INSTRUCTION(0x10000400, \"vsububm\"     , kVX     , kV, kGeneral),\n  INSTRUCTION(0x10000600, \"vsububs\"     , kVX     , kV, kGeneral),\n  INSTRUCTION(0x10000440, \"vsubuhm\"     , kVX     , kV, kGeneral),\n  INSTRUCTION(0x10000640, \"vsubuhs\"     , kVX     , kV, kGeneral),\n  INSTRUCTION(0x10000480, \"vsubuwm\"     , kVX     , kV, kGeneral),\n  INSTRUCTION(0x10000680, \"vsubuws\"     , kVX     , kV, kGeneral),\n  INSTRUCTION(0x10000688, \"vsum2sws\"    , kVX     , kV, kGeneral),\n  INSTRUCTION(0x10000708, \"vsum4sbs\"    , kVX     , kV, kGeneral),\n  INSTRUCTION(0x10000648, \"vsum4shs\"    , kVX     , kV, kGeneral),\n  INSTRUCTION(0x10000608, \"vsum4ubs\"    , kVX     , kV, kGeneral),\n  INSTRUCTION(0x10000788, \"vsumsws\"     , kVX     , kV, kGeneral),\n  INSTRUCTION(0x180007f0, \"vupkd3d128\"  , kVX128_3, kV, kGeneral),\n  INSTRUCTION(0x1000034e, \"vupkhpx\"     , kVX     , kV, kGeneral),\n  INSTRUCTION(0x1000020e, \"vupkhsb\"     , kVX     , kV, kGeneral),\n  INSTRUCTION(0x18000380, \"vupkhsb128\"  , kVX128  , kV, kGeneral),\n  INSTRUCTION(0x1000024e, \"vupkhsh\"     , kVX     , kV, kGeneral),\n  INSTRUCTION(0x100003ce, \"vupklpx\"     , kVX     , kV, kGeneral),\n  INSTRUCTION(0x1000028e, \"vupklsb\"     , kVX     , kV, kGeneral),\n  INSTRUCTION(0x180003c0, \"vupklsb128\"  , kVX128  , kV, kGeneral),\n  INSTRUCTION(0x100002ce, \"vupklsh\"     , kVX     , kV, kGeneral),\n  INSTRUCTION(0x100004c4, \"vxor\"        , kVX     , kV, kGeneral),\n  INSTRUCTION(0x14000310, \"vxor128\"     , kVX128  , kV, kGeneral),\n  INSTRUCTION(0x68000000, \"xori\"        , kD      , kI, kGeneral),\n  INSTRUCTION(0x6c000000, \"xoris\"       , kD      , kI, kGeneral),\n  INSTRUCTION(0x7c000278, \"xorx\"        , kX      , kI, kGeneral),\n};\nstatic_assert(sizeof(ppc_opcode_table) / sizeof(PPCOpcodeInfo) == static_cast<int>(PPCOpcode::kInvalid), \"PPC table mismatch - rerun ppc-table-gen\");\n\nconst PPCOpcodeInfo& GetOpcodeInfo(PPCOpcode opcode) {\n  return ppc_opcode_table[static_cast<int>(opcode)];\n}\nvoid RegisterOpcodeEmitter(PPCOpcode opcode, InstrEmitFn fn) {\n  assert_null(ppc_opcode_table[static_cast<int>(opcode)].emit);\n  ppc_opcode_table[static_cast<int>(opcode)].emit = fn;\n}\n\n}  // namespace ppc\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/ppc/ppc_scanner.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/ppc/ppc_scanner.h\"\n\n#include <algorithm>\n#include <map>\n\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/memory.h\"\n#include \"xenia/base/profiling.h\"\n#include \"xenia/cpu/ppc/ppc_decode_data.h\"\n#include \"xenia/cpu/ppc/ppc_frontend.h\"\n#include \"xenia/cpu/ppc/ppc_opcode_info.h\"\n#include \"xenia/cpu/processor.h\"\n\n#if 0\n#define LOGPPC(fmt, ...) XELOGCORE('p', fmt, ##__VA_ARGS__)\n#else\n#define LOGPPC(fmt, ...) \\\n  do {                   \\\n  } while (false)\n#endif\n\nnamespace xe {\nnamespace cpu {\nnamespace ppc {\n\nPPCScanner::PPCScanner(PPCFrontend* frontend) : frontend_(frontend) {}\n\nPPCScanner::~PPCScanner() {}\n\nbool PPCScanner::IsRestGprLr(uint32_t address) {\n  auto function = frontend_->processor()->QueryFunction(address);\n  return function && function->behavior() == Function::Behavior::kEpilogReturn;\n}\n\nbool PPCScanner::Scan(GuestFunction* function, FunctionDebugInfo* debug_info) {\n  // This is a simple basic block analyizer. It walks the start address to the\n  // end address looking for branches. Each span of instructions between\n  // branches is considered a basic block. When the last blr (that has no\n  // branches to after it) is found the function is considered ended. If this\n  // is before the expected end address then the function address range is\n  // split up and the second half is treated as another function.\n\n  Memory* memory = frontend_->memory();\n\n  LOGPPC(\"Analyzing function {:08X}...\", function->address());\n\n  // For debug info, only if needed.\n  uint32_t address_reference_count = 0;\n  uint32_t instruction_result_count = 0;\n\n  uint32_t start_address = static_cast<uint32_t>(function->address());\n  uint32_t end_address = static_cast<uint32_t>(function->end_address());\n  uint32_t address = start_address;\n  uint32_t furthest_target = start_address;\n  size_t blocks_found = 0;\n  bool in_block = false;\n  bool starts_with_mfspr_lr = false;\n  while (true) {\n    uint32_t code =\n        xe::load_and_swap<uint32_t>(memory->TranslateVirtual(address));\n\n    // If we fetched 0 assume that we somehow hit one of the awesome\n    // 'no really we meant to end after that bl' functions.\n    if (!code) {\n      LOGPPC(\"function end {:08X} (0x00000000 read)\", address);\n      // Don't include the 0's.\n      address -= 4;\n      break;\n    }\n\n    auto opcode = LookupOpcode(code);\n\n    PPCDecodeData d;\n    d.address = address;\n    d.code = code;\n\n    // TODO(benvanik): switch on instruction metadata.\n    ++address_reference_count;\n    ++instruction_result_count;\n\n    // Check if the function starts with a mfspr lr, as that's a good indication\n    // of whether or not this is a normal function with a prolog/epilog.\n    // Some valid leaf functions won't have this, but most will.\n    if (address == start_address && opcode == PPCOpcode::mfspr &&\n        (((d.XFX.SPR() & 0x1F) << 5) | ((d.XFX.SPR() >> 5) & 0x1F)) == 8) {\n      starts_with_mfspr_lr = true;\n    }\n\n    if (!in_block) {\n      in_block = true;\n      blocks_found++;\n    }\n\n    bool ends_fn = false;\n    bool ends_block = false;\n    if (opcode == PPCOpcode::kInvalid) {\n      // Invalid instruction.\n      // We can just ignore it because there's (very little)/no chance it'll\n      // affect flow control.\n      LOGPPC(\"Invalid instruction at {:08X}: {:08X}\", address, code);\n    } else if (code == 0x4E800020) {\n      // blr -- unconditional branch to LR.\n      // This is generally a return.\n      if (furthest_target > address) {\n        // Remaining targets within function, not end.\n        LOGPPC(\"ignoring blr {:08X} (branch to {:08X})\", address,\n               furthest_target);\n      } else {\n        // Function end point.\n        LOGPPC(\"function end {:08X}\", address);\n        ends_fn = true;\n      }\n      ends_block = true;\n    } else if (code == 0x4E800420) {\n      // bctr -- unconditional branch to CTR.\n      // This is generally a jump to a function pointer (non-return).\n      // This is almost always a jump table.\n      // TODO(benvanik): decode jump tables.\n      if (furthest_target > address) {\n        // Remaining targets within function, not end.\n        LOGPPC(\"ignoring bctr {:08X} (branch to {:08X})\", address,\n               furthest_target);\n      } else {\n        // Function end point.\n        LOGPPC(\"function end {:08X}\", address);\n        ends_fn = true;\n      }\n      ends_block = true;\n    } else if (opcode == PPCOpcode::bx) {\n      // b/ba/bl/bla\n      uint32_t target = d.I.ADDR();\n      if (d.I.LK()) {\n        LOGPPC(\"bl {:08X} -> {:08X}\", address, target);\n        // Queue call target if needed.\n        // GetOrInsertFunction(target);\n      } else {\n        LOGPPC(\"b {:08X} -> {:08X}\", address, target);\n\n        // If the target is back into the function and there's no further target\n        // we are at the end of a function.\n        // (Indirect branches may still go beyond, but no way of knowing).\n        if (target >= start_address && target < address &&\n            furthest_target <= address) {\n          LOGPPC(\"function end {:08X} (back b)\", address);\n          ends_fn = true;\n        }\n\n        // If the target is not a branch and it goes to before the current\n        // address it's definitely a tail call.\n        if (!ends_fn && target < start_address && furthest_target <= address) {\n          LOGPPC(\"function end {:08X} (back b before addr)\", address);\n          ends_fn = true;\n        }\n\n        // If the target is a __restgprlr_* method it's the end of a function.\n        // Note that sometimes functions stick this in a basic block *inside*\n        // of the function somewhere, so ensure we don't have any branches over\n        // it.\n        if (!ends_fn && furthest_target <= address && IsRestGprLr(target)) {\n          LOGPPC(\"function end {:08X} (__restgprlr_*)\", address);\n          ends_fn = true;\n        }\n\n        // Heuristic: if there's an unconditional branch in the first block of\n        // the function it's likely a thunk.\n        // Ex:\n        //   li        r3, 0\n        //   b         KeBugCheck\n        // This check may hit on functions that jump over data code, so only\n        // trigger this check in leaf functions (no mfspr lr/prolog).\n        if (!ends_fn && !starts_with_mfspr_lr && blocks_found == 1) {\n          LOGPPC(\"HEURISTIC: ending at simple leaf thunk {:08X}\", address);\n          ends_fn = true;\n        }\n\n        // Heuristic: if this is an unconditional branch at the end of the\n        // function (nothing jumps over us) and we are jumping forward there's\n        // a good chance it's a tail call.\n        // This may not be true if the code is jumping over data/etc.\n        // TODO(benvanik): figure out how to do this reliably. This check as is\n        // is too aggressive and turns a lot of valid branches into tail calls.\n        // It seems like a lot of functions end up with some prologue bit then\n        // jump deep inside only to jump back towards the top soon after. May\n        // need something more complex than just a simple 1-pass system to\n        // detect these, unless more signals can be found.\n        /*\n        if (!ends_fn &&\n            target > addr &&\n            furthest_target < addr) {\n          LOGPPC(\"HEURISTIC: ending at tail call branch %.8X\", addr);\n          ends_fn = true;\n        }\n        */\n\n        if (!ends_fn && !IsRestGprLr(target)) {\n          furthest_target = std::max(furthest_target, target);\n\n          // TODO(benvanik): perhaps queue up for a speculative check? I think\n          //     we are running over tail-call functions here that branch to\n          //     somewhere else.\n          // GetOrInsertFunction(target);\n        }\n      }\n      ends_block = true;\n    } else if (opcode == PPCOpcode::bcx) {\n      // bc/bca/bcl/bcla\n      uint32_t target = d.B.ADDR();\n      if (d.B.LK()) {\n        LOGPPC(\"bcl {:08X} -> {:08X}\", address, target);\n\n        // Queue call target if needed.\n        // TODO(benvanik): see if this is correct - not sure anyone makes\n        //     function calls with bcl.\n        // GetOrInsertFunction(target);\n      } else {\n        LOGPPC(\"bc {:08X} -> {:08X}\", address, target);\n\n        // TODO(benvanik): GetOrInsertFunction? it's likely a BB\n\n        if (!IsRestGprLr(target)) {\n          furthest_target = std::max(furthest_target, target);\n        }\n      }\n      ends_block = true;\n    } else if (opcode == PPCOpcode::bclrx) {\n      // bclr/bclrl\n      if (d.XL.LK()) {\n        LOGPPC(\"bclrl {:08X}\", address);\n      } else {\n        LOGPPC(\"bclr {:08X}\", address);\n      }\n      ends_block = true;\n    } else if (opcode == PPCOpcode::bcctrx) {\n      // bcctr/bcctrl\n      if (d.XL.LK()) {\n        LOGPPC(\"bcctrl {:08X}\", address);\n      } else {\n        LOGPPC(\"bcctr {:08X}\", address);\n      }\n      ends_block = true;\n    }\n\n    if (ends_block) {\n      in_block = false;\n    }\n    if (ends_fn) {\n      break;\n    }\n\n    address += 4;\n    if (end_address && address > end_address) {\n      // Hmm....\n      LOGPPC(\"Ran over function bounds! {:08X}-{:08X}\", start_address,\n             end_address);\n      break;\n    }\n  }\n\n  if (end_address && address + 4 < end_address) {\n    // Ran under the expected value - since we probably got the initial bounds\n    // from someplace valid (like method hints) this may indicate an error.\n    // It's also possible that we guessed in hole-filling and there's another\n    // function below this one.\n    LOGPPC(\"Function ran under: {:08X}-{:08X} ended at {:08X}\", start_address,\n           end_address, address + 4);\n  }\n  function->set_end_address(address);\n\n  // If there's spare bits at the end, split the function.\n  // TODO(benvanik): splitting?\n\n  // TODO(benvanik): find and record stack information\n  // - look for __savegprlr_* and __restgprlr_*\n  // - if present, flag function as needing a stack\n  // - record prolog/epilog lengths/stack size/etc\n\n  if (debug_info) {\n    debug_info->set_address_reference_count(address_reference_count);\n    debug_info->set_instruction_result_count(instruction_result_count);\n  }\n\n  LOGPPC(\"Finished analyzing {:08X}\", start_address);\n  return true;\n}\n\nstd::vector<BlockInfo> PPCScanner::FindBlocks(GuestFunction* function) {\n  Memory* memory = frontend_->memory();\n\n  std::map<uint32_t, BlockInfo> block_map;\n\n  uint32_t start_address = function->address();\n  uint32_t end_address = function->end_address();\n  bool in_block = false;\n  uint32_t block_start = 0;\n  for (uint32_t address = start_address; address <= end_address; address += 4) {\n    uint32_t code =\n        xe::load_and_swap<uint32_t>(memory->TranslateVirtual(address));\n    if (!code) {\n      continue;\n    }\n    auto opcode = xe::cpu::ppc::LookupOpcode(code);\n\n    if (!in_block) {\n      in_block = true;\n      block_start = address;\n    }\n\n    bool ends_block = false;\n    if (code == 0x4E800020) {\n      // blr -- unconditional branch to LR.\n      ends_block = true;\n    } else if (code == 0x4E800420) {\n      // bctr -- unconditional branch to CTR.\n      // This is almost always a jump table.\n      // TODO(benvanik): decode jump tables.\n      ends_block = true;\n    } else if (opcode == PPCOpcode::bx) {\n      // b/ba/bl/bla\n      // uint32_t target =\n      //    (uint32_t)XEEXTS26(i.I.LI << 2) + (i.I.AA ? 0 : (int32_t)address);\n      ends_block = true;\n    } else if (opcode == PPCOpcode::bcx) {\n      // bc/bca/bcl/bcla\n      // uint32_t target =\n      //    (uint32_t)XEEXTS16(i.B.BD << 2) + (i.B.AA ? 0 : (int32_t)address);\n      ends_block = true;\n    } else if (opcode == PPCOpcode::bclrx) {\n      // bclr/bclrl\n      ends_block = true;\n    } else if (opcode == PPCOpcode::bcctrx) {\n      // bcctr/bcctrl\n      ends_block = true;\n    }\n\n    if (ends_block) {\n      in_block = false;\n      block_map[block_start] = {\n          block_start,\n          address,\n      };\n    }\n  }\n\n  if (in_block) {\n    block_map[block_start] = {\n        block_start,\n        end_address,\n    };\n  }\n\n  std::vector<BlockInfo> blocks;\n  for (auto it = block_map.begin(); it != block_map.end(); ++it) {\n    blocks.push_back(it->second);\n  }\n  return blocks;\n}\n\n}  // namespace ppc\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/ppc/ppc_scanner.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_PPC_PPC_SCANNER_H_\n#define XENIA_CPU_PPC_PPC_SCANNER_H_\n\n#include <vector>\n\n#include \"xenia/cpu/function.h\"\n#include \"xenia/cpu/function_debug_info.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace ppc {\n\nclass PPCFrontend;\n\nstruct BlockInfo {\n  uint32_t start_address;\n  uint32_t end_address;\n};\n\nclass PPCScanner {\n public:\n  explicit PPCScanner(PPCFrontend* frontend);\n  ~PPCScanner();\n\n  bool Scan(GuestFunction* function, FunctionDebugInfo* debug_info);\n\n  std::vector<BlockInfo> FindBlocks(GuestFunction* function);\n\n private:\n  bool IsRestGprLr(uint32_t address);\n\n  PPCFrontend* frontend_ = nullptr;\n};\n\n}  // namespace ppc\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_PPC_PPC_SCANNER_H_\n"
  },
  {
    "path": "src/xenia/cpu/ppc/ppc_translator.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/ppc/ppc_translator.h\"\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/byte_order.h\"\n#include \"xenia/base/memory.h\"\n#include \"xenia/base/profiling.h\"\n#include \"xenia/base/reset_scope.h\"\n#include \"xenia/base/string.h\"\n#include \"xenia/cpu/compiler/compiler_passes.h\"\n#include \"xenia/cpu/cpu_flags.h\"\n#include \"xenia/cpu/ppc/ppc_frontend.h\"\n#include \"xenia/cpu/ppc/ppc_hir_builder.h\"\n#include \"xenia/cpu/ppc/ppc_opcode_info.h\"\n#include \"xenia/cpu/ppc/ppc_scanner.h\"\n#include \"xenia/cpu/processor.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace ppc {\n\nusing xe::cpu::backend::Backend;\nusing xe::cpu::compiler::Compiler;\nnamespace passes = xe::cpu::compiler::passes;\n\nPPCTranslator::PPCTranslator(PPCFrontend* frontend) : frontend_(frontend) {\n  Backend* backend = frontend->processor()->backend();\n\n  scanner_.reset(new PPCScanner(frontend));\n  builder_.reset(new PPCHIRBuilder(frontend));\n  compiler_.reset(new Compiler(frontend->processor()));\n  assembler_ = backend->CreateAssembler();\n  assembler_->Initialize();\n\n  bool validate = cvars::validate_hir;\n\n  // Merge blocks early. This will let us use more context in other passes.\n  // The CFG is required for simplification and dirtied by it.\n  compiler_->AddPass(std::make_unique<passes::ControlFlowAnalysisPass>());\n  compiler_->AddPass(std::make_unique<passes::ControlFlowSimplificationPass>());\n\n  // Passes are executed in the order they are added. Multiple of the same\n  // pass type may be used.\n  if (validate) compiler_->AddPass(std::make_unique<passes::ValidationPass>());\n  compiler_->AddPass(std::make_unique<passes::ContextPromotionPass>());\n  if (validate) compiler_->AddPass(std::make_unique<passes::ValidationPass>());\n\n  // Grouped simplification + constant propagation.\n  // Loops until no changes are made.\n  auto sap = std::make_unique<passes::ConditionalGroupPass>();\n  sap->AddPass(std::make_unique<passes::SimplificationPass>());\n  if (validate) sap->AddPass(std::make_unique<passes::ValidationPass>());\n  sap->AddPass(std::make_unique<passes::ConstantPropagationPass>());\n  if (validate) sap->AddPass(std::make_unique<passes::ValidationPass>());\n  compiler_->AddPass(std::move(sap));\n\n  if (backend->machine_info()->supports_extended_load_store) {\n    // Backend supports the advanced LOAD/STORE instructions.\n    // These will save us a lot of HIR opcodes.\n    compiler_->AddPass(\n        std::make_unique<passes::MemorySequenceCombinationPass>());\n    if (validate)\n      compiler_->AddPass(std::make_unique<passes::ValidationPass>());\n  }\n  compiler_->AddPass(std::make_unique<passes::SimplificationPass>());\n  if (validate) compiler_->AddPass(std::make_unique<passes::ValidationPass>());\n  // compiler_->AddPass(std::make_unique<passes::DeadStoreEliminationPass>());\n  // if (validate)\n  // compiler_->AddPass(std::make_unique<passes::ValidationPass>());\n  compiler_->AddPass(std::make_unique<passes::DeadCodeEliminationPass>());\n  if (validate) compiler_->AddPass(std::make_unique<passes::ValidationPass>());\n\n  //// Removes all unneeded variables. Try not to add new ones after this.\n  // compiler_->AddPass(new passes::ValueReductionPass());\n  // if (validate) compiler_->AddPass(new passes::ValidationPass());\n\n  // Register allocation for the target backend.\n  // Will modify the HIR to add loads/stores.\n  // This should be the last pass before finalization, as after this all\n  // registers are assigned and ready to be emitted.\n  compiler_->AddPass(std::make_unique<passes::RegisterAllocationPass>(\n      backend->machine_info()));\n  if (validate) compiler_->AddPass(std::make_unique<passes::ValidationPass>());\n\n  // Must come last. The HIR is not really HIR after this.\n  compiler_->AddPass(std::make_unique<passes::FinalizationPass>());\n}\n\nPPCTranslator::~PPCTranslator() = default;\n\nbool PPCTranslator::Translate(GuestFunction* function,\n                              uint32_t debug_info_flags) {\n  SCOPE_profile_cpu_f(\"cpu\");\n\n  // Reset() all caching when we leave.\n  xe::make_reset_scope(builder_);\n  xe::make_reset_scope(compiler_);\n  xe::make_reset_scope(assembler_);\n  xe::make_reset_scope(&string_buffer_);\n\n  // NOTE: we only want to do this when required, as it's expensive to build.\n  if (cvars::disassemble_functions) {\n    debug_info_flags |= DebugInfoFlags::kDebugInfoAllDisasm;\n  }\n  if (cvars::trace_functions) {\n    debug_info_flags |= DebugInfoFlags::kDebugInfoTraceFunctions;\n  }\n  if (cvars::trace_function_coverage) {\n    debug_info_flags |= DebugInfoFlags::kDebugInfoTraceFunctionCoverage;\n  }\n  if (cvars::trace_function_references) {\n    debug_info_flags |= DebugInfoFlags::kDebugInfoTraceFunctionReferences;\n  }\n  if (cvars::trace_function_data) {\n    debug_info_flags |= DebugInfoFlags::kDebugInfoTraceFunctionData;\n  }\n  std::unique_ptr<FunctionDebugInfo> debug_info;\n  if (debug_info_flags) {\n    debug_info.reset(new FunctionDebugInfo());\n  }\n\n  // Scan the function to find its extents and gather debug data.\n  if (!scanner_->Scan(function, debug_info.get())) {\n    return false;\n  }\n\n  // Setup trace data, if needed.\n  if (debug_info_flags & DebugInfoFlags::kDebugInfoTraceFunctions) {\n    // Base trace data.\n    size_t trace_data_size = FunctionTraceData::SizeOfHeader();\n    if (debug_info_flags & DebugInfoFlags::kDebugInfoTraceFunctionCoverage) {\n      // Additional space for instruction coverage counts.\n      trace_data_size += FunctionTraceData::SizeOfInstructionCounts(\n          function->address(), function->end_address());\n    }\n    uint8_t* trace_data =\n        frontend_->processor()->AllocateFunctionTraceData(trace_data_size);\n    if (trace_data) {\n      function->trace_data().Reset(trace_data, trace_data_size,\n                                   function->address(),\n                                   function->end_address());\n    } else {\n      debug_info_flags &= ~(DebugInfoFlags::kDebugInfoTraceFunctions |\n                            DebugInfoFlags::kDebugInfoTraceFunctionCoverage);\n    }\n  }\n\n  // Stash source.\n  if (debug_info_flags & DebugInfoFlags::kDebugInfoDisasmSource) {\n    DumpSource(function, &string_buffer_);\n    debug_info->set_source_disasm(xe_strdup(string_buffer_.buffer()));\n    string_buffer_.Reset();\n  }\n\n  // Emit function.\n  uint32_t emit_flags = 0;\n  if (debug_info) {\n    emit_flags |= PPCHIRBuilder::EMIT_DEBUG_COMMENTS;\n  }\n  if (!builder_->Emit(function, emit_flags)) {\n    return false;\n  }\n\n  // Stash raw HIR.\n  if (debug_info_flags & DebugInfoFlags::kDebugInfoDisasmRawHir) {\n    builder_->Dump(&string_buffer_);\n    debug_info->set_raw_hir_disasm(xe_strdup(string_buffer_.buffer()));\n    string_buffer_.Reset();\n  }\n\n  // Compile/optimize/etc.\n  if (!compiler_->Compile(builder_.get())) {\n    return false;\n  }\n\n  // Stash optimized HIR.\n  if (debug_info_flags & DebugInfoFlags::kDebugInfoDisasmHir) {\n    builder_->Dump(&string_buffer_);\n    debug_info->set_hir_disasm(xe_strdup(string_buffer_.buffer()));\n    string_buffer_.Reset();\n  }\n\n  // Assemble to backend machine code.\n  if (!assembler_->Assemble(function, builder_.get(), debug_info_flags,\n                            std::move(debug_info))) {\n    return false;\n  }\n\n  return true;\n}\n\nvoid PPCTranslator::DumpSource(GuestFunction* function,\n                               StringBuffer* string_buffer) {\n  Memory* memory = frontend_->memory();\n\n  string_buffer->AppendFormat(\n      \"{} fn {:08X}-{:08X} {}\\n\", function->module()->name().c_str(),\n      function->address(), function->end_address(), function->name().c_str());\n\n  auto blocks = scanner_->FindBlocks(function);\n\n  uint32_t start_address = function->address();\n  uint32_t end_address = function->end_address();\n  auto block_it = blocks.begin();\n  for (uint32_t address = start_address, offset = 0; address <= end_address;\n       address += 4, offset++) {\n    uint32_t code =\n        xe::load_and_swap<uint32_t>(memory->TranslateVirtual(address));\n\n    // Check labels.\n    if (block_it != blocks.end() && block_it->start_address == address) {\n      string_buffer->AppendFormat(\"{:08X}          loc_{:08X}:\\n\", address,\n                                  address);\n      ++block_it;\n    }\n\n    string_buffer->AppendFormat(\"{:08X} {:08X}   \", address, code);\n    DisasmPPC(address, code, string_buffer);\n    string_buffer->Append('\\n');\n  }\n}\n\n}  // namespace ppc\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/ppc/ppc_translator.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_PPC_PPC_TRANSLATOR_H_\n#define XENIA_CPU_PPC_PPC_TRANSLATOR_H_\n\n#include <memory>\n\n#include \"xenia/base/string_buffer.h\"\n#include \"xenia/cpu/backend/assembler.h\"\n#include \"xenia/cpu/compiler/compiler.h\"\n#include \"xenia/cpu/function.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace ppc {\n\nclass PPCFrontend;\nclass PPCHIRBuilder;\nclass PPCScanner;\n\nclass PPCTranslator {\n public:\n  explicit PPCTranslator(PPCFrontend* frontend);\n  ~PPCTranslator();\n\n  bool Translate(GuestFunction* function, uint32_t debug_info_flags);\n\n private:\n  void DumpSource(GuestFunction* function, StringBuffer* string_buffer);\n\n  PPCFrontend* frontend_;\n  std::unique_ptr<PPCScanner> scanner_;\n  std::unique_ptr<PPCHIRBuilder> builder_;\n  std::unique_ptr<compiler::Compiler> compiler_;\n  std::unique_ptr<backend::Assembler> assembler_;\n\n  StringBuffer string_buffer_;\n};\n\n}  // namespace ppc\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_PPC_PPC_TRANSLATOR_H_\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/README.md",
    "content": "# Codegen Tests\n\nThis directory contains the test assets used by the automated codegen test\nrunner.\n\nEach test is structured as a source `[name].s` PPC assembly file and the\ngenerated outputs. The outputs are made using the custom build of binutils\nsetup when `xenia-build gentests` is called and are checked in to make it easier\nto run the tests on Windows.\n\nTests are run using the `xenia-test` app or via `xenia-build test`.\n\n## Execution\n\n**On Xenia**: The test binary is placed into memory at `0x82010000` and all other\nmemory is zeroed.\n\nAll registers are reset to zero. In order to provide useful inputs tests can\nspecify `#_ REGISTER_IN` values.\n\nThe code is jumped into at the starting address and executed until a `blr`\ninstruction is encountered.\n\nAfter all instructions complete any `#_ REGISTER_OUT` values are checked and if\nthey do not match the test is failed.\n\n## Registers\n\nAll registers **except lr, r1, and r13** are available for usage by tests.\n\n## Annotations\n\nAnnotations can appear at any line in a file. If a number is required it can\nbe in either hex or decimal form, or IEEE if floating-point.\n\n### REGISTER_IN\n\n```\n#_ REGISTER_IN [register name] [register value]\n```\n\nSets the value of a register prior to executing the instructions.\n\nExamples:\n```\n#_ REGISTER_IN r4 0x1234\n#_ REGISTER_IN r4 5678\n```\n\n### REGISTER_OUT\n\n```\n#_ REGISTER_OUT [register name] [register value]\n```\n\nDefines the expected register value when the instructions have executed.\nIf after all instructions have completed the register value does not match\nthe value given here the test will fail.\n\nExamples:\n```\n#_ REGISTER_OUT r3 123\n```\n\nTODO: memory setup/assertions\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_add.s",
    "content": "test_add_1:\n  #_ REGISTER_IN r5 0x00100000\n  #_ REGISTER_IN r25 0x0000FFFF\n\n  add r11, r5, r25\n\n  blr\n  #_ REGISTER_OUT r5 0x00100000\n  #_ REGISTER_OUT r25 0x0000FFFF\n  #_ REGISTER_OUT r11 0x0010FFFF\n\ntest_add_1_constant:\n  lis r5, 0x10\n  li r25, -1\n  clrldi r25, r25, 48\n\n  add r11, r5, r25\n\n  blr\n  #_ REGISTER_OUT r5 0x00100000\n  #_ REGISTER_OUT r25 0x0000FFFF\n  #_ REGISTER_OUT r11 0x0010FFFF\n\ntest_add_2:\n  #_ REGISTER_IN r0 0x00100000\n  #_ REGISTER_IN r25 0x0000FFFF\n\n  add r11, r0, r25\n\n  blr\n  #_ REGISTER_OUT r0 0x00100000\n  #_ REGISTER_OUT r25 0x0000FFFF\n  #_ REGISTER_OUT r11 0x0010FFFF\n\ntest_add_2_constant:\n  lis r0, 0x10\n  li r25, -1\n  clrldi r25, r25, 48\n\n  add r11, r0, r25\n\n  blr\n  #_ REGISTER_OUT r0 0x00100000\n  #_ REGISTER_OUT r25 0x0000FFFF\n  #_ REGISTER_OUT r11 0x0010FFFF\n\ntest_add_cr_1:\n  #_ REGISTER_IN r5 0x00100000\n  #_ REGISTER_IN r25 0x0000FFFF\n\n  add. r11, r5, r25\n  mfcr r12\n\n  blr\n  #_ REGISTER_OUT r5 0x00100000\n  #_ REGISTER_OUT r25 0x0000FFFF\n  #_ REGISTER_OUT r11 0x0010FFFF\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_add_cr_1_constant:\n  lis r5, 0x10\n  li r25, -1\n  clrldi r25, r25, 48\n\n  add. r11, r5, r25\n  mfcr r12\n\n  blr\n  #_ REGISTER_OUT r5 0x00100000\n  #_ REGISTER_OUT r25 0x0000FFFF\n  #_ REGISTER_OUT r11 0x0010FFFF\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_add_cr_2:\n  #_ REGISTER_IN r0 0x00100000\n  #_ REGISTER_IN r25 0x0000FFFF\n\n  add. r11, r0, r25\n  mfcr r12\n\n  blr\n  #_ REGISTER_OUT r0 0x00100000\n  #_ REGISTER_OUT r25 0x0000FFFF\n  #_ REGISTER_OUT r11 0x0010FFFF\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_add_cr_2_constant:\n  lis r0, 0x10\n  li r25, -1\n  clrldi r25, r25, 48\n\n  add. r11, r0, r25\n  mfcr r12\n\n  blr\n  #_ REGISTER_OUT r0 0x00100000\n  #_ REGISTER_OUT r25 0x0000FFFF\n  #_ REGISTER_OUT r11 0x0010FFFF\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_add_cr_3:\n  #_ REGISTER_IN r0 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r25 0x000000000000FFFF\n\n  add. r11, r0, r25\n  mfcr r12\n\n  blr\n  #_ REGISTER_OUT r0 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r25 0x000000000000FFFF\n  #_ REGISTER_OUT r11 0x000000000000FFFE\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_add_cr_3_constant:\n  li r0, -1\n  li r25, -1\n  clrldi r25, r25, 48\n\n  add. r11, r0, r25\n  mfcr r12\n\n  blr\n  #_ REGISTER_OUT r0 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r25 0x000000000000FFFF\n  #_ REGISTER_OUT r11 0x000000000000FFFE\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_add_cr_4:\n  #_ REGISTER_IN r0 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r25 0x0000000000000001\n\n  add. r11, r0, r25\n  mfcr r12\n\n  blr\n  #_ REGISTER_OUT r0 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r25 0x0000000000000001\n  #_ REGISTER_OUT r11 0x0000000000000000\n  #_ REGISTER_OUT r12 0x20000000\n\ntest_add_cr_4_constant:\n  li r0, -1\n  li r25, 1\n\n  add. r11, r0, r25\n  mfcr r12\n\n  blr\n  #_ REGISTER_OUT r0 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r25 0x0000000000000001\n  #_ REGISTER_OUT r11 0x0000000000000000\n  #_ REGISTER_OUT r12 0x20000000\n\ntest_add_cr_5:\n  #_ REGISTER_IN r0 -50\n  #_ REGISTER_IN r25 -25\n\n  add. r11, r0, r25\n  mfcr r12\n\n  blr\n  #_ REGISTER_OUT r0 -50\n  #_ REGISTER_OUT r25 -25\n  #_ REGISTER_OUT r11 -75\n  #_ REGISTER_OUT r12 0x80000000\n\ntest_add_cr_5_constant:\n  li r0, -50\n  li r25, -25\n\n  add. r11, r0, r25\n  mfcr r12\n\n  blr\n  #_ REGISTER_OUT r0 -50\n  #_ REGISTER_OUT r25 -25\n  #_ REGISTER_OUT r11 -75\n  #_ REGISTER_OUT r12 0x80000000\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_addc.s",
    "content": "test_addc_1:\n  #_ REGISTER_IN r4 1\n  #_ REGISTER_IN r5 2\n  addc r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 3\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 2\n  #_ REGISTER_OUT r6 0\n\ntest_addc_1_constant:\n  li r4, 1\n  li r5, 2\n  addc r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 3\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 2\n  #_ REGISTER_OUT r6 0\n\ntest_addc_2:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 0\n  addc r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0\n  #_ REGISTER_OUT r6 0\n\ntest_addc_2_constant:\n  li r4, -1\n  li r5, 0\n  addc r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0\n  #_ REGISTER_OUT r6 0\n\ntest_addc_3:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 1\n  addc r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 1\n  #_ REGISTER_OUT r6 1\n\ntest_addc_3_constant:\n  li r4, -1\n  li r5, 1\n  addc r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 1\n  #_ REGISTER_OUT r6 1\n\ntest_addc_4:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 123\n  addc r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0x000000000000007A\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 123\n  #_ REGISTER_OUT r6 1\n\ntest_addc_4_constant:\n  li r4, -1\n  li r5, 123\n  addc r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0x000000000000007A\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 123\n  #_ REGISTER_OUT r6 1\n\ntest_addc_5:\n  #_ REGISTER_IN r4 0x7FFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 0xFFFFFFFFFFFFFFFF\n  addc r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0x7FFFFFFFFFFFFFFE\n  #_ REGISTER_OUT r4 0x7FFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r6 1\n\ntest_addc_5_constant:\n  li r5, -1\n  srdi r4, r5, 1\n  addc r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0x7FFFFFFFFFFFFFFE\n  #_ REGISTER_OUT r4 0x7FFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r6 1\n\ntest_addc_cr_1:\n  #_ REGISTER_IN r4 1\n  #_ REGISTER_IN r5 2\n  addc. r3, r4, r5\n  adde r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 3\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 2\n  #_ REGISTER_OUT r6 0\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_addc_cr_1_constant:\n  li r4, 1\n  li r5, 2\n  addc. r3, r4, r5\n  adde r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 3\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 2\n  #_ REGISTER_OUT r6 0\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_addc_cr_2:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 0\n  addc. r3, r4, r5\n  adde r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0\n  #_ REGISTER_OUT r6 0\n  #_ REGISTER_OUT r12 0x80000000\n\ntest_addc_cr_2_constant:\n  li r4, -1\n  li r5, 0\n  addc. r3, r4, r5\n  adde r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0\n  #_ REGISTER_OUT r6 0\n  #_ REGISTER_OUT r12 0x80000000\n\ntest_addc_cr_3:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 1\n  addc. r3, r4, r5\n  adde r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 1\n  #_ REGISTER_OUT r6 1\n  #_ REGISTER_OUT r12 0x20000000\n\ntest_addc_cr_3_constant:\n  li r4, -1\n  li r5, 1\n  addc. r3, r4, r5\n  adde r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 1\n  #_ REGISTER_OUT r6 1\n  #_ REGISTER_OUT r12 0x20000000\n\ntest_addc_cr_4:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 123\n  addc. r3, r4, r5\n  adde r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x000000000000007A\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 123\n  #_ REGISTER_OUT r6 1\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_addc_cr_4_constant:\n  li r4, -1\n  li r5, 123\n  addc. r3, r4, r5\n  adde r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x000000000000007A\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 123\n  #_ REGISTER_OUT r6 1\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_addc_cr_5:\n  #_ REGISTER_IN r4 0x7FFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 0xFFFFFFFFFFFFFFFF\n  addc. r3, r4, r5\n  adde r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x7FFFFFFFFFFFFFFE\n  #_ REGISTER_OUT r4 0x7FFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r6 1\n  #_ REGISTER_OUT r12 0x80000000\n\ntest_addc_cr_5_constant:\n  li r5, -1\n  srdi r4, r5, 1\n  addc. r3, r4, r5\n  adde r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x7FFFFFFFFFFFFFFE\n  #_ REGISTER_OUT r4 0x7FFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r6 1\n  #_ REGISTER_OUT r12 0x80000000\n\ntest_addc_cr_6:\n  #_ REGISTER_IN r4 0x7FFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 2\n  addc. r3, r4, r5\n  adde r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x8000000000000001\n  #_ REGISTER_OUT r4 0x7FFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 2\n  #_ REGISTER_OUT r6 1\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_addc_cr_6_constant:\n  li r4, -1\n  srdi r4, r4, 1\n  li r5, 2\n  addc. r3, r4, r5\n  adde r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x8000000000000001\n  #_ REGISTER_OUT r4 0x7FFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 2\n  #_ REGISTER_OUT r6 1\n  #_ REGISTER_OUT r12 0x40000000\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_adde.s",
    "content": "test_adde_1:\n  #_ REGISTER_IN r4 1\n  #_ REGISTER_IN r5 2\n  adde r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 3\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 2\n  #_ REGISTER_OUT r6 0\n\ntest_adde_1_constant:\n  li r4, 1\n  li r5, 2\n  adde r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 3\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 2\n  #_ REGISTER_OUT r6 0\n\ntest_adde_2:\n  #_ REGISTER_IN r4 1\n  #_ REGISTER_IN r5 2\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1 # CA=1\n  adde r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 4\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 2\n  #_ REGISTER_OUT r6 0\n\ntest_adde_2_constant:\n  li r4, 1\n  li r5, 2\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1 # CA=1\n  adde r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 4\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 2\n  #_ REGISTER_OUT r6 0\n\ntest_adde_3:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 0\n  adde r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0\n  #_ REGISTER_OUT r6 0\n\ntest_adde_3_constant:\n  li r4, -1\n  li r5, 0\n  adde r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0\n  #_ REGISTER_OUT r6 0\n\ntest_adde_4:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 0\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1 # CA=1\n  adde r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0\n  #_ REGISTER_OUT r6 1\n\ntest_adde_4_constant:\n  li r4, -1\n  li r5, 0\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1 # CA=1\n  adde r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0\n  #_ REGISTER_OUT r6 1\n\ntest_adde_5:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 1\n  adde r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 1\n  #_ REGISTER_OUT r6 1\n\ntest_adde_5_constant:\n  li r4, -1\n  li r5, 1\n  adde r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 1\n  #_ REGISTER_OUT r6 1\n\ntest_adde_6:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 1\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1 # CA=1\n  adde r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 1\n  #_ REGISTER_OUT r6 1\n\ntest_adde_6_constant:\n  li r4, -1\n  li r5, 1\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1 # CA=1\n  adde r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 1\n  #_ REGISTER_OUT r6 1\n\ntest_adde_7:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 123\n  adde r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0x000000000000007A\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 123\n  #_ REGISTER_OUT r6 1\n\ntest_adde_7_constant:\n  li r4, -1\n  li r5, 123\n  adde r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0x000000000000007A\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 123\n  #_ REGISTER_OUT r6 1\n\ntest_adde_8:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 123\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1 # CA=1\n  adde r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0x000000000000007B\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 123\n  #_ REGISTER_OUT r6 1\n\ntest_adde_8_constant:\n  li r4, -1\n  li r5, 123\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1 # CA=1\n  adde r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0x000000000000007B\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 123\n  #_ REGISTER_OUT r6 1\n\ntest_adde_9:\n  #_ REGISTER_IN r4 0x7FFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 0xFFFFFFFFFFFFFFFF\n  adde r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0x7FFFFFFFFFFFFFFE\n  #_ REGISTER_OUT r4 0x7FFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r6 1\n\ntest_adde_9_constant:\n  li r5, -1\n  srdi r4, r5, 1\n  adde r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0x7FFFFFFFFFFFFFFE\n  #_ REGISTER_OUT r4 0x7FFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r6 1\n\ntest_adde_10:\n  #_ REGISTER_IN r4 0x7FFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 0xFFFFFFFFFFFFFFFF\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1 # CA=1\n  adde r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0x7FFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0x7FFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r6 1\n\ntest_adde_10_constant:\n  li r5, -1\n  srdi r4, r5, 1\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1 # CA=1\n  adde r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0x7FFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0x7FFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r6 1\n\ntest_adde_cr_1:\n  #_ REGISTER_IN r4 1\n  #_ REGISTER_IN r5 2\n  adde. r3, r4, r5\n  mfcr r11\n  adde. r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 3\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 2\n  #_ REGISTER_OUT r6 0\n  #_ REGISTER_OUT r11 0x40000000\n  #_ REGISTER_OUT r12 0x20000000\n\ntest_adde_cr_1_constant:\n  li r4, 1\n  li r5, 2\n  adde. r3, r4, r5\n  mfcr r11\n  adde. r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 3\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 2\n  #_ REGISTER_OUT r6 0\n  #_ REGISTER_OUT r11 0x40000000\n  #_ REGISTER_OUT r12 0x20000000\n\ntest_adde_cr_2:\n  #_ REGISTER_IN r4 1\n  #_ REGISTER_IN r5 2\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1 # CA=1\n  adde. r3, r4, r5\n  mfcr r11\n  adde. r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 4\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 2\n  #_ REGISTER_OUT r6 0\n  #_ REGISTER_OUT r11 0x40000000\n  #_ REGISTER_OUT r12 0x20000000\n\ntest_adde_cr_2_constant:\n  li r4, 1\n  li r5, 2\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1 # CA=1\n  adde. r3, r4, r5\n  mfcr r11\n  adde. r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 4\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 2\n  #_ REGISTER_OUT r6 0\n  #_ REGISTER_OUT r11 0x40000000\n  #_ REGISTER_OUT r12 0x20000000\n\ntest_adde_cr_3:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 0\n  adde. r3, r4, r5\n  mfcr r11\n  adde. r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0\n  #_ REGISTER_OUT r6 0\n  #_ REGISTER_OUT r11 0x80000000\n  #_ REGISTER_OUT r12 0x20000000\n\ntest_adde_cr_3_constant:\n  li r4, -1\n  li r5, 0\n  adde. r3, r4, r5\n  mfcr r11\n  adde. r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0\n  #_ REGISTER_OUT r6 0\n  #_ REGISTER_OUT r11 0x80000000\n  #_ REGISTER_OUT r12 0x20000000\n\ntest_adde_cr_4:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 0\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1 # CA=1\n  adde. r3, r4, r5\n  mfcr r11\n  adde. r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0\n  #_ REGISTER_OUT r6 1\n  #_ REGISTER_OUT r11 0x20000000\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_adde_cr_4_constant:\n  li r4, -1\n  li r5, 0\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1 # CA=1\n  adde. r3, r4, r5\n  mfcr r11\n  adde. r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0\n  #_ REGISTER_OUT r6 1\n  #_ REGISTER_OUT r11 0x20000000\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_adde_cr_5:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 1\n  adde. r3, r4, r5\n  mfcr r11\n  adde. r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 1\n  #_ REGISTER_OUT r6 1\n  #_ REGISTER_OUT r11 0x20000000\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_adde_cr_5_constant:\n  li r4, -1\n  li r5, 1\n  adde. r3, r4, r5\n  mfcr r11\n  adde. r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 1\n  #_ REGISTER_OUT r6 1\n  #_ REGISTER_OUT r11 0x20000000\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_adde_cr_6:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 1\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1 # CA=1\n  adde. r3, r4, r5\n  mfcr r11\n  adde. r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 1\n  #_ REGISTER_OUT r6 1\n  #_ REGISTER_OUT r11 0x40000000\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_adde_cr_6_constant:\n  li r4, -1\n  li r5, 1\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1 # CA=1\n  adde. r3, r4, r5\n  mfcr r11\n  adde. r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 1\n  #_ REGISTER_OUT r6 1\n  #_ REGISTER_OUT r11 0x40000000\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_adde_cr_7:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 123\n  adde. r3, r4, r5\n  mfcr r11\n  adde. r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x000000000000007A\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 123\n  #_ REGISTER_OUT r6 1\n  #_ REGISTER_OUT r11 0x40000000\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_adde_cr_7_constant:\n  li r4, -1\n  li r5, 123\n  adde. r3, r4, r5\n  mfcr r11\n  adde. r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x000000000000007A\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 123\n  #_ REGISTER_OUT r6 1\n  #_ REGISTER_OUT r11 0x40000000\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_adde_cr_8:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 123\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1 # CA=1\n  adde. r3, r4, r5\n  mfcr r11\n  adde. r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x000000000000007B\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 123\n  #_ REGISTER_OUT r6 1\n  #_ REGISTER_OUT r11 0x40000000\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_adde_cr_8_constant:\n  li r4, -1\n  li r5, 123\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1 # CA=1\n  adde. r3, r4, r5\n  mfcr r11\n  adde. r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x000000000000007B\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 123\n  #_ REGISTER_OUT r6 1\n  #_ REGISTER_OUT r11 0x40000000\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_adde_cr_9:\n  #_ REGISTER_IN r4 0x7FFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 0xFFFFFFFFFFFFFFFF\n  adde. r3, r4, r5\n  mfcr r11\n  adde. r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x7FFFFFFFFFFFFFFE\n  #_ REGISTER_OUT r4 0x7FFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r6 1\n  #_ REGISTER_OUT r11 0x80000000\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_adde_cr_9_constant:\n  li r5, -1\n  srdi r4, r5, 1\n  adde. r3, r4, r5\n  mfcr r11\n  adde. r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x7FFFFFFFFFFFFFFE\n  #_ REGISTER_OUT r4 0x7FFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r6 1\n  #_ REGISTER_OUT r11 0x80000000\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_adde_cr_10:\n  #_ REGISTER_IN r4 0x7FFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 0xFFFFFFFFFFFFFFFF\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1 # CA=1\n  adde. r3, r4, r5\n  mfcr r11\n  adde. r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x7FFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0x7FFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r6 1\n  #_ REGISTER_OUT r11 0x80000000\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_adde_cr_10_constant:\n  li r5, -1\n  srdi r4, r5, 1\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1 # CA=1\n  adde. r3, r4, r5\n  mfcr r11\n  adde. r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x7FFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0x7FFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r6 1\n  #_ REGISTER_OUT r11 0x80000000\n  #_ REGISTER_OUT r12 0x40000000\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_addic.s",
    "content": "test_addic_1:\n  #_ REGISTER_IN r4 1\n  addic r4, r4, 1\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r4 2\n  #_ REGISTER_OUT r6 0\n\ntest_addic_1_constant:\n  li r4, 1\n  addic r4, r4, 1\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r4 2\n  #_ REGISTER_OUT r6 0\n\ntest_addic_2:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  addic r4, r4, 1\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r4 0\n  #_ REGISTER_OUT r6 1\n\ntest_addic_2_constant:\n  li r4, -1\n  addic r4, r4, 1\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r4 0\n  #_ REGISTER_OUT r6 1\n\ntest_addic_3:\n  #_ REGISTER_IN r4 0xFFFFFFFF\n  addic r4, r4, 1\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r4 0x0000000100000000\n  #_ REGISTER_OUT r6 1\n\ntest_addic_3_constant:\n  li r4, 0xFFFFFFFF\n  srwi r4, r4, 0\n  addic r4, r4, 1\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r4 0x0000000100000000\n  #_ REGISTER_OUT r6 1\n\ntest_addic_cr_1:\n  #_ REGISTER_IN r4 1\n  addic. r4, r4, 1\n  adde r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r4 2\n  #_ REGISTER_OUT r6 0\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_addic_cr_1_constant:\n  li r4, 1\n  addic. r4, r4, 1\n  adde r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r4 2\n  #_ REGISTER_OUT r6 0\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_addic_cr_2:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  addic. r4, r4, 1\n  adde r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r4 0\n  #_ REGISTER_OUT r6 1\n  #_ REGISTER_OUT r12 0x20000000\n\ntest_addic_cr_2_constant:\n  li r4, -1\n  addic. r4, r4, 1\n  adde r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r4 0\n  #_ REGISTER_OUT r6 1\n  #_ REGISTER_OUT r12 0x20000000\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_addis.s",
    "content": "test_addis_1:\n  #_ REGISTER_IN r0 1234\n  #_ REGISTER_IN r4 1\n  addis r3, r0, 1\n  blr\n  #_ REGISTER_OUT r0 1234\n  #_ REGISTER_OUT r3 0x10000\n  #_ REGISTER_OUT r4 1\n\ntest_addis_1_constant:\n  li r0, 1234\n  li r4, 1\n  addis r3, r0, 1\n  blr\n  #_ REGISTER_OUT r0 1234\n  #_ REGISTER_OUT r3 0x10000\n  #_ REGISTER_OUT r4 1\n\ntest_addis_2:\n  #_ REGISTER_IN r4 1234\n  #_ REGISTER_IN r5 1\n  addis r3, r4, 1\n  blr\n  #_ REGISTER_OUT r3 0x104D2\n  #_ REGISTER_OUT r4 1234\n\ntest_addis_2_constant:\n  li r4, 1234\n  li r5, 1\n  addis r3, r4, 1\n  blr\n  #_ REGISTER_OUT r3 0x104D2\n  #_ REGISTER_OUT r4 1234\n\ntest_lis_1:\n  #_ REGISTER_IN r0 1234\n  lis r3, 1\n  blr\n  #_ REGISTER_OUT r0 1234\n  #_ REGISTER_OUT r3 0x10000\n\ntest_lis_1_constant:\n  li r0, 1234\n  lis r3, 1\n  blr\n  #_ REGISTER_OUT r0 1234\n  #_ REGISTER_OUT r3 0x10000\n\ntest_lis_2:\n  #_ REGISTER_IN r0 1234\n  lis r3, -1\n  blr\n  #_ REGISTER_OUT r0 1234\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFF0000\n\ntest_lis_2_constant:\n  li r0, 1234\n  lis r3, -1\n  blr\n  #_ REGISTER_OUT r0 1234\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFF0000\n\ntest_subis_1:\n  #_ REGISTER_IN r4 1234\n  #_ REGISTER_IN r5 1\n  subis r3, r4, 1\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFF04D2\n  #_ REGISTER_OUT r4 1234\n\ntest_subis_1_constant:\n  li r4, 1234\n  li r5, 1\n  subis r3, r4, 1\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFF04D2\n  #_ REGISTER_OUT r4 1234\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_addme.s",
    "content": "test_addme_1:\n  #_ REGISTER_IN r4 1\n  addme r3, r4\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r6 1\n\ntest_addme_1_constant:\n  li r4, 1\n  addme r3, r4\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r6 1\n\ntest_addme_2:\n  #_ REGISTER_IN r4 1\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1 # CA=1\n  addme r3, r4\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r6 1\n\ntest_addme_2_constant:\n  li r4, 1\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1 # CA=1\n  addme r3, r4\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r6 1\n\ntest_addme_3:\n  #_ REGISTER_IN r4 12\n  addme r3, r4\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 11\n  #_ REGISTER_OUT r4 12\n  #_ REGISTER_OUT r6 1\n\ntest_addme_3_constant:\n  li r4, 12\n  addme r3, r4\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 11\n  #_ REGISTER_OUT r4 12\n  #_ REGISTER_OUT r6 1\n\ntest_addme_4:\n  #_ REGISTER_IN r4 12\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1 # CA=1\n  addme r3, r4\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 12\n  #_ REGISTER_OUT r4 12\n  #_ REGISTER_OUT r6 1\n\ntest_addme_4_constant:\n  li r4, 12\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1 # CA=1\n  addme r3, r4\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 12\n  #_ REGISTER_OUT r4 12\n  #_ REGISTER_OUT r6 1\n\ntest_addme_5:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  addme r3, r4\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFE\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r6 1\n\ntest_addme_5_constant:\n  li r4, -1\n  addme r3, r4\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFE\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r6 1\n\ntest_addme_6:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1 # CA=1\n  addme r3, r4\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r6 1\n\ntest_addme_6_constant:\n  li r4, -1\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1 # CA=1\n  addme r3, r4\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r6 1\n\ntest_addme_7:\n  #_ REGISTER_IN r4 0\n  addme r3, r4\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0\n  #_ REGISTER_OUT r6 0\n\ntest_addme_7_constant:\n  li r4, 0\n  addme r3, r4\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0\n  #_ REGISTER_OUT r6 0\n\ntest_addme_8:\n  #_ REGISTER_IN r4 0\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1 # CA=1\n  addme r3, r4\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0\n  #_ REGISTER_OUT r6 1\n\ntest_addme_8_constant:\n  li r4, 0\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1 # CA=1\n  addme r3, r4\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0\n  #_ REGISTER_OUT r6 1\n\ntest_addme_cr_1:\n  #_ REGISTER_IN r4 1\n  addme. r3, r4\n  adde r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r6 1\n  #_ REGISTER_OUT r12 0x20000000\n\ntest_addme_cr_1_constant:\n  li r4, 1\n  addme. r3, r4\n  adde r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r6 1\n  #_ REGISTER_OUT r12 0x20000000\n\ntest_addme_cr_2:\n  #_ REGISTER_IN r4 1\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1 # CA=1\n  addme. r3, r4\n  adde r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r6 1\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_addme_cr_2_constant:\n  li r4, 1\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1 # CA=1\n  addme. r3, r4\n  adde r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r6 1\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_addme_cr_3:\n  #_ REGISTER_IN r4 12\n  addme. r3, r4\n  adde r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 11\n  #_ REGISTER_OUT r4 12\n  #_ REGISTER_OUT r6 1\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_addme_cr_3_constant:\n  li r4, 12\n  addme. r3, r4\n  adde r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 11\n  #_ REGISTER_OUT r4 12\n  #_ REGISTER_OUT r6 1\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_addme_cr_4:\n  #_ REGISTER_IN r4 12\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1 # CA=1\n  addme. r3, r4\n  adde r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 12\n  #_ REGISTER_OUT r4 12\n  #_ REGISTER_OUT r6 1\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_addme_cr_4_constant:\n  li r4, 12\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1 # CA=1\n  addme. r3, r4\n  adde r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 12\n  #_ REGISTER_OUT r4 12\n  #_ REGISTER_OUT r6 1\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_addme_cr_5:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  addme. r3, r4\n  adde r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFE\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r6 1\n  #_ REGISTER_OUT r12 0x80000000\n\ntest_addme_cr_5_constant:\n  li r4, -1\n  addme. r3, r4\n  adde r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFE\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r6 1\n  #_ REGISTER_OUT r12 0x80000000\n\ntest_addme_cr_6:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1 # CA=1\n  addme. r3, r4\n  adde r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r6 1\n  #_ REGISTER_OUT r12 0x80000000\n\ntest_addme_cr_6_constant:\n  li r4, -1\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1 # CA=1\n  addme. r3, r4\n  adde r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r6 1\n  #_ REGISTER_OUT r12 0x80000000\n\ntest_addme_cr_7:\n  #_ REGISTER_IN r4 0\n  addme. r3, r4\n  adde r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0\n  #_ REGISTER_OUT r6 0\n  #_ REGISTER_OUT r12 0x80000000\n\ntest_addme_cr_7_constant:\n  li r4, 0\n  addme. r3, r4\n  adde r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0\n  #_ REGISTER_OUT r6 0\n  #_ REGISTER_OUT r12 0x80000000\n\ntest_addme_cr_8:\n  #_ REGISTER_IN r4 0\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1 # CA=1\n  addme. r3, r4\n  adde r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0\n  #_ REGISTER_OUT r6 1\n  #_ REGISTER_OUT r12 0x20000000\n\ntest_addme_cr_8_constant:\n  li r4, 0\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1 # CA=1\n  addme. r3, r4\n  adde r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0\n  #_ REGISTER_OUT r6 1\n  #_ REGISTER_OUT r12 0x20000000\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_addze.s",
    "content": "test_addze_1:\n  #_ REGISTER_IN r4 1\n  addze r3, r4\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r6 0\n\ntest_addze_1_constant:\n  li r4, 1\n  addze r3, r4\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r6 0\n\ntest_addze_2:\n  #_ REGISTER_IN r4 1\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1 # CA=1\n  addze r3, r4\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 2\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r6 0\n\ntest_addze_2_constant:\n  li r4, 1\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1 # CA=1\n  addze r3, r4\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 2\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r6 0\n\ntest_addze_3:\n  #_ REGISTER_IN r4 12\n  addze r3, r4\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 12\n  #_ REGISTER_OUT r4 12\n  #_ REGISTER_OUT r6 0\n\ntest_addze_3_constant:\n  li r4, 12\n  addze r3, r4\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 12\n  #_ REGISTER_OUT r4 12\n  #_ REGISTER_OUT r6 0\n\ntest_addze_4:\n  #_ REGISTER_IN r4 12\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1 # CA=1\n  addze r3, r4\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 13\n  #_ REGISTER_OUT r4 12\n  #_ REGISTER_OUT r6 0\n\ntest_addze_4_constant:\n  li r4, 12\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1 # CA=1\n  addze r3, r4\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 13\n  #_ REGISTER_OUT r4 12\n  #_ REGISTER_OUT r6 0\n\ntest_addze_5:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  addze r3, r4\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r6 0\n\ntest_addze_5_constant:\n  li r4, -1\n  addze r3, r4\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r6 0\n\ntest_addze_6:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1 # CA=1\n  addze r3, r4\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r6 1\n\ntest_addze_6_constant:\n  li r4, -1\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1 # CA=1\n  addze r3, r4\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r6 1\n\ntest_addze_7:\n  #_ REGISTER_IN r4 0\n  addze r3, r4\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0\n  #_ REGISTER_OUT r6 0\n\ntest_addze_7_constant:\n  li r4, 0\n  addze r3, r4\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0\n  #_ REGISTER_OUT r6 0\n\ntest_addze_8:\n  #_ REGISTER_IN r4 0\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1 # CA=1\n  addze r3, r4\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 0\n  #_ REGISTER_OUT r6 0\n\ntest_addze_8_constant:\n  li r4, 0\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1 # CA=1\n  addze r3, r4\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 0\n  #_ REGISTER_OUT r6 0\n\ntest_addze_cr_1:\n  #_ REGISTER_IN r4 1\n  addze. r3, r4\n  adde r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r6 0\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_addze_cr_1_constant:\n  li r4, 1\n  addze. r3, r4\n  adde r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r6 0\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_addze_cr_2:\n  #_ REGISTER_IN r4 1\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1 # CA=1\n  addze. r3, r4\n  adde r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 2\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r6 0\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_addze_cr_2_constant:\n  li r4, 1\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1 # CA=1\n  addze. r3, r4\n  adde r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 2\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r6 0\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_addze_cr_3:\n  #_ REGISTER_IN r4 12\n  addze. r3, r4\n  adde r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 12\n  #_ REGISTER_OUT r4 12\n  #_ REGISTER_OUT r6 0\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_addze_cr_3_constant:\n  li r4, 12\n  addze. r3, r4\n  adde r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 12\n  #_ REGISTER_OUT r4 12\n  #_ REGISTER_OUT r6 0\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_addze_cr_4:\n  #_ REGISTER_IN r4 12\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1 # CA=1\n  addze. r3, r4\n  adde r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 13\n  #_ REGISTER_OUT r4 12\n  #_ REGISTER_OUT r6 0\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_addze_cr_4_constant:\n  li r4, 12\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1 # CA=1\n  addze. r3, r4\n  adde r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 13\n  #_ REGISTER_OUT r4 12\n  #_ REGISTER_OUT r6 0\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_addze_cr_5:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  addze. r3, r4\n  adde r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r6 0\n  #_ REGISTER_OUT r12 0x80000000\n\ntest_addze_cr_5_constant:\n  li r4, -1\n  addze. r3, r4\n  adde r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r6 0\n  #_ REGISTER_OUT r12 0x80000000\n\ntest_addze_cr_6:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1 # CA=1\n  addze. r3, r4\n  adde r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r6 1\n  #_ REGISTER_OUT r12 0x20000000\n\ntest_addze_cr_6_constant:\n  li r4, -1\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1 # CA=1\n  addze. r3, r4\n  adde r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r6 1\n  #_ REGISTER_OUT r12 0x20000000\n\ntest_addze_cr_7:\n  #_ REGISTER_IN r4 0\n  addze. r3, r4\n  adde r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0\n  #_ REGISTER_OUT r6 0\n  #_ REGISTER_OUT r12 0x20000000\n\ntest_addze_cr_7_constant:\n  li r4, 0\n  addze. r3, r4\n  adde r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0\n  #_ REGISTER_OUT r6 0\n  #_ REGISTER_OUT r12 0x20000000\n\ntest_addze_cr_8:\n  #_ REGISTER_IN r4 0\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1 # CA=1\n  addze. r3, r4\n  adde r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 0\n  #_ REGISTER_OUT r6 0\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_addze_cr_8_constant:\n  li r4, 0\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1 # CA=1\n  addze. r3, r4\n  adde r6, r0, r0\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 0\n  #_ REGISTER_OUT r6 0\n  #_ REGISTER_OUT r12 0x40000000\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_and.s",
    "content": "test_and_1:\n  #_ REGISTER_IN r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r25 0xFFFFFFFFFFFFFFFF\n  and r11, r5, r25\n  blr\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r25 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r11 0xFFFFFFFFFFFFFFFF\n\ntest_and_1_constant:\n  li r5, -1\n  li r25, -1\n  and r11, r5, r25\n  blr\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r25 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r11 0xFFFFFFFFFFFFFFFF\n\ntest_and_2:\n  #_ REGISTER_IN r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r25 0\n  and r11, r5, r25\n  blr\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r25 0\n  #_ REGISTER_OUT r11 0\n\ntest_and_2_constant:\n  li r5, -1\n  li r25, 0\n  and r11, r5, r25\n  blr\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r25 0\n  #_ REGISTER_OUT r11 0\n\ntest_and_3:\n  #_ REGISTER_IN r5 0\n  #_ REGISTER_IN r25 0xFFFFFFFFFFFFFFFF\n  and r11, r5, r25\n  blr\n  #_ REGISTER_OUT r5 0\n  #_ REGISTER_OUT r25 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r11 0\n\ntest_and_3_constant:\n  li r5, 0\n  li r25, -1\n  and r11, r5, r25\n  blr\n  #_ REGISTER_OUT r5 0\n  #_ REGISTER_OUT r25 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r11 0\n\ntest_and_4:\n  #_ REGISTER_IN r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r25 0x0000FFFF\n  and r11, r5, r25\n  blr\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r25 0x0000FFFF\n  #_ REGISTER_OUT r11 0x0000FFFF\n\ntest_and_4_constant:\n  li r5, -1\n  li r25, -1\n  clrldi r25, r25, 48\n  and r11, r5, r25\n  blr\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r25 0x0000FFFF\n  #_ REGISTER_OUT r11 0x0000FFFF\n\ntest_and_5:\n  #_ REGISTER_IN r0 0x100000FF\n  #_ REGISTER_IN r25 0x0000FFFF\n  and r11, r0, r25\n  blr\n  #_ REGISTER_OUT r0 0x100000FF\n  #_ REGISTER_OUT r25 0x0000FFFF\n  #_ REGISTER_OUT r11 0x000000FF\n\ntest_and_5_constant:\n  lis r0, 0x1000\n  ori r0, r0, 0xFF\n  li r25, -1\n  clrldi r25, r25, 48\n  and r11, r0, r25\n  blr\n  #_ REGISTER_OUT r0 0x100000FF\n  #_ REGISTER_OUT r25 0x0000FFFF\n  #_ REGISTER_OUT r11 0x000000FF\n\ntest_and_cr_1:\n  #_ REGISTER_IN r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r25 0xFFFFFFFFFFFFFFFF\n  and. r11, r5, r25\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r25 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r11 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r12 0x80000000\n\ntest_and_cr_1_constant:\n  li r5, -1\n  li r25, -1\n  and. r11, r5, r25\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r25 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r11 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r12 0x80000000\n\ntest_and_cr_2:\n  #_ REGISTER_IN r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r25 0\n  and. r11, r5, r25\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r25 0\n  #_ REGISTER_OUT r11 0\n  #_ REGISTER_OUT r12 0x20000000\n\ntest_and_cr_2_constant:\n  li r5, -1\n  li r25, 0\n  and. r11, r5, r25\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r25 0\n  #_ REGISTER_OUT r11 0\n  #_ REGISTER_OUT r12 0x20000000\n\ntest_and_cr_3:\n  #_ REGISTER_IN r5 0\n  #_ REGISTER_IN r25 0xFFFFFFFFFFFFFFFF\n  and. r11, r5, r25\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r5 0\n  #_ REGISTER_OUT r25 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r11 0\n  #_ REGISTER_OUT r12 0x20000000\n\ntest_and_cr_3_constant:\n  li r5, 0\n  li r25, -1\n  and. r11, r5, r25\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r5 0\n  #_ REGISTER_OUT r25 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r11 0\n  #_ REGISTER_OUT r12 0x20000000\n\ntest_and_cr_4:\n  #_ REGISTER_IN r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r25 0x0000FFFF\n  and. r11, r5, r25\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r25 0x0000FFFF\n  #_ REGISTER_OUT r11 0x0000FFFF\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_and_cr_4_constant:\n  li r5, -1\n  li r25, -1\n  clrldi r25, r25, 48\n  and. r11, r5, r25\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r25 0x0000FFFF\n  #_ REGISTER_OUT r11 0x0000FFFF\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_and_cr_5:\n  #_ REGISTER_IN r0 0x100000FF\n  #_ REGISTER_IN r25 0x0000FFFF\n  and. r11, r0, r25\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r0 0x100000FF\n  #_ REGISTER_OUT r25 0x0000FFFF\n  #_ REGISTER_OUT r11 0x000000FF\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_and_cr_5_constant:\n  lis r0, 0x1000\n  ori r0, r0, 0xFF\n  li r25, -1\n  clrldi r25, r25, 48\n  and. r11, r0, r25\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r0 0x100000FF\n  #_ REGISTER_OUT r25 0x0000FFFF\n  #_ REGISTER_OUT r11 0x000000FF\n  #_ REGISTER_OUT r12 0x40000000\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_andc.s",
    "content": "test_andc_1:\n  #_ REGISTER_IN r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r25 0xFFFFFFFFFFFFFFFF\n  andc r11, r5, r25\n  blr\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r25 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r11 0\n\ntest_andc_1_constant:\n  li r5, -1\n  li r25, -1\n  andc r11, r5, r25\n  blr\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r25 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r11 0\n\ntest_andc_2:\n  #_ REGISTER_IN r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r25 0\n  andc r11, r5, r25\n  blr\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r25 0\n  #_ REGISTER_OUT r11 0xFFFFFFFFFFFFFFFF\n\ntest_andc_2_constant:\n  li r5, -1\n  li r25, 0\n  andc r11, r5, r25\n  blr\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r25 0\n  #_ REGISTER_OUT r11 0xFFFFFFFFFFFFFFFF\n\ntest_andc_3:\n  #_ REGISTER_IN r5 0\n  #_ REGISTER_IN r25 0xFFFFFFFFFFFFFFFF\n  andc r11, r5, r25\n  blr\n  #_ REGISTER_OUT r5 0\n  #_ REGISTER_OUT r25 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r11 0\n\ntest_andc_3_constant:\n  li r5, 0\n  li r25, -1\n  andc r11, r5, r25\n  blr\n  #_ REGISTER_OUT r5 0\n  #_ REGISTER_OUT r25 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r11 0\n\ntest_andc_4:\n  #_ REGISTER_IN r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r25 0x0000FFFF\n  andc r11, r5, r25\n  blr\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r25 0x0000FFFF\n  #_ REGISTER_OUT r11 0xFFFFFFFFFFFF0000\n\ntest_andc_4_constant:\n  li r5, -1\n  li r25, -1\n  clrldi r25, r25, 48\n  andc r11, r5, r25\n  blr\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r25 0x0000FFFF\n  #_ REGISTER_OUT r11 0xFFFFFFFFFFFF0000\n\ntest_andc_5:\n  #_ REGISTER_IN r0 0x100000FF\n  #_ REGISTER_IN r25 0x0000FFFF\n  andc r11, r0, r25\n  blr\n  #_ REGISTER_OUT r0 0x100000FF\n  #_ REGISTER_OUT r25 0x0000FFFF\n  #_ REGISTER_OUT r11 0x10000000\n\ntest_andc_5_constant:\n  lis r0, 0x1000\n  ori r0, r0, 0xFF\n  li r25, -1\n  clrldi r25, r25, 48\n  andc r11, r0, r25\n  blr\n  #_ REGISTER_OUT r0 0x100000FF\n  #_ REGISTER_OUT r25 0x0000FFFF\n  #_ REGISTER_OUT r11 0x10000000\n\ntest_andc_cr_1:\n  #_ REGISTER_IN r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r25 0xFFFFFFFFFFFFFFFF\n  andc. r11, r5, r25\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r25 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r11 0\n  #_ REGISTER_OUT r12 0x20000000\n\ntest_andc_cr_1_constant:\n  li r5, -1\n  li r25, -1\n  andc. r11, r5, r25\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r25 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r11 0\n  #_ REGISTER_OUT r12 0x20000000\n\ntest_andc_cr_2:\n  #_ REGISTER_IN r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r25 0\n  andc. r11, r5, r25\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r25 0\n  #_ REGISTER_OUT r11 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r12 0x80000000\n\ntest_andc_cr_2_constant:\n  li r5, -1\n  li r25, 0\n  andc. r11, r5, r25\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r25 0\n  #_ REGISTER_OUT r11 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r12 0x80000000\n\ntest_andc_cr_3:\n  #_ REGISTER_IN r5 0\n  #_ REGISTER_IN r25 0xFFFFFFFFFFFFFFFF\n  andc. r11, r5, r25\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r5 0\n  #_ REGISTER_OUT r25 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r11 0\n  #_ REGISTER_OUT r12 0x20000000\n\ntest_andc_cr_3_constant:\n  li r5, 0\n  li r25, -1\n  andc. r11, r5, r25\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r5 0\n  #_ REGISTER_OUT r25 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r11 0\n  #_ REGISTER_OUT r12 0x20000000\n\ntest_andc_cr_4:\n  #_ REGISTER_IN r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r25 0x0000FFFF\n  andc. r11, r5, r25\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r25 0x0000FFFF\n  #_ REGISTER_OUT r11 0xFFFFFFFFFFFF0000\n  #_ REGISTER_OUT r12 0x80000000\n\ntest_andc_cr_4_constant:\n  li r5, -1\n  li r25, -1\n  clrldi r25, r25, 48\n  andc. r11, r5, r25\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r25 0x0000FFFF\n  #_ REGISTER_OUT r11 0xFFFFFFFFFFFF0000\n  #_ REGISTER_OUT r12 0x80000000\n\ntest_andc_cr_5:\n  #_ REGISTER_IN r0 0x100000FF\n  #_ REGISTER_IN r25 0x0000FFFF\n  andc. r11, r0, r25\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r0 0x100000FF\n  #_ REGISTER_OUT r25 0x0000FFFF\n  #_ REGISTER_OUT r11 0x10000000\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_andc_cr_5_constant:\n  lis r0, 0x1000\n  ori r0, r0, 0xFF\n  li r25, -1\n  clrldi r25, r25, 48\n  andc. r11, r0, r25\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r0 0x100000FF\n  #_ REGISTER_OUT r25 0x0000FFFF\n  #_ REGISTER_OUT r11 0x10000000\n  #_ REGISTER_OUT r12 0x40000000\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_andi.s",
    "content": "test_andi_cr_1:\n  #_ REGISTER_IN r5 0xFFFFFFFFFFFFFFFF\n  andi. r11, r5, 0xCAFE\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r11 0x0000CAFE\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_andi_cr_1_constant:\n  li r5, -1\n  andi. r11, r5, 0xCAFE\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r11 0x0000CAFE\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_andi_cr_2:\n #_ REGISTER_IN r5 0xFFFFFFFFFFFFFFFF\n andi. r11, r5, 0\n mfcr r12\n blr\n #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n #_ REGISTER_OUT r11 0\n #_ REGISTER_OUT r12 0x20000000\n\ntest_andi_cr_2_constant:\n #_ REGISTER_IN r5 0xFFFFFFFFFFFFFFFF\n andi. r11, r5, 0\n mfcr r12\n blr\n #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n #_ REGISTER_OUT r11 0\n #_ REGISTER_OUT r12 0x20000000\n\ntest_andi_cr_3:\n  #_ REGISTER_IN r5 0\n  andi. r11, r5, 0xFFFF\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r5 0\n  #_ REGISTER_OUT r11 0\n  #_ REGISTER_OUT r12 0x20000000\n\ntest_andi_cr_3_constant:\n  li r5, 0\n  andi. r11, r5, 0xFFFF\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r5 0\n  #_ REGISTER_OUT r11 0\n  #_ REGISTER_OUT r12 0x20000000\n\ntest_andi_cr_4:\n  #_ REGISTER_IN r5 0xFFFFFFFFFFFFFFFF\n  andi. r11, r5, 0xCAFE\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r11 0x0000CAFE\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_andi_cr_4_constant:\n  li r5, -1\n  andi. r11, r5, 0xCAFE\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r11 0x0000CAFE\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_andi_cr_5:\n  #_ REGISTER_IN r0 0x100000FF\n  andi. r11, r0, 0xFFFF\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r0 0x100000FF\n  #_ REGISTER_OUT r11 0x000000FF\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_andi_cr_5_constant:\n  lis r0, 0x1000\n  ori r0, r0, 0xFF\n  andi. r11, r0, 0xFFFF\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r0 0x100000FF\n  #_ REGISTER_OUT r11 0x000000FF\n  #_ REGISTER_OUT r12 0x40000000\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_andis.s",
    "content": "test_andis_cr_1:\n  #_ REGISTER_IN r5 0xFFFFFFFFFFFFFFFF\n  andis. r11, r5, 0xCAFE\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r11 0xCAFE0000\n  #_ REGISTER_OUT r12 0x80000000\n\ntest_andis_cr_1_constant:\n  li r5, -1\n  andis. r11, r5, 0xCAFE\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r11 0xCAFE0000\n  #_ REGISTER_OUT r12 0x80000000\n\ntest_andis_cr_2:\n #_ REGISTER_IN r5 0xFFFFFFFFFFFFFFFF\n andis. r11, r5, 0\n mfcr r12\n blr\n #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n #_ REGISTER_OUT r11 0\n #_ REGISTER_OUT r12 0x20000000\n\ntest_andis_cr_2_constant:\n #_ REGISTER_IN r5 0xFFFFFFFFFFFFFFFF\n andis. r11, r5, 0\n mfcr r12\n blr\n #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n #_ REGISTER_OUT r11 0\n #_ REGISTER_OUT r12 0x20000000\n\ntest_andis_cr_3:\n  #_ REGISTER_IN r5 0\n  andis. r11, r5, 0xFFFF\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r5 0\n  #_ REGISTER_OUT r11 0\n  #_ REGISTER_OUT r12 0x20000000\n\ntest_andis_cr_3_constant:\n  li r5, 0\n  andis. r11, r5, 0xFFFF\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r5 0\n  #_ REGISTER_OUT r11 0\n  #_ REGISTER_OUT r12 0x20000000\n\ntest_andis_cr_4:\n  #_ REGISTER_IN r5 0xFFFFFFFFFFFFFFFF\n  andis. r11, r5, 0xCAFE\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r11 0xCAFE0000\n  #_ REGISTER_OUT r12 0x80000000\n\ntest_andis_cr_4_constant:\n  li r5, -1\n  andis. r11, r5, 0xCAFE\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r11 0xCAFE0000\n  #_ REGISTER_OUT r12 0x80000000\n\ntest_andis_cr_5:\n  #_ REGISTER_IN r0 0x100000FF\n  andis. r11, r0, 0xFFFF\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r0 0x100000FF\n  #_ REGISTER_OUT r11 0x10000000\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_andis_cr_5_constant:\n  lis r0, 0x1000\n  ori r0, r0, 0xFF\n  andis. r11, r0, 0xFFFF\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r0 0x100000FF\n  #_ REGISTER_OUT r11 0x10000000\n  #_ REGISTER_OUT r12 0x40000000\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_cmp.s",
    "content": "test_cmpd_1:\n  #_ REGISTER_IN r3 0x0000000100000000\n  #_ REGISTER_IN r4 0x0000000200000000\n  cmpd r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x0000000100000000\n  #_ REGISTER_OUT r4 0x0000000200000000\n  #_ REGISTER_OUT r12 0x80000000\n\ntest_cmpd_1_constant:\n  li r3, 1\n  sldi r3, r3, 32\n  sldi r4, r3, 1\n  cmpd r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x0000000100000000\n  #_ REGISTER_OUT r4 0x0000000200000000\n  #_ REGISTER_OUT r12 0x80000000\n\ntest_cmpd_2:\n  #_ REGISTER_IN r3 0x0000000200000000\n  #_ REGISTER_IN r4 0x0000000100000000\n  cmpd r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x0000000200000000\n  #_ REGISTER_OUT r4 0x0000000100000000\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_cmpd_2_constant:\n  li r4, 1\n  sldi r4, r4, 32\n  sldi r3, r4, 1\n  cmpd r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x0000000200000000\n  #_ REGISTER_OUT r4 0x0000000100000000\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_cmpw_1:\n  #_ REGISTER_IN r3 0x0000000100000000\n  #_ REGISTER_IN r4 0x0000000200000000\n  cmpw r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x0000000100000000\n  #_ REGISTER_OUT r4 0x0000000200000000\n  #_ REGISTER_OUT r12 0x20000000\n\ntest_cmpw_1_constant:\n  li r3, 1\n  sldi r3, r3, 32\n  sldi r4, r3, 1\n  cmpw r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x0000000100000000\n  #_ REGISTER_OUT r4 0x0000000200000000\n  #_ REGISTER_OUT r12 0x20000000\n\ntest_cmpw_2:\n  #_ REGISTER_IN r3 0x0000000200000000\n  #_ REGISTER_IN r4 0x0000000100000000\n  cmpw r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x0000000200000000\n  #_ REGISTER_OUT r4 0x0000000100000000\n  #_ REGISTER_OUT r12 0x20000000\n\ntest_cmpw_2_constant:\n  li r4, 1\n  sldi r4, r4, 32\n  sldi r3, r4, 1\n  cmpw r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x0000000200000000\n  #_ REGISTER_OUT r4 0x0000000100000000\n  #_ REGISTER_OUT r12 0x20000000\n\ntest_cmpw_3:\n  #_ REGISTER_IN r3 1\n  #_ REGISTER_IN r4 2\n  cmpw r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 2\n  #_ REGISTER_OUT r12 0x80000000\n\ntest_cmpw_3_constant:\n  li r3, 1\n  li r4, 2\n  cmpw r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 2\n  #_ REGISTER_OUT r12 0x80000000\n\ntest_cmpw_4:\n  #_ REGISTER_IN r3 2\n  #_ REGISTER_IN r4 1\n  cmpw r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 2\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_cmpw_4_constant:\n  li r3, 2\n  li r4, 1\n  cmpw r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 2\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_cmpw_5:\n  #_ REGISTER_IN r3 0x0000000100000002\n  #_ REGISTER_IN r4 0x0000000200000001\n  cmpw r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x0000000100000002\n  #_ REGISTER_OUT r4 0x0000000200000001\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_cmpw_5_constant:\n  li r3, 1\n  sldi r3, r3, 32\n  sldi r4, r3, 1\n  addi r3, r3, 2\n  addi r4, r4, 1\n  cmpw r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x0000000100000002\n  #_ REGISTER_OUT r4 0x0000000200000001\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_cmp_1:\n  #_ REGISTER_IN r3 1\n  #_ REGISTER_IN r4 2\n  cmp 5, 0, r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 2\n  #_ REGISTER_OUT r12 0x00000800\n\ntest_cmp_1_constant:\n  li r3, 1\n  li r4, 2\n  cmp 5, 0, r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 2\n  #_ REGISTER_OUT r12 0x00000800\n\ntest_cmp_2:\n  #_ REGISTER_IN r3 2\n  #_ REGISTER_IN r4 1\n  cmp 3, 0, r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 2\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r12 0x00040000\n\ntest_cmp_2_constant:\n  li r3, 2\n  li r4, 1\n  cmp 3, 0, r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 2\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r12 0x00040000\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_cmpi.s",
    "content": "test_cmpdi_1:\n  #_ REGISTER_IN r3 0x0000000100000000\n  cmpdi r3, 2\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x0000000100000000\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_cmpdi_1_constant:\n  li r3, 1\n  sldi r3, r3, 32\n  cmpdi r3, 2\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x0000000100000000\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_cmpdi_2:\n  #_ REGISTER_IN r3 1\n  cmpdi r3, 2\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r12 0x80000000\n\ntest_cmpdi_2_constant:\n  li r3, 1\n  cmpdi r3, 2\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r12 0x80000000\n\ntest_cmpwi_1:\n  #_ REGISTER_IN r3 0x0000000100000000\n  cmpwi r3, 2\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x0000000100000000\n  #_ REGISTER_OUT r12 0x80000000\n\ntest_cmpwi_1_constant:\n  li r3, 1\n  sldi r3, r3, 32\n  cmpwi r3, 2\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x0000000100000000\n  #_ REGISTER_OUT r12 0x80000000\n\ntest_cmpwi_2:\n  #_ REGISTER_IN r3 2\n  cmpwi r3, 1\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 2\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_cmpwi_2_constant:\n  li r3, 2\n  cmpwi r3, 1\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 2\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_cmpwi_5:\n  #_ REGISTER_IN r3 0x0000000100000002\n  cmpwi r3, 1\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x0000000100000002\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_cmpwi_5_constant:\n  li r3, 1\n  sldi r3, r3, 32\n  sldi r4, r3, 1\n  addi r3, r3, 2\n  cmpwi r3, 1\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x0000000100000002\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_cmpi_1:\n  #_ REGISTER_IN r3 1\n  cmpi 5, 0, r3, 2\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r12 0x00000800\n\ntest_cmpi_1_constant:\n  li r3, 1\n  cmpi 5, 0, r3, 2\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r12 0x00000800\n\ntest_cmpi_2:\n  #_ REGISTER_IN r3 2\n  cmpi 3, 0, r3, 1\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 2\n  #_ REGISTER_OUT r12 0x00040000\n\ntest_cmpi_2_constant:\n  li r3, 2\n  cmpi 3, 0, r3, 1\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 2\n  #_ REGISTER_OUT r12 0x00040000\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_cmpl.s",
    "content": "test_cmpld_1:\n  #_ REGISTER_IN r3 0x0000000100000000\n  #_ REGISTER_IN r4 0x0000000200000000\n  cmpld r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x0000000100000000\n  #_ REGISTER_OUT r4 0x0000000200000000\n  #_ REGISTER_OUT r12 0x80000000\n\ntest_cmpld_1_constant:\n  li r3, 1\n  sldi r3, r3, 32\n  sldi r4, r3, 1\n  cmpld r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x0000000100000000\n  #_ REGISTER_OUT r4 0x0000000200000000\n  #_ REGISTER_OUT r12 0x80000000\n\ntest_cmpld_2:\n  #_ REGISTER_IN r3 0x0000000200000000\n  #_ REGISTER_IN r4 0x0000000100000000\n  cmpld r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x0000000200000000\n  #_ REGISTER_OUT r4 0x0000000100000000\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_cmpld_2_constant:\n  li r4, 1\n  sldi r4, r4, 32\n  sldi r3, r4, 1\n  cmpld r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x0000000200000000\n  #_ REGISTER_OUT r4 0x0000000100000000\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_cmplw_1:\n  #_ REGISTER_IN r3 0x0000000100000000\n  #_ REGISTER_IN r4 0x0000000200000000\n  cmplw r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x0000000100000000\n  #_ REGISTER_OUT r4 0x0000000200000000\n  #_ REGISTER_OUT r12 0x20000000\n\ntest_cmplw_1_constant:\n  li r3, 1\n  sldi r3, r3, 32\n  sldi r4, r3, 1\n  cmplw r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x0000000100000000\n  #_ REGISTER_OUT r4 0x0000000200000000\n  #_ REGISTER_OUT r12 0x20000000\n\ntest_cmplw_2:\n  #_ REGISTER_IN r3 0x0000000200000000\n  #_ REGISTER_IN r4 0x0000000100000000\n  cmplw r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x0000000200000000\n  #_ REGISTER_OUT r4 0x0000000100000000\n  #_ REGISTER_OUT r12 0x20000000\n\ntest_cmplw_2_constant:\n  li r4, 1\n  sldi r4, r4, 32\n  sldi r3, r4, 1\n  cmplw r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x0000000200000000\n  #_ REGISTER_OUT r4 0x0000000100000000\n  #_ REGISTER_OUT r12 0x20000000\n\ntest_cmplw_3:\n  #_ REGISTER_IN r3 1\n  #_ REGISTER_IN r4 2\n  cmplw r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 2\n  #_ REGISTER_OUT r12 0x80000000\n\ntest_cmplw_3_constant:\n  li r3, 1\n  li r4, 2\n  cmplw r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 2\n  #_ REGISTER_OUT r12 0x80000000\n\ntest_cmplw_4:\n  #_ REGISTER_IN r3 2\n  #_ REGISTER_IN r4 1\n  cmplw r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 2\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_cmplw_4_constant:\n  li r3, 2\n  li r4, 1\n  cmplw r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 2\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_cmplw_5:\n  #_ REGISTER_IN r3 0x0000000100000002\n  #_ REGISTER_IN r4 0x0000000200000001\n  cmplw r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x0000000100000002\n  #_ REGISTER_OUT r4 0x0000000200000001\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_cmplw_5_constant:\n  li r3, 1\n  sldi r3, r3, 32\n  sldi r4, r3, 1\n  addi r3, r3, 2\n  addi r4, r4, 1\n  cmplw r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x0000000100000002\n  #_ REGISTER_OUT r4 0x0000000200000001\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_cmplw_6:\n  #_ REGISTER_IN r3 0xFFFFFFFF80000000\n  #_ REGISTER_IN r4 0x0000000080000000\n  cmplw r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFF80000000\n  #_ REGISTER_OUT r4 0x0000000080000000\n  #_ REGISTER_OUT r12 0x20000000\n\ntest_cmplw_6_constant:\n  lis r3, 0x7FFF\n  ori r3, r3, 0xFFFF\n  not r3, r3\n  li r4, 1\n  sldi r4, r4, 31\n  cmplw r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFF80000000\n  #_ REGISTER_OUT r4 0x0000000080000000\n  #_ REGISTER_OUT r12 0x20000000\n\ntest_cmpl_1:\n  #_ REGISTER_IN r3 1\n  #_ REGISTER_IN r4 2\n  cmpl 5, 0, r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 2\n  #_ REGISTER_OUT r12 0x00000800\n\ntest_cmpl_1_constant:\n  li r3, 1\n  li r4, 2\n  cmpl 5, 0, r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 2\n  #_ REGISTER_OUT r12 0x00000800\n\ntest_cmpl_2:\n  #_ REGISTER_IN r3 2\n  #_ REGISTER_IN r4 1\n  cmpl 3, 0, r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 2\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r12 0x00040000\n\ntest_cmpl_2_constant:\n  li r3, 2\n  li r4, 1\n  cmpl 3, 0, r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 2\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r12 0x00040000\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_cmpli.s",
    "content": "test_cmpldi_1:\n  #_ REGISTER_IN r3 0x0000000100000000\n  cmpldi r3, 2\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x0000000100000000\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_cmpldi_1_constant:\n  li r3, 1\n  sldi r3, r3, 32\n  cmpldi r3, 2\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x0000000100000000\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_cmpldi_2:\n  #_ REGISTER_IN r3 1\n  cmpldi r3, 2\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r12 0x80000000\n\ntest_cmpldi_2_constant:\n  li r3, 1\n  cmpldi r3, 2\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r12 0x80000000\n\ntest_cmplwi_1:\n  #_ REGISTER_IN r3 0x0000000100000000\n  cmplwi r3, 2\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x0000000100000000\n  #_ REGISTER_OUT r12 0x80000000\n\ntest_cmplwi_1_constant:\n  li r3, 1\n  sldi r3, r3, 32\n  cmplwi r3, 2\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x0000000100000000\n  #_ REGISTER_OUT r12 0x80000000\n\ntest_cmplwi_2:\n  #_ REGISTER_IN r3 2\n  cmplwi r3, 1\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 2\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_cmplwi_2_constant:\n  li r3, 2\n  cmplwi r3, 1\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 2\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_cmplwi_5:\n  #_ REGISTER_IN r3 0x0000000100000002\n  cmplwi r3, 1\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x0000000100000002\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_cmplwi_5_constant:\n  li r3, 1\n  sldi r3, r3, 32\n  sldi r4, r3, 1\n  addi r3, r3, 2\n  cmplwi r3, 1\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x0000000100000002\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_cmpli_1:\n  #_ REGISTER_IN r3 1\n  cmpli 5, 0, r3, 2\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r12 0x00000800\n\ntest_cmpli_1_constant:\n  li r3, 1\n  cmpli 5, 0, r3, 2\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r12 0x00000800\n\ntest_cmpli_2:\n  #_ REGISTER_IN r3 2\n  cmpli 3, 0, r3, 1\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 2\n  #_ REGISTER_OUT r12 0x00040000\n\ntest_cmpli_2_constant:\n  li r3, 2\n  cmpli 3, 0, r3, 1\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 2\n  #_ REGISTER_OUT r12 0x00040000\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_cntlzd.s",
    "content": "test_cntlzd_1:\n  #_ REGISTER_IN r5 0\n  cntlzd r6, r5\n  blr\n  #_ REGISTER_OUT r5 0\n  #_ REGISTER_OUT r6 64\n\ntest_cntlzd_1_constant:\n  li r5, 0\n  cntlzd r6, r5\n  blr\n  #_ REGISTER_OUT r5 0\n  #_ REGISTER_OUT r6 64\n\ntest_cntlzd_2:\n  #_ REGISTER_IN r5 1\n  cntlzd r6, r5\n  blr\n  #_ REGISTER_OUT r5 1\n  #_ REGISTER_OUT r6 63\n\ntest_cntlzd_2_constant:\n  li r5, 1\n  cntlzd r6, r5\n  blr\n  #_ REGISTER_OUT r5 1\n  #_ REGISTER_OUT r6 63\n\ntest_cntlzd_3:\n  #_ REGISTER_IN r5 0xFFFFFFFFFFFFFFFF\n  cntlzd r6, r5\n  blr\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r6 0\n\ntest_cntlzd_3_constant:\n  li r5, -1\n  cntlzd r6, r5\n  blr\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r6 0\n\ntest_cntlzd_4:\n  #_ REGISTER_IN r5 0x7FFFFFFFFFFFFFFF\n  cntlzd r6, r5\n  blr\n  #_ REGISTER_OUT r5 0x7FFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r6 1\n\ntest_cntlzd_4_constant:\n  li r5, -1\n  srdi r5, r5, 1\n  cntlzd r6, r5\n  blr\n  #_ REGISTER_OUT r5 0x7FFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r6 1\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_cntlzw.s",
    "content": "test_cntlzw_1:\n  #_ REGISTER_IN r5 0\n  cntlzw r6, r5\n  blr\n  #_ REGISTER_OUT r5 0\n  #_ REGISTER_OUT r6 32\n\ntest_cntlzw_1_constant:\n  li r5, 0\n  cntlzw r6, r5\n  blr\n  #_ REGISTER_OUT r5 0\n  #_ REGISTER_OUT r6 32\n\ntest_cntlzw_2:\n  #_ REGISTER_IN r5 1\n  cntlzw r6, r5\n  blr\n  #_ REGISTER_OUT r5 1\n  #_ REGISTER_OUT r6 31\n\ntest_cntlzw_2_constant:\n  li r5, 1\n  cntlzw r6, r5\n  blr\n  #_ REGISTER_OUT r5 1\n  #_ REGISTER_OUT r6 31\n\ntest_cntlzw_3:\n  #_ REGISTER_IN r5 0xFFFFFFFF\n  cntlzw r6, r5\n  blr\n  #_ REGISTER_OUT r5 0xFFFFFFFF\n  #_ REGISTER_OUT r6 0\n\ntest_cntlzw_3_constant:\n  li r5, -1\n  srwi r5, r5, 0\n  cntlzw r6, r5\n  blr\n  #_ REGISTER_OUT r5 0xFFFFFFFF\n  #_ REGISTER_OUT r6 0\n\ntest_cntlzw_4:\n  #_ REGISTER_IN r5 0x7FFFFFFF\n  cntlzw r6, r5\n  blr\n  #_ REGISTER_OUT r5 0x7FFFFFFF\n  #_ REGISTER_OUT r6 1\n\ntest_cntlzw_4_constant:\n  li r5, -1\n  srwi r5, r5, 1\n  cntlzw r6, r5\n  blr\n  #_ REGISTER_OUT r5 0x7FFFFFFF\n  #_ REGISTER_OUT r6 1\n\ntest_cntlzw_5:\n  #_ REGISTER_IN r5 0xFFFFFFFF00000001\n  cntlzw r6, r5\n  blr\n  #_ REGISTER_OUT r5 0xFFFFFFFF00000001\n  #_ REGISTER_OUT r6 31\n\ntest_cntlzw_5_constant:\n  li r5, -1\n  sldi r5, r5, 32\n  addi r5, r5, 1\n  cntlzw r6, r5\n  blr\n  #_ REGISTER_OUT r5 0xFFFFFFFF00000001\n  #_ REGISTER_OUT r6 31\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_divd.s",
    "content": "test_divd_1:\n  #_ REGISTER_IN r4 1\n  #_ REGISTER_IN r5 2\n  divd r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 2\n\ntest_divd_1_constant:\n  li r4, 1\n  li r5, 2\n  divd r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 2\n\n# TODO(benvanik): x64 ignore divide by zero (=0)\n#test_divd_2:\n#  #_ REGISTER_IN r4 1\n#  #_ REGISTER_IN r5 0\n#  divd r3, r4, r5\n#  blr\n#  #_ REGISTER_OUT r3 0\n#  #_ REGISTER_OUT r4 1\n#  #_ REGISTER_OUT r5 0\n\n# TODO(benvanik): x64 ignore divide by zero (=0)\n#test_divd_2_constant:\n#  li r4, 1\n#  li r5, 0\n#  divd r3, r4, r5\n#  blr\n#  #_ REGISTER_OUT r3 0\n#  #_ REGISTER_OUT r4 1\n#  #_ REGISTER_OUT r5 0\n\ntest_divd_3:\n  #_ REGISTER_IN r4 2\n  #_ REGISTER_IN r5 1\n  divd r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 2\n  #_ REGISTER_OUT r4 2\n  #_ REGISTER_OUT r5 1\n\ntest_divd_3_constant:\n  li r4, 2\n  li r5, 1\n  divd r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 2\n  #_ REGISTER_OUT r4 2\n  #_ REGISTER_OUT r5 1\n\ntest_divd_4:\n  #_ REGISTER_IN r4 35\n  #_ REGISTER_IN r5 7\n  divd r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 5\n  #_ REGISTER_OUT r4 35\n  #_ REGISTER_OUT r5 7\n\ntest_divd_4_constant:\n  li r4, 35\n  li r5, 7\n  divd r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 5\n  #_ REGISTER_OUT r4 35\n  #_ REGISTER_OUT r5 7\n\ntest_divd_5:\n  #_ REGISTER_IN r4 0\n  #_ REGISTER_IN r5 1\n  divd r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0\n  #_ REGISTER_OUT r5 1\n\ntest_divd_5_constant:\n  li r4, 0\n  li r5, 1\n  divd r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0\n  #_ REGISTER_OUT r5 1\n\ntest_divd_6:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 1\n  divd r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 1\n\ntest_divd_6_constant:\n  li r4, -1\n  li r5, 1\n  divd r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 1\n\ntest_divd_7:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 0xFFFFFFFFFFFFFFFF\n  divd r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n\ntest_divd_7_constant:\n  li r4, -1\n  li r5, -1\n  divd r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n\ntest_divd_8:\n  #_ REGISTER_IN r4 1\n  #_ REGISTER_IN r5 0xFFFFFFFFFFFFFFFF\n  divd r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n\ntest_divd_8_constant:\n  li r4, 1\n  li r5, -1\n  divd r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n\n# TODO(benvanik): integer overflow (=0)\n#test_divd_9:\n#  #_ REGISTER_IN r4 0x8000000000000000\n#  #_ REGISTER_IN r5 -1\n#  divd r3, r4, r5\n#  blr\n#  #_ REGISTER_OUT r3 0\n#  #_ REGISTER_OUT r4 0x8000000000000000\n#  #_ REGISTER_OUT r5 -1\n\n# TODO(benvanik): integer overflow (=0)\n#test_divd_9_constant:\n#  li r4, 1\n#  sldi r4, r4, 63\n#  li r5, -1\n#  divd r3, r4, r5\n#  blr\n#  #_ REGISTER_OUT r3 0\n#  #_ REGISTER_OUT r4 0x8000000000000000\n#  #_ REGISTER_OUT r5 -1\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_divdu.s",
    "content": "test_divdu_1:\n  #_ REGISTER_IN r4 1\n  #_ REGISTER_IN r5 2\n  divdu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 2\n\ntest_divdu_1_constant:\n  li r4, 1\n  li r5, 2\n  divdu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 2\n\n# TODO(benvanik): x64 ignore divide by zero (=0)\n#test_divdu_2:\n#  #_ REGISTER_IN r4 1\n#  #_ REGISTER_IN r5 0\n#  divdu r3, r4, r5\n#  blr\n#  #_ REGISTER_OUT r3 0\n#  #_ REGISTER_OUT r4 1\n#  #_ REGISTER_OUT r5 0\n\n# TODO(benvanik): x64 ignore divide by zero (=0)\n#test_divdu_2_constant:\n#  li r4, 1\n#  li r5, 0\n#  divdu r3, r4, r5\n#  blr\n#  #_ REGISTER_OUT r3 0\n#  #_ REGISTER_OUT r4 1\n#  #_ REGISTER_OUT r5 0\n\ntest_divdu_3:\n  #_ REGISTER_IN r4 2\n  #_ REGISTER_IN r5 1\n  divdu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 2\n  #_ REGISTER_OUT r4 2\n  #_ REGISTER_OUT r5 1\n\ntest_divdu_3_constant:\n  li r4, 2\n  li r5, 1\n  divdu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 2\n  #_ REGISTER_OUT r4 2\n  #_ REGISTER_OUT r5 1\n\ntest_divdu_4:\n  #_ REGISTER_IN r4 35\n  #_ REGISTER_IN r5 7\n  divdu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 5\n  #_ REGISTER_OUT r4 35\n  #_ REGISTER_OUT r5 7\n\ntest_divdu_4_constant:\n  li r4, 35\n  li r5, 7\n  divdu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 5\n  #_ REGISTER_OUT r4 35\n  #_ REGISTER_OUT r5 7\n\ntest_divdu_5:\n  #_ REGISTER_IN r4 0\n  #_ REGISTER_IN r5 1\n  divdu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0\n  #_ REGISTER_OUT r5 1\n\ntest_divdu_5_constant:\n  li r4, 0\n  li r5, 1\n  divdu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0\n  #_ REGISTER_OUT r5 1\n\ntest_divdu_6:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 1\n  divdu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 1\n\ntest_divdu_6_constant:\n  li r4, -1\n  li r5, 1\n  divdu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 1\n\ntest_divdu_7:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 0xFFFFFFFFFFFFFFFF\n  divdu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n\ntest_divdu_7_constant:\n  li r4, -1\n  li r5, -1\n  divdu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n\ntest_divdu_8:\n  #_ REGISTER_IN r4 1\n  #_ REGISTER_IN r5 0xFFFFFFFFFFFFFFFF\n  divdu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n\ntest_divdu_8_constant:\n  li r4, 1\n  li r5, -1\n  divdu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n\ntest_divdu_9:\n  #_ REGISTER_IN r4 0x8000000000000000\n  #_ REGISTER_IN r5 -1\n  divdu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0x8000000000000000\n  #_ REGISTER_OUT r5 -1\n\n# TODO(benvanik): integer overflow (=0)\ntest_divdu_9_constant:\n  li r4, 1\n  sldi r4, r4, 63\n  li r5, -1\n  divdu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0x8000000000000000\n  #_ REGISTER_OUT r5 -1\n\ntest_divdu_10:\n  #_ REGISTER_IN r0 0x1\n  #_ REGISTER_IN r3 0xFFFFFFFF\n  divdu. r0, r3, r0\n  blr\n  #_ REGISTER_OUT r0 0xFFFFFFFF\n  #_ REGISTER_OUT r3 0xFFFFFFFF\n  #_ REGISTER_OUT cr 0x0000000080000000\n\ntest_divdu_11:\n  #_ REGISTER_IN r0 0\n  #_ REGISTER_IN r3 0xFFFFFFFF\n  divdu. r0, r0, r3\n  blr\n  #_ REGISTER_OUT r0 0\n  #_ REGISTER_OUT r3 0xFFFFFFFF\n  #_ REGISTER_OUT cr 0x0000000020000000\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_divw.s",
    "content": "test_divw_1:\n  #_ REGISTER_IN r4 1\n  #_ REGISTER_IN r5 2\n  divw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 2\n\ntest_divw_1_constant:\n  li r4, 1\n  li r5, 2\n  divw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 2\n\n# TODO(benvanik): x64 ignore divide by zero (=0)\n#test_divw_2:\n#  #_ REGISTER_IN r4 1\n#  #_ REGISTER_IN r5 0\n#  divw r3, r4, r5\n#  blr\n#  #_ REGISTER_OUT r3 0\n#  #_ REGISTER_OUT r4 1\n#  #_ REGISTER_OUT r5 0\n\n# TODO(benvanik): x64 ignore divide by zero (=0)\n#test_divw_2_constant:\n#  li r4, 1\n#  li r5, 0\n#  divw r3, r4, r5\n#  blr\n#  #_ REGISTER_OUT r3 0\n#  #_ REGISTER_OUT r4 1\n#  #_ REGISTER_OUT r5 0\n\ntest_divw_3:\n  #_ REGISTER_IN r4 2\n  #_ REGISTER_IN r5 1\n  divw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 2\n  #_ REGISTER_OUT r4 2\n  #_ REGISTER_OUT r5 1\n\ntest_divw_3_constant:\n  li r4, 2\n  li r5, 1\n  divw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 2\n  #_ REGISTER_OUT r4 2\n  #_ REGISTER_OUT r5 1\n\ntest_divw_4:\n  #_ REGISTER_IN r4 35\n  #_ REGISTER_IN r5 7\n  divw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 5\n  #_ REGISTER_OUT r4 35\n  #_ REGISTER_OUT r5 7\n\ntest_divw_4_constant:\n  li r4, 35\n  li r5, 7\n  divw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 5\n  #_ REGISTER_OUT r4 35\n  #_ REGISTER_OUT r5 7\n\ntest_divw_5:\n  #_ REGISTER_IN r4 0\n  #_ REGISTER_IN r5 1\n  divw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0\n  #_ REGISTER_OUT r5 1\n\ntest_divw_5_constant:\n  li r4, 0\n  li r5, 1\n  divw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0\n  #_ REGISTER_OUT r5 1\n\ntest_divw_6:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 1\n  divw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0x00000000FFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 1\n\ntest_divw_6_constant:\n  li r4, -1\n  li r5, 1\n  divw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0x00000000FFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 1\n\ntest_divw_7:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 0xFFFFFFFFFFFFFFFF\n  divw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n\ntest_divw_7_constant:\n  li r4, -1\n  li r5, -1\n  divw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n\ntest_divw_8:\n  #_ REGISTER_IN r4 1\n  #_ REGISTER_IN r5 0xFFFFFFFFFFFFFFFF\n  divw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0x00000000FFFFFFFF\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n\ntest_divw_8_constant:\n  li r4, 1\n  li r5, -1\n  divw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0x00000000FFFFFFFF\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n\ntest_divw_9:\n  #_ REGISTER_IN r4 0x000000007FFFFFFF\n  #_ REGISTER_IN r5 1\n  divw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0x000000007FFFFFFF\n  #_ REGISTER_OUT r4 0x000000007FFFFFFF\n  #_ REGISTER_OUT r5 1\n\ntest_divw_9_constant:\n  li r4, -1\n  clrldi r4, r4, 33\n  li r5, 1\n  divw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0x000000007FFFFFFF\n  #_ REGISTER_OUT r4 0x000000007FFFFFFF\n  #_ REGISTER_OUT r5 1\n\ntest_divw_10:\n  #_ REGISTER_IN r4 0x000000007FFFFFFF\n  #_ REGISTER_IN r5 0x000000007FFFFFFF\n  divw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 0x000000007FFFFFFF\n  #_ REGISTER_OUT r5 0x000000007FFFFFFF\n\ntest_divw_10_constant:\n  li r4, -1\n  clrldi r4, r4, 33\n  mr r5, r4\n  divw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 0x000000007FFFFFFF\n  #_ REGISTER_OUT r5 0x000000007FFFFFFF\n\ntest_divw_11:\n  #_ REGISTER_IN r4 1\n  #_ REGISTER_IN r5 0x000000007FFFFFFF\n  divw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 0x000000007FFFFFFF\n\ntest_divw_11_constant:\n  li r4, 1\n  li r5, -1\n  clrldi r5, r5, 33\n  divw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 0x000000007FFFFFFF\n\n# TODO(benvanik): integer overflow (=0)\n#test_divw_12:\n#  #_ REGISTER_IN r4 0x80000000\n#  #_ REGISTER_IN r5 -1\n#  divw r3, r4, r5\n#  blr\n#  #_ REGISTER_OUT r3 0\n#  #_ REGISTER_OUT r4 0x80000000\n#  #_ REGISTER_OUT r5 -1\n\n# TODO(benvanik): integer overflow (=0)\n#test_divw_12_constant:\n#  li r4, 1\n#  srdi r4, 31\n#  li r5, -1\n#  divw r3, r4, r5\n#  blr\n#  #_ REGISTER_OUT r3 0\n#  #_ REGISTER_OUT r4 0x80000000\n#  #_ REGISTER_OUT r5 -1\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_divwu.s",
    "content": "test_divwu_1:\n  #_ REGISTER_IN r4 1\n  #_ REGISTER_IN r5 2\n  divwu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 2\n\ntest_divwu_1_constant:\n  li r4, 1\n  li r5, 2\n  divwu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 2\n\n# TODO(benvanik): x64 ignore divide by zero (=0)\n#test_divwu_2:\n#  #_ REGISTER_IN r4 1\n#  #_ REGISTER_IN r5 0\n#  divwu r3, r4, r5\n#  blr\n#  #_ REGISTER_OUT r3 0\n#  #_ REGISTER_OUT r4 1\n#  #_ REGISTER_OUT r5 0\n\n# TODO(benvanik): x64 ignore divide by zero (=0)\n#test_divwu_2_constant:\n#  li r4, 1\n#  li r5, 0\n#  divwu r3, r4, r5\n#  blr\n#  #_ REGISTER_OUT r3 0\n#  #_ REGISTER_OUT r4 1\n#  #_ REGISTER_OUT r5 0\n\ntest_divwu_3:\n  #_ REGISTER_IN r4 2\n  #_ REGISTER_IN r5 1\n  divwu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 2\n  #_ REGISTER_OUT r4 2\n  #_ REGISTER_OUT r5 1\n\ntest_divwu_3_constant:\n  li r4, 2\n  li r5, 1\n  divwu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 2\n  #_ REGISTER_OUT r4 2\n  #_ REGISTER_OUT r5 1\n\ntest_divwu_4:\n  #_ REGISTER_IN r4 35\n  #_ REGISTER_IN r5 7\n  divwu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 5\n  #_ REGISTER_OUT r4 35\n  #_ REGISTER_OUT r5 7\n\ntest_divwu_4_constant:\n  li r4, 35\n  li r5, 7\n  divwu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 5\n  #_ REGISTER_OUT r4 35\n  #_ REGISTER_OUT r5 7\n\ntest_divwu_5:\n  #_ REGISTER_IN r4 0\n  #_ REGISTER_IN r5 1\n  divwu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0\n  #_ REGISTER_OUT r5 1\n\ntest_divwu_5_constant:\n  li r4, 0\n  li r5, 1\n  divwu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0\n  #_ REGISTER_OUT r5 1\n\ntest_divwu_6:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 1\n  divwu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0x00000000FFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 1\n\ntest_divwu_6_constant:\n  li r4, -1\n  li r5, 1\n  divwu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0x00000000FFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 1\n\ntest_divwu_7:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 0xFFFFFFFFFFFFFFFF\n  divwu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n\ntest_divwu_7_constant:\n  li r4, -1\n  li r5, -1\n  divwu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n\ntest_divwu_8:\n  #_ REGISTER_IN r4 1\n  #_ REGISTER_IN r5 0xFFFFFFFFFFFFFFFF\n  divwu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n\ntest_divwu_8_constant:\n  li r4, 1\n  li r5, -1\n  divwu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n\ntest_divwu_9:\n  #_ REGISTER_IN r4 0x000000007FFFFFFF\n  #_ REGISTER_IN r5 1\n  divwu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0x000000007FFFFFFF\n  #_ REGISTER_OUT r4 0x000000007FFFFFFF\n  #_ REGISTER_OUT r5 1\n\ntest_divwu_9_constant:\n  li r4, -1\n  clrldi r4, r4, 33\n  li r5, 1\n  divwu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0x000000007FFFFFFF\n  #_ REGISTER_OUT r4 0x000000007FFFFFFF\n  #_ REGISTER_OUT r5 1\n\ntest_divwu_10:\n  #_ REGISTER_IN r4 0x000000007FFFFFFF\n  #_ REGISTER_IN r5 0x000000007FFFFFFF\n  divwu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 0x000000007FFFFFFF\n  #_ REGISTER_OUT r5 0x000000007FFFFFFF\n\ntest_divwu_10_constant:\n  li r4, -1\n  clrldi r4, r4, 33\n  mr r5, r4\n  divwu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 0x000000007FFFFFFF\n  #_ REGISTER_OUT r5 0x000000007FFFFFFF\n\ntest_divwu_11:\n  #_ REGISTER_IN r4 1\n  #_ REGISTER_IN r5 0x000000007FFFFFFF\n  divwu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 0x000000007FFFFFFF\n\ntest_divwu_11_constant:\n  li r4, 1\n  li r5, -1\n  clrldi r5, r5, 33\n  divwu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 0x000000007FFFFFFF\n\ntest_divwu_12:\n  #_ REGISTER_IN r4 0x80000000\n  #_ REGISTER_IN r5 -1\n  divwu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0x80000000\n  #_ REGISTER_OUT r5 -1\n\ntest_divwu_12_constant:\n  li r4, 1\n  sldi r4, r4, 31\n  li r5, -1\n  divwu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0x80000000\n  #_ REGISTER_OUT r5 -1\n\ntest_divwu_13:\n  #_ REGISTER_IN r0 0x1\n  #_ REGISTER_IN r3 0xFFFFFFFF\n  divwu. r0, r3, r0\n  blr\n  #_ REGISTER_OUT r0 0xFFFFFFFF\n  #_ REGISTER_OUT r3 0xFFFFFFFF\n  #_ REGISTER_OUT cr 0x0000000080000000\n\ntest_divwu_14:\n  #_ REGISTER_IN r0 0x1\n  #_ REGISTER_IN r3 0xFFFFFFFF\n  divwu. r0, r0, r3\n  blr\n  #_ REGISTER_OUT r0 0\n  #_ REGISTER_OUT r3 0xFFFFFFFF\n  #_ REGISTER_OUT cr 0x0000000020000000\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_eqv.s",
    "content": "test_eqv_1:\n  #_ REGISTER_IN r4 0\n  #_ REGISTER_IN r5 1\n  eqv r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0xfffffffffffffffe\n  #_ REGISTER_OUT r4 0\n  #_ REGISTER_OUT r5 1\n\ntest_eqv_1_constant:\n  li r4, 0\n  li r5, 1\n  eqv r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0xfffffffffffffffe\n  #_ REGISTER_OUT r4 0\n  #_ REGISTER_OUT r5 1\n\ntest_eqv_2:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 0\n  eqv r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0\n\ntest_eqv_2_constant:\n  li r4, -1\n  li r5, 0\n  eqv r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0\n\ntest_eqv_3:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 0xFFFFFFFFFFFFFFFF\n  eqv r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n\ntest_eqv_3_constant:\n  li r4, -1\n  li r5, -1\n  eqv r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n\ntest_eqv_4:\n  #_ REGISTER_IN r4 0xDEADBEEFDEADBEEF\n  #_ REGISTER_IN r5 0xDEADBEEFDEADBEEF\n  eqv r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0xDEADBEEFDEADBEEF\n  #_ REGISTER_OUT r5 0xDEADBEEFDEADBEEF\n\ntest_eqv_4_constant:\n  lis r4, 0xDEAD\n  ori r4, r4, 0xBEEF\n  sldi r5, r4, 32\n  clrldi r4, r4, 32\n  or r4, r5, r4\n  mr r5, r4\n  eqv r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0xDEADBEEFDEADBEEF\n  #_ REGISTER_OUT r5 0xDEADBEEFDEADBEEF\n\ntest_eqv_5:\n  #_ REGISTER_IN r4 0xDEADBEEFDEADBEEF\n  #_ REGISTER_IN r5 0xFFFFFFFFFFFFFFFF\n  eqv r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0xDEADBEEFDEADBEEF\n  #_ REGISTER_OUT r4 0xDEADBEEFDEADBEEF\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n\ntest_eqv_5_constant:\n  lis r4, 0xDEAD\n  ori r4, r4, 0xBEEF\n  sldi r5, r4, 32\n  clrldi r4, r4, 32\n  or r4, r5, r4\n  li r5, -1\n  eqv r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0xDEADBEEFDEADBEEF\n  #_ REGISTER_OUT r4 0xDEADBEEFDEADBEEF\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n\ntest_eqv_6:\n  #_ REGISTER_IN r4 0xDEADBEEFDEADBEEF\n  #_ REGISTER_IN r5 0\n  eqv r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0x2152411021524110\n  #_ REGISTER_OUT r4 0xDEADBEEFDEADBEEF\n  #_ REGISTER_OUT r5 0\n\ntest_eqv_6_constant:\n  lis r4, 0xDEAD\n  ori r4, r4, 0xBEEF\n  sldi r5, r4, 32\n  clrldi r4, r4, 32\n  or r4, r5, r4\n  li r5, 0\n  eqv r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0x2152411021524110\n  #_ REGISTER_OUT r4 0xDEADBEEFDEADBEEF\n  #_ REGISTER_OUT r5 0\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_extsb.s",
    "content": "test_extsb_1:\n  #_ REGISTER_IN r4 0x0F\n  extsb r3, r4\n  blr\n  #_ REGISTER_OUT r3 0x0F\n  #_ REGISTER_OUT r4 0x0F\n\ntest_extsb_1_constant:\n  li r4, 0x0F\n  extsb r3, r4\n  blr\n  #_ REGISTER_OUT r3 0x0F\n  #_ REGISTER_OUT r4 0x0F\n\ntest_extsb_2:\n  #_ REGISTER_IN r4 0x7F\n  extsb r3, r4\n  blr\n  #_ REGISTER_OUT r3 0x7F\n  #_ REGISTER_OUT r4 0x7F\n\ntest_extsb_2_constant:\n  li r4, 0x7F\n  extsb r3, r4\n  blr\n  #_ REGISTER_OUT r3 0x7F\n  #_ REGISTER_OUT r4 0x7F\n\ntest_extsb_3:\n  #_ REGISTER_IN r4 0x80\n  extsb r3, r4\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFF80\n  #_ REGISTER_OUT r4 0x80\n\ntest_extsb_3_constant:\n  li r4, 0x80\n  extsb r3, r4\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFF80\n  #_ REGISTER_OUT r4 0x80\n\ntest_extsb_4:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFF080\n  extsb r3, r4\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFF80\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFF080\n\ntest_extsb_4_constant:\n  li r4, 0xF7F\n  not r4, r4\n  extsb r3, r4\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFF80\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFF080\n\ntest_extsb_cr_1:\n  #_ REGISTER_IN r4 0x0F\n  extsb. r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x0F\n  #_ REGISTER_OUT r4 0x0F\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_extsb_cr_1_constant:\n  li r4, 0x0F\n  extsb. r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x0F\n  #_ REGISTER_OUT r4 0x0F\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_extsb_cr_2:\n  #_ REGISTER_IN r4 0x7F\n  extsb. r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x7F\n  #_ REGISTER_OUT r4 0x7F\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_extsb_cr_2_constant:\n  li r4, 0x7F\n  extsb. r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x7F\n  #_ REGISTER_OUT r4 0x7F\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_extsb_cr_3:\n  #_ REGISTER_IN r4 0x80\n  extsb. r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFF80\n  #_ REGISTER_OUT r4 0x80\n  #_ REGISTER_OUT r12 0x80000000\n\ntest_extsb_cr_3_constant:\n  li r4, 0x80\n  extsb. r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFF80\n  #_ REGISTER_OUT r4 0x80\n  #_ REGISTER_OUT r12 0x80000000\n\ntest_extsb_cr_4:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFF080\n  extsb. r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFF80\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFF080\n  #_ REGISTER_OUT r12 0x80000000\n\ntest_extsb_cr_4_constant:\n  li r4, 0xF7F\n  not r4, r4\n  extsb. r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFF80\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFF080\n  #_ REGISTER_OUT r12 0x80000000\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_extsh.s",
    "content": "test_extsh_1:\n  #_ REGISTER_IN r4 0x0F\n  extsh r3, r4\n  blr\n  #_ REGISTER_OUT r3 0x0F\n  #_ REGISTER_OUT r4 0x0F\n\ntest_extsh_1_constant:\n  li r4, 0x0F\n  extsh r3, r4\n  blr\n  #_ REGISTER_OUT r3 0x0F\n  #_ REGISTER_OUT r4 0x0F\n\ntest_extsh_2:\n  #_ REGISTER_IN r4 0x7FFF\n  extsh r3, r4\n  blr\n  #_ REGISTER_OUT r3 0x7FFF\n  #_ REGISTER_OUT r4 0x7FFF\n\ntest_extsh_2_constant:\n  li r4, 0x7FFF\n  extsh r3, r4\n  blr\n  #_ REGISTER_OUT r3 0x7FFF\n  #_ REGISTER_OUT r4 0x7FFF\n\ntest_extsh_3:\n  #_ REGISTER_IN r4 0x8000\n  extsh r3, r4\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFF8000\n  #_ REGISTER_OUT r4 0x8000\n\ntest_extsh_3_constant:\n  li r4, 0x80\n  sldi r4, r4, 8\n  extsh r3, r4\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFF8000\n  #_ REGISTER_OUT r4 0x8000\n\ntest_extsh_4:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFF08000\n  extsh r3, r4\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFF8000\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFF08000\n\ntest_extsh_4_constant:\n  li r4, 0xF7F\n  not r4, r4\n  sldi r4, r4, 8\n  extsh r3, r4\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFF8000\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFF08000\n\ntest_extsh_cr_1:\n  #_ REGISTER_IN r4 0x0F\n  extsh. r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x0F\n  #_ REGISTER_OUT r4 0x0F\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_extsh_cr_1_constant:\n  li r4, 0x0F\n  extsh. r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x0F\n  #_ REGISTER_OUT r4 0x0F\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_extsh_cr_2:\n  #_ REGISTER_IN r4 0x7FFF\n  extsh. r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x7FFF\n  #_ REGISTER_OUT r4 0x7FFF\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_extsh_cr_2_constant:\n  li r4, 0x7FFF\n  extsh. r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x7FFF\n  #_ REGISTER_OUT r4 0x7FFF\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_extsh_cr_3:\n  #_ REGISTER_IN r4 0x8000\n  extsh. r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFF8000\n  #_ REGISTER_OUT r4 0x8000\n  #_ REGISTER_OUT r12 0x80000000\n\ntest_extsh_cr_3_constant:\n  li r4, 0x80\n  sldi r4, r4, 8\n  extsh. r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFF8000\n  #_ REGISTER_OUT r4 0x8000\n  #_ REGISTER_OUT r12 0x80000000\n\ntest_extsh_cr_4:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFF08000\n  extsh. r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFF8000\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFF08000\n  #_ REGISTER_OUT r12 0x80000000\n\ntest_extsh_cr_4_constant:\n  li r4, 0xF7F\n  not r4, r4\n  sldi r4, r4, 8\n  extsh. r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFF8000\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFF08000\n  #_ REGISTER_OUT r12 0x80000000\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_extsw.s",
    "content": "test_extsw_1:\n  #_ REGISTER_IN r4 0x0F\n  extsw r3, r4\n  blr\n  #_ REGISTER_OUT r3 0x0F\n  #_ REGISTER_OUT r4 0x0F\n\ntest_extsw_1_constant:\n  li r4, 0x0F\n  extsw r3, r4\n  blr\n  #_ REGISTER_OUT r3 0x0F\n  #_ REGISTER_OUT r4 0x0F\n\ntest_extsw_2:\n  #_ REGISTER_IN r4 0x7FFFFFFF\n  extsw r3, r4\n  blr\n  #_ REGISTER_OUT r3 0x7FFFFFFF\n  #_ REGISTER_OUT r4 0x7FFFFFFF\n\ntest_extsw_2_constant:\n  lis r4, 0x7FFF\n  ori r4, r4, 0xFFFF\n  extsw r3, r4\n  blr\n  #_ REGISTER_OUT r3 0x7FFFFFFF\n  #_ REGISTER_OUT r4 0x7FFFFFFF\n\ntest_extsw_3:\n  #_ REGISTER_IN r4 0x80000000\n  extsw r3, r4\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFF80000000\n  #_ REGISTER_OUT r4 0x80000000\n\ntest_extsw_3_constant:\n  li r4, 0x80\n  sldi r4, r4, 24\n  extsw r3, r4\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFF80000000\n  #_ REGISTER_OUT r4 0x80000000\n\ntest_extsw_4:\n  #_ REGISTER_IN r4 0xFFFFFFF080000000\n  extsw r3, r4\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFF80000000\n  #_ REGISTER_OUT r4 0xFFFFFFF080000000\n\ntest_extsw_4_constant:\n  li r4, 0xF7F\n  not r4, r4\n  sldi r4, r4, 24\n  extsw r3, r4\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFF80000000\n  #_ REGISTER_OUT r4 0xFFFFFFF080000000\n\ntest_extsw_cr_1:\n  #_ REGISTER_IN r4 0x0F\n  extsw. r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x0F\n  #_ REGISTER_OUT r4 0x0F\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_extsw_cr_1_constant:\n  li r4, 0x0F\n  extsw. r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x0F\n  #_ REGISTER_OUT r4 0x0F\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_extsw_cr_2:\n  #_ REGISTER_IN r4 0x7FFFFFFF\n  extsw. r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x7FFFFFFF\n  #_ REGISTER_OUT r4 0x7FFFFFFF\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_extsw_cr_2_constant:\n  lis r4, 0x7FFF\n  ori r4, r4, 0xFFFF\n  extsw. r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0x7FFFFFFF\n  #_ REGISTER_OUT r4 0x7FFFFFFF\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_extsw_cr_3:\n  #_ REGISTER_IN r4 0x80000000\n  extsw. r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFF80000000\n  #_ REGISTER_OUT r4 0x80000000\n  #_ REGISTER_OUT r12 0x80000000\n\ntest_extsw_cr_3_constant:\n  li r4, 0x80\n  sldi r4, r4, 24\n  extsw. r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFF80000000\n  #_ REGISTER_OUT r4 0x80000000\n  #_ REGISTER_OUT r12 0x80000000\n\ntest_extsw_cr_4:\n  #_ REGISTER_IN r4 0xFFFFFFF080000000\n  extsw. r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFF80000000\n  #_ REGISTER_OUT r4 0xFFFFFFF080000000\n  #_ REGISTER_OUT r12 0x80000000\n\ntest_extsw_cr_4_constant:\n  li r4, 0xF7F\n  not r4, r4\n  sldi r4, r4, 24\n  extsw. r3, r4\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFF80000000\n  #_ REGISTER_OUT r4 0xFFFFFFF080000000\n  #_ REGISTER_OUT r12 0x80000000\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_fabs.s",
    "content": "test_fabs_1:\n  #_ REGISTER_IN f1 1.0\n  fabs f1, f1\n  blr\n  #_ REGISTER_OUT f1 1.0\n\ntest_fabs_2:\n  #_ REGISTER_IN f1 -1.0\n  fabs f1, f1\n  blr\n  #_ REGISTER_OUT f1 1.0\n\ntest_fabs_3:\n  #_ REGISTER_IN f1 -1234.0\n  fabs f1, f1\n  blr\n  #_ REGISTER_OUT f1 1234.0\n\n#test_fabs_cr_1:\n#  #_ REGISTER_IN f1 1.0\n#  fabs. f1, f1\n#  mfcr r12\n#  blr\n#  #_ REGISTER_OUT f1 1.0\n#  #_ REGISTER_OUT r12 0x04000000\n\n#test_fabs_cr_2:\n#  #_ REGISTER_IN f1 -1.0\n#  fabs. f1, f1\n#  mfcr r12\n#  blr\n#  #_ REGISTER_OUT f1 1.0\n#  #_ REGISTER_OUT r12 0x08000000\n\n#test_fabs_cr_3:\n#  #_ REGISTER_IN f1 -1234.0\n#  fabs. f1, f1\n#  mfcr r12\n#  blr\n#  #_ REGISTER_OUT f1 1234.0\n#  #_ REGISTER_OUT r12 0x08000000\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_fadd.s",
    "content": "test_fadd_1:\n  #_ REGISTER_IN f1 1.0\n  #_ REGISTER_IN f2 2.0\n  fadd f3, f1, f2\n  blr\n  #_ REGISTER_OUT f3 3.0\n\ntest_fadd_2:\n  #_ REGISTER_IN f1 0.0\n  #_ REGISTER_IN f2 0.0\n  fadd f3, f1, f2\n  blr\n  #_ REGISTER_OUT f3 0.0\n\ntest_fadd_3:\n  #_ REGISTER_IN f1 -200.0\n  #_ REGISTER_IN f2 200.0\n  fadd f3, f1, f2\n  blr\n  #_ REGISTER_OUT f3 0.0\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_fctixz.s",
    "content": "# Credits: These tests stolen from https://github.com/dolphin-emu/hwtests\n# +0\ntest_fctiwz_1:\n  #_ REGISTER_IN f0 0x0000000000000000\n  fctiwz f1, f0\n  blr\n  #_ REGISTER_OUT f0 0x0000000000000000\n  #_ REGISTER_OUT f1 0x0000000000000000\n\n# -0\ntest_fctiwz_2:\n  #_ REGISTER_IN f0 0x8000000000000000\n  fctiwz f1, f0\n  blr\n  #_ REGISTER_OUT f0 0x8000000000000000\n  #_ REGISTER_OUT f1 0x0000000000000000\n\n# smallest positive subnormal\ntest_fctiwz_3:\n  #_ REGISTER_IN f0 0x0000000000000001\n  fctiwz f1, f0\n  blr\n  #_ REGISTER_OUT f0 0x0000000000000001\n  #_ REGISTER_OUT f1 0x0000000000000000\n\n# largest subnormal\ntest_fctiwz_4:\n  #_ REGISTER_IN f0 0x000fffffffffffff\n  fctiwz f1, f0\n  blr\n  #_ REGISTER_OUT f0 0x000fffffffffffff\n  #_ REGISTER_OUT f1 0x0000000000000000\n\n# +1\ntest_fctiwz_5:\n  #_ REGISTER_IN f0 0x3ff0000000000000\n  fctiwz f1, f0\n  blr\n  #_ REGISTER_OUT f0 0x3ff0000000000000\n  #_ REGISTER_OUT f1 0x0000000000000001\n\n# -1\ntest_fctiwz_6:\n  #_ REGISTER_IN f0 0xbff0000000000000\n  fctiwz f1, f0\n  blr\n  #_ REGISTER_OUT f0 0xbff0000000000000\n  #_ REGISTER_OUT f1 0xffffffffffffffff\n\n# -(2^31)\ntest_fctiwz_7:\n  #_ REGISTER_IN f0 0xc1e0000000000000\n  fctiwz f1, f0\n  blr\n  #_ REGISTER_OUT f0 0xc1e0000000000000\n  #_ REGISTER_OUT f1 0xFFFFFFFF80000000\n\n# 2^31 - 1\ntest_fctiwz_8:\n  #_ REGISTER_IN f0 0x41dfffffffc00000\n  fctiwz f1, f0\n  blr\n  #_ REGISTER_OUT f0 0x41dfffffffc00000\n  #_ REGISTER_OUT f1 0x000000007fffffff\n\n# +infinity\ntest_fctiwz_9:\n  #_ REGISTER_IN f0 0x7ff0000000000000\n  fctiwz f1, f0\n  blr\n  #_ REGISTER_OUT f0 0x7ff0000000000000\n  #_ REGISTER_OUT f1 0x000000007fffffff\n\n# -infinity\ntest_fctiwz_10:\n  #_ REGISTER_IN f0 0xfff0000000000000\n  fctiwz f1, f0\n  blr\n  #_ REGISTER_OUT f0 0xfff0000000000000\n  #_ REGISTER_OUT f1 0xFFFFFFFF80000000\n\n# TODO(DrChat): Xenia doesn't handle NaNs yet.\n# # QNaN\n# test_fctiwz_11:\n#   #_ REGISTER_IN f0 0xfff8000000000000\n#   fctiwz f1, f0\n#   blr\n#   #_ REGISTER_OUT f0 0xfff8000000000000\n#   #_ REGISTER_OUT f1 0xFFFFFFFF80000000\n# \n# # SNaN\n# test_fctiwz_12:\n#   #_ REGISTER_IN f0 0xfff4000000000000\n#   fctiwz f1, f0\n#   blr\n#   #_ REGISTER_OUT f0 0xfff4000000000000\n#   #_ REGISTER_OUT f1 0xFFFFFFFF80000000\n\n# +0\ntest_fctidz_1:\n  #_ REGISTER_IN f0 0x0000000000000000\n  fctidz f1, f0\n  blr\n  #_ REGISTER_OUT f0 0x0000000000000000\n  #_ REGISTER_OUT f1 0x0000000000000000\n\n# -0\ntest_fctidz_2:\n  #_ REGISTER_IN f0 0x8000000000000000\n  fctidz f1, f0\n  blr\n  #_ REGISTER_OUT f0 0x8000000000000000\n  #_ REGISTER_OUT f1 0x0000000000000000\n\n# smallest positive subnormal\ntest_fctidz_3:\n  #_ REGISTER_IN f0 0x0000000000000001\n  fctidz f1, f0\n  blr\n  #_ REGISTER_OUT f0 0x0000000000000001\n  #_ REGISTER_OUT f1 0x0000000000000000\n\n# largest subnormal\ntest_fctidz_4:\n  #_ REGISTER_IN f0 0x000fffffffffffff\n  fctidz f1, f0\n  blr\n  #_ REGISTER_OUT f0 0x000fffffffffffff\n  #_ REGISTER_OUT f1 0x0000000000000000\n\n# +1\ntest_fctidz_5:\n  #_ REGISTER_IN f0 0x3ff0000000000000\n  fctidz f1, f0\n  blr\n  #_ REGISTER_OUT f0 0x3ff0000000000000\n  #_ REGISTER_OUT f1 0x0000000000000001\n\n# -1\ntest_fctidz_6:\n  #_ REGISTER_IN f0 0xbff0000000000000\n  fctidz f1, f0\n  blr\n  #_ REGISTER_OUT f0 0xbff0000000000000\n  #_ REGISTER_OUT f1 0xffffffffffffffff\n\n# -(2^31)\ntest_fctidz_7:\n  #_ REGISTER_IN f0 0xc1e0000000000000\n  fctidz f1, f0\n  blr\n  #_ REGISTER_OUT f0 0xc1e0000000000000\n  #_ REGISTER_OUT f1 0xffffffff80000000\n\n# 2^31 - 1\ntest_fctidz_8:\n  #_ REGISTER_IN f0 0x41dfffffffc00000\n  fctidz f1, f0\n  blr\n  #_ REGISTER_OUT f0 0x41dfffffffc00000\n  #_ REGISTER_OUT f1 0x000000007fffffff\n\n# +infinity\ntest_fctidz_9:\n  #_ REGISTER_IN f0 0x7ff0000000000000\n  fctidz f1, f0\n  blr\n  #_ REGISTER_OUT f0 0x7ff0000000000000\n  #_ REGISTER_OUT f1 0x7fffffffffffffff\n\n# -infinity\ntest_fctidz_10:\n  #_ REGISTER_IN f0 0xfff0000000000000\n  fctidz f1, f0\n  blr\n  #_ REGISTER_OUT f0 0xfff0000000000000\n  #_ REGISTER_OUT f1 0x8000000000000000\n\n# TODO(DrChat): Xenia doesn't handle NaNs yet.\n# # QNaN\n# test_fctidz_11:\n#   #_ REGISTER_IN f0 0xfff8000000000000\n#   fctidz f1, f0\n#   blr\n#   #_ REGISTER_OUT f0 0xfff8000000000000\n#   #_ REGISTER_OUT f1 0x8000000000000000\n# \n# # SNaN\n# test_fctidz_12:\n#   #_ REGISTER_IN f0 0xfff4000000000000\n#   fctidz f1, f0\n#   blr\n#   #_ REGISTER_OUT f0 0xfff4000000000000\n#   #_ REGISTER_OUT f1 0x8000000000000000\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_fmadd.s",
    "content": "test_fmadd_1:\n  #_ REGISTER_IN f1 0.0\n  #_ REGISTER_IN f2 5.0\n  #_ REGISTER_IN f3 5.0\n  #_ REGISTER_IN f4 0.0\n  fmadd f1, f2, f3, f4\n  blr\n  #_ REGISTER_OUT f1 25.0\n  #_ REGISTER_OUT f2 5.0\n  #_ REGISTER_OUT f3 5.0\n  #_ REGISTER_OUT f4 0.0\n\ntest_fmadd_2:\n  #_ REGISTER_IN f1 0.0\n  #_ REGISTER_IN f2 5.0\n  #_ REGISTER_IN f3 0.0\n  #_ REGISTER_IN f4 15.0\n  fmadd f1, f2, f3, f4\n  blr\n  #_ REGISTER_OUT f1 15.0\n  #_ REGISTER_OUT f2 5.0\n  #_ REGISTER_OUT f3 0.0\n  #_ REGISTER_OUT f4 15.0\n\ntest_fmadd_3:\n  #_ REGISTER_IN f1 0.0\n  #_ REGISTER_IN f2 5.0\n  #_ REGISTER_IN f3 5.0\n  #_ REGISTER_IN f4 15.0\n  fmadd f1, f2, f3, f4\n  blr\n  #_ REGISTER_OUT f1 40.0\n  #_ REGISTER_OUT f2 5.0\n  #_ REGISTER_OUT f3 5.0\n  #_ REGISTER_OUT f4 15.0\n\ntest_fmadd_4:\n  #_ REGISTER_IN f1 0.0\n  #_ REGISTER_IN f2 9999.99\n  #_ REGISTER_IN f3 9999.99\n  #_ REGISTER_IN f4 9999.99\n  fmadd f1, f2, f3, f4\n  blr\n  #_ REGISTER_OUT f1 100009799.9901\n  #_ REGISTER_OUT f2 9999.99\n  #_ REGISTER_OUT f3 9999.99\n  #_ REGISTER_OUT f4 9999.99\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_fmadds.s",
    "content": "test_fmadds_1:\n  #_ REGISTER_IN f1 0.0\n  #_ REGISTER_IN f2 5.0\n  #_ REGISTER_IN f3 5.0\n  #_ REGISTER_IN f4 0.0\n  fmadds f1, f2, f3, f4\n  blr\n  #_ REGISTER_OUT f1 25.0\n  #_ REGISTER_OUT f2 5.0\n  #_ REGISTER_OUT f3 5.0\n  #_ REGISTER_OUT f4 0.0\n\ntest_fmadds_2:\n  #_ REGISTER_IN f1 0.0\n  #_ REGISTER_IN f2 5.0\n  #_ REGISTER_IN f3 0.0\n  #_ REGISTER_IN f4 15.0\n  fmadds f1, f2, f3, f4\n  blr\n  #_ REGISTER_OUT f1 15.0\n  #_ REGISTER_OUT f2 5.0\n  #_ REGISTER_OUT f3 0.0\n  #_ REGISTER_OUT f4 15.0\n\ntest_fmadds_3:\n  #_ REGISTER_IN f1 0.0\n  #_ REGISTER_IN f2 5.0\n  #_ REGISTER_IN f3 5.0\n  #_ REGISTER_IN f4 15.0\n  fmadds f1, f2, f3, f4\n  blr\n  #_ REGISTER_OUT f1 40.0\n  #_ REGISTER_OUT f2 5.0\n  #_ REGISTER_OUT f3 5.0\n  #_ REGISTER_OUT f4 15.0\n\ntest_fmadds_4:\n  #_ REGISTER_IN f1 0.0\n  #_ REGISTER_IN f2 9999.99\n  #_ REGISTER_IN f3 9999.99\n  #_ REGISTER_IN f4 9999.99\n  fmadds f1, f2, f3, f4\n  blr\n  #_ REGISTER_OUT f1 100009800.0\n  #_ REGISTER_OUT f2 9999.99\n  #_ REGISTER_OUT f3 9999.99\n  #_ REGISTER_OUT f4 9999.99\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_fmul.s",
    "content": "test_fmul_1:\n  #_ REGISTER_IN f1 5.0\n  #_ REGISTER_IN f2 5.0\n  fmul f3, f1, f2\n  blr\n  #_ REGISTER_OUT f3 25.0\n\ntest_fmul_2:\n  #_ REGISTER_IN f1 5.0\n  #_ REGISTER_IN f2 0.0\n  fmul f3, f1, f2\n  blr\n  #_ REGISTER_OUT f3 0.0\n\ntest_fmul_3:\n  #_ REGISTER_IN f1 -2.0\n  #_ REGISTER_IN f2 2.0\n  fmul f3, f1, f2\n  blr\n  #_ REGISTER_OUT f3 -4.0\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_fnabs.s",
    "content": "test_fnabs_1:\n  #_ REGISTER_IN f1 0x400C000000000000\n  fnabs f2, f1\n  blr\n  #_ REGISTER_OUT f2 0xC00C000000000000\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_frsqrte.s",
    "content": "# frsqrte tests disabled because accuracy is CPU dependent.\n\ntest_frsqrte_1:\n  # _ REGISTER_IN f1 1.0\n#  frsqrte f1, f1\n  blr\n  # _ REGISTER_OUT f1 0.99975585937500000\n  # want: 0.97\n\ntest_frsqrte_2:\n  # _ REGISTER_IN f1 64.0\n#  frsqrte f1, f1\n  blr\n  # _ REGISTER_OUT f1 0.12496948242187500\n\ntest_frsqrte_3:\n  # _ REGISTER_IN f1 0.5\n#  frsqrte f1, f1\n  blr\n  # _ REGISTER_OUT f1 1.41381835937500000\n  # want: 1.375\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_fsel.s",
    "content": "test_fsel_1:\n  #_ REGISTER_IN f2 2.0\n  #_ REGISTER_IN f3 3.0\n  #_ REGISTER_IN f4 4.0\n  fsel f1, f2, f3, f4\n  blr\n  #_ REGISTER_OUT f1 3.0\n  #_ REGISTER_OUT f2 2.0\n  #_ REGISTER_OUT f3 3.0\n  #_ REGISTER_OUT f4 4.0\n\ntest_fsel_2:\n  #_ REGISTER_IN f2 -2.0\n  #_ REGISTER_IN f3 3.0\n  #_ REGISTER_IN f4 4.0\n  fsel f1, f2, f3, f4\n  blr\n  #_ REGISTER_OUT f1 4.0\n  #_ REGISTER_OUT f2 -2.0\n  #_ REGISTER_OUT f3 3.0\n  #_ REGISTER_OUT f4 4.0\n\ntest_fsel_3:\n  #_ REGISTER_IN f2 0.0\n  #_ REGISTER_IN f3 3.0\n  #_ REGISTER_IN f4 4.0\n  fsel f1, f2, f3, f4\n  blr\n  #_ REGISTER_OUT f1 3.0\n  #_ REGISTER_OUT f2 0.0\n  #_ REGISTER_OUT f3 3.0\n  #_ REGISTER_OUT f4 4.0\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_fsqrt.s",
    "content": "test_fsqrt_1:\n  #_ REGISTER_IN f1 1.0\n  fsqrt f1, f1\n  blr\n  #_ REGISTER_OUT f1 1.0000000000000000\n\ntest_fsqrt_2:\n  #_ REGISTER_IN f1 64.0\n  fsqrt f1, f1\n  blr\n  #_ REGISTER_OUT f1 8.0000000000000000\n\ntest_fsqrt_3:\n  #_ REGISTER_IN f1 0.5\n  fsqrt f1, f1\n  blr\n  #_ REGISTER_OUT f1 0.70710678118654757\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_lvexx.s",
    "content": "test_lvebx_1:\n  #_ MEMORY_IN 10001000 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f\n  #_ REGISTER_IN r4 0x10001000\n  lvebx v3, r0, r4\n  blr\n  #_ REGISTER_OUT r4 0x10001000\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n\ntest_lvebx_1_constant:\n  #_ MEMORY_IN 10001000 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f\n  lis r4, 0x1000\n  ori r4, r4, 0x1000\n  lvebx v3, r0, r4\n  blr\n  #_ REGISTER_OUT r4 0x10001000\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n\ntest_lvebx_2:\n  #_ MEMORY_IN 10001000 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f\n  #_ REGISTER_IN r4 0x10001004\n  lvebx v3, r0, r4\n  blr\n  #_ REGISTER_OUT r4 0x10001004\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n\ntest_lvebx_2_constant:\n  #_ MEMORY_IN 10001000 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f\n  lis r4, 0x1000\n  ori r4, r4, 0x1004\n  lvebx v3, r0, r4\n  blr\n  #_ REGISTER_OUT r4 0x10001004\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n\ntest_lvehx_1:\n  #_ MEMORY_IN 10001000 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f\n  #_ REGISTER_IN r4 0x10001000\n  lvehx v3, r0, r4\n  blr\n  #_ REGISTER_OUT r4 0x10001000\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n\ntest_lvehx_1_constant:\n  #_ MEMORY_IN 10001000 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f\n  lis r4, 0x1000\n  ori r4, r4, 0x1000\n  lvehx v3, r0, r4\n  blr\n  #_ REGISTER_OUT r4 0x10001000\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n\ntest_lvehx_2:\n  #_ MEMORY_IN 10001000 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f\n  #_ REGISTER_IN r4 0x10001004\n  lvehx v3, r0, r4\n  blr\n  #_ REGISTER_OUT r4 0x10001004\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n\ntest_lvehx_2_constant:\n  #_ MEMORY_IN 10001000 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f\n  lis r4, 0x1000\n  ori r4, r4, 0x1004\n  lvehx v3, r0, r4\n  blr\n  #_ REGISTER_OUT r4 0x10001004\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n\ntest_lvewx_1:\n  #_ MEMORY_IN 10001000 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f\n  #_ REGISTER_IN r4 0x10001000\n  lvewx v3, r0, r4\n  blr\n  #_ REGISTER_OUT r4 0x10001000\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n\ntest_lvewx_1_constant:\n  #_ MEMORY_IN 10001000 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f\n  lis r4, 0x1000\n  ori r4, r4, 0x1000\n  lvewx v3, r0, r4\n  blr\n  #_ REGISTER_OUT r4 0x10001000\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n\ntest_lvewx_2:\n  #_ MEMORY_IN 10001000 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f\n  #_ REGISTER_IN r4 0x10001004\n  lvewx v3, r0, r4\n  blr\n  #_ REGISTER_OUT r4 0x10001004\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n\ntest_lvewx_2_constant:\n  #_ MEMORY_IN 10001000 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f\n  lis r4, 0x1000\n  ori r4, r4, 0x1004\n  lvewx v3, r0, r4\n  blr\n  #_ REGISTER_OUT r4 0x10001004\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n\ntest_lvewx128_1:\n  #_ MEMORY_IN 10001000 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f\n  #_ REGISTER_IN r4 0x10001000\n  lvewx128 v3, r0, r4\n  blr\n  #_ REGISTER_OUT r4 0x10001000\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n\ntest_lvewx128_1_constant:\n  #_ MEMORY_IN 10001000 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f\n  lis r4, 0x1000\n  ori r4, r4, 0x1000\n  lvewx128 v3, r0, r4\n  blr\n  #_ REGISTER_OUT r4 0x10001000\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n\ntest_lvewx128_2:\n  #_ MEMORY_IN 10001000 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f\n  #_ REGISTER_IN r4 0x10001004\n  lvewx128 v3, r0, r4\n  blr\n  #_ REGISTER_OUT r4 0x10001004\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n\ntest_lvewx128_2_constant:\n  #_ MEMORY_IN 10001000 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f\n  lis r4, 0x1000\n  ori r4, r4, 0x1004\n  lvewx128 v3, r0, r4\n  blr\n  #_ REGISTER_OUT r4 0x10001004\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_lvl.s",
    "content": "test_lvl_1:\n  #_ MEMORY_IN 10001077 0a 0b 0c 0d 0e 0f 10 13 0c 0d 0e 10 11 12 13 14 ff ff ff ff ff ff\n  #_ REGISTER_IN r4 0x10001077\n  lvlx v3, r4, r0\n  blr\n  #_ REGISTER_OUT r4 0x10001077\n  #_ REGISTER_OUT v3 [0A0B0C0D, 0E0F1013, 0C000000, 00000000]\n\ntest_lvl_1_constant:\n  #_ MEMORY_IN 10001077 0a 0b 0c 0d 0e 0f 10 13 0c 0d 0e 10 11 12 13 14 ff ff ff ff ff ff\n  lis r4, 0x1000\n  ori r4, r4, 0x1077\n  lvlx v3, r4, r0\n  blr\n  #_ REGISTER_OUT r4 0x10001077\n  #_ REGISTER_OUT v3 [0A0B0C0D, 0E0F1013, 0C000000, 00000000]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_lvr.s",
    "content": "test_lvr_1:\n  #_ MEMORY_IN 100010B0 090A0A0B 0C0F120A 0B0C0D0E 0F10130C 0D0E1011 121314FF FFFFFFFF\n  #_ REGISTER_IN r4 0x100010B7\n  #_ REGISTER_IN r5 0x10\n  lvrx v3, r4, r5\n  blr\n  #_ REGISTER_OUT r4 0x100010B7\n  #_ REGISTER_OUT r5 0x10\n  #_ REGISTER_OUT v3 [00000000, 00000000, 000D0E10, 11121314]\n\ntest_lvr_1_constant:\n  #_ MEMORY_IN 100010B0 090A0A0B 0C0F120A 0B0C0D0E 0F10130C 0D0E1011 121314FF FFFFFFFF\n  lis r4, 0x1000\n  ori r4, r4, 0x10B7\n  li r5, 0x10\n  lvrx v3, r4, r5\n  blr\n  #_ REGISTER_OUT r4 0x100010B7\n  #_ REGISTER_OUT r5 0x10\n  #_ REGISTER_OUT v3 [00000000, 00000000, 000D0E10, 11121314]\n\ntest_lvr_2:\n  #_ REGISTER_IN r4 0x20000000\n  #_ REGISTER_IN r5 0x10\n  #_ REGISTER_IN v3 [FFFFFFFF, FFFFFFFF, FFFFFFFF, FFFFFFFF]\n  lvrx v3, r4, r5\n  blr\n  #_ REGISTER_OUT r4 0x20000000\n  #_ REGISTER_OUT r5 0x10\n  #_ REGISTER_OUT v3 [00000000, 00000000, 00000000, 00000000]\n\ntest_lvr_2_constant:\n  #_ REGISTER_IN v3 [FFFFFFFF, FFFFFFFF, FFFFFFFF, FFFFFFFF]\n  lis r4, 0x2000\n  li r5, 0x10\n  lvrx v3, r4, r5\n  blr\n  #_ REGISTER_OUT r4 0x20000000\n  #_ REGISTER_OUT r5 0x10\n  #_ REGISTER_OUT v3 [00000000, 00000000, 00000000, 00000000]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_lvsl.s",
    "content": "test_lvsl_1:\n  #_ REGISTER_IN r4 0x1070\n  lvsl v3, r4, r0\n  blr\n  #_ REGISTER_OUT r4 0x1070\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n\ntest_lvsl_1_constant:\n  li r4, 0x1070\n  lvsl v3, r4, r0\n  blr\n  #_ REGISTER_OUT r4 0x1070\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n\ntest_lvsl_2:\n  #_ REGISTER_IN r4 0x1071\n  lvsl v3, r4, r0\n  blr\n  #_ REGISTER_OUT r4 0x1071\n  #_ REGISTER_OUT v3 [01020304, 05060708, 090A0B0C, 0D0E0F10]\n\ntest_lvsl_2_constant:\n  li r4, 0x1071\n  lvsl v3, r4, r0\n  blr\n  #_ REGISTER_OUT r4 0x1071\n  #_ REGISTER_OUT v3 [01020304, 05060708, 090A0B0C, 0D0E0F10]\n\ntest_lvsl_3:\n  #_ REGISTER_IN r4 0x107F\n  lvsl v3, r4, r0\n  blr\n  #_ REGISTER_OUT r4 0x107F\n  #_ REGISTER_OUT v3 [0F101112, 13141516, 1718191A, 1B1C1D1E]\n\ntest_lvsl_3_constant:\n  li r4, 0x107F\n  lvsl v3, r4, r0\n  blr\n  #_ REGISTER_OUT r4 0x107F\n  #_ REGISTER_OUT v3 [0F101112, 13141516, 1718191A, 1B1C1D1E]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_lvsr.s",
    "content": "test_lvsr_1:\n  #_ REGISTER_IN r4 0x1070\n  lvsr v3, r4, r0\n  blr\n  #_ REGISTER_OUT r4 0x1070\n  #_ REGISTER_OUT v3 [10111213, 14151617, 18191A1B, 1C1D1E1F]\n\ntest_lvsr_1_constant:\n  li r4, 0x1070\n  lvsr v3, r4, r0\n  blr\n  #_ REGISTER_OUT r4 0x1070\n  #_ REGISTER_OUT v3 [10111213, 14151617, 18191A1B, 1C1D1E1F]\n\ntest_lvsr_2:\n  #_ REGISTER_IN r4 0x1071\n  lvsr v3, r4, r0\n  blr\n  #_ REGISTER_OUT r4 0x1071\n  #_ REGISTER_OUT v3 [0F101112, 13141516, 1718191A, 1B1C1D1E]\n\ntest_lvsr_2_constant:\n  li r4, 0x1071\n  lvsr v3, r4, r0\n  blr\n  #_ REGISTER_OUT r4 0x1071\n  #_ REGISTER_OUT v3 [0F101112, 13141516, 1718191A, 1B1C1D1E]\n\ntest_lvsr_3:\n  #_ REGISTER_IN r4 0x107F\n  lvsr v3, r4, r0\n  blr\n  #_ REGISTER_OUT r4 0x107F\n  #_ REGISTER_OUT v3 [01020304, 05060708, 090A0B0C, 0D0E0F10]\n\ntest_lvsr_3_constant:\n  li r4, 0x107F\n  lvsr v3, r4, r0\n  blr\n  #_ REGISTER_OUT r4 0x107F\n  #_ REGISTER_OUT v3 [01020304, 05060708, 090A0B0C, 0D0E0F10]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_mulhd.s",
    "content": "test_mulhd_1:\n  #_ REGISTER_IN r4 1\n  #_ REGISTER_IN r5 0\n  mulhd r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 0\n\ntest_mulhd_1_constant:\n  li r4, 1\n  li r5, 0\n  mulhd r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 0\n\ntest_mulhd_2:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 1\n  mulhd r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 1\n\ntest_mulhd_2_constant:\n  li r4, -1\n  li r5, 1\n  mulhd r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 1\n\ntest_mulhd_3:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 2\n  mulhd r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 2\n\ntest_mulhd_3_constant:\n  li r4, -1\n  li r5, 2\n  mulhd r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 2\n\ntest_mulhd_4:\n  #_ REGISTER_IN r4 0x8000000000000000\n  #_ REGISTER_IN r5 1\n  mulhd r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0x8000000000000000\n  #_ REGISTER_OUT r5 1\n\ntest_mulhd_4_constant:\n  li r5, 1\n  sldi r4, r5, 63\n  mulhd r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0x8000000000000000\n  #_ REGISTER_OUT r5 1\n\ntest_mulhd_5:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 0xFFFFFFFFFFFFFFFF\n  mulhd r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n\ntest_mulhd_5_constant:\n  li r4, -1\n  li r5, -1\n  mulhd r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_mulhdu.s",
    "content": "test_mulhdu_1:\n  #_ REGISTER_IN r4 1\n  #_ REGISTER_IN r5 0\n  mulhdu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 0\n\ntest_mulhdu_1_constant:\n  li r4, 1\n  li r5, 0\n  mulhdu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 0\n\ntest_mulhdu_2:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 1\n  mulhdu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 1\n\ntest_mulhdu_2_constant:\n  li r4, -1\n  li r5, 1\n  mulhdu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 1\n\ntest_mulhdu_3:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 2\n  mulhdu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 2\n\ntest_mulhdu_3_constant:\n  li r4, -1\n  li r5, 2\n  mulhdu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 2\n\ntest_mulhdu_4:\n  #_ REGISTER_IN r4 0x8000000000000000\n  #_ REGISTER_IN r5 1\n  mulhdu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0x8000000000000000\n  #_ REGISTER_OUT r5 1\n\ntest_mulhdu_4_constant:\n  li r5, 1\n  sldi r4, r5, 63\n  mulhdu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0x8000000000000000\n  #_ REGISTER_OUT r5 1\n\ntest_mulhdu_5:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 0xFFFFFFFFFFFFFFFF\n  mulhdu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFE\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n\ntest_mulhdu_5_constant:\n  li r4, -1\n  li r5, -1\n  mulhdu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFE\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_mulhw.s",
    "content": "test_mulhw_1:\n  #_ REGISTER_IN r4 1\n  #_ REGISTER_IN r5 0\n  mulhw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 0\n\ntest_mulhw_1_constant:\n  li r4, 1\n  li r5, 0\n  mulhw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 0\n\ntest_mulhw_2:\n  #_ REGISTER_IN r4 0x00000000FFFFFFFF\n  #_ REGISTER_IN r5 1\n  mulhw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0x00000000FFFFFFFF\n  #_ REGISTER_OUT r5 1\n\ntest_mulhw_2_constant:\n  li r4, -1\n  clrldi r4, r4, 32\n  li r5, 1\n  mulhw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0x00000000FFFFFFFF\n  #_ REGISTER_OUT r5 1\n\ntest_mulhw_3:\n  #_ REGISTER_IN r4 0x00000001FFFFFFFF\n  #_ REGISTER_IN r5 1\n  mulhw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0x00000001FFFFFFFF\n  #_ REGISTER_OUT r5 1\n\ntest_mulhw_3_constant:\n  li r4, -1\n  clrldi r4, r4, 31\n  li r5, 1\n  mulhw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0x00000001FFFFFFFF\n  #_ REGISTER_OUT r5 1\n\ntest_mulhw_4:\n  #_ REGISTER_IN r4 0x800000007FFFFFFF\n  #_ REGISTER_IN r5 1\n  mulhw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0x800000007FFFFFFF\n  #_ REGISTER_OUT r5 1\n\ntest_mulhw_4_constant:\n  li r4, -1\n  clrldi r4, r4, 33\n  li r5, 1\n  sldi r5, r5, 63\n  or r4, r4, r5\n  li r5, 1\n  mulhw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0x800000007FFFFFFF\n  #_ REGISTER_OUT r5 1\n\ntest_mulhw_5:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 1\n  mulhw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 1\n\ntest_mulhw_5_constant:\n  li r4, -1\n  li r5, 1\n  mulhw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 1\n\ntest_mulhw_6:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 0xFFFFFFFFFFFFFFFF\n  mulhw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n\ntest_mulhw_6_constant:\n  li r4, -1\n  li r5, -1\n  mulhw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_mulhwu.s",
    "content": "test_mulhwu_1:\n  #_ REGISTER_IN r4 1\n  #_ REGISTER_IN r5 0\n  mulhwu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 0\n\ntest_mulhwu_1_constant:\n  li r4, 1\n  li r5, 0\n  mulhwu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 0\n\ntest_mulhwu_2:\n  #_ REGISTER_IN r4 0x00000000FFFFFFFF\n  #_ REGISTER_IN r5 1\n  mulhwu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0x00000000FFFFFFFF\n  #_ REGISTER_OUT r5 1\n\ntest_mulhwu_2_constant:\n  li r4, -1\n  clrldi r4, r4, 32\n  li r5, 1\n  mulhwu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0x00000000FFFFFFFF\n  #_ REGISTER_OUT r5 1\n\ntest_mulhwu_3:\n  #_ REGISTER_IN r4 0x00000001FFFFFFFF\n  #_ REGISTER_IN r5 1\n  mulhwu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0x00000001FFFFFFFF\n  #_ REGISTER_OUT r5 1\n\ntest_mulhwu_3_constant:\n  li r4, -1\n  clrldi r4, r4, 31\n  li r5, 1\n  mulhwu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0x00000001FFFFFFFF\n  #_ REGISTER_OUT r5 1\n\ntest_mulhwu_4:\n  #_ REGISTER_IN r4 0x800000007FFFFFFF\n  #_ REGISTER_IN r5 1\n  mulhwu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0x800000007FFFFFFF\n  #_ REGISTER_OUT r5 1\n\ntest_mulhwu_4_constant:\n  li r4, -1\n  clrldi r4, r4, 33\n  li r5, 1\n  sldi r5, r5, 63\n  or r4, r4, r5\n  li r5, 1\n  mulhwu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0x800000007FFFFFFF\n  #_ REGISTER_OUT r5 1\n\ntest_mulhwu_5:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 1\n  mulhwu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 1\n\ntest_mulhwu_5_constant:\n  li r4, -1\n  li r5, 1\n  mulhwu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 1\n\ntest_mulhwu_6:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 0xFFFFFFFFFFFFFFFF\n  mulhwu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0x00000000FFFFFFFE\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n\ntest_mulhwu_6_constant:\n  li r4, -1\n  li r5, -1\n  mulhwu r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0x00000000FFFFFFFE\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0xFFFFFFFFFFFFFFFF\n\ntest_mulhwu_7:\n  #_ REGISTER_IN r0 0x1\n  #_ REGISTER_IN r3 0xFFFFFFFF\n  mulhwu. r0, r3, r0\n  blr\n  #_ REGISTER_OUT r0 0\n  #_ REGISTER_OUT r3 0xFFFFFFFF\n  #_ REGISTER_OUT cr 0x0000000020000000\n\ntest_mulhwu_8:\n  #_ REGISTER_IN r0 0x1\n  #_ REGISTER_IN r3 0x1FFFFFFFF\n  mulhwu. r0, r3, r0\n  blr\n  #_ REGISTER_OUT r0 0\n  #_ REGISTER_OUT r3 0x1FFFFFFFF\n  #_ REGISTER_OUT cr 0x0000000020000000\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_mulld.s",
    "content": "test_mulld_1:\n  #_ REGISTER_IN r4 1\n  #_ REGISTER_IN r5 0\n  mulld r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 0\n\ntest_mulld_1_constant:\n  li r4, 1\n  li r5, 0\n  mulld r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 0\n\ntest_mulld_2:\n  #_ REGISTER_IN r4 1\n  #_ REGISTER_IN r5 1\n  mulld r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 1\n\ntest_mulld_2_constant:\n  li r4, 1\n  li r5, 1\n  mulld r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 1\n\ntest_mulld_3:\n  #_ REGISTER_IN r4 1\n  #_ REGISTER_IN r5 -1\n  mulld r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 -1\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 -1\n\ntest_mulld_3_constant:\n  li r4, 1\n  li r5, -1\n  mulld r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 -1\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 -1\n\ntest_mulld_4:\n  #_ REGISTER_IN r4 123\n  #_ REGISTER_IN r5 -1\n  mulld r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 -123\n  #_ REGISTER_OUT r4 123\n  #_ REGISTER_OUT r5 -1\n\ntest_mulld_4_constant:\n  li r4, 123\n  li r5, -1\n  mulld r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 -123\n  #_ REGISTER_OUT r4 123\n  #_ REGISTER_OUT r5 -1\n\ntest_mulld_5:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 1\n  mulld r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 1\n\ntest_mulld_5_constant:\n  li r4, -1\n  li r5, 1\n  mulld r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 1\n\ntest_mulld_6:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 2\n  mulld r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFE\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 2\n\ntest_mulld_6_constant:\n  li r4, -1\n  li r5, 2\n  mulld r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFE\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 2\n\ntest_mulld_7:\n  #_ REGISTER_IN r4 1\n  #_ REGISTER_IN r5 -1\n  mulld r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 -1\n\ntest_mulld_7_constant:\n  li r4, 1\n  li r5, -1\n  mulld r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 -1\n\ntest_mulld_8:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 -1\n  mulld r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 -1\n\ntest_mulld_8_constant:\n  li r4, -1\n  li r5, -1\n  mulld r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 -1\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_mulli.s",
    "content": "test_mulli_1:\n  #_ REGISTER_IN r4 1\n  mulli r3, r4, 0\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 1\n\ntest_mulli_1_constant:\n  li r4, 1\n  mulli r3, r4, 0\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 1\n\ntest_mulli_2:\n  #_ REGISTER_IN r4 1\n  mulli r3, r4, 1\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 1\n\ntest_mulli_2_constant:\n  li r4, 1\n  mulli r3, r4, 1\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 1\n\ntest_mulli_3:\n  #_ REGISTER_IN r4 1\n  mulli r3, r4, -1\n  blr\n  #_ REGISTER_OUT r3 -1\n  #_ REGISTER_OUT r4 1\n\ntest_mulli_3_constant:\n  li r4, 1\n  mulli r3, r4, -1\n  blr\n  #_ REGISTER_OUT r3 -1\n  #_ REGISTER_OUT r4 1\n\ntest_mulli_4:\n  #_ REGISTER_IN r4 123\n  mulli r3, r4, -1\n  blr\n  #_ REGISTER_OUT r3 -123\n  #_ REGISTER_OUT r4 123\n\ntest_mulli_4_constant:\n  li r4, 123\n  mulli r3, r4, -1\n  blr\n  #_ REGISTER_OUT r3 -123\n  #_ REGISTER_OUT r4 123\n\ntest_mulli_5:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  mulli r3, r4, 1\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n\ntest_mulli_5_constant:\n  li r4, -1\n  mulli r3, r4, 1\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n\ntest_mulli_6:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  mulli r3, r4, 2\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFE\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n\ntest_mulli_6_constant:\n  li r4, -1\n  mulli r3, r4, 2\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFE\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n\ntest_mulli_7:\n  #_ REGISTER_IN r4 1\n  mulli r3, r4, -1\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 1\n\ntest_mulli_7_constant:\n  li r4, 1\n  mulli r3, r4, -1\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 1\n\ntest_mulli_8:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  mulli r3, r4, -1\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n\ntest_mulli_8_constant:\n  li r4, -1\n  mulli r3, r4, -1\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_mullw.s",
    "content": "test_mullw_1:\n  #_ REGISTER_IN r4 1\n  #_ REGISTER_IN r5 0\n  mullw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 0\n\ntest_mullw_1_constant:\n  li r4, 1\n  li r5, 0\n  mullw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 0\n\ntest_mullw_2:\n  #_ REGISTER_IN r4 1\n  #_ REGISTER_IN r5 1\n  mullw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 1\n\ntest_mullw_2_constant:\n  li r4, 1\n  li r5, 1\n  mullw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 1\n\ntest_mullw_3:\n  #_ REGISTER_IN r4 1\n  #_ REGISTER_IN r5 -1\n  mullw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 -1\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 -1\n\ntest_mullw_3_constant:\n  li r4, 1\n  li r5, -1\n  mullw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 -1\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 -1\n\ntest_mullw_4:\n  #_ REGISTER_IN r4 123\n  #_ REGISTER_IN r5 -1\n  mullw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 -123\n  #_ REGISTER_OUT r4 123\n  #_ REGISTER_OUT r5 -1\n\ntest_mullw_4_constant:\n  li r4, 123\n  li r5, -1\n  mullw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 -123\n  #_ REGISTER_OUT r4 123\n  #_ REGISTER_OUT r5 -1\n\ntest_mullw_5:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 1\n  mullw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 1\n\ntest_mullw_5_constant:\n  li r4, -1\n  li r5, 1\n  mullw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 1\n\ntest_mullw_6:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 2\n  mullw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFE\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 2\n\ntest_mullw_6_constant:\n  li r4, -1\n  li r5, 2\n  mullw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFE\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 2\n\ntest_mullw_7:\n  #_ REGISTER_IN r4 1\n  #_ REGISTER_IN r5 -1\n  mullw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 -1\n\ntest_mullw_7_constant:\n  li r4, 1\n  li r5, -1\n  mullw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 -1\n\ntest_mullw_8:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 -1\n  mullw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 -1\n\ntest_mullw_8_constant:\n  li r4, -1\n  li r5, -1\n  mullw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 -1\n\ntest_mullw_9:\n  #_ REGISTER_IN r4 0xFFFFFFFF00000000\n  #_ REGISTER_IN r5 1\n  mullw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0xFFFFFFFF00000000\n  #_ REGISTER_OUT r5 1\n\ntest_mullw_9_constant:\n  li r4, -1\n  sldi r4, r4, 32\n  li r5, 1\n  mullw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0xFFFFFFFF00000000\n  #_ REGISTER_OUT r5 1\n\ntest_mullw_10:\n  #_ REGISTER_IN r4 1\n  #_ REGISTER_IN r5 0xFFFFFFFF00000000\n  mullw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 0xFFFFFFFF00000000\n\ntest_mullw_10_constant:\n  li r4, 1\n  li r5, -1\n  sldi r5, r5, 32\n  mullw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 0xFFFFFFFF00000000\n\ntest_mullw_11:\n  #_ REGISTER_IN r4 1\n  #_ REGISTER_IN r5 0x000000007FFFFFFF\n  mullw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0x000000007FFFFFFF\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 0x000000007FFFFFFF\n\ntest_mullw_11_constant:\n  li r4, 1\n  li r5, -1\n  clrldi r5, r5, 33\n  mullw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0x000000007FFFFFFF\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 0x000000007FFFFFFF\n\ntest_mullw_12:\n  #_ REGISTER_IN r0 0x1\n  #_ REGISTER_IN r8 0x0123456789ABCDEF\n  mullw r0, r8, r8\n  blr\n  #_ REGISTER_OUT r0 0x36B1B9D890F2A521\n  #_ REGISTER_OUT r8 0x0123456789ABCDEF\n  blr\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_neg.s",
    "content": "test_neg_1:\n  #_ REGISTER_IN r3 0x0000000080000000\n  neg r3, r3\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFF80000000\n\ntest_neg_1_constant:\n  li r3, 1\n  sldi r3, r3, 31\n  neg r3, r3\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFF80000000\n\ntest_neg_2:\n  #_ REGISTER_IN r3 0x8000000000000000\n  neg r3, r3\n  blr\n  #_ REGISTER_OUT r3 0x8000000000000000\n\ntest_neg_2_constant:\n  li r3, 1\n  sldi r3, r3, 63\n  neg r3, r3\n  blr\n  #_ REGISTER_OUT r3 0x8000000000000000\n\ntest_neg_3:\n  #_ REGISTER_IN r3 0x0000000000000005\n  neg r3, r3\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFB\n\ntest_neg_3_constant:\n  li r3, 5\n  neg r3, r3\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFB\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_nor.s",
    "content": "test_nor_cr_1:\n  #_ REGISTER_IN r3 0x00000000FFFFFFFF\n  nor. r3, r3, r3\n  li r3, 0\n  bne nor_cr_1_ne\n  li r3, 1\nnor_cr_1_ne:\n  blr\n  #_ REGISTER_OUT r3 1\n\ntest_nor_cr_1_constant:\n  li r3, -1\n  clrldi r3, r3, 32\n  nor. r3, r3, r3\n  li r3, 0\n  bne nor_cr_1_constant_ne\n  li r3, 1\nnor_cr_1_constant_ne:\n  blr\n  #_ REGISTER_OUT r3 1\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_ori.s",
    "content": ".macro make_test_constant dest\n  lis \\dest, 0xDEAD\n  ori \\dest, \\dest, 0xBEEF\n  sldi \\dest, \\dest, 32\n.endm\n\ntest_ori_1:\n  #_ REGISTER_IN r4 0xDEADBEEF00000000\n\n  ori r3, r4, 0xFEDC\n\n  blr\n  #_ REGISTER_OUT r3 0xDEADBEEF0000FEDC\n  #_ REGISTER_OUT r4 0xDEADBEEF00000000\n\ntest_ori_1_constant:\n  make_test_constant r4\n  ori r3, r4, 0xFEDC\n\n  blr\n  #_ REGISTER_OUT r3 0xDEADBEEF0000FEDC\n  #_ REGISTER_OUT r4 0xDEADBEEF00000000\n\ntest_ori_2:\n  #_ REGISTER_IN r4 0xDEADBEEF10000000\n\n  ori r3, r4, 0xFEDC\n\n  blr\n  #_ REGISTER_OUT r3 0xDEADBEEF1000FEDC\n  #_ REGISTER_OUT r4 0xDEADBEEF10000000\n\ntest_ori_2_constant:\n  make_test_constant r4\n  lis r3, 0x1000\n  or r4, r4, r3\n\n  ori r3, r4, 0xFEDC\n\n  blr\n  #_ REGISTER_OUT r3 0xDEADBEEF1000FEDC\n  #_ REGISTER_OUT r4 0xDEADBEEF10000000\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_rldicl.s",
    "content": ".macro make_full_test_constant dest, a, b, c, d\n  lis \\dest, \\a\n  ori \\dest, \\dest, \\b\n  sldi \\dest, \\dest, 32\n  lis r3, \\c\n  ori r3, r3, \\d\n  clrldi r3, r3, 32\n  or \\dest, \\dest, r3\n.endm\n\ntest_rldicl_1:\n  #_ REGISTER_IN r4 0x0123456789ABCDEF\n  rldicl r3, r4, 24, 0\n  blr\n  #_ REGISTER_OUT r3 0x6789abcdef012345\n  #_ REGISTER_OUT r4 0x0123456789ABCDEF\n\ntest_rldicl_1_constant:\n  make_full_test_constant r4, 0x0123, 0x4567, 0x89AB, 0xCDEF\n  rldicl r3, r4, 24, 0\n  blr\n  #_ REGISTER_OUT r3 0x6789abcdef012345\n  #_ REGISTER_OUT r4 0x0123456789ABCDEF\n\ntest_rldicl_2:\n  #_ REGISTER_IN r4 0x0123456789ABCDEF\n  rldicl r3, r4, 24, 8\n  blr\n  #_ REGISTER_OUT r3 0x0089abcdef012345\n  #_ REGISTER_OUT r4 0x0123456789ABCDEF\n\ntest_rldicl_2_constant:\n  make_full_test_constant r4, 0x0123, 0x4567, 0x89AB, 0xCDEF\n  rldicl r3, r4, 24, 8\n  blr\n  #_ REGISTER_OUT r3 0x0089abcdef012345\n  #_ REGISTER_OUT r4 0x0123456789ABCDEF\n\ntest_rldicl_3:\n  #_ REGISTER_IN r4 0x0123456789ABCDEF\n  rldicl r3, r4, 24, 63\n  blr\n  #_ REGISTER_OUT r3 0x0000000000000001\n  #_ REGISTER_OUT r4 0x0123456789ABCDEF\n\ntest_rldicl_3_constant:\n  make_full_test_constant r4, 0x0123, 0x4567, 0x89AB, 0xCDEF\n  rldicl r3, r4, 24, 63\n  blr\n  #_ REGISTER_OUT r3 0x0000000000000001\n  #_ REGISTER_OUT r4 0x0123456789ABCDEF\n\ntest_rldicl_4:\n  #_ REGISTER_IN r4 0x0123456789ABCDEF\n  rldicl r3, r4, 0, 0\n  blr\n  #_ REGISTER_OUT r3 0x0123456789abcdef\n  #_ REGISTER_OUT r4 0x0123456789ABCDEF\n\ntest_rldicl_4_constant:\n  make_full_test_constant r4, 0x0123, 0x4567, 0x89AB, 0xCDEF\n  rldicl r3, r4, 0, 0\n  blr\n  #_ REGISTER_OUT r3 0x0123456789abcdef\n  #_ REGISTER_OUT r4 0x0123456789ABCDEF\n\ntest_rldicl_5:\n  #_ REGISTER_IN r4 0x0123456789ABCDEF\n  rldicl r3, r4, 0, 63\n  blr\n  #_ REGISTER_OUT r3 0x0000000000000001\n  #_ REGISTER_OUT r4 0x0123456789ABCDEF\n\ntest_rldicl_5_constant:\n  make_full_test_constant r4, 0x0123, 0x4567, 0x89AB, 0xCDEF\n  rldicl r3, r4, 0, 63\n  blr\n  #_ REGISTER_OUT r3 0x0000000000000001\n  #_ REGISTER_OUT r4 0x0123456789ABCDEF\n\ntest_rldicl_6:\n  #_ REGISTER_IN r4 0x0123456789ABCDEF\n  rldicl r3, r4, 0, 8\n  blr\n  #_ REGISTER_OUT r3 0x0023456789abcdef\n  #_ REGISTER_OUT r4 0x0123456789ABCDEF\n\ntest_rldicl_6_constant:\n  make_full_test_constant r4, 0x0123, 0x4567, 0x89AB, 0xCDEF\n  rldicl r3, r4, 0, 8\n  blr\n  #_ REGISTER_OUT r3 0x0023456789abcdef\n  #_ REGISTER_OUT r4 0x0123456789ABCDEF\n\ntest_rldicl_7:\n  #_ REGISTER_IN r4 0x0123456789ABCDEF\n  rldicl r3, r4, 63, 0\n  blr\n  #_ REGISTER_OUT r3 0x8091a2b3c4d5e6f7\n  #_ REGISTER_OUT r4 0x0123456789ABCDEF\n\ntest_rldicl_7_constant:\n  make_full_test_constant r4, 0x0123, 0x4567, 0x89AB, 0xCDEF\n  rldicl r3, r4, 63, 0\n  blr\n  #_ REGISTER_OUT r3 0x8091a2b3c4d5e6f7\n  #_ REGISTER_OUT r4 0x0123456789ABCDEF\n\ntest_rldicl_8:\n  #_ REGISTER_IN r4 0x0123456789ABCDEF\n  rldicl r3, r4, 63, 63\n  blr\n  #_ REGISTER_OUT r3 0x0000000000000001\n  #_ REGISTER_OUT r4 0x0123456789ABCDEF\n\ntest_rldicl_8_constant:\n  make_full_test_constant r4, 0x0123, 0x4567, 0x89AB, 0xCDEF\n  rldicl r3, r4, 63, 63\n  blr\n  #_ REGISTER_OUT r3 0x0000000000000001\n  #_ REGISTER_OUT r4 0x0123456789ABCDEF\n\ntest_rldicl_9:\n  #_ REGISTER_IN r4 0x0123456789ABCDEF\n  rldicl r3, r4, 31, 0\n  blr\n  #_ REGISTER_OUT r3 0xc4d5e6f78091a2b3\n  #_ REGISTER_OUT r4 0x0123456789ABCDEF\n\ntest_rldicl_9_constant:\n  make_full_test_constant r4, 0x0123, 0x4567, 0x89AB, 0xCDEF\n  rldicl r3, r4, 31, 0\n  blr\n  #_ REGISTER_OUT r3 0xc4d5e6f78091a2b3\n  #_ REGISTER_OUT r4 0x0123456789ABCDEF\n\ntest_rldicl_10:\n  #_ REGISTER_IN r4 0x16300000\n  rldicl r3, r4, 58, 6\n  blr\n  #_ REGISTER_OUT r3 0x58C000\n  #_ REGISTER_OUT r4 0x16300000\n\ntest_rldicl_10_constant:\n  lis r4, 0x1630\n  rldicl r3, r4, 58, 6\n  blr\n  #_ REGISTER_OUT r3 0x58C000\n  #_ REGISTER_OUT r4 0x16300000\n\ntest_srdi_1:\n  #_ REGISTER_IN r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r4 0x0123456789ABCDEF\n  srdi r3, r3, 0\n  srdi r4, r4, 0\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0x0123456789ABCDEF\n\ntest_srdi_1_constant:\n  make_full_test_constant r4, 0x0123, 0x4567, 0x89AB, 0xCDEF\n  li r3, -1\n  srdi r3, r3, 0\n  srdi r4, r4, 0\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0x0123456789ABCDEF\n\ntest_srdi_2:\n  #_ REGISTER_IN r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r4 0x0123456789ABCDEF\n  srdi r3, r3, 1\n  srdi r4, r4, 1\n  blr\n  #_ REGISTER_OUT r3 0x7fffffffffffffff\n  #_ REGISTER_OUT r4 0x0091a2b3c4d5e6f7\n\ntest_srdi_2_constant:\n  make_full_test_constant r4, 0x0123, 0x4567, 0x89AB, 0xCDEF\n  li r3, -1\n  srdi r3, r3, 1\n  srdi r4, r4, 1\n  blr\n  #_ REGISTER_OUT r3 0x7fffffffffffffff\n  #_ REGISTER_OUT r4 0x0091a2b3c4d5e6f7\n\ntest_srdi_3:\n  #_ REGISTER_IN r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r4 0x0123456789ABCDEF\n  srdi r3, r3, 32\n  srdi r4, r4, 32\n  blr\n  #_ REGISTER_OUT r3 0x00000000ffffffff\n  #_ REGISTER_OUT r4 0x0000000001234567\n\ntest_srdi_3_constant:\n  make_full_test_constant r4, 0x0123, 0x4567, 0x89AB, 0xCDEF\n  li r3, -1\n  srdi r3, r3, 32\n  srdi r4, r4, 32\n  blr\n  #_ REGISTER_OUT r3 0x00000000ffffffff\n  #_ REGISTER_OUT r4 0x0000000001234567\n\ntest_srdi_4:\n  #_ REGISTER_IN r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r4 0x0123456789ABCDEF\n  srdi r3, r3, 63\n  srdi r4, r4, 63\n  blr\n  #_ REGISTER_OUT r3 0x0000000000000001\n  #_ REGISTER_OUT r4 0x0000000000000000\n\ntest_srdi_4_constant:\n  make_full_test_constant r4, 0x0123, 0x4567, 0x89AB, 0xCDEF\n  li r3, -1\n  srdi r3, r3, 63\n  srdi r4, r4, 63\n  blr\n  #_ REGISTER_OUT r3 0x0000000000000001\n  #_ REGISTER_OUT r4 0x0000000000000000\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_rldicr.s",
    "content": ".macro make_full_test_constant dest, a, b, c, d\n  lis \\dest, \\a\n  ori \\dest, \\dest, \\b\n  sldi \\dest, \\dest, 32\n  lis r3, \\c\n  ori r3, r3, \\d\n  clrldi r3, r3, 32\n  or \\dest, \\dest, r3\n.endm\n\ntest_rldicr_1:\n  #_ REGISTER_IN r4 0x0123456789ABCDEF\n  rldicr r3, r4, 24, 0\n  blr\n  #_ REGISTER_OUT r3 0x0000000000000000\n  #_ REGISTER_OUT r4 0x0123456789ABCDEF\n\ntest_rldicr_1_constant:\n  make_full_test_constant r4, 0x0123, 0x4567, 0x89AB, 0xCDEF\n  rldicr r3, r4, 24, 0\n  blr\n  #_ REGISTER_OUT r3 0x0000000000000000\n  #_ REGISTER_OUT r4 0x0123456789ABCDEF\n\ntest_rldicr_2:\n  #_ REGISTER_IN r4 0x0123456789ABCDEF\n  rldicr r3, r4, 24, 8\n  blr\n  #_ REGISTER_OUT r3 0x6780000000000000\n  #_ REGISTER_OUT r4 0x0123456789ABCDEF\n\ntest_rldicr_2_constant:\n  make_full_test_constant r4, 0x0123, 0x4567, 0x89AB, 0xCDEF\n  rldicr r3, r4, 24, 8\n  blr\n  #_ REGISTER_OUT r3 0x6780000000000000\n  #_ REGISTER_OUT r4 0x0123456789ABCDEF\n\ntest_rldicr_3:\n  #_ REGISTER_IN r4 0x0123456789ABCDEF\n  rldicr r3, r4, 24, 63\n  blr\n  #_ REGISTER_OUT r3 0x6789abcdef012345\n  #_ REGISTER_OUT r4 0x0123456789ABCDEF\n\ntest_rldicr_3_constant:\n  make_full_test_constant r4, 0x0123, 0x4567, 0x89AB, 0xCDEF\n  rldicr r3, r4, 24, 63\n  blr\n  #_ REGISTER_OUT r3 0x6789abcdef012345\n  #_ REGISTER_OUT r4 0x0123456789ABCDEF\n\ntest_rldicr_4:\n  #_ REGISTER_IN r4 0x0123456789ABCDEF\n  rldicr r3, r4, 0, 0\n  blr\n  #_ REGISTER_OUT r3 0x0000000000000000\n  #_ REGISTER_OUT r4 0x0123456789ABCDEF\n\ntest_rldicr_4_constant:\n  make_full_test_constant r4, 0x0123, 0x4567, 0x89AB, 0xCDEF\n  rldicr r3, r4, 0, 0\n  blr\n  #_ REGISTER_OUT r3 0x0000000000000000\n  #_ REGISTER_OUT r4 0x0123456789ABCDEF\n\ntest_rldicr_5:\n  #_ REGISTER_IN r4 0x0123456789ABCDEF\n  rldicr r3, r4, 0, 63\n  blr\n  #_ REGISTER_OUT r3 0x0123456789abcdef\n  #_ REGISTER_OUT r4 0x0123456789ABCDEF\n\ntest_rldicr_5_constant:\n  make_full_test_constant r4, 0x0123, 0x4567, 0x89AB, 0xCDEF\n  rldicr r3, r4, 0, 63\n  blr\n  #_ REGISTER_OUT r3 0x0123456789abcdef\n  #_ REGISTER_OUT r4 0x0123456789ABCDEF\n\ntest_rldicr_6:\n  #_ REGISTER_IN r4 0x0123456789ABCDEF\n  rldicr r3, r4, 0, 8\n  blr\n  #_ REGISTER_OUT r3 0x0100000000000000\n  #_ REGISTER_OUT r4 0x0123456789ABCDEF\n\ntest_rldicr_6_constant:\n  make_full_test_constant r4, 0x0123, 0x4567, 0x89AB, 0xCDEF\n  rldicr r3, r4, 0, 8\n  blr\n  #_ REGISTER_OUT r3 0x0100000000000000\n  #_ REGISTER_OUT r4 0x0123456789ABCDEF\n\ntest_rldicr_7:\n  #_ REGISTER_IN r4 0x0123456789ABCDEF\n  rldicr r3, r4, 63, 0\n  blr\n  #_ REGISTER_OUT r3 0x8000000000000000\n  #_ REGISTER_OUT r4 0x0123456789ABCDEF\n\ntest_rldicr_7_constant:\n  make_full_test_constant r4, 0x0123, 0x4567, 0x89AB, 0xCDEF\n  rldicr r3, r4, 63, 0\n  blr\n  #_ REGISTER_OUT r3 0x8000000000000000\n  #_ REGISTER_OUT r4 0x0123456789ABCDEF\n\ntest_rldicr_8:\n  #_ REGISTER_IN r4 0x0123456789ABCDEF\n  rldicr r3, r4, 63, 63\n  blr\n  #_ REGISTER_OUT r3 0x8091a2b3c4d5e6f7\n  #_ REGISTER_OUT r4 0x0123456789ABCDEF\n\ntest_rldicr_8_constant:\n  make_full_test_constant r4, 0x0123, 0x4567, 0x89AB, 0xCDEF\n  rldicr r3, r4, 63, 63\n  blr\n  #_ REGISTER_OUT r3 0x8091a2b3c4d5e6f7\n  #_ REGISTER_OUT r4 0x0123456789ABCDEF\n\ntest_rldicr_9:\n  #_ REGISTER_IN r4 0x0123456789ABCDEF\n  rldicr r3, r4, 31, 0\n  blr\n  #_ REGISTER_OUT r3 0x8000000000000000\n  #_ REGISTER_OUT r4 0x0123456789ABCDEF\n\ntest_rldicr_9_constant:\n  make_full_test_constant r4, 0x0123, 0x4567, 0x89AB, 0xCDEF\n  rldicr r3, r4, 31, 0\n  blr\n  #_ REGISTER_OUT r3 0x8000000000000000\n  #_ REGISTER_OUT r4 0x0123456789ABCDEF\n\ntest_sldi_1:\n  #_ REGISTER_IN r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r4 0x0123456789ABCDEF\n  sldi r3, r3, 0\n  sldi r4, r4, 0\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0x0123456789ABCDEF\n\ntest_sldi_1_constant:\n  make_full_test_constant r4, 0x0123, 0x4567, 0x89AB, 0xCDEF\n  li r3, -1\n  sldi r3, r3, 0\n  sldi r4, r4, 0\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0x0123456789ABCDEF\n\ntest_sldi_2:\n  #_ REGISTER_IN r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r4 0x0123456789ABCDEF\n  sldi r3, r3, 1\n  sldi r4, r4, 1\n  blr\n  #_ REGISTER_OUT r3 0xfffffffffffffffe\n  #_ REGISTER_OUT r4 0x02468acf13579bde\n\ntest_sldi_2_constant:\n  make_full_test_constant r4, 0x0123, 0x4567, 0x89AB, 0xCDEF\n  li r3, -1\n  sldi r3, r3, 1\n  sldi r4, r4, 1\n  blr\n  #_ REGISTER_OUT r3 0xfffffffffffffffe\n  #_ REGISTER_OUT r4 0x02468acf13579bde\n\ntest_sldi_3:\n  #_ REGISTER_IN r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r4 0x0123456789ABCDEF\n  sldi r3, r3, 32\n  sldi r4, r4, 32\n  blr\n  #_ REGISTER_OUT r3 0xffffffff00000000\n  #_ REGISTER_OUT r4 0x89abcdef00000000\n\ntest_sldi_3_constant:\n  make_full_test_constant r4, 0x0123, 0x4567, 0x89AB, 0xCDEF\n  li r3, -1\n  sldi r3, r3, 32\n  sldi r4, r4, 32\n  blr\n  #_ REGISTER_OUT r3 0xffffffff00000000\n  #_ REGISTER_OUT r4 0x89abcdef00000000\n\ntest_sldi_4:\n  #_ REGISTER_IN r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r4 0x0123456789ABCDEF\n  sldi r3, r3, 63\n  sldi r4, r4, 63\n  blr\n  #_ REGISTER_OUT r3 0x8000000000000000\n  #_ REGISTER_OUT r4 0x8000000000000000\n\ntest_sldi_4_constant:\n  make_full_test_constant r4, 0x0123, 0x4567, 0x89AB, 0xCDEF\n  li r3, -1\n  sldi r3, r3, 63\n  sldi r4, r4, 63\n  blr\n  #_ REGISTER_OUT r3 0x8000000000000000\n  #_ REGISTER_OUT r4 0x8000000000000000\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_rlwimi.s",
    "content": ".macro make_full_test_constant dest, a, b, c, d\n  lis \\dest, \\a\n  ori \\dest, \\dest, \\b\n  sldi \\dest, \\dest, 32\n  lis r3, \\c\n  ori r3, r3, \\d\n  clrldi r3, r3, 32\n  or \\dest, \\dest, r3\n.endm\n\ntest_rlwimi:\n  #_ REGISTER_IN r4 0xCAFEBABE90003000\n  #_ REGISTER_IN r6 0xDEADBEEF00000003\n  rlwimi r6, r4, 2, 0, 0x1D\n  blr\n  #_ REGISTER_OUT r4 0xCAFEBABE90003000\n  #_ REGISTER_OUT r6 0xDEADBEEF4000C003\n\ntest_rlwimi_constant:\n  make_full_test_constant r4, 0xCAFE, 0xBABE, 0x9000, 0x3000\n  make_full_test_constant r6, 0xDEAD, 0xBEEF, 0x0000, 0x0003\n  rlwimi r6, r4, 2, 0, 0x1D\n  blr\n  #_ REGISTER_OUT r4 0xCAFEBABE90003000\n  #_ REGISTER_OUT r6 0xDEADBEEF4000C003\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_rlwinm.s",
    "content": "test_rlwinm_1:\n  #_ REGISTER_IN r4 0x12345678\n  rlwinm r3, r4, 24, 8, 15\n  blr\n  #_ REGISTER_OUT r3 0x00120000\n  #_ REGISTER_OUT r4 0x12345678\n\ntest_rlwinm_1_constant:\n  lis r4, 0x1234\n  ori r4, r4, 0x5678\n  rlwinm r3, r4, 24, 8, 15\n  blr\n  #_ REGISTER_OUT r3 0x00120000\n  #_ REGISTER_OUT r4 0x12345678\n\ntest_rlwinm_2:\n  #_ REGISTER_IN r4 0x12345678\n  rlwinm r3, r4, 4, 0, 27\n  blr\n  #_ REGISTER_OUT r3 0x23456780\n  #_ REGISTER_OUT r4 0x12345678\n\ntest_rlwinm_2_constant:\n  lis r4, 0x1234\n  ori r4, r4, 0x5678\n  rlwinm r3, r4, 4, 0, 27\n  blr\n  #_ REGISTER_OUT r3 0x23456780\n  #_ REGISTER_OUT r4 0x12345678\n\ntest_rlwinm_3:\n  #_ REGISTER_IN r4 0x90003000\n  rlwinm r3, r4, 2, 0, 0x1D\n  blr\n  #_ REGISTER_OUT r3 0x4000C000\n  #_ REGISTER_OUT r4 0x90003000\n\ntest_rlwinm_3_constant:\n  lis r4, 0x9000\n  ori r4, r4, 0x3000\n  clrldi r4, r4, 32\n  rlwinm r3, r4, 2, 0, 0x1D\n  blr\n  #_ REGISTER_OUT r3 0x4000C000\n  #_ REGISTER_OUT r4 0x90003000\n\ntest_rlwinm_4:\n  #_ REGISTER_IN r4 0xB0043000\n  rlwinm. r3, r4, 2, 0, 0x1D\n  blr\n  #_ REGISTER_OUT r3 0xC010C000\n  #_ REGISTER_OUT r4 0xB0043000\n  # CRF = 0x8\n\ntest_rlwinm_4_constant:\n  lis r4, 0xB004\n  ori r4, r4, 0x3000\n  clrldi r4, r4, 32\n  rlwinm. r3, r4, 2, 0, 0x1D\n  blr\n  #_ REGISTER_OUT r3 0xC010C000\n  #_ REGISTER_OUT r4 0xB0043000\n  # CRF = 0x8\n\ntest_rlwinm_5:\n  #_ REGISTER_IN r4 0x12345678\n  rlwinm r3, r4, 0, 5, 0x1D\n  blr\n  #_ REGISTER_OUT r3 0x02345678\n  #_ REGISTER_OUT r4 0x12345678\n\ntest_rlwinm_5_constant:\n  lis r4, 0x1234\n  ori r4, r4, 0x5678\n  rlwinm r3, r4, 0, 5, 0x1D\n  blr\n  #_ REGISTER_OUT r3 0x02345678\n  #_ REGISTER_OUT r4 0x12345678\n\ntest_rlwinm_6:\n  #_ REGISTER_IN r4 0x12345678\n  rlwinm r3, r4, 0, 0, 31\n  blr\n  #_ REGISTER_OUT r3 0x12345678\n  #_ REGISTER_OUT r4 0x12345678\n\ntest_rlwinm_6_constant:\n  lis r4, 0x1234\n  ori r4, r4, 0x5678\n  rlwinm r3, r4, 0, 0, 31\n  blr\n  #_ REGISTER_OUT r3 0x12345678\n  #_ REGISTER_OUT r4 0x12345678\n\ntest_rlwinm_7:\n  #_ REGISTER_IN r4 0x12345678\n  rlwinm r3, r4, 0, 0, 16\n  blr\n  #_ REGISTER_OUT r3 0x12340000\n  #_ REGISTER_OUT r4 0x12345678\n\ntest_rlwinm_7_constant:\n  lis r4, 0x1234\n  ori r4, r4, 0x5678\n  rlwinm r3, r4, 0, 0, 16\n  blr\n  #_ REGISTER_OUT r3 0x12340000\n  #_ REGISTER_OUT r4 0x12345678\n\ntest_rlwinm_8:\n  #_ REGISTER_IN r4 0x12345678\n  rlwinm r3, r4, 0, 16, 31\n  blr\n  #_ REGISTER_OUT r3 0x00005678\n  #_ REGISTER_OUT r4 0x12345678\n\ntest_rlwinm_8_constant:\n  lis r4, 0x1234\n  ori r4, r4, 0x5678\n  rlwinm r3, r4, 0, 16, 31\n  blr\n  #_ REGISTER_OUT r3 0x00005678\n  #_ REGISTER_OUT r4 0x12345678\n\ntest_rlwinm_9:\n  #_ REGISTER_IN r4 0x12345678\n  rlwinm r3, r4, 16, 16, 31\n  blr\n  #_ REGISTER_OUT r3 0x00001234\n  #_ REGISTER_OUT r4 0x12345678\n\ntest_rlwinm_9_constant:\n  lis r4, 0x1234\n  ori r4, r4, 0x5678\n  rlwinm r3, r4, 16, 16, 31\n  blr\n  #_ REGISTER_OUT r3 0x00001234\n  #_ REGISTER_OUT r4 0x12345678\n\n# Extract and right justify immediate\n# extrwi RA, RS, n, b\n# rlwinm RA, RS, b+n, 32-n, 31\ntest_extrwi_1:\n  # extrwi ra,rs,n,b (n > 0) == rlwinm ra,rs,b+n,32-n,31\n  #_ REGISTER_IN r5 0x30\n  rlwinm r7, r5, 29, 28, 31\n  #extrwi r7, r5, 4, 25\n  blr\n  #_ REGISTER_OUT r5 0x30\n  #_ REGISTER_OUT r7 0x06\n\ntest_extrwi_1_constant:\n  # extrwi ra,rs,n,b (n > 0) == rlwinm ra,rs,b+n,32-n,31\n  li r5, 0x30\n  rlwinm r7, r5, 29, 28, 31\n  #extrwi r7, r5, 4, 25\n  blr\n  #_ REGISTER_OUT r5 0x30\n  #_ REGISTER_OUT r7 0x06\n\ntest_extrwi_2:\n  #_ REGISTER_IN r5 0xFFFFFFFF01234567\n  rlwinm r7, r5, 26, 16, 31\n  #extrwi r7, r5, 16, 10\n  blr\n  #_ REGISTER_OUT r5 0xFFFFFFFF01234567\n  #_ REGISTER_OUT r7 0x0000000000008D15\n\ntest_extrwi_2_constant:\n  li r5, -1\n  sldi r5, r5, 32\n  oris r5, r5, 0x0123\n  ori r5, r5, 0x4567\n  rlwinm r7, r5, 26, 16, 31\n  #extrwi r7, r5, 16, 10\n  blr\n  #_ REGISTER_OUT r5 0xFFFFFFFF01234567\n  #_ REGISTER_OUT r7 0x0000000000008D15\n\ntest_extrwi_cr_1:\n  #_ REGISTER_IN r5 0x30\n  rlwinm. r7, r5, 29, 28, 31\n  #extrwi. r7, r5, 4, 25\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r5 0x30\n  #_ REGISTER_OUT r7 0x06\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_extrwi_cr_1_constant:\n  li r5, 0x30\n  rlwinm. r7, r5, 29, 28, 31\n  #extrwi. r7, r5, 4, 25\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r5 0x30\n  #_ REGISTER_OUT r7 0x06\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_extrwi_cr_2:\n  #_ REGISTER_IN r5 0xFFFFFFFF01234567\n  rlwinm. r7, r5, 26, 16, 31\n  #extrwi. r7, r5, 16, 10\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r5 0xFFFFFFFF01234567\n  #_ REGISTER_OUT r7 0x0000000000008D15\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_extrwi_cr_2_constant:\n  li r5, -1\n  sldi r5, r5, 32\n  oris r5, r5, 0x0123\n  ori r5, r5, 0x4567\n  rlwinm. r7, r5, 26, 16, 31\n  #extrwi. r7, r5, 16, 10\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r5 0xFFFFFFFF01234567\n  #_ REGISTER_OUT r7 0x0000000000008D15\n  #_ REGISTER_OUT r12 0x40000000\n\ntest_extrwi_cr_3:\n  #_ REGISTER_IN r5 0xFFFFFFFF00000000\n  rlwinm. r7, r5, 26, 16, 31\n  #extrwi. r7, r5, 16, 10\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r5 0xFFFFFFFF00000000\n  #_ REGISTER_OUT r7 0x0000000000000000\n  #_ REGISTER_OUT r12 0x20000000\n\ntest_extrwi_cr_3_constant:\n  li r5, -1\n  sldi r5, r5, 32\n  rlwinm. r7, r5, 26, 16, 31\n  #extrwi. r7, r5, 16, 10\n  mfcr r12\n  blr\n  #_ REGISTER_OUT r5 0xFFFFFFFF00000000\n  #_ REGISTER_OUT r7 0x0000000000000000\n  #_ REGISTER_OUT r12 0x20000000\n\ntest_rlwinm_10:\n  #_ REGISTER_IN r7 0x01234567\n  rlwinm r6, r7, 31, 31, 1\n  blr\n  #_ REGISTER_OUT r6 0x8091A2B380000001\n  #_ REGISTER_OUT r7 0x01234567\n\ntest_rlwinm_11:\n  #_ REGISTER_IN r8 0x0123456789ABCDEF\n  rlwinm r6, r8, 8, 2, 0\n  blr\n  #_ REGISTER_OUT r6 0xABCDEF89ABCDEF89\n  #_ REGISTER_OUT r8 0x0123456789ABCDEF\n\ntest_rlwinm_12:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  rlwinm r7, r4, 31, 30, 1\n  blr\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r7 0xFFFFFFFFC0000003\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_rlwnm.s",
    "content": "test_rlwnm_1:\n  #_ REGISTER_IN r4 0x12345678\n  #_ REGISTER_IN r5 24\n  rlwnm r3, r4, r5, 8, 15\n  blr\n  #_ REGISTER_OUT r3 0x00120000\n  #_ REGISTER_OUT r4 0x12345678\n  #_ REGISTER_OUT r5 24\n\ntest_rlwnm_1_constant:\n  lis r4, 0x1234\n  ori r4, r4, 0x5678\n  li r5, 24\n  rlwnm r3, r4, r5, 8, 15\n  blr\n  #_ REGISTER_OUT r3 0x00120000\n  #_ REGISTER_OUT r4 0x12345678\n  #_ REGISTER_OUT r5 24\n\ntest_rlwnm_2:\n  #_ REGISTER_IN r4 0x12345678\n  #_ REGISTER_IN r5 4\n  rlwnm r3, r4, r5, 0, 27\n  blr\n  #_ REGISTER_OUT r3 0x23456780\n  #_ REGISTER_OUT r4 0x12345678\n  #_ REGISTER_OUT r5 4\n\ntest_rlwnm_2_constant:\n  lis r4, 0x1234\n  ori r4, r4, 0x5678\n  li r5, 4\n  rlwnm r3, r4, r5, 0, 27\n  blr\n  #_ REGISTER_OUT r3 0x23456780\n  #_ REGISTER_OUT r4 0x12345678\n  #_ REGISTER_OUT r5 4\n\ntest_rlwnm_3:\n  #_ REGISTER_IN r4 0x90003000\n  #_ REGISTER_IN r5 2\n  rlwnm r3, r4, r5, 0, 0x1D\n  blr\n  #_ REGISTER_OUT r3 0x4000C000\n  #_ REGISTER_OUT r4 0x90003000\n  #_ REGISTER_OUT r5 2\n\ntest_rlwnm_3_constant:\n  lis r4, 0x9000\n  ori r4, r4, 0x3000\n  clrldi r4, r4, 32\n  li r5, 2\n  rlwnm r3, r4, r5, 0, 0x1D\n  blr\n  #_ REGISTER_OUT r3 0x4000C000\n  #_ REGISTER_OUT r4 0x90003000\n  #_ REGISTER_OUT r5 2\n\ntest_rlwnm_4:\n  #_ REGISTER_IN r4 0xB0043000\n  #_ REGISTER_IN r5 2\n  rlwnm. r3, r4, r5, 0, 0x1D\n  blr\n  #_ REGISTER_OUT r3 0xC010C000\n  #_ REGISTER_OUT r4 0xB0043000\n  #_ REGISTER_OUT r5 2\n  # CRF = 0x8\n\ntest_rlwnm_4_constant:\n  lis r4, 0xB004\n  ori r4, r4, 0x3000\n  clrldi r4, r4, 32\n  li r5, 2\n  rlwnm. r3, r4, r5, 0, 0x1D\n  blr\n  #_ REGISTER_OUT r3 0xC010C000\n  #_ REGISTER_OUT r4 0xB0043000\n  #_ REGISTER_OUT r5 2\n  # CRF = 0x8\n\ntest_rlwnm_5:\n  #_ REGISTER_IN r4 0x12345678\n  #_ REGISTER_IN r5 0\n  rlwnm r3, r4, r5, 5, 0x1D\n  blr\n  #_ REGISTER_OUT r3 0x02345678\n  #_ REGISTER_OUT r4 0x12345678\n  #_ REGISTER_OUT r5 0\n\ntest_rlwnm_5_constant:\n  lis r4, 0x1234\n  ori r4, r4, 0x5678\n  li r5, 0\n  rlwnm r3, r4, r5, 5, 0x1D\n  blr\n  #_ REGISTER_OUT r3 0x02345678\n  #_ REGISTER_OUT r4 0x12345678\n  #_ REGISTER_OUT r5 0\n\ntest_rlwnm_6:\n  #_ REGISTER_IN r4 0x12345678\n  #_ REGISTER_IN r5 0\n  rlwnm r3, r4, r5, 0, 31\n  blr\n  #_ REGISTER_OUT r3 0x12345678\n  #_ REGISTER_OUT r4 0x12345678\n  #_ REGISTER_OUT r5 0\n\ntest_rlwnm_6_constant:\n  lis r4, 0x1234\n  ori r4, r4, 0x5678\n  li r5, 0\n  rlwnm r3, r4, r5, 0, 31\n  blr\n  #_ REGISTER_OUT r3 0x12345678\n  #_ REGISTER_OUT r4 0x12345678\n  #_ REGISTER_OUT r5 0\n\ntest_rlwnm_7:\n  #_ REGISTER_IN r4 0x12345678\n  #_ REGISTER_IN r5 0\n  rlwnm r3, r4, r5, 0, 16\n  blr\n  #_ REGISTER_OUT r3 0x12340000\n  #_ REGISTER_OUT r4 0x12345678\n  #_ REGISTER_OUT r5 0\n\ntest_rlwnm_7_constant:\n  lis r4, 0x1234\n  ori r4, r4, 0x5678\n  li r5, 0\n  rlwnm r3, r4, r5, 0, 16\n  blr\n  #_ REGISTER_OUT r3 0x12340000\n  #_ REGISTER_OUT r4 0x12345678\n  #_ REGISTER_OUT r5 0\n\ntest_rlwnm_8:\n  #_ REGISTER_IN r4 0x12345678\n  #_ REGISTER_IN r5 0\n  rlwnm r3, r4, r5, 16, 31\n  blr\n  #_ REGISTER_OUT r3 0x00005678\n  #_ REGISTER_OUT r4 0x12345678\n  #_ REGISTER_OUT r5 0\n\ntest_rlwnm_8_constant:\n  lis r4, 0x1234\n  ori r4, r4, 0x5678\n  li r5, 0\n  rlwnm r3, r4, r5, 16, 31\n  blr\n  #_ REGISTER_OUT r3 0x00005678\n  #_ REGISTER_OUT r4 0x12345678\n  #_ REGISTER_OUT r5 0\n\ntest_rlwnm_9:\n  #_ REGISTER_IN r4 0x12345678\n  #_ REGISTER_IN r5 16\n  rlwnm r3, r4, r5, 16, 31\n  blr\n  #_ REGISTER_OUT r3 0x00001234\n  #_ REGISTER_OUT r4 0x12345678\n  #_ REGISTER_OUT r5 16\n\ntest_rlwnm_9_constant:\n  lis r4, 0x1234\n  ori r4, r4, 0x5678\n  li r5, 16\n  rlwnm r3, r4, r5, 16, 31\n  blr\n  #_ REGISTER_OUT r3 0x00001234\n  #_ REGISTER_OUT r4 0x12345678\n  #_ REGISTER_OUT r5 16\n\ntest_rlwnm_10:\n  #_ REGISTER_IN r4 0x12345678\n  #_ REGISTER_IN r5 32\n  rlwnm r3, r4, r5, 0, 31\n  blr\n  #_ REGISTER_OUT r3 0x12345678\n  #_ REGISTER_OUT r4 0x12345678\n  #_ REGISTER_OUT r5 32\n\ntest_rlwnm_10_constant:\n  lis r4, 0x1234\n  ori r4, r4, 0x5678\n  li r5, 32\n  rlwnm r3, r4, r5, 0, 31\n  blr\n  #_ REGISTER_OUT r3 0x12345678\n  #_ REGISTER_OUT r4 0x12345678\n  #_ REGISTER_OUT r5 32\n\ntest_rlwnm_11:\n  #_ REGISTER_IN r0 0x1\n  rlwnm r0, r0, r0, 1, 0\n  blr\n  #_ REGISTER_OUT r0 0x0000000200000002\n\ntest_rlwnm_12:\n  #_ REGISTER_IN r3 0xFFFFFFFF\n  rlwnm r0, r3, r3, 30, 1\n  blr\n  #_ REGISTER_OUT r0 0xFFFFFFFFC0000003\n  #_ REGISTER_OUT r3 0xFFFFFFFF\n\ntest_rlwnm_13:\n  #_ REGISTER_IN r7 0x01234567\n  #_ REGISTER_IN r8 0x0123456789ABCDEFull\n  rlwnm r6, r8, r7, 31, 30\n  blr\n  #_ REGISTER_OUT r6 0xD5E6F7C4D5E6F7C4\n  #_ REGISTER_OUT r7 0x01234567\n  #_ REGISTER_OUT r8 0x0123456789ABCDEFull\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_sld.s",
    "content": "test_sld_1:\n  #_ REGISTER_IN r4 1\n  #_ REGISTER_IN r5 0\n  sld r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 0\n\ntest_sld_1_constant:\n  li r4, 1\n  li r5, 0\n  sld r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 0\n\ntest_sld_2:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 0\n  sld r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0\n\ntest_sld_2_constant:\n  li r4, -1\n  li r5, 0\n  sld r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0\n\ntest_sld_3:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 1\n  sld r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFE\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 1\n\ntest_sld_3_constant:\n  li r4, -1\n  li r5, 1\n  sld r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFE\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 1\n\ntest_sld_4:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 62\n  sld r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0xc000000000000000\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 62\n\ntest_sld_4_constant:\n  li r4, -1\n  li r5, 62\n  sld r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0xc000000000000000\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 62\n\ntest_sld_5:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 63\n  sld r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0x8000000000000000\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 63\n\ntest_sld_5_constant:\n  li r4, -1\n  li r5, 63\n  sld r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0x8000000000000000\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 63\n\ntest_sld_6:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 64\n  sld r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 64\n\ntest_sld_6_constant:\n  li r4, -1\n  li r5, 64\n  sld r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 64\n\ntest_sld_7:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 100\n  sld r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 100\n\ntest_sld_7_constant:\n  li r4, -1\n  li r5, 100\n  sld r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 100\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_slw.s",
    "content": "test_slw_1:\n  #_ REGISTER_IN r4 1\n  #_ REGISTER_IN r5 0\n  slw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 0\n\ntest_slw_1_constant:\n  li r4, 1\n  li r5, 0\n  slw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 0\n\ntest_slw_2:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 0\n  slw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0x00000000FFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0\n\ntest_slw_2_constant:\n  li r4, -1\n  li r5, 0\n  slw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0x00000000FFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0\n\ntest_slw_3:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 1\n  slw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0x00000000FFFFFFFE\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 1\n\ntest_slw_3_constant:\n  li r4, -1\n  li r5, 1\n  slw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0x00000000FFFFFFFE\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 1\n\ntest_slw_4:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 63\n  slw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 63\n\ntest_slw_4_constant:\n  li r4, -1\n  li r5, 63\n  slw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 63\n\ntest_slw_5:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 64\n  slw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0x00000000FFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 64\n\ntest_slw_5_constant:\n  li r4, -1\n  li r5, 64\n  slw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0x00000000FFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 64\n\ntest_slw_6:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 100\n  slw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 100\n\ntest_slw_6_constant:\n  li r4, -1\n  li r5, 100\n  slw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 100\n\ntest_slw_7:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 30\n  slw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0x00000000c0000000\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 30\n\ntest_slw_7_constant:\n  li r4, -1\n  li r5, 30\n  slw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0x00000000c0000000\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 30\n\ntest_slw_8:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 31\n  slw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0x0000000080000000\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 31\n\ntest_slw_8_constant:\n  li r4, -1\n  li r5, 31\n  slw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0x0000000080000000\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 31\n\ntest_slw_9:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 32\n  slw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 32\n\ntest_slw_9_constant:\n  li r4, -1\n  li r5, 32\n  slw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 32\n\ntest_slw_10:\n  #_ REGISTER_IN r4 99\n  #_ REGISTER_IN r5 1\n  cntlzw r5, r5\n  subi r5, r5, 28\n  slw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 792\n  #_ REGISTER_OUT r4 99\n  #_ REGISTER_OUT r5 3\n\ntest_slw_10_constant:\n  #_ REGISTER_IN r4 99\n  li r5, 1\n  cntlzw r5, r5\n  subi r5, r5, 28\n  slw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 792\n  #_ REGISTER_OUT r4 99\n  #_ REGISTER_OUT r5 3\n\ntest_slw_11:\n  #_ REGISTER_IN r4 99\n  #_ REGISTER_IN r5 3\n  li r5, 3\n  slw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 792\n  #_ REGISTER_OUT r4 99\n  #_ REGISTER_OUT r5 3\n\ntest_slw_11_constant:\n  #_ REGISTER_IN r4 99\n  li r5, 3\n  slw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 792\n  #_ REGISTER_OUT r4 99\n  #_ REGISTER_OUT r5 3\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_srad.s",
    "content": "test_srad_1:\n  #_ REGISTER_IN r4 1\n  #_ REGISTER_IN r5 0\n  srad r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 0\n  #_ REGISTER_OUT r6 0\n\ntest_srad_1_constant:\n  li r4, 1\n  li r5, 0\n  srad r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 0\n  #_ REGISTER_OUT r6 0\n\ntest_srad_2:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 0\n  srad r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0\n  #_ REGISTER_OUT r6 0\n\ntest_srad_2_constant:\n  li r4, -1\n  li r5, 0\n  srad r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0\n  #_ REGISTER_OUT r6 0\n\ntest_srad_3:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 1\n  srad r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xffffffffffffffff\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 1\n  #_ REGISTER_OUT r6 1\n\ntest_srad_3_constant:\n  li r4, -1\n  li r5, 1\n  srad r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xffffffffffffffff\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 1\n  #_ REGISTER_OUT r6 1\n\ntest_srad_4:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 62\n  srad r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xffffffffffffffff\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 62\n  #_ REGISTER_OUT r6 1\n\ntest_srad_4_constant:\n  li r4, -1\n  li r5, 62\n  srad r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xffffffffffffffff\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 62\n  #_ REGISTER_OUT r6 1\n\ntest_srad_5:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 63\n  srad r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xffffffffffffffff\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 63\n  #_ REGISTER_OUT r6 1\n\ntest_srad_5_constant:\n  li r4, -1\n  li r5, 63\n  srad r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xffffffffffffffff\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 63\n  #_ REGISTER_OUT r6 1\n\ntest_srad_6:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 64\n  srad r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xffffffffffffffff\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 64\n  #_ REGISTER_OUT r6 1\n\ntest_srad_6_constant:\n  li r4, -1\n  li r5, 64\n  srad r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xffffffffffffffff\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 64\n  #_ REGISTER_OUT r6 1\n\ntest_srad_7:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 100\n  srad r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xffffffffffffffff\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 100\n  #_ REGISTER_OUT r6 1\n\ntest_srad_7_constant:\n  li r4, -1\n  li r5, 100\n  srad r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xffffffffffffffff\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 100\n  #_ REGISTER_OUT r6 1\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_sradi.s",
    "content": "test_sradi_1:\n  #_ REGISTER_IN r4 1\n  sradi r3, r4, 0\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r6 0\n\ntest_sradi_1_constant:\n  li r4, 1\n  sradi r3, r4, 0\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r6 0\n\ntest_sradi_2:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  sradi r3, r4, 0\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r6 0\n\ntest_sradi_2_constant:\n  li r4, -1\n  sradi r3, r4, 0\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r6 0\n\ntest_sradi_3:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  sradi r3, r4, 1\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xffffffffffffffff\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r6 1\n\ntest_sradi_3_constant:\n  li r4, -1\n  sradi r3, r4, 1\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xffffffffffffffff\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r6 1\n\ntest_sradi_4:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  sradi r3, r4, 62\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xffffffffffffffff\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r6 1\n\ntest_sradi_4_constant:\n  li r4, -1\n  sradi r3, r4, 62\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xffffffffffffffff\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r6 1\n\ntest_sradi_5:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  sradi r3, r4, 63\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xffffffffffffffff\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r6 1\n\ntest_sradi_5_constant:\n  li r4, -1\n  sradi r3, r4, 63\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xffffffffffffffff\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r6 1\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_sraw.s",
    "content": "test_sraw_1:\n  #_ REGISTER_IN r4 1\n  #_ REGISTER_IN r5 0\n  sraw r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 0\n  #_ REGISTER_OUT r6 0\n\ntest_sraw_1_constant:\n  li r4, 1\n  li r5, 0\n  sraw r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 0\n  #_ REGISTER_OUT r6 0\n\ntest_sraw_2:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 0\n  sraw r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xffffffffffffffff\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0\n  #_ REGISTER_OUT r6 0\n\ntest_sraw_2_constant:\n  li r4, -1\n  li r5, 0\n  sraw r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xffffffffffffffff\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0\n  #_ REGISTER_OUT r6 0\n\ntest_sraw_3:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 1\n  sraw r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xffffffffffffffff\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 1\n  #_ REGISTER_OUT r6 1\n\ntest_sraw_3_constant:\n  li r4, -1\n  li r5, 1\n  sraw r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xffffffffffffffff\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 1\n  #_ REGISTER_OUT r6 1\n\ntest_sraw_4:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 63\n  sraw r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xffffffffffffffff\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 63\n  #_ REGISTER_OUT r6 1\n\ntest_sraw_4_constant:\n  li r4, -1\n  li r5, 63\n  sraw r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xffffffffffffffff\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 63\n  #_ REGISTER_OUT r6 1\n\ntest_sraw_5:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 64\n  sraw r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xffffffffffffffff\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 64\n  #_ REGISTER_OUT r6 0\n\ntest_sraw_5_constant:\n  li r4, -1\n  li r5, 64\n  sraw r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xffffffffffffffff\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 64\n  #_ REGISTER_OUT r6 0\n\ntest_sraw_6:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 100\n  sraw r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xffffffffffffffff\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 100\n  #_ REGISTER_OUT r6 1\n\ntest_sraw_6_constant:\n  li r4, -1\n  li r5, 100\n  sraw r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xffffffffffffffff\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 100\n  #_ REGISTER_OUT r6 1\n\ntest_sraw_7:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 30\n  sraw r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xffffffffffffffff\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 30\n  #_ REGISTER_OUT r6 1\n\ntest_sraw_7_constant:\n  li r4, -1\n  li r5, 30\n  sraw r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xffffffffffffffff\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 30\n  #_ REGISTER_OUT r6 1\n\ntest_sraw_8:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 31\n  sraw r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xffffffffffffffff\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 31\n  #_ REGISTER_OUT r6 1\n\ntest_sraw_8_constant:\n  li r4, -1\n  li r5, 31\n  sraw r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xffffffffffffffff\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 31\n  #_ REGISTER_OUT r6 1\n\ntest_sraw_9:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 32\n  sraw r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xffffffffffffffff\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 32\n  #_ REGISTER_OUT r6 1\n\ntest_sraw_9_constant:\n  li r4, -1\n  li r5, 32\n  sraw r3, r4, r5\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xffffffffffffffff\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 32\n  #_ REGISTER_OUT r6 1\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_srawi.s",
    "content": "test_srawi_1:\n  #_ REGISTER_IN r4 1\n  srawi r3, r4, 0\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r6 0\n\ntest_srawi_1_constant:\n  li r4, 1\n  srawi r3, r4, 0\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r6 0\n\ntest_srawi_2:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  srawi r3, r4, 0\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xffffffffffffffff\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r6 0\n\ntest_srawi_2_constant:\n  li r4, -1\n  srawi r3, r4, 0\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xffffffffffffffff\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r6 0\n\ntest_srawi_3:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  srawi r3, r4, 1\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xffffffffffffffff\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r6 1\n\ntest_srawi_3_constant:\n  li r4, -1\n  srawi r3, r4, 1\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xffffffffffffffff\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r6 1\n\ntest_srawi_4:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  srawi r3, r4, 30\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xffffffffffffffff\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r6 1\n\ntest_srawi_4_constant:\n  li r4, -1\n  srawi r3, r4, 30\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xffffffffffffffff\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r6 1\n\ntest_srawi_5:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  srawi r3, r4, 31\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xffffffffffffffff\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r6 1\n\ntest_srawi_5_constant:\n  li r4, -1\n  srawi r3, r4, 31\n  adde r6, r0, r0\n  blr\n  #_ REGISTER_OUT r3 0xffffffffffffffff\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r6 1\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_srd.s",
    "content": "test_srd_1:\n  #_ REGISTER_IN r4 1\n  #_ REGISTER_IN r5 0\n  srd r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 0\n\ntest_srd_1_constant:\n  li r4, 1\n  li r5, 0\n  srd r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 0\n\ntest_srd_2:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 0\n  srd r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0\n\ntest_srd_2_constant:\n  li r4, -1\n  li r5, 0\n  srd r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0\n\ntest_srd_3:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 1\n  srd r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0x7FFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 1\n\ntest_srd_3_constant:\n  li r4, -1\n  li r5, 1\n  srd r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0x7FFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 1\n\ntest_srd_4:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 62\n  srd r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0x0000000000000003\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 62\n\ntest_srd_4_constant:\n  li r4, -1\n  li r5, 62\n  srd r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0x0000000000000003\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 62\n\ntest_srd_5:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 63\n  srd r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0x0000000000000001\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 63\n\ntest_srd_5_constant:\n  li r4, -1\n  li r5, 63\n  srd r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0x0000000000000001\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 63\n\ntest_srd_6:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 64\n  srd r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 64\n\ntest_srd_6_constant:\n  li r4, -1\n  li r5, 64\n  srd r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 64\n\ntest_srd_7:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 100\n  srd r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 100\n\ntest_srd_7_constant:\n  li r4, -1\n  li r5, 100\n  srd r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 100\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_srw.s",
    "content": "test_srw_1:\n  #_ REGISTER_IN r4 1\n  #_ REGISTER_IN r5 0\n  srw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 0\n\ntest_srw_1_constant:\n  li r4, 1\n  li r5, 0\n  srw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 1\n  #_ REGISTER_OUT r5 0\n\ntest_srw_2:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 0\n  srw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0x00000000FFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0\n\ntest_srw_2_constant:\n  li r4, -1\n  li r5, 0\n  srw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0x00000000FFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 0\n\ntest_srw_3:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 1\n  srw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0x000000007FFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 1\n\ntest_srw_3_constant:\n  li r4, -1\n  li r5, 1\n  srw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0x000000007FFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 1\n\ntest_srw_4:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 63\n  srw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 63\n\ntest_srw_4_constant:\n  li r4, -1\n  li r5, 63\n  srw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 63\n\ntest_srw_5:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 64\n  srw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0x00000000FFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 64\n\ntest_srw_5_constant:\n  li r4, -1\n  li r5, 64\n  srw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0x00000000FFFFFFFF\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 64\n\ntest_srw_6:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 100\n  srw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 100\n\ntest_srw_6_constant:\n  li r4, -1\n  li r5, 100\n  srw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 100\n\ntest_srw_7:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 30\n  srw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0x0000000000000003\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 30\n\ntest_srw_7_constant:\n  li r4, -1\n  li r5, 30\n  srw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0x0000000000000003\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 30\n\ntest_srw_8:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 31\n  srw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0x0000000000000001\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 31\n\ntest_srw_8_constant:\n  li r4, -1\n  li r5, 31\n  srw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0x0000000000000001\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 31\n\ntest_srw_9:\n  #_ REGISTER_IN r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r5 32\n  srw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 32\n\ntest_srw_9_constant:\n  li r4, -1\n  li r5, 32\n  srw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r5 32\n\ntest_srw_10:\n  #_ REGISTER_IN r4 0x0000000090003000\n  #_ REGISTER_IN r5 36\n  srw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0x0000000090003000\n  #_ REGISTER_OUT r5 36\n\ntest_srw_10_constant:\n  lis r4, 0x9000\n  ori r4, r4, 0x3000\n  li r5, 36\n  srw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0xFFFFFFFF90003000\n  #_ REGISTER_OUT r5 36\n\ntest_srw_11:\n  #_ REGISTER_IN r4 0x00000000B0043001\n  #_ REGISTER_IN r5 4\n  srw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0x000000000B004300\n  #_ REGISTER_OUT r4 0x00000000B0043001\n  #_ REGISTER_OUT r5 4\n\ntest_srw_11_constant:\n  lis r4, 0xB004\n  ori r4, r4, 0x3001\n  li r5, 4\n  srw r3, r4, r5\n  blr\n  #_ REGISTER_OUT r3 0x000000000B004300\n  #_ REGISTER_OUT r4 0xFFFFFFFFB0043001\n  #_ REGISTER_OUT r5 4\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_stvew.s",
    "content": "test_stvew_1:\n  #_ MEMORY_IN 10001050 CCCCCCCC CCCCCCCC CCCCCCCC CCCCCCCC\n  #_ REGISTER_IN r4 0x10001050\n  #_ REGISTER_IN v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  stvewx v3, r0, r4\n  blr\n  #_ REGISTER_OUT r4 0x10001050\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ MEMORY_OUT 10001050 00010203 CCCCCCCC CCCCCCCC CCCCCCCC\n\ntest_stvew_1_constant:\n  #_ MEMORY_IN 10001050 CCCCCCCC CCCCCCCC CCCCCCCC CCCCCCCC\n  lis r4, 0x1000\n  ori r4, r4, 0x1050\n  #_ REGISTER_IN v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  stvewx v3, r0, r4\n  blr\n  #_ REGISTER_OUT r4 0x10001050\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ MEMORY_OUT 10001050 00010203 CCCCCCCC CCCCCCCC CCCCCCCC\n\ntest_stvew_2:\n  #_ MEMORY_IN 10001050 CCCCCCCC CCCCCCCC CCCCCCCC CCCCCCCC\n  #_ REGISTER_IN r4 0x10001054\n  #_ REGISTER_IN v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  stvewx v3, r0, r4\n  blr\n  #_ REGISTER_OUT r4 0x10001054\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ MEMORY_OUT 10001050 CCCCCCCC 04050607 CCCCCCCC CCCCCCCC\n\ntest_stvew_2_constant:\n  #_ MEMORY_IN 10001050 CCCCCCCC CCCCCCCC CCCCCCCC CCCCCCCC\n  lis r4, 0x1000\n  ori r4, r4, 0x1054\n  #_ REGISTER_IN v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  stvewx v3, r0, r4\n  blr\n  #_ REGISTER_OUT r4 0x10001054\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ MEMORY_OUT 10001050 CCCCCCCC 04050607 CCCCCCCC CCCCCCCC\n\ntest_stvew_3:\n  #_ MEMORY_IN 10001050 CCCCCCCC CCCCCCCC CCCCCCCC CCCCCCCC\n  #_ REGISTER_IN r4 0x10001058\n  #_ REGISTER_IN v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  stvewx v3, r0, r4\n  blr\n  #_ REGISTER_OUT r4 0x10001058\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ MEMORY_OUT 10001050 CCCCCCCC CCCCCCCC 08090A0B CCCCCCCC\n\ntest_stvew_3_constant:\n  #_ MEMORY_IN 10001050 CCCCCCCC CCCCCCCC CCCCCCCC CCCCCCCC\n  lis r4, 0x1000\n  ori r4, r4, 0x1058\n  #_ REGISTER_IN v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  stvewx v3, r0, r4\n  blr\n  #_ REGISTER_OUT r4 0x10001058\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ MEMORY_OUT 10001050 CCCCCCCC CCCCCCCC 08090A0B CCCCCCCC\n\ntest_stvew_4:\n  #_ MEMORY_IN 10001050 CCCCCCCC CCCCCCCC CCCCCCCC CCCCCCCC\n  #_ REGISTER_IN r4 0x1000105C\n  #_ REGISTER_IN v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  stvewx v3, r0, r4\n  blr\n  #_ REGISTER_OUT r4 0x1000105C\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ MEMORY_OUT 10001050 CCCCCCCC CCCCCCCC CCCCCCCC 0C0D0E0F\n\ntest_stvew_4_constant:\n  #_ MEMORY_IN 10001050 CCCCCCCC CCCCCCCC CCCCCCCC CCCCCCCC\n  lis r4, 0x1000\n  ori r4, r4, 0x105C\n  #_ REGISTER_IN v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  stvewx v3, r0, r4\n  blr\n  #_ REGISTER_OUT r4 0x1000105C\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ MEMORY_OUT 10001050 CCCCCCCC CCCCCCCC CCCCCCCC 0C0D0E0F\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_stvl.s",
    "content": "test_stvlx_1:\n  #_ MEMORY_IN 10001040 00000000 00000000 00000000 3F800000\n  #_ REGISTER_IN r4 0x10001040\n  #_ REGISTER_IN v3 [BE74FCBD, BD912ABA, BF317BBB, BF2D135F]\n  stvlx v3, r4, r0\n  blr\n  #_ REGISTER_OUT r4 0x10001040\n  #_ REGISTER_OUT v3 [BE74FCBD, BD912ABA, BF317BBB, BF2D135F]\n  #_ MEMORY_OUT 10001040 BE74FCBD BD912ABA BF317BBB BF2D135F\n\ntest_stvlx_1_constant:\n  #_ MEMORY_IN 10001040 00000000 00000000 00000000 3F800000\n  lis r4, 0x1000\n  ori r4, r4, 0x1040\n  #_ REGISTER_IN v3 [BE74FCBD, BD912ABA, BF317BBB, BF2D135F]\n  stvlx v3, r4, r0\n  blr\n  #_ REGISTER_OUT r4 0x10001040\n  #_ REGISTER_OUT v3 [BE74FCBD, BD912ABA, BF317BBB, BF2D135F]\n  #_ MEMORY_OUT 10001040 BE74FCBD BD912ABA BF317BBB BF2D135F\n\ntest_stvlx_2:\n  #_ MEMORY_IN 10001040 00010203 04050607 08090A0B 0C0D0E0F\n  #_ REGISTER_IN r4 0x10001044\n  #_ REGISTER_IN v3 [F0F1F2F3, F4F5F6F7, F8F9FAFB, FCFDFEFF]\n  stvlx v3, r4, r0\n  blr\n  #_ REGISTER_OUT r4 0x10001044\n  #_ REGISTER_OUT v3 [F0F1F2F3, F4F5F6F7, F8F9FAFB, FCFDFEFF]\n  #_ MEMORY_OUT 10001040 00010203 F0F1F2F3 F4F5F6F7 F8F9FAFB\n\ntest_stvlx_2_constant:\n  #_ MEMORY_IN 10001040 00010203 04050607 08090A0B 0C0D0E0F\n  lis r4, 0x1000\n  ori r4, r4, 0x1044\n  #_ REGISTER_IN v3 [F0F1F2F3, F4F5F6F7, F8F9FAFB, FCFDFEFF]\n  stvlx v3, r4, r0\n  blr\n  #_ REGISTER_OUT r4 0x10001044\n  #_ REGISTER_OUT v3 [F0F1F2F3, F4F5F6F7, F8F9FAFB, FCFDFEFF]\n  #_ MEMORY_OUT 10001040 00010203 F0F1F2F3 F4F5F6F7 F8F9FAFB\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_stvr.s",
    "content": "test_stvr_1:\n  #_ MEMORY_IN 10001040 BE74FCBD BD912ABA BF317BBB BF2D135F\n  #_ MEMORY_IN 10001050 00000000 00000000 00000000 00000000\n  #_ REGISTER_IN r4 0x10001040\n  #_ REGISTER_IN r5 0x10\n  #_ REGISTER_IN v3 [BE74FCBD, BD912ABA, BF317BBB, BF2D135F]\n  stvrx v3, r4, r5\n  blr\n  #_ REGISTER_OUT r4 0x10001040\n  #_ REGISTER_OUT r5 0x10\n  #_ REGISTER_OUT v3 [BE74FCBD, BD912ABA, BF317BBB, BF2D135F]\n  #_ MEMORY_OUT 10001040 BE74FCBD BD912ABA BF317BBB BF2D135F\n  #_ MEMORY_OUT 10001050 00000000 00000000 00000000 00000000\n\ntest_stvr_1_constant:\n  #_ MEMORY_IN 10001040 BE74FCBD BD912ABA BF317BBB BF2D135F\n  #_ MEMORY_IN 10001050 00000000 00000000 00000000 00000000\n  lis r4, 0x1000\n  ori r4, r4, 0x1040\n  li r5, 0x10\n  #_ REGISTER_IN v3 [BE74FCBD, BD912ABA, BF317BBB, BF2D135F]\n  stvrx v3, r4, r5\n  blr\n  #_ REGISTER_OUT r4 0x10001040\n  #_ REGISTER_OUT r5 0x10\n  #_ REGISTER_OUT v3 [BE74FCBD, BD912ABA, BF317BBB, BF2D135F]\n  #_ MEMORY_OUT 10001040 BE74FCBD BD912ABA BF317BBB BF2D135F\n  #_ MEMORY_OUT 10001050 00000000 00000000 00000000 00000000\n\ntest_stvr_2:\n  #_ MEMORY_IN 10001040 00010203 04050607 08090A0B 0C0D0E0F\n  #_ REGISTER_IN r4 0x10001044\n  #_ REGISTER_IN v3 [F0F1F2F3, F4F5F6F7, F8F9FAFB, FCFDFEFF]\n  stvrx v3, r4, r0\n  blr\n  #_ REGISTER_OUT r4 0x10001044\n  #_ REGISTER_OUT v3 [F0F1F2F3, F4F5F6F7, F8F9FAFB, FCFDFEFF]\n  #_ MEMORY_OUT 10001040 FCFDFEFF 04050607 08090A0B 0C0D0E0F\n\ntest_stvr_2_constant:\n  #_ MEMORY_IN 10001040 00010203 04050607 08090A0B 0C0D0E0F\n  lis r4, 0x1000\n  ori r4, r4, 0x1044\n  #_ REGISTER_IN v3 [F0F1F2F3, F4F5F6F7, F8F9FAFB, FCFDFEFF]\n  stvrx v3, r4, r0\n  blr\n  #_ REGISTER_OUT r4 0x10001044\n  #_ REGISTER_OUT v3 [F0F1F2F3, F4F5F6F7, F8F9FAFB, FCFDFEFF]\n  #_ MEMORY_OUT 10001040 FCFDFEFF 04050607 08090A0B 0C0D0E0F\n\ntest_stvr_3:\n  #_ REGISTER_IN r4 0x10010000\n  #_ REGISTER_IN r5 0x0\n  #_ REGISTER_IN v3 [BE74FCBD, BD912ABA, BF317BBB, BF2D135F]\n  stvrx v3, r4, r5\n  blr\n  #_ REGISTER_OUT r4 0x10010000\n  #_ REGISTER_OUT r5 0x0\n  #_ REGISTER_OUT v3 [BE74FCBD, BD912ABA, BF317BBB, BF2D135F]\n\ntest_stvr_3_constant:\n  #_ REGISTER_IN v3 [BE74FCBD, BD912ABA, BF317BBB, BF2D135F]\n  lis r4, 0x1001\n  stvrx v3, r4, r0\n  blr\n  #_ REGISTER_OUT r4 0x10010000\n  #_ REGISTER_OUT v3 [BE74FCBD, BD912ABA, BF317BBB, BF2D135F]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_subf.s",
    "content": "test_subf_1:\n  #_ REGISTER_IN r10 0x00000000000103BF\n  #_ REGISTER_IN r11 0x00000000000103C0\n  subf r3, r10, r11\n  blr\n  #_ REGISTER_OUT r10 0x00000000000103BF\n  #_ REGISTER_OUT r11 0x00000000000103C0\n  #_ REGISTER_OUT r3 0x1\n\ntest_subf_1_constant:\n  lis r10, 1\n  ori r10, r10, 0x03BF\n  lis r11, 1\n  ori r11, r11, 0x03C0\n  subf r3, r10, r11\n  blr\n  #_ REGISTER_OUT r10 0x00000000000103BF\n  #_ REGISTER_OUT r11 0x00000000000103C0\n  #_ REGISTER_OUT r3 0x1\n\ntest_subf_2:\n  #_ REGISTER_IN r10 0\n  #_ REGISTER_IN r11 0\n  subf r3, r10, r11\n  blr\n  #_ REGISTER_OUT r10 0\n  #_ REGISTER_OUT r11 0\n  #_ REGISTER_OUT r3 0\n\ntest_subf_2_constant:\n  li r10, 0\n  li r11, 0\n  subf r3, r10, r11\n  blr\n  #_ REGISTER_OUT r10 0\n  #_ REGISTER_OUT r11 0\n  #_ REGISTER_OUT r3 0\n\ntest_subf_3:\n  #_ REGISTER_IN r10 1\n  #_ REGISTER_IN r11 0\n  subf r3, r10, r11\n  blr\n  #_ REGISTER_OUT r10 1\n  #_ REGISTER_OUT r11 0\n  #_ REGISTER_OUT r3 -1\n\ntest_subf_3_constant:\n  li r10, 1\n  li r11, 0\n  subf r3, r10, r11\n  blr\n  #_ REGISTER_OUT r10 1\n  #_ REGISTER_OUT r11 0\n  #_ REGISTER_OUT r3 -1\n\ntest_subf_4:\n  #_ REGISTER_IN r10 0\n  #_ REGISTER_IN r11 1\n  subf r3, r10, r11\n  blr\n  #_ REGISTER_OUT r10 0\n  #_ REGISTER_OUT r11 1\n  #_ REGISTER_OUT r3 1\n\ntest_subf_4_constant:\n  li r10, 0\n  li r11, 1\n  subf r3, r10, r11\n  blr\n  #_ REGISTER_OUT r10 0\n  #_ REGISTER_OUT r11 1\n  #_ REGISTER_OUT r3 1\n\ntest_subf_5:\n  #_ REGISTER_IN r10 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r11 0xFFFFFFFFFFFFFFFF\n  subf r3, r10, r11\n  blr\n  #_ REGISTER_OUT r10 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r11 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r3 0x0\n\ntest_subf_5_constant:\n  li r10, -1\n  li r11, -1\n  subf r3, r10, r11\n  blr\n  #_ REGISTER_OUT r10 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r11 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r3 0x0\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_subfc.s",
    "content": "test_subfc_1:\n  #_ REGISTER_IN r10 0x00000000000103BF\n  #_ REGISTER_IN r11 0x00000000000103C0\n  subfc r3, r10, r11\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 0x00000000000103BF\n  #_ REGISTER_OUT r11 0x00000000000103C0\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 1\n\ntest_subfc_1_constant:\n  lis r10, 1\n  ori r10, r10, 0x03BF\n  lis r11, 1\n  ori r11, r11, 0x03C0\n  subfc r3, r10, r11\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 0x00000000000103BF\n  #_ REGISTER_OUT r11 0x00000000000103C0\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 1\n\ntest_subfc_2:\n  #_ REGISTER_IN r10 0\n  #_ REGISTER_IN r11 0\n  subfc r3, r10, r11\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 0\n  #_ REGISTER_OUT r11 0\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 1\n\ntest_subfc_2_constant:\n  li r10, 0\n  li r11, 0\n  subfc r3, r10, r11\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 0\n  #_ REGISTER_OUT r11 0\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 1\n\ntest_subfc_3:\n  #_ REGISTER_IN r10 1\n  #_ REGISTER_IN r11 0\n  subfc r3, r10, r11\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 1\n  #_ REGISTER_OUT r11 0\n  #_ REGISTER_OUT r3 -1\n  #_ REGISTER_OUT r4 0\n\ntest_subfc_3_constant:\n  li r10, 1\n  li r11, 0\n  subfc r3, r10, r11\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 1\n  #_ REGISTER_OUT r11 0\n  #_ REGISTER_OUT r3 -1\n  #_ REGISTER_OUT r4 0\n\ntest_subfc_4:\n  #_ REGISTER_IN r10 0\n  #_ REGISTER_IN r11 1\n  subfc r3, r10, r11\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 0\n  #_ REGISTER_OUT r11 1\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 1\n\ntest_subfc_4_constant:\n  li r10, 0\n  li r11, 1\n  subfc r3, r10, r11\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 0\n  #_ REGISTER_OUT r11 1\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 1\n\ntest_subfc_5:\n  #_ REGISTER_IN r10 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r11 0xFFFFFFFFFFFFFFFF\n  subfc r3, r10, r11\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r11 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 1\n\ntest_subfc_5_constant:\n  li r10, -1\n  li r11, -1\n  subfc r3, r10, r11\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r11 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 1\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_subfe.s",
    "content": "test_subfe_1:\n  #_ REGISTER_IN r10 0x00000000000103BF\n  #_ REGISTER_IN r11 0x00000000000103C0\n  subfe r3, r10, r11\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 0x00000000000103BF\n  #_ REGISTER_OUT r11 0x00000000000103C0\n  #_ REGISTER_OUT r3 0x0\n  #_ REGISTER_OUT r4 1\n\ntest_subfe_1_constant:\n  lis r10, 1\n  ori r10, r10, 0x03BF\n  lis r11, 1\n  ori r11, r11, 0x03C0\n  subfe r3, r10, r11\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 0x00000000000103BF\n  #_ REGISTER_OUT r11 0x00000000000103C0\n  #_ REGISTER_OUT r3 0x0\n  #_ REGISTER_OUT r4 1\n\ntest_subfe_2:\n  #_ REGISTER_IN r10 0\n  #_ REGISTER_IN r11 0\n  subfe r3, r10, r11\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 0\n  #_ REGISTER_OUT r11 0\n  #_ REGISTER_OUT r3 0xffffffffffffffff\n  #_ REGISTER_OUT r4 0\n\ntest_subfe_2_constant:\n  li r10, 0\n  li r11, 0\n  subfe r3, r10, r11\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 0\n  #_ REGISTER_OUT r11 0\n  #_ REGISTER_OUT r3 0xffffffffffffffff\n  #_ REGISTER_OUT r4 0\n\ntest_subfe_3:\n  #_ REGISTER_IN r10 1\n  #_ REGISTER_IN r11 0\n  subfe r3, r10, r11\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 1\n  #_ REGISTER_OUT r11 0\n  #_ REGISTER_OUT r3 0xfffffffffffffffe\n  #_ REGISTER_OUT r4 0\n\ntest_subfe_3_constant:\n  li r10, 1\n  li r11, 0\n  subfe r3, r10, r11\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 1\n  #_ REGISTER_OUT r11 0\n  #_ REGISTER_OUT r3 0xfffffffffffffffe\n  #_ REGISTER_OUT r4 0\n\ntest_subfe_4:\n  #_ REGISTER_IN r10 0\n  #_ REGISTER_IN r11 1\n  subfe r3, r10, r11\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 0\n  #_ REGISTER_OUT r11 1\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 1\n\ntest_subfe_4_constant:\n  li r10, 0\n  li r11, 1\n  subfe r3, r10, r11\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 0\n  #_ REGISTER_OUT r11 1\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 1\n\ntest_subfe_5:\n  #_ REGISTER_IN r10 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_IN r11 0xFFFFFFFFFFFFFFFF\n  subfe r3, r10, r11\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r11 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0\n\ntest_subfe_5_constant:\n  li r10, -1\n  li r11, -1\n  subfe r3, r10, r11\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r11 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r3 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r4 0\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_subfic.s",
    "content": "test_subfic_1:\n  #_ REGISTER_IN r10 0x00000000000103BF\n  subfic r3, r10, 0x3C0\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 0x00000000000103BF\n  #_ REGISTER_OUT r3 0xffffffffffff0001\n  #_ REGISTER_OUT r4 0\n\ntest_subfic_1_constant:\n  lis r10, 1\n  ori r10, r10, 0x03BF\n  subfic r3, r10, 0x3C0\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 0x00000000000103BF\n  #_ REGISTER_OUT r3 0xffffffffffff0001\n  #_ REGISTER_OUT r4 0\n\ntest_subfic_2:\n  #_ REGISTER_IN r10 0x00000000000103BF\n  subfic r3, r10, -234\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 0x00000000000103BF\n  #_ REGISTER_OUT r3 0xfffffffffffefb57\n  #_ REGISTER_OUT r4 1\n\ntest_subfic_2_constant:\n  lis r10, 1\n  ori r10, r10, 0x03BF\n  subfic r3, r10, -234\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 0x00000000000103BF\n  #_ REGISTER_OUT r3 0xfffffffffffefb57\n  #_ REGISTER_OUT r4 1\n\ntest_subfic_3:\n  #_ REGISTER_IN r10 0\n  subfic r3, r10, 0\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 0\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 1\n\ntest_subfic_3_constant:\n  li r10, 0\n  subfic r3, r10, 0\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 0\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 1\n\ntest_subfic_4:\n  #_ REGISTER_IN r10 1\n  subfic r3, r10, 0\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 1\n  #_ REGISTER_OUT r3 -1\n  #_ REGISTER_OUT r4 0\n\ntest_subfic_4_constant:\n  li r10, 1\n  subfic r3, r10, 0\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 1\n  #_ REGISTER_OUT r3 -1\n  #_ REGISTER_OUT r4 0\n\ntest_subfic_5:\n  #_ REGISTER_IN r10 0\n  subfic r3, r10, 1\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 0\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 1\n\ntest_subfic_5_constant:\n  li r10, 0\n  subfic r3, r10, 1\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 0\n  #_ REGISTER_OUT r3 1\n  #_ REGISTER_OUT r4 1\n\ntest_subfic_6:\n  #_ REGISTER_IN r10 0xFFFFFFFFFFFFFFFF\n  subfic r3, r10, -1\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 1\n\ntest_subfic_6_constant:\n  li r10, -1\n  subfic r3, r10, -1\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 1\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_subfme.s",
    "content": "test_subfme_one_ca_1:\n  #_ REGISTER_IN r10 0x00000000000103BF\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1\n  subfme r3, r10\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 0x00000000000103BF\n  #_ REGISTER_OUT r3 0xfffffffffffefc40\n  #_ REGISTER_OUT r4 1\n\ntest_subfme_one_ca_1_constant:\n  lis r10, 1\n  ori r10, r10, 0x03BF\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1\n  subfme r3, r10\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 0x00000000000103BF\n  #_ REGISTER_OUT r3 0xfffffffffffefc40\n  #_ REGISTER_OUT r4 1\n\ntest_subfme_one_ca_2:\n  #_ REGISTER_IN r10 0\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1\n  subfme r3, r10\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 0\n  #_ REGISTER_OUT r3 -1\n  #_ REGISTER_OUT r4 1\n\ntest_subfme_one_ca_2_constant:\n  li r10, 0\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1\n  subfme r3, r10\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 0\n  #_ REGISTER_OUT r3 -1\n  #_ REGISTER_OUT r4 1\n\ntest_subfme_one_ca_3:\n  #_ REGISTER_IN r10 1\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1\n  subfme r3, r10\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 1\n  #_ REGISTER_OUT r3 0xfffffffffffffffe\n  #_ REGISTER_OUT r4 1\n\ntest_subfme_one_ca_3_constant:\n  li r10, 1\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1\n  subfme r3, r10\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 1\n  #_ REGISTER_OUT r3 0xfffffffffffffffe\n  #_ REGISTER_OUT r4 1\n\ntest_subfme_one_ca_4:\n  #_ REGISTER_IN r10 0xFFFFFFFFFFFFFFFF\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1\n  subfme r3, r10\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 1\n\ntest_subfme_one_ca_4_constant:\n  li r10, -1\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1\n  subfme r3, r10\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 1\n\ntest_subfme_zero_ca_1:\n  #_ REGISTER_IN r10 0x00000000000103BF\n  xor r3, r3, r3\n  addic r3, r3, 1\n  subfme r3, r10\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 0x00000000000103BF\n  #_ REGISTER_OUT r3 0xfffffffffffefc3f\n  #_ REGISTER_OUT r4 1\n\ntest_subfme_zero_ca_1_constant:\n  lis r10, 1\n  ori r10, r10, 0x03BF\n  xor r3, r3, r3\n  addic r3, r3, 1\n  subfme r3, r10\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 0x00000000000103BF\n  #_ REGISTER_OUT r3 0xfffffffffffefc3f\n  #_ REGISTER_OUT r4 1\n\ntest_subfme_zero_ca_2:\n  #_ REGISTER_IN r10 0\n  xor r3, r3, r3\n  addic r3, r3, 1\n  subfme r3, r10\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 0\n  #_ REGISTER_OUT r3 0xfffffffffffffffe\n  #_ REGISTER_OUT r4 1\n\ntest_subfme_zero_ca_2_constant:\n  li r10, 0\n  xor r3, r3, r3\n  addic r3, r3, 1\n  subfme r3, r10\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 0\n  #_ REGISTER_OUT r3 0xfffffffffffffffe\n  #_ REGISTER_OUT r4 1\n\ntest_subfme_zero_ca_3:\n  #_ REGISTER_IN r10 1\n  xor r3, r3, r3\n  addic r3, r3, 1\n  subfme r3, r10\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 1\n  #_ REGISTER_OUT r3 0xfffffffffffffffd\n  #_ REGISTER_OUT r4 1\n\ntest_subfme_zero_ca_3_constant:\n  li r10, 1\n  xor r3, r3, r3\n  addic r3, r3, 1\n  subfme r3, r10\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 1\n  #_ REGISTER_OUT r3 0xfffffffffffffffd\n  #_ REGISTER_OUT r4 1\n\ntest_subfme_zero_ca_4:\n  #_ REGISTER_IN r10 0xFFFFFFFFFFFFFFFF\n  xor r3, r3, r3\n  addic r3, r3, 1\n  subfme r3, r10\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r3 0xffffffffffffffff\n  #_ REGISTER_OUT r4 0\n\ntest_subfme_zero_ca_4_constant:\n  li r10, -1\n  xor r3, r3, r3\n  addic r3, r3, 1\n  subfme r3, r10\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r3 0xffffffffffffffff\n  #_ REGISTER_OUT r4 0\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_subfze.s",
    "content": "test_subfze_one_ca_1:\n  #_ REGISTER_IN r10 0x00000000000103BF\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1\n  subfze r3, r10\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 0x00000000000103BF\n  #_ REGISTER_OUT r3 0xfffffffffffefc41\n  #_ REGISTER_OUT r4 0\n\ntest_subfze_one_ca_1_constant:\n  lis r10, 1\n  ori r10, r10, 0x03BF\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1\n  subfze r3, r10\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 0x00000000000103BF\n  #_ REGISTER_OUT r3 0xfffffffffffefc41\n  #_ REGISTER_OUT r4 0\n\ntest_subfze_one_ca_2:\n  #_ REGISTER_IN r10 0\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1\n  subfze r3, r10\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 0\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 1\n\ntest_subfze_one_ca_2_constant:\n  li r10, 0\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1\n  subfze r3, r10\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 0\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 1\n\ntest_subfze_one_ca_3:\n  #_ REGISTER_IN r10 1\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1\n  subfze r3, r10\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 1\n  #_ REGISTER_OUT r3 -1\n  #_ REGISTER_OUT r4 0\n\ntest_subfze_one_ca_3_constant:\n  li r10, 1\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1\n  subfze r3, r10\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 1\n  #_ REGISTER_OUT r3 -1\n  #_ REGISTER_OUT r4 0\n\ntest_subfze_one_ca_4:\n  #_ REGISTER_IN r10 0xFFFFFFFFFFFFFFFF\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1\n  subfze r3, r10\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r3 0x1\n  #_ REGISTER_OUT r4 0\n\ntest_subfze_one_ca_4_constant:\n  li r10, -1\n  xor r3, r3, r3\n  not r3, r3\n  addic r3, r3, 1\n  subfze r3, r10\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r3 0x1\n  #_ REGISTER_OUT r4 0\n\ntest_subfze_zero_ca_1:\n  #_ REGISTER_IN r10 0x00000000000103BF\n  xor r3, r3, r3\n  addic r3, r3, 1\n  subfze r3, r10\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 0x00000000000103BF\n  #_ REGISTER_OUT r3 0xfffffffffffefc40\n  #_ REGISTER_OUT r4 0\n\ntest_subfze_zero_ca_1_constant:\n  lis r10, 1\n  ori r10, r10, 0x03BF\n  xor r3, r3, r3\n  addic r3, r3, 1\n  subfze r3, r10\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 0x00000000000103BF\n  #_ REGISTER_OUT r3 0xfffffffffffefc40\n  #_ REGISTER_OUT r4 0\n\ntest_subfze_zero_ca_2:\n  #_ REGISTER_IN r10 0\n  xor r3, r3, r3\n  addic r3, r3, 1\n  subfze r3, r10\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 0\n  #_ REGISTER_OUT r3 0xffffffffffffffff\n  #_ REGISTER_OUT r4 0\n\ntest_subfze_zero_ca_2_constant:\n  li r10, 0\n  xor r3, r3, r3\n  addic r3, r3, 1\n  subfze r3, r10\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 0\n  #_ REGISTER_OUT r3 0xffffffffffffffff\n  #_ REGISTER_OUT r4 0\n\ntest_subfze_zero_ca_3:\n  #_ REGISTER_IN r10 1\n  xor r3, r3, r3\n  addic r3, r3, 1\n  subfze r3, r10\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 1\n  #_ REGISTER_OUT r3 0xfffffffffffffffe\n  #_ REGISTER_OUT r4 0\n\ntest_subfze_zero_ca_3_constant:\n  li r10, 1\n  xor r3, r3, r3\n  addic r3, r3, 1\n  subfze r3, r10\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 1\n  #_ REGISTER_OUT r3 0xfffffffffffffffe\n  #_ REGISTER_OUT r4 0\n\ntest_subfze_zero_ca_4:\n  #_ REGISTER_IN r10 0xFFFFFFFFFFFFFFFF\n  xor r3, r3, r3\n  addic r3, r3, 1\n  subfze r3, r10\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0\n\ntest_subfze_zero_ca_4_constant:\n  li r10, -1\n  xor r3, r3, r3\n  addic r3, r3, 1\n  subfze r3, r10\n  adde r4, r0, r0\n  blr\n  #_ REGISTER_OUT r10 0xFFFFFFFFFFFFFFFF\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_td.s",
    "content": "test_tdlt_1:\n  #_ REGISTER_IN r3 24\n  #_ REGISTER_IN r4 16\n  tdlt r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 16\n\ntest_tdlt_1_constant:\n  li r3, 24\n  li r4, 16\n  tdlt r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 16\n\ntest_tdlt_2:\n  #_ REGISTER_IN r3 24\n  #_ REGISTER_IN r4 0\n  tdlt r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 0\n\ntest_tdlt_2_constant:\n  li r3, 24\n  li r4, 0\n  tdlt r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 0\n\ntest_tdle_1:\n  #_ REGISTER_IN r3 24\n  #_ REGISTER_IN r4 16\n  tdle r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 16\n\ntest_tdle_1_constant:\n  li r3, 24\n  li r4, 16\n  tdle r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 16\n\ntest_tdle_2:\n  #_ REGISTER_IN r3 24\n  #_ REGISTER_IN r4 0\n  tdle r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 0\n\ntest_tdle_2_constant:\n  li r3, 24\n  li r4, 0\n  tdle r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 0\n\ntest_tdeq_1:\n  #_ REGISTER_IN r3 0\n  #_ REGISTER_IN r4 24\n  tdeq r3, r4\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 24\n\ntest_tdeq_1_constant:\n  li r3, 0\n  li r4, 24\n  tdeq r3, r4\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 24\n\ntest_tdeq_2:\n  #_ REGISTER_IN r3 24\n  #_ REGISTER_IN r4 0\n  tdeq r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 0\n\ntest_tdeq_2_constant:\n  li r3, 24\n  li r4, 0\n  tdeq r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 0\n\ntest_tdge_1:\n  #_ REGISTER_IN r3 24\n  #_ REGISTER_IN r4 48\n  tdge r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 48\n\ntest_tdge_1_constant:\n  li r3, 24\n  li r4, 48\n  tdge r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 48\n\ntest_tdge_2:\n  #_ REGISTER_IN r3 0\n  #_ REGISTER_IN r4 48\n  tdge r3, r4\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 48\n\ntest_tdge_2_constant:\n  li r3, 0\n  li r4, 48\n  tdge r3, r4\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 48\n\ntest_tdge_3:\n  #_ REGISTER_IN r3 -1\n  #_ REGISTER_IN r4 0\n  tdge r3, r4\n  blr\n  #_ REGISTER_OUT r3 -1\n  #_ REGISTER_OUT r4 0\n\ntest_tdge_3_constant:\n  li r3, -1\n  li r4, 0\n  tdge r3, r4\n  blr\n  #_ REGISTER_OUT r3 -1\n  #_ REGISTER_OUT r4 0\n\ntest_tdgt_1:\n  #_ REGISTER_IN r3 24\n  #_ REGISTER_IN r4 48\n  tdgt r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 48\n\ntest_tdgt_1_constant:\n  li r3, 24\n  li r4, 48\n  tdgt r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 48\n\ntest_tdgt_2:\n  #_ REGISTER_IN r3 0\n  #_ REGISTER_IN r4 48\n  tdgt r3, r4\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 48\n\ntest_tdgt_2_constant:\n  li r3, 0\n  li r4, 48\n  tdgt r3, r4\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 48\n\ntest_tdgt_3:\n  #_ REGISTER_IN r3 -1\n  #_ REGISTER_IN r4 0\n  tdgt r3, r4\n  blr\n  #_ REGISTER_OUT r3 -1\n  #_ REGISTER_OUT r4 0\n\ntest_tdgt_3_constant:\n  li r3, -1\n  li r4, 0\n  tdgt r3, r4\n  blr\n  #_ REGISTER_OUT r3 -1\n  #_ REGISTER_OUT r4 0\n\ntest_tdnl_1:\n  #_ REGISTER_IN r3 24\n  #_ REGISTER_IN r4 48\n  tdnl r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 48\n\ntest_tdnl_1_constant:\n  li r3, 24\n  li r4, 48\n  tdnl r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 48\n\ntest_tdnl_2:\n  #_ REGISTER_IN r3 0\n  #_ REGISTER_IN r4 48\n  tdnl r3, r4\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 48\n\ntest_tdnl_2_constant:\n  li r3, 0\n  li r4, 48\n  tdnl r3, r4\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 48\n\ntest_tdnl_3:\n  #_ REGISTER_IN r3 -1\n  #_ REGISTER_IN r4 0\n  tdnl r3, r4\n  blr\n  #_ REGISTER_OUT r3 -1\n  #_ REGISTER_OUT r4 0\n\ntest_tdnl_3_constant:\n  li r3, -1\n  li r4, 0\n  tdnl r3, r4\n  blr\n  #_ REGISTER_OUT r3 -1\n  #_ REGISTER_OUT r4 0\n\ntest_tdne_1:\n  #_ REGISTER_IN r3 24\n  #_ REGISTER_IN r4 24\n  tdne r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 24\n\ntest_tdne_1_constant:\n  li r3, 24\n  li r4, 24\n  tdne r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 24\n\ntest_tdne_2:\n  #_ REGISTER_IN r3 0\n  #_ REGISTER_IN r4 0\n  tdne r3, r4\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0\n\ntest_tdne_2_constant:\n  li r3, 0\n  li r4, 0\n  tdne r3, r4\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0\n\ntest_tdng_1:\n  #_ REGISTER_IN r3 24\n  #_ REGISTER_IN r4 16\n  tdng r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 16\n\ntest_tdng_1_constant:\n  li r3, 24\n  li r4, 16\n  tdng r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 16\n\ntest_tdng_2:\n  #_ REGISTER_IN r3 24\n  #_ REGISTER_IN r4 0\n  tdng r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 0\n\ntest_tdng_2_constant:\n  li r3, 24\n  li r4, 0\n  tdng r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 0\n\ntest_tdng_3:\n  #_ REGISTER_IN r3 0\n  #_ REGISTER_IN r4 -1\n  tdng r3, r4\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 -1\n\ntest_tdng_3_constant:\n  li r3, 0\n  li r4, -1\n  tdng r3, r4\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 -1\n\ntest_tdllt_1:\n  #_ REGISTER_IN r3 24\n  #_ REGISTER_IN r4 16\n  tdllt r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 16\n\ntest_tdllt_1_constant:\n  li r3, 24\n  li r4, 16\n  tdllt r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 16\n\ntest_tdllt_2:\n  #_ REGISTER_IN r3 24\n  #_ REGISTER_IN r4 0\n  tdllt r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 0\n\ntest_tdllt_2_constant:\n  li r3, 24\n  li r4, 0\n  tdllt r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 0\n\ntest_tdlle_1:\n  #_ REGISTER_IN r3 24\n  #_ REGISTER_IN r4 16\n  tdlle r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 16\n\ntest_tdlle_1_constant:\n  li r3, 24\n  li r4, 16\n  tdlle r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 16\n\ntest_tdlle_2:\n  #_ REGISTER_IN r3 24\n  #_ REGISTER_IN r4 0\n  tdlle r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 0\n\ntest_tdlle_2_constant:\n  li r3, 24\n  li r4, 0\n  tdlle r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 0\n\ntest_tdlge_1:\n  #_ REGISTER_IN r3 24\n  #_ REGISTER_IN r4 48\n  tdlge r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 48\n\ntest_tdlge_1_constant:\n  li r3, 24\n  li r4, 48\n  tdlge r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 48\n\ntest_tdlge_2:\n  #_ REGISTER_IN r3 0\n  #_ REGISTER_IN r4 48\n  tdlge r3, r4\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 48\n\ntest_tdlge_2_constant:\n  li r3, 0\n  li r4, 48\n  tdlge r3, r4\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 48\n\ntest_tdlgt_1:\n  #_ REGISTER_IN r3 24\n  #_ REGISTER_IN r4 48\n  tdlgt r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 48\n\ntest_tdlgt_1_constant:\n  li r3, 24\n  li r4, 48\n  tdlgt r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 48\n\ntest_tdlgt_2:\n  #_ REGISTER_IN r3 0\n  #_ REGISTER_IN r4 48\n  tdlgt r3, r4\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 48\n\ntest_tdlgt_2_constant:\n  li r3, 0\n  li r4, 48\n  tdlgt r3, r4\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 48\n\ntest_tdlnl_1:\n  #_ REGISTER_IN r3 24\n  #_ REGISTER_IN r4 48\n  tdlnl r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 48\n\ntest_tdlnl_1_constant:\n  li r3, 24\n  li r4, 48\n  tdlnl r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 48\n\ntest_tdlnl_2:\n  #_ REGISTER_IN r3 0\n  #_ REGISTER_IN r4 48\n  tdlnl r3, r4\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 48\n\ntest_tdlnl_2_constant:\n  li r3, 0\n  li r4, 48\n  tdlnl r3, r4\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 48\n\ntest_tdlng_1:\n  #_ REGISTER_IN r3 24\n  #_ REGISTER_IN r4 16\n  tdlng r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 16\n\ntest_tdlng_1_constant:\n  li r3, 24\n  li r4, 16\n  tdlng r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 16\n\ntest_tdlng_2:\n  #_ REGISTER_IN r3 24\n  #_ REGISTER_IN r4 0\n  tdlng r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 0\n\ntest_tdlng_2_constant:\n  li r3, 24\n  li r4, 0\n  tdlng r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 0\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_tdi.s",
    "content": "test_tdlti_1:\n  #_ REGISTER_IN r3 24\n  tdlti r3, 16\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_tdlti_1_constant:\n  li r3, 24\n  tdlti r3, 16\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_tdlti_2:\n  #_ REGISTER_IN r3 24\n  tdlti r3, 0\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_tdlti_2_constant:\n  li r3, 24\n  tdlti r3, 0\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_tdlei_1:\n  #_ REGISTER_IN r3 24\n  tdlei r3, 16\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_tdlei_1_constant:\n  li r3, 24\n  tdlei r3, 16\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_tdlei_2:\n  #_ REGISTER_IN r3 24\n  tdlei r3, 0\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_tdlei_2_constant:\n  li r3, 24\n  tdlei r3, 0\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_tdeqi_1:\n  #_ REGISTER_IN r3 0\n  tdeqi r3, 24\n  blr\n  #_ REGISTER_OUT r3 0\n\ntest_tdeqi_1_constant:\n  li r3, 0\n  tdeqi r3, 24\n  blr\n  #_ REGISTER_OUT r3 0\n\ntest_tdeqi_2:\n  #_ REGISTER_IN r3 24\n  tdeqi r3, 0\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_tdeqi_2_constant:\n  li r3, 24\n  tdeqi r3, 0\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_tdgei_1:\n  #_ REGISTER_IN r3 24\n  tdgei r3, 48\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_tdgei_1_constant:\n  li r3, 24\n  tdgei r3, 48\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_tdgei_2:\n  #_ REGISTER_IN r3 0\n  tdgei r3, 48\n  blr\n  #_ REGISTER_OUT r3 0\n\ntest_tdgei_2_constant:\n  li r3, 0\n  tdgei r3, 48\n  blr\n  #_ REGISTER_OUT r3 0\n\ntest_tdgei_3:\n  #_ REGISTER_IN r3 -1\n  tdgei r3, 0\n  blr\n  #_ REGISTER_OUT r3 -1\n\ntest_tdgei_3_constant:\n  li r3, -1\n  tdgei r3, 0\n  blr\n  #_ REGISTER_OUT r3 -1\n\ntest_tdgti_1:\n  #_ REGISTER_IN r3 24\n  tdgti r3, 48\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_tdgti_1_constant:\n  li r3, 24\n  tdgti r3, 48\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_tdgti_2:\n  #_ REGISTER_IN r3 0\n  tdgti r3, 48\n  blr\n  #_ REGISTER_OUT r3 0\n\ntest_tdgti_2_constant:\n  li r3, 0\n  tdgti r3, 48\n  blr\n  #_ REGISTER_OUT r3 0\n\ntest_tdgti_3:\n  #_ REGISTER_IN r3 -1\n  tdgti r3, 0\n  blr\n  #_ REGISTER_OUT r3 -1\n\ntest_tdgti_3_constant:\n  li r3, -1\n  tdgti r3, 0\n  blr\n  #_ REGISTER_OUT r3 -1\n\ntest_tdnli_1:\n  #_ REGISTER_IN r3 24\n  tdnli r3, 48\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_tdnli_1_constant:\n  li r3, 24\n  tdnli r3, 48\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_tdnli_2:\n  #_ REGISTER_IN r3 0\n  tdnli r3, 48\n  blr\n  #_ REGISTER_OUT r3 0\n\ntest_tdnli_2_constant:\n  li r3, 0\n  tdnli r3, 48\n  blr\n  #_ REGISTER_OUT r3 0\n\ntest_tdnli_3:\n  #_ REGISTER_IN r3 -1\n  tdnli r3, 0\n  blr\n  #_ REGISTER_OUT r3 -1\n\ntest_tdnli_3_constant:\n  li r3, -1\n  tdnli r3, 0\n  blr\n  #_ REGISTER_OUT r3 -1\n\ntest_tdnei_1:\n  #_ REGISTER_IN r3 24\n  tdnei r3, 24\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_tdnei_1_constant:\n  li r3, 24\n  tdnei r3, 24\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_tdnei_2:\n  #_ REGISTER_IN r3 0\n  tdnei r3, 0\n  blr\n  #_ REGISTER_OUT r3 0\n\ntest_tdnei_2_constant:\n  li r3, 0\n  tdnei r3, 0\n  blr\n  #_ REGISTER_OUT r3 0\n\ntest_tdngi_1:\n  #_ REGISTER_IN r3 24\n  tdngi r3, 16\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_tdngi_1_constant:\n  li r3, 24\n  tdngi r3, 16\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_tdngi_2:\n  #_ REGISTER_IN r3 24\n  tdngi r3, 0\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_tdngi_2_constant:\n  li r3, 24\n  tdngi r3, 0\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_tdngi_3:\n  #_ REGISTER_IN r3 0\n  tdngi r3, -1\n  blr\n  #_ REGISTER_OUT r3 0\n\ntest_tdngi_3_constant:\n  li r3, 0\n  tdngi r3, -1\n  blr\n  #_ REGISTER_OUT r3 0\n\ntest_tdllti_1:\n  #_ REGISTER_IN r3 24\n  tdllti r3, 16\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_tdllti_1_constant:\n  li r3, 24\n  tdllti r3, 16\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_tdllti_2:\n  #_ REGISTER_IN r3 24\n  tdllti r3, 0\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_tdllti_2_constant:\n  li r3, 24\n  tdllti r3, 0\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_tdllei_1:\n  #_ REGISTER_IN r3 24\n  tdllei r3, 16\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_tdllei_1_constant:\n  li r3, 24\n  tdllei r3, 16\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_tdllei_2:\n  #_ REGISTER_IN r3 24\n  tdllei r3, 0\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_tdllei_2_constant:\n  li r3, 24\n  tdllei r3, 0\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_tdlgei_1:\n  #_ REGISTER_IN r3 24\n  tdlgei r3, 48\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_tdlgei_1_constant:\n  li r3, 24\n  tdlgei r3, 48\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_tdlgei_2:\n  #_ REGISTER_IN r3 0\n  tdlgei r3, 48\n  blr\n  #_ REGISTER_OUT r3 0\n\ntest_tdlgei_2_constant:\n  li r3, 0\n  tdlgei r3, 48\n  blr\n  #_ REGISTER_OUT r3 0\n\ntest_tdlgti_1:\n  #_ REGISTER_IN r3 24\n  tdlgti r3, 48\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_tdlgti_1_constant:\n  li r3, 24\n  tdlgti r3, 48\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_tdlgti_2:\n  #_ REGISTER_IN r3 0\n  tdlgti r3, 48\n  blr\n  #_ REGISTER_OUT r3 0\n\ntest_tdlgti_2_constant:\n  li r3, 0\n  tdlgti r3, 48\n  blr\n  #_ REGISTER_OUT r3 0\n\ntest_tdlnli_1:\n  #_ REGISTER_IN r3 24\n  tdlnli r3, 48\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_tdlnli_1_constant:\n  li r3, 24\n  tdlnli r3, 48\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_tdlnli_2:\n  #_ REGISTER_IN r3 0\n  tdlnli r3, 48\n  blr\n  #_ REGISTER_OUT r3 0\n\ntest_tdlnli_2_constant:\n  li r3, 0\n  tdlnli r3, 48\n  blr\n  #_ REGISTER_OUT r3 0\n\ntest_tdlngi_1:\n  #_ REGISTER_IN r3 24\n  tdlngi r3, 16\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_tdlngi_1_constant:\n  li r3, 24\n  tdlngi r3, 16\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_tdlngi_2:\n  #_ REGISTER_IN r3 24\n  tdlngi r3, 0\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_tdlngi_2_constant:\n  li r3, 24\n  tdlngi r3, 0\n  blr\n  #_ REGISTER_OUT r3 24\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_tw.s",
    "content": "test_twlt_1:\n  #_ REGISTER_IN r3 24\n  #_ REGISTER_IN r4 16\n  twlt r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 16\n\ntest_twlt_1_constant:\n  li r3, 24\n  li r4, 16\n  twlt r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 16\n\ntest_twlt_2:\n  #_ REGISTER_IN r3 24\n  #_ REGISTER_IN r4 0\n  twlt r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 0\n\ntest_twlt_2_constant:\n  li r3, 24\n  li r4, 0\n  twlt r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 0\n\ntest_twle_1:\n  #_ REGISTER_IN r3 24\n  #_ REGISTER_IN r4 16\n  twle r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 16\n\ntest_twle_1_constant:\n  li r3, 24\n  li r4, 16\n  twle r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 16\n\ntest_twle_2:\n  #_ REGISTER_IN r3 24\n  #_ REGISTER_IN r4 0\n  twle r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 0\n\ntest_twle_2_constant:\n  li r3, 24\n  li r4, 0\n  twle r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 0\n\ntest_tweq_1:\n  #_ REGISTER_IN r3 0\n  #_ REGISTER_IN r4 24\n  tweq r3, r4\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 24\n\ntest_tweq_1_constant:\n  li r3, 0\n  li r4, 24\n  tweq r3, r4\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 24\n\ntest_tweq_2:\n  #_ REGISTER_IN r3 24\n  #_ REGISTER_IN r4 0\n  tweq r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 0\n\ntest_tweq_2_constant:\n  li r3, 24\n  li r4, 0\n  tweq r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 0\n\ntest_twge_1:\n  #_ REGISTER_IN r3 24\n  #_ REGISTER_IN r4 48\n  twge r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 48\n\ntest_twge_1_constant:\n  li r3, 24\n  li r4, 48\n  twge r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 48\n\ntest_twge_2:\n  #_ REGISTER_IN r3 0\n  #_ REGISTER_IN r4 48\n  twge r3, r4\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 48\n\ntest_twge_2_constant:\n  li r3, 0\n  li r4, 48\n  twge r3, r4\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 48\n\ntest_twge_3:\n  #_ REGISTER_IN r3 -1\n  #_ REGISTER_IN r4 0\n  twge r3, r4\n  blr\n  #_ REGISTER_OUT r3 -1\n  #_ REGISTER_OUT r4 0\n\ntest_twge_3_constant:\n  li r3, -1\n  li r4, 0\n  twge r3, r4\n  blr\n  #_ REGISTER_OUT r3 -1\n  #_ REGISTER_OUT r4 0\n\ntest_twgt_1:\n  #_ REGISTER_IN r3 24\n  #_ REGISTER_IN r4 48\n  twgt r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 48\n\ntest_twgt_1_constant:\n  li r3, 24\n  li r4, 48\n  twgt r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 48\n\ntest_twgt_2:\n  #_ REGISTER_IN r3 0\n  #_ REGISTER_IN r4 48\n  twgt r3, r4\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 48\n\ntest_twgt_2_constant:\n  li r3, 0\n  li r4, 48\n  twgt r3, r4\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 48\n\ntest_twgt_3:\n  #_ REGISTER_IN r3 -1\n  #_ REGISTER_IN r4 0\n  twgt r3, r4\n  blr\n  #_ REGISTER_OUT r3 -1\n  #_ REGISTER_OUT r4 0\n\ntest_twgt_3_constant:\n  li r3, -1\n  li r4, 0\n  twgt r3, r4\n  blr\n  #_ REGISTER_OUT r3 -1\n  #_ REGISTER_OUT r4 0\n\ntest_twnl_1:\n  #_ REGISTER_IN r3 24\n  #_ REGISTER_IN r4 48\n  twnl r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 48\n\ntest_twnl_1_constant:\n  li r3, 24\n  li r4, 48\n  twnl r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 48\n\ntest_twnl_2:\n  #_ REGISTER_IN r3 0\n  #_ REGISTER_IN r4 48\n  twnl r3, r4\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 48\n\ntest_twnl_2_constant:\n  li r3, 0\n  li r4, 48\n  twnl r3, r4\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 48\n\ntest_twnl_3:\n  #_ REGISTER_IN r3 -1\n  #_ REGISTER_IN r4 0\n  twnl r3, r4\n  blr\n  #_ REGISTER_OUT r3 -1\n  #_ REGISTER_OUT r4 0\n\ntest_twnl_3_constant:\n  li r3, -1\n  li r4, 0\n  twnl r3, r4\n  blr\n  #_ REGISTER_OUT r3 -1\n  #_ REGISTER_OUT r4 0\n\ntest_twne_1:\n  #_ REGISTER_IN r3 24\n  #_ REGISTER_IN r4 24\n  twne r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 24\n\ntest_twne_1_constant:\n  li r3, 24\n  li r4, 24\n  twne r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 24\n\ntest_twne_2:\n  #_ REGISTER_IN r3 0\n  #_ REGISTER_IN r4 0\n  twne r3, r4\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0\n\ntest_twne_2_constant:\n  li r3, 0\n  li r4, 0\n  twne r3, r4\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 0\n\ntest_twng_1:\n  #_ REGISTER_IN r3 24\n  #_ REGISTER_IN r4 16\n  twng r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 16\n\ntest_twng_1_constant:\n  li r3, 24\n  li r4, 16\n  twng r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 16\n\ntest_twng_2:\n  #_ REGISTER_IN r3 24\n  #_ REGISTER_IN r4 0\n  twng r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 0\n\ntest_twng_2_constant:\n  li r3, 24\n  li r4, 0\n  twng r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 0\n\ntest_twng_3:\n  #_ REGISTER_IN r3 0\n  #_ REGISTER_IN r4 -1\n  twng r3, r4\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 -1\n\ntest_twng_3_constant:\n  li r3, 0\n  li r4, -1\n  twng r3, r4\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 -1\n\ntest_twllt_1:\n  #_ REGISTER_IN r3 24\n  #_ REGISTER_IN r4 16\n  twllt r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 16\n\ntest_twllt_1_constant:\n  li r3, 24\n  li r4, 16\n  twllt r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 16\n\ntest_twllt_2:\n  #_ REGISTER_IN r3 24\n  #_ REGISTER_IN r4 0\n  twllt r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 0\n\ntest_twllt_2_constant:\n  li r3, 24\n  li r4, 0\n  twllt r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 0\n\ntest_twlle_1:\n  #_ REGISTER_IN r3 24\n  #_ REGISTER_IN r4 16\n  twlle r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 16\n\ntest_twlle_1_constant:\n  li r3, 24\n  li r4, 16\n  twlle r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 16\n\ntest_twlle_2:\n  #_ REGISTER_IN r3 24\n  #_ REGISTER_IN r4 0\n  twlle r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 0\n\ntest_twlle_2_constant:\n  li r3, 24\n  li r4, 0\n  twlle r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 0\n\ntest_twlge_1:\n  #_ REGISTER_IN r3 24\n  #_ REGISTER_IN r4 48\n  twlge r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 48\n\ntest_twlge_1_constant:\n  li r3, 24\n  li r4, 48\n  twlge r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 48\n\ntest_twlge_2:\n  #_ REGISTER_IN r3 0\n  #_ REGISTER_IN r4 48\n  twlge r3, r4\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 48\n\ntest_twlge_2_constant:\n  li r3, 0\n  li r4, 48\n  twlge r3, r4\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 48\n\ntest_twlgt_1:\n  #_ REGISTER_IN r3 24\n  #_ REGISTER_IN r4 48\n  twlgt r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 48\n\ntest_twlgt_1_constant:\n  li r3, 24\n  li r4, 48\n  twlgt r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 48\n\ntest_twlgt_2:\n  #_ REGISTER_IN r3 0\n  #_ REGISTER_IN r4 48\n  twlgt r3, r4\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 48\n\ntest_twlgt_2_constant:\n  li r3, 0\n  li r4, 48\n  twlgt r3, r4\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 48\n\ntest_twlnl_1:\n  #_ REGISTER_IN r3 24\n  #_ REGISTER_IN r4 48\n  twlnl r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 48\n\ntest_twlnl_1_constant:\n  li r3, 24\n  li r4, 48\n  twlnl r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 48\n\ntest_twlnl_2:\n  #_ REGISTER_IN r3 0\n  #_ REGISTER_IN r4 48\n  twlnl r3, r4\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 48\n\ntest_twlnl_2_constant:\n  li r3, 0\n  li r4, 48\n  twlnl r3, r4\n  blr\n  #_ REGISTER_OUT r3 0\n  #_ REGISTER_OUT r4 48\n\ntest_twlng_1:\n  #_ REGISTER_IN r3 24\n  #_ REGISTER_IN r4 16\n  twlng r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 16\n\ntest_twlng_1_constant:\n  li r3, 24\n  li r4, 16\n  twlng r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 16\n\ntest_twlng_2:\n  #_ REGISTER_IN r3 24\n  #_ REGISTER_IN r4 0\n  twlng r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 0\n\ntest_twlng_2_constant:\n  li r3, 24\n  li r4, 0\n  twlng r3, r4\n  blr\n  #_ REGISTER_OUT r3 24\n  #_ REGISTER_OUT r4 0\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_twi.s",
    "content": "test_twlti_1:\n  #_ REGISTER_IN r3 24\n  twlti r3, 16\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_twlti_1_constant:\n  li r3, 24\n  twlti r3, 16\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_twlti_2:\n  #_ REGISTER_IN r3 24\n  twlti r3, 0\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_twlti_2_constant:\n  li r3, 24\n  twlti r3, 0\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_twlei_1:\n  #_ REGISTER_IN r3 24\n  twlei r3, 16\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_twlei_1_constant:\n  li r3, 24\n  twlei r3, 16\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_twlei_2:\n  #_ REGISTER_IN r3 24\n  twlei r3, 0\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_twlei_2_constant:\n  li r3, 24\n  twlei r3, 0\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_tweqi_1:\n  #_ REGISTER_IN r3 0\n  tweqi r3, 24\n  blr\n  #_ REGISTER_OUT r3 0\n\ntest_tweqi_1_constant:\n  li r3, 0\n  tweqi r3, 24\n  blr\n  #_ REGISTER_OUT r3 0\n\ntest_tweqi_2:\n  #_ REGISTER_IN r3 24\n  tweqi r3, 0\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_tweqi_2_constant:\n  li r3, 24\n  tweqi r3, 0\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_twgei_1:\n  #_ REGISTER_IN r3 24\n  twgei r3, 48\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_twgei_1_constant:\n  li r3, 24\n  twgei r3, 48\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_twgei_2:\n  #_ REGISTER_IN r3 0\n  twgei r3, 48\n  blr\n  #_ REGISTER_OUT r3 0\n\ntest_twgei_2_constant:\n  li r3, 0\n  twgei r3, 48\n  blr\n  #_ REGISTER_OUT r3 0\n\ntest_twgei_3:\n  #_ REGISTER_IN r3 -1\n  twgei r3, 0\n  blr\n  #_ REGISTER_OUT r3 -1\n\ntest_twgei_3_constant:\n  li r3, -1\n  twgei r3, 0\n  blr\n  #_ REGISTER_OUT r3 -1\n\ntest_twgti_1:\n  #_ REGISTER_IN r3 24\n  twgti r3, 48\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_twgti_1_constant:\n  li r3, 24\n  twgti r3, 48\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_twgti_2:\n  #_ REGISTER_IN r3 0\n  twgti r3, 48\n  blr\n  #_ REGISTER_OUT r3 0\n\ntest_twgti_2_constant:\n  li r3, 0\n  twgti r3, 48\n  blr\n  #_ REGISTER_OUT r3 0\n\ntest_twgti_3:\n  #_ REGISTER_IN r3 -1\n  twgti r3, 0\n  blr\n  #_ REGISTER_OUT r3 -1\n\ntest_twgti_3_constant:\n  li r3, -1\n  twgti r3, 0\n  blr\n  #_ REGISTER_OUT r3 -1\n\ntest_twnli_1:\n  #_ REGISTER_IN r3 24\n  twnli r3, 48\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_twnli_1_constant:\n  li r3, 24\n  twnli r3, 48\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_twnli_2:\n  #_ REGISTER_IN r3 0\n  twnli r3, 48\n  blr\n  #_ REGISTER_OUT r3 0\n\ntest_twnli_2_constant:\n  li r3, 0\n  twnli r3, 48\n  blr\n  #_ REGISTER_OUT r3 0\n\ntest_twnli_3:\n  #_ REGISTER_IN r3 -1\n  twnli r3, 0\n  blr\n  #_ REGISTER_OUT r3 -1\n\ntest_twnli_3_constant:\n  li r3, -1\n  twnli r3, 0\n  blr\n  #_ REGISTER_OUT r3 -1\n\ntest_twnei_1:\n  #_ REGISTER_IN r3 24\n  twnei r3, 24\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_twnei_1_constant:\n  li r3, 24\n  twnei r3, 24\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_twnei_2:\n  #_ REGISTER_IN r3 0\n  twnei r3, 0\n  blr\n  #_ REGISTER_OUT r3 0\n\ntest_twnei_2_constant:\n  li r3, 0\n  twnei r3, 0\n  blr\n  #_ REGISTER_OUT r3 0\n\ntest_twngi_1:\n  #_ REGISTER_IN r3 24\n  twngi r3, 16\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_twngi_1_constant:\n  li r3, 24\n  twngi r3, 16\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_twngi_2:\n  #_ REGISTER_IN r3 24\n  twngi r3, 0\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_twngi_2_constant:\n  li r3, 24\n  twngi r3, 0\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_twngi_3:\n  #_ REGISTER_IN r3 0\n  twngi r3, -1\n  blr\n  #_ REGISTER_OUT r3 0\n\ntest_twngi_3_constant:\n  li r3, 0\n  twngi r3, -1\n  blr\n  #_ REGISTER_OUT r3 0\n\ntest_twllti_1:\n  #_ REGISTER_IN r3 24\n  twllti r3, 16\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_twllti_1_constant:\n  li r3, 24\n  twllti r3, 16\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_twllti_2:\n  #_ REGISTER_IN r3 24\n  twllti r3, 0\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_twllti_2_constant:\n  li r3, 24\n  twllti r3, 0\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_twllei_1:\n  #_ REGISTER_IN r3 24\n  twllei r3, 16\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_twllei_1_constant:\n  li r3, 24\n  twllei r3, 16\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_twllei_2:\n  #_ REGISTER_IN r3 24\n  twllei r3, 0\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_twllei_2_constant:\n  li r3, 24\n  twllei r3, 0\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_twlgei_1:\n  #_ REGISTER_IN r3 24\n  twlgei r3, 48\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_twlgei_1_constant:\n  li r3, 24\n  twlgei r3, 48\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_twlgei_2:\n  #_ REGISTER_IN r3 0\n  twlgei r3, 48\n  blr\n  #_ REGISTER_OUT r3 0\n\ntest_twlgei_2_constant:\n  li r3, 0\n  twlgei r3, 48\n  blr\n  #_ REGISTER_OUT r3 0\n\ntest_twlgti_1:\n  #_ REGISTER_IN r3 24\n  twlgti r3, 48\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_twlgti_1_constant:\n  li r3, 24\n  twlgti r3, 48\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_twlgti_2:\n  #_ REGISTER_IN r3 0\n  twlgti r3, 48\n  blr\n  #_ REGISTER_OUT r3 0\n\ntest_twlgti_2_constant:\n  li r3, 0\n  twlgti r3, 48\n  blr\n  #_ REGISTER_OUT r3 0\n\ntest_twlnli_1:\n  #_ REGISTER_IN r3 24\n  twlnli r3, 48\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_twlnli_1_constant:\n  li r3, 24\n  twlnli r3, 48\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_twlnli_2:\n  #_ REGISTER_IN r3 0\n  twlnli r3, 48\n  blr\n  #_ REGISTER_OUT r3 0\n\ntest_twlnli_2_constant:\n  li r3, 0\n  twlnli r3, 48\n  blr\n  #_ REGISTER_OUT r3 0\n\ntest_twlngi_1:\n  #_ REGISTER_IN r3 24\n  twlngi r3, 16\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_twlngi_1_constant:\n  li r3, 24\n  twlngi r3, 16\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_twlngi_2:\n  #_ REGISTER_IN r3 24\n  twlngi r3, 0\n  blr\n  #_ REGISTER_OUT r3 24\n\ntest_twlngi_2_constant:\n  li r3, 24\n  twlngi r3, 0\n  blr\n  #_ REGISTER_OUT r3 24\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vaddfp.s",
    "content": "test_vaddfp_1:\n  # v3 = [10.0, -10.0, 15.0, -15.0]\n  # v4 = [-10.0, 20.0, -20.0, 30.0]\n  #_ REGISTER_IN v3 [41200000, C1200000, 41700000, C1700000]\n  #_ REGISTER_IN v4 [C1200000, 41A00000, C1A00000, 41F00000]\n  vaddfp v3, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [00000000, 41200000, C0A00000, 41700000]\n  #_ REGISTER_OUT v4 [C1200000, 41A00000, C1A00000, 41F00000]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vaddfp128.s",
    "content": "test_vaddfp128_1:\n  # v3 = [10.0, -10.0, 15.0, -15.0]\n  # v4 = [-10.0, 20.0, -20.0, 30.0]\n  #_ REGISTER_IN v3 [41200000, C1200000, 41700000, C1700000]\n  #_ REGISTER_IN v4 [C1200000, 41A00000, C1A00000, 41F00000]\n  vaddfp128 v0, v3, v4\n  blr\n  #_ REGISTER_OUT v0 [00000000, 41200000, C0A00000, 41700000]\n  #_ REGISTER_OUT v3 [41200000, C1200000, 41700000, C1700000]\n  #_ REGISTER_OUT v4 [C1200000, 41A00000, C1A00000, 41F00000]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vaddshs.s",
    "content": "test_vaddshs_1:\n  #_ REGISTER_IN v3 [7FFF8001, 7FFF8003, 7FFF8005, 80068007]\n  #_ REGISTER_IN v4 [00018001, 10000000, 42568124, 00000000]\n  vaddshs v3, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [7fff8000, 7fff8003, 7fff8000, 80068007]\n  #_ REGISTER_OUT v4 [00018001, 10000000, 42568124, 00000000]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vadduhm.s",
    "content": "test_vadduhm_1:\n  #_ REGISTER_IN v3 [7FFF8001, 7FFF8003, 7FFF8005, 80068007]\n  #_ REGISTER_IN v4 [00018001, 10000000, 42568124, 00000000]\n  vadduhm v3, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [80000002, 8fff8003, c2550129, 80068007]\n  #_ REGISTER_OUT v4 [00018001, 10000000, 42568124, 00000000]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vand.s",
    "content": "test_vand_1:\n  #_ REGISTER_IN v3 [FFFF0101, 7070FFFF, 7FFFFFFF, 00000000]\n  #_ REGISTER_IN v4 [80081010, 808F0020, 7FFFFFF0, 8FFFFFFF]\n  vand v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [FFFF0101, 7070FFFF, 7FFFFFFF, 00000000]\n  #_ REGISTER_OUT v4 [80081010, 808F0020, 7FFFFFF0, 8FFFFFFF]\n  #_ REGISTER_OUT v5 [80080000, 00000020, 7FFFFFF0, 00000000]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vand128.s",
    "content": "test_vand128_1:\n  #_ REGISTER_IN v3 [FFFF0101, 7070FFFF, 7FFFFFFF, 00000000]\n  #_ REGISTER_IN v4 [80081010, 808F0020, 7FFFFFF0, 8FFFFFFF]\n  vand128 v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [FFFF0101, 7070FFFF, 7FFFFFFF, 00000000]\n  #_ REGISTER_OUT v4 [80081010, 808F0020, 7FFFFFF0, 8FFFFFFF]\n  #_ REGISTER_OUT v5 [80080000, 00000020, 7FFFFFF0, 00000000]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vandc.s",
    "content": "test_vandc_1:\n  #_ REGISTER_IN v3 [FFFF0101, 7070FFFF, 7FFFFFFF, 00000000]\n  #_ REGISTER_IN v4 [80081010, 808F0020, 7FFFFFF0, 8FFFFFFF]\n  vandc v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [FFFF0101, 7070FFFF, 7FFFFFFF, 00000000]\n  #_ REGISTER_OUT v4 [80081010, 808F0020, 7FFFFFF0, 8FFFFFFF]\n  #_ REGISTER_OUT v5 [7FF70101, 7070FFDF, 0000000F, 00000000]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vandc128.s",
    "content": "test_vandc128_1:\n  #_ REGISTER_IN v3 [FFFF0101, 7070FFFF, 7FFFFFFF, 00000000]\n  #_ REGISTER_IN v4 [80081010, 808F0020, 7FFFFFF0, 8FFFFFFF]\n  vandc128 v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [FFFF0101, 7070FFFF, 7FFFFFFF, 00000000]\n  #_ REGISTER_OUT v4 [80081010, 808F0020, 7FFFFFF0, 8FFFFFFF]\n  #_ REGISTER_OUT v5 [7FF70101, 7070FFDF, 0000000F, 00000000]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vavgsh.s",
    "content": "#vavgsh isn't implemented\n#test_vavgsh_1:\n#  #_ REGISTER_IN v3 [00000001, 00020003, 00040005, 00060007]\n#  #_ REGISTER_IN v4 [00080009, 000A000B, 000C000D, 000E000F]\n#  vavgsh v5, v3, v4\n#  blr\n#  #_ REGISTER_OUT v3 [00000001, 00020003, 00040005, 00060007]\n#  #_ REGISTER_OUT v4 [00080009, 000A000B, 000C000D, 000E000F]\n#  #_ REGISTER_OUT v5 [00040005, 00060007, 00080009, 000A000B]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vavguh.s",
    "content": "test_vavguh_1:\n  #_ REGISTER_IN v3 [00000001, 00020003, 00040005, 00060007]\n  #_ REGISTER_IN v4 [00080009, 000A000B, 000C000D, 000E000F]\n  vavguh v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [00000001, 00020003, 00040005, 00060007]\n  #_ REGISTER_OUT v4 [00080009, 000A000B, 000C000D, 000E000F]\n  #_ REGISTER_OUT v5 [00040005, 00060007, 00080009, 000A000B]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vcfsx.s",
    "content": "test_vcfsx_1:\n  #_ REGISTER_IN v3 [3f800000, 3fc00000, 3f8ccccd, 3ff33333]\n  # 1.0, 1.5, 1.1, 1.9\n  vcfsx v3, v3, 0\n  blr\n  #_ REGISTER_OUT v3 [4e7e0000, 4e7f0000, 4e7e3333, 4e7fcccd]\n\ntest_vcfsx_2:\n  #_ REGISTER_IN v3 [3f800000, 3fc00000, 3f8ccccd, 3ff33333]\n  # 1.0, 1.5, 1.1, 1.9\n  vcfsx v3, v3, 1\n  blr\n  #_ REGISTER_OUT v3 [4dfe0000, 4dff0000, 4dfe3333, 4dffcccd]\n\ntest_vcfsx_3:\n  #_ REGISTER_IN v3 [3f800000, 3fc00000, 3f8ccccd, 3ff33333]\n  # 1.0, 1.5, 1.1, 1.9\n  vcfsx v3, v3, 10\n  blr\n  #_ REGISTER_OUT v3 [497e0000, 497f0000, 497e3333, 497fcccd]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vcmpxxfp.s",
    "content": "test_vcmpxxfp_1:\n  #_ REGISTER_IN v4 [3f800000, 3f800000, 3f800000, 3f800000]\n  #_ REGISTER_IN v5 [3f800000, 3f800000, 3f800000, 3f800000]\n  vcmpeqfp. v3, v4, v5\n  mfocrf  r3, 2  # cr6\n  blr\n  #_ REGISTER_OUT v3 [ffffffff, ffffffff, ffffffff, ffffffff]\n  #_ REGISTER_OUT v4 [3f800000, 3f800000, 3f800000, 3f800000]\n  #_ REGISTER_OUT v5 [3f800000, 3f800000, 3f800000, 3f800000]\n  #_ REGISTER_OUT r3 0x00000080\n\ntest_vcmpxxfp_2:\n  #_ REGISTER_IN v4 [3f800000, 3f800000, 3f800000, 3f800000]\n  #_ REGISTER_IN v5 [3f800001, 3f800000, 3f800000, 3f800000]\n  vcmpeqfp. v3, v4, v5\n  mfocrf  r3, 2  # cr6\n  blr\n  #_ REGISTER_OUT v3 [00000000, ffffffff, ffffffff, ffffffff]\n  #_ REGISTER_OUT v4 [3f800000, 3f800000, 3f800000, 3f800000]\n  #_ REGISTER_OUT v5 [3f800001, 3f800000, 3f800000, 3f800000]\n  #_ REGISTER_OUT r3 0x00000000\n\ntest_vcmpxxfp_3:\n  #_ REGISTER_IN v4 [3f800000, 3f800000, 3f800000, 3f800000]\n  #_ REGISTER_IN v5 [3f800001, 3f800001, 3f800001, 3f800001]\n  vcmpeqfp. v3, v4, v5\n  mfocrf  r3, 2  # cr6\n  blr\n  #_ REGISTER_OUT v3 [00000000, 00000000, 00000000, 00000000]\n  #_ REGISTER_OUT v4 [3f800000, 3f800000, 3f800000, 3f800000]\n  #_ REGISTER_OUT v5 [3f800001, 3f800001, 3f800001, 3f800001]\n  #_ REGISTER_OUT r3 0x00000020\n\ntest_vcmpbfp_1:\n  # [5.0, 5.0, 5.0, 5.0]\n  #_ REGISTER_IN v4 [40A00000, 40A00000, 40A00000, 40A00000]\n  #_ REGISTER_IN v5 [40A00000, 40A00000, 40A00000, 40A00000]\n  vcmpbfp. v3, v4, v5\n  mfocrf r3, 2 # cr6\n  blr\n  #_ REGISTER_OUT v4 [40A00000, 40A00000, 40A00000, 40A00000]\n  #_ REGISTER_OUT v5 [40A00000, 40A00000, 40A00000, 40A00000]\n  #_ REGISTER_OUT v3 [00000000, 00000000, 00000000, 00000000]\n  #_ REGISTER_OUT r3 0x00000020\n\ntest_vcmpbfp_2:\n  # [-5.0, -5.0, -5.0, -5.0]\n  #_ REGISTER_IN v4 [C0A00000, C0A00000, C0A00000, C0A00000]\n  #_ REGISTER_IN v5 [40A00000, 40A00000, 40A00000, 40A00000]\n  vcmpbfp. v3, v4, v5\n  mfocrf r3, 2 # cr6\n  blr\n  #_ REGISTER_OUT v4 [C0A00000, C0A00000, C0A00000, C0A00000]\n  #_ REGISTER_OUT v5 [40A00000, 40A00000, 40A00000, 40A00000]\n  #_ REGISTER_OUT v3 [00000000, 00000000, 00000000, 00000000]\n  #_ REGISTER_OUT r3 0x00000020\n\ntest_vcmpbfp_3:\n  # [7.0, -7.0, 5.0, 5.0]\n  #_ REGISTER_IN v4 [40E00000, C0E00000, 40A00000, 40A00000]\n  #_ REGISTER_IN v5 [40A00000, 40A00000, 40A00000, 40A00000]\n  vcmpbfp. v3, v4, v5\n  mfocrf r3, 2 # cr6\n  blr\n  #_ REGISTER_OUT v4 [40E00000, C0E00000, 40A00000, 40A00000]\n  #_ REGISTER_OUT v5 [40A00000, 40A00000, 40A00000, 40A00000]\n  #_ REGISTER_OUT v3 [80000000, 40000000, 00000000, 00000000]\n  #_ REGISTER_OUT r3 0x00000000\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vcmpxxfp128.s",
    "content": "test_vcmpxxfp128_1:\n  #_ REGISTER_IN v4 [3f800000, 3f800000, 3f800000, 3f800000]\n  #_ REGISTER_IN v5 [3f800000, 3f800000, 3f800000, 3f800000]\n  vcmpeqfp128. v3, v4, v5\n  mfocrf  r3, 2  # cr6\n  blr\n  #_ REGISTER_OUT v3 [ffffffff, ffffffff, ffffffff, ffffffff]\n  #_ REGISTER_OUT v4 [3f800000, 3f800000, 3f800000, 3f800000]\n  #_ REGISTER_OUT v5 [3f800000, 3f800000, 3f800000, 3f800000]\n  #_ REGISTER_OUT r3 0x00000080\n\ntest_vcmpxxfp128_2:\n  #_ REGISTER_IN v4 [3f800000, 3f800000, 3f800000, 3f800000]\n  #_ REGISTER_IN v5 [3f800001, 3f800000, 3f800000, 3f800000]\n  vcmpeqfp128. v3, v4, v5\n  mfocrf  r3, 2  # cr6\n  blr\n  #_ REGISTER_OUT v3 [00000000, ffffffff, ffffffff, ffffffff]\n  #_ REGISTER_OUT v4 [3f800000, 3f800000, 3f800000, 3f800000]\n  #_ REGISTER_OUT v5 [3f800001, 3f800000, 3f800000, 3f800000]\n  #_ REGISTER_OUT r3 0x00000000\n\ntest_vcmpxxfp128_3:\n  #_ REGISTER_IN v4 [3f800000, 3f800000, 3f800000, 3f800000]\n  #_ REGISTER_IN v5 [3f800001, 3f800001, 3f800001, 3f800001]\n  vcmpeqfp128. v3, v4, v5\n  mfocrf  r3, 2  # cr6\n  blr\n  #_ REGISTER_OUT v3 [00000000, 00000000, 00000000, 00000000]\n  #_ REGISTER_OUT v4 [3f800000, 3f800000, 3f800000, 3f800000]\n  #_ REGISTER_OUT v5 [3f800001, 3f800001, 3f800001, 3f800001]\n  #_ REGISTER_OUT r3 0x00000020\n\ntest_vcmpbfp128_1:\n  # [5.0, 5.0, 5.0, 5.0]\n  #_ REGISTER_IN v4 [40A00000, 40A00000, 40A00000, 40A00000]\n  #_ REGISTER_IN v5 [40A00000, 40A00000, 40A00000, 40A00000]\n  vcmpbfp128. v3, v4, v5\n  mfocrf r3, 2 # cr6\n  blr\n  #_ REGISTER_OUT v4 [40A00000, 40A00000, 40A00000, 40A00000]\n  #_ REGISTER_OUT v5 [40A00000, 40A00000, 40A00000, 40A00000]\n  #_ REGISTER_OUT v3 [00000000, 00000000, 00000000, 00000000]\n  #_ REGISTER_OUT r3 0x00000020\n\ntest_vcmpbfp128_2:\n  # [-5.0, -5.0, -5.0, -5.0]\n  #_ REGISTER_IN v4 [C0A00000, C0A00000, C0A00000, C0A00000]\n  #_ REGISTER_IN v5 [40A00000, 40A00000, 40A00000, 40A00000]\n  vcmpbfp128. v3, v4, v5\n  mfocrf r3, 2 # cr6\n  blr\n  #_ REGISTER_OUT v4 [C0A00000, C0A00000, C0A00000, C0A00000]\n  #_ REGISTER_OUT v5 [40A00000, 40A00000, 40A00000, 40A00000]\n  #_ REGISTER_OUT v3 [00000000, 00000000, 00000000, 00000000]\n  #_ REGISTER_OUT r3 0x00000020\n\ntest_vcmpbfp128_3:\n  # [7.0, -7.0, 5.0, 5.0]\n  #_ REGISTER_IN v4 [40E00000, C0E00000, 40A00000, 40A00000]\n  #_ REGISTER_IN v5 [40A00000, 40A00000, 40A00000, 40A00000]\n  vcmpbfp128. v3, v4, v5\n  mfocrf r3, 2 # cr6\n  blr\n  #_ REGISTER_OUT v4 [40E00000, C0E00000, 40A00000, 40A00000]\n  #_ REGISTER_OUT v5 [40A00000, 40A00000, 40A00000, 40A00000]\n  #_ REGISTER_OUT v3 [80000000, 40000000, 00000000, 00000000]\n  #_ REGISTER_OUT r3 0x00000000\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vctsxs.s",
    "content": "# 0 * 2^31\ntest_vctsxs_1:\n  #_ REGISTER_IN v0 [00000000, 00000000, 00000000, 00000000]\n  vctsxs v3, v0, 31\n  blr\n  #_ REGISTER_OUT v0 [00000000, 00000000, 00000000, 00000000]\n  #_ REGISTER_OUT v3 [00000000, 00000000, 00000000, 00000000]\n\n# -0 ^ 2^31\ntest_vctsxs_2:\n  #_ REGISTER_IN v0 [80000000, 80000000, 80000000, 80000000]\n  vctsxs v3, v0, 31\n  blr\n  #_ REGISTER_OUT v0 [80000000, 80000000, 80000000, 80000000]\n  #_ REGISTER_OUT v3 [00000000, 00000000, 00000000, 00000000]\n\n# smallest positive subnormal * 2^31\ntest_vctsxs_3:\n  #_ REGISTER_IN v0 [00000001, 00000001, 00000001, 00000001]\n  vctsxs v3, v0, 31\n  blr\n  #_ REGISTER_OUT v0 [00000001, 00000001, 00000001, 00000001]\n  #_ REGISTER_OUT v3 [00000000, 00000000, 00000000, 00000000]\n\n# largest subnormal * 2^31\ntest_vctsxs_4:\n  #_ REGISTER_IN v0 [007FFFFF, 007FFFFF, 007FFFFF, 007FFFFF]\n  vctsxs v3, v0, 31\n  blr\n  #_ REGISTER_OUT v0 [007FFFFF, 007FFFFF, 007FFFFF, 007FFFFF]\n  #_ REGISTER_OUT v3 [00000000, 00000000, 00000000, 00000000]\n\n# +1 * 2^0\ntest_vctsxs_5:\n  #_ REGISTER_IN v0 [3F800000, 3F800000, 3F800000, 3F800000]\n  vctsxs v3, v0, 0\n  blr\n  #_ REGISTER_OUT v0 [3F800000, 3F800000, 3F800000, 3F800000]\n  #_ REGISTER_OUT v3 [00000001, 00000001, 00000001, 00000001]\n\n# -1 * 2^0\ntest_vctsxs_6:\n  #_ REGISTER_IN v0 [BF800000, BF800000, BF800000, BF800000]\n  vctsxs v3, v0, 0\n  blr\n  #_ REGISTER_OUT v0 [BF800000, BF800000, BF800000, BF800000]\n  #_ REGISTER_OUT v3 [FFFFFFFF, FFFFFFFF, FFFFFFFF, FFFFFFFF]\n\n# 2^31 * 2^0\ntest_vctsxs_7:\n  #_ REGISTER_IN v0 [4F000000, 4F000000, 4F000000, 4F000000]\n  vctsxs v3, v0, 0\n  blr\n  #_ REGISTER_OUT v0 [4F000000, 4F000000, 4F000000, 4F000000]\n  #_ REGISTER_OUT v3 [7FFFFFFF, 7FFFFFFF, 7FFFFFFF, 7FFFFFFF]\n\n# +infinity * 2^0\ntest_vctsxs_8:\n  #_ REGISTER_IN v0 [7F800000, 7F800000, 7F800000, 7F800000]\n  vctsxs v3, v0, 0\n  blr\n  #_ REGISTER_OUT v0 [7F800000, 7F800000, 7F800000, 7F800000]\n  #_ REGISTER_OUT v3 [7FFFFFFF, 7FFFFFFF, 7FFFFFFF, 7FFFFFFF]\n\n# -infinity * 2^0\ntest_vctsxs_9:\n  #_ REGISTER_IN v0 [FF800000, FF800000, FF800000, FF800000]\n  vctsxs v3, v0, 0\n  blr\n  #_ REGISTER_OUT v0 [FF800000, FF800000, FF800000, FF800000]\n  #_ REGISTER_OUT v3 [80000000, 80000000, 80000000, 80000000]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vctuxs.s",
    "content": "# 0 * 2^31\ntest_vctuxs_1:\n  #_ REGISTER_IN v0 [00000000, 00000000, 00000000, 00000000]\n  vctuxs v3, v0, 31\n  blr\n  #_ REGISTER_OUT v0 [00000000, 00000000, 00000000, 00000000]\n  #_ REGISTER_OUT v3 [00000000, 00000000, 00000000, 00000000]\n\n# -0 ^ 2^31\ntest_vctuxs_2:\n  #_ REGISTER_IN v0 [80000000, 80000000, 80000000, 80000000]\n  vctuxs v3, v0, 31\n  blr\n  #_ REGISTER_OUT v0 [80000000, 80000000, 80000000, 80000000]\n  #_ REGISTER_OUT v3 [00000000, 00000000, 00000000, 00000000]\n\n# smallest positive subnormal * 2^31\ntest_vctuxs_3:\n  #_ REGISTER_IN v0 [00000001, 00000001, 00000001, 00000001]\n  vctuxs v3, v0, 31\n  blr\n  #_ REGISTER_OUT v0 [00000001, 00000001, 00000001, 00000001]\n  #_ REGISTER_OUT v3 [00000000, 00000000, 00000000, 00000000]\n\n# largest subnormal * 2^31\ntest_vctuxs_4:\n  #_ REGISTER_IN v0 [007FFFFF, 007FFFFF, 007FFFFF, 007FFFFF]\n  vctuxs v3, v0, 31\n  blr\n  #_ REGISTER_OUT v0 [007FFFFF, 007FFFFF, 007FFFFF, 007FFFFF]\n  #_ REGISTER_OUT v3 [00000000, 00000000, 00000000, 00000000]\n\n# +1 * 2^0\ntest_vctuxs_5:\n  #_ REGISTER_IN v0 [3F800000, 3F800000, 3F800000, 3F800000]\n  vctuxs v3, v0, 0\n  blr\n  #_ REGISTER_OUT v0 [3F800000, 3F800000, 3F800000, 3F800000]\n  #_ REGISTER_OUT v3 [00000001, 00000001, 00000001, 00000001]\n\n# -1 * 2^0\ntest_vctuxs_6:\n  #_ REGISTER_IN v0 [BF800000, BF800000, BF800000, BF800000]\n  vctuxs v3, v0, 0\n  blr\n  #_ REGISTER_OUT v0 [BF800000, BF800000, BF800000, BF800000]\n  #_ REGISTER_OUT v3 [00000000, 00000000, 00000000, 00000000]\n\n# 2^31 * 2^0\ntest_vctuxs_7:\n  #_ REGISTER_IN v0 [4F000000, 4F000000, 4F000000, 4F000000]\n  vctuxs v3, v0, 0\n  blr\n  #_ REGISTER_OUT v0 [4F000000, 4F000000, 4F000000, 4F000000]\n  #_ REGISTER_OUT v3 [80000000, 80000000, 80000000, 80000000]\n\n# 2^31 * 1.5 * 2^0\ntest_vctuxs_8:\n  #_ REGISTER_IN v0 [4F400000, 4F400000, 4F400000, 4F400000]\n  vctuxs v3, v0, 0\n  blr\n  #_ REGISTER_OUT v0 [4F400000, 4F400000, 4F400000, 4F400000]\n  #_ REGISTER_OUT v3 [C0000000, C0000000, C0000000, C0000000]\n\n# 2^32 * 2^0\ntest_vctuxs_9:\n  #_ REGISTER_IN v0 [4F800000, 4F800000, 4F800000, 4F800000]\n  vctuxs v3, v0, 0\n  blr\n  #_ REGISTER_OUT v0 [4F800000, 4F800000, 4F800000, 4F800000]\n  #_ REGISTER_OUT v3 [FFFFFFFF, FFFFFFFF, FFFFFFFF, FFFFFFFF]\n\n# +infinity * 2^0\ntest_vctuxs_10:\n  #_ REGISTER_IN v0 [7F800000, 7F800000, 7F800000, 7F800000]\n  vctuxs v3, v0, 0\n  blr\n  #_ REGISTER_OUT v0 [7F800000, 7F800000, 7F800000, 7F800000]\n  #_ REGISTER_OUT v3 [FFFFFFFF, FFFFFFFF, FFFFFFFF, FFFFFFFF]\n\n# -infinity * 2^0\ntest_vctuxs_11:\n  #_ REGISTER_IN v0 [FF800000, FF800000, FF800000, FF800000]\n  vctuxs v3, v0, 0\n  blr\n  #_ REGISTER_OUT v0 [FF800000, FF800000, FF800000, FF800000]\n  #_ REGISTER_OUT v3 [00000000, 00000000, 00000000, 00000000]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vexptefp.s",
    "content": "test_vexptefp_1:\n  #_ REGISTER_IN v3 [40000000, 40400000, 40800000, 40A00000]\n  vexptefp v4, v3\n  blr\n  #_ REGISTER_OUT v3 [40000000, 40400000, 40800000, 40A00000]\n  #_ REGISTER_OUT v4 [40800000, 41000000, 41800000, 42000000]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vmaddfp.s",
    "content": "test_vmaddfp_1:\n  #_ REGISTER_IN v4 [3f800000, 3fc00000, 3f8ccccd, 3ff33333]\n  # 1.0, 1.5, 1.1, 1.9\n  vmaddfp v3, v4, v4, v4\n  blr\n  #_ REGISTER_OUT v3 [40000000, 40700000, 4013d70a, 40b051eb]\n  #_ REGISTER_OUT v4 [3f800000, 3fc00000, 3f8ccccd, 3ff33333]\n  # 2.0, 3.75, 2.31, 5.51\n  # 40b051eb is actually 5.50999975, not 5.51?\n  # 40b051ec is 5.51\n\ntest_vmaddfp_2:\n  #_ REGISTER_IN v4 [3f800000, 3f800000, 3f800000, 3f800000]\n  #_ REGISTER_IN v5 [3f800000, 3f800000, 3f800000, 3f800000]\n  #_ REGISTER_IN v6 [3f800000, 3f800000, 3f800000, 3f800000]\n  # 1.0, 1.5, 1.1, 1.9\n  vmaddfp v3, v4, v5, v6\n  blr\n  #_ REGISTER_OUT v3 [40000000, 40000000, 40000000, 40000000]\n  #_ REGISTER_OUT v4 [3f800000, 3f800000, 3f800000, 3f800000]\n  #_ REGISTER_OUT v5 [3f800000, 3f800000, 3f800000, 3f800000]\n  #_ REGISTER_OUT v6 [3f800000, 3f800000, 3f800000, 3f800000]\n  \ntest_vmaddfp_3:\n  # v4 = 5, 5, 1, 1\n  # v5 = 5, 5, 1, 1\n  # v6 = 1, 1, 1, 1\n  #_ REGISTER_IN v4 [40a00000, 40a00000, 3f800000, 3f800000]\n  #_ REGISTER_IN v5 [40a00000, 40a00000, 3f800000, 3f800000]\n  #_ REGISTER_IN v6 [3f800000, 3f800000, 3f800000, 3f800000]\n  # 1.0, 1.5, 1.1, 1.9\n  vmaddfp v3, v4, v5, v6\n  blr\n  # v3 = 26.0, 26.0, 2.0, 2.0\n  #_ REGISTER_OUT v3 [41d00000, 41d00000, 40000000, 40000000]\n  #_ REGISTER_OUT v4 [40a00000, 40a00000, 3f800000, 3f800000]\n  #_ REGISTER_OUT v5 [40a00000, 40a00000, 3f800000, 3f800000]\n  #_ REGISTER_OUT v6 [3f800000, 3f800000, 3f800000, 3f800000]\n  "
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vmaxfp.s",
    "content": "test_vmaxfp_1:\n  # v3 = [10.0, -10.0, 15.0, -15.0]\n  # v4 = [-10.0, 20.0, -20.0, 30.0]\n  #_ REGISTER_IN v3 [41200000, C1200000, 41700000, C1700000]\n  #_ REGISTER_IN v4 [C1200000, 41A00000, C1A00000, 41F00000]\n  vmaxfp v0, v3, v4\n  blr\n  #_ REGISTER_OUT v0 [41200000, 41A00000, 41700000, 41F00000]\n  #_ REGISTER_OUT v3 [41200000, C1200000, 41700000, C1700000]\n  #_ REGISTER_OUT v4 [C1200000, 41A00000, C1A00000, 41F00000]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vmaxfp128.s",
    "content": "test_vmaxfp128_1:\n  # v3 = [10.0, -10.0, 15.0, -15.0]\n  # v4 = [-10.0, 20.0, -20.0, 30.0]\n  #_ REGISTER_IN v3 [41200000, C1200000, 41700000, C1700000]\n  #_ REGISTER_IN v4 [C1200000, 41A00000, C1A00000, 41F00000]\n  vmaxfp128 v0, v3, v4\n  blr\n  #_ REGISTER_OUT v0 [41200000, 41A00000, 41700000, 41F00000]\n  #_ REGISTER_OUT v3 [41200000, C1200000, 41700000, C1700000]\n  #_ REGISTER_OUT v4 [C1200000, 41A00000, C1A00000, 41F00000]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vmaxsh.s",
    "content": "test_vmaxsh_1:\n  #_ REGISTER_IN v3 [00000001, 00020003, 00040005, 80060007]\n  #_ REGISTER_IN v4 [00080009, 000A000B, 000C000D, 000E000F]\n  vmaxsh v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [00000001, 00020003, 00040005, 80060007]\n  #_ REGISTER_OUT v4 [00080009, 000A000B, 000C000D, 000E000F]\n  #_ REGISTER_OUT v5 [00080009, 000A000B, 000C000D, 000E000F]\n\ntest_vmaxsh_2:\n  #_ REGISTER_IN v3 [00000009, 0002000B, 0004000D, 0006000F]\n  #_ REGISTER_IN v4 [00080001, 000A0003, 000C0005, 000E0007]\n  vmaxsh v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [00000009, 0002000B, 0004000D, 0006000F]\n  #_ REGISTER_OUT v4 [00080001, 000A0003, 000C0005, 000E0007]\n  #_ REGISTER_OUT v5 [00080009, 000A000B, 000C000D, 000E000F]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vmaxuh.s",
    "content": "test_vmaxuh_1:\n  #_ REGISTER_IN v3 [00000001, 00020003, 00040005, 00060007]\n  #_ REGISTER_IN v4 [00080009, 000A000B, 000C000D, 800E000F]\n  vmaxuh v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [00000001, 00020003, 00040005, 00060007]\n  #_ REGISTER_OUT v4 [00080009, 000A000B, 000C000D, 800E000F]\n  #_ REGISTER_OUT v5 [00080009, 000A000B, 000C000D, 800E000F]\n\ntest_vmaxuh_2:\n  #_ REGISTER_IN v3 [00000009, 0002000B, 0004000D, 0006000F]\n  #_ REGISTER_IN v4 [00080001, 000A0003, 000C0005, 000E0007]\n  vmaxuh v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [00000009, 0002000B, 0004000D, 0006000F]\n  #_ REGISTER_OUT v4 [00080001, 000A0003, 000C0005, 000E0007]\n  #_ REGISTER_OUT v5 [00080009, 000A000B, 000C000D, 000E000F]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vminfp.s",
    "content": "test_vminfp_1:\n  # v3 = [10.0, -10.0, 15.0, -15.0]\n  # v4 = [-10.0, 20.0, -20.0, 30.0]\n  #_ REGISTER_IN v3 [41200000, C1200000, 41700000, C1700000]\n  #_ REGISTER_IN v4 [C1200000, 41A00000, C1A00000, 41F00000]\n  vminfp v0, v3, v4\n  blr\n  #_ REGISTER_OUT v0 [C1200000, C1200000, C1A00000, C1700000]\n  #_ REGISTER_OUT v3 [41200000, C1200000, 41700000, C1700000]\n  #_ REGISTER_OUT v4 [C1200000, 41A00000, C1A00000, 41F00000]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vminfp128.s",
    "content": "test_vminfp128_1:\n  # v3 = [10.0, -10.0, 15.0, -15.0]\n  # v4 = [-10.0, 20.0, -20.0, 30.0]\n  #_ REGISTER_IN v3 [41200000, C1200000, 41700000, C1700000]\n  #_ REGISTER_IN v4 [C1200000, 41A00000, C1A00000, 41F00000]\n  vminfp128 v0, v3, v4\n  blr\n  #_ REGISTER_OUT v0 [C1200000, C1200000, C1A00000, C1700000]\n  #_ REGISTER_OUT v3 [41200000, C1200000, 41700000, C1700000]\n  #_ REGISTER_OUT v4 [C1200000, 41A00000, C1A00000, 41F00000]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vminsh.s",
    "content": "test_vminsh_1:\n  #_ REGISTER_IN v3 [00000001, 00020003, 00040005, 00060007]\n  #_ REGISTER_IN v4 [00080009, 000A000B, 000C000D, 000E000F]\n  vminsh v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [00000001, 00020003, 00040005, 00060007]\n  #_ REGISTER_OUT v4 [00080009, 000A000B, 000C000D, 000E000F]\n  #_ REGISTER_OUT v5 [00000001, 00020003, 00040005, 00060007]\n\ntest_vminsh_2:\n  #_ REGISTER_IN v3 [00000009, 0002000B, 0004000D, 0006000F]\n  #_ REGISTER_IN v4 [00080001, 000A0003, 000C0005, 000E0007]\n  vminsh v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [00000009, 0002000B, 0004000D, 0006000F]\n  #_ REGISTER_OUT v4 [00080001, 000A0003, 000C0005, 000E0007]\n  #_ REGISTER_OUT v5 [00000001, 00020003, 00040005, 00060007]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vminuh.s",
    "content": "test_vminuh_1:\n  #_ REGISTER_IN v3 [00000001, 00020003, 00040005, 00060007]\n  #_ REGISTER_IN v4 [00080009, 000A000B, 000C000D, 000E000F]\n  vminuh v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [00000001, 00020003, 00040005, 00060007]\n  #_ REGISTER_OUT v4 [00080009, 000A000B, 000C000D, 000E000F]\n  #_ REGISTER_OUT v5 [00000001, 00020003, 00040005, 00060007]\n\ntest_vminuh_2:\n  #_ REGISTER_IN v3 [00000009, 0002000B, 0004000D, 0006000F]\n  #_ REGISTER_IN v4 [00080001, 000A0003, 000C0005, 000E0007]\n  vminuh v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [00000009, 0002000B, 0004000D, 0006000F]\n  #_ REGISTER_OUT v4 [00080001, 000A0003, 000C0005, 000E0007]\n  #_ REGISTER_OUT v5 [00000001, 00020003, 00040005, 00060007]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vmrghb.s",
    "content": "test_vmrghb_1:\n  #_ REGISTER_IN v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_IN v4 [10111213, 14151617, 18191A1B, 1C1D1E1F]\n  vmrghb v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_OUT v4 [10111213, 14151617, 18191A1B, 1C1D1E1F]\n  #_ REGISTER_OUT v5 [00100111, 02120313, 04140515, 06160717]\n\ntest_vmrghb_2:\n  #_ REGISTER_IN v3 [F0F1F2F3, F4F5F6F7, F8F9FAFB, FCFDFEFF]\n  #_ REGISTER_IN v4 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  vmrghb v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [F0F1F2F3, F4F5F6F7, F8F9FAFB, FCFDFEFF]\n  #_ REGISTER_OUT v4 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_OUT v5 [F000F101, F202F303, F404F505, F606F707]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vmrghh.s",
    "content": "test_vmrghh_1:\n  #_ REGISTER_IN v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_IN v4 [10111213, 14151617, 18191A1B, 1C1D1E1F]\n  vmrghh v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_OUT v4 [10111213, 14151617, 18191A1B, 1C1D1E1F]\n  #_ REGISTER_OUT v5 [00011011, 02031213, 04051415, 06071617]\n\ntest_vmrghh_2:\n  #_ REGISTER_IN v3 [00000001, 00020003, 00040005, 00060007]\n  #_ REGISTER_IN v4 [00080009, 000A000B, 000C000D, 000E000F]\n  vmrghh v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [00000001, 00020003, 00040005, 00060007]\n  #_ REGISTER_OUT v4 [00080009, 000A000B, 000C000D, 000E000F]\n  #_ REGISTER_OUT v5 [00000008, 00010009, 0002000A, 0003000B]\n\ntest_vmrghh_3:\n  #_ REGISTER_IN v3 [FFF8FFF9, FFFAFFFB, FFFCFFFD, FFFEFFFF]\n  #_ REGISTER_IN v4 [00000001, 00020003, 00040005, 00060007]\n  vmrghh v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [FFF8FFF9, FFFAFFFB, FFFCFFFD, FFFEFFFF]\n  #_ REGISTER_OUT v4 [00000001, 00020003, 00040005, 00060007]\n  #_ REGISTER_OUT v5 [FFF80000, FFF90001, FFFA0002, FFFB0003]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vmrghw.s",
    "content": "test_vmrghw_1:\n  #_ REGISTER_IN v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_IN v4 [10111213, 14151617, 18191A1B, 1C1D1E1F]\n  vmrghw v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_OUT v4 [10111213, 14151617, 18191A1B, 1C1D1E1F]\n  #_ REGISTER_OUT v5 [00010203, 10111213, 04050607, 14151617]\n\ntest_vmrghw_2:\n  #_ REGISTER_IN v3 [00000000, 00000001, 00000002, 00000003]\n  #_ REGISTER_IN v4 [00000004, 00000005, 00000006, 00000007]\n  vmrghw v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [00000000, 00000001, 00000002, 00000003]\n  #_ REGISTER_OUT v4 [00000004, 00000005, 00000006, 00000007]\n  #_ REGISTER_OUT v5 [00000000, 00000004, 00000001, 00000005]\n\ntest_vmrghw_3:\n  #_ REGISTER_IN v3 [C0800000, C0400000, C0000000, BF800000]\n  #_ REGISTER_IN v4 [00000000, 3F800000, 40000000, 40400000]\n  vmrghw v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [C0800000, C0400000, C0000000, BF800000]\n  #_ REGISTER_OUT v4 [00000000, 3F800000, 40000000, 40400000]\n  #_ REGISTER_OUT v5 [C0800000, 00000000, C0400000, 3F800000]\n\ntest_vmrghw_4:\n  #_ REGISTER_IN v3 [FFFFFFFC, FFFFFFFD, FFFFFFFE, FFFFFFFF]\n  #_ REGISTER_IN v4 [00000000, 00000001, 00000002, 00000003]\n  vmrghw v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [FFFFFFFC, FFFFFFFD, FFFFFFFE, FFFFFFFF]\n  #_ REGISTER_OUT v4 [00000000, 00000001, 00000002, 00000003]\n  #_ REGISTER_OUT v5 [FFFFFFFC, 00000000, FFFFFFFD, 00000001]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vmrglb.s",
    "content": "test_vmrglb_1:\n  #_ REGISTER_IN v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_IN v4 [10111213, 14151617, 18191A1B, 1C1D1E1F]\n  vmrglb v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_OUT v4 [10111213, 14151617, 18191A1B, 1C1D1E1F]\n  #_ REGISTER_OUT v5 [08180919, 0a1a0b1b, 0c1c0d1d, 0e1e0f1f]\n\ntest_vmrglb_2:\n  #_ REGISTER_IN v3 [F0F1F2F3, F4F5F6F7, F8F9FAFB, FCFDFEFF]\n  #_ REGISTER_IN v4 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  vmrglb v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [F0F1F2F3, F4F5F6F7, F8F9FAFB, FCFDFEFF]\n  #_ REGISTER_OUT v4 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_OUT v5 [F808F909, FA0AFB0B, FC0CFD0D, FE0EFF0F]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vmrglh.s",
    "content": "test_vmrglh_1:\n  #_ REGISTER_IN v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_IN v4 [10111213, 14151617, 18191A1B, 1C1D1E1F]\n  vmrglh v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_OUT v4 [10111213, 14151617, 18191A1B, 1C1D1E1F]\n  #_ REGISTER_OUT v5 [08091819, 0a0b1a1b, 0c0d1c1d, 0e0f1e1f]\n\ntest_vmrglh_2:\n  #_ REGISTER_IN v3 [00000001, 00020003, 00040005, 00060007]\n  #_ REGISTER_IN v4 [00080009, 000A000B, 000C000D, 000E000F]\n  vmrglh v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [00000001, 00020003, 00040005, 00060007]\n  #_ REGISTER_OUT v4 [00080009, 000A000B, 000C000D, 000E000F]\n  #_ REGISTER_OUT v5 [0004000C, 0005000D, 0006000E, 0007000F]\n\ntest_vmrglh_3:\n  #_ REGISTER_IN v3 [FFF8FFF9, FFFAFFFB, FFFCFFFD, FFFEFFFF]\n  #_ REGISTER_IN v4 [00000001, 00020003, 00040005, 00060007]\n  vmrglh v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [FFF8FFF9, FFFAFFFB, FFFCFFFD, FFFEFFFF]\n  #_ REGISTER_OUT v4 [00000001, 00020003, 00040005, 00060007]\n  #_ REGISTER_OUT v5 [FFFC0004, FFFD0005, FFFE0006, FFFF0007]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vmrglw.s",
    "content": "test_vmrglw_1:\n  #_ REGISTER_IN v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_IN v4 [10111213, 14151617, 18191A1B, 1C1D1E1F]\n  vmrglw v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_OUT v4 [10111213, 14151617, 18191A1B, 1C1D1E1F]\n  #_ REGISTER_OUT v5 [08090a0b, 18191a1b, 0c0d0e0f, 1c1d1e1f]\n\ntest_vmrglw_2:\n  #_ REGISTER_IN v3 [00000000, 00000001, 00000002, 00000003]\n  #_ REGISTER_IN v4 [00000004, 00000005, 00000006, 00000007]\n  vmrglw v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [00000000, 00000001, 00000002, 00000003]\n  #_ REGISTER_OUT v4 [00000004, 00000005, 00000006, 00000007]\n  #_ REGISTER_OUT v5 [00000002, 00000006, 00000003, 00000007]\n\ntest_vmrglw_3:\n  #_ REGISTER_IN v3 [C0800000, C0400000, C0000000, BF800000]\n  #_ REGISTER_IN v4 [00000000, 3F800000, 40000000, 40400000]\n  vmrglw v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [C0800000, C0400000, C0000000, BF800000]\n  #_ REGISTER_OUT v4 [00000000, 3F800000, 40000000, 40400000]\n  #_ REGISTER_OUT v5 [C0000000, 40000000, BF800000, 40400000]\n\ntest_vmrglw_4:\n  #_ REGISTER_IN v3 [FFFFFFFC, FFFFFFFD, FFFFFFFE, FFFFFFFF]\n  #_ REGISTER_IN v4 [00000000, 00000001, 00000002, 00000003]\n  vmrglw v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [FFFFFFFC, FFFFFFFD, FFFFFFFE, FFFFFFFF]\n  #_ REGISTER_OUT v4 [00000000, 00000001, 00000002, 00000003]\n  #_ REGISTER_OUT v5 [FFFFFFFE, 00000002, FFFFFFFF, 00000003]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vmsum3fp128.s",
    "content": "test_vmsum3fp128_1:\n  # v3 = [1.0,  1.5,  1.1, 0.0]\n  # v4 = [2.0, 3.75, 2.31, 0.0]\n  #_ REGISTER_IN v3 [3f800000, 3fc00000, 3f8ccccd, 01020304]\n  #_ REGISTER_IN v4 [40000000, 40700000, 4013d70a, 01020304]\n  vmsum3fp128 v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [3f800000, 3fc00000, 3f8ccccd, 01020304]\n  #_ REGISTER_OUT v4 [40000000, 40700000, 4013d70a, 01020304]\n  #_ REGISTER_OUT v5 [4122A7F0, 4122A7F0, 4122A7F0, 4122A7F0]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vmsum4fp128.s",
    "content": "test_vmsum4fp128_1:\n  #_ REGISTER_IN v3 [3f800000, 3fc00000, 3f8ccccd, 3ff33333]\n  #_ REGISTER_IN v4 [40000000, 40700000, 4013d70a, 40b051eb]\n  vmsum4fp128 v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [3f800000, 3fc00000, 3f8ccccd, 3ff33333]\n  #_ REGISTER_OUT v4 [40000000, 40700000, 4013d70a, 40b051eb]\n  #_ REGISTER_OUT v5 [41A5147B, 41A5147B, 41A5147B, 41A5147B]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vor.s",
    "content": "test_vor_1:\n  #_ REGISTER_IN v3 [FFFF0101, 7070FFFF, FFFFFFFF, 00000000]\n  #_ REGISTER_IN v4 [80081010, 808F0000, 00000000, 8FFFFFFF]\n  vor v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [FFFF0101, 7070FFFF, FFFFFFFF, 00000000]\n  #_ REGISTER_OUT v4 [80081010, 808F0000, 00000000, 8FFFFFFF]\n  #_ REGISTER_OUT v5 [FFFF1111, F0FFFFFF, FFFFFFFF, 8FFFFFFF]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vor128.s",
    "content": "test_vor128_1:\n  #_ REGISTER_IN v3 [FFFF0101, 7070FFFF, FFFFFFFF, 00000000]\n  #_ REGISTER_IN v4 [80081010, 808F0000, 00000000, 8FFFFFFF]\n  vor128 v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [FFFF0101, 7070FFFF, FFFFFFFF, 00000000]\n  #_ REGISTER_OUT v4 [80081010, 808F0000, 00000000, 8FFFFFFF]\n  #_ REGISTER_OUT v5 [FFFF1111, F0FFFFFF, FFFFFFFF, 8FFFFFFF]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vperm.s",
    "content": "test_vperm_1:\n  #_ REGISTER_IN v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_IN v4 [10111213, 14151617, 18191A1B, 1C1D1E1F]\n  #_ REGISTER_IN v5 [00000000, 00000000, 00000000, 00000000]\n  vperm v6, v3, v4, v5\n  blr\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_OUT v4 [10111213, 14151617, 18191A1B, 1C1D1E1F]\n  #_ REGISTER_OUT v5 [00000000, 00000000, 00000000, 00000000]\n  #_ REGISTER_OUT v6 [00000000, 00000000, 00000000, 00000000]\n\ntest_vperm_2:\n  #_ REGISTER_IN v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_IN v4 [10111213, 14151617, 18191A1B, 1C1D1E1F]\n  #_ REGISTER_IN v5 [01010101, 01010101, 01010101, 01010101]\n  vperm v6, v3, v4, v5\n  blr\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_OUT v4 [10111213, 14151617, 18191A1B, 1C1D1E1F]\n  #_ REGISTER_OUT v5 [01010101, 01010101, 01010101, 01010101]\n  #_ REGISTER_OUT v6 [01010101, 01010101, 01010101, 01010101]\n\ntest_vperm_3:\n  #_ REGISTER_IN v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_IN v4 [10111213, 14151617, 18191A1B, 1C1D1E1F]\n  #_ REGISTER_IN v5 [11111111, 11111111, 11111111, 11111111]\n  vperm v6, v3, v4, v5\n  blr\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_OUT v4 [10111213, 14151617, 18191A1B, 1C1D1E1F]\n  #_ REGISTER_OUT v5 [11111111, 11111111, 11111111, 11111111]\n  #_ REGISTER_OUT v6 [11111111, 11111111, 11111111, 11111111]\n\ntest_vperm_4:\n  # try with > 32b values (should mod)\n  #_ REGISTER_IN v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_IN v4 [10111213, 14151617, 18191A1B, 1C1D1E1F]\n  #_ REGISTER_IN v5 [21212121, 21212121, 21212121, 21212121]\n  vperm v6, v3, v4, v5\n  blr\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_OUT v4 [10111213, 14151617, 18191A1B, 1C1D1E1F]\n  #_ REGISTER_OUT v5 [21212121, 21212121, 21212121, 21212121]\n  #_ REGISTER_OUT v6 [01010101, 01010101, 01010101, 01010101]\n\ntest_vperm_5:\n  #_ REGISTER_IN v4 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_IN v5 [10111213, 14151617, 18191A1B, 1C1D1E1F]\n  #_ REGISTER_IN v6 [01020003, 14150001, 1F1C1D1E, 00141518]\n  vperm v3, v4, v5, v6\n  blr\n  #_ REGISTER_OUT v3 [01020003, 14150001, 1F1C1D1E, 00141518]\n  #_ REGISTER_OUT v4 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_OUT v5 [10111213, 14151617, 18191A1B, 1C1D1E1F]\n  #_ REGISTER_OUT v6 [01020003, 14150001, 1F1C1D1E, 00141518]\n  "
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vpermwi128.s",
    "content": "test_vpermwi128_1:\n  #_ REGISTER_IN v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  # to 0,1,2,3\n  # vpermwi128 v4, v3, 0x1B\n  .long 0x189B1A10\n  blr\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_OUT v4 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n\ntest_vpermwi128_2:\n  #_ REGISTER_IN v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  # to 3,2,1,0\n  # vpermwi128 v4, v3, 0xE4\n  .long 0x18841BD0\n  blr\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_OUT v4 [0C0D0E0F, 08090A0B, 04050607, 00010203]\n\ntest_vpermwi128_3:\n  #_ REGISTER_IN v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  # to 0,0,0,0\n  # vpermwi128 v4, v3, 0\n  .long 0x18801A10\n  blr\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_OUT v4 [00010203, 00010203, 00010203, 00010203]\n\ntest_vpermwi128_4:\n  #_ REGISTER_IN v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  # to 3,3,3,3\n  # vpermwi128 v4, v3, 0xFF\n  .long 0x189F1BD0\n  blr\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_OUT v4 [0C0D0E0F, 0C0D0E0F, 0C0D0E0F, 0C0D0E0F]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vpkd3d128.s",
    "content": "# vpkd3d128 dest, src, type, mask, shift\n# type:\n#   0 = PACK_TYPE_D3DCOLOR\n#   1 = PACK_TYPE_SHORT_2\n#   2 = PACK_TYPE_2_10_10_10\n#   3 = PACK_TYPE_FLOAT16_2\n#   4 = PACK_TYPE_SHORT_4\n#   5 = PACK_TYPE_FLOAT16_4\n# mask:\n#   must not be zero\n#   1 = 00000000 00000000 00000000 FFFFFFFF\n#   2 = 00000000 00000000 FFFFFFFF FFFFFFFF\n#   3 = same as 2? except mask3/shift3\n# shift:\n#   0 = no shift\n#   1 = shift left by one word\n#   2 ...\n#   3 ...\n# special case: mask3/shift3 = 00000000 00000000 00000000 FFFFFFFF\n\n# vpkd3d128 is broken in binutils, so these are hand coded\n\ntest_vpkd3d128_d3dcolor_invalid_0:\n  #_ REGISTER_IN v3 [00000001, 00000002, 00000003, 00000004]\n  #_ REGISTER_IN v4 [CDCDCDCD, CDCDCDCD, CDCDCDCD, CDCDCDCD]\n  # vpkd3d128 v4, v3, 0, 1, 0\n  .long 0x18811E10\n  blr\n  #_ REGISTER_OUT v3 [00000001, 00000002, 00000003, 00000004]\n  #_ REGISTER_OUT v4 [CDCDCDCD, CDCDCDCD, CDCDCDCD, 00000000]\ntest_vpkd3d128_d3dcolor_invalid_1:\n  #_ REGISTER_IN v3 [40800000, 40000000, C2F60000, 4B3BDF83]\n  #_ REGISTER_IN v4 [CDCDCDCD, CDCDCDCD, CDCDCDCD, CDCDCDCD]\n  # vpkd3d128 v4, v3, 0, 1, 0\n  .long 0x18811E10\n  blr\n  #_ REGISTER_OUT v3 [40800000, 40000000, C2F60000, 4B3BDF83]\n  #_ REGISTER_OUT v4 [CDCDCDCD, CDCDCDCD, CDCDCDCD, FFFF0000]\ntest_vpkd3d128_d3dcolor_invalid_2:\n  #_ REGISTER_IN v3 [40800000, 40000000, C2F60000, FFFFFFFF]\n  #_ REGISTER_IN v4 [CDCDCDCD, CDCDCDCD, CDCDCDCD, CDCDCDCD]\n  # vpkd3d128 v4, v3, 0, 1, 0\n  .long 0x18811E10\n  blr\n  #_ REGISTER_OUT v3 [40800000, 40000000, C2F60000, FFFFFFFF]\n  #_ REGISTER_OUT v4 [CDCDCDCD, CDCDCDCD, CDCDCDCD, 00FF0000]\n\ntest_vpkd3d128_d3dcolor_1_0:\n  #_ REGISTER_IN v3 [40400001, 40400002, 40400003, 40400004]\n  #_ REGISTER_IN v4 [CDCDCDCD, CDCDCDCD, CDCDCDCD, CDCDCDCD]\n  # vpkd3d128 v4, v3, 0, 1, 0\n  .long 0x18811E10\n  blr\n  #_ REGISTER_OUT v3 [40400001, 40400002, 40400003, 40400004]\n  #_ REGISTER_OUT v4 [CDCDCDCD, CDCDCDCD, CDCDCDCD, 04010203]\ntest_vpkd3d128_d3dcolor_1_1:\n  #_ REGISTER_IN v3 [40400001, 40400002, 40400003, 40400004]\n  #_ REGISTER_IN v4 [CDCDCDCD, CDCDCDCD, CDCDCDCD, CDCDCDCD]\n  # vpkd3d128 v4, v3, 0, 1, 1\n  .long 0x18811E50\n  blr\n  #_ REGISTER_OUT v3 [40400001, 40400002, 40400003, 40400004]\n  #_ REGISTER_OUT v4 [CDCDCDCD, CDCDCDCD, 04010203, CDCDCDCD]\ntest_vpkd3d128_d3dcolor_1_2:\n  #_ REGISTER_IN v3 [40400001, 40400002, 40400003, 40400004]\n  #_ REGISTER_IN v4 [CDCDCDCD, CDCDCDCD, CDCDCDCD, CDCDCDCD]\n  # vpkd3d128 v4, v3, 0, 1, 2\n  .long 0x18811E90\n  blr\n  #_ REGISTER_OUT v3 [40400001, 40400002, 40400003, 40400004]\n  #_ REGISTER_OUT v4 [CDCDCDCD, 04010203, CDCDCDCD, CDCDCDCD]\ntest_vpkd3d128_d3dcolor_1_3:\n  #_ REGISTER_IN v3 [40400001, 40400002, 40400003, 40400004]\n  #_ REGISTER_IN v4 [CDCDCDCD, CDCDCDCD, CDCDCDCD, CDCDCDCD]\n  # vpkd3d128 v4, v3, 0, 1, 3\n  .long 0x18811ED0\n  blr\n  #_ REGISTER_OUT v3 [40400001, 40400002, 40400003, 40400004]\n  #_ REGISTER_OUT v4 [04010203, CDCDCDCD, CDCDCDCD, CDCDCDCD]\n\ntest_vpkd3d128_d3dcolor_2_0:\n  #_ REGISTER_IN v3 [40400001, 40400002, 40400003, 40400004]\n  #_ REGISTER_IN v4 [CDCDCDCD, CDCDCDCD, CDCDCDCD, CDCDCDCD]\n  # vpkd3d128 v4, v3, 0, 2, 0\n  .long 0x18821E10\n  blr\n  #_ REGISTER_OUT v3 [40400001, 40400002, 40400003, 40400004]\n  #_ REGISTER_OUT v4 [CDCDCDCD, CDCDCDCD, 00000000, 04010203]\ntest_vpkd3d128_d3dcolor_2_1:\n  #_ REGISTER_IN v3 [40400001, 40400002, 40400003, 40400004]\n  #_ REGISTER_IN v4 [CDCDCDCD, CDCDCDCD, CDCDCDCD, CDCDCDCD]\n  # vpkd3d128 v4, v3, 0, 2, 1\n  .long 0x18821E50\n  blr\n  #_ REGISTER_OUT v3 [40400001, 40400002, 40400003, 40400004]\n  #_ REGISTER_OUT v4 [CDCDCDCD, 00000000, 04010203, CDCDCDCD]\ntest_vpkd3d128_d3dcolor_2_2:\n  #_ REGISTER_IN v3 [40400001, 40400002, 40400003, 40400004]\n  #_ REGISTER_IN v4 [CDCDCDCD, CDCDCDCD, CDCDCDCD, CDCDCDCD]\n  # vpkd3d128 v4, v3, 0, 2, 2\n  .long 0x18821E90\n  blr\n  #_ REGISTER_OUT v3 [40400001, 40400002, 40400003, 40400004]\n  #_ REGISTER_OUT v4 [00000000, 04010203, CDCDCDCD, CDCDCDCD]\ntest_vpkd3d128_d3dcolor_2_3:\n  #_ REGISTER_IN v3 [40400001, 40400002, 40400003, 40400004]\n  #_ REGISTER_IN v4 [CDCDCDCD, CDCDCDCD, CDCDCDCD, CDCDCDCD]\n  # vpkd3d128 v4, v3, 0, 2, 3\n  .long 0x18821ED0\n  blr\n  #_ REGISTER_OUT v3 [40400001, 40400002, 40400003, 40400004]\n  #_ REGISTER_OUT v4 [04010203, CDCDCDCD, CDCDCDCD, CDCDCDCD]\n\ntest_vpkd3d128_d3dcolor_3_0:\n  #_ REGISTER_IN v3 [40400001, 40400002, 40400003, 40400004]\n  #_ REGISTER_IN v4 [CDCDCDCD, CDCDCDCD, CDCDCDCD, CDCDCDCD]\n  # vpkd3d128 v4, v3, 0, 3, 0\n  .long 0x18831E10\n  blr\n  #_ REGISTER_OUT v3 [40400001, 40400002, 40400003, 40400004]\n  #_ REGISTER_OUT v4 [CDCDCDCD, CDCDCDCD, 00000000, 04010203]\ntest_vpkd3d128_d3dcolor_3_1:\n  #_ REGISTER_IN v3 [40400001, 40400002, 40400003, 40400004]\n  #_ REGISTER_IN v4 [CDCDCDCD, CDCDCDCD, CDCDCDCD, CDCDCDCD]\n  # vpkd3d128 v4, v3, 0, 3, 1\n  .long 0x18831E50\n  blr\n  #_ REGISTER_OUT v3 [40400001, 40400002, 40400003, 40400004]\n  #_ REGISTER_OUT v4 [CDCDCDCD, 00000000, 04010203, CDCDCDCD]\ntest_vpkd3d128_d3dcolor_3_2:\n  #_ REGISTER_IN v3 [40400001, 40400002, 40400003, 40400004]\n  #_ REGISTER_IN v4 [CDCDCDCD, CDCDCDCD, CDCDCDCD, CDCDCDCD]\n  # vpkd3d128 v4, v3, 0, 3, 2\n  .long 0x18831E90\n  blr\n  #_ REGISTER_OUT v3 [40400001, 40400002, 40400003, 40400004]\n  #_ REGISTER_OUT v4 [00000000, 04010203, CDCDCDCD, CDCDCDCD]\ntest_vpkd3d128_d3dcolor_3_3:\n  #_ REGISTER_IN v3 [40400001, 40400002, 40400003, 40400004]\n  #_ REGISTER_IN v4 [CDCDCDCD, CDCDCDCD, CDCDCDCD, CDCDCDCD]\n  # vpkd3d128 v4, v3, 0, 3, 3\n  .long 0x18831ED0\n  blr\n  #_ REGISTER_OUT v3 [40400001, 40400002, 40400003, 40400004]\n  #_ REGISTER_OUT v4 [CDCDCDCD, CDCDCDCD, CDCDCDCD, 00000000]\n\n\ntest_vpkd3d128_short2_invalid_0:\n  #_ REGISTER_IN v3 [43817E00, C37CFC00, 42A23EC8, 403DB757]\n  #_ REGISTER_IN v4 [CDCDCDCD, CDCDCDCD, CDCDCDCD, CDCDCDCD]\n  # vpkd3d128 v4, v3, 1, 1, 0\n  .long 0x18851E10\n  blr\n  #_ REGISTER_OUT v3 [43817E00, C37CFC00, 42A23EC8, 403DB757]\n  #_ REGISTER_OUT v4 [CDCDCDCD, CDCDCDCD, CDCDCDCD, 7FFF8001]\ntest_vpkd3d128_short2_invalid_1:\n  #_ REGISTER_IN v3 [412FDF00, C09FBE00, 42A23EC8, 403DB757]\n  #_ REGISTER_IN v4 [CDCDCDCD, CDCDCDCD, CDCDCDCD, CDCDCDCD]\n  # vpkd3d128 v4, v3, 1, 1, 0\n  .long 0x18851E10\n  blr\n  #_ REGISTER_OUT v3 [412FDF00, C09FBE00, 42A23EC8, 403DB757]\n  #_ REGISTER_OUT v4 [CDCDCDCD, CDCDCDCD, CDCDCDCD, 7FFF8001]\n\ntest_vpkd3d128_short2_0:\n  #_ REGISTER_IN v3 [40407FFF, 403F8001, 00000000, 00000000]\n  #_ REGISTER_IN v4 [CDCDCDCD, CDCDCDCD, CDCDCDCD, CDCDCDCD]\n  # vpkd3d128 v4, v3, 1, 1, 0\n  .long 0x18851E10\n  blr\n  #_ REGISTER_OUT v3 [40407FFF, 403F8001, 00000000, 00000000]\n  #_ REGISTER_OUT v4 [CDCDCDCD, CDCDCDCD, CDCDCDCD, 7FFF8001]\ntest_vpkd3d128_short2_1:\n  #_ REGISTER_IN v3 [40404000, 403FC000, 40400003, 403F8001]\n  #_ REGISTER_IN v4 [CDCDCDCD, CDCDCDCD, CDCDCDCD, CDCDCDCD]\n  # vpkd3d128 v4, v3, 1, 1, 0\n  .long 0x18851E10\n  blr\n  #_ REGISTER_OUT v3 [40404000, 403FC000, 40400003, 403F8001]\n  #_ REGISTER_OUT v4 [CDCDCDCD, CDCDCDCD, CDCDCDCD, 4000C000]\ntest_vpkd3d128_short2_2:\n  #_ REGISTER_IN v3 [4040FFFE, 403FF333, 42A23EC8, 403DB757]\n  #_ REGISTER_IN v4 [CDCDCDCD, CDCDCDCD, CDCDCDCD, CDCDCDCD]\n  # vpkd3d128 v4, v3, 1, 1, 0\n  .long 0x18851E10\n  blr\n  #_ REGISTER_OUT v3 [4040FFFE, 403FF333, 42A23EC8, 403DB757]\n  #_ REGISTER_OUT v4 [CDCDCDCD, CDCDCDCD, CDCDCDCD, 7FFFF333]\n\ntest_vpkd3d128_short4_0:\n  # v3 = [1.5, -1.5, 1.5, -1.5]\n  #_ REGISTER_IN v3 [403F8001, 403FFFF8, 4040007F, 40400000]\n  #_ REGISTER_IN v4 [CDCDCDCD, CDCDCDCD, CDCDCDCD, CDCDCDCD]\n  # vpkd3d128 v4, v3, 4, 2, 0\n  .long 0x18921E10\n  blr\n  #_ REGISTER_OUT v3 [403F8001, 403FFFF8, 4040007F, 40400000]\n  #_ REGISTER_OUT v4 [CDCDCDCD, CDCDCDCD, 8001FFF8, 007F0000]\n\ntest_vpkd3d128_uint_2101010_0:\n  #_ REGISTER_IN v3 [B8FF8000, B8FF8000, C04001FF, 4E9A5A5A]\n  #_ REGISTER_IN v4 [CDCDCDCD, CDCDCDCD, CDCDCDCD, CDCDCDCD]\n  # vpkd3d128 v4, v3, 2, 1, 0\n  .long 0x18891E10\n  blr\n  #_ REGISTER_OUT v3 [B8FF8000, B8FF8000, C04001FF, 4E9A5A5A]\n  #_ REGISTER_OUT v4 [CDCDCDCD, CDCDCDCD, CDCDCDCD, E0180601]\ntest_vpkd3d128_uint_2101010_1:\n  #_ REGISTER_IN v3 [42C80000, C2C80000, 40400000, 3F800000]\n  #_ REGISTER_IN v4 [CDCDCDCD, CDCDCDCD, CDCDCDCD, CDCDCDCD]\n  # vpkd3d128 v4, v3, 2, 1, 0\n  .long 0x18891E10\n  blr\n  #_ REGISTER_OUT v3 [42C80000, C2C80000, 40400000, 3F800000]\n  #_ REGISTER_OUT v4 [CDCDCDCD, CDCDCDCD, CDCDCDCD, 000805FF]\ntest_vpkd3d128_uint_2101010_2:\n  #_ REGISTER_IN v3 [3F000000, BF000000, 3F800000, 00000000]\n  #_ REGISTER_IN v4 [CDCDCDCD, CDCDCDCD, CDCDCDCD, CDCDCDCD]\n  # vpkd3d128 v4, v3, 2, 1, 0\n  .long 0x18891E10\n  blr\n  #_ REGISTER_OUT v3 [3F000000, BF000000, 3F800000, 00000000]\n  #_ REGISTER_OUT v4 [CDCDCDCD, CDCDCDCD, CDCDCDCD, 20180601]\n\n\ntest_vpkd3d128_float16_2_invalid_0:\n  #_ REGISTER_IN v3 [3FC00000, BFC00000, 42A23EC8, 403DB757]\n  #_ REGISTER_IN v4 [CDCDCDCD, CDCDCDCD, CDCDCDCD, CDCDCDCD]\n  # vpkd3d128 v4, v3, 3, 1, 0\n  .long 0x188D1E10\n  blr\n  #_ REGISTER_OUT v3 [3FC00000, BFC00000, 42A23EC8, 403DB757]\n  #_ REGISTER_OUT v4 [CDCDCDCD, CDCDCDCD, CDCDCDCD, 3E00BE00]\ntest_vpkd3d128_float16_2_0:\n  #_ REGISTER_IN v3 [3F000000, BF000000, 00000000, 00000000]\n  #_ REGISTER_IN v4 [CDCDCDCD, CDCDCDCD, CDCDCDCD, CDCDCDCD]\n  # vpkd3d128 v4, v3, 3, 1, 0\n  .long 0x188D1E10\n  blr\n  #_ REGISTER_OUT v3 [3F000000, BF000000, 00000000, 00000000]\n  #_ REGISTER_OUT v4 [CDCDCDCD, CDCDCDCD, CDCDCDCD, 3800B800]\n\ntest_vpkd3d128_float16_4_invalid_0:\n  #_ REGISTER_IN v3 [3FC00000, BFC00000, 3FC00000, BFC00000]\n  #_ REGISTER_IN v4 [CDCDCDCD, CDCDCDCD, CDCDCDCD, CDCDCDCD]\n  # vpkd3d128 v4, v3, 5, 2, 0\n  .long 0x18961E10\n  blr\n  #_ REGISTER_OUT v3 [3FC00000, BFC00000, 3FC00000, BFC00000]\n  #_ REGISTER_OUT v4 [CDCDCDCD, CDCDCDCD, 3E00BE00, 3E00BE00]\ntest_vpkd3d128_float16_4_0:\n  #_ REGISTER_IN v3 [3F000000, BF000000, 3F800000, BF800000]\n  #_ REGISTER_IN v4 [CDCDCDCD, CDCDCDCD, CDCDCDCD, CDCDCDCD]\n  # vpkd3d128 v4, v3, 5, 2, 0\n  .long 0x18961E10\n  blr\n  #_ REGISTER_OUT v3 [3F000000, BF000000, 3F800000, BF800000]\n  #_ REGISTER_OUT v4 [CDCDCDCD, CDCDCDCD, 3800B800, 3C00BC00]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vpkpx.s",
    "content": "#vpkpx isn't implemented yet\n#test_vpkpx_1:\n#  #_ REGISTER_IN v3 [00101820, 01283038, 00404850, 01586068]\n#  #_ REGISTER_IN v4 [01707880, 00889098, 01A0A8B0, 00B8C0C8]\n#  vpkpx v5, v3, v4\n#  blr\n#  #_ REGISTER_OUT v3 [00101820, 01283038, 00404850, 01586068]\n#  #_ REGISTER_OUT v4 [01707880, 00889098, 01A0A8B0, 00B8C0C8]\n#  #_ REGISTER_OUT v5 [086494C7, 212AAD8D, B9F04653, D2B65F19]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vpkshss.s",
    "content": "test_vpkshss_1:\n  #_ REGISTER_IN v3 [00000001, 00020003, 00040005, 00060007]\n  #_ REGISTER_IN v4 [00080009, 000A000B, 000C000D, 000E000F]\n  vpkshss v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [00000001, 00020003, 00040005, 00060007]\n  #_ REGISTER_OUT v4 [00080009, 000A000B, 000C000D, 000E000F]\n  #_ REGISTER_OUT v5 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n\ntest_vpkshss_2:\n  #_ REGISTER_IN v3 [7FFF8000, 00020003, 00040005, 00060007]\n  #_ REGISTER_IN v4 [7FFF8000, 000A000B, 000C000D, 000E000F]\n  vpkshss v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [7FFF8000, 00020003, 00040005, 00060007]\n  #_ REGISTER_OUT v4 [7FFF8000, 000A000B, 000C000D, 000E000F]\n  #_ REGISTER_OUT v5 [7F800203, 04050607, 7F800A0B, 0C0D0E0F]\n\ntest_vpkshss_3:\n  # {-1, -128, 0, 127, -2, -129, 1, 128}\n  #_ REGISTER_IN v3 [FFFFFF80, 0000007F, FFFEFF7F, 00010080]\n  # {-3, -130, 2, 129, -4, -131, 3, 130}\n  #_ REGISTER_IN v4 [FFFDFF7E, 00020081, FFFCFF7D, 00030082]\n  vpkshss v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [FFFFFF80, 0000007F, FFFEFF7F, 00010080]\n  #_ REGISTER_OUT v4 [FFFDFF7E, 00020081, FFFCFF7D, 00030082]\n  # {-1, -128, 0, 127, -2, -128, 1, 127,\n  #  -3, -128, 2, 127, -4, -128, 3, 127}\n  #_ REGISTER_OUT v5 [FF80007F, FE80017F, FD80027F, FC80037F]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vpkshss128.s",
    "content": "test_vpkshss128_1:\n  #_ REGISTER_IN v3 [00000001, 00020003, 00040005, 00060007]\n  #_ REGISTER_IN v4 [00080009, 000A000B, 000C000D, 000E000F]\n  vpkshss128 v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [00000001, 00020003, 00040005, 00060007]\n  #_ REGISTER_OUT v4 [00080009, 000A000B, 000C000D, 000E000F]\n  #_ REGISTER_OUT v5 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n\ntest_vpkshss128_2:\n  #_ REGISTER_IN v3 [7FFF8000, 00020003, 00040005, 00060007]\n  #_ REGISTER_IN v4 [7FFF8000, 000A000B, 000C000D, 000E000F]\n  vpkshss128 v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [7FFF8000, 00020003, 00040005, 00060007]\n  #_ REGISTER_OUT v4 [7FFF8000, 000A000B, 000C000D, 000E000F]\n  #_ REGISTER_OUT v5 [7F800203, 04050607, 7F800A0B, 0C0D0E0F]\n\ntest_vpkshss128_3:\n  # {-1, -128, 0, 127, -2, -129, 1, 128}\n  #_ REGISTER_IN v3 [FFFFFF80, 0000007F, FFFEFF7F, 00010080]\n  # {-3, -130, 2, 129, -4, -131, 3, 130}\n  #_ REGISTER_IN v4 [FFFDFF7E, 00020081, FFFCFF7D, 00030082]\n  vpkshss128 v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [FFFFFF80, 0000007F, FFFEFF7F, 00010080]\n  #_ REGISTER_OUT v4 [FFFDFF7E, 00020081, FFFCFF7D, 00030082]\n  # {-1, -128, 0, 127, -2, -128, 1, 127,\n  #  -3, -128, 2, 127, -4, -128, 3, 127}\n  #_ REGISTER_OUT v5 [FF80007F, FE80017F, FD80027F, FC80037F]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vpkshus.s",
    "content": "test_vpkshus_1:\n  # {-1, -128, 0, 127, -2, -129, 1, 128}\n  #_ REGISTER_IN v3 [FFFFFF80, 0000007F, FFFEFF7F, 00010080]\n  # {-3, -130, 2, 129, -4, -131, 3, 130}\n  #_ REGISTER_IN v4 [FFFDFF7E, 00020081, FFFCFF7D, 00030082]\n  vpkshus v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [FFFFFF80, 0000007F, FFFEFF7F, 00010080]\n  #_ REGISTER_OUT v4 [FFFDFF7E, 00020081, FFFCFF7D, 00030082]\n  # {0, 0, 0, 127, 0, 0, 1, 128, 0, 0, 2, 129, 0, 0, 3, 130}\n  #_ REGISTER_OUT v5 [0000007F, 00000180, 00000281, 00000382]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vpkshus128.s",
    "content": "test_vpkshus128_1:\n  # {-1, -128, 0, 127, -2, -129, 1, 128}\n  #_ REGISTER_IN v3 [FFFFFF80, 0000007F, FFFEFF7F, 00010080]\n  # {-3, -130, 2, 129, -4, -131, 3, 130}\n  #_ REGISTER_IN v4 [FFFDFF7E, 00020081, FFFCFF7D, 00030082]\n  vpkshus128 v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [FFFFFF80, 0000007F, FFFEFF7F, 00010080]\n  #_ REGISTER_OUT v4 [FFFDFF7E, 00020081, FFFCFF7D, 00030082]\n  # {0, 0, 0, 127, 0, 0, 1, 128, 0, 0, 2, 129, 0, 0, 3, 130}\n  #_ REGISTER_OUT v5 [0000007F, 00000180, 00000281, 00000382]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vpkswss.s",
    "content": "test_vpkswss_1:\n  #_ REGISTER_IN v3 [00000001, 00000002, 00000003, 00000004]\n  #_ REGISTER_IN v4 [00000005, 00000006, 00000007, 00000008]\n  vpkswss v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [00000001, 00000002, 00000003, 00000004]\n  #_ REGISTER_OUT v4 [00000005, 00000006, 00000007, 00000008]\n  #_ REGISTER_OUT v5 [00010002, 00030004, 00050006, 00070008]\n\ntest_vpkswss_2:\n  #_ REGISTER_IN v3 [7FFFFFFF, 80000000, 00000000, 00000004]\n  #_ REGISTER_IN v4 [7FFFFFFF, 80000000, 00000000, 00000008]\n  vpkswss v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [7FFFFFFF, 80000000, 00000000, 00000004]\n  #_ REGISTER_OUT v4 [7FFFFFFF, 80000000, 00000000, 00000008]\n  #_ REGISTER_OUT v5 [7FFF8000, 00000004, 7FFF8000, 00000008]\n\ntest_vpkswss_3:\n  # {-1, -32768, 0, 32767}\n  #_ REGISTER_IN v3 [FFFFFFFF, FFFF8000, 00000000, 00007FFF]\n  # {-2, -32769, 1, 32768}\n  #_ REGISTER_IN v4 [FFFFFFFE, FFFF7FFF, 00000001, 00008000]\n  vpkswss v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [FFFFFFFF, FFFF8000, 00000000, 00007FFF]\n  #_ REGISTER_OUT v4 [FFFFFFFE, FFFF7FFF, 00000001, 00008000]\n  # {-1, -32768, 0, 32767, -2, -32768, 1, 32767}\n  #_ REGISTER_OUT v5 [FFFF8000, 00007FFF, FFFE8000, 00017FFF]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vpkswss128.s",
    "content": "test_vpkswss128_1:\n  #_ REGISTER_IN v3 [00000001, 00000002, 00000003, 00000004]\n  #_ REGISTER_IN v4 [00000005, 00000006, 00000007, 00000008]\n  vpkswss128 v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [00000001, 00000002, 00000003, 00000004]\n  #_ REGISTER_OUT v4 [00000005, 00000006, 00000007, 00000008]\n  #_ REGISTER_OUT v5 [00010002, 00030004, 00050006, 00070008]\n\ntest_vpkswss128_2:\n  #_ REGISTER_IN v3 [7FFFFFFF, 80000000, 00000000, 00000004]\n  #_ REGISTER_IN v4 [7FFFFFFF, 80000000, 00000000, 00000008]\n  vpkswss128 v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [7FFFFFFF, 80000000, 00000000, 00000004]\n  #_ REGISTER_OUT v4 [7FFFFFFF, 80000000, 00000000, 00000008]\n  #_ REGISTER_OUT v5 [7FFF8000, 00000004, 7FFF8000, 00000008]\n\ntest_vpkswss128_3:\n  # {-1, -32768, 0, 32767}\n  #_ REGISTER_IN v3 [FFFFFFFF, FFFF8000, 00000000, 00007FFF]\n  # {-2, -32769, 1, 32768}\n  #_ REGISTER_IN v4 [FFFFFFFE, FFFF7FFF, 00000001, 00008000]\n  vpkswss128 v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [FFFFFFFF, FFFF8000, 00000000, 00007FFF]\n  #_ REGISTER_OUT v4 [FFFFFFFE, FFFF7FFF, 00000001, 00008000]\n  # {-1, -32768, 0, 32767, -2, -32768, 1, 32767}\n  #_ REGISTER_OUT v5 [FFFF8000, 00007FFF, FFFE8000, 00017FFF]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vpkswus.s",
    "content": "test_vpkswus_1:\n  # {-1, -32768, 0, 32767}\n  #_ REGISTER_IN v3 [FFFFFFFF, FFFF8000, 00000000, 00007FFF]\n  # {-2, -32769, 1, 32768}\n  #_ REGISTER_IN v4 [FFFFFFFE, FFFF7FFF, 00000001, 00008000]\n  vpkswus v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [FFFFFFFF, FFFF8000, 00000000, 00007FFF]\n  #_ REGISTER_OUT v4 [FFFFFFFE, FFFF7FFF, 00000001, 00008000]\n  # {0, 0, 0, 32767, 0, 0, 1, 32768}\n  #_ REGISTER_OUT v5 [00000000, 00007FFF, 00000000, 00018000]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vpkswus128.s",
    "content": "test_vpkswus128_1:\n  # {-1, -32768, 0, 32767}\n  #_ REGISTER_IN v3 [FFFFFFFF, FFFF8000, 00000000, 00007FFF]\n  # {-2, -32769, 1, 32768}\n  #_ REGISTER_IN v4 [FFFFFFFE, FFFF7FFF, 00000001, 00008000]\n  vpkswus128 v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [FFFFFFFF, FFFF8000, 00000000, 00007FFF]\n  #_ REGISTER_OUT v4 [FFFFFFFE, FFFF7FFF, 00000001, 00008000]\n  # {0, 0, 0, 32767, 0, 0, 1, 32768}\n  #_ REGISTER_OUT v5 [00000000, 00007FFF, 00000000, 00018000]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vpkuhum.s",
    "content": "test_vpkuhum_1:\n  # {0, 1, 2, 3, 4, 5, 6, 7}\n  #_ REGISTER_IN v3 [00000001, 00020003, 00040005, 00060007]\n  # {8, 9, 10, 11, 12, 13, 14, 15}\n  #_ REGISTER_IN v4 [00080009, 000A000B, 000C000D, 000E000F]\n  vpkuhum v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [00000001, 00020003, 00040005, 00060007]\n  #_ REGISTER_OUT v4 [00080009, 000A000B, 000C000D, 000E000F]\n  # {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}\n  #_ REGISTER_OUT v5 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  blr\n\ntest_vpkuhum_2:\n  # {-8, -7, -6, -5, -4, -3, -2, -1}\n  #_ REGISTER_IN v3 [FFF8FFF9, FFFAFFFB, FFFCFFFD, FFFEFFFF]\n  # {0, 1, 2, 3, 4, 5, 6, 7}\n  #_ REGISTER_IN v4 [00000001, 00020003, 00040005, 00060007]\n  vpkuhum v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [FFF8FFF9, FFFAFFFB, FFFCFFFD, FFFEFFFF]\n  #_ REGISTER_OUT v4 [00000001, 00020003, 00040005, 00060007]\n  # {-8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7}\n  #_ REGISTER_OUT v5 [F8F9FAFB, FCFDFEFF, 00010203, 04050607]\n  blr\n\ntest_vpkuhum_3:\n  # {0, 65535, 65535, 0, 0, 0, 65535, 0}\n  #_ REGISTER_IN v3 [0000FFFF, FFFF0000, 00000000, FFFF0000]\n  # {65535, 0, 0, 65535, 65535, 65535, 0, 65535}\n  #_ REGISTER_IN v4 [FFFF0000, 0000FFFF, FFFFFFFF, 0000FFFF]\n  vpkuhum v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [0000FFFF, FFFF0000, 00000000, FFFF0000]\n  #_ REGISTER_OUT v4 [FFFF0000, 0000FFFF, FFFFFFFF, 0000FFFF]\n  # {0, 255, 255, 0, 0, 0, 255, 0, 255, 0, 0, 255, 255, 255, 0, 255}\n  #_ REGISTER_OUT v5 [00FFFF00, 0000FF00, FF0000FF, FFFF00FF]\n  blr\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vpkuhum128.s",
    "content": "#vpkuhum128 isn't implemented yet\n#test_vpkuhum128_1:\n#  # {0, 1, 2, 3, 4, 5, 6, 7}\n#  #_ REGISTER_IN v3 [00000001, 00020003, 00040005, 00060007]\n#  # {8, 9, 10, 11, 12, 13, 14, 15}\n#  #_ REGISTER_IN v4 [00080009, 000A000B, 000C000D, 000E000F]\n#  vpkuhum128 v5, v3, v4\n#  blr\n#  #_ REGISTER_OUT v3 [00000001, 00020003, 00040005, 00060007]\n#  #_ REGISTER_OUT v4 [00080009, 000A000B, 000C000D, 000E000F]\n#  # {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}\n#  #_ REGISTER_OUT v5 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n#  blr\n\n#test_vpkuhum128_2:\n#  # {-8, -7, -6, -5, -4, -3, -2, -1}\n#  #_ REGISTER_IN v3 [FFF8FFF9, FFFAFFFB, FFFCFFFD, FFFEFFFF]\n#  # {0, 1, 2, 3, 4, 5, 6, 7}\n#  #_ REGISTER_IN v4 [00000001, 00020003, 00040005, 00060007]\n#  vpkuhum128 v5, v3, v4\n#  blr\n#  #_ REGISTER_OUT v3 [FFF8FFF9, FFFAFFFB, FFFCFFFD, FFFEFFFF]\n#  #_ REGISTER_OUT v4 [00000001, 00020003, 00040005, 00060007]\n#  # {-8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7}\n#  #_ REGISTER_OUT v5 [F8F9FAFB, FCFDFEFF, 00010203, 04050607]\n#  blr\n\n#test_vpkuhum128_3:\n#  # {0, 65535, 65535, 0, 0, 0, 65535, 0}\n#  #_ REGISTER_IN v3 [0000FFFF, FFFF0000, 00000000, FFFF0000]\n#  # {65535, 0, 0, 65535, 65535, 65535, 0, 65535}\n#  #_ REGISTER_IN v4 [FFFF0000, 0000FFFF, FFFFFFFF, 0000FFFF]\n#  vpkuhum128 v5, v3, v4\n#  blr\n#  #_ REGISTER_OUT v3 [0000FFFF, FFFF0000, 00000000, FFFF0000]\n#  #_ REGISTER_OUT v4 [FFFF0000, 0000FFFF, FFFFFFFF, 0000FFFF]\n#  # {0, 255, 255, 0, 0, 0, 255, 0, 255, 0, 0, 255, 255, 255, 0, 255}\n#  #_ REGISTER_OUT v5 [00FFFF00, 0000FF00, FF0000FF, FFFF00FF]\n#  blr\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vpkuhus.s",
    "content": "test_vpkuhus_1:\n  # {0, 256, 1, 257, 2, 258, 3, 259}\n  #_ REGISTER_IN v3 [00000100, 00010101, 00020102, 00030103]\n  # {4, 260, 5, 261, 6, 262, 7, 263}\n  #_ REGISTER_IN v4 [00040104, 00050105, 00060106, 00070107]\n  vpkuhus v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [00000100, 00010101, 00020102, 00030103]\n  #_ REGISTER_OUT v4 [00040104, 00050105, 00060106, 00070107]\n  # {0, 255, 1, 255, 2, 255, 3, 255, 4, 255, 5, 255, 6, 255, 7, 255}\n  #_ REGISTER_OUT v5 [00FF01FF, 02FF03FF, 04FF05FF, 06FF07FF]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vpkuhus128.s",
    "content": "test_vpkuhus128_1:\n  # {0, 256, 1, 257, 2, 258, 3, 259}\n  #_ REGISTER_IN v3 [00000100, 00010101, 00020102, 00030103]\n  # {4, 260, 5, 261, 6, 262, 7, 263}\n  #_ REGISTER_IN v4 [00040104, 00050105, 00060106, 00070107]\n  vpkuhus128 v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [00000100, 00010101, 00020102, 00030103]\n  #_ REGISTER_OUT v4 [00040104, 00050105, 00060106, 00070107]\n  # {0, 255, 1, 255, 2, 255, 3, 255, 4, 255, 5, 255, 6, 255, 7, 255}\n  #_ REGISTER_OUT v5 [00FF01FF, 02FF03FF, 04FF05FF, 06FF07FF]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vpkuwum.s",
    "content": "test_vpkuwum_1:\n  # {0, 1, 2, 3}\n  #_ REGISTER_IN v3 [00000000, 00000001, 00000002, 00000003]\n  # {4, 5, 6, 7}\n  #_ REGISTER_IN v4 [00000004, 00000005, 00000006, 00000007]\n  vpkuwum v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [00000000, 00000001, 00000002, 00000003]\n  #_ REGISTER_OUT v4 [00000004, 00000005, 00000006, 00000007]\n  # {0, 1, 2, 3, 4, 5, 6, 7}\n  #_ REGISTER_OUT v5 [00000001, 00020003, 00040005, 00060007]\n\ntest_vpkuwum_2:\n  # {-4, -3, -2, -1}\n  #_ REGISTER_IN v3 [FFFFFFFC, FFFFFFFD, FFFFFFFE, FFFFFFFF]\n  # {0, 1, 2, 3}\n  #_ REGISTER_IN v4 [00000000, 00000001, 00000002, 00000003]\n  vpkuwum v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [FFFFFFFC, FFFFFFFD, FFFFFFFE, FFFFFFFF]\n  #_ REGISTER_OUT v4 [00000000, 00000001, 00000002, 00000003]\n  # {-4, -3, -2, -1, 0, 1, 2, 3}\n  #_ REGISTER_OUT v5 [FFFCFFFD, FFFEFFFF, 00000001, 00020003]\n\ntest_vpkuwum_3:\n  # {0, 4294967295, 4294967295, 4294967295}\n  #_ REGISTER_IN v3 [00000000, FFFFFFFF, FFFFFFFF, FFFFFFFF]\n  # {4294967295, 0, 0, 0}\n  #_ REGISTER_IN v4 [FFFFFFFF, 00000000, 00000000, 00000000]\n  vpkuwum v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [00000000, FFFFFFFF, FFFFFFFF, FFFFFFFF]\n  #_ REGISTER_OUT v4 [FFFFFFFF, 00000000, 00000000, 00000000]\n  # {0, 65535, 65535, 65535, 65535, 0, 0, 0}\n  #_ REGISTER_OUT v5 [0000FFFF, FFFFFFFF, FFFF0000, 00000000]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vpkuwum128.s",
    "content": "test_vpkuwum128_1:\n  # {0, 1, 2, 3}\n  #_ REGISTER_IN v3 [00000000, 00000001, 00000002, 00000003]\n  # {4, 5, 6, 7}\n  #_ REGISTER_IN v4 [00000004, 00000005, 00000006, 00000007]\n  vpkuwum128 v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [00000000, 00000001, 00000002, 00000003]\n  #_ REGISTER_OUT v4 [00000004, 00000005, 00000006, 00000007]\n  # {0, 1, 2, 3, 4, 5, 6, 7}\n  #_ REGISTER_OUT v5 [00000001, 00020003, 00040005, 00060007]\n\ntest_vpkuwum128_2:\n  # {-4, -3, -2, -1}\n  #_ REGISTER_IN v3 [FFFFFFFC, FFFFFFFD, FFFFFFFE, FFFFFFFF]\n  # {0, 1, 2, 3}\n  #_ REGISTER_IN v4 [00000000, 00000001, 00000002, 00000003]\n  vpkuwum128 v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [FFFFFFFC, FFFFFFFD, FFFFFFFE, FFFFFFFF]\n  #_ REGISTER_OUT v4 [00000000, 00000001, 00000002, 00000003]\n  # {-4, -3, -2, -1, 0, 1, 2, 3}\n  #_ REGISTER_OUT v5 [FFFCFFFD, FFFEFFFF, 00000001, 00020003]\n\ntest_vpkuwum128_3:\n  # {0, 4294967295, 4294967295, 4294967295}\n  #_ REGISTER_IN v3 [00000000, FFFFFFFF, FFFFFFFF, FFFFFFFF]\n  # {4294967295, 0, 0, 0}\n  #_ REGISTER_IN v4 [FFFFFFFF, 00000000, 00000000, 00000000]\n  vpkuwum128 v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [00000000, FFFFFFFF, FFFFFFFF, FFFFFFFF]\n  #_ REGISTER_OUT v4 [FFFFFFFF, 00000000, 00000000, 00000000]\n  # {0, 65535, 65535, 65535, 65535, 0, 0, 0}\n  #_ REGISTER_OUT v5 [0000FFFF, FFFFFFFF, FFFF0000, 00000000]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vpkuwus.s",
    "content": "test_vpkuwus_1:\n  # {0, 65536, 1, 65537}\n  #_ REGISTER_IN v3 [00000000, 00010000, 00000001, 00010001]\n  # {2, 65538, 3, 65539}\n  #_ REGISTER_IN v4 [00000002, 00010002, 00000003, 00010003]\n  vpkuwus v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [00000000, 00010000, 00000001, 00010001]\n  #_ REGISTER_OUT v4 [00000002, 00010002, 00000003, 00010003]\n  # {0, 65535, 1, 65535, 2, 65535, 3, 65535}\n  #_ REGISTER_OUT v5 [0000FFFF, 0001FFFF, 0002FFFF, 0003FFFF]\n\ntest_vpkuwus_2:\n  # {2147483648, 2147483647, 2, 3}\n  #_ REGISTER_IN v3 [80000000, 7FFFFFFF, 00000002, 00000003]\n  # {4294967295, 65538, 4294967294, 16}\n  #_ REGISTER_IN v4 [FFFFFFFF, 00010002, FFFFFFFE, 00000010]\n  vpkuwus v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [80000000, 7FFFFFFF, 00000002, 00000003]\n  #_ REGISTER_OUT v4 [FFFFFFFF, 00010002, FFFFFFFE, 00000010]\n  # {65535, 65535, 2, 3, 65535, 65535, 65535, 16}\n  #_ REGISTER_OUT v5 [FFFFFFFF, 00020003, FFFFFFFF, FFFF0010]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vpkuwus128.s",
    "content": "test_vpkuwus128_1:\n  # {0, 65536, 1, 65537}\n  #_ REGISTER_IN v3 [00000000, 00010000, 00000001, 00010001]\n  # {2, 65538, 3, 65539}\n  #_ REGISTER_IN v4 [00000002, 00010002, 00000003, 00010003]\n  vpkuwus128 v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [00000000, 00010000, 00000001, 00010001]\n  #_ REGISTER_OUT v4 [00000002, 00010002, 00000003, 00010003]\n  # {0, 65535, 1, 65535, 2, 65535, 3, 65535}\n  #_ REGISTER_OUT v5 [0000FFFF, 0001FFFF, 0002FFFF, 0003FFFF]\n\ntest_vpkuwus128_2:\n  # {2147483648, 2147483647, 2, 3}\n  #_ REGISTER_IN v3 [80000000, 7FFFFFFF, 00000002, 00000003]\n  # {4294967295, 65538, 4294967294, 16}\n  #_ REGISTER_IN v4 [FFFFFFFF, 00010002, FFFFFFFE, 00000010]\n  vpkuwus128 v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [80000000, 7FFFFFFF, 00000002, 00000003]\n  #_ REGISTER_OUT v4 [FFFFFFFF, 00010002, FFFFFFFE, 00000010]\n  # {65535, 65535, 2, 3, 65535, 65535, 65535, 16}\n  #_ REGISTER_OUT v5 [FFFFFFFF, 00020003, FFFFFFFF, FFFF0010]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vrfin.s",
    "content": "test_vrfin_1:\n  #_ REGISTER_IN v3 [3f800000, 3fc00000, 3f8ccccd, 3ff33333]\n  # 1.0, 1.5, 1.1, 1.9 -> 1.0, 2.0, 1.0, 2.0\n  vrfin v3, v3\n  blr\n  #_ REGISTER_OUT v3 [3f800000, 40000000, 3f800000, 40000000]\n\ntest_vrfin_2:\n  #_ REGISTER_IN v3 [bf800000, bfc00000, bf8ccccd, bff33333]\n  # -1.0, -1.5, -1.1, -1.9 -> -1.0, -2.0, -1.0, -2.0\n  vrfin v3, v3\n  blr\n  #_ REGISTER_OUT v3 [bf800000, c0000000, bf800000, c0000000]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vrlh.s",
    "content": "test_vrlh_1:\n  #_ REGISTER_IN v3 [12345678, 87654321, 11223344, 55667788]\n  #_ REGISTER_IN v4 [000D000D, 000D000D, 000D000D, 000D000D]\n  vrlh v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [12345678, 87654321, 11223344, 55667788]\n  #_ REGISTER_OUT v4 [000D000D, 000D000D, 000D000D, 000D000D]\n  #_ REGISTER_OUT v5 [82460ACF, B0EC2864, 42248668, CAAC0EF1]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vrlimi128.s",
    "content": "test_vrlimi128_1:\n  #_ REGISTER_IN v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_IN v4 [CCCCCCCC, CCCCCCCC, CCCCCCCC, CCCCCCCC]\n  vrlimi128 v4, v3, 0, 0\n  blr\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_OUT v4 [CCCCCCCC, CCCCCCCC, CCCCCCCC, CCCCCCCC]\n\ntest_vrlimi128_2:\n  #_ REGISTER_IN v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_IN v4 [CCCCCCCC, CCCCCCCC, CCCCCCCC, CCCCCCCC]\n  vrlimi128 v4, v3, 0xF, 0\n  blr\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_OUT v4 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n\ntest_vrlimi128_3:\n  #_ REGISTER_IN v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_IN v4 [CCCCCCCC, CCCCCCCC, CCCCCCCC, CCCCCCCC]\n  # assember is busted here:\n  # vrlimi128 v4, v3, 0xF, 1\n  .long 0x188f1f50\n  blr\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_OUT v4 [04050607, 08090A0B, 0C0D0E0F, 00010203]\n\ntest_vrlimi128_4:\n  #_ REGISTER_IN v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_IN v4 [CCCCCCCC, CCCCCCCC, CCCCCCCC, CCCCCCCC]\n  vrlimi128 v4, v3, 0xF, 2\n  blr\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_OUT v4 [08090A0B, 0C0D0E0F, 00010203, 04050607]\n\ntest_vrlimi128_5:\n  #_ REGISTER_IN v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_IN v4 [CCCCCCCC, CCCCCCCC, CCCCCCCC, CCCCCCCC]\n  # assember is busted here:\n  # vrlimi128 v4, v3, 0xF, 3\n  .long 0x188f1fd0\n  blr\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_OUT v4 [0C0D0E0F, 00010203, 04050607, 08090A0B]\n\ntest_vrlimi128_6:\n  #_ REGISTER_IN v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_IN v4 [CCCCCCCC, CCCCCCCC, CCCCCCCC, CCCCCCCC]\n  vrlimi128 v4, v3, 0x8, 0\n  blr\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_OUT v4 [00010203, CCCCCCCC, CCCCCCCC, CCCCCCCC]\n\ntest_vrlimi128_7:\n  #_ REGISTER_IN v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_IN v4 [CCCCCCCC, CCCCCCCC, CCCCCCCC, CCCCCCCC]\n  vrlimi128 v4, v3, 0x4, 0\n  blr\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_OUT v4 [CCCCCCCC, 04050607, CCCCCCCC, CCCCCCCC]\n\ntest_vrlimi128_8:\n  #_ REGISTER_IN v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_IN v4 [CCCCCCCC, CCCCCCCC, CCCCCCCC, CCCCCCCC]\n  vrlimi128 v4, v3, 0x2, 0\n  blr\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_OUT v4 [CCCCCCCC, CCCCCCCC, 08090A0B, CCCCCCCC]\n\ntest_vrlimi128_9:\n  #_ REGISTER_IN v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_IN v4 [CCCCCCCC, CCCCCCCC, CCCCCCCC, CCCCCCCC]\n  vrlimi128 v4, v3, 0x1, 0\n  blr\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_OUT v4 [CCCCCCCC, CCCCCCCC, CCCCCCCC, 0C0D0E0F]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vsel.s",
    "content": "test_vsel_1:\n  #_ REGISTER_IN v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_IN v4 [10111213, 14151617, 18191A1B, 1C1D1E1F]\n  #_ REGISTER_IN v5 [00000000, 00000000, 00000000, 00000000]\n  vsel v5, v3, v4, v5\n  blr\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_OUT v4 [10111213, 14151617, 18191A1B, 1C1D1E1F]\n  #_ REGISTER_OUT v5 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n\ntest_vsel_2:\n  #_ REGISTER_IN v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_IN v4 [10111213, 14151617, 18191A1B, 1C1D1E1F]\n  #_ REGISTER_IN v5 [FFFFFFFF, FFFFFFFF, FFFFFFFF, FFFFFFFF]\n  vsel v5, v3, v4, v5\n  blr\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_OUT v4 [10111213, 14151617, 18191A1B, 1C1D1E1F]\n  #_ REGISTER_OUT v5 [10111213, 14151617, 18191A1B, 1C1D1E1F]\n\ntest_vsel_3:\n  #_ REGISTER_IN v3 [0C010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_IN v4 [1D111213, 14151617, 18191A1B, 1C1D1E1F]\n  #_ REGISTER_IN v5 [10101010, 10101010, 10101010, 10101010]\n  vsel v5, v3, v4, v5\n  blr\n  #_ REGISTER_OUT v3 [0C010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_OUT v4 [1D111213, 14151617, 18191A1B, 1C1D1E1F]\n  #_ REGISTER_OUT v5 [1C111213, 14151617, 18191A1B, 1C1D1E1F]\n\ntest_vsel_4:\n  #_ REGISTER_IN v3 [00000000, 00000000, 00000000, 00000000]\n  #_ REGISTER_IN v4 [FFFFFFFF, FFFFFFFF, FFFFFFFF, FFFFFFFF]\n  #_ REGISTER_IN v5 [01234567, 89ABCDEF, FEDCBA98, 76543210]\n  vsel v5, v3, v4, v5\n  blr\n  #_ REGISTER_OUT v3 [00000000, 00000000, 00000000, 00000000]\n  #_ REGISTER_OUT v4 [FFFFFFFF, FFFFFFFF, FFFFFFFF, FFFFFFFF]\n  #_ REGISTER_OUT v5 [01234567, 89ABCDEF, FEDCBA98, 76543210]\n\ntest_vsel_5:\n  #_ REGISTER_IN v3 [FFFFFFFF, FFFFFFFF, FFFFFFFF, FFFFFFFF]\n  #_ REGISTER_IN v4 [00000000, 00000000, 00000000, 00000000]\n  #_ REGISTER_IN v5 [01234567, 89ABCDEF, FEDCBA98, 76543210]\n  vsel v5, v3, v4, v5\n  blr\n  #_ REGISTER_OUT v3 [FFFFFFFF, FFFFFFFF, FFFFFFFF, FFFFFFFF]\n  #_ REGISTER_OUT v4 [00000000, 00000000, 00000000, 00000000]\n  #_ REGISTER_OUT v5 [FEDCBA98, 76543210, 01234567, 89ABCDEF]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vsl.s",
    "content": "test_vsl_1:\n  #_ REGISTER_IN v3 [FEFEFEFE, FEFEFEFE, FEFEFEFE, FEFEFEFE]\n  #_ REGISTER_IN v4 [04040404, 04040404, 04040404, 04040404]\n  vsl v3, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [EFEFEFEF, EFEFEFEF, EFEFEFEF, EFEFEFE0]\n  #_ REGISTER_OUT v4 [04040404, 04040404, 04040404, 04040404]\n\ntest_vsl_2:\n  #_ REGISTER_IN v3 [00112233, 44556677, 8899AABB, CCDDEEFF]\n  #_ REGISTER_IN v4 [04040404, 04040404, 04040404, 04040404]\n  vsl v3, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [01122334, 45566778, 899AABBC, CDDEEFF0]\n  #_ REGISTER_OUT v4 [04040404, 04040404, 04040404, 04040404]\n\ntest_vsl_3:\n  #_ REGISTER_IN v3 [00112233, 44556677, 8899AABB, CCDDEEFF]\n  #_ REGISTER_IN v4 [07070707, 07070707, 07070707, 07070707]\n  vsl v3, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [089119A2, 2AB33BC4, 4CD55DE6, 6EF77F80]\n  #_ REGISTER_OUT v4 [07070707, 07070707, 07070707, 07070707]\n\ntest_vsl_4:\n  #_ REGISTER_IN v3 [00112233, 44556677, 8899AABB, CCDDEEFF]\n  #_ REGISTER_IN v4 [FFFFFFFF, FFFFFFFF, FFFFFFFF, FFFFFFFF]\n  vsl v3, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [089119A2, 2AB33BC4, 4CD55DE6, 6EF77F80]\n  #_ REGISTER_OUT v4 [FFFFFFFF, FFFFFFFF, FFFFFFFF, FFFFFFFF]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vslb.s",
    "content": "test_vslb_1:\n  #_ REGISTER_IN v3 [FFFFFFFF, FFFFFFFF, FFFFFFFF, FFFFFFFF]\n  #_ REGISTER_IN v4 [00000000, 00000000, 00000000, 00000000]\n  vslb v3, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [FFFFFFFF, FFFFFFFF, FFFFFFFF, FFFFFFFF]\n  #_ REGISTER_OUT v4 [00000000, 00000000, 00000000, 00000000]\n\ntest_vslb_2:\n  #_ REGISTER_IN v3 [FFFFFFFF, FFFFFFFF, FFFFFFFF, FFFFFFFF]\n  #_ REGISTER_IN v4 [01010101, 01010101, 01010101, 01010101]\n  vslb v3, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [FEFEFEFE, FEFEFEFE, FEFEFEFE, FEFEFEFE]\n  #_ REGISTER_OUT v4 [01010101, 01010101, 01010101, 01010101]\n\ntest_vslb_3:\n  #_ REGISTER_IN v3 [FFFFFFFF, FFFFFFFF, FFFFFFFF, FFFFFFFF]\n  #_ REGISTER_IN v4 [07070707, 07070707, 07070707, 07070707]\n  vslb v3, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [80808080, 80808080, 80808080, 80808080]\n  #_ REGISTER_OUT v4 [07070707, 07070707, 07070707, 07070707]\n\ntest_vslb_4:\n  #_ REGISTER_IN v3 [FFFFFFFF, FFFFFFFF, FFFFFFFF, FFFFFFFF]\n  #_ REGISTER_IN v4 [08080808, 08080808, 08080808, 08080808]\n  vslb v3, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [FFFFFFFF, FFFFFFFF, FFFFFFFF, FFFFFFFF]\n  #_ REGISTER_OUT v4 [08080808, 08080808, 08080808, 08080808]\n\ntest_vslb_5:\n  #_ REGISTER_IN v3 [FFFFFFFF, FFFFFFFF, FFFFFFFF, FFFFFFFF]\n  #_ REGISTER_IN v4 [09090909, 09090909, 09090909, 09090909]\n  vslb v3, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [FEFEFEFE, FEFEFEFE, FEFEFEFE, FEFEFEFE]\n  #_ REGISTER_OUT v4 [09090909, 09090909, 09090909, 09090909]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vsldoi.s",
    "content": "test_vsldoi_1:\n  #_ REGISTER_IN v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_IN v4 [10111213, 14151617, 18191A1B, 1C1D1E1F]\n  #_ REGISTER_IN v5 [00000000, 00000000, 00000000, 00000000]\n  vsldoi v5, v3, v4, 0\n  blr\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_OUT v4 [10111213, 14151617, 18191A1B, 1C1D1E1F]\n  #_ REGISTER_OUT v5 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n\ntest_vsldoi_2:\n  #_ REGISTER_IN v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_IN v4 [10111213, 14151617, 18191A1B, 1C1D1E1F]\n  #_ REGISTER_IN v5 [00000000, 00000000, 00000000, 00000000]\n  vsldoi v5, v3, v4, 1\n  blr\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_OUT v4 [10111213, 14151617, 18191A1B, 1C1D1E1F]\n  #_ REGISTER_OUT v5 [01020304, 05060708, 090A0B0C, 0D0E0F10]\n\ntest_vsldoi_3:\n  #_ REGISTER_IN v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_IN v4 [10111213, 14151617, 18191A1B, 1C1D1E1F]\n  #_ REGISTER_IN v5 [00000000, 00000000, 00000000, 00000000]\n  vsldoi v5, v3, v4, 0xF\n  blr\n  #_ REGISTER_OUT v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  #_ REGISTER_OUT v4 [10111213, 14151617, 18191A1B, 1C1D1E1F]\n  #_ REGISTER_OUT v5 [0F101112, 13141516, 1718191A, 1B1C1D1E]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vslh.s",
    "content": "test_vslh_1:\n  #_ REGISTER_IN v3 [FFFFFFFF, FFFFFFFF, FFFFFFFF, FFFFFFFF]\n  #_ REGISTER_IN v4 [00000000, 00000000, 00000000, 00000000]\n  vslh v3, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [FFFFFFFF, FFFFFFFF, FFFFFFFF, FFFFFFFF]\n  #_ REGISTER_OUT v4 [00000000, 00000000, 00000000, 00000000]\n\ntest_vslh_2:\n  #_ REGISTER_IN v3 [FFFFFFFF, FFFFFFFF, FFFFFFFF, FFFFFFFF]\n  #_ REGISTER_IN v4 [00010001, 00010001, 00010001, 00010001]\n  vslh v3, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [FFFEFFFE, FFFEFFFE, FFFEFFFE, FFFEFFFE]\n  #_ REGISTER_OUT v4 [00010001, 00010001, 00010001, 00010001]\n\ntest_vslh_3:\n  #_ REGISTER_IN v3 [FFFFFFFF, FFFFFFFF, FFFFFFFF, FFFFFFFF]\n  #_ REGISTER_IN v4 [000F000F, 000F000F, 000F000F, 000F000F]\n  vslh v3, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [80008000, 80008000, 80008000, 80008000]\n  #_ REGISTER_OUT v4 [000F000F, 000F000F, 000F000F, 000F000F]\n\ntest_vslh_4:\n  #_ REGISTER_IN v3 [FFFFFFFF, FFFFFFFF, FFFFFFFF, FFFFFFFF]\n  #_ REGISTER_IN v4 [00100010, 00100010, 00100010, 00100010]\n  vslh v3, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [FFFFFFFF, FFFFFFFF, FFFFFFFF, FFFFFFFF]\n  #_ REGISTER_OUT v4 [00100010, 00100010, 00100010, 00100010]\n\ntest_vslh_5:\n  #_ REGISTER_IN v3 [FFFFFFFF, FFFFFFFF, FFFFFFFF, FFFFFFFF]\n  #_ REGISTER_IN v4 [00090009, 00090009, 00090009, 00090009]\n  vslh v3, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [FE00FE00, FE00FE00, FE00FE00, FE00FE00]\n  #_ REGISTER_OUT v4 [00090009, 00090009, 00090009, 00090009]\n\ntest_vslh_6:\n  #_ REGISTER_IN v3 [FFFFFFFF, FFFFFFFF, FFFFFFFF, FFFFFFFF]\n  #_ REGISTER_IN v4 [00110011, 00110011, 00110011, 00110011]\n  vslh v3, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [FFFEFFFE, FFFEFFFE, FFFEFFFE, FFFEFFFE]\n  #_ REGISTER_OUT v4 [00110011, 00110011, 00110011, 00110011]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vslo.s",
    "content": "test_vslo_1:\n  #_ REGISTER_IN v3 [00112233, 44556677, 8899AABB, CCDDEEFF]\n  #_ REGISTER_IN v4 [04040404, 04040404, 04040404, 04040404]\n  vslo v3, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [00112233, 44556677, 8899AABB, CCDDEEFF]\n  #_ REGISTER_OUT v4 [04040404, 04040404, 04040404, 04040404]\n\ntest_vslo_2:\n  #_ REGISTER_IN v3 [00112233, 44556677, 8899AABB, CCDDEEFF]\n  #_ REGISTER_IN v4 [08080808, 08080808, 08080808, 08080808]\n  vslo v3, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [11223344, 55667788, 99AABBCC, DDEEFF00]\n  #_ REGISTER_OUT v4 [08080808, 08080808, 08080808, 08080808]\n\ntest_vslo_3:\n  #_ REGISTER_IN v3 [00112233, 44556677, 8899AABB, CCDDEEFF]\n  #_ REGISTER_IN v4 [12121212, 12121212, 12121212, 12121212]\n  vslo v3, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [22334455, 66778899, AABBCCDD, EEFF0000]\n  #_ REGISTER_OUT v4 [12121212, 12121212, 12121212, 12121212]\n\ntest_vslo_4:\n  #_ REGISTER_IN v3 [00112233, 44556677, 8899AABB, CCDDEEFF]\n  #_ REGISTER_IN v4 [80808080, 80808080, 80808080, 80808080]\n  vslo v3, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [00112233, 44556677, 8899AABB, CCDDEEFF]\n  #_ REGISTER_OUT v4 [80808080, 80808080, 80808080, 80808080]\n\ntest_vslo_5:\n  #_ REGISTER_IN v3 [00112233, 44556677, 8899AABB, CCDDEEFF]\n  #_ REGISTER_IN v4 [FFFFFFFF, FFFFFFFF, FFFFFFFF, FFFFFFFF]\n  vslo v3, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [FF000000, 00000000, 00000000, 00000000]\n  #_ REGISTER_OUT v4 [FFFFFFFF, FFFFFFFF, FFFFFFFF, FFFFFFFF]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vslw.s",
    "content": "test_vslw_1:\n  #_ REGISTER_IN v3 [FFFFFFFF, FFFFFFFF, FFFFFFFF, FFFFFFFF]\n  #_ REGISTER_IN v4 [00000000, 00000000, 00000000, 00000000]\n  vslw v3, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [FFFFFFFF, FFFFFFFF, FFFFFFFF, FFFFFFFF]\n  #_ REGISTER_OUT v4 [00000000, 00000000, 00000000, 00000000]\n\ntest_vslw_2:\n  #_ REGISTER_IN v3 [FFFFFFFF, FFFFFFFF, FFFFFFFF, FFFFFFFF]\n  #_ REGISTER_IN v4 [00000001, 00000001, 00000001, 00000001]\n  vslw v3, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [FFFFFFFE, FFFFFFFE, FFFFFFFE, FFFFFFFE]\n  #_ REGISTER_OUT v4 [00000001, 00000001, 00000001, 00000001]\n\ntest_vslw_3:\n  #_ REGISTER_IN v3 [FFFFFFFF, FFFFFFFF, FFFFFFFF, FFFFFFFF]\n  #_ REGISTER_IN v4 [0000001F, 0000001F, 0000001F, 0000001F]\n  vslw v3, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [80000000, 80000000, 80000000, 80000000]\n  #_ REGISTER_OUT v4 [0000001F, 0000001F, 0000001F, 0000001F]\n\ntest_vslw_4:\n  #_ REGISTER_IN v3 [FFFFFFFF, FFFFFFFF, FFFFFFFF, FFFFFFFF]\n  #_ REGISTER_IN v4 [00000020, 00000020, 00000020, 00000020]\n  vslw v3, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [FFFFFFFF, FFFFFFFF, FFFFFFFF, FFFFFFFF]\n  #_ REGISTER_OUT v4 [00000020, 00000020, 00000020, 00000020]\n\ntest_vslw_5:\n  #_ REGISTER_IN v3 [FFFFFFFF, FFFFFFFF, FFFFFFFF, FFFFFFFF]\n  #_ REGISTER_IN v4 [00000009, 00000009, 00000009, 00000009]\n  vslw v3, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [FFFFFE00, FFFFFE00, FFFFFE00, FFFFFE00]\n  #_ REGISTER_OUT v4 [00000009, 00000009, 00000009, 00000009]\n\ntest_vslw_6:\n  #_ REGISTER_IN v3 [FFFFFFFF, FFFFFFFF, FFFFFFFF, FFFFFFFF]\n  #_ REGISTER_IN v4 [00000021, 00000021, 00000021, 00000021]\n  vslw v3, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [FFFFFFFE, FFFFFFFE, FFFFFFFE, FFFFFFFE]\n  #_ REGISTER_OUT v4 [00000021, 00000021, 00000021, 00000021]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vspltb.s",
    "content": "test_vspltb_1:\n  #_ REGISTER_IN v4 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  vspltb v3, v4, 0\n  blr\n  #_ REGISTER_OUT v3 [00000000, 00000000, 00000000, 00000000]\n  #_ REGISTER_OUT v4 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n\ntest_vspltb_2:\n  #_ REGISTER_IN v4 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  vspltb v3, v4, 1\n  blr\n  #_ REGISTER_OUT v3 [01010101, 01010101, 01010101, 01010101]\n  #_ REGISTER_OUT v4 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n\ntest_vspltb_3:\n  #_ REGISTER_IN v4 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  vspltb v3, v4, 0xF\n  blr\n  #_ REGISTER_OUT v3 [0F0F0F0F, 0F0F0F0F, 0F0F0F0F, 0F0F0F0F]\n  #_ REGISTER_OUT v4 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vsplth.s",
    "content": "test_vsplth_1:\n  #_ REGISTER_IN v4 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  vsplth v3, v4, 0\n  blr\n  #_ REGISTER_OUT v3 [00010001, 00010001, 00010001, 00010001]\n  #_ REGISTER_OUT v4 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n\ntest_vsplth_2:\n  #_ REGISTER_IN v4 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  vsplth v3, v4, 1\n  blr\n  #_ REGISTER_OUT v3 [02030203, 02030203, 02030203, 02030203]\n  #_ REGISTER_OUT v4 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n\ntest_vsplth_3:\n  #_ REGISTER_IN v4 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  vsplth v3, v4, 7\n  blr\n  #_ REGISTER_OUT v3 [0E0F0E0F, 0E0F0E0F, 0E0F0E0F, 0E0F0E0F]\n  #_ REGISTER_OUT v4 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vspltisb.s",
    "content": "test_vspltisb_1:\n  vspltisb v3, 0\n  blr\n  #_ REGISTER_OUT v3 [00000000, 00000000, 00000000, 00000000]\n\ntest_vspltisb_2:\n  vspltisb v3, 1\n  blr\n  #_ REGISTER_OUT v3 [01010101, 01010101, 01010101, 01010101]\n\ntest_vspltisb_3:\n  vspltisb v3, -1\n  blr\n  #_ REGISTER_OUT v3 [FFFFFFFF, FFFFFFFF, FFFFFFFF, FFFFFFFF]\n\ntest_vspltisb_4:\n  vspltisb v3, -2\n  blr\n  #_ REGISTER_OUT v3 [FEFEFEFE, FEFEFEFE, FEFEFEFE, FEFEFEFE]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vspltish.s",
    "content": "test_vspltish_1:\n  vspltish v3, 0\n  blr\n  #_ REGISTER_OUT v3 [00000000, 00000000, 00000000, 00000000]\n\ntest_vspltish_2:\n  vspltish v3, 1\n  blr\n  #_ REGISTER_OUT v3 [00010001, 00010001, 00010001, 00010001]\n\ntest_vspltish_3:\n  vspltish v3, -1\n  blr\n  #_ REGISTER_OUT v3 [FFFFFFFF, FFFFFFFF, FFFFFFFF, FFFFFFFF]\n\ntest_vspltish_4:\n  vspltish v3, -2\n  blr\n  #_ REGISTER_OUT v3 [FFFEFFFE, FFFEFFFE, FFFEFFFE, FFFEFFFE]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vspltisw.s",
    "content": "test_vspltisw_1:\n  vspltisw v3, 0\n  blr\n  #_ REGISTER_OUT v3 [00000000, 00000000, 00000000, 00000000]\n\ntest_vspltisw_2:\n  vspltisw v3, 1\n  blr\n  #_ REGISTER_OUT v3 [00000001, 00000001, 00000001, 00000001]\n\ntest_vspltisw_3:\n  vspltisw v3, -1\n  blr\n  #_ REGISTER_OUT v3 [FFFFFFFF, FFFFFFFF, FFFFFFFF, FFFFFFFF]\n\ntest_vspltisw_4:\n  vspltisw v3, -2\n  blr\n  #_ REGISTER_OUT v3 [FFFFFFFE, FFFFFFFE, FFFFFFFE, FFFFFFFE]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vspltw.s",
    "content": "test_vspltw_1:\n  #_ REGISTER_IN v4 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  vspltw v3, v4, 0\n  blr\n  #_ REGISTER_OUT v3 [00010203, 00010203, 00010203, 00010203]\n  #_ REGISTER_OUT v4 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n\ntest_vspltw_2:\n  #_ REGISTER_IN v4 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  vspltw v3, v4, 1\n  blr\n  #_ REGISTER_OUT v3 [04050607, 04050607, 04050607, 04050607]\n  #_ REGISTER_OUT v4 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n\ntest_vspltw_3:\n  #_ REGISTER_IN v4 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  vspltw v3, v4, 3\n  blr\n  #_ REGISTER_OUT v3 [0C0D0E0F, 0C0D0E0F, 0C0D0E0F, 0C0D0E0F]\n  #_ REGISTER_OUT v4 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vsr.s",
    "content": "test_vsr_1:\n  #_ REGISTER_IN v3 [FEFEFEFE, FEFEFEFE, FEFEFEFE, FEFEFEFE]\n  #_ REGISTER_IN v4 [04040404, 04040404, 04040404, 04040404]\n  vsr v3, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [0FEFEFEF, EFEFEFEF, EFEFEFEF, EFEFEFEF]\n  #_ REGISTER_OUT v4 [04040404, 04040404, 04040404, 04040404]\n\ntest_vsr_2:\n  #_ REGISTER_IN v3 [00112233, 44556677, 8899AABB, CCDDEEFF]\n  #_ REGISTER_IN v4 [04040404, 04040404, 04040404, 04040404]\n  vsr v3, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [00011223, 34455667, 78899AAB, BCCDDEEF]\n  #_ REGISTER_OUT v4 [04040404, 04040404, 04040404, 04040404]\n\ntest_vsr_3:\n  #_ REGISTER_IN v3 [00112233, 44556677, 8899AABB, CCDDEEFF]\n  #_ REGISTER_IN v4 [07070707, 07070707, 07070707, 07070707]\n  vsr v3, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [00002244, 6688AACC, EF113355, 7799BBDD]\n  #_ REGISTER_OUT v4 [07070707, 07070707, 07070707, 07070707]\n\ntest_vsr_4:\n  #_ REGISTER_IN v3 [00112233, 44556677, 8899AABB, CCDDEEFF]\n  #_ REGISTER_IN v4 [FFFFFFFF, FFFFFFFF, FFFFFFFF, FFFFFFFF]\n  vsr v3, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [00002244, 6688AACC, EF113355, 7799BBDD]\n  #_ REGISTER_OUT v4 [FFFFFFFF, FFFFFFFF, FFFFFFFF, FFFFFFFF]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vsrah.s",
    "content": "test_vsrah_1:\n  #_ REGISTER_IN v3 [12345678, 87654321, 11223344, 55667788]\n  #_ REGISTER_IN v4 [000D000D, 000D000D, 000D000D, 000D000D]\n  vsrah v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [12345678, 87654321, 11223344, 55667788]\n  #_ REGISTER_OUT v4 [000D000D, 000D000D, 000D000D, 000D000D]\n  #_ REGISTER_OUT v5 [00000002, FFFC0002, 00000001, 00020003]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vsrh.s",
    "content": "test_vsrh_1:\n  #_ REGISTER_IN v3 [12345678, 87654321, 11223344, 55667788]\n  #_ REGISTER_IN v4 [000D000D, 000D000D, 000D000D, 000D000D]\n  vsrh v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [12345678, 87654321, 11223344, 55667788]\n  #_ REGISTER_OUT v4 [000D000D, 000D000D, 000D000D, 000D000D]\n  #_ REGISTER_OUT v5 [00000002, 00040002, 00000001, 00020003]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vsro.s",
    "content": "test_vsro_1:\n  #_ REGISTER_IN v3 [00112233, 44556677, 8899AABB, CCDDEEFF]\n  #_ REGISTER_IN v4 [04040404, 04040404, 04040404, 04040404]\n  vsro v3, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [00112233, 44556677, 8899AABB, CCDDEEFF]\n  #_ REGISTER_OUT v4 [04040404, 04040404, 04040404, 04040404]\n\ntest_vsro_2:\n  #_ REGISTER_IN v3 [00112233, 44556677, 8899AABB, CCDDEEFF]\n  #_ REGISTER_IN v4 [08080808, 08080808, 08080808, 08080808]\n  vsro v3, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [00001122, 33445566, 778899AA, BBCCDDEE]\n  #_ REGISTER_OUT v4 [08080808, 08080808, 08080808, 08080808]\n\ntest_vsro_3:\n  #_ REGISTER_IN v3 [00112233, 44556677, 8899AABB, CCDDEEFF]\n  #_ REGISTER_IN v4 [12121212, 12121212, 12121212, 12121212]\n  vsro v3, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [00000011, 22334455, 66778899, AABBCCDD]\n  #_ REGISTER_OUT v4 [12121212, 12121212, 12121212, 12121212]\n\ntest_vsro_4:\n  #_ REGISTER_IN v3 [00112233, 44556677, 8899AABB, CCDDEEFF]\n  #_ REGISTER_IN v4 [80808080, 80808080, 80808080, 80808080]\n  vsro v3, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [00112233, 44556677, 8899AABB, CCDDEEFF]\n  #_ REGISTER_OUT v4 [80808080, 80808080, 80808080, 80808080]\n\ntest_vsro_5:\n  #_ REGISTER_IN v3 [00112233, 44556677, 8899AABB, CCDDEEFF]\n  #_ REGISTER_IN v4 [FFFFFFFF, FFFFFFFF, FFFFFFFF, FFFFFFFF]\n  vsro v3, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [00000000, 00000000, 00000000, 00000000]\n  #_ REGISTER_OUT v4 [FFFFFFFF, FFFFFFFF, FFFFFFFF, FFFFFFFF]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vsubfp.s",
    "content": "test_vsubfp_1:\n  # v3 = [10.0, -10.0, 15.0, -15.0]\n  # v4 = [-10.0, 20.0, -20.0, 30.0]\n  #_ REGISTER_IN v3 [41200000, C1200000, 41700000, C1700000]\n  #_ REGISTER_IN v4 [C1200000, 41A00000, C1A00000, 41F00000]\n  vsubfp v3, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [41A00000, C1F00000, 420C0000, C2340000]\n  #_ REGISTER_OUT v4 [C1200000, 41A00000, C1A00000, 41F00000]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vsubfp128.s",
    "content": "test_vsubfp128_1:\n  # v3 = [10.0, -10.0, 15.0, -15.0]\n  # v4 = [-10.0, 20.0, -20.0, 30.0]\n  #_ REGISTER_IN v3 [41200000, C1200000, 41700000, C1700000]\n  #_ REGISTER_IN v4 [C1200000, 41A00000, C1A00000, 41F00000]\n  vsubfp128 v0, v3, v4\n  blr\n  #_ REGISTER_OUT v0 [41A00000, C1F00000, 420C0000, C2340000]\n  #_ REGISTER_OUT v3 [41200000, C1200000, 41700000, C1700000]\n  #_ REGISTER_OUT v4 [C1200000, 41A00000, C1A00000, 41F00000]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vsubshs.s",
    "content": "test_vsubshs_1:\n  #_ REGISTER_IN v3 [7FFF8001, 7FFF8003, 7FFF8005, 80068007]\n  #_ REGISTER_IN v4 [00018001, 10000000, 42568124, 00000000]\n  vsubshs v3, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [7ffe0000, 6fff8003, 3da9fee1, 80068007]\n  #_ REGISTER_OUT v4 [00018001, 10000000, 42568124, 00000000]\n\ntest_vsubshs_2:\n  #_ REGISTER_IN v3 [7FFF8002, 7FFF8003, 7FFF8005, 80068007]\n  #_ REGISTER_IN v4 [FFFF0005, 10000000, 42568124, 00000000]\n  vsubshs v3, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [7FFF8000, 6FFF8003, 3DA9FEE1, 80068007]\n  #_ REGISTER_OUT v4 [FFFF0005, 10000000, 42568124, 00000000]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vsubuhm.s",
    "content": "test_vsubuhm_1:\n  #_ REGISTER_IN v3 [7FFF8001, 7FFF8003, 7FFF8005, 80068007]\n  #_ REGISTER_IN v4 [00018001, 10000000, 42568124, 00000000]\n  vsubuhm v3, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [7ffe0000, 6fff8003, 3da9fee1, 80068007]\n  #_ REGISTER_OUT v4 [00018001, 10000000, 42568124, 00000000]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vupkd3d128.s",
    "content": "# vupkd3d128 dest, src, type\n# type:\n#   0 = PACK_TYPE_D3DCOLOR\n#   1 = PACK_TYPE_SHORT_2\n#   3 = PACK_TYPE_FLOAT16_2\n#   5 = PACK_TYPE_FLOAT16_4\n\n# vupkd3d128 is broken in binutils, so these are hand coded\n\ntest_vupkd3d128_d3dcolor:\n  #_ REGISTER_IN v3 [CDCDCDCD, CDCDCDCD, CDCDCDCD, 04010203]\n  # vupkd3d128 v3, v3, 0\n  .long 0x18601FF0\n  blr\n  #_ REGISTER_OUT v3 [3f800001, 3f800002, 3f800003, 3f800004]\n\ntest_vupkd3d128_short2_0:\n  #_ REGISTER_IN v3 [CDCDCDCD, CDCDCDCD, CDCDCDCD, 7FFF8001]\n  # vupkd3d128 v3, v3, 1\n  .long 0x18641FF0\n  blr\n  #_ REGISTER_OUT v3 [40407fff, 403f8001, 00000000, 3f800000]\ntest_vupkd3d128_short2_1:\n  #_ REGISTER_IN v3 [CDCDCDCD, CDCDCDCD, CDCDCDCD, 4000C000]\n  # vupkd3d128 v3, v3, 1\n  .long 0x18641FF0\n  blr\n  #_ REGISTER_OUT v3 [40404000, 403FC000, 00000000, 3f800000]\ntest_vupkd3d128_short2_2:\n  #_ REGISTER_IN v3 [CDCDCDCD, CDCDCDCD, CDCDCDCD, 7FFFF333]\n  # vupkd3d128 v3, v3, 1\n  .long 0x18641FF0\n  blr\n  #_ REGISTER_OUT v3 [40407FFF, 403FF333, 00000000, 3f800000]\ntest_vupkd3d128_short2_3:\n  #_ REGISTER_IN v3 [CDCDCDCD, CDCDCDCD, CDCDCDCD, 00008000]\n  # vupkd3d128 v3, v3, 1\n  .long 0x18641FF0\n  blr\n  #_ REGISTER_OUT v3 [40400000, 7FC00000, 00000000, 3f800000]\n\ntest_vupkd3d128_short4_0:\n  #_ REGISTER_IN v3 [CDCDCDCD, CDCDCDCD, 7FFFFFFF, 007FFFF8]\n  # vupkd3d128 v3, v3, 4\n  .long 0x18701FF0\n  blr\n  #_ REGISTER_OUT v3 [40407FFF, 403FFFFF, 4040007F, 403FFFF8]\n\ntest_vupkd3d128_float16_2_0:\n  #_ REGISTER_IN v3 [CDCDCDCD, CDCDCDCD, CDCDCDCD, 3800B800]\n  # vupkd3d128 v3, v3, 3\n  .long 0x186C1FF0\n  blr\n  #_ REGISTER_OUT v3 [3F000000, BF000000, 00000000, 3f800000]\n\ntest_vupkd3d128_float16_4_0:\n  #_ REGISTER_IN v3 [CDCDCDCD, CDCDCDCD, 3800B801, 3802B803]\n  # vupkd3d128 v3, v3, 5\n  .long 0x18741FF0\n  blr\n  #_ REGISTER_OUT v3 [3F000000, bf002000, 3f004000, bf006000]\n\ntest_vupkd3d128_uint_2101010_0:\n  #_ REGISTER_IN v3 [CDCDCDCD, CDCDCDCD, CDCDCDCD, 400001FF]\n  # vupkd3d128 v3, v3, 2\n  .long 0x18681FF0\n  blr\n  #_ REGISTER_OUT v3 [404001FF, 40400000, 40400000, 3F800001]\ntest_vupkd3d128_uint_2101010_1:\n  #_ REGISTER_IN v3 [CDCDCDCD, CDCDCDCD, CDCDCDCD, 40000201]\n  # vupkd3d128 v3, v3, 2\n  .long 0x18681FF0\n  blr\n  #_ REGISTER_OUT v3 [403FFE01, 40400000, 40400000, 3F800001]\ntest_vupkd3d128_uint_2101010_2:\n  #_ REGISTER_IN v3 [CDCDCDCD, CDCDCDCD, CDCDCDCD, 40000200]\n  # vupkd3d128 v3, v3, 2\n  .long 0x18681FF0\n  blr\n  #_ REGISTER_OUT v3 [7FC00000, 40400000, 40400000, 3F800001]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vupkhsb.s",
    "content": "test_vupkhsb_1:\n  # {-8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7}\n  #_ REGISTER_IN v3 [F8F9FAFB, FCFDFEFF, 00010203, 04050607]\n  vupkhsb v3, v3\n  blr\n  # {-8, -7, -6, -5, -4, -3, -2, -1}\n  #_ REGISTER_OUT v3 [FFF8FFF9, FFFAFFFB, FFFCFFFD, FFFEFFFF]\n\ntest_vupkhsb_2:\n  # {0, 255, 255, 0, 0, 0, 255, 0, 255, 0, 0, 255, 255, 255, 0, 255}\n  #_ REGISTER_IN v3 [00FFFF00, 0000FF00, FF0000FF, FFFF00FF]\n  vupkhsb v3, v3\n  blr\n  # {0, 65535, 65535, 0, 0, 0, 65535, 0}\n  #_ REGISTER_OUT v3 [0000FFFF, FFFF0000, 00000000, FFFF0000]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vupkhsb128.s",
    "content": "test_vupkhsb128_1:\n  # {-8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7}\n  #_ REGISTER_IN v3 [F8F9FAFB, FCFDFEFF, 00010203, 04050607]\n  vupkhsb128 v3, v3\n  blr\n  # {-8, -7, -6, -5, -4, -3, -2, -1}\n  #_ REGISTER_OUT v3 [FFF8FFF9, FFFAFFFB, FFFCFFFD, FFFEFFFF]\n\ntest_vupkhsb128_2:\n  # {0, 255, 255, 0, 0, 0, 255, 0, 255, 0, 0, 255, 255, 255, 0, 255}\n  #_ REGISTER_IN v3 [00FFFF00, 0000FF00, FF0000FF, FFFF00FF]\n  vupkhsb128 v3, v3\n  blr\n  # {0, 65535, 65535, 0, 0, 0, 65535, 0}\n  #_ REGISTER_OUT v3 [0000FFFF, FFFF0000, 00000000, FFFF0000]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vupkhsh.s",
    "content": "test_vupkhsh_1:\n  #_ REGISTER_IN v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  vupkhsh v3, v3\n  blr\n  #_ REGISTER_OUT v3 [00000001, 00000203, 00000405, 00000607]\n\ntest_vupkhsh_2:\n  #_ REGISTER_IN v3 [7F800203, 04050607, 7F800A0B, 0C0D0E0F]\n  vupkhsh v3, v3\n  blr\n  #_ REGISTER_OUT v3 [00007f80, 00000203, 00000405, 00000607]\n\ntest_vupkhsh_3:\n  # {0, 65535, 65535, 0, 0, 0, 65535, 0}\n  #_ REGISTER_IN v3 [0000FFFF, FFFF0000, 00000000, FFFF0000]\n  vupkhsh v3, v3\n  blr\n  # {0, 4294967295, 4294967295, 0}\n  #_ REGISTER_OUT v3 [00000000, FFFFFFFF, FFFFFFFF, 00000000]\n\ntest_vupkhsh_4:\n  # {-4, -3, -2, -1, 0, 1, 2, 3}\n  #_ REGISTER_IN v3 [FFFCFFFD, FFFEFFFF, 00000001, 00020003]\n  vupkhsh v3, v3\n  blr\n  # {-4, -3, -2, -1}\n  #_ REGISTER_OUT v3 [FFFFFFFC, FFFFFFFD, FFFFFFFE, FFFFFFFF]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vupklsb.s",
    "content": "test_vupklsb_1:\n  # {-8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7}\n  #_ REGISTER_IN v3 [F8F9FAFB, FCFDFEFF, 00010203, 04050607]\n  vupklsb v3, v3\n  blr\n  # {0, 1, 2, 3, 4, 5, 6, 7}\n  #_ REGISTER_OUT v3 [00000001, 00020003, 00040005, 00060007]\n\ntest_vupklsb_2:\n  # {0, 255, 255, 0, 0, 0, 255, 0, 255, 0, 0, 255, 255, 255, 0, 255}\n  #_ REGISTER_IN v3 [00FFFF00, 0000FF00, FF0000FF, FFFF00FF]\n  vupklsb v3, v3\n  blr\n  # {65535, 0, 0, 65535, 65535, 65535, 0, 65535}\n  #_ REGISTER_OUT v3 [FFFF0000, 0000FFFF, FFFFFFFF, 0000FFFF]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vupklsb128.s",
    "content": "test_vupklsb128_1:\n  # {-8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7}\n  #_ REGISTER_IN v3 [F8F9FAFB, FCFDFEFF, 00010203, 04050607]\n  vupklsb128 v3, v3\n  blr\n  # {0, 1, 2, 3, 4, 5, 6, 7}\n  #_ REGISTER_OUT v3 [00000001, 00020003, 00040005, 00060007]\n\ntest_vupklsb128_2:\n  # {0, 255, 255, 0, 0, 0, 255, 0, 255, 0, 0, 255, 255, 255, 0, 255}\n  #_ REGISTER_IN v3 [00FFFF00, 0000FF00, FF0000FF, FFFF00FF]\n  vupklsb128 v3, v3\n  blr\n  # {65535, 0, 0, 65535, 65535, 65535, 0, 65535}\n  #_ REGISTER_OUT v3 [FFFF0000, 0000FFFF, FFFFFFFF, 0000FFFF]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vupklsh.s",
    "content": "test_vupklsh_1:\n  #_ REGISTER_IN v3 [00010203, 04050607, 08090A0B, 0C0D0E0F]\n  vupklsh v3, v3\n  blr\n  #_ REGISTER_OUT v3 [00000809, 00000a0b, 00000c0d, 00000e0f]\n\ntest_vupklsh_2:\n  #_ REGISTER_IN v3 [7F800203, 04050607, 7F800A0B, 0C0D0E0F]\n  vupklsh v3, v3\n  blr\n  #_ REGISTER_OUT v3 [00007f80, 00000a0b, 00000c0d, 00000e0f]\n\ntest_vupklsh_3:\n  # {-4, -3, -2, -1, 0, 1, 2, 3}\n  #_ REGISTER_IN v3 [FFFCFFFD, FFFEFFFF, 00000001, 00020003]\n  vupklsh v3, v3\n  blr\n  # {-4, -3, -2, -1}\n  #_ REGISTER_OUT v3 [00000000, 00000001, 00000002, 00000003]\n\ntest_vupklsh_4:\n  # {0, 65535, 65535, 0, 0, 0, 65535, 0}\n  #_ REGISTER_IN v3 [0000FFFF, FFFF0000, 00000000, FFFF0000]\n  vupklsh v3, v3\n  blr\n  # {0, 0, 4294967295, 0}\n  #_ REGISTER_OUT v3 [00000000, 00000000, FFFFFFFF, 00000000]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vxor.s",
    "content": "test_vxor_1:\n  #_ REGISTER_IN v3 [FFFF0101, 7070FFFF, FFFFFFFF, 00000000]\n  #_ REGISTER_IN v4 [80081010, 808F0000, 7FFFFFFF, 8FFFFFFF]\n  vxor v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [FFFF0101, 7070FFFF, FFFFFFFF, 00000000]\n  #_ REGISTER_OUT v4 [80081010, 808F0000, 7FFFFFFF, 8FFFFFFF]\n  #_ REGISTER_OUT v5 [7FF71111, F0FFFFFF, 80000000, 8FFFFFFF]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/instr_vxor128.s",
    "content": "test_vxor128_1:\n  #_ REGISTER_IN v3 [FFFF0101, 7070FFFF, FFFFFFFF, 00000000]\n  #_ REGISTER_IN v4 [80081010, 808F0000, 7FFFFFFF, 8FFFFFFF]\n  vxor128 v5, v3, v4\n  blr\n  #_ REGISTER_OUT v3 [FFFF0101, 7070FFFF, FFFFFFFF, 00000000]\n  #_ REGISTER_OUT v4 [80081010, 808F0000, 7FFFFFFF, 8FFFFFFF]\n  #_ REGISTER_OUT v5 [7FF71111, F0FFFFFF, 80000000, 8FFFFFFF]\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/ppc_testing_main.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/console_app_main.h\"\n#include \"xenia/base/cvar.h\"\n#include \"xenia/base/filesystem.h\"\n#include \"xenia/base/literals.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/platform.h\"\n#include \"xenia/base/string_buffer.h\"\n#include \"xenia/cpu/cpu_flags.h\"\n#include \"xenia/cpu/ppc/ppc_context.h\"\n#include \"xenia/cpu/ppc/ppc_frontend.h\"\n#include \"xenia/cpu/processor.h\"\n#include \"xenia/cpu/raw_module.h\"\n\n#if XE_ARCH_AMD64\n#include \"xenia/cpu/backend/x64/x64_backend.h\"\n#endif  // XE_ARCH\n\n#if XE_COMPILER_MSVC\n#include \"xenia/base/platform_win.h\"\n#endif  // XE_COMPILER_MSVC\n\nDEFINE_path(test_path, \"src/xenia/cpu/ppc/testing/\",\n            \"Directory scanned for test files.\", \"Other\");\nDEFINE_path(test_bin_path, \"src/xenia/cpu/ppc/testing/bin/\",\n            \"Directory with binary outputs of the test files.\", \"Other\");\nDEFINE_transient_string(test_name, \"\", \"Test suite name.\", \"General\");\n\nnamespace xe {\nnamespace cpu {\nnamespace test {\n\nusing xe::cpu::ppc::PPCContext;\nusing namespace xe::literals;\n\ntypedef std::vector<std::pair<std::string, std::string>> AnnotationList;\n\nconst uint32_t START_ADDRESS = 0x80000000;\n\nstruct TestCase {\n  TestCase(uint32_t address, std::string& name)\n      : address(address), name(name) {}\n  uint32_t address;\n  std::string name;\n  AnnotationList annotations;\n};\n\nclass TestSuite {\n public:\n  TestSuite(const std::filesystem::path& src_file_path)\n      : src_file_path_(src_file_path) {\n    auto name = src_file_path.filename();\n    name = name.replace_extension();\n\n    name_ = xe::path_to_utf8(name);\n    map_file_path_ = cvars::test_bin_path / name.replace_extension(\".map\");\n    bin_file_path_ = cvars::test_bin_path / name.replace_extension(\".bin\");\n  }\n\n  bool Load() {\n    if (!ReadMap()) {\n      XELOGE(\"Unable to read map for test {}\",\n             xe::path_to_utf8(src_file_path_));\n      return false;\n    }\n    if (!ReadAnnotations()) {\n      XELOGE(\"Unable to read annotations for test {}\",\n             xe::path_to_utf8(src_file_path_));\n      return false;\n    }\n    return true;\n  }\n\n  const std::string& name() const { return name_; }\n  const std::filesystem::path& src_file_path() const { return src_file_path_; }\n  const std::filesystem::path& map_file_path() const { return map_file_path_; }\n  const std::filesystem::path& bin_file_path() const { return bin_file_path_; }\n  std::vector<TestCase>& test_cases() { return test_cases_; }\n\n private:\n  std::string name_;\n  std::filesystem::path src_file_path_;\n  std::filesystem::path map_file_path_;\n  std::filesystem::path bin_file_path_;\n  std::vector<TestCase> test_cases_;\n\n  TestCase* FindTestCase(const std::string_view name) {\n    for (auto& test_case : test_cases_) {\n      if (test_case.name == name) {\n        return &test_case;\n      }\n    }\n    return nullptr;\n  }\n\n  bool ReadMap() {\n    FILE* f = filesystem::OpenFile(map_file_path_, \"r\");\n    if (!f) {\n      return false;\n    }\n    char line_buffer[BUFSIZ];\n    while (fgets(line_buffer, sizeof(line_buffer), f)) {\n      if (!strlen(line_buffer)) {\n        continue;\n      }\n      // 0000000000000000 t test_add1\\n\n      char* newline = strrchr(line_buffer, '\\n');\n      if (newline) {\n        *newline = 0;\n      }\n      char* t_test_ = strstr(line_buffer, \" t test_\");\n      if (!t_test_) {\n        continue;\n      }\n      std::string address(line_buffer, t_test_ - line_buffer);\n      std::string name(t_test_ + strlen(\" t test_\"));\n      test_cases_.emplace_back(START_ADDRESS + std::stoul(address, 0, 16),\n                               name);\n    }\n    fclose(f);\n    return true;\n  }\n\n  bool ReadAnnotations() {\n    TestCase* current_test_case = nullptr;\n    FILE* f = filesystem::OpenFile(src_file_path_, \"r\");\n    if (!f) {\n      return false;\n    }\n    char line_buffer[BUFSIZ];\n    while (fgets(line_buffer, sizeof(line_buffer), f)) {\n      if (!strlen(line_buffer)) {\n        continue;\n      }\n      // Eat leading whitespace.\n      char* start = line_buffer;\n      while (*start == ' ') {\n        ++start;\n      }\n      if (strncmp(start, \"test_\", strlen(\"test_\")) == 0) {\n        // Global test label.\n        std::string label(start + strlen(\"test_\"), strchr(start, ':'));\n        current_test_case = FindTestCase(label);\n        if (!current_test_case) {\n          XELOGE(\"Test case {} not found in corresponding map for {}\", label,\n                 xe::path_to_utf8(src_file_path_));\n          return false;\n        }\n      } else if (strlen(start) > 3 && start[0] == '#' && start[1] == '_') {\n        // Annotation.\n        // We don't actually verify anything here.\n        char* next_space = strchr(start + 3, ' ');\n        if (next_space) {\n          // Looks legit.\n          std::string key(start + 3, next_space);\n          std::string value(next_space + 1);\n          while (value.find_last_of(\" \\t\\n\") == value.size() - 1) {\n            value.erase(value.end() - 1);\n          }\n          if (!current_test_case) {\n            XELOGE(\"Annotation outside of test case in {}\",\n                   xe::path_to_utf8(src_file_path_));\n            return false;\n          }\n          current_test_case->annotations.emplace_back(key, value);\n        }\n      }\n    }\n    fclose(f);\n    return true;\n  }\n};\n\nclass TestRunner {\n public:\n  TestRunner() : memory_size_(64_MiB) {\n    memory_.reset(new Memory());\n    memory_->Initialize();\n  }\n\n  ~TestRunner() {\n    thread_state_.reset();\n    processor_.reset();\n    memory_.reset();\n  }\n\n  bool Setup(TestSuite& suite) {\n    // Reset memory.\n    memory_->Reset();\n\n    std::unique_ptr<xe::cpu::backend::Backend> backend;\n    if (!backend) {\n#if XE_ARCH_AMD64\n      if (cvars::cpu == \"x64\") {\n        backend.reset(new xe::cpu::backend::x64::X64Backend());\n      }\n#endif  // XE_ARCH\n      if (cvars::cpu == \"any\") {\n        if (!backend) {\n#if XE_ARCH_AMD64\n          backend.reset(new xe::cpu::backend::x64::X64Backend());\n#endif  // XE_ARCH\n        }\n      }\n    }\n\n    // Setup a fresh processor.\n    processor_.reset(new Processor(memory_.get(), nullptr));\n    processor_->Setup(std::move(backend));\n    processor_->set_debug_info_flags(DebugInfoFlags::kDebugInfoAll);\n\n    // Load the binary module.\n    auto module = std::make_unique<xe::cpu::RawModule>(processor_.get());\n    if (!module->LoadFile(START_ADDRESS, suite.bin_file_path())) {\n      XELOGE(\"Unable to load test binary {}\",\n             xe::path_to_utf8(suite.bin_file_path()));\n      return false;\n    }\n    processor_->AddModule(std::move(module));\n\n    processor_->backend()->CommitExecutableRange(START_ADDRESS,\n                                                 START_ADDRESS + 1024 * 1024);\n\n    // Add dummy space for memory.\n    processor_->memory()->LookupHeap(0)->AllocFixed(\n        0x10001000, 0xEFFF, 0,\n        kMemoryAllocationReserve | kMemoryAllocationCommit,\n        kMemoryProtectRead | kMemoryProtectWrite);\n\n    // Simulate a thread.\n    uint32_t stack_size = 64 * 1024;\n    uint32_t stack_address = START_ADDRESS - stack_size;\n    uint32_t pcr_address = stack_address - 0x1000;\n    thread_state_.reset(\n        new ThreadState(processor_.get(), 0x100, stack_address, pcr_address));\n\n    return true;\n  }\n\n  bool Run(TestCase& test_case) {\n    // Setup test state from annotations.\n    if (!SetupTestState(test_case)) {\n      XELOGE(\"Test setup failed\");\n      return false;\n    }\n\n    // Execute test.\n    auto fn = processor_->ResolveFunction(test_case.address);\n    if (!fn) {\n      XELOGE(\"Entry function not found\");\n      return false;\n    }\n\n    auto ctx = thread_state_->context();\n    ctx->lr = 0xBCBCBCBC;\n    fn->Call(thread_state_.get(), uint32_t(ctx->lr));\n\n    // Assert test state expectations.\n    bool result = CheckTestResults(test_case);\n    if (!result) {\n      // Also dump all disasm/etc.\n      if (fn->is_guest()) {\n        static_cast<xe::cpu::GuestFunction*>(fn)->debug_info()->Dump();\n      }\n    }\n\n    return result;\n  }\n\n  bool SetupTestState(TestCase& test_case) {\n    auto ppc_context = thread_state_->context();\n    for (auto& it : test_case.annotations) {\n      if (it.first == \"REGISTER_IN\") {\n        size_t space_pos = it.second.find(\" \");\n        auto reg_name = it.second.substr(0, space_pos);\n        auto reg_value = it.second.substr(space_pos + 1);\n        ppc_context->SetRegFromString(reg_name.c_str(), reg_value.c_str());\n      } else if (it.first == \"MEMORY_IN\") {\n        size_t space_pos = it.second.find(\" \");\n        auto address_str = it.second.substr(0, space_pos);\n        auto bytes_str = it.second.substr(space_pos + 1);\n        uint32_t address = std::strtoul(address_str.c_str(), nullptr, 16);\n        auto p = memory_->TranslateVirtual(address);\n        const char* c = bytes_str.c_str();\n        while (*c) {\n          while (*c == ' ') ++c;\n          if (!*c) {\n            break;\n          }\n          char ccs[3] = {c[0], c[1], 0};\n          c += 2;\n          uint32_t b = std::strtoul(ccs, nullptr, 16);\n          *p = static_cast<uint8_t>(b);\n          ++p;\n        }\n      }\n    }\n    return true;\n  }\n\n  bool CheckTestResults(TestCase& test_case) {\n    auto ppc_context = thread_state_->context();\n\n    bool any_failed = false;\n    for (auto& it : test_case.annotations) {\n      if (it.first == \"REGISTER_OUT\") {\n        size_t space_pos = it.second.find(\" \");\n        auto reg_name = it.second.substr(0, space_pos);\n        auto reg_value = it.second.substr(space_pos + 1);\n        std::string actual_value;\n        if (!ppc_context->CompareRegWithString(\n                reg_name.c_str(), reg_value.c_str(), actual_value)) {\n          any_failed = true;\n          XELOGE(\"Register {} assert failed:\\n\", reg_name);\n          XELOGE(\"  Expected: {} == {}\\n\", reg_name, reg_value);\n          XELOGE(\"    Actual: {} == {}\\n\", reg_name, actual_value);\n        }\n      } else if (it.first == \"MEMORY_OUT\") {\n        size_t space_pos = it.second.find(\" \");\n        auto address_str = it.second.substr(0, space_pos);\n        auto bytes_str = it.second.substr(space_pos + 1);\n        uint32_t address = std::strtoul(address_str.c_str(), nullptr, 16);\n        auto base_address = memory_->TranslateVirtual(address);\n        auto p = base_address;\n        const char* c = bytes_str.c_str();\n        bool failed = false;\n        size_t count = 0;\n        StringBuffer expecteds;\n        StringBuffer actuals;\n        while (*c) {\n          while (*c == ' ') ++c;\n          if (!*c) {\n            break;\n          }\n          char ccs[3] = {c[0], c[1], 0};\n          c += 2;\n          count++;\n          uint32_t current_address =\n              address + static_cast<uint32_t>(p - base_address);\n          uint32_t expected = std::strtoul(ccs, nullptr, 16);\n          uint8_t actual = *p;\n\n          expecteds.AppendFormat(\" {:02X}\", expected);\n          actuals.AppendFormat(\" {:02X}\", actual);\n\n          if (expected != actual) {\n            any_failed = true;\n            failed = true;\n          }\n          ++p;\n        }\n        if (failed) {\n          XELOGE(\"Memory {} assert failed:\\n\", address_str);\n          XELOGE(\"  Expected:{}\\n\", expecteds.to_string());\n          XELOGE(\"    Actual:{}\\n\", actuals.to_string());\n        }\n      }\n    }\n    return !any_failed;\n  }\n\n  size_t memory_size_;\n  std::unique_ptr<Memory> memory_;\n  std::unique_ptr<Processor> processor_;\n  std::unique_ptr<ThreadState> thread_state_;\n};\n\nbool DiscoverTests(const std::filesystem::path& test_path,\n                   std::vector<std::filesystem::path>& test_files) {\n  auto file_infos = xe::filesystem::ListFiles(test_path);\n  for (auto& file_info : file_infos) {\n    if (file_info.name.extension() == \".s\") {\n      test_files.push_back(test_path / file_info.name);\n    }\n  }\n  return true;\n}\n\n#if XE_COMPILER_MSVC\nint filter(unsigned int code) {\n  if (code == EXCEPTION_ILLEGAL_INSTRUCTION) {\n    return EXCEPTION_EXECUTE_HANDLER;\n  }\n  return EXCEPTION_CONTINUE_SEARCH;\n}\n#endif  // XE_COMPILER_MSVC\n\nvoid ProtectedRunTest(TestSuite& test_suite, TestRunner& runner,\n                      TestCase& test_case, int& failed_count,\n                      int& passed_count) {\n#if XE_COMPILER_MSVC\n  __try {\n#endif  // XE_COMPILER_MSVC\n\n    if (!runner.Setup(test_suite)) {\n      XELOGE(\"    TEST FAILED SETUP\");\n      ++failed_count;\n    }\n    if (runner.Run(test_case)) {\n      ++passed_count;\n    } else {\n      XELOGE(\"    TEST FAILED\");\n      ++failed_count;\n    }\n\n#if XE_COMPILER_MSVC\n  } __except (filter(GetExceptionCode())) {\n    XELOGE(\"    TEST FAILED (UNSUPPORTED INSTRUCTION)\");\n    ++failed_count;\n  }\n#endif  // XE_COMPILER_MSVC\n}\n\nbool RunTests(const std::string_view test_name) {\n  int result_code = 1;\n  int failed_count = 0;\n  int passed_count = 0;\n\n#if XE_ARCH_AMD64\n  XELOGI(\"Instruction feature mask {}.\", cvars::x64_extension_mask);\n#endif  // XE_ARCH_AMD64\n\n  auto test_path_root = cvars::test_path;\n  std::vector<std::filesystem::path> test_files;\n  if (!DiscoverTests(test_path_root, test_files)) {\n    return false;\n  }\n  if (!test_files.size()) {\n    XELOGE(\"No tests discovered - invalid path?\");\n    return false;\n  }\n  XELOGI(\"{} tests discovered.\", test_files.size());\n  XELOGI(\"\");\n\n  std::vector<TestSuite> test_suites;\n  bool load_failed = false;\n  for (auto& test_path : test_files) {\n    TestSuite test_suite(test_path);\n    if (!test_name.empty() && test_suite.name() != test_name) {\n      continue;\n    }\n    if (!test_suite.Load()) {\n      XELOGE(\"TEST SUITE {} FAILED TO LOAD\", xe::path_to_utf8(test_path));\n      load_failed = true;\n      continue;\n    }\n    test_suites.push_back(std::move(test_suite));\n  }\n  if (load_failed) {\n    XELOGE(\"One or more test suites failed to load.\");\n  }\n\n  XELOGI(\"{} tests loaded.\", test_suites.size());\n  TestRunner runner;\n  for (auto& test_suite : test_suites) {\n    XELOGI(\"{}.s:\", test_suite.name());\n\n    for (auto& test_case : test_suite.test_cases()) {\n      XELOGI(\"  - {}\", test_case.name);\n      ProtectedRunTest(test_suite, runner, test_case, failed_count,\n                       passed_count);\n    }\n\n    XELOGI(\"\");\n  }\n\n  XELOGI(\"\");\n  XELOGI(\"Total tests: {}\", failed_count + passed_count);\n  XELOGI(\"Passed: {}\", passed_count);\n  XELOGI(\"Failed: {}\", failed_count);\n\n  return failed_count ? false : true;\n}\n\nint main(const std::vector<std::string>& args) {\n  return RunTests(cvars::test_name) ? 0 : 1;\n}\n\n}  // namespace test\n}  // namespace cpu\n}  // namespace xe\n\nXE_DEFINE_CONSOLE_APP(\"xenia-cpu-ppc-test\", xe::cpu::test::main, \"[test name]\",\n                      \"test_name\");\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/ppc_testing_native_main.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/console_app_main.h\"\n#include \"xenia/base/cvar.h\"\n#include \"xenia/base/filesystem.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/main.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/memory.h\"\n#include \"xenia/base/platform.h\"\n#include \"xenia/base/string_util.h\"\n\n#if XE_COMPILER_MSVC\n#include \"xenia/base/platform_win.h\"\n#endif  // XE_COMPILER_MSVC\n\nDEFINE_string(test_path, \"src/xenia/cpu/ppc/testing/\",\n              \"Directory scanned for test files.\");\nDEFINE_string(test_bin_path, \"src/xenia/cpu/ppc/testing/bin/\",\n              \"Directory with binary outputs of the test files.\");\nDEFINE_transient_string(test_name, \"\", \"Test suite name.\", \"General\");\n\nextern \"C\" void xe_call_native(void* context, void* fn);\n\nnamespace xe {\nnamespace cpu {\nnamespace test {\n\nstruct Context {\n  uint64_t r[32];  // 0x000\n  double f[32];    // 0x100\n  vec128_t v[32];  // 0x200 For now, only support 32 vector registers.\n  uint32_t cr;     // 0x400 Condition register\n  uint64_t fpscr;  // 0x404 FPSCR\n};\n\ntypedef std::vector<std::pair<std::string, std::string>> AnnotationList;\n\nconst uint32_t START_ADDRESS = 0x00000000;\n\nstruct TestCase {\n  TestCase(uint32_t address, std::string& name)\n      : address(address), name(name) {}\n  uint32_t address;\n  std::string name;\n  AnnotationList annotations;\n};\n\nclass TestSuite {\n public:\n  TestSuite(const std::wstring& src_file_path) : src_file_path(src_file_path) {\n    name = src_file_path.substr(src_file_path.find_last_of(xe::kPathSeparator) +\n                                1);\n    name = ReplaceExtension(name, L\"\");\n    map_file_path = xe::to_wstring(cvars::test_bin_path) + name + L\".map\";\n    bin_file_path = xe::to_wstring(cvars::test_bin_path) + name + L\".bin\";\n  }\n\n  bool Load() {\n    if (!ReadMap(map_file_path)) {\n      XELOGE(\"Unable to read map for test %ls\", src_file_path.c_str());\n      return false;\n    }\n    if (!ReadAnnotations(src_file_path)) {\n      XELOGE(\"Unable to read annotations for test %ls\", src_file_path.c_str());\n      return false;\n    }\n    return true;\n  }\n\n  std::wstring name;\n  std::wstring src_file_path;\n  std::wstring map_file_path;\n  std::wstring bin_file_path;\n  std::vector<TestCase> test_cases;\n\n private:\n  std::wstring ReplaceExtension(const std::wstring& path,\n                                const std::wstring& new_extension) {\n    std::wstring result = path;\n    auto last_dot = result.find_last_of('.');\n    result.replace(result.begin() + last_dot, result.end(), new_extension);\n    return result;\n  }\n\n  TestCase* FindTestCase(const std::string_view name) {\n    for (auto& test_case : test_cases) {\n      if (test_case.name == name) {\n        return &test_case;\n      }\n    }\n    return nullptr;\n  }\n\n  bool ReadMap(const std::wstring& map_file_path) {\n    FILE* f = fopen(xe::to_string(map_file_path).c_str(), \"r\");\n    if (!f) {\n      return false;\n    }\n    char line_buffer[BUFSIZ];\n    while (fgets(line_buffer, sizeof(line_buffer), f)) {\n      if (!strlen(line_buffer)) {\n        continue;\n      }\n      // 0000000000000000 t test_add1\\n\n      char* newline = strrchr(line_buffer, '\\n');\n      if (newline) {\n        *newline = 0;\n      }\n      char* t_test_ = strstr(line_buffer, \" t test_\");\n      if (!t_test_) {\n        continue;\n      }\n      std::string address(line_buffer, t_test_ - line_buffer);\n      std::string name(t_test_ + strlen(\" t test_\"));\n      test_cases.emplace_back(START_ADDRESS + std::stoul(address, 0, 16), name);\n    }\n    fclose(f);\n    return true;\n  }\n\n  bool ReadAnnotations(const std::wstring& src_file_path) {\n    TestCase* current_test_case = nullptr;\n    FILE* f = fopen(xe::to_string(src_file_path).c_str(), \"r\");\n    if (!f) {\n      return false;\n    }\n    char line_buffer[BUFSIZ];\n    while (fgets(line_buffer, sizeof(line_buffer), f)) {\n      if (!strlen(line_buffer)) {\n        continue;\n      }\n      // Eat leading whitespace.\n      char* start = line_buffer;\n      while (*start == ' ') {\n        ++start;\n      }\n      if (strncmp(start, \"test_\", strlen(\"test_\")) == 0) {\n        // Global test label.\n        std::string label(start + strlen(\"test_\"), strchr(start, ':'));\n        current_test_case = FindTestCase(label);\n        if (!current_test_case) {\n          XELOGE(\"Test case %s not found in corresponding map for %ls\",\n                 label.c_str(), src_file_path.c_str());\n          return false;\n        }\n      } else if (strlen(start) > 3 && start[0] == '#' && start[1] == '_') {\n        // Annotation.\n        // We don't actually verify anything here.\n        char* next_space = strchr(start + 3, ' ');\n        if (next_space) {\n          // Looks legit.\n          std::string key(start + 3, next_space);\n          std::string value(next_space + 1);\n          while (value.find_last_of(\" \\t\\n\") == value.size() - 1) {\n            value.erase(value.end() - 1);\n          }\n          if (!current_test_case) {\n            XELOGE(\"Annotation outside of test case in %ls\",\n                   src_file_path.c_str());\n            return false;\n          }\n          current_test_case->annotations.emplace_back(key, value);\n        }\n      }\n    }\n    fclose(f);\n    return true;\n  }\n};\n\nclass TestRunner {\n public:\n  TestRunner() {\n    memory_size_ = 64 * 1024 * 1024;\n    // FIXME(Triang3l): If this is ever compiled for a platform without\n    // xe::memory::IsWritableExecutableMemorySupported, two memory mappings must\n    // be used.\n    memory_ = memory::AllocFixed(nullptr, memory_size_,\n                                 memory::AllocationType::kReserveCommit,\n                                 memory::PageAccess::kExecuteReadWrite);\n\n    context_ = memory::AlignedAlloc<Context>(32);\n    std::memset(context_, 0, sizeof(Context));\n  }\n\n  ~TestRunner() {\n    memory::DeallocFixed(memory_, memory_size_,\n                         memory::DeallocationType::kRelease);\n\n    memory::AlignedFree(context_);\n  }\n\n  bool Setup(TestSuite& suite) {\n    FILE* file = filesystem::OpenFile(suite.bin_file_path, \"rb\");\n    if (!file) {\n      XELOGE(\"Failed to open file %ls!\", suite.bin_file_path.c_str());\n      return false;\n    }\n\n    fseek(file, 0, SEEK_END);\n    uint32_t file_length = static_cast<uint32_t>(ftell(file));\n    fseek(file, 0, SEEK_SET);\n\n    if (file_length > memory_size_) {\n      XELOGE(\"Bin file %ls is too big!\", suite.bin_file_path.c_str());\n      return false;\n    }\n\n    // Read entire file into our memory.\n    fread(memory_, file_length, 1, file);\n    fclose(file);\n\n    // Zero out the context\n    std::memset(context_, 0, sizeof(Context));\n    return true;\n  }\n\n  bool Run(TestCase& test_case) {\n    // Setup test state from annotations.\n    if (!SetupTestState(test_case)) {\n      XELOGE(\"Test setup failed\");\n      return false;\n    }\n\n    // Execute test.\n    xe_call_native(reinterpret_cast<void*>(context_),\n                   reinterpret_cast<uint8_t*>(memory_) + test_case.address);\n    return CheckTestResults(test_case);\n  }\n\n  bool CompareRegWithString(const char* name, const char* value,\n                            char* out_value, size_t out_value_size,\n                            Context* ctx) const {\n    int n;\n    if (sscanf(name, \"r%d\", &n) == 1) {\n      uint64_t expected = string_util::from_string<uint64_t>(value);\n      if (ctx->r[n] != expected) {\n        std::snprintf(out_value, out_value_size, \"%016\" PRIX64, ctx->r[n]);\n        return false;\n      }\n    } else if (sscanf(name, \"f%d\", &n) == 1) {\n      if (std::strstr(value, \"0x\")) {\n        // Special case: Treat float as integer.\n        uint64_t expected = string_util::from_string<uint64_t>(value, true);\n\n        union {\n          double f;\n          uint64_t u;\n        } f2u;\n        f2u.f = ctx->f[n];\n\n        if (f2u.u != expected) {\n          std::snprintf(out_value, out_value_size, \"%016\" PRIX64, f2u.u);\n          return false;\n        }\n      } else {\n        double expected = string_util::from_string<double>(value);\n\n        // TODO(benvanik): epsilon\n        if (ctx->f[n] != expected) {\n          std::snprintf(out_value, out_value_size, \"%f\", ctx->f[n]);\n          return false;\n        }\n      }\n    } else if (sscanf(name, \"v%d\", &n) == 1) {\n      vec128_t expected = string_util::from_string<vec128_t>(value);\n      if (ctx->v[n] != expected) {\n        std::snprintf(out_value, out_value_size, \"[%.8X, %.8X, %.8X, %.8X]\",\n                      ctx->v[n].i32[0], ctx->v[n].i32[1], ctx->v[n].i32[2],\n                      ctx->v[n].i32[3]);\n        return false;\n      }\n    } else if (std::strcmp(name, \"cr\") == 0) {\n      uint64_t actual = ctx->cr;\n      uint64_t expected = string_util::from_string<uint64_t>(value);\n      if (actual != expected) {\n        std::snprintf(out_value, out_value_size, \"%016\" PRIX64, actual);\n        return false;\n      }\n    } else {\n      assert_always(\"Unrecognized register name: %s\\n\", name);\n      return false;\n    }\n\n    return true;\n  }\n\n  bool SetRegFromString(const char* name, const char* value, Context* ctx) {\n    int n;\n    if (sscanf(name, \"r%d\", &n) == 1) {\n      ctx->r[n] = string_util::from_string<uint64_t>(value);\n    } else if (sscanf(name, \"f%d\", &n) == 1) {\n      ctx->f[n] = string_util::from_string<double>(value);\n    } else if (sscanf(name, \"v%d\", &n) == 1) {\n      ctx->v[n] = string_util::from_string<vec128_t>(value);\n    } else if (std::strcmp(name, \"cr\") == 0) {\n      ctx->cr = uint32_t(string_util::from_string<uint64_t>(value));\n    } else {\n      printf(\"Unrecognized register name: %s\\n\", name);\n      return false;\n    }\n\n    return true;\n  }\n\n  bool SetupTestState(TestCase& test_case) {\n    for (auto& it : test_case.annotations) {\n      if (it.first == \"REGISTER_IN\") {\n        size_t space_pos = it.second.find(\" \");\n        auto reg_name = it.second.substr(0, space_pos);\n        auto reg_value = it.second.substr(space_pos + 1);\n        if (!SetRegFromString(reg_name.c_str(), reg_value.c_str(), context_)) {\n          return false;\n        }\n      } else if (it.first == \"MEMORY_IN\") {\n        XELOGW(\"Warning: MEMORY_IN unimplemented\");\n        return false;\n        /*\n        size_t space_pos = it.second.find(\" \");\n        auto address_str = it.second.substr(0, space_pos);\n        auto bytes_str = it.second.substr(space_pos + 1);\n        uint32_t address = std::strtoul(address_str.c_str(), nullptr, 16);\n        auto p = memory->TranslateVirtual(address);\n        const char* c = bytes_str.c_str();\n        while (*c) {\n          while (*c == ' ') ++c;\n          if (!*c) {\n            break;\n          }\n          char ccs[3] = {c[0], c[1], 0};\n          c += 2;\n          uint32_t b = std::strtoul(ccs, nullptr, 16);\n          *p = static_cast<uint8_t>(b);\n          ++p;\n        }\n        */\n      }\n    }\n    return true;\n  }\n\n  bool CheckTestResults(TestCase& test_case) {\n    char actual_value[2048];\n\n    bool any_failed = false;\n    for (auto& it : test_case.annotations) {\n      if (it.first == \"REGISTER_OUT\") {\n        size_t space_pos = it.second.find(\" \");\n        auto reg_name = it.second.substr(0, space_pos);\n        auto reg_value = it.second.substr(space_pos + 1);\n        if (!CompareRegWithString(reg_name.c_str(), reg_value.c_str(),\n                                  actual_value, xe::countof(actual_value),\n                                  context_)) {\n          any_failed = true;\n          XELOGE(\"Register %s assert failed:\\n\", reg_name.c_str());\n          XELOGE(\"  Expected: %s == %s\\n\", reg_name.c_str(), reg_value.c_str());\n          XELOGE(\"    Actual: %s == %s\\n\", reg_name.c_str(), actual_value);\n        }\n      } else if (it.first == \"MEMORY_OUT\") {\n        XELOGW(\"Warning: MEMORY_OUT unimplemented\");\n        any_failed = true;\n        /*\n        size_t space_pos = it.second.find(\" \");\n        auto address_str = it.second.substr(0, space_pos);\n        auto bytes_str = it.second.substr(space_pos + 1);\n        uint32_t address = std::strtoul(address_str.c_str(), nullptr, 16);\n        auto base_address = memory->TranslateVirtual(address);\n        auto p = base_address;\n        const char* c = bytes_str.c_str();\n        while (*c) {\n          while (*c == ' ') ++c;\n          if (!*c) {\n            break;\n          }\n          char ccs[3] = {c[0], c[1], 0};\n          c += 2;\n          uint32_t current_address =\n              address + static_cast<uint32_t>(p - base_address);\n          uint32_t expected = std::strtoul(ccs, nullptr, 16);\n          uint8_t actual = *p;\n          if (expected != actual) {\n            any_failed = true;\n            XELOGE(\"Memory %s assert failed:\\n\", address_str.c_str());\n            XELOGE(\"  Expected: %.8X %.2X\\n\", current_address, expected);\n            XELOGE(\"    Actual: %.8X %.2X\\n\", current_address, actual);\n          }\n          ++p;\n        }\n        */\n      }\n    }\n    return !any_failed;\n  }\n\n  void* memory_;\n  size_t memory_size_;\n  Context* context_;\n};\n\nbool DiscoverTests(std::wstring& test_path,\n                   std::vector<std::wstring>& test_files) {\n  auto file_infos = xe::filesystem::ListFiles(test_path);\n  for (auto& file_info : file_infos) {\n    if (file_info.name != L\".\" && file_info.name != L\"..\" &&\n        file_info.name.rfind(L\".s\") == file_info.name.size() - 2) {\n      test_files.push_back(xe::join_paths(test_path, file_info.name));\n    }\n  }\n  return true;\n}\n\n#if XE_COMPILER_MSVC\nint filter(unsigned int code) {\n  if (code == EXCEPTION_ILLEGAL_INSTRUCTION) {\n    return EXCEPTION_EXECUTE_HANDLER;\n  }\n  return EXCEPTION_CONTINUE_SEARCH;\n}\n#endif  // XE_COMPILER_MSVC\n\nvoid ProtectedRunTest(TestSuite& test_suite, TestRunner& runner,\n                      TestCase& test_case, int& failed_count,\n                      int& passed_count) {\n#if XE_COMPILER_MSVC\n  __try {\n#endif  // XE_COMPILER_MSVC\n\n    if (!runner.Setup(test_suite)) {\n      XELOGE(\"    TEST FAILED SETUP\");\n      ++failed_count;\n    }\n    if (runner.Run(test_case)) {\n      ++passed_count;\n    } else {\n      XELOGE(\"    TEST FAILED\");\n      ++failed_count;\n    }\n\n#if XE_COMPILER_MSVC\n  } __except (filter(GetExceptionCode())) {\n    XELOGE(\"    TEST FAILED (UNSUPPORTED INSTRUCTION)\");\n    ++failed_count;\n  }\n#endif  // XE_COMPILER_MSVC\n}\n\nbool RunTests(const std::wstring& test_name) {\n  int result_code = 1;\n  int failed_count = 0;\n  int passed_count = 0;\n\n  auto test_path_root =\n      xe::fix_path_separators(xe::to_wstring(cvars::test_path));\n  std::vector<std::wstring> test_files;\n  if (!DiscoverTests(test_path_root, test_files)) {\n    return false;\n  }\n  if (!test_files.size()) {\n    XELOGE(\"No tests discovered - invalid path?\");\n    return false;\n  }\n  XELOGI(\"%d tests discovered.\", (int)test_files.size());\n  XELOGI(\"\");\n\n  std::vector<TestSuite> test_suites;\n  bool load_failed = false;\n  for (auto& test_path : test_files) {\n    TestSuite test_suite(test_path);\n    if (!test_name.empty() && test_suite.name != test_name) {\n      continue;\n    }\n    if (!test_suite.Load()) {\n      XELOGE(\"TEST SUITE %ls FAILED TO LOAD\", test_path.c_str());\n      load_failed = true;\n      continue;\n    }\n    test_suites.push_back(std::move(test_suite));\n  }\n\n  XELOGI(\"%d tests loaded successfully.\", (int)test_suites.size());\n\n  TestRunner runner;\n  for (auto& test_suite : test_suites) {\n    XELOGI(\"%ls.s:\", test_suite.name.c_str());\n\n    for (auto& test_case : test_suite.test_cases) {\n      XELOGI(\"  - %s\", test_case.name.c_str());\n      ProtectedRunTest(test_suite, runner, test_case, failed_count,\n                       passed_count);\n    }\n\n    XELOGI(\"\");\n  }\n\n  XELOGI(\"\");\n  XELOGI(\"Total tests: %d\", failed_count + passed_count);\n  XELOGI(\"Passed: %d\", passed_count);\n  XELOGI(\"Failed: %d\", failed_count);\n\n  return failed_count ? false : true;\n}\n\nint main(const std::vector<std::string>& args) {\n  return RunTests(cvars::test_name) ? 0 : 1;\n}\n\n}  // namespace test\n}  // namespace cpu\n}  // namespace xe\n\nXE_DEFINE_CONSOLE_APP(\"xenia-cpu-ppc-test\", xe::cpu::test::main, \"[test name]\",\n                      \"test_name\");\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/ppc_testing_native_thunks.s",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2017 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n# r3 = context\n# this does not touch r1, r3, r4, r13\n.load_registers_ctx:\n  lwz   r2, 0x400(r3) # CR\n  mtcrf 0xFF, r2\n\n  lfd   f0, 0x404(r3) # FPSCR\n  mtfsf 0xFF, f0\n\n  li  r2, 0\n  mtxer r2\n\n  # Altivec registers (up to 32)\n  li    r2, 0x200\n  lvx   v0, r3, r2\n  addi  r2, r2, 16\n  lvx   v1, r3, r2\n  addi  r2, r2, 16\n  lvx   v2, r3, r2\n  addi  r2, r2, 16\n  lvx   v3, r3, r2\n  addi  r2, r2, 16\n  lvx   v4, r3, r2\n  addi  r2, r2, 16\n  lvx   v5, r3, r2\n  addi  r2, r2, 16\n  lvx   v6, r3, r2\n  addi  r2, r2, 16\n  lvx   v7, r3, r2\n  addi  r2, r2, 16\n  lvx   v8, r3, r2\n  addi  r2, r2, 16\n  lvx   v9, r3, r2\n  addi  r2, r2, 16\n  lvx   v10, r3, r2\n  addi  r2, r2, 16\n  lvx   v11, r3, r2\n  addi  r2, r2, 16\n  lvx   v12, r3, r2\n  addi  r2, r2, 16\n  lvx   v13, r3, r2\n  addi  r2, r2, 16\n  lvx   v14, r3, r2\n  addi  r2, r2, 16\n  lvx   v15, r3, r2\n  addi  r2, r2, 16\n  lvx   v16, r3, r2\n  addi  r2, r2, 16\n  lvx   v17, r3, r2\n  addi  r2, r2, 16\n  lvx   v18, r3, r2\n  addi  r2, r2, 16\n  lvx   v19, r3, r2\n  addi  r2, r2, 16\n  lvx   v20, r3, r2\n  addi  r2, r2, 16\n  lvx   v21, r3, r2\n  addi  r2, r2, 16\n  lvx   v22, r3, r2\n  addi  r2, r2, 16\n  lvx   v23, r3, r2\n  addi  r2, r2, 16\n  lvx   v24, r3, r2\n  addi  r2, r2, 16\n  lvx   v25, r3, r2\n  addi  r2, r2, 16\n  lvx   v26, r3, r2\n  addi  r2, r2, 16\n  lvx   v27, r3, r2\n  addi  r2, r2, 16\n  lvx   v28, r3, r2\n  addi  r2, r2, 16\n  lvx   v29, r3, r2\n  addi  r2, r2, 16\n  lvx   v30, r3, r2\n  addi  r2, r2, 16\n  lvx   v31, r3, r2\n\n  ld r0,  0x00(r3)\n  # r1 cannot be used\n  ld r2,  0x10(r3)\n  # r3 will be loaded before the call\n  # r4 will be loaded before the call\n  ld r5,  0x28(r3)\n  ld r6,  0x30(r3)\n  ld r7,  0x38(r3)\n  ld r8,  0x40(r3)\n  ld r9,  0x48(r3)\n  ld r10, 0x50(r3)\n  ld r11, 0x58(r3)\n  ld r12, 0x60(r3)\n  # r13 cannot be used (OS use only)\n  ld r14, 0x70(r3)\n  ld r15, 0x78(r3)\n  ld r16, 0x80(r3)\n  ld r17, 0x88(r3)\n  ld r18, 0x90(r3)\n  ld r19, 0x98(r3)\n  ld r20, 0xA0(r3)\n  ld r21, 0xA8(r3)\n  ld r22, 0xB0(r3)\n  ld r23, 0xB8(r3)\n  ld r24, 0xC0(r3)\n  ld r25, 0xC8(r3)\n  ld r26, 0xD0(r3)\n  ld r27, 0xD8(r3)\n  ld r28, 0xE0(r3)\n  ld r29, 0xE8(r3)\n  ld r30, 0xF0(r3)\n  ld r31, 0xF8(r3)\n\n  lfd f0,  0x100(r3)\n  lfd f1,  0x108(r3)\n  lfd f2,  0x110(r3)\n  lfd f3,  0x118(r3)\n  lfd f4,  0x120(r3)\n  lfd f5,  0x128(r3)\n  lfd f6,  0x130(r3)\n  lfd f7,  0x138(r3)\n  lfd f8,  0x140(r3)\n  lfd f9,  0x148(r3)\n  lfd f10, 0x150(r3)\n  lfd f11, 0x158(r3)\n  lfd f12, 0x160(r3)\n  lfd f13, 0x168(r3)\n  lfd f14, 0x170(r3)\n  lfd f15, 0x178(r3)\n  lfd f16, 0x180(r3)\n  lfd f17, 0x188(r3)\n  lfd f18, 0x190(r3)\n  lfd f19, 0x198(r3)\n  lfd f20, 0x1A0(r3)\n  lfd f21, 0x1A8(r3)\n  lfd f22, 0x1B0(r3)\n  lfd f23, 0x1B8(r3)\n  lfd f24, 0x1C0(r3)\n  lfd f25, 0x1C8(r3)\n  lfd f26, 0x1D0(r3)\n  lfd f27, 0x1D8(r3)\n  lfd f28, 0x1E0(r3)\n  lfd f29, 0x1E8(r3)\n  lfd f30, 0x1F0(r3)\n  lfd f31, 0x1F8(r3)\n  blr\n\n# r3 = context\n# this does not save r1, r3, r13\n.save_registers_ctx:\n  std r0,  0x00(r3)\n  # r1 cannot be used\n  std r2,  0x10(r3)\n  # r3 will be saved later\n  std r4,  0x20(r3)\n  std r5,  0x28(r3)\n  std r6,  0x30(r3)\n  std r7,  0x38(r3)\n  std r8,  0x40(r3)\n  std r9,  0x48(r3)\n  std r10, 0x50(r3)\n  std r11, 0x58(r3)\n  std r12, 0x60(r3)\n  # r13 cannot be used (OS use only)\n  std r14, 0x70(r3)\n  std r15, 0x78(r3)\n  std r16, 0x80(r3)\n  std r17, 0x88(r3)\n  std r18, 0x90(r3)\n  std r19, 0x98(r3)\n  std r20, 0xA0(r3)\n  std r21, 0xA8(r3)\n  std r22, 0xB0(r3)\n  std r23, 0xB8(r3)\n  std r24, 0xC0(r3)\n  std r25, 0xC8(r3)\n  std r26, 0xD0(r3)\n  std r27, 0xD8(r3)\n  std r28, 0xE0(r3)\n  std r29, 0xE8(r3)\n  std r30, 0xF0(r3)\n  std r31, 0xF8(r3)\n\n  stfd f0,  0x100(r3)\n  stfd f1,  0x108(r3)\n  stfd f2,  0x110(r3)\n  stfd f3,  0x118(r3)\n  stfd f4,  0x120(r3)\n  stfd f5,  0x128(r3)\n  stfd f6,  0x130(r3)\n  stfd f7,  0x138(r3)\n  stfd f8,  0x140(r3)\n  stfd f9,  0x148(r3)\n  stfd f10, 0x150(r3)\n  stfd f11, 0x158(r3)\n  stfd f12, 0x160(r3)\n  stfd f13, 0x168(r3)\n  stfd f14, 0x170(r3)\n  stfd f15, 0x178(r3)\n  stfd f16, 0x180(r3)\n  stfd f17, 0x188(r3)\n  stfd f18, 0x190(r3)\n  stfd f19, 0x198(r3)\n  stfd f20, 0x1A0(r3)\n  stfd f21, 0x1A8(r3)\n  stfd f22, 0x1B0(r3)\n  stfd f23, 0x1B8(r3)\n  stfd f24, 0x1C0(r3)\n  stfd f25, 0x1C8(r3)\n  stfd f26, 0x1D0(r3)\n  stfd f27, 0x1D8(r3)\n  stfd f28, 0x1E0(r3)\n  stfd f29, 0x1E8(r3)\n  stfd f30, 0x1F0(r3)\n  stfd f31, 0x1F8(r3)\n\n  # Altivec registers (up to 32)\n  li    r2, 0x200\n  stvx  v0, r3, r2\n  addi  r2, r2, 16\n  stvx  v1, r3, r2\n  addi  r2, r2, 16\n  stvx  v2, r3, r2\n  addi  r2, r2, 16\n  stvx  v3, r3, r2\n  addi  r2, r2, 16\n  stvx  v4, r3, r2\n  addi  r2, r2, 16\n  stvx  v5, r3, r2\n  addi  r2, r2, 16\n  stvx  v6, r3, r2\n  addi  r2, r2, 16\n  stvx  v7, r3, r2\n  addi  r2, r2, 16\n  stvx  v8, r3, r2\n  addi  r2, r2, 16\n  stvx  v9, r3, r2\n  addi  r2, r2, 16\n  stvx  v10, r3, r2\n  addi  r2, r2, 16\n  stvx  v11, r3, r2\n  addi  r2, r2, 16\n  stvx  v12, r3, r2\n  addi  r2, r2, 16\n  stvx  v13, r3, r2\n  addi  r2, r2, 16\n  stvx  v14, r3, r2\n  addi  r2, r2, 16\n  stvx  v15, r3, r2\n  addi  r2, r2, 16\n  stvx  v16, r3, r2\n  addi  r2, r2, 16\n  stvx  v17, r3, r2\n  addi  r2, r2, 16\n  stvx  v18, r3, r2\n  addi  r2, r2, 16\n  stvx  v19, r3, r2\n  addi  r2, r2, 16\n  stvx  v20, r3, r2\n  addi  r2, r2, 16\n  stvx  v21, r3, r2\n  addi  r2, r2, 16\n  stvx  v22, r3, r2\n  addi  r2, r2, 16\n  stvx  v23, r3, r2\n  addi  r2, r2, 16\n  stvx  v24, r3, r2\n  addi  r2, r2, 16\n  stvx  v25, r3, r2\n  addi  r2, r2, 16\n  stvx  v26, r3, r2\n  addi  r2, r2, 16\n  stvx  v27, r3, r2\n  addi  r2, r2, 16\n  stvx  v28, r3, r2\n  addi  r2, r2, 16\n  stvx  v29, r3, r2\n  addi  r2, r2, 16\n  stvx  v30, r3, r2\n  addi  r2, r2, 16\n  stvx  v31, r3, r2\n\n  mfcr r2 # CR\n  stw  r2,  0x400(r3)\n\n  mffs f0 # FPSCR\n  stfd f0,  0x404(r3)\n  blr\n\n# void xe_call_native(Context* ctx, void* func)\n.globl xe_call_native\nxe_call_native:\n  mflr r12\n  stw  r12, -0x8(r1)\n  stwu r1, -0x380(r1) # 0x200(gpr + fp) + 0x200(vr)\n\n  # Save nonvolatile registers on the stack.\n  std r2, 0x110(r1)\n  std r3, 0x118(r1)  # Store the context, this will be needed later.\n  std r14, 0x170(r1)\n  std r15, 0x178(r1)\n  std r16, 0x180(r1)\n  std r17, 0x188(r1)\n  std r18, 0x190(r1)\n  std r19, 0x198(r1)\n  std r20, 0x1A0(r1)\n  std r21, 0x1A8(r1)\n  std r22, 0x1B0(r1)\n  std r23, 0x1B8(r1)\n  std r24, 0x1C0(r1)\n  std r25, 0x1C8(r1)\n  std r26, 0x1D0(r1)\n  std r27, 0x1D8(r1)\n  std r28, 0x1E0(r1)\n  std r29, 0x1E8(r1)\n  std r30, 0x1F0(r1)\n  std r31, 0x1F8(r1)\n\n  stfd f14, 0x270(r1)\n  stfd f15, 0x278(r1)\n  stfd f16, 0x280(r1)\n  stfd f17, 0x288(r1)\n  stfd f18, 0x290(r1)\n  stfd f19, 0x298(r1)\n  stfd f20, 0x2A0(r1)\n  stfd f21, 0x2A8(r1)\n  stfd f22, 0x2B0(r1)\n  stfd f23, 0x2B8(r1)\n  stfd f24, 0x2C0(r1)\n  stfd f25, 0x2C8(r1)\n  stfd f26, 0x2D0(r1)\n  stfd f27, 0x2D8(r1)\n  stfd f28, 0x2E0(r1)\n  stfd f29, 0x2E8(r1)\n  stfd f30, 0x2F0(r1)\n  stfd f31, 0x2F8(r1)\n\n  # Load registers from context (except r3/r4)\n  bl .load_registers_ctx\n\n  # Call the test routine\n  mtctr r4\n  ld r4, 0x20(r3)\n  ld r3, 0x18(r3)\n  bctrl\n\n  # Temporarily store r3 into the stack (in the place of r0)\n  std r3, 0x100(r1)\n\n  # Store registers into context (except r3)\n  ld r3, 0x118(r1)\n  bl .save_registers_ctx\n\n  # Now store r3\n  ld r4, 0x100(r1)\n  std r4, 0x18(r3)\n\n  # Restore nonvolatile registers from the stack\n  ld r2, 0x110(r1)\n  ld r14, 0x170(r1)\n  ld r15, 0x178(r1)\n  ld r16, 0x180(r1)\n  ld r17, 0x188(r1)\n  ld r18, 0x190(r1)\n  ld r19, 0x198(r1)\n  ld r20, 0x1A0(r1)\n  ld r21, 0x1A8(r1)\n  ld r22, 0x1B0(r1)\n  ld r23, 0x1B8(r1)\n  ld r24, 0x1C0(r1)\n  ld r25, 0x1C8(r1)\n  ld r26, 0x1D0(r1)\n  ld r27, 0x1D8(r1)\n  ld r28, 0x1E0(r1)\n  ld r29, 0x1E8(r1)\n  ld r30, 0x1F0(r1)\n  ld r31, 0x1F8(r1)\n\n  lfd f14, 0x270(r1)\n  lfd f15, 0x278(r1)\n  lfd f16, 0x280(r1)\n  lfd f17, 0x288(r1)\n  lfd f18, 0x290(r1)\n  lfd f19, 0x298(r1)\n  lfd f20, 0x2A0(r1)\n  lfd f21, 0x2A8(r1)\n  lfd f22, 0x2B0(r1)\n  lfd f23, 0x2B8(r1)\n  lfd f24, 0x2C0(r1)\n  lfd f25, 0x2C8(r1)\n  lfd f26, 0x2D0(r1)\n  lfd f27, 0x2D8(r1)\n  lfd f28, 0x2E0(r1)\n  lfd f29, 0x2E8(r1)\n  lfd f30, 0x2F0(r1)\n  lfd f31, 0x2F8(r1)\n\n  addi r1, r1, 0x380\n  lwz  r12, -0x8(r1)\n  mtlr r12\n  blr\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/premake5.lua",
    "content": "project_root = \"../../../../..\"\ninclude(project_root..\"/tools/build\")\n\ngroup(\"tests\")\nproject(\"xenia-cpu-ppc-tests\")\n  uuid(\"2a57d5ac-4024-4c49-9cd3-aa3a603c2ef8\")\n  kind(\"ConsoleApp\")\n  language(\"C++\")\n  links({\n    \"capstone\", -- cpu-backend-x64\n    \"fmt\",\n    \"mspack\",\n    \"xenia-core\",\n    \"xenia-cpu\",\n    \"xenia-base\",\n  })\n  files({\n    \"ppc_testing_main.cc\",\n    \"../../../base/console_app_main_\"..platform_suffix..\".cc\",\n  })\n  files({\n    \"*.s\",\n  })\n  filter(\"files:*.s\")\n    flags({\"ExcludeFromBuild\"})\n  filter(\"architecture:x86_64\")\n    links({\n      \"xenia-cpu-backend-x64\",\n    })\n  filter(\"platforms:Windows\")\n    debugdir(project_root)\n    debugargs({\n      \"2>&1\",\n      \"1>scratch/stdout-testing.txt\",\n    })\n\n    -- xenia-base needs this\n    links({\"xenia-ui\"})\n\nif ARCH == \"ppc64\" or ARCH == \"powerpc64\" then\n\nproject(\"xenia-cpu-ppc-nativetests\")\n  uuid(\"E381E8EE-65CD-4D5E-9223-D9C03B2CE78C\")\n  kind(\"ConsoleApp\")\n  language(\"C++\")\n  links({\n    \"fmt\",\n    \"xenia-base\",\n  })\n  files({\n    \"ppc_testing_native_main.cc\",\n    \"../../../base/console_app_main_\"..platform_suffix..\".cc\",\n  })\n  files({\n    \"instr_*.s\",\n    \"seq_*.s\",\n  })\n  filter(\"files:instr_*.s\", \"files:seq_*.s\")\n    flags({\"ExcludeFromBuild\"})\n  filter({})\n  buildoptions({\n    \"-Wa,-mregnames\",  -- Tell GAS to accept register names.\n  })\n\n  files({\n    \"ppc_testing_native_thunks.s\",\n  })\n\nend"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/seq_branch_carry.s",
    "content": "test_equiv_1:\n  #_ REGISTER_IN r11 0x9E2A83C1\n  lis r9, -0x61D6 # 0x9E2A83C1\n  ori r30, r9, 0x83C1 # 0x9E2A83C1\n  subf r8, r11, r30\n  addic r7, r8, -1\n  subfe. r29, r7, r8\n  beq equiv_1_good\n  li r12, 0\n  blr\nequiv_1_good:\n  li r12, 1\n  blr\n  #_ REGISTER_OUT r7 0xfffffffeffffffff\n  #_ REGISTER_OUT r8 0xffffffff00000000\n  #_ REGISTER_OUT r9 0xffffffff9e2a0000\n  #_ REGISTER_OUT r30 0xffffffff9e2a83c1\n  #_ REGISTER_OUT r29 0\n  #_ REGISTER_OUT r11 0x000000009e2a83c1\n  #_ REGISTER_OUT r12 1\n\ntest_equiv_2:\n  #_ REGISTER_IN r11 0xffffffff9e2a83c1\n  lis r9, -0x61D6 # 0x9E2A83C1\n  ori r30, r9, 0x83C1 # 0x9E2A83C1\n  subf r8, r11, r30\n  addic r7, r8, -1\n  subfe. r29, r7, r8\n  beq equiv_2_good\n  li r12, 0\n  blr\nequiv_2_good:\n  li r12, 1\n  blr\n  #_ REGISTER_OUT r7 0xffffffffffffffff\n  #_ REGISTER_OUT r8 0\n  #_ REGISTER_OUT r9 0xffffffff9e2a0000\n  #_ REGISTER_OUT r30 0xffffffff9e2a83c1\n  #_ REGISTER_OUT r29 0\n  #_ REGISTER_OUT r11 0xffffffff9e2a83c1\n  #_ REGISTER_OUT r12 1\n"
  },
  {
    "path": "src/xenia/cpu/ppc/testing/seq_jumptable_constants.s",
    "content": "the_function:\n  cmpwi cr6, r3, 3\n  bgt .case_3\n  lis r11, .the_table@h\n  addi r11, r11, .the_table@l\n  slwi r3, r3, 2\n  lwzx r3, r11, r3\n  mtspr ctr, r3\n  bctr\n.the_table:\n  .long .case_0\n  .long .case_1\n  .long .case_2\n  .long .case_3\n.case_0:\n  li r11, 8\n  b .the_divide\n.case_1:\n  li r11, 16\n  b .the_divide\n.case_2:\n  li r11, 24\n  b .the_divide\n.case_3:\n  li r11, 32\n.the_divide:\n  extsw r11, r11\n  tdllei r11, 0\n  divdu r4, r4, r11\n  blr\n\ntest_jumptable_constants:\n  mfspr r12, lr\n  li r3, 0\n  li r4, 1024\n  bl the_function\n  li r3, 1\n  li r4, 1024\n  bl the_function\n  li r3, 2\n  li r4, 1024\n  bl the_function\n  li r3, 3\n  li r4, 1024\n  bl the_function\n  mtspr lr, r12\n  blr\n"
  },
  {
    "path": "src/xenia/cpu/premake5.lua",
    "content": "project_root = \"../../..\"\ninclude(project_root..\"/tools/build\")\n\ngroup(\"src\")\nproject(\"xenia-cpu\")\n  uuid(\"0109c91e-5a04-41ab-9168-0d5187d11298\")\n  kind(\"StaticLib\")\n  language(\"C++\")\n  links({\n    \"xenia-base\",\n    \"mspack\",\n  })\n  includedirs({\n    project_root..\"/third_party/llvm/include\",\n  })\n  local_platform_files()\n  local_platform_files(\"backend\")\n  local_platform_files(\"compiler\")\n  local_platform_files(\"compiler/passes\")\n  local_platform_files(\"hir\")\n  local_platform_files(\"ppc\")\n\ninclude(\"testing\")\ninclude(\"ppc/testing\")\n"
  },
  {
    "path": "src/xenia/cpu/processor.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/processor.h\"\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/atomic.h\"\n#include \"xenia/base/byte_order.h\"\n#include \"xenia/base/byte_stream.h\"\n#include \"xenia/base/cvar.h\"\n#include \"xenia/base/debugging.h\"\n#include \"xenia/base/exception_handler.h\"\n#include \"xenia/base/literals.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/memory.h\"\n#include \"xenia/base/platform.h\"\n#include \"xenia/base/profiling.h\"\n#include \"xenia/base/threading.h\"\n#include \"xenia/cpu/breakpoint.h\"\n#include \"xenia/cpu/cpu_flags.h\"\n#include \"xenia/cpu/export_resolver.h\"\n#include \"xenia/cpu/module.h\"\n#include \"xenia/cpu/ppc/ppc_decode_data.h\"\n#include \"xenia/cpu/ppc/ppc_frontend.h\"\n#include \"xenia/cpu/stack_walker.h\"\n#include \"xenia/cpu/thread.h\"\n#include \"xenia/cpu/thread_state.h\"\n#include \"xenia/cpu/xex_module.h\"\n\n// TODO(benvanik): based on compiler support\n#include \"xenia/cpu/backend/x64/x64_backend.h\"\n\n#if 0 && DEBUG\n#define DEFAULT_DEBUG_FLAG true\n#else\n#define DEFAULT_DEBUG_FLAG false\n#endif\n\nDEFINE_bool(debug, DEFAULT_DEBUG_FLAG,\n            \"Allow debugging and retain debug information.\", \"General\");\nDEFINE_path(trace_function_data_path, \"\", \"File to write trace data to.\",\n            \"CPU\");\nDEFINE_bool(break_on_start, false, \"Break into the debugger on startup.\",\n            \"CPU\");\n\nnamespace xe {\nnamespace kernel {\nclass XThread;\n}  // namespace kernel\n\nnamespace cpu {\n\nusing xe::cpu::ppc::PPCOpcode;\nusing xe::kernel::XThread;\n\nusing namespace xe::literals;\n\nclass BuiltinModule : public Module {\n public:\n  explicit BuiltinModule(Processor* processor)\n      : Module(processor), name_(\"builtin\") {}\n\n  const std::string& name() const override { return name_; }\n  bool is_executable() const override { return false; }\n\n  bool ContainsAddress(uint32_t address) override {\n    return (address & 0xFFFFFFF0) == 0xFFFFFFF0;\n  }\n\n protected:\n  std::unique_ptr<Function> CreateFunction(uint32_t address) override {\n    return std::unique_ptr<Function>(new BuiltinFunction(this, address));\n  }\n\n private:\n  std::string name_;\n};\n\nProcessor::Processor(xe::Memory* memory, ExportResolver* export_resolver)\n    : memory_(memory), export_resolver_(export_resolver) {}\n\nProcessor::~Processor() {\n  {\n    auto global_lock = global_critical_region_.Acquire();\n    modules_.clear();\n  }\n\n  frontend_.reset();\n  backend_.reset();\n\n  if (functions_trace_file_) {\n    functions_trace_file_->Flush();\n    functions_trace_file_.reset();\n  }\n}\n\nbool Processor::Setup(std::unique_ptr<backend::Backend> backend) {\n  // TODO(benvanik): query mode from debugger?\n  debug_info_flags_ = 0;\n\n  auto frontend = std::make_unique<ppc::PPCFrontend>(this);\n  // TODO(benvanik): set options/etc.\n\n  // Must be initialized by subclass before calling into this.\n  assert_not_null(memory_);\n\n  std::unique_ptr<Module> builtin_module(new BuiltinModule(this));\n  builtin_module_ = builtin_module.get();\n  modules_.push_back(std::move(builtin_module));\n\n  if (frontend_ || backend_) {\n    return false;\n  }\n\n  if (!backend) {\n    return false;\n  }\n  if (!backend->Initialize(this)) {\n    return false;\n  }\n  if (!frontend->Initialize()) {\n    return false;\n  }\n\n  backend_ = std::move(backend);\n  frontend_ = std::move(frontend);\n\n  // Stack walker is used when profiling, debugging, and dumping.\n  // Note that creation may fail, in which case we'll have to disable those\n  // features.\n  // The code cache may be unavailable in case of a \"null\" backend.\n  cpu::backend::CodeCache* code_cache = backend_->code_cache();\n  if (code_cache) {\n    stack_walker_ = StackWalker::Create(code_cache);\n  }\n  if (!stack_walker_) {\n    // TODO(benvanik): disable features.\n    if (cvars::debug) {\n      XELOGW(\"Disabling --debug due to lack of stack walker\");\n      cvars::debug = false;\n    }\n  }\n\n  // Open the trace data path, if requested.\n  functions_trace_path_ = cvars::trace_function_data_path;\n  if (!functions_trace_path_.empty()) {\n    functions_trace_file_ =\n        ChunkedMappedMemoryWriter::Open(functions_trace_path_, 32_MiB, true);\n  }\n\n  return true;\n}\n\nvoid Processor::PreLaunch() {\n  if (cvars::break_on_start) {\n    // Start paused.\n    XELOGI(\"Breaking into debugger because of --break_on_start...\");\n    execution_state_ = ExecutionState::kRunning;\n    Pause();\n  } else {\n    // Start running.\n    execution_state_ = ExecutionState::kRunning;\n  }\n}\n\nbool Processor::AddModule(std::unique_ptr<Module> module) {\n  auto global_lock = global_critical_region_.Acquire();\n  modules_.push_back(std::move(module));\n  return true;\n}\n\nModule* Processor::GetModule(const std::string_view name) {\n  auto global_lock = global_critical_region_.Acquire();\n  for (const auto& module : modules_) {\n    if (module->name() == name) {\n      return module.get();\n    }\n  }\n  return nullptr;\n}\n\nstd::vector<Module*> Processor::GetModules() {\n  auto global_lock = global_critical_region_.Acquire();\n  std::vector<Module*> clone(modules_.size());\n  for (const auto& module : modules_) {\n    clone.push_back(module.get());\n  }\n  return clone;\n}\n\nFunction* Processor::DefineBuiltin(const std::string_view name,\n                                   BuiltinFunction::Handler handler, void* arg0,\n                                   void* arg1) {\n  uint32_t address = next_builtin_address_;\n  next_builtin_address_ += 4;\n\n  Function* function;\n  builtin_module_->DeclareFunction(address, &function);\n  function->set_end_address(address + 4);\n  function->set_name(name);\n\n  auto builtin_function = static_cast<BuiltinFunction*>(function);\n  builtin_function->SetupBuiltin(handler, arg0, arg1);\n\n  function->set_status(Symbol::Status::kDeclared);\n  return function;\n}\n\nFunction* Processor::QueryFunction(uint32_t address) {\n  auto entry = entry_table_.Get(address);\n  if (!entry) {\n    return nullptr;\n  }\n  return entry->function;\n}\n\nstd::vector<Function*> Processor::FindFunctionsWithAddress(uint32_t address) {\n  return entry_table_.FindWithAddress(address);\n}\n\nFunction* Processor::ResolveFunction(uint32_t address) {\n  Entry* entry;\n  Entry::Status status = entry_table_.GetOrCreate(address, &entry);\n  if (status == Entry::STATUS_NEW) {\n    // Needs to be generated. We have the 'lock' on it and must do so now.\n\n    // Grab symbol declaration.\n    auto function = LookupFunction(address);\n    if (!function) {\n      entry->status = Entry::STATUS_FAILED;\n      return nullptr;\n    }\n\n    if (!DemandFunction(function)) {\n      entry->status = Entry::STATUS_FAILED;\n      return nullptr;\n    }\n    entry->function = function;\n    entry->end_address = function->end_address();\n    status = entry->status = Entry::STATUS_READY;\n  }\n  if (status == Entry::STATUS_READY) {\n    // Ready to use.\n    return entry->function;\n  } else {\n    // Failed or bad state.\n    return nullptr;\n  }\n}\n\nFunction* Processor::LookupFunction(uint32_t address) {\n  // TODO(benvanik): fast reject invalid addresses/log errors.\n\n  // Find the module that contains the address.\n  Module* code_module = nullptr;\n  {\n    auto global_lock = global_critical_region_.Acquire();\n    // TODO(benvanik): sort by code address (if contiguous) so can bsearch.\n    // TODO(benvanik): cache last module low/high, as likely to be in there.\n    for (const auto& module : modules_) {\n      if (module->ContainsAddress(address)) {\n        code_module = module.get();\n        break;\n      }\n    }\n  }\n  if (!code_module) {\n    // No module found that could contain the address.\n    return nullptr;\n  }\n\n  return LookupFunction(code_module, address);\n}\n\nFunction* Processor::LookupFunction(Module* module, uint32_t address) {\n  // Atomic create/lookup symbol in module.\n  // If we get back the NEW flag we must declare it now.\n  Function* function = nullptr;\n  auto symbol_status = module->DeclareFunction(address, &function);\n  if (symbol_status == Symbol::Status::kNew) {\n    // Symbol is undeclared, so declare now.\n    assert_true(function->is_guest());\n    if (!frontend_->DeclareFunction(static_cast<GuestFunction*>(function))) {\n      function->set_status(Symbol::Status::kFailed);\n      return nullptr;\n    }\n    function->set_status(Symbol::Status::kDeclared);\n  }\n  return function;\n}\n\nbool Processor::DemandFunction(Function* function) {\n  // Lock function for generation. If it's already being generated\n  // by another thread this will block and return DECLARED.\n  auto module = function->module();\n  auto symbol_status = module->DefineFunction(function);\n  if (symbol_status == Symbol::Status::kNew) {\n    // Symbol is undefined, so define now.\n    assert_true(function->is_guest());\n    if (!frontend_->DefineFunction(static_cast<GuestFunction*>(function),\n                                   debug_info_flags_)) {\n      function->set_status(Symbol::Status::kFailed);\n      return false;\n    }\n\n    // Before we give the symbol back to the rest, let the debugger know.\n    OnFunctionDefined(function);\n\n    function->set_status(Symbol::Status::kDefined);\n    symbol_status = function->status();\n  }\n\n  if (symbol_status == Symbol::Status::kFailed) {\n    // Symbol likely failed.\n    return false;\n  }\n\n  return true;\n}\n\nbool Processor::Execute(ThreadState* thread_state, uint32_t address) {\n  SCOPE_profile_cpu_f(\"cpu\");\n\n  // Attempt to get the function.\n  auto function = ResolveFunction(address);\n  if (!function) {\n    // Symbol not found in any module.\n    XELOGCPU(\"Execute({:08X}): failed to find function\", address);\n    return false;\n  }\n\n  auto context = thread_state->context();\n\n  // Pad out stack a bit, as some games seem to overwrite the caller by about\n  // 16 to 32b.\n  context->r[1] -= 64 + 112;\n\n  // This could be set to anything to give us a unique identifier to track\n  // re-entrancy/etc.\n  uint64_t previous_lr = context->lr;\n  context->lr = 0xBCBCBCBC;\n\n  // Execute the function.\n  auto result = function->Call(thread_state, uint32_t(context->lr));\n\n  context->lr = previous_lr;\n  context->r[1] += 64 + 112;\n\n  return result;\n}\n\nbool Processor::ExecuteRaw(ThreadState* thread_state, uint32_t address) {\n  SCOPE_profile_cpu_f(\"cpu\");\n\n  // Attempt to get the function.\n  auto function = ResolveFunction(address);\n  if (!function) {\n    // Symbol not found in any module.\n    XELOGCPU(\"Execute({:08X}): failed to find function\", address);\n    return false;\n  }\n\n  return function->Call(thread_state, 0xBCBCBCBC);\n}\n\nuint64_t Processor::Execute(ThreadState* thread_state, uint32_t address,\n                            uint64_t args[], size_t arg_count) {\n  SCOPE_profile_cpu_f(\"cpu\");\n\n  auto context = thread_state->context();\n  for (size_t i = 0; i < std::min(arg_count, static_cast<size_t>(8)); ++i) {\n    context->r[3 + i] = args[i];\n  }\n\n  if (arg_count > 7) {\n    // Rest of the arguments go on the stack.\n    // FIXME: This assumes arguments are 32 bits!\n    auto stack_arg_base =\n        memory()->TranslateVirtual((uint32_t)context->r[1] + 0x54 - (64 + 112));\n    for (size_t i = 0; i < arg_count - 8; i++) {\n      xe::store_and_swap<uint32_t>(stack_arg_base + (i * 8),\n                                   (uint32_t)args[i + 8]);\n    }\n  }\n\n  if (!Execute(thread_state, address)) {\n    return 0xDEADBABE;\n  }\n  return context->r[3];\n}\n\nuint64_t Processor::ExecuteInterrupt(ThreadState* thread_state,\n                                     uint32_t address, uint64_t args[],\n                                     size_t arg_count) {\n  SCOPE_profile_cpu_f(\"cpu\");\n\n  // Hold the global lock during interrupt dispatch.\n  // This will block if any code is in a critical region (has interrupts\n  // disabled) or if any other interrupt is executing.\n  auto global_lock = global_critical_region_.Acquire();\n\n  auto context = thread_state->context();\n  assert_true(arg_count <= 5);\n  for (size_t i = 0; i < arg_count; ++i) {\n    context->r[3 + i] = args[i];\n  }\n\n  // TLS ptr must be zero during interrupts. Some games check this and\n  // early-exit routines when under interrupts.\n  auto pcr_address =\n      memory_->TranslateVirtual(static_cast<uint32_t>(context->r[13]));\n  uint32_t old_tls_ptr = xe::load_and_swap<uint32_t>(pcr_address);\n  xe::store_and_swap<uint32_t>(pcr_address, 0);\n\n  if (!Execute(thread_state, address)) {\n    return 0xDEADBABE;\n  }\n\n  // Restores TLS ptr.\n  xe::store_and_swap<uint32_t>(pcr_address, old_tls_ptr);\n\n  return context->r[3];\n}\n\nIrql Processor::RaiseIrql(Irql new_value) {\n  return static_cast<Irql>(\n      xe::atomic_exchange(static_cast<uint32_t>(new_value),\n                          reinterpret_cast<volatile uint32_t*>(&irql_)));\n}\n\nvoid Processor::LowerIrql(Irql old_value) {\n  xe::atomic_exchange(static_cast<uint32_t>(old_value),\n                      reinterpret_cast<volatile uint32_t*>(&irql_));\n}\n\nbool Processor::Save(ByteStream* stream) {\n  stream->Write(kProcessorSaveSignature);\n  return true;\n}\n\nbool Processor::Restore(ByteStream* stream) {\n  if (stream->Read<uint32_t>() != kProcessorSaveSignature) {\n    XELOGE(\"Processor::Restore - Invalid magic value!\");\n    return false;\n  }\n\n  // Clear cached thread data for zombie threads.\n  std::vector<uint32_t> to_delete;\n  for (auto& it : thread_debug_infos_) {\n    if (it.second->state == ThreadDebugInfo::State::kZombie) {\n      to_delete.push_back(it.first);\n    }\n  }\n  for (uint32_t thread_id : to_delete) {\n    thread_debug_infos_.erase(thread_id);\n  }\n\n  return true;\n}\n\nuint8_t* Processor::AllocateFunctionTraceData(size_t size) {\n  if (!functions_trace_file_) {\n    return nullptr;\n  }\n  return functions_trace_file_->Allocate(size);\n}\n\nvoid Processor::OnFunctionDefined(Function* function) {\n  auto global_lock = global_critical_region_.Acquire();\n  for (auto breakpoint : breakpoints_) {\n    if (breakpoint->address_type() == Breakpoint::AddressType::kGuest) {\n      if (function->ContainsAddress(breakpoint->guest_address())) {\n        if (breakpoint->is_installed()) {\n          backend_->InstallBreakpoint(breakpoint, function);\n        }\n      }\n    }\n  }\n}\n\nvoid Processor::OnThreadCreated(uint32_t thread_handle,\n                                ThreadState* thread_state, Thread* thread) {\n  auto global_lock = global_critical_region_.Acquire();\n  auto thread_info = std::make_unique<ThreadDebugInfo>();\n  thread_info->thread_handle = thread_handle;\n  thread_info->thread_id = thread_state->thread_id();\n  thread_info->thread = thread;\n  thread_info->state = ThreadDebugInfo::State::kAlive;\n  thread_info->suspended = false;\n  thread_debug_infos_.emplace(thread_info->thread_id, std::move(thread_info));\n}\n\nvoid Processor::OnThreadExit(uint32_t thread_id) {\n  auto global_lock = global_critical_region_.Acquire();\n  auto it = thread_debug_infos_.find(thread_id);\n  assert_true(it != thread_debug_infos_.end());\n  auto thread_info = it->second.get();\n  thread_info->state = ThreadDebugInfo::State::kExited;\n}\n\nvoid Processor::OnThreadDestroyed(uint32_t thread_id) {\n  auto global_lock = global_critical_region_.Acquire();\n  auto it = thread_debug_infos_.find(thread_id);\n  assert_true(it != thread_debug_infos_.end());\n  auto thread_info = it->second.get();\n  thread_info->state = ThreadDebugInfo::State::kZombie;\n  thread_info->thread = nullptr;\n}\n\nvoid Processor::OnThreadEnteringWait(uint32_t thread_id) {\n  auto global_lock = global_critical_region_.Acquire();\n  auto it = thread_debug_infos_.find(thread_id);\n  assert_true(it != thread_debug_infos_.end());\n  auto thread_info = it->second.get();\n  thread_info->state = ThreadDebugInfo::State::kWaiting;\n}\n\nvoid Processor::OnThreadLeavingWait(uint32_t thread_id) {\n  auto global_lock = global_critical_region_.Acquire();\n  auto it = thread_debug_infos_.find(thread_id);\n  assert_true(it != thread_debug_infos_.end());\n  auto thread_info = it->second.get();\n  if (thread_info->state == ThreadDebugInfo::State::kWaiting) {\n    thread_info->state = ThreadDebugInfo::State::kAlive;\n  }\n}\n\nstd::vector<ThreadDebugInfo*> Processor::QueryThreadDebugInfos() {\n  auto global_lock = global_critical_region_.Acquire();\n  std::vector<ThreadDebugInfo*> result;\n  for (auto& it : thread_debug_infos_) {\n    result.push_back(it.second.get());\n  }\n  return result;\n}\n\nThreadDebugInfo* Processor::QueryThreadDebugInfo(uint32_t thread_id) {\n  auto global_lock = global_critical_region_.Acquire();\n  const auto& it = thread_debug_infos_.find(thread_id);\n  if (it == thread_debug_infos_.end()) {\n    return nullptr;\n  }\n  return it->second.get();\n}\n\nvoid Processor::AddBreakpoint(Breakpoint* breakpoint) {\n  auto global_lock = global_critical_region_.Acquire();\n\n  // Add to breakpoints map.\n  breakpoints_.push_back(breakpoint);\n\n  if (execution_state_ == ExecutionState::kRunning) {\n    breakpoint->Resume();\n  }\n}\n\nvoid Processor::RemoveBreakpoint(Breakpoint* breakpoint) {\n  auto global_lock = global_critical_region_.Acquire();\n\n  // Uninstall (if needed).\n  if (execution_state_ == ExecutionState::kRunning) {\n    breakpoint->Suspend();\n  }\n\n  // Remove from breakpoint map.\n  auto it = std::find(breakpoints_.begin(), breakpoints_.end(), breakpoint);\n  breakpoints_.erase(it);\n}\n\nBreakpoint* Processor::FindBreakpoint(uint32_t address) {\n  auto global_lock = global_critical_region_.Acquire();\n  for (auto breakpoint : breakpoints_) {\n    if (breakpoint->address() == address) {\n      return breakpoint;\n    }\n  }\n  return nullptr;\n}\n\nvoid Processor::set_debug_listener(DebugListener* debug_listener) {\n  if (debug_listener == debug_listener_) {\n    return;\n  }\n  if (debug_listener_) {\n    // Detach old debug listener.\n    debug_listener_->OnDetached();\n    debug_listener_ = nullptr;\n  }\n  if (debug_listener) {\n    debug_listener_ = debug_listener;\n  } else {\n    if (execution_state_ == ExecutionState::kPaused) {\n      XELOGI(\"Debugger detaching while execution is paused; continuing...\");\n      Continue();\n    }\n  }\n}\n\nvoid Processor::DemandDebugListener() {\n  if (debug_listener_) {\n    // Already present.\n    debug_listener_->OnFocus();\n    return;\n  }\n  if (!debug_listener_handler_) {\n    XELOGE(\"Debugger demanded a listener but no handler was registered.\");\n    xe::debugging::Break();\n    return;\n  }\n  set_debug_listener(debug_listener_handler_(this));\n}\n\nbool Processor::OnThreadBreakpointHit(Exception* ex) {\n  auto global_lock = global_critical_region_.Acquire();\n\n  // Suspend all threads (but ourselves).\n  SuspendAllThreads();\n\n  // Lookup thread info block.\n  auto it = thread_debug_infos_.find(ThreadState::GetThreadID());\n  if (it == thread_debug_infos_.end()) {\n    // Not found - exception on a thread we don't know about?\n    assert_always(\"UD2 on a thread we don't track\");\n    return false;\n  }\n  auto thread_info = it->second.get();\n\n  // Run through and uninstall all breakpoint UD2s to get us back to a clean\n  // state.\n  if (execution_state_ != ExecutionState::kStepping) {\n    SuspendAllBreakpoints();\n  }\n\n  // Update all thread states with their latest values, using the context we\n  // got from the exception instead of a sampled value (as it would just show\n  // the exception handler).\n  UpdateThreadExecutionStates(thread_info->thread_id, ex->thread_context());\n\n  // Walk the captured thread stack and look for breakpoints at any address in\n  // the stack. We just look for the first one.\n  Breakpoint* breakpoint = nullptr;\n  for (size_t i = 0; i < thread_info->frames.size(); ++i) {\n    auto& frame = thread_info->frames[i];\n    for (auto scan_breakpoint : breakpoints_) {\n      if ((scan_breakpoint->address_type() == Breakpoint::AddressType::kGuest &&\n           scan_breakpoint->guest_address() == frame.guest_pc) ||\n          (scan_breakpoint->address_type() == Breakpoint::AddressType::kHost &&\n           scan_breakpoint->host_address() == frame.host_pc)) {\n        breakpoint = scan_breakpoint;\n        break;\n      }\n    }\n    if (breakpoint) {\n      breakpoint->OnHit(thread_info, frame.host_pc);\n      break;\n    }\n  }\n\n  // We are waiting on the debugger now. Either wait for it to continue, add a\n  // new step, or direct us somewhere else.\n  // The debugger will ResumeAllThreads or just resume us (depending on what\n  // it wants to do).\n  execution_state_ = ExecutionState::kPaused;\n  thread_info->suspended = true;\n\n  // Must unlock, or we will deadlock.\n  global_lock.unlock();\n\n  if (debug_listener_) {\n    debug_listener_->OnExecutionPaused();\n  }\n\n  thread_info->thread->thread()->Suspend();\n\n  // Apply thread context changes.\n  // TODO(benvanik): apply to all threads?\n#if XE_ARCH_AMD64\n  ex->set_resume_pc(thread_info->host_context.rip);\n#elif XE_ARCH_ARM64\n  ex->set_resume_pc(thread_info->host_context.pc);\n#else\n#error Instruction pointer not specified for the target CPU architecture.\n#endif  // XE_ARCH\n\n  // Resume execution.\n  return true;\n}\n\nvoid Processor::OnStepCompleted(ThreadDebugInfo* thread_info) {\n  auto global_lock = global_critical_region_.Acquire();\n  execution_state_ = ExecutionState::kPaused;\n  if (debug_listener_) {\n    debug_listener_->OnExecutionPaused();\n  }\n\n  // Note that we stay suspended.\n}\n\nbool Processor::OnUnhandledException(Exception* ex) {\n  // If we have no listener return right away.\n  // TODO(benvanik): DemandDebugListener()?\n  if (!debug_listener_) {\n    return false;\n  }\n\n  // If this isn't a managed thread, fail - let VS handle it for now.\n  if (!Thread::IsInThread()) {\n    return false;\n  }\n\n  auto global_lock = global_critical_region_.Acquire();\n\n  // Suspend all guest threads (but this one).\n  SuspendAllThreads();\n\n  UpdateThreadExecutionStates(Thread::GetCurrentThreadId(),\n                              ex->thread_context());\n\n  // Stop and notify the listener.\n  // This will take control.\n  assert_true(execution_state_ == ExecutionState::kRunning);\n  execution_state_ = ExecutionState::kPaused;\n\n  // Notify debugger that exceution stopped.\n  // debug_listener_->OnException(info);\n  debug_listener_->OnExecutionPaused();\n\n  // Suspend self.\n  Thread::GetCurrentThread()->thread()->Suspend();\n\n  return true;\n}\n\nvoid Processor::ShowDebugger() {\n  if (debug_listener_) {\n    debug_listener_->OnFocus();\n  } else {\n    DemandDebugListener();\n  }\n}\n\nbool Processor::SuspendAllThreads() {\n  auto global_lock = global_critical_region_.Acquire();\n  for (auto& it : thread_debug_infos_) {\n    auto thread_info = it.second.get();\n    if (thread_info->suspended) {\n      // Already suspended - ignore.\n      continue;\n    } else if (thread_info->state == ThreadDebugInfo::State::kZombie ||\n               thread_info->state == ThreadDebugInfo::State::kExited) {\n      // Thread is dead and cannot be suspended - ignore.\n      continue;\n    } else if (Thread::IsInThread() &&\n               thread_info->thread_id == Thread::GetCurrentThreadId()) {\n      // Can't suspend ourselves.\n      continue;\n    }\n    auto thread = thread_info->thread;\n    if (!thread->can_debugger_suspend()) {\n      // Thread is a host thread, and we aren't suspending those (for now).\n      continue;\n    }\n    bool did_suspend = thread->thread()->Suspend(nullptr);\n    assert_true(did_suspend);\n    thread_info->suspended = true;\n  }\n  return true;\n}\n\nbool Processor::ResumeThread(uint32_t thread_id) {\n  auto global_lock = global_critical_region_.Acquire();\n  auto it = thread_debug_infos_.find(thread_id);\n  if (it == thread_debug_infos_.end()) {\n    return false;\n  }\n  auto thread_info = it->second.get();\n  assert_true(thread_info->suspended);\n  assert_false(thread_info->state == ThreadDebugInfo::State::kExited ||\n               thread_info->state == ThreadDebugInfo::State::kZombie);\n  thread_info->suspended = false;\n  auto thread = thread_info->thread;\n  return thread->thread()->Resume();\n}\n\nbool Processor::ResumeAllThreads() {\n  auto global_lock = global_critical_region_.Acquire();\n  for (auto& it : thread_debug_infos_) {\n    auto thread_info = it.second.get();\n    if (!thread_info->suspended) {\n      // Not suspended by us - ignore.\n      continue;\n    } else if (thread_info->state == ThreadDebugInfo::State::kZombie ||\n               thread_info->state == ThreadDebugInfo::State::kExited) {\n      // Thread is dead and cannot be resumed - ignore.\n      continue;\n    } else if (Thread::IsInThread() &&\n               thread_info->thread_id == Thread::GetCurrentThreadId()) {\n      // Can't resume ourselves.\n      continue;\n    }\n    auto thread = thread_info->thread;\n    if (!thread->can_debugger_suspend()) {\n      // Thread is a host thread, and we aren't suspending those (for now).\n      continue;\n    }\n    thread_info->suspended = false;\n    bool did_resume = thread->thread()->Resume();\n    assert_true(did_resume);\n  }\n  return true;\n}\n\nvoid Processor::UpdateThreadExecutionStates(\n    uint32_t override_thread_id, HostThreadContext* override_context) {\n  auto global_lock = global_critical_region_.Acquire();\n  uint64_t frame_host_pcs[64];\n  xe::cpu::StackFrame cpu_frames[64];\n  for (auto& it : thread_debug_infos_) {\n    auto thread_info = it.second.get();\n    auto thread = thread_info->thread;\n    if (!thread) {\n      continue;\n    }\n\n    // Grab PPC context.\n    // Note that this is only up to date if --store_all_context_values is\n    // enabled (or --debug).\n    if (thread->can_debugger_suspend()) {\n      std::memcpy(&thread_info->guest_context,\n                  thread->thread_state()->context(),\n                  sizeof(thread_info->guest_context));\n    }\n\n    // Grab stack trace and X64 context then resolve all symbols.\n    uint64_t hash;\n    HostThreadContext* in_host_context = nullptr;\n    if (override_thread_id == thread_info->thread_id) {\n      // If we were passed an override context we use that. Otherwise, ask the\n      // stack walker for a new context.\n      in_host_context = override_context;\n    }\n    size_t count = stack_walker_->CaptureStackTrace(\n        thread->thread()->native_handle(), frame_host_pcs, 0,\n        xe::countof(frame_host_pcs), in_host_context,\n        &thread_info->host_context, &hash);\n    stack_walker_->ResolveStack(frame_host_pcs, cpu_frames, count);\n    thread_info->frames.resize(count);\n    for (size_t i = 0; i < count; ++i) {\n      auto& cpu_frame = cpu_frames[i];\n      auto& frame = thread_info->frames[i];\n      frame.host_pc = cpu_frame.host_pc;\n      frame.host_function_address = cpu_frame.host_symbol.address;\n      frame.guest_pc = cpu_frame.guest_pc;\n      frame.guest_function_address = 0;\n      frame.guest_function = nullptr;\n      auto function = cpu_frame.guest_symbol.function;\n      if (cpu_frame.type == cpu::StackFrame::Type::kGuest && function) {\n        frame.guest_function_address = function->address();\n        frame.guest_function = function;\n      } else {\n        std::strncpy(frame.name, cpu_frame.host_symbol.name,\n                     xe::countof(frame.name));\n        frame.name[xe::countof(frame.name) - 1] = 0;\n      }\n    }\n  }\n}\n\nvoid Processor::SuspendAllBreakpoints() {\n  auto global_lock = global_critical_region_.Acquire();\n  for (auto breakpoint : breakpoints_) {\n    breakpoint->Suspend();\n  }\n}\n\nvoid Processor::ResumeAllBreakpoints() {\n  auto global_lock = global_critical_region_.Acquire();\n  for (auto breakpoint : breakpoints_) {\n    breakpoint->Resume();\n  }\n}\n\nvoid Processor::Pause() {\n  {\n    auto global_lock = global_critical_region_.Acquire();\n    assert_true(execution_state_ == ExecutionState::kRunning);\n    SuspendAllThreads();\n    SuspendAllBreakpoints();\n    UpdateThreadExecutionStates();\n    execution_state_ = ExecutionState::kPaused;\n    if (debug_listener_) {\n      debug_listener_->OnExecutionPaused();\n    }\n  }\n  DemandDebugListener();\n}\n\nvoid Processor::Continue() {\n  auto global_lock = global_critical_region_.Acquire();\n  if (execution_state_ == ExecutionState::kRunning) {\n    return;\n  } else if (execution_state_ == ExecutionState::kStepping) {\n    assert_always(\"cancel stepping not done yet\");\n  }\n  execution_state_ = ExecutionState::kRunning;\n  ResumeAllBreakpoints();\n  ResumeAllThreads();\n  if (debug_listener_) {\n    debug_listener_->OnExecutionContinued();\n  }\n}\n\nvoid Processor::StepHostInstruction(uint32_t thread_id) {\n  auto global_lock = global_critical_region_.Acquire();\n  assert_true(execution_state_ == ExecutionState::kPaused);\n  execution_state_ = ExecutionState::kStepping;\n\n  auto thread_info = QueryThreadDebugInfo(thread_id);\n  uint64_t new_host_pc = backend_->CalculateNextHostInstruction(\n      thread_info, thread_info->frames[0].host_pc);\n\n  assert_null(thread_info->step_breakpoint.get());\n  thread_info->step_breakpoint.reset(\n      new Breakpoint(this, Breakpoint::AddressType::kHost, new_host_pc,\n                     [this, thread_info](Breakpoint* breakpoint,\n                                         ThreadDebugInfo* breaking_thread_info,\n                                         uint64_t host_address) {\n                       if (thread_info != breaking_thread_info) {\n                         assert_always(\"Step in another thread?\");\n                       }\n                       // Our step request has completed. Remove the breakpoint\n                       // and fire event.\n                       breakpoint->Suspend();\n                       RemoveBreakpoint(breakpoint);\n                       thread_info->step_breakpoint.reset();\n                       OnStepCompleted(thread_info);\n                     }));\n  AddBreakpoint(thread_info->step_breakpoint.get());\n  thread_info->step_breakpoint->Resume();\n\n  // ResumeAllBreakpoints();\n  ResumeThread(thread_id);\n}\n\nvoid Processor::StepGuestInstruction(uint32_t thread_id) {\n  auto global_lock = global_critical_region_.Acquire();\n  assert_true(execution_state_ == ExecutionState::kPaused);\n  execution_state_ = ExecutionState::kStepping;\n\n  auto thread_info = QueryThreadDebugInfo(thread_id);\n\n  uint32_t next_pc = CalculateNextGuestInstruction(\n      thread_info, thread_info->frames[0].guest_pc);\n\n  assert_null(thread_info->step_breakpoint.get());\n  thread_info->step_breakpoint.reset(\n      new Breakpoint(this, Breakpoint::AddressType::kGuest, next_pc,\n                     [this, thread_info](Breakpoint* breakpoint,\n                                         ThreadDebugInfo* breaking_thread_info,\n                                         uint64_t host_address) {\n                       if (thread_info != breaking_thread_info) {\n                         assert_always(\"Step in another thread?\");\n                       }\n                       // Our step request has completed. Remove the breakpoint\n                       // and fire event.\n                       breakpoint->Suspend();\n                       RemoveBreakpoint(breakpoint);\n                       thread_info->step_breakpoint.reset();\n                       OnStepCompleted(thread_info);\n                     }));\n  AddBreakpoint(thread_info->step_breakpoint.get());\n  thread_info->step_breakpoint->Resume();\n\n  // ResumeAllBreakpoints();\n  ResumeThread(thread_id);\n}\n\nbool Processor::StepToGuestAddress(uint32_t thread_id, uint32_t pc) {\n  auto functions = FindFunctionsWithAddress(pc);\n  if (functions.empty()) {\n    // Function hasn't been generated yet. Generate it.\n    if (!ResolveFunction(pc)) {\n      XELOGE(\n          \"Processor::StepToAddress({:08X}) - Function could not be resolved\",\n          pc);\n      return false;\n    }\n  }\n\n  // Instruct the thread to step forwards.\n  threading::Fence fence;\n  cpu::Breakpoint bp(\n      this, Breakpoint::AddressType::kGuest, pc,\n      [&fence](Breakpoint* breakpoint, ThreadDebugInfo* thread_info,\n               uint64_t host_address) { fence.Signal(); });\n  bp.Resume();\n\n  // HACK\n  auto thread_info = QueryThreadDebugInfo(thread_id);\n  uint32_t suspend_count = 1;\n  while (suspend_count) {\n    thread_info->thread->thread()->Resume(&suspend_count);\n  }\n\n  fence.Wait();\n  bp.Suspend();\n\n  return true;\n}\n\nuint32_t Processor::StepIntoGuestBranchTarget(uint32_t thread_id, uint32_t pc) {\n  xe::cpu::ppc::PPCDecodeData d;\n  d.address = pc;\n  d.code = xe::load_and_swap<uint32_t>(memory()->TranslateVirtual(d.address));\n  auto opcode = xe::cpu::ppc::LookupOpcode(d.code);\n\n  // Must be on a branch.\n  assert_true(xe::cpu::ppc::GetOpcodeInfo(opcode).group ==\n              xe::cpu::ppc::PPCOpcodeGroup::kB);\n\n  auto thread_info = QueryThreadDebugInfo(thread_id);\n  auto thread = thread_info->thread;\n  auto context = thread->thread_state()->context();\n\n  if (d.code == 0x4E800020) {\n    // blr\n    uint32_t nia = uint32_t(context->lr);\n    StepToGuestAddress(thread_id, nia);\n    pc = nia;\n  } else if (d.code == 0x4E800420) {\n    // bctr\n    uint32_t nia = uint32_t(context->ctr);\n    StepToGuestAddress(thread_id, nia);\n    pc = nia;\n  } else if (opcode == PPCOpcode::bx) {\n    // bx\n    uint32_t nia = d.I.ADDR();\n    StepToGuestAddress(thread_id, nia);\n    pc = nia;\n  } else if (opcode == PPCOpcode::bcx || opcode == PPCOpcode::bcctrx ||\n             opcode == PPCOpcode::bclrx) {\n    threading::Fence fence;\n    auto callback = [&fence, &pc](Breakpoint* breakpoint,\n                                  ThreadDebugInfo* thread_info,\n                                  uint64_t host_address) {\n      pc = breakpoint->guest_address();\n      fence.Signal();\n    };\n\n    cpu::Breakpoint bpf(this, Breakpoint::AddressType::kGuest, pc + 4,\n                        callback);\n    bpf.Resume();\n\n    uint32_t nia = 0;\n    if (opcode == PPCOpcode::bcx) {\n      // bcx\n      nia = d.B.ADDR();\n    } else if (opcode == PPCOpcode::bcctrx) {\n      // bcctrx\n      nia = uint32_t(context->ctr);\n    } else if (opcode == PPCOpcode::bclrx) {\n      // bclrx\n      nia = uint32_t(context->lr);\n    }\n\n    cpu::Breakpoint bpt(this, Breakpoint::AddressType::kGuest, nia, callback);\n    bpt.Resume();\n\n    // HACK\n    uint32_t suspend_count = 1;\n    while (suspend_count) {\n      thread->thread()->Resume(&suspend_count);\n    }\n\n    fence.Wait();\n    bpt.Suspend();\n    bpf.Suspend();\n  }\n\n  return pc;\n}\n\nuint32_t Processor::StepToGuestSafePoint(uint32_t thread_id, bool ignore_host) {\n  // This cannot be done if we're the calling thread!\n  if (thread_id == ThreadState::GetThreadID()) {\n    assert_always(\n        \"Processor::StepToSafePoint(): target thread is the calling thread!\");\n    return 0;\n  }\n  auto thread_info = QueryThreadDebugInfo(thread_id);\n  auto thread = thread_info->thread;\n\n  // Now the fun part begins: Registers are only guaranteed to be synchronized\n  // with the PPC context at a basic block boundary. Unfortunately, we most\n  // likely stopped the thread at some point other than a boundary. We need to\n  // step forward until we reach a boundary, and then perform the save.\n  uint64_t frame_host_pcs[64];\n  cpu::StackFrame cpu_frames[64];\n  size_t count = stack_walker_->CaptureStackTrace(\n      thread->thread()->native_handle(), frame_host_pcs, 0,\n      xe::countof(frame_host_pcs), nullptr, nullptr);\n  stack_walker_->ResolveStack(frame_host_pcs, cpu_frames, count);\n  if (count == 0) {\n    return 0;\n  }\n\n  auto& first_frame = cpu_frames[0];\n  if (ignore_host) {\n    for (size_t i = 0; i < count; i++) {\n      if (cpu_frames[i].type == cpu::StackFrame::Type::kGuest &&\n          cpu_frames[i].guest_pc) {\n        first_frame = cpu_frames[i];\n        break;\n      }\n    }\n  }\n\n  // Check if we're in guest code or host code.\n  uint32_t pc = 0;\n  if (first_frame.type == cpu::StackFrame::Type::kGuest) {\n    auto& frame = first_frame;\n    if (!frame.guest_pc) {\n      // Lame. The guest->host thunk is a \"guest\" function.\n      frame = cpu_frames[1];\n    }\n\n    pc = frame.guest_pc;\n\n    // We're in guest code.\n    // First: Find a synchronizing instruction and go to it.\n    xe::cpu::ppc::PPCDecodeData d;\n    const xe::cpu::ppc::PPCOpcodeInfo* sync_info = nullptr;\n    d.address = cpu_frames[0].guest_pc - 4;\n    do {\n      d.address += 4;\n      d.code =\n          xe::load_and_swap<uint32_t>(memory()->TranslateVirtual(d.address));\n      auto& opcode_info = xe::cpu::ppc::LookupOpcodeInfo(d.code);\n      if (opcode_info.type == cpu::ppc::PPCOpcodeType::kSync) {\n        sync_info = &opcode_info;\n        break;\n      }\n    } while (true);\n\n    if (d.address != pc) {\n      StepToGuestAddress(thread_id, d.address);\n      pc = d.address;\n    }\n\n    // Okay. Now we're on a synchronizing instruction but we need to step\n    // past it in order to get a synchronized context.\n    // If we're on a branching instruction, it's guaranteed only going to have\n    // two possible targets. For non-branching instructions, we can just step\n    // over them.\n    if (sync_info->group == xe::cpu::ppc::PPCOpcodeGroup::kB) {\n      pc = StepIntoGuestBranchTarget(thread_id, d.address);\n    }\n  } else {\n    // We're in host code. Search backwards til we can get an idea of where\n    // we are.\n    cpu::GuestFunction* thunk_func = nullptr;\n    cpu::Export* export_data = nullptr;\n    uint32_t first_pc = 0;\n    for (int i = 0; i < count; i++) {\n      auto& frame = cpu_frames[i];\n      if (frame.type == cpu::StackFrame::Type::kGuest && frame.guest_pc) {\n        auto func = frame.guest_symbol.function;\n        assert_true(func->is_guest());\n\n        if (!first_pc) {\n          first_pc = frame.guest_pc;\n        }\n\n        thunk_func = reinterpret_cast<cpu::GuestFunction*>(func);\n        export_data = thunk_func->export_data();\n        if (export_data) {\n          break;\n        }\n      }\n    }\n\n    // If the export is blocking, we wrap up and save inside the export thunk.\n    // When we're restored, we'll call the blocking export again.\n    // Otherwise, we return from the thunk and save.\n    if (export_data && export_data->tags & cpu::ExportTag::kBlocking) {\n      pc = thunk_func->address();\n    } else if (export_data) {\n      // Non-blocking. Run until we return from the thunk.\n      pc = static_cast<uint32_t>(thread->thread_state()->context()->lr);\n      StepToGuestAddress(thread_id, pc);\n    } else if (first_pc) {\n      // We're in the MMIO handler/mfmsr/something calling out of the guest\n      // that doesn't use an export. If the current instruction is\n      // synchronizing, we can just save here. Otherwise, step forward\n      // (and call ourselves again so we run the correct logic).\n      uint32_t code =\n          xe::load_and_swap<uint32_t>(memory()->TranslateVirtual(first_pc));\n      auto& opcode_info = xe::cpu::ppc::LookupOpcodeInfo(code);\n      if (opcode_info.type == xe::cpu::ppc::PPCOpcodeType::kSync) {\n        // Good to go.\n        pc = first_pc;\n      } else {\n        // Step forward and run this logic again.\n        StepToGuestAddress(thread_id, first_pc + 4);\n        return StepToGuestSafePoint(thread_id, true);\n      }\n    } else {\n      // We've managed to catch a thread before it called into the guest.\n      // Set a breakpoint on its startup procedure and capture it there.\n      // TODO(DrChat): Reimplement\n      assert_always(\"Unimplemented\");\n      /*\n      auto creation_params = thread->creation_params();\n      pc = creation_params->xapi_thread_startup\n               ? creation_params->xapi_thread_startup\n               : creation_params->start_address;\n      StepToGuestAddress(thread_id, pc);\n      */\n    }\n  }\n\n  return pc;\n}\n\nbool TestPpcCondition(const xe::cpu::ppc::PPCContext* context, uint32_t bo,\n                      uint32_t bi, bool check_ctr, bool check_cond) {\n  bool ctr_ok = true;\n  if (check_ctr) {\n    if (select_bits(bo, 2, 2)) {\n      ctr_ok = true;\n    } else {\n      uint32_t new_ctr_value = static_cast<uint32_t>(context->ctr - 1);\n      if (select_bits(bo, 1, 1)) {\n        ctr_ok = new_ctr_value == 0;\n      } else {\n        ctr_ok = new_ctr_value != 0;\n      }\n    }\n  }\n  bool cond_ok = true;\n  if (check_cond) {\n    if (select_bits(bo, 4, 4)) {\n      cond_ok = true;\n    } else {\n      uint8_t cr = *(reinterpret_cast<const uint8_t*>(&context->cr0) +\n                     (4 * (bi >> 2)) + (bi & 3));\n      if (select_bits(bo, 3, 3)) {\n        cond_ok = cr != 0;\n      } else {\n        cond_ok = cr == 0;\n      }\n    }\n  }\n  return ctr_ok && cond_ok;\n}\n\nuint32_t Processor::CalculateNextGuestInstruction(ThreadDebugInfo* thread_info,\n                                                  uint32_t current_pc) {\n  xe::cpu::ppc::PPCDecodeData d;\n  d.address = current_pc;\n  d.code = xe::load_and_swap<uint32_t>(memory_->TranslateVirtual(d.address));\n  auto opcode = xe::cpu::ppc::LookupOpcode(d.code);\n  if (d.code == 0x4E800020) {\n    // blr -- unconditional branch to LR.\n    uint32_t target_pc = static_cast<uint32_t>(thread_info->guest_context.lr);\n    return target_pc;\n  } else if (d.code == 0x4E800420) {\n    // bctr -- unconditional branch to CTR.\n    uint32_t target_pc = static_cast<uint32_t>(thread_info->guest_context.ctr);\n    return target_pc;\n  } else if (opcode == PPCOpcode::bx) {\n    // b/ba/bl/bla\n    uint32_t target_pc = d.I.ADDR();\n    return target_pc;\n  } else if (opcode == PPCOpcode::bcx) {\n    // bc/bca/bcl/bcla\n    uint32_t target_pc = d.B.ADDR();\n    bool test_passed = TestPpcCondition(&thread_info->guest_context, d.B.BO(),\n                                        d.B.BI(), true, true);\n    return test_passed ? target_pc : current_pc + 4;\n  } else if (opcode == PPCOpcode::bclrx) {\n    // bclr/bclrl\n    uint32_t target_pc = static_cast<uint32_t>(thread_info->guest_context.lr);\n    bool test_passed = TestPpcCondition(&thread_info->guest_context, d.XL.BO(),\n                                        d.XL.BI(), true, true);\n    return test_passed ? target_pc : current_pc + 4;\n  } else if (opcode == PPCOpcode::bcctrx) {\n    // bcctr/bcctrl\n    uint32_t target_pc = static_cast<uint32_t>(thread_info->guest_context.ctr);\n    bool test_passed = TestPpcCondition(&thread_info->guest_context, d.XL.BO(),\n                                        d.XL.BI(), false, true);\n    return test_passed ? target_pc : current_pc + 4;\n  } else {\n    return current_pc + 4;\n  }\n}\n\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/processor.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_PROCESSOR_H_\n#define XENIA_CPU_PROCESSOR_H_\n\n#include <map>\n#include <memory>\n#include <string>\n#include <vector>\n\n#include \"xenia/base/cvar.h\"\n#include \"xenia/base/mapped_memory.h\"\n#include \"xenia/base/mutex.h\"\n#include \"xenia/cpu/backend/backend.h\"\n#include \"xenia/cpu/debug_listener.h\"\n#include \"xenia/cpu/entry_table.h\"\n#include \"xenia/cpu/export_resolver.h\"\n#include \"xenia/cpu/function.h\"\n#include \"xenia/cpu/module.h\"\n#include \"xenia/cpu/ppc/ppc_frontend.h\"\n#include \"xenia/cpu/thread_debug_info.h\"\n#include \"xenia/cpu/thread_state.h\"\n#include \"xenia/memory.h\"\n\nDECLARE_bool(debug);\n\nnamespace xe {\nnamespace cpu {\n\nconstexpr fourcc_t kProcessorSaveSignature = make_fourcc(\"PROC\");\n\nclass Breakpoint;\nclass StackWalker;\nclass XexModule;\n\nenum class Irql : uint32_t {\n  PASSIVE = 0,\n  APC = 1,\n  DISPATCH = 2,\n  DPC = 3,\n};\n\n// Describes the current state of the emulator as known to the debugger.\n// This determines which state the debugger is in and what operations are\n// allowed.\nenum class ExecutionState {\n  // Target is running; the debugger is not waiting for any events.\n  kRunning,\n  // Target is running in stepping mode with the debugger waiting for feedback.\n  kStepping,\n  // Target is paused for debugging.\n  kPaused,\n  // Target has been stopped and cannot be restarted (crash, etc).\n  kEnded,\n};\n\nclass Processor {\n public:\n  Processor(Memory* memory, ExportResolver* export_resolver);\n  ~Processor();\n\n  Memory* memory() const { return memory_; }\n  StackWalker* stack_walker() const { return stack_walker_.get(); }\n  ppc::PPCFrontend* frontend() const { return frontend_.get(); }\n  backend::Backend* backend() const { return backend_.get(); }\n  ExportResolver* export_resolver() const { return export_resolver_; }\n\n  bool Setup(std::unique_ptr<backend::Backend> backend);\n\n  // Runs any pre-launch logic once the module and thread have been setup.\n  void PreLaunch();\n\n  // The current execution state of the emulator.\n  ExecutionState execution_state() const { return execution_state_; }\n\n  // True if a debug listener is attached and the debugger is active.\n  bool is_debugger_attached() const { return !!debug_listener_; }\n  // Gets the active debug listener, if any.\n  DebugListener* debug_listener() const { return debug_listener_; }\n  // Sets the active debug listener, if any.\n  // This can be used to detach the listener.\n  void set_debug_listener(DebugListener* debug_listener);\n  // Sets a handler that will be called from a random thread when a debugger\n  // listener is required (such as on a breakpoint hit/etc).\n  // Will only be called if the debug listener has not already been specified\n  // with set_debug_listener.\n  void set_debug_listener_request_handler(\n      std::function<DebugListener*(Processor*)> handler) {\n    debug_listener_handler_ = std::move(handler);\n  }\n\n  void set_debug_info_flags(uint32_t debug_info_flags) {\n    debug_info_flags_ = debug_info_flags;\n  }\n\n  bool AddModule(std::unique_ptr<Module> module);\n  Module* GetModule(const std::string_view name);\n  std::vector<Module*> GetModules();\n\n  Module* builtin_module() const { return builtin_module_; }\n  Function* DefineBuiltin(const std::string_view name,\n                          BuiltinFunction::Handler handler, void* arg0,\n                          void* arg1);\n\n  Function* QueryFunction(uint32_t address);\n  std::vector<Function*> FindFunctionsWithAddress(uint32_t address);\n\n  Function* LookupFunction(uint32_t address);\n  Function* LookupFunction(Module* module, uint32_t address);\n  Function* ResolveFunction(uint32_t address);\n\n  bool Execute(ThreadState* thread_state, uint32_t address);\n  bool ExecuteRaw(ThreadState* thread_state, uint32_t address);\n  uint64_t Execute(ThreadState* thread_state, uint32_t address, uint64_t args[],\n                   size_t arg_count);\n  uint64_t ExecuteInterrupt(ThreadState* thread_state, uint32_t address,\n                            uint64_t args[], size_t arg_count);\n\n  Irql RaiseIrql(Irql new_value);\n  void LowerIrql(Irql old_value);\n\n  bool Save(ByteStream* stream);\n  bool Restore(ByteStream* stream);\n\n  // Returns a list of debugger info for all threads that have ever existed.\n  // This is the preferred way to sample thread state vs. attempting to ask\n  // the kernel.\n  std::vector<ThreadDebugInfo*> QueryThreadDebugInfos();\n\n  // Returns the debugger info for the given thread.\n  ThreadDebugInfo* QueryThreadDebugInfo(uint32_t thread_id);\n\n  // Adds a breakpoint to the debugger and activates it (if enabled).\n  // The given breakpoint will not be owned by the debugger and must remain\n  // allocated so long as it is added.\n  void AddBreakpoint(Breakpoint* breakpoint);\n\n  // Removes a breakpoint from the debugger and deactivates it.\n  void RemoveBreakpoint(Breakpoint* breakpoint);\n\n  // Finds a breakpoint that may be registered at the given address.\n  Breakpoint* FindBreakpoint(uint32_t address);\n\n  // Returns all currently registered breakpoints.\n  std::vector<Breakpoint*> breakpoints() const;\n\n  // Shows the debug listener, focusing it if it already exists.\n  void ShowDebugger();\n\n  // Pauses target execution by suspending all threads.\n  // The debug listener will be requested if it has not been attached.\n  void Pause();\n\n  // Continues target execution from wherever it is.\n  // This will cancel any active step operations and resume all threads.\n  void Continue();\n\n  // Steps the given thread a single x64 host instruction.\n  // If the step is over a branch the branch will be followed.\n  void StepHostInstruction(uint32_t thread_id);\n\n  // Steps the given thread a single PPC guest instruction.\n  // If the step is over a branch the branch will be followed.\n  void StepGuestInstruction(uint32_t thread_id);\n\n  // Steps the given thread until the guest address is hit.\n  // Returns false if the step could not be completed (invalid target address).\n  bool StepToGuestAddress(uint32_t thread_id, uint32_t pc);\n\n  // Steps the given thread to the target of the branch at the specified guest\n  // address. The address must specify a branch instruction.\n  // Returns the new PC guest address.\n  uint32_t StepIntoGuestBranchTarget(uint32_t thread_id, uint32_t pc);\n\n  // Steps the thread to a point where it's safe to terminate or read its\n  // context. Returns the PC after we've finished stepping.\n  // Pass true for ignore_host if you've stopped the thread yourself\n  // in host code you want to ignore.\n  // Returns the new PC guest address.\n  uint32_t StepToGuestSafePoint(uint32_t thread_id, bool ignore_host = false);\n\n public:\n  // TODO(benvanik): hide.\n  void OnThreadCreated(uint32_t handle, ThreadState* thread_state,\n                       Thread* thread);\n  void OnThreadExit(uint32_t thread_id);\n  void OnThreadDestroyed(uint32_t thread_id);\n  void OnThreadEnteringWait(uint32_t thread_id);\n  void OnThreadLeavingWait(uint32_t thread_id);\n\n  bool OnUnhandledException(Exception* ex);\n  bool OnThreadBreakpointHit(Exception* ex);\n\n  uint8_t* AllocateFunctionTraceData(size_t size);\n\n private:\n  // Synchronously demands a debug listener.\n  void DemandDebugListener();\n\n  // Suspends all known threads (except the caller).\n  bool SuspendAllThreads();\n  // Resumes the given thread.\n  bool ResumeThread(uint32_t thread_id);\n  // Resumes all known threads (except the caller).\n  bool ResumeAllThreads();\n  // Updates all cached thread execution info (state, call stacks, etc).\n  // The given override thread handle and context will be used in place of\n  // sampled values for that thread.\n  void UpdateThreadExecutionStates(\n      uint32_t override_handle = 0,\n      HostThreadContext* override_context = nullptr);\n\n  // Suspends all breakpoints, uninstalling them as required.\n  // No breakpoints will be triggered until they are resumed.\n  void SuspendAllBreakpoints();\n  // Resumes all breakpoints, re-installing them if required.\n  void ResumeAllBreakpoints();\n\n  void OnFunctionDefined(Function* function);\n\n  static bool ExceptionCallbackThunk(Exception* ex, void* data);\n  bool ExceptionCallback(Exception* ex);\n  void OnStepCompleted(ThreadDebugInfo* thread_info);\n  void OnBreakpointHit(ThreadDebugInfo* thread_info, Breakpoint* breakpoint);\n\n  // Calculates the next guest instruction based on the current thread state and\n  // current PC. This will look for branches and other control flow\n  // instructions.\n  uint32_t CalculateNextGuestInstruction(ThreadDebugInfo* thread_info,\n                                         uint32_t current_pc);\n\n  bool DemandFunction(Function* function);\n\n  Memory* memory_ = nullptr;\n  std::unique_ptr<StackWalker> stack_walker_;\n\n  std::function<DebugListener*(Processor*)> debug_listener_handler_;\n  DebugListener* debug_listener_ = nullptr;\n\n  // Which debug features are enabled in generated code.\n  uint32_t debug_info_flags_ = 0;\n  // If specified, the file trace data gets written to when running.\n  std::filesystem::path functions_trace_path_;\n  std::unique_ptr<ChunkedMappedMemoryWriter> functions_trace_file_;\n\n  std::unique_ptr<ppc::PPCFrontend> frontend_;\n  std::unique_ptr<backend::Backend> backend_;\n  ExportResolver* export_resolver_ = nullptr;\n\n  EntryTable entry_table_;\n  xe::global_critical_region global_critical_region_;\n  ExecutionState execution_state_ = ExecutionState::kPaused;\n  std::vector<std::unique_ptr<Module>> modules_;\n  Module* builtin_module_ = nullptr;\n  uint32_t next_builtin_address_ = 0xFFFF0000u;\n\n  // Maps thread ID to state. Updated on thread create, and threads are never\n  // removed. Must be guarded with the global lock.\n  std::map<uint32_t, std::unique_ptr<ThreadDebugInfo>> thread_debug_infos_;\n\n  // TODO(benvanik): cleanup/change structures.\n  std::vector<Breakpoint*> breakpoints_;\n\n  Irql irql_;\n};\n\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_PROCESSOR_H_\n"
  },
  {
    "path": "src/xenia/cpu/raw_module.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/raw_module.h\"\n\n#include \"xenia/base/filesystem.h\"\n#include \"xenia/base/platform.h\"\n#include \"xenia/base/string.h\"\n#include \"xenia/cpu/function.h\"\n#include \"xenia/cpu/processor.h\"\n\nnamespace xe {\nnamespace cpu {\n\nRawModule::RawModule(Processor* processor)\n    : Module(processor), base_address_(0), low_address_(0), high_address_(0) {}\n\nRawModule::~RawModule() {}\n\nbool RawModule::LoadFile(uint32_t base_address,\n                         const std::filesystem::path& path) {\n  FILE* file = xe::filesystem::OpenFile(path, \"rb\");\n  fseek(file, 0, SEEK_END);\n  uint32_t file_length = static_cast<uint32_t>(ftell(file));\n  fseek(file, 0, SEEK_SET);\n\n  // Allocate memory.\n  // Since we have no real heap just load it wherever.\n  base_address_ = base_address;\n  auto heap = memory_->LookupHeap(base_address_);\n  if (!heap ||\n      !heap->AllocFixed(base_address_, file_length, 0,\n                        kMemoryAllocationReserve | kMemoryAllocationCommit,\n                        kMemoryProtectRead | kMemoryProtectWrite)) {\n    return false;\n  }\n\n  uint8_t* p = memory_->TranslateVirtual(base_address_);\n\n  // Read into memory.\n  fread(p, file_length, 1, file);\n  fclose(file);\n\n  // Setup debug info.\n  name_ = xe::path_to_utf8(path.filename());\n  // TODO(benvanik): debug info\n\n  low_address_ = base_address;\n  high_address_ = base_address + file_length;\n\n  // Notify backend about executable code.\n  processor_->backend()->CommitExecutableRange(low_address_, high_address_);\n  return true;\n}\n\nvoid RawModule::SetAddressRange(uint32_t base_address, uint32_t size) {\n  base_address_ = base_address;\n  low_address_ = base_address;\n  high_address_ = base_address + size;\n\n  // Notify backend about executable code.\n  processor_->backend()->CommitExecutableRange(low_address_, high_address_);\n}\n\nbool RawModule::ContainsAddress(uint32_t address) {\n  return address >= low_address_ && address < high_address_;\n}\n\nstd::unique_ptr<Function> RawModule::CreateFunction(uint32_t address) {\n  return std::unique_ptr<Function>(\n      processor_->backend()->CreateGuestFunction(this, address));\n}\n\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/raw_module.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_RAW_MODULE_H_\n#define XENIA_CPU_RAW_MODULE_H_\n\n#include <string>\n\n#include \"xenia/cpu/module.h\"\n\nnamespace xe {\nnamespace cpu {\n\nclass RawModule : public Module {\n public:\n  explicit RawModule(Processor* processor);\n  ~RawModule() override;\n\n  bool LoadFile(uint32_t base_address, const std::filesystem::path& path);\n\n  // Set address range if you've already allocated memory and placed code\n  // in it.\n  void SetAddressRange(uint32_t base_address, uint32_t size);\n\n  const std::string& name() const override { return name_; }\n  bool is_executable() const override { return is_executable_; }\n  void set_name(const std::string_view name) { name_ = name; }\n  void set_executable(bool is_executable) { is_executable_ = is_executable; }\n\n  bool ContainsAddress(uint32_t address) override;\n\n protected:\n  std::unique_ptr<Function> CreateFunction(uint32_t address) override;\n\n private:\n  std::string name_;\n  bool is_executable_ = false;\n  uint32_t base_address_;\n  uint32_t low_address_;\n  uint32_t high_address_;\n};\n\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_RAW_MODULE_H_\n"
  },
  {
    "path": "src/xenia/cpu/stack_walker.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2015 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_STACK_WALKER_H_\n#define XENIA_CPU_STACK_WALKER_H_\n\n#include <memory>\n#include <string>\n\n#include \"xenia/base/host_thread_context.h\"\n#include \"xenia/cpu/function.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace backend {\nclass CodeCache;\n}  // namespace backend\n}  // namespace cpu\n}  // namespace xe\n\nnamespace xe {\nnamespace cpu {\n\nstruct StackFrame {\n  enum class Type {\n    // Host frame, likely in kernel or emulator code.\n    kHost,\n    // Guest frame, somewhere in PPC code.\n    kGuest,\n  };\n  Type type;\n\n  // Always valid, indicating the address in a backend-defined range.\n  uint64_t host_pc;\n  // Only valid for kGuest frames, indicating the PPC address.\n  uint32_t guest_pc;\n\n  union {\n    // Contains symbol information for kHost frames.\n    struct {\n      // TODO(benvanik): better name, displacement, etc.\n      uint64_t address;\n      char name[256];\n    } host_symbol;\n    // Contains symbol information for kGuest frames.\n    struct {\n      Function* function;\n    } guest_symbol;\n  };\n};\n\nclass StackWalker {\n public:\n  // Creates a stack walker. Only one should exist within a process.\n  // May fail if another process has mucked with ours (like RenderDoc).\n  static std::unique_ptr<StackWalker> Create(backend::CodeCache* code_cache);\n\n  // Dumps all thread stacks to the log.\n  void Dump();\n\n  // Captures up to the given number of stack frames from the current thread.\n  // Use ResolveStackTrace to populate additional information.\n  // Returns the number of frames captured, or 0 if an error occurred.\n  // Optionally provides a hash value for the stack that can be used for\n  // deduping.\n  virtual size_t CaptureStackTrace(uint64_t* frame_host_pcs,\n                                   size_t frame_offset, size_t frame_count,\n                                   uint64_t* out_stack_hash = nullptr) = 0;\n\n  // Captures up to the given number of stack frames from the given thread,\n  // referenced by native thread handle. The thread must be suspended.\n  // This does not populate any information other than host_pc.\n  // Use ResolveStackTrace to populate additional information.\n  // Returns the number of frames captured, or 0 if an error occurred.\n  // Optionally provides a hash value for the stack that can be used for\n  // deduping.\n  virtual size_t CaptureStackTrace(void* thread_handle,\n                                   uint64_t* frame_host_pcs,\n                                   size_t frame_offset, size_t frame_count,\n                                   const HostThreadContext* in_host_context,\n                                   HostThreadContext* out_host_context,\n                                   uint64_t* out_stack_hash = nullptr) = 0;\n\n  // Resolves symbol information for the given stack frames.\n  // Each frame provided must have host_pc set, and all other fields will be\n  // populated.\n  virtual bool ResolveStack(uint64_t* frame_host_pcs, StackFrame* frames,\n                            size_t frame_count) = 0;\n\n  virtual ~StackWalker() = default;\n};\n\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_STACK_WALKER_H_\n"
  },
  {
    "path": "src/xenia/cpu/stack_walker_posix.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2017 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/stack_walker.h\"\n\n#include \"xenia/base/logging.h\"\n\nnamespace xe {\nnamespace cpu {\n\nstd::unique_ptr<StackWalker> StackWalker::Create(\n    backend::CodeCache* code_cache) {\n  XELOGD(\"Stack walker unimplemented on posix\");\n  return nullptr;\n}\n\n}  // namespace cpu\n}  // namespace xe"
  },
  {
    "path": "src/xenia/cpu/stack_walker_win.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2015 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/stack_walker.h\"\n\n#include <cstdint>\n#include <mutex>\n\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/platform_win.h\"\n#include \"xenia/cpu/backend/backend.h\"\n#include \"xenia/cpu/backend/code_cache.h\"\n#include \"xenia/cpu/processor.h\"\n\nDEFINE_bool(debug_symbol_loader, false,\n            \"Enable dbghelp debug logging and validation.\", \"CPU\");\n\n// Must be included after platform_win.h:\n#pragma warning(push)\n#pragma warning(disable : 4091)\n#include <dbghelp.h>  // NOLINT(build/include_order)\n#pragma warning(pop)\n\ntypedef DWORD(__stdcall* LPSYMGETOPTIONS)(VOID);\ntypedef DWORD(__stdcall* LPSYMSETOPTIONS)(IN DWORD SymOptions);\ntypedef BOOL(__stdcall* LPSYMINITIALIZE)(IN HANDLE hProcess,\n                                         IN PSTR UserSearchPath,\n                                         IN BOOL fInvadeProcess);\ntypedef BOOL(__stdcall* LPSTACKWALK64)(\n    DWORD MachineType, HANDLE hProcess, HANDLE hThread,\n    LPSTACKFRAME64 StackFrame, PVOID ContextRecord,\n    PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine,\n    PFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine,\n    PGET_MODULE_BASE_ROUTINE64 GetModuleBaseRoutine,\n    PTRANSLATE_ADDRESS_ROUTINE64 TranslateAddress);\ntypedef PVOID(__stdcall* LPSYMFUNCTIONTABLEACCESS64)(\n    HANDLE hProcess,\n    DWORD64 AddrBase);  // DbgHelp.h typedef PFUNCTION_TABLE_ACCESS_ROUTINE64\ntypedef DWORD64(__stdcall* LPSYMGETMODULEBASE64)(\n    HANDLE hProcess,\n    DWORD64 AddrBase);  // DbgHelp.h typedef PGET_MODULE_BASE_ROUTINE64\ntypedef BOOL(__stdcall* LPSYMGETSYMFROMADDR64)(IN HANDLE hProcess,\n                                               IN DWORD64 qwAddr,\n                                               OUT PDWORD64 pdwDisplacement,\n                                               OUT PIMAGEHLP_SYMBOL64 Symbol);\n\nLPSYMGETOPTIONS sym_get_options_ = nullptr;\nLPSYMSETOPTIONS sym_set_options_ = nullptr;\nLPSYMINITIALIZE sym_initialize_ = nullptr;\nLPSTACKWALK64 stack_walk_64_ = nullptr;\nLPSYMFUNCTIONTABLEACCESS64 sym_function_table_access_64_ = nullptr;\nLPSYMGETMODULEBASE64 sym_get_module_base_64_ = nullptr;\nLPSYMGETSYMFROMADDR64 sym_get_sym_from_addr_64_ = nullptr;\n\nnamespace xe {\nnamespace cpu {\n\nbool InitializeStackWalker() {\n  if (sym_get_options_) {\n    // Already initialized.\n    return true;\n  }\n\n  // Attempt to load dbghelp.\n  // NOTE: we never free it. That's fine.\n  HMODULE module = LoadLibrary(TEXT(\"dbghelp.dll\"));\n  if (!module) {\n    XELOGE(\"Unable to load dbghelp.dll - not found on path or invalid\");\n    return false;\n  }\n  sym_get_options_ = reinterpret_cast<LPSYMGETOPTIONS>(\n      GetProcAddress(module, \"SymGetOptions\"));\n  sym_set_options_ = reinterpret_cast<LPSYMSETOPTIONS>(\n      GetProcAddress(module, \"SymSetOptions\"));\n  sym_initialize_ = reinterpret_cast<LPSYMINITIALIZE>(\n      GetProcAddress(module, \"SymInitialize\"));\n  stack_walk_64_ =\n      reinterpret_cast<LPSTACKWALK64>(GetProcAddress(module, \"StackWalk64\"));\n  sym_function_table_access_64_ = reinterpret_cast<LPSYMFUNCTIONTABLEACCESS64>(\n      GetProcAddress(module, \"SymFunctionTableAccess64\"));\n  sym_get_module_base_64_ = reinterpret_cast<LPSYMGETMODULEBASE64>(\n      GetProcAddress(module, \"SymGetModuleBase64\"));\n  sym_get_sym_from_addr_64_ = reinterpret_cast<LPSYMGETSYMFROMADDR64>(\n      GetProcAddress(module, \"SymGetSymFromAddr64\"));\n  if (!sym_get_options_ || !sym_set_options_ || !sym_initialize_ ||\n      !stack_walk_64_ || !sym_function_table_access_64_ ||\n      !sym_get_module_base_64_ || !sym_get_sym_from_addr_64_) {\n    XELOGE(\"Unable to get one or more symbols from dbghelp.dll\");\n    return false;\n  }\n\n  // Initialize the symbol lookup services.\n  DWORD options = sym_get_options_();\n  if (cvars::debug_symbol_loader) {\n    options |= SYMOPT_DEBUG;\n  }\n  options |= SYMOPT_DEFERRED_LOADS;\n  options |= SYMOPT_LOAD_LINES;\n  options |= SYMOPT_FAIL_CRITICAL_ERRORS;\n  sym_set_options_(options);\n  if (!sym_initialize_(GetCurrentProcess(), nullptr, TRUE)) {\n    XELOGE(\"Unable to initialize symbol services - already in use?\");\n    return false;\n  }\n\n  return true;\n}\n\nclass Win32StackWalker : public StackWalker {\n public:\n  explicit Win32StackWalker(backend::CodeCache* code_cache) {\n    // Get the boundaries of the code cache so we can quickly tell if a symbol\n    // is ours or not.\n    // We store these globally so that the Sym* callbacks can access them.\n    // They never change, so it's fine even if they are touched from multiple\n    // threads.\n    code_cache_ = code_cache;\n    code_cache_min_ = code_cache_->execute_base_address();\n    code_cache_max_ = code_cache_min_ + code_cache_->total_size();\n  }\n\n  bool Initialize() {\n    std::lock_guard<std::mutex> lock(dbghelp_mutex_);\n    return InitializeStackWalker();\n  }\n\n  size_t CaptureStackTrace(uint64_t* frame_host_pcs, size_t frame_offset,\n                           size_t frame_count,\n                           uint64_t* out_stack_hash) override {\n    if (out_stack_hash) {\n      *out_stack_hash = 0;\n    }\n    // Simple method: captures just stack frame PC addresses, optionally\n    // computing a whole-stack hash.\n    ULONG back_trace_hash = 0;\n    DWORD frames_to_skip = DWORD(frame_offset) + 1;\n    DWORD frames_to_capture =\n        std::min(DWORD(frame_count), UINT16_MAX - frames_to_skip);\n    USHORT captured_count = CaptureStackBackTrace(\n        frames_to_skip, frames_to_capture,\n        reinterpret_cast<PVOID*>(frame_host_pcs), &back_trace_hash);\n    if (out_stack_hash) {\n      *out_stack_hash = back_trace_hash;\n    }\n    return captured_count;\n  }\n\n  size_t CaptureStackTrace(void* thread_handle, uint64_t* frame_host_pcs,\n                           size_t frame_offset, size_t frame_count,\n                           const HostThreadContext* in_host_context,\n                           HostThreadContext* out_host_context,\n                           uint64_t* out_stack_hash) override {\n    // TODO(benvanik): use xstate?\n    // https://msdn.microsoft.com/en-us/library/windows/desktop/hh134240(v=vs.85).aspx\n    // Query context. Thread must be suspended.\n    // Need at least CONTEXT_CONTROL (for rip and rsp) and CONTEXT_INTEGER (for\n    // rbp).\n    CONTEXT thread_context;\n    if (!in_host_context) {\n      // If not given a context we need to ask for it.\n      // This gets the state of the thread exactly where it was when suspended.\n      thread_context.ContextFlags = CONTEXT_FULL;\n      if (!GetThreadContext(thread_handle, &thread_context)) {\n        XELOGE(\"Unable to read thread context for stack walk\");\n        return 0;\n      }\n    } else {\n      // Copy thread context local. We will be modifying it during stack\n      // walking, so we don't want to mess with the incoming copy.\n      thread_context.Rip = in_host_context->rip;\n      thread_context.EFlags = in_host_context->eflags;\n      std::memcpy(&thread_context.Rax, in_host_context->int_registers,\n                  sizeof(in_host_context->int_registers));\n      std::memcpy(&thread_context.Xmm0, in_host_context->xmm_registers,\n                  sizeof(in_host_context->xmm_registers));\n    }\n\n    if (out_host_context) {\n      // Write out the captured thread context if the caller asked for it.\n      out_host_context->rip = thread_context.Rip;\n      out_host_context->eflags = thread_context.EFlags;\n      std::memcpy(out_host_context->int_registers, &thread_context.Rax,\n                  sizeof(out_host_context->int_registers));\n      std::memcpy(out_host_context->xmm_registers, &thread_context.Xmm0,\n                  sizeof(out_host_context->xmm_registers));\n    }\n\n    // Setup the frame for walking.\n    STACKFRAME64 stack_frame = {0};\n    stack_frame.AddrPC.Mode = AddrModeFlat;\n    stack_frame.AddrPC.Offset = thread_context.Rip;\n    stack_frame.AddrFrame.Mode = AddrModeFlat;\n    stack_frame.AddrFrame.Offset = thread_context.Rbp;\n    stack_frame.AddrStack.Mode = AddrModeFlat;\n    stack_frame.AddrStack.Offset = thread_context.Rsp;\n\n    // Walk the stack.\n    // Note that StackWalk64 is thread safe, though other dbghelp functions are\n    // not.\n    size_t frame_index = 0;\n    while (frame_index < frame_count &&\n           stack_walk_64_(IMAGE_FILE_MACHINE_AMD64, GetCurrentProcess(),\n                          thread_handle, &stack_frame, &thread_context, nullptr,\n                          XSymFunctionTableAccess64, XSymGetModuleBase64,\n                          nullptr) == TRUE) {\n      if (frame_index >= frame_offset) {\n        frame_host_pcs[frame_index - frame_offset] = stack_frame.AddrPC.Offset;\n      }\n      ++frame_index;\n    }\n\n    return frame_index - frame_offset;\n  }\n\n  bool ResolveStack(uint64_t* frame_host_pcs, StackFrame* frames,\n                    size_t frame_count) override {\n    // TODO(benvanik): collect symbols to resolve with dbghelp and resolve\n    // afterward in a smaller lock.\n    std::lock_guard<std::mutex> lock(dbghelp_mutex_);\n\n    for (size_t i = 0; i < frame_count; ++i) {\n      auto& frame = frames[i];\n      std::memset(&frame, 0, sizeof(frame));\n      frame.host_pc = frame_host_pcs[i];\n\n      // If in the generated range, we know it's ours.\n      if (frame.host_pc >= code_cache_min_ && frame.host_pc < code_cache_max_) {\n        // Guest symbol, so we can look it up quickly in the code cache.\n        frame.type = StackFrame::Type::kGuest;\n        auto function = code_cache_->LookupFunction(frame.host_pc);\n        if (function) {\n          frame.guest_symbol.function = function;\n          // Figure out where in guest code we are by looking up the\n          // displacement in x64 from the JIT'ed code start to the PC.\n          if (function->is_guest()) {\n            auto guest_function = static_cast<GuestFunction*>(function);\n            // Adjust the host PC by -1 so that we will go back into whatever\n            // instruction was executing before the capture (like a call).\n            frame.guest_pc =\n                guest_function->MapMachineCodeToGuestAddress(frame.host_pc - 1);\n          }\n        } else {\n          frame.guest_symbol.function = nullptr;\n        }\n      } else {\n        // Host symbol, which means either emulator or system.\n        frame.type = StackFrame::Type::kHost;\n        // TODO(benvanik): cache so that we can avoid calling into dbghelp (and\n        // taking the lock).\n        union {\n          IMAGEHLP_SYMBOL64 info;\n          uint8_t buffer[sizeof(IMAGEHLP_SYMBOL64) +\n                         MAX_SYM_NAME * sizeof(CHAR) + sizeof(ULONG64) - 1];\n        } symbol;\n        symbol.info.SizeOfStruct = sizeof(IMAGEHLP_SYMBOL64);\n        symbol.info.MaxNameLength = MAX_SYM_NAME;\n        uint64_t displacement = 0;\n        if (sym_get_sym_from_addr_64_(GetCurrentProcess(), frame.host_pc,\n                                      &displacement, &symbol.info)) {\n          // Resolved successfully.\n          // TODO(benvanik): stash: module, base, displacement, name?\n          frame.host_symbol.address = symbol.info.Address;\n          std::strncpy(frame.host_symbol.name, symbol.info.Name, 256);\n        }\n      }\n    }\n    return true;\n  }\n\n private:\n  static PVOID WINAPI XSymFunctionTableAccess64(__in HANDLE hProcess,\n                                                __in DWORD64 AddrBase) {\n    if (AddrBase >= code_cache_min_ && AddrBase < code_cache_max_) {\n      // Within our generated range so ask code cache.\n      return code_cache_->LookupUnwindInfo(AddrBase);\n    }\n    // Normal symbol lookup.\n    return sym_function_table_access_64_(hProcess, AddrBase);\n  }\n\n  static DWORD64 WINAPI XSymGetModuleBase64(_In_ HANDLE hProcess,\n                                            _In_ DWORD64 dwAddr) {\n    if (dwAddr >= code_cache_min_ && dwAddr < code_cache_max_) {\n      // In our generated range all addresses are relative to the code cache\n      // base.\n      return code_cache_min_;\n    }\n    // Normal module base lookup.\n    return sym_get_module_base_64_(hProcess, dwAddr);\n  }\n\n  std::mutex dbghelp_mutex_;\n\n  static xe::cpu::backend::CodeCache* code_cache_;\n  static uintptr_t code_cache_min_;\n  static uintptr_t code_cache_max_;\n};\n\nxe::cpu::backend::CodeCache* Win32StackWalker::code_cache_ = nullptr;\nuintptr_t Win32StackWalker::code_cache_min_ = 0;\nuintptr_t Win32StackWalker::code_cache_max_ = 0;\n\nstd::unique_ptr<StackWalker> StackWalker::Create(\n    backend::CodeCache* code_cache) {\n  auto stack_walker = std::make_unique<Win32StackWalker>(code_cache);\n  if (!stack_walker->Initialize()) {\n    XELOGE(\"Unable to initialize stack walker: debug/save states disabled\");\n    return nullptr;\n  }\n  return std::unique_ptr<StackWalker>(stack_walker.release());\n}\n\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/symbol.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_SYMBOL_H_\n#define XENIA_CPU_SYMBOL_H_\n\n#include <cstdint>\n#include <string>\n\nnamespace xe {\nnamespace cpu {\n\nclass Module;\n\nclass Symbol {\n public:\n  enum class Type {\n    kFunction,\n    kVariable,\n  };\n\n  enum class Status {\n    kNew,\n    kDeclaring,\n    kDeclared,\n    kDefining,\n    kDefined,\n    kFailed,\n  };\n\n  Symbol(Type type, Module* module, uint32_t address)\n      : type_(type), module_(module), address_(address) {}\n  virtual ~Symbol() = default;\n\n  Type type() const { return type_; }\n  Module* module() const { return module_; }\n  Status status() const { return status_; }\n  void set_status(Status value) { status_ = value; }\n  uint32_t address() const { return address_; }\n\n  const std::string& name() const { return name_; }\n  void set_name(const std::string_view value) { name_ = value; }\n\n protected:\n  Type type_ = Type::kVariable;\n  Module* module_ = nullptr;\n  Status status_ = Status::kDefining;\n  uint32_t address_ = 0;\n\n  std::string name_;\n};\n\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_SYMBOL_H_\n"
  },
  {
    "path": "src/xenia/cpu/test_module.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/test_module.h\"\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/platform.h\"\n#include \"xenia/base/reset_scope.h\"\n#include \"xenia/base/string.h\"\n#include \"xenia/cpu/compiler/compiler_passes.h\"\n#include \"xenia/cpu/processor.h\"\n\nnamespace xe {\nnamespace cpu {\n\nusing xe::cpu::backend::Backend;\nusing xe::cpu::compiler::Compiler;\nusing xe::cpu::hir::HIRBuilder;\nnamespace passes = xe::cpu::compiler::passes;\n\nTestModule::TestModule(Processor* processor, const std::string_view name,\n                       std::function<bool(uint32_t)> contains_address,\n                       std::function<bool(hir::HIRBuilder&)> generate)\n    : Module(processor),\n      name_(name),\n      contains_address_(contains_address),\n      generate_(generate) {\n  builder_.reset(new HIRBuilder());\n  compiler_.reset(new Compiler(processor));\n  assembler_ = processor->backend()->CreateAssembler();\n  assembler_->Initialize();\n\n  // Merge blocks early. This will let us use more context in other passes.\n  // The CFG is required for simplification and dirtied by it.\n  compiler_->AddPass(std::make_unique<passes::ControlFlowAnalysisPass>());\n  compiler_->AddPass(std::make_unique<passes::ControlFlowSimplificationPass>());\n  compiler_->AddPass(std::make_unique<passes::ControlFlowAnalysisPass>());\n\n  // Passes are executed in the order they are added. Multiple of the same\n  // pass type may be used.\n  compiler_->AddPass(std::make_unique<passes::ContextPromotionPass>());\n  compiler_->AddPass(std::make_unique<passes::SimplificationPass>());\n  compiler_->AddPass(std::make_unique<passes::ConstantPropagationPass>());\n  compiler_->AddPass(std::make_unique<passes::SimplificationPass>());\n  // compiler_->AddPass(std::make_unique<passes::DeadStoreEliminationPass>());\n  compiler_->AddPass(std::make_unique<passes::DeadCodeEliminationPass>());\n\n  //// Removes all unneeded variables. Try not to add new ones after this.\n  // compiler_->AddPass(new passes::ValueReductionPass());\n\n  // Register allocation for the target backend.\n  // Will modify the HIR to add loads/stores.\n  // This should be the last pass before finalization, as after this all\n  // registers are assigned and ready to be emitted.\n  compiler_->AddPass(std::make_unique<passes::RegisterAllocationPass>(\n      processor->backend()->machine_info()));\n\n  // Must come last. The HIR is not really HIR after this.\n  compiler_->AddPass(std::make_unique<passes::FinalizationPass>());\n}\n\nTestModule::~TestModule() = default;\n\nbool TestModule::ContainsAddress(uint32_t address) {\n  return contains_address_(address);\n}\n\nstd::unique_ptr<Function> TestModule::CreateFunction(uint32_t address) {\n  return std::unique_ptr<Function>(\n      processor_->backend()->CreateGuestFunction(this, address));\n}\n\nSymbol::Status TestModule::DeclareFunction(uint32_t address,\n                                           Function** out_function) {\n  Symbol::Status status = Module::DeclareFunction(address, out_function);\n  if (status == Symbol::Status::kNew) {\n    auto function = static_cast<GuestFunction*>(*out_function);\n\n    // Reset() all caching when we leave.\n    xe::make_reset_scope(compiler_);\n    xe::make_reset_scope(assembler_);\n\n    if (!generate_(*builder_.get())) {\n      function->set_status(Symbol::Status::kFailed);\n      return Symbol::Status::kFailed;\n    }\n\n    // Run optimization passes.\n    compiler_->Compile(builder_.get());\n\n    // Assemble the function.\n    assembler_->Assemble(function, builder_.get(), 0, nullptr);\n\n    status = Symbol::Status::kDefined;\n    function->set_status(status);\n  }\n  return status;\n}\n\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/test_module.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_TEST_MODULE_H_\n#define XENIA_CPU_TEST_MODULE_H_\n\n#include <functional>\n#include <memory>\n#include <string>\n\n#include \"xenia/cpu/backend/assembler.h\"\n#include \"xenia/cpu/compiler/compiler.h\"\n#include \"xenia/cpu/hir/hir_builder.h\"\n#include \"xenia/cpu/module.h\"\n\nnamespace xe {\nnamespace cpu {\n\nclass TestModule : public Module {\n public:\n  TestModule(Processor* processor, const std::string_view name,\n             std::function<bool(uint32_t)> contains_address,\n             std::function<bool(hir::HIRBuilder&)> generate);\n  ~TestModule() override;\n\n  const std::string& name() const override { return name_; }\n  bool is_executable() const override { return false; }\n\n  bool ContainsAddress(uint32_t address) override;\n\n  Symbol::Status DeclareFunction(uint32_t address,\n                                 Function** out_symbol) override;\n\n protected:\n  std::unique_ptr<Function> CreateFunction(uint32_t address) override;\n\n private:\n  std::string name_;\n  std::function<bool(uint32_t)> contains_address_;\n  std::function<bool(hir::HIRBuilder&)> generate_;\n\n  std::unique_ptr<hir::HIRBuilder> builder_;\n  std::unique_ptr<compiler::Compiler> compiler_;\n  std::unique_ptr<backend::Assembler> assembler_;\n};\n\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_TEST_MODULE_H_\n"
  },
  {
    "path": "src/xenia/cpu/testing/add_test.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/testing/util.h\"\n\n#include <cfloat>\n\nusing namespace xe::cpu::hir;\nusing namespace xe::cpu;\nusing namespace xe::cpu::testing;\nusing xe::cpu::ppc::PPCContext;\n\nTEST_CASE(\"ADD_I8\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreGPR(b, 3,\n             b.ZeroExtend(b.Add(b.Truncate(LoadGPR(b, 4), INT8_TYPE),\n                                b.Truncate(LoadGPR(b, 5), INT8_TYPE)),\n                          INT64_TYPE));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0;\n        ctx->r[5] = 0;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<int8_t>(ctx->r[3]);\n        REQUIRE(result == 0);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 10;\n        ctx->r[5] = 25;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<int8_t>(ctx->r[3]);\n        REQUIRE(result == 0x23);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = -10;\n        ctx->r[5] = -5;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<int8_t>(ctx->r[3]);\n        REQUIRE(result == -15);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = INT8_MIN;\n        ctx->r[5] = 0;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<int8_t>(ctx->r[3]);\n        REQUIRE(result == INT8_MIN);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = UINT8_MAX;\n        ctx->r[5] = 0;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint8_t>(ctx->r[3]);\n        REQUIRE(result == UINT8_MAX);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = INT8_MIN;\n        ctx->r[5] = -1;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<int8_t>(ctx->r[3]);\n        REQUIRE(result == INT8_MAX);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = UINT8_MAX;\n        ctx->r[5] = 1;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<int8_t>(ctx->r[3]);\n        REQUIRE(result == 0);\n      });\n}\n\nTEST_CASE(\"ADD_I16\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreGPR(b, 3,\n             b.ZeroExtend(b.Add(b.Truncate(LoadGPR(b, 4), INT16_TYPE),\n                                b.Truncate(LoadGPR(b, 5), INT16_TYPE)),\n                          INT64_TYPE));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0;\n        ctx->r[5] = 0;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<int16_t>(ctx->r[3]);\n        REQUIRE(result == 0);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 10;\n        ctx->r[5] = 25;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<int16_t>(ctx->r[3]);\n        REQUIRE(result == 0x23);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = -10;\n        ctx->r[5] = -5;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<int16_t>(ctx->r[3]);\n        REQUIRE(result == -15);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = INT16_MIN;\n        ctx->r[5] = 0;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<int16_t>(ctx->r[3]);\n        REQUIRE(result == INT16_MIN);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = UINT16_MAX;\n        ctx->r[5] = 0;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint16_t>(ctx->r[3]);\n        REQUIRE(result == UINT16_MAX);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = INT16_MIN;\n        ctx->r[5] = -1;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<int16_t>(ctx->r[3]);\n        REQUIRE(result == INT16_MAX);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = UINT16_MAX;\n        ctx->r[5] = 1;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<int16_t>(ctx->r[3]);\n        REQUIRE(result == 0);\n      });\n}\n\nTEST_CASE(\"ADD_I32\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreGPR(b, 3,\n             b.ZeroExtend(b.Add(b.Truncate(LoadGPR(b, 4), INT32_TYPE),\n                                b.Truncate(LoadGPR(b, 5), INT32_TYPE)),\n                          INT64_TYPE));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0;\n        ctx->r[5] = 0;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<int32_t>(ctx->r[3]);\n        REQUIRE(result == 0);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 10;\n        ctx->r[5] = 25;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<int32_t>(ctx->r[3]);\n        REQUIRE(result == 0x23);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = -10;\n        ctx->r[5] = -5;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<int32_t>(ctx->r[3]);\n        REQUIRE(result == -15);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = INT32_MIN;\n        ctx->r[5] = 0;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<int32_t>(ctx->r[3]);\n        REQUIRE(result == INT32_MIN);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = UINT32_MAX;\n        ctx->r[5] = 0;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint32_t>(ctx->r[3]);\n        REQUIRE(result == UINT32_MAX);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = INT32_MIN;\n        ctx->r[5] = -1;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<int32_t>(ctx->r[3]);\n        REQUIRE(result == INT32_MAX);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = UINT32_MAX;\n        ctx->r[5] = 1;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<int32_t>(ctx->r[3]);\n        REQUIRE(result == 0);\n      });\n}\n\nTEST_CASE(\"ADD_I64\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreGPR(b, 3, b.Add(LoadGPR(b, 4), LoadGPR(b, 5)));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0;\n        ctx->r[5] = 0;\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->r[3];\n        REQUIRE(result == 0);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 10;\n        ctx->r[5] = 25;\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->r[3];\n        REQUIRE(result == 0x23);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = -10;\n        ctx->r[5] = -5;\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->r[3];\n        REQUIRE(result == -15);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = INT64_MIN;\n        ctx->r[5] = 0;\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->r[3];\n        REQUIRE(result == INT64_MIN);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = UINT64_MAX;\n        ctx->r[5] = 0;\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->r[3];\n        REQUIRE(result == UINT64_MAX);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = INT64_MIN;\n        ctx->r[5] = -1;\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->r[3];\n        REQUIRE(result == INT64_MAX);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = UINT64_MAX;\n        ctx->r[5] = 1;\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->r[3];\n        REQUIRE(result == 0);\n      });\n}\n\nTEST_CASE(\"ADD_F32\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreFPR(b, 3,\n             b.Convert(b.Add(b.Convert(LoadFPR(b, 4), FLOAT32_TYPE),\n                             b.Convert(LoadFPR(b, 5), FLOAT32_TYPE)),\n                       FLOAT64_TYPE));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->f[4] = 0.0;\n        ctx->f[5] = 0.0;\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->f[3];\n        REQUIRE(result == 0.0);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->f[4] = 5.0;\n        ctx->f[5] = 7.0;\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->f[3];\n        REQUIRE(result == 12.0);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->f[4] = FLT_MAX / 2.0;\n        ctx->f[5] = FLT_MAX / 2.0;\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->f[3];\n        REQUIRE(result == FLT_MAX);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->f[4] = -100.0;\n        ctx->f[5] = -150.0;\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->f[3];\n        REQUIRE(result == -250.0);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->f[4] = FLT_MIN;\n        ctx->f[5] = 0.0;\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->f[3];\n        REQUIRE(result == FLT_MIN);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->f[4] = FLT_MAX;\n        ctx->f[5] = 0.0;\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->f[3];\n        REQUIRE(result == FLT_MAX);\n      });\n}\n\nTEST_CASE(\"ADD_F64\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreFPR(b, 3, b.Add(LoadFPR(b, 4), LoadFPR(b, 5)));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->f[4] = 0.0;\n        ctx->f[5] = 0.0;\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->f[3];\n        REQUIRE(result == 0.0);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->f[4] = 5.0;\n        ctx->f[5] = 7.0;\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->f[3];\n        REQUIRE(result == 12.0);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->f[4] = DBL_MAX / 2.0;\n        ctx->f[5] = DBL_MAX / 2.0;\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->f[3];\n        REQUIRE(result == DBL_MAX);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->f[4] = -100.0;\n        ctx->f[5] = -150.0;\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->f[3];\n        REQUIRE(result == -250.0);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->f[4] = DBL_MIN;\n        ctx->f[5] = 0.0;\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->f[3];\n        REQUIRE(result == DBL_MIN);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->f[4] = DBL_MAX;\n        ctx->f[5] = 0.0;\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->f[3];\n        REQUIRE(result == DBL_MAX);\n      });\n}\n"
  },
  {
    "path": "src/xenia/cpu/testing/byte_swap_test.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/testing/util.h\"\n\nusing namespace xe;\nusing namespace xe::cpu;\nusing namespace xe::cpu::hir;\nusing namespace xe::cpu::testing;\nusing xe::cpu::ppc::PPCContext;\n\nTEST_CASE(\"BYTE_SWAP_V128\", \"[instr]\") {\n  TestFunction([](HIRBuilder& b) {\n    StoreVR(b, 3, b.ByteSwap(LoadVR(b, 4)));\n    b.Return();\n  })\n      .Run(\n          [](PPCContext* ctx) {\n            ctx->v[4] =\n                vec128b(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);\n          },\n          [](PPCContext* ctx) {\n            auto result = ctx->v[3];\n            REQUIRE(result == vec128b(3, 2, 1, 0, 7, 6, 5, 4, 11, 10, 9, 8, 15,\n                                      14, 13, 12));\n          });\n  TestFunction([](HIRBuilder& b) {\n    StoreVR(b, 3, b.ByteSwap(LoadVR(b, 4)));\n    b.Return();\n  })\n      .Run(\n          [](PPCContext* ctx) {\n            ctx->v[4] = vec128i(0x0C13100F, 0x0E0D0C0B, 0x0A000000, 0x00000000);\n          },\n          [](PPCContext* ctx) {\n            auto result = ctx->v[3];\n            REQUIRE(result ==\n                    vec128i(0x0F10130C, 0x0B0C0D0E, 0x0000000A, 0x00000000));\n          });\n}\n"
  },
  {
    "path": "src/xenia/cpu/testing/extract_test.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/testing/util.h\"\n\n#include <cfloat>\n\nusing namespace xe;\nusing namespace xe::cpu;\nusing namespace xe::cpu::hir;\nusing namespace xe::cpu::testing;\nusing xe::cpu::ppc::PPCContext;\n\nTEST_CASE(\"EXTRACT_INT8\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreGPR(\n        b, 3,\n        b.ZeroExtend(b.Extract(LoadVR(b, 4),\n                               b.Truncate(LoadGPR(b, 4), INT8_TYPE), INT8_TYPE),\n                     INT64_TYPE));\n    b.Return();\n  });\n  for (int i = 0; i < 16; ++i) {\n    test.Run(\n        [i](PPCContext* ctx) {\n          ctx->r[4] = i;\n          ctx->v[4] =\n              vec128b(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);\n        },\n        [i](PPCContext* ctx) {\n          auto result = ctx->r[3];\n          REQUIRE(result == i);\n        });\n  }\n}\n\nTEST_CASE(\"EXTRACT_INT8_CONSTANT\", \"[instr]\") {\n  for (int i = 0; i < 16; ++i) {\n    TestFunction([i](HIRBuilder& b) {\n      StoreGPR(b, 3,\n               b.ZeroExtend(\n                   b.Extract(LoadVR(b, 4), b.LoadConstantInt8(i), INT8_TYPE),\n                   INT64_TYPE));\n      b.Return();\n    })\n        .Run(\n            [i](PPCContext* ctx) {\n              ctx->r[4] = i;\n              ctx->v[4] =\n                  vec128b(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);\n            },\n            [i](PPCContext* ctx) {\n              auto result = ctx->r[3];\n              REQUIRE(result == i);\n            });\n  }\n}\n\nTEST_CASE(\"EXTRACT_INT16\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreGPR(b, 3,\n             b.ZeroExtend(\n                 b.Extract(LoadVR(b, 4), b.Truncate(LoadGPR(b, 4), INT8_TYPE),\n                           INT16_TYPE),\n                 INT64_TYPE));\n    b.Return();\n  });\n  for (int i = 0; i < 8; ++i) {\n    test.Run(\n        [i](PPCContext* ctx) {\n          ctx->r[4] = i;\n          ctx->v[4] = vec128s(0x0000, 0x1001, 0x2002, 0x3003, 0x4004, 0x5005,\n                              0x6006, 0x7007);\n        },\n        [i](PPCContext* ctx) {\n          auto result = ctx->r[3];\n          REQUIRE(result == (i | (i << 12)));\n        });\n  }\n}\n\nTEST_CASE(\"EXTRACT_INT16_CONSTANT\", \"[instr]\") {\n  for (int i = 0; i < 8; ++i) {\n    TestFunction([i](HIRBuilder& b) {\n      StoreGPR(b, 3,\n               b.ZeroExtend(\n                   b.Extract(LoadVR(b, 4), b.LoadConstantInt8(i), INT16_TYPE),\n                   INT64_TYPE));\n      b.Return();\n    })\n        .Run(\n            [i](PPCContext* ctx) {\n              ctx->r[4] = i;\n              ctx->v[4] = vec128s(0, 1, 2, 3, 4, 5, 6, 7);\n            },\n            [i](PPCContext* ctx) {\n              auto result = ctx->r[3];\n              REQUIRE(result == i);\n            });\n  }\n}\n\nTEST_CASE(\"EXTRACT_INT32\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreGPR(b, 3,\n             b.ZeroExtend(\n                 b.Extract(LoadVR(b, 4), b.Truncate(LoadGPR(b, 4), INT8_TYPE),\n                           INT32_TYPE),\n                 INT64_TYPE));\n    b.Return();\n  });\n  for (int i = 0; i < 4; ++i) {\n    test.Run(\n        [i](PPCContext* ctx) {\n          ctx->r[4] = i;\n          ctx->v[4] = vec128i(0, 1, 2, 3);\n        },\n        [i](PPCContext* ctx) {\n          auto result = ctx->r[3];\n          REQUIRE(result == i);\n        });\n  }\n}\n\nTEST_CASE(\"EXTRACT_INT32_CONSTANT\", \"[instr]\") {\n  for (int i = 0; i < 4; ++i) {\n    TestFunction([i](HIRBuilder& b) {\n      StoreGPR(b, 3,\n               b.ZeroExtend(\n                   b.Extract(LoadVR(b, 4), b.LoadConstantInt8(i), INT32_TYPE),\n                   INT64_TYPE));\n      b.Return();\n    })\n        .Run(\n            [i](PPCContext* ctx) {\n              ctx->r[4] = i;\n              ctx->v[4] = vec128i(0, 1, 2, 3);\n            },\n            [i](PPCContext* ctx) {\n              auto result = ctx->r[3];\n              REQUIRE(result == i);\n            });\n  }\n}\n"
  },
  {
    "path": "src/xenia/cpu/testing/insert_test.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/testing/util.h\"\n\n#include <cfloat>\n\nusing namespace xe;\nusing namespace xe::cpu;\nusing namespace xe::cpu::hir;\nusing namespace xe::cpu::testing;\nusing xe::cpu::ppc::PPCContext;\n\nTEST_CASE(\"INSERT_INT8\", \"[instr]\") {\n  for (int i = 0; i < 16; ++i) {\n    TestFunction test([i](HIRBuilder& b) {\n      StoreVR(b, 3,\n              b.Insert(LoadVR(b, 4), b.LoadConstantInt32(i),\n                       b.Truncate(LoadGPR(b, 5), INT8_TYPE)));\n      b.Return();\n    });\n    test.Run(\n        [i](PPCContext* ctx) {\n          ctx->v[4] =\n              vec128b(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);\n          ctx->r[4] = i;\n          ctx->r[5] = 100 + i;\n        },\n        [i](PPCContext* ctx) {\n          auto result = ctx->v[3];\n          auto expected =\n              vec128b(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);\n          expected.i8[i ^ 0x3] = 100 + i;\n          REQUIRE(result == expected);\n        });\n  }\n}\n\nTEST_CASE(\"INSERT_INT16\", \"[instr]\") {\n  for (int i = 0; i < 8; ++i) {\n    TestFunction test([i](HIRBuilder& b) {\n      StoreVR(b, 3,\n              b.Insert(LoadVR(b, 4), b.LoadConstantInt32(i),\n                       b.Truncate(LoadGPR(b, 5), INT16_TYPE)));\n      b.Return();\n    });\n    test.Run(\n        [i](PPCContext* ctx) {\n          ctx->v[4] = vec128s(0, 1, 2, 3, 4, 5, 6, 7);\n          ctx->r[4] = i;\n          ctx->r[5] = 100 + i;\n        },\n        [i](PPCContext* ctx) {\n          auto result = ctx->v[3];\n          auto expected = vec128s(0, 1, 2, 3, 4, 5, 6, 7);\n          expected.i16[i ^ 0x1] = 100 + i;\n          REQUIRE(result == expected);\n        });\n  }\n}\n\nTEST_CASE(\"INSERT_INT32\", \"[instr]\") {\n  for (int i = 0; i < 4; ++i) {\n    TestFunction test([i](HIRBuilder& b) {\n      StoreVR(b, 3,\n              b.Insert(LoadVR(b, 4), b.LoadConstantInt32(i),\n                       b.Truncate(LoadGPR(b, 5), INT32_TYPE)));\n      b.Return();\n    });\n    test.Run(\n        [i](PPCContext* ctx) {\n          ctx->v[4] = vec128i(0, 1, 2, 3);\n          ctx->r[4] = i;\n          ctx->r[5] = 100 + i;\n        },\n        [i](PPCContext* ctx) {\n          auto result = ctx->v[3];\n          auto expected = vec128i(0, 1, 2, 3);\n          expected.i32[i] = 100 + i;\n          REQUIRE(result == expected);\n        });\n  }\n}\n"
  },
  {
    "path": "src/xenia/cpu/testing/load_vector_shl_shr_test.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/testing/util.h\"\n\nusing namespace xe;\nusing namespace xe::cpu;\nusing namespace xe::cpu::hir;\nusing namespace xe::cpu::testing;\nusing xe::cpu::ppc::PPCContext;\n\nTEST_CASE(\"LOAD_VECTOR_SHL\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(b, 3, b.LoadVectorShl(b.Truncate(LoadGPR(b, 4), INT8_TYPE)));\n    b.Return();\n  });\n  test.Run([](PPCContext* ctx) { ctx->r[4] = 0; },\n           [](PPCContext* ctx) {\n             auto result = ctx->v[3];\n             REQUIRE(result == vec128b(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,\n                                       13, 14, 15));\n           });\n  test.Run([](PPCContext* ctx) { ctx->r[4] = 7; },\n           [](PPCContext* ctx) {\n             auto result = ctx->v[3];\n             REQUIRE(result == vec128b(7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,\n                                       18, 19, 20, 21, 22));\n           });\n  test.Run([](PPCContext* ctx) { ctx->r[4] = 15; },\n           [](PPCContext* ctx) {\n             auto result = ctx->v[3];\n             REQUIRE(result == vec128b(15, 16, 17, 18, 19, 20, 21, 22, 23, 24,\n                                       25, 26, 27, 28, 29, 30));\n           });\n  test.Run([](PPCContext* ctx) { ctx->r[4] = 16; },\n           [](PPCContext* ctx) {\n             auto result = ctx->v[3];\n             REQUIRE(result == vec128b(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,\n                                       13, 14, 15));\n           });\n}\n\nTEST_CASE(\"LOAD_VECTOR_SHR\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(b, 3, b.LoadVectorShr(b.Truncate(LoadGPR(b, 4), INT8_TYPE)));\n    b.Return();\n  });\n  test.Run([](PPCContext* ctx) { ctx->r[4] = 0; },\n           [](PPCContext* ctx) {\n             auto result = ctx->v[3];\n             REQUIRE(result == vec128b(16, 17, 18, 19, 20, 21, 22, 23, 24, 25,\n                                       26, 27, 28, 29, 30, 31));\n           });\n  test.Run([](PPCContext* ctx) { ctx->r[4] = 7; },\n           [](PPCContext* ctx) {\n             auto result = ctx->v[3];\n             REQUIRE(result == vec128b(9, 10, 11, 12, 13, 14, 15, 16, 17, 18,\n                                       19, 20, 21, 22, 23, 24));\n           });\n  test.Run([](PPCContext* ctx) { ctx->r[4] = 15; },\n           [](PPCContext* ctx) {\n             auto result = ctx->v[3];\n             REQUIRE(result == vec128b(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,\n                                       13, 14, 15, 16));\n           });\n  test.Run([](PPCContext* ctx) { ctx->r[4] = 16; },\n           [](PPCContext* ctx) {\n             auto result = ctx->v[3];\n             REQUIRE(result == vec128b(16, 17, 18, 19, 20, 21, 22, 23, 24, 25,\n                                       26, 27, 28, 29, 30, 31));\n           });\n}\n"
  },
  {
    "path": "src/xenia/cpu/testing/pack_test.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/testing/util.h\"\n\nusing namespace xe;\nusing namespace xe::cpu;\nusing namespace xe::cpu::hir;\nusing namespace xe::cpu::testing;\nusing xe::cpu::ppc::PPCContext;\n\nTEST_CASE(\"PACK_D3DCOLOR\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(b, 3, b.Pack(LoadVR(b, 4), PACK_TYPE_D3DCOLOR));\n    b.Return();\n  });\n  test.Run([](PPCContext* ctx) { ctx->v[4] = vec128f(1.0f); },\n           [](PPCContext* ctx) {\n             auto result = ctx->v[3];\n             REQUIRE(result == vec128i(0));\n           });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128i(0x40400050, 0x40400060, 0x40400070, 0x40400080);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128i(0, 0, 0, 0x80506070));\n      });\n}\n\nTEST_CASE(\"PACK_FLOAT16_2\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(b, 3, b.Pack(LoadVR(b, 4), PACK_TYPE_FLOAT16_2));\n    b.Return();\n  });\n  test.Run([](PPCContext* ctx) { ctx->v[4] = vec128i(0, 0, 0, 0x3F800000); },\n           [](PPCContext* ctx) {\n             auto result = ctx->v[3];\n             REQUIRE(result == vec128i(0));\n           });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128i(0x47FFE000, 0xC7FFE000, 0x00000000, 0x3F800000);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128i(0, 0, 0, 0x7FFFFFFF));\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128i(0x42AAA000, 0x44CCC000, 0x00000000, 0x3F800000);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128i(0, 0, 0, 0x55556666));\n      });\n}\n\nTEST_CASE(\"PACK_FLOAT16_4\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(b, 3, b.Pack(LoadVR(b, 4), PACK_TYPE_FLOAT16_4));\n    b.Return();\n  });\n  test.Run([](PPCContext* ctx) { ctx->v[4] = vec128i(0, 0, 0, 0); },\n           [](PPCContext* ctx) {\n             auto result = ctx->v[3];\n             REQUIRE(result == vec128i(0));\n           });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128i(0x449A4000, 0x45B17000, 0x41103261, 0x40922B6B);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result ==\n                vec128i(0x00000000, 0x00000000, 0x64D26D8C, 0x48824491));\n      });\n}\n\nTEST_CASE(\"PACK_SHORT_2\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(b, 3, b.Pack(LoadVR(b, 4), PACK_TYPE_SHORT_2));\n    b.Return();\n  });\n  test.Run([](PPCContext* ctx) { ctx->v[4] = vec128i(0); },\n           [](PPCContext* ctx) {\n             auto result = ctx->v[3];\n             REQUIRE(result == vec128i(0));\n           });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128i(0x43817E00, 0xC37CFC00, 0, 0);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128i(0, 0, 0, 0x7FFF8001));\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128i(0xC0D47D97, 0xC2256E9D, 0, 0);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128i(0, 0, 0, 0x80018001));\n      });\n}\n"
  },
  {
    "path": "src/xenia/cpu/testing/permute_test.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/testing/util.h\"\n\nusing namespace xe;\nusing namespace xe::cpu;\nusing namespace xe::cpu::hir;\nusing namespace xe::cpu::testing;\nusing xe::cpu::ppc::PPCContext;\n\nTEST_CASE(\"PERMUTE_V128_BY_INT32_CONSTANT\", \"[instr]\") {\n  {\n    uint32_t mask = MakePermuteMask(0, 0, 0, 1, 0, 2, 0, 3);\n    TestFunction([mask](HIRBuilder& b) {\n      StoreVR(b, 3,\n              b.Permute(b.LoadConstantUint32(mask), LoadVR(b, 4), LoadVR(b, 5),\n                        INT32_TYPE));\n      b.Return();\n    })\n        .Run(\n            [](PPCContext* ctx) {\n              ctx->v[4] = vec128i(0, 1, 2, 3);\n              ctx->v[5] = vec128i(4, 5, 6, 7);\n            },\n            [](PPCContext* ctx) {\n              auto result = ctx->v[3];\n              REQUIRE(result == vec128i(0, 1, 2, 3));\n            });\n  }\n  {\n    uint32_t mask = MakePermuteMask(1, 0, 1, 1, 1, 2, 1, 3);\n    TestFunction([mask](HIRBuilder& b) {\n      StoreVR(b, 3,\n              b.Permute(b.LoadConstantUint32(mask), LoadVR(b, 4), LoadVR(b, 5),\n                        INT32_TYPE));\n      b.Return();\n    })\n        .Run(\n            [](PPCContext* ctx) {\n              ctx->v[4] = vec128i(0, 1, 2, 3);\n              ctx->v[5] = vec128i(4, 5, 6, 7);\n            },\n            [](PPCContext* ctx) {\n              auto result = ctx->v[3];\n              REQUIRE(result == vec128i(4, 5, 6, 7));\n            });\n  }\n  {\n    uint32_t mask = MakePermuteMask(0, 3, 0, 2, 0, 1, 0, 0);\n    TestFunction([mask](HIRBuilder& b) {\n      StoreVR(b, 3,\n              b.Permute(b.LoadConstantUint32(mask), LoadVR(b, 4), LoadVR(b, 5),\n                        INT32_TYPE));\n      b.Return();\n    })\n        .Run(\n            [](PPCContext* ctx) {\n              ctx->v[4] = vec128i(0, 1, 2, 3);\n              ctx->v[5] = vec128i(4, 5, 6, 7);\n            },\n            [](PPCContext* ctx) {\n              auto result = ctx->v[3];\n              REQUIRE(result == vec128i(3, 2, 1, 0));\n            });\n  }\n  {\n    uint32_t mask = MakePermuteMask(1, 3, 1, 2, 1, 1, 1, 0);\n    TestFunction([mask](HIRBuilder& b) {\n      StoreVR(b, 3,\n              b.Permute(b.LoadConstantUint32(mask), LoadVR(b, 4), LoadVR(b, 5),\n                        INT32_TYPE));\n      b.Return();\n    })\n        .Run(\n            [](PPCContext* ctx) {\n              ctx->v[4] = vec128i(0, 1, 2, 3);\n              ctx->v[5] = vec128i(4, 5, 6, 7);\n            },\n            [](PPCContext* ctx) {\n              auto result = ctx->v[3];\n              REQUIRE(result == vec128i(7, 6, 5, 4));\n            });\n  }\n}\n\nTEST_CASE(\"PERMUTE_V128_BY_V128\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(b, 3,\n            b.Permute(LoadVR(b, 3), LoadVR(b, 4), LoadVR(b, 5), INT8_TYPE));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[3] =\n            vec128b(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);\n        ctx->v[4] =\n            vec128b(100, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);\n        ctx->v[5] = vec128b(16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28,\n                            29, 30, 31);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128b(100, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,\n                                  13, 14, 15));\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[3] = vec128b(16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28,\n                            29, 30, 31);\n        ctx->v[4] =\n            vec128b(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);\n        ctx->v[5] = vec128b(116, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28,\n                            29, 30, 31);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128b(116, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,\n                                  27, 28, 29, 30, 31));\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[3] =\n            vec128b(15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0);\n        ctx->v[4] =\n            vec128b(100, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);\n        ctx->v[5] = vec128b(16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28,\n                            29, 30, 31);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128b(15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3,\n                                  2, 1, 100));\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[3] = vec128b(31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19,\n                            18, 17, 16);\n        ctx->v[4] =\n            vec128b(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);\n        ctx->v[5] = vec128b(16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28,\n                            29, 30, 131);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128b(131, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21,\n                                  20, 19, 18, 17, 16));\n      });\n}\n"
  },
  {
    "path": "src/xenia/cpu/testing/premake5.lua",
    "content": "project_root = \"../../../..\"\ninclude(project_root..\"/tools/build\")\n\ntest_suite(\"xenia-cpu-tests\", project_root, \".\", {\n  links = {\n    \"capstone\",\n    \"fmt\",\n    \"xenia-base\",\n    \"xenia-core\",\n    \"xenia-cpu\",\n\n    -- TODO(benvanik): cut these dependencies?\n    \"xenia-kernel\",\n    \"xenia-ui\", -- needed by xenia-base\n  },\n  filtered_links = {\n    {\n      filter = 'architecture:x86_64',\n      links = {\n        \"xenia-cpu-backend-x64\",\n      },\n    }\n  },\n})\n"
  },
  {
    "path": "src/xenia/cpu/testing/sandbox_main.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/console_app_main.h\"\n#include \"xenia/cpu/backend/x64/x64_backend.h\"\n#include \"xenia/cpu/cpu.h\"\n#include \"xenia/cpu/ppc/ppc_context.h\"\n#include \"xenia/cpu/ppc/ppc_frontend.h\"\n#include \"xenia/cpu/raw_module.h\"\n\nnamespace xe {\nnamespace cpu {\nnamespace sandbox {\n\nusing xe::cpu::Runtime;\nusing xe::cpu::ppc::PPCContext;\n\n// TODO(benvanik): simple memory? move more into core?\n\nint main(std::vector<std::string>& args) {\n#if XE_OPTION_PROFILING\n  xe::Profiler::Initialize();\n  xe::Profiler::ThreadEnter(\"Main\");\n#endif  // XE_OPTION_PROFILING\n\n  size_t memory_size = 16 * 1024 * 1024;\n  auto memory = std::make_unique<SimpleMemory>(memory_size);\n  auto runtime = std::make_unique<Runtime>(memory.get());\n\n  auto frontend =\n      std::make_unique<xe::cpu::frontend::ppc::PPCFrontend>(runtime.get());\n  std::unique_ptr<xe::cpu::backend::Backend> backend;\n  // backend =\n  //     std::make_unique<xe::cpu::backend::ivm::IVMBackend>(runtime.get());\n  // backend =\n  //     std::make_unique<xe::cpu::backend::x64::X64Backend>(runtime.get());\n  runtime->Initialize(std::move(frontend), std::move(backend));\n\n  auto module = std::make_unique<xe::cpu::RawModule>(runtime.get());\n  module->LoadFile(0x00001000, L\"test\\\\codegen\\\\instr_add.bin\");\n  runtime->AddModule(std::move(module));\n\n  {\n    uint64_t stack_size = 64 * 1024;\n    uint64_t stack_address = memory_size - stack_size;\n    uint64_t thread_state_address = stack_address - 0x1000;\n    auto thread_state = std::make_unique<ThreadState>(\n        runtime.get(), 100, stack_address, stack_size, thread_state_address);\n\n    xe::cpu::Function* fn;\n    runtime->ResolveFunction(0x1000, &fn);\n    auto ctx = thread_state->context();\n    ctx->lr = 0xBEBEBEBE;\n    ctx->r[5] = 10;\n    ctx->r[25] = 25;\n    fn->Call(thread_state.get(), ctx->lr);\n    auto result = ctx->r[11];\n    printf(\"%llu\", result);\n  }\n\n  runtime.reset();\n  memory.reset();\n\n#if XE_OPTION_PROFILING\n  xe::Profiler::Dump();\n  xe::Profiler::ThreadExit();\n#endif  // XE_OPTION_PROFILING\n\n  return 0;\n}\n\n}  // namespace sandbox\n}  // namespace cpu\n}  // namespace xe\n\nXE_DEFINE_CONSOLE_APP(\"xenia-cpu-sandbox\", xe::cpu::sandbox::main, \"\");\n"
  },
  {
    "path": "src/xenia/cpu/testing/sha_test.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/testing/util.h\"\n\nusing namespace xe::cpu::hir;\nusing namespace xe::cpu;\nusing namespace xe::cpu::testing;\nusing xe::cpu::ppc::PPCContext;\n\nTEST_CASE(\"SHA_I8\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreGPR(b, 3,\n             b.ZeroExtend(b.Sha(b.Truncate(LoadGPR(b, 4), INT8_TYPE),\n                                b.Truncate(LoadGPR(b, 5), INT8_TYPE)),\n                          INT64_TYPE));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0xF0;\n        ctx->r[5] = 4;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint8_t>(ctx->r[3]);\n        REQUIRE(result == 0xFF);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0xFF;\n        ctx->r[5] = 0;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint8_t>(ctx->r[3]);\n        REQUIRE(result == 0xFF);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0xFF;\n        ctx->r[5] = 1;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint8_t>(ctx->r[3]);\n        REQUIRE(result == 0xFF);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0x80;\n        ctx->r[5] = 8;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint8_t>(ctx->r[3]);\n        REQUIRE(result == 0xFF);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0x7F;\n        ctx->r[5] = 7;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint8_t>(ctx->r[3]);\n        REQUIRE(result == 0);\n      });\n}\n\nTEST_CASE(\"SHA_I16\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreGPR(b, 3,\n             b.ZeroExtend(b.Sha(b.Truncate(LoadGPR(b, 4), INT16_TYPE),\n                                b.Truncate(LoadGPR(b, 5), INT8_TYPE)),\n                          INT64_TYPE));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0xFF00;\n        ctx->r[5] = 8;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint16_t>(ctx->r[3]);\n        REQUIRE(result == 0xFFFF);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0xFFFF;\n        ctx->r[5] = 0;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint16_t>(ctx->r[3]);\n        REQUIRE(result == 0xFFFF);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0xFFFE;\n        ctx->r[5] = 1;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint16_t>(ctx->r[3]);\n        REQUIRE(result == 0xFFFF);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0x8000;\n        ctx->r[5] = 16;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint16_t>(ctx->r[3]);\n        REQUIRE(result == 0xFFFF);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0x7FFF;\n        ctx->r[5] = 15;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint16_t>(ctx->r[3]);\n        REQUIRE(result == 0);\n      });\n}\n\nTEST_CASE(\"SHA_I32\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreGPR(b, 3,\n             b.ZeroExtend(b.Sha(b.Truncate(LoadGPR(b, 4), INT32_TYPE),\n                                b.Truncate(LoadGPR(b, 5), INT8_TYPE)),\n                          INT64_TYPE));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0xFFFF0000;\n        ctx->r[5] = 16;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint32_t>(ctx->r[3]);\n        REQUIRE(result == 0xFFFFFFFF);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0xFFFFFFFF;\n        ctx->r[5] = 0;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint32_t>(ctx->r[3]);\n        REQUIRE(result == 0xFFFFFFFF);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0xFFFFFFFE;\n        ctx->r[5] = 1;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint32_t>(ctx->r[3]);\n        REQUIRE(result == 0xFFFFFFFF);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0x80000000;\n        ctx->r[5] = 32;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint32_t>(ctx->r[3]);\n        REQUIRE(result == 0x80000000);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0x7FFFFFFF;\n        ctx->r[5] = 31;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint32_t>(ctx->r[3]);\n        REQUIRE(result == 0);\n      });\n}\n\nTEST_CASE(\"SHA_I64\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreGPR(b, 3,\n             b.Sha(b.Truncate(LoadGPR(b, 4), INT64_TYPE),\n                   b.Truncate(LoadGPR(b, 5), INT8_TYPE)));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0xFFFFFFFF00000000ull;\n        ctx->r[5] = 32;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint64_t>(ctx->r[3]);\n        REQUIRE(result == 0xFFFFFFFFFFFFFFFFull);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0xFFFFFFFFFFFFFFFFull;\n        ctx->r[5] = 0;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint64_t>(ctx->r[3]);\n        REQUIRE(result == 0xFFFFFFFFFFFFFFFFull);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0xFFFFFFFFFFFFFFFEull;\n        ctx->r[5] = 1;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint64_t>(ctx->r[3]);\n        REQUIRE(result == 0xFFFFFFFFFFFFFFFFull);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0x8000000000000000ull;\n        ctx->r[5] = 64;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint64_t>(ctx->r[3]);\n        REQUIRE(result == 0x8000000000000000ull);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0x7FFFFFFFFFFFFFFFull;\n        ctx->r[5] = 63;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint64_t>(ctx->r[3]);\n        REQUIRE(result == 0);\n      });\n}\n"
  },
  {
    "path": "src/xenia/cpu/testing/shl_test.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/testing/util.h\"\n\nusing namespace xe::cpu::hir;\nusing namespace xe::cpu;\nusing namespace xe::cpu::testing;\nusing xe::cpu::ppc::PPCContext;\n\nTEST_CASE(\"SHL_I8\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreGPR(b, 3,\n             b.ZeroExtend(b.Shl(b.Truncate(LoadGPR(b, 4), INT8_TYPE),\n                                b.Truncate(LoadGPR(b, 5), INT8_TYPE)),\n                          INT64_TYPE));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0x0F;\n        ctx->r[5] = 4;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint8_t>(ctx->r[3]);\n        REQUIRE(result == 0xF0);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0xFF;\n        ctx->r[5] = 0;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint8_t>(ctx->r[3]);\n        REQUIRE(result == 0xFF);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0xFF;\n        ctx->r[5] = 1;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint8_t>(ctx->r[3]);\n        REQUIRE(result == 0xFE);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0x80;\n        ctx->r[5] = 8;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint8_t>(ctx->r[3]);\n        REQUIRE(result == 0);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0x7F;\n        ctx->r[5] = 7;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint8_t>(ctx->r[3]);\n        REQUIRE(result == 0x80);\n      });\n}\n\nTEST_CASE(\"SHL_I16\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreGPR(b, 3,\n             b.ZeroExtend(b.Shl(b.Truncate(LoadGPR(b, 4), INT16_TYPE),\n                                b.Truncate(LoadGPR(b, 5), INT8_TYPE)),\n                          INT64_TYPE));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0x00FF;\n        ctx->r[5] = 8;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint16_t>(ctx->r[3]);\n        REQUIRE(result == 0xFF00);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0xFFFF;\n        ctx->r[5] = 0;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint16_t>(ctx->r[3]);\n        REQUIRE(result == 0xFFFF);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0x7FFF;\n        ctx->r[5] = 1;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint16_t>(ctx->r[3]);\n        REQUIRE(result == 0xFFFE);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0x8000;\n        ctx->r[5] = 16;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint16_t>(ctx->r[3]);\n        REQUIRE(result == 0);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0x7FFF;\n        ctx->r[5] = 15;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint16_t>(ctx->r[3]);\n        REQUIRE(result == 0x8000);\n      });\n}\n\nTEST_CASE(\"SHL_I32\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreGPR(b, 3,\n             b.ZeroExtend(b.Shl(b.Truncate(LoadGPR(b, 4), INT32_TYPE),\n                                b.Truncate(LoadGPR(b, 5), INT8_TYPE)),\n                          INT64_TYPE));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0x0000FFFF;\n        ctx->r[5] = 16;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint32_t>(ctx->r[3]);\n        REQUIRE(result == 0xFFFF0000);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0xFFFFFFFF;\n        ctx->r[5] = 0;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint32_t>(ctx->r[3]);\n        REQUIRE(result == 0xFFFFFFFF);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0x7FFFFFFF;\n        ctx->r[5] = 1;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint32_t>(ctx->r[3]);\n        REQUIRE(result == 0xFFFFFFFE);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0x80000000;\n        ctx->r[5] = 32;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint32_t>(ctx->r[3]);\n        REQUIRE(result == 0x80000000);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0x7FFFFFFF;\n        ctx->r[5] = 31;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint32_t>(ctx->r[3]);\n        REQUIRE(result == 0x80000000);\n      });\n}\n\nTEST_CASE(\"SHL_I64\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreGPR(b, 3,\n             b.Shl(b.Truncate(LoadGPR(b, 4), INT64_TYPE),\n                   b.Truncate(LoadGPR(b, 5), INT8_TYPE)));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0x00000000FFFFFFFFull;\n        ctx->r[5] = 32;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint64_t>(ctx->r[3]);\n        REQUIRE(result == 0xFFFFFFFF00000000ull);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0xFFFFFFFFFFFFFFFFull;\n        ctx->r[5] = 0;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint64_t>(ctx->r[3]);\n        REQUIRE(result == 0xFFFFFFFFFFFFFFFFull);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0x7FFFFFFFFFFFFFFFull;\n        ctx->r[5] = 1;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint64_t>(ctx->r[3]);\n        REQUIRE(result == 0xFFFFFFFFFFFFFFFEull);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0x8000000000000000ull;\n        ctx->r[5] = 64;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint64_t>(ctx->r[3]);\n        REQUIRE(result == 0x8000000000000000ull);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0x7FFFFFFFFFFFFFFFull;\n        ctx->r[5] = 63;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint64_t>(ctx->r[3]);\n        REQUIRE(result == 0x8000000000000000ull);\n      });\n}\n"
  },
  {
    "path": "src/xenia/cpu/testing/shr_test.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/testing/util.h\"\n\nusing namespace xe;\nusing namespace xe::cpu;\nusing namespace xe::cpu::hir;\nusing namespace xe::cpu::testing;\nusing xe::cpu::ppc::PPCContext;\n\nTEST_CASE(\"SHR_I8\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreGPR(b, 3,\n             b.ZeroExtend(b.Shr(b.Truncate(LoadGPR(b, 4), INT8_TYPE),\n                                b.Truncate(LoadGPR(b, 5), INT8_TYPE)),\n                          INT64_TYPE));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0xF0;\n        ctx->r[5] = 4;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint8_t>(ctx->r[3]);\n        REQUIRE(result == 0x0F);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0xFF;\n        ctx->r[5] = 0;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint8_t>(ctx->r[3]);\n        REQUIRE(result == 0xFF);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0xFF;\n        ctx->r[5] = 1;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint8_t>(ctx->r[3]);\n        REQUIRE(result == 0x7F);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0x80;\n        ctx->r[5] = 8;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint8_t>(ctx->r[3]);\n        REQUIRE(result == 0);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0x7F;\n        ctx->r[5] = 7;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint8_t>(ctx->r[3]);\n        REQUIRE(result == 0);\n      });\n}\n\nTEST_CASE(\"SHR_I16\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreGPR(b, 3,\n             b.ZeroExtend(b.Shr(b.Truncate(LoadGPR(b, 4), INT16_TYPE),\n                                b.Truncate(LoadGPR(b, 5), INT8_TYPE)),\n                          INT64_TYPE));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0xFF00;\n        ctx->r[5] = 8;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint16_t>(ctx->r[3]);\n        REQUIRE(result == 0x00FF);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0xFFFF;\n        ctx->r[5] = 0;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint16_t>(ctx->r[3]);\n        REQUIRE(result == 0xFFFF);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0xFFFE;\n        ctx->r[5] = 1;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint16_t>(ctx->r[3]);\n        REQUIRE(result == 0x7FFF);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0x8000;\n        ctx->r[5] = 16;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint16_t>(ctx->r[3]);\n        REQUIRE(result == 0);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0x7FFF;\n        ctx->r[5] = 15;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint16_t>(ctx->r[3]);\n        REQUIRE(result == 0);\n      });\n}\n\nTEST_CASE(\"SHR_I32\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreGPR(b, 3,\n             b.ZeroExtend(b.Shr(b.Truncate(LoadGPR(b, 4), INT32_TYPE),\n                                b.Truncate(LoadGPR(b, 5), INT8_TYPE)),\n                          INT64_TYPE));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0xFFFF0000;\n        ctx->r[5] = 16;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint32_t>(ctx->r[3]);\n        REQUIRE(result == 0x0000FFFF);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0xFFFFFFFF;\n        ctx->r[5] = 0;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint32_t>(ctx->r[3]);\n        REQUIRE(result == 0xFFFFFFFF);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0xFFFFFFFE;\n        ctx->r[5] = 1;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint32_t>(ctx->r[3]);\n        REQUIRE(result == 0x7FFFFFFF);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0x80000000;\n        ctx->r[5] = 32;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint32_t>(ctx->r[3]);\n        REQUIRE(result == 0x80000000);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0x7FFFFFFF;\n        ctx->r[5] = 31;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint32_t>(ctx->r[3]);\n        REQUIRE(result == 0);\n      });\n}\n\nTEST_CASE(\"SHR_I64\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreGPR(b, 3,\n             b.Shr(b.Truncate(LoadGPR(b, 4), INT64_TYPE),\n                   b.Truncate(LoadGPR(b, 5), INT8_TYPE)));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0xFFFFFFFF00000000ull;\n        ctx->r[5] = 32;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint64_t>(ctx->r[3]);\n        REQUIRE(result == 0x00000000FFFFFFFFull);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0xFFFFFFFFFFFFFFFFull;\n        ctx->r[5] = 0;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint64_t>(ctx->r[3]);\n        REQUIRE(result == 0xFFFFFFFFFFFFFFFFull);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0xFFFFFFFFFFFFFFFEull;\n        ctx->r[5] = 1;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint64_t>(ctx->r[3]);\n        REQUIRE(result == 0x7FFFFFFFFFFFFFFFull);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0x8000000000000000ull;\n        ctx->r[5] = 64;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint64_t>(ctx->r[3]);\n        REQUIRE(result == 0x8000000000000000ull);\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[4] = 0x7FFFFFFFFFFFFFFFull;\n        ctx->r[5] = 63;\n      },\n      [](PPCContext* ctx) {\n        auto result = static_cast<uint64_t>(ctx->r[3]);\n        REQUIRE(result == 0);\n      });\n}\n\nTEST_CASE(\"SHR_V128\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(b, 3, b.Shr(LoadVR(b, 4), b.Truncate(LoadGPR(b, 1), INT8_TYPE)));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[1] = 0;\n        ctx->v[4] = vec128i(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);\n      },\n      [](PPCContext* ctx) {\n        auto result1 = ctx->v[3];\n        REQUIRE(result1 ==\n                vec128i(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF));\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[1] = 1;\n        ctx->v[4] = vec128i(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);\n      },\n      [](PPCContext* ctx) {\n        auto result1 = ctx->v[3];\n        REQUIRE(result1 ==\n                vec128i(0x7FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF));\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[1] = 2;\n        ctx->v[4] = vec128i(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);\n      },\n      [](PPCContext* ctx) {\n        auto result1 = ctx->v[3];\n        REQUIRE(result1 ==\n                vec128i(0x3FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF));\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->r[1] = 8;\n        ctx->v[4] = vec128i(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);\n      },\n      [](PPCContext* ctx) {\n        auto result1 = ctx->v[3];\n        REQUIRE(result1 ==\n                vec128i(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF));\n      });\n}\n"
  },
  {
    "path": "src/xenia/cpu/testing/swizzle_test.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/testing/util.h\"\n\nusing namespace xe;\nusing namespace xe::cpu;\nusing namespace xe::cpu::hir;\nusing namespace xe::cpu::testing;\nusing xe::cpu::ppc::PPCContext;\n\nTEST_CASE(\"SWIZZLE_V128\", \"[instr]\") {\n  TestFunction([](HIRBuilder& b) {\n    StoreVR(b, 3,\n            b.Swizzle(LoadVR(b, 4), INT32_TYPE, MakeSwizzleMask(0, 1, 2, 3)));\n    b.Return();\n  })\n      .Run([](PPCContext* ctx) { ctx->v[4] = vec128i(0, 1, 2, 3); },\n           [](PPCContext* ctx) {\n             auto result = ctx->v[3];\n             REQUIRE(result == vec128i(0, 1, 2, 3));\n           });\n  TestFunction([](HIRBuilder& b) {\n    StoreVR(b, 3,\n            b.Swizzle(LoadVR(b, 4), INT32_TYPE, MakeSwizzleMask(3, 2, 1, 0)));\n    b.Return();\n  })\n      .Run([](PPCContext* ctx) { ctx->v[4] = vec128i(0, 1, 2, 3); },\n           [](PPCContext* ctx) {\n             auto result = ctx->v[3];\n             REQUIRE(result == vec128i(3, 2, 1, 0));\n           });\n  TestFunction([](HIRBuilder& b) {\n    StoreVR(b, 3,\n            b.Swizzle(LoadVR(b, 4), INT32_TYPE, MakeSwizzleMask(1, 1, 2, 2)));\n    b.Return();\n  })\n      .Run([](PPCContext* ctx) { ctx->v[4] = vec128i(0, 1, 2, 3); },\n           [](PPCContext* ctx) {\n             auto result = ctx->v[3];\n             REQUIRE(result == vec128i(1, 1, 2, 2));\n           });\n}\n"
  },
  {
    "path": "src/xenia/cpu/testing/unpack_test.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/testing/util.h\"\n\nusing namespace xe;\nusing namespace xe::cpu;\nusing namespace xe::cpu::hir;\nusing namespace xe::cpu::testing;\nusing xe::cpu::ppc::PPCContext;\n\nTEST_CASE(\"UNPACK_D3DCOLOR\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(b, 3, b.Unpack(LoadVR(b, 4), PACK_TYPE_D3DCOLOR));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        uint32_t value = 0;\n        ctx->v[4] = vec128i(0, 0, 0, value);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128f(1.0f, 1.0f, 1.0f, 1.0f));\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        uint32_t value = 0x80506070;\n        ctx->v[4] = vec128i(0, 0, 0, value);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result ==\n                vec128i(0x3F800050, 0x3F800060, 0x3F800070, 0x3F800080));\n      });\n}\n\nTEST_CASE(\"UNPACK_FLOAT16_2\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(b, 3, b.Unpack(LoadVR(b, 4), PACK_TYPE_FLOAT16_2));\n    b.Return();\n  });\n  test.Run([](PPCContext* ctx) { ctx->v[4] = vec128i(0); },\n           [](PPCContext* ctx) {\n             auto result = ctx->v[3];\n             REQUIRE(result == vec128i(0, 0, 0, 0x3F800000));\n           });\n  test.Run([](PPCContext* ctx) { ctx->v[4] = vec128i(0, 0, 0, 0x7FFFFFFF); },\n           [](PPCContext* ctx) {\n             auto result = ctx->v[3];\n             REQUIRE(result ==\n                     vec128i(0x47FFE000, 0xC7FFE000, 0x00000000, 0x3F800000));\n           });\n  test.Run([](PPCContext* ctx) { ctx->v[4] = vec128i(0, 0, 0, 0x55556666); },\n           [](PPCContext* ctx) {\n             auto result = ctx->v[3];\n             REQUIRE(result ==\n                     vec128i(0x42AAA000, 0x44CCC000, 0x00000000, 0x3F800000));\n           });\n}\n\nTEST_CASE(\"UNPACK_FLOAT16_4\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(b, 3, b.Unpack(LoadVR(b, 4), PACK_TYPE_FLOAT16_4));\n    b.Return();\n  });\n  test.Run([](PPCContext* ctx) { ctx->v[4] = vec128i(0); },\n           [](PPCContext* ctx) {\n             auto result = ctx->v[3];\n             REQUIRE(result == vec128i(0));\n           });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128s(0, 0, 0, 0, 0x64D2, 0x6D8B, 0x4881, 0x4491);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result ==\n                vec128i(0x449A4000, 0x45B16000, 0x41102000, 0x40922000));\n      });\n}\n\nTEST_CASE(\"UNPACK_SHORT_2\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(b, 3, b.Unpack(LoadVR(b, 4), PACK_TYPE_SHORT_2));\n    b.Return();\n  });\n  test.Run([](PPCContext* ctx) { ctx->v[4] = vec128i(0); },\n           [](PPCContext* ctx) {\n             auto result = ctx->v[3];\n             REQUIRE(result ==\n                     vec128i(0x40400000, 0x40400000, 0x00000000, 0x3F800000));\n           });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128i(0x7004FD60, 0x8201C990, 0x00000000, 0x7FFF8001);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result ==\n                vec128i(0x40407FFF, 0x403F8001, 0x00000000, 0x3F800000));\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128i(0, 0, 0, (0x1234u << 16) | 0x5678u);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result ==\n                vec128i(0x40401234, 0x40405678, 0x00000000, 0x3F800000));\n      });\n}\n\n// TEST_CASE(\"UNPACK_S8_IN_16_LO\", \"[instr]\") {\n//  TestFunction test([](HIRBuilder& b) {\n//    StoreVR(b, 3, b.Unpack(LoadVR(b, 4), PACK_TYPE_S8_IN_16_LO));\n//    b.Return();\n//  });\n//  test.Run([](PPCContext* ctx) { ctx->v[4] = vec128b(0); },\n//           [](PPCContext* ctx) {\n//             auto result = ctx->v[3];\n//             REQUIRE(result == vec128b(0));\n//           });\n//}\n//\n// TEST_CASE(\"UNPACK_S8_IN_16_HI\", \"[instr]\") {\n//  TestFunction test([](HIRBuilder& b) {\n//    StoreVR(b, 3, b.Unpack(LoadVR(b, 4), PACK_TYPE_S8_IN_16_HI));\n//    b.Return();\n//  });\n//  test.Run([](PPCContext* ctx) { ctx->v[4] = vec128b(0); },\n//           [](PPCContext* ctx) {\n//             auto result = ctx->v[3];\n//             REQUIRE(result == vec128b(0));\n//           });\n//}\n//\n// TEST_CASE(\"UNPACK_S16_IN_32_LO\", \"[instr]\") {\n//  TestFunction test([](HIRBuilder& b) {\n//    StoreVR(b, 3, b.Unpack(LoadVR(b, 4), PACK_TYPE_S16_IN_32_LO));\n//    b.Return();\n//  });\n//  test.Run([](PPCContext* ctx) { ctx->v[4] = vec128b(0); },\n//           [](PPCContext* ctx) {\n//             auto result = ctx->v[3];\n//             REQUIRE(result == vec128b(0));\n//           });\n//}\n//\n// TEST_CASE(\"UNPACK_S16_IN_32_HI\", \"[instr]\") {\n//  TestFunction test([](HIRBuilder& b) {\n//    StoreVR(b, 3, b.Unpack(LoadVR(b, 4), PACK_TYPE_S16_IN_32_HI));\n//    b.Return();\n//  });\n//  test.Run([](PPCContext* ctx) { ctx->v[4] = vec128b(0); },\n//           [](PPCContext* ctx) {\n//             auto result = ctx->v[3];\n//             REQUIRE(result == vec128b(0));\n//           });\n//}\n"
  },
  {
    "path": "src/xenia/cpu/testing/util.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_TESTING_UTIL_H_\n#define XENIA_CPU_TESTING_UTIL_H_\n\n#include <vector>\n\n#include \"xenia/base/platform.h\"\n#include \"xenia/cpu/backend/x64/x64_backend.h\"\n#include \"xenia/cpu/hir/hir_builder.h\"\n#include \"xenia/cpu/ppc/ppc_context.h\"\n#include \"xenia/cpu/ppc/ppc_frontend.h\"\n#include \"xenia/cpu/processor.h\"\n#include \"xenia/cpu/test_module.h\"\n\n#include \"third_party/catch/include/catch.hpp\"\n\nnamespace xe {\nnamespace cpu {\nnamespace testing {\n\nusing xe::cpu::ppc::PPCContext;\n\nclass TestFunction {\n public:\n  TestFunction(std::function<void(hir::HIRBuilder& b)> generator) {\n    memory_size = 16 * 1024 * 1024;\n    memory.reset(new Memory());\n    memory->Initialize();\n\n    {\n      std::unique_ptr<xe::cpu::backend::Backend> backend;\n#if XE_ARCH_AMD64\n      backend.reset(new xe::cpu::backend::x64::X64Backend());\n#endif  // XE_ARCH\n      if (backend) {\n        auto processor = std::make_unique<Processor>(memory.get(), nullptr);\n        processor->Setup(std::move(backend));\n        processors.emplace_back(std::move(processor));\n      }\n    }\n\n    for (auto& processor : processors) {\n      auto module = std::make_unique<xe::cpu::TestModule>(\n          processor.get(), \"Test\",\n          [](uint64_t address) { return address == 0x80000000; },\n          [generator](hir::HIRBuilder& b) {\n            generator(b);\n            return true;\n          });\n      processor->AddModule(std::move(module));\n      processor->backend()->CommitExecutableRange(0x80000000, 0x80010000);\n    }\n  }\n\n  ~TestFunction() {\n    processors.clear();\n    memory.reset();\n  }\n\n  void Run(std::function<void(PPCContext*)> pre_call,\n           std::function<void(PPCContext*)> post_call) {\n    for (auto& processor : processors) {\n      auto fn = processor->ResolveFunction(0x80000000);\n\n      uint32_t stack_size = 64 * 1024;\n      uint32_t stack_address = memory_size - stack_size;\n      uint32_t thread_state_address = stack_address - 0x1000;\n      auto thread_state = std::make_unique<ThreadState>(processor.get(), 0x100);\n      assert_always();  // TODO: Allocate a thread stack!!!\n      auto ctx = thread_state->context();\n      ctx->lr = 0xBCBCBCBC;\n\n      pre_call(ctx);\n\n      fn->Call(thread_state.get(), uint32_t(ctx->lr));\n\n      post_call(ctx);\n    }\n  }\n\n  uint32_t memory_size;\n  std::unique_ptr<Memory> memory;\n  std::vector<std::unique_ptr<Processor>> processors;\n};\n\ninline hir::Value* LoadGPR(hir::HIRBuilder& b, int reg) {\n  return b.LoadContext(offsetof(PPCContext, r) + reg * 8, hir::INT64_TYPE);\n}\ninline void StoreGPR(hir::HIRBuilder& b, int reg, hir::Value* value) {\n  b.StoreContext(offsetof(PPCContext, r) + reg * 8, value);\n}\n\ninline hir::Value* LoadFPR(hir::HIRBuilder& b, int reg) {\n  return b.LoadContext(offsetof(PPCContext, f) + reg * 8, hir::FLOAT64_TYPE);\n}\ninline void StoreFPR(hir::HIRBuilder& b, int reg, hir::Value* value) {\n  b.StoreContext(offsetof(PPCContext, f) + reg * 8, value);\n}\n\ninline hir::Value* LoadVR(hir::HIRBuilder& b, int reg) {\n  return b.LoadContext(offsetof(PPCContext, v) + reg * 16, hir::VEC128_TYPE);\n}\ninline void StoreVR(hir::HIRBuilder& b, int reg, hir::Value* value) {\n  b.StoreContext(offsetof(PPCContext, v) + reg * 16, value);\n}\n\n}  // namespace testing\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_TESTING_UTIL_H_\n"
  },
  {
    "path": "src/xenia/cpu/testing/vector_add_test.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/testing/util.h\"\n\n#include <cfloat>\n\nusing namespace xe;\nusing namespace xe::cpu;\nusing namespace xe::cpu::hir;\nusing namespace xe::cpu::testing;\nusing xe::cpu::ppc::PPCContext;\n\nTEST_CASE(\"VECTOR_ADD_I8\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(b, 3, b.VectorAdd(LoadVR(b, 4), LoadVR(b, 5), INT8_TYPE));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] =\n            vec128b(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);\n        ctx->v[5] =\n            vec128b(100, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128b(100, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22,\n                                  24, 26, 28, 30));\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128b(UINT8_MAX);\n        ctx->v[5] = vec128b(1);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128b(0));\n      });\n}\n\nTEST_CASE(\"VECTOR_ADD_I8_SAT_SIGNED\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(b, 3,\n            b.VectorAdd(LoadVR(b, 4), LoadVR(b, 5), INT8_TYPE,\n                        ARITHMETIC_SATURATE));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128b(INT8_MAX);\n        ctx->v[5] = vec128b(1);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128b(INT8_MAX));\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128b(INT8_MIN);\n        ctx->v[5] = vec128b(-1);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128b(INT8_MIN));\n      });\n}\n\nTEST_CASE(\"VECTOR_ADD_I8_SAT_UNSIGNED\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(b, 3,\n            b.VectorAdd(LoadVR(b, 4), LoadVR(b, 5), INT8_TYPE,\n                        ARITHMETIC_SATURATE | ARITHMETIC_UNSIGNED));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128b(UINT8_MAX);\n        ctx->v[5] = vec128b(1);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128b(UINT8_MAX));\n      });\n}\n\nTEST_CASE(\"VECTOR_ADD_I16\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(b, 3, b.VectorAdd(LoadVR(b, 4), LoadVR(b, 5), INT16_TYPE));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128s(0, 1, 2, 3, 4, 5, 6, 7);\n        ctx->v[5] = vec128s(100, 1, 2, 3, 4, 5, 6, 7);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128s(100, 2, 4, 6, 8, 10, 12, 14));\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128s(UINT16_MAX);\n        ctx->v[5] = vec128s(1);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128s(0));\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128s(0);\n        ctx->v[5] = vec128s(-1);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128s(UINT16_MAX));\n      });\n}\n\nTEST_CASE(\"VECTOR_ADD_I16_SAT_SIGNED\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(b, 3,\n            b.VectorAdd(LoadVR(b, 4), LoadVR(b, 5), INT16_TYPE,\n                        ARITHMETIC_SATURATE));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128s(INT16_MAX);\n        ctx->v[5] = vec128s(1);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128s(INT16_MAX));\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128s(INT16_MIN);\n        ctx->v[5] = vec128s(-1);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128s(INT16_MIN));\n      });\n}\n\nTEST_CASE(\"VECTOR_ADD_I16_SAT_UNSIGNED\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(b, 3,\n            b.VectorAdd(LoadVR(b, 4), LoadVR(b, 5), INT16_TYPE,\n                        ARITHMETIC_SATURATE | ARITHMETIC_UNSIGNED));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128s(UINT16_MAX);\n        ctx->v[5] = vec128s(1);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128s(UINT16_MAX));\n      });\n}\n\nTEST_CASE(\"VECTOR_ADD_I32\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(b, 3, b.VectorAdd(LoadVR(b, 4), LoadVR(b, 5), INT32_TYPE));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128i(0, 1, 2, 3);\n        ctx->v[5] = vec128i(100, 1, 2, 3);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128i(100, 2, 4, 6));\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128i(UINT32_MAX);\n        ctx->v[5] = vec128i(1);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128i(0));\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128i(0);\n        ctx->v[5] = vec128i(-1);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128i(UINT32_MAX));\n      });\n}\n\nTEST_CASE(\"VECTOR_ADD_I32_SAT_SIGNED\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(b, 3,\n            b.VectorAdd(LoadVR(b, 4), LoadVR(b, 5), INT32_TYPE,\n                        ARITHMETIC_SATURATE));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128i(5);\n        ctx->v[5] = vec128i(5);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128i(10));\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128i(INT32_MAX);\n        ctx->v[5] = vec128i(1);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128i(INT32_MAX));\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128i(INT32_MIN);\n        ctx->v[5] = vec128i(-1);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128i(INT32_MIN));\n      });\n}\n\nTEST_CASE(\"VECTOR_ADD_I32_SAT_UNSIGNED\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(b, 3,\n            b.VectorAdd(LoadVR(b, 4), LoadVR(b, 5), INT32_TYPE,\n                        ARITHMETIC_SATURATE | ARITHMETIC_UNSIGNED));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128i(5);\n        ctx->v[5] = vec128i(5);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128i(10));\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128i(UINT32_MAX);\n        ctx->v[5] = vec128i(1);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128i(UINT32_MAX));\n      });\n}\n\nTEST_CASE(\"VECTOR_ADD_F32\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(b, 3, b.VectorAdd(LoadVR(b, 4), LoadVR(b, 5), FLOAT32_TYPE));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128f(0.12f, 0.34f, 0.56f, 0.78f);\n        ctx->v[5] = vec128f(0.12f, 0.34f, 0.56f, 0.78f);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result ==\n                vec128i(0x3E75C28F, 0x3F2E147B, 0x3F8F5C29, 0x3FC7AE14));\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128f(FLT_MAX);\n        ctx->v[5] = vec128f(FLT_MAX);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128i(0x7F800000));\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128f(-FLT_MIN);\n        ctx->v[5] = vec128f(-1.0f);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128i(0xBF800000));\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128f(FLT_MAX);\n        ctx->v[5] = vec128f(1.0f);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128i(0x7F7FFFFF));\n      });\n}\n"
  },
  {
    "path": "src/xenia/cpu/testing/vector_max_test.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/testing/util.h\"\n\n#include <cfloat>\n#include <climits>\n\nusing namespace xe;\nusing namespace xe::cpu;\nusing namespace xe::cpu::hir;\nusing namespace xe::cpu::testing;\nusing xe::cpu::ppc::PPCContext;\n\nTEST_CASE(\"VECTOR_MAX_I8_SIGNED\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(b, 3, b.VectorMax(LoadVR(b, 4), LoadVR(b, 5), INT8_TYPE));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] =\n            vec128b(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);\n        ctx->v[5] = vec128b(-100, 1, 100, -3, 4, -5, 60, 7, -80, 9, 10,\n                            INT8_MIN, INT8_MAX, 13, 2, 0);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128b(0, 1, 100, 3, 4, 5, 60, 7, 8, 9, 10, 11,\n                                  INT8_MAX, 13, 14, 15));\n      });\n}\n\nTEST_CASE(\"VECTOR_MAX_I8_UNSIGNED\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(b, 3,\n            b.VectorMax(LoadVR(b, 4), LoadVR(b, 5), INT8_TYPE,\n                        ARITHMETIC_UNSIGNED));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] =\n            vec128b(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);\n        ctx->v[5] = vec128b(-100, 1, 100, -3, 4, -5, 60, 7, -80, 9, 10,\n                            INT8_MIN, INT8_MAX, 13, 2, 0);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128b(-100, 1, 100, -3, 4, -5, 60, 7, -80, 9, 10,\n                                  INT8_MIN, INT8_MAX, 13, 14, 15));\n      });\n}\n\nTEST_CASE(\"VECTOR_MAX_I16_SIGNED\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(b, 3, b.VectorMax(LoadVR(b, 4), LoadVR(b, 5), INT16_TYPE));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128s(0, 1, 2, 3, 4, 5, -6000, 7);\n        ctx->v[5] = vec128s(-1000, 1, -2000, 3, 4, SHRT_MAX, 6, 0);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128s(0, 1, 2, 3, 4, SHRT_MAX, 6, 7));\n      });\n}\n\nTEST_CASE(\"VECTOR_MAX_I16_UNSIGNED\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(b, 3,\n            b.VectorMax(LoadVR(b, 4), LoadVR(b, 5), INT16_TYPE,\n                        ARITHMETIC_UNSIGNED));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128s(0, 1, 2, 3, 4, 5, -6000, 7);\n        ctx->v[5] = vec128s(-1000, 1, -2000, 3, 4, USHRT_MAX, 6, 0);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128s(-1000, 1, -2000, 3, 4, USHRT_MAX, -6000, 7));\n      });\n}\n\nTEST_CASE(\"VECTOR_MAX_I32_SIGNED\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(b, 3, b.VectorMax(LoadVR(b, 4), LoadVR(b, 5), INT32_TYPE));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128i(0, 1, 123, 3);\n        ctx->v[5] = vec128i(-1000000, 0, INT_MAX, 0);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128i(0, 1, INT_MAX, 3));\n      });\n}\n\nTEST_CASE(\"VECTOR_MAX_I32_UNSIGNED\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(b, 3,\n            b.VectorMax(LoadVR(b, 4), LoadVR(b, 5), INT32_TYPE,\n                        ARITHMETIC_UNSIGNED));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128i(0, 1, 123, 3);\n        ctx->v[5] = vec128i(-1000000, 0, UINT_MAX, 0);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128i(-1000000, 1, UINT_MAX, 3));\n      });\n}\n"
  },
  {
    "path": "src/xenia/cpu/testing/vector_min_test.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/testing/util.h\"\n\n#include <cfloat>\n#include <climits>\n\nusing namespace xe;\nusing namespace xe::cpu;\nusing namespace xe::cpu::hir;\nusing namespace xe::cpu::testing;\nusing xe::cpu::ppc::PPCContext;\n\nTEST_CASE(\"VECTOR_MIN_I8_SIGNED\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(b, 3, b.VectorMin(LoadVR(b, 4), LoadVR(b, 5), INT8_TYPE));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] =\n            vec128b(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);\n        ctx->v[5] = vec128b(-100, 1, 100, -3, 4, -5, 60, 7, -80, 9, 10,\n                            INT8_MIN, INT8_MAX, 13, 2, 0);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128b(-100, 1, 2, -3, 4, -5, 6, 7, -80, 9, 10,\n                                  INT8_MIN, 12, 13, 2, 0));\n      });\n}\n\nTEST_CASE(\"VECTOR_MIN_I8_UNSIGNED\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(b, 3,\n            b.VectorMin(LoadVR(b, 4), LoadVR(b, 5), INT8_TYPE,\n                        ARITHMETIC_UNSIGNED));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] =\n            vec128b(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);\n        ctx->v[5] = vec128b(255, 1, 200, -3, 4, -5, 60, 7, -80, 9, 10, 11, 12,\n                            13, 2, 0);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result ==\n                vec128b(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 2, 0));\n      });\n}\n\nTEST_CASE(\"VECTOR_MIN_I16_SIGNED\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(b, 3, b.VectorMin(LoadVR(b, 4), LoadVR(b, 5), INT16_TYPE));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128s(0, 1, 2, 3, 4, 5, -6000, 7);\n        ctx->v[5] = vec128s(-1000, 1, -2000, 3, 4, SHRT_MAX, 6, 0);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128s(-1000, 1, -2000, 3, 4, 5, -6000, 0));\n      });\n}\n\nTEST_CASE(\"VECTOR_MIN_I16_UNSIGNED\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(b, 3,\n            b.VectorMin(LoadVR(b, 4), LoadVR(b, 5), INT16_TYPE,\n                        ARITHMETIC_UNSIGNED));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128s(0, 1, 2, 3, 4, 5, -6000, 7);\n        ctx->v[5] = vec128s(-1000, 1, -2000, 3, 4, USHRT_MAX, 6, 0);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128s(0, 1, 2, 3, 4, 5, 6, 0));\n      });\n}\n\nTEST_CASE(\"VECTOR_MIN_I32_SIGNED\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(b, 3, b.VectorMin(LoadVR(b, 4), LoadVR(b, 5), INT32_TYPE));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128i(0, 1, 123, 3);\n        ctx->v[5] = vec128i(-1000000, 0, INT_MAX, 0);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128i(-1000000, 0, 123, 0));\n      });\n}\n\nTEST_CASE(\"VECTOR_MIN_I32_UNSIGNED\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(b, 3,\n            b.VectorMin(LoadVR(b, 4), LoadVR(b, 5), INT32_TYPE,\n                        ARITHMETIC_UNSIGNED));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128i(0, 1, 123, 3);\n        ctx->v[5] = vec128i(-1000000, 0, UINT_MAX, 0);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128i(0, 0, 123, 0));\n      });\n}\n"
  },
  {
    "path": "src/xenia/cpu/testing/vector_rotate_left_test.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/testing/util.h\"\n\nusing namespace xe;\nusing namespace xe::cpu;\nusing namespace xe::cpu::hir;\nusing namespace xe::cpu::testing;\nusing xe::cpu::ppc::PPCContext;\n\nTEST_CASE(\"VECTOR_ROTATE_LEFT_I8\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(b, 3, b.VectorRotateLeft(LoadVR(b, 4), LoadVR(b, 5), INT8_TYPE));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128b(0b00000001);\n        ctx->v[5] =\n            vec128b(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result ==\n                vec128b(0b00000001, 0b00000010, 0b00000100, 0b00001000,\n                        0b00010000, 0b00100000, 0b01000000, 0b10000000,\n                        0b00000001, 0b00000010, 0b00000100, 0b00001000,\n                        0b00010000, 0b00100000, 0b01000000, 0b10000000));\n      });\n}\n\nTEST_CASE(\"VECTOR_ROTATE_LEFT_I16\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(b, 3, b.VectorRotateLeft(LoadVR(b, 4), LoadVR(b, 5), INT16_TYPE));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128s(0x0001, 0x0001, 0x0001, 0x0001, 0x1000, 0x1000,\n                            0x1000, 0x1000);\n        ctx->v[5] = vec128s(0, 1, 2, 3, 14, 15, 16, 17);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128s(0x0001, 0x0002, 0x0004, 0x0008, 0x0400,\n                                  0x0800, 0x1000, 0x2000));\n      });\n}\n\nTEST_CASE(\"VECTOR_ROTATE_LEFT_I32\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(b, 3, b.VectorRotateLeft(LoadVR(b, 4), LoadVR(b, 5), INT32_TYPE));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128i(0x00000001, 0x00000001, 0x80000000, 0x80000000);\n        ctx->v[5] = vec128i(0, 1, 33, 2);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result ==\n                vec128i(0x00000001, 0x00000002, 0x00000001, 0x00000002));\n      });\n}\n"
  },
  {
    "path": "src/xenia/cpu/testing/vector_sha_test.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/testing/util.h\"\n\nusing namespace xe;\nusing namespace xe::cpu;\nusing namespace xe::cpu::hir;\nusing namespace xe::cpu::testing;\nusing xe::cpu::ppc::PPCContext;\n\nTEST_CASE(\"VECTOR_SHA_I8\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(b, 3, b.VectorSha(LoadVR(b, 4), LoadVR(b, 5), INT8_TYPE));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128b(0x7E, 0x7E, 0x7E, 0x7F, 0x80, 0xFF, 0x01, 0x12,\n                            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);\n        ctx->v[5] =\n            vec128b(0, 1, 2, 8, 4, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128b(0x7E, 0x3F, 0x1F, 0x7F, 0xF8, 0xFF, 0x00,\n                                  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n                                  0x00, 0x00));\n      });\n}\n\nTEST_CASE(\"VECTOR_SHA_I8_CONSTANT\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(\n        b, 3,\n        b.VectorSha(LoadVR(b, 4),\n                    b.LoadConstantVec128(vec128b(0, 1, 2, 8, 4, 4, 6, 7, 8, 9,\n                                                 10, 11, 12, 13, 14, 15)),\n                    INT8_TYPE));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128b(0x7E, 0x7E, 0x7E, 0x7F, 0x80, 0xFF, 0x01, 0x12,\n                            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128b(0x7E, 0x3F, 0x1F, 0x7F, 0xF8, 0xFF, 0x00,\n                                  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n                                  0x00, 0x00));\n      });\n}\n\n// This targets the \"all_same\" optimization of the Int8 specialization of\n// VECTOR_SHA_V128\nTEST_CASE(\"VECTOR_SHA_I8_SAME_CONSTANT\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(\n        b, 3,\n        b.VectorSha(LoadVR(b, 4), b.LoadConstantVec128(vec128b(5)), INT8_TYPE));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128b(0x7E, 0x7E, 0x7E, 0x7F, 0x80, 0xFF, 0x01, 0x12,\n                            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128b(0x03, 0x03, 0x03, 0x03, 0xfc, 0xff, 0x00,\n                                  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n                                  0x00, 0x00));\n      });\n}\n\nTEST_CASE(\"VECTOR_SHA_I16\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(b, 3, b.VectorSha(LoadVR(b, 4), LoadVR(b, 5), INT16_TYPE));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128s(0x7FFE, 0x7FFE, 0x7FFE, 0x7FFF, 0x8000, 0xFFFF,\n                            0x0001, 0x1234);\n        ctx->v[5] = vec128s(0, 1, 8, 15, 15, 8, 1, 16);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128s(0x7FFE, 0x3FFF, 0x007F, 0x0000, 0xFFFF,\n                                  0xFFFF, 0x0000, 0x1234));\n      });\n}\n\nTEST_CASE(\"VECTOR_SHA_I16_CONSTANT\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(\n        b, 3,\n        b.VectorSha(LoadVR(b, 4),\n                    b.LoadConstantVec128(vec128s(0, 1, 8, 15, 15, 8, 1, 16)),\n                    INT16_TYPE));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128s(0x7FFE, 0x7FFE, 0x7FFE, 0x7FFF, 0x8000, 0xFFFF,\n                            0x0001, 0x1234);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128s(0x7FFE, 0x3FFF, 0x007F, 0x0000, 0xFFFF,\n                                  0xFFFF, 0x0000, 0x1234));\n      });\n}\n\nTEST_CASE(\"VECTOR_SHA_I32\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(b, 3, b.VectorSha(LoadVR(b, 4), LoadVR(b, 5), INT32_TYPE));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128i(0x7FFFFFFE, 0x7FFFFFFE, 0x7FFFFFFE, 0x7FFFFFFF);\n        ctx->v[5] = vec128i(0, 1, 16, 31);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result ==\n                vec128i(0x7FFFFFFE, 0x3FFFFFFF, 0x00007FFF, 0x00000000));\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128i(0x80000000, 0xFFFFFFFF, 0x00000001, 0x12345678);\n        ctx->v[5] = vec128i(31, 16, 1, 32);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result ==\n                vec128i(0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x12345678));\n      });\n}\n\nTEST_CASE(\"VECTOR_SHA_I32_CONSTANT\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(\n        b, 3,\n        b.VectorSha(LoadVR(b, 4), b.LoadConstantVec128(vec128i(0, 1, 16, 31)),\n                    INT32_TYPE));\n    StoreVR(\n        b, 4,\n        b.VectorSha(LoadVR(b, 5), b.LoadConstantVec128(vec128i(31, 16, 1, 32)),\n                    INT32_TYPE));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128i(0x7FFFFFFE, 0x7FFFFFFE, 0x7FFFFFFE, 0x7FFFFFFF);\n        ctx->v[5] = vec128i(0x80000000, 0xFFFFFFFF, 0x00000001, 0x12345678);\n      },\n      [](PPCContext* ctx) {\n        auto result1 = ctx->v[3];\n        REQUIRE(result1 ==\n                vec128i(0x7FFFFFFE, 0x3FFFFFFF, 0x00007FFF, 0x00000000));\n        auto result2 = ctx->v[4];\n        REQUIRE(result2 ==\n                vec128i(0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x12345678));\n      });\n}\n"
  },
  {
    "path": "src/xenia/cpu/testing/vector_shl_test.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/testing/util.h\"\n\nusing namespace xe;\nusing namespace xe::cpu;\nusing namespace xe::cpu::hir;\nusing namespace xe::cpu::testing;\nusing xe::cpu::ppc::PPCContext;\n\nTEST_CASE(\"VECTOR_SHL_I8\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(b, 3, b.VectorShl(LoadVR(b, 4), LoadVR(b, 5), INT8_TYPE));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128b(0x7E, 0x7E, 0x7E, 0x7F, 0x80, 0xFF, 0x01, 0x12,\n                            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);\n        ctx->v[5] =\n            vec128b(0, 1, 2, 8, 4, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128b(0x7E, 0xFC, 0xF8, 0x7F, 0x00, 0xF0, 0x40,\n                                  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n                                  0x00, 0x00));\n      });\n}\n\nTEST_CASE(\"VECTOR_SHL_I8_CONSTANT\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(\n        b, 3,\n        b.VectorShl(LoadVR(b, 4),\n                    b.LoadConstantVec128(vec128b(0, 1, 2, 8, 4, 4, 6, 7, 8, 9,\n                                                 10, 11, 12, 13, 14, 15)),\n                    INT8_TYPE));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128b(0x7E, 0x7E, 0x7E, 0x7F, 0x80, 0xFF, 0x01, 0x12,\n                            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128b(0x7E, 0xFC, 0xF8, 0x7F, 0x00, 0xF0, 0x40,\n                                  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n                                  0x00, 0x00));\n      });\n}\n\n// This targets the \"all_same\" optimization of the Int8 specialization of\n// VECTOR_SHL_V128\nTEST_CASE(\"VECTOR_SHL_I8_SAME_CONSTANT\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(\n        b, 3,\n        b.VectorShl(LoadVR(b, 4), b.LoadConstantVec128(vec128b(5)), INT8_TYPE));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128b(0x7E, 0x7E, 0x7E, 0x7F, 0x80, 0xFF, 0x01, 0x12,\n                            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128b(0xC0, 0xC0, 0xC0, 0xE0, 0x00, 0xE0, 0x20,\n                                  0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n                                  0x00, 0x00));\n      });\n}\n\nTEST_CASE(\"VECTOR_SHL_I16\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(b, 3, b.VectorShl(LoadVR(b, 4), LoadVR(b, 5), INT16_TYPE));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128s(0x7FFE, 0x7FFE, 0x7FFE, 0x7FFF, 0x8000, 0xFFFF,\n                            0x0001, 0x1234);\n        ctx->v[5] = vec128s(0, 1, 8, 15, 15, 8, 1, 16);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128s(0x7FFE, 0xFFFC, 0xFE00, 0x8000, 0x0000,\n                                  0xFF00, 0x0002, 0x1234));\n      });\n}\n\nTEST_CASE(\"VECTOR_SHL_I16_CONSTANT\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(\n        b, 3,\n        b.VectorShl(LoadVR(b, 4),\n                    b.LoadConstantVec128(vec128s(0, 1, 8, 15, 15, 8, 1, 16)),\n                    INT16_TYPE));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128s(0x7FFE, 0x7FFE, 0x7FFE, 0x7FFF, 0x8000, 0xFFFF,\n                            0x0001, 0x1234);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128s(0x7FFE, 0xFFFC, 0xFE00, 0x8000, 0x0000,\n                                  0xFF00, 0x0002, 0x1234));\n      });\n}\n\nTEST_CASE(\"VECTOR_SHL_I32\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(b, 3, b.VectorShl(LoadVR(b, 4), LoadVR(b, 5), INT32_TYPE));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128i(0x7FFFFFFE, 0x7FFFFFFE, 0x7FFFFFFE, 0x7FFFFFFF);\n        ctx->v[5] = vec128i(0, 1, 16, 31);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result ==\n                vec128i(0x7FFFFFFE, 0xFFFFFFFC, 0xFFFE0000, 0x80000000));\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128i(0x80000000, 0xFFFFFFFF, 0x00000001, 0x12345678);\n        ctx->v[5] = vec128i(31, 16, 1, 32);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result ==\n                vec128i(0x00000000, 0xFFFF0000, 0x00000002, 0x12345678));\n      });\n}\n\nTEST_CASE(\"VECTOR_SHL_I32_CONSTANT\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(\n        b, 3,\n        b.VectorShl(LoadVR(b, 4), b.LoadConstantVec128(vec128i(0, 1, 16, 31)),\n                    INT32_TYPE));\n    StoreVR(\n        b, 4,\n        b.VectorShl(LoadVR(b, 5), b.LoadConstantVec128(vec128i(31, 16, 1, 32)),\n                    INT32_TYPE));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128i(0x7FFFFFFE, 0x7FFFFFFE, 0x7FFFFFFE, 0x7FFFFFFF);\n        ctx->v[5] = vec128i(0x80000000, 0xFFFFFFFF, 0x00000001, 0x12345678);\n      },\n      [](PPCContext* ctx) {\n        auto result1 = ctx->v[3];\n        REQUIRE(result1 ==\n                vec128i(0x7FFFFFFE, 0xFFFFFFFC, 0xFFFE0000, 0x80000000));\n        auto result2 = ctx->v[4];\n        REQUIRE(result2 ==\n                vec128i(0x00000000, 0xFFFF0000, 0x00000002, 0x12345678));\n      });\n}\n"
  },
  {
    "path": "src/xenia/cpu/testing/vector_shr_test.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/testing/util.h\"\n\nusing namespace xe;\nusing namespace xe::cpu;\nusing namespace xe::cpu::hir;\nusing namespace xe::cpu::testing;\nusing xe::cpu::ppc::PPCContext;\n\nTEST_CASE(\"VECTOR_SHR_I8\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(b, 3, b.VectorShr(LoadVR(b, 4), LoadVR(b, 5), INT8_TYPE));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128b(0x7E, 0x7E, 0x7E, 0x7F, 0x80, 0xFF, 0x01, 0x12,\n                            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);\n        ctx->v[5] =\n            vec128b(0, 1, 2, 8, 4, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128b(0x7E, 0x3F, 0x1F, 0x7F, 0x08, 0x0F, 0x00,\n                                  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n                                  0x00, 0x00));\n      });\n}\n\nTEST_CASE(\"VECTOR_SHR_I8_CONSTANT\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(\n        b, 3,\n        b.VectorShr(LoadVR(b, 4),\n                    b.LoadConstantVec128(vec128b(0, 1, 2, 8, 4, 4, 6, 7, 8, 9,\n                                                 10, 11, 12, 13, 14, 15)),\n                    INT8_TYPE));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128b(0x7E, 0x7E, 0x7E, 0x7F, 0x80, 0xFF, 0x01, 0x12,\n                            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128b(0x7E, 0x3F, 0x1F, 0x7F, 0x08, 0x0F, 0x00,\n                                  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n                                  0x00, 0x00));\n      });\n}\n\n// This targets the \"all_same\" optimization of the Int8 specialization of\n// VECTOR_SHR_V128\nTEST_CASE(\"VECTOR_SHR_I8_SAME_CONSTANT\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(\n        b, 3,\n        b.VectorShr(LoadVR(b, 4), b.LoadConstantVec128(vec128b(3)), INT8_TYPE));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128b(0x7E, 0x7E, 0x7E, 0x7F, 0x80, 0xFF, 0x01, 0x12,\n                            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128b(0x0F, 0x0F, 0x0F, 0x0F, 0x10, 0x1F, 0x00,\n                                  0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n                                  0x00, 0x00));\n      });\n}\n\nTEST_CASE(\"VECTOR_SHR_I16\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(b, 3, b.VectorShr(LoadVR(b, 4), LoadVR(b, 5), INT16_TYPE));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128s(0x7FFE, 0x7FFE, 0x7FFE, 0x7FFF, 0x8000, 0xFFFF,\n                            0x0001, 0x1234);\n        ctx->v[5] = vec128s(0, 1, 8, 15, 15, 8, 1, 16);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128s(0x7FFE, 0x3FFF, 0x007F, 0x0000, 0x0001,\n                                  0x00FF, 0x0000, 0x1234));\n      });\n}\n\nTEST_CASE(\"VECTOR_SHR_I16_CONSTANT\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(\n        b, 3,\n        b.VectorShr(LoadVR(b, 4),\n                    b.LoadConstantVec128(vec128s(0, 1, 8, 15, 15, 8, 1, 16)),\n                    INT16_TYPE));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128s(0x7FFE, 0x7FFE, 0x7FFE, 0x7FFF, 0x8000, 0xFFFF,\n                            0x0001, 0x1234);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result == vec128s(0x7FFE, 0x3FFF, 0x007F, 0x0000, 0x0001,\n                                  0x00FF, 0x0000, 0x1234));\n      });\n}\n\nTEST_CASE(\"VECTOR_SHR_I32\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(b, 3, b.VectorShr(LoadVR(b, 4), LoadVR(b, 5), INT32_TYPE));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128i(0x7FFFFFFE, 0x7FFFFFFE, 0x7FFFFFFE, 0x7FFFFFFF);\n        ctx->v[5] = vec128i(0, 1, 16, 31);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result ==\n                vec128i(0x7FFFFFFE, 0x3FFFFFFF, 0x00007FFF, 0x00000000));\n      });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128i(0x80000000, 0xFFFFFFFF, 0x00000001, 0x12345678);\n        ctx->v[5] = vec128i(31, 16, 1, 32);\n      },\n      [](PPCContext* ctx) {\n        auto result = ctx->v[3];\n        REQUIRE(result ==\n                vec128i(0x00000001, 0x0000FFFF, 0x00000000, 0x12345678));\n      });\n}\n\nTEST_CASE(\"VECTOR_SHR_I32_CONSTANT\", \"[instr]\") {\n  TestFunction test([](HIRBuilder& b) {\n    StoreVR(\n        b, 3,\n        b.VectorShr(LoadVR(b, 4), b.LoadConstantVec128(vec128i(0, 1, 16, 31)),\n                    INT32_TYPE));\n    StoreVR(\n        b, 4,\n        b.VectorShr(LoadVR(b, 5), b.LoadConstantVec128(vec128i(31, 16, 1, 32)),\n                    INT32_TYPE));\n    b.Return();\n  });\n  test.Run(\n      [](PPCContext* ctx) {\n        ctx->v[4] = vec128i(0x7FFFFFFE, 0x7FFFFFFE, 0x7FFFFFFE, 0x7FFFFFFF);\n        ctx->v[5] = vec128i(0x80000000, 0xFFFFFFFF, 0x00000001, 0x12345678);\n      },\n      [](PPCContext* ctx) {\n        auto result1 = ctx->v[3];\n        REQUIRE(result1 ==\n                vec128i(0x7FFFFFFE, 0x3FFFFFFF, 0x00007FFF, 0x00000000));\n        auto result2 = ctx->v[4];\n        REQUIRE(result2 ==\n                vec128i(0x00000001, 0x0000FFFF, 0x00000000, 0x12345678));\n      });\n}\n"
  },
  {
    "path": "src/xenia/cpu/thread.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2017 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/thread.h\"\n#include \"xenia/cpu/thread_state.h\"\n\nnamespace xe {\nnamespace cpu {\n\nthread_local Thread* Thread::current_thread_ = nullptr;\n\nThread::Thread() {}\nThread::~Thread() {}\n\nbool Thread::IsInThread() { return current_thread_ != nullptr; }\n\nThread* Thread::GetCurrentThread() { return current_thread_; }\nuint32_t Thread::GetCurrentThreadId() {\n  return Thread::GetCurrentThread()->thread_state()->thread_id();\n}\n\n}  // namespace cpu\n}  // namespace xe"
  },
  {
    "path": "src/xenia/cpu/thread.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2017 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_THREAD_H_\n#define XENIA_CPU_THREAD_H_\n\n#include \"xenia/base/threading.h\"\n\n#include <cstdint>\n\nnamespace xe {\nnamespace cpu {\n\nclass ThreadState;\n\n// Represents a thread that runs guest code.\nclass Thread {\n public:\n  Thread();\n  ~Thread();\n\n  static bool IsInThread();\n  static Thread* GetCurrentThread();\n  static uint32_t GetCurrentThreadId();\n  ThreadState* thread_state() const { return thread_state_; }\n\n  // True if the thread should be paused by the debugger.\n  // All threads that can run guest code must be stopped for the debugger to\n  // work properly.\n  bool can_debugger_suspend() const { return can_debugger_suspend_; }\n  void set_can_debugger_suspend(bool value) { can_debugger_suspend_ = value; }\n\n  xe::threading::Thread* thread() { return thread_.get(); }\n  const std::string& thread_name() const { return thread_name_; }\n\n protected:\n  thread_local static Thread* current_thread_;\n\n  ThreadState* thread_state_ = nullptr;\n  std::unique_ptr<xe::threading::Thread> thread_ = nullptr;\n\n  bool can_debugger_suspend_ = true;\n  std::string thread_name_;\n};\n\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_THREAD_H_\n"
  },
  {
    "path": "src/xenia/cpu/thread_debug_info.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2016 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_THREAD_DEBUG_INFO_H_\n#define XENIA_CPU_THREAD_DEBUG_INFO_H_\n\n#include <vector>\n\n#include \"xenia/base/host_thread_context.h\"\n#include \"xenia/cpu/thread.h\"\n#include \"xenia/cpu/thread_state.h\"\n\nnamespace xe {\nnamespace cpu {\n\nclass Breakpoint;\nclass Function;\n\n// Per-thread structure holding debugger state and a cache of the sampled call\n// stack.\n//\n// In most cases debug consumers should rely only on data in this structure as\n// it is never removed (even when a thread is destroyed) and always available\n// even when running.\nstruct ThreadDebugInfo {\n  ThreadDebugInfo() = default;\n  ~ThreadDebugInfo() = default;\n\n  enum class State {\n    // Thread is alive and running.\n    kAlive,\n    // Thread is in a wait state.\n    kWaiting,\n    // Thread has exited but not yet been killed.\n    kExited,\n    // Thread has been killed.\n    kZombie,\n  };\n\n  // XThread::thread_id(), unique to the thread for the run of the emulator.\n  uint32_t thread_id = 0;\n  // XThread::handle() of the thread.\n  // This will be invalidated when the thread dies.\n  uint32_t thread_handle = 0;\n  // Thread object. Only valid when the thread is alive.\n  Thread* thread = nullptr;\n  // Current state of the thread.\n  State state = State::kAlive;\n  // Whether the debugger has forcefully suspended this thread.\n  bool suspended = false;\n\n  // A breakpoint managed by the stepping system, installed as required to\n  // trigger a break at the next instruction.\n  std::unique_ptr<Breakpoint> step_breakpoint;\n  // A breakpoint managed by the stepping system, installed as required to\n  // trigger after a step over a disabled breakpoint.\n  // When this breakpoint is hit the breakpoint referenced in\n  // restore_original_breakpoint will be reinstalled.\n  // Breakpoint restore_step_breakpoint;\n  // If the thread is stepping over a disabled breakpoint this will point to\n  // that breakpoint so it can be restored.\n  // Breakpoint* restore_original_breakpoint = nullptr;\n\n  // Last-sampled PPC context.\n  // This is updated whenever the debugger stops.\n  ppc::PPCContext guest_context;\n  // Last-sampled host context.\n  // This is updated whenever the debugger stops and must be used instead of any\n  // value taken from the StackWalker as it properly respects exception stacks.\n  HostThreadContext host_context;\n\n  // A single frame in a call stack.\n  struct Frame {\n    // PC of the current instruction in host code.\n    uint64_t host_pc = 0;\n    // Base of the function the current host_pc is located within.\n    uint64_t host_function_address = 0;\n    // PC of the current instruction in guest code.\n    // 0 if not a guest address or not known.\n    uint32_t guest_pc = 0;\n    // Base of the function the current guest_pc is located within.\n    uint32_t guest_function_address = 0;\n    // Function the current guest_pc is located within.\n    Function* guest_function = nullptr;\n    // Name of the function, if known.\n    // TODO(benvanik): string table?\n    char name[256] = {0};\n  };\n\n  // Last-sampled call stack.\n  // This is updated whenever the debugger stops.\n  std::vector<Frame> frames;\n};\n\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_THREAD_DEBUG_INFO_H_\n"
  },
  {
    "path": "src/xenia/cpu/thread_state.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/thread_state.h\"\n\n#include <cstdlib>\n#include <cstring>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/threading.h\"\n#include \"xenia/cpu/processor.h\"\n\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace cpu {\n\nthread_local ThreadState* thread_state_ = nullptr;\n\nThreadState::ThreadState(Processor* processor, uint32_t thread_id,\n                         uint32_t stack_base, uint32_t pcr_address)\n    : processor_(processor),\n      memory_(processor->memory()),\n      thread_id_(thread_id) {\n  if (thread_id_ == UINT_MAX) {\n    // System thread. Assign the system thread ID with a high bit\n    // set so people know what's up.\n    uint32_t system_thread_handle = xe::threading::current_thread_system_id();\n    thread_id_ = 0x80000000 | system_thread_handle;\n  }\n  backend_data_ = processor->backend()->AllocThreadData();\n\n  // Allocate with 64b alignment.\n  context_ = memory::AlignedAlloc<ppc::PPCContext>(64);\n  assert_true(((uint64_t)context_ & 0x3F) == 0);\n  std::memset(context_, 0, sizeof(ppc::PPCContext));\n\n  // Stash pointers to common structures that callbacks may need.\n  context_->global_mutex = &xe::global_critical_region::mutex();\n  context_->virtual_membase = memory_->virtual_membase();\n  context_->physical_membase = memory_->physical_membase();\n  context_->processor = processor_;\n  context_->thread_state = this;\n  context_->thread_id = thread_id_;\n\n  // Set initial registers.\n  context_->r[1] = stack_base;\n  context_->r[13] = pcr_address;\n}\n\nThreadState::~ThreadState() {\n  if (backend_data_) {\n    processor_->backend()->FreeThreadData(backend_data_);\n  }\n  if (thread_state_ == this) {\n    thread_state_ = nullptr;\n  }\n\n  memory::AlignedFree(context_);\n}\n\nvoid ThreadState::Bind(ThreadState* thread_state) {\n  thread_state_ = thread_state;\n}\n\nThreadState* ThreadState::Get() { return thread_state_; }\n\nuint32_t ThreadState::GetThreadID() {\n  return thread_state_ ? thread_state_->thread_id_ : 0xFFFFFFFF;\n}\n\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/thread_state.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_THREAD_STATE_H_\n#define XENIA_CPU_THREAD_STATE_H_\n\n#include <string>\n\n#include \"xenia/cpu/ppc/ppc_context.h\"\n#include \"xenia/cpu/thread_state.h\"\n#include \"xenia/memory.h\"\n\nnamespace xe {\nnamespace cpu {\n\nclass Processor;\n\nclass ThreadState {\n public:\n  ThreadState(Processor* processor, uint32_t thread_id, uint32_t stack_base = 0,\n              uint32_t pcr_address = 0);\n  ~ThreadState();\n\n  Processor* processor() const { return processor_; }\n  Memory* memory() const { return memory_; }\n  void* backend_data() const { return backend_data_; }\n  ppc::PPCContext* context() const { return context_; }\n  uint32_t thread_id() const { return thread_id_; }\n\n  static void Bind(ThreadState* thread_state);\n  static ThreadState* Get();\n  static uint32_t GetThreadID();\n\n private:\n  Processor* processor_;\n  Memory* memory_;\n  void* backend_data_;\n\n  uint32_t pcr_address_ = 0;\n  uint32_t thread_id_ = 0;\n\n  // NOTE: must be 64b aligned for SSE ops.\n  ppc::PPCContext* context_;\n};\n\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_THREAD_STATE_H_\n"
  },
  {
    "path": "src/xenia/cpu/xex_module.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/cpu/xex_module.h\"\n\n#include <algorithm>\n\n#include \"third_party/fmt/include/fmt/format.h\"\n\n#include \"xenia/base/byte_order.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/memory.h\"\n#include \"xenia/cpu/cpu_flags.h\"\n#include \"xenia/cpu/export_resolver.h\"\n#include \"xenia/cpu/lzx.h\"\n#include \"xenia/cpu/processor.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/xmodule.h\"\n\n#include \"third_party/crypto/TinySHA1.hpp\"\n#include \"third_party/crypto/rijndael-alg-fst.c\"\n#include \"third_party/crypto/rijndael-alg-fst.h\"\n#include \"third_party/pe/pe_image.h\"\n\nstatic const uint8_t xe_xex2_retail_key[16] = {\n    0x20, 0xB1, 0x85, 0xA5, 0x9D, 0x28, 0xFD, 0xC3,\n    0x40, 0x58, 0x3F, 0xBB, 0x08, 0x96, 0xBF, 0x91};\nstatic const uint8_t xe_xex2_devkit_key[16] = {\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};\n\nvoid aes_decrypt_buffer(const uint8_t* session_key, const uint8_t* input_buffer,\n                        const size_t input_size, uint8_t* output_buffer,\n                        const size_t output_size) {\n  uint32_t rk[4 * (MAXNR + 1)];\n  uint8_t ivec[16] = {0};\n  int32_t Nr = rijndaelKeySetupDec(rk, session_key, 128);\n  const uint8_t* ct = input_buffer;\n  uint8_t* pt = output_buffer;\n  for (size_t n = 0; n < input_size; n += 16, ct += 16, pt += 16) {\n    // Decrypt 16 uint8_ts from input -> output.\n    rijndaelDecrypt(rk, Nr, ct, pt);\n    for (size_t i = 0; i < 16; i++) {\n      // XOR with previous.\n      pt[i] ^= ivec[i];\n      // Set previous.\n      ivec[i] = ct[i];\n    }\n  }\n}\n\nnamespace xe {\nnamespace cpu {\n\nusing xe::kernel::KernelState;\n\nXexModule::XexModule(Processor* processor, KernelState* kernel_state)\n    : Module(processor), processor_(processor), kernel_state_(kernel_state) {}\n\nXexModule::~XexModule() {}\n\nbool XexModule::GetOptHeader(const xex2_header* header, xex2_header_keys key,\n                             void** out_ptr) {\n  assert_not_null(header);\n  assert_not_null(out_ptr);\n\n  for (uint32_t i = 0; i < header->header_count; i++) {\n    const xex2_opt_header& opt_header = header->headers[i];\n    if (opt_header.key == key) {\n      // Match!\n      switch (key & 0xFF) {\n        case 0x00: {\n          // We just return the value of the optional header.\n          // Assume that the output pointer points to a uint32_t.\n          *reinterpret_cast<uint32_t*>(out_ptr) =\n              static_cast<uint32_t>(opt_header.value);\n        } break;\n        case 0x01: {\n          // Pointer to the value on the optional header.\n          *out_ptr = const_cast<void*>(\n              reinterpret_cast<const void*>(&opt_header.value));\n        } break;\n        default: {\n          // Pointer to the header.\n          *out_ptr =\n              reinterpret_cast<void*>(uintptr_t(header) + opt_header.offset);\n        } break;\n      }\n\n      return true;\n    }\n  }\n\n  return false;\n}\n\nbool XexModule::GetOptHeader(xex2_header_keys key, void** out_ptr) const {\n  return XexModule::GetOptHeader(xex_header(), key, out_ptr);\n}\n\nconst void* XexModule::GetSecurityInfo(const xex2_header* header) {\n  return reinterpret_cast<const void*>(uintptr_t(header) +\n                                       header->security_offset);\n}\n\nconst PESection* XexModule::GetPESection(const char* name) {\n  for (std::vector<PESection>::iterator it = pe_sections_.begin();\n       it != pe_sections_.end(); ++it) {\n    if (!strcmp(it->name, name)) {\n      return &(*it);\n    }\n  }\n  return nullptr;\n}\n\nuint32_t XexModule::GetProcAddress(uint16_t ordinal) const {\n  // First: Check the xex2 export table.\n  if (xex_security_info()->export_table) {\n    auto export_table = memory()->TranslateVirtual<const xex2_export_table*>(\n        xex_security_info()->export_table);\n\n    ordinal -= export_table->base;\n    if (ordinal >= export_table->count) {\n      XELOGE(\"GetProcAddress({:03X}): ordinal out of bounds\", ordinal);\n      return 0;\n    }\n\n    uint32_t num = ordinal;\n    uint32_t ordinal_offset = export_table->ordOffset[num];\n    ordinal_offset += export_table->imagebaseaddr << 16;\n    return ordinal_offset;\n  }\n\n  // Second: Check the PE exports.\n  assert_not_zero(base_address_);\n\n  xex2_opt_data_directory* pe_export_directory = 0;\n  if (GetOptHeader(XEX_HEADER_EXPORTS_BY_NAME, &pe_export_directory)) {\n    auto e = memory()->TranslateVirtual<const X_IMAGE_EXPORT_DIRECTORY*>(\n        base_address_ + pe_export_directory->offset);\n    assert_not_null(e);\n\n    uint32_t* function_table =\n        reinterpret_cast<uint32_t*>(uintptr_t(e) + e->AddressOfFunctions);\n\n    if (ordinal < e->NumberOfFunctions) {\n      return base_address_ + function_table[ordinal];\n    }\n  }\n\n  return 0;\n}\n\nuint32_t XexModule::GetProcAddress(const std::string_view name) const {\n  assert_not_zero(base_address_);\n\n  xex2_opt_data_directory* pe_export_directory = 0;\n  if (!GetOptHeader(XEX_HEADER_EXPORTS_BY_NAME, &pe_export_directory)) {\n    // No exports by name.\n    return 0;\n  }\n\n  auto e = memory()->TranslateVirtual<const X_IMAGE_EXPORT_DIRECTORY*>(\n      base_address_ + pe_export_directory->offset);\n  assert_not_null(e);\n\n  // e->AddressOfX RVAs are relative to the IMAGE_EXPORT_DIRECTORY!\n  uint32_t* function_table =\n      reinterpret_cast<uint32_t*>(uintptr_t(e) + e->AddressOfFunctions);\n\n  // Names relative to directory\n  uint32_t* name_table =\n      reinterpret_cast<uint32_t*>(uintptr_t(e) + e->AddressOfNames);\n\n  // Table of ordinals (by name)\n  uint16_t* ordinal_table =\n      reinterpret_cast<uint16_t*>(uintptr_t(e) + e->AddressOfNameOrdinals);\n\n  for (uint32_t i = 0; i < e->NumberOfNames; i++) {\n    auto fn_name = reinterpret_cast<const char*>(uintptr_t(e) + name_table[i]);\n    uint16_t ordinal = ordinal_table[i];\n    uint32_t addr = base_address_ + function_table[ordinal];\n    if (name == std::string_view(fn_name)) {\n      // We have a match!\n      return addr;\n    }\n  }\n\n  // No match\n  return 0;\n}\n\nint XexModule::ApplyPatch(XexModule* module) {\n  if (!is_patch()) {\n    // This isn't a XEX2 patch.\n    return 1;\n  }\n\n  // Grab the delta descriptor and get to work.\n  xex2_opt_delta_patch_descriptor* patch_header = nullptr;\n  GetOptHeader(XEX_HEADER_DELTA_PATCH_DESCRIPTOR,\n               reinterpret_cast<void**>(&patch_header));\n  assert_not_null(patch_header);\n\n  // Compare hash inside delta descriptor to base XEX signature\n  uint8_t digest[0x14];\n  sha1::SHA1 s;\n  s.processBytes(module->xex_security_info()->rsa_signature, 0x100);\n  s.finalize(digest);\n\n  if (memcmp(digest, patch_header->digest_source, 0x14) != 0) {\n    XELOGW(\n        \"XEX patch signature hash doesn't match base XEX signature hash, patch \"\n        \"will likely fail!\");\n  }\n\n  uint32_t size = module->xex_header()->header_size;\n  if (patch_header->delta_headers_source_offset > size) {\n    XELOGE(\"XEX header patch source is outside base XEX header area\");\n    return 2;\n  }\n\n  uint32_t header_size_available =\n      size - patch_header->delta_headers_source_offset;\n  if (patch_header->delta_headers_source_size > header_size_available) {\n    XELOGE(\"XEX header patch source is too large\");\n    return 3;\n  }\n\n  if (patch_header->delta_headers_target_offset >\n      patch_header->size_of_target_headers) {\n    XELOGE(\"XEX header patch target is outside base XEX header area\");\n    return 4;\n  }\n\n  uint32_t delta_target_size = patch_header->size_of_target_headers -\n                               patch_header->delta_headers_target_offset;\n  if (patch_header->delta_headers_source_size > delta_target_size) {\n    return 5;  // ? unsure what the point of this test is, kernel checks for it\n               // though\n  }\n\n  // Patch base XEX header\n  uint32_t original_image_size = module->image_size();\n  uint32_t header_target_size = patch_header->size_of_target_headers;\n\n  if (!header_target_size) {\n    header_target_size = patch_header->delta_headers_target_offset +\n                         patch_header->delta_headers_source_size;\n  }\n\n  size_t mem_size = module->xex_header_mem_.size();\n\n  // Increase xex header buffer length if needed\n  if (header_target_size > module->xex_header_mem_.size()) {\n    module->xex_header_mem_.resize(header_target_size);\n  }\n\n  auto header_ptr = (uint8_t*)module->xex_header();\n\n  // If headers_source_offset is set, copy [source_offset:source_size] to\n  // target_offset\n  if (patch_header->delta_headers_source_offset) {\n    memcpy(header_ptr + patch_header->delta_headers_target_offset,\n           header_ptr + patch_header->delta_headers_source_offset,\n           patch_header->delta_headers_source_size);\n  }\n\n  // If new size is smaller than original, null out the difference\n  if (header_target_size < module->xex_header_mem_.size()) {\n    memset(header_ptr + header_target_size, 0,\n           module->xex_header_mem_.size() - header_target_size);\n  }\n\n  auto file_format_header = opt_file_format_info();\n  assert_not_null(file_format_header);\n\n  // Apply header patch...\n  uint32_t headerpatch_size = patch_header->info.compressed_len + 0xC;\n\n  int result_code = lzxdelta_apply_patch(\n      &patch_header->info, headerpatch_size,\n      file_format_header->compression_info.normal.window_size, header_ptr);\n  if (result_code) {\n    XELOGE(\"XEX header patch application failed, error code {}\", result_code);\n    return result_code;\n  }\n\n  // Decrease xex header buffer length if needed (but only after patching)\n  if (module->xex_header_mem_.size() > header_target_size) {\n    module->xex_header_mem_.resize(header_target_size);\n  }\n\n  // Update security info context with latest security info data\n  module->ReadSecurityInfo();\n\n  uint32_t new_image_size = module->image_size();\n\n  // Check if we need to alloc new memory for the patched xex\n  if (new_image_size > original_image_size) {\n    uint32_t size_delta = new_image_size - original_image_size;\n    uint32_t addr_new_mem = module->base_address_ + original_image_size;\n\n    bool alloc_result =\n        memory()\n            ->LookupHeap(addr_new_mem)\n            ->AllocFixed(\n                addr_new_mem, size_delta, 4096,\n                xe::kMemoryAllocationReserve | xe::kMemoryAllocationCommit,\n                xe::kMemoryProtectRead | xe::kMemoryProtectWrite);\n\n    if (!alloc_result) {\n      XELOGE(\"Unable to allocate XEX memory at {:08X}-{:08X}.\", addr_new_mem,\n             size_delta);\n      assert_always();\n      return 6;\n    }\n  }\n\n  uint8_t orig_session_key[0x10];\n  memcpy(orig_session_key, module->session_key_, 0x10);\n\n  // Header patch updated the base XEX key, need to redecrypt it\n  aes_decrypt_buffer(\n      module->is_dev_kit_ ? xe_xex2_devkit_key : xe_xex2_retail_key,\n      reinterpret_cast<const uint8_t*>(module->xex_security_info()->aes_key),\n      16, module->session_key_, 16);\n\n  // Decrypt the patch XEX's key using base XEX key\n  aes_decrypt_buffer(\n      module->session_key_,\n      reinterpret_cast<const uint8_t*>(xex_security_info()->aes_key), 16,\n      session_key_, 16);\n\n  // Test delta key against our decrypted keys\n  // (kernel doesn't seem to check this, but it's the one use for the\n  // image_key_source field I can think of...)\n  uint8_t test_delta_key[0x10];\n  aes_decrypt_buffer(module->session_key_, patch_header->image_key_source, 0x10,\n                     test_delta_key, 0x10);\n\n  if (memcmp(test_delta_key, orig_session_key, 0x10) != 0) {\n    XELOGE(\"XEX patch image key doesn't match original XEX!\");\n    return 7;\n  }\n\n  // Decrypt (if needed).\n  bool free_input = false;\n  const uint8_t* patch_buffer = xexp_data_mem_.data();\n  const size_t patch_length = xexp_data_mem_.size();\n\n  const uint8_t* input_buffer = patch_buffer;\n\n  switch (file_format_header->encryption_type) {\n    case XEX_ENCRYPTION_NONE:\n      // No-op.\n      break;\n    case XEX_ENCRYPTION_NORMAL:\n      // TODO: a way to do without a copy/alloc?\n      free_input = true;\n      input_buffer = (const uint8_t*)calloc(1, patch_length);\n      aes_decrypt_buffer(session_key_, patch_buffer, patch_length,\n                         (uint8_t*)input_buffer, patch_length);\n      break;\n    default:\n      assert_always();\n      return 8;\n  }\n\n  const xex2_compressed_block_info* cur_block =\n      &file_format_header->compression_info.normal.first_block;\n\n  const uint8_t* p = input_buffer;\n  uint8_t* base_exe = memory()->TranslateVirtual(module->base_address_);\n\n  // If image_source_offset is set, copy [source_offset:source_size] to\n  // target_offset\n  if (patch_header->delta_image_source_offset) {\n    memcpy(base_exe + patch_header->delta_image_target_offset,\n           base_exe + patch_header->delta_image_source_offset,\n           patch_header->delta_image_source_size);\n  }\n\n  // TODO: should we use new_image_size here instead?\n  uint32_t image_target_size = patch_header->delta_image_target_offset +\n                               patch_header->delta_image_source_size;\n\n  // If new size is smaller than original, null out the difference\n  if (image_target_size < original_image_size) {\n    memset(base_exe + image_target_size, 0,\n           original_image_size - image_target_size);\n  }\n\n  // Now loop through each block and apply the delta patches inside\n  while (cur_block->block_size) {\n    const auto* next_block = (const xex2_compressed_block_info*)p;\n\n    // Compare block hash, if no match we probably used wrong decrypt key\n    s.reset();\n    s.processBytes(p, cur_block->block_size);\n    s.finalize(digest);\n\n    if (memcmp(digest, cur_block->block_hash, 0x14) != 0) {\n      result_code = 9;\n      XELOGE(\"XEX patch block hash doesn't match hash inside block info!\");\n      break;\n    }\n\n    // skip block info\n    p += 20;\n    p += 4;\n\n    uint32_t block_data_size = cur_block->block_size - 20 - 4;\n\n    // Apply delta patch\n    result_code = lzxdelta_apply_patch(\n        (xex2_delta_patch*)p, block_data_size,\n        file_format_header->compression_info.normal.window_size, base_exe);\n    if (result_code) {\n      break;\n    }\n\n    p += block_data_size;\n    cur_block = next_block;\n  }\n\n  if (!result_code) {\n    // Decommit unused pages if new image size is smaller than original\n    if (original_image_size > new_image_size) {\n      uint32_t size_delta = original_image_size - new_image_size;\n      uint32_t addr_free_mem = module->base_address_ + new_image_size;\n\n      bool free_result = memory()\n                             ->LookupHeap(addr_free_mem)\n                             ->Decommit(addr_free_mem, size_delta);\n\n      if (!free_result) {\n        XELOGE(\"Unable to decommit XEX memory at {:08X}-{:08X}.\", addr_free_mem,\n               size_delta);\n        assert_always();\n      }\n    }\n\n    xex2_version source_ver, target_ver;\n    source_ver = patch_header->source_version();\n    target_ver = patch_header->target_version();\n    XELOGI(\n        \"XEX patch applied successfully: base version: {}.{}.{}.{}, new \"\n        \"version: {}.{}.{}.{}\",\n        source_ver.major, source_ver.minor, source_ver.build, source_ver.qfe,\n        target_ver.major, target_ver.minor, target_ver.build, target_ver.qfe);\n  } else {\n    XELOGE(\"XEX patch application failed, error code {}\", result_code);\n  }\n\n  if (free_input) {\n    free((void*)input_buffer);\n  }\n  return result_code;\n}\n\nint XexModule::ReadImage(const void* xex_addr, size_t xex_length,\n                         bool use_dev_key) {\n  if (!opt_file_format_info()) {\n    return 1;\n  }\n\n  is_dev_kit_ = use_dev_key;\n\n  if (is_patch()) {\n    // Make a copy of patch data for other XEX's to use with ApplyPatch()\n    const uint32_t data_len =\n        static_cast<uint32_t>(xex_length - xex_header()->header_size);\n    xexp_data_mem_.resize(data_len);\n    std::memcpy(xexp_data_mem_.data(),\n                (uint8_t*)xex_addr + xex_header()->header_size, data_len);\n    return 0;\n  }\n\n  memory()->LookupHeap(base_address_)->Reset();\n\n  aes_decrypt_buffer(\n      use_dev_key ? xe_xex2_devkit_key : xe_xex2_retail_key,\n      reinterpret_cast<const uint8_t*>(xex_security_info()->aes_key), 16,\n      session_key_, 16);\n\n  int result_code = 0;\n  switch (opt_file_format_info()->compression_type) {\n    case XEX_COMPRESSION_NONE:\n      result_code = ReadImageUncompressed(xex_addr, xex_length);\n      break;\n    case XEX_COMPRESSION_BASIC:\n      result_code = ReadImageBasicCompressed(xex_addr, xex_length);\n      break;\n    case XEX_COMPRESSION_NORMAL:\n      result_code = ReadImageCompressed(xex_addr, xex_length);\n      break;\n    default:\n      assert_always();\n      return 2;\n  }\n\n  if (result_code) {\n    return result_code;\n  }\n\n  if (is_patch() || is_valid_executable()) {\n    return 0;\n  }\n\n  // Not a patch and image doesn't have proper PE header, return 3\n  return 3;\n}\n\nint XexModule::ReadImageUncompressed(const void* xex_addr, size_t xex_length) {\n  // Allocate in-place the XEX memory.\n  const uint32_t exe_length =\n      static_cast<uint32_t>(xex_length - xex_header()->header_size);\n\n  uint32_t uncompressed_size = exe_length;\n  bool alloc_result =\n      memory()\n          ->LookupHeap(base_address_)\n          ->AllocFixed(\n              base_address_, uncompressed_size, 4096,\n              xe::kMemoryAllocationReserve | xe::kMemoryAllocationCommit,\n              xe::kMemoryProtectRead | xe::kMemoryProtectWrite);\n  if (!alloc_result) {\n    XELOGE(\"Unable to allocate XEX memory at {:08X}-{:08X}.\", base_address_,\n           uncompressed_size);\n    return 2;\n  }\n  uint8_t* buffer = memory()->TranslateVirtual(base_address_);\n  std::memset(buffer, 0, uncompressed_size);\n\n  const uint8_t* p = (const uint8_t*)xex_addr + xex_header()->header_size;\n\n  switch (opt_file_format_info()->encryption_type) {\n    case XEX_ENCRYPTION_NONE:\n      if (exe_length > uncompressed_size) {\n        return 1;\n      }\n      memcpy(buffer, p, exe_length);\n      return 0;\n    case XEX_ENCRYPTION_NORMAL:\n      aes_decrypt_buffer(session_key_, p, exe_length, buffer,\n                         uncompressed_size);\n      return 0;\n    default:\n      assert_always();\n      return 1;\n  }\n\n  return 0;\n}\n\nint XexModule::ReadImageBasicCompressed(const void* xex_addr,\n                                        size_t xex_length) {\n  const uint32_t exe_length =\n      static_cast<uint32_t>(xex_length - xex_header()->header_size);\n  const uint8_t* source_buffer =\n      (const uint8_t*)xex_addr + xex_header()->header_size;\n  const uint8_t* p = source_buffer;\n\n  auto heap = memory()->LookupHeap(base_address_);\n\n  // Calculate uncompressed length.\n  uint32_t uncompressed_size = 0;\n\n  auto* file_info = opt_file_format_info();\n  auto& comp_info = file_info->compression_info.basic;\n\n  uint32_t block_count = (file_info->info_size - 8) / 8;\n  for (uint32_t n = 0; n < block_count; n++) {\n    const uint32_t data_size = comp_info.blocks[n].data_size;\n    const uint32_t zero_size = comp_info.blocks[n].zero_size;\n    uncompressed_size += data_size + zero_size;\n  }\n\n  // Calculate the total size of the XEX image from its headers.\n  uint32_t total_size = 0;\n  for (uint32_t i = 0; i < xex_security_info()->page_descriptor_count; i++) {\n    // Byteswap the bitfield manually.\n    xex2_page_descriptor desc;\n    desc.value = xe::byte_swap(xex_security_info()->page_descriptors[i].value);\n\n    total_size += desc.page_count * heap->page_size();\n  }\n\n  // Allocate in-place the XEX memory.\n  bool alloc_result = heap->AllocFixed(\n      base_address_, total_size, 4096,\n      xe::kMemoryAllocationReserve | xe::kMemoryAllocationCommit,\n      xe::kMemoryProtectRead | xe::kMemoryProtectWrite);\n  if (!alloc_result) {\n    XELOGE(\"Unable to allocate XEX memory at {:08X}-{:08X}.\", base_address_,\n           uncompressed_size);\n    return 1;\n  }\n\n  uint8_t* buffer = memory()->TranslateVirtual(base_address_);\n  std::memset(buffer, 0, total_size);  // Quickly zero the contents.\n  uint8_t* d = buffer;\n\n  uint32_t rk[4 * (MAXNR + 1)];\n  uint8_t ivec[16] = {0};\n  int32_t Nr = rijndaelKeySetupDec(rk, session_key_, 128);\n\n  for (size_t n = 0; n < block_count; n++) {\n    const uint32_t data_size = comp_info.blocks[n].data_size;\n    const uint32_t zero_size = comp_info.blocks[n].zero_size;\n\n    switch (opt_file_format_info()->encryption_type) {\n      case XEX_ENCRYPTION_NONE:\n        if (data_size > uncompressed_size - (d - buffer)) {\n          // Overflow.\n          return 1;\n        }\n        memcpy(d, p, data_size);\n        break;\n      case XEX_ENCRYPTION_NORMAL: {\n        const uint8_t* ct = p;\n        uint8_t* pt = d;\n        for (size_t m = 0; m < data_size; m += 16, ct += 16, pt += 16) {\n          // Decrypt 16 uint8_ts from input -> output.\n          rijndaelDecrypt(rk, Nr, ct, pt);\n          for (size_t i = 0; i < 16; i++) {\n            // XOR with previous.\n            pt[i] ^= ivec[i];\n            // Set previous.\n            ivec[i] = ct[i];\n          }\n        }\n      } break;\n      default:\n        assert_always();\n        return 1;\n    }\n\n    p += data_size;\n    d += data_size + zero_size;\n  }\n\n  return 0;\n}\n\nint XexModule::ReadImageCompressed(const void* xex_addr, size_t xex_length) {\n  const uint32_t exe_length =\n      static_cast<uint32_t>(xex_length - xex_header()->header_size);\n  const uint8_t* exe_buffer =\n      (const uint8_t*)xex_addr + xex_header()->header_size;\n\n  // src -> dest:\n  // - decrypt (if encrypted)\n  // - de-block:\n  //    4b total size of next block in uint8_ts\n  //   20b hash of entire next block (including size/hash)\n  //    Nb block uint8_ts\n  // - decompress block contents\n\n  uint8_t* compress_buffer = NULL;\n  const uint8_t* p = NULL;\n  uint8_t* d = NULL;\n  sha1::SHA1 s;\n\n  // Decrypt (if needed).\n  bool free_input = false;\n  const uint8_t* input_buffer = exe_buffer;\n  size_t input_size = exe_length;\n\n  switch (opt_file_format_info()->encryption_type) {\n    case XEX_ENCRYPTION_NONE:\n      // No-op.\n      break;\n    case XEX_ENCRYPTION_NORMAL:\n      // TODO: a way to do without a copy/alloc?\n      free_input = true;\n      input_buffer = (const uint8_t*)calloc(1, exe_length);\n      aes_decrypt_buffer(session_key_, exe_buffer, exe_length,\n                         (uint8_t*)input_buffer, exe_length);\n      break;\n    default:\n      assert_always();\n      return 1;\n  }\n\n  const auto* compression_info = &opt_file_format_info()->compression_info;\n  const xex2_compressed_block_info* cur_block =\n      &compression_info->normal.first_block;\n\n  compress_buffer = (uint8_t*)calloc(1, exe_length);\n\n  p = input_buffer;\n  d = compress_buffer;\n\n  // De-block.\n  int result_code = 0;\n\n  uint8_t block_calced_digest[0x14];\n  while (cur_block->block_size) {\n    const uint8_t* pnext = p + cur_block->block_size;\n    const auto* next_block = (const xex2_compressed_block_info*)p;\n\n    // Compare block hash, if no match we probably used wrong decrypt key\n    s.reset();\n    s.processBytes(p, cur_block->block_size);\n    s.finalize(block_calced_digest);\n    if (memcmp(block_calced_digest, cur_block->block_hash, 0x14) != 0) {\n      result_code = 2;\n      break;\n    }\n\n    // skip block info\n    p += 4;\n    p += 20;\n\n    while (true) {\n      const size_t chunk_size = (p[0] << 8) | p[1];\n      p += 2;\n      if (!chunk_size) {\n        break;\n      }\n\n      memcpy(d, p, chunk_size);\n      p += chunk_size;\n      d += chunk_size;\n    }\n\n    p = pnext;\n    cur_block = next_block;\n  }\n\n  if (!result_code) {\n    uint32_t uncompressed_size = image_size();\n\n    // Allocate in-place the XEX memory.\n    bool alloc_result =\n        memory()\n            ->LookupHeap(base_address_)\n            ->AllocFixed(\n                base_address_, uncompressed_size, 4096,\n                xe::kMemoryAllocationReserve | xe::kMemoryAllocationCommit,\n                xe::kMemoryProtectRead | xe::kMemoryProtectWrite);\n\n    if (alloc_result) {\n      uint8_t* buffer = memory()->TranslateVirtual(base_address_);\n      std::memset(buffer, 0, uncompressed_size);\n\n      // Decompress into XEX base\n      result_code = lzx_decompress(\n          compress_buffer, d - compress_buffer, buffer, uncompressed_size,\n          compression_info->normal.window_size, nullptr, 0);\n    } else {\n      XELOGE(\"Unable to allocate XEX memory at {:08X}-{:08X}.\", base_address_,\n             uncompressed_size);\n      result_code = 3;\n    }\n  }\n\n  if (compress_buffer) {\n    free((void*)compress_buffer);\n  }\n  if (free_input) {\n    free((void*)input_buffer);\n  }\n  return result_code;\n}\n\nint XexModule::ReadPEHeaders() {\n  const uint8_t* p = memory()->TranslateVirtual(base_address_);\n\n  // Verify DOS signature (MZ).\n  auto doshdr = reinterpret_cast<const IMAGE_DOS_HEADER*>(p);\n  if (doshdr->e_magic != IMAGE_DOS_SIGNATURE) {\n    XELOGE(\"PE signature mismatch; likely bad decryption/decompression\");\n    return 1;\n  }\n\n  // Move to the NT header offset from the DOS header.\n  p += doshdr->e_lfanew;\n\n  // Verify NT signature (PE\\0\\0).\n  auto nthdr = reinterpret_cast<const IMAGE_NT_HEADERS32*>(p);\n  if (nthdr->Signature != IMAGE_NT_SIGNATURE) {\n    return 1;\n  }\n\n  // Verify matches an Xbox PE.\n  const IMAGE_FILE_HEADER* filehdr = &nthdr->FileHeader;\n  if ((filehdr->Machine != IMAGE_FILE_MACHINE_POWERPCBE) ||\n      !(filehdr->Characteristics & IMAGE_FILE_32BIT_MACHINE)) {\n    return 1;\n  }\n  // Verify the expected size.\n  if (filehdr->SizeOfOptionalHeader != IMAGE_SIZEOF_NT_OPTIONAL_HEADER) {\n    return 1;\n  }\n\n  // Verify optional header is 32bit.\n  const IMAGE_OPTIONAL_HEADER32* opthdr = &nthdr->OptionalHeader;\n  if (opthdr->Magic != IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\n    return 1;\n  }\n  // Verify subsystem.\n  if (opthdr->Subsystem != IMAGE_SUBSYSTEM_XBOX) {\n    return 1;\n  }\n\n// Linker version - likely 8+\n// Could be useful for recognizing certain patterns\n// opthdr->MajorLinkerVersion; opthdr->MinorLinkerVersion;\n\n// Data directories of interest:\n// EXPORT           IMAGE_EXPORT_DIRECTORY\n// IMPORT           IMAGE_IMPORT_DESCRIPTOR[]\n// EXCEPTION        IMAGE_CE_RUNTIME_FUNCTION_ENTRY[]\n// BASERELOC\n// DEBUG            IMAGE_DEBUG_DIRECTORY[]\n// ARCHITECTURE     /IMAGE_ARCHITECTURE_HEADER/ ----- import thunks!\n// TLS              IMAGE_TLS_DIRECTORY\n// IAT              Import Address Table ptr\n// opthdr->DataDirectory[IMAGE_DIRECTORY_ENTRY_X].VirtualAddress / .Size\n\n// The macros in pe_image.h don't work with clang, for some reason.\n// offsetof seems to be unable to find OptionalHeader.\n#define offsetof1(type, member) ((std::size_t) & (((type*)0)->member))\n#define IMAGE_FIRST_SECTION1(ntheader)                                   \\\n  ((PIMAGE_SECTION_HEADER)((uint8_t*)ntheader +                          \\\n                           offsetof1(IMAGE_NT_HEADERS, OptionalHeader) + \\\n                           ((PIMAGE_NT_HEADERS)(ntheader))               \\\n                               ->FileHeader.SizeOfOptionalHeader))\n\n  // Quick scan to determine bounds of sections.\n  size_t upper_address = 0;\n  const IMAGE_SECTION_HEADER* sechdr = IMAGE_FIRST_SECTION1(nthdr);\n  for (size_t n = 0; n < filehdr->NumberOfSections; n++, sechdr++) {\n    const size_t physical_address = opthdr->ImageBase + sechdr->VirtualAddress;\n    upper_address =\n        std::max(upper_address, physical_address + sechdr->Misc.VirtualSize);\n  }\n\n  // Setup/load sections.\n  sechdr = IMAGE_FIRST_SECTION1(nthdr);\n  for (size_t n = 0; n < filehdr->NumberOfSections; n++, sechdr++) {\n    PESection section;\n    memcpy(section.name, sechdr->Name, sizeof(sechdr->Name));\n    section.name[8] = 0;\n    section.raw_address = sechdr->PointerToRawData;\n    section.raw_size = sechdr->SizeOfRawData;\n    section.address = base_address_ + sechdr->VirtualAddress;\n    section.size = sechdr->Misc.VirtualSize;\n    section.flags = sechdr->Characteristics;\n    pe_sections_.push_back(section);\n  }\n\n  // DumpTLSDirectory(pImageBase, pNTHeader, (PIMAGE_TLS_DIRECTORY32)0);\n  // DumpExportsSection(pImageBase, pNTHeader);\n  return 0;\n}\n\nvoid XexModule::ReadSecurityInfo() {\n  if (xex_format_ == kFormatXex1) {\n    const xex1_security_info* xex1_sec_info =\n        reinterpret_cast<const xex1_security_info*>(\n            GetSecurityInfo(xex_header()));\n\n    security_info_.rsa_signature = xex1_sec_info->rsa_signature;\n    security_info_.aes_key = xex1_sec_info->aes_key;\n    security_info_.image_size = xex1_sec_info->image_size;\n    security_info_.image_flags = xex1_sec_info->image_flags;\n    security_info_.export_table = xex1_sec_info->export_table;\n    security_info_.load_address = xex1_sec_info->load_address;\n    security_info_.page_descriptor_count = xex1_sec_info->page_descriptor_count;\n    security_info_.page_descriptors = xex1_sec_info->page_descriptors;\n  } else if (xex_format_ == kFormatXex2) {\n    const xex2_security_info* xex2_sec_info =\n        reinterpret_cast<const xex2_security_info*>(\n            GetSecurityInfo(xex_header()));\n\n    security_info_.rsa_signature = xex2_sec_info->rsa_signature;\n    security_info_.aes_key = xex2_sec_info->aes_key;\n    security_info_.image_size = xex2_sec_info->image_size;\n    security_info_.image_flags = xex2_sec_info->image_flags;\n    security_info_.export_table = xex2_sec_info->export_table;\n    security_info_.load_address = xex2_sec_info->load_address;\n    security_info_.page_descriptor_count = xex2_sec_info->page_descriptor_count;\n    security_info_.page_descriptors = xex2_sec_info->page_descriptors;\n  }\n}\n\nbool XexModule::Load(const std::string_view name, const std::string_view path,\n                     const void* xex_addr, size_t xex_length) {\n  auto src_header = reinterpret_cast<const xex2_header*>(xex_addr);\n\n  if (src_header->magic == kXEX1Signature) {\n    xex_format_ = kFormatXex1;\n  } else if (src_header->magic == kXEX2Signature) {\n    xex_format_ = kFormatXex2;\n  } else {\n    return false;\n  }\n\n  assert_false(loaded_);\n  loaded_ = true;\n\n  // Read in XEX headers\n  xex_header_mem_.resize(src_header->header_size);\n  std::memcpy(xex_header_mem_.data(), src_header, src_header->header_size);\n\n  // Read/convert XEX1/XEX2 security info to a common format\n  ReadSecurityInfo();\n\n  auto sec_header = xex_security_info();\n\n  // Try setting our base_address based on XEX_HEADER_IMAGE_BASE_ADDRESS, fall\n  // back to xex_security_info otherwise\n  base_address_ = xex_security_info()->load_address;\n  xe::be<uint32_t>* base_addr_opt = nullptr;\n  if (GetOptHeader(XEX_HEADER_IMAGE_BASE_ADDRESS, &base_addr_opt))\n    base_address_ = *base_addr_opt;\n\n  // Setup debug info.\n  name_ = name;\n  path_ = path;\n\n  uint8_t* data = memory()->TranslateVirtual(base_address_);\n\n  // Load in the XEX basefile\n  // We'll try using both XEX2 keys to see if any give a valid PE\n  int result_code = ReadImage(xex_addr, xex_length, false);\n  if (result_code) {\n    XELOGW(\"XEX load failed with code {}, trying with devkit encryption key...\",\n           result_code);\n\n    result_code = ReadImage(xex_addr, xex_length, true);\n    if (result_code) {\n      XELOGE(\"XEX load failed with code {}, tried both encryption keys\",\n             result_code);\n      return false;\n    }\n  }\n\n  // Note: caller will have to call LoadContinue once it's determined whether a\n  // patch file exists or not!\n  return true;\n}\n\nbool XexModule::LoadContinue() {\n  // Second part of image load\n  // Split from Load() so that we can patch the XEX before loading this data\n  assert_false(finished_load_);\n  if (finished_load_) {\n    return true;\n  }\n\n  finished_load_ = true;\n\n  if (ReadPEHeaders()) {\n    XELOGE(\"Failed to load XEX PE headers!\");\n    return false;\n  }\n\n  // Parse any \"unsafe\" headers into safer variants\n  xex2_opt_generic_u32* alternate_titleids;\n  if (GetOptHeader(xex2_header_keys::XEX_HEADER_ALTERNATE_TITLE_IDS,\n                   &alternate_titleids)) {\n    auto count = alternate_titleids->count();\n    for (uint32_t i = 0; i < count; i++) {\n      opt_alternate_title_ids_.push_back(alternate_titleids->values[i]);\n    }\n  }\n\n  // Scan and find the low/high addresses.\n  // All code sections are continuous, so this should be easy.\n  auto heap = memory()->LookupHeap(base_address_);\n  auto page_size = heap->page_size();\n\n  low_address_ = UINT_MAX;\n  high_address_ = 0;\n\n  auto sec_header = xex_security_info();\n  for (uint32_t i = 0, page = 0; i < sec_header->page_descriptor_count; i++) {\n    // Byteswap the bitfield manually.\n    xex2_page_descriptor desc;\n    desc.value = xe::byte_swap(sec_header->page_descriptors[i].value);\n\n    const auto start_address = base_address_ + (page * page_size);\n    const auto end_address = start_address + (desc.page_count * page_size);\n    if (desc.info == XEX_SECTION_CODE) {\n      low_address_ = std::min(low_address_, start_address);\n      high_address_ = std::max(high_address_, end_address);\n    }\n\n    page += desc.page_count;\n  }\n\n  // Notify backend that we have an executable range.\n  processor_->backend()->CommitExecutableRange(low_address_, high_address_);\n\n  // Add all imports (variables/functions).\n  xex2_opt_import_libraries* opt_import_libraries = nullptr;\n  GetOptHeader(XEX_HEADER_IMPORT_LIBRARIES, &opt_import_libraries);\n\n  if (opt_import_libraries) {\n    // FIXME: Don't know if 32 is the actual limit, but haven't seen more than\n    // 2.\n    const char* string_table[32];\n    std::memset(string_table, 0, sizeof(string_table));\n\n    // Parse the string table\n    for (size_t i = 0, o = 0; i < opt_import_libraries->string_table.size &&\n                              o < opt_import_libraries->string_table.count;\n         ++o) {\n      assert_true(o < xe::countof(string_table));\n      const char* str = &opt_import_libraries->string_table.data[i];\n\n      string_table[o] = str;\n      i += std::strlen(str) + 1;\n\n      // Padding\n      if ((i % 4) != 0) {\n        i += 4 - (i % 4);\n      }\n    }\n\n    auto library_data = reinterpret_cast<uint8_t*>(opt_import_libraries);\n    uint32_t library_offset = opt_import_libraries->string_table.size + 12;\n    while (library_offset < opt_import_libraries->size) {\n      auto library =\n          reinterpret_cast<xex2_import_library*>(library_data + library_offset);\n      if (!library->size) {\n        break;\n      }\n      size_t library_name_index = library->name_index & 0xFF;\n      assert_true(library_name_index <\n                  opt_import_libraries->string_table.count);\n      assert_not_null(string_table[library_name_index]);\n      auto library_name = std::string(string_table[library_name_index]);\n      SetupLibraryImports(library_name, library);\n      library_offset += library->size;\n    }\n  }\n\n  // Find __savegprlr_* and __restgprlr_* and the others.\n  // We can flag these for special handling (inlining/etc).\n  if (!FindSaveRest()) {\n    return false;\n  }\n\n  // Load a specified module map and diff.\n  if (cvars::load_module_map.size()) {\n    if (!ReadMap(cvars::load_module_map.c_str())) {\n      return false;\n    }\n  }\n\n  // Setup memory protection.\n  for (uint32_t i = 0, page = 0; i < sec_header->page_descriptor_count; i++) {\n    // Byteswap the bitfield manually.\n    xex2_page_descriptor desc;\n    desc.value = xe::byte_swap(sec_header->page_descriptors[i].value);\n\n    auto address = base_address_ + (page * page_size);\n    auto size = desc.page_count * page_size;\n    switch (desc.info) {\n      case XEX_SECTION_CODE:\n      case XEX_SECTION_READONLY_DATA:\n        heap->Protect(address, size, kMemoryProtectRead);\n        break;\n      case XEX_SECTION_DATA:\n        heap->Protect(address, size, kMemoryProtectRead | kMemoryProtectWrite);\n        break;\n    }\n\n    page += desc.page_count;\n  }\n\n  return true;\n}\n\nbool XexModule::Unload() {\n  if (!loaded_) {\n    return true;\n  }\n  loaded_ = false;\n\n  // If this isn't a patch, just deallocate the memory occupied by the exe\n  if (!is_patch()) {\n    assert_not_zero(base_address_);\n\n    memory()->LookupHeap(base_address_)->Release(base_address_);\n  }\n\n  xex_header_mem_.resize(0);\n\n  return true;\n}\n\nbool XexModule::SetupLibraryImports(const std::string_view name,\n                                    const xex2_import_library* library) {\n  ExportResolver* kernel_resolver = nullptr;\n  if (kernel_state_->IsKernelModule(name)) {\n    kernel_resolver = processor_->export_resolver();\n  }\n\n  auto user_module = kernel_state_->GetModule(name);\n\n  auto base_name = utf8::find_base_name_from_guest_path(name);\n\n  ImportLibrary library_info;\n  library_info.name = base_name;\n  library_info.id = library->id;\n  library_info.version.value = library->version().value;\n  library_info.min_version.value = library->version_min().value;\n\n  // Imports are stored as {import descriptor, thunk addr, import desc, ...}\n  // Even thunks have an import descriptor (albeit unused/useless)\n  for (uint32_t i = 0; i < library->count; i++) {\n    uint32_t record_addr = library->import_table[i];\n    assert_not_zero(record_addr);\n\n    auto record_slot =\n        memory()->TranslateVirtual<xe::be<uint32_t>*>(record_addr);\n    uint32_t record_value = *record_slot;\n\n    uint16_t record_type = (record_value & 0xFF000000) >> 24;\n    uint16_t ordinal = record_value & 0xFFFF;\n\n    Export* kernel_export = nullptr;\n    uint32_t user_export_addr = 0;\n\n    if (kernel_resolver) {\n      kernel_export = kernel_resolver->GetExportByOrdinal(name, ordinal);\n    } else if (user_module) {\n      user_export_addr = user_module->GetProcAddressByOrdinal(ordinal);\n    }\n\n    // Import not resolved?\n    if (!kernel_export && !user_export_addr) {\n      XELOGW(\n          \"WARNING: an import variable was not resolved! (library: {}, import \"\n          \"lib: {}, ordinal: {:03X})\",\n          name_, name, ordinal);\n    }\n\n    StringBuffer import_name;\n    if (record_type == 0) {\n      // Variable.\n\n      ImportLibraryFn import_info;\n      import_info.ordinal = ordinal;\n      import_info.value_address = record_addr;\n      library_info.imports.push_back(import_info);\n\n      import_name.Append(\"__imp__\");\n      if (kernel_export) {\n        import_name.Append(kernel_export->name);\n      } else {\n        import_name.AppendFormat(\"{}_{:03X}\", base_name, ordinal);\n      }\n\n      if (kernel_export) {\n        if (kernel_export->type == Export::Type::kFunction) {\n          // Not exactly sure what this should be...\n          // Appears to be ignored.\n          *record_slot = 0xDEADC0DE;\n        } else if (kernel_export->type == Export::Type::kVariable) {\n          // Kernel import variable\n          if (kernel_export->is_implemented()) {\n            // Implemented - replace with pointer.\n            *record_slot = kernel_export->variable_ptr;\n          } else {\n            // Not implemented - write with a dummy value.\n            *record_slot = 0xD000BEEF | (kernel_export->ordinal & 0xFFF) << 16;\n            XELOGCPU(\"WARNING: imported a variable with no value: {}\",\n                     kernel_export->name);\n          }\n        }\n      } else if (user_export_addr) {\n        *record_slot = user_export_addr;\n      } else {\n        *record_slot = 0xF00DF00D;\n      }\n\n      // Setup a variable and define it.\n      Symbol* var_info;\n      DeclareVariable(record_addr, &var_info);\n      var_info->set_name(import_name.to_string_view());\n      var_info->set_status(Symbol::Status::kDeclared);\n      DefineVariable(var_info);\n      var_info->set_status(Symbol::Status::kDefined);\n    } else if (record_type == 1) {\n      // Thunk.\n      if (library_info.imports.size() > 0) {\n        auto& prev_import =\n            library_info.imports[library_info.imports.size() - 1];\n        assert_true(prev_import.ordinal == ordinal);\n        prev_import.thunk_address = record_addr;\n      }\n\n      if (kernel_export) {\n        import_name.Append(kernel_export->name);\n      } else {\n        import_name.AppendFormat(\"__{}_{:03X}\", base_name, ordinal);\n      }\n\n      Function* function;\n      DeclareFunction(record_addr, &function);\n      function->set_end_address(record_addr + 16 - 4);\n      function->set_name(import_name.to_string_view());\n\n      if (user_export_addr) {\n        // Rewrite PPC code to set r11 to the target address\n        // So we'll have:\n        //    lis r11, user_export_addr\n        //    ori r11, r11, user_export_addr\n        //    mtspr CTR, r11\n        //    bctr\n        uint16_t hi_addr = (user_export_addr >> 16) & 0xFFFF;\n        uint16_t low_addr = user_export_addr & 0xFFFF;\n\n        uint8_t* p = memory()->TranslateVirtual(record_addr);\n        xe::store_and_swap<uint32_t>(p + 0x0, 0x3D600000 | hi_addr);\n        xe::store_and_swap<uint32_t>(p + 0x4, 0x616B0000 | low_addr);\n      } else {\n        // On load we have something like this in memory:\n        //     li r3, 0\n        //     li r4, 0x1F5\n        //     mtspr CTR, r11\n        //     bctr\n        // Real consoles rewrite this with some code that sets r11.\n        // If we did that we'd still have to put a thunk somewhere and do the\n        // dynamic lookup. Instead, we rewrite it to use syscalls.\n        // We use sc with a LEV operand of 2, which is reserved usage and\n        // should never see actual usage outside of our rewrite.\n        // CPU backends can either take the special form syscall or do\n        // something smarter.\n        //     sc 2\n        //     blr\n        //     nop\n        //     nop\n        uint8_t* p = memory()->TranslateVirtual(record_addr);\n        xe::store_and_swap<uint32_t>(p + 0x0, 0x44000042);\n        xe::store_and_swap<uint32_t>(p + 0x4, 0x4E800020);\n        xe::store_and_swap<uint32_t>(p + 0x8, 0x60000000);\n        xe::store_and_swap<uint32_t>(p + 0xC, 0x60000000);\n\n        // Note that we may not have a handler registered - if not, eventually\n        // we'll get directed to UndefinedImport.\n        GuestFunction::ExternHandler handler = nullptr;\n        if (kernel_export) {\n          if (kernel_export->function_data.trampoline) {\n            handler = (GuestFunction::ExternHandler)\n                          kernel_export->function_data.trampoline;\n          } else {\n            handler =\n                (GuestFunction::ExternHandler)kernel_export->function_data.shim;\n          }\n        } else {\n          XELOGW(\"WARNING: Imported kernel function {} is unimplemented!\",\n                 import_name.to_string_view());\n        }\n        static_cast<GuestFunction*>(function)->SetupExtern(handler,\n                                                           kernel_export);\n      }\n      function->set_status(Symbol::Status::kDeclared);\n    } else {\n      // Bad.\n      assert_always();\n    }\n  }\n\n  import_libs_.push_back(library_info);\n\n  return true;\n}\n\nbool XexModule::ContainsAddress(uint32_t address) {\n  return address >= low_address_ && address < high_address_;\n}\n\nstd::unique_ptr<Function> XexModule::CreateFunction(uint32_t address) {\n  return std::unique_ptr<Function>(\n      processor_->backend()->CreateGuestFunction(this, address));\n}\n\nbool XexModule::FindSaveRest() {\n  // Special stack save/restore functions.\n  // http://research.microsoft.com/en-us/um/redmond/projects/invisible/src/crt/md/ppc/xxx.s.htm\n  // It'd be nice to stash these away and mark them as such to allow for\n  // special codegen.\n  // __savegprlr_14 to __savegprlr_31\n  // __restgprlr_14 to __restgprlr_31\n  static const uint32_t gprlr_code_values[] = {\n      0x68FFC1F9,  // __savegprlr_14\n      0x70FFE1F9,  // __savegprlr_15\n      0x78FF01FA,  // __savegprlr_16\n      0x80FF21FA,  // __savegprlr_17\n      0x88FF41FA,  // __savegprlr_18\n      0x90FF61FA,  // __savegprlr_19\n      0x98FF81FA,  // __savegprlr_20\n      0xA0FFA1FA,  // __savegprlr_21\n      0xA8FFC1FA,  // __savegprlr_22\n      0xB0FFE1FA,  // __savegprlr_23\n      0xB8FF01FB,  // __savegprlr_24\n      0xC0FF21FB,  // __savegprlr_25\n      0xC8FF41FB,  // __savegprlr_26\n      0xD0FF61FB,  // __savegprlr_27\n      0xD8FF81FB,  // __savegprlr_28\n      0xE0FFA1FB,  // __savegprlr_29\n      0xE8FFC1FB,  // __savegprlr_30\n      0xF0FFE1FB,  // __savegprlr_31\n      0xF8FF8191, 0x2000804E,\n      0x68FFC1E9,  // __restgprlr_14\n      0x70FFE1E9,  // __restgprlr_15\n      0x78FF01EA,  // __restgprlr_16\n      0x80FF21EA,  // __restgprlr_17\n      0x88FF41EA,  // __restgprlr_18\n      0x90FF61EA,  // __restgprlr_19\n      0x98FF81EA,  // __restgprlr_20\n      0xA0FFA1EA,  // __restgprlr_21\n      0xA8FFC1EA,  // __restgprlr_22\n      0xB0FFE1EA,  // __restgprlr_23\n      0xB8FF01EB,  // __restgprlr_24\n      0xC0FF21EB,  // __restgprlr_25\n      0xC8FF41EB,  // __restgprlr_26\n      0xD0FF61EB,  // __restgprlr_27\n      0xD8FF81EB,  // __restgprlr_28\n      0xE0FFA1EB,  // __restgprlr_29\n      0xE8FFC1EB,  // __restgprlr_30\n      0xF0FFE1EB,  // __restgprlr_31\n      0xF8FF8181, 0xA603887D, 0x2000804E,\n  };\n  // __savefpr_14 to __savefpr_31\n  // __restfpr_14 to __restfpr_31\n  static const uint32_t fpr_code_values[] = {\n      0x70FFCCD9,  // __savefpr_14\n      0x78FFECD9,  // __savefpr_15\n      0x80FF0CDA,  // __savefpr_16\n      0x88FF2CDA,  // __savefpr_17\n      0x90FF4CDA,  // __savefpr_18\n      0x98FF6CDA,  // __savefpr_19\n      0xA0FF8CDA,  // __savefpr_20\n      0xA8FFACDA,  // __savefpr_21\n      0xB0FFCCDA,  // __savefpr_22\n      0xB8FFECDA,  // __savefpr_23\n      0xC0FF0CDB,  // __savefpr_24\n      0xC8FF2CDB,  // __savefpr_25\n      0xD0FF4CDB,  // __savefpr_26\n      0xD8FF6CDB,  // __savefpr_27\n      0xE0FF8CDB,  // __savefpr_28\n      0xE8FFACDB,  // __savefpr_29\n      0xF0FFCCDB,  // __savefpr_30\n      0xF8FFECDB,  // __savefpr_31\n      0x2000804E,\n      0x70FFCCC9,  // __restfpr_14\n      0x78FFECC9,  // __restfpr_15\n      0x80FF0CCA,  // __restfpr_16\n      0x88FF2CCA,  // __restfpr_17\n      0x90FF4CCA,  // __restfpr_18\n      0x98FF6CCA,  // __restfpr_19\n      0xA0FF8CCA,  // __restfpr_20\n      0xA8FFACCA,  // __restfpr_21\n      0xB0FFCCCA,  // __restfpr_22\n      0xB8FFECCA,  // __restfpr_23\n      0xC0FF0CCB,  // __restfpr_24\n      0xC8FF2CCB,  // __restfpr_25\n      0xD0FF4CCB,  // __restfpr_26\n      0xD8FF6CCB,  // __restfpr_27\n      0xE0FF8CCB,  // __restfpr_28\n      0xE8FFACCB,  // __restfpr_29\n      0xF0FFCCCB,  // __restfpr_30\n      0xF8FFECCB,  // __restfpr_31\n      0x2000804E,\n  };\n  // __savevmx_14 to __savevmx_31\n  // __savevmx_64 to __savevmx_127\n  // __restvmx_14 to __restvmx_31\n  // __restvmx_64 to __restvmx_127\n  static const uint32_t vmx_code_values[] = {\n      0xE0FE6039,  // __savevmx_14\n      0xCE61CB7D, 0xF0FE6039, 0xCE61EB7D, 0x00FF6039, 0xCE610B7E, 0x10FF6039,\n      0xCE612B7E, 0x20FF6039, 0xCE614B7E, 0x30FF6039, 0xCE616B7E, 0x40FF6039,\n      0xCE618B7E, 0x50FF6039, 0xCE61AB7E, 0x60FF6039, 0xCE61CB7E, 0x70FF6039,\n      0xCE61EB7E, 0x80FF6039, 0xCE610B7F, 0x90FF6039, 0xCE612B7F, 0xA0FF6039,\n      0xCE614B7F, 0xB0FF6039, 0xCE616B7F, 0xC0FF6039, 0xCE618B7F, 0xD0FF6039,\n      0xCE61AB7F, 0xE0FF6039, 0xCE61CB7F, 0xF0FF6039,  // __savevmx_31\n      0xCE61EB7F, 0x2000804E,\n\n      0x00FC6039,  // __savevmx_64\n      0xCB610B10, 0x10FC6039, 0xCB612B10, 0x20FC6039, 0xCB614B10, 0x30FC6039,\n      0xCB616B10, 0x40FC6039, 0xCB618B10, 0x50FC6039, 0xCB61AB10, 0x60FC6039,\n      0xCB61CB10, 0x70FC6039, 0xCB61EB10, 0x80FC6039, 0xCB610B11, 0x90FC6039,\n      0xCB612B11, 0xA0FC6039, 0xCB614B11, 0xB0FC6039, 0xCB616B11, 0xC0FC6039,\n      0xCB618B11, 0xD0FC6039, 0xCB61AB11, 0xE0FC6039, 0xCB61CB11, 0xF0FC6039,\n      0xCB61EB11, 0x00FD6039, 0xCB610B12, 0x10FD6039, 0xCB612B12, 0x20FD6039,\n      0xCB614B12, 0x30FD6039, 0xCB616B12, 0x40FD6039, 0xCB618B12, 0x50FD6039,\n      0xCB61AB12, 0x60FD6039, 0xCB61CB12, 0x70FD6039, 0xCB61EB12, 0x80FD6039,\n      0xCB610B13, 0x90FD6039, 0xCB612B13, 0xA0FD6039, 0xCB614B13, 0xB0FD6039,\n      0xCB616B13, 0xC0FD6039, 0xCB618B13, 0xD0FD6039, 0xCB61AB13, 0xE0FD6039,\n      0xCB61CB13, 0xF0FD6039, 0xCB61EB13, 0x00FE6039, 0xCF610B10, 0x10FE6039,\n      0xCF612B10, 0x20FE6039, 0xCF614B10, 0x30FE6039, 0xCF616B10, 0x40FE6039,\n      0xCF618B10, 0x50FE6039, 0xCF61AB10, 0x60FE6039, 0xCF61CB10, 0x70FE6039,\n      0xCF61EB10, 0x80FE6039, 0xCF610B11, 0x90FE6039, 0xCF612B11, 0xA0FE6039,\n      0xCF614B11, 0xB0FE6039, 0xCF616B11, 0xC0FE6039, 0xCF618B11, 0xD0FE6039,\n      0xCF61AB11, 0xE0FE6039, 0xCF61CB11, 0xF0FE6039, 0xCF61EB11, 0x00FF6039,\n      0xCF610B12, 0x10FF6039, 0xCF612B12, 0x20FF6039, 0xCF614B12, 0x30FF6039,\n      0xCF616B12, 0x40FF6039, 0xCF618B12, 0x50FF6039, 0xCF61AB12, 0x60FF6039,\n      0xCF61CB12, 0x70FF6039, 0xCF61EB12, 0x80FF6039, 0xCF610B13, 0x90FF6039,\n      0xCF612B13, 0xA0FF6039, 0xCF614B13, 0xB0FF6039, 0xCF616B13, 0xC0FF6039,\n      0xCF618B13, 0xD0FF6039, 0xCF61AB13, 0xE0FF6039, 0xCF61CB13,\n      0xF0FF6039,  // __savevmx_127\n      0xCF61EB13, 0x2000804E,\n\n      0xE0FE6039,  // __restvmx_14\n      0xCE60CB7D, 0xF0FE6039, 0xCE60EB7D, 0x00FF6039, 0xCE600B7E, 0x10FF6039,\n      0xCE602B7E, 0x20FF6039, 0xCE604B7E, 0x30FF6039, 0xCE606B7E, 0x40FF6039,\n      0xCE608B7E, 0x50FF6039, 0xCE60AB7E, 0x60FF6039, 0xCE60CB7E, 0x70FF6039,\n      0xCE60EB7E, 0x80FF6039, 0xCE600B7F, 0x90FF6039, 0xCE602B7F, 0xA0FF6039,\n      0xCE604B7F, 0xB0FF6039, 0xCE606B7F, 0xC0FF6039, 0xCE608B7F, 0xD0FF6039,\n      0xCE60AB7F, 0xE0FF6039, 0xCE60CB7F, 0xF0FF6039,  // __restvmx_31\n      0xCE60EB7F, 0x2000804E,\n\n      0x00FC6039,  // __restvmx_64\n      0xCB600B10, 0x10FC6039, 0xCB602B10, 0x20FC6039, 0xCB604B10, 0x30FC6039,\n      0xCB606B10, 0x40FC6039, 0xCB608B10, 0x50FC6039, 0xCB60AB10, 0x60FC6039,\n      0xCB60CB10, 0x70FC6039, 0xCB60EB10, 0x80FC6039, 0xCB600B11, 0x90FC6039,\n      0xCB602B11, 0xA0FC6039, 0xCB604B11, 0xB0FC6039, 0xCB606B11, 0xC0FC6039,\n      0xCB608B11, 0xD0FC6039, 0xCB60AB11, 0xE0FC6039, 0xCB60CB11, 0xF0FC6039,\n      0xCB60EB11, 0x00FD6039, 0xCB600B12, 0x10FD6039, 0xCB602B12, 0x20FD6039,\n      0xCB604B12, 0x30FD6039, 0xCB606B12, 0x40FD6039, 0xCB608B12, 0x50FD6039,\n      0xCB60AB12, 0x60FD6039, 0xCB60CB12, 0x70FD6039, 0xCB60EB12, 0x80FD6039,\n      0xCB600B13, 0x90FD6039, 0xCB602B13, 0xA0FD6039, 0xCB604B13, 0xB0FD6039,\n      0xCB606B13, 0xC0FD6039, 0xCB608B13, 0xD0FD6039, 0xCB60AB13, 0xE0FD6039,\n      0xCB60CB13, 0xF0FD6039, 0xCB60EB13, 0x00FE6039, 0xCF600B10, 0x10FE6039,\n      0xCF602B10, 0x20FE6039, 0xCF604B10, 0x30FE6039, 0xCF606B10, 0x40FE6039,\n      0xCF608B10, 0x50FE6039, 0xCF60AB10, 0x60FE6039, 0xCF60CB10, 0x70FE6039,\n      0xCF60EB10, 0x80FE6039, 0xCF600B11, 0x90FE6039, 0xCF602B11, 0xA0FE6039,\n      0xCF604B11, 0xB0FE6039, 0xCF606B11, 0xC0FE6039, 0xCF608B11, 0xD0FE6039,\n      0xCF60AB11, 0xE0FE6039, 0xCF60CB11, 0xF0FE6039, 0xCF60EB11, 0x00FF6039,\n      0xCF600B12, 0x10FF6039, 0xCF602B12, 0x20FF6039, 0xCF604B12, 0x30FF6039,\n      0xCF606B12, 0x40FF6039, 0xCF608B12, 0x50FF6039, 0xCF60AB12, 0x60FF6039,\n      0xCF60CB12, 0x70FF6039, 0xCF60EB12, 0x80FF6039, 0xCF600B13, 0x90FF6039,\n      0xCF602B13, 0xA0FF6039, 0xCF604B13, 0xB0FF6039, 0xCF606B13, 0xC0FF6039,\n      0xCF608B13, 0xD0FF6039, 0xCF60AB13, 0xE0FF6039, 0xCF60CB13,\n      0xF0FF6039,  // __restvmx_127\n      0xCF60EB13, 0x2000804E,\n  };\n\n  // TODO(benvanik): these are almost always sequential, if present.\n  //     It'd be smarter to search around the other ones to prevent\n  //     3 full module scans.\n  uint32_t gplr_start = 0;\n  uint32_t fpr_start = 0;\n  uint32_t vmx_start = 0;\n\n  auto page_size = base_address_ <= 0x90000000 ? 64 * 1024 : 4 * 1024;\n  auto sec_header = xex_security_info();\n  for (uint32_t i = 0, page = 0; i < sec_header->page_descriptor_count; i++) {\n    // Byteswap the bitfield manually.\n    xex2_page_descriptor desc;\n    desc.value = xe::byte_swap(sec_header->page_descriptors[i].value);\n\n    const auto start_address = base_address_ + (page * page_size);\n    const auto end_address = start_address + (desc.page_count * page_size);\n\n    if (desc.info == XEX_SECTION_CODE) {\n      if (!gplr_start) {\n        gplr_start = memory_->SearchAligned(start_address, end_address,\n                                            gprlr_code_values,\n                                            xe::countof(gprlr_code_values));\n      }\n      if (!fpr_start) {\n        fpr_start =\n            memory_->SearchAligned(start_address, end_address, fpr_code_values,\n                                   xe::countof(fpr_code_values));\n      }\n      if (!vmx_start) {\n        vmx_start =\n            memory_->SearchAligned(start_address, end_address, vmx_code_values,\n                                   xe::countof(vmx_code_values));\n      }\n      if (gplr_start && fpr_start && vmx_start) {\n        break;\n      }\n    }\n\n    page += desc.page_count;\n  }\n\n  // Add function stubs.\n  char name[32];\n  if (gplr_start) {\n    uint32_t address = gplr_start;\n    for (int n = 14; n <= 31; n++) {\n      auto format_result =\n          fmt::format_to_n(name, xe::countof(name), \"__savegprlr_{}\", n);\n      Function* function;\n      DeclareFunction(address, &function);\n      function->set_end_address(address + (31 - n) * 4 + 2 * 4);\n      function->set_name(std::string_view(name, format_result.size));\n      // TODO(benvanik): set type  fn->type = FunctionSymbol::User;\n      // TODO(benvanik): set flags fn->flags |= FunctionSymbol::kFlagSaveGprLr;\n      function->set_behavior(Function::Behavior::kProlog);\n      function->set_status(Symbol::Status::kDeclared);\n      address += 4;\n    }\n    address = gplr_start + 20 * 4;\n    for (int n = 14; n <= 31; n++) {\n      auto format_result =\n          fmt::format_to_n(name, xe::countof(name), \"__restgprlr_{}\", n);\n      Function* function;\n      DeclareFunction(address, &function);\n      function->set_end_address(address + (31 - n) * 4 + 3 * 4);\n      function->set_name(std::string_view(name, format_result.size));\n      // TODO(benvanik): set type  fn->type = FunctionSymbol::User;\n      // TODO(benvanik): set flags fn->flags |= FunctionSymbol::kFlagRestGprLr;\n      function->set_behavior(Function::Behavior::kEpilogReturn);\n      function->set_status(Symbol::Status::kDeclared);\n      address += 4;\n    }\n  }\n  if (fpr_start) {\n    uint32_t address = fpr_start;\n    for (int n = 14; n <= 31; n++) {\n      auto format_result =\n          fmt::format_to_n(name, xe::countof(name), \"__savefpr_{}\", n);\n      Function* function;\n      DeclareFunction(address, &function);\n      function->set_end_address(address + (31 - n) * 4 + 1 * 4);\n      function->set_name(std::string_view(name, format_result.size));\n      // TODO(benvanik): set type  fn->type = FunctionSymbol::User;\n      // TODO(benvanik): set flags fn->flags |= FunctionSymbol::kFlagSaveFpr;\n      function->set_behavior(Function::Behavior::kProlog);\n      function->set_status(Symbol::Status::kDeclared);\n      address += 4;\n    }\n    address = fpr_start + (18 * 4) + (1 * 4);\n    for (int n = 14; n <= 31; n++) {\n      auto format_result =\n          fmt::format_to_n(name, xe::countof(name), \"__restfpr_{}\", n);\n      Function* function;\n      DeclareFunction(address, &function);\n      function->set_end_address(address + (31 - n) * 4 + 1 * 4);\n      function->set_name(std::string_view(name, format_result.size));\n      // TODO(benvanik): set type  fn->type = FunctionSymbol::User;\n      // TODO(benvanik): set flags fn->flags |= FunctionSymbol::kFlagRestFpr;\n      function->set_behavior(Function::Behavior::kEpilog);\n      function->set_status(Symbol::Status::kDeclared);\n      address += 4;\n    }\n  }\n  if (vmx_start) {\n    // vmx is:\n    // 14-31 save\n    // 64-127 save\n    // 14-31 rest\n    // 64-127 rest\n    uint32_t address = vmx_start;\n    for (int n = 14; n <= 31; n++) {\n      auto format_result =\n          fmt::format_to_n(name, xe::countof(name), \"__savevmx_{}\", n);\n      Function* function;\n      DeclareFunction(address, &function);\n      function->set_name(std::string_view(name, format_result.size));\n      // TODO(benvanik): set type  fn->type = FunctionSymbol::User;\n      // TODO(benvanik): set flags fn->flags |= FunctionSymbol::kFlagSaveVmx;\n      function->set_behavior(Function::Behavior::kProlog);\n      function->set_status(Symbol::Status::kDeclared);\n      address += 2 * 4;\n    }\n    address += 4;\n    for (int n = 64; n <= 127; n++) {\n      auto format_result =\n          fmt::format_to_n(name, xe::countof(name), \"__savevmx_{}\", n);\n      Function* function;\n      DeclareFunction(address, &function);\n      function->set_name(std::string_view(name, format_result.size));\n      // TODO(benvanik): set type  fn->type = FunctionSymbol::User;\n      // TODO(benvanik): set flags fn->flags |= FunctionSymbol::kFlagSaveVmx;\n      function->set_behavior(Function::Behavior::kProlog);\n      function->set_status(Symbol::Status::kDeclared);\n      address += 2 * 4;\n    }\n    address = vmx_start + (18 * 2 * 4) + (1 * 4) + (64 * 2 * 4) + (1 * 4);\n    for (int n = 14; n <= 31; n++) {\n      auto format_result =\n          fmt::format_to_n(name, xe::countof(name), \"__restvmx_{}\", n);\n      Function* function;\n      DeclareFunction(address, &function);\n      function->set_name(std::string_view(name, format_result.size));\n      // TODO(benvanik): set type  fn->type = FunctionSymbol::User;\n      // TODO(benvanik): set flags fn->flags |= FunctionSymbol::kFlagRestVmx;\n      function->set_behavior(Function::Behavior::kEpilog);\n      function->set_status(Symbol::Status::kDeclared);\n      address += 2 * 4;\n    }\n    address += 4;\n    for (int n = 64; n <= 127; n++) {\n      auto format_result =\n          fmt::format_to_n(name, xe::countof(name), \"__restvmx_{}\", n);\n      Function* function;\n      DeclareFunction(address, &function);\n      function->set_name(std::string_view(name, format_result.size));\n      // TODO(benvanik): set type  fn->type = FunctionSymbol::User;\n      // TODO(benvanik): set flags fn->flags |= FunctionSymbol::kFlagRestVmx;\n      function->set_behavior(Function::Behavior::kEpilog);\n      function->set_status(Symbol::Status::kDeclared);\n      address += 2 * 4;\n    }\n  }\n\n  return true;\n}\n\n}  // namespace cpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/cpu/xex_module.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_CPU_XEX_MODULE_H_\n#define XENIA_CPU_XEX_MODULE_H_\n\n#include <string>\n#include <vector>\n\n#include \"xenia/cpu/module.h\"\n#include \"xenia/kernel/util/xex2_info.h\"\n\nnamespace xe {\nnamespace kernel {\nclass KernelState;\n}  // namespace kernel\n}  // namespace xe\n\nnamespace xe {\nnamespace cpu {\n\nconstexpr fourcc_t kXEX1Signature = make_fourcc(\"XEX1\");\nconstexpr fourcc_t kXEX2Signature = make_fourcc(\"XEX2\");\nconstexpr fourcc_t kElfSignature = make_fourcc(0x7F, 'E', 'L', 'F');\n\nclass Runtime;\n\nclass XexModule : public xe::cpu::Module {\n public:\n  struct ImportLibraryFn {\n   public:\n    uint32_t ordinal;\n    uint32_t value_address;\n    uint32_t thunk_address;\n  };\n  struct ImportLibrary {\n   public:\n    std::string name;\n    uint32_t id;\n    xe_xex2_version_t version;\n    xe_xex2_version_t min_version;\n    std::vector<ImportLibraryFn> imports;\n  };\n  struct SecurityInfoContext {\n    const char* rsa_signature;\n    const char* aes_key;\n    uint32_t image_size;\n    uint32_t image_flags;\n    uint32_t export_table;\n    uint32_t load_address;\n    uint32_t page_descriptor_count;\n    const xex2_page_descriptor* page_descriptors;\n  };\n  enum XexFormat {\n    kFormatUnknown,\n    kFormatXex1,\n    kFormatXex2,\n  };\n\n  XexModule(Processor* processor, kernel::KernelState* kernel_state);\n  virtual ~XexModule();\n\n  bool loaded() const { return loaded_; }\n  const xex2_header* xex_header() const {\n    return reinterpret_cast<const xex2_header*>(xex_header_mem_.data());\n  }\n  const SecurityInfoContext* xex_security_info() const {\n    return &security_info_;\n  }\n\n  uint32_t image_size() const {\n    assert_not_zero(base_address_);\n\n    // Calculate the new total size of the XEX image from its headers.\n    auto heap = memory()->LookupHeap(base_address_);\n    uint32_t total_size = 0;\n    for (uint32_t i = 0; i < xex_security_info()->page_descriptor_count; i++) {\n      // Byteswap the bitfield manually.\n      xex2_page_descriptor desc;\n      desc.value =\n          xe::byte_swap(xex_security_info()->page_descriptors[i].value);\n\n      total_size += desc.page_count * heap->page_size();\n    }\n    return total_size;\n  }\n\n  const std::vector<ImportLibrary>* import_libraries() const {\n    return &import_libs_;\n  }\n\n  const xex2_opt_execution_info* opt_execution_info() const {\n    xex2_opt_execution_info* retval = nullptr;\n    GetOptHeader(XEX_HEADER_EXECUTION_INFO, &retval);\n    return retval;\n  }\n\n  const xex2_opt_file_format_info* opt_file_format_info() const {\n    xex2_opt_file_format_info* retval = nullptr;\n    GetOptHeader(XEX_HEADER_FILE_FORMAT_INFO, &retval);\n    return retval;\n  }\n\n  std::vector<uint32_t> opt_alternate_title_ids() const {\n    return opt_alternate_title_ids_;\n  }\n\n  const uint32_t base_address() const { return base_address_; }\n  const bool is_dev_kit() const { return is_dev_kit_; }\n\n  // Gets an optional header. Returns NULL if not found.\n  // Special case: if key & 0xFF == 0x00, this function will return the value,\n  // not a pointer! This assumes out_ptr points to uint32_t.\n  static bool GetOptHeader(const xex2_header* header, xex2_header_keys key,\n                           void** out_ptr);\n  bool GetOptHeader(xex2_header_keys key, void** out_ptr) const;\n\n  // Ultra-cool templated version\n  // Special case: if key & 0xFF == 0x00, this function will return the value,\n  // not a pointer! This assumes out_ptr points to uint32_t.\n  template <typename T>\n  static bool GetOptHeader(const xex2_header* header, xex2_header_keys key,\n                           T* out_ptr) {\n    return GetOptHeader(header, key, reinterpret_cast<void**>(out_ptr));\n  }\n\n  template <typename T>\n  bool GetOptHeader(xex2_header_keys key, T* out_ptr) const {\n    return GetOptHeader(key, reinterpret_cast<void**>(out_ptr));\n  }\n\n  static const void* GetSecurityInfo(const xex2_header* header);\n\n  const PESection* GetPESection(const char* name);\n\n  uint32_t GetProcAddress(uint16_t ordinal) const;\n  uint32_t GetProcAddress(const std::string_view name) const;\n\n  int ApplyPatch(XexModule* module);\n  bool Load(const std::string_view name, const std::string_view path,\n            const void* xex_addr, size_t xex_length);\n  bool LoadContinue();\n  bool Unload();\n\n  bool ContainsAddress(uint32_t address) override;\n\n  const std::string& name() const override { return name_; }\n  bool is_executable() const override {\n    return (xex_header()->module_flags & XEX_MODULE_TITLE) != 0;\n  }\n\n  bool is_valid_executable() const {\n    assert_not_zero(base_address_);\n    if (!base_address_) {\n      return false;\n    }\n    uint8_t* buffer = memory()->TranslateVirtual(base_address_);\n    return *(uint32_t*)buffer == 0x905A4D;\n  }\n\n  bool is_patch() const {\n    assert_not_null(xex_header());\n    if (!xex_header()) {\n      return false;\n    }\n    return (xex_header()->module_flags &\n            (XEX_MODULE_MODULE_PATCH | XEX_MODULE_PATCH_DELTA |\n             XEX_MODULE_PATCH_FULL));\n  }\n\n protected:\n  std::unique_ptr<Function> CreateFunction(uint32_t address) override;\n\n private:\n  void ReadSecurityInfo();\n\n  int ReadImage(const void* xex_addr, size_t xex_length, bool use_dev_key);\n  int ReadImageUncompressed(const void* xex_addr, size_t xex_length);\n  int ReadImageBasicCompressed(const void* xex_addr, size_t xex_length);\n  int ReadImageCompressed(const void* xex_addr, size_t xex_length);\n\n  int ReadPEHeaders();\n\n  bool SetupLibraryImports(const std::string_view name,\n                           const xex2_import_library* library);\n  bool FindSaveRest();\n\n  Processor* processor_ = nullptr;\n  kernel::KernelState* kernel_state_ = nullptr;\n  std::string name_;\n  std::string path_;\n  std::vector<uint8_t> xex_header_mem_;  // Holds the xex header\n  std::vector<uint8_t> xexp_data_mem_;   // Holds XEXP patch data\n\n  std::vector<ImportLibrary>\n      import_libs_;  // pre-loaded import libraries for ease of use\n  std::vector<PESection> pe_sections_;\n\n  // XEX_HEADER_ALTERNATE_TITLE_IDS loaded into a safe std::vector\n  std::vector<uint32_t> opt_alternate_title_ids_;\n\n  uint8_t session_key_[0x10];\n  bool is_dev_kit_ = false;\n\n  bool loaded_ = false;         // Loaded into memory?\n  bool finished_load_ = false;  // PE/imports/symbols/etc all loaded?\n\n  uint32_t base_address_ = 0;\n  uint32_t low_address_ = 0;\n  uint32_t high_address_ = 0;\n\n  XexFormat xex_format_ = kFormatUnknown;\n  SecurityInfoContext security_info_ = {};\n};\n\n}  // namespace cpu\n}  // namespace xe\n\n#endif  // XENIA_CPU_XEX_MODULE_H_\n"
  },
  {
    "path": "src/xenia/debug/ui/debug_window.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/debug/ui/debug_window.h\"\n\n#include <algorithm>\n#include <cinttypes>\n#include <utility>\n\n#include \"third_party/capstone/include/capstone/capstone.h\"\n#include \"third_party/capstone/include/capstone/x86.h\"\n#include \"third_party/imgui/imgui.h\"\n#include \"third_party/imgui/imgui_internal.h\"\n#include \"xenia/base/clock.h\"\n#include \"xenia/base/fuzzy.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/platform.h\"\n#include \"xenia/base/string_util.h\"\n#include \"xenia/base/threading.h\"\n#include \"xenia/cpu/breakpoint.h\"\n#include \"xenia/cpu/ppc/ppc_opcode_info.h\"\n#include \"xenia/cpu/stack_walker.h\"\n#include \"xenia/gpu/graphics_system.h\"\n#include \"xenia/kernel/xmodule.h\"\n#include \"xenia/kernel/xthread.h\"\n#include \"xenia/ui/graphics_provider.h\"\n#include \"xenia/ui/imgui_drawer.h\"\n#include \"xenia/ui/immediate_drawer.h\"\n#include \"xenia/ui/presenter.h\"\n#include \"xenia/ui/windowed_app_context.h\"\n\nDEFINE_bool(imgui_debug, false, \"Show ImGui debugging tools.\", \"UI\");\n\nnamespace xe {\nnamespace debug {\nnamespace ui {\n\nusing xe::cpu::Breakpoint;\nusing xe::kernel::XModule;\nusing xe::kernel::XObject;\nusing xe::kernel::XThread;\nusing xe::ui::KeyEvent;\nusing xe::ui::MenuItem;\nusing xe::ui::MouseEvent;\nusing xe::ui::UIEvent;\n\nvoid DebugWindow::DebugDialog::OnDraw(ImGuiIO& io) {\n  debug_window_.DrawFrame(io);\n}\n\nstatic const std::string kBaseTitle = \"Xenia Debugger\";\n\nDebugWindow::DebugWindow(Emulator* emulator,\n                         xe::ui::WindowedAppContext& app_context)\n    : emulator_(emulator),\n      processor_(emulator->processor()),\n      app_context_(app_context),\n      window_(xe::ui::Window::Create(app_context_, kBaseTitle, 1500, 1000)) {\n  if (cs_open(CS_ARCH_X86, CS_MODE_64, &capstone_handle_) != CS_ERR_OK) {\n    assert_always(\"Failed to initialize capstone\");\n  }\n  cs_option(capstone_handle_, CS_OPT_SYNTAX, CS_OPT_SYNTAX_INTEL);\n  cs_option(capstone_handle_, CS_OPT_DETAIL, CS_OPT_OFF);\n}\n\nDebugWindow::~DebugWindow() {\n  // Make sure pending functions referencing the DebugWindow are executed.\n  app_context_.ExecutePendingFunctionsFromUIThread();\n\n  if (capstone_handle_) {\n    cs_close(&capstone_handle_);\n  }\n}\n\nstd::unique_ptr<DebugWindow> DebugWindow::Create(\n    Emulator* emulator, xe::ui::WindowedAppContext& app_context) {\n  std::unique_ptr<DebugWindow> debug_window(\n      new DebugWindow(emulator, app_context));\n  if (!debug_window->Initialize()) {\n    xe::FatalError(\"Failed to initialize debug window\");\n    return nullptr;\n  }\n\n  return debug_window;\n}\n\nbool DebugWindow::Initialize() {\n  // Main menu.\n  auto main_menu = MenuItem::Create(MenuItem::Type::kNormal);\n  auto file_menu = MenuItem::Create(MenuItem::Type::kPopup, \"&File\");\n  {\n    file_menu->AddChild(\n        MenuItem::Create(MenuItem::Type::kString, \"&Close\", \"Alt+F4\",\n                         [this]() { window_->RequestClose(); }));\n  }\n  main_menu->AddChild(std::move(file_menu));\n  window_->SetMainMenu(std::move(main_menu));\n\n  // Open the window once it's configured.\n  if (!window_->Open()) {\n    XELOGE(\"Failed to open the platform window for the debugger\");\n    return false;\n  }\n\n  // Setup drawing to the window.\n\n  xe::ui::GraphicsProvider& graphics_provider =\n      *emulator_->graphics_system()->provider();\n\n  presenter_ = graphics_provider.CreatePresenter();\n  if (!presenter_) {\n    XELOGE(\"Failed to initialize the presenter for the debugger\");\n    return false;\n  }\n\n  immediate_drawer_ = graphics_provider.CreateImmediateDrawer();\n  if (!immediate_drawer_) {\n    XELOGE(\"Failed to initialize the immediate drawer for the debugger\");\n    return false;\n  }\n  immediate_drawer_->SetPresenter(presenter_.get());\n\n  imgui_drawer_ = std::make_unique<xe::ui::ImGuiDrawer>(window_.get(), 0);\n  imgui_drawer_->SetPresenterAndImmediateDrawer(presenter_.get(),\n                                                immediate_drawer_.get());\n  debug_dialog_ =\n      std::unique_ptr<DebugDialog>(new DebugDialog(imgui_drawer_.get(), *this));\n\n  // Update the cache before the first frame.\n  UpdateCache();\n\n  // Begin drawing.\n  window_->SetPresenter(presenter_.get());\n\n  return true;\n}\n\nvoid DebugWindow::DrawFrame(ImGuiIO& io) {\n  ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(-1, 0));\n  ImGui::Begin(\"main_window\", nullptr,\n               ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize |\n                   ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoScrollbar |\n                   ImGuiWindowFlags_NoSavedSettings);\n  ImGui::SetWindowPos(ImVec2(0, 0));\n  ImGui::SetWindowSize(io.DisplaySize);\n  ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(4, 4));\n\n  constexpr float kSplitterWidth = 5.0f;\n  static float function_pane_width = 150.0f;\n  static float source_pane_width = 600.0f;\n  static float registers_pane_width = 150.0f;\n  static float bottom_panes_height = 300.0f;\n  static float breakpoints_pane_width = 300.0f;\n  float top_panes_height =\n      ImGui::GetContentRegionAvail().y - bottom_panes_height;\n  float log_pane_width =\n      ImGui::GetContentRegionAvail().x - breakpoints_pane_width;\n\n  ImGui::BeginChild(\"##toolbar\", ImVec2(0, 25), true);\n  DrawToolbar();\n  ImGui::EndChild();\n\n  if (!cache_.is_running) {\n    // Disabled state?\n    // https://github.com/ocornut/imgui/issues/211\n  }\n\n  ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0));\n  ImGui::BeginChild(\"##function_pane\",\n                    ImVec2(function_pane_width, top_panes_height), true);\n  DrawFunctionsPane();\n  ImGui::EndChild();\n  ImGui::SameLine();\n  ImGui::InvisibleButton(\"##vsplitter0\",\n                         ImVec2(kSplitterWidth, top_panes_height));\n  if (ImGui::IsItemActive()) {\n    function_pane_width += io.MouseDelta.x;\n    function_pane_width = xe::clamp_float(function_pane_width, 30.0f, FLT_MAX);\n  }\n  ImGui::SameLine();\n  ImGui::BeginChild(\"##source_pane\",\n                    ImVec2(source_pane_width, top_panes_height), true);\n  DrawSourcePane();\n  ImGui::EndChild();\n  ImGui::SameLine();\n  ImGui::InvisibleButton(\"##vsplitter1\",\n                         ImVec2(kSplitterWidth, top_panes_height));\n  if (ImGui::IsItemActive()) {\n    source_pane_width += io.MouseDelta.x;\n    source_pane_width = xe::clamp_float(source_pane_width, 30.0f, FLT_MAX);\n  }\n  ImGui::SameLine();\n  ImGui::BeginChild(\"##registers_pane\",\n                    ImVec2(registers_pane_width, top_panes_height), true);\n  DrawRegistersPane();\n  ImGui::EndChild();\n  ImGui::SameLine();\n  ImGui::InvisibleButton(\"##vsplitter2\",\n                         ImVec2(kSplitterWidth, top_panes_height));\n  if (ImGui::IsItemActive()) {\n    registers_pane_width += io.MouseDelta.x;\n    registers_pane_width =\n        xe::clamp_float(registers_pane_width, 30.0f, FLT_MAX);\n  }\n  ImGui::SameLine();\n  ImGui::BeginChild(\"##right_pane\", ImVec2(0, top_panes_height), true);\n  ImGui::BeginGroup();\n  ImGui::RadioButton(\"Threads\", &state_.right_pane_tab,\n                     ImState::kRightPaneThreads);\n  ImGui::SameLine();\n  ImGui::RadioButton(\"Memory\", &state_.right_pane_tab,\n                     ImState::kRightPaneMemory);\n  ImGui::EndGroup();\n  ImGui::Separator();\n  switch (state_.right_pane_tab) {\n    case ImState::kRightPaneThreads:\n      ImGui::BeginChild(\"##threads_pane\");\n      DrawThreadsPane();\n      ImGui::EndChild();\n      break;\n    case ImState::kRightPaneMemory:\n      ImGui::BeginChild(\"##memory_pane\");\n      DrawMemoryPane();\n      ImGui::EndChild();\n      break;\n  }\n  ImGui::EndChild();\n  ImGui::InvisibleButton(\"##hsplitter0\", ImVec2(-1, kSplitterWidth));\n  if (ImGui::IsItemActive()) {\n    bottom_panes_height -= io.MouseDelta.y;\n    bottom_panes_height = xe::clamp_float(bottom_panes_height, 30.0f, FLT_MAX);\n  }\n  ImGui::BeginChild(\"##log_pane\", ImVec2(log_pane_width, bottom_panes_height),\n                    true);\n  DrawLogPane();\n  ImGui::EndChild();\n  ImGui::SameLine();\n  ImGui::InvisibleButton(\"##vsplitter3\",\n                         ImVec2(kSplitterWidth, bottom_panes_height));\n  if (ImGui::IsItemActive()) {\n    breakpoints_pane_width -= io.MouseDelta.x;\n    breakpoints_pane_width =\n        xe::clamp_float(breakpoints_pane_width, 30.0f, FLT_MAX);\n  }\n  ImGui::SameLine();\n  ImGui::BeginChild(\"##breakpoints_pane\", ImVec2(0, 0), true);\n  DrawBreakpointsPane();\n  ImGui::EndChild();\n  ImGui::PopStyleVar();\n\n  ImGui::PopStyleVar();\n  ImGui::End();\n  ImGui::PopStyleVar();\n\n  if (cvars::imgui_debug) {\n    ImGui::ShowDemoWindow();\n    ImGui::ShowMetricsWindow();\n  }\n}\n\nvoid DebugWindow::DrawToolbar() {\n  // TODO(benvanik): save/load database? other app options?\n\n  // Program control.\n  if (cache_.is_running) {\n    ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0.8f, 0.0f, 0.0f, 1.0f));\n    ImGui::PushStyleColor(ImGuiCol_ButtonActive,\n                          ImVec4(0.9f, 0.0f, 0.0f, 1.0f));\n    ImGui::PushStyleColor(ImGuiCol_ButtonHovered,\n                          ImVec4(1.0f, 0.0f, 0.0f, 1.0f));\n    if (ImGui::Button(\"Pause\", ImVec2(80, 0))) {\n      processor_->Pause();\n    }\n    if (ImGui::IsItemHovered()) {\n      ImGui::SetTooltip(\"Interrupt the program and break into the debugger.\");\n    }\n    ImGui::PopStyleColor(3);\n  } else {\n    if (ImGui::Button(\"Continue\", ImVec2(80, 0))) {\n      processor_->Continue();\n    }\n    if (ImGui::IsItemHovered()) {\n      ImGui::SetTooltip(\"Resume the program from the current location.\");\n    }\n  }\n  ImGui::SameLine();\n\n  // Thread dropdown.\n  // Fast selection of the thread and reports the currently active thread for\n  // global operations.\n  // TODO(benvanik): use a popup + custom rendering to get richer view.\n  int current_thread_index = 0;\n  StringBuffer thread_combo;\n  int i = 0;\n  for (auto thread_info : cache_.thread_debug_infos) {\n    if (thread_info == state_.thread_info) {\n      current_thread_index = i;\n    }\n    if (thread_info->state != cpu::ThreadDebugInfo::State::kZombie) {\n      thread_combo.Append(thread_info->thread->thread_name());\n    } else {\n      thread_combo.Append(\"(zombie)\");\n    }\n    thread_combo.Append('\\0');\n    ++i;\n  }\n  if (ImGui::Combo(\"##thread_combo\", &current_thread_index,\n                   thread_combo.buffer(), 10)) {\n    // Thread changed.\n    SelectThreadStackFrame(cache_.thread_debug_infos[current_thread_index], 0,\n                           true);\n  }\n}\n\nvoid DebugWindow::DrawFunctionsPane() {\n  ImGui::Text(\"<functions>\");\n  // bar: analyze (?), goto current\n  // combo with module (+ emulator itself?)\n  // list with all functions known\n  // filter box + search button -> search dialog\n}\n\nvoid DebugWindow::DrawSourcePane() {\n  auto function = state_.function;\n  if (!function) {\n    ImGui::Text(\"(no function selected)\");\n    return;\n  }\n  ImGui::BeginGroup();\n  // top bar:\n  //   copy button\n  //   address start - end\n  //   name text box (editable)\n  //   combo for interleaved + [ppc, hir, opt hir, x64 + byte with sizes]\n  ImGui::AlignTextToFramePadding();\n  ImGui::Text(\"%s\", function->module()->name().c_str());\n  ImGui::SameLine();\n  ImGui::Dummy(ImVec2(4, 0));\n  ImGui::SameLine();\n  char address_str[9];\n  std::snprintf(address_str, xe::countof(address_str), \"%.8X\",\n                function->address());\n  ImGui::PushItemWidth(50);\n  ImGui::InputText(\"##address\", address_str, xe::countof(address_str),\n                   ImGuiInputTextFlags_AutoSelectAll);\n  ImGui::PopItemWidth();\n  ImGui::SameLine();\n  ImGui::Text(\" - %.8X\", function->end_address());\n  ImGui::SameLine();\n  ImGui::Dummy(ImVec2(4, 0));\n  ImGui::SameLine();\n  char name[256];\n  std::strcpy(name, function->name().c_str());\n  ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x - 10);\n  if (ImGui::InputText(\"##name\", name, sizeof(name),\n                       ImGuiInputTextFlags_AutoSelectAll)) {\n    function->set_name(name);\n  }\n  ImGui::PopItemWidth();\n  ImGui::EndGroup();\n\n  ImGui::BeginGroup();\n  ImGui::PushButtonRepeat(true);\n  bool can_step = !cache_.is_running && state_.thread_info;\n  if (ImGui::ButtonEx(\"Step PPC\", ImVec2(0, 0),\n                      can_step ? 0 : ImGuiItemFlags_Disabled)) {\n    // By enabling the button when stepping we allow repeat behavior.\n    if (processor_->execution_state() != cpu::ExecutionState::kStepping) {\n      processor_->StepGuestInstruction(state_.thread_info->thread_id);\n    }\n  }\n  ImGui::PopButtonRepeat();\n  if (ImGui::IsItemHovered()) {\n    ImGui::SetTooltip(\n        \"Step one PPC instruction on the current thread (hold for many).\");\n  }\n  ImGui::SameLine();\n  if (state_.source_display_mode > 0) {\n    // Only show x64 step button if we have x64 visible.\n    ImGui::Dummy(ImVec2(4, 0));\n    ImGui::SameLine();\n    ImGui::PushButtonRepeat(true);\n    if (ImGui::ButtonEx(\"Step x64\", ImVec2(0, 0),\n                        can_step ? 0 : ImGuiItemFlags_Disabled)) {\n      // By enabling the button when stepping we allow repeat behavior.\n      if (processor_->execution_state() != cpu::ExecutionState::kStepping) {\n        processor_->StepHostInstruction(state_.thread_info->thread_id);\n      }\n    }\n    ImGui::PopButtonRepeat();\n    if (ImGui::IsItemHovered()) {\n      ImGui::SetTooltip(\n          \"Step one x64 instruction on the current thread (hold for many).\");\n    }\n    ImGui::SameLine();\n  }\n  ImGui::Dummy(ImVec2(16, 0));\n  ImGui::SameLine();\n  if (ImGui::Button(\"Copy\")) {\n    // TODO(benvanik): move clipboard abstraction into ui?\n  }\n  ImGui::SameLine();\n  ImGui::Dummy(ImVec2(4, 0));\n  ImGui::SameLine();\n  if (function->is_guest()) {\n    const char* kSourceDisplayModes[] = {\n        \"PPC\",\n        \"PPC+HIR+x64\",\n        \"PPC+HIR (opt)+x64\",\n        \"PPC+x64\",\n    };\n    ImGui::PushItemWidth(90);\n    ImGui::Combo(\"##display_mode\", &state_.source_display_mode,\n                 kSourceDisplayModes,\n                 static_cast<int>(xe::countof(kSourceDisplayModes)));\n    ImGui::PopItemWidth();\n    ImGui::SameLine();\n  }\n  ImGui::Dummy(ImVec2(4, 0));\n  ImGui::SameLine();\n  ImGui::Text(\"(profile options?)\");\n  ImGui::SameLine();\n  ImGui::Dummy(ImVec2(4, 0));\n  ImGui::SameLine();\n  ImGui::Text(\"(hit count)\");\n  ImGui::SameLine();\n  ImGui::Dummy(ImVec2(4, 0));\n  ImGui::SameLine();\n  ImGui::Text(\"(code size?)\");\n  ImGui::EndGroup();\n\n  ImGui::Separator();\n  ImGui::BeginChild(\"##code\");\n  if (function->is_guest()) {\n    DrawGuestFunctionSource();\n  } else {\n    // TODO(benvanik): load PDB and display source code?\n    ImGui::Text(\"(system function?)\");\n  }\n  ImGui::EndChild();\n}\n\nvoid DebugWindow::DrawGuestFunctionSource() {\n  // source code:\n  //   |     8200000            ppc_label:\n  //   | [I] 8200000  FFCCDDEE          ppc disam               # comment\n  //   |                 v0 = add v1, v2\n  //   |        A123456  xadd rax, rbx\n  //     icon = active lines/etc (other threads too)\n  //            color gutter background for trace data? (hit count, etc)\n  //     show address + code bytes + ppc diasm with annotation comments\n  //     labels get their own line with duped addresses\n  //       show xrefs to labels?\n  //     hir greyed and offset (background color change?)\n  //     x64 greyed and offset with native address\n  //     hover on registers/etc for tooltip/highlight others\n  //     click register to go to location of last write\n  //     click code address to jump to code\n  //     click memory address to jump to memory browser\n  //     if historical data for memory/etc present, show combo boxes\n  auto memory = emulator_->memory();\n  auto function = static_cast<cpu::GuestFunction*>(state_.function);\n  auto& source_map = function->source_map();\n  uint32_t source_map_index = 0;\n\n  bool draw_hir = false;\n  bool draw_hir_opt = false;\n  bool draw_x64 = false;\n  switch (state_.source_display_mode) {\n    case 1:\n      draw_hir = true;\n      draw_x64 = true;\n      break;\n    case 2:\n      draw_hir_opt = true;\n      draw_x64 = true;\n      break;\n    case 3:\n      draw_x64 = true;\n      break;\n  }\n\n  auto guest_pc =\n      state_.thread_info\n          ? state_.thread_info->frames[state_.thread_stack_frame_index].guest_pc\n          : 0;\n\n  if (draw_hir) {\n    // TODO(benvanik): get HIR and draw preamble.\n  }\n  if (draw_hir_opt) {\n    // TODO(benvanik): get HIR and draw preamble.\n  }\n  if (draw_x64) {\n    // x64 preamble.\n    DrawMachineCodeSource(function->machine_code(), source_map[0].code_offset);\n  }\n\n  StringBuffer str;\n  for (uint32_t address = function->address();\n       address <= function->end_address(); address += 4) {\n    ImGui::PushID(address);\n\n    // TODO(benvanik): check other threads?\n    bool is_current_instr = address == guest_pc;\n    if (is_current_instr) {\n      ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(0.0f, 1.0f, 0.0f, 1.0f));\n      if (!draw_x64) {\n        ScrollToSourceIfPcChanged();\n      }\n    }\n\n    bool has_guest_bp =\n        LookupBreakpointAtAddress(Breakpoint::AddressType::kGuest, address) !=\n        nullptr;\n    DrawBreakpointGutterButton(has_guest_bp, Breakpoint::AddressType::kGuest,\n                               address);\n    ImGui::SameLine();\n\n    ImGui::Text(\" %c \", is_current_instr ? '>' : ' ');\n    ImGui::SameLine();\n\n    uint32_t code =\n        xe::load_and_swap<uint32_t>(memory->TranslateVirtual(address));\n    cpu::ppc::DisasmPPC(address, code, &str);\n    ImGui::Text(\"%.8X %.8X   %s\", address, code, str.buffer());\n    str.Reset();\n\n    if (is_current_instr) {\n      ImGui::PopStyleColor();\n    }\n\n    while (source_map_index < source_map.size() &&\n           source_map[source_map_index].guest_address != address) {\n      ++source_map_index;\n    }\n    if (source_map_index < source_map.size()) {\n      if (draw_hir) {\n        // TODO(benvanik): get HIR and draw for this PPC function.\n      }\n      if (draw_hir_opt) {\n        // TODO(benvanik): get HIR and draw for this PPC function.\n      }\n      if (draw_x64) {\n        const uint8_t* machine_code_start =\n            function->machine_code() + source_map[source_map_index].code_offset;\n        const size_t machine_code_length =\n            (source_map_index == source_map.size() - 1\n                 ? function->machine_code_length()\n                 : source_map[source_map_index + 1].code_offset) -\n            source_map[source_map_index].code_offset;\n        DrawMachineCodeSource(machine_code_start, machine_code_length);\n      }\n    }\n\n    ImGui::PopID();\n  }\n}\n\nvoid DebugWindow::DrawMachineCodeSource(const uint8_t* machine_code_ptr,\n                                        size_t length) {\n  auto host_pc =\n      state_.thread_info\n          ? state_.thread_info->frames[state_.thread_stack_frame_index].host_pc\n          : 0;\n\n  ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(1.0f, 1.0f, 1.0f, 0.5f));\n  auto machine_code_start_ptr = machine_code_ptr;\n  size_t remaining_machine_code_size = length;\n  uint64_t host_address = uint64_t(machine_code_ptr);\n  cs_insn insn = {0};\n  while (remaining_machine_code_size &&\n         cs_disasm_iter(capstone_handle_, &machine_code_ptr,\n                        &remaining_machine_code_size, &host_address, &insn)) {\n    ImGui::PushID(reinterpret_cast<void*>(insn.address));\n\n    bool is_current_instr = state_.thread_info && insn.address == host_pc;\n    if (is_current_instr) {\n      ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(0.0f, 1.0f, 0.0f, 1.0f));\n      ScrollToSourceIfPcChanged();\n    }\n\n    bool has_host_bp = LookupBreakpointAtAddress(Breakpoint::AddressType::kHost,\n                                                 insn.address) != nullptr;\n    DrawBreakpointGutterButton(has_host_bp, Breakpoint::AddressType::kHost,\n                               insn.address);\n    ImGui::SameLine();\n\n    ImGui::Text(\"    %c \", is_current_instr ? '>' : ' ');\n    ImGui::SameLine();\n    ImGui::Text(\" %.8X        %-10s %s\", uint32_t(insn.address), insn.mnemonic,\n                insn.op_str);\n\n    if (is_current_instr) {\n      ImGui::PopStyleColor();\n    }\n\n    ImGui::PopID();\n  }\n  ImGui::PopStyleColor();\n}\n\nvoid DebugWindow::DrawBreakpointGutterButton(\n    bool has_breakpoint, Breakpoint::AddressType address_type,\n    uint64_t address) {\n  ImGui::PushStyleColor(ImGuiCol_Button,\n                        has_breakpoint\n                            ? ImVec4(1.0f, 0.0f, 0.0f, 0.6f)\n                            : ImGui::GetStyle().Colors[ImGuiCol_FrameBg]);\n  ImGui::PushStyleColor(ImGuiCol_ButtonActive,\n                        !has_breakpoint\n                            ? ImVec4(1.0f, 0.0f, 0.0f, 0.8f)\n                            : ImGui::GetStyle().Colors[ImGuiCol_FrameBg]);\n  ImGui::PushStyleColor(ImGuiCol_ButtonHovered,\n                        !has_breakpoint\n                            ? ImVec4(1.0f, 0.0f, 0.0f, 1.0f)\n                            : ImGui::GetStyle().Colors[ImGuiCol_FrameBg]);\n  if (ImGui::Button(\" ##toggle_line_bp\")) {\n    if (!has_breakpoint) {\n      CreateCodeBreakpoint(address_type, address);\n    } else {\n      auto breakpoint = LookupBreakpointAtAddress(address_type, address);\n      assert_not_null(breakpoint);\n      DeleteCodeBreakpoint(breakpoint);\n    }\n  }\n  ImGui::PopStyleColor(3);\n  if (ImGui::IsItemHovered()) {\n    ImGui::SetTooltip(has_breakpoint ? \"Remove breakpoint at this address.\"\n                                     : \"Add a breakpoint at this address.\");\n  }\n}\n\nvoid DebugWindow::ScrollToSourceIfPcChanged() {\n  if (state_.has_changed_pc) {\n    // TODO(benvanik): not so annoying scroll.\n    ImGui::SetScrollHereY(0.5f);\n    state_.has_changed_pc = false;\n  }\n}\n\nbool DebugWindow::DrawRegisterTextBox(int id, uint32_t* value) {\n  char buffer[256] = {0};\n  ImGuiInputTextFlags input_flags =\n      ImGuiInputTextFlags_CharsUppercase | ImGuiInputTextFlags_CharsNoBlank;\n  if (state_.register_input_hex) {\n    input_flags |= ImGuiInputTextFlags_CharsHexadecimal |\n                   ImGuiInputTextFlags_AlwaysInsertMode |\n                   ImGuiInputTextFlags_NoHorizontalScroll;\n    auto src_value = xe::string_util::to_hex_string(*value);\n    std::strcpy(buffer, src_value.c_str());\n  } else {\n    input_flags |=\n        ImGuiInputTextFlags_CharsDecimal | ImGuiInputTextFlags_AutoSelectAll;\n    auto src_value = std::to_string(*value);\n    std::strcpy(buffer, src_value.c_str());\n  }\n  char label[16] = {0};\n  std::snprintf(label, xe::countof(label), \"##iregister%d\", id);\n  bool any_changed = false;\n  ImGui::PushItemWidth(50);\n  if (ImGui::InputText(label, buffer,\n                       state_.register_input_hex ? 9 : sizeof(buffer),\n                       input_flags)) {\n    if (state_.register_input_hex) {\n      *value = string_util::from_string<uint32_t>(buffer, true);\n    } else {\n      *value = string_util::from_string<int32_t>(buffer);\n    }\n    any_changed = true;\n  }\n  ImGui::PopItemWidth();\n  if (ImGui::IsItemHovered()) {\n    auto alt_value = state_.register_input_hex\n                         ? std::to_string(*value)\n                         : string_util::to_hex_string(*value);\n    ImGui::SetTooltip(\"%s\", alt_value.c_str());\n  }\n  return any_changed;\n}\n\nbool DebugWindow::DrawRegisterTextBox(int id, uint64_t* value) {\n  char buffer[256] = {0};\n  ImGuiInputTextFlags input_flags =\n      ImGuiInputTextFlags_CharsUppercase | ImGuiInputTextFlags_CharsNoBlank;\n  if (state_.register_input_hex) {\n    input_flags |= ImGuiInputTextFlags_CharsHexadecimal |\n                   ImGuiInputTextFlags_AlwaysInsertMode |\n                   ImGuiInputTextFlags_NoHorizontalScroll;\n    auto src_value = xe::string_util::to_hex_string(*value);\n    std::strcpy(buffer, src_value.c_str());\n  } else {\n    input_flags |=\n        ImGuiInputTextFlags_CharsDecimal | ImGuiInputTextFlags_AutoSelectAll;\n    auto src_value = std::to_string(*value);\n    std::strcpy(buffer, src_value.c_str());\n  }\n  char label[16] = {0};\n  std::snprintf(label, xe::countof(label), \"##lregister%d\", id);\n  bool any_changed = false;\n  ImGui::PushItemWidth(95);\n  if (ImGui::InputText(label, buffer,\n                       state_.register_input_hex ? 17 : sizeof(buffer),\n                       input_flags)) {\n    if (state_.register_input_hex) {\n      *value = string_util::from_string<uint64_t>(buffer, true);\n    } else {\n      *value = string_util::from_string<int64_t>(buffer);\n    }\n    any_changed = true;\n  }\n  ImGui::PopItemWidth();\n  if (ImGui::IsItemHovered()) {\n    auto alt_value = state_.register_input_hex\n                         ? std::to_string(*value)\n                         : string_util::to_hex_string(*value);\n    ImGui::SetTooltip(\"%s\", alt_value.c_str());\n  }\n  return any_changed;\n}\n\nbool DebugWindow::DrawRegisterTextBox(int id, double* value) {\n  char buffer[256] = {0};\n  ImGuiInputTextFlags input_flags =\n      ImGuiInputTextFlags_CharsUppercase | ImGuiInputTextFlags_CharsNoBlank;\n  if (state_.register_input_hex) {\n    input_flags |= ImGuiInputTextFlags_CharsHexadecimal |\n                   ImGuiInputTextFlags_AlwaysInsertMode |\n                   ImGuiInputTextFlags_NoHorizontalScroll;\n    auto src_value = xe::string_util::to_hex_string(*value);\n    std::strcpy(buffer, src_value.c_str());\n  } else {\n    input_flags |=\n        ImGuiInputTextFlags_CharsDecimal | ImGuiInputTextFlags_AutoSelectAll;\n    std::snprintf(buffer, xe::countof(buffer), \"%.8F\", *value);\n  }\n  char label[16] = {0};\n  std::snprintf(label, xe::countof(label), \"##dregister%d\", id);\n  bool any_changed = false;\n  ImGui::PushItemWidth(95);\n  if (ImGui::InputText(label, buffer,\n                       state_.register_input_hex ? 17 : sizeof(buffer),\n                       input_flags)) {\n    if (state_.register_input_hex) {\n      *value = string_util::from_string<double>(buffer, true);\n    } else {\n      *value = string_util::from_string<double>(buffer);\n    }\n    any_changed = true;\n  }\n  ImGui::PopItemWidth();\n  if (ImGui::IsItemHovered()) {\n    auto alt_value = state_.register_input_hex\n                         ? std::to_string(*value)\n                         : string_util::to_hex_string(*value);\n    ImGui::SetTooltip(\"%s\", alt_value.c_str());\n  }\n  return any_changed;\n}\n\nbool DebugWindow::DrawRegisterTextBoxes(int id, float* value) {\n  char buffer[256] = {0};\n  ImGuiInputTextFlags input_flags =\n      ImGuiInputTextFlags_CharsUppercase | ImGuiInputTextFlags_CharsNoBlank;\n  if (state_.register_input_hex) {\n    input_flags |= ImGuiInputTextFlags_CharsHexadecimal |\n                   ImGuiInputTextFlags_AlwaysInsertMode |\n                   ImGuiInputTextFlags_NoHorizontalScroll;\n  } else {\n    input_flags |=\n        ImGuiInputTextFlags_CharsDecimal | ImGuiInputTextFlags_AutoSelectAll;\n  }\n  bool any_changed = false;\n  char label[16] = {0};\n  for (int i = 0; i < 4; ++i) {\n    if (state_.register_input_hex) {\n      auto src_value = xe::string_util::to_hex_string(value[i]);\n      std::strcpy(buffer, src_value.c_str());\n    } else {\n      std::snprintf(buffer, xe::countof(buffer), \"%F\", value[i]);\n    }\n    std::snprintf(label, xe::countof(label), \"##vregister%d_%d\", id, i);\n    ImGui::PushItemWidth(50);\n    if (ImGui::InputText(label, buffer,\n                         state_.register_input_hex ? 9 : sizeof(buffer),\n                         input_flags)) {\n      if (state_.register_input_hex) {\n        value[i] = string_util::from_string<float>(buffer, true);\n      } else {\n        value[i] = string_util::from_string<float>(buffer);\n      }\n      any_changed = true;\n    }\n    ImGui::PopItemWidth();\n    if (ImGui::IsItemHovered()) {\n      auto alt_value = state_.register_input_hex\n                           ? std::to_string(value[i])\n                           : string_util::to_hex_string(value[i]);\n      ImGui::SetTooltip(\"%s\", alt_value.c_str());\n    }\n    if (i < 3) {\n      ImGui::SameLine();\n      ImGui::Dummy(ImVec2(1, 0));\n      ImGui::SameLine();\n    }\n  }\n  return any_changed;\n}\n\nvoid DebugWindow::DrawRegistersPane() {\n  if (state_.register_group == RegisterGroup::kGuestGeneral) {\n    ImGui::PushStyleColor(ImGuiCol_Button,\n                          ImGui::GetStyle().Colors[ImGuiCol_ButtonActive]);\n    ImGui::Button(\"GPR\");\n    ImGui::PopStyleColor();\n  } else {\n    if (ImGui::Button(\"GPR\")) {\n      state_.register_group = RegisterGroup::kGuestGeneral;\n    }\n  }\n  ImGui::SameLine();\n  if (state_.register_group == RegisterGroup::kGuestFloat) {\n    ImGui::PushStyleColor(ImGuiCol_Button,\n                          ImGui::GetStyle().Colors[ImGuiCol_ButtonActive]);\n    ImGui::Button(\"FPR\");\n    ImGui::PopStyleColor();\n  } else {\n    if (ImGui::Button(\"FPR\")) {\n      state_.register_group = RegisterGroup::kGuestFloat;\n    }\n  }\n  ImGui::SameLine();\n  if (state_.register_group == RegisterGroup::kGuestVector) {\n    ImGui::PushStyleColor(ImGuiCol_Button,\n                          ImGui::GetStyle().Colors[ImGuiCol_ButtonActive]);\n    ImGui::Button(\"VMX\");\n    ImGui::PopStyleColor();\n  } else {\n    if (ImGui::Button(\"VMX\")) {\n      state_.register_group = RegisterGroup::kGuestVector;\n    }\n  }\n  ImGui::SameLine();\n  if (state_.register_group == RegisterGroup::kHostGeneral) {\n    ImGui::PushStyleColor(ImGuiCol_Button,\n                          ImGui::GetStyle().Colors[ImGuiCol_ButtonActive]);\n    ImGui::Button(\"x64\");\n    ImGui::PopStyleColor();\n  } else {\n    if (ImGui::Button(\"x64\")) {\n      state_.register_group = RegisterGroup::kHostGeneral;\n    }\n  }\n  ImGui::SameLine();\n  if (state_.register_group == RegisterGroup::kHostVector) {\n    ImGui::PushStyleColor(ImGuiCol_Button,\n                          ImGui::GetStyle().Colors[ImGuiCol_ButtonActive]);\n    ImGui::Button(\"XMM\");\n    ImGui::PopStyleColor();\n  } else {\n    if (ImGui::Button(\"XMM\")) {\n      state_.register_group = RegisterGroup::kHostVector;\n    }\n  }\n\n  ImGui::Checkbox(\"Hex\", &state_.register_input_hex);\n\n  if (!state_.thread_info) {\n    return;\n  }\n  auto thread_info = state_.thread_info;\n\n  bool dirty_guest_context = false;\n  bool dirty_host_context = false;\n  switch (state_.register_group) {\n    case RegisterGroup::kGuestGeneral: {\n      if (!thread_info->guest_context.physical_membase) {\n        return;\n      }\n      ImGui::BeginChild(\"##guest_general\");\n      ImGui::BeginGroup();\n      ImGui::AlignTextToFramePadding();\n      ImGui::Text(\" lr\");\n      ImGui::SameLine();\n      ImGui::Dummy(ImVec2(4, 0));\n      ImGui::SameLine();\n      dirty_guest_context |=\n          DrawRegisterTextBox(100, &thread_info->guest_context.lr);\n      ImGui::EndGroup();\n      ImGui::BeginGroup();\n      ImGui::AlignTextToFramePadding();\n      ImGui::Text(\"ctr\");\n      ImGui::SameLine();\n      ImGui::Dummy(ImVec2(4, 0));\n      ImGui::SameLine();\n      dirty_guest_context |=\n          DrawRegisterTextBox(101, &thread_info->guest_context.ctr);\n      ImGui::EndGroup();\n      // CR\n      // XER\n      // FPSCR\n      // VSCR\n      for (int i = 0; i < 32; ++i) {\n        ImGui::BeginGroup();\n        ImGui::AlignTextToFramePadding();\n        ImGui::Text(i < 10 ? \" r%d\" : \"r%d\", i);\n        ImGui::SameLine();\n        ImGui::Dummy(ImVec2(4, 0));\n        ImGui::SameLine();\n        dirty_guest_context |=\n            DrawRegisterTextBox(i, &thread_info->guest_context.r[i]);\n        ImGui::EndGroup();\n      }\n      ImGui::EndChild();\n    } break;\n    case RegisterGroup::kGuestFloat: {\n      if (!thread_info->guest_context.physical_membase) {\n        return;\n      }\n      ImGui::BeginChild(\"##guest_float\");\n      for (int i = 0; i < 32; ++i) {\n        ImGui::BeginGroup();\n        ImGui::AlignTextToFramePadding();\n        ImGui::Text(i < 10 ? \" f%d\" : \"f%d\", i);\n        ImGui::SameLine();\n        ImGui::Dummy(ImVec2(4, 0));\n        ImGui::SameLine();\n        dirty_guest_context |=\n            DrawRegisterTextBox(i, &thread_info->guest_context.f[i]);\n        ImGui::EndGroup();\n      }\n      ImGui::EndChild();\n    } break;\n    case RegisterGroup::kGuestVector: {\n      if (!thread_info->guest_context.physical_membase) {\n        return;\n      }\n      ImGui::BeginChild(\"##guest_vector\");\n      for (int i = 0; i < 128; ++i) {\n        ImGui::BeginGroup();\n        ImGui::AlignTextToFramePadding();\n        ImGui::Text(i < 10 ? \"  v%d\" : (i < 100 ? \" v%d\" : \"v%d\"), i);\n        ImGui::SameLine();\n        ImGui::Dummy(ImVec2(4, 0));\n        ImGui::SameLine();\n        dirty_guest_context |=\n            DrawRegisterTextBoxes(i, thread_info->guest_context.v[i].f32);\n        ImGui::EndGroup();\n      }\n      ImGui::EndChild();\n    } break;\n    case RegisterGroup::kHostGeneral: {\n      ImGui::BeginChild(\"##host_general\");\n      for (int i = 0; i < 18; ++i) {\n        auto reg = static_cast<X64Register>(i);\n        ImGui::BeginGroup();\n        ImGui::AlignTextToFramePadding();\n        ImGui::Text(\"%3s\", HostThreadContext::GetRegisterName(reg));\n        ImGui::SameLine();\n        ImGui::Dummy(ImVec2(4, 0));\n        ImGui::SameLine();\n        if (reg == X64Register::kRip) {\n          dirty_guest_context |=\n              DrawRegisterTextBox(i, &thread_info->host_context.rip);\n        } else if (reg == X64Register::kEflags) {\n          dirty_guest_context =\n              DrawRegisterTextBox(i, &thread_info->host_context.eflags);\n        } else {\n          dirty_guest_context |= DrawRegisterTextBox(\n              i, &thread_info->host_context.int_registers[i - 2]);\n        }\n        ImGui::EndGroup();\n      }\n      ImGui::EndChild();\n    } break;\n    case RegisterGroup::kHostVector: {\n      ImGui::BeginChild(\"##host_vector\");\n      for (int i = 0; i < 16; ++i) {\n        auto reg =\n            static_cast<X64Register>(static_cast<int>(X64Register::kXmm0) + i);\n        ImGui::BeginGroup();\n        ImGui::AlignTextToFramePadding();\n        ImGui::Text(\"%5s\", HostThreadContext::GetRegisterName(reg));\n        ImGui::SameLine();\n        ImGui::Dummy(ImVec2(4, 0));\n        ImGui::SameLine();\n        dirty_host_context |= DrawRegisterTextBoxes(\n            i, thread_info->host_context.xmm_registers[i].f32);\n        ImGui::EndGroup();\n      }\n      ImGui::EndChild();\n    }\n  }\n\n  if (dirty_guest_context) {\n    // TODO(benvanik): write context to thread.\n    // NOTE: this will only work if context promotion is disabled!\n  }\n  if (dirty_host_context) {\n    // TODO(benvanik): write context to thread.\n  }\n}\n\nvoid DebugWindow::DrawThreadsPane() {\n  ImGui::BeginGroup();\n  //   checkbox to show host threads\n  //   expand all toggle\n  ImGui::EndGroup();\n  ImGui::BeginChild(\"##threads_listing\");\n  for (size_t i = 0; i < cache_.thread_debug_infos.size(); ++i) {\n    auto thread_info = cache_.thread_debug_infos[i];\n    bool is_current_thread = thread_info == state_.thread_info;\n    auto thread =\n        emulator_->kernel_state()->GetThreadByID(thread_info->thread_id);\n    if (!thread) {\n      // TODO(benvanik): better display of zombie thread states.\n      continue;\n    }\n    if (is_current_thread && state_.has_changed_thread) {\n      ImGui::SetScrollHereY(0.5f);\n      state_.has_changed_thread = false;\n    }\n    if (!is_current_thread) {\n      ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(0.7f, 0.7f, 0.7f, 0.6f));\n    } else {\n      ImGui::PushStyleColor(ImGuiCol_Header,\n                            ImGui::GetStyle().Colors[ImGuiCol_HeaderActive]);\n    }\n    ImGui::PushID(thread_info);\n    if (is_current_thread) {\n      ImGui::SetNextItemOpen(true, ImGuiCond_Always);\n    }\n    const char* state_label = \"?\";\n    if (thread->can_debugger_suspend()) {\n      if (thread->is_running()) {\n        if (thread->suspend_count() > 1) {\n          state_label = \"SUSPEND\";\n        } else {\n          state_label = \"RUNNING\";\n        }\n      } else {\n        state_label = \"ZOMBIE\";\n      }\n    }\n    char thread_label[256];\n    std::snprintf(thread_label, xe::countof(thread_label),\n                  \"%-5s %-7s id=%.4X hnd=%.4X   %s\",\n                  thread->is_guest_thread() ? \"guest\" : \"host\", state_label,\n                  thread->thread_id(), thread->handle(),\n                  thread->name().c_str());\n    if (ImGui::CollapsingHeader(\n            thread_label,\n            is_current_thread ? ImGuiTreeNodeFlags_DefaultOpen : 0)) {\n      //   |     (log button) detail of kernel call categories\n      // log button toggles only logging that thread\n      ImGui::BulletText(\"Call Stack\");\n      ImGui::Indent();\n      for (size_t j = 0; j < thread_info->frames.size(); ++j) {\n        bool is_current_frame =\n            is_current_thread && j == state_.thread_stack_frame_index;\n        auto& frame = thread_info->frames[j];\n        if (is_current_thread && !frame.guest_pc) {\n          ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(1.0f, 1.0f, 1.0f, 0.6f));\n        }\n        char host_label[64];\n        std::snprintf(host_label, xe::countof(host_label), \"%016\" PRIX64 \"##%p\",\n                      frame.host_pc, &frame);\n        if (ImGui::Selectable(host_label, is_current_frame,\n                              ImGuiSelectableFlags_SpanAllColumns)) {\n          SelectThreadStackFrame(thread_info, j, true);\n        }\n        ImGui::SameLine();\n        ImGui::Dummy(ImVec2(8, 0));\n        ImGui::SameLine();\n        if (frame.guest_pc) {\n          ImGui::Text(\"%08X\", frame.guest_pc);\n        } else {\n          ImGui::Text(\"        \");\n        }\n        ImGui::SameLine();\n        ImGui::Dummy(ImVec2(8, 0));\n        ImGui::SameLine();\n        // breakpoints set? or something?\n        ImGui::Text(\" \");\n        ImGui::SameLine();\n        ImGui::Dummy(ImVec2(8, 0));\n        ImGui::SameLine();\n        if (frame.guest_function) {\n          ImGui::Text(\"%s\", frame.guest_function->name().c_str());\n        } else {\n          ImGui::Text(\"%s\", frame.name);\n        }\n        if (is_current_thread && !frame.guest_pc) {\n          ImGui::PopStyleColor();\n        }\n      }\n      ImGui::Unindent();\n    }\n    ImGui::PopStyleColor();\n    ImGui::PopID();\n  }\n  ImGui::EndChild();\n}\n\nvoid DebugWindow::DrawMemoryPane() {\n  ImGui::Text(\"<memory>\");\n  // tools for searching:\n  //   search bytes | text | pattern\n  // https://github.com/ocornut/imgui/wiki/memory_editor_example\n}\n\nvoid DebugWindow::DrawBreakpointsPane() {\n  auto& state = state_.breakpoints;\n\n  ImGui::BeginChild(\"##toolbar\", ImVec2(-1, 20));\n  bool all_breakpoints_enabled = true;\n  for (auto& breakpoint : state.all_breakpoints) {\n    if (!breakpoint->is_enabled()) {\n      all_breakpoints_enabled = false;\n      break;\n    }\n  }\n  if (ImGui::Checkbox(\"##toggle\", &all_breakpoints_enabled)) {\n    // Toggle all breakpoints on/off.\n    // If any are not enabled we will enable all, otherwise disable all.\n    for (auto& breakpoint : state.all_breakpoints) {\n      breakpoint->set_enabled(all_breakpoints_enabled);\n    }\n  }\n  if (ImGui::IsItemHovered()) {\n    ImGui::SetTooltip(\"Toggle all breakpoints.\");\n  }\n  ImGui::SameLine();\n  ImGui::Dummy(ImVec2(8, 0));\n  ImGui::SameLine();\n  if (ImGui::Button(\"+ Code\")) {\n    ImGui::OpenPopup(\"##add_code_breakpoint\");\n  }\n  if (ImGui::IsItemHovered()) {\n    ImGui::SetTooltip(\"Add a code breakpoint for either PPC or x64.\");\n  }\n  // TODO(benvanik): remove this set focus workaround when imgui is fixed:\n  // https://github.com/ocornut/imgui/issues/343\n  static int add_code_popup_render_count = 0;\n  if (ImGui::BeginPopup(\"##add_code_breakpoint\")) {\n    ++add_code_popup_render_count;\n\n    ImGui::AlignTextToFramePadding();\n    ImGui::Text(\"PPC\");\n    ImGui::SameLine();\n    ImGui::Dummy(ImVec2(2, 0));\n    ImGui::SameLine();\n    if (add_code_popup_render_count == 2) {\n      ImGui::SetKeyboardFocusHere();\n    }\n    static char ppc_buffer[32] = {0};\n    ImGuiInputTextFlags input_flags = ImGuiInputTextFlags_CharsUppercase |\n                                      ImGuiInputTextFlags_CharsNoBlank |\n                                      ImGuiInputTextFlags_CharsHexadecimal |\n                                      ImGuiInputTextFlags_AlwaysInsertMode |\n                                      ImGuiInputTextFlags_NoHorizontalScroll |\n                                      ImGuiInputTextFlags_EnterReturnsTrue;\n    ImGui::PushItemWidth(50);\n    if (ImGui::InputText(\"##guest_address\", ppc_buffer, 9, input_flags)) {\n      uint32_t address = string_util::from_string<uint32_t>(ppc_buffer, true);\n      ppc_buffer[0] = 0;\n      CreateCodeBreakpoint(Breakpoint::AddressType::kGuest, address);\n      ImGui::CloseCurrentPopup();\n    }\n    ImGui::PopItemWidth();\n    ImGui::Dummy(ImVec2(0, 2));\n\n    ImGui::AlignTextToFramePadding();\n    ImGui::Text(\"x64\");\n    ImGui::SameLine();\n    ImGui::Dummy(ImVec2(2, 0));\n    ImGui::SameLine();\n    static char x64_buffer[64] = {0};\n    ImGui::PushItemWidth(100);\n    if (ImGui::InputText(\"##host_address\", x64_buffer, 17, input_flags)) {\n      uint64_t address = string_util::from_string<uint64_t>(x64_buffer, true);\n      x64_buffer[0] = 0;\n      CreateCodeBreakpoint(Breakpoint::AddressType::kHost, address);\n      ImGui::CloseCurrentPopup();\n    }\n    ImGui::PopItemWidth();\n\n    ImGui::EndPopup();\n  } else {\n    add_code_popup_render_count = 0;\n  }\n  ImGui::SameLine();\n  ImGui::Dummy(ImVec2(2, 0));\n  ImGui::SameLine();\n\n  if (ImGui::Button(\"+ Data\")) {\n    ImGui::OpenPopup(\"##add_data_breakpoint\");\n  }\n  if (ImGui::IsItemHovered()) {\n    ImGui::SetTooltip(\"Add a memory data breakpoint.\");\n  }\n  if (ImGui::BeginPopup(\"##add_data_breakpoint\")) {\n    ImGui::Text(\"TODO: data stuff\");\n    ImGui::EndPopup();\n  }\n  ImGui::SameLine();\n  ImGui::Dummy(ImVec2(2, 0));\n  ImGui::SameLine();\n\n  if (ImGui::Button(\"+ Kernel\")) {\n    ImGui::OpenPopup(\"##add_kernel_breakpoint\");\n  }\n  if (ImGui::IsItemHovered()) {\n    ImGui::SetTooltip(\"Select active kernel breakpoints.\");\n  }\n  // TODO(benvanik): remove this set focus workaround when imgui is fixed:\n  // https://github.com/ocornut/imgui/issues/343\n  static int kernel_popup_render_count = 0;\n  if (ImGui::BeginPopup(\"##add_kernel_breakpoint\")) {\n    ++kernel_popup_render_count;\n\n    auto export_tables = emulator_->export_resolver()->tables();\n\n    ImGui::PushItemWidth(300);\n    // TODO(benvanik): tag filtering.\n    const char* its[] = {\n        \"All\",\n    };\n    int ci = 0;\n    ImGui::Combo(\"##kernel_categories\", &ci, its, 1, 1);\n    ImGui::Dummy(ImVec2(0, 3));\n    ImGui::ListBoxHeader(\"##kernel_calls\", 1000, 15);\n    auto& all_exports = emulator_->export_resolver()->all_exports_by_name();\n    auto call_rankings = xe::fuzzy_filter(state.kernel_call_filter, all_exports,\n                                          offsetof(cpu::Export, name));\n    bool has_any_call_filter = std::strlen(state.kernel_call_filter) > 0;\n    if (has_any_call_filter) {\n      std::sort(call_rankings.begin(), call_rankings.end(),\n                [](std::pair<size_t, int>& a, std::pair<size_t, int>& b) {\n                  if (a.second == b.second) {\n                    return a.first > b.first;\n                  } else {\n                    return a.second > b.second;\n                  }\n                });\n    }\n    for (size_t i = 0; i < call_rankings.size(); ++i) {\n      if (has_any_call_filter && !call_rankings[i].second) {\n        continue;\n      }\n      auto export_entry = all_exports[call_rankings[i].first];\n      if (export_entry->type != cpu::Export::Type::kFunction ||\n          !export_entry->is_implemented()) {\n        continue;\n      }\n      // TODO(benvanik): skip unused kernel calls.\n      ImGui::PushID(export_entry);\n      // TODO(benvanik): selection, hover info (module name, ordinal, etc).\n      bool is_pre_enabled = false;\n      bool is_post_enabled = false;\n      if (ImGui::Checkbox(\"##pre\", &is_pre_enabled)) {\n        // TODO(benvanik): add pre breakpoint (lookup thunk, add before\n        //     syscall).\n      }\n      if (ImGui::IsItemHovered()) {\n        ImGui::SetTooltip(\"Break immediately before this export is called.\");\n      }\n      ImGui::SameLine();\n      ImGui::Dummy(ImVec2(1, 0));\n      ImGui::SameLine();\n      if (ImGui::Checkbox(\"##post\", &is_post_enabled)) {\n        // TODO(benvanik): add pre breakpoint (lookup thunk, add after\n        //     syscall).\n      }\n      if (ImGui::IsItemHovered()) {\n        ImGui::SetTooltip(\"Break immediately after this export returns.\");\n      }\n      ImGui::SameLine();\n      ImGui::Dummy(ImVec2(4, 0));\n      ImGui::SameLine();\n      ImGui::Text(\"%s\", export_entry->name);\n      ImGui::Dummy(ImVec2(0, 1));\n      ImGui::PopID();\n    }\n    ImGui::ListBoxFooter();\n    ImGui::Dummy(ImVec2(0, 3));\n    if (kernel_popup_render_count == 2) {\n      ImGui::SetKeyboardFocusHere();\n    }\n    ImGui::InputText(\n        \"##kernel_call_filter\", state.kernel_call_filter,\n        xe::countof(state.kernel_call_filter),\n        ImGuiInputTextFlags_AutoSelectAll | ImGuiInputTextFlags_CharsNoBlank);\n    ImGui::PopItemWidth();\n    ImGui::EndPopup();\n  } else {\n    kernel_popup_render_count = 0;\n  }\n  ImGui::SameLine();\n  ImGui::Dummy(ImVec2(2, 0));\n  ImGui::SameLine();\n\n  if (ImGui::Button(\"+ GPU\")) {\n    ImGui::OpenPopup(\"##add_gpu_breakpoint\");\n  }\n  if (ImGui::IsItemHovered()) {\n    ImGui::SetTooltip(\"Select active GPU breakpoints.\");\n  }\n  if (ImGui::BeginPopup(\"##add_gpu_breakpoint\")) {\n    ImGui::Text(\"TODO: swap, kick, etc\");\n    ImGui::EndPopup();\n  }\n  ImGui::SameLine();\n  ImGui::Dummy(ImVec2(8, 0));\n  ImGui::SameLine();\n\n  if (ImGui::Button(\"Clear\")) {\n    // Unregister and delete all breakpoints.\n    while (!state.all_breakpoints.empty()) {\n      DeleteCodeBreakpoint(state.all_breakpoints.front().get());\n    }\n  }\n  if (ImGui::IsItemHovered()) {\n    ImGui::SetTooltip(\"Clear all breakpoints.\");\n  }\n  ImGui::EndChild();\n  ImGui::Separator();\n\n  ImGui::PushItemWidth(-1);\n  if (ImGui::ListBoxHeader(\"##empty\",\n                           ImVec2(-1, ImGui::GetContentRegionAvail().y))) {\n    std::vector<Breakpoint*> to_delete;\n    for (auto& breakpoint : state.all_breakpoints) {\n      ImGui::PushID(breakpoint.get());\n      bool is_enabled = breakpoint->is_enabled();\n      if (ImGui::Checkbox(\"##toggle\", &is_enabled)) {\n        breakpoint->set_enabled(is_enabled);\n      }\n      ImGui::SameLine();\n      ImGui::Dummy(ImVec2(4, 0));\n      ImGui::SameLine();\n      auto breakpoint_str = breakpoint->to_string();\n      bool is_selected = false;  // in function/stopped on line?\n      if (ImGui::Selectable(breakpoint_str.c_str(), &is_selected,\n                            ImGuiSelectableFlags_SpanAllColumns)) {\n        auto function = breakpoint->guest_function();\n        assert_not_null(function);\n        if (breakpoint->address_type() == Breakpoint::AddressType::kGuest) {\n          NavigateToFunction(breakpoint->guest_function(),\n                             breakpoint->guest_address(),\n                             function->MapGuestAddressToMachineCode(\n                                 breakpoint->guest_address()));\n        } else {\n          NavigateToFunction(function,\n                             function->MapMachineCodeToGuestAddress(\n                                 breakpoint->host_address()),\n                             breakpoint->host_address());\n        }\n      }\n      if (ImGui::BeginPopupContextItem(\"##breakpoint_context_menu\")) {\n        if (ImGui::MenuItem(\"Delete\")) {\n          to_delete.push_back(breakpoint.get());\n        }\n        ImGui::EndPopup();\n      }\n      ImGui::PopID();\n    }\n    ImGui::ListBoxFooter();\n    if (!to_delete.empty()) {\n      for (auto breakpoint : to_delete) {\n        DeleteCodeBreakpoint(breakpoint);\n      }\n    }\n  }\n  ImGui::PopItemWidth();\n}\n\nvoid DebugWindow::DrawLogPane() {\n  ImGui::Text(\"<log>\");\n  // bar:\n  //   combo for log level\n  //   check combo for areas (cpu/gpu/etc)\n  //   combo for thread checkboxes\n  //   filter text box\n  //   ...\n  //   copy visible button\n  //   follow button\n  //   clear button\n  //   visible lines / total lines\n  // log box:\n  //   line per log line\n  //   if big, click to open dialog with contents\n}\n\nvoid DebugWindow::SelectThreadStackFrame(cpu::ThreadDebugInfo* thread_info,\n                                         size_t stack_frame_index,\n                                         bool always_navigate) {\n  state_.has_changed_thread = false;\n  if (thread_info != state_.thread_info) {\n    state_.has_changed_thread = true;\n    state_.thread_info = thread_info;\n  }\n  if (state_.thread_info) {\n    stack_frame_index =\n        std::min(state_.thread_info->frames.size() - 1, stack_frame_index);\n  }\n  if (stack_frame_index != state_.thread_stack_frame_index) {\n    state_.thread_stack_frame_index = stack_frame_index;\n    state_.has_changed_thread = true;\n  }\n  if (state_.thread_info && state_.thread_info->frames.empty()) {\n    return;\n  }\n  if (state_.thread_info) {\n    auto new_host_pc =\n        state_.thread_info->frames[state_.thread_stack_frame_index].host_pc;\n    if (new_host_pc != state_.last_host_pc) {\n      state_.last_host_pc = new_host_pc;\n      state_.has_changed_pc = true;\n    }\n  }\n  if ((always_navigate || state_.has_changed_thread) && state_.thread_info) {\n    auto& frame = state_.thread_info->frames[state_.thread_stack_frame_index];\n    if (frame.guest_function) {\n      NavigateToFunction(frame.guest_function, frame.guest_pc, frame.host_pc);\n    }\n  }\n}\n\nvoid DebugWindow::NavigateToFunction(cpu::Function* function, uint32_t guest_pc,\n                                     uint64_t host_pc) {\n  state_.function = function;\n  state_.last_host_pc = host_pc;\n  state_.has_changed_pc = true;\n}\n\nvoid DebugWindow::UpdateCache() {\n  auto kernel_state = emulator_->kernel_state();\n  auto object_table = kernel_state->object_table();\n\n  app_context_.CallInUIThread([this]() {\n    std::string title = kBaseTitle;\n    switch (processor_->execution_state()) {\n      case cpu::ExecutionState::kEnded:\n        title += \" (ended)\";\n        break;\n      case cpu::ExecutionState::kPaused:\n        title += \" (paused)\";\n        break;\n      case cpu::ExecutionState::kRunning:\n        title += \" (running)\";\n        break;\n      case cpu::ExecutionState::kStepping:\n        title += \" (stepping)\";\n        break;\n    }\n    window_->SetTitle(title);\n  });\n\n  cache_.is_running =\n      processor_->execution_state() == cpu::ExecutionState::kRunning;\n  if (cache_.is_running) {\n    // Early exit - the rest of the data is kept stale on purpose.\n    return;\n  }\n\n  // Fetch module listing.\n  // We hold refs so that none are unloaded.\n  cache_.modules =\n      object_table->GetObjectsByType<XModule>(XObject::Type::Module);\n\n  cache_.thread_debug_infos = processor_->QueryThreadDebugInfos();\n\n  SelectThreadStackFrame(state_.thread_info, state_.thread_stack_frame_index,\n                         false);\n}\n\nvoid DebugWindow::CreateCodeBreakpoint(Breakpoint::AddressType address_type,\n                                       uint64_t address) {\n  auto& state = state_.breakpoints;\n  auto breakpoint = std::make_unique<Breakpoint>(\n      processor_, address_type, address,\n      [this](Breakpoint* breakpoint, cpu::ThreadDebugInfo* thread_info,\n             uint64_t host_address) {\n        OnBreakpointHit(breakpoint, thread_info);\n      });\n  if (breakpoint->address_type() == Breakpoint::AddressType::kGuest) {\n    auto& map = state.code_breakpoints_by_guest_address;\n    auto it = map.find(breakpoint->guest_address());\n    if (it != map.end()) {\n      // Already exists!\n      return;\n    }\n    map.emplace(breakpoint->guest_address(), breakpoint.get());\n  } else {\n    auto& map = state.code_breakpoints_by_host_address;\n    auto it = map.find(breakpoint->host_address());\n    if (it != map.end()) {\n      // Already exists!\n      return;\n    }\n    map.emplace(breakpoint->host_address(), breakpoint.get());\n  }\n  processor_->AddBreakpoint(breakpoint.get());\n  state.all_breakpoints.emplace_back(std::move(breakpoint));\n}\n\nvoid DebugWindow::DeleteCodeBreakpoint(Breakpoint* breakpoint) {\n  auto& state = state_.breakpoints;\n  for (size_t i = 0; i < state.all_breakpoints.size(); ++i) {\n    if (state.all_breakpoints[i].get() != breakpoint) {\n      continue;\n    }\n    processor_->RemoveBreakpoint(breakpoint);\n    if (breakpoint->address_type() == Breakpoint::AddressType::kGuest) {\n      auto& map = state.code_breakpoints_by_guest_address;\n      auto it = map.find(breakpoint->guest_address());\n      if (it != map.end()) {\n        map.erase(it);\n      }\n    } else {\n      auto& map = state.code_breakpoints_by_host_address;\n      auto it = map.find(breakpoint->host_address());\n      if (it != map.end()) {\n        map.erase(it);\n      }\n    }\n    state.all_breakpoints.erase(state.all_breakpoints.begin() + i);\n    break;\n  }\n}\n\nBreakpoint* DebugWindow::LookupBreakpointAtAddress(\n    Breakpoint::AddressType address_type, uint64_t address) {\n  auto& state = state_.breakpoints;\n  if (address_type == Breakpoint::AddressType::kGuest) {\n    auto& map = state.code_breakpoints_by_guest_address;\n    auto it = map.find(static_cast<uint32_t>(address));\n    return it == map.end() ? nullptr : it->second;\n  } else {\n    auto& map = state.code_breakpoints_by_host_address;\n    auto it = map.find(static_cast<uintptr_t>(address));\n    return it == map.end() ? nullptr : it->second;\n  }\n}\n\nvoid DebugWindow::OnFocus() { Focus(); }\n\nvoid DebugWindow::OnDetached() {\n  UpdateCache();\n\n  // Remove all breakpoints.\n  while (!state_.breakpoints.all_breakpoints.empty()) {\n    DeleteCodeBreakpoint(state_.breakpoints.all_breakpoints.front().get());\n  }\n}\n\nvoid DebugWindow::OnExecutionPaused() {\n  UpdateCache();\n  Focus();\n}\n\nvoid DebugWindow::OnExecutionContinued() {\n  UpdateCache();\n  Focus();\n}\n\nvoid DebugWindow::OnExecutionEnded() {\n  UpdateCache();\n  Focus();\n}\n\nvoid DebugWindow::OnStepCompleted(cpu::ThreadDebugInfo* thread_info) {\n  UpdateCache();\n  SelectThreadStackFrame(thread_info, 0, true);\n  Focus();\n}\n\nvoid DebugWindow::OnBreakpointHit(Breakpoint* breakpoint,\n                                  cpu::ThreadDebugInfo* thread_info) {\n  UpdateCache();\n  SelectThreadStackFrame(thread_info, 0, true);\n  Focus();\n}\n\nvoid DebugWindow::Focus() const {\n  app_context_.CallInUIThread([this]() { window_->Focus(); });\n}\n\n}  // namespace ui\n}  // namespace debug\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/debug/ui/debug_window.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_DEBUG_UI_DEBUG_WINDOW_H_\n#define XENIA_DEBUG_UI_DEBUG_WINDOW_H_\n\n#include <memory>\n#include <vector>\n\n#include \"xenia/base/host_thread_context.h\"\n#include \"xenia/cpu/breakpoint.h\"\n#include \"xenia/cpu/debug_listener.h\"\n#include \"xenia/cpu/processor.h\"\n#include \"xenia/emulator.h\"\n#include \"xenia/ui/imgui_dialog.h\"\n#include \"xenia/ui/imgui_drawer.h\"\n#include \"xenia/ui/immediate_drawer.h\"\n#include \"xenia/ui/menu_item.h\"\n#include \"xenia/ui/presenter.h\"\n#include \"xenia/ui/window.h\"\n#include \"xenia/ui/windowed_app_context.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace debug {\nnamespace ui {\n\nclass DebugWindow : public cpu::DebugListener {\n public:\n  ~DebugWindow();\n\n  static std::unique_ptr<DebugWindow> Create(\n      Emulator* emulator, xe::ui::WindowedAppContext& app_context);\n\n  Emulator* emulator() const { return emulator_; }\n  xe::ui::WindowedAppContext& app_context() const { return app_context_; }\n  xe::ui::Window* window() const { return window_.get(); }\n\n  void OnFocus() override;\n  void OnDetached() override;\n  void OnExecutionPaused() override;\n  void OnExecutionContinued() override;\n  void OnExecutionEnded() override;\n  void OnStepCompleted(cpu::ThreadDebugInfo* thread_info) override;\n  void OnBreakpointHit(cpu::Breakpoint* breakpoint,\n                       cpu::ThreadDebugInfo* thread_info) override;\n\n private:\n  class DebugDialog final : public xe::ui::ImGuiDialog {\n   public:\n    explicit DebugDialog(xe::ui::ImGuiDrawer* imgui_drawer,\n                         DebugWindow& debug_window)\n        : xe::ui::ImGuiDialog(imgui_drawer), debug_window_(debug_window) {}\n\n   protected:\n    void OnDraw(ImGuiIO& io) override;\n\n   private:\n    DebugWindow& debug_window_;\n  };\n\n  explicit DebugWindow(Emulator* emulator,\n                       xe::ui::WindowedAppContext& app_context);\n  bool Initialize();\n\n  void DrawFrame(ImGuiIO& io);\n  void DrawToolbar();\n  void DrawFunctionsPane();\n  void DrawSourcePane();\n  void DrawGuestFunctionSource();\n  void DrawMachineCodeSource(const uint8_t* ptr, size_t length);\n  void DrawBreakpointGutterButton(bool has_breakpoint,\n                                  cpu::Breakpoint::AddressType address_type,\n                                  uint64_t address);\n  void ScrollToSourceIfPcChanged();\n  void DrawRegistersPane();\n  bool DrawRegisterTextBox(int id, uint32_t* value);\n  bool DrawRegisterTextBox(int id, uint64_t* value);\n  bool DrawRegisterTextBox(int id, double* value);\n  bool DrawRegisterTextBoxes(int id, float* value);\n  void DrawThreadsPane();\n  void DrawMemoryPane();\n  void DrawBreakpointsPane();\n  void DrawLogPane();\n\n  void SelectThreadStackFrame(cpu::ThreadDebugInfo* thread_info,\n                              size_t stack_frame_index, bool always_navigate);\n  void NavigateToFunction(cpu::Function* function, uint32_t guest_pc = 0,\n                          uint64_t host_pc = 0);\n  // void NavigateToMemory(uint64_t address, uint64_t length = 0);\n  // void ToggleLogThreadFocus(thread | nullptr);\n\n  void UpdateCache();\n\n  void CreateCodeBreakpoint(cpu::Breakpoint::AddressType address_type,\n                            uint64_t address);\n  void DeleteCodeBreakpoint(cpu::Breakpoint* breakpoint);\n  cpu::Breakpoint* LookupBreakpointAtAddress(\n      cpu::Breakpoint::AddressType address_type, uint64_t address);\n\n  void Focus() const;\n\n  Emulator* emulator_ = nullptr;\n  cpu::Processor* processor_ = nullptr;\n  xe::ui::WindowedAppContext& app_context_;\n  std::unique_ptr<xe::ui::Window> window_;\n  std::unique_ptr<xe::ui::Presenter> presenter_;\n  std::unique_ptr<xe::ui::ImmediateDrawer> immediate_drawer_;\n  std::unique_ptr<xe::ui::ImGuiDrawer> imgui_drawer_;\n  std::unique_ptr<DebugDialog> debug_dialog_;\n\n  uintptr_t capstone_handle_ = 0;\n\n  // Cached debugger data, updated on every break before a frame is drawn.\n  // Prefer putting stuff here that will be queried either each frame or\n  // multiple times per frame to avoid expensive redundant work.\n  struct ImDataCache {\n    bool is_running = false;\n    std::vector<kernel::object_ref<kernel::XModule>> modules;\n    std::vector<cpu::ThreadDebugInfo*> thread_debug_infos;\n  } cache_;\n\n  enum class RegisterGroup {\n    kGuestGeneral,\n    kGuestFloat,\n    kGuestVector,\n    kHostGeneral,\n    kHostVector,\n  };\n\n  // The current state of the UI. Use this to synchronize multiple parts of the\n  // UI.\n  struct ImState {\n    static const int kRightPaneThreads = 0;\n    static const int kRightPaneMemory = 1;\n    int right_pane_tab = kRightPaneThreads;\n\n    cpu::ThreadDebugInfo* thread_info = nullptr;\n    size_t thread_stack_frame_index = 0;\n    bool has_changed_thread = false;\n\n    xe::cpu::Function* function = nullptr;\n    uint64_t last_host_pc = 0;\n    bool has_changed_pc = false;\n    int source_display_mode = 3;\n\n    RegisterGroup register_group = RegisterGroup::kGuestGeneral;\n    bool register_input_hex = true;\n\n    struct {\n      char kernel_call_filter[64] = {0};\n      std::vector<std::unique_ptr<cpu::Breakpoint>> all_breakpoints;\n      std::unordered_map<uint32_t, cpu::Breakpoint*>\n          code_breakpoints_by_guest_address;\n      std::unordered_map<uintptr_t, cpu::Breakpoint*>\n          code_breakpoints_by_host_address;\n    } breakpoints;\n\n    xe::kernel::XThread* isolated_log_thread = nullptr;\n  } state_;\n};\n\n}  // namespace ui\n}  // namespace debug\n}  // namespace xe\n\n#endif  // XENIA_DEBUG_UI_DEBUG_WINDOW_H_\n"
  },
  {
    "path": "src/xenia/debug/ui/premake5.lua",
    "content": "project_root = \"../../../..\"\ninclude(project_root..\"/tools/build\")\n\ngroup(\"src\")\nproject(\"xenia-debug-ui\")\n  uuid(\"9193a274-f4c2-4746-bd85-93fcfc5c3e38\")\n  kind(\"StaticLib\")\n  language(\"C++\")\n  links({\n    \"imgui\",\n    \"xenia-base\",\n    \"xenia-cpu\",\n    \"xenia-ui\",\n  })\n  defines({\n  })\n  includedirs({\n  })\n  local_platform_files()\n"
  },
  {
    "path": "src/xenia/emulator.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/emulator.h\"\n\n#include <algorithm>\n#include <cinttypes>\n\n#include \"config.h\"\n#include \"third_party/fmt/include/fmt/format.h\"\n#include \"xenia/apu/audio_system.h\"\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/byte_stream.h\"\n#include \"xenia/base/clock.h\"\n#include \"xenia/base/cvar.h\"\n#include \"xenia/base/debugging.h\"\n#include \"xenia/base/exception_handler.h\"\n#include \"xenia/base/literals.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/mapped_memory.h\"\n#include \"xenia/base/platform.h\"\n#include \"xenia/base/string.h\"\n#include \"xenia/cpu/backend/code_cache.h\"\n#include \"xenia/cpu/backend/null_backend.h\"\n#include \"xenia/cpu/cpu_flags.h\"\n#include \"xenia/cpu/thread_state.h\"\n#include \"xenia/gpu/graphics_system.h\"\n#include \"xenia/hid/input_driver.h\"\n#include \"xenia/hid/input_system.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/user_module.h\"\n#include \"xenia/kernel/util/gameinfo_utils.h\"\n#include \"xenia/kernel/util/xdbf_utils.h\"\n#include \"xenia/kernel/xam/xam_module.h\"\n#include \"xenia/kernel/xbdm/xbdm_module.h\"\n#include \"xenia/kernel/xboxkrnl/xboxkrnl_module.h\"\n#include \"xenia/memory.h\"\n#include \"xenia/ui/imgui_dialog.h\"\n#include \"xenia/ui/imgui_drawer.h\"\n#include \"xenia/ui/window.h\"\n#include \"xenia/ui/windowed_app_context.h\"\n#include \"xenia/vfs/devices/disc_image_device.h\"\n#include \"xenia/vfs/devices/host_path_device.h\"\n#include \"xenia/vfs/devices/null_device.h\"\n#include \"xenia/vfs/devices/stfs_container_device.h\"\n#include \"xenia/vfs/virtual_file_system.h\"\n\n#if XE_ARCH_AMD64\n#include \"xenia/cpu/backend/x64/x64_backend.h\"\n#endif  // XE_ARCH\n\nDECLARE_int32(user_language);\n\nDEFINE_double(time_scalar, 1.0,\n              \"Scalar used to speed or slow time (1x, 2x, 1/2x, etc).\",\n              \"General\");\nDEFINE_string(\n    launch_module, \"\",\n    \"Executable to launch from the .iso or the package instead of default.xex \"\n    \"or the module specified by the game. Leave blank to launch the default \"\n    \"module.\",\n    \"General\");\n\nnamespace xe {\n\nusing namespace xe::literals;\n\nEmulator::GameConfigLoadCallback::GameConfigLoadCallback(Emulator& emulator)\n    : emulator_(emulator) {\n  emulator_.AddGameConfigLoadCallback(this);\n}\n\nEmulator::GameConfigLoadCallback::~GameConfigLoadCallback() {\n  emulator_.RemoveGameConfigLoadCallback(this);\n}\n\nEmulator::Emulator(const std::filesystem::path& command_line,\n                   const std::filesystem::path& storage_root,\n                   const std::filesystem::path& content_root,\n                   const std::filesystem::path& cache_root)\n    : on_launch(),\n      on_terminate(),\n      on_exit(),\n      command_line_(command_line),\n      storage_root_(storage_root),\n      content_root_(content_root),\n      cache_root_(cache_root),\n      title_name_(),\n      title_version_(),\n      display_window_(nullptr),\n      memory_(),\n      audio_system_(),\n      graphics_system_(),\n      input_system_(),\n      export_resolver_(),\n      file_system_(),\n      kernel_state_(),\n      main_thread_(),\n      title_id_(std::nullopt),\n      paused_(false),\n      restoring_(false),\n      restore_fence_() {}\n\nEmulator::~Emulator() {\n  // Note that we delete things in the reverse order they were initialized.\n\n  // Give the systems time to shutdown before we delete them.\n  if (graphics_system_) {\n    graphics_system_->Shutdown();\n  }\n  if (audio_system_) {\n    audio_system_->Shutdown();\n  }\n\n  input_system_.reset();\n  graphics_system_.reset();\n  audio_system_.reset();\n\n  kernel_state_.reset();\n  file_system_.reset();\n\n  processor_.reset();\n\n  export_resolver_.reset();\n\n  ExceptionHandler::Uninstall(Emulator::ExceptionCallbackThunk, this);\n}\n\nX_STATUS Emulator::Setup(\n    ui::Window* display_window, ui::ImGuiDrawer* imgui_drawer,\n    bool require_cpu_backend,\n    std::function<std::unique_ptr<apu::AudioSystem>(cpu::Processor*)>\n        audio_system_factory,\n    std::function<std::unique_ptr<gpu::GraphicsSystem>()>\n        graphics_system_factory,\n    std::function<std::vector<std::unique_ptr<hid::InputDriver>>(ui::Window*)>\n        input_driver_factory) {\n  X_STATUS result = X_STATUS_UNSUCCESSFUL;\n\n  display_window_ = display_window;\n  imgui_drawer_ = imgui_drawer;\n\n  // Initialize clock.\n  // 360 uses a 50MHz clock.\n  Clock::set_guest_tick_frequency(50000000);\n  // We could reset this with save state data/constant value to help replays.\n  Clock::set_guest_system_time_base(Clock::QueryHostSystemTime());\n  // This can be adjusted dynamically, as well.\n  Clock::set_guest_time_scalar(cvars::time_scalar);\n\n  // Before we can set thread affinity we must enable the process to use all\n  // logical processors.\n  xe::threading::EnableAffinityConfiguration();\n\n  // Create memory system first, as it is required for other systems.\n  memory_ = std::make_unique<Memory>();\n  if (!memory_->Initialize()) {\n    return false;\n  }\n\n  // Shared export resolver used to attach and query for HLE exports.\n  export_resolver_ = std::make_unique<xe::cpu::ExportResolver>();\n\n  std::unique_ptr<xe::cpu::backend::Backend> backend;\n#if XE_ARCH_AMD64\n  if (cvars::cpu == \"x64\") {\n    backend.reset(new xe::cpu::backend::x64::X64Backend());\n  }\n#endif  // XE_ARCH\n  if (cvars::cpu == \"any\") {\n    if (!backend) {\n#if XE_ARCH_AMD64\n      backend.reset(new xe::cpu::backend::x64::X64Backend());\n#endif  // XE_ARCH\n    }\n  }\n  if (!backend && !require_cpu_backend) {\n    backend.reset(new xe::cpu::backend::NullBackend());\n  }\n\n  // Initialize the CPU.\n  processor_ = std::make_unique<xe::cpu::Processor>(memory_.get(),\n                                                    export_resolver_.get());\n  if (!processor_->Setup(std::move(backend))) {\n    return X_STATUS_UNSUCCESSFUL;\n  }\n\n  // Initialize the APU.\n  if (audio_system_factory) {\n    audio_system_ = audio_system_factory(processor_.get());\n    if (!audio_system_) {\n      return X_STATUS_NOT_IMPLEMENTED;\n    }\n  }\n\n  // Initialize the GPU.\n  graphics_system_ = graphics_system_factory();\n  if (!graphics_system_) {\n    return X_STATUS_NOT_IMPLEMENTED;\n  }\n\n  // Initialize the HID.\n  input_system_ = std::make_unique<xe::hid::InputSystem>(display_window_);\n  if (!input_system_) {\n    return X_STATUS_NOT_IMPLEMENTED;\n  }\n  if (input_driver_factory) {\n    auto input_drivers = input_driver_factory(display_window_);\n    for (size_t i = 0; i < input_drivers.size(); ++i) {\n      auto& input_driver = input_drivers[i];\n      input_driver->set_is_active_callback(\n          []() -> bool { return !xe::kernel::xam::xeXamIsUIActive(); });\n      input_system_->AddDriver(std::move(input_driver));\n    }\n  }\n\n  result = input_system_->Setup();\n  if (result) {\n    return result;\n  }\n\n  // Bring up the virtual filesystem used by the kernel.\n  file_system_ = std::make_unique<xe::vfs::VirtualFileSystem>();\n\n  // Shared kernel state.\n  kernel_state_ = std::make_unique<xe::kernel::KernelState>(this);\n\n  // Setup the core components.\n  result = graphics_system_->Setup(\n      processor_.get(), kernel_state_.get(),\n      display_window_ ? &display_window_->app_context() : nullptr,\n      display_window_ != nullptr);\n  if (result) {\n    return result;\n  }\n\n  if (audio_system_) {\n    result = audio_system_->Setup(kernel_state_.get());\n    if (result) {\n      return result;\n    }\n  }\n\n#define LOAD_KERNEL_MODULE(t) \\\n  static_cast<void>(kernel_state_->LoadKernelModule<kernel::t>())\n  // HLE kernel modules.\n  LOAD_KERNEL_MODULE(xboxkrnl::XboxkrnlModule);\n  LOAD_KERNEL_MODULE(xam::XamModule);\n  LOAD_KERNEL_MODULE(xbdm::XbdmModule);\n#undef LOAD_KERNEL_MODULE\n\n  // Initialize emulator fallback exception handling last.\n  ExceptionHandler::Install(Emulator::ExceptionCallbackThunk, this);\n\n  return result;\n}\n\nX_STATUS Emulator::TerminateTitle() {\n  if (!is_title_open()) {\n    return X_STATUS_UNSUCCESSFUL;\n  }\n\n  kernel_state_->TerminateTitle();\n  title_id_ = std::nullopt;\n  title_name_ = \"\";\n  title_version_ = \"\";\n  on_terminate();\n  return X_STATUS_SUCCESS;\n}\n\nX_STATUS Emulator::LaunchPath(const std::filesystem::path& path) {\n  // Launch based on file type.\n  // This is a silly guess based on file extension.\n  if (!path.has_extension()) {\n    // Likely an STFS container.\n    return LaunchStfsContainer(path);\n  };\n  auto extension = xe::utf8::lower_ascii(xe::path_to_utf8(path.extension()));\n  if (extension == \".xex\" || extension == \".elf\" || extension == \".exe\") {\n    // Treat as a naked xex file.\n    return LaunchXexFile(path);\n  } else {\n    // Assume a disc image.\n    return LaunchDiscImage(path);\n  }\n}\n\nX_STATUS Emulator::LaunchXexFile(const std::filesystem::path& path) {\n  // We create a virtual filesystem pointing to its directory and symlink\n  // that to the game filesystem.\n  // e.g., /my/files/foo.xex will get a local fs at:\n  // \\\\Device\\\\Harddisk0\\\\Partition1\n  // and then get that symlinked to game:\\, so\n  // -> game:\\foo.xex\n\n  auto mount_path = \"\\\\Device\\\\Harddisk0\\\\Partition1\";\n\n  // Register the local directory in the virtual filesystem.\n  auto parent_path = path.parent_path();\n  auto device =\n      std::make_unique<vfs::HostPathDevice>(mount_path, parent_path, true);\n  if (!device->Initialize()) {\n    XELOGE(\"Unable to scan host path\");\n    return X_STATUS_NO_SUCH_FILE;\n  }\n  if (!file_system_->RegisterDevice(std::move(device))) {\n    XELOGE(\"Unable to register host path\");\n    return X_STATUS_NO_SUCH_FILE;\n  }\n\n  // Create symlinks to the device.\n  file_system_->RegisterSymbolicLink(\"game:\", mount_path);\n  file_system_->RegisterSymbolicLink(\"d:\", mount_path);\n\n  // Get just the filename (foo.xex).\n  auto file_name = path.filename();\n\n  // Launch the game.\n  auto fs_path = \"game:\\\\\" + xe::path_to_utf8(file_name);\n  return CompleteLaunch(path, fs_path);\n}\n\nX_STATUS Emulator::LaunchDiscImage(const std::filesystem::path& path) {\n  auto mount_path = \"\\\\Device\\\\Cdrom0\";\n\n  // Register the disc image in the virtual filesystem.\n  auto device = std::make_unique<vfs::DiscImageDevice>(mount_path, path);\n  if (!device->Initialize()) {\n    xe::FatalError(\"Unable to mount disc image; file not found or corrupt.\");\n    return X_STATUS_NO_SUCH_FILE;\n  }\n  if (!file_system_->RegisterDevice(std::move(device))) {\n    xe::FatalError(\"Unable to register disc image.\");\n    return X_STATUS_NO_SUCH_FILE;\n  }\n\n  // Create symlinks to the device.\n  file_system_->RegisterSymbolicLink(\"game:\", mount_path);\n  file_system_->RegisterSymbolicLink(\"d:\", mount_path);\n\n  // Launch the game.\n  auto module_path(FindLaunchModule());\n  return CompleteLaunch(path, module_path);\n}\n\nX_STATUS Emulator::LaunchStfsContainer(const std::filesystem::path& path) {\n  auto mount_path = \"\\\\Device\\\\Cdrom0\";\n\n  // Register the container in the virtual filesystem.\n  auto device = std::make_unique<vfs::StfsContainerDevice>(mount_path, path);\n  if (!device->Initialize()) {\n    xe::FatalError(\n        \"Unable to mount STFS container; file not found or corrupt.\");\n    return X_STATUS_NO_SUCH_FILE;\n  }\n  if (!file_system_->RegisterDevice(std::move(device))) {\n    xe::FatalError(\"Unable to register STFS container.\");\n    return X_STATUS_NO_SUCH_FILE;\n  }\n\n  file_system_->RegisterSymbolicLink(\"game:\", mount_path);\n  file_system_->RegisterSymbolicLink(\"d:\", mount_path);\n\n  // Launch the game.\n  auto module_path(FindLaunchModule());\n  return CompleteLaunch(path, module_path);\n}\n\nvoid Emulator::Pause() {\n  if (paused_) {\n    return;\n  }\n  paused_ = true;\n\n  // Don't hold the lock on this (so any waits follow through)\n  graphics_system_->Pause();\n  audio_system_->Pause();\n\n  auto lock = global_critical_region::AcquireDirect();\n  auto threads =\n      kernel_state()->object_table()->GetObjectsByType<kernel::XThread>(\n          kernel::XObject::Type::Thread);\n  auto current_thread = kernel::XThread::IsInThread()\n                            ? kernel::XThread::GetCurrentThread()\n                            : nullptr;\n  for (auto thread : threads) {\n    // Don't pause ourself or host threads.\n    if (thread == current_thread || !thread->can_debugger_suspend()) {\n      continue;\n    }\n\n    if (thread->is_running()) {\n      thread->thread()->Suspend(nullptr);\n    }\n  }\n\n  XELOGD(\"! EMULATOR PAUSED !\");\n}\n\nvoid Emulator::Resume() {\n  if (!paused_) {\n    return;\n  }\n  paused_ = false;\n  XELOGD(\"! EMULATOR RESUMED !\");\n\n  graphics_system_->Resume();\n  audio_system_->Resume();\n\n  auto threads =\n      kernel_state()->object_table()->GetObjectsByType<kernel::XThread>(\n          kernel::XObject::Type::Thread);\n  for (auto thread : threads) {\n    if (!thread->can_debugger_suspend()) {\n      // Don't pause host threads.\n      continue;\n    }\n\n    if (thread->is_running()) {\n      thread->thread()->Resume(nullptr);\n    }\n  }\n}\n\nbool Emulator::SaveToFile(const std::filesystem::path& path) {\n  Pause();\n\n  filesystem::CreateEmptyFile(path);\n  auto map = MappedMemory::Open(path, MappedMemory::Mode::kReadWrite, 0, 2_GiB);\n  if (!map) {\n    return false;\n  }\n\n  // Save the emulator state to a file\n  ByteStream stream(map->data(), map->size());\n  stream.Write(kEmulatorSaveSignature);\n  stream.Write(title_id_.has_value());\n  if (title_id_.has_value()) {\n    stream.Write(title_id_.value());\n  }\n\n  // It's important we don't hold the global lock here! XThreads need to step\n  // forward (possibly through guarded regions) without worry!\n  processor_->Save(&stream);\n  graphics_system_->Save(&stream);\n  audio_system_->Save(&stream);\n  kernel_state_->Save(&stream);\n  memory_->Save(&stream);\n  map->Close(stream.offset());\n\n  Resume();\n  return true;\n}\n\nbool Emulator::RestoreFromFile(const std::filesystem::path& path) {\n  // Restore the emulator state from a file\n  auto map = MappedMemory::Open(path, MappedMemory::Mode::kReadWrite);\n  if (!map) {\n    return false;\n  }\n\n  restoring_ = true;\n\n  // Terminate any loaded titles.\n  Pause();\n  kernel_state_->TerminateTitle();\n\n  auto lock = global_critical_region::AcquireDirect();\n  ByteStream stream(map->data(), map->size());\n  if (stream.Read<uint32_t>() != kEmulatorSaveSignature) {\n    return false;\n  }\n\n  auto has_title_id = stream.Read<bool>();\n  std::optional<uint32_t> title_id;\n  if (!has_title_id) {\n    title_id = {};\n  } else {\n    title_id = stream.Read<uint32_t>();\n  }\n  if (title_id_.has_value() != title_id.has_value() ||\n      title_id_.value() != title_id.value()) {\n    // Swapping between titles is unsupported at the moment.\n    assert_always();\n    return false;\n  }\n\n  if (!processor_->Restore(&stream)) {\n    XELOGE(\"Could not restore processor!\");\n    return false;\n  }\n  if (!graphics_system_->Restore(&stream)) {\n    XELOGE(\"Could not restore graphics system!\");\n    return false;\n  }\n  if (!audio_system_->Restore(&stream)) {\n    XELOGE(\"Could not restore audio system!\");\n    return false;\n  }\n  if (!kernel_state_->Restore(&stream)) {\n    XELOGE(\"Could not restore kernel state!\");\n    return false;\n  }\n  if (!memory_->Restore(&stream)) {\n    XELOGE(\"Could not restore memory!\");\n    return false;\n  }\n\n  // Update the main thread.\n  auto threads =\n      kernel_state_->object_table()->GetObjectsByType<kernel::XThread>();\n  for (auto thread : threads) {\n    if (thread->main_thread()) {\n      main_thread_ = thread;\n      break;\n    }\n  }\n\n  Resume();\n\n  restore_fence_.Signal();\n  restoring_ = false;\n\n  return true;\n}\n\nbool Emulator::TitleRequested() {\n  auto xam = kernel_state()->GetKernelModule<kernel::xam::XamModule>(\"xam.xex\");\n  return xam->loader_data().launch_data_present;\n}\n\nvoid Emulator::LaunchNextTitle() {\n  auto xam = kernel_state()->GetKernelModule<kernel::xam::XamModule>(\"xam.xex\");\n  auto next_title = xam->loader_data().launch_path;\n\n  CompleteLaunch(\"\", next_title);\n}\n\nbool Emulator::ExceptionCallbackThunk(Exception* ex, void* data) {\n  return reinterpret_cast<Emulator*>(data)->ExceptionCallback(ex);\n}\n\nbool Emulator::ExceptionCallback(Exception* ex) {\n  // Check to see if the exception occurred in guest code.\n  auto code_cache = processor()->backend()->code_cache();\n  auto code_base = code_cache->execute_base_address();\n  auto code_end = code_base + code_cache->total_size();\n\n  if (!processor()->is_debugger_attached() && debugging::IsDebuggerAttached()) {\n    // If Xenia's debugger isn't attached but another one is, pass it to that\n    // debugger.\n    return false;\n  } else if (processor()->is_debugger_attached()) {\n    // Let the debugger handle this exception. It may decide to continue past it\n    // (if it was a stepping breakpoint, etc).\n    return processor()->OnUnhandledException(ex);\n  }\n\n  if (!(ex->pc() >= code_base && ex->pc() < code_end)) {\n    // Didn't occur in guest code. Let it pass.\n    return false;\n  }\n\n  // Within range. Pause the emulator and eat the exception.\n  Pause();\n\n  // Dump information into the log.\n  auto current_thread = kernel::XThread::GetCurrentThread();\n  assert_not_null(current_thread);\n\n  auto guest_function = code_cache->LookupFunction(ex->pc());\n  assert_not_null(guest_function);\n\n  auto context = current_thread->thread_state()->context();\n\n  XELOGE(\"==== CRASH DUMP ====\");\n  XELOGE(\"Thread ID (Host: 0x{:08X} / Guest: 0x{:08X})\",\n         current_thread->thread()->system_id(), current_thread->thread_id());\n  XELOGE(\"Thread Handle: 0x{:08X}\", current_thread->handle());\n  XELOGE(\"PC: 0x{:08X}\",\n         guest_function->MapMachineCodeToGuestAddress(ex->pc()));\n  XELOGE(\"Registers:\");\n  for (int i = 0; i < 32; i++) {\n    XELOGE(\" r{:<3} = {:016X}\", i, context->r[i]);\n  }\n  for (int i = 0; i < 32; i++) {\n    XELOGE(\" f{:<3} = {:016X} = (double){} = (float){}\", i,\n           *reinterpret_cast<uint64_t*>(&context->f[i]), context->f[i],\n           *(float*)&context->f[i]);\n  }\n  for (int i = 0; i < 128; i++) {\n    XELOGE(\" v{:<3} = [0x{:08X}, 0x{:08X}, 0x{:08X}, 0x{:08X}]\", i,\n           context->v[i].u32[0], context->v[i].u32[1], context->v[i].u32[2],\n           context->v[i].u32[3]);\n  }\n\n  // Display a dialog telling the user the guest has crashed.\n  if (display_window_ && imgui_drawer_) {\n    display_window_->app_context().CallInUIThreadSynchronous([this]() {\n      xe::ui::ImGuiDialog::ShowMessageBox(\n          imgui_drawer_, \"Uh-oh!\",\n          \"The guest has crashed.\\n\\n\"\n          \"\"\n          \"Xenia has now paused itself.\\n\"\n          \"A crash dump has been written into the log.\");\n    });\n  }\n\n  // Now suspend ourself (we should be a guest thread).\n  current_thread->Suspend(nullptr);\n\n  // We should not arrive here!\n  assert_always();\n  return false;\n}\n\nvoid Emulator::WaitUntilExit() {\n  while (true) {\n    if (main_thread_) {\n      xe::threading::Wait(main_thread_->thread(), false);\n    }\n\n    if (restoring_) {\n      restore_fence_.Wait();\n    } else {\n      // Not restoring and the thread exited. We're finished.\n      break;\n    }\n  }\n\n  on_exit();\n}\n\nvoid Emulator::AddGameConfigLoadCallback(GameConfigLoadCallback* callback) {\n  assert_not_null(callback);\n  // Game config load callbacks handling is entirely in the UI thread.\n  assert_true(!display_window_ ||\n              display_window_->app_context().IsInUIThread());\n  // Check if already added.\n  if (std::find(game_config_load_callbacks_.cbegin(),\n                game_config_load_callbacks_.cend(),\n                callback) != game_config_load_callbacks_.cend()) {\n    return;\n  }\n  game_config_load_callbacks_.push_back(callback);\n}\n\nvoid Emulator::RemoveGameConfigLoadCallback(GameConfigLoadCallback* callback) {\n  assert_not_null(callback);\n  // Game config load callbacks handling is entirely in the UI thread.\n  assert_true(!display_window_ ||\n              display_window_->app_context().IsInUIThread());\n  auto it = std::find(game_config_load_callbacks_.cbegin(),\n                      game_config_load_callbacks_.cend(), callback);\n  if (it == game_config_load_callbacks_.cend()) {\n    return;\n  }\n  if (game_config_load_callback_loop_next_index_ != SIZE_MAX) {\n    // Actualize the next callback index after the erasure from the vector.\n    size_t existing_index =\n        size_t(std::distance(game_config_load_callbacks_.cbegin(), it));\n    if (game_config_load_callback_loop_next_index_ > existing_index) {\n      --game_config_load_callback_loop_next_index_;\n    }\n  }\n  game_config_load_callbacks_.erase(it);\n}\n\nstd::string Emulator::FindLaunchModule() {\n  std::string path(\"game:\\\\\");\n\n  if (!cvars::launch_module.empty()) {\n    return path + cvars::launch_module;\n  }\n\n  std::string default_module(\"default.xex\");\n\n  auto gameinfo_entry(file_system_->ResolvePath(path + \"GameInfo.bin\"));\n  if (gameinfo_entry) {\n    vfs::File* file = nullptr;\n    X_STATUS result =\n        gameinfo_entry->Open(vfs::FileAccess::kGenericRead, &file);\n    if (XSUCCEEDED(result)) {\n      std::vector<uint8_t> buffer(gameinfo_entry->size());\n      size_t bytes_read = 0;\n      result = file->ReadSync(buffer.data(), buffer.size(), 0, &bytes_read);\n      if (XSUCCEEDED(result)) {\n        kernel::util::GameInfo info(buffer);\n        if (info.is_valid()) {\n          XELOGI(\"Found virtual title {}\", info.virtual_title_id());\n\n          const std::string xna_id(\"584E07D1\");\n          auto xna_id_entry(file_system_->ResolvePath(path + xna_id));\n          if (xna_id_entry) {\n            default_module = xna_id + \"\\\\\" + info.module_name();\n          } else {\n            XELOGE(\"Could not find fixed XNA path {}\", xna_id);\n          }\n        }\n      }\n    }\n  }\n\n  return path + default_module;\n}\n\nstatic std::string format_version(xex2_version version) {\n  // fmt::format doesn't like bit fields\n  uint32_t major, minor, build, qfe;\n  major = version.major;\n  minor = version.minor;\n  build = version.build;\n  qfe = version.qfe;\n  if (qfe) {\n    return fmt::format(\"{}.{}.{}.{}\", major, minor, build, qfe);\n  }\n  if (build) {\n    return fmt::format(\"{}.{}.{}\", major, minor, build);\n  }\n  return fmt::format(\"{}.{}\", major, minor);\n}\n\nX_STATUS Emulator::CompleteLaunch(const std::filesystem::path& path,\n                                  const std::string_view module_path) {\n  // Making changes to the UI (setting the icon) and executing game config load\n  // callbacks which expect to be called from the UI thread.\n  assert_true(display_window_->app_context().IsInUIThread());\n\n  // Setup NullDevices for raw HDD partition accesses\n  // Cache/STFC code baked into games tries reading/writing to these\n  // By using a NullDevice that just returns success to all IO requests it\n  // should allow games to believe cache/raw disk was accessed successfully\n\n  // NOTE: this should probably be moved to xenia_main.cc, but right now we need\n  // to register the \\Device\\Harddisk0\\ NullDevice _after_ the\n  // \\Device\\Harddisk0\\Partition1 HostPathDevice, otherwise requests to\n  // Partition1 will go to this. Registering during CompleteLaunch allows us to\n  // make sure any HostPathDevices are ready beforehand.\n  // (see comment above cache:\\ device registration for more info about why)\n  auto null_paths = {std::string(\"\\\\Partition0\"), std::string(\"\\\\Cache0\"),\n                     std::string(\"\\\\Cache1\")};\n  auto null_device =\n      std::make_unique<vfs::NullDevice>(\"\\\\Device\\\\Harddisk0\", null_paths);\n  if (null_device->Initialize()) {\n    file_system_->RegisterDevice(std::move(null_device));\n  }\n\n  // Reset state.\n  title_id_ = std::nullopt;\n  title_name_ = \"\";\n  title_version_ = \"\";\n  display_window_->SetIcon(nullptr, 0);\n\n  // Allow xam to request module loads.\n  auto xam = kernel_state()->GetKernelModule<kernel::xam::XamModule>(\"xam.xex\");\n\n  XELOGI(\"Launching module {}\", module_path);\n  auto module = kernel_state_->LoadUserModule(module_path);\n  if (!module) {\n    XELOGE(\"Failed to load user module {}\", xe::path_to_utf8(path));\n    return X_STATUS_NOT_FOUND;\n  }\n\n  // Grab the current title ID.\n  xex2_opt_execution_info* info = nullptr;\n  module->GetOptHeader(XEX_HEADER_EXECUTION_INFO, &info);\n\n  if (!info) {\n    title_id_ = 0;\n  } else {\n    title_id_ = info->title_id;\n    auto title_version = info->version();\n    if (title_version.value != 0) {\n      title_version_ = format_version(title_version);\n    }\n  }\n\n  // Try and load the resource database (xex only).\n  if (module->title_id()) {\n    auto title_id = fmt::format(\"{:08X}\", module->title_id());\n\n    // Load the per-game configuration file and make sure updates are handled by\n    // the callbacks.\n    config::LoadGameConfig(title_id);\n    assert_true(game_config_load_callback_loop_next_index_ == SIZE_MAX);\n    game_config_load_callback_loop_next_index_ = 0;\n    while (game_config_load_callback_loop_next_index_ <\n           game_config_load_callbacks_.size()) {\n      game_config_load_callbacks_[game_config_load_callback_loop_next_index_++]\n          ->PostGameConfigLoad();\n    }\n    game_config_load_callback_loop_next_index_ = SIZE_MAX;\n\n    const kernel::util::XdbfGameData db = kernel_state_->module_xdbf(module);\n    if (db.is_valid()) {\n      XLanguage language =\n          db.GetExistingLanguage(static_cast<XLanguage>(cvars::user_language));\n      title_name_ = db.title(language);\n\n      XELOGI(\"-------------------- ACHIEVEMENTS --------------------\");\n      const std::vector<kernel::util::XdbfAchievementTableEntry>\n          achievement_list = db.GetAchievements();\n      for (const kernel::util::XdbfAchievementTableEntry& entry :\n           achievement_list) {\n        std::string label = db.GetStringTableEntry(language, entry.label_id);\n        std::string desc =\n            db.GetStringTableEntry(language, entry.description_id);\n\n        XELOGI(\"{} - {} - {} - {}\", entry.id, label, desc, entry.gamerscore);\n      }\n      XELOGI(\"----------------- END OF ACHIEVEMENTS ----------------\");\n\n      auto icon_block = db.icon();\n      if (icon_block) {\n        display_window_->SetIcon(icon_block.buffer, icon_block.size);\n      }\n    }\n  }\n\n  // Initializing the shader storage in a blocking way so the user doesn't miss\n  // the initial seconds - for instance, sound from an intro video may start\n  // playing before the video can be seen if doing this in parallel with the\n  // main thread.\n  on_shader_storage_initialization(true);\n  graphics_system_->InitializeShaderStorage(cache_root_, title_id_.value(),\n                                            true);\n  on_shader_storage_initialization(false);\n\n  auto main_thread = kernel_state_->LaunchModule(module);\n  if (!main_thread) {\n    return X_STATUS_UNSUCCESSFUL;\n  }\n  main_thread_ = main_thread;\n  on_launch(title_id_.value(), title_name_);\n\n  return X_STATUS_SUCCESS;\n}\n\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/emulator.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_EMULATOR_H_\n#define XENIA_EMULATOR_H_\n\n#include <cstddef>\n#include <cstdint>\n#include <functional>\n#include <optional>\n#include <string>\n#include <vector>\n\n#include \"xenia/base/delegate.h\"\n#include \"xenia/base/exception_handler.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/memory.h\"\n#include \"xenia/vfs/virtual_file_system.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace apu {\nclass AudioSystem;\n}  // namespace apu\nnamespace cpu {\nclass ExportResolver;\nclass Processor;\nclass ThreadState;\n}  // namespace cpu\nnamespace gpu {\nclass GraphicsSystem;\n}  // namespace gpu\nnamespace hid {\nclass InputDriver;\nclass InputSystem;\n}  // namespace hid\nnamespace ui {\nclass ImGuiDrawer;\nclass Window;\n}  // namespace ui\n}  // namespace xe\n\nnamespace xe {\n\nconstexpr fourcc_t kEmulatorSaveSignature = make_fourcc(\"XSAV\");\n\n// The main type that runs the whole emulator.\n// This is responsible for initializing and managing all the various subsystems.\nclass Emulator {\n public:\n  // This is the class for the top-level callbacks. They may be called in an\n  // undefined order, so among them there must be no dependencies on each other,\n  // especially hierarchical ones. If hierarchical handling is needed, for\n  // instance, if a specific implementation of a subsystem needs to handle\n  // changes, but the entire implementation must be reloaded, the implementation\n  // in this example _must not_ register / unregister its own callback - rather,\n  // the proper ordering and hierarchy should be constructed in a single\n  // callback (in this example, for the whole subsystem).\n  //\n  // All callbacks must be created and destroyed in the UI thread only (or the\n  // thread that takes its place in the architecture of the specific app if\n  // there's no UI), as they are invoked in the UI thread.\n  class GameConfigLoadCallback {\n   public:\n    GameConfigLoadCallback(Emulator& emulator);\n    GameConfigLoadCallback(const GameConfigLoadCallback& callback) = delete;\n    GameConfigLoadCallback& operator=(const GameConfigLoadCallback& callback) =\n        delete;\n    virtual ~GameConfigLoadCallback();\n\n    // The callback is invoked in the UI thread (or the thread that takes its\n    // place in the architecture of the specific app if there's no UI).\n    virtual void PostGameConfigLoad() = 0;\n\n   protected:\n    Emulator& emulator() const { return emulator_; }\n\n   private:\n    Emulator& emulator_;\n  };\n\n  explicit Emulator(const std::filesystem::path& command_line,\n                    const std::filesystem::path& storage_root,\n                    const std::filesystem::path& content_root,\n                    const std::filesystem::path& cache_root);\n  ~Emulator();\n\n  // Full command line used when launching the process.\n  const std::filesystem::path& command_line() const { return command_line_; }\n\n  // Folder persistent internal emulator data is stored in.\n  const std::filesystem::path& storage_root() const { return storage_root_; }\n\n  // Folder guest content is stored in.\n  const std::filesystem::path& content_root() const { return content_root_; }\n\n  // Folder files safe to remove without significant side effects are stored in.\n  const std::filesystem::path& cache_root() const { return cache_root_; }\n\n  // Name of the title in the default language.\n  const std::string& title_name() const { return title_name_; }\n\n  // Version of the title as a string.\n  const std::string& title_version() const { return title_version_; }\n\n  // Currently running title ID\n  uint32_t title_id() const {\n    return !title_id_.has_value() ? 0 : title_id_.value();\n  }\n\n  // Are we currently running a title?\n  bool is_title_open() const { return title_id_.has_value(); }\n\n  // Window used for displaying graphical output. Can be null.\n  ui::Window* display_window() const { return display_window_; }\n\n  // ImGui drawer for various kinds of dialogs requested by the guest. Can be\n  // null.\n  ui::ImGuiDrawer* imgui_drawer() const { return imgui_drawer_; }\n\n  // Guest memory system modelling the RAM (both virtual and physical) of the\n  // system.\n  Memory* memory() const { return memory_.get(); }\n\n  // Virtualized processor that can execute PPC code.\n  cpu::Processor* processor() const { return processor_.get(); }\n\n  // Audio hardware emulation for decoding and playback.\n  apu::AudioSystem* audio_system() const { return audio_system_.get(); }\n\n  // GPU emulation for command list processing.\n  gpu::GraphicsSystem* graphics_system() const {\n    return graphics_system_.get();\n  }\n\n  // Human-interface Device (HID) adapters for controllers.\n  hid::InputSystem* input_system() const { return input_system_.get(); }\n\n  // Kernel function export table used to resolve exports when JITing code.\n  cpu::ExportResolver* export_resolver() const {\n    return export_resolver_.get();\n  }\n\n  // File systems mapped to disc images, folders, etc for games and save data.\n  vfs::VirtualFileSystem* file_system() const { return file_system_.get(); }\n\n  // The 'kernel', tracking all kernel objects and other state.\n  // This is effectively the guest operating system.\n  kernel::KernelState* kernel_state() const { return kernel_state_.get(); }\n\n  // Initializes the emulator and configures all components.\n  // The given window is used for display and the provided functions are used\n  // to create subsystems as required.\n  // Once this function returns a game can be launched using one of the Launch\n  // functions.\n  X_STATUS Setup(\n      ui::Window* display_window, ui::ImGuiDrawer* imgui_drawer,\n      bool require_cpu_backend,\n      std::function<std::unique_ptr<apu::AudioSystem>(cpu::Processor*)>\n          audio_system_factory,\n      std::function<std::unique_ptr<gpu::GraphicsSystem>()>\n          graphics_system_factory,\n      std::function<std::vector<std::unique_ptr<hid::InputDriver>>(ui::Window*)>\n          input_driver_factory);\n\n  // Terminates the currently running title.\n  X_STATUS TerminateTitle();\n\n  // Launches a game from the given file path.\n  // This will attempt to infer the type of the given file (such as an iso, etc)\n  // using heuristics.\n  X_STATUS LaunchPath(const std::filesystem::path& path);\n\n  // Launches a game from a .xex file by mounting the containing folder as if it\n  // was an extracted STFS container.\n  X_STATUS LaunchXexFile(const std::filesystem::path& path);\n\n  // Launches a game from a disc image file (.iso, etc).\n  X_STATUS LaunchDiscImage(const std::filesystem::path& path);\n\n  // Launches a game from an STFS container file.\n  X_STATUS LaunchStfsContainer(const std::filesystem::path& path);\n\n  void Pause();\n  void Resume();\n  bool is_paused() const { return paused_; }\n\n  bool SaveToFile(const std::filesystem::path& path);\n  bool RestoreFromFile(const std::filesystem::path& path);\n\n  // The game can request another title to be loaded.\n  bool TitleRequested();\n  void LaunchNextTitle();\n\n  void WaitUntilExit();\n\n public:\n  xe::Delegate<uint32_t, const std::string_view> on_launch;\n  xe::Delegate<bool> on_shader_storage_initialization;\n  xe::Delegate<> on_terminate;\n  xe::Delegate<> on_exit;\n\n private:\n  static bool ExceptionCallbackThunk(Exception* ex, void* data);\n  bool ExceptionCallback(Exception* ex);\n\n  void AddGameConfigLoadCallback(GameConfigLoadCallback* callback);\n  void RemoveGameConfigLoadCallback(GameConfigLoadCallback* callback);\n\n  std::string FindLaunchModule();\n\n  X_STATUS CompleteLaunch(const std::filesystem::path& path,\n                          const std::string_view module_path);\n\n  std::filesystem::path command_line_;\n  std::filesystem::path storage_root_;\n  std::filesystem::path content_root_;\n  std::filesystem::path cache_root_;\n\n  std::string title_name_;\n  std::string title_version_;\n\n  ui::Window* display_window_ = nullptr;\n  ui::ImGuiDrawer* imgui_drawer_ = nullptr;\n\n  std::unique_ptr<Memory> memory_;\n\n  std::unique_ptr<cpu::Processor> processor_;\n  std::unique_ptr<apu::AudioSystem> audio_system_;\n  std::unique_ptr<gpu::GraphicsSystem> graphics_system_;\n  std::unique_ptr<hid::InputSystem> input_system_;\n\n  std::unique_ptr<cpu::ExportResolver> export_resolver_;\n  std::unique_ptr<vfs::VirtualFileSystem> file_system_;\n\n  std::unique_ptr<kernel::KernelState> kernel_state_;\n\n  // Accessible only from the thread that invokes those callbacks (the UI thread\n  // if the UI is available).\n  std::vector<GameConfigLoadCallback*> game_config_load_callbacks_;\n  // Using an index, not an iterator, because after the erasure, the adjustment\n  // must be done for the vector element indices that would be in the iterator\n  // range that would be invalidated.\n  // SIZE_MAX if not currently in the game config load callback loop.\n  size_t game_config_load_callback_loop_next_index_ = SIZE_MAX;\n\n  kernel::object_ref<kernel::XThread> main_thread_;\n  std::optional<uint32_t> title_id_;  // Currently running title ID\n\n  bool paused_;\n  bool restoring_;\n  threading::Fence restore_fence_;  // Fired on restore finish.\n};\n\n}  // namespace xe\n\n#endif  // XENIA_EMULATOR_H_\n"
  },
  {
    "path": "src/xenia/gpu/command_processor.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/command_processor.h\"\n\n#include <algorithm>\n#include <cinttypes>\n#include <cmath>\n#include <cstring>\n\n#include \"third_party/fmt/include/fmt/format.h\"\n#include \"xenia/base/byte_stream.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/memory.h\"\n#include \"xenia/base/profiling.h\"\n#include \"xenia/base/ring_buffer.h\"\n#include \"xenia/gpu/gpu_flags.h\"\n#include \"xenia/gpu/graphics_system.h\"\n#include \"xenia/gpu/sampler_info.h\"\n#include \"xenia/gpu/texture_info.h\"\n#include \"xenia/gpu/xenos.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/user_module.h\"\n\nnamespace xe {\nnamespace gpu {\n\nusing namespace xe::gpu::xenos;\n\nCommandProcessor::CommandProcessor(GraphicsSystem* graphics_system,\n                                   kernel::KernelState* kernel_state)\n    : memory_(graphics_system->memory()),\n      kernel_state_(kernel_state),\n      graphics_system_(graphics_system),\n      register_file_(graphics_system_->register_file()),\n      trace_writer_(graphics_system->memory()->physical_membase()),\n      worker_running_(true),\n      write_ptr_index_event_(xe::threading::Event::CreateAutoResetEvent(false)),\n      write_ptr_index_(0) {\n  assert_not_null(write_ptr_index_event_);\n}\n\nCommandProcessor::~CommandProcessor() = default;\n\nbool CommandProcessor::Initialize() {\n  // Initialize the gamma ramps to their default (linear) values - taken from\n  // what games set when starting with the sRGB (return value 1)\n  // VdGetCurrentDisplayGamma.\n  for (uint32_t i = 0; i < 256; ++i) {\n    uint32_t value = i * 0x3FF / 0xFF;\n    reg::DC_LUT_30_COLOR& gamma_ramp_entry = gamma_ramp_256_entry_table_[i];\n    gamma_ramp_entry.color_10_blue = value;\n    gamma_ramp_entry.color_10_green = value;\n    gamma_ramp_entry.color_10_red = value;\n  }\n  for (uint32_t i = 0; i < 128; ++i) {\n    reg::DC_LUT_PWL_DATA gamma_ramp_entry = {};\n    gamma_ramp_entry.base = (i * 0xFFFF / 0x7F) & ~UINT32_C(0x3F);\n    gamma_ramp_entry.delta = i < 0x7F ? 0x200 : 0;\n    for (uint32_t j = 0; j < 3; ++j) {\n      gamma_ramp_pwl_rgb_[i][j] = gamma_ramp_entry;\n    }\n  }\n\n  worker_running_ = true;\n  worker_thread_ = kernel::object_ref<kernel::XHostThread>(\n      new kernel::XHostThread(kernel_state_, 128 * 1024, 0, [this]() {\n        WorkerThreadMain();\n        return 0;\n      }));\n  worker_thread_->set_name(\"GPU Commands\");\n  worker_thread_->Create();\n\n  return true;\n}\n\nvoid CommandProcessor::Shutdown() {\n  EndTracing();\n\n  worker_running_ = false;\n  write_ptr_index_event_->Set();\n  worker_thread_->Wait(0, 0, 0, nullptr);\n  worker_thread_.reset();\n}\n\nvoid CommandProcessor::InitializeShaderStorage(\n    const std::filesystem::path& cache_root, uint32_t title_id, bool blocking) {\n}\n\nvoid CommandProcessor::RequestFrameTrace(\n    const std::filesystem::path& root_path) {\n  if (trace_state_ == TraceState::kStreaming) {\n    XELOGE(\"Streaming trace; cannot also trace frame.\");\n    return;\n  }\n  if (trace_state_ == TraceState::kSingleFrame) {\n    XELOGE(\"Frame trace already pending; ignoring.\");\n    return;\n  }\n  trace_state_ = TraceState::kSingleFrame;\n  trace_frame_path_ = root_path;\n}\n\nvoid CommandProcessor::BeginTracing(const std::filesystem::path& root_path) {\n  if (trace_state_ == TraceState::kStreaming) {\n    XELOGE(\"Streaming already active; ignoring request.\");\n    return;\n  }\n  if (trace_state_ == TraceState::kSingleFrame) {\n    XELOGE(\"Frame trace pending; ignoring streaming request.\");\n    return;\n  }\n  // Streaming starts on the next primary buffer execute.\n  trace_state_ = TraceState::kStreaming;\n  trace_stream_path_ = root_path;\n}\n\nvoid CommandProcessor::EndTracing() {\n  if (!trace_writer_.is_open()) {\n    return;\n  }\n  assert_true(trace_state_ == TraceState::kStreaming);\n  trace_state_ = TraceState::kDisabled;\n  trace_writer_.Close();\n}\n\nvoid CommandProcessor::RestoreRegisters(uint32_t first_register,\n                                        const uint32_t* register_values,\n                                        uint32_t register_count,\n                                        bool execute_callbacks) {\n  if (first_register > RegisterFile::kRegisterCount ||\n      RegisterFile::kRegisterCount - first_register < register_count) {\n    XELOGW(\n        \"CommandProcessor::RestoreRegisters out of bounds (0x{:X} registers \"\n        \"starting with 0x{:X}, while a total of 0x{:X} registers are stored)\",\n        register_count, first_register, RegisterFile::kRegisterCount);\n    if (first_register > RegisterFile::kRegisterCount) {\n      return;\n    }\n    register_count =\n        std::min(uint32_t(RegisterFile::kRegisterCount) - first_register,\n                 register_count);\n  }\n  if (execute_callbacks) {\n    for (uint32_t i = 0; i < register_count; ++i) {\n      WriteRegister(first_register + i, register_values[i]);\n    }\n  } else {\n    std::memcpy(register_file_->values + first_register, register_values,\n                sizeof(uint32_t) * register_count);\n  }\n}\n\nvoid CommandProcessor::RestoreGammaRamp(\n    const reg::DC_LUT_30_COLOR* new_gamma_ramp_256_entry_table,\n    const reg::DC_LUT_PWL_DATA* new_gamma_ramp_pwl_rgb,\n    uint32_t new_gamma_ramp_rw_component) {\n  std::memcpy(gamma_ramp_256_entry_table_, new_gamma_ramp_256_entry_table,\n              sizeof(reg::DC_LUT_30_COLOR) * 256);\n  std::memcpy(gamma_ramp_pwl_rgb_, new_gamma_ramp_pwl_rgb,\n              sizeof(reg::DC_LUT_PWL_DATA) * 3 * 128);\n  gamma_ramp_rw_component_ = new_gamma_ramp_rw_component;\n  OnGammaRamp256EntryTableValueWritten();\n  OnGammaRampPWLValueWritten();\n}\n\nvoid CommandProcessor::CallInThread(std::function<void()> fn) {\n  if (pending_fns_.empty() &&\n      kernel::XThread::IsInThread(worker_thread_.get())) {\n    fn();\n  } else {\n    pending_fns_.push(std::move(fn));\n  }\n}\n\nvoid CommandProcessor::ClearCaches() {}\n\nvoid CommandProcessor::SetDesiredSwapPostEffect(\n    SwapPostEffect swap_post_effect) {\n  if (swap_post_effect_desired_ == swap_post_effect) {\n    return;\n  }\n  swap_post_effect_desired_ = swap_post_effect;\n  CallInThread([this, swap_post_effect]() {\n    swap_post_effect_actual_ = swap_post_effect;\n  });\n}\n\nvoid CommandProcessor::WorkerThreadMain() {\n  if (!SetupContext()) {\n    xe::FatalError(\"Unable to setup command processor internal state\");\n    return;\n  }\n\n  while (worker_running_) {\n    while (!pending_fns_.empty()) {\n      auto fn = std::move(pending_fns_.front());\n      pending_fns_.pop();\n      fn();\n    }\n\n    uint32_t write_ptr_index = write_ptr_index_.load();\n    if (write_ptr_index == 0xBAADF00D || read_ptr_index_ == write_ptr_index) {\n      SCOPE_profile_cpu_i(\"gpu\", \"xe::gpu::CommandProcessor::Stall\");\n      // We've run out of commands to execute.\n      // We spin here waiting for new ones, as the overhead of waiting on our\n      // event is too high.\n      PrepareForWait();\n      uint32_t loop_count = 0;\n      do {\n        // If we spin around too much, revert to a \"low-power\" state.\n        if (loop_count > 500) {\n          const int wait_time_ms = 5;\n          xe::threading::Wait(write_ptr_index_event_.get(), true,\n                              std::chrono::milliseconds(wait_time_ms));\n        }\n\n        xe::threading::MaybeYield();\n        loop_count++;\n        write_ptr_index = write_ptr_index_.load();\n      } while (worker_running_ && pending_fns_.empty() &&\n               (write_ptr_index == 0xBAADF00D ||\n                read_ptr_index_ == write_ptr_index));\n      ReturnFromWait();\n      if (!worker_running_ || !pending_fns_.empty()) {\n        continue;\n      }\n    }\n    assert_true(read_ptr_index_ != write_ptr_index);\n\n    // Execute. Note that we handle wraparound transparently.\n    read_ptr_index_ = ExecutePrimaryBuffer(read_ptr_index_, write_ptr_index);\n\n    // TODO(benvanik): use reader->Read_update_freq_ and only issue after moving\n    //     that many indices.\n    if (read_ptr_writeback_ptr_) {\n      xe::store_and_swap<uint32_t>(\n          memory_->TranslatePhysical(read_ptr_writeback_ptr_), read_ptr_index_);\n    }\n\n    // FIXME: We're supposed to process the WAIT_UNTIL register at this point,\n    // but no games seem to actually use it.\n  }\n\n  ShutdownContext();\n}\n\nvoid CommandProcessor::Pause() {\n  if (paused_) {\n    return;\n  }\n  paused_ = true;\n\n  threading::Fence fence;\n  CallInThread([&fence]() {\n    fence.Signal();\n    threading::Thread::GetCurrentThread()->Suspend();\n  });\n\n  fence.Wait();\n}\n\nvoid CommandProcessor::Resume() {\n  if (!paused_) {\n    return;\n  }\n  paused_ = false;\n\n  worker_thread_->thread()->Resume();\n}\n\nbool CommandProcessor::Save(ByteStream* stream) {\n  assert_true(paused_);\n\n  stream->Write<uint32_t>(primary_buffer_ptr_);\n  stream->Write<uint32_t>(primary_buffer_size_);\n  stream->Write<uint32_t>(read_ptr_index_);\n  stream->Write<uint32_t>(read_ptr_update_freq_);\n  stream->Write<uint32_t>(read_ptr_writeback_ptr_);\n  stream->Write<uint32_t>(write_ptr_index_.load());\n\n  return true;\n}\n\nbool CommandProcessor::Restore(ByteStream* stream) {\n  assert_true(paused_);\n\n  primary_buffer_ptr_ = stream->Read<uint32_t>();\n  primary_buffer_size_ = stream->Read<uint32_t>();\n  read_ptr_index_ = stream->Read<uint32_t>();\n  read_ptr_update_freq_ = stream->Read<uint32_t>();\n  read_ptr_writeback_ptr_ = stream->Read<uint32_t>();\n  write_ptr_index_.store(stream->Read<uint32_t>());\n\n  return true;\n}\n\nbool CommandProcessor::SetupContext() { return true; }\n\nvoid CommandProcessor::ShutdownContext() {}\n\nvoid CommandProcessor::InitializeRingBuffer(uint32_t ptr, uint32_t size_log2) {\n  read_ptr_index_ = 0;\n  primary_buffer_ptr_ = ptr;\n  primary_buffer_size_ = uint32_t(1) << (size_log2 + 3);\n}\n\nvoid CommandProcessor::EnableReadPointerWriteBack(uint32_t ptr,\n                                                  uint32_t block_size_log2) {\n  // CP_RB_RPTR_ADDR Ring Buffer Read Pointer Address 0x70C\n  // ptr = RB_RPTR_ADDR, pointer to write back the address to.\n  read_ptr_writeback_ptr_ = ptr;\n  // CP_RB_CNTL Ring Buffer Control 0x704\n  // block_size = RB_BLKSZ, log2 of number of quadwords read between updates of\n  //              the read pointer.\n  read_ptr_update_freq_ = uint32_t(1) << block_size_log2 >> 2;\n}\n\nvoid CommandProcessor::UpdateWritePointer(uint32_t value) {\n  write_ptr_index_ = value;\n  write_ptr_index_event_->Set();\n}\n\nvoid CommandProcessor::WriteRegister(uint32_t index, uint32_t value) {\n  RegisterFile& regs = *register_file_;\n  if (index >= RegisterFile::kRegisterCount) {\n    XELOGW(\"CommandProcessor::WriteRegister index out of bounds: {}\", index);\n    return;\n  }\n\n  // Volatile for the WAIT_REG_MEM loop.\n  const_cast<volatile uint32_t&>(regs.values[index]) = value;\n  if (!regs.GetRegisterInfo(index)) {\n    XELOGW(\"GPU: Write to unknown register ({:04X} = {:08X})\", index, value);\n  }\n\n  // Scratch register writeback.\n  if (index >= XE_GPU_REG_SCRATCH_REG0 && index <= XE_GPU_REG_SCRATCH_REG7) {\n    uint32_t scratch_reg = index - XE_GPU_REG_SCRATCH_REG0;\n    if ((1 << scratch_reg) & regs.values[XE_GPU_REG_SCRATCH_UMSK]) {\n      // Enabled - write to address.\n      uint32_t scratch_addr = regs.values[XE_GPU_REG_SCRATCH_ADDR];\n      uint32_t mem_addr = scratch_addr + (scratch_reg * 4);\n      xe::store_and_swap<uint32_t>(memory_->TranslatePhysical(mem_addr), value);\n    }\n  } else {\n    switch (index) {\n      // If this is a COHER register, set the dirty flag.\n      // This will block the command processor the next time it WAIT_REG_MEMs\n      // and allow us to synchronize the memory.\n      case XE_GPU_REG_COHER_STATUS_HOST: {\n        const_cast<volatile uint32_t&>(regs.values[index]) |=\n            UINT32_C(0x80000000);\n      } break;\n\n      case XE_GPU_REG_DC_LUT_RW_INDEX: {\n        // Reset the sequential read / write component index (see the M56\n        // DC_LUT_SEQ_COLOR documentation).\n        gamma_ramp_rw_component_ = 0;\n      } break;\n\n      case XE_GPU_REG_DC_LUT_SEQ_COLOR: {\n        // Should be in the 256-entry table writing mode.\n        assert_zero(regs[XE_GPU_REG_DC_LUT_RW_MODE] & 0b1);\n        auto gamma_ramp_rw_index = regs.Get<reg::DC_LUT_RW_INDEX>();\n        // DC_LUT_SEQ_COLOR is in the red, green, blue order, but the write\n        // enable mask is blue, green, red.\n        bool write_gamma_ramp_component =\n            (regs[XE_GPU_REG_DC_LUT_WRITE_EN_MASK] &\n             (UINT32_C(1) << (2 - gamma_ramp_rw_component_))) != 0;\n        if (write_gamma_ramp_component) {\n          reg::DC_LUT_30_COLOR& gamma_ramp_entry =\n              gamma_ramp_256_entry_table_[gamma_ramp_rw_index.rw_index];\n          // Bits 0:5 are hardwired to zero.\n          uint32_t gamma_ramp_seq_color =\n              regs.Get<reg::DC_LUT_SEQ_COLOR>().seq_color >> 6;\n          switch (gamma_ramp_rw_component_) {\n            case 0:\n              gamma_ramp_entry.color_10_red = gamma_ramp_seq_color;\n              break;\n            case 1:\n              gamma_ramp_entry.color_10_green = gamma_ramp_seq_color;\n              break;\n            case 2:\n              gamma_ramp_entry.color_10_blue = gamma_ramp_seq_color;\n              break;\n          }\n        }\n        if (++gamma_ramp_rw_component_ >= 3) {\n          gamma_ramp_rw_component_ = 0;\n          reg::DC_LUT_RW_INDEX new_gamma_ramp_rw_index = gamma_ramp_rw_index;\n          ++new_gamma_ramp_rw_index.rw_index;\n          WriteRegister(\n              XE_GPU_REG_DC_LUT_RW_INDEX,\n              xe::memory::Reinterpret<uint32_t>(new_gamma_ramp_rw_index));\n        }\n        if (write_gamma_ramp_component) {\n          OnGammaRamp256EntryTableValueWritten();\n        }\n      } break;\n\n      case XE_GPU_REG_DC_LUT_PWL_DATA: {\n        // Should be in the PWL writing mode.\n        assert_not_zero(regs[XE_GPU_REG_DC_LUT_RW_MODE] & 0b1);\n        auto gamma_ramp_rw_index = regs.Get<reg::DC_LUT_RW_INDEX>();\n        // Bit 7 of the index is ignored for PWL.\n        uint32_t gamma_ramp_rw_index_pwl = gamma_ramp_rw_index.rw_index & 0x7F;\n        // DC_LUT_PWL_DATA is likely in the red, green, blue order because\n        // DC_LUT_SEQ_COLOR is, but the write enable mask is blue, green, red.\n        bool write_gamma_ramp_component =\n            (regs[XE_GPU_REG_DC_LUT_WRITE_EN_MASK] &\n             (UINT32_C(1) << (2 - gamma_ramp_rw_component_))) != 0;\n        if (write_gamma_ramp_component) {\n          reg::DC_LUT_PWL_DATA& gamma_ramp_entry =\n              gamma_ramp_pwl_rgb_[gamma_ramp_rw_index_pwl]\n                                 [gamma_ramp_rw_component_];\n          auto gamma_ramp_value = regs.Get<reg::DC_LUT_PWL_DATA>();\n          // Bits 0:5 are hardwired to zero.\n          gamma_ramp_entry.base = gamma_ramp_value.base & ~UINT32_C(0x3F);\n          gamma_ramp_entry.delta = gamma_ramp_value.delta & ~UINT32_C(0x3F);\n        }\n        if (++gamma_ramp_rw_component_ >= 3) {\n          gamma_ramp_rw_component_ = 0;\n          reg::DC_LUT_RW_INDEX new_gamma_ramp_rw_index = gamma_ramp_rw_index;\n          // TODO(Triang3l): Should this increase beyond 7 bits for PWL?\n          // Direct3D 9 explicitly sets rw_index to 0x80 after writing the last\n          // PWL entry. However, the DC_LUT_RW_INDEX documentation says that for\n          // PWL, the bit 7 is ignored.\n          new_gamma_ramp_rw_index.rw_index =\n              (gamma_ramp_rw_index.rw_index & ~UINT32_C(0x7F)) |\n              ((gamma_ramp_rw_index_pwl + 1) & 0x7F);\n          WriteRegister(\n              XE_GPU_REG_DC_LUT_RW_INDEX,\n              xe::memory::Reinterpret<uint32_t>(new_gamma_ramp_rw_index));\n        }\n        if (write_gamma_ramp_component) {\n          OnGammaRampPWLValueWritten();\n        }\n      } break;\n\n      case XE_GPU_REG_DC_LUT_30_COLOR: {\n        // Should be in the 256-entry table writing mode.\n        assert_zero(regs[XE_GPU_REG_DC_LUT_RW_MODE] & 0b1);\n        auto gamma_ramp_rw_index = regs.Get<reg::DC_LUT_RW_INDEX>();\n        uint32_t gamma_ramp_write_enable_mask =\n            regs[XE_GPU_REG_DC_LUT_WRITE_EN_MASK] & 0b111;\n        if (gamma_ramp_write_enable_mask) {\n          reg::DC_LUT_30_COLOR& gamma_ramp_entry =\n              gamma_ramp_256_entry_table_[gamma_ramp_rw_index.rw_index];\n          auto gamma_ramp_value = regs.Get<reg::DC_LUT_30_COLOR>();\n          if (gamma_ramp_write_enable_mask & 0b001) {\n            gamma_ramp_entry.color_10_blue = gamma_ramp_value.color_10_blue;\n          }\n          if (gamma_ramp_write_enable_mask & 0b010) {\n            gamma_ramp_entry.color_10_green = gamma_ramp_value.color_10_green;\n          }\n          if (gamma_ramp_write_enable_mask & 0b100) {\n            gamma_ramp_entry.color_10_red = gamma_ramp_value.color_10_red;\n          }\n        }\n        // TODO(Triang3l): Should this reset the component write index? If this\n        // increase is assumed to behave like a full DC_LUT_RW_INDEX write, it\n        // probably should. Currently this also calls WriteRegister for\n        // DC_LUT_RW_INDEX, which resets gamma_ramp_rw_component_ as well.\n        gamma_ramp_rw_component_ = 0;\n        reg::DC_LUT_RW_INDEX new_gamma_ramp_rw_index = gamma_ramp_rw_index;\n        ++new_gamma_ramp_rw_index.rw_index;\n        WriteRegister(\n            XE_GPU_REG_DC_LUT_RW_INDEX,\n            xe::memory::Reinterpret<uint32_t>(new_gamma_ramp_rw_index));\n        if (gamma_ramp_write_enable_mask) {\n          OnGammaRamp256EntryTableValueWritten();\n        }\n      } break;\n    }\n  }\n}\n\nvoid CommandProcessor::MakeCoherent() {\n  SCOPE_profile_cpu_f(\"gpu\");\n\n  // Status host often has 0x01000000 or 0x03000000.\n  // This is likely toggling VC (vertex cache) or TC (texture cache).\n  // Or, it also has a direction in here maybe - there is probably\n  // some way to check for dest coherency (what all the COHER_DEST_BASE_*\n  // registers are for).\n  // Best docs I've found on this are here:\n  // https://web.archive.org/web/20160711162346/https://amd-dev.wpengine.netdna-cdn.com/wordpress/media/2013/10/R6xx_R7xx_3D.pdf\n  // https://cgit.freedesktop.org/xorg/driver/xf86-video-radeonhd/tree/src/r6xx_accel.c?id=3f8b6eccd9dba116cc4801e7f80ce21a879c67d2#n454\n\n  // Volatile because this may be called from the WAIT_REG_MEM loop.\n  volatile uint32_t* regs_volatile = register_file_->values;\n  auto status_host = xe::memory::Reinterpret<reg::COHER_STATUS_HOST>(\n      uint32_t(regs_volatile[XE_GPU_REG_COHER_STATUS_HOST]));\n  uint32_t base_host = regs_volatile[XE_GPU_REG_COHER_BASE_HOST];\n  uint32_t size_host = regs_volatile[XE_GPU_REG_COHER_SIZE_HOST];\n\n  if (!status_host.status) {\n    return;\n  }\n\n  const char* action = \"N/A\";\n  if (status_host.vc_action_ena && status_host.tc_action_ena) {\n    action = \"VC | TC\";\n  } else if (status_host.tc_action_ena) {\n    action = \"TC\";\n  } else if (status_host.vc_action_ena) {\n    action = \"VC\";\n  }\n\n  // TODO(benvanik): notify resource cache of base->size and type.\n  XELOGD(\"Make {:08X} -> {:08X} ({}b) coherent, action = {}\", base_host,\n         base_host + size_host, size_host, action);\n\n  // Mark coherent.\n  regs_volatile[XE_GPU_REG_COHER_STATUS_HOST] = 0;\n}\n\nvoid CommandProcessor::PrepareForWait() { trace_writer_.Flush(); }\n\nvoid CommandProcessor::ReturnFromWait() {}\n\nuint32_t CommandProcessor::ExecutePrimaryBuffer(uint32_t read_index,\n                                                uint32_t write_index) {\n  SCOPE_profile_cpu_f(\"gpu\");\n\n  // If we have a pending trace stream open it now. That way we ensure we get\n  // all commands.\n  if (!trace_writer_.is_open() && trace_state_ == TraceState::kStreaming) {\n    uint32_t title_id = kernel_state_->GetExecutableModule()\n                            ? kernel_state_->GetExecutableModule()->title_id()\n                            : 0;\n    auto file_name = fmt::format(\"{:08X}_stream.xtr\", title_id);\n    auto path = trace_stream_path_ / file_name;\n    trace_writer_.Open(path, title_id);\n    InitializeTrace();\n  }\n\n  // Adjust pointer base.\n  uint32_t start_ptr = primary_buffer_ptr_ + read_index * sizeof(uint32_t);\n  start_ptr = (primary_buffer_ptr_ & ~0x1FFFFFFF) | (start_ptr & 0x1FFFFFFF);\n  uint32_t end_ptr = primary_buffer_ptr_ + write_index * sizeof(uint32_t);\n  end_ptr = (primary_buffer_ptr_ & ~0x1FFFFFFF) | (end_ptr & 0x1FFFFFFF);\n\n  trace_writer_.WritePrimaryBufferStart(start_ptr, write_index - read_index);\n\n  // Execute commands!\n  RingBuffer reader(memory_->TranslatePhysical(primary_buffer_ptr_),\n                    primary_buffer_size_);\n  reader.set_read_offset(read_index * sizeof(uint32_t));\n  reader.set_write_offset(write_index * sizeof(uint32_t));\n  do {\n    if (!ExecutePacket(&reader)) {\n      // This probably should be fatal - but we're going to continue anyways.\n      XELOGE(\"**** PRIMARY RINGBUFFER: Failed to execute packet.\");\n      assert_always();\n      break;\n    }\n  } while (reader.read_count());\n\n  OnPrimaryBufferEnd();\n\n  trace_writer_.WritePrimaryBufferEnd();\n\n  return write_index;\n}\n\nvoid CommandProcessor::ExecuteIndirectBuffer(uint32_t ptr, uint32_t count) {\n  SCOPE_profile_cpu_f(\"gpu\");\n\n  trace_writer_.WriteIndirectBufferStart(ptr, count * sizeof(uint32_t));\n\n  // Execute commands!\n  RingBuffer reader(memory_->TranslatePhysical(ptr), count * sizeof(uint32_t));\n  reader.set_write_offset(count * sizeof(uint32_t));\n  do {\n    if (!ExecutePacket(&reader)) {\n      // Return up a level if we encounter a bad packet.\n      XELOGE(\"**** INDIRECT RINGBUFFER: Failed to execute packet.\");\n      assert_always();\n      break;\n    }\n  } while (reader.read_count());\n\n  trace_writer_.WriteIndirectBufferEnd();\n}\n\nvoid CommandProcessor::ExecutePacket(uint32_t ptr, uint32_t count) {\n  // Execute commands!\n  RingBuffer reader(memory_->TranslatePhysical(ptr), count * sizeof(uint32_t));\n  reader.set_write_offset(count * sizeof(uint32_t));\n  do {\n    if (!ExecutePacket(&reader)) {\n      XELOGE(\"**** ExecutePacket: Failed to execute packet.\");\n      assert_always();\n      break;\n    }\n  } while (reader.read_count());\n}\n\nbool CommandProcessor::ExecutePacket(RingBuffer* reader) {\n  const uint32_t packet = reader->ReadAndSwap<uint32_t>();\n  const uint32_t packet_type = packet >> 30;\n  if (packet == 0) {\n    trace_writer_.WritePacketStart(uint32_t(reader->read_ptr() - 4), 1);\n    trace_writer_.WritePacketEnd();\n    return true;\n  }\n\n  if (packet == 0xCDCDCDCD) {\n    XELOGW(\"GPU packet is CDCDCDCD - probably read uninitialized memory!\");\n  }\n\n  switch (packet_type) {\n    case 0x00:\n      return ExecutePacketType0(reader, packet);\n    case 0x01:\n      return ExecutePacketType1(reader, packet);\n    case 0x02:\n      return ExecutePacketType2(reader, packet);\n    case 0x03:\n      return ExecutePacketType3(reader, packet);\n    default:\n      assert_unhandled_case(packet_type);\n      return false;\n  }\n}\n\nbool CommandProcessor::ExecutePacketType0(RingBuffer* reader, uint32_t packet) {\n  // Type-0 packet.\n  // Write count registers in sequence to the registers starting at\n  // (base_index << 2).\n\n  uint32_t count = ((packet >> 16) & 0x3FFF) + 1;\n  if (reader->read_count() < count * sizeof(uint32_t)) {\n    XELOGE(\n        \"ExecutePacketType0 overflow (read count {:08X}, packet count {:08X})\",\n        reader->read_count(), count * sizeof(uint32_t));\n    return false;\n  }\n\n  trace_writer_.WritePacketStart(uint32_t(reader->read_ptr() - 4), 1 + count);\n\n  uint32_t base_index = (packet & 0x7FFF);\n  uint32_t write_one_reg = (packet >> 15) & 0x1;\n  for (uint32_t m = 0; m < count; m++) {\n    uint32_t reg_data = reader->ReadAndSwap<uint32_t>();\n    uint32_t target_index = write_one_reg ? base_index : base_index + m;\n    WriteRegister(target_index, reg_data);\n  }\n\n  trace_writer_.WritePacketEnd();\n  return true;\n}\n\nbool CommandProcessor::ExecutePacketType1(RingBuffer* reader, uint32_t packet) {\n  // Type-1 packet.\n  // Contains two registers of data. Type-0 should be more common.\n  trace_writer_.WritePacketStart(uint32_t(reader->read_ptr() - 4), 3);\n  uint32_t reg_index_1 = packet & 0x7FF;\n  uint32_t reg_index_2 = (packet >> 11) & 0x7FF;\n  uint32_t reg_data_1 = reader->ReadAndSwap<uint32_t>();\n  uint32_t reg_data_2 = reader->ReadAndSwap<uint32_t>();\n  WriteRegister(reg_index_1, reg_data_1);\n  WriteRegister(reg_index_2, reg_data_2);\n  trace_writer_.WritePacketEnd();\n  return true;\n}\n\nbool CommandProcessor::ExecutePacketType2(RingBuffer* reader, uint32_t packet) {\n  // Type-2 packet.\n  // No-op. Do nothing.\n  trace_writer_.WritePacketStart(uint32_t(reader->read_ptr() - 4), 1);\n  trace_writer_.WritePacketEnd();\n  return true;\n}\n\nbool CommandProcessor::ExecutePacketType3(RingBuffer* reader, uint32_t packet) {\n  // Type-3 packet.\n  uint32_t opcode = (packet >> 8) & 0x7F;\n  uint32_t count = ((packet >> 16) & 0x3FFF) + 1;\n  auto data_start_offset = reader->read_offset();\n\n  if (reader->read_count() < count * sizeof(uint32_t)) {\n    XELOGE(\n        \"ExecutePacketType3 overflow (read count {:08X}, packet count {:08X})\",\n        reader->read_count(), count * sizeof(uint32_t));\n    return false;\n  }\n\n  // To handle nesting behavior when tracing we special case indirect buffers.\n  if (opcode == PM4_INDIRECT_BUFFER) {\n    trace_writer_.WritePacketStart(uint32_t(reader->read_ptr() - 4), 2);\n  } else {\n    trace_writer_.WritePacketStart(uint32_t(reader->read_ptr() - 4), 1 + count);\n  }\n\n  // & 1 == predicate - when set, we do bin check to see if we should execute\n  // the packet. Only type 3 packets are affected.\n  // We also skip predicated swaps, as they are never valid (probably?).\n  if (packet & 1) {\n    bool any_pass = (bin_select_ & bin_mask_) != 0;\n    if (!any_pass || opcode == PM4_XE_SWAP) {\n      reader->AdvanceRead(count * sizeof(uint32_t));\n      trace_writer_.WritePacketEnd();\n      return true;\n    }\n  }\n\n  bool result = false;\n  switch (opcode) {\n    case PM4_ME_INIT:\n      result = ExecutePacketType3_ME_INIT(reader, packet, count);\n      break;\n    case PM4_NOP:\n      result = ExecutePacketType3_NOP(reader, packet, count);\n      break;\n    case PM4_INTERRUPT:\n      result = ExecutePacketType3_INTERRUPT(reader, packet, count);\n      break;\n    case PM4_XE_SWAP:\n      result = ExecutePacketType3_XE_SWAP(reader, packet, count);\n      break;\n    case PM4_INDIRECT_BUFFER:\n    case PM4_INDIRECT_BUFFER_PFD:\n      result = ExecutePacketType3_INDIRECT_BUFFER(reader, packet, count);\n      break;\n    case PM4_WAIT_REG_MEM:\n      result = ExecutePacketType3_WAIT_REG_MEM(reader, packet, count);\n      break;\n    case PM4_REG_RMW:\n      result = ExecutePacketType3_REG_RMW(reader, packet, count);\n      break;\n    case PM4_REG_TO_MEM:\n      result = ExecutePacketType3_REG_TO_MEM(reader, packet, count);\n      break;\n    case PM4_MEM_WRITE:\n      result = ExecutePacketType3_MEM_WRITE(reader, packet, count);\n      break;\n    case PM4_COND_WRITE:\n      result = ExecutePacketType3_COND_WRITE(reader, packet, count);\n      break;\n    case PM4_EVENT_WRITE:\n      result = ExecutePacketType3_EVENT_WRITE(reader, packet, count);\n      break;\n    case PM4_EVENT_WRITE_SHD:\n      result = ExecutePacketType3_EVENT_WRITE_SHD(reader, packet, count);\n      break;\n    case PM4_EVENT_WRITE_EXT:\n      result = ExecutePacketType3_EVENT_WRITE_EXT(reader, packet, count);\n      break;\n    case PM4_EVENT_WRITE_ZPD:\n      result = ExecutePacketType3_EVENT_WRITE_ZPD(reader, packet, count);\n      break;\n    case PM4_DRAW_INDX:\n      result = ExecutePacketType3_DRAW_INDX(reader, packet, count);\n      break;\n    case PM4_DRAW_INDX_2:\n      result = ExecutePacketType3_DRAW_INDX_2(reader, packet, count);\n      break;\n    case PM4_SET_CONSTANT:\n      result = ExecutePacketType3_SET_CONSTANT(reader, packet, count);\n      break;\n    case PM4_SET_CONSTANT2:\n      result = ExecutePacketType3_SET_CONSTANT2(reader, packet, count);\n      break;\n    case PM4_LOAD_ALU_CONSTANT:\n      result = ExecutePacketType3_LOAD_ALU_CONSTANT(reader, packet, count);\n      break;\n    case PM4_SET_SHADER_CONSTANTS:\n      result = ExecutePacketType3_SET_SHADER_CONSTANTS(reader, packet, count);\n      break;\n    case PM4_IM_LOAD:\n      result = ExecutePacketType3_IM_LOAD(reader, packet, count);\n      break;\n    case PM4_IM_LOAD_IMMEDIATE:\n      result = ExecutePacketType3_IM_LOAD_IMMEDIATE(reader, packet, count);\n      break;\n    case PM4_INVALIDATE_STATE:\n      result = ExecutePacketType3_INVALIDATE_STATE(reader, packet, count);\n      break;\n    case PM4_VIZ_QUERY:\n      result = ExecutePacketType3_VIZ_QUERY(reader, packet, count);\n      break;\n\n    case PM4_SET_BIN_MASK_LO: {\n      uint32_t value = reader->ReadAndSwap<uint32_t>();\n      bin_mask_ = (bin_mask_ & 0xFFFFFFFF00000000ull) | value;\n      result = true;\n    } break;\n    case PM4_SET_BIN_MASK_HI: {\n      uint32_t value = reader->ReadAndSwap<uint32_t>();\n      bin_mask_ =\n          (bin_mask_ & 0xFFFFFFFFull) | (static_cast<uint64_t>(value) << 32);\n      result = true;\n    } break;\n    case PM4_SET_BIN_SELECT_LO: {\n      uint32_t value = reader->ReadAndSwap<uint32_t>();\n      bin_select_ = (bin_select_ & 0xFFFFFFFF00000000ull) | value;\n      result = true;\n    } break;\n    case PM4_SET_BIN_SELECT_HI: {\n      uint32_t value = reader->ReadAndSwap<uint32_t>();\n      bin_select_ =\n          (bin_select_ & 0xFFFFFFFFull) | (static_cast<uint64_t>(value) << 32);\n      result = true;\n    } break;\n    case PM4_SET_BIN_MASK: {\n      assert_true(count == 2);\n      uint64_t val_hi = reader->ReadAndSwap<uint32_t>();\n      uint64_t val_lo = reader->ReadAndSwap<uint32_t>();\n      bin_mask_ = (val_hi << 32) | val_lo;\n      result = true;\n    } break;\n    case PM4_SET_BIN_SELECT: {\n      assert_true(count == 2);\n      uint64_t val_hi = reader->ReadAndSwap<uint32_t>();\n      uint64_t val_lo = reader->ReadAndSwap<uint32_t>();\n      bin_select_ = (val_hi << 32) | val_lo;\n      result = true;\n    } break;\n    case PM4_CONTEXT_UPDATE: {\n      assert_true(count == 1);\n      uint32_t value = reader->ReadAndSwap<uint32_t>();\n      XELOGGPU(\"GPU context update = {:08X}\", value);\n      assert_true(value == 0);\n      result = true;\n      break;\n    }\n    case PM4_WAIT_FOR_IDLE: {\n      // This opcode is used by 5454084E while going / being ingame.\n      assert_true(count == 1);\n      uint32_t value = reader->ReadAndSwap<uint32_t>();\n      XELOGGPU(\"GPU wait for idle = {:08X}\", value);\n      result = true;\n      break;\n    }\n\n    default:\n      XELOGGPU(\"Unimplemented GPU OPCODE: 0x{:02X}\\t\\tCOUNT: {}\\n\", opcode,\n               count);\n      assert_always();\n      reader->AdvanceRead(count * sizeof(uint32_t));\n      break;\n  }\n\n  trace_writer_.WritePacketEnd();\n  if (opcode == PM4_XE_SWAP) {\n    // End the trace writer frame.\n    if (trace_writer_.is_open()) {\n      trace_writer_.WriteEvent(EventCommand::Type::kSwap);\n      trace_writer_.Flush();\n      if (trace_state_ == TraceState::kSingleFrame) {\n        trace_state_ = TraceState::kDisabled;\n        trace_writer_.Close();\n      }\n    } else if (trace_state_ == TraceState::kSingleFrame) {\n      // New trace request - we only start tracing at the beginning of a frame.\n      uint32_t title_id = kernel_state_->GetExecutableModule()->title_id();\n      auto file_name = fmt::format(\"{:08X}_{}.xtr\", title_id, counter_ - 1);\n      auto path = trace_frame_path_ / file_name;\n      trace_writer_.Open(path, title_id);\n      InitializeTrace();\n    }\n  }\n\n  assert_true(reader->read_offset() ==\n              (data_start_offset + (count * sizeof(uint32_t))) %\n                  reader->capacity());\n  return result;\n}\n\nbool CommandProcessor::ExecutePacketType3_ME_INIT(RingBuffer* reader,\n                                                  uint32_t packet,\n                                                  uint32_t count) {\n  // initialize CP's micro-engine\n  me_bin_.clear();\n  for (uint32_t i = 0; i < count; i++) {\n    me_bin_.push_back(reader->ReadAndSwap<uint32_t>());\n  }\n\n  return true;\n}\n\nbool CommandProcessor::ExecutePacketType3_NOP(RingBuffer* reader,\n                                              uint32_t packet, uint32_t count) {\n  // skip N 32-bit words to get to the next packet\n  // No-op, ignore some data.\n  reader->AdvanceRead(count * sizeof(uint32_t));\n  return true;\n}\n\nbool CommandProcessor::ExecutePacketType3_INTERRUPT(RingBuffer* reader,\n                                                    uint32_t packet,\n                                                    uint32_t count) {\n  SCOPE_profile_cpu_f(\"gpu\");\n\n  // generate interrupt from the command stream\n  uint32_t cpu_mask = reader->ReadAndSwap<uint32_t>();\n  for (int n = 0; n < 6; n++) {\n    if (cpu_mask & (1 << n)) {\n      graphics_system_->DispatchInterruptCallback(1, n);\n    }\n  }\n  return true;\n}\n\nbool CommandProcessor::ExecutePacketType3_XE_SWAP(RingBuffer* reader,\n                                                  uint32_t packet,\n                                                  uint32_t count) {\n  SCOPE_profile_cpu_f(\"gpu\");\n\n  XELOGI(\"XE_SWAP\");\n\n  Profiler::Flip();\n\n  // Xenia-specific VdSwap hook.\n  // VdSwap will post this to tell us we need to swap the screen/fire an\n  // interrupt.\n  // 63 words here, but only the first has any data.\n  uint32_t magic = reader->ReadAndSwap<fourcc_t>();\n  assert_true(magic == kSwapSignature);\n\n  // TODO(benvanik): only swap frontbuffer ptr.\n  uint32_t frontbuffer_ptr = reader->ReadAndSwap<uint32_t>();\n  uint32_t frontbuffer_width = reader->ReadAndSwap<uint32_t>();\n  uint32_t frontbuffer_height = reader->ReadAndSwap<uint32_t>();\n  reader->AdvanceRead((count - 4) * sizeof(uint32_t));\n\n  IssueSwap(frontbuffer_ptr, frontbuffer_width, frontbuffer_height);\n\n  ++counter_;\n  return true;\n}\n\nbool CommandProcessor::ExecutePacketType3_INDIRECT_BUFFER(RingBuffer* reader,\n                                                          uint32_t packet,\n                                                          uint32_t count) {\n  // indirect buffer dispatch\n  uint32_t list_ptr = CpuToGpu(reader->ReadAndSwap<uint32_t>());\n  uint32_t list_length = reader->ReadAndSwap<uint32_t>();\n  assert_zero(list_length & ~0xFFFFF);\n  list_length &= 0xFFFFF;\n  ExecuteIndirectBuffer(GpuToCpu(list_ptr), list_length);\n  return true;\n}\n\nbool CommandProcessor::ExecutePacketType3_WAIT_REG_MEM(RingBuffer* reader,\n                                                       uint32_t packet,\n                                                       uint32_t count) {\n  SCOPE_profile_cpu_f(\"gpu\");\n\n  // wait until a register or memory location is a specific value\n\n  uint32_t wait_info = reader->ReadAndSwap<uint32_t>();\n  uint32_t poll_reg_addr = reader->ReadAndSwap<uint32_t>();\n  uint32_t ref = reader->ReadAndSwap<uint32_t>();\n  uint32_t mask = reader->ReadAndSwap<uint32_t>();\n  uint32_t wait = reader->ReadAndSwap<uint32_t>();\n\n  bool is_memory = (wait_info & 0x10) != 0;\n\n  assert_true(is_memory || poll_reg_addr < RegisterFile::kRegisterCount);\n  const volatile uint32_t& value_ref =\n      is_memory ? *reinterpret_cast<uint32_t*>(memory_->TranslatePhysical(\n                      poll_reg_addr & ~uint32_t(0x3)))\n                : register_file_->values[poll_reg_addr];\n\n  bool matched = false;\n  do {\n    uint32_t value = value_ref;\n    if (is_memory) {\n      trace_writer_.WriteMemoryRead(CpuToGpu(poll_reg_addr & ~uint32_t(0x3)),\n                                    sizeof(uint32_t));\n      value = xenos::GpuSwap(value,\n                             static_cast<xenos::Endian>(poll_reg_addr & 0x3));\n    } else {\n      if (poll_reg_addr == XE_GPU_REG_COHER_STATUS_HOST) {\n        MakeCoherent();\n        value = value_ref;\n      }\n    }\n    switch (wait_info & 0x7) {\n      case 0x0:  // Never.\n        matched = false;\n        break;\n      case 0x1:  // Less than reference.\n        matched = (value & mask) < ref;\n        break;\n      case 0x2:  // Less than or equal to reference.\n        matched = (value & mask) <= ref;\n        break;\n      case 0x3:  // Equal to reference.\n        matched = (value & mask) == ref;\n        break;\n      case 0x4:  // Not equal to reference.\n        matched = (value & mask) != ref;\n        break;\n      case 0x5:  // Greater than or equal to reference.\n        matched = (value & mask) >= ref;\n        break;\n      case 0x6:  // Greater than reference.\n        matched = (value & mask) > ref;\n        break;\n      case 0x7:  // Always\n        matched = true;\n        break;\n    }\n    if (!matched) {\n      // Wait.\n      if (wait >= 0x100) {\n        PrepareForWait();\n        if (!cvars::vsync) {\n          // User wants it fast and dangerous.\n          xe::threading::MaybeYield();\n        } else {\n          xe::threading::Sleep(std::chrono::milliseconds(wait / 0x100));\n        }\n        xe::threading::SyncMemory();\n        ReturnFromWait();\n\n        if (!worker_running_) {\n          // Short-circuited exit.\n          return false;\n        }\n      } else {\n        xe::threading::MaybeYield();\n      }\n    }\n  } while (!matched);\n\n  return true;\n}\n\nbool CommandProcessor::ExecutePacketType3_REG_RMW(RingBuffer* reader,\n                                                  uint32_t packet,\n                                                  uint32_t count) {\n  // register read/modify/write\n  // ? (used during shader upload and edram setup)\n  uint32_t rmw_info = reader->ReadAndSwap<uint32_t>();\n  uint32_t and_mask = reader->ReadAndSwap<uint32_t>();\n  uint32_t or_mask = reader->ReadAndSwap<uint32_t>();\n  uint32_t value = register_file_->values[rmw_info & 0x1FFF];\n  if ((rmw_info >> 31) & 0x1) {\n    // & reg\n    value &= register_file_->values[and_mask & 0x1FFF];\n  } else {\n    // & imm\n    value &= and_mask;\n  }\n  if ((rmw_info >> 30) & 0x1) {\n    // | reg\n    value |= register_file_->values[or_mask & 0x1FFF];\n  } else {\n    // | imm\n    value |= or_mask;\n  }\n  WriteRegister(rmw_info & 0x1FFF, value);\n  return true;\n}\n\nbool CommandProcessor::ExecutePacketType3_REG_TO_MEM(RingBuffer* reader,\n                                                     uint32_t packet,\n                                                     uint32_t count) {\n  // Copy Register to Memory (?)\n  // Count is 2, assuming a Register Addr and a Memory Addr.\n\n  uint32_t reg_addr = reader->ReadAndSwap<uint32_t>();\n  uint32_t mem_addr = reader->ReadAndSwap<uint32_t>();\n\n  uint32_t reg_val;\n\n  assert_true(reg_addr < RegisterFile::kRegisterCount);\n  reg_val = register_file_->values[reg_addr];\n\n  auto endianness = static_cast<xenos::Endian>(mem_addr & 0x3);\n  mem_addr &= ~0x3;\n  reg_val = GpuSwap(reg_val, endianness);\n  xe::store(memory_->TranslatePhysical(mem_addr), reg_val);\n  trace_writer_.WriteMemoryWrite(CpuToGpu(mem_addr), 4);\n\n  return true;\n}\n\nbool CommandProcessor::ExecutePacketType3_MEM_WRITE(RingBuffer* reader,\n                                                    uint32_t packet,\n                                                    uint32_t count) {\n  uint32_t write_addr = reader->ReadAndSwap<uint32_t>();\n  for (uint32_t i = 0; i < count - 1; i++) {\n    uint32_t write_data = reader->ReadAndSwap<uint32_t>();\n\n    auto endianness = static_cast<xenos::Endian>(write_addr & 0x3);\n    auto addr = write_addr & ~0x3;\n    write_data = GpuSwap(write_data, endianness);\n    xe::store(memory_->TranslatePhysical(addr), write_data);\n    trace_writer_.WriteMemoryWrite(CpuToGpu(addr), 4);\n    write_addr += 4;\n  }\n\n  return true;\n}\n\nbool CommandProcessor::ExecutePacketType3_COND_WRITE(RingBuffer* reader,\n                                                     uint32_t packet,\n                                                     uint32_t count) {\n  // conditional write to memory or register\n  uint32_t wait_info = reader->ReadAndSwap<uint32_t>();\n  uint32_t poll_reg_addr = reader->ReadAndSwap<uint32_t>();\n  uint32_t ref = reader->ReadAndSwap<uint32_t>();\n  uint32_t mask = reader->ReadAndSwap<uint32_t>();\n  uint32_t write_reg_addr = reader->ReadAndSwap<uint32_t>();\n  uint32_t write_data = reader->ReadAndSwap<uint32_t>();\n  uint32_t value;\n  if (wait_info & 0x10) {\n    // Memory.\n    auto endianness = static_cast<xenos::Endian>(poll_reg_addr & 0x3);\n    poll_reg_addr &= ~0x3;\n    trace_writer_.WriteMemoryRead(CpuToGpu(poll_reg_addr), 4);\n    value = xe::load<uint32_t>(memory_->TranslatePhysical(poll_reg_addr));\n    value = GpuSwap(value, endianness);\n  } else {\n    // Register.\n    assert_true(poll_reg_addr < RegisterFile::kRegisterCount);\n    value = register_file_->values[poll_reg_addr];\n  }\n  bool matched = false;\n  switch (wait_info & 0x7) {\n    case 0x0:  // Never.\n      matched = false;\n      break;\n    case 0x1:  // Less than reference.\n      matched = (value & mask) < ref;\n      break;\n    case 0x2:  // Less than or equal to reference.\n      matched = (value & mask) <= ref;\n      break;\n    case 0x3:  // Equal to reference.\n      matched = (value & mask) == ref;\n      break;\n    case 0x4:  // Not equal to reference.\n      matched = (value & mask) != ref;\n      break;\n    case 0x5:  // Greater than or equal to reference.\n      matched = (value & mask) >= ref;\n      break;\n    case 0x6:  // Greater than reference.\n      matched = (value & mask) > ref;\n      break;\n    case 0x7:  // Always\n      matched = true;\n      break;\n  }\n  if (matched) {\n    // Write.\n    if (wait_info & 0x100) {\n      // Memory.\n      auto endianness = static_cast<xenos::Endian>(write_reg_addr & 0x3);\n      write_reg_addr &= ~0x3;\n      write_data = GpuSwap(write_data, endianness);\n      xe::store(memory_->TranslatePhysical(write_reg_addr), write_data);\n      trace_writer_.WriteMemoryWrite(CpuToGpu(write_reg_addr), 4);\n    } else {\n      // Register.\n      WriteRegister(write_reg_addr, write_data);\n    }\n  }\n  return true;\n}\n\nbool CommandProcessor::ExecutePacketType3_EVENT_WRITE(RingBuffer* reader,\n                                                      uint32_t packet,\n                                                      uint32_t count) {\n  // generate an event that creates a write to memory when completed\n  uint32_t initiator = reader->ReadAndSwap<uint32_t>();\n  // Writeback initiator.\n  WriteRegister(XE_GPU_REG_VGT_EVENT_INITIATOR, initiator & 0x3F);\n  if (count == 1) {\n    // Just an event flag? Where does this write?\n  } else {\n    // Write to an address.\n    assert_always();\n    reader->AdvanceRead((count - 1) * sizeof(uint32_t));\n  }\n  return true;\n}\n\nbool CommandProcessor::ExecutePacketType3_EVENT_WRITE_SHD(RingBuffer* reader,\n                                                          uint32_t packet,\n                                                          uint32_t count) {\n  // generate a VS|PS_done event\n  uint32_t initiator = reader->ReadAndSwap<uint32_t>();\n  uint32_t address = reader->ReadAndSwap<uint32_t>();\n  uint32_t value = reader->ReadAndSwap<uint32_t>();\n  // Writeback initiator.\n  WriteRegister(XE_GPU_REG_VGT_EVENT_INITIATOR, initiator & 0x3F);\n  uint32_t data_value;\n  if ((initiator >> 31) & 0x1) {\n    // Write counter (GPU vblank counter?).\n    data_value = counter_;\n  } else {\n    // Write value.\n    data_value = value;\n  }\n  auto endianness = static_cast<xenos::Endian>(address & 0x3);\n  address &= ~0x3;\n  data_value = GpuSwap(data_value, endianness);\n  xe::store(memory_->TranslatePhysical(address), data_value);\n  trace_writer_.WriteMemoryWrite(CpuToGpu(address), 4);\n  return true;\n}\n\nbool CommandProcessor::ExecutePacketType3_EVENT_WRITE_EXT(RingBuffer* reader,\n                                                          uint32_t packet,\n                                                          uint32_t count) {\n  // generate a screen extent event\n  uint32_t initiator = reader->ReadAndSwap<uint32_t>();\n  uint32_t address = reader->ReadAndSwap<uint32_t>();\n  // Writeback initiator.\n  WriteRegister(XE_GPU_REG_VGT_EVENT_INITIATOR, initiator & 0x3F);\n  auto endianness = static_cast<xenos::Endian>(address & 0x3);\n  address &= ~0x3;\n\n  // Let us hope we can fake this.\n  // This callback tells the driver the xy coordinates affected by a previous\n  // drawcall.\n  // https://www.google.com/patents/US20060055701\n  uint16_t extents[] = {\n      0 >> 3,                                    // min x\n      xenos::kTexture2DCubeMaxWidthHeight >> 3,  // max x\n      0 >> 3,                                    // min y\n      xenos::kTexture2DCubeMaxWidthHeight >> 3,  // max y\n      0,                                         // min z\n      1,                                         // max z\n  };\n  assert_true(endianness == xenos::Endian::k8in16);\n  xe::copy_and_swap_16_unaligned(memory_->TranslatePhysical(address), extents,\n                                 xe::countof(extents));\n  trace_writer_.WriteMemoryWrite(CpuToGpu(address), sizeof(extents));\n  return true;\n}\n\nbool CommandProcessor::ExecutePacketType3_EVENT_WRITE_ZPD(RingBuffer* reader,\n                                                          uint32_t packet,\n                                                          uint32_t count) {\n  // Set by D3D as BE but struct ABI is LE\n  const uint32_t kQueryFinished = xe::byte_swap(0xFFFFFEED);\n  assert_true(count == 1);\n  uint32_t initiator = reader->ReadAndSwap<uint32_t>();\n  // Writeback initiator.\n  WriteRegister(XE_GPU_REG_VGT_EVENT_INITIATOR, initiator & 0x3F);\n\n  // Occlusion queries:\n  // This command is send on query begin and end.\n  // As a workaround report some fixed amount of passed samples.\n  auto fake_sample_count = cvars::query_occlusion_fake_sample_count;\n  if (fake_sample_count >= 0) {\n    auto* pSampleCounts =\n        memory_->TranslatePhysical<xe_gpu_depth_sample_counts*>(\n            register_file_->values[XE_GPU_REG_RB_SAMPLE_COUNT_ADDR]);\n    // 0xFFFFFEED is written to this two locations by D3D only on D3DISSUE_END\n    // and used to detect a finished query.\n    bool is_end_via_z_pass = pSampleCounts->ZPass_A == kQueryFinished &&\n                             pSampleCounts->ZPass_B == kQueryFinished;\n    // Older versions of D3D also checks for ZFail (4D5307D5).\n    bool is_end_via_z_fail = pSampleCounts->ZFail_A == kQueryFinished &&\n                             pSampleCounts->ZFail_B == kQueryFinished;\n    std::memset(pSampleCounts, 0, sizeof(xe_gpu_depth_sample_counts));\n    if (is_end_via_z_pass || is_end_via_z_fail) {\n      pSampleCounts->ZPass_A = fake_sample_count;\n      pSampleCounts->Total_A = fake_sample_count;\n    }\n  }\n\n  return true;\n}\n\nbool CommandProcessor::ExecutePacketType3Draw(RingBuffer* reader,\n                                              uint32_t packet,\n                                              const char* opcode_name,\n                                              uint32_t viz_query_condition,\n                                              uint32_t count_remaining) {\n  // if viz_query_condition != 0, this is a conditional draw based on viz query.\n  // This ID matches the one issued in PM4_VIZ_QUERY\n  // uint32_t viz_id = viz_query_condition & 0x3F;\n  // when true, render conditionally based on query result\n  // uint32_t viz_use = viz_query_condition & 0x100;\n\n  assert_not_zero(count_remaining);\n  if (!count_remaining) {\n    XELOGE(\"{}: Packet too small, can't read VGT_DRAW_INITIATOR\", opcode_name);\n    return false;\n  }\n  reg::VGT_DRAW_INITIATOR vgt_draw_initiator;\n  vgt_draw_initiator.value = reader->ReadAndSwap<uint32_t>();\n  --count_remaining;\n  WriteRegister(XE_GPU_REG_VGT_DRAW_INITIATOR, vgt_draw_initiator.value);\n\n  bool draw_succeeded = true;\n  // TODO(Triang3l): Remove IndexBufferInfo and replace handling of all this\n  // with PrimitiveProcessor when the old Vulkan renderer is removed.\n  bool is_indexed = false;\n  IndexBufferInfo index_buffer_info;\n  switch (vgt_draw_initiator.source_select) {\n    case xenos::SourceSelect::kDMA: {\n      // Indexed draw.\n      is_indexed = true;\n\n      // Two separate bounds checks so if there's only one missing register\n      // value out of two, one uint32_t will be skipped in the command buffer,\n      // not two.\n      assert_not_zero(count_remaining);\n      if (!count_remaining) {\n        XELOGE(\"{}: Packet too small, can't read VGT_DMA_BASE\", opcode_name);\n        return false;\n      }\n      uint32_t vgt_dma_base = reader->ReadAndSwap<uint32_t>();\n      --count_remaining;\n      WriteRegister(XE_GPU_REG_VGT_DMA_BASE, vgt_dma_base);\n      reg::VGT_DMA_SIZE vgt_dma_size;\n      assert_not_zero(count_remaining);\n      if (!count_remaining) {\n        XELOGE(\"{}: Packet too small, can't read VGT_DMA_SIZE\", opcode_name);\n        return false;\n      }\n      vgt_dma_size.value = reader->ReadAndSwap<uint32_t>();\n      --count_remaining;\n      WriteRegister(XE_GPU_REG_VGT_DMA_SIZE, vgt_dma_size.value);\n\n      uint32_t index_size_bytes =\n          vgt_draw_initiator.index_size == xenos::IndexFormat::kInt16\n              ? sizeof(uint16_t)\n              : sizeof(uint32_t);\n      // The base address must already be word-aligned according to the R6xx\n      // documentation, but for safety.\n      index_buffer_info.guest_base = vgt_dma_base & ~(index_size_bytes - 1);\n      index_buffer_info.endianness = vgt_dma_size.swap_mode;\n      index_buffer_info.format = vgt_draw_initiator.index_size;\n      index_buffer_info.length = vgt_dma_size.num_words * index_size_bytes;\n      index_buffer_info.count = vgt_draw_initiator.num_indices;\n    } break;\n    case xenos::SourceSelect::kImmediate: {\n      // TODO(Triang3l): VGT_IMMED_DATA.\n      XELOGE(\n          \"{}: Using immediate vertex indices, which are not supported yet. \"\n          \"Report the game to Xenia developers!\",\n          opcode_name, uint32_t(vgt_draw_initiator.source_select));\n      draw_succeeded = false;\n      assert_always();\n    } break;\n    case xenos::SourceSelect::kAutoIndex: {\n      // Auto draw.\n      index_buffer_info.guest_base = 0;\n      index_buffer_info.length = 0;\n    } break;\n    default: {\n      // Invalid source selection.\n      draw_succeeded = false;\n      assert_unhandled_case(vgt_draw_initiator.source_select);\n    } break;\n  }\n\n  // Skip to the next command, for example, if there are immediate indexes that\n  // we don't support yet.\n  reader->AdvanceRead(count_remaining * sizeof(uint32_t));\n\n  if (draw_succeeded) {\n    auto viz_query = register_file_->Get<reg::PA_SC_VIZ_QUERY>();\n    if (!(viz_query.viz_query_ena && viz_query.kill_pix_post_hi_z)) {\n      // TODO(Triang3l): Don't drop the draw call completely if the vertex\n      // shader has memexport.\n      // TODO(Triang3l || JoelLinn): Handle this properly in the render\n      // backends.\n      draw_succeeded = IssueDraw(\n          vgt_draw_initiator.prim_type, vgt_draw_initiator.num_indices,\n          is_indexed ? &index_buffer_info : nullptr,\n          xenos::IsMajorModeExplicit(vgt_draw_initiator.major_mode,\n                                     vgt_draw_initiator.prim_type));\n      if (!draw_succeeded) {\n        XELOGE(\"{}({}, {}, {}): Failed in backend\", opcode_name,\n               vgt_draw_initiator.num_indices,\n               uint32_t(vgt_draw_initiator.prim_type),\n               uint32_t(vgt_draw_initiator.source_select));\n      }\n    }\n  }\n\n  // If read the packed correctly, but merely couldn't execute it (because of,\n  // for instance, features not supported by the host), don't terminate command\n  // buffer processing as that would leave rendering in a way more inconsistent\n  // state than just a single dropped draw command.\n  return true;\n}\n\nbool CommandProcessor::ExecutePacketType3_DRAW_INDX(RingBuffer* reader,\n                                                    uint32_t packet,\n                                                    uint32_t count) {\n  // \"initiate fetch of index buffer and draw\"\n  // Generally used by Xbox 360 Direct3D 9 for kDMA and kAutoIndex sources.\n  // With a viz query token as the first one.\n  uint32_t count_remaining = count;\n  assert_not_zero(count_remaining);\n  if (!count_remaining) {\n    XELOGE(\"PM4_DRAW_INDX: Packet too small, can't read the viz query token\");\n    return false;\n  }\n  uint32_t viz_query_condition = reader->ReadAndSwap<uint32_t>();\n  --count_remaining;\n  return ExecutePacketType3Draw(reader, packet, \"PM4_DRAW_INDX\",\n                                viz_query_condition, count_remaining);\n}\n\nbool CommandProcessor::ExecutePacketType3_DRAW_INDX_2(RingBuffer* reader,\n                                                      uint32_t packet,\n                                                      uint32_t count) {\n  // \"draw using supplied indices in packet\"\n  // Generally used by Xbox 360 Direct3D 9 for kAutoIndex source.\n  // No viz query token.\n  return ExecutePacketType3Draw(reader, packet, \"PM4_DRAW_INDX_2\", 0, count);\n}\n\nbool CommandProcessor::ExecutePacketType3_SET_CONSTANT(RingBuffer* reader,\n                                                       uint32_t packet,\n                                                       uint32_t count) {\n  // load constant into chip and to memory\n  // PM4_REG(reg) ((0x4 << 16) | (GSL_HAL_SUBBLOCK_OFFSET(reg)))\n  //                                     reg - 0x2000\n  uint32_t offset_type = reader->ReadAndSwap<uint32_t>();\n  uint32_t index = offset_type & 0x7FF;\n  uint32_t type = (offset_type >> 16) & 0xFF;\n  switch (type) {\n    case 0:  // ALU\n      index += 0x4000;\n      break;\n    case 1:  // FETCH\n      index += 0x4800;\n      break;\n    case 2:  // BOOL\n      index += 0x4900;\n      break;\n    case 3:  // LOOP\n      index += 0x4908;\n      break;\n    case 4:  // REGISTERS\n      index += 0x2000;\n      break;\n    default:\n      assert_always();\n      reader->AdvanceRead((count - 1) * sizeof(uint32_t));\n      return true;\n  }\n  for (uint32_t n = 0; n < count - 1; n++, index++) {\n    uint32_t data = reader->ReadAndSwap<uint32_t>();\n    WriteRegister(index, data);\n  }\n  return true;\n}\n\nbool CommandProcessor::ExecutePacketType3_SET_CONSTANT2(RingBuffer* reader,\n                                                        uint32_t packet,\n                                                        uint32_t count) {\n  uint32_t offset_type = reader->ReadAndSwap<uint32_t>();\n  uint32_t index = offset_type & 0xFFFF;\n  for (uint32_t n = 0; n < count - 1; n++, index++) {\n    uint32_t data = reader->ReadAndSwap<uint32_t>();\n    WriteRegister(index, data);\n  }\n  return true;\n}\n\nbool CommandProcessor::ExecutePacketType3_LOAD_ALU_CONSTANT(RingBuffer* reader,\n                                                            uint32_t packet,\n                                                            uint32_t count) {\n  // load constants from memory\n  uint32_t address = reader->ReadAndSwap<uint32_t>();\n  address &= 0x3FFFFFFF;\n  uint32_t offset_type = reader->ReadAndSwap<uint32_t>();\n  uint32_t index = offset_type & 0x7FF;\n  uint32_t size_dwords = reader->ReadAndSwap<uint32_t>();\n  size_dwords &= 0xFFF;\n  uint32_t type = (offset_type >> 16) & 0xFF;\n  switch (type) {\n    case 0:  // ALU\n      index += 0x4000;\n      break;\n    case 1:  // FETCH\n      index += 0x4800;\n      break;\n    case 2:  // BOOL\n      index += 0x4900;\n      break;\n    case 3:  // LOOP\n      index += 0x4908;\n      break;\n    case 4:  // REGISTERS\n      index += 0x2000;\n      break;\n    default:\n      assert_always();\n      return true;\n  }\n  trace_writer_.WriteMemoryRead(CpuToGpu(address), size_dwords * 4);\n  for (uint32_t n = 0; n < size_dwords; n++, index++) {\n    uint32_t data = xe::load_and_swap<uint32_t>(\n        memory_->TranslatePhysical(address + n * 4));\n    WriteRegister(index, data);\n  }\n  return true;\n}\n\nbool CommandProcessor::ExecutePacketType3_SET_SHADER_CONSTANTS(\n    RingBuffer* reader, uint32_t packet, uint32_t count) {\n  uint32_t offset_type = reader->ReadAndSwap<uint32_t>();\n  uint32_t index = offset_type & 0xFFFF;\n  for (uint32_t n = 0; n < count - 1; n++, index++) {\n    uint32_t data = reader->ReadAndSwap<uint32_t>();\n    WriteRegister(index, data);\n  }\n  return true;\n}\n\nbool CommandProcessor::ExecutePacketType3_IM_LOAD(RingBuffer* reader,\n                                                  uint32_t packet,\n                                                  uint32_t count) {\n  SCOPE_profile_cpu_f(\"gpu\");\n\n  // load sequencer instruction memory (pointer-based)\n  uint32_t addr_type = reader->ReadAndSwap<uint32_t>();\n  auto shader_type = static_cast<xenos::ShaderType>(addr_type & 0x3);\n  uint32_t addr = addr_type & ~0x3;\n  uint32_t start_size = reader->ReadAndSwap<uint32_t>();\n  uint32_t start = start_size >> 16;\n  uint32_t size_dwords = start_size & 0xFFFF;  // dwords\n  assert_true(start == 0);\n  trace_writer_.WriteMemoryRead(CpuToGpu(addr), size_dwords * 4);\n  auto shader =\n      LoadShader(shader_type, addr, memory_->TranslatePhysical<uint32_t*>(addr),\n                 size_dwords);\n  switch (shader_type) {\n    case xenos::ShaderType::kVertex:\n      active_vertex_shader_ = shader;\n      break;\n    case xenos::ShaderType::kPixel:\n      active_pixel_shader_ = shader;\n      break;\n    default:\n      assert_unhandled_case(shader_type);\n      return false;\n  }\n  return true;\n}\n\nbool CommandProcessor::ExecutePacketType3_IM_LOAD_IMMEDIATE(RingBuffer* reader,\n                                                            uint32_t packet,\n                                                            uint32_t count) {\n  SCOPE_profile_cpu_f(\"gpu\");\n\n  // load sequencer instruction memory (code embedded in packet)\n  uint32_t dword0 = reader->ReadAndSwap<uint32_t>();\n  uint32_t dword1 = reader->ReadAndSwap<uint32_t>();\n  auto shader_type = static_cast<xenos::ShaderType>(dword0);\n  uint32_t start_size = dword1;\n  uint32_t start = start_size >> 16;\n  uint32_t size_dwords = start_size & 0xFFFF;  // dwords\n  assert_true(start == 0);\n  assert_true(reader->read_count() >= size_dwords * 4);\n  assert_true(count - 2 >= size_dwords);\n  auto shader =\n      LoadShader(shader_type, uint32_t(reader->read_ptr()),\n                 reinterpret_cast<uint32_t*>(reader->read_ptr()), size_dwords);\n  switch (shader_type) {\n    case xenos::ShaderType::kVertex:\n      active_vertex_shader_ = shader;\n      break;\n    case xenos::ShaderType::kPixel:\n      active_pixel_shader_ = shader;\n      break;\n    default:\n      assert_unhandled_case(shader_type);\n      return false;\n  }\n  reader->AdvanceRead(size_dwords * sizeof(uint32_t));\n  return true;\n}\n\nbool CommandProcessor::ExecutePacketType3_INVALIDATE_STATE(RingBuffer* reader,\n                                                           uint32_t packet,\n                                                           uint32_t count) {\n  // selective invalidation of state pointers\n  /*uint32_t mask =*/reader->ReadAndSwap<uint32_t>();\n  // driver_->InvalidateState(mask);\n  return true;\n}\n\nbool CommandProcessor::ExecutePacketType3_VIZ_QUERY(RingBuffer* reader,\n                                                    uint32_t packet,\n                                                    uint32_t count) {\n  // begin/end initiator for viz query extent processing\n  // https://www.google.com/patents/US20050195186\n  assert_true(count == 1);\n\n  uint32_t dword0 = reader->ReadAndSwap<uint32_t>();\n\n  uint32_t id = dword0 & 0x3F;\n  uint32_t end = dword0 & 0x100;\n  if (!end) {\n    // begin a new viz query @ id\n    // On hardware this clears the internal state of the scan converter (which\n    // is different to the register)\n    WriteRegister(XE_GPU_REG_VGT_EVENT_INITIATOR, VIZQUERY_START);\n    XELOGGPU(\"Begin viz query ID {:02X}\", id);\n  } else {\n    // end the viz query\n    WriteRegister(XE_GPU_REG_VGT_EVENT_INITIATOR, VIZQUERY_END);\n    XELOGGPU(\"End viz query ID {:02X}\", id);\n    // The scan converter writes the internal result back to the register here.\n    // We just fake it and say it was visible in case it is read back.\n    if (id < 32) {\n      register_file_->values[XE_GPU_REG_PA_SC_VIZ_QUERY_STATUS_0] |= uint32_t(1)\n                                                                     << id;\n    } else {\n      register_file_->values[XE_GPU_REG_PA_SC_VIZ_QUERY_STATUS_1] |=\n          uint32_t(1) << (id - 32);\n    }\n  }\n\n  return true;\n}\n\nvoid CommandProcessor::InitializeTrace() {\n  // Write the initial register values, to be loaded directly into the\n  // RegisterFile since all registers, including those that may have side\n  // effects on setting, will be saved.\n  trace_writer_.WriteRegisters(0, register_file_->values,\n                               RegisterFile::kRegisterCount, false);\n\n  trace_writer_.WriteGammaRamp(gamma_ramp_256_entry_table(),\n                               gamma_ramp_pwl_rgb(), gamma_ramp_rw_component_);\n}\n\n}  // namespace gpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/command_processor.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_COMMAND_PROCESSOR_H_\n#define XENIA_GPU_COMMAND_PROCESSOR_H_\n\n#include <atomic>\n#include <cstring>\n#include <functional>\n#include <memory>\n#include <mutex>\n#include <queue>\n#include <string>\n#include <vector>\n\n#include \"xenia/base/ring_buffer.h\"\n#include \"xenia/base/threading.h\"\n#include \"xenia/gpu/register_file.h\"\n#include \"xenia/gpu/registers.h\"\n#include \"xenia/gpu/trace_writer.h\"\n#include \"xenia/gpu/xenos.h\"\n#include \"xenia/kernel/xthread.h\"\n#include \"xenia/memory.h\"\n#include \"xenia/ui/presenter.h\"\n\nnamespace xe {\n\nclass ByteStream;\n\nnamespace gpu {\n\nclass GraphicsSystem;\nclass Shader;\n\nstruct SwapState {\n  // Lock must be held when changing data in this structure.\n  std::mutex mutex;\n  // Dimensions of the framebuffer textures. Should match window size.\n  uint32_t width = 0;\n  uint32_t height = 0;\n  // Current front buffer, being drawn to the screen.\n  uintptr_t front_buffer_texture = 0;\n  // Current back buffer, being updated by the CP.\n  uintptr_t back_buffer_texture = 0;\n  // Backend data\n  void* backend_data = nullptr;\n  // Whether the back buffer is dirty and a swap is pending.\n  bool pending = false;\n};\n\nenum class SwapMode {\n  kNormal,\n  kIgnored,\n};\n\nenum class GammaRampType {\n  kUnknown = 0,\n  kTable,\n  kPWL,\n};\n\nclass CommandProcessor {\n public:\n  enum class SwapPostEffect {\n    kNone,\n    kFxaa,\n    kFxaaExtreme,\n  };\n\n  CommandProcessor(GraphicsSystem* graphics_system,\n                   kernel::KernelState* kernel_state);\n  virtual ~CommandProcessor();\n\n  uint32_t counter() const { return counter_; }\n  void increment_counter() { counter_++; }\n\n  Shader* active_vertex_shader() const { return active_vertex_shader_; }\n  Shader* active_pixel_shader() const { return active_pixel_shader_; }\n\n  virtual bool Initialize();\n  virtual void Shutdown();\n\n  void CallInThread(std::function<void()> fn);\n\n  virtual void ClearCaches();\n\n  // \"Desired\" is for the external thread managing the post-processing effect.\n  SwapPostEffect GetDesiredSwapPostEffect() const {\n    return swap_post_effect_desired_;\n  }\n  void SetDesiredSwapPostEffect(SwapPostEffect swap_post_effect);\n  // Implementations must not make assumptions that the front buffer will\n  // necessarily be a resolve destination - it may be a texture generated by any\n  // means like written to by the CPU or loaded from a file (the disclaimer\n  // screen right in the beginning of 4D530AA4 is not a resolved render target,\n  // for instance).\n  virtual void IssueSwap(uint32_t frontbuffer_ptr, uint32_t frontbuffer_width,\n                         uint32_t frontbuffer_height) = 0;\n\n  // May be called not only from the command processor thread when the command\n  // processor is paused, and the termination of this function may be explicitly\n  // awaited.\n  virtual void InitializeShaderStorage(const std::filesystem::path& cache_root,\n                                       uint32_t title_id, bool blocking);\n\n  virtual void RequestFrameTrace(const std::filesystem::path& root_path);\n  virtual void BeginTracing(const std::filesystem::path& root_path);\n  virtual void EndTracing();\n\n  virtual void TracePlaybackWroteMemory(uint32_t base_ptr, uint32_t length) = 0;\n\n  void RestoreRegisters(uint32_t first_register,\n                        const uint32_t* register_values,\n                        uint32_t register_count, bool execute_callbacks);\n  void RestoreGammaRamp(\n      const reg::DC_LUT_30_COLOR* new_gamma_ramp_256_entry_table,\n      const reg::DC_LUT_PWL_DATA* new_gamma_ramp_pwl_rgb,\n      uint32_t new_gamma_ramp_rw_component);\n  virtual void RestoreEdramSnapshot(const void* snapshot) = 0;\n\n  void InitializeRingBuffer(uint32_t ptr, uint32_t size_log2);\n  void EnableReadPointerWriteBack(uint32_t ptr, uint32_t block_size_log2);\n\n  void UpdateWritePointer(uint32_t value);\n\n  void ExecutePacket(uint32_t ptr, uint32_t count);\n\n  bool is_paused() const { return paused_; }\n  void Pause();\n  void Resume();\n\n  bool Save(ByteStream* stream);\n  bool Restore(ByteStream* stream);\n\n protected:\n  struct IndexBufferInfo {\n    xenos::IndexFormat format = xenos::IndexFormat::kInt16;\n    xenos::Endian endianness = xenos::Endian::kNone;\n    uint32_t count = 0;\n    uint32_t guest_base = 0;\n    size_t length = 0;\n  };\n\n  void WorkerThreadMain();\n  virtual bool SetupContext() = 0;\n  virtual void ShutdownContext() = 0;\n\n  virtual void WriteRegister(uint32_t index, uint32_t value);\n\n  const reg::DC_LUT_30_COLOR* gamma_ramp_256_entry_table() const {\n    return gamma_ramp_256_entry_table_;\n  }\n  const reg::DC_LUT_PWL_DATA* gamma_ramp_pwl_rgb() const {\n    return gamma_ramp_pwl_rgb_[0];\n  }\n  virtual void OnGammaRamp256EntryTableValueWritten() {}\n  virtual void OnGammaRampPWLValueWritten() {}\n\n  virtual void MakeCoherent();\n  virtual void PrepareForWait();\n  virtual void ReturnFromWait();\n\n  uint32_t ExecutePrimaryBuffer(uint32_t start_index, uint32_t end_index);\n  virtual void OnPrimaryBufferEnd() {}\n  void ExecuteIndirectBuffer(uint32_t ptr, uint32_t length);\n  bool ExecutePacket(RingBuffer* reader);\n  bool ExecutePacketType0(RingBuffer* reader, uint32_t packet);\n  bool ExecutePacketType1(RingBuffer* reader, uint32_t packet);\n  bool ExecutePacketType2(RingBuffer* reader, uint32_t packet);\n  bool ExecutePacketType3(RingBuffer* reader, uint32_t packet);\n  bool ExecutePacketType3_ME_INIT(RingBuffer* reader, uint32_t packet,\n                                  uint32_t count);\n  bool ExecutePacketType3_NOP(RingBuffer* reader, uint32_t packet,\n                              uint32_t count);\n  bool ExecutePacketType3_INTERRUPT(RingBuffer* reader, uint32_t packet,\n                                    uint32_t count);\n  bool ExecutePacketType3_XE_SWAP(RingBuffer* reader, uint32_t packet,\n                                  uint32_t count);\n  bool ExecutePacketType3_INDIRECT_BUFFER(RingBuffer* reader, uint32_t packet,\n                                          uint32_t count);\n  bool ExecutePacketType3_WAIT_REG_MEM(RingBuffer* reader, uint32_t packet,\n                                       uint32_t count);\n  bool ExecutePacketType3_REG_RMW(RingBuffer* reader, uint32_t packet,\n                                  uint32_t count);\n  bool ExecutePacketType3_REG_TO_MEM(RingBuffer* reader, uint32_t packet,\n                                     uint32_t count);\n  bool ExecutePacketType3_MEM_WRITE(RingBuffer* reader, uint32_t packet,\n                                    uint32_t count);\n  bool ExecutePacketType3_COND_WRITE(RingBuffer* reader, uint32_t packet,\n                                     uint32_t count);\n  bool ExecutePacketType3_EVENT_WRITE(RingBuffer* reader, uint32_t packet,\n                                      uint32_t count);\n  bool ExecutePacketType3_EVENT_WRITE_SHD(RingBuffer* reader, uint32_t packet,\n                                          uint32_t count);\n  bool ExecutePacketType3_EVENT_WRITE_EXT(RingBuffer* reader, uint32_t packet,\n                                          uint32_t count);\n  bool ExecutePacketType3_EVENT_WRITE_ZPD(RingBuffer* reader, uint32_t packet,\n                                          uint32_t count);\n  bool ExecutePacketType3Draw(RingBuffer* reader, uint32_t packet,\n                              const char* opcode_name,\n                              uint32_t viz_query_condition,\n                              uint32_t count_remaining);\n  bool ExecutePacketType3_DRAW_INDX(RingBuffer* reader, uint32_t packet,\n                                    uint32_t count);\n  bool ExecutePacketType3_DRAW_INDX_2(RingBuffer* reader, uint32_t packet,\n                                      uint32_t count);\n  bool ExecutePacketType3_SET_CONSTANT(RingBuffer* reader, uint32_t packet,\n                                       uint32_t count);\n  bool ExecutePacketType3_SET_CONSTANT2(RingBuffer* reader, uint32_t packet,\n                                        uint32_t count);\n  bool ExecutePacketType3_LOAD_ALU_CONSTANT(RingBuffer* reader, uint32_t packet,\n                                            uint32_t count);\n  bool ExecutePacketType3_SET_SHADER_CONSTANTS(RingBuffer* reader,\n                                               uint32_t packet, uint32_t count);\n  bool ExecutePacketType3_IM_LOAD(RingBuffer* reader, uint32_t packet,\n                                  uint32_t count);\n  bool ExecutePacketType3_IM_LOAD_IMMEDIATE(RingBuffer* reader,\n\n                                            uint32_t packet, uint32_t count);\n  bool ExecutePacketType3_INVALIDATE_STATE(RingBuffer* reader, uint32_t packet,\n                                           uint32_t count);\n  bool ExecutePacketType3_VIZ_QUERY(RingBuffer* reader, uint32_t packet,\n                                    uint32_t count);\n\n  virtual Shader* LoadShader(xenos::ShaderType shader_type,\n                             uint32_t guest_address,\n                             const uint32_t* host_address,\n                             uint32_t dword_count) = 0;\n\n  virtual bool IssueDraw(xenos::PrimitiveType prim_type, uint32_t index_count,\n                         IndexBufferInfo* index_buffer_info,\n                         bool major_mode_explicit) = 0;\n  virtual bool IssueCopy() = 0;\n\n  // \"Actual\" is for the command processor thread, to be read by the\n  // implementations.\n  SwapPostEffect GetActualSwapPostEffect() const {\n    return swap_post_effect_actual_;\n  }\n\n  virtual void InitializeTrace();\n\n  Memory* memory_ = nullptr;\n  kernel::KernelState* kernel_state_ = nullptr;\n  GraphicsSystem* graphics_system_ = nullptr;\n  RegisterFile* register_file_ = nullptr;\n\n  TraceWriter trace_writer_;\n  enum class TraceState {\n    kDisabled,\n    kStreaming,\n    kSingleFrame,\n  };\n  TraceState trace_state_ = TraceState::kDisabled;\n  std::filesystem::path trace_stream_path_;\n  std::filesystem::path trace_frame_path_;\n\n  std::atomic<bool> worker_running_;\n  kernel::object_ref<kernel::XHostThread> worker_thread_;\n\n  std::queue<std::function<void()>> pending_fns_;\n\n  // MicroEngine binary from PM4_ME_INIT\n  std::vector<uint32_t> me_bin_;\n\n  uint32_t counter_ = 0;\n\n  uint32_t primary_buffer_ptr_ = 0;\n  uint32_t primary_buffer_size_ = 0;\n\n  uint32_t read_ptr_index_ = 0;\n  uint32_t read_ptr_update_freq_ = 0;\n  uint32_t read_ptr_writeback_ptr_ = 0;\n\n  std::unique_ptr<xe::threading::Event> write_ptr_index_event_;\n  std::atomic<uint32_t> write_ptr_index_;\n\n  uint64_t bin_select_ = 0xFFFFFFFFull;\n  uint64_t bin_mask_ = 0xFFFFFFFFull;\n\n  Shader* active_vertex_shader_ = nullptr;\n  Shader* active_pixel_shader_ = nullptr;\n\n  bool paused_ = false;\n\n  // By default (such as for tools), post-processing is disabled.\n  // \"Desired\" is for the external thread managing the post-processing effect.\n  SwapPostEffect swap_post_effect_desired_ = SwapPostEffect::kNone;\n  SwapPostEffect swap_post_effect_actual_ = SwapPostEffect::kNone;\n\n private:\n  reg::DC_LUT_30_COLOR gamma_ramp_256_entry_table_[256] = {};\n  reg::DC_LUT_PWL_DATA gamma_ramp_pwl_rgb_[128][3] = {};\n  uint32_t gamma_ramp_rw_component_ = 0;\n};\n\n}  // namespace gpu\n}  // namespace xe\n\n#endif  // XENIA_GPU_COMMAND_PROCESSOR_H_\n"
  },
  {
    "path": "src/xenia/gpu/d3d12/d3d12_command_processor.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include <algorithm>\n#include <cstring>\n#include <sstream>\n#include <utility>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/byte_order.h\"\n#include \"xenia/base/cvar.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/memory.h\"\n#include \"xenia/base/profiling.h\"\n#include \"xenia/gpu/d3d12/d3d12_command_processor.h\"\n#include \"xenia/gpu/d3d12/d3d12_graphics_system.h\"\n#include \"xenia/gpu/d3d12/d3d12_shader.h\"\n#include \"xenia/gpu/draw_util.h\"\n#include \"xenia/gpu/gpu_flags.h\"\n#include \"xenia/gpu/registers.h\"\n#include \"xenia/gpu/xenos.h\"\n#include \"xenia/ui/d3d12/d3d12_presenter.h\"\n#include \"xenia/ui/d3d12/d3d12_util.h\"\n\nDEFINE_bool(d3d12_bindless, true,\n            \"Use bindless resources where available - may improve performance, \"\n            \"but may make debugging more complicated.\",\n            \"D3D12\");\nDEFINE_bool(d3d12_readback_memexport, false,\n            \"Read data written by memory export in shaders on the CPU. This \"\n            \"may be needed in some games (but many only access exported data \"\n            \"on the GPU, and this flag isn't needed to handle such behavior), \"\n            \"but causes mid-frame synchronization, so it has a huge \"\n            \"performance impact.\",\n            \"D3D12\");\nDEFINE_bool(d3d12_readback_resolve, false,\n            \"Read render-to-texture results on the CPU. This may be needed in \"\n            \"some games, for instance, for screenshots in saved games, but \"\n            \"causes mid-frame synchronization, so it has a huge performance \"\n            \"impact.\",\n            \"D3D12\");\nDEFINE_bool(d3d12_submit_on_primary_buffer_end, true,\n            \"Submit the command list when a PM4 primary buffer ends if it's \"\n            \"possible to submit immediately to try to reduce frame latency.\",\n            \"D3D12\");\n\nnamespace xe {\nnamespace gpu {\nnamespace d3d12 {\n\n// Generated with `xb buildshaders`.\nnamespace shaders {\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/apply_gamma_pwl_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/apply_gamma_pwl_fxaa_luma_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/apply_gamma_table_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/apply_gamma_table_fxaa_luma_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/fxaa_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/fxaa_extreme_cs.h\"\n}  // namespace shaders\n\nD3D12CommandProcessor::D3D12CommandProcessor(\n    D3D12GraphicsSystem* graphics_system, kernel::KernelState* kernel_state)\n    : CommandProcessor(graphics_system, kernel_state),\n      deferred_command_list_(*this) {}\nD3D12CommandProcessor::~D3D12CommandProcessor() = default;\n\nvoid D3D12CommandProcessor::ClearCaches() {\n  CommandProcessor::ClearCaches();\n  cache_clear_requested_ = true;\n}\n\nvoid D3D12CommandProcessor::InitializeShaderStorage(\n    const std::filesystem::path& cache_root, uint32_t title_id, bool blocking) {\n  CommandProcessor::InitializeShaderStorage(cache_root, title_id, blocking);\n  pipeline_cache_->InitializeShaderStorage(cache_root, title_id, blocking);\n}\n\nvoid D3D12CommandProcessor::RequestFrameTrace(\n    const std::filesystem::path& root_path) {\n  // Capture with PIX if attached.\n  if (GetD3D12Provider().GetGraphicsAnalysis() != nullptr) {\n    pix_capture_requested_.store(true, std::memory_order_relaxed);\n    return;\n  }\n  CommandProcessor::RequestFrameTrace(root_path);\n}\n\nvoid D3D12CommandProcessor::TracePlaybackWroteMemory(uint32_t base_ptr,\n                                                     uint32_t length) {\n  shared_memory_->MemoryInvalidationCallback(base_ptr, length, true);\n  primitive_processor_->MemoryInvalidationCallback(base_ptr, length, true);\n}\n\nvoid D3D12CommandProcessor::RestoreEdramSnapshot(const void* snapshot) {\n  // Starting a new frame because descriptors may be needed.\n  if (!BeginSubmission(true)) {\n    return;\n  }\n  render_target_cache_->RestoreEdramSnapshot(snapshot);\n}\n\nbool D3D12CommandProcessor::PushTransitionBarrier(\n    ID3D12Resource* resource, D3D12_RESOURCE_STATES old_state,\n    D3D12_RESOURCE_STATES new_state, UINT subresource) {\n  if (old_state == new_state) {\n    return false;\n  }\n  D3D12_RESOURCE_BARRIER barrier;\n  barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;\n  barrier.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE;\n  barrier.Transition.pResource = resource;\n  barrier.Transition.Subresource = subresource;\n  barrier.Transition.StateBefore = old_state;\n  barrier.Transition.StateAfter = new_state;\n  barriers_.push_back(barrier);\n  return true;\n}\n\nvoid D3D12CommandProcessor::PushAliasingBarrier(ID3D12Resource* old_resource,\n                                                ID3D12Resource* new_resource) {\n  D3D12_RESOURCE_BARRIER barrier;\n  barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_ALIASING;\n  barrier.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE;\n  barrier.Aliasing.pResourceBefore = old_resource;\n  barrier.Aliasing.pResourceAfter = new_resource;\n  barriers_.push_back(barrier);\n}\n\nvoid D3D12CommandProcessor::PushUAVBarrier(ID3D12Resource* resource) {\n  D3D12_RESOURCE_BARRIER barrier;\n  barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_UAV;\n  barrier.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE;\n  barrier.UAV.pResource = resource;\n  barriers_.push_back(barrier);\n}\n\nvoid D3D12CommandProcessor::SubmitBarriers() {\n  UINT barrier_count = UINT(barriers_.size());\n  if (barrier_count != 0) {\n    deferred_command_list_.D3DResourceBarrier(barrier_count, barriers_.data());\n    barriers_.clear();\n  }\n}\n\nID3D12RootSignature* D3D12CommandProcessor::GetRootSignature(\n    const DxbcShader* vertex_shader, const DxbcShader* pixel_shader,\n    bool tessellated) {\n  if (bindless_resources_used_) {\n    return tessellated ? root_signature_bindless_ds_\n                       : root_signature_bindless_vs_;\n  }\n\n  D3D12_SHADER_VISIBILITY vertex_visibility =\n      tessellated ? D3D12_SHADER_VISIBILITY_DOMAIN\n                  : D3D12_SHADER_VISIBILITY_VERTEX;\n\n  uint32_t texture_count_vertex =\n      uint32_t(vertex_shader->GetTextureBindingsAfterTranslation().size());\n  uint32_t sampler_count_vertex =\n      uint32_t(vertex_shader->GetSamplerBindingsAfterTranslation().size());\n  uint32_t texture_count_pixel =\n      pixel_shader\n          ? uint32_t(pixel_shader->GetTextureBindingsAfterTranslation().size())\n          : 0;\n  uint32_t sampler_count_pixel =\n      pixel_shader\n          ? uint32_t(pixel_shader->GetSamplerBindingsAfterTranslation().size())\n          : 0;\n\n  // Better put the pixel texture/sampler in the lower bits probably because it\n  // changes often.\n  uint32_t index = 0;\n  uint32_t index_offset = 0;\n  index |= texture_count_pixel << index_offset;\n  index_offset += D3D12Shader::kMaxTextureBindingIndexBits;\n  index |= sampler_count_pixel << index_offset;\n  index_offset += D3D12Shader::kMaxSamplerBindingIndexBits;\n  index |= texture_count_vertex << index_offset;\n  index_offset += D3D12Shader::kMaxTextureBindingIndexBits;\n  index |= sampler_count_vertex << index_offset;\n  index_offset += D3D12Shader::kMaxSamplerBindingIndexBits;\n  index |= uint32_t(vertex_visibility == D3D12_SHADER_VISIBILITY_DOMAIN)\n           << index_offset;\n  ++index_offset;\n  assert_true(index_offset <= 32);\n\n  // Try an existing root signature.\n  auto it = root_signatures_bindful_.find(index);\n  if (it != root_signatures_bindful_.end()) {\n    return it->second;\n  }\n\n  // Create a new one.\n  D3D12_ROOT_SIGNATURE_DESC desc;\n  D3D12_ROOT_PARAMETER parameters[kRootParameter_Bindful_Count_Max];\n  desc.NumParameters = kRootParameter_Bindful_Count_Base;\n  desc.pParameters = parameters;\n  desc.NumStaticSamplers = 0;\n  desc.pStaticSamplers = nullptr;\n  desc.Flags = D3D12_ROOT_SIGNATURE_FLAG_NONE;\n\n  // Base parameters.\n\n  // Fetch constants.\n  {\n    auto& parameter = parameters[kRootParameter_Bindful_FetchConstants];\n    parameter.ParameterType = D3D12_ROOT_PARAMETER_TYPE_CBV;\n    parameter.Descriptor.ShaderRegister =\n        uint32_t(DxbcShaderTranslator::CbufferRegister::kFetchConstants);\n    parameter.Descriptor.RegisterSpace = 0;\n    parameter.ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;\n  }\n\n  // Vertex float constants.\n  {\n    auto& parameter = parameters[kRootParameter_Bindful_FloatConstantsVertex];\n    parameter.ParameterType = D3D12_ROOT_PARAMETER_TYPE_CBV;\n    parameter.Descriptor.ShaderRegister =\n        uint32_t(DxbcShaderTranslator::CbufferRegister::kFloatConstants);\n    parameter.Descriptor.RegisterSpace = 0;\n    parameter.ShaderVisibility = vertex_visibility;\n  }\n\n  // Pixel float constants.\n  {\n    auto& parameter = parameters[kRootParameter_Bindful_FloatConstantsPixel];\n    parameter.ParameterType = D3D12_ROOT_PARAMETER_TYPE_CBV;\n    parameter.Descriptor.ShaderRegister =\n        uint32_t(DxbcShaderTranslator::CbufferRegister::kFloatConstants);\n    parameter.Descriptor.RegisterSpace = 0;\n    parameter.ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL;\n  }\n\n  // System constants.\n  {\n    auto& parameter = parameters[kRootParameter_Bindful_SystemConstants];\n    parameter.ParameterType = D3D12_ROOT_PARAMETER_TYPE_CBV;\n    parameter.Descriptor.ShaderRegister =\n        uint32_t(DxbcShaderTranslator::CbufferRegister::kSystemConstants);\n    parameter.Descriptor.RegisterSpace = 0;\n    parameter.ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;\n  }\n\n  // Bool and loop constants.\n  {\n    auto& parameter = parameters[kRootParameter_Bindful_BoolLoopConstants];\n    parameter.ParameterType = D3D12_ROOT_PARAMETER_TYPE_CBV;\n    parameter.Descriptor.ShaderRegister =\n        uint32_t(DxbcShaderTranslator::CbufferRegister::kBoolLoopConstants);\n    parameter.Descriptor.RegisterSpace = 0;\n    parameter.ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;\n  }\n\n  // Shared memory and, if ROVs are used, EDRAM.\n  D3D12_DESCRIPTOR_RANGE shared_memory_and_edram_ranges[3];\n  {\n    auto& parameter = parameters[kRootParameter_Bindful_SharedMemoryAndEdram];\n    parameter.ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;\n    parameter.DescriptorTable.NumDescriptorRanges = 2;\n    parameter.DescriptorTable.pDescriptorRanges =\n        shared_memory_and_edram_ranges;\n    parameter.ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;\n    shared_memory_and_edram_ranges[0].RangeType =\n        D3D12_DESCRIPTOR_RANGE_TYPE_SRV;\n    shared_memory_and_edram_ranges[0].NumDescriptors = 1;\n    shared_memory_and_edram_ranges[0].BaseShaderRegister =\n        uint32_t(DxbcShaderTranslator::SRVMainRegister::kSharedMemory);\n    shared_memory_and_edram_ranges[0].RegisterSpace =\n        uint32_t(DxbcShaderTranslator::SRVSpace::kMain);\n    shared_memory_and_edram_ranges[0].OffsetInDescriptorsFromTableStart = 0;\n    shared_memory_and_edram_ranges[1].RangeType =\n        D3D12_DESCRIPTOR_RANGE_TYPE_UAV;\n    shared_memory_and_edram_ranges[1].NumDescriptors = 1;\n    shared_memory_and_edram_ranges[1].BaseShaderRegister =\n        UINT(DxbcShaderTranslator::UAVRegister::kSharedMemory);\n    shared_memory_and_edram_ranges[1].RegisterSpace = 0;\n    shared_memory_and_edram_ranges[1].OffsetInDescriptorsFromTableStart = 1;\n    if (render_target_cache_->GetPath() ==\n        RenderTargetCache::Path::kPixelShaderInterlock) {\n      ++parameter.DescriptorTable.NumDescriptorRanges;\n      shared_memory_and_edram_ranges[2].RangeType =\n          D3D12_DESCRIPTOR_RANGE_TYPE_UAV;\n      shared_memory_and_edram_ranges[2].NumDescriptors = 1;\n      shared_memory_and_edram_ranges[2].BaseShaderRegister =\n          UINT(DxbcShaderTranslator::UAVRegister::kEdram);\n      shared_memory_and_edram_ranges[2].RegisterSpace = 0;\n      shared_memory_and_edram_ranges[2].OffsetInDescriptorsFromTableStart = 2;\n    }\n  }\n\n  // Extra parameters.\n\n  // Pixel textures.\n  D3D12_DESCRIPTOR_RANGE range_textures_pixel;\n  if (texture_count_pixel > 0) {\n    auto& parameter = parameters[desc.NumParameters];\n    parameter.ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;\n    parameter.DescriptorTable.NumDescriptorRanges = 1;\n    parameter.DescriptorTable.pDescriptorRanges = &range_textures_pixel;\n    parameter.ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL;\n    range_textures_pixel.RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV;\n    range_textures_pixel.NumDescriptors = texture_count_pixel;\n    range_textures_pixel.BaseShaderRegister =\n        uint32_t(DxbcShaderTranslator::SRVMainRegister::kBindfulTexturesStart);\n    range_textures_pixel.RegisterSpace =\n        uint32_t(DxbcShaderTranslator::SRVSpace::kMain);\n    range_textures_pixel.OffsetInDescriptorsFromTableStart = 0;\n    ++desc.NumParameters;\n  }\n\n  // Pixel samplers.\n  D3D12_DESCRIPTOR_RANGE range_samplers_pixel;\n  if (sampler_count_pixel > 0) {\n    auto& parameter = parameters[desc.NumParameters];\n    parameter.ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;\n    parameter.DescriptorTable.NumDescriptorRanges = 1;\n    parameter.DescriptorTable.pDescriptorRanges = &range_samplers_pixel;\n    parameter.ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL;\n    range_samplers_pixel.RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER;\n    range_samplers_pixel.NumDescriptors = sampler_count_pixel;\n    range_samplers_pixel.BaseShaderRegister = 0;\n    range_samplers_pixel.RegisterSpace = 0;\n    range_samplers_pixel.OffsetInDescriptorsFromTableStart = 0;\n    ++desc.NumParameters;\n  }\n\n  // Vertex textures.\n  D3D12_DESCRIPTOR_RANGE range_textures_vertex;\n  if (texture_count_vertex > 0) {\n    auto& parameter = parameters[desc.NumParameters];\n    parameter.ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;\n    parameter.DescriptorTable.NumDescriptorRanges = 1;\n    parameter.DescriptorTable.pDescriptorRanges = &range_textures_vertex;\n    parameter.ShaderVisibility = vertex_visibility;\n    range_textures_vertex.RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV;\n    range_textures_vertex.NumDescriptors = texture_count_vertex;\n    range_textures_vertex.BaseShaderRegister =\n        uint32_t(DxbcShaderTranslator::SRVMainRegister::kBindfulTexturesStart);\n    range_textures_vertex.RegisterSpace =\n        uint32_t(DxbcShaderTranslator::SRVSpace::kMain);\n    range_textures_vertex.OffsetInDescriptorsFromTableStart = 0;\n    ++desc.NumParameters;\n  }\n\n  // Vertex samplers.\n  D3D12_DESCRIPTOR_RANGE range_samplers_vertex;\n  if (sampler_count_vertex > 0) {\n    auto& parameter = parameters[desc.NumParameters];\n    parameter.ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;\n    parameter.DescriptorTable.NumDescriptorRanges = 1;\n    parameter.DescriptorTable.pDescriptorRanges = &range_samplers_vertex;\n    parameter.ShaderVisibility = vertex_visibility;\n    range_samplers_vertex.RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER;\n    range_samplers_vertex.NumDescriptors = sampler_count_vertex;\n    range_samplers_vertex.BaseShaderRegister = 0;\n    range_samplers_vertex.RegisterSpace = 0;\n    range_samplers_vertex.OffsetInDescriptorsFromTableStart = 0;\n    ++desc.NumParameters;\n  }\n\n  ID3D12RootSignature* root_signature =\n      ui::d3d12::util::CreateRootSignature(GetD3D12Provider(), desc);\n  if (root_signature == nullptr) {\n    XELOGE(\n        \"Failed to create a root signature with {} pixel textures, {} pixel \"\n        \"samplers, {} vertex textures and {} vertex samplers\",\n        texture_count_pixel, sampler_count_pixel, texture_count_vertex,\n        sampler_count_vertex);\n    return nullptr;\n  }\n  root_signatures_bindful_.emplace(index, root_signature);\n  return root_signature;\n}\n\nuint32_t D3D12CommandProcessor::GetRootBindfulExtraParameterIndices(\n    const DxbcShader* vertex_shader, const DxbcShader* pixel_shader,\n    RootBindfulExtraParameterIndices& indices_out) {\n  uint32_t index = kRootParameter_Bindful_Count_Base;\n  if (pixel_shader &&\n      !pixel_shader->GetTextureBindingsAfterTranslation().empty()) {\n    indices_out.textures_pixel = index++;\n  } else {\n    indices_out.textures_pixel = RootBindfulExtraParameterIndices::kUnavailable;\n  }\n  if (pixel_shader &&\n      !pixel_shader->GetSamplerBindingsAfterTranslation().empty()) {\n    indices_out.samplers_pixel = index++;\n  } else {\n    indices_out.samplers_pixel = RootBindfulExtraParameterIndices::kUnavailable;\n  }\n  if (!vertex_shader->GetTextureBindingsAfterTranslation().empty()) {\n    indices_out.textures_vertex = index++;\n  } else {\n    indices_out.textures_vertex =\n        RootBindfulExtraParameterIndices::kUnavailable;\n  }\n  if (!vertex_shader->GetSamplerBindingsAfterTranslation().empty()) {\n    indices_out.samplers_vertex = index++;\n  } else {\n    indices_out.samplers_vertex =\n        RootBindfulExtraParameterIndices::kUnavailable;\n  }\n  return index;\n}\n\nuint64_t D3D12CommandProcessor::RequestViewBindfulDescriptors(\n    uint64_t previous_heap_index, uint32_t count_for_partial_update,\n    uint32_t count_for_full_update, D3D12_CPU_DESCRIPTOR_HANDLE& cpu_handle_out,\n    D3D12_GPU_DESCRIPTOR_HANDLE& gpu_handle_out) {\n  assert_false(bindless_resources_used_);\n  assert_true(submission_open_);\n  uint32_t descriptor_index;\n  uint64_t current_heap_index = view_bindful_heap_pool_->Request(\n      frame_current_, previous_heap_index, count_for_partial_update,\n      count_for_full_update, descriptor_index);\n  if (current_heap_index ==\n      ui::d3d12::D3D12DescriptorHeapPool::kHeapIndexInvalid) {\n    // There was an error.\n    return ui::d3d12::D3D12DescriptorHeapPool::kHeapIndexInvalid;\n  }\n  ID3D12DescriptorHeap* heap = view_bindful_heap_pool_->GetLastRequestHeap();\n  if (view_bindful_heap_current_ != heap) {\n    view_bindful_heap_current_ = heap;\n    deferred_command_list_.SetDescriptorHeaps(view_bindful_heap_current_,\n                                              sampler_bindful_heap_current_);\n  }\n  const ui::d3d12::D3D12Provider& provider = GetD3D12Provider();\n  cpu_handle_out = provider.OffsetViewDescriptor(\n      view_bindful_heap_pool_->GetLastRequestHeapCPUStart(), descriptor_index);\n  gpu_handle_out = provider.OffsetViewDescriptor(\n      view_bindful_heap_pool_->GetLastRequestHeapGPUStart(), descriptor_index);\n  return current_heap_index;\n}\n\nuint32_t D3D12CommandProcessor::RequestPersistentViewBindlessDescriptor() {\n  assert_true(bindless_resources_used_);\n  if (!view_bindless_heap_free_.empty()) {\n    uint32_t descriptor_index = view_bindless_heap_free_.back();\n    view_bindless_heap_free_.pop_back();\n    return descriptor_index;\n  }\n  if (view_bindless_heap_allocated_ >= kViewBindlessHeapSize) {\n    return UINT32_MAX;\n  }\n  return view_bindless_heap_allocated_++;\n}\n\nvoid D3D12CommandProcessor::ReleaseViewBindlessDescriptorImmediately(\n    uint32_t descriptor_index) {\n  assert_true(bindless_resources_used_);\n  view_bindless_heap_free_.push_back(descriptor_index);\n}\n\nbool D3D12CommandProcessor::RequestOneUseSingleViewDescriptors(\n    uint32_t count, ui::d3d12::util::DescriptorCpuGpuHandlePair* handles_out) {\n  assert_true(submission_open_);\n  if (!count) {\n    return true;\n  }\n  assert_not_null(handles_out);\n  const ui::d3d12::D3D12Provider& provider = GetD3D12Provider();\n  if (bindless_resources_used_) {\n    // Request separate bindless descriptors that will be freed when this\n    // submission is completed by the GPU.\n    if (count > kViewBindlessHeapSize - view_bindless_heap_allocated_ +\n                    view_bindless_heap_free_.size()) {\n      return false;\n    }\n    for (uint32_t i = 0; i < count; ++i) {\n      uint32_t descriptor_index;\n      if (!view_bindless_heap_free_.empty()) {\n        descriptor_index = view_bindless_heap_free_.back();\n        view_bindless_heap_free_.pop_back();\n      } else {\n        descriptor_index = view_bindless_heap_allocated_++;\n      }\n      view_bindless_one_use_descriptors_.emplace_back(descriptor_index,\n                                                      GetCurrentSubmission());\n      handles_out[i] =\n          std::make_pair(provider.OffsetViewDescriptor(\n                             view_bindless_heap_cpu_start_, descriptor_index),\n                         provider.OffsetViewDescriptor(\n                             view_bindless_heap_gpu_start_, descriptor_index));\n    }\n  } else {\n    // Request a range within the current heap for bindful resources path.\n    D3D12_CPU_DESCRIPTOR_HANDLE cpu_handle_start;\n    D3D12_GPU_DESCRIPTOR_HANDLE gpu_handle_start;\n    if (RequestViewBindfulDescriptors(\n            ui::d3d12::D3D12DescriptorHeapPool::kHeapIndexInvalid, count, count,\n            cpu_handle_start, gpu_handle_start) ==\n        ui::d3d12::D3D12DescriptorHeapPool::kHeapIndexInvalid) {\n      return false;\n    }\n    for (uint32_t i = 0; i < count; ++i) {\n      handles_out[i] =\n          std::make_pair(provider.OffsetViewDescriptor(cpu_handle_start, i),\n                         provider.OffsetViewDescriptor(gpu_handle_start, i));\n    }\n  }\n  return true;\n}\n\nui::d3d12::util::DescriptorCpuGpuHandlePair\nD3D12CommandProcessor::GetSystemBindlessViewHandlePair(\n    SystemBindlessView view) const {\n  assert_true(bindless_resources_used_);\n  const ui::d3d12::D3D12Provider& provider = GetD3D12Provider();\n  return std::make_pair(provider.OffsetViewDescriptor(\n                            view_bindless_heap_cpu_start_, uint32_t(view)),\n                        provider.OffsetViewDescriptor(\n                            view_bindless_heap_gpu_start_, uint32_t(view)));\n}\n\nui::d3d12::util::DescriptorCpuGpuHandlePair\nD3D12CommandProcessor::GetEdramUintPow2BindlessSRVHandlePair(\n    uint32_t element_size_bytes_pow2) const {\n  SystemBindlessView view;\n  switch (element_size_bytes_pow2) {\n    case 2:\n      view = SystemBindlessView::kEdramR32UintSRV;\n      break;\n    case 3:\n      view = SystemBindlessView::kEdramR32G32UintSRV;\n      break;\n    case 4:\n      view = SystemBindlessView::kEdramR32G32B32A32UintSRV;\n      break;\n    default:\n      assert_unhandled_case(element_size_bytes_pow2);\n      view = SystemBindlessView::kEdramR32UintSRV;\n  }\n  return GetSystemBindlessViewHandlePair(view);\n}\n\nui::d3d12::util::DescriptorCpuGpuHandlePair\nD3D12CommandProcessor::GetEdramUintPow2BindlessUAVHandlePair(\n    uint32_t element_size_bytes_pow2) const {\n  SystemBindlessView view;\n  switch (element_size_bytes_pow2) {\n    case 2:\n      view = SystemBindlessView::kEdramR32UintUAV;\n      break;\n    case 3:\n      view = SystemBindlessView::kEdramR32G32UintUAV;\n      break;\n    case 4:\n      view = SystemBindlessView::kEdramR32G32B32A32UintUAV;\n      break;\n    default:\n      assert_unhandled_case(element_size_bytes_pow2);\n      view = SystemBindlessView::kEdramR32UintUAV;\n  }\n  return GetSystemBindlessViewHandlePair(view);\n}\n\nuint64_t D3D12CommandProcessor::RequestSamplerBindfulDescriptors(\n    uint64_t previous_heap_index, uint32_t count_for_partial_update,\n    uint32_t count_for_full_update, D3D12_CPU_DESCRIPTOR_HANDLE& cpu_handle_out,\n    D3D12_GPU_DESCRIPTOR_HANDLE& gpu_handle_out) {\n  assert_false(bindless_resources_used_);\n  assert_true(submission_open_);\n  uint32_t descriptor_index;\n  uint64_t current_heap_index = sampler_bindful_heap_pool_->Request(\n      frame_current_, previous_heap_index, count_for_partial_update,\n      count_for_full_update, descriptor_index);\n  if (current_heap_index ==\n      ui::d3d12::D3D12DescriptorHeapPool::kHeapIndexInvalid) {\n    // There was an error.\n    return ui::d3d12::D3D12DescriptorHeapPool::kHeapIndexInvalid;\n  }\n  ID3D12DescriptorHeap* heap = sampler_bindful_heap_pool_->GetLastRequestHeap();\n  if (sampler_bindful_heap_current_ != heap) {\n    sampler_bindful_heap_current_ = heap;\n    deferred_command_list_.SetDescriptorHeaps(view_bindful_heap_current_,\n                                              sampler_bindful_heap_current_);\n  }\n  const ui::d3d12::D3D12Provider& provider = GetD3D12Provider();\n  cpu_handle_out = provider.OffsetSamplerDescriptor(\n      sampler_bindful_heap_pool_->GetLastRequestHeapCPUStart(),\n      descriptor_index);\n  gpu_handle_out = provider.OffsetSamplerDescriptor(\n      sampler_bindful_heap_pool_->GetLastRequestHeapGPUStart(),\n      descriptor_index);\n  return current_heap_index;\n}\n\nID3D12Resource* D3D12CommandProcessor::RequestScratchGPUBuffer(\n    uint32_t size, D3D12_RESOURCE_STATES state) {\n  assert_true(submission_open_);\n  assert_false(scratch_buffer_used_);\n  if (!submission_open_ || scratch_buffer_used_ || size == 0) {\n    return nullptr;\n  }\n\n  if (size <= scratch_buffer_size_) {\n    PushTransitionBarrier(scratch_buffer_, scratch_buffer_state_, state);\n    scratch_buffer_state_ = state;\n    scratch_buffer_used_ = true;\n    return scratch_buffer_;\n  }\n\n  size = xe::align(size, kScratchBufferSizeIncrement);\n\n  const ui::d3d12::D3D12Provider& provider = GetD3D12Provider();\n  ID3D12Device* device = provider.GetDevice();\n  D3D12_RESOURCE_DESC buffer_desc;\n  ui::d3d12::util::FillBufferResourceDesc(\n      buffer_desc, size, D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS);\n  ID3D12Resource* buffer;\n  if (FAILED(device->CreateCommittedResource(\n          &ui::d3d12::util::kHeapPropertiesDefault,\n          provider.GetHeapFlagCreateNotZeroed(), &buffer_desc, state, nullptr,\n          IID_PPV_ARGS(&buffer)))) {\n    XELOGE(\"Failed to create a {} MB scratch GPU buffer\", size >> 20);\n    return nullptr;\n  }\n  if (scratch_buffer_ != nullptr) {\n    resources_for_deletion_.emplace_back(GetCurrentSubmission(),\n                                         scratch_buffer_);\n  }\n  scratch_buffer_ = buffer;\n  scratch_buffer_size_ = size;\n  scratch_buffer_state_ = state;\n  scratch_buffer_used_ = true;\n  return scratch_buffer_;\n}\n\nvoid D3D12CommandProcessor::ReleaseScratchGPUBuffer(\n    ID3D12Resource* buffer, D3D12_RESOURCE_STATES new_state) {\n  assert_true(submission_open_);\n  assert_true(scratch_buffer_used_);\n  scratch_buffer_used_ = false;\n  if (buffer == scratch_buffer_) {\n    scratch_buffer_state_ = new_state;\n  }\n}\n\nvoid D3D12CommandProcessor::SetExternalPipeline(ID3D12PipelineState* pipeline) {\n  if (current_external_pipeline_ != pipeline) {\n    current_external_pipeline_ = pipeline;\n    current_guest_pipeline_ = nullptr;\n    deferred_command_list_.D3DSetPipelineState(pipeline);\n  }\n}\n\nvoid D3D12CommandProcessor::SetExternalGraphicsRootSignature(\n    ID3D12RootSignature* root_signature) {\n  if (current_graphics_root_signature_ != root_signature) {\n    current_graphics_root_signature_ = root_signature;\n    deferred_command_list_.D3DSetGraphicsRootSignature(root_signature);\n  }\n  // Force-invalidate because setting a non-guest root signature.\n  current_graphics_root_up_to_date_ = 0;\n}\n\nvoid D3D12CommandProcessor::SetViewport(const D3D12_VIEWPORT& viewport) {\n  ff_viewport_update_needed_ |= ff_viewport_.TopLeftX != viewport.TopLeftX;\n  ff_viewport_update_needed_ |= ff_viewport_.TopLeftY != viewport.TopLeftY;\n  ff_viewport_update_needed_ |= ff_viewport_.Width != viewport.Width;\n  ff_viewport_update_needed_ |= ff_viewport_.Height != viewport.Height;\n  ff_viewport_update_needed_ |= ff_viewport_.MinDepth != viewport.MinDepth;\n  ff_viewport_update_needed_ |= ff_viewport_.MaxDepth != viewport.MaxDepth;\n  if (ff_viewport_update_needed_) {\n    ff_viewport_ = viewport;\n    deferred_command_list_.RSSetViewport(ff_viewport_);\n    ff_viewport_update_needed_ = false;\n  }\n}\n\nvoid D3D12CommandProcessor::SetScissorRect(const D3D12_RECT& scissor_rect) {\n  ff_scissor_update_needed_ |= ff_scissor_.left != scissor_rect.left;\n  ff_scissor_update_needed_ |= ff_scissor_.top != scissor_rect.top;\n  ff_scissor_update_needed_ |= ff_scissor_.right != scissor_rect.right;\n  ff_scissor_update_needed_ |= ff_scissor_.bottom != scissor_rect.bottom;\n  if (ff_scissor_update_needed_) {\n    ff_scissor_ = scissor_rect;\n    deferred_command_list_.RSSetScissorRect(ff_scissor_);\n    ff_scissor_update_needed_ = false;\n  }\n}\n\nvoid D3D12CommandProcessor::SetStencilReference(uint32_t stencil_ref) {\n  ff_stencil_ref_update_needed_ |= ff_stencil_ref_ != stencil_ref;\n  if (ff_stencil_ref_update_needed_) {\n    ff_stencil_ref_ = stencil_ref;\n    deferred_command_list_.D3DOMSetStencilRef(stencil_ref);\n    ff_stencil_ref_update_needed_ = false;\n  }\n}\n\nvoid D3D12CommandProcessor::SetPrimitiveTopology(\n    D3D12_PRIMITIVE_TOPOLOGY primitive_topology) {\n  if (primitive_topology_ != primitive_topology) {\n    primitive_topology_ = primitive_topology;\n    deferred_command_list_.D3DIASetPrimitiveTopology(primitive_topology);\n  }\n}\n\nstd::string D3D12CommandProcessor::GetWindowTitleText() const {\n  std::ostringstream title;\n  title << \"Direct3D 12\";\n  if (render_target_cache_) {\n    // Rasterizer-ordered views are a feature very rarely used as of 2020 and\n    // that faces adoption complications (outside of Direct3D - on Vulkan - at\n    // least), but crucial to Xenia - raise awareness of its usage.\n    // https://github.com/KhronosGroup/Vulkan-Ecosystem/issues/27#issuecomment-455712319\n    // \"In Xenia's title bar \"D3D12 ROV\" can be seen, which was a surprise, as I\n    //  wasn't aware that Xenia D3D12 backend was using Raster Order Views\n    //  feature\" - oscarbg in that issue.\n    switch (render_target_cache_->GetPath()) {\n      case RenderTargetCache::Path::kHostRenderTargets:\n        title << \" - RTV/DSV\";\n        break;\n      case RenderTargetCache::Path::kPixelShaderInterlock:\n        title << \" - ROV\";\n        break;\n      default:\n        break;\n    }\n    uint32_t draw_resolution_scale_x =\n        texture_cache_ ? texture_cache_->draw_resolution_scale_x() : 1;\n    uint32_t draw_resolution_scale_y =\n        texture_cache_ ? texture_cache_->draw_resolution_scale_y() : 1;\n    if (draw_resolution_scale_x > 1 || draw_resolution_scale_y > 1) {\n      title << ' ' << draw_resolution_scale_x << 'x' << draw_resolution_scale_y;\n    }\n  }\n  return title.str();\n}\n\nbool D3D12CommandProcessor::SetupContext() {\n  if (!CommandProcessor::SetupContext()) {\n    XELOGE(\"Failed to initialize base command processor context\");\n    return false;\n  }\n\n  const ui::d3d12::D3D12Provider& provider = GetD3D12Provider();\n  ID3D12Device* device = provider.GetDevice();\n  ID3D12CommandQueue* direct_queue = provider.GetDirectQueue();\n\n  completion_timeline_ = ui::d3d12::D3D12GPUCompletionTimeline::Create(device);\n  queue_operations_since_submission_completion_timeline_ =\n      ui::d3d12::D3D12GPUCompletionTimeline::Create(device);\n  if (!completion_timeline_ ||\n      !queue_operations_since_submission_completion_timeline_) {\n    return false;\n  }\n\n  // Create the command list and one allocator because it's needed for a command\n  // list.\n  ID3D12CommandAllocator* command_allocator;\n  if (FAILED(device->CreateCommandAllocator(\n          D3D12_COMMAND_LIST_TYPE_DIRECT, IID_PPV_ARGS(&command_allocator)))) {\n    XELOGE(\"Failed to create a command allocator\");\n    return false;\n  }\n  command_allocator_writable_first_ = new CommandAllocator;\n  command_allocator_writable_first_->command_allocator = command_allocator;\n  command_allocator_writable_first_->last_usage_submission = 0;\n  command_allocator_writable_first_->next = nullptr;\n  command_allocator_writable_last_ = command_allocator_writable_first_;\n  if (FAILED(device->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT,\n                                       command_allocator, nullptr,\n                                       IID_PPV_ARGS(&command_list_)))) {\n    XELOGE(\"Failed to create the graphics command list\");\n    return false;\n  }\n  // Initially in open state, wait until a deferred command list submission.\n  command_list_->Close();\n  // Optional - added in Creators Update (SDK 10.0.15063.0).\n  command_list_->QueryInterface(IID_PPV_ARGS(&command_list_1_));\n\n  bindless_resources_used_ =\n      cvars::d3d12_bindless &&\n      provider.GetResourceBindingTier() >= D3D12_RESOURCE_BINDING_TIER_2;\n\n  // Get the draw resolution scale for the render target cache and the texture\n  // cache.\n  uint32_t draw_resolution_scale_x, draw_resolution_scale_y;\n  bool draw_resolution_scale_not_clamped =\n      TextureCache::GetConfigDrawResolutionScale(draw_resolution_scale_x,\n                                                 draw_resolution_scale_y);\n  if (!D3D12TextureCache::ClampDrawResolutionScaleToMaxSupported(\n          draw_resolution_scale_x, draw_resolution_scale_y, provider)) {\n    draw_resolution_scale_not_clamped = false;\n  }\n  if (!draw_resolution_scale_not_clamped) {\n    XELOGW(\n        \"The requested draw resolution scale is not supported by the device or \"\n        \"the emulator, reducing to {}x{}\",\n        draw_resolution_scale_x, draw_resolution_scale_y);\n  }\n\n  shared_memory_ =\n      std::make_unique<D3D12SharedMemory>(*this, *memory_, trace_writer_);\n  if (!shared_memory_->Initialize()) {\n    XELOGE(\"Failed to initialize shared memory\");\n    return false;\n  }\n\n  // Initialize the render target cache before configuring binding - need to\n  // know if using rasterizer-ordered views for the bindless root signature.\n  render_target_cache_ = std::make_unique<D3D12RenderTargetCache>(\n      *register_file_, *memory_, trace_writer_, draw_resolution_scale_x,\n      draw_resolution_scale_y, *this, bindless_resources_used_);\n  if (!render_target_cache_->Initialize()) {\n    XELOGE(\"Failed to initialize the render target cache\");\n    return false;\n  }\n\n  // Initialize resource binding.\n  constant_buffer_pool_ = std::make_unique<ui::d3d12::D3D12UploadBufferPool>(\n      provider,\n      std::max(ui::d3d12::D3D12UploadBufferPool::kDefaultPageSize,\n               sizeof(float) * 4 * D3D12_REQ_CONSTANT_BUFFER_ELEMENT_COUNT));\n  if (bindless_resources_used_) {\n    D3D12_DESCRIPTOR_HEAP_DESC view_bindless_heap_desc;\n    view_bindless_heap_desc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV;\n    view_bindless_heap_desc.NumDescriptors = kViewBindlessHeapSize;\n    view_bindless_heap_desc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE;\n    view_bindless_heap_desc.NodeMask = 0;\n    if (FAILED(device->CreateDescriptorHeap(\n            &view_bindless_heap_desc, IID_PPV_ARGS(&view_bindless_heap_)))) {\n      XELOGE(\"Failed to create the bindless CBV/SRV/UAV descriptor heap\");\n      return false;\n    }\n    view_bindless_heap_cpu_start_ =\n        view_bindless_heap_->GetCPUDescriptorHandleForHeapStart();\n    view_bindless_heap_gpu_start_ =\n        view_bindless_heap_->GetGPUDescriptorHandleForHeapStart();\n    view_bindless_heap_allocated_ = uint32_t(SystemBindlessView::kCount);\n\n    D3D12_DESCRIPTOR_HEAP_DESC sampler_bindless_heap_desc;\n    sampler_bindless_heap_desc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER;\n    sampler_bindless_heap_desc.NumDescriptors = kSamplerHeapSize;\n    sampler_bindless_heap_desc.Flags =\n        D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE;\n    sampler_bindless_heap_desc.NodeMask = 0;\n    if (FAILED(device->CreateDescriptorHeap(\n            &sampler_bindless_heap_desc,\n            IID_PPV_ARGS(&sampler_bindless_heap_current_)))) {\n      XELOGE(\"Failed to create the bindless sampler descriptor heap\");\n      return false;\n    }\n    sampler_bindless_heap_cpu_start_ =\n        sampler_bindless_heap_current_->GetCPUDescriptorHandleForHeapStart();\n    sampler_bindless_heap_gpu_start_ =\n        sampler_bindless_heap_current_->GetGPUDescriptorHandleForHeapStart();\n    sampler_bindless_heap_allocated_ = 0;\n  } else {\n    view_bindful_heap_pool_ =\n        std::make_unique<ui::d3d12::D3D12DescriptorHeapPool>(\n            device, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV,\n            kViewBindfulHeapSize);\n    sampler_bindful_heap_pool_ =\n        std::make_unique<ui::d3d12::D3D12DescriptorHeapPool>(\n            device, D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER, kSamplerHeapSize);\n  }\n\n  if (bindless_resources_used_) {\n    // Global bindless resource root signatures.\n    // No CBV or UAV descriptor ranges with any descriptors to be allocated\n    // dynamically (via RequestPersistentViewBindlessDescriptor or\n    // RequestOneUseSingleViewDescriptors) should be here, because they would\n    // overlap the unbounded SRV range, which is not allowed on Nvidia Fermi!\n    D3D12_ROOT_SIGNATURE_DESC root_signature_bindless_desc;\n    D3D12_ROOT_PARAMETER\n    root_parameters_bindless[kRootParameter_Bindless_Count];\n    root_signature_bindless_desc.NumParameters = kRootParameter_Bindless_Count;\n    root_signature_bindless_desc.pParameters = root_parameters_bindless;\n    root_signature_bindless_desc.NumStaticSamplers = 0;\n    root_signature_bindless_desc.pStaticSamplers = nullptr;\n    root_signature_bindless_desc.Flags = D3D12_ROOT_SIGNATURE_FLAG_NONE;\n    // Fetch constants.\n    {\n      auto& parameter =\n          root_parameters_bindless[kRootParameter_Bindless_FetchConstants];\n      parameter.ParameterType = D3D12_ROOT_PARAMETER_TYPE_CBV;\n      parameter.Descriptor.ShaderRegister =\n          uint32_t(DxbcShaderTranslator::CbufferRegister::kFetchConstants);\n      parameter.Descriptor.RegisterSpace = 0;\n      parameter.ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;\n    }\n    // Vertex float constants.\n    {\n      auto& parameter = root_parameters_bindless\n          [kRootParameter_Bindless_FloatConstantsVertex];\n      parameter.ParameterType = D3D12_ROOT_PARAMETER_TYPE_CBV;\n      parameter.Descriptor.ShaderRegister =\n          uint32_t(DxbcShaderTranslator::CbufferRegister::kFloatConstants);\n      parameter.Descriptor.RegisterSpace = 0;\n      parameter.ShaderVisibility = D3D12_SHADER_VISIBILITY_VERTEX;\n    }\n    // Pixel float constants.\n    {\n      auto& parameter =\n          root_parameters_bindless[kRootParameter_Bindless_FloatConstantsPixel];\n      parameter.ParameterType = D3D12_ROOT_PARAMETER_TYPE_CBV;\n      parameter.Descriptor.ShaderRegister =\n          uint32_t(DxbcShaderTranslator::CbufferRegister::kFloatConstants);\n      parameter.Descriptor.RegisterSpace = 0;\n      parameter.ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL;\n    }\n    // Pixel shader descriptor indices.\n    {\n      auto& parameter = root_parameters_bindless\n          [kRootParameter_Bindless_DescriptorIndicesPixel];\n      parameter.ParameterType = D3D12_ROOT_PARAMETER_TYPE_CBV;\n      parameter.Descriptor.ShaderRegister =\n          uint32_t(DxbcShaderTranslator::CbufferRegister::kDescriptorIndices);\n      parameter.Descriptor.RegisterSpace = 0;\n      parameter.ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL;\n    }\n    // Vertex shader descriptor indices.\n    {\n      auto& parameter = root_parameters_bindless\n          [kRootParameter_Bindless_DescriptorIndicesVertex];\n      parameter.ParameterType = D3D12_ROOT_PARAMETER_TYPE_CBV;\n      parameter.Descriptor.ShaderRegister =\n          uint32_t(DxbcShaderTranslator::CbufferRegister::kDescriptorIndices);\n      parameter.Descriptor.RegisterSpace = 0;\n      parameter.ShaderVisibility = D3D12_SHADER_VISIBILITY_VERTEX;\n    }\n    // System constants.\n    {\n      auto& parameter =\n          root_parameters_bindless[kRootParameter_Bindless_SystemConstants];\n      parameter.ParameterType = D3D12_ROOT_PARAMETER_TYPE_CBV;\n      parameter.Descriptor.ShaderRegister =\n          uint32_t(DxbcShaderTranslator::CbufferRegister::kSystemConstants);\n      parameter.Descriptor.RegisterSpace = 0;\n      parameter.ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;\n    }\n    // Bool and loop constants.\n    {\n      auto& parameter =\n          root_parameters_bindless[kRootParameter_Bindless_BoolLoopConstants];\n      parameter.ParameterType = D3D12_ROOT_PARAMETER_TYPE_CBV;\n      parameter.Descriptor.ShaderRegister =\n          uint32_t(DxbcShaderTranslator::CbufferRegister::kBoolLoopConstants);\n      parameter.Descriptor.RegisterSpace = 0;\n      parameter.ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;\n    }\n    // Shared memory SRV and UAV.\n    D3D12_DESCRIPTOR_RANGE root_shared_memory_view_ranges[2];\n    {\n      auto& parameter =\n          root_parameters_bindless[kRootParameter_Bindless_SharedMemory];\n      parameter.ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;\n      parameter.DescriptorTable.NumDescriptorRanges =\n          uint32_t(xe::countof(root_shared_memory_view_ranges));\n      parameter.DescriptorTable.pDescriptorRanges =\n          root_shared_memory_view_ranges;\n      parameter.ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;\n      {\n        auto& range = root_shared_memory_view_ranges[0];\n        range.RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV;\n        range.NumDescriptors = 1;\n        range.BaseShaderRegister =\n            UINT(DxbcShaderTranslator::SRVMainRegister::kSharedMemory);\n        range.RegisterSpace = UINT(DxbcShaderTranslator::SRVSpace::kMain);\n        range.OffsetInDescriptorsFromTableStart = 0;\n      }\n      {\n        auto& range = root_shared_memory_view_ranges[1];\n        range.RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_UAV;\n        range.NumDescriptors = 1;\n        range.BaseShaderRegister =\n            UINT(DxbcShaderTranslator::UAVRegister::kSharedMemory);\n        range.RegisterSpace = 0;\n        range.OffsetInDescriptorsFromTableStart = 1;\n      }\n    }\n    // Sampler heap.\n    D3D12_DESCRIPTOR_RANGE root_bindless_sampler_range;\n    {\n      auto& parameter =\n          root_parameters_bindless[kRootParameter_Bindless_SamplerHeap];\n      parameter.ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;\n      // Will be appending.\n      parameter.DescriptorTable.NumDescriptorRanges = 1;\n      parameter.DescriptorTable.pDescriptorRanges =\n          &root_bindless_sampler_range;\n      parameter.ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;\n      root_bindless_sampler_range.RangeType =\n          D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER;\n      root_bindless_sampler_range.NumDescriptors = UINT_MAX;\n      root_bindless_sampler_range.BaseShaderRegister = 0;\n      root_bindless_sampler_range.RegisterSpace = 0;\n      root_bindless_sampler_range.OffsetInDescriptorsFromTableStart = 0;\n    }\n    // View heap.\n    D3D12_DESCRIPTOR_RANGE root_bindless_view_ranges[4];\n    {\n      auto& parameter =\n          root_parameters_bindless[kRootParameter_Bindless_ViewHeap];\n      parameter.ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;\n      // Will be appending.\n      parameter.DescriptorTable.NumDescriptorRanges = 0;\n      parameter.DescriptorTable.pDescriptorRanges = root_bindless_view_ranges;\n      parameter.ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;\n      // EDRAM.\n      if (render_target_cache_->GetPath() ==\n          RenderTargetCache::Path::kPixelShaderInterlock) {\n        assert_true(parameter.DescriptorTable.NumDescriptorRanges <\n                    xe::countof(root_bindless_view_ranges));\n        auto& range = root_bindless_view_ranges[parameter.DescriptorTable\n                                                    .NumDescriptorRanges++];\n        range.RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_UAV;\n        range.NumDescriptors = 1;\n        range.BaseShaderRegister =\n            UINT(DxbcShaderTranslator::UAVRegister::kEdram);\n        range.RegisterSpace = 0;\n        range.OffsetInDescriptorsFromTableStart =\n            UINT(SystemBindlessView::kEdramR32UintUAV);\n      }\n      // Used UAV and SRV ranges must not overlap on Nvidia Fermi, so textures\n      // have OffsetInDescriptorsFromTableStart after all static descriptors of\n      // other types.\n      // 2D array textures.\n      {\n        assert_true(parameter.DescriptorTable.NumDescriptorRanges <\n                    xe::countof(root_bindless_view_ranges));\n        auto& range = root_bindless_view_ranges[parameter.DescriptorTable\n                                                    .NumDescriptorRanges++];\n        range.RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV;\n        range.NumDescriptors = UINT_MAX;\n        range.BaseShaderRegister = 0;\n        range.RegisterSpace =\n            UINT(DxbcShaderTranslator::SRVSpace::kBindlessTextures2DArray);\n        range.OffsetInDescriptorsFromTableStart =\n            UINT(SystemBindlessView::kUnboundedSRVsStart);\n      }\n      // 3D textures.\n      {\n        assert_true(parameter.DescriptorTable.NumDescriptorRanges <\n                    xe::countof(root_bindless_view_ranges));\n        auto& range = root_bindless_view_ranges[parameter.DescriptorTable\n                                                    .NumDescriptorRanges++];\n        range.RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV;\n        range.NumDescriptors = UINT_MAX;\n        range.BaseShaderRegister = 0;\n        range.RegisterSpace =\n            UINT(DxbcShaderTranslator::SRVSpace::kBindlessTextures3D);\n        range.OffsetInDescriptorsFromTableStart =\n            UINT(SystemBindlessView::kUnboundedSRVsStart);\n      }\n      // Cube textures.\n      {\n        assert_true(parameter.DescriptorTable.NumDescriptorRanges <\n                    xe::countof(root_bindless_view_ranges));\n        auto& range = root_bindless_view_ranges[parameter.DescriptorTable\n                                                    .NumDescriptorRanges++];\n        range.RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV;\n        range.NumDescriptors = UINT_MAX;\n        range.BaseShaderRegister = 0;\n        range.RegisterSpace =\n            UINT(DxbcShaderTranslator::SRVSpace::kBindlessTexturesCube);\n        range.OffsetInDescriptorsFromTableStart =\n            UINT(SystemBindlessView::kUnboundedSRVsStart);\n      }\n    }\n    root_signature_bindless_vs_ = ui::d3d12::util::CreateRootSignature(\n        provider, root_signature_bindless_desc);\n    if (!root_signature_bindless_vs_) {\n      XELOGE(\n          \"Failed to create the global root signature for bindless resources, \"\n          \"the version for use without tessellation\");\n      return false;\n    }\n    root_parameters_bindless[kRootParameter_Bindless_FloatConstantsVertex]\n        .ShaderVisibility = D3D12_SHADER_VISIBILITY_DOMAIN;\n    root_parameters_bindless[kRootParameter_Bindless_DescriptorIndicesVertex]\n        .ShaderVisibility = D3D12_SHADER_VISIBILITY_DOMAIN;\n    root_signature_bindless_ds_ = ui::d3d12::util::CreateRootSignature(\n        provider, root_signature_bindless_desc);\n    if (!root_signature_bindless_ds_) {\n      XELOGE(\n          \"Failed to create the global root signature for bindless resources, \"\n          \"the version for use with tessellation\");\n      return false;\n    }\n  }\n\n  primitive_processor_ = std::make_unique<D3D12PrimitiveProcessor>(\n      *register_file_, *memory_, trace_writer_, *shared_memory_, *this);\n  if (!primitive_processor_->Initialize()) {\n    XELOGE(\"Failed to initialize the geometric primitive processor\");\n    return false;\n  }\n\n  texture_cache_ = D3D12TextureCache::Create(\n      *register_file_, *shared_memory_, draw_resolution_scale_x,\n      draw_resolution_scale_y, *this, bindless_resources_used_);\n  if (!texture_cache_) {\n    XELOGE(\"Failed to initialize the texture cache\");\n    return false;\n  }\n\n  pipeline_cache_ = std::make_unique<PipelineCache>(*this, *register_file_,\n                                                    *render_target_cache_.get(),\n                                                    bindless_resources_used_);\n  if (!pipeline_cache_->Initialize()) {\n    XELOGE(\"Failed to initialize the graphics pipeline cache\");\n    return false;\n  }\n\n  D3D12_HEAP_FLAGS heap_flag_create_not_zeroed =\n      provider.GetHeapFlagCreateNotZeroed();\n\n  // Create gamma ramp resources.\n  gamma_ramp_256_entry_table_up_to_date_ = false;\n  gamma_ramp_pwl_up_to_date_ = false;\n  D3D12_RESOURCE_DESC gamma_ramp_buffer_desc;\n  ui::d3d12::util::FillBufferResourceDesc(\n      gamma_ramp_buffer_desc, (256 + 128 * 3) * 4, D3D12_RESOURCE_FLAG_NONE);\n  // The first action will be uploading.\n  gamma_ramp_buffer_state_ = D3D12_RESOURCE_STATE_COPY_DEST;\n  if (FAILED(device->CreateCommittedResource(\n          &ui::d3d12::util::kHeapPropertiesDefault, heap_flag_create_not_zeroed,\n          &gamma_ramp_buffer_desc, gamma_ramp_buffer_state_, nullptr,\n          IID_PPV_ARGS(&gamma_ramp_buffer_)))) {\n    XELOGE(\"Failed to create the gamma ramp buffer\");\n    return false;\n  }\n  // The upload buffer is frame-buffered.\n  gamma_ramp_buffer_desc.Width *= kQueueFrames;\n  if (FAILED(device->CreateCommittedResource(\n          &ui::d3d12::util::kHeapPropertiesUpload, heap_flag_create_not_zeroed,\n          &gamma_ramp_buffer_desc, D3D12_RESOURCE_STATE_GENERIC_READ, nullptr,\n          IID_PPV_ARGS(&gamma_ramp_upload_buffer_)))) {\n    XELOGE(\"Failed to create the gamma ramp upload buffer\");\n    return false;\n  }\n  if (FAILED(gamma_ramp_upload_buffer_->Map(\n          0, nullptr,\n          reinterpret_cast<void**>(&gamma_ramp_upload_buffer_mapping_)))) {\n    XELOGE(\"Failed to map the gamma ramp upload buffer\");\n    gamma_ramp_upload_buffer_mapping_ = nullptr;\n    return false;\n  }\n\n  // Initialize compute pipelines for output with gamma ramp.\n  D3D12_ROOT_PARAMETER\n  apply_gamma_root_parameters[UINT(ApplyGammaRootParameter::kCount)];\n  {\n    D3D12_ROOT_PARAMETER& apply_gamma_root_parameter_constants =\n        apply_gamma_root_parameters[UINT(ApplyGammaRootParameter::kConstants)];\n    apply_gamma_root_parameter_constants.ParameterType =\n        D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS;\n    apply_gamma_root_parameter_constants.Constants.ShaderRegister = 0;\n    apply_gamma_root_parameter_constants.Constants.RegisterSpace = 0;\n    apply_gamma_root_parameter_constants.Constants.Num32BitValues =\n        sizeof(ApplyGammaConstants) / sizeof(uint32_t);\n    apply_gamma_root_parameter_constants.ShaderVisibility =\n        D3D12_SHADER_VISIBILITY_ALL;\n  }\n  D3D12_DESCRIPTOR_RANGE apply_gamma_root_descriptor_range_dest;\n  apply_gamma_root_descriptor_range_dest.RangeType =\n      D3D12_DESCRIPTOR_RANGE_TYPE_UAV;\n  apply_gamma_root_descriptor_range_dest.NumDescriptors = 1;\n  apply_gamma_root_descriptor_range_dest.BaseShaderRegister = 0;\n  apply_gamma_root_descriptor_range_dest.RegisterSpace = 0;\n  apply_gamma_root_descriptor_range_dest.OffsetInDescriptorsFromTableStart = 0;\n  {\n    D3D12_ROOT_PARAMETER& apply_gamma_root_parameter_dest =\n        apply_gamma_root_parameters[UINT(\n            ApplyGammaRootParameter::kDestination)];\n    apply_gamma_root_parameter_dest.ParameterType =\n        D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;\n    apply_gamma_root_parameter_dest.DescriptorTable.NumDescriptorRanges = 1;\n    apply_gamma_root_parameter_dest.DescriptorTable.pDescriptorRanges =\n        &apply_gamma_root_descriptor_range_dest;\n    apply_gamma_root_parameter_dest.ShaderVisibility =\n        D3D12_SHADER_VISIBILITY_ALL;\n  }\n  D3D12_DESCRIPTOR_RANGE apply_gamma_root_descriptor_range_source;\n  apply_gamma_root_descriptor_range_source.RangeType =\n      D3D12_DESCRIPTOR_RANGE_TYPE_SRV;\n  apply_gamma_root_descriptor_range_source.NumDescriptors = 1;\n  apply_gamma_root_descriptor_range_source.BaseShaderRegister = 1;\n  apply_gamma_root_descriptor_range_source.RegisterSpace = 0;\n  apply_gamma_root_descriptor_range_source.OffsetInDescriptorsFromTableStart =\n      0;\n  {\n    D3D12_ROOT_PARAMETER& apply_gamma_root_parameter_source =\n        apply_gamma_root_parameters[UINT(ApplyGammaRootParameter::kSource)];\n    apply_gamma_root_parameter_source.ParameterType =\n        D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;\n    apply_gamma_root_parameter_source.DescriptorTable.NumDescriptorRanges = 1;\n    apply_gamma_root_parameter_source.DescriptorTable.pDescriptorRanges =\n        &apply_gamma_root_descriptor_range_source;\n    apply_gamma_root_parameter_source.ShaderVisibility =\n        D3D12_SHADER_VISIBILITY_ALL;\n  }\n  D3D12_DESCRIPTOR_RANGE apply_gamma_root_descriptor_range_ramp;\n  apply_gamma_root_descriptor_range_ramp.RangeType =\n      D3D12_DESCRIPTOR_RANGE_TYPE_SRV;\n  apply_gamma_root_descriptor_range_ramp.NumDescriptors = 1;\n  apply_gamma_root_descriptor_range_ramp.BaseShaderRegister = 0;\n  apply_gamma_root_descriptor_range_ramp.RegisterSpace = 0;\n  apply_gamma_root_descriptor_range_ramp.OffsetInDescriptorsFromTableStart = 0;\n  {\n    D3D12_ROOT_PARAMETER& apply_gamma_root_parameter_gamma_ramp =\n        apply_gamma_root_parameters[UINT(ApplyGammaRootParameter::kRamp)];\n    apply_gamma_root_parameter_gamma_ramp.ParameterType =\n        D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;\n    apply_gamma_root_parameter_gamma_ramp.DescriptorTable.NumDescriptorRanges =\n        1;\n    apply_gamma_root_parameter_gamma_ramp.DescriptorTable.pDescriptorRanges =\n        &apply_gamma_root_descriptor_range_ramp;\n    apply_gamma_root_parameter_gamma_ramp.ShaderVisibility =\n        D3D12_SHADER_VISIBILITY_ALL;\n  }\n  D3D12_ROOT_SIGNATURE_DESC apply_gamma_root_signature_desc;\n  apply_gamma_root_signature_desc.NumParameters =\n      UINT(ApplyGammaRootParameter::kCount);\n  apply_gamma_root_signature_desc.pParameters = apply_gamma_root_parameters;\n  apply_gamma_root_signature_desc.NumStaticSamplers = 0;\n  apply_gamma_root_signature_desc.pStaticSamplers = nullptr;\n  apply_gamma_root_signature_desc.Flags = D3D12_ROOT_SIGNATURE_FLAG_NONE;\n  *(apply_gamma_root_signature_.ReleaseAndGetAddressOf()) =\n      ui::d3d12::util::CreateRootSignature(provider,\n                                           apply_gamma_root_signature_desc);\n  if (!apply_gamma_root_signature_) {\n    XELOGE(\"Failed to create the gamma ramp application root signature\");\n    return false;\n  }\n  *(apply_gamma_table_pipeline_.ReleaseAndGetAddressOf()) =\n      ui::d3d12::util::CreateComputePipeline(\n          device, shaders::apply_gamma_table_cs,\n          sizeof(shaders::apply_gamma_table_cs),\n          apply_gamma_root_signature_.Get());\n  if (!apply_gamma_table_pipeline_) {\n    XELOGE(\n        \"Failed to create the 256-entry table gamma ramp application compute \"\n        \"pipeline\");\n    return false;\n  }\n  *(apply_gamma_table_fxaa_luma_pipeline_.ReleaseAndGetAddressOf()) =\n      ui::d3d12::util::CreateComputePipeline(\n          device, shaders::apply_gamma_table_fxaa_luma_cs,\n          sizeof(shaders::apply_gamma_table_fxaa_luma_cs),\n          apply_gamma_root_signature_.Get());\n  if (!apply_gamma_table_fxaa_luma_pipeline_) {\n    XELOGE(\n        \"Failed to create the 256-entry table gamma ramp application compute \"\n        \"pipeline with perceptual luma output\");\n    return false;\n  }\n  *(apply_gamma_pwl_pipeline_.ReleaseAndGetAddressOf()) =\n      ui::d3d12::util::CreateComputePipeline(\n          device, shaders::apply_gamma_pwl_cs,\n          sizeof(shaders::apply_gamma_pwl_cs),\n          apply_gamma_root_signature_.Get());\n  if (!apply_gamma_pwl_pipeline_) {\n    XELOGE(\"Failed to create the PWL gamma ramp application compute pipeline\");\n    return false;\n  }\n  *(apply_gamma_pwl_fxaa_luma_pipeline_.ReleaseAndGetAddressOf()) =\n      ui::d3d12::util::CreateComputePipeline(\n          device, shaders::apply_gamma_pwl_fxaa_luma_cs,\n          sizeof(shaders::apply_gamma_pwl_fxaa_luma_cs),\n          apply_gamma_root_signature_.Get());\n  if (!apply_gamma_pwl_fxaa_luma_pipeline_) {\n    XELOGE(\n        \"Failed to create the PWL gamma ramp application compute pipeline with \"\n        \"perceptual luma output\");\n    return false;\n  }\n\n  // Initialize compute pipelines for post-processing anti-aliasing.\n  D3D12_ROOT_PARAMETER fxaa_root_parameters[UINT(FxaaRootParameter::kCount)];\n  {\n    D3D12_ROOT_PARAMETER& fxaa_root_parameter_constants =\n        fxaa_root_parameters[UINT(ApplyGammaRootParameter::kConstants)];\n    fxaa_root_parameter_constants.ParameterType =\n        D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS;\n    fxaa_root_parameter_constants.Constants.ShaderRegister = 0;\n    fxaa_root_parameter_constants.Constants.RegisterSpace = 0;\n    fxaa_root_parameter_constants.Constants.Num32BitValues =\n        sizeof(FxaaConstants) / sizeof(uint32_t);\n    fxaa_root_parameter_constants.ShaderVisibility =\n        D3D12_SHADER_VISIBILITY_ALL;\n  }\n  D3D12_DESCRIPTOR_RANGE fxaa_root_descriptor_range_dest;\n  fxaa_root_descriptor_range_dest.RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_UAV;\n  fxaa_root_descriptor_range_dest.NumDescriptors = 1;\n  fxaa_root_descriptor_range_dest.BaseShaderRegister = 0;\n  fxaa_root_descriptor_range_dest.RegisterSpace = 0;\n  fxaa_root_descriptor_range_dest.OffsetInDescriptorsFromTableStart = 0;\n  {\n    D3D12_ROOT_PARAMETER& fxaa_root_parameter_dest =\n        fxaa_root_parameters[UINT(FxaaRootParameter::kDestination)];\n    fxaa_root_parameter_dest.ParameterType =\n        D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;\n    fxaa_root_parameter_dest.DescriptorTable.NumDescriptorRanges = 1;\n    fxaa_root_parameter_dest.DescriptorTable.pDescriptorRanges =\n        &fxaa_root_descriptor_range_dest;\n    fxaa_root_parameter_dest.ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;\n  }\n  D3D12_DESCRIPTOR_RANGE fxaa_root_descriptor_range_source;\n  fxaa_root_descriptor_range_source.RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV;\n  fxaa_root_descriptor_range_source.NumDescriptors = 1;\n  fxaa_root_descriptor_range_source.BaseShaderRegister = 0;\n  fxaa_root_descriptor_range_source.RegisterSpace = 0;\n  fxaa_root_descriptor_range_source.OffsetInDescriptorsFromTableStart = 0;\n  {\n    D3D12_ROOT_PARAMETER& fxaa_root_parameter_source =\n        fxaa_root_parameters[UINT(FxaaRootParameter::kSource)];\n    fxaa_root_parameter_source.ParameterType =\n        D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;\n    fxaa_root_parameter_source.DescriptorTable.NumDescriptorRanges = 1;\n    fxaa_root_parameter_source.DescriptorTable.pDescriptorRanges =\n        &fxaa_root_descriptor_range_source;\n    fxaa_root_parameter_source.ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;\n  }\n  D3D12_STATIC_SAMPLER_DESC fxaa_root_sampler;\n  fxaa_root_sampler.Filter = D3D12_FILTER_MIN_MAG_MIP_LINEAR;\n  fxaa_root_sampler.AddressU = D3D12_TEXTURE_ADDRESS_MODE_CLAMP;\n  fxaa_root_sampler.AddressV = D3D12_TEXTURE_ADDRESS_MODE_CLAMP;\n  fxaa_root_sampler.AddressW = D3D12_TEXTURE_ADDRESS_MODE_CLAMP;\n  fxaa_root_sampler.MipLODBias = 0.0f;\n  fxaa_root_sampler.MaxAnisotropy = 1;\n  fxaa_root_sampler.ComparisonFunc = D3D12_COMPARISON_FUNC_NEVER;\n  fxaa_root_sampler.BorderColor = D3D12_STATIC_BORDER_COLOR_OPAQUE_BLACK;\n  fxaa_root_sampler.MinLOD = 0.0f;\n  fxaa_root_sampler.MaxLOD = 0.0f;\n  fxaa_root_sampler.ShaderRegister = 0;\n  fxaa_root_sampler.RegisterSpace = 0;\n  fxaa_root_sampler.ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;\n  D3D12_ROOT_SIGNATURE_DESC fxaa_root_signature_desc;\n  fxaa_root_signature_desc.NumParameters = UINT(FxaaRootParameter::kCount);\n  fxaa_root_signature_desc.pParameters = fxaa_root_parameters;\n  fxaa_root_signature_desc.NumStaticSamplers = 1;\n  fxaa_root_signature_desc.pStaticSamplers = &fxaa_root_sampler;\n  fxaa_root_signature_desc.Flags = D3D12_ROOT_SIGNATURE_FLAG_NONE;\n  *(fxaa_root_signature_.ReleaseAndGetAddressOf()) =\n      ui::d3d12::util::CreateRootSignature(provider, fxaa_root_signature_desc);\n  if (!fxaa_root_signature_) {\n    XELOGE(\"Failed to create the FXAA root signature\");\n    return false;\n  }\n  *(fxaa_pipeline_.ReleaseAndGetAddressOf()) =\n      ui::d3d12::util::CreateComputePipeline(device, shaders::fxaa_cs,\n                                             sizeof(shaders::fxaa_cs),\n                                             fxaa_root_signature_.Get());\n  if (!fxaa_pipeline_) {\n    XELOGE(\"Failed to create the FXAA compute pipeline\");\n    return false;\n  }\n  *(fxaa_extreme_pipeline_.ReleaseAndGetAddressOf()) =\n      ui::d3d12::util::CreateComputePipeline(device, shaders::fxaa_extreme_cs,\n                                             sizeof(shaders::fxaa_extreme_cs),\n                                             fxaa_root_signature_.Get());\n  if (!fxaa_pipeline_) {\n    XELOGE(\"Failed to create the extreme-quality FXAA compute pipeline\");\n    return false;\n  }\n\n  if (bindless_resources_used_) {\n    // Create the system bindless descriptors once all resources are\n    // initialized.\n    // kNullRawSRV.\n    ui::d3d12::util::CreateBufferRawSRV(\n        device,\n        provider.OffsetViewDescriptor(\n            view_bindless_heap_cpu_start_,\n            uint32_t(SystemBindlessView::kNullRawSRV)),\n        nullptr, 0);\n    // kNullRawUAV.\n    ui::d3d12::util::CreateBufferRawUAV(\n        device,\n        provider.OffsetViewDescriptor(\n            view_bindless_heap_cpu_start_,\n            uint32_t(SystemBindlessView::kNullRawUAV)),\n        nullptr, 0);\n    // kNullTexture2DArray.\n    D3D12_SHADER_RESOURCE_VIEW_DESC null_srv_desc;\n    null_srv_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;\n    null_srv_desc.Shader4ComponentMapping =\n        D3D12_ENCODE_SHADER_4_COMPONENT_MAPPING(\n            D3D12_SHADER_COMPONENT_MAPPING_FORCE_VALUE_0,\n            D3D12_SHADER_COMPONENT_MAPPING_FORCE_VALUE_0,\n            D3D12_SHADER_COMPONENT_MAPPING_FORCE_VALUE_0,\n            D3D12_SHADER_COMPONENT_MAPPING_FORCE_VALUE_0);\n    null_srv_desc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2DARRAY;\n    null_srv_desc.Texture2DArray.MostDetailedMip = 0;\n    null_srv_desc.Texture2DArray.MipLevels = 1;\n    null_srv_desc.Texture2DArray.FirstArraySlice = 0;\n    null_srv_desc.Texture2DArray.ArraySize = 1;\n    null_srv_desc.Texture2DArray.PlaneSlice = 0;\n    null_srv_desc.Texture2DArray.ResourceMinLODClamp = 0.0f;\n    device->CreateShaderResourceView(\n        nullptr, &null_srv_desc,\n        provider.OffsetViewDescriptor(\n            view_bindless_heap_cpu_start_,\n            uint32_t(SystemBindlessView::kNullTexture2DArray)));\n    // kNullTexture3D.\n    null_srv_desc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE3D;\n    null_srv_desc.Texture3D.MostDetailedMip = 0;\n    null_srv_desc.Texture3D.MipLevels = 1;\n    null_srv_desc.Texture3D.ResourceMinLODClamp = 0.0f;\n    device->CreateShaderResourceView(\n        nullptr, &null_srv_desc,\n        provider.OffsetViewDescriptor(\n            view_bindless_heap_cpu_start_,\n            uint32_t(SystemBindlessView::kNullTexture3D)));\n    // kNullTextureCube.\n    null_srv_desc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURECUBE;\n    null_srv_desc.TextureCube.MostDetailedMip = 0;\n    null_srv_desc.TextureCube.MipLevels = 1;\n    null_srv_desc.TextureCube.ResourceMinLODClamp = 0.0f;\n    device->CreateShaderResourceView(\n        nullptr, &null_srv_desc,\n        provider.OffsetViewDescriptor(\n            view_bindless_heap_cpu_start_,\n            uint32_t(SystemBindlessView::kNullTextureCube)));\n    // kSharedMemoryRawSRV.\n    shared_memory_->WriteRawSRVDescriptor(provider.OffsetViewDescriptor(\n        view_bindless_heap_cpu_start_,\n        uint32_t(SystemBindlessView::kSharedMemoryRawSRV)));\n    // kSharedMemoryRawUAV.\n    shared_memory_->WriteRawUAVDescriptor(provider.OffsetViewDescriptor(\n        view_bindless_heap_cpu_start_,\n        uint32_t(SystemBindlessView::kSharedMemoryRawUAV)));\n    // kEdramRawSRV.\n    render_target_cache_->WriteEdramRawSRVDescriptor(\n        provider.OffsetViewDescriptor(\n            view_bindless_heap_cpu_start_,\n            uint32_t(SystemBindlessView::kEdramRawSRV)));\n    // kEdramR32UintSRV.\n    render_target_cache_->WriteEdramUintPow2SRVDescriptor(\n        provider.OffsetViewDescriptor(\n            view_bindless_heap_cpu_start_,\n            uint32_t(SystemBindlessView::kEdramR32UintSRV)),\n        2);\n    // kEdramR32G32UintSRV.\n    render_target_cache_->WriteEdramUintPow2SRVDescriptor(\n        provider.OffsetViewDescriptor(\n            view_bindless_heap_cpu_start_,\n            uint32_t(SystemBindlessView::kEdramR32G32UintSRV)),\n        3);\n    // kEdramR32G32B32A32UintSRV.\n    render_target_cache_->WriteEdramUintPow2SRVDescriptor(\n        provider.OffsetViewDescriptor(\n            view_bindless_heap_cpu_start_,\n            uint32_t(SystemBindlessView::kEdramR32G32B32A32UintSRV)),\n        4);\n    // kEdramRawUAV.\n    render_target_cache_->WriteEdramRawUAVDescriptor(\n        provider.OffsetViewDescriptor(\n            view_bindless_heap_cpu_start_,\n            uint32_t(SystemBindlessView::kEdramRawUAV)));\n    // kEdramR32UintUAV.\n    render_target_cache_->WriteEdramUintPow2UAVDescriptor(\n        provider.OffsetViewDescriptor(\n            view_bindless_heap_cpu_start_,\n            uint32_t(SystemBindlessView::kEdramR32UintUAV)),\n        2);\n    // kEdramR32G32UintUAV.\n    render_target_cache_->WriteEdramUintPow2UAVDescriptor(\n        provider.OffsetViewDescriptor(\n            view_bindless_heap_cpu_start_,\n            uint32_t(SystemBindlessView::kEdramR32G32UintUAV)),\n        3);\n    // kEdramR32G32B32A32UintUAV.\n    render_target_cache_->WriteEdramUintPow2UAVDescriptor(\n        provider.OffsetViewDescriptor(\n            view_bindless_heap_cpu_start_,\n            uint32_t(SystemBindlessView::kEdramR32G32B32A32UintUAV)),\n        4);\n    // kGammaRampTableSRV.\n    WriteGammaRampSRV(false,\n                      provider.OffsetViewDescriptor(\n                          view_bindless_heap_cpu_start_,\n                          uint32_t(SystemBindlessView::kGammaRampTableSRV)));\n    // kGammaRampPWLSRV.\n    WriteGammaRampSRV(true,\n                      provider.OffsetViewDescriptor(\n                          view_bindless_heap_cpu_start_,\n                          uint32_t(SystemBindlessView::kGammaRampPWLSRV)));\n  }\n\n  pix_capture_requested_.store(false, std::memory_order_relaxed);\n  pix_capturing_ = false;\n\n  // Just not to expose uninitialized memory.\n  std::memset(&system_constants_, 0, sizeof(system_constants_));\n\n  return true;\n}\n\nvoid D3D12CommandProcessor::ShutdownContext() {\n  AwaitAllQueueOperationsCompletion();\n\n  ui::d3d12::util::ReleaseAndNull(readback_buffer_);\n  readback_buffer_size_ = 0;\n\n  ui::d3d12::util::ReleaseAndNull(scratch_buffer_);\n  scratch_buffer_size_ = 0;\n\n  for (const std::pair<uint64_t, ID3D12Resource*>& resource_for_deletion :\n       resources_for_deletion_) {\n    resource_for_deletion.second->Release();\n  }\n  resources_for_deletion_.clear();\n\n  fxaa_source_texture_submission_ = 0;\n  fxaa_source_texture_.Reset();\n\n  fxaa_extreme_pipeline_.Reset();\n  fxaa_pipeline_.Reset();\n  fxaa_root_signature_.Reset();\n\n  apply_gamma_pwl_fxaa_luma_pipeline_.Reset();\n  apply_gamma_pwl_pipeline_.Reset();\n  apply_gamma_table_fxaa_luma_pipeline_.Reset();\n  apply_gamma_table_pipeline_.Reset();\n  apply_gamma_root_signature_.Reset();\n\n  // Unmapping will be done implicitly by the destruction.\n  gamma_ramp_upload_buffer_mapping_ = nullptr;\n  gamma_ramp_upload_buffer_.Reset();\n  gamma_ramp_buffer_.Reset();\n\n  texture_cache_.reset();\n\n  pipeline_cache_.reset();\n\n  primitive_processor_.reset();\n\n  // Shut down binding - bindless descriptors may be owned by subsystems like\n  // the texture cache.\n\n  // Root signatures are used by pipelines, thus freed after the pipelines.\n  ui::d3d12::util::ReleaseAndNull(root_signature_bindless_ds_);\n  ui::d3d12::util::ReleaseAndNull(root_signature_bindless_vs_);\n  for (auto it : root_signatures_bindful_) {\n    it.second->Release();\n  }\n  root_signatures_bindful_.clear();\n\n  if (bindless_resources_used_) {\n    texture_cache_bindless_sampler_map_.clear();\n    for (const auto& sampler_bindless_heap_overflowed :\n         sampler_bindless_heaps_overflowed_) {\n      sampler_bindless_heap_overflowed.first->Release();\n    }\n    sampler_bindless_heaps_overflowed_.clear();\n    sampler_bindless_heap_allocated_ = 0;\n    ui::d3d12::util::ReleaseAndNull(sampler_bindless_heap_current_);\n    view_bindless_one_use_descriptors_.clear();\n    view_bindless_heap_free_.clear();\n    ui::d3d12::util::ReleaseAndNull(view_bindless_heap_);\n  } else {\n    sampler_bindful_heap_pool_.reset();\n    view_bindful_heap_pool_.reset();\n  }\n  constant_buffer_pool_.reset();\n\n  render_target_cache_.reset();\n\n  shared_memory_.reset();\n\n  deferred_command_list_.Reset();\n  ui::d3d12::util::ReleaseAndNull(command_list_1_);\n  ui::d3d12::util::ReleaseAndNull(command_list_);\n  ClearCommandAllocatorCache();\n\n  frame_open_ = false;\n  frame_current_ = 1;\n  frame_completed_ = 0;\n  std::memset(closed_frame_submissions_, 0, sizeof(closed_frame_submissions_));\n\n  queue_operations_since_submission_completion_timeline_.reset();\n\n  submission_open_ = false;\n  completion_timeline_.reset();\n\n  device_removed_ = false;\n\n  CommandProcessor::ShutdownContext();\n}\n\nvoid D3D12CommandProcessor::WriteRegister(uint32_t index, uint32_t value) {\n  CommandProcessor::WriteRegister(index, value);\n\n  if (index >= XE_GPU_REG_SHADER_CONSTANT_000_X &&\n      index <= XE_GPU_REG_SHADER_CONSTANT_511_W) {\n    if (frame_open_) {\n      uint32_t float_constant_index =\n          (index - XE_GPU_REG_SHADER_CONSTANT_000_X) >> 2;\n      if (float_constant_index >= 256) {\n        float_constant_index -= 256;\n        if (current_float_constant_map_pixel_[float_constant_index >> 6] &\n            (1ull << (float_constant_index & 63))) {\n          cbuffer_binding_float_pixel_.up_to_date = false;\n        }\n      } else {\n        if (current_float_constant_map_vertex_[float_constant_index >> 6] &\n            (1ull << (float_constant_index & 63))) {\n          cbuffer_binding_float_vertex_.up_to_date = false;\n        }\n      }\n    }\n  } else if (index >= XE_GPU_REG_SHADER_CONSTANT_BOOL_000_031 &&\n             index <= XE_GPU_REG_SHADER_CONSTANT_LOOP_31) {\n    cbuffer_binding_bool_loop_.up_to_date = false;\n  } else if (index >= XE_GPU_REG_SHADER_CONSTANT_FETCH_00_0 &&\n             index <= XE_GPU_REG_SHADER_CONSTANT_FETCH_31_5) {\n    cbuffer_binding_fetch_.up_to_date = false;\n    if (texture_cache_ != nullptr) {\n      texture_cache_->TextureFetchConstantWritten(\n          (index - XE_GPU_REG_SHADER_CONSTANT_FETCH_00_0) / 6);\n    }\n  }\n}\n\nvoid D3D12CommandProcessor::OnGammaRamp256EntryTableValueWritten() {\n  gamma_ramp_256_entry_table_up_to_date_ = false;\n}\n\nvoid D3D12CommandProcessor::OnGammaRampPWLValueWritten() {\n  gamma_ramp_pwl_up_to_date_ = false;\n}\n\nvoid D3D12CommandProcessor::IssueSwap(uint32_t frontbuffer_ptr,\n                                      uint32_t frontbuffer_width,\n                                      uint32_t frontbuffer_height) {\n  SCOPE_profile_cpu_f(\"gpu\");\n\n  ui::Presenter* presenter = graphics_system_->presenter();\n  if (!presenter) {\n    return;\n  }\n\n  // In case the swap command is the only one in the frame.\n  if (!BeginSubmission(true)) {\n    return;\n  }\n\n  // Obtain the actual front buffer size to pass to RefreshGuestOutput,\n  // resolution-scaled if it's a resolve destination, or not otherwise.\n  D3D12_SHADER_RESOURCE_VIEW_DESC swap_texture_srv_desc;\n  xenos::TextureFormat frontbuffer_format;\n  ID3D12Resource* swap_texture_resource = texture_cache_->RequestSwapTexture(\n      swap_texture_srv_desc, frontbuffer_format);\n  if (!swap_texture_resource) {\n    return;\n  }\n  D3D12_RESOURCE_DESC swap_texture_desc = swap_texture_resource->GetDesc();\n\n  presenter->RefreshGuestOutput(\n      uint32_t(swap_texture_desc.Width), uint32_t(swap_texture_desc.Height),\n      1280, 720,\n      [this, &swap_texture_srv_desc, frontbuffer_format, swap_texture_resource,\n       &swap_texture_desc](\n          ui::Presenter::GuestOutputRefreshContext& context) -> bool {\n        const ui::d3d12::D3D12Provider& provider = GetD3D12Provider();\n        ID3D12Device* device = provider.GetDevice();\n\n        SwapPostEffect swap_post_effect = GetActualSwapPostEffect();\n        bool use_fxaa = swap_post_effect == SwapPostEffect::kFxaa ||\n                        swap_post_effect == SwapPostEffect::kFxaaExtreme;\n        if (use_fxaa) {\n          // Make sure the texture of the correct size is available for FXAA.\n          if (fxaa_source_texture_) {\n            D3D12_RESOURCE_DESC fxaa_source_texture_desc =\n                fxaa_source_texture_->GetDesc();\n            if (fxaa_source_texture_desc.Width != swap_texture_desc.Width ||\n                fxaa_source_texture_desc.Height != swap_texture_desc.Height) {\n              if (GetCompletedSubmission() < fxaa_source_texture_submission_) {\n                fxaa_source_texture_->AddRef();\n                resources_for_deletion_.emplace_back(\n                    fxaa_source_texture_submission_,\n                    fxaa_source_texture_.Get());\n              }\n              fxaa_source_texture_.Reset();\n              fxaa_source_texture_submission_ = 0;\n            }\n          }\n          if (!fxaa_source_texture_) {\n            D3D12_RESOURCE_DESC fxaa_source_texture_desc;\n            fxaa_source_texture_desc.Dimension =\n                D3D12_RESOURCE_DIMENSION_TEXTURE2D;\n            fxaa_source_texture_desc.Alignment = 0;\n            fxaa_source_texture_desc.Width = swap_texture_desc.Width;\n            fxaa_source_texture_desc.Height = swap_texture_desc.Height;\n            fxaa_source_texture_desc.DepthOrArraySize = 1;\n            fxaa_source_texture_desc.MipLevels = 1;\n            fxaa_source_texture_desc.Format = kFxaaSourceTextureFormat;\n            fxaa_source_texture_desc.SampleDesc.Count = 1;\n            fxaa_source_texture_desc.SampleDesc.Quality = 0;\n            fxaa_source_texture_desc.Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN;\n            fxaa_source_texture_desc.Flags =\n                D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS;\n            if (FAILED(device->CreateCommittedResource(\n                    &ui::d3d12::util::kHeapPropertiesDefault,\n                    provider.GetHeapFlagCreateNotZeroed(),\n                    &fxaa_source_texture_desc,\n                    D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE, nullptr,\n                    IID_PPV_ARGS(&fxaa_source_texture_)))) {\n              XELOGE(\"Failed to create the FXAA input texture\");\n              swap_post_effect = SwapPostEffect::kNone;\n              use_fxaa = false;\n            }\n          }\n        }\n\n        // This is according to D3D::InitializePresentationParameters from a\n        // game executable, which initializes the 256-entry table gamma ramp for\n        // 8_8_8_8 output and the PWL gamma ramp for 2_10_10_10.\n        // TODO(Triang3l): Choose between the table and PWL based on\n        // DC_LUTA_CONTROL, support both for all formats (and also different\n        // increments for PWL).\n        bool use_pwl_gamma_ramp =\n            frontbuffer_format == xenos::TextureFormat::k_2_10_10_10 ||\n            frontbuffer_format ==\n                xenos::TextureFormat::k_2_10_10_10_AS_16_16_16_16;\n\n        context.SetIs8bpc(!use_pwl_gamma_ramp && !use_fxaa);\n\n        // Upload the new gamma ramp, using the upload buffer for the current\n        // frame (will close the frame after this anyway, so can't write\n        // multiple times per frame).\n        if (!(use_pwl_gamma_ramp ? gamma_ramp_pwl_up_to_date_\n                                 : gamma_ramp_256_entry_table_up_to_date_)) {\n          uint32_t gamma_ramp_offset_bytes = use_pwl_gamma_ramp ? 256 * 4 : 0;\n          uint32_t gamma_ramp_upload_offset_bytes =\n              uint32_t(frame_current_ % kQueueFrames) * ((256 + 128 * 3) * 4) +\n              gamma_ramp_offset_bytes;\n          uint32_t gamma_ramp_size_bytes =\n              (use_pwl_gamma_ramp ? 128 * 3 : 256) * 4;\n          if (std::endian::native != std::endian::little &&\n              use_pwl_gamma_ramp) {\n            // R16G16 is first R16, where the shader expects the base, and\n            // second G16, where the delta should be, but gamma_ramp_pwl_rgb()\n            // is an array of 32-bit DC_LUT_PWL_DATA registers - swap 16 bits in\n            // each 32.\n            auto gamma_ramp_pwl_upload_buffer =\n                reinterpret_cast<reg::DC_LUT_PWL_DATA*>(\n                    gamma_ramp_upload_buffer_mapping_ +\n                    gamma_ramp_upload_offset_bytes);\n            const reg::DC_LUT_PWL_DATA* gamma_ramp_pwl = gamma_ramp_pwl_rgb();\n            for (size_t i = 0; i < 128 * 3; ++i) {\n              reg::DC_LUT_PWL_DATA& gamma_ramp_pwl_upload_buffer_entry =\n                  gamma_ramp_pwl_upload_buffer[i];\n              reg::DC_LUT_PWL_DATA gamma_ramp_pwl_entry = gamma_ramp_pwl[i];\n              gamma_ramp_pwl_upload_buffer_entry.base =\n                  gamma_ramp_pwl_entry.delta;\n              gamma_ramp_pwl_upload_buffer_entry.delta =\n                  gamma_ramp_pwl_entry.base;\n            }\n          } else {\n            std::memcpy(\n                gamma_ramp_upload_buffer_mapping_ +\n                    gamma_ramp_upload_offset_bytes,\n                use_pwl_gamma_ramp\n                    ? static_cast<const void*>(gamma_ramp_pwl_rgb())\n                    : static_cast<const void*>(gamma_ramp_256_entry_table()),\n                gamma_ramp_size_bytes);\n          }\n          PushTransitionBarrier(gamma_ramp_buffer_.Get(),\n                                gamma_ramp_buffer_state_,\n                                D3D12_RESOURCE_STATE_COPY_DEST);\n          gamma_ramp_buffer_state_ = D3D12_RESOURCE_STATE_COPY_DEST;\n          SubmitBarriers();\n          deferred_command_list_.D3DCopyBufferRegion(\n              gamma_ramp_buffer_.Get(), gamma_ramp_offset_bytes,\n              gamma_ramp_upload_buffer_.Get(), gamma_ramp_upload_offset_bytes,\n              gamma_ramp_size_bytes);\n          (use_pwl_gamma_ramp ? gamma_ramp_pwl_up_to_date_\n                              : gamma_ramp_256_entry_table_up_to_date_) = true;\n        }\n\n        // Destination, source, and if bindful, gamma ramp.\n        ui::d3d12::util::DescriptorCpuGpuHandlePair apply_gamma_descriptors[3];\n        ui::d3d12::util::DescriptorCpuGpuHandlePair\n            apply_gamma_descriptor_gamma_ramp;\n        if (!RequestOneUseSingleViewDescriptors(\n                bindless_resources_used_ ? 2 : 3, apply_gamma_descriptors)) {\n          return false;\n        }\n        // Must not call anything that can change the descriptor heap from now\n        // on!\n        if (bindless_resources_used_) {\n          apply_gamma_descriptor_gamma_ramp = GetSystemBindlessViewHandlePair(\n              use_pwl_gamma_ramp ? SystemBindlessView::kGammaRampPWLSRV\n                                 : SystemBindlessView::kGammaRampTableSRV);\n        } else {\n          apply_gamma_descriptor_gamma_ramp = apply_gamma_descriptors[2];\n          WriteGammaRampSRV(use_pwl_gamma_ramp,\n                            apply_gamma_descriptor_gamma_ramp.first);\n        }\n\n        ID3D12Resource* guest_output_resource =\n            static_cast<\n                ui::d3d12::D3D12Presenter::D3D12GuestOutputRefreshContext&>(\n                context)\n                .resource_uav_capable();\n\n        if (use_fxaa) {\n          fxaa_source_texture_submission_ = GetCurrentSubmission();\n        }\n\n        ID3D12Resource* apply_gamma_dest =\n            use_fxaa ? fxaa_source_texture_.Get() : guest_output_resource;\n        D3D12_RESOURCE_STATES apply_gamma_dest_initial_state =\n            use_fxaa ? D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE\n                     : ui::d3d12::D3D12Presenter::kGuestOutputInternalState;\n        static_cast<ui::d3d12::D3D12Presenter::D3D12GuestOutputRefreshContext&>(\n            context)\n            .resource_uav_capable();\n        PushTransitionBarrier(apply_gamma_dest, apply_gamma_dest_initial_state,\n                              D3D12_RESOURCE_STATE_UNORDERED_ACCESS);\n        // From now on, even in case of failure, apply_gamma_dest must be\n        // transitioned back to apply_gamma_dest_initial_state!\n        D3D12_UNORDERED_ACCESS_VIEW_DESC apply_gamma_dest_uav_desc;\n        apply_gamma_dest_uav_desc.Format =\n            use_fxaa ? kFxaaSourceTextureFormat\n                     : ui::d3d12::D3D12Presenter::kGuestOutputFormat;\n        apply_gamma_dest_uav_desc.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE2D;\n        apply_gamma_dest_uav_desc.Texture2D.MipSlice = 0;\n        apply_gamma_dest_uav_desc.Texture2D.PlaneSlice = 0;\n        device->CreateUnorderedAccessView(apply_gamma_dest, nullptr,\n                                          &apply_gamma_dest_uav_desc,\n                                          apply_gamma_descriptors[0].first);\n\n        device->CreateShaderResourceView(swap_texture_resource,\n                                         &swap_texture_srv_desc,\n                                         apply_gamma_descriptors[1].first);\n\n        PushTransitionBarrier(gamma_ramp_buffer_.Get(),\n                              gamma_ramp_buffer_state_,\n                              D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE);\n        gamma_ramp_buffer_state_ =\n            D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE;\n\n        deferred_command_list_.D3DSetComputeRootSignature(\n            apply_gamma_root_signature_.Get());\n        ApplyGammaConstants apply_gamma_constants;\n        apply_gamma_constants.size[0] = uint32_t(swap_texture_desc.Width);\n        apply_gamma_constants.size[1] = uint32_t(swap_texture_desc.Height);\n        deferred_command_list_.D3DSetComputeRoot32BitConstants(\n            UINT(ApplyGammaRootParameter::kConstants),\n            sizeof(apply_gamma_constants) / sizeof(uint32_t),\n            &apply_gamma_constants, 0);\n        deferred_command_list_.D3DSetComputeRootDescriptorTable(\n            UINT(ApplyGammaRootParameter::kDestination),\n            apply_gamma_descriptors[0].second);\n        deferred_command_list_.D3DSetComputeRootDescriptorTable(\n            UINT(ApplyGammaRootParameter::kSource),\n            apply_gamma_descriptors[1].second);\n        deferred_command_list_.D3DSetComputeRootDescriptorTable(\n            UINT(ApplyGammaRootParameter::kRamp),\n            apply_gamma_descriptor_gamma_ramp.second);\n        ID3D12PipelineState* apply_gamma_pipeline;\n        if (use_pwl_gamma_ramp) {\n          apply_gamma_pipeline = use_fxaa\n                                     ? apply_gamma_pwl_fxaa_luma_pipeline_.Get()\n                                     : apply_gamma_pwl_pipeline_.Get();\n        } else {\n          apply_gamma_pipeline =\n              use_fxaa ? apply_gamma_table_fxaa_luma_pipeline_.Get()\n                       : apply_gamma_table_pipeline_.Get();\n        }\n        SetExternalPipeline(apply_gamma_pipeline);\n        SubmitBarriers();\n        uint32_t group_count_x = (uint32_t(swap_texture_desc.Width) + 15) / 16;\n        uint32_t group_count_y = (uint32_t(swap_texture_desc.Height) + 7) / 8;\n        deferred_command_list_.D3DDispatch(group_count_x, group_count_y, 1);\n\n        // Apply FXAA.\n        if (use_fxaa) {\n          // Destination and source.\n          ui::d3d12::util::DescriptorCpuGpuHandlePair fxaa_descriptors[2];\n          if (!RequestOneUseSingleViewDescriptors(\n                  uint32_t(xe::countof(fxaa_descriptors)), fxaa_descriptors)) {\n            // Failed to obtain descriptors for FXAA - just copy after gamma\n            // ramp application without applying FXAA.\n            PushTransitionBarrier(apply_gamma_dest,\n                                  D3D12_RESOURCE_STATE_UNORDERED_ACCESS,\n                                  D3D12_RESOURCE_STATE_COPY_SOURCE);\n            PushTransitionBarrier(\n                guest_output_resource,\n                ui::d3d12::D3D12Presenter::kGuestOutputInternalState,\n                D3D12_RESOURCE_STATE_COPY_DEST);\n            SubmitBarriers();\n            deferred_command_list_.D3DCopyResource(guest_output_resource,\n                                                   apply_gamma_dest);\n            PushTransitionBarrier(apply_gamma_dest,\n                                  D3D12_RESOURCE_STATE_COPY_SOURCE,\n                                  apply_gamma_dest_initial_state);\n            PushTransitionBarrier(\n                guest_output_resource, D3D12_RESOURCE_STATE_COPY_DEST,\n                ui::d3d12::D3D12Presenter::kGuestOutputInternalState);\n            return false;\n          } else {\n            assert_true(apply_gamma_dest_initial_state ==\n                        D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE);\n            PushTransitionBarrier(apply_gamma_dest,\n                                  D3D12_RESOURCE_STATE_UNORDERED_ACCESS,\n                                  apply_gamma_dest_initial_state);\n            PushTransitionBarrier(\n                guest_output_resource,\n                ui::d3d12::D3D12Presenter::kGuestOutputInternalState,\n                D3D12_RESOURCE_STATE_UNORDERED_ACCESS);\n            // From now on, even in case of failure, guest_output_resource must\n            // be transitioned back to kGuestOutputInternalState!\n            deferred_command_list_.D3DSetComputeRootSignature(\n                fxaa_root_signature_.Get());\n            FxaaConstants fxaa_constants;\n            fxaa_constants.size[0] = uint32_t(swap_texture_desc.Width);\n            fxaa_constants.size[1] = uint32_t(swap_texture_desc.Height);\n            fxaa_constants.size_inv[0] = 1.0f / float(fxaa_constants.size[0]);\n            fxaa_constants.size_inv[1] = 1.0f / float(fxaa_constants.size[1]);\n            deferred_command_list_.D3DSetComputeRoot32BitConstants(\n                UINT(FxaaRootParameter::kConstants),\n                sizeof(fxaa_constants) / sizeof(uint32_t), &fxaa_constants, 0);\n            D3D12_UNORDERED_ACCESS_VIEW_DESC fxaa_dest_uav_desc;\n            fxaa_dest_uav_desc.Format =\n                ui::d3d12::D3D12Presenter::kGuestOutputFormat;\n            fxaa_dest_uav_desc.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE2D;\n            fxaa_dest_uav_desc.Texture2D.MipSlice = 0;\n            fxaa_dest_uav_desc.Texture2D.PlaneSlice = 0;\n            device->CreateUnorderedAccessView(guest_output_resource, nullptr,\n                                              &fxaa_dest_uav_desc,\n                                              fxaa_descriptors[0].first);\n            deferred_command_list_.D3DSetComputeRootDescriptorTable(\n                UINT(FxaaRootParameter::kDestination),\n                fxaa_descriptors[0].second);\n            D3D12_SHADER_RESOURCE_VIEW_DESC fxaa_source_srv_desc;\n            fxaa_source_srv_desc.Format = kFxaaSourceTextureFormat;\n            fxaa_source_srv_desc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D;\n            fxaa_source_srv_desc.Shader4ComponentMapping =\n                D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;\n            fxaa_source_srv_desc.Texture2D.MostDetailedMip = 0;\n            fxaa_source_srv_desc.Texture2D.MipLevels = 1;\n            fxaa_source_srv_desc.Texture2D.PlaneSlice = 0;\n            fxaa_source_srv_desc.Texture2D.ResourceMinLODClamp = 0.0f;\n            device->CreateShaderResourceView(fxaa_source_texture_.Get(),\n                                             &fxaa_source_srv_desc,\n                                             fxaa_descriptors[1].first);\n            deferred_command_list_.D3DSetComputeRootDescriptorTable(\n                UINT(FxaaRootParameter::kSource), fxaa_descriptors[1].second);\n            SetExternalPipeline(swap_post_effect == SwapPostEffect::kFxaaExtreme\n                                    ? fxaa_extreme_pipeline_.Get()\n                                    : fxaa_pipeline_.Get());\n            SubmitBarriers();\n            deferred_command_list_.D3DDispatch(group_count_x, group_count_y, 1);\n            PushTransitionBarrier(\n                guest_output_resource, D3D12_RESOURCE_STATE_UNORDERED_ACCESS,\n                ui::d3d12::D3D12Presenter::kGuestOutputInternalState);\n          }\n        } else {\n          assert_true(apply_gamma_dest_initial_state ==\n                      ui::d3d12::D3D12Presenter::kGuestOutputInternalState);\n          PushTransitionBarrier(apply_gamma_dest,\n                                D3D12_RESOURCE_STATE_UNORDERED_ACCESS,\n                                apply_gamma_dest_initial_state);\n        }\n\n        // Need to submit all the commands before giving the image back to the\n        // presenter so it can submit its own commands for displaying it to the\n        // queue.\n        SubmitBarriers();\n        EndSubmission(true);\n        return true;\n      });\n\n  // End the frame even if did not present for any reason (the image refresher\n  // was not called), to prevent leaking per-frame resources.\n  EndSubmission(true);\n}\n\nvoid D3D12CommandProcessor::OnPrimaryBufferEnd() {\n  if (cvars::d3d12_submit_on_primary_buffer_end && submission_open_ &&\n      CanEndSubmissionImmediately()) {\n    EndSubmission(false);\n  }\n}\n\nShader* D3D12CommandProcessor::LoadShader(xenos::ShaderType shader_type,\n                                          uint32_t guest_address,\n                                          const uint32_t* host_address,\n                                          uint32_t dword_count) {\n  return pipeline_cache_->LoadShader(shader_type, host_address, dword_count);\n}\n\nbool D3D12CommandProcessor::IssueDraw(xenos::PrimitiveType primitive_type,\n                                      uint32_t index_count,\n                                      IndexBufferInfo* index_buffer_info,\n                                      bool major_mode_explicit) {\n#if XE_GPU_FINE_GRAINED_DRAW_SCOPES\n  SCOPE_profile_cpu_f(\"gpu\");\n#endif  // XE_GPU_FINE_GRAINED_DRAW_SCOPES\n\n  ID3D12Device* device = GetD3D12Provider().GetDevice();\n  const RegisterFile& regs = *register_file_;\n\n  xenos::EdramMode edram_mode = regs.Get<reg::RB_MODECONTROL>().edram_mode;\n  if (edram_mode == xenos::EdramMode::kCopy) {\n    // Special copy handling.\n    return IssueCopy();\n  }\n\n  if (regs.Get<reg::RB_SURFACE_INFO>().surface_pitch == 0) {\n    // Doesn't actually draw.\n    // TODO(Triang3l): Do something so memexport still works in this case maybe?\n    // Unlikely that zero would even really be legal though.\n    return true;\n  }\n\n  // Vertex shader analysis.\n  auto vertex_shader = static_cast<D3D12Shader*>(active_vertex_shader());\n  if (!vertex_shader) {\n    // Always need a vertex shader.\n    return false;\n  }\n  pipeline_cache_->AnalyzeShaderUcode(*vertex_shader);\n  bool memexport_used_vertex = vertex_shader->memexport_eM_written() != 0;\n\n  // Pixel shader analysis.\n  bool primitive_polygonal = draw_util::IsPrimitivePolygonal(regs);\n  bool is_rasterization_done =\n      draw_util::IsRasterizationPotentiallyDone(regs, primitive_polygonal);\n  D3D12Shader* pixel_shader = nullptr;\n  if (is_rasterization_done) {\n    // See xenos::EdramMode for explanation why the pixel shader is only used\n    // when it's kColorDepth here.\n    if (edram_mode == xenos::EdramMode::kColorDepth) {\n      pixel_shader = static_cast<D3D12Shader*>(active_pixel_shader());\n      if (pixel_shader) {\n        pipeline_cache_->AnalyzeShaderUcode(*pixel_shader);\n        if (!draw_util::IsPixelShaderNeededWithRasterization(*pixel_shader,\n                                                             regs)) {\n          pixel_shader = nullptr;\n        }\n      }\n    }\n  } else {\n    // Disabling pixel shader for this case is also required by the pipeline\n    // cache.\n    if (!memexport_used_vertex) {\n      // This draw has no effect.\n      return true;\n    }\n  }\n  bool memexport_used_pixel =\n      pixel_shader && (pixel_shader->memexport_eM_written() != 0);\n  bool memexport_used = memexport_used_vertex || memexport_used_pixel;\n\n  if (!BeginSubmission(true)) {\n    return false;\n  }\n\n  // Process primitives.\n  PrimitiveProcessor::ProcessingResult primitive_processing_result;\n  if (!primitive_processor_->Process(primitive_processing_result)) {\n    return false;\n  }\n  if (!primitive_processing_result.host_draw_vertex_count) {\n    // Nothing to draw.\n    return true;\n  }\n\n  reg::RB_DEPTHCONTROL normalized_depth_control =\n      draw_util::GetNormalizedDepthControl(regs);\n\n  // Shader modifications.\n  uint32_t ps_param_gen_pos = UINT32_MAX;\n  uint32_t interpolator_mask =\n      pixel_shader ? (vertex_shader->writes_interpolators() &\n                      pixel_shader->GetInterpolatorInputMask(\n                          regs.Get<reg::SQ_PROGRAM_CNTL>(),\n                          regs.Get<reg::SQ_CONTEXT_MISC>(), ps_param_gen_pos))\n                   : 0;\n  DxbcShaderTranslator::Modification vertex_shader_modification =\n      pipeline_cache_->GetCurrentVertexShaderModification(\n          *vertex_shader, primitive_processing_result.host_vertex_shader_type,\n          interpolator_mask);\n  DxbcShaderTranslator::Modification pixel_shader_modification =\n      pixel_shader ? pipeline_cache_->GetCurrentPixelShaderModification(\n                         *pixel_shader, interpolator_mask, ps_param_gen_pos,\n                         normalized_depth_control)\n                   : DxbcShaderTranslator::Modification(0);\n\n  // Set up the render targets - this may perform dispatches and draws.\n  uint32_t normalized_color_mask =\n      pixel_shader ? draw_util::GetNormalizedColorMask(\n                         regs, pixel_shader->writes_color_targets())\n                   : 0;\n  if (!render_target_cache_->Update(is_rasterization_done,\n                                    normalized_depth_control,\n                                    normalized_color_mask, *vertex_shader)) {\n    return false;\n  }\n\n  // Create the pipeline (for this, need the actually used render target formats\n  // from the render target cache), translating the shaders - doing this now to\n  // obtain the used textures.\n  D3D12Shader::D3D12Translation* vertex_shader_translation =\n      static_cast<D3D12Shader::D3D12Translation*>(\n          vertex_shader->GetOrCreateTranslation(\n              vertex_shader_modification.value));\n  D3D12Shader::D3D12Translation* pixel_shader_translation =\n      pixel_shader ? static_cast<D3D12Shader::D3D12Translation*>(\n                         pixel_shader->GetOrCreateTranslation(\n                             pixel_shader_modification.value))\n                   : nullptr;\n  uint32_t bound_depth_and_color_render_target_bits;\n  uint32_t bound_depth_and_color_render_target_formats\n      [1 + xenos::kMaxColorRenderTargets];\n  bool host_render_targets_used = render_target_cache_->GetPath() ==\n                                  RenderTargetCache::Path::kHostRenderTargets;\n  if (host_render_targets_used) {\n    bound_depth_and_color_render_target_bits =\n        render_target_cache_->GetLastUpdateBoundRenderTargets(\n            bound_depth_and_color_render_target_formats);\n  } else {\n    bound_depth_and_color_render_target_bits = 0;\n  }\n  void* pipeline_handle;\n  ID3D12RootSignature* root_signature;\n  if (!pipeline_cache_->ConfigurePipeline(\n          vertex_shader_translation, pixel_shader_translation,\n          primitive_processing_result, normalized_depth_control,\n          normalized_color_mask, bound_depth_and_color_render_target_bits,\n          bound_depth_and_color_render_target_formats, &pipeline_handle,\n          &root_signature)) {\n    return false;\n  }\n\n  // Update the textures - this may bind pipelines.\n  uint32_t used_texture_mask =\n      vertex_shader->GetUsedTextureMaskAfterTranslation() |\n      (pixel_shader != nullptr\n           ? pixel_shader->GetUsedTextureMaskAfterTranslation()\n           : 0);\n  texture_cache_->RequestTextures(used_texture_mask);\n\n  // Bind the pipeline after configuring it and doing everything that may bind\n  // other pipelines.\n  if (current_guest_pipeline_ != pipeline_handle) {\n    deferred_command_list_.SetPipelineStateHandle(\n        reinterpret_cast<void*>(pipeline_handle));\n    current_guest_pipeline_ = pipeline_handle;\n    current_external_pipeline_ = nullptr;\n  }\n\n  // Get dynamic rasterizer state.\n  uint32_t draw_resolution_scale_x = texture_cache_->draw_resolution_scale_x();\n  uint32_t draw_resolution_scale_y = texture_cache_->draw_resolution_scale_y();\n  draw_util::ViewportInfo viewport_info;\n  draw_util::GetHostViewportInfo(\n      regs, draw_resolution_scale_x, draw_resolution_scale_y, true,\n      D3D12_VIEWPORT_BOUNDS_MAX, D3D12_VIEWPORT_BOUNDS_MAX, false,\n      normalized_depth_control,\n      host_render_targets_used &&\n          render_target_cache_->depth_float24_convert_in_pixel_shader(),\n      host_render_targets_used, pixel_shader && pixel_shader->writes_depth(),\n      viewport_info);\n  draw_util::Scissor scissor;\n  draw_util::GetScissor(regs, scissor);\n  scissor.offset[0] *= draw_resolution_scale_x;\n  scissor.offset[1] *= draw_resolution_scale_y;\n  scissor.extent[0] *= draw_resolution_scale_x;\n  scissor.extent[1] *= draw_resolution_scale_y;\n\n  // Update viewport, scissor, blend factor and stencil reference.\n  UpdateFixedFunctionState(viewport_info, scissor, primitive_polygonal,\n                           normalized_depth_control);\n\n  // Update system constants before uploading them.\n  // TODO(Triang3l): With ROV, pass the disabled render target mask for safety.\n  UpdateSystemConstantValues(\n      memexport_used, primitive_polygonal,\n      primitive_processing_result.line_loop_closing_index,\n      primitive_processing_result.host_shader_index_endian, viewport_info,\n      used_texture_mask, normalized_depth_control, normalized_color_mask);\n\n  // Update constant buffers, descriptors and root parameters.\n  if (!UpdateBindings(vertex_shader, pixel_shader, root_signature,\n                      memexport_used)) {\n    return false;\n  }\n  // Must not call anything that can change the descriptor heap from now on!\n\n  // Ensure vertex buffers are resident.\n  // TODO(Triang3l): Cache residency for ranges in a way similar to how texture\n  // validity is tracked.\n  const Shader::ConstantRegisterMap& constant_map_vertex =\n      vertex_shader->constant_register_map();\n  for (uint32_t i = 0; i < xe::countof(constant_map_vertex.vertex_fetch_bitmap);\n       ++i) {\n    uint32_t vfetch_bits_remaining = constant_map_vertex.vertex_fetch_bitmap[i];\n    uint32_t j;\n    while (xe::bit_scan_forward(vfetch_bits_remaining, &j)) {\n      vfetch_bits_remaining &= ~(uint32_t(1) << j);\n      uint32_t vfetch_index = i * 32 + j;\n      xenos::xe_gpu_vertex_fetch_t vfetch_constant =\n          regs.GetVertexFetch(vfetch_index);\n      switch (vfetch_constant.type) {\n        case xenos::FetchConstantType::kVertex:\n          break;\n        case xenos::FetchConstantType::kInvalidVertex:\n          if (cvars::gpu_allow_invalid_fetch_constants) {\n            break;\n          }\n          XELOGW(\n              \"Vertex fetch constant {} ({:08X} {:08X}) has \\\"invalid\\\" type! \"\n              \"This is incorrect behavior, but you can try bypassing this by \"\n              \"launching Xenia with --gpu_allow_invalid_fetch_constants=true.\",\n              vfetch_index, vfetch_constant.dword_0, vfetch_constant.dword_1);\n          return false;\n        default:\n          XELOGW(\n              \"Vertex fetch constant {} ({:08X} {:08X}) is completely invalid!\",\n              vfetch_index, vfetch_constant.dword_0, vfetch_constant.dword_1);\n          return false;\n      }\n      if (!shared_memory_->RequestRange(vfetch_constant.address << 2,\n                                        vfetch_constant.size << 2)) {\n        XELOGE(\n            \"Failed to request vertex buffer at 0x{:08X} (size {}) in the \"\n            \"shared memory\",\n            vfetch_constant.address << 2, vfetch_constant.size << 2);\n        return false;\n      }\n    }\n  }\n\n  // Gather memexport ranges and ensure the heaps for them are resident, and\n  // also load the data surrounding the export and to fill the regions that\n  // won't be modified by the shaders.\n  memexport_ranges_.clear();\n  if (memexport_used_vertex) {\n    draw_util::AddMemExportRanges(regs, *vertex_shader, memexport_ranges_);\n  }\n  if (memexport_used_pixel) {\n    draw_util::AddMemExportRanges(regs, *pixel_shader, memexport_ranges_);\n  }\n  for (const draw_util::MemExportRange& memexport_range : memexport_ranges_) {\n    if (!shared_memory_->RequestRange(memexport_range.base_address_dwords << 2,\n                                      memexport_range.size_bytes)) {\n      XELOGE(\n          \"Failed to request memexport stream at 0x{:08X} (size {}) in the \"\n          \"shared memory\",\n          memexport_range.base_address_dwords << 2, memexport_range.size_bytes);\n      return false;\n    }\n  }\n\n  // Primitive topology.\n  D3D_PRIMITIVE_TOPOLOGY primitive_topology;\n  if (primitive_processing_result.IsTessellated()) {\n    switch (primitive_processing_result.host_primitive_type) {\n      // TODO(Triang3l): Support all primitive types.\n      case xenos::PrimitiveType::kTriangleList:\n        primitive_topology = D3D_PRIMITIVE_TOPOLOGY_3_CONTROL_POINT_PATCHLIST;\n        break;\n      case xenos::PrimitiveType::kQuadList:\n        primitive_topology = D3D_PRIMITIVE_TOPOLOGY_4_CONTROL_POINT_PATCHLIST;\n        break;\n      case xenos::PrimitiveType::kTrianglePatch:\n        primitive_topology =\n            (regs.Get<reg::VGT_HOS_CNTL>().tess_mode ==\n             xenos::TessellationMode::kAdaptive)\n                ? D3D_PRIMITIVE_TOPOLOGY_3_CONTROL_POINT_PATCHLIST\n                : D3D_PRIMITIVE_TOPOLOGY_1_CONTROL_POINT_PATCHLIST;\n        break;\n      case xenos::PrimitiveType::kQuadPatch:\n        primitive_topology =\n            (regs.Get<reg::VGT_HOS_CNTL>().tess_mode ==\n             xenos::TessellationMode::kAdaptive)\n                ? D3D_PRIMITIVE_TOPOLOGY_4_CONTROL_POINT_PATCHLIST\n                : D3D_PRIMITIVE_TOPOLOGY_1_CONTROL_POINT_PATCHLIST;\n        break;\n      default:\n        XELOGE(\n            \"Host tessellated primitive type {} returned by the primitive \"\n            \"processor is not supported by the Direct3D 12 command processor\",\n            uint32_t(primitive_processing_result.host_primitive_type));\n        assert_unhandled_case(primitive_processing_result.host_primitive_type);\n        return false;\n    }\n  } else {\n    switch (primitive_processing_result.host_primitive_type) {\n      case xenos::PrimitiveType::kPointList:\n        primitive_topology = D3D_PRIMITIVE_TOPOLOGY_POINTLIST;\n        break;\n      case xenos::PrimitiveType::kLineList:\n        primitive_topology = D3D_PRIMITIVE_TOPOLOGY_LINELIST;\n        break;\n      case xenos::PrimitiveType::kLineStrip:\n        primitive_topology = D3D_PRIMITIVE_TOPOLOGY_LINESTRIP;\n        break;\n      case xenos::PrimitiveType::kTriangleList:\n      case xenos::PrimitiveType::kRectangleList:\n        primitive_topology = D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST;\n        break;\n      case xenos::PrimitiveType::kTriangleStrip:\n        primitive_topology = D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP;\n        break;\n      case xenos::PrimitiveType::kQuadList:\n        primitive_topology = D3D_PRIMITIVE_TOPOLOGY_LINELIST_ADJ;\n        break;\n      default:\n        XELOGE(\n            \"Host primitive type {} returned by the primitive processor is not \"\n            \"supported by the Direct3D 12 command processor\",\n            uint32_t(primitive_processing_result.host_primitive_type));\n        assert_unhandled_case(primitive_processing_result.host_primitive_type);\n        return false;\n    }\n  }\n  SetPrimitiveTopology(primitive_topology);\n  // Must not call anything that may change the primitive topology from now on!\n\n  // Draw.\n  if (primitive_processing_result.index_buffer_type ==\n      PrimitiveProcessor::ProcessedIndexBufferType::kNone) {\n    if (memexport_used) {\n      shared_memory_->UseForWriting();\n    } else {\n      shared_memory_->UseForReading();\n    }\n    SubmitBarriers();\n    deferred_command_list_.D3DDrawInstanced(\n        primitive_processing_result.host_draw_vertex_count, 1, 0, 0);\n  } else {\n    D3D12_INDEX_BUFFER_VIEW index_buffer_view;\n    index_buffer_view.SizeInBytes =\n        primitive_processing_result.host_draw_vertex_count;\n    if (primitive_processing_result.host_index_format ==\n        xenos::IndexFormat::kInt16) {\n      index_buffer_view.SizeInBytes *= sizeof(uint16_t);\n      index_buffer_view.Format = DXGI_FORMAT_R16_UINT;\n    } else {\n      index_buffer_view.SizeInBytes *= sizeof(uint32_t);\n      index_buffer_view.Format = DXGI_FORMAT_R32_UINT;\n    }\n    ID3D12Resource* scratch_index_buffer = nullptr;\n    switch (primitive_processing_result.index_buffer_type) {\n      case PrimitiveProcessor::ProcessedIndexBufferType::kGuestDMA: {\n        if (memexport_used) {\n          // If the shared memory is a UAV, it can't be used as an index buffer\n          // (UAV is a read/write state, index buffer is a read-only state).\n          // Need to copy the indices to a buffer in the index buffer state.\n          scratch_index_buffer = RequestScratchGPUBuffer(\n              index_buffer_view.SizeInBytes, D3D12_RESOURCE_STATE_COPY_DEST);\n          if (scratch_index_buffer == nullptr) {\n            return false;\n          }\n          shared_memory_->UseAsCopySource();\n          SubmitBarriers();\n          deferred_command_list_.D3DCopyBufferRegion(\n              scratch_index_buffer, 0, shared_memory_->GetBuffer(),\n              primitive_processing_result.guest_index_base,\n              index_buffer_view.SizeInBytes);\n          PushTransitionBarrier(scratch_index_buffer,\n                                D3D12_RESOURCE_STATE_COPY_DEST,\n                                D3D12_RESOURCE_STATE_INDEX_BUFFER);\n          index_buffer_view.BufferLocation =\n              scratch_index_buffer->GetGPUVirtualAddress();\n        } else {\n          index_buffer_view.BufferLocation =\n              shared_memory_->GetGPUAddress() +\n              primitive_processing_result.guest_index_base;\n        }\n      } break;\n      case PrimitiveProcessor::ProcessedIndexBufferType::kHostConverted:\n        index_buffer_view.BufferLocation =\n            primitive_processor_->GetConvertedIndexBufferGpuAddress(\n                primitive_processing_result.host_index_buffer_handle);\n        break;\n      case PrimitiveProcessor::ProcessedIndexBufferType::kHostBuiltinForAuto:\n      case PrimitiveProcessor::ProcessedIndexBufferType::kHostBuiltinForDMA:\n        index_buffer_view.BufferLocation =\n            primitive_processor_->GetBuiltinIndexBufferGpuAddress(\n                primitive_processing_result.host_index_buffer_handle);\n        break;\n      default:\n        assert_unhandled_case(primitive_processing_result.index_buffer_type);\n        return false;\n    }\n    deferred_command_list_.D3DIASetIndexBuffer(&index_buffer_view);\n    if (memexport_used) {\n      shared_memory_->UseForWriting();\n    } else {\n      shared_memory_->UseForReading();\n    }\n    SubmitBarriers();\n    deferred_command_list_.D3DDrawIndexedInstanced(\n        primitive_processing_result.host_draw_vertex_count, 1, 0, 0, 0);\n    if (scratch_index_buffer != nullptr) {\n      ReleaseScratchGPUBuffer(scratch_index_buffer,\n                              D3D12_RESOURCE_STATE_INDEX_BUFFER);\n    }\n  }\n\n  if (memexport_used) {\n    // Make sure this memexporting draw is ordered with other work using shared\n    // memory as a UAV.\n    // TODO(Triang3l): Find some PM4 command that can be used for indication of\n    // when memexports should be awaited?\n    shared_memory_->MarkUAVWritesCommitNeeded();\n    // Invalidate textures in memexported memory and watch for changes.\n    for (const draw_util::MemExportRange& memexport_range : memexport_ranges_) {\n      shared_memory_->RangeWrittenByGpu(\n          memexport_range.base_address_dwords << 2, memexport_range.size_bytes);\n    }\n    if (cvars::d3d12_readback_memexport) {\n      // Read the exported data on the CPU.\n      uint32_t memexport_total_size = 0;\n      for (const draw_util::MemExportRange& memexport_range :\n           memexport_ranges_) {\n        memexport_total_size += memexport_range.size_bytes;\n      }\n      if (memexport_total_size != 0) {\n        ID3D12Resource* readback_buffer =\n            RequestReadbackBuffer(memexport_total_size);\n        if (readback_buffer != nullptr) {\n          shared_memory_->UseAsCopySource();\n          SubmitBarriers();\n          ID3D12Resource* shared_memory_buffer = shared_memory_->GetBuffer();\n          uint32_t readback_buffer_offset = 0;\n          for (const draw_util::MemExportRange& memexport_range :\n               memexport_ranges_) {\n            uint32_t memexport_range_size = memexport_range.size_bytes;\n            deferred_command_list_.D3DCopyBufferRegion(\n                readback_buffer, readback_buffer_offset, shared_memory_buffer,\n                memexport_range.base_address_dwords << 2, memexport_range_size);\n            readback_buffer_offset += memexport_range_size;\n          }\n          if (AwaitAllQueueOperationsCompletion()) {\n            D3D12_RANGE readback_range;\n            readback_range.Begin = 0;\n            readback_range.End = memexport_total_size;\n            void* readback_mapping;\n            if (SUCCEEDED(readback_buffer->Map(0, &readback_range,\n                                               &readback_mapping))) {\n              const uint8_t* readback_bytes =\n                  reinterpret_cast<const uint8_t*>(readback_mapping);\n              for (const draw_util::MemExportRange& memexport_range :\n                   memexport_ranges_) {\n                std::memcpy(memory_->TranslatePhysical(\n                                memexport_range.base_address_dwords << 2),\n                            readback_bytes, memexport_range.size_bytes);\n                readback_bytes += memexport_range.size_bytes;\n              }\n              D3D12_RANGE readback_write_range = {};\n              readback_buffer->Unmap(0, &readback_write_range);\n            }\n          }\n        }\n      }\n    }\n  }\n\n  return true;\n}\n\nvoid D3D12CommandProcessor::InitializeTrace() {\n  CommandProcessor::InitializeTrace();\n\n  if (!BeginSubmission(false)) {\n    return;\n  }\n  bool render_target_cache_submitted =\n      render_target_cache_->InitializeTraceSubmitDownloads();\n  bool shared_memory_submitted =\n      shared_memory_->InitializeTraceSubmitDownloads();\n  if (!render_target_cache_submitted && !shared_memory_submitted) {\n    return;\n  }\n  AwaitAllQueueOperationsCompletion();\n  if (render_target_cache_submitted) {\n    render_target_cache_->InitializeTraceCompleteDownloads();\n  }\n  if (shared_memory_submitted) {\n    shared_memory_->InitializeTraceCompleteDownloads();\n  }\n}\n\nbool D3D12CommandProcessor::IssueCopy() {\n#if XE_GPU_FINE_GRAINED_DRAW_SCOPES\n  SCOPE_profile_cpu_f(\"gpu\");\n#endif  // XE_GPU_FINE_GRAINED_DRAW_SCOPES\n  if (!BeginSubmission(true)) {\n    return false;\n  }\n  uint32_t written_address, written_length;\n  if (!render_target_cache_->Resolve(*memory_, *shared_memory_, *texture_cache_,\n                                     written_address, written_length)) {\n    return false;\n  }\n  if (cvars::d3d12_readback_resolve &&\n      !texture_cache_->IsDrawResolutionScaled() && written_length) {\n    // Read the resolved data on the CPU.\n    ID3D12Resource* readback_buffer = RequestReadbackBuffer(written_length);\n    if (readback_buffer != nullptr) {\n      shared_memory_->UseAsCopySource();\n      SubmitBarriers();\n      ID3D12Resource* shared_memory_buffer = shared_memory_->GetBuffer();\n      deferred_command_list_.D3DCopyBufferRegion(\n          readback_buffer, 0, shared_memory_buffer, written_address,\n          written_length);\n      if (AwaitAllQueueOperationsCompletion()) {\n        D3D12_RANGE readback_range;\n        readback_range.Begin = 0;\n        readback_range.End = written_length;\n        void* readback_mapping;\n        if (SUCCEEDED(\n                readback_buffer->Map(0, &readback_range, &readback_mapping))) {\n          std::memcpy(memory_->TranslatePhysical(written_address),\n                      readback_mapping, written_length);\n          D3D12_RANGE readback_write_range = {};\n          readback_buffer->Unmap(0, &readback_write_range);\n        }\n      }\n    }\n  }\n  return true;\n}\n\nvoid D3D12CommandProcessor::CheckSubmissionCompletion(\n    uint64_t await_submission) {\n  if (await_submission >= GetCurrentSubmission()) {\n    if (submission_open_) {\n      EndSubmission(false);\n    }\n    // Ending an open submission should result in queue operations done directly\n    // (like UpdateTileMappings) to be tracked within the scope of that\n    // submission, but just in case of a failure, or queue operations being done\n    // outside of a submission, await explicitly.\n    if (queue_operations_done_since_submission_signal_) {\n      ID3D12CommandQueue* direct_queue = GetD3D12Provider().GetDirectQueue();\n      if (SUCCEEDED(queue_operations_since_submission_completion_timeline_\n                        ->SignalAndAdvance(direct_queue) &&\n                    queue_operations_since_submission_completion_timeline_\n                        ->AwaitAllSubmissions())) {\n        queue_operations_done_since_submission_signal_ = false;\n      } else {\n        XELOGE(\n            \"Failed to await the completion of an out-of-submission \"\n            \"Direct3D 12 queue operation\");\n      }\n    }\n    // A submission won't be ended if it hasn't been started, or if ending\n    // has failed - clamp the index.\n    await_submission = GetCurrentSubmission() - 1;\n  }\n\n  completion_timeline_->AwaitSubmissionAndUpdateCompleted(await_submission);\n\n  const uint64_t completed_submission = GetCompletedSubmission();\n\n  // Reclaim command allocators.\n  while (command_allocator_submitted_first_) {\n    if (command_allocator_submitted_first_->last_usage_submission >\n        completed_submission) {\n      break;\n    }\n    if (command_allocator_writable_last_) {\n      command_allocator_writable_last_->next =\n          command_allocator_submitted_first_;\n    } else {\n      command_allocator_writable_first_ = command_allocator_submitted_first_;\n    }\n    command_allocator_writable_last_ = command_allocator_submitted_first_;\n    command_allocator_submitted_first_ =\n        command_allocator_submitted_first_->next;\n    command_allocator_writable_last_->next = nullptr;\n  }\n  if (!command_allocator_submitted_first_) {\n    command_allocator_submitted_last_ = nullptr;\n  }\n\n  // Release single-use bindless descriptors.\n  while (!view_bindless_one_use_descriptors_.empty()) {\n    if (view_bindless_one_use_descriptors_.front().second >\n        completed_submission) {\n      break;\n    }\n    ReleaseViewBindlessDescriptorImmediately(\n        view_bindless_one_use_descriptors_.front().first);\n    view_bindless_one_use_descriptors_.pop_front();\n  }\n\n  // Delete transient resources marked for deletion.\n  while (!resources_for_deletion_.empty()) {\n    if (resources_for_deletion_.front().first > completed_submission) {\n      break;\n    }\n    resources_for_deletion_.front().second->Release();\n    resources_for_deletion_.pop_front();\n  }\n\n  shared_memory_->CompletedSubmissionUpdated();\n\n  render_target_cache_->CompletedSubmissionUpdated();\n\n  primitive_processor_->CompletedSubmissionUpdated();\n\n  texture_cache_->CompletedSubmissionUpdated(completed_submission);\n}\n\nbool D3D12CommandProcessor::BeginSubmission(bool is_guest_command) {\n#if XE_GPU_FINE_GRAINED_DRAW_SCOPES\n  SCOPE_profile_cpu_f(\"gpu\");\n#endif  // XE_GPU_FINE_GRAINED_DRAW_SCOPES\n\n  if (device_removed_) {\n    return false;\n  }\n\n  bool is_opening_frame = is_guest_command && !frame_open_;\n  if (submission_open_ && !is_opening_frame) {\n    return true;\n  }\n\n  // Check if the device is still available.\n  ID3D12Device* device = GetD3D12Provider().GetDevice();\n  HRESULT device_removed_reason = device->GetDeviceRemovedReason();\n  if (FAILED(device_removed_reason)) {\n    device_removed_ = true;\n    graphics_system_->OnHostGpuLossFromAnyThread(device_removed_reason !=\n                                                 DXGI_ERROR_DEVICE_REMOVED);\n    return false;\n  }\n\n  // Check the fence - needed for all kinds of submissions (to reclaim transient\n  // resources early) and specifically for frames (not to queue too many), and\n  // await the availability of the current frame.\n  CheckSubmissionCompletion(\n      is_opening_frame\n          ? closed_frame_submissions_[frame_current_ % kQueueFrames]\n          : 0);\n  // TODO(Triang3l): If failed to await (completed submission < awaited frame\n  // submission), do something like dropping the draw command that wanted to\n  // open the frame.\n  if (is_opening_frame) {\n    // Update the completed frame index, also obtaining the actual completed\n    // frame number (since the CPU may be actually less than 3 frames behind)\n    // before reclaiming resources tracked with the frame number.\n    frame_completed_ =\n        std::max(frame_current_, uint64_t(kQueueFrames)) - kQueueFrames;\n    for (uint64_t frame = frame_completed_ + 1; frame < frame_current_;\n         ++frame) {\n      if (closed_frame_submissions_[frame % kQueueFrames] >\n          GetCompletedSubmission()) {\n        break;\n      }\n      frame_completed_ = frame;\n    }\n  }\n\n  if (!submission_open_) {\n    submission_open_ = true;\n\n    // Start a new deferred command list - will submit it to the real one in the\n    // end of the submission (when async pipeline creation requests are\n    // fulfilled).\n    deferred_command_list_.Reset();\n\n    // Reset cached state of the command list.\n    ff_viewport_update_needed_ = true;\n    ff_scissor_update_needed_ = true;\n    ff_blend_factor_update_needed_ = true;\n    ff_stencil_ref_update_needed_ = true;\n    current_guest_pipeline_ = nullptr;\n    current_external_pipeline_ = nullptr;\n    current_graphics_root_signature_ = nullptr;\n    current_graphics_root_up_to_date_ = 0;\n    if (bindless_resources_used_) {\n      deferred_command_list_.SetDescriptorHeaps(view_bindless_heap_,\n                                                sampler_bindless_heap_current_);\n    } else {\n      view_bindful_heap_current_ = nullptr;\n      sampler_bindful_heap_current_ = nullptr;\n    }\n    primitive_topology_ = D3D_PRIMITIVE_TOPOLOGY_UNDEFINED;\n\n    render_target_cache_->BeginSubmission();\n\n    primitive_processor_->BeginSubmission();\n\n    texture_cache_->BeginSubmission(GetCurrentSubmission());\n  }\n\n  if (is_opening_frame) {\n    frame_open_ = true;\n\n    // Reset bindings that depend on the data stored in the pools.\n    std::memset(current_float_constant_map_vertex_, 0,\n                sizeof(current_float_constant_map_vertex_));\n    std::memset(current_float_constant_map_pixel_, 0,\n                sizeof(current_float_constant_map_pixel_));\n    cbuffer_binding_system_.up_to_date = false;\n    cbuffer_binding_float_vertex_.up_to_date = false;\n    cbuffer_binding_float_pixel_.up_to_date = false;\n    cbuffer_binding_bool_loop_.up_to_date = false;\n    cbuffer_binding_fetch_.up_to_date = false;\n    current_shared_memory_binding_is_uav_.reset();\n    if (bindless_resources_used_) {\n      cbuffer_binding_descriptor_indices_vertex_.up_to_date = false;\n      cbuffer_binding_descriptor_indices_pixel_.up_to_date = false;\n    } else {\n      draw_view_bindful_heap_index_ =\n          ui::d3d12::D3D12DescriptorHeapPool::kHeapIndexInvalid;\n      draw_sampler_bindful_heap_index_ =\n          ui::d3d12::D3D12DescriptorHeapPool::kHeapIndexInvalid;\n      bindful_textures_written_vertex_ = false;\n      bindful_textures_written_pixel_ = false;\n      bindful_samplers_written_vertex_ = false;\n      bindful_samplers_written_pixel_ = false;\n    }\n\n    // Reclaim pool pages - no need to do this every small submission since some\n    // may be reused.\n    constant_buffer_pool_->Reclaim(frame_completed_);\n    if (!bindless_resources_used_) {\n      view_bindful_heap_pool_->Reclaim(frame_completed_);\n      sampler_bindful_heap_pool_->Reclaim(frame_completed_);\n    }\n\n    pix_capturing_ =\n        pix_capture_requested_.exchange(false, std::memory_order_relaxed);\n    if (pix_capturing_) {\n      IDXGraphicsAnalysis* graphics_analysis =\n          GetD3D12Provider().GetGraphicsAnalysis();\n      if (graphics_analysis != nullptr) {\n        graphics_analysis->BeginCapture();\n      }\n    }\n\n    primitive_processor_->BeginFrame();\n\n    texture_cache_->BeginFrame();\n  }\n\n  return true;\n}\n\nbool D3D12CommandProcessor::EndSubmission(bool is_swap) {\n  const ui::d3d12::D3D12Provider& provider = GetD3D12Provider();\n\n  // Make sure there is a command allocator to write commands to.\n  if (submission_open_ && !command_allocator_writable_first_) {\n    ID3D12CommandAllocator* command_allocator;\n    if (FAILED(provider.GetDevice()->CreateCommandAllocator(\n            D3D12_COMMAND_LIST_TYPE_DIRECT,\n            IID_PPV_ARGS(&command_allocator)))) {\n      XELOGE(\"Failed to create a command allocator\");\n      // Try to submit later. Completely dropping the submission is not\n      // permitted because resources would be left in an undefined state.\n      return false;\n    }\n    command_allocator_writable_first_ = new CommandAllocator;\n    command_allocator_writable_first_->command_allocator = command_allocator;\n    command_allocator_writable_first_->last_usage_submission = 0;\n    command_allocator_writable_first_->next = nullptr;\n    command_allocator_writable_last_ = command_allocator_writable_first_;\n  }\n\n  bool is_closing_frame = is_swap && frame_open_;\n\n  if (is_closing_frame) {\n    texture_cache_->EndFrame();\n\n    primitive_processor_->EndFrame();\n  }\n\n  if (submission_open_) {\n    assert_false(scratch_buffer_used_);\n\n    pipeline_cache_->EndSubmission();\n\n    // Submit barriers now because resources with the queued barriers may be\n    // destroyed between frames.\n    SubmitBarriers();\n\n    // TODO(Triang3l): Error checking.\n\n    ID3D12CommandQueue* direct_queue = provider.GetDirectQueue();\n\n    // Submit the deferred command list.\n    // Only one deferred command list must be executed in the same\n    // ExecuteCommandLists - the boundaries of ExecuteCommandLists are a full\n    // UAV and aliasing barrier, and subsystems of the emulator assume it\n    // happens between Xenia submissions.\n    ID3D12CommandAllocator* command_allocator =\n        command_allocator_writable_first_->command_allocator;\n    command_allocator->Reset();\n    command_list_->Reset(command_allocator, nullptr);\n    deferred_command_list_.Execute(command_list_, command_list_1_);\n    command_list_->Close();\n    ID3D12CommandList* execute_command_lists[] = {command_list_};\n    direct_queue->ExecuteCommandLists(1, execute_command_lists);\n    command_allocator_writable_first_->last_usage_submission =\n        GetCurrentSubmission();\n    if (command_allocator_submitted_last_) {\n      command_allocator_submitted_last_->next =\n          command_allocator_writable_first_;\n    } else {\n      command_allocator_submitted_first_ = command_allocator_writable_first_;\n    }\n    command_allocator_submitted_last_ = command_allocator_writable_first_;\n    command_allocator_writable_first_ = command_allocator_writable_first_->next;\n    command_allocator_submitted_last_->next = nullptr;\n    if (!command_allocator_writable_first_) {\n      command_allocator_writable_last_ = nullptr;\n    }\n    completion_timeline_->SignalAndAdvance(direct_queue);\n\n    submission_open_ = false;\n\n    // Queue operations done directly (like UpdateTileMappings) will be awaited\n    // alongside the last submission if needed.\n    queue_operations_done_since_submission_signal_ = false;\n  }\n\n  if (is_closing_frame) {\n    // Close the capture after submitting.\n    if (pix_capturing_) {\n      IDXGraphicsAnalysis* graphics_analysis = provider.GetGraphicsAnalysis();\n      if (graphics_analysis != nullptr) {\n        graphics_analysis->EndCapture();\n      }\n      pix_capturing_ = false;\n    }\n    frame_open_ = false;\n    // Submission already closed now, so minus 1.\n    closed_frame_submissions_[(frame_current_++) % kQueueFrames] =\n        GetCurrentSubmission() - 1;\n\n    if (cache_clear_requested_ && AwaitAllQueueOperationsCompletion()) {\n      cache_clear_requested_ = false;\n\n      ClearCommandAllocatorCache();\n\n      ui::d3d12::util::ReleaseAndNull(scratch_buffer_);\n      scratch_buffer_size_ = 0;\n\n      if (bindless_resources_used_) {\n        texture_cache_bindless_sampler_map_.clear();\n        for (const auto& sampler_bindless_heap_overflowed :\n             sampler_bindless_heaps_overflowed_) {\n          sampler_bindless_heap_overflowed.first->Release();\n        }\n        sampler_bindless_heaps_overflowed_.clear();\n        sampler_bindless_heap_allocated_ = 0;\n      } else {\n        sampler_bindful_heap_pool_->ClearCache();\n        view_bindful_heap_pool_->ClearCache();\n      }\n      constant_buffer_pool_->ClearCache();\n\n      texture_cache_->ClearCache();\n\n      // Not clearing the root signatures as they're referenced by pipelines,\n      // which are not destroyed.\n\n      primitive_processor_->ClearCache();\n\n      render_target_cache_->ClearCache();\n\n      shared_memory_->ClearCache();\n    }\n  }\n\n  return true;\n}\n\nbool D3D12CommandProcessor::CanEndSubmissionImmediately() const {\n  return !submission_open_ || !pipeline_cache_->IsCreatingPipelines();\n}\n\nvoid D3D12CommandProcessor::ClearCommandAllocatorCache() {\n  while (command_allocator_submitted_first_) {\n    auto next = command_allocator_submitted_first_->next;\n    command_allocator_submitted_first_->command_allocator->Release();\n    delete command_allocator_submitted_first_;\n    command_allocator_submitted_first_ = next;\n  }\n  command_allocator_submitted_last_ = nullptr;\n  while (command_allocator_writable_first_) {\n    auto next = command_allocator_writable_first_->next;\n    command_allocator_writable_first_->command_allocator->Release();\n    delete command_allocator_writable_first_;\n    command_allocator_writable_first_ = next;\n  }\n  command_allocator_writable_last_ = nullptr;\n}\n\nvoid D3D12CommandProcessor::UpdateFixedFunctionState(\n    const draw_util::ViewportInfo& viewport_info,\n    const draw_util::Scissor& scissor, bool primitive_polygonal,\n    reg::RB_DEPTHCONTROL normalized_depth_control) {\n#if XE_GPU_FINE_GRAINED_DRAW_SCOPES\n  SCOPE_profile_cpu_f(\"gpu\");\n#endif  // XE_GPU_FINE_GRAINED_DRAW_SCOPES\n\n  // Viewport.\n  D3D12_VIEWPORT viewport;\n  viewport.TopLeftX = float(viewport_info.xy_offset[0]);\n  viewport.TopLeftY = float(viewport_info.xy_offset[1]);\n  viewport.Width = float(viewport_info.xy_extent[0]);\n  viewport.Height = float(viewport_info.xy_extent[1]);\n  viewport.MinDepth = viewport_info.z_min;\n  viewport.MaxDepth = viewport_info.z_max;\n  SetViewport(viewport);\n\n  // Scissor.\n  D3D12_RECT scissor_rect;\n  scissor_rect.left = LONG(scissor.offset[0]);\n  scissor_rect.top = LONG(scissor.offset[1]);\n  scissor_rect.right = LONG(scissor.offset[0] + scissor.extent[0]);\n  scissor_rect.bottom = LONG(scissor.offset[1] + scissor.extent[1]);\n  SetScissorRect(scissor_rect);\n\n  if (render_target_cache_->GetPath() ==\n      RenderTargetCache::Path::kHostRenderTargets) {\n    const RegisterFile& regs = *register_file_;\n\n    // Blend factor.\n    float blend_factor[] = {\n        regs.Get<float>(XE_GPU_REG_RB_BLEND_RED),\n        regs.Get<float>(XE_GPU_REG_RB_BLEND_GREEN),\n        regs.Get<float>(XE_GPU_REG_RB_BLEND_BLUE),\n        regs.Get<float>(XE_GPU_REG_RB_BLEND_ALPHA),\n    };\n    // std::memcmp instead of != so in case of NaN, every draw won't be\n    // invalidating it.\n    ff_blend_factor_update_needed_ |=\n        std::memcmp(ff_blend_factor_, blend_factor, sizeof(float) * 4) != 0;\n    if (ff_blend_factor_update_needed_) {\n      std::memcpy(ff_blend_factor_, blend_factor, sizeof(float) * 4);\n      deferred_command_list_.D3DOMSetBlendFactor(ff_blend_factor_);\n      ff_blend_factor_update_needed_ = false;\n    }\n\n    // Stencil reference value. Per-face reference not supported by Direct3D 12,\n    // choose the back face one only if drawing only back faces.\n    Register stencil_ref_mask_reg;\n    auto pa_su_sc_mode_cntl = regs.Get<reg::PA_SU_SC_MODE_CNTL>();\n    if (primitive_polygonal && normalized_depth_control.backface_enable &&\n        pa_su_sc_mode_cntl.cull_front && !pa_su_sc_mode_cntl.cull_back) {\n      stencil_ref_mask_reg = XE_GPU_REG_RB_STENCILREFMASK_BF;\n    } else {\n      stencil_ref_mask_reg = XE_GPU_REG_RB_STENCILREFMASK;\n    }\n    uint32_t stencil_ref =\n        regs.Get<reg::RB_STENCILREFMASK>(stencil_ref_mask_reg).stencilref;\n    ff_stencil_ref_update_needed_ |= ff_stencil_ref_ != stencil_ref;\n    if (ff_stencil_ref_update_needed_) {\n      ff_stencil_ref_ = stencil_ref;\n      deferred_command_list_.D3DOMSetStencilRef(ff_stencil_ref_);\n      ff_stencil_ref_update_needed_ = false;\n    }\n  }\n}\n\nvoid D3D12CommandProcessor::UpdateSystemConstantValues(\n    bool shared_memory_is_uav, bool primitive_polygonal,\n    uint32_t line_loop_closing_index, xenos::Endian index_endian,\n    const draw_util::ViewportInfo& viewport_info, uint32_t used_texture_mask,\n    reg::RB_DEPTHCONTROL normalized_depth_control,\n    uint32_t normalized_color_mask) {\n#if XE_GPU_FINE_GRAINED_DRAW_SCOPES\n  SCOPE_profile_cpu_f(\"gpu\");\n#endif  // XE_GPU_FINE_GRAINED_DRAW_SCOPES\n\n  const RegisterFile& regs = *register_file_;\n  auto pa_cl_clip_cntl = regs.Get<reg::PA_CL_CLIP_CNTL>();\n  auto pa_cl_vte_cntl = regs.Get<reg::PA_CL_VTE_CNTL>();\n  auto pa_su_sc_mode_cntl = regs.Get<reg::PA_SU_SC_MODE_CNTL>();\n  auto rb_alpha_ref = regs.Get<float>(XE_GPU_REG_RB_ALPHA_REF);\n  auto rb_colorcontrol = regs.Get<reg::RB_COLORCONTROL>();\n  auto rb_depth_info = regs.Get<reg::RB_DEPTH_INFO>();\n  auto rb_stencilrefmask = regs.Get<reg::RB_STENCILREFMASK>();\n  auto rb_stencilrefmask_bf =\n      regs.Get<reg::RB_STENCILREFMASK>(XE_GPU_REG_RB_STENCILREFMASK_BF);\n  auto rb_surface_info = regs.Get<reg::RB_SURFACE_INFO>();\n  auto sq_context_misc = regs.Get<reg::SQ_CONTEXT_MISC>();\n  auto sq_program_cntl = regs.Get<reg::SQ_PROGRAM_CNTL>();\n  auto vgt_draw_initiator = regs.Get<reg::VGT_DRAW_INITIATOR>();\n  uint32_t vgt_indx_offset = regs.Get<reg::VGT_INDX_OFFSET>().indx_offset;\n  uint32_t vgt_max_vtx_indx = regs.Get<reg::VGT_MAX_VTX_INDX>().max_indx;\n  uint32_t vgt_min_vtx_indx = regs.Get<reg::VGT_MIN_VTX_INDX>().min_indx;\n\n  bool edram_rov_used = render_target_cache_->GetPath() ==\n                        RenderTargetCache::Path::kPixelShaderInterlock;\n  uint32_t draw_resolution_scale_x = texture_cache_->draw_resolution_scale_x();\n  uint32_t draw_resolution_scale_y = texture_cache_->draw_resolution_scale_y();\n\n  // Get the color info register values for each render target. Also, for ROV,\n  // exclude components that don't exist in the format from the write mask.\n  // Don't exclude fully overlapping render targets, however - two render\n  // targets with the same base address are used in the lighting pass of\n  // 4D5307E6, for example, with the needed one picked with dynamic control\n  // flow.\n  reg::RB_COLOR_INFO color_infos[4];\n  float rt_clamp[4][4];\n  // Two UINT32_MAX if no components actually existing in the RT are written.\n  uint32_t rt_keep_masks[4][2];\n  for (uint32_t i = 0; i < 4; ++i) {\n    auto color_info = regs.Get<reg::RB_COLOR_INFO>(\n        reg::RB_COLOR_INFO::rt_register_indices[i]);\n    color_infos[i] = color_info;\n    if (edram_rov_used) {\n      RenderTargetCache::GetPSIColorFormatInfo(\n          color_info.color_format, (normalized_color_mask >> (i * 4)) & 0b1111,\n          rt_clamp[i][0], rt_clamp[i][1], rt_clamp[i][2], rt_clamp[i][3],\n          rt_keep_masks[i][0], rt_keep_masks[i][1]);\n    }\n  }\n\n  // Disable depth and stencil if it aliases a color render target (for\n  // instance, during the XBLA logo in 58410954, though depth writing is already\n  // disabled there).\n  bool depth_stencil_enabled = normalized_depth_control.stencil_enable ||\n                               normalized_depth_control.z_enable;\n  if (edram_rov_used && depth_stencil_enabled) {\n    for (uint32_t i = 0; i < 4; ++i) {\n      if (rb_depth_info.depth_base == color_infos[i].color_base &&\n          (rt_keep_masks[i][0] != UINT32_MAX ||\n           rt_keep_masks[i][1] != UINT32_MAX)) {\n        depth_stencil_enabled = false;\n        break;\n      }\n    }\n  }\n\n  bool dirty = false;\n\n  // Flags.\n  uint32_t flags = 0;\n  // Whether shared memory is an SRV or a UAV. Because a resource can't be in a\n  // read-write (UAV) and a read-only (SRV, IBV) state at once, if any shader in\n  // the pipeline uses memexport, the shared memory buffer must be a UAV.\n  if (shared_memory_is_uav) {\n    flags |= DxbcShaderTranslator::kSysFlag_SharedMemoryIsUAV;\n  }\n  // W0 division control.\n  // http://www.x.org/docs/AMD/old/evergreen_3D_registers_v2.pdf\n  // 8: VTX_XY_FMT = true: the incoming XY have already been multiplied by 1/W0.\n  //               = false: multiply the X, Y coordinates by 1/W0.\n  // 9: VTX_Z_FMT = true: the incoming Z has already been multiplied by 1/W0.\n  //              = false: multiply the Z coordinate by 1/W0.\n  // 10: VTX_W0_FMT = true: the incoming W0 is not 1/W0. Perform the reciprocal\n  //                        to get 1/W0.\n  if (pa_cl_vte_cntl.vtx_xy_fmt) {\n    flags |= DxbcShaderTranslator::kSysFlag_XYDividedByW;\n  }\n  if (pa_cl_vte_cntl.vtx_z_fmt) {\n    flags |= DxbcShaderTranslator::kSysFlag_ZDividedByW;\n  }\n  if (pa_cl_vte_cntl.vtx_w0_fmt) {\n    flags |= DxbcShaderTranslator::kSysFlag_WNotReciprocal;\n  }\n  // Whether the primitive is polygonal and SV_IsFrontFace matters.\n  if (primitive_polygonal) {\n    flags |= DxbcShaderTranslator::kSysFlag_PrimitivePolygonal;\n  }\n  // Primitive type.\n  if (draw_util::IsPrimitiveLine(regs)) {\n    flags |= DxbcShaderTranslator::kSysFlag_PrimitiveLine;\n  }\n  // Depth format.\n  if (rb_depth_info.depth_format == xenos::DepthRenderTargetFormat::kD24FS8) {\n    flags |= DxbcShaderTranslator::kSysFlag_DepthFloat24;\n  }\n  // Alpha test.\n  xenos::CompareFunction alpha_test_function =\n      rb_colorcontrol.alpha_test_enable ? rb_colorcontrol.alpha_func\n                                        : xenos::CompareFunction::kAlways;\n  flags |= uint32_t(alpha_test_function)\n           << DxbcShaderTranslator::kSysFlag_AlphaPassIfLess_Shift;\n  // Gamma writing.\n  if (!(edram_rov_used ||\n        render_target_cache_->gamma_render_target_as_unorm16())) {\n    for (uint32_t i = 0; i < 4; ++i) {\n      if (color_infos[i].color_format ==\n          xenos::ColorRenderTargetFormat::k_8_8_8_8_GAMMA) {\n        flags |= DxbcShaderTranslator::kSysFlag_ConvertColor0ToGamma << i;\n      }\n    }\n  }\n  if (edram_rov_used && depth_stencil_enabled) {\n    flags |= DxbcShaderTranslator::kSysFlag_ROVDepthStencil;\n    if (normalized_depth_control.z_enable) {\n      flags |= uint32_t(normalized_depth_control.zfunc)\n               << DxbcShaderTranslator::kSysFlag_ROVDepthPassIfLess_Shift;\n      if (normalized_depth_control.z_write_enable) {\n        flags |= DxbcShaderTranslator::kSysFlag_ROVDepthWrite;\n      }\n    } else {\n      // In case stencil is used without depth testing - always pass, and\n      // don't modify the stored depth.\n      flags |= DxbcShaderTranslator::kSysFlag_ROVDepthPassIfLess |\n               DxbcShaderTranslator::kSysFlag_ROVDepthPassIfEqual |\n               DxbcShaderTranslator::kSysFlag_ROVDepthPassIfGreater;\n    }\n    if (normalized_depth_control.stencil_enable) {\n      flags |= DxbcShaderTranslator::kSysFlag_ROVStencilTest;\n    }\n    // Hint - if not applicable to the shader, will not have effect.\n    if (alpha_test_function == xenos::CompareFunction::kAlways &&\n        !rb_colorcontrol.alpha_to_mask_enable) {\n      flags |= DxbcShaderTranslator::kSysFlag_ROVDepthStencilEarlyWrite;\n    }\n  }\n  dirty |= system_constants_.flags != flags;\n  system_constants_.flags = flags;\n\n  // Tessellation factor range, plus 1.0 according to the images in\n  // https://www.slideshare.net/blackdevilvikas/next-generation-graphics-programming-on-xbox-360\n  float tessellation_factor_min =\n      regs.Get<float>(XE_GPU_REG_VGT_HOS_MIN_TESS_LEVEL) + 1.0f;\n  float tessellation_factor_max =\n      regs.Get<float>(XE_GPU_REG_VGT_HOS_MAX_TESS_LEVEL) + 1.0f;\n  dirty |= system_constants_.tessellation_factor_range_min !=\n           tessellation_factor_min;\n  system_constants_.tessellation_factor_range_min = tessellation_factor_min;\n  dirty |= system_constants_.tessellation_factor_range_max !=\n           tessellation_factor_max;\n  system_constants_.tessellation_factor_range_max = tessellation_factor_max;\n\n  // Line loop closing index (or 0 when drawing other primitives or using an\n  // index buffer).\n  dirty |= system_constants_.line_loop_closing_index != line_loop_closing_index;\n  system_constants_.line_loop_closing_index = line_loop_closing_index;\n\n  // Index or tessellation edge factor buffer endianness.\n  dirty |= system_constants_.vertex_index_endian != index_endian;\n  system_constants_.vertex_index_endian = index_endian;\n\n  // Vertex index offset.\n  dirty |= system_constants_.vertex_index_offset != vgt_indx_offset;\n  system_constants_.vertex_index_offset = vgt_indx_offset;\n\n  // Vertex index range.\n  dirty |= system_constants_.vertex_index_min != vgt_min_vtx_indx;\n  dirty |= system_constants_.vertex_index_max != vgt_max_vtx_indx;\n  system_constants_.vertex_index_min = vgt_min_vtx_indx;\n  system_constants_.vertex_index_max = vgt_max_vtx_indx;\n\n  // User clip planes (UCP_ENA_#), when not CLIP_DISABLE.\n  // The shader knows only the total count - tightly packing the user clip\n  // planes that are actually used.\n  if (!pa_cl_clip_cntl.clip_disable) {\n    float* user_clip_plane_write_ptr = system_constants_.user_clip_planes[0];\n    uint32_t user_clip_planes_remaining = pa_cl_clip_cntl.ucp_ena;\n    uint32_t user_clip_plane_index;\n    while (xe::bit_scan_forward(user_clip_planes_remaining,\n                                &user_clip_plane_index)) {\n      user_clip_planes_remaining &= ~(UINT32_C(1) << user_clip_plane_index);\n      const void* user_clip_plane_regs =\n          &regs[XE_GPU_REG_PA_CL_UCP_0_X + user_clip_plane_index * 4];\n      if (std::memcmp(user_clip_plane_write_ptr, user_clip_plane_regs,\n                      4 * sizeof(float))) {\n        dirty = true;\n        std::memcpy(user_clip_plane_write_ptr, user_clip_plane_regs,\n                    4 * sizeof(float));\n      }\n      user_clip_plane_write_ptr += 4;\n    }\n  }\n\n  // Conversion to Direct3D 12 normalized device coordinates.\n  for (uint32_t i = 0; i < 3; ++i) {\n    dirty |= system_constants_.ndc_scale[i] != viewport_info.ndc_scale[i];\n    dirty |= system_constants_.ndc_offset[i] != viewport_info.ndc_offset[i];\n    system_constants_.ndc_scale[i] = viewport_info.ndc_scale[i];\n    system_constants_.ndc_offset[i] = viewport_info.ndc_offset[i];\n  }\n\n  // Point size.\n  if (vgt_draw_initiator.prim_type == xenos::PrimitiveType::kPointList) {\n    auto pa_su_point_minmax = regs.Get<reg::PA_SU_POINT_MINMAX>();\n    auto pa_su_point_size = regs.Get<reg::PA_SU_POINT_SIZE>();\n    float point_vertex_diameter_min =\n        float(pa_su_point_minmax.min_size) * (2.0f / 16.0f);\n    float point_vertex_diameter_max =\n        float(pa_su_point_minmax.max_size) * (2.0f / 16.0f);\n    float point_constant_diameter_x =\n        float(pa_su_point_size.width) * (2.0f / 16.0f);\n    float point_constant_diameter_y =\n        float(pa_su_point_size.height) * (2.0f / 16.0f);\n    dirty |= system_constants_.point_vertex_diameter_min !=\n             point_vertex_diameter_min;\n    dirty |= system_constants_.point_vertex_diameter_max !=\n             point_vertex_diameter_max;\n    dirty |= system_constants_.point_constant_diameter[0] !=\n             point_constant_diameter_x;\n    dirty |= system_constants_.point_constant_diameter[1] !=\n             point_constant_diameter_y;\n    system_constants_.point_vertex_diameter_min = point_vertex_diameter_min;\n    system_constants_.point_vertex_diameter_max = point_vertex_diameter_max;\n    system_constants_.point_constant_diameter[0] = point_constant_diameter_x;\n    system_constants_.point_constant_diameter[1] = point_constant_diameter_y;\n    // 2 because 1 in the NDC is half of the viewport's axis, 0.5 for diameter\n    // to radius conversion to avoid multiplying the per-vertex diameter by an\n    // additional constant in the shader.\n    float point_screen_diameter_to_ndc_radius_x =\n        (/* 0.5f * 2.0f * */ float(draw_resolution_scale_x)) /\n        std::max(viewport_info.xy_extent[0], uint32_t(1));\n    float point_screen_diameter_to_ndc_radius_y =\n        (/* 0.5f * 2.0f * */ float(draw_resolution_scale_y)) /\n        std::max(viewport_info.xy_extent[1], uint32_t(1));\n    dirty |= system_constants_.point_screen_diameter_to_ndc_radius[0] !=\n             point_screen_diameter_to_ndc_radius_x;\n    dirty |= system_constants_.point_screen_diameter_to_ndc_radius[1] !=\n             point_screen_diameter_to_ndc_radius_y;\n    system_constants_.point_screen_diameter_to_ndc_radius[0] =\n        point_screen_diameter_to_ndc_radius_x;\n    system_constants_.point_screen_diameter_to_ndc_radius[1] =\n        point_screen_diameter_to_ndc_radius_y;\n  }\n\n  // Texture signedness / gamma.\n  uint32_t textures_resolution_scaled = 0;\n  uint32_t textures_remaining = used_texture_mask;\n  uint32_t texture_index;\n  while (xe::bit_scan_forward(textures_remaining, &texture_index)) {\n    textures_remaining &= ~(uint32_t(1) << texture_index);\n    uint32_t& texture_signs_uint =\n        system_constants_.texture_swizzled_signs[texture_index >> 2];\n    uint32_t texture_signs_shift = (texture_index & 3) * 8;\n    uint8_t texture_signs =\n        texture_cache_->GetActiveTextureSwizzledSigns(texture_index);\n    uint32_t texture_signs_shifted = uint32_t(texture_signs)\n                                     << texture_signs_shift;\n    uint32_t texture_signs_mask = uint32_t(0b11111111) << texture_signs_shift;\n    dirty |= (texture_signs_uint & texture_signs_mask) != texture_signs_shifted;\n    texture_signs_uint =\n        (texture_signs_uint & ~texture_signs_mask) | texture_signs_shifted;\n    textures_resolution_scaled |=\n        uint32_t(texture_cache_->IsActiveTextureResolutionScaled(texture_index))\n        << texture_index;\n  }\n  dirty |= system_constants_.textures_resolution_scaled !=\n           textures_resolution_scaled;\n  system_constants_.textures_resolution_scaled = textures_resolution_scaled;\n\n  // Log2 of sample count, for alpha to mask and with ROV, for EDRAM address\n  // calculation with MSAA.\n  uint32_t sample_count_log2_x =\n      rb_surface_info.msaa_samples >= xenos::MsaaSamples::k4X ? 1 : 0;\n  uint32_t sample_count_log2_y =\n      rb_surface_info.msaa_samples >= xenos::MsaaSamples::k2X ? 1 : 0;\n  dirty |= system_constants_.sample_count_log2[0] != sample_count_log2_x;\n  dirty |= system_constants_.sample_count_log2[1] != sample_count_log2_y;\n  system_constants_.sample_count_log2[0] = sample_count_log2_x;\n  system_constants_.sample_count_log2[1] = sample_count_log2_y;\n\n  // Alpha test and alpha to coverage.\n  dirty |= system_constants_.alpha_test_reference != rb_alpha_ref;\n  system_constants_.alpha_test_reference = rb_alpha_ref;\n  uint32_t alpha_to_mask = rb_colorcontrol.alpha_to_mask_enable\n                               ? (rb_colorcontrol.value >> 24) | (1 << 8)\n                               : 0;\n  dirty |= system_constants_.alpha_to_mask != alpha_to_mask;\n  system_constants_.alpha_to_mask = alpha_to_mask;\n\n  uint32_t edram_tile_dwords_scaled =\n      xenos::kEdramTileWidthSamples * xenos::kEdramTileHeightSamples *\n      (draw_resolution_scale_x * draw_resolution_scale_y);\n\n  // EDRAM pitch for ROV writing.\n  if (edram_rov_used) {\n    // Align, then multiply by 32bpp tile size in dwords.\n    uint32_t edram_32bpp_tile_pitch_dwords_scaled =\n        ((rb_surface_info.surface_pitch *\n          (rb_surface_info.msaa_samples >= xenos::MsaaSamples::k4X ? 2 : 1)) +\n         (xenos::kEdramTileWidthSamples - 1)) /\n        xenos::kEdramTileWidthSamples * edram_tile_dwords_scaled;\n    dirty |= system_constants_.edram_32bpp_tile_pitch_dwords_scaled !=\n             edram_32bpp_tile_pitch_dwords_scaled;\n    system_constants_.edram_32bpp_tile_pitch_dwords_scaled =\n        edram_32bpp_tile_pitch_dwords_scaled;\n  }\n\n  // Color exponent bias and ROV render target writing.\n  for (uint32_t i = 0; i < 4; ++i) {\n    reg::RB_COLOR_INFO color_info = color_infos[i];\n    // Exponent bias is in bits 20:25 of RB_COLOR_INFO.\n    int32_t color_exp_bias = color_info.color_exp_bias;\n    if (color_info.color_format == xenos::ColorRenderTargetFormat::k_16_16 ||\n        color_info.color_format ==\n            xenos::ColorRenderTargetFormat::k_16_16_16_16) {\n      if (render_target_cache_->GetPath() ==\n              RenderTargetCache::Path::kHostRenderTargets &&\n          !render_target_cache_->IsFixed16TruncatedToMinus1To1()) {\n        // Remap from -32...32 to -1...1 by dividing the output values by 32,\n        // losing blending correctness, but getting the full range.\n        color_exp_bias -= 5;\n      }\n    }\n    auto color_exp_bias_scale = xe::memory::Reinterpret<float>(\n        int32_t(0x3F800000 + (color_exp_bias << 23)));\n    dirty |= system_constants_.color_exp_bias[i] != color_exp_bias_scale;\n    system_constants_.color_exp_bias[i] = color_exp_bias_scale;\n    if (edram_rov_used) {\n      dirty |=\n          system_constants_.edram_rt_keep_mask[i][0] != rt_keep_masks[i][0];\n      system_constants_.edram_rt_keep_mask[i][0] = rt_keep_masks[i][0];\n      dirty |=\n          system_constants_.edram_rt_keep_mask[i][1] != rt_keep_masks[i][1];\n      system_constants_.edram_rt_keep_mask[i][1] = rt_keep_masks[i][1];\n      if (rt_keep_masks[i][0] != UINT32_MAX ||\n          rt_keep_masks[i][1] != UINT32_MAX) {\n        uint32_t rt_base_dwords_scaled =\n            color_info.color_base * edram_tile_dwords_scaled;\n        dirty |= system_constants_.edram_rt_base_dwords_scaled[i] !=\n                 rt_base_dwords_scaled;\n        system_constants_.edram_rt_base_dwords_scaled[i] =\n            rt_base_dwords_scaled;\n        uint32_t format_flags =\n            RenderTargetCache::AddPSIColorFormatFlags(color_info.color_format);\n        dirty |= system_constants_.edram_rt_format_flags[i] != format_flags;\n        system_constants_.edram_rt_format_flags[i] = format_flags;\n        // Can't do float comparisons here because NaNs would result in always\n        // setting the dirty flag.\n        dirty |= std::memcmp(system_constants_.edram_rt_clamp[i], rt_clamp[i],\n                             4 * sizeof(float)) != 0;\n        std::memcpy(system_constants_.edram_rt_clamp[i], rt_clamp[i],\n                    4 * sizeof(float));\n        uint32_t blend_factors_ops =\n            regs[reg::RB_BLENDCONTROL::rt_register_indices[i]] & 0x1FFF1FFF;\n        dirty |= system_constants_.edram_rt_blend_factors_ops[i] !=\n                 blend_factors_ops;\n        system_constants_.edram_rt_blend_factors_ops[i] = blend_factors_ops;\n      }\n    }\n  }\n\n  if (edram_rov_used) {\n    uint32_t depth_base_dwords_scaled =\n        rb_depth_info.depth_base * edram_tile_dwords_scaled;\n    dirty |= system_constants_.edram_depth_base_dwords_scaled !=\n             depth_base_dwords_scaled;\n    system_constants_.edram_depth_base_dwords_scaled = depth_base_dwords_scaled;\n\n    // For non-polygons, front polygon offset is used, and it's enabled if\n    // POLY_OFFSET_PARA_ENABLED is set, for polygons, separate front and back\n    // are used.\n    float poly_offset_front_scale = 0.0f, poly_offset_front_offset = 0.0f;\n    float poly_offset_back_scale = 0.0f, poly_offset_back_offset = 0.0f;\n    if (primitive_polygonal) {\n      if (pa_su_sc_mode_cntl.poly_offset_front_enable) {\n        poly_offset_front_scale =\n            regs.Get<float>(XE_GPU_REG_PA_SU_POLY_OFFSET_FRONT_SCALE);\n        poly_offset_front_offset =\n            regs.Get<float>(XE_GPU_REG_PA_SU_POLY_OFFSET_FRONT_OFFSET);\n      }\n      if (pa_su_sc_mode_cntl.poly_offset_back_enable) {\n        poly_offset_back_scale =\n            regs.Get<float>(XE_GPU_REG_PA_SU_POLY_OFFSET_BACK_SCALE);\n        poly_offset_back_offset =\n            regs.Get<float>(XE_GPU_REG_PA_SU_POLY_OFFSET_BACK_OFFSET);\n      }\n    } else {\n      if (pa_su_sc_mode_cntl.poly_offset_para_enable) {\n        poly_offset_front_scale =\n            regs.Get<float>(XE_GPU_REG_PA_SU_POLY_OFFSET_FRONT_SCALE);\n        poly_offset_front_offset =\n            regs.Get<float>(XE_GPU_REG_PA_SU_POLY_OFFSET_FRONT_OFFSET);\n        poly_offset_back_scale = poly_offset_front_scale;\n        poly_offset_back_offset = poly_offset_front_offset;\n      }\n    }\n    // With non-square resolution scaling, make sure the worst-case impact is\n    // reverted (slope only along the scaled axis), thus max. More bias is\n    // better than less bias, because less bias means Z fighting with the\n    // background is more likely.\n    float poly_offset_scale_factor =\n        xenos::kPolygonOffsetScaleSubpixelUnit *\n        std::max(draw_resolution_scale_x, draw_resolution_scale_y);\n    poly_offset_front_scale *= poly_offset_scale_factor;\n    poly_offset_back_scale *= poly_offset_scale_factor;\n    dirty |= system_constants_.edram_poly_offset_front_scale !=\n             poly_offset_front_scale;\n    system_constants_.edram_poly_offset_front_scale = poly_offset_front_scale;\n    dirty |= system_constants_.edram_poly_offset_front_offset !=\n             poly_offset_front_offset;\n    system_constants_.edram_poly_offset_front_offset = poly_offset_front_offset;\n    dirty |= system_constants_.edram_poly_offset_back_scale !=\n             poly_offset_back_scale;\n    system_constants_.edram_poly_offset_back_scale = poly_offset_back_scale;\n    dirty |= system_constants_.edram_poly_offset_back_offset !=\n             poly_offset_back_offset;\n    system_constants_.edram_poly_offset_back_offset = poly_offset_back_offset;\n\n    if (depth_stencil_enabled && normalized_depth_control.stencil_enable) {\n      dirty |= system_constants_.edram_stencil_front_reference !=\n               rb_stencilrefmask.stencilref;\n      system_constants_.edram_stencil_front_reference =\n          rb_stencilrefmask.stencilref;\n      dirty |= system_constants_.edram_stencil_front_read_mask !=\n               rb_stencilrefmask.stencilmask;\n      system_constants_.edram_stencil_front_read_mask =\n          rb_stencilrefmask.stencilmask;\n      dirty |= system_constants_.edram_stencil_front_write_mask !=\n               rb_stencilrefmask.stencilwritemask;\n      system_constants_.edram_stencil_front_write_mask =\n          rb_stencilrefmask.stencilwritemask;\n      uint32_t stencil_func_ops =\n          (normalized_depth_control.value >> 8) & ((1 << 12) - 1);\n      dirty |=\n          system_constants_.edram_stencil_front_func_ops != stencil_func_ops;\n      system_constants_.edram_stencil_front_func_ops = stencil_func_ops;\n\n      if (primitive_polygonal && normalized_depth_control.backface_enable) {\n        dirty |= system_constants_.edram_stencil_back_reference !=\n                 rb_stencilrefmask_bf.stencilref;\n        system_constants_.edram_stencil_back_reference =\n            rb_stencilrefmask_bf.stencilref;\n        dirty |= system_constants_.edram_stencil_back_read_mask !=\n                 rb_stencilrefmask_bf.stencilmask;\n        system_constants_.edram_stencil_back_read_mask =\n            rb_stencilrefmask_bf.stencilmask;\n        dirty |= system_constants_.edram_stencil_back_write_mask !=\n                 rb_stencilrefmask_bf.stencilwritemask;\n        system_constants_.edram_stencil_back_write_mask =\n            rb_stencilrefmask_bf.stencilwritemask;\n        uint32_t stencil_func_ops_bf =\n            (normalized_depth_control.value >> 20) & ((1 << 12) - 1);\n        dirty |= system_constants_.edram_stencil_back_func_ops !=\n                 stencil_func_ops_bf;\n        system_constants_.edram_stencil_back_func_ops = stencil_func_ops_bf;\n      } else {\n        dirty |= std::memcmp(system_constants_.edram_stencil_back,\n                             system_constants_.edram_stencil_front,\n                             4 * sizeof(uint32_t)) != 0;\n        std::memcpy(system_constants_.edram_stencil_back,\n                    system_constants_.edram_stencil_front,\n                    4 * sizeof(uint32_t));\n      }\n    }\n\n    dirty |= system_constants_.edram_blend_constant[0] !=\n             regs.Get<float>(XE_GPU_REG_RB_BLEND_RED);\n    system_constants_.edram_blend_constant[0] =\n        regs.Get<float>(XE_GPU_REG_RB_BLEND_RED);\n    dirty |= system_constants_.edram_blend_constant[1] !=\n             regs.Get<float>(XE_GPU_REG_RB_BLEND_GREEN);\n    system_constants_.edram_blend_constant[1] =\n        regs.Get<float>(XE_GPU_REG_RB_BLEND_GREEN);\n    dirty |= system_constants_.edram_blend_constant[2] !=\n             regs.Get<float>(XE_GPU_REG_RB_BLEND_BLUE);\n    system_constants_.edram_blend_constant[2] =\n        regs.Get<float>(XE_GPU_REG_RB_BLEND_BLUE);\n    dirty |= system_constants_.edram_blend_constant[3] !=\n             regs.Get<float>(XE_GPU_REG_RB_BLEND_ALPHA);\n    system_constants_.edram_blend_constant[3] =\n        regs.Get<float>(XE_GPU_REG_RB_BLEND_ALPHA);\n  }\n\n  cbuffer_binding_system_.up_to_date &= !dirty;\n}\n\nbool D3D12CommandProcessor::UpdateBindings(const D3D12Shader* vertex_shader,\n                                           const D3D12Shader* pixel_shader,\n                                           ID3D12RootSignature* root_signature,\n                                           bool shared_memory_is_uav) {\n  const ui::d3d12::D3D12Provider& provider = GetD3D12Provider();\n  ID3D12Device* device = provider.GetDevice();\n  const RegisterFile& regs = *register_file_;\n\n#if XE_GPU_FINE_GRAINED_DRAW_SCOPES\n  SCOPE_profile_cpu_f(\"gpu\");\n#endif  // XE_GPU_FINE_GRAINED_DRAW_SCOPES\n\n  // Set the new root signature.\n  if (current_graphics_root_signature_ != root_signature) {\n    current_graphics_root_signature_ = root_signature;\n    if (!bindless_resources_used_) {\n      GetRootBindfulExtraParameterIndices(\n          vertex_shader, pixel_shader, current_graphics_root_bindful_extras_);\n    }\n    // Changing the root signature invalidates all bindings.\n    current_graphics_root_up_to_date_ = 0;\n    deferred_command_list_.D3DSetGraphicsRootSignature(root_signature);\n  }\n\n  // Select the root parameter indices depending on the used binding model.\n  uint32_t root_parameter_fetch_constants =\n      bindless_resources_used_ ? kRootParameter_Bindless_FetchConstants\n                               : kRootParameter_Bindful_FetchConstants;\n  uint32_t root_parameter_float_constants_vertex =\n      bindless_resources_used_ ? kRootParameter_Bindless_FloatConstantsVertex\n                               : kRootParameter_Bindful_FloatConstantsVertex;\n  uint32_t root_parameter_float_constants_pixel =\n      bindless_resources_used_ ? kRootParameter_Bindless_FloatConstantsPixel\n                               : kRootParameter_Bindful_FloatConstantsPixel;\n  uint32_t root_parameter_system_constants =\n      bindless_resources_used_ ? kRootParameter_Bindless_SystemConstants\n                               : kRootParameter_Bindful_SystemConstants;\n  uint32_t root_parameter_bool_loop_constants =\n      bindless_resources_used_ ? kRootParameter_Bindless_BoolLoopConstants\n                               : kRootParameter_Bindful_BoolLoopConstants;\n  uint32_t root_parameter_shared_memory_and_bindful_edram =\n      bindless_resources_used_ ? kRootParameter_Bindless_SharedMemory\n                               : kRootParameter_Bindful_SharedMemoryAndEdram;\n\n  //\n  // Update root constant buffers that are common for bindful and bindless.\n  //\n\n  // These are the constant base addresses/ranges for shaders.\n  // We have these hardcoded right now cause nothing seems to differ on the Xbox\n  // 360 (however, OpenGL ES on Adreno 200 on Android has different ranges).\n  assert_true(regs[XE_GPU_REG_SQ_VS_CONST] == 0x000FF000 ||\n              regs[XE_GPU_REG_SQ_VS_CONST] == 0x00000000);\n  assert_true(regs[XE_GPU_REG_SQ_PS_CONST] == 0x000FF100 ||\n              regs[XE_GPU_REG_SQ_PS_CONST] == 0x00000000);\n  // Check if the float constant layout is still the same and get the counts.\n  const Shader::ConstantRegisterMap& float_constant_map_vertex =\n      vertex_shader->constant_register_map();\n  uint32_t float_constant_count_vertex = float_constant_map_vertex.float_count;\n  for (uint32_t i = 0; i < 4; ++i) {\n    if (current_float_constant_map_vertex_[i] !=\n        float_constant_map_vertex.float_bitmap[i]) {\n      current_float_constant_map_vertex_[i] =\n          float_constant_map_vertex.float_bitmap[i];\n      // If no float constants at all, we can reuse any buffer for them, so not\n      // invalidating.\n      if (float_constant_count_vertex) {\n        cbuffer_binding_float_vertex_.up_to_date = false;\n      }\n    }\n  }\n  uint32_t float_constant_count_pixel = 0;\n  if (pixel_shader != nullptr) {\n    const Shader::ConstantRegisterMap& float_constant_map_pixel =\n        pixel_shader->constant_register_map();\n    float_constant_count_pixel = float_constant_map_pixel.float_count;\n    for (uint32_t i = 0; i < 4; ++i) {\n      if (current_float_constant_map_pixel_[i] !=\n          float_constant_map_pixel.float_bitmap[i]) {\n        current_float_constant_map_pixel_[i] =\n            float_constant_map_pixel.float_bitmap[i];\n        if (float_constant_count_pixel) {\n          cbuffer_binding_float_pixel_.up_to_date = false;\n        }\n      }\n    }\n  } else {\n    std::memset(current_float_constant_map_pixel_, 0,\n                sizeof(current_float_constant_map_pixel_));\n  }\n\n  // Write the constant buffer data.\n  if (!cbuffer_binding_system_.up_to_date) {\n    uint8_t* system_constants = constant_buffer_pool_->Request(\n        frame_current_, sizeof(system_constants_),\n        D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT, nullptr, nullptr,\n        &cbuffer_binding_system_.address);\n    if (system_constants == nullptr) {\n      return false;\n    }\n    std::memcpy(system_constants, &system_constants_,\n                sizeof(system_constants_));\n    cbuffer_binding_system_.up_to_date = true;\n    current_graphics_root_up_to_date_ &=\n        ~(1u << root_parameter_system_constants);\n  }\n  if (!cbuffer_binding_float_vertex_.up_to_date) {\n    // Even if the shader doesn't need any float constants, a valid binding must\n    // still be provided, so if the first draw in the frame with the current\n    // root signature doesn't have float constants at all, still allocate an\n    // empty buffer.\n    uint8_t* float_constants = constant_buffer_pool_->Request(\n        frame_current_,\n        sizeof(float) * 4 * std::max(float_constant_count_vertex, uint32_t(1)),\n        D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT, nullptr, nullptr,\n        &cbuffer_binding_float_vertex_.address);\n    if (float_constants == nullptr) {\n      return false;\n    }\n    for (uint32_t i = 0; i < 4; ++i) {\n      uint64_t float_constant_map_entry =\n          float_constant_map_vertex.float_bitmap[i];\n      uint32_t float_constant_index;\n      while (xe::bit_scan_forward(float_constant_map_entry,\n                                  &float_constant_index)) {\n        float_constant_map_entry &= ~(1ull << float_constant_index);\n        std::memcpy(float_constants,\n                    &regs[XE_GPU_REG_SHADER_CONSTANT_000_X + (i << 8) +\n                          (float_constant_index << 2)],\n                    4 * sizeof(float));\n        float_constants += 4 * sizeof(float);\n      }\n    }\n    cbuffer_binding_float_vertex_.up_to_date = true;\n    current_graphics_root_up_to_date_ &=\n        ~(1u << root_parameter_float_constants_vertex);\n  }\n  if (!cbuffer_binding_float_pixel_.up_to_date) {\n    uint8_t* float_constants = constant_buffer_pool_->Request(\n        frame_current_,\n        sizeof(float) * 4 * std::max(float_constant_count_pixel, uint32_t(1)),\n        D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT, nullptr, nullptr,\n        &cbuffer_binding_float_pixel_.address);\n    if (float_constants == nullptr) {\n      return false;\n    }\n    if (pixel_shader != nullptr) {\n      const Shader::ConstantRegisterMap& float_constant_map_pixel =\n          pixel_shader->constant_register_map();\n      for (uint32_t i = 0; i < 4; ++i) {\n        uint64_t float_constant_map_entry =\n            float_constant_map_pixel.float_bitmap[i];\n        uint32_t float_constant_index;\n        while (xe::bit_scan_forward(float_constant_map_entry,\n                                    &float_constant_index)) {\n          float_constant_map_entry &= ~(1ull << float_constant_index);\n          std::memcpy(float_constants,\n                      &regs[XE_GPU_REG_SHADER_CONSTANT_256_X + (i << 8) +\n                            (float_constant_index << 2)],\n                      4 * sizeof(float));\n          float_constants += 4 * sizeof(float);\n        }\n      }\n    }\n    cbuffer_binding_float_pixel_.up_to_date = true;\n    current_graphics_root_up_to_date_ &=\n        ~(1u << root_parameter_float_constants_pixel);\n  }\n  if (!cbuffer_binding_bool_loop_.up_to_date) {\n    constexpr uint32_t kBoolLoopConstantsSize = (8 + 32) * sizeof(uint32_t);\n    uint8_t* bool_loop_constants = constant_buffer_pool_->Request(\n        frame_current_, kBoolLoopConstantsSize,\n        D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT, nullptr, nullptr,\n        &cbuffer_binding_bool_loop_.address);\n    if (bool_loop_constants == nullptr) {\n      return false;\n    }\n    std::memcpy(bool_loop_constants,\n                &regs[XE_GPU_REG_SHADER_CONSTANT_BOOL_000_031],\n                kBoolLoopConstantsSize);\n    cbuffer_binding_bool_loop_.up_to_date = true;\n    current_graphics_root_up_to_date_ &=\n        ~(1u << root_parameter_bool_loop_constants);\n  }\n  if (!cbuffer_binding_fetch_.up_to_date) {\n    constexpr uint32_t kFetchConstantsSize = 32 * 6 * sizeof(uint32_t);\n    uint8_t* fetch_constants = constant_buffer_pool_->Request(\n        frame_current_, kFetchConstantsSize,\n        D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT, nullptr, nullptr,\n        &cbuffer_binding_fetch_.address);\n    if (fetch_constants == nullptr) {\n      return false;\n    }\n    std::memcpy(fetch_constants, &regs[XE_GPU_REG_SHADER_CONSTANT_FETCH_00_0],\n                kFetchConstantsSize);\n    cbuffer_binding_fetch_.up_to_date = true;\n    current_graphics_root_up_to_date_ &=\n        ~(1u << root_parameter_fetch_constants);\n  }\n\n  //\n  // Update descriptors.\n  //\n\n  if (!current_shared_memory_binding_is_uav_.has_value() ||\n      current_shared_memory_binding_is_uav_.value() != shared_memory_is_uav) {\n    current_shared_memory_binding_is_uav_ = shared_memory_is_uav;\n    current_graphics_root_up_to_date_ &=\n        ~(1u << root_parameter_shared_memory_and_bindful_edram);\n  }\n\n  // Get textures and samplers used by the vertex shader, check if the last used\n  // samplers are compatible and update them.\n  size_t texture_layout_uid_vertex =\n      vertex_shader->GetTextureBindingLayoutUserUID();\n  size_t sampler_layout_uid_vertex =\n      vertex_shader->GetSamplerBindingLayoutUserUID();\n  const std::vector<D3D12Shader::TextureBinding>& textures_vertex =\n      vertex_shader->GetTextureBindingsAfterTranslation();\n  const std::vector<D3D12Shader::SamplerBinding>& samplers_vertex =\n      vertex_shader->GetSamplerBindingsAfterTranslation();\n  size_t texture_count_vertex = textures_vertex.size();\n  size_t sampler_count_vertex = samplers_vertex.size();\n  if (sampler_count_vertex) {\n    if (current_sampler_layout_uid_vertex_ != sampler_layout_uid_vertex) {\n      current_sampler_layout_uid_vertex_ = sampler_layout_uid_vertex;\n      cbuffer_binding_descriptor_indices_vertex_.up_to_date = false;\n      bindful_samplers_written_vertex_ = false;\n    }\n    current_samplers_vertex_.resize(\n        std::max(current_samplers_vertex_.size(), sampler_count_vertex));\n    for (size_t i = 0; i < sampler_count_vertex; ++i) {\n      D3D12TextureCache::SamplerParameters parameters =\n          texture_cache_->GetSamplerParameters(samplers_vertex[i]);\n      if (current_samplers_vertex_[i] != parameters) {\n        cbuffer_binding_descriptor_indices_vertex_.up_to_date = false;\n        bindful_samplers_written_vertex_ = false;\n        current_samplers_vertex_[i] = parameters;\n      }\n    }\n  }\n\n  // Get textures and samplers used by the pixel shader, check if the last used\n  // samplers are compatible and update them.\n  size_t texture_layout_uid_pixel, sampler_layout_uid_pixel;\n  const std::vector<D3D12Shader::TextureBinding>* textures_pixel;\n  const std::vector<D3D12Shader::SamplerBinding>* samplers_pixel;\n  size_t texture_count_pixel, sampler_count_pixel;\n  if (pixel_shader != nullptr) {\n    texture_layout_uid_pixel = pixel_shader->GetTextureBindingLayoutUserUID();\n    sampler_layout_uid_pixel = pixel_shader->GetSamplerBindingLayoutUserUID();\n    textures_pixel = &pixel_shader->GetTextureBindingsAfterTranslation();\n    texture_count_pixel = textures_pixel->size();\n    samplers_pixel = &pixel_shader->GetSamplerBindingsAfterTranslation();\n    sampler_count_pixel = samplers_pixel->size();\n    if (sampler_count_pixel) {\n      if (current_sampler_layout_uid_pixel_ != sampler_layout_uid_pixel) {\n        current_sampler_layout_uid_pixel_ = sampler_layout_uid_pixel;\n        cbuffer_binding_descriptor_indices_pixel_.up_to_date = false;\n        bindful_samplers_written_pixel_ = false;\n      }\n      current_samplers_pixel_.resize(std::max(current_samplers_pixel_.size(),\n                                              size_t(sampler_count_pixel)));\n      for (uint32_t i = 0; i < sampler_count_pixel; ++i) {\n        D3D12TextureCache::SamplerParameters parameters =\n            texture_cache_->GetSamplerParameters((*samplers_pixel)[i]);\n        if (current_samplers_pixel_[i] != parameters) {\n          current_samplers_pixel_[i] = parameters;\n          cbuffer_binding_descriptor_indices_pixel_.up_to_date = false;\n          bindful_samplers_written_pixel_ = false;\n        }\n      }\n    }\n  } else {\n    texture_layout_uid_pixel = PipelineCache::kLayoutUIDEmpty;\n    sampler_layout_uid_pixel = PipelineCache::kLayoutUIDEmpty;\n    textures_pixel = nullptr;\n    texture_count_pixel = 0;\n    samplers_pixel = nullptr;\n    sampler_count_pixel = 0;\n  }\n\n  assert_true(sampler_count_vertex + sampler_count_pixel <= kSamplerHeapSize);\n\n  if (bindless_resources_used_) {\n    //\n    // Bindless descriptors path.\n    //\n\n    // Check if need to write new descriptor indices.\n    // Samplers have already been checked.\n    if (texture_count_vertex &&\n        cbuffer_binding_descriptor_indices_vertex_.up_to_date &&\n        (current_texture_layout_uid_vertex_ != texture_layout_uid_vertex ||\n         !texture_cache_->AreActiveTextureSRVKeysUpToDate(\n             current_texture_srv_keys_vertex_.data(), textures_vertex.data(),\n             texture_count_vertex))) {\n      cbuffer_binding_descriptor_indices_vertex_.up_to_date = false;\n    }\n    if (texture_count_pixel &&\n        cbuffer_binding_descriptor_indices_pixel_.up_to_date &&\n        (current_texture_layout_uid_pixel_ != texture_layout_uid_pixel ||\n         !texture_cache_->AreActiveTextureSRVKeysUpToDate(\n             current_texture_srv_keys_pixel_.data(), textures_pixel->data(),\n             texture_count_pixel))) {\n      cbuffer_binding_descriptor_indices_pixel_.up_to_date = false;\n    }\n\n    // Get sampler descriptor indices, write new samplers, and handle sampler\n    // heap overflow if it happens.\n    if ((sampler_count_vertex &&\n         !cbuffer_binding_descriptor_indices_vertex_.up_to_date) ||\n        (sampler_count_pixel &&\n         !cbuffer_binding_descriptor_indices_pixel_.up_to_date)) {\n      for (uint32_t i = 0; i < 2; ++i) {\n        if (i) {\n          // Overflow happened - invalidate sampler bindings because their\n          // descriptor indices can't be used anymore (and even if heap creation\n          // fails, because current_sampler_bindless_indices_#_ are in an\n          // undefined state now) and switch to a new sampler heap.\n          cbuffer_binding_descriptor_indices_vertex_.up_to_date = false;\n          cbuffer_binding_descriptor_indices_pixel_.up_to_date = false;\n          ID3D12DescriptorHeap* sampler_heap_new;\n          if (!sampler_bindless_heaps_overflowed_.empty() &&\n              sampler_bindless_heaps_overflowed_.front().second <=\n                  GetCompletedSubmission()) {\n            sampler_heap_new = sampler_bindless_heaps_overflowed_.front().first;\n            sampler_bindless_heaps_overflowed_.pop_front();\n          } else {\n            D3D12_DESCRIPTOR_HEAP_DESC sampler_heap_new_desc;\n            sampler_heap_new_desc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER;\n            sampler_heap_new_desc.NumDescriptors = kSamplerHeapSize;\n            sampler_heap_new_desc.Flags =\n                D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE;\n            sampler_heap_new_desc.NodeMask = 0;\n            if (FAILED(device->CreateDescriptorHeap(\n                    &sampler_heap_new_desc, IID_PPV_ARGS(&sampler_heap_new)))) {\n              XELOGE(\n                  \"Failed to create a new bindless sampler descriptor heap \"\n                  \"after an overflow of the previous one\");\n              return false;\n            }\n          }\n          // Only change the heap if a new heap was created successfully, not to\n          // leave the values in an undefined state in case CreateDescriptorHeap\n          // has failed.\n          sampler_bindless_heaps_overflowed_.push_back(std::make_pair(\n              sampler_bindless_heap_current_, GetCurrentSubmission()));\n          sampler_bindless_heap_current_ = sampler_heap_new;\n          sampler_bindless_heap_cpu_start_ =\n              sampler_bindless_heap_current_\n                  ->GetCPUDescriptorHandleForHeapStart();\n          sampler_bindless_heap_gpu_start_ =\n              sampler_bindless_heap_current_\n                  ->GetGPUDescriptorHandleForHeapStart();\n          sampler_bindless_heap_allocated_ = 0;\n          // The only thing the heap is used for now is texture cache samplers -\n          // invalidate all of them.\n          texture_cache_bindless_sampler_map_.clear();\n          deferred_command_list_.SetDescriptorHeaps(\n              view_bindless_heap_, sampler_bindless_heap_current_);\n          current_graphics_root_up_to_date_ &=\n              ~(1u << kRootParameter_Bindless_SamplerHeap);\n        }\n        bool samplers_overflowed = false;\n        if (sampler_count_vertex &&\n            !cbuffer_binding_descriptor_indices_vertex_.up_to_date) {\n          current_sampler_bindless_indices_vertex_.resize(\n              std::max(current_sampler_bindless_indices_vertex_.size(),\n                       size_t(sampler_count_vertex)));\n          for (uint32_t j = 0; j < sampler_count_vertex; ++j) {\n            D3D12TextureCache::SamplerParameters sampler_parameters =\n                current_samplers_vertex_[j];\n            uint32_t sampler_index;\n            auto it = texture_cache_bindless_sampler_map_.find(\n                sampler_parameters.value);\n            if (it != texture_cache_bindless_sampler_map_.end()) {\n              sampler_index = it->second;\n            } else {\n              if (sampler_bindless_heap_allocated_ >= kSamplerHeapSize) {\n                samplers_overflowed = true;\n                break;\n              }\n              sampler_index = sampler_bindless_heap_allocated_++;\n              texture_cache_->WriteSampler(\n                  sampler_parameters,\n                  provider.OffsetSamplerDescriptor(\n                      sampler_bindless_heap_cpu_start_, sampler_index));\n              texture_cache_bindless_sampler_map_.emplace(\n                  sampler_parameters.value, sampler_index);\n            }\n            current_sampler_bindless_indices_vertex_[j] = sampler_index;\n          }\n        }\n        if (samplers_overflowed) {\n          continue;\n        }\n        if (sampler_count_pixel &&\n            !cbuffer_binding_descriptor_indices_pixel_.up_to_date) {\n          current_sampler_bindless_indices_pixel_.resize(\n              std::max(current_sampler_bindless_indices_pixel_.size(),\n                       size_t(sampler_count_pixel)));\n          for (uint32_t j = 0; j < sampler_count_pixel; ++j) {\n            D3D12TextureCache::SamplerParameters sampler_parameters =\n                current_samplers_pixel_[j];\n            uint32_t sampler_index;\n            auto it = texture_cache_bindless_sampler_map_.find(\n                sampler_parameters.value);\n            if (it != texture_cache_bindless_sampler_map_.end()) {\n              sampler_index = it->second;\n            } else {\n              if (sampler_bindless_heap_allocated_ >= kSamplerHeapSize) {\n                samplers_overflowed = true;\n                break;\n              }\n              sampler_index = sampler_bindless_heap_allocated_++;\n              texture_cache_->WriteSampler(\n                  sampler_parameters,\n                  provider.OffsetSamplerDescriptor(\n                      sampler_bindless_heap_cpu_start_, sampler_index));\n              texture_cache_bindless_sampler_map_.emplace(\n                  sampler_parameters.value, sampler_index);\n            }\n            current_sampler_bindless_indices_pixel_[j] = sampler_index;\n          }\n        }\n        if (!samplers_overflowed) {\n          break;\n        }\n      }\n    }\n\n    if (!cbuffer_binding_descriptor_indices_vertex_.up_to_date) {\n      uint32_t* descriptor_indices =\n          reinterpret_cast<uint32_t*>(constant_buffer_pool_->Request(\n              frame_current_,\n              std::max(texture_count_vertex + sampler_count_vertex, size_t(1)) *\n                  sizeof(uint32_t),\n              D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT, nullptr, nullptr,\n              &cbuffer_binding_descriptor_indices_vertex_.address));\n      if (!descriptor_indices) {\n        return false;\n      }\n      for (size_t i = 0; i < texture_count_vertex; ++i) {\n        const D3D12Shader::TextureBinding& texture = textures_vertex[i];\n        descriptor_indices[texture.bindless_descriptor_index] =\n            texture_cache_->GetActiveTextureBindlessSRVIndex(texture) -\n            uint32_t(SystemBindlessView::kUnboundedSRVsStart);\n      }\n      current_texture_layout_uid_vertex_ = texture_layout_uid_vertex;\n      if (texture_count_vertex) {\n        current_texture_srv_keys_vertex_.resize(\n            std::max(current_texture_srv_keys_vertex_.size(),\n                     size_t(texture_count_vertex)));\n        texture_cache_->WriteActiveTextureSRVKeys(\n            current_texture_srv_keys_vertex_.data(), textures_vertex.data(),\n            texture_count_vertex);\n      }\n      // Current samplers have already been updated.\n      for (size_t i = 0; i < sampler_count_vertex; ++i) {\n        descriptor_indices[samplers_vertex[i].bindless_descriptor_index] =\n            current_sampler_bindless_indices_vertex_[i];\n      }\n      cbuffer_binding_descriptor_indices_vertex_.up_to_date = true;\n      current_graphics_root_up_to_date_ &=\n          ~(1u << kRootParameter_Bindless_DescriptorIndicesVertex);\n    }\n\n    if (!cbuffer_binding_descriptor_indices_pixel_.up_to_date) {\n      uint32_t* descriptor_indices =\n          reinterpret_cast<uint32_t*>(constant_buffer_pool_->Request(\n              frame_current_,\n              std::max(texture_count_pixel + sampler_count_pixel, size_t(1)) *\n                  sizeof(uint32_t),\n              D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT, nullptr, nullptr,\n              &cbuffer_binding_descriptor_indices_pixel_.address));\n      if (!descriptor_indices) {\n        return false;\n      }\n      for (size_t i = 0; i < texture_count_pixel; ++i) {\n        const D3D12Shader::TextureBinding& texture = (*textures_pixel)[i];\n        descriptor_indices[texture.bindless_descriptor_index] =\n            texture_cache_->GetActiveTextureBindlessSRVIndex(texture) -\n            uint32_t(SystemBindlessView::kUnboundedSRVsStart);\n      }\n      current_texture_layout_uid_pixel_ = texture_layout_uid_pixel;\n      if (texture_count_pixel) {\n        current_texture_srv_keys_pixel_.resize(\n            std::max(current_texture_srv_keys_pixel_.size(),\n                     size_t(texture_count_pixel)));\n        texture_cache_->WriteActiveTextureSRVKeys(\n            current_texture_srv_keys_pixel_.data(), textures_pixel->data(),\n            texture_count_pixel);\n      }\n      // Current samplers have already been updated.\n      for (size_t i = 0; i < sampler_count_pixel; ++i) {\n        descriptor_indices[(*samplers_pixel)[i].bindless_descriptor_index] =\n            current_sampler_bindless_indices_pixel_[i];\n      }\n      cbuffer_binding_descriptor_indices_pixel_.up_to_date = true;\n      current_graphics_root_up_to_date_ &=\n          ~(1u << kRootParameter_Bindless_DescriptorIndicesPixel);\n    }\n  } else {\n    //\n    // Bindful descriptors path.\n    //\n\n    // See what descriptors need to be updated.\n    // Samplers have already been checked.\n    bool write_textures_vertex =\n        texture_count_vertex &&\n        (!bindful_textures_written_vertex_ ||\n         current_texture_layout_uid_vertex_ != texture_layout_uid_vertex ||\n         !texture_cache_->AreActiveTextureSRVKeysUpToDate(\n             current_texture_srv_keys_vertex_.data(), textures_vertex.data(),\n             texture_count_vertex));\n    bool write_textures_pixel =\n        texture_count_pixel &&\n        (!bindful_textures_written_pixel_ ||\n         current_texture_layout_uid_pixel_ != texture_layout_uid_pixel ||\n         !texture_cache_->AreActiveTextureSRVKeysUpToDate(\n             current_texture_srv_keys_pixel_.data(), textures_pixel->data(),\n             texture_count_pixel));\n    bool write_samplers_vertex =\n        sampler_count_vertex && !bindful_samplers_written_vertex_;\n    bool write_samplers_pixel =\n        sampler_count_pixel && !bindful_samplers_written_pixel_;\n    bool edram_rov_used = render_target_cache_->GetPath() ==\n                          RenderTargetCache::Path::kPixelShaderInterlock;\n\n    // Allocate the descriptors.\n    size_t view_count_partial_update = 0;\n    if (write_textures_vertex) {\n      view_count_partial_update += texture_count_vertex;\n    }\n    if (write_textures_pixel) {\n      view_count_partial_update += texture_count_pixel;\n    }\n    // Shared memory SRV and null UAV + null SRV and shared memory UAV +\n    // textures.\n    size_t view_count_full_update =\n        4 + texture_count_vertex + texture_count_pixel;\n    if (edram_rov_used) {\n      // + EDRAM UAV in two tables (with the shared memory SRV and with the\n      // shared memory UAV).\n      view_count_full_update += 2;\n    }\n    D3D12_CPU_DESCRIPTOR_HANDLE view_cpu_handle;\n    D3D12_GPU_DESCRIPTOR_HANDLE view_gpu_handle;\n    uint32_t descriptor_size_view = provider.GetViewDescriptorSize();\n    uint64_t view_heap_index = RequestViewBindfulDescriptors(\n        draw_view_bindful_heap_index_, uint32_t(view_count_partial_update),\n        uint32_t(view_count_full_update), view_cpu_handle, view_gpu_handle);\n    if (view_heap_index ==\n        ui::d3d12::D3D12DescriptorHeapPool::kHeapIndexInvalid) {\n      XELOGE(\"Failed to allocate view descriptors\");\n      return false;\n    }\n    size_t sampler_count_partial_update = 0;\n    if (write_samplers_vertex) {\n      sampler_count_partial_update += sampler_count_vertex;\n    }\n    if (write_samplers_pixel) {\n      sampler_count_partial_update += sampler_count_pixel;\n    }\n    D3D12_CPU_DESCRIPTOR_HANDLE sampler_cpu_handle = {};\n    D3D12_GPU_DESCRIPTOR_HANDLE sampler_gpu_handle = {};\n    uint32_t descriptor_size_sampler = provider.GetSamplerDescriptorSize();\n    uint64_t sampler_heap_index =\n        ui::d3d12::D3D12DescriptorHeapPool::kHeapIndexInvalid;\n    if (sampler_count_vertex != 0 || sampler_count_pixel != 0) {\n      sampler_heap_index = RequestSamplerBindfulDescriptors(\n          draw_sampler_bindful_heap_index_,\n          uint32_t(sampler_count_partial_update),\n          uint32_t(sampler_count_vertex + sampler_count_pixel),\n          sampler_cpu_handle, sampler_gpu_handle);\n      if (sampler_heap_index ==\n          ui::d3d12::D3D12DescriptorHeapPool::kHeapIndexInvalid) {\n        XELOGE(\"Failed to allocate sampler descriptors\");\n        return false;\n      }\n    }\n    if (draw_view_bindful_heap_index_ != view_heap_index) {\n      // Need to update all view descriptors.\n      write_textures_vertex = texture_count_vertex != 0;\n      write_textures_pixel = texture_count_pixel != 0;\n      bindful_textures_written_vertex_ = false;\n      bindful_textures_written_pixel_ = false;\n      // If updating fully, write the shared memory SRV and UAV descriptors and,\n      // if needed, the EDRAM descriptor.\n      // SRV + null UAV + EDRAM.\n      gpu_handle_shared_memory_srv_and_edram_ = view_gpu_handle;\n      shared_memory_->WriteRawSRVDescriptor(view_cpu_handle);\n      view_cpu_handle.ptr += descriptor_size_view;\n      view_gpu_handle.ptr += descriptor_size_view;\n      ui::d3d12::util::CreateBufferRawUAV(device, view_cpu_handle, nullptr, 0);\n      view_cpu_handle.ptr += descriptor_size_view;\n      view_gpu_handle.ptr += descriptor_size_view;\n      if (edram_rov_used) {\n        render_target_cache_->WriteEdramUintPow2UAVDescriptor(view_cpu_handle,\n                                                              2);\n        view_cpu_handle.ptr += descriptor_size_view;\n        view_gpu_handle.ptr += descriptor_size_view;\n      }\n      // Null SRV + UAV + EDRAM.\n      gpu_handle_shared_memory_uav_and_edram_ = view_gpu_handle;\n      ui::d3d12::util::CreateBufferRawSRV(device, view_cpu_handle, nullptr, 0);\n      view_cpu_handle.ptr += descriptor_size_view;\n      view_gpu_handle.ptr += descriptor_size_view;\n      shared_memory_->WriteRawUAVDescriptor(view_cpu_handle);\n      view_cpu_handle.ptr += descriptor_size_view;\n      view_gpu_handle.ptr += descriptor_size_view;\n      if (edram_rov_used) {\n        render_target_cache_->WriteEdramUintPow2UAVDescriptor(view_cpu_handle,\n                                                              2);\n        view_cpu_handle.ptr += descriptor_size_view;\n        view_gpu_handle.ptr += descriptor_size_view;\n      }\n      current_graphics_root_up_to_date_ &=\n          ~(1u << kRootParameter_Bindful_SharedMemoryAndEdram);\n    }\n    if (sampler_heap_index !=\n            ui::d3d12::D3D12DescriptorHeapPool::kHeapIndexInvalid &&\n        draw_sampler_bindful_heap_index_ != sampler_heap_index) {\n      write_samplers_vertex = sampler_count_vertex != 0;\n      write_samplers_pixel = sampler_count_pixel != 0;\n      bindful_samplers_written_vertex_ = false;\n      bindful_samplers_written_pixel_ = false;\n    }\n\n    // Write the descriptors.\n    if (write_textures_vertex) {\n      assert_true(current_graphics_root_bindful_extras_.textures_vertex !=\n                  RootBindfulExtraParameterIndices::kUnavailable);\n      gpu_handle_textures_vertex_ = view_gpu_handle;\n      for (size_t i = 0; i < texture_count_vertex; ++i) {\n        texture_cache_->WriteActiveTextureBindfulSRV(textures_vertex[i],\n                                                     view_cpu_handle);\n        view_cpu_handle.ptr += descriptor_size_view;\n        view_gpu_handle.ptr += descriptor_size_view;\n      }\n      current_texture_layout_uid_vertex_ = texture_layout_uid_vertex;\n      current_texture_srv_keys_vertex_.resize(\n          std::max(current_texture_srv_keys_vertex_.size(),\n                   size_t(texture_count_vertex)));\n      texture_cache_->WriteActiveTextureSRVKeys(\n          current_texture_srv_keys_vertex_.data(), textures_vertex.data(),\n          texture_count_vertex);\n      bindful_textures_written_vertex_ = true;\n      current_graphics_root_up_to_date_ &=\n          ~(1u << current_graphics_root_bindful_extras_.textures_vertex);\n    }\n    if (write_textures_pixel) {\n      assert_true(current_graphics_root_bindful_extras_.textures_pixel !=\n                  RootBindfulExtraParameterIndices::kUnavailable);\n      gpu_handle_textures_pixel_ = view_gpu_handle;\n      for (size_t i = 0; i < texture_count_pixel; ++i) {\n        texture_cache_->WriteActiveTextureBindfulSRV((*textures_pixel)[i],\n                                                     view_cpu_handle);\n        view_cpu_handle.ptr += descriptor_size_view;\n        view_gpu_handle.ptr += descriptor_size_view;\n      }\n      current_texture_layout_uid_pixel_ = texture_layout_uid_pixel;\n      current_texture_srv_keys_pixel_.resize(std::max(\n          current_texture_srv_keys_pixel_.size(), size_t(texture_count_pixel)));\n      texture_cache_->WriteActiveTextureSRVKeys(\n          current_texture_srv_keys_pixel_.data(), textures_pixel->data(),\n          texture_count_pixel);\n      bindful_textures_written_pixel_ = true;\n      current_graphics_root_up_to_date_ &=\n          ~(1u << current_graphics_root_bindful_extras_.textures_pixel);\n    }\n    if (write_samplers_vertex) {\n      assert_true(current_graphics_root_bindful_extras_.samplers_vertex !=\n                  RootBindfulExtraParameterIndices::kUnavailable);\n      gpu_handle_samplers_vertex_ = sampler_gpu_handle;\n      for (size_t i = 0; i < sampler_count_vertex; ++i) {\n        texture_cache_->WriteSampler(current_samplers_vertex_[i],\n                                     sampler_cpu_handle);\n        sampler_cpu_handle.ptr += descriptor_size_sampler;\n        sampler_gpu_handle.ptr += descriptor_size_sampler;\n      }\n      // Current samplers have already been updated.\n      bindful_samplers_written_vertex_ = true;\n      current_graphics_root_up_to_date_ &=\n          ~(1u << current_graphics_root_bindful_extras_.samplers_vertex);\n    }\n    if (write_samplers_pixel) {\n      assert_true(current_graphics_root_bindful_extras_.samplers_pixel !=\n                  RootBindfulExtraParameterIndices::kUnavailable);\n      gpu_handle_samplers_pixel_ = sampler_gpu_handle;\n      for (size_t i = 0; i < sampler_count_pixel; ++i) {\n        texture_cache_->WriteSampler(current_samplers_pixel_[i],\n                                     sampler_cpu_handle);\n        sampler_cpu_handle.ptr += descriptor_size_sampler;\n        sampler_gpu_handle.ptr += descriptor_size_sampler;\n      }\n      // Current samplers have already been updated.\n      bindful_samplers_written_pixel_ = true;\n      current_graphics_root_up_to_date_ &=\n          ~(1u << current_graphics_root_bindful_extras_.samplers_pixel);\n    }\n\n    // Wrote new descriptors on the current page.\n    draw_view_bindful_heap_index_ = view_heap_index;\n    if (sampler_heap_index !=\n        ui::d3d12::D3D12DescriptorHeapPool::kHeapIndexInvalid) {\n      draw_sampler_bindful_heap_index_ = sampler_heap_index;\n    }\n  }\n\n  // Update the root parameters.\n  if (!(current_graphics_root_up_to_date_ &\n        (1u << root_parameter_fetch_constants))) {\n    deferred_command_list_.D3DSetGraphicsRootConstantBufferView(\n        root_parameter_fetch_constants, cbuffer_binding_fetch_.address);\n    current_graphics_root_up_to_date_ |= 1u << root_parameter_fetch_constants;\n  }\n  if (!(current_graphics_root_up_to_date_ &\n        (1u << root_parameter_float_constants_vertex))) {\n    deferred_command_list_.D3DSetGraphicsRootConstantBufferView(\n        root_parameter_float_constants_vertex,\n        cbuffer_binding_float_vertex_.address);\n    current_graphics_root_up_to_date_ |=\n        1u << root_parameter_float_constants_vertex;\n  }\n  if (!(current_graphics_root_up_to_date_ &\n        (1u << root_parameter_float_constants_pixel))) {\n    deferred_command_list_.D3DSetGraphicsRootConstantBufferView(\n        root_parameter_float_constants_pixel,\n        cbuffer_binding_float_pixel_.address);\n    current_graphics_root_up_to_date_ |=\n        1u << root_parameter_float_constants_pixel;\n  }\n  if (!(current_graphics_root_up_to_date_ &\n        (1u << root_parameter_system_constants))) {\n    deferred_command_list_.D3DSetGraphicsRootConstantBufferView(\n        root_parameter_system_constants, cbuffer_binding_system_.address);\n    current_graphics_root_up_to_date_ |= 1u << root_parameter_system_constants;\n  }\n  if (!(current_graphics_root_up_to_date_ &\n        (1u << root_parameter_bool_loop_constants))) {\n    deferred_command_list_.D3DSetGraphicsRootConstantBufferView(\n        root_parameter_bool_loop_constants, cbuffer_binding_bool_loop_.address);\n    current_graphics_root_up_to_date_ |= 1u\n                                         << root_parameter_bool_loop_constants;\n  }\n  if (!(current_graphics_root_up_to_date_ &\n        (1u << root_parameter_shared_memory_and_bindful_edram))) {\n    assert_true(current_shared_memory_binding_is_uav_.has_value());\n    D3D12_GPU_DESCRIPTOR_HANDLE gpu_handle_shared_memory_and_bindful_edram;\n    if (bindless_resources_used_) {\n      gpu_handle_shared_memory_and_bindful_edram =\n          provider.OffsetViewDescriptor(\n              view_bindless_heap_gpu_start_,\n              uint32_t(current_shared_memory_binding_is_uav_.value()\n                           ? SystemBindlessView ::\n                                 kNullRawSRVAndSharedMemoryRawUAVStart\n                           : SystemBindlessView ::\n                                 kSharedMemoryRawSRVAndNullRawUAVStart));\n    } else {\n      gpu_handle_shared_memory_and_bindful_edram =\n          current_shared_memory_binding_is_uav_.value()\n              ? gpu_handle_shared_memory_uav_and_edram_\n              : gpu_handle_shared_memory_srv_and_edram_;\n    }\n    deferred_command_list_.D3DSetGraphicsRootDescriptorTable(\n        root_parameter_shared_memory_and_bindful_edram,\n        gpu_handle_shared_memory_and_bindful_edram);\n    current_graphics_root_up_to_date_ |=\n        1u << root_parameter_shared_memory_and_bindful_edram;\n  }\n  if (bindless_resources_used_) {\n    if (!(current_graphics_root_up_to_date_ &\n          (1u << kRootParameter_Bindless_DescriptorIndicesPixel))) {\n      deferred_command_list_.D3DSetGraphicsRootConstantBufferView(\n          kRootParameter_Bindless_DescriptorIndicesPixel,\n          cbuffer_binding_descriptor_indices_pixel_.address);\n      current_graphics_root_up_to_date_ |=\n          1u << kRootParameter_Bindless_DescriptorIndicesPixel;\n    }\n    if (!(current_graphics_root_up_to_date_ &\n          (1u << kRootParameter_Bindless_DescriptorIndicesVertex))) {\n      deferred_command_list_.D3DSetGraphicsRootConstantBufferView(\n          kRootParameter_Bindless_DescriptorIndicesVertex,\n          cbuffer_binding_descriptor_indices_vertex_.address);\n      current_graphics_root_up_to_date_ |=\n          1u << kRootParameter_Bindless_DescriptorIndicesVertex;\n    }\n    if (!(current_graphics_root_up_to_date_ &\n          (1u << kRootParameter_Bindless_SamplerHeap))) {\n      deferred_command_list_.D3DSetGraphicsRootDescriptorTable(\n          kRootParameter_Bindless_SamplerHeap,\n          sampler_bindless_heap_gpu_start_);\n      current_graphics_root_up_to_date_ |=\n          1u << kRootParameter_Bindless_SamplerHeap;\n    }\n    if (!(current_graphics_root_up_to_date_ &\n          (1u << kRootParameter_Bindless_ViewHeap))) {\n      deferred_command_list_.D3DSetGraphicsRootDescriptorTable(\n          kRootParameter_Bindless_ViewHeap, view_bindless_heap_gpu_start_);\n      current_graphics_root_up_to_date_ |= 1u\n                                           << kRootParameter_Bindless_ViewHeap;\n    }\n  } else {\n    uint32_t extra_index;\n    extra_index = current_graphics_root_bindful_extras_.textures_pixel;\n    if (extra_index != RootBindfulExtraParameterIndices::kUnavailable &&\n        !(current_graphics_root_up_to_date_ & (1u << extra_index))) {\n      deferred_command_list_.D3DSetGraphicsRootDescriptorTable(\n          extra_index, gpu_handle_textures_pixel_);\n      current_graphics_root_up_to_date_ |= 1u << extra_index;\n    }\n    extra_index = current_graphics_root_bindful_extras_.samplers_pixel;\n    if (extra_index != RootBindfulExtraParameterIndices::kUnavailable &&\n        !(current_graphics_root_up_to_date_ & (1u << extra_index))) {\n      deferred_command_list_.D3DSetGraphicsRootDescriptorTable(\n          extra_index, gpu_handle_samplers_pixel_);\n      current_graphics_root_up_to_date_ |= 1u << extra_index;\n    }\n    extra_index = current_graphics_root_bindful_extras_.textures_vertex;\n    if (extra_index != RootBindfulExtraParameterIndices::kUnavailable &&\n        !(current_graphics_root_up_to_date_ & (1u << extra_index))) {\n      deferred_command_list_.D3DSetGraphicsRootDescriptorTable(\n          extra_index, gpu_handle_textures_vertex_);\n      current_graphics_root_up_to_date_ |= 1u << extra_index;\n    }\n    extra_index = current_graphics_root_bindful_extras_.samplers_vertex;\n    if (extra_index != RootBindfulExtraParameterIndices::kUnavailable &&\n        !(current_graphics_root_up_to_date_ & (1u << extra_index))) {\n      deferred_command_list_.D3DSetGraphicsRootDescriptorTable(\n          extra_index, gpu_handle_samplers_vertex_);\n      current_graphics_root_up_to_date_ |= 1u << extra_index;\n    }\n  }\n\n  return true;\n}\n\nID3D12Resource* D3D12CommandProcessor::RequestReadbackBuffer(uint32_t size) {\n  if (size == 0) {\n    return nullptr;\n  }\n  size = xe::align(size, kReadbackBufferSizeIncrement);\n  if (size > readback_buffer_size_) {\n    const ui::d3d12::D3D12Provider& provider = GetD3D12Provider();\n    ID3D12Device* device = provider.GetDevice();\n    D3D12_RESOURCE_DESC buffer_desc;\n    ui::d3d12::util::FillBufferResourceDesc(buffer_desc, size,\n                                            D3D12_RESOURCE_FLAG_NONE);\n    ID3D12Resource* buffer;\n    if (FAILED(device->CreateCommittedResource(\n            &ui::d3d12::util::kHeapPropertiesReadback,\n            provider.GetHeapFlagCreateNotZeroed(), &buffer_desc,\n            D3D12_RESOURCE_STATE_COPY_DEST, nullptr, IID_PPV_ARGS(&buffer)))) {\n      XELOGE(\"Failed to create a {} MB readback buffer\", size >> 20);\n      return nullptr;\n    }\n    if (readback_buffer_ != nullptr) {\n      readback_buffer_->Release();\n    }\n    readback_buffer_ = buffer;\n  }\n  return readback_buffer_;\n}\n\nvoid D3D12CommandProcessor::WriteGammaRampSRV(\n    bool is_pwl, D3D12_CPU_DESCRIPTOR_HANDLE handle) const {\n  ID3D12Device* device = GetD3D12Provider().GetDevice();\n  D3D12_SHADER_RESOURCE_VIEW_DESC desc;\n  desc.Format = DXGI_FORMAT_R10G10B10A2_UNORM;\n  desc.ViewDimension = D3D12_SRV_DIMENSION_BUFFER;\n  desc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;\n  desc.Buffer.StructureByteStride = 0;\n  desc.Buffer.Flags = D3D12_BUFFER_SRV_FLAG_NONE;\n  if (is_pwl) {\n    desc.Format = DXGI_FORMAT_R16G16_UINT;\n    desc.Buffer.FirstElement = 256 * 4 / 4;\n    desc.Buffer.NumElements = 128 * 3;\n  } else {\n    desc.Format = DXGI_FORMAT_R10G10B10A2_UNORM;\n    desc.Buffer.FirstElement = 0;\n    desc.Buffer.NumElements = 256;\n  }\n  device->CreateShaderResourceView(gamma_ramp_buffer_.Get(), &desc, handle);\n}\n\n}  // namespace d3d12\n}  // namespace gpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/d3d12/d3d12_command_processor.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_D3D12_D3D12_COMMAND_PROCESSOR_H_\n#define XENIA_GPU_D3D12_D3D12_COMMAND_PROCESSOR_H_\n\n#include <algorithm>\n#include <atomic>\n#include <deque>\n#include <memory>\n#include <optional>\n#include <string>\n#include <unordered_map>\n#include <utility>\n#include <vector>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/gpu/command_processor.h\"\n#include \"xenia/gpu/d3d12/d3d12_graphics_system.h\"\n#include \"xenia/gpu/d3d12/d3d12_primitive_processor.h\"\n#include \"xenia/gpu/d3d12/d3d12_render_target_cache.h\"\n#include \"xenia/gpu/d3d12/d3d12_shared_memory.h\"\n#include \"xenia/gpu/d3d12/d3d12_texture_cache.h\"\n#include \"xenia/gpu/d3d12/deferred_command_list.h\"\n#include \"xenia/gpu/d3d12/pipeline_cache.h\"\n#include \"xenia/gpu/draw_util.h\"\n#include \"xenia/gpu/dxbc_shader.h\"\n#include \"xenia/gpu/dxbc_shader_translator.h\"\n#include \"xenia/gpu/registers.h\"\n#include \"xenia/gpu/xenos.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/ui/d3d12/d3d12_descriptor_heap_pool.h\"\n#include \"xenia/ui/d3d12/d3d12_gpu_completion_timeline.h\"\n#include \"xenia/ui/d3d12/d3d12_provider.h\"\n#include \"xenia/ui/d3d12/d3d12_upload_buffer_pool.h\"\n#include \"xenia/ui/d3d12/d3d12_util.h\"\n\nnamespace xe {\nnamespace gpu {\nnamespace d3d12 {\n\nclass D3D12CommandProcessor : public CommandProcessor {\n public:\n  explicit D3D12CommandProcessor(D3D12GraphicsSystem* graphics_system,\n                                 kernel::KernelState* kernel_state);\n  ~D3D12CommandProcessor();\n\n  void ClearCaches() override;\n\n  void InitializeShaderStorage(const std::filesystem::path& cache_root,\n                               uint32_t title_id, bool blocking) override;\n\n  void RequestFrameTrace(const std::filesystem::path& root_path) override;\n\n  void TracePlaybackWroteMemory(uint32_t base_ptr, uint32_t length) override;\n\n  void RestoreEdramSnapshot(const void* snapshot) override;\n\n  ui::d3d12::D3D12Provider& GetD3D12Provider() const {\n    return *static_cast<ui::d3d12::D3D12Provider*>(\n        graphics_system_->provider());\n  }\n\n  // Returns the deferred drawing command list for the currently open\n  // submission.\n  DeferredCommandList& GetDeferredCommandList() {\n    assert_true(submission_open_);\n    return deferred_command_list_;\n  }\n\n  uint64_t GetCurrentSubmission() const {\n    return completion_timeline_->GetUpcomingSubmission();\n  }\n  uint64_t GetCompletedSubmission() const {\n    return completion_timeline_->GetCompletedSubmissionFromLastUpdate();\n  }\n\n  // Must be called when a subsystem does something like UpdateTileMappings so\n  // it can be awaited in CheckSubmissionCompletion(GetCurrentSubmission()) if\n  // it was done after the latest ExecuteCommandLists + Signal.\n  void NotifyQueueOperationsDoneDirectly() {\n    queue_operations_done_since_submission_signal_ = true;\n  }\n\n  uint64_t GetCurrentFrame() const { return frame_current_; }\n  uint64_t GetCompletedFrame() const { return frame_completed_; }\n\n  // Returns true if the barrier has been inserted (the new state is different).\n  bool PushTransitionBarrier(\n      ID3D12Resource* resource, D3D12_RESOURCE_STATES old_state,\n      D3D12_RESOURCE_STATES new_state,\n      UINT subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES);\n  void PushAliasingBarrier(ID3D12Resource* old_resource,\n                           ID3D12Resource* new_resource);\n  void PushUAVBarrier(ID3D12Resource* resource);\n  void SubmitBarriers();\n\n  // Finds or creates root signature for a pipeline.\n  ID3D12RootSignature* GetRootSignature(const DxbcShader* vertex_shader,\n                                        const DxbcShader* pixel_shader,\n                                        bool tessellated);\n\n  ui::d3d12::D3D12UploadBufferPool& GetConstantBufferPool() const {\n    return *constant_buffer_pool_;\n  }\n\n  D3D12_CPU_DESCRIPTOR_HANDLE GetViewBindlessHeapCPUStart() const {\n    assert_true(bindless_resources_used_);\n    return view_bindless_heap_cpu_start_;\n  }\n  D3D12_GPU_DESCRIPTOR_HANDLE GetViewBindlessHeapGPUStart() const {\n    assert_true(bindless_resources_used_);\n    return view_bindless_heap_gpu_start_;\n  }\n  // Returns UINT32_MAX if no free descriptors. If the unbounded SRV range for\n  // bindless resources is also used in the root signature of the draw /\n  // dispatch referencing this descriptor, this must only be used to allocate\n  // SRVs, otherwise it won't work on Nvidia Fermi (root signature creation will\n  // fail)!\n  uint32_t RequestPersistentViewBindlessDescriptor();\n  void ReleaseViewBindlessDescriptorImmediately(uint32_t descriptor_index);\n  // Request non-contiguous CBV/SRV/UAV descriptors for use only within the next\n  // draw or dispatch command done for internal purposes. May change the current\n  // descriptor heap. If the unbounded SRV range for bindless resources is also\n  // used in the root signature of the draw / dispatch referencing these\n  // descriptors, this must only be used to allocate SRVs, otherwise it won't\n  // work on Nvidia Fermi (root signature creation will fail)!\n  bool RequestOneUseSingleViewDescriptors(\n      uint32_t count, ui::d3d12::util::DescriptorCpuGpuHandlePair* handles_out);\n  // These are needed often, so they are always allocated.\n  enum class SystemBindlessView : uint32_t {\n    // Both may be bound as one root parameter.\n    kSharedMemoryRawSRVAndNullRawUAVStart,\n    kSharedMemoryRawSRV = kSharedMemoryRawSRVAndNullRawUAVStart,\n    kNullRawUAV,\n\n    // Both may be bound as one root parameter.\n    kNullRawSRVAndSharedMemoryRawUAVStart,\n    kNullRawSRV = kNullRawSRVAndSharedMemoryRawUAVStart,\n    kSharedMemoryRawUAV,\n\n    kEdramRawSRV,\n    kEdramR32UintSRV,\n    kEdramR32G32UintSRV,\n    kEdramR32G32B32A32UintSRV,\n    kEdramRawUAV,\n    kEdramR32UintUAV,\n    kEdramR32G32UintUAV,\n    kEdramR32G32B32A32UintUAV,\n\n    kGammaRampTableSRV,\n    kGammaRampPWLSRV,\n\n    // Beyond this point, SRVs are accessible to shaders through an unbounded\n    // range - no descriptors of other types bound to shaders alongside\n    // unbounded ranges - must be located beyond this point.\n    kUnboundedSRVsStart,\n    kNullTexture2DArray = kUnboundedSRVsStart,\n    kNullTexture3D,\n    kNullTextureCube,\n\n    kCount,\n  };\n  ui::d3d12::util::DescriptorCpuGpuHandlePair GetSystemBindlessViewHandlePair(\n      SystemBindlessView view) const;\n  ui::d3d12::util::DescriptorCpuGpuHandlePair\n  GetEdramUintPow2BindlessSRVHandlePair(uint32_t element_size_bytes_pow2) const;\n  ui::d3d12::util::DescriptorCpuGpuHandlePair\n  GetEdramUintPow2BindlessUAVHandlePair(uint32_t element_size_bytes_pow2) const;\n\n  // Returns a single temporary GPU-side buffer within a submission for tasks\n  // like texture untiling and resolving.\n  ID3D12Resource* RequestScratchGPUBuffer(uint32_t size,\n                                          D3D12_RESOURCE_STATES state);\n  // This must be called when done with the scratch buffer, to notify the\n  // command processor about the new state in case the buffer was transitioned\n  // by its user.\n  void ReleaseScratchGPUBuffer(ID3D12Resource* buffer,\n                               D3D12_RESOURCE_STATES new_state);\n\n  // Returns a pipeline with deferred creation by its handle. May return nullptr\n  // if failed to create the pipeline.\n  ID3D12PipelineState* GetD3D12PipelineByHandle(void* handle) const {\n    return pipeline_cache_->GetD3D12PipelineByHandle(handle);\n  }\n\n  // Sets the current cached values to external ones. This is for cache\n  // invalidation primarily. A submission must be open.\n  void SetExternalPipeline(ID3D12PipelineState* pipeline);\n  void SetExternalGraphicsRootSignature(ID3D12RootSignature* root_signature);\n  void SetViewport(const D3D12_VIEWPORT& viewport);\n  void SetScissorRect(const D3D12_RECT& scissor_rect);\n  void SetStencilReference(uint32_t stencil_ref);\n  void SetPrimitiveTopology(D3D12_PRIMITIVE_TOPOLOGY primitive_topology);\n\n  // Returns the text to display in the GPU backend name in the window title.\n  std::string GetWindowTitleText() const;\n\n protected:\n  bool SetupContext() override;\n  void ShutdownContext() override;\n\n  void WriteRegister(uint32_t index, uint32_t value) override;\n\n  void OnGammaRamp256EntryTableValueWritten() override;\n  void OnGammaRampPWLValueWritten() override;\n\n  void IssueSwap(uint32_t frontbuffer_ptr, uint32_t frontbuffer_width,\n                 uint32_t frontbuffer_height) override;\n\n  void OnPrimaryBufferEnd() override;\n\n  Shader* LoadShader(xenos::ShaderType shader_type, uint32_t guest_address,\n                     const uint32_t* host_address,\n                     uint32_t dword_count) override;\n\n  bool IssueDraw(xenos::PrimitiveType primitive_type, uint32_t index_count,\n                 IndexBufferInfo* index_buffer_info,\n                 bool major_mode_explicit) override;\n  bool IssueCopy() override;\n\n  void InitializeTrace() override;\n\n private:\n  static constexpr uint32_t kQueueFrames = 3;\n\n  enum RootParameter : UINT {\n    // Keep the size of the root signature at each stage 13 dwords or less\n    // (better 12 or less) so it fits in user data on AMD. Descriptor tables are\n    // 1 dword, root descriptors are 2 dwords (however, root descriptors require\n    // less setup on the CPU - balance needs to be maintained).\n\n    // CBVs are set in both bindful and bindless cases via root descriptors.\n\n    // - Bindful resources - multiple root signatures depending on extra\n    //   parameters.\n\n    // These are always present.\n\n    // Very frequently changed, especially for UI draws, and for models drawn in\n    // multiple parts - contains vertex and texture fetch constants.\n    kRootParameter_Bindful_FetchConstants = 0,  // +2 dwords = 2 in all.\n    // Quite frequently changed (for one object drawn multiple times, for\n    // instance - may contain projection matrices).\n    kRootParameter_Bindful_FloatConstantsVertex,  // +2 = 4 in VS.\n    // Less frequently changed (per-material).\n    kRootParameter_Bindful_FloatConstantsPixel,  // +2 = 4 in PS.\n    // May stay the same across many draws.\n    kRootParameter_Bindful_SystemConstants,  // +2 = 6 in all.\n    // Pretty rarely used and rarely changed - flow control constants.\n    kRootParameter_Bindful_BoolLoopConstants,  // +2 = 8 in all.\n    // Changed only when starting a new descriptor heap or when switching\n    // between shared memory as SRV and UAV - shared memory byte address buffer\n    // (as SRV and as UAV, either may be null if not used), and, if ROV is used\n    // for EDRAM, EDRAM R32_UINT UAV.\n    kRootParameter_Bindful_SharedMemoryAndEdram,  // +1 = 9 in all.\n\n    kRootParameter_Bindful_Count_Base,\n\n    // Extra parameter that may or may not exist:\n    // - Pixel textures (+1 = 10 in PS).\n    // - Pixel samplers (+1 = 11 in PS).\n    // - Vertex textures (+1 = 10 in VS).\n    // - Vertex samplers (+1 = 11 in VS).\n\n    kRootParameter_Bindful_Count_Max = kRootParameter_Bindful_Count_Base + 4,\n\n    // - Bindless resources - two global root signatures (for non-tessellated\n    //   and tessellated drawing), so these are always present.\n\n    kRootParameter_Bindless_FetchConstants = 0,    // +2 = 2 in all.\n    kRootParameter_Bindless_FloatConstantsVertex,  // +2 = 4 in VS.\n    kRootParameter_Bindless_FloatConstantsPixel,   // +2 = 4 in PS.\n    // Changed per-material, texture and sampler descriptor indices.\n    kRootParameter_Bindless_DescriptorIndicesPixel,   // +2 = 6 in PS.\n    kRootParameter_Bindless_DescriptorIndicesVertex,  // +2 = 6 in VS.\n    kRootParameter_Bindless_SystemConstants,          // +2 = 8 in all.\n    kRootParameter_Bindless_BoolLoopConstants,        // +2 = 10 in all.\n    // Changed only when switching between shared memory as SRV and UAV - shared\n    // memory byte address buffer (as SRV and as UAV, either may be null if not\n    // used).\n    kRootParameter_Bindless_SharedMemory,  // +1 = 11 in all.\n    // Unbounded sampler descriptor table - changed in case of overflow.\n    kRootParameter_Bindless_SamplerHeap,  // +1 = 12 in all.\n    // Unbounded SRV/UAV descriptor table - never changed.\n    kRootParameter_Bindless_ViewHeap,  // +1 = 13 in all.\n\n    kRootParameter_Bindless_Count,\n  };\n\n  struct RootBindfulExtraParameterIndices {\n    uint32_t textures_pixel;\n    uint32_t samplers_pixel;\n    uint32_t textures_vertex;\n    uint32_t samplers_vertex;\n    static constexpr uint32_t kUnavailable = UINT32_MAX;\n  };\n  // Gets the indices of optional root parameters. Returns the total parameter\n  // count.\n  static uint32_t GetRootBindfulExtraParameterIndices(\n      const DxbcShader* vertex_shader, const DxbcShader* pixel_shader,\n      RootBindfulExtraParameterIndices& indices_out);\n\n  // BeginSubmission and EndSubmission may be called at any time. If there's an\n  // open non-frame submission, BeginSubmission(true) will promote it to a\n  // frame. EndSubmission(true) will close the frame no matter whether the\n  // submission has already been closed.\n  // Submission (ExecuteCommandLists) boundaries are implicit full UAV and\n  // aliasing barriers, and also result in common resource state promotion and\n  // decay.\n\n  // Rechecks submission number and reclaims per-submission resources. Pass 0 as\n  // the submission to await to simply check status, or pass\n  // GetCurrentSubmission() to wait for all queue operations to be completed.\n  void CheckSubmissionCompletion(uint64_t await_submission);\n  // If is_guest_command is true, a new full frame - with full cleanup of\n  // resources and, if needed, starting capturing - is opened if pending (as\n  // opposed to simply resuming after mid-frame synchronization). Returns\n  // whether a submission is open currently and the device is not removed.\n  bool BeginSubmission(bool is_guest_command);\n  // If is_swap is true, a full frame is closed - with, if needed, cache\n  // clearing and stopping capturing. Returns whether the submission was done\n  // successfully, if it has failed, leaves it open.\n  bool EndSubmission(bool is_swap);\n  // Checks if ending a submission right now would not cause potentially more\n  // delay than it would reduce by making the GPU start working earlier - such\n  // as when there are unfinished graphics pipeline creation requests that would\n  // need to be fulfilled before actually submitting the command list.\n  bool CanEndSubmissionImmediately() const;\n  bool AwaitAllQueueOperationsCompletion() {\n    CheckSubmissionCompletion(GetCurrentSubmission());\n    return GetCompletedSubmission() + 1u >= GetCurrentSubmission();\n  }\n  // Need to await submission completion before calling.\n  void ClearCommandAllocatorCache();\n\n  // Request descriptors and automatically rebind the descriptor heap on the\n  // draw command list. Refer to D3D12DescriptorHeapPool::Request for partial /\n  // full update explanation. Doesn't work when bindless descriptors are used.\n  uint64_t RequestViewBindfulDescriptors(\n      uint64_t previous_heap_index, uint32_t count_for_partial_update,\n      uint32_t count_for_full_update,\n      D3D12_CPU_DESCRIPTOR_HANDLE& cpu_handle_out,\n      D3D12_GPU_DESCRIPTOR_HANDLE& gpu_handle_out);\n  uint64_t RequestSamplerBindfulDescriptors(\n      uint64_t previous_heap_index, uint32_t count_for_partial_update,\n      uint32_t count_for_full_update,\n      D3D12_CPU_DESCRIPTOR_HANDLE& cpu_handle_out,\n      D3D12_GPU_DESCRIPTOR_HANDLE& gpu_handle_out);\n\n  void UpdateFixedFunctionState(const draw_util::ViewportInfo& viewport_info,\n                                const draw_util::Scissor& scissor,\n                                bool primitive_polygonal,\n                                reg::RB_DEPTHCONTROL normalized_depth_control);\n  void UpdateSystemConstantValues(bool shared_memory_is_uav,\n                                  bool primitive_polygonal,\n                                  uint32_t line_loop_closing_index,\n                                  xenos::Endian index_endian,\n                                  const draw_util::ViewportInfo& viewport_info,\n                                  uint32_t used_texture_mask,\n                                  reg::RB_DEPTHCONTROL normalized_depth_control,\n                                  uint32_t normalized_color_mask);\n  bool UpdateBindings(const D3D12Shader* vertex_shader,\n                      const D3D12Shader* pixel_shader,\n                      ID3D12RootSignature* root_signature,\n                      bool shared_memory_is_uav);\n\n  // Returns a buffer for reading GPU data back to the CPU. Assuming\n  // synchronizing immediately after use. Always in COPY_DEST state.\n  ID3D12Resource* RequestReadbackBuffer(uint32_t size);\n\n  void WriteGammaRampSRV(bool is_pwl, D3D12_CPU_DESCRIPTOR_HANDLE handle) const;\n\n  bool device_removed_ = false;\n\n  bool cache_clear_requested_ = false;\n\n  std::unique_ptr<ui::d3d12::D3D12GPUCompletionTimeline> completion_timeline_;\n  bool submission_open_ = false;\n\n  // For awaiting non-submission queue operations such as UpdateTileMappings in\n  // AwaitAllQueueOperationsCompletion when they're queued after the latest\n  // ExecuteCommandLists + Signal, thus won't be awaited by just awaiting the\n  // submission.\n  std::unique_ptr<ui::d3d12::D3D12GPUCompletionTimeline>\n      queue_operations_since_submission_completion_timeline_;\n  bool queue_operations_done_since_submission_signal_ = false;\n\n  bool frame_open_ = false;\n  // Guest frame index, since some transient resources can be reused across\n  // submissions. Values updated in the beginning of a frame.\n  uint64_t frame_current_ = 1;\n  uint64_t frame_completed_ = 0;\n  // Submission indices of frames that have already been submitted.\n  uint64_t closed_frame_submissions_[kQueueFrames] = {};\n\n  struct CommandAllocator {\n    ID3D12CommandAllocator* command_allocator;\n    uint64_t last_usage_submission;\n    CommandAllocator* next;\n  };\n  CommandAllocator* command_allocator_writable_first_ = nullptr;\n  CommandAllocator* command_allocator_writable_last_ = nullptr;\n  CommandAllocator* command_allocator_submitted_first_ = nullptr;\n  CommandAllocator* command_allocator_submitted_last_ = nullptr;\n  ID3D12GraphicsCommandList* command_list_ = nullptr;\n  ID3D12GraphicsCommandList1* command_list_1_ = nullptr;\n  DeferredCommandList deferred_command_list_;\n\n  // Should bindless textures and samplers be used - many times faster\n  // UpdateBindings than bindful (that becomes a significant bottleneck with\n  // bindful - mainly because of CopyDescriptorsSimple, which takes the majority\n  // of UpdateBindings time, and that's outside the emulator's control even).\n  bool bindless_resources_used_ = false;\n\n  std::unique_ptr<D3D12SharedMemory> shared_memory_;\n\n  std::unique_ptr<D3D12RenderTargetCache> render_target_cache_;\n\n  std::unique_ptr<ui::d3d12::D3D12UploadBufferPool> constant_buffer_pool_;\n\n  static constexpr uint32_t kViewBindfulHeapSize = 32768;\n  static_assert(kViewBindfulHeapSize <=\n                D3D12_MAX_SHADER_VISIBLE_DESCRIPTOR_HEAP_SIZE_TIER_1);\n  std::unique_ptr<ui::d3d12::D3D12DescriptorHeapPool> view_bindful_heap_pool_;\n  // Currently bound descriptor heap - updated by RequestViewBindfulDescriptors.\n  ID3D12DescriptorHeap* view_bindful_heap_current_;\n  // Rationale: textures have 4 KB alignment in guest memory, and there can be\n  // 512 MB / 4 KB in total of them at most, and multiply by 3 for different\n  // swizzles, signedness, and multiple host textures for one guest texture, and\n  // transient descriptors. Though in reality there will be a lot fewer of\n  // course, this is just a \"safe\" value. The limit is 1000000 for resource\n  // binding tier 2.\n  static constexpr uint32_t kViewBindlessHeapSize = 262144;\n  static_assert(kViewBindlessHeapSize <=\n                D3D12_MAX_SHADER_VISIBLE_DESCRIPTOR_HEAP_SIZE_TIER_2);\n  ID3D12DescriptorHeap* view_bindless_heap_ = nullptr;\n  D3D12_CPU_DESCRIPTOR_HANDLE view_bindless_heap_cpu_start_;\n  D3D12_GPU_DESCRIPTOR_HANDLE view_bindless_heap_gpu_start_;\n  uint32_t view_bindless_heap_allocated_ = 0;\n  std::vector<uint32_t> view_bindless_heap_free_;\n  // <Descriptor index, submission where requested>, sorted by the submission\n  // number.\n  std::deque<std::pair<uint32_t, uint64_t>> view_bindless_one_use_descriptors_;\n\n  // Direct3D 12 only allows shader-visible heaps with no more than 2048\n  // samplers (due to Nvidia addressing). However, there's also possibly a weird\n  // bug in the Nvidia driver (tested on 440.97 and earlier on Windows 10 1803)\n  // that caused the sampler with index 2047 not to work if a heap with 8 or\n  // less samplers also exists - in case of Xenia, it's the immediate drawer's\n  // sampler heap.\n  // FIXME(Triang3l): Investigate the issue with the sampler 2047 on Nvidia.\n  static constexpr uint32_t kSamplerHeapSize = 2000;\n  static_assert(kSamplerHeapSize <= D3D12_MAX_SHADER_VISIBLE_SAMPLER_HEAP_SIZE);\n  std::unique_ptr<ui::d3d12::D3D12DescriptorHeapPool>\n      sampler_bindful_heap_pool_;\n  ID3D12DescriptorHeap* sampler_bindful_heap_current_;\n  ID3D12DescriptorHeap* sampler_bindless_heap_current_ = nullptr;\n  D3D12_CPU_DESCRIPTOR_HANDLE sampler_bindless_heap_cpu_start_;\n  D3D12_GPU_DESCRIPTOR_HANDLE sampler_bindless_heap_gpu_start_;\n  // Currently the sampler heap is used only for texture cache samplers, so\n  // individual samplers are never freed, and using a simple linear allocator\n  // inside the current heap without a free list.\n  uint32_t sampler_bindless_heap_allocated_ = 0;\n  // <Heap, overflow submission number>, if total sampler count used so far\n  // exceeds kSamplerHeapSize, and the heap has been switched (this is not a\n  // totally impossible situation considering Direct3D 9 has sampler parameter\n  // state instead of sampler objects, and having one \"unimportant\" parameter\n  // changed may result in doubling of sampler count). Sorted by the submission\n  // number (so checking if the first can be reused is enough).\n  std::deque<std::pair<ID3D12DescriptorHeap*, uint64_t>>\n      sampler_bindless_heaps_overflowed_;\n  // D3D12TextureCache::SamplerParameters::value -> indices within the current\n  // bindless sampler heap.\n  std::unordered_map<uint32_t, uint32_t> texture_cache_bindless_sampler_map_;\n\n  // Root signatures for different descriptor counts.\n  std::unordered_map<uint32_t, ID3D12RootSignature*> root_signatures_bindful_;\n  ID3D12RootSignature* root_signature_bindless_vs_ = nullptr;\n  ID3D12RootSignature* root_signature_bindless_ds_ = nullptr;\n\n  std::unique_ptr<D3D12PrimitiveProcessor> primitive_processor_;\n\n  std::unique_ptr<PipelineCache> pipeline_cache_;\n\n  std::unique_ptr<D3D12TextureCache> texture_cache_;\n\n  // Bytes 0x0...0x3FF - 256-entry gamma ramp table with B10G10R10X2 data (read\n  // as R10G10B10X2 with swizzle).\n  // Bytes 0x400...0x9FF - 128-entry PWL R16G16 gamma ramp (R - base, G - delta,\n  // low 6 bits of each are zero, 3 elements per entry).\n  Microsoft::WRL::ComPtr<ID3D12Resource> gamma_ramp_buffer_;\n  D3D12_RESOURCE_STATES gamma_ramp_buffer_state_;\n  // Upload buffer for an image that is the same as gamma_ramp_, but with\n  // kQueueFrames array layers.\n  Microsoft::WRL::ComPtr<ID3D12Resource> gamma_ramp_upload_buffer_;\n  uint8_t* gamma_ramp_upload_buffer_mapping_ = nullptr;\n  bool gamma_ramp_256_entry_table_up_to_date_ = false;\n  bool gamma_ramp_pwl_up_to_date_ = false;\n\n  struct ApplyGammaConstants {\n    uint32_t size[2];\n  };\n  enum class ApplyGammaRootParameter : UINT {\n    kConstants,\n    kDestination,\n    kSource,\n    kRamp,\n\n    kCount,\n  };\n  Microsoft::WRL::ComPtr<ID3D12RootSignature> apply_gamma_root_signature_;\n  Microsoft::WRL::ComPtr<ID3D12PipelineState> apply_gamma_table_pipeline_;\n  Microsoft::WRL::ComPtr<ID3D12PipelineState>\n      apply_gamma_table_fxaa_luma_pipeline_;\n  Microsoft::WRL::ComPtr<ID3D12PipelineState> apply_gamma_pwl_pipeline_;\n  Microsoft::WRL::ComPtr<ID3D12PipelineState>\n      apply_gamma_pwl_fxaa_luma_pipeline_;\n\n  struct FxaaConstants {\n    uint32_t size[2];\n    float size_inv[2];\n  };\n  enum class FxaaRootParameter : UINT {\n    kConstants,\n    kDestination,\n    kSource,\n\n    kCount,\n  };\n  Microsoft::WRL::ComPtr<ID3D12RootSignature> fxaa_root_signature_;\n  Microsoft::WRL::ComPtr<ID3D12PipelineState> fxaa_pipeline_;\n  Microsoft::WRL::ComPtr<ID3D12PipelineState> fxaa_extreme_pipeline_;\n\n  // PWL gamma ramp can result in values with more precision than 10bpc. Though\n  // those sub-10bpc bits don't have any noticeable visual effect, so normally\n  // R10G10B10A2_UNORM is enough. But what's the most important is that for the\n  // original FXAA shader, the luma needs to be written to the alpha channel.\n  // For simplicity (to avoid modifying the FXAA shader and adding more texture\n  // fetches into it), and for the highest quality (preserving all 13 bits that\n  // may be generated by applying the PWL gamma ramp with an increment of 2^3,\n  // and also leaving some space for the result of applying fractional weights\n  // to calculate the luma), using R16G16B16A16_UNORM instead of\n  // R10G10B10X2_UNORM with a separate alpha texture.\n  static constexpr DXGI_FORMAT kFxaaSourceTextureFormat =\n      DXGI_FORMAT_R16G16B16A16_UNORM;\n  // Kept in NON_PIXEL_SHADER_RESOURCE state.\n  Microsoft::WRL::ComPtr<ID3D12Resource> fxaa_source_texture_;\n  uint64_t fxaa_source_texture_submission_ = 0;\n\n  // Unsubmitted barrier batch.\n  std::vector<D3D12_RESOURCE_BARRIER> barriers_;\n\n  // <Submission where requested, resource>, sorted by the submission number.\n  std::deque<std::pair<uint64_t, ID3D12Resource*>> resources_for_deletion_;\n\n  static constexpr uint32_t kScratchBufferSizeIncrement = 16 * 1024 * 1024;\n  ID3D12Resource* scratch_buffer_ = nullptr;\n  uint32_t scratch_buffer_size_ = 0;\n  D3D12_RESOURCE_STATES scratch_buffer_state_;\n  bool scratch_buffer_used_ = false;\n\n  static constexpr uint32_t kReadbackBufferSizeIncrement = 16 * 1024 * 1024;\n  ID3D12Resource* readback_buffer_ = nullptr;\n  uint32_t readback_buffer_size_ = 0;\n\n  std::atomic<bool> pix_capture_requested_ = false;\n  bool pix_capturing_;\n\n  // The current fixed-function drawing state.\n  D3D12_VIEWPORT ff_viewport_;\n  D3D12_RECT ff_scissor_;\n  float ff_blend_factor_[4];\n  uint32_t ff_stencil_ref_;\n  bool ff_viewport_update_needed_;\n  bool ff_scissor_update_needed_;\n  bool ff_blend_factor_update_needed_;\n  bool ff_stencil_ref_update_needed_;\n\n  // Currently bound pipeline, either a graphics pipeline from the pipeline\n  // cache (with potentially deferred creation - current_external_pipeline_ is\n  // nullptr in this case) or a non-Xenos graphics or compute pipeline\n  // (current_guest_pipeline_ is nullptr in this case).\n  void* current_guest_pipeline_;\n  ID3D12PipelineState* current_external_pipeline_;\n\n  // Currently bound graphics root signature.\n  ID3D12RootSignature* current_graphics_root_signature_;\n  // Extra parameters which may or may not be present.\n  RootBindfulExtraParameterIndices current_graphics_root_bindful_extras_;\n  // Whether root parameters are up to date - reset if a new signature is bound.\n  uint32_t current_graphics_root_up_to_date_;\n\n  // System shader constants.\n  DxbcShaderTranslator::SystemConstants system_constants_;\n\n  // Float constant usage masks of the last draw call.\n  uint64_t current_float_constant_map_vertex_[4];\n  uint64_t current_float_constant_map_pixel_[4];\n\n  // Constant buffer bindings.\n  struct ConstantBufferBinding {\n    D3D12_GPU_VIRTUAL_ADDRESS address;\n    bool up_to_date;\n  };\n  ConstantBufferBinding cbuffer_binding_system_;\n  ConstantBufferBinding cbuffer_binding_float_vertex_;\n  ConstantBufferBinding cbuffer_binding_float_pixel_;\n  ConstantBufferBinding cbuffer_binding_bool_loop_;\n  ConstantBufferBinding cbuffer_binding_fetch_;\n  ConstantBufferBinding cbuffer_binding_descriptor_indices_vertex_;\n  ConstantBufferBinding cbuffer_binding_descriptor_indices_pixel_;\n\n  // Whether the latest shared memory and EDRAM buffer binding contains the\n  // shared memory UAV rather than the SRV.\n  // Separate descriptor tables for the SRV and the UAV, even though only one is\n  // accessed dynamically in the shaders, are used to prevent a validation\n  // message about missing resource states in PIX.\n  std::optional<bool> current_shared_memory_binding_is_uav_;\n\n  // Pages with the descriptors currently used for handling Xenos draw calls.\n  uint64_t draw_view_bindful_heap_index_;\n  uint64_t draw_sampler_bindful_heap_index_;\n\n  // Whether the last used texture sampler bindings have been written to the\n  // current view descriptor heap.\n  bool bindful_textures_written_vertex_;\n  bool bindful_textures_written_pixel_;\n  bool bindful_samplers_written_vertex_;\n  bool bindful_samplers_written_pixel_;\n  // Layout UIDs and last texture and sampler bindings written to the current\n  // descriptor heaps (for bindful) or descriptor index constant buffer (for\n  // bindless) with the last used descriptor layout. Valid only when:\n  // - For bindful, when bindful_#_written_#_ is true.\n  // - For bindless, when cbuffer_binding_descriptor_indices_#_.up_to_date is\n  //   true.\n  size_t current_texture_layout_uid_vertex_;\n  size_t current_texture_layout_uid_pixel_;\n  size_t current_sampler_layout_uid_vertex_;\n  size_t current_sampler_layout_uid_pixel_;\n  // Size of these should be ignored when checking whether these are up to date,\n  // layout UID should be checked first (they will be different for different\n  // binding counts).\n  std::vector<D3D12TextureCache::TextureSRVKey>\n      current_texture_srv_keys_vertex_;\n  std::vector<D3D12TextureCache::TextureSRVKey> current_texture_srv_keys_pixel_;\n  std::vector<D3D12TextureCache::SamplerParameters> current_samplers_vertex_;\n  std::vector<D3D12TextureCache::SamplerParameters> current_samplers_pixel_;\n  std::vector<uint32_t> current_sampler_bindless_indices_vertex_;\n  std::vector<uint32_t> current_sampler_bindless_indices_pixel_;\n\n  // Latest bindful descriptor handles used for handling Xenos draw calls.\n  D3D12_GPU_DESCRIPTOR_HANDLE gpu_handle_shared_memory_srv_and_edram_;\n  D3D12_GPU_DESCRIPTOR_HANDLE gpu_handle_shared_memory_uav_and_edram_;\n  D3D12_GPU_DESCRIPTOR_HANDLE gpu_handle_textures_vertex_;\n  D3D12_GPU_DESCRIPTOR_HANDLE gpu_handle_textures_pixel_;\n  D3D12_GPU_DESCRIPTOR_HANDLE gpu_handle_samplers_vertex_;\n  D3D12_GPU_DESCRIPTOR_HANDLE gpu_handle_samplers_pixel_;\n\n  // Current primitive topology.\n  D3D_PRIMITIVE_TOPOLOGY primitive_topology_;\n\n  // Temporary storage for memexport stream constants used in the draw.\n  std::vector<draw_util::MemExportRange> memexport_ranges_;\n};\n\n}  // namespace d3d12\n}  // namespace gpu\n}  // namespace xe\n\n#endif  // XENIA_GPU_D3D12_D3D12_COMMAND_PROCESSOR_H_\n"
  },
  {
    "path": "src/xenia/gpu/d3d12/d3d12_graphics_system.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/d3d12/d3d12_graphics_system.h\"\n\n#include <algorithm>\n\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/gpu/d3d12/d3d12_command_processor.h\"\n#include \"xenia/gpu/draw_util.h\"\n#include \"xenia/ui/d3d12/d3d12_util.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace gpu {\nnamespace d3d12 {\n\nD3D12GraphicsSystem::D3D12GraphicsSystem() {}\n\nD3D12GraphicsSystem::~D3D12GraphicsSystem() {}\n\nbool D3D12GraphicsSystem::IsAvailable() {\n  return xe::ui::d3d12::D3D12Provider::IsD3D12APIAvailable();\n}\n\nstd::string D3D12GraphicsSystem::name() const {\n  auto d3d12_command_processor =\n      static_cast<D3D12CommandProcessor*>(command_processor());\n  if (d3d12_command_processor != nullptr) {\n    return d3d12_command_processor->GetWindowTitleText();\n  }\n  return \"Direct3D 12\";\n}\n\nX_STATUS D3D12GraphicsSystem::Setup(cpu::Processor* processor,\n                                    kernel::KernelState* kernel_state,\n                                    ui::WindowedAppContext* app_context,\n                                    bool with_presentation) {\n  provider_ = xe::ui::d3d12::D3D12Provider::Create();\n  return GraphicsSystem::Setup(processor, kernel_state, app_context,\n                               with_presentation);\n}\n\nstd::unique_ptr<CommandProcessor>\nD3D12GraphicsSystem::CreateCommandProcessor() {\n  return std::unique_ptr<CommandProcessor>(\n      new D3D12CommandProcessor(this, kernel_state_));\n}\n\n}  // namespace d3d12\n}  // namespace gpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/d3d12/d3d12_graphics_system.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_D3D12_D3D12_GRAPHICS_SYSTEM_H_\n#define XENIA_GPU_D3D12_D3D12_GRAPHICS_SYSTEM_H_\n\n#include <memory>\n\n#include \"xenia/gpu/command_processor.h\"\n#include \"xenia/gpu/d3d12/deferred_command_list.h\"\n#include \"xenia/gpu/graphics_system.h\"\n\nnamespace xe {\nnamespace gpu {\nnamespace d3d12 {\n\nclass D3D12GraphicsSystem : public GraphicsSystem {\n public:\n  D3D12GraphicsSystem();\n  ~D3D12GraphicsSystem() override;\n\n  static bool IsAvailable();\n\n  std::string name() const override;\n\n  X_STATUS Setup(cpu::Processor* processor, kernel::KernelState* kernel_state,\n                 ui::WindowedAppContext* app_context,\n                 bool with_presentation) override;\n\n protected:\n  std::unique_ptr<CommandProcessor> CreateCommandProcessor() override;\n};\n\n}  // namespace d3d12\n}  // namespace gpu\n}  // namespace xe\n\n#endif  // XENIA_GPU_D3D12_D3D12_GRAPHICS_SYSTEM_H_\n"
  },
  {
    "path": "src/xenia/gpu/d3d12/d3d12_primitive_processor.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/d3d12/d3d12_primitive_processor.h\"\n\n#include <algorithm>\n#include <cstdint>\n#include <memory>\n#include <utility>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/gpu/d3d12/d3d12_command_processor.h\"\n#include \"xenia/gpu/d3d12/deferred_command_list.h\"\n#include \"xenia/ui/d3d12/d3d12_provider.h\"\n#include \"xenia/ui/d3d12/d3d12_util.h\"\n\nnamespace xe {\nnamespace gpu {\nnamespace d3d12 {\n\nD3D12PrimitiveProcessor::~D3D12PrimitiveProcessor() { Shutdown(true); }\n\nbool D3D12PrimitiveProcessor::Initialize() {\n  if (!InitializeCommon(true, false, false, true, true, true)) {\n    Shutdown();\n    return false;\n  }\n  frame_index_buffer_pool_ = std::make_unique<ui::d3d12::D3D12UploadBufferPool>(\n      command_processor_.GetD3D12Provider(),\n      std::max(size_t(kMinRequiredConvertedIndexBufferSize),\n               ui::GraphicsUploadBufferPool::kDefaultPageSize));\n  return true;\n}\n\nvoid D3D12PrimitiveProcessor::Shutdown(bool from_destructor) {\n  frame_index_buffers_.clear();\n  frame_index_buffer_pool_.reset();\n  builtin_index_buffer_upload_.Reset();\n  builtin_index_buffer_gpu_address_ = 0;\n  builtin_index_buffer_.Reset();\n  if (!from_destructor) {\n    ShutdownCommon();\n  }\n}\n\nvoid D3D12PrimitiveProcessor::CompletedSubmissionUpdated() {\n  if (builtin_index_buffer_upload_ &&\n      command_processor_.GetCompletedSubmission() >=\n          builtin_index_buffer_upload_submission_) {\n    builtin_index_buffer_upload_.Reset();\n  }\n}\n\nvoid D3D12PrimitiveProcessor::BeginSubmission() {\n  if (builtin_index_buffer_upload_ &&\n      builtin_index_buffer_upload_submission_ == UINT64_MAX) {\n    // No need to submit deferred barriers - builtin_index_buffer_ has never\n    // been used yet, so it's in the initial state, and\n    // builtin_index_buffer_upload_ is in an upload heap, so it's GENERIC_READ.\n    command_processor_.GetDeferredCommandList().D3DCopyResource(\n        builtin_index_buffer_.Get(), builtin_index_buffer_upload_.Get());\n    command_processor_.PushTransitionBarrier(builtin_index_buffer_.Get(),\n                                             D3D12_RESOURCE_STATE_COPY_DEST,\n                                             D3D12_RESOURCE_STATE_INDEX_BUFFER);\n    builtin_index_buffer_upload_submission_ =\n        command_processor_.GetCurrentSubmission();\n  }\n}\n\nvoid D3D12PrimitiveProcessor::BeginFrame() {\n  frame_index_buffer_pool_->Reclaim(command_processor_.GetCompletedFrame());\n}\n\nvoid D3D12PrimitiveProcessor::EndFrame() {\n  ClearPerFrameCache();\n  frame_index_buffers_.clear();\n}\n\nbool D3D12PrimitiveProcessor::InitializeBuiltinIndexBuffer(\n    size_t size_bytes, std::function<void(void*)> fill_callback) {\n  assert_not_zero(size_bytes);\n  assert_null(builtin_index_buffer_);\n  assert_null(builtin_index_buffer_upload_);\n\n  const ui::d3d12::D3D12Provider& provider =\n      command_processor_.GetD3D12Provider();\n  ID3D12Device* device = provider.GetDevice();\n\n  D3D12_RESOURCE_DESC resource_desc;\n  ui::d3d12::util::FillBufferResourceDesc(resource_desc, UINT64(size_bytes),\n                                          D3D12_RESOURCE_FLAG_NONE);\n  Microsoft::WRL::ComPtr<ID3D12Resource> draw_resource;\n  if (FAILED(device->CreateCommittedResource(\n          &ui::d3d12::util::kHeapPropertiesDefault,\n          provider.GetHeapFlagCreateNotZeroed(), &resource_desc,\n          D3D12_RESOURCE_STATE_COPY_DEST, nullptr,\n          IID_PPV_ARGS(&draw_resource)))) {\n    XELOGE(\n        \"D3D12 primitive processor: Failed to create the built-in index \"\n        \"buffer GPU resource with {} bytes\",\n        size_bytes);\n    return false;\n  }\n  Microsoft::WRL::ComPtr<ID3D12Resource> upload_resource;\n  if (FAILED(device->CreateCommittedResource(\n          &ui::d3d12::util::kHeapPropertiesUpload,\n          provider.GetHeapFlagCreateNotZeroed(), &resource_desc,\n          D3D12_RESOURCE_STATE_GENERIC_READ, nullptr,\n          IID_PPV_ARGS(&upload_resource)))) {\n    XELOGE(\n        \"D3D12 primitive processor: Failed to create the built-in index \"\n        \"buffer upload resource with {} bytes\",\n        size_bytes);\n    return false;\n  }\n\n  D3D12_RANGE upload_read_range = {};\n  void* mapping;\n  if (FAILED(upload_resource->Map(0, &upload_read_range, &mapping))) {\n    XELOGE(\n        \"D3D12 primitive processor: Failed to map the built-in index buffer \"\n        \"upload resource with {} bytes\",\n        size_bytes);\n    return false;\n  }\n  fill_callback(reinterpret_cast<uint16_t*>(mapping));\n  upload_resource->Unmap(0, nullptr);\n\n  // Successfully created the buffer and wrote the data to upload.\n  builtin_index_buffer_ = std::move(draw_resource);\n  builtin_index_buffer_gpu_address_ =\n      builtin_index_buffer_->GetGPUVirtualAddress();\n  builtin_index_buffer_upload_ = std::move(upload_resource);\n  // Schedule uploading in the first submission.\n  builtin_index_buffer_upload_submission_ = UINT64_MAX;\n  return true;\n}\n\nvoid* D3D12PrimitiveProcessor::RequestHostConvertedIndexBufferForCurrentFrame(\n    xenos::IndexFormat format, uint32_t index_count, bool coalign_for_simd,\n    uint32_t coalignment_original_address, size_t& backend_handle_out) {\n  size_t index_size = format == xenos::IndexFormat::kInt16 ? sizeof(uint16_t)\n                                                           : sizeof(uint32_t);\n  D3D12_GPU_VIRTUAL_ADDRESS gpu_address;\n  uint8_t* mapping = frame_index_buffer_pool_->Request(\n      command_processor_.GetCurrentFrame(),\n      index_size * index_count +\n          (coalign_for_simd ? XE_GPU_PRIMITIVE_PROCESSOR_SIMD_SIZE : 0),\n      index_size, nullptr, nullptr, &gpu_address);\n  if (!mapping) {\n    return nullptr;\n  }\n  if (coalign_for_simd) {\n    ptrdiff_t coalignment_offset =\n        GetSimdCoalignmentOffset(mapping, coalignment_original_address);\n    mapping += coalignment_offset;\n    gpu_address = D3D12_GPU_VIRTUAL_ADDRESS(gpu_address + coalignment_offset);\n  }\n  backend_handle_out = frame_index_buffers_.size();\n  frame_index_buffers_.push_back(gpu_address);\n  return mapping;\n}\n\n}  // namespace d3d12\n}  // namespace gpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/d3d12/d3d12_primitive_processor.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_D3D12_D3D12_PRIMITIVE_PROCESSOR_H_\n#define XENIA_GPU_D3D12_D3D12_PRIMITIVE_PROCESSOR_H_\n\n#include <cstdint>\n#include <deque>\n#include <memory>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/gpu/primitive_processor.h\"\n#include \"xenia/ui/d3d12/d3d12_api.h\"\n#include \"xenia/ui/d3d12/d3d12_upload_buffer_pool.h\"\n\nnamespace xe {\nnamespace gpu {\nnamespace d3d12 {\n\nclass D3D12CommandProcessor;\n\nclass D3D12PrimitiveProcessor final : public PrimitiveProcessor {\n public:\n  D3D12PrimitiveProcessor(const RegisterFile& register_file, Memory& memory,\n                          TraceWriter& trace_writer,\n                          SharedMemory& shared_memory,\n                          D3D12CommandProcessor& command_processor)\n      : PrimitiveProcessor(register_file, memory, trace_writer, shared_memory),\n        command_processor_(command_processor) {}\n  ~D3D12PrimitiveProcessor();\n\n  bool Initialize();\n  void Shutdown(bool from_destructor = false);\n  void ClearCache() { frame_index_buffer_pool_->ClearCache(); }\n\n  void CompletedSubmissionUpdated();\n  void BeginSubmission();\n  void BeginFrame();\n  void EndFrame();\n\n  D3D12_GPU_VIRTUAL_ADDRESS GetBuiltinIndexBufferGpuAddress(\n      size_t handle) const {\n    assert_not_null(builtin_index_buffer_);\n    return D3D12_GPU_VIRTUAL_ADDRESS(builtin_index_buffer_gpu_address_ +\n                                     GetBuiltinIndexBufferOffsetBytes(handle));\n  }\n  D3D12_GPU_VIRTUAL_ADDRESS GetConvertedIndexBufferGpuAddress(\n      size_t handle) const {\n    return frame_index_buffers_[handle];\n  }\n\n protected:\n  bool InitializeBuiltinIndexBuffer(\n      size_t size_bytes, std::function<void(void*)> fill_callback) override;\n\n  void* RequestHostConvertedIndexBufferForCurrentFrame(\n      xenos::IndexFormat format, uint32_t index_count, bool coalign_for_simd,\n      uint32_t coalignment_original_address,\n      size_t& backend_handle_out) override;\n\n private:\n  D3D12CommandProcessor& command_processor_;\n\n  Microsoft::WRL::ComPtr<ID3D12Resource> builtin_index_buffer_;\n  D3D12_GPU_VIRTUAL_ADDRESS builtin_index_buffer_gpu_address_ = 0;\n  // Temporary buffer copied in the beginning of the first submission for\n  // uploading to builtin_index_buffer_, destroyed when the submission when it\n  // was uploaded is completed.\n  Microsoft::WRL::ComPtr<ID3D12Resource> builtin_index_buffer_upload_;\n  // UINT64_MAX means not uploaded yet and needs uploading in the first\n  // submission (if the upload buffer exists at all).\n  uint64_t builtin_index_buffer_upload_submission_ = UINT64_MAX;\n\n  std::unique_ptr<ui::d3d12::D3D12UploadBufferPool> frame_index_buffer_pool_;\n  // Indexed by the backend handles.\n  std::deque<D3D12_GPU_VIRTUAL_ADDRESS> frame_index_buffers_;\n};\n\n}  // namespace d3d12\n}  // namespace gpu\n}  // namespace xe\n\n#endif  // XENIA_GPU_D3D12_D3D12_PRIMITIVE_PROCESSOR_H_\n"
  },
  {
    "path": "src/xenia/gpu/d3d12/d3d12_render_target_cache.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/d3d12/d3d12_render_target_cache.h\"\n\n#include <algorithm>\n#include <array>\n#include <cstdint>\n#include <cstring>\n#include <iterator>\n#include <memory>\n#include <string>\n#include <tuple>\n#include <utility>\n\n#include \"third_party/dxbc/DXBCChecksum.h\"\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/cvar.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/string.h\"\n#include \"xenia/gpu/d3d12/d3d12_command_processor.h\"\n#include \"xenia/gpu/d3d12/d3d12_texture_cache.h\"\n#include \"xenia/gpu/d3d12/deferred_command_list.h\"\n#include \"xenia/gpu/draw_util.h\"\n#include \"xenia/gpu/dxbc.h\"\n#include \"xenia/gpu/dxbc_shader_translator.h\"\n#include \"xenia/gpu/gpu_flags.h\"\n#include \"xenia/gpu/trace_writer.h\"\n#include \"xenia/gpu/xenos.h\"\n#include \"xenia/ui/d3d12/d3d12_provider.h\"\n#include \"xenia/ui/d3d12/d3d12_util.h\"\n\nDEFINE_bool(\n    native_stencil_value_output_d3d12_intel, false,\n    \"Allow stencil reference output usage on Direct3D 12 on Intel GPUs - not \"\n    \"working on UHD Graphics 630 as of March 2021 (driver 27.20.0100.8336).\",\n    \"GPU\");\n// TODO(Triang3l): Make ROV the default when it's optimized better (for\n// instance, using static shader modifications to pass render target\n// parameters).\nDEFINE_string(\n    render_target_path_d3d12, \"\",\n    \"Render target emulation path to use on Direct3D 12.\\n\"\n    \"Use: [any, rtv, rov]\\n\"\n    \" rtv:\\n\"\n    \"  Host render targets and fixed-function blending and depth / stencil \"\n    \"testing, copying between render targets when needed.\\n\"\n    \"  Lower accuracy (limited pixel format support).\\n\"\n    \"  Performance limited primarily by render target layout changes requiring \"\n    \"copying, but generally higher.\\n\"\n    \" rov:\\n\"\n    \"  Manual pixel packing, blending and depth / stencil testing, with free \"\n    \"render target layout changes.\\n\"\n    \"  Requires a GPU supporting rasterizer-ordered views.\\n\"\n    \"  Highest accuracy (all pixel formats handled in software).\\n\"\n    \"  Performance limited primarily by overdraw.\\n\"\n    \"  On AMD drivers, currently causes shader compiler crashes in many \"\n    \"cases.\\n\"\n    \" Any other value:\\n\"\n    \"  Choose what is considered the most optimal for the system (currently \"\n    \"always RTV because the ROV path is much slower now, except for Intel \"\n    \"GPUs, which have a bug in stencil testing that causes Xbox 360 Direct3D 9 \"\n    \"clears not to work).\",\n    \"GPU\");\n\nnamespace xe {\nnamespace gpu {\nnamespace d3d12 {\n\n// Generated with `xb buildshaders`.\nnamespace shaders {\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/clear_uint2_ps.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/fullscreen_cw_vs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/host_depth_store_1xmsaa_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/host_depth_store_2xmsaa_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/host_depth_store_4xmsaa_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/passthrough_position_xy_vs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/resolve_clear_32bpp_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/resolve_clear_32bpp_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/resolve_clear_64bpp_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/resolve_clear_64bpp_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/resolve_fast_32bpp_1x2xmsaa_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/resolve_fast_32bpp_1x2xmsaa_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/resolve_fast_32bpp_4xmsaa_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/resolve_fast_32bpp_4xmsaa_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/resolve_fast_64bpp_1x2xmsaa_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/resolve_fast_64bpp_1x2xmsaa_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/resolve_fast_64bpp_4xmsaa_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/resolve_fast_64bpp_4xmsaa_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/resolve_full_128bpp_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/resolve_full_128bpp_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/resolve_full_16bpp_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/resolve_full_16bpp_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/resolve_full_32bpp_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/resolve_full_32bpp_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/resolve_full_64bpp_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/resolve_full_64bpp_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/resolve_full_8bpp_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/resolve_full_8bpp_scaled_cs.h\"\n}  // namespace shaders\n\nconst D3D12RenderTargetCache::ResolveCopyShaderCode\n    D3D12RenderTargetCache::kResolveCopyShaders[size_t(\n        draw_util::ResolveCopyShaderIndex::kCount)] = {\n        {shaders::resolve_fast_32bpp_1x2xmsaa_cs,\n         sizeof(shaders::resolve_fast_32bpp_1x2xmsaa_cs),\n         shaders::resolve_fast_32bpp_1x2xmsaa_scaled_cs,\n         sizeof(shaders::resolve_fast_32bpp_1x2xmsaa_scaled_cs)},\n        {shaders::resolve_fast_32bpp_4xmsaa_cs,\n         sizeof(shaders::resolve_fast_32bpp_4xmsaa_cs),\n         shaders::resolve_fast_32bpp_4xmsaa_scaled_cs,\n         sizeof(shaders::resolve_fast_32bpp_4xmsaa_scaled_cs)},\n        {shaders::resolve_fast_64bpp_1x2xmsaa_cs,\n         sizeof(shaders::resolve_fast_64bpp_1x2xmsaa_cs),\n         shaders::resolve_fast_64bpp_1x2xmsaa_scaled_cs,\n         sizeof(shaders::resolve_fast_64bpp_1x2xmsaa_scaled_cs)},\n        {shaders::resolve_fast_64bpp_4xmsaa_cs,\n         sizeof(shaders::resolve_fast_64bpp_4xmsaa_cs),\n         shaders::resolve_fast_64bpp_4xmsaa_scaled_cs,\n         sizeof(shaders::resolve_fast_64bpp_4xmsaa_scaled_cs)},\n        {shaders::resolve_full_8bpp_cs, sizeof(shaders::resolve_full_8bpp_cs),\n         shaders::resolve_full_8bpp_scaled_cs,\n         sizeof(shaders::resolve_full_8bpp_scaled_cs)},\n        {shaders::resolve_full_16bpp_cs, sizeof(shaders::resolve_full_16bpp_cs),\n         shaders::resolve_full_16bpp_scaled_cs,\n         sizeof(shaders::resolve_full_16bpp_scaled_cs)},\n        {shaders::resolve_full_32bpp_cs, sizeof(shaders::resolve_full_32bpp_cs),\n         shaders::resolve_full_32bpp_scaled_cs,\n         sizeof(shaders::resolve_full_32bpp_scaled_cs)},\n        {shaders::resolve_full_64bpp_cs, sizeof(shaders::resolve_full_64bpp_cs),\n         shaders::resolve_full_64bpp_scaled_cs,\n         sizeof(shaders::resolve_full_64bpp_scaled_cs)},\n        {shaders::resolve_full_128bpp_cs,\n         sizeof(shaders::resolve_full_128bpp_cs),\n         shaders::resolve_full_128bpp_scaled_cs,\n         sizeof(shaders::resolve_full_128bpp_scaled_cs)},\n};\n\nconst uint32_t D3D12RenderTargetCache::kTransferUsedRootParameters[size_t(\n    TransferRootSignatureIndex::kCount)] = {\n    // kColor\n    kTransferUsedRootParameterColorSRVBit |\n        kTransferUsedRootParameterAddressConstantBit,\n    // kDepth\n    kTransferUsedRootParameterDepthSRVBit |\n        kTransferUsedRootParameterAddressConstantBit,\n    // kDepthStencil\n    kTransferUsedRootParameterDepthSRVBit |\n        kTransferUsedRootParameterStencilSRVBit |\n        kTransferUsedRootParameterAddressConstantBit,\n    // kColorToStencilBit\n    kTransferUsedRootParameterStencilMaskConstantBit |\n        kTransferUsedRootParameterColorSRVBit |\n        kTransferUsedRootParameterAddressConstantBit,\n    // kStencilToStencilBit\n    kTransferUsedRootParameterStencilMaskConstantBit |\n        kTransferUsedRootParameterStencilSRVBit |\n        kTransferUsedRootParameterAddressConstantBit,\n    // kColorAndHostDepth\n    kTransferUsedRootParameterColorSRVBit |\n        kTransferUsedRootParameterAddressConstantBit |\n        kTransferUsedRootParameterHostDepthSRVBit |\n        kTransferUsedRootParameterHostDepthAddressConstantBit,\n    // kDepthAndHostDepth\n    kTransferUsedRootParameterDepthSRVBit |\n        kTransferUsedRootParameterAddressConstantBit |\n        kTransferUsedRootParameterHostDepthSRVBit |\n        kTransferUsedRootParameterHostDepthAddressConstantBit,\n    // kDepthStencilAndHostDepth\n    kTransferUsedRootParameterDepthSRVBit |\n        kTransferUsedRootParameterStencilSRVBit |\n        kTransferUsedRootParameterAddressConstantBit |\n        kTransferUsedRootParameterHostDepthSRVBit |\n        kTransferUsedRootParameterHostDepthAddressConstantBit,\n};\n\nconst D3D12RenderTargetCache::TransferModeInfo\n    D3D12RenderTargetCache::kTransferModes[size_t(TransferMode::kCount)] = {\n        // kColorToDepth\n        {TransferOutput::kDepth, TransferRootSignatureIndex::kColor,\n         TransferRootSignatureIndex::kColor},\n        // kColorToColor\n        {TransferOutput::kColor, TransferRootSignatureIndex::kColor,\n         TransferRootSignatureIndex::kColor},\n        // kDepthToDepth\n        {TransferOutput::kDepth, TransferRootSignatureIndex::kDepth,\n         TransferRootSignatureIndex::kDepthStencil},\n        // kDepthToColor\n        {TransferOutput::kColor, TransferRootSignatureIndex::kDepthStencil,\n         TransferRootSignatureIndex::kDepthStencil},\n        // kColorToStencilBit\n        {TransferOutput::kStencilBit,\n         TransferRootSignatureIndex::kColorToStencilBit,\n         TransferRootSignatureIndex::kColorToStencilBit},\n        // kDepthToStencilBit\n        {TransferOutput::kStencilBit,\n         TransferRootSignatureIndex::kStencilToStencilBit,\n         TransferRootSignatureIndex::kStencilToStencilBit},\n        // kColorAndHostDepthToDepth\n        {TransferOutput::kDepth, TransferRootSignatureIndex::kColorAndHostDepth,\n         TransferRootSignatureIndex::kColorAndHostDepth},\n        // kDepthAndHostDepthToDepth\n        {TransferOutput::kDepth, TransferRootSignatureIndex::kDepthAndHostDepth,\n         TransferRootSignatureIndex::kDepthStencilAndHostDepth},\n};\n\nD3D12RenderTargetCache::~D3D12RenderTargetCache() { Shutdown(true); }\n\nbool D3D12RenderTargetCache::Initialize() {\n  const ui::d3d12::D3D12Provider& provider =\n      command_processor_.GetD3D12Provider();\n  ID3D12Device* device = provider.GetDevice();\n\n  if (cvars::render_target_path_d3d12 == \"rtv\") {\n    path_ = Path::kHostRenderTargets;\n  } else if (cvars::render_target_path_d3d12 == \"rov\") {\n    path_ = Path::kPixelShaderInterlock;\n  } else {\n    // As of April 2021 (driver version 27.20.0100.9316), on Intel (tested on\n    // UHD Graphics 630), the \"always\" stencil comparison function isn't working\n    // properly, so clears in the Xbox 360's Direct3D 9 don't work. Forcing ROV\n    // there.\n#if 1\n    // The ROV path is currently much slower generally.\n    // TODO(Triang3l): Make ROV the default when it's optimized better (for\n    // instance, using static shader modifications to pass render target\n    // parameters).\n    path_ = provider.GetAdapterVendorID() ==\n                    ui::GraphicsProvider::GpuVendorID::kIntel\n                ? Path::kPixelShaderInterlock\n                : Path::kHostRenderTargets;\n#else\n    // The AMD shader compiler crashes very often with Xenia's custom\n    // output-merger code as of March 2021.\n    path_ =\n        provider.GetAdapterVendorID() == ui::GraphicsProvider::GpuVendorID::kAMD\n            ? Path::kHostRenderTargets\n            : Path::kPixelShaderInterlock;\n#endif\n  }\n  if (path_ == Path::kPixelShaderInterlock &&\n      !provider.AreRasterizerOrderedViewsSupported()) {\n    path_ = Path::kHostRenderTargets;\n  }\n\n  // Create the buffer for reinterpreting EDRAM contents.\n  uint32_t edram_buffer_size =\n      xenos::kEdramSizeBytes *\n      (draw_resolution_scale_x() * draw_resolution_scale_y());\n  D3D12_RESOURCE_DESC edram_buffer_desc;\n  ui::d3d12::util::FillBufferResourceDesc(\n      edram_buffer_desc, edram_buffer_size,\n      D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS);\n  // The first operation will likely be depth self-comparison with host render\n  // targets or drawing with ROV.\n  edram_buffer_state_ = D3D12_RESOURCE_STATE_UNORDERED_ACCESS;\n  // Creating zeroed for stable initial value with ROV (though on a real\n  // console it has to be cleared anyway probably) and not to leak irrelevant\n  // data to trace dumps when not covered by host render targets entirely.\n  if (FAILED(device->CreateCommittedResource(\n          &ui::d3d12::util::kHeapPropertiesDefault, D3D12_HEAP_FLAG_NONE,\n          &edram_buffer_desc, edram_buffer_state_, nullptr,\n          IID_PPV_ARGS(&edram_buffer_)))) {\n    XELOGE(\"D3D12RenderTargetCache: Failed to create the EDRAM buffer\");\n    Shutdown();\n    return false;\n  }\n  edram_buffer_->SetName(L\"EDRAM Buffer\");\n  edram_buffer_gpu_address_ = edram_buffer_->GetGPUVirtualAddress();\n  edram_buffer_modification_status_ =\n      EdramBufferModificationStatus::kUnmodified;\n\n  // Create non-shader-visible descriptors of the EDRAM buffer for copying.\n  D3D12_DESCRIPTOR_HEAP_DESC edram_buffer_descriptor_heap_desc;\n  edram_buffer_descriptor_heap_desc.Type =\n      D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV;\n  edram_buffer_descriptor_heap_desc.NumDescriptors =\n      uint32_t(EdramBufferDescriptorIndex::kCount);\n  edram_buffer_descriptor_heap_desc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE;\n  edram_buffer_descriptor_heap_desc.NodeMask = 0;\n  if (FAILED(device->CreateDescriptorHeap(\n          &edram_buffer_descriptor_heap_desc,\n          IID_PPV_ARGS(&edram_buffer_descriptor_heap_)))) {\n    XELOGE(\n        \"D3D12RenderTargetCache: Failed to create the descriptor heap for \"\n        \"EDRAM buffer views\");\n    Shutdown();\n    return false;\n  }\n  edram_buffer_descriptor_heap_start_ =\n      edram_buffer_descriptor_heap_->GetCPUDescriptorHandleForHeapStart();\n  ui::d3d12::util::CreateBufferRawSRV(\n      device,\n      provider.OffsetViewDescriptor(\n          edram_buffer_descriptor_heap_start_,\n          uint32_t(EdramBufferDescriptorIndex::kRawSRV)),\n      edram_buffer_, edram_buffer_size);\n  ui::d3d12::util::CreateBufferTypedSRV(\n      device,\n      provider.OffsetViewDescriptor(\n          edram_buffer_descriptor_heap_start_,\n          uint32_t(EdramBufferDescriptorIndex::kR32UintSRV)),\n      edram_buffer_, DXGI_FORMAT_R32_UINT, edram_buffer_size >> 2);\n  ui::d3d12::util::CreateBufferTypedSRV(\n      device,\n      provider.OffsetViewDescriptor(\n          edram_buffer_descriptor_heap_start_,\n          uint32_t(EdramBufferDescriptorIndex::kR32G32UintSRV)),\n      edram_buffer_, DXGI_FORMAT_R32G32_UINT, edram_buffer_size >> 3);\n  ui::d3d12::util::CreateBufferTypedSRV(\n      device,\n      provider.OffsetViewDescriptor(\n          edram_buffer_descriptor_heap_start_,\n          uint32_t(EdramBufferDescriptorIndex::kR32G32B32A32UintSRV)),\n      edram_buffer_, DXGI_FORMAT_R32G32B32A32_UINT, edram_buffer_size >> 4);\n  ui::d3d12::util::CreateBufferRawUAV(\n      device,\n      provider.OffsetViewDescriptor(\n          edram_buffer_descriptor_heap_start_,\n          uint32_t(EdramBufferDescriptorIndex::kRawUAV)),\n      edram_buffer_, edram_buffer_size);\n  ui::d3d12::util::CreateBufferTypedUAV(\n      device,\n      provider.OffsetViewDescriptor(\n          edram_buffer_descriptor_heap_start_,\n          uint32_t(EdramBufferDescriptorIndex::kR32UintUAV)),\n      edram_buffer_, DXGI_FORMAT_R32_UINT, edram_buffer_size >> 2);\n  ui::d3d12::util::CreateBufferTypedUAV(\n      device,\n      provider.OffsetViewDescriptor(\n          edram_buffer_descriptor_heap_start_,\n          uint32_t(EdramBufferDescriptorIndex::kR32G32UintUAV)),\n      edram_buffer_, DXGI_FORMAT_R32G32_UINT, edram_buffer_size >> 3);\n  ui::d3d12::util::CreateBufferTypedUAV(\n      device,\n      provider.OffsetViewDescriptor(\n          edram_buffer_descriptor_heap_start_,\n          uint32_t(EdramBufferDescriptorIndex::kR32G32B32A32UintUAV)),\n      edram_buffer_, DXGI_FORMAT_R32G32B32A32_UINT, edram_buffer_size >> 4);\n\n  bool draw_resolution_scaled = IsDrawResolutionScaled();\n\n  // Create the resolve copying root signature.\n  std::array<D3D12_ROOT_PARAMETER, 3> resolve_copy_root_parameters;\n  // Parameter 0 is constants.\n  resolve_copy_root_parameters[0].ParameterType =\n      D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS;\n  resolve_copy_root_parameters[0].Constants.ShaderRegister = 0;\n  resolve_copy_root_parameters[0].Constants.RegisterSpace = 0;\n  // Binding all of the shared memory at 1x resolution, portions with scaled\n  // resolution.\n  resolve_copy_root_parameters[0].Constants.Num32BitValues =\n      (draw_resolution_scaled\n           ? sizeof(draw_util::ResolveCopyShaderConstants::DestRelative)\n           : sizeof(draw_util::ResolveCopyShaderConstants)) /\n      sizeof(uint32_t);\n  resolve_copy_root_parameters[0].ShaderVisibility =\n      D3D12_SHADER_VISIBILITY_ALL;\n  // Parameter 1 is the destination (shared memory).\n  resolve_copy_root_parameters[1].ParameterType = D3D12_ROOT_PARAMETER_TYPE_UAV;\n  resolve_copy_root_parameters[1].Descriptor.ShaderRegister = 0;\n  resolve_copy_root_parameters[1].Descriptor.RegisterSpace = 0;\n  resolve_copy_root_parameters[1].ShaderVisibility =\n      D3D12_SHADER_VISIBILITY_ALL;\n  // Parameter 2 is the source (EDRAM).\n  resolve_copy_root_parameters[2].ParameterType = D3D12_ROOT_PARAMETER_TYPE_SRV;\n  resolve_copy_root_parameters[2].Descriptor.ShaderRegister = 0;\n  resolve_copy_root_parameters[2].Descriptor.RegisterSpace = 0;\n  resolve_copy_root_parameters[2].ShaderVisibility =\n      D3D12_SHADER_VISIBILITY_ALL;\n  D3D12_ROOT_SIGNATURE_DESC resolve_copy_root_signature_desc;\n  resolve_copy_root_signature_desc.NumParameters =\n      UINT(resolve_copy_root_parameters.size());\n  resolve_copy_root_signature_desc.pParameters =\n      resolve_copy_root_parameters.data();\n  resolve_copy_root_signature_desc.NumStaticSamplers = 0;\n  resolve_copy_root_signature_desc.pStaticSamplers = nullptr;\n  resolve_copy_root_signature_desc.Flags = D3D12_ROOT_SIGNATURE_FLAG_NONE;\n  resolve_copy_root_signature_ = ui::d3d12::util::CreateRootSignature(\n      provider, resolve_copy_root_signature_desc);\n  if (resolve_copy_root_signature_ == nullptr) {\n    XELOGE(\n        \"D3D12RenderTargetCache: Failed to create the resolve copy root \"\n        \"signature\");\n    Shutdown();\n    return false;\n  }\n\n  // Create the resolve copying pipelines.\n  for (size_t i = 0; i < size_t(draw_util::ResolveCopyShaderIndex::kCount);\n       ++i) {\n    const draw_util::ResolveCopyShaderInfo& resolve_copy_shader_info =\n        draw_util::resolve_copy_shader_info[i];\n    const ResolveCopyShaderCode& resolve_copy_shader_code =\n        kResolveCopyShaders[i];\n    // Somewhat verification whether resolve_copy_shaders_ is up to date.\n    assert_true(resolve_copy_shader_code.unscaled &&\n                resolve_copy_shader_code.unscaled_size &&\n                resolve_copy_shader_code.scaled &&\n                resolve_copy_shader_code.scaled_size);\n    ID3D12PipelineState* resolve_copy_pipeline =\n        ui::d3d12::util::CreateComputePipeline(\n            device,\n            draw_resolution_scaled ? resolve_copy_shader_code.scaled\n                                   : resolve_copy_shader_code.unscaled,\n            draw_resolution_scaled ? resolve_copy_shader_code.scaled_size\n                                   : resolve_copy_shader_code.unscaled_size,\n            resolve_copy_root_signature_);\n    if (resolve_copy_pipeline == nullptr) {\n      XELOGE(\n          \"D3D12RenderTargetCache: Failed to create {} resolve copy pipeline\",\n          resolve_copy_shader_info.debug_name);\n      Shutdown();\n      return false;\n    }\n    std::u16string resolve_copy_pipeline_name =\n        xe::to_utf16(resolve_copy_shader_info.debug_name);\n    resolve_copy_pipeline->SetName(\n        reinterpret_cast<LPCWSTR>(resolve_copy_pipeline_name.c_str()));\n    resolve_copy_pipelines_[i] = resolve_copy_pipeline;\n  }\n\n  // Using the cvar on emulator initialization so used pipelines are consistent\n  // across different titles launched in one emulator instance.\n  use_stencil_reference_output_ =\n      cvars::native_stencil_value_output &&\n      provider.IsPSSpecifiedStencilReferenceSupported() &&\n      (cvars::native_stencil_value_output_d3d12_intel ||\n       provider.GetAdapterVendorID() !=\n           ui::GraphicsProvider::GpuVendorID::kIntel);\n\n  if (path_ == Path::kHostRenderTargets) {\n    // Host render targets.\n\n    gamma_render_target_as_unorm16_ = cvars::gamma_render_target_as_unorm16;\n\n    depth_float24_round_ = cvars::depth_float24_round;\n    depth_float24_convert_in_pixel_shader_ =\n        cvars::depth_float24_convert_in_pixel_shader;\n\n    // Check if 2x MSAA is supported or needs to be emulated with 4x MSAA\n    // instead.\n    if (cvars::native_2x_msaa) {\n      msaa_2x_supported_ = true;\n      static const DXGI_FORMAT kRenderTargetDXGIFormats[] = {\n          DXGI_FORMAT_R16G16B16A16_FLOAT,\n          DXGI_FORMAT_R16G16B16A16_SNORM,\n          DXGI_FORMAT_R32G32_FLOAT,\n          DXGI_FORMAT_D32_FLOAT_S8X24_UINT,\n          DXGI_FORMAT_R10G10B10A2_UNORM,\n          DXGI_FORMAT_R8G8B8A8_UNORM,\n          DXGI_FORMAT_R16G16_FLOAT,\n          DXGI_FORMAT_R16G16_SNORM,\n          DXGI_FORMAT_R32_FLOAT,\n          DXGI_FORMAT_D24_UNORM_S8_UINT,\n          // For ownership transfer.\n          DXGI_FORMAT_R16G16B16A16_UINT,\n          DXGI_FORMAT_R32G32_UINT,\n          DXGI_FORMAT_R16G16_UINT,\n          DXGI_FORMAT_R32_UINT,\n      };\n      D3D12_FEATURE_DATA_MULTISAMPLE_QUALITY_LEVELS multisample_quality_levels;\n      multisample_quality_levels.SampleCount = 2;\n      multisample_quality_levels.Flags =\n          D3D12_MULTISAMPLE_QUALITY_LEVELS_FLAG_NONE;\n      for (size_t i = 0; i < xe::countof(kRenderTargetDXGIFormats); ++i) {\n        multisample_quality_levels.Format = kRenderTargetDXGIFormats[i];\n        multisample_quality_levels.NumQualityLevels = 0;\n        if (FAILED(device->CheckFeatureSupport(\n                D3D12_FEATURE_MULTISAMPLE_QUALITY_LEVELS,\n                &multisample_quality_levels,\n                sizeof(multisample_quality_levels))) ||\n            !multisample_quality_levels.NumQualityLevels) {\n          msaa_2x_supported_ = false;\n          break;\n        }\n      }\n      if (msaa_2x_supported_ && gamma_render_target_as_unorm16_) {\n        multisample_quality_levels.Format = DXGI_FORMAT_R16G16B16A16_UNORM;\n        multisample_quality_levels.NumQualityLevels = 0;\n        if (FAILED(device->CheckFeatureSupport(\n                D3D12_FEATURE_MULTISAMPLE_QUALITY_LEVELS,\n                &multisample_quality_levels,\n                sizeof(multisample_quality_levels))) ||\n            !multisample_quality_levels.NumQualityLevels) {\n          msaa_2x_supported_ = false;\n        }\n      }\n    } else {\n      msaa_2x_supported_ = false;\n    }\n    if (!msaa_2x_supported_) {\n      XELOGW(\n          \"2x MSAA is not supported, emulated via top-left and bottom-right \"\n          \"samples of 4x MSAA\");\n    }\n\n    descriptor_pool_color_ =\n        std::make_unique<ui::d3d12::D3D12CpuDescriptorPool>(\n            provider, D3D12_DESCRIPTOR_HEAP_TYPE_RTV, 11);\n    descriptor_pool_depth_ =\n        std::make_unique<ui::d3d12::D3D12CpuDescriptorPool>(\n            provider, D3D12_DESCRIPTOR_HEAP_TYPE_DSV, 11);\n    descriptor_pool_srv_ = std::make_unique<ui::d3d12::D3D12CpuDescriptorPool>(\n        provider, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV, 11);\n\n    // Create null render target descriptors for gaps, must be fully typed\n    // (though in pipeline states, DXGI_FORMAT_UNKNOWN must be used instead -\n    // this would also cause a mismatching format error in the debug layer, but\n    // it's a bug in the debug layer itself - needs to be suppressed, and\n    // already fixed in some version of Windows).\n    null_rtv_descriptor_ss_ = descriptor_pool_color_->AllocateDescriptor();\n    null_rtv_descriptor_ms_ = descriptor_pool_color_->AllocateDescriptor();\n    if (!null_rtv_descriptor_ss_ || !null_rtv_descriptor_ms_) {\n      Shutdown();\n      return false;\n    }\n    D3D12_RENDER_TARGET_VIEW_DESC null_rtv_desc;\n    // The format doesn't matter, but it must be bindable as a render target,\n    // not DXGI_FORMAT_UNKNOWN.\n    null_rtv_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;\n    null_rtv_desc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2D;\n    null_rtv_desc.Texture2D.MipSlice = 0;\n    null_rtv_desc.Texture2D.PlaneSlice = 0;\n    device->CreateRenderTargetView(nullptr, &null_rtv_desc,\n                                   null_rtv_descriptor_ss_.GetHandle());\n    null_rtv_desc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2DMS;\n    device->CreateRenderTargetView(nullptr, &null_rtv_desc,\n                                   null_rtv_descriptor_ms_.GetHandle());\n\n    // For host depth -> same depth transfers, host depth storing root signature\n    // and pipelines.\n    D3D12_ROOT_PARAMETER\n    host_depth_store_root_parameters[kHostDepthStoreRootParameterCount];\n    // Constants.\n    D3D12_ROOT_PARAMETER& host_depth_store_root_constants =\n        host_depth_store_root_parameters[kHostDepthStoreRootParameterConstants];\n    host_depth_store_root_constants.ParameterType =\n        D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS;\n    host_depth_store_root_constants.Constants.ShaderRegister = 0;\n    host_depth_store_root_constants.Constants.RegisterSpace = 0;\n    host_depth_store_root_constants.Constants.Num32BitValues =\n        sizeof(HostDepthStoreConstants) / sizeof(uint32_t);\n    host_depth_store_root_constants.ShaderVisibility =\n        D3D12_SHADER_VISIBILITY_ALL;\n    // Source.\n    D3D12_DESCRIPTOR_RANGE host_depth_store_root_source_range;\n    host_depth_store_root_source_range.RangeType =\n        D3D12_DESCRIPTOR_RANGE_TYPE_SRV;\n    host_depth_store_root_source_range.NumDescriptors = 1;\n    host_depth_store_root_source_range.BaseShaderRegister = 0;\n    host_depth_store_root_source_range.RegisterSpace = 0;\n    host_depth_store_root_source_range.OffsetInDescriptorsFromTableStart = 0;\n    D3D12_ROOT_PARAMETER& host_depth_store_root_source =\n        host_depth_store_root_parameters[kHostDepthStoreRootParameterSource];\n    host_depth_store_root_source.ParameterType =\n        D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;\n    host_depth_store_root_source.DescriptorTable.NumDescriptorRanges = 1;\n    host_depth_store_root_source.DescriptorTable.pDescriptorRanges =\n        &host_depth_store_root_source_range;\n    host_depth_store_root_source.ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;\n    // Destination.\n    D3D12_ROOT_PARAMETER& host_depth_store_root_dest =\n        host_depth_store_root_parameters[kHostDepthStoreRootParameterDest];\n    host_depth_store_root_dest.ParameterType = D3D12_ROOT_PARAMETER_TYPE_UAV;\n    host_depth_store_root_dest.Descriptor.ShaderRegister = 0;\n    host_depth_store_root_dest.Descriptor.RegisterSpace = 0;\n    host_depth_store_root_dest.ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;\n    // Root signature.\n    D3D12_ROOT_SIGNATURE_DESC host_depth_store_root_desc;\n    host_depth_store_root_desc.NumParameters =\n        UINT(xe::countof(host_depth_store_root_parameters));\n    host_depth_store_root_desc.pParameters = host_depth_store_root_parameters;\n    host_depth_store_root_desc.NumStaticSamplers = 0;\n    host_depth_store_root_desc.pStaticSamplers = nullptr;\n    host_depth_store_root_desc.Flags = D3D12_ROOT_SIGNATURE_FLAG_NONE;\n    host_depth_store_root_signature_ = ui::d3d12::util::CreateRootSignature(\n        provider, host_depth_store_root_desc);\n    if (!host_depth_store_root_signature_) {\n      XELOGE(\n          \"D3D12RenderTargetCache: Failed to create the host depth storing \"\n          \"root signature\");\n      Shutdown();\n      return false;\n    }\n    // Pipelines.\n    // 1 sample.\n    host_depth_store_pipelines_[size_t(xenos::MsaaSamples::k1X)] =\n        ui::d3d12::util::CreateComputePipeline(\n            device, shaders::host_depth_store_1xmsaa_cs,\n            sizeof(shaders::host_depth_store_1xmsaa_cs),\n            host_depth_store_root_signature_);\n    if (!host_depth_store_pipelines_[size_t(xenos::MsaaSamples::k1X)]) {\n      XELOGE(\n          \"D3D12RenderTargetCache: Failed to create the 1-sample host depth \"\n          \"storing pipeline\");\n      Shutdown();\n      return false;\n    }\n    host_depth_store_pipelines_[size_t(xenos::MsaaSamples::k1X)]->SetName(\n        L\"Host Depth Store 1xMSAA\");\n    // 2 samples.\n    host_depth_store_pipelines_[size_t(xenos::MsaaSamples::k2X)] =\n        ui::d3d12::util::CreateComputePipeline(\n            device, shaders::host_depth_store_2xmsaa_cs,\n            sizeof(shaders::host_depth_store_2xmsaa_cs),\n            host_depth_store_root_signature_);\n    if (!host_depth_store_pipelines_[size_t(xenos::MsaaSamples::k2X)]) {\n      XELOGE(\n          \"D3D12RenderTargetCache: Failed to create the 2-sample host depth \"\n          \"storing pipeline\");\n      Shutdown();\n      return false;\n    }\n    host_depth_store_pipelines_[size_t(xenos::MsaaSamples::k2X)]->SetName(\n        L\"Host Depth Store 2xMSAA\");\n    // 4 samples.\n    host_depth_store_pipelines_[size_t(xenos::MsaaSamples::k4X)] =\n        ui::d3d12::util::CreateComputePipeline(\n            device, shaders::host_depth_store_4xmsaa_cs,\n            sizeof(shaders::host_depth_store_4xmsaa_cs),\n            host_depth_store_root_signature_);\n    if (!host_depth_store_pipelines_[size_t(xenos::MsaaSamples::k4X)]) {\n      XELOGE(\n          \"D3D12RenderTargetCache: Failed to create the 4-sample host depth \"\n          \"storing pipeline\");\n      Shutdown();\n      return false;\n    }\n    host_depth_store_pipelines_[size_t(xenos::MsaaSamples::k4X)]->SetName(\n        L\"Host Depth Store 4xMSAA\");\n\n    // Transfer and clear vertex buffer, for quads of up to tile granularity.\n    transfer_vertex_buffer_pool_ =\n        std::make_unique<ui::d3d12::D3D12UploadBufferPool>(\n            provider,\n            std::max(ui::d3d12::D3D12UploadBufferPool::kDefaultPageSize,\n                     sizeof(float) * 2 * 6 *\n                         Transfer::kMaxCutoutBorderRectangles *\n                         xenos::kEdramTileCount));\n\n    // Transfer root signatures.\n    D3D12_DESCRIPTOR_RANGE transfer_root_color_srv_range;\n    transfer_root_color_srv_range.RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV;\n    transfer_root_color_srv_range.NumDescriptors = 1;\n    transfer_root_color_srv_range.BaseShaderRegister =\n        kTransferSRVRegisterColor;\n    transfer_root_color_srv_range.RegisterSpace = 0;\n    transfer_root_color_srv_range.OffsetInDescriptorsFromTableStart = 0;\n    D3D12_DESCRIPTOR_RANGE transfer_root_depth_srv_range;\n    transfer_root_depth_srv_range.RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV;\n    transfer_root_depth_srv_range.NumDescriptors = 1;\n    transfer_root_depth_srv_range.BaseShaderRegister =\n        kTransferSRVRegisterDepth;\n    transfer_root_depth_srv_range.RegisterSpace = 0;\n    transfer_root_depth_srv_range.OffsetInDescriptorsFromTableStart = 0;\n    D3D12_DESCRIPTOR_RANGE transfer_root_stencil_srv_range;\n    transfer_root_stencil_srv_range.RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV;\n    transfer_root_stencil_srv_range.NumDescriptors = 1;\n    transfer_root_stencil_srv_range.BaseShaderRegister =\n        kTransferSRVRegisterStencil;\n    transfer_root_stencil_srv_range.RegisterSpace = 0;\n    transfer_root_stencil_srv_range.OffsetInDescriptorsFromTableStart = 0;\n    D3D12_DESCRIPTOR_RANGE transfer_root_host_depth_srv_range;\n    transfer_root_host_depth_srv_range.RangeType =\n        D3D12_DESCRIPTOR_RANGE_TYPE_SRV;\n    transfer_root_host_depth_srv_range.NumDescriptors = 1;\n    transfer_root_host_depth_srv_range.BaseShaderRegister =\n        kTransferSRVRegisterHostDepth;\n    transfer_root_host_depth_srv_range.RegisterSpace = 0;\n    transfer_root_host_depth_srv_range.OffsetInDescriptorsFromTableStart = 0;\n    D3D12_ROOT_PARAMETER\n    transfer_root_parameters[kTransferUsedRootParameterCount];\n    D3D12_ROOT_SIGNATURE_DESC transfer_root_desc;\n    transfer_root_desc.pParameters = transfer_root_parameters;\n    transfer_root_desc.NumStaticSamplers = 0;\n    transfer_root_desc.pStaticSamplers = nullptr;\n    transfer_root_desc.Flags =\n        D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT;\n    for (size_t i = 0; i < size_t(TransferRootSignatureIndex::kCount); ++i) {\n      uint32_t transfer_root_mask = kTransferUsedRootParameters[i];\n      // Stencil mask constant.\n      if (transfer_root_mask &\n          kTransferUsedRootParameterStencilMaskConstantBit) {\n        D3D12_ROOT_PARAMETER& transfer_root_stencil_mask_constant =\n            transfer_root_parameters[xe::bit_count(\n                transfer_root_mask &\n                (kTransferUsedRootParameterStencilMaskConstantBit - 1))];\n        transfer_root_stencil_mask_constant.ParameterType =\n            D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS;\n        transfer_root_stencil_mask_constant.Constants.ShaderRegister =\n            kTransferCBVRegisterStencilMask;\n        transfer_root_stencil_mask_constant.Constants.RegisterSpace = 0;\n        transfer_root_stencil_mask_constant.Constants.Num32BitValues = 1;\n        transfer_root_stencil_mask_constant.ShaderVisibility =\n            D3D12_SHADER_VISIBILITY_PIXEL;\n      }\n      // Color SRV.\n      if (transfer_root_mask & kTransferUsedRootParameterColorSRVBit) {\n        D3D12_ROOT_PARAMETER& transfer_root_color_srv =\n            transfer_root_parameters[xe::bit_count(\n                transfer_root_mask &\n                (kTransferUsedRootParameterColorSRVBit - 1))];\n        transfer_root_color_srv.ParameterType =\n            D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;\n        transfer_root_color_srv.DescriptorTable.NumDescriptorRanges = 1;\n        transfer_root_color_srv.DescriptorTable.pDescriptorRanges =\n            &transfer_root_color_srv_range;\n        transfer_root_color_srv.ShaderVisibility =\n            D3D12_SHADER_VISIBILITY_PIXEL;\n      }\n      // Depth SRV.\n      if (transfer_root_mask & kTransferUsedRootParameterDepthSRVBit) {\n        D3D12_ROOT_PARAMETER& transfer_root_depth_srv =\n            transfer_root_parameters[xe::bit_count(\n                transfer_root_mask &\n                (kTransferUsedRootParameterDepthSRVBit - 1))];\n        transfer_root_depth_srv.ParameterType =\n            D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;\n        transfer_root_depth_srv.DescriptorTable.NumDescriptorRanges = 1;\n        transfer_root_depth_srv.DescriptorTable.pDescriptorRanges =\n            &transfer_root_depth_srv_range;\n        transfer_root_depth_srv.ShaderVisibility =\n            D3D12_SHADER_VISIBILITY_PIXEL;\n      }\n      // Stencil SRV.\n      if (transfer_root_mask & kTransferUsedRootParameterStencilSRVBit) {\n        D3D12_ROOT_PARAMETER& transfer_root_stencil_srv =\n            transfer_root_parameters[xe::bit_count(\n                transfer_root_mask &\n                (kTransferUsedRootParameterStencilSRVBit - 1))];\n        transfer_root_stencil_srv.ParameterType =\n            D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;\n        transfer_root_stencil_srv.DescriptorTable.NumDescriptorRanges = 1;\n        transfer_root_stencil_srv.DescriptorTable.pDescriptorRanges =\n            &transfer_root_stencil_srv_range;\n        transfer_root_stencil_srv.ShaderVisibility =\n            D3D12_SHADER_VISIBILITY_PIXEL;\n      }\n      // Address constant.\n      if (transfer_root_mask & kTransferUsedRootParameterAddressConstantBit) {\n        D3D12_ROOT_PARAMETER& transfer_root_address_constant =\n            transfer_root_parameters[xe::bit_count(\n                transfer_root_mask &\n                (kTransferUsedRootParameterAddressConstantBit - 1))];\n        transfer_root_address_constant.ParameterType =\n            D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS;\n        transfer_root_address_constant.Constants.ShaderRegister =\n            kTransferCBVRegisterAddress;\n        transfer_root_address_constant.Constants.RegisterSpace = 0;\n        transfer_root_address_constant.Constants.Num32BitValues =\n            sizeof(TransferAddressConstant) / sizeof(uint32_t);\n        transfer_root_address_constant.ShaderVisibility =\n            D3D12_SHADER_VISIBILITY_PIXEL;\n      }\n      // Host depth SRV.\n      if (transfer_root_mask & kTransferUsedRootParameterHostDepthSRVBit) {\n        D3D12_ROOT_PARAMETER& transfer_root_host_depth_srv =\n            transfer_root_parameters[xe::bit_count(\n                transfer_root_mask &\n                (kTransferUsedRootParameterHostDepthSRVBit - 1))];\n        transfer_root_host_depth_srv.ParameterType =\n            D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;\n        transfer_root_host_depth_srv.DescriptorTable.NumDescriptorRanges = 1;\n        transfer_root_host_depth_srv.DescriptorTable.pDescriptorRanges =\n            &transfer_root_host_depth_srv_range;\n        transfer_root_host_depth_srv.ShaderVisibility =\n            D3D12_SHADER_VISIBILITY_PIXEL;\n      }\n      // Host depth address constant.\n      if (transfer_root_mask &\n          kTransferUsedRootParameterHostDepthAddressConstantBit) {\n        D3D12_ROOT_PARAMETER& transfer_root_host_address_constant =\n            transfer_root_parameters[xe::bit_count(\n                transfer_root_mask &\n                (kTransferUsedRootParameterHostDepthAddressConstantBit - 1))];\n        transfer_root_host_address_constant.ParameterType =\n            D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS;\n        transfer_root_host_address_constant.Constants.ShaderRegister =\n            kTransferCBVRegisterHostDepthAddress;\n        transfer_root_host_address_constant.Constants.RegisterSpace = 0;\n        transfer_root_host_address_constant.Constants.Num32BitValues =\n            sizeof(TransferAddressConstant) / sizeof(uint32_t);\n        transfer_root_host_address_constant.ShaderVisibility =\n            D3D12_SHADER_VISIBILITY_PIXEL;\n      }\n      transfer_root_desc.NumParameters = xe::bit_count(transfer_root_mask);\n      assert_true(transfer_root_desc.NumParameters <=\n                  kTransferUsedRootParameterCount);\n      transfer_root_signatures_[i] =\n          ui::d3d12::util::CreateRootSignature(provider, transfer_root_desc);\n      if (!transfer_root_signatures_[i]) {\n        XELOGE(\n            \"D3D12RenderTargetCache: Failed to create the render target \"\n            \"ownership transfer root signature {:X}\",\n            transfer_root_mask);\n        Shutdown();\n        return false;\n      }\n    }\n\n    // Dumping root signatures.\n    D3D12_DESCRIPTOR_RANGE dump_root_source_range;\n    dump_root_source_range.RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV;\n    dump_root_source_range.NumDescriptors = 1;\n    dump_root_source_range.BaseShaderRegister = 0;\n    dump_root_source_range.RegisterSpace = 0;\n    dump_root_source_range.OffsetInDescriptorsFromTableStart = 0;\n    D3D12_DESCRIPTOR_RANGE dump_root_stencil_range;\n    dump_root_stencil_range.RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV;\n    dump_root_stencil_range.NumDescriptors = 1;\n    dump_root_stencil_range.BaseShaderRegister = 1;\n    dump_root_stencil_range.RegisterSpace = 0;\n    dump_root_stencil_range.OffsetInDescriptorsFromTableStart = 0;\n    D3D12_ROOT_PARAMETER\n    dump_root_color_parameters[kDumpRootParameterColorCount];\n    D3D12_ROOT_PARAMETER\n    dump_root_depth_parameters[kDumpRootParameterDepthCount];\n    for (uint32_t i = 0; i < 2; ++i) {\n      // Offsets.\n      D3D12_ROOT_PARAMETER& dump_root_offsets =\n          i ? dump_root_depth_parameters[kDumpRootParameterOffsets]\n            : dump_root_color_parameters[kDumpRootParameterOffsets];\n      dump_root_offsets.ParameterType =\n          D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS;\n      dump_root_offsets.Constants.ShaderRegister = kDumpCbufferOffsets;\n      dump_root_offsets.Constants.RegisterSpace = 0;\n      dump_root_offsets.Constants.Num32BitValues =\n          sizeof(DumpOffsets) / sizeof(uint32_t);\n      dump_root_offsets.ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;\n      // Source.\n      D3D12_ROOT_PARAMETER& dump_root_source =\n          i ? dump_root_depth_parameters[kDumpRootParameterSource]\n            : dump_root_color_parameters[kDumpRootParameterSource];\n      dump_root_source.ParameterType =\n          D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;\n      dump_root_source.DescriptorTable.NumDescriptorRanges = 1;\n      dump_root_source.DescriptorTable.pDescriptorRanges =\n          &dump_root_source_range;\n      dump_root_source.ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;\n      // Stencil.\n      if (i) {\n        D3D12_ROOT_PARAMETER& dump_root_stencil =\n            dump_root_depth_parameters[kDumpRootParameterDepthStencil];\n        dump_root_stencil.ParameterType =\n            D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;\n        dump_root_stencil.DescriptorTable.NumDescriptorRanges = 1;\n        dump_root_stencil.DescriptorTable.pDescriptorRanges =\n            &dump_root_stencil_range;\n        dump_root_stencil.ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;\n      }\n      // Pitches.\n      D3D12_ROOT_PARAMETER& dump_root_pitches =\n          i ? dump_root_depth_parameters[kDumpRootParameterDepthPitches]\n            : dump_root_color_parameters[kDumpRootParameterColorPitches];\n      dump_root_pitches.ParameterType =\n          D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS;\n      dump_root_pitches.Constants.ShaderRegister = kDumpCbufferPitches;\n      dump_root_pitches.Constants.RegisterSpace = 0;\n      dump_root_pitches.Constants.Num32BitValues =\n          sizeof(DumpPitches) / sizeof(uint32_t);\n      dump_root_pitches.ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;\n      // EDRAM.\n      D3D12_ROOT_PARAMETER& dump_root_edram =\n          i ? dump_root_depth_parameters[kDumpRootParameterDepthEdram]\n            : dump_root_color_parameters[kDumpRootParameterColorEdram];\n      dump_root_edram.ParameterType = D3D12_ROOT_PARAMETER_TYPE_UAV;\n      dump_root_edram.Descriptor.ShaderRegister = 0;\n      dump_root_edram.Descriptor.RegisterSpace = 0;\n      dump_root_edram.ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;\n    }\n    D3D12_ROOT_SIGNATURE_DESC dump_root_desc;\n    dump_root_desc.NumParameters =\n        UINT(xe::countof(dump_root_color_parameters));\n    dump_root_desc.pParameters = dump_root_color_parameters;\n    dump_root_desc.NumStaticSamplers = 0;\n    dump_root_desc.pStaticSamplers = nullptr;\n    dump_root_desc.Flags = D3D12_ROOT_SIGNATURE_FLAG_NONE;\n    dump_root_signature_color_ =\n        ui::d3d12::util::CreateRootSignature(provider, dump_root_desc);\n    if (!dump_root_signature_color_) {\n      XELOGE(\n          \"D3D12RenderTargetCache: Failed to create the color render target \"\n          \"dumping root signature\");\n      Shutdown();\n      return false;\n    }\n    dump_root_desc.NumParameters =\n        UINT(xe::countof(dump_root_depth_parameters));\n    dump_root_desc.pParameters = dump_root_depth_parameters;\n    dump_root_signature_depth_ =\n        ui::d3d12::util::CreateRootSignature(provider, dump_root_desc);\n    if (!dump_root_signature_depth_) {\n      XELOGE(\n          \"D3D12RenderTargetCache: Failed to create the depth render target \"\n          \"dumping root signature\");\n      Shutdown();\n      return false;\n    }\n\n    // k_32_FLOAT and k_32_32_FLOAT clear root signature and pipelines.\n    D3D12_ROOT_PARAMETER uint32_rtv_clear_root_constants;\n    uint32_rtv_clear_root_constants.ParameterType =\n        D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS;\n    uint32_rtv_clear_root_constants.Constants.ShaderRegister = 0;\n    uint32_rtv_clear_root_constants.Constants.RegisterSpace = 0;\n    uint32_rtv_clear_root_constants.Constants.Num32BitValues = 2;\n    uint32_rtv_clear_root_constants.ShaderVisibility =\n        D3D12_SHADER_VISIBILITY_PIXEL;\n    D3D12_ROOT_SIGNATURE_DESC uint32_rtv_clear_root_desc;\n    uint32_rtv_clear_root_desc.NumParameters = 1;\n    uint32_rtv_clear_root_desc.pParameters = &uint32_rtv_clear_root_constants;\n    uint32_rtv_clear_root_desc.NumStaticSamplers = 0;\n    uint32_rtv_clear_root_desc.pStaticSamplers = nullptr;\n    uint32_rtv_clear_root_desc.Flags = D3D12_ROOT_SIGNATURE_FLAG_NONE;\n    uint32_rtv_clear_root_signature_ = ui::d3d12::util::CreateRootSignature(\n        provider, uint32_rtv_clear_root_desc);\n    if (!uint32_rtv_clear_root_signature_) {\n      XELOGE(\n          \"D3D12RenderTargetCache: Failed to create the k_32_FLOAT / \"\n          \"k_32_32_FLOAT render target clearing root signature\");\n      Shutdown();\n      return false;\n    }\n    D3D12_GRAPHICS_PIPELINE_STATE_DESC uint32_rtv_clear_pipeline_desc = {};\n    uint32_rtv_clear_pipeline_desc.pRootSignature =\n        uint32_rtv_clear_root_signature_;\n    uint32_rtv_clear_pipeline_desc.VS.pShaderBytecode =\n        shaders::fullscreen_cw_vs;\n    uint32_rtv_clear_pipeline_desc.VS.BytecodeLength =\n        sizeof(shaders::fullscreen_cw_vs);\n    uint32_rtv_clear_pipeline_desc.PS.pShaderBytecode = shaders::clear_uint2_ps;\n    uint32_rtv_clear_pipeline_desc.PS.BytecodeLength =\n        sizeof(shaders::clear_uint2_ps);\n    uint32_rtv_clear_pipeline_desc.BlendState.RenderTarget[0]\n        .RenderTargetWriteMask = D3D12_COLOR_WRITE_ENABLE_ALL;\n    uint32_rtv_clear_pipeline_desc.RasterizerState.FillMode =\n        D3D12_FILL_MODE_SOLID;\n    uint32_rtv_clear_pipeline_desc.RasterizerState.CullMode =\n        D3D12_CULL_MODE_NONE;\n    uint32_rtv_clear_pipeline_desc.RasterizerState.DepthClipEnable = TRUE;\n    uint32_rtv_clear_pipeline_desc.PrimitiveTopologyType =\n        D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;\n    uint32_rtv_clear_pipeline_desc.NumRenderTargets = 1;\n    for (size_t i = 0; i < 2; ++i) {\n      uint32_rtv_clear_pipeline_desc.RTVFormats[0] =\n          GetColorOwnershipTransferDXGIFormat(\n              i ? xenos::ColorRenderTargetFormat::k_32_32_FLOAT\n                : xenos::ColorRenderTargetFormat::k_32_FLOAT);\n      for (size_t j = size_t(xenos::MsaaSamples::k1X);\n           j <= size_t(xenos::MsaaSamples::k4X); ++j) {\n        if (xenos::MsaaSamples(j) == xenos::MsaaSamples::k2X &&\n            !msaa_2x_supported_) {\n          // Using sample 0 as 0 and 3 as 1 for 2x instead.\n          uint32_rtv_clear_pipeline_desc.SampleMask = 0b1001;\n          uint32_rtv_clear_pipeline_desc.SampleDesc.Count = 4;\n        } else {\n          uint32_rtv_clear_pipeline_desc.SampleMask = UINT_MAX;\n          uint32_rtv_clear_pipeline_desc.SampleDesc.Count = 1 << j;\n        }\n        ID3D12PipelineState* uint32_rtv_clear_pipeline;\n        if (FAILED(device->CreateGraphicsPipelineState(\n                &uint32_rtv_clear_pipeline_desc,\n                IID_PPV_ARGS(&uint32_rtv_clear_pipeline)))) {\n          XELOGE(\n              \"D3D12RenderTargetCache: Failed to create the {} {}-sample \"\n              \"render target clearing pipeline\",\n              i ? \"k_32_32_FLOAT\" : \"k_32_FLOAT\", uint32_t(1) << j);\n          Shutdown();\n          return false;\n        }\n        uint32_rtv_clear_pipelines_[i][j] = uint32_rtv_clear_pipeline;\n        std::wstring uint32_rtv_clear_pipeline_name =\n            fmt::format(L\"Resolve Clear {} {}xMSAA\",\n                        i ? L\"k_32_32_FLOAT\" : L\"k_32_FLOAT\", uint32_t(1) << j);\n        uint32_rtv_clear_pipeline->SetName(\n            reinterpret_cast<LPCWSTR>(uint32_rtv_clear_pipeline_name.c_str()));\n      }\n    }\n\n    // FXC-compiled depth / stencil dumping shader is ~2 KB, reserve 4 KB for\n    // some additional space.\n    built_shader_.reserve(1024);\n  } else if (path_ == Path::kPixelShaderInterlock) {\n    // Pixel shader interlock (rasterizer-ordered view).\n\n    // Piecewise linear gamma is 8-bit with programmable blending.\n    gamma_render_target_as_unorm16_ = false;\n\n    // Always true float24 depth rounded to the nearest even.\n    depth_float24_round_ = true;\n    depth_float24_convert_in_pixel_shader_ = true;\n\n    // Only ForcedSampleCount, which doesn't support 2x.\n    msaa_2x_supported_ = false;\n\n    // Create the resolve EDRAM buffer clearing root signature.\n    std::array<D3D12_ROOT_PARAMETER, 2> resolve_rov_clear_root_parameters;\n    // Parameter 0 is constants.\n    resolve_rov_clear_root_parameters[0].ParameterType =\n        D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS;\n    resolve_rov_clear_root_parameters[0].Constants.ShaderRegister = 0;\n    resolve_rov_clear_root_parameters[0].Constants.RegisterSpace = 0;\n    // Binding all of the shared memory at 1x resolution, portions with scaled\n    // resolution.\n    resolve_rov_clear_root_parameters[0].Constants.Num32BitValues =\n        sizeof(draw_util::ResolveClearShaderConstants) / sizeof(uint32_t);\n    resolve_rov_clear_root_parameters[0].ShaderVisibility =\n        D3D12_SHADER_VISIBILITY_ALL;\n    // Parameter 1 is the destination (EDRAM).\n    resolve_rov_clear_root_parameters[1].ParameterType =\n        D3D12_ROOT_PARAMETER_TYPE_UAV;\n    resolve_rov_clear_root_parameters[1].Descriptor.ShaderRegister = 0;\n    resolve_rov_clear_root_parameters[1].Descriptor.RegisterSpace = 0;\n    resolve_rov_clear_root_parameters[1].ShaderVisibility =\n        D3D12_SHADER_VISIBILITY_ALL;\n    D3D12_ROOT_SIGNATURE_DESC resolve_rov_clear_root_signature_desc;\n    resolve_rov_clear_root_signature_desc.NumParameters =\n        UINT(resolve_rov_clear_root_parameters.size());\n    resolve_rov_clear_root_signature_desc.pParameters =\n        resolve_rov_clear_root_parameters.data();\n    resolve_rov_clear_root_signature_desc.NumStaticSamplers = 0;\n    resolve_rov_clear_root_signature_desc.pStaticSamplers = nullptr;\n    resolve_rov_clear_root_signature_desc.Flags =\n        D3D12_ROOT_SIGNATURE_FLAG_NONE;\n    resolve_rov_clear_root_signature_ = ui::d3d12::util::CreateRootSignature(\n        provider, resolve_rov_clear_root_signature_desc);\n    if (resolve_rov_clear_root_signature_ == nullptr) {\n      XELOGE(\n          \"D3D12RenderTargetCache: Failed to create the resolve EDRAM buffer \"\n          \"clear root signature\");\n      Shutdown();\n      return false;\n    }\n\n    // Create the resolve EDRAM buffer clearing pipelines.\n    resolve_rov_clear_32bpp_pipeline_ = ui::d3d12::util::CreateComputePipeline(\n        device,\n        draw_resolution_scaled ? shaders::resolve_clear_32bpp_scaled_cs\n                               : shaders::resolve_clear_32bpp_cs,\n        draw_resolution_scaled ? sizeof(shaders::resolve_clear_32bpp_scaled_cs)\n                               : sizeof(shaders::resolve_clear_32bpp_cs),\n        resolve_rov_clear_root_signature_);\n    if (resolve_rov_clear_32bpp_pipeline_ == nullptr) {\n      XELOGE(\n          \"D3D12RenderTargetCache: Failed to create the 32bpp resolve EDRAM \"\n          \"buffer clear pipeline\");\n      Shutdown();\n      return false;\n    }\n    resolve_rov_clear_32bpp_pipeline_->SetName(L\"Resolve Clear 32bpp\");\n    resolve_rov_clear_64bpp_pipeline_ = ui::d3d12::util::CreateComputePipeline(\n        device,\n        draw_resolution_scaled ? shaders::resolve_clear_64bpp_scaled_cs\n                               : shaders::resolve_clear_64bpp_cs,\n        draw_resolution_scaled ? sizeof(shaders::resolve_clear_64bpp_scaled_cs)\n                               : sizeof(shaders::resolve_clear_64bpp_cs),\n        resolve_rov_clear_root_signature_);\n    if (resolve_rov_clear_64bpp_pipeline_ == nullptr) {\n      XELOGE(\n          \"D3D12RenderTargetCache: Failed to create the 64bpp resolve EDRAM \"\n          \"buffer clear pipeline\");\n      Shutdown();\n      return false;\n    }\n    resolve_rov_clear_64bpp_pipeline_->SetName(L\"Resolve Clear 64bpp\");\n  } else {\n    assert_unhandled_case(path_);\n    Shutdown();\n    return false;\n  }\n\n  InitializeCommon();\n\n  return true;\n}\n\nvoid D3D12RenderTargetCache::Shutdown(bool from_destructor) {\n  ui::d3d12::util::ReleaseAndNull(resolve_rov_clear_64bpp_pipeline_);\n  ui::d3d12::util::ReleaseAndNull(resolve_rov_clear_32bpp_pipeline_);\n  ui::d3d12::util::ReleaseAndNull(resolve_rov_clear_root_signature_);\n\n  for (size_t i = 0; i < 2; ++i) {\n    for (size_t j = size_t(xenos::MsaaSamples::k1X);\n         j <= size_t(xenos::MsaaSamples::k4X); ++j) {\n      ui::d3d12::util::ReleaseAndNull(uint32_rtv_clear_pipelines_[i][j]);\n    }\n  }\n  ui::d3d12::util::ReleaseAndNull(uint32_rtv_clear_root_signature_);\n\n  for (const auto& dump_pipeline_pair : dump_pipelines_) {\n    if (dump_pipeline_pair.second) {\n      dump_pipeline_pair.second->Release();\n    }\n  }\n  dump_pipelines_.clear();\n  ui::d3d12::util::ReleaseAndNull(dump_root_signature_depth_);\n  ui::d3d12::util::ReleaseAndNull(dump_root_signature_color_);\n\n  for (const auto& transfer_pipeline_array_pair :\n       transfer_stencil_bit_pipelines_) {\n    for (ID3D12PipelineState* transfer_pipeline :\n         transfer_pipeline_array_pair.second) {\n      if (transfer_pipeline) {\n        transfer_pipeline->Release();\n      }\n    }\n  }\n  transfer_stencil_bit_pipelines_.clear();\n  for (const auto& transfer_pipeline_pair : transfer_pipelines_) {\n    if (transfer_pipeline_pair.second) {\n      transfer_pipeline_pair.second->Release();\n    }\n  }\n  transfer_pipelines_.clear();\n  for (size_t i = 0; i < xe::countof(transfer_root_signatures_); ++i) {\n    ui::d3d12::util::ReleaseAndNull(transfer_root_signatures_[i]);\n  }\n\n  transfer_vertex_buffer_pool_.reset();\n\n  for (size_t i = 0; i < xe::countof(host_depth_store_pipelines_); ++i) {\n    ui::d3d12::util::ReleaseAndNull(host_depth_store_pipelines_[i]);\n  }\n  ui::d3d12::util::ReleaseAndNull(host_depth_store_root_signature_);\n\n  null_rtv_descriptor_ms_.Free();\n  null_rtv_descriptor_ss_.Free();\n  descriptor_pool_srv_.reset();\n  descriptor_pool_depth_.reset();\n  descriptor_pool_color_.reset();\n\n  for (size_t i = 0; i < xe::countof(resolve_copy_pipelines_); ++i) {\n    ui::d3d12::util::ReleaseAndNull(resolve_copy_pipelines_[i]);\n  }\n  ui::d3d12::util::ReleaseAndNull(resolve_copy_root_signature_);\n\n  edram_snapshot_restore_pool_.reset();\n  ui::d3d12::util::ReleaseAndNull(edram_snapshot_download_buffer_);\n\n  ui::d3d12::util::ReleaseAndNull(edram_buffer_descriptor_heap_);\n  ui::d3d12::util::ReleaseAndNull(edram_buffer_);\n\n  if (!from_destructor) {\n    ShutdownCommon();\n  }\n}\n\nvoid D3D12RenderTargetCache::CompletedSubmissionUpdated() {\n  if (edram_snapshot_restore_pool_) {\n    edram_snapshot_restore_pool_->Reclaim(\n        command_processor_.GetCompletedSubmission());\n  }\n  if (transfer_vertex_buffer_pool_) {\n    transfer_vertex_buffer_pool_->Reclaim(\n        command_processor_.GetCompletedSubmission());\n  }\n}\n\nvoid D3D12RenderTargetCache::BeginSubmission() {\n  // New command list - render targets not bound.\n  InvalidateCommandListRenderTargets();\n  // ExecuteCommandLists is a full UAV barrier.\n  if (edram_buffer_modification_status_ !=\n      EdramBufferModificationStatus::kUnmodified) {\n    assert_true(edram_buffer_state_ == D3D12_RESOURCE_STATE_UNORDERED_ACCESS);\n    edram_buffer_modification_status_ =\n        EdramBufferModificationStatus::kUnmodified;\n    PixelShaderInterlockFullEdramBarrierPlaced();\n  }\n}\n\nbool D3D12RenderTargetCache::Update(\n    bool is_rasterization_done, reg::RB_DEPTHCONTROL normalized_depth_control,\n    uint32_t normalized_color_mask, const Shader& vertex_shader) {\n  if (!RenderTargetCache::Update(is_rasterization_done,\n                                 normalized_depth_control,\n                                 normalized_color_mask, vertex_shader)) {\n    return false;\n  }\n  switch (GetPath()) {\n    case Path::kHostRenderTargets: {\n      RenderTarget* const* depth_and_color_render_targets =\n          last_update_accumulated_render_targets();\n      PerformTransfersAndResolveClears(1 + xenos::kMaxColorRenderTargets,\n                                       depth_and_color_render_targets,\n                                       last_update_transfers());\n      SetCommandListRenderTargets(depth_and_color_render_targets);\n    } break;\n    case Path::kPixelShaderInterlock: {\n      // For ROV, only the barrier is needed - already scheduled if required.\n      // But the buffer will be used for ROV drawing now.\n      TransitionEdramBuffer(D3D12_RESOURCE_STATE_UNORDERED_ACCESS);\n      // Commit preceding UAV (but not ROV) writes like clears as they aren't\n      // synchronized with ROV accesses.\n      CommitEdramBufferUAVWrites(EdramBufferModificationStatus::kAsUAV);\n      // TODO(Triang3l): Check if this draw call modifies color or depth /\n      // stencil, at least coarsely, to prevent useless barriers.\n      MarkEdramBufferModified(EdramBufferModificationStatus::kAsROV);\n    } break;\n    default:\n      assert_unhandled_case(GetPath());\n      return false;\n  }\n  return true;\n}\n\nvoid D3D12RenderTargetCache::WriteEdramRawSRVDescriptor(\n    D3D12_CPU_DESCRIPTOR_HANDLE handle) {\n  const ui::d3d12::D3D12Provider& provider =\n      command_processor_.GetD3D12Provider();\n  ID3D12Device* device = provider.GetDevice();\n  device->CopyDescriptorsSimple(\n      1, handle,\n      provider.OffsetViewDescriptor(\n          edram_buffer_descriptor_heap_start_,\n          uint32_t(EdramBufferDescriptorIndex::kRawSRV)),\n      D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);\n}\n\nvoid D3D12RenderTargetCache::WriteEdramRawUAVDescriptor(\n    D3D12_CPU_DESCRIPTOR_HANDLE handle) {\n  const ui::d3d12::D3D12Provider& provider =\n      command_processor_.GetD3D12Provider();\n  ID3D12Device* device = provider.GetDevice();\n  device->CopyDescriptorsSimple(\n      1, handle,\n      provider.OffsetViewDescriptor(\n          edram_buffer_descriptor_heap_start_,\n          uint32_t(EdramBufferDescriptorIndex::kRawUAV)),\n      D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);\n}\n\nvoid D3D12RenderTargetCache::WriteEdramUintPow2SRVDescriptor(\n    D3D12_CPU_DESCRIPTOR_HANDLE handle, uint32_t element_size_bytes_pow2) {\n  EdramBufferDescriptorIndex descriptor_index;\n  switch (element_size_bytes_pow2) {\n    case 2:\n      descriptor_index = EdramBufferDescriptorIndex::kR32UintSRV;\n      break;\n    case 3:\n      descriptor_index = EdramBufferDescriptorIndex::kR32G32UintSRV;\n      break;\n    case 4:\n      descriptor_index = EdramBufferDescriptorIndex::kR32G32B32A32UintSRV;\n      break;\n    default:\n      assert_unhandled_case(element_size_bytes_pow2);\n      return;\n  }\n  const ui::d3d12::D3D12Provider& provider =\n      command_processor_.GetD3D12Provider();\n  ID3D12Device* device = provider.GetDevice();\n  device->CopyDescriptorsSimple(\n      1, handle,\n      provider.OffsetViewDescriptor(edram_buffer_descriptor_heap_start_,\n                                    uint32_t(descriptor_index)),\n      D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);\n}\n\nvoid D3D12RenderTargetCache::WriteEdramUintPow2UAVDescriptor(\n    D3D12_CPU_DESCRIPTOR_HANDLE handle, uint32_t element_size_bytes_pow2) {\n  EdramBufferDescriptorIndex descriptor_index;\n  switch (element_size_bytes_pow2) {\n    case 2:\n      descriptor_index = EdramBufferDescriptorIndex::kR32UintUAV;\n      break;\n    case 3:\n      descriptor_index = EdramBufferDescriptorIndex::kR32G32UintUAV;\n      break;\n    case 4:\n      descriptor_index = EdramBufferDescriptorIndex::kR32G32B32A32UintUAV;\n      break;\n    default:\n      assert_unhandled_case(element_size_bytes_pow2);\n      return;\n  }\n  const ui::d3d12::D3D12Provider& provider =\n      command_processor_.GetD3D12Provider();\n  ID3D12Device* device = provider.GetDevice();\n  device->CopyDescriptorsSimple(\n      1, handle,\n      provider.OffsetViewDescriptor(edram_buffer_descriptor_heap_start_,\n                                    uint32_t(descriptor_index)),\n      D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);\n}\n\nbool D3D12RenderTargetCache::Resolve(const Memory& memory,\n                                     D3D12SharedMemory& shared_memory,\n                                     D3D12TextureCache& texture_cache,\n                                     uint32_t& written_address_out,\n                                     uint32_t& written_length_out) {\n  written_address_out = 0;\n  written_length_out = 0;\n\n  bool draw_resolution_scaled = IsDrawResolutionScaled();\n\n  draw_util::ResolveInfo resolve_info;\n  bool fixed_16_truncated_to_minus_1_to_1 = IsFixed16TruncatedToMinus1To1();\n  if (!draw_util::GetResolveInfo(\n          register_file(), memory, trace_writer_, draw_resolution_scale_x(),\n          draw_resolution_scale_y(), fixed_16_truncated_to_minus_1_to_1,\n          fixed_16_truncated_to_minus_1_to_1, resolve_info)) {\n    return false;\n  }\n\n  // Nothing to copy/clear.\n  if (!resolve_info.coordinate_info.width_div_8 || !resolve_info.height_div_8) {\n    return true;\n  }\n\n  DeferredCommandList& command_list =\n      command_processor_.GetDeferredCommandList();\n\n  // Copying.\n  bool copied = false;\n  if (resolve_info.copy_dest_extent_length) {\n    if (GetPath() == Path::kHostRenderTargets) {\n      // Dump the current contents of the render targets owning the affected\n      // range to edram_buffer_.\n      // TODO(Triang3l): Direct host render target -> shared memory resolve\n      // shaders for non-converting cases.\n      uint32_t dump_base;\n      uint32_t dump_row_length_used;\n      uint32_t dump_rows;\n      uint32_t dump_pitch;\n      resolve_info.GetCopyEdramTileSpan(dump_base, dump_row_length_used,\n                                        dump_rows, dump_pitch);\n      DumpRenderTargets(dump_base, dump_row_length_used, dump_rows, dump_pitch);\n    }\n\n    draw_util::ResolveCopyShaderConstants copy_shader_constants;\n    uint32_t copy_group_count_x, copy_group_count_y;\n    draw_util::ResolveCopyShaderIndex copy_shader = resolve_info.GetCopyShader(\n        draw_resolution_scale_x(), draw_resolution_scale_y(),\n        copy_shader_constants, copy_group_count_x, copy_group_count_y);\n    assert_true(copy_group_count_x && copy_group_count_y);\n    if (copy_shader != draw_util::ResolveCopyShaderIndex::kUnknown) {\n      const draw_util::ResolveCopyShaderInfo& copy_shader_info =\n          draw_util::resolve_copy_shader_info[size_t(copy_shader)];\n\n      // Make sure there is memory to write to.\n      bool copy_dest_committed;\n      if (draw_resolution_scaled) {\n        // Committing starting with the beginning of the potentially written\n        // extent, but making the buffer containing the base current as the\n        // beginning of the bound buffer is the base.\n        copy_dest_committed = texture_cache.EnsureScaledResolveMemoryCommitted(\n                                  resolve_info.copy_dest_extent_start,\n                                  resolve_info.copy_dest_extent_length) &&\n                              texture_cache.MakeScaledResolveRangeCurrent(\n                                  resolve_info.copy_dest_base,\n                                  resolve_info.copy_dest_extent_start -\n                                      resolve_info.copy_dest_base +\n                                      resolve_info.copy_dest_extent_length);\n      } else {\n        copy_dest_committed =\n            shared_memory.RequestRange(resolve_info.copy_dest_extent_start,\n                                       resolve_info.copy_dest_extent_length);\n      }\n      if (copy_dest_committed) {\n        command_list.D3DSetComputeRootSignature(resolve_copy_root_signature_);\n\n        // Source.\n        TransitionEdramBuffer(D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE);\n        command_list.D3DSetComputeRootShaderResourceView(\n            2, edram_buffer_gpu_address_);\n\n        // Destination and constants.\n        if (draw_resolution_scaled) {\n          texture_cache.TransitionCurrentScaledResolveRange(\n              D3D12_RESOURCE_STATE_UNORDERED_ACCESS);\n          command_list.D3DSetComputeRootUnorderedAccessView(\n              1, texture_cache.GetCurrentScaledResolveRangeGPUAddress());\n\n          command_list.D3DSetComputeRoot32BitConstants(\n              0, sizeof(copy_shader_constants.dest_relative) / sizeof(uint32_t),\n              &copy_shader_constants.dest_relative, 0);\n        } else {\n          shared_memory.UseForWriting();\n          command_list.D3DSetComputeRootUnorderedAccessView(\n              1, shared_memory.GetGPUAddress());\n\n          command_list.D3DSetComputeRoot32BitConstants(\n              0, sizeof(copy_shader_constants) / sizeof(uint32_t),\n              &copy_shader_constants, 0);\n        }\n\n        // Dispatch the resolve.\n        command_processor_.SetExternalPipeline(\n            resolve_copy_pipelines_[size_t(copy_shader)]);\n        command_processor_.SubmitBarriers();\n        command_list.D3DDispatch(copy_group_count_x, copy_group_count_y, 1);\n\n        // Order the resolve with other work using the destination as a UAV.\n        if (draw_resolution_scaled) {\n          texture_cache.MarkCurrentScaledResolveRangeUAVWritesCommitNeeded();\n        } else {\n          shared_memory.MarkUAVWritesCommitNeeded();\n        }\n\n        // Invalidate textures and mark the range as scaled if needed.\n        texture_cache.MarkRangeAsResolved(resolve_info.copy_dest_extent_start,\n                                          resolve_info.copy_dest_extent_length);\n        written_address_out = resolve_info.copy_dest_extent_start;\n        written_length_out = resolve_info.copy_dest_extent_length;\n        copied = true;\n      } else {\n        XELOGE(\n            \"D3D12RenderTargetCache: Failed to obtain the resolve destination \"\n            \"memory region\");\n      }\n    }\n  } else {\n    copied = true;\n  }\n\n  // Clearing.\n  bool cleared = false;\n  bool clear_depth = resolve_info.IsClearingDepth();\n  bool clear_color = resolve_info.IsClearingColor();\n  if (clear_depth || clear_color) {\n    switch (GetPath()) {\n      case Path::kHostRenderTargets: {\n        Transfer::Rectangle clear_rectangle;\n        RenderTarget* clear_render_targets[2];\n        // If PrepareHostRenderTargetsResolveClear returns false, may be just an\n        // empty region (success) or an error - don't care.\n        if (PrepareHostRenderTargetsResolveClear(\n                resolve_info, clear_rectangle, clear_render_targets[0],\n                clear_transfers_[0], clear_render_targets[1],\n                clear_transfers_[1])) {\n          uint64_t clear_values[2];\n          clear_values[0] = resolve_info.rb_depth_clear;\n          clear_values[1] = resolve_info.rb_color_clear |\n                            (uint64_t(resolve_info.rb_color_clear_lo) << 32);\n          PerformTransfersAndResolveClears(2, clear_render_targets,\n                                           clear_transfers_, clear_values,\n                                           &clear_rectangle);\n        }\n        cleared = true;\n      } break;\n      case Path::kPixelShaderInterlock: {\n        TransitionEdramBuffer(D3D12_RESOURCE_STATE_UNORDERED_ACCESS);\n        // Should be safe to only commit once (if was UAV / ROV previously - if\n        // there was nothing to copy, only to clear, for some reason, for\n        // instance), overlap of the depth and the color ranges is highly\n        // unlikely.\n        CommitEdramBufferUAVWrites();\n        command_list.D3DSetComputeRootSignature(\n            resolve_rov_clear_root_signature_);\n        command_list.D3DSetComputeRootUnorderedAccessView(\n            1, edram_buffer_gpu_address_);\n        std::pair<uint32_t, uint32_t> clear_group_count =\n            resolve_info.GetClearShaderGroupCount(draw_resolution_scale_x(),\n                                                  draw_resolution_scale_y());\n        assert_true(clear_group_count.first && clear_group_count.second);\n        if (clear_depth) {\n          draw_util::ResolveClearShaderConstants depth_clear_constants;\n          resolve_info.GetDepthClearShaderConstants(depth_clear_constants);\n          command_list.D3DSetComputeRoot32BitConstants(\n              0, sizeof(depth_clear_constants) / sizeof(uint32_t),\n              &depth_clear_constants, 0);\n          command_processor_.SetExternalPipeline(\n              resolve_rov_clear_32bpp_pipeline_);\n          command_processor_.SubmitBarriers();\n          command_list.D3DDispatch(clear_group_count.first,\n                                   clear_group_count.second, 1);\n        }\n        if (clear_color) {\n          draw_util::ResolveClearShaderConstants color_clear_constants;\n          resolve_info.GetColorClearShaderConstants(color_clear_constants);\n          if (clear_depth) {\n            // Non-RT-specific constants have already been set.\n            command_list.D3DSetComputeRoot32BitConstants(\n                0, sizeof(color_clear_constants.rt_specific) / sizeof(uint32_t),\n                &color_clear_constants.rt_specific,\n                offsetof(draw_util::ResolveClearShaderConstants, rt_specific) /\n                    sizeof(uint32_t));\n          } else {\n            command_list.D3DSetComputeRoot32BitConstants(\n                0, sizeof(color_clear_constants) / sizeof(uint32_t),\n                &color_clear_constants, 0);\n          }\n          command_processor_.SetExternalPipeline(\n              resolve_info.color_edram_info.format_is_64bpp\n                  ? resolve_rov_clear_64bpp_pipeline_\n                  : resolve_rov_clear_32bpp_pipeline_);\n          command_processor_.SubmitBarriers();\n          command_list.D3DDispatch(clear_group_count.first,\n                                   clear_group_count.second, 1);\n        }\n        MarkEdramBufferModified();\n        cleared = true;\n      } break;\n      default:\n        assert_unhandled_case(GetPath());\n    }\n  } else {\n    cleared = true;\n  }\n\n  return copied && cleared;\n}\n\nbool D3D12RenderTargetCache::InitializeTraceSubmitDownloads() {\n  if (IsDrawResolutionScaled()) {\n    // No 1:1 mapping.\n    return false;\n  }\n  if (!edram_snapshot_download_buffer_) {\n    D3D12_RESOURCE_DESC edram_snapshot_download_buffer_desc;\n    ui::d3d12::util::FillBufferResourceDesc(edram_snapshot_download_buffer_desc,\n                                            xenos::kEdramSizeBytes,\n                                            D3D12_RESOURCE_FLAG_NONE);\n    const ui::d3d12::D3D12Provider& provider =\n        command_processor_.GetD3D12Provider();\n    ID3D12Device* device = provider.GetDevice();\n    if (FAILED(device->CreateCommittedResource(\n            &ui::d3d12::util::kHeapPropertiesReadback,\n            provider.GetHeapFlagCreateNotZeroed(),\n            &edram_snapshot_download_buffer_desc,\n            D3D12_RESOURCE_STATE_COPY_DEST, nullptr,\n            IID_PPV_ARGS(&edram_snapshot_download_buffer_)))) {\n      XELOGE(\n          \"D3D12RenderTargetCache: Failed to create a EDRAM snapshot download \"\n          \"buffer\");\n      return false;\n    }\n  }\n  if (GetPath() == Path::kHostRenderTargets) {\n    // Dump all host render targets to edram_buffer_.\n    DumpRenderTargets(0, xenos::kEdramTileCount, 1, xenos::kEdramTileCount);\n  }\n  TransitionEdramBuffer(D3D12_RESOURCE_STATE_COPY_SOURCE);\n  command_processor_.SubmitBarriers();\n  command_processor_.GetDeferredCommandList().D3DCopyBufferRegion(\n      edram_snapshot_download_buffer_, 0, edram_buffer_, 0,\n      xenos::kEdramSizeBytes);\n  return true;\n}\n\nvoid D3D12RenderTargetCache::InitializeTraceCompleteDownloads() {\n  if (!edram_snapshot_download_buffer_) {\n    return;\n  }\n  void* download_mapping;\n  if (SUCCEEDED(edram_snapshot_download_buffer_->Map(0, nullptr,\n                                                     &download_mapping))) {\n    trace_writer_.WriteEdramSnapshot(download_mapping);\n    D3D12_RANGE download_write_range = {};\n    edram_snapshot_download_buffer_->Unmap(0, &download_write_range);\n  } else {\n    XELOGE(\n        \"D3D12RenderTargetCache: Failed to map the EDRAM snapshot download \"\n        \"buffer\");\n  }\n  edram_snapshot_download_buffer_->Release();\n  edram_snapshot_download_buffer_ = nullptr;\n}\n\nvoid D3D12RenderTargetCache::RestoreEdramSnapshot(const void* snapshot) {\n  if (IsDrawResolutionScaled()) {\n    // No 1:1 mapping.\n    return;\n  }\n\n  // Create the buffer - will be used for copying to either a 32-bit 1280x2048\n  // render target or the EDRAM buffer.\n  const ui::d3d12::D3D12Provider& provider =\n      command_processor_.GetD3D12Provider();\n  if (!edram_snapshot_restore_pool_) {\n    edram_snapshot_restore_pool_ =\n        std::make_unique<ui::d3d12::D3D12UploadBufferPool>(\n            provider, xenos::kEdramSizeBytes);\n  }\n  ID3D12Resource* upload_buffer;\n  size_t upload_buffer_offset;\n  void* upload_buffer_mapping = edram_snapshot_restore_pool_->Request(\n      command_processor_.GetCurrentSubmission(), xenos::kEdramSizeBytes, 1,\n      &upload_buffer, &upload_buffer_offset, nullptr);\n  if (!upload_buffer_mapping) {\n    XELOGE(\n        \"D3D12RenderTargetCache: Failed to get a buffer for restoring a EDRAM \"\n        \"snapshot\");\n    return;\n  }\n\n  DeferredCommandList& command_list =\n      command_processor_.GetDeferredCommandList();\n\n  switch (GetPath()) {\n    case Path::kHostRenderTargets: {\n      // k_32_FLOAT because it's unambiguous (not effected by something like\n      // DXGI_FORMAT_R8G8B8A8 vs. DXGI_FORMAT_B8G8R8A8).\n      D3D12RenderTarget* full_edram_render_target =\n          static_cast<D3D12RenderTarget*>(\n              PrepareFullEdram1280xRenderTargetForSnapshotRestoration(\n                  xenos::ColorRenderTargetFormat::k_32_FLOAT));\n      if (!full_edram_render_target) {\n        return;\n      }\n      D3D12_TEXTURE_COPY_LOCATION copy_source_location;\n      copy_source_location.pResource = upload_buffer;\n      copy_source_location.Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT;\n      UINT64 copy_total_bytes;\n      D3D12_RESOURCE_DESC full_edram_render_target_desc =\n          full_edram_render_target->resource()->GetDesc();\n      provider.GetDevice()->GetCopyableFootprints(\n          &full_edram_render_target_desc, 0, 1, 0,\n          &copy_source_location.PlacedFootprint, nullptr, nullptr,\n          &copy_total_bytes);\n      // 1280 width * sizeof(uint32_t) is aligned to\n      // D3D12_TEXTURE_DATA_PITCH_ALIGNMENT (256).\n      assert_true(copy_total_bytes <= xenos::kEdramSizeBytes);\n      assert_false(full_edram_render_target->key().Is64bpp());\n      uint32_t pitch_tiles =\n          full_edram_render_target->key().pitch_tiles_at_32bpp;\n      uint32_t tile_rows = xenos::kEdramTileCount / pitch_tiles;\n      assert_true(pitch_tiles * tile_rows == xenos::kEdramTileCount);\n      const uint8_t* snapshot_sample_row =\n          reinterpret_cast<const uint8_t*>(snapshot);\n      for (uint32_t y_tile = 0; y_tile < tile_rows; ++y_tile) {\n        uint8_t* upload_buffer_tile_row_origin =\n            reinterpret_cast<uint8_t*>(upload_buffer_mapping) +\n            copy_source_location.PlacedFootprint.Offset +\n            xenos::kEdramTileHeightSamples * y_tile *\n                copy_source_location.PlacedFootprint.Footprint.RowPitch;\n        for (uint32_t x_tile = 0; x_tile < pitch_tiles; ++x_tile) {\n          uint8_t* upload_buffer_sample_row =\n              upload_buffer_tile_row_origin +\n              sizeof(uint32_t) * xenos::kEdramTileWidthSamples * x_tile;\n          for (uint32_t sample_row = 0;\n               sample_row < xenos::kEdramTileHeightSamples; ++sample_row) {\n            std::memcpy(upload_buffer_sample_row, snapshot_sample_row,\n                        sizeof(uint32_t) * xenos::kEdramTileWidthSamples);\n            snapshot_sample_row +=\n                sizeof(uint32_t) * xenos::kEdramTileWidthSamples;\n            upload_buffer_sample_row +=\n                copy_source_location.PlacedFootprint.Footprint.RowPitch;\n          }\n        }\n      }\n      command_processor_.PushTransitionBarrier(\n          full_edram_render_target->resource(),\n          full_edram_render_target->SetResourceState(\n              D3D12_RESOURCE_STATE_COPY_DEST),\n          D3D12_RESOURCE_STATE_COPY_DEST);\n      command_processor_.SubmitBarriers();\n      D3D12_TEXTURE_COPY_LOCATION copy_dest_location;\n      copy_dest_location.pResource = full_edram_render_target->resource();\n      copy_dest_location.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX;\n      copy_dest_location.SubresourceIndex = 0;\n      command_list.D3DCopyTextureRegion(&copy_dest_location, 0, 0, 0,\n                                        &copy_source_location, nullptr);\n    } break;\n\n    case Path::kPixelShaderInterlock: {\n      std::memcpy(upload_buffer_mapping, snapshot, xenos::kEdramSizeBytes);\n      TransitionEdramBuffer(D3D12_RESOURCE_STATE_COPY_DEST);\n      command_processor_.SubmitBarriers();\n      command_list.D3DCopyBufferRegion(edram_buffer_, 0, upload_buffer,\n                                       UINT64(upload_buffer_offset),\n                                       xenos::kEdramSizeBytes);\n    } break;\n\n    default:\n      assert_unhandled_case(GetPath());\n  }\n}\n\nDXGI_FORMAT D3D12RenderTargetCache::GetColorResourceDXGIFormat(\n    xenos::ColorRenderTargetFormat format) const {\n  // Typed should be preferred over typeless so there are more opportunities for\n  // compression.\n  switch (format) {\n    case xenos::ColorRenderTargetFormat::k_8_8_8_8:\n      return DXGI_FORMAT_R8G8B8A8_UNORM;\n    case xenos::ColorRenderTargetFormat::k_8_8_8_8_GAMMA:\n      return gamma_render_target_as_unorm16_ ? DXGI_FORMAT_R16G16B16A16_UNORM\n                                             : DXGI_FORMAT_R8G8B8A8_UNORM;\n    case xenos::ColorRenderTargetFormat::k_2_10_10_10:\n    case xenos::ColorRenderTargetFormat::k_2_10_10_10_AS_10_10_10_10:\n      return DXGI_FORMAT_R10G10B10A2_UNORM;\n    case xenos::ColorRenderTargetFormat::k_2_10_10_10_FLOAT:\n    case xenos::ColorRenderTargetFormat::k_2_10_10_10_FLOAT_AS_16_16_16_16:\n      return DXGI_FORMAT_R16G16B16A16_FLOAT;\n    // SNORM has two representations of -1.\n    case xenos::ColorRenderTargetFormat::k_16_16:\n      return DXGI_FORMAT_R16G16_TYPELESS;\n    case xenos::ColorRenderTargetFormat::k_16_16_16_16:\n      return DXGI_FORMAT_R16G16B16A16_TYPELESS;\n    // Floating-point - ensure NaN propagation during ownership transfer for\n    // unmodified data.\n    case xenos::ColorRenderTargetFormat::k_16_16_FLOAT:\n      return DXGI_FORMAT_R16G16_TYPELESS;\n    case xenos::ColorRenderTargetFormat::k_16_16_16_16_FLOAT:\n      return DXGI_FORMAT_R16G16B16A16_TYPELESS;\n    // TODO(Triang3l): Check if NaN propagation defined in the D3D11.3\n    // specification can be relied on for 32-bit float render targets.\n    case xenos::ColorRenderTargetFormat::k_32_FLOAT:\n      return DXGI_FORMAT_R32_TYPELESS;\n    case xenos::ColorRenderTargetFormat::k_32_32_FLOAT:\n      return DXGI_FORMAT_R32G32_TYPELESS;\n    default:\n      assert_unhandled_case(format);\n      return DXGI_FORMAT_UNKNOWN;\n  }\n}\n\nDXGI_FORMAT D3D12RenderTargetCache::GetColorDrawDXGIFormat(\n    xenos::ColorRenderTargetFormat format) const {\n  switch (format) {\n    case xenos::ColorRenderTargetFormat::k_16_16:\n      return DXGI_FORMAT_R16G16_SNORM;\n    case xenos::ColorRenderTargetFormat::k_16_16_16_16:\n      return DXGI_FORMAT_R16G16B16A16_SNORM;\n    case xenos::ColorRenderTargetFormat::k_16_16_FLOAT:\n      return DXGI_FORMAT_R16G16_FLOAT;\n    case xenos::ColorRenderTargetFormat::k_16_16_16_16_FLOAT:\n      return DXGI_FORMAT_R16G16B16A16_FLOAT;\n    case xenos::ColorRenderTargetFormat::k_32_FLOAT:\n      return DXGI_FORMAT_R32_FLOAT;\n    case xenos::ColorRenderTargetFormat::k_32_32_FLOAT:\n      return DXGI_FORMAT_R32G32_FLOAT;\n    default:\n      return GetColorResourceDXGIFormat(format);\n  }\n}\n\nDXGI_FORMAT D3D12RenderTargetCache::GetColorOwnershipTransferDXGIFormat(\n    xenos::ColorRenderTargetFormat format, bool* is_integer_out) const {\n  if (is_integer_out) {\n    *is_integer_out = true;\n  }\n  switch (format) {\n    case xenos::ColorRenderTargetFormat::k_16_16:\n    case xenos::ColorRenderTargetFormat::k_16_16_FLOAT:\n      return DXGI_FORMAT_R16G16_UINT;\n    case xenos::ColorRenderTargetFormat::k_16_16_16_16:\n    case xenos::ColorRenderTargetFormat::k_16_16_16_16_FLOAT:\n      return DXGI_FORMAT_R16G16B16A16_UINT;\n    case xenos::ColorRenderTargetFormat::k_32_FLOAT:\n      return DXGI_FORMAT_R32_UINT;\n    case xenos::ColorRenderTargetFormat::k_32_32_FLOAT:\n      return DXGI_FORMAT_R32G32_UINT;\n    default:\n      if (is_integer_out) {\n        *is_integer_out = false;\n      }\n      return GetColorDrawDXGIFormat(format);\n  }\n}\n\nDXGI_FORMAT D3D12RenderTargetCache::GetDepthResourceDXGIFormat(\n    xenos::DepthRenderTargetFormat format) {\n  switch (format) {\n    case xenos::DepthRenderTargetFormat::kD24S8:\n      return DXGI_FORMAT_R24G8_TYPELESS;\n    case xenos::DepthRenderTargetFormat::kD24FS8:\n      return DXGI_FORMAT_R32G8X24_TYPELESS;\n    default:\n      assert_unhandled_case(format);\n      return DXGI_FORMAT_UNKNOWN;\n  }\n}\n\nDXGI_FORMAT D3D12RenderTargetCache::GetDepthDSVDXGIFormat(\n    xenos::DepthRenderTargetFormat format) {\n  switch (format) {\n    case xenos::DepthRenderTargetFormat::kD24S8:\n      return DXGI_FORMAT_D24_UNORM_S8_UINT;\n    case xenos::DepthRenderTargetFormat::kD24FS8:\n      return DXGI_FORMAT_D32_FLOAT_S8X24_UINT;\n    default:\n      assert_unhandled_case(format);\n      return DXGI_FORMAT_UNKNOWN;\n  }\n}\n\nDXGI_FORMAT D3D12RenderTargetCache::GetDepthSRVDepthDXGIFormat(\n    xenos::DepthRenderTargetFormat format) {\n  switch (format) {\n    case xenos::DepthRenderTargetFormat::kD24S8:\n      return DXGI_FORMAT_R24_UNORM_X8_TYPELESS;\n    case xenos::DepthRenderTargetFormat::kD24FS8:\n      return DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS;\n    default:\n      assert_unhandled_case(format);\n      return DXGI_FORMAT_UNKNOWN;\n  }\n}\n\nDXGI_FORMAT D3D12RenderTargetCache::GetDepthSRVStencilDXGIFormat(\n    xenos::DepthRenderTargetFormat format) {\n  switch (format) {\n    case xenos::DepthRenderTargetFormat::kD24S8:\n      return DXGI_FORMAT_X24_TYPELESS_G8_UINT;\n    case xenos::DepthRenderTargetFormat::kD24FS8:\n      return DXGI_FORMAT_X32_TYPELESS_G8X24_UINT;\n    default:\n      assert_unhandled_case(format);\n      return DXGI_FORMAT_UNKNOWN;\n  }\n}\n\nbool D3D12RenderTargetCache::IsGammaFormatHostStorageSeparate() const {\n  return gamma_render_target_as_unorm16_;\n}\n\nRenderTargetCache::RenderTarget* D3D12RenderTargetCache::CreateRenderTarget(\n    RenderTargetKey key) {\n  ID3D12Device* device = command_processor_.GetD3D12Provider().GetDevice();\n\n  D3D12_RESOURCE_DESC resource_desc;\n  resource_desc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D;\n  resource_desc.Alignment = 0;\n  resource_desc.Width = key.GetWidth() * draw_resolution_scale_x();\n  resource_desc.Height =\n      GetRenderTargetHeight(key.pitch_tiles_at_32bpp, key.msaa_samples) *\n      draw_resolution_scale_y();\n  resource_desc.DepthOrArraySize = 1;\n  resource_desc.MipLevels = 1;\n  if (key.is_depth) {\n    resource_desc.Format = GetDepthResourceDXGIFormat(key.GetDepthFormat());\n  } else {\n    resource_desc.Format = GetColorResourceDXGIFormat(key.GetColorFormat());\n  }\n  assert_true(resource_desc.Format != DXGI_FORMAT_UNKNOWN);\n  if (resource_desc.Format == DXGI_FORMAT_UNKNOWN) {\n    XELOGE(\"D3D12RenderTargetCache: Unknown {} render target format {}\",\n           key.is_depth ? \"depth\" : \"color\", key.resource_format);\n    return nullptr;\n  }\n  if (key.msaa_samples == xenos::MsaaSamples::k2X && !msaa_2x_supported()) {\n    resource_desc.SampleDesc.Count = 4;\n  } else {\n    resource_desc.SampleDesc.Count = UINT(1) << UINT(key.msaa_samples);\n  }\n  resource_desc.SampleDesc.Quality = 0;\n  resource_desc.Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN;\n  resource_desc.Flags = key.is_depth ? D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL\n                                     : D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET;\n  // The first access will be ownership transfer into this render target or\n  // starting to draw directly.\n  D3D12_RESOURCE_STATES resource_state =\n      key.is_depth ? D3D12_RESOURCE_STATE_DEPTH_WRITE\n                   : D3D12_RESOURCE_STATE_RENDER_TARGET;\n  D3D12_CLEAR_VALUE optimized_clear_value;\n  if (key.is_depth) {\n    optimized_clear_value.Format = GetDepthDSVDXGIFormat(key.GetDepthFormat());\n    // Fixed-point depth is generally direct (1 being the farthest),\n    // floating-point is used for more uniform precision across the range (0\n    // being the farthest).\n    optimized_clear_value.DepthStencil.Depth =\n        key.GetDepthFormat() == xenos::DepthRenderTargetFormat::kD24S8 ? 1.0f\n                                                                       : 0.0f;\n    optimized_clear_value.DepthStencil.Stencil = 0;\n  } else {\n    optimized_clear_value.Format = GetColorDrawDXGIFormat(key.GetColorFormat());\n    optimized_clear_value.Color[0] = 0.0f;\n    optimized_clear_value.Color[1] = 0.0f;\n    optimized_clear_value.Color[2] = 0.0f;\n    optimized_clear_value.Color[3] = 0.0f;\n  }\n  // Create zeroed for more determinism, primarily with respect to compression\n  // and depth float24 / float32 mirroring.\n  Microsoft::WRL::ComPtr<ID3D12Resource> resource;\n  if (FAILED(device->CreateCommittedResource(\n          &ui::d3d12::util::kHeapPropertiesDefault, D3D12_HEAP_FLAG_NONE,\n          &resource_desc, resource_state, &optimized_clear_value,\n          IID_PPV_ARGS(&resource)))) {\n    return nullptr;\n  }\n  {\n    std::u16string resource_name = xe::to_utf16(key.GetDebugName());\n    resource->SetName(reinterpret_cast<LPCWSTR>(resource_name.c_str()));\n  }\n\n  ui::d3d12::D3D12CpuDescriptorPool& descriptor_pool =\n      key.is_depth ? *descriptor_pool_depth_ : *descriptor_pool_color_;\n  ui::d3d12::D3D12CpuDescriptorPool::Descriptor descriptor_draw =\n      descriptor_pool.AllocateDescriptor();\n  ui::d3d12::D3D12CpuDescriptorPool::Descriptor descriptor_srv =\n      descriptor_pool_srv_->AllocateDescriptor();\n  if (!descriptor_draw.IsValid() || !descriptor_srv.IsValid()) {\n    return nullptr;\n  }\n  D3D12_CPU_DESCRIPTOR_HANDLE descriptor_draw_handle =\n      descriptor_draw.GetHandle();\n  ui::d3d12::D3D12CpuDescriptorPool::Descriptor descriptor_load_separate;\n  ui::d3d12::D3D12CpuDescriptorPool::Descriptor descriptor_srv_stencil;\n  D3D12_SHADER_RESOURCE_VIEW_DESC srv_desc;\n  srv_desc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;\n  if (resource_desc.SampleDesc.Count > 1) {\n    srv_desc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2DMS;\n  } else {\n    srv_desc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D;\n    srv_desc.Texture2D.MostDetailedMip = 0;\n    srv_desc.Texture2D.MipLevels = 1;\n    srv_desc.Texture2D.PlaneSlice = 0;\n    srv_desc.Texture2D.ResourceMinLODClamp = 0.0f;\n  }\n  if (key.is_depth) {\n    // DSV and stencil SRV.\n    descriptor_srv_stencil = descriptor_pool_srv_->AllocateDescriptor();\n    if (!descriptor_srv_stencil.IsValid()) {\n      return nullptr;\n    }\n    D3D12_DEPTH_STENCIL_VIEW_DESC dsv_desc;\n    dsv_desc.Format = optimized_clear_value.Format;\n    dsv_desc.Flags = D3D12_DSV_FLAG_NONE;\n    D3D12_SHADER_RESOURCE_VIEW_DESC stencil_srv_desc;\n    stencil_srv_desc.Format =\n        GetDepthSRVStencilDXGIFormat(key.GetDepthFormat());\n    stencil_srv_desc.Shader4ComponentMapping =\n        D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;\n    if (resource_desc.SampleDesc.Count > 1) {\n      dsv_desc.ViewDimension = D3D12_DSV_DIMENSION_TEXTURE2DMS;\n      stencil_srv_desc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2DMS;\n    } else {\n      dsv_desc.ViewDimension = D3D12_DSV_DIMENSION_TEXTURE2D;\n      dsv_desc.Texture2D.MipSlice = 0;\n      stencil_srv_desc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D;\n      stencil_srv_desc.Texture2D.MostDetailedMip = 0;\n      stencil_srv_desc.Texture2D.MipLevels = 1;\n      stencil_srv_desc.Texture2D.PlaneSlice = 1;\n      stencil_srv_desc.Texture2D.ResourceMinLODClamp = 0.0f;\n    }\n    device->CreateDepthStencilView(resource.Get(), &dsv_desc,\n                                   descriptor_draw_handle);\n    device->CreateShaderResourceView(resource.Get(), &stencil_srv_desc,\n                                     descriptor_srv_stencil.GetHandle());\n    // Depth SRV.\n    srv_desc.Format = GetDepthSRVDepthDXGIFormat(key.GetDepthFormat());\n  } else {\n    // Drawing RTV.\n    D3D12_RENDER_TARGET_VIEW_DESC rtv_desc;\n    rtv_desc.Format = optimized_clear_value.Format;\n    if (resource_desc.SampleDesc.Count > 1) {\n      rtv_desc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2DMS;\n    } else {\n      rtv_desc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2D;\n      rtv_desc.Texture2D.MipSlice = 0;\n      rtv_desc.Texture2D.PlaneSlice = 0;\n    }\n    device->CreateRenderTargetView(resource.Get(), &rtv_desc,\n                                   descriptor_draw_handle);\n    // Ownership transfer RTV.\n    DXGI_FORMAT load_format =\n        GetColorOwnershipTransferDXGIFormat(key.GetColorFormat());\n    if (rtv_desc.Format != load_format) {\n      descriptor_load_separate = descriptor_pool.AllocateDescriptor();\n      if (!descriptor_load_separate.IsValid()) {\n        return nullptr;\n      }\n      rtv_desc.Format = load_format;\n      device->CreateRenderTargetView(resource.Get(), &rtv_desc,\n                                     descriptor_load_separate.GetHandle());\n    }\n    // SRV for ownership transfer and dumping.\n    srv_desc.Format = load_format;\n  }\n  device->CreateShaderResourceView(resource.Get(), &srv_desc,\n                                   descriptor_srv.GetHandle());\n\n  return new D3D12RenderTarget(\n      key, resource.Get(), std::move(descriptor_draw),\n      std::move(descriptor_load_separate), std::move(descriptor_srv),\n      std::move(descriptor_srv_stencil), resource_state);\n}\n\nbool D3D12RenderTargetCache::IsHostDepthEncodingDifferent(\n    xenos::DepthRenderTargetFormat format) const {\n  if (format == xenos::DepthRenderTargetFormat::kD24FS8) {\n    return !depth_float24_convert_in_pixel_shader_;\n  }\n  return false;\n}\n\nvoid D3D12RenderTargetCache::RequestPixelShaderInterlockBarrier() {\n  CommitEdramBufferUAVWrites();\n}\n\nvoid D3D12RenderTargetCache::TransitionEdramBuffer(\n    D3D12_RESOURCE_STATES new_state) {\n  if (command_processor_.PushTransitionBarrier(\n          edram_buffer_, edram_buffer_state_, new_state)) {\n    // Resetting edram_buffer_modification_status_ only if the barrier has been\n    // truly inserted - in particular, not resetting it for UAV > UAV as\n    // barriers are dropped if the state hasn't been changed.\n    edram_buffer_modification_status_ =\n        EdramBufferModificationStatus::kUnmodified;\n  }\n  edram_buffer_state_ = new_state;\n}\n\nvoid D3D12RenderTargetCache::MarkEdramBufferModified(\n    EdramBufferModificationStatus modification_status) {\n  assert_true(modification_status !=\n              EdramBufferModificationStatus::kUnmodified);\n  assert_true(edram_buffer_state_ == D3D12_RESOURCE_STATE_UNORDERED_ACCESS);\n  if (edram_buffer_state_ != D3D12_RESOURCE_STATE_UNORDERED_ACCESS) {\n    return;\n  }\n  // max because being modified as a UAV requires stricter synchronization than\n  // as ROV.\n  edram_buffer_modification_status_ =\n      std::max(edram_buffer_modification_status_, modification_status);\n}\n\nvoid D3D12RenderTargetCache::CommitEdramBufferUAVWrites(\n    EdramBufferModificationStatus commit_status) {\n  assert_true(commit_status != EdramBufferModificationStatus::kUnmodified);\n  if (edram_buffer_modification_status_ < commit_status) {\n    return;\n  }\n  assert_true(edram_buffer_state_ == D3D12_RESOURCE_STATE_UNORDERED_ACCESS);\n  if (edram_buffer_state_ == D3D12_RESOURCE_STATE_UNORDERED_ACCESS) {\n    command_processor_.PushUAVBarrier(edram_buffer_);\n  }\n  edram_buffer_modification_status_ =\n      EdramBufferModificationStatus::kUnmodified;\n  PixelShaderInterlockFullEdramBarrierPlaced();\n}\n\nID3D12PipelineState* const*\nD3D12RenderTargetCache::GetOrCreateTransferPipelines(TransferShaderKey key) {\n  const TransferModeInfo& mode = kTransferModes[size_t(key.mode)];\n  bool dest_is_stencil_bit = (mode.output == TransferOutput::kStencilBit);\n\n  if (dest_is_stencil_bit) {\n    auto pipelines_it = transfer_stencil_bit_pipelines_.find(key);\n    if (pipelines_it != transfer_stencil_bit_pipelines_.end()) {\n      return pipelines_it->second[0] ? pipelines_it->second.data() : nullptr;\n    }\n  } else {\n    auto pipeline_it = transfer_pipelines_.find(key);\n    if (pipeline_it != transfer_pipelines_.end()) {\n      return pipeline_it->second ? &pipeline_it->second : nullptr;\n    }\n  }\n\n  uint32_t rs = kTransferUsedRootParameters[size_t(\n      use_stencil_reference_output_ ? mode.root_signature_with_stencil_ref\n                                    : mode.root_signature_no_stencil_ref)];\n\n  // If not dest_is_color, it's depth, or stencil bit - 40-sample columns are\n  // swapped as opposed to color source.\n  bool dest_is_color = (mode.output == TransferOutput::kColor);\n\n  xenos::ColorRenderTargetFormat dest_color_format =\n      xenos::ColorRenderTargetFormat(key.dest_resource_format);\n  xenos::DepthRenderTargetFormat dest_depth_format =\n      xenos::DepthRenderTargetFormat(key.dest_resource_format);\n  bool dest_is_64bpp =\n      dest_is_color && xenos::IsColorRenderTargetFormat64bpp(dest_color_format);\n\n  xenos::ColorRenderTargetFormat source_color_format =\n      xenos::ColorRenderTargetFormat(key.source_resource_format);\n  xenos::DepthRenderTargetFormat source_depth_format =\n      xenos::DepthRenderTargetFormat(key.source_resource_format);\n  // If not source_is_color, it's depth / stencil - 40-sample columns are\n  // swapped as opposed to color destination.\n  bool source_is_color = (rs & kTransferUsedRootParameterColorSRVBit) != 0;\n  bool source_is_64bpp;\n  uint32_t source_color_format_component_count;\n  uint32_t source_color_srv_component_mask;\n  bool source_color_is_uint;\n  if (source_is_color) {\n    assert_zero(rs & kTransferUsedRootParameterDepthSRVBit);\n    assert_zero(rs & kTransferUsedRootParameterStencilSRVBit);\n    source_is_64bpp =\n        xenos::IsColorRenderTargetFormat64bpp(source_color_format);\n    source_color_format_component_count =\n        xenos::GetColorRenderTargetFormatComponentCount(source_color_format);\n    if (dest_is_stencil_bit) {\n      if (source_is_64bpp && !dest_is_64bpp) {\n        // Need one component, but choosing from the two 32bpp halves of the\n        // 64bpp sample.\n        source_color_srv_component_mask =\n            0b1 | (0b1 << (source_color_format_component_count >> 1));\n      } else {\n        // Red is at least 8 bits per component in all formats.\n        source_color_srv_component_mask = 0b1;\n      }\n    } else {\n      source_color_srv_component_mask =\n          (uint32_t(1) << source_color_format_component_count) - 1;\n    }\n    GetColorOwnershipTransferDXGIFormat(source_color_format,\n                                        &source_color_is_uint);\n  } else {\n    source_is_64bpp = false;\n    source_color_format_component_count = 0;\n    source_color_srv_component_mask = 0;\n    source_color_is_uint = false;\n  }\n\n  bool shader_uses_stencil_reference_output =\n      mode.output == TransferOutput::kDepth && use_stencil_reference_output_;\n\n  // Because of built_shader_.resize(), pointers can't be kept persistently\n  // here! Resizing also zeroes the memory.\n\n  built_shader_.clear();\n\n  // RDEF, ISGN, OSGN, SHEX, optionally SFI0, STAT.\n  uint32_t blob_count = 5 + uint32_t(shader_uses_stencil_reference_output);\n\n  // Allocate space for the container header and the blob offsets.\n  built_shader_.resize(sizeof(dxbc::ContainerHeader) / sizeof(uint32_t) +\n                       blob_count);\n  uint32_t blob_offset_position_dwords =\n      sizeof(dxbc::ContainerHeader) / sizeof(uint32_t);\n  uint32_t blob_position_dwords = uint32_t(built_shader_.size());\n  constexpr uint32_t kBlobHeaderSizeDwords =\n      sizeof(dxbc::BlobHeader) / sizeof(uint32_t);\n\n  uint32_t name_ptr;\n\n  // ***************************************************************************\n  // Resource definition\n  // ***************************************************************************\n\n  built_shader_[blob_offset_position_dwords] =\n      uint32_t(blob_position_dwords * sizeof(uint32_t));\n  uint32_t rdef_position_dwords = blob_position_dwords + kBlobHeaderSizeDwords;\n  // Not needed, as the next operation done is resize, to allocate the space for\n  // both the blob header and the resource definition header.\n  // built_shader_.resize(rdef_position_dwords);\n\n  // Allocate space for the RDEF header.\n  built_shader_.resize(rdef_position_dwords +\n                       sizeof(dxbc::RdefHeader) / sizeof(uint32_t));\n  // Generator name.\n  dxbc::AppendAlignedString(built_shader_, \"Xenia\");\n\n  // Constant types - uint (aka \"dword\" when it's scalar) only.\n  // Names.\n  name_ptr = uint32_t((built_shader_.size() - rdef_position_dwords) *\n                      sizeof(uint32_t));\n  uint32_t rdef_dword_name_ptr = name_ptr;\n  name_ptr += dxbc::AppendAlignedString(built_shader_, \"dword\");\n  // Types.\n  uint32_t rdef_type_uint_position_dwords = uint32_t(built_shader_.size());\n  uint32_t rdef_type_uint_ptr =\n      uint32_t((rdef_type_uint_position_dwords - rdef_position_dwords) *\n               sizeof(uint32_t));\n  built_shader_.resize(rdef_type_uint_position_dwords +\n                       sizeof(dxbc::RdefType) / sizeof(uint32_t));\n  {\n    auto& rdef_type_uint = *reinterpret_cast<dxbc::RdefType*>(\n        built_shader_.data() + rdef_type_uint_position_dwords);\n    rdef_type_uint.variable_class = dxbc::RdefVariableClass::kScalar;\n    rdef_type_uint.variable_type = dxbc::RdefVariableType::kUInt;\n    rdef_type_uint.row_count = 1;\n    rdef_type_uint.column_count = 1;\n    rdef_type_uint.name_ptr = rdef_dword_name_ptr;\n  }\n\n  // Constants, if needed:\n  // - uint xe_transfer_stencil_mask\n  // - uint xe_transfer_address\n  // - uint xe_transfer_host_depth_address\n  uint32_t rdef_constant_count = 0;\n  uint32_t rdef_constant_index_stencil_mask =\n      (rs & kTransferUsedRootParameterStencilMaskConstantBit)\n          ? rdef_constant_count++\n          : UINT32_MAX;\n  assert_false(dest_is_stencil_bit &&\n               rdef_constant_index_stencil_mask == UINT32_MAX);\n  uint32_t rdef_constant_index_address =\n      (rs & kTransferUsedRootParameterAddressConstantBit)\n          ? rdef_constant_count++\n          : UINT32_MAX;\n  assert_true(rdef_constant_index_address != UINT32_MAX);\n  uint32_t rdef_constant_index_host_depth_address =\n      (rs & kTransferUsedRootParameterHostDepthAddressConstantBit)\n          ? rdef_constant_count++\n          : UINT32_MAX;\n  // Names.\n  name_ptr = uint32_t((built_shader_.size() - rdef_position_dwords) *\n                      sizeof(uint32_t));\n  uint32_t rdef_xe_transfer_stencil_mask_name_ptr = name_ptr;\n  if (rdef_constant_index_stencil_mask != UINT32_MAX) {\n    name_ptr +=\n        dxbc::AppendAlignedString(built_shader_, \"xe_transfer_stencil_mask\");\n  }\n  uint32_t rdef_xe_transfer_address_name_ptr = name_ptr;\n  if (rdef_constant_index_address != UINT32_MAX) {\n    name_ptr += dxbc::AppendAlignedString(built_shader_, \"xe_transfer_address\");\n  }\n  uint32_t rdef_xe_transfer_host_depth_address_name_ptr = name_ptr;\n  if (rdef_constant_index_host_depth_address != UINT32_MAX) {\n    name_ptr += dxbc::AppendAlignedString(built_shader_,\n                                          \"xe_transfer_host_depth_address\");\n  }\n  // Constants.\n  uint32_t rdef_constants_position_dwords = uint32_t(built_shader_.size());\n  uint32_t rdef_constants_ptr =\n      uint32_t((rdef_constants_position_dwords - rdef_position_dwords) *\n               sizeof(uint32_t));\n  built_shader_.resize(rdef_constants_position_dwords +\n                       sizeof(dxbc::RdefVariable) / sizeof(uint32_t) *\n                           rdef_constant_count);\n  {\n    auto rdef_constants = reinterpret_cast<dxbc::RdefVariable*>(\n        built_shader_.data() + rdef_constants_position_dwords);\n    // uint xe_transfer_stencil_mask\n    if (rdef_constant_index_stencil_mask != UINT32_MAX) {\n      dxbc::RdefVariable& rdef_constant_stencil_mask =\n          rdef_constants[rdef_constant_index_stencil_mask];\n      rdef_constant_stencil_mask.name_ptr =\n          rdef_xe_transfer_stencil_mask_name_ptr;\n      rdef_constant_stencil_mask.size_bytes = sizeof(uint32_t);\n      rdef_constant_stencil_mask.flags = dxbc::kRdefVariableFlagUsed;\n      rdef_constant_stencil_mask.type_ptr = rdef_type_uint_ptr;\n      rdef_constant_stencil_mask.start_texture = UINT32_MAX;\n      rdef_constant_stencil_mask.start_sampler = UINT32_MAX;\n    }\n    // uint xe_transfer_address\n    if (rdef_constant_index_address != UINT32_MAX) {\n      dxbc::RdefVariable& rdef_constant_address =\n          rdef_constants[rdef_constant_index_address];\n      rdef_constant_address.name_ptr = rdef_xe_transfer_address_name_ptr;\n      rdef_constant_address.size_bytes = sizeof(uint32_t);\n      rdef_constant_address.flags = dxbc::kRdefVariableFlagUsed;\n      rdef_constant_address.type_ptr = rdef_type_uint_ptr;\n      rdef_constant_address.start_texture = UINT32_MAX;\n      rdef_constant_address.start_sampler = UINT32_MAX;\n    }\n    // uint xe_transfer_host_depth_address\n    if (rdef_constant_index_host_depth_address != UINT32_MAX) {\n      dxbc::RdefVariable& rdef_constant_host_depth_address =\n          rdef_constants[rdef_constant_index_host_depth_address];\n      rdef_constant_host_depth_address.name_ptr =\n          rdef_xe_transfer_host_depth_address_name_ptr;\n      rdef_constant_host_depth_address.size_bytes = sizeof(uint32_t);\n      rdef_constant_host_depth_address.flags = dxbc::kRdefVariableFlagUsed;\n      rdef_constant_host_depth_address.type_ptr = rdef_type_uint_ptr;\n      rdef_constant_host_depth_address.start_texture = UINT32_MAX;\n      rdef_constant_host_depth_address.start_sampler = UINT32_MAX;\n    }\n  }\n\n  // Constant buffers, if needed:\n  // - xe_transfer_stencil_mask { uint xe_transfer_stencil_mask; }\n  // - xe_transfer_address { uint xe_transfer_address; }\n  // - xe_transfer_host_depth_address { uint xe_transfer_host_depth_address; }\n  // Reusing the constant names for constant buffers.\n  uint32_t rdef_cbuffer_count = 0;\n  uint32_t cbuffer_index_stencil_mask =\n      rdef_constant_index_stencil_mask != UINT32_MAX ? rdef_cbuffer_count++\n                                                     : UINT32_MAX;\n  uint32_t cbuffer_index_address = rdef_constant_index_address != UINT32_MAX\n                                       ? rdef_cbuffer_count++\n                                       : UINT32_MAX;\n  uint32_t cbuffer_index_host_depth_address =\n      rdef_constant_index_host_depth_address != UINT32_MAX\n          ? rdef_cbuffer_count++\n          : UINT32_MAX;\n  uint32_t rdef_cbuffer_position_dwords = uint32_t(built_shader_.size());\n  built_shader_.resize(rdef_cbuffer_position_dwords +\n                       sizeof(dxbc::RdefCbuffer) / sizeof(uint32_t) *\n                           rdef_cbuffer_count);\n  {\n    auto rdef_cbuffers = reinterpret_cast<dxbc::RdefCbuffer*>(\n        built_shader_.data() + rdef_cbuffer_position_dwords);\n    // xe_transfer_stencil_mask\n    if (cbuffer_index_stencil_mask != UINT32_MAX) {\n      dxbc::RdefCbuffer& rdef_cbuffer_stencil_mask =\n          rdef_cbuffers[cbuffer_index_stencil_mask];\n      rdef_cbuffer_stencil_mask.name_ptr =\n          rdef_xe_transfer_stencil_mask_name_ptr;\n      rdef_cbuffer_stencil_mask.variable_count = 1;\n      rdef_cbuffer_stencil_mask.variables_ptr =\n          uint32_t(rdef_constants_ptr + sizeof(dxbc::RdefVariable) *\n                                            rdef_constant_index_stencil_mask);\n      rdef_cbuffer_stencil_mask.size_vector_aligned_bytes =\n          sizeof(uint32_t) * 4;\n    }\n    // xe_transfer_address\n    if (cbuffer_index_address != UINT32_MAX) {\n      dxbc::RdefCbuffer& rdef_cbuffer_address =\n          rdef_cbuffers[cbuffer_index_address];\n      rdef_cbuffer_address.name_ptr = rdef_xe_transfer_address_name_ptr;\n      rdef_cbuffer_address.variable_count = 1;\n      rdef_cbuffer_address.variables_ptr =\n          uint32_t(rdef_constants_ptr +\n                   sizeof(dxbc::RdefVariable) * rdef_constant_index_address);\n      rdef_cbuffer_address.size_vector_aligned_bytes = sizeof(uint32_t) * 4;\n    }\n    // xe_transfer_host_depth_address\n    if (cbuffer_index_host_depth_address != UINT32_MAX) {\n      dxbc::RdefCbuffer& rdef_cbuffer_host_depth_address =\n          rdef_cbuffers[cbuffer_index_host_depth_address];\n      rdef_cbuffer_host_depth_address.name_ptr =\n          rdef_xe_transfer_host_depth_address_name_ptr;\n      rdef_cbuffer_host_depth_address.variable_count = 1;\n      rdef_cbuffer_host_depth_address.variables_ptr = uint32_t(\n          rdef_constants_ptr +\n          sizeof(dxbc::RdefVariable) * rdef_constant_index_host_depth_address);\n      rdef_cbuffer_host_depth_address.size_vector_aligned_bytes =\n          sizeof(uint32_t) * 4;\n    }\n  }\n\n  // Bindings.\n  // - Texture2D/Texture2DMS<floatN/uintN> xe_transfer_color\n  // - Texture2D/Texture2DMS<float> xe_transfer_depth\n  // - Texture2D/Texture2DMS<uint2> xe_transfer_stencil\n  // - Texture2D<float>/Texture2DMS<float>/Buffer<uint> xe_transfer_host_depth\n  // - Constant buffers\n  uint32_t rdef_srv_count = 0;\n  uint32_t srv_index_color = (rs & kTransferUsedRootParameterColorSRVBit)\n                                 ? rdef_srv_count++\n                                 : UINT32_MAX;\n  uint32_t srv_index_depth = (rs & kTransferUsedRootParameterDepthSRVBit)\n                                 ? rdef_srv_count++\n                                 : UINT32_MAX;\n  uint32_t srv_index_stencil = (rs & kTransferUsedRootParameterStencilSRVBit)\n                                   ? rdef_srv_count++\n                                   : UINT32_MAX;\n  uint32_t srv_index_host_depth =\n      (rs & kTransferUsedRootParameterHostDepthSRVBit) ? rdef_srv_count++\n                                                       : UINT32_MAX;\n  uint32_t rdef_binding_count = rdef_srv_count + rdef_cbuffer_count;\n  // Names.\n  name_ptr = uint32_t((built_shader_.size() - rdef_position_dwords) *\n                      sizeof(uint32_t));\n  uint32_t rdef_xe_transfer_color_name_ptr = name_ptr;\n  if (srv_index_color != UINT32_MAX) {\n    name_ptr += dxbc::AppendAlignedString(built_shader_, \"xe_transfer_color\");\n  }\n  uint32_t rdef_xe_transfer_depth_name_ptr = name_ptr;\n  if (srv_index_depth != UINT32_MAX) {\n    name_ptr += dxbc::AppendAlignedString(built_shader_, \"xe_transfer_depth\");\n  }\n  uint32_t rdef_xe_transfer_stencil_name_ptr = name_ptr;\n  if (srv_index_stencil != UINT32_MAX) {\n    name_ptr += dxbc::AppendAlignedString(built_shader_, \"xe_transfer_stencil\");\n  }\n  uint32_t rdef_xe_transfer_host_depth_name_ptr = name_ptr;\n  if (srv_index_host_depth != UINT32_MAX) {\n    name_ptr +=\n        dxbc::AppendAlignedString(built_shader_, \"xe_transfer_host_depth\");\n  }\n  // Bindings.\n  uint32_t rdef_binding_position_dwords = uint32_t(built_shader_.size());\n  built_shader_.resize(rdef_binding_position_dwords +\n                       sizeof(dxbc::RdefInputBind) / sizeof(uint32_t) *\n                           rdef_binding_count);\n  {\n    auto rdef_bindings = reinterpret_cast<dxbc::RdefInputBind*>(\n        built_shader_.data() + rdef_binding_position_dwords);\n    uint32_t rdef_binding_index = 0;\n    // xe_transfer_color\n    if (srv_index_color != UINT32_MAX) {\n      dxbc::RdefInputBind& rdef_binding_color =\n          rdef_bindings[rdef_binding_index++];\n      rdef_binding_color.name_ptr = rdef_xe_transfer_color_name_ptr;\n      rdef_binding_color.type = dxbc::RdefInputType::kTexture;\n      rdef_binding_color.return_type = source_color_is_uint\n                                           ? dxbc::ResourceReturnType::kUInt\n                                           : dxbc::ResourceReturnType::kFloat;\n      if (key.source_msaa_samples != xenos::MsaaSamples::k1X) {\n        rdef_binding_color.dimension = dxbc::RdefDimension::kSRVTexture2DMS;\n      } else {\n        rdef_binding_color.dimension = dxbc::RdefDimension::kSRVTexture2D;\n        rdef_binding_color.sample_count = UINT32_MAX;\n      }\n      rdef_binding_color.bind_point = kTransferSRVRegisterColor;\n      rdef_binding_color.bind_count = 1;\n      assert_not_zero(source_color_srv_component_mask);\n      rdef_binding_color.flags =\n          (32 - xe::lzcnt(source_color_srv_component_mask) - 1)\n          << dxbc::kRdefInputFlagsComponentsShift;\n      rdef_binding_color.id = srv_index_color;\n    }\n    // xe_transfer_depth\n    if (srv_index_depth != UINT32_MAX) {\n      dxbc::RdefInputBind& rdef_binding_depth =\n          rdef_bindings[rdef_binding_index++];\n      rdef_binding_depth.name_ptr = rdef_xe_transfer_depth_name_ptr;\n      rdef_binding_depth.type = dxbc::RdefInputType::kTexture;\n      rdef_binding_depth.return_type = dxbc::ResourceReturnType::kFloat;\n      if (key.source_msaa_samples != xenos::MsaaSamples::k1X) {\n        rdef_binding_depth.dimension = dxbc::RdefDimension::kSRVTexture2DMS;\n      } else {\n        rdef_binding_depth.dimension = dxbc::RdefDimension::kSRVTexture2D;\n        rdef_binding_depth.sample_count = UINT32_MAX;\n      }\n      rdef_binding_depth.bind_point = kTransferSRVRegisterDepth;\n      rdef_binding_depth.bind_count = 1;\n      rdef_binding_depth.id = srv_index_depth;\n    }\n    // xe_transfer_stencil\n    if (srv_index_stencil != UINT32_MAX) {\n      dxbc::RdefInputBind& rdef_binding_stencil =\n          rdef_bindings[rdef_binding_index++];\n      rdef_binding_stencil.name_ptr = rdef_xe_transfer_stencil_name_ptr;\n      rdef_binding_stencil.type = dxbc::RdefInputType::kTexture;\n      rdef_binding_stencil.return_type = dxbc::ResourceReturnType::kUInt;\n      if (key.source_msaa_samples != xenos::MsaaSamples::k1X) {\n        rdef_binding_stencil.dimension = dxbc::RdefDimension::kSRVTexture2DMS;\n      } else {\n        rdef_binding_stencil.dimension = dxbc::RdefDimension::kSRVTexture2D;\n        rdef_binding_stencil.sample_count = UINT32_MAX;\n      }\n      rdef_binding_stencil.bind_point = kTransferSRVRegisterStencil;\n      rdef_binding_stencil.bind_count = 1;\n      rdef_binding_stencil.flags = dxbc::kRdefInputFlags2Component;\n      rdef_binding_stencil.id = srv_index_stencil;\n    }\n    // xe_transfer_host_depth\n    if (srv_index_host_depth != UINT32_MAX) {\n      dxbc::RdefInputBind& rdef_binding_host_depth =\n          rdef_bindings[rdef_binding_index++];\n      rdef_binding_host_depth.name_ptr = rdef_xe_transfer_host_depth_name_ptr;\n      rdef_binding_host_depth.type = dxbc::RdefInputType::kTexture;\n      if (key.host_depth_source_is_copy) {\n        // Float as uint.\n        rdef_binding_host_depth.return_type = dxbc::ResourceReturnType::kUInt;\n        rdef_binding_host_depth.dimension = dxbc::RdefDimension::kSRVBuffer;\n        rdef_binding_host_depth.sample_count = UINT32_MAX;\n      } else {\n        rdef_binding_host_depth.return_type = dxbc::ResourceReturnType::kFloat;\n        if (key.host_depth_source_msaa_samples != xenos::MsaaSamples::k1X) {\n          rdef_binding_host_depth.dimension =\n              dxbc::RdefDimension::kSRVTexture2DMS;\n        } else {\n          rdef_binding_host_depth.dimension =\n              dxbc::RdefDimension::kSRVTexture2D;\n          rdef_binding_host_depth.sample_count = UINT32_MAX;\n        }\n      }\n      rdef_binding_host_depth.bind_point = kTransferSRVRegisterHostDepth;\n      rdef_binding_host_depth.bind_count = 1;\n      rdef_binding_host_depth.id = srv_index_host_depth;\n    }\n    // xe_transfer_stencil_mask\n    if (cbuffer_index_stencil_mask != UINT32_MAX) {\n      dxbc::RdefInputBind& rdef_binding_stencil_mask =\n          rdef_bindings[rdef_binding_index++];\n      rdef_binding_stencil_mask.name_ptr =\n          rdef_xe_transfer_stencil_mask_name_ptr;\n      rdef_binding_stencil_mask.type = dxbc::RdefInputType::kCbuffer;\n      rdef_binding_stencil_mask.bind_point = kTransferCBVRegisterStencilMask;\n      rdef_binding_stencil_mask.bind_count = 1;\n      rdef_binding_stencil_mask.flags = dxbc::kRdefInputFlagUserPacked;\n      rdef_binding_stencil_mask.id = cbuffer_index_stencil_mask;\n    }\n    // xe_transfer_address\n    if (cbuffer_index_address != UINT32_MAX) {\n      dxbc::RdefInputBind& rdef_binding_address =\n          rdef_bindings[rdef_binding_index++];\n      rdef_binding_address.name_ptr = rdef_xe_transfer_address_name_ptr;\n      rdef_binding_address.type = dxbc::RdefInputType::kCbuffer;\n      rdef_binding_address.bind_point = kTransferCBVRegisterAddress;\n      rdef_binding_address.bind_count = 1;\n      rdef_binding_address.flags = dxbc::kRdefInputFlagUserPacked;\n      rdef_binding_address.id = cbuffer_index_address;\n    }\n    // xe_transfer_host_depth_address\n    if (cbuffer_index_host_depth_address != UINT32_MAX) {\n      dxbc::RdefInputBind& rdef_binding_host_depth_address =\n          rdef_bindings[rdef_binding_index++];\n      rdef_binding_host_depth_address.name_ptr =\n          rdef_xe_transfer_host_depth_address_name_ptr;\n      rdef_binding_host_depth_address.type = dxbc::RdefInputType::kCbuffer;\n      rdef_binding_host_depth_address.bind_point =\n          kTransferCBVRegisterHostDepthAddress;\n      rdef_binding_host_depth_address.bind_count = 1;\n      rdef_binding_host_depth_address.flags = dxbc::kRdefInputFlagUserPacked;\n      rdef_binding_host_depth_address.id = cbuffer_index_host_depth_address;\n    }\n  }\n\n  // Header.\n  {\n    auto& rdef_header = *reinterpret_cast<dxbc::RdefHeader*>(\n        built_shader_.data() + rdef_position_dwords);\n    rdef_header.cbuffer_count = rdef_cbuffer_count;\n    rdef_header.cbuffers_ptr =\n        uint32_t((rdef_cbuffer_position_dwords - rdef_position_dwords) *\n                 sizeof(uint32_t));\n    rdef_header.input_bind_count = rdef_binding_count;\n    rdef_header.input_binds_ptr =\n        uint32_t((rdef_binding_position_dwords - rdef_position_dwords) *\n                 sizeof(uint32_t));\n    rdef_header.shader_model = dxbc::RdefShaderModel::kPixelShader5_1;\n    rdef_header.compile_flags =\n        dxbc::kCompileFlagNoPreshader | dxbc::kCompileFlagPreferFlowControl |\n        dxbc::kCompileFlagIeeeStrictness | dxbc::kCompileFlagAllResourcesBound;\n    // Generator name is right after the header.\n    rdef_header.generator_name_ptr = sizeof(dxbc::RdefHeader);\n    rdef_header.fourcc = dxbc::RdefHeader::FourCC::k5_1;\n    rdef_header.InitializeSizes();\n  }\n\n  {\n    auto& blob_header = *reinterpret_cast<dxbc::BlobHeader*>(\n        built_shader_.data() + blob_position_dwords);\n    blob_header.fourcc = dxbc::BlobHeader::FourCC::kResourceDefinition;\n    blob_position_dwords = uint32_t(built_shader_.size());\n    blob_header.size_bytes =\n        (blob_position_dwords - kBlobHeaderSizeDwords) * sizeof(uint32_t) -\n        built_shader_[blob_offset_position_dwords++];\n  }\n\n  // ***************************************************************************\n  // Input signature\n  // ***************************************************************************\n\n  // Registers for accessing in the shader code - multiple inputs may be packed\n  // into the same register.\n  enum InputRegister : uint32_t {\n    kInputRegisterPosition,\n    kInputRegisterSampleIndex,\n    kInputRegisterCount,\n  };\n\n  // Position, and for multisampled, sample index.\n  uint32_t isgn_parameter_count =\n      1 + uint32_t(key.dest_msaa_samples != xenos::MsaaSamples::k1X);\n\n  // Reserve space for the header and the parameters.\n  built_shader_[blob_offset_position_dwords] =\n      uint32_t(blob_position_dwords * sizeof(uint32_t));\n  uint32_t isgn_position_dwords = blob_position_dwords + kBlobHeaderSizeDwords;\n  built_shader_.resize(isgn_position_dwords +\n                       sizeof(dxbc::Signature) / sizeof(uint32_t) +\n                       sizeof(dxbc::SignatureParameter) / sizeof(uint32_t) *\n                           isgn_parameter_count);\n\n  // Names (after the parameters).\n  name_ptr = uint32_t((built_shader_.size() - isgn_position_dwords) *\n                      sizeof(uint32_t));\n  uint32_t isgn_sv_position_name_ptr = name_ptr;\n  name_ptr += dxbc::AppendAlignedString(built_shader_, \"SV_Position\");\n  uint32_t isgn_sv_sample_index_name_ptr = name_ptr;\n  if (key.dest_msaa_samples != xenos::MsaaSamples::k1X) {\n    name_ptr += dxbc::AppendAlignedString(built_shader_, \"SV_SampleIndex\");\n  }\n\n  // Header and parameters.\n  {\n    // Header.\n    auto& isgn_header = *reinterpret_cast<dxbc::Signature*>(\n        built_shader_.data() + isgn_position_dwords);\n    isgn_header.parameter_count = isgn_parameter_count;\n    isgn_header.parameter_info_ptr = sizeof(dxbc::Signature);\n    // Parameters.\n    auto isgn_parameters = reinterpret_cast<dxbc::SignatureParameter*>(\n        built_shader_.data() + isgn_position_dwords +\n        sizeof(dxbc::Signature) / sizeof(uint32_t));\n    uint32_t isgn_parameter_index = 0;\n    // SV_Position.xy\n    dxbc::SignatureParameter& isgn_sv_position =\n        isgn_parameters[isgn_parameter_index++];\n    isgn_sv_position.semantic_name_ptr = isgn_sv_position_name_ptr;\n    isgn_sv_position.system_value = dxbc::Name::kPosition;\n    isgn_sv_position.component_type =\n        dxbc::SignatureRegisterComponentType::kFloat32;\n    isgn_sv_position.register_index = kInputRegisterPosition;\n    isgn_sv_position.mask = 0b1111;\n    isgn_sv_position.always_reads_mask = 0b0011;\n    // SV_SampleIndex\n    if (key.dest_msaa_samples != xenos::MsaaSamples::k1X) {\n      dxbc::SignatureParameter& isgn_sv_sample_index =\n          isgn_parameters[isgn_parameter_index++];\n      isgn_sv_sample_index.semantic_name_ptr = isgn_sv_sample_index_name_ptr;\n      isgn_sv_sample_index.system_value = dxbc::Name::kSampleIndex;\n      isgn_sv_sample_index.component_type =\n          dxbc::SignatureRegisterComponentType::kUInt32;\n      isgn_sv_sample_index.register_index = kInputRegisterSampleIndex;\n      isgn_sv_sample_index.mask = 0b0001;\n      isgn_sv_sample_index.always_reads_mask = 0b0001;\n    }\n  }\n\n  {\n    auto& blob_header = *reinterpret_cast<dxbc::BlobHeader*>(\n        built_shader_.data() + blob_position_dwords);\n    blob_header.fourcc = dxbc::BlobHeader::FourCC::kInputSignature;\n    blob_position_dwords = uint32_t(built_shader_.size());\n    blob_header.size_bytes =\n        (blob_position_dwords - kBlobHeaderSizeDwords) * sizeof(uint32_t) -\n        built_shader_[blob_offset_position_dwords++];\n  }\n\n  // ***************************************************************************\n  // Output signature\n  // ***************************************************************************\n\n  // Color or depth.\n  uint32_t osgn_parameter_count = 0;\n  uint32_t osgn_parameter_index_sv_target =\n      mode.output == TransferOutput::kColor ? osgn_parameter_count++\n                                            : UINT32_MAX;\n  uint32_t osgn_parameter_index_sv_depth = mode.output == TransferOutput::kDepth\n                                               ? osgn_parameter_count++\n                                               : UINT32_MAX;\n  uint32_t osgn_parameter_index_sv_stencil_ref =\n      shader_uses_stencil_reference_output ? osgn_parameter_count++\n                                           : UINT32_MAX;\n\n  // Reserve space for the header and the parameters.\n  built_shader_[blob_offset_position_dwords] =\n      uint32_t(blob_position_dwords * sizeof(uint32_t));\n  uint32_t osgn_position_dwords = blob_position_dwords + kBlobHeaderSizeDwords;\n  built_shader_.resize(osgn_position_dwords +\n                       sizeof(dxbc::Signature) / sizeof(uint32_t) +\n                       sizeof(dxbc::SignatureParameter) / sizeof(uint32_t) *\n                           osgn_parameter_count);\n\n  // Names (after the parameters).\n  name_ptr = uint32_t((built_shader_.size() - osgn_position_dwords) *\n                      sizeof(uint32_t));\n  uint32_t osgn_sv_target_name_ptr = name_ptr;\n  if (osgn_parameter_index_sv_target != UINT32_MAX) {\n    name_ptr += dxbc::AppendAlignedString(built_shader_, \"SV_Target\");\n  }\n  uint32_t osgn_sv_depth_name_ptr = name_ptr;\n  if (osgn_parameter_index_sv_depth != UINT32_MAX) {\n    name_ptr += dxbc::AppendAlignedString(built_shader_, \"SV_Depth\");\n  }\n  uint32_t osgn_sv_stencil_ref_name_ptr = name_ptr;\n  if (osgn_parameter_index_sv_stencil_ref != UINT32_MAX) {\n    name_ptr += dxbc::AppendAlignedString(built_shader_, \"SV_StencilRef\");\n  }\n\n  bool dest_color_is_uint;\n  if (mode.output == TransferOutput::kColor) {\n    GetColorOwnershipTransferDXGIFormat(dest_color_format, &dest_color_is_uint);\n  } else {\n    dest_color_is_uint = false;\n  }\n\n  // Header and parameters.\n  {\n    // Header.\n    auto& osgn_header = *reinterpret_cast<dxbc::Signature*>(\n        built_shader_.data() + osgn_position_dwords);\n    osgn_header.parameter_count = osgn_parameter_count;\n    osgn_header.parameter_info_ptr = sizeof(dxbc::Signature);\n    // Parameters.\n    auto osgn_parameters = reinterpret_cast<dxbc::SignatureParameter*>(\n        built_shader_.data() + osgn_position_dwords +\n        sizeof(dxbc::Signature) / sizeof(uint32_t));\n    // SV_Target\n    if (osgn_parameter_index_sv_target != UINT32_MAX) {\n      dxbc::SignatureParameter& osgn_sv_target =\n          osgn_parameters[osgn_parameter_index_sv_target];\n      osgn_sv_target.semantic_name_ptr = osgn_sv_target_name_ptr;\n      osgn_sv_target.component_type =\n          dest_color_is_uint ? dxbc::SignatureRegisterComponentType::kUInt32\n                             : dxbc::SignatureRegisterComponentType::kFloat32;\n      osgn_sv_target.register_index = 0;\n      osgn_sv_target.mask = 0b1111;\n    }\n    // SV_Depth\n    if (osgn_parameter_index_sv_depth != UINT32_MAX) {\n      dxbc::SignatureParameter& osgn_sv_depth =\n          osgn_parameters[osgn_parameter_index_sv_depth];\n      osgn_sv_depth.semantic_name_ptr = osgn_sv_depth_name_ptr;\n      osgn_sv_depth.component_type =\n          dxbc::SignatureRegisterComponentType::kFloat32;\n      osgn_sv_depth.register_index = UINT32_MAX;\n      osgn_sv_depth.mask = 0b0001;\n      osgn_sv_depth.never_writes_mask = 0b1110;\n    }\n    // SV_StencilRef\n    if (osgn_parameter_index_sv_stencil_ref != UINT32_MAX) {\n      dxbc::SignatureParameter& osgn_sv_stencil_ref =\n          osgn_parameters[osgn_parameter_index_sv_stencil_ref];\n      osgn_sv_stencil_ref.semantic_name_ptr = osgn_sv_stencil_ref_name_ptr;\n      // Older versions of FXC incorrectly expect SV_StencilRef to be float,\n      // it's always uint in DXC and also in the latest versions of FXC.\n      osgn_sv_stencil_ref.component_type =\n          dxbc::SignatureRegisterComponentType::kUInt32;\n      osgn_sv_stencil_ref.register_index = UINT32_MAX;\n      osgn_sv_stencil_ref.mask = 0b0001;\n      osgn_sv_stencil_ref.never_writes_mask = 0b1110;\n    }\n  }\n\n  {\n    auto& blob_header = *reinterpret_cast<dxbc::BlobHeader*>(\n        built_shader_.data() + blob_position_dwords);\n    blob_header.fourcc = dxbc::BlobHeader::FourCC::kOutputSignature;\n    blob_position_dwords = uint32_t(built_shader_.size());\n    blob_header.size_bytes =\n        (blob_position_dwords - kBlobHeaderSizeDwords) * sizeof(uint32_t) -\n        built_shader_[blob_offset_position_dwords++];\n  }\n\n  // ***************************************************************************\n  // Shader program\n  // ***************************************************************************\n\n  built_shader_[blob_offset_position_dwords] =\n      uint32_t(blob_position_dwords * sizeof(uint32_t));\n  uint32_t shex_position_dwords = blob_position_dwords + kBlobHeaderSizeDwords;\n  built_shader_.resize(shex_position_dwords);\n\n  built_shader_.push_back(\n      dxbc::VersionToken(dxbc::ProgramType::kPixelShader, 5, 1));\n  // Reserve space for the length token.\n  built_shader_.push_back(0);\n\n  dxbc::Statistics stat;\n  std::memset(&stat, 0, sizeof(dxbc::Statistics));\n  dxbc::Assembler a(built_shader_, stat);\n\n  a.OpDclGlobalFlags(dxbc::kGlobalFlagAllResourcesBound);\n  if (cbuffer_index_stencil_mask != UINT32_MAX) {\n    a.OpDclConstantBuffer(\n        dxbc::Src::CB(dxbc::Src::Dcl, cbuffer_index_stencil_mask,\n                      kTransferCBVRegisterStencilMask,\n                      kTransferCBVRegisterStencilMask),\n        1);\n  }\n  if (cbuffer_index_address != UINT32_MAX) {\n    a.OpDclConstantBuffer(\n        dxbc::Src::CB(dxbc::Src::Dcl, cbuffer_index_address,\n                      kTransferCBVRegisterAddress, kTransferCBVRegisterAddress),\n        1);\n  }\n  if (cbuffer_index_host_depth_address != UINT32_MAX) {\n    a.OpDclConstantBuffer(\n        dxbc::Src::CB(dxbc::Src::Dcl, cbuffer_index_host_depth_address,\n                      kTransferCBVRegisterHostDepthAddress,\n                      kTransferCBVRegisterHostDepthAddress),\n        1);\n  }\n  if (srv_index_color != UINT32_MAX) {\n    a.OpDclResource(\n        key.source_msaa_samples != xenos::MsaaSamples::k1X\n            ? dxbc::ResourceDimension::kTexture2DMS\n            : dxbc::ResourceDimension::kTexture2D,\n        dxbc::ResourceReturnTypeX4Token(source_color_is_uint\n                                            ? dxbc::ResourceReturnType::kUInt\n                                            : dxbc::ResourceReturnType::kFloat),\n        dxbc::Src::T(dxbc::Src::Dcl, srv_index_color, kTransferSRVRegisterColor,\n                     kTransferSRVRegisterColor));\n  }\n  if (srv_index_depth != UINT32_MAX) {\n    a.OpDclResource(\n        key.source_msaa_samples != xenos::MsaaSamples::k1X\n            ? dxbc::ResourceDimension::kTexture2DMS\n            : dxbc::ResourceDimension::kTexture2D,\n        dxbc::ResourceReturnTypeX4Token(dxbc::ResourceReturnType::kFloat),\n        dxbc::Src::T(dxbc::Src::Dcl, srv_index_depth, kTransferSRVRegisterDepth,\n                     kTransferSRVRegisterDepth));\n  }\n  if (srv_index_stencil != UINT32_MAX) {\n    a.OpDclResource(\n        key.source_msaa_samples != xenos::MsaaSamples::k1X\n            ? dxbc::ResourceDimension::kTexture2DMS\n            : dxbc::ResourceDimension::kTexture2D,\n        dxbc::ResourceReturnTypeX4Token(dxbc::ResourceReturnType::kUInt),\n        dxbc::Src::T(dxbc::Src::Dcl, srv_index_stencil,\n                     kTransferSRVRegisterStencil, kTransferSRVRegisterStencil));\n  }\n  if (srv_index_host_depth != UINT32_MAX) {\n    a.OpDclResource(\n        key.host_depth_source_is_copy\n            ? dxbc::ResourceDimension::kBuffer\n            : (key.host_depth_source_msaa_samples != xenos::MsaaSamples::k1X\n                   ? dxbc::ResourceDimension::kTexture2DMS\n                   : dxbc::ResourceDimension::kTexture2D),\n        dxbc::ResourceReturnTypeX4Token(dxbc::ResourceReturnType::kFloat),\n        dxbc::Src::T(dxbc::Src::Dcl, srv_index_host_depth,\n                     kTransferSRVRegisterHostDepth,\n                     kTransferSRVRegisterHostDepth));\n  }\n  a.OpDclInputPSSIV(dxbc::InterpolationMode::kLinearNoPerspective,\n                    dxbc::Dest::V1D(kInputRegisterPosition, 0b0011),\n                    dxbc::Name::kPosition);\n  if (key.dest_msaa_samples != xenos::MsaaSamples::k1X) {\n    a.OpDclInputPSSGV(dxbc::Dest::V1D(kInputRegisterSampleIndex, 0b0001),\n                      dxbc::Name::kSampleIndex);\n  }\n  if (osgn_parameter_index_sv_target != UINT32_MAX) {\n    a.OpDclOutput(dxbc::Dest::O(0));\n  }\n  if (osgn_parameter_index_sv_depth != UINT32_MAX) {\n    a.OpDclOutput(dxbc::Dest::ODepth());\n  }\n  if (osgn_parameter_index_sv_stencil_ref != UINT32_MAX) {\n    a.OpDclOutput(dxbc::Dest::OStencilRef());\n  }\n  // r0:r2 are involved at least in common addressing code. Texture loads\n  // usually can overwrite some of the addressing temps as they are only needed\n  // for the coordinates for that load. Currently 3 temps are enough.\n  a.OpDclTemps(3);\n\n  uint32_t draw_resolution_scale_x = this->draw_resolution_scale_x();\n  uint32_t draw_resolution_scale_y = this->draw_resolution_scale_y();\n\n  uint32_t tile_width_samples =\n      xenos::kEdramTileWidthSamples * draw_resolution_scale_x;\n  uint32_t tile_height_samples =\n      xenos::kEdramTileHeightSamples * draw_resolution_scale_y;\n\n  // Split the destination pixel index into 32bpp tile in r0.zw and\n  // 32bpp-tile-relative pixel index in r0.xy.\n  // r0.xy = pixel XY as uint\n  a.OpFToU(dxbc::Dest::R(0, 0b0011), dxbc::Src::V1D(kInputRegisterPosition));\n  uint32_t dest_tile_width_pixels =\n      tile_width_samples >>\n      (uint32_t(dest_is_64bpp) +\n       uint32_t(key.dest_msaa_samples >= xenos::MsaaSamples::k4X));\n  uint32_t dest_tile_height_pixels =\n      tile_height_samples >>\n      uint32_t(key.dest_msaa_samples >= xenos::MsaaSamples::k2X);\n  // r0.xy = destination pixel XY index within the 32bpp tile\n  // r0.zw = 32bpp tile XY index\n  a.OpUDiv(dxbc::Dest::R(0, 0b1100), dxbc::Dest::R(0, 0b0011),\n           dxbc::Src::R(0, 0b01000100),\n           dxbc::Src::LU(dest_tile_width_pixels, dest_tile_height_pixels,\n                         dest_tile_width_pixels, dest_tile_height_pixels));\n\n  // r1.x = destination pitch in 32bpp tiles\n  a.OpUBFE(dxbc::Dest::R(1, 0b0001), dxbc::Src::LU(xenos::kEdramPitchTilesBits),\n           dxbc::Src::LU(0),\n           dxbc::Src::CB(cbuffer_index_address, kTransferCBVRegisterAddress, 0,\n                         dxbc::Src::kXXXX));\n  // r0.z = 32bpp tile index relative to the destination base\n  // r0.w = free\n  // r1.x = free\n  a.OpUMAd(dxbc::Dest::R(0, 0b0100), dxbc::Src::R(1, dxbc::Src::kXXXX),\n           dxbc::Src::R(0, dxbc::Src::kWWWW),\n           dxbc::Src::R(0, dxbc::Src::kZZZZ));\n\n  // Now the tile index doesn't have any dependencies on the destination. The\n  // dword index within the source tile, however, is calculated from both the\n  // source and the destination pixel size, sample count and color vs. depth.\n\n  // Source can be 64bpp or 32bpp - depth if only depth is available, color in\n  // all other cases.\n\n  // Load the source to r1 (or low to r0, high to r1 if need 64bpp color as the\n  // result, as the address is loaded to r1).\n\n  // Source pixel and sample index within the 32bpp tile.\n  // X to r1.x (or keep r0.x if not modifying).\n  // Y to r1.y (or keep r0.y if not modifying).\n  // Sample index to r1.z (or use v# if not modifying); r1.z will also be set\n  // to 0 before sampling for the LOD of the single-sampled source (needs to\n  // be in the register).\n  // If 64bpp -> 32bpp, also the needed half in r0.w.\n\n  dxbc::Src dest_sample(\n      dxbc::Src::V1D(kInputRegisterSampleIndex, dxbc::Src::kXXXX));\n  dxbc::Src source_sample(dest_sample);\n  uint32_t source_tile_pixel_x_reg = 0;\n  uint32_t source_tile_pixel_y_reg = 0;\n\n  // First sample bit at 4x in Direct3D 10.1+ - horizontal sample.\n  // Second sample bit at 4x in Direct3D 10.1+ - vertical sample.\n  // At 2x:\n  // - Native 2x: top is 1 in Direct3D 10.1+, bottom is 0.\n  // - 2x as 4x: top is 0, bottom is 3.\n\n  if (!source_is_64bpp && dest_is_64bpp) {\n    // 32bpp -> 64bpp, need two samples of the source.\n    if (key.source_msaa_samples >= xenos::MsaaSamples::k4X) {\n      // 32bpp -> 64bpp, 4x ->.\n      // Source has 32bpp halves in two adjacent samples.\n      if (key.dest_msaa_samples >= xenos::MsaaSamples::k4X) {\n        // 32bpp -> 64bpp, 4x -> 4x.\n        // 1 destination horizontal sample = 2 source horizontal samples.\n        // D p0,0 s0,0 = S p0,0 s0,0 | S p0,0 s1,0\n        // D p0,0 s1,0 = S p1,0 s0,0 | S p1,0 s1,0\n        // D p0,0 s0,1 = S p0,0 s0,1 | S p0,0 s1,1\n        // D p0,0 s1,1 = S p1,0 s0,1 | S p1,0 s1,1\n        // Thus destination horizontal sample -> source horizontal pixel,\n        // vertical samples are 1:1.\n        a.OpAnd(dxbc::Dest::R(1, 0b0100), dest_sample, dxbc::Src::LU(0b10));\n        source_sample = dxbc::Src::R(1, dxbc::Src::kZZZZ);\n        a.OpBFI(dxbc::Dest::R(1, 0b0001), dxbc::Src::LU(31), dxbc::Src::LU(1),\n                dxbc::Src::R(0, dxbc::Src::kXXXX),\n                dxbc::Src::V1D(kInputRegisterSampleIndex, dxbc::Src::kXXXX));\n        source_tile_pixel_x_reg = 1;\n      } else if (key.dest_msaa_samples == xenos::MsaaSamples::k2X) {\n        // 32bpp -> 64bpp, 4x -> 2x.\n        // 1 destination horizontal pixel = 2 source horizontal samples.\n        // D p0,0 s0 = S p0,0 s0,0 | S p0,0 s1,0\n        // D p0,0 s1 = S p0,0 s0,1 | S p0,0 s1,1\n        // D p1,0 s0 = S p1,0 s0,0 | S p1,0 s1,0\n        // D p1,0 s1 = S p1,0 s0,1 | S p1,0 s1,1\n        // Pixel index can be reused. Sample 1 (for native 2x) or 0 (for 2x as\n        // 4x) should become samples 01, sample 0 or 3 should become samples 23.\n        source_sample = dxbc::Src::R(1, dxbc::Src::kZZZZ);\n        if (msaa_2x_supported_) {\n          a.OpXOr(dxbc::Dest::R(1, 0b0100), dest_sample, dxbc::Src::LU(1));\n          a.OpIShL(dxbc::Dest::R(1, 0b0100), source_sample, dxbc::Src::LU(1));\n        } else {\n          a.OpAnd(dxbc::Dest::R(1, 0b0100), dest_sample, dxbc::Src::LU(0b10));\n        }\n      } else {\n        // 32bpp -> 64bpp, 4x -> 1x.\n        // 1 destination horizontal pixel = 2 source horizontal samples.\n        // D p0,0 = S p0,0 s0,0 | S p0,0 s1,0\n        // D p0,1 = S p0,0 s0,1 | S p0,0 s1,1\n        // Horizontal pixel index can be reused. Vertical pixel 1 should\n        // become sample 2.\n        a.OpBFI(dxbc::Dest::R(1, 0b0100), dxbc::Src::LU(1), dxbc::Src::LU(1),\n                dxbc::Src::R(0, dxbc::Src::kYYYY), dxbc::Src::LU(0));\n        source_sample = dxbc::Src::R(1, dxbc::Src::kZZZZ);\n        a.OpUShR(dxbc::Dest::R(1, 0b0010), dxbc::Src::R(0, dxbc::Src::kYYYY),\n                 dxbc::Src::LU(1));\n        source_tile_pixel_y_reg = 1;\n      }\n    } else {\n      // 32bpp -> 64bpp, 1x/2x ->.\n      // Source has 32bpp halves in two adjacent pixels.\n      if (key.dest_msaa_samples >= xenos::MsaaSamples::k4X) {\n        // 32bpp -> 64bpp, 1x/2x -> 4x.\n        // The X part.\n        // 1 destination horizontal sample = 2 source horizontal pixels.\n        a.OpIShL(dxbc::Dest::R(1, 0b0001), dxbc::Src::R(0, dxbc::Src::kXXXX),\n                 dxbc::Src::LU(2));\n        a.OpBFI(dxbc::Dest::R(1, 0b0001), dxbc::Src::LU(1), dxbc::Src::LU(1),\n                dxbc::Src::V1D(kInputRegisterSampleIndex, dxbc::Src::kXXXX),\n                dxbc::Src::R(1, dxbc::Src::kXXXX));\n        source_tile_pixel_x_reg = 1;\n        // Y is handled by common code.\n      } else {\n        // 32bpp -> 64bpp, 1x/2x -> 1x/2x.\n        // The X part.\n        // 1 destination horizontal pixel = 2 source horizontal pixels.\n        a.OpIShL(dxbc::Dest::R(1, 0b0001), dxbc::Src::R(0, dxbc::Src::kXXXX),\n                 dxbc::Src::LU(1));\n        source_tile_pixel_x_reg = 1;\n        // Y is handled by common code.\n      }\n    }\n  } else if (source_is_64bpp && !dest_is_64bpp) {\n    // 64bpp -> 32bpp, also the half to r0.w.\n    if (key.dest_msaa_samples >= xenos::MsaaSamples::k4X) {\n      // 64bpp -> 32bpp, -> 4x.\n      // The needed half is in the destination horizontal sample index.\n      if (key.source_msaa_samples >= xenos::MsaaSamples::k4X) {\n        // 64bpp -> 32bpp, 4x -> 4x.\n        // D p0,0 s0,0 = S s0,0 low\n        // D p0,0 s1,0 = S s0,0 high\n        // D p1,0 s0,0 = S s1,0 low\n        // D p1,0 s1,0 = S s1,0 high\n        // Vertical pixel and sample (second bit) addressing is the same.\n        // However, 1 horizontal destination pixel = 1 horizontal source sample.\n        a.OpBFI(dxbc::Dest::R(1, 0b0100), dxbc::Src::LU(1), dxbc::Src::LU(0),\n                dxbc::Src::R(0, dxbc::Src::kXXXX), dest_sample);\n        source_sample = dxbc::Src::R(1, dxbc::Src::kZZZZ);\n        // 2 destination horizontal samples = 1 source horizontal sample, thus\n        // 2 destination horizontal pixels = 1 source horizontal pixel.\n        a.OpUShR(dxbc::Dest::R(1, 0b0001), dxbc::Src::R(0, dxbc::Src::kXXXX),\n                 dxbc::Src::LU(1));\n        source_tile_pixel_x_reg = 1;\n      } else {\n        // 64bpp -> 32bpp, 1x/2x -> 4x.\n        // 2 destination horizontal samples = 1 source horizontal pixel, thus\n        // 1 destination horizontal pixel = 1 source horizontal pixel. Can reuse\n        // horizontal pixel index.\n        // Y is handled by common code.\n      }\n      // Half in r0.w from the destination horizontal sample index.\n      a.OpAnd(dxbc::Dest::R(0, 0b1000), dest_sample, dxbc::Src::LU(1));\n    } else {\n      // 64bpp -> 32bpp, -> 1x/2x.\n      // The needed half is in the destination horizontal pixel index.\n      if (key.source_msaa_samples >= xenos::MsaaSamples::k4X) {\n        // 64bpp -> 32bpp, 4x -> 1x/2x.\n        // (Destination horizontal pixel >> 1) & 1 = source horizontal sample\n        // (first bit).\n        a.OpUBFE(dxbc::Dest::R(1, 0b0100), dxbc::Src::LU(1), dxbc::Src::LU(1),\n                 dxbc::Src::R(0, dxbc::Src::kXXXX));\n        source_sample = dxbc::Src::R(1, dxbc::Src::kZZZZ);\n        if (key.dest_msaa_samples == xenos::MsaaSamples::k2X) {\n          // 64bpp -> 32bpp, 4x -> 2x.\n          // Destination vertical samples (1/0 in the first bit for native 2x or\n          // 0/1 in the second bit for 2x as 4x) = source vertical samples\n          // (second bit).\n          if (msaa_2x_supported_) {\n            a.OpBFI(dxbc::Dest::R(1, 0b0100), dxbc::Src::LU(1),\n                    dxbc::Src::LU(1), dest_sample, source_sample);\n            a.OpXOr(dxbc::Dest::R(1, 0b0100), source_sample,\n                    dxbc::Src::LU(1 << 1));\n          } else {\n            a.OpBFI(dxbc::Dest::R(1, 0b0100), dxbc::Src::LU(1),\n                    dxbc::Src::LU(0), source_sample, dest_sample);\n          }\n        } else {\n          // 64bpp -> 32bpp, 4x -> 1x.\n          // 1 destination vertical pixel = 1 source vertical sample.\n          a.OpBFI(dxbc::Dest::R(1, 0b0100), dxbc::Src::LU(1), dxbc::Src::LU(1),\n                  dxbc::Src::R(0, dxbc::Src::kYYYY), source_sample);\n          a.OpUShR(dxbc::Dest::R(1, 0b0010), dxbc::Src::R(0, dxbc::Src::kYYYY),\n                   dxbc::Src::LU(1));\n          source_tile_pixel_y_reg = 1;\n        }\n        // 2 destination horizontal pixels = 1 source horizontal sample.\n        // 4 destination horizontal pixels = 1 source horizontal pixel.\n        a.OpUShR(dxbc::Dest::R(1, 0b0001), dxbc::Src::R(0, dxbc::Src::kXXXX),\n                 dxbc::Src::LU(2));\n        source_tile_pixel_x_reg = 1;\n      } else {\n        // 64bpp -> 32bpp, 1x/2x -> 1x/2x.\n        // The X part.\n        // 2 destination horizontal pixels = 1 destination source pixel.\n        a.OpUShR(dxbc::Dest::R(1, 0b0001), dxbc::Src::R(0, dxbc::Src::kXXXX),\n                 dxbc::Src::LU(1));\n        source_tile_pixel_x_reg = 1;\n        // Y is handled by common code.\n      }\n      // Half in r0.w from the destination horizontal pixel index.\n      a.OpAnd(dxbc::Dest::R(0, 0b1000), dxbc::Src::R(0, dxbc::Src::kXXXX),\n              dxbc::Src::LU(1));\n    }\n  } else {\n    // Same bit count.\n    if (key.source_msaa_samples != key.dest_msaa_samples) {\n      if (key.source_msaa_samples >= xenos::MsaaSamples::k4X) {\n        // Same BPP, 4x -> 1x/2x.\n        if (key.dest_msaa_samples == xenos::MsaaSamples::k2X) {\n          // Same BPP, 4x -> 2x.\n          // Horizontal pixels to samples. Vertical sample (1/0 in the first bit\n          // for native 2x or 0/1 in the second bit for 2x as 4x) to second\n          // sample bit.\n          source_sample = dxbc::Src::R(1, dxbc::Src::kZZZZ);\n          if (msaa_2x_supported_) {\n            a.OpBFI(dxbc::Dest::R(1, 0b0100), dxbc::Src::LU(31),\n                    dxbc::Src::LU(1), dest_sample,\n                    dxbc::Src::R(0, dxbc::Src::kXXXX));\n            a.OpXOr(dxbc::Dest::R(1, 0b0100), source_sample,\n                    dxbc::Src::LU(1 << 1));\n          } else {\n            a.OpBFI(dxbc::Dest::R(1, 0b0100), dxbc::Src::LU(1),\n                    dxbc::Src::LU(0), dxbc::Src::R(0, dxbc::Src::kXXXX),\n                    dest_sample);\n          }\n          a.OpUShR(dxbc::Dest::R(1, 0b0001), dxbc::Src::R(0, dxbc::Src::kXXXX),\n                   dxbc::Src::LU(1));\n          source_tile_pixel_x_reg = 1;\n        } else {\n          // Same BPP, 4x -> 1x.\n          // Pixels to samples.\n          a.OpAnd(dxbc::Dest::R(1, 0b0100), dxbc::Src::R(0, dxbc::Src::kXXXX),\n                  dxbc::Src::LU(1));\n          source_sample = dxbc::Src::R(1, dxbc::Src::kZZZZ);\n          a.OpBFI(dxbc::Dest::R(1, 0b0100), dxbc::Src::LU(1), dxbc::Src::LU(1),\n                  dxbc::Src::R(0, dxbc::Src::kYYYY), source_sample);\n          a.OpUShR(dxbc::Dest::R(1, 0b0011), dxbc::Src::R(0), dxbc::Src::LU(1));\n          source_tile_pixel_x_reg = 1;\n          source_tile_pixel_y_reg = 1;\n        }\n      } else {\n        // Same BPP, 1x/2x -> 1x/2x/4x (as long as they're different).\n        // Only the X part - Y is handled by common code.\n        if (key.dest_msaa_samples >= xenos::MsaaSamples::k4X) {\n          // Horizontal samples to pixels.\n          a.OpBFI(dxbc::Dest::R(1, 0b0001), dxbc::Src::LU(31), dxbc::Src::LU(1),\n                  dxbc::Src::R(0, dxbc::Src::kXXXX), dest_sample);\n          source_tile_pixel_x_reg = 1;\n        }\n      }\n    }\n  }\n  // Common source Y and sample index for 1x/2x AA sources, independent of bits\n  // per sample.\n  if (key.source_msaa_samples < xenos::MsaaSamples::k4X &&\n      key.source_msaa_samples != key.dest_msaa_samples) {\n    if (key.dest_msaa_samples >= xenos::MsaaSamples::k4X) {\n      // 1x/2x -> 4x.\n      if (key.source_msaa_samples == xenos::MsaaSamples::k2X) {\n        // 2x -> 4x.\n        // Vertical samples (second bit) of 4x destination to vertical sample\n        // (1, 0 for native 2x, or 0, 3 for 2x as 4x) of 2x source.\n        a.OpUShR(dxbc::Dest::R(1, 0b0100), dest_sample, dxbc::Src::LU(1));\n        source_sample = dxbc::Src::R(1, dxbc::Src::kZZZZ);\n        if (msaa_2x_supported_) {\n          a.OpXOr(dxbc::Dest::R(1, 0b0100), source_sample, dxbc::Src::LU(1));\n        } else {\n          a.OpBFI(dxbc::Dest::R(1, 0b0100), dxbc::Src::LU(1), dxbc::Src::LU(1),\n                  source_sample, source_sample);\n        }\n      } else {\n        // 1x -> 4x.\n        // Vertical samples (second bit) to Y pixels.\n        a.OpUShR(dxbc::Dest::R(1, 0b0010), dest_sample, dxbc::Src::LU(1));\n        a.OpBFI(dxbc::Dest::R(1, 0b0010), dxbc::Src::LU(31), dxbc::Src::LU(1),\n                dxbc::Src::R(0, dxbc::Src::kYYYY),\n                dxbc::Src::R(1, dxbc::Src::kYYYY));\n        source_tile_pixel_y_reg = 1;\n      }\n    } else {\n      // 1x/2x -> different 1x/2x.\n      if (key.source_msaa_samples == xenos::MsaaSamples::k2X) {\n        // 2x -> 1x.\n        // Vertical pixels of 2x destination to vertical samples (1, 0 for\n        // native 2x, or 0, 3 for 2x as 4x) of 1x source.\n        a.OpAnd(dxbc::Dest::R(1, 0b0100), dxbc::Src::R(0, dxbc::Src::kYYYY),\n                dxbc::Src::LU(1));\n        source_sample = dxbc::Src::R(1, dxbc::Src::kZZZZ);\n        if (msaa_2x_supported_) {\n          a.OpXOr(dxbc::Dest::R(1, 0b0100), source_sample, dxbc::Src::LU(1));\n        } else {\n          a.OpBFI(dxbc::Dest::R(1, 0b0100), dxbc::Src::LU(1), dxbc::Src::LU(1),\n                  source_sample, source_sample);\n        }\n        a.OpUShR(dxbc::Dest::R(1, 0b0010), dxbc::Src::R(0, dxbc::Src::kYYYY),\n                 dxbc::Src::LU(1));\n        source_tile_pixel_y_reg = 1;\n      } else {\n        // 1x -> 2x.\n        // Vertical samples (1/0 in the first bit for native 2x or 0/1 in the\n        // second bit for 2x as 4x) of 2x destination to vertical pixels of 1x\n        // source.\n        if (msaa_2x_supported_) {\n          a.OpBFI(dxbc::Dest::R(1, 0b0010), dxbc::Src::LU(31), dxbc::Src::LU(1),\n                  dxbc::Src::R(0, dxbc::Src::kYYYY), dest_sample);\n          a.OpXOr(dxbc::Dest::R(1, 0b0010), dxbc::Src::R(1, dxbc::Src::kYYYY),\n                  dxbc::Src::LU(1));\n        } else {\n          a.OpUShR(dxbc::Dest::R(1, 0b0010), dest_sample, dxbc::Src::LU(1));\n          a.OpBFI(dxbc::Dest::R(1, 0b0010), dxbc::Src::LU(31), dxbc::Src::LU(1),\n                  dxbc::Src::R(0, dxbc::Src::kYYYY),\n                  dxbc::Src::R(1, dxbc::Src::kYYYY));\n        }\n        source_tile_pixel_y_reg = 1;\n      }\n    }\n  }\n\n  uint32_t source_pixel_width_dwords_log2 =\n      uint32_t(key.source_msaa_samples >= xenos::MsaaSamples::k4X) +\n      uint32_t(source_is_64bpp);\n\n  if (source_is_color != dest_is_color) {\n    // Copying between color and depth / stencil - swap 40-32bpp-sample columns\n    // in the pixel index within the source 32bpp tile using r1.w as temporary.\n    uint32_t source_32bpp_tile_half_pixels =\n        tile_width_samples >> (1 + source_pixel_width_dwords_log2);\n    a.OpULT(dxbc::Dest::R(1, 0b1000),\n            dxbc::Src::R(source_tile_pixel_x_reg, dxbc::Src::kXXXX),\n            dxbc::Src::LU(source_32bpp_tile_half_pixels));\n    a.OpMovC(dxbc::Dest::R(1, 0b1000), dxbc::Src::R(1, dxbc::Src::kWWWW),\n             dxbc::Src::LI(int32_t(source_32bpp_tile_half_pixels)),\n             dxbc::Src::LI(-int32_t(source_32bpp_tile_half_pixels)));\n    a.OpIAdd(dxbc::Dest::R(1, 0b0001),\n             dxbc::Src::R(source_tile_pixel_x_reg, dxbc::Src::kXXXX),\n             dxbc::Src::R(1, dxbc::Src::kWWWW));\n    source_tile_pixel_x_reg = 1;\n    // r1.w = free\n  }\n\n  // Current register allocation:\n  // r0.xy = pixel index within the destination 32bpp tile\n  // r0.z = 32bpp tile index relative to the destination base\n  // r0.w for 64bpp -> 32bpp - needed 32bpp half index of 64bpp data\n  // r1.xy = pixel index within the source 32bpp tile\n  // r1.z for 2x/4x -> = sample index within the source pixel\n\n  // Apply the source 32bpp tile index.\n  // r1.w = destination to source EDRAM tile adjustment\n  a.OpIBFE(dxbc::Dest::R(1, 0b1000),\n           dxbc::Src::LU(xenos::kEdramBaseTilesBits + 1),\n           dxbc::Src::LU(xenos::kEdramPitchTilesBits * 2),\n           dxbc::Src::CB(cbuffer_index_address, kTransferCBVRegisterAddress, 0,\n                         dxbc::Src::kXXXX));\n  // r1.w = 32bpp tile index within the source, or the tile index within the\n  //        source minus the EDRAM tile count if transferring across addressing\n  //        wrapping (if negative)\n  a.OpIAdd(dxbc::Dest::R(1, 0b1000), dxbc::Src::R(0, dxbc::Src::kZZZZ),\n           dxbc::Src::R(1, dxbc::Src::kWWWW));\n  // r1.w = 32bpp tile index within the source\n  a.OpAnd(dxbc::Dest::R(1, 0b1000), dxbc::Src::R(1, dxbc::Src::kWWWW),\n          dxbc::Src::LU(xenos::kEdramTileCount - 1));\n  // r2.x = source pitch in 32bpp tiles\n  a.OpUBFE(dxbc::Dest::R(2, 0b0001), dxbc::Src::LU(xenos::kEdramPitchTilesBits),\n           dxbc::Src::LU(xenos::kEdramPitchTilesBits),\n           dxbc::Src::CB(cbuffer_index_address, kTransferCBVRegisterAddress, 0,\n                         dxbc::Src::kXXXX));\n  // r1.w = source tile row\n  // r2.x = source 32bpp tile within the row\n  a.OpUDiv(dxbc::Dest::R(1, 0b1000), dxbc::Dest::R(2, 0b0001),\n           dxbc::Src::R(1, dxbc::Src::kWWWW),\n           dxbc::Src::R(2, dxbc::Src::kXXXX));\n  // r1.x = pixel X within the source texture\n  // r2.x = free\n  a.OpUMAd(dxbc::Dest::R(1, 0b0001),\n           dxbc::Src::LU(tile_width_samples >> source_pixel_width_dwords_log2),\n           dxbc::Src::R(2, dxbc::Src::kXXXX),\n           dxbc::Src::R(source_tile_pixel_x_reg, dxbc::Src::kXXXX));\n  // r1.y = pixel Y within the source texture\n  // r1.w = free\n  a.OpUMAd(\n      dxbc::Dest::R(1, 0b0010),\n      dxbc::Src::LU(tile_height_samples >> uint32_t(key.source_msaa_samples >=\n                                                    xenos::MsaaSamples::k2X)),\n      dxbc::Src::R(1, dxbc::Src::kWWWW),\n      dxbc::Src::R(source_tile_pixel_y_reg, dxbc::Src::kYYYY));\n\n  // Load the source to r1, or, for 32bpp | 32bpp -> 64bpp, the first dword to\n  // r0 since addressing will not be needed anymore for color, and the second\n  // dword to r1.\n  // Depth will be loaded to w before loading stencil (so it doesn't overwrite\n  // the coordinates needed for stencil loading).\n  // Stencil will be loaded to x.\n  // Color will be loaded to x...w.\n  bool source_load_is_two_dwords = !source_is_64bpp && dest_is_64bpp;\n  if (key.source_msaa_samples != xenos::MsaaSamples::k1X) {\n    for (uint32_t i = 0; i <= uint32_t(source_load_is_two_dwords); ++i) {\n      uint32_t source_load_register = source_load_is_two_dwords ? i : 1;\n      if (srv_index_depth != UINT32_MAX) {\n        a.OpLdMS(dxbc::Dest::R(source_load_register, 0b1000), dxbc::Src::R(1),\n                 0b0011,\n                 dxbc::Src::T(srv_index_depth, kTransferSRVRegisterDepth,\n                              dxbc::Src::kXXXX),\n                 source_sample);\n      }\n      if (srv_index_stencil != UINT32_MAX) {\n        a.OpLdMS(dxbc::Dest::R(source_load_register, 0b0001), dxbc::Src::R(1),\n                 0b0011,\n                 dxbc::Src::T(srv_index_stencil, kTransferSRVRegisterStencil,\n                              dxbc::Src::kYYYY),\n                 source_sample);\n      } else if (srv_index_color != UINT32_MAX) {\n        a.OpLdMS(dxbc::Dest::R(source_load_register,\n                               source_color_srv_component_mask),\n                 dxbc::Src::R(1), 0b0011,\n                 dxbc::Src::T(srv_index_color, kTransferSRVRegisterColor),\n                 source_sample);\n      }\n      if (source_load_is_two_dwords && !i) {\n        // Go to the next sample or pixel along X if need to load two dwords.\n        if (key.source_msaa_samples >= xenos::MsaaSamples::k4X) {\n          a.OpOr(dxbc::Dest::R(1, 0b0100), source_sample, dxbc::Src::LU(1));\n          source_sample = dxbc::Src::R(1, dxbc::Src::kZZZZ);\n        } else {\n          a.OpOr(dxbc::Dest::R(1, 0b0001), dxbc::Src::R(1, dxbc::Src::kXXXX),\n                 dxbc::Src::LU(1));\n        }\n      }\n    }\n  } else {\n    // Write zero to the LOD index in r1.z.\n    a.OpMov(dxbc::Dest::R(1, 0b0100), dxbc::Src::LU(0));\n    dxbc::Src source_coordinates(dxbc::Src::R(1, 0b10000100));\n    for (uint32_t i = 0; i <= uint32_t(source_load_is_two_dwords); ++i) {\n      uint32_t source_load_register = source_load_is_two_dwords ? i : 1;\n      if (srv_index_depth != UINT32_MAX) {\n        a.OpLd(dxbc::Dest::R(source_load_register, 0b1000), source_coordinates,\n               0b1011,\n               dxbc::Src::T(srv_index_depth, kTransferSRVRegisterDepth,\n                            dxbc::Src::kXXXX));\n      }\n      if (srv_index_stencil != UINT32_MAX) {\n        a.OpLd(dxbc::Dest::R(source_load_register, 0b0001), source_coordinates,\n               0b1011,\n               dxbc::Src::T(srv_index_stencil, kTransferSRVRegisterStencil,\n                            dxbc::Src::kYYYY));\n      } else if (srv_index_color != UINT32_MAX) {\n        a.OpLd(dxbc::Dest::R(source_load_register,\n                             source_color_srv_component_mask),\n               source_coordinates, 0b1011,\n               dxbc::Src::T(srv_index_color, kTransferSRVRegisterColor));\n      }\n      if (source_load_is_two_dwords && !i) {\n        // Go to the next pixel along X if need to load two dwords.\n        a.OpOr(dxbc::Dest::R(1, 0b0001), dxbc::Src::R(1, dxbc::Src::kXXXX),\n               dxbc::Src::LU(1));\n      }\n    }\n  }\n  // Pick the needed 32bpp half of the 64bpp color based on r0.w.\n  if (source_is_64bpp && !dest_is_64bpp) {\n    uint32_t source_color_half_component_count =\n        source_color_format_component_count >> 1;\n    if (dest_is_stencil_bit) {\n      a.OpMovC(dxbc::Dest::R(1, 0b0001), dxbc::Src::R(0, dxbc::Src::kWWWW),\n               dxbc::Src::R(1).Select(source_color_half_component_count),\n               dxbc::Src::R(1, dxbc::Src::kXXXX));\n    } else {\n      uint32_t color_high_dword_swizzle =\n          (source_color_half_component_count * 0b01010101) &\n          ~((uint32_t(1) << (source_color_half_component_count * 2)) - 1);\n      for (uint32_t i = 0; i < source_color_half_component_count; ++i) {\n        color_high_dword_swizzle |= (source_color_half_component_count + i)\n                                    << (i * 2);\n      }\n      a.OpMovC(dxbc::Dest::R(1, (1 << source_color_half_component_count) - 1),\n               dxbc::Src::R(0, dxbc::Src::kWWWW),\n               dxbc::Src::R(1, color_high_dword_swizzle), dxbc::Src::R(1));\n    }\n  }\n\n  if (osgn_parameter_index_sv_stencil_ref != UINT32_MAX &&\n      srv_index_stencil != UINT32_MAX) {\n    // For the depth -> depth case, write the stencil loaded to r1.x directly to\n    // the output.\n    assert_true(mode.output == TransferOutput::kDepth);\n    a.OpMov(dxbc::Dest::OStencilRef(), dxbc::Src::R(1, dxbc::Src::kXXXX));\n  }\n\n  if (dest_is_64bpp) {\n    // Handle construction of 64bpp color, either from two 32-bit samples in r0\n    // and r1, or from one 64bpp sample in r1. Using r2.xy as temporary when\n    // needed.\n    // If color_packed_in_r0x_and_r1x, use the generic path for combining two\n    // 32-bit samples - as raw in r0.x and r1.x - into the destination.\n    bool color_packed_in_r0x_and_r1x = false;\n    if (source_is_color) {\n      switch (source_color_format) {\n        case xenos::ColorRenderTargetFormat::k_8_8_8_8_GAMMA: {\n          // 8_8_8_8_GAMMA is represented by linear stored in\n          // R16G16B16A16_UNORM.\n          for (uint32_t i = 0; i < 2; ++i) {\n            for (uint32_t j = 0; j < 3; ++j) {\n              DxbcShaderTranslator::PreSaturatedLinearToPWLGamma(a, i, j, i, j,\n                                                                 2, 0, 2, 1);\n            }\n          }\n        }\n          [[fallthrough]];\n        case xenos::ColorRenderTargetFormat::k_8_8_8_8: {\n          color_packed_in_r0x_and_r1x = true;\n          for (uint32_t i = 0; i < 2; ++i) {\n            a.OpMAd(dxbc::Dest::R(i), dxbc::Src::R(i), dxbc::Src::LF(255.0f),\n                    dxbc::Src::LF(0.5f));\n            a.OpFToU(dxbc::Dest::R(i), dxbc::Src::R(i));\n            for (uint32_t j = 1; j < 4; ++j) {\n              a.OpBFI(dxbc::Dest::R(i, 0b0001), dxbc::Src::LU(8),\n                      dxbc::Src::LU(j * 8), dxbc::Src::R(i).Select(j),\n                      dxbc::Src::R(i, dxbc::Src::kXXXX));\n            }\n          }\n        } break;\n        case xenos::ColorRenderTargetFormat::k_2_10_10_10:\n        case xenos::ColorRenderTargetFormat::k_2_10_10_10_AS_10_10_10_10: {\n          color_packed_in_r0x_and_r1x = true;\n          for (uint32_t i = 0; i < 2; ++i) {\n            a.OpMAd(dxbc::Dest::R(i), dxbc::Src::R(i),\n                    dxbc::Src::LF(1023.0f, 1023.0f, 1023.0f, 3.0f),\n                    dxbc::Src::LF(0.5f));\n            a.OpFToU(dxbc::Dest::R(i), dxbc::Src::R(i));\n            for (uint32_t j = 1; j < 4; ++j) {\n              a.OpBFI(dxbc::Dest::R(i, 0b0001), dxbc::Src::LU(j == 3 ? 2 : 10),\n                      dxbc::Src::LU(j * 10), dxbc::Src::R(i).Select(j),\n                      dxbc::Src::R(i, dxbc::Src::kXXXX));\n            }\n          }\n        } break;\n        case xenos::ColorRenderTargetFormat::k_2_10_10_10_FLOAT:\n        case xenos::ColorRenderTargetFormat::\n            k_2_10_10_10_FLOAT_AS_16_16_16_16: {\n          color_packed_in_r0x_and_r1x = true;\n          for (uint32_t i = 0; i < 2; ++i) {\n            // Float16 has a wider range for both color and alpha, also NaNs -\n            // clamp and convert.\n            for (uint32_t j = 0; j < 3; ++j) {\n              DxbcShaderTranslator::UnclampedFloat32To7e3(a, i, j, i, j, 2, 0);\n              if (j) {\n                a.OpBFI(dxbc::Dest::R(i, 0b0001), dxbc::Src::LU(10),\n                        dxbc::Src::LU(j * 10), dxbc::Src::R(i).Select(j),\n                        dxbc::Src::R(i, dxbc::Src::kXXXX));\n              }\n            }\n            // Saturate and convert the alpha.\n            a.OpMov(dxbc::Dest::R(i, 0b1000), dxbc::Src::R(i, dxbc::Src::kWWWW),\n                    true);\n            a.OpMAd(dxbc::Dest::R(i, 0b1000), dxbc::Src::R(i, dxbc::Src::kWWWW),\n                    dxbc::Src::LF(3.0f), dxbc::Src::LF(0.5f));\n            a.OpFToU(dxbc::Dest::R(i, 0b1000),\n                     dxbc::Src::R(i, dxbc::Src::kWWWW));\n            a.OpBFI(dxbc::Dest::R(i, 0b0001), dxbc::Src::LU(2),\n                    dxbc::Src::LU(30), dxbc::Src::R(i, dxbc::Src::kWWWW),\n                    dxbc::Src::R(i, dxbc::Src::kXXXX));\n          }\n        } break;\n        // All 64bpp formats, and all 16 bits per component formats, are\n        // represented as integers in ownership transfer for safe handling of\n        // NaNs and -32768 / -32767.\n        case xenos::ColorRenderTargetFormat::k_16_16:\n        case xenos::ColorRenderTargetFormat::k_16_16_FLOAT: {\n          if (dest_color_format ==\n              xenos::ColorRenderTargetFormat::k_32_32_FLOAT) {\n            for (uint32_t i = 0; i < 2; ++i) {\n              a.OpBFI(dxbc::Dest::O(0, 1 << i), dxbc::Src::LU(16),\n                      dxbc::Src::LU(16), dxbc::Src::R(i, dxbc::Src::kYYYY),\n                      dxbc::Src::R(i, dxbc::Src::kXXXX));\n            }\n          } else {\n            a.OpMov(dxbc::Dest::O(0, 0b0011), dxbc::Src::R(0));\n            a.OpMov(dxbc::Dest::O(0, 0b1100), dxbc::Src::R(1, 0b0100 << 4));\n          }\n        } break;\n        case xenos::ColorRenderTargetFormat::k_16_16_16_16:\n        case xenos::ColorRenderTargetFormat::k_16_16_16_16_FLOAT: {\n          if (dest_color_format ==\n              xenos::ColorRenderTargetFormat::k_32_32_FLOAT) {\n            a.OpBFI(dxbc::Dest::O(0, 0b0011), dxbc::Src::LU(16),\n                    dxbc::Src::LU(16), dxbc::Src::R(1, 0b1101),\n                    dxbc::Src::R(1, 0b1000));\n          } else {\n            a.OpMov(dxbc::Dest::O(0), dxbc::Src::R(1));\n          }\n        } break;\n        case xenos::ColorRenderTargetFormat::k_32_FLOAT: {\n          color_packed_in_r0x_and_r1x = true;\n        } break;\n        case xenos::ColorRenderTargetFormat::k_32_32_FLOAT: {\n          if (dest_color_format ==\n              xenos::ColorRenderTargetFormat::k_32_32_FLOAT) {\n            a.OpMov(dxbc::Dest::O(0, 0b0011), dxbc::Src::R(1));\n          } else {\n            a.OpUBFE(dxbc::Dest::O(0), dxbc::Src::LU(16),\n                     dxbc::Src::LU(0, 16, 0, 16), dxbc::Src::R(1, 0b01010000));\n          }\n        } break;\n      }\n    } else {\n      assert_not_zero(rs & kTransferUsedRootParameterDepthSRVBit);\n      color_packed_in_r0x_and_r1x = true;\n      for (uint32_t i = 0; i < 2; ++i) {\n        switch (source_depth_format) {\n          case xenos::DepthRenderTargetFormat::kD24S8: {\n            // Round to the nearest even integer. This seems to be the correct\n            // conversion, adding +0.5 and rounding towards zero results in red\n            // instead of black in the 4D5307E6 clear shader.\n            a.OpMul(dxbc::Dest::R(i, 0b1000), dxbc::Src::R(i, dxbc::Src::kWWWW),\n                    dxbc::Src::LF(float(0xFFFFFF)));\n            a.OpRoundNE(dxbc::Dest::R(i, 0b1000),\n                        dxbc::Src::R(i, dxbc::Src::kWWWW));\n            a.OpFToU(dxbc::Dest::R(i, 0b1000),\n                     dxbc::Src::R(i, dxbc::Src::kWWWW));\n          } break;\n          case xenos::DepthRenderTargetFormat::kD24FS8: {\n            // Convert using r1.y as temporary.\n            // When converting the depth in pixel shaders, it's always exact,\n            // truncating not to insert additional rounding instructions.\n            DxbcShaderTranslator::PreClampedDepthTo20e4(\n                a, i, 3, i, 3, 1, 1,\n                !depth_float24_convert_in_pixel_shader() &&\n                    depth_float24_round(),\n                true);\n          } break;\n        }\n        // Merge depth and stencil into r0/r1.x.\n        a.OpBFI(dxbc::Dest::R(i, 0b0001), dxbc::Src::LU(24), dxbc::Src::LU(8),\n                dxbc::Src::R(i, dxbc::Src::kWWWW),\n                dxbc::Src::R(i, dxbc::Src::kXXXX));\n      }\n    }\n    if (color_packed_in_r0x_and_r1x) {\n      if (dest_color_format == xenos::ColorRenderTargetFormat::k_32_32_FLOAT) {\n        a.OpMov(dxbc::Dest::O(0, 0b0001), dxbc::Src::R(0, dxbc::Src::kXXXX));\n        a.OpMov(dxbc::Dest::O(0, 0b0010), dxbc::Src::R(1, dxbc::Src::kXXXX));\n      } else {\n        for (uint32_t i = 0; i < 2; ++i) {\n          a.OpUBFE(dxbc::Dest::O(0, 0b11 << (i * 2)), dxbc::Src::LU(16),\n                   dxbc::Src::LU(0, 16, 0, 16),\n                   dxbc::Src::R(i, dxbc::Src::kXXXX));\n        }\n      }\n    }\n  } else {\n    // Handle a 32bpp destination (32bpp color, or depth / stencil). If\n    // color_packed_in_r1x is true, a raw 32bpp color value was written, and\n    // common handling will be done.\n    bool color_packed_in_r1x = false;\n    bool depth_loaded_in_guest_format = false;\n    if (source_is_color) {\n      switch (source_color_format) {\n        case xenos::ColorRenderTargetFormat::k_8_8_8_8:\n        case xenos::ColorRenderTargetFormat::k_8_8_8_8_GAMMA: {\n          // 8_8_8_8_GAMMA is represented by linear stored in\n          // R16G16B16A16_UNORM.\n          if (dest_is_stencil_bit) {\n            if (source_color_format ==\n                xenos::ColorRenderTargetFormat::k_8_8_8_8_GAMMA) {\n              DxbcShaderTranslator::PreSaturatedLinearToPWLGamma(a, 1, 0, 1, 0,\n                                                                 2, 0, 2, 1);\n            }\n            a.OpMAd(dxbc::Dest::R(1, 0b0001), dxbc::Src::R(1, dxbc::Src::kXXXX),\n                    dxbc::Src::LF(255.0f), dxbc::Src::LF(0.5f));\n            a.OpFToU(dxbc::Dest::R(1, 0b0001),\n                     dxbc::Src::R(1, dxbc::Src::kXXXX));\n          } else if (dest_is_color &&\n                     (dest_color_format ==\n                          xenos::ColorRenderTargetFormat::k_8_8_8_8 ||\n                      dest_color_format ==\n                          xenos::ColorRenderTargetFormat::k_8_8_8_8_GAMMA)) {\n            // Same format - only perform color space conversion.\n            if (dest_color_format != source_color_format) {\n              if (dest_color_format ==\n                  xenos::ColorRenderTargetFormat::k_8_8_8_8) {\n                for (uint32_t i = 0; i < 3; ++i) {\n                  DxbcShaderTranslator::PreSaturatedLinearToPWLGamma(\n                      a, 1, i, 1, i, 2, 0, 2, 1);\n                }\n              } else {\n                for (uint32_t i = 0; i < 3; ++i) {\n                  DxbcShaderTranslator::PWLGammaToLinear(a, 1, i, 1, i, true, 2,\n                                                         0, 2, 1);\n                }\n              }\n            }\n            a.OpMov(dxbc::Dest::O(0), dxbc::Src::R(1));\n          } else if (mode.output == TransferOutput::kDepth) {\n            // When need only depth, not stencil, skipping the red component.\n            if (source_color_format ==\n                xenos::ColorRenderTargetFormat::k_8_8_8_8_GAMMA) {\n              for (uint32_t i = shader_uses_stencil_reference_output ? 0 : 1;\n                   i < 3; ++i) {\n                DxbcShaderTranslator::PreSaturatedLinearToPWLGamma(\n                    a, 1, i, 1, i, 2, 0, 2, 1);\n              }\n            }\n            a.OpMAd(\n                dxbc::Dest::R(\n                    1, shader_uses_stencil_reference_output ? 0b1111 : 0b1110),\n                dxbc::Src::R(1), dxbc::Src::LF(255.0f), dxbc::Src::LF(0.5f));\n            a.OpFToU(dxbc::Dest::R(1, 0b1110), dxbc::Src::R(1));\n            if (shader_uses_stencil_reference_output) {\n              // Write the red component to the stencil reference.\n              a.OpFToU(dxbc::Dest::OStencilRef(),\n                       dxbc::Src::R(1, dxbc::Src::kXXXX));\n            }\n            // Put depth in 0:23 of r1.w.\n            // r1.y = 0xGGBB0000.\n            a.OpBFI(dxbc::Dest::R(1, 0b0010), dxbc::Src::LU(8),\n                    dxbc::Src::LU(8), dxbc::Src::R(1, dxbc::Src::kZZZZ),\n                    dxbc::Src::R(1, dxbc::Src::kYYYY));\n            // r1.w = 0xGGBBAA00.\n            a.OpBFI(dxbc::Dest::R(1, 0b1000), dxbc::Src::LU(8),\n                    dxbc::Src::LU(16), dxbc::Src::R(1, dxbc::Src::kWWWW),\n                    dxbc::Src::R(1, dxbc::Src::kYYYY));\n          } else {\n            color_packed_in_r1x = true;\n            if (source_color_format ==\n                xenos::ColorRenderTargetFormat::k_8_8_8_8_GAMMA) {\n              for (uint32_t i = 0; i < 3; ++i) {\n                DxbcShaderTranslator::PreSaturatedLinearToPWLGamma(\n                    a, 1, i, 1, i, 2, 0, 2, 1);\n              }\n            }\n            a.OpMAd(dxbc::Dest::R(1), dxbc::Src::R(1), dxbc::Src::LF(255.0f),\n                    dxbc::Src::LF(0.5f));\n            a.OpFToU(dxbc::Dest::R(1), dxbc::Src::R(1));\n            for (uint32_t i = 1; i < 4; ++i) {\n              a.OpBFI(dxbc::Dest::R(1, 0b0001), dxbc::Src::LU(8),\n                      dxbc::Src::LU(i * 8), dxbc::Src::R(1).Select(i),\n                      dxbc::Src::R(1, dxbc::Src::kXXXX));\n            }\n          }\n        } break;\n        case xenos::ColorRenderTargetFormat::k_2_10_10_10:\n        case xenos::ColorRenderTargetFormat::k_2_10_10_10_AS_10_10_10_10: {\n          if (dest_is_stencil_bit) {\n            a.OpMAd(dxbc::Dest::R(1, 0b0001), dxbc::Src::R(1, dxbc::Src::kXXXX),\n                    dxbc::Src::LF(1023.0f), dxbc::Src::LF(0.5f));\n            a.OpFToU(dxbc::Dest::R(1, 0b0001),\n                     dxbc::Src::R(1, dxbc::Src::kXXXX));\n          } else if (dest_is_color &&\n                     (dest_color_format ==\n                          xenos::ColorRenderTargetFormat::k_2_10_10_10 ||\n                      dest_color_format == xenos::ColorRenderTargetFormat::\n                                               k_2_10_10_10_AS_10_10_10_10)) {\n            a.OpMov(dxbc::Dest::O(0), dxbc::Src::R(1));\n          } else {\n            color_packed_in_r1x = true;\n            a.OpMAd(dxbc::Dest::R(1), dxbc::Src::R(1),\n                    dxbc::Src::LF(1023.0f, 1023.0f, 1023.0f, 3.0f),\n                    dxbc::Src::LF(0.5f));\n            a.OpFToU(dxbc::Dest::R(1), dxbc::Src::R(1));\n            for (uint32_t i = 1; i < 4; ++i) {\n              a.OpBFI(dxbc::Dest::R(1, 0b0001), dxbc::Src::LU(i == 3 ? 2 : 10),\n                      dxbc::Src::LU(i * 10), dxbc::Src::R(1).Select(i),\n                      dxbc::Src::R(1, dxbc::Src::kXXXX));\n            }\n          }\n        } break;\n        case xenos::ColorRenderTargetFormat::k_2_10_10_10_FLOAT:\n        case xenos::ColorRenderTargetFormat::\n            k_2_10_10_10_FLOAT_AS_16_16_16_16: {\n          if (dest_is_stencil_bit) {\n            DxbcShaderTranslator::UnclampedFloat32To7e3(a, 1, 0, 1, 0, 2, 0);\n          } else if (dest_is_color &&\n                     (dest_color_format ==\n                          xenos::ColorRenderTargetFormat::k_2_10_10_10_FLOAT ||\n                      dest_color_format ==\n                          xenos::ColorRenderTargetFormat::\n                              k_2_10_10_10_FLOAT_AS_16_16_16_16)) {\n            a.OpMov(dxbc::Dest::O(0), dxbc::Src::R(1));\n          } else {\n            color_packed_in_r1x = true;\n            // Float16 has a wider range for both color and alpha, also NaNs -\n            // clamp and convert.\n            for (uint32_t i = 0; i < 3; ++i) {\n              DxbcShaderTranslator::UnclampedFloat32To7e3(a, 1, i, 1, i, 2, 0);\n              if (i) {\n                a.OpBFI(dxbc::Dest::R(1, 0b0001), dxbc::Src::LU(10),\n                        dxbc::Src::LU(i * 10), dxbc::Src::R(1).Select(i),\n                        dxbc::Src::R(1, dxbc::Src::kXXXX));\n              }\n            }\n            // Saturate and convert the alpha.\n            a.OpMov(dxbc::Dest::R(1, 0b1000), dxbc::Src::R(1, dxbc::Src::kWWWW),\n                    true);\n            a.OpMAd(dxbc::Dest::R(1, 0b1000), dxbc::Src::R(1, dxbc::Src::kWWWW),\n                    dxbc::Src::LF(3.0f), dxbc::Src::LF(0.5f));\n            a.OpFToU(dxbc::Dest::R(1, 0b1000),\n                     dxbc::Src::R(1, dxbc::Src::kWWWW));\n            a.OpBFI(dxbc::Dest::R(1, 0b0001), dxbc::Src::LU(2),\n                    dxbc::Src::LU(30), dxbc::Src::R(1, dxbc::Src::kWWWW),\n                    dxbc::Src::R(1, dxbc::Src::kXXXX));\n          }\n        } break;\n        case xenos::ColorRenderTargetFormat::k_16_16:\n        case xenos::ColorRenderTargetFormat::k_16_16_16_16:\n        case xenos::ColorRenderTargetFormat::k_16_16_FLOAT:\n        case xenos::ColorRenderTargetFormat::k_16_16_16_16_FLOAT: {\n          // All 16 bits per component formats are represented as integers in\n          // ownership transfer for safe handling of NaNs and -32768 / -32767.\n          if (dest_is_stencil_bit) {\n            // High bits are not important for discarding, as only one bit is\n            // checked - already loaded to red.\n          } else if (dest_is_color &&\n                     (dest_color_format ==\n                          xenos::ColorRenderTargetFormat::k_16_16 ||\n                      dest_color_format ==\n                          xenos::ColorRenderTargetFormat::k_16_16_FLOAT)) {\n            a.OpMov(dxbc::Dest::O(0, 0b0011), dxbc::Src::R(1));\n          } else {\n            color_packed_in_r1x = true;\n            a.OpBFI(dxbc::Dest::R(1, 0b0001), dxbc::Src::LU(16),\n                    dxbc::Src::LU(16), dxbc::Src::R(1, dxbc::Src::kYYYY),\n                    dxbc::Src::R(1, dxbc::Src::kXXXX));\n          }\n        } break;\n        case xenos::ColorRenderTargetFormat::k_32_FLOAT:\n        case xenos::ColorRenderTargetFormat::k_32_32_FLOAT: {\n          color_packed_in_r1x = true;\n        } break;\n      }\n    } else if (rs & kTransferUsedRootParameterDepthSRVBit) {\n      if (dest_is_color || dest_depth_format != source_depth_format) {\n        // Need to reinterpret the depth value as color or as a different depth\n        // format. Convert the depth within r1.w.\n        depth_loaded_in_guest_format = true;\n        switch (source_depth_format) {\n          case xenos::DepthRenderTargetFormat::kD24S8: {\n            // Round to the nearest even integer. This seems to be the correct\n            // conversion, adding +0.5 and rounding towards zero results in red\n            // instead of black in the 4D5307E6 clear shader.\n            a.OpMul(dxbc::Dest::R(1, 0b1000), dxbc::Src::R(1, dxbc::Src::kWWWW),\n                    dxbc::Src::LF(float(0xFFFFFF)));\n            a.OpRoundNE(dxbc::Dest::R(1, 0b1000),\n                        dxbc::Src::R(1, dxbc::Src::kWWWW));\n            a.OpFToU(dxbc::Dest::R(1, 0b1000),\n                     dxbc::Src::R(1, dxbc::Src::kWWWW));\n          } break;\n          case xenos::DepthRenderTargetFormat::kD24FS8: {\n            // Convert using r1.y as temporary.\n            // When converting the depth in pixel shaders, it's always exact,\n            // truncating not to insert additional rounding instructions.\n            DxbcShaderTranslator::PreClampedDepthTo20e4(\n                a, 1, 3, 1, 3, 1, 1,\n                !depth_float24_convert_in_pixel_shader() &&\n                    depth_float24_round(),\n                true);\n          } break;\n        }\n        if (dest_is_color) {\n          // Merge depth and stencil into r1.x for reinterpretation as color.\n          color_packed_in_r1x = true;\n          a.OpBFI(dxbc::Dest::R(1, 0b0001), dxbc::Src::LU(24), dxbc::Src::LU(8),\n                  dxbc::Src::R(1, dxbc::Src::kWWWW),\n                  dxbc::Src::R(1, dxbc::Src::kXXXX));\n        }\n      }\n    }\n    switch (mode.output) {\n      case TransferOutput::kColor:\n        // Unless a special path was taken, unpack the raw 32bpp value into the\n        // 32bpp color output. Any register can be used as temporary if needed -\n        // this is the end of the shader.\n        if (color_packed_in_r1x) {\n          switch (dest_color_format) {\n            case xenos::ColorRenderTargetFormat::k_8_8_8_8: {\n              a.OpUBFE(dxbc::Dest::R(1), dxbc::Src::LU(8),\n                       dxbc::Src::LU(0, 8, 16, 24),\n                       dxbc::Src::R(1, dxbc::Src::kXXXX));\n              a.OpUToF(dxbc::Dest::R(1), dxbc::Src::R(1));\n              a.OpMul(dxbc::Dest::O(0), dxbc::Src::R(1),\n                      dxbc::Src::LF(1.0f / 255.0f));\n            } break;\n            case xenos::ColorRenderTargetFormat::k_8_8_8_8_GAMMA: {\n              // 8_8_8_8_GAMMA is represented by linear stored in\n              // R16G16B16A16_UNORM.\n              a.OpUBFE(dxbc::Dest::R(1), dxbc::Src::LU(8),\n                       dxbc::Src::LU(0, 8, 16, 24),\n                       dxbc::Src::R(1, dxbc::Src::kXXXX));\n              a.OpUToF(dxbc::Dest::R(1), dxbc::Src::R(1));\n              a.OpMul(dxbc::Dest::R(1, 0b0111), dxbc::Src::R(1),\n                      dxbc::Src::LF(1.0f / 255.0f));\n              a.OpMul(dxbc::Dest::O(0, 0b1000), dxbc::Src::R(1),\n                      dxbc::Src::LF(1.0f / 255.0f));\n              for (uint32_t i = 0; i < 3; ++i) {\n                DxbcShaderTranslator::PWLGammaToLinear(a, 1, i, 1, i, true, 0,\n                                                       0, 0, 1);\n              }\n              // TODO(Triang3l): The `mov` can be eliminated by passing the\n              // destination to `PWLGammaToLinear` as `dxbc::Dest` rather than\n              // just the register index.\n              a.OpMov(dxbc::Dest::O(0, 0b0111), dxbc::Src::R(1));\n            } break;\n            case xenos::ColorRenderTargetFormat::k_2_10_10_10:\n            case xenos::ColorRenderTargetFormat::k_2_10_10_10_AS_10_10_10_10: {\n              a.OpUBFE(dxbc::Dest::R(1), dxbc::Src::LU(10, 10, 10, 2),\n                       dxbc::Src::LU(0, 10, 20, 30),\n                       dxbc::Src::R(1, dxbc::Src::kXXXX));\n              a.OpUToF(dxbc::Dest::R(1), dxbc::Src::R(1));\n              a.OpMul(dxbc::Dest::O(0), dxbc::Src::R(1),\n                      dxbc::Src::LF(1.0f / 1023.0f, 1.0f / 1023.0f,\n                                    1.0f / 1023.0f, 1.0f / 3.0f));\n            } break;\n            case xenos::ColorRenderTargetFormat::k_2_10_10_10_FLOAT:\n            case xenos::ColorRenderTargetFormat::\n                k_2_10_10_10_FLOAT_AS_16_16_16_16: {\n              // Color using r1.yz as temporary.\n              for (uint32_t i = 0; i < 3; ++i) {\n                DxbcShaderTranslator::Float7e3To32(a, dxbc::Dest::O(0, 1 << i),\n                                                   1, 0, i * 10, 1, 1, 1, 2);\n              }\n              // Alpha.\n              a.OpUBFE(dxbc::Dest::R(1, 0b1000), dxbc::Src::LU(2),\n                       dxbc::Src::LU(30), dxbc::Src::R(1, dxbc::Src::kXXXX));\n              a.OpUToF(dxbc::Dest::R(1, 0b1000),\n                       dxbc::Src::R(1, dxbc::Src::kWWWW));\n              a.OpMul(dxbc::Dest::O(0, 0b1000),\n                      dxbc::Src::R(1, dxbc::Src::kWWWW),\n                      dxbc::Src::LF(1.0f / 3.0f));\n            } break;\n            case xenos::ColorRenderTargetFormat::k_16_16:\n            case xenos::ColorRenderTargetFormat::k_16_16_FLOAT: {\n              // All 16 bits per component formats are represented as integers\n              // in ownership transfer for safe handling of NaNs and\n              // -32768 / -32767.\n              a.OpUBFE(dxbc::Dest::O(0, 0b0011), dxbc::Src::LU(16),\n                       dxbc::Src::LU(0, 16, 0, 0),\n                       dxbc::Src::R(1, dxbc::Src::kXXXX));\n            } break;\n            case xenos::ColorRenderTargetFormat::k_32_FLOAT: {\n              // Already as a 32-bit value.\n              a.OpMov(dxbc::Dest::O(0, 0b0001),\n                      dxbc::Src::R(1, dxbc::Src::kXXXX));\n            } break;\n            default:\n              // A 64bpp format (handled separately) or an invalid one.\n              assert_unhandled_case(dest_color_format);\n          }\n        }\n        break;\n      case TransferOutput::kDepth:\n        if (source_is_color || depth_loaded_in_guest_format) {\n          if (color_packed_in_r1x) {\n            // Extract the depth bits to r1.w.\n            a.OpUBFE(dxbc::Dest::R(1, 0b1000), dxbc::Src::LU(24),\n                     dxbc::Src::LU(8), dxbc::Src::R(1, dxbc::Src::kXXXX));\n            if (osgn_parameter_index_sv_stencil_ref != UINT32_MAX) {\n              // Extract the stencil bits to the stencil reference.\n              // The depth -> depth case is handled earlier, not long after\n              // loading the stencil, for simplicity.\n              a.OpUBFE(dxbc::Dest::OStencilRef(), dxbc::Src::LU(8),\n                       dxbc::Src::LU(0), dxbc::Src::R(1, dxbc::Src::kXXXX));\n            }\n          }\n          // r1.w contains the depth in the guest format. If a host depth source\n          // is available, need to check if it's up to date - if it is, the host\n          // precision value needs to be written. Otherwise, the new guest value\n          // needs to be converted to the host format. Using `if` here because\n          // it's likely that the values will either be the same - if not\n          // modified - or different - if cleared or totally overwritten - in\n          // large amounts of samples, usually whole waves, at once.\n          if (rs & kTransferUsedRootParameterHostDepthSRVBit) {\n            // Load the host float32 depth to r0.x, check if, when converted to\n            // the guest format, it's the same as the guest source, thus up to\n            // date, and if it is, write host float32 depth to r1.w, otherwise\n            // do the guest -> host conversion on the `else` path.\n\n            // Current register allocation:\n            // r0.xy = pixel index within the destination 32bpp tile\n            // r0.z = 32bpp tile index relative to the destination base\n            // r1.w = depth in guest format\n\n            if (key.host_depth_source_is_copy) {\n              // Get the address in the EDRAM scratch buffer and load from\n              // there.\n              // The beginning of the buffer is (0, 0) of the destination.\n              // 40-sample columns are not swapped for addressing simplicity\n              // (because this is used for depth -> depth transfers, where\n              // swapping isn't needed).\n              // Convert samples to pixels.\n              assert_true(key.host_depth_source_msaa_samples ==\n                          xenos::MsaaSamples::k1X);\n              if (key.dest_msaa_samples >= xenos::MsaaSamples::k2X) {\n                if (key.dest_msaa_samples >= xenos::MsaaSamples::k4X) {\n                  // Horizontal sample index in bit 0.\n                  a.OpBFI(dxbc::Dest::R(0, 0b0001), dxbc::Src::LU(31),\n                          dxbc::Src::LU(1), dxbc::Src::R(0, dxbc::Src::kXXXX),\n                          dest_sample);\n                }\n                // Vertical sample index as 1 or 0 in bit 0 for true 2x or as 0\n                // or 1 in bit 1 for 4x or for 2x emulated as 4x.\n                if (key.dest_msaa_samples == xenos::MsaaSamples::k2X &&\n                    msaa_2x_supported_) {\n                  a.OpBFI(dxbc::Dest::R(0, 0b0010), dxbc::Src::LU(31),\n                          dxbc::Src::LU(1), dxbc::Src::R(0, dxbc::Src::kYYYY),\n                          dest_sample);\n                  a.OpXOr(dxbc::Dest::R(0, 0b0010),\n                          dxbc::Src::R(0, dxbc::Src::kYYYY), dxbc::Src::LU(1));\n                } else {\n                  // Using r0.w as a temporary.\n                  a.OpUShR(dxbc::Dest::R(0, 0b1000), dest_sample,\n                           dxbc::Src::LU(1));\n                  a.OpBFI(dxbc::Dest::R(0, 0b0010), dxbc::Src::LU(31),\n                          dxbc::Src::LU(1), dxbc::Src::R(0, dxbc::Src::kYYYY),\n                          dxbc::Src::R(0, dxbc::Src::kWWWW));\n                }\n              }\n              // Combine the tile sample index and the tile index into buffer\n              // address to r0.x.\n              // The tile index doesn't need to be wrapped, as the host depth is\n              // written to the beginning of the buffer, without the base\n              // offset.\n              a.OpUMAd(dxbc::Dest::R(0, 0b0001),\n                       dxbc::Src::LU(tile_width_samples),\n                       dxbc::Src::R(0, dxbc::Src::kYYYY),\n                       dxbc::Src::R(0, dxbc::Src::kXXXX));\n              a.OpUMAd(dxbc::Dest::R(0, 0b0001),\n                       dxbc::Src::LU(tile_width_samples * tile_height_samples),\n                       dxbc::Src::R(0, dxbc::Src::kZZZZ),\n                       dxbc::Src::R(0, dxbc::Src::kXXXX));\n              // Load from the buffer.\n              a.OpLd(dxbc::Dest::R(0, 0b0001),\n                     dxbc::Src::R(0, dxbc::Src::kXXXX), 0b0001,\n                     dxbc::Src::T(srv_index_host_depth,\n                                  kTransferSRVRegisterHostDepth,\n                                  dxbc::Src::kXXXX));\n            } else {\n              // Adjust the tile index from the destination to the host depth\n              // source.\n              // r0.w = destination to host depth source EDRAM tile adjustment\n              a.OpIBFE(dxbc::Dest::R(0, 0b1000),\n                       dxbc::Src::LU(xenos::kEdramBaseTilesBits + 1),\n                       dxbc::Src::LU(xenos::kEdramPitchTilesBits * 2),\n                       dxbc::Src::CB(cbuffer_index_host_depth_address,\n                                     kTransferCBVRegisterHostDepthAddress, 0,\n                                     dxbc::Src::kXXXX));\n              // r0.z = tile index relative to the host depth source base, or\n              //        the tile index within the host depth source minus the\n              //        EDRAM tile count if transferring across addressing\n              //        wrapping (if negative)\n              // r0.w = free\n              a.OpIAdd(dxbc::Dest::R(0, 0b0100),\n                       dxbc::Src::R(0, dxbc::Src::kZZZZ),\n                       dxbc::Src::R(0, dxbc::Src::kWWWW));\n              // r0.z = tile index relative to the host depth source base\n              a.OpAnd(dxbc::Dest::R(0, 0b0100),\n                      dxbc::Src::R(0, dxbc::Src::kZZZZ),\n                      dxbc::Src::LU(xenos::kEdramTileCount - 1));\n              // Convert position and sample index from within the destination\n              // tile to within the host depth source tile, like for the guest\n              // render target, but for 32bpp -> 32bpp only.\n              dxbc::Src host_depth_source_sample(dest_sample);\n              if (key.host_depth_source_msaa_samples != key.dest_msaa_samples) {\n                if (key.host_depth_source_msaa_samples >=\n                    xenos::MsaaSamples::k4X) {\n                  // 4x -> 1x/2x.\n                  if (key.dest_msaa_samples == xenos::MsaaSamples::k2X) {\n                    // 4x -> 2x.\n                    // Horizontal pixels to samples. Vertical sample (1, 0 in\n                    // the first bit for native 2x or 0, 1 in the second bit for\n                    // 2x as 4x) to second sample bit.\n                    host_depth_source_sample =\n                        dxbc::Src::R(0, dxbc::Src::kWWWW);\n                    if (msaa_2x_supported_) {\n                      a.OpBFI(dxbc::Dest::R(0, 0b1000), dxbc::Src::LU(31),\n                              dxbc::Src::LU(1), dest_sample,\n                              dxbc::Src::R(0, dxbc::Src::kXXXX));\n                      a.OpXOr(dxbc::Dest::R(0, 0b1000),\n                              host_depth_source_sample, dxbc::Src::LU(1 << 1));\n                    } else {\n                      a.OpBFI(dxbc::Dest::R(0, 0b1000), dxbc::Src::LU(1),\n                              dxbc::Src::LU(0),\n                              dxbc::Src::R(0, dxbc::Src::kXXXX), dest_sample);\n                    }\n                    a.OpUShR(dxbc::Dest::R(0, 0b0001),\n                             dxbc::Src::R(0, dxbc::Src::kXXXX),\n                             dxbc::Src::LU(1));\n                  } else {\n                    // 4x -> 1x.\n                    // Pixels to samples.\n                    a.OpAnd(dxbc::Dest::R(0, 0b1000),\n                            dxbc::Src::R(0, dxbc::Src::kXXXX),\n                            dxbc::Src::LU(1));\n                    host_depth_source_sample =\n                        dxbc::Src::R(0, dxbc::Src::kWWWW);\n                    a.OpBFI(dxbc::Dest::R(0, 0b1000), dxbc::Src::LU(1),\n                            dxbc::Src::LU(1), dxbc::Src::R(0, dxbc::Src::kYYYY),\n                            host_depth_source_sample);\n                    a.OpUShR(dxbc::Dest::R(0, 0b0011), dxbc::Src::R(0),\n                             dxbc::Src::LU(1));\n                  }\n                } else {\n                  // 1x/2x -> 1x/2x/4x (as long as they're different).\n                  // Only the X part - Y is handled by common code.\n                  if (key.dest_msaa_samples >= xenos::MsaaSamples::k4X) {\n                    // Horizontal samples to pixels.\n                    a.OpBFI(dxbc::Dest::R(0, 0b0001), dxbc::Src::LU(31),\n                            dxbc::Src::LU(1), dxbc::Src::R(0, dxbc::Src::kXXXX),\n                            dest_sample);\n                  }\n                }\n                // Host depth source Y and sample index for 1x/2x AA sources.\n                if (key.host_depth_source_msaa_samples <\n                    xenos::MsaaSamples::k4X) {\n                  if (key.dest_msaa_samples >= xenos::MsaaSamples::k4X) {\n                    // 1x/2x -> 4x.\n                    if (key.host_depth_source_msaa_samples ==\n                        xenos::MsaaSamples::k2X) {\n                      // 2x -> 4x.\n                      // Vertical samples (second bit) of 4x destination to\n                      // vertical sample (1, 0 for native 2x, or 0, 3 for 2x as\n                      // 4x) of 2x source.\n                      a.OpUShR(dxbc::Dest::R(0, 0b1000), dest_sample,\n                               dxbc::Src::LU(1));\n                      host_depth_source_sample =\n                          dxbc::Src::R(0, dxbc::Src::kWWWW);\n                      if (msaa_2x_supported_) {\n                        a.OpXOr(dxbc::Dest::R(0, 0b1000),\n                                host_depth_source_sample, dxbc::Src::LU(1));\n                      } else {\n                        a.OpBFI(dxbc::Dest::R(0, 0b1000), dxbc::Src::LU(1),\n                                dxbc::Src::LU(1), host_depth_source_sample,\n                                host_depth_source_sample);\n                      }\n                    } else {\n                      // 1x -> 4x.\n                      // Vertical samples (second bit) to Y pixels, using r0.w\n                      // (not needed without source MSAA) as a temporary.\n                      a.OpUShR(dxbc::Dest::R(0, 0b1000), dest_sample,\n                               dxbc::Src::LU(1));\n                      a.OpBFI(dxbc::Dest::R(0, 0b0010), dxbc::Src::LU(31),\n                              dxbc::Src::LU(1),\n                              dxbc::Src::R(0, dxbc::Src::kYYYY),\n                              dxbc::Src::R(0, dxbc::Src::kWWWW));\n                    }\n                  } else {\n                    // 1x/2x -> different 1x/2x.\n                    if (key.host_depth_source_msaa_samples ==\n                        xenos::MsaaSamples::k2X) {\n                      // 2x -> 1x.\n                      // Vertical pixels of 2x destination to vertical samples\n                      // (1, 0 for native 2x, or 0, 3 for 2x as 4x) of 1x\n                      // source.\n                      a.OpAnd(dxbc::Dest::R(0, 0b1000),\n                              dxbc::Src::R(0, dxbc::Src::kYYYY),\n                              dxbc::Src::LU(1));\n                      host_depth_source_sample =\n                          dxbc::Src::R(0, dxbc::Src::kWWWW);\n                      if (msaa_2x_supported_) {\n                        a.OpXOr(dxbc::Dest::R(0, 0b1000),\n                                host_depth_source_sample, dxbc::Src::LU(1));\n                      } else {\n                        a.OpBFI(dxbc::Dest::R(0, 0b1000), dxbc::Src::LU(1),\n                                dxbc::Src::LU(1), host_depth_source_sample,\n                                host_depth_source_sample);\n                      }\n                      a.OpUShR(dxbc::Dest::R(0, 0b0010),\n                               dxbc::Src::R(0, dxbc::Src::kYYYY),\n                               dxbc::Src::LU(1));\n                    } else {\n                      // 1x -> 2x.\n                      // Vertical samples (1, 0 in the first bit for native 2x\n                      // or 0, 1 in the second bit for 2x as 4x) of 2x\n                      // destination to vertical pixels of 1x source.\n                      // Using r0.w (not needed without source MSAA) as a\n                      // temporary.\n                      if (msaa_2x_supported_) {\n                        a.OpBFI(dxbc::Dest::R(0, 0b0010), dxbc::Src::LU(31),\n                                dxbc::Src::LU(1),\n                                dxbc::Src::R(0, dxbc::Src::kYYYY), dest_sample);\n                        a.OpXOr(dxbc::Dest::R(0, 0b0010),\n                                dxbc::Src::R(0, dxbc::Src::kYYYY),\n                                dxbc::Src::LU(1));\n                      } else {\n                        a.OpUShR(dxbc::Dest::R(0, 0b1000), dest_sample,\n                                 dxbc::Src::LU(1));\n                        a.OpBFI(dxbc::Dest::R(0, 0b0010), dxbc::Src::LU(31),\n                                dxbc::Src::LU(1),\n                                dxbc::Src::R(0, dxbc::Src::kYYYY),\n                                dxbc::Src::R(0, dxbc::Src::kWWWW));\n                      }\n                    }\n                  }\n                }\n              }\n              // r1.x = host depth source pitch in tiles\n              a.OpUBFE(dxbc::Dest::R(1, 0b0001),\n                       dxbc::Src::LU(xenos::kEdramPitchTilesBits),\n                       dxbc::Src::LU(xenos::kEdramPitchTilesBits),\n                       dxbc::Src::CB(cbuffer_index_host_depth_address,\n                                     kTransferCBVRegisterHostDepthAddress, 0,\n                                     dxbc::Src::kXXXX));\n              // r0.z = host depth source tile row\n              // r1.x = host depth source tile within the row\n              a.OpUDiv(dxbc::Dest::R(0, 0b0100), dxbc::Dest::R(1, 0b0001),\n                       dxbc::Src::R(0, dxbc::Src::kZZZZ),\n                       dxbc::Src::R(1, dxbc::Src::kXXXX));\n              // r0.x = pixel X within the host depth source texture\n              // r1.x = free\n              a.OpUMAd(\n                  dxbc::Dest::R(0, 0b0001),\n                  dxbc::Src::LU(tile_width_samples >>\n                                uint32_t(key.host_depth_source_msaa_samples >=\n                                         xenos::MsaaSamples::k4X)),\n                  dxbc::Src::R(1, dxbc::Src::kXXXX),\n                  dxbc::Src::R(0, dxbc::Src::kXXXX));\n              // r0.y = pixel Y within the host depth source texture\n              // r0.z = free\n              a.OpUMAd(\n                  dxbc::Dest::R(0, 0b0010),\n                  dxbc::Src::LU(tile_height_samples >>\n                                uint32_t(key.host_depth_source_msaa_samples >=\n                                         xenos::MsaaSamples::k2X)),\n                  dxbc::Src::R(0, dxbc::Src::kZZZZ),\n                  dxbc::Src::R(0, dxbc::Src::kYYYY));\n              // Load from the host depth texture.\n              if (key.host_depth_source_msaa_samples !=\n                  xenos::MsaaSamples::k1X) {\n                a.OpLdMS(dxbc::Dest::R(0, 0b0001), dxbc::Src::R(0), 0b0011,\n                         dxbc::Src::T(srv_index_host_depth,\n                                      kTransferSRVRegisterHostDepth,\n                                      dxbc::Src::kXXXX),\n                         host_depth_source_sample);\n              } else {\n                // Write zero to the LOD index in r0.z.\n                a.OpMov(dxbc::Dest::R(0, 0b0100), dxbc::Src::LU(0));\n                a.OpLd(dxbc::Dest::R(0, 0b0001), dxbc::Src::R(0, 0b10000100),\n                       0b1011,\n                       dxbc::Src::T(srv_index_host_depth,\n                                    kTransferSRVRegisterHostDepth,\n                                    dxbc::Src::kXXXX));\n              }\n            }\n            // Convert the host depth value in r0.x to the guest format in r0.y\n            // using r0.z as a temporary and check if it matches the value in\n            // the currently owning guest render target.\n            switch (dest_depth_format) {\n              case xenos::DepthRenderTargetFormat::kD24S8: {\n                // Round to the nearest even integer. This seems to be the\n                // correct, adding +0.5 and rounding towards zero results in red\n                // instead of black in the 4D5307E6 clear shader.\n                a.OpMul(dxbc::Dest::R(0, 0b0010),\n                        dxbc::Src::R(0, dxbc::Src::kXXXX),\n                        dxbc::Src::LF(float(0xFFFFFF)));\n                a.OpRoundNE(dxbc::Dest::R(0, 0b0010),\n                            dxbc::Src::R(0, dxbc::Src::kYYYY));\n                a.OpFToU(dxbc::Dest::R(0, 0b0010),\n                         dxbc::Src::R(0, dxbc::Src::kYYYY));\n              } break;\n              case xenos::DepthRenderTargetFormat::kD24FS8: {\n                // When converting the depth in pixel shaders, it's always\n                // exact, truncating not to insert additional rounding\n                // instructions.\n                DxbcShaderTranslator::PreClampedDepthTo20e4(\n                    a, 0, 1, 0, 0, 0, 2,\n                    !depth_float24_convert_in_pixel_shader() &&\n                        depth_float24_round(),\n                    true);\n              } break;\n            }\n            a.OpIEq(dxbc::Dest::R(0, 0b0010), dxbc::Src::R(0, dxbc::Src::kYYYY),\n                    dxbc::Src::R(1, dxbc::Src::kWWWW));\n            a.OpIf(true, dxbc::Src::R(0, dxbc::Src::kYYYY));\n            // If the host depth is up to date, write it to oDepth at the host\n            // precision instead of converting the guest depth.\n            a.OpMov(dxbc::Dest::R(1, 0b1000),\n                    dxbc::Src::R(0, dxbc::Src::kXXXX));\n            a.OpElse();\n          }\n          // Convert using r0.x as a temporary.\n          switch (dest_depth_format) {\n            case xenos::DepthRenderTargetFormat::kD24S8: {\n              // Multiplying by 1.0 / 0xFFFFFF produces an incorrect result (for\n              // 0xC00000, for instance - which is 2_10_10_10 clear to 0001) -\n              // rescale from 0...0xFFFFFF to 0...0x1000000 doing what true\n              // float division followed by multiplication does (on x86-64 MSVC\n              // with default SSE rounding) - values starting from 0x800000\n              // become bigger by 1; then accurately bias the result's exponent.\n              a.OpUShR(dxbc::Dest::R(0, 0b0001),\n                       dxbc::Src::R(1, dxbc::Src::kWWWW), dxbc::Src::LU(23));\n              a.OpIAdd(dxbc::Dest::R(1, 0b1000),\n                       dxbc::Src::R(1, dxbc::Src::kWWWW),\n                       dxbc::Src::R(0, dxbc::Src::kXXXX));\n              a.OpUToF(dxbc::Dest::R(1, 0b1000),\n                       dxbc::Src::R(1, dxbc::Src::kWWWW));\n              a.OpMul(dxbc::Dest::R(1, 0b1000),\n                      dxbc::Src::R(1, dxbc::Src::kWWWW),\n                      dxbc::Src::LF(1.0f / float(1 << 24)));\n            } break;\n            case xenos::DepthRenderTargetFormat::kD24FS8: {\n              DxbcShaderTranslator::Depth20e4To32(a, dxbc::Dest::R(1, 0b1000),\n                                                  1, 3, 0, 1, 3, 0, 0, true);\n            } break;\n          }\n          // Host depth is different, or not available - convert the guest depth\n          // to the destination format.\n          if (rs & kTransferUsedRootParameterHostDepthSRVBit) {\n            // Close the conditional for the host / guest depth.\n            a.OpEndIf();\n          }\n        }\n        a.OpMov(dxbc::Dest::ODepth(), dxbc::Src::R(1, dxbc::Src::kWWWW));\n        break;\n      case TransferOutput::kStencilBit:\n        // Discard the sample if the needed stencil bit is not set.\n        assert_true(cbuffer_index_stencil_mask != UINT32_MAX);\n        a.OpAnd(dxbc::Dest::R(0, 0b0001), dxbc::Src::R(1, dxbc::Src::kXXXX),\n                dxbc::Src::CB(cbuffer_index_stencil_mask,\n                              kTransferCBVRegisterStencilMask, 0,\n                              dxbc::Src::kXXXX));\n        a.OpDiscard(false, dxbc::Src::R(0, dxbc::Src::kXXXX));\n        break;\n    }\n  }\n\n  if (dest_is_color) {\n    // Fill the unused components of the color result.\n    uint32_t dest_color_component_count =\n        xenos::GetColorRenderTargetFormatComponentCount(dest_color_format);\n    uint32_t dest_color_unwritten_mask =\n        0b1111 & ~uint32_t((1 << dest_color_component_count) - 1);\n    if (dest_color_component_count < 4) {\n      a.OpMov(dxbc::Dest::O(0, dest_color_unwritten_mask), dxbc::Src::LU(0));\n    }\n  }\n\n  a.OpRet();\n\n  // Write the shader program length in dwords.\n  built_shader_[shex_position_dwords + 1] =\n      uint32_t(built_shader_.size()) - shex_position_dwords;\n\n  {\n    auto& blob_header = *reinterpret_cast<dxbc::BlobHeader*>(\n        built_shader_.data() + blob_position_dwords);\n    blob_header.fourcc = dxbc::BlobHeader::FourCC::kShaderEx;\n    blob_position_dwords = uint32_t(built_shader_.size());\n    blob_header.size_bytes =\n        (blob_position_dwords - kBlobHeaderSizeDwords) * sizeof(uint32_t) -\n        built_shader_[blob_offset_position_dwords++];\n  }\n\n  // ***************************************************************************\n  // Shader feature info\n  // ***************************************************************************\n\n  if (shader_uses_stencil_reference_output) {\n    built_shader_[blob_offset_position_dwords] =\n        uint32_t(blob_position_dwords * sizeof(uint32_t));\n    uint32_t sfi0_position_dwords =\n        blob_position_dwords + kBlobHeaderSizeDwords;\n    built_shader_.resize(sfi0_position_dwords +\n                         sizeof(dxbc::ShaderFeatureInfo) / sizeof(uint32_t));\n    auto& shader_feature_info = *reinterpret_cast<dxbc::ShaderFeatureInfo*>(\n        built_shader_.data() + sfi0_position_dwords);\n    shader_feature_info.feature_flags[0] |= dxbc::kShaderFeature0_StencilRef;\n    {\n      auto& blob_header = *reinterpret_cast<dxbc::BlobHeader*>(\n          built_shader_.data() + blob_position_dwords);\n      blob_header.fourcc = dxbc::BlobHeader::FourCC::kShaderFeatureInfo;\n      blob_position_dwords = uint32_t(built_shader_.size());\n      blob_header.size_bytes =\n          (blob_position_dwords - kBlobHeaderSizeDwords) * sizeof(uint32_t) -\n          built_shader_[blob_offset_position_dwords++];\n    }\n  }\n\n  // ***************************************************************************\n  // Statistics\n  // ***************************************************************************\n\n  built_shader_[blob_offset_position_dwords] =\n      uint32_t(blob_position_dwords * sizeof(uint32_t));\n  uint32_t stat_position_dwords = blob_position_dwords + kBlobHeaderSizeDwords;\n  built_shader_.resize(stat_position_dwords +\n                       sizeof(dxbc::Statistics) / sizeof(uint32_t));\n  std::memcpy(built_shader_.data() + stat_position_dwords, &stat,\n              sizeof(dxbc::Statistics));\n  {\n    auto& blob_header = *reinterpret_cast<dxbc::BlobHeader*>(\n        built_shader_.data() + blob_position_dwords);\n    blob_header.fourcc = dxbc::BlobHeader::FourCC::kStatistics;\n    blob_position_dwords = uint32_t(built_shader_.size());\n    blob_header.size_bytes =\n        (blob_position_dwords - kBlobHeaderSizeDwords) * sizeof(uint32_t) -\n        built_shader_[blob_offset_position_dwords++];\n  }\n\n  // ***************************************************************************\n  // Container header\n  // ***************************************************************************\n\n  uint32_t built_shader_size_bytes =\n      uint32_t(built_shader_.size() * sizeof(uint32_t));\n  {\n    auto& container_header =\n        *reinterpret_cast<dxbc::ContainerHeader*>(built_shader_.data());\n    container_header.InitializeIdentification();\n    container_header.size_bytes = built_shader_size_bytes;\n    container_header.blob_count = blob_count;\n    CalculateDXBCChecksum(\n        reinterpret_cast<unsigned char*>(built_shader_.data()),\n        static_cast<unsigned int>(built_shader_size_bytes),\n        reinterpret_cast<unsigned int*>(&container_header.hash));\n  }\n\n  // ***************************************************************************\n  // Pipeline\n  // ***************************************************************************\n\n  ID3D12PipelineState* const* pipelines;\n  ID3D12Device* device = command_processor_.GetD3D12Provider().GetDevice();\n  D3D12_INPUT_ELEMENT_DESC pipeline_input_element_desc;\n  pipeline_input_element_desc.SemanticName = \"POSITION\";\n  pipeline_input_element_desc.SemanticIndex = 0;\n  pipeline_input_element_desc.Format = DXGI_FORMAT_R32G32_FLOAT;\n  pipeline_input_element_desc.InputSlot = 0;\n  pipeline_input_element_desc.AlignedByteOffset = 0;\n  pipeline_input_element_desc.InputSlotClass =\n      D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA;\n  pipeline_input_element_desc.InstanceDataStepRate = 0;\n  D3D12_GRAPHICS_PIPELINE_STATE_DESC pipeline_desc = {};\n  pipeline_desc.pRootSignature = transfer_root_signatures_[size_t(\n      use_stencil_reference_output_ ? mode.root_signature_with_stencil_ref\n                                    : mode.root_signature_no_stencil_ref)];\n  pipeline_desc.VS.pShaderBytecode = shaders::passthrough_position_xy_vs;\n  pipeline_desc.VS.BytecodeLength = sizeof(shaders::passthrough_position_xy_vs);\n  pipeline_desc.PS.pShaderBytecode = built_shader_.data();\n  pipeline_desc.PS.BytecodeLength = built_shader_size_bytes;\n  if (key.dest_msaa_samples == xenos::MsaaSamples::k2X && !msaa_2x_supported_) {\n    // Using sample 0 as 0 and 3 as 1 for 2x instead.\n    pipeline_desc.SampleMask = 0b1001;\n    pipeline_desc.SampleDesc.Count = 4;\n  } else {\n    pipeline_desc.SampleMask = UINT_MAX;\n    pipeline_desc.SampleDesc.Count = UINT(1) << UINT(key.dest_msaa_samples);\n  }\n  pipeline_desc.RasterizerState.FillMode = D3D12_FILL_MODE_SOLID;\n  pipeline_desc.RasterizerState.CullMode = D3D12_CULL_MODE_NONE;\n  pipeline_desc.RasterizerState.DepthClipEnable = TRUE;\n  pipeline_desc.InputLayout.pInputElementDescs = &pipeline_input_element_desc;\n  pipeline_desc.InputLayout.NumElements = 1;\n  pipeline_desc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;\n  if (dest_is_stencil_bit) {\n    pipeline_desc.DepthStencilState.StencilEnable = TRUE;\n    pipeline_desc.DepthStencilState.FrontFace.StencilFailOp =\n        D3D12_STENCIL_OP_KEEP;\n    pipeline_desc.DepthStencilState.FrontFace.StencilDepthFailOp =\n        D3D12_STENCIL_OP_KEEP;\n    pipeline_desc.DepthStencilState.FrontFace.StencilPassOp =\n        D3D12_STENCIL_OP_REPLACE;\n    pipeline_desc.DepthStencilState.FrontFace.StencilFunc =\n        D3D12_COMPARISON_FUNC_ALWAYS;\n    pipeline_desc.DepthStencilState.BackFace =\n        pipeline_desc.DepthStencilState.FrontFace;\n    pipeline_desc.DSVFormat = GetDepthDSVDXGIFormat(dest_depth_format);\n    // Even if creation fails, still store the null pointers not to try to\n    // create again.\n    std::array<ID3D12PipelineState*, 8>& stencil_bit_pipelines =\n        transfer_stencil_bit_pipelines_\n            .emplace(std::piecewise_construct, std::make_tuple(key),\n                     std::make_tuple())\n            .first->second;\n    bool stencil_pipelines_created = true;\n    for (uint32_t i = 0; i < 8; ++i) {\n      pipeline_desc.DepthStencilState.StencilWriteMask = UINT8(1) << i;\n      if (SUCCEEDED(device->CreateGraphicsPipelineState(\n              &pipeline_desc, IID_PPV_ARGS(&stencil_bit_pipelines[i])))) {\n        continue;\n      }\n      stencil_pipelines_created = false;\n      for (uint32_t j = 0; j < i; ++j) {\n        stencil_bit_pipelines[j]->Release();\n        stencil_bit_pipelines[j] = nullptr;\n      }\n      break;\n    }\n    pipelines =\n        stencil_pipelines_created ? stencil_bit_pipelines.data() : nullptr;\n  } else {\n    if (dest_is_color) {\n      pipeline_desc.BlendState.RenderTarget[0].RenderTargetWriteMask =\n          D3D12_COLOR_WRITE_ENABLE_ALL;\n      pipeline_desc.NumRenderTargets = 1;\n      pipeline_desc.RTVFormats[0] =\n          GetColorOwnershipTransferDXGIFormat(dest_color_format);\n    } else {\n      pipeline_desc.DepthStencilState.DepthEnable = TRUE;\n      pipeline_desc.DepthStencilState.DepthWriteMask =\n          D3D12_DEPTH_WRITE_MASK_ALL;\n      pipeline_desc.DepthStencilState.DepthFunc =\n          cvars::depth_transfer_not_equal_test ? D3D12_COMPARISON_FUNC_NOT_EQUAL\n                                               : D3D12_COMPARISON_FUNC_ALWAYS;\n      if (use_stencil_reference_output_) {\n        pipeline_desc.DepthStencilState.StencilEnable = TRUE;\n        pipeline_desc.DepthStencilState.StencilWriteMask = UINT8_MAX;\n        pipeline_desc.DepthStencilState.FrontFace.StencilFailOp =\n            D3D12_STENCIL_OP_KEEP;\n        pipeline_desc.DepthStencilState.FrontFace.StencilDepthFailOp =\n            cvars::depth_transfer_not_equal_test ? D3D12_STENCIL_OP_REPLACE\n                                                 : D3D12_STENCIL_OP_KEEP;\n        pipeline_desc.DepthStencilState.FrontFace.StencilPassOp =\n            D3D12_STENCIL_OP_REPLACE;\n        // Using ALWAYS, not NOT_EQUAL, so depth writing is unaffected by\n        // stencil being different.\n        pipeline_desc.DepthStencilState.FrontFace.StencilFunc =\n            D3D12_COMPARISON_FUNC_ALWAYS;\n        pipeline_desc.DepthStencilState.BackFace =\n            pipeline_desc.DepthStencilState.FrontFace;\n      }\n      pipeline_desc.DSVFormat = GetDepthDSVDXGIFormat(dest_depth_format);\n    }\n    ID3D12PipelineState* pipeline;\n    if (FAILED(device->CreateGraphicsPipelineState(&pipeline_desc,\n                                                   IID_PPV_ARGS(&pipeline)))) {\n      pipeline = nullptr;\n    }\n    // Even if creation fails, still store the null pointer not to try to create\n    // again.\n    // Return a pointer to the persistent location.\n    ID3D12PipelineState*& inserted_pipeline =\n        transfer_pipelines_.emplace(key, pipeline).first->second;\n    pipelines = inserted_pipeline ? &inserted_pipeline : nullptr;\n  }\n  // TODO(Triang3l): Pipeline state name debug names (lots of variables - but\n  // not very important since everything can be derived from the bindings and\n  // outputs in a debugger).\n\n  if (!pipelines) {\n    // Stencil bit copying uses only the stencil SRV for depth / stencil source,\n    // can't use srv_index_depth for checking.\n    const char* source_format_name =\n        (rs & kTransferUsedRootParameterColorSRVBit)\n            ? xenos::GetColorRenderTargetFormatName(source_color_format)\n            : xenos::GetDepthRenderTargetFormatName(source_depth_format);\n    const char* dest_format_name =\n        mode.output == TransferOutput::kColor\n            ? xenos::GetColorRenderTargetFormatName(dest_color_format)\n            : xenos::GetDepthRenderTargetFormatName(dest_depth_format);\n    if (srv_index_host_depth != UINT32_MAX) {\n      XELOGE(\n          \"D3D12RenderTargetCache: Failed to create a render target ownership \"\n          \"transfer pipeline for {}-sample {} + {}-sample host depth{} -> \"\n          \"{}-sample {} for mode {}\",\n          uint32_t(1) << uint32_t(key.source_msaa_samples), source_format_name,\n          uint32_t(1) << uint32_t(key.host_depth_source_msaa_samples),\n          key.host_depth_source_is_copy ? \" copy\" : \"\",\n          uint32_t(1) << uint32_t(key.dest_msaa_samples), dest_format_name,\n          uint32_t(key.mode));\n    } else {\n      XELOGE(\n          \"D3D12RenderTargetCache: Failed to create a render target ownership \"\n          \"transfer pipeline for {}-sample {} -> {}-sample {} for mode {}\",\n          uint32_t(1) << uint32_t(key.source_msaa_samples), source_format_name,\n          uint32_t(1) << uint32_t(key.dest_msaa_samples), dest_format_name,\n          uint32_t(key.mode));\n    }\n  }\n  return pipelines;\n}\n\nvoid D3D12RenderTargetCache::PerformTransfersAndResolveClears(\n    uint32_t render_target_count, RenderTarget* const* render_targets,\n    const std::vector<Transfer>* render_target_transfers,\n    const uint64_t* render_target_resolve_clear_values,\n    const Transfer::Rectangle* resolve_clear_rectangle) {\n  assert_true(GetPath() == Path::kHostRenderTargets);\n\n  const ui::d3d12::D3D12Provider& provider =\n      command_processor_.GetD3D12Provider();\n  ID3D12Device* device = provider.GetDevice();\n  uint64_t current_submission = command_processor_.GetCurrentSubmission();\n  DeferredCommandList& command_list =\n      command_processor_.GetDeferredCommandList();\n\n  bool resolve_clear_needed =\n      render_target_resolve_clear_values && resolve_clear_rectangle;\n  D3D12_RECT clear_rect;\n  if (resolve_clear_needed) {\n    // Assuming the rectangle is already clamped by the setup function from the\n    // common render target cache.\n    clear_rect.left =\n        LONG(resolve_clear_rectangle->x_pixels * draw_resolution_scale_x());\n    clear_rect.top =\n        LONG(resolve_clear_rectangle->y_pixels * draw_resolution_scale_y());\n    clear_rect.right = LONG((resolve_clear_rectangle->x_pixels +\n                             resolve_clear_rectangle->width_pixels) *\n                            draw_resolution_scale_x());\n    clear_rect.bottom = LONG((resolve_clear_rectangle->y_pixels +\n                              resolve_clear_rectangle->height_pixels) *\n                             draw_resolution_scale_y());\n  }\n\n  // Do host depth storing for the depth destination (assuming there can be only\n  // one depth destination) where depth destination == host depth source.\n  bool host_depth_store_set_up = false;\n  for (uint32_t i = 0; i < render_target_count; ++i) {\n    RenderTarget* dest_rt = render_targets[i];\n    if (!dest_rt) {\n      continue;\n    }\n    auto& dest_d3d12_rt = *static_cast<D3D12RenderTarget*>(dest_rt);\n    RenderTargetKey dest_rt_key = dest_d3d12_rt.key();\n    if (!dest_rt_key.is_depth) {\n      continue;\n    }\n    const std::vector<Transfer>& depth_transfers = render_target_transfers[i];\n    for (const Transfer& transfer : depth_transfers) {\n      if (transfer.host_depth_source != dest_rt) {\n        continue;\n      }\n      if (!host_depth_store_set_up) {\n        // Source descriptor.\n        ui::d3d12::util::DescriptorCpuGpuHandlePair\n            host_depth_store_descriptor_source;\n        if (!command_processor_.RequestOneUseSingleViewDescriptors(\n                1, &host_depth_store_descriptor_source)) {\n          continue;\n        }\n        command_list.D3DSetComputeRootSignature(\n            host_depth_store_root_signature_);\n        // Destination (EDRAM buffer).\n        command_list.D3DSetComputeRootUnorderedAccessView(\n            kHostDepthStoreRootParameterDest, edram_buffer_gpu_address_);\n        // Depth source texture.\n        device->CopyDescriptorsSimple(\n            1, host_depth_store_descriptor_source.first,\n            dest_d3d12_rt.descriptor_srv().GetHandle(),\n            D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);\n        command_list.D3DSetComputeRootDescriptorTable(\n            kHostDepthStoreRootParameterSource,\n            host_depth_store_descriptor_source.second);\n        // Render target constant.\n        HostDepthStoreRenderTargetConstant\n            host_depth_store_render_target_constant =\n                GetHostDepthStoreRenderTargetConstant(\n                    dest_rt_key.pitch_tiles_at_32bpp, msaa_2x_supported_);\n        command_list.D3DSetComputeRoot32BitConstants(\n            kHostDepthStoreRootParameterConstants,\n            sizeof(host_depth_store_render_target_constant) / sizeof(uint32_t),\n            &host_depth_store_render_target_constant,\n            offsetof(HostDepthStoreConstants, render_target) /\n                sizeof(uint32_t));\n        // Barriers - don't need to try to combine them with the rest of\n        // render target transfer barriers now - if this happens, after host\n        // depth storing, NON_PIXEL_SHADER_RESOURCE -> DEPTH_WRITE will be done\n        // anyway even in the best case, so it's not possible to have all the\n        // barriers in one place here.\n        TransitionEdramBuffer(D3D12_RESOURCE_STATE_UNORDERED_ACCESS);\n        command_processor_.PushTransitionBarrier(\n            dest_d3d12_rt.resource(),\n            dest_d3d12_rt.SetResourceState(\n                D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE),\n            D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE);\n        // Pipeline.\n        command_processor_.SetExternalPipeline(\n            host_depth_store_pipelines_[size_t(dest_rt_key.msaa_samples)]);\n        host_depth_store_set_up = true;\n      }\n      Transfer::Rectangle\n          transfer_rectangles[Transfer::kMaxRectanglesWithCutout];\n      uint32_t transfer_rectangle_count = transfer.GetRectangles(\n          dest_rt_key.base_tiles, dest_rt_key.pitch_tiles_at_32bpp,\n          dest_rt_key.msaa_samples, false, transfer_rectangles,\n          resolve_clear_rectangle);\n      assert_not_zero(transfer_rectangle_count);\n      HostDepthStoreRectangleConstant host_depth_store_rectangle_constant;\n      for (uint32_t j = 0; j < transfer_rectangle_count; ++j) {\n        uint32_t group_count_x, group_count_y;\n        GetHostDepthStoreRectangleInfo(\n            transfer_rectangles[j], dest_rt_key.msaa_samples,\n            host_depth_store_rectangle_constant, group_count_x, group_count_y);\n        command_list.D3DSetComputeRoot32BitConstants(\n            kHostDepthStoreRootParameterConstants,\n            sizeof(host_depth_store_rectangle_constant) / sizeof(uint32_t),\n            &host_depth_store_rectangle_constant,\n            offsetof(HostDepthStoreConstants, rectangle) / sizeof(uint32_t));\n        command_processor_.SubmitBarriers();\n        command_list.D3DDispatch(group_count_x, group_count_y, 1);\n        MarkEdramBufferModified();\n      }\n    }\n    break;\n  }\n\n  // Try to insert as many barriers as possible in one place, hoping that in the\n  // best case (no cross-copying between current render targets), barriers will\n  // need to be only inserted here, not between transfers. In case of\n  // cross-copying, if the destination use is going to happen before the source\n  // use, choose the destination state, otherwise the source state - to match\n  // the order in which transfers will actually happen (otherwise there will be\n  // just a useless switch back and forth).\n  for (uint32_t i = 0; i < render_target_count; ++i) {\n    RenderTarget* dest_rt = render_targets[i];\n    if (!dest_rt) {\n      continue;\n    }\n    auto& dest_d3d12_rt = *static_cast<D3D12RenderTarget*>(dest_rt);\n    const std::vector<Transfer>& dest_transfers = render_target_transfers[i];\n    if (!resolve_clear_needed && dest_transfers.empty()) {\n      continue;\n    }\n    // Transition the sources, only if not going to be used as destinations\n    // earlier.\n    for (const Transfer& transfer : render_target_transfers[i]) {\n      bool source_previously_used_as_dest = false;\n      bool host_depth_source_previously_used_as_dest = false;\n      for (uint32_t j = 0; j < i; ++j) {\n        if (render_target_transfers[j].empty()) {\n          continue;\n        }\n        const RenderTarget* previous_rt = render_targets[j];\n        if (transfer.source == previous_rt) {\n          source_previously_used_as_dest = true;\n        }\n        if (transfer.host_depth_source == previous_rt) {\n          host_depth_source_previously_used_as_dest = true;\n        }\n      }\n      if (!source_previously_used_as_dest) {\n        auto& source_d3d12_rt =\n            *static_cast<D3D12RenderTarget*>(transfer.source);\n        command_processor_.PushTransitionBarrier(\n            source_d3d12_rt.resource(),\n            source_d3d12_rt.SetResourceState(\n                D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE),\n            D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);\n      }\n      // transfer.host_depth_source == dest_rt means the EDRAM buffer will be\n      // used instead, no need to transition.\n      if (transfer.host_depth_source && transfer.host_depth_source != dest_rt &&\n          !host_depth_source_previously_used_as_dest) {\n        auto& host_depth_source_d3d12_rt =\n            *static_cast<D3D12RenderTarget*>(transfer.host_depth_source);\n        command_processor_.PushTransitionBarrier(\n            host_depth_source_d3d12_rt.resource(),\n            host_depth_source_d3d12_rt.SetResourceState(\n                D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE),\n            D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);\n      }\n    }\n    // Transition the destination, only if not going to be used as a source\n    // earlier.\n    bool dest_used_previously_as_source = false;\n    for (uint32_t j = 0; j < i; ++j) {\n      for (const Transfer& previous_transfer : render_target_transfers[j]) {\n        if (previous_transfer.source == dest_rt ||\n            previous_transfer.host_depth_source == dest_rt) {\n          dest_used_previously_as_source = true;\n          break;\n        }\n      }\n    }\n    if (!dest_used_previously_as_source) {\n      D3D12_RESOURCE_STATES dest_state =\n          dest_d3d12_rt.key().is_depth ? D3D12_RESOURCE_STATE_DEPTH_WRITE\n                                       : D3D12_RESOURCE_STATE_RENDER_TARGET;\n      command_processor_.PushTransitionBarrier(\n          dest_d3d12_rt.resource(), dest_d3d12_rt.SetResourceState(dest_state),\n          dest_state);\n    }\n  }\n  if (host_depth_store_set_up) {\n    // Will be reading copied host depth from the EDRAM buffer.\n    TransitionEdramBuffer(D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);\n  }\n\n  // Copy source descriptors to the shader-visible heap.\n  // Clear previously set shader-visible descriptor indices.\n  for (uint32_t i = 0; i < render_target_count; ++i) {\n    RenderTarget* dest_rt = render_targets[i];\n    if (!dest_rt) {\n      continue;\n    }\n    for (const Transfer& transfer : render_target_transfers[i]) {\n      assert_not_null(transfer.source);\n      auto& source_d3d12_rt = *static_cast<D3D12RenderTarget*>(transfer.source);\n      source_d3d12_rt.SetTemporarySRVDescriptorIndex(UINT32_MAX);\n      source_d3d12_rt.SetTemporarySRVDescriptorIndexStencil(UINT32_MAX);\n      auto* host_depth_source_d3d12_rt =\n          static_cast<D3D12RenderTarget*>(transfer.host_depth_source);\n      if (host_depth_source_d3d12_rt) {\n        host_depth_source_d3d12_rt->SetTemporarySRVDescriptorIndex(UINT32_MAX);\n        host_depth_source_d3d12_rt->SetTemporarySRVDescriptorIndexStencil(\n            UINT32_MAX);\n      }\n    }\n  }\n  current_temporary_descriptors_cpu_.clear();\n  uint32_t host_depth_copy_srv_index;\n  if (host_depth_store_set_up && !bindless_resources_used_) {\n    host_depth_copy_srv_index =\n        uint32_t(current_temporary_descriptors_cpu_.size());\n    current_temporary_descriptors_cpu_.push_back(provider.OffsetViewDescriptor(\n        edram_buffer_descriptor_heap_start_,\n        uint32_t(EdramBufferDescriptorIndex::kR32UintSRV)));\n  } else {\n    host_depth_copy_srv_index = UINT32_MAX;\n  }\n  for (uint32_t i = 0; i < render_target_count; ++i) {\n    RenderTarget* dest_rt = render_targets[i];\n    if (!dest_rt) {\n      continue;\n    }\n    bool dest_is_depth = dest_rt->key().is_depth;\n    for (const Transfer& transfer : render_target_transfers[i]) {\n      assert_not_null(transfer.source);\n      auto& source_d3d12_rt = *static_cast<D3D12RenderTarget*>(transfer.source);\n      if (source_d3d12_rt.temporary_srv_descriptor_index() == UINT32_MAX) {\n        source_d3d12_rt.SetTemporarySRVDescriptorIndex(\n            uint32_t(current_temporary_descriptors_cpu_.size()));\n        current_temporary_descriptors_cpu_.push_back(\n            source_d3d12_rt.descriptor_srv().GetHandle());\n      }\n      if (source_d3d12_rt.key().is_depth &&\n          source_d3d12_rt.temporary_srv_descriptor_index_stencil() ==\n              UINT32_MAX) {\n        source_d3d12_rt.SetTemporarySRVDescriptorIndexStencil(\n            uint32_t(current_temporary_descriptors_cpu_.size()));\n        current_temporary_descriptors_cpu_.push_back(\n            source_d3d12_rt.descriptor_srv_stencil().GetHandle());\n      }\n      bool source_is_depth = source_d3d12_rt.key().is_depth;\n      auto* host_depth_source_d3d12_rt =\n          static_cast<D3D12RenderTarget*>(transfer.host_depth_source);\n      // The host_depth_source_d3d12_rt == dest_rt case would use the EDRAM\n      // buffer instead.\n      if (host_depth_source_d3d12_rt && host_depth_source_d3d12_rt != dest_rt &&\n          host_depth_source_d3d12_rt->temporary_srv_descriptor_index() ==\n              UINT32_MAX) {\n        host_depth_source_d3d12_rt->SetTemporarySRVDescriptorIndex(\n            uint32_t(current_temporary_descriptors_cpu_.size()));\n        current_temporary_descriptors_cpu_.push_back(\n            host_depth_source_d3d12_rt->descriptor_srv().GetHandle());\n      }\n    }\n  }\n  uint32_t descriptor_count =\n      uint32_t(current_temporary_descriptors_cpu_.size());\n  current_temporary_descriptors_gpu_.resize(descriptor_count);\n  if (!command_processor_.RequestOneUseSingleViewDescriptors(\n          descriptor_count, current_temporary_descriptors_gpu_.data())) {\n    return;\n  }\n  for (uint32_t i = 0; i < descriptor_count; ++i) {\n    device->CopyDescriptorsSimple(1,\n                                  current_temporary_descriptors_gpu_[i].first,\n                                  current_temporary_descriptors_cpu_[i],\n                                  D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);\n  }\n\n  // Perform the transfers and clears.\n\n  bool transfer_viewport_set = false;\n  float pixels_to_ndc_unscaled =\n      2.0f / float(D3D12_REQ_TEXTURE2D_U_OR_V_DIMENSION);\n  float pixels_to_ndc_x = pixels_to_ndc_unscaled * draw_resolution_scale_x();\n  float pixels_to_ndc_y = pixels_to_ndc_unscaled * draw_resolution_scale_y();\n\n  TransferRootSignatureIndex last_transfer_root_signature_index =\n      TransferRootSignatureIndex::kCount;\n  uint32_t transfer_root_parameters_set = 0;\n  uint32_t last_descriptor_index_color = UINT32_MAX;\n  uint32_t last_descriptor_index_depth = UINT32_MAX;\n  uint32_t last_descriptor_index_stencil = UINT32_MAX;\n  uint32_t last_descriptor_index_host_depth_non_copy = UINT32_MAX;\n  bool last_descriptor_host_depth_is_copy = false;\n  TransferAddressConstant last_address_constant;\n  TransferAddressConstant last_host_depth_address_constant;\n\n  for (uint32_t i = 0; i < render_target_count; ++i) {\n    RenderTarget* dest_rt = render_targets[i];\n    if (!dest_rt) {\n      continue;\n    }\n\n    const std::vector<Transfer>& current_transfers = render_target_transfers[i];\n    if (current_transfers.empty() && !resolve_clear_needed) {\n      continue;\n    }\n\n    auto& dest_d3d12_rt = *static_cast<D3D12RenderTarget*>(dest_rt);\n    RenderTargetKey dest_rt_key = dest_d3d12_rt.key();\n\n    // Late barrier in case there was cross-copying that prevented merging of\n    // barriers.\n    D3D12_RESOURCE_STATES dest_state = dest_rt_key.is_depth\n                                           ? D3D12_RESOURCE_STATE_DEPTH_WRITE\n                                           : D3D12_RESOURCE_STATE_RENDER_TARGET;\n    command_processor_.PushTransitionBarrier(\n        dest_d3d12_rt.resource(), dest_d3d12_rt.SetResourceState(dest_state),\n        dest_state);\n\n    if (!current_transfers.empty()) {\n      are_current_command_list_render_targets_valid_ = false;\n      if (dest_rt_key.is_depth) {\n        command_list.D3DOMSetRenderTargets(\n            0, nullptr, FALSE, &dest_d3d12_rt.descriptor_draw().GetHandle());\n        if (!use_stencil_reference_output_) {\n          command_processor_.SetStencilReference(UINT8_MAX);\n        }\n      } else {\n        command_list.D3DOMSetRenderTargets(\n            1,\n            &(dest_d3d12_rt.descriptor_load_separate().IsValid()\n                  ? dest_d3d12_rt.descriptor_load_separate().GetHandle()\n                  : dest_d3d12_rt.descriptor_draw().GetHandle()),\n            FALSE, nullptr);\n      }\n\n      uint32_t dest_pitch_tiles = dest_rt_key.GetPitchTiles();\n      bool dest_is_64bpp = dest_rt_key.Is64bpp();\n\n      // Gather shader keys and sort to reduce pipeline state and binding\n      // switches. Also gather stencil rectangles to clear if needed.\n      bool need_stencil_bit_draws =\n          dest_rt_key.is_depth && !use_stencil_reference_output_;\n      current_transfer_invocations_.clear();\n      current_transfer_invocations_.reserve(\n          current_transfers.size() << uint32_t(need_stencil_bit_draws));\n      uint32_t rt_sort_index = 0;\n      TransferShaderKey new_transfer_shader_key;\n      new_transfer_shader_key.dest_msaa_samples = dest_rt_key.msaa_samples;\n      new_transfer_shader_key.dest_resource_format =\n          dest_rt_key.resource_format;\n      uint32_t stencil_clear_rectangle_count = 0;\n      for (uint32_t j = 0; j <= uint32_t(need_stencil_bit_draws); ++j) {\n        // j == 0 - color or depth.\n        // j == 1 - stencil bits.\n        // Stencil bit writing always requires a different root signature,\n        // handle these separately. Stencil never has a host depth source.\n        // Clear previously set sort indices.\n        for (const Transfer& transfer : current_transfers) {\n          auto* host_depth_source_d3d12_rt =\n              static_cast<D3D12RenderTarget*>(transfer.host_depth_source);\n          if (host_depth_source_d3d12_rt) {\n            host_depth_source_d3d12_rt->SetTemporarySortIndex(UINT32_MAX);\n          }\n          assert_not_null(transfer.source);\n          auto& source_d3d12_rt =\n              *static_cast<D3D12RenderTarget*>(transfer.source);\n          source_d3d12_rt.SetTemporarySortIndex(UINT32_MAX);\n        }\n        for (const Transfer& transfer : current_transfers) {\n          assert_not_null(transfer.source);\n          auto& source_d3d12_rt =\n              *static_cast<D3D12RenderTarget*>(transfer.source);\n          D3D12RenderTarget* host_depth_source_d3d12_rt =\n              j ? nullptr\n                : static_cast<D3D12RenderTarget*>(transfer.host_depth_source);\n          if (host_depth_source_d3d12_rt &&\n              host_depth_source_d3d12_rt->temporary_sort_index() ==\n                  UINT32_MAX) {\n            host_depth_source_d3d12_rt->SetTemporarySortIndex(rt_sort_index++);\n          }\n          if (source_d3d12_rt.temporary_sort_index() == UINT32_MAX) {\n            source_d3d12_rt.SetTemporarySortIndex(rt_sort_index++);\n          }\n          RenderTargetKey source_rt_key = source_d3d12_rt.key();\n          new_transfer_shader_key.source_msaa_samples =\n              source_rt_key.msaa_samples;\n          new_transfer_shader_key.source_resource_format =\n              source_rt_key.resource_format;\n          bool host_depth_source_is_copy =\n              host_depth_source_d3d12_rt == &dest_d3d12_rt;\n          new_transfer_shader_key.host_depth_source_is_copy =\n              host_depth_source_is_copy;\n          // The host depth copy buffer has only raw samples.\n          new_transfer_shader_key.host_depth_source_msaa_samples =\n              (host_depth_source_d3d12_rt && !host_depth_source_is_copy)\n                  ? host_depth_source_d3d12_rt->key().msaa_samples\n                  : xenos::MsaaSamples::k1X;\n          if (j) {\n            new_transfer_shader_key.mode =\n                source_rt_key.is_depth ? TransferMode::kDepthToStencilBit\n                                       : TransferMode::kColorToStencilBit;\n            stencil_clear_rectangle_count +=\n                transfer.GetRectangles(dest_rt_key.base_tiles, dest_pitch_tiles,\n                                       dest_rt_key.msaa_samples, dest_is_64bpp,\n                                       nullptr, resolve_clear_rectangle);\n          } else {\n            if (dest_rt_key.is_depth) {\n              if (host_depth_source_d3d12_rt) {\n                new_transfer_shader_key.mode =\n                    source_rt_key.is_depth\n                        ? TransferMode::kDepthAndHostDepthToDepth\n                        : TransferMode::kColorAndHostDepthToDepth;\n              } else {\n                new_transfer_shader_key.mode =\n                    source_rt_key.is_depth ? TransferMode::kDepthToDepth\n                                           : TransferMode::kColorToDepth;\n              }\n            } else {\n              new_transfer_shader_key.mode = source_rt_key.is_depth\n                                                 ? TransferMode::kDepthToColor\n                                                 : TransferMode::kColorToColor;\n            }\n          }\n          current_transfer_invocations_.emplace_back(transfer,\n                                                     new_transfer_shader_key);\n          if (j) {\n            current_transfer_invocations_.back().transfer.host_depth_source =\n                nullptr;\n          }\n        }\n      }\n      std::sort(current_transfer_invocations_.begin(),\n                current_transfer_invocations_.end());\n\n      // Clear the stencil to 0 where it will be loaded - will be setting the\n      // bits that need to be 1 by discarding samples. Clearing everything here\n      // to reduce context switches internally in the driver if clear causes\n      // them.\n      if (stencil_clear_rectangle_count) {\n        command_processor_.SubmitBarriers();\n        D3D12_RECT* stencil_clear_rect_write_ptr =\n            command_list.ClearDepthStencilViewAllocatedRects(\n                dest_d3d12_rt.descriptor_draw().GetHandle(),\n                D3D12_CLEAR_FLAG_STENCIL, 0.0f, 0,\n                stencil_clear_rectangle_count);\n        assert_not_null(stencil_clear_rect_write_ptr);\n        for (const Transfer& transfer : current_transfers) {\n          Transfer::Rectangle transfer_stencil_clear_rectangles\n              [Transfer::kMaxRectanglesWithCutout];\n          uint32_t transfer_stencil_clear_rectangle_count =\n              transfer.GetRectangles(dest_rt_key.base_tiles, dest_pitch_tiles,\n                                     dest_rt_key.msaa_samples, dest_is_64bpp,\n                                     transfer_stencil_clear_rectangles,\n                                     resolve_clear_rectangle);\n          for (uint32_t j = 0; j < transfer_stencil_clear_rectangle_count;\n               ++j) {\n            const Transfer::Rectangle& stencil_clear_rectangle =\n                transfer_stencil_clear_rectangles[j];\n            stencil_clear_rect_write_ptr->left = LONG(\n                stencil_clear_rectangle.x_pixels * draw_resolution_scale_x());\n            stencil_clear_rect_write_ptr->top = LONG(\n                stencil_clear_rectangle.y_pixels * draw_resolution_scale_y());\n            stencil_clear_rect_write_ptr->right =\n                LONG((stencil_clear_rectangle.x_pixels +\n                      stencil_clear_rectangle.width_pixels) *\n                     draw_resolution_scale_x());\n            stencil_clear_rect_write_ptr->bottom =\n                LONG((stencil_clear_rectangle.y_pixels +\n                      stencil_clear_rectangle.height_pixels) *\n                     draw_resolution_scale_y());\n            ++stencil_clear_rect_write_ptr;\n          }\n        }\n      }\n\n      // Perform the transfers for the render target.\n\n      if (!transfer_viewport_set) {\n        transfer_viewport_set = true;\n        // Will be passing NDC directly, set the viewport to the maximum host\n        // render target size for simplicity. Using a power-of-two scale for\n        // exact pixel coordinates.\n        D3D12_VIEWPORT transfer_viewport;\n        transfer_viewport.TopLeftX = 0.0f;\n        transfer_viewport.TopLeftY = 0.0f;\n        transfer_viewport.Width = float(D3D12_REQ_TEXTURE2D_U_OR_V_DIMENSION);\n        transfer_viewport.Height = float(D3D12_REQ_TEXTURE2D_U_OR_V_DIMENSION);\n        transfer_viewport.MinDepth = 0.0f;\n        transfer_viewport.MaxDepth = 1.0f;\n        command_processor_.SetViewport(transfer_viewport);\n        // TODO(Triang3l): Reduce scissor to the smallest transfer region for\n        // more tiling friendliness.\n        D3D12_RECT transfer_scissor;\n        transfer_scissor.left = 0;\n        transfer_scissor.top = 0;\n        transfer_scissor.right = LONG(D3D12_REQ_TEXTURE2D_U_OR_V_DIMENSION);\n        transfer_scissor.bottom = LONG(D3D12_REQ_TEXTURE2D_U_OR_V_DIMENSION);\n        command_processor_.SetScissorRect(transfer_scissor);\n      }\n\n      for (auto it = current_transfer_invocations_.cbegin();\n           it != current_transfer_invocations_.cend(); ++it) {\n        const TransferInvocation& transfer_invocation_first = *it;\n        // Will be merging transfers from the same source into one mesh.\n        auto it_merged_first = it, it_merged_last = it;\n        uint32_t transfer_rectangle_count =\n            transfer_invocation_first.transfer.GetRectangles(\n                dest_rt_key.base_tiles, dest_pitch_tiles,\n                dest_rt_key.msaa_samples, dest_is_64bpp, nullptr,\n                resolve_clear_rectangle);\n        for (auto it_merge = std::next(it_merged_first);\n             it_merge != current_transfer_invocations_.cend(); ++it_merge) {\n          if (!transfer_invocation_first.CanBeMergedIntoOneDraw(*it_merge)) {\n            break;\n          }\n          transfer_rectangle_count += it_merge->transfer.GetRectangles(\n              dest_rt_key.base_tiles, dest_pitch_tiles,\n              dest_rt_key.msaa_samples, dest_is_64bpp, nullptr,\n              resolve_clear_rectangle);\n          it_merged_last = it_merge;\n        }\n        assert_not_zero(transfer_rectangle_count);\n        // Skip the merged transfers in the subsequent iterations.\n        it = it_merged_last;\n\n        assert_not_null(it->transfer.source);\n        auto& source_d3d12_rt =\n            *static_cast<D3D12RenderTarget*>(it->transfer.source);\n        auto* host_depth_source_d3d12_rt =\n            static_cast<D3D12RenderTarget*>(it->transfer.host_depth_source);\n        TransferShaderKey transfer_shader_key = it->shader_key;\n        const TransferModeInfo& transfer_mode_info =\n            kTransferModes[size_t(transfer_shader_key.mode)];\n        TransferRootSignatureIndex transfer_root_signature_index =\n            use_stencil_reference_output_\n                ? transfer_mode_info.root_signature_with_stencil_ref\n                : transfer_mode_info.root_signature_no_stencil_ref;\n        uint32_t transfer_root_parameters_used =\n            kTransferUsedRootParameters[size_t(transfer_root_signature_index)];\n        bool is_stencil_bit =\n            (transfer_root_parameters_used &\n             kTransferUsedRootParameterStencilMaskConstantBit) != 0;\n\n        // Late barriers in case there was cross-copying that prevented merging\n        // of barriers.\n        command_processor_.PushTransitionBarrier(\n            source_d3d12_rt.resource(),\n            source_d3d12_rt.SetResourceState(\n                D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE),\n            D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);\n        if (host_depth_source_d3d12_rt) {\n          if (transfer_shader_key.host_depth_source_is_copy) {\n            // Reading copied host depth from the EDRAM buffer.\n            TransitionEdramBuffer(D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);\n          } else {\n            // Reading host depth from the texture.\n            command_processor_.PushTransitionBarrier(\n                host_depth_source_d3d12_rt->resource(),\n                host_depth_source_d3d12_rt->SetResourceState(\n                    D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE),\n                D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);\n          }\n        }\n\n        uint32_t transfer_vertex_count = 6 * transfer_rectangle_count;\n        D3D12_VERTEX_BUFFER_VIEW transfer_rectangle_buffer_view;\n        transfer_rectangle_buffer_view.StrideInBytes = sizeof(float) * 2;\n        transfer_rectangle_buffer_view.SizeInBytes =\n            transfer_rectangle_buffer_view.StrideInBytes *\n            transfer_vertex_count;\n        float* transfer_rectangle_write_ptr =\n            reinterpret_cast<float*>(transfer_vertex_buffer_pool_->Request(\n                current_submission, transfer_rectangle_buffer_view.SizeInBytes,\n                sizeof(float), nullptr, nullptr,\n                &transfer_rectangle_buffer_view.BufferLocation));\n        if (!transfer_rectangle_write_ptr) {\n          continue;\n        }\n        for (auto it_merged = it_merged_first; it_merged <= it_merged_last;\n             ++it_merged) {\n          Transfer::Rectangle transfer_invocation_rectangles\n              [Transfer::kMaxRectanglesWithCutout];\n          uint32_t transfer_invocation_rectangle_count =\n              it_merged->transfer.GetRectangles(\n                  dest_rt_key.base_tiles, dest_pitch_tiles,\n                  dest_rt_key.msaa_samples, dest_is_64bpp,\n                  transfer_invocation_rectangles, resolve_clear_rectangle);\n          assert_not_zero(transfer_invocation_rectangle_count);\n          for (uint32_t j = 0; j < transfer_invocation_rectangle_count; ++j) {\n            const Transfer::Rectangle& transfer_rectangle =\n                transfer_invocation_rectangles[j];\n            float transfer_rectangle_x0 =\n                -1.0f + transfer_rectangle.x_pixels * pixels_to_ndc_x;\n            float transfer_rectangle_y0 =\n                1.0f - transfer_rectangle.y_pixels * pixels_to_ndc_y;\n            float transfer_rectangle_x1 =\n                transfer_rectangle_x0 +\n                transfer_rectangle.width_pixels * pixels_to_ndc_x;\n            float transfer_rectangle_y1 =\n                transfer_rectangle_y0 -\n                transfer_rectangle.height_pixels * pixels_to_ndc_y;\n            // O-*\n            // |/\n            // *\n            *(transfer_rectangle_write_ptr++) = transfer_rectangle_x0;\n            *(transfer_rectangle_write_ptr++) = transfer_rectangle_y0;\n            // *-O\n            // |/\n            // *\n            *(transfer_rectangle_write_ptr++) = transfer_rectangle_x1;\n            *(transfer_rectangle_write_ptr++) = transfer_rectangle_y0;\n            // *-*\n            // |/\n            // O\n            *(transfer_rectangle_write_ptr++) = transfer_rectangle_x0;\n            *(transfer_rectangle_write_ptr++) = transfer_rectangle_y1;\n            //   *\n            //  /|\n            // O-*\n            *(transfer_rectangle_write_ptr++) = transfer_rectangle_x0;\n            *(transfer_rectangle_write_ptr++) = transfer_rectangle_y1;\n            //   O\n            //  /|\n            // *-*\n            *(transfer_rectangle_write_ptr++) = transfer_rectangle_x1;\n            *(transfer_rectangle_write_ptr++) = transfer_rectangle_y0;\n            //   *\n            //  /|\n            // *-O\n            *(transfer_rectangle_write_ptr++) = transfer_rectangle_x1;\n            *(transfer_rectangle_write_ptr++) = transfer_rectangle_y1;\n          }\n        }\n        command_processor_.SetPrimitiveTopology(\n            D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST);\n        command_list.D3DIASetVertexBuffers(0, 1,\n                                           &transfer_rectangle_buffer_view);\n\n        ID3D12PipelineState* const* transfer_pipelines =\n            GetOrCreateTransferPipelines(transfer_shader_key);\n        if (!transfer_pipelines) {\n          continue;\n        }\n        if (last_transfer_root_signature_index !=\n            transfer_root_signature_index) {\n          last_transfer_root_signature_index = transfer_root_signature_index;\n          command_processor_.SetExternalGraphicsRootSignature(\n              transfer_root_signatures_[size_t(transfer_root_signature_index)]);\n          transfer_root_parameters_set = 0;\n        }\n\n        // Invalidate outdated bindings.\n        if (transfer_root_parameters_used &\n            kTransferUsedRootParameterColorSRVBit) {\n          uint32_t descriptor_index_color =\n              source_d3d12_rt.temporary_srv_descriptor_index();\n          assert_true(descriptor_index_color != UINT32_MAX);\n          if (last_descriptor_index_color != descriptor_index_color) {\n            last_descriptor_index_color = descriptor_index_color;\n            transfer_root_parameters_set &=\n                ~kTransferUsedRootParameterColorSRVBit;\n          }\n        }\n        if (transfer_root_parameters_used &\n            kTransferUsedRootParameterDepthSRVBit) {\n          uint32_t descriptor_index_depth =\n              source_d3d12_rt.temporary_srv_descriptor_index();\n          assert_true(descriptor_index_depth != UINT32_MAX);\n          if (last_descriptor_index_depth != descriptor_index_depth) {\n            last_descriptor_index_depth = descriptor_index_depth;\n            transfer_root_parameters_set &=\n                ~kTransferUsedRootParameterDepthSRVBit;\n          }\n        }\n        if (transfer_root_parameters_used &\n            kTransferUsedRootParameterStencilSRVBit) {\n          uint32_t descriptor_index_stencil =\n              source_d3d12_rt.temporary_srv_descriptor_index_stencil();\n          assert_true(descriptor_index_stencil != UINT32_MAX);\n          if (last_descriptor_index_stencil != descriptor_index_stencil) {\n            last_descriptor_index_stencil = descriptor_index_stencil;\n            transfer_root_parameters_set &=\n                ~kTransferUsedRootParameterStencilSRVBit;\n          }\n        }\n        if (transfer_root_parameters_used &\n            kTransferUsedRootParameterHostDepthSRVBit) {\n          if (transfer_shader_key.host_depth_source_is_copy) {\n            if (!last_descriptor_host_depth_is_copy) {\n              last_descriptor_host_depth_is_copy = true;\n              transfer_root_parameters_set &=\n                  ~kTransferUsedRootParameterHostDepthSRVBit;\n            }\n          } else {\n            assert_not_null(host_depth_source_d3d12_rt);\n            uint32_t descriptor_index_host_depth =\n                host_depth_source_d3d12_rt->temporary_srv_descriptor_index();\n            assert_true(descriptor_index_host_depth != UINT32_MAX);\n            if (last_descriptor_host_depth_is_copy ||\n                last_descriptor_index_host_depth_non_copy !=\n                    descriptor_index_host_depth) {\n              transfer_root_parameters_set &=\n                  ~kTransferUsedRootParameterHostDepthSRVBit;\n            }\n            last_descriptor_host_depth_is_copy = false;\n            last_descriptor_index_host_depth_non_copy =\n                descriptor_index_host_depth;\n          }\n        }\n        if (transfer_root_parameters_used &\n            kTransferUsedRootParameterAddressConstantBit) {\n          RenderTargetKey source_rt_key = source_d3d12_rt.key();\n          TransferAddressConstant address_constant;\n          address_constant.dest_pitch = dest_pitch_tiles;\n          address_constant.source_pitch = source_rt_key.GetPitchTiles();\n          address_constant.source_to_dest = int32_t(dest_rt_key.base_tiles) -\n                                            int32_t(source_rt_key.base_tiles);\n          if (last_address_constant != address_constant) {\n            last_address_constant = address_constant;\n            transfer_root_parameters_set &=\n                ~kTransferUsedRootParameterAddressConstantBit;\n          }\n        }\n        if (transfer_root_parameters_used &\n            kTransferUsedRootParameterHostDepthAddressConstantBit) {\n          assert_not_null(host_depth_source_d3d12_rt);\n          RenderTargetKey host_depth_source_rt_key =\n              host_depth_source_d3d12_rt->key();\n          TransferAddressConstant host_depth_address_constant;\n          host_depth_address_constant.dest_pitch = dest_pitch_tiles;\n          host_depth_address_constant.source_pitch =\n              host_depth_source_rt_key.GetPitchTiles();\n          host_depth_address_constant.source_to_dest =\n              int32_t(dest_rt_key.base_tiles) -\n              int32_t(host_depth_source_rt_key.base_tiles);\n          if (last_host_depth_address_constant != host_depth_address_constant) {\n            last_host_depth_address_constant = host_depth_address_constant;\n            transfer_root_parameters_set &=\n                ~kTransferUsedRootParameterHostDepthAddressConstantBit;\n          }\n        }\n\n        // Apply the new bindings.\n        uint32_t transfer_root_parameters_unset =\n            transfer_root_parameters_used & ~transfer_root_parameters_set;\n        if (transfer_root_parameters_unset &\n            kTransferUsedRootParameterHostDepthAddressConstantBit) {\n          command_list.D3DSetGraphicsRoot32BitConstants(\n              xe::bit_count(\n                  transfer_root_parameters_used &\n                  (kTransferUsedRootParameterHostDepthAddressConstantBit - 1)),\n              sizeof(last_host_depth_address_constant) / sizeof(uint32_t),\n              &last_host_depth_address_constant, 0);\n          transfer_root_parameters_set |=\n              kTransferUsedRootParameterHostDepthAddressConstantBit;\n        }\n        if (transfer_root_parameters_unset &\n            kTransferUsedRootParameterHostDepthSRVBit) {\n          D3D12_GPU_DESCRIPTOR_HANDLE descriptor_gpu_handle;\n          if (last_descriptor_host_depth_is_copy) {\n            if (bindless_resources_used_) {\n              descriptor_gpu_handle =\n                  command_processor_\n                      .GetSystemBindlessViewHandlePair(\n                          D3D12CommandProcessor::SystemBindlessView ::\n                              kEdramR32UintSRV)\n                      .second;\n            } else {\n              assert_true(host_depth_copy_srv_index != UINT32_MAX);\n              descriptor_gpu_handle =\n                  current_temporary_descriptors_gpu_[host_depth_copy_srv_index]\n                      .second;\n            }\n          } else {\n            assert_true(last_descriptor_index_host_depth_non_copy !=\n                        UINT32_MAX);\n            descriptor_gpu_handle =\n                current_temporary_descriptors_gpu_\n                    [last_descriptor_index_host_depth_non_copy]\n                        .second;\n          }\n          command_list.D3DSetGraphicsRootDescriptorTable(\n              xe::bit_count(transfer_root_parameters_used &\n                            (kTransferUsedRootParameterHostDepthSRVBit - 1)),\n              descriptor_gpu_handle);\n          transfer_root_parameters_set |=\n              kTransferUsedRootParameterHostDepthSRVBit;\n        }\n        if (transfer_root_parameters_unset &\n            kTransferUsedRootParameterAddressConstantBit) {\n          command_list.D3DSetGraphicsRoot32BitConstants(\n              xe::bit_count(transfer_root_parameters_used &\n                            (kTransferUsedRootParameterAddressConstantBit - 1)),\n              sizeof(last_address_constant) / sizeof(uint32_t),\n              &last_address_constant, 0);\n          transfer_root_parameters_set |=\n              kTransferUsedRootParameterAddressConstantBit;\n        }\n        if (transfer_root_parameters_unset &\n            kTransferUsedRootParameterStencilSRVBit) {\n          assert_true(last_descriptor_index_stencil != UINT32_MAX);\n          command_list.D3DSetGraphicsRootDescriptorTable(\n              xe::bit_count(transfer_root_parameters_used &\n                            (kTransferUsedRootParameterStencilSRVBit - 1)),\n              current_temporary_descriptors_gpu_[last_descriptor_index_stencil]\n                  .second);\n          transfer_root_parameters_set |=\n              kTransferUsedRootParameterStencilSRVBit;\n        }\n        if (transfer_root_parameters_unset &\n            kTransferUsedRootParameterDepthSRVBit) {\n          assert_true(last_descriptor_index_depth != UINT32_MAX);\n          command_list.D3DSetGraphicsRootDescriptorTable(\n              xe::bit_count(transfer_root_parameters_used &\n                            (kTransferUsedRootParameterDepthSRVBit - 1)),\n              current_temporary_descriptors_gpu_[last_descriptor_index_depth]\n                  .second);\n          transfer_root_parameters_set |= kTransferUsedRootParameterDepthSRVBit;\n        }\n        if (transfer_root_parameters_unset &\n            kTransferUsedRootParameterColorSRVBit) {\n          assert_true(last_descriptor_index_color != UINT32_MAX);\n          command_list.D3DSetGraphicsRootDescriptorTable(\n              xe::bit_count(transfer_root_parameters_used &\n                            (kTransferUsedRootParameterColorSRVBit - 1)),\n              current_temporary_descriptors_gpu_[last_descriptor_index_color]\n                  .second);\n          transfer_root_parameters_set |= kTransferUsedRootParameterColorSRVBit;\n        }\n\n        // Draw the transfer rectangles.\n        command_processor_.SubmitBarriers();\n        for (uint32_t j = 0; j <= uint32_t(is_stencil_bit) * 7; ++j) {\n          if (is_stencil_bit) {\n            uint32_t transfer_stencil_bit = uint32_t(1) << j;\n            command_list.D3DSetGraphicsRoot32BitConstants(\n                xe::bit_count(\n                    transfer_root_parameters_used &\n                    (kTransferUsedRootParameterStencilMaskConstantBit - 1)),\n                sizeof(transfer_stencil_bit) / sizeof(uint32_t),\n                &transfer_stencil_bit, 0);\n          }\n          command_processor_.SetExternalPipeline(transfer_pipelines[j]);\n          command_list.D3DDrawInstanced(transfer_vertex_count, 1, 0, 0);\n        }\n      }\n    }\n\n    // Perform the clear.\n    if (resolve_clear_needed) {\n      uint64_t clear_value = render_target_resolve_clear_values[i];\n      if (dest_rt_key.is_depth) {\n        uint32_t depth_guest_clear_value =\n            (uint32_t(clear_value) >> 8) & 0xFFFFFF;\n        float depth_host_clear_value = 0.0f;\n        switch (dest_rt_key.GetDepthFormat()) {\n          case xenos::DepthRenderTargetFormat::kD24S8:\n            depth_host_clear_value =\n                xenos::UNorm24To32(depth_guest_clear_value);\n            break;\n          case xenos::DepthRenderTargetFormat::kD24FS8:\n            // Taking [0, 2) -> [0, 1) remapping into account.\n            depth_host_clear_value =\n                xenos::Float20e4To32(depth_guest_clear_value) * 0.5f;\n            break;\n        }\n        command_processor_.PushTransitionBarrier(\n            dest_d3d12_rt.resource(),\n            dest_d3d12_rt.SetResourceState(D3D12_RESOURCE_STATE_DEPTH_WRITE),\n            D3D12_RESOURCE_STATE_DEPTH_WRITE);\n        command_processor_.SubmitBarriers();\n        command_list.D3DClearDepthStencilView(\n            dest_d3d12_rt.descriptor_draw().GetHandle(),\n            D3D12_CLEAR_FLAG_DEPTH | D3D12_CLEAR_FLAG_STENCIL,\n            depth_host_clear_value, UINT(clear_value) & 0xFF, 1, &clear_rect);\n      } else {\n        float color_clear_value[4] = {};\n        bool clear_via_drawing = false;\n        switch (dest_rt_key.GetColorFormat()) {\n          case xenos::ColorRenderTargetFormat::k_8_8_8_8: {\n            for (uint32_t j = 0; j < 4; ++j) {\n              color_clear_value[j] =\n                  ((clear_value >> (j * 8)) & 0xFF) * (1.0f / 0xFF);\n            }\n          } break;\n          case xenos::ColorRenderTargetFormat::k_8_8_8_8_GAMMA: {\n            // 8_8_8_8_GAMMA is represented by linear stored in\n            // R16G16B16A16_UNORM.\n            for (uint32_t j = 0; j < 4; ++j) {\n              color_clear_value[j] =\n                  ((clear_value >> (j * 8)) & 0xFF) * (1.0f / 0xFF);\n            }\n            for (uint32_t j = 0; j < 3; ++j) {\n              color_clear_value[j] =\n                  xenos::PWLGammaToLinear(color_clear_value[j]);\n            }\n          } break;\n          case xenos::ColorRenderTargetFormat::k_2_10_10_10:\n          case xenos::ColorRenderTargetFormat::k_2_10_10_10_AS_10_10_10_10: {\n            for (uint32_t j = 0; j < 3; ++j) {\n              color_clear_value[j] =\n                  ((clear_value >> (j * 10)) & 0x3FF) * (1.0f / 0x3FF);\n            }\n            color_clear_value[3] = ((clear_value >> 30) & 0x3) * (1.0f / 0x3);\n          } break;\n          case xenos::ColorRenderTargetFormat::k_2_10_10_10_FLOAT:\n          case xenos::ColorRenderTargetFormat::\n              k_2_10_10_10_FLOAT_AS_16_16_16_16: {\n            for (uint32_t j = 0; j < 3; ++j) {\n              color_clear_value[j] =\n                  xenos::Float7e3To32((clear_value >> (j * 10)) & 0x3FF);\n            }\n            color_clear_value[3] = ((clear_value >> 30) & 0x3) * (1.0f / 0x3);\n          } break;\n          case xenos::ColorRenderTargetFormat::k_16_16:\n          case xenos::ColorRenderTargetFormat::k_16_16_FLOAT: {\n            // Using uint for loading both. Disregarding the current -32...32\n            // vs. -1...1 settings for consistency with color clear via depth\n            // aliasing.\n            for (uint32_t j = 0; j < 2; ++j) {\n              color_clear_value[j] = float((clear_value >> (j * 16)) & 0xFFFF);\n            }\n          } break;\n          case xenos::ColorRenderTargetFormat::k_16_16_16_16:\n          case xenos::ColorRenderTargetFormat::k_16_16_16_16_FLOAT: {\n            // Using uint for loading both. Disregarding the current -32...32\n            // vs. -1...1 settings for consistency with color clear via depth\n            // aliasing.\n            for (uint32_t j = 0; j < 4; ++j) {\n              color_clear_value[j] = float((clear_value >> (j * 16)) & 0xFFFF);\n            }\n          } break;\n          case xenos::ColorRenderTargetFormat::k_32_FLOAT: {\n            // Using uint for proper denormal and NaN handling.\n            color_clear_value[0] = float(uint32_t(clear_value));\n            // Numbers > 2^24 can't be represented with a step of 1 as floats,\n            // need to clear by drawing a uint rectangle.\n            if (uint64_t(color_clear_value[0]) != uint32_t(clear_value)) {\n              clear_via_drawing = true;\n            }\n          } break;\n          case xenos::ColorRenderTargetFormat::k_32_32_FLOAT: {\n            // Using uint for proper denormal and NaN handling.\n            color_clear_value[0] = float(uint32_t(clear_value));\n            color_clear_value[1] = float(uint32_t(clear_value >> 32));\n            // Numbers > 2^24 can't be represented with a step of 1 as floats,\n            // need to clear by drawing a uint rectangle.\n            if (uint64_t(color_clear_value[0]) != uint32_t(clear_value) ||\n                uint64_t(color_clear_value[1]) != uint32_t(clear_value >> 32)) {\n              clear_via_drawing = true;\n            }\n          } break;\n        }\n        command_processor_.PushTransitionBarrier(\n            dest_d3d12_rt.resource(),\n            dest_d3d12_rt.SetResourceState(D3D12_RESOURCE_STATE_RENDER_TARGET),\n            D3D12_RESOURCE_STATE_RENDER_TARGET);\n        if (clear_via_drawing) {\n          command_list.D3DOMSetRenderTargets(\n              1,\n              &(dest_d3d12_rt.descriptor_load_separate().IsValid()\n                    ? dest_d3d12_rt.descriptor_load_separate().GetHandle()\n                    : dest_d3d12_rt.descriptor_draw().GetHandle()),\n              FALSE, nullptr);\n          are_current_command_list_render_targets_valid_ = true;\n          D3D12_VIEWPORT clear_viewport;\n          clear_viewport.TopLeftX = float(clear_rect.left);\n          clear_viewport.TopLeftY = float(clear_rect.top);\n          clear_viewport.Width = float(clear_rect.right - clear_rect.left);\n          clear_viewport.Height = float(clear_rect.bottom - clear_rect.top);\n          clear_viewport.MinDepth = 0.0f;\n          clear_viewport.MaxDepth = 1.0f;\n          command_processor_.SetViewport(clear_viewport);\n          command_processor_.SetScissorRect(clear_rect);\n          command_processor_.SetExternalGraphicsRootSignature(\n              uint32_rtv_clear_root_signature_);\n          uint32_t clear_via_drawing_value[2] = {uint32_t(clear_value),\n                                                 uint32_t(clear_value >> 32)};\n          command_list.D3DSetGraphicsRoot32BitConstants(\n              0, 2, clear_via_drawing_value, 0);\n          command_processor_.SetExternalPipeline(\n              uint32_rtv_clear_pipelines_[size_t(\n                  dest_rt_key.GetColorFormat() ==\n                  xenos::ColorRenderTargetFormat::k_32_32_FLOAT)]\n                                         [size_t(dest_rt_key.msaa_samples)]);\n          command_processor_.SetPrimitiveTopology(\n              D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST);\n          command_list.D3DDrawInstanced(3, 1, 0, 0);\n        } else {\n          command_processor_.SubmitBarriers();\n          command_list.D3DClearRenderTargetView(\n              dest_d3d12_rt.descriptor_load_separate().IsValid()\n                  ? dest_d3d12_rt.descriptor_load_separate().GetHandle()\n                  : dest_d3d12_rt.descriptor_draw().GetHandle(),\n              color_clear_value, 1, &clear_rect);\n        }\n      }\n    }\n  }\n}\n\nvoid D3D12RenderTargetCache::SetCommandListRenderTargets(\n    RenderTarget* const* depth_and_color_render_targets) {\n  assert_true(GetPath() == Path::kHostRenderTargets);\n\n  // Ensure the render targets are in the needed resource state.\n  if (depth_and_color_render_targets[0]) {\n    auto& d3d12_rt =\n        *static_cast<D3D12RenderTarget*>(depth_and_color_render_targets[0]);\n    command_processor_.PushTransitionBarrier(\n        d3d12_rt.resource(),\n        d3d12_rt.SetResourceState(D3D12_RESOURCE_STATE_DEPTH_WRITE),\n        D3D12_RESOURCE_STATE_DEPTH_WRITE);\n  }\n  for (uint32_t i = 0; i < xenos::kMaxColorRenderTargets; ++i) {\n    RenderTarget* render_target = depth_and_color_render_targets[1 + i];\n    if (!render_target) {\n      continue;\n    }\n    auto& d3d12_rt = *static_cast<D3D12RenderTarget*>(render_target);\n    command_processor_.PushTransitionBarrier(\n        d3d12_rt.resource(),\n        d3d12_rt.SetResourceState(D3D12_RESOURCE_STATE_RENDER_TARGET),\n        D3D12_RESOURCE_STATE_RENDER_TARGET);\n  }\n\n  // Bind the render targets.\n  if (are_current_command_list_render_targets_valid_ &&\n      std::memcmp(current_command_list_render_targets_,\n                  depth_and_color_render_targets,\n                  sizeof(current_command_list_render_targets_))) {\n    are_current_command_list_render_targets_valid_ = false;\n  }\n  if (!are_current_command_list_render_targets_valid_) {\n    std::memcpy(current_command_list_render_targets_,\n                depth_and_color_render_targets,\n                sizeof(current_command_list_render_targets_));\n    D3D12_CPU_DESCRIPTOR_HANDLE dsv_handle;\n    if (depth_and_color_render_targets[0]) {\n      dsv_handle = static_cast<const D3D12RenderTarget*>(\n                       depth_and_color_render_targets[0])\n                       ->descriptor_draw()\n                       .GetHandle();\n    }\n    D3D12_CPU_DESCRIPTOR_HANDLE rtv_handles[xenos::kMaxColorRenderTargets];\n    uint32_t rtv_count = 0;\n    for (uint32_t i = 0; i < xenos::kMaxColorRenderTargets; ++i) {\n      const RenderTarget* render_target = depth_and_color_render_targets[1 + i];\n      if (!render_target) {\n        continue;\n      }\n      // Fill the gaps with a null descriptor.\n      while (rtv_count < i) {\n        rtv_handles[rtv_count++] =\n            render_target->key().msaa_samples != xenos::MsaaSamples::k1X\n                ? null_rtv_descriptor_ms_.GetHandle()\n                : null_rtv_descriptor_ss_.GetHandle();\n      }\n      auto& d3d12_rt = *static_cast<const D3D12RenderTarget*>(render_target);\n      rtv_handles[rtv_count++] = d3d12_rt.descriptor_draw().GetHandle();\n    }\n    command_processor_.GetDeferredCommandList().D3DOMSetRenderTargets(\n        rtv_count, rtv_handles, FALSE,\n        depth_and_color_render_targets[0] ? &dsv_handle : nullptr);\n    are_current_command_list_render_targets_valid_ = true;\n  }\n}\n\nID3D12PipelineState* D3D12RenderTargetCache::GetOrCreateDumpPipeline(\n    DumpPipelineKey key) {\n  auto pipeline_it = dump_pipelines_.find(key);\n  if (pipeline_it != dump_pipelines_.end()) {\n    return pipeline_it->second;\n  }\n\n  // Because of built_shader_.resize(), pointers can't be kept persistently\n  // here! Resizing also zeroes the memory.\n\n  built_shader_.clear();\n\n  // RDEF, ISGN, OSGN, SHEX, STAT.\n  constexpr uint32_t kBlobCount = 5;\n\n  // Allocate space for the container header and the blob offsets.\n  built_shader_.resize(sizeof(dxbc::ContainerHeader) / sizeof(uint32_t) +\n                       kBlobCount);\n  uint32_t blob_offset_position_dwords =\n      sizeof(dxbc::ContainerHeader) / sizeof(uint32_t);\n  uint32_t blob_position_dwords = uint32_t(built_shader_.size());\n  constexpr uint32_t kBlobHeaderSizeDwords =\n      sizeof(dxbc::BlobHeader) / sizeof(uint32_t);\n\n  uint32_t name_ptr;\n\n  // ***************************************************************************\n  // Resource definition\n  // ***************************************************************************\n\n  built_shader_[blob_offset_position_dwords] =\n      uint32_t(blob_position_dwords * sizeof(uint32_t));\n  uint32_t rdef_position_dwords = blob_position_dwords + kBlobHeaderSizeDwords;\n  // Not needed, as the next operation done is resize, to allocate the space for\n  // both the blob header and the resource definition header.\n  // built_shader_.resize(rdef_position_dwords);\n\n  // Allocate space for the RDEF header.\n  built_shader_.resize(rdef_position_dwords +\n                       sizeof(dxbc::RdefHeader) / sizeof(uint32_t));\n  // Generator name.\n  dxbc::AppendAlignedString(built_shader_, \"Xenia\");\n\n  // Constant types - uint (aka \"dword\" when it's scalar) only.\n  // Names.\n  name_ptr = uint32_t((built_shader_.size() - rdef_position_dwords) *\n                      sizeof(uint32_t));\n  uint32_t rdef_dword_name_ptr = name_ptr;\n  name_ptr += dxbc::AppendAlignedString(built_shader_, \"dword\");\n  // Types.\n  uint32_t rdef_type_uint_position_dwords = uint32_t(built_shader_.size());\n  uint32_t rdef_type_uint_ptr =\n      uint32_t((rdef_type_uint_position_dwords - rdef_position_dwords) *\n               sizeof(uint32_t));\n  built_shader_.resize(rdef_type_uint_position_dwords +\n                       sizeof(dxbc::RdefType) / sizeof(uint32_t));\n  {\n    auto& rdef_type_uint = *reinterpret_cast<dxbc::RdefType*>(\n        built_shader_.data() + rdef_type_uint_position_dwords);\n    rdef_type_uint.variable_class = dxbc::RdefVariableClass::kScalar;\n    rdef_type_uint.variable_type = dxbc::RdefVariableType::kUInt;\n    rdef_type_uint.row_count = 1;\n    rdef_type_uint.column_count = 1;\n    rdef_type_uint.name_ptr = rdef_dword_name_ptr;\n  }\n\n  // Constants:\n  // - uint xe_edram_dump_offsets\n  // - uint xe_edram_dump_pitches\n  enum Constant : uint32_t {\n    kConstantOffsets,\n    kConstantPitches,\n    kConstantCount,\n  };\n  // Names.\n  name_ptr = uint32_t((built_shader_.size() - rdef_position_dwords) *\n                      sizeof(uint32_t));\n  uint32_t rdef_xe_edram_dump_offsets_name_ptr = name_ptr;\n  name_ptr += dxbc::AppendAlignedString(built_shader_, \"xe_edram_dump_offsets\");\n  uint32_t rdef_xe_edram_dump_pitches_name_ptr = name_ptr;\n  name_ptr += dxbc::AppendAlignedString(built_shader_, \"xe_edram_dump_pitches\");\n  // Constants.\n  uint32_t rdef_constants_position_dwords = uint32_t(built_shader_.size());\n  uint32_t rdef_constants_ptr =\n      uint32_t((rdef_constants_position_dwords - rdef_position_dwords) *\n               sizeof(uint32_t));\n  built_shader_.resize(rdef_constants_position_dwords +\n                       sizeof(dxbc::RdefVariable) / sizeof(uint32_t) *\n                           kConstantCount);\n  {\n    auto rdef_constants = reinterpret_cast<dxbc::RdefVariable*>(\n        built_shader_.data() + rdef_constants_position_dwords);\n    // uint xe_edram_dump_offsets\n    dxbc::RdefVariable& rdef_constant_offsets =\n        rdef_constants[kConstantOffsets];\n    rdef_constant_offsets.name_ptr = rdef_xe_edram_dump_offsets_name_ptr;\n    rdef_constant_offsets.size_bytes = sizeof(uint32_t);\n    rdef_constant_offsets.flags = dxbc::kRdefVariableFlagUsed;\n    rdef_constant_offsets.type_ptr = rdef_type_uint_ptr;\n    rdef_constant_offsets.start_texture = UINT32_MAX;\n    rdef_constant_offsets.start_sampler = UINT32_MAX;\n    // uint xe_edram_dump_pitches\n    dxbc::RdefVariable& rdef_constant_pitches =\n        rdef_constants[kConstantPitches];\n    rdef_constant_pitches.name_ptr = rdef_xe_edram_dump_pitches_name_ptr;\n    rdef_constant_pitches.size_bytes = sizeof(uint32_t);\n    rdef_constant_pitches.flags = dxbc::kRdefVariableFlagUsed;\n    rdef_constant_pitches.type_ptr = rdef_type_uint_ptr;\n    rdef_constant_pitches.start_texture = UINT32_MAX;\n    rdef_constant_pitches.start_sampler = UINT32_MAX;\n  }\n\n  // Constant buffers:\n  // - xe_edram_dump_offsets : b0 { uint xe_edram_dump_offsets; }\n  // - xe_edram_dump_pitches : b1 { uint xe_edram_dump_pitches; }\n  // Reusing the constant names for constant buffers.\n  uint32_t rdef_cbuffer_position_dwords = uint32_t(built_shader_.size());\n  built_shader_.resize(rdef_cbuffer_position_dwords +\n                       sizeof(dxbc::RdefCbuffer) / sizeof(uint32_t) *\n                           kDumpCbufferCount);\n  {\n    auto rdef_cbuffers = reinterpret_cast<dxbc::RdefCbuffer*>(\n        built_shader_.data() + rdef_cbuffer_position_dwords);\n    // xe_edram_dump_offsets\n    dxbc::RdefCbuffer& rdef_cbuffer_offsets =\n        rdef_cbuffers[kDumpCbufferOffsets];\n    rdef_cbuffer_offsets.name_ptr = rdef_xe_edram_dump_offsets_name_ptr;\n    rdef_cbuffer_offsets.variable_count = 1;\n    rdef_cbuffer_offsets.variables_ptr = uint32_t(\n        rdef_constants_ptr + sizeof(dxbc::RdefVariable) * kConstantOffsets);\n    rdef_cbuffer_offsets.size_vector_aligned_bytes = sizeof(uint32_t) * 4;\n    // xe_edram_dump_pitches\n    dxbc::RdefCbuffer& rdef_cbuffer_pitches =\n        rdef_cbuffers[kDumpCbufferPitches];\n    rdef_cbuffer_pitches.name_ptr = rdef_xe_edram_dump_pitches_name_ptr;\n    rdef_cbuffer_pitches.variable_count = 1;\n    rdef_cbuffer_pitches.variables_ptr = uint32_t(\n        rdef_constants_ptr + sizeof(dxbc::RdefVariable) * kConstantPitches);\n    rdef_cbuffer_pitches.size_vector_aligned_bytes = sizeof(uint32_t) * 4;\n  }\n\n  // Bindings.\n  // - Texture2D/Texture2DMS<float4/uint4> xe_edram_dump_source : t0\n  // - Optionally, Texture2D/Texture2DMS<uint2> xe_edram_dump_stencil : t1\n  // - RWByteAddressBuffer xe_edram : u0\n  // - Constant buffers\n  uint32_t rdef_binding_count = 1 + key.is_depth + 1 + kDumpCbufferCount;\n  // Names.\n  name_ptr = uint32_t((built_shader_.size() - rdef_position_dwords) *\n                      sizeof(uint32_t));\n  uint32_t rdef_xe_edram_dump_source_name_ptr = name_ptr;\n  name_ptr += dxbc::AppendAlignedString(built_shader_, \"xe_edram_dump_source\");\n  uint32_t rdef_xe_edram_dump_stencil_name_ptr = name_ptr;\n  if (key.is_depth) {\n    name_ptr +=\n        dxbc::AppendAlignedString(built_shader_, \"xe_edram_dump_stencil\");\n  }\n  uint32_t rdef_xe_edram_name_ptr = name_ptr;\n  name_ptr += dxbc::AppendAlignedString(built_shader_, \"xe_edram\");\n  // Bindings.\n  uint32_t rdef_binding_position_dwords = uint32_t(built_shader_.size());\n  built_shader_.resize(rdef_binding_position_dwords +\n                       sizeof(dxbc::RdefInputBind) / sizeof(uint32_t) *\n                           rdef_binding_count);\n  bool source_is_uint;\n  if (key.is_depth) {\n    source_is_uint = false;\n  } else {\n    GetColorOwnershipTransferDXGIFormat(key.GetColorFormat(), &source_is_uint);\n  }\n  dxbc::ResourceReturnType source_return_type =\n      source_is_uint ? dxbc::ResourceReturnType::kUInt\n                     : dxbc::ResourceReturnType::kFloat;\n  uint32_t source_component_count =\n      key.is_depth ? 1\n                   : xenos::GetColorRenderTargetFormatComponentCount(\n                         key.GetColorFormat());\n  bool format_is_64bpp = !key.is_depth && xenos::IsColorRenderTargetFormat64bpp(\n                                              key.GetColorFormat());\n  {\n    auto rdef_bindings = reinterpret_cast<dxbc::RdefInputBind*>(\n        built_shader_.data() + rdef_binding_position_dwords);\n    uint32_t rdef_binding_index = 0;\n    // xe_edram_dump_source\n    dxbc::RdefInputBind& rdef_binding_source =\n        rdef_bindings[rdef_binding_index++];\n    rdef_binding_source.name_ptr = rdef_xe_edram_dump_source_name_ptr;\n    rdef_binding_source.type = dxbc::RdefInputType::kTexture;\n    rdef_binding_source.return_type = source_return_type;\n    if (key.msaa_samples != xenos::MsaaSamples::k1X) {\n      rdef_binding_source.dimension = dxbc::RdefDimension::kSRVTexture2DMS;\n      // Sample count is dynamic on Shader Model 5.\n    } else {\n      rdef_binding_source.dimension = dxbc::RdefDimension::kSRVTexture2D;\n      rdef_binding_source.sample_count = UINT32_MAX;\n    }\n    rdef_binding_source.bind_count = 1;\n    rdef_binding_source.flags = (source_component_count - 1)\n                                << dxbc::kRdefInputFlagsComponentsShift;\n    // xe_edram_dump_stencil\n    if (key.is_depth) {\n      dxbc::RdefInputBind& rdef_binding_stencil =\n          rdef_bindings[rdef_binding_index++];\n      rdef_binding_stencil.name_ptr = rdef_xe_edram_dump_stencil_name_ptr;\n      rdef_binding_stencil.type = dxbc::RdefInputType::kTexture;\n      rdef_binding_stencil.return_type = dxbc::ResourceReturnType::kUInt;\n      rdef_binding_stencil.dimension = rdef_binding_source.dimension;\n      rdef_binding_stencil.sample_count = rdef_binding_source.sample_count;\n      rdef_binding_stencil.bind_point = 1;\n      rdef_binding_stencil.bind_count = 1;\n      rdef_binding_stencil.flags = dxbc::kRdefInputFlags2Component;\n      rdef_binding_stencil.id = 1;\n    }\n    // xe_edram\n    dxbc::RdefInputBind& rdef_binding_edram =\n        rdef_bindings[rdef_binding_index++];\n    rdef_binding_edram.name_ptr = rdef_xe_edram_name_ptr;\n    rdef_binding_edram.type = dxbc::RdefInputType::kUAVRWByteAddress;\n    rdef_binding_edram.return_type = dxbc::ResourceReturnType::kMixed;\n    rdef_binding_edram.dimension = dxbc::RdefDimension::kUAVBuffer;\n    rdef_binding_edram.bind_count = 1;\n    // xe_edram_dump_offsets\n    dxbc::RdefInputBind& rdef_binding_offsets =\n        rdef_bindings[rdef_binding_index++];\n    rdef_binding_offsets.name_ptr = rdef_xe_edram_dump_offsets_name_ptr;\n    rdef_binding_offsets.type = dxbc::RdefInputType::kCbuffer;\n    rdef_binding_offsets.bind_point = kDumpCbufferOffsets;\n    rdef_binding_offsets.bind_count = 1;\n    rdef_binding_offsets.flags = dxbc::kRdefInputFlagUserPacked;\n    rdef_binding_offsets.id = kDumpCbufferOffsets;\n    // xe_edram_dump_pitches\n    dxbc::RdefInputBind& rdef_binding_pitches =\n        rdef_bindings[rdef_binding_index++];\n    rdef_binding_pitches.name_ptr = rdef_xe_edram_dump_pitches_name_ptr;\n    rdef_binding_pitches.type = dxbc::RdefInputType::kCbuffer;\n    rdef_binding_pitches.bind_point = kDumpCbufferPitches;\n    rdef_binding_pitches.bind_count = 1;\n    rdef_binding_pitches.flags = dxbc::kRdefInputFlagUserPacked;\n    rdef_binding_pitches.id = kDumpCbufferPitches;\n  }\n\n  // Header.\n  {\n    auto& rdef_header = *reinterpret_cast<dxbc::RdefHeader*>(\n        built_shader_.data() + rdef_position_dwords);\n    rdef_header.cbuffer_count = kDumpCbufferCount;\n    rdef_header.cbuffers_ptr =\n        uint32_t((rdef_cbuffer_position_dwords - rdef_position_dwords) *\n                 sizeof(uint32_t));\n    rdef_header.input_bind_count = rdef_binding_count;\n    rdef_header.input_binds_ptr =\n        uint32_t((rdef_binding_position_dwords - rdef_position_dwords) *\n                 sizeof(uint32_t));\n    rdef_header.shader_model = dxbc::RdefShaderModel::kComputeShader5_1;\n    rdef_header.compile_flags =\n        dxbc::kCompileFlagNoPreshader | dxbc::kCompileFlagPreferFlowControl |\n        dxbc::kCompileFlagIeeeStrictness | dxbc::kCompileFlagAllResourcesBound;\n    // Generator name is right after the header.\n    rdef_header.generator_name_ptr = sizeof(dxbc::RdefHeader);\n    rdef_header.fourcc = dxbc::RdefHeader::FourCC::k5_1;\n    rdef_header.InitializeSizes();\n  }\n\n  {\n    auto& blob_header = *reinterpret_cast<dxbc::BlobHeader*>(\n        built_shader_.data() + blob_position_dwords);\n    blob_header.fourcc = dxbc::BlobHeader::FourCC::kResourceDefinition;\n    blob_position_dwords = uint32_t(built_shader_.size());\n    blob_header.size_bytes =\n        (blob_position_dwords - kBlobHeaderSizeDwords) * sizeof(uint32_t) -\n        built_shader_[blob_offset_position_dwords++];\n  }\n\n  // ***************************************************************************\n  // Input and output signatures (empty)\n  // ***************************************************************************\n\n  for (uint32_t i = 0; i < 2; ++i) {\n    built_shader_[blob_offset_position_dwords] =\n        uint32_t(blob_position_dwords * sizeof(uint32_t));\n    uint32_t signature_position_dwords =\n        blob_position_dwords + kBlobHeaderSizeDwords;\n    built_shader_.resize(signature_position_dwords +\n                         sizeof(dxbc::Signature) / sizeof(uint32_t));\n    {\n      auto& signature = *reinterpret_cast<dxbc::Signature*>(\n          built_shader_.data() + signature_position_dwords);\n      // Empty - just set parameter pointer to the end.\n      signature.parameter_info_ptr = sizeof(dxbc::Signature);\n    }\n    {\n      auto& blob_header = *reinterpret_cast<dxbc::BlobHeader*>(\n          built_shader_.data() + blob_position_dwords);\n      blob_header.fourcc = i ? dxbc::BlobHeader::FourCC::kOutputSignature\n                             : dxbc::BlobHeader::FourCC::kInputSignature;\n      blob_position_dwords = uint32_t(built_shader_.size());\n      blob_header.size_bytes =\n          (blob_position_dwords - kBlobHeaderSizeDwords) * sizeof(uint32_t) -\n          built_shader_[blob_offset_position_dwords++];\n    }\n  }\n\n  // ***************************************************************************\n  // Shader program\n  // ***************************************************************************\n\n  built_shader_[blob_offset_position_dwords] =\n      uint32_t(blob_position_dwords * sizeof(uint32_t));\n  uint32_t shex_position_dwords = blob_position_dwords + kBlobHeaderSizeDwords;\n  built_shader_.resize(shex_position_dwords);\n\n  built_shader_.push_back(\n      dxbc::VersionToken(dxbc::ProgramType::kComputeShader, 5, 1));\n  // Reserve space for the length token.\n  built_shader_.push_back(0);\n\n  dxbc::Statistics stat;\n  std::memset(&stat, 0, sizeof(dxbc::Statistics));\n  dxbc::Assembler a(built_shader_, stat);\n\n  a.OpDclGlobalFlags(dxbc::kGlobalFlagAllResourcesBound);\n  a.OpDclConstantBuffer(dxbc::Src::CB(dxbc::Src::Dcl, kDumpCbufferOffsets,\n                                      kDumpCbufferOffsets, kDumpCbufferOffsets),\n                        1);\n  a.OpDclConstantBuffer(dxbc::Src::CB(dxbc::Src::Dcl, kDumpCbufferPitches,\n                                      kDumpCbufferPitches, kDumpCbufferPitches),\n                        1);\n  // Source texture.\n  dxbc::ResourceDimension source_dimension =\n      key.msaa_samples != xenos::MsaaSamples::k1X\n          ? dxbc::ResourceDimension::kTexture2DMS\n          : dxbc::ResourceDimension::kTexture2D;\n  a.OpDclResource(source_dimension,\n                  dxbc::ResourceReturnTypeX4Token(\n                      source_is_uint ? dxbc::ResourceReturnType::kUInt\n                                     : dxbc::ResourceReturnType::kFloat),\n                  dxbc::Src::T(dxbc::Src::Dcl, 0, 0, 0));\n  // Source stencil texture.\n  if (key.is_depth) {\n    a.OpDclResource(\n        source_dimension,\n        dxbc::ResourceReturnTypeX4Token(dxbc::ResourceReturnType::kUInt),\n        dxbc::Src::T(dxbc::Src::Dcl, 1, 1, 1));\n  }\n  // EDRAM buffer.\n  a.OpDclUnorderedAccessViewRaw(0, dxbc::Src::U(dxbc::Src::Dcl, 0, 0, 0));\n  a.OpDclInput(dxbc::Dest::VThreadID(0b0011));\n  // r0 - addressing before the load, then addressing and conversion scratch\n  // r1 - addressing scratch before the load, then data\n  stat.temp_register_count = 2;\n  a.OpDclTemps(stat.temp_register_count);\n  // There's no strict dependency on the group size here, for simplicity of\n  // calculations especially with resolution scaling, dividing manually (as the\n  // group size is not unlimited). The only restriction is that an integer\n  // multiple of it must be 80x16 samples (and no larger than that) for 32bpp,\n  // or 40x16 samples for 64bpp (because only a half of the pair of tiles may\n  // need to be dumped). The group size limit in Direct3D 11 is 1024, and 40x16\n  // fits in it, while 80x16 doesn't.\n  a.OpDclThreadGroup(40, 16, 1);\n\n  uint32_t draw_resolution_scale_x = this->draw_resolution_scale_x();\n  uint32_t draw_resolution_scale_y = this->draw_resolution_scale_y();\n\n  // For now, as the exact addressing in 64bpp render targets relatively to\n  // 32bpp is unknown, treating 64bpp tiles as storing 40x16 samples rather than\n  // 80x16 for simplicity of addressing into the texture.\n\n  uint32_t tile_width =\n      (xenos::kEdramTileWidthSamples * draw_resolution_scale_x) >>\n      uint32_t(format_is_64bpp);\n  uint32_t tile_height =\n      xenos::kEdramTileHeightSamples * draw_resolution_scale_y;\n\n  // Get the parts of the address - tile row index within the dispatch to r0.zw,\n  // sample Y within the tile to r0.xy.\n  // r0.x = X sample position within the tile\n  // r0.y = Y sample position within the tile\n  // r0.z = X tile position\n  // r0.w = Y tile position\n  a.OpUDiv(dxbc::Dest::R(0, 0b1100), dxbc::Dest::R(0, 0b0011),\n           dxbc::Src::VThreadID(0b01000100),\n           dxbc::Src::LU(tile_width, tile_height, tile_width, tile_height));\n\n  // Extract the dump rectangle tile row pitch to r1.x.\n  // r0.x = X sample position within the tile\n  // r0.y = Y sample position within the tile\n  // r0.z = X tile position\n  // r0.w = Y tile position\n  // r1.x = dump rectangle pitch in tiles\n  a.OpUBFE(dxbc::Dest::R(1, 0b0001), dxbc::Src::LU(xenos::kEdramPitchTilesBits),\n           dxbc::Src::LU(0),\n           dxbc::Src::CB(kDumpCbufferPitches, kDumpCbufferPitches, 0,\n                         dxbc::Src::kXXXX));\n  // Get the tile index in the EDRAM relative to the dump rectangle base tile to\n  // r0.w.\n  // r0.x = X sample position within the tile\n  // r0.y = Y sample position within the tile\n  // r0.z = free\n  // r0.w = tile index relative to the dump rectangle base\n  // r1.x = free\n  a.OpUMAd(dxbc::Dest::R(0, 0b1000), dxbc::Src::R(0, dxbc::Src::kWWWW),\n           dxbc::Src::R(1, dxbc::Src::kXXXX),\n           dxbc::Src::R(0, dxbc::Src::kZZZZ));\n\n  // Extract the index of the first tile (taking EDRAM addressing wrapping into\n  // account) of the dispatch in the EDRAM to r0.z.\n  // r0.x = X sample position within the tile\n  // r0.y = Y sample position within the tile\n  // r0.z = first EDRAM tile index in the dispatch\n  // r0.w = tile index relative to the dump rectangle base\n  a.OpUBFE(dxbc::Dest::R(0, 0b0100),\n           dxbc::Src::LU(xenos::kEdramBaseTilesBits + 1), dxbc::Src::LU(0),\n           dxbc::Src::CB(kDumpCbufferOffsets, kDumpCbufferOffsets, 0,\n                         dxbc::Src::kXXXX));\n  // Add the base tile in the dispatch to the dispatch-local tile index to r0.w,\n  // not wrapping yet so in case of a wraparound, the address relative to the\n  // base in the texture after subtraction of the base won't be negative.\n  // r0.x = X sample position within the tile\n  // r0.y = Y sample position within the tile\n  // r0.z = free\n  // r0.w = non-wrapped tile index in the EDRAM\n  a.OpIAdd(dxbc::Dest::R(0, 0b1000), dxbc::Src::R(0, dxbc::Src::kWWWW),\n           dxbc::Src::R(0, dxbc::Src::kZZZZ));\n  // Wrap the address of the tile in the EDRAM to r0.z.\n  // r0.x = X sample position within the tile\n  // r0.y = Y sample position within the tile\n  // r0.z = wrapped tile index in the EDRAM\n  // r0.w = non-wrapped tile index in the EDRAM\n  a.OpAnd(dxbc::Dest::R(0, 0b0100), dxbc::Src::R(0, dxbc::Src::kWWWW),\n          dxbc::Src::LU(xenos::kEdramTileCount - 1));\n  // Convert the tile index to samples and add the X sample index to it to r0.z.\n  // r0.x = X sample position within the tile\n  // r0.y = Y sample position within the tile\n  // r0.z = tile sample offset in the EDRAM plus X sample offset\n  // r0.w = non-wrapped tile index in the EDRAM\n  a.OpUMAd(dxbc::Dest::R(0, 0b0100), dxbc::Src::R(0, dxbc::Src::kZZZZ),\n           dxbc::Src::LU(\n               draw_resolution_scale_x * draw_resolution_scale_y *\n               (xenos::kEdramTileWidthSamples >> uint32_t(format_is_64bpp)) *\n               xenos::kEdramTileHeightSamples),\n           dxbc::Src::R(0, dxbc::Src::kXXXX));\n  // Add the contribution of the Y sample position within the tile to the sample\n  // address in the EDRAM to r0.z.\n  // r0.x = X sample position within the tile\n  // r0.y = Y sample position within the tile\n  // r0.z = sample offset in the EDRAM without the depth column swapping\n  // r0.w = non-wrapped tile index in the EDRAM\n  a.OpUMAd(dxbc::Dest::R(0, 0b0100), dxbc::Src::R(0, dxbc::Src::kYYYY),\n           dxbc::Src::LU(tile_width), dxbc::Src::R(0, dxbc::Src::kZZZZ));\n  if (key.is_depth) {\n    uint32_t tile_width_half = tile_width >> 1;\n    // Get which 40-sample half within the tile is being processed to r1.x.\n    // r0.x = X sample position within the tile\n    // r0.y = Y sample position within the tile\n    // r0.z = sample offset in the EDRAM without the depth column swapping\n    // r0.w = non-wrapped tile index in the EDRAM\n    // r1.x = 0xFFFFFFFF if in the right 40-sample half, 0 otherwise\n    a.OpUGE(dxbc::Dest::R(1, 0b0001), dxbc::Src::R(0, dxbc::Src::kXXXX),\n            dxbc::Src::LU(tile_width_half));\n    // Get the offset needed to swap 40-sample halves for depth.\n    // r0.x = X sample position within the tile\n    // r0.y = Y sample position within the tile\n    // r0.z = sample offset in the EDRAM without the depth column swapping\n    // r0.w = non-wrapped tile index in the EDRAM\n    // r1.x = depth half-tile flipping offset\n    a.OpMovC(dxbc::Dest::R(1, 0b0001), dxbc::Src::R(1, dxbc::Src::kXXXX),\n             dxbc::Src::LI(-int32_t(tile_width_half)),\n             dxbc::Src::LI(int32_t(tile_width_half)));\n    // Swap 40-sample columns in the depth buffer in the destination address in\n    // r0.w to get the final address of the sample in EDRAM.\n    // r0.x = X sample position within the tile\n    // r0.y = Y sample position within the tile\n    // r0.z = sample offset in the EDRAM\n    // r0.w = non-wrapped tile index in the EDRAM\n    // r1.x = free\n    a.OpIAdd(dxbc::Dest::R(0, 0b0100), dxbc::Src::R(0, dxbc::Src::kZZZZ),\n             dxbc::Src::R(1, dxbc::Src::kXXXX));\n  }\n  // Convert the destination address from samples to bytes.\n  a.OpIShL(dxbc::Dest::R(0, 0b0100), dxbc::Src::R(0, dxbc::Src::kZZZZ),\n           dxbc::Src::LU(format_is_64bpp ? 3 : 2));\n\n  // Extract the source texture base tile index to r1.x.\n  // r0.x = X sample position within the tile\n  // r0.y = Y sample position within the tile\n  // r0.z = sample offset in the EDRAM\n  // r0.w = non-wrapped tile index in the EDRAM\n  // r1.x = source texture base tile index\n  a.OpUBFE(dxbc::Dest::R(1, 0b0001), dxbc::Src::LU(xenos::kEdramBaseTilesBits),\n           dxbc::Src::LU(xenos::kEdramBaseTilesBits + 1),\n           dxbc::Src::CB(kDumpCbufferOffsets, kDumpCbufferOffsets, 0,\n                         dxbc::Src::kXXXX));\n  // Get the linear tile index within the source texture to r0.w.\n  // r0.x = X sample position within the tile\n  // r0.y = Y sample position within the tile\n  // r0.z = sample offset in the EDRAM\n  // r0.w = linear tile index in the source texture\n  // r1.x = free\n  a.OpIAdd(dxbc::Dest::R(0, 0b1000), dxbc::Src::R(0, dxbc::Src::kWWWW),\n           -dxbc::Src::R(1, dxbc::Src::kXXXX));\n  // Get the source texture pitch in tiles to r1.x.\n  // r0.x = X sample position within the tile\n  // r0.y = Y sample position within the tile\n  // r0.z = sample offset in the EDRAM\n  // r0.w = linear tile index in the source texture\n  // r1.x = source texture pitch in tiles\n  a.OpUBFE(dxbc::Dest::R(1, 0b0001), dxbc::Src::LU(xenos::kEdramPitchTilesBits),\n           dxbc::Src::LU(xenos::kEdramPitchTilesBits),\n           dxbc::Src::CB(kDumpCbufferPitches, kDumpCbufferPitches, 0,\n                         dxbc::Src::kXXXX));\n  // Split the linear tile index in the source texture into X and Y in tiles.\n  // r0.x = X sample position within the tile\n  // r0.y = Y sample position within the tile\n  // r0.z = sample offset in the EDRAM\n  // r0.w = X tile index within the tile row in the source texture\n  // r1.x = Y tile row index within the source texture\n  a.OpUDiv(dxbc::Dest::R(1, 0b0001), dxbc::Dest::R(0, 0b1000),\n           dxbc::Src::R(0, dxbc::Src::kWWWW),\n           dxbc::Src::R(1, dxbc::Src::kXXXX));\n  // Add the source texture tile X offset to the source texture sample X\n  // coordinate.\n  // r0.x = X sample position within the source texture\n  // r0.y = Y sample position within the tile\n  // r0.z = sample offset in the EDRAM\n  // r0.w = free\n  // r1.x = Y tile row index within the source texture\n  a.OpUMAd(dxbc::Dest::R(0, 0b0001), dxbc::Src::R(0, dxbc::Src::kWWWW),\n           dxbc::Src::LU(tile_width), dxbc::Src::R(0, dxbc::Src::kXXXX));\n  // Add the source texture tile Y offset to the source texture sample Y\n  // coordinate.\n  // r0.x = X sample position within the source texture\n  // r0.y = Y sample position within the source texture\n  // r0.z = sample offset in the EDRAM\n  // r1.x = free\n  a.OpUMAd(\n      dxbc::Dest::R(0, 0b0010), dxbc::Src::R(1, dxbc::Src::kXXXX),\n      dxbc::Src::LU(xenos::kEdramTileHeightSamples * draw_resolution_scale_y),\n      dxbc::Src::R(0, dxbc::Src::kYYYY));\n  // Will be using the source texture coordinates from r0.xy, and for\n  // single-sampled source, LOD from r0.w.\n  dxbc::Src source_address_src(dxbc::Src::R(0, 0b11000100));\n  if (key.msaa_samples >= xenos::MsaaSamples::k2X) {\n    if (key.msaa_samples >= xenos::MsaaSamples::k4X) {\n      // 4x MSAA source texture sample index - bit 0 for horizontal, bit 1 for\n      // vertical.\n      // Extract the horizontal sample index to r0.w.\n      // r0.x = X sample position within the source texture\n      // r0.y = Y sample position within the source texture\n      // r0.z = sample offset in the EDRAM\n      // r0.w = horizontal sample index within the source pixel\n      a.OpAnd(dxbc::Dest::R(0, 0b1000), dxbc::Src::R(0, dxbc::Src::kXXXX),\n              dxbc::Src::LU(1));\n      // Insert the vertical sample index to r0.w.\n      // r0.x = X sample position within the source texture\n      // r0.y = Y sample position within the source texture\n      // r0.z = sample offset in the EDRAM\n      // r0.w = sample index within the source pixel\n      a.OpBFI(dxbc::Dest::R(0, 0b1000), dxbc::Src::LU(1), dxbc::Src::LU(1),\n              dxbc::Src::R(0, dxbc::Src::kYYYY),\n              dxbc::Src::R(0, dxbc::Src::kWWWW));\n      // Convert sample to pixel coordinates in the source texture to r0.xy.\n      // r0.x = X pixel position within the source texture\n      // r0.y = Y pixel position within the source texture\n      // r0.z = sample offset in the EDRAM\n      // r0.w = sample index within the source pixel\n      a.OpUShR(dxbc::Dest::R(0, 0b0011), dxbc::Src::R(0), dxbc::Src::LU(1));\n    } else {\n      // 2x MSAA source texture sample index.\n      // Extract the vertical sample index to r0.w.\n      // r0.x = X pixel position within the source texture\n      // r0.y = Y sample position within the source texture\n      // r0.z = sample offset in the EDRAM\n      // r0.w = vertical sample index within the destination pixel\n      a.OpAnd(dxbc::Dest::R(0, 0b1000), dxbc::Src::R(0, dxbc::Src::kYYYY),\n              dxbc::Src::LU(1));\n      // Convert the 2x MSAA sample index from the guest to Direct3D 10.1+.\n      // r0.x = X pixel position within the source texture\n      // r0.y = Y sample position within the source texture\n      // r0.z = sample offset in the EDRAM\n      // r0.w = sample index within the source pixel\n      a.OpMovC(dxbc::Dest::R(0, 0b1000), dxbc::Src::R(0, dxbc::Src::kWWWW),\n               dxbc::Src::LU(draw_util::GetD3D10SampleIndexForGuest2xMSAA(\n                   1, msaa_2x_supported_)),\n               dxbc::Src::LU(draw_util::GetD3D10SampleIndexForGuest2xMSAA(\n                   0, msaa_2x_supported_)));\n      // Convert sample Y to pixel Y in the source texture to r0.y.\n      // r0.x = X pixel position within the source texture\n      // r0.y = Y pixel position within the source texture\n      // r0.z = sample offset in the EDRAM\n      // r0.w = sample index within the source pixel\n      a.OpUShR(dxbc::Dest::R(0, 0b0010), dxbc::Src::R(0, dxbc::Src::kYYYY),\n               dxbc::Src::LU(1));\n    }\n    // Load the source to r1.\n    // r0.x = X pixel position within the source texture if stencil is needed\n    // r0.y = Y pixel position within the source texture if stencil is needed\n    // r0.z = sample offset in the EDRAM\n    // r0.w = sample index within the source pixel if stencil is needed\n    // r1 = source texel value\n    a.OpLdMS(dxbc::Dest::R(1, (1 << source_component_count) - 1),\n             source_address_src, 0b0011, dxbc::Src::T(0, 0),\n             dxbc::Src::R(0, dxbc::Src::kWWWW));\n    if (key.is_depth) {\n      // Load the source stencil to r1.y.\n      // r0.x = free\n      // r0.y = free\n      // r0.z = sample offset in the EDRAM\n      // r0.w = free\n      // r1.x = source depth value\n      // r1.y = source stencil value\n      a.OpLdMS(dxbc::Dest::R(1, 0b0010), source_address_src, 0b0011,\n               dxbc::Src::T(1, 1), dxbc::Src::R(0, dxbc::Src::kWWWW));\n    }\n  } else {\n    // Write the LOD index (0) to the register with texture coordinates for\n    // loading from the single-sampled source texture.\n    // r0.x = X pixel position within the source texture\n    // r0.y = Y pixel position within the source texture\n    // r0.z = sample offset in the EDRAM\n    // r0.w = LOD for the texture load (zero)\n    a.OpMov(dxbc::Dest::R(0, 0b1000), dxbc::Src::LF(0.0f));\n    // Load the source to r1.\n    // r0.x = X pixel position within the source texture if stencil is needed\n    // r0.y = Y pixel position within the source texture if stencil is needed\n    // r0.z = sample offset in the EDRAM\n    // r0.w = LOD for the texture load (zero)\n    // r1 = source texel value\n    a.OpLd(dxbc::Dest::R(1, (1 << source_component_count) - 1),\n           source_address_src, 0b1011, dxbc::Src::T(0, 0));\n    if (key.is_depth) {\n      // Load the source stencil to r1.y.\n      // r0.x = free\n      // r0.y = free\n      // r0.z = sample offset in the EDRAM\n      // r0.w = free\n      // r1.x = source depth value\n      // r1.y = source stencil value\n      a.OpLd(dxbc::Dest::R(1, 0b0010), source_address_src, 0b1011,\n             dxbc::Src::T(1, 1));\n    }\n  }\n\n  // Pack in the needed format, writing the result to r1.x for 32bpp or r1.xy\n  // for 64bpp.\n  // r0.xyw are usable as temporary storage.\n  if (key.is_depth) {\n    switch (key.GetDepthFormat()) {\n      case xenos::DepthRenderTargetFormat::kD24S8:\n        // Round to the nearest even integer. This seems to be the correct\n        // conversion, adding +0.5 and rounding towards zero results in red\n        // instead of black in the 4D5307E6 clear shader.\n        a.OpMul(dxbc::Dest::R(1, 0b0001), dxbc::Src::R(1, dxbc::Src::kXXXX),\n                dxbc::Src::LF(float(0xFFFFFF)));\n        a.OpRoundNE(dxbc::Dest::R(1, 0b0001),\n                    dxbc::Src::R(1, dxbc::Src::kXXXX));\n        a.OpFToU(dxbc::Dest::R(1, 0b0001), dxbc::Src::R(1, dxbc::Src::kXXXX));\n        break;\n      case xenos::DepthRenderTargetFormat::kD24FS8:\n        // Convert to [0, 2) float24 from [0, 1) float32, using r0.x as\n        // temporary.\n        // When converting the depth in pixel shaders, it's always exact,\n        // truncating not to insert additional rounding instructions.\n        DxbcShaderTranslator::PreClampedDepthTo20e4(\n            a, 1, 0, 1, 0, 0, 0,\n            !depth_float24_convert_in_pixel_shader() && depth_float24_round(),\n            true);\n        break;\n    }\n    // Combine 24-bit depth and stencil into r1.x.\n    a.OpBFI(dxbc::Dest::R(1, 0b0001), dxbc::Src::LU(24), dxbc::Src::LU(8),\n            dxbc::Src::R(1, dxbc::Src::kXXXX),\n            dxbc::Src::R(1, dxbc::Src::kYYYY));\n  } else {\n    switch (key.GetColorFormat()) {\n      case xenos::ColorRenderTargetFormat::k_8_8_8_8:\n        if (!source_is_uint) {\n          a.OpMAd(dxbc::Dest::R(1), dxbc::Src::R(1), dxbc::Src::LF(255.0f),\n                  dxbc::Src::LF(0.5f));\n          a.OpFToU(dxbc::Dest::R(1), dxbc::Src::R(1));\n        }\n        for (uint32_t i = 1; i < 4; ++i) {\n          a.OpBFI(dxbc::Dest::R(1, 0b0001), dxbc::Src::LU(8),\n                  dxbc::Src::LU(i * 8), dxbc::Src::R(1).Select(i),\n                  dxbc::Src::R(1, dxbc::Src::kXXXX));\n        }\n        break;\n      case xenos::ColorRenderTargetFormat::k_8_8_8_8_GAMMA:\n        // 8_8_8_8_GAMMA is represented by linear stored in R16G16B16A16_UNORM.\n        assert_false(source_is_uint);\n        for (uint32_t i = 0; i < 3; ++i) {\n          DxbcShaderTranslator::PreSaturatedLinearToPWLGamma(a, 1, i, 1, i, 0,\n                                                             0, 0, 1);\n        }\n        a.OpMAd(dxbc::Dest::R(1), dxbc::Src::R(1), dxbc::Src::LF(255.0f),\n                dxbc::Src::LF(0.5f));\n        a.OpFToU(dxbc::Dest::R(1), dxbc::Src::R(1));\n        for (uint32_t i = 1; i < 4; ++i) {\n          a.OpBFI(dxbc::Dest::R(1, 0b0001), dxbc::Src::LU(8),\n                  dxbc::Src::LU(i * 8), dxbc::Src::R(1).Select(i),\n                  dxbc::Src::R(1, dxbc::Src::kXXXX));\n        }\n        break;\n      case xenos::ColorRenderTargetFormat::k_2_10_10_10:\n      case xenos::ColorRenderTargetFormat::k_2_10_10_10_AS_10_10_10_10:\n        if (!source_is_uint) {\n          a.OpMAd(dxbc::Dest::R(1), dxbc::Src::R(1),\n                  dxbc::Src::LF(1023.0f, 1023.0f, 1023.0f, 3.0f),\n                  dxbc::Src::LF(0.5f));\n          a.OpFToU(dxbc::Dest::R(1), dxbc::Src::R(1));\n        }\n        for (uint32_t i = 1; i < 4; ++i) {\n          a.OpBFI(dxbc::Dest::R(1, 0b0001), dxbc::Src::LU(i == 3 ? 2 : 10),\n                  dxbc::Src::LU(i * 10), dxbc::Src::R(1).Select(i),\n                  dxbc::Src::R(1, dxbc::Src::kXXXX));\n        }\n        break;\n      case xenos::ColorRenderTargetFormat::k_2_10_10_10_FLOAT:\n      case xenos::ColorRenderTargetFormat::k_2_10_10_10_FLOAT_AS_16_16_16_16:\n        // Float16 has a wider range for both color and alpha, also NaNs.\n        // Color - clamp and convert.\n        // Convert red in r1.x to the result register r1.x - the same, but\n        // UnclampedFloat32To7e3 allows that - using r0.x as a temporary.\n        DxbcShaderTranslator::UnclampedFloat32To7e3(a, 1, 0, 1, 0, 0, 0);\n        for (uint32_t i = 1; i < 3; ++i) {\n          // Convert green and blue to a temporary register r0.x using r0.y\n          // as an internal temporary, then insert them into the result in\n          // r1.x.\n          DxbcShaderTranslator::UnclampedFloat32To7e3(a, 0, 0, 1, i, 0, 1);\n          a.OpBFI(dxbc::Dest::R(1, 0b0001), dxbc::Src::LU(10),\n                  dxbc::Src::LU(i * 10), dxbc::Src::R(0, dxbc::Src::kXXXX),\n                  dxbc::Src::R(1, dxbc::Src::kXXXX));\n        }\n        // Alpha - saturate and convert.\n        a.OpMov(dxbc::Dest::R(1, 0b1000), dxbc::Src::R(1, dxbc::Src::kWWWW),\n                true);\n        a.OpMAd(dxbc::Dest::R(1, 0b1000), dxbc::Src::R(1, dxbc::Src::kWWWW),\n                dxbc::Src::LF(3.0f), dxbc::Src::LF(0.5f));\n        a.OpFToU(dxbc::Dest::R(1, 0b1000), dxbc::Src::R(1, dxbc::Src::kWWWW));\n        a.OpBFI(dxbc::Dest::R(1, 0b0001), dxbc::Src::LU(2), dxbc::Src::LU(30),\n                dxbc::Src::R(1, dxbc::Src::kWWWW),\n                dxbc::Src::R(1, dxbc::Src::kXXXX));\n        break;\n      case xenos::ColorRenderTargetFormat::k_16_16:\n      case xenos::ColorRenderTargetFormat::k_16_16_FLOAT:\n        assert_true(source_is_uint);\n        a.OpBFI(dxbc::Dest::R(1, 0b0001), dxbc::Src::LU(16), dxbc::Src::LU(16),\n                dxbc::Src::R(1, dxbc::Src::kYYYY),\n                dxbc::Src::R(1, dxbc::Src::kXXXX));\n        break;\n      case xenos::ColorRenderTargetFormat::k_16_16_16_16:\n      case xenos::ColorRenderTargetFormat::k_16_16_16_16_FLOAT:\n        assert_true(source_is_uint);\n        a.OpBFI(dxbc::Dest::R(1, 0b0011), dxbc::Src::LU(16), dxbc::Src::LU(16),\n                dxbc::Src::R(1, 0b1101), dxbc::Src::R(1, 0b1000));\n        break;\n      case xenos::ColorRenderTargetFormat::k_32_FLOAT:\n      case xenos::ColorRenderTargetFormat::k_32_32_FLOAT:\n        assert_true(source_is_uint);\n        // Already has the needed representation.\n        break;\n    }\n  }\n\n  // Write the sample to the destination address stored in r0.z.\n  a.OpStoreRaw(dxbc::Dest::U(0, 0, format_is_64bpp ? 0b0011 : 0b0001),\n               dxbc::Src::R(0, dxbc::Src::kZZZZ), dxbc::Src::R(1));\n\n  a.OpRet();\n\n  // Write the shader program length in dwords.\n  built_shader_[shex_position_dwords + 1] =\n      uint32_t(built_shader_.size()) - shex_position_dwords;\n\n  {\n    auto& blob_header = *reinterpret_cast<dxbc::BlobHeader*>(\n        built_shader_.data() + blob_position_dwords);\n    blob_header.fourcc = dxbc::BlobHeader::FourCC::kShaderEx;\n    blob_position_dwords = uint32_t(built_shader_.size());\n    blob_header.size_bytes =\n        (blob_position_dwords - kBlobHeaderSizeDwords) * sizeof(uint32_t) -\n        built_shader_[blob_offset_position_dwords++];\n  }\n\n  // ***************************************************************************\n  // Statistics\n  // ***************************************************************************\n\n  built_shader_[blob_offset_position_dwords] =\n      uint32_t(blob_position_dwords * sizeof(uint32_t));\n  uint32_t stat_position_dwords = blob_position_dwords + kBlobHeaderSizeDwords;\n  built_shader_.resize(stat_position_dwords +\n                       sizeof(dxbc::Statistics) / sizeof(uint32_t));\n  std::memcpy(built_shader_.data() + stat_position_dwords, &stat,\n              sizeof(dxbc::Statistics));\n  {\n    auto& blob_header = *reinterpret_cast<dxbc::BlobHeader*>(\n        built_shader_.data() + blob_position_dwords);\n    blob_header.fourcc = dxbc::BlobHeader::FourCC::kStatistics;\n    blob_position_dwords = uint32_t(built_shader_.size());\n    blob_header.size_bytes =\n        (blob_position_dwords - kBlobHeaderSizeDwords) * sizeof(uint32_t) -\n        built_shader_[blob_offset_position_dwords++];\n  }\n\n  // ***************************************************************************\n  // Container header\n  // ***************************************************************************\n\n  uint32_t built_shader_size_bytes =\n      uint32_t(built_shader_.size() * sizeof(uint32_t));\n  {\n    auto& container_header =\n        *reinterpret_cast<dxbc::ContainerHeader*>(built_shader_.data());\n    container_header.InitializeIdentification();\n    container_header.size_bytes = built_shader_size_bytes;\n    container_header.blob_count = kBlobCount;\n    CalculateDXBCChecksum(\n        reinterpret_cast<unsigned char*>(built_shader_.data()),\n        static_cast<unsigned int>(built_shader_size_bytes),\n        reinterpret_cast<unsigned int*>(&container_header.hash));\n  }\n\n  // ***************************************************************************\n  // Pipeline\n  // ***************************************************************************\n  ID3D12PipelineState* pipeline = ui::d3d12::util::CreateComputePipeline(\n      command_processor_.GetD3D12Provider().GetDevice(), built_shader_.data(),\n      built_shader_size_bytes,\n      key.is_depth ? dump_root_signature_depth_ : dump_root_signature_color_);\n  const char* format_name =\n      key.is_depth\n          ? xenos::GetDepthRenderTargetFormatName(key.GetDepthFormat())\n          : xenos::GetColorRenderTargetFormatName(key.GetColorFormat());\n  if (pipeline) {\n    std::u16string pipeline_name =\n        xe::to_utf16(fmt::format(\"RT Dump {} {}xMSAA\", format_name,\n                                 uint32_t(1) << uint32_t(key.msaa_samples)));\n    pipeline->SetName(reinterpret_cast<LPCWSTR>(pipeline_name.c_str()));\n  } else {\n    XELOGE(\n        \"D3D12RenderTargetCache: Failed to create a render target dumping \"\n        \"pipeline for {}-sample render targets with format {}\",\n        uint32_t(1) << uint32_t(key.msaa_samples), format_name);\n  }\n  // Even if creation fails, still store the null pointer not to try to create\n  // again.\n  dump_pipelines_.emplace(key, pipeline);\n  return pipeline;\n}\n\nvoid D3D12RenderTargetCache::DumpRenderTargets(uint32_t dump_base,\n                                               uint32_t dump_row_length_used,\n                                               uint32_t dump_rows,\n                                               uint32_t dump_pitch) {\n  assert_true(GetPath() == Path::kHostRenderTargets);\n\n  GetResolveCopyRectanglesToDump(dump_base, dump_row_length_used, dump_rows,\n                                 dump_pitch, dump_rectangles_);\n  if (dump_rectangles_.empty()) {\n    return;\n  }\n\n  // Clear previously set temporary indices.\n  for (const ResolveCopyDumpRectangle& rectangle : dump_rectangles_) {\n    auto& d3d12_rt = *static_cast<D3D12RenderTarget*>(rectangle.render_target);\n    d3d12_rt.SetTemporarySortIndex(UINT32_MAX);\n    d3d12_rt.SetTemporarySRVDescriptorIndex(UINT32_MAX);\n    d3d12_rt.SetTemporarySRVDescriptorIndexStencil(UINT32_MAX);\n  }\n  // Gather all needed barriers and info needed to create descriptors and to\n  // sort the invocations.\n  TransitionEdramBuffer(D3D12_RESOURCE_STATE_UNORDERED_ACCESS);\n  dump_invocations_.clear();\n  dump_invocations_.reserve(dump_rectangles_.size());\n  current_temporary_descriptors_cpu_.clear();\n  bool any_sources_32bpp_64bpp[2] = {};\n  uint32_t rt_sort_index = 0;\n  for (const ResolveCopyDumpRectangle& rectangle : dump_rectangles_) {\n    auto& d3d12_rt = *static_cast<D3D12RenderTarget*>(rectangle.render_target);\n    command_processor_.PushTransitionBarrier(\n        d3d12_rt.resource(),\n        d3d12_rt.SetResourceState(\n            D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE),\n        D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE);\n    if (d3d12_rt.temporary_sort_index() == UINT32_MAX) {\n      d3d12_rt.SetTemporarySortIndex(rt_sort_index++);\n    }\n    if (d3d12_rt.temporary_srv_descriptor_index() == UINT32_MAX) {\n      d3d12_rt.SetTemporarySRVDescriptorIndex(\n          uint32_t(current_temporary_descriptors_cpu_.size()));\n      current_temporary_descriptors_cpu_.push_back(\n          d3d12_rt.descriptor_srv().GetHandle());\n    }\n    RenderTargetKey rt_key = d3d12_rt.key();\n    if (rt_key.is_depth &&\n        d3d12_rt.temporary_srv_descriptor_index_stencil() == UINT32_MAX) {\n      d3d12_rt.SetTemporarySRVDescriptorIndexStencil(\n          uint32_t(current_temporary_descriptors_cpu_.size()));\n      current_temporary_descriptors_cpu_.push_back(\n          d3d12_rt.descriptor_srv_stencil().GetHandle());\n    }\n    any_sources_32bpp_64bpp[size_t(rt_key.Is64bpp())] = true;\n    DumpPipelineKey pipeline_key;\n    pipeline_key.msaa_samples = rt_key.msaa_samples;\n    pipeline_key.resource_format = rt_key.resource_format;\n    pipeline_key.is_depth = rt_key.is_depth;\n    dump_invocations_.emplace_back(rectangle, pipeline_key);\n  }\n\n  // Copy source descriptors to a shader-visible heap.\n  uint32_t descriptor_count =\n      uint32_t(current_temporary_descriptors_cpu_.size());\n  current_temporary_descriptors_gpu_.resize(descriptor_count);\n  if (!command_processor_.RequestOneUseSingleViewDescriptors(\n          descriptor_count, current_temporary_descriptors_gpu_.data())) {\n    return;\n  }\n  ID3D12Device* device = command_processor_.GetD3D12Provider().GetDevice();\n  for (uint32_t i = 0; i < descriptor_count; ++i) {\n    device->CopyDescriptorsSimple(1,\n                                  current_temporary_descriptors_gpu_[i].first,\n                                  current_temporary_descriptors_cpu_[i],\n                                  D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);\n  }\n\n  // Sort the invocations to reduce context and binding switches.\n  std::sort(dump_invocations_.begin(), dump_invocations_.end());\n\n  // Dump the render targets.\n  DeferredCommandList& command_list =\n      command_processor_.GetDeferredCommandList();\n  ID3D12RootSignature* last_root_signature = nullptr;\n  // `root_parameters_set` doesn't include the EDRAM buffer, which is never\n  // changed.\n  uint32_t root_parameters_set = 0;\n  uint32_t last_descriptor_index_source = UINT32_MAX;\n  uint32_t last_descriptor_index_stencil = UINT32_MAX;\n  bool last_edram_uav_is_64bpp = false;\n  DumpOffsets last_offsets;\n  DumpPitches last_pitches;\n  for (const DumpInvocation& invocation : dump_invocations_) {\n    const ResolveCopyDumpRectangle& rectangle = invocation.rectangle;\n    auto& d3d12_rt = *static_cast<D3D12RenderTarget*>(rectangle.render_target);\n    RenderTargetKey rt_key = d3d12_rt.key();\n    DumpPipelineKey pipeline_key = invocation.pipeline_key;\n    ID3D12PipelineState* pipeline = GetOrCreateDumpPipeline(pipeline_key);\n    if (!pipeline) {\n      continue;\n    }\n    command_processor_.SetExternalPipeline(pipeline);\n\n    ID3D12RootSignature* root_signature = pipeline_key.is_depth\n                                              ? dump_root_signature_depth_\n                                              : dump_root_signature_color_;\n    if (last_root_signature != root_signature) {\n      last_root_signature = root_signature;\n      command_list.D3DSetComputeRootSignature(root_signature);\n      root_parameters_set = 0;\n      command_list.D3DSetComputeRootUnorderedAccessView(\n          pipeline_key.is_depth ? kDumpRootParameterDepthEdram\n                                : kDumpRootParameterColorEdram,\n          edram_buffer_gpu_address_);\n    }\n\n    DumpRootParameter root_parameter_pitches =\n        pipeline_key.is_depth ? kDumpRootParameterDepthPitches\n                              : kDumpRootParameterColorPitches;\n    uint32_t root_parameter_pitches_bit = uint32_t(1) << root_parameter_pitches;\n    DumpPitches pitches;\n    pitches.dest_pitch = dump_pitch;\n    pitches.source_pitch = rt_key.GetPitchTiles();\n    if (last_pitches != pitches) {\n      last_pitches = pitches;\n      root_parameters_set &= ~root_parameter_pitches_bit;\n    }\n    if (!(root_parameters_set & root_parameter_pitches_bit)) {\n      command_list.D3DSetComputeRoot32BitConstants(\n          root_parameter_pitches, sizeof(last_pitches) / sizeof(uint32_t),\n          &last_pitches, 0);\n      root_parameters_set |= root_parameter_pitches_bit;\n    }\n\n    if (pipeline_key.is_depth) {\n      constexpr uint32_t kDumpRootParameterDepthStencilBit =\n          uint32_t(1) << kDumpRootParameterDepthStencil;\n      uint32_t descriptor_index_stencil =\n          d3d12_rt.temporary_srv_descriptor_index_stencil();\n      assert_true(descriptor_index_stencil != UINT32_MAX);\n      if (last_descriptor_index_stencil != descriptor_index_stencil) {\n        last_descriptor_index_stencil = descriptor_index_stencil;\n        root_parameters_set &= ~kDumpRootParameterDepthStencilBit;\n      }\n      if (!(root_parameters_set & kDumpRootParameterDepthStencilBit)) {\n        command_list.D3DSetComputeRootDescriptorTable(\n            kDumpRootParameterDepthStencil,\n            current_temporary_descriptors_gpu_[last_descriptor_index_stencil]\n                .second);\n        root_parameters_set |= kDumpRootParameterDepthStencilBit;\n      }\n    }\n\n    constexpr uint32_t kDumpRootParameterSourceBit =\n        uint32_t(1) << kDumpRootParameterSource;\n    uint32_t descriptor_index_source =\n        d3d12_rt.temporary_srv_descriptor_index();\n    assert_true(descriptor_index_source != UINT32_MAX);\n    if (last_descriptor_index_source != descriptor_index_source) {\n      last_descriptor_index_source = descriptor_index_source;\n      root_parameters_set &= ~kDumpRootParameterSourceBit;\n    }\n    if (!(root_parameters_set & kDumpRootParameterSourceBit)) {\n      command_list.D3DSetComputeRootDescriptorTable(\n          kDumpRootParameterSource,\n          current_temporary_descriptors_gpu_[last_descriptor_index_source]\n              .second);\n      root_parameters_set |= kDumpRootParameterSourceBit;\n    }\n\n    constexpr uint32_t kDumpRootParameterOffsetsBit =\n        uint32_t(1) << kDumpRootParameterOffsets;\n    DumpOffsets offsets;\n    offsets.source_base_tiles = rt_key.base_tiles;\n    bool format_is_64bpp = rt_key.Is64bpp();\n    ResolveCopyDumpRectangle::Dispatch\n        dispatches[ResolveCopyDumpRectangle::kMaxDispatches];\n    uint32_t dispatch_count =\n        rectangle.GetDispatches(dump_pitch, dump_row_length_used, dispatches);\n    for (uint32_t i = 0; i < dispatch_count; ++i) {\n      const ResolveCopyDumpRectangle::Dispatch& dispatch = dispatches[i];\n      offsets.dispatch_first_tile = dump_base + dispatch.offset;\n      if (last_offsets != offsets) {\n        last_offsets = offsets;\n        root_parameters_set &= ~kDumpRootParameterOffsetsBit;\n      }\n      if (!(root_parameters_set & kDumpRootParameterOffsetsBit)) {\n        command_list.D3DSetComputeRoot32BitConstants(\n            kDumpRootParameterOffsets, sizeof(last_offsets) / sizeof(uint32_t),\n            &last_offsets, 0);\n        root_parameters_set |= kDumpRootParameterOffsetsBit;\n      }\n      command_processor_.SubmitBarriers();\n      // Processing 40 x 16 x scale samples per dispatch (a 32bpp tile in two\n      // dispatches at 1x1 scale, 64bpp in one dispatch).\n      command_list.D3DDispatch(\n          (dispatch.width_tiles * draw_resolution_scale_x())\n              << uint32_t(!format_is_64bpp),\n          dispatch.height_tiles * draw_resolution_scale_y(), 1);\n    }\n    MarkEdramBufferModified();\n  }\n}\n\n}  // namespace d3d12\n}  // namespace gpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/d3d12/d3d12_render_target_cache.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_D3D12_D3D12_RENDER_TARGET_CACHE_H_\n#define XENIA_GPU_D3D12_D3D12_RENDER_TARGET_CACHE_H_\n\n#include <algorithm>\n#include <array>\n#include <cstddef>\n#include <cstdint>\n#include <deque>\n#include <functional>\n#include <memory>\n#include <unordered_map>\n#include <utility>\n#include <vector>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/gpu/d3d12/d3d12_shared_memory.h\"\n#include \"xenia/gpu/d3d12/d3d12_texture_cache.h\"\n#include \"xenia/gpu/draw_util.h\"\n#include \"xenia/gpu/render_target_cache.h\"\n#include \"xenia/gpu/trace_writer.h\"\n#include \"xenia/gpu/xenos.h\"\n#include \"xenia/memory.h\"\n#include \"xenia/ui/d3d12/d3d12_cpu_descriptor_pool.h\"\n#include \"xenia/ui/d3d12/d3d12_provider.h\"\n#include \"xenia/ui/d3d12/d3d12_upload_buffer_pool.h\"\n#include \"xenia/ui/d3d12/d3d12_util.h\"\n\nnamespace xe {\nnamespace gpu {\nnamespace d3d12 {\n\nclass D3D12CommandProcessor;\n\nclass D3D12RenderTargetCache final : public RenderTargetCache {\n public:\n  D3D12RenderTargetCache(const RegisterFile& register_file,\n                         const Memory& memory, TraceWriter& trace_writer,\n                         uint32_t draw_resolution_scale_x,\n                         uint32_t draw_resolution_scale_y,\n                         D3D12CommandProcessor& command_processor,\n                         bool bindless_resources_used)\n      : RenderTargetCache(register_file, memory, &trace_writer,\n                          draw_resolution_scale_x, draw_resolution_scale_y),\n        command_processor_(command_processor),\n        trace_writer_(trace_writer),\n        bindless_resources_used_(bindless_resources_used) {}\n  ~D3D12RenderTargetCache() override;\n\n  bool Initialize();\n  void Shutdown(bool from_destructor = false);\n\n  void CompletedSubmissionUpdated();\n  void BeginSubmission();\n\n  Path GetPath() const override { return path_; }\n\n  bool Update(bool is_rasterization_done,\n              reg::RB_DEPTHCONTROL normalized_depth_control,\n              uint32_t normalized_color_mask,\n              const Shader& vertex_shader) override;\n\n  void InvalidateCommandListRenderTargets() {\n    are_current_command_list_render_targets_valid_ = false;\n  }\n\n  bool msaa_2x_supported() const { return msaa_2x_supported_; }\n\n  void WriteEdramRawSRVDescriptor(D3D12_CPU_DESCRIPTOR_HANDLE handle);\n  void WriteEdramRawUAVDescriptor(D3D12_CPU_DESCRIPTOR_HANDLE handle);\n  void WriteEdramUintPow2SRVDescriptor(D3D12_CPU_DESCRIPTOR_HANDLE handle,\n                                       uint32_t element_size_bytes_pow2);\n  void WriteEdramUintPow2UAVDescriptor(D3D12_CPU_DESCRIPTOR_HANDLE handle,\n                                       uint32_t element_size_bytes_pow2);\n\n  // Performs the resolve to a shared memory area according to the current\n  // register values, and also clears the render targets if needed. Must be in a\n  // frame for calling.\n  bool Resolve(const Memory& memory, D3D12SharedMemory& shared_memory,\n               D3D12TextureCache& texture_cache, uint32_t& written_address_out,\n               uint32_t& written_length_out);\n\n  // Returns true if any downloads were submitted to the command processor.\n  bool InitializeTraceSubmitDownloads();\n  void InitializeTraceCompleteDownloads();\n  void RestoreEdramSnapshot(const void* snapshot);\n\n  // For host render targets.\n\n  bool gamma_render_target_as_unorm16() const {\n    return gamma_render_target_as_unorm16_;\n  }\n\n  // Using R16G16[B16A16]_SNORM, which are -1...1, not the needed -32...32.\n  // Persistent data doesn't depend on this, so can be overriden by per-game\n  // configuration.\n  bool IsFixed16TruncatedToMinus1To1() const {\n    return GetPath() == Path::kHostRenderTargets &&\n           !cvars::snorm16_render_target_full_range;\n  }\n\n  bool depth_float24_round() const { return depth_float24_round_; }\n  bool depth_float24_convert_in_pixel_shader() const {\n    return depth_float24_convert_in_pixel_shader_;\n  }\n\n  DXGI_FORMAT GetColorResourceDXGIFormat(\n      xenos::ColorRenderTargetFormat format) const;\n  DXGI_FORMAT GetColorDrawDXGIFormat(\n      xenos::ColorRenderTargetFormat format) const;\n  DXGI_FORMAT GetColorOwnershipTransferDXGIFormat(\n      xenos::ColorRenderTargetFormat format,\n      bool* is_integer_out = nullptr) const;\n  static DXGI_FORMAT GetDepthResourceDXGIFormat(\n      xenos::DepthRenderTargetFormat format);\n  static DXGI_FORMAT GetDepthDSVDXGIFormat(\n      xenos::DepthRenderTargetFormat format);\n  static DXGI_FORMAT GetDepthSRVDepthDXGIFormat(\n      xenos::DepthRenderTargetFormat format);\n  static DXGI_FORMAT GetDepthSRVStencilDXGIFormat(\n      xenos::DepthRenderTargetFormat format);\n\n protected:\n  bool IsGammaFormatHostStorageSeparate() const override;\n\n  uint32_t GetMaxRenderTargetWidth() const override {\n    return D3D12_REQ_TEXTURE2D_U_OR_V_DIMENSION;\n  }\n  uint32_t GetMaxRenderTargetHeight() const override {\n    return D3D12_REQ_TEXTURE2D_U_OR_V_DIMENSION;\n  }\n\n  RenderTarget* CreateRenderTarget(RenderTargetKey key) override;\n\n  bool IsHostDepthEncodingDifferent(\n      xenos::DepthRenderTargetFormat format) const override;\n\n  void RequestPixelShaderInterlockBarrier() override;\n\n private:\n  enum class EdramBufferModificationStatus {\n    // The values are ordered by how strong the barrier conditions are.\n    // No uncommitted ROV/UAV writes.\n    kUnmodified,\n    // Need to commit before the next ROV usage with overlap.\n    kAsROV,\n    // Need to commit before any next ROV usage.\n    kAsUAV,\n  };\n  void TransitionEdramBuffer(D3D12_RESOURCE_STATES new_state);\n  void MarkEdramBufferModified(\n      EdramBufferModificationStatus modification_status =\n          EdramBufferModificationStatus::kAsUAV);\n  void CommitEdramBufferUAVWrites(EdramBufferModificationStatus commit_status =\n                                      EdramBufferModificationStatus::kAsROV);\n\n  D3D12CommandProcessor& command_processor_;\n  TraceWriter& trace_writer_;\n  bool bindless_resources_used_;\n\n  Path path_ = Path::kHostRenderTargets;\n\n  // For host render targets, an EDRAM-sized scratch buffer for:\n  // - Guest render target data copied from host render targets during copying\n  //   in resolves and in frame trace creation.\n  // - Host float32 depth in ownership transfers when the host depth texture and\n  //   the destination are the same.\n  // For rasterizer-ordered view, the buffer containing the EDRAM data.\n  // (Note that if a hybrid RTV / DSV + ROV approach to color render targets is\n  //  added, which is, however, unlikely as it would have very complicated\n  //  interaction with depth / stencil testing, host depth will need to be\n  //  copied to a different buffer - the same range may have ROV-owned color and\n  //  host float32 depth at the same time).\n  ID3D12Resource* edram_buffer_ = nullptr;\n  D3D12_GPU_VIRTUAL_ADDRESS edram_buffer_gpu_address_ = 0;\n  D3D12_RESOURCE_STATES edram_buffer_state_;\n  EdramBufferModificationStatus edram_buffer_modification_status_ =\n      EdramBufferModificationStatus::kUnmodified;\n\n  // Non-shader-visible descriptor heap containing pre-created SRV and UAV\n  // descriptors of the EDRAM buffer, for faster binding (by copying rather\n  // than creation).\n  enum class EdramBufferDescriptorIndex : uint32_t {\n    kRawSRV,\n    kR32UintSRV,\n    kR32G32UintSRV,\n    kR32G32B32A32UintSRV,\n    kRawUAV,\n    kR32UintUAV,\n    kR32G32UintUAV,\n    kR32G32B32A32UintUAV,\n\n    kCount,\n  };\n  ID3D12DescriptorHeap* edram_buffer_descriptor_heap_ = nullptr;\n  D3D12_CPU_DESCRIPTOR_HANDLE edram_buffer_descriptor_heap_start_;\n\n  // Resolve copying root signature and pipelines.\n  // Parameter 0 - draw_util::ResolveCopyShaderConstants or its ::DestRelative.\n  // Parameter 1 - destination (shared memory or a part of it).\n  // Parameter 2 - source (EDRAM).\n  ID3D12RootSignature* resolve_copy_root_signature_ = nullptr;\n  struct ResolveCopyShaderCode {\n    const void* unscaled;\n    size_t unscaled_size;\n    const void* scaled;\n    size_t scaled_size;\n  };\n  static const ResolveCopyShaderCode\n      kResolveCopyShaders[size_t(draw_util::ResolveCopyShaderIndex::kCount)];\n  ID3D12PipelineState* resolve_copy_pipelines_[size_t(\n      draw_util::ResolveCopyShaderIndex::kCount)] = {};\n\n  // For traces.\n  ID3D12Resource* edram_snapshot_download_buffer_ = nullptr;\n  std::unique_ptr<ui::d3d12::D3D12UploadBufferPool>\n      edram_snapshot_restore_pool_;\n\n  // For host render targets.\n\n  class D3D12RenderTarget final : public RenderTarget {\n   public:\n    // descriptor_load is present when the DXGI formats are different for\n    // drawing and bit-exact loading (for NaN pattern preservation across EDRAM\n    // tile ownership transfers in floating-point formats, and to distinguish\n    // between two -1 representations in snorm formats).\n    D3D12RenderTarget(\n        RenderTargetKey key, ID3D12Resource* resource,\n        ui::d3d12::D3D12CpuDescriptorPool::Descriptor&& descriptor_draw,\n        ui::d3d12::D3D12CpuDescriptorPool::Descriptor&&\n            descriptor_load_separate,\n        ui::d3d12::D3D12CpuDescriptorPool::Descriptor&& descriptor_srv,\n        ui::d3d12::D3D12CpuDescriptorPool::Descriptor&& descriptor_srv_stencil,\n        D3D12_RESOURCE_STATES resource_state)\n        : RenderTarget(key),\n          resource_(resource),\n          descriptor_draw_(std::move(descriptor_draw)),\n          descriptor_load_separate_(std::move(descriptor_load_separate)),\n          descriptor_srv_(std::move(descriptor_srv)),\n          descriptor_srv_stencil_(std::move(descriptor_srv_stencil)),\n          resource_state_(resource_state) {}\n\n    ID3D12Resource* resource() const { return resource_.Get(); }\n    const ui::d3d12::D3D12CpuDescriptorPool::Descriptor& descriptor_draw()\n        const {\n      return descriptor_draw_;\n    }\n    const ui::d3d12::D3D12CpuDescriptorPool::Descriptor& descriptor_srv()\n        const {\n      return descriptor_srv_;\n    }\n    const ui::d3d12::D3D12CpuDescriptorPool::Descriptor&\n    descriptor_srv_stencil() const {\n      return descriptor_srv_stencil_;\n    }\n    const ui::d3d12::D3D12CpuDescriptorPool::Descriptor&\n    descriptor_load_separate() const {\n      return descriptor_load_separate_;\n    }\n\n    D3D12_RESOURCE_STATES SetResourceState(D3D12_RESOURCE_STATES new_state) {\n      D3D12_RESOURCE_STATES old_state = resource_state_;\n      resource_state_ = new_state;\n      return old_state;\n    }\n\n    uint32_t temporary_srv_descriptor_index() const {\n      return temporary_srv_descriptor_index_;\n    }\n    void SetTemporarySRVDescriptorIndex(uint32_t index) {\n      temporary_srv_descriptor_index_ = index;\n    }\n    uint32_t temporary_srv_descriptor_index_stencil() const {\n      return temporary_srv_descriptor_index_stencil_;\n    }\n    void SetTemporarySRVDescriptorIndexStencil(uint32_t index) {\n      temporary_srv_descriptor_index_stencil_ = index;\n    }\n    uint32_t temporary_sort_index() const { return temporary_sort_index_; }\n    void SetTemporarySortIndex(uint32_t index) {\n      temporary_sort_index_ = index;\n    }\n\n   private:\n    Microsoft::WRL::ComPtr<ID3D12Resource> resource_;\n    ui::d3d12::D3D12CpuDescriptorPool::Descriptor descriptor_draw_;\n    ui::d3d12::D3D12CpuDescriptorPool::Descriptor descriptor_load_separate_;\n    // Texture SRV non-shader-visible descriptors, to prepare shader-visible\n    // descriptors faster, by copying rather than by creating every time.\n    // TODO(Triang3l): With bindless resources, persistently store them in the\n    // heap.\n    ui::d3d12::D3D12CpuDescriptorPool::Descriptor descriptor_srv_;\n    ui::d3d12::D3D12CpuDescriptorPool::Descriptor descriptor_srv_stencil_;\n    D3D12_RESOURCE_STATES resource_state_;\n    // Temporary storage for indices in operations like transfers and dumps.\n    uint32_t temporary_srv_descriptor_index_ = UINT32_MAX;\n    uint32_t temporary_srv_descriptor_index_stencil_ = UINT32_MAX;\n    uint32_t temporary_sort_index_ = 0;\n  };\n\n  enum TransferCBVRegister : uint32_t {\n    kTransferCBVRegisterStencilMask,\n    kTransferCBVRegisterAddress,\n    kTransferCBVRegisterHostDepthAddress,\n  };\n  enum TransferSRVRegister : uint32_t {\n    kTransferSRVRegisterColor,\n    kTransferSRVRegisterDepth,\n    kTransferSRVRegisterStencil,\n    kTransferSRVRegisterHostDepth,\n    kTransferSRVRegisterCount,\n  };\n  enum TransferUsedRootParameter : uint32_t {\n    // Changed 8 times per transfer.\n    kTransferUsedRootParameterStencilMaskConstant,\n    kTransferUsedRootParameterColorSRV,\n    // Mutually exclusive with ColorSRV.\n    kTransferUsedRootParameterDepthSRV,\n    // Mutually exclusive with ColorSRV.\n    kTransferUsedRootParameterStencilSRV,\n    // May happen to be the same for different sources.\n    kTransferUsedRootParameterAddressConstant,\n    kTransferUsedRootParameterHostDepthSRV,\n    kTransferUsedRootParameterHostDepthAddressConstant,\n    kTransferUsedRootParameterCount,\n\n    kTransferUsedRootParameterStencilMaskConstantBit =\n        uint32_t(1) << kTransferUsedRootParameterStencilMaskConstant,\n    kTransferUsedRootParameterColorSRVBit =\n        uint32_t(1) << kTransferUsedRootParameterColorSRV,\n    kTransferUsedRootParameterDepthSRVBit =\n        uint32_t(1) << kTransferUsedRootParameterDepthSRV,\n    kTransferUsedRootParameterStencilSRVBit =\n        uint32_t(1) << kTransferUsedRootParameterStencilSRV,\n    kTransferUsedRootParameterAddressConstantBit =\n        uint32_t(1) << kTransferUsedRootParameterAddressConstant,\n    kTransferUsedRootParameterHostDepthSRVBit =\n        uint32_t(1) << kTransferUsedRootParameterHostDepthSRV,\n    kTransferUsedRootParameterHostDepthAddressConstantBit =\n        uint32_t(1) << kTransferUsedRootParameterHostDepthAddressConstant,\n\n    kTransferUsedRootParametersDescriptorMask =\n        kTransferUsedRootParameterColorSRVBit |\n        kTransferUsedRootParameterDepthSRVBit |\n        kTransferUsedRootParameterStencilSRVBit |\n        kTransferUsedRootParameterHostDepthSRVBit,\n  };\n  enum class TransferRootSignatureIndex {\n    kColor,\n    kDepth,\n    kDepthStencil,\n    kColorToStencilBit,\n    kStencilToStencilBit,\n    kColorAndHostDepth,\n    kDepthAndHostDepth,\n    kDepthStencilAndHostDepth,\n    kCount,\n  };\n  static const uint32_t\n      kTransferUsedRootParameters[size_t(TransferRootSignatureIndex::kCount)];\n  enum class TransferMode : uint32_t {\n    // 1 SRV (color texture), source constant.\n    kColorToDepth,\n    // 1 SRV (color texture), source constant.\n    kColorToColor,\n\n    // 1 or 2 SRVs (depth texture, stencil texture if SV_StencilRef is\n    // supported), source constant.\n    kDepthToDepth,\n    // 2 SRVs (depth texture, stencil texture), source constant.\n    kDepthToColor,\n\n    // 1 SRV (color texture), mask constant (most frequently changed, 8 times\n    // per transfer), source constant.\n    kColorToStencilBit,\n    // 1 SRV (stencil texture), mask constant, source constant.\n    kDepthToStencilBit,\n\n    // Two-source modes, using the host depth if it, when converted to the guest\n    // format, matches what's in the owner source (not modified, keep host\n    // precision), or the guest data otherwise (significantly modified, possibly\n    // cleared). Stencil for SV_StencilRef is always taken from the guest\n    // source.\n\n    // 2 SRVs (color texture, host depth texture or buffer), source constant,\n    // host depth source constant.\n    kColorAndHostDepthToDepth,\n    // When using different source and destination depth formats. 2 or 3 SRVs\n    // (depth texture, stencil texture if SV_StencilRef is supported, host depth\n    // texture or buffer), source constant, host depth source constant.\n    kDepthAndHostDepthToDepth,\n\n    kCount,\n  };\n  enum class TransferOutput {\n    kColor,\n    kDepth,\n    // With this output, kTransferCBVRegisterStencilMask is used.\n    kStencilBit,\n  };\n  struct TransferModeInfo {\n    TransferOutput output;\n    TransferRootSignatureIndex root_signature_no_stencil_ref;\n    TransferRootSignatureIndex root_signature_with_stencil_ref;\n  };\n  static const TransferModeInfo kTransferModes[size_t(TransferMode::kCount)];\n\n  union TransferShaderKey {\n    uint32_t key;\n    struct {\n      xenos::MsaaSamples dest_msaa_samples : xenos::kMsaaSamplesBits;\n      uint32_t dest_resource_format : xenos::kRenderTargetFormatBits;\n      xenos::MsaaSamples source_msaa_samples : xenos::kMsaaSamplesBits;\n      // Always 1x when host_depth_source_is_copy is true not to create the same\n      // pipeline for different MSAA sample counts as it doesn't matter in this\n      // case.\n      xenos::MsaaSamples host_depth_source_msaa_samples\n          : xenos::kMsaaSamplesBits;\n      uint32_t source_resource_format : xenos::kRenderTargetFormatBits;\n      // If host depth is also fetched, whether it's pre-copied to the EDRAM\n      // buffer (but since it's just a scratch buffer, with tiles laid out\n      // linearly with the same pitch as in the original render target; also no\n      // swapping of 40-sample columns as opposed to the host render target -\n      // this is done only for the color source).\n      uint32_t host_depth_source_is_copy : 1;\n\n      // Last bits because this affects the root signature - after sorting, only\n      // change it as fewer times as possible. Depth buffers have an additional\n      // stencil SRV.\n      static_assert(size_t(TransferMode::kCount) <= (size_t(1) << 3));\n      TransferMode mode : 3;\n    };\n\n    TransferShaderKey() : key(0) { static_assert_size(*this, sizeof(key)); }\n\n    struct Hasher {\n      size_t operator()(const TransferShaderKey& key) const {\n        return std::hash<uint32_t>{}(key.key);\n      }\n    };\n    bool operator==(const TransferShaderKey& other_key) const {\n      return key == other_key.key;\n    }\n    bool operator!=(const TransferShaderKey& other_key) const {\n      return !(*this == other_key);\n    }\n    bool operator<(const TransferShaderKey& other_key) const {\n      return key < other_key.key;\n    }\n  };\n\n  union TransferAddressConstant {\n    uint32_t constant;\n    struct {\n      // All in tiles.\n      uint32_t dest_pitch : xenos::kEdramPitchTilesBits;\n      uint32_t source_pitch : xenos::kEdramPitchTilesBits;\n      // Destination base in tiles minus source base in tiles (not vice versa\n      // because this is a transform of the coordinate system, not addresses\n      // themselves).\n      // + 1 bit because this is a signed difference between two EDRAM bases.\n      // 0 for host_depth_source_is_copy (ignored in this case anyway as\n      // destination == source anyway).\n      int32_t source_to_dest : xenos::kEdramBaseTilesBits + 1;\n    };\n    TransferAddressConstant() : constant(0) {\n      static_assert_size(*this, sizeof(constant));\n    }\n    bool operator==(const TransferAddressConstant& other_constant) const {\n      return constant == other_constant.constant;\n    }\n    bool operator!=(const TransferAddressConstant& other_constant) const {\n      return !(*this == other_constant);\n    }\n  };\n\n  struct TransferInvocation {\n    Transfer transfer;\n    TransferShaderKey shader_key;\n    TransferInvocation(const Transfer& transfer,\n                       const TransferShaderKey& shader_key)\n        : transfer(transfer), shader_key(shader_key) {}\n    bool operator<(const TransferInvocation& other_invocation) const {\n      // TODO(Triang3l): See if it may be better to sort by the source in the\n      // first place, especially when reading the same data multiple times (like\n      // to write the stencil bits after depth) for better read locality.\n      // Sort by the shader key primarily to reduce pipeline state (context)\n      // switches.\n      if (shader_key != other_invocation.shader_key) {\n        return shader_key < other_invocation.shader_key;\n      }\n      // Host depth render targets are changed rarely if they exist, won't save\n      // many binding changes, ignore them for simplicity (their existence is\n      // caught by the shader key change).\n      assert_not_null(transfer.source);\n      assert_not_null(other_invocation.transfer.source);\n      uint32_t source_index =\n          static_cast<const D3D12RenderTarget*>(transfer.source)\n              ->temporary_sort_index();\n      uint32_t other_source_index = static_cast<const D3D12RenderTarget*>(\n                                        other_invocation.transfer.source)\n                                        ->temporary_sort_index();\n      if (source_index != other_source_index) {\n        return source_index < other_source_index;\n      }\n      return transfer.start_tiles < other_invocation.transfer.start_tiles;\n    }\n    bool CanBeMergedIntoOneDraw(\n        const TransferInvocation& other_invocation) const {\n      return shader_key == other_invocation.shader_key &&\n             transfer.AreSourcesSame(other_invocation.transfer);\n    }\n  };\n\n  enum {\n    kHostDepthStoreRootParameterConstants,\n    kHostDepthStoreRootParameterSource,\n    kHostDepthStoreRootParameterDest,\n    kHostDepthStoreRootParameterCount,\n  };\n\n  union DumpPipelineKey {\n    uint32_t key;\n    struct {\n      xenos::MsaaSamples msaa_samples : 2;\n      uint32_t resource_format : 4;\n      // Last bit because this affects the root signature - after sorting, only\n      // change it at most once. Depth buffers have an additional stencil SRV.\n      uint32_t is_depth : 1;\n    };\n\n    DumpPipelineKey() : key(0) { static_assert_size(*this, sizeof(key)); }\n\n    struct Hasher {\n      size_t operator()(const DumpPipelineKey& key) const {\n        return std::hash<uint32_t>{}(key.key);\n      }\n    };\n    bool operator==(const DumpPipelineKey& other_key) const {\n      return key == other_key.key;\n    }\n    bool operator!=(const DumpPipelineKey& other_key) const {\n      return !(*this == other_key);\n    }\n    bool operator<(const DumpPipelineKey& other_key) const {\n      return key < other_key.key;\n    }\n\n    xenos::ColorRenderTargetFormat GetColorFormat() const {\n      assert_false(is_depth);\n      return xenos::ColorRenderTargetFormat(resource_format);\n    }\n    xenos::DepthRenderTargetFormat GetDepthFormat() const {\n      assert_true(is_depth);\n      return xenos::DepthRenderTargetFormat(resource_format);\n    }\n  };\n\n  union DumpOffsets {\n    uint32_t offsets;\n    struct {\n      // May be beyond the EDRAM tile count in case of EDRAM addressing\n      // wrapping, thus + 1 bit.\n      uint32_t dispatch_first_tile : xenos::kEdramBaseTilesBits + 1;\n      uint32_t source_base_tiles : xenos::kEdramBaseTilesBits;\n    };\n    DumpOffsets() : offsets(0) { static_assert_size(*this, sizeof(offsets)); }\n    bool operator==(const DumpOffsets& other_offsets) const {\n      return offsets == other_offsets.offsets;\n    }\n    bool operator!=(const DumpOffsets& other_offsets) const {\n      return !(*this == other_offsets);\n    }\n  };\n\n  union DumpPitches {\n    uint32_t pitches;\n    struct {\n      // Both in tiles.\n      uint32_t dest_pitch : xenos::kEdramPitchTilesBits;\n      uint32_t source_pitch : xenos::kEdramPitchTilesBits;\n    };\n    DumpPitches() : pitches(0) { static_assert_size(*this, sizeof(pitches)); }\n    bool operator==(const DumpPitches& other_pitches) const {\n      return pitches == other_pitches.pitches;\n    }\n    bool operator!=(const DumpPitches& other_pitches) const {\n      return !(*this == other_pitches);\n    }\n  };\n\n  enum DumpCbuffer : uint32_t {\n    kDumpCbufferOffsets,\n    kDumpCbufferPitches,\n    kDumpCbufferCount,\n  };\n\n  enum DumpRootParameter : uint32_t {\n    // May be changed multiple times for the same source.\n    kDumpRootParameterOffsets,\n    // One resolve may need multiple sources.\n    kDumpRootParameterSource,\n\n    // May be different for different sources.\n    kDumpRootParameterColorPitches = kDumpRootParameterSource + 1,\n    // Not changed.\n    kDumpRootParameterColorEdram,\n\n    kDumpRootParameterColorCount,\n\n    // Same change frequency than the source (though currently the command\n    // processor can't contiguously allocate multiple descriptors with bindless,\n    // when such functionality is added, switch to one root signature).\n    kDumpRootParameterDepthStencil = kDumpRootParameterSource + 1,\n    kDumpRootParameterDepthPitches,\n    kDumpRootParameterDepthEdram,\n\n    kDumpRootParameterDepthCount,\n  };\n\n  struct DumpInvocation {\n    ResolveCopyDumpRectangle rectangle;\n    DumpPipelineKey pipeline_key;\n    DumpInvocation(const ResolveCopyDumpRectangle& rectangle,\n                   const DumpPipelineKey& pipeline_key)\n        : rectangle(rectangle), pipeline_key(pipeline_key) {}\n    bool operator<(const DumpInvocation& other_invocation) const {\n      // Sort by the pipeline key primarily to reduce pipeline state (context)\n      // switches.\n      if (pipeline_key != other_invocation.pipeline_key) {\n        return pipeline_key < other_invocation.pipeline_key;\n      }\n      assert_not_null(rectangle.render_target);\n      uint32_t render_target_index =\n          static_cast<const D3D12RenderTarget*>(rectangle.render_target)\n              ->temporary_sort_index();\n      const ResolveCopyDumpRectangle& other_rectangle =\n          other_invocation.rectangle;\n      uint32_t other_render_target_index =\n          static_cast<const D3D12RenderTarget*>(other_rectangle.render_target)\n              ->temporary_sort_index();\n      if (render_target_index != other_render_target_index) {\n        return render_target_index < other_render_target_index;\n      }\n      if (rectangle.row_first != other_rectangle.row_first) {\n        return rectangle.row_first < other_rectangle.row_first;\n      }\n      return rectangle.row_first_start < other_rectangle.row_first_start;\n    }\n  };\n\n  // Returns:\n  // - A pointer to 1 pipeline for writing color or depth (or stencil via\n  //   SV_StencilRef).\n  // - A pointer to 8 pipelines for writing stencil by discarding samples\n  //   depending on whether they have one bit set, from 1 << 0 to 1 << 7.\n  // - Null if failed to create.\n  ID3D12PipelineState* const* GetOrCreateTransferPipelines(\n      TransferShaderKey key);\n\n  static TransferMode GetTransferMode(bool dest_is_stencil_bit,\n                                      bool dest_is_depth, bool source_is_depth,\n                                      bool source_has_host_depth) {\n    assert_true(dest_is_depth ||\n                (!dest_is_stencil_bit && !source_has_host_depth));\n    if (dest_is_stencil_bit) {\n      return source_is_depth ? TransferMode::kDepthToStencilBit\n                             : TransferMode::kColorToStencilBit;\n    }\n    if (dest_is_depth) {\n      if (source_is_depth) {\n        return source_has_host_depth ? TransferMode::kDepthAndHostDepthToDepth\n                                     : TransferMode::kDepthToDepth;\n      }\n      return source_has_host_depth ? TransferMode::kColorAndHostDepthToDepth\n                                   : TransferMode::kColorToDepth;\n    }\n    return source_is_depth ? TransferMode::kDepthToColor\n                           : TransferMode::kColorToColor;\n  }\n\n  // Do ownership transfers for render targets - each render target / vector may\n  // be null / empty in case there's nothing to do for them.\n  // resolve_clear_rectangle is expected to be provided by\n  // PrepareHostRenderTargetsResolveClear which should do all the needed size\n  // bound checks.\n  void PerformTransfersAndResolveClears(\n      uint32_t render_target_count, RenderTarget* const* render_targets,\n      const std::vector<Transfer>* render_target_transfers,\n      const uint64_t* render_target_resolve_clear_values = nullptr,\n      const Transfer::Rectangle* resolve_clear_rectangle = nullptr);\n\n  // Accepts an array of (1 + xenos::kMaxColorRenderTargets) render targets,\n  // first depth, then color.\n  void SetCommandListRenderTargets(\n      RenderTarget* const* depth_and_color_render_targets);\n\n  ID3D12PipelineState* GetOrCreateDumpPipeline(DumpPipelineKey key);\n\n  // Writes contents of host render targets within rectangles from\n  // ResolveInfo::GetCopyEdramTileSpan to edram_buffer_.\n  void DumpRenderTargets(uint32_t dump_base, uint32_t dump_row_length_used,\n                         uint32_t dump_rows, uint32_t dump_pitch);\n\n  bool use_stencil_reference_output_ = false;\n\n  bool gamma_render_target_as_unorm16_ = false;\n\n  bool depth_float24_round_ = false;\n  bool depth_float24_convert_in_pixel_shader_ = false;\n\n  bool msaa_2x_supported_ = false;\n\n  std::shared_ptr<ui::d3d12::D3D12CpuDescriptorPool> descriptor_pool_color_;\n  std::shared_ptr<ui::d3d12::D3D12CpuDescriptorPool> descriptor_pool_depth_;\n  std::shared_ptr<ui::d3d12::D3D12CpuDescriptorPool> descriptor_pool_srv_;\n  ui::d3d12::D3D12CpuDescriptorPool::Descriptor null_rtv_descriptor_ss_;\n  ui::d3d12::D3D12CpuDescriptorPool::Descriptor null_rtv_descriptor_ms_;\n\n  // Possible tile ownership transfer paths:\n  // - To color:\n  //   - From color: 1 SRV (color).\n  //   - From depth: 2 SRVs (depth, stencil).\n  // - To depth / stencil (with SV_StencilRef):\n  //   - From color: 1 SRV (color).\n  //   - From depth: 2 SRVs (depth, stencil).\n  //   - From color and float32 depth: 2 SRVs (color with stencil, depth).\n  //     - Different depth buffer: depth SRV is a texture.\n  //     - Same depth buffer: depth SRV is a buffer (pre-copied).\n  // - To depth (no SV_StencilRef):\n  //   - From color: 1 SRV (color).\n  //   - From depth: 1 SRV (depth).\n  //   - From color and float32 depth: 2 SRVs (color, depth).\n  //     - Different depth buffer: depth SRV is a texture.\n  //     - Same depth buffer: depth SRV is a buffer (pre-copied).\n  // - To stencil (no SV_StencilRef):\n  //   - From color: 1 SRV (color).\n  //   - From depth: 1 SRV (stencil).\n\n  const RenderTarget* const*\n      current_command_list_render_targets_[1 + xenos::kMaxColorRenderTargets];\n  bool are_current_command_list_render_targets_valid_ = false;\n\n  // Temporary storage for descriptors used in PerformTransfersAndResolveClears\n  // and DumpRenderTargets.\n  std::vector<D3D12_CPU_DESCRIPTOR_HANDLE> current_temporary_descriptors_cpu_;\n  std::vector<ui::d3d12::util::DescriptorCpuGpuHandlePair>\n      current_temporary_descriptors_gpu_;\n\n  ID3D12RootSignature* host_depth_store_root_signature_ = nullptr;\n  ID3D12PipelineState*\n      host_depth_store_pipelines_[size_t(xenos::MsaaSamples::k4X) + 1] = {};\n\n  std::unique_ptr<ui::d3d12::D3D12UploadBufferPool>\n      transfer_vertex_buffer_pool_;\n\n  ID3D12RootSignature* transfer_root_signatures_[size_t(\n      TransferRootSignatureIndex::kCount)] = {};\n  std::unordered_map<TransferShaderKey, ID3D12PipelineState*,\n                     TransferShaderKey::Hasher>\n      transfer_pipelines_;\n  std::unordered_map<TransferShaderKey, std::array<ID3D12PipelineState*, 8>,\n                     TransferShaderKey::Hasher>\n      transfer_stencil_bit_pipelines_;\n\n  // Temporary storage for PerformTransfersAndResolveClears.\n  std::vector<TransferInvocation> current_transfer_invocations_;\n\n  // Temporary storage for DumpRenderTargets.\n  std::vector<ResolveCopyDumpRectangle> dump_rectangles_;\n  std::vector<DumpInvocation> dump_invocations_;\n\n  ID3D12RootSignature* dump_root_signature_color_ = nullptr;\n  ID3D12RootSignature* dump_root_signature_depth_ = nullptr;\n  // Compute pipelines for copying host render target contents to the EDRAM\n  // buffer. May be null if failed to create.\n  std::unordered_map<DumpPipelineKey, ID3D12PipelineState*,\n                     DumpPipelineKey::Hasher>\n      dump_pipelines_;\n\n  // Parameter 0 - 2 root constants (red, green).\n  ID3D12RootSignature* uint32_rtv_clear_root_signature_ = nullptr;\n  // [32 or 32_32][MSAA samples].\n  ID3D12PipelineState*\n      uint32_rtv_clear_pipelines_[2][size_t(xenos::MsaaSamples::k4X) + 1] = {};\n\n  std::vector<Transfer> clear_transfers_[2];\n\n  // Temporary storage for DXBC building.\n  std::vector<uint32_t> built_shader_;\n\n  // For rasterizer-ordered view (pixel shader interlock).\n\n  ID3D12RootSignature* resolve_rov_clear_root_signature_ = nullptr;\n  // Clearing 32bpp color or depth.\n  ID3D12PipelineState* resolve_rov_clear_32bpp_pipeline_ = nullptr;\n  // Clearing 64bpp color.\n  ID3D12PipelineState* resolve_rov_clear_64bpp_pipeline_ = nullptr;\n};\n\n}  // namespace d3d12\n}  // namespace gpu\n}  // namespace xe\n\n#endif  // XENIA_GPU_D3D12_D3D12_RENDER_TARGET_CACHE_H_\n"
  },
  {
    "path": "src/xenia/gpu/d3d12/d3d12_shader.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2018 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/d3d12/d3d12_shader.h\"\n\n#include <cstring>\n#include <utility>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/gpu/dxbc_shader.h\"\n#include \"xenia/gpu/gpu_flags.h\"\n#include \"xenia/ui/d3d12/d3d12_api.h\"\n\nnamespace xe {\nnamespace gpu {\nnamespace d3d12 {\n\nD3D12Shader::D3D12Shader(xenos::ShaderType shader_type,\n                         uint64_t ucode_data_hash, const uint32_t* ucode_dwords,\n                         size_t ucode_dword_count,\n                         std::endian ucode_source_endian)\n    : DxbcShader(shader_type, ucode_data_hash, ucode_dwords, ucode_dword_count,\n                 ucode_source_endian) {}\n\nvoid D3D12Shader::D3D12Translation::DisassembleDxbcAndDxil(\n    const ui::d3d12::D3D12Provider& provider, bool disassemble_dxbc,\n    IDxbcConverter* dxbc_converter, IDxcUtils* dxc_utils,\n    IDxcCompiler* dxc_compiler) {\n  std::string disassembly;\n  bool is_first_disassembly = true;\n  if (disassemble_dxbc) {\n    ID3DBlob* dxbc_disassembly;\n    if (SUCCEEDED(provider.Disassemble(translated_binary().data(),\n                                       translated_binary().size(),\n                                       D3D_DISASM_ENABLE_INSTRUCTION_NUMBERING |\n                                           D3D_DISASM_ENABLE_INSTRUCTION_OFFSET,\n                                       nullptr, &dxbc_disassembly))) {\n      assert_true(is_first_disassembly);\n      is_first_disassembly = false;\n      disassembly.append(\n          reinterpret_cast<const char*>(dxbc_disassembly->GetBufferPointer()));\n      dxbc_disassembly->Release();\n    } else {\n      XELOGE(\"Failed to disassemble DXBC shader {:016X}\",\n             shader().ucode_data_hash());\n    }\n  }\n  if (dxbc_converter && dxc_utils && dxc_compiler) {\n    void* dxil;\n    UINT32 dxil_size;\n    if (SUCCEEDED(dxbc_converter->Convert(\n            translated_binary().data(), UINT32(translated_binary().size()),\n            nullptr, &dxil, &dxil_size, nullptr)) &&\n        dxil != nullptr) {\n      IDxcBlobEncoding* dxil_blob;\n      if (SUCCEEDED(dxc_utils->CreateBlobFromPinned(dxil, dxil_size, DXC_CP_ACP,\n                                                    &dxil_blob))) {\n        IDxcBlobEncoding* dxil_disassembly;\n        bool dxil_disassembled =\n            SUCCEEDED(dxc_compiler->Disassemble(dxil_blob, &dxil_disassembly));\n        dxil_blob->Release();\n        CoTaskMemFree(dxil);\n        if (dxil_disassembled) {\n          IDxcBlobUtf8* dxil_disassembly_utf8;\n          bool dxil_disassembly_got_utf8 = SUCCEEDED(dxc_utils->GetBlobAsUtf8(\n              dxil_disassembly, &dxil_disassembly_utf8));\n          dxil_disassembly->Release();\n          if (dxil_disassembly_got_utf8) {\n            if (!is_first_disassembly) {\n              disassembly.append(\"\\n\\n\");\n            }\n            is_first_disassembly = false;\n            disassembly.append(reinterpret_cast<const char*>(\n                dxil_disassembly_utf8->GetStringPointer()));\n            dxil_disassembly_utf8->Release();\n          } else {\n            XELOGE(\"Failed to get DXIL shader {:016X} disassembly as UTF-8\",\n                   shader().ucode_data_hash());\n          }\n        } else {\n          XELOGE(\"Failed to disassemble DXIL shader {:016X}\",\n                 shader().ucode_data_hash());\n        }\n      } else {\n        XELOGE(\"Failed to create a blob with DXIL shader {:016X}\",\n               shader().ucode_data_hash());\n        CoTaskMemFree(dxil);\n      }\n    } else {\n      XELOGE(\"Failed to convert shader {:016X} to DXIL\",\n             shader().ucode_data_hash());\n    }\n  }\n  set_host_disassembly(std::move(disassembly));\n}\n\nShader::Translation* D3D12Shader::CreateTranslationInstance(\n    uint64_t modification) {\n  return new D3D12Translation(*this, modification);\n}\n\n}  // namespace d3d12\n}  // namespace gpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/d3d12/d3d12_shader.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_D3D12_D3D12_SHADER_H_\n#define XENIA_GPU_D3D12_D3D12_SHADER_H_\n\n#include <atomic>\n\n#include \"xenia/gpu/dxbc_shader.h\"\n#include \"xenia/ui/d3d12/d3d12_provider.h\"\n\nnamespace xe {\nnamespace gpu {\nnamespace d3d12 {\n\nclass D3D12Shader : public DxbcShader {\n public:\n  class D3D12Translation : public DxbcTranslation {\n   public:\n    D3D12Translation(D3D12Shader& shader, uint64_t modification)\n        : DxbcTranslation(shader, modification) {}\n\n    void DisassembleDxbcAndDxil(const ui::d3d12::D3D12Provider& provider,\n                                bool disassemble_dxbc,\n                                IDxbcConverter* dxbc_converter = nullptr,\n                                IDxcUtils* dxc_utils = nullptr,\n                                IDxcCompiler* dxc_compiler = nullptr);\n  };\n\n  D3D12Shader(xenos::ShaderType shader_type, uint64_t ucode_data_hash,\n              const uint32_t* ucode_dwords, size_t ucode_dword_count,\n              std::endian ucode_source_endian = std::endian::big);\n\n  // For owning subsystem like the pipeline cache, accessors for unique\n  // identifiers (used instead of hashes to make sure collisions can't happen)\n  // of binding layouts used by the shader, for invalidation if a shader with an\n  // incompatible layout was bound.\n  size_t GetTextureBindingLayoutUserUID() const {\n    return texture_binding_layout_user_uid_;\n  }\n  size_t GetSamplerBindingLayoutUserUID() const {\n    return sampler_binding_layout_user_uid_;\n  }\n  // Modifications of the same shader can be translated on different threads.\n  // The \"set\" function must only be called if \"enter\" returned true - these are\n  // set up only once.\n  bool EnterBindingLayoutUserUIDSetup() {\n    return !binding_layout_user_uids_set_up_.test_and_set();\n  }\n  void SetTextureBindingLayoutUserUID(size_t uid) {\n    texture_binding_layout_user_uid_ = uid;\n  }\n  void SetSamplerBindingLayoutUserUID(size_t uid) {\n    sampler_binding_layout_user_uid_ = uid;\n  }\n\n protected:\n  Translation* CreateTranslationInstance(uint64_t modification) override;\n\n private:\n  std::atomic_flag binding_layout_user_uids_set_up_ = ATOMIC_FLAG_INIT;\n  size_t texture_binding_layout_user_uid_ = 0;\n  size_t sampler_binding_layout_user_uid_ = 0;\n};\n\n}  // namespace d3d12\n}  // namespace gpu\n}  // namespace xe\n\n#endif  // XENIA_GPU_D3D12_D3D12_SHADER_H_\n"
  },
  {
    "path": "src/xenia/gpu/d3d12/d3d12_shared_memory.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/d3d12/d3d12_shared_memory.h\"\n\n#include <cstring>\n#include <utility>\n#include <vector>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/cvar.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/gpu/d3d12/d3d12_command_processor.h\"\n#include \"xenia/ui/d3d12/d3d12_util.h\"\n\nDEFINE_bool(d3d12_tiled_shared_memory, true,\n            \"Enable tiled resources for shared memory emulation. Disabling \"\n            \"them increases video memory usage - a 512 MB buffer is created - \"\n            \"but allows graphics debuggers that don't support tiled resources \"\n            \"to work.\",\n            \"D3D12\");\n\nnamespace xe {\nnamespace gpu {\nnamespace d3d12 {\n\nD3D12SharedMemory::D3D12SharedMemory(D3D12CommandProcessor& command_processor,\n                                     Memory& memory, TraceWriter& trace_writer)\n    : SharedMemory(memory),\n      command_processor_(command_processor),\n      trace_writer_(trace_writer) {}\n\nD3D12SharedMemory::~D3D12SharedMemory() { Shutdown(true); }\n\nbool D3D12SharedMemory::Initialize() {\n  InitializeCommon();\n\n  const ui::d3d12::D3D12Provider& provider =\n      command_processor_.GetD3D12Provider();\n  ID3D12Device* device = provider.GetDevice();\n\n  D3D12_RESOURCE_DESC buffer_desc;\n  ui::d3d12::util::FillBufferResourceDesc(\n      buffer_desc, kBufferSize, D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS);\n  buffer_state_ = D3D12_RESOURCE_STATE_COPY_DEST;\n  if (cvars::d3d12_tiled_shared_memory &&\n      provider.GetTiledResourcesTier() !=\n          D3D12_TILED_RESOURCES_TIER_NOT_SUPPORTED &&\n      !provider.GetGraphicsAnalysis()) {\n    if (FAILED(device->CreateReservedResource(\n            &buffer_desc, buffer_state_, nullptr, IID_PPV_ARGS(&buffer_)))) {\n      XELOGE(\"Shared memory: Failed to create the {} MB tiled buffer\",\n             kBufferSize >> 20);\n      Shutdown();\n      return false;\n    }\n    static_assert(D3D12_TILED_RESOURCE_TILE_SIZE_IN_BYTES == (1 << 16));\n    InitializeSparseHostGpuMemory(\n        std::max(kHostGpuMemoryOptimalSparseAllocationLog2, uint32_t(16)));\n  } else {\n    XELOGGPU(\n        \"Direct3D 12 tiled resources are not used for shared memory \"\n        \"emulation - video memory usage may increase significantly \"\n        \"because a full {} MB buffer will be created\",\n        kBufferSize >> 20);\n    if (provider.GetGraphicsAnalysis()) {\n      // As of October 8th, 2018, PIX doesn't support tiled buffers.\n      // FIXME(Triang3l): Re-enable tiled resources with PIX once fixed.\n      XELOGGPU(\n          \"This is caused by PIX being attached, which doesn't support tiled \"\n          \"resources yet.\");\n    }\n    if (FAILED(device->CreateCommittedResource(\n            &ui::d3d12::util::kHeapPropertiesDefault,\n            provider.GetHeapFlagCreateNotZeroed(), &buffer_desc, buffer_state_,\n            nullptr, IID_PPV_ARGS(&buffer_)))) {\n      XELOGE(\"Shared memory: Failed to create the {} MB buffer\",\n             kBufferSize >> 20);\n      Shutdown();\n      return false;\n    }\n  }\n  buffer_gpu_address_ = buffer_->GetGPUVirtualAddress();\n  buffer_uav_writes_commit_needed_ = false;\n\n  D3D12_DESCRIPTOR_HEAP_DESC buffer_descriptor_heap_desc;\n  buffer_descriptor_heap_desc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV;\n  buffer_descriptor_heap_desc.NumDescriptors =\n      uint32_t(BufferDescriptorIndex::kCount);\n  buffer_descriptor_heap_desc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE;\n  buffer_descriptor_heap_desc.NodeMask = 0;\n  if (FAILED(device->CreateDescriptorHeap(\n          &buffer_descriptor_heap_desc,\n          IID_PPV_ARGS(&buffer_descriptor_heap_)))) {\n    XELOGE(\n        \"Shared memory: Failed to create the descriptor heap for buffer views\");\n    Shutdown();\n    return false;\n  }\n  buffer_descriptor_heap_start_ =\n      buffer_descriptor_heap_->GetCPUDescriptorHandleForHeapStart();\n  ui::d3d12::util::CreateBufferRawSRV(\n      device,\n      provider.OffsetViewDescriptor(buffer_descriptor_heap_start_,\n                                    uint32_t(BufferDescriptorIndex::kRawSRV)),\n      buffer_, kBufferSize);\n  ui::d3d12::util::CreateBufferRawUAV(\n      device,\n      provider.OffsetViewDescriptor(buffer_descriptor_heap_start_,\n                                    uint32_t(BufferDescriptorIndex::kRawUAV)),\n      buffer_, kBufferSize);\n\n  upload_buffer_pool_ = std::make_unique<ui::d3d12::D3D12UploadBufferPool>(\n      provider, xe::align(ui::d3d12::D3D12UploadBufferPool::kDefaultPageSize,\n                          size_t(1) << page_size_log2()));\n\n  return true;\n}\n\nvoid D3D12SharedMemory::Shutdown(bool from_destructor) {\n  ResetTraceDownload();\n\n  upload_buffer_pool_.reset();\n\n  ui::d3d12::util::ReleaseAndNull(buffer_descriptor_heap_);\n\n  // First free the buffer to detach it from the heaps.\n  ui::d3d12::util::ReleaseAndNull(buffer_);\n\n  for (ID3D12Heap* heap : buffer_tiled_heaps_) {\n    heap->Release();\n  }\n  buffer_tiled_heaps_.clear();\n\n  // If calling from the destructor, the SharedMemory destructor will call\n  // ShutdownCommon.\n  if (!from_destructor) {\n    ShutdownCommon();\n  }\n}\n\nvoid D3D12SharedMemory::ClearCache() {\n  SharedMemory::ClearCache();\n\n  upload_buffer_pool_->ClearCache();\n}\n\nvoid D3D12SharedMemory::CompletedSubmissionUpdated() {\n  upload_buffer_pool_->Reclaim(command_processor_.GetCompletedSubmission());\n}\n\nvoid D3D12SharedMemory::BeginSubmission() {\n  // ExecuteCommandLists is a full UAV barrier.\n  buffer_uav_writes_commit_needed_ = false;\n}\n\nvoid D3D12SharedMemory::CommitUAVWritesAndTransitionBuffer(\n    D3D12_RESOURCE_STATES new_state) {\n  if (buffer_state_ == new_state) {\n    if (new_state == D3D12_RESOURCE_STATE_UNORDERED_ACCESS &&\n        buffer_uav_writes_commit_needed_) {\n      command_processor_.PushUAVBarrier(buffer_);\n      buffer_uav_writes_commit_needed_ = false;\n    }\n    return;\n  }\n  command_processor_.PushTransitionBarrier(buffer_, buffer_state_, new_state);\n  buffer_state_ = new_state;\n  // \"UAV -> anything\" transition commits the writes implicitly.\n  buffer_uav_writes_commit_needed_ = false;\n}\n\nvoid D3D12SharedMemory::WriteRawSRVDescriptor(\n    D3D12_CPU_DESCRIPTOR_HANDLE handle) {\n  const ui::d3d12::D3D12Provider& provider =\n      command_processor_.GetD3D12Provider();\n  ID3D12Device* device = provider.GetDevice();\n  device->CopyDescriptorsSimple(\n      1, handle,\n      provider.OffsetViewDescriptor(buffer_descriptor_heap_start_,\n                                    uint32_t(BufferDescriptorIndex::kRawSRV)),\n      D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);\n}\n\nvoid D3D12SharedMemory::WriteRawUAVDescriptor(\n    D3D12_CPU_DESCRIPTOR_HANDLE handle) {\n  const ui::d3d12::D3D12Provider& provider =\n      command_processor_.GetD3D12Provider();\n  ID3D12Device* device = provider.GetDevice();\n  device->CopyDescriptorsSimple(\n      1, handle,\n      provider.OffsetViewDescriptor(buffer_descriptor_heap_start_,\n                                    uint32_t(BufferDescriptorIndex::kRawUAV)),\n      D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);\n}\n\nbool D3D12SharedMemory::InitializeTraceSubmitDownloads() {\n  ResetTraceDownload();\n  PrepareForTraceDownload();\n  uint32_t download_page_count = trace_download_page_count();\n  if (!download_page_count) {\n    return false;\n  }\n  D3D12_RESOURCE_DESC download_buffer_desc;\n  ui::d3d12::util::FillBufferResourceDesc(\n      download_buffer_desc, download_page_count << page_size_log2(),\n      D3D12_RESOURCE_FLAG_NONE);\n  const ui::d3d12::D3D12Provider& provider =\n      command_processor_.GetD3D12Provider();\n  ID3D12Device* device = provider.GetDevice();\n  if (FAILED(device->CreateCommittedResource(\n          &ui::d3d12::util::kHeapPropertiesReadback,\n          provider.GetHeapFlagCreateNotZeroed(), &download_buffer_desc,\n          D3D12_RESOURCE_STATE_COPY_DEST, nullptr,\n          IID_PPV_ARGS(&trace_download_buffer_)))) {\n    XELOGE(\n        \"Shared memory: Failed to create a {} KB GPU-written memory download \"\n        \"buffer for frame tracing\",\n        download_page_count << page_size_log2() >> 10);\n    ResetTraceDownload();\n    return false;\n  }\n  auto& command_list = command_processor_.GetDeferredCommandList();\n  UseAsCopySource();\n  command_processor_.SubmitBarriers();\n  uint32_t download_buffer_offset = 0;\n  for (const auto& download_range : trace_download_ranges()) {\n    command_list.D3DCopyBufferRegion(\n        trace_download_buffer_, download_buffer_offset, buffer_,\n        download_range.first, download_range.second);\n    download_buffer_offset += download_range.second;\n  }\n  return true;\n}\n\nvoid D3D12SharedMemory::InitializeTraceCompleteDownloads() {\n  if (!trace_download_buffer_) {\n    return;\n  }\n  void* download_mapping;\n  if (SUCCEEDED(trace_download_buffer_->Map(0, nullptr, &download_mapping))) {\n    uint32_t download_buffer_offset = 0;\n    for (const auto& download_range : trace_download_ranges()) {\n      trace_writer_.WriteMemoryRead(\n          download_range.first, download_range.second,\n          reinterpret_cast<const uint8_t*>(download_mapping) +\n              download_buffer_offset);\n    }\n    D3D12_RANGE download_write_range = {};\n    trace_download_buffer_->Unmap(0, &download_write_range);\n  } else {\n    XELOGE(\n        \"Shared memory: Failed to map the GPU-written memory download buffer \"\n        \"for frame tracing\");\n  }\n  ResetTraceDownload();\n}\n\nvoid D3D12SharedMemory::ResetTraceDownload() {\n  ui::d3d12::util::ReleaseAndNull(trace_download_buffer_);\n  ReleaseTraceDownloadRanges();\n}\n\nbool D3D12SharedMemory::AllocateSparseHostGpuMemoryRange(\n    uint32_t offset_allocations, uint32_t length_allocations) {\n  if (!length_allocations) {\n    return true;\n  }\n\n  uint32_t offset_bytes = offset_allocations\n                          << host_gpu_memory_sparse_granularity_log2();\n  uint32_t length_bytes = length_allocations\n                          << host_gpu_memory_sparse_granularity_log2();\n\n  const ui::d3d12::D3D12Provider& provider =\n      command_processor_.GetD3D12Provider();\n  ID3D12Device* device = provider.GetDevice();\n  ID3D12CommandQueue* direct_queue = provider.GetDirectQueue();\n\n  D3D12_HEAP_DESC heap_desc = {};\n  heap_desc.SizeInBytes = length_bytes;\n  heap_desc.Properties.Type = D3D12_HEAP_TYPE_DEFAULT;\n  heap_desc.Flags = D3D12_HEAP_FLAG_ALLOW_ONLY_BUFFERS |\n                    provider.GetHeapFlagCreateNotZeroed();\n  ID3D12Heap* heap;\n  if (FAILED(device->CreateHeap(&heap_desc, IID_PPV_ARGS(&heap)))) {\n    XELOGE(\"Shared memory: Failed to create a tile heap\");\n    return false;\n  }\n  buffer_tiled_heaps_.push_back(heap);\n\n  D3D12_TILED_RESOURCE_COORDINATE region_start_coordinates;\n  region_start_coordinates.X =\n      offset_bytes / D3D12_TILED_RESOURCE_TILE_SIZE_IN_BYTES;\n  region_start_coordinates.Y = 0;\n  region_start_coordinates.Z = 0;\n  region_start_coordinates.Subresource = 0;\n  D3D12_TILE_REGION_SIZE region_size;\n  region_size.NumTiles = length_bytes / D3D12_TILED_RESOURCE_TILE_SIZE_IN_BYTES;\n  region_size.UseBox = FALSE;\n  D3D12_TILE_RANGE_FLAGS range_flags = D3D12_TILE_RANGE_FLAG_NONE;\n  UINT heap_range_start_offset = 0;\n  direct_queue->UpdateTileMappings(\n      buffer_, 1, &region_start_coordinates, &region_size, heap, 1,\n      &range_flags, &heap_range_start_offset, &region_size.NumTiles,\n      D3D12_TILE_MAPPING_FLAG_NONE);\n  command_processor_.NotifyQueueOperationsDoneDirectly();\n  return true;\n}\n\nbool D3D12SharedMemory::UploadRanges(\n    const std::vector<std::pair<uint32_t, uint32_t>>& upload_page_ranges) {\n  if (upload_page_ranges.empty()) {\n    return true;\n  }\n  CommitUAVWritesAndTransitionBuffer(D3D12_RESOURCE_STATE_COPY_DEST);\n  command_processor_.SubmitBarriers();\n  auto& command_list = command_processor_.GetDeferredCommandList();\n  for (auto upload_range : upload_page_ranges) {\n    uint32_t upload_range_start = upload_range.first;\n    uint32_t upload_range_length = upload_range.second;\n    trace_writer_.WriteMemoryRead(upload_range_start << page_size_log2(),\n                                  upload_range_length << page_size_log2());\n    while (upload_range_length != 0) {\n      ID3D12Resource* upload_buffer;\n      size_t upload_buffer_offset, upload_buffer_size;\n      uint8_t* upload_buffer_mapping = upload_buffer_pool_->RequestPartial(\n          command_processor_.GetCurrentSubmission(),\n          upload_range_length << page_size_log2(),\n          size_t(1) << page_size_log2(), &upload_buffer, &upload_buffer_offset,\n          &upload_buffer_size, nullptr);\n      if (upload_buffer_mapping == nullptr) {\n        XELOGE(\"Shared memory: Failed to get an upload buffer\");\n        return false;\n      }\n      MakeRangeValid(upload_range_start << page_size_log2(),\n                     uint32_t(upload_buffer_size), false);\n      std::memcpy(\n          upload_buffer_mapping,\n          memory().TranslatePhysical(upload_range_start << page_size_log2()),\n          upload_buffer_size);\n      command_list.D3DCopyBufferRegion(\n          buffer_, upload_range_start << page_size_log2(), upload_buffer,\n          UINT64(upload_buffer_offset), UINT64(upload_buffer_size));\n      uint32_t upload_buffer_pages =\n          uint32_t(upload_buffer_size >> page_size_log2());\n      upload_range_start += upload_buffer_pages;\n      upload_range_length -= upload_buffer_pages;\n    }\n  }\n  return true;\n}\n\n}  // namespace d3d12\n}  // namespace gpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/d3d12/d3d12_shared_memory.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_D3D12_D3D12_SHARED_MEMORY_H_\n#define XENIA_GPU_D3D12_D3D12_SHARED_MEMORY_H_\n\n#include <algorithm>\n#include <memory>\n#include <utility>\n#include <vector>\n\n#include \"xenia/gpu/shared_memory.h\"\n#include \"xenia/gpu/trace_writer.h\"\n#include \"xenia/memory.h\"\n#include \"xenia/ui/d3d12/d3d12_api.h\"\n#include \"xenia/ui/d3d12/d3d12_upload_buffer_pool.h\"\n\nnamespace xe {\nnamespace gpu {\nnamespace d3d12 {\n\nclass D3D12CommandProcessor;\n\nclass D3D12SharedMemory : public SharedMemory {\n public:\n  D3D12SharedMemory(D3D12CommandProcessor& command_processor, Memory& memory,\n                    TraceWriter& trace_writer);\n  ~D3D12SharedMemory() override;\n\n  bool Initialize();\n  void Shutdown(bool from_destructor = false);\n  void ClearCache() override;\n\n  ID3D12Resource* GetBuffer() const { return buffer_; }\n  D3D12_GPU_VIRTUAL_ADDRESS GetGPUAddress() const {\n    return buffer_gpu_address_;\n  }\n\n  void CompletedSubmissionUpdated();\n  void BeginSubmission();\n\n  // RequestRange may transition the buffer to copy destination - call it before\n  // UseForReading or UseForWriting.\n\n  // Makes the buffer usable for vertices, indices and texture untiling.\n  void UseForReading() {\n    // Vertex fetch is also allowed in pixel shaders.\n    CommitUAVWritesAndTransitionBuffer(\n        D3D12_RESOURCE_STATE_INDEX_BUFFER |\n        D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE |\n        D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);\n  }\n  // Makes the buffer usable for texture tiling after a resolve.\n  void UseForWriting() {\n    CommitUAVWritesAndTransitionBuffer(D3D12_RESOURCE_STATE_UNORDERED_ACCESS);\n  }\n  // Makes the buffer usable as a source for copy commands.\n  void UseAsCopySource() {\n    CommitUAVWritesAndTransitionBuffer(D3D12_RESOURCE_STATE_COPY_SOURCE);\n  }\n  // Must be called when doing draws/dispatches modifying data within the shared\n  // memory buffer as a UAV, to make sure that when UseForWriting is called the\n  // next time, a UAV barrier will be done, and subsequent overlapping UAV\n  // writes and reads are ordered.\n  void MarkUAVWritesCommitNeeded() {\n    if (buffer_state_ == D3D12_RESOURCE_STATE_UNORDERED_ACCESS) {\n      buffer_uav_writes_commit_needed_ = true;\n    }\n  }\n\n  void WriteRawSRVDescriptor(D3D12_CPU_DESCRIPTOR_HANDLE handle);\n  void WriteRawUAVDescriptor(D3D12_CPU_DESCRIPTOR_HANDLE handle);\n\n  // Returns true if any downloads were submitted to the command processor.\n  bool InitializeTraceSubmitDownloads();\n  void InitializeTraceCompleteDownloads();\n\n protected:\n  bool AllocateSparseHostGpuMemoryRange(uint32_t offset_allocations,\n                                        uint32_t length_allocations) override;\n\n  bool UploadRanges(const std::vector<std::pair<uint32_t, uint32_t>>&\n                        upload_page_ranges) override;\n\n private:\n  D3D12CommandProcessor& command_processor_;\n  TraceWriter& trace_writer_;\n\n  // The 512 MB tiled buffer.\n  ID3D12Resource* buffer_ = nullptr;\n  D3D12_GPU_VIRTUAL_ADDRESS buffer_gpu_address_ = 0;\n  std::vector<ID3D12Heap*> buffer_tiled_heaps_;\n  D3D12_RESOURCE_STATES buffer_state_ = D3D12_RESOURCE_STATE_COPY_DEST;\n  bool buffer_uav_writes_commit_needed_ = false;\n  void CommitUAVWritesAndTransitionBuffer(D3D12_RESOURCE_STATES new_state);\n\n  // Non-shader-visible buffer descriptor heap for faster binding (via copying\n  // rather than creation).\n  enum class BufferDescriptorIndex : uint32_t {\n    kRawSRV,\n    kRawUAV,\n\n    kCount,\n  };\n  ID3D12DescriptorHeap* buffer_descriptor_heap_ = nullptr;\n  D3D12_CPU_DESCRIPTOR_HANDLE buffer_descriptor_heap_start_;\n\n  std::unique_ptr<ui::d3d12::D3D12UploadBufferPool> upload_buffer_pool_;\n\n  // Created temporarily, only for downloading.\n  ID3D12Resource* trace_download_buffer_ = nullptr;\n  void ResetTraceDownload();\n};\n\n}  // namespace d3d12\n}  // namespace gpu\n}  // namespace xe\n\n#endif  // XENIA_GPU_D3D12_D3D12_SHARED_MEMORY_H_\n"
  },
  {
    "path": "src/xenia/gpu/d3d12/d3d12_texture_cache.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/d3d12/d3d12_texture_cache.h\"\n\n#include <algorithm>\n#include <array>\n#include <cfloat>\n#include <cstddef>\n#include <cstring>\n#include <memory>\n#include <utility>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/profiling.h\"\n#include \"xenia/gpu/d3d12/d3d12_command_processor.h\"\n#include \"xenia/gpu/d3d12/d3d12_shared_memory.h\"\n#include \"xenia/gpu/gpu_flags.h\"\n#include \"xenia/gpu/texture_info.h\"\n#include \"xenia/gpu/texture_util.h\"\n#include \"xenia/gpu/xenos.h\"\n#include \"xenia/ui/d3d12/d3d12_upload_buffer_pool.h\"\n#include \"xenia/ui/d3d12/d3d12_util.h\"\n\nnamespace xe {\nnamespace gpu {\nnamespace d3d12 {\n\n// Generated with `xb buildshaders`.\nnamespace shaders {\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_128bpb_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_128bpb_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_16bpb_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_16bpb_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_32bpb_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_32bpb_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_64bpb_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_64bpb_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_8bpb_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_8bpb_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_bgrg8_rgb8_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_bgrg8_rgbg8_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_ctx1_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_depth_float_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_depth_float_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_depth_unorm_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_depth_unorm_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_dxn_rg8_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_dxt1_rgba8_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_dxt3_rgba8_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_dxt3a_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_dxt3aas1111_bgra4_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_dxt5_rgba8_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_dxt5a_r8_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_gbgr8_grgb8_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_gbgr8_rgb8_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_r10g11b11_rgba16_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_r10g11b11_rgba16_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_r10g11b11_rgba16_snorm_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_r10g11b11_rgba16_snorm_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_r11g11b10_rgba16_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_r11g11b10_rgba16_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_r11g11b10_rgba16_snorm_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_r11g11b10_rgba16_snorm_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_r4g4b4a4_b4g4r4a4_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_r4g4b4a4_b4g4r4a4_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_r5g5b5a1_b5g5r5a1_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_r5g5b5a1_b5g5r5a1_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_r5g5b6_b5g6r5_swizzle_rbga_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_r5g5b6_b5g6r5_swizzle_rbga_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_r5g6b5_b5g6r5_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_r5g6b5_b5g6r5_scaled_cs.h\"\n}  // namespace shaders\n\nconst D3D12TextureCache::HostFormat D3D12TextureCache::host_formats_[64] = {\n    // k_1_REVERSE\n    {DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown,\n     DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown, false, DXGI_FORMAT_UNKNOWN,\n     kLoadShaderIndexUnknown, xenos::XE_GPU_TEXTURE_SWIZZLE_RRRR},\n    // k_1\n    {DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown,\n     DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown, false, DXGI_FORMAT_UNKNOWN,\n     kLoadShaderIndexUnknown, xenos::XE_GPU_TEXTURE_SWIZZLE_RRRR},\n    // k_8\n    {DXGI_FORMAT_R8_TYPELESS, DXGI_FORMAT_R8_UNORM, kLoadShaderIndex8bpb,\n     DXGI_FORMAT_R8_SNORM, kLoadShaderIndexUnknown, false, DXGI_FORMAT_UNKNOWN,\n     kLoadShaderIndexUnknown, xenos::XE_GPU_TEXTURE_SWIZZLE_RRRR},\n    // k_1_5_5_5\n    // Red and blue swapped in the load shader for simplicity.\n    {DXGI_FORMAT_B5G5R5A1_UNORM, DXGI_FORMAT_B5G5R5A1_UNORM,\n     kLoadShaderIndexR5G5B5A1ToB5G5R5A1, DXGI_FORMAT_UNKNOWN,\n     kLoadShaderIndexUnknown, false, DXGI_FORMAT_UNKNOWN,\n     kLoadShaderIndexUnknown, xenos::XE_GPU_TEXTURE_SWIZZLE_RGBA},\n    // k_5_6_5\n    // Red and blue swapped in the load shader for simplicity.\n    {DXGI_FORMAT_B5G6R5_UNORM, DXGI_FORMAT_B5G6R5_UNORM,\n     kLoadShaderIndexR5G6B5ToB5G6R5, DXGI_FORMAT_UNKNOWN,\n     kLoadShaderIndexUnknown, false, DXGI_FORMAT_UNKNOWN,\n     kLoadShaderIndexUnknown, xenos::XE_GPU_TEXTURE_SWIZZLE_RGBB},\n    // k_6_5_5\n    // On the host, green bits in blue, blue bits in green.\n    {DXGI_FORMAT_B5G6R5_UNORM, DXGI_FORMAT_B5G6R5_UNORM,\n     kLoadShaderIndexR5G5B6ToB5G6R5WithRBGASwizzle, DXGI_FORMAT_UNKNOWN,\n     kLoadShaderIndexUnknown, false, DXGI_FORMAT_UNKNOWN,\n     kLoadShaderIndexUnknown, XE_GPU_MAKE_TEXTURE_SWIZZLE(R, B, G, G)},\n    // k_8_8_8_8\n    {DXGI_FORMAT_R8G8B8A8_TYPELESS, DXGI_FORMAT_R8G8B8A8_UNORM,\n     kLoadShaderIndex32bpb, DXGI_FORMAT_R8G8B8A8_SNORM, kLoadShaderIndexUnknown,\n     false, DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown,\n     xenos::XE_GPU_TEXTURE_SWIZZLE_RGBA},\n    // k_2_10_10_10\n    {DXGI_FORMAT_R10G10B10A2_TYPELESS, DXGI_FORMAT_R10G10B10A2_UNORM,\n     kLoadShaderIndex32bpb, DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown, false,\n     DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown,\n     xenos::XE_GPU_TEXTURE_SWIZZLE_RGBA},\n    // k_8_A\n    {DXGI_FORMAT_R8_TYPELESS, DXGI_FORMAT_R8_UNORM, kLoadShaderIndex8bpb,\n     DXGI_FORMAT_R8_SNORM, kLoadShaderIndexUnknown, false, DXGI_FORMAT_UNKNOWN,\n     kLoadShaderIndexUnknown, xenos::XE_GPU_TEXTURE_SWIZZLE_RRRR},\n    // k_8_B\n    {DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown,\n     DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown, false, DXGI_FORMAT_UNKNOWN,\n     kLoadShaderIndexUnknown, xenos::XE_GPU_TEXTURE_SWIZZLE_RRRR},\n    // k_8_8\n    {DXGI_FORMAT_R8G8_TYPELESS, DXGI_FORMAT_R8G8_UNORM, kLoadShaderIndex16bpb,\n     DXGI_FORMAT_R8G8_SNORM, kLoadShaderIndexUnknown, false,\n     DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown,\n     xenos::XE_GPU_TEXTURE_SWIZZLE_RGGG},\n    // k_Cr_Y1_Cb_Y0_REP\n    // Red and blue swapped in the load shader for simplicity.\n    // TODO(Triang3l): The DXGI_FORMAT_R8G8B8A8_U/SNORM conversion is usable for\n    // the signed version, separate unsigned and signed load shaders completely\n    // (as one doesn't need decompression for this format, while another does).\n    {DXGI_FORMAT_G8R8_G8B8_UNORM, DXGI_FORMAT_G8R8_G8B8_UNORM,\n     kLoadShaderIndexGBGR8ToGRGB8, DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown,\n     true, DXGI_FORMAT_R8G8B8A8_UNORM, kLoadShaderIndexGBGR8ToRGB8,\n     xenos::XE_GPU_TEXTURE_SWIZZLE_RGBB},\n    // k_Y1_Cr_Y0_Cb_REP\n    // Red and blue swapped in the load shader for simplicity.\n    // TODO(Triang3l): The DXGI_FORMAT_R8G8B8A8_U/SNORM conversion is usable for\n    // the signed version, separate unsigned and signed load shaders completely\n    // (as one doesn't need decompression for this format, while another does).\n    {DXGI_FORMAT_R8G8_B8G8_UNORM, DXGI_FORMAT_R8G8_B8G8_UNORM,\n     kLoadShaderIndexBGRG8ToRGBG8, DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown,\n     true, DXGI_FORMAT_R8G8B8A8_UNORM, kLoadShaderIndexBGRG8ToRGB8,\n     xenos::XE_GPU_TEXTURE_SWIZZLE_RGBB},\n    // k_16_16_EDRAM\n    // Not usable as a texture, also has -32...32 range.\n    {DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown,\n     DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown, false, DXGI_FORMAT_UNKNOWN,\n     kLoadShaderIndexUnknown, xenos::XE_GPU_TEXTURE_SWIZZLE_RGGG},\n    // k_8_8_8_8_A\n    {DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown,\n     DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown, false, DXGI_FORMAT_UNKNOWN,\n     kLoadShaderIndexUnknown, xenos::XE_GPU_TEXTURE_SWIZZLE_RGBA},\n    // k_4_4_4_4\n    // Red and blue swapped in the load shader for simplicity.\n    {DXGI_FORMAT_B4G4R4A4_UNORM, DXGI_FORMAT_B4G4R4A4_UNORM,\n     kLoadShaderIndexRGBA4ToBGRA4, DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown,\n     false, DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown,\n     xenos::XE_GPU_TEXTURE_SWIZZLE_RGBA},\n    // k_10_11_11\n    {DXGI_FORMAT_R16G16B16A16_TYPELESS, DXGI_FORMAT_R16G16B16A16_UNORM,\n     kLoadShaderIndexR11G11B10ToRGBA16, DXGI_FORMAT_R16G16B16A16_SNORM,\n     kLoadShaderIndexR11G11B10ToRGBA16SNorm, false, DXGI_FORMAT_UNKNOWN,\n     kLoadShaderIndexUnknown, xenos::XE_GPU_TEXTURE_SWIZZLE_RGBB},\n    // k_11_11_10\n    {DXGI_FORMAT_R16G16B16A16_TYPELESS, DXGI_FORMAT_R16G16B16A16_UNORM,\n     kLoadShaderIndexR10G11B11ToRGBA16, DXGI_FORMAT_R16G16B16A16_SNORM,\n     kLoadShaderIndexR10G11B11ToRGBA16SNorm, false, DXGI_FORMAT_UNKNOWN,\n     kLoadShaderIndexUnknown, xenos::XE_GPU_TEXTURE_SWIZZLE_RGBB},\n    // k_DXT1\n    {DXGI_FORMAT_BC1_UNORM, DXGI_FORMAT_BC1_UNORM, kLoadShaderIndex64bpb,\n     DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown, true,\n     DXGI_FORMAT_R8G8B8A8_UNORM, kLoadShaderIndexDXT1ToRGBA8,\n     xenos::XE_GPU_TEXTURE_SWIZZLE_RGBA},\n    // k_DXT2_3\n    {DXGI_FORMAT_BC2_UNORM, DXGI_FORMAT_BC2_UNORM, kLoadShaderIndex128bpb,\n     DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown, true,\n     DXGI_FORMAT_R8G8B8A8_UNORM, kLoadShaderIndexDXT3ToRGBA8,\n     xenos::XE_GPU_TEXTURE_SWIZZLE_RGBA},\n    // k_DXT4_5\n    {DXGI_FORMAT_BC3_UNORM, DXGI_FORMAT_BC3_UNORM, kLoadShaderIndex128bpb,\n     DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown, true,\n     DXGI_FORMAT_R8G8B8A8_UNORM, kLoadShaderIndexDXT5ToRGBA8,\n     xenos::XE_GPU_TEXTURE_SWIZZLE_RGBA},\n    // k_16_16_16_16_EDRAM\n    // Not usable as a texture, also has -32...32 range.\n    {DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown,\n     DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown, false, DXGI_FORMAT_UNKNOWN,\n     kLoadShaderIndexUnknown, xenos::XE_GPU_TEXTURE_SWIZZLE_RGBA},\n    // R32_FLOAT for depth because shaders would require an additional SRV to\n    // sample stencil, which we don't provide.\n    // k_24_8\n    {DXGI_FORMAT_R32_FLOAT, DXGI_FORMAT_R32_FLOAT, kLoadShaderIndexDepthUnorm,\n     DXGI_FORMAT_R32_FLOAT, kLoadShaderIndexUnknown, false, DXGI_FORMAT_UNKNOWN,\n     kLoadShaderIndexUnknown, xenos::XE_GPU_TEXTURE_SWIZZLE_RRRR},\n    // k_24_8_FLOAT\n    {DXGI_FORMAT_R32_FLOAT, DXGI_FORMAT_R32_FLOAT, kLoadShaderIndexDepthFloat,\n     DXGI_FORMAT_R32_FLOAT, kLoadShaderIndexUnknown, false, DXGI_FORMAT_UNKNOWN,\n     kLoadShaderIndexUnknown, xenos::XE_GPU_TEXTURE_SWIZZLE_RRRR},\n    // k_16\n    {DXGI_FORMAT_R16_TYPELESS, DXGI_FORMAT_R16_UNORM, kLoadShaderIndex16bpb,\n     DXGI_FORMAT_R16_SNORM, kLoadShaderIndexUnknown, false, DXGI_FORMAT_UNKNOWN,\n     kLoadShaderIndexUnknown, xenos::XE_GPU_TEXTURE_SWIZZLE_RRRR},\n    // k_16_16\n    {DXGI_FORMAT_R16G16_TYPELESS, DXGI_FORMAT_R16G16_UNORM,\n     kLoadShaderIndex32bpb, DXGI_FORMAT_R16G16_SNORM, kLoadShaderIndexUnknown,\n     false, DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown,\n     xenos::XE_GPU_TEXTURE_SWIZZLE_RGGG},\n    // k_16_16_16_16\n    {DXGI_FORMAT_R16G16B16A16_TYPELESS, DXGI_FORMAT_R16G16B16A16_UNORM,\n     kLoadShaderIndex64bpb, DXGI_FORMAT_R16G16B16A16_SNORM,\n     kLoadShaderIndexUnknown, false, DXGI_FORMAT_UNKNOWN,\n     kLoadShaderIndexUnknown, xenos::XE_GPU_TEXTURE_SWIZZLE_RGBA},\n    // k_16_EXPAND\n    {DXGI_FORMAT_R16_FLOAT, DXGI_FORMAT_R16_FLOAT, kLoadShaderIndex16bpb,\n     DXGI_FORMAT_R16_FLOAT, kLoadShaderIndexUnknown, false, DXGI_FORMAT_UNKNOWN,\n     kLoadShaderIndexUnknown, xenos::XE_GPU_TEXTURE_SWIZZLE_RRRR},\n    // k_16_16_EXPAND\n    {DXGI_FORMAT_R16G16_FLOAT, DXGI_FORMAT_R16G16_FLOAT, kLoadShaderIndex32bpb,\n     DXGI_FORMAT_R16G16_FLOAT, kLoadShaderIndexUnknown, false,\n     DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown,\n     xenos::XE_GPU_TEXTURE_SWIZZLE_RGGG},\n    // k_16_16_16_16_EXPAND\n    {DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_FLOAT,\n     kLoadShaderIndex64bpb, DXGI_FORMAT_R16G16B16A16_FLOAT,\n     kLoadShaderIndexUnknown, false, DXGI_FORMAT_UNKNOWN,\n     kLoadShaderIndexUnknown, xenos::XE_GPU_TEXTURE_SWIZZLE_RGBA},\n    // k_16_FLOAT\n    {DXGI_FORMAT_R16_FLOAT, DXGI_FORMAT_R16_FLOAT, kLoadShaderIndex16bpb,\n     DXGI_FORMAT_R16_FLOAT, kLoadShaderIndexUnknown, false, DXGI_FORMAT_UNKNOWN,\n     kLoadShaderIndexUnknown, xenos::XE_GPU_TEXTURE_SWIZZLE_RRRR},\n    // k_16_16_FLOAT\n    {DXGI_FORMAT_R16G16_FLOAT, DXGI_FORMAT_R16G16_FLOAT, kLoadShaderIndex32bpb,\n     DXGI_FORMAT_R16G16_FLOAT, kLoadShaderIndexUnknown, false,\n     DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown,\n     xenos::XE_GPU_TEXTURE_SWIZZLE_RGGG},\n    // k_16_16_16_16_FLOAT\n    {DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_FLOAT,\n     kLoadShaderIndex64bpb, DXGI_FORMAT_R16G16B16A16_FLOAT,\n     kLoadShaderIndexUnknown, false, DXGI_FORMAT_UNKNOWN,\n     kLoadShaderIndexUnknown, xenos::XE_GPU_TEXTURE_SWIZZLE_RGBA},\n    // k_32\n    {DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown,\n     DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown, false, DXGI_FORMAT_UNKNOWN,\n     kLoadShaderIndexUnknown, xenos::XE_GPU_TEXTURE_SWIZZLE_RRRR},\n    // k_32_32\n    {DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown,\n     DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown, false, DXGI_FORMAT_UNKNOWN,\n     kLoadShaderIndexUnknown, xenos::XE_GPU_TEXTURE_SWIZZLE_RGGG},\n    // k_32_32_32_32\n    {DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown,\n     DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown, false, DXGI_FORMAT_UNKNOWN,\n     kLoadShaderIndexUnknown, xenos::XE_GPU_TEXTURE_SWIZZLE_RGBA},\n    // k_32_FLOAT\n    {DXGI_FORMAT_R32_FLOAT, DXGI_FORMAT_R32_FLOAT, kLoadShaderIndex32bpb,\n     DXGI_FORMAT_R32_FLOAT, kLoadShaderIndexUnknown, false, DXGI_FORMAT_UNKNOWN,\n     kLoadShaderIndexUnknown, xenos::XE_GPU_TEXTURE_SWIZZLE_RRRR},\n    // k_32_32_FLOAT\n    {DXGI_FORMAT_R32G32_FLOAT, DXGI_FORMAT_R32G32_FLOAT, kLoadShaderIndex64bpb,\n     DXGI_FORMAT_R32G32_FLOAT, kLoadShaderIndexUnknown, false,\n     DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown,\n     xenos::XE_GPU_TEXTURE_SWIZZLE_RGGG},\n    // k_32_32_32_32_FLOAT\n    {DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT,\n     kLoadShaderIndex128bpb, DXGI_FORMAT_R32G32B32A32_FLOAT,\n     kLoadShaderIndexUnknown, false, DXGI_FORMAT_UNKNOWN,\n     kLoadShaderIndexUnknown, xenos::XE_GPU_TEXTURE_SWIZZLE_RGBA},\n    // k_32_AS_8\n    {DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown,\n     DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown, false, DXGI_FORMAT_UNKNOWN,\n     kLoadShaderIndexUnknown, xenos::XE_GPU_TEXTURE_SWIZZLE_RRRR},\n    // k_32_AS_8_8\n    {DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown,\n     DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown, false, DXGI_FORMAT_UNKNOWN,\n     kLoadShaderIndexUnknown, xenos::XE_GPU_TEXTURE_SWIZZLE_RGGG},\n    // k_16_MPEG\n    {DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown,\n     DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown, false, DXGI_FORMAT_UNKNOWN,\n     kLoadShaderIndexUnknown, xenos::XE_GPU_TEXTURE_SWIZZLE_RRRR},\n    // k_16_16_MPEG\n    {DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown,\n     DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown, false, DXGI_FORMAT_UNKNOWN,\n     kLoadShaderIndexUnknown, xenos::XE_GPU_TEXTURE_SWIZZLE_RGGG},\n    // k_8_INTERLACED\n    {DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown,\n     DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown, false, DXGI_FORMAT_UNKNOWN,\n     kLoadShaderIndexUnknown, xenos::XE_GPU_TEXTURE_SWIZZLE_RRRR},\n    // k_32_AS_8_INTERLACED\n    {DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown,\n     DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown, false, DXGI_FORMAT_UNKNOWN,\n     kLoadShaderIndexUnknown, xenos::XE_GPU_TEXTURE_SWIZZLE_RRRR},\n    // k_32_AS_8_8_INTERLACED\n    {DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown,\n     DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown, false, DXGI_FORMAT_UNKNOWN,\n     kLoadShaderIndexUnknown, xenos::XE_GPU_TEXTURE_SWIZZLE_RGGG},\n    // k_16_INTERLACED\n    {DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown,\n     DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown, false, DXGI_FORMAT_UNKNOWN,\n     kLoadShaderIndexUnknown, xenos::XE_GPU_TEXTURE_SWIZZLE_RRRR},\n    // k_16_MPEG_INTERLACED\n    {DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown,\n     DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown, false, DXGI_FORMAT_UNKNOWN,\n     kLoadShaderIndexUnknown, xenos::XE_GPU_TEXTURE_SWIZZLE_RRRR},\n    // k_16_16_MPEG_INTERLACED\n    {DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown,\n     DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown, false, DXGI_FORMAT_UNKNOWN,\n     kLoadShaderIndexUnknown, xenos::XE_GPU_TEXTURE_SWIZZLE_RGGG},\n    // k_DXN\n    {DXGI_FORMAT_BC5_UNORM, DXGI_FORMAT_BC5_UNORM, kLoadShaderIndex128bpb,\n     DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown, true, DXGI_FORMAT_R8G8_UNORM,\n     kLoadShaderIndexDXNToRG8, xenos::XE_GPU_TEXTURE_SWIZZLE_RGGG},\n    // k_8_8_8_8_AS_16_16_16_16\n    {DXGI_FORMAT_R8G8B8A8_TYPELESS, DXGI_FORMAT_R8G8B8A8_UNORM,\n     kLoadShaderIndex32bpb, DXGI_FORMAT_R8G8B8A8_SNORM, kLoadShaderIndexUnknown,\n     false, DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown,\n     xenos::XE_GPU_TEXTURE_SWIZZLE_RGBA},\n    // k_DXT1_AS_16_16_16_16\n    {DXGI_FORMAT_BC1_UNORM, DXGI_FORMAT_BC1_UNORM, kLoadShaderIndex64bpb,\n     DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown, true,\n     DXGI_FORMAT_R8G8B8A8_UNORM, kLoadShaderIndexDXT1ToRGBA8,\n     xenos::XE_GPU_TEXTURE_SWIZZLE_RGBA},\n    // k_DXT2_3_AS_16_16_16_16\n    {DXGI_FORMAT_BC2_UNORM, DXGI_FORMAT_BC2_UNORM, kLoadShaderIndex128bpb,\n     DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown, true,\n     DXGI_FORMAT_R8G8B8A8_UNORM, kLoadShaderIndexDXT3ToRGBA8,\n     xenos::XE_GPU_TEXTURE_SWIZZLE_RGBA},\n    // k_DXT4_5_AS_16_16_16_16\n    {DXGI_FORMAT_BC3_UNORM, DXGI_FORMAT_BC3_UNORM, kLoadShaderIndex128bpb,\n     DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown, true,\n     DXGI_FORMAT_R8G8B8A8_UNORM, kLoadShaderIndexDXT5ToRGBA8,\n     xenos::XE_GPU_TEXTURE_SWIZZLE_RGBA},\n    // k_2_10_10_10_AS_16_16_16_16\n    {DXGI_FORMAT_R10G10B10A2_UNORM, DXGI_FORMAT_R10G10B10A2_UNORM,\n     kLoadShaderIndex32bpb, DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown, false,\n     DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown,\n     xenos::XE_GPU_TEXTURE_SWIZZLE_RGBA},\n    // k_10_11_11_AS_16_16_16_16\n    {DXGI_FORMAT_R16G16B16A16_TYPELESS, DXGI_FORMAT_R16G16B16A16_UNORM,\n     kLoadShaderIndexR11G11B10ToRGBA16, DXGI_FORMAT_R16G16B16A16_SNORM,\n     kLoadShaderIndexR11G11B10ToRGBA16SNorm, false, DXGI_FORMAT_UNKNOWN,\n     kLoadShaderIndexUnknown, xenos::XE_GPU_TEXTURE_SWIZZLE_RGBB},\n    // k_11_11_10_AS_16_16_16_16\n    {DXGI_FORMAT_R16G16B16A16_TYPELESS, DXGI_FORMAT_R16G16B16A16_UNORM,\n     kLoadShaderIndexR10G11B11ToRGBA16, DXGI_FORMAT_R16G16B16A16_SNORM,\n     kLoadShaderIndexR10G11B11ToRGBA16SNorm, false, DXGI_FORMAT_UNKNOWN,\n     kLoadShaderIndexUnknown, xenos::XE_GPU_TEXTURE_SWIZZLE_RGBB},\n    // k_32_32_32_FLOAT\n    {DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown,\n     DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown, false, DXGI_FORMAT_UNKNOWN,\n     kLoadShaderIndexUnknown, xenos::XE_GPU_TEXTURE_SWIZZLE_RGBB},\n    // k_DXT3A\n    // R8_UNORM has the same size as BC2, but doesn't have the 4x4 size\n    // alignment requirement.\n    {DXGI_FORMAT_R8_UNORM, DXGI_FORMAT_R8_UNORM, kLoadShaderIndexDXT3A,\n     DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown, false, DXGI_FORMAT_UNKNOWN,\n     kLoadShaderIndexUnknown, xenos::XE_GPU_TEXTURE_SWIZZLE_RRRR},\n    // k_DXT5A\n    {DXGI_FORMAT_BC4_UNORM, DXGI_FORMAT_BC4_UNORM, kLoadShaderIndex64bpb,\n     DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown, true, DXGI_FORMAT_R8_UNORM,\n     kLoadShaderIndexDXT5AToR8, xenos::XE_GPU_TEXTURE_SWIZZLE_RRRR},\n    // k_CTX1\n    {DXGI_FORMAT_R8G8_UNORM, DXGI_FORMAT_R8G8_UNORM, kLoadShaderIndexCTX1,\n     DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown, false, DXGI_FORMAT_UNKNOWN,\n     kLoadShaderIndexUnknown, xenos::XE_GPU_TEXTURE_SWIZZLE_RGGG},\n    // k_DXT3A_AS_1_1_1_1\n    {DXGI_FORMAT_B4G4R4A4_UNORM, DXGI_FORMAT_B4G4R4A4_UNORM,\n     kLoadShaderIndexDXT3AAs1111ToBGRA4, DXGI_FORMAT_UNKNOWN,\n     kLoadShaderIndexUnknown, false, DXGI_FORMAT_UNKNOWN,\n     kLoadShaderIndexUnknown, xenos::XE_GPU_TEXTURE_SWIZZLE_RGBA},\n    // k_8_8_8_8_GAMMA_EDRAM\n    // Not usable as a texture.\n    {DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown,\n     DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown, false, DXGI_FORMAT_UNKNOWN,\n     kLoadShaderIndexUnknown, xenos::XE_GPU_TEXTURE_SWIZZLE_RGBA},\n    // k_2_10_10_10_FLOAT_EDRAM\n    // Not usable as a texture.\n    {DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown,\n     DXGI_FORMAT_UNKNOWN, kLoadShaderIndexUnknown, false, DXGI_FORMAT_UNKNOWN,\n     kLoadShaderIndexUnknown, xenos::XE_GPU_TEXTURE_SWIZZLE_RGBA},\n};\n\nD3D12TextureCache::D3D12TextureCache(const RegisterFile& register_file,\n                                     D3D12SharedMemory& shared_memory,\n                                     uint32_t draw_resolution_scale_x,\n                                     uint32_t draw_resolution_scale_y,\n                                     D3D12CommandProcessor& command_processor,\n                                     bool bindless_resources_used)\n    : TextureCache(register_file, shared_memory, draw_resolution_scale_x,\n                   draw_resolution_scale_y),\n      command_processor_(command_processor),\n      bindless_resources_used_(bindless_resources_used) {}\n\nD3D12TextureCache::~D3D12TextureCache() {\n  // While the texture descriptor cache still exists (referenced by\n  // ~D3D12Texture), destroy all textures.\n  DestroyAllTextures(true);\n\n  // First release the buffers to detach them from the heaps.\n  for (std::unique_ptr<ScaledResolveVirtualBuffer>& scaled_resolve_buffer_ptr :\n       scaled_resolve_2gb_buffers_) {\n    scaled_resolve_buffer_ptr.reset();\n  }\n  scaled_resolve_heaps_.clear();\n  COUNT_profile_set(\"gpu/texture_cache/scaled_resolve_buffer_used_mb\", 0);\n}\n\nbool D3D12TextureCache::Initialize() {\n  const ui::d3d12::D3D12Provider& provider =\n      command_processor_.GetD3D12Provider();\n  ID3D12Device* device = provider.GetDevice();\n\n  if (IsDrawResolutionScaled()) {\n    // Buffers not used yet - no need aliasing barriers to change ownership of\n    // gigabytes between even and odd buffers.\n    std::memset(scaled_resolve_1gb_buffer_indices_, UINT8_MAX,\n                sizeof(scaled_resolve_1gb_buffer_indices_));\n    assert_true(scaled_resolve_heaps_.empty());\n    uint64_t scaled_resolve_address_space_size =\n        uint64_t(SharedMemory::kBufferSize) *\n        (draw_resolution_scale_x() * draw_resolution_scale_y());\n    scaled_resolve_heaps_.resize(size_t(scaled_resolve_address_space_size >>\n                                        kScaledResolveHeapSizeLog2));\n  }\n  scaled_resolve_heap_count_ = 0;\n\n  // Create the loading root signature.\n  D3D12_ROOT_PARAMETER root_parameters[3];\n  // Parameter 0 is constants (changed multiple times when untiling).\n  root_parameters[0].ParameterType = D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS;\n  root_parameters[0].Constants.ShaderRegister = 0;\n  root_parameters[0].Constants.RegisterSpace = 0;\n  root_parameters[0].Constants.Num32BitValues =\n      sizeof(LoadConstants) / sizeof(uint32_t);\n  root_parameters[0].ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;\n  // Parameter 1 is the source (may be changed multiple times for the same\n  // destination).\n  root_parameters[1].ParameterType = D3D12_ROOT_PARAMETER_TYPE_SRV;\n  root_parameters[1].Descriptor.ShaderRegister = 0;\n  root_parameters[1].Descriptor.RegisterSpace = 0;\n  root_parameters[1].ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;\n  // Parameter 2 is the destination.\n  root_parameters[2].ParameterType = D3D12_ROOT_PARAMETER_TYPE_UAV;\n  root_parameters[2].Descriptor.ShaderRegister = 0;\n  root_parameters[2].Descriptor.RegisterSpace = 0;\n  root_parameters[2].ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;\n  D3D12_ROOT_SIGNATURE_DESC root_signature_desc;\n  root_signature_desc.NumParameters = UINT(xe::countof(root_parameters));\n  root_signature_desc.pParameters = root_parameters;\n  root_signature_desc.NumStaticSamplers = 0;\n  root_signature_desc.pStaticSamplers = nullptr;\n  root_signature_desc.Flags = D3D12_ROOT_SIGNATURE_FLAG_NONE;\n  *(load_root_signature_.ReleaseAndGetAddressOf()) =\n      ui::d3d12::util::CreateRootSignature(provider, root_signature_desc);\n  if (!load_root_signature_) {\n    XELOGE(\n        \"D3D12TextureCache: Failed to create the texture loading root \"\n        \"signature\");\n    return false;\n  }\n\n  // Specify the load shader code.\n  D3D12_SHADER_BYTECODE load_shader_code[kLoadShaderCount] = {};\n  load_shader_code[kLoadShaderIndex8bpb] = D3D12_SHADER_BYTECODE{\n      shaders::texture_load_8bpb_cs, sizeof(shaders::texture_load_8bpb_cs)};\n  load_shader_code[kLoadShaderIndex16bpb] = D3D12_SHADER_BYTECODE{\n      shaders::texture_load_16bpb_cs, sizeof(shaders::texture_load_16bpb_cs)};\n  load_shader_code[kLoadShaderIndex32bpb] = D3D12_SHADER_BYTECODE{\n      shaders::texture_load_32bpb_cs, sizeof(shaders::texture_load_32bpb_cs)};\n  load_shader_code[kLoadShaderIndex64bpb] = D3D12_SHADER_BYTECODE{\n      shaders::texture_load_64bpb_cs, sizeof(shaders::texture_load_64bpb_cs)};\n  load_shader_code[kLoadShaderIndex128bpb] = D3D12_SHADER_BYTECODE{\n      shaders::texture_load_128bpb_cs, sizeof(shaders::texture_load_128bpb_cs)};\n  load_shader_code[kLoadShaderIndexR5G5B5A1ToB5G5R5A1] =\n      D3D12_SHADER_BYTECODE{shaders::texture_load_r5g5b5a1_b5g5r5a1_cs,\n                            sizeof(shaders::texture_load_r5g5b5a1_b5g5r5a1_cs)};\n  load_shader_code[kLoadShaderIndexR5G6B5ToB5G6R5] =\n      D3D12_SHADER_BYTECODE{shaders::texture_load_r5g6b5_b5g6r5_cs,\n                            sizeof(shaders::texture_load_r5g6b5_b5g6r5_cs)};\n  load_shader_code[kLoadShaderIndexR5G5B6ToB5G6R5WithRBGASwizzle] =\n      D3D12_SHADER_BYTECODE{\n          shaders::texture_load_r5g5b6_b5g6r5_swizzle_rbga_cs,\n          sizeof(shaders::texture_load_r5g5b6_b5g6r5_swizzle_rbga_cs)};\n  load_shader_code[kLoadShaderIndexRGBA4ToBGRA4] =\n      D3D12_SHADER_BYTECODE{shaders::texture_load_r4g4b4a4_b4g4r4a4_cs,\n                            sizeof(shaders::texture_load_r4g4b4a4_b4g4r4a4_cs)};\n  load_shader_code[kLoadShaderIndexGBGR8ToGRGB8] =\n      D3D12_SHADER_BYTECODE{shaders::texture_load_gbgr8_grgb8_cs,\n                            sizeof(shaders::texture_load_gbgr8_grgb8_cs)};\n  load_shader_code[kLoadShaderIndexGBGR8ToRGB8] =\n      D3D12_SHADER_BYTECODE{shaders::texture_load_gbgr8_rgb8_cs,\n                            sizeof(shaders::texture_load_gbgr8_rgb8_cs)};\n  load_shader_code[kLoadShaderIndexBGRG8ToRGBG8] =\n      D3D12_SHADER_BYTECODE{shaders::texture_load_bgrg8_rgbg8_cs,\n                            sizeof(shaders::texture_load_bgrg8_rgbg8_cs)};\n  load_shader_code[kLoadShaderIndexBGRG8ToRGB8] =\n      D3D12_SHADER_BYTECODE{shaders::texture_load_bgrg8_rgb8_cs,\n                            sizeof(shaders::texture_load_bgrg8_rgb8_cs)};\n  load_shader_code[kLoadShaderIndexR10G11B11ToRGBA16] =\n      D3D12_SHADER_BYTECODE{shaders::texture_load_r10g11b11_rgba16_cs,\n                            sizeof(shaders::texture_load_r10g11b11_rgba16_cs)};\n  load_shader_code[kLoadShaderIndexR10G11B11ToRGBA16SNorm] =\n      D3D12_SHADER_BYTECODE{\n          shaders::texture_load_r10g11b11_rgba16_snorm_cs,\n          sizeof(shaders::texture_load_r10g11b11_rgba16_snorm_cs)};\n  load_shader_code[kLoadShaderIndexR11G11B10ToRGBA16] =\n      D3D12_SHADER_BYTECODE{shaders::texture_load_r11g11b10_rgba16_cs,\n                            sizeof(shaders::texture_load_r11g11b10_rgba16_cs)};\n  load_shader_code[kLoadShaderIndexR11G11B10ToRGBA16SNorm] =\n      D3D12_SHADER_BYTECODE{\n          shaders::texture_load_r11g11b10_rgba16_snorm_cs,\n          sizeof(shaders::texture_load_r11g11b10_rgba16_snorm_cs)};\n  load_shader_code[kLoadShaderIndexDXT1ToRGBA8] =\n      D3D12_SHADER_BYTECODE{shaders::texture_load_dxt1_rgba8_cs,\n                            sizeof(shaders::texture_load_dxt1_rgba8_cs)};\n  load_shader_code[kLoadShaderIndexDXT3ToRGBA8] =\n      D3D12_SHADER_BYTECODE{shaders::texture_load_dxt3_rgba8_cs,\n                            sizeof(shaders::texture_load_dxt3_rgba8_cs)};\n  load_shader_code[kLoadShaderIndexDXT5ToRGBA8] =\n      D3D12_SHADER_BYTECODE{shaders::texture_load_dxt5_rgba8_cs,\n                            sizeof(shaders::texture_load_dxt5_rgba8_cs)};\n  load_shader_code[kLoadShaderIndexDXNToRG8] =\n      D3D12_SHADER_BYTECODE{shaders::texture_load_dxn_rg8_cs,\n                            sizeof(shaders::texture_load_dxn_rg8_cs)};\n  load_shader_code[kLoadShaderIndexDXT3A] = D3D12_SHADER_BYTECODE{\n      shaders::texture_load_dxt3a_cs, sizeof(shaders::texture_load_dxt3a_cs)};\n  load_shader_code[kLoadShaderIndexDXT3AAs1111ToBGRA4] =\n      D3D12_SHADER_BYTECODE{shaders::texture_load_dxt3aas1111_bgra4_cs,\n                            sizeof(shaders::texture_load_dxt3aas1111_bgra4_cs)};\n  load_shader_code[kLoadShaderIndexDXT5AToR8] =\n      D3D12_SHADER_BYTECODE{shaders::texture_load_dxt5a_r8_cs,\n                            sizeof(shaders::texture_load_dxt5a_r8_cs)};\n  load_shader_code[kLoadShaderIndexCTX1] = D3D12_SHADER_BYTECODE{\n      shaders::texture_load_ctx1_cs, sizeof(shaders::texture_load_ctx1_cs)};\n  load_shader_code[kLoadShaderIndexDepthUnorm] =\n      D3D12_SHADER_BYTECODE{shaders::texture_load_depth_unorm_cs,\n                            sizeof(shaders::texture_load_depth_unorm_cs)};\n  load_shader_code[kLoadShaderIndexDepthFloat] =\n      D3D12_SHADER_BYTECODE{shaders::texture_load_depth_float_cs,\n                            sizeof(shaders::texture_load_depth_float_cs)};\n  D3D12_SHADER_BYTECODE load_shader_code_scaled[kLoadShaderCount] = {};\n  if (IsDrawResolutionScaled()) {\n    load_shader_code_scaled[kLoadShaderIndex8bpb] =\n        D3D12_SHADER_BYTECODE{shaders::texture_load_8bpb_scaled_cs,\n                              sizeof(shaders::texture_load_8bpb_scaled_cs)};\n    load_shader_code_scaled[kLoadShaderIndex16bpb] =\n        D3D12_SHADER_BYTECODE{shaders::texture_load_16bpb_scaled_cs,\n                              sizeof(shaders::texture_load_16bpb_scaled_cs)};\n    load_shader_code_scaled[kLoadShaderIndex32bpb] =\n        D3D12_SHADER_BYTECODE{shaders::texture_load_32bpb_scaled_cs,\n                              sizeof(shaders::texture_load_32bpb_scaled_cs)};\n    load_shader_code_scaled[kLoadShaderIndex64bpb] =\n        D3D12_SHADER_BYTECODE{shaders::texture_load_64bpb_scaled_cs,\n                              sizeof(shaders::texture_load_64bpb_scaled_cs)};\n    load_shader_code_scaled[kLoadShaderIndex128bpb] =\n        D3D12_SHADER_BYTECODE{shaders::texture_load_128bpb_scaled_cs,\n                              sizeof(shaders::texture_load_128bpb_scaled_cs)};\n    load_shader_code_scaled[kLoadShaderIndexR5G5B5A1ToB5G5R5A1] =\n        D3D12_SHADER_BYTECODE{\n            shaders::texture_load_r5g5b5a1_b5g5r5a1_scaled_cs,\n            sizeof(shaders::texture_load_r5g5b5a1_b5g5r5a1_scaled_cs)};\n    load_shader_code_scaled[kLoadShaderIndexR5G6B5ToB5G6R5] =\n        D3D12_SHADER_BYTECODE{\n            shaders::texture_load_r5g6b5_b5g6r5_scaled_cs,\n            sizeof(shaders::texture_load_r5g6b5_b5g6r5_scaled_cs)};\n    load_shader_code_scaled[kLoadShaderIndexR5G5B6ToB5G6R5WithRBGASwizzle] =\n        D3D12_SHADER_BYTECODE{\n            shaders::texture_load_r5g5b6_b5g6r5_swizzle_rbga_scaled_cs,\n            sizeof(shaders::texture_load_r5g5b6_b5g6r5_swizzle_rbga_scaled_cs)};\n    load_shader_code_scaled[kLoadShaderIndexRGBA4ToBGRA4] =\n        D3D12_SHADER_BYTECODE{\n            shaders::texture_load_r4g4b4a4_b4g4r4a4_scaled_cs,\n            sizeof(shaders::texture_load_r4g4b4a4_b4g4r4a4_scaled_cs)};\n    load_shader_code_scaled[kLoadShaderIndexR10G11B11ToRGBA16] =\n        D3D12_SHADER_BYTECODE{\n            shaders::texture_load_r10g11b11_rgba16_scaled_cs,\n            sizeof(shaders::texture_load_r10g11b11_rgba16_scaled_cs)};\n    load_shader_code_scaled[kLoadShaderIndexR10G11B11ToRGBA16SNorm] =\n        D3D12_SHADER_BYTECODE{\n            shaders::texture_load_r10g11b11_rgba16_snorm_scaled_cs,\n            sizeof(shaders::texture_load_r10g11b11_rgba16_snorm_scaled_cs)};\n    load_shader_code_scaled[kLoadShaderIndexR11G11B10ToRGBA16] =\n        D3D12_SHADER_BYTECODE{\n            shaders::texture_load_r11g11b10_rgba16_scaled_cs,\n            sizeof(shaders::texture_load_r11g11b10_rgba16_scaled_cs)};\n    load_shader_code_scaled[kLoadShaderIndexR11G11B10ToRGBA16SNorm] =\n        D3D12_SHADER_BYTECODE{\n            shaders::texture_load_r11g11b10_rgba16_snorm_scaled_cs,\n            sizeof(shaders::texture_load_r11g11b10_rgba16_snorm_scaled_cs)};\n    load_shader_code_scaled[kLoadShaderIndexDepthUnorm] = D3D12_SHADER_BYTECODE{\n        shaders::texture_load_depth_unorm_scaled_cs,\n        sizeof(shaders::texture_load_depth_unorm_scaled_cs)};\n    load_shader_code_scaled[kLoadShaderIndexDepthFloat] = D3D12_SHADER_BYTECODE{\n        shaders::texture_load_depth_float_scaled_cs,\n        sizeof(shaders::texture_load_depth_float_scaled_cs)};\n  }\n\n  // Create the loading pipelines.\n  for (size_t i = 0; i < kLoadShaderCount; ++i) {\n    const D3D12_SHADER_BYTECODE& current_load_shader_code = load_shader_code[i];\n    if (!current_load_shader_code.pShaderBytecode) {\n      continue;\n    }\n    *(load_pipelines_[i].ReleaseAndGetAddressOf()) =\n        ui::d3d12::util::CreateComputePipeline(\n            device, current_load_shader_code.pShaderBytecode,\n            current_load_shader_code.BytecodeLength,\n            load_root_signature_.Get());\n    if (!load_pipelines_[i]) {\n      XELOGE(\n          \"D3D12TextureCache: Failed to create the texture loading pipeline \"\n          \"for shader {}\",\n          i);\n      return false;\n    }\n    if (IsDrawResolutionScaled()) {\n      const D3D12_SHADER_BYTECODE& current_load_shader_code_scaled =\n          load_shader_code_scaled[i];\n      if (current_load_shader_code_scaled.pShaderBytecode) {\n        *(load_pipelines_scaled_[i].ReleaseAndGetAddressOf()) =\n            ui::d3d12::util::CreateComputePipeline(\n                device, current_load_shader_code_scaled.pShaderBytecode,\n                current_load_shader_code_scaled.BytecodeLength,\n                load_root_signature_.Get());\n        if (!load_pipelines_scaled_[i]) {\n          XELOGE(\n              \"D3D12TextureCache: Failed to create the resolution-scaled \"\n              \"texture loading pipeline for shader {}\",\n              i);\n          return false;\n        }\n      }\n    }\n  }\n\n  srv_descriptor_cache_allocated_ = 0;\n\n  // Create a heap with null SRV descriptors, since it's faster to copy a\n  // descriptor than to create an SRV, and null descriptors are used a lot (for\n  // the signed version when only unsigned is used, for instance).\n  D3D12_DESCRIPTOR_HEAP_DESC null_srv_descriptor_heap_desc;\n  null_srv_descriptor_heap_desc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV;\n  null_srv_descriptor_heap_desc.NumDescriptors =\n      uint32_t(NullSRVDescriptorIndex::kCount);\n  null_srv_descriptor_heap_desc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE;\n  null_srv_descriptor_heap_desc.NodeMask = 0;\n  if (FAILED(device->CreateDescriptorHeap(\n          &null_srv_descriptor_heap_desc,\n          IID_PPV_ARGS(&null_srv_descriptor_heap_)))) {\n    XELOGE(\n        \"D3D12TextureCache: Failed to create the descriptor heap for null \"\n        \"SRVs\");\n    return false;\n  }\n  null_srv_descriptor_heap_start_ =\n      null_srv_descriptor_heap_->GetCPUDescriptorHandleForHeapStart();\n  D3D12_SHADER_RESOURCE_VIEW_DESC null_srv_desc;\n  null_srv_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;\n  null_srv_desc.Shader4ComponentMapping =\n      D3D12_ENCODE_SHADER_4_COMPONENT_MAPPING(\n          D3D12_SHADER_COMPONENT_MAPPING_FORCE_VALUE_0,\n          D3D12_SHADER_COMPONENT_MAPPING_FORCE_VALUE_0,\n          D3D12_SHADER_COMPONENT_MAPPING_FORCE_VALUE_0,\n          D3D12_SHADER_COMPONENT_MAPPING_FORCE_VALUE_0);\n  null_srv_desc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2DARRAY;\n  null_srv_desc.Texture2DArray.MostDetailedMip = 0;\n  null_srv_desc.Texture2DArray.MipLevels = 1;\n  null_srv_desc.Texture2DArray.FirstArraySlice = 0;\n  null_srv_desc.Texture2DArray.ArraySize = 1;\n  null_srv_desc.Texture2DArray.PlaneSlice = 0;\n  null_srv_desc.Texture2DArray.ResourceMinLODClamp = 0.0f;\n  device->CreateShaderResourceView(\n      nullptr, &null_srv_desc,\n      provider.OffsetViewDescriptor(\n          null_srv_descriptor_heap_start_,\n          uint32_t(NullSRVDescriptorIndex::k2DArray)));\n  null_srv_desc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE3D;\n  null_srv_desc.Texture3D.MostDetailedMip = 0;\n  null_srv_desc.Texture3D.MipLevels = 1;\n  null_srv_desc.Texture3D.ResourceMinLODClamp = 0.0f;\n  device->CreateShaderResourceView(\n      nullptr, &null_srv_desc,\n      provider.OffsetViewDescriptor(null_srv_descriptor_heap_start_,\n                                    uint32_t(NullSRVDescriptorIndex::k3D)));\n  null_srv_desc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURECUBE;\n  null_srv_desc.TextureCube.MostDetailedMip = 0;\n  null_srv_desc.TextureCube.MipLevels = 1;\n  null_srv_desc.TextureCube.ResourceMinLODClamp = 0.0f;\n  device->CreateShaderResourceView(\n      nullptr, &null_srv_desc,\n      provider.OffsetViewDescriptor(null_srv_descriptor_heap_start_,\n                                    uint32_t(NullSRVDescriptorIndex::kCube)));\n\n  return true;\n}\n\nvoid D3D12TextureCache::ClearCache() {\n  TextureCache::ClearCache();\n\n  // Clear texture descriptor cache.\n  srv_descriptor_cache_free_.clear();\n  srv_descriptor_cache_allocated_ = 0;\n  srv_descriptor_cache_.clear();\n}\n\nvoid D3D12TextureCache::BeginSubmission(uint64_t new_submission_index) {\n  TextureCache::BeginSubmission(new_submission_index);\n\n  // ExecuteCommandLists is a full UAV and aliasing barrier.\n  if (IsDrawResolutionScaled()) {\n    size_t scaled_resolve_buffer_count = GetScaledResolveBufferCount();\n    for (size_t i = 0; i < scaled_resolve_buffer_count; ++i) {\n      ScaledResolveVirtualBuffer* scaled_resolve_buffer =\n          scaled_resolve_2gb_buffers_[i].get();\n      if (scaled_resolve_buffer) {\n        scaled_resolve_buffer->ClearUAVBarrierPending();\n      }\n    }\n    std::memset(scaled_resolve_1gb_buffer_indices_, UINT8_MAX,\n                sizeof(scaled_resolve_1gb_buffer_indices_));\n  }\n}\n\nvoid D3D12TextureCache::BeginFrame() {\n  TextureCache::BeginFrame();\n\n  std::memset(unsupported_format_features_used_, 0,\n              sizeof(unsupported_format_features_used_));\n}\n\nvoid D3D12TextureCache::EndFrame() {\n  // Report used unsupported texture formats.\n  bool unsupported_header_written = false;\n  for (uint32_t i = 0; i < 64; ++i) {\n    uint32_t unsupported_features = unsupported_format_features_used_[i];\n    if (unsupported_features == 0) {\n      continue;\n    }\n    if (!unsupported_header_written) {\n      XELOGE(\"Unsupported texture formats used in the frame:\");\n      unsupported_header_written = true;\n    }\n    XELOGE(\"* {}{}{}{}\", FormatInfo::Get(xenos::TextureFormat(i))->name,\n           unsupported_features & kUnsupportedResourceBit ? \" resource\" : \"\",\n           unsupported_features & kUnsupportedUnormBit ? \" unsigned\" : \"\",\n           unsupported_features & kUnsupportedSnormBit ? \" signed\" : \"\");\n    unsupported_format_features_used_[i] = 0;\n  }\n}\n\nvoid D3D12TextureCache::RequestTextures(uint32_t used_texture_mask) {\n#if XE_GPU_FINE_GRAINED_DRAW_SCOPES\n  SCOPE_profile_cpu_f(\"gpu\");\n#endif  // XE_GPU_FINE_GRAINED_DRAW_SCOPES\n\n  TextureCache::RequestTextures(used_texture_mask);\n\n  // Transition the textures to the needed usage - always in\n  // NON_PIXEL_SHADER_RESOURCE | PIXEL_SHADER_RESOURCE states because barriers\n  // between read-only stages, if needed, are discouraged (also if these were\n  // tracked separately, checks would be needed to make sure, if the same\n  // texture is bound through different fetch constants to both VS and PS, it\n  // would be in both states).\n  uint32_t textures_remaining = used_texture_mask;\n  uint32_t index;\n  while (xe::bit_scan_forward(textures_remaining, &index)) {\n    textures_remaining &= ~(uint32_t(1) << index);\n    const TextureBinding* binding = GetValidTextureBinding(index);\n    if (!binding) {\n      continue;\n    }\n    D3D12Texture* binding_texture =\n        static_cast<D3D12Texture*>(binding->texture);\n    if (binding_texture != nullptr) {\n      // Will be referenced by the command list, so mark as used.\n      binding_texture->MarkAsUsed();\n      command_processor_.PushTransitionBarrier(\n          binding_texture->resource(),\n          binding_texture->SetResourceState(\n              D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE |\n              D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE),\n          D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE |\n              D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);\n    }\n    D3D12Texture* binding_texture_signed =\n        static_cast<D3D12Texture*>(binding->texture_signed);\n    if (binding_texture_signed != nullptr) {\n      binding_texture_signed->MarkAsUsed();\n      command_processor_.PushTransitionBarrier(\n          binding_texture_signed->resource(),\n          binding_texture_signed->SetResourceState(\n              D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE |\n              D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE),\n          D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE |\n              D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);\n    }\n  }\n}\n\nbool D3D12TextureCache::AreActiveTextureSRVKeysUpToDate(\n    const TextureSRVKey* keys,\n    const D3D12Shader::TextureBinding* host_shader_bindings,\n    size_t host_shader_binding_count) const {\n  for (size_t i = 0; i < host_shader_binding_count; ++i) {\n    const TextureSRVKey& key = keys[i];\n    const TextureBinding* binding =\n        GetValidTextureBinding(host_shader_bindings[i].fetch_constant);\n    if (!binding) {\n      if (key.key.is_valid) {\n        return false;\n      }\n      continue;\n    }\n    if (key.key != binding->key || key.host_swizzle != binding->host_swizzle ||\n        key.swizzled_signs != binding->swizzled_signs) {\n      return false;\n    }\n  }\n  return true;\n}\n\nvoid D3D12TextureCache::WriteActiveTextureSRVKeys(\n    TextureSRVKey* keys,\n    const D3D12Shader::TextureBinding* host_shader_bindings,\n    size_t host_shader_binding_count) const {\n  for (size_t i = 0; i < host_shader_binding_count; ++i) {\n    TextureSRVKey& key = keys[i];\n    const TextureBinding* binding =\n        GetValidTextureBinding(host_shader_bindings[i].fetch_constant);\n    if (!binding) {\n      key.key.MakeInvalid();\n      key.host_swizzle = xenos::XE_GPU_TEXTURE_SWIZZLE_0000;\n      key.swizzled_signs = kSwizzledSignsUnsigned;\n      continue;\n    }\n    key.key = binding->key;\n    key.host_swizzle = binding->host_swizzle;\n    key.swizzled_signs = binding->swizzled_signs;\n  }\n}\n\nvoid D3D12TextureCache::WriteActiveTextureBindfulSRV(\n    const D3D12Shader::TextureBinding& host_shader_binding,\n    D3D12_CPU_DESCRIPTOR_HANDLE handle) {\n  assert_false(bindless_resources_used_);\n  uint32_t descriptor_index = UINT32_MAX;\n  Texture* texture = nullptr;\n  uint32_t fetch_constant_index = host_shader_binding.fetch_constant;\n  const TextureBinding* binding = GetValidTextureBinding(fetch_constant_index);\n  if (binding && AreDimensionsCompatible(host_shader_binding.dimension,\n                                         binding->key.dimension)) {\n    const D3D12TextureBinding& d3d12_binding =\n        d3d12_texture_bindings_[fetch_constant_index];\n    if (host_shader_binding.is_signed) {\n      // Not supporting signed compressed textures - hopefully DXN and DXT5A are\n      // not used as signed.\n      if (texture_util::IsAnySignSigned(binding->swizzled_signs)) {\n        descriptor_index = d3d12_binding.descriptor_index_signed;\n        texture = IsSignedVersionSeparateForFormat(binding->key)\n                      ? binding->texture_signed\n                      : binding->texture;\n      }\n    } else {\n      if (texture_util::IsAnySignNotSigned(binding->swizzled_signs)) {\n        descriptor_index = d3d12_binding.descriptor_index;\n        texture = binding->texture;\n      }\n    }\n  }\n  const ui::d3d12::D3D12Provider& provider =\n      command_processor_.GetD3D12Provider();\n  D3D12_CPU_DESCRIPTOR_HANDLE source_handle;\n  if (descriptor_index != UINT32_MAX) {\n    assert_not_null(texture);\n    texture->MarkAsUsed();\n    source_handle = GetTextureDescriptorCPUHandle(descriptor_index);\n  } else {\n    NullSRVDescriptorIndex null_descriptor_index;\n    switch (host_shader_binding.dimension) {\n      case xenos::FetchOpDimension::k3DOrStacked:\n        null_descriptor_index = NullSRVDescriptorIndex::k3D;\n        break;\n      case xenos::FetchOpDimension::kCube:\n        null_descriptor_index = NullSRVDescriptorIndex::kCube;\n        break;\n      default:\n        assert_true(\n            host_shader_binding.dimension == xenos::FetchOpDimension::k1D ||\n            host_shader_binding.dimension == xenos::FetchOpDimension::k2D);\n        null_descriptor_index = NullSRVDescriptorIndex::k2DArray;\n    }\n    source_handle = provider.OffsetViewDescriptor(\n        null_srv_descriptor_heap_start_, uint32_t(null_descriptor_index));\n  }\n  auto device = provider.GetDevice();\n  {\n#if XE_GPU_FINE_GRAINED_DRAW_SCOPES\n    SCOPE_profile_cpu_i(\n        \"gpu\",\n        \"xe::gpu::d3d12::D3D12TextureCache::WriteActiveTextureBindfulSRV->\"\n        \"CopyDescriptorsSimple\");\n#endif  // XE_GPU_FINE_GRAINED_DRAW_SCOPES\n    device->CopyDescriptorsSimple(1, handle, source_handle,\n                                  D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);\n  }\n}\n\nuint32_t D3D12TextureCache::GetActiveTextureBindlessSRVIndex(\n    const D3D12Shader::TextureBinding& host_shader_binding) {\n  assert_true(bindless_resources_used_);\n  uint32_t descriptor_index = UINT32_MAX;\n  uint32_t fetch_constant_index = host_shader_binding.fetch_constant;\n  const TextureBinding* binding = GetValidTextureBinding(fetch_constant_index);\n  if (binding && AreDimensionsCompatible(host_shader_binding.dimension,\n                                         binding->key.dimension)) {\n    const D3D12TextureBinding& d3d12_binding =\n        d3d12_texture_bindings_[fetch_constant_index];\n    descriptor_index = host_shader_binding.is_signed\n                           ? d3d12_binding.descriptor_index_signed\n                           : d3d12_binding.descriptor_index;\n  }\n  if (descriptor_index == UINT32_MAX) {\n    switch (host_shader_binding.dimension) {\n      case xenos::FetchOpDimension::k3DOrStacked:\n        descriptor_index =\n            uint32_t(D3D12CommandProcessor::SystemBindlessView::kNullTexture3D);\n        break;\n      case xenos::FetchOpDimension::kCube:\n        descriptor_index = uint32_t(\n            D3D12CommandProcessor::SystemBindlessView::kNullTextureCube);\n        break;\n      default:\n        assert_true(\n            host_shader_binding.dimension == xenos::FetchOpDimension::k1D ||\n            host_shader_binding.dimension == xenos::FetchOpDimension::k2D);\n        descriptor_index = uint32_t(\n            D3D12CommandProcessor::SystemBindlessView::kNullTexture2DArray);\n    }\n  }\n  return descriptor_index;\n}\n\nD3D12TextureCache::SamplerParameters D3D12TextureCache::GetSamplerParameters(\n    const D3D12Shader::SamplerBinding& binding) const {\n  const auto& regs = register_file();\n  xenos::xe_gpu_texture_fetch_t fetch =\n      regs.GetTextureFetch(binding.fetch_constant);\n\n  SamplerParameters parameters;\n\n  xenos::ClampMode fetch_clamp_x, fetch_clamp_y, fetch_clamp_z;\n  texture_util::GetClampModesForDimension(fetch, fetch_clamp_x, fetch_clamp_y,\n                                          fetch_clamp_z);\n  parameters.clamp_x = NormalizeClampMode(fetch_clamp_x);\n  parameters.clamp_y = NormalizeClampMode(fetch_clamp_y);\n  parameters.clamp_z = NormalizeClampMode(fetch_clamp_z);\n  if (xenos::ClampModeUsesBorder(parameters.clamp_x) ||\n      xenos::ClampModeUsesBorder(parameters.clamp_y) ||\n      xenos::ClampModeUsesBorder(parameters.clamp_z)) {\n    parameters.border_color = fetch.border_color;\n  } else {\n    parameters.border_color = xenos::BorderColor::k_ABGR_Black;\n  }\n\n  uint32_t mip_min_level;\n  texture_util::GetSubresourcesFromFetchConstant(fetch, nullptr, nullptr,\n                                                 nullptr, nullptr, nullptr,\n                                                 &mip_min_level, nullptr);\n  parameters.mip_min_level = mip_min_level;\n\n  // TODO(Triang3l): Disable filtering for texture formats not supporting it.\n  xenos::AnisoFilter aniso_filter =\n      binding.aniso_filter == xenos::AnisoFilter::kUseFetchConst\n          ? fetch.aniso_filter\n          : binding.aniso_filter;\n  aniso_filter = std::min(aniso_filter, xenos::AnisoFilter::kMax_16_1);\n  parameters.aniso_filter = aniso_filter;\n  xenos::TextureFilter mip_filter =\n      binding.mip_filter == xenos::TextureFilter::kUseFetchConst\n          ? fetch.mip_filter\n          : binding.mip_filter;\n  if (aniso_filter != xenos::AnisoFilter::kDisabled) {\n    parameters.mag_linear = 1;\n    parameters.min_linear = 1;\n    parameters.mip_linear = 1;\n  } else {\n    xenos::TextureFilter mag_filter =\n        binding.mag_filter == xenos::TextureFilter::kUseFetchConst\n            ? fetch.mag_filter\n            : binding.mag_filter;\n    parameters.mag_linear = mag_filter == xenos::TextureFilter::kLinear;\n    xenos::TextureFilter min_filter =\n        binding.min_filter == xenos::TextureFilter::kUseFetchConst\n            ? fetch.min_filter\n            : binding.min_filter;\n    parameters.min_linear = min_filter == xenos::TextureFilter::kLinear;\n    parameters.mip_linear = mip_filter == xenos::TextureFilter::kLinear;\n  }\n  parameters.mip_base_map = mip_filter == xenos::TextureFilter::kBaseMap;\n\n  return parameters;\n}\n\nvoid D3D12TextureCache::WriteSampler(SamplerParameters parameters,\n                                     D3D12_CPU_DESCRIPTOR_HANDLE handle) const {\n  D3D12_SAMPLER_DESC desc;\n  if (parameters.aniso_filter != xenos::AnisoFilter::kDisabled) {\n    desc.Filter = D3D12_FILTER_ANISOTROPIC;\n    desc.MaxAnisotropy = 1u << (uint32_t(parameters.aniso_filter) - 1);\n  } else {\n    D3D12_FILTER_TYPE d3d_filter_min = parameters.min_linear\n                                           ? D3D12_FILTER_TYPE_LINEAR\n                                           : D3D12_FILTER_TYPE_POINT;\n    D3D12_FILTER_TYPE d3d_filter_mag = parameters.mag_linear\n                                           ? D3D12_FILTER_TYPE_LINEAR\n                                           : D3D12_FILTER_TYPE_POINT;\n    D3D12_FILTER_TYPE d3d_filter_mip = parameters.mip_linear\n                                           ? D3D12_FILTER_TYPE_LINEAR\n                                           : D3D12_FILTER_TYPE_POINT;\n    desc.Filter = D3D12_ENCODE_BASIC_FILTER(\n        d3d_filter_min, d3d_filter_mag, d3d_filter_mip,\n        D3D12_FILTER_REDUCTION_TYPE_STANDARD);\n    desc.MaxAnisotropy = 1;\n  }\n  static const D3D12_TEXTURE_ADDRESS_MODE kAddressModeMap[] = {\n      /* kRepeat               */ D3D12_TEXTURE_ADDRESS_MODE_WRAP,\n      /* kMirroredRepeat       */ D3D12_TEXTURE_ADDRESS_MODE_MIRROR,\n      /* kClampToEdge          */ D3D12_TEXTURE_ADDRESS_MODE_CLAMP,\n      /* kMirrorClampToEdge    */ D3D12_TEXTURE_ADDRESS_MODE_MIRROR_ONCE,\n      // No GL_CLAMP (clamp to half edge, half border) equivalent in Direct3D\n      // 12, but there's no Direct3D 9 equivalent anyway, and too weird to be\n      // suitable for intentional real usage.\n      /* kClampToHalfway       */ D3D12_TEXTURE_ADDRESS_MODE_CLAMP,\n      // No mirror and clamp to border equivalents in Direct3D 12, but they\n      // aren't there in Direct3D 9 either.\n      /* kMirrorClampToHalfway */ D3D12_TEXTURE_ADDRESS_MODE_MIRROR_ONCE,\n      /* kClampToBorder        */ D3D12_TEXTURE_ADDRESS_MODE_BORDER,\n      /* kMirrorClampToBorder  */ D3D12_TEXTURE_ADDRESS_MODE_MIRROR_ONCE,\n  };\n  desc.AddressU = kAddressModeMap[uint32_t(parameters.clamp_x)];\n  desc.AddressV = kAddressModeMap[uint32_t(parameters.clamp_y)];\n  desc.AddressW = kAddressModeMap[uint32_t(parameters.clamp_z)];\n  // LOD biasing is performed in shaders.\n  desc.MipLODBias = 0.0f;\n  desc.ComparisonFunc = D3D12_COMPARISON_FUNC_NEVER;\n  switch (parameters.border_color) {\n    case xenos::BorderColor::k_ABGR_White:\n      desc.BorderColor[0] = 1.0f;\n      desc.BorderColor[1] = 1.0f;\n      desc.BorderColor[2] = 1.0f;\n      desc.BorderColor[3] = 1.0f;\n      break;\n    case xenos::BorderColor::k_ACBYCR_Black:\n      desc.BorderColor[0] = 0.5f;\n      desc.BorderColor[1] = 0.0f;\n      desc.BorderColor[2] = 0.5f;\n      desc.BorderColor[3] = 0.0f;\n      break;\n    case xenos::BorderColor::k_ACBCRY_Black:\n      desc.BorderColor[0] = 0.0f;\n      desc.BorderColor[1] = 0.5f;\n      desc.BorderColor[2] = 0.5f;\n      desc.BorderColor[3] = 0.0f;\n      break;\n    default:\n      assert_true(parameters.border_color == xenos::BorderColor::k_ABGR_Black);\n      desc.BorderColor[0] = 0.0f;\n      desc.BorderColor[1] = 0.0f;\n      desc.BorderColor[2] = 0.0f;\n      desc.BorderColor[3] = 0.0f;\n      break;\n  }\n  desc.MinLOD = float(parameters.mip_min_level);\n  if (parameters.mip_base_map) {\n    // \"It is undefined whether LOD clamping based on MinLOD and MaxLOD Sampler\n    // states should happen before or after deciding if magnification is\n    // occuring\" - Direct3D 11.3 Functional Specification.\n    // Using the GL_NEAREST / GL_LINEAR minification filter emulation logic\n    // described in the Vulkan VkSamplerCreateInfo specification, preserving\n    // magnification vs. minification - point mip sampling (usable only without\n    // anisotropic filtering on Direct3D 12) and MaxLOD 0.25. With anisotropic\n    // filtering, magnification vs. minification doesn't matter as the filter is\n    // always linear for both on Direct3D 12 - but linear filtering specifically\n    // is what must not be done for kBaseMap, so setting MaxLOD to MinLOD.\n    desc.MaxLOD = desc.MinLOD;\n    if (parameters.aniso_filter == xenos::AnisoFilter::kDisabled) {\n      assert_false(parameters.mip_linear);\n      desc.MaxLOD += 0.25f;\n    }\n  } else {\n    // Maximum mip level is in the texture resource itself.\n    desc.MaxLOD = FLT_MAX;\n  }\n  ID3D12Device* device = command_processor_.GetD3D12Provider().GetDevice();\n  device->CreateSampler(&desc, handle);\n}\n\nbool D3D12TextureCache::ClampDrawResolutionScaleToMaxSupported(\n    uint32_t& scale_x, uint32_t& scale_y,\n    const ui::d3d12::D3D12Provider& provider) {\n  bool was_clamped;\n  if (provider.GetTiledResourcesTier() < D3D12_TILED_RESOURCES_TIER_1) {\n    was_clamped = scale_x > 1 || scale_y > 1;\n    scale_x = 1;\n    scale_y = 1;\n    return !was_clamped;\n  }\n  // Limit to the virtual address space available for a resource.\n  was_clamped = false;\n  uint32_t virtual_address_bits_per_resource =\n      provider.GetVirtualAddressBitsPerResource();\n  while (scale_x > 1 || scale_y > 1) {\n    uint64_t highest_scaled_address =\n        uint64_t(SharedMemory::kBufferSize) * (scale_x * scale_y) - 1;\n    if (uint32_t(64) - xe::lzcnt(highest_scaled_address) <=\n        virtual_address_bits_per_resource) {\n      break;\n    }\n    // When reducing from a square size, prefer decreasing the horizontal\n    // resolution as vertical resolution difference is visible more clearly in\n    // perspective.\n    was_clamped = true;\n    if (scale_x >= scale_y) {\n      --scale_x;\n    } else {\n      --scale_y;\n    }\n  }\n  return !was_clamped;\n}\n\nbool D3D12TextureCache::EnsureScaledResolveMemoryCommitted(\n    uint32_t start_unscaled, uint32_t length_unscaled,\n    uint32_t length_scaled_alignment_log2) {\n  assert_true(IsDrawResolutionScaled());\n\n  if (length_unscaled == 0) {\n    return true;\n  }\n  if (start_unscaled > SharedMemory::kBufferSize ||\n      (SharedMemory::kBufferSize - start_unscaled) < length_unscaled) {\n    // Exceeds the physical address space.\n    return false;\n  }\n\n  uint32_t draw_resolution_scale_area =\n      draw_resolution_scale_x() * draw_resolution_scale_y();\n  uint64_t first_scaled = uint64_t(start_unscaled) * draw_resolution_scale_area;\n  uint64_t length_scaled_alignment_bits =\n      (UINT64_C(1) << length_scaled_alignment_log2) - 1;\n  uint64_t last_scaled = (uint64_t(start_unscaled + (length_unscaled - 1)) *\n                              draw_resolution_scale_area +\n                          length_scaled_alignment_bits) &\n                         ~length_scaled_alignment_bits;\n\n  const ui::d3d12::D3D12Provider& provider =\n      command_processor_.GetD3D12Provider();\n  ID3D12Device* device = provider.GetDevice();\n\n  // Ensure GPU virtual memory for buffers that may be used to access the range\n  // is allocated - buffers are created. Always creating both buffers for all\n  // addresses before creating the heaps so when creating a new buffer, it can\n  // be safely assumed that no existing heaps should be mapped to it.\n  std::array<size_t, 2> possible_buffers_first =\n      GetPossibleScaledResolveBufferIndices(first_scaled);\n  std::array<size_t, 2> possible_buffers_last =\n      GetPossibleScaledResolveBufferIndices(last_scaled);\n  size_t possible_buffer_first =\n      std::min(possible_buffers_first[0], possible_buffers_first[1]);\n  size_t possible_buffer_last =\n      std::max(possible_buffers_last[0], possible_buffers_last[1]);\n  for (size_t i = possible_buffer_first; i <= possible_buffer_last; ++i) {\n    if (scaled_resolve_2gb_buffers_[i]) {\n      continue;\n    }\n    D3D12_RESOURCE_DESC scaled_resolve_buffer_desc;\n    // Buffer indices are gigabytes.\n    ui::d3d12::util::FillBufferResourceDesc(\n        scaled_resolve_buffer_desc,\n        std::min(uint64_t(1) << 31, uint64_t(SharedMemory::kBufferSize) *\n                                            draw_resolution_scale_area -\n                                        (uint64_t(i) << 30)),\n        D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS);\n    // The first access will be a resolve.\n    constexpr D3D12_RESOURCE_STATES kScaledResolveVirtualBufferInitialState =\n        D3D12_RESOURCE_STATE_UNORDERED_ACCESS;\n    ID3D12Resource* scaled_resolve_buffer_resource;\n    if (FAILED(device->CreateReservedResource(\n            &scaled_resolve_buffer_desc,\n            kScaledResolveVirtualBufferInitialState, nullptr,\n            IID_PPV_ARGS(&scaled_resolve_buffer_resource)))) {\n      XELOGE(\n          \"D3D12TextureCache: Failed to create a 2 GB tiled buffer for draw \"\n          \"resolution scaling\");\n      return false;\n    }\n    scaled_resolve_2gb_buffers_[i] =\n        std::unique_ptr<ScaledResolveVirtualBuffer>(\n            new ScaledResolveVirtualBuffer(\n                scaled_resolve_buffer_resource,\n                kScaledResolveVirtualBufferInitialState));\n    scaled_resolve_buffer_resource->Release();\n  }\n\n  uint32_t heap_first = uint32_t(first_scaled >> kScaledResolveHeapSizeLog2);\n  uint32_t heap_last = uint32_t(last_scaled >> kScaledResolveHeapSizeLog2);\n  for (uint32_t i = heap_first; i <= heap_last; ++i) {\n    if (scaled_resolve_heaps_[i]) {\n      continue;\n    }\n    auto direct_queue = provider.GetDirectQueue();\n    D3D12_HEAP_DESC heap_desc = {};\n    heap_desc.SizeInBytes = kScaledResolveHeapSize;\n    heap_desc.Properties.Type = D3D12_HEAP_TYPE_DEFAULT;\n    heap_desc.Flags = D3D12_HEAP_FLAG_ALLOW_ONLY_BUFFERS |\n                      provider.GetHeapFlagCreateNotZeroed();\n    Microsoft::WRL::ComPtr<ID3D12Heap> scaled_resolve_heap;\n    if (FAILED(device->CreateHeap(&heap_desc,\n                                  IID_PPV_ARGS(&scaled_resolve_heap)))) {\n      XELOGE(\"D3D12TextureCache: Failed to create a scaled resolve tile heap\");\n      return false;\n    }\n    scaled_resolve_heaps_[i] = scaled_resolve_heap;\n    ++scaled_resolve_heap_count_;\n    COUNT_profile_set(\n        \"gpu/texture_cache/scaled_resolve_buffer_used_mb\",\n        scaled_resolve_heap_count_ << (kScaledResolveHeapSizeLog2 - 20));\n    D3D12_TILED_RESOURCE_COORDINATE region_start_coordinates;\n    region_start_coordinates.Y = 0;\n    region_start_coordinates.Z = 0;\n    region_start_coordinates.Subresource = 0;\n    D3D12_TILE_REGION_SIZE region_size;\n    region_size.NumTiles =\n        kScaledResolveHeapSize / D3D12_TILED_RESOURCE_TILE_SIZE_IN_BYTES;\n    region_size.UseBox = FALSE;\n    D3D12_TILE_RANGE_FLAGS range_flags = D3D12_TILE_RANGE_FLAG_NONE;\n    UINT heap_range_start_offset = 0;\n    UINT range_tile_count =\n        kScaledResolveHeapSize / D3D12_TILED_RESOURCE_TILE_SIZE_IN_BYTES;\n    std::array<size_t, 2> buffer_indices =\n        GetPossibleScaledResolveBufferIndices(uint64_t(i)\n                                              << kScaledResolveHeapSizeLog2);\n    for (size_t j = 0; j < 2; ++j) {\n      size_t buffer_index = buffer_indices[j];\n      if (j && buffer_index == buffer_indices[0]) {\n        break;\n      }\n      region_start_coordinates.X =\n          UINT(((uint64_t(i) << kScaledResolveHeapSizeLog2) -\n                (uint64_t(buffer_index) << 30)) /\n               D3D12_TILED_RESOURCE_TILE_SIZE_IN_BYTES);\n      direct_queue->UpdateTileMappings(\n          scaled_resolve_2gb_buffers_[buffer_index]->resource(), 1,\n          &region_start_coordinates, &region_size, scaled_resolve_heap.Get(), 1,\n          &range_flags, &heap_range_start_offset, &range_tile_count,\n          D3D12_TILE_MAPPING_FLAG_NONE);\n    }\n    command_processor_.NotifyQueueOperationsDoneDirectly();\n  }\n  return true;\n}\n\nbool D3D12TextureCache::MakeScaledResolveRangeCurrent(\n    uint32_t start_unscaled, uint32_t length_unscaled,\n    uint32_t length_scaled_alignment_log2) {\n  assert_true(IsDrawResolutionScaled());\n\n  if (!length_unscaled || start_unscaled >= SharedMemory::kBufferSize ||\n      (SharedMemory::kBufferSize - start_unscaled) < length_unscaled) {\n    // If length is 0, the needed buffer can't be chosen because no buffer is\n    // needed.\n    return false;\n  }\n\n  uint32_t draw_resolution_scale_area =\n      draw_resolution_scale_x() * draw_resolution_scale_y();\n  uint64_t start_scaled = uint64_t(start_unscaled) * draw_resolution_scale_area;\n  uint64_t length_scaled_alignment_bits =\n      (UINT64_C(1) << length_scaled_alignment_log2) - 1;\n  uint64_t length_scaled =\n      (uint64_t(length_unscaled) * draw_resolution_scale_area +\n       length_scaled_alignment_bits) &\n      ~length_scaled_alignment_bits;\n  uint64_t last_scaled = start_scaled + (length_scaled - 1);\n\n  // Get one or two buffers that can hold the whole range.\n  std::array<size_t, 2> possible_buffer_indices_first =\n      GetPossibleScaledResolveBufferIndices(start_scaled);\n  std::array<size_t, 2> possible_buffer_indices_last =\n      GetPossibleScaledResolveBufferIndices(last_scaled);\n  size_t possible_buffer_indices_common[2];\n  size_t possible_buffer_indices_common_count = 0;\n  for (size_t i = 0; i <= size_t(possible_buffer_indices_first[0] !=\n                                 possible_buffer_indices_first[1]);\n       ++i) {\n    size_t possible_buffer_index_first = possible_buffer_indices_first[i];\n    for (size_t j = 0; j <= size_t(possible_buffer_indices_last[0] !=\n                                   possible_buffer_indices_last[1]);\n         ++j) {\n      if (possible_buffer_indices_last[j] == possible_buffer_index_first) {\n        bool possible_buffer_index_already_added = false;\n        for (size_t k = 0; k < possible_buffer_indices_common_count; ++k) {\n          if (possible_buffer_indices_common[k] ==\n              possible_buffer_index_first) {\n            possible_buffer_index_already_added = true;\n            break;\n          }\n        }\n        if (!possible_buffer_index_already_added) {\n          assert_true(possible_buffer_indices_common_count < 2);\n          possible_buffer_indices_common\n              [possible_buffer_indices_common_count++] =\n                  possible_buffer_index_first;\n        }\n      }\n    }\n  }\n  if (!possible_buffer_indices_common_count) {\n    // Too wide range requested - no buffer that contains both the start and the\n    // end.\n    return false;\n  }\n\n  size_t gigabyte_first = size_t(start_scaled >> 30);\n  size_t gigabyte_last = size_t(last_scaled >> 30);\n\n  // Choose the buffer that the range will be accessed through.\n  size_t new_buffer_index;\n  if (possible_buffer_indices_common_count >= 2) {\n    // Prefer the buffer that is already used to make less aliasing barriers.\n    assert_true(gigabyte_first + 1 >= gigabyte_last);\n    size_t possible_buffer_indices_already_used[2] = {};\n    for (size_t i = gigabyte_first; i <= gigabyte_last; ++i) {\n      size_t gigabyte_current_buffer_index =\n          scaled_resolve_1gb_buffer_indices_[i];\n      for (size_t j = 0; j < possible_buffer_indices_common_count; ++j) {\n        if (possible_buffer_indices_common[j] ==\n            gigabyte_current_buffer_index) {\n          ++possible_buffer_indices_already_used[j];\n        }\n      }\n    }\n    new_buffer_index = possible_buffer_indices_common[size_t(\n        possible_buffer_indices_already_used[1] >\n        possible_buffer_indices_already_used[0])];\n  } else {\n    // The range can be accessed only by one buffer.\n    new_buffer_index = possible_buffer_indices_common[0];\n  }\n\n  // Switch the current buffer for the range.\n  const ScaledResolveVirtualBuffer* new_buffer =\n      scaled_resolve_2gb_buffers_[new_buffer_index].get();\n  assert_not_null(new_buffer);\n  ID3D12Resource* new_buffer_resource = new_buffer->resource();\n  for (size_t i = gigabyte_first; i <= gigabyte_last; ++i) {\n    size_t gigabyte_current_buffer_index =\n        scaled_resolve_1gb_buffer_indices_[i];\n    if (gigabyte_current_buffer_index == new_buffer_index) {\n      continue;\n    }\n    if (gigabyte_current_buffer_index != SIZE_MAX) {\n      ScaledResolveVirtualBuffer* gigabyte_current_buffer =\n          scaled_resolve_2gb_buffers_[gigabyte_current_buffer_index].get();\n      assert_not_null(gigabyte_current_buffer);\n      command_processor_.PushAliasingBarrier(\n          gigabyte_current_buffer->resource(), new_buffer_resource);\n      // An aliasing barrier synchronizes and flushes everything.\n      gigabyte_current_buffer->ClearUAVBarrierPending();\n    }\n    scaled_resolve_1gb_buffer_indices_[i] = new_buffer_index;\n  }\n\n  scaled_resolve_current_range_start_scaled_ = start_scaled;\n  scaled_resolve_current_range_length_scaled_ = length_scaled;\n  return true;\n}\n\nvoid D3D12TextureCache::TransitionCurrentScaledResolveRange(\n    D3D12_RESOURCE_STATES new_state) {\n  assert_true(IsDrawResolutionScaled());\n  ScaledResolveVirtualBuffer& buffer = GetCurrentScaledResolveBuffer();\n  command_processor_.PushTransitionBarrier(\n      buffer.resource(), buffer.SetResourceState(new_state), new_state);\n}\n\nD3D12_GPU_VIRTUAL_ADDRESS\nD3D12TextureCache::GetCurrentScaledResolveRangeGPUAddress() const {\n  assert_true(IsDrawResolutionScaled());\n  const size_t buffer_index = GetCurrentScaledResolveBufferIndex();\n  const ScaledResolveVirtualBuffer* buffer =\n      scaled_resolve_2gb_buffers_[buffer_index].get();\n  assert_not_null(buffer);\n  return buffer->resource()->GetGPUVirtualAddress() +\n         (scaled_resolve_current_range_start_scaled_ -\n          (uint64_t(buffer_index) << 30));\n}\n\nID3D12Resource* D3D12TextureCache::RequestSwapTexture(\n    D3D12_SHADER_RESOURCE_VIEW_DESC& srv_desc_out,\n    xenos::TextureFormat& format_out) {\n  const auto& regs = register_file();\n  xenos::xe_gpu_texture_fetch_t fetch = regs.GetTextureFetch(0);\n  TextureKey key;\n  BindingInfoFromFetchConstant(fetch, key, nullptr);\n  if (!key.is_valid || key.base_page == 0 ||\n      key.dimension != xenos::DataDimension::k2DOrStacked) {\n    return nullptr;\n  }\n  D3D12Texture* texture = static_cast<D3D12Texture*>(FindOrCreateTexture(key));\n  if (texture == nullptr || !LoadTextureData(*texture)) {\n    return nullptr;\n  }\n  texture->MarkAsUsed();\n  // The swap texture is likely to be used only for the presentation compute\n  // shader, and not during emulation, where it'd be NON_PIXEL_SHADER_RESOURCE |\n  // PIXEL_SHADER_RESOURCE.\n  ID3D12Resource* texture_resource = texture->resource();\n  command_processor_.PushTransitionBarrier(\n      texture_resource,\n      texture->SetResourceState(D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE),\n      D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE);\n  srv_desc_out.Format = GetDXGIUnormFormat(key);\n  srv_desc_out.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D;\n  srv_desc_out.Shader4ComponentMapping =\n      GuestToHostSwizzle(fetch.swizzle, GetHostFormatSwizzle(key)) |\n      D3D12_SHADER_COMPONENT_MAPPING_ALWAYS_SET_BIT_AVOIDING_ZEROMEM_MISTAKES;\n  srv_desc_out.Texture2D.MostDetailedMip = 0;\n  srv_desc_out.Texture2D.MipLevels = 1;\n  srv_desc_out.Texture2D.PlaneSlice = 0;\n  srv_desc_out.Texture2D.ResourceMinLODClamp = 0.0f;\n  format_out = key.format;\n  return texture_resource;\n}\n\nD3D12TextureCache::D3D12Texture::D3D12Texture(\n    D3D12TextureCache& texture_cache, const TextureKey& key,\n    ID3D12Resource* resource, D3D12_RESOURCE_STATES resource_state)\n    : Texture(texture_cache, key),\n      resource_(resource),\n      resource_state_(resource_state) {\n  ID3D12Device* device =\n      texture_cache.command_processor_.GetD3D12Provider().GetDevice();\n  D3D12_RESOURCE_DESC resource_desc = resource_->GetDesc();\n  SetHostMemoryUsage(\n      device->GetResourceAllocationInfo(0, 1, &resource_desc).SizeInBytes);\n}\n\nD3D12TextureCache::D3D12Texture::~D3D12Texture() {\n  auto& d3d12_texture_cache = static_cast<D3D12TextureCache&>(texture_cache());\n  for (const auto& descriptor_pair : srv_descriptors_) {\n    d3d12_texture_cache.ReleaseTextureDescriptor(descriptor_pair.second);\n  }\n}\n\nbool D3D12TextureCache::IsDecompressionNeeded(xenos::TextureFormat format,\n                                              uint32_t width,\n                                              uint32_t height) const {\n  DXGI_FORMAT dxgi_format_uncompressed =\n      host_formats_[uint32_t(format)].dxgi_format_uncompressed;\n  if (dxgi_format_uncompressed == DXGI_FORMAT_UNKNOWN) {\n    return false;\n  }\n  const FormatInfo* format_info = FormatInfo::Get(format);\n  if (!(width & (format_info->block_width - 1)) &&\n      !(height & (format_info->block_height - 1))) {\n    return false;\n  }\n  // UnalignedBlockTexturesSupported is for block-compressed textures with the\n  // block size of 4x4, but not for 2x1 (4:2:2) subsampled formats.\n  if (format_info->block_width == 4 && format_info->block_height == 4 &&\n      command_processor_.GetD3D12Provider()\n          .AreUnalignedBlockTexturesSupported()) {\n    return false;\n  }\n  return true;\n}\n\nTextureCache::LoadShaderIndex D3D12TextureCache::GetLoadShaderIndex(\n    TextureKey key) const {\n  const HostFormat& host_format = host_formats_[uint32_t(key.format)];\n  if (key.signed_separate) {\n    return host_format.load_shader_signed;\n  }\n  if (IsDecompressionNeeded(key.format, key.GetWidth(), key.GetHeight())) {\n    return host_format.load_shader_decompress;\n  }\n  return host_format.load_shader;\n}\n\nbool D3D12TextureCache::IsSignedVersionSeparateForFormat(TextureKey key) const {\n  const HostFormat& host_format = host_formats_[uint32_t(key.format)];\n  return host_format.load_shader_signed != kLoadShaderIndexUnknown &&\n         host_format.load_shader_signed != host_format.load_shader;\n}\n\nbool D3D12TextureCache::IsScaledResolveSupportedForFormat(\n    TextureKey key) const {\n  LoadShaderIndex load_shader = GetLoadShaderIndex(key);\n  return load_shader != kLoadShaderIndexUnknown &&\n         load_pipelines_scaled_[load_shader] != nullptr;\n}\n\nuint32_t D3D12TextureCache::GetHostFormatSwizzle(TextureKey key) const {\n  return host_formats_[uint32_t(key.format)].swizzle;\n}\n\nuint32_t D3D12TextureCache::GetMaxHostTextureWidthHeight(\n    xenos::DataDimension dimension) const {\n  switch (dimension) {\n    case xenos::DataDimension::k1D:\n    case xenos::DataDimension::k2DOrStacked:\n      // 1D and 2D are emulated as 2D arrays.\n      return D3D12_REQ_TEXTURE2D_U_OR_V_DIMENSION;\n    case xenos::DataDimension::k3D:\n      return D3D12_REQ_TEXTURE3D_U_V_OR_W_DIMENSION;\n    case xenos::DataDimension::kCube:\n      return D3D12_REQ_TEXTURECUBE_DIMENSION;\n    default:\n      assert_unhandled_case(dimension);\n      return 0;\n  }\n}\n\nuint32_t D3D12TextureCache::GetMaxHostTextureDepthOrArraySize(\n    xenos::DataDimension dimension) const {\n  switch (dimension) {\n    case xenos::DataDimension::k1D:\n    case xenos::DataDimension::k2DOrStacked:\n      // 1D and 2D are emulated as 2D arrays.\n      return D3D12_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION;\n    case xenos::DataDimension::k3D:\n      return D3D12_REQ_TEXTURE3D_U_V_OR_W_DIMENSION;\n    case xenos::DataDimension::kCube:\n      return D3D12_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION / 6 * 6;\n    default:\n      assert_unhandled_case(dimension);\n      return 0;\n  }\n}\n\nstd::unique_ptr<TextureCache::Texture> D3D12TextureCache::CreateTexture(\n    TextureKey key) {\n  D3D12_RESOURCE_DESC desc;\n  desc.Format = GetDXGIResourceFormat(key);\n  if (desc.Format == DXGI_FORMAT_UNKNOWN) {\n    unsupported_format_features_used_[uint32_t(key.format)] |=\n        kUnsupportedResourceBit;\n    return nullptr;\n  }\n  if (key.dimension == xenos::DataDimension::k3D) {\n    desc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE3D;\n  } else {\n    // 1D textures are treated as 2D for simplicity.\n    desc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D;\n  }\n  desc.Alignment = 0;\n  desc.Width = key.GetWidth();\n  desc.Height = key.GetHeight();\n  if (key.scaled_resolve) {\n    desc.Width *= draw_resolution_scale_x();\n    desc.Height *= draw_resolution_scale_y();\n  }\n  desc.DepthOrArraySize = key.GetDepthOrArraySize();\n  desc.MipLevels = key.mip_max_level + 1;\n  desc.SampleDesc.Count = 1;\n  desc.SampleDesc.Quality = 0;\n  desc.Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN;\n  // Untiling through a buffer instead of using unordered access because copying\n  // is not done that often.\n  desc.Flags = D3D12_RESOURCE_FLAG_NONE;\n  const ui::d3d12::D3D12Provider& provider =\n      command_processor_.GetD3D12Provider();\n  ID3D12Device* device = provider.GetDevice();\n  // Assuming untiling will be the next operation.\n  D3D12_RESOURCE_STATES resource_state = D3D12_RESOURCE_STATE_COPY_DEST;\n  Microsoft::WRL::ComPtr<ID3D12Resource> resource;\n  if (FAILED(device->CreateCommittedResource(\n          &ui::d3d12::util::kHeapPropertiesDefault,\n          provider.GetHeapFlagCreateNotZeroed(), &desc, resource_state, nullptr,\n          IID_PPV_ARGS(&resource)))) {\n    return nullptr;\n  }\n  return std::unique_ptr<Texture>(\n      new D3D12Texture(*this, key, resource.Get(), resource_state));\n}\n\nbool D3D12TextureCache::LoadTextureDataFromResidentMemoryImpl(Texture& texture,\n                                                              bool load_base,\n                                                              bool load_mips) {\n  D3D12Texture& d3d12_texture = static_cast<D3D12Texture&>(texture);\n  TextureKey texture_key = d3d12_texture.key();\n\n  DeferredCommandList& command_list =\n      command_processor_.GetDeferredCommandList();\n  ID3D12Device* device = command_processor_.GetD3D12Provider().GetDevice();\n\n  // Get the pipeline.\n  LoadShaderIndex load_shader = GetLoadShaderIndex(texture_key);\n  if (load_shader == kLoadShaderIndexUnknown) {\n    return false;\n  }\n  bool texture_resolution_scaled = texture_key.scaled_resolve;\n  ID3D12PipelineState* pipeline =\n      texture_resolution_scaled ? load_pipelines_scaled_[load_shader].Get()\n                                : load_pipelines_[load_shader].Get();\n  if (pipeline == nullptr) {\n    return false;\n  }\n  const LoadShaderInfo& load_shader_info = GetLoadShaderInfo(load_shader);\n\n  // Get the guest layout.\n  const texture_util::TextureGuestLayout& guest_layout =\n      d3d12_texture.guest_layout();\n  xenos::DataDimension dimension = texture_key.dimension;\n  bool is_3d = dimension == xenos::DataDimension::k3D;\n  uint32_t width = texture_key.GetWidth();\n  uint32_t height = texture_key.GetHeight();\n  uint32_t depth_or_array_size = texture_key.GetDepthOrArraySize();\n  uint32_t depth = is_3d ? depth_or_array_size : 1;\n  uint32_t array_size = is_3d ? 1 : depth_or_array_size;\n  xenos::TextureFormat guest_format = texture_key.format;\n  const FormatInfo* guest_format_info = FormatInfo::Get(guest_format);\n  uint32_t block_width = guest_format_info->block_width;\n  uint32_t block_height = guest_format_info->block_height;\n  uint32_t bytes_per_block = guest_format_info->bytes_per_block();\n  uint32_t level_first = load_base ? 0 : 1;\n  uint32_t level_last = load_mips ? texture_key.mip_max_level : 0;\n  assert_true(level_first <= level_last);\n  uint32_t level_packed = guest_layout.packed_level;\n  uint32_t level_stored_first = std::min(level_first, level_packed);\n  uint32_t level_stored_last = std::min(level_last, level_packed);\n  uint32_t texture_resolution_scale_x =\n      texture_resolution_scaled ? draw_resolution_scale_x() : 1;\n  uint32_t texture_resolution_scale_y =\n      texture_resolution_scaled ? draw_resolution_scale_y() : 1;\n\n  // The loop counter can mean two things depending on whether the packed mip\n  // tail is stored as mip 0, because in this case, it would be ambiguous since\n  // both the base and the mips would be on \"level 0\", but stored in separate\n  // places.\n  uint32_t loop_level_first, loop_level_last;\n  if (level_packed == 0) {\n    // Packed mip tail is the level 0 - may need to load mip tails for the base,\n    // the mips, or both.\n    // Loop iteration 0 - base packed mip tail.\n    // Loop iteration 1 - mips packed mip tail.\n    loop_level_first = uint32_t(level_first != 0);\n    loop_level_last = uint32_t(level_last != 0);\n  } else {\n    // Packed mip tail is not the level 0.\n    // Loop iteration is the actual level being loaded.\n    loop_level_first = level_stored_first;\n    loop_level_last = level_stored_last;\n  }\n\n  // Get the host layout and the buffer.\n  bool host_block_compressed =\n      host_formats_[uint32_t(guest_format)].is_block_compressed &&\n      !IsDecompressionNeeded(guest_format, width, height);\n  uint32_t host_block_width = host_block_compressed ? block_width : 1;\n  uint32_t host_block_height = host_block_compressed ? block_height : 1;\n  uint32_t host_x_blocks_per_thread =\n      UINT32_C(1) << load_shader_info.guest_x_blocks_per_thread_log2;\n  if (!host_block_compressed) {\n    // Decompressing guest blocks.\n    host_x_blocks_per_thread *= block_width;\n  }\n  UINT64 copy_buffer_size = 0;\n  D3D12_PLACED_SUBRESOURCE_FOOTPRINT host_slice_layout_base;\n  UINT64 host_slice_size_base;\n  // Indexing is the same as for guest stored mips:\n  // 1...min(level_last, level_packed) if level_packed is not 0, or only 0 if\n  // level_packed == 0.\n  D3D12_PLACED_SUBRESOURCE_FOOTPRINT\n  host_slice_layouts_mips[xenos::kTextureMaxMips];\n  UINT64 host_slice_sizes_mips[xenos::kTextureMaxMips];\n  // Using custom calculations instead of GetCopyableFootprints because\n  // shaders may unconditionally copy multiple blocks along X per thread for\n  // simplicity, to make sure all rows (also including the last one -\n  // GetCopyableFootprints aligns row offsets, but not the total size) are\n  // properly padded to the number of blocks copied in an invocation without\n  // implicit assumptions about D3D12_TEXTURE_DATA_PITCH_ALIGNMENT.\n  DXGI_FORMAT host_copy_format =\n      GetDXGIResourceFormat(guest_format, width, height);\n  for (uint32_t loop_level = loop_level_first; loop_level <= loop_level_last;\n       ++loop_level) {\n    bool is_base = loop_level == 0;\n    uint32_t level = (level_packed == 0) ? 0 : loop_level;\n    D3D12_PLACED_SUBRESOURCE_FOOTPRINT& level_host_slice_layout =\n        is_base ? host_slice_layout_base : host_slice_layouts_mips[level];\n    level_host_slice_layout.Offset = copy_buffer_size;\n    level_host_slice_layout.Footprint.Format = host_copy_format;\n    if (level == level_packed) {\n      // Loading the packed tail for the base or the mips - load the whole tail\n      // to copy regions out of it.\n      const texture_util::TextureGuestLayout::Level& guest_layout_packed =\n          is_base ? guest_layout.base : guest_layout.mips[level];\n      level_host_slice_layout.Footprint.Width =\n          guest_layout_packed.x_extent_blocks * block_width;\n      level_host_slice_layout.Footprint.Height =\n          guest_layout_packed.y_extent_blocks * block_height;\n      level_host_slice_layout.Footprint.Depth = guest_layout_packed.z_extent;\n    } else {\n      level_host_slice_layout.Footprint.Width =\n          std::max(width >> level, uint32_t(1));\n      level_host_slice_layout.Footprint.Height =\n          std::max(height >> level, uint32_t(1));\n      level_host_slice_layout.Footprint.Depth =\n          std::max(depth >> level, uint32_t(1));\n    }\n    level_host_slice_layout.Footprint.Width = xe::round_up(\n        level_host_slice_layout.Footprint.Width * texture_resolution_scale_x,\n        UINT(host_block_width));\n    level_host_slice_layout.Footprint.Height = xe::round_up(\n        level_host_slice_layout.Footprint.Height * texture_resolution_scale_y,\n        UINT(host_block_height));\n    level_host_slice_layout.Footprint.RowPitch = xe::align(\n        xe::round_up(level_host_slice_layout.Footprint.Width / host_block_width,\n                     host_x_blocks_per_thread) *\n            load_shader_info.bytes_per_host_block,\n        uint32_t(D3D12_TEXTURE_DATA_PITCH_ALIGNMENT));\n    UINT64 level_host_slice_size = xe::align(\n        UINT64(level_host_slice_layout.Footprint.RowPitch) *\n            (level_host_slice_layout.Footprint.Height / host_block_height) *\n            level_host_slice_layout.Footprint.Depth,\n        UINT64(D3D12_TEXTURE_DATA_PLACEMENT_ALIGNMENT));\n    (is_base ? host_slice_size_base : host_slice_sizes_mips[level]) =\n        level_host_slice_size;\n    copy_buffer_size += level_host_slice_size * array_size;\n  }\n  D3D12_RESOURCE_STATES copy_buffer_state =\n      D3D12_RESOURCE_STATE_UNORDERED_ACCESS;\n  ID3D12Resource* copy_buffer = command_processor_.RequestScratchGPUBuffer(\n      uint32_t(copy_buffer_size), copy_buffer_state);\n  if (copy_buffer == nullptr) {\n    return false;\n  }\n\n  command_processor_.SetExternalPipeline(pipeline);\n  command_list.D3DSetComputeRootSignature(load_root_signature_.Get());\n  command_list.D3DSetComputeRootUnorderedAccessView(\n      2, copy_buffer->GetGPUVirtualAddress());\n  // Set up the unscaled source binding (scaled may have the base and the mips\n  // in different buffer resources).\n  if (!texture_resolution_scaled) {\n    D3D12SharedMemory& d3d12_shared_memory =\n        static_cast<D3D12SharedMemory&>(shared_memory());\n    d3d12_shared_memory.UseForReading();\n    command_list.D3DSetComputeRootShaderResourceView(\n        1, d3d12_shared_memory.GetGPUAddress());\n  }\n\n  // Submit the copy buffer population commands.\n\n  auto& cbuffer_pool = command_processor_.GetConstantBufferPool();\n  LoadConstants load_constants;\n  // 3 bits for each.\n  assert_true(texture_resolution_scale_x <= 7);\n  assert_true(texture_resolution_scale_y <= 7);\n  load_constants.is_tiled_3d_endian_scale =\n      uint32_t(texture_key.tiled) | (uint32_t(is_3d) << 1) |\n      (uint32_t(texture_key.endianness) << 2) |\n      (texture_resolution_scale_x << 4) | (texture_resolution_scale_y << 7);\n\n  // The loop is slices within levels because the base and the levels may need\n  // different portions of the scaled resolve virtual address space to be\n  // available through buffers, and to create a descriptor, the buffer start\n  // address is required - which may be different for base and mips.\n  bool scaled_mips_source_set_up = false;\n  uint32_t guest_x_blocks_per_group_log2 =\n      load_shader_info.GetGuestXBlocksPerGroupLog2();\n  for (uint32_t loop_level = loop_level_first; loop_level <= loop_level_last;\n       ++loop_level) {\n    bool is_base = loop_level == 0;\n    uint32_t level = (level_packed == 0) ? 0 : loop_level;\n\n    uint32_t guest_address =\n        (is_base ? texture_key.base_page : texture_key.mip_page) << 12;\n\n    // Set up the base or mips source, also making it accessible if loading from\n    // scaled resolve memory.\n    if (texture_resolution_scaled && (is_base || !scaled_mips_source_set_up)) {\n      uint32_t guest_size_unscaled = is_base ? d3d12_texture.GetGuestBaseSize()\n                                             : d3d12_texture.GetGuestMipsSize();\n      if (!MakeScaledResolveRangeCurrent(guest_address, guest_size_unscaled,\n                                         4)) {\n        command_processor_.ReleaseScratchGPUBuffer(copy_buffer,\n                                                   copy_buffer_state);\n        return false;\n      }\n      TransitionCurrentScaledResolveRange(\n          D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE);\n      command_list.D3DSetComputeRootShaderResourceView(\n          1, GetCurrentScaledResolveRangeGPUAddress());\n      if (!is_base) {\n        scaled_mips_source_set_up = true;\n      }\n    }\n\n    if (texture_resolution_scaled) {\n      // Offset already applied in the buffer because more than 512 MB can't be\n      // directly addresses as R32 on some hardware (above\n      // 2^D3D12_REQ_BUFFER_RESOURCE_TEXEL_COUNT_2_TO_EXP).\n      load_constants.guest_offset = 0;\n    } else {\n      load_constants.guest_offset = guest_address;\n    }\n    if (!is_base) {\n      load_constants.guest_offset +=\n          guest_layout.mip_offsets_bytes[level] *\n          (texture_resolution_scale_x * texture_resolution_scale_y);\n    }\n    const texture_util::TextureGuestLayout::Level& level_guest_layout =\n        is_base ? guest_layout.base : guest_layout.mips[level];\n    load_constants.guest_pitch_aligned =\n        level_guest_layout.row_pitch_bytes / bytes_per_block;\n    load_constants.guest_z_stride_block_rows_aligned =\n        level_guest_layout.z_slice_stride_block_rows;\n    assert_true(dimension != xenos::DataDimension::k3D ||\n                !(load_constants.guest_z_stride_block_rows_aligned &\n                  (xenos::kTextureTileWidthHeight - 1)));\n\n    uint32_t level_width, level_height, level_depth;\n    if (level == level_packed) {\n      // This is the packed mip tail, containing not only the specified level,\n      // but also other levels at different offsets - load the entire needed\n      // extents.\n      level_width = level_guest_layout.x_extent_blocks * block_width;\n      level_height = level_guest_layout.y_extent_blocks * block_height;\n      level_depth = level_guest_layout.z_extent;\n    } else {\n      level_width = std::max(width >> level, uint32_t(1));\n      level_height = std::max(height >> level, uint32_t(1));\n      level_depth = std::max(depth >> level, uint32_t(1));\n    }\n    load_constants.size_blocks[0] = (level_width + (block_width - 1)) /\n                                    block_width * texture_resolution_scale_x;\n    load_constants.size_blocks[1] = (level_height + (block_height - 1)) /\n                                    block_height * texture_resolution_scale_y;\n    load_constants.size_blocks[2] = level_depth;\n    load_constants.height_texels = level_height;\n\n    uint32_t group_count_x =\n        (load_constants.size_blocks[0] +\n         ((UINT32_C(1) << guest_x_blocks_per_group_log2) - 1)) >>\n        guest_x_blocks_per_group_log2;\n    uint32_t group_count_y =\n        (load_constants.size_blocks[1] +\n         ((UINT32_C(1) << kLoadGuestYBlocksPerGroupLog2) - 1)) >>\n        kLoadGuestYBlocksPerGroupLog2;\n\n    const D3D12_PLACED_SUBRESOURCE_FOOTPRINT& level_host_slice_layout =\n        is_base ? host_slice_layout_base : host_slice_layouts_mips[level];\n    uint32_t host_slice_size =\n        uint32_t(is_base ? host_slice_size_base : host_slice_sizes_mips[level]);\n    load_constants.host_offset = uint32_t(level_host_slice_layout.Offset);\n    load_constants.host_pitch = level_host_slice_layout.Footprint.RowPitch;\n\n    command_list.D3DSetComputeRoot32BitConstants(\n        0, sizeof(load_constants) / sizeof(uint32_t), &load_constants, 0);\n\n    uint32_t level_array_slice_stride_bytes_scaled =\n        level_guest_layout.array_slice_stride_bytes *\n        (texture_resolution_scale_x * texture_resolution_scale_y);\n    for (uint32_t slice = 0; slice < array_size; ++slice) {\n      if (slice != 0) {\n        command_list.D3DSetComputeRoot32BitConstants(\n            0, sizeof(load_constants.guest_offset) / sizeof(uint32_t),\n            &load_constants.guest_offset,\n            offsetof(LoadConstants, guest_offset) / sizeof(uint32_t));\n        command_list.D3DSetComputeRoot32BitConstants(\n            0, sizeof(load_constants.host_offset) / sizeof(uint32_t),\n            &load_constants.host_offset,\n            offsetof(LoadConstants, host_offset) / sizeof(uint32_t));\n      }\n      assert_true(copy_buffer_state == D3D12_RESOURCE_STATE_UNORDERED_ACCESS);\n      command_processor_.SubmitBarriers();\n      command_list.D3DDispatch(group_count_x, group_count_y,\n                               load_constants.size_blocks[2]);\n      load_constants.guest_offset += level_array_slice_stride_bytes_scaled;\n      load_constants.host_offset += host_slice_size;\n    }\n  }\n\n  // Update LRU caching because the texture will be used by the command list.\n  d3d12_texture.MarkAsUsed();\n\n  // Submit copying from the copy buffer to the host texture.\n  ID3D12Resource* texture_resource = d3d12_texture.resource();\n  command_processor_.PushTransitionBarrier(\n      texture_resource,\n      d3d12_texture.SetResourceState(D3D12_RESOURCE_STATE_COPY_DEST),\n      D3D12_RESOURCE_STATE_COPY_DEST);\n  command_processor_.PushTransitionBarrier(copy_buffer, copy_buffer_state,\n                                           D3D12_RESOURCE_STATE_COPY_SOURCE);\n  copy_buffer_state = D3D12_RESOURCE_STATE_COPY_SOURCE;\n  command_processor_.SubmitBarriers();\n  uint32_t texture_level_count = texture_key.mip_max_level + 1;\n  D3D12_TEXTURE_COPY_LOCATION location_source, location_dest;\n  location_source.pResource = copy_buffer;\n  location_source.Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT;\n  location_dest.pResource = texture_resource;\n  location_dest.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX;\n  for (uint32_t level = level_first; level <= level_last; ++level) {\n    uint32_t guest_level = std::min(level, level_packed);\n    location_source.PlacedFootprint =\n        level ? host_slice_layouts_mips[guest_level] : host_slice_layout_base;\n    location_dest.SubresourceIndex = level;\n    UINT64 host_slice_size =\n        level ? host_slice_sizes_mips[guest_level] : host_slice_size_base;\n    D3D12_BOX source_box;\n    const D3D12_BOX* source_box_ptr;\n    if (level >= level_packed) {\n      uint32_t level_offset_blocks_x, level_offset_blocks_y, level_offset_z;\n      texture_util::GetPackedMipOffset(width, height, depth, guest_format,\n                                       level, level_offset_blocks_x,\n                                       level_offset_blocks_y, level_offset_z);\n      source_box.left =\n          level_offset_blocks_x * block_width * texture_resolution_scale_x;\n      source_box.top =\n          level_offset_blocks_y * block_height * texture_resolution_scale_y;\n      source_box.front = level_offset_z;\n      source_box.right =\n          source_box.left +\n          xe::align(std::max((width * texture_resolution_scale_x) >> level,\n                             uint32_t(1)),\n                    host_block_width);\n      source_box.bottom =\n          source_box.top +\n          xe::align(std::max((height * texture_resolution_scale_y) >> level,\n                             uint32_t(1)),\n                    host_block_height);\n      source_box.back =\n          source_box.front + std::max(depth >> level, uint32_t(1));\n      source_box_ptr = &source_box;\n    } else {\n      source_box_ptr = nullptr;\n    }\n    for (uint32_t slice = 0; slice < array_size; ++slice) {\n      command_list.D3DCopyTextureRegion(&location_dest, 0, 0, 0,\n                                        &location_source, source_box_ptr);\n      location_dest.SubresourceIndex += texture_level_count;\n      location_source.PlacedFootprint.Offset += host_slice_size;\n    }\n  }\n\n  command_processor_.ReleaseScratchGPUBuffer(copy_buffer, copy_buffer_state);\n\n  return true;\n}\n\nvoid D3D12TextureCache::UpdateTextureBindingsImpl(\n    uint32_t fetch_constant_mask) {\n  uint32_t bindings_remaining = fetch_constant_mask;\n  uint32_t binding_index;\n  while (xe::bit_scan_forward(bindings_remaining, &binding_index)) {\n    bindings_remaining &= ~(UINT32_C(1) << binding_index);\n    D3D12TextureBinding& d3d12_binding = d3d12_texture_bindings_[binding_index];\n    d3d12_binding.Reset();\n    const TextureBinding* binding = GetValidTextureBinding(binding_index);\n    if (!binding) {\n      continue;\n    }\n    if (IsSignedVersionSeparateForFormat(binding->key)) {\n      if (binding->texture &&\n          texture_util::IsAnySignNotSigned(binding->swizzled_signs)) {\n        d3d12_binding.descriptor_index = FindOrCreateTextureDescriptor(\n            *static_cast<D3D12Texture*>(binding->texture), false,\n            binding->host_swizzle);\n      }\n      if (binding->texture_signed &&\n          texture_util::IsAnySignSigned(binding->swizzled_signs)) {\n        d3d12_binding.descriptor_index_signed = FindOrCreateTextureDescriptor(\n            *static_cast<D3D12Texture*>(binding->texture_signed), true,\n            binding->host_swizzle);\n      }\n    } else {\n      D3D12Texture* texture = static_cast<D3D12Texture*>(binding->texture);\n      if (texture) {\n        if (texture_util::IsAnySignNotSigned(binding->swizzled_signs)) {\n          d3d12_binding.descriptor_index = FindOrCreateTextureDescriptor(\n              *texture, false, binding->host_swizzle);\n        }\n        if (texture_util::IsAnySignSigned(binding->swizzled_signs)) {\n          d3d12_binding.descriptor_index_signed = FindOrCreateTextureDescriptor(\n              *texture, true, binding->host_swizzle);\n        }\n      }\n    }\n  }\n}\n\nuint32_t D3D12TextureCache::FindOrCreateTextureDescriptor(\n    D3D12Texture& texture, bool is_signed, uint32_t host_swizzle) {\n  D3D12Texture::SRVDescriptorKey descriptor_key;\n  descriptor_key.is_signed = uint32_t(is_signed);\n  descriptor_key.host_swizzle = host_swizzle;\n\n  // Try to find an existing descriptor.\n  uint32_t existing_descriptor_index =\n      texture.GetSRVDescriptorIndex(descriptor_key);\n  if (existing_descriptor_index != UINT32_MAX) {\n    return existing_descriptor_index;\n  }\n\n  TextureKey texture_key = texture.key();\n\n  // Create a new bindless or cached descriptor if supported.\n  D3D12_SHADER_RESOURCE_VIEW_DESC desc;\n\n  if (IsSignedVersionSeparateForFormat(texture_key) &&\n      texture_key.signed_separate != uint32_t(is_signed)) {\n    // Not the version with the needed signedness.\n    return UINT32_MAX;\n  }\n  xenos::TextureFormat format = texture_key.format;\n  if (is_signed) {\n    // Not supporting signed compressed textures - hopefully DXN and DXT5A are\n    // not used as signed.\n    desc.Format = host_formats_[uint32_t(format)].dxgi_format_signed;\n  } else {\n    desc.Format = GetDXGIUnormFormat(texture_key);\n  }\n  if (desc.Format == DXGI_FORMAT_UNKNOWN) {\n    unsupported_format_features_used_[uint32_t(format)] |=\n        is_signed ? kUnsupportedSnormBit : kUnsupportedUnormBit;\n    return UINT32_MAX;\n  }\n\n  uint32_t mip_levels = texture_key.mip_max_level + 1;\n  switch (texture_key.dimension) {\n    case xenos::DataDimension::k1D:\n    case xenos::DataDimension::k2DOrStacked:\n      desc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2DARRAY;\n      desc.Texture2DArray.MostDetailedMip = 0;\n      desc.Texture2DArray.MipLevels = mip_levels;\n      desc.Texture2DArray.FirstArraySlice = 0;\n      desc.Texture2DArray.ArraySize = texture_key.GetDepthOrArraySize();\n      desc.Texture2DArray.PlaneSlice = 0;\n      desc.Texture2DArray.ResourceMinLODClamp = 0.0f;\n      break;\n    case xenos::DataDimension::k3D:\n      desc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE3D;\n      desc.Texture3D.MostDetailedMip = 0;\n      desc.Texture3D.MipLevels = mip_levels;\n      desc.Texture3D.ResourceMinLODClamp = 0.0f;\n      break;\n    case xenos::DataDimension::kCube:\n      desc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURECUBE;\n      desc.TextureCube.MostDetailedMip = 0;\n      desc.TextureCube.MipLevels = mip_levels;\n      desc.TextureCube.ResourceMinLODClamp = 0.0f;\n      break;\n    default:\n      assert_unhandled_case(texture_key.dimension);\n      return UINT32_MAX;\n  }\n\n  desc.Shader4ComponentMapping =\n      host_swizzle |\n      D3D12_SHADER_COMPONENT_MAPPING_ALWAYS_SET_BIT_AVOIDING_ZEROMEM_MISTAKES;\n\n  ID3D12Device* device = command_processor_.GetD3D12Provider().GetDevice();\n  uint32_t descriptor_index;\n  if (bindless_resources_used_) {\n    descriptor_index =\n        command_processor_.RequestPersistentViewBindlessDescriptor();\n    if (descriptor_index == UINT32_MAX) {\n      XELOGE(\n          \"Failed to create a texture descriptor - no free bindless view \"\n          \"descriptors\");\n      return UINT32_MAX;\n    }\n  } else {\n    if (!srv_descriptor_cache_free_.empty()) {\n      descriptor_index = srv_descriptor_cache_free_.back();\n      srv_descriptor_cache_free_.pop_back();\n    } else {\n      // Allocated + 1 (including the descriptor that is being added), rounded\n      // up to kSRVDescriptorCachePageSize, (allocated + 1 + size - 1).\n      uint32_t cache_pages_needed =\n          (srv_descriptor_cache_allocated_ + kSRVDescriptorCachePageSize) /\n          kSRVDescriptorCachePageSize;\n      if (srv_descriptor_cache_.size() < cache_pages_needed) {\n        D3D12_DESCRIPTOR_HEAP_DESC cache_heap_desc;\n        cache_heap_desc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV;\n        cache_heap_desc.NumDescriptors = kSRVDescriptorCachePageSize;\n        cache_heap_desc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE;\n        cache_heap_desc.NodeMask = 0;\n        while (srv_descriptor_cache_.size() < cache_pages_needed) {\n          Microsoft::WRL::ComPtr<ID3D12DescriptorHeap> cache_heap;\n          if (FAILED(device->CreateDescriptorHeap(&cache_heap_desc,\n                                                  IID_PPV_ARGS(&cache_heap)))) {\n            XELOGE(\n                \"D3D12TextureCache: Failed to create a texture descriptor - \"\n                \"couldn't create a descriptor cache heap\");\n            return UINT32_MAX;\n          }\n          srv_descriptor_cache_.emplace_back(cache_heap.Get());\n        }\n      }\n      descriptor_index = srv_descriptor_cache_allocated_++;\n    }\n  }\n  device->CreateShaderResourceView(\n      texture.resource(), &desc,\n      GetTextureDescriptorCPUHandle(descriptor_index));\n  texture.AddSRVDescriptorIndex(descriptor_key, descriptor_index);\n  return descriptor_index;\n}\n\nvoid D3D12TextureCache::ReleaseTextureDescriptor(uint32_t descriptor_index) {\n  if (bindless_resources_used_) {\n    command_processor_.ReleaseViewBindlessDescriptorImmediately(\n        descriptor_index);\n  } else {\n    srv_descriptor_cache_free_.push_back(descriptor_index);\n  }\n}\n\nD3D12_CPU_DESCRIPTOR_HANDLE D3D12TextureCache::GetTextureDescriptorCPUHandle(\n    uint32_t descriptor_index) const {\n  const ui::d3d12::D3D12Provider& provider =\n      command_processor_.GetD3D12Provider();\n  if (bindless_resources_used_) {\n    return provider.OffsetViewDescriptor(\n        command_processor_.GetViewBindlessHeapCPUStart(), descriptor_index);\n  }\n  D3D12_CPU_DESCRIPTOR_HANDLE heap_start =\n      srv_descriptor_cache_[descriptor_index / kSRVDescriptorCachePageSize]\n          .heap_start();\n  uint32_t heap_offset = descriptor_index % kSRVDescriptorCachePageSize;\n  return provider.OffsetViewDescriptor(heap_start, heap_offset);\n}\n\nxenos::ClampMode D3D12TextureCache::NormalizeClampMode(\n    xenos::ClampMode clamp_mode) const {\n  if (clamp_mode == xenos::ClampMode::kClampToHalfway) {\n    // No GL_CLAMP (clamp to half edge, half border) equivalent in Direct3D 12,\n    // but there's no Direct3D 9 equivalent anyway, and too weird to be suitable\n    // for intentional real usage.\n    return xenos::ClampMode::kClampToEdge;\n  }\n  if (clamp_mode == xenos::ClampMode::kMirrorClampToHalfway ||\n      clamp_mode == xenos::ClampMode::kMirrorClampToBorder) {\n    // No Direct3D 12 equivalents.\n    return xenos::ClampMode::kMirrorClampToEdge;\n  }\n  return clamp_mode;\n}\n\n}  // namespace d3d12\n}  // namespace gpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/d3d12/d3d12_texture_cache.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_D3D12_D3D12_TEXTURE_CACHE_H_\n#define XENIA_GPU_D3D12_D3D12_TEXTURE_CACHE_H_\n\n#include <array>\n#include <functional>\n#include <memory>\n#include <unordered_map>\n#include <utility>\n#include <vector>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/gpu/d3d12/d3d12_shader.h\"\n#include \"xenia/gpu/d3d12/d3d12_shared_memory.h\"\n#include \"xenia/gpu/register_file.h\"\n#include \"xenia/gpu/texture_cache.h\"\n#include \"xenia/gpu/texture_util.h\"\n#include \"xenia/gpu/xenos.h\"\n#include \"xenia/ui/d3d12/d3d12_api.h\"\n#include \"xenia/ui/d3d12/d3d12_provider.h\"\n\nnamespace xe {\nnamespace gpu {\nnamespace d3d12 {\n\nclass D3D12CommandProcessor;\n\nclass D3D12TextureCache final : public TextureCache {\n public:\n  // Keys that can be stored for checking validity whether descriptors for host\n  // shader bindings are up to date.\n  struct TextureSRVKey {\n    TextureKey key;\n    uint32_t host_swizzle;\n    uint8_t swizzled_signs;\n  };\n\n  // Sampler parameters that can be directly converted to a host sampler or used\n  // for binding checking validity whether samplers are up to date.\n  union SamplerParameters {\n    uint32_t value;\n    struct {\n      xenos::ClampMode clamp_x : 3;         // 3\n      xenos::ClampMode clamp_y : 3;         // 6\n      xenos::ClampMode clamp_z : 3;         // 9\n      xenos::BorderColor border_color : 2;  // 11\n      // For anisotropic, these are true.\n      uint32_t mag_linear : 1;              // 12\n      uint32_t min_linear : 1;              // 13\n      uint32_t mip_linear : 1;              // 14\n      xenos::AnisoFilter aniso_filter : 3;  // 17\n      uint32_t mip_min_level : 4;           // 21\n      uint32_t mip_base_map : 1;            // 22\n      // Maximum mip level is in the texture resource itself, but mip_base_map\n      // can be used to limit fetching to mip_min_level.\n    };\n\n    SamplerParameters() : value(0) { static_assert_size(*this, sizeof(value)); }\n    bool operator==(const SamplerParameters& parameters) const {\n      return value == parameters.value;\n    }\n    bool operator!=(const SamplerParameters& parameters) const {\n      return value != parameters.value;\n    }\n  };\n\n  static std::unique_ptr<D3D12TextureCache> Create(\n      const RegisterFile& register_file, D3D12SharedMemory& shared_memory,\n      uint32_t draw_resolution_scale_x, uint32_t draw_resolution_scale_y,\n      D3D12CommandProcessor& command_processor, bool bindless_resources_used) {\n    std::unique_ptr<D3D12TextureCache> texture_cache(new D3D12TextureCache(\n        register_file, shared_memory, draw_resolution_scale_x,\n        draw_resolution_scale_y, command_processor, bindless_resources_used));\n    if (!texture_cache->Initialize()) {\n      return nullptr;\n    }\n    return std::move(texture_cache);\n  }\n\n  ~D3D12TextureCache();\n\n  void ClearCache();\n\n  void BeginSubmission(uint64_t new_submission_index) override;\n  void BeginFrame() override;\n  void EndFrame();\n\n  // Must be called within a submission - creates and untiles textures needed by\n  // shaders and puts them in the SRV state. This may bind compute pipelines\n  // (notifying the command processor about that), so this must be called before\n  // binding the actual drawing pipeline.\n  void RequestTextures(uint32_t used_texture_mask) override;\n\n  // Returns whether texture SRV keys stored externally are still valid for the\n  // current bindings and host shader binding layout. Both keys and\n  // host_shader_bindings must have host_shader_binding_count elements\n  // (otherwise they are incompatible - like if this function returned false).\n  bool AreActiveTextureSRVKeysUpToDate(\n      const TextureSRVKey* keys,\n      const D3D12Shader::TextureBinding* host_shader_bindings,\n      size_t host_shader_binding_count) const;\n  // Exports the current binding data to texture SRV keys so they can be stored\n  // for checking whether subsequent draw calls can keep using the same\n  // bindings. Write host_shader_binding_count keys.\n  void WriteActiveTextureSRVKeys(\n      TextureSRVKey* keys,\n      const D3D12Shader::TextureBinding* host_shader_bindings,\n      size_t host_shader_binding_count) const;\n  void WriteActiveTextureBindfulSRV(\n      const D3D12Shader::TextureBinding& host_shader_binding,\n      D3D12_CPU_DESCRIPTOR_HANDLE handle);\n  uint32_t GetActiveTextureBindlessSRVIndex(\n      const D3D12Shader::TextureBinding& host_shader_binding);\n\n  SamplerParameters GetSamplerParameters(\n      const D3D12Shader::SamplerBinding& binding) const;\n  void WriteSampler(SamplerParameters parameters,\n                    D3D12_CPU_DESCRIPTOR_HANDLE handle) const;\n\n  // Returns whether the actual scale is not smaller than the requested one.\n  static bool ClampDrawResolutionScaleToMaxSupported(\n      uint32_t& scale_x, uint32_t& scale_y,\n      const ui::d3d12::D3D12Provider& provider);\n  // Ensures the tiles backing the range in the buffers are allocated.\n  bool EnsureScaledResolveMemoryCommitted(\n      uint32_t start_unscaled, uint32_t length_unscaled,\n      uint32_t length_scaled_alignment_log2 = 0) override;\n  // Makes the specified range of up to 1-2 GB currently accessible on the GPU.\n  // One draw call can access only at most one range - the same memory is\n  // accessible through different buffers based on the range needed, so aliasing\n  // barriers are required.\n  bool MakeScaledResolveRangeCurrent(uint32_t start_unscaled,\n                                     uint32_t length_unscaled,\n                                     uint32_t length_scaled_alignment_log2 = 0);\n  // Returns the GPU address of the range specified in the last successful\n  // MakeScaledResolveRangeCurrent call.\n  D3D12_GPU_VIRTUAL_ADDRESS GetCurrentScaledResolveRangeGPUAddress() const;\n  void TransitionCurrentScaledResolveRange(D3D12_RESOURCE_STATES new_state);\n  void MarkCurrentScaledResolveRangeUAVWritesCommitNeeded() {\n    assert_true(IsDrawResolutionScaled());\n    GetCurrentScaledResolveBuffer().SetUAVBarrierPending();\n  }\n\n  // Returns the ID3D12Resource of the front buffer texture (in\n  // NON_PIXEL_SHADER_RESOURCE state), or nullptr in case of failure, and writes\n  // the description of its SRV. May call LoadTextureData, so the same\n  // restrictions (such as about descriptor heap change possibility) apply.\n  ID3D12Resource* RequestSwapTexture(\n      D3D12_SHADER_RESOURCE_VIEW_DESC& srv_desc_out,\n      xenos::TextureFormat& format_out);\n\n protected:\n  bool IsSignedVersionSeparateForFormat(TextureKey key) const override;\n  bool IsScaledResolveSupportedForFormat(TextureKey key) const override;\n  uint32_t GetHostFormatSwizzle(TextureKey key) const override;\n\n  uint32_t GetMaxHostTextureWidthHeight(\n      xenos::DataDimension dimension) const override;\n  uint32_t GetMaxHostTextureDepthOrArraySize(\n      xenos::DataDimension dimension) const override;\n\n  std::unique_ptr<Texture> CreateTexture(TextureKey key) override;\n\n  // This binds pipelines, allocates descriptors, and copies!\n  bool LoadTextureDataFromResidentMemoryImpl(Texture& texture, bool load_base,\n                                             bool load_mips) override;\n\n  void UpdateTextureBindingsImpl(uint32_t fetch_constant_mask) override;\n\n private:\n  static constexpr uint32_t kLoadGuestXThreadsPerGroupLog2 = 2;\n  static constexpr uint32_t kLoadGuestYBlocksPerGroupLog2 = 5;\n\n  struct HostFormat {\n    // Format info for the regular case.\n    // DXGI format (typeless when different signedness or number representation\n    // is used) for the texture resource.\n    DXGI_FORMAT dxgi_format_resource;\n    // DXGI format for unsigned normalized or unsigned/signed float SRV.\n    DXGI_FORMAT dxgi_format_unsigned;\n    // The regular load shader, used when special load shaders (like\n    // signed-specific or decompressing) aren't needed.\n    LoadShaderIndex load_shader;\n    // DXGI format for signed normalized or unsigned/signed float SRV.\n    DXGI_FORMAT dxgi_format_signed;\n    // If the signed version needs a different bit representation on the host,\n    // this is the load shader for the signed version. Otherwise the regular\n    // load_shader will be used for the signed version, and a single copy will\n    // be created if both unsigned and signed are used.\n    LoadShaderIndex load_shader_signed;\n\n    // Do NOT add integer DXGI formats to this - they are not filterable, can\n    // only be read with Load, not Sample! If any game is seen using num_format\n    // 1 for fixed-point formats (for floating-point, it's normally set to 1\n    // though), add a constant buffer containing multipliers for the\n    // textures and multiplication to the tfetch implementation.\n\n    // Whether the DXGI format, if not uncompressing the texture, consists of\n    // blocks, thus copy regions must be aligned to block size (assuming it's\n    // the same as the guest block size).\n    bool is_block_compressed;\n    // Uncompression info for when the regular host format for this texture is\n    // block-compressed, but the size is not block-aligned, and thus such\n    // texture cannot be created in Direct3D on PC and needs decompression,\n    // however, such textures are common, for instance, in 4D5307E6. This only\n    // supports unsigned normalized formats - let's hope GPUSIGN_SIGNED was not\n    // used for DXN and DXT5A.\n    DXGI_FORMAT dxgi_format_uncompressed;\n    LoadShaderIndex load_shader_decompress;\n\n    // Mapping of Xenos swizzle components to DXGI format components.\n    uint32_t swizzle;\n  };\n\n  class D3D12Texture final : public Texture {\n   public:\n    union SRVDescriptorKey {\n      uint32_t key;\n      struct {\n        uint32_t is_signed : 1;\n        uint32_t host_swizzle : 12;\n      };\n\n      SRVDescriptorKey() : key(0) { static_assert_size(*this, sizeof(key)); }\n\n      struct Hasher {\n        size_t operator()(const SRVDescriptorKey& key) const {\n          return std::hash<decltype(key.key)>{}(key.key);\n        }\n      };\n      bool operator==(const SRVDescriptorKey& other_key) const {\n        return key == other_key.key;\n      }\n      bool operator!=(const SRVDescriptorKey& other_key) const {\n        return !(*this == other_key);\n      }\n    };\n\n    explicit D3D12Texture(D3D12TextureCache& texture_cache,\n                          const TextureKey& key, ID3D12Resource* resource,\n                          D3D12_RESOURCE_STATES resource_state);\n    ~D3D12Texture();\n\n    ID3D12Resource* resource() const { return resource_.Get(); }\n\n    D3D12_RESOURCE_STATES SetResourceState(D3D12_RESOURCE_STATES new_state) {\n      D3D12_RESOURCE_STATES old_state = resource_state_;\n      resource_state_ = new_state;\n      return old_state;\n    }\n\n    uint32_t GetSRVDescriptorIndex(SRVDescriptorKey descriptor_key) const {\n      auto it = srv_descriptors_.find(descriptor_key);\n      return it != srv_descriptors_.cend() ? it->second : UINT32_MAX;\n    }\n\n    void AddSRVDescriptorIndex(SRVDescriptorKey descriptor_key,\n                               uint32_t descriptor_index) {\n      srv_descriptors_.emplace(descriptor_key, descriptor_index);\n    }\n\n   private:\n    Microsoft::WRL::ComPtr<ID3D12Resource> resource_;\n    D3D12_RESOURCE_STATES resource_state_;\n\n    // For bindful - indices in the non-shader-visible descriptor cache for\n    // copying to the shader-visible heap (much faster than recreating, which,\n    // according to profiling, was often a bottleneck in many games).\n    // For bindless - indices in the global shader-visible descriptor heap.\n    std::unordered_map<SRVDescriptorKey, uint32_t, SRVDescriptorKey::Hasher>\n        srv_descriptors_;\n  };\n\n  static constexpr uint32_t kSRVDescriptorCachePageSize = 65536;\n\n  struct SRVDescriptorCachePage {\n   public:\n    explicit SRVDescriptorCachePage(ID3D12DescriptorHeap* heap)\n        : heap_(heap),\n          heap_start_(heap->GetCPUDescriptorHandleForHeapStart()) {}\n    SRVDescriptorCachePage(const SRVDescriptorCachePage& page) = delete;\n    SRVDescriptorCachePage& operator=(const SRVDescriptorCachePage& page) =\n        delete;\n    SRVDescriptorCachePage(SRVDescriptorCachePage&& page) {\n      std::swap(heap_, page.heap_);\n      std::swap(heap_start_, page.heap_start_);\n    }\n    SRVDescriptorCachePage& operator=(SRVDescriptorCachePage&& page) {\n      std::swap(heap_, page.heap_);\n      std::swap(heap_start_, page.heap_start_);\n      return *this;\n    }\n\n    ID3D12DescriptorHeap* heap() const { return heap_.Get(); }\n    D3D12_CPU_DESCRIPTOR_HANDLE heap_start() const { return heap_start_; }\n\n   private:\n    Microsoft::WRL::ComPtr<ID3D12DescriptorHeap> heap_;\n    D3D12_CPU_DESCRIPTOR_HANDLE heap_start_;\n  };\n\n  struct D3D12TextureBinding {\n    // Descriptor indices of texture and texture_signed of the respective\n    // TextureBinding returned from FindOrCreateTextureDescriptor.\n    uint32_t descriptor_index;\n    uint32_t descriptor_index_signed;\n\n    D3D12TextureBinding() { Reset(); }\n\n    void Reset() {\n      descriptor_index = UINT32_MAX;\n      descriptor_index_signed = UINT32_MAX;\n    }\n  };\n\n  class ScaledResolveVirtualBuffer {\n   public:\n    explicit ScaledResolveVirtualBuffer(ID3D12Resource* resource,\n                                        D3D12_RESOURCE_STATES resource_state)\n        : resource_(resource), resource_state_(resource_state) {}\n    ID3D12Resource* resource() const { return resource_.Get(); }\n    D3D12_RESOURCE_STATES SetResourceState(D3D12_RESOURCE_STATES new_state) {\n      D3D12_RESOURCE_STATES old_state = resource_state_;\n      if (old_state == D3D12_RESOURCE_STATE_UNORDERED_ACCESS) {\n        uav_barrier_pending_ = false;\n      }\n      resource_state_ = new_state;\n      return old_state;\n    }\n    // After writing through a UAV.\n    void SetUAVBarrierPending() {\n      if (resource_state_ == D3D12_RESOURCE_STATE_UNORDERED_ACCESS) {\n        uav_barrier_pending_ = true;\n      }\n    }\n    // After an aliasing barrier (which is even stronger than an UAV barrier).\n    void ClearUAVBarrierPending() { uav_barrier_pending_ = false; }\n\n   private:\n    Microsoft::WRL::ComPtr<ID3D12Resource> resource_;\n    D3D12_RESOURCE_STATES resource_state_;\n    bool uav_barrier_pending_ = false;\n  };\n\n  explicit D3D12TextureCache(const RegisterFile& register_file,\n                             D3D12SharedMemory& shared_memory,\n                             uint32_t draw_resolution_scale_x,\n                             uint32_t draw_resolution_scale_y,\n                             D3D12CommandProcessor& command_processor,\n                             bool bindless_resources_used);\n\n  bool Initialize();\n\n  // Whether decompression is needed on the host (Direct3D only allows creation\n  // of block-compressed textures with 4x4-aligned dimensions on PC).\n  bool IsDecompressionNeeded(xenos::TextureFormat format, uint32_t width,\n                             uint32_t height) const;\n  DXGI_FORMAT GetDXGIResourceFormat(xenos::TextureFormat format, uint32_t width,\n                                    uint32_t height) const {\n    const HostFormat& host_format = host_formats_[uint32_t(format)];\n    return IsDecompressionNeeded(format, width, height)\n               ? host_format.dxgi_format_uncompressed\n               : host_format.dxgi_format_resource;\n  }\n  DXGI_FORMAT GetDXGIResourceFormat(TextureKey key) const {\n    return GetDXGIResourceFormat(key.format, key.GetWidth(), key.GetHeight());\n  }\n  DXGI_FORMAT GetDXGIUnormFormat(xenos::TextureFormat format, uint32_t width,\n                                 uint32_t height) const {\n    const HostFormat& host_format = host_formats_[uint32_t(format)];\n    return IsDecompressionNeeded(format, width, height)\n               ? host_format.dxgi_format_uncompressed\n               : host_format.dxgi_format_unsigned;\n  }\n  DXGI_FORMAT GetDXGIUnormFormat(TextureKey key) const {\n    return GetDXGIUnormFormat(key.format, key.GetWidth(), key.GetHeight());\n  }\n\n  LoadShaderIndex GetLoadShaderIndex(TextureKey key) const;\n\n  static constexpr bool AreDimensionsCompatible(\n      xenos::FetchOpDimension binding_dimension,\n      xenos::DataDimension resource_dimension) {\n    switch (binding_dimension) {\n      case xenos::FetchOpDimension::k1D:\n      case xenos::FetchOpDimension::k2D:\n        return resource_dimension == xenos::DataDimension::k1D ||\n               resource_dimension == xenos::DataDimension::k2DOrStacked;\n      case xenos::FetchOpDimension::k3DOrStacked:\n        return resource_dimension == xenos::DataDimension::k3D;\n      case xenos::FetchOpDimension::kCube:\n        return resource_dimension == xenos::DataDimension::kCube;\n      default:\n        return false;\n    }\n  }\n\n  // Returns the index of an existing of a newly created non-shader-visible\n  // cached (for bindful) or a shader-visible global (for bindless) descriptor,\n  // or UINT32_MAX if failed to create.\n  uint32_t FindOrCreateTextureDescriptor(D3D12Texture& texture, bool is_signed,\n                                         uint32_t host_swizzle);\n  void ReleaseTextureDescriptor(uint32_t descriptor_index);\n  D3D12_CPU_DESCRIPTOR_HANDLE GetTextureDescriptorCPUHandle(\n      uint32_t descriptor_index) const;\n\n  size_t GetScaledResolveBufferCount() const {\n    assert_true(IsDrawResolutionScaled());\n    // Make sure any range up to 1 GB is accessible through 1 or 2 buffers.\n    // 2x2 scale buffers - just one 2 GB buffer for all 2 GB.\n    // 3x3 scale buffers - 4 buffers:\n    //  +0.0 +0.5 +1.0 +1.5 +2.0 +2.5 +3.0 +3.5 +4.0 +4.5\n    // |___________________|___________________|\n    //           |___________________|______________|\n    // Buffer N has an offset of N * 1 GB in the scaled resolve address space.\n    // The logic is:\n    // - 2 GB can be accessed through a [0 GB ... 2 GB) buffer - only need one.\n    // - 2.1 GB needs [0 GB ... 2 GB) and [1 GB ... 2.1 GB) - two buffers.\n    // - 3 GB needs [0 GB ... 2 GB) and [1 GB ... 3 GB) - two buffers.\n    // - 3.1 GB needs [0 GB ... 2 GB), [1 GB ... 3 GB) and [2 GB ... 3.1 GB) -\n    //   three buffers.\n    uint64_t address_space_size =\n        uint64_t(SharedMemory::kBufferSize) *\n        (draw_resolution_scale_x() * draw_resolution_scale_y());\n    return size_t((address_space_size - 1) >> 30);\n  }\n  // Returns indices of two scaled resolve virtual buffers that the location in\n  // memory may be accessible through. May be the same if it's a location near\n  // the beginning or the end of the address represented only by one buffer.\n  std::array<size_t, 2> GetPossibleScaledResolveBufferIndices(\n      uint64_t address_scaled) const {\n    assert_true(IsDrawResolutionScaled());\n    size_t address_gb = size_t(address_scaled >> 30);\n    size_t max_index = GetScaledResolveBufferCount() - 1;\n    // In different cases for 3x3:\n    //  +0.0 +0.5 +1.0 +1.5 +2.0 +2.5 +3.0 +3.5 +4.0 +4.5\n    // |12________2________|1_________2________|\n    //           |1_________2________|1_________12__|\n    return std::array<size_t, 2>{\n        std::min(address_gb, max_index),\n        std::min(std::max(address_gb, size_t(1)) - size_t(1), max_index)};\n  }\n  // The index is also the gigabyte offset of the buffer from the start of the\n  // scaled physical memory address space.\n  size_t GetCurrentScaledResolveBufferIndex() const {\n    return scaled_resolve_1gb_buffer_indices_\n        [scaled_resolve_current_range_start_scaled_ >> 30];\n  }\n  ScaledResolveVirtualBuffer& GetCurrentScaledResolveBuffer() {\n    ScaledResolveVirtualBuffer* scaled_resolve_buffer =\n        scaled_resolve_2gb_buffers_[GetCurrentScaledResolveBufferIndex()].get();\n    assert_not_null(scaled_resolve_buffer);\n    return *scaled_resolve_buffer;\n  }\n\n  xenos::ClampMode NormalizeClampMode(xenos::ClampMode clamp_mode) const;\n\n  static const HostFormat host_formats_[64];\n\n  D3D12CommandProcessor& command_processor_;\n  bool bindless_resources_used_;\n\n  Microsoft::WRL::ComPtr<ID3D12RootSignature> load_root_signature_;\n  std::array<Microsoft::WRL::ComPtr<ID3D12PipelineState>, kLoadShaderCount>\n      load_pipelines_;\n  // Load pipelines for resolution-scaled resolve targets.\n  std::array<Microsoft::WRL::ComPtr<ID3D12PipelineState>, kLoadShaderCount>\n      load_pipelines_scaled_;\n\n  std::vector<SRVDescriptorCachePage> srv_descriptor_cache_;\n  uint32_t srv_descriptor_cache_allocated_;\n  // Indices of cached descriptors used by deleted textures, for reuse.\n  std::vector<uint32_t> srv_descriptor_cache_free_;\n\n  enum class NullSRVDescriptorIndex {\n    k2DArray,\n    k3D,\n    kCube,\n\n    kCount,\n  };\n  // Contains null SRV descriptors of dimensions from NullSRVDescriptorIndex.\n  // For copying, not shader-visible.\n  Microsoft::WRL::ComPtr<ID3D12DescriptorHeap> null_srv_descriptor_heap_;\n  D3D12_CPU_DESCRIPTOR_HANDLE null_srv_descriptor_heap_start_;\n\n  std::array<D3D12TextureBinding, xenos::kTextureFetchConstantCount>\n      d3d12_texture_bindings_;\n\n  // Unsupported texture formats used during this frame (for research and\n  // testing).\n  enum : uint8_t {\n    kUnsupportedResourceBit = 1,\n    kUnsupportedUnormBit = kUnsupportedResourceBit << 1,\n    kUnsupportedSnormBit = kUnsupportedUnormBit << 1,\n  };\n  uint8_t unsupported_format_features_used_[64];\n\n  // The tiled buffer for resolved data with resolution scaling.\n  // Because on Direct3D 12 (at least on Windows 10 2004) typed SRV or UAV\n  // creation fails for offsets above 4 GB, a single tiled 4.5 GB buffer can't\n  // be used for 3x3 resolution scaling.\n  // Instead, \"sliding window\" buffers allowing to access a single range of up\n  // to 1 GB (or up to 2 GB, depending on the low bits) at any moment are used.\n  // Parts of 4.5 GB address space can be accessed through 2 GB buffers as:\n  //  +0.0 +0.5 +1.0 +1.5 +2.0 +2.5 +3.0 +3.5 +4.0 +4.5\n  // |___________________|___________________|      or\n  //           |___________________|______________|\n  // (2 GB is also the amount of scaled physical memory with 2x resolution\n  // scale, and older Intel GPUs, while support tiled resources, only support 31\n  // virtual address bits per resource).\n  // Index is first gigabyte. Only including buffers containing over 1 GB\n  // (because otherwise the data will be fully contained in another).\n  // Size is calculated the same as in GetScaledResolveBufferCount.\n  std::array<std::unique_ptr<ScaledResolveVirtualBuffer>,\n             (uint64_t(SharedMemory::kBufferSize) *\n                  (kMaxDrawResolutionScaleAlongAxis *\n                   kMaxDrawResolutionScaleAlongAxis) -\n              1) /\n                 (UINT32_C(1) << 30)>\n      scaled_resolve_2gb_buffers_;\n  // Not very big heaps (16 MB) because they are needed pretty sparsely. One\n  // 2x-scaled 1280x720x32bpp texture is slighly bigger than 14 MB.\n  static constexpr uint32_t kScaledResolveHeapSizeLog2 = 24;\n  static constexpr uint32_t kScaledResolveHeapSize =\n      uint32_t(1) << kScaledResolveHeapSizeLog2;\n  static_assert(\n      (kScaledResolveHeapSize % D3D12_TILED_RESOURCE_TILE_SIZE_IN_BYTES) == 0,\n      \"Scaled resolve heap size must be a multiple of Direct3D tile size\");\n  static_assert(\n      kScaledResolveHeapSizeLog2 <= SharedMemory::kBufferSizeLog2,\n      \"Scaled resolve heaps are assumed to be wholly mappable irrespective of \"\n      \"resolution scale, never truncated, for example, if the scaled resolve \"\n      \"address space is 4.5 GB, but the heap size is 1 GB\");\n  static_assert(\n      kScaledResolveHeapSizeLog2 <= 30,\n      \"Scaled resolve heaps are assumed to only be wholly mappable to up to \"\n      \"two 2 GB buffers\");\n  // Resident portions of the tiled buffer.\n  std::vector<Microsoft::WRL::ComPtr<ID3D12Heap>> scaled_resolve_heaps_;\n  // Number of currently resident portions of the tiled buffer, for profiling.\n  uint32_t scaled_resolve_heap_count_ = 0;\n  // Current scaled resolve state.\n  // For aliasing barrier placement, last owning buffer index for each of 1 GB.\n  size_t\n      scaled_resolve_1gb_buffer_indices_[(uint64_t(SharedMemory::kBufferSize) *\n                                              kMaxDrawResolutionScaleAlongAxis *\n                                              kMaxDrawResolutionScaleAlongAxis +\n                                          ((uint32_t(1) << 30) - 1)) >>\n                                         30];\n  // Range used in the last successful MakeScaledResolveRangeCurrent call.\n  uint64_t scaled_resolve_current_range_start_scaled_;\n  uint64_t scaled_resolve_current_range_length_scaled_;\n};\n\n}  // namespace d3d12\n}  // namespace gpu\n}  // namespace xe\n\n#endif  // XENIA_GPU_D3D12_D3D12_TEXTURE_CACHE_H_\n"
  },
  {
    "path": "src/xenia/gpu/d3d12/d3d12_trace_dump_main.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/console_app_main.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/gpu/d3d12/d3d12_command_processor.h\"\n#include \"xenia/gpu/d3d12/d3d12_graphics_system.h\"\n#include \"xenia/gpu/trace_dump.h\"\n#include \"xenia/ui/d3d12/d3d12_provider.h\"\n\nnamespace xe {\nnamespace gpu {\nnamespace d3d12 {\n\nusing namespace xe::gpu::xenos;\n\nclass D3D12TraceDump : public TraceDump {\n public:\n  std::unique_ptr<gpu::GraphicsSystem> CreateGraphicsSystem() override {\n    return std::unique_ptr<gpu::GraphicsSystem>(new D3D12GraphicsSystem());\n  }\n\n  void BeginHostCapture() override {\n    auto provider = static_cast<const ui::d3d12::D3D12Provider*>(\n        graphics_system_->provider());\n    IDXGraphicsAnalysis* graphics_analysis = provider->GetGraphicsAnalysis();\n    if (graphics_analysis) {\n      graphics_analysis->BeginCapture();\n    }\n  }\n\n  void EndHostCapture() override {\n    auto provider = static_cast<const ui::d3d12::D3D12Provider*>(\n        graphics_system_->provider());\n    IDXGraphicsAnalysis* graphics_analysis = provider->GetGraphicsAnalysis();\n    if (graphics_analysis) {\n      graphics_analysis->EndCapture();\n    }\n  }\n};\n\nint trace_dump_main(const std::vector<std::string>& args) {\n  D3D12TraceDump trace_dump;\n  return trace_dump.Main(args);\n}\n\n}  // namespace d3d12\n}  // namespace gpu\n}  // namespace xe\n\nXE_DEFINE_CONSOLE_APP(\"xenia-gpu-d3d12-trace-dump\",\n                      xe::gpu::d3d12::trace_dump_main, \"some.trace\",\n                      \"target_trace_file\");\n"
  },
  {
    "path": "src/xenia/gpu/d3d12/d3d12_trace_viewer_main.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include <memory>\n#include <string>\n\n#include \"xenia/base/logging.h\"\n#include \"xenia/gpu/d3d12/d3d12_command_processor.h\"\n#include \"xenia/gpu/d3d12/d3d12_graphics_system.h\"\n#include \"xenia/gpu/trace_viewer.h\"\n\nnamespace xe {\nnamespace gpu {\nnamespace d3d12 {\n\nclass D3D12TraceViewer final : public TraceViewer {\n public:\n  static std::unique_ptr<WindowedApp> Create(\n      xe::ui::WindowedAppContext& app_context) {\n    return std::unique_ptr<WindowedApp>(new D3D12TraceViewer(app_context));\n  }\n\n  std::unique_ptr<gpu::GraphicsSystem> CreateGraphicsSystem() override {\n    return std::unique_ptr<gpu::GraphicsSystem>(new D3D12GraphicsSystem());\n  }\n\n  uintptr_t GetColorRenderTarget(\n      uint32_t pitch, xenos::MsaaSamples samples, uint32_t base,\n      xenos::ColorRenderTargetFormat format) override {\n    // TODO(Triang3l): EDRAM viewer.\n    return 0;\n  }\n\n  uintptr_t GetDepthRenderTarget(\n      uint32_t pitch, xenos::MsaaSamples samples, uint32_t base,\n      xenos::DepthRenderTargetFormat format) override {\n    // TODO(Triang3l): EDRAM viewer.\n    return 0;\n  }\n\n  uintptr_t GetTextureEntry(const TextureInfo& texture_info,\n                            const SamplerInfo& sampler_info) override {\n    // TODO(Triang3l): Textures, but from a fetch constant rather than\n    // TextureInfo/SamplerInfo which are going away.\n    return 0;\n  }\n\n private:\n  explicit D3D12TraceViewer(xe::ui::WindowedAppContext& app_context)\n      : TraceViewer(app_context, \"xenia-gpu-d3d12-trace-viewer\") {}\n};\n\n}  // namespace d3d12\n}  // namespace gpu\n}  // namespace xe\n\nXE_DEFINE_WINDOWED_APP(xenia_gpu_d3d12_trace_viewer,\n                       xe::gpu::d3d12::D3D12TraceViewer::Create);\n"
  },
  {
    "path": "src/xenia/gpu/d3d12/deferred_command_list.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2019 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/d3d12/deferred_command_list.h\"\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/profiling.h\"\n#include \"xenia/gpu/d3d12/d3d12_command_processor.h\"\n#include \"xenia/gpu/gpu_flags.h\"\n\nnamespace xe {\nnamespace gpu {\nnamespace d3d12 {\n\nDeferredCommandList::DeferredCommandList(\n    const D3D12CommandProcessor& command_processor, size_t initial_size)\n    : command_processor_(command_processor) {\n  command_stream_.reserve(initial_size / sizeof(uintmax_t));\n}\n\nvoid DeferredCommandList::Reset() { command_stream_.clear(); }\n\nvoid DeferredCommandList::Execute(ID3D12GraphicsCommandList* command_list,\n                                  ID3D12GraphicsCommandList1* command_list_1) {\n#if XE_GPU_FINE_GRAINED_DRAW_SCOPES\n  SCOPE_profile_cpu_f(\"gpu\");\n#endif  // XE_GPU_FINE_GRAINED_DRAW_SCOPES\n  const uintmax_t* stream = command_stream_.data();\n  size_t stream_remaining = command_stream_.size();\n  ID3D12PipelineState* current_pipeline_state = nullptr;\n  while (stream_remaining != 0) {\n    const CommandHeader& header =\n        *reinterpret_cast<const CommandHeader*>(stream);\n    stream += kCommandHeaderSizeElements;\n    stream_remaining -= kCommandHeaderSizeElements;\n    switch (header.command) {\n      case Command::kD3DClearDepthStencilView: {\n        auto& args =\n            *reinterpret_cast<const ClearDepthStencilViewHeader*>(stream);\n        command_list->ClearDepthStencilView(\n            args.depth_stencil_view, args.clear_flags, args.depth, args.stencil,\n            args.num_rects,\n            args.num_rects ? reinterpret_cast<const D3D12_RECT*>(&args + 1)\n                           : nullptr);\n      } break;\n      case Command::kD3DClearRenderTargetView: {\n        auto& args =\n            *reinterpret_cast<const ClearRenderTargetViewHeader*>(stream);\n        command_list->ClearRenderTargetView(\n            args.render_target_view, args.color_rgba, args.num_rects,\n            args.num_rects ? reinterpret_cast<const D3D12_RECT*>(&args + 1)\n                           : nullptr);\n      } break;\n      case Command::kD3DClearUnorderedAccessViewUint: {\n        auto& args =\n            *reinterpret_cast<const ClearUnorderedAccessViewHeader*>(stream);\n        command_list->ClearUnorderedAccessViewUint(\n            args.view_gpu_handle_in_current_heap, args.view_cpu_handle,\n            args.resource, args.values_uint, args.num_rects,\n            args.num_rects ? reinterpret_cast<const D3D12_RECT*>(&args + 1)\n                           : nullptr);\n      } break;\n      case Command::kD3DCopyBufferRegion: {\n        auto& args =\n            *reinterpret_cast<const D3DCopyBufferRegionArguments*>(stream);\n        command_list->CopyBufferRegion(args.dst_buffer, args.dst_offset,\n                                       args.src_buffer, args.src_offset,\n                                       args.num_bytes);\n      } break;\n      case Command::kD3DCopyResource: {\n        auto& args = *reinterpret_cast<const D3DCopyResourceArguments*>(stream);\n        command_list->CopyResource(args.dst_resource, args.src_resource);\n      } break;\n      case Command::kCopyTexture: {\n        auto& args = *reinterpret_cast<const CopyTextureArguments*>(stream);\n        command_list->CopyTextureRegion(&args.dst, 0, 0, 0, &args.src, nullptr);\n      } break;\n      case Command::kD3DCopyTextureRegion: {\n        auto& args =\n            *reinterpret_cast<const D3DCopyTextureRegionArguments*>(stream);\n        command_list->CopyTextureRegion(\n            &args.dst, args.dst_x, args.dst_y, args.dst_z, &args.src,\n            args.has_src_box ? &args.src_box : nullptr);\n      } break;\n      case Command::kD3DDispatch: {\n        if (current_pipeline_state != nullptr) {\n          auto& args = *reinterpret_cast<const D3DDispatchArguments*>(stream);\n          command_list->Dispatch(args.thread_group_count_x,\n                                 args.thread_group_count_y,\n                                 args.thread_group_count_z);\n        }\n      } break;\n      case Command::kD3DDrawIndexedInstanced: {\n        if (current_pipeline_state != nullptr) {\n          auto& args =\n              *reinterpret_cast<const D3DDrawIndexedInstancedArguments*>(\n                  stream);\n          command_list->DrawIndexedInstanced(\n              args.index_count_per_instance, args.instance_count,\n              args.start_index_location, args.base_vertex_location,\n              args.start_instance_location);\n        }\n      } break;\n      case Command::kD3DDrawInstanced: {\n        if (current_pipeline_state != nullptr) {\n          auto& args =\n              *reinterpret_cast<const D3DDrawInstancedArguments*>(stream);\n          command_list->DrawInstanced(\n              args.vertex_count_per_instance, args.instance_count,\n              args.start_vertex_location, args.start_instance_location);\n        }\n      } break;\n      case Command::kD3DIASetIndexBuffer: {\n        auto view = reinterpret_cast<const D3D12_INDEX_BUFFER_VIEW*>(stream);\n        command_list->IASetIndexBuffer(\n            view->Format != DXGI_FORMAT_UNKNOWN ? view : nullptr);\n      } break;\n      case Command::kD3DIASetPrimitiveTopology: {\n        command_list->IASetPrimitiveTopology(\n            *reinterpret_cast<const D3D12_PRIMITIVE_TOPOLOGY*>(stream));\n      } break;\n      case Command::kD3DIASetVertexBuffers: {\n        static_assert(alignof(D3D12_VERTEX_BUFFER_VIEW) <= alignof(uintmax_t));\n        auto& args =\n            *reinterpret_cast<const D3DIASetVertexBuffersHeader*>(stream);\n        command_list->IASetVertexBuffers(\n            args.start_slot, args.num_views,\n            reinterpret_cast<const D3D12_VERTEX_BUFFER_VIEW*>(\n                reinterpret_cast<const uint8_t*>(stream) +\n                xe::align(sizeof(D3DIASetVertexBuffersHeader),\n                          alignof(D3D12_VERTEX_BUFFER_VIEW))));\n      } break;\n      case Command::kD3DOMSetBlendFactor: {\n        command_list->OMSetBlendFactor(reinterpret_cast<const FLOAT*>(stream));\n      } break;\n      case Command::kD3DOMSetRenderTargets: {\n        auto& args =\n            *reinterpret_cast<const D3DOMSetRenderTargetsArguments*>(stream);\n        command_list->OMSetRenderTargets(\n            args.num_render_target_descriptors, args.render_target_descriptors,\n            args.rts_single_handle_to_descriptor_range ? TRUE : FALSE,\n            args.depth_stencil ? &args.depth_stencil_descriptor : nullptr);\n      } break;\n      case Command::kD3DOMSetStencilRef: {\n        command_list->OMSetStencilRef(*reinterpret_cast<const UINT*>(stream));\n      } break;\n      case Command::kD3DResourceBarrier: {\n        static_assert(alignof(D3D12_RESOURCE_BARRIER) <= alignof(uintmax_t));\n        command_list->ResourceBarrier(\n            *reinterpret_cast<const UINT*>(stream),\n            reinterpret_cast<const D3D12_RESOURCE_BARRIER*>(\n                reinterpret_cast<const uint8_t*>(stream) +\n                xe::align(sizeof(UINT), alignof(D3D12_RESOURCE_BARRIER))));\n      } break;\n      case Command::kRSSetScissorRect: {\n        command_list->RSSetScissorRects(\n            1, reinterpret_cast<const D3D12_RECT*>(stream));\n      } break;\n      case Command::kRSSetViewport: {\n        command_list->RSSetViewports(\n            1, reinterpret_cast<const D3D12_VIEWPORT*>(stream));\n      } break;\n      case Command::kD3DSetComputeRoot32BitConstants: {\n        auto args =\n            reinterpret_cast<const SetRoot32BitConstantsHeader*>(stream);\n        command_list->SetComputeRoot32BitConstants(\n            args->root_parameter_index, args->num_32bit_values_to_set, args + 1,\n            args->dest_offset_in_32bit_values);\n      } break;\n      case Command::kD3DSetGraphicsRoot32BitConstants: {\n        auto args =\n            reinterpret_cast<const SetRoot32BitConstantsHeader*>(stream);\n        command_list->SetGraphicsRoot32BitConstants(\n            args->root_parameter_index, args->num_32bit_values_to_set, args + 1,\n            args->dest_offset_in_32bit_values);\n      } break;\n      case Command::kD3DSetComputeRootConstantBufferView: {\n        auto& args =\n            *reinterpret_cast<const SetRootDescriptorArguments*>(stream);\n        command_list->SetComputeRootConstantBufferView(\n            args.root_parameter_index, args.buffer_location);\n      } break;\n      case Command::kD3DSetGraphicsRootConstantBufferView: {\n        auto& args =\n            *reinterpret_cast<const SetRootDescriptorArguments*>(stream);\n        command_list->SetGraphicsRootConstantBufferView(\n            args.root_parameter_index, args.buffer_location);\n      } break;\n      case Command::kD3DSetComputeRootDescriptorTable: {\n        auto& args =\n            *reinterpret_cast<const SetRootDescriptorTableArguments*>(stream);\n        command_list->SetComputeRootDescriptorTable(args.root_parameter_index,\n                                                    args.base_descriptor);\n      } break;\n      case Command::kD3DSetGraphicsRootDescriptorTable: {\n        auto& args =\n            *reinterpret_cast<const SetRootDescriptorTableArguments*>(stream);\n        command_list->SetGraphicsRootDescriptorTable(args.root_parameter_index,\n                                                     args.base_descriptor);\n      } break;\n      case Command::kD3DSetComputeRootShaderResourceView: {\n        auto& args =\n            *reinterpret_cast<const SetRootDescriptorArguments*>(stream);\n        command_list->SetComputeRootShaderResourceView(\n            args.root_parameter_index, args.buffer_location);\n      } break;\n      case Command::kD3DSetGraphicsRootShaderResourceView: {\n        auto& args =\n            *reinterpret_cast<const SetRootDescriptorArguments*>(stream);\n        command_list->SetGraphicsRootShaderResourceView(\n            args.root_parameter_index, args.buffer_location);\n      } break;\n      case Command::kD3DSetComputeRootSignature: {\n        command_list->SetComputeRootSignature(\n            *reinterpret_cast<ID3D12RootSignature* const*>(stream));\n      } break;\n      case Command::kD3DSetGraphicsRootSignature: {\n        command_list->SetGraphicsRootSignature(\n            *reinterpret_cast<ID3D12RootSignature* const*>(stream));\n      } break;\n      case Command::kD3DSetComputeRootUnorderedAccessView: {\n        auto& args =\n            *reinterpret_cast<const SetRootDescriptorArguments*>(stream);\n        command_list->SetComputeRootUnorderedAccessView(\n            args.root_parameter_index, args.buffer_location);\n      } break;\n      case Command::kD3DSetGraphicsRootUnorderedAccessView: {\n        auto& args =\n            *reinterpret_cast<const SetRootDescriptorArguments*>(stream);\n        command_list->SetGraphicsRootUnorderedAccessView(\n            args.root_parameter_index, args.buffer_location);\n      } break;\n      case Command::kSetDescriptorHeaps: {\n        auto& args =\n            *reinterpret_cast<const SetDescriptorHeapsArguments*>(stream);\n        UINT num_descriptor_heaps = 0;\n        ID3D12DescriptorHeap* descriptor_heaps[2];\n        if (args.cbv_srv_uav_descriptor_heap != nullptr) {\n          descriptor_heaps[num_descriptor_heaps++] =\n              args.cbv_srv_uav_descriptor_heap;\n        }\n        if (args.sampler_descriptor_heap != nullptr) {\n          descriptor_heaps[num_descriptor_heaps++] =\n              args.sampler_descriptor_heap;\n        }\n        command_list->SetDescriptorHeaps(num_descriptor_heaps,\n                                         descriptor_heaps);\n      } break;\n      case Command::kD3DSetPipelineState: {\n        current_pipeline_state =\n            *reinterpret_cast<ID3D12PipelineState* const*>(stream);\n        if (current_pipeline_state) {\n          command_list->SetPipelineState(current_pipeline_state);\n        }\n      } break;\n      case Command::kSetPipelineStateHandle: {\n        current_pipeline_state = command_processor_.GetD3D12PipelineByHandle(\n            *reinterpret_cast<void* const*>(stream));\n        if (current_pipeline_state) {\n          command_list->SetPipelineState(current_pipeline_state);\n        }\n      } break;\n      case Command::kD3DSetSamplePositions: {\n        if (command_list_1 != nullptr) {\n          auto& args =\n              *reinterpret_cast<const D3DSetSamplePositionsArguments*>(stream);\n          command_list_1->SetSamplePositions(\n              args.num_samples_per_pixel, args.num_pixels,\n              (args.num_samples_per_pixel && args.num_pixels)\n                  ? const_cast<D3D12_SAMPLE_POSITION*>(args.sample_positions)\n                  : nullptr);\n        }\n      } break;\n      default:\n        assert_unhandled_case(header.command);\n        break;\n    }\n    stream += header.arguments_size_elements;\n    stream_remaining -= header.arguments_size_elements;\n  }\n}\n\nvoid* DeferredCommandList::WriteCommand(Command command,\n                                        size_t arguments_size_bytes) {\n  size_t arguments_size_elements =\n      (arguments_size_bytes + sizeof(uintmax_t) - 1) / sizeof(uintmax_t);\n  size_t offset = command_stream_.size();\n  command_stream_.resize(offset + kCommandHeaderSizeElements +\n                         arguments_size_elements);\n  CommandHeader& header =\n      *reinterpret_cast<CommandHeader*>(command_stream_.data() + offset);\n  header.command = command;\n  header.arguments_size_elements = uint32_t(arguments_size_elements);\n  return command_stream_.data() + (offset + kCommandHeaderSizeElements);\n}\n\n}  // namespace d3d12\n}  // namespace gpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/d3d12/deferred_command_list.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2019 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_D3D12_DEFERRED_COMMAND_LIST_H_\n#define XENIA_GPU_D3D12_DEFERRED_COMMAND_LIST_H_\n\n#include <algorithm>\n#include <cstdint>\n#include <cstring>\n#include <vector>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/literals.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/ui/d3d12/d3d12_api.h\"\n\nnamespace xe {\nnamespace gpu {\nnamespace d3d12 {\n\nusing namespace xe::literals;\n\nclass D3D12CommandProcessor;\n\nclass DeferredCommandList {\n public:\n  DeferredCommandList(const D3D12CommandProcessor& command_processor,\n                      size_t initial_size_bytes = 1_MiB);\n\n  void Reset();\n  void Execute(ID3D12GraphicsCommandList* command_list,\n               ID3D12GraphicsCommandList1* command_list_1);\n\n  D3D12_RECT* ClearDepthStencilViewAllocatedRects(\n      D3D12_CPU_DESCRIPTOR_HANDLE depth_stencil_view,\n      D3D12_CLEAR_FLAGS clear_flags, FLOAT depth, UINT8 stencil,\n      UINT num_rects) {\n    auto args = reinterpret_cast<ClearDepthStencilViewHeader*>(WriteCommand(\n        Command::kD3DClearDepthStencilView,\n        sizeof(ClearDepthStencilViewHeader) + num_rects * sizeof(D3D12_RECT)));\n    args->depth_stencil_view = depth_stencil_view;\n    args->clear_flags = clear_flags;\n    args->depth = depth;\n    args->stencil = stencil;\n    args->num_rects = num_rects;\n    return num_rects ? reinterpret_cast<D3D12_RECT*>(args + 1) : nullptr;\n  }\n\n  void D3DClearDepthStencilView(D3D12_CPU_DESCRIPTOR_HANDLE depth_stencil_view,\n                                D3D12_CLEAR_FLAGS clear_flags, FLOAT depth,\n                                UINT8 stencil, UINT num_rects,\n                                const D3D12_RECT* rects) {\n    D3D12_RECT* allocated_rects = ClearDepthStencilViewAllocatedRects(\n        depth_stencil_view, clear_flags, depth, stencil, num_rects);\n    if (num_rects) {\n      assert_not_null(allocated_rects);\n      std::memcpy(allocated_rects, rects, num_rects * sizeof(D3D12_RECT));\n    }\n  }\n\n  void D3DClearRenderTargetView(D3D12_CPU_DESCRIPTOR_HANDLE render_target_view,\n                                const FLOAT color_rgba[4], UINT num_rects,\n                                const D3D12_RECT* rects) {\n    auto args = reinterpret_cast<ClearRenderTargetViewHeader*>(WriteCommand(\n        Command::kD3DClearRenderTargetView,\n        sizeof(ClearRenderTargetViewHeader) + num_rects * sizeof(D3D12_RECT)));\n    args->render_target_view = render_target_view;\n    std::memcpy(args->color_rgba, color_rgba, 4 * sizeof(FLOAT));\n    args->num_rects = num_rects;\n    if (num_rects != 0) {\n      std::memcpy(args + 1, rects, num_rects * sizeof(D3D12_RECT));\n    }\n  }\n\n  void D3DClearUnorderedAccessViewUint(\n      D3D12_GPU_DESCRIPTOR_HANDLE view_gpu_handle_in_current_heap,\n      D3D12_CPU_DESCRIPTOR_HANDLE view_cpu_handle, ID3D12Resource* resource,\n      const UINT values[4], UINT num_rects, const D3D12_RECT* rects) {\n    auto args = reinterpret_cast<ClearUnorderedAccessViewHeader*>(\n        WriteCommand(Command::kD3DClearUnorderedAccessViewUint,\n                     sizeof(ClearUnorderedAccessViewHeader) +\n                         num_rects * sizeof(D3D12_RECT)));\n    args->view_gpu_handle_in_current_heap = view_gpu_handle_in_current_heap;\n    args->view_cpu_handle = view_cpu_handle;\n    args->resource = resource;\n    std::memcpy(args->values_uint, values, 4 * sizeof(UINT));\n    args->num_rects = num_rects;\n    if (num_rects != 0) {\n      std::memcpy(args + 1, rects, num_rects * sizeof(D3D12_RECT));\n    }\n  }\n\n  void D3DCopyBufferRegion(ID3D12Resource* dst_buffer, UINT64 dst_offset,\n                           ID3D12Resource* src_buffer, UINT64 src_offset,\n                           UINT64 num_bytes) {\n    auto& args = *reinterpret_cast<D3DCopyBufferRegionArguments*>(WriteCommand(\n        Command::kD3DCopyBufferRegion, sizeof(D3DCopyBufferRegionArguments)));\n    args.dst_buffer = dst_buffer;\n    args.dst_offset = dst_offset;\n    args.src_buffer = src_buffer;\n    args.src_offset = src_offset;\n    args.num_bytes = num_bytes;\n  }\n\n  void D3DCopyResource(ID3D12Resource* dst_resource,\n                       ID3D12Resource* src_resource) {\n    auto& args = *reinterpret_cast<D3DCopyResourceArguments*>(WriteCommand(\n        Command::kD3DCopyResource, sizeof(D3DCopyResourceArguments)));\n    args.dst_resource = dst_resource;\n    args.src_resource = src_resource;\n  }\n\n  void CopyTexture(const D3D12_TEXTURE_COPY_LOCATION& dst,\n                   const D3D12_TEXTURE_COPY_LOCATION& src) {\n    auto& args = *reinterpret_cast<CopyTextureArguments*>(\n        WriteCommand(Command::kCopyTexture, sizeof(CopyTextureArguments)));\n    std::memcpy(&args.dst, &dst, sizeof(D3D12_TEXTURE_COPY_LOCATION));\n    std::memcpy(&args.src, &src, sizeof(D3D12_TEXTURE_COPY_LOCATION));\n  }\n\n  void D3DCopyTextureRegion(const D3D12_TEXTURE_COPY_LOCATION* dst, UINT dst_x,\n                            UINT dst_y, UINT dst_z,\n                            const D3D12_TEXTURE_COPY_LOCATION* src,\n                            const D3D12_BOX* src_box) {\n    assert_not_null(dst);\n    assert_not_null(src);\n    auto& args = *reinterpret_cast<D3DCopyTextureRegionArguments*>(WriteCommand(\n        Command::kD3DCopyTextureRegion, sizeof(D3DCopyTextureRegionArguments)));\n    std::memcpy(&args.dst, dst, sizeof(D3D12_TEXTURE_COPY_LOCATION));\n    args.dst_x = dst_x;\n    args.dst_y = dst_y;\n    args.dst_z = dst_z;\n    std::memcpy(&args.src, src, sizeof(D3D12_TEXTURE_COPY_LOCATION));\n    if (src_box) {\n      args.has_src_box = true;\n      args.src_box = *src_box;\n    } else {\n      args.has_src_box = false;\n    }\n  }\n\n  void D3DDispatch(UINT thread_group_count_x, UINT thread_group_count_y,\n                   UINT thread_group_count_z) {\n    auto& args = *reinterpret_cast<D3DDispatchArguments*>(\n        WriteCommand(Command::kD3DDispatch, sizeof(D3DDispatchArguments)));\n    args.thread_group_count_x = thread_group_count_x;\n    args.thread_group_count_y = thread_group_count_y;\n    args.thread_group_count_z = thread_group_count_z;\n  }\n\n  void D3DDrawIndexedInstanced(UINT index_count_per_instance,\n                               UINT instance_count, UINT start_index_location,\n                               INT base_vertex_location,\n                               UINT start_instance_location) {\n    auto& args = *reinterpret_cast<D3DDrawIndexedInstancedArguments*>(\n        WriteCommand(Command::kD3DDrawIndexedInstanced,\n                     sizeof(D3DDrawIndexedInstancedArguments)));\n    args.index_count_per_instance = index_count_per_instance;\n    args.instance_count = instance_count;\n    args.start_index_location = start_index_location;\n    args.base_vertex_location = base_vertex_location;\n    args.start_instance_location = start_instance_location;\n  }\n\n  void D3DDrawInstanced(UINT vertex_count_per_instance, UINT instance_count,\n                        UINT start_vertex_location,\n                        UINT start_instance_location) {\n    auto& args = *reinterpret_cast<D3DDrawInstancedArguments*>(WriteCommand(\n        Command::kD3DDrawInstanced, sizeof(D3DDrawInstancedArguments)));\n    args.vertex_count_per_instance = vertex_count_per_instance;\n    args.instance_count = instance_count;\n    args.start_vertex_location = start_vertex_location;\n    args.start_instance_location = start_instance_location;\n  }\n\n  void D3DIASetIndexBuffer(const D3D12_INDEX_BUFFER_VIEW* view) {\n    auto& args = *reinterpret_cast<D3D12_INDEX_BUFFER_VIEW*>(WriteCommand(\n        Command::kD3DIASetIndexBuffer, sizeof(D3D12_INDEX_BUFFER_VIEW)));\n    if (view != nullptr) {\n      args.BufferLocation = view->BufferLocation;\n      args.SizeInBytes = view->SizeInBytes;\n      args.Format = view->Format;\n    } else {\n      args.BufferLocation = D3D12_GPU_VIRTUAL_ADDRESS(0);\n      args.SizeInBytes = 0;\n      args.Format = DXGI_FORMAT_UNKNOWN;\n    }\n  }\n\n  void D3DIASetPrimitiveTopology(D3D12_PRIMITIVE_TOPOLOGY primitive_topology) {\n    auto& arg = *reinterpret_cast<D3D12_PRIMITIVE_TOPOLOGY*>(WriteCommand(\n        Command::kD3DIASetPrimitiveTopology, sizeof(D3D12_PRIMITIVE_TOPOLOGY)));\n    arg = primitive_topology;\n  }\n\n  void D3DIASetVertexBuffers(UINT start_slot, UINT num_views,\n                             const D3D12_VERTEX_BUFFER_VIEW* views) {\n    if (num_views == 0) {\n      return;\n    }\n    static_assert(alignof(D3D12_VERTEX_BUFFER_VIEW) <= alignof(uintmax_t));\n    const size_t header_size = xe::align(sizeof(D3DIASetVertexBuffersHeader),\n                                         alignof(D3D12_VERTEX_BUFFER_VIEW));\n    auto args = reinterpret_cast<D3DIASetVertexBuffersHeader*>(WriteCommand(\n        Command::kD3DIASetVertexBuffers,\n        header_size + num_views * sizeof(D3D12_VERTEX_BUFFER_VIEW)));\n    args->start_slot = start_slot;\n    args->num_views = num_views;\n    std::memcpy(reinterpret_cast<uint8_t*>(args) + header_size, views,\n                sizeof(D3D12_VERTEX_BUFFER_VIEW) * num_views);\n  }\n\n  void D3DOMSetBlendFactor(const FLOAT blend_factor[4]) {\n    auto args = reinterpret_cast<FLOAT*>(\n        WriteCommand(Command::kD3DOMSetBlendFactor, 4 * sizeof(FLOAT)));\n    args[0] = blend_factor[0];\n    args[1] = blend_factor[1];\n    args[2] = blend_factor[2];\n    args[3] = blend_factor[3];\n  }\n\n  void D3DOMSetRenderTargets(\n      UINT num_render_target_descriptors,\n      const D3D12_CPU_DESCRIPTOR_HANDLE* render_target_descriptors,\n      BOOL rts_single_handle_to_descriptor_range,\n      const D3D12_CPU_DESCRIPTOR_HANDLE* depth_stencil_descriptor) {\n    auto& args = *reinterpret_cast<D3DOMSetRenderTargetsArguments*>(\n        WriteCommand(Command::kD3DOMSetRenderTargets,\n                     sizeof(D3DOMSetRenderTargetsArguments)));\n    num_render_target_descriptors =\n        std::min(num_render_target_descriptors,\n                 UINT(D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT));\n    args.num_render_target_descriptors = num_render_target_descriptors;\n    args.rts_single_handle_to_descriptor_range =\n        rts_single_handle_to_descriptor_range ? 1 : 0;\n    if (num_render_target_descriptors != 0) {\n      std::memcpy(args.render_target_descriptors, render_target_descriptors,\n                  (rts_single_handle_to_descriptor_range\n                       ? 1\n                       : num_render_target_descriptors) *\n                      sizeof(D3D12_CPU_DESCRIPTOR_HANDLE));\n    }\n    args.depth_stencil = (depth_stencil_descriptor != nullptr) ? 1 : 0;\n    if (depth_stencil_descriptor != nullptr) {\n      args.depth_stencil_descriptor.ptr = depth_stencil_descriptor->ptr;\n    }\n  }\n\n  void D3DOMSetStencilRef(UINT stencil_ref) {\n    auto& arg = *reinterpret_cast<UINT*>(\n        WriteCommand(Command::kD3DOMSetStencilRef, sizeof(UINT)));\n    arg = stencil_ref;\n  }\n\n  void D3DResourceBarrier(UINT num_barriers,\n                          const D3D12_RESOURCE_BARRIER* barriers) {\n    if (num_barriers == 0) {\n      return;\n    }\n    static_assert(alignof(D3D12_RESOURCE_BARRIER) <= alignof(uintmax_t));\n    const size_t header_size =\n        xe::align(sizeof(UINT), alignof(D3D12_RESOURCE_BARRIER));\n    uint8_t* args = reinterpret_cast<uint8_t*>(WriteCommand(\n        Command::kD3DResourceBarrier,\n        header_size + num_barriers * sizeof(D3D12_RESOURCE_BARRIER)));\n    *reinterpret_cast<UINT*>(args) = num_barriers;\n    std::memcpy(args + header_size, barriers,\n                num_barriers * sizeof(D3D12_RESOURCE_BARRIER));\n  }\n\n  void RSSetScissorRect(const D3D12_RECT& rect) {\n    auto& arg = *reinterpret_cast<D3D12_RECT*>(\n        WriteCommand(Command::kRSSetScissorRect, sizeof(D3D12_RECT)));\n    arg = rect;\n  }\n\n  void RSSetViewport(const D3D12_VIEWPORT& viewport) {\n    auto& arg = *reinterpret_cast<D3D12_VIEWPORT*>(\n        WriteCommand(Command::kRSSetViewport, sizeof(D3D12_VIEWPORT)));\n    arg = viewport;\n  }\n\n  void D3DSetComputeRoot32BitConstants(UINT root_parameter_index,\n                                       UINT num_32bit_values_to_set,\n                                       const void* src_data,\n                                       UINT dest_offset_in_32bit_values) {\n    if (num_32bit_values_to_set == 0) {\n      return;\n    }\n    auto args = reinterpret_cast<SetRoot32BitConstantsHeader*>(\n        WriteCommand(Command::kD3DSetComputeRoot32BitConstants,\n                     sizeof(SetRoot32BitConstantsHeader) +\n                         num_32bit_values_to_set * sizeof(uint32_t)));\n    args->root_parameter_index = root_parameter_index;\n    args->num_32bit_values_to_set = num_32bit_values_to_set;\n    args->dest_offset_in_32bit_values = dest_offset_in_32bit_values;\n    std::memcpy(args + 1, src_data, num_32bit_values_to_set * sizeof(uint32_t));\n  }\n\n  void D3DSetGraphicsRoot32BitConstants(UINT root_parameter_index,\n                                        UINT num_32bit_values_to_set,\n                                        const void* src_data,\n                                        UINT dest_offset_in_32bit_values) {\n    if (num_32bit_values_to_set == 0) {\n      return;\n    }\n    auto args = reinterpret_cast<SetRoot32BitConstantsHeader*>(\n        WriteCommand(Command::kD3DSetGraphicsRoot32BitConstants,\n                     sizeof(SetRoot32BitConstantsHeader) +\n                         num_32bit_values_to_set * sizeof(uint32_t)));\n    args->root_parameter_index = root_parameter_index;\n    args->num_32bit_values_to_set = num_32bit_values_to_set;\n    args->dest_offset_in_32bit_values = dest_offset_in_32bit_values;\n    std::memcpy(args + 1, src_data, num_32bit_values_to_set * sizeof(uint32_t));\n  }\n\n  void D3DSetComputeRootConstantBufferView(\n      UINT root_parameter_index, D3D12_GPU_VIRTUAL_ADDRESS buffer_location) {\n    auto& args = *reinterpret_cast<SetRootDescriptorArguments*>(\n        WriteCommand(Command::kD3DSetComputeRootConstantBufferView,\n                     sizeof(SetRootDescriptorArguments)));\n    args.root_parameter_index = root_parameter_index;\n    args.buffer_location = buffer_location;\n  }\n\n  void D3DSetGraphicsRootConstantBufferView(\n      UINT root_parameter_index, D3D12_GPU_VIRTUAL_ADDRESS buffer_location) {\n    auto& args = *reinterpret_cast<SetRootDescriptorArguments*>(\n        WriteCommand(Command::kD3DSetGraphicsRootConstantBufferView,\n                     sizeof(SetRootDescriptorArguments)));\n    args.root_parameter_index = root_parameter_index;\n    args.buffer_location = buffer_location;\n  }\n\n  void D3DSetComputeRootDescriptorTable(\n      UINT root_parameter_index, D3D12_GPU_DESCRIPTOR_HANDLE base_descriptor) {\n    auto& args = *reinterpret_cast<SetRootDescriptorTableArguments*>(\n        WriteCommand(Command::kD3DSetComputeRootDescriptorTable,\n                     sizeof(SetRootDescriptorTableArguments)));\n    args.root_parameter_index = root_parameter_index;\n    args.base_descriptor.ptr = base_descriptor.ptr;\n  }\n\n  void D3DSetGraphicsRootDescriptorTable(\n      UINT root_parameter_index, D3D12_GPU_DESCRIPTOR_HANDLE base_descriptor) {\n    auto& args = *reinterpret_cast<SetRootDescriptorTableArguments*>(\n        WriteCommand(Command::kD3DSetGraphicsRootDescriptorTable,\n                     sizeof(SetRootDescriptorTableArguments)));\n    args.root_parameter_index = root_parameter_index;\n    args.base_descriptor.ptr = base_descriptor.ptr;\n  }\n\n  void D3DSetComputeRootShaderResourceView(\n      UINT root_parameter_index, D3D12_GPU_VIRTUAL_ADDRESS buffer_location) {\n    auto& args = *reinterpret_cast<SetRootDescriptorArguments*>(\n        WriteCommand(Command::kD3DSetComputeRootShaderResourceView,\n                     sizeof(SetRootDescriptorArguments)));\n    args.root_parameter_index = root_parameter_index;\n    args.buffer_location = buffer_location;\n  }\n\n  void D3DSetGraphicsRootShaderResourceView(\n      UINT root_parameter_index, D3D12_GPU_VIRTUAL_ADDRESS buffer_location) {\n    auto& args = *reinterpret_cast<SetRootDescriptorArguments*>(\n        WriteCommand(Command::kD3DSetGraphicsRootShaderResourceView,\n                     sizeof(SetRootDescriptorArguments)));\n    args.root_parameter_index = root_parameter_index;\n    args.buffer_location = buffer_location;\n  }\n\n  void D3DSetComputeRootSignature(ID3D12RootSignature* root_signature) {\n    auto& arg = *reinterpret_cast<ID3D12RootSignature**>(WriteCommand(\n        Command::kD3DSetComputeRootSignature, sizeof(ID3D12RootSignature*)));\n    arg = root_signature;\n  }\n\n  void D3DSetGraphicsRootSignature(ID3D12RootSignature* root_signature) {\n    auto& arg = *reinterpret_cast<ID3D12RootSignature**>(WriteCommand(\n        Command::kD3DSetGraphicsRootSignature, sizeof(ID3D12RootSignature*)));\n    arg = root_signature;\n  }\n\n  void D3DSetComputeRootUnorderedAccessView(\n      UINT root_parameter_index, D3D12_GPU_VIRTUAL_ADDRESS buffer_location) {\n    auto& args = *reinterpret_cast<SetRootDescriptorArguments*>(\n        WriteCommand(Command::kD3DSetComputeRootUnorderedAccessView,\n                     sizeof(SetRootDescriptorArguments)));\n    args.root_parameter_index = root_parameter_index;\n    args.buffer_location = buffer_location;\n  }\n\n  void D3DSetGraphicsRootUnorderedAccessView(\n      UINT root_parameter_index, D3D12_GPU_VIRTUAL_ADDRESS buffer_location) {\n    auto& args = *reinterpret_cast<SetRootDescriptorArguments*>(\n        WriteCommand(Command::kD3DSetGraphicsRootUnorderedAccessView,\n                     sizeof(SetRootDescriptorArguments)));\n    args.root_parameter_index = root_parameter_index;\n    args.buffer_location = buffer_location;\n  }\n\n  void SetDescriptorHeaps(ID3D12DescriptorHeap* cbv_srv_uav_descriptor_heap,\n                          ID3D12DescriptorHeap* sampler_descriptor_heap) {\n    auto& args = *reinterpret_cast<SetDescriptorHeapsArguments*>(WriteCommand(\n        Command::kSetDescriptorHeaps, sizeof(SetDescriptorHeapsArguments)));\n    args.cbv_srv_uav_descriptor_heap = cbv_srv_uav_descriptor_heap;\n    args.sampler_descriptor_heap = sampler_descriptor_heap;\n  }\n\n  void D3DSetPipelineState(ID3D12PipelineState* pipeline_state) {\n    auto& arg = *reinterpret_cast<ID3D12PipelineState**>(WriteCommand(\n        Command::kD3DSetPipelineState, sizeof(ID3D12PipelineState*)));\n    arg = pipeline_state;\n  }\n\n  void SetPipelineStateHandle(void* pipeline_state_handle) {\n    auto& arg = *reinterpret_cast<void**>(\n        WriteCommand(Command::kSetPipelineStateHandle, sizeof(void*)));\n    arg = pipeline_state_handle;\n  }\n\n  void D3DSetSamplePositions(UINT num_samples_per_pixel, UINT num_pixels,\n                             const D3D12_SAMPLE_POSITION* sample_positions) {\n    auto& args = *reinterpret_cast<D3DSetSamplePositionsArguments*>(\n        WriteCommand(Command::kD3DSetSamplePositions,\n                     sizeof(D3DSetSamplePositionsArguments)));\n    args.num_samples_per_pixel = num_samples_per_pixel;\n    args.num_pixels = num_pixels;\n    std::memcpy(args.sample_positions, sample_positions,\n                std::min(num_samples_per_pixel * num_pixels, UINT(16)) *\n                    sizeof(D3D12_SAMPLE_POSITION));\n  }\n\n private:\n  enum class Command {\n    kD3DClearDepthStencilView,\n    kD3DClearRenderTargetView,\n    kD3DClearUnorderedAccessViewUint,\n    kD3DCopyBufferRegion,\n    kD3DCopyResource,\n    kCopyTexture,\n    kD3DCopyTextureRegion,\n    kD3DDispatch,\n    kD3DDrawIndexedInstanced,\n    kD3DDrawInstanced,\n    kD3DIASetIndexBuffer,\n    kD3DIASetPrimitiveTopology,\n    kD3DIASetVertexBuffers,\n    kD3DOMSetBlendFactor,\n    kD3DOMSetRenderTargets,\n    kD3DOMSetStencilRef,\n    kD3DResourceBarrier,\n    kRSSetScissorRect,\n    kRSSetViewport,\n    kD3DSetComputeRoot32BitConstants,\n    kD3DSetGraphicsRoot32BitConstants,\n    kD3DSetComputeRootConstantBufferView,\n    kD3DSetGraphicsRootConstantBufferView,\n    kD3DSetComputeRootDescriptorTable,\n    kD3DSetGraphicsRootDescriptorTable,\n    kD3DSetComputeRootShaderResourceView,\n    kD3DSetGraphicsRootShaderResourceView,\n    kD3DSetComputeRootSignature,\n    kD3DSetGraphicsRootSignature,\n    kD3DSetComputeRootUnorderedAccessView,\n    kD3DSetGraphicsRootUnorderedAccessView,\n    kSetDescriptorHeaps,\n    kD3DSetPipelineState,\n    kSetPipelineStateHandle,\n    kD3DSetSamplePositions,\n  };\n\n  struct CommandHeader {\n    Command command;\n    uint32_t arguments_size_elements;\n  };\n  static constexpr size_t kCommandHeaderSizeElements =\n      (sizeof(CommandHeader) + sizeof(uintmax_t) - 1) / sizeof(uintmax_t);\n\n  struct ClearDepthStencilViewHeader {\n    D3D12_CPU_DESCRIPTOR_HANDLE depth_stencil_view;\n    D3D12_CLEAR_FLAGS clear_flags;\n    FLOAT depth;\n    UINT8 stencil;\n    UINT num_rects;\n  };\n\n  struct ClearRenderTargetViewHeader {\n    D3D12_CPU_DESCRIPTOR_HANDLE render_target_view;\n    FLOAT color_rgba[4];\n    UINT num_rects;\n  };\n\n  struct ClearUnorderedAccessViewHeader {\n    D3D12_GPU_DESCRIPTOR_HANDLE view_gpu_handle_in_current_heap;\n    D3D12_CPU_DESCRIPTOR_HANDLE view_cpu_handle;\n    ID3D12Resource* resource;\n    union {\n      FLOAT values_float[4];\n      UINT values_uint[4];\n    };\n    UINT num_rects;\n  };\n\n  struct D3DCopyBufferRegionArguments {\n    ID3D12Resource* dst_buffer;\n    UINT64 dst_offset;\n    ID3D12Resource* src_buffer;\n    UINT64 src_offset;\n    UINT64 num_bytes;\n  };\n\n  struct D3DCopyResourceArguments {\n    ID3D12Resource* dst_resource;\n    ID3D12Resource* src_resource;\n  };\n\n  struct CopyTextureArguments {\n    D3D12_TEXTURE_COPY_LOCATION dst;\n    D3D12_TEXTURE_COPY_LOCATION src;\n  };\n\n  struct D3DCopyTextureRegionArguments {\n    D3D12_TEXTURE_COPY_LOCATION dst;\n    UINT dst_x;\n    UINT dst_y;\n    UINT dst_z;\n    D3D12_TEXTURE_COPY_LOCATION src;\n    D3D12_BOX src_box;\n    bool has_src_box;\n  };\n\n  struct D3DDispatchArguments {\n    UINT thread_group_count_x;\n    UINT thread_group_count_y;\n    UINT thread_group_count_z;\n  };\n\n  struct D3DDrawIndexedInstancedArguments {\n    UINT index_count_per_instance;\n    UINT instance_count;\n    UINT start_index_location;\n    INT base_vertex_location;\n    UINT start_instance_location;\n  };\n\n  struct D3DDrawInstancedArguments {\n    UINT vertex_count_per_instance;\n    UINT instance_count;\n    UINT start_vertex_location;\n    UINT start_instance_location;\n  };\n\n  struct D3DIASetVertexBuffersHeader {\n    UINT start_slot;\n    UINT num_views;\n  };\n\n  struct D3DOMSetRenderTargetsArguments {\n    uint8_t num_render_target_descriptors;\n    bool rts_single_handle_to_descriptor_range;\n    bool depth_stencil;\n    D3D12_CPU_DESCRIPTOR_HANDLE\n    render_target_descriptors[D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT];\n    D3D12_CPU_DESCRIPTOR_HANDLE depth_stencil_descriptor;\n  };\n\n  struct SetRoot32BitConstantsHeader {\n    UINT root_parameter_index;\n    UINT num_32bit_values_to_set;\n    UINT dest_offset_in_32bit_values;\n  };\n\n  struct SetRootDescriptorArguments {\n    UINT root_parameter_index;\n    D3D12_GPU_VIRTUAL_ADDRESS buffer_location;\n  };\n\n  struct SetRootDescriptorTableArguments {\n    UINT root_parameter_index;\n    D3D12_GPU_DESCRIPTOR_HANDLE base_descriptor;\n  };\n\n  struct SetDescriptorHeapsArguments {\n    ID3D12DescriptorHeap* cbv_srv_uav_descriptor_heap;\n    ID3D12DescriptorHeap* sampler_descriptor_heap;\n  };\n\n  struct D3DSetSamplePositionsArguments {\n    UINT num_samples_per_pixel;\n    UINT num_pixels;\n    D3D12_SAMPLE_POSITION sample_positions[16];\n  };\n\n  void* WriteCommand(Command command, size_t arguments_size_bytes);\n\n  const D3D12CommandProcessor& command_processor_;\n\n  // uintmax_t to ensure uint64_t and pointer alignment of all structures.\n  std::vector<uintmax_t> command_stream_;\n};\n\n}  // namespace d3d12\n}  // namespace gpu\n}  // namespace xe\n\n#endif  // XENIA_GPU_D3D12_DEFERRED_COMMAND_LIST_H_\n"
  },
  {
    "path": "src/xenia/gpu/d3d12/pipeline_cache.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/d3d12/pipeline_cache.h\"\n\n#include <algorithm>\n#include <atomic>\n#include <cinttypes>\n#include <cmath>\n#include <cstring>\n#include <deque>\n#include <mutex>\n#include <set>\n#include <utility>\n#include <vector>\n\n#include \"third_party/dxbc/DXBCChecksum.h\"\n#include \"third_party/fmt/include/fmt/format.h\"\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/byte_order.h\"\n#include \"xenia/base/clock.h\"\n#include \"xenia/base/cvar.h\"\n#include \"xenia/base/filesystem.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/profiling.h\"\n#include \"xenia/base/string.h\"\n#include \"xenia/base/string_buffer.h\"\n#include \"xenia/base/xxhash.h\"\n#include \"xenia/gpu/d3d12/d3d12_command_processor.h\"\n#include \"xenia/gpu/d3d12/d3d12_render_target_cache.h\"\n#include \"xenia/gpu/draw_util.h\"\n#include \"xenia/gpu/dxbc.h\"\n#include \"xenia/gpu/dxbc_shader_translator.h\"\n#include \"xenia/gpu/gpu_flags.h\"\n#include \"xenia/gpu/registers.h\"\n#include \"xenia/gpu/xenos.h\"\n#include \"xenia/ui/d3d12/d3d12_util.h\"\n\nDEFINE_bool(d3d12_dxbc_disasm, false,\n            \"Disassemble DXBC shaders after generation.\", \"D3D12\");\nDEFINE_bool(\n    d3d12_dxbc_disasm_dxilconv, false,\n    \"Disassemble DXBC shaders after conversion to DXIL, if DXIL shaders are \"\n    \"supported by the OS, and DirectX Shader Compiler DLLs available at \"\n    \"https://github.com/microsoft/DirectXShaderCompiler/releases are present.\",\n    \"D3D12\");\nDEFINE_int32(\n    d3d12_pipeline_creation_threads, -1,\n    \"Number of threads used for graphics pipeline creation. -1 to calculate \"\n    \"automatically (75% of logical CPU cores), a positive number to specify \"\n    \"the number of threads explicitly (up to the number of logical CPU cores), \"\n    \"0 to disable multithreaded pipeline creation.\",\n    \"D3D12\");\nDEFINE_bool(d3d12_tessellation_wireframe, false,\n            \"Display tessellated surfaces as wireframe for debugging.\",\n            \"D3D12\");\n\nnamespace xe {\nnamespace gpu {\nnamespace d3d12 {\n\n// Generated with `xb buildshaders`.\nnamespace shaders {\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/adaptive_quad_hs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/adaptive_triangle_hs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/continuous_quad_1cp_hs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/continuous_quad_4cp_hs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/continuous_triangle_1cp_hs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/continuous_triangle_3cp_hs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/discrete_quad_1cp_hs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/discrete_quad_4cp_hs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/discrete_triangle_1cp_hs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/discrete_triangle_3cp_hs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/float24_round_ps.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/float24_truncate_ps.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/tessellation_adaptive_vs.h\"\n#include \"xenia/gpu/shaders/bytecode/d3d12_5_1/tessellation_indexed_vs.h\"\n}  // namespace shaders\n\nPipelineCache::PipelineCache(D3D12CommandProcessor& command_processor,\n                             const RegisterFile& register_file,\n                             const D3D12RenderTargetCache& render_target_cache,\n                             bool bindless_resources_used)\n    : command_processor_(command_processor),\n      register_file_(register_file),\n      render_target_cache_(render_target_cache),\n      bindless_resources_used_(bindless_resources_used) {\n  const ui::d3d12::D3D12Provider& provider =\n      command_processor_.GetD3D12Provider();\n\n  bool edram_rov_used = render_target_cache.GetPath() ==\n                        RenderTargetCache::Path::kPixelShaderInterlock;\n\n  shader_translator_ = std::make_unique<DxbcShaderTranslator>(\n      provider.GetAdapterVendorID(), bindless_resources_used_, edram_rov_used,\n      !(edram_rov_used ||\n        render_target_cache_.gamma_render_target_as_unorm16()),\n      render_target_cache_.msaa_2x_supported(),\n      render_target_cache_.draw_resolution_scale_x(),\n      render_target_cache_.draw_resolution_scale_y(),\n      provider.GetGraphicsAnalysis() != nullptr);\n\n  if (edram_rov_used) {\n    depth_only_pixel_shader_ =\n        std::move(shader_translator_->CreateDepthOnlyPixelShader());\n  }\n}\n\nPipelineCache::~PipelineCache() { Shutdown(); }\n\nbool PipelineCache::Initialize() {\n  const ui::d3d12::D3D12Provider& provider =\n      command_processor_.GetD3D12Provider();\n\n  // Initialize the command processor thread DXIL objects.\n  dxbc_converter_ = nullptr;\n  dxc_utils_ = nullptr;\n  dxc_compiler_ = nullptr;\n  if (cvars::d3d12_dxbc_disasm_dxilconv) {\n    if (FAILED(provider.DxbcConverterCreateInstance(\n            CLSID_DxbcConverter, IID_PPV_ARGS(&dxbc_converter_)))) {\n      XELOGE(\n          \"Failed to create DxbcConverter, converted DXIL disassembly for \"\n          \"debugging will be unavailable\");\n    }\n    if (FAILED(provider.DxcCreateInstance(CLSID_DxcUtils,\n                                          IID_PPV_ARGS(&dxc_utils_)))) {\n      XELOGE(\n          \"Failed to create DxcUtils, converted DXIL disassembly for debugging \"\n          \"will be unavailable\");\n    }\n    if (FAILED(provider.DxcCreateInstance(CLSID_DxcCompiler,\n                                          IID_PPV_ARGS(&dxc_compiler_)))) {\n      XELOGE(\n          \"Failed to create DxcCompiler, converted DXIL disassembly for \"\n          \"debugging will be unavailable\");\n    }\n  }\n\n  uint32_t logical_processor_count = xe::threading::logical_processor_count();\n  if (!logical_processor_count) {\n    // Pick some reasonable amount if couldn't determine the number of cores.\n    logical_processor_count = 6;\n  }\n  // Initialize creation thread synchronization data even if not using creation\n  // threads because they may be used anyway to create pipelines from the\n  // storage.\n  creation_threads_busy_ = 0;\n  creation_completion_event_ =\n      xe::threading::Event::CreateManualResetEvent(true);\n  assert_not_null(creation_completion_event_);\n  creation_completion_set_event_ = false;\n  creation_threads_shutdown_from_ = SIZE_MAX;\n  if (cvars::d3d12_pipeline_creation_threads != 0) {\n    size_t creation_thread_count;\n    if (cvars::d3d12_pipeline_creation_threads < 0) {\n      creation_thread_count =\n          std::max(logical_processor_count * 3 / 4, uint32_t(1));\n    } else {\n      creation_thread_count =\n          std::min(uint32_t(cvars::d3d12_pipeline_creation_threads),\n                   logical_processor_count);\n    }\n    for (size_t i = 0; i < creation_thread_count; ++i) {\n      std::unique_ptr<xe::threading::Thread> creation_thread =\n          xe::threading::Thread::Create({}, [this, i]() { CreationThread(i); });\n      assert_not_null(creation_thread);\n      creation_thread->set_name(\"D3D12 Pipelines\");\n      creation_threads_.push_back(std::move(creation_thread));\n    }\n  }\n  return true;\n}\n\nvoid PipelineCache::Shutdown() {\n  // Shut down all threads, before destroying the pipelines since they may be\n  // creating them.\n  if (!creation_threads_.empty()) {\n    {\n      std::lock_guard<std::mutex> lock(creation_request_lock_);\n      creation_threads_shutdown_from_ = 0;\n    }\n    creation_request_cond_.notify_all();\n    for (size_t i = 0; i < creation_threads_.size(); ++i) {\n      xe::threading::Wait(creation_threads_[i].get(), false);\n    }\n    creation_threads_.clear();\n  }\n  creation_completion_event_.reset();\n\n  // Shut down the persistent shader / pipeline storage.\n  ShutdownShaderStorage();\n\n  // Destroy all pipelines.\n  current_pipeline_ = nullptr;\n  for (auto it : pipelines_) {\n    it.second->state->Release();\n    delete it.second;\n  }\n  pipelines_.clear();\n  COUNT_profile_set(\"gpu/pipeline_cache/pipelines\", 0);\n\n  // Destroy all shaders.\n  if (bindless_resources_used_) {\n    bindless_sampler_layout_map_.clear();\n    bindless_sampler_layouts_.clear();\n  }\n  texture_binding_layout_map_.clear();\n  texture_binding_layouts_.clear();\n  for (auto it : shaders_) {\n    delete it.second;\n  }\n  shaders_.clear();\n  shader_storage_index_ = 0;\n\n  // Shut down shader translation.\n  ui::d3d12::util::ReleaseAndNull(dxc_compiler_);\n  ui::d3d12::util::ReleaseAndNull(dxc_utils_);\n  ui::d3d12::util::ReleaseAndNull(dxbc_converter_);\n}\n\nvoid PipelineCache::InitializeShaderStorage(\n    const std::filesystem::path& cache_root, uint32_t title_id, bool blocking) {\n  ShutdownShaderStorage();\n\n  auto shader_storage_root = cache_root / \"shaders\";\n  // For files that can be moved between different hosts.\n  // Host PSO blobs - if ever added - should be stored in shaders/local/ (they\n  // currently aren't used because because they may be not very practical -\n  // would need to invalidate them every commit likely, and additional I/O\n  // cost - though D3D's internal validation would possibly be enough to ensure\n  // they are up to date).\n  auto shader_storage_shareable_root = shader_storage_root / \"shareable\";\n  if (!std::filesystem::exists(shader_storage_shareable_root)) {\n    if (!std::filesystem::create_directories(shader_storage_shareable_root)) {\n      XELOGE(\n          \"Failed to create the shareable shader storage directory, persistent \"\n          \"shader storage will be disabled: {}\",\n          xe::path_to_utf8(shader_storage_shareable_root));\n      return;\n    }\n  }\n\n  bool edram_rov_used = render_target_cache_.GetPath() ==\n                        RenderTargetCache::Path::kPixelShaderInterlock;\n\n  // Initialize the pipeline storage stream - read pipeline descriptions and\n  // collect used shader modifications to translate.\n  std::vector<PipelineStoredDescription> pipeline_stored_descriptions;\n  // <Shader hash, modification bits>.\n  std::set<std::pair<uint64_t, uint64_t>> shader_translations_needed;\n  auto pipeline_storage_file_path =\n      shader_storage_shareable_root /\n      fmt::format(\"{:08X}.{}.d3d12.xpso\", title_id,\n                  edram_rov_used ? \"rov\" : \"rtv\");\n  pipeline_storage_file_ =\n      xe::filesystem::OpenFile(pipeline_storage_file_path, \"a+b\");\n  if (!pipeline_storage_file_) {\n    XELOGE(\n        \"Failed to open the Direct3D 12 pipeline description storage file for \"\n        \"writing, persistent shader storage will be disabled: {}\",\n        xe::path_to_utf8(pipeline_storage_file_path));\n    return;\n  }\n  pipeline_storage_file_flush_needed_ = false;\n  // 'XEPS'.\n  const uint32_t pipeline_storage_magic = 0x53504558;\n  // 'DXRO' or 'DXRT'.\n  const uint32_t pipeline_storage_magic_api =\n      edram_rov_used ? 0x4F525844 : 0x54525844;\n  const uint32_t pipeline_storage_version_swapped =\n      xe::byte_swap(std::max(PipelineDescription::kVersion,\n                             DxbcShaderTranslator::Modification::kVersion));\n  struct {\n    uint32_t magic;\n    uint32_t magic_api;\n    uint32_t version_swapped;\n  } pipeline_storage_file_header;\n  if (fread(&pipeline_storage_file_header, sizeof(pipeline_storage_file_header),\n            1, pipeline_storage_file_) &&\n      pipeline_storage_file_header.magic == pipeline_storage_magic &&\n      pipeline_storage_file_header.magic_api == pipeline_storage_magic_api &&\n      pipeline_storage_file_header.version_swapped ==\n          pipeline_storage_version_swapped) {\n    xe::filesystem::Seek(pipeline_storage_file_, 0, SEEK_END);\n    int64_t pipeline_storage_told_end =\n        xe::filesystem::Tell(pipeline_storage_file_);\n    size_t pipeline_storage_told_count =\n        size_t(pipeline_storage_told_end >=\n                       int64_t(sizeof(pipeline_storage_file_header))\n                   ? (uint64_t(pipeline_storage_told_end) -\n                      sizeof(pipeline_storage_file_header)) /\n                         sizeof(PipelineStoredDescription)\n                   : 0);\n    if (pipeline_storage_told_count &&\n        xe::filesystem::Seek(pipeline_storage_file_,\n                             int64_t(sizeof(pipeline_storage_file_header)),\n                             SEEK_SET)) {\n      pipeline_stored_descriptions.resize(pipeline_storage_told_count);\n      pipeline_stored_descriptions.resize(\n          fread(pipeline_stored_descriptions.data(),\n                sizeof(PipelineStoredDescription), pipeline_storage_told_count,\n                pipeline_storage_file_));\n      size_t pipeline_storage_read_count = pipeline_stored_descriptions.size();\n      for (size_t i = 0; i < pipeline_storage_read_count; ++i) {\n        const PipelineStoredDescription& pipeline_stored_description =\n            pipeline_stored_descriptions[i];\n        // Validate file integrity, stop and truncate the stream if data is\n        // corrupted.\n        if (XXH3_64bits(&pipeline_stored_description.description,\n                        sizeof(pipeline_stored_description.description)) !=\n            pipeline_stored_description.description_hash) {\n          pipeline_stored_descriptions.resize(i);\n          break;\n        }\n        // TODO(Triang3l): On Vulkan, skip pipelines requiring unsupported\n        // device features (to keep the cache files mostly shareable across\n        // devices).\n        // Mark the shader modifications as needed for translation.\n        shader_translations_needed.emplace(\n            pipeline_stored_description.description.vertex_shader_hash,\n            pipeline_stored_description.description.vertex_shader_modification);\n        if (pipeline_stored_description.description.pixel_shader_hash) {\n          shader_translations_needed.emplace(\n              pipeline_stored_description.description.pixel_shader_hash,\n              pipeline_stored_description.description\n                  .pixel_shader_modification);\n        }\n      }\n    }\n  }\n\n  size_t logical_processor_count = xe::threading::logical_processor_count();\n  if (!logical_processor_count) {\n    // Pick some reasonable amount if couldn't determine the number of cores.\n    logical_processor_count = 6;\n  }\n\n  // Initialize the Xenos shader storage stream.\n  uint64_t shader_storage_initialization_start =\n      xe::Clock::QueryHostTickCount();\n  auto shader_storage_file_path =\n      shader_storage_shareable_root / fmt::format(\"{:08X}.xsh\", title_id);\n  shader_storage_file_ =\n      xe::filesystem::OpenFile(shader_storage_file_path, \"a+b\");\n  if (!shader_storage_file_) {\n    XELOGE(\n        \"Failed to open the guest shader storage file for writing, persistent \"\n        \"shader storage will be disabled: {}\",\n        xe::path_to_utf8(shader_storage_file_path));\n    fclose(pipeline_storage_file_);\n    pipeline_storage_file_ = nullptr;\n    return;\n  }\n  ++shader_storage_index_;\n  shader_storage_file_flush_needed_ = false;\n  struct {\n    uint32_t magic;\n    uint32_t version_swapped;\n  } shader_storage_file_header;\n  // 'XESH'.\n  const uint32_t shader_storage_magic = 0x48534558;\n  if (fread(&shader_storage_file_header, sizeof(shader_storage_file_header), 1,\n            shader_storage_file_) &&\n      shader_storage_file_header.magic == shader_storage_magic &&\n      xe::byte_swap(shader_storage_file_header.version_swapped) ==\n          ShaderStoredHeader::kVersion) {\n    uint64_t shader_storage_valid_bytes = sizeof(shader_storage_file_header);\n    // Load and translate shaders written by previous Xenia executions until the\n    // end of the file or until a corrupted one is detected.\n    ShaderStoredHeader shader_header;\n    std::vector<uint32_t> ucode_dwords;\n    ucode_dwords.reserve(0xFFFF);\n    size_t shaders_translated = 0;\n\n    // Threads overlapping file reading.\n    std::mutex shaders_translation_thread_mutex;\n    std::condition_variable shaders_translation_thread_cond;\n    std::deque<D3D12Shader*> shaders_to_translate;\n    size_t shader_translation_threads_busy = 0;\n    bool shader_translation_threads_shutdown = false;\n    std::mutex shaders_failed_to_translate_mutex;\n    std::vector<D3D12Shader::D3D12Translation*> shaders_failed_to_translate;\n    auto shader_translation_thread_function = [&]() {\n      const ui::d3d12::D3D12Provider& provider =\n          command_processor_.GetD3D12Provider();\n      StringBuffer ucode_disasm_buffer;\n      DxbcShaderTranslator translator(\n          provider.GetAdapterVendorID(), bindless_resources_used_,\n          edram_rov_used,\n          !(edram_rov_used ||\n            render_target_cache_.gamma_render_target_as_unorm16()),\n          render_target_cache_.msaa_2x_supported(),\n          render_target_cache_.draw_resolution_scale_x(),\n          render_target_cache_.draw_resolution_scale_y(),\n          provider.GetGraphicsAnalysis() != nullptr);\n      // If needed and possible, create objects needed for DXIL conversion and\n      // disassembly on this thread.\n      IDxbcConverter* dxbc_converter = nullptr;\n      IDxcUtils* dxc_utils = nullptr;\n      IDxcCompiler* dxc_compiler = nullptr;\n      if (cvars::d3d12_dxbc_disasm_dxilconv && dxbc_converter_ && dxc_utils_ &&\n          dxc_compiler_) {\n        provider.DxbcConverterCreateInstance(CLSID_DxbcConverter,\n                                             IID_PPV_ARGS(&dxbc_converter));\n        provider.DxcCreateInstance(CLSID_DxcUtils, IID_PPV_ARGS(&dxc_utils));\n        provider.DxcCreateInstance(CLSID_DxcCompiler,\n                                   IID_PPV_ARGS(&dxc_compiler));\n      }\n      for (;;) {\n        D3D12Shader* shader_to_translate;\n        for (;;) {\n          std::unique_lock<std::mutex> lock(shaders_translation_thread_mutex);\n          if (shaders_to_translate.empty()) {\n            if (shader_translation_threads_shutdown) {\n              return;\n            }\n            shaders_translation_thread_cond.wait(lock);\n            continue;\n          }\n          shader_to_translate = shaders_to_translate.front();\n          shaders_to_translate.pop_front();\n          ++shader_translation_threads_busy;\n          break;\n        }\n        shader_to_translate->AnalyzeUcode(ucode_disasm_buffer);\n        // Translate each needed modification on this thread after performing\n        // modification-independent analysis of the whole shader.\n        uint64_t ucode_data_hash = shader_to_translate->ucode_data_hash();\n        for (auto modification_it = shader_translations_needed.lower_bound(\n                 std::make_pair(ucode_data_hash, uint64_t(0)));\n             modification_it != shader_translations_needed.end() &&\n             modification_it->first == ucode_data_hash;\n             ++modification_it) {\n          D3D12Shader::D3D12Translation* translation =\n              static_cast<D3D12Shader::D3D12Translation*>(\n                  shader_to_translate->GetOrCreateTranslation(\n                      modification_it->second));\n          // Only try (and delete in case of failure) if it's a new translation.\n          // If it's a shader previously encountered in the game, translation of\n          // which has failed, and the shader storage is loaded later, keep it\n          // this way not to try to translate it again.\n          if (!translation->is_translated() &&\n              !TranslateAnalyzedShader(translator, *translation, dxbc_converter,\n                                       dxc_utils, dxc_compiler)) {\n            std::lock_guard<std::mutex> lock(shaders_failed_to_translate_mutex);\n            shaders_failed_to_translate.push_back(translation);\n          }\n        }\n        {\n          std::lock_guard<std::mutex> lock(shaders_translation_thread_mutex);\n          --shader_translation_threads_busy;\n        }\n      }\n      if (dxc_compiler) {\n        dxc_compiler->Release();\n      }\n      if (dxc_utils) {\n        dxc_utils->Release();\n      }\n      if (dxbc_converter) {\n        dxbc_converter->Release();\n      }\n    };\n    std::vector<std::unique_ptr<xe::threading::Thread>>\n        shader_translation_threads;\n\n    while (true) {\n      if (!fread(&shader_header, sizeof(shader_header), 1,\n                 shader_storage_file_)) {\n        break;\n      }\n      size_t ucode_byte_count =\n          shader_header.ucode_dword_count * sizeof(uint32_t);\n      ucode_dwords.resize(shader_header.ucode_dword_count);\n      if (shader_header.ucode_dword_count &&\n          !fread(ucode_dwords.data(), ucode_byte_count, 1,\n                 shader_storage_file_)) {\n        break;\n      }\n      uint64_t ucode_data_hash =\n          XXH3_64bits(ucode_dwords.data(), ucode_byte_count);\n      if (shader_header.ucode_data_hash != ucode_data_hash) {\n        // Validation failed.\n        break;\n      }\n      shader_storage_valid_bytes += sizeof(shader_header) + ucode_byte_count;\n      D3D12Shader* shader =\n          LoadShader(shader_header.type, ucode_dwords.data(),\n                     shader_header.ucode_dword_count, ucode_data_hash);\n      if (shader->ucode_storage_index() == shader_storage_index_) {\n        // Appeared twice in this file for some reason - skip, otherwise race\n        // condition will be caused by translating twice in parallel.\n        continue;\n      }\n      // Loaded from the current storage - don't write again.\n      shader->set_ucode_storage_index(shader_storage_index_);\n      // Create new threads if the currently existing threads can't keep up\n      // with file reading, but not more than the number of logical processors\n      // minus one.\n      size_t shader_translation_threads_needed;\n      {\n        std::lock_guard<std::mutex> lock(shaders_translation_thread_mutex);\n        shader_translation_threads_needed =\n            std::min(shader_translation_threads_busy +\n                         shaders_to_translate.size() + size_t(1),\n                     logical_processor_count - size_t(1));\n      }\n      while (shader_translation_threads.size() <\n             shader_translation_threads_needed) {\n        auto thread = xe::threading::Thread::Create(\n            {}, shader_translation_thread_function);\n        assert_not_null(thread);\n        thread->set_name(\"Shader Translation\");\n        shader_translation_threads.push_back(std::move(thread));\n      }\n      // Request ucode information gathering and translation of all the needed\n      // shaders.\n      {\n        std::lock_guard<std::mutex> lock(shaders_translation_thread_mutex);\n        shaders_to_translate.push_back(shader);\n      }\n      shaders_translation_thread_cond.notify_one();\n      ++shaders_translated;\n    }\n    if (!shader_translation_threads.empty()) {\n      {\n        std::lock_guard<std::mutex> lock(shaders_translation_thread_mutex);\n        shader_translation_threads_shutdown = true;\n      }\n      shaders_translation_thread_cond.notify_all();\n      for (auto& shader_translation_thread : shader_translation_threads) {\n        xe::threading::Wait(shader_translation_thread.get(), false);\n      }\n      shader_translation_threads.clear();\n      for (D3D12Shader::D3D12Translation* translation :\n           shaders_failed_to_translate) {\n        D3D12Shader* shader = static_cast<D3D12Shader*>(&translation->shader());\n        shader->DestroyTranslation(translation->modification());\n        if (shader->translations().empty()) {\n          shaders_.erase(shader->ucode_data_hash());\n          delete shader;\n        }\n      }\n    }\n    XELOGGPU(\"Translated {} shaders from the storage in {} milliseconds\",\n             shaders_translated,\n             (xe::Clock::QueryHostTickCount() -\n              shader_storage_initialization_start) *\n                 1000 / xe::Clock::QueryHostTickFrequency());\n    xe::filesystem::TruncateStdioFile(shader_storage_file_,\n                                      shader_storage_valid_bytes);\n  } else {\n    xe::filesystem::TruncateStdioFile(shader_storage_file_, 0);\n    shader_storage_file_header.magic = shader_storage_magic;\n    shader_storage_file_header.version_swapped =\n        xe::byte_swap(ShaderStoredHeader::kVersion);\n    fwrite(&shader_storage_file_header, sizeof(shader_storage_file_header), 1,\n           shader_storage_file_);\n  }\n\n  // Create the pipelines.\n  if (!pipeline_stored_descriptions.empty()) {\n    uint64_t pipeline_creation_start_ = xe::Clock::QueryHostTickCount();\n\n    // Launch additional creation threads to use all cores to create\n    // pipelines faster. Will also be using the main thread, so minus 1.\n    size_t creation_thread_original_count = creation_threads_.size();\n    size_t creation_thread_needed_count = std::max(\n        std::min(pipeline_stored_descriptions.size(), logical_processor_count) -\n            size_t(1),\n        creation_thread_original_count);\n    while (creation_threads_.size() < creation_thread_original_count) {\n      size_t creation_thread_index = creation_threads_.size();\n      std::unique_ptr<xe::threading::Thread> creation_thread =\n          xe::threading::Thread::Create({}, [this, creation_thread_index]() {\n            CreationThread(creation_thread_index);\n          });\n      assert_not_null(creation_thread);\n      creation_thread->set_name(\"D3D12 Pipelines\");\n      creation_threads_.push_back(std::move(creation_thread));\n    }\n\n    size_t pipelines_created = 0;\n    for (const PipelineStoredDescription& pipeline_stored_description :\n         pipeline_stored_descriptions) {\n      const PipelineDescription& pipeline_description =\n          pipeline_stored_description.description;\n      // TODO(Triang3l): On Vulkan, skip pipelines requiring unsupported device\n      // features (to keep the cache files mostly shareable across devices).\n      // Skip already known pipelines - those have already been enqueued.\n      auto found_range =\n          pipelines_.equal_range(pipeline_stored_description.description_hash);\n      bool pipeline_found = false;\n      for (auto it = found_range.first; it != found_range.second; ++it) {\n        Pipeline* found_pipeline = it->second;\n        if (!std::memcmp(&found_pipeline->description.description,\n                         &pipeline_description, sizeof(pipeline_description))) {\n          pipeline_found = true;\n          break;\n        }\n      }\n      if (pipeline_found) {\n        continue;\n      }\n\n      PipelineRuntimeDescription pipeline_runtime_description;\n      auto vertex_shader_it =\n          shaders_.find(pipeline_description.vertex_shader_hash);\n      if (vertex_shader_it == shaders_.end()) {\n        continue;\n      }\n      D3D12Shader* vertex_shader = vertex_shader_it->second;\n      pipeline_runtime_description.vertex_shader =\n          static_cast<D3D12Shader::D3D12Translation*>(\n              vertex_shader->GetTranslation(\n                  pipeline_description.vertex_shader_modification));\n      if (!pipeline_runtime_description.vertex_shader ||\n          !pipeline_runtime_description.vertex_shader->is_translated() ||\n          !pipeline_runtime_description.vertex_shader->is_valid()) {\n        continue;\n      }\n      D3D12Shader* pixel_shader;\n      if (pipeline_description.pixel_shader_hash) {\n        auto pixel_shader_it =\n            shaders_.find(pipeline_description.pixel_shader_hash);\n        if (pixel_shader_it == shaders_.end()) {\n          continue;\n        }\n        pixel_shader = pixel_shader_it->second;\n        pipeline_runtime_description.pixel_shader =\n            static_cast<D3D12Shader::D3D12Translation*>(\n                pixel_shader->GetTranslation(\n                    pipeline_description.pixel_shader_modification));\n        if (!pipeline_runtime_description.pixel_shader ||\n            !pipeline_runtime_description.pixel_shader->is_translated() ||\n            !pipeline_runtime_description.pixel_shader->is_valid()) {\n          continue;\n        }\n      } else {\n        pixel_shader = nullptr;\n        pipeline_runtime_description.pixel_shader = nullptr;\n      }\n      GeometryShaderKey pipeline_geometry_shader_key;\n      pipeline_runtime_description.geometry_shader =\n          GetGeometryShaderKey(\n              pipeline_description.geometry_shader,\n              DxbcShaderTranslator::Modification(\n                  pipeline_description.vertex_shader_modification),\n              DxbcShaderTranslator::Modification(\n                  pipeline_description.pixel_shader_modification),\n              pipeline_geometry_shader_key)\n              ? &GetGeometryShader(pipeline_geometry_shader_key)\n              : nullptr;\n      pipeline_runtime_description.root_signature =\n          command_processor_.GetRootSignature(\n              vertex_shader, pixel_shader,\n              Shader::IsHostVertexShaderTypeDomain(\n                  DxbcShaderTranslator::Modification(\n                      pipeline_description.vertex_shader_modification)\n                      .vertex.host_vertex_shader_type));\n      if (!pipeline_runtime_description.root_signature) {\n        continue;\n      }\n      std::memcpy(&pipeline_runtime_description.description,\n                  &pipeline_description, sizeof(pipeline_description));\n\n      Pipeline* new_pipeline = new Pipeline;\n      new_pipeline->state = nullptr;\n      std::memcpy(&new_pipeline->description, &pipeline_runtime_description,\n                  sizeof(pipeline_runtime_description));\n      pipelines_.emplace(pipeline_stored_description.description_hash,\n                         new_pipeline);\n      COUNT_profile_set(\"gpu/pipeline_cache/pipelines\", pipelines_.size());\n      if (!creation_threads_.empty()) {\n        // Submit the pipeline for creation to any available thread.\n        {\n          std::lock_guard<std::mutex> lock(creation_request_lock_);\n          creation_queue_.push_back(new_pipeline);\n        }\n        creation_request_cond_.notify_one();\n      } else {\n        new_pipeline->state = CreateD3D12Pipeline(pipeline_runtime_description);\n      }\n      ++pipelines_created;\n    }\n\n    if (!creation_threads_.empty()) {\n      CreateQueuedPipelinesOnProcessorThread();\n      if (creation_threads_.size() > creation_thread_original_count) {\n        {\n          std::lock_guard<std::mutex> lock(creation_request_lock_);\n          creation_threads_shutdown_from_ = creation_thread_original_count;\n          // Assuming the queue is empty because of\n          // CreateQueuedPipelinesOnProcessorThread.\n        }\n        creation_request_cond_.notify_all();\n        while (creation_threads_.size() > creation_thread_original_count) {\n          xe::threading::Wait(creation_threads_.back().get(), false);\n          creation_threads_.pop_back();\n        }\n        bool await_creation_completion_event;\n        {\n          // Cleanup so additional threads can be created later again.\n          std::lock_guard<std::mutex> lock(creation_request_lock_);\n          creation_threads_shutdown_from_ = SIZE_MAX;\n          // If the invocation is blocking, all the shader storage\n          // initialization is expected to be done before proceeding, to avoid\n          // latency in the command processor after the invocation.\n          await_creation_completion_event =\n              blocking && creation_threads_busy_ != 0;\n          if (await_creation_completion_event) {\n            creation_completion_event_->Reset();\n            creation_completion_set_event_ = true;\n          }\n        }\n        if (await_creation_completion_event) {\n          creation_request_cond_.notify_one();\n          xe::threading::Wait(creation_completion_event_.get(), false);\n        }\n      }\n    }\n\n    XELOGGPU(\n        \"Created {} graphics pipelines (not including reading the \"\n        \"descriptions) from the storage in {} milliseconds\",\n        pipelines_created,\n        (xe::Clock::QueryHostTickCount() - pipeline_creation_start_) * 1000 /\n            xe::Clock::QueryHostTickFrequency());\n    // If any pipeline descriptions were corrupted (or the whole file has excess\n    // bytes in the end), truncate to the last valid pipeline description.\n    xe::filesystem::TruncateStdioFile(\n        pipeline_storage_file_,\n        uint64_t(sizeof(pipeline_storage_file_header) +\n                 sizeof(PipelineStoredDescription) *\n                     pipeline_stored_descriptions.size()));\n  } else {\n    xe::filesystem::TruncateStdioFile(pipeline_storage_file_, 0);\n    pipeline_storage_file_header.magic = pipeline_storage_magic;\n    pipeline_storage_file_header.magic_api = pipeline_storage_magic_api;\n    pipeline_storage_file_header.version_swapped =\n        pipeline_storage_version_swapped;\n    fwrite(&pipeline_storage_file_header, sizeof(pipeline_storage_file_header),\n           1, pipeline_storage_file_);\n  }\n\n  shader_storage_cache_root_ = cache_root;\n  shader_storage_title_id_ = title_id;\n\n  // Start the storage writing thread.\n  storage_write_flush_shaders_ = false;\n  storage_write_flush_pipelines_ = false;\n  storage_write_thread_shutdown_ = false;\n  storage_write_thread_ =\n      xe::threading::Thread::Create({}, [this]() { StorageWriteThread(); });\n  assert_not_null(storage_write_thread_);\n  storage_write_thread_->set_name(\"D3D12 Storage writer\");\n}\n\nvoid PipelineCache::ShutdownShaderStorage() {\n  if (storage_write_thread_) {\n    {\n      std::lock_guard<std::mutex> lock(storage_write_request_lock_);\n      storage_write_thread_shutdown_ = true;\n    }\n    storage_write_request_cond_.notify_all();\n    xe::threading::Wait(storage_write_thread_.get(), false);\n    storage_write_thread_.reset();\n  }\n  storage_write_shader_queue_.clear();\n  storage_write_pipeline_queue_.clear();\n\n  if (pipeline_storage_file_) {\n    fclose(pipeline_storage_file_);\n    pipeline_storage_file_ = nullptr;\n    pipeline_storage_file_flush_needed_ = false;\n  }\n\n  if (shader_storage_file_) {\n    fclose(shader_storage_file_);\n    shader_storage_file_ = nullptr;\n    shader_storage_file_flush_needed_ = false;\n  }\n\n  shader_storage_cache_root_.clear();\n  shader_storage_title_id_ = 0;\n}\n\nvoid PipelineCache::EndSubmission() {\n  if (shader_storage_file_flush_needed_ ||\n      pipeline_storage_file_flush_needed_) {\n    {\n      std::lock_guard<std::mutex> lock(storage_write_request_lock_);\n      if (shader_storage_file_flush_needed_) {\n        storage_write_flush_shaders_ = true;\n      }\n      if (pipeline_storage_file_flush_needed_) {\n        storage_write_flush_pipelines_ = true;\n      }\n    }\n    storage_write_request_cond_.notify_one();\n    shader_storage_file_flush_needed_ = false;\n    pipeline_storage_file_flush_needed_ = false;\n  }\n  if (!creation_threads_.empty()) {\n    CreateQueuedPipelinesOnProcessorThread();\n    // Await creation of all queued pipelines.\n    bool await_creation_completion_event;\n    {\n      std::lock_guard<std::mutex> lock(creation_request_lock_);\n      // Assuming the creation queue is already empty (because the processor\n      // thread also worked on creating the leftover pipelines), so only check\n      // if there are threads with pipelines currently being created.\n      await_creation_completion_event = creation_threads_busy_ != 0;\n      if (await_creation_completion_event) {\n        creation_completion_event_->Reset();\n        creation_completion_set_event_ = true;\n      }\n    }\n    if (await_creation_completion_event) {\n      creation_request_cond_.notify_one();\n      xe::threading::Wait(creation_completion_event_.get(), false);\n    }\n  }\n}\n\nbool PipelineCache::IsCreatingPipelines() {\n  if (creation_threads_.empty()) {\n    return false;\n  }\n  std::lock_guard<std::mutex> lock(creation_request_lock_);\n  return !creation_queue_.empty() || creation_threads_busy_ != 0;\n}\n\nD3D12Shader* PipelineCache::LoadShader(xenos::ShaderType shader_type,\n                                       const uint32_t* host_address,\n                                       uint32_t dword_count) {\n  // Hash the input memory and lookup the shader.\n  return LoadShader(shader_type, host_address, dword_count,\n                    XXH3_64bits(host_address, dword_count * sizeof(uint32_t)));\n}\n\nD3D12Shader* PipelineCache::LoadShader(xenos::ShaderType shader_type,\n                                       const uint32_t* host_address,\n                                       uint32_t dword_count,\n                                       uint64_t data_hash) {\n  auto it = shaders_.find(data_hash);\n  if (it != shaders_.end()) {\n    // Shader has been previously loaded.\n    return it->second;\n  }\n  // Always create the shader and stash it away.\n  // We need to track it even if it fails translation so we know not to try\n  // again.\n  D3D12Shader* shader =\n      new D3D12Shader(shader_type, data_hash, host_address, dword_count);\n  shaders_.emplace(data_hash, shader);\n  return shader;\n}\n\nDxbcShaderTranslator::Modification\nPipelineCache::GetCurrentVertexShaderModification(\n    const Shader& shader, Shader::HostVertexShaderType host_vertex_shader_type,\n    uint32_t interpolator_mask) const {\n  assert_true(shader.type() == xenos::ShaderType::kVertex);\n  assert_true(shader.is_ucode_analyzed());\n  const auto& regs = register_file_;\n\n  DxbcShaderTranslator::Modification modification(\n      shader_translator_->GetDefaultVertexShaderModification(\n          shader.GetDynamicAddressableRegisterCount(\n              regs.Get<reg::SQ_PROGRAM_CNTL>().vs_num_reg),\n          host_vertex_shader_type));\n\n  modification.vertex.interpolator_mask = interpolator_mask;\n\n  auto pa_cl_clip_cntl = regs.Get<reg::PA_CL_CLIP_CNTL>();\n  uint32_t user_clip_planes =\n      pa_cl_clip_cntl.clip_disable ? 0 : pa_cl_clip_cntl.ucp_ena;\n  modification.vertex.user_clip_plane_count = xe::bit_count(user_clip_planes);\n  modification.vertex.user_clip_plane_cull =\n      uint32_t(user_clip_planes && pa_cl_clip_cntl.ucp_cull_only_ena);\n  modification.vertex.vertex_kill_and =\n      uint32_t((shader.writes_point_size_edge_flag_kill_vertex() & 0b100) &&\n               !pa_cl_clip_cntl.vtx_kill_or);\n\n  modification.vertex.output_point_size =\n      uint32_t((shader.writes_point_size_edge_flag_kill_vertex() & 0b001) &&\n               regs.Get<reg::VGT_DRAW_INITIATOR>().prim_type ==\n                   xenos::PrimitiveType::kPointList);\n\n  return modification;\n}\n\nDxbcShaderTranslator::Modification\nPipelineCache::GetCurrentPixelShaderModification(\n    const Shader& shader, uint32_t interpolator_mask, uint32_t param_gen_pos,\n    reg::RB_DEPTHCONTROL normalized_depth_control) const {\n  assert_true(shader.type() == xenos::ShaderType::kPixel);\n  assert_true(shader.is_ucode_analyzed());\n  const auto& regs = register_file_;\n\n  DxbcShaderTranslator::Modification modification(\n      shader_translator_->GetDefaultPixelShaderModification(\n          shader.GetDynamicAddressableRegisterCount(\n              regs.Get<reg::SQ_PROGRAM_CNTL>().ps_num_reg)));\n\n  modification.pixel.interpolator_mask = interpolator_mask;\n  modification.pixel.interpolators_centroid =\n      interpolator_mask &\n      ~xenos::GetInterpolatorSamplingPattern(\n          regs.Get<reg::RB_SURFACE_INFO>().msaa_samples,\n          regs.Get<reg::SQ_CONTEXT_MISC>().sc_sample_cntl,\n          regs.Get<reg::SQ_INTERPOLATOR_CNTL>().sampling_pattern);\n\n  if (param_gen_pos < xenos::kMaxInterpolators) {\n    modification.pixel.param_gen_enable = 1;\n    modification.pixel.param_gen_interpolator = param_gen_pos;\n    modification.pixel.param_gen_point =\n        uint32_t(regs.Get<reg::VGT_DRAW_INITIATOR>().prim_type ==\n                 xenos::PrimitiveType::kPointList);\n  } else {\n    modification.pixel.param_gen_enable = 0;\n    modification.pixel.param_gen_interpolator = 0;\n    modification.pixel.param_gen_point = 0;\n  }\n\n  if (render_target_cache_.GetPath() ==\n      RenderTargetCache::Path::kHostRenderTargets) {\n    using DepthStencilMode =\n        DxbcShaderTranslator::Modification::DepthStencilMode;\n    if (render_target_cache_.depth_float24_convert_in_pixel_shader() &&\n        normalized_depth_control.z_enable &&\n        regs.Get<reg::RB_DEPTH_INFO>().depth_format ==\n            xenos::DepthRenderTargetFormat::kD24FS8) {\n      modification.pixel.depth_stencil_mode =\n          render_target_cache_.depth_float24_round()\n              ? DepthStencilMode::kFloat24Rounding\n              : DepthStencilMode::kFloat24Truncating;\n    } else {\n      if (shader.implicit_early_z_write_allowed() &&\n          (!shader.writes_color_target(0) ||\n           !draw_util::DoesCoverageDependOnAlpha(\n               regs.Get<reg::RB_COLORCONTROL>()))) {\n        modification.pixel.depth_stencil_mode = DepthStencilMode::kEarlyHint;\n      } else {\n        modification.pixel.depth_stencil_mode = DepthStencilMode::kNoModifiers;\n      }\n    }\n  }\n\n  return modification;\n}\n\nbool PipelineCache::ConfigurePipeline(\n    D3D12Shader::D3D12Translation* vertex_shader,\n    D3D12Shader::D3D12Translation* pixel_shader,\n    const PrimitiveProcessor::ProcessingResult& primitive_processing_result,\n    reg::RB_DEPTHCONTROL normalized_depth_control,\n    uint32_t normalized_color_mask,\n    uint32_t bound_depth_and_color_render_target_bits,\n    const uint32_t* bound_depth_and_color_render_target_formats,\n    void** pipeline_handle_out, ID3D12RootSignature** root_signature_out) {\n#if XE_GPU_FINE_GRAINED_DRAW_SCOPES\n  SCOPE_profile_cpu_f(\"gpu\");\n#endif  // XE_GPU_FINE_GRAINED_DRAW_SCOPES\n\n  assert_not_null(pipeline_handle_out);\n  assert_not_null(root_signature_out);\n\n  // Ensure shaders are translated - needed now for GetCurrentStateDescription.\n  // Edge flags are not supported yet (because polygon primitives are not).\n  assert_true(register_file_.Get<reg::SQ_PROGRAM_CNTL>().vs_export_mode !=\n                  xenos::VertexShaderExportMode::kPosition2VectorsEdge &&\n              register_file_.Get<reg::SQ_PROGRAM_CNTL>().vs_export_mode !=\n                  xenos::VertexShaderExportMode::kPosition2VectorsEdgeKill);\n  assert_false(register_file_.Get<reg::SQ_PROGRAM_CNTL>().gen_index_vtx);\n  if (!vertex_shader->is_translated()) {\n    vertex_shader->shader().AnalyzeUcode(ucode_disasm_buffer_);\n    if (!TranslateAnalyzedShader(*shader_translator_, *vertex_shader,\n                                 dxbc_converter_, dxc_utils_, dxc_compiler_)) {\n      XELOGE(\"Failed to translate the vertex shader!\");\n      return false;\n    }\n    if (shader_storage_file_ && vertex_shader->shader().ucode_storage_index() !=\n                                    shader_storage_index_) {\n      vertex_shader->shader().set_ucode_storage_index(shader_storage_index_);\n      assert_not_null(storage_write_thread_);\n      shader_storage_file_flush_needed_ = true;\n      {\n        std::lock_guard<std::mutex> lock(storage_write_request_lock_);\n        storage_write_shader_queue_.push_back(&vertex_shader->shader());\n      }\n      storage_write_request_cond_.notify_all();\n    }\n  }\n  if (!vertex_shader->is_valid()) {\n    // Translation attempted previously, but not valid.\n    return false;\n  }\n  if (pixel_shader != nullptr) {\n    if (!pixel_shader->is_translated()) {\n      pixel_shader->shader().AnalyzeUcode(ucode_disasm_buffer_);\n      if (!TranslateAnalyzedShader(*shader_translator_, *pixel_shader,\n                                   dxbc_converter_, dxc_utils_,\n                                   dxc_compiler_)) {\n        XELOGE(\"Failed to translate the pixel shader!\");\n        return false;\n      }\n      if (shader_storage_file_ &&\n          pixel_shader->shader().ucode_storage_index() !=\n              shader_storage_index_) {\n        pixel_shader->shader().set_ucode_storage_index(shader_storage_index_);\n        assert_not_null(storage_write_thread_);\n        shader_storage_file_flush_needed_ = true;\n        {\n          std::lock_guard<std::mutex> lock(storage_write_request_lock_);\n          storage_write_shader_queue_.push_back(&pixel_shader->shader());\n        }\n        storage_write_request_cond_.notify_all();\n      }\n    }\n    if (!pixel_shader->is_valid()) {\n      // Translation attempted previously, but not valid.\n      return false;\n    }\n  }\n\n  PipelineRuntimeDescription runtime_description;\n  if (!GetCurrentStateDescription(\n          vertex_shader, pixel_shader, primitive_processing_result,\n          normalized_depth_control, normalized_color_mask,\n          bound_depth_and_color_render_target_bits,\n          bound_depth_and_color_render_target_formats, runtime_description)) {\n    return false;\n  }\n  PipelineDescription& description = runtime_description.description;\n\n  if (current_pipeline_ != nullptr &&\n      !std::memcmp(&current_pipeline_->description.description, &description,\n                   sizeof(description))) {\n    *pipeline_handle_out = current_pipeline_;\n    *root_signature_out = runtime_description.root_signature;\n    return true;\n  }\n\n  // Find an existing pipeline in the cache.\n  uint64_t hash = XXH3_64bits(&description, sizeof(description));\n  auto found_range = pipelines_.equal_range(hash);\n  for (auto it = found_range.first; it != found_range.second; ++it) {\n    Pipeline* found_pipeline = it->second;\n    if (!std::memcmp(&found_pipeline->description.description, &description,\n                     sizeof(description))) {\n      current_pipeline_ = found_pipeline;\n      *pipeline_handle_out = found_pipeline;\n      *root_signature_out = found_pipeline->description.root_signature;\n      return true;\n    }\n  }\n\n  Pipeline* new_pipeline = new Pipeline;\n  new_pipeline->state = nullptr;\n  std::memcpy(&new_pipeline->description, &runtime_description,\n              sizeof(runtime_description));\n  pipelines_.emplace(hash, new_pipeline);\n  COUNT_profile_set(\"gpu/pipeline_cache/pipelines\", pipelines_.size());\n\n  if (!creation_threads_.empty()) {\n    // Submit the pipeline for creation to any available thread.\n    {\n      std::lock_guard<std::mutex> lock(creation_request_lock_);\n      creation_queue_.push_back(new_pipeline);\n    }\n    creation_request_cond_.notify_one();\n  } else {\n    new_pipeline->state = CreateD3D12Pipeline(runtime_description);\n  }\n\n  if (pipeline_storage_file_) {\n    assert_not_null(storage_write_thread_);\n    pipeline_storage_file_flush_needed_ = true;\n    {\n      std::lock_guard<std::mutex> lock(storage_write_request_lock_);\n      storage_write_pipeline_queue_.emplace_back();\n      PipelineStoredDescription& stored_description =\n          storage_write_pipeline_queue_.back();\n      stored_description.description_hash = hash;\n      std::memcpy(&stored_description.description, &description,\n                  sizeof(description));\n    }\n    storage_write_request_cond_.notify_all();\n  }\n\n  current_pipeline_ = new_pipeline;\n  *pipeline_handle_out = new_pipeline;\n  *root_signature_out = runtime_description.root_signature;\n  return true;\n}\n\nbool PipelineCache::TranslateAnalyzedShader(\n    DxbcShaderTranslator& translator,\n    D3D12Shader::D3D12Translation& translation, IDxbcConverter* dxbc_converter,\n    IDxcUtils* dxc_utils, IDxcCompiler* dxc_compiler) {\n  D3D12Shader& shader = static_cast<D3D12Shader&>(translation.shader());\n\n  // Perform translation.\n  // If this fails the shader will be marked as invalid and ignored later.\n  if (!translator.TranslateAnalyzedShader(translation)) {\n    XELOGE(\"Shader {:016X} translation failed; marking as ignored\",\n           shader.ucode_data_hash());\n    return false;\n  }\n\n  const char* host_shader_type;\n  if (shader.type() == xenos::ShaderType::kVertex) {\n    DxbcShaderTranslator::Modification modification(translation.modification());\n    switch (modification.vertex.host_vertex_shader_type) {\n      case Shader::HostVertexShaderType::kLineDomainCPIndexed:\n        host_shader_type = \"control-point-indexed line domain\";\n        break;\n      case Shader::HostVertexShaderType::kLineDomainPatchIndexed:\n        host_shader_type = \"patch-indexed line domain\";\n        break;\n      case Shader::HostVertexShaderType::kTriangleDomainCPIndexed:\n        host_shader_type = \"control-point-indexed triangle domain\";\n        break;\n      case Shader::HostVertexShaderType::kTriangleDomainPatchIndexed:\n        host_shader_type = \"patch-indexed triangle domain\";\n        break;\n      case Shader::HostVertexShaderType::kQuadDomainCPIndexed:\n        host_shader_type = \"control-point-indexed quad domain\";\n        break;\n      case Shader::HostVertexShaderType::kQuadDomainPatchIndexed:\n        host_shader_type = \"patch-indexed quad domain\";\n        break;\n      default:\n        assert(modification.vertex.host_vertex_shader_type ==\n               Shader::HostVertexShaderType::kVertex);\n        host_shader_type = \"vertex\";\n    }\n  } else {\n    host_shader_type = \"pixel\";\n  }\n  XELOGGPU(\"Generated {} shader ({}b) - hash {:016X}:\\n{}\\n\", host_shader_type,\n           shader.ucode_dword_count() * sizeof(uint32_t),\n           shader.ucode_data_hash(), shader.ucode_disassembly().c_str());\n\n  // Set up texture and sampler binding layouts.\n  if (shader.EnterBindingLayoutUserUIDSetup()) {\n    const std::vector<D3D12Shader::TextureBinding>& texture_bindings =\n        shader.GetTextureBindingsAfterTranslation();\n    size_t texture_binding_count = texture_bindings.size();\n    const std::vector<D3D12Shader::SamplerBinding>& sampler_bindings =\n        shader.GetSamplerBindingsAfterTranslation();\n    size_t sampler_binding_count = sampler_bindings.size();\n    assert_false(bindless_resources_used_ &&\n                 texture_binding_count + sampler_binding_count >\n                     D3D12_REQ_CONSTANT_BUFFER_ELEMENT_COUNT * 4);\n    size_t texture_binding_layout_bytes =\n        texture_binding_count * sizeof(*texture_bindings.data());\n    uint64_t texture_binding_layout_hash = 0;\n    if (texture_binding_count) {\n      texture_binding_layout_hash =\n          XXH3_64bits(texture_bindings.data(), texture_binding_layout_bytes);\n    }\n    size_t bindless_sampler_count =\n        bindless_resources_used_ ? sampler_binding_count : 0;\n    uint64_t bindless_sampler_layout_hash = 0;\n    if (bindless_sampler_count) {\n      XXH3_state_t hash_state;\n      XXH3_64bits_reset(&hash_state);\n      for (size_t i = 0; i < bindless_sampler_count; ++i) {\n        XXH3_64bits_update(\n            &hash_state, &sampler_bindings[i].bindless_descriptor_index,\n            sizeof(sampler_bindings[i].bindless_descriptor_index));\n      }\n      bindless_sampler_layout_hash = XXH3_64bits_digest(&hash_state);\n    }\n    // Obtain the unique IDs of binding layouts if there are any texture\n    // bindings or bindless samplers, for invalidation in the command processor.\n    size_t texture_binding_layout_uid = kLayoutUIDEmpty;\n    // Use sampler count for the bindful case because it's the only thing that\n    // must be the same for layouts to be compatible in this case\n    // (instruction-specified parameters are used as overrides for actual\n    // samplers).\n    static_assert(\n        kLayoutUIDEmpty == 0,\n        \"Empty layout UID is assumed to be 0 because for bindful samplers, the \"\n        \"UID is their count\");\n    size_t sampler_binding_layout_uid =\n        bindless_resources_used_ ? kLayoutUIDEmpty : sampler_binding_count;\n    if (texture_binding_count || bindless_sampler_count) {\n      std::lock_guard<std::mutex> layouts_lock(layouts_mutex_);\n      if (texture_binding_count) {\n        auto found_range = texture_binding_layout_map_.equal_range(\n            texture_binding_layout_hash);\n        for (auto it = found_range.first; it != found_range.second; ++it) {\n          if (it->second.vector_span_length == texture_binding_count &&\n              !std::memcmp(texture_binding_layouts_.data() +\n                               it->second.vector_span_offset,\n                           texture_bindings.data(),\n                           texture_binding_layout_bytes)) {\n            texture_binding_layout_uid = it->second.uid;\n            break;\n          }\n        }\n        if (texture_binding_layout_uid == kLayoutUIDEmpty) {\n          static_assert(\n              kLayoutUIDEmpty == 0,\n              \"Layout UID is size + 1 because it's assumed that 0 is the UID \"\n              \"for an empty layout\");\n          texture_binding_layout_uid = texture_binding_layout_map_.size() + 1;\n          LayoutUID new_uid;\n          new_uid.uid = texture_binding_layout_uid;\n          new_uid.vector_span_offset = texture_binding_layouts_.size();\n          new_uid.vector_span_length = texture_binding_count;\n          texture_binding_layouts_.resize(new_uid.vector_span_offset +\n                                          texture_binding_count);\n          std::memcpy(\n              texture_binding_layouts_.data() + new_uid.vector_span_offset,\n              texture_bindings.data(), texture_binding_layout_bytes);\n          texture_binding_layout_map_.emplace(texture_binding_layout_hash,\n                                              new_uid);\n        }\n      }\n      if (bindless_sampler_count) {\n        auto found_range = bindless_sampler_layout_map_.equal_range(\n            sampler_binding_layout_uid);\n        for (auto it = found_range.first; it != found_range.second; ++it) {\n          if (it->second.vector_span_length != bindless_sampler_count) {\n            continue;\n          }\n          sampler_binding_layout_uid = it->second.uid;\n          const uint32_t* vector_bindless_sampler_layout =\n              bindless_sampler_layouts_.data() + it->second.vector_span_offset;\n          for (size_t i = 0; i < bindless_sampler_count; ++i) {\n            if (vector_bindless_sampler_layout[i] !=\n                sampler_bindings[i].bindless_descriptor_index) {\n              sampler_binding_layout_uid = kLayoutUIDEmpty;\n              break;\n            }\n          }\n          if (sampler_binding_layout_uid != kLayoutUIDEmpty) {\n            break;\n          }\n        }\n        if (sampler_binding_layout_uid == kLayoutUIDEmpty) {\n          sampler_binding_layout_uid = bindless_sampler_layout_map_.size();\n          LayoutUID new_uid;\n          static_assert(\n              kLayoutUIDEmpty == 0,\n              \"Layout UID is size + 1 because it's assumed that 0 is the UID \"\n              \"for an empty layout\");\n          new_uid.uid = sampler_binding_layout_uid + 1;\n          new_uid.vector_span_offset = bindless_sampler_layouts_.size();\n          new_uid.vector_span_length = sampler_binding_count;\n          bindless_sampler_layouts_.resize(new_uid.vector_span_offset +\n                                           sampler_binding_count);\n          uint32_t* vector_bindless_sampler_layout =\n              bindless_sampler_layouts_.data() + new_uid.vector_span_offset;\n          for (size_t i = 0; i < bindless_sampler_count; ++i) {\n            vector_bindless_sampler_layout[i] =\n                sampler_bindings[i].bindless_descriptor_index;\n          }\n          bindless_sampler_layout_map_.emplace(bindless_sampler_layout_hash,\n                                               new_uid);\n        }\n      }\n    }\n    shader.SetTextureBindingLayoutUserUID(texture_binding_layout_uid);\n    shader.SetSamplerBindingLayoutUserUID(sampler_binding_layout_uid);\n  }\n\n  // Disassemble the shader for dumping.\n  const ui::d3d12::D3D12Provider& provider =\n      command_processor_.GetD3D12Provider();\n  if (cvars::d3d12_dxbc_disasm_dxilconv) {\n    translation.DisassembleDxbcAndDxil(provider, cvars::d3d12_dxbc_disasm,\n                                       dxbc_converter, dxc_utils, dxc_compiler);\n  } else {\n    translation.DisassembleDxbcAndDxil(provider, cvars::d3d12_dxbc_disasm);\n  }\n\n  // Dump shader files if desired.\n  if (!cvars::dump_shaders.empty()) {\n    bool edram_rov_used = render_target_cache_.GetPath() ==\n                          RenderTargetCache::Path::kPixelShaderInterlock;\n    translation.Dump(cvars::dump_shaders,\n                     (shader.type() == xenos::ShaderType::kPixel)\n                         ? (edram_rov_used ? \"d3d12_rov\" : \"d3d12_rtv\")\n                         : \"d3d12\");\n  }\n\n  return translation.is_valid();\n}\n\nbool PipelineCache::GetCurrentStateDescription(\n    D3D12Shader::D3D12Translation* vertex_shader,\n    D3D12Shader::D3D12Translation* pixel_shader,\n    const PrimitiveProcessor::ProcessingResult& primitive_processing_result,\n    reg::RB_DEPTHCONTROL normalized_depth_control,\n    uint32_t normalized_color_mask,\n    uint32_t bound_depth_and_color_render_target_bits,\n    const uint32_t* bound_depth_and_color_render_target_formats,\n    PipelineRuntimeDescription& runtime_description_out) {\n  // Translated shaders needed at least for the root signature.\n  assert_true(vertex_shader->is_translated() && vertex_shader->is_valid());\n  assert_true(!pixel_shader ||\n              (pixel_shader->is_translated() && pixel_shader->is_valid()));\n\n  PipelineDescription& description_out = runtime_description_out.description;\n\n  const auto& regs = register_file_;\n  auto pa_su_sc_mode_cntl = regs.Get<reg::PA_SU_SC_MODE_CNTL>();\n\n  // Initialize all unused fields to zero for comparison/hashing.\n  std::memset(&runtime_description_out, 0, sizeof(runtime_description_out));\n\n  assert_true(DxbcShaderTranslator::Modification(vertex_shader->modification())\n                  .vertex.host_vertex_shader_type ==\n              primitive_processing_result.host_vertex_shader_type);\n  bool tessellated = primitive_processing_result.IsTessellated();\n  bool primitive_polygonal = draw_util::IsPrimitivePolygonal(regs);\n  bool rasterization_enabled =\n      draw_util::IsRasterizationPotentiallyDone(regs, primitive_polygonal);\n  // In Direct3D, rasterization (along with pixel counting) is disabled by\n  // disabling the pixel shader and depth / stencil. However, if rasterization\n  // should be disabled, the pixel shader must be disabled externally, to ensure\n  // things like texture binding layout is correct for the shader actually being\n  // used (don't replace anything here).\n  if (!rasterization_enabled) {\n    assert_null(pixel_shader);\n    if (pixel_shader) {\n      return false;\n    }\n  }\n\n  bool edram_rov_used = render_target_cache_.GetPath() ==\n                        RenderTargetCache::Path::kPixelShaderInterlock;\n\n  // Root signature.\n  runtime_description_out.root_signature = command_processor_.GetRootSignature(\n      static_cast<const DxbcShader*>(&vertex_shader->shader()),\n      pixel_shader ? static_cast<const DxbcShader*>(&pixel_shader->shader())\n                   : nullptr,\n      tessellated);\n  if (runtime_description_out.root_signature == nullptr) {\n    return false;\n  }\n\n  // Vertex shader.\n  runtime_description_out.vertex_shader = vertex_shader;\n  description_out.vertex_shader_hash =\n      vertex_shader->shader().ucode_data_hash();\n  description_out.vertex_shader_modification = vertex_shader->modification();\n\n  // Index buffer strip cut value.\n  if (primitive_processing_result.host_primitive_reset_enabled) {\n    description_out.strip_cut_index =\n        primitive_processing_result.host_index_format ==\n                xenos::IndexFormat::kInt16\n            ? PipelineStripCutIndex::kFFFF\n            : PipelineStripCutIndex::kFFFFFFFF;\n  } else {\n    description_out.strip_cut_index = PipelineStripCutIndex::kNone;\n  }\n\n  // Host vertex shader type and primitive topology.\n  if (tessellated) {\n    description_out.primitive_topology_type_or_tessellation_mode =\n        uint32_t(primitive_processing_result.tessellation_mode);\n  } else {\n    switch (primitive_processing_result.host_primitive_type) {\n      case xenos::PrimitiveType::kPointList:\n        description_out.primitive_topology_type_or_tessellation_mode =\n            uint32_t(PipelinePrimitiveTopologyType::kPoint);\n        break;\n      case xenos::PrimitiveType::kLineList:\n      case xenos::PrimitiveType::kLineStrip:\n      // Quads are emulated as line lists with adjacency.\n      case xenos::PrimitiveType::kQuadList:\n      case xenos::PrimitiveType::k2DLineStrip:\n        description_out.primitive_topology_type_or_tessellation_mode =\n            uint32_t(PipelinePrimitiveTopologyType::kLine);\n        break;\n      default:\n        description_out.primitive_topology_type_or_tessellation_mode =\n            uint32_t(PipelinePrimitiveTopologyType::kTriangle);\n        break;\n    }\n    switch (primitive_processing_result.host_primitive_type) {\n      case xenos::PrimitiveType::kPointList:\n        description_out.geometry_shader = PipelineGeometryShader::kPointList;\n        break;\n      case xenos::PrimitiveType::kRectangleList:\n        description_out.geometry_shader =\n            PipelineGeometryShader::kRectangleList;\n        break;\n      case xenos::PrimitiveType::kQuadList:\n        description_out.geometry_shader = PipelineGeometryShader::kQuadList;\n        break;\n      default:\n        description_out.geometry_shader = PipelineGeometryShader::kNone;\n        break;\n    }\n  }\n  GeometryShaderKey geometry_shader_key;\n  runtime_description_out.geometry_shader =\n      GetGeometryShaderKey(\n          description_out.geometry_shader,\n          DxbcShaderTranslator::Modification(vertex_shader->modification()),\n          DxbcShaderTranslator::Modification(\n              pixel_shader ? pixel_shader->modification() : 0),\n          geometry_shader_key)\n          ? &GetGeometryShader(geometry_shader_key)\n          : nullptr;\n\n  // The rest doesn't matter when rasterization is disabled (thus no writing to\n  // anywhere from post-geometry stages and no samples are counted).\n  if (!rasterization_enabled) {\n    description_out.cull_mode = PipelineCullMode::kDisableRasterization;\n    return true;\n  }\n\n  // Pixel shader.\n  if (pixel_shader) {\n    runtime_description_out.pixel_shader = pixel_shader;\n    description_out.pixel_shader_hash =\n        pixel_shader->shader().ucode_data_hash();\n    description_out.pixel_shader_modification = pixel_shader->modification();\n  }\n\n  // Rasterizer state.\n  // Because Direct3D 12 doesn't support per-side fill mode and depth bias, the\n  // values to use depends on the current culling state.\n  // If front faces are culled, use the ones for back faces.\n  // If back faces are culled, it's the other way around.\n  // If culling is not enabled, assume the developer wanted to draw things in a\n  // more special way - so if one side is wireframe or has a depth bias, then\n  // that's intentional (if both sides have a depth bias, the one for the front\n  // faces is used, though it's unlikely that they will ever be different -\n  // SetRenderState sets the same offset for both sides).\n  // Points fill mode (0) also isn't supported in Direct3D 12, but assume the\n  // developer didn't want to fill the whole primitive and use wireframe (like\n  // Xenos fill mode 1).\n  // Here we also assume that only one side is culled - if two sides are culled,\n  // rasterization will be disabled externally, or the draw call will be dropped\n  // early if the vertex shader doesn't export to memory.\n  bool cull_front, cull_back;\n  if (primitive_polygonal) {\n    description_out.front_counter_clockwise = pa_su_sc_mode_cntl.face == 0;\n    cull_front = pa_su_sc_mode_cntl.cull_front != 0;\n    cull_back = pa_su_sc_mode_cntl.cull_back != 0;\n    if (cull_front) {\n      // The case when both faces are culled should be handled by disabling\n      // rasterization.\n      assert_false(cull_back);\n      description_out.cull_mode = PipelineCullMode::kFront;\n    } else if (cull_back) {\n      description_out.cull_mode = PipelineCullMode::kBack;\n    } else {\n      description_out.cull_mode = PipelineCullMode::kNone;\n    }\n    // With ROV, the depth bias is applied in the pixel shader because\n    // per-sample depth is needed for MSAA.\n    if (!cull_front) {\n      // Front faces aren't culled.\n      // Direct3D 12, unfortunately, doesn't support point fill mode.\n      if (pa_su_sc_mode_cntl.polymode_front_ptype !=\n          xenos::PolygonType::kTriangles) {\n        description_out.fill_mode_wireframe = 1;\n      }\n    }\n    if (!cull_back) {\n      // Back faces aren't culled.\n      if (pa_su_sc_mode_cntl.polymode_back_ptype !=\n          xenos::PolygonType::kTriangles) {\n        description_out.fill_mode_wireframe = 1;\n      }\n    }\n    if (pa_su_sc_mode_cntl.poly_mode != xenos::PolygonModeEnable::kDualMode) {\n      description_out.fill_mode_wireframe = 0;\n    }\n  } else {\n    // Filled front faces only, without culling.\n    cull_front = false;\n    cull_back = false;\n  }\n  if (!edram_rov_used) {\n    float polygon_offset, polygon_offset_scale;\n    draw_util::GetPreferredFacePolygonOffset(\n        regs, primitive_polygonal, polygon_offset_scale, polygon_offset);\n    description_out.depth_bias = draw_util::GetD3D10IntegerPolygonOffset(\n        regs.Get<reg::RB_DEPTH_INFO>().depth_format, polygon_offset);\n    description_out.depth_bias_slope_scaled =\n        polygon_offset_scale * xenos::kPolygonOffsetScaleSubpixelUnit;\n  }\n  if (tessellated && cvars::d3d12_tessellation_wireframe) {\n    description_out.fill_mode_wireframe = 1;\n  }\n  description_out.depth_clip = !regs.Get<reg::PA_CL_CLIP_CNTL>().clip_disable;\n  bool depth_stencil_bound_and_used = false;\n  if (!edram_rov_used) {\n    // Depth/stencil. No stencil, always passing depth test and no depth writing\n    // means depth disabled.\n    if (bound_depth_and_color_render_target_bits & 1) {\n      if (normalized_depth_control.z_enable) {\n        description_out.depth_func = normalized_depth_control.zfunc;\n        description_out.depth_write = normalized_depth_control.z_write_enable;\n      } else {\n        description_out.depth_func = xenos::CompareFunction::kAlways;\n      }\n      if (normalized_depth_control.stencil_enable) {\n        description_out.stencil_enable = 1;\n        bool stencil_backface_enable =\n            primitive_polygonal && normalized_depth_control.backface_enable;\n        // Per-face masks not supported by Direct3D 12, choose the back face\n        // ones only if drawing only back faces.\n        Register stencil_ref_mask_reg;\n        if (stencil_backface_enable && cull_front) {\n          stencil_ref_mask_reg = XE_GPU_REG_RB_STENCILREFMASK_BF;\n        } else {\n          stencil_ref_mask_reg = XE_GPU_REG_RB_STENCILREFMASK;\n        }\n        auto stencil_ref_mask =\n            regs.Get<reg::RB_STENCILREFMASK>(stencil_ref_mask_reg);\n        description_out.stencil_read_mask = stencil_ref_mask.stencilmask;\n        description_out.stencil_write_mask = stencil_ref_mask.stencilwritemask;\n        description_out.stencil_front_fail_op =\n            normalized_depth_control.stencilfail;\n        description_out.stencil_front_depth_fail_op =\n            normalized_depth_control.stencilzfail;\n        description_out.stencil_front_pass_op =\n            normalized_depth_control.stencilzpass;\n        description_out.stencil_front_func =\n            normalized_depth_control.stencilfunc;\n        if (stencil_backface_enable) {\n          description_out.stencil_back_fail_op =\n              normalized_depth_control.stencilfail_bf;\n          description_out.stencil_back_depth_fail_op =\n              normalized_depth_control.stencilzfail_bf;\n          description_out.stencil_back_pass_op =\n              normalized_depth_control.stencilzpass_bf;\n          description_out.stencil_back_func =\n              normalized_depth_control.stencilfunc_bf;\n        } else {\n          description_out.stencil_back_fail_op =\n              description_out.stencil_front_fail_op;\n          description_out.stencil_back_depth_fail_op =\n              description_out.stencil_front_depth_fail_op;\n          description_out.stencil_back_pass_op =\n              description_out.stencil_front_pass_op;\n          description_out.stencil_back_func =\n              description_out.stencil_front_func;\n        }\n      }\n      // If not binding the DSV, ignore the format in the hash.\n      if (description_out.depth_func != xenos::CompareFunction::kAlways ||\n          description_out.depth_write || description_out.stencil_enable) {\n        description_out.depth_format = xenos::DepthRenderTargetFormat(\n            bound_depth_and_color_render_target_formats[0]);\n        depth_stencil_bound_and_used = true;\n      }\n    } else {\n      description_out.depth_func = xenos::CompareFunction::kAlways;\n    }\n\n    // Render targets and blending state. 32 because of 0x1F mask, for safety\n    // (all unknown to zero).\n    static const PipelineBlendFactor kBlendFactorMap[32] = {\n        /*  0 */ PipelineBlendFactor::kZero,\n        /*  1 */ PipelineBlendFactor::kOne,\n        /*  2 */ PipelineBlendFactor::kZero,  // ?\n        /*  3 */ PipelineBlendFactor::kZero,  // ?\n        /*  4 */ PipelineBlendFactor::kSrcColor,\n        /*  5 */ PipelineBlendFactor::kInvSrcColor,\n        /*  6 */ PipelineBlendFactor::kSrcAlpha,\n        /*  7 */ PipelineBlendFactor::kInvSrcAlpha,\n        /*  8 */ PipelineBlendFactor::kDestColor,\n        /*  9 */ PipelineBlendFactor::kInvDestColor,\n        /* 10 */ PipelineBlendFactor::kDestAlpha,\n        /* 11 */ PipelineBlendFactor::kInvDestAlpha,\n        // CONSTANT_COLOR\n        /* 12 */ PipelineBlendFactor::kBlendFactor,\n        // ONE_MINUS_CONSTANT_COLOR\n        /* 13 */ PipelineBlendFactor::kInvBlendFactor,\n        // CONSTANT_ALPHA\n        /* 14 */ PipelineBlendFactor::kBlendFactor,\n        // ONE_MINUS_CONSTANT_ALPHA\n        /* 15 */ PipelineBlendFactor::kInvBlendFactor,\n        /* 16 */ PipelineBlendFactor::kSrcAlphaSat,\n    };\n    // Like kBlendFactorMap, but with color modes changed to alpha. Some\n    // pipelines aren't created in 545407E0 because a color mode is used for\n    // alpha.\n    static const PipelineBlendFactor kBlendFactorAlphaMap[32] = {\n        /*  0 */ PipelineBlendFactor::kZero,\n        /*  1 */ PipelineBlendFactor::kOne,\n        /*  2 */ PipelineBlendFactor::kZero,  // ?\n        /*  3 */ PipelineBlendFactor::kZero,  // ?\n        /*  4 */ PipelineBlendFactor::kSrcAlpha,\n        /*  5 */ PipelineBlendFactor::kInvSrcAlpha,\n        /*  6 */ PipelineBlendFactor::kSrcAlpha,\n        /*  7 */ PipelineBlendFactor::kInvSrcAlpha,\n        /*  8 */ PipelineBlendFactor::kDestAlpha,\n        /*  9 */ PipelineBlendFactor::kInvDestAlpha,\n        /* 10 */ PipelineBlendFactor::kDestAlpha,\n        /* 11 */ PipelineBlendFactor::kInvDestAlpha,\n        /* 12 */ PipelineBlendFactor::kBlendFactor,\n        // ONE_MINUS_CONSTANT_COLOR\n        /* 13 */ PipelineBlendFactor::kInvBlendFactor,\n        // CONSTANT_ALPHA\n        /* 14 */ PipelineBlendFactor::kBlendFactor,\n        // ONE_MINUS_CONSTANT_ALPHA\n        /* 15 */ PipelineBlendFactor::kInvBlendFactor,\n        /* 16 */ PipelineBlendFactor::kSrcAlphaSat,\n    };\n    // While it's okay to specify fewer render targets in the pipeline state\n    // (even fewer than written by the shader) than actually bound to the\n    // command list (though this kind of truncation may only happen at the end -\n    // DXGI_FORMAT_UNKNOWN *requires* a null RTV descriptor to be bound), not\n    // doing that because sample counts of all render targets bound via\n    // OMSetRenderTargets, even those beyond NumRenderTargets, apparently must\n    // have their sample count matching the one set in the pipeline - however if\n    // we set NumRenderTargets to 0 and also disable depth / stencil, the sample\n    // count must be set to 1 - while the command list may still have\n    // multisampled render targets bound (happens in 4D5307E6 main menu).\n    // TODO(Triang3l): Investigate interaction of OMSetRenderTargets with\n    // non-null depth and DSVFormat DXGI_FORMAT_UNKNOWN in the same case.\n    for (uint32_t i = 0; i < 4; ++i) {\n      if (!(bound_depth_and_color_render_target_bits &\n            (uint32_t(1) << (1 + i)))) {\n        continue;\n      }\n      PipelineRenderTarget& rt = description_out.render_targets[i];\n      rt.used = 1;\n      auto color_info = regs.Get<reg::RB_COLOR_INFO>(\n          reg::RB_COLOR_INFO::rt_register_indices[i]);\n      rt.format = xenos::ColorRenderTargetFormat(\n          bound_depth_and_color_render_target_formats[1 + i]);\n      rt.write_mask = (normalized_color_mask >> (i * 4)) & 0xF;\n      if (rt.write_mask) {\n        auto blendcontrol = regs.Get<reg::RB_BLENDCONTROL>(\n            reg::RB_BLENDCONTROL::rt_register_indices[i]);\n        rt.src_blend = kBlendFactorMap[uint32_t(blendcontrol.color_srcblend)];\n        rt.dest_blend = kBlendFactorMap[uint32_t(blendcontrol.color_destblend)];\n        rt.blend_op = blendcontrol.color_comb_fcn;\n        rt.src_blend_alpha =\n            kBlendFactorAlphaMap[uint32_t(blendcontrol.alpha_srcblend)];\n        rt.dest_blend_alpha =\n            kBlendFactorAlphaMap[uint32_t(blendcontrol.alpha_destblend)];\n        rt.blend_op_alpha = blendcontrol.alpha_comb_fcn;\n      } else {\n        rt.src_blend = PipelineBlendFactor::kOne;\n        rt.dest_blend = PipelineBlendFactor::kZero;\n        rt.blend_op = xenos::BlendOp::kAdd;\n        rt.src_blend_alpha = PipelineBlendFactor::kOne;\n        rt.dest_blend_alpha = PipelineBlendFactor::kZero;\n        rt.blend_op_alpha = xenos::BlendOp::kAdd;\n      }\n    }\n  }\n  xenos::MsaaSamples host_msaa_samples =\n      regs.Get<reg::RB_SURFACE_INFO>().msaa_samples;\n  if (edram_rov_used) {\n    if (host_msaa_samples == xenos::MsaaSamples::k2X) {\n      // 2 is not supported in ForcedSampleCount on Nvidia.\n      host_msaa_samples = xenos::MsaaSamples::k4X;\n    }\n  } else {\n    if (!(bound_depth_and_color_render_target_bits & ~uint32_t(1)) &&\n        !depth_stencil_bound_and_used) {\n      // Direct3D 12 requires the sample count to be 1 when no color or depth /\n      // stencil render targets are bound.\n      // FIXME(Triang3l): Use ForcedSampleCount or some other fallback for\n      // sample counting when needed, though with 2x it will be as incorrect as\n      // with 1x / 4x anyway; or bind a dummy depth / stencil buffer if really\n      // needed.\n      host_msaa_samples = xenos::MsaaSamples::k1X;\n    }\n    // TODO(Triang3l): 4x MSAA fallback when 2x isn't supported.\n  }\n  description_out.host_msaa_samples = host_msaa_samples;\n\n  return true;\n}\n\nbool PipelineCache::GetGeometryShaderKey(\n    PipelineGeometryShader geometry_shader_type,\n    DxbcShaderTranslator::Modification vertex_shader_modification,\n    DxbcShaderTranslator::Modification pixel_shader_modification,\n    GeometryShaderKey& key_out) {\n  if (geometry_shader_type == PipelineGeometryShader::kNone) {\n    return false;\n  }\n  assert_true(vertex_shader_modification.vertex.interpolator_mask ==\n              pixel_shader_modification.pixel.interpolator_mask);\n  GeometryShaderKey key;\n  key.type = geometry_shader_type;\n  key.interpolator_count =\n      xe::bit_count(vertex_shader_modification.vertex.interpolator_mask);\n  key.user_clip_plane_count =\n      vertex_shader_modification.vertex.user_clip_plane_count;\n  key.user_clip_plane_cull =\n      vertex_shader_modification.vertex.user_clip_plane_cull;\n  key.has_vertex_kill_and = vertex_shader_modification.vertex.vertex_kill_and;\n  key.has_point_size = vertex_shader_modification.vertex.output_point_size;\n  key.has_point_coordinates = pixel_shader_modification.pixel.param_gen_point;\n  key_out = key;\n  return true;\n}\n\nvoid PipelineCache::CreateDxbcGeometryShader(\n    GeometryShaderKey key, std::vector<uint32_t>& shader_out) {\n  shader_out.clear();\n\n  // RDEF, ISGN, OSG5, SHEX, STAT.\n  constexpr uint32_t kBlobCount = 5;\n\n  // Allocate space for the container header and the blob offsets.\n  shader_out.resize(sizeof(dxbc::ContainerHeader) / sizeof(uint32_t) +\n                    kBlobCount);\n  uint32_t blob_offset_position_dwords =\n      sizeof(dxbc::ContainerHeader) / sizeof(uint32_t);\n  uint32_t blob_position_dwords = uint32_t(shader_out.size());\n  constexpr uint32_t kBlobHeaderSizeDwords =\n      sizeof(dxbc::BlobHeader) / sizeof(uint32_t);\n\n  uint32_t name_ptr;\n\n  // ***************************************************************************\n  // Resource definition\n  // ***************************************************************************\n\n  shader_out[blob_offset_position_dwords] =\n      uint32_t(blob_position_dwords * sizeof(uint32_t));\n  uint32_t rdef_position_dwords = blob_position_dwords + kBlobHeaderSizeDwords;\n  // Not needed, as the next operation done is resize, to allocate the space for\n  // both the blob header and the resource definition header.\n  // shader_out.resize(rdef_position_dwords);\n\n  // RDEF header - the actual definitions will be written if needed.\n  shader_out.resize(rdef_position_dwords +\n                    sizeof(dxbc::RdefHeader) / sizeof(uint32_t));\n  // Generator name.\n  dxbc::AppendAlignedString(shader_out, \"Xenia\");\n  {\n    auto& rdef_header = *reinterpret_cast<dxbc::RdefHeader*>(\n        shader_out.data() + rdef_position_dwords);\n    rdef_header.shader_model = dxbc::RdefShaderModel::kGeometryShader5_1;\n    rdef_header.compile_flags =\n        dxbc::kCompileFlagNoPreshader | dxbc::kCompileFlagPreferFlowControl |\n        dxbc::kCompileFlagIeeeStrictness | dxbc::kCompileFlagAllResourcesBound;\n    // Generator name is right after the header.\n    rdef_header.generator_name_ptr = sizeof(dxbc::RdefHeader);\n    rdef_header.fourcc = dxbc::RdefHeader::FourCC::k5_1;\n    rdef_header.InitializeSizes();\n  }\n\n  uint32_t system_cbuffer_size_vector_aligned_bytes = 0;\n\n  if (key.type == PipelineGeometryShader::kPointList) {\n    // Need point parameters from the system constants.\n\n    // Constant types - float2 only.\n    // Names.\n    name_ptr =\n        uint32_t((shader_out.size() - rdef_position_dwords) * sizeof(uint32_t));\n    uint32_t rdef_name_ptr_float2 = name_ptr;\n    name_ptr += dxbc::AppendAlignedString(shader_out, \"float2\");\n    // Types.\n    uint32_t rdef_type_float2_position_dwords = uint32_t(shader_out.size());\n    uint32_t rdef_type_float2_ptr =\n        uint32_t((rdef_type_float2_position_dwords - rdef_position_dwords) *\n                 sizeof(uint32_t));\n    shader_out.resize(rdef_type_float2_position_dwords +\n                      sizeof(dxbc::RdefType) / sizeof(uint32_t));\n    {\n      auto& rdef_type_float2 = *reinterpret_cast<dxbc::RdefType*>(\n          shader_out.data() + rdef_type_float2_position_dwords);\n      rdef_type_float2.variable_class = dxbc::RdefVariableClass::kVector;\n      rdef_type_float2.variable_type = dxbc::RdefVariableType::kFloat;\n      rdef_type_float2.row_count = 1;\n      rdef_type_float2.column_count = 2;\n      rdef_type_float2.name_ptr = rdef_name_ptr_float2;\n    }\n\n    // Constants:\n    // - float2 xe_point_constant_diameter\n    // - float2 xe_point_screen_diameter_to_ndc_radius\n    enum PointConstant : uint32_t {\n      kPointConstantConstantDiameter,\n      kPointConstantScreenDiameterToNDCRadius,\n      kPointConstantCount,\n    };\n    // Names.\n    name_ptr =\n        uint32_t((shader_out.size() - rdef_position_dwords) * sizeof(uint32_t));\n    uint32_t rdef_name_ptr_xe_point_constant_diameter = name_ptr;\n    name_ptr +=\n        dxbc::AppendAlignedString(shader_out, \"xe_point_constant_diameter\");\n    uint32_t rdef_name_ptr_xe_point_screen_diameter_to_ndc_radius = name_ptr;\n    name_ptr += dxbc::AppendAlignedString(\n        shader_out, \"xe_point_screen_diameter_to_ndc_radius\");\n    // Constants.\n    uint32_t rdef_constants_position_dwords = uint32_t(shader_out.size());\n    uint32_t rdef_constants_ptr =\n        uint32_t((rdef_constants_position_dwords - rdef_position_dwords) *\n                 sizeof(uint32_t));\n    shader_out.resize(rdef_constants_position_dwords +\n                      sizeof(dxbc::RdefVariable) / sizeof(uint32_t) *\n                          kPointConstantCount);\n    {\n      auto rdef_constants = reinterpret_cast<dxbc::RdefVariable*>(\n          shader_out.data() + rdef_constants_position_dwords);\n      // float2 xe_point_constant_diameter\n      static_assert(\n          sizeof(DxbcShaderTranslator::SystemConstants ::\n                     point_constant_diameter) == sizeof(float) * 2,\n          \"DxbcShaderTranslator point_constant_diameter system constant size \"\n          \"differs between the shader translator and geometry shader \"\n          \"generation\");\n      static_assert_size(\n          DxbcShaderTranslator::SystemConstants::point_constant_diameter,\n          sizeof(float) * 2);\n      dxbc::RdefVariable& rdef_constant_point_constant_diameter =\n          rdef_constants[kPointConstantConstantDiameter];\n      rdef_constant_point_constant_diameter.name_ptr =\n          rdef_name_ptr_xe_point_constant_diameter;\n      rdef_constant_point_constant_diameter.start_offset_bytes = offsetof(\n          DxbcShaderTranslator::SystemConstants, point_constant_diameter);\n      rdef_constant_point_constant_diameter.size_bytes = sizeof(float) * 2;\n      rdef_constant_point_constant_diameter.flags = dxbc::kRdefVariableFlagUsed;\n      rdef_constant_point_constant_diameter.type_ptr = rdef_type_float2_ptr;\n      rdef_constant_point_constant_diameter.start_texture = UINT32_MAX;\n      rdef_constant_point_constant_diameter.start_sampler = UINT32_MAX;\n      // float2 xe_point_screen_diameter_to_ndc_radius\n      static_assert(\n          sizeof(DxbcShaderTranslator::SystemConstants ::\n                     point_screen_diameter_to_ndc_radius) == sizeof(float) * 2,\n          \"DxbcShaderTranslator point_screen_diameter_to_ndc_radius system \"\n          \"constant size differs between the shader translator and geometry \"\n          \"shader generation\");\n      dxbc::RdefVariable& rdef_constant_point_screen_diameter_to_ndc_radius =\n          rdef_constants[kPointConstantScreenDiameterToNDCRadius];\n      rdef_constant_point_screen_diameter_to_ndc_radius.name_ptr =\n          rdef_name_ptr_xe_point_screen_diameter_to_ndc_radius;\n      rdef_constant_point_screen_diameter_to_ndc_radius.start_offset_bytes =\n          offsetof(DxbcShaderTranslator::SystemConstants,\n                   point_screen_diameter_to_ndc_radius);\n      rdef_constant_point_screen_diameter_to_ndc_radius.size_bytes =\n          sizeof(float) * 2;\n      rdef_constant_point_screen_diameter_to_ndc_radius.flags =\n          dxbc::kRdefVariableFlagUsed;\n      rdef_constant_point_screen_diameter_to_ndc_radius.type_ptr =\n          rdef_type_float2_ptr;\n      rdef_constant_point_screen_diameter_to_ndc_radius.start_texture =\n          UINT32_MAX;\n      rdef_constant_point_screen_diameter_to_ndc_radius.start_sampler =\n          UINT32_MAX;\n    }\n\n    // Constant buffers - xe_system_cbuffer only.\n\n    // Names.\n    name_ptr =\n        uint32_t((shader_out.size() - rdef_position_dwords) * sizeof(uint32_t));\n    uint32_t rdef_name_ptr_xe_system_cbuffer = name_ptr;\n    name_ptr += dxbc::AppendAlignedString(shader_out, \"xe_system_cbuffer\");\n    // Constant buffers.\n    uint32_t rdef_cbuffer_position_dwords = uint32_t(shader_out.size());\n    shader_out.resize(rdef_cbuffer_position_dwords +\n                      sizeof(dxbc::RdefCbuffer) / sizeof(uint32_t));\n    {\n      auto& rdef_cbuffer_system = *reinterpret_cast<dxbc::RdefCbuffer*>(\n          shader_out.data() + rdef_cbuffer_position_dwords);\n      rdef_cbuffer_system.name_ptr = rdef_name_ptr_xe_system_cbuffer;\n      rdef_cbuffer_system.variable_count = kPointConstantCount;\n      rdef_cbuffer_system.variables_ptr = rdef_constants_ptr;\n      auto rdef_constants = reinterpret_cast<const dxbc::RdefVariable*>(\n          shader_out.data() + rdef_constants_position_dwords);\n      for (uint32_t i = 0; i < kPointConstantCount; ++i) {\n        system_cbuffer_size_vector_aligned_bytes =\n            std::max(system_cbuffer_size_vector_aligned_bytes,\n                     rdef_constants[i].start_offset_bytes +\n                         rdef_constants[i].size_bytes);\n      }\n      system_cbuffer_size_vector_aligned_bytes =\n          xe::align(system_cbuffer_size_vector_aligned_bytes,\n                    uint32_t(sizeof(uint32_t) * 4));\n      rdef_cbuffer_system.size_vector_aligned_bytes =\n          system_cbuffer_size_vector_aligned_bytes;\n    }\n\n    // Bindings - xe_system_cbuffer only.\n    uint32_t rdef_binding_position_dwords = uint32_t(shader_out.size());\n    shader_out.resize(rdef_binding_position_dwords +\n                      sizeof(dxbc::RdefInputBind) / sizeof(uint32_t));\n    {\n      auto& rdef_binding_cbuffer_system =\n          *reinterpret_cast<dxbc::RdefInputBind*>(shader_out.data() +\n                                                  rdef_binding_position_dwords);\n      rdef_binding_cbuffer_system.name_ptr = rdef_name_ptr_xe_system_cbuffer;\n      rdef_binding_cbuffer_system.type = dxbc::RdefInputType::kCbuffer;\n      rdef_binding_cbuffer_system.bind_point =\n          uint32_t(DxbcShaderTranslator::CbufferRegister::kSystemConstants);\n      rdef_binding_cbuffer_system.bind_count = 1;\n      rdef_binding_cbuffer_system.flags = dxbc::kRdefInputFlagUserPacked;\n    }\n\n    // Pointers in the header.\n    {\n      auto& rdef_header = *reinterpret_cast<dxbc::RdefHeader*>(\n          shader_out.data() + rdef_position_dwords);\n      rdef_header.cbuffer_count = 1;\n      rdef_header.cbuffers_ptr =\n          uint32_t((rdef_cbuffer_position_dwords - rdef_position_dwords) *\n                   sizeof(uint32_t));\n      rdef_header.input_bind_count = 1;\n      rdef_header.input_binds_ptr =\n          uint32_t((rdef_binding_position_dwords - rdef_position_dwords) *\n                   sizeof(uint32_t));\n    }\n  }\n\n  {\n    auto& blob_header = *reinterpret_cast<dxbc::BlobHeader*>(\n        shader_out.data() + blob_position_dwords);\n    blob_header.fourcc = dxbc::BlobHeader::FourCC::kResourceDefinition;\n    blob_position_dwords = uint32_t(shader_out.size());\n    blob_header.size_bytes =\n        (blob_position_dwords - kBlobHeaderSizeDwords) * sizeof(uint32_t) -\n        shader_out[blob_offset_position_dwords++];\n  }\n\n  // ***************************************************************************\n  // Input signature\n  // ***************************************************************************\n\n  // Clip and cull distances are tightly packed together into registers, but\n  // have separate signature parameters with each being a vec4-aligned window.\n  uint32_t input_clip_distance_count =\n      key.user_clip_plane_cull ? 0 : key.user_clip_plane_count;\n  uint32_t input_cull_distance_count =\n      (key.user_clip_plane_cull ? key.user_clip_plane_count : 0) +\n      key.has_vertex_kill_and;\n  uint32_t input_clip_and_cull_distance_count =\n      input_clip_distance_count + input_cull_distance_count;\n\n  // Interpolators, position, clip and cull distances (parameters containing\n  // only clip or cull distances, and also one parameter containing both if\n  // present), point size.\n  uint32_t isgn_parameter_count =\n      key.interpolator_count + 1 +\n      ((input_clip_and_cull_distance_count + 3) / 4) +\n      uint32_t(input_cull_distance_count &&\n               (input_clip_distance_count & 3) != 0) +\n      key.has_point_size;\n\n  // Reserve space for the header and the parameters.\n  shader_out[blob_offset_position_dwords] =\n      uint32_t(blob_position_dwords * sizeof(uint32_t));\n  uint32_t isgn_position_dwords = blob_position_dwords + kBlobHeaderSizeDwords;\n  shader_out.resize(isgn_position_dwords +\n                    sizeof(dxbc::Signature) / sizeof(uint32_t) +\n                    sizeof(dxbc::SignatureParameter) / sizeof(uint32_t) *\n                        isgn_parameter_count);\n\n  // Names (after the parameters).\n  name_ptr =\n      uint32_t((shader_out.size() - isgn_position_dwords) * sizeof(uint32_t));\n  uint32_t isgn_name_ptr_texcoord = name_ptr;\n  if (key.interpolator_count) {\n    name_ptr += dxbc::AppendAlignedString(shader_out, \"TEXCOORD\");\n  }\n  uint32_t isgn_name_ptr_sv_position = name_ptr;\n  name_ptr += dxbc::AppendAlignedString(shader_out, \"SV_Position\");\n  uint32_t isgn_name_ptr_sv_clip_distance = name_ptr;\n  if (input_clip_distance_count) {\n    name_ptr += dxbc::AppendAlignedString(shader_out, \"SV_ClipDistance\");\n  }\n  uint32_t isgn_name_ptr_sv_cull_distance = name_ptr;\n  if (input_cull_distance_count) {\n    name_ptr += dxbc::AppendAlignedString(shader_out, \"SV_CullDistance\");\n  }\n  uint32_t isgn_name_ptr_xepsize = name_ptr;\n  if (key.has_point_size) {\n    name_ptr += dxbc::AppendAlignedString(shader_out, \"XEPSIZE\");\n  }\n\n  // Header and parameters.\n  uint32_t input_register_interpolators = UINT32_MAX;\n  uint32_t input_register_position;\n  uint32_t input_register_clip_and_cull_distances = UINT32_MAX;\n  uint32_t input_register_point_size = UINT32_MAX;\n  {\n    // Header.\n    auto& isgn_header = *reinterpret_cast<dxbc::Signature*>(\n        shader_out.data() + isgn_position_dwords);\n    isgn_header.parameter_count = isgn_parameter_count;\n    isgn_header.parameter_info_ptr = sizeof(dxbc::Signature);\n\n    // Parameters.\n    auto isgn_parameters = reinterpret_cast<dxbc::SignatureParameter*>(\n        shader_out.data() + isgn_position_dwords +\n        sizeof(dxbc::Signature) / sizeof(uint32_t));\n    uint32_t isgn_parameter_index = 0;\n    uint32_t input_register_index = 0;\n\n    // Interpolators (TEXCOORD#).\n    if (key.interpolator_count) {\n      input_register_interpolators = input_register_index;\n      for (uint32_t i = 0; i < key.interpolator_count; ++i) {\n        assert_true(isgn_parameter_index < isgn_parameter_count);\n        dxbc::SignatureParameter& isgn_interpolator =\n            isgn_parameters[isgn_parameter_index++];\n        isgn_interpolator.semantic_name_ptr = isgn_name_ptr_texcoord;\n        isgn_interpolator.semantic_index = i;\n        isgn_interpolator.component_type =\n            dxbc::SignatureRegisterComponentType::kFloat32;\n        isgn_interpolator.register_index = input_register_index++;\n        isgn_interpolator.mask = 0b1111;\n        isgn_interpolator.always_reads_mask = 0b1111;\n      }\n    }\n\n    // Position (SV_Position).\n    input_register_position = input_register_index;\n    assert_true(isgn_parameter_index < isgn_parameter_count);\n    dxbc::SignatureParameter& isgn_sv_position =\n        isgn_parameters[isgn_parameter_index++];\n    isgn_sv_position.semantic_name_ptr = isgn_name_ptr_sv_position;\n    isgn_sv_position.system_value = dxbc::Name::kPosition;\n    isgn_sv_position.component_type =\n        dxbc::SignatureRegisterComponentType::kFloat32;\n    isgn_sv_position.register_index = input_register_index++;\n    isgn_sv_position.mask = 0b1111;\n    isgn_sv_position.always_reads_mask = 0b1111;\n\n    // Clip and cull distances (SV_ClipDistance#, SV_CullDistance#).\n    if (input_clip_and_cull_distance_count) {\n      input_register_clip_and_cull_distances = input_register_index;\n      uint32_t isgn_cull_distance_semantic_index = 0;\n      for (uint32_t i = 0; i < input_clip_and_cull_distance_count; i += 4) {\n        if (i < input_clip_distance_count) {\n          dxbc::SignatureParameter& isgn_sv_clip_distance =\n              isgn_parameters[isgn_parameter_index++];\n          isgn_sv_clip_distance.semantic_name_ptr =\n              isgn_name_ptr_sv_clip_distance;\n          isgn_sv_clip_distance.semantic_index = i / 4;\n          isgn_sv_clip_distance.system_value = dxbc::Name::kClipDistance;\n          isgn_sv_clip_distance.component_type =\n              dxbc::SignatureRegisterComponentType::kFloat32;\n          isgn_sv_clip_distance.register_index = input_register_index;\n          uint8_t isgn_sv_clip_distance_mask =\n              (UINT8_C(1) << std::min(input_clip_distance_count - i,\n                                      UINT32_C(4))) -\n              1;\n          isgn_sv_clip_distance.mask = isgn_sv_clip_distance_mask;\n          isgn_sv_clip_distance.always_reads_mask = isgn_sv_clip_distance_mask;\n        }\n        if (input_cull_distance_count && i + 4 > input_clip_distance_count) {\n          dxbc::SignatureParameter& isgn_sv_cull_distance =\n              isgn_parameters[isgn_parameter_index++];\n          isgn_sv_cull_distance.semantic_name_ptr =\n              isgn_name_ptr_sv_cull_distance;\n          isgn_sv_cull_distance.semantic_index =\n              isgn_cull_distance_semantic_index++;\n          isgn_sv_cull_distance.system_value = dxbc::Name::kCullDistance;\n          isgn_sv_cull_distance.component_type =\n              dxbc::SignatureRegisterComponentType::kFloat32;\n          isgn_sv_cull_distance.register_index = input_register_index;\n          uint8_t isgn_sv_cull_distance_mask =\n              (UINT8_C(1) << std::min(input_clip_and_cull_distance_count - i,\n                                      UINT32_C(4))) -\n              1;\n          if (i < input_clip_distance_count) {\n            isgn_sv_cull_distance_mask &=\n                ~((UINT8_C(1) << (input_clip_distance_count - i)) - 1);\n          }\n          isgn_sv_cull_distance.mask = isgn_sv_cull_distance_mask;\n          isgn_sv_cull_distance.always_reads_mask = isgn_sv_cull_distance_mask;\n        }\n        ++input_register_index;\n      }\n    }\n\n    // Point size (XEPSIZE).\n    if (key.has_point_size) {\n      input_register_point_size = input_register_index;\n      assert_true(isgn_parameter_index < isgn_parameter_count);\n      dxbc::SignatureParameter& isgn_point_size =\n          isgn_parameters[isgn_parameter_index++];\n      isgn_point_size.semantic_name_ptr = isgn_name_ptr_xepsize;\n      isgn_point_size.component_type =\n          dxbc::SignatureRegisterComponentType::kFloat32;\n      isgn_point_size.register_index = input_register_index++;\n      isgn_point_size.mask = 0b0001;\n      isgn_point_size.always_reads_mask =\n          key.type == PipelineGeometryShader::kPointList ? 0b0001 : 0;\n    }\n\n    assert_true(isgn_parameter_index == isgn_parameter_count);\n  }\n\n  {\n    auto& blob_header = *reinterpret_cast<dxbc::BlobHeader*>(\n        shader_out.data() + blob_position_dwords);\n    blob_header.fourcc = dxbc::BlobHeader::FourCC::kInputSignature;\n    blob_position_dwords = uint32_t(shader_out.size());\n    blob_header.size_bytes =\n        (blob_position_dwords - kBlobHeaderSizeDwords) * sizeof(uint32_t) -\n        shader_out[blob_offset_position_dwords++];\n  }\n\n  // ***************************************************************************\n  // Output signature\n  // ***************************************************************************\n\n  // Interpolators, point coordinates, position, clip distances.\n  uint32_t osgn_parameter_count = key.interpolator_count +\n                                  key.has_point_coordinates + 1 +\n                                  ((input_clip_distance_count + 3) / 4);\n\n  // Reserve space for the header and the parameters.\n  shader_out[blob_offset_position_dwords] =\n      uint32_t(blob_position_dwords * sizeof(uint32_t));\n  uint32_t osgn_position_dwords = blob_position_dwords + kBlobHeaderSizeDwords;\n  shader_out.resize(osgn_position_dwords +\n                    sizeof(dxbc::Signature) / sizeof(uint32_t) +\n                    sizeof(dxbc::SignatureParameterForGS) / sizeof(uint32_t) *\n                        osgn_parameter_count);\n\n  // Names (after the parameters).\n  name_ptr =\n      uint32_t((shader_out.size() - osgn_position_dwords) * sizeof(uint32_t));\n  uint32_t osgn_name_ptr_texcoord = name_ptr;\n  if (key.interpolator_count) {\n    name_ptr += dxbc::AppendAlignedString(shader_out, \"TEXCOORD\");\n  }\n  uint32_t osgn_name_ptr_xespritetexcoord = name_ptr;\n  if (key.has_point_coordinates) {\n    name_ptr += dxbc::AppendAlignedString(shader_out, \"XESPRITETEXCOORD\");\n  }\n  uint32_t osgn_name_ptr_sv_position = name_ptr;\n  name_ptr += dxbc::AppendAlignedString(shader_out, \"SV_Position\");\n  uint32_t osgn_name_ptr_sv_clip_distance = name_ptr;\n  if (input_clip_distance_count) {\n    name_ptr += dxbc::AppendAlignedString(shader_out, \"SV_ClipDistance\");\n  }\n\n  // Header and parameters.\n  uint32_t output_register_interpolators = UINT32_MAX;\n  uint32_t output_register_point_coordinates = UINT32_MAX;\n  uint32_t output_register_position;\n  uint32_t output_register_clip_distances = UINT32_MAX;\n  {\n    // Header.\n    auto& osgn_header = *reinterpret_cast<dxbc::Signature*>(\n        shader_out.data() + osgn_position_dwords);\n    osgn_header.parameter_count = osgn_parameter_count;\n    osgn_header.parameter_info_ptr = sizeof(dxbc::Signature);\n\n    // Parameters.\n    auto osgn_parameters = reinterpret_cast<dxbc::SignatureParameterForGS*>(\n        shader_out.data() + osgn_position_dwords +\n        sizeof(dxbc::Signature) / sizeof(uint32_t));\n    uint32_t osgn_parameter_index = 0;\n    uint32_t output_register_index = 0;\n\n    // Interpolators (TEXCOORD#).\n    if (key.interpolator_count) {\n      output_register_interpolators = output_register_index;\n      for (uint32_t i = 0; i < key.interpolator_count; ++i) {\n        assert_true(osgn_parameter_index < osgn_parameter_count);\n        dxbc::SignatureParameterForGS& osgn_interpolator =\n            osgn_parameters[osgn_parameter_index++];\n        osgn_interpolator.semantic_name_ptr = osgn_name_ptr_texcoord;\n        osgn_interpolator.semantic_index = i;\n        osgn_interpolator.component_type =\n            dxbc::SignatureRegisterComponentType::kFloat32;\n        osgn_interpolator.register_index = output_register_index++;\n        osgn_interpolator.mask = 0b1111;\n      }\n    }\n\n    // Point coordinates (XESPRITETEXCOORD).\n    if (key.has_point_coordinates) {\n      output_register_point_coordinates = output_register_index;\n      assert_true(osgn_parameter_index < osgn_parameter_count);\n      dxbc::SignatureParameterForGS& osgn_point_coordinates =\n          osgn_parameters[osgn_parameter_index++];\n      osgn_point_coordinates.semantic_name_ptr = osgn_name_ptr_xespritetexcoord;\n      osgn_point_coordinates.component_type =\n          dxbc::SignatureRegisterComponentType::kFloat32;\n      osgn_point_coordinates.register_index = output_register_index++;\n      osgn_point_coordinates.mask = 0b0011;\n      osgn_point_coordinates.never_writes_mask = 0b1100;\n    }\n\n    // Position (SV_Position).\n    output_register_position = output_register_index;\n    assert_true(osgn_parameter_index < osgn_parameter_count);\n    dxbc::SignatureParameterForGS& osgn_sv_position =\n        osgn_parameters[osgn_parameter_index++];\n    osgn_sv_position.semantic_name_ptr = osgn_name_ptr_sv_position;\n    osgn_sv_position.system_value = dxbc::Name::kPosition;\n    osgn_sv_position.component_type =\n        dxbc::SignatureRegisterComponentType::kFloat32;\n    osgn_sv_position.register_index = output_register_index++;\n    osgn_sv_position.mask = 0b1111;\n\n    // Clip distances (SV_ClipDistance#).\n    if (input_clip_distance_count) {\n      output_register_clip_distances = output_register_index;\n      for (uint32_t i = 0; i < input_clip_distance_count; i += 4) {\n        dxbc::SignatureParameterForGS& osgn_sv_clip_distance =\n            osgn_parameters[osgn_parameter_index++];\n        osgn_sv_clip_distance.semantic_name_ptr =\n            osgn_name_ptr_sv_clip_distance;\n        osgn_sv_clip_distance.semantic_index = i / 4;\n        osgn_sv_clip_distance.system_value = dxbc::Name::kClipDistance;\n        osgn_sv_clip_distance.component_type =\n            dxbc::SignatureRegisterComponentType::kFloat32;\n        osgn_sv_clip_distance.register_index = output_register_index++;\n        uint8_t osgn_sv_clip_distance_mask =\n            (UINT8_C(1) << std::min(input_clip_distance_count - i,\n                                    UINT32_C(4))) -\n            1;\n        osgn_sv_clip_distance.mask = osgn_sv_clip_distance_mask;\n        osgn_sv_clip_distance.never_writes_mask =\n            osgn_sv_clip_distance_mask ^ 0b1111;\n      }\n    }\n\n    assert_true(osgn_parameter_index == osgn_parameter_count);\n  }\n\n  {\n    auto& blob_header = *reinterpret_cast<dxbc::BlobHeader*>(\n        shader_out.data() + blob_position_dwords);\n    blob_header.fourcc = dxbc::BlobHeader::FourCC::kOutputSignatureForGS;\n    blob_position_dwords = uint32_t(shader_out.size());\n    blob_header.size_bytes =\n        (blob_position_dwords - kBlobHeaderSizeDwords) * sizeof(uint32_t) -\n        shader_out[blob_offset_position_dwords++];\n  }\n\n  // ***************************************************************************\n  // Shader program\n  // ***************************************************************************\n\n  shader_out[blob_offset_position_dwords] =\n      uint32_t(blob_position_dwords * sizeof(uint32_t));\n  uint32_t shex_position_dwords = blob_position_dwords + kBlobHeaderSizeDwords;\n  shader_out.resize(shex_position_dwords);\n\n  shader_out.push_back(\n      dxbc::VersionToken(dxbc::ProgramType::kGeometryShader, 5, 1));\n  // Reserve space for the length token.\n  shader_out.push_back(0);\n\n  dxbc::Statistics stat;\n  std::memset(&stat, 0, sizeof(dxbc::Statistics));\n  dxbc::Assembler a(shader_out, stat);\n\n  a.OpDclGlobalFlags(dxbc::kGlobalFlagAllResourcesBound);\n\n  if (system_cbuffer_size_vector_aligned_bytes) {\n    a.OpDclConstantBuffer(\n        dxbc::Src::CB(\n            dxbc::Src::Dcl, 0,\n            uint32_t(DxbcShaderTranslator::CbufferRegister::kSystemConstants),\n            uint32_t(DxbcShaderTranslator::CbufferRegister::kSystemConstants)),\n        system_cbuffer_size_vector_aligned_bytes / (sizeof(uint32_t) * 4));\n  }\n\n  dxbc::Primitive input_primitive = dxbc::Primitive::kUndefined;\n  uint32_t input_primitive_vertex_count = 0;\n  dxbc::PrimitiveTopology output_primitive_topology =\n      dxbc::PrimitiveTopology::kUndefined;\n  uint32_t max_output_vertex_count = 0;\n  switch (key.type) {\n    case PipelineGeometryShader::kPointList:\n      // Point to a strip of 2 triangles.\n      input_primitive = dxbc::Primitive::kPoint;\n      input_primitive_vertex_count = 1;\n      output_primitive_topology = dxbc::PrimitiveTopology::kTriangleStrip;\n      max_output_vertex_count = 4;\n      break;\n    case PipelineGeometryShader::kRectangleList:\n      // Triangle to a strip of 2 triangles.\n      input_primitive = dxbc::Primitive::kTriangle;\n      input_primitive_vertex_count = 3;\n      output_primitive_topology = dxbc::PrimitiveTopology::kTriangleStrip;\n      max_output_vertex_count = 4;\n      break;\n    case PipelineGeometryShader::kQuadList:\n      // 4 vertices passed via kLineWithAdjacency to a strip of 2 triangles.\n      input_primitive = dxbc::Primitive::kLineWithAdjacency;\n      input_primitive_vertex_count = 4;\n      output_primitive_topology = dxbc::PrimitiveTopology::kTriangleStrip;\n      max_output_vertex_count = 4;\n      break;\n    default:\n      assert_unhandled_case(key.type);\n  }\n\n  assert_false(key.interpolator_count &&\n               input_register_interpolators == UINT32_MAX);\n  for (uint32_t i = 0; i < key.interpolator_count; ++i) {\n    a.OpDclInput(dxbc::Dest::V2D(input_primitive_vertex_count,\n                                 input_register_interpolators + i));\n  }\n  a.OpDclInputSIV(\n      dxbc::Dest::V2D(input_primitive_vertex_count, input_register_position),\n      dxbc::Name::kPosition);\n  // Clip and cull plane declarations are separate in FXC-generated code even\n  // for a single register.\n  assert_false(input_clip_and_cull_distance_count &&\n               input_register_clip_and_cull_distances == UINT32_MAX);\n  for (uint32_t i = 0; i < input_clip_and_cull_distance_count; i += 4) {\n    if (i < input_clip_distance_count) {\n      a.OpDclInput(\n          dxbc::Dest::V2D(input_primitive_vertex_count,\n                          input_register_clip_and_cull_distances + (i >> 2),\n                          (UINT32_C(1) << std::min(\n                               input_clip_distance_count - i, UINT32_C(4))) -\n                              1));\n    }\n    if (input_cull_distance_count && i + 4 > input_clip_distance_count) {\n      uint32_t cull_distance_mask =\n          (UINT32_C(1) << std::min(input_clip_and_cull_distance_count - i,\n                                   UINT32_C(4))) -\n          1;\n      if (i < input_clip_distance_count) {\n        cull_distance_mask &=\n            ~((UINT32_C(1) << (input_clip_distance_count - i)) - 1);\n      }\n      a.OpDclInput(\n          dxbc::Dest::V2D(input_primitive_vertex_count,\n                          input_register_clip_and_cull_distances + (i >> 2),\n                          cull_distance_mask));\n    }\n  }\n  if (key.has_point_size && key.type == PipelineGeometryShader::kPointList) {\n    assert_true(input_register_point_size != UINT32_MAX);\n    a.OpDclInput(dxbc::Dest::V2D(input_primitive_vertex_count,\n                                 input_register_point_size, 0b0001));\n  }\n\n  // At least 1 temporary register needed to discard primitives with NaN\n  // position.\n  size_t dcl_temps_count_position_dwords = a.OpDclTemps(1);\n\n  a.OpDclInputPrimitive(input_primitive);\n  dxbc::Dest stream(dxbc::Dest::M(0));\n  a.OpDclStream(stream);\n  a.OpDclOutputTopology(output_primitive_topology);\n\n  assert_false(key.interpolator_count &&\n               output_register_interpolators == UINT32_MAX);\n  for (uint32_t i = 0; i < key.interpolator_count; ++i) {\n    a.OpDclOutput(dxbc::Dest::O(output_register_interpolators + i));\n  }\n  if (key.has_point_coordinates) {\n    assert_true(output_register_point_coordinates != UINT32_MAX);\n    a.OpDclOutput(dxbc::Dest::O(output_register_point_coordinates, 0b0011));\n  }\n  a.OpDclOutputSIV(dxbc::Dest::O(output_register_position),\n                   dxbc::Name::kPosition);\n  assert_false(input_clip_distance_count &&\n               output_register_clip_distances == UINT32_MAX);\n  for (uint32_t i = 0; i < input_clip_distance_count; i += 4) {\n    a.OpDclOutputSIV(\n        dxbc::Dest::O(output_register_clip_distances + (i >> 2),\n                      (UINT32_C(1) << std::min(input_clip_distance_count - i,\n                                               UINT32_C(4))) -\n                          1),\n        dxbc::Name::kClipDistance);\n  }\n\n  a.OpDclMaxOutputVertexCount(max_output_vertex_count);\n\n  // Note that after every emit, all o# become initialized and must be written\n  // to again.\n  // Also, FXC generates only movs (from statically or dynamically indexed\n  // v[#][#], from r#, or from a literal) to o# for some reason.\n  // emit_then_cut_stream must not be used - it crashes the shader compiler of\n  // AMD Software: Adrenalin Edition 23.3.2 on RDNA 3 if it's conditional (after\n  // a `retc` or inside an `if`), and it doesn't seem to be generated by FXC or\n  // DXC at all.\n\n  // Discard the whole primitive if any vertex has a NaN position (may also be\n  // set to NaN for emulation of vertex killing with the OR operator).\n  for (uint32_t i = 0; i < input_primitive_vertex_count; ++i) {\n    a.OpNE(dxbc::Dest::R(0), dxbc::Src::V2D(i, input_register_position),\n           dxbc::Src::V2D(i, input_register_position));\n    a.OpOr(dxbc::Dest::R(0, 0b0011), dxbc::Src::R(0, 0b0100),\n           dxbc::Src::R(0, 0b1110));\n    a.OpOr(dxbc::Dest::R(0, 0b0001), dxbc::Src::R(0, dxbc::Src::kXXXX),\n           dxbc::Src::R(0, dxbc::Src::kYYYY));\n    a.OpRetC(true, dxbc::Src::R(0, dxbc::Src::kXXXX));\n  }\n\n  // Cull the whole primitive if any cull distance for all vertices in the\n  // primitive is < 0.\n  // TODO(Triang3l): For points, handle ps_ucp_mode (transform the host clip\n  // space to the guest one, calculate the distances to the user clip planes,\n  // cull using the distance from the center for modes 0, 1 and 2, cull and clip\n  // per-vertex for modes 2 and 3) - except for the vertex kill flag.\n  if (input_cull_distance_count) {\n    for (uint32_t i = 0; i < input_cull_distance_count; ++i) {\n      uint32_t cull_distance_register = input_register_clip_and_cull_distances +\n                                        ((input_clip_distance_count + i) >> 2);\n      uint32_t cull_distance_component = (input_clip_distance_count + i) & 3;\n      a.OpLT(dxbc::Dest::R(0, 0b0001),\n             dxbc::Src::V2D(0, cull_distance_register)\n                 .Select(cull_distance_component),\n             dxbc::Src::LF(0.0f));\n      for (uint32_t j = 1; j < input_primitive_vertex_count; ++j) {\n        a.OpLT(dxbc::Dest::R(0, 0b0010),\n               dxbc::Src::V2D(j, cull_distance_register)\n                   .Select(cull_distance_component),\n               dxbc::Src::LF(0.0f));\n        a.OpAnd(dxbc::Dest::R(0, 0b0001), dxbc::Src::R(0, dxbc::Src::kXXXX),\n                dxbc::Src::R(0, dxbc::Src::kYYYY));\n      }\n      a.OpRetC(true, dxbc::Src::R(0, dxbc::Src::kXXXX));\n    }\n  }\n\n  switch (key.type) {\n    case PipelineGeometryShader::kPointList: {\n      // Expand the point sprite, with left-to-right, top-to-bottom UVs.\n      dxbc::Src point_size_src(dxbc::Src::CB(\n          0, uint32_t(DxbcShaderTranslator::CbufferRegister::kSystemConstants),\n          offsetof(DxbcShaderTranslator::SystemConstants,\n                   point_constant_diameter) >>\n              4,\n          ((offsetof(DxbcShaderTranslator::SystemConstants,\n                     point_constant_diameter[0]) >>\n            2) &\n           3) |\n              (((offsetof(DxbcShaderTranslator::SystemConstants,\n                          point_constant_diameter[1]) >>\n                 2) &\n                3)\n               << 2)));\n      if (key.has_point_size) {\n        // The vertex shader's header writes -1.0 to point_size by default, so\n        // any non-negative value means that it was overwritten by the\n        // translated vertex shader, and needs to be used instead of the\n        // constant size. The per-vertex diameter is already clamped in the\n        // vertex shader (combined with making it non-negative).\n        a.OpGE(dxbc::Dest::R(0, 0b0001),\n               dxbc::Src::V2D(0, input_register_point_size, dxbc::Src::kXXXX),\n               dxbc::Src::LF(0.0f));\n        a.OpMovC(dxbc::Dest::R(0, 0b0011), dxbc::Src::R(0, dxbc::Src::kXXXX),\n                 dxbc::Src::V2D(0, input_register_point_size, dxbc::Src::kXXXX),\n                 point_size_src);\n        point_size_src = dxbc::Src::R(0, 0b0100);\n      }\n      // 4D5307F1 has zero-size snowflakes, drop them quicker, and also drop\n      // points with a constant size of zero since point lists may also be used\n      // as just \"compute\" with memexport.\n      // XY may contain the point size with the per-vertex override applied, use\n      // Z as temporary.\n      for (uint32_t i = 0; i < 2; ++i) {\n        a.OpLT(dxbc::Dest::R(0, 0b0100), dxbc::Src::LF(0.0f),\n               point_size_src.SelectFromSwizzled(i));\n        a.OpRetC(false, dxbc::Src::R(0, dxbc::Src::kZZZZ));\n      }\n      // Transform the diameter in the guest screen coordinates to radius in the\n      // normalized device coordinates, and then to the clip space by\n      // multiplying by W.\n      a.OpMul(\n          dxbc::Dest::R(0, 0b0011), point_size_src,\n          dxbc::Src::CB(\n              0,\n              uint32_t(DxbcShaderTranslator::CbufferRegister::kSystemConstants),\n              offsetof(DxbcShaderTranslator::SystemConstants,\n                       point_screen_diameter_to_ndc_radius) >>\n                  4,\n              ((offsetof(DxbcShaderTranslator::SystemConstants,\n                         point_screen_diameter_to_ndc_radius[0]) >>\n                2) &\n               3) |\n                  (((offsetof(DxbcShaderTranslator::SystemConstants,\n                              point_screen_diameter_to_ndc_radius[1]) >>\n                     2) &\n                    3)\n                   << 2)));\n      point_size_src = dxbc::Src::R(0, 0b0100);\n      a.OpMul(dxbc::Dest::R(0, 0b0011), point_size_src,\n              dxbc::Src::V2D(0, input_register_position, dxbc::Src::kWWWW));\n      dxbc::Src point_radius_x_src(point_size_src.SelectFromSwizzled(0));\n      dxbc::Src point_radius_y_src(point_size_src.SelectFromSwizzled(1));\n\n      for (uint32_t i = 0; i < 4; ++i) {\n        // Same interpolators for the entire sprite.\n        for (uint32_t j = 0; j < key.interpolator_count; ++j) {\n          a.OpMov(dxbc::Dest::O(output_register_interpolators + j),\n                  dxbc::Src::V2D(0, input_register_interpolators + j));\n        }\n        // Top-left, top-right, bottom-left, bottom-right order (chosen\n        // arbitrarily, simply based on clockwise meaning front with\n        // FrontCounterClockwise = FALSE, but faceness is ignored for\n        // non-polygon primitive types).\n        // Bottom is -Y in Direct3D NDC, +V in point sprite coordinates.\n        if (key.has_point_coordinates) {\n          a.OpMov(dxbc::Dest::O(output_register_point_coordinates, 0b0011),\n                  dxbc::Src::LF(float(i & 1), float(i >> 1), 0.0f, 0.0f));\n        }\n        // FXC generates only `mov`s for o#, use temporary registers (r0.zw, as\n        // r0.xy already used for the point size) for calculations.\n        a.OpAdd(dxbc::Dest::R(0, 0b0100),\n                dxbc::Src::V2D(0, input_register_position, dxbc::Src::kXXXX),\n                (i & 1) ? point_radius_x_src : -point_radius_x_src);\n        a.OpAdd(dxbc::Dest::R(0, 0b1000),\n                dxbc::Src::V2D(0, input_register_position, dxbc::Src::kYYYY),\n                (i >> 1) ? -point_radius_y_src : point_radius_y_src);\n        a.OpMov(dxbc::Dest::O(output_register_position, 0b0011),\n                dxbc::Src::R(0, 0b1110));\n        a.OpMov(dxbc::Dest::O(output_register_position, 0b1100),\n                dxbc::Src::V2D(0, input_register_position));\n        // TODO(Triang3l): Handle ps_ucp_mode properly, clip expanded points if\n        // needed.\n        for (uint32_t j = 0; j < input_clip_distance_count; j += 4) {\n          a.OpMov(\n              dxbc::Dest::O(output_register_clip_distances + (j >> 2),\n                            (UINT32_C(1) << std::min(\n                                 input_clip_distance_count - j, UINT32_C(4))) -\n                                1),\n              dxbc::Src::V2D(\n                  0, input_register_clip_and_cull_distances + (j >> 2)));\n        }\n        a.OpEmitStream(stream);\n      }\n      a.OpCutStream(stream);\n    } break;\n\n    case PipelineGeometryShader::kRectangleList: {\n      // Construct a strip with the fourth vertex generated by mirroring a\n      // vertex across the longest edge (the diagonal).\n      //\n      // Possible options:\n      //\n      // 0---1\n      // |  /|\n      // | / |  - 12 is the longest edge, strip 0123 (most commonly used)\n      // |/  |    v3 = v0 + (v1 - v0) + (v2 - v0), or v3 = -v0 + v1 + v2\n      // 2--[3]\n      //\n      // 1---2\n      // |  /|\n      // | / |  - 20 is the longest edge, strip 1203\n      // |/  |\n      // 0--[3]\n      //\n      // 2---0\n      // |  /|\n      // | / |  - 01 is the longest edge, strip 2013\n      // |/  |\n      // 1--[3]\n      //\n      // Input vertices are implicitly indexable, dcl_indexRange is not needed\n      // for the first dimension of a v[#][#] index.\n\n      // Get squares of edge lengths into r0.xyz to choose the longest edge.\n      // r0.x = ||12||^2\n      a.OpAdd(dxbc::Dest::R(0, 0b0011),\n              dxbc::Src::V2D(2, input_register_position, 0b0100),\n              -dxbc::Src::V2D(1, input_register_position, 0b0100));\n      a.OpDP2(dxbc::Dest::R(0, 0b0001), dxbc::Src::R(0, 0b0100),\n              dxbc::Src::R(0, 0b0100));\n      // r0.y = ||20||^2\n      a.OpAdd(dxbc::Dest::R(0, 0b0110),\n              dxbc::Src::V2D(0, input_register_position, 0b0100 << 2),\n              -dxbc::Src::V2D(2, input_register_position, 0b0100 << 2));\n      a.OpDP2(dxbc::Dest::R(0, 0b0010), dxbc::Src::R(0, 0b1001),\n              dxbc::Src::R(0, 0b1001));\n      // r0.z = ||01||^2\n      a.OpAdd(dxbc::Dest::R(0, 0b1100),\n              dxbc::Src::V2D(1, input_register_position, 0b0100 << 4),\n              -dxbc::Src::V2D(0, input_register_position, 0b0100 << 4));\n      a.OpDP2(dxbc::Dest::R(0, 0b0100), dxbc::Src::R(0, 0b1110),\n              dxbc::Src::R(0, 0b1110));\n\n      // Find the longest edge, and select the strip vertex indices into r0.xyz.\n      // r0.w = 12 > 20\n      a.OpLT(dxbc::Dest::R(0, 0b1000), dxbc::Src::R(0, dxbc::Src::kYYYY),\n             dxbc::Src::R(0, dxbc::Src::kXXXX));\n      // r0.x = 12 > 01\n      a.OpLT(dxbc::Dest::R(0, 0b0001), dxbc::Src::R(0, dxbc::Src::kZZZZ),\n             dxbc::Src::R(0, dxbc::Src::kXXXX));\n      // r0.x = 12 > 20 && 12 > 01\n      a.OpAnd(dxbc::Dest::R(0, 0b0001), dxbc::Src::R(0, dxbc::Src::kWWWW),\n              dxbc::Src::R(0, dxbc::Src::kXXXX));\n      a.OpIf(true, dxbc::Src::R(0, dxbc::Src::kXXXX));\n      {\n        // 12 is the longest edge, the first triangle in the strip is 012.\n        a.OpMov(dxbc::Dest::R(0, 0b0111), dxbc::Src::LU(0, 1, 2, 0));\n      }\n      a.OpElse();\n      {\n        // r0.x = 20 > 01\n        a.OpLT(dxbc::Dest::R(0, 0b0001), dxbc::Src::R(0, dxbc::Src::kZZZZ),\n               dxbc::Src::R(0, dxbc::Src::kYYYY));\n        // If 20 is the longest edge, the first triangle in the strip is 120.\n        // Otherwise, it's 201.\n        a.OpMovC(dxbc::Dest::R(0, 0b0111), dxbc::Src::R(0, dxbc::Src::kXXXX),\n                 dxbc::Src::LU(1, 2, 0, 0), dxbc::Src::LU(2, 0, 1, 0));\n      }\n      a.OpEndIf();\n\n      // Emit the triangle in the strip that consists of the original vertices.\n      for (uint32_t i = 0; i < 3; ++i) {\n        dxbc::Index input_vertex_index(0, i);\n        for (uint32_t j = 0; j < key.interpolator_count; ++j) {\n          a.OpMov(dxbc::Dest::O(output_register_interpolators + j),\n                  dxbc::Src::V2D(input_vertex_index,\n                                 input_register_interpolators + j));\n        }\n        if (key.has_point_coordinates) {\n          a.OpMov(dxbc::Dest::O(output_register_point_coordinates, 0b0011),\n                  dxbc::Src::LF(0.0f));\n        }\n        a.OpMov(dxbc::Dest::O(output_register_position),\n                dxbc::Src::V2D(input_vertex_index, input_register_position));\n        for (uint32_t j = 0; j < input_clip_distance_count; j += 4) {\n          a.OpMov(\n              dxbc::Dest::O(output_register_clip_distances + (j >> 2),\n                            (UINT32_C(1) << std::min(\n                                 input_clip_distance_count - j, UINT32_C(4))) -\n                                1),\n              dxbc::Src::V2D(\n                  input_vertex_index,\n                  input_register_clip_and_cull_distances + (j >> 2)));\n        }\n        a.OpEmitStream(stream);\n      }\n\n      // Construct the fourth vertex using r1 as temporary storage, including\n      // for the final operation as FXC generates only `mov`s for o#.\n      stat.temp_register_count =\n          std::max(UINT32_C(2), stat.temp_register_count);\n      for (uint32_t j = 0; j < key.interpolator_count; ++j) {\n        uint32_t input_register_interpolator = input_register_interpolators + j;\n        a.OpAdd(dxbc::Dest::R(1),\n                -dxbc::Src::V2D(dxbc::Index(0, 0), input_register_interpolator),\n                dxbc::Src::V2D(dxbc::Index(0, 1), input_register_interpolator));\n        a.OpAdd(dxbc::Dest::R(1), dxbc::Src::R(1),\n                dxbc::Src::V2D(dxbc::Index(0, 2), input_register_interpolator));\n        a.OpMov(dxbc::Dest::O(output_register_interpolators + j),\n                dxbc::Src::R(1));\n      }\n      if (key.has_point_coordinates) {\n        a.OpMov(dxbc::Dest::O(output_register_point_coordinates, 0b0011),\n                dxbc::Src::LF(0.0f));\n      }\n      a.OpAdd(dxbc::Dest::R(1),\n              -dxbc::Src::V2D(dxbc::Index(0, 0), input_register_position),\n              dxbc::Src::V2D(dxbc::Index(0, 1), input_register_position));\n      a.OpAdd(dxbc::Dest::R(1), dxbc::Src::R(1),\n              dxbc::Src::V2D(dxbc::Index(0, 2), input_register_position));\n      a.OpMov(dxbc::Dest::O(output_register_position), dxbc::Src::R(1));\n      for (uint32_t j = 0; j < input_clip_distance_count; j += 4) {\n        uint32_t clip_distance_mask =\n            (UINT32_C(1) << std::min(input_clip_distance_count - j,\n                                     UINT32_C(4))) -\n            1;\n        uint32_t input_register_clip_distance =\n            input_register_clip_and_cull_distances + (j >> 2);\n        a.OpAdd(\n            dxbc::Dest::R(1, clip_distance_mask),\n            -dxbc::Src::V2D(dxbc::Index(0, 0), input_register_clip_distance),\n            dxbc::Src::V2D(dxbc::Index(0, 1), input_register_clip_distance));\n        a.OpAdd(\n            dxbc::Dest::R(1, clip_distance_mask), dxbc::Src::R(1),\n            dxbc::Src::V2D(dxbc::Index(0, 2), input_register_clip_distance));\n        a.OpMov(dxbc::Dest::O(output_register_clip_distances + (j >> 2),\n                              clip_distance_mask),\n                dxbc::Src::R(1));\n      }\n      a.OpEmitStream(stream);\n      a.OpCutStream(stream);\n    } break;\n\n    case PipelineGeometryShader::kQuadList: {\n      // Build the triangle strip from the original quad vertices in the\n      // 0, 1, 3, 2 order (like specified for GL_QUAD_STRIP).\n      // TODO(Triang3l): Find the correct decomposition of quads into triangles\n      // on the real hardware.\n      for (uint32_t i = 0; i < 4; ++i) {\n        uint32_t input_vertex_index = i ^ (i >> 1);\n        for (uint32_t j = 0; j < key.interpolator_count; ++j) {\n          a.OpMov(dxbc::Dest::O(output_register_interpolators + j),\n                  dxbc::Src::V2D(input_vertex_index,\n                                 input_register_interpolators + j));\n        }\n        if (key.has_point_coordinates) {\n          a.OpMov(dxbc::Dest::O(output_register_point_coordinates, 0b0011),\n                  dxbc::Src::LF(0.0f));\n        }\n        a.OpMov(dxbc::Dest::O(output_register_position),\n                dxbc::Src::V2D(input_vertex_index, input_register_position));\n        for (uint32_t j = 0; j < input_clip_distance_count; j += 4) {\n          a.OpMov(\n              dxbc::Dest::O(output_register_clip_distances + (j >> 2),\n                            (UINT32_C(1) << std::min(\n                                 input_clip_distance_count - j, UINT32_C(4))) -\n                                1),\n              dxbc::Src::V2D(\n                  input_vertex_index,\n                  input_register_clip_and_cull_distances + (j >> 2)));\n        }\n        a.OpEmitStream(stream);\n      }\n      a.OpCutStream(stream);\n    } break;\n\n    default:\n      assert_unhandled_case(key.type);\n  }\n\n  a.OpRet();\n\n  // Write the actual number of temporary registers used.\n  shader_out[dcl_temps_count_position_dwords] = stat.temp_register_count;\n\n  // Write the shader program length in dwords.\n  shader_out[shex_position_dwords + 1] =\n      uint32_t(shader_out.size()) - shex_position_dwords;\n\n  {\n    auto& blob_header = *reinterpret_cast<dxbc::BlobHeader*>(\n        shader_out.data() + blob_position_dwords);\n    blob_header.fourcc = dxbc::BlobHeader::FourCC::kShaderEx;\n    blob_position_dwords = uint32_t(shader_out.size());\n    blob_header.size_bytes =\n        (blob_position_dwords - kBlobHeaderSizeDwords) * sizeof(uint32_t) -\n        shader_out[blob_offset_position_dwords++];\n  }\n\n  // ***************************************************************************\n  // Statistics\n  // ***************************************************************************\n\n  shader_out[blob_offset_position_dwords] =\n      uint32_t(blob_position_dwords * sizeof(uint32_t));\n  uint32_t stat_position_dwords = blob_position_dwords + kBlobHeaderSizeDwords;\n  shader_out.resize(stat_position_dwords +\n                    sizeof(dxbc::Statistics) / sizeof(uint32_t));\n  std::memcpy(shader_out.data() + stat_position_dwords, &stat,\n              sizeof(dxbc::Statistics));\n\n  {\n    auto& blob_header = *reinterpret_cast<dxbc::BlobHeader*>(\n        shader_out.data() + blob_position_dwords);\n    blob_header.fourcc = dxbc::BlobHeader::FourCC::kStatistics;\n    blob_position_dwords = uint32_t(shader_out.size());\n    blob_header.size_bytes =\n        (blob_position_dwords - kBlobHeaderSizeDwords) * sizeof(uint32_t) -\n        shader_out[blob_offset_position_dwords++];\n  }\n\n  // ***************************************************************************\n  // Container header\n  // ***************************************************************************\n\n  uint32_t shader_size_bytes = uint32_t(shader_out.size() * sizeof(uint32_t));\n  {\n    auto& container_header =\n        *reinterpret_cast<dxbc::ContainerHeader*>(shader_out.data());\n    container_header.InitializeIdentification();\n    container_header.size_bytes = shader_size_bytes;\n    container_header.blob_count = kBlobCount;\n    CalculateDXBCChecksum(\n        reinterpret_cast<unsigned char*>(shader_out.data()),\n        static_cast<unsigned int>(shader_size_bytes),\n        reinterpret_cast<unsigned int*>(&container_header.hash));\n  }\n}\n\nconst std::vector<uint32_t>& PipelineCache::GetGeometryShader(\n    GeometryShaderKey key) {\n  auto it = geometry_shaders_.find(key);\n  if (it != geometry_shaders_.end()) {\n    return it->second;\n  }\n  std::vector<uint32_t> shader;\n  CreateDxbcGeometryShader(key, shader);\n  return geometry_shaders_.emplace(key, std::move(shader)).first->second;\n}\n\nID3D12PipelineState* PipelineCache::CreateD3D12Pipeline(\n    const PipelineRuntimeDescription& runtime_description) {\n  const PipelineDescription& description = runtime_description.description;\n\n  if (runtime_description.pixel_shader != nullptr) {\n    XELOGGPU(\"Creating graphics pipeline with VS {:016X}, PS {:016X}\",\n             runtime_description.vertex_shader->shader().ucode_data_hash(),\n             runtime_description.pixel_shader->shader().ucode_data_hash());\n  } else {\n    XELOGGPU(\"Creating graphics pipeline with VS {:016X}\",\n             runtime_description.vertex_shader->shader().ucode_data_hash());\n  }\n\n  D3D12_GRAPHICS_PIPELINE_STATE_DESC state_desc;\n  std::memset(&state_desc, 0, sizeof(state_desc));\n\n  bool edram_rov_used = render_target_cache_.GetPath() ==\n                        RenderTargetCache::Path::kPixelShaderInterlock;\n\n  // Root signature.\n  state_desc.pRootSignature = runtime_description.root_signature;\n\n  // Index buffer strip cut value.\n  switch (description.strip_cut_index) {\n    case PipelineStripCutIndex::kFFFF:\n      state_desc.IBStripCutValue = D3D12_INDEX_BUFFER_STRIP_CUT_VALUE_0xFFFF;\n      break;\n    case PipelineStripCutIndex::kFFFFFFFF:\n      state_desc.IBStripCutValue =\n          D3D12_INDEX_BUFFER_STRIP_CUT_VALUE_0xFFFFFFFF;\n      break;\n    default:\n      state_desc.IBStripCutValue = D3D12_INDEX_BUFFER_STRIP_CUT_VALUE_DISABLED;\n      break;\n  }\n\n  // Primitive topology, vertex, hull, domain and geometry shaders.\n  if (!runtime_description.vertex_shader->is_translated()) {\n    XELOGE(\"Vertex shader {:016X} not translated\",\n           runtime_description.vertex_shader->shader().ucode_data_hash());\n    assert_always();\n    return nullptr;\n  }\n  Shader::HostVertexShaderType host_vertex_shader_type =\n      DxbcShaderTranslator::Modification(\n          runtime_description.vertex_shader->modification())\n          .vertex.host_vertex_shader_type;\n  if (Shader::IsHostVertexShaderTypeDomain(host_vertex_shader_type)) {\n    state_desc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_PATCH;\n    xenos::TessellationMode tessellation_mode = xenos::TessellationMode(\n        description.primitive_topology_type_or_tessellation_mode);\n    if (tessellation_mode == xenos::TessellationMode::kAdaptive) {\n      state_desc.VS.pShaderBytecode = shaders::tessellation_adaptive_vs;\n      state_desc.VS.BytecodeLength = sizeof(shaders::tessellation_adaptive_vs);\n    } else {\n      state_desc.VS.pShaderBytecode = shaders::tessellation_indexed_vs;\n      state_desc.VS.BytecodeLength = sizeof(shaders::tessellation_indexed_vs);\n    }\n    switch (tessellation_mode) {\n      case xenos::TessellationMode::kDiscrete:\n        switch (host_vertex_shader_type) {\n          case Shader::HostVertexShaderType::kTriangleDomainCPIndexed:\n            state_desc.HS.pShaderBytecode = shaders::discrete_triangle_3cp_hs;\n            state_desc.HS.BytecodeLength =\n                sizeof(shaders::discrete_triangle_3cp_hs);\n            break;\n          case Shader::HostVertexShaderType::kTriangleDomainPatchIndexed:\n            state_desc.HS.pShaderBytecode = shaders::discrete_triangle_1cp_hs;\n            state_desc.HS.BytecodeLength =\n                sizeof(shaders::discrete_triangle_1cp_hs);\n            break;\n          case Shader::HostVertexShaderType::kQuadDomainCPIndexed:\n            state_desc.HS.pShaderBytecode = shaders::discrete_quad_4cp_hs;\n            state_desc.HS.BytecodeLength =\n                sizeof(shaders::discrete_quad_4cp_hs);\n            break;\n          case Shader::HostVertexShaderType::kQuadDomainPatchIndexed:\n            state_desc.HS.pShaderBytecode = shaders::discrete_quad_1cp_hs;\n            state_desc.HS.BytecodeLength =\n                sizeof(shaders::discrete_quad_1cp_hs);\n            break;\n          default:\n            assert_unhandled_case(host_vertex_shader_type);\n            return nullptr;\n        }\n        break;\n      case xenos::TessellationMode::kContinuous:\n        switch (host_vertex_shader_type) {\n          case Shader::HostVertexShaderType::kTriangleDomainCPIndexed:\n            state_desc.HS.pShaderBytecode = shaders::continuous_triangle_3cp_hs;\n            state_desc.HS.BytecodeLength =\n                sizeof(shaders::continuous_triangle_3cp_hs);\n            break;\n          case Shader::HostVertexShaderType::kTriangleDomainPatchIndexed:\n            state_desc.HS.pShaderBytecode = shaders::continuous_triangle_1cp_hs;\n            state_desc.HS.BytecodeLength =\n                sizeof(shaders::continuous_triangle_1cp_hs);\n            break;\n          case Shader::HostVertexShaderType::kQuadDomainCPIndexed:\n            state_desc.HS.pShaderBytecode = shaders::continuous_quad_4cp_hs;\n            state_desc.HS.BytecodeLength =\n                sizeof(shaders::continuous_quad_4cp_hs);\n            break;\n          case Shader::HostVertexShaderType::kQuadDomainPatchIndexed:\n            state_desc.HS.pShaderBytecode = shaders::continuous_quad_1cp_hs;\n            state_desc.HS.BytecodeLength =\n                sizeof(shaders::continuous_quad_1cp_hs);\n            break;\n          default:\n            assert_unhandled_case(host_vertex_shader_type);\n            return nullptr;\n        }\n        break;\n      case xenos::TessellationMode::kAdaptive:\n        switch (host_vertex_shader_type) {\n          case Shader::HostVertexShaderType::kTriangleDomainPatchIndexed:\n            state_desc.HS.pShaderBytecode = shaders::adaptive_triangle_hs;\n            state_desc.HS.BytecodeLength =\n                sizeof(shaders::adaptive_triangle_hs);\n            break;\n          case Shader::HostVertexShaderType::kQuadDomainPatchIndexed:\n            state_desc.HS.pShaderBytecode = shaders::adaptive_quad_hs;\n            state_desc.HS.BytecodeLength = sizeof(shaders::adaptive_quad_hs);\n            break;\n          default:\n            assert_unhandled_case(host_vertex_shader_type);\n            return nullptr;\n        }\n        break;\n      default:\n        assert_unhandled_case(tessellation_mode);\n        return nullptr;\n    }\n    state_desc.DS.pShaderBytecode =\n        runtime_description.vertex_shader->translated_binary().data();\n    state_desc.DS.BytecodeLength =\n        runtime_description.vertex_shader->translated_binary().size();\n  } else {\n    assert_true(host_vertex_shader_type ==\n                Shader::HostVertexShaderType::kVertex);\n    if (host_vertex_shader_type != Shader::HostVertexShaderType::kVertex) {\n      // Fallback vertex shaders are not needed on Direct3D 12.\n      return nullptr;\n    }\n    state_desc.VS.pShaderBytecode =\n        runtime_description.vertex_shader->translated_binary().data();\n    state_desc.VS.BytecodeLength =\n        runtime_description.vertex_shader->translated_binary().size();\n    PipelinePrimitiveTopologyType primitive_topology_type =\n        PipelinePrimitiveTopologyType(\n            description.primitive_topology_type_or_tessellation_mode);\n    switch (primitive_topology_type) {\n      case PipelinePrimitiveTopologyType::kPoint:\n        state_desc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_POINT;\n        break;\n      case PipelinePrimitiveTopologyType::kLine:\n        state_desc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_LINE;\n        break;\n      case PipelinePrimitiveTopologyType::kTriangle:\n        state_desc.PrimitiveTopologyType =\n            D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;\n        break;\n      default:\n        assert_unhandled_case(primitive_topology_type);\n        return nullptr;\n    }\n  }\n\n  // Pixel shader.\n  if (runtime_description.pixel_shader != nullptr) {\n    if (!runtime_description.pixel_shader->is_translated()) {\n      XELOGE(\"Pixel shader {:016X} not translated\",\n             runtime_description.pixel_shader->shader().ucode_data_hash());\n      assert_always();\n      return nullptr;\n    }\n    state_desc.PS.pShaderBytecode =\n        runtime_description.pixel_shader->translated_binary().data();\n    state_desc.PS.BytecodeLength =\n        runtime_description.pixel_shader->translated_binary().size();\n  } else if (edram_rov_used) {\n    state_desc.PS.pShaderBytecode = depth_only_pixel_shader_.data();\n    state_desc.PS.BytecodeLength = depth_only_pixel_shader_.size();\n  } else {\n    if (render_target_cache_.depth_float24_convert_in_pixel_shader() &&\n        (description.depth_func != xenos::CompareFunction::kAlways ||\n         description.depth_write) &&\n        description.depth_format == xenos::DepthRenderTargetFormat::kD24FS8) {\n      if (render_target_cache_.depth_float24_round()) {\n        state_desc.PS.pShaderBytecode = shaders::float24_round_ps;\n        state_desc.PS.BytecodeLength = sizeof(shaders::float24_round_ps);\n      } else {\n        state_desc.PS.pShaderBytecode = shaders::float24_truncate_ps;\n        state_desc.PS.BytecodeLength = sizeof(shaders::float24_truncate_ps);\n      }\n    }\n  }\n\n  // Geometry shader.\n  if (runtime_description.geometry_shader != nullptr) {\n    state_desc.GS.pShaderBytecode = runtime_description.geometry_shader->data();\n    state_desc.GS.BytecodeLength =\n        sizeof(*runtime_description.geometry_shader->data()) *\n        runtime_description.geometry_shader->size();\n  }\n\n  // Rasterizer state.\n  state_desc.RasterizerState.FillMode = description.fill_mode_wireframe\n                                            ? D3D12_FILL_MODE_WIREFRAME\n                                            : D3D12_FILL_MODE_SOLID;\n  switch (description.cull_mode) {\n    case PipelineCullMode::kFront:\n      state_desc.RasterizerState.CullMode = D3D12_CULL_MODE_FRONT;\n      break;\n    case PipelineCullMode::kBack:\n      state_desc.RasterizerState.CullMode = D3D12_CULL_MODE_BACK;\n      break;\n    default:\n      assert_true(description.cull_mode == PipelineCullMode::kNone ||\n                  description.cull_mode ==\n                      PipelineCullMode::kDisableRasterization);\n      state_desc.RasterizerState.CullMode = D3D12_CULL_MODE_NONE;\n      break;\n  }\n  state_desc.RasterizerState.FrontCounterClockwise =\n      description.front_counter_clockwise ? TRUE : FALSE;\n  state_desc.RasterizerState.DepthBias = description.depth_bias;\n  state_desc.RasterizerState.DepthBiasClamp = 0.0f;\n  // With non-square resolution scaling, make sure the worst-case impact is\n  // reverted (slope only along the scaled axis), thus max. More bias is better\n  // than less bias, because less bias means Z fighting with the background is\n  // more likely.\n  state_desc.RasterizerState.SlopeScaledDepthBias =\n      description.depth_bias_slope_scaled *\n      float(std::max(render_target_cache_.draw_resolution_scale_x(),\n                     render_target_cache_.draw_resolution_scale_y()));\n  state_desc.RasterizerState.DepthClipEnable =\n      description.depth_clip ? TRUE : FALSE;\n  uint32_t msaa_sample_count = uint32_t(1)\n                               << uint32_t(description.host_msaa_samples);\n  if (edram_rov_used) {\n    // Only 1, 4, 8 and (not on all GPUs) 16 are allowed, using sample 0 as 0\n    // and 3 as 1 for 2x instead (not exactly the same sample positions, but\n    // still top-left and bottom-right - however, this can be adjusted with\n    // programmable sample positions).\n    assert_true(msaa_sample_count == 1 || msaa_sample_count == 4);\n    if (msaa_sample_count != 1 && msaa_sample_count != 4) {\n      return nullptr;\n    }\n    state_desc.RasterizerState.ForcedSampleCount =\n        uint32_t(1) << uint32_t(description.host_msaa_samples);\n  }\n\n  // Sample mask and description.\n  state_desc.SampleMask = UINT_MAX;\n  // TODO(Triang3l): 4x MSAA fallback when 2x isn't supported without ROV.\n  if (edram_rov_used) {\n    state_desc.SampleDesc.Count = 1;\n  } else {\n    assert_true(msaa_sample_count <= 4);\n    if (msaa_sample_count > 4) {\n      return nullptr;\n    }\n    if (msaa_sample_count == 2 && !render_target_cache_.msaa_2x_supported()) {\n      // Using sample 0 as 0 and 3 as 1 for 2x instead (not exactly the same\n      // sample positions, but still top-left and bottom-right - however, this\n      // can be adjusted with programmable sample positions).\n      state_desc.SampleMask = 0b1001;\n      state_desc.SampleDesc.Count = 4;\n    } else {\n      state_desc.SampleDesc.Count = msaa_sample_count;\n    }\n  }\n\n  if (!edram_rov_used) {\n    // Depth/stencil.\n    if (description.depth_func != xenos::CompareFunction::kAlways ||\n        description.depth_write) {\n      state_desc.DepthStencilState.DepthEnable = TRUE;\n      state_desc.DepthStencilState.DepthWriteMask =\n          description.depth_write ? D3D12_DEPTH_WRITE_MASK_ALL\n                                  : D3D12_DEPTH_WRITE_MASK_ZERO;\n      // Comparison functions are the same in Direct3D 12 but plus one (minus\n      // one, bit 0 for less, bit 1 for equal, bit 2 for greater).\n      state_desc.DepthStencilState.DepthFunc =\n          D3D12_COMPARISON_FUNC(uint32_t(D3D12_COMPARISON_FUNC_NEVER) +\n                                uint32_t(description.depth_func));\n    }\n    if (description.stencil_enable) {\n      state_desc.DepthStencilState.StencilEnable = TRUE;\n      state_desc.DepthStencilState.StencilReadMask =\n          description.stencil_read_mask;\n      state_desc.DepthStencilState.StencilWriteMask =\n          description.stencil_write_mask;\n      // Stencil operations are the same in Direct3D 12 too but plus one.\n      state_desc.DepthStencilState.FrontFace.StencilFailOp =\n          D3D12_STENCIL_OP(uint32_t(D3D12_STENCIL_OP_KEEP) +\n                           uint32_t(description.stencil_front_fail_op));\n      state_desc.DepthStencilState.FrontFace.StencilDepthFailOp =\n          D3D12_STENCIL_OP(uint32_t(D3D12_STENCIL_OP_KEEP) +\n                           uint32_t(description.stencil_front_depth_fail_op));\n      state_desc.DepthStencilState.FrontFace.StencilPassOp =\n          D3D12_STENCIL_OP(uint32_t(D3D12_STENCIL_OP_KEEP) +\n                           uint32_t(description.stencil_front_pass_op));\n      state_desc.DepthStencilState.FrontFace.StencilFunc =\n          D3D12_COMPARISON_FUNC(uint32_t(D3D12_COMPARISON_FUNC_NEVER) +\n                                uint32_t(description.stencil_front_func));\n      state_desc.DepthStencilState.BackFace.StencilFailOp =\n          D3D12_STENCIL_OP(uint32_t(D3D12_STENCIL_OP_KEEP) +\n                           uint32_t(description.stencil_back_fail_op));\n      state_desc.DepthStencilState.BackFace.StencilDepthFailOp =\n          D3D12_STENCIL_OP(uint32_t(D3D12_STENCIL_OP_KEEP) +\n                           uint32_t(description.stencil_back_depth_fail_op));\n      state_desc.DepthStencilState.BackFace.StencilPassOp =\n          D3D12_STENCIL_OP(uint32_t(D3D12_STENCIL_OP_KEEP) +\n                           uint32_t(description.stencil_back_pass_op));\n      state_desc.DepthStencilState.BackFace.StencilFunc =\n          D3D12_COMPARISON_FUNC(uint32_t(D3D12_COMPARISON_FUNC_NEVER) +\n                                uint32_t(description.stencil_back_func));\n    }\n    if (state_desc.DepthStencilState.DepthEnable ||\n        state_desc.DepthStencilState.StencilEnable) {\n      state_desc.DSVFormat = D3D12RenderTargetCache::GetDepthDSVDXGIFormat(\n          description.depth_format);\n    }\n\n    // Render targets and blending.\n    state_desc.BlendState.IndependentBlendEnable = TRUE;\n    static const D3D12_BLEND kBlendFactorMap[] = {\n        D3D12_BLEND_ZERO,          D3D12_BLEND_ONE,\n        D3D12_BLEND_SRC_COLOR,     D3D12_BLEND_INV_SRC_COLOR,\n        D3D12_BLEND_SRC_ALPHA,     D3D12_BLEND_INV_SRC_ALPHA,\n        D3D12_BLEND_DEST_COLOR,    D3D12_BLEND_INV_DEST_COLOR,\n        D3D12_BLEND_DEST_ALPHA,    D3D12_BLEND_INV_DEST_ALPHA,\n        D3D12_BLEND_BLEND_FACTOR,  D3D12_BLEND_INV_BLEND_FACTOR,\n        D3D12_BLEND_SRC_ALPHA_SAT,\n    };\n    // 8 entries for safety since 3 bits from the guest are passed directly.\n    static const D3D12_BLEND_OP kBlendOpMap[] = {\n        D3D12_BLEND_OP_ADD, D3D12_BLEND_OP_SUBTRACT,     D3D12_BLEND_OP_MIN,\n        D3D12_BLEND_OP_MAX, D3D12_BLEND_OP_REV_SUBTRACT, D3D12_BLEND_OP_ADD,\n        D3D12_BLEND_OP_ADD, D3D12_BLEND_OP_ADD};\n    for (uint32_t i = 0; i < xenos::kMaxColorRenderTargets; ++i) {\n      const PipelineRenderTarget& rt = description.render_targets[i];\n      if (!rt.used) {\n        // Null RTV descriptors can be used for slots with DXGI_FORMAT_UNKNOWN\n        // in the pipeline state.\n        state_desc.RTVFormats[i] = DXGI_FORMAT_UNKNOWN;\n        continue;\n      }\n      state_desc.NumRenderTargets = i + 1;\n      state_desc.RTVFormats[i] =\n          render_target_cache_.GetColorDrawDXGIFormat(rt.format);\n      if (state_desc.RTVFormats[i] == DXGI_FORMAT_UNKNOWN) {\n        assert_always();\n        return nullptr;\n      }\n      D3D12_RENDER_TARGET_BLEND_DESC& blend_desc =\n          state_desc.BlendState.RenderTarget[i];\n      if (rt.src_blend != PipelineBlendFactor::kOne ||\n          rt.dest_blend != PipelineBlendFactor::kZero ||\n          rt.blend_op != xenos::BlendOp::kAdd ||\n          rt.src_blend_alpha != PipelineBlendFactor::kOne ||\n          rt.dest_blend_alpha != PipelineBlendFactor::kZero ||\n          rt.blend_op_alpha != xenos::BlendOp::kAdd) {\n        blend_desc.BlendEnable = TRUE;\n        blend_desc.SrcBlend = kBlendFactorMap[uint32_t(rt.src_blend)];\n        blend_desc.DestBlend = kBlendFactorMap[uint32_t(rt.dest_blend)];\n        blend_desc.BlendOp = kBlendOpMap[uint32_t(rt.blend_op)];\n        blend_desc.SrcBlendAlpha =\n            kBlendFactorMap[uint32_t(rt.src_blend_alpha)];\n        blend_desc.DestBlendAlpha =\n            kBlendFactorMap[uint32_t(rt.dest_blend_alpha)];\n        blend_desc.BlendOpAlpha = kBlendOpMap[uint32_t(rt.blend_op_alpha)];\n      }\n      blend_desc.RenderTargetWriteMask = rt.write_mask;\n    }\n  }\n\n  // Disable rasterization if needed (parameter combinations that make no\n  // difference when rasterization is disabled have already been handled in\n  // GetCurrentStateDescription) the way it's disabled in Direct3D by design\n  // (disabling a pixel shader and depth / stencil).\n  // TODO(Triang3l): When it happens to be that a combination of parameters\n  // (no host pixel shader and depth / stencil without ROV) would disable\n  // rasterization when it's still needed (for occlusion query sample counting),\n  // ensure rasterization happens (by binding an empty pixel shader, or maybe\n  // via ForcedSampleCount when not using 2x MSAA - its requirements for\n  // OMSetRenderTargets need some investigation though).\n  if (description.cull_mode == PipelineCullMode::kDisableRasterization) {\n    state_desc.PS.pShaderBytecode = nullptr;\n    state_desc.PS.BytecodeLength = 0;\n    state_desc.DepthStencilState.DepthEnable = FALSE;\n    state_desc.DepthStencilState.StencilEnable = FALSE;\n  }\n\n  // Create the D3D12 pipeline state object.\n  ID3D12Device* device = command_processor_.GetD3D12Provider().GetDevice();\n  ID3D12PipelineState* state;\n  if (FAILED(device->CreateGraphicsPipelineState(&state_desc,\n                                                 IID_PPV_ARGS(&state)))) {\n    if (runtime_description.pixel_shader != nullptr) {\n      XELOGE(\"Failed to create graphics pipeline with VS {:016X}, PS {:016X}\",\n             runtime_description.vertex_shader->shader().ucode_data_hash(),\n             runtime_description.pixel_shader->shader().ucode_data_hash());\n    } else {\n      XELOGE(\"Failed to create graphics pipeline with VS {:016X}\",\n             runtime_description.vertex_shader->shader().ucode_data_hash());\n    }\n    return nullptr;\n  }\n  std::wstring name;\n  if (runtime_description.pixel_shader != nullptr) {\n    name = fmt::format(\n        L\"VS {:016X}, PS {:016X}\",\n        runtime_description.vertex_shader->shader().ucode_data_hash(),\n        runtime_description.pixel_shader->shader().ucode_data_hash());\n  } else {\n    name = fmt::format(\n        L\"VS {:016X}\",\n        runtime_description.vertex_shader->shader().ucode_data_hash());\n  }\n  state->SetName(name.c_str());\n  return state;\n}\n\nvoid PipelineCache::StorageWriteThread() {\n  ShaderStoredHeader shader_header;\n  // Don't leak anything in unused bits.\n  std::memset(&shader_header, 0, sizeof(shader_header));\n\n  std::vector<uint32_t> ucode_guest_endian;\n  ucode_guest_endian.reserve(0xFFFF);\n\n  bool flush_shaders = false;\n  bool flush_pipelines = false;\n\n  while (true) {\n    if (flush_shaders) {\n      flush_shaders = false;\n      assert_not_null(shader_storage_file_);\n      fflush(shader_storage_file_);\n    }\n    if (flush_pipelines) {\n      flush_pipelines = false;\n      assert_not_null(pipeline_storage_file_);\n      fflush(pipeline_storage_file_);\n    }\n\n    const Shader* shader = nullptr;\n    PipelineStoredDescription pipeline_description;\n    bool write_pipeline = false;\n    {\n      std::unique_lock<std::mutex> lock(storage_write_request_lock_);\n      if (storage_write_thread_shutdown_) {\n        return;\n      }\n      if (!storage_write_shader_queue_.empty()) {\n        shader = storage_write_shader_queue_.front();\n        storage_write_shader_queue_.pop_front();\n      } else if (storage_write_flush_shaders_) {\n        storage_write_flush_shaders_ = false;\n        flush_shaders = true;\n      }\n      if (!storage_write_pipeline_queue_.empty()) {\n        std::memcpy(&pipeline_description,\n                    &storage_write_pipeline_queue_.front(),\n                    sizeof(pipeline_description));\n        storage_write_pipeline_queue_.pop_front();\n        write_pipeline = true;\n      } else if (storage_write_flush_pipelines_) {\n        storage_write_flush_pipelines_ = false;\n        flush_pipelines = true;\n      }\n      if (!shader && !write_pipeline) {\n        storage_write_request_cond_.wait(lock);\n        continue;\n      }\n    }\n\n    if (shader) {\n      shader_header.ucode_data_hash = shader->ucode_data_hash();\n      shader_header.ucode_dword_count = shader->ucode_dword_count();\n      shader_header.type = shader->type();\n      assert_not_null(shader_storage_file_);\n      fwrite(&shader_header, sizeof(shader_header), 1, shader_storage_file_);\n      if (shader_header.ucode_dword_count) {\n        ucode_guest_endian.resize(shader_header.ucode_dword_count);\n        // Need to swap because the hash is calculated for the shader with guest\n        // endianness.\n        xe::copy_and_swap(ucode_guest_endian.data(), shader->ucode_dwords(),\n                          shader_header.ucode_dword_count);\n        fwrite(ucode_guest_endian.data(),\n               shader_header.ucode_dword_count * sizeof(uint32_t), 1,\n               shader_storage_file_);\n      }\n    }\n\n    if (write_pipeline) {\n      assert_not_null(pipeline_storage_file_);\n      fwrite(&pipeline_description, sizeof(pipeline_description), 1,\n             pipeline_storage_file_);\n    }\n  }\n}\n\nvoid PipelineCache::CreationThread(size_t thread_index) {\n  while (true) {\n    Pipeline* pipeline_to_create = nullptr;\n\n    // Check if need to shut down or set the completion event and dequeue the\n    // pipeline if there is any.\n    {\n      std::unique_lock<std::mutex> lock(creation_request_lock_);\n      if (thread_index >= creation_threads_shutdown_from_ ||\n          creation_queue_.empty()) {\n        if (creation_completion_set_event_ && creation_threads_busy_ == 0) {\n          // Last pipeline in the queue created - signal the event if requested.\n          creation_completion_set_event_ = false;\n          creation_completion_event_->Set();\n        }\n        if (thread_index >= creation_threads_shutdown_from_) {\n          return;\n        }\n        creation_request_cond_.wait(lock);\n        continue;\n      }\n      // Take the pipeline from the queue and increment the busy thread count\n      // until the pipeline is created - other threads must be able to dequeue\n      // requests, but can't set the completion event until the pipelines are\n      // fully created (rather than just started creating).\n      pipeline_to_create = creation_queue_.front();\n      creation_queue_.pop_front();\n      ++creation_threads_busy_;\n    }\n\n    // Create the D3D12 pipeline state object.\n    pipeline_to_create->state =\n        CreateD3D12Pipeline(pipeline_to_create->description);\n\n    // Pipeline created - the thread is not busy anymore, safe to set the\n    // completion event if needed (at the next iteration, or in some other\n    // thread).\n    {\n      std::lock_guard<std::mutex> lock(creation_request_lock_);\n      --creation_threads_busy_;\n    }\n  }\n}\n\nvoid PipelineCache::CreateQueuedPipelinesOnProcessorThread() {\n  assert_false(creation_threads_.empty());\n  while (true) {\n    Pipeline* pipeline_to_create;\n    {\n      std::lock_guard<std::mutex> lock(creation_request_lock_);\n      if (creation_queue_.empty()) {\n        break;\n      }\n      pipeline_to_create = creation_queue_.front();\n      creation_queue_.pop_front();\n    }\n    pipeline_to_create->state =\n        CreateD3D12Pipeline(pipeline_to_create->description);\n  }\n}\n\n}  // namespace d3d12\n}  // namespace gpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/d3d12/pipeline_cache.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_D3D12_PIPELINE_CACHE_H_\n#define XENIA_GPU_D3D12_PIPELINE_CACHE_H_\n\n#include <condition_variable>\n#include <cstdio>\n#include <deque>\n#include <functional>\n#include <memory>\n#include <mutex>\n#include <string>\n#include <thread>\n#include <unordered_map>\n#include <utility>\n#include <vector>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/hash.h\"\n#include \"xenia/base/platform.h\"\n#include \"xenia/base/string_buffer.h\"\n#include \"xenia/base/threading.h\"\n#include \"xenia/gpu/d3d12/d3d12_render_target_cache.h\"\n#include \"xenia/gpu/d3d12/d3d12_shader.h\"\n#include \"xenia/gpu/dxbc_shader_translator.h\"\n#include \"xenia/gpu/gpu_flags.h\"\n#include \"xenia/gpu/primitive_processor.h\"\n#include \"xenia/gpu/register_file.h\"\n#include \"xenia/gpu/registers.h\"\n#include \"xenia/gpu/xenos.h\"\n#include \"xenia/ui/d3d12/d3d12_api.h\"\n\nnamespace xe {\nnamespace gpu {\nnamespace d3d12 {\n\nclass D3D12CommandProcessor;\n\nclass PipelineCache {\n public:\n  static constexpr size_t kLayoutUIDEmpty = 0;\n\n  PipelineCache(D3D12CommandProcessor& command_processor,\n                const RegisterFile& register_file,\n                const D3D12RenderTargetCache& render_target_cache,\n                bool bindless_resources_used);\n  ~PipelineCache();\n\n  bool Initialize();\n  void Shutdown();\n  // No ClearCache because it's undesirable with the persistent shader storage\n  // (if the storage is reloaded, effectively nothing is cleared, while the call\n  // takes a long time, and if it's not, there will be heavy stuttering for the\n  // rest of the execution of the guest).\n\n  void InitializeShaderStorage(const std::filesystem::path& cache_root,\n                               uint32_t title_id, bool blocking);\n  void ShutdownShaderStorage();\n\n  void EndSubmission();\n  bool IsCreatingPipelines();\n\n  D3D12Shader* LoadShader(xenos::ShaderType shader_type,\n                          const uint32_t* host_address, uint32_t dword_count);\n  // Analyze shader microcode on the translator thread.\n  void AnalyzeShaderUcode(Shader& shader) {\n    shader.AnalyzeUcode(ucode_disasm_buffer_);\n  }\n\n  // Retrieves the shader modification for the current state. The shader must\n  // have microcode analyzed.\n  DxbcShaderTranslator::Modification GetCurrentVertexShaderModification(\n      const Shader& shader,\n      Shader::HostVertexShaderType host_vertex_shader_type,\n      uint32_t interpolator_mask) const;\n  DxbcShaderTranslator::Modification GetCurrentPixelShaderModification(\n      const Shader& shader, uint32_t interpolator_mask, uint32_t param_gen_pos,\n      reg::RB_DEPTHCONTROL normalized_depth_control) const;\n\n  // If draw_util::IsRasterizationPotentiallyDone is false, the pixel shader\n  // MUST be made nullptr BEFORE calling this!\n  bool ConfigurePipeline(\n      D3D12Shader::D3D12Translation* vertex_shader,\n      D3D12Shader::D3D12Translation* pixel_shader,\n      const PrimitiveProcessor::ProcessingResult& primitive_processing_result,\n      reg::RB_DEPTHCONTROL normalized_depth_control,\n      uint32_t normalized_color_mask,\n      uint32_t bound_depth_and_color_render_target_bits,\n      const uint32_t* bound_depth_and_color_render_targets_formats,\n      void** pipeline_handle_out, ID3D12RootSignature** root_signature_out);\n\n  // Returns a pipeline with deferred creation by its handle. May return nullptr\n  // if failed to create the pipeline.\n  ID3D12PipelineState* GetD3D12PipelineByHandle(void* handle) const {\n    return reinterpret_cast<const Pipeline*>(handle)->state;\n  }\n\n private:\n  XEPACKEDSTRUCT(ShaderStoredHeader, {\n    uint64_t ucode_data_hash;\n\n    uint32_t ucode_dword_count : 31;\n    xenos::ShaderType type : 1;\n\n    static constexpr uint32_t kVersion = 0x20201219;\n  });\n\n  // Update PipelineDescription::kVersion if any of the Pipeline* enums are\n  // changed!\n\n  enum class PipelineStripCutIndex : uint32_t {\n    kNone,\n    kFFFF,\n    kFFFFFFFF,\n  };\n\n  enum class PipelineTessellationMode : uint32_t {\n    kNone,\n    kDiscrete,\n    kContinuous,\n    kAdaptive,\n  };\n\n  enum class PipelinePatchType : uint32_t {\n    kNone,\n    kLine,\n    kTriangle,\n    kQuad,\n  };\n\n  enum class PipelinePrimitiveTopologyType : uint32_t {\n    kPoint,\n    kLine,\n    kTriangle,\n  };\n\n  enum class PipelineGeometryShader : uint32_t {\n    kNone,\n    kPointList,\n    kRectangleList,\n    kQuadList,\n  };\n\n  enum class PipelineCullMode : uint32_t {\n    kNone,\n    kFront,\n    kBack,\n    // Special case, handled via disabling the pixel shader and depth / stencil.\n    kDisableRasterization,\n  };\n\n  enum class PipelineBlendFactor : uint32_t {\n    kZero,\n    kOne,\n    kSrcColor,\n    kInvSrcColor,\n    kSrcAlpha,\n    kInvSrcAlpha,\n    kDestColor,\n    kInvDestColor,\n    kDestAlpha,\n    kInvDestAlpha,\n    kBlendFactor,\n    kInvBlendFactor,\n    kSrcAlphaSat,\n  };\n\n  // Update PipelineDescription::kVersion if anything is changed!\n  XEPACKEDSTRUCT(PipelineRenderTarget, {\n    uint32_t used : 1;                          // 1\n    xenos::ColorRenderTargetFormat format : 4;  // 5\n    PipelineBlendFactor src_blend : 4;          // 9\n    PipelineBlendFactor dest_blend : 4;         // 13\n    xenos::BlendOp blend_op : 3;                // 16\n    PipelineBlendFactor src_blend_alpha : 4;    // 20\n    PipelineBlendFactor dest_blend_alpha : 4;   // 24\n    xenos::BlendOp blend_op_alpha : 3;          // 27\n    uint32_t write_mask : 4;                    // 31\n  });\n\n  XEPACKEDSTRUCT(PipelineDescription, {\n    uint64_t vertex_shader_hash;\n    uint64_t vertex_shader_modification;\n    // 0 if drawing without a pixel shader.\n    uint64_t pixel_shader_hash;\n    uint64_t pixel_shader_modification;\n\n    int32_t depth_bias;\n    float depth_bias_slope_scaled;\n\n    PipelineStripCutIndex strip_cut_index : 2;  // 2\n    // PipelinePrimitiveTopologyType for a vertex shader.\n    // xenos::TessellationMode for a domain shader.\n    uint32_t primitive_topology_type_or_tessellation_mode : 2;  // 4\n    // Zero for non-kVertex host_vertex_shader_type.\n    PipelineGeometryShader geometry_shader : 2;       // 6\n    uint32_t fill_mode_wireframe : 1;                 // 7\n    PipelineCullMode cull_mode : 2;                   // 9\n    uint32_t front_counter_clockwise : 1;             // 10\n    uint32_t depth_clip : 1;                          // 11\n    xenos::MsaaSamples host_msaa_samples : 2;         // 13\n    xenos::DepthRenderTargetFormat depth_format : 1;  // 14\n    xenos::CompareFunction depth_func : 3;            // 17\n    uint32_t depth_write : 1;                         // 18\n    uint32_t stencil_enable : 1;                      // 19\n    uint32_t stencil_read_mask : 8;                   // 27\n\n    uint32_t stencil_write_mask : 8;                   // 8\n    xenos::StencilOp stencil_front_fail_op : 3;        // 11\n    xenos::StencilOp stencil_front_depth_fail_op : 3;  // 14\n    xenos::StencilOp stencil_front_pass_op : 3;        // 17\n    xenos::CompareFunction stencil_front_func : 3;     // 20\n    xenos::StencilOp stencil_back_fail_op : 3;         // 23\n    xenos::StencilOp stencil_back_depth_fail_op : 3;   // 26\n    xenos::StencilOp stencil_back_pass_op : 3;         // 29\n    xenos::CompareFunction stencil_back_func : 3;      // 32\n\n    PipelineRenderTarget render_targets[xenos::kMaxColorRenderTargets];\n\n    static constexpr uint32_t kVersion = 0x20210425;\n  });\n\n  XEPACKEDSTRUCT(PipelineStoredDescription, {\n    uint64_t description_hash;\n    PipelineDescription description;\n  });\n\n  struct PipelineRuntimeDescription {\n    ID3D12RootSignature* root_signature;\n    D3D12Shader::D3D12Translation* vertex_shader;\n    D3D12Shader::D3D12Translation* pixel_shader;\n    const std::vector<uint32_t>* geometry_shader;\n    PipelineDescription description;\n  };\n\n  union GeometryShaderKey {\n    uint32_t key;\n    struct {\n      PipelineGeometryShader type : 2;\n      uint32_t interpolator_count : 5;\n      uint32_t user_clip_plane_count : 3;\n      uint32_t user_clip_plane_cull : 1;\n      uint32_t has_vertex_kill_and : 1;\n      uint32_t has_point_size : 1;\n      uint32_t has_point_coordinates : 1;\n    };\n\n    GeometryShaderKey() : key(0) { static_assert_size(*this, sizeof(key)); }\n\n    struct Hasher {\n      size_t operator()(const GeometryShaderKey& key) const {\n        return std::hash<uint32_t>{}(key.key);\n      }\n    };\n    bool operator==(const GeometryShaderKey& other_key) const {\n      return key == other_key.key;\n    }\n    bool operator!=(const GeometryShaderKey& other_key) const {\n      return !(*this == other_key);\n    }\n  };\n\n  D3D12Shader* LoadShader(xenos::ShaderType shader_type,\n                          const uint32_t* host_address, uint32_t dword_count,\n                          uint64_t data_hash);\n\n  // Can be called from multiple threads.\n  bool TranslateAnalyzedShader(DxbcShaderTranslator& translator,\n                               D3D12Shader::D3D12Translation& translation,\n                               IDxbcConverter* dxbc_converter = nullptr,\n                               IDxcUtils* dxc_utils = nullptr,\n                               IDxcCompiler* dxc_compiler = nullptr);\n\n  // If draw_util::IsRasterizationPotentiallyDone is false, the pixel shader\n  // MUST be made nullptr BEFORE calling this! The shaders must be translated\n  // and valid.\n  bool GetCurrentStateDescription(\n      D3D12Shader::D3D12Translation* vertex_shader,\n      D3D12Shader::D3D12Translation* pixel_shader,\n      const PrimitiveProcessor::ProcessingResult& primitive_processing_result,\n      reg::RB_DEPTHCONTROL normalized_depth_control,\n      uint32_t normalized_color_mask,\n      uint32_t bound_depth_and_color_render_target_bits,\n      const uint32_t* bound_depth_and_color_render_target_formats,\n      PipelineRuntimeDescription& runtime_description_out);\n\n  static bool GetGeometryShaderKey(\n      PipelineGeometryShader geometry_shader_type,\n      DxbcShaderTranslator::Modification vertex_shader_modification,\n      DxbcShaderTranslator::Modification pixel_shader_modification,\n      GeometryShaderKey& key_out);\n  static void CreateDxbcGeometryShader(GeometryShaderKey key,\n                                       std::vector<uint32_t>& shader_out);\n  const std::vector<uint32_t>& GetGeometryShader(GeometryShaderKey key);\n\n  ID3D12PipelineState* CreateD3D12Pipeline(\n      const PipelineRuntimeDescription& runtime_description);\n\n  D3D12CommandProcessor& command_processor_;\n  const RegisterFile& register_file_;\n  const D3D12RenderTargetCache& render_target_cache_;\n  bool bindless_resources_used_;\n\n  // Temporary storage for AnalyzeUcode calls on the processor thread.\n  StringBuffer ucode_disasm_buffer_;\n  // Reusable shader translator for the processor thread.\n  std::unique_ptr<DxbcShaderTranslator> shader_translator_;\n\n  // Command processor thread DXIL conversion/disassembly interfaces, if DXIL\n  // disassembly is enabled.\n  IDxbcConverter* dxbc_converter_ = nullptr;\n  IDxcUtils* dxc_utils_ = nullptr;\n  IDxcCompiler* dxc_compiler_ = nullptr;\n\n  // Ucode hash -> shader.\n  std::unordered_map<uint64_t, D3D12Shader*, xe::hash::IdentityHasher<uint64_t>>\n      shaders_;\n\n  struct LayoutUID {\n    size_t uid;\n    size_t vector_span_offset;\n    size_t vector_span_length;\n  };\n  std::mutex layouts_mutex_;\n  // Texture binding layouts of different shaders, for obtaining layout UIDs.\n  std::vector<D3D12Shader::TextureBinding> texture_binding_layouts_;\n  // Map of texture binding layouts used by shaders, for obtaining UIDs. Keys\n  // are XXH3 hashes of layouts, values need manual collision resolution using\n  // layout_vector_offset:layout_length of texture_binding_layouts_.\n  std::unordered_multimap<uint64_t, LayoutUID,\n                          xe::hash::IdentityHasher<uint64_t>>\n      texture_binding_layout_map_;\n  // Bindless sampler indices of different shaders, for obtaining layout UIDs.\n  // For bindful, sampler count is used as the UID instead.\n  std::vector<uint32_t> bindless_sampler_layouts_;\n  // Keys are XXH3 hashes of used bindless sampler indices.\n  std::unordered_multimap<uint64_t, LayoutUID,\n                          xe::hash::IdentityHasher<uint64_t>>\n      bindless_sampler_layout_map_;\n\n  // Geometry shaders for Xenos primitive types not supported by Direct3D 12.\n  std::unordered_map<GeometryShaderKey, std::vector<uint32_t>,\n                     GeometryShaderKey::Hasher>\n      geometry_shaders_;\n\n  // Empty depth-only pixel shader for writing to depth buffer via ROV when no\n  // Xenos pixel shader provided.\n  std::vector<uint8_t> depth_only_pixel_shader_;\n\n  struct Pipeline {\n    // nullptr if creation has failed.\n    ID3D12PipelineState* state;\n    PipelineRuntimeDescription description;\n  };\n  // All previously generated pipelines identified by hash and the description.\n  std::unordered_multimap<uint64_t, Pipeline*,\n                          xe::hash::IdentityHasher<uint64_t>>\n      pipelines_;\n\n  // Previously used pipeline. This matches our current state settings and\n  // allows us to quickly(ish) reuse the pipeline if no registers have been\n  // changed.\n  Pipeline* current_pipeline_ = nullptr;\n\n  // Currently open shader storage path.\n  std::filesystem::path shader_storage_cache_root_;\n  uint32_t shader_storage_title_id_ = 0;\n\n  // Shader storage output stream, for preload in the next emulator runs.\n  FILE* shader_storage_file_ = nullptr;\n  // For only writing shaders to the currently open storage once, incremented\n  // when switching the storage.\n  uint32_t shader_storage_index_ = 0;\n  bool shader_storage_file_flush_needed_ = false;\n\n  // Pipeline storage output stream, for preload in the next emulator runs.\n  FILE* pipeline_storage_file_ = nullptr;\n  bool pipeline_storage_file_flush_needed_ = false;\n\n  // Thread for asynchronous writing to the storage streams.\n  void StorageWriteThread();\n  std::mutex storage_write_request_lock_;\n  std::condition_variable storage_write_request_cond_;\n  // Storage thread input is protected with storage_write_request_lock_, and the\n  // thread is notified about its change via storage_write_request_cond_.\n  std::deque<const Shader*> storage_write_shader_queue_;\n  std::deque<PipelineStoredDescription> storage_write_pipeline_queue_;\n  bool storage_write_flush_shaders_ = false;\n  bool storage_write_flush_pipelines_ = false;\n  bool storage_write_thread_shutdown_ = false;\n  std::unique_ptr<xe::threading::Thread> storage_write_thread_;\n\n  // Pipeline creation threads.\n  void CreationThread(size_t thread_index);\n  void CreateQueuedPipelinesOnProcessorThread();\n  std::mutex creation_request_lock_;\n  std::condition_variable creation_request_cond_;\n  // Protected with creation_request_lock_, notify_one creation_request_cond_\n  // when set.\n  std::deque<Pipeline*> creation_queue_;\n  // Number of threads that are currently creating a pipeline - incremented when\n  // a pipeline is dequeued (the completion event can't be triggered before this\n  // is zero). Protected with creation_request_lock_.\n  size_t creation_threads_busy_ = 0;\n  // Manual-reset event set when the last queued pipeline is created and there\n  // are no more pipelines to create. This is triggered by the thread creating\n  // the last pipeline.\n  std::unique_ptr<xe::threading::Event> creation_completion_event_;\n  // Whether setting the event on completion is queued. Protected with\n  // creation_request_lock_, notify_one creation_request_cond_ when set.\n  bool creation_completion_set_event_ = false;\n  // Creation threads with this index or above need to be shut down as soon as\n  // possible. Protected with creation_request_lock_, notify_all\n  // creation_request_cond_ when set.\n  size_t creation_threads_shutdown_from_ = SIZE_MAX;\n  std::vector<std::unique_ptr<xe::threading::Thread>> creation_threads_;\n};\n\n}  // namespace d3d12\n}  // namespace gpu\n}  // namespace xe\n\n#endif  // XENIA_GPU_D3D12_PIPELINE_CACHE_H_\n"
  },
  {
    "path": "src/xenia/gpu/d3d12/premake5.lua",
    "content": "project_root = \"../../../..\"\ninclude(project_root..\"/tools/build\")\n\ngroup(\"src\")\nproject(\"xenia-gpu-d3d12\")\n  uuid(\"c057eae4-e7bb-4113-9a69-1fe07b735c49\")\n  kind(\"StaticLib\")\n  language(\"C++\")\n  links({\n    \"fmt\",\n    \"xenia-base\",\n    \"xenia-gpu\",\n    \"xenia-ui\",\n    \"xenia-ui-d3d12\",\n    \"xxhash\",\n  })\n  local_platform_files()\n  files({\n    \"../shaders/bytecode/d3d12_5_1/*.h\",\n  })\n\ngroup(\"src\")\nproject(\"xenia-gpu-d3d12-trace-viewer\")\n  uuid(\"7b5b9fcb-7bf1-43ff-a774-d4c41c8706be\")\n  single_library_windowed_app_kind()\n  language(\"C++\")\n  links({\n    \"xenia-apu\",\n    \"xenia-apu-nop\",\n    \"xenia-base\",\n    \"xenia-core\",\n    \"xenia-cpu\",\n    \"xenia-gpu\",\n    \"xenia-gpu-d3d12\",\n    \"xenia-hid\",\n    \"xenia-hid-nop\",\n    \"xenia-kernel\",\n    \"xenia-ui\",\n    \"xenia-ui-d3d12\",\n    \"xenia-vfs\",\n  })\n  links({\n    \"aes_128\",\n    \"capstone\",\n    \"dxbc\",\n    \"fmt\",\n    \"imgui\",\n    \"libavcodec\",\n    \"libavutil\",\n    \"mspack\",\n    \"snappy\",\n    \"xxhash\",\n  })\n  files({\n    \"d3d12_trace_viewer_main.cc\",\n    \"../../ui/windowed_app_main_\"..platform_suffix..\".cc\",\n  })\n  -- Only create the .user file if it doesn't already exist.\n  local user_file = project_root..\"/build/xenia-gpu-d3d12-trace-viewer.vcxproj.user\"\n  if not os.isfile(user_file) then\n    debugdir(project_root)\n    debugargs({\n      \"2>&1\",\n      \"1>scratch/stdout-trace-viewer.txt\",\n    })\n  end\n\n  filter(\"architecture:x86_64\")\n    links({\n      \"xenia-cpu-backend-x64\",\n    })\n\ngroup(\"src\")\nproject(\"xenia-gpu-d3d12-trace-dump\")\n  uuid(\"686b859c-0046-44c4-a02c-41fc3fb75698\")\n  kind(\"ConsoleApp\")\n  language(\"C++\")\n  links({\n    \"xenia-apu\",\n    \"xenia-apu-nop\",\n    \"xenia-base\",\n    \"xenia-core\",\n    \"xenia-cpu\",\n    \"xenia-gpu\",\n    \"xenia-gpu-d3d12\",\n    \"xenia-hid\",\n    \"xenia-hid-nop\",\n    \"xenia-kernel\",\n    \"xenia-ui\",\n    \"xenia-ui-d3d12\",\n    \"xenia-vfs\",\n  })\n  links({\n    \"aes_128\",\n    \"capstone\",\n    \"dxbc\",\n    \"fmt\",\n    \"imgui\",\n    \"libavcodec\",\n    \"libavutil\",\n    \"mspack\",\n    \"snappy\",\n    \"xxhash\",\n  })\n  files({\n    \"d3d12_trace_dump_main.cc\",\n    \"../../base/console_app_main_\"..platform_suffix..\".cc\",\n  })\n  -- Only create the .user file if it doesn't already exist.\n  local user_file = project_root..\"/build/xenia-gpu-d3d12-trace-dump.vcxproj.user\"\n  if not os.isfile(user_file) then\n    debugdir(project_root)\n    debugargs({\n      \"2>&1\",\n      \"1>scratch/stdout-trace-dump.txt\",\n    })\n  end\n\n  filter(\"architecture:x86_64\")\n    links({\n      \"xenia-cpu-backend-x64\",\n    })\n"
  },
  {
    "path": "src/xenia/gpu/draw_extent_estimator.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/draw_extent_estimator.h\"\n\n#include <algorithm>\n#include <cfloat>\n#include <cstdint>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/cvar.h\"\n#include \"xenia/base/memory.h\"\n#include \"xenia/base/profiling.h\"\n#include \"xenia/gpu/registers.h\"\n#include \"xenia/gpu/ucode.h\"\n#include \"xenia/gpu/xenos.h\"\n#include \"xenia/ui/graphics_util.h\"\n\nDEFINE_bool(\n    execute_unclipped_draw_vs_on_cpu, true,\n    \"Execute the vertex shader for draws with clipping disabled, primarily \"\n    \"screen-space draws (such as clears), on the CPU when possible to estimate \"\n    \"the extent of the EDRAM involved in the draw.\\n\"\n    \"Enabling this may significantly improve GPU performance as otherwise up \"\n    \"to the entire EDRAM may be considered used in draws without clipping, \"\n    \"potentially resulting in spurious EDRAM range ownership transfer round \"\n    \"trips between host render targets.\\n\"\n    \"Also, on hosts where certain render target formats have to be emulated in \"\n    \"a lossy way (for instance, 16-bit fixed-point via 16-bit floating-point), \"\n    \"this prevents corruption of other render targets located after the \"\n    \"current ones in the EDRAM by lossy range ownership transfers done for \"\n    \"those draws.\",\n    \"GPU\");\nDEFINE_bool(\n    execute_unclipped_draw_vs_on_cpu_with_scissor, false,\n    \"Don't restrict the usage of execute_unclipped_draw_vs_on_cpu to only \"\n    \"non-scissored draws (with the right and the bottom sides of the scissor \"\n    \"rectangle at 8192 or beyond) even though if the scissor rectangle is \"\n    \"present, it's usually sufficient for esimating the height of the render \"\n    \"target.\\n\"\n    \"Enabling this may cause excessive processing of vertices on the CPU, as \"\n    \"some games draw rectangles (for their UI, for instance) without clipping, \"\n    \"but with a proper scissor rectangle.\",\n    \"GPU\");\n\nnamespace xe {\nnamespace gpu {\n\nvoid DrawExtentEstimator::PositionYExportSink::Export(\n    ucode::ExportRegister export_register, const float* value,\n    uint32_t value_mask) {\n  if (export_register == ucode::ExportRegister::kVSPosition) {\n    if (value_mask & 0b0010) {\n      position_y_ = value[1];\n    }\n    if (value_mask & 0b1000) {\n      position_w_ = value[3];\n    }\n  } else if (export_register ==\n             ucode::ExportRegister::kVSPointSizeEdgeFlagKillVertex) {\n    if (value_mask & 0b0001) {\n      point_size_ = value[0];\n    }\n    if (value_mask & 0b0100) {\n      vertex_kill_ = xe::memory::Reinterpret<uint32_t>(value[2]);\n    }\n  }\n}\n\nuint32_t DrawExtentEstimator::EstimateVertexMaxY(const Shader& vertex_shader) {\n  SCOPE_profile_cpu_f(\"gpu\");\n\n  const RegisterFile& regs = register_file_;\n\n  auto vgt_draw_initiator = regs.Get<reg::VGT_DRAW_INITIATOR>();\n  if (!vgt_draw_initiator.num_indices) {\n    return 0;\n  }\n  if (vgt_draw_initiator.source_select != xenos::SourceSelect::kDMA &&\n      vgt_draw_initiator.source_select != xenos::SourceSelect::kAutoIndex) {\n    // TODO(Triang3l): Support immediate indices.\n    return xenos::kTexture2DCubeMaxWidthHeight;\n  }\n\n  // Not reproducing tessellation.\n  if (xenos::IsMajorModeExplicit(vgt_draw_initiator.major_mode,\n                                 vgt_draw_initiator.prim_type) &&\n      regs.Get<reg::VGT_OUTPUT_PATH_CNTL>().path_select ==\n          xenos::VGTOutputPath::kTessellationEnable) {\n    return xenos::kTexture2DCubeMaxWidthHeight;\n  }\n\n  assert_true(vertex_shader.type() == xenos::ShaderType::kVertex);\n  assert_true(vertex_shader.is_ucode_analyzed());\n  if (!ShaderInterpreter::CanInterpretShader(vertex_shader)) {\n    return xenos::kTexture2DCubeMaxWidthHeight;\n  }\n\n  auto vgt_dma_size = regs.Get<reg::VGT_DMA_SIZE>();\n  union {\n    const void* index_buffer;\n    const uint16_t* index_buffer_16;\n    const uint32_t* index_buffer_32;\n  };\n  xenos::Endian index_endian = vgt_dma_size.swap_mode;\n  if (vgt_draw_initiator.source_select == xenos::SourceSelect::kDMA) {\n    xenos::IndexFormat index_format = vgt_draw_initiator.index_size;\n    uint32_t index_buffer_base = regs[XE_GPU_REG_VGT_DMA_BASE];\n    uint32_t index_buffer_read_count =\n        std::min(uint32_t(vgt_draw_initiator.num_indices),\n                 uint32_t(vgt_dma_size.num_words));\n    if (vgt_draw_initiator.index_size == xenos::IndexFormat::kInt16) {\n      // Handle the index endianness to same way as the PrimitiveProcessor.\n      if (index_endian == xenos::Endian::k8in32) {\n        index_endian = xenos::Endian::k8in16;\n      } else if (index_endian == xenos::Endian::k16in32) {\n        index_endian = xenos::Endian::kNone;\n      }\n      index_buffer_base &= ~uint32_t(sizeof(uint16_t) - 1);\n      if (trace_writer_) {\n        trace_writer_->WriteMemoryRead(\n            index_buffer_base, sizeof(uint16_t) * index_buffer_read_count);\n      }\n    } else {\n      assert_true(vgt_draw_initiator.index_size == xenos::IndexFormat::kInt32);\n      index_buffer_base &= ~uint32_t(sizeof(uint32_t) - 1);\n      if (trace_writer_) {\n        trace_writer_->WriteMemoryRead(\n            index_buffer_base, sizeof(uint32_t) * index_buffer_read_count);\n      }\n    }\n    index_buffer = memory_.TranslatePhysical(index_buffer_base);\n  }\n  auto pa_su_sc_mode_cntl = regs.Get<reg::PA_SU_SC_MODE_CNTL>();\n  uint32_t reset_index =\n      regs.Get<reg::VGT_MULTI_PRIM_IB_RESET_INDX>().reset_indx;\n  uint32_t index_offset = regs.Get<reg::VGT_INDX_OFFSET>().indx_offset;\n  uint32_t min_index = regs.Get<reg::VGT_MIN_VTX_INDX>().min_indx;\n  uint32_t max_index = regs.Get<reg::VGT_MAX_VTX_INDX>().max_indx;\n\n  auto pa_cl_vte_cntl = regs.Get<reg::PA_CL_VTE_CNTL>();\n  float viewport_y_scale = pa_cl_vte_cntl.vport_y_scale_ena\n                               ? regs.Get<float>(XE_GPU_REG_PA_CL_VPORT_YSCALE)\n                               : 1.0f;\n  float viewport_y_offset =\n      pa_cl_vte_cntl.vport_y_offset_ena\n          ? regs.Get<float>(XE_GPU_REG_PA_CL_VPORT_YOFFSET)\n          : 0.0f;\n\n  int32_t point_vertex_min_diameter_float = 0;\n  int32_t point_vertex_max_diameter_float = 0;\n  float point_constant_radius_y = 0.0f;\n  if (vgt_draw_initiator.prim_type == xenos::PrimitiveType::kPointList) {\n    auto pa_su_point_minmax = regs.Get<reg::PA_SU_POINT_MINMAX>();\n    point_vertex_min_diameter_float = xe::memory::Reinterpret<int32_t>(\n        float(pa_su_point_minmax.min_size) * (2.0f / 16.0f));\n    point_vertex_max_diameter_float = xe::memory::Reinterpret<int32_t>(\n        float(pa_su_point_minmax.max_size) * (2.0f / 16.0f));\n    point_constant_radius_y =\n        float(regs.Get<reg::PA_SU_POINT_SIZE>().height) * (1.0f / 16.0f);\n  }\n\n  float max_y = -FLT_MAX;\n\n  shader_interpreter_.SetShader(vertex_shader);\n\n  PositionYExportSink position_y_export_sink;\n  shader_interpreter_.SetExportSink(&position_y_export_sink);\n  for (uint32_t i = 0; i < vgt_draw_initiator.num_indices; ++i) {\n    uint32_t vertex_index;\n    if (vgt_draw_initiator.source_select == xenos::SourceSelect::kDMA) {\n      if (i < vgt_dma_size.num_words) {\n        if (vgt_draw_initiator.index_size == xenos::IndexFormat::kInt16) {\n          vertex_index = index_buffer_16[i];\n        } else {\n          vertex_index = index_buffer_32[i];\n        }\n        // The Xenos only uses 24 bits of the index (reset_indx is 24-bit).\n        vertex_index = xenos::GpuSwap(vertex_index, index_endian) & 0xFFFFFF;\n      } else {\n        vertex_index = 0;\n      }\n      if (pa_su_sc_mode_cntl.multi_prim_ib_ena && vertex_index == reset_index) {\n        continue;\n      }\n    } else {\n      assert_true(vgt_draw_initiator.source_select ==\n                  xenos::SourceSelect::kAutoIndex);\n      vertex_index = i;\n    }\n    vertex_index =\n        std::min(max_index,\n                 std::max(min_index, (vertex_index + index_offset) & 0xFFFFFF));\n\n    position_y_export_sink.Reset();\n\n    shader_interpreter_.temp_registers()[0] = float(vertex_index);\n    shader_interpreter_.Execute();\n\n    if (position_y_export_sink.vertex_kill().has_value() &&\n        (position_y_export_sink.vertex_kill().value() & ~(UINT32_C(1) << 31))) {\n      continue;\n    }\n    if (!position_y_export_sink.position_y().has_value()) {\n      continue;\n    }\n    float vertex_y = position_y_export_sink.position_y().value();\n    if (!pa_cl_vte_cntl.vtx_xy_fmt) {\n      if (!position_y_export_sink.position_w().has_value()) {\n        continue;\n      }\n      vertex_y /= position_y_export_sink.position_w().value();\n    }\n\n    vertex_y = vertex_y * viewport_y_scale + viewport_y_offset;\n\n    if (vgt_draw_initiator.prim_type == xenos::PrimitiveType::kPointList) {\n      float point_radius_y;\n      if (position_y_export_sink.point_size().has_value()) {\n        // Vertex-specified diameter. Clamped effectively as a signed integer in\n        // the hardware, -NaN, -Infinity ... -0 to the minimum, +Infinity, +NaN\n        // to the maximum.\n        point_radius_y =\n            0.5f *\n            xe::memory::Reinterpret<float>(std::min(\n                point_vertex_max_diameter_float,\n                std::max(point_vertex_min_diameter_float,\n                         xe::memory::Reinterpret<int32_t>(\n                             position_y_export_sink.point_size().value()))));\n      } else {\n        // Constant radius.\n        point_radius_y = point_constant_radius_y;\n      }\n      vertex_y += point_radius_y;\n    }\n\n    // std::max is `a < b ? b : a`, thus in case of NaN, the first argument is\n    // always returned - max_y, which is initialized to a normalized value.\n    max_y = std::max(max_y, vertex_y);\n  }\n  shader_interpreter_.SetExportSink(nullptr);\n\n  int32_t max_y_24p8 = ui::FloatToD3D11Fixed16p8(max_y);\n  // 16p8 range is -32768 to 32767+255/256, but it's stored as uint32_t here,\n  // as 24p8, so overflowing up to -8388608 to 8388608+255/256 is safe. The\n  // range of the window offset plus the half-pixel offset is -16384 to 16384.5,\n  // so it's safe to add both - adding it will neither move the 16p8 clamping\n  // bounds -32768 and 32767+255/256 into the 0...8192 screen space range, nor\n  // cause 24p8 overflow.\n  if (regs.Get<reg::PA_SU_VTX_CNTL>().pix_center ==\n      xenos::PixelCenter::kD3DZero) {\n    max_y_24p8 += 128;\n  }\n  if (pa_su_sc_mode_cntl.vtx_window_offset_enable) {\n    max_y_24p8 += regs.Get<reg::PA_SC_WINDOW_OFFSET>().window_y_offset * 256;\n  }\n  // Top-left rule - .5 exclusive without MSAA, 1. exclusive with MSAA.\n  auto rb_surface_info = regs.Get<reg::RB_SURFACE_INFO>();\n  return (uint32_t(std::max(int32_t(0), max_y_24p8)) +\n          ((rb_surface_info.msaa_samples == xenos::MsaaSamples::k1X) ? 127\n                                                                     : 255)) >>\n         8;\n}\n\nuint32_t DrawExtentEstimator::EstimateMaxY(bool try_to_estimate_vertex_max_y,\n                                           const Shader& vertex_shader) {\n  SCOPE_profile_cpu_f(\"gpu\");\n\n  const RegisterFile& regs = register_file_;\n\n  auto pa_sc_window_offset = regs.Get<reg::PA_SC_WINDOW_OFFSET>();\n  int32_t window_y_offset = pa_sc_window_offset.window_y_offset;\n\n  // Scissor.\n  auto pa_sc_window_scissor_br = regs.Get<reg::PA_SC_WINDOW_SCISSOR_BR>();\n  int32_t scissor_bottom = int32_t(pa_sc_window_scissor_br.br_y);\n  bool scissor_window_offset =\n      !regs.Get<reg::PA_SC_WINDOW_SCISSOR_TL>().window_offset_disable;\n  if (scissor_window_offset) {\n    scissor_bottom += window_y_offset;\n  }\n  auto pa_sc_screen_scissor_br = regs.Get<reg::PA_SC_SCREEN_SCISSOR_BR>();\n  scissor_bottom =\n      std::min(scissor_bottom, int32_t(pa_sc_screen_scissor_br.br_y));\n  uint32_t max_y = uint32_t(std::max(scissor_bottom, int32_t(0)));\n\n  if (regs.Get<reg::PA_CL_CLIP_CNTL>().clip_disable) {\n    // Actual extent from the vertices.\n    if (try_to_estimate_vertex_max_y &&\n        cvars::execute_unclipped_draw_vs_on_cpu) {\n      bool estimate_vertex_max_y;\n      if (cvars::execute_unclipped_draw_vs_on_cpu_with_scissor) {\n        estimate_vertex_max_y = true;\n      } else {\n        estimate_vertex_max_y = false;\n        if (scissor_bottom >= xenos::kTexture2DCubeMaxWidthHeight) {\n          // Handle just the usual special 8192x8192 case in Direct3D 9 - 8192\n          // may be a normal render target height (80x8192 is well within the\n          // EDRAM size, for instance), no need to process the vertices on the\n          // CPU in this case.\n          int32_t scissor_right = int32_t(pa_sc_window_scissor_br.br_x);\n          if (scissor_window_offset) {\n            scissor_right += pa_sc_window_offset.window_x_offset;\n          }\n          scissor_right =\n              std::min(scissor_right, int32_t(pa_sc_screen_scissor_br.br_x));\n          if (scissor_right >= xenos::kTexture2DCubeMaxWidthHeight) {\n            estimate_vertex_max_y = true;\n          }\n        }\n      }\n      if (estimate_vertex_max_y) {\n        max_y = std::min(max_y, EstimateVertexMaxY(vertex_shader));\n      }\n    }\n  } else {\n    // Viewport. Though the Xenos itself doesn't have an implicit viewport\n    // scissor (it's set by Direct3D 9 when a viewport is used), on hosts, it\n    // usually exists and can't be disabled.\n    auto pa_cl_vte_cntl = regs.Get<reg::PA_CL_VTE_CNTL>();\n    float viewport_bottom = 0.0f;\n    // First calculate all the integer.0 or integer.5 offsetting exactly at full\n    // precision.\n    if (regs.Get<reg::PA_SU_SC_MODE_CNTL>().vtx_window_offset_enable) {\n      viewport_bottom += float(window_y_offset);\n    }\n    if (regs.Get<reg::PA_SU_VTX_CNTL>().pix_center ==\n        xenos::PixelCenter::kD3DZero) {\n      viewport_bottom += 0.5f;\n    }\n    // Then apply the floating-point viewport offset.\n    if (pa_cl_vte_cntl.vport_y_offset_ena) {\n      viewport_bottom += regs.Get<float>(XE_GPU_REG_PA_CL_VPORT_YOFFSET);\n    }\n    viewport_bottom +=\n        pa_cl_vte_cntl.vport_y_scale_ena\n            ? std::abs(regs.Get<float>(XE_GPU_REG_PA_CL_VPORT_YSCALE))\n            : 1.0f;\n    // Using floor, or, rather, truncation (because maxing with zero anyway)\n    // similar to how viewport scissoring behaves on real AMD, Intel and Nvidia\n    // GPUs on Direct3D 12 (but not WARP), also like in\n    // draw_util::GetHostViewportInfo.\n    // max(0.0f, viewport_bottom) to drop NaN and < 0 - max picks the first\n    // argument in the !(a < b) case (always for NaN), min as float (max_y is\n    // well below 2^24) to safely drop very large values.\n    max_y = uint32_t(std::min(float(max_y), std::max(0.0f, viewport_bottom)));\n  }\n\n  return max_y;\n}\n\n}  // namespace gpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/draw_extent_estimator.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_DRAW_EXTENT_ESTIMATOR_H_\n#define XENIA_GPU_DRAW_EXTENT_ESTIMATOR_H_\n\n#include <cstdint>\n#include <optional>\n\n#include \"xenia/gpu/register_file.h\"\n#include \"xenia/gpu/shader.h\"\n#include \"xenia/gpu/shader_interpreter.h\"\n#include \"xenia/gpu/trace_writer.h\"\n#include \"xenia/memory.h\"\n\nnamespace xe {\nnamespace gpu {\n\nclass DrawExtentEstimator {\n public:\n  DrawExtentEstimator(const RegisterFile& register_file, const Memory& memory,\n                      TraceWriter* trace_writer)\n      : register_file_(register_file),\n        memory_(memory),\n        trace_writer_(trace_writer),\n        shader_interpreter_(register_file, memory) {\n    shader_interpreter_.SetTraceWriter(trace_writer);\n  }\n\n  // The shader must have its ucode analyzed.\n  uint32_t EstimateVertexMaxY(const Shader& vertex_shader);\n  uint32_t EstimateMaxY(bool try_to_estimate_vertex_max_y,\n                        const Shader& vertex_shader);\n\n private:\n  class PositionYExportSink : public ShaderInterpreter::ExportSink {\n   public:\n    void Export(ucode::ExportRegister export_register, const float* value,\n                uint32_t value_mask) override;\n\n    void Reset() {\n      position_y_.reset();\n      position_w_.reset();\n      point_size_.reset();\n      vertex_kill_.reset();\n    }\n\n    const std::optional<float>& position_y() const { return position_y_; }\n    const std::optional<float>& position_w() const { return position_w_; }\n    const std::optional<float>& point_size() const { return point_size_; }\n    const std::optional<uint32_t>& vertex_kill() const { return vertex_kill_; }\n\n   private:\n    std::optional<float> position_y_;\n    std::optional<float> position_w_;\n    std::optional<float> point_size_;\n    std::optional<uint32_t> vertex_kill_;\n  };\n\n  const RegisterFile& register_file_;\n  const Memory& memory_;\n  TraceWriter* trace_writer_;\n\n  ShaderInterpreter shader_interpreter_;\n};\n\n}  // namespace gpu\n}  // namespace xe\n\n#endif  // XENIA_GPU_DRAW_EXTENT_ESTIMATOR_H_\n"
  },
  {
    "path": "src/xenia/gpu/draw_util.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2023 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/draw_util.h\"\n\n#include <algorithm>\n#include <cmath>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/cvar.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/memory.h\"\n#include \"xenia/gpu/gpu_flags.h\"\n#include \"xenia/gpu/registers.h\"\n#include \"xenia/gpu/texture_address.h\"\n#include \"xenia/gpu/texture_cache.h\"\n#include \"xenia/gpu/texture_info.h\"\n#include \"xenia/gpu/texture_util.h\"\n#include \"xenia/gpu/xenos.h\"\n#include \"xenia/ui/graphics_util.h\"\n\n// Very prominent in 545407F2.\nDEFINE_bool(\n    resolve_resolution_scale_fill_half_pixel_offset, true,\n    \"When using resolution scaling, apply the hack that stretches the first \"\n    \"surely covered host pixel in the left and top sides of render target \"\n    \"resolve areas to eliminate the gap caused by the half-pixel offset (this \"\n    \"is necessary for certain games to display the scene graphics).\",\n    \"GPU\");\n\nnamespace xe {\nnamespace gpu {\nnamespace draw_util {\n\nbool IsRasterizationPotentiallyDone(const RegisterFile& regs,\n                                    bool primitive_polygonal) {\n  // TODO(Triang3l): Investigate EdramMode::kNoOperation better, with respect to\n  // sample counting. Let's assume sample counting is a part of depth / stencil,\n  // thus disabled too.\n  xenos::EdramMode edram_mode = regs.Get<reg::RB_MODECONTROL>().edram_mode;\n  if (edram_mode != xenos::EdramMode::kColorDepth &&\n      edram_mode != xenos::EdramMode::kDepthOnly) {\n    return false;\n  }\n  if (regs.Get<reg::SQ_PROGRAM_CNTL>().vs_export_mode ==\n          xenos::VertexShaderExportMode::kMultipass ||\n      !regs.Get<reg::RB_SURFACE_INFO>().surface_pitch) {\n    return false;\n  }\n  if (primitive_polygonal) {\n    auto pa_su_sc_mode_cntl = regs.Get<reg::PA_SU_SC_MODE_CNTL>();\n    if (pa_su_sc_mode_cntl.cull_front && pa_su_sc_mode_cntl.cull_back) {\n      // Both faces are culled.\n      return false;\n    }\n  }\n  return true;\n}\n\nreg::RB_DEPTHCONTROL GetNormalizedDepthControl(const RegisterFile& regs) {\n  xenos::EdramMode edram_mode = regs.Get<reg::RB_MODECONTROL>().edram_mode;\n  if (edram_mode != xenos::EdramMode::kColorDepth &&\n      edram_mode != xenos::EdramMode::kDepthOnly) {\n    // Both depth and stencil disabled (EDRAM depth and stencil ignored).\n    reg::RB_DEPTHCONTROL disabled;\n    disabled.value = 0;\n    return disabled;\n  }\n  reg::RB_DEPTHCONTROL depthcontrol = regs.Get<reg::RB_DEPTHCONTROL>();\n  // For more reliable skipping of depth render target management for draws not\n  // requiring depth.\n  if (depthcontrol.z_enable && !depthcontrol.z_write_enable &&\n      depthcontrol.zfunc == xenos::CompareFunction::kAlways) {\n    depthcontrol.z_enable = 0;\n  }\n  // Stencil is more complex and is expected to be usually enabled explicitly\n  // when needed.\n  return depthcontrol;\n}\n\n// https://docs.microsoft.com/en-us/windows/win32/api/d3d11/ne-d3d11-d3d11_standard_multisample_quality_levels\nconst int8_t kD3D10StandardSamplePositions2x[2][2] = {{4, 4}, {-4, -4}};\nconst int8_t kD3D10StandardSamplePositions4x[4][2] = {\n    {-2, -6}, {6, -2}, {-6, 2}, {2, 6}};\n\nvoid GetPreferredFacePolygonOffset(const RegisterFile& regs,\n                                   bool primitive_polygonal, float& scale_out,\n                                   float& offset_out) {\n  float scale = 0.0f, offset = 0.0f;\n  auto pa_su_sc_mode_cntl = regs.Get<reg::PA_SU_SC_MODE_CNTL>();\n  if (primitive_polygonal) {\n    // Prefer the front polygon offset because in general, front faces are the\n    // ones that are rendered (except for shadow volumes).\n    if (pa_su_sc_mode_cntl.poly_offset_front_enable &&\n        !pa_su_sc_mode_cntl.cull_front) {\n      scale = regs.Get<float>(XE_GPU_REG_PA_SU_POLY_OFFSET_FRONT_SCALE);\n      offset = regs.Get<float>(XE_GPU_REG_PA_SU_POLY_OFFSET_FRONT_OFFSET);\n    }\n    if (pa_su_sc_mode_cntl.poly_offset_back_enable &&\n        !pa_su_sc_mode_cntl.cull_back && !scale && !offset) {\n      scale = regs.Get<float>(XE_GPU_REG_PA_SU_POLY_OFFSET_BACK_SCALE);\n      offset = regs.Get<float>(XE_GPU_REG_PA_SU_POLY_OFFSET_BACK_OFFSET);\n    }\n  } else {\n    // Non-triangle primitives use the front offset, but it's toggled via\n    // poly_offset_para_enable.\n    if (pa_su_sc_mode_cntl.poly_offset_para_enable) {\n      scale = regs.Get<float>(XE_GPU_REG_PA_SU_POLY_OFFSET_FRONT_SCALE);\n      offset = regs.Get<float>(XE_GPU_REG_PA_SU_POLY_OFFSET_FRONT_OFFSET);\n    }\n  }\n  scale_out = scale;\n  offset_out = offset;\n}\n\nbool IsPixelShaderNeededWithRasterization(const Shader& shader,\n                                          const RegisterFile& regs) {\n  assert_true(shader.type() == xenos::ShaderType::kPixel);\n  assert_true(shader.is_ucode_analyzed());\n\n  // See xenos::EdramMode for explanation why the pixel shader is only used when\n  // it's kColorDepth here.\n  if (regs.Get<reg::RB_MODECONTROL>().edram_mode !=\n      xenos::EdramMode::kColorDepth) {\n    return false;\n  }\n\n  // Discarding (explicitly or through alphatest or alpha to coverage) has side\n  // effects on pixel counting.\n  //\n  // Depth output only really matters if depth test is active, but it's used\n  // extremely rarely, and pretty much always intentionally - for simplicity,\n  // consider it as always mattering.\n  //\n  // Memory export is an obvious intentional side effect.\n  if (shader.kills_pixels() || shader.writes_depth() ||\n      shader.memexport_eM_written() ||\n      (shader.writes_color_target(0) &&\n       DoesCoverageDependOnAlpha(regs.Get<reg::RB_COLORCONTROL>()))) {\n    return true;\n  }\n\n  // Check if a color target is actually written.\n  uint32_t rb_color_mask = regs[XE_GPU_REG_RB_COLOR_MASK];\n  uint32_t rts_remaining = shader.writes_color_targets();\n  uint32_t rt_index;\n  while (xe::bit_scan_forward(rts_remaining, &rt_index)) {\n    rts_remaining &= ~(uint32_t(1) << rt_index);\n    uint32_t format_component_count = GetColorRenderTargetFormatComponentCount(\n        regs.Get<reg::RB_COLOR_INFO>(\n                reg::RB_COLOR_INFO::rt_register_indices[rt_index])\n            .color_format);\n    if ((rb_color_mask >> (rt_index * 4)) &\n        ((uint32_t(1) << format_component_count) - 1)) {\n      return true;\n    }\n  }\n\n  // Only depth / stencil passthrough potentially.\n  return false;\n}\n\nvoid GetHostViewportInfo(const RegisterFile& regs,\n                         uint32_t draw_resolution_scale_x,\n                         uint32_t draw_resolution_scale_y,\n                         bool origin_bottom_left, uint32_t x_max,\n                         uint32_t y_max, bool allow_reverse_z,\n                         reg::RB_DEPTHCONTROL normalized_depth_control,\n                         bool convert_z_to_float24, bool full_float24_in_0_to_1,\n                         bool pixel_shader_writes_depth,\n                         ViewportInfo& viewport_info_out) {\n  assert_not_zero(draw_resolution_scale_x);\n  assert_not_zero(draw_resolution_scale_y);\n\n  // A vertex position goes the following path:\n  //\n  // = Vertex shader output in clip space, (-w, -w, 0) ... (w, w, w) for\n  //   Direct3D or (-w, -w, -w) ... (w, w, w) for OpenGL.\n  // > Clipping to the boundaries of the clip space if enabled.\n  // > Division by W if not pre-divided.\n  // = Normalized device coordinates, (-1, -1, 0) ... (1, 1, 1) for Direct3D or\n  //   (-1, -1, -1) ... (1, 1, 1) for OpenGL.\n  // > Viewport scaling.\n  // > Viewport, window and half-pixel offsetting.\n  // = Actual position in render target pixels used for rasterization and depth\n  //   buffer coordinates.\n  //\n  // On modern PC graphics APIs, all drawing is done with clipping enabled (only\n  // Z clipping can be replaced with viewport depth range clamping).\n  //\n  // On the Xbox 360, however, there are two cases:\n  //\n  // - Clipping is enabled:\n  //\n  //   Drawing \"as normal\", primarily for the game world. Draws are clipped to\n  //   the (-w, -w, 0) ... (w, w, w) or (-w, -w, -w) ... (w, w, w) clip space.\n  //\n  //   Ideally all offsets in pixels (window offset, half-pixel offset) are\n  //   post-clip, and thus they would need to be applied via the host viewport\n  //   (also the Direct3D 11.3 specification defines this as the correct way of\n  //   reproducing the original Direct3D 9 half-pixel offset behavior).\n  //\n  //   However, in reality, only WARP actually truly clips to -W...W, with the\n  //   viewport fractional offset actually accurately making samples outside the\n  //   fractional rectangle unable to be covered. AMD, Intel and Nvidia, in\n  //   Direct3D 12, all don't truly clip even a really huge primitive to -W...W.\n  //   Instead, primitives still overflow the fractional rectangle and cover\n  //   samples outside of it. The actual viewport scissor is floor(TopLeftX,\n  //   TopLeftY) ... floor(TopLeftX + Width, TopLeftY + Height), with flooring\n  //   and addition in float32 (with 0x3F7FFFFF TopLeftXY, or 1.0f - ULP, all\n  //   the samples in the top row / left column can be covered, while with\n  //   0x3F800000, or 1.0f, none of them can be).\n  //\n  //   We are reproducing the same behavior here - what would happen if we'd be\n  //   passing the guest values directly to Direct3D 12. Also, for consistency\n  //   across hardware and APIs (especially Vulkan with viewportSubPixelBits\n  //   being 0 rather than at least 8 on some devices - Arm Mali, Imagination\n  //   PowerVR), and for simplicity of math, and also for exact calculations in\n  //   bounds checking in validation layers of the host APIs, we are returning\n  //   integer viewport coordinates, handling the fractional offset in the\n  //   vertex shaders instead, via ndc_scale and ndc_offset - it shouldn't\n  //   significantly affect precision that we will be doing the offsetting in\n  //   W-scaled rather than W-divided units, the ratios of exponents involved in\n  //   the calculations stay the same, and everything ends up being 16.8 anyway\n  //   on most hardware, so small precision differences are very unlikely to\n  //   affect coverage.\n  //\n  // FIXME(Triang3l): Overestimate or more properly round the viewport scissor\n  // boundaries if this flooring causes gaps on the bottom / right side in real\n  // games if any are found using fractional viewport coordinates. Viewport\n  // scissoring is not an inherent result of the viewport scale / offset, these\n  // are used merely for transformation of coordinates; rather, it's done by\n  // intersecting the viewport and scissor rectangles in the guest driver and\n  // writing the common portion to PA_SC_WINDOW_SCISSOR, so how the scissor is\n  // computed for a fractional viewport is entirely up to the guest.\n  //\n  //   Even though Xbox 360 games are designed for Direct3D, with 0...W range of\n  //   Z in clip space, the GPU also allows -W...W. Since Xenia is not targeting\n  //   OpenGL (where it would be toggled via glClipControl - or, on ES, it would\n  //   always be -W...W), this function always remaps it to 0...W, though\n  //   numerically not precisely (0 is moved to 0.5, locking the exponent near\n  //   what was the truly floating-point 0 originally). It is the guest\n  //   viewport's responsibility (haven't checked, but it's logical) to remap\n  //   from -1...1 in the NDC to glDepthRange within the 0...1 range. Also -Z\n  //   pointing forward in OpenGL doesn't matter here (the -W...W clip space is\n  //   symmetric).\n  //\n  // - Clipping is disabled:\n  //\n  //   The most common case of drawing without clipping in games is screen-space\n  //   draws, most prominently clears, directly in render target coordinates.\n  //\n  //   In this particular case (though all the general case arithmetic still\n  //   applies), the vertex shader returns a position in pixels, pre-divided by\n  //   W (though this doesn't matter if W is 1).\n  //\n  //   Because clipping is disabled, this huge polygon with, for example,\n  //   a (1280, 720, 0, 1) vertex, is not clipped to (-w, -w) ... (w, w), so the\n  //   vertex becomes (1280, 720) in the NDC as well (even though in regular 3D\n  //   draws with clipping, disregarding the guard band for simplicity, it can't\n  //   be bigger than (1, 1) after clipping and the division by W).\n  //\n  //   For these draws, the viewport is also usually disabled (though, again, it\n  //   doesn't have to be - an enabled viewport would likely still work as\n  //   usual) by disabling PA_CL_VTE_CNTL::VPORT_X/Y/Z_SCALE/OFFSET_ENA - which\n  //   equals to having a viewport scale of (1, 1, 1) and offset of (0, 0, 0).\n  //   This results in the NDC being treated directly as pixel coordinates.\n  //   Normally, with clipping, this would make only a tiny 1x1 area in the\n  //   corner of the render target being possible to cover (and 3 unreachable\n  //   pixels outside of the render target). The window offset is then applied,\n  //   if needed, as well as the half-pixel offset.\n  //\n  //   It's also possible (though not verified) that without clipping, Z (as a\n  //   result of, for instance, polygon offset, or explicit calculations in the\n  //   vertex shader) may end up outside the viewport Z range. Direct3D 10\n  //   requires clamping to the viewport Z bounds in all cases in the\n  //   output-merger according to the Direct3D 11.3 functional specification. A\n  //   different behavior is likely on the Xbox 360, however, because while\n  //   Direct3D 10-compatible AMD GPUs such as the R600 have\n  //   PA_SC_VPORT_ZMIN/ZMAX registers, the Adreno 200 doesn't seem to have any\n  //   equivalents, neither in PA nor in RB. This probably also applies to\n  //   shader depth output - possibly doesn't need to be clamped as well.\n  //\n  //   On the PC, we need to emulate disabled clipping by using a viewport at\n  //   least as large as the scissor region within the render target, as well as\n  //   the full viewport depth range (plus changing Z clipping to Z clamping on\n  //   the host if possible), and rescale from the guest clip space to the host\n  //   \"no clip\" clip space, as well as apply the viewport, the window offset,\n  //   and the half-pixel offset, in the vertex shader. Ideally, the host\n  //   viewport should have a power of 2 size - so scaling doesn't affect\n  //   precision, and is merely an exponent bias.\n  //\n  // NDC XY point towards +XY on the render target - the viewport scale sign\n  // handles the remapping from Direct3D 9 -Y towards +U to a generic\n  // transformation from the NDC to pixel coordinates.\n  //\n  // TODO(Triang3l): Investigate the need for clamping of oDepth to 0...1 for\n  // D24FS8 as well.\n\n  auto pa_cl_clip_cntl = regs.Get<reg::PA_CL_CLIP_CNTL>();\n  auto pa_cl_vte_cntl = regs.Get<reg::PA_CL_VTE_CNTL>();\n  auto pa_su_sc_mode_cntl = regs.Get<reg::PA_SU_SC_MODE_CNTL>();\n  auto pa_su_vtx_cntl = regs.Get<reg::PA_SU_VTX_CNTL>();\n\n  // Obtain the original viewport values in a normalized way.\n  float scale_xy[] = {\n      pa_cl_vte_cntl.vport_x_scale_ena\n          ? regs.Get<float>(XE_GPU_REG_PA_CL_VPORT_XSCALE)\n          : 1.0f,\n      pa_cl_vte_cntl.vport_y_scale_ena\n          ? regs.Get<float>(XE_GPU_REG_PA_CL_VPORT_YSCALE)\n          : 1.0f,\n  };\n  float scale_z = pa_cl_vte_cntl.vport_z_scale_ena\n                      ? regs.Get<float>(XE_GPU_REG_PA_CL_VPORT_ZSCALE)\n                      : 1.0f;\n  float offset_base_xy[] = {\n      pa_cl_vte_cntl.vport_x_offset_ena\n          ? regs.Get<float>(XE_GPU_REG_PA_CL_VPORT_XOFFSET)\n          : 0.0f,\n      pa_cl_vte_cntl.vport_y_offset_ena\n          ? regs.Get<float>(XE_GPU_REG_PA_CL_VPORT_YOFFSET)\n          : 0.0f,\n  };\n  float offset_z = pa_cl_vte_cntl.vport_z_offset_ena\n                       ? regs.Get<float>(XE_GPU_REG_PA_CL_VPORT_ZOFFSET)\n                       : 0.0f;\n  // Calculate all the integer.0 or integer.5 offsetting exactly at full\n  // precision, separately so it can be used in other integer calculations\n  // without double rounding if needed.\n  float offset_add_xy[2] = {};\n  if (pa_su_sc_mode_cntl.vtx_window_offset_enable) {\n    auto pa_sc_window_offset = regs.Get<reg::PA_SC_WINDOW_OFFSET>();\n    offset_add_xy[0] += float(pa_sc_window_offset.window_x_offset);\n    offset_add_xy[1] += float(pa_sc_window_offset.window_y_offset);\n  }\n  if (cvars::half_pixel_offset &&\n      pa_su_vtx_cntl.pix_center == xenos::PixelCenter::kD3DZero) {\n    offset_add_xy[0] += 0.5f;\n    offset_add_xy[1] += 0.5f;\n  }\n\n  // The maximum value is at least the maximum host render target size anyway -\n  // and a guest pixel is always treated as a whole with resolution scaling.\n  uint32_t xy_max_unscaled[] = {x_max / draw_resolution_scale_x,\n                                y_max / draw_resolution_scale_y};\n  assert_not_zero(xy_max_unscaled[0]);\n  assert_not_zero(xy_max_unscaled[1]);\n\n  float z_min;\n  float z_max;\n  float ndc_scale[3];\n  float ndc_offset[3];\n\n  if (pa_cl_clip_cntl.clip_disable) {\n    // Clipping is disabled - use a huge host viewport, perform pixel and depth\n    // offsetting in the vertex shader.\n\n    // XY.\n    for (uint32_t i = 0; i < 2; ++i) {\n      viewport_info_out.xy_offset[i] = 0;\n      uint32_t extent_axis_unscaled =\n          std::min(xenos::kTexture2DCubeMaxWidthHeight, xy_max_unscaled[i]);\n      viewport_info_out.xy_extent[i] =\n          extent_axis_unscaled *\n          (i ? draw_resolution_scale_y : draw_resolution_scale_x);\n      float extent_axis_unscaled_float = float(extent_axis_unscaled);\n      float pixels_to_ndc_axis = 2.0f / extent_axis_unscaled_float;\n      ndc_scale[i] = scale_xy[i] * pixels_to_ndc_axis;\n      ndc_offset[i] = (offset_base_xy[i] - extent_axis_unscaled_float * 0.5f +\n                       offset_add_xy[i]) *\n                      pixels_to_ndc_axis;\n    }\n\n    // Z.\n    z_min = 0.0f;\n    z_max = 1.0f;\n    ndc_scale[2] = scale_z;\n    ndc_offset[2] = offset_z;\n  } else {\n    // Clipping is enabled - perform pixel and depth offsetting via the host\n    // viewport.\n\n    // XY.\n    for (uint32_t i = 0; i < 2; ++i) {\n      // With resolution scaling, do all viewport XY scissoring in guest pixels\n      // if fractional and for the half-pixel offset - we treat guest pixels as\n      // a whole, and also the half-pixel offset would be irreversible in guest\n      // vertices if we did flooring in host pixels. Instead of flooring, also\n      // doing truncation for simplicity - since maxing with 0 is done anyway\n      // (we only return viewports in the positive quarter-plane).\n      uint32_t axis_resolution_scale =\n          i ? draw_resolution_scale_y : draw_resolution_scale_x;\n      float offset_axis = offset_base_xy[i] + offset_add_xy[i];\n      float scale_axis = scale_xy[i];\n      float scale_axis_abs = std::abs(scale_xy[i]);\n      float axis_max_unscaled_float = float(xy_max_unscaled[i]);\n      uint32_t axis_0_int = uint32_t(xe::clamp_float(\n          offset_axis - scale_axis_abs, 0.0f, axis_max_unscaled_float));\n      uint32_t axis_1_int = uint32_t(xe::clamp_float(\n          offset_axis + scale_axis_abs, 0.0f, axis_max_unscaled_float));\n      uint32_t axis_extent_int = axis_1_int - axis_0_int;\n      viewport_info_out.xy_offset[i] = axis_0_int * axis_resolution_scale;\n      viewport_info_out.xy_extent[i] = axis_extent_int * axis_resolution_scale;\n      float ndc_scale_axis;\n      float ndc_offset_axis;\n      if (axis_extent_int) {\n        // Rescale from the old bounds to the new ones, and also apply the sign.\n        // If the new bounds are smaller than the old, for instance, we're\n        // cropping - the new -W...W clip space is a subregion of the old one -\n        // the scale should be > 1 so the area being cut off ends up outside\n        // -W...W. If the new region should include more than the original clip\n        // space, a region previously outside -W...W should end up within it, so\n        // the scale should be < 1.\n        float axis_extent_rounded = float(axis_extent_int);\n        ndc_scale_axis = scale_axis * 2.0f / axis_extent_rounded;\n        // Move the origin of the snapped coordinates back to the original one.\n        ndc_offset_axis = (float(offset_axis) -\n                           (float(axis_0_int) + axis_extent_rounded * 0.5f)) *\n                          2.0f / axis_extent_rounded;\n      } else {\n        // Empty viewport (everything outside the viewport scissor).\n        ndc_scale_axis = 1.0f;\n        ndc_offset_axis = 0.0f;\n      }\n      ndc_scale[i] = ndc_scale_axis;\n      ndc_offset[i] = ndc_offset_axis;\n    }\n\n    // Z.\n    float host_clip_offset_z;\n    float host_clip_scale_z;\n    if (pa_cl_clip_cntl.dx_clip_space_def) {\n      host_clip_offset_z = offset_z;\n      host_clip_scale_z = scale_z;\n      ndc_scale[2] = 1.0f;\n      ndc_offset[2] = 0.0f;\n    } else {\n      // Normalizing both Direct3D / Vulkan 0...W and OpenGL -W...W clip spaces\n      // to 0...W. We are not targeting OpenGL, but there we could accept the\n      // wanted clip space (Direct3D, OpenGL, or any) and return the actual one\n      // (Direct3D or OpenGL).\n      //\n      // If the guest wants to use -W...W clip space (-1...1 NDC) and a 0...1\n      // depth range in the end, it's expected to use ZSCALE of 0.5 and ZOFFSET\n      // of 0.5.\n      //\n      // We are providing the near and the far (or offset and offset + scale)\n      // plane distances to the host API in a way that the near maps to Z = 0\n      // and the far maps to Z = W in clip space (or Z = 1 in NDC).\n      //\n      // With D3D offset and scale that we want, assuming D3D clip space input,\n      // the formula for the depth would be:\n      //\n      // depth = offset_d3d + scale_d3d * ndc_z_d3d\n      //\n      // We are remapping the incoming OpenGL Z from -W...W to 0...W by scaling\n      // it by 0.5 and adding 0.5 * W to the result. So, our depth formula would\n      // be:\n      //\n      // depth = offset_d3d + scale_d3d * (ndc_z_gl * 0.5 + 0.5)\n      //\n      // The guest registers, however, contain the offset and the scale for\n      // remapping not from 0...W to near...far, but from -W...W to near...far,\n      // or:\n      //\n      // depth = offset_gl + scale_gl * ndc_z_gl\n      //\n      // Knowing offset_gl, scale_gl and how ndc_z_d3d can be obtained from\n      // ndc_z_gl, we need to derive the formulas for the needed offset_d3d and\n      // scale_d3d to apply them to the incoming ndc_z_d3d.\n      //\n      // depth = offset_gl + scale_gl * (ndc_z_d3d * 2 - 1)\n      //\n      // Expanding:\n      //\n      // depth = offset_gl + (scale_gl * ndc_z_d3d * 2 - scale_gl)\n      //\n      // Reordering:\n      //\n      // depth = (offset_gl - scale_gl) + (scale_gl * 2) * ndc_z_d3d\n      // offset_d3d = offset_gl - scale_gl\n      // scale_d3d = scale_gl * 2\n      host_clip_offset_z = offset_z - scale_z;\n      host_clip_scale_z = scale_z * 2.0f;\n      // Need to remap -W...W clip space to 0...W via ndc_scale and ndc_offset -\n      // by scaling Z by 0.5 and adding 0.5 * W to it.\n      ndc_scale[2] = 0.5f;\n      ndc_offset[2] = 0.5f;\n    }\n    if (pixel_shader_writes_depth) {\n      // Allow the pixel shader to write any depth value since\n      // PA_SC_VPORT_ZMIN/ZMAX isn't present on the Adreno 200; guest pixel\n      // shaders don't have access to the original Z in the viewport space\n      // anyway and likely must write the depth on all execution paths.\n      z_min = 0.0f;\n      z_max = 1.0f;\n    } else {\n      // This clamping is not very correct, but just for safety. Direct3D\n      // doesn't allow an unrestricted depth range. Vulkan does, as an\n      // extension. But cases when this really matters are yet to be found -\n      // trying to fix this will result in more correct depth values, but\n      // incorrect clipping.\n      z_min = xe::saturate(host_clip_offset_z);\n      z_max = xe::saturate(host_clip_offset_z + host_clip_scale_z);\n      // Direct3D 12 doesn't allow reverse depth range - on some drivers it\n      // works, on some drivers it doesn't, actually, but it was never\n      // explicitly allowed by the specification.\n      if (!allow_reverse_z && z_min > z_max) {\n        std::swap(z_min, z_max);\n        ndc_scale[2] = -ndc_scale[2];\n        ndc_offset[2] = 1.0f - ndc_offset[2];\n      }\n    }\n  }\n\n  if (normalized_depth_control.z_enable &&\n      regs.Get<reg::RB_DEPTH_INFO>().depth_format ==\n          xenos::DepthRenderTargetFormat::kD24FS8) {\n    if (convert_z_to_float24) {\n      // Need to adjust the bounds that the resulting depth values will be\n      // clamped to after the pixel shader. Preferring adding some error to\n      // interpolated Z instead if conversion can't be done exactly, without\n      // modifying clipping bounds by adjusting Z in vertex shaders, as that\n      // may cause polygons placed explicitly at Z = 0 or Z = W to be clipped.\n      // Rounding the bounds to the nearest even regardless of the depth\n      // rounding mode not to add even more error by truncating twice.\n      z_min = xenos::Float20e4To32(xenos::Float32To20e4(z_min, true));\n      z_max = xenos::Float20e4To32(xenos::Float32To20e4(z_max, true));\n    }\n    if (full_float24_in_0_to_1) {\n      // Remap the full [0...2) float24 range to [0...1) support data round-trip\n      // during render target ownership transfer of EDRAM tiles through depth\n      // input without unrestricted depth range.\n      z_min *= 0.5f;\n      z_max *= 0.5f;\n    }\n  }\n  viewport_info_out.z_min = z_min;\n  viewport_info_out.z_max = z_max;\n\n  if (origin_bottom_left) {\n    ndc_scale[1] = -ndc_scale[1];\n    ndc_offset[1] = -ndc_offset[1];\n  }\n  for (uint32_t i = 0; i < 3; ++i) {\n    viewport_info_out.ndc_scale[i] = ndc_scale[i];\n    viewport_info_out.ndc_offset[i] = ndc_offset[i];\n  }\n}\n\nvoid GetScissor(const RegisterFile& regs, Scissor& scissor_out,\n                bool clamp_to_surface_pitch) {\n  auto pa_sc_window_scissor_tl = regs.Get<reg::PA_SC_WINDOW_SCISSOR_TL>();\n  int32_t tl_x = int32_t(pa_sc_window_scissor_tl.tl_x);\n  int32_t tl_y = int32_t(pa_sc_window_scissor_tl.tl_y);\n  auto pa_sc_window_scissor_br = regs.Get<reg::PA_SC_WINDOW_SCISSOR_BR>();\n  int32_t br_x = int32_t(pa_sc_window_scissor_br.br_x);\n  int32_t br_y = int32_t(pa_sc_window_scissor_br.br_y);\n  if (!pa_sc_window_scissor_tl.window_offset_disable) {\n    auto pa_sc_window_offset = regs.Get<reg::PA_SC_WINDOW_OFFSET>();\n    tl_x += pa_sc_window_offset.window_x_offset;\n    tl_y += pa_sc_window_offset.window_y_offset;\n    br_x += pa_sc_window_offset.window_x_offset;\n    br_y += pa_sc_window_offset.window_y_offset;\n  }\n  // Screen scissor is not used by Direct3D 9 (always 0, 0 to 8192, 8192), but\n  // still handled here for completeness.\n  auto pa_sc_screen_scissor_tl = regs.Get<reg::PA_SC_SCREEN_SCISSOR_TL>();\n  tl_x = std::max(tl_x, int32_t(pa_sc_screen_scissor_tl.tl_x));\n  tl_y = std::max(tl_y, int32_t(pa_sc_screen_scissor_tl.tl_y));\n  auto pa_sc_screen_scissor_br = regs.Get<reg::PA_SC_SCREEN_SCISSOR_BR>();\n  br_x = std::min(br_x, int32_t(pa_sc_screen_scissor_br.br_x));\n  br_y = std::min(br_y, int32_t(pa_sc_screen_scissor_br.br_y));\n  if (clamp_to_surface_pitch) {\n    // Clamp the horizontal scissor to surface_pitch for safety, in case that's\n    // not done by the guest for some reason (it's not when doing draws without\n    // clipping in Direct3D 9, for instance), to prevent overflow - this is\n    // important for host implementations, both based on target-indepedent\n    // rasterization without render target width at all (pixel shader\n    // interlock-based custom RB implementations) and using conventional render\n    // targets, but padded to EDRAM tiles.\n    uint32_t surface_pitch = regs.Get<reg::RB_SURFACE_INFO>().surface_pitch;\n    tl_x = std::min(tl_x, int32_t(surface_pitch));\n    br_x = std::min(br_x, int32_t(surface_pitch));\n  }\n  // Ensure the rectangle is non-negative, by collapsing it into a 0-sized one\n  // (not by reordering the bounds preserving the width / height, which would\n  // reveal samples not meant to be covered, unless TL > BR does that on a real\n  // console, but no evidence of such has ever been seen), and also drop\n  // negative offsets.\n  tl_x = std::max(tl_x, int32_t(0));\n  tl_y = std::max(tl_y, int32_t(0));\n  br_x = std::max(br_x, tl_x);\n  br_y = std::max(br_y, tl_y);\n  scissor_out.offset[0] = uint32_t(tl_x);\n  scissor_out.offset[1] = uint32_t(tl_y);\n  scissor_out.extent[0] = uint32_t(br_x - tl_x);\n  scissor_out.extent[1] = uint32_t(br_y - tl_y);\n}\n\nuint32_t GetNormalizedColorMask(const RegisterFile& regs,\n                                uint32_t pixel_shader_writes_color_targets) {\n  if (regs.Get<reg::RB_MODECONTROL>().edram_mode !=\n      xenos::EdramMode::kColorDepth) {\n    return 0;\n  }\n  uint32_t normalized_color_mask = 0;\n  uint32_t rb_color_mask = regs[XE_GPU_REG_RB_COLOR_MASK];\n  for (uint32_t i = 0; i < xenos::kMaxColorRenderTargets; ++i) {\n    // Exclude the render targets not statically written to by the pixel shader.\n    // If the shader doesn't write to a render target, it shouldn't be written\n    // to, and no ownership transfers should happen to it on the host even -\n    // otherwise, in 4D5307E6, one render target is being destroyed by a shader\n    // not writing anything, and in 58410955, the result of clearing the top\n    // tile is being ignored because there are 4 render targets bound with the\n    // same EDRAM base (clearly not correct usage), but the shader only clears\n    // 1, and then ownership of EDRAM portions by host render targets is\n    // conflicting.\n    if (!(pixel_shader_writes_color_targets & (uint32_t(1) << i))) {\n      continue;\n    }\n    // Check if any existing component is written to.\n    uint32_t format_component_mask =\n        (uint32_t(1) << xenos::GetColorRenderTargetFormatComponentCount(\n             regs.Get<reg::RB_COLOR_INFO>(\n                     reg::RB_COLOR_INFO::rt_register_indices[i])\n                 .color_format)) -\n        1;\n    uint32_t rt_write_mask = (rb_color_mask >> (4 * i)) & format_component_mask;\n    if (!rt_write_mask) {\n      continue;\n    }\n    // Mark the non-existent components as written so in the host driver, no\n    // slow path (involving reading and merging components) is taken if the\n    // driver doesn't perform this check internally, and some components are not\n    // included in the mask even though they actually don't exist in the format.\n    rt_write_mask |= 0b1111 & ~format_component_mask;\n    // Add to the normalized mask.\n    normalized_color_mask |= rt_write_mask << (4 * i);\n  }\n  return normalized_color_mask;\n}\n\nvoid AddMemExportRanges(const RegisterFile& regs, const Shader& shader,\n                        std::vector<MemExportRange>& ranges_out) {\n  if (!shader.memexport_eM_written()) {\n    // The shader has eA writes, but no real exports.\n    return;\n  }\n  uint32_t float_constants_base = shader.type() == xenos::ShaderType::kVertex\n                                      ? regs.Get<reg::SQ_VS_CONST>().base\n                                      : regs.Get<reg::SQ_PS_CONST>().base;\n  for (uint32_t constant_index : shader.memexport_stream_constants()) {\n    xenos::xe_gpu_memexport_stream_t stream =\n        regs.GetMemExportStream(float_constants_base + constant_index);\n    // Safety checks for stream constants potentially not set up if the export\n    // isn't done on the control flow path taken by the shader (not checking the\n    // Y component because the index is more likely to be constructed\n    // arbitrarily).\n    // The hardware validates the upper bits of eA according to the\n    // IPR2015-00325 sequencer specification.\n    if (stream.const_0x1 != 0x1 || stream.const_0x4b0 != 0x4B0 ||\n        stream.const_0x96 != 0x96 || !stream.index_count) {\n      continue;\n    }\n    const FormatInfo& format_info =\n        *FormatInfo::Get(xenos::TextureFormat(stream.format));\n    if (format_info.type != FormatType::kResolvable) {\n      XELOGE(\"Unsupported memexport format {}\", format_info.name);\n      // Translated shaders shouldn't be performing exports with an unknown\n      // format, the draw can still be performed.\n      continue;\n    }\n    // TODO(Triang3l): Remove the unresearched format logging when it's known\n    // how exactly these formats need to be handled (most importantly what\n    // components need to be stored and in which order).\n    switch (stream.format) {\n      case xenos::ColorFormat::k_8_A:\n      case xenos::ColorFormat::k_8_B:\n      case xenos::ColorFormat::k_8_8_8_8_A:\n        XELOGW(\n            \"Memexport done to an unresearched format {}, report the game to \"\n            \"Xenia developers!\",\n            format_info.name);\n        break;\n      default:\n        break;\n    }\n    uint32_t stream_size_bytes =\n        stream.index_count * (format_info.bits_per_pixel >> 3);\n    // Try to reduce the number of shared memory operations when writing\n    // different elements into the same buffer through different exports\n    // (happens in 4D5307E6).\n    bool range_reused = false;\n    for (MemExportRange& range : ranges_out) {\n      if (range.base_address_dwords == stream.base_address) {\n        range.size_bytes = std::max(range.size_bytes, stream_size_bytes);\n        range_reused = true;\n        break;\n      }\n    }\n    // Add a new range if haven't expanded an existing one.\n    if (!range_reused) {\n      ranges_out.emplace_back(uint32_t(stream.base_address), stream_size_bytes);\n    }\n  }\n}\n\nxenos::CopySampleSelect SanitizeCopySampleSelect(\n    xenos::CopySampleSelect copy_sample_select, xenos::MsaaSamples msaa_samples,\n    bool is_depth) {\n  // Depth can't be averaged.\n  if (msaa_samples >= xenos::MsaaSamples::k4X) {\n    if (copy_sample_select > xenos::CopySampleSelect::k0123) {\n      copy_sample_select = xenos::CopySampleSelect::k0123;\n    }\n    if (is_depth) {\n      switch (copy_sample_select) {\n        case xenos::CopySampleSelect::k01:\n        case xenos::CopySampleSelect::k0123:\n          copy_sample_select = xenos::CopySampleSelect::k0;\n          break;\n        case xenos::CopySampleSelect::k23:\n          copy_sample_select = xenos::CopySampleSelect::k2;\n          break;\n        default:\n          break;\n      }\n    }\n  } else if (msaa_samples >= xenos::MsaaSamples::k2X) {\n    switch (copy_sample_select) {\n      case xenos::CopySampleSelect::k2:\n        copy_sample_select = xenos::CopySampleSelect::k0;\n        break;\n      case xenos::CopySampleSelect::k3:\n        copy_sample_select = xenos::CopySampleSelect::k1;\n        break;\n      default:\n        if (copy_sample_select > xenos::CopySampleSelect::k01) {\n          copy_sample_select = xenos::CopySampleSelect::k01;\n        }\n    }\n    if (is_depth && copy_sample_select == xenos::CopySampleSelect::k01) {\n      copy_sample_select = xenos::CopySampleSelect::k0;\n    }\n  } else {\n    copy_sample_select = xenos::CopySampleSelect::k0;\n  }\n  return copy_sample_select;\n}\n\nvoid GetResolveEdramTileSpan(ResolveEdramInfo edram_info,\n                             ResolveCoordinateInfo coordinate_info,\n                             uint32_t height_div_8, uint32_t& base_out,\n                             uint32_t& row_length_used_out,\n                             uint32_t& rows_out) {\n  // Due to 64bpp, and also not to make an assumption that the offsets are\n  // limited to (80 - 8, 8 - 8) with 2x MSAA, and (40 - 8, 8 - 8) with 4x MSAA,\n  // still taking the offset into account.\n  uint32_t x_scale_log2 =\n      3 + uint32_t(edram_info.msaa_samples >= xenos::MsaaSamples::k4X) +\n      edram_info.format_is_64bpp;\n  uint32_t x0 = (coordinate_info.edram_offset_x_div_8 << x_scale_log2) /\n                xenos::kEdramTileWidthSamples;\n  uint32_t x1 =\n      (((coordinate_info.edram_offset_x_div_8 + coordinate_info.width_div_8)\n        << x_scale_log2) +\n       (xenos::kEdramTileWidthSamples - 1)) /\n      xenos::kEdramTileWidthSamples;\n  uint32_t y_scale_log2 =\n      3 + uint32_t(edram_info.msaa_samples >= xenos::MsaaSamples::k2X);\n  uint32_t y0 = (coordinate_info.edram_offset_y_div_8 << y_scale_log2) /\n                xenos::kEdramTileHeightSamples;\n  uint32_t y1 =\n      (((coordinate_info.edram_offset_y_div_8 + height_div_8) << y_scale_log2) +\n       (xenos::kEdramTileHeightSamples - 1)) /\n      xenos::kEdramTileHeightSamples;\n  base_out = edram_info.base_tiles + y0 * edram_info.pitch_tiles + x0;\n  row_length_used_out = x1 - x0;\n  rows_out = y1 - y0;\n}\n\nconst ResolveCopyShaderInfo\n    resolve_copy_shader_info[size_t(ResolveCopyShaderIndex::kCount)] = {\n        {\"Resolve Copy Fast 32bpp 1x/2xMSAA\", 6, 3},\n        {\"Resolve Copy Fast 32bpp 4xMSAA\", 6, 3},\n        {\"Resolve Copy Fast 64bpp 1x/2xMSAA\", 5, 3},\n        {\"Resolve Copy Fast 64bpp 4xMSAA\", 5, 3},\n        {\"Resolve Copy Full 8bpp\", 6, 3},\n        {\"Resolve Copy Full 16bpp\", 5, 3},\n        {\"Resolve Copy Full 32bpp\", 5, 3},\n        {\"Resolve Copy Full 64bpp\", 5, 3},\n        {\"Resolve Copy Full 128bpp\", 4, 3},\n};\n\nbool GetResolveInfo(const RegisterFile& regs, const Memory& memory,\n                    TraceWriter& trace_writer, uint32_t draw_resolution_scale_x,\n                    uint32_t draw_resolution_scale_y,\n                    bool fixed_rg16_truncated_to_minus_1_to_1,\n                    bool fixed_rgba16_truncated_to_minus_1_to_1,\n                    ResolveInfo& info_out) {\n  // Don't pass uninitialized values to shaders, not to leak data to frame\n  // captures. Also initialize an invalid resolve to empty.\n  info_out.coordinate_info.packed = 0;\n  info_out.height_div_8 = 0;\n\n  auto rb_copy_control = regs.Get<reg::RB_COPY_CONTROL>();\n  info_out.rb_copy_control = rb_copy_control;\n\n  if (rb_copy_control.copy_command != xenos::CopyCommand::kRaw &&\n      rb_copy_control.copy_command != xenos::CopyCommand::kConvert) {\n    XELOGE(\n        \"Unsupported resolve copy command {}. Report the game to Xenia \"\n        \"developers\",\n        uint32_t(rb_copy_control.copy_command));\n    assert_always();\n    return false;\n  }\n\n  // Get the extent of pixels covered by the resolve rectangle, according to the\n  // top-left rasterization rule.\n  // D3D9 HACK: Vertices to use are always in vf0, and are written by the CPU.\n  xenos::xe_gpu_vertex_fetch_t fetch = regs.GetVertexFetch(0);\n  if (fetch.type != xenos::FetchConstantType::kVertex || fetch.size != 3 * 2) {\n    XELOGE(\"Unsupported resolve vertex buffer format\");\n    assert_always();\n    return false;\n  }\n  trace_writer.WriteMemoryRead(fetch.address * sizeof(uint32_t),\n                               fetch.size * sizeof(uint32_t));\n  const float* vertices_guest = reinterpret_cast<const float*>(\n      memory.TranslatePhysical(fetch.address * sizeof(uint32_t)));\n  // Most vertices have a negative half-pixel offset applied, which we reverse.\n  float half_pixel_offset =\n      regs.Get<reg::PA_SU_VTX_CNTL>().pix_center == xenos::PixelCenter::kD3DZero\n          ? 0.5f\n          : 0.0f;\n  int32_t vertices_fixed[6];\n  for (size_t i = 0; i < xe::countof(vertices_fixed); ++i) {\n    vertices_fixed[i] = ui::FloatToD3D11Fixed16p8(\n        xenos::GpuSwap(vertices_guest[i], fetch.endian) + half_pixel_offset);\n  }\n  // Inclusive.\n  int32_t x0 = std::min(std::min(vertices_fixed[0], vertices_fixed[2]),\n                        vertices_fixed[4]);\n  int32_t y0 = std::min(std::min(vertices_fixed[1], vertices_fixed[3]),\n                        vertices_fixed[5]);\n  // Exclusive.\n  int32_t x1 = std::max(std::max(vertices_fixed[0], vertices_fixed[2]),\n                        vertices_fixed[4]);\n  int32_t y1 = std::max(std::max(vertices_fixed[1], vertices_fixed[3]),\n                        vertices_fixed[5]);\n  // Top-left - include .5 (0.128 treated as 0 covered, 0.129 as 0 not covered).\n  x0 = (x0 + 127) >> 8;\n  y0 = (y0 + 127) >> 8;\n  // Bottom-right - exclude .5.\n  x1 = (x1 + 127) >> 8;\n  y1 = (y1 + 127) >> 8;\n\n  auto pa_sc_window_offset = regs.Get<reg::PA_SC_WINDOW_OFFSET>();\n\n  // Apply the window offset to the vertices.\n  if (regs.Get<reg::PA_SU_SC_MODE_CNTL>().vtx_window_offset_enable) {\n    x0 += pa_sc_window_offset.window_x_offset;\n    y0 += pa_sc_window_offset.window_y_offset;\n    x1 += pa_sc_window_offset.window_x_offset;\n    y1 += pa_sc_window_offset.window_y_offset;\n  }\n\n  // Apply the scissor and prevent negative origin (behind the EDRAM base).\n  Scissor scissor;\n  // False because clamping to the surface pitch will be done later (it will be\n  // aligned to the resolve alignment here, for resolving from render targets\n  // with a pitch that is not a multiple of 8).\n  GetScissor(regs, scissor, false);\n  int32_t scissor_right = int32_t(scissor.offset[0] + scissor.extent[0]);\n  int32_t scissor_bottom = int32_t(scissor.offset[1] + scissor.extent[1]);\n  x0 = std::clamp(x0, int32_t(scissor.offset[0]), scissor_right);\n  y0 = std::clamp(y0, int32_t(scissor.offset[1]), scissor_bottom);\n  x1 = std::clamp(x1, int32_t(scissor.offset[0]), scissor_right);\n  y1 = std::clamp(y1, int32_t(scissor.offset[1]), scissor_bottom);\n\n  assert_true(x0 <= x1 && y0 <= y1);\n\n  // Direct3D 9's D3DDevice_Resolve internally rounds the right/bottom of the\n  // rectangle internally to 8. While all the alignment should have already been\n  // done by Direct3D 9, just for safety of host implementation of resolve,\n  // force-align the rectangle by expanding (D3D9 expands to the right/bottom\n  // for some reason, haven't found how left/top is rounded, but logically it\n  // would make sense to expand to the left/top too).\n  x0 &= ~int32_t(xenos::kResolveAlignmentPixels - 1);\n  y0 &= ~int32_t(xenos::kResolveAlignmentPixels - 1);\n  x1 = xe::align(x1, int32_t(xenos::kResolveAlignmentPixels));\n  y1 = xe::align(y1, int32_t(xenos::kResolveAlignmentPixels));\n\n  auto rb_surface_info = regs.Get<reg::RB_SURFACE_INFO>();\n  if (rb_surface_info.msaa_samples > xenos::MsaaSamples::k4X) {\n    // Safety check because a lot of code assumes up to 4x.\n    assert_always();\n    XELOGE(\n        \"{}x MSAA requested by the guest in a resolve, Xenos only supports up \"\n        \"to 4x\",\n        uint32_t(1) << uint32_t(rb_surface_info.msaa_samples));\n    return false;\n  }\n\n  // Clamp to the EDRAM surface pitch (maximum possible surface pitch is also\n  // assumed to be the largest resolvable size).\n  int32_t surface_pitch_aligned =\n      int32_t(rb_surface_info.surface_pitch &\n              ~uint32_t(xenos::kResolveAlignmentPixels - 1));\n  if (x1 > surface_pitch_aligned) {\n    XELOGE(\"Resolve region {} <= x < {} is outside the surface pitch {}\", x0,\n           x1, surface_pitch_aligned);\n    x0 = std::min(x0, surface_pitch_aligned);\n    x1 = std::min(x1, surface_pitch_aligned);\n  }\n  assert_true(x1 - x0 <= int32_t(xenos::kMaxResolveSize));\n\n  // Clamp the height to a sane value (to make sure it can fit in the packed\n  // shader constant).\n  if (y1 - y0 > int32_t(xenos::kMaxResolveSize)) {\n    XELOGE(\"Resolve region {} <= y < {} is taller than {}\", y0, y1,\n           xenos::kMaxResolveSize);\n    y1 = y0 + int32_t(xenos::kMaxResolveSize);\n  }\n\n  assert_true(x0 < x1 && y0 < y1);\n  if (x0 >= x1 || y0 >= y1) {\n    XELOGE(\"Resolve region is empty\");\n    return false;\n  }\n\n  info_out.coordinate_info.width_div_8 =\n      uint32_t(x1 - x0) >> xenos::kResolveAlignmentPixelsLog2;\n  info_out.height_div_8 =\n      uint32_t(y1 - y0) >> xenos::kResolveAlignmentPixelsLog2;\n  // 3 bits for each.\n  assert_true(draw_resolution_scale_x <= 7);\n  assert_true(draw_resolution_scale_y <= 7);\n  info_out.coordinate_info.draw_resolution_scale_x = draw_resolution_scale_x;\n  info_out.coordinate_info.draw_resolution_scale_y = draw_resolution_scale_y;\n\n  // Handle the destination.\n  bool is_depth =\n      rb_copy_control.copy_src_select >= xenos::kMaxColorRenderTargets;\n  // Get the sample selection to safely pass to the shader.\n  xenos::CopySampleSelect sample_select =\n      SanitizeCopySampleSelect(rb_copy_control.copy_sample_select,\n                               rb_surface_info.msaa_samples, is_depth);\n  if (rb_copy_control.copy_sample_select != sample_select) {\n    XELOGW(\n        \"Incorrect resolve sample selected for {}-sample {}: {}, treating like \"\n        \"{}\",\n        1 << uint32_t(rb_surface_info.msaa_samples),\n        is_depth ? \"depth\" : \"color\", rb_copy_control.copy_sample_select,\n        sample_select);\n  }\n  info_out.copy_dest_coordinate_info.copy_sample_select = sample_select;\n  // Get the format to pass to the shader in a unified way - for depth (for\n  // which Direct3D 9 specifies the k_8_8_8_8 uint destination format), make\n  // sure the shader won't try to do conversion - pass proper k_24_8 or\n  // k_24_8_FLOAT.\n  auto rb_copy_dest_info = regs.Get<reg::RB_COPY_DEST_INFO>();\n  xenos::TextureFormat dest_format;\n  auto rb_depth_info = regs.Get<reg::RB_DEPTH_INFO>();\n  if (is_depth) {\n    dest_format = DepthRenderTargetToTextureFormat(rb_depth_info.depth_format);\n  } else {\n    dest_format = xenos::TextureFormat(rb_copy_dest_info.copy_dest_format);\n    // For development feedback - not much known about these formats currently.\n    xenos::TextureFormat dest_closest_format;\n    switch (dest_format) {\n      case xenos::TextureFormat::k_8_A:\n      case xenos::TextureFormat::k_8_B:\n        dest_closest_format = xenos::TextureFormat::k_8;\n        break;\n      case xenos::TextureFormat::k_8_8_8_8_A:\n        dest_closest_format = xenos::TextureFormat::k_8_8_8_8;\n        break;\n      default:\n        dest_closest_format = dest_format;\n    }\n    if (dest_format != dest_closest_format) {\n      XELOGW(\n          \"Resolving to format {}, which is untested - treating like {}. \"\n          \"Report the game to Xenia developers!\",\n          FormatInfo::Get(dest_format)->name,\n          FormatInfo::Get(dest_closest_format)->name);\n    }\n  }\n\n  // Calculate the destination memory extent.\n  uint32_t rb_copy_dest_base = regs[XE_GPU_REG_RB_COPY_DEST_BASE];\n  uint32_t copy_dest_base_adjusted = rb_copy_dest_base;\n  uint32_t copy_dest_extent_start, copy_dest_extent_end;\n  auto rb_copy_dest_pitch = regs.Get<reg::RB_COPY_DEST_PITCH>();\n  const uint32_t copy_dest_pitch_aligned =\n      xe::align(rb_copy_dest_pitch.copy_dest_pitch,\n                texture_address::kStoragePitchHeightAlignmentBlocks);\n  info_out.copy_dest_coordinate_info.pitch_aligned_div_32 =\n      copy_dest_pitch_aligned >> 5;\n  const uint32_t copy_dest_height_aligned =\n      xe::align(rb_copy_dest_pitch.copy_dest_height,\n                texture_address::kStoragePitchHeightAlignmentBlocks);\n  info_out.copy_dest_coordinate_info.height_aligned_div_32 =\n      copy_dest_height_aligned >> 5;\n  const FormatInfo& dest_format_info = *FormatInfo::Get(dest_format);\n  if (is_depth || dest_format_info.type == FormatType::kResolvable) {\n    uint32_t bpp_log2 = xe::log2_floor(dest_format_info.bits_per_pixel >> 3);\n    uint32_t dest_base_relative_x_mask =\n        (UINT32_C(1) << xenos::GetTextureTiledXBaseGranularityLog2(\n             bool(rb_copy_dest_info.copy_dest_array), bpp_log2)) -\n        1;\n    uint32_t dest_base_relative_y_mask =\n        (UINT32_C(1) << xenos::GetTextureTiledYBaseGranularityLog2(\n             bool(rb_copy_dest_info.copy_dest_array), bpp_log2)) -\n        1;\n    info_out.copy_dest_coordinate_info.offset_x_div_8 =\n        (uint32_t(x0) & dest_base_relative_x_mask) >>\n        xenos::kResolveAlignmentPixelsLog2;\n    info_out.copy_dest_coordinate_info.offset_y_div_8 =\n        (uint32_t(y0) & dest_base_relative_y_mask) >>\n        xenos::kResolveAlignmentPixelsLog2;\n    uint32_t dest_base_x = uint32_t(x0) & ~dest_base_relative_x_mask;\n    uint32_t dest_base_y = uint32_t(y0) & ~dest_base_relative_y_mask;\n    if (rb_copy_dest_info.copy_dest_array) {\n      // The base pointer is already adjusted to the Z / 8 (copy_dest_slice is\n      // 3-bit).\n      copy_dest_base_adjusted += uint32_t(texture_address::Tiled3D(\n          int32_t(dest_base_x), int32_t(dest_base_y), 0,\n          copy_dest_pitch_aligned, copy_dest_height_aligned, bpp_log2));\n      copy_dest_extent_start =\n          rb_copy_dest_base +\n          uint32_t(texture_util::GetTiledAddressLowerBound3D(\n              uint32_t(x0), uint32_t(y0), rb_copy_dest_info.copy_dest_slice,\n              copy_dest_pitch_aligned, copy_dest_height_aligned, bpp_log2));\n      copy_dest_extent_end =\n          rb_copy_dest_base +\n          uint32_t(texture_util::GetTiledAddressUpperBound3D(\n              uint32_t(x1), uint32_t(y1), rb_copy_dest_info.copy_dest_slice + 1,\n              copy_dest_pitch_aligned, copy_dest_height_aligned, bpp_log2));\n    } else {\n      copy_dest_base_adjusted +=\n          texture_address::Tiled2D(int32_t(dest_base_x), int32_t(dest_base_y),\n                                   copy_dest_pitch_aligned, bpp_log2);\n      copy_dest_extent_start =\n          rb_copy_dest_base +\n          texture_util::GetTiledAddressLowerBound2D(\n              uint32_t(x0), uint32_t(y0), copy_dest_pitch_aligned, bpp_log2);\n      copy_dest_extent_end =\n          rb_copy_dest_base +\n          texture_util::GetTiledAddressUpperBound2D(\n              uint32_t(x1), uint32_t(y1), copy_dest_pitch_aligned, bpp_log2);\n    }\n  } else {\n    XELOGE(\"Tried to resolve to format {}, which is not a ColorFormat\",\n           dest_format_info.name);\n    copy_dest_extent_start = copy_dest_base_adjusted;\n    copy_dest_extent_end = copy_dest_base_adjusted;\n  }\n  assert_true(copy_dest_extent_start >= copy_dest_base_adjusted);\n  assert_true(copy_dest_extent_end >= copy_dest_base_adjusted);\n  assert_true(copy_dest_extent_end >= copy_dest_extent_start);\n  info_out.copy_dest_base = copy_dest_base_adjusted;\n  info_out.copy_dest_extent_start = copy_dest_extent_start;\n  info_out.copy_dest_extent_length =\n      copy_dest_extent_end - copy_dest_extent_start;\n\n  // Offset relative to the beginning of the tile to put it in fewer bits.\n  uint32_t sample_count_log2_x =\n      uint32_t(rb_surface_info.msaa_samples >= xenos::MsaaSamples::k4X);\n  uint32_t sample_count_log2_y =\n      uint32_t(rb_surface_info.msaa_samples >= xenos::MsaaSamples::k2X);\n  uint32_t x0_samples = uint32_t(x0) << sample_count_log2_x;\n  uint32_t y0_samples = uint32_t(y0) << sample_count_log2_y;\n  uint32_t base_offset_x_tiles = x0_samples / xenos::kEdramTileWidthSamples;\n  uint32_t base_offset_y_tiles = y0_samples / xenos::kEdramTileHeightSamples;\n  info_out.coordinate_info.edram_offset_x_div_8 =\n      (x0_samples % xenos::kEdramTileWidthSamples) >> (sample_count_log2_x + 3);\n  info_out.coordinate_info.edram_offset_y_div_8 =\n      (y0_samples % xenos::kEdramTileHeightSamples) >>\n      (sample_count_log2_y + 3);\n  uint32_t surface_pitch_tiles = xenos::GetSurfacePitchTiles(\n      rb_surface_info.surface_pitch, rb_surface_info.msaa_samples, false);\n  uint32_t edram_base_offset_tiles =\n      base_offset_y_tiles * surface_pitch_tiles + base_offset_x_tiles;\n\n  // Write the color/depth EDRAM info.\n  bool fill_half_pixel_offset =\n      (draw_resolution_scale_x > 1 || draw_resolution_scale_y > 1) &&\n      cvars::resolve_resolution_scale_fill_half_pixel_offset &&\n      cvars::half_pixel_offset &&\n      regs.Get<reg::PA_SU_VTX_CNTL>().pix_center ==\n          xenos::PixelCenter::kD3DZero;\n  int32_t exp_bias = is_depth ? 0 : rb_copy_dest_info.copy_dest_exp_bias;\n  ResolveEdramInfo depth_edram_info;\n  depth_edram_info.packed = 0;\n  if (is_depth || rb_copy_control.depth_clear_enable) {\n    depth_edram_info.pitch_tiles = surface_pitch_tiles;\n    depth_edram_info.msaa_samples = rb_surface_info.msaa_samples;\n    depth_edram_info.is_depth = 1;\n    // If wrapping happens, it's fine, it doesn't matter how many times and\n    // where modulo xenos::kEdramTileCount is applied in this context.\n    depth_edram_info.base_tiles =\n        rb_depth_info.depth_base + edram_base_offset_tiles;\n    depth_edram_info.format = uint32_t(rb_depth_info.depth_format);\n    depth_edram_info.format_is_64bpp = 0;\n    depth_edram_info.fill_half_pixel_offset = uint32_t(fill_half_pixel_offset);\n    info_out.depth_original_base = rb_depth_info.depth_base;\n  } else {\n    info_out.depth_original_base = 0;\n  }\n  info_out.depth_edram_info = depth_edram_info;\n  ResolveEdramInfo color_edram_info;\n  color_edram_info.packed = 0;\n  if (!is_depth) {\n    // Color.\n    auto color_info = regs.Get<reg::RB_COLOR_INFO>(\n        reg::RB_COLOR_INFO::rt_register_indices[rb_copy_control\n                                                    .copy_src_select]);\n    uint32_t is_64bpp = uint32_t(\n        xenos::IsColorRenderTargetFormat64bpp(color_info.color_format));\n    color_edram_info.pitch_tiles = surface_pitch_tiles << is_64bpp;\n    color_edram_info.msaa_samples = rb_surface_info.msaa_samples;\n    color_edram_info.is_depth = 0;\n    // If wrapping happens, it's fine, it doesn't matter how many times and\n    // where modulo xenos::kEdramTileCount is applied in this context.\n    color_edram_info.base_tiles =\n        color_info.color_base + (edram_base_offset_tiles << is_64bpp);\n    color_edram_info.format = uint32_t(color_info.color_format);\n    color_edram_info.format_is_64bpp = is_64bpp;\n    color_edram_info.fill_half_pixel_offset = uint32_t(fill_half_pixel_offset);\n    if ((fixed_rg16_truncated_to_minus_1_to_1 &&\n         color_info.color_format == xenos::ColorRenderTargetFormat::k_16_16) ||\n        (fixed_rgba16_truncated_to_minus_1_to_1 &&\n         color_info.color_format ==\n             xenos::ColorRenderTargetFormat::k_16_16_16_16)) {\n      // The texture expects 0x8001 = -32, 0x7FFF = 32, but the hack making\n      // 0x8001 = -1, 0x7FFF = 1 is used - revert (this won't be correct if the\n      // requested exponent bias is 27 or above, but it's a hack anyway, no need\n      // to create a new copy info structure with one more bit just for this).\n      exp_bias = std::min(exp_bias + int32_t(5), int32_t(31));\n    }\n    info_out.color_original_base = color_info.color_base;\n  } else {\n    info_out.color_original_base = 0;\n  }\n  info_out.color_edram_info = color_edram_info;\n\n  // Patch and write RB_COPY_DEST_INFO.\n  info_out.copy_dest_info = rb_copy_dest_info;\n  // Override with the depth format to make sure the shader doesn't have any\n  // reason to try to do k_8_8_8_8 packing.\n  info_out.copy_dest_info.copy_dest_format = xenos::ColorFormat(dest_format);\n  // Handle k_16_16 and k_16_16_16_16 range.\n  info_out.copy_dest_info.copy_dest_exp_bias = exp_bias;\n  if (is_depth) {\n    // Single component, nothing to swap.\n    info_out.copy_dest_info.copy_dest_swap = false;\n  }\n\n  info_out.rb_depth_clear = regs[XE_GPU_REG_RB_DEPTH_CLEAR];\n  info_out.rb_color_clear = regs[XE_GPU_REG_RB_COLOR_CLEAR];\n  info_out.rb_color_clear_lo = regs[XE_GPU_REG_RB_COLOR_CLEAR_LO];\n\n  XELOGD(\n      \"Resolve: {},{} <= x,y < {},{}, {} -> {} at 0x{:08X} (potentially \"\n      \"modified memory range 0x{:08X} to 0x{:08X})\",\n      x0, y0, x1, y1,\n      is_depth ? xenos::GetDepthRenderTargetFormatName(\n                     xenos::DepthRenderTargetFormat(depth_edram_info.format))\n               : xenos::GetColorRenderTargetFormatName(\n                     xenos::ColorRenderTargetFormat(color_edram_info.format)),\n      dest_format_info.name, rb_copy_dest_base, copy_dest_extent_start,\n      copy_dest_extent_end);\n\n  return true;\n}\n\nResolveCopyShaderIndex ResolveInfo::GetCopyShader(\n    uint32_t draw_resolution_scale_x, uint32_t draw_resolution_scale_y,\n    ResolveCopyShaderConstants& constants_out, uint32_t& group_count_x_out,\n    uint32_t& group_count_y_out) const {\n  ResolveCopyShaderIndex shader = ResolveCopyShaderIndex::kUnknown;\n  bool is_depth = IsCopyingDepth();\n  ResolveEdramInfo edram_info = is_depth ? depth_edram_info : color_edram_info;\n  bool source_is_64bpp = !is_depth && color_edram_info.format_is_64bpp != 0;\n  if (is_depth || (!copy_dest_info.copy_dest_exp_bias &&\n                   xenos::IsSingleCopySampleSelected(\n                       copy_dest_coordinate_info.copy_sample_select) &&\n                   xenos::IsColorResolveFormatBitwiseEquivalent(\n                       xenos::ColorRenderTargetFormat(color_edram_info.format),\n                       xenos::ColorFormat(copy_dest_info.copy_dest_format)))) {\n    if (edram_info.msaa_samples >= xenos::MsaaSamples::k4X) {\n      shader = source_is_64bpp ? ResolveCopyShaderIndex::kFast64bpp4xMSAA\n                               : ResolveCopyShaderIndex::kFast32bpp4xMSAA;\n    } else {\n      shader = source_is_64bpp ? ResolveCopyShaderIndex::kFast64bpp1x2xMSAA\n                               : ResolveCopyShaderIndex::kFast32bpp1x2xMSAA;\n    }\n  } else {\n    const FormatInfo& dest_format_info =\n        *FormatInfo::Get(xenos::TextureFormat(copy_dest_info.copy_dest_format));\n    switch (dest_format_info.bits_per_pixel) {\n      case 8:\n        shader = ResolveCopyShaderIndex::kFull8bpp;\n        break;\n      case 16:\n        shader = ResolveCopyShaderIndex::kFull16bpp;\n        break;\n      case 32:\n        shader = ResolveCopyShaderIndex::kFull32bpp;\n        break;\n      case 64:\n        shader = ResolveCopyShaderIndex::kFull64bpp;\n        break;\n      case 128:\n        shader = ResolveCopyShaderIndex::kFull128bpp;\n        break;\n      default:\n        assert_unhandled_case(dest_format_info.bits_per_pixel);\n    }\n  }\n\n  constants_out.dest_relative.edram_info = edram_info;\n  constants_out.dest_relative.coordinate_info = coordinate_info;\n  constants_out.dest_relative.dest_info = copy_dest_info;\n  constants_out.dest_relative.dest_coordinate_info = copy_dest_coordinate_info;\n  constants_out.dest_base = copy_dest_base;\n\n  if (shader != ResolveCopyShaderIndex::kUnknown) {\n    uint32_t width =\n        (coordinate_info.width_div_8 << xenos::kResolveAlignmentPixelsLog2) *\n        draw_resolution_scale_x;\n    uint32_t height = (height_div_8 << xenos::kResolveAlignmentPixelsLog2) *\n                      draw_resolution_scale_y;\n    const ResolveCopyShaderInfo& shader_info =\n        resolve_copy_shader_info[size_t(shader)];\n    group_count_x_out = (width + ((1 << shader_info.group_size_x_log2) - 1)) >>\n                        shader_info.group_size_x_log2;\n    group_count_y_out = (height + ((1 << shader_info.group_size_y_log2) - 1)) >>\n                        shader_info.group_size_y_log2;\n  } else {\n    XELOGE(\"No resolve copy compute shader for the provided configuration\");\n    assert_always();\n    group_count_x_out = 0;\n    group_count_y_out = 0;\n  }\n\n  return shader;\n}\n\n}  // namespace draw_util\n}  // namespace gpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/draw_util.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_DRAW_UTIL_H_\n#define XENIA_GPU_DRAW_UTIL_H_\n\n#include <cmath>\n#include <cstdint>\n#include <utility>\n#include <vector>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/gpu/register_file.h\"\n#include \"xenia/gpu/registers.h\"\n#include \"xenia/gpu/shader.h\"\n#include \"xenia/gpu/trace_writer.h\"\n#include \"xenia/gpu/xenos.h\"\n#include \"xenia/memory.h\"\n\nnamespace xe {\nnamespace gpu {\nnamespace draw_util {\n\nconstexpr bool IsPrimitiveLine(bool vgt_output_path_is_tessellation_enable,\n                               xenos::PrimitiveType type) {\n  if (vgt_output_path_is_tessellation_enable &&\n      type == xenos::PrimitiveType::kLinePatch) {\n    // For patch primitive types, the major mode is always explicit, so just\n    // checking if VGT_OUTPUT_PATH_CNTL::path_select is kTessellationEnable is\n    // enough.\n    return true;\n  }\n  switch (type) {\n    case xenos::PrimitiveType::kLineList:\n    case xenos::PrimitiveType::kLineStrip:\n    case xenos::PrimitiveType::kLineLoop:\n    case xenos::PrimitiveType::k2DLineStrip:\n      return true;\n    default:\n      break;\n  }\n  return false;\n}\n\ninline bool IsPrimitiveLine(const RegisterFile& regs) {\n  return IsPrimitiveLine(regs.Get<reg::VGT_OUTPUT_PATH_CNTL>().path_select ==\n                             xenos::VGTOutputPath::kTessellationEnable,\n                         regs.Get<reg::VGT_DRAW_INITIATOR>().prim_type);\n}\n\n// Polygonal primitive types (not including points and lines) are rasterized as\n// triangles, have front and back faces, and also support face culling and fill\n// modes (polymode_front_ptype, polymode_back_ptype). Other primitive types are\n// always \"front\" (but don't support front face and back face culling, according\n// to OpenGL and Vulkan specifications - even if glCullFace is\n// GL_FRONT_AND_BACK, points and lines are still drawn), and may in some cases\n// use the \"para\" registers instead of \"front\" or \"back\" (for \"parallelogram\" -\n// like poly_offset_para_enable).\nconstexpr bool IsPrimitivePolygonal(bool vgt_output_path_is_tessellation_enable,\n                                    xenos::PrimitiveType type) {\n  if (vgt_output_path_is_tessellation_enable &&\n      (type == xenos::PrimitiveType::kTrianglePatch ||\n       type == xenos::PrimitiveType::kQuadPatch)) {\n    // For patch primitive types, the major mode is always explicit, so just\n    // checking if VGT_OUTPUT_PATH_CNTL::path_select is kTessellationEnable is\n    // enough.\n    return true;\n  }\n  switch (type) {\n    case xenos::PrimitiveType::kTriangleList:\n    case xenos::PrimitiveType::kTriangleFan:\n    case xenos::PrimitiveType::kTriangleStrip:\n    case xenos::PrimitiveType::kTriangleWithWFlags:\n    case xenos::PrimitiveType::kQuadList:\n    case xenos::PrimitiveType::kQuadStrip:\n    case xenos::PrimitiveType::kPolygon:\n      return true;\n    default:\n      break;\n  }\n  // TODO(Triang3l): Investigate how kRectangleList should be treated - possibly\n  // actually drawn as two polygons on the console, however, the current\n  // geometry shader doesn't care about the winding order - allowing backface\n  // culling for rectangles currently breaks 4D53082D.\n  return false;\n}\n\ninline bool IsPrimitivePolygonal(const RegisterFile& regs) {\n  return IsPrimitivePolygonal(\n      regs.Get<reg::VGT_OUTPUT_PATH_CNTL>().path_select ==\n          xenos::VGTOutputPath::kTessellationEnable,\n      regs.Get<reg::VGT_DRAW_INITIATOR>().prim_type);\n}\n\n// Whether with the current state, any samples to rasterize (for any reason, not\n// only to write something to a render target, but also to do sample counting or\n// pixel shader memexport) can be generated. Finally dropping draw calls can\n// only be done if the vertex shader doesn't memexport. Checks mostly special\n// cases (for both the guest and usual host implementations), not everything\n// like whether viewport / scissor are empty (until this truly matters in any\n// game, of course).\nbool IsRasterizationPotentiallyDone(const RegisterFile& regs,\n                                    bool primitive_polygonal);\n\n// Direct3D 10.1+ standard sample positions, also used in Vulkan, for\n// calculations related to host MSAA, in 1/16th of a pixel.\nextern const int8_t kD3D10StandardSamplePositions2x[2][2];\nextern const int8_t kD3D10StandardSamplePositions4x[4][2];\n\nreg::RB_DEPTHCONTROL GetNormalizedDepthControl(const RegisterFile& regs);\n\n// Direct3D 9 and Xenos constant polygon offset is an absolute floating-point\n// value.\n// It's possibly treated just as an absolute offset by the Xenos too - the\n// PA_SU_POLY_OFFSET_DB_FMT_CNTL::POLY_OFFSET_DB_IS_FLOAT_FMT switch was added\n// later in the R6xx, though this needs verification.\n// 5454082B, for example, for float24, sets the bias to 0.000002 - or slightly\n// above 2^-19.\n// The total polygon offset formula specified by Direct3D 9 is:\n// `offset = slope * slope factor + constant offset`\n//\n// Direct3D 10, Metal, OpenGL and Vulkan, however, take the constant polygon\n// offset factor as a relative value, with the formula being:\n// `offset = slope * slope factor +\n//           maximum resolvable difference * constant factor`\n// where the maximum resolvable difference is:\n// - For a fixed-point depth buffer, the minimum representable non-zero value in\n//   the depth buffer, that is 1 / (2^24 - 1) for unorm24 (on Vulkan though it's\n//   allowed to be up to 2 / 2^24 in this case).\n// - For a floating-point depth buffer, it's:\n//   2 ^ (exponent of the maximum Z in the primitive - the number of explicitly\n//        stored mantissa bits)\n//   (23 explicitly stored bits for float32 - and 20 explicitly stored bits for\n//    float24).\n//\n// While the polygon offset is a fixed-function feature in the pipeline, and the\n// formula can't be toggled between absolute and relative, it's important that\n// Xenia translates the guest absolute depth bias into the host relative depth\n// bias in a way that the values that separate coplanar geometry on the guest\n// qualitatively also still correctly separate them on the host.\n//\n// It also should be taken into account that on Xenia, float32 depth values may\n// be snapped to float24 directly in the translated pixel shaders (to prevent\n// data loss if after reuploading a depth buffer to the EDRAM there's no way to\n// recover the full-precision value, that results in the inability to perform\n// more rendering passes for the same geometry), and not only to the nearest\n// value, but also just truncating them (so in case of data loss, the \"greater\n// or equal\" depth test function still works).\n//\n// Because of this, the depth bias may be lost if Xenia translates it into a too\n// small value, and the conversion of the depth is done in the pixel shader.\n// Specifically, Xenia should not simply convert a value that separates coplanar\n// primitives as float24 just into something that still separates them as\n// float32. Essentially, if conversion to float24 is done in the pixel shader,\n// Xenia should make sure the polygon offset on the host is calculated as if the\n// host had float24 depth too, not float32.\n\n// Applies to both native host unorm24, and unorm24 emulated as host float32.\n// For native unorm24, this is exactly the inverse of the minimum representable\n// non-zero value.\n// For unorm24 emulated as float32, the minimum representable non-zero value for\n// a primitive in the [0.5, 1) range (the worst case that forward depth reaches\n// very quickly, at nearly `2 * near clipping plane distance`) is 2 ^ (-1 - 23),\n// or 2^-24, and this factor is almost 2^24.\nconstexpr float kD3D10PolygonOffsetFactorUnorm24 =\n    float((UINT32_C(1) << 24) - 1);\n\n// For a host floating-point depth buffer, the integer value of the depth bias\n// is roughly how many ULPs primitives should be separated by.\n//\n// Float24, however, has 3 mantissa bits fewer than float32 - so one float24 ULP\n// corresponds to 8 float32 ULPs - which means each conceptual \"layer\" of the\n// guest value should correspond to a polygon offset of 8. So, after the guest\n// absolute value is converted to \"layers\", it should be multiplied by 8 before\n// being used on the host with a float32 depth buffer.\n//\n// The scale for converting the guest absolute depth bias to the \"layers\" needs\n// to be determined for the worst case - specifically, the [0.5, 1) range (1 is\n// a single value, so there's no need to take it into consideration). In this\n// range, Z values have the exponent of -1. Therefore, for float24, the absolute\n// offset is obtained from the \"layer index\" in this range as (disregarding the\n// slope term):\n// offset = 2 ^ (-1 - 20) * constant factor\n// Thus, to obtain the constant factor from the absolute offset in the range\n// with the lowest absolute precision, the offset needs to be multiplied by\n// 2^21.\n//\n// Finally, the 0...0.5 range may be used on the host to represent the 0...1\n// guest depth range to be able to copy all possible encodings, which are\n// [0, 2), via a [0, 1] depth output variable, during EDRAM contents\n// reinterpretation. This is done by scaling the viewport depth bounds by 0.5.\n// However, there's no need to do anything to handle this scenario in the\n// polygon offset - it's calculated after applying the viewport transformation,\n// and the maximum Z value in the primitive will have an exponent lowered by 1,\n// thus the result will also have an exponent lowered by 1 - exactly what's\n// needed for remapping 0...1 to 0...0.5.\nconstexpr float kD3D10PolygonOffsetFactorFloat24 =\n    float(UINT32_C(1) << (21 + 3));\n\ninline int32_t GetD3D10IntegerPolygonOffset(\n    xenos::DepthRenderTargetFormat depth_format, float polygon_offset) {\n  bool is_float24 = depth_format == xenos::DepthRenderTargetFormat::kD24FS8;\n  // Using `ceil` because more offset is better, especially if flooring would\n  // result in 0 - conceptually, if the offset is used at all, primitives need\n  // to be separated in the depth buffer.\n  int32_t polygon_offset_int = int32_t(\n      std::ceil(std::abs(polygon_offset) *\n                (is_float24 ? kD3D10PolygonOffsetFactorFloat24 * (1.0f / 8.0f)\n                            : kD3D10PolygonOffsetFactorUnorm24)));\n  // For float24, the conversion may be done in the translated pixel shaders,\n  // including via truncation rather than rounding to the nearest. So, making\n  // the integer bias always in the increments of 2^3 (2 ^ the difference in the\n  // mantissa bit count between float32 and float24), and because of that, doing\n  // `ceil` before changing the units from float24 ULPs to float32 ULPs.\n  if (is_float24) {\n    polygon_offset_int <<= 3;\n  }\n  return polygon_offset < 0 ? -polygon_offset_int : polygon_offset_int;\n}\n\n// For hosts not supporting separate front and back polygon offsets, returns the\n// polygon offset for the face which likely needs the offset the most (and that\n// will not be culled). The values returned will have the units of the original\n// registers (the scale is for 1/16 subpixels, multiply by\n// xenos::kPolygonOffsetScaleSubpixelUnit outside if the value for pixels is\n// needed).\nvoid GetPreferredFacePolygonOffset(const RegisterFile& regs,\n                                   bool primitive_polygonal, float& scale_out,\n                                   float& offset_out);\n\ninline bool DoesCoverageDependOnAlpha(reg::RB_COLORCONTROL rb_colorcontrol) {\n  return (rb_colorcontrol.alpha_test_enable &&\n          rb_colorcontrol.alpha_func != xenos::CompareFunction::kAlways) ||\n         rb_colorcontrol.alpha_to_mask_enable;\n}\n\n// Whether the pixel shader can be disabled on the host to speed up depth\n// pre-passes and shadowmaps. The shader must have its ucode analyzed. If\n// IsRasterizationPotentiallyDone, this shouldn't be called, and assumed false\n// instead. Helps reject the pixel shader in some cases - memexport draws in\n// 4D5307E6, and also most of some 1-point draws not covering anything done for\n// some reason in different games with a leftover pixel shader from the previous\n// draw, but with SQ_PROGRAM_CNTL destroyed, reducing the number of\n// unpredictable unneeded translations of random shaders with different host\n// modification bits, such as register count and depth format-related (though\n// shaders with side effects on depth or memory export will still be preserved).\nbool IsPixelShaderNeededWithRasterization(const Shader& shader,\n                                          const RegisterFile& regs);\n\nstruct ViewportInfo {\n  // Offset from render target UV = 0 to +UV.\n  // For simplicity of cropping to the maximum size on the host; to match the\n  // Direct3D 12 clipping / scissoring behavior with a fractional viewport, to\n  // floor(TopLeftXY) ... floor(TopLeftXY + WidthHeight), on the real AMD, Intel\n  // and Nvidia hardware (not WARP); as well as to hide the differences between\n  // 0 and 8+ viewportSubPixelBits on Vulkan, and to prevent any numerical error\n  // in bound checking in host APIs, viewport bounds are returned as integers.\n  // Also they're returned as non-negative, also to make it easier to crop (so\n  // Vulkan maxViewportDimensions and viewportBoundsRange don't have to be\n  // handled separately - maxViewportDimensions is greater than or equal to the\n  // largest framebuffer image size, so it's safe, and viewportBoundsRange is\n  // always bigger than maxViewportDimensions. All fractional offsetting,\n  // including the half-pixel offset, and cropping are handled via ndc_scale and\n  // ndc_offset.\n  uint32_t xy_offset[2];\n  // Extent can be zero for an empty viewport - host APIs not supporting empty\n  // viewports need to use an empty scissor rectangle.\n  uint32_t xy_extent[2];\n  float z_min;\n  float z_max;\n  // The scale is applied before the offset (like using multiply-add).\n  float ndc_scale[3];\n  float ndc_offset[3];\n};\n// Converts the guest viewport (or fakes one if drawing without a viewport) to\n// a viewport, plus values to multiply-add the returned position by, usable on\n// host graphics APIs such as Direct3D 11+ and Vulkan, also forcing it to the\n// Direct3D clip space with 0...W Z rather than -W...W.\nvoid GetHostViewportInfo(const RegisterFile& regs,\n                         uint32_t draw_resolution_scale_x,\n                         uint32_t draw_resolution_scale_y,\n                         bool origin_bottom_left, uint32_t x_max,\n                         uint32_t y_max, bool allow_reverse_z,\n                         reg::RB_DEPTHCONTROL normalized_depth_control,\n                         bool convert_z_to_float24, bool full_float24_in_0_to_1,\n                         bool pixel_shader_writes_depth,\n                         ViewportInfo& viewport_info_out);\n\nstruct Scissor {\n  // Offset from render target UV = 0 to +UV.\n  uint32_t offset[2];\n  // Extent can be zero.\n  uint32_t extent[2];\n};\nvoid GetScissor(const RegisterFile& regs, Scissor& scissor_out,\n                bool clamp_to_surface_pitch = true);\n\n// Returns the color component write mask for the draw command taking into\n// account which color targets are written to by the pixel shader, as well as\n// components that don't exist in the formats of the render targets (render\n// targets with only non-existent components written are skipped, but\n// non-existent components are forced to written if some existing components of\n// the render target are actually used to make sure the host driver doesn't try\n// to take a slow path involving reading and mixing if there are any disabled\n// components even if they don't actually exist).\nuint32_t GetNormalizedColorMask(const RegisterFile& regs,\n                                uint32_t pixel_shader_writes_color_targets);\n\n// Never an identity conversion - can always write conditional move instructions\n// to shaders that will be no-ops for conversion from guest to host samples.\n// While we don't know the exact guest sample pattern, due to the way\n// multisampled render targets are stored in the memory (like 1x2 single-sampled\n// pixels with 2x MSAA, or like 2x2 single-sampled pixels with 4x), assuming\n// that the sample 0 is the top sample, and the sample 1 is the bottom one.\ninline uint32_t GetD3D10SampleIndexForGuest2xMSAA(\n    uint32_t guest_sample_index, bool native_2x_msaa_supported) {\n  assert(guest_sample_index <= 1);\n  if (native_2x_msaa_supported) {\n    // On Direct3D 10.1 with native 2x MSAA, the top-left sample is 1, and the\n    // bottom-right sample is 0.\n    return guest_sample_index ? 0 : 1;\n  }\n  // When native 2x MSAA is not supported, using the top-left (0) and the\n  // bottom-right (3) samples of the guaranteed 4x MSAA.\n  return guest_sample_index ? 3 : 0;\n}\n\nstruct MemExportRange {\n  uint32_t base_address_dwords;\n  uint32_t size_bytes;\n\n  explicit MemExportRange(uint32_t base_address_dwords, uint32_t size_bytes)\n      : base_address_dwords(base_address_dwords), size_bytes(size_bytes) {}\n};\n\n// Gathers memory ranges involved in memexports in the shader with the float\n// constants from the registers, adding them to ranges_out.\nvoid AddMemExportRanges(const RegisterFile& regs, const Shader& shader,\n                        std::vector<MemExportRange>& ranges_out);\n\n// To avoid passing values that the shader won't understand (even though\n// Direct3D 9 shouldn't pass them anyway).\nxenos::CopySampleSelect SanitizeCopySampleSelect(\n    xenos::CopySampleSelect copy_sample_select, xenos::MsaaSamples msaa_samples,\n    bool is_depth);\n\n// Packed structures are small and can be passed to the shaders in root/push\n// constants.\n\nunion ResolveEdramInfo {\n  uint32_t packed;\n  struct {\n    // With 32bpp/64bpp taken into account.\n    uint32_t pitch_tiles : xenos::kEdramPitchTilesBits;\n    xenos::MsaaSamples msaa_samples : xenos::kMsaaSamplesBits;\n    uint32_t is_depth : 1;\n    // With offset to the region that edram_offset_x/y_div_8 are relative to.\n    uint32_t base_tiles : xenos::kEdramBaseTilesBits;\n    uint32_t format : xenos::kRenderTargetFormatBits;\n    uint32_t format_is_64bpp : 1;\n    // Whether to fill the half-pixel offset gap on the left and the top sides\n    // of the resolve region with the contents of the first surely covered\n    // column / row with resolution scaling.\n    uint32_t fill_half_pixel_offset : 1;\n  };\n  ResolveEdramInfo() : packed(0) { static_assert_size(*this, sizeof(packed)); }\n};\n\nunion ResolveCoordinateInfo {\n  uint32_t packed;\n  struct {\n    // In pixels relatively to the origin of the EDRAM base tile.\n    // 0...9 for 0...72.\n    uint32_t edram_offset_x_div_8 : 4;\n    // 0...1 for 0...8.\n    uint32_t edram_offset_y_div_8 : 1;\n\n    // In pixels.\n    // May be zero if the original rectangle was somehow specified in a\n    // totally broken way - in this case, the resolve must be dropped.\n    uint32_t width_div_8 : xenos::kResolveSizeBits -\n                           xenos::kResolveAlignmentPixelsLog2;\n\n    // 1 to 7.\n    uint32_t draw_resolution_scale_x : 3;\n    uint32_t draw_resolution_scale_y : 3;\n  };\n  ResolveCoordinateInfo() : packed(0) {\n    static_assert_size(*this, sizeof(packed));\n  }\n};\n\n// Returns tiles actually covered by a resolve area. Row length used is width of\n// the area in tiles, but the pitch between rows is edram_info.pitch_tiles.\nvoid GetResolveEdramTileSpan(ResolveEdramInfo edram_info,\n                             ResolveCoordinateInfo coordinate_info,\n                             uint32_t height_div_8, uint32_t& base_out,\n                             uint32_t& row_length_used_out, uint32_t& rows_out);\n\nunion ResolveCopyDestCoordinateInfo {\n  uint32_t packed;\n  struct {\n    // 0...16384/32.\n    uint32_t pitch_aligned_div_32 : xenos::kTexture2DCubeMaxWidthHeightLog2 +\n                                    2 - xenos::kTextureTileWidthHeightLog2;\n    uint32_t height_aligned_div_32 : xenos::kTexture2DCubeMaxWidthHeightLog2 +\n                                     2 - xenos::kTextureTileWidthHeightLog2;\n\n    // Up to the maximum period of the texture tiled address function (128x128\n    // for 2D 1bpb).\n    uint32_t offset_x_div_8 : 7 - xenos::kResolveAlignmentPixelsLog2;\n    uint32_t offset_y_div_8 : 7 - xenos::kResolveAlignmentPixelsLog2;\n\n    xenos::CopySampleSelect copy_sample_select : 3;\n  };\n  ResolveCopyDestCoordinateInfo() : packed(0) {\n    static_assert_size(*this, sizeof(packed));\n  }\n};\n\n// For backends with Shader Model 5-like compute, host shaders to use to perform\n// copying in resolve operations.\nenum class ResolveCopyShaderIndex {\n  kFast32bpp1x2xMSAA,\n  kFast32bpp4xMSAA,\n  kFast64bpp1x2xMSAA,\n  kFast64bpp4xMSAA,\n\n  kFull8bpp,\n  kFull16bpp,\n  kFull32bpp,\n  kFull64bpp,\n  kFull128bpp,\n\n  kCount,\n  kUnknown = kCount,\n};\n\nstruct ResolveCopyShaderInfo {\n  // Debug name of the pipeline state object with this shader.\n  const char* debug_name;\n  // Log2 of number of pixels in a single thread group along X and Y. 64 threads\n  // per group preferred (GCN lane count).\n  uint32_t group_size_x_log2, group_size_y_log2;\n};\n\nextern const ResolveCopyShaderInfo\n    resolve_copy_shader_info[size_t(ResolveCopyShaderIndex::kCount)];\n\nstruct ResolveCopyShaderConstants {\n  // When the destination base is not needed (not binding the entire shared\n  // memory buffer - with resoluion scaling, for instance), only the\n  // DestRelative part may be passed to the shader to use less constants.\n  struct DestRelative {\n    ResolveEdramInfo edram_info;\n    ResolveCoordinateInfo coordinate_info;\n    reg::RB_COPY_DEST_INFO dest_info;\n    ResolveCopyDestCoordinateInfo dest_coordinate_info;\n  };\n  DestRelative dest_relative;\n  uint32_t dest_base;\n};\n\nstruct ResolveClearShaderConstants {\n  // rt_specific is different for color and depth, the rest is the same and can\n  // be preserved in the root bindings when going from depth to color.\n  struct RenderTargetSpecific {\n    uint32_t clear_value[2];\n    ResolveEdramInfo edram_info;\n  };\n  RenderTargetSpecific rt_specific;\n  ResolveCoordinateInfo coordinate_info;\n};\n\nstruct ResolveInfo {\n  reg::RB_COPY_CONTROL rb_copy_control;\n\n  // depth_edram_info / depth_original_base and color_edram_info /\n  // color_original_base are set up if copying or clearing color and depth\n  // respectively, according to RB_COPY_CONTROL.\n  ResolveEdramInfo depth_edram_info;\n  ResolveEdramInfo color_edram_info;\n  // Original bases, without adjustment to a 160x32 region for packed offsets,\n  // for locating host render targets to perform clears if host render targets\n  // are used for EDRAM emulation - the same as the base that the render target\n  // will likely be used for drawing next, to prevent unneeded tile ownership\n  // transfers between clears and first usage if clearing a subregion.\n  uint32_t depth_original_base;\n  uint32_t color_original_base;\n\n  ResolveCoordinateInfo coordinate_info;\n  // Like coordinate_info.width_div_8, but not needed for shaders.\n  // In pixels.\n  // May be zero if the original rectangle was somehow specified in a totally\n  // broken way - in this case, the resolve must be dropped.\n  uint32_t height_div_8;\n\n  reg::RB_COPY_DEST_INFO copy_dest_info;\n  ResolveCopyDestCoordinateInfo copy_dest_coordinate_info;\n\n  // The address of the texture or the location within the texture that\n  // copy_dest_coordinate_info.offset_x/y_div_8 - the origin of the copy\n  // destination - is relative to.\n  uint32_t copy_dest_base;\n  // Memory range that will potentially be modified by copying to the texture.\n  // copy_dest_extent_length may be zero if something is wrong with the\n  // destination, in this case, clearing may still be done, but copying must be\n  // dropped.\n  uint32_t copy_dest_extent_start;\n  uint32_t copy_dest_extent_length;\n\n  // The clear shaders always write to a uint4 view of EDRAM.\n  uint32_t rb_depth_clear;\n  uint32_t rb_color_clear;\n  uint32_t rb_color_clear_lo;\n\n  bool IsCopyingDepth() const {\n    return rb_copy_control.copy_src_select >= xenos::kMaxColorRenderTargets;\n  }\n\n  // See GetResolveEdramTileSpan documentation for explanation.\n  void GetCopyEdramTileSpan(uint32_t& base_out, uint32_t& row_length_used_out,\n                            uint32_t& rows_out, uint32_t& pitch_out) const {\n    ResolveEdramInfo edram_info =\n        IsCopyingDepth() ? depth_edram_info : color_edram_info;\n    GetResolveEdramTileSpan(edram_info, coordinate_info, height_div_8, base_out,\n                            row_length_used_out, rows_out);\n    pitch_out = edram_info.pitch_tiles;\n  }\n\n  ResolveCopyShaderIndex GetCopyShader(\n      uint32_t draw_resolution_scale_x, uint32_t draw_resolution_scale_y,\n      ResolveCopyShaderConstants& constants_out, uint32_t& group_count_x_out,\n      uint32_t& group_count_y_out) const;\n\n  bool IsClearingDepth() const {\n    return rb_copy_control.depth_clear_enable != 0;\n  }\n\n  bool IsClearingColor() const {\n    return !IsCopyingDepth() && rb_copy_control.color_clear_enable != 0;\n  }\n\n  void GetDepthClearShaderConstants(\n      ResolveClearShaderConstants& constants_out) const {\n    assert_true(IsClearingDepth());\n    constants_out.rt_specific.clear_value[0] = rb_depth_clear;\n    constants_out.rt_specific.clear_value[1] = rb_depth_clear;\n    constants_out.rt_specific.edram_info = depth_edram_info;\n    constants_out.coordinate_info = coordinate_info;\n  }\n\n  void GetColorClearShaderConstants(\n      ResolveClearShaderConstants& constants_out) const {\n    assert_true(IsClearingColor());\n    // Not doing -32...32 to -1...1 clamping here as a hack for k_16_16 and\n    // k_16_16_16_16 blending emulation when using host render targets as it\n    // would be inconsistent with the usual way of clearing with a depth quad.\n    // TODO(Triang3l): Check which 32-bit portion is in which register.\n    constants_out.rt_specific.clear_value[0] = rb_color_clear;\n    constants_out.rt_specific.clear_value[1] = rb_color_clear_lo;\n    constants_out.rt_specific.edram_info = color_edram_info;\n    constants_out.coordinate_info = coordinate_info;\n  }\n\n  std::pair<uint32_t, uint32_t> GetClearShaderGroupCount(\n      uint32_t draw_resolution_scale_x,\n      uint32_t draw_resolution_scale_y) const {\n    // 8 guest MSAA samples per invocation.\n    uint32_t width_samples_div_8 = coordinate_info.width_div_8;\n    uint32_t height_samples_div_8 = height_div_8;\n    xenos::MsaaSamples samples = IsCopyingDepth()\n                                     ? depth_edram_info.msaa_samples\n                                     : color_edram_info.msaa_samples;\n    if (samples >= xenos::MsaaSamples::k2X) {\n      height_samples_div_8 <<= 1;\n      if (samples >= xenos::MsaaSamples::k4X) {\n        width_samples_div_8 <<= 1;\n      }\n    }\n    width_samples_div_8 *= draw_resolution_scale_x;\n    height_samples_div_8 *= draw_resolution_scale_y;\n    return std::make_pair((width_samples_div_8 + uint32_t(7)) >> 3,\n                          height_samples_div_8);\n  }\n};\n\n// Returns false if there was an error obtaining the info making it totally\n// invalid. fixed_rg[ba]16_truncated_to_minus_1_to_1 is false if 16_16[_16_16]\n// color render target formats are properly emulated as -32...32, true if\n// emulated as snorm, with range limited to -1...1, but with correct blending\n// within that range.\nbool GetResolveInfo(const RegisterFile& regs, const Memory& memory,\n                    TraceWriter& trace_writer, uint32_t draw_resolution_scale_x,\n                    uint32_t draw_resolution_scale_y,\n                    bool fixed_rg16_truncated_to_minus_1_to_1,\n                    bool fixed_rgba16_truncated_to_minus_1_to_1,\n                    ResolveInfo& info_out);\n\n}  // namespace draw_util\n}  // namespace gpu\n}  // namespace xe\n\n#endif  // XENIA_GPU_DRAW_UTIL_H_\n"
  },
  {
    "path": "src/xenia/gpu/dxbc.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_DXBC_H_\n#define XENIA_GPU_DXBC_H_\n\n#include <cstdint>\n#include <cstdlib>\n#include <cstring>\n#include <vector>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/memory.h\"\n\nnamespace xe {\nnamespace gpu {\nnamespace dxbc {\n\n// Utilities for generating shader model 5_1 byte code (for Direct3D 12).\n//\n// This file contains only parts of DXBC used by Xenia currently or previously,\n// not all of DXBC. If an operation, operand, blob or something else is needed\n// for Xenia, but is not here, add it (after reproducing it with FXC to see what\n// dependencies - such as STAT fields being modified - and encoding specifics it\n// has).\n//\n// IMPORTANT CONTRIBUTION NOTES:\n//\n// While DXBC may look like a flexible and high-level representation with highly\n// generalized building blocks, actually it has a lot of restrictions on operand\n// usage!\n// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n// !!!DO NOT ADD ANYTHING FXC THAT WOULD NOT PRODUCE!!!\n// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n// Before adding any sequence that you haven't seen in Xenia, try writing\n// equivalent code in HLSL and running it through FXC, try with /Od, try with\n// full optimization, but if you see that FXC follows a different pattern than\n// what you are expecting, do what FXC does!!!\n// Most important limitations:\n// - Absolute, negate and saturate are only supported by instructions that\n//   explicitly support them. See MSDN pages of the specific instructions you\n//   want to use with modifiers:\n//   https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx9-graphics-reference-asm\n// - Component selection in the general case (ALU instructions - things like\n//   resource access and flow control mostly explicitly need a specific\n//   component selection mode defined in the specification of the instruction):\n//   - 0-component - for operand types with no data (samplers, labels).\n//   - 1-component - for scalar destination operand types, and for scalar source\n//     operand types when the destination vector has 1 component masked\n//     (including scalar immediates).\n//   - Mask - for vector destination operand types.\n//   - Swizzle - for both vector and scalar (replicated in this case) source\n//     operand types, when the destination vector has 2 or more components\n//     masked. Immediates in this case have XYZW swizzle.\n//   - Select 1 - for vector source operand types, when the destination has 1\n//     component masked or is of a scalar type.\n// - Input operands (v#) can be used only as sources, output operands (o#) can\n//   be used only as destinations.\n// - Indexable temporaries (x#) can only be used as a destination or a source\n//   operand (but not both at once) of a mov instruction - a load/store pattern\n//   here. Also, movs involving x# are counted as ArrayInstructions rather than\n//   MovInstructions in STAT. The other operand can be anything that most other\n//   instructions accept, but it still must be a mov with x# on one side.\n// !NOTE!: The D3D11.3 Functional Specification on Microsoft's GitHub profile,\n// as of March 27th, 2020, is NOT a reliable reference, even though it contains\n// many DXBC details! There are multiple places where it clearly contradicts\n// what FXC does, even when targeting old shader models like 4_0:\n// - The limit of 1 immediate or constant buffer source operand per instruction\n//   is totally ignored by FXC - in simple tests, it can emit an instruction\n//   with two constant buffer sources, or one constant buffer source and one\n//   immediate, or a multiply-add with two immediate operands.\n// - It says x# can be used wherever r# can be used - in synthetic tests, FXC\n//   always accesses x# in a load/store way via mov.\n// - It says x# can be used for indexing, including nested indexing of x# (one\n//   level deep), however, FXC moves the inner index operand to r# first in this\n//   case.\n//\n// For bytecode structure, see d3d12TokenizedProgramFormat.hpp from the Windows\n// Driver Kit, and DXILConv from DirectX Shader Compiler.\n//\n// Avoid using uninitialized register components - such as registers written to\n// in \"if\" and not in \"else\", but then used outside unconditionally or with a\n// different condition (or even with the same condition, but in a different \"if\"\n// block). This will cause crashes on AMD drivers, and will also limit\n// optimization possibilities as this may result in false dependencies. Always\n// mov l(0, 0, 0, 0) to such components before potential branching -\n// PushSystemTemp accepts a zero mask for this purpose.\n//\n// Clamping of non-negative values must be done first to the lower bound (using\n// max), then to the upper bound (using min), to match the saturate modifier\n// behavior, which results in 0 for NaN.\n//\n// Sources (apart from reverse engineering of compiled shaders):\n// - Hash:\n//   - DXBCChecksum from GPUOpen-Archive/common-src-ShaderUtils\n// - RDEF:\n//   - d3d12shader.h from the Windows SDK\n//   - D3D10ShaderObject.h from GPUOpen-Archive/common-src-ShaderUtils\n// - ISGN, PCSG, OSGN:\n//   - d3d12shader.h from the Windows SDK\n//   - DxbcSignatures.h from DXILConv\n// - SHEX:\n//   - d3d12TokenizedProgramFormat.hpp from the Windows Driver Kit\n// - SFI0:\n//   - DXBCUtils.h from the D3D12 Translation Layer\n// - STAT:\n//   - D3D10ShaderObject.h fromGPUOpen-Archive/common-src-ShaderUtils\n//   - d3dcompiler_parse_stat from Wine\n//   - d3d12shader.h from the Windows SDK\n// Note that d3d12shader.h contains structures for use with Direct3D reflection\n// interfaces, not the DXBC containers themselves. They may have fields removed,\n// reordered or added.\n//\n// Pointers in RDEF and signatures are offsets from the start of the blob (not\n// including the FourCC and the size), 0 pointer is considered null when\n// applicable.\n//\n// Even if DXIL emission is added to Xenia, it's still desirable to keep the\n// DXBC emitter as a usable option (unless supporting it becomes excessively\n// burdensome) - apart from much worse readability of the resulting DXIL code,\n// the UWP GPU driver on the Xbox One also doesn't support DXIL.\n\nconstexpr uint8_t kAlignmentPadding = 0xAB;\n\nconstexpr uint32_t MakeFourCC(uint32_t ch0, uint32_t ch1, uint32_t ch2,\n                              uint32_t ch3) {\n  return uint32_t(ch0) | (uint32_t(ch1) << 8) | (uint32_t(ch2) << 16) |\n         (uint32_t(ch3) << 24);\n}\n\nstruct alignas(uint32_t) ContainerHeader {\n  static constexpr uint32_t kFourCC = MakeFourCC('D', 'X', 'B', 'C');\n  static constexpr uint16_t kVersionMajor = 1;\n  static constexpr uint16_t kVersionMinor = 0;\n  uint32_t fourcc;\n  // Of the entire DXBC container including this header, with this set to 0\n  // before hashing. Calculate using CalculateDXBCChecksum from\n  // GPUOpen-Archive/common-src-ShaderUtils.\n  uint32_t hash[4];\n  uint16_t version_major;\n  uint16_t version_minor;\n  uint32_t size_bytes;\n  uint32_t blob_count;\n  void InitializeIdentification() {\n    fourcc = kFourCC;\n    version_major = kVersionMajor;\n    version_minor = kVersionMinor;\n  }\n  // Followed by uint32_t[blob_count] offsets from the start of the container in\n  // bytes to the start of each blob's header.\n};\nstatic_assert_size(ContainerHeader, sizeof(uint32_t) * 8);\n\nstruct alignas(uint32_t) BlobHeader {\n  enum class FourCC : uint32_t {\n    // In order of appearance in a container.\n    kResourceDefinition = MakeFourCC('R', 'D', 'E', 'F'),\n    kInputSignature = MakeFourCC('I', 'S', 'G', 'N'),\n    kInputSignature_11_1 = MakeFourCC('I', 'S', 'G', '1'),\n    kPatchConstantSignature = MakeFourCC('P', 'C', 'S', 'G'),\n    kOutputSignature = MakeFourCC('O', 'S', 'G', 'N'),\n    kOutputSignatureForGS = MakeFourCC('O', 'S', 'G', '5'),\n    kOutputSignature_11_1 = MakeFourCC('O', 'S', 'G', '1'),\n    kShaderEx = MakeFourCC('S', 'H', 'E', 'X'),\n    kShaderFeatureInfo = MakeFourCC('S', 'F', 'I', '0'),\n    kStatistics = MakeFourCC('S', 'T', 'A', 'T'),\n  };\n  FourCC fourcc;\n  uint32_t size_bytes;\n};\nstatic_assert_size(BlobHeader, sizeof(uint32_t) * 2);\n\n// Appends a string to a DWORD stream, returns the DWORD-aligned length.\ninline uint32_t AppendAlignedString(std::vector<uint32_t>& dest,\n                                    const char* source) {\n  size_t size = std::strlen(source) + 1;\n  size_t size_aligned = xe::align(size, sizeof(uint32_t));\n  size_t dest_position = dest.size();\n  dest.resize(dest_position + size_aligned / sizeof(uint32_t));\n  std::memcpy(&dest[dest_position], source, size);\n  // Don't leave uninitialized data, and make sure multiple uses of the\n  // assembler with the same input give the same DXBC for driver shader caching.\n  std::memset(reinterpret_cast<uint8_t*>(&dest[dest_position]) + size,\n              dxbc::kAlignmentPadding, size_aligned - size);\n  return uint32_t(size_aligned);\n}\n\n// Returns the length of a string as if it was appended to a DWORD stream, in\n// bytes.\ninline uint32_t GetAlignedStringLength(const char* source) {\n  return uint32_t(xe::align(std::strlen(source) + 1, sizeof(uint32_t)));\n}\n\n// D3DCOMPILE subset\nenum CompileFlags : uint32_t {\n  // NoPreshader and PreferFlowControl are set by default for shader model 5_1.\n  kCompileFlagNoPreshader = 1 << 8,\n  kCompileFlagPreferFlowControl = 1 << 10,\n  kCompileFlagIeeeStrictness = 1 << 13,\n  kCompileFlagEnableUnboundedDescriptorTables = 1 << 20,\n  kCompileFlagAllResourcesBound = 1 << 21,\n};\n\n// D3D_SHADER_VARIABLE_CLASS\nenum class RdefVariableClass : uint16_t {\n  kScalar,\n  kVector,\n  kMatrixRows,\n  kMatrixColumns,\n  kObject,\n  kStruct,\n  kInterfaceClass,\n  kInterfacePointer,\n};\n\n// D3D_SHADER_VARIABLE_TYPE subset\nenum class RdefVariableType : uint16_t {\n  kInt = 2,\n  kFloat = 3,\n  kUInt = 19,\n};\n\n// D3D_SHADER_VARIABLE_FLAGS\nenum RdefVariableFlags : uint32_t {\n  kRdefVariableFlagUserPacked = 1 << 0,\n  kRdefVariableFlagUsed = 1 << 1,\n  kRdefVariableFlagInterfacePointer = 1 << 2,\n  kRdefVariableFlagInterfaceParameter = 1 << 3,\n};\n\n// D3D_SHADER_CBUFFER_FLAGS\nenum RdefCbufferFlags : uint32_t {\n  kRdefCbufferFlagUserPacked = 1 << 0,\n};\n\n// D3D_CBUFFER_TYPE\nenum class RdefCbufferType : uint32_t {\n  kCbuffer,\n  kTbuffer,\n  kInterfacePointers,\n  kResourceBindInfo,\n};\n\n// D3D_SHADER_INPUT_TYPE\nenum class RdefInputType : uint32_t {\n  kCbuffer,\n  kTbuffer,\n  kTexture,\n  kSampler,\n  kUAVRWTyped,\n  kStructured,\n  kUAVRWStructured,\n  kByteAddress,\n  kUAVRWByteAddress,\n  kUAVAppendStructured,\n  kUAVConsumeStructured,\n  kUAVRWStructuredWithCounter,\n};\n\n// D3D_RESOURCE_RETURN_TYPE / D3D10_SB_RESOURCE_RETURN_TYPE\nenum class ResourceReturnType : uint32_t {\n  kVoid,\n  kUNorm,\n  kSNorm,\n  kSInt,\n  kUInt,\n  kFloat,\n  kMixed,\n  kDouble,\n  kContinued,\n};\n\n// D3D12_SRV_DIMENSION / D3D12_UAV_DIMENSION\nenum class RdefDimension : uint32_t {\n  kUnknown = 0,\n\n  kSRVBuffer = 1,\n  kSRVTexture1D,\n  kSRVTexture1DArray,\n  kSRVTexture2D,\n  kSRVTexture2DArray,\n  kSRVTexture2DMS,\n  kSRVTexture2DMSArray,\n  kSRVTexture3D,\n  kSRVTextureCube,\n  kSRVTextureCubeArray,\n\n  kUAVBuffer = 1,\n  kUAVTexture1D,\n  kUAVTexture1DArray,\n  kUAVTexture2D,\n  kUAVTexture2DArray,\n  kUAVTexture3D,\n};\n\n// D3D_SHADER_INPUT_FLAGS\nenum RdefInputFlags : uint32_t {\n  // For constant buffers, UserPacked is set if it was declared as `cbuffer`\n  // rather than `ConstantBuffer<T>` (not dynamically indexable; though\n  // non-uniform dynamic indexing of constant buffers also didn't work on AMD\n  // drivers in 2018) - not to be confused with kRdefCbufferFlagUserPacked,\n  // which is set in a different case.\n  kRdefInputFlagUserPacked = 1 << 0,\n  kRdefInputFlagComparisonSampler = 1 << 1,\n  // Texture and typed buffer component count minus 1.\n  kRdefInputFlagsComponentsShift = 2,\n  kRdefInputFlags2Component = 1 << kRdefInputFlagsComponentsShift,\n  kRdefInputFlags3Component = 2 << kRdefInputFlagsComponentsShift,\n  kRdefInputFlags4Component = 3 << kRdefInputFlagsComponentsShift,\n  kRdefInputFlagUnused = 1 << 4,\n};\n\nenum class RdefShaderModel : uint32_t {\n  kPixelShader5_1 = 0xFFFF0501u,\n  kVertexShader5_1 = 0xFFFE0501u,\n  kGeometryShader5_1 = 0x47530501u,\n  kDomainShader5_1 = 0x44530501u,\n  kComputeShader5_1 = 0x43530501u,\n};\n\n// D3D12_SHADER_TYPE_DESC with some differences.\nstruct alignas(uint32_t) RdefType {\n  RdefVariableClass variable_class;\n  RdefVariableType variable_type;\n  // Matrix rows, 1 for other numeric, 0 if not applicable.\n  uint16_t row_count;\n  // Vector and matrix columns, 1 for other numerics, 0 if not applicable.\n  uint16_t column_count;\n  // 0 if not an array, except for structures which have 1.\n  uint16_t element_count;\n  // 0 if not a structure.\n  uint16_t member_count;\n  // Null if not a structure.\n  uint32_t members_ptr;\n  // Zero.\n  uint32_t unknown_0[4];\n  // uint is called dword when it's scalar (but uint vectors are still uintN).\n  uint32_t name_ptr;\n};\nstatic_assert_size(RdefType, sizeof(uint32_t) * 9);\n\nstruct alignas(uint32_t) RdefStructureMember {\n  uint32_t name_ptr;\n  uint32_t type_ptr;\n  uint32_t offset_bytes;\n};\nstatic_assert_size(RdefStructureMember, sizeof(uint32_t) * 3);\n\n// D3D12_SHADER_VARIABLE_DESC with some differences.\n// Used for constants in constant buffers primarily.\nstruct alignas(uint32_t) RdefVariable {\n  uint32_t name_ptr;\n  uint32_t start_offset_bytes;\n  uint32_t size_bytes;\n  // RdefVariableFlags.\n  uint32_t flags;\n  uint32_t type_ptr;\n  uint32_t default_value_ptr;\n  // UINT32_MAX if no textures used.\n  uint32_t start_texture;\n  // Number of texture slots possibly used, 0 if no textures used.\n  uint32_t texture_size;\n  // UINT32_MAX if no textures used.\n  uint32_t start_sampler;\n  // Number of sampler slots possibly used, 0 if no textures used.\n  uint32_t sampler_size;\n};\nstatic_assert_size(RdefVariable, sizeof(uint32_t) * 10);\n\n// Sorted by ID.\nstruct alignas(uint32_t) RdefCbuffer {\n  uint32_t name_ptr;\n  uint32_t variable_count;\n  uint32_t variables_ptr;\n  // 16-byte-aligned.\n  uint32_t size_vector_aligned_bytes;\n  RdefCbufferType type;\n  // RdefCbufferFlags.\n  uint32_t flags;\n};\nstatic_assert_size(RdefCbuffer, sizeof(uint32_t) * 6);\n\n// D3D12_SHADER_INPUT_BIND_DESC with some differences.\n// Placed in samplers, SRVs, UAVs, CBVs order, sorted by ID.\nstruct alignas(uint32_t) RdefInputBind {\n  uint32_t name_ptr;\n  RdefInputType type;\n  ResourceReturnType return_type;\n  RdefDimension dimension;\n  // 0 for multisampled textures (the sample count is specified in the SRV\n  // descriptor), constant buffers, ByteAddressBuffers and samplers.\n  // UINT32_MAX for single-sampled textures and typed buffers.\n  uint32_t sample_count;\n  uint32_t bind_point;\n  // 0 for unbounded.\n  uint32_t bind_count;\n  // RdefInputFlags.\n  uint32_t flags;\n  // Bind point space and ID added in shader model 5_1.\n  uint32_t bind_point_space;\n  uint32_t id;\n};\nstatic_assert_size(RdefInputBind, sizeof(uint32_t) * 10);\n\nstruct alignas(uint32_t) RdefHeader {\n  enum class FourCC : uint32_t {\n    // RD11 in Shader Model 5_0 shaders.\n    k5_0 = MakeFourCC('R', 'D', '1', '1'),\n    // RD11 with reversed nibbles in Shader Model 5_0 shaders.\n    k5_1 = 0x25441313u,\n  };\n  uint32_t cbuffer_count;\n  uint32_t cbuffers_ptr;\n  uint32_t input_bind_count;\n  uint32_t input_binds_ptr;\n  RdefShaderModel shader_model;\n  // CompileFlags.\n  uint32_t compile_flags;\n  uint32_t generator_name_ptr;\n  FourCC fourcc;\n  uint32_t sizeof_header_bytes;\n  uint32_t sizeof_cbuffer_bytes;\n  uint32_t sizeof_input_bind_bytes;\n  uint32_t sizeof_variable_bytes;\n  uint32_t sizeof_type_bytes;\n  uint32_t sizeof_structure_member_bytes;\n  // Zero.\n  uint32_t unknown_0;\n  void InitializeSizes() {\n    sizeof_header_bytes = sizeof(*this);\n    sizeof_cbuffer_bytes = sizeof(RdefCbuffer);\n    sizeof_input_bind_bytes = sizeof(RdefInputBind);\n    sizeof_variable_bytes = sizeof(RdefVariable);\n    sizeof_type_bytes = sizeof(RdefType);\n    sizeof_structure_member_bytes = sizeof(RdefStructureMember);\n  }\n};\nstatic_assert_size(RdefHeader, sizeof(uint32_t) * 15);\n\n// D3D_NAME subset\nenum class Name : uint32_t {\n  kUndefined = 0,\n  kPosition = 1,\n  kClipDistance = 2,\n  kCullDistance = 3,\n  kVertexID = 6,\n  kIsFrontFace = 9,\n  kSampleIndex = 10,\n  kFinalQuadEdgeTessFactor = 11,\n  kFinalQuadInsideTessFactor = 12,\n  kFinalTriEdgeTessFactor = 13,\n  kFinalTriInsideTessFactor = 14,\n};\n\n// D3D_REGISTER_COMPONENT_TYPE\nenum class SignatureRegisterComponentType : uint32_t {\n  kUnknown,\n  kUInt32,\n  kSInt32,\n  kFloat32,\n};\n\n// D3D_MIN_PRECISION\nenum class MinPrecision : uint32_t {\n  kDefault,\n  kFloat16,\n  kFloat2_8,\n  kSInt16 = 4,\n  kUInt16,\n  kAny16 = 0xF0,\n  kAny10,\n};\n\n// D3D10_INTERNALSHADER_PARAMETER\nstruct alignas(uint32_t) SignatureParameter {\n  uint32_t semantic_name_ptr;\n  uint32_t semantic_index;\n  // kUndefined for pixel shader outputs - inferred from the component type and\n  // what is used in the shader.\n  Name system_value;\n  SignatureRegisterComponentType component_type;\n  // o#/v# when there's linkage, SV_Target index or UINT32_MAX in pixel shader\n  // output.\n  uint32_t register_index;\n  uint8_t mask;\n  union {\n    // For an output signature.\n    uint8_t never_writes_mask;\n    // For an input signature.\n    uint8_t always_reads_mask;\n  };\n};\nstatic_assert_size(SignatureParameter, sizeof(uint32_t) * 6);\n\n// D3D11_INTERNALSHADER_PARAMETER_FOR_GS\n// Extends SignatureParameter, see it for more information.\nstruct alignas(uint32_t) SignatureParameterForGS {\n  // Stream index (parameters must appear in non-decreasing stream order).\n  uint32_t stream;\n  uint32_t semantic_name_ptr;\n  uint32_t semantic_index;\n  Name system_value;\n  SignatureRegisterComponentType component_type;\n  uint32_t register_index;\n  uint8_t mask;\n  union {\n    uint8_t never_writes_mask;\n    uint8_t always_reads_mask;\n  };\n};\nstatic_assert_size(SignatureParameterForGS, sizeof(uint32_t) * 7);\n\n// D3D11_INTERNALSHADER_PARAMETER_11_1\n// Extends SignatureParameterForGS, see it for more information.\nstruct alignas(uint32_t) SignatureParameter_11_1 {\n  uint32_t stream;\n  uint32_t semantic_name_ptr;\n  uint32_t semantic_index;\n  Name system_value;\n  SignatureRegisterComponentType component_type;\n  uint32_t register_index;\n  uint8_t mask;\n  union {\n    uint8_t never_writes_mask;\n    uint8_t always_reads_mask;\n  };\n  MinPrecision min_precision;\n};\nstatic_assert_size(SignatureParameter_11_1, sizeof(uint32_t) * 8);\n\n// D3D10_INTERNALSHADER_SIGNATURE\nstruct alignas(uint32_t) Signature {\n  uint32_t parameter_count;\n  // If the signature is empty, this still points after the header.\n  uint32_t parameter_info_ptr;\n};\nstatic_assert_size(Signature, sizeof(uint32_t) * 2);\n\n// SHADER_FEATURE\n// Low 32 bits.\nenum ShaderFeature0 : uint32_t {\n  kShaderFeature0_Doubles = 1 << 0,\n  kShaderFeature0_ComputeShadersPlusRawAndStructuredBuffersViaShader_4_X = 1\n                                                                           << 1,\n  kShaderFeature0_UAVsAtEveryStage = 1 << 2,\n  kShaderFeature0_64UAVs = 1 << 3,\n  kShaderFeature0_MinimumPrecision = 1 << 4,\n  kShaderFeature0_11_1_DoubleExtensions = 1 << 5,\n  kShaderFeature0_11_1_ShaderExtensions = 1 << 6,\n  kShaderFeature0_Level9ComparisonFiltering = 1 << 7,\n  kShaderFeature0_TiledResources = 1 << 8,\n  kShaderFeature0_StencilRef = 1 << 9,\n  kShaderFeature0_InnerCoverage = 1 << 10,\n  kShaderFeature0_TypedUAVLoadAdditionalFormats = 1 << 11,\n  kShaderFeature0_ROVs = 1 << 12,\n  kShaderFeature0_ViewportAndRTArrayIndexFromAnyShaderFeedingRasterizer = 1\n                                                                          << 13,\n};\n\nstruct alignas(uint32_t) ShaderFeatureInfo {\n  // UINT64 originally, but aligned to 4 rather than 8.\n  uint32_t feature_flags[2];\n};\nstatic_assert_size(ShaderFeatureInfo, sizeof(uint32_t) * 2);\n\n// D3D11_SB_TESSELLATOR_DOMAIN\nenum class TessellatorDomain : uint32_t {\n  kUndefined,\n  kIsoline,\n  kTriangle,\n  kQuad,\n};\n\n// D3D10_SB_PRIMITIVE_TOPOLOGY\nenum class PrimitiveTopology : uint32_t {\n  kUndefined = 0,\n  kPointList = 1,\n  kLineList = 2,\n  kLineStrip = 3,\n  kTriangleList = 4,\n  kTriangleStrip = 5,\n  kLineListWithAdjacency = 10,\n  kLineStripWithAdjacency = 11,\n  kTriangleListWithAdjacency = 12,\n  kTriangleStripWithAdjacency = 13,\n};\n\n// D3D10_SB_PRIMITIVE\nenum class Primitive : uint32_t {\n  kUndefined = 0,\n  kPoint = 1,\n  kLine = 2,\n  kTriangle = 3,\n  kLineWithAdjacency = 6,\n  kTriangleWithAdjacency = 7,\n  k1ControlPointPatch = 8,\n  k2ControlPointPatch = 9,\n  k3ControlPointPatch = 10,\n  k4ControlPointPatch = 11,\n  k5ControlPointPatch = 12,\n  k6ControlPointPatch = 13,\n  k7ControlPointPatch = 14,\n  k8ControlPointPatch = 15,\n  k9ControlPointPatch = 16,\n  k10ControlPointPatch = 17,\n  k11ControlPointPatch = 18,\n  k12ControlPointPatch = 19,\n  k13ControlPointPatch = 20,\n  k14ControlPointPatch = 21,\n  k15ControlPointPatch = 22,\n  k16ControlPointPatch = 23,\n  k17ControlPointPatch = 24,\n  k18ControlPointPatch = 25,\n  k19ControlPointPatch = 26,\n  k20ControlPointPatch = 27,\n  k21ControlPointPatch = 28,\n  k22ControlPointPatch = 29,\n  k23ControlPointPatch = 30,\n  k24ControlPointPatch = 31,\n  k25ControlPointPatch = 32,\n  k26ControlPointPatch = 33,\n  k27ControlPointPatch = 34,\n  k28ControlPointPatch = 35,\n  k29ControlPointPatch = 36,\n  k30ControlPointPatch = 37,\n  k31ControlPointPatch = 38,\n  k32ControlPointPatch = 39,\n};\n\n// The STAT blob (based on Wine d3dcompiler_parse_stat).\nstruct alignas(uint32_t) Statistics {\n  // Not increased by declarations and labels.\n  uint32_t instruction_count;    // +0\n  uint32_t temp_register_count;  // +4\n  // Unknown in Wine.\n  uint32_t def_count;  // +8\n  // Only inputs and outputs, not CBVs, SRVs, UAVs and samplers.\n  uint32_t dcl_count;                // +C\n  uint32_t float_instruction_count;  // +10\n  uint32_t int_instruction_count;    // +14\n  uint32_t uint_instruction_count;   // +18\n  // endif, ret.\n  uint32_t static_flow_control_count;  // +1C\n  // if (but not else).\n  uint32_t dynamic_flow_control_count;  // +20\n  // Unknown in Wine.\n  uint32_t macro_instruction_count;        // +24\n  uint32_t temp_array_count;               // +28\n  uint32_t array_instruction_count;        // +2C\n  uint32_t cut_instruction_count;          // +30\n  uint32_t emit_instruction_count;         // +34\n  uint32_t texture_normal_instructions;    // +38\n  uint32_t texture_load_instructions;      // +3C\n  uint32_t texture_comp_instructions;      // +40\n  uint32_t texture_bias_instructions;      // +44\n  uint32_t texture_gradient_instructions;  // +48\n  // Not including indexable temp load/store.\n  uint32_t mov_instruction_count;  // +4C\n  // Unknown in Wine.\n  uint32_t movc_instruction_count;        // +50\n  uint32_t conversion_instruction_count;  // +54\n  // Unknown in Wine.\n  uint32_t unknown_22;                   // +58\n  Primitive input_primitive;             // +5C\n  PrimitiveTopology gs_output_topology;  // +60\n  uint32_t gs_max_output_vertex_count;   // +64\n  uint32_t unknown_26;                   // +68\n  // Unknown in Wine, but confirmed by testing.\n  uint32_t lod_instructions;             // +6C\n  uint32_t unknown_28;                   // +70\n  uint32_t unknown_29;                   // +74\n  uint32_t c_control_points;             // +78\n  uint32_t hs_output_primitive;          // +7C\n  uint32_t hs_partitioning;              // +80\n  TessellatorDomain tessellator_domain;  // +84\n  // Unknown in Wine.\n  uint32_t c_barrier_instructions;  // +88\n  // Unknown in Wine.\n  uint32_t c_interlocked_instructions;  // +8C\n  // Unknown in Wine, but confirmed by testing.\n  uint32_t c_texture_store_instructions;  // +90\n};\nstatic_assert_size(Statistics, sizeof(uint32_t) * 37);\n\n// A shader blob begins with a version token and the shader length in dwords\n// (including the version token and the length token itself).\n\n// D3D10_SB_TOKENIZED_PROGRAM_TYPE\nenum class ProgramType : uint32_t {\n  kPixelShader,\n  kVertexShader,\n  kGeometryShader,\n  kHullShader,\n  kDomainShader,\n  kComputeShader,\n};\n\nconstexpr uint32_t VersionToken(ProgramType program_type,\n                                uint32_t major_version,\n                                uint32_t minor_version) {\n  return (uint32_t(program_type) << 16) | (major_version << 4) | minor_version;\n}\n\n// D3D10_SB_CUSTOMDATA_CLASS\nenum class CustomDataClass : uint32_t {\n  kComment,\n  kDebugInfo,\n  kOpaque,\n  kDclImmediateConstantBuffer,\n  kShaderMessage,\n  kShaderClipPlaneConstantMappingsForDX9,\n};\n\n// D3D10_SB_OPERAND_TYPE subset\nenum class OperandType : uint32_t {\n  kTemp = 0,\n  kInput = 1,\n  kOutput = 2,\n  // Only usable as destination or source (but not both) in mov (and it\n  // becomes an array instruction this way).\n  kIndexableTemp = 3,\n  kImmediate32 = 4,\n  kSampler = 6,\n  kResource = 7,\n  kConstantBuffer = 8,\n  kLabel = 10,\n  kInputPrimitiveID = 11,\n  kOutputDepth = 12,\n  kNull = 13,\n  kOutputCoverageMask = 15,\n  kStream = 16,\n  kInputControlPoint = 25,\n  kInputDomainPoint = 28,\n  kUnorderedAccessView = 30,\n  kInputThreadID = 32,\n  kInputThreadGroupID = 33,\n  kInputThreadIDInGroup = 34,\n  kInputCoverageMask = 35,\n  kOutputDepthLessEqual = 39,\n  kOutputStencilRef = 41,\n};\n\n// D3D10_SB_OPERAND_NUM_COMPONENTS\nenum class OperandDimension : uint32_t {\n  kNoData,  // D3D10_SB_OPERAND_0_COMPONENT\n  kScalar,  // D3D10_SB_OPERAND_1_COMPONENT\n  kVector,  // D3D10_SB_OPERAND_4_COMPONENT\n};\n\nconstexpr OperandDimension GetOperandDimension(OperandType type,\n                                               bool in_dcl = false) {\n  switch (type) {\n    case OperandType::kSampler:\n      return in_dcl ? OperandDimension::kVector : OperandDimension::kNoData;\n    case OperandType::kLabel:\n    case OperandType::kNull:\n    case OperandType::kStream:\n      return OperandDimension::kNoData;\n    case OperandType::kInputPrimitiveID:\n    case OperandType::kOutputDepth:\n    case OperandType::kOutputCoverageMask:\n    case OperandType::kOutputDepthLessEqual:\n    case OperandType::kOutputStencilRef:\n      return OperandDimension::kScalar;\n    case OperandType::kInputCoverageMask:\n      return in_dcl ? OperandDimension::kScalar : OperandDimension::kVector;\n    default:\n      return OperandDimension::kVector;\n  }\n}\n\n// D3D10_SB_OPERAND_4_COMPONENT_SELECTION_MODE\nenum class ComponentSelection {\n  kMask,\n  kSwizzle,\n  kSelect1,\n};\n\nstruct Index {\n  // D3D10_SB_OPERAND_INDEX_REPRESENTATION\n  enum class Representation : uint32_t {\n    kImmediate32,\n    kImmediate64,\n    kRelative,\n    kImmediate32PlusRelative,\n    kImmediate64PlusRelative,\n  };\n\n  uint32_t index_;\n  // UINT32_MAX if absolute. Lower 2 bits are the component index, upper bits\n  // are the temp register index. Applicable to indexable temps, inputs,\n  // outputs except for pixel shaders, constant buffers and bindings.\n  uint32_t relative_to_temp_;\n\n  // Implicit constructor.\n  Index(uint32_t index = 0) : index_(index), relative_to_temp_(UINT32_MAX) {}\n  Index(uint32_t temp, uint32_t temp_component, uint32_t offset = 0)\n      : index_(offset), relative_to_temp_((temp << 2) | temp_component) {}\n\n  Representation GetRepresentation() const {\n    if (relative_to_temp_ != UINT32_MAX) {\n      return index_ != 0 ? Representation::kImmediate32PlusRelative\n                         : Representation::kRelative;\n    }\n    return Representation::kImmediate32;\n  }\n  uint32_t GetLength() const {\n    return relative_to_temp_ != UINT32_MAX ? (index_ != 0 ? 3 : 2) : 1;\n  }\n  void Write(std::vector<uint32_t>& code) const {\n    if (relative_to_temp_ == UINT32_MAX || index_ != 0) {\n      code.push_back(index_);\n    }\n    if (relative_to_temp_ != UINT32_MAX) {\n      // Encode selecting one component from absolute-indexed r#.\n      code.push_back(uint32_t(OperandDimension::kVector) |\n                     (uint32_t(ComponentSelection::kSelect1) << 2) |\n                     ((relative_to_temp_ & 3) << 4) |\n                     (uint32_t(OperandType::kTemp) << 12) | (1 << 20) |\n                     (uint32_t(Representation::kImmediate32) << 22));\n      code.push_back(relative_to_temp_ >> 2);\n    }\n  }\n};\n\nstruct OperandAddress {\n  OperandType type_;\n  uint32_t index_dimension_;\n  Index index_1d_, index_2d_, index_3d_;\n\n  explicit OperandAddress(OperandType type)\n      : type_(type), index_dimension_(0) {}\n  explicit OperandAddress(OperandType type, Index index_1d)\n      : type_(type), index_dimension_(1), index_1d_(index_1d) {}\n  explicit OperandAddress(OperandType type, Index index_1d, Index index_2d)\n      : type_(type),\n        index_dimension_(2),\n        index_1d_(index_1d),\n        index_2d_(index_2d) {}\n  explicit OperandAddress(OperandType type, Index index_1d, Index index_2d,\n                          Index index_3d)\n      : type_(type),\n        index_dimension_(3),\n        index_1d_(index_1d),\n        index_2d_(index_2d),\n        index_3d_(index_3d) {}\n\n  OperandDimension GetDimension(bool in_dcl = false) const {\n    return GetOperandDimension(type_, in_dcl);\n  }\n  uint32_t GetOperandTokenTypeAndIndex() const {\n    uint32_t operand_token = (uint32_t(type_) << 12) | (index_dimension_ << 20);\n    if (index_dimension_ > 0) {\n      operand_token |= uint32_t(index_1d_.GetRepresentation()) << 22;\n      if (index_dimension_ > 1) {\n        operand_token |= uint32_t(index_2d_.GetRepresentation()) << 25;\n        if (index_dimension_ > 2) {\n          operand_token |= uint32_t(index_3d_.GetRepresentation()) << 28;\n        }\n      }\n    }\n    return operand_token;\n  }\n  uint32_t GetLength() const {\n    uint32_t length = 0;\n    if (index_dimension_ > 0) {\n      length += index_1d_.GetLength();\n      if (index_dimension_ > 1) {\n        length += index_2d_.GetLength();\n        if (index_dimension_ > 2) {\n          length += index_3d_.GetLength();\n        }\n      }\n    }\n    return length;\n  }\n  void Write(std::vector<uint32_t>& code) const {\n    if (index_dimension_ > 0) {\n      index_1d_.Write(code);\n      if (index_dimension_ > 1) {\n        index_2d_.Write(code);\n        if (index_dimension_ > 2) {\n          index_3d_.Write(code);\n        }\n      }\n    }\n  }\n};\n\n// D3D10_SB_EXTENDED_OPERAND_TYPE\nenum class ExtendedOperandType : uint32_t {\n  kEmpty,\n  kModifier,\n};\n\n// D3D10_SB_OPERAND_MODIFIER\nenum class OperandModifier : uint32_t {\n  kNone,\n  kNegate,\n  kAbsolute,\n  kAbsoluteNegate,\n};\n\nstruct Dest : OperandAddress {\n  // Ignored for 0-component and 1-component operand types.\n  // For 4-component operand types, if the write mask is 0, it's treated as\n  // 0-component.\n  uint32_t write_mask_;\n\n  // Input destinations (v*) are for use only in declarations. Vector input\n  // declarations use read masks instead of swizzle (resource declarations still\n  // use swizzle when they're vector, however).\n\n  explicit Dest(OperandType type, uint32_t write_mask)\n      : OperandAddress(type), write_mask_(write_mask) {}\n  explicit Dest(OperandType type, uint32_t write_mask, Index index_1d)\n      : OperandAddress(type, index_1d), write_mask_(write_mask) {}\n  explicit Dest(OperandType type, uint32_t write_mask, Index index_1d,\n                Index index_2d)\n      : OperandAddress(type, index_1d, index_2d), write_mask_(write_mask) {}\n  explicit Dest(OperandType type, uint32_t write_mask, Index index_1d,\n                Index index_2d, Index index_3d)\n      : OperandAddress(type, index_1d, index_2d, index_3d),\n        write_mask_(write_mask) {}\n\n  static Dest R(uint32_t index, uint32_t write_mask = 0b1111) {\n    return Dest(OperandType::kTemp, write_mask, index);\n  }\n  static Dest V1D(uint32_t index, uint32_t read_mask = 0b1111) {\n    return Dest(OperandType::kInput, read_mask, index);\n  }\n  static Dest V2D(uint32_t index_1d, uint32_t index_2d,\n                  uint32_t read_mask = 0b1111) {\n    return Dest(OperandType::kInput, read_mask, index_1d, index_2d);\n  }\n  static Dest O(Index index, uint32_t write_mask = 0b1111) {\n    return Dest(OperandType::kOutput, write_mask, index);\n  }\n  static Dest X(uint32_t index_1d, Index index_2d,\n                uint32_t write_mask = 0b1111) {\n    return Dest(OperandType::kIndexableTemp, write_mask, index_1d, index_2d);\n  }\n  static Dest VPrim() { return Dest(OperandType::kInputPrimitiveID, 0b0001); }\n  static Dest ODepth() { return Dest(OperandType::kOutputDepth, 0b0001); }\n  static Dest Null() { return Dest(OperandType::kNull, 0b0000); }\n  static Dest OMask() { return Dest(OperandType::kOutputCoverageMask, 0b0001); }\n  static Dest M(uint32_t index) {\n    return Dest(OperandType::kStream, 0b0000, index);\n  }\n  static Dest VICP(uint32_t control_point_count, uint32_t element,\n                   uint32_t read_mask = 0b1111) {\n    return Dest(OperandType::kInputControlPoint, read_mask, control_point_count,\n                element);\n  }\n  static Dest VDomain(uint32_t read_mask) {\n    return Dest(OperandType::kInputDomainPoint, read_mask);\n  }\n  static Dest U(uint32_t index_1d, Index index_2d,\n                uint32_t write_mask = 0b1111) {\n    return Dest(OperandType::kUnorderedAccessView, write_mask, index_1d,\n                index_2d);\n  }\n  static Dest VThreadID(uint32_t read_mask) {\n    return Dest(OperandType::kInputThreadID, read_mask);\n  }\n  static Dest VThreadGroupID(uint32_t read_mask) {\n    return Dest(OperandType::kInputThreadGroupID, read_mask);\n  }\n  static Dest VThreadIDInGroup(uint32_t read_mask) {\n    return Dest(OperandType::kInputThreadIDInGroup, read_mask);\n  }\n  static Dest VCoverage() {\n    return Dest(OperandType::kInputCoverageMask, 0b0001);\n  }\n  static Dest ODepthLE() {\n    return Dest(OperandType::kOutputDepthLessEqual, 0b0001);\n  }\n  static Dest OStencilRef() {\n    return Dest(OperandType::kOutputStencilRef, 0b0001);\n  }\n\n  uint32_t GetMask(bool in_dcl = false) const {\n    OperandDimension dimension = GetDimension(in_dcl);\n    switch (dimension) {\n      case OperandDimension::kNoData:\n        return 0b0000;\n      case OperandDimension::kScalar:\n        return 0b0001;\n      case OperandDimension::kVector:\n        return write_mask_;\n      default:\n        assert_unhandled_case(dimension);\n        return 0b0000;\n    }\n  }\n  [[nodiscard]] Dest Mask(uint32_t write_mask) const {\n    Dest new_dest(*this);\n    new_dest.write_mask_ = write_mask;\n    return new_dest;\n  }\n  [[nodiscard]] Dest MaskMasked(uint32_t write_mask) const {\n    Dest new_dest(*this);\n    new_dest.write_mask_ &= write_mask;\n    return new_dest;\n  }\n  static uint32_t GetMaskSingleComponent(uint32_t write_mask) {\n    uint32_t component;\n    if (xe::bit_scan_forward(write_mask, &component)) {\n      if ((write_mask >> component) == 1) {\n        return component;\n      }\n    }\n    return UINT32_MAX;\n  }\n  uint32_t GetMaskSingleComponent(bool in_dcl = false) const {\n    return GetMaskSingleComponent(GetMask(in_dcl));\n  }\n\n  uint32_t GetLength() const { return 1 + OperandAddress::GetLength(); }\n  void Write(std::vector<uint32_t>& code, bool in_dcl = false) const {\n    uint32_t operand_token = GetOperandTokenTypeAndIndex();\n    OperandDimension dimension = GetDimension(in_dcl);\n    if (dimension == OperandDimension::kVector) {\n      if (write_mask_) {\n        assert_true(write_mask_ <= 0b1111);\n        operand_token |=\n            (uint32_t(ComponentSelection::kMask) << 2) | (write_mask_ << 4);\n      } else {\n        dimension = OperandDimension::kNoData;\n      }\n    }\n    operand_token |= uint32_t(dimension);\n    code.push_back(operand_token);\n    OperandAddress::Write(code);\n  }\n};\n\nstruct Src : OperandAddress {\n  enum : uint32_t {\n    kXYZW = 0b11100100,\n    kXXXX = 0b00000000,\n    kYYYY = 0b01010101,\n    kZZZZ = 0b10101010,\n    kWWWW = 0b11111111,\n  };\n\n  // Ignored for 0-component and 1-component operand types.\n  uint32_t swizzle_;\n  bool absolute_ = false;\n  bool negate_ = false;\n  // Only valid for OperandType::kImmediate32.\n  uint32_t immediate_[4];\n\n  explicit Src(OperandType type, uint32_t swizzle)\n      : OperandAddress(type), swizzle_(swizzle) {}\n  explicit Src(OperandType type, uint32_t swizzle, Index index_1d)\n      : OperandAddress(type, index_1d), swizzle_(swizzle) {}\n  explicit Src(OperandType type, uint32_t swizzle, Index index_1d,\n               Index index_2d)\n      : OperandAddress(type, index_1d, index_2d), swizzle_(swizzle) {}\n  explicit Src(OperandType type, uint32_t swizzle, Index index_1d,\n               Index index_2d, Index index_3d)\n      : OperandAddress(type, index_1d, index_2d, index_3d), swizzle_(swizzle) {}\n\n  // For creating instances for use in declarations.\n  struct DclT {};\n  static constexpr DclT Dcl = {};\n\n  static Src R(uint32_t index, uint32_t swizzle = kXYZW) {\n    return Src(OperandType::kTemp, swizzle, index);\n  }\n  static Src V1D(Index index, uint32_t swizzle = kXYZW) {\n    return Src(OperandType::kInput, swizzle, index);\n  }\n  static Src V2D(Index index_1d, Index index_2d, uint32_t swizzle = kXYZW) {\n    return Src(OperandType::kInput, swizzle, index_1d, index_2d);\n  }\n  static Src X(uint32_t index_1d, Index index_2d, uint32_t swizzle = kXYZW) {\n    return Src(OperandType::kIndexableTemp, swizzle, index_1d, index_2d);\n  }\n  static Src LU(uint32_t x, uint32_t y, uint32_t z, uint32_t w) {\n    Src src(OperandType::kImmediate32, kXYZW);\n    src.immediate_[0] = x;\n    src.immediate_[1] = y;\n    src.immediate_[2] = z;\n    src.immediate_[3] = w;\n    return src;\n  }\n  static Src LU(uint32_t x) { return LU(x, x, x, x); }\n  static Src LI(int32_t x, int32_t y, int32_t z, int32_t w) {\n    return LU(uint32_t(x), uint32_t(y), uint32_t(z), uint32_t(w));\n  }\n  static Src LI(int32_t x) { return LI(x, x, x, x); }\n  static Src LF(float x, float y, float z, float w) {\n    return LU(xe::memory::Reinterpret<uint32_t>(x),\n              xe::memory::Reinterpret<uint32_t>(y),\n              xe::memory::Reinterpret<uint32_t>(z),\n              xe::memory::Reinterpret<uint32_t>(w));\n  }\n  static Src LF(float x) { return LF(x, x, x, x); }\n  static Src LP(const uint32_t* xyzw) {\n    return LU(xyzw[0], xyzw[1], xyzw[2], xyzw[3]);\n  }\n  static Src LP(const int32_t* xyzw) {\n    return LI(xyzw[0], xyzw[1], xyzw[2], xyzw[3]);\n  }\n  static Src LP(const float* xyzw) {\n    return LF(xyzw[0], xyzw[1], xyzw[2], xyzw[3]);\n  }\n  static Src S(uint32_t index_1d, Index index_2d) {\n    return Src(OperandType::kSampler, kXXXX, index_1d, index_2d);\n  }\n  static Src S(DclT, uint32_t id, uint32_t lower_bound, uint32_t upper_bound) {\n    return Src(OperandType::kSampler, kXYZW, id, lower_bound, upper_bound);\n  }\n  static Src T(uint32_t index_1d, Index index_2d, uint32_t swizzle = kXYZW) {\n    return Src(OperandType::kResource, swizzle, index_1d, index_2d);\n  }\n  static Src T(DclT, uint32_t id, uint32_t lower_bound, uint32_t upper_bound) {\n    return Src(OperandType::kResource, kXYZW, id, lower_bound, upper_bound);\n  }\n  static Src CB(uint32_t id, Index index, Index location,\n                uint32_t swizzle = kXYZW) {\n    return Src(OperandType::kConstantBuffer, swizzle, id, index, location);\n  }\n  static Src CB(DclT, uint32_t id, uint32_t lower_bound, uint32_t upper_bound) {\n    return Src(OperandType::kConstantBuffer, kXYZW, id, lower_bound,\n               upper_bound);\n  }\n  static Src Label(uint32_t index) {\n    return Src(OperandType::kLabel, kXXXX, index);\n  }\n  static Src VPrim() { return Src(OperandType::kInputPrimitiveID, kXXXX); }\n  static Src VICP(Index control_point, Index element,\n                  uint32_t swizzle = kXYZW) {\n    return Src(OperandType::kInputControlPoint, swizzle, control_point,\n               element);\n  }\n  static Src VDomain(uint32_t swizzle = kXYZW) {\n    return Src(OperandType::kInputDomainPoint, swizzle);\n  }\n  static Src U(uint32_t index_1d, Index index_2d, uint32_t swizzle = kXYZW) {\n    return Src(OperandType::kUnorderedAccessView, swizzle, index_1d, index_2d);\n  }\n  static Src U(DclT, uint32_t id, uint32_t lower_bound, uint32_t upper_bound) {\n    return Src(OperandType::kUnorderedAccessView, kXYZW, id, lower_bound,\n               upper_bound);\n  }\n  static Src VThreadID(uint32_t swizzle = kXYZW) {\n    return Src(OperandType::kInputThreadID, swizzle);\n  }\n  static Src VThreadGroupID(uint32_t swizzle = kXYZW) {\n    return Src(OperandType::kInputThreadGroupID, swizzle);\n  }\n  static Src VThreadIDInGroup(uint32_t swizzle = kXYZW) {\n    return Src(OperandType::kInputThreadIDInGroup, swizzle);\n  }\n  static Src VCoverage() { return Src(OperandType::kInputCoverageMask, kXXXX); }\n\n  [[nodiscard]] Src WithModifiers(bool absolute, bool negate) const {\n    Src new_src(*this);\n    new_src.absolute_ = absolute;\n    new_src.negate_ = negate;\n    return new_src;\n  }\n  [[nodiscard]] Src WithAbs(bool absolute) const {\n    return WithModifiers(absolute, negate_);\n  }\n  [[nodiscard]] Src WithNeg(bool negate) const {\n    return WithModifiers(absolute_, negate);\n  }\n  [[nodiscard]] Src Abs() const { return WithModifiers(true, false); }\n  [[nodiscard]] Src operator-() const {\n    return WithModifiers(absolute_, !negate_);\n  }\n  [[nodiscard]] Src Swizzle(uint32_t swizzle) const {\n    Src new_src(*this);\n    new_src.swizzle_ = swizzle;\n    return new_src;\n  }\n  [[nodiscard]] Src SwizzleSwizzled(uint32_t swizzle) const {\n    Src new_src(*this);\n    new_src.swizzle_ = 0;\n    for (uint32_t i = 0; i < 4; ++i) {\n      new_src.swizzle_ |= ((swizzle_ >> (((swizzle >> (i * 2)) & 3) * 2)) & 3)\n                          << (i * 2);\n    }\n    return new_src;\n  }\n  [[nodiscard]] Src Select(uint32_t component) const {\n    Src new_src(*this);\n    new_src.swizzle_ = component * 0b01010101;\n    return new_src;\n  }\n  [[nodiscard]] Src SelectFromSwizzled(uint32_t component) const {\n    Src new_src(*this);\n    new_src.swizzle_ = ((swizzle_ >> (component * 2)) & 3) * 0b01010101;\n    return new_src;\n  }\n\n  uint32_t GetLength(uint32_t mask, bool force_vector = false) const {\n    bool is_vector =\n        force_vector ||\n        (mask != 0b0000 && Dest::GetMaskSingleComponent(mask) == UINT32_MAX);\n    if (type_ == OperandType::kImmediate32) {\n      return is_vector ? 5 : 2;\n    }\n    return ((absolute_ || negate_) ? 2 : 1) + OperandAddress::GetLength();\n  }\n  static constexpr uint32_t GetModifiedImmediate(uint32_t value,\n                                                 bool is_integer, bool absolute,\n                                                 bool negate) {\n    if (is_integer) {\n      if (absolute) {\n        value = uint32_t(std::abs(int32_t(value)));\n      }\n      if (negate) {\n        value = uint32_t(-int32_t(value));\n      }\n    } else {\n      if (absolute) {\n        value &= uint32_t(INT32_MAX);\n      }\n      if (negate) {\n        value ^= uint32_t(INT32_MAX) + 1;\n      }\n    }\n    return value;\n  }\n  uint32_t GetModifiedImmediate(uint32_t swizzle_index, bool is_integer) const {\n    return GetModifiedImmediate(\n        immediate_[(swizzle_ >> (swizzle_index * 2)) & 3], is_integer,\n        absolute_, negate_);\n  }\n  void Write(std::vector<uint32_t>& code, bool is_integer, uint32_t mask,\n             bool force_vector = false, bool in_dcl = false) const {\n    uint32_t operand_token = GetOperandTokenTypeAndIndex();\n    uint32_t mask_single_component = Dest::GetMaskSingleComponent(mask);\n    uint32_t select_component =\n        mask_single_component != UINT32_MAX ? mask_single_component : 0;\n    bool is_vector =\n        force_vector || (mask != 0b0000 && mask_single_component == UINT32_MAX);\n    if (type_ == OperandType::kImmediate32) {\n      if (is_vector) {\n        operand_token |= uint32_t(OperandDimension::kVector) |\n                         (uint32_t(ComponentSelection::kSwizzle) << 2) |\n                         (Src::kXYZW << 4);\n      } else {\n        operand_token |= uint32_t(OperandDimension::kScalar);\n      }\n      code.push_back(operand_token);\n      if (is_vector) {\n        for (uint32_t i = 0; i < 4; ++i) {\n          code.push_back((mask & (1 << i)) ? GetModifiedImmediate(i, is_integer)\n                                           : 0);\n        }\n      } else {\n        code.push_back(GetModifiedImmediate(select_component, is_integer));\n      }\n    } else {\n      switch (GetDimension(in_dcl)) {\n        case OperandDimension::kScalar:\n          if (is_vector) {\n            operand_token |= uint32_t(OperandDimension::kVector) |\n                             (uint32_t(ComponentSelection::kSwizzle) << 2) |\n                             (Src::kXXXX << 4);\n          } else {\n            operand_token |= uint32_t(OperandDimension::kScalar);\n          }\n          break;\n        case OperandDimension::kVector:\n          operand_token |= uint32_t(OperandDimension::kVector);\n          if (is_vector) {\n            operand_token |= uint32_t(ComponentSelection::kSwizzle) << 2;\n            // Clear swizzle of unused components to a used value to avoid\n            // referencing potentially uninitialized register components.\n            uint32_t used_component;\n            if (!xe::bit_scan_forward(mask, &used_component)) {\n              used_component = 0;\n            }\n            for (uint32_t i = 0; i < 4; ++i) {\n              uint32_t swizzle_index = (mask & (1 << i)) ? i : used_component;\n              operand_token |=\n                  (((swizzle_ >> (swizzle_index * 2)) & 3) << (4 + i * 2));\n            }\n          } else {\n            operand_token |= (uint32_t(ComponentSelection::kSelect1) << 2) |\n                             (((swizzle_ >> (select_component * 2)) & 3) << 4);\n          }\n          break;\n        default:\n          break;\n      }\n      OperandModifier modifier = OperandModifier::kNone;\n      if (absolute_ && negate_) {\n        modifier = OperandModifier::kAbsoluteNegate;\n      } else if (absolute_) {\n        modifier = OperandModifier::kAbsolute;\n      } else if (negate_) {\n        modifier = OperandModifier::kNegate;\n      }\n      if (modifier != OperandModifier::kNone) {\n        operand_token |= uint32_t(1) << 31;\n      }\n      code.push_back(operand_token);\n      if (modifier != OperandModifier::kNone) {\n        code.push_back(uint32_t(ExtendedOperandType::kModifier) |\n                       (uint32_t(modifier) << 6));\n      }\n      OperandAddress::Write(code);\n    }\n  }\n};\n\n// D3D10_SB_GLOBAL_FLAGS_MASK\nenum GlobalFlags : uint32_t {\n  // Permit the driver to reorder arithmetic operations for optimization.\n  kGlobalFlagRefactoringAllowed = 1 << 11,\n  kGlobalFlagEnableDoublePrecisionFloatOps = 1 << 12,\n  kGlobalFlagForceEarlyDepthStencil = 1 << 13,\n  // Enable RAW and structured buffers in non-CS 4.x shaders. Not needed on 5.x.\n  kGlobalFlagEnableRawAndStructuredBuffers = 1 << 14,\n  // Direct3D 11.1.\n  // Skip optimizations of shader IL when translating to native code.\n  kGlobalFlagSkipOptimization = 1 << 15,\n  kGlobalFlagEnableMinimumPrecision = 1 << 16,\n  // Enable 11.1 double-precision floating-point instruction extensions. Not\n  // needed on 5.1.\n  kGlobalFlagEnableDoubleExtensions = 1 << 17,\n  // Enable 11.1 non-double instruction extensions. Not needed on 5.1.\n  kGlobalFlagEnableShaderExtensions = 1 << 18,\n  // Direct3D 12.\n  kGlobalFlagAllResourcesBound = 1 << 19,\n};\n\n// D3D10_SB_SAMPLER_MODE\nenum class SamplerMode : uint32_t {\n  kDefault,\n  kComparison,\n  kMono,\n};\n\n// D3D10_SB_CONSTANT_BUFFER_ACCESS_PATTERN\nenum class ConstantBufferAccessPattern : uint32_t {\n  kImmediateIndexed,\n  kDynamicIndexed,\n};\n\n// D3D10_SB_INTERPOLATION_MODE\nenum class InterpolationMode : uint32_t {\n  kUndefined,\n  kConstant,\n  kLinear,\n  kLinearCentroid,\n  kLinearNoPerspective,\n  kLinearNoPerspectiveCentroid,\n  kLinearSample,\n  kLinearNoPerspectiveSample,\n};\n\n// D3D10_SB_RESOURCE_DIMENSION\nenum class ResourceDimension : uint32_t {\n  kUnknown,\n  kBuffer,\n  kTexture1D,\n  kTexture2D,\n  kTexture2DMS,\n  kTexture3D,\n  kTextureCube,\n  kTexture1DArray,\n  kTexture2DArray,\n  kTexture2DMSArray,\n  kTextureCubeArray,\n  kRawBuffer,\n  kStructuredBuffer,\n};\n\n// D3D11_SB_RESOURCE_FLAGS_MASK\nenum UAVFlags : uint32_t {\n  kUAVFlagGloballyCoherentAccess = 1 << 16,\n  kUAVFlagRasterizerOrderedAccess = 1 << 17,\n  kUAVFlagHasOrderPreservingCounter = 1 << 23,\n};\n\n// D3D10_SB_OPCODE_TYPE subset\nenum class Opcode : uint32_t {\n  kAdd = 0,\n  kAnd = 1,\n  kBreak = 2,\n  kCall = 4,\n  kCallC = 5,\n  kCase = 6,\n  kContinue = 7,\n  kDefault = 10,\n  kDiscard = 13,\n  kDiv = 14,\n  kDP2 = 15,\n  kDP3 = 16,\n  kDP4 = 17,\n  kElse = 18,\n  kEndIf = 21,\n  kEndLoop = 22,\n  kEndSwitch = 23,\n  kEq = 24,\n  kExp = 25,\n  kFrc = 26,\n  kFToI = 27,\n  kFToU = 28,\n  kGE = 29,\n  kIAdd = 30,\n  kIf = 31,\n  kIEq = 32,\n  kIGE = 33,\n  kILT = 34,\n  kIMAd = 35,\n  kIMax = 36,\n  kIMin = 37,\n  kIMul = 38,\n  kINE = 39,\n  kIShL = 41,\n  kIToF = 43,\n  kLabel = 44,\n  kLd = 45,\n  kLdMS = 46,\n  kLog = 47,\n  kLoop = 48,\n  kLT = 49,\n  kMAd = 50,\n  kMin = 51,\n  kMax = 52,\n  kCustomData = 53,\n  kMov = 54,\n  kMovC = 55,\n  kMul = 56,\n  kNE = 57,\n  kNot = 59,\n  kOr = 60,\n  kRet = 62,\n  kRetC = 63,\n  kRoundNE = 64,\n  kRoundNI = 65,\n  kRoundZ = 67,\n  kRSq = 68,\n  kSampleL = 72,\n  kSampleD = 73,\n  kSqRt = 75,\n  kSwitch = 76,\n  kSinCos = 77,\n  kUDiv = 78,\n  kULT = 79,\n  kUGE = 80,\n  kUMul = 81,\n  kUMAd = 82,\n  kUMax = 83,\n  kUMin = 84,\n  kUShR = 85,\n  kUToF = 86,\n  kXOr = 87,\n  kDclResource = 88,\n  kDclConstantBuffer = 89,\n  kDclSampler = 90,\n  kDclOutputTopology = 92,\n  kDclInputPrimitive = 93,\n  kDclMaxOutputVertexCount = 94,\n  kDclInput = 95,\n  kDclInputSGV = 96,\n  kDclInputSIV = 97,\n  kDclInputPS = 98,\n  kDclInputPSSGV = 99,\n  kDclInputPSSIV = 100,\n  kDclOutput = 101,\n  kDclOutputSIV = 103,\n  kDclTemps = 104,\n  kDclIndexableTemp = 105,\n  kDclGlobalFlags = 106,\n  kLOD = 108,\n  kEmitStream = 117,\n  kCutStream = 118,\n  kEmitThenCutStream = 119,\n  kDerivRTXCoarse = 122,\n  kDerivRTXFine = 123,\n  kDerivRTYCoarse = 124,\n  kDerivRTYFine = 125,\n  kRcp = 129,\n  kF32ToF16 = 130,\n  kF16ToF32 = 131,\n  kFirstBitHi = 135,\n  kFirstBitLo = 136,\n  kUBFE = 138,\n  kIBFE = 139,\n  kBFI = 140,\n  kBFRev = 141,\n  kDclStream = 143,\n  kDclInputControlPointCount = 147,\n  kDclTessDomain = 149,\n  kDclThreadGroup = 155,\n  kDclUnorderedAccessViewTyped = 156,\n  kDclUnorderedAccessViewRaw = 157,\n  kDclResourceRaw = 161,\n  kLdUAVTyped = 163,\n  kStoreUAVTyped = 164,\n  kLdRaw = 165,\n  kStoreRaw = 166,\n  kAtomicAnd = 169,\n  kAtomicOr = 170,\n  kEvalSampleIndex = 204,\n  kEvalCentroid = 205,\n};\n\n// D3D10_SB_EXTENDED_OPCODE_TYPE\nenum class ExtendedOpcodeType : uint32_t {\n  kEmpty,\n  kSampleControls,\n  kResourceDim,\n  kResourceReturnType,\n};\n\nconstexpr uint32_t OpcodeToken(Opcode opcode, uint32_t operands_length,\n                               bool saturate = false,\n                               uint32_t extended_opcode_count = 0) {\n  return uint32_t(opcode) | (saturate ? (uint32_t(1) << 13) : 0) |\n         ((uint32_t(1) + extended_opcode_count + operands_length) << 24) |\n         (extended_opcode_count ? (uint32_t(1) << 31) : 0);\n}\n\nconstexpr uint32_t GetOpcodeTokenInstructionLength(uint32_t opcode_token) {\n  return (opcode_token >> 24) & ((UINT32_C(1) << 7) - 1);\n}\n\nconstexpr uint32_t SampleControlsExtendedOpcodeToken(int32_t aoffimmi_u,\n                                                     int32_t aoffimmi_v,\n                                                     int32_t aoffimmi_w,\n                                                     bool extended = false) {\n  return uint32_t(ExtendedOpcodeType::kSampleControls) |\n         ((uint32_t(aoffimmi_u) & uint32_t(0b1111)) << 9) |\n         ((uint32_t(aoffimmi_v) & uint32_t(0b1111)) << 13) |\n         ((uint32_t(aoffimmi_w) & uint32_t(0b1111)) << 17) |\n         (extended ? (uint32_t(1) << 31) : 0);\n}\n\nconstexpr uint32_t ResourceReturnTypeToken(ResourceReturnType x,\n                                           ResourceReturnType y,\n                                           ResourceReturnType z,\n                                           ResourceReturnType w) {\n  return uint32_t(x) | (uint32_t(y) << 4) | (uint32_t(z) << 8) |\n         (uint32_t(w) << 12);\n}\n\n// Even if a texture or a typed buffer has less than 4 components, it has the\n// same return type specified for all 4 in its dcl instruction.\nconstexpr uint32_t ResourceReturnTypeX4Token(ResourceReturnType xyzw) {\n  return ResourceReturnTypeToken(xyzw, xyzw, xyzw, xyzw);\n}\n\n// Assembler appending to the shader program code vector.\nclass Assembler {\n public:\n  Assembler(std::vector<uint32_t>& code, Statistics& stat)\n      : code_(code), stat_(stat) {}\n\n  void OpAdd(const Dest& dest, const Src& src0, const Src& src1,\n             bool saturate = false) {\n    EmitAluOp(Opcode::kAdd, 0b00, dest, src0, src1, saturate);\n    ++stat_.float_instruction_count;\n  }\n  void OpAnd(const Dest& dest, const Src& src0, const Src& src1) {\n    EmitAluOp(Opcode::kAnd, 0b11, dest, src0, src1);\n    ++stat_.uint_instruction_count;\n  }\n  void OpBreak() {\n    code_.push_back(OpcodeToken(Opcode::kBreak, 0));\n    ++stat_.instruction_count;\n  }\n  void OpCall(const Src& label) {\n    EmitFlowOp(Opcode::kCall, label);\n    ++stat_.static_flow_control_count;\n  }\n  void OpCallC(bool test, const Src& src, const Src& label) {\n    EmitFlowOp(Opcode::kCallC, src, label, test);\n    ++stat_.dynamic_flow_control_count;\n  }\n  void OpCase(const Src& src) {\n    EmitFlowOp(Opcode::kCase, src);\n    ++stat_.static_flow_control_count;\n  }\n  void OpContinue() {\n    code_.push_back(OpcodeToken(Opcode::kContinue, 0));\n    ++stat_.instruction_count;\n  }\n  void OpDefault() {\n    code_.push_back(OpcodeToken(Opcode::kDefault, 0));\n    ++stat_.instruction_count;\n    ++stat_.static_flow_control_count;\n  }\n  void OpDiscard(bool test, const Src& src) {\n    EmitFlowOp(Opcode::kDiscard, src, test);\n  }\n  void OpDiv(const Dest& dest, const Src& src0, const Src& src1,\n             bool saturate = false) {\n    EmitAluOp(Opcode::kDiv, 0b00, dest, src0, src1, saturate);\n    ++stat_.float_instruction_count;\n  }\n  void OpDP2(const Dest& dest, const Src& src0, const Src& src1,\n             bool saturate = false) {\n    uint32_t operands_length =\n        dest.GetLength() + src0.GetLength(0b0011) + src1.GetLength(0b0011);\n    code_.reserve(code_.size() + 1 + operands_length);\n    code_.push_back(OpcodeToken(Opcode::kDP2, operands_length, saturate));\n    dest.Write(code_);\n    src0.Write(code_, false, 0b0011);\n    src1.Write(code_, false, 0b0011);\n    ++stat_.instruction_count;\n    ++stat_.float_instruction_count;\n  }\n  void OpDP3(const Dest& dest, const Src& src0, const Src& src1,\n             bool saturate = false) {\n    uint32_t operands_length =\n        dest.GetLength() + src0.GetLength(0b0111) + src1.GetLength(0b0111);\n    code_.reserve(code_.size() + 1 + operands_length);\n    code_.push_back(OpcodeToken(Opcode::kDP3, operands_length, saturate));\n    dest.Write(code_);\n    src0.Write(code_, false, 0b0111);\n    src1.Write(code_, false, 0b0111);\n    ++stat_.instruction_count;\n    ++stat_.float_instruction_count;\n  }\n  void OpDP4(const Dest& dest, const Src& src0, const Src& src1,\n             bool saturate = false) {\n    uint32_t operands_length =\n        dest.GetLength() + src0.GetLength(0b1111) + src1.GetLength(0b1111);\n    code_.reserve(code_.size() + 1 + operands_length);\n    code_.push_back(OpcodeToken(Opcode::kDP4, operands_length, saturate));\n    dest.Write(code_);\n    src0.Write(code_, false, 0b1111);\n    src1.Write(code_, false, 0b1111);\n    ++stat_.instruction_count;\n    ++stat_.float_instruction_count;\n  }\n  void OpElse() {\n    code_.push_back(OpcodeToken(Opcode::kElse, 0));\n    ++stat_.instruction_count;\n  }\n  void OpEndIf() {\n    code_.push_back(OpcodeToken(Opcode::kEndIf, 0));\n    ++stat_.instruction_count;\n  }\n  void OpEndLoop() {\n    code_.push_back(OpcodeToken(Opcode::kEndLoop, 0));\n    ++stat_.instruction_count;\n  }\n  void OpEndSwitch() {\n    code_.push_back(OpcodeToken(Opcode::kEndSwitch, 0));\n    ++stat_.instruction_count;\n  }\n  void OpEq(const Dest& dest, const Src& src0, const Src& src1) {\n    EmitAluOp(Opcode::kEq, 0b00, dest, src0, src1);\n    ++stat_.float_instruction_count;\n  }\n  void OpExp(const Dest& dest, const Src& src, bool saturate = false) {\n    EmitAluOp(Opcode::kExp, 0b0, dest, src, saturate);\n    ++stat_.float_instruction_count;\n  }\n  void OpFrc(const Dest& dest, const Src& src, bool saturate = false) {\n    EmitAluOp(Opcode::kFrc, 0b0, dest, src, saturate);\n    ++stat_.float_instruction_count;\n  }\n  void OpFToI(const Dest& dest, const Src& src) {\n    EmitAluOp(Opcode::kFToI, 0b0, dest, src);\n    ++stat_.conversion_instruction_count;\n  }\n  void OpFToU(const Dest& dest, const Src& src) {\n    EmitAluOp(Opcode::kFToU, 0b0, dest, src);\n    ++stat_.conversion_instruction_count;\n  }\n  void OpGE(const Dest& dest, const Src& src0, const Src& src1) {\n    EmitAluOp(Opcode::kGE, 0b00, dest, src0, src1);\n    ++stat_.float_instruction_count;\n  }\n  void OpIAdd(const Dest& dest, const Src& src0, const Src& src1) {\n    EmitAluOp(Opcode::kIAdd, 0b11, dest, src0, src1);\n    ++stat_.int_instruction_count;\n  }\n  void OpIf(bool test, const Src& src) {\n    EmitFlowOp(Opcode::kIf, src, test);\n    ++stat_.dynamic_flow_control_count;\n  }\n  void OpIEq(const Dest& dest, const Src& src0, const Src& src1) {\n    EmitAluOp(Opcode::kIEq, 0b11, dest, src0, src1);\n    ++stat_.int_instruction_count;\n  }\n  void OpIGE(const Dest& dest, const Src& src0, const Src& src1) {\n    EmitAluOp(Opcode::kIGE, 0b11, dest, src0, src1);\n    ++stat_.int_instruction_count;\n  }\n  void OpILT(const Dest& dest, const Src& src0, const Src& src1) {\n    EmitAluOp(Opcode::kILT, 0b11, dest, src0, src1);\n    ++stat_.int_instruction_count;\n  }\n  void OpIMAd(const Dest& dest, const Src& mul0, const Src& mul1,\n              const Src& add) {\n    EmitAluOp(Opcode::kIMAd, 0b111, dest, mul0, mul1, add);\n    ++stat_.int_instruction_count;\n  }\n  void OpIMax(const Dest& dest, const Src& src0, const Src& src1) {\n    EmitAluOp(Opcode::kIMax, 0b11, dest, src0, src1);\n    ++stat_.int_instruction_count;\n  }\n  void OpIMin(const Dest& dest, const Src& src0, const Src& src1) {\n    EmitAluOp(Opcode::kIMin, 0b11, dest, src0, src1);\n    ++stat_.int_instruction_count;\n  }\n  void OpIMul(const Dest& dest_hi, const Dest& dest_lo, const Src& src0,\n              const Src& src1) {\n    EmitAluOp(Opcode::kIMul, 0b11, dest_hi, dest_lo, src0, src1);\n    ++stat_.int_instruction_count;\n  }\n  void OpINE(const Dest& dest, const Src& src0, const Src& src1) {\n    EmitAluOp(Opcode::kINE, 0b11, dest, src0, src1);\n    ++stat_.int_instruction_count;\n  }\n  void OpIShL(const Dest& dest, const Src& value, const Src& shift) {\n    EmitAluOp(Opcode::kIShL, 0b11, dest, value, shift);\n    ++stat_.int_instruction_count;\n  }\n  void OpIToF(const Dest& dest, const Src& src) {\n    EmitAluOp(Opcode::kIToF, 0b1, dest, src);\n    ++stat_.conversion_instruction_count;\n  }\n  void OpLabel(const Src& label) {\n    // The label is source, not destination, for simplicity, to unify it will\n    // call/callc (in DXBC it's just a zero-component label operand).\n    uint32_t operands_length = label.GetLength(0b0000);\n    code_.reserve(code_.size() + 1 + operands_length);\n    code_.push_back(OpcodeToken(Opcode::kLabel, operands_length));\n    label.Write(code_, true, 0b0000);\n    // Doesn't count towards stat_.instruction_count.\n  }\n  void OpLd(const Dest& dest, const Src& address, uint32_t address_mask,\n            const Src& resource, int32_t aoffimmi_u = 0, int32_t aoffimmi_v = 0,\n            int32_t aoffimmi_w = 0) {\n    uint32_t dest_write_mask = dest.GetMask();\n    uint32_t sample_controls = 0;\n    if (aoffimmi_u || aoffimmi_v || aoffimmi_w) {\n      sample_controls =\n          SampleControlsExtendedOpcodeToken(aoffimmi_u, aoffimmi_v, aoffimmi_w);\n    }\n    uint32_t operands_length = dest.GetLength() +\n                               address.GetLength(address_mask, true) +\n                               resource.GetLength(dest_write_mask, true);\n    code_.reserve(code_.size() + 1 + (sample_controls ? 1 : 0) +\n                  operands_length);\n    code_.push_back(OpcodeToken(Opcode::kLd, operands_length, false,\n                                sample_controls ? 1 : 0));\n    if (sample_controls) {\n      code_.push_back(sample_controls);\n    }\n    dest.Write(code_);\n    address.Write(code_, false, address_mask, true);\n    resource.Write(code_, false, dest_write_mask, true);\n    ++stat_.instruction_count;\n    ++stat_.texture_load_instructions;\n  }\n  void OpLdMS(const Dest& dest, const Src& address, uint32_t address_mask,\n              const Src& resource, const Src& sample_index,\n              int32_t aoffimmi_u = 0, int32_t aoffimmi_v = 0) {\n    uint32_t dest_write_mask = dest.GetMask();\n    uint32_t sample_controls = 0;\n    if (aoffimmi_u || aoffimmi_v) {\n      sample_controls =\n          SampleControlsExtendedOpcodeToken(aoffimmi_u, aoffimmi_v, 0);\n    }\n    uint32_t operands_length = dest.GetLength() +\n                               address.GetLength(address_mask, true) +\n                               resource.GetLength(dest_write_mask, true) +\n                               sample_index.GetLength(0b0000);\n    code_.reserve(code_.size() + 1 + (sample_controls ? 1 : 0) +\n                  operands_length);\n    code_.push_back(OpcodeToken(Opcode::kLdMS, operands_length, false,\n                                sample_controls ? 1 : 0));\n    if (sample_controls) {\n      code_.push_back(sample_controls);\n    }\n    dest.Write(code_);\n    address.Write(code_, false, address_mask, true);\n    resource.Write(code_, false, dest_write_mask, true);\n    sample_index.Write(code_, true, 0b0000);\n    ++stat_.instruction_count;\n    ++stat_.texture_load_instructions;\n  }\n  void OpLog(const Dest& dest, const Src& src, bool saturate = false) {\n    EmitAluOp(Opcode::kLog, 0b0, dest, src, saturate);\n    ++stat_.float_instruction_count;\n  }\n  void OpLoop() {\n    code_.push_back(OpcodeToken(Opcode::kLoop, 0));\n    ++stat_.instruction_count;\n    ++stat_.dynamic_flow_control_count;\n  }\n  void OpLT(const Dest& dest, const Src& src0, const Src& src1) {\n    EmitAluOp(Opcode::kLT, 0b00, dest, src0, src1);\n    ++stat_.float_instruction_count;\n  }\n  void OpMAd(const Dest& dest, const Src& mul0, const Src& mul1, const Src& add,\n             bool saturate = false) {\n    EmitAluOp(Opcode::kMAd, 0b000, dest, mul0, mul1, add, saturate);\n    ++stat_.float_instruction_count;\n  }\n  void OpMin(const Dest& dest, const Src& src0, const Src& src1,\n             bool saturate = false) {\n    EmitAluOp(Opcode::kMin, 0b00, dest, src0, src1, saturate);\n    ++stat_.float_instruction_count;\n  }\n  void OpMax(const Dest& dest, const Src& src0, const Src& src1,\n             bool saturate = false) {\n    EmitAluOp(Opcode::kMax, 0b00, dest, src0, src1, saturate);\n    ++stat_.float_instruction_count;\n  }\n  // Returns a pointer for writing the custom data to.\n  void* OpCustomData(CustomDataClass custom_data_class, uint32_t length_bytes) {\n    uint32_t length_bytes_aligned =\n        xe::align(length_bytes, uint32_t(sizeof(uint32_t)));\n    uint32_t total_length_dwords = length_bytes_aligned / sizeof(uint32_t) + 2;\n    size_t offset_dwords = code_.size();\n    code_.resize(offset_dwords + total_length_dwords);\n    uint32_t* data = code_.data() + offset_dwords;\n    // Different opcode encoding (no size).\n    *(data++) =\n        uint32_t(Opcode::kCustomData) | (uint32_t(custom_data_class) << 11);\n    *(data++) = total_length_dwords;\n    // Don't leave uninitialized data, and make sure multiple uses of the\n    // assembler with the same input give the same DXBC for driver shader\n    // caching.\n    std::memset(reinterpret_cast<uint8_t*>(data) + length_bytes,\n                dxbc::kAlignmentPadding, length_bytes_aligned - length_bytes);\n    return data;\n  }\n  void OpMov(const Dest& dest, const Src& src, bool saturate = false) {\n    EmitAluOp(Opcode::kMov, 0b0, dest, src, saturate);\n    if (dest.type_ == OperandType::kIndexableTemp ||\n        src.type_ == OperandType::kIndexableTemp) {\n      ++stat_.array_instruction_count;\n    } else {\n      ++stat_.mov_instruction_count;\n    }\n  }\n  void OpMovC(const Dest& dest, const Src& test, const Src& src_nz,\n              const Src& src_z, bool saturate = false) {\n    EmitAluOp(Opcode::kMovC, 0b001, dest, test, src_nz, src_z, saturate);\n    ++stat_.movc_instruction_count;\n  }\n  void OpMul(const Dest& dest, const Src& src0, const Src& src1,\n             bool saturate = false) {\n    EmitAluOp(Opcode::kMul, 0b00, dest, src0, src1, saturate);\n    ++stat_.float_instruction_count;\n  }\n  void OpNE(const Dest& dest, const Src& src0, const Src& src1) {\n    EmitAluOp(Opcode::kNE, 0b00, dest, src0, src1);\n    ++stat_.float_instruction_count;\n  }\n  void OpNot(const Dest& dest, const Src& src) {\n    EmitAluOp(Opcode::kNot, 0b1, dest, src);\n    ++stat_.uint_instruction_count;\n  }\n  void OpOr(const Dest& dest, const Src& src0, const Src& src1) {\n    EmitAluOp(Opcode::kOr, 0b11, dest, src0, src1);\n    ++stat_.uint_instruction_count;\n  }\n  void OpRet() {\n    code_.push_back(OpcodeToken(Opcode::kRet, 0));\n    ++stat_.instruction_count;\n    ++stat_.static_flow_control_count;\n  }\n  void OpRetC(bool test, const Src& src) {\n    EmitFlowOp(Opcode::kRetC, src, test);\n    ++stat_.dynamic_flow_control_count;\n  }\n  void OpRoundNE(const Dest& dest, const Src& src, bool saturate = false) {\n    EmitAluOp(Opcode::kRoundNE, 0b0, dest, src, saturate);\n    ++stat_.float_instruction_count;\n  }\n  void OpRoundNI(const Dest& dest, const Src& src, bool saturate = false) {\n    EmitAluOp(Opcode::kRoundNI, 0b0, dest, src, saturate);\n    ++stat_.float_instruction_count;\n  }\n  void OpRoundZ(const Dest& dest, const Src& src, bool saturate = false) {\n    EmitAluOp(Opcode::kRoundZ, 0b0, dest, src, saturate);\n    ++stat_.float_instruction_count;\n  }\n  void OpRSq(const Dest& dest, const Src& src, bool saturate = false) {\n    EmitAluOp(Opcode::kRSq, 0b0, dest, src, saturate);\n    ++stat_.float_instruction_count;\n  }\n  void OpSampleL(const Dest& dest, const Src& address,\n                 uint32_t address_components, const Src& resource,\n                 const Src& sampler, const Src& lod, int32_t aoffimmi_u = 0,\n                 int32_t aoffimmi_v = 0, int32_t aoffimmi_w = 0) {\n    uint32_t dest_write_mask = dest.GetMask();\n    uint32_t sample_controls = 0;\n    if (aoffimmi_u || aoffimmi_v || aoffimmi_w) {\n      sample_controls =\n          SampleControlsExtendedOpcodeToken(aoffimmi_u, aoffimmi_v, aoffimmi_w);\n    }\n    uint32_t address_mask = (1 << address_components) - 1;\n    uint32_t operands_length =\n        dest.GetLength() + address.GetLength(address_mask) +\n        resource.GetLength(dest_write_mask, true) + sampler.GetLength(0b0000) +\n        lod.GetLength(0b0000);\n    code_.reserve(code_.size() + 1 + (sample_controls ? 1 : 0) +\n                  operands_length);\n    code_.push_back(OpcodeToken(Opcode::kSampleL, operands_length, false,\n                                sample_controls ? 1 : 0));\n    if (sample_controls) {\n      code_.push_back(sample_controls);\n    }\n    dest.Write(code_);\n    address.Write(code_, false, address_mask);\n    resource.Write(code_, false, dest_write_mask, true);\n    sampler.Write(code_, false, 0b0000);\n    lod.Write(code_, false, 0b0000);\n    ++stat_.instruction_count;\n    ++stat_.texture_normal_instructions;\n  }\n  void OpSampleD(const Dest& dest, const Src& address,\n                 uint32_t address_components, const Src& resource,\n                 const Src& sampler, const Src& x_derivatives,\n                 const Src& y_derivatives, uint32_t derivatives_components,\n                 int32_t aoffimmi_u = 0, int32_t aoffimmi_v = 0,\n                 int32_t aoffimmi_w = 0) {\n    // If the address is 1-component, the derivatives are 1-component, if the\n    // address is 4-component, the derivatives are 4-component.\n    assert_true(derivatives_components <= address_components);\n    uint32_t dest_write_mask = dest.GetMask();\n    uint32_t sample_controls = 0;\n    if (aoffimmi_u || aoffimmi_v || aoffimmi_w) {\n      sample_controls =\n          SampleControlsExtendedOpcodeToken(aoffimmi_u, aoffimmi_v, aoffimmi_w);\n    }\n    uint32_t address_mask = (1 << address_components) - 1;\n    uint32_t derivatives_mask = (1 << derivatives_components) - 1;\n    uint32_t operands_length =\n        dest.GetLength() + address.GetLength(address_mask) +\n        resource.GetLength(dest_write_mask, true) + sampler.GetLength(0b0000) +\n        x_derivatives.GetLength(derivatives_mask, address_components > 1) +\n        y_derivatives.GetLength(derivatives_mask, address_components > 1);\n    code_.reserve(code_.size() + 1 + (sample_controls ? 1 : 0) +\n                  operands_length);\n    code_.push_back(OpcodeToken(Opcode::kSampleD, operands_length, false,\n                                sample_controls ? 1 : 0));\n    if (sample_controls) {\n      code_.push_back(sample_controls);\n    }\n    dest.Write(code_);\n    address.Write(code_, false, address_mask);\n    resource.Write(code_, false, dest_write_mask, true);\n    sampler.Write(code_, false, 0b0000);\n    x_derivatives.Write(code_, false, derivatives_mask, address_components > 1);\n    y_derivatives.Write(code_, false, derivatives_mask, address_components > 1);\n    ++stat_.instruction_count;\n    ++stat_.texture_gradient_instructions;\n  }\n  void OpSqRt(const Dest& dest, const Src& src, bool saturate = false) {\n    EmitAluOp(Opcode::kSqRt, 0b0, dest, src, saturate);\n    ++stat_.float_instruction_count;\n  }\n  void OpSwitch(const Src& src) {\n    EmitFlowOp(Opcode::kSwitch, src);\n    ++stat_.dynamic_flow_control_count;\n  }\n  void OpSinCos(const Dest& dest_sin, const Dest& dest_cos, const Src& src,\n                bool saturate = false) {\n    EmitAluOp(Opcode::kSinCos, 0b0, dest_sin, dest_cos, src, saturate);\n    ++stat_.float_instruction_count;\n  }\n  void OpUDiv(const Dest& dest_quotient, const Dest& dest_remainder,\n              const Src& src0, const Src& src1) {\n    EmitAluOp(Opcode::kUDiv, 0b11, dest_quotient, dest_remainder, src0, src1);\n    ++stat_.uint_instruction_count;\n  }\n  void OpULT(const Dest& dest, const Src& src0, const Src& src1) {\n    EmitAluOp(Opcode::kULT, 0b11, dest, src0, src1);\n    ++stat_.uint_instruction_count;\n  }\n  void OpUGE(const Dest& dest, const Src& src0, const Src& src1) {\n    EmitAluOp(Opcode::kUGE, 0b11, dest, src0, src1);\n    ++stat_.uint_instruction_count;\n  }\n  void OpUMul(const Dest& dest_hi, const Dest& dest_lo, const Src& src0,\n              const Src& src1) {\n    EmitAluOp(Opcode::kUMul, 0b11, dest_hi, dest_lo, src0, src1);\n    ++stat_.uint_instruction_count;\n  }\n  void OpUMAd(const Dest& dest, const Src& mul0, const Src& mul1,\n              const Src& add) {\n    EmitAluOp(Opcode::kUMAd, 0b111, dest, mul0, mul1, add);\n    ++stat_.uint_instruction_count;\n  }\n  void OpUMax(const Dest& dest, const Src& src0, const Src& src1) {\n    EmitAluOp(Opcode::kUMax, 0b11, dest, src0, src1);\n    ++stat_.uint_instruction_count;\n  }\n  void OpUMin(const Dest& dest, const Src& src0, const Src& src1) {\n    EmitAluOp(Opcode::kUMin, 0b11, dest, src0, src1);\n    ++stat_.uint_instruction_count;\n  }\n  void OpUShR(const Dest& dest, const Src& value, const Src& shift) {\n    EmitAluOp(Opcode::kUShR, 0b11, dest, value, shift);\n    ++stat_.uint_instruction_count;\n  }\n  void OpUToF(const Dest& dest, const Src& src) {\n    EmitAluOp(Opcode::kUToF, 0b1, dest, src);\n    ++stat_.conversion_instruction_count;\n  }\n  void OpXOr(const Dest& dest, const Src& src0, const Src& src1) {\n    EmitAluOp(Opcode::kXOr, 0b11, dest, src0, src1);\n    ++stat_.uint_instruction_count;\n  }\n  void OpDclResource(ResourceDimension dimension, uint32_t return_type_token,\n                     const Src& operand, uint32_t space = 0) {\n    uint32_t operands_length = operand.GetLength(0b1111, false);\n    code_.reserve(code_.size() + 3 + operands_length);\n    code_.push_back(OpcodeToken(Opcode::kDclResource, 2 + operands_length) |\n                    (uint32_t(dimension) << 11));\n    operand.Write(code_, false, 0b1111, false, true);\n    code_.push_back(return_type_token);\n    code_.push_back(space);\n  }\n  // The order of constant buffer declarations in a shader indicates their\n  // relative priority from highest to lowest (hint to driver).\n  void OpDclConstantBuffer(const Src& operand, uint32_t size_vectors,\n                           ConstantBufferAccessPattern access_pattern =\n                               ConstantBufferAccessPattern::kImmediateIndexed,\n                           uint32_t space = 0) {\n    uint32_t operands_length = operand.GetLength(0b1111, false);\n    code_.reserve(code_.size() + 3 + operands_length);\n    code_.push_back(\n        OpcodeToken(Opcode::kDclConstantBuffer, 2 + operands_length) |\n        (uint32_t(access_pattern) << 11));\n    operand.Write(code_, false, 0b1111, false, true);\n    code_.push_back(size_vectors);\n    code_.push_back(space);\n  }\n  void OpDclSampler(const Src& operand,\n                    SamplerMode mode = SamplerMode::kDefault,\n                    uint32_t space = 0) {\n    uint32_t operands_length = operand.GetLength(0b1111, false);\n    code_.reserve(code_.size() + 2 + operands_length);\n    code_.push_back(OpcodeToken(Opcode::kDclSampler, 1 + operands_length) |\n                    (uint32_t(mode) << 11));\n    operand.Write(code_, false, 0b1111, false, true);\n    code_.push_back(space);\n  }\n  // In geometry shaders, only kPointList, kLineStrip and kTriangleStrip are\n  // allowed.\n  void OpDclOutputTopology(PrimitiveTopology output_topology) {\n    code_.push_back(OpcodeToken(Opcode::kDclOutputTopology, 0) |\n                    (uint32_t(output_topology) << 11));\n    stat_.gs_output_topology = output_topology;\n  }\n  // In geometry shaders, only kPoint, kLine, kTriangle, kLineWithAdjacency and\n  // kTriangleWithAdjacency are allowed.\n  void OpDclInputPrimitive(Primitive input_primitive) {\n    code_.push_back(OpcodeToken(Opcode::kDclInputPrimitive, 0) |\n                    (uint32_t(input_primitive) << 11));\n    stat_.input_primitive = input_primitive;\n  }\n  // Returns the index of the count written in the code_ vector.\n  size_t OpDclMaxOutputVertexCount(uint32_t count) {\n    code_.reserve(code_.size() + 2);\n    code_.push_back(OpcodeToken(Opcode::kDclMaxOutputVertexCount, 1));\n    code_.push_back(count);\n    stat_.gs_max_output_vertex_count = count;\n    return code_.size() - 1;\n  }\n  void OpDclInput(const Dest& operand) {\n    uint32_t operands_length = operand.GetLength();\n    code_.reserve(code_.size() + 1 + operands_length);\n    code_.push_back(OpcodeToken(Opcode::kDclInput, operands_length));\n    operand.Write(code_, true);\n    ++stat_.dcl_count;\n  }\n  void OpDclInputSGV(const Dest& operand, Name name) {\n    uint32_t operands_length = operand.GetLength();\n    code_.reserve(code_.size() + 2 + operands_length);\n    code_.push_back(OpcodeToken(Opcode::kDclInputSGV, 1 + operands_length));\n    operand.Write(code_, true);\n    code_.push_back(uint32_t(name));\n    ++stat_.dcl_count;\n  }\n  void OpDclInputSIV(const Dest& operand, Name name) {\n    uint32_t operands_length = operand.GetLength();\n    code_.reserve(code_.size() + 2 + operands_length);\n    code_.push_back(OpcodeToken(Opcode::kDclInputSIV, 1 + operands_length));\n    operand.Write(code_, true);\n    code_.push_back(uint32_t(name));\n    ++stat_.dcl_count;\n  }\n  void OpDclInputPS(InterpolationMode interpolation_mode, const Dest& operand) {\n    uint32_t operands_length = operand.GetLength();\n    code_.reserve(code_.size() + 1 + operands_length);\n    code_.push_back(OpcodeToken(Opcode::kDclInputPS, operands_length) |\n                    (uint32_t(interpolation_mode) << 11));\n    operand.Write(code_, true);\n    ++stat_.dcl_count;\n  }\n  void OpDclInputPSSGV(const Dest& operand, Name name) {\n    uint32_t operands_length = operand.GetLength();\n    code_.reserve(code_.size() + 2 + operands_length);\n    // Constant interpolation mode is set in FXC output at least for\n    // SV_IsFrontFace, despite the comment in d3d12TokenizedProgramFormat.hpp\n    // saying bits 11:23 are ignored.\n    code_.push_back(OpcodeToken(Opcode::kDclInputPSSGV, 1 + operands_length) |\n                    (uint32_t(InterpolationMode::kConstant) << 11));\n    operand.Write(code_, true);\n    code_.push_back(uint32_t(name));\n    ++stat_.dcl_count;\n  }\n  void OpDclInputPSSIV(InterpolationMode interpolation_mode,\n                       const Dest& operand, Name name) {\n    uint32_t operands_length = operand.GetLength();\n    code_.reserve(code_.size() + 2 + operands_length);\n    code_.push_back(OpcodeToken(Opcode::kDclInputPSSIV, 1 + operands_length) |\n                    (uint32_t(interpolation_mode) << 11));\n    operand.Write(code_, true);\n    code_.push_back(uint32_t(name));\n    ++stat_.dcl_count;\n  }\n  void OpDclOutput(const Dest& operand) {\n    uint32_t operands_length = operand.GetLength();\n    code_.reserve(code_.size() + 1 + operands_length);\n    code_.push_back(OpcodeToken(Opcode::kDclOutput, operands_length));\n    operand.Write(code_, true);\n    ++stat_.dcl_count;\n  }\n  void OpDclOutputSIV(const Dest& operand, Name name) {\n    uint32_t operands_length = operand.GetLength();\n    code_.reserve(code_.size() + 2 + operands_length);\n    code_.push_back(OpcodeToken(Opcode::kDclOutputSIV, 1 + operands_length));\n    operand.Write(code_, true);\n    code_.push_back(uint32_t(name));\n    ++stat_.dcl_count;\n  }\n  // Returns the index of the count written in the code_ vector.\n  size_t OpDclTemps(uint32_t count) {\n    code_.reserve(code_.size() + 2);\n    code_.push_back(OpcodeToken(Opcode::kDclTemps, 1));\n    code_.push_back(count);\n    stat_.temp_register_count = count;\n    return code_.size() - 1;\n  }\n  void OpDclIndexableTemp(uint32_t index, uint32_t count,\n                          uint32_t component_count) {\n    code_.reserve(code_.size() + 4);\n    code_.push_back(OpcodeToken(Opcode::kDclIndexableTemp, 3));\n    code_.push_back(index);\n    code_.push_back(count);\n    code_.push_back(component_count);\n    stat_.temp_array_count += count;\n  }\n  // flags are GlobalFlags.\n  void OpDclGlobalFlags(uint32_t flags) {\n    code_.push_back(OpcodeToken(Opcode::kDclGlobalFlags, 0) | flags);\n  }\n  void OpLOD(const Dest& dest, const Src& address, uint32_t address_components,\n             const Src& resource, const Src& sampler) {\n    uint32_t dest_write_mask = dest.GetMask();\n    uint32_t address_mask = (1 << address_components) - 1;\n    uint32_t operands_length =\n        dest.GetLength() + address.GetLength(address_mask) +\n        resource.GetLength(dest_write_mask) + sampler.GetLength(0b0000);\n    code_.reserve(code_.size() + 1 + operands_length);\n    code_.push_back(OpcodeToken(Opcode::kLOD, operands_length));\n    dest.Write(code_);\n    address.Write(code_, false, address_mask);\n    resource.Write(code_, false, dest_write_mask);\n    sampler.Write(code_, false, 0b0000);\n    ++stat_.instruction_count;\n    ++stat_.lod_instructions;\n  }\n  void OpEmitStream(const Dest& stream) {\n    uint32_t operands_length = stream.GetLength();\n    code_.reserve(code_.size() + 1 + operands_length);\n    code_.push_back(OpcodeToken(Opcode::kEmitStream, operands_length));\n    stream.Write(code_);\n    ++stat_.instruction_count;\n    ++stat_.emit_instruction_count;\n  }\n  void OpCutStream(const Dest& stream) {\n    uint32_t operands_length = stream.GetLength();\n    code_.reserve(code_.size() + 1 + operands_length);\n    code_.push_back(OpcodeToken(Opcode::kCutStream, operands_length));\n    stream.Write(code_);\n    ++stat_.instruction_count;\n    ++stat_.cut_instruction_count;\n  }\n  // Don't use emit_then_cut_stream - crashes AMD Software: Adrenalin Edition\n  // 23.3.2 shader compiler on RDNA 3 if used conditionally.\n  void OpEmitThenCutStream(const Dest& stream) {\n    uint32_t operands_length = stream.GetLength();\n    code_.reserve(code_.size() + 1 + operands_length);\n    code_.push_back(OpcodeToken(Opcode::kEmitThenCutStream, operands_length));\n    stream.Write(code_);\n    ++stat_.instruction_count;\n    // TODO(Triang3l): Verify if the instruction counts should be incremented\n    // this way (haven't been able to obtain this from FXC because it generates\n    // separate emit_stream and cut_stream, at least for Shader Model 5.1).\n    ++stat_.emit_instruction_count;\n    ++stat_.cut_instruction_count;\n  }\n  void OpDerivRTXCoarse(const Dest& dest, const Src& src,\n                        bool saturate = false) {\n    EmitAluOp(Opcode::kDerivRTXCoarse, 0b0, dest, src, saturate);\n    ++stat_.float_instruction_count;\n  }\n  void OpDerivRTXFine(const Dest& dest, const Src& src, bool saturate = false) {\n    EmitAluOp(Opcode::kDerivRTXFine, 0b0, dest, src, saturate);\n    ++stat_.float_instruction_count;\n  }\n  void OpDerivRTYCoarse(const Dest& dest, const Src& src,\n                        bool saturate = false) {\n    EmitAluOp(Opcode::kDerivRTYCoarse, 0b0, dest, src, saturate);\n    ++stat_.float_instruction_count;\n  }\n  void OpDerivRTYFine(const Dest& dest, const Src& src, bool saturate = false) {\n    EmitAluOp(Opcode::kDerivRTYFine, 0b0, dest, src, saturate);\n    ++stat_.float_instruction_count;\n  }\n  void OpRcp(const Dest& dest, const Src& src, bool saturate = false) {\n    EmitAluOp(Opcode::kRcp, 0b0, dest, src, saturate);\n    ++stat_.float_instruction_count;\n  }\n  void OpF32ToF16(const Dest& dest, const Src& src) {\n    EmitAluOp(Opcode::kF32ToF16, 0b0, dest, src);\n    ++stat_.conversion_instruction_count;\n  }\n  void OpF16ToF32(const Dest& dest, const Src& src) {\n    EmitAluOp(Opcode::kF16ToF32, 0b1, dest, src);\n    ++stat_.conversion_instruction_count;\n  }\n  void OpFirstBitHi(const Dest& dest, const Src& src) {\n    EmitAluOp(Opcode::kFirstBitHi, 0b1, dest, src);\n    ++stat_.uint_instruction_count;\n  }\n  void OpFirstBitLo(const Dest& dest, const Src& src) {\n    EmitAluOp(Opcode::kFirstBitLo, 0b1, dest, src);\n    ++stat_.uint_instruction_count;\n  }\n  void OpUBFE(const Dest& dest, const Src& width, const Src& offset,\n              const Src& src) {\n    EmitAluOp(Opcode::kUBFE, 0b111, dest, width, offset, src);\n    ++stat_.uint_instruction_count;\n  }\n  void OpIBFE(const Dest& dest, const Src& width, const Src& offset,\n              const Src& src) {\n    EmitAluOp(Opcode::kIBFE, 0b111, dest, width, offset, src);\n    ++stat_.int_instruction_count;\n  }\n  void OpBFI(const Dest& dest, const Src& width, const Src& offset,\n             const Src& from, const Src& to) {\n    EmitAluOp(Opcode::kBFI, 0b1111, dest, width, offset, from, to);\n    ++stat_.uint_instruction_count;\n  }\n  void OpBFRev(const Dest& dest, const Src& src) {\n    EmitAluOp(Opcode::kBFRev, 0b1, dest, src);\n    ++stat_.uint_instruction_count;\n  }\n  void OpDclStream(const Dest& stream) {\n    uint32_t operands_length = stream.GetLength();\n    code_.reserve(code_.size() + 1 + operands_length);\n    code_.push_back(OpcodeToken(Opcode::kDclStream, operands_length));\n    stream.Write(code_, true);\n  }\n  void OpDclInputControlPointCount(uint32_t count) {\n    code_.push_back(OpcodeToken(Opcode::kDclInputControlPointCount, 0) |\n                    (count << 11));\n    stat_.c_control_points = count;\n  }\n  void OpDclTessDomain(TessellatorDomain domain) {\n    code_.push_back(OpcodeToken(Opcode::kDclTessDomain, 0) |\n                    (uint32_t(domain) << 11));\n    stat_.tessellator_domain = domain;\n  }\n  void OpDclThreadGroup(uint32_t x, uint32_t y, uint32_t z) {\n    code_.reserve(code_.size() + 4);\n    code_.push_back(OpcodeToken(Opcode::kDclThreadGroup, 3));\n    code_.push_back(x);\n    code_.push_back(y);\n    code_.push_back(z);\n  }\n  // Possible flags are kUAVFlagGloballyCoherentAccess and\n  // kUAVFlagRasterizerOrderedAccess.\n  void OpDclUnorderedAccessViewTyped(ResourceDimension dimension,\n                                     uint32_t flags, uint32_t return_type_token,\n                                     const Src& operand, uint32_t space = 0) {\n    uint32_t operands_length = operand.GetLength(0b1111, false);\n    code_.reserve(code_.size() + 3 + operands_length);\n    code_.push_back(\n        OpcodeToken(Opcode::kDclUnorderedAccessViewTyped, 2 + operands_length) |\n        (uint32_t(dimension) << 11) | flags);\n    operand.Write(code_, false, 0b1111, false, true);\n    code_.push_back(return_type_token);\n    code_.push_back(space);\n  }\n  // Possible flags are kUAVFlagGloballyCoherentAccess and\n  // kUAVFlagRasterizerOrderedAccess.\n  void OpDclUnorderedAccessViewRaw(uint32_t flags, const Src& operand,\n                                   uint32_t space = 0) {\n    uint32_t operands_length = operand.GetLength(0b1111, false);\n    code_.reserve(code_.size() + 2 + operands_length);\n    code_.push_back(\n        OpcodeToken(Opcode::kDclUnorderedAccessViewRaw, 1 + operands_length) |\n        flags);\n    operand.Write(code_, true, 0b1111, false, true);\n    code_.push_back(space);\n  }\n  void OpDclResourceRaw(const Src& operand, uint32_t space = 0) {\n    uint32_t operands_length = operand.GetLength(0b1111, false);\n    code_.reserve(code_.size() + 2 + operands_length);\n    code_.push_back(OpcodeToken(Opcode::kDclResourceRaw, 1 + operands_length));\n    operand.Write(code_, true, 0b1111, false, true);\n    code_.push_back(space);\n  }\n  void OpLdUAVTyped(const Dest& dest, const Src& address,\n                    uint32_t address_components, const Src& uav) {\n    uint32_t dest_write_mask = dest.GetMask();\n    uint32_t address_mask = (1 << address_components) - 1;\n    uint32_t operands_length = dest.GetLength() +\n                               address.GetLength(address_mask, true) +\n                               uav.GetLength(dest_write_mask, true);\n    code_.reserve(code_.size() + 1 + operands_length);\n    code_.push_back(OpcodeToken(Opcode::kLdUAVTyped, operands_length));\n    dest.Write(code_);\n    address.Write(code_, true, address_mask, true);\n    uav.Write(code_, false, dest_write_mask, true);\n    ++stat_.instruction_count;\n    ++stat_.texture_load_instructions;\n  }\n  void OpStoreUAVTyped(const Dest& dest, const Src& address,\n                       uint32_t address_components, const Src& value) {\n    uint32_t dest_write_mask = dest.GetMask();\n    // Typed UAV writes don't support write masking.\n    assert_true(dest_write_mask == 0b1111);\n    uint32_t address_mask = (1 << address_components) - 1;\n    uint32_t operands_length = dest.GetLength() +\n                               address.GetLength(address_mask, true) +\n                               value.GetLength(dest_write_mask);\n    code_.reserve(code_.size() + 1 + operands_length);\n    code_.push_back(OpcodeToken(Opcode::kStoreUAVTyped, operands_length));\n    dest.Write(code_);\n    address.Write(code_, true, address_mask, true);\n    value.Write(code_, false, dest_write_mask);\n    ++stat_.instruction_count;\n    ++stat_.c_texture_store_instructions;\n  }\n  void OpLdRaw(const Dest& dest, const Src& byte_offset, const Src& src) {\n    // For Load, FXC emits code for writing to any component of the destination,\n    // with xxxx swizzle of the source SRV/UAV.\n    // For Load2/Load3/Load4, it's xy/xyz/xyzw write mask and xyxx/xyzx/xyzw\n    // swizzle.\n    uint32_t dest_write_mask = dest.GetMask();\n    assert_true(dest_write_mask == 0b0001 || dest_write_mask == 0b0010 ||\n                dest_write_mask == 0b0100 || dest_write_mask == 0b1000 ||\n                dest_write_mask == 0b0011 || dest_write_mask == 0b0111 ||\n                dest_write_mask == 0b1111);\n    uint32_t component_count = xe::bit_count(dest_write_mask);\n    assert_true((src.swizzle_ & ((1 << (component_count * 2)) - 1)) ==\n                (Src::kXYZW & ((1 << (component_count * 2)) - 1)));\n    uint32_t src_mask = (1 << component_count) - 1;\n    uint32_t operands_length = dest.GetLength() +\n                               byte_offset.GetLength(0b0000) +\n                               src.GetLength(src_mask, true);\n    code_.reserve(code_.size() + 1 + operands_length);\n    code_.push_back(OpcodeToken(Opcode::kLdRaw, operands_length));\n    dest.Write(code_);\n    byte_offset.Write(code_, true, 0b0000);\n    src.Write(code_, true, src_mask, true);\n    ++stat_.instruction_count;\n    ++stat_.texture_load_instructions;\n  }\n  void OpStoreRaw(const Dest& dest, const Src& byte_offset, const Src& value) {\n    uint32_t dest_write_mask = dest.GetMask();\n    assert_true(dest_write_mask == 0b0001 || dest_write_mask == 0b0011 ||\n                dest_write_mask == 0b0111 || dest_write_mask == 0b1111);\n    uint32_t operands_length = dest.GetLength() +\n                               byte_offset.GetLength(0b0000) +\n                               value.GetLength(dest_write_mask);\n    code_.reserve(code_.size() + 1 + operands_length);\n    code_.push_back(OpcodeToken(Opcode::kStoreRaw, operands_length));\n    dest.Write(code_);\n    byte_offset.Write(code_, true, 0b0000);\n    value.Write(code_, true, dest_write_mask);\n    ++stat_.instruction_count;\n    ++stat_.c_texture_store_instructions;\n  }\n  void OpAtomicAnd(const Dest& dest, const Src& address,\n                   uint32_t address_components, const Src& value) {\n    EmitAtomicOp(Opcode::kAtomicAnd, dest, address, address_components, value);\n  }\n  void OpAtomicOr(const Dest& dest, const Src& address,\n                  uint32_t address_components, const Src& value) {\n    EmitAtomicOp(Opcode::kAtomicOr, dest, address, address_components, value);\n  }\n  void OpEvalSampleIndex(const Dest& dest, const Src& value,\n                         const Src& sample_index) {\n    uint32_t dest_write_mask = dest.GetMask();\n    uint32_t operands_length = dest.GetLength() +\n                               value.GetLength(dest_write_mask) +\n                               sample_index.GetLength(0b0000);\n    code_.reserve(code_.size() + 1 + operands_length);\n    code_.push_back(OpcodeToken(Opcode::kEvalSampleIndex, operands_length));\n    dest.Write(code_);\n    value.Write(code_, false, dest_write_mask);\n    sample_index.Write(code_, true, 0b0000);\n    ++stat_.instruction_count;\n  }\n  void OpEvalCentroid(const Dest& dest, const Src& value) {\n    uint32_t dest_write_mask = dest.GetMask();\n    uint32_t operands_length =\n        dest.GetLength() + value.GetLength(dest_write_mask);\n    code_.reserve(code_.size() + 1 + operands_length);\n    code_.push_back(OpcodeToken(Opcode::kEvalCentroid, operands_length));\n    dest.Write(code_);\n    value.Write(code_, false, dest_write_mask);\n    ++stat_.instruction_count;\n  }\n\n private:\n  void EmitAluOp(Opcode opcode, uint32_t src_are_integer, const Dest& dest,\n                 const Src& src, bool saturate = false) {\n    uint32_t dest_write_mask = dest.GetMask();\n    uint32_t operands_length =\n        dest.GetLength() + src.GetLength(dest_write_mask);\n    code_.reserve(code_.size() + 1 + operands_length);\n    code_.push_back(OpcodeToken(opcode, operands_length, saturate));\n    dest.Write(code_);\n    src.Write(code_, (src_are_integer & 0b1) != 0, dest_write_mask);\n    ++stat_.instruction_count;\n  }\n  void EmitAluOp(Opcode opcode, uint32_t src_are_integer, const Dest& dest,\n                 const Src& src0, const Src& src1, bool saturate = false) {\n    uint32_t dest_write_mask = dest.GetMask();\n    uint32_t operands_length = dest.GetLength() +\n                               src0.GetLength(dest_write_mask) +\n                               src1.GetLength(dest_write_mask);\n    code_.reserve(code_.size() + 1 + operands_length);\n    code_.push_back(OpcodeToken(opcode, operands_length, saturate));\n    dest.Write(code_);\n    src0.Write(code_, (src_are_integer & 0b1) != 0, dest_write_mask);\n    src1.Write(code_, (src_are_integer & 0b10) != 0, dest_write_mask);\n    ++stat_.instruction_count;\n  }\n  void EmitAluOp(Opcode opcode, uint32_t src_are_integer, const Dest& dest,\n                 const Src& src0, const Src& src1, const Src& src2,\n                 bool saturate = false) {\n    uint32_t dest_write_mask = dest.GetMask();\n    uint32_t operands_length =\n        dest.GetLength() + src0.GetLength(dest_write_mask) +\n        src1.GetLength(dest_write_mask) + src2.GetLength(dest_write_mask);\n    code_.reserve(code_.size() + 1 + operands_length);\n    code_.push_back(OpcodeToken(opcode, operands_length, saturate));\n    dest.Write(code_);\n    src0.Write(code_, (src_are_integer & 0b1) != 0, dest_write_mask);\n    src1.Write(code_, (src_are_integer & 0b10) != 0, dest_write_mask);\n    src2.Write(code_, (src_are_integer & 0b100) != 0, dest_write_mask);\n    ++stat_.instruction_count;\n  }\n  void EmitAluOp(Opcode opcode, uint32_t src_are_integer, const Dest& dest,\n                 const Src& src0, const Src& src1, const Src& src2,\n                 const Src& src3, bool saturate = false) {\n    uint32_t dest_write_mask = dest.GetMask();\n    uint32_t operands_length =\n        dest.GetLength() + src0.GetLength(dest_write_mask) +\n        src1.GetLength(dest_write_mask) + src2.GetLength(dest_write_mask) +\n        src3.GetLength(dest_write_mask);\n    code_.reserve(code_.size() + 1 + operands_length);\n    code_.push_back(OpcodeToken(opcode, operands_length, saturate));\n    dest.Write(code_);\n    src0.Write(code_, (src_are_integer & 0b1) != 0, dest_write_mask);\n    src1.Write(code_, (src_are_integer & 0b10) != 0, dest_write_mask);\n    src2.Write(code_, (src_are_integer & 0b100) != 0, dest_write_mask);\n    src3.Write(code_, (src_are_integer & 0b1000) != 0, dest_write_mask);\n    ++stat_.instruction_count;\n  }\n  void EmitAluOp(Opcode opcode, uint32_t src_are_integer, const Dest& dest0,\n                 const Dest& dest1, const Src& src, bool saturate = false) {\n    uint32_t dest_write_mask = dest0.GetMask() | dest1.GetMask();\n    uint32_t operands_length =\n        dest0.GetLength() + dest1.GetLength() + src.GetLength(dest_write_mask);\n    code_.reserve(code_.size() + 1 + operands_length);\n    code_.push_back(OpcodeToken(opcode, operands_length, saturate));\n    dest0.Write(code_);\n    dest1.Write(code_);\n    src.Write(code_, (src_are_integer & 0b1) != 0, dest_write_mask);\n    ++stat_.instruction_count;\n  }\n  void EmitAluOp(Opcode opcode, uint32_t src_are_integer, const Dest& dest0,\n                 const Dest& dest1, const Src& src0, const Src& src1,\n                 bool saturate = false) {\n    uint32_t dest_write_mask = dest0.GetMask() | dest1.GetMask();\n    uint32_t operands_length = dest0.GetLength() + dest1.GetLength() +\n                               src0.GetLength(dest_write_mask) +\n                               src1.GetLength(dest_write_mask);\n    code_.reserve(code_.size() + 1 + operands_length);\n    code_.push_back(OpcodeToken(opcode, operands_length, saturate));\n    dest0.Write(code_);\n    dest1.Write(code_);\n    src0.Write(code_, (src_are_integer & 0b1) != 0, dest_write_mask);\n    src1.Write(code_, (src_are_integer & 0b10) != 0, dest_write_mask);\n    ++stat_.instruction_count;\n  }\n  void EmitFlowOp(Opcode opcode, const Src& src, bool test = false) {\n    uint32_t operands_length = src.GetLength(0b0000);\n    code_.reserve(code_.size() + 1 + operands_length);\n    code_.push_back(OpcodeToken(opcode, operands_length) |\n                    (test ? (1 << 18) : 0));\n    src.Write(code_, true, 0b0000);\n    ++stat_.instruction_count;\n  }\n  void EmitFlowOp(Opcode opcode, const Src& src0, const Src& src1,\n                  bool test = false) {\n    uint32_t operands_length = src0.GetLength(0b0000) + src1.GetLength(0b0000);\n    code_.reserve(code_.size() + 1 + operands_length);\n    code_.push_back(OpcodeToken(opcode, operands_length) |\n                    (test ? (1 << 18) : 0));\n    src0.Write(code_, true, 0b0000);\n    src1.Write(code_, true, 0b0000);\n    ++stat_.instruction_count;\n  }\n  void EmitAtomicOp(Opcode opcode, const Dest& dest, const Src& address,\n                    uint32_t address_components, const Src& value) {\n    // Atomic operations require a 0-component memory destination.\n    assert_zero(dest.GetMask());\n    uint32_t address_mask = (1 << address_components) - 1;\n    uint32_t operands_length = dest.GetLength() +\n                               address.GetLength(address_mask) +\n                               value.GetLength(0b0001);\n    code_.reserve(code_.size() + 1 + operands_length);\n    code_.push_back(OpcodeToken(opcode, operands_length));\n    dest.Write(code_);\n    address.Write(code_, true, address_mask);\n    value.Write(code_, true, 0b0001);\n    ++stat_.instruction_count;\n    ++stat_.c_interlocked_instructions;\n  }\n\n  std::vector<uint32_t>& code_;\n  Statistics& stat_;\n};\n\n}  // namespace dxbc\n}  // namespace gpu\n}  // namespace xe\n\n#endif  // XENIA_GPU_DXBC_H_\n"
  },
  {
    "path": "src/xenia/gpu/dxbc_shader.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/dxbc_shader.h\"\n\n#include <cstring>\n\nnamespace xe {\nnamespace gpu {\n\nDxbcShader::DxbcShader(xenos::ShaderType shader_type, uint64_t ucode_data_hash,\n                       const uint32_t* ucode_dwords, size_t ucode_dword_count,\n                       std::endian ucode_source_endian)\n    : Shader(shader_type, ucode_data_hash, ucode_dwords, ucode_dword_count,\n             ucode_source_endian) {}\n\nShader::Translation* DxbcShader::CreateTranslationInstance(\n    uint64_t modification) {\n  return new DxbcTranslation(*this, modification);\n}\n\n}  // namespace gpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/dxbc_shader.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_DXBC_SHADER_H_\n#define XENIA_GPU_DXBC_SHADER_H_\n\n#include <atomic>\n#include <vector>\n\n#include \"xenia/gpu/dxbc_shader_translator.h\"\n#include \"xenia/gpu/shader.h\"\n#include \"xenia/gpu/xenos.h\"\n\nnamespace xe {\nnamespace gpu {\n\nclass DxbcShader : public Shader {\n public:\n  class DxbcTranslation : public Translation {\n   public:\n    DxbcTranslation(DxbcShader& shader, uint64_t modification)\n        : Translation(shader, modification) {}\n  };\n\n  DxbcShader(xenos::ShaderType shader_type, uint64_t ucode_data_hash,\n             const uint32_t* ucode_dwords, size_t ucode_dword_count,\n             std::endian ucode_source_endian = std::endian::big);\n\n  // Resource bindings are gathered after the successful translation of any\n  // modification for simplicity of translation (and they don't depend on\n  // modification bits).\n\n  static constexpr uint32_t kMaxTextureBindingIndexBits =\n      DxbcShaderTranslator::kMaxTextureBindingIndexBits;\n  static constexpr uint32_t kMaxTextureBindings =\n      DxbcShaderTranslator::kMaxTextureBindings;\n  struct TextureBinding {\n    uint32_t bindless_descriptor_index;\n    uint32_t fetch_constant;\n    // Stacked and 3D are separate TextureBindings, even for bindless for null\n    // descriptor handling simplicity.\n    xenos::FetchOpDimension dimension;\n    bool is_signed;\n  };\n  // Safe to hash and compare with memcmp for layout hashing.\n  const std::vector<TextureBinding>& GetTextureBindingsAfterTranslation()\n      const {\n    return texture_bindings_;\n  }\n  const uint32_t GetUsedTextureMaskAfterTranslation() const {\n    return used_texture_mask_;\n  }\n\n  static constexpr uint32_t kMaxSamplerBindingIndexBits =\n      DxbcShaderTranslator::kMaxSamplerBindingIndexBits;\n  static constexpr uint32_t kMaxSamplerBindings =\n      DxbcShaderTranslator::kMaxSamplerBindings;\n  struct SamplerBinding {\n    uint32_t bindless_descriptor_index;\n    uint32_t fetch_constant;\n    xenos::TextureFilter mag_filter;\n    xenos::TextureFilter min_filter;\n    xenos::TextureFilter mip_filter;\n    xenos::AnisoFilter aniso_filter;\n  };\n  const std::vector<SamplerBinding>& GetSamplerBindingsAfterTranslation()\n      const {\n    return sampler_bindings_;\n  }\n\n protected:\n  Translation* CreateTranslationInstance(uint64_t modification) override;\n\n private:\n  friend class DxbcShaderTranslator;\n\n  std::atomic_flag bindings_setup_entered_ = ATOMIC_FLAG_INIT;\n  std::vector<TextureBinding> texture_bindings_;\n  std::vector<SamplerBinding> sampler_bindings_;\n  uint32_t used_texture_mask_ = 0;\n};\n\n}  // namespace gpu\n}  // namespace xe\n\n#endif  // XENIA_GPU_DXBC_SHADER_H_\n"
  },
  {
    "path": "src/xenia/gpu/dxbc_shader_translator.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2018 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/dxbc_shader_translator.h\"\n\n#include <algorithm>\n#include <atomic>\n#include <cstring>\n#include <memory>\n\n#include \"third_party/dxbc/DXBCChecksum.h\"\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/cvar.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/gpu/dxbc_shader.h\"\n#include \"xenia/gpu/xenos.h\"\n#include \"xenia/ui/graphics_provider.h\"\n\n// The test case for AMD is 4D5307E6 (checked in 2018).\nDEFINE_bool(dxbc_switch, true,\n            \"Use switch rather than if for flow control. Turning this off or \"\n            \"on may improve stability, though this heavily depends on the \"\n            \"driver - on AMD, it's recommended to have this set to true, as \"\n            \"some titles appear to crash when if is used for flow control \"\n            \"(possibly the shader compiler tries to flatten them). On Intel \"\n            \"HD Graphics, this is ignored because of a crash with the switch \"\n            \"instruction.\",\n            \"GPU\");\nDEFINE_bool(dxbc_source_map, false,\n            \"Disassemble Xenos instructions as comments in the resulting DXBC \"\n            \"for debugging.\",\n            \"GPU\");\n\nnamespace xe {\nnamespace gpu {\nusing namespace ucode;\n\n// Notes about operands:\n//\n// Reading and writing:\n// - r# (temporary registers) are 4-component and can be used anywhere.\n// - v# (inputs) are 4-component and read-only.\n// - o# (outputs) are 4-component and write-only.\n// - oDepth (pixel shader depth output) is 1-component and write-only.\n// - x# (indexable temporary registers) are 4-component and can be accessed\n//   either via a mov load or a mov store (and those movs are counted as\n//   ArrayInstructions in STAT, not as MovInstructions), even though the D3D11.3\n//   functional specification says x# can be used wherever r# can be used, but\n//   FXC emits only mov load/store in simple tests.\n//\n// Indexing:\n// - Constant buffers use 3D indices in CBx[y][z] format, where x is the ID of\n//   the binding (CB#), y is the register to access within its space, z is the\n//   4-component vector to access within the register binding.\n//   For example, if the requested vector is located in the beginning of the\n//   second buffer in the descriptor array at b2, which is assigned to CB1, the\n//   index would be CB1[3][0].\n// - Resources and samplers use 2D indices, where the first dimension is the\n//   S#/T#/U# binding index, and the second is the s#/t#/u# register index\n//   within its space.\n\nDxbcShaderTranslator::DxbcShaderTranslator(\n    ui::GraphicsProvider::GpuVendorID vendor_id, bool bindless_resources_used,\n    bool edram_rov_used, bool gamma_render_target_as_unorm8,\n    bool msaa_2x_supported, uint32_t draw_resolution_scale_x,\n    uint32_t draw_resolution_scale_y, bool force_emit_source_map)\n    : a_(shader_code_, statistics_),\n      ao_(shader_object_, statistics_),\n      vendor_id_(vendor_id),\n      bindless_resources_used_(bindless_resources_used),\n      edram_rov_used_(edram_rov_used),\n      gamma_render_target_as_unorm8_(gamma_render_target_as_unorm8),\n      msaa_2x_supported_(msaa_2x_supported),\n      draw_resolution_scale_x_(draw_resolution_scale_x),\n      draw_resolution_scale_y_(draw_resolution_scale_y),\n      emit_source_map_(force_emit_source_map || cvars::dxbc_source_map) {\n  assert_not_zero(draw_resolution_scale_x);\n  assert_not_zero(draw_resolution_scale_y);\n  // Don't allocate again and again for the first shader.\n  shader_code_.reserve(8192);\n  shader_object_.reserve(16384);\n}\nDxbcShaderTranslator::~DxbcShaderTranslator() = default;\n\nstd::vector<uint8_t> DxbcShaderTranslator::CreateDepthOnlyPixelShader() {\n  is_depth_only_pixel_shader_ = true;\n  // TODO(Triang3l): Handle in a nicer way (is_depth_only_pixel_shader_ is a\n  // leftover from when a Shader object wasn't used during translation).\n  Shader shader(xenos::ShaderType::kPixel, 0, nullptr, 0);\n  shader.AnalyzeUcode(instruction_disassembly_buffer_);\n  Shader::Translation& translation = *shader.GetOrCreateTranslation(0);\n  TranslateAnalyzedShader(translation);\n  is_depth_only_pixel_shader_ = false;\n  return translation.translated_binary();\n}\n\nuint64_t DxbcShaderTranslator::GetDefaultVertexShaderModification(\n    uint32_t dynamic_addressable_register_count,\n    Shader::HostVertexShaderType host_vertex_shader_type) const {\n  Modification shader_modification;\n  shader_modification.vertex.dynamic_addressable_register_count =\n      dynamic_addressable_register_count;\n  shader_modification.vertex.host_vertex_shader_type = host_vertex_shader_type;\n  shader_modification.vertex.interpolator_mask =\n      (UINT32_C(1) << xenos::kMaxInterpolators) - 1;\n  return shader_modification.value;\n}\n\nuint64_t DxbcShaderTranslator::GetDefaultPixelShaderModification(\n    uint32_t dynamic_addressable_register_count) const {\n  Modification shader_modification;\n  shader_modification.pixel.dynamic_addressable_register_count =\n      dynamic_addressable_register_count;\n  shader_modification.pixel.interpolator_mask =\n      (UINT32_C(1) << xenos::kMaxInterpolators) - 1;\n  shader_modification.pixel.depth_stencil_mode =\n      Modification::DepthStencilMode::kNoModifiers;\n  return shader_modification.value;\n}\n\nvoid DxbcShaderTranslator::Reset() {\n  ShaderTranslator::Reset();\n\n  shader_code_.clear();\n\n  cbuffer_count_ = 0;\n  // System constants always used in prologues/epilogues.\n  cbuffer_index_system_constants_ = cbuffer_count_++;\n  cbuffer_index_float_constants_ = kBindingIndexUnallocated;\n  cbuffer_index_bool_loop_constants_ = kBindingIndexUnallocated;\n  cbuffer_index_fetch_constants_ = kBindingIndexUnallocated;\n  cbuffer_index_descriptor_indices_ = kBindingIndexUnallocated;\n\n  system_constants_used_ = 0;\n\n  out_reg_vs_interpolators_ = UINT32_MAX;\n  out_reg_vs_position_ = UINT32_MAX;\n  out_reg_vs_clip_cull_distances_ = UINT32_MAX;\n  out_reg_vs_point_size_ = UINT32_MAX;\n  in_reg_ps_interpolators_ = UINT32_MAX;\n  in_reg_ps_point_coordinates_ = UINT32_MAX;\n  in_reg_ps_position_ = UINT32_MAX;\n  in_reg_ps_front_face_sample_index_ = UINT32_MAX;\n\n  in_domain_location_used_ = 0;\n  in_control_point_index_used_ = false;\n  in_position_used_ = 0;\n  in_front_face_used_ = false;\n\n  system_temp_count_current_ = 0;\n  system_temp_count_max_ = 0;\n\n  cf_exec_bool_constant_ = kCfExecBoolConstantNone;\n  cf_exec_predicated_ = false;\n  cf_instruction_predicate_if_open_ = false;\n  cf_exec_predicate_written_ = false;\n\n  srv_count_ = 0;\n  srv_index_shared_memory_ = kBindingIndexUnallocated;\n  srv_index_bindless_textures_2d_ = kBindingIndexUnallocated;\n  srv_index_bindless_textures_3d_ = kBindingIndexUnallocated;\n  srv_index_bindless_textures_cube_ = kBindingIndexUnallocated;\n\n  texture_bindings_.clear();\n  texture_bindings_for_bindful_srv_indices_.clear();\n\n  uav_count_ = 0;\n  uav_index_shared_memory_ = kBindingIndexUnallocated;\n  uav_index_edram_ = kBindingIndexUnallocated;\n\n  sampler_bindings_.clear();\n\n  std::memset(&shader_feature_info_, 0, sizeof(shader_feature_info_));\n  std::memset(&statistics_, 0, sizeof(statistics_));\n}\n\nuint32_t DxbcShaderTranslator::GetModificationRegisterCount() const {\n  Modification modification = GetDxbcShaderModification();\n  return is_vertex_shader()\n             ? modification.vertex.dynamic_addressable_register_count\n             : modification.pixel.dynamic_addressable_register_count;\n}\n\nbool DxbcShaderTranslator::UseSwitchForControlFlow() const {\n  // Xenia crashes on Intel HD Graphics 4000 with switch.\n  return cvars::dxbc_switch &&\n         vendor_id_ != ui::GraphicsProvider::GpuVendorID::kIntel;\n}\n\nuint32_t DxbcShaderTranslator::PushSystemTemp(uint32_t zero_mask,\n                                              uint32_t count) {\n  uint32_t register_index = system_temp_count_current_;\n  if (!is_depth_only_pixel_shader_ &&\n      !current_shader().uses_register_dynamic_addressing()) {\n    // Guest shader registers first if they're not in x0. Depth-only pixel\n    // shader is a special case of the DXBC translator usage, where there are no\n    // GPRs because there's no shader to translate, and a guest shader is not\n    // loaded.\n    register_index += register_count();\n  }\n  system_temp_count_current_ += count;\n  system_temp_count_max_ =\n      std::max(system_temp_count_max_, system_temp_count_current_);\n  zero_mask &= 0b1111;\n  if (zero_mask) {\n    for (uint32_t i = 0; i < count; ++i) {\n      a_.OpMov(dxbc::Dest::R(register_index + i, zero_mask), dxbc::Src::LU(0));\n    }\n  }\n  return register_index;\n}\n\nvoid DxbcShaderTranslator::PopSystemTemp(uint32_t count) {\n  assert_true(count <= system_temp_count_current_);\n  system_temp_count_current_ -= std::min(count, system_temp_count_current_);\n}\n\nvoid DxbcShaderTranslator::PWLGammaToLinear(\n    dxbc::Assembler& a, uint32_t target_temp, uint32_t target_temp_component,\n    uint32_t source_temp, uint32_t source_temp_component,\n    bool source_pre_saturated, uint32_t temp1, uint32_t temp1_component,\n    uint32_t temp2, uint32_t temp2_component) {\n  // The source is needed only once to begin building the result, so it can be\n  // the same as the destination.\n  assert_true(temp1 != target_temp || temp1_component != target_temp_component);\n  assert_true(temp1 != source_temp || temp1_component != source_temp_component);\n  assert_true(temp2 != target_temp || temp2_component != target_temp_component);\n  assert_true(temp2 != source_temp || temp2_component != source_temp_component);\n  assert_true(temp1 != temp2 || temp1_component != temp2_component);\n  dxbc::Dest target_dest(\n      dxbc::Dest::R(target_temp, UINT32_C(1) << target_temp_component));\n  dxbc::Src target_src(dxbc::Src::R(target_temp).Select(target_temp_component));\n  dxbc::Src source_src(dxbc::Src::R(source_temp).Select(source_temp_component));\n  dxbc::Dest temp1_dest(dxbc::Dest::R(temp1, UINT32_C(1) << temp1_component));\n  dxbc::Src temp1_src(dxbc::Src::R(temp1).Select(temp1_component));\n  dxbc::Dest temp2_dest(dxbc::Dest::R(temp2, UINT32_C(1) << temp2_component));\n  dxbc::Src temp2_src(dxbc::Src::R(temp2).Select(temp2_component));\n\n  // Get the scale (into temp1) and the offset (into temp2) for the piece.\n  // Using `source >= threshold` comparisons because the input might have not\n  // been saturated yet, and thus it may be NaN - since it will be saturated to\n  // 0 later, the 0...64/255 case should be selected for it.\n  a.OpGE(temp2_dest, source_src, dxbc::Src::LF(96.0f / 255.0f));\n  a.OpIf(true, temp2_src);\n  // [96/255 ... 1\n  a.OpGE(temp2_dest, source_src, dxbc::Src::LF(192.0f / 255.0f));\n  a.OpMovC(temp1_dest, temp2_src, dxbc::Src::LF(8.0f / 1024.0f),\n           dxbc::Src::LF(4.0f / 1024.0f));\n  a.OpMovC(temp2_dest, temp2_src, dxbc::Src::LF(-1024.0f),\n           dxbc::Src::LF(-256.0f));\n  a.OpElse();\n  // 0 ... 96/255)\n  a.OpGE(temp2_dest, source_src, dxbc::Src::LF(64.0f / 255.0f));\n  a.OpMovC(temp1_dest, temp2_src, dxbc::Src::LF(2.0f / 1024.0f),\n           dxbc::Src::LF(1.0f / 1024.0f));\n  a.OpMovC(temp2_dest, temp2_src, dxbc::Src::LF(-64.0f), dxbc::Src::LF(0.0f));\n  a.OpEndIf();\n\n  if (!source_pre_saturated) {\n    // Saturate the input, and flush NaN to 0.\n    a.OpMov(target_dest, source_src, true);\n  }\n  // linear = gamma * (255 * 1024) * scale + offset\n  // As both 1024 and the scale are powers of 2, and 1024 * scale is not smaller\n  // than 1, it's not important if it's (gamma * 255) * 1024 * scale,\n  // (gamma * 255 * 1024) * scale, gamma * 255 * (1024 * scale), or\n  // gamma * (255 * 1024 * scale) - or the option chosen here, as long as\n  // 1024 is applied before the scale since the scale is < 1 (specifically at\n  // least 1/1024), and it may make very small values denormal.\n  a.OpMul(target_dest, source_pre_saturated ? source_src : target_src,\n          dxbc::Src::LF(255.0f * 1024.0f));\n  a.OpMAd(target_dest, target_src, temp1_src, temp2_src);\n  // linear += trunc(linear * scale)\n  a.OpMul(temp1_dest, target_src, temp1_src);\n  a.OpRoundZ(temp1_dest, temp1_src);\n  a.OpAdd(target_dest, target_src, temp1_src);\n  // linear *= 1/1023\n  a.OpMul(target_dest, target_src, dxbc::Src::LF(1.0f / 1023.0f));\n}\n\nvoid DxbcShaderTranslator::PreSaturatedLinearToPWLGamma(\n    dxbc::Assembler& a, uint32_t target_temp, uint32_t target_temp_component,\n    uint32_t source_temp, uint32_t source_temp_component,\n    uint32_t temp_or_target, uint32_t temp_or_target_component,\n    uint32_t temp_non_target, uint32_t temp_non_target_component) {\n  // The source may be the same as the target, but in this case it can't also be\n  // used as a temporary variable.\n  assert_true(target_temp != source_temp ||\n              target_temp_component != source_temp_component ||\n              target_temp != temp_or_target ||\n              target_temp_component != temp_or_target_component);\n  assert_true(temp_or_target != source_temp ||\n              temp_or_target_component != source_temp_component);\n  assert_true(temp_non_target != target_temp ||\n              temp_non_target_component != target_temp_component);\n  assert_true(temp_non_target != source_temp ||\n              temp_non_target_component != source_temp_component);\n  assert_true(temp_or_target != temp_non_target ||\n              temp_or_target_component != temp_non_target_component);\n  dxbc::Dest target_dest(\n      dxbc::Dest::R(target_temp, UINT32_C(1) << target_temp_component));\n  dxbc::Src target_src(dxbc::Src::R(target_temp).Select(target_temp_component));\n  dxbc::Src source_src(dxbc::Src::R(source_temp).Select(source_temp_component));\n  dxbc::Dest temp_or_target_dest(\n      dxbc::Dest::R(temp_or_target, UINT32_C(1) << temp_or_target_component));\n  dxbc::Src temp_or_target_src(\n      dxbc::Src::R(temp_or_target).Select(temp_or_target_component));\n  dxbc::Dest temp_non_target_dest(\n      dxbc::Dest::R(temp_non_target, UINT32_C(1) << temp_non_target_component));\n  dxbc::Src temp_non_target_src(\n      dxbc::Src::R(temp_non_target).Select(temp_non_target_component));\n\n  // Get the scale (into temp_or_target) and the offset (into temp_non_target)\n  // for the piece.\n  a.OpGE(temp_non_target_dest, source_src, dxbc::Src::LF(128.0f / 1023.0f));\n  a.OpIf(true, temp_non_target_src);\n  // [128/1023 ... 1\n  a.OpGE(temp_non_target_dest, source_src, dxbc::Src::LF(512.0f / 1023.0f));\n  a.OpMovC(temp_or_target_dest, temp_non_target_src,\n           dxbc::Src::LF(1023.0f / 8.0f), dxbc::Src::LF(1023.0f / 4.0f));\n  a.OpMovC(temp_non_target_dest, temp_non_target_src,\n           dxbc::Src::LF(128.0f / 255.0f), dxbc::Src::LF(64.0f / 255.0f));\n  a.OpElse();\n  // 0 ... 128/1023)\n  a.OpGE(temp_non_target_dest, source_src, dxbc::Src::LF(64.0f / 1023.0f));\n  a.OpMovC(temp_or_target_dest, temp_non_target_src,\n           dxbc::Src::LF(1023.0f / 2.0f), dxbc::Src::LF(1023.0f));\n  a.OpMovC(temp_non_target_dest, temp_non_target_src,\n           dxbc::Src::LF(32.0f / 255.0f), dxbc::Src::LF(0.0f));\n  a.OpEndIf();\n\n  // gamma = trunc(linear * scale) * (1.0 / 255.0) + offset\n  a.OpMul(target_dest, source_src, temp_or_target_src);\n  a.OpRoundZ(target_dest, target_src);\n  a.OpMAd(target_dest, target_src, dxbc::Src::LF(1.0f / 255.0f),\n          temp_non_target_src);\n}\n\nvoid DxbcShaderTranslator::RemapAndConvertVertexIndices(\n    uint32_t dest_temp, uint32_t dest_temp_components, const dxbc::Src& src) {\n  dxbc::Dest dest(dxbc::Dest::R(dest_temp, dest_temp_components));\n  dxbc::Src dest_src(dxbc::Src::R(dest_temp));\n\n  // Add the base vertex index.\n  a_.OpIAdd(dest, src,\n            LoadSystemConstant(SystemConstants::Index::kVertexIndexOffset,\n                               offsetof(SystemConstants, vertex_index_offset),\n                               dxbc::Src::kXXXX));\n\n  // Mask since the GPU only uses the lower 24 bits of the vertex index (tested\n  // on an Adreno 200 phone). `((index & 0xFFFFFF) + offset) & 0xFFFFFF` is the\n  // same as `(index + offset) & 0xFFFFFF`.\n  a_.OpAnd(dest, dest_src, dxbc::Src::LU(xenos::kVertexIndexMask));\n\n  // Clamp after offsetting.\n  a_.OpUMax(dest, dest_src,\n            LoadSystemConstant(SystemConstants::Index::kVertexIndexMinMax,\n                               offsetof(SystemConstants, vertex_index_min),\n                               dxbc::Src::kXXXX));\n  a_.OpUMin(dest, dest_src,\n            LoadSystemConstant(SystemConstants::Index::kVertexIndexMinMax,\n                               offsetof(SystemConstants, vertex_index_max),\n                               dxbc::Src::kXXXX));\n\n  // Convert to float.\n  a_.OpUToF(dest, dest_src);\n}\n\nvoid DxbcShaderTranslator::StartVertexShader_LoadVertexIndex() {\n  if (register_count() < 1) {\n    return;\n  }\n\n  bool uses_register_dynamic_addressing =\n      current_shader().uses_register_dynamic_addressing();\n\n  // Writing the index to X of GPR 0 - either directly if not using indexable\n  // registers, or via a system temporary register.\n  uint32_t reg;\n  if (uses_register_dynamic_addressing) {\n    reg = PushSystemTemp();\n  } else {\n    reg = 0;\n  }\n\n  dxbc::Dest index_dest(dxbc::Dest::R(reg, 0b0001));\n  dxbc::Src index_src(dxbc::Src::R(reg, dxbc::Src::kXXXX));\n\n  // Check if the closing vertex of a non-indexed line loop is being processed.\n  a_.OpINE(\n      index_dest, dxbc::Src::V1D(kInRegisterVSVertexIndex, dxbc::Src::kXXXX),\n      LoadSystemConstant(SystemConstants::Index::kLineLoopClosingIndex,\n                         offsetof(SystemConstants, line_loop_closing_index),\n                         dxbc::Src::kXXXX));\n  // Zero the index if processing the closing vertex of a line loop, or do\n  // nothing (replace 0 with 0) if not needed.\n  a_.OpAnd(index_dest,\n           dxbc::Src::V1D(kInRegisterVSVertexIndex, dxbc::Src::kXXXX),\n           index_src);\n\n  {\n    // Swap the vertex index's endianness.\n    dxbc::Src endian_src(LoadSystemConstant(\n        SystemConstants::Index::kVertexIndexEndian,\n        offsetof(SystemConstants, vertex_index_endian), dxbc::Src::kXXXX));\n    dxbc::Dest swap_temp_dest(dxbc::Dest::R(reg, 0b0010));\n    dxbc::Src swap_temp_src(dxbc::Src::R(reg, dxbc::Src::kYYYY));\n\n    // 8-in-16 or one half of 8-in-32.\n    a_.OpSwitch(endian_src);\n    a_.OpCase(dxbc::Src::LU(uint32_t(xenos::Endian::k8in16)));\n    a_.OpCase(dxbc::Src::LU(uint32_t(xenos::Endian::k8in32)));\n    // Temp = X0Z0.\n    a_.OpAnd(swap_temp_dest, index_src, dxbc::Src::LU(0x00FF00FF));\n    // Index = YZW0.\n    a_.OpUShR(index_dest, index_src, dxbc::Src::LU(8));\n    // Index = Y0W0.\n    a_.OpAnd(index_dest, index_src, dxbc::Src::LU(0x00FF00FF));\n    // Index = YXWZ.\n    a_.OpUMAd(index_dest, swap_temp_src, dxbc::Src::LU(256), index_src);\n    a_.OpBreak();\n    a_.OpEndSwitch();\n\n    // 16-in-32 or another half of 8-in-32.\n    a_.OpSwitch(endian_src);\n    a_.OpCase(dxbc::Src::LU(uint32_t(xenos::Endian::k8in32)));\n    a_.OpCase(dxbc::Src::LU(uint32_t(xenos::Endian::k16in32)));\n    // Temp = ZW00.\n    a_.OpUShR(swap_temp_dest, index_src, dxbc::Src::LU(16));\n    // Index = ZWXY.\n    a_.OpBFI(index_dest, dxbc::Src::LU(16), dxbc::Src::LU(16), index_src,\n             swap_temp_src);\n    a_.OpBreak();\n    a_.OpEndSwitch();\n\n    if (!uses_register_dynamic_addressing) {\n      // Break register dependency.\n      a_.OpMov(swap_temp_dest, dxbc::Src::LF(0.0f));\n    }\n  }\n\n  // Remap the index to the needed range and convert it to floating-point.\n  RemapAndConvertVertexIndices(index_dest.index_1d_.index_,\n                               index_dest.write_mask_, index_src);\n\n  if (uses_register_dynamic_addressing) {\n    // Store to indexed GPR 0 in x0[0].\n    a_.OpMov(dxbc::Dest::X(0, 0, 0b0001), index_src);\n    PopSystemTemp();\n  }\n}\n\nvoid DxbcShaderTranslator::StartVertexOrDomainShader() {\n  bool uses_register_dynamic_addressing =\n      current_shader().uses_register_dynamic_addressing();\n\n  // Zero general-purpose registers to prevent crashes when the game\n  // references them after only initializing them conditionally.\n  for (uint32_t i = 0; i < register_count(); ++i) {\n    a_.OpMov(uses_register_dynamic_addressing ? dxbc::Dest::X(0, i)\n                                              : dxbc::Dest::R(i),\n             dxbc::Src::LF(0.0f));\n  }\n\n  // Zero the interpolators.\n  uint32_t interpolator_count =\n      xe::bit_count(GetModificationInterpolatorMask());\n  for (uint32_t i = 0; i < interpolator_count; ++i) {\n    a_.OpMov(dxbc::Dest::O(out_reg_vs_interpolators_ + i), dxbc::Src::LF(0.0f));\n  }\n\n  // Remember that x# are only accessible via mov load or store - use a\n  // temporary variable if need to do any computations!\n  Shader::HostVertexShaderType host_vertex_shader_type =\n      GetDxbcShaderModification().vertex.host_vertex_shader_type;\n  switch (host_vertex_shader_type) {\n    case Shader::HostVertexShaderType::kVertex:\n      StartVertexShader_LoadVertexIndex();\n      break;\n\n    case Shader::HostVertexShaderType::kTriangleDomainCPIndexed:\n      assert_true(register_count() >= 2);\n      if (register_count() >= 1) {\n        // Copy the domain location to r0.xyz.\n        // ZYX swizzle according to 415607E1 and 4D5307F2.\n        in_domain_location_used_ |= 0b0111;\n        a_.OpMov(uses_register_dynamic_addressing ? dxbc::Dest::X(0, 0, 0b0111)\n                                                  : dxbc::Dest::R(0, 0b0111),\n                 dxbc::Src::VDomain(0b000110));\n        if (register_count() >= 2) {\n          // Copy the control point indices (already swapped and converted to\n          // float by the host vertex and hull shaders) to r1.xyz.\n          dxbc::Dest control_point_index_dest(uses_register_dynamic_addressing\n                                                  ? dxbc::Dest::X(0, 1)\n                                                  : dxbc::Dest::R(1));\n          in_control_point_index_used_ = true;\n          for (uint32_t i = 0; i < 3; ++i) {\n            a_.OpMov(control_point_index_dest.Mask(1 << i),\n                     dxbc::Src::VICP(i, kInRegisterDSControlPointIndex,\n                                     dxbc::Src::kXXXX));\n          }\n        }\n      }\n      break;\n\n    case Shader::HostVertexShaderType::kTriangleDomainPatchIndexed:\n      assert_true(register_count() >= 2);\n      if (register_count() >= 1) {\n        // Copy the domain location to r0.xyz.\n        // ZYX swizzle with r1.y == 0, according to the water shader in\n        // 4D5307ED.\n        in_domain_location_used_ |= 0b0111;\n        a_.OpMov(uses_register_dynamic_addressing ? dxbc::Dest::X(0, 0, 0b0111)\n                                                  : dxbc::Dest::R(0, 0b0111),\n                 dxbc::Src::VDomain(0b000110));\n        if (register_count() >= 2) {\n          // Copy the patch index (already swapped and converted to float by the\n          // host vertex and hull shaders) to r1.x.\n          in_control_point_index_used_ = true;\n          a_.OpMov(uses_register_dynamic_addressing\n                       ? dxbc::Dest::X(0, 1, 0b0001)\n                       : dxbc::Dest::R(1, 0b0001),\n                   dxbc::Src::VICP(0, kInRegisterDSControlPointIndex,\n                                   dxbc::Src::kXXXX));\n          // Write the swizzle of the barycentric coordinates to r1.y. It\n          // appears that the tessellator offloads the reordering of coordinates\n          // for edges to game shaders.\n          //\n          // In 4D5307ED, the water shader multiplies the first control point's\n          // position by r0.z, the second CP's by r0.y, and the third CP's by\n          // r0.x. But before doing that it swizzles r0.xyz the following way\n          // depending on the value in r1.y:\n          // - ZXY for 1.0.\n          // - YZX for 2.0.\n          // - XZY for 4.0.\n          // - YXZ for 5.0.\n          // - ZYX for 6.0.\n          // Possibly, the logic here is that the value itself is the amount of\n          // rotation of the swizzle to the right, and 1 << 2 is set when the\n          // swizzle needs to be flipped before rotating.\n          //\n          // Direct3D 12 passes the coordinates in a consistent order, so can\n          // just use the identity swizzle.\n          a_.OpMov(uses_register_dynamic_addressing\n                       ? dxbc::Dest::X(0, 1, 0b0010)\n                       : dxbc::Dest::R(1, 0b0010),\n                   dxbc::Src::LF(0.0f));\n        }\n      }\n      break;\n\n    case Shader::HostVertexShaderType::kQuadDomainCPIndexed:\n      assert_true(register_count() >= 2);\n      if (register_count() >= 1) {\n        // Copy the domain location to r0.xy.\n        in_domain_location_used_ |= 0b0011;\n        a_.OpMov(uses_register_dynamic_addressing ? dxbc::Dest::X(0, 0, 0b0011)\n                                                  : dxbc::Dest::R(0, 0b0011),\n                 dxbc::Src::VDomain());\n        // Control point indices according the main menu of 58410823, with\n        // `cndeq r2, c255.xxxy, r1.xyzz, r0.zzzz` in the prologue of the\n        // shader, where c255.x is 0, and c255.y is 1.\n        // r0.z for (1 - r0.x) * (1 - r0.y)\n        // r1.x for r0.x * (1 - r0.y)\n        // r1.y for r0.x * r0.y\n        // r1.z for (1 - r0.x) * r0.y\n        in_control_point_index_used_ = true;\n        a_.OpMov(uses_register_dynamic_addressing ? dxbc::Dest::X(0, 0, 0b0100)\n                                                  : dxbc::Dest::R(0, 0b0100),\n                 dxbc::Src::VICP(0, kInRegisterDSControlPointIndex,\n                                 dxbc::Src::kXXXX));\n        if (register_count() >= 2) {\n          dxbc::Dest r1_dest(uses_register_dynamic_addressing\n                                 ? dxbc::Dest::X(0, 1)\n                                 : dxbc::Dest::R(1));\n          for (uint32_t i = 0; i < 3; ++i) {\n            a_.OpMov(r1_dest.Mask(1 << i),\n                     dxbc::Src::VICP(1 + i, kInRegisterDSControlPointIndex,\n                                     dxbc::Src::kXXXX));\n          }\n        }\n      }\n      break;\n\n    case Shader::HostVertexShaderType::kQuadDomainPatchIndexed:\n      assert_true(register_count() >= 2);\n      if (register_count() >= 1) {\n        // Copy the domain location to r0.yz.\n        // XY swizzle according to the ground shader in 4D5307F2.\n        in_domain_location_used_ |= 0b0011;\n        a_.OpMov(uses_register_dynamic_addressing ? dxbc::Dest::X(0, 0, 0b0110)\n                                                  : dxbc::Dest::R(0, 0b0110),\n                 dxbc::Src::VDomain(0b010000));\n        // Copy the patch index (already swapped and converted to float by the\n        // host vertex and hull shaders) to r0.x.\n        in_control_point_index_used_ = true;\n        a_.OpMov(uses_register_dynamic_addressing ? dxbc::Dest::X(0, 0, 0b0001)\n                                                  : dxbc::Dest::R(0, 0b0001),\n                 dxbc::Src::VICP(0, kInRegisterDSControlPointIndex,\n                                 dxbc::Src::kXXXX));\n        if (register_count() >= 2) {\n          // Write the swizzle of the UV coordinates to r1.x. It appears that\n          // the tessellator offloads the reordering of coordinates for edges to\n          // game shaders.\n          //\n          // In 4D5307F2, if we assume that r0.y is U and r0.z is V, the factors\n          // each control point value is multiplied by are the following:\n          // - (1-u)*(1-v), u*(1-v), (1-u)*v, u*v for 0.0 (identity swizzle).\n          // - u*(1-v), (1-u)*(1-v), u*v, (1-u)*v for 1.0 (YXWZ).\n          // - u*v, (1-u)*v, u*(1-v), (1-u)*(1-v) for 2.0 (WZYX).\n          // - (1-u)*v, u*v, (1-u)*(1-v), u*(1-v) for 3.0 (ZWXY).\n          //\n          // Direct3D 12 passes the coordinates in a consistent order, so can\n          // just use the identity swizzle.\n          a_.OpMov(uses_register_dynamic_addressing\n                       ? dxbc::Dest::X(0, 1, 0b0001)\n                       : dxbc::Dest::R(1, 0b0001),\n                   dxbc::Src::LF(0.0f));\n        }\n      }\n      break;\n\n    default:\n      // TODO(Triang3l): Support line and non-adaptive quad patches.\n      assert_unhandled_case(host_vertex_shader_type);\n      EmitTranslationError(\n          \"Unsupported host vertex shader type in StartVertexOrDomainShader\");\n      break;\n  }\n}\n\nvoid DxbcShaderTranslator::StartPixelShader() {\n  if (edram_rov_used_) {\n    // Load the EDRAM addresses and the coverage.\n    StartPixelShader_LoadROVParameters();\n\n    if (ROV_IsDepthStencilEarly()) {\n      // Do early 2x2 quad rejection if it's safe.\n      ROV_DepthStencilTest();\n    } else {\n      if (!current_shader().writes_depth()) {\n        // Get the derivatives of the screen-space (but not clamped to the\n        // viewport depth bounds yet - this happens after the pixel shader in\n        // Direct3D 11+; also linear within the triangle - thus constant\n        // derivatives along the triangle) Z for calculating per-sample depth\n        // values and the slope-scaled polygon offset to\n        // system_temp_depth_stencil_ before any return statement is possibly\n        // reached.\n        assert_true(system_temp_depth_stencil_ != UINT32_MAX);\n        dxbc::Src in_position_z(\n            dxbc::Src::V1D(in_reg_ps_position_, dxbc::Src::kZZZZ));\n        in_position_used_ |= 0b0100;\n        a_.OpDerivRTXCoarse(dxbc::Dest::R(system_temp_depth_stencil_, 0b0001),\n                            in_position_z);\n        a_.OpDerivRTYCoarse(dxbc::Dest::R(system_temp_depth_stencil_, 0b0010),\n                            in_position_z);\n      }\n    }\n  }\n\n  // If not translating anything, we only need the depth.\n  if (is_depth_only_pixel_shader_) {\n    return;\n  }\n\n  bool uses_register_dynamic_addressing =\n      current_shader().uses_register_dynamic_addressing();\n  Modification shader_modification = GetDxbcShaderModification();\n\n  // param_gen_interpolator is already 4 bits, no need for an interpolator count\n  // safety check.\n  uint32_t param_gen_interpolator =\n      (shader_modification.pixel.param_gen_enable &&\n       shader_modification.pixel.param_gen_interpolator < register_count())\n          ? shader_modification.pixel.param_gen_interpolator\n          : UINT32_MAX;\n\n  // Zero general-purpose registers to prevent crashes when the game\n  // references them after only initializing them conditionally, and copy\n  // interpolants to GPRs.\n  uint32_t interpolator_mask = GetModificationInterpolatorMask();\n  for (uint32_t i = 0; i < register_count(); ++i) {\n    if (i == param_gen_interpolator) {\n      continue;\n    }\n    a_.OpMov(uses_register_dynamic_addressing ? dxbc::Dest::X(0, i)\n                                              : dxbc::Dest::R(i),\n             (i < xenos::kMaxInterpolators &&\n              (interpolator_mask & (UINT32_C(1) << i)))\n                 ? dxbc::Src::V1D(in_reg_ps_interpolators_ +\n                                  xe::bit_count(interpolator_mask &\n                                                ((UINT32_C(1) << i) - 1)))\n                 : dxbc::Src::LF(0.0f));\n  }\n\n  // Write the pixel parameters to the specified interpolator register\n  // (PsParamGen). The negate modified in DXBC flips the sign bit, so it can be\n  // used to write the flags.\n  if (param_gen_interpolator != UINT32_MAX) {\n    uint32_t param_gen_temp = uses_register_dynamic_addressing\n                                  ? PushSystemTemp()\n                                  : param_gen_interpolator;\n    // X - pixel X .0 in the magnitude, is back-facing in the sign bit.\n    // Y - pixel Y .0 in the magnitude, is point in the sign bit.\n    // Pixel position.\n    // Get the XY address of the current host pixel as float (no matter whether\n    // the position is pixel-rate or sample-rate also due to float24 depth\n    // conversion requirements, it will be rounded the same). Rounding down, and\n    // taking the absolute value (because the sign bit of X stores the\n    // faceness), so in case the host GPU for some reason has quads used for\n    // derivative calculation at odd locations, the left and top edges will have\n    // correct derivative magnitude and LODs.\n    in_position_used_ |= 0b0011;\n    a_.OpRoundNI(dxbc::Dest::R(param_gen_temp, 0b0011),\n                 dxbc::Src::V1D(in_reg_ps_position_));\n    uint32_t resolution_scaled_axes =\n        uint32_t(draw_resolution_scale_x_ > 1) |\n        (uint32_t(draw_resolution_scale_y_ > 1) << 1);\n    if (resolution_scaled_axes) {\n      // Revert resolution scale - after truncating, so if the pixel position\n      // is passed to tfetch (assuming the game doesn't round it by itself),\n      // it will be sampled with higher resolution too.\n      a_.OpMul(dxbc::Dest::R(param_gen_temp, resolution_scaled_axes),\n               dxbc::Src::R(param_gen_temp),\n               dxbc::Src::LF(1.0f / draw_resolution_scale_x_,\n                             1.0f / draw_resolution_scale_y_, 1.0f, 1.0f));\n    }\n    if (shader_modification.pixel.param_gen_point) {\n      // A point - always front-facing (the upper bit of X is 0), not a line\n      // (the upper bit of Z is 0).\n      // Take the absolute value of the position and apply the point flag.\n      a_.OpMov(dxbc::Dest::R(param_gen_temp, 0b0001),\n               dxbc::Src::R(param_gen_temp, dxbc::Src::kXXXX).Abs());\n      a_.OpMov(dxbc::Dest::R(param_gen_temp, 0b0010),\n               -(dxbc::Src::R(param_gen_temp, dxbc::Src::kYYYY).Abs()));\n      // ZW - point sprite coordinates.\n      // Saturate to avoid negative point coordinates if the center of the pixel\n      // is not covered, and extrapolation is done.\n      assert_true(in_reg_ps_point_coordinates_ != UINT32_MAX);\n      a_.OpMov(dxbc::Dest::R(param_gen_temp, 0b1100),\n               dxbc::Src::V1D(in_reg_ps_point_coordinates_, 0b0100 << 4), true);\n    } else {\n      // Take the absolute value of the position and apply the point flag.\n      a_.OpMov(dxbc::Dest::R(param_gen_temp, 0b0011),\n               dxbc::Src::R(param_gen_temp).Abs());\n      // Faceness.\n      // Check if faceness applies to the current primitive type.\n      // Using Z as a temporary (not written yet).\n      a_.OpAnd(dxbc::Dest::R(param_gen_temp, 0b0100), LoadFlagsSystemConstant(),\n               dxbc::Src::LU(kSysFlag_PrimitivePolygonal));\n      a_.OpIf(true, dxbc::Src::R(param_gen_temp, dxbc::Src::kZZZZ));\n      {\n        // Negate modifier flips the sign bit even for 0 - set it to minus for\n        // backfaces.\n        in_front_face_used_ = true;\n        a_.OpMovC(dxbc::Dest::R(param_gen_temp, 0b0001),\n                  dxbc::Src::V1D(in_reg_ps_front_face_sample_index_,\n                                 dxbc::Src::kXXXX),\n                  dxbc::Src::R(param_gen_temp, dxbc::Src::kXXXX),\n                  -dxbc::Src::R(param_gen_temp, dxbc::Src::kXXXX));\n      }\n      a_.OpEndIf();\n      // No point coordinates.\n      // Z - is line in the sign bit.\n      // W - nothing.\n      a_.OpUBFE(dxbc::Dest::R(param_gen_temp, 0b0100), dxbc::Src::LU(1),\n                dxbc::Src::LU(kSysFlag_PrimitiveLine_Shift),\n                LoadFlagsSystemConstant());\n      a_.OpIShL(dxbc::Dest::R(param_gen_temp, 0b0100),\n                dxbc::Src::R(param_gen_temp, dxbc::Src::kZZZZ),\n                dxbc::Src::LU(31));\n      a_.OpMov(dxbc::Dest::R(param_gen_temp, 0b1000), dxbc::Src::LF(0.0f));\n    }\n    // With dynamic register addressing, write the PsParamGen to the GPR.\n    if (uses_register_dynamic_addressing) {\n      a_.OpMov(dxbc::Dest::X(0, param_gen_interpolator),\n               dxbc::Src::R(param_gen_temp));\n      // Release param_gen_temp.\n      PopSystemTemp();\n    }\n  }\n\n  if (current_shader().memexport_eM_written()) {\n    // Make sure memexport is done only once for a guest pixel.\n    dxbc::Dest memexport_enabled_dest(\n        dxbc::Dest::R(system_temp_memexport_enabled_and_eM_written_, 0b0001));\n    dxbc::Src memexport_enabled_src(dxbc::Src::R(\n        system_temp_memexport_enabled_and_eM_written_, dxbc::Src::kXXXX));\n    uint32_t resolution_scaled_axes =\n        uint32_t(draw_resolution_scale_x_ > 1) |\n        (uint32_t(draw_resolution_scale_y_ > 1) << 1);\n    if (resolution_scaled_axes) {\n      uint32_t memexport_condition_temp = PushSystemTemp();\n      // Only do memexport for one host pixel in a guest pixel - prefer the\n      // host pixel closer to the center of the guest pixel, but one that's\n      // covered with the half-pixel offset according to the top-left rule (1\n      // for 2x because 0 isn't covered with the half-pixel offset, 1 for 3x\n      // because it's the center and is covered with the half-pixel offset too).\n      in_position_used_ |= resolution_scaled_axes;\n      a_.OpFToU(dxbc::Dest::R(memexport_condition_temp, resolution_scaled_axes),\n                dxbc::Src::V1D(in_reg_ps_position_));\n      a_.OpUDiv(dxbc::Dest::Null(),\n                dxbc::Dest::R(memexport_condition_temp, resolution_scaled_axes),\n                dxbc::Src::R(memexport_condition_temp),\n                dxbc::Src::LU(draw_resolution_scale_x_,\n                              draw_resolution_scale_y_, 0, 0));\n      a_.OpIEq(dxbc::Dest::R(memexport_condition_temp, resolution_scaled_axes),\n               dxbc::Src::R(memexport_condition_temp),\n               dxbc::Src::LU(draw_resolution_scale_x_ >> 1,\n                             draw_resolution_scale_y_ >> 1, 0, 0));\n      for (uint32_t i = 0; i < 2; ++i) {\n        if (!(resolution_scaled_axes & (1 << i))) {\n          continue;\n        }\n        a_.OpAnd(memexport_enabled_dest, memexport_enabled_src,\n                 dxbc::Src::R(memexport_condition_temp).Select(i));\n      }\n      // Release memexport_condition_temp.\n      PopSystemTemp();\n    }\n    // With sample-rate shading (with float24 conversion), only do memexport\n    // from one sample (as the shader is invoked multiple times for a pixel),\n    // if SV_SampleIndex == firstbit_lo(SV_Coverage). For zero coverage,\n    // firstbit_lo returns 0xFFFFFFFF.\n    if (IsSampleRate()) {\n      uint32_t memexport_condition_temp = PushSystemTemp();\n      a_.OpFirstBitLo(dxbc::Dest::R(memexport_condition_temp, 0b0001),\n                      dxbc::Src::VCoverage());\n      a_.OpIEq(\n          dxbc::Dest::R(memexport_condition_temp, 0b0001),\n          dxbc::Src::V1D(in_reg_ps_front_face_sample_index_, dxbc::Src::kYYYY),\n          dxbc::Src::R(memexport_condition_temp, dxbc::Src::kXXXX));\n      a_.OpAnd(memexport_enabled_dest, memexport_enabled_src,\n               dxbc::Src::R(memexport_condition_temp, dxbc::Src::kXXXX));\n      // Release memexport_condition_temp.\n      PopSystemTemp();\n    }\n  }\n}\n\nvoid DxbcShaderTranslator::StartTranslation() {\n  // Set up the input and output registers.\n  Modification shader_modification = GetDxbcShaderModification();\n  uint32_t interpolator_register_mask = GetModificationInterpolatorMask();\n  uint32_t interpolator_register_count =\n      xe::bit_count(interpolator_register_mask);\n  if (is_vertex_shader()) {\n    uint32_t out_reg_index = 0;\n    // Interpolators.\n    if (interpolator_register_count) {\n      out_reg_vs_interpolators_ = out_reg_index;\n      out_reg_index += interpolator_register_count;\n    }\n    // Position.\n    out_reg_vs_position_ = out_reg_index;\n    ++out_reg_index;\n    // Clip and cull distances.\n    uint32_t clip_and_cull_distance_count =\n        shader_modification.GetVertexClipDistanceCount() +\n        shader_modification.GetVertexCullDistanceCount();\n    if (clip_and_cull_distance_count) {\n      out_reg_vs_clip_cull_distances_ = out_reg_index;\n      out_reg_index += (clip_and_cull_distance_count + 3) >> 2;\n    }\n    // Point size.\n    if (shader_modification.vertex.output_point_size) {\n      out_reg_vs_point_size_ = out_reg_index;\n      ++out_reg_index;\n    }\n  } else if (is_pixel_shader()) {\n    uint32_t in_reg_index = 0;\n    // Interpolators.\n    if (interpolator_register_count) {\n      in_reg_ps_interpolators_ = in_reg_index;\n      in_reg_index += interpolator_register_count;\n    }\n    // Point coordinates.\n    if (shader_modification.pixel.param_gen_point) {\n      in_reg_ps_point_coordinates_ = in_reg_index;\n      ++in_reg_index;\n    }\n    // Position.\n    in_reg_ps_position_ = in_reg_index;\n    ++in_reg_index;\n    // System inputs.\n    in_reg_ps_front_face_sample_index_ = in_reg_index;\n    ++in_reg_index;\n  }\n\n  // Allocate global system temporary registers that may also be used in the\n  // epilogue.\n  if (is_vertex_shader()) {\n    system_temp_position_ = PushSystemTemp(0b1111);\n    system_temp_point_size_edge_flag_kill_vertex_ = PushSystemTemp(0b0100);\n    // Set the point size to a negative value to tell the geometry shader that\n    // it should use the default point size if the vertex shader does not\n    // override it.\n    a_.OpMov(\n        dxbc::Dest::R(system_temp_point_size_edge_flag_kill_vertex_, 0b0001),\n        dxbc::Src::LF(-1.0f));\n  } else if (is_pixel_shader()) {\n    if (edram_rov_used_) {\n      // Will be initialized unconditionally.\n      system_temp_rov_params_ = PushSystemTemp();\n    }\n    if (IsDepthStencilSystemTempUsed()) {\n      uint32_t depth_stencil_temp_zero_mask;\n      if (current_shader().writes_depth()) {\n        // X holds the guest oDepth - make sure it's always initialized because\n        // assumptions can't be made about the integrity of the guest code.\n        depth_stencil_temp_zero_mask = 0b0001;\n      } else {\n        assert_true(edram_rov_used_);\n        if (ROV_IsDepthStencilEarly()) {\n          // XYZW hold per-sample depth / stencil after the early test - written\n          // conditionally based on the coverage, ensure registers are\n          // initialized unconditionally for safety.\n          depth_stencil_temp_zero_mask = 0b1111;\n        } else {\n          // XY hold Z gradients, written unconditionally in the beginning.\n          depth_stencil_temp_zero_mask = 0b0000;\n        }\n      }\n      system_temp_depth_stencil_ = PushSystemTemp(depth_stencil_temp_zero_mask);\n    }\n    uint32_t shader_writes_color_targets =\n        current_shader().writes_color_targets();\n    for (uint32_t i = 0; i < 4; ++i) {\n      if (shader_writes_color_targets & (1 << i)) {\n        system_temps_color_[i] = PushSystemTemp(0b1111);\n      }\n    }\n  }\n\n  // Allocate temporary registers for memexport.\n  uint8_t memexport_eM_written = current_shader().memexport_eM_written();\n  if (memexport_eM_written) {\n    system_temp_memexport_enabled_and_eM_written_ = PushSystemTemp(0b0010);\n    // Initialize the memexport conditional to whether the shared memory is\n    // currently bound as UAV (to 0 or UINT32_MAX). It can be made narrower\n    // later.\n    a_.OpIBFE(\n        dxbc::Dest::R(system_temp_memexport_enabled_and_eM_written_, 0b0001),\n        dxbc::Src::LU(1), dxbc::Src::LU(kSysFlag_SharedMemoryIsUAV_Shift),\n        LoadFlagsSystemConstant());\n    system_temp_memexport_address_ = PushSystemTemp(0b1111);\n    uint8_t memexport_eM_remaining = memexport_eM_written;\n    uint32_t memexport_eM_index;\n    while (xe::bit_scan_forward(memexport_eM_remaining, &memexport_eM_index)) {\n      memexport_eM_remaining &= ~(uint8_t(1) << memexport_eM_index);\n      system_temps_memexport_data_[memexport_eM_index] = PushSystemTemp(0b1111);\n    }\n  }\n\n  if (!is_depth_only_pixel_shader_) {\n    // Allocate system temporary variables for the translated code. Since access\n    // depends on the guest code (thus no guarantees), initialize everything\n    // now (except for pv, it's an internal temporary variable, not accessible\n    // by the guest).\n    system_temp_result_ = PushSystemTemp();\n    system_temp_ps_pc_p0_a0_ = PushSystemTemp(0b1111);\n    system_temp_aL_ = PushSystemTemp(0b1111);\n    system_temp_loop_count_ = PushSystemTemp(0b1111);\n    system_temp_grad_h_lod_ = PushSystemTemp(0b1111);\n    system_temp_grad_v_vfetch_address_ = PushSystemTemp(0b1111);\n  }\n\n  // Write stage-specific prologue.\n  if (is_vertex_shader()) {\n    StartVertexOrDomainShader();\n  } else if (is_pixel_shader()) {\n    StartPixelShader();\n  }\n\n  // If not translating anything, don't start the main loop.\n  if (is_depth_only_pixel_shader_) {\n    return;\n  }\n\n  // Start the main loop (for jumping to labels by setting pc and continuing).\n  a_.OpLoop();\n  // Switch and the first label (pc == 0).\n  if (UseSwitchForControlFlow()) {\n    a_.OpSwitch(dxbc::Src::R(system_temp_ps_pc_p0_a0_, dxbc::Src::kYYYY));\n    a_.OpCase(dxbc::Src::LU(0));\n  } else {\n    a_.OpIf(false, dxbc::Src::R(system_temp_ps_pc_p0_a0_, dxbc::Src::kYYYY));\n  }\n}\n\nvoid DxbcShaderTranslator::CompleteVertexOrDomainShader() {\n  uint32_t temp = PushSystemTemp();\n  dxbc::Dest temp_x_dest(dxbc::Dest::R(temp, 0b0001));\n  dxbc::Src temp_x_src(dxbc::Src::R(temp, dxbc::Src::kXXXX));\n\n  dxbc::Src flags_src(LoadFlagsSystemConstant());\n\n  // Check if the shader already returns W, not 1/W, and if it doesn't, turn 1/W\n  // into W. Using div rather than relaxed-precision rcp for safety.\n  a_.OpAnd(temp_x_dest, flags_src, dxbc::Src::LU(kSysFlag_WNotReciprocal));\n  a_.OpIf(false, temp_x_src);\n  a_.OpDiv(dxbc::Dest::R(system_temp_position_, 0b1000), dxbc::Src::LF(1.0f),\n           dxbc::Src::R(system_temp_position_, dxbc::Src::kWWWW));\n  a_.OpEndIf();\n\n  // Check if the shader returns XY/W rather than XY, and if it does, revert\n  // that.\n  a_.OpAnd(temp_x_dest, flags_src, dxbc::Src::LU(kSysFlag_XYDividedByW));\n  a_.OpIf(true, temp_x_src);\n  a_.OpMul(dxbc::Dest::R(system_temp_position_, 0b0011),\n           dxbc::Src::R(system_temp_position_),\n           dxbc::Src::R(system_temp_position_, dxbc::Src::kWWWW));\n  a_.OpEndIf();\n\n  // Check if the shader returns Z/W rather than Z, and if it does, revert that.\n  a_.OpAnd(temp_x_dest, flags_src, dxbc::Src::LU(kSysFlag_ZDividedByW));\n  a_.OpIf(true, temp_x_src);\n  a_.OpMul(dxbc::Dest::R(system_temp_position_, 0b0100),\n           dxbc::Src::R(system_temp_position_, dxbc::Src::kZZZZ),\n           dxbc::Src::R(system_temp_position_, dxbc::Src::kWWWW));\n  a_.OpEndIf();\n\n  Modification shader_modification = GetDxbcShaderModification();\n  uint32_t clip_distance_next_component = 0;\n  uint32_t cull_distance_next_component =\n      shader_modification.GetVertexClipDistanceCount();\n\n  // Clip against user clip planes.\n  uint32_t& ucp_clip_cull_distance_next_component_ref =\n      shader_modification.vertex.user_clip_plane_cull\n          ? cull_distance_next_component\n          : clip_distance_next_component;\n  for (uint32_t i = 0; i < shader_modification.vertex.user_clip_plane_count;\n       ++i) {\n    a_.OpDP4(\n        dxbc::Dest::O(out_reg_vs_clip_cull_distances_ +\n                          (ucp_clip_cull_distance_next_component_ref >> 2),\n                      UINT32_C(1)\n                          << (ucp_clip_cull_distance_next_component_ref & 3)),\n        dxbc::Src::R(system_temp_position_),\n        LoadSystemConstant(\n            SystemConstants::Index::kUserClipPlanes,\n            offsetof(SystemConstants, user_clip_planes) + sizeof(float) * 4 * i,\n            dxbc::Src::kXYZW));\n    ++ucp_clip_cull_distance_next_component_ref;\n  }\n\n  // Apply scale for guest to host viewport and clip space conversion. Also, if\n  // the vertex shader is multipass, the NDC scale constant can be used to set\n  // position to NaN to kill all primitives.\n  a_.OpMul(dxbc::Dest::R(system_temp_position_, 0b0111),\n           dxbc::Src::R(system_temp_position_),\n           LoadSystemConstant(SystemConstants::Index::kNDCScale,\n                              offsetof(SystemConstants, ndc_scale), 0b100100));\n\n  // Apply offset (multiplied by W) used for the same purposes.\n  a_.OpMAd(dxbc::Dest::R(system_temp_position_, 0b0111),\n           LoadSystemConstant(SystemConstants::Index::kNDCOffset,\n                              offsetof(SystemConstants, ndc_offset), 0b100100),\n           dxbc::Src::R(system_temp_position_, dxbc::Src::kWWWW),\n           dxbc::Src::R(system_temp_position_));\n\n  // Kill the primitive if needed - check if the shader wants to kill (bits\n  // 0:30 of the vertex kill register are not zero - using `and`, not abs or\n  // especially 0.0f comparison, to avoid potential denormal flushing).\n  bool shader_writes_vertex_kill =\n      (current_shader().writes_point_size_edge_flag_kill_vertex() & 0b100) != 0;\n  if (shader_writes_vertex_kill) {\n    a_.OpAnd(temp_x_dest,\n             dxbc::Src::R(system_temp_point_size_edge_flag_kill_vertex_,\n                          dxbc::Src::kZZZZ),\n             dxbc::Src::LU(UINT32_C(0x7FFFFFFF)));\n  }\n  if (shader_modification.vertex.vertex_kill_and) {\n    // AND operator - write an SV_CullDistance.\n    dxbc::Dest vertex_kill_dest(dxbc::Dest::O(\n        out_reg_vs_clip_cull_distances_ + (cull_distance_next_component >> 2),\n        UINT32_C(1) << (cull_distance_next_component & 3)));\n    if (shader_writes_vertex_kill) {\n      a_.OpMovC(vertex_kill_dest, temp_x_src, dxbc::Src::LF(-1.0f),\n                dxbc::Src::LF(0.0f));\n    } else {\n      a_.OpMov(vertex_kill_dest, dxbc::Src::LF(0.0f));\n    }\n    ++cull_distance_next_component;\n  } else {\n    // OR operator - set the position to NaN.\n    if (shader_writes_vertex_kill) {\n      a_.OpMovC(dxbc::Dest::R(system_temp_position_, 0b1000), temp_x_src,\n                dxbc::Src::LF(std::nanf(\"\")),\n                dxbc::Src::R(system_temp_position_, dxbc::Src::kWWWW));\n    }\n  }\n\n  // Write the position to the output.\n  a_.OpMov(dxbc::Dest::O(out_reg_vs_position_),\n           dxbc::Src::R(system_temp_position_));\n\n  // Write the point size.\n  if (out_reg_vs_point_size_ != UINT32_MAX) {\n    a_.OpMov(dxbc::Dest::O(out_reg_vs_point_size_, 0b0001),\n             dxbc::Src::R(system_temp_point_size_edge_flag_kill_vertex_,\n                          dxbc::Src::kXXXX));\n  }\n\n  // Release temp.\n  PopSystemTemp();\n}\n\nvoid DxbcShaderTranslator::CompleteShaderCode() {\n  if (!is_depth_only_pixel_shader_) {\n    // Close the last exec, there's nothing to merge it with anymore, and we're\n    // closing upper-level flow control blocks.\n    CloseExecConditionals();\n    // Close the last label and the switch.\n    if (UseSwitchForControlFlow()) {\n      a_.OpBreak();\n      a_.OpEndSwitch();\n    } else {\n      a_.OpEndIf();\n    }\n    // End the main loop.\n    a_.OpBreak();\n    a_.OpEndLoop();\n\n    // Release the following system temporary values so epilogue can reuse them:\n    // - system_temp_result_.\n    // - system_temp_ps_pc_p0_a0_.\n    // - system_temp_aL_.\n    // - system_temp_loop_count_.\n    // - system_temp_grad_h_lod_.\n    // - system_temp_grad_v_vfetch_address_.\n    PopSystemTemp(6);\n  }\n\n  uint8_t memexport_eM_written = current_shader().memexport_eM_written();\n  if (memexport_eM_written) {\n    // Write data for the last memexport.\n    ExportToMemory(\n        current_shader().memexport_eM_potentially_written_before_end());\n\n    // Release memexport temporary registers:\n    // - system_temp_memexport_enabled_and_eM_written_.\n    // - system_temp_memexport_address_.\n    // - system_temps_memexport_data_.\n    PopSystemTemp(xe::bit_count(uint32_t(memexport_eM_written)) + 2);\n  }\n\n  // Write stage-specific epilogue.\n  if (is_vertex_shader()) {\n    CompleteVertexOrDomainShader();\n  } else if (is_pixel_shader()) {\n    CompletePixelShader();\n  }\n\n  // Return from `main`.\n  a_.OpRet();\n\n  if (is_vertex_shader()) {\n    // Release system_temp_position_ and\n    // system_temp_point_size_edge_flag_kill_vertex_.\n    PopSystemTemp(2);\n  } else if (is_pixel_shader()) {\n    // Release system_temps_color_.\n    uint32_t shader_writes_color_targets =\n        current_shader().writes_color_targets();\n    for (int32_t i = 3; i >= 0; --i) {\n      if (shader_writes_color_targets & (1 << i)) {\n        PopSystemTemp();\n      }\n    }\n    if (IsDepthStencilSystemTempUsed()) {\n      // Release system_temp_depth_stencil_.\n      PopSystemTemp();\n    }\n    if (edram_rov_used_) {\n      // Release system_temp_rov_params_.\n      PopSystemTemp();\n    }\n  }\n}\n\nstd::vector<uint8_t> DxbcShaderTranslator::CompleteTranslation() {\n  // Because of shader_object_.resize(), pointers can't be kept persistently\n  // here! Resizing also zeroes the memory.\n\n  // Write the code epilogue.\n  CompleteShaderCode();\n\n  shader_object_.clear();\n\n  // 6 or 7 blobs - RDEF, ISGN, optionally PCSG, OSGN, SHEX, SFI0, STAT.\n  // Whether SFI0 is needed at this point is not known, always writing it.\n  uint32_t blob_count = 6 + uint32_t(IsDxbcDomainShader());\n  // Allocate space for the header and the blob offsets.\n  shader_object_.resize(sizeof(dxbc::ContainerHeader) / sizeof(uint32_t) +\n                        blob_count);\n\n  uint32_t blob_offset_position_dwords =\n      sizeof(dxbc::ContainerHeader) / sizeof(uint32_t);\n  uint32_t blob_position_dwords = uint32_t(shader_object_.size());\n  constexpr uint32_t kBlobHeaderSizeDwords =\n      sizeof(dxbc::BlobHeader) / sizeof(uint32_t);\n\n  // Resource definition.\n  shader_object_[blob_offset_position_dwords] =\n      uint32_t(blob_position_dwords * sizeof(uint32_t));\n  shader_object_.resize(blob_position_dwords + kBlobHeaderSizeDwords);\n  WriteResourceDefinition();\n  {\n    auto& blob_header = *reinterpret_cast<dxbc::BlobHeader*>(\n        shader_object_.data() + blob_position_dwords);\n    blob_header.fourcc = dxbc::BlobHeader::FourCC::kResourceDefinition;\n    blob_position_dwords = uint32_t(shader_object_.size());\n    blob_header.size_bytes =\n        (blob_position_dwords - kBlobHeaderSizeDwords) * sizeof(uint32_t) -\n        shader_object_[blob_offset_position_dwords++];\n  }\n\n  // Input signature.\n  shader_object_[blob_offset_position_dwords] =\n      uint32_t(blob_position_dwords * sizeof(uint32_t));\n  shader_object_.resize(blob_position_dwords + kBlobHeaderSizeDwords);\n  WriteInputSignature();\n  {\n    auto& blob_header = *reinterpret_cast<dxbc::BlobHeader*>(\n        shader_object_.data() + blob_position_dwords);\n    blob_header.fourcc = dxbc::BlobHeader::FourCC::kInputSignature;\n    blob_position_dwords = uint32_t(shader_object_.size());\n    blob_header.size_bytes =\n        (blob_position_dwords - kBlobHeaderSizeDwords) * sizeof(uint32_t) -\n        shader_object_[blob_offset_position_dwords++];\n  }\n\n  // Patch constant signature.\n  if (IsDxbcDomainShader()) {\n    shader_object_[blob_offset_position_dwords] =\n        uint32_t(blob_position_dwords * sizeof(uint32_t));\n    shader_object_.resize(blob_position_dwords + kBlobHeaderSizeDwords);\n    WritePatchConstantSignature();\n    {\n      auto& blob_header = *reinterpret_cast<dxbc::BlobHeader*>(\n          shader_object_.data() + blob_position_dwords);\n      blob_header.fourcc = dxbc::BlobHeader::FourCC::kPatchConstantSignature;\n      blob_position_dwords = uint32_t(shader_object_.size());\n      blob_header.size_bytes =\n          (blob_position_dwords - kBlobHeaderSizeDwords) * sizeof(uint32_t) -\n          shader_object_[blob_offset_position_dwords++];\n    }\n  }\n\n  // Output signature.\n  shader_object_[blob_offset_position_dwords] =\n      uint32_t(blob_position_dwords * sizeof(uint32_t));\n  shader_object_.resize(blob_position_dwords + kBlobHeaderSizeDwords);\n  WriteOutputSignature();\n  {\n    auto& blob_header = *reinterpret_cast<dxbc::BlobHeader*>(\n        shader_object_.data() + blob_position_dwords);\n    blob_header.fourcc = dxbc::BlobHeader::FourCC::kOutputSignature;\n    blob_position_dwords = uint32_t(shader_object_.size());\n    blob_header.size_bytes =\n        (blob_position_dwords - kBlobHeaderSizeDwords) * sizeof(uint32_t) -\n        shader_object_[blob_offset_position_dwords++];\n  }\n\n  // Shader program.\n  shader_object_[blob_offset_position_dwords] =\n      uint32_t(blob_position_dwords * sizeof(uint32_t));\n  shader_object_.resize(blob_position_dwords + kBlobHeaderSizeDwords);\n  WriteShaderCode();\n  {\n    auto& blob_header = *reinterpret_cast<dxbc::BlobHeader*>(\n        shader_object_.data() + blob_position_dwords);\n    blob_header.fourcc = dxbc::BlobHeader::FourCC::kShaderEx;\n    blob_position_dwords = uint32_t(shader_object_.size());\n    blob_header.size_bytes =\n        (blob_position_dwords - kBlobHeaderSizeDwords) * sizeof(uint32_t) -\n        shader_object_[blob_offset_position_dwords++];\n  }\n\n  // Shader feature info.\n  shader_object_[blob_offset_position_dwords] =\n      uint32_t(blob_position_dwords * sizeof(uint32_t));\n  shader_object_.resize(blob_position_dwords + kBlobHeaderSizeDwords +\n                        sizeof(dxbc::ShaderFeatureInfo) / sizeof(uint32_t));\n  std::memcpy(\n      shader_object_.data() + blob_position_dwords + kBlobHeaderSizeDwords,\n      &shader_feature_info_, sizeof(shader_feature_info_));\n  {\n    auto& blob_header = *reinterpret_cast<dxbc::BlobHeader*>(\n        shader_object_.data() + blob_position_dwords);\n    blob_header.fourcc = dxbc::BlobHeader::FourCC::kShaderFeatureInfo;\n    blob_position_dwords = uint32_t(shader_object_.size());\n    blob_header.size_bytes =\n        (blob_position_dwords - kBlobHeaderSizeDwords) * sizeof(uint32_t) -\n        shader_object_[blob_offset_position_dwords++];\n  }\n\n  // Statistics.\n  shader_object_[blob_offset_position_dwords] =\n      uint32_t(blob_position_dwords * sizeof(uint32_t));\n  shader_object_.resize(blob_position_dwords + kBlobHeaderSizeDwords +\n                        sizeof(dxbc::Statistics) / sizeof(uint32_t));\n  std::memcpy(\n      shader_object_.data() + blob_position_dwords + kBlobHeaderSizeDwords,\n      &statistics_, sizeof(statistics_));\n  {\n    auto& blob_header = *reinterpret_cast<dxbc::BlobHeader*>(\n        shader_object_.data() + blob_position_dwords);\n    blob_header.fourcc = dxbc::BlobHeader::FourCC::kStatistics;\n    blob_position_dwords = uint32_t(shader_object_.size());\n    blob_header.size_bytes =\n        (blob_position_dwords - kBlobHeaderSizeDwords) * sizeof(uint32_t) -\n        shader_object_[blob_offset_position_dwords++];\n  }\n\n  // Header.\n  uint32_t shader_object_size_bytes =\n      uint32_t(shader_object_.size() * sizeof(uint32_t));\n  {\n    auto& container_header =\n        *reinterpret_cast<dxbc::ContainerHeader*>(shader_object_.data());\n    container_header.InitializeIdentification();\n    container_header.size_bytes = shader_object_size_bytes;\n    container_header.blob_count = blob_count;\n    CalculateDXBCChecksum(\n        reinterpret_cast<unsigned char*>(shader_object_.data()),\n        static_cast<unsigned int>(shader_object_size_bytes),\n        reinterpret_cast<unsigned int*>(&container_header.hash));\n  }\n\n  // TODO(Triang3l): Avoid copy?\n  std::vector<uint8_t> shader_object_bytes;\n  shader_object_bytes.resize(shader_object_size_bytes);\n  std::memcpy(shader_object_bytes.data(), shader_object_.data(),\n              shader_object_size_bytes);\n  return shader_object_bytes;\n}\n\nvoid DxbcShaderTranslator::PostTranslation() {\n  Shader::Translation& translation = current_translation();\n  if (!translation.is_valid()) {\n    return;\n  }\n  DxbcShader* dxbc_shader = dynamic_cast<DxbcShader*>(&translation.shader());\n  if (dxbc_shader && !dxbc_shader->bindings_setup_entered_.test_and_set(\n                         std::memory_order_relaxed)) {\n    dxbc_shader->texture_bindings_.clear();\n    dxbc_shader->texture_bindings_.reserve(texture_bindings_.size());\n    dxbc_shader->used_texture_mask_ = 0;\n    for (const TextureBinding& translator_binding : texture_bindings_) {\n      DxbcShader::TextureBinding& shader_binding =\n          dxbc_shader->texture_bindings_.emplace_back();\n      // For a stable hash.\n      std::memset(&shader_binding, 0, sizeof(shader_binding));\n      shader_binding.bindless_descriptor_index =\n          translator_binding.bindless_descriptor_index;\n      shader_binding.fetch_constant = translator_binding.fetch_constant;\n      shader_binding.dimension = translator_binding.dimension;\n      shader_binding.is_signed = translator_binding.is_signed;\n      dxbc_shader->used_texture_mask_ |= 1u\n                                         << translator_binding.fetch_constant;\n    }\n    dxbc_shader->sampler_bindings_.clear();\n    dxbc_shader->sampler_bindings_.reserve(sampler_bindings_.size());\n    for (const SamplerBinding& translator_binding : sampler_bindings_) {\n      DxbcShader::SamplerBinding& shader_binding =\n          dxbc_shader->sampler_bindings_.emplace_back();\n      shader_binding.bindless_descriptor_index =\n          translator_binding.bindless_descriptor_index;\n      shader_binding.fetch_constant = translator_binding.fetch_constant;\n      shader_binding.mag_filter = translator_binding.mag_filter;\n      shader_binding.min_filter = translator_binding.min_filter;\n      shader_binding.mip_filter = translator_binding.mip_filter;\n      shader_binding.aniso_filter = translator_binding.aniso_filter;\n    }\n  }\n}\n\nvoid DxbcShaderTranslator::EmitInstructionDisassembly() {\n  if (!emit_source_map_) {\n    return;\n  }\n  const char* source = instruction_disassembly_buffer_.buffer();\n  uint32_t length = uint32_t(instruction_disassembly_buffer_.length());\n  // Trim leading spaces and trailing new line.\n  while (length != 0 && source[0] == ' ') {\n    ++source;\n    --length;\n  }\n  while (length != 0 && source[length - 1] == '\\n') {\n    --length;\n  }\n  if (length == 0) {\n    return;\n  }\n  char* dest = reinterpret_cast<char*>(\n      a_.OpCustomData(dxbc::CustomDataClass::kComment, length + 1));\n  std::memcpy(dest, source, length);\n  dest[length] = '\\0';\n}\n\ndxbc::Src DxbcShaderTranslator::LoadOperand(const InstructionOperand& operand,\n                                            uint32_t needed_components,\n                                            bool& temp_pushed_out) {\n  temp_pushed_out = false;\n\n  uint32_t first_needed_component;\n  if (!xe::bit_scan_forward(needed_components, &first_needed_component)) {\n    return dxbc::Src::LF(0.0f);\n  }\n\n  dxbc::Index index(operand.storage_index);\n  switch (operand.storage_addressing_mode) {\n    case InstructionStorageAddressingMode::kAbsolute:\n      break;\n    case InstructionStorageAddressingMode::kAddressRegisterRelative:\n      index = dxbc::Index(system_temp_ps_pc_p0_a0_, 3, operand.storage_index);\n      break;\n    case InstructionStorageAddressingMode::kLoopRelative:\n      index = dxbc::Index(system_temp_aL_, 0, operand.storage_index);\n      break;\n  }\n\n  dxbc::Src src(dxbc::Src::LF(0.0f));\n  switch (operand.storage_source) {\n    case InstructionStorageSource::kRegister: {\n      if (current_shader().uses_register_dynamic_addressing()) {\n        // Load x#[#] to r# because x#[#] can be used only with mov.\n        uint32_t temp = PushSystemTemp();\n        temp_pushed_out = true;\n        uint32_t used_swizzle_components = 0;\n        for (uint32_t i = 0; i < uint32_t(operand.component_count); ++i) {\n          if (!(needed_components & (1 << i))) {\n            continue;\n          }\n          SwizzleSource component = operand.GetComponent(i);\n          assert_true(component >= SwizzleSource::kX &&\n                      component <= SwizzleSource::kW);\n          used_swizzle_components |=\n              1 << (uint32_t(component) - uint32_t(SwizzleSource::kX));\n        }\n        assert_not_zero(used_swizzle_components);\n        a_.OpMov(dxbc::Dest::R(temp, used_swizzle_components),\n                 dxbc::Src::X(0, index));\n        src = dxbc::Src::R(temp);\n      } else {\n        assert_true(operand.storage_addressing_mode ==\n                    InstructionStorageAddressingMode::kAbsolute);\n        src = dxbc::Src::R(index.index_);\n      }\n    } break;\n    case InstructionStorageSource::kConstantFloat: {\n      if (cbuffer_index_float_constants_ == kBindingIndexUnallocated) {\n        cbuffer_index_float_constants_ = cbuffer_count_++;\n      }\n      const Shader::ConstantRegisterMap& constant_register_map =\n          current_shader().constant_register_map();\n      if (operand.storage_addressing_mode ==\n          InstructionStorageAddressingMode::kAbsolute) {\n        uint32_t float_constant_index =\n            constant_register_map.GetPackedFloatConstantIndex(\n                operand.storage_index);\n        assert_true(float_constant_index != UINT32_MAX);\n        if (float_constant_index == UINT32_MAX) {\n          return dxbc::Src::LF(0.0f);\n        }\n        index.index_ = float_constant_index;\n      } else {\n        assert_true(constant_register_map.float_dynamic_addressing);\n      }\n      src = dxbc::Src::CB(cbuffer_index_float_constants_,\n                          uint32_t(CbufferRegister::kFloatConstants), index);\n    } break;\n    default:\n      assert_unhandled_case(operand.storage_source);\n      return dxbc::Src::LF(0.0f);\n  }\n\n  // Swizzle, skipping unneeded components similar to how FXC skips components,\n  // by replacing them with the leftmost used one.\n  uint32_t swizzle = 0;\n  for (uint32_t i = 0; i < 4; ++i) {\n    SwizzleSource component = operand.GetComponent(\n        (needed_components & (1 << i)) ? i : first_needed_component);\n    assert_true(component >= SwizzleSource::kX &&\n                component <= SwizzleSource::kW);\n    swizzle |= (uint32_t(component) - uint32_t(SwizzleSource::kX)) << (i * 2);\n  }\n  src = src.Swizzle(swizzle);\n\n  return src.WithModifiers(operand.is_absolute_value, operand.is_negated);\n}\n\nvoid DxbcShaderTranslator::StoreResult(const InstructionResult& result,\n                                       const dxbc::Src& src,\n                                       bool can_store_memexport_address) {\n  uint32_t used_write_mask = result.GetUsedWriteMask();\n  if (!used_write_mask) {\n    return;\n  }\n\n  // Get the destination address and type.\n  dxbc::Dest dest(dxbc::Dest::Null());\n  bool is_clamped = result.is_clamped;\n  switch (result.storage_target) {\n    case InstructionStorageTarget::kNone:\n      return;\n    case InstructionStorageTarget::kRegister:\n      if (current_shader().uses_register_dynamic_addressing()) {\n        dxbc::Index register_index(result.storage_index);\n        switch (result.storage_addressing_mode) {\n          case InstructionStorageAddressingMode::kAbsolute:\n            break;\n          case InstructionStorageAddressingMode::kAddressRegisterRelative:\n            register_index =\n                dxbc::Index(system_temp_ps_pc_p0_a0_, 3, result.storage_index);\n            break;\n          case InstructionStorageAddressingMode::kLoopRelative:\n            register_index =\n                dxbc::Index(system_temp_aL_, 0, result.storage_index);\n            break;\n        }\n        dest = dxbc::Dest::X(0, register_index);\n      } else {\n        assert_true(result.storage_addressing_mode ==\n                    InstructionStorageAddressingMode::kAbsolute);\n        dest = dxbc::Dest::R(result.storage_index);\n      }\n      break;\n    case InstructionStorageTarget::kInterpolator: {\n      uint32_t interpolator_mask = GetModificationInterpolatorMask();\n      uint32_t interpolator_bit = UINT32_C(1) << result.storage_index;\n      if (interpolator_mask & interpolator_bit) {\n        dest = dxbc::Dest::O(\n            out_reg_vs_interpolators_ +\n            xe::bit_count(interpolator_mask & (interpolator_bit - 1)));\n      }\n    } break;\n    case InstructionStorageTarget::kPosition:\n      dest = dxbc::Dest::R(system_temp_position_);\n      break;\n    case InstructionStorageTarget::kPointSizeEdgeFlagKillVertex:\n      assert_zero(used_write_mask & 0b1000);\n      dest = dxbc::Dest::R(system_temp_point_size_edge_flag_kill_vertex_);\n      break;\n    case InstructionStorageTarget::kExportAddress:\n      if (!current_shader().memexport_eM_written()) {\n        return;\n      }\n      dest = dxbc::Dest::R(system_temp_memexport_address_);\n      break;\n    case InstructionStorageTarget::kExportData: {\n      assert_not_zero(current_shader().memexport_eM_written() &\n                      (uint8_t(1) << result.storage_index));\n      dest = dxbc::Dest::R(system_temps_memexport_data_[result.storage_index]);\n      // Mark that the eM# has been written to and needs to be exported.\n      assert_not_zero(used_write_mask);\n      a_.OpOr(\n          dxbc::Dest::R(system_temp_memexport_enabled_and_eM_written_, 0b0010),\n          dxbc::Src::R(system_temp_memexport_enabled_and_eM_written_,\n                       dxbc::Src::kYYYY),\n          dxbc::Src::LU(uint8_t(1) << result.storage_index));\n    } break;\n    case InstructionStorageTarget::kColor:\n      assert_not_zero(used_write_mask);\n      assert_true(current_shader().writes_color_target(result.storage_index));\n      dest = dxbc::Dest::R(system_temps_color_[result.storage_index]);\n      if (edram_rov_used_) {\n        // For ROV output, mark that the color has been written to.\n        // According to:\n        // https://docs.microsoft.com/en-us/windows/desktop/direct3dhlsl/dx9-graphics-reference-asm-ps-registers-output-color\n        // if a color target hasn't been written to - including due to flow\n        // control - the render target must not be modified (the unwritten\n        // components of a written target are undefined, not sure if this\n        // behavior is respected on the real GPU, but the ROV code currently\n        // doesn't preserve unmodified components).\n        a_.OpOr(dxbc::Dest::R(system_temp_rov_params_, 0b0001),\n                dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kXXXX),\n                dxbc::Src::LU(uint32_t(1) << (8 + result.storage_index)));\n      }\n      break;\n    case InstructionStorageTarget::kDepth:\n      // Writes X to scalar oDepth or to X of system_temp_depth_stencil_, no\n      // additional swizzling needed.\n      assert_true(used_write_mask == 0b0001);\n      assert_true(current_shader().writes_depth());\n      if (IsDepthStencilSystemTempUsed()) {\n        dest = dxbc::Dest::R(system_temp_depth_stencil_);\n      } else {\n        dest = dxbc::Dest::ODepth();\n      }\n      // Depth outside [0, 1] is not safe for use with the ROV code, with\n      // 20e4-as-32 conversion and with 0...1 to 0...0.5 float24 remapping.\n      // Though 20e4 float depth can store values between 1 and 2, it's a very\n      // unusual case. Direct3D 10+ SV_Depth, however, can accept any values,\n      // including specials, when the depth buffer is floating-point.\n      is_clamped = true;\n      break;\n  }\n  if (dest.type_ == dxbc::OperandType::kNull) {\n    return;\n  }\n\n  // Write.\n  uint32_t src_additional_swizzle = 0;\n  uint32_t constant_mask = 0, constant_1_mask = 0;\n  for (uint32_t i = 0; i < 4; ++i) {\n    if (!(used_write_mask & (1 << i))) {\n      continue;\n    }\n    SwizzleSource component = result.components[i];\n    if (component >= SwizzleSource::kX && component <= SwizzleSource::kW) {\n      src_additional_swizzle |=\n          (uint32_t(component) - uint32_t(SwizzleSource::kX)) << (i * 2);\n    } else {\n      constant_mask |= 1 << i;\n      if (component == SwizzleSource::k1) {\n        constant_1_mask |= 1 << i;\n      }\n    }\n  }\n  if (used_write_mask != constant_mask) {\n    a_.OpMov(dest.Mask(used_write_mask & ~constant_mask),\n             src.SwizzleSwizzled(src_additional_swizzle), is_clamped);\n  }\n  if (constant_mask) {\n    a_.OpMov(dest.Mask(constant_mask),\n             dxbc::Src::LF(float(constant_1_mask & 1),\n                           float((constant_1_mask >> 1) & 1),\n                           float((constant_1_mask >> 2) & 1),\n                           float((constant_1_mask >> 3) & 1)));\n  }\n\n  // Make the point size non-negative as negative is used to indicate that the\n  // default size must be used, and also clamp it to the bounds the way the R400\n  // (Adreno 200, to be more precise) hardware clamps it (functionally like a\n  // signed 32-bit integer, -NaN and -Infinity...-0 to the minimum, +NaN to the\n  // maximum).\n  if (result.storage_target ==\n          InstructionStorageTarget::kPointSizeEdgeFlagKillVertex &&\n      (used_write_mask & 0b0001)) {\n    a_.OpIMax(\n        dxbc::Dest::R(system_temp_point_size_edge_flag_kill_vertex_, 0b0001),\n        LoadSystemConstant(SystemConstants::Index::kPointVertexDiameterMin,\n                           offsetof(SystemConstants, point_vertex_diameter_min),\n                           dxbc::Src::kXXXX),\n        dxbc::Src::R(system_temp_point_size_edge_flag_kill_vertex_,\n                     dxbc::Src::kXXXX));\n    a_.OpIMin(\n        dxbc::Dest::R(system_temp_point_size_edge_flag_kill_vertex_, 0b0001),\n        LoadSystemConstant(SystemConstants::Index::kPointVertexDiameterMax,\n                           offsetof(SystemConstants, point_vertex_diameter_max),\n                           dxbc::Src::kXXXX),\n        dxbc::Src::R(system_temp_point_size_edge_flag_kill_vertex_,\n                     dxbc::Src::kXXXX));\n  }\n}\n\nvoid DxbcShaderTranslator::UpdateExecConditionalsAndEmitDisassembly(\n    ParsedExecInstruction::Type type, uint32_t bool_constant_index,\n    bool condition) {\n  // Check if we can merge the new exec with the previous one, or the jump with\n  // the previous exec. The instruction-level predicate check is also merged in\n  // this case.\n  bool merge = false;\n  if (type == ParsedExecInstruction::Type::kConditional) {\n    // Can merge conditional with conditional, as long as the bool constant and\n    // the expected values are the same.\n    if (cf_exec_bool_constant_ == bool_constant_index &&\n        cf_exec_bool_constant_condition_ == condition) {\n      merge = true;\n    }\n  } else if (type == ParsedExecInstruction::Type::kPredicated) {\n    // Can merge predicated with predicated if the conditions are the same and\n    // the previous exec hasn't modified the predicate register.\n    if (!cf_exec_predicate_written_ && cf_exec_predicated_ &&\n        cf_exec_predicate_condition_ == condition) {\n      merge = true;\n    }\n  } else {\n    // Can merge unconditional with unconditional.\n    if (cf_exec_bool_constant_ == kCfExecBoolConstantNone &&\n        !cf_exec_predicated_) {\n      merge = true;\n    }\n  }\n\n  if (merge) {\n    // Emit the disassembly for the exec/jump merged with the previous one.\n    EmitInstructionDisassembly();\n    return;\n  }\n\n  CloseExecConditionals();\n\n  // Emit the disassembly for the new exec/jump.\n  EmitInstructionDisassembly();\n\n  if (type == ParsedExecInstruction::Type::kConditional) {\n    uint32_t bool_constant_test_temp = PushSystemTemp();\n    // Check the bool constant value.\n    if (cbuffer_index_bool_loop_constants_ == kBindingIndexUnallocated) {\n      cbuffer_index_bool_loop_constants_ = cbuffer_count_++;\n    }\n    a_.OpAnd(dxbc::Dest::R(bool_constant_test_temp, 0b0001),\n             dxbc::Src::CB(cbuffer_index_bool_loop_constants_,\n                           uint32_t(CbufferRegister::kBoolLoopConstants),\n                           bool_constant_index >> 7)\n                 .Select((bool_constant_index >> 5) & 3),\n             dxbc::Src::LU(uint32_t(1) << (bool_constant_index & 31)));\n    // Open the new `if`.\n    a_.OpIf(condition, dxbc::Src::R(bool_constant_test_temp, dxbc::Src::kXXXX));\n    // Release bool_constant_test_temp.\n    PopSystemTemp();\n    cf_exec_bool_constant_ = bool_constant_index;\n    cf_exec_bool_constant_condition_ = condition;\n  } else if (type == ParsedExecInstruction::Type::kPredicated) {\n    a_.OpIf(condition,\n            dxbc::Src::R(system_temp_ps_pc_p0_a0_, dxbc::Src::kZZZZ));\n    cf_exec_predicated_ = true;\n    cf_exec_predicate_condition_ = condition;\n  }\n}\n\nvoid DxbcShaderTranslator::CloseExecConditionals() {\n  // Within the exec - instruction-level predicate check.\n  CloseInstructionPredication();\n  // Exec level.\n  if (cf_exec_bool_constant_ != kCfExecBoolConstantNone ||\n      cf_exec_predicated_) {\n    a_.OpEndIf();\n    cf_exec_bool_constant_ = kCfExecBoolConstantNone;\n    cf_exec_predicated_ = false;\n  }\n  // Nothing relies on the predicate value being unchanged now.\n  cf_exec_predicate_written_ = false;\n}\n\nvoid DxbcShaderTranslator::UpdateInstructionPredicationAndEmitDisassembly(\n    bool predicated, bool condition) {\n  if (!predicated) {\n    CloseInstructionPredication();\n    EmitInstructionDisassembly();\n    return;\n  }\n\n  if (cf_instruction_predicate_if_open_) {\n    if (cf_instruction_predicate_condition_ == condition) {\n      // Already in the needed instruction-level `if`.\n      EmitInstructionDisassembly();\n      return;\n    }\n    CloseInstructionPredication();\n  }\n\n  // Emit the disassembly before opening (or not opening) the new conditional.\n  EmitInstructionDisassembly();\n\n  // If the instruction predicate condition is the same as the exec predicate\n  // condition, no need to open a check. However, if there was a `setp` prior\n  // to this instruction, the predicate value now may be different than it was\n  // in the beginning of the exec.\n  if (!cf_exec_predicate_written_ && cf_exec_predicated_ &&\n      cf_exec_predicate_condition_ == condition) {\n    return;\n  }\n\n  a_.OpIf(condition, dxbc::Src::R(system_temp_ps_pc_p0_a0_, dxbc::Src::kZZZZ));\n  cf_instruction_predicate_if_open_ = true;\n  cf_instruction_predicate_condition_ = condition;\n}\n\nvoid DxbcShaderTranslator::CloseInstructionPredication() {\n  if (cf_instruction_predicate_if_open_) {\n    a_.OpEndIf();\n    cf_instruction_predicate_if_open_ = false;\n  }\n}\n\nvoid DxbcShaderTranslator::JumpToLabel(uint32_t address) {\n  a_.OpMov(dxbc::Dest::R(system_temp_ps_pc_p0_a0_, 0b0010),\n           dxbc::Src::LU(address));\n  a_.OpContinue();\n}\n\nvoid DxbcShaderTranslator::ProcessLabel(uint32_t cf_index) {\n  if (cf_index == 0) {\n    // 0 already added in the beginning.\n    return;\n  }\n  // Close flow control on the deeper levels below - prevent attempts to merge\n  // execs across labels.\n  CloseExecConditionals();\n  if (UseSwitchForControlFlow()) {\n    // Fallthrough to the label from the previous one on the next iteration if\n    // no `continue` was done. Can't simply fallthrough because in DXBC, a\n    // non-empty switch case must end with a break.\n    JumpToLabel(cf_index);\n    // Close the previous label.\n    a_.OpBreak();\n    // Go to the next label.\n    a_.OpCase(dxbc::Src::LU(cf_index));\n  } else {\n    // Close the previous label.\n    a_.OpEndIf();\n    // if (pc <= cf_index)\n    uint32_t test_temp = PushSystemTemp();\n    a_.OpUGE(dxbc::Dest::R(test_temp, 0b0001), dxbc::Src::LU(cf_index),\n             dxbc::Src::R(system_temp_ps_pc_p0_a0_, dxbc::Src::kYYYY));\n    a_.OpIf(true, dxbc::Src::R(test_temp, dxbc::Src::kXXXX));\n    // Release test_temp.\n    PopSystemTemp();\n  }\n}\n\nvoid DxbcShaderTranslator::ProcessExecInstructionBegin(\n    const ParsedExecInstruction& instr) {\n  if (emit_source_map_) {\n    instruction_disassembly_buffer_.Reset();\n    instr.Disassemble(&instruction_disassembly_buffer_);\n  }\n  UpdateExecConditionalsAndEmitDisassembly(\n      instr.type, instr.bool_constant_index, instr.condition);\n}\n\nvoid DxbcShaderTranslator::ProcessExecInstructionEnd(\n    const ParsedExecInstruction& instr) {\n  if (instr.is_end) {\n    // Break out of the main loop.\n    CloseInstructionPredication();\n    if (UseSwitchForControlFlow()) {\n      // Write an invalid value to pc.\n      a_.OpMov(dxbc::Dest::R(system_temp_ps_pc_p0_a0_, 0b0010),\n               dxbc::Src::LU(UINT32_MAX));\n      // Go to the next iteration, where switch cases won't be reached.\n      a_.OpContinue();\n    } else {\n      a_.OpBreak();\n    }\n  }\n}\n\nvoid DxbcShaderTranslator::ProcessLoopStartInstruction(\n    const ParsedLoopStartInstruction& instr) {\n  // loop il<idx>, L<idx> - loop with loop data il<idx>, end @ L<idx>\n\n  // Loop control is outside execs - actually close the last exec.\n  CloseExecConditionals();\n\n  if (emit_source_map_) {\n    instruction_disassembly_buffer_.Reset();\n    instr.Disassemble(&instruction_disassembly_buffer_);\n    EmitInstructionDisassembly();\n  }\n\n  // Count (unsigned) in bits 0:7 of the loop constant, initial aL (unsigned) in\n  // 8:15. Starting from vector 2 because of bool constants.\n  if (cbuffer_index_bool_loop_constants_ == kBindingIndexUnallocated) {\n    cbuffer_index_bool_loop_constants_ = cbuffer_count_++;\n  }\n  dxbc::Src loop_constant_src(\n      dxbc::Src::CB(cbuffer_index_bool_loop_constants_,\n                    uint32_t(CbufferRegister::kBoolLoopConstants),\n                    2 + (instr.loop_constant_index >> 2))\n          .Select(instr.loop_constant_index & 3));\n\n  {\n    uint32_t loop_count_temp = PushSystemTemp();\n    a_.OpAnd(dxbc::Dest::R(loop_count_temp, 0b0001), loop_constant_src,\n             dxbc::Src::LU(UINT8_MAX));\n\n    // Skip the loop without pushing if the count is zero from the beginning.\n    a_.OpIf(false, dxbc::Src::R(loop_count_temp, dxbc::Src::kXXXX));\n    JumpToLabel(instr.loop_skip_address);\n    a_.OpEndIf();\n\n    // Push the count to the loop count stack - move XYZ to YZW and set X to the\n    // new loop count.\n    a_.OpMov(dxbc::Dest::R(system_temp_loop_count_, 0b1110),\n             dxbc::Src::R(system_temp_loop_count_, 0b10010000));\n    a_.OpMov(dxbc::Dest::R(system_temp_loop_count_, 0b0001),\n             dxbc::Src::R(loop_count_temp, dxbc::Src::kXXXX));\n\n    // Release loop_count_temp.\n    PopSystemTemp();\n  }\n\n  // Push aL - keep the same value as in the previous loop if repeating, or the\n  // new one otherwise.\n  a_.OpMov(dxbc::Dest::R(system_temp_aL_, instr.is_repeat ? 0b1111 : 0b1110),\n           dxbc::Src::R(system_temp_aL_, 0b10010000));\n  if (!instr.is_repeat) {\n    a_.OpUBFE(dxbc::Dest::R(system_temp_aL_, 0b0001), dxbc::Src::LU(8),\n              dxbc::Src::LU(8), loop_constant_src);\n  }\n}\n\nvoid DxbcShaderTranslator::ProcessLoopEndInstruction(\n    const ParsedLoopEndInstruction& instr) {\n  // endloop il<idx>, L<idx> - end loop w/ data il<idx>, head @ L<idx>\n\n  // Loop control is outside execs - actually close the last exec.\n  CloseExecConditionals();\n\n  if (emit_source_map_) {\n    instruction_disassembly_buffer_.Reset();\n    instr.Disassemble(&instruction_disassembly_buffer_);\n    EmitInstructionDisassembly();\n  }\n\n  // Subtract 1 from the loop counter.\n  a_.OpIAdd(dxbc::Dest::R(system_temp_loop_count_, 0b0001),\n            dxbc::Src::R(system_temp_loop_count_, dxbc::Src::kXXXX),\n            dxbc::Src::LI(-1));\n\n  if (instr.is_predicated_break) {\n    // if (loop_count.x == 0 || [!]p0)\n    uint32_t break_case_temp = PushSystemTemp();\n    if (instr.predicate_condition) {\n      // If p0 is non-zero, set the test value to 0 (since if_z is used,\n      // otherwise check if the loop counter is zero).\n      a_.OpMovC(dxbc::Dest::R(break_case_temp, 0b0001),\n                dxbc::Src::R(system_temp_ps_pc_p0_a0_, dxbc::Src::kZZZZ),\n                dxbc::Src::LU(0),\n                dxbc::Src::R(system_temp_loop_count_, dxbc::Src::kXXXX));\n    } else {\n      // If p0 is zero, set the test value to 0 (since if_z is used, otherwise\n      // check if the loop counter is zero).\n      a_.OpMovC(dxbc::Dest::R(break_case_temp, 0b0001),\n                dxbc::Src::R(system_temp_ps_pc_p0_a0_, dxbc::Src::kZZZZ),\n                dxbc::Src::R(system_temp_loop_count_, dxbc::Src::kXXXX),\n                dxbc::Src::LU(0));\n    }\n    a_.OpIf(false, dxbc::Src::R(break_case_temp, dxbc::Src::kXXXX));\n    // Release break_case_temp.\n    PopSystemTemp();\n  } else {\n    // if (loop_count.x == 0)\n    a_.OpIf(false, dxbc::Src::R(system_temp_loop_count_, dxbc::Src::kXXXX));\n  }\n  {\n    // Break case.\n    // Pop the current loop off the loop counter and the relative address\n    // stacks - move YZW to XYZ and set W to 0.\n    a_.OpMov(dxbc::Dest::R(system_temp_loop_count_, 0b0111),\n             dxbc::Src::R(system_temp_loop_count_, 0b111001));\n    a_.OpMov(dxbc::Dest::R(system_temp_loop_count_, 0b1000), dxbc::Src::LU(0));\n    a_.OpMov(dxbc::Dest::R(system_temp_aL_, 0b0111),\n             dxbc::Src::R(system_temp_aL_, 0b111001));\n    a_.OpMov(dxbc::Dest::R(system_temp_aL_, 0b1000), dxbc::Src::LI(0));\n    // Now going to fall through to the next exec (no need to jump).\n  }\n  a_.OpElse();\n  {\n    // Continue case.\n    uint32_t aL_add_temp = PushSystemTemp();\n    // Extract the value to add to aL (signed, in bits 16:23 of the loop\n    // constant). Starting from vector 2 because of bool constants.\n    if (cbuffer_index_bool_loop_constants_ == kBindingIndexUnallocated) {\n      cbuffer_index_bool_loop_constants_ = cbuffer_count_++;\n    }\n    a_.OpIBFE(dxbc::Dest::R(aL_add_temp, 0b0001), dxbc::Src::LU(8),\n              dxbc::Src::LU(16),\n              dxbc::Src::CB(cbuffer_index_bool_loop_constants_,\n                            uint32_t(CbufferRegister::kBoolLoopConstants),\n                            2 + (instr.loop_constant_index >> 2))\n                  .Select(instr.loop_constant_index & 3));\n    // Add the needed value to aL.\n    a_.OpIAdd(dxbc::Dest::R(system_temp_aL_, 0b0001),\n              dxbc::Src::R(system_temp_aL_, dxbc::Src::kXXXX),\n              dxbc::Src::R(aL_add_temp, dxbc::Src::kXXXX));\n    // Release aL_add_temp.\n    PopSystemTemp();\n    // Jump back to the beginning of the loop body.\n    JumpToLabel(instr.loop_body_address);\n  }\n  a_.OpEndIf();\n}\n\nvoid DxbcShaderTranslator::ProcessJumpInstruction(\n    const ParsedJumpInstruction& instr) {\n  if (emit_source_map_) {\n    instruction_disassembly_buffer_.Reset();\n    instr.Disassemble(&instruction_disassembly_buffer_);\n  }\n\n  // Treat like exec, merge with execs if possible, since it's an if too.\n  ParsedExecInstruction::Type type;\n  if (instr.type == ParsedJumpInstruction::Type::kConditional) {\n    type = ParsedExecInstruction::Type::kConditional;\n  } else if (instr.type == ParsedJumpInstruction::Type::kPredicated) {\n    type = ParsedExecInstruction::Type::kPredicated;\n  } else {\n    type = ParsedExecInstruction::Type::kUnconditional;\n  }\n  UpdateExecConditionalsAndEmitDisassembly(type, instr.bool_constant_index,\n                                           instr.condition);\n\n  // UpdateExecConditionalsAndEmitDisassembly may not necessarily close the\n  // instruction-level predicate check (it's not necessary if the execs are\n  // merged), but here the instruction itself is on the flow control level, so\n  // the predicate check is on the flow control level too.\n  CloseInstructionPredication();\n\n  JumpToLabel(instr.target_address);\n}\n\nvoid DxbcShaderTranslator::ProcessAllocInstruction(\n    const ParsedAllocInstruction& instr, uint8_t export_eM) {\n  bool start_memexport = instr.type == AllocType::kMemory &&\n                         current_shader().memexport_eM_written();\n  if (export_eM || start_memexport) {\n    CloseExecConditionals();\n  }\n\n  if (emit_source_map_) {\n    instruction_disassembly_buffer_.Reset();\n    instr.Disassemble(&instruction_disassembly_buffer_);\n    EmitInstructionDisassembly();\n  }\n\n  if (export_eM) {\n    ExportToMemory(export_eM);\n    // Reset which eM# elements have been written.\n    a_.OpMov(\n        dxbc::Dest::R(system_temp_memexport_enabled_and_eM_written_, 0b0010),\n        dxbc::Src::LU(0));\n    // Break dependencies from the previous memexport.\n    uint8_t export_eM_remaining = export_eM;\n    uint32_t eM_index;\n    while (xe::bit_scan_forward(export_eM_remaining, &eM_index)) {\n      export_eM_remaining &= ~(uint8_t(1) << eM_index);\n      a_.OpMov(dxbc::Dest::R(system_temps_memexport_data_[eM_index]),\n               dxbc::Src::LF(0.0f));\n    }\n  }\n\n  if (start_memexport) {\n    // Initialize eA to an invalid address.\n    a_.OpMov(dxbc::Dest::R(system_temp_memexport_address_), dxbc::Src::LU(0));\n  }\n}\n\nconst DxbcShaderTranslator::ShaderRdefType\n    DxbcShaderTranslator::rdef_types_[size_t(\n        DxbcShaderTranslator::ShaderRdefTypeIndex::kCount)] = {\n        // kFloat\n        {\"float\", dxbc::RdefVariableClass::kScalar,\n         dxbc::RdefVariableType::kFloat, 1, 1, 0,\n         ShaderRdefTypeIndex::kUnknown},\n        // kFloat2\n        {\"float2\", dxbc::RdefVariableClass::kVector,\n         dxbc::RdefVariableType::kFloat, 1, 2, 0,\n         ShaderRdefTypeIndex::kUnknown},\n        // kFloat3\n        {\"float3\", dxbc::RdefVariableClass::kVector,\n         dxbc::RdefVariableType::kFloat, 1, 3, 0,\n         ShaderRdefTypeIndex::kUnknown},\n        // kFloat4\n        {\"float4\", dxbc::RdefVariableClass::kVector,\n         dxbc::RdefVariableType::kFloat, 1, 4, 0,\n         ShaderRdefTypeIndex::kUnknown},\n        // kUint\n        {\"dword\", dxbc::RdefVariableClass::kScalar,\n         dxbc::RdefVariableType::kUInt, 1, 1, 0, ShaderRdefTypeIndex::kUnknown},\n        // kUint2\n        {\"uint2\", dxbc::RdefVariableClass::kVector,\n         dxbc::RdefVariableType::kUInt, 1, 2, 0, ShaderRdefTypeIndex::kUnknown},\n        // kUint4\n        {\"uint4\", dxbc::RdefVariableClass::kVector,\n         dxbc::RdefVariableType::kUInt, 1, 4, 0, ShaderRdefTypeIndex::kUnknown},\n        // kFloat4Array4\n        {nullptr, dxbc::RdefVariableClass::kVector,\n         dxbc::RdefVariableType::kFloat, 1, 4, 4, ShaderRdefTypeIndex::kFloat4},\n        // kFloat4Array6\n        {nullptr, dxbc::RdefVariableClass::kVector,\n         dxbc::RdefVariableType::kFloat, 1, 4, 6, ShaderRdefTypeIndex::kFloat4},\n        // kFloat4ConstantArray - float constants - size written dynamically.\n        {nullptr, dxbc::RdefVariableClass::kVector,\n         dxbc::RdefVariableType::kFloat, 1, 4, 0, ShaderRdefTypeIndex::kFloat4},\n        // kUint4Array2\n        {nullptr, dxbc::RdefVariableClass::kVector,\n         dxbc::RdefVariableType::kUInt, 1, 4, 2, ShaderRdefTypeIndex::kUint4},\n        // kUint4Array8\n        {nullptr, dxbc::RdefVariableClass::kVector,\n         dxbc::RdefVariableType::kUInt, 1, 4, 8, ShaderRdefTypeIndex::kUint4},\n        // kUint4Array48\n        {nullptr, dxbc::RdefVariableClass::kVector,\n         dxbc::RdefVariableType::kUInt, 1, 4, 48, ShaderRdefTypeIndex::kUint4},\n        // kUint4DescriptorIndexArray - bindless descriptor indices - size\n        // written\n        // dynamically.\n        {nullptr, dxbc::RdefVariableClass::kVector,\n         dxbc::RdefVariableType::kUInt, 1, 4, 0, ShaderRdefTypeIndex::kUint4},\n};\n\nconst DxbcShaderTranslator::SystemConstantRdef\n    DxbcShaderTranslator::system_constant_rdef_[size_t(\n        DxbcShaderTranslator::SystemConstants::Index::kCount)] = {\n        {\"xe_flags\", ShaderRdefTypeIndex::kUint, sizeof(uint32_t)},\n        {\"xe_tessellation_factor_range\", ShaderRdefTypeIndex::kFloat2,\n         sizeof(float) * 2},\n        {\"xe_line_loop_closing_index\", ShaderRdefTypeIndex::kUint,\n         sizeof(uint32_t)},\n\n        {\"xe_vertex_index_endian\", ShaderRdefTypeIndex::kUint,\n         sizeof(uint32_t)},\n        {\"xe_vertex_index_offset\", ShaderRdefTypeIndex::kUint, sizeof(int32_t)},\n        {\"xe_vertex_index_min_max\", ShaderRdefTypeIndex::kUint2,\n         sizeof(uint32_t) * 2},\n\n        {\"xe_user_clip_planes\", ShaderRdefTypeIndex::kFloat4Array6,\n         sizeof(float) * 4 * 6},\n\n        {\"xe_ndc_scale\", ShaderRdefTypeIndex::kFloat3, sizeof(float) * 3},\n        {\"xe_point_vertex_diameter_min\", ShaderRdefTypeIndex::kFloat,\n         sizeof(float)},\n\n        {\"xe_ndc_offset\", ShaderRdefTypeIndex::kFloat3, sizeof(float) * 3},\n        {\"xe_point_vertex_diameter_max\", ShaderRdefTypeIndex::kFloat,\n         sizeof(float)},\n\n        {\"xe_point_constant_diameter\", ShaderRdefTypeIndex::kFloat2,\n         sizeof(float) * 2},\n        {\"xe_point_screen_diameter_to_ndc_radius\", ShaderRdefTypeIndex::kFloat2,\n         sizeof(float) * 2},\n\n        {\"xe_texture_swizzled_signs\", ShaderRdefTypeIndex::kUint4Array2,\n         sizeof(uint32_t) * 4 * 2},\n\n        {\"xe_textures_resolution_scaled\", ShaderRdefTypeIndex::kUint,\n         sizeof(uint32_t)},\n        {\"xe_sample_count_log2\", ShaderRdefTypeIndex::kUint2,\n         sizeof(uint32_t) * 2},\n        {\"xe_alpha_test_reference\", ShaderRdefTypeIndex::kFloat, sizeof(float)},\n\n        {\"xe_alpha_to_mask\", ShaderRdefTypeIndex::kUint, sizeof(uint32_t)},\n        {\"xe_edram_32bpp_tile_pitch_dwords_scaled\", ShaderRdefTypeIndex::kUint,\n         sizeof(uint32_t)},\n        {\"xe_edram_depth_base_dwords_scaled\", ShaderRdefTypeIndex::kUint,\n         sizeof(uint32_t), sizeof(uint32_t)},\n\n        {\"xe_color_exp_bias\", ShaderRdefTypeIndex::kFloat4, sizeof(float) * 4},\n\n        {\"xe_edram_poly_offset_front\", ShaderRdefTypeIndex::kFloat2,\n         sizeof(float) * 2},\n        {\"xe_edram_poly_offset_back\", ShaderRdefTypeIndex::kFloat2,\n         sizeof(float) * 2},\n\n        {\"xe_edram_stencil\", ShaderRdefTypeIndex::kUint4Array2,\n         sizeof(uint32_t) * 4 * 2},\n\n        {\"xe_edram_rt_base_dwords_scaled\", ShaderRdefTypeIndex::kUint4,\n         sizeof(uint32_t) * 4},\n\n        {\"xe_edram_rt_format_flags\", ShaderRdefTypeIndex::kUint4,\n         sizeof(uint32_t) * 4},\n\n        {\"xe_edram_rt_clamp\", ShaderRdefTypeIndex::kFloat4Array4,\n         sizeof(float) * 4 * 4},\n\n        {\"xe_edram_rt_keep_mask\", ShaderRdefTypeIndex::kUint4Array2,\n         sizeof(uint32_t) * 4 * 2},\n\n        {\"xe_edram_rt_blend_factors_ops\", ShaderRdefTypeIndex::kUint4,\n         sizeof(uint32_t) * 4},\n\n        {\"xe_edram_blend_constant\", ShaderRdefTypeIndex::kFloat4,\n         sizeof(float) * 4},\n};\n\nvoid DxbcShaderTranslator::WriteResourceDefinition() {\n  // Because of shader_object_.resize(), pointers can't be kept persistently\n  // here! Resizing also zeroes the memory.\n\n  uint32_t blob_position_dwords = uint32_t(shader_object_.size());\n  uint32_t name_ptr;\n\n  const Shader::ConstantRegisterMap& constant_register_map =\n      current_shader().constant_register_map();\n\n  // Allocate space for the header, will fill when all pointers and counts are\n  // known.\n  shader_object_.resize(shader_object_.size() +\n                        sizeof(dxbc::RdefHeader) / sizeof(uint32_t));\n  // Generator name.\n  dxbc::AppendAlignedString(shader_object_, \"Xenia\");\n\n  // ***************************************************************************\n  // Constant types\n  // ***************************************************************************\n\n  // Type names.\n  name_ptr = (uint32_t(shader_object_.size()) - blob_position_dwords) *\n             sizeof(uint32_t);\n  uint32_t type_name_ptrs[size_t(ShaderRdefTypeIndex::kCount)];\n  for (uint32_t i = 0; i < uint32_t(ShaderRdefTypeIndex::kCount); ++i) {\n    const ShaderRdefType& type = rdef_types_[i];\n    if (type.name == nullptr) {\n      // Array - use the name of the element type.\n      assert_true(uint32_t(type.array_element_type) < i);\n      type_name_ptrs[i] = type_name_ptrs[uint32_t(type.array_element_type)];\n      continue;\n    }\n    type_name_ptrs[i] = name_ptr;\n    name_ptr += dxbc::AppendAlignedString(shader_object_, type.name);\n  }\n  // Types.\n  uint32_t types_position_dwords = uint32_t(shader_object_.size());\n  uint32_t types_ptr =\n      (types_position_dwords - blob_position_dwords) * sizeof(uint32_t);\n  shader_object_.resize(types_position_dwords +\n                        sizeof(dxbc::RdefType) / sizeof(uint32_t) *\n                            uint32_t(ShaderRdefTypeIndex::kCount));\n  {\n    auto types = reinterpret_cast<dxbc::RdefType*>(shader_object_.data() +\n                                                   types_position_dwords);\n    for (uint32_t i = 0; i < uint32_t(ShaderRdefTypeIndex::kCount); ++i) {\n      dxbc::RdefType& type = types[i];\n      const ShaderRdefType& translator_type = rdef_types_[i];\n      type.variable_class = translator_type.variable_class;\n      type.variable_type = translator_type.variable_type;\n      type.row_count = translator_type.row_count;\n      type.column_count = translator_type.column_count;\n      switch (ShaderRdefTypeIndex(i)) {\n        case ShaderRdefTypeIndex::kFloat4ConstantArray:\n          // Declaring a 0-sized array may not be safe, so write something valid\n          // even if they aren't used.\n          type.element_count = std::max(\n              uint16_t(constant_register_map.float_count), uint16_t(1));\n          break;\n        case ShaderRdefTypeIndex::kUint4DescriptorIndexArray:\n          type.element_count = std::max(\n              uint16_t((GetBindlessResourceCount() + 3) >> 2), uint16_t(1));\n          break;\n        default:\n          type.element_count = translator_type.element_count;\n      }\n      type.name_ptr = type_name_ptrs[i];\n    }\n  }\n\n  // ***************************************************************************\n  // Constants\n  // ***************************************************************************\n\n  // Names.\n  name_ptr = (uint32_t(shader_object_.size()) - blob_position_dwords) *\n             sizeof(uint32_t);\n  uint32_t constant_name_ptrs_system[size_t(SystemConstants::Index::kCount)];\n  if (cbuffer_index_system_constants_ != kBindingIndexUnallocated) {\n    for (size_t i = 0; i < size_t(SystemConstants::Index::kCount); ++i) {\n      constant_name_ptrs_system[i] = name_ptr;\n      name_ptr += dxbc::AppendAlignedString(shader_object_,\n                                            system_constant_rdef_[i].name);\n    }\n  }\n  uint32_t constant_name_ptr_float = name_ptr;\n  if (cbuffer_index_float_constants_ != kBindingIndexUnallocated) {\n    name_ptr += dxbc::AppendAlignedString(shader_object_, \"xe_float_constants\");\n  }\n  uint32_t constant_name_ptr_bool = name_ptr;\n  uint32_t constant_name_ptr_loop = name_ptr;\n  if (cbuffer_index_bool_loop_constants_ != kBindingIndexUnallocated) {\n    name_ptr += dxbc::AppendAlignedString(shader_object_, \"xe_bool_constants\");\n    constant_name_ptr_loop = name_ptr;\n    name_ptr += dxbc::AppendAlignedString(shader_object_, \"xe_loop_constants\");\n  }\n  uint32_t constant_name_ptr_fetch = name_ptr;\n  if (cbuffer_index_fetch_constants_ != kBindingIndexUnallocated) {\n    name_ptr += dxbc::AppendAlignedString(shader_object_, \"xe_fetch_constants\");\n  }\n  uint32_t constant_name_ptr_descriptor_indices = name_ptr;\n  if (cbuffer_index_descriptor_indices_ != kBindingIndexUnallocated) {\n    name_ptr +=\n        dxbc::AppendAlignedString(shader_object_, \"xe_descriptor_indices\");\n  }\n\n  // System constants.\n  uint32_t constant_position_dwords_system = uint32_t(shader_object_.size());\n  if (cbuffer_index_system_constants_ != kBindingIndexUnallocated) {\n    shader_object_.resize(constant_position_dwords_system +\n                          sizeof(dxbc::RdefVariable) / sizeof(uint32_t) *\n                              size_t(SystemConstants::Index::kCount));\n    auto constants_system = reinterpret_cast<dxbc::RdefVariable*>(\n        shader_object_.data() + constant_position_dwords_system);\n    uint32_t constant_offset_system = 0;\n    for (size_t i = 0; i < size_t(SystemConstants::Index::kCount); ++i) {\n      dxbc::RdefVariable& constant_system = constants_system[i];\n      const SystemConstantRdef& translator_constant_system =\n          system_constant_rdef_[i];\n      constant_system.name_ptr = constant_name_ptrs_system[i];\n      constant_system.start_offset_bytes = constant_offset_system;\n      constant_system.size_bytes = translator_constant_system.size;\n      constant_system.flags = (system_constants_used_ & (uint64_t(1) << i))\n                                  ? dxbc::kRdefVariableFlagUsed\n                                  : 0;\n      constant_system.type_ptr =\n          types_ptr +\n          sizeof(dxbc::RdefType) * uint32_t(translator_constant_system.type);\n      constant_system.start_texture = UINT32_MAX;\n      constant_system.start_sampler = UINT32_MAX;\n      constant_offset_system += translator_constant_system.size +\n                                translator_constant_system.padding_after;\n    }\n  }\n\n  // Float constants.\n  uint32_t constant_position_dwords_float = uint32_t(shader_object_.size());\n  if (cbuffer_index_float_constants_ != kBindingIndexUnallocated) {\n    assert_not_zero(constant_register_map.float_count);\n    shader_object_.resize(constant_position_dwords_float +\n                          sizeof(dxbc::RdefVariable) / sizeof(uint32_t));\n    auto& constant_float = *reinterpret_cast<dxbc::RdefVariable*>(\n        shader_object_.data() + constant_position_dwords_float);\n    constant_float.name_ptr = constant_name_ptr_float;\n    constant_float.size_bytes =\n        sizeof(float) * 4 * constant_register_map.float_count;\n    constant_float.flags = dxbc::kRdefVariableFlagUsed;\n    constant_float.type_ptr =\n        types_ptr + sizeof(dxbc::RdefType) *\n                        uint32_t(ShaderRdefTypeIndex::kFloat4ConstantArray);\n    constant_float.start_texture = UINT32_MAX;\n    constant_float.start_sampler = UINT32_MAX;\n  }\n\n  // Bool and loop constants.\n  uint32_t constant_position_dwords_bool_loop = uint32_t(shader_object_.size());\n  if (cbuffer_index_bool_loop_constants_ != kBindingIndexUnallocated) {\n    shader_object_.resize(constant_position_dwords_bool_loop +\n                          sizeof(dxbc::RdefVariable) / sizeof(uint32_t) * 2);\n    auto constants_bool_loop = reinterpret_cast<dxbc::RdefVariable*>(\n        shader_object_.data() + constant_position_dwords_bool_loop);\n\n    constants_bool_loop[0].name_ptr = constant_name_ptr_bool;\n    constants_bool_loop[0].size_bytes = sizeof(uint32_t) * 4 * 2;\n    for (size_t i = 0; i < xe::countof(constant_register_map.bool_bitmap);\n         ++i) {\n      if (constant_register_map.bool_bitmap[i]) {\n        constants_bool_loop[0].flags |= dxbc::kRdefVariableFlagUsed;\n        break;\n      }\n    }\n    constants_bool_loop[0].type_ptr =\n        types_ptr +\n        sizeof(dxbc::RdefType) * uint32_t(ShaderRdefTypeIndex::kUint4Array2);\n    constants_bool_loop[0].start_texture = UINT32_MAX;\n    constants_bool_loop[0].start_sampler = UINT32_MAX;\n\n    constants_bool_loop[1].name_ptr = constant_name_ptr_loop;\n    constants_bool_loop[1].start_offset_bytes = sizeof(uint32_t) * 4 * 2;\n    constants_bool_loop[1].size_bytes = sizeof(uint32_t) * 4 * 8;\n    constants_bool_loop[1].flags =\n        constant_register_map.loop_bitmap ? dxbc::kRdefVariableFlagUsed : 0;\n    constants_bool_loop[1].type_ptr =\n        types_ptr +\n        sizeof(dxbc::RdefType) * uint32_t(ShaderRdefTypeIndex::kUint4Array8);\n    constants_bool_loop[1].start_texture = UINT32_MAX;\n    constants_bool_loop[1].start_sampler = UINT32_MAX;\n  }\n\n  // Fetch constants.\n  uint32_t constant_position_dwords_fetch = uint32_t(shader_object_.size());\n  if (cbuffer_index_fetch_constants_ != kBindingIndexUnallocated) {\n    shader_object_.resize(constant_position_dwords_fetch +\n                          sizeof(dxbc::RdefVariable) / sizeof(uint32_t));\n    auto& constant_fetch = *reinterpret_cast<dxbc::RdefVariable*>(\n        shader_object_.data() + constant_position_dwords_fetch);\n    constant_fetch.name_ptr = constant_name_ptr_fetch;\n    constant_fetch.size_bytes = sizeof(uint32_t) * 6 * 32;\n    constant_fetch.flags = dxbc::kRdefVariableFlagUsed;\n    constant_fetch.type_ptr =\n        types_ptr +\n        sizeof(dxbc::RdefType) * uint32_t(ShaderRdefTypeIndex::kUint4Array48);\n    constant_fetch.start_texture = UINT32_MAX;\n    constant_fetch.start_sampler = UINT32_MAX;\n  }\n\n  // Bindless description indices.\n  uint32_t constant_position_dwords_descriptor_indices =\n      uint32_t(shader_object_.size());\n  if (cbuffer_index_descriptor_indices_ != kBindingIndexUnallocated) {\n    assert_not_zero(GetBindlessResourceCount());\n    shader_object_.resize(constant_position_dwords_descriptor_indices +\n                          sizeof(dxbc::RdefVariable) / sizeof(uint32_t));\n    auto& constant_descriptor_indices = *reinterpret_cast<dxbc::RdefVariable*>(\n        shader_object_.data() + constant_position_dwords_descriptor_indices);\n    constant_descriptor_indices.name_ptr = constant_name_ptr_descriptor_indices;\n    constant_descriptor_indices.size_bytes =\n        sizeof(uint32_t) * xe::align(GetBindlessResourceCount(), uint32_t(4));\n    constant_descriptor_indices.flags = dxbc::kRdefVariableFlagUsed;\n    constant_descriptor_indices.type_ptr =\n        types_ptr +\n        sizeof(dxbc::RdefType) *\n            uint32_t(ShaderRdefTypeIndex::kUint4DescriptorIndexArray);\n    constant_descriptor_indices.start_texture = UINT32_MAX;\n    constant_descriptor_indices.start_sampler = UINT32_MAX;\n  }\n\n  // ***************************************************************************\n  // Constant buffers\n  // ***************************************************************************\n\n  // Names.\n  name_ptr = (uint32_t(shader_object_.size()) - blob_position_dwords) *\n             sizeof(uint32_t);\n  uint32_t cbuffer_name_ptr_system = name_ptr;\n  if (cbuffer_index_system_constants_ != kBindingIndexUnallocated) {\n    name_ptr += dxbc::AppendAlignedString(shader_object_, \"xe_system_cbuffer\");\n  }\n  uint32_t cbuffer_name_ptr_float = name_ptr;\n  if (cbuffer_index_float_constants_ != kBindingIndexUnallocated) {\n    name_ptr += dxbc::AppendAlignedString(shader_object_, \"xe_float_cbuffer\");\n  }\n  uint32_t cbuffer_name_ptr_bool_loop = name_ptr;\n  if (cbuffer_index_bool_loop_constants_ != kBindingIndexUnallocated) {\n    name_ptr +=\n        dxbc::AppendAlignedString(shader_object_, \"xe_bool_loop_cbuffer\");\n  }\n  uint32_t cbuffer_name_ptr_fetch = name_ptr;\n  if (cbuffer_index_fetch_constants_ != kBindingIndexUnallocated) {\n    name_ptr += dxbc::AppendAlignedString(shader_object_, \"xe_fetch_cbuffer\");\n  }\n  uint32_t cbuffer_name_ptr_descriptor_indices = name_ptr;\n  if (cbuffer_index_descriptor_indices_ != kBindingIndexUnallocated) {\n    name_ptr += dxbc::AppendAlignedString(shader_object_,\n                                          \"xe_descriptor_indices_cbuffer\");\n  }\n\n  // All the constant buffers, sorted by their binding index.\n  uint32_t cbuffers_position_dwords = uint32_t(shader_object_.size());\n  shader_object_.resize(cbuffers_position_dwords + sizeof(dxbc::RdefCbuffer) /\n                                                       sizeof(uint32_t) *\n                                                       cbuffer_count_);\n  {\n    auto cbuffers = reinterpret_cast<dxbc::RdefCbuffer*>(\n        shader_object_.data() + cbuffers_position_dwords);\n    for (uint32_t i = 0; i < cbuffer_count_; ++i) {\n      dxbc::RdefCbuffer& cbuffer = cbuffers[i];\n      cbuffer.type = dxbc::RdefCbufferType::kCbuffer;\n      if (i == cbuffer_index_system_constants_) {\n        cbuffer.name_ptr = cbuffer_name_ptr_system;\n        cbuffer.variable_count = uint32_t(SystemConstants::Index::kCount);\n        cbuffer.variables_ptr =\n            (constant_position_dwords_system - blob_position_dwords) *\n            sizeof(uint32_t);\n        cbuffer.size_vector_aligned_bytes =\n            uint32_t(xe::align(sizeof(SystemConstants), sizeof(uint32_t) * 4));\n      } else if (i == cbuffer_index_float_constants_) {\n        assert_not_zero(constant_register_map.float_count);\n        cbuffer.name_ptr = cbuffer_name_ptr_float;\n        cbuffer.variable_count = 1;\n        cbuffer.variables_ptr =\n            (constant_position_dwords_float - blob_position_dwords) *\n            sizeof(uint32_t);\n        cbuffer.size_vector_aligned_bytes =\n            sizeof(float) * 4 * constant_register_map.float_count;\n      } else if (i == cbuffer_index_bool_loop_constants_) {\n        cbuffer.name_ptr = cbuffer_name_ptr_bool_loop;\n        cbuffer.variable_count = 2;\n        cbuffer.variables_ptr =\n            (constant_position_dwords_bool_loop - blob_position_dwords) *\n            sizeof(uint32_t);\n        cbuffer.size_vector_aligned_bytes = sizeof(uint32_t) * 4 * (2 + 8);\n      } else if (i == cbuffer_index_fetch_constants_) {\n        cbuffer.name_ptr = cbuffer_name_ptr_fetch;\n        cbuffer.variable_count = 1;\n        cbuffer.variables_ptr =\n            (constant_position_dwords_fetch - blob_position_dwords) *\n            sizeof(uint32_t);\n        cbuffer.size_vector_aligned_bytes = sizeof(uint32_t) * 6 * 32;\n      } else if (i == cbuffer_index_descriptor_indices_) {\n        assert_not_zero(GetBindlessResourceCount());\n        cbuffer.name_ptr = cbuffer_name_ptr_descriptor_indices;\n        cbuffer.variable_count = 1;\n        cbuffer.variables_ptr = (constant_position_dwords_descriptor_indices -\n                                 blob_position_dwords) *\n                                sizeof(uint32_t);\n        cbuffer.size_vector_aligned_bytes =\n            sizeof(uint32_t) *\n            xe::align(GetBindlessResourceCount(), uint32_t(4));\n      } else {\n        assert_unhandled_case(i);\n      }\n    }\n  }\n\n  // ***************************************************************************\n  // Bindings, in s#, t#, u#, cb# order\n  // ***************************************************************************\n\n  // Names, except for constant buffers because their names are written already.\n  name_ptr = (uint32_t(shader_object_.size()) - blob_position_dwords) *\n             sizeof(uint32_t);\n  uint32_t sampler_name_ptr = name_ptr;\n  if (!sampler_bindings_.empty()) {\n    if (bindless_resources_used_) {\n      name_ptr += dxbc::AppendAlignedString(shader_object_, \"xe_samplers\");\n    } else {\n      for (uint32_t i = 0; i < uint32_t(sampler_bindings_.size()); ++i) {\n        name_ptr += dxbc::AppendAlignedString(\n            shader_object_, sampler_bindings_[i].bindful_name.c_str());\n      }\n    }\n  }\n  uint32_t shared_memory_srv_name_ptr = name_ptr;\n  if (srv_index_shared_memory_ != kBindingIndexUnallocated) {\n    name_ptr +=\n        dxbc::AppendAlignedString(shader_object_, \"xe_shared_memory_srv\");\n  }\n  uint32_t bindless_textures_2d_name_ptr = name_ptr;\n  uint32_t bindless_textures_3d_name_ptr = name_ptr;\n  uint32_t bindless_textures_cube_name_ptr = name_ptr;\n  if (bindless_resources_used_) {\n    if (srv_index_bindless_textures_2d_ != kBindingIndexUnallocated) {\n      bindless_textures_2d_name_ptr = name_ptr;\n      name_ptr += dxbc::AppendAlignedString(shader_object_, \"xe_textures_2d\");\n    }\n    if (srv_index_bindless_textures_3d_ != kBindingIndexUnallocated) {\n      bindless_textures_3d_name_ptr = name_ptr;\n      name_ptr += dxbc::AppendAlignedString(shader_object_, \"xe_textures_3d\");\n    }\n    if (srv_index_bindless_textures_cube_ != kBindingIndexUnallocated) {\n      bindless_textures_cube_name_ptr = name_ptr;\n      name_ptr += dxbc::AppendAlignedString(shader_object_, \"xe_textures_cube\");\n    }\n  } else {\n    for (TextureBinding& texture_binding : texture_bindings_) {\n      texture_binding.bindful_srv_rdef_name_ptr = name_ptr;\n      name_ptr += dxbc::AppendAlignedString(\n          shader_object_, texture_binding.bindful_name.c_str());\n    }\n  }\n  uint32_t shared_memory_uav_name_ptr = name_ptr;\n  if (uav_index_shared_memory_ != kBindingIndexUnallocated) {\n    name_ptr +=\n        dxbc::AppendAlignedString(shader_object_, \"xe_shared_memory_uav\");\n  }\n  uint32_t edram_name_ptr = name_ptr;\n  if (uav_index_edram_ != kBindingIndexUnallocated) {\n    name_ptr += dxbc::AppendAlignedString(shader_object_, \"xe_edram\");\n  }\n\n  uint32_t bindings_position_dwords = uint32_t(shader_object_.size());\n\n  // Samplers.\n  if (!sampler_bindings_.empty()) {\n    uint32_t samplers_position_dwords = uint32_t(shader_object_.size());\n    shader_object_.resize(\n        samplers_position_dwords +\n        sizeof(dxbc::RdefInputBind) / sizeof(uint32_t) *\n            (bindless_resources_used_ ? 1 : sampler_bindings_.size()));\n    auto samplers = reinterpret_cast<dxbc::RdefInputBind*>(\n        shader_object_.data() + samplers_position_dwords);\n    if (bindless_resources_used_) {\n      // Bindless sampler heap.\n      samplers[0].name_ptr = sampler_name_ptr;\n      samplers[0].type = dxbc::RdefInputType::kSampler;\n    } else {\n      // Bindful samplers.\n      uint32_t sampler_current_name_ptr = sampler_name_ptr;\n      for (size_t i = 0; i < sampler_bindings_.size(); ++i) {\n        dxbc::RdefInputBind& sampler = samplers[i];\n        sampler.name_ptr = sampler_current_name_ptr;\n        sampler.type = dxbc::RdefInputType::kSampler;\n        sampler.bind_point = uint32_t(i);\n        sampler.bind_count = 1;\n        sampler.id = uint32_t(i);\n        sampler_current_name_ptr += dxbc::GetAlignedStringLength(\n            sampler_bindings_[i].bindful_name.c_str());\n      }\n    }\n  }\n\n  // Shader resource views, sorted by binding index.\n  uint32_t srvs_position_dwords = uint32_t(shader_object_.size());\n  shader_object_.resize(srvs_position_dwords + sizeof(dxbc::RdefInputBind) /\n                                                   sizeof(uint32_t) *\n                                                   srv_count_);\n  {\n    auto srvs = reinterpret_cast<dxbc::RdefInputBind*>(shader_object_.data() +\n                                                       srvs_position_dwords);\n    for (uint32_t i = 0; i < srv_count_; ++i) {\n      dxbc::RdefInputBind& srv = srvs[i];\n      srv.id = i;\n      if (i == srv_index_shared_memory_) {\n        // Shared memory (when memexport isn't used in the pipeline).\n        srv.name_ptr = shared_memory_srv_name_ptr;\n        srv.type = dxbc::RdefInputType::kByteAddress;\n        srv.return_type = dxbc::ResourceReturnType::kMixed;\n        srv.dimension = dxbc::RdefDimension::kSRVBuffer;\n        srv.bind_point = uint32_t(SRVMainRegister::kSharedMemory);\n        srv.bind_count = 1;\n        srv.bind_point_space = uint32_t(SRVSpace::kMain);\n      } else {\n        // Bindful texture or bindless textures.\n        srv.type = dxbc::RdefInputType::kTexture;\n        srv.return_type = dxbc::ResourceReturnType::kFloat;\n        srv.sample_count = UINT32_MAX;\n        srv.flags = dxbc::kRdefInputFlags4Component;\n        if (bindless_resources_used_) {\n          // Bindless texture heap.\n          if (i == srv_index_bindless_textures_3d_) {\n            srv.name_ptr = bindless_textures_3d_name_ptr;\n            srv.dimension = dxbc::RdefDimension::kSRVTexture3D;\n            srv.bind_point_space = uint32_t(SRVSpace::kBindlessTextures3D);\n          } else if (i == srv_index_bindless_textures_cube_) {\n            srv.name_ptr = bindless_textures_cube_name_ptr;\n            srv.dimension = dxbc::RdefDimension::kSRVTextureCube;\n            srv.bind_point_space = uint32_t(SRVSpace::kBindlessTexturesCube);\n          } else {\n            assert_true(i == srv_index_bindless_textures_2d_);\n            srv.name_ptr = bindless_textures_2d_name_ptr;\n            srv.dimension = dxbc::RdefDimension::kSRVTexture2DArray;\n            srv.bind_point_space = uint32_t(SRVSpace::kBindlessTextures2DArray);\n          }\n        } else {\n          // Bindful texture.\n          auto it = texture_bindings_for_bindful_srv_indices_.find(i);\n          assert_true(it != texture_bindings_for_bindful_srv_indices_.end());\n          uint32_t texture_binding_index = it->second;\n          const TextureBinding& texture_binding =\n              texture_bindings_[texture_binding_index];\n          srv.name_ptr = texture_binding.bindful_srv_rdef_name_ptr;\n          switch (texture_binding.dimension) {\n            case xenos::FetchOpDimension::k3DOrStacked:\n              srv.dimension = dxbc::RdefDimension::kSRVTexture3D;\n              break;\n            case xenos::FetchOpDimension::kCube:\n              srv.dimension = dxbc::RdefDimension::kSRVTextureCube;\n              break;\n            default:\n              assert_true(texture_binding.dimension ==\n                          xenos::FetchOpDimension::k2D);\n              srv.dimension = dxbc::RdefDimension::kSRVTexture2DArray;\n          }\n          srv.bind_point = uint32_t(SRVMainRegister::kBindfulTexturesStart) +\n                           texture_binding_index;\n          srv.bind_count = 1;\n          srv.bind_point_space = uint32_t(SRVSpace::kMain);\n        }\n      }\n    }\n  }\n\n  // Unordered access views, sorted by binding index.\n  uint32_t uavs_position_dwords = uint32_t(shader_object_.size());\n  shader_object_.resize(uavs_position_dwords + sizeof(dxbc::RdefInputBind) /\n                                                   sizeof(uint32_t) *\n                                                   uav_count_);\n  {\n    auto uavs = reinterpret_cast<dxbc::RdefInputBind*>(shader_object_.data() +\n                                                       uavs_position_dwords);\n    for (uint32_t i = 0; i < uav_count_; ++i) {\n      dxbc::RdefInputBind& uav = uavs[i];\n      uav.bind_count = 1;\n      uav.id = i;\n      if (i == uav_index_shared_memory_) {\n        // Shared memory (when memexport is used in the pipeline).\n        uav.name_ptr = shared_memory_uav_name_ptr;\n        uav.type = dxbc::RdefInputType::kUAVRWByteAddress;\n        uav.return_type = dxbc::ResourceReturnType::kMixed;\n        uav.dimension = dxbc::RdefDimension::kUAVBuffer;\n        uav.bind_point = uint32_t(UAVRegister::kSharedMemory);\n      } else if (i == uav_index_edram_) {\n        // EDRAM R32_UINT buffer.\n        uav.name_ptr = edram_name_ptr;\n        uav.type = dxbc::RdefInputType::kUAVRWTyped;\n        uav.return_type = dxbc::ResourceReturnType::kUInt;\n        uav.dimension = dxbc::RdefDimension::kUAVBuffer;\n        uav.sample_count = UINT32_MAX;\n        uav.bind_point = uint32_t(UAVRegister::kEdram);\n      } else {\n        assert_unhandled_case(i);\n      }\n    }\n  }\n\n  // Constant buffers.\n  uint32_t cbuffer_binding_position_dwords = uint32_t(shader_object_.size());\n  shader_object_.resize(cbuffer_binding_position_dwords +\n                        sizeof(dxbc::RdefInputBind) / sizeof(uint32_t) *\n                            cbuffer_count_);\n  {\n    auto cbuffers = reinterpret_cast<dxbc::RdefInputBind*>(\n        shader_object_.data() + cbuffer_binding_position_dwords);\n    for (uint32_t i = 0; i < cbuffer_count_; ++i) {\n      dxbc::RdefInputBind& cbuffer = cbuffers[i];\n      cbuffer.type = dxbc::RdefInputType::kCbuffer;\n      cbuffer.bind_count = 1;\n      // Like `cbuffer`, don't need `ConstantBuffer<T>` properties.\n      cbuffer.flags = dxbc::kRdefInputFlagUserPacked;\n      cbuffer.id = i;\n      if (i == cbuffer_index_system_constants_) {\n        cbuffer.name_ptr = cbuffer_name_ptr_system;\n        cbuffer.bind_point = uint32_t(CbufferRegister::kSystemConstants);\n      } else if (i == cbuffer_index_float_constants_) {\n        cbuffer.name_ptr = cbuffer_name_ptr_float;\n        cbuffer.bind_point = uint32_t(CbufferRegister::kFloatConstants);\n      } else if (i == cbuffer_index_bool_loop_constants_) {\n        cbuffer.name_ptr = cbuffer_name_ptr_bool_loop;\n        cbuffer.bind_point = uint32_t(CbufferRegister::kBoolLoopConstants);\n      } else if (i == cbuffer_index_fetch_constants_) {\n        cbuffer.name_ptr = cbuffer_name_ptr_fetch;\n        cbuffer.bind_point = uint32_t(CbufferRegister::kFetchConstants);\n      } else if (i == cbuffer_index_descriptor_indices_) {\n        cbuffer.name_ptr = cbuffer_name_ptr_descriptor_indices;\n        cbuffer.bind_point = uint32_t(CbufferRegister::kDescriptorIndices);\n      } else {\n        assert_unhandled_case(i);\n      }\n    }\n  }\n\n  uint32_t bindings_end_position_dwords = uint32_t(shader_object_.size());\n\n  // ***************************************************************************\n  // Header\n  // ***************************************************************************\n\n  {\n    auto& header = *reinterpret_cast<dxbc::RdefHeader*>(shader_object_.data() +\n                                                        blob_position_dwords);\n    header.cbuffer_count = cbuffer_count_;\n    header.cbuffers_ptr =\n        (cbuffers_position_dwords - blob_position_dwords) * sizeof(uint32_t);\n    header.input_bind_count =\n        (bindings_end_position_dwords - bindings_position_dwords) *\n        sizeof(uint32_t) / sizeof(dxbc::RdefInputBind);\n    header.input_binds_ptr =\n        (bindings_position_dwords - blob_position_dwords) * sizeof(uint32_t);\n    if (IsDxbcVertexShader()) {\n      header.shader_model = dxbc::RdefShaderModel::kVertexShader5_1;\n    } else if (IsDxbcDomainShader()) {\n      header.shader_model = dxbc::RdefShaderModel::kDomainShader5_1;\n    } else {\n      assert_true(is_pixel_shader());\n      header.shader_model = dxbc::RdefShaderModel::kPixelShader5_1;\n    }\n    header.compile_flags = dxbc::kCompileFlagNoPreshader |\n                           dxbc::kCompileFlagPreferFlowControl |\n                           dxbc::kCompileFlagIeeeStrictness;\n    if (bindless_resources_used_) {\n      header.compile_flags |= dxbc::kCompileFlagEnableUnboundedDescriptorTables;\n    }\n    // Generator name placed directly after the header.\n    header.generator_name_ptr = sizeof(dxbc::RdefHeader);\n    header.fourcc = dxbc::RdefHeader::FourCC::k5_1;\n    header.InitializeSizes();\n  }\n}\n\nvoid DxbcShaderTranslator::WriteInputSignature() {\n  // Because of shader_object_.resize(), pointers can't be kept persistently\n  // here! Resizing also zeroes the memory.\n  uint32_t blob_position = uint32_t(shader_object_.size());\n  // Reserve space for the header.\n  shader_object_.resize(shader_object_.size() +\n                        sizeof(dxbc::Signature) / sizeof(uint32_t));\n  uint32_t parameter_count = 0;\n  constexpr size_t kParameterDwords =\n      sizeof(dxbc::SignatureParameter) / sizeof(uint32_t);\n\n  if (IsDxbcVertexShader()) {\n    // Unswapped vertex index (SV_VertexID).\n    size_t vertex_id_position = shader_object_.size();\n    shader_object_.resize(shader_object_.size() + kParameterDwords);\n    ++parameter_count;\n    {\n      auto& vertex_id = *reinterpret_cast<dxbc::SignatureParameter*>(\n          shader_object_.data() + vertex_id_position);\n      vertex_id.system_value = dxbc::Name::kVertexID;\n      vertex_id.component_type = dxbc::SignatureRegisterComponentType::kUInt32;\n      vertex_id.register_index = kInRegisterVSVertexIndex;\n      vertex_id.mask = 0b0001;\n      vertex_id.always_reads_mask = (register_count() >= 1) ? 0b0001 : 0b0000;\n    }\n\n    // Semantic names.\n    uint32_t semantic_offset =\n        uint32_t((shader_object_.size() - blob_position) * sizeof(uint32_t));\n    {\n      auto& vertex_id = *reinterpret_cast<dxbc::SignatureParameter*>(\n          shader_object_.data() + vertex_id_position);\n      vertex_id.semantic_name_ptr = semantic_offset;\n    }\n    semantic_offset += dxbc::AppendAlignedString(shader_object_, \"SV_VertexID\");\n  } else if (IsDxbcDomainShader()) {\n    // Control point indices, byte-swapped, biased according to the base index\n    // and converted to float by the host vertex and hull shaders\n    // (XEVERTEXID).\n    size_t control_point_index_position = shader_object_.size();\n    shader_object_.resize(shader_object_.size() + kParameterDwords);\n    ++parameter_count;\n    {\n      auto& control_point_index = *reinterpret_cast<dxbc::SignatureParameter*>(\n          shader_object_.data() + control_point_index_position);\n      control_point_index.component_type =\n          dxbc::SignatureRegisterComponentType::kFloat32;\n      control_point_index.register_index = kInRegisterDSControlPointIndex;\n      control_point_index.mask = 0b0001;\n      control_point_index.always_reads_mask =\n          in_control_point_index_used_ ? 0b0001 : 0b0000;\n    }\n\n    // Semantic names.\n    uint32_t semantic_offset =\n        uint32_t((shader_object_.size() - blob_position) * sizeof(uint32_t));\n    {\n      auto& control_point_index = *reinterpret_cast<dxbc::SignatureParameter*>(\n          shader_object_.data() + control_point_index_position);\n      control_point_index.semantic_name_ptr = semantic_offset;\n    }\n    semantic_offset += dxbc::AppendAlignedString(shader_object_, \"XEVERTEXID\");\n  } else if (is_pixel_shader()) {\n    // Intepolators (TEXCOORD#).\n    size_t interpolator_position = shader_object_.size();\n    uint32_t interpolator_mask = GetModificationInterpolatorMask();\n    uint32_t interpolator_count = xe::bit_count(interpolator_mask);\n    shader_object_.resize(shader_object_.size() +\n                          interpolator_count * kParameterDwords);\n    parameter_count += interpolator_count;\n    {\n      auto interpolators = reinterpret_cast<dxbc::SignatureParameter*>(\n          shader_object_.data() + interpolator_position);\n      uint32_t used_interpolator_index = 0;\n      uint32_t interpolators_remaining = interpolator_mask;\n      uint32_t interpolator_index;\n      while (\n          xe::bit_scan_forward(interpolators_remaining, &interpolator_index)) {\n        interpolators_remaining &= ~(UINT32_C(1) << interpolator_index);\n        dxbc::SignatureParameter& interpolator =\n            interpolators[used_interpolator_index];\n        interpolator.semantic_index = used_interpolator_index;\n        interpolator.component_type =\n            dxbc::SignatureRegisterComponentType::kFloat32;\n        interpolator.register_index =\n            in_reg_ps_interpolators_ + used_interpolator_index;\n        interpolator.mask = 0b1111;\n        interpolator.always_reads_mask =\n            interpolator_index < register_count() ? 0b1111 : 0b0000;\n        ++used_interpolator_index;\n      }\n    }\n\n    // Point coordinates for PsParamGen (XESPRITETEXCOORD).\n    size_t point_coordinates_position = shader_object_.size();\n    if (in_reg_ps_point_coordinates_ != UINT32_MAX) {\n      shader_object_.resize(shader_object_.size() + kParameterDwords);\n      ++parameter_count;\n      {\n        auto& point_coordinates = *reinterpret_cast<dxbc::SignatureParameter*>(\n            shader_object_.data() + point_coordinates_position);\n        point_coordinates.component_type =\n            dxbc::SignatureRegisterComponentType::kFloat32;\n        point_coordinates.register_index = in_reg_ps_point_coordinates_;\n        point_coordinates.mask = 0b0011;\n        point_coordinates.always_reads_mask = 0b0011;\n      }\n    }\n\n    // Pixel position (SV_Position).\n    size_t position_position = shader_object_.size();\n    shader_object_.resize(shader_object_.size() + kParameterDwords);\n    ++parameter_count;\n    {\n      auto& position = *reinterpret_cast<dxbc::SignatureParameter*>(\n          shader_object_.data() + position_position);\n      position.system_value = dxbc::Name::kPosition;\n      position.component_type = dxbc::SignatureRegisterComponentType::kFloat32;\n      position.register_index = in_reg_ps_position_;\n      position.mask = 0b1111;\n      position.always_reads_mask = in_position_used_;\n    }\n\n    // Is front face (SV_IsFrontFace).\n    size_t is_front_face_position = shader_object_.size();\n    shader_object_.resize(shader_object_.size() + kParameterDwords);\n    ++parameter_count;\n    {\n      auto& is_front_face = *reinterpret_cast<dxbc::SignatureParameter*>(\n          shader_object_.data() + is_front_face_position);\n      is_front_face.system_value = dxbc::Name::kIsFrontFace;\n      is_front_face.component_type =\n          dxbc::SignatureRegisterComponentType::kUInt32;\n      is_front_face.register_index = in_reg_ps_front_face_sample_index_;\n      is_front_face.mask = 0b0001;\n      is_front_face.always_reads_mask = in_front_face_used_ ? 0b0001 : 0b0000;\n    }\n\n    // Sample index (SV_SampleIndex) for safe memexport with sample-rate\n    // shading.\n    size_t sample_index_position = SIZE_MAX;\n    if (current_shader().memexport_eM_written() && IsSampleRate()) {\n      size_t sample_index_position = shader_object_.size();\n      shader_object_.resize(shader_object_.size() + kParameterDwords);\n      ++parameter_count;\n      {\n        auto& sample_index = *reinterpret_cast<dxbc::SignatureParameter*>(\n            shader_object_.data() + sample_index_position);\n        sample_index.system_value = dxbc::Name::kSampleIndex;\n        sample_index.component_type =\n            dxbc::SignatureRegisterComponentType::kUInt32;\n        sample_index.register_index = in_reg_ps_front_face_sample_index_;\n        sample_index.mask = 0b0010;\n        sample_index.always_reads_mask = 0b0010;\n      }\n    }\n\n    // Semantic names.\n    uint32_t semantic_offset =\n        uint32_t((shader_object_.size() - blob_position) * sizeof(uint32_t));\n    if (interpolator_count) {\n      auto interpolators = reinterpret_cast<dxbc::SignatureParameter*>(\n          shader_object_.data() + interpolator_position);\n      for (uint32_t i = 0; i < interpolator_count; ++i) {\n        interpolators[i].semantic_name_ptr = semantic_offset;\n      }\n      semantic_offset += dxbc::AppendAlignedString(shader_object_, \"TEXCOORD\");\n    }\n    if (in_reg_ps_point_coordinates_ != UINT32_MAX) {\n      auto& point_coordinates = *reinterpret_cast<dxbc::SignatureParameter*>(\n          shader_object_.data() + point_coordinates_position);\n      point_coordinates.semantic_name_ptr = semantic_offset;\n      semantic_offset +=\n          dxbc::AppendAlignedString(shader_object_, \"XESPRITETEXCOORD\");\n    }\n    {\n      auto& position = *reinterpret_cast<dxbc::SignatureParameter*>(\n          shader_object_.data() + position_position);\n      position.semantic_name_ptr = semantic_offset;\n    }\n    semantic_offset += dxbc::AppendAlignedString(shader_object_, \"SV_Position\");\n    {\n      auto& is_front_face = *reinterpret_cast<dxbc::SignatureParameter*>(\n          shader_object_.data() + is_front_face_position);\n      is_front_face.semantic_name_ptr = semantic_offset;\n    }\n    semantic_offset +=\n        dxbc::AppendAlignedString(shader_object_, \"SV_IsFrontFace\");\n    if (sample_index_position != SIZE_MAX) {\n      {\n        auto& sample_index = *reinterpret_cast<dxbc::SignatureParameter*>(\n            shader_object_.data() + sample_index_position);\n        sample_index.semantic_name_ptr = semantic_offset;\n      }\n      semantic_offset +=\n          dxbc::AppendAlignedString(shader_object_, \"SV_SampleIndex\");\n    }\n  }\n\n  // Header.\n  {\n    auto& header = *reinterpret_cast<dxbc::Signature*>(shader_object_.data() +\n                                                       blob_position);\n    header.parameter_count = parameter_count;\n    header.parameter_info_ptr = sizeof(dxbc::Signature);\n  }\n}\n\nvoid DxbcShaderTranslator::WritePatchConstantSignature() {\n  assert_true(IsDxbcDomainShader());\n  // Because of shader_object_.resize(), pointers can't be kept persistently\n  // here! Resizing also zeroes the memory.\n  uint32_t blob_position = uint32_t(shader_object_.size());\n  // Reserve space for the header.\n  shader_object_.resize(shader_object_.size() +\n                        sizeof(dxbc::Signature) / sizeof(uint32_t));\n  uint32_t parameter_count = 0;\n  constexpr size_t kParameterDwords =\n      sizeof(dxbc::SignatureParameter) / sizeof(uint32_t);\n\n  // FXC always compiles with SV_TessFactor and SV_InsideTessFactor input, so\n  // this is required even if not referenced (HS and DS have very strict\n  // linkage, by the way, everything that HS outputs must be listed in DS\n  // inputs).\n  uint32_t tess_factor_edge_count = 0;\n  dxbc::Name tess_factor_edge_system_value = dxbc::Name::kUndefined;\n  uint32_t tess_factor_inside_count = 0;\n  dxbc::Name tess_factor_inside_system_value = dxbc::Name::kUndefined;\n  Shader::HostVertexShaderType host_vertex_shader_type =\n      GetDxbcShaderModification().vertex.host_vertex_shader_type;\n  switch (host_vertex_shader_type) {\n    case Shader::HostVertexShaderType::kTriangleDomainCPIndexed:\n    case Shader::HostVertexShaderType::kTriangleDomainPatchIndexed:\n      tess_factor_edge_count = 3;\n      tess_factor_edge_system_value = dxbc::Name::kFinalTriEdgeTessFactor;\n      tess_factor_inside_count = 1;\n      tess_factor_inside_system_value = dxbc::Name::kFinalTriInsideTessFactor;\n      break;\n    case Shader::HostVertexShaderType::kQuadDomainCPIndexed:\n    case Shader::HostVertexShaderType::kQuadDomainPatchIndexed:\n      tess_factor_edge_count = 4;\n      tess_factor_edge_system_value = dxbc::Name::kFinalQuadEdgeTessFactor;\n      tess_factor_inside_count = 2;\n      tess_factor_inside_system_value = dxbc::Name::kFinalQuadInsideTessFactor;\n      break;\n    default:\n      // TODO(Triang3l): Support line patches.\n      assert_unhandled_case(host_vertex_shader_type);\n      EmitTranslationError(\n          \"Unsupported host vertex shader type in WritePatchConstantSignature\");\n  }\n\n  // Edge tessellation factors (SV_TessFactor).\n  size_t tess_factor_edge_position = shader_object_.size();\n  shader_object_.resize(shader_object_.size() +\n                        tess_factor_edge_count * kParameterDwords);\n  parameter_count += tess_factor_edge_count;\n  {\n    auto tess_factors_edge = reinterpret_cast<dxbc::SignatureParameter*>(\n        shader_object_.data() + tess_factor_edge_position);\n    for (uint32_t i = 0; i < tess_factor_edge_count; ++i) {\n      dxbc::SignatureParameter& tess_factor_edge = tess_factors_edge[i];\n      tess_factor_edge.semantic_index = i;\n      tess_factor_edge.system_value = tess_factor_edge_system_value;\n      tess_factor_edge.component_type =\n          dxbc::SignatureRegisterComponentType::kFloat32;\n      // Not using any of these, just assigning consecutive registers.\n      tess_factor_edge.register_index = i;\n      tess_factor_edge.mask = 0b0001;\n    }\n  }\n\n  // Inside tessellation factors (SV_InsideTessFactor).\n  size_t tess_factor_inside_position = shader_object_.size();\n  shader_object_.resize(shader_object_.size() +\n                        tess_factor_inside_count * kParameterDwords);\n  parameter_count += tess_factor_inside_count;\n  {\n    auto tess_factors_inside = reinterpret_cast<dxbc::SignatureParameter*>(\n        shader_object_.data() + tess_factor_inside_position);\n    for (uint32_t i = 0; i < tess_factor_inside_count; ++i) {\n      dxbc::SignatureParameter& tess_factor_inside = tess_factors_inside[i];\n      tess_factor_inside.semantic_index = i;\n      tess_factor_inside.system_value = tess_factor_inside_system_value;\n      tess_factor_inside.component_type =\n          dxbc::SignatureRegisterComponentType::kFloat32;\n      // Not using any of these, just assigning consecutive registers.\n      tess_factor_inside.register_index = tess_factor_edge_count + i;\n      tess_factor_inside.mask = 0b0001;\n    }\n  }\n\n  // Semantic names.\n  uint32_t semantic_offset =\n      uint32_t((shader_object_.size() - blob_position) * sizeof(uint32_t));\n  {\n    auto tess_factors_edge = reinterpret_cast<dxbc::SignatureParameter*>(\n        shader_object_.data() + tess_factor_edge_position);\n    for (uint32_t i = 0; i < tess_factor_edge_count; ++i) {\n      tess_factors_edge[i].semantic_name_ptr = semantic_offset;\n    }\n  }\n  semantic_offset += dxbc::AppendAlignedString(shader_object_, \"SV_TessFactor\");\n  {\n    auto tess_factors_inside = reinterpret_cast<dxbc::SignatureParameter*>(\n        shader_object_.data() + tess_factor_inside_position);\n    for (uint32_t i = 0; i < tess_factor_inside_count; ++i) {\n      tess_factors_inside[i].semantic_name_ptr = semantic_offset;\n    }\n  }\n  semantic_offset +=\n      dxbc::AppendAlignedString(shader_object_, \"SV_InsideTessFactor\");\n\n  // Header.\n  {\n    auto& header = *reinterpret_cast<dxbc::Signature*>(shader_object_.data() +\n                                                       blob_position);\n    header.parameter_count = parameter_count;\n    header.parameter_info_ptr = sizeof(dxbc::Signature);\n  }\n}\n\nvoid DxbcShaderTranslator::WriteOutputSignature() {\n  // Because of shader_object_.resize(), pointers can't be kept persistently\n  // here! Resizing also zeroes the memory.\n  uint32_t blob_position = uint32_t(shader_object_.size());\n  // Reserve space for the header.\n  shader_object_.resize(shader_object_.size() +\n                        sizeof(dxbc::Signature) / sizeof(uint32_t));\n  uint32_t parameter_count = 0;\n  constexpr size_t kParameterDwords =\n      sizeof(dxbc::SignatureParameter) / sizeof(uint32_t);\n\n  Modification shader_modification = GetDxbcShaderModification();\n\n  if (is_vertex_shader()) {\n    // Intepolators (TEXCOORD#).\n    size_t interpolator_position = shader_object_.size();\n    uint32_t interpolator_count =\n        xe::bit_count(GetModificationInterpolatorMask());\n    shader_object_.resize(shader_object_.size() +\n                          interpolator_count * kParameterDwords);\n    parameter_count += interpolator_count;\n    {\n      auto interpolators = reinterpret_cast<dxbc::SignatureParameter*>(\n          shader_object_.data() + interpolator_position);\n      for (uint32_t i = 0; i < interpolator_count; ++i) {\n        dxbc::SignatureParameter& interpolator = interpolators[i];\n        interpolator.semantic_index = i;\n        interpolator.component_type =\n            dxbc::SignatureRegisterComponentType::kFloat32;\n        interpolator.register_index = out_reg_vs_interpolators_ + i;\n        interpolator.mask = 0b1111;\n      }\n    }\n\n    // Position (SV_Position).\n    size_t position_position = shader_object_.size();\n    shader_object_.resize(shader_object_.size() + kParameterDwords);\n    ++parameter_count;\n    {\n      auto& position = *reinterpret_cast<dxbc::SignatureParameter*>(\n          shader_object_.data() + position_position);\n      position.system_value = dxbc::Name::kPosition;\n      position.component_type = dxbc::SignatureRegisterComponentType::kFloat32;\n      position.register_index = out_reg_vs_position_;\n      position.mask = 0b1111;\n    }\n\n    // Clip (SV_ClipDistance) and cull (SV_CullDistance) distances.\n    size_t clip_and_cull_distance_position = shader_object_.size();\n    uint32_t clip_distance_count =\n        shader_modification.GetVertexClipDistanceCount();\n    uint32_t cull_distance_count =\n        shader_modification.GetVertexCullDistanceCount();\n    uint32_t clip_and_cull_distance_count =\n        clip_distance_count + cull_distance_count;\n    uint32_t clip_distance_parameter_count = 0;\n    uint32_t cull_distance_parameter_count = 0;\n    for (uint32_t i = 0; i < clip_and_cull_distance_count; i += 4) {\n      uint32_t clip_cull_distance_register =\n          out_reg_vs_clip_cull_distances_ + (i >> 2);\n      if (i < clip_distance_count) {\n        shader_object_.resize(shader_object_.size() + kParameterDwords);\n        ++parameter_count;\n        {\n          auto& clip_distance = *reinterpret_cast<dxbc::SignatureParameter*>(\n              shader_object_.data() +\n              (shader_object_.size() - kParameterDwords));\n          clip_distance.semantic_index = clip_distance_parameter_count;\n          clip_distance.system_value = dxbc::Name::kClipDistance;\n          clip_distance.component_type =\n              dxbc::SignatureRegisterComponentType::kFloat32;\n          clip_distance.register_index = clip_cull_distance_register;\n          uint8_t clip_distance_mask =\n              (UINT8_C(1) << std::min(clip_distance_count - i, UINT32_C(4))) -\n              1;\n          clip_distance.mask = clip_distance_mask;\n          clip_distance.never_writes_mask = clip_distance_mask ^ 0b1111;\n        }\n        ++clip_distance_parameter_count;\n      }\n      if (cull_distance_count && i + 4 > clip_distance_count) {\n        shader_object_.resize(shader_object_.size() + kParameterDwords);\n        ++parameter_count;\n        {\n          auto& cull_distance = *reinterpret_cast<dxbc::SignatureParameter*>(\n              shader_object_.data() +\n              (shader_object_.size() - kParameterDwords));\n          cull_distance.semantic_index = cull_distance_parameter_count;\n          cull_distance.system_value = dxbc::Name::kCullDistance;\n          cull_distance.component_type =\n              dxbc::SignatureRegisterComponentType::kFloat32;\n          cull_distance.register_index = clip_cull_distance_register;\n          uint8_t cull_distance_mask =\n              (UINT8_C(1) << std::min(cull_distance_count - i, UINT32_C(4))) -\n              1;\n          if (i < clip_distance_count) {\n            cull_distance_mask &=\n                ~((UINT8_C(1) << (clip_distance_count - i)) - 1);\n          }\n          cull_distance.mask = cull_distance_mask;\n          cull_distance.never_writes_mask = cull_distance_mask ^ 0b1111;\n        }\n        ++cull_distance_parameter_count;\n      }\n    }\n\n    // Point size (XEPSIZE). Always used because reset to -1.\n    size_t point_size_position = shader_object_.size();\n    if (out_reg_vs_point_size_ != UINT32_MAX) {\n      shader_object_.resize(shader_object_.size() + kParameterDwords);\n      ++parameter_count;\n      {\n        auto& point_size = *reinterpret_cast<dxbc::SignatureParameter*>(\n            shader_object_.data() + point_size_position);\n        point_size.component_type =\n            dxbc::SignatureRegisterComponentType::kFloat32;\n        point_size.register_index = out_reg_vs_point_size_;\n        point_size.mask = 0b0001;\n        point_size.never_writes_mask = 0b1110;\n      }\n    }\n\n    // Semantic names.\n    uint32_t semantic_offset =\n        uint32_t((shader_object_.size() - blob_position) * sizeof(uint32_t));\n    if (interpolator_count) {\n      {\n        auto interpolators = reinterpret_cast<dxbc::SignatureParameter*>(\n            shader_object_.data() + interpolator_position);\n        for (uint32_t i = 0; i < interpolator_count; ++i) {\n          interpolators[i].semantic_name_ptr = semantic_offset;\n        }\n      }\n      semantic_offset += dxbc::AppendAlignedString(shader_object_, \"TEXCOORD\");\n    }\n    {\n      auto& position = *reinterpret_cast<dxbc::SignatureParameter*>(\n          shader_object_.data() + position_position);\n      position.semantic_name_ptr = semantic_offset;\n    }\n    semantic_offset += dxbc::AppendAlignedString(shader_object_, \"SV_Position\");\n    if (clip_distance_parameter_count) {\n      {\n        auto clip_distances = reinterpret_cast<dxbc::SignatureParameter*>(\n            shader_object_.data() + clip_and_cull_distance_position);\n        for (uint32_t i = 0; i < clip_distance_parameter_count; ++i) {\n          clip_distances[i].semantic_name_ptr = semantic_offset;\n        }\n      }\n      semantic_offset +=\n          dxbc::AppendAlignedString(shader_object_, \"SV_ClipDistance\");\n    }\n    if (cull_distance_parameter_count) {\n      {\n        auto cull_distances =\n            reinterpret_cast<dxbc::SignatureParameter*>(\n                shader_object_.data() + clip_and_cull_distance_position) +\n            clip_distance_parameter_count;\n        for (uint32_t i = 0; i < cull_distance_parameter_count; ++i) {\n          cull_distances[i].semantic_name_ptr = semantic_offset;\n        }\n      }\n      semantic_offset +=\n          dxbc::AppendAlignedString(shader_object_, \"SV_CullDistance\");\n    }\n    if (out_reg_vs_point_size_ != UINT32_MAX) {\n      {\n        auto& point_size = *reinterpret_cast<dxbc::SignatureParameter*>(\n            shader_object_.data() + point_size_position);\n        point_size.semantic_name_ptr = semantic_offset;\n      }\n      semantic_offset += dxbc::AppendAlignedString(shader_object_, \"XEPSIZE\");\n    }\n  } else if (is_pixel_shader()) {\n    if (!edram_rov_used_) {\n      uint32_t color_targets_written = current_shader().writes_color_targets();\n\n      // Color render targets (SV_Target#).\n      size_t target_position = SIZE_MAX;\n      uint32_t color_targets_written_count =\n          xe::bit_count(color_targets_written);\n      if (color_targets_written) {\n        target_position = shader_object_.size();\n        shader_object_.resize(shader_object_.size() +\n                              color_targets_written_count * kParameterDwords);\n        parameter_count += color_targets_written_count;\n        auto targets = reinterpret_cast<dxbc::SignatureParameter*>(\n            shader_object_.data() + target_position);\n        uint32_t target_index = 0;\n        for (uint32_t i = 0; i < xenos::kMaxColorRenderTargets; ++i) {\n          if (!(color_targets_written & (uint32_t(1) << i))) {\n            continue;\n          }\n          dxbc::SignatureParameter& target = targets[target_index++];\n          target.semantic_index = i;\n          target.component_type =\n              dxbc::SignatureRegisterComponentType::kFloat32;\n          target.register_index = i;\n          target.mask = 0b1111;\n        }\n      }\n\n      // Coverage output for alpha to mask (SV_Coverage).\n      size_t coverage_position = SIZE_MAX;\n      if ((color_targets_written & 0b1) &&\n          !IsForceEarlyDepthStencilGlobalFlagEnabled()) {\n        coverage_position = shader_object_.size();\n        shader_object_.resize(shader_object_.size() + kParameterDwords);\n        ++parameter_count;\n        auto& coverage = *reinterpret_cast<dxbc::SignatureParameter*>(\n            shader_object_.data() + coverage_position);\n        coverage.component_type = dxbc::SignatureRegisterComponentType::kUInt32;\n        coverage.register_index = UINT32_MAX;\n        coverage.mask = 0b0001;\n        coverage.never_writes_mask = 0b1110;\n      }\n\n      // Depth (SV_Depth or SV_DepthLessEqual).\n      size_t depth_position = SIZE_MAX;\n      if (current_shader().writes_depth() || DSV_IsWritingFloat24Depth()) {\n        depth_position = shader_object_.size();\n        shader_object_.resize(shader_object_.size() + kParameterDwords);\n        ++parameter_count;\n        auto& depth = *reinterpret_cast<dxbc::SignatureParameter*>(\n            shader_object_.data() + depth_position);\n        depth.component_type = dxbc::SignatureRegisterComponentType::kFloat32;\n        depth.register_index = UINT32_MAX;\n        depth.mask = 0b0001;\n        depth.never_writes_mask = 0b1110;\n      }\n\n      // Semantic names.\n      uint32_t semantic_offset =\n          uint32_t((shader_object_.size() - blob_position) * sizeof(uint32_t));\n      if (target_position != SIZE_MAX) {\n        {\n          auto targets = reinterpret_cast<dxbc::SignatureParameter*>(\n              shader_object_.data() + target_position);\n          for (uint32_t i = 0; i < color_targets_written_count; ++i) {\n            targets[i].semantic_name_ptr = semantic_offset;\n          }\n        }\n        semantic_offset +=\n            dxbc::AppendAlignedString(shader_object_, \"SV_Target\");\n      }\n      if (coverage_position != SIZE_MAX) {\n        {\n          auto& coverage = *reinterpret_cast<dxbc::SignatureParameter*>(\n              shader_object_.data() + coverage_position);\n          coverage.semantic_name_ptr = semantic_offset;\n        }\n        semantic_offset +=\n            dxbc::AppendAlignedString(shader_object_, \"SV_Coverage\");\n      }\n      if (depth_position != SIZE_MAX) {\n        {\n          auto& depth = *reinterpret_cast<dxbc::SignatureParameter*>(\n              shader_object_.data() + depth_position);\n          depth.semantic_name_ptr = semantic_offset;\n        }\n        const char* depth_semantic_name;\n        if (!current_shader().writes_depth() &&\n            shader_modification.pixel.depth_stencil_mode ==\n                Modification::DepthStencilMode::kFloat24Truncating) {\n          depth_semantic_name = \"SV_DepthLessEqual\";\n        } else {\n          depth_semantic_name = \"SV_Depth\";\n        }\n        semantic_offset +=\n            dxbc::AppendAlignedString(shader_object_, depth_semantic_name);\n      }\n    }\n  }\n\n  // Header.\n  {\n    auto& header = *reinterpret_cast<dxbc::Signature*>(shader_object_.data() +\n                                                       blob_position);\n    header.parameter_count = parameter_count;\n    header.parameter_info_ptr = sizeof(dxbc::Signature);\n  }\n}\n\nvoid DxbcShaderTranslator::WriteShaderCode() {\n  uint32_t blob_position_dwords = uint32_t(shader_object_.size());\n\n  dxbc::ProgramType program_type;\n  if (IsDxbcVertexShader()) {\n    program_type = dxbc::ProgramType::kVertexShader;\n  } else if (IsDxbcDomainShader()) {\n    program_type = dxbc::ProgramType::kDomainShader;\n  } else {\n    assert_true(is_pixel_shader());\n    program_type = dxbc::ProgramType::kPixelShader;\n  }\n  shader_object_.push_back(dxbc::VersionToken(program_type, 5, 1));\n  // Reserve space for the length token.\n  shader_object_.push_back(0);\n\n  Modification shader_modification = GetDxbcShaderModification();\n\n  uint32_t control_point_count = 1;\n  if (IsDxbcDomainShader()) {\n    dxbc::TessellatorDomain tessellator_domain =\n        dxbc::TessellatorDomain::kTriangle;\n    switch (shader_modification.vertex.host_vertex_shader_type) {\n      case Shader::HostVertexShaderType::kTriangleDomainCPIndexed:\n        control_point_count = 3;\n        tessellator_domain = dxbc::TessellatorDomain::kTriangle;\n        break;\n      case Shader::HostVertexShaderType::kTriangleDomainPatchIndexed:\n        control_point_count = 1;\n        tessellator_domain = dxbc::TessellatorDomain::kTriangle;\n        break;\n      case Shader::HostVertexShaderType::kQuadDomainCPIndexed:\n        control_point_count = 4;\n        tessellator_domain = dxbc::TessellatorDomain::kQuad;\n        break;\n      case Shader::HostVertexShaderType::kQuadDomainPatchIndexed:\n        control_point_count = 1;\n        tessellator_domain = dxbc::TessellatorDomain::kQuad;\n        break;\n      default:\n        // TODO(Triang3l): Support line patches.\n        assert_unhandled_case(\n            shader_modification.vertex.host_vertex_shader_type);\n        EmitTranslationError(\n            \"Unsupported host vertex shader type in WriteShaderCode\");\n    }\n    ao_.OpDclInputControlPointCount(control_point_count);\n    ao_.OpDclTessDomain(tessellator_domain);\n  }\n\n  // Don't allow refactoring when converting to native code to maintain position\n  // invariance (needed even in pixel shaders for oDepth invariance).\n  bool global_flag_force_early_depth_stencil =\n      IsForceEarlyDepthStencilGlobalFlagEnabled();\n  ao_.OpDclGlobalFlags(global_flag_force_early_depth_stencil\n                           ? dxbc::kGlobalFlagForceEarlyDepthStencil\n                           : 0);\n\n  // Constant buffers, from most frequenly accessed to least frequently accessed\n  // (the order is a hint to the driver according to the DXBC header).\n  if (cbuffer_index_float_constants_ != kBindingIndexUnallocated) {\n    const Shader::ConstantRegisterMap& constant_register_map =\n        current_shader().constant_register_map();\n    assert_not_zero(constant_register_map.float_count);\n    ao_.OpDclConstantBuffer(\n        dxbc::Src::CB(dxbc::Src::Dcl, cbuffer_index_float_constants_,\n                      uint32_t(CbufferRegister::kFloatConstants),\n                      uint32_t(CbufferRegister::kFloatConstants)),\n        constant_register_map.float_count,\n        constant_register_map.float_dynamic_addressing\n            ? dxbc::ConstantBufferAccessPattern::kDynamicIndexed\n            : dxbc::ConstantBufferAccessPattern::kImmediateIndexed);\n  }\n  if (cbuffer_index_system_constants_ != kBindingIndexUnallocated) {\n    ao_.OpDclConstantBuffer(\n        dxbc::Src::CB(dxbc::Src::Dcl, cbuffer_index_system_constants_,\n                      uint32_t(CbufferRegister::kSystemConstants),\n                      uint32_t(CbufferRegister::kSystemConstants)),\n        (sizeof(SystemConstants) + 15) >> 4);\n  }\n  if (cbuffer_index_fetch_constants_ != kBindingIndexUnallocated) {\n    ao_.OpDclConstantBuffer(\n        dxbc::Src::CB(dxbc::Src::Dcl, cbuffer_index_fetch_constants_,\n                      uint32_t(CbufferRegister::kFetchConstants),\n                      uint32_t(CbufferRegister::kFetchConstants)),\n        48);\n  }\n  if (cbuffer_index_descriptor_indices_ != kBindingIndexUnallocated) {\n    assert_not_zero(GetBindlessResourceCount());\n    ao_.OpDclConstantBuffer(\n        dxbc::Src::CB(dxbc::Src::Dcl, cbuffer_index_descriptor_indices_,\n                      uint32_t(CbufferRegister::kDescriptorIndices),\n                      uint32_t(CbufferRegister::kDescriptorIndices)),\n        (GetBindlessResourceCount() + 3) >> 2);\n  }\n  if (cbuffer_index_bool_loop_constants_ != kBindingIndexUnallocated) {\n    ao_.OpDclConstantBuffer(\n        dxbc::Src::CB(dxbc::Src::Dcl, cbuffer_index_bool_loop_constants_,\n                      uint32_t(CbufferRegister::kBoolLoopConstants),\n                      uint32_t(CbufferRegister::kBoolLoopConstants)),\n        2 + 8);\n  }\n\n  // Samplers.\n  if (!sampler_bindings_.empty()) {\n    if (bindless_resources_used_) {\n      // Bindless sampler heap.\n      ao_.OpDclSampler(dxbc::Src::S(dxbc::Src::Dcl, 0, 0, UINT32_MAX));\n    } else {\n      // Bindful samplers.\n      for (uint32_t i = 0; i < uint32_t(sampler_bindings_.size()); ++i) {\n        const SamplerBinding& sampler_binding = sampler_bindings_[i];\n        ao_.OpDclSampler(dxbc::Src::S(dxbc::Src::Dcl, i, i, i));\n      }\n    }\n  }\n\n  // Shader resource views, sorted by binding index.\n  for (uint32_t i = 0; i < srv_count_; ++i) {\n    if (i == srv_index_shared_memory_) {\n      // Shared memory ByteAddressBuffer.\n      ao_.OpDclResourceRaw(\n          dxbc::Src::T(dxbc::Src::Dcl, srv_index_shared_memory_,\n                       uint32_t(SRVMainRegister::kSharedMemory),\n                       uint32_t(SRVMainRegister::kSharedMemory)),\n          uint32_t(SRVSpace::kMain));\n    } else {\n      // Texture or texture heap.\n      dxbc::ResourceDimension texture_dimension;\n      uint32_t texture_register_lower_bound, texture_register_upper_bound;\n      SRVSpace texture_register_space;\n      if (bindless_resources_used_) {\n        // Bindless texture heap.\n        texture_register_lower_bound = 0;\n        texture_register_upper_bound = UINT32_MAX;\n        if (i == srv_index_bindless_textures_3d_) {\n          texture_dimension = dxbc::ResourceDimension::kTexture3D;\n          texture_register_space = SRVSpace::kBindlessTextures3D;\n        } else if (i == srv_index_bindless_textures_cube_) {\n          texture_dimension = dxbc::ResourceDimension::kTextureCube;\n          texture_register_space = SRVSpace::kBindlessTexturesCube;\n        } else {\n          assert_true(i == srv_index_bindless_textures_2d_);\n          texture_dimension = dxbc::ResourceDimension::kTexture2DArray;\n          texture_register_space = SRVSpace::kBindlessTextures2DArray;\n        }\n      } else {\n        // Bindful texture.\n        auto it = texture_bindings_for_bindful_srv_indices_.find(i);\n        assert_true(it != texture_bindings_for_bindful_srv_indices_.end());\n        uint32_t texture_binding_index = it->second;\n        const TextureBinding& texture_binding =\n            texture_bindings_[texture_binding_index];\n        switch (texture_binding.dimension) {\n          case xenos::FetchOpDimension::k3DOrStacked:\n            texture_dimension = dxbc::ResourceDimension::kTexture3D;\n            break;\n          case xenos::FetchOpDimension::kCube:\n            texture_dimension = dxbc::ResourceDimension::kTextureCube;\n            break;\n          default:\n            assert_true(texture_binding.dimension ==\n                        xenos::FetchOpDimension::k2D);\n            texture_dimension = dxbc::ResourceDimension::kTexture2DArray;\n        }\n        texture_register_lower_bound =\n            uint32_t(SRVMainRegister::kBindfulTexturesStart) +\n            texture_binding_index;\n        texture_register_upper_bound = texture_register_lower_bound;\n        texture_register_space = SRVSpace::kMain;\n      }\n      ao_.OpDclResource(\n          texture_dimension,\n          dxbc::ResourceReturnTypeX4Token(dxbc::ResourceReturnType::kFloat),\n          dxbc::Src::T(dxbc::Src::Dcl, i, texture_register_lower_bound,\n                       texture_register_upper_bound),\n          uint32_t(texture_register_space));\n    }\n  }\n\n  // Unordered access views, sorted by binding index.\n  for (uint32_t i = 0; i < uav_count_; ++i) {\n    if (i == uav_index_shared_memory_) {\n      // Shared memory RWByteAddressBuffer.\n      if (!is_pixel_shader()) {\n        shader_feature_info_.feature_flags[0] |=\n            dxbc::kShaderFeature0_UAVsAtEveryStage;\n      }\n      ao_.OpDclUnorderedAccessViewRaw(\n          0, dxbc::Src::U(dxbc::Src::Dcl, uav_index_shared_memory_,\n                          uint32_t(UAVRegister::kSharedMemory),\n                          uint32_t(UAVRegister::kSharedMemory)));\n    } else if (i == uav_index_edram_) {\n      // EDRAM buffer R32_UINT rasterizer-ordered view.\n      shader_feature_info_.feature_flags[0] |= dxbc::kShaderFeature0_ROVs;\n      ao_.OpDclUnorderedAccessViewTyped(\n          dxbc::ResourceDimension::kBuffer,\n          dxbc::kUAVFlagRasterizerOrderedAccess,\n          dxbc::ResourceReturnTypeX4Token(dxbc::ResourceReturnType::kUInt),\n          dxbc::Src::U(dxbc::Src::Dcl, uav_index_edram_,\n                       uint32_t(UAVRegister::kEdram),\n                       uint32_t(UAVRegister::kEdram)));\n    } else {\n      assert_unhandled_case(i);\n    }\n  }\n\n  // Inputs and outputs.\n  if (is_vertex_shader()) {\n    if (IsDxbcDomainShader()) {\n      if (in_domain_location_used_) {\n        // Domain location input.\n        ao_.OpDclInput(dxbc::Dest::VDomain(in_domain_location_used_));\n      }\n      if (in_control_point_index_used_) {\n        ao_.OpDclInput(dxbc::Dest::VICP(\n            control_point_count, kInRegisterDSControlPointIndex, 0b0001));\n      }\n    } else {\n      if (register_count()) {\n        // Unswapped vertex index input (only X component).\n        ao_.OpDclInputSGV(dxbc::Dest::V1D(kInRegisterVSVertexIndex, 0b0001),\n                          dxbc::Name::kVertexID);\n      }\n    }\n    // Interpolator output.\n    uint32_t interpolator_count =\n        xe::bit_count(GetModificationInterpolatorMask());\n    for (uint32_t i = 0; i < interpolator_count; ++i) {\n      ao_.OpDclOutput(dxbc::Dest::O(out_reg_vs_interpolators_ + i));\n    }\n    // Position output.\n    ao_.OpDclOutputSIV(dxbc::Dest::O(out_reg_vs_position_),\n                       dxbc::Name::kPosition);\n    // Clip and cull distance outputs.\n    uint32_t clip_distance_count =\n        shader_modification.GetVertexClipDistanceCount();\n    uint32_t cull_distance_count =\n        shader_modification.GetVertexCullDistanceCount();\n    uint32_t clip_and_cull_distance_count =\n        clip_distance_count + cull_distance_count;\n    for (uint32_t i = 0; i < clip_and_cull_distance_count; i += 4) {\n      if (i < clip_distance_count) {\n        ao_.OpDclOutputSIV(\n            dxbc::Dest::O(out_reg_vs_clip_cull_distances_ + (i >> 2),\n                          (UINT32_C(1)\n                           << std::min(clip_distance_count - i, UINT32_C(4))) -\n                              1),\n            dxbc::Name::kClipDistance);\n      }\n      if (cull_distance_count && i + 4 > clip_distance_count) {\n        uint32_t cull_distance_mask =\n            (UINT32_C(1) << std::min(clip_and_cull_distance_count - i,\n                                     UINT32_C(4))) -\n            1;\n        if (i < clip_distance_count) {\n          cull_distance_mask &=\n              ~((UINT32_C(1) << (clip_distance_count - i)) - 1);\n        }\n        ao_.OpDclOutputSIV(\n            dxbc::Dest::O(out_reg_vs_clip_cull_distances_ + (i >> 2),\n                          cull_distance_mask),\n            dxbc::Name::kCullDistance);\n      }\n    }\n    // Point size output.\n    if (out_reg_vs_point_size_ != UINT32_MAX) {\n      ao_.OpDclOutput(dxbc::Dest::O(out_reg_vs_point_size_, 0b0001));\n    }\n  } else if (is_pixel_shader()) {\n    bool is_writing_float24_depth = DSV_IsWritingFloat24Depth();\n    bool shader_writes_depth = current_shader().writes_depth();\n    // Interpolator input.\n    uint32_t interpolator_register_index = in_reg_ps_interpolators_;\n    uint32_t interpolators_remaining = GetModificationInterpolatorMask();\n    uint32_t interpolator_index;\n    while (xe::bit_scan_forward(interpolators_remaining, &interpolator_index)) {\n      interpolators_remaining &= ~(UINT32_C(1) << interpolator_index);\n      if (interpolator_index >= register_count()) {\n        break;\n      }\n      ao_.OpDclInputPS((shader_modification.pixel.interpolators_centroid &\n                        (UINT32_C(1) << interpolator_index))\n                           ? dxbc::InterpolationMode::kLinearCentroid\n                           : dxbc::InterpolationMode::kLinear,\n                       dxbc::Dest::V1D(interpolator_register_index));\n      ++interpolator_register_index;\n    }\n    if (in_reg_ps_point_coordinates_ != UINT32_MAX) {\n      // Point coordinates input.\n      ao_.OpDclInputPS(dxbc::InterpolationMode::kLinear,\n                       dxbc::Dest::V1D(in_reg_ps_point_coordinates_, 0b0011));\n    }\n    if (in_position_used_) {\n      // Position input (XY needed for ps_param_gen, Z needed for non-ROV\n      // float24 conversion; the ROV depth code calculates the depth the from\n      // clip space Z and W with pull-mode per-sample interpolation instead).\n      // At the cost of possibility of MSAA with pixel-rate shading, need\n      // per-sample depth - otherwise intersections cannot be antialiased, and\n      // with SV_DepthLessEqual, per-sample (or centroid, but this isn't\n      // applicable here) position is mandatory. However, with depth output, on\n      // the guest, there's only one depth value for the whole pixel.\n      ao_.OpDclInputPSSIV(\n          (is_writing_float24_depth && !shader_writes_depth)\n              ? dxbc::InterpolationMode::kLinearNoPerspectiveSample\n              : dxbc::InterpolationMode::kLinearNoPerspective,\n          dxbc::Dest::V1D(in_reg_ps_position_, in_position_used_),\n          dxbc::Name::kPosition);\n    }\n    bool sample_rate_memexport =\n        current_shader().memexport_eM_written() && IsSampleRate();\n    // Sample-rate shading can't be done with UAV-only rendering (sample-rate\n    // shading is only needed for float24 depth conversion when using a float32\n    // host depth buffer).\n    assert_false(sample_rate_memexport && edram_rov_used_);\n    uint32_t front_face_and_sample_index_mask =\n        uint32_t(in_front_face_used_) | (uint32_t(sample_rate_memexport) << 1);\n    if (front_face_and_sample_index_mask) {\n      // Is front face, sample index.\n      ao_.OpDclInputPSSGV(dxbc::Dest::V1D(in_reg_ps_front_face_sample_index_,\n                                          front_face_and_sample_index_mask),\n                          dxbc::Name::kIsFrontFace);\n    }\n    if (edram_rov_used_) {\n      // Sample coverage input.\n      ao_.OpDclInput(dxbc::Dest::VCoverage());\n    } else {\n      if (sample_rate_memexport) {\n        // Sample coverage input.\n        ao_.OpDclInput(dxbc::Dest::VCoverage());\n      }\n      // Color output.\n      uint32_t color_targets_written = current_shader().writes_color_targets();\n      for (uint32_t i = 0; i < xenos::kMaxColorRenderTargets; ++i) {\n        if (color_targets_written & (uint32_t(1) << i)) {\n          ao_.OpDclOutput(dxbc::Dest::O(i));\n        }\n      }\n      // Coverage output for alpha to mask.\n      if ((color_targets_written & 0b1) &&\n          !global_flag_force_early_depth_stencil) {\n        ao_.OpDclOutput(dxbc::Dest::OMask());\n      }\n      // Depth output.\n      if (is_writing_float24_depth || shader_writes_depth) {\n        if (!shader_writes_depth &&\n            GetDxbcShaderModification().pixel.depth_stencil_mode ==\n                Modification::DepthStencilMode::kFloat24Truncating) {\n          ao_.OpDclOutput(dxbc::Dest::ODepthLE());\n        } else {\n          ao_.OpDclOutput(dxbc::Dest::ODepth());\n        }\n      }\n    }\n  }\n\n  // Temporary registers - guest general-purpose registers if not using dynamic\n  // indexing and Xenia internal registers.\n  uint32_t temp_register_count = system_temp_count_max_;\n  if (!is_depth_only_pixel_shader_ &&\n      !current_shader().uses_register_dynamic_addressing()) {\n    temp_register_count += register_count();\n  }\n  if (temp_register_count) {\n    ao_.OpDclTemps(temp_register_count);\n  }\n  // General-purpose registers if using dynamic indexing (x0).\n  if (!is_depth_only_pixel_shader_ &&\n      current_shader().uses_register_dynamic_addressing()) {\n    assert_not_zero(register_count());\n    ao_.OpDclIndexableTemp(0, register_count(), 4);\n  }\n\n  // Write the translated shader code.\n  size_t code_size_dwords = shader_code_.size();\n  if (code_size_dwords) {\n    shader_object_.resize(shader_object_.size() + code_size_dwords);\n    std::memcpy(\n        shader_object_.data() + (shader_object_.size() - code_size_dwords),\n        shader_code_.data(), code_size_dwords * sizeof(uint32_t));\n  }\n\n  // Write the length.\n  shader_object_[blob_position_dwords + 1] =\n      uint32_t(shader_object_.size()) - blob_position_dwords;\n}\n\n}  // namespace gpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/dxbc_shader_translator.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_DXBC_SHADER_TRANSLATOR_H_\n#define XENIA_GPU_DXBC_SHADER_TRANSLATOR_H_\n\n#include <cstddef>\n#include <cstring>\n#include <string>\n#include <vector>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/string_buffer.h\"\n#include \"xenia/gpu/dxbc.h\"\n#include \"xenia/gpu/shader_translator.h\"\n#include \"xenia/gpu/ucode.h\"\n#include \"xenia/ui/graphics_provider.h\"\n\nnamespace xe {\nnamespace gpu {\n\n// Generates shader model 5_1 byte code (for Direct3D 12).\n//\n// IMPORTANT CONTRIBUTION NOTES:\n//\n// While DXBC may look like a flexible and high-level representation with highly\n// generalized building blocks, actually it has a lot of restrictions on operand\n// usage!\n// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n// !!!DO NOT ADD ANYTHING FXC THAT WOULD NOT PRODUCE!!!\n// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n// Before adding any sequence that you haven't seen in Xenia, try writing\n// equivalent code in HLSL and running it through FXC, try with /Od, try with\n// full optimization, but if you see that FXC follows a different pattern than\n// what you are expecting, do what FXC does!!!\n// SEE THE NOTES DXBC.H BEFORE WRITING ANYTHING RELATED TO DXBC!\nclass DxbcShaderTranslator : public ShaderTranslator {\n public:\n  DxbcShaderTranslator(ui::GraphicsProvider::GpuVendorID vendor_id,\n                       bool bindless_resources_used, bool edram_rov_used,\n                       bool gamma_render_target_as_unorm8 = false,\n                       bool msaa_2x_supported = true,\n                       uint32_t draw_resolution_scale_x = 1,\n                       uint32_t draw_resolution_scale_y = 1,\n                       bool force_emit_source_map = false);\n  ~DxbcShaderTranslator() override;\n\n  // Stage linkage ordering and rules (must be respected not only within the\n  // DxbcShaderTranslator, but also by everything else between the VS and the\n  // PS, such as geometry shaders for primitive types, and built-in pixel\n  // shaders for processing the fragment depth when there's no guest pixel\n  // shader):\n  //\n  // Note that VS means the guest VS here - can be VS or DS on the host. RS\n  // means the fixed-function rasterizer.\n  //\n  // The beginning of the parameters must match between the output of the\n  // producing stage and the input of the consuming stage, while the tail can be\n  // stage-specific or cut off.\n  //\n  // - Interpolators (TEXCOORD) - VS > GS > RS > PS, used interpolators are all\n  //   unconditionally referenced in all these stages.\n  // - Point coordinates (XESPRITETEXCOORD) - GS > RS > PS, must be present in\n  //   none or in all, if drawing points, and PsParamGen is used.\n  // - Position (SV_Position) - VS > GS > RS > PS, used in PS if actually needed\n  //   for something (PsParamGen, alpha to coverage when oC0 is written, depth\n  //   conversion, ROV render backend), the presence in PS depends on the usage\n  //   within the PS, not on linkage, therefore it's the last in PS so it can be\n  //   dropped from PS without effect on linkage.\n  // - Clip distances (SV_ClipDistance) - VS > GS > RS.\n  // - Cull distances (SV_CullDistance) - VS > RS or VS > GS.\n  // - Vertex kill AND operator (SV_CullDistance) - VS > RS or VS > GS.\n  // - Point size (XEPSIZE) - VS > GS.\n  //\n  // Therefore, for the direct VS > PS path, the parameters may be the\n  // following:\n  // - Shared between VS and PS:\n  //   - Interpolators (TEXCOORD).\n  //   - Position (SV_Position).\n  // - VS output only:\n  //   - Clip distances (SV_ClipDistance).\n  //   - Cull distances (SV_CullDistance).\n  //   - Vertex kill AND operator (SV_CullDistance).\n  //\n  // When a GS is also used, the path between the VS and the GS is:\n  // - Shared between VS and GS:\n  //   - Interpolators (TEXCOORD).\n  //   - Position (SV_Position).\n  //   - Clip distances (SV_ClipDistance).\n  //   - Cull distances (SV_CullDistance).\n  //   - Vertex kill AND operator (SV_CullDistance).\n  //   - Point size (XEPSIZE).\n  //\n  // Then, between GS and PS, it's:\n  // - Shared between GS and PS:\n  //   - Interpolators (TEXCOORD).\n  //   - Point coordinates (XESPRITETEXCOORD).\n  //   - Position (SV_Position).\n  // - GS output only:\n  //   - Clip distances (SV_ClipDistance).\n\n  union Modification {\n    // If anything in this is structure is changed in a way not compatible with\n    // the previous layout, invalidate the pipeline storages by increasing this\n    // version number (0xYYYYMMDD)!\n    static constexpr uint32_t kVersion = 0x20220720;\n\n    enum class DepthStencilMode : uint32_t {\n      kNoModifiers,\n      // [earlydepthstencil] - enable if alpha test and alpha to coverage are\n      // disabled; ignored if anything in the shader blocks early Z writing.\n      kEarlyHint,\n      // Converting the depth to the closest 32-bit float representable exactly\n      // as a 20e4 float, to support invariance in cases when the guest\n      // reuploads a previously resolved depth buffer to the EDRAM, rounding\n      // towards zero (which contradicts the rounding used by the Direct3D 9\n      // reference rasterizer, but allows SV_DepthLessEqual to be used to allow\n      // slightly coarse early Z culling; also truncating regardless of whether\n      // the shader writes depth and thus always uses SV_Depth, for\n      // consistency). MSAA is limited - depth must be per-sample\n      // (SV_DepthLessEqual also explicitly requires sample or centroid position\n      // interpolation), thus the sampler has to run at sample frequency even if\n      // the device supports stencil loading and thus true non-ROV MSAA via\n      // SV_StencilRef.\n      // Fixed-function viewport depth bounds must be snapped to float24 for\n      // clamping purposes.\n      kFloat24Truncating,\n      // Similar to kFloat24Truncating, but rounding to the nearest even,\n      // however, always using SV_Depth rather than SV_DepthLessEqual because\n      // rounding up results in a bigger value. Same viewport usage rules apply.\n      kFloat24Rounding,\n    };\n\n    uint64_t value;\n    struct VertexShaderModification {\n      // uint32_t 0.\n      // Interpolators written by the vertex shader and needed by the pixel\n      // shader.\n      uint32_t interpolator_mask : xenos::kMaxInterpolators;\n      uint32_t user_clip_plane_count : 3;\n      uint32_t user_clip_plane_cull : 1;\n      // Whether vertex killing with the \"and\" operator is used, and one more\n      // SV_CullDistance needs to be written.\n      uint32_t vertex_kill_and : 1;\n      uint32_t output_point_size : 1;\n      // Dynamically indexable register count from SQ_PROGRAM_CNTL.\n      uint32_t dynamic_addressable_register_count : 8;\n      uint32_t : 2;\n      // uint32_t 1.\n      // Pipeline stage and input configuration.\n      Shader::HostVertexShaderType host_vertex_shader_type\n          : Shader::kHostVertexShaderTypeBitCount;\n    } vertex;\n    struct PixelShaderModification {\n      // uint32_t 0.\n      // Interpolators written by the vertex shader and needed by the pixel\n      // shader.\n      uint32_t interpolator_mask : xenos::kMaxInterpolators;\n      uint32_t interpolators_centroid : xenos::kMaxInterpolators;\n      // uint32_t 1.\n      // Dynamically indexable register count from SQ_PROGRAM_CNTL.\n      uint32_t param_gen_enable : 1;\n      uint32_t param_gen_interpolator : 4;\n      // If param_gen_enable is set, this must be set for point primitives, and\n      // must not be set for other primitive types - enables the point sprite\n      // coordinates input, and also effects the flag bits in PsParamGen.\n      uint32_t param_gen_point : 1;\n      uint32_t dynamic_addressable_register_count : 8;\n      // Non-ROV - depth / stencil output mode.\n      DepthStencilMode depth_stencil_mode : 2;\n    } pixel;\n\n    explicit Modification(uint64_t modification_value = 0)\n        : value(modification_value) {\n      static_assert_size(*this, sizeof(value));\n    }\n\n    uint32_t GetVertexClipDistanceCount() const {\n      return vertex.user_clip_plane_cull ? 0 : vertex.user_clip_plane_count;\n    }\n    uint32_t GetVertexCullDistanceCount() const {\n      return (vertex.user_clip_plane_cull ? vertex.user_clip_plane_count : 0) +\n             vertex.vertex_kill_and;\n    }\n  };\n\n  // Constant buffer bindings in space 0.\n  enum class CbufferRegister {\n    kSystemConstants,\n    kFloatConstants,\n    kBoolLoopConstants,\n    kFetchConstants,\n    kDescriptorIndices,\n  };\n\n  // Some are referenced in xenos_draw.hlsli - check it too when updating!\n  enum : uint32_t {\n    kSysFlag_SharedMemoryIsUAV_Shift,\n    kSysFlag_XYDividedByW_Shift,\n    kSysFlag_ZDividedByW_Shift,\n    kSysFlag_WNotReciprocal_Shift,\n    kSysFlag_PrimitivePolygonal_Shift,\n    kSysFlag_PrimitiveLine_Shift,\n    kSysFlag_DepthFloat24_Shift,\n    kSysFlag_AlphaPassIfLess_Shift,\n    kSysFlag_AlphaPassIfEqual_Shift,\n    kSysFlag_AlphaPassIfGreater_Shift,\n    kSysFlag_ConvertColor0ToGamma_Shift,\n    kSysFlag_ConvertColor1ToGamma_Shift,\n    kSysFlag_ConvertColor2ToGamma_Shift,\n    kSysFlag_ConvertColor3ToGamma_Shift,\n\n    kSysFlag_ROVDepthStencil_Shift,\n    kSysFlag_ROVDepthPassIfLess_Shift,\n    kSysFlag_ROVDepthPassIfEqual_Shift,\n    kSysFlag_ROVDepthPassIfGreater_Shift,\n    // 1 to write new depth to the depth buffer, 0 to keep the old one if the\n    // depth test passes.\n    kSysFlag_ROVDepthWrite_Shift,\n    kSysFlag_ROVStencilTest_Shift,\n    // If the depth / stencil test has failed, but resulted in a stencil value\n    // that is different than the one currently in the depth buffer, write it\n    // anyway and don't run the rest of the shader (to check if the sample may\n    // be discarded some way) - use when alpha test and alpha to coverage are\n    // disabled. Ignored by the shader if not applicable to it (like if it has\n    // kill instructions or writes the depth output).\n    // TODO(Triang3l): Investigate replacement with an alpha-to-mask flag,\n    // checking `(flags & (alpha test | alpha to mask)) == (always | disabled)`,\n    // taking into account the potential relation with occlusion queries (but\n    // should be safe at least temporarily).\n    kSysFlag_ROVDepthStencilEarlyWrite_Shift,\n\n    kSysFlag_Count,\n\n    kSysFlag_SharedMemoryIsUAV = 1u << kSysFlag_SharedMemoryIsUAV_Shift,\n    kSysFlag_XYDividedByW = 1u << kSysFlag_XYDividedByW_Shift,\n    kSysFlag_ZDividedByW = 1u << kSysFlag_ZDividedByW_Shift,\n    kSysFlag_WNotReciprocal = 1u << kSysFlag_WNotReciprocal_Shift,\n    kSysFlag_PrimitivePolygonal = 1u << kSysFlag_PrimitivePolygonal_Shift,\n    kSysFlag_PrimitiveLine = 1u << kSysFlag_PrimitiveLine_Shift,\n    kSysFlag_DepthFloat24 = 1u << kSysFlag_DepthFloat24_Shift,\n    kSysFlag_AlphaPassIfLess = 1u << kSysFlag_AlphaPassIfLess_Shift,\n    kSysFlag_AlphaPassIfEqual = 1u << kSysFlag_AlphaPassIfEqual_Shift,\n    kSysFlag_AlphaPassIfGreater = 1u << kSysFlag_AlphaPassIfGreater_Shift,\n    kSysFlag_ConvertColor0ToGamma = 1u << kSysFlag_ConvertColor0ToGamma_Shift,\n    kSysFlag_ConvertColor1ToGamma = 1u << kSysFlag_ConvertColor1ToGamma_Shift,\n    kSysFlag_ConvertColor2ToGamma = 1u << kSysFlag_ConvertColor2ToGamma_Shift,\n    kSysFlag_ConvertColor3ToGamma = 1u << kSysFlag_ConvertColor3ToGamma_Shift,\n    kSysFlag_ROVDepthStencil = 1u << kSysFlag_ROVDepthStencil_Shift,\n    kSysFlag_ROVDepthPassIfLess = 1u << kSysFlag_ROVDepthPassIfLess_Shift,\n    kSysFlag_ROVDepthPassIfEqual = 1u << kSysFlag_ROVDepthPassIfEqual_Shift,\n    kSysFlag_ROVDepthPassIfGreater = 1u << kSysFlag_ROVDepthPassIfGreater_Shift,\n    kSysFlag_ROVDepthWrite = 1u << kSysFlag_ROVDepthWrite_Shift,\n    kSysFlag_ROVStencilTest = 1u << kSysFlag_ROVStencilTest_Shift,\n    kSysFlag_ROVDepthStencilEarlyWrite =\n        1u << kSysFlag_ROVDepthStencilEarlyWrite_Shift,\n  };\n  static_assert(kSysFlag_Count <= 32, \"Too many flags in the system constants\");\n\n  // IF SYSTEM CONSTANTS ARE CHANGED OR ADDED, THE FOLLOWING MUST BE UPDATED:\n  // - SystemConstants::Index enum.\n  // - system_constant_rdef_.\n  // - d3d12/shaders/xenos_draw.hlsli (for geometry shaders).\n  struct SystemConstants {\n    uint32_t flags;\n    union {\n      struct {\n        float tessellation_factor_range_min;\n        float tessellation_factor_range_max;\n      };\n      float tessellation_factor_range[2];\n    };\n    uint32_t line_loop_closing_index;\n\n    xenos::Endian vertex_index_endian;\n    uint32_t vertex_index_offset;\n    union {\n      struct {\n        uint32_t vertex_index_min;\n        uint32_t vertex_index_max;\n      };\n      uint32_t vertex_index_min_max[2];\n    };\n\n    float user_clip_planes[6][4];\n\n    float ndc_scale[3];\n    float point_vertex_diameter_min;\n\n    float ndc_offset[3];\n    float point_vertex_diameter_max;\n\n    float point_constant_diameter[2];\n    // Diameter in guest screen coordinates > radius (0.5 * diameter) in the NDC\n    // for the host viewport.\n    float point_screen_diameter_to_ndc_radius[2];\n\n    // Each byte contains post-swizzle TextureSign values for each of the needed\n    // components of each of the 32 used texture fetch constants.\n    uint32_t texture_swizzled_signs[8];\n\n    // Whether each texture in fetch constants contains resolution-scaled data.\n    uint32_t textures_resolution_scaled;\n    // Log2 of X and Y sample size. Used for alpha to mask, and for MSAA with\n    // ROV, this is used for EDRAM address calculation.\n    uint32_t sample_count_log2[2];\n    float alpha_test_reference;\n\n    // If alpha to mask is disabled, the entire alpha_to_mask value must be 0.\n    // If alpha to mask is enabled, bits 0:7 are sample offsets, and bit 8 must\n    // be 1.\n    uint32_t alpha_to_mask;\n    uint32_t edram_32bpp_tile_pitch_dwords_scaled;\n    uint32_t edram_depth_base_dwords_scaled;\n    uint32_t padding_edram_depth_base_dwords_scaled;\n\n    float color_exp_bias[4];\n\n    union {\n      struct {\n        float edram_poly_offset_front_scale;\n        float edram_poly_offset_front_offset;\n      };\n      float edram_poly_offset_front[2];\n    };\n    union {\n      struct {\n        float edram_poly_offset_back_scale;\n        float edram_poly_offset_back_offset;\n      };\n      float edram_poly_offset_back[2];\n    };\n\n    // In stencil function/operations (they match the layout of the\n    // function/operations in RB_DEPTHCONTROL):\n    // 0:2 - comparison function (bit 0 - less, bit 1 - equal, bit 2 - greater).\n    // 3:5 - fail operation.\n    // 6:8 - pass operation.\n    // 9:11 - depth fail operation.\n\n    union {\n      struct {\n        uint32_t edram_stencil_front_reference;\n        uint32_t edram_stencil_front_read_mask;\n        uint32_t edram_stencil_front_write_mask;\n        uint32_t edram_stencil_front_func_ops;\n\n        uint32_t edram_stencil_back_reference;\n        uint32_t edram_stencil_back_read_mask;\n        uint32_t edram_stencil_back_write_mask;\n        uint32_t edram_stencil_back_func_ops;\n      };\n      struct {\n        uint32_t edram_stencil_front[4];\n        uint32_t edram_stencil_back[4];\n      };\n      uint32_t edram_stencil[2][4];\n    };\n\n    uint32_t edram_rt_base_dwords_scaled[4];\n\n    // RT format combined with RenderTargetCache::kPSIColorFormatFlag values\n    // (pass via RenderTargetCache::AddPSIColorFormatFlags).\n    uint32_t edram_rt_format_flags[4];\n\n    // Format info - values to clamp the color to before blending or storing.\n    // Low color, low alpha, high color, high alpha.\n    float edram_rt_clamp[4][4];\n\n    // Format info - mask to apply to the old packed RT data, and to apply as\n    // inverted to the new packed data, before storing (more or less the inverse\n    // of the write mask packed like render target channels). This can be used\n    // to bypass unpacking if blending is not used. If 0 and not blending,\n    // reading the old data from the EDRAM buffer is not required.\n    uint32_t edram_rt_keep_mask[4][2];\n\n    // Render target blending options - RB_BLENDCONTROL, with only the relevant\n    // options (factors and operations - AND 0x1FFF1FFF). If 0x00010001\n    // (1 * src + 0 * dst), blending is disabled for the render target.\n    uint32_t edram_rt_blend_factors_ops[4];\n\n    // The constant blend factor for the respective modes.\n    float edram_blend_constant[4];\n\n   private:\n    friend class DxbcShaderTranslator;\n\n    enum class Index : uint32_t {\n      kFlags,\n      kTessellationFactorRange,\n      kLineLoopClosingIndex,\n\n      kVertexIndexEndian,\n      kVertexIndexOffset,\n      kVertexIndexMinMax,\n\n      kUserClipPlanes,\n\n      kNDCScale,\n      kPointVertexDiameterMin,\n\n      kNDCOffset,\n      kPointVertexDiameterMax,\n\n      kPointConstantDiameter,\n      kPointScreenDiameterToNDCRadius,\n\n      kTextureSwizzledSigns,\n\n      kTexturesResolutionScaled,\n      kSampleCountLog2,\n      kAlphaTestReference,\n\n      kAlphaToMask,\n      kEdram32bppTilePitchDwordsScaled,\n      kEdramDepthBaseDwordsScaled,\n\n      kColorExpBias,\n\n      kEdramPolyOffsetFront,\n      kEdramPolyOffsetBack,\n\n      kEdramStencil,\n\n      kEdramRTBaseDwordsScaled,\n\n      kEdramRTFormatFlags,\n\n      kEdramRTClamp,\n\n      kEdramRTKeepMask,\n\n      kEdramRTBlendFactorsOps,\n\n      kEdramBlendConstant,\n\n      kCount,\n    };\n    static_assert(\n        uint32_t(Index::kCount) <= 64,\n        \"Too many system constants, can't use uint64_t for usage bits\");\n  };\n\n  // Shader resource view binding spaces.\n  enum class SRVSpace {\n    // SRVMainSpaceRegister t# layout.\n    kMain,\n    kBindlessTextures2DArray,\n    kBindlessTextures3D,\n    kBindlessTexturesCube,\n  };\n\n  // Shader resource view bindings in SRVSpace::kMain.\n  enum class SRVMainRegister {\n    kSharedMemory,\n    kBindfulTexturesStart,\n  };\n\n  // 192 textures at most because there are 32 fetch constants, and textures can\n  // be 2D array, 3D or cube, and also signed and unsigned.\n  static constexpr uint32_t kMaxTextureBindingIndexBits = 8;\n  static constexpr uint32_t kMaxTextureBindings =\n      (1 << kMaxTextureBindingIndexBits) - 1;\n  struct TextureBinding {\n    uint32_t bindful_srv_index;\n    // Temporary for WriteResourceDefinition.\n    uint32_t bindful_srv_rdef_name_ptr;\n    uint32_t bindless_descriptor_index;\n    uint32_t fetch_constant;\n    // Stacked and 3D are separate TextureBindings, even for bindless for null\n    // descriptor handling simplicity.\n    xenos::FetchOpDimension dimension;\n    bool is_signed;\n    std::string bindful_name;\n  };\n\n  // Arbitrary limit - there can't be more than 2048 in a shader-visible\n  // descriptor heap, though some older hardware (tier 1 resource binding -\n  // Nvidia Fermi) doesn't support more than 16 samplers bound at once (we can't\n  // really do anything if a game uses more than 16), but just to have some\n  // limit so sampler count can easily be packed into 32-bit map keys (for\n  // instance, for root signatures). But shaders can specify overrides for\n  // filtering modes, and the number of possible combinations is huge - let's\n  // limit it to something sane.\n  static constexpr uint32_t kMaxSamplerBindingIndexBits = 7;\n  static constexpr uint32_t kMaxSamplerBindings =\n      (1 << kMaxSamplerBindingIndexBits) - 1;\n  struct SamplerBinding {\n    uint32_t bindless_descriptor_index;\n    uint32_t fetch_constant;\n    xenos::TextureFilter mag_filter;\n    xenos::TextureFilter min_filter;\n    xenos::TextureFilter mip_filter;\n    xenos::AnisoFilter aniso_filter;\n    std::string bindful_name;\n  };\n\n  // Unordered access view bindings in space 0.\n  enum class UAVRegister {\n    kSharedMemory,\n    kEdram,\n  };\n\n  uint64_t GetDefaultVertexShaderModification(\n      uint32_t dynamic_addressable_register_count,\n      Shader::HostVertexShaderType host_vertex_shader_type =\n          Shader::HostVertexShaderType::kVertex) const override;\n  uint64_t GetDefaultPixelShaderModification(\n      uint32_t dynamic_addressable_register_count) const override;\n\n  // Creates a special pixel shader without color outputs - this resets the\n  // state of the translator.\n  std::vector<uint8_t> CreateDepthOnlyPixelShader();\n\n  // Common functions useful not only for the translator, but also for render\n  // target reinterpretation.\n\n  // Converts the color value externally clamped to [0, 31.875] to 7e3 floating\n  // point, with zeros in bits 10:31, rounding to the nearest even. Source and\n  // destination may be the same, temporary must be different than both.\n  static void PreClampedFloat32To7e3(dxbc::Assembler& a, uint32_t f10_temp,\n                                     uint32_t f10_temp_component,\n                                     uint32_t f32_temp,\n                                     uint32_t f32_temp_component,\n                                     uint32_t temp_temp,\n                                     uint32_t temp_temp_component);\n  // Same as PreClampedFloat32To7e3, but clamps the input to [0, 31.875].\n  static void UnclampedFloat32To7e3(dxbc::Assembler& a, uint32_t f10_temp,\n                                    uint32_t f10_temp_component,\n                                    uint32_t f32_temp,\n                                    uint32_t f32_temp_component,\n                                    uint32_t temp_temp,\n                                    uint32_t temp_temp_component);\n  // Converts the 7e3 number in bits [f10_shift, f10_shift + 10) to a 32-bit\n  // float. Two temporaries must be different, but one can be the same as the\n  // source. The destination may be anything writable.\n  static void Float7e3To32(dxbc::Assembler& a, const dxbc::Dest& f32,\n                           uint32_t f10_temp, uint32_t f10_temp_component,\n                           uint32_t f10_shift, uint32_t temp1_temp,\n                           uint32_t temp1_temp_component, uint32_t temp2_temp,\n                           uint32_t temp2_temp_component);\n  // Converts the depth value externally clamped to the representable [0, 2)\n  // range to 20e4 floating point, with zeros in bits 24:31, rounding to the\n  // nearest even or towards zero. Source and destination may be the same,\n  // temporary must be different than both. If remap_from_0_to_0_5 is true, it's\n  // assumed that 0...1 is pre-remapped to 0...0.5 in the input.\n  static void PreClampedDepthTo20e4(\n      dxbc::Assembler& a, uint32_t f24_temp, uint32_t f24_temp_component,\n      uint32_t f32_temp, uint32_t f32_temp_component, uint32_t temp_temp,\n      uint32_t temp_temp_component, bool round_to_nearest_even,\n      bool remap_from_0_to_0_5);\n  // Converts the 20e4 number in bits [f24_shift, f24_shift + 10) to a 32-bit\n  // float. Two temporaries must be different, but one can be the same as the\n  // source. The destination may be anything writable. If remap_to_0_to_0_5 is\n  // true, 0...1 in float24 will be remaped to 0...0.5 in float32.\n  static void Depth20e4To32(dxbc::Assembler& a, const dxbc::Dest& f32,\n                            uint32_t f24_temp, uint32_t f24_temp_component,\n                            uint32_t f24_shift, uint32_t temp1_temp,\n                            uint32_t temp1_temp_component, uint32_t temp2_temp,\n                            uint32_t temp2_temp_component,\n                            bool remap_to_0_to_0_5);\n\n  // Converts one scalar from piecewise linear gamma to linear. The target may\n  // be the same as the source, the temporary variables must be different. If\n  // the source is not pre-saturated, saturation will be done internally.\n  static void PWLGammaToLinear(dxbc::Assembler& a, uint32_t target_temp,\n                               uint32_t target_temp_component,\n                               uint32_t source_temp,\n                               uint32_t source_temp_component,\n                               bool source_pre_saturated, uint32_t temp1,\n                               uint32_t temp1_component, uint32_t temp2,\n                               uint32_t temp2_component);\n  // Converts one scalar, which must be saturated before calling this function,\n  // from linear to piecewise linear gamma. The target may be the same as either\n  // the source or as temp_or_target, but not as both (and temp_or_target may\n  // not be the same as the source). temp_non_target must be different.\n  static void PreSaturatedLinearToPWLGamma(\n      dxbc::Assembler& a, uint32_t target_temp, uint32_t target_temp_component,\n      uint32_t source_temp, uint32_t source_temp_component,\n      uint32_t temp_or_target, uint32_t temp_or_target_component,\n      uint32_t temp_non_target, uint32_t temp_non_target_component);\n\n protected:\n  void Reset() override;\n\n  uint32_t GetModificationRegisterCount() const override;\n\n  void StartTranslation() override;\n  std::vector<uint8_t> CompleteTranslation() override;\n  void PostTranslation() override;\n\n  void ProcessLabel(uint32_t cf_index) override;\n\n  void ProcessExecInstructionBegin(const ParsedExecInstruction& instr) override;\n  void ProcessExecInstructionEnd(const ParsedExecInstruction& instr) override;\n  void ProcessLoopStartInstruction(\n      const ParsedLoopStartInstruction& instr) override;\n  void ProcessLoopEndInstruction(\n      const ParsedLoopEndInstruction& instr) override;\n  void ProcessJumpInstruction(const ParsedJumpInstruction& instr) override;\n  void ProcessAllocInstruction(const ParsedAllocInstruction& instr,\n                               uint8_t export_eM) override;\n\n  void ProcessVertexFetchInstruction(\n      const ParsedVertexFetchInstruction& instr) override;\n  void ProcessTextureFetchInstruction(\n      const ParsedTextureFetchInstruction& instr) override;\n  void ProcessAluInstruction(\n      const ParsedAluInstruction& instr,\n      uint8_t memexport_eM_potentially_written_before) override;\n\n private:\n  // IF ANY OF THESE ARE CHANGED, WriteInputSignature and WriteOutputSignature\n  // MUST BE UPDATED!\n  static constexpr uint32_t kInRegisterVSVertexIndex = 0;\n  static constexpr uint32_t kInRegisterDSControlPointIndex = 0;\n\n  // GetSystemConstantSrc + MarkSystemConstantUsed is for special cases of\n  // building the source unconditionally - in general, LoadSystemConstant must\n  // be used instead.\n  void MarkSystemConstantUsed(SystemConstants::Index index) {\n    system_constants_used_ |= uint64_t(1) << uint32_t(index);\n  }\n  // Offset should be offsetof(SystemConstants, field). Swizzle values are\n  // relative to the first component in the vector according to offsetof - to\n  // request a scalar, use XXXX swizzle, and if it's at +4 in its 16-byte\n  // vector, it will be turned into YYYY, and so on. The swizzle may include\n  // out-of-bounds components of the vector for simplicity of use, assuming they\n  // will be dropped anyway later.\n  dxbc::Src GetSystemConstantSrc(size_t offset, uint32_t swizzle) const {\n    uint32_t first_component = uint32_t((offset >> 2) & 3);\n    return dxbc::Src::CB(\n        cbuffer_index_system_constants_,\n        uint32_t(CbufferRegister::kSystemConstants), uint32_t(offset >> 4),\n        std::min((swizzle & 3) + first_component, uint32_t(3)) |\n            std::min(((swizzle >> 2) & 3) + first_component, uint32_t(3)) << 2 |\n            std::min(((swizzle >> 4) & 3) + first_component, uint32_t(3)) << 4 |\n            std::min(((swizzle >> 6) & 3) + first_component, uint32_t(3)) << 6);\n  }\n  dxbc::Src LoadSystemConstant(SystemConstants::Index index, size_t offset,\n                               uint32_t swizzle) {\n    MarkSystemConstantUsed(index);\n    return GetSystemConstantSrc(offset, swizzle);\n  }\n  dxbc::Src LoadFlagsSystemConstant() {\n    return LoadSystemConstant(SystemConstants::Index::kFlags,\n                              offsetof(SystemConstants, flags),\n                              dxbc::Src::kXXXX);\n  }\n\n  Modification GetDxbcShaderModification() const {\n    return Modification(current_translation().modification());\n  }\n\n  bool IsDxbcVertexShader() const {\n    return is_vertex_shader() &&\n           !Shader::IsHostVertexShaderTypeDomain(\n               GetDxbcShaderModification().vertex.host_vertex_shader_type);\n  }\n  bool IsDxbcDomainShader() const {\n    return is_vertex_shader() &&\n           Shader::IsHostVertexShaderTypeDomain(\n               GetDxbcShaderModification().vertex.host_vertex_shader_type);\n  }\n\n  bool IsForceEarlyDepthStencilGlobalFlagEnabled() const {\n    return is_pixel_shader() &&\n           GetDxbcShaderModification().pixel.depth_stencil_mode ==\n               Modification::DepthStencilMode::kEarlyHint &&\n           !edram_rov_used_ &&\n           current_shader().implicit_early_z_write_allowed();\n  }\n\n  uint32_t GetModificationInterpolatorMask() const {\n    Modification modification = GetDxbcShaderModification();\n    return is_vertex_shader() ? modification.vertex.interpolator_mask\n                              : modification.pixel.interpolator_mask;\n  }\n\n  // Whether to use switch-case rather than if (pc >= label) for control flow.\n  bool UseSwitchForControlFlow() const;\n\n  // Allocates new consecutive r# registers for internal use and returns the\n  // index of the first.\n  uint32_t PushSystemTemp(uint32_t zero_mask = 0, uint32_t count = 1);\n  // Frees the last allocated internal r# registers for later reuse.\n  void PopSystemTemp(uint32_t count = 1);\n\n  // ExportToMemory modifies the values of eA/eM# for simplicity, call only\n  // before starting a new export or ending the invocation or making it\n  // inactive.\n  void ExportToMemory(uint8_t export_eM);\n\n  bool IsSampleRate() const {\n    assert_true(is_pixel_shader());\n    return DSV_IsWritingFloat24Depth() && !current_shader().writes_depth();\n  }\n  bool IsDepthStencilSystemTempUsed() const {\n    // See system_temp_depth_stencil_ documentation for explanation of cases.\n    if (edram_rov_used_) {\n      // Needed for all cases (early, late, late with oDepth).\n      return true;\n    }\n    if (current_shader().writes_depth()) {\n      // With host render targets, the depth format may be float24, in this\n      // case, need to multiply it by 0.5 since 0...1 of the guest is stored as\n      // 0...0.5 on the host, and also to convert it.\n      // With ROV, need to store it to write later.\n      return true;\n    }\n    return false;\n  }\n  // Whether the current non-ROV pixel shader should convert the depth to 20e4.\n  bool DSV_IsWritingFloat24Depth() const {\n    if (edram_rov_used_) {\n      return false;\n    }\n    Modification::DepthStencilMode depth_stencil_mode =\n        GetDxbcShaderModification().pixel.depth_stencil_mode;\n    return depth_stencil_mode ==\n               Modification::DepthStencilMode::kFloat24Truncating ||\n           depth_stencil_mode ==\n               Modification::DepthStencilMode::kFloat24Rounding;\n  }\n  // Whether it's possible and worth skipping running the translated shader for\n  // 2x2 quads.\n  bool ROV_IsDepthStencilEarly() const {\n    assert_true(edram_rov_used_);\n    return !is_depth_only_pixel_shader_ && !current_shader().writes_depth() &&\n           !current_shader().memexport_eM_written();\n  }\n  // Converts the pre-clamped depth value to 24-bit (storing the result in bits\n  // 0:23 and zeros in 24:31, not creating room for stencil - since this may be\n  // involved in comparisons) according to the format specified in the system\n  // constants. Source and destination may be the same, temporary must be\n  // different than both.\n  void ROV_DepthTo24Bit(uint32_t d24_temp, uint32_t d24_temp_component,\n                        uint32_t d32_temp, uint32_t d32_temp_component,\n                        uint32_t temp_temp, uint32_t temp_temp_component);\n  // Does all the related to depth / stencil, including or not including\n  // writing based on whether it's late, or on whether it's safe to do it early.\n  // Updates system_temp_rov_params_ result and coverage if allowed and safe,\n  // updates system_temp_depth_stencil_, and if early and the coverage is empty\n  // for all pixels in the 2x2 quad and safe to return early (stencil is\n  // unchanged or known that it's safe not to await kills/alphatest/AtoC),\n  // returns from the shader.\n  void ROV_DepthStencilTest();\n  // Unpacks a 32bpp or a 64bpp color in packed_temp.packed_temp_components to\n  // color_temp, using 2 temporary VGPRs.\n  void ROV_UnpackColor(uint32_t rt_index, uint32_t packed_temp,\n                       uint32_t packed_temp_components, uint32_t color_temp,\n                       uint32_t temp1, uint32_t temp1_component, uint32_t temp2,\n                       uint32_t temp2_component);\n  // Packs a float32x4 color value to 32bpp or a 64bpp in color_temp to\n  // packed_temp.packed_temp_components, using 2 temporary VGPR. color_temp and\n  // packed_temp may be the same if packed_temp_components is 0. If the format\n  // is 32bpp, will still write the high part to break register dependency.\n  void ROV_PackPreClampedColor(uint32_t rt_index, uint32_t color_temp,\n                               uint32_t packed_temp,\n                               uint32_t packed_temp_components, uint32_t temp1,\n                               uint32_t temp1_component, uint32_t temp2,\n                               uint32_t temp2_component);\n  // Emits a sequence of `case` labels for color blend factors, generating the\n  // factor from src_temp.rgb and dst_temp.rgb to factor_temp.rgb. factor_temp\n  // can be the same as src_temp or dst_temp.\n  void ROV_HandleColorBlendFactorCases(uint32_t src_temp, uint32_t dst_temp,\n                                       uint32_t factor_temp);\n  // Emits a sequence of `case` labels for alpha blend factors, generating the\n  // factor from src_temp.a and dst_temp.a to factor_temp.factor_component.\n  // factor_temp can be the same as src_temp or dst_temp.\n  void ROV_HandleAlphaBlendFactorCases(uint32_t src_temp, uint32_t dst_temp,\n                                       uint32_t factor_temp,\n                                       uint32_t factor_component);\n\n  // Writing the prologue.\n  // Applies the offset to vertex or tessellation patch indices in the source\n  // components, restricts them to the minimum and the maximum index values, and\n  // converts them to floating-point. The destination may be the same as the\n  // source.\n  void RemapAndConvertVertexIndices(uint32_t dest_temp,\n                                    uint32_t dest_temp_components,\n                                    const dxbc::Src& src);\n  void StartVertexShader_LoadVertexIndex();\n  void StartVertexOrDomainShader();\n  void StartDomainShader();\n  void StartPixelShader_LoadROVParameters();\n  void StartPixelShader();\n\n  void CompleteVertexOrDomainShader();\n  // For RTV, adds the sample to coverage_temp.coverage_temp_component if it\n  // passes alpha to mask (or, if initialize == true (for the first sample\n  // tested), overwrites the output to initialize it).\n  // For ROV, masks the sample away from coverage_temp.coverage_temp_component\n  // if it doesn't pass alpha to mask.\n  // threshold_offset and temp.temp_component can be the same if needed.\n  void CompletePixelShader_AlphaToMaskSample(\n      bool initialize, uint32_t sample_index, float threshold_base,\n      dxbc::Src threshold_offset, float threshold_offset_scale,\n      uint32_t coverage_temp, uint32_t coverage_temp_component, uint32_t temp,\n      uint32_t temp_component);\n  // Performs alpha to coverage if necessary, for RTV, writing to oMask, and for\n  // ROV, updating the low (coverage) bits of system_temp_rov_params_.x. Done\n  // manually even for RTV to maintain the guest dithering pattern and because\n  // alpha can be exponent-biased.\n  void CompletePixelShader_AlphaToMask();\n  void CompletePixelShader_WriteToRTVs();\n  void CompletePixelShader_DSV_DepthTo24Bit();\n  void CompletePixelShader_WriteToROV();\n  void CompletePixelShader();\n\n  void CompleteShaderCode();\n\n  // Writes the original instruction disassembly in the output DXBC if enabled,\n  // as shader messages, from instruction_disassembly_buffer_.\n  void EmitInstructionDisassembly();\n\n  // Converts a shader translator source operand to a DXBC emitter operand, or\n  // returns a zero literal operand if it's not going to be referenced. This may\n  // allocate a temporary register and emit instructions if the operand can't be\n  // used directly with most DXBC instructions (like, if it's an indexable GPR),\n  // in this case, temp_pushed_out will be set to true, and PopSystemTemp must\n  // be done when the operand is not needed anymore.\n  dxbc::Src LoadOperand(const InstructionOperand& operand,\n                        uint32_t needed_components, bool& temp_pushed_out);\n  // Writes the specified source (src must be usable as a vector `mov` source,\n  // including to x#) to an instruction storage target.\n  // can_store_memexport_address is for safety, to allow only proper MADs with a\n  // stream constant to write to eA.\n  void StoreResult(const InstructionResult& result, const dxbc::Src& src,\n                   bool can_store_memexport_address = false);\n\n  // The nesting of `if` instructions is the following:\n  // - pc checks (labels).\n  // - exec predicate/bool constant check.\n  // - Instruction-level predicate checks.\n  // As an optimization, where possible, the DXBC translator tries to merge\n  // multiple execs into one, not creating endif/if doing nothing, if the\n  // execution condition is the same. This can't be done across labels\n  // (obviously) and in case `setp` is done in a predicated exec - in this case,\n  // the predicate value in the current exec may not match the predicate value\n  // in the next exec.\n  // Instruction-level predicate checks are also merged, and until a `setp` is\n  // done, if the instruction has the same predicate condition as the exec it is\n  // in, no instruction-level predicate `if` is created as well. One exception\n  // to the usual way of instruction-level predicate handling is made for\n  // instructions involving derivative computation, such as texture fetches with\n  // computed LOD. The part involving derivatives is executed disregarding the\n  // predication, but the result storing is predicated (this is handled in\n  // texture fetch instruction implementation):\n  // https://docs.microsoft.com/en-us/windows/desktop/direct3dhlsl/dx9-graphics-reference-asm-ps-registers-output-color\n\n  // Updates the current flow control condition (to be called in the beginning\n  // of exec and in jumps), closing the previous conditionals if needed.\n  // However, if the condition is not different, the instruction-level predicate\n  // `if` also won't be closed - this must be checked separately if needed (for\n  // example, in jumps). Also emits the last disassembly written to\n  // instruction_disassembly_buffer_ after closing the previous conditional and\n  // before opening a new one.\n  void UpdateExecConditionalsAndEmitDisassembly(\n      ParsedExecInstruction::Type type, uint32_t bool_constant_index,\n      bool condition);\n  // Closes `if`s opened by exec and instructions within them (but not by\n  // labels) and updates the state accordingly.\n  void CloseExecConditionals();\n  // Opens or reopens the predicate check conditional for the instruction, and\n  // emits the last disassembly written to instruction_disassembly_buffer_ after\n  // closing the previous predicate conditional and before opening a new one.\n  // This should be called before processing a non-control-flow instruction.\n  void UpdateInstructionPredicationAndEmitDisassembly(bool predicated,\n                                                      bool condition);\n  // Closes the instruction-level predicate `if` if it's open, useful if a flow\n  // control instruction needs to do some code which needs to respect the exec's\n  // conditional, but can't itself be predicated.\n  void CloseInstructionPredication();\n  void JumpToLabel(uint32_t address);\n\n  uint32_t FindOrAddTextureBinding(uint32_t fetch_constant,\n                                   xenos::FetchOpDimension dimension,\n                                   bool is_signed);\n  uint32_t FindOrAddSamplerBinding(uint32_t fetch_constant,\n                                   xenos::TextureFilter mag_filter,\n                                   xenos::TextureFilter min_filter,\n                                   xenos::TextureFilter mip_filter,\n                                   xenos::AnisoFilter aniso_filter);\n  // Returns the number of texture SRV and sampler offsets that need to be\n  // passed via a constant buffer to the shader.\n  uint32_t GetBindlessResourceCount() const {\n    return uint32_t(texture_bindings_.size() + sampler_bindings_.size());\n  }\n  // Marks fetch constants as used by the DXBC shader and returns dxbc::Src\n  // for the words 01 (pair 0), 23 (pair 1) or 45 (pair 2) of the texture fetch\n  // constant.\n  dxbc::Src RequestTextureFetchConstantWordPair(uint32_t fetch_constant_index,\n                                                uint32_t pair_index) {\n    if (cbuffer_index_fetch_constants_ == kBindingIndexUnallocated) {\n      cbuffer_index_fetch_constants_ = cbuffer_count_++;\n    }\n    uint32_t total_pair_index = fetch_constant_index * 3 + pair_index;\n    return dxbc::Src::CB(cbuffer_index_fetch_constants_,\n                         uint32_t(CbufferRegister::kFetchConstants),\n                         total_pair_index >> 1,\n                         (total_pair_index & 1) ? 0b10101110 : 0b00000100);\n  }\n  dxbc::Src RequestTextureFetchConstantWord(uint32_t fetch_constant_index,\n                                            uint32_t word_index) {\n    return RequestTextureFetchConstantWordPair(fetch_constant_index,\n                                               word_index >> 1)\n        .SelectFromSwizzled(word_index & 1);\n  }\n\n  void KillPixel(bool condition, const dxbc::Src& condition_src,\n                 uint8_t memexport_eM_potentially_written_before);\n\n  void ProcessVectorAluOperation(\n      const ParsedAluInstruction& instr,\n      uint8_t memexport_eM_potentially_written_before, uint32_t& result_swizzle,\n      bool& predicate_written);\n  void ProcessScalarAluOperation(\n      const ParsedAluInstruction& instr,\n      uint8_t memexport_eM_potentially_written_before, bool& predicate_written);\n\n  void WriteResourceDefinition();\n  void WriteInputSignature();\n  void WritePatchConstantSignature();\n  void WriteOutputSignature();\n  void WriteShaderCode();\n\n  // Executable instructions - generated during translation.\n  std::vector<uint32_t> shader_code_;\n  // Complete shader object, with all the needed blobs and dcl_ instructions -\n  // generated in the end of translation.\n  std::vector<uint32_t> shader_object_;\n\n  // Optional Direct3D features used by the shader.\n  dxbc::ShaderFeatureInfo shader_feature_info_;\n  // The statistics blob.\n  dxbc::Statistics statistics_;\n\n  // Assembler for shader_code_ and statistics_ (must be placed after them for\n  // correct initialization order).\n  dxbc::Assembler a_;\n  // Assembler for shader_object_ and statistics_, for declarations before the\n  // shader code that depend on info gathered during translation (must be placed\n  // after them for correct initialization order).\n  dxbc::Assembler ao_;\n\n  // Buffer for instruction disassembly comments.\n  StringBuffer instruction_disassembly_buffer_;\n\n  // Whether to write comments with the original Xenos instructions to the\n  // output.\n  bool emit_source_map_;\n\n  // Vendor ID of the GPU manufacturer, for toggling unsupported features.\n  ui::GraphicsProvider::GpuVendorID vendor_id_;\n\n  // Whether textures and samplers should be bindless.\n  bool bindless_resources_used_;\n\n  // Whether the output merger should be emulated in pixel shaders.\n  bool edram_rov_used_;\n\n  // Whether with RTV-based output-merger, k_8_8_8_8_GAMMA render targets are\n  // represented as host 8-bit unsigned normalized, and require conversion in\n  // translated shaders.\n  bool gamma_render_target_as_unorm8_;\n\n  // Whether 2x MSAA is emulated using real 2x MSAA rather than two samples of\n  // 4x MSAA.\n  bool msaa_2x_supported_;\n\n  // Guest pixel host width / height.\n  uint32_t draw_resolution_scale_x_;\n  uint32_t draw_resolution_scale_y_;\n\n  // Is currently writing the empty depth-only pixel shader, for\n  // CompleteTranslation.\n  bool is_depth_only_pixel_shader_ = false;\n\n  // Data types used in constants buffers. Listed in dependency order.\n  enum class ShaderRdefTypeIndex {\n    kFloat,\n    kFloat2,\n    kFloat3,\n    kFloat4,\n    kUint,\n    kUint2,\n    kUint4,\n    // Render target clamping ranges.\n    kFloat4Array4,\n    // User clip planes.\n    kFloat4Array6,\n    // Float constants - size written dynamically.\n    kFloat4ConstantArray,\n    // Bool constants, texture signedness, front/back stencil, render target\n    // keep masks.\n    kUint4Array2,\n    // Loop constants.\n    kUint4Array8,\n    // Fetch constants.\n    kUint4Array48,\n    // Descriptor indices - size written dynamically.\n    kUint4DescriptorIndexArray,\n\n    kCount,\n    kUnknown = kCount\n  };\n\n  struct ShaderRdefType {\n    // Name ignored for arrays.\n    const char* name;\n    dxbc::RdefVariableClass variable_class;\n    dxbc::RdefVariableType variable_type;\n    uint16_t row_count;\n    uint16_t column_count;\n    uint16_t element_count;\n    ShaderRdefTypeIndex array_element_type;\n  };\n  static const ShaderRdefType rdef_types_[size_t(ShaderRdefTypeIndex::kCount)];\n\n  static constexpr uint32_t kBindingIndexUnallocated = UINT32_MAX;\n\n  // Number of constant buffer bindings used in this shader - also used for\n  // generation of indices of constant buffers that are optional.\n  uint32_t cbuffer_count_;\n  uint32_t cbuffer_index_system_constants_;\n  uint32_t cbuffer_index_float_constants_;\n  uint32_t cbuffer_index_bool_loop_constants_;\n  uint32_t cbuffer_index_fetch_constants_;\n  uint32_t cbuffer_index_descriptor_indices_;\n\n  struct SystemConstantRdef {\n    const char* name;\n    ShaderRdefTypeIndex type;\n    uint32_t size;\n    uint32_t padding_after;\n  };\n  static const SystemConstantRdef\n      system_constant_rdef_[size_t(SystemConstants::Index::kCount)];\n  // Mask of system constants (1 << SystemConstants::Index) used in the shader,\n  // so the remaining ones can be marked as unused in RDEF.\n  uint64_t system_constants_used_;\n\n  uint32_t out_reg_vs_interpolators_;\n  uint32_t out_reg_vs_position_;\n  // Clip and cull distances must be tightly packed in Direct3D.\n  // Up to 6 SV_ClipDistances or SV_CullDistances depending on\n  // user_clip_plane_cull, then one SV_CullDistance if vertex_kill_and is used.\n  uint32_t out_reg_vs_clip_cull_distances_;\n  uint32_t out_reg_vs_point_size_;\n  uint32_t in_reg_ps_interpolators_;\n  uint32_t in_reg_ps_point_coordinates_;\n  uint32_t in_reg_ps_position_;\n  // nointerpolation inputs. SV_IsFrontFace (X) is for non-point PsParamGen,\n  // SV_SampleIndex (Y) is for memexport when sample-rate shading is otherwise\n  // needed anyway due to depth conversion.\n  uint32_t in_reg_ps_front_face_sample_index_;\n\n  // Mask of domain location actually used in the domain shader.\n  uint32_t in_domain_location_used_;\n  // Whether kInRegisterDSControlPointIndex has been used in the shader.\n  bool in_control_point_index_used_;\n  // Mask of the pixel/sample position actually used in the pixel shader.\n  uint32_t in_position_used_;\n  // Whether the faceness has been used in the pixel shader.\n  bool in_front_face_used_;\n\n  // Number of currently allocated Xenia internal r# registers.\n  uint32_t system_temp_count_current_;\n  // Total maximum number of temporary registers ever used during this\n  // translation (for the declaration).\n  uint32_t system_temp_count_max_;\n\n  // Position in vertex shaders (because viewport and W transformations can be\n  // applied in the end of the shader).\n  uint32_t system_temp_position_;\n  // Special exports in vertex shaders.\n  uint32_t system_temp_point_size_edge_flag_kill_vertex_;\n  // ROV only - 4 persistent VGPRs when writing to color targets, 2 VGPRs when\n  // not:\n  // X - Bit masks:\n  // 0:3 - Per-sample coverage at the current stage of the shader's execution.\n  //       Affected by things like SV_Coverage, early or late depth / stencil\n  //       (always resets bits for failing, no matter if need to defer writing),\n  //       alpha to coverage.\n  // 4:7 - Depth write deferred mask - when early depth / stencil resulted in a\n  //       different value for the sample (like different stencil if the test\n  //       failed), but can't write it before running the shader because it's\n  //       not known if the sample will be discarded by the shader, alphatest or\n  //       AtoC.\n  // Early depth / stencil rejection of the pixel is possible when both 0:3 and\n  // 4:7 are zero.\n  // 8:11 - Whether color buffers have been written to, if not written on the\n  //        taken execution path, don't export according to Direct3D 9 register\n  //        documentation (some games rely on this behavior).\n  // Y - Absolute resolution-scaled EDRAM offset for depth / stencil, in dwords,\n  //     before and during depth testing. During color writing, when the depth /\n  //     stencil address is not needed anymore, current color sample address.\n  // Z - Base-relative resolution-scaled EDRAM offset for 32bpp color data, in\n  //     dwords.\n  // W - Base-relative resolution-scaled EDRAM offset for 64bpp color data, in\n  //     dwords.\n  uint32_t system_temp_rov_params_;\n  // Different purposes:\n  // - When writing to oDepth: X also used to hold the depth written by the\n  //   shader, which, for host render targets, if the depth buffer is float24,\n  //   needs to be remapped from guest 0...1 to host 0...0.5 and, if needed,\n  //   converted to float24 precision; and for ROV, needs to be written in the\n  //   end of the shader.\n  // - When not writing to oDepth, but using ROV:\n  //   - ROV_IsDepthStencilEarly: New per-sample depth / stencil values,\n  //     generated during early depth / stencil test (actual writing checks\n  //     the remaining coverage bits).\n  //   - Not ROV_IsDepthStencilEarly: Z gradients in .xy taken in the beginning\n  //     of the shader before any return statement is possibly reached.\n  uint32_t system_temp_depth_stencil_;\n  // Up to 4 color outputs in pixel shaders (needs to be readable, because of\n  // alpha test, alpha to coverage, exponent bias, gamma, and also for ROV\n  // writing).\n  uint32_t system_temps_color_[4];\n\n  // Memory export temporary registers are allocated if the shader writes any\n  // eM# (current_shader().memexport_eM_written() != 0).\n  // X - whether memexport is enabled for this invocation.\n  // Y - which eM# elements have been written so far by the invocation since the\n  //     last memory write.\n  uint32_t system_temp_memexport_enabled_and_eM_written_;\n  // eA.\n  uint32_t system_temp_memexport_address_;\n  // eM#.\n  uint32_t system_temps_memexport_data_[ucode::kMaxMemExportElementCount];\n\n  // Vector ALU or fetch result / scratch (since Xenos write masks can contain\n  // swizzles).\n  uint32_t system_temp_result_;\n  // Temporary register ID for previous scalar result, program counter,\n  // predicate and absolute address register.\n  uint32_t system_temp_ps_pc_p0_a0_;\n  // Loop index stack - .x is the active loop, shifted right to .yzw on push.\n  uint32_t system_temp_aL_;\n  // Loop counter stack, .x is the active loop. Represents number of times\n  // remaining to loop.\n  uint32_t system_temp_loop_count_;\n  // Explicitly set texture gradients and LOD.\n  uint32_t system_temp_grad_h_lod_;\n  // .w stores `base + index * stride` in bytes from the last vfetch_full as it\n  // may be needed by vfetch_mini.\n  uint32_t system_temp_grad_v_vfetch_address_;\n\n  // The bool constant number containing the condition for the currently\n  // processed exec (or the last - unless a label has reset this), or\n  // kCfExecBoolConstantNone if it's not checked.\n  uint32_t cf_exec_bool_constant_;\n  static constexpr uint32_t kCfExecBoolConstantNone = UINT32_MAX;\n  // The expected bool constant value in the current exec if\n  // cf_exec_bool_constant_ is not kCfExecBoolConstantNone.\n  bool cf_exec_bool_constant_condition_;\n  // Whether the currently processed exec is executed if a predicate is\n  // set/unset.\n  bool cf_exec_predicated_;\n  // The expected predicated condition if cf_exec_predicated_ is true.\n  bool cf_exec_predicate_condition_;\n  // Whether an `if` for instruction-level predicate check is currently open.\n  bool cf_instruction_predicate_if_open_;\n  // The expected predicate condition for the current or the last instruction if\n  // cf_exec_instruction_predicated_ is true.\n  bool cf_instruction_predicate_condition_;\n  // Whether there was a `setp` in the current exec before the current\n  // instruction, thus instruction-level predicate value can be different than\n  // the exec-level predicate value, and can't merge two execs with the same\n  // predicate condition anymore.\n  bool cf_exec_predicate_written_;\n\n  // Number of SRV resources used in this shader - also used for generation of\n  // indices of SRV resources that are optional.\n  uint32_t srv_count_;\n  uint32_t srv_index_shared_memory_;\n  uint32_t srv_index_bindless_textures_2d_;\n  uint32_t srv_index_bindless_textures_3d_;\n  uint32_t srv_index_bindless_textures_cube_;\n\n  // The first binding is at t[SRVMainRegister::kBindfulTexturesStart] of space\n  // SRVSpace::kMain.\n  std::vector<TextureBinding> texture_bindings_;\n  std::unordered_map<uint32_t, uint32_t>\n      texture_bindings_for_bindful_srv_indices_;\n\n  // Number of UAV resources used in this shader - also used for generation of\n  // indices of UAV resources that are optional.\n  uint32_t uav_count_;\n  uint32_t uav_index_shared_memory_;\n  uint32_t uav_index_edram_;\n\n  std::vector<SamplerBinding> sampler_bindings_;\n};\n\n}  // namespace gpu\n}  // namespace xe\n\n#endif  // XENIA_GPU_DXBC_SHADER_TRANSLATOR_H_\n"
  },
  {
    "path": "src/xenia/gpu/dxbc_shader_translator_alu.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2018 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/dxbc_shader_translator.h\"\n\n#include <cfloat>\n#include <cmath>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/math.h\"\n\nnamespace xe {\nnamespace gpu {\nusing namespace ucode;\n\nvoid DxbcShaderTranslator::KillPixel(\n    bool condition, const dxbc::Src& condition_src,\n    uint8_t memexport_eM_potentially_written_before) {\n  a_.OpIf(condition, condition_src);\n  // Perform outstanding memory exports before the invocation becomes inactive\n  // and UAV writes are disabled.\n  ExportToMemory(memexport_eM_potentially_written_before);\n  // Discard the pixel, but continue execution if other lanes in the quad need\n  // this lane for derivatives. The driver may also perform early exiting\n  // internally if all lanes are discarded if deemed beneficial.\n  a_.OpDiscard(true, dxbc::Src::LU(UINT32_MAX));\n  if (edram_rov_used_) {\n    // Even though discarding disables all subsequent UAV/ROV writes, also skip\n    // as much of the Render Backend emulation logic as possible by setting the\n    // coverage and the mask of the written render targets to zero.\n    a_.OpMov(dxbc::Dest::R(system_temp_rov_params_, 0b0001), dxbc::Src::LU(0));\n  }\n  a_.OpEndIf();\n}\n\nvoid DxbcShaderTranslator::ProcessVectorAluOperation(\n    const ParsedAluInstruction& instr,\n    uint8_t memexport_eM_potentially_written_before, uint32_t& result_swizzle,\n    bool& predicate_written) {\n  result_swizzle = dxbc::Src::kXYZW;\n  predicate_written = false;\n\n  uint32_t used_result_components =\n      instr.vector_and_constant_result.GetUsedResultComponents();\n  if (!used_result_components &&\n      !ucode::GetAluVectorOpcodeInfo(instr.vector_opcode).changed_state) {\n    return;\n  }\n\n  // Load operands.\n  // A small shortcut, operands of cube are the same, but swizzled.\n  uint32_t operand_count;\n  if (instr.vector_opcode == AluVectorOpcode::kCube) {\n    operand_count = 1;\n  } else {\n    operand_count = instr.vector_operand_count;\n  }\n  uint32_t operand_needed_components[3];\n  for (uint32_t i = 0; i < operand_count; ++i) {\n    operand_needed_components[i] = ucode::GetAluVectorOpNeededSourceComponents(\n        instr.vector_opcode, i + 1, used_result_components);\n  }\n  // .zzxy - don't need duplicated Z.\n  if (instr.vector_opcode == AluVectorOpcode::kCube) {\n    operand_needed_components[0] &= 0b1101;\n  }\n  dxbc::Src operands[3]{dxbc::Src::LF(0.0f), dxbc::Src::LF(0.0f),\n                        dxbc::Src::LF(0.0f)};\n  uint32_t operand_temps = 0;\n  for (uint32_t i = 0; i < operand_count; ++i) {\n    bool operand_temp_pushed = false;\n    operands[i] =\n        LoadOperand(instr.vector_operands[i], operand_needed_components[i],\n                    operand_temp_pushed);\n    operand_temps += uint32_t(operand_temp_pushed);\n  }\n  // Don't return without PopSystemTemp(operand_temps) from now on!\n\n  dxbc::Dest per_component_dest(\n      dxbc::Dest::R(system_temp_result_, used_result_components));\n  switch (instr.vector_opcode) {\n    case AluVectorOpcode::kAdd:\n      a_.OpAdd(per_component_dest, operands[0], operands[1]);\n      break;\n    case AluVectorOpcode::kMul:\n    case AluVectorOpcode::kMad: {\n      // Not using DXBC mad to prevent fused multiply-add (mul followed by add\n      // may be optimized into non-fused mad by the driver in the identical\n      // operands case also).\n      a_.OpMul(per_component_dest, operands[0], operands[1]);\n      uint32_t multiplicands_different =\n          used_result_components &\n          ~instr.vector_operands[0].GetIdenticalComponents(\n              instr.vector_operands[1]);\n      if (multiplicands_different) {\n        // Shader Model 3: +-0 or denormal * anything = +0.\n        uint32_t is_zero_temp = PushSystemTemp();\n        a_.OpMin(dxbc::Dest::R(is_zero_temp, multiplicands_different),\n                 operands[0].Abs(), operands[1].Abs());\n        // min isn't required to flush denormals, eq is.\n        a_.OpEq(dxbc::Dest::R(is_zero_temp, multiplicands_different),\n                dxbc::Src::R(is_zero_temp), dxbc::Src::LF(0.0f));\n        // Not replacing true `0 + term` with movc of the term because +0 + -0\n        // should result in +0, not -0.\n        a_.OpMovC(dxbc::Dest::R(system_temp_result_, multiplicands_different),\n                  dxbc::Src::R(is_zero_temp), dxbc::Src::LF(0.0f),\n                  dxbc::Src::R(system_temp_result_));\n        // Release is_zero_temp.\n        PopSystemTemp();\n      }\n      if (instr.vector_opcode == AluVectorOpcode::kMad) {\n        a_.OpAdd(per_component_dest, dxbc::Src::R(system_temp_result_),\n                 operands[2]);\n      }\n    } break;\n\n    case AluVectorOpcode::kMax:\n    case AluVectorOpcode::kMin: {\n      // max is commonly used as mov.\n      uint32_t identical = instr.vector_operands[0].GetIdenticalComponents(\n                               instr.vector_operands[1]) &\n                           used_result_components;\n      uint32_t different = used_result_components & ~identical;\n      if (different) {\n        // Shader Model 3 NaN behavior (a op b ? a : b, not fmax/fmin).\n        if (instr.vector_opcode == AluVectorOpcode::kMin) {\n          a_.OpLT(dxbc::Dest::R(system_temp_result_, different), operands[0],\n                  operands[1]);\n        } else {\n          a_.OpGE(dxbc::Dest::R(system_temp_result_, different), operands[0],\n                  operands[1]);\n        }\n        a_.OpMovC(dxbc::Dest::R(system_temp_result_, different),\n                  dxbc::Src::R(system_temp_result_), operands[0], operands[1]);\n      }\n      if (identical) {\n        a_.OpMov(dxbc::Dest::R(system_temp_result_, identical), operands[0]);\n      }\n    } break;\n\n    case AluVectorOpcode::kSeq:\n      a_.OpEq(per_component_dest, operands[0], operands[1]);\n      a_.OpAnd(per_component_dest, dxbc::Src::R(system_temp_result_),\n               dxbc::Src::LF(1.0f));\n      break;\n    case AluVectorOpcode::kSgt:\n      a_.OpLT(per_component_dest, operands[1], operands[0]);\n      a_.OpAnd(per_component_dest, dxbc::Src::R(system_temp_result_),\n               dxbc::Src::LF(1.0f));\n      break;\n    case AluVectorOpcode::kSge:\n      a_.OpGE(per_component_dest, operands[0], operands[1]);\n      a_.OpAnd(per_component_dest, dxbc::Src::R(system_temp_result_),\n               dxbc::Src::LF(1.0f));\n      break;\n    case AluVectorOpcode::kSne:\n      a_.OpNE(per_component_dest, operands[0], operands[1]);\n      a_.OpAnd(per_component_dest, dxbc::Src::R(system_temp_result_),\n               dxbc::Src::LF(1.0f));\n      break;\n\n    case AluVectorOpcode::kFrc:\n      a_.OpFrc(per_component_dest, operands[0]);\n      break;\n    case AluVectorOpcode::kTrunc:\n      a_.OpRoundZ(per_component_dest, operands[0]);\n      break;\n    case AluVectorOpcode::kFloor:\n      a_.OpRoundNI(per_component_dest, operands[0]);\n      break;\n\n    case AluVectorOpcode::kCndEq:\n      a_.OpEq(per_component_dest, operands[0], dxbc::Src::LF(0.0f));\n      a_.OpMovC(per_component_dest, dxbc::Src::R(system_temp_result_),\n                operands[1], operands[2]);\n      break;\n    case AluVectorOpcode::kCndGe:\n      a_.OpGE(per_component_dest, operands[0], dxbc::Src::LF(0.0f));\n      a_.OpMovC(per_component_dest, dxbc::Src::R(system_temp_result_),\n                operands[1], operands[2]);\n      break;\n    case AluVectorOpcode::kCndGt:\n      a_.OpLT(per_component_dest, dxbc::Src::LF(0.0f), operands[0]);\n      a_.OpMovC(per_component_dest, dxbc::Src::R(system_temp_result_),\n                operands[1], operands[2]);\n      break;\n\n    case AluVectorOpcode::kDp4:\n    case AluVectorOpcode::kDp3:\n    case AluVectorOpcode::kDp2Add: {\n      uint32_t component_count;\n      if (instr.vector_opcode == AluVectorOpcode::kDp2Add) {\n        component_count = 2;\n      } else if (instr.vector_opcode == AluVectorOpcode::kDp3) {\n        component_count = 3;\n      } else {\n        component_count = 4;\n      }\n      result_swizzle = dxbc::Src::kXXXX;\n      uint32_t different = uint32_t((1 << component_count) - 1) &\n                           ~instr.vector_operands[0].GetIdenticalComponents(\n                               instr.vector_operands[1]);\n      for (uint32_t i = 0; i < component_count; ++i) {\n        a_.OpMul(dxbc::Dest::R(system_temp_result_, i ? 0b0010 : 0b0001),\n                 operands[0].SelectFromSwizzled(i),\n                 operands[1].SelectFromSwizzled(i));\n        if ((different & (1 << i)) != 0) {\n          // Shader Model 3: +-0 or denormal * anything = +0 (also not replacing\n          // true `0 + term` with movc of the term because +0 + -0 should result\n          // in +0, not -0).\n          a_.OpMin(dxbc::Dest::R(system_temp_result_, 0b0100),\n                   operands[0].SelectFromSwizzled(i).Abs(),\n                   operands[1].SelectFromSwizzled(i).Abs());\n          a_.OpEq(dxbc::Dest::R(system_temp_result_, 0b0100),\n                  dxbc::Src::R(system_temp_result_, dxbc::Src::kZZZZ),\n                  dxbc::Src::LF(0.0f));\n          a_.OpMovC(dxbc::Dest::R(system_temp_result_, i ? 0b0010 : 0b0001),\n                    dxbc::Src::R(system_temp_result_, dxbc::Src::kZZZZ),\n                    dxbc::Src::LF(0.0f),\n                    dxbc::Src::R(system_temp_result_,\n                                 i ? dxbc::Src::kYYYY : dxbc::Src::kXXXX));\n        }\n        if (i) {\n          // Not using DXBC dp# to avoid fused multiply-add, PC GPUs are scalar\n          // as of 2020 anyway, and not using mad for the same reason (mul\n          // followed by add may be optimized into non-fused mad by the driver\n          // in the identical operands case also).\n          a_.OpAdd(dxbc::Dest::R(system_temp_result_, 0b0001),\n                   dxbc::Src::R(system_temp_result_, dxbc::Src::kXXXX),\n                   dxbc::Src::R(system_temp_result_, dxbc::Src::kYYYY));\n        }\n      }\n      if (component_count == 2) {\n        a_.OpAdd(dxbc::Dest::R(system_temp_result_, 0b0001),\n                 dxbc::Src::R(system_temp_result_, dxbc::Src::kXXXX),\n                 operands[2].SelectFromSwizzled(0));\n      }\n    } break;\n\n    case AluVectorOpcode::kCube: {\n      // operands[0] is .z_xy.\n      // Result is T coordinate, S coordinate, 2 * major axis, face ID.\n      constexpr uint32_t kCubeX = 2, kCubeY = 3, kCubeZ = 0;\n      dxbc::Src cube_x_src(operands[0].SelectFromSwizzled(kCubeX));\n      dxbc::Src cube_y_src(operands[0].SelectFromSwizzled(kCubeY));\n      dxbc::Src cube_z_src(operands[0].SelectFromSwizzled(kCubeZ));\n      // result.xy = bool2(abs(z) >= abs(x), abs(z) >= abs(y))\n      a_.OpGE(dxbc::Dest::R(system_temp_result_, 0b0011), cube_z_src.Abs(),\n              operands[0].SwizzleSwizzled(kCubeX | (kCubeY << 2)).Abs());\n      // result.x = abs(z) >= abs(x) && abs(z) >= abs(y)\n      a_.OpAnd(dxbc::Dest::R(system_temp_result_, 0b0001),\n               dxbc::Src::R(system_temp_result_, dxbc::Src::kXXXX),\n               dxbc::Src::R(system_temp_result_, dxbc::Src::kYYYY));\n      dxbc::Dest tc_dest(dxbc::Dest::R(system_temp_result_, 0b0001));\n      dxbc::Dest sc_dest(dxbc::Dest::R(system_temp_result_, 0b0010));\n      dxbc::Dest ma_dest(dxbc::Dest::R(system_temp_result_, 0b0100));\n      dxbc::Dest id_dest(dxbc::Dest::R(system_temp_result_, 0b1000));\n      a_.OpIf(true, dxbc::Src::R(system_temp_result_, dxbc::Src::kXXXX));\n      {\n        // Z is the major axis.\n        // z < 0 needed for SC and ID, but the last to use is ID.\n        uint32_t ma_neg_component = (used_result_components & 0b1000) ? 3 : 1;\n        if (used_result_components & 0b1010) {\n          a_.OpLT(dxbc::Dest::R(system_temp_result_, 1 << ma_neg_component),\n                  cube_z_src, dxbc::Src::LF(0.0f));\n        }\n        if (used_result_components & 0b0001) {\n          a_.OpMov(tc_dest, -cube_y_src);\n        }\n        if (used_result_components & 0b0010) {\n          a_.OpMovC(sc_dest,\n                    dxbc::Src::R(system_temp_result_).Select(ma_neg_component),\n                    -cube_x_src, cube_x_src);\n        }\n        if (used_result_components & 0b0100) {\n          a_.OpMul(ma_dest, dxbc::Src::LF(2.0f), cube_z_src);\n        }\n        if (used_result_components & 0b1000) {\n          a_.OpMovC(id_dest,\n                    dxbc::Src::R(system_temp_result_).Select(ma_neg_component),\n                    dxbc::Src::LF(5.0f), dxbc::Src::LF(4.0f));\n        }\n      }\n      a_.OpElse();\n      {\n        // result.x = abs(y) >= abs(x)\n        a_.OpGE(dxbc::Dest::R(system_temp_result_, 0b0001), cube_y_src.Abs(),\n                cube_x_src.Abs());\n        a_.OpIf(true, dxbc::Src::R(system_temp_result_, dxbc::Src::kXXXX));\n        {\n          // Y is the major axis.\n          // y < 0 needed for TC and ID, but the last to use is ID.\n          uint32_t ma_neg_component = (used_result_components & 0b1000) ? 3 : 0;\n          if (used_result_components & 0b1001) {\n            a_.OpLT(dxbc::Dest::R(system_temp_result_, 1 << ma_neg_component),\n                    cube_y_src, dxbc::Src::LF(0.0f));\n          }\n          if (used_result_components & 0b0001) {\n            a_.OpMovC(\n                tc_dest,\n                dxbc::Src::R(system_temp_result_).Select(ma_neg_component),\n                -cube_z_src, cube_z_src);\n          }\n          if (used_result_components & 0b0010) {\n            a_.OpMov(sc_dest, cube_x_src);\n          }\n          if (used_result_components & 0b0100) {\n            a_.OpMul(ma_dest, dxbc::Src::LF(2.0f), cube_y_src);\n          }\n          if (used_result_components & 0b1000) {\n            a_.OpMovC(\n                id_dest,\n                dxbc::Src::R(system_temp_result_).Select(ma_neg_component),\n                dxbc::Src::LF(3.0f), dxbc::Src::LF(2.0f));\n          }\n        }\n        a_.OpElse();\n        {\n          // X is the major axis.\n          // x < 0 needed for SC and ID, but the last to use is ID.\n          uint32_t ma_neg_component = (used_result_components & 0b1000) ? 3 : 1;\n          if (used_result_components & 0b1010) {\n            a_.OpLT(dxbc::Dest::R(system_temp_result_, 1 << ma_neg_component),\n                    cube_x_src, dxbc::Src::LF(0.0f));\n          }\n          if (used_result_components & 0b0001) {\n            a_.OpMov(tc_dest, -cube_y_src);\n          }\n          if (used_result_components & 0b0010) {\n            a_.OpMovC(\n                sc_dest,\n                dxbc::Src::R(system_temp_result_).Select(ma_neg_component),\n                cube_z_src, -cube_z_src);\n          }\n          if (used_result_components & 0b0100) {\n            a_.OpMul(ma_dest, dxbc::Src::LF(2.0f), cube_x_src);\n          }\n          if (used_result_components & 0b1000) {\n            a_.OpAnd(id_dest,\n                     dxbc::Src::R(system_temp_result_).Select(ma_neg_component),\n                     dxbc::Src::LF(1.0f));\n          }\n        }\n        a_.OpEndIf();\n      }\n      a_.OpEndIf();\n    } break;\n\n    case AluVectorOpcode::kMax4: {\n      result_swizzle = dxbc::Src::kXXXX;\n      // Find max of all different components of the first operand.\n      // FIXME(Triang3l): Not caring about NaN because no info about the\n      // correct order, just using SM4 max here, which replaces them with the\n      // non-NaN component (however, there's one nice thing about it is that it\n      // may be compiled into max3 + max on GCN).\n      uint32_t remaining_components = 0;\n      for (uint32_t i = 0; i < 4; ++i) {\n        remaining_components |= 1 << ((operands[0].swizzle_ >> (i * 2)) & 3);\n      }\n      uint32_t unique_component_0;\n      xe::bit_scan_forward(remaining_components, &unique_component_0);\n      remaining_components &= ~uint32_t(1 << unique_component_0);\n      if (remaining_components) {\n        uint32_t unique_component_1;\n        xe::bit_scan_forward(remaining_components, &unique_component_1);\n        remaining_components &= ~uint32_t(1 << unique_component_1);\n        a_.OpMax(dxbc::Dest::R(system_temp_result_, 0b0001),\n                 operands[0].Select(unique_component_0),\n                 operands[0].Select(unique_component_1));\n        while (remaining_components) {\n          uint32_t unique_component;\n          xe::bit_scan_forward(remaining_components, &unique_component);\n          remaining_components &= ~uint32_t(1 << unique_component);\n          a_.OpMax(dxbc::Dest::R(system_temp_result_, 0b0001),\n                   dxbc::Src::R(system_temp_result_, dxbc::Src::kXXXX),\n                   operands[0].Select(unique_component));\n        }\n      } else {\n        a_.OpMov(dxbc::Dest::R(system_temp_result_, 0b0001),\n                 operands[0].Select(unique_component_0));\n      }\n    } break;\n\n    case AluVectorOpcode::kSetpEqPush:\n      predicate_written = true;\n      result_swizzle = dxbc::Src::kXXXX;\n      // result.xy = src0.xw == 0.0 (x only if needed).\n      a_.OpEq(dxbc::Dest::R(system_temp_result_,\n                            used_result_components ? 0b0011 : 0b0010),\n              operands[0].SwizzleSwizzled(0b1100), dxbc::Src::LF(0.0f));\n      // result.zw = src1.xw == 0.0 (z only if needed).\n      a_.OpEq(dxbc::Dest::R(system_temp_result_,\n                            used_result_components ? 0b1100 : 0b1000),\n              operands[1].SwizzleSwizzled(0b11000000), dxbc::Src::LF(0.0f));\n      // p0 = src0.w == 0.0 && src1.w == 0.0\n      a_.OpAnd(dxbc::Dest::R(system_temp_ps_pc_p0_a0_, 0b0100),\n               dxbc::Src::R(system_temp_result_, dxbc::Src::kYYYY),\n               dxbc::Src::R(system_temp_result_, dxbc::Src::kWWWW));\n      if (used_result_components) {\n        // result = (src0.x == 0.0 && src1.x == 0.0) ? 0.0 : src0.x + 1.0\n        a_.OpAnd(dxbc::Dest::R(system_temp_result_, 0b0001),\n                 dxbc::Src::R(system_temp_result_, dxbc::Src::kXXXX),\n                 dxbc::Src::R(system_temp_result_, dxbc::Src::kZZZZ));\n        // If the condition is true, 1 will be added to make it 0.\n        a_.OpMovC(dxbc::Dest::R(system_temp_result_, 0b0001),\n                  dxbc::Src::R(system_temp_result_, dxbc::Src::kXXXX),\n                  dxbc::Src::LF(-1.0f), operands[0].SelectFromSwizzled(0));\n        a_.OpAdd(dxbc::Dest::R(system_temp_result_, 0b0001),\n                 dxbc::Src::R(system_temp_result_, dxbc::Src::kXXXX),\n                 dxbc::Src::LF(1.0f));\n      }\n      break;\n    case AluVectorOpcode::kSetpNePush:\n      predicate_written = true;\n      result_swizzle = dxbc::Src::kXXXX;\n      // result.xy = src0.xw == 0.0 (x only if needed).\n      a_.OpEq(dxbc::Dest::R(system_temp_result_,\n                            used_result_components ? 0b0011 : 0b0010),\n              operands[0].SwizzleSwizzled(0b1100), dxbc::Src::LF(0.0f));\n      // result.zw = src1.xw != 0.0 (z only if needed).\n      a_.OpNE(dxbc::Dest::R(system_temp_result_,\n                            used_result_components ? 0b1100 : 0b1000),\n              operands[1].SwizzleSwizzled(0b11000000), dxbc::Src::LF(0.0f));\n      // p0 = src0.w == 0.0 && src1.w != 0.0\n      a_.OpAnd(dxbc::Dest::R(system_temp_ps_pc_p0_a0_, 0b0100),\n               dxbc::Src::R(system_temp_result_, dxbc::Src::kYYYY),\n               dxbc::Src::R(system_temp_result_, dxbc::Src::kWWWW));\n      if (used_result_components) {\n        // result = (src0.x == 0.0 && src1.x != 0.0) ? 0.0 : src0.x + 1.0\n        a_.OpAnd(dxbc::Dest::R(system_temp_result_, 0b0001),\n                 dxbc::Src::R(system_temp_result_, dxbc::Src::kXXXX),\n                 dxbc::Src::R(system_temp_result_, dxbc::Src::kZZZZ));\n        // If the condition is true, 1 will be added to make it 0.\n        a_.OpMovC(dxbc::Dest::R(system_temp_result_, 0b0001),\n                  dxbc::Src::R(system_temp_result_, dxbc::Src::kXXXX),\n                  dxbc::Src::LF(-1.0f), operands[0].SelectFromSwizzled(0));\n        a_.OpAdd(dxbc::Dest::R(system_temp_result_, 0b0001),\n                 dxbc::Src::R(system_temp_result_, dxbc::Src::kXXXX),\n                 dxbc::Src::LF(1.0f));\n      }\n      break;\n    case AluVectorOpcode::kSetpGtPush:\n      predicate_written = true;\n      result_swizzle = dxbc::Src::kXXXX;\n      // result.xy = src0.xw == 0.0 (x only if needed).\n      a_.OpEq(dxbc::Dest::R(system_temp_result_,\n                            used_result_components ? 0b0011 : 0b0010),\n              operands[0].SwizzleSwizzled(0b1100), dxbc::Src::LF(0.0f));\n      // result.zw = src1.xw > 0.0 (z only if needed).\n      a_.OpLT(dxbc::Dest::R(system_temp_result_,\n                            used_result_components ? 0b1100 : 0b1000),\n              dxbc::Src::LF(0.0f), operands[1].SwizzleSwizzled(0b11000000));\n      // p0 = src0.w == 0.0 && src1.w > 0.0\n      a_.OpAnd(dxbc::Dest::R(system_temp_ps_pc_p0_a0_, 0b0100),\n               dxbc::Src::R(system_temp_result_, dxbc::Src::kYYYY),\n               dxbc::Src::R(system_temp_result_, dxbc::Src::kWWWW));\n      if (used_result_components) {\n        // result = (src0.x == 0.0 && src1.x > 0.0) ? 0.0 : src0.x + 1.0\n        a_.OpAnd(dxbc::Dest::R(system_temp_result_, 0b0001),\n                 dxbc::Src::R(system_temp_result_, dxbc::Src::kXXXX),\n                 dxbc::Src::R(system_temp_result_, dxbc::Src::kZZZZ));\n        // If the condition is true, 1 will be added to make it 0.\n        a_.OpMovC(dxbc::Dest::R(system_temp_result_, 0b0001),\n                  dxbc::Src::R(system_temp_result_, dxbc::Src::kXXXX),\n                  dxbc::Src::LF(-1.0f), operands[0].SelectFromSwizzled(0));\n        a_.OpAdd(dxbc::Dest::R(system_temp_result_, 0b0001),\n                 dxbc::Src::R(system_temp_result_, dxbc::Src::kXXXX),\n                 dxbc::Src::LF(1.0f));\n      }\n      break;\n    case AluVectorOpcode::kSetpGePush:\n      predicate_written = true;\n      result_swizzle = dxbc::Src::kXXXX;\n      // result.xy = src0.xw == 0.0 (x only if needed).\n      a_.OpEq(dxbc::Dest::R(system_temp_result_,\n                            used_result_components ? 0b0011 : 0b0010),\n              operands[0].SwizzleSwizzled(0b1100), dxbc::Src::LF(0.0f));\n      // result.zw = src1.xw >= 0.0 (z only if needed).\n      a_.OpGE(dxbc::Dest::R(system_temp_result_,\n                            used_result_components ? 0b1100 : 0b1000),\n              operands[1].SwizzleSwizzled(0b11000000), dxbc::Src::LF(0.0f));\n      // p0 = src0.w == 0.0 && src1.w >= 0.0\n      a_.OpAnd(dxbc::Dest::R(system_temp_ps_pc_p0_a0_, 0b0100),\n               dxbc::Src::R(system_temp_result_, dxbc::Src::kYYYY),\n               dxbc::Src::R(system_temp_result_, dxbc::Src::kWWWW));\n      if (used_result_components) {\n        // result = (src0.x == 0.0 && src1.x >= 0.0) ? 0.0 : src0.x + 1.0\n        a_.OpAnd(dxbc::Dest::R(system_temp_result_, 0b0001),\n                 dxbc::Src::R(system_temp_result_, dxbc::Src::kXXXX),\n                 dxbc::Src::R(system_temp_result_, dxbc::Src::kZZZZ));\n        // If the condition is true, 1 will be added to make it 0.\n        a_.OpMovC(dxbc::Dest::R(system_temp_result_, 0b0001),\n                  dxbc::Src::R(system_temp_result_, dxbc::Src::kXXXX),\n                  dxbc::Src::LF(-1.0f), operands[0].SelectFromSwizzled(0));\n        a_.OpAdd(dxbc::Dest::R(system_temp_result_, 0b0001),\n                 dxbc::Src::R(system_temp_result_, dxbc::Src::kXXXX),\n                 dxbc::Src::LF(1.0f));\n      }\n      break;\n\n    case AluVectorOpcode::kKillEq:\n      result_swizzle = dxbc::Src::kXXXX;\n      a_.OpEq(dxbc::Dest::R(system_temp_result_), operands[0], operands[1]);\n      a_.OpOr(dxbc::Dest::R(system_temp_result_, 0b0011),\n              dxbc::Src::R(system_temp_result_, 0b0100),\n              dxbc::Src::R(system_temp_result_, 0b1110));\n      a_.OpOr(dxbc::Dest::R(system_temp_result_, 0b0001),\n              dxbc::Src::R(system_temp_result_, dxbc::Src::kXXXX),\n              dxbc::Src::R(system_temp_result_, dxbc::Src::kYYYY));\n      KillPixel(true, dxbc::Src::R(system_temp_result_, dxbc::Src::kXXXX),\n                memexport_eM_potentially_written_before);\n      if (used_result_components) {\n        a_.OpAnd(dxbc::Dest::R(system_temp_result_, 0b0001),\n                 dxbc::Src::R(system_temp_result_, dxbc::Src::kXXXX),\n                 dxbc::Src::LF(1.0f));\n      }\n      break;\n    case AluVectorOpcode::kKillGt:\n      result_swizzle = dxbc::Src::kXXXX;\n      a_.OpLT(dxbc::Dest::R(system_temp_result_), operands[1], operands[0]);\n      a_.OpOr(dxbc::Dest::R(system_temp_result_, 0b0011),\n              dxbc::Src::R(system_temp_result_, 0b0100),\n              dxbc::Src::R(system_temp_result_, 0b1110));\n      a_.OpOr(dxbc::Dest::R(system_temp_result_, 0b0001),\n              dxbc::Src::R(system_temp_result_, dxbc::Src::kXXXX),\n              dxbc::Src::R(system_temp_result_, dxbc::Src::kYYYY));\n      KillPixel(true, dxbc::Src::R(system_temp_result_, dxbc::Src::kXXXX),\n                memexport_eM_potentially_written_before);\n      if (used_result_components) {\n        a_.OpAnd(dxbc::Dest::R(system_temp_result_, 0b0001),\n                 dxbc::Src::R(system_temp_result_, dxbc::Src::kXXXX),\n                 dxbc::Src::LF(1.0f));\n      }\n      break;\n    case AluVectorOpcode::kKillGe:\n      result_swizzle = dxbc::Src::kXXXX;\n      a_.OpGE(dxbc::Dest::R(system_temp_result_), operands[0], operands[1]);\n      a_.OpOr(dxbc::Dest::R(system_temp_result_, 0b0011),\n              dxbc::Src::R(system_temp_result_, 0b0100),\n              dxbc::Src::R(system_temp_result_, 0b1110));\n      a_.OpOr(dxbc::Dest::R(system_temp_result_, 0b0001),\n              dxbc::Src::R(system_temp_result_, dxbc::Src::kXXXX),\n              dxbc::Src::R(system_temp_result_, dxbc::Src::kYYYY));\n      KillPixel(true, dxbc::Src::R(system_temp_result_, dxbc::Src::kXXXX),\n                memexport_eM_potentially_written_before);\n      if (used_result_components) {\n        a_.OpAnd(dxbc::Dest::R(system_temp_result_, 0b0001),\n                 dxbc::Src::R(system_temp_result_, dxbc::Src::kXXXX),\n                 dxbc::Src::LF(1.0f));\n      }\n      break;\n    case AluVectorOpcode::kKillNe:\n      result_swizzle = dxbc::Src::kXXXX;\n      a_.OpNE(dxbc::Dest::R(system_temp_result_), operands[0], operands[1]);\n      a_.OpOr(dxbc::Dest::R(system_temp_result_, 0b0011),\n              dxbc::Src::R(system_temp_result_, 0b0100),\n              dxbc::Src::R(system_temp_result_, 0b1110));\n      a_.OpOr(dxbc::Dest::R(system_temp_result_, 0b0001),\n              dxbc::Src::R(system_temp_result_, dxbc::Src::kXXXX),\n              dxbc::Src::R(system_temp_result_, dxbc::Src::kYYYY));\n      KillPixel(true, dxbc::Src::R(system_temp_result_, dxbc::Src::kXXXX),\n                memexport_eM_potentially_written_before);\n      if (used_result_components) {\n        a_.OpAnd(dxbc::Dest::R(system_temp_result_, 0b0001),\n                 dxbc::Src::R(system_temp_result_, dxbc::Src::kXXXX),\n                 dxbc::Src::LF(1.0f));\n      }\n      break;\n\n    case AluVectorOpcode::kDst:\n      if (used_result_components & 0b0001) {\n        a_.OpMov(dxbc::Dest::R(system_temp_result_, 0b0001),\n                 dxbc::Src::LF(1.0f));\n      }\n      if (used_result_components & 0b0010) {\n        a_.OpMul(dxbc::Dest::R(system_temp_result_, 0b0010),\n                 operands[0].SelectFromSwizzled(1),\n                 operands[1].SelectFromSwizzled(1));\n        if (!(instr.vector_operands[0].GetIdenticalComponents(\n                  instr.vector_operands[1]) &\n              0b0010)) {\n          // Shader Model 3: +-0 or denormal * anything = +0.\n          a_.OpMin(dxbc::Dest::R(system_temp_result_, 0b0100),\n                   operands[0].SelectFromSwizzled(1).Abs(),\n                   operands[1].SelectFromSwizzled(1).Abs());\n          // min isn't required to flush denormals, eq is.\n          a_.OpEq(dxbc::Dest::R(system_temp_result_, 0b0100),\n                  dxbc::Src::R(system_temp_result_, dxbc::Src::kZZZZ),\n                  dxbc::Src::LF(0.0f));\n          a_.OpMovC(dxbc::Dest::R(system_temp_result_, 0b0010),\n                    dxbc::Src::R(system_temp_result_, dxbc::Src::kZZZZ),\n                    dxbc::Src::LF(0.0f),\n                    dxbc::Src::R(system_temp_result_, dxbc::Src::kYYYY));\n        }\n      }\n      if (used_result_components & 0b0100) {\n        a_.OpMov(dxbc::Dest::R(system_temp_result_, 0b0100),\n                 operands[0].SelectFromSwizzled(2));\n      }\n      if (used_result_components & 0b1000) {\n        a_.OpMov(dxbc::Dest::R(system_temp_result_, 0b1000),\n                 operands[1].SelectFromSwizzled(2));\n      }\n      break;\n\n    case AluVectorOpcode::kMaxA:\n      a_.OpAdd(dxbc::Dest::R(system_temp_ps_pc_p0_a0_, 0b1000),\n               operands[0].SelectFromSwizzled(3), dxbc::Src::LF(0.5f));\n      a_.OpRoundNI(dxbc::Dest::R(system_temp_ps_pc_p0_a0_, 0b1000),\n                   dxbc::Src::R(system_temp_ps_pc_p0_a0_, dxbc::Src::kWWWW));\n      a_.OpMax(dxbc::Dest::R(system_temp_ps_pc_p0_a0_, 0b1000),\n               dxbc::Src::R(system_temp_ps_pc_p0_a0_, dxbc::Src::kWWWW),\n               dxbc::Src::LF(-256.0f));\n      a_.OpMin(dxbc::Dest::R(system_temp_ps_pc_p0_a0_, 0b1000),\n               dxbc::Src::R(system_temp_ps_pc_p0_a0_, dxbc::Src::kWWWW),\n               dxbc::Src::LF(255.0f));\n      a_.OpFToI(dxbc::Dest::R(system_temp_ps_pc_p0_a0_, 0b1000),\n                dxbc::Src::R(system_temp_ps_pc_p0_a0_, dxbc::Src::kWWWW));\n      if (used_result_components) {\n        uint32_t identical = instr.vector_operands[0].GetIdenticalComponents(\n                                 instr.vector_operands[1]) &\n                             used_result_components;\n        uint32_t different = used_result_components & ~identical;\n        if (different) {\n          // Shader Model 3 NaN behavior (a >= b ? a : b, not fmax).\n          a_.OpGE(dxbc::Dest::R(system_temp_result_, different), operands[0],\n                  operands[1]);\n          a_.OpMovC(dxbc::Dest::R(system_temp_result_, different),\n                    dxbc::Src::R(system_temp_result_), operands[0],\n                    operands[1]);\n        }\n        if (identical) {\n          a_.OpMov(dxbc::Dest::R(system_temp_result_, identical), operands[0]);\n        }\n      }\n      break;\n\n    default:\n      assert_unhandled_case(instr.vector_opcode);\n      EmitTranslationError(\"Unknown ALU vector operation\");\n      a_.OpMov(dxbc::Dest::R(system_temp_result_), dxbc::Src::LF(0.0f));\n  }\n\n  PopSystemTemp(operand_temps);\n}\n\nvoid DxbcShaderTranslator::ProcessScalarAluOperation(\n    const ParsedAluInstruction& instr,\n    uint8_t memexport_eM_potentially_written_before, bool& predicate_written) {\n  predicate_written = false;\n\n  if (instr.scalar_opcode == ucode::AluScalarOpcode::kRetainPrev) {\n    return;\n  }\n\n  // Load operands.\n  dxbc::Src operands_loaded[2]{dxbc::Src::LF(0.0f), dxbc::Src::LF(0.0f)};\n  uint32_t operand_temps = 0;\n  for (uint32_t i = 0; i < instr.scalar_operand_count; ++i) {\n    bool operand_temp_pushed = false;\n    operands_loaded[i] =\n        LoadOperand(instr.scalar_operands[i],\n                    (1 << instr.scalar_operands[i].component_count) - 1,\n                    operand_temp_pushed);\n    operand_temps += uint32_t(operand_temp_pushed);\n  }\n  // Don't return without PopSystemTemp(operand_temps) from now on!\n  dxbc::Src operand_0_a(operands_loaded[0].SelectFromSwizzled(0));\n  dxbc::Src operand_0_b(operands_loaded[0].SelectFromSwizzled(1));\n  dxbc::Src operand_1(operands_loaded[1].SelectFromSwizzled(0));\n\n  dxbc::Dest ps_dest(dxbc::Dest::R(system_temp_ps_pc_p0_a0_, 0b0001));\n  dxbc::Src ps_src(dxbc::Src::R(system_temp_ps_pc_p0_a0_, dxbc::Src::kXXXX));\n  switch (instr.scalar_opcode) {\n    case AluScalarOpcode::kAdds:\n      a_.OpAdd(ps_dest, operand_0_a, operand_0_b);\n      break;\n    case AluScalarOpcode::kAddsPrev:\n      a_.OpAdd(ps_dest, operand_0_a, ps_src);\n      break;\n    case AluScalarOpcode::kMuls:\n      a_.OpMul(ps_dest, operand_0_a, operand_0_b);\n      if (instr.scalar_operands[0].components[0] !=\n          instr.scalar_operands[0].components[1]) {\n        // Shader Model 3: +-0 or denormal * anything = +0.\n        uint32_t is_zero_temp = PushSystemTemp();\n        a_.OpMin(dxbc::Dest::R(is_zero_temp, 0b0001), operand_0_a.Abs(),\n                 operand_0_b.Abs());\n        // min isn't required to flush denormals, eq is.\n        a_.OpEq(dxbc::Dest::R(is_zero_temp, 0b0001),\n                dxbc::Src::R(is_zero_temp, dxbc::Src::kXXXX),\n                dxbc::Src::LF(0.0f));\n        a_.OpMovC(ps_dest, dxbc::Src::R(is_zero_temp, dxbc::Src::kXXXX),\n                  dxbc::Src::LF(0.0f), ps_src);\n        // Release is_zero_temp.\n        PopSystemTemp();\n      }\n      break;\n    case AluScalarOpcode::kMulsPrev:\n    case AluScalarOpcode::kMulsPrev2: {\n      uint32_t test_temp = PushSystemTemp();\n      if (instr.scalar_opcode == AluScalarOpcode::kMulsPrev2) {\n        // Check if need to select the src0.a * ps case.\n        // ps != -FLT_MAX.\n        a_.OpNE(dxbc::Dest::R(test_temp, 0b0001), ps_src,\n                dxbc::Src::LF(-FLT_MAX));\n        // isfinite(ps), or |ps| <= FLT_MAX, or -|ps| >= -FLT_MAX, since\n        // -FLT_MAX is already loaded to an SGPR, this is also false if it's\n        // NaN.\n        a_.OpGE(dxbc::Dest::R(test_temp, 0b0010), -ps_src.Abs(),\n                dxbc::Src::LF(-FLT_MAX));\n        a_.OpAnd(dxbc::Dest::R(test_temp, 0b0001),\n                 dxbc::Src::R(test_temp, dxbc::Src::kXXXX),\n                 dxbc::Src::R(test_temp, dxbc::Src::kYYYY));\n        // isfinite(src0.b).\n        a_.OpGE(dxbc::Dest::R(test_temp, 0b0010), -operand_0_b.Abs(),\n                dxbc::Src::LF(-FLT_MAX));\n        a_.OpAnd(dxbc::Dest::R(test_temp, 0b0001),\n                 dxbc::Src::R(test_temp, dxbc::Src::kXXXX),\n                 dxbc::Src::R(test_temp, dxbc::Src::kYYYY));\n        // src0.b > 0 (need !(src0.b <= 0), but src0.b has already been checked\n        // for NaN).\n        a_.OpLT(dxbc::Dest::R(test_temp, 0b0010), dxbc::Src::LF(0.0f),\n                operand_0_b);\n        a_.OpAnd(dxbc::Dest::R(test_temp, 0b0001),\n                 dxbc::Src::R(test_temp, dxbc::Src::kXXXX),\n                 dxbc::Src::R(test_temp, dxbc::Src::kYYYY));\n        a_.OpIf(true, dxbc::Src::R(test_temp, dxbc::Src::kXXXX));\n      }\n      // Shader Model 3: +-0 or denormal * anything = +0.\n      a_.OpMin(dxbc::Dest::R(test_temp, 0b0001), operand_0_a.Abs(),\n               ps_src.Abs());\n      // min isn't required to flush denormals, eq is.\n      a_.OpEq(dxbc::Dest::R(test_temp, 0b0001),\n              dxbc::Src::R(test_temp, dxbc::Src::kXXXX), dxbc::Src::LF(0.0f));\n      a_.OpMul(ps_dest, operand_0_a, ps_src);\n      a_.OpMovC(ps_dest, dxbc::Src::R(test_temp, dxbc::Src::kXXXX),\n                dxbc::Src::LF(0.0f), ps_src);\n      if (instr.scalar_opcode == AluScalarOpcode::kMulsPrev2) {\n        a_.OpElse();\n        a_.OpMov(ps_dest, dxbc::Src::LF(-FLT_MAX));\n        a_.OpEndIf();\n      }\n      // Release test_temp.\n      PopSystemTemp();\n    } break;\n\n    case AluScalarOpcode::kMaxs:\n    case AluScalarOpcode::kMins:\n      // max is commonly used as mov.\n      if (instr.scalar_operands[0].components[0] ==\n          instr.scalar_operands[0].components[1]) {\n        a_.OpMov(ps_dest, operand_0_a);\n      } else {\n        // Shader Model 3 NaN behavior (a op b ? a : b, not fmax/fmin).\n        if (instr.scalar_opcode == AluScalarOpcode::kMins) {\n          a_.OpLT(ps_dest, operand_0_a, operand_0_b);\n        } else {\n          a_.OpGE(ps_dest, operand_0_a, operand_0_b);\n        }\n        a_.OpMovC(ps_dest, ps_src, operand_0_a, operand_0_b);\n      }\n      break;\n\n    case AluScalarOpcode::kSeqs:\n      a_.OpEq(ps_dest, operand_0_a, dxbc::Src::LF(0.0f));\n      a_.OpAnd(ps_dest, ps_src, dxbc::Src::LF(1.0f));\n      break;\n    case AluScalarOpcode::kSgts:\n      a_.OpLT(ps_dest, dxbc::Src::LF(0.0f), operand_0_a);\n      a_.OpAnd(ps_dest, ps_src, dxbc::Src::LF(1.0f));\n      break;\n    case AluScalarOpcode::kSges:\n      a_.OpGE(ps_dest, operand_0_a, dxbc::Src::LF(0.0f));\n      a_.OpAnd(ps_dest, ps_src, dxbc::Src::LF(1.0f));\n      break;\n    case AluScalarOpcode::kSnes:\n      a_.OpNE(ps_dest, operand_0_a, dxbc::Src::LF(0.0f));\n      a_.OpAnd(ps_dest, ps_src, dxbc::Src::LF(1.0f));\n      break;\n\n    case AluScalarOpcode::kFrcs:\n      a_.OpFrc(ps_dest, operand_0_a);\n      break;\n    case AluScalarOpcode::kTruncs:\n      a_.OpRoundZ(ps_dest, operand_0_a);\n      break;\n    case AluScalarOpcode::kFloors:\n      a_.OpRoundNI(ps_dest, operand_0_a);\n      break;\n\n    case AluScalarOpcode::kExp:\n      a_.OpExp(ps_dest, operand_0_a);\n      break;\n    case AluScalarOpcode::kLogc: {\n      a_.OpLog(ps_dest, operand_0_a);\n      uint32_t is_neg_infinity_temp = PushSystemTemp();\n      a_.OpEq(dxbc::Dest::R(is_neg_infinity_temp, 0b0001), ps_src,\n              dxbc::Src::LF(-INFINITY));\n      a_.OpMovC(ps_dest, dxbc::Src::R(is_neg_infinity_temp, dxbc::Src::kXXXX),\n                dxbc::Src::LF(-FLT_MAX), ps_src);\n      // Release is_neg_infinity_temp.\n      PopSystemTemp();\n    } break;\n    case AluScalarOpcode::kLog:\n      a_.OpLog(ps_dest, operand_0_a);\n      break;\n    case AluScalarOpcode::kRcpc:\n    case AluScalarOpcode::kRsqc: {\n      if (instr.scalar_opcode == AluScalarOpcode::kRsqc) {\n        a_.OpRSq(ps_dest, operand_0_a);\n      } else {\n        a_.OpRcp(ps_dest, operand_0_a);\n      }\n      uint32_t is_infinity_temp = PushSystemTemp();\n      a_.OpEq(dxbc::Dest::R(is_infinity_temp, 0b0001), ps_src.Abs(),\n              dxbc::Src::LF(INFINITY));\n      // If +-Infinity (0x7F800000 or 0xFF800000), add -1 (0xFFFFFFFF) to turn\n      // into +-FLT_MAX (0x7F7FFFFF or 0xFF7FFFFF).\n      a_.OpIAdd(ps_dest, ps_src,\n                dxbc::Src::R(is_infinity_temp, dxbc::Src::kXXXX));\n      // Release is_infinity_temp.\n      PopSystemTemp();\n    } break;\n    case AluScalarOpcode::kRcpf:\n    case AluScalarOpcode::kRsqf: {\n      if (instr.scalar_opcode == AluScalarOpcode::kRsqf) {\n        a_.OpRSq(ps_dest, operand_0_a);\n      } else {\n        a_.OpRcp(ps_dest, operand_0_a);\n      }\n      uint32_t is_not_infinity_temp = PushSystemTemp();\n      a_.OpNE(dxbc::Dest::R(is_not_infinity_temp, 0b0001), ps_src.Abs(),\n              dxbc::Src::LF(INFINITY));\n      // Keep the sign bit if infinity.\n      a_.OpOr(dxbc::Dest::R(is_not_infinity_temp, 0b0001),\n              dxbc::Src::R(is_not_infinity_temp, dxbc::Src::kXXXX),\n              dxbc::Src::LU(uint32_t(1) << 31));\n      a_.OpAnd(ps_dest, ps_src,\n               dxbc::Src::R(is_not_infinity_temp, dxbc::Src::kXXXX));\n      // Release is_not_infinity_temp.\n      PopSystemTemp();\n    } break;\n    case AluScalarOpcode::kRcp:\n      a_.OpRcp(ps_dest, operand_0_a);\n      break;\n    case AluScalarOpcode::kRsq:\n      a_.OpRSq(ps_dest, operand_0_a);\n      break;\n\n    case AluScalarOpcode::kMaxAs:\n    case AluScalarOpcode::kMaxAsf:\n      if (instr.scalar_opcode == AluScalarOpcode::kMaxAsf) {\n        a_.OpRoundNI(dxbc::Dest::R(system_temp_ps_pc_p0_a0_, 0b1000),\n                     operand_0_a);\n      } else {\n        a_.OpAdd(dxbc::Dest::R(system_temp_ps_pc_p0_a0_, 0b1000), operand_0_a,\n                 dxbc::Src::LF(0.5f));\n        a_.OpRoundNI(dxbc::Dest::R(system_temp_ps_pc_p0_a0_, 0b1000),\n                     dxbc::Src::R(system_temp_ps_pc_p0_a0_, dxbc::Src::kWWWW));\n      }\n      a_.OpMax(dxbc::Dest::R(system_temp_ps_pc_p0_a0_, 0b1000),\n               dxbc::Src::R(system_temp_ps_pc_p0_a0_, dxbc::Src::kWWWW),\n               dxbc::Src::LF(-256.0f));\n      a_.OpMin(dxbc::Dest::R(system_temp_ps_pc_p0_a0_, 0b1000),\n               dxbc::Src::R(system_temp_ps_pc_p0_a0_, dxbc::Src::kWWWW),\n               dxbc::Src::LF(255.0f));\n      a_.OpFToI(dxbc::Dest::R(system_temp_ps_pc_p0_a0_, 0b1000),\n                dxbc::Src::R(system_temp_ps_pc_p0_a0_, dxbc::Src::kWWWW));\n      if (instr.scalar_operands[0].components[0] ==\n          instr.scalar_operands[0].components[1]) {\n        a_.OpMov(ps_dest, operand_0_a);\n      } else {\n        // Shader Model 3 NaN behavior (a >= b ? a : b, not fmax).\n        a_.OpGE(ps_dest, operand_0_a, operand_0_b);\n        a_.OpMovC(ps_dest, ps_src, operand_0_a, operand_0_b);\n      }\n      break;\n\n    case AluScalarOpcode::kSubs:\n      a_.OpAdd(ps_dest, operand_0_a, -operand_0_b);\n      break;\n    case AluScalarOpcode::kSubsPrev:\n      a_.OpAdd(ps_dest, operand_0_a, -ps_src);\n      break;\n\n    case AluScalarOpcode::kSetpEq:\n      predicate_written = true;\n      a_.OpEq(dxbc::Dest::R(system_temp_ps_pc_p0_a0_, 0b0100), operand_0_a,\n              dxbc::Src::LF(0.0f));\n      a_.OpMovC(ps_dest,\n                dxbc::Src::R(system_temp_ps_pc_p0_a0_, dxbc::Src::kZZZZ),\n                dxbc::Src::LF(0.0f), dxbc::Src::LF(1.0f));\n      break;\n    case AluScalarOpcode::kSetpNe:\n      predicate_written = true;\n      a_.OpNE(dxbc::Dest::R(system_temp_ps_pc_p0_a0_, 0b0100), operand_0_a,\n              dxbc::Src::LF(0.0f));\n      a_.OpMovC(ps_dest,\n                dxbc::Src::R(system_temp_ps_pc_p0_a0_, dxbc::Src::kZZZZ),\n                dxbc::Src::LF(0.0f), dxbc::Src::LF(1.0f));\n      break;\n    case AluScalarOpcode::kSetpGt:\n      predicate_written = true;\n      a_.OpLT(dxbc::Dest::R(system_temp_ps_pc_p0_a0_, 0b0100),\n              dxbc::Src::LF(0.0f), operand_0_a);\n      a_.OpMovC(ps_dest,\n                dxbc::Src::R(system_temp_ps_pc_p0_a0_, dxbc::Src::kZZZZ),\n                dxbc::Src::LF(0.0f), dxbc::Src::LF(1.0f));\n      break;\n    case AluScalarOpcode::kSetpGe:\n      predicate_written = true;\n      a_.OpGE(dxbc::Dest::R(system_temp_ps_pc_p0_a0_, 0b0100), operand_0_a,\n              dxbc::Src::LF(0.0f));\n      a_.OpMovC(ps_dest,\n                dxbc::Src::R(system_temp_ps_pc_p0_a0_, dxbc::Src::kZZZZ),\n                dxbc::Src::LF(0.0f), dxbc::Src::LF(1.0f));\n      break;\n    case AluScalarOpcode::kSetpInv:\n      predicate_written = true;\n      // Calculate ps as if src0.a != 1.0 (the false predicate value case).\n      a_.OpEq(ps_dest, operand_0_a, dxbc::Src::LF(0.0f));\n      a_.OpMovC(ps_dest, ps_src, dxbc::Src::LF(1.0f), operand_0_a);\n      // Set the predicate to src0.a == 1.0, and, if it's true, zero ps.\n      a_.OpEq(dxbc::Dest::R(system_temp_ps_pc_p0_a0_, 0b0100), operand_0_a,\n              dxbc::Src::LF(1.0f));\n      a_.OpMovC(ps_dest,\n                dxbc::Src::R(system_temp_ps_pc_p0_a0_, dxbc::Src::kZZZZ),\n                dxbc::Src::LF(0.0f), ps_src);\n      break;\n    case AluScalarOpcode::kSetpPop:\n      predicate_written = true;\n      a_.OpAdd(ps_dest, operand_0_a, dxbc::Src::LF(-1.0f));\n      a_.OpGE(dxbc::Dest::R(system_temp_ps_pc_p0_a0_, 0b0100),\n              dxbc::Src::LF(0.0f), ps_src);\n      a_.OpMovC(ps_dest,\n                dxbc::Src::R(system_temp_ps_pc_p0_a0_, dxbc::Src::kZZZZ),\n                dxbc::Src::LF(0.0f), ps_src);\n      break;\n    case AluScalarOpcode::kSetpClr:\n      predicate_written = true;\n      a_.OpMov(ps_dest, dxbc::Src::LF(FLT_MAX));\n      a_.OpMov(dxbc::Dest::R(system_temp_ps_pc_p0_a0_, 0b0100),\n               dxbc::Src::LU(0));\n      break;\n    case AluScalarOpcode::kSetpRstr:\n      predicate_written = true;\n      a_.OpEq(dxbc::Dest::R(system_temp_ps_pc_p0_a0_, 0b0100), operand_0_a,\n              dxbc::Src::LF(0.0f));\n      // Just copying src0.a to ps (since it's set to 0 if it's 0) could work,\n      // but flush denormals and zero sign just for safety.\n      a_.OpMovC(ps_dest,\n                dxbc::Src::R(system_temp_ps_pc_p0_a0_, dxbc::Src::kZZZZ),\n                dxbc::Src::LF(0.0f), operand_0_a);\n      break;\n\n    case AluScalarOpcode::kKillsEq:\n      a_.OpEq(ps_dest, operand_0_a, dxbc::Src::LF(0.0f));\n      KillPixel(true, ps_src, memexport_eM_potentially_written_before);\n      a_.OpAnd(ps_dest, ps_src, dxbc::Src::LF(1.0f));\n      break;\n    case AluScalarOpcode::kKillsGt:\n      a_.OpLT(ps_dest, dxbc::Src::LF(0.0f), operand_0_a);\n      KillPixel(true, ps_src, memexport_eM_potentially_written_before);\n      a_.OpAnd(ps_dest, ps_src, dxbc::Src::LF(1.0f));\n      break;\n    case AluScalarOpcode::kKillsGe:\n      a_.OpGE(ps_dest, operand_0_a, dxbc::Src::LF(0.0f));\n      KillPixel(true, ps_src, memexport_eM_potentially_written_before);\n      a_.OpAnd(ps_dest, ps_src, dxbc::Src::LF(1.0f));\n      break;\n    case AluScalarOpcode::kKillsNe:\n      a_.OpNE(ps_dest, operand_0_a, dxbc::Src::LF(0.0f));\n      KillPixel(true, ps_src, memexport_eM_potentially_written_before);\n      a_.OpAnd(ps_dest, ps_src, dxbc::Src::LF(1.0f));\n      break;\n    case AluScalarOpcode::kKillsOne:\n      a_.OpEq(ps_dest, operand_0_a, dxbc::Src::LF(1.0f));\n      KillPixel(true, ps_src, memexport_eM_potentially_written_before);\n      a_.OpAnd(ps_dest, ps_src, dxbc::Src::LF(1.0f));\n      break;\n\n    case AluScalarOpcode::kSqrt:\n      a_.OpSqRt(ps_dest, operand_0_a);\n      break;\n\n    case AluScalarOpcode::kMulsc0:\n    case AluScalarOpcode::kMulsc1:\n      a_.OpMul(ps_dest, operand_0_a, operand_1);\n      if (!(instr.scalar_operands[0].GetIdenticalComponents(\n                instr.scalar_operands[1]) &\n            0b0001)) {\n        // Shader Model 3: +-0 or denormal * anything = +0.\n        uint32_t is_zero_temp = PushSystemTemp();\n        a_.OpMin(dxbc::Dest::R(is_zero_temp, 0b0001), operand_0_a.Abs(),\n                 operand_1.Abs());\n        // min isn't required to flush denormals, eq is.\n        a_.OpEq(dxbc::Dest::R(is_zero_temp, 0b0001),\n                dxbc::Src::R(is_zero_temp, dxbc::Src::kXXXX),\n                dxbc::Src::LF(0.0f));\n        a_.OpMovC(ps_dest, dxbc::Src::R(is_zero_temp, dxbc::Src::kXXXX),\n                  dxbc::Src::LF(0.0f), ps_src);\n        // Release is_zero_temp.\n        PopSystemTemp();\n      }\n      break;\n    case AluScalarOpcode::kAddsc0:\n    case AluScalarOpcode::kAddsc1:\n      a_.OpAdd(ps_dest, operand_0_a, operand_1);\n      break;\n    case AluScalarOpcode::kSubsc0:\n    case AluScalarOpcode::kSubsc1:\n      a_.OpAdd(ps_dest, operand_0_a, -operand_1);\n      break;\n\n    case AluScalarOpcode::kSin:\n      a_.OpSinCos(ps_dest, dxbc::Dest::Null(), operand_0_a);\n      break;\n    case AluScalarOpcode::kCos:\n      a_.OpSinCos(dxbc::Dest::Null(), ps_dest, operand_0_a);\n      break;\n\n    default:\n      assert_unhandled_case(instr.scalar_opcode);\n      EmitTranslationError(\"Unknown ALU scalar operation\");\n      a_.OpMov(ps_dest, dxbc::Src::LF(0.0f));\n  }\n\n  PopSystemTemp(operand_temps);\n}\n\nvoid DxbcShaderTranslator::ProcessAluInstruction(\n    const ParsedAluInstruction& instr,\n    uint8_t memexport_eM_potentially_written_before) {\n  if (instr.IsNop()) {\n    // Don't even disassemble or update predication.\n    return;\n  }\n\n  if (emit_source_map_) {\n    instruction_disassembly_buffer_.Reset();\n    instr.Disassemble(&instruction_disassembly_buffer_);\n  }\n  UpdateInstructionPredicationAndEmitDisassembly(instr.is_predicated,\n                                                 instr.predicate_condition);\n\n  // Whether the instruction has changed the predicate, and it needs to be\n  // checked again later.\n  bool predicate_written_vector = false;\n  uint32_t vector_result_swizzle = dxbc::Src::kXYZW;\n  ProcessVectorAluOperation(instr, memexport_eM_potentially_written_before,\n                            vector_result_swizzle, predicate_written_vector);\n  bool predicate_written_scalar = false;\n  ProcessScalarAluOperation(instr, memexport_eM_potentially_written_before,\n                            predicate_written_scalar);\n\n  StoreResult(instr.vector_and_constant_result,\n              dxbc::Src::R(system_temp_result_, vector_result_swizzle),\n              instr.GetMemExportStreamConstant() != UINT32_MAX);\n  StoreResult(instr.scalar_result,\n              dxbc::Src::R(system_temp_ps_pc_p0_a0_, dxbc::Src::kXXXX));\n\n  if (predicate_written_vector || predicate_written_scalar) {\n    cf_exec_predicate_written_ = true;\n    CloseInstructionPredication();\n  }\n}\n\n}  // namespace gpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/dxbc_shader_translator_fetch.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include <algorithm>\n#include <cmath>\n#include <memory>\n#include <sstream>\n\n#include \"third_party/fmt/include/fmt/format.h\"\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/string.h\"\n#include \"xenia/gpu/dxbc_shader_translator.h\"\n#include \"xenia/gpu/render_target_cache.h\"\n\nnamespace xe {\nnamespace gpu {\nusing namespace ucode;\n\nvoid DxbcShaderTranslator::ProcessVertexFetchInstruction(\n    const ParsedVertexFetchInstruction& instr) {\n  if (emit_source_map_) {\n    instruction_disassembly_buffer_.Reset();\n    instr.Disassemble(&instruction_disassembly_buffer_);\n  }\n  UpdateInstructionPredicationAndEmitDisassembly(instr.is_predicated,\n                                                 instr.predicate_condition);\n\n  uint32_t used_result_components = instr.result.GetUsedResultComponents();\n  uint32_t needed_words = xenos::GetVertexFormatNeededWords(\n      instr.attributes.data_format, used_result_components);\n  // If this is vfetch_full, the address may still be needed for vfetch_mini -\n  // don't exit before calculating the address.\n  if (!needed_words && instr.is_mini_fetch) {\n    // Nothing to load - just constant 0/1 writes, or the swizzle includes only\n    // components that don't exist in the format (writing zero instead of them).\n    // Unpacking assumes at least some word is needed.\n    StoreResult(instr.result, dxbc::Src::LF(0.0f));\n    return;\n  }\n\n  // Create a 2-component dxbc::Src for the fetch constant (vf0 is in [0].xy of\n  // the fetch constants array, vf1 is in [0].zw, vf2 is in [1].xy).\n  if (cbuffer_index_fetch_constants_ == kBindingIndexUnallocated) {\n    cbuffer_index_fetch_constants_ = cbuffer_count_++;\n  }\n  dxbc::Src fetch_constant_src(dxbc::Src::CB(\n      cbuffer_index_fetch_constants_,\n      uint32_t(CbufferRegister::kFetchConstants),\n      instr.operands[1].storage_index >> 1,\n      (instr.operands[1].storage_index & 1) ? 0b10101110 : 0b00000100));\n\n  // TODO(Triang3l): Verify the fetch constant type (that it's a vertex fetch,\n  // not a texture fetch), here instead of dropping draws with invalid vertex\n  // fetch constants on the CPU when proper bound checks are added - vfetch may\n  // be conditional, so fetch constants may also be used conditionally.\n\n  // - Load the part of the byte address in the physical memory that is the same\n  //   in vfetch_full and vfetch_mini to system_temp_grad_v_vfetch_address_.w\n  //   (the index operand GPR must not be reloaded in vfetch_mini because it\n  //   might have been overwritten previously, but that shouldn't have effect on\n  //   vfetch_mini).\n\n  dxbc::Src address_src(\n      dxbc::Src::R(system_temp_grad_v_vfetch_address_, dxbc::Src::kWWWW));\n  if (!instr.is_mini_fetch) {\n    dxbc::Dest address_dest(\n        dxbc::Dest::R(system_temp_grad_v_vfetch_address_, 0b1000));\n    if (instr.attributes.stride) {\n      // Convert the index to an integer by flooring or by rounding to the\n      // nearest (as floor(index + 0.5) because rounding to the nearest even\n      // makes no sense for addressing, both 1.5 and 2.5 would be 2).\n      {\n        bool index_operand_temp_pushed = false;\n        dxbc::Src index_operand(\n            LoadOperand(instr.operands[0], 0b0001, index_operand_temp_pushed)\n                .SelectFromSwizzled(0));\n        if (instr.attributes.is_index_rounded) {\n          a_.OpAdd(address_dest, index_operand, dxbc::Src::LF(0.5f));\n          a_.OpRoundNI(address_dest, address_src);\n        } else {\n          a_.OpRoundNI(address_dest, index_operand);\n        }\n        if (index_operand_temp_pushed) {\n          PopSystemTemp();\n        }\n      }\n      a_.OpFToI(address_dest, address_src);\n      // Extract the byte address from the fetch constant to\n      // system_temp_result_.w (which is not used yet).\n      a_.OpAnd(dxbc::Dest::R(system_temp_result_, 0b1000),\n               fetch_constant_src.SelectFromSwizzled(0),\n               dxbc::Src::LU(~uint32_t(3)));\n      // Merge the index and the base address.\n      a_.OpIMAd(address_dest, address_src,\n                dxbc::Src::LU(instr.attributes.stride * sizeof(uint32_t)),\n                dxbc::Src::R(system_temp_result_, dxbc::Src::kWWWW));\n    } else {\n      // Fetching from the same location - extract the byte address of the\n      // beginning of the buffer.\n      a_.OpAnd(address_dest, fetch_constant_src.SelectFromSwizzled(0),\n               dxbc::Src::LU(~uint32_t(3)));\n    }\n  }\n\n  if (!needed_words) {\n    // The vfetch_full address has been loaded for the subsequent vfetch_mini,\n    // but there's no data to load.\n    StoreResult(instr.result, dxbc::Src::LF(0.0f));\n    return;\n  }\n\n  dxbc::Dest address_temp_dest(dxbc::Dest::R(system_temp_result_, 0b1000));\n  dxbc::Src address_temp_src(\n      dxbc::Src::R(system_temp_result_, dxbc::Src::kWWWW));\n\n  // - From now on, if any additional offset must be applied to the\n  //   `base + index * stride` part of the address, it must be done by writing\n  //   to system_temp_result_.w (address_temp_dest) instead of\n  //   system_temp_grad_v_vfetch_address_.w (since it must stay the same for the\n  //   vfetch_full and all its vfetch_mini invocations), and changing\n  //   address_src to address_temp_src afterwards. system_temp_result_.w can be\n  //   used for this purpose safely because it won't be overwritten until the\n  //   last dword is loaded (after which the address won't be needed anymore).\n\n  // Add the word offset from the instruction (signed), plus the offset of the\n  // first needed word within the element.\n  uint32_t first_word_index;\n  xe::bit_scan_forward(needed_words, &first_word_index);\n  int32_t first_word_buffer_offset =\n      instr.attributes.offset + int32_t(first_word_index);\n  if (first_word_buffer_offset) {\n    // Add the constant word offset.\n    a_.OpIAdd(address_temp_dest, address_src,\n              dxbc::Src::LI(first_word_buffer_offset * sizeof(uint32_t)));\n    address_src = address_temp_src;\n  }\n\n  // - Load needed words to system_temp_result_, words 0, 1, 2, 3 to X, Y, Z, W\n  //   respectively.\n\n  // FIXME(Triang3l): Bound checking is not done here, but haven't encountered\n  // any games relying on out-of-bounds access. On Adreno 200 on Android (LG\n  // P705), however, words (not full elements) out of glBufferData bounds\n  // contain 0.\n\n  // Loading the FXC way, Load4.xyw becomes Load2 and Load - would be a\n  // compromise between AMD, where there are load_dwordx2/3/4, and Nvidia, where\n  // a ByteAddressBuffer is more like an R32_UINT buffer.\n\n  // Depending on whether the shared memory is bound as an SRV or as a UAV (if\n  // memexport is used), fetch from the appropriate binding. Extract whether\n  // shared memory is a UAV to system_temp_result_.x and check. In the `if`, put\n  // the more likely case (SRV), in the `else`, the less likely one (UAV).\n  a_.OpAnd(dxbc::Dest::R(system_temp_result_, 0b0001),\n           LoadFlagsSystemConstant(),\n           dxbc::Src::LU(kSysFlag_SharedMemoryIsUAV));\n  a_.OpIf(false, dxbc::Src::R(system_temp_result_, dxbc::Src::kXXXX));\n  if (srv_index_shared_memory_ == kBindingIndexUnallocated) {\n    srv_index_shared_memory_ = srv_count_++;\n  }\n  if (uav_index_shared_memory_ == kBindingIndexUnallocated) {\n    uav_index_shared_memory_ = uav_count_++;\n  }\n  for (uint32_t i = 0; i < 2; ++i) {\n    if (i) {\n      a_.OpElse();\n    }\n    dxbc::Src shared_memory_src(\n        i ? dxbc::Src::U(uav_index_shared_memory_,\n                         uint32_t(UAVRegister::kSharedMemory))\n          : dxbc::Src::T(srv_index_shared_memory_,\n                         uint32_t(SRVMainRegister::kSharedMemory)));\n    uint32_t needed_words_remaining = needed_words;\n    uint32_t word_index_previous = first_word_index;\n    while (needed_words_remaining) {\n      uint32_t word_index;\n      xe::bit_scan_forward(needed_words_remaining, &word_index);\n      uint32_t word_count;\n      xe::bit_scan_forward(~(needed_words_remaining >> word_index),\n                           &word_count);\n      needed_words_remaining &=\n          ~((uint32_t(1) << (word_index + word_count)) - uint32_t(1));\n      if (word_index != word_index_previous) {\n        // Go to the word in the buffer.\n        a_.OpIAdd(address_temp_dest, address_src,\n                  dxbc::Src::LU((word_index - word_index_previous) *\n                                sizeof(uint32_t)));\n        address_src = address_temp_src;\n        word_index_previous = word_index;\n      }\n      // Can ld_raw either to the first multiple components, or to any scalar\n      // component.\n      dxbc::Dest words_result_dest(dxbc::Dest::R(\n          system_temp_result_, ((1 << word_count) - 1) << word_index));\n      if (!word_index || word_count == 1) {\n        // Read directly to system_temp_result_.\n        a_.OpLdRaw(words_result_dest, address_src, shared_memory_src);\n      } else {\n        // Read to the first components of a temporary register.\n        uint32_t load_temp = PushSystemTemp();\n        a_.OpLdRaw(dxbc::Dest::R(load_temp, (1 << word_count) - 1), address_src,\n                   shared_memory_src);\n        // Copy to system_temp_result_.\n        a_.OpMov(words_result_dest,\n                 dxbc::Src::R(load_temp,\n                              (dxbc::Src::kXYZW & ((1 << (word_count * 2)) - 1))\n                                  << (word_index * 2)));\n        // Release load_temp.\n        PopSystemTemp();\n      }\n    }\n  }\n  a_.OpEndIf();\n\n  dxbc::Src result_src(dxbc::Src::R(system_temp_result_));\n\n  // - Endian swap the words.\n\n  {\n    uint32_t swap_temp = PushSystemTemp();\n\n    // Extract the endianness from the fetch constant.\n    uint32_t endian_temp, endian_temp_component;\n    if (needed_words == 0b1111) {\n      endian_temp = PushSystemTemp();\n      endian_temp_component = 0;\n    } else {\n      endian_temp = swap_temp;\n      xe::bit_scan_forward(~needed_words, &endian_temp_component);\n    }\n    a_.OpAnd(dxbc::Dest::R(endian_temp, 1 << endian_temp_component),\n             fetch_constant_src.SelectFromSwizzled(1), dxbc::Src::LU(0b11));\n    dxbc::Src endian_src(\n        dxbc::Src::R(endian_temp).Select(endian_temp_component));\n\n    dxbc::Dest swap_temp_dest(dxbc::Dest::R(swap_temp, needed_words));\n    dxbc::Src swap_temp_src(dxbc::Src::R(swap_temp));\n    dxbc::Dest swap_result_dest(\n        dxbc::Dest::R(system_temp_result_, needed_words));\n\n    // 8-in-16 or one half of 8-in-32.\n    a_.OpSwitch(endian_src);\n    a_.OpCase(dxbc::Src::LU(uint32_t(xenos::Endian128::k8in16)));\n    a_.OpCase(dxbc::Src::LU(uint32_t(xenos::Endian128::k8in32)));\n    // Temp = X0Z0.\n    a_.OpAnd(swap_temp_dest, result_src, dxbc::Src::LU(0x00FF00FF));\n    // Result = YZW0.\n    a_.OpUShR(swap_result_dest, result_src, dxbc::Src::LU(8));\n    // Result = Y0W0.\n    a_.OpAnd(swap_result_dest, result_src, dxbc::Src::LU(0x00FF00FF));\n    // Result = YXWZ.\n    a_.OpUMAd(swap_result_dest, swap_temp_src, dxbc::Src::LU(256), result_src);\n    a_.OpBreak();\n    a_.OpEndSwitch();\n\n    // 16-in-32 or another half of 8-in-32.\n    a_.OpSwitch(endian_src);\n    a_.OpCase(dxbc::Src::LU(uint32_t(xenos::Endian128::k8in32)));\n    a_.OpCase(dxbc::Src::LU(uint32_t(xenos::Endian128::k16in32)));\n    // Temp = ZW00.\n    a_.OpUShR(swap_temp_dest, result_src, dxbc::Src::LU(16));\n    // Result = ZWXY.\n    a_.OpBFI(swap_result_dest, dxbc::Src::LU(16), dxbc::Src::LU(16), result_src,\n             swap_temp_src);\n    a_.OpBreak();\n    a_.OpEndSwitch();\n\n    // Release endian_temp (if allocated) and swap_temp.\n    PopSystemTemp((endian_temp != swap_temp) ? 2 : 1);\n  }\n\n  // - Unpack the format.\n\n  uint32_t used_format_components =\n      used_result_components & ((1 << xenos::GetVertexFormatComponentCount(\n                                     instr.attributes.data_format)) -\n                                1);\n  dxbc::Dest result_unpacked_dest(\n      dxbc::Dest::R(system_temp_result_, used_format_components));\n  // If needed_words is not zero (checked in the beginning), this must not be\n  // zero too. For simplicity, it's assumed that something will be unpacked\n  // here.\n  assert_not_zero(used_format_components);\n  uint32_t packed_widths[4] = {}, packed_offsets[4] = {};\n  uint32_t packed_swizzle = dxbc::Src::kXXXX;\n  switch (instr.attributes.data_format) {\n    case xenos::VertexFormat::k_8_8_8_8:\n      packed_widths[0] = packed_widths[1] = packed_widths[2] =\n          packed_widths[3] = 8;\n      packed_offsets[1] = 8;\n      packed_offsets[2] = 16;\n      packed_offsets[3] = 24;\n      break;\n    case xenos::VertexFormat::k_2_10_10_10:\n      packed_widths[0] = packed_widths[1] = packed_widths[2] = 10;\n      packed_widths[3] = 2;\n      packed_offsets[1] = 10;\n      packed_offsets[2] = 20;\n      packed_offsets[3] = 30;\n      break;\n    case xenos::VertexFormat::k_10_11_11:\n      packed_widths[0] = packed_widths[1] = 11;\n      packed_widths[2] = 10;\n      packed_offsets[1] = 11;\n      packed_offsets[2] = 22;\n      break;\n    case xenos::VertexFormat::k_11_11_10:\n      packed_widths[0] = 10;\n      packed_widths[1] = packed_widths[2] = 11;\n      packed_offsets[1] = 10;\n      packed_offsets[2] = 21;\n      break;\n    case xenos::VertexFormat::k_16_16:\n      packed_widths[0] = packed_widths[1] = 16;\n      packed_offsets[1] = 16;\n      break;\n    case xenos::VertexFormat::k_16_16_16_16:\n      packed_widths[0] = packed_widths[1] = packed_widths[2] =\n          packed_widths[3] = 16;\n      packed_offsets[1] = packed_offsets[3] = 16;\n      packed_swizzle = 0b01010000;\n      break;\n    default:\n      // Not a packed integer format.\n      break;\n  }\n  if (packed_widths[0]) {\n    // Handle packed integer formats.\n    if (instr.attributes.is_signed) {\n      a_.OpIBFE(result_unpacked_dest, dxbc::Src::LP(packed_widths),\n                dxbc::Src::LP(packed_offsets),\n                dxbc::Src::R(system_temp_result_, packed_swizzle));\n      a_.OpIToF(result_unpacked_dest, result_src);\n      if (!instr.attributes.is_integer) {\n        float packed_scales[4] = {};\n        switch (instr.attributes.signed_rf_mode) {\n          case xenos::SignedRepeatingFractionMode::kZeroClampMinusOne: {\n            uint32_t packed_scales_mask = 0b0000;\n            for (uint32_t i = 0; i < 4; ++i) {\n              if (!(used_format_components & (1 << i))) {\n                continue;\n              }\n              if (packed_widths[i] > 2) {\n                packed_scales[i] =\n                    1.0f / float((uint32_t(1) << (packed_widths[i] - 1)) - 1);\n                packed_scales_mask |= 1 << i;\n              }\n            }\n            if (packed_scales_mask) {\n              a_.OpMul(dxbc::Dest::R(system_temp_result_, packed_scales_mask),\n                       result_src, dxbc::Src::LP(packed_scales));\n            }\n            // Treat both -(2^(n-1)) and -(2^(n-1)-1) as -1.\n            a_.OpMax(result_unpacked_dest, result_src, dxbc::Src::LF(-1.0f));\n          } break;\n          case xenos::SignedRepeatingFractionMode::kNoZero: {\n            float packed_zeros[4] = {};\n            for (uint32_t i = 0; i < 4; ++i) {\n              if (!(used_format_components & (1 << i))) {\n                continue;\n              }\n              assert_not_zero(packed_widths[i]);\n              packed_zeros[i] =\n                  1.0f / float((uint32_t(1) << packed_widths[i]) - 1);\n              packed_scales[i] = 2.0f * packed_zeros[i];\n            }\n            a_.OpMAd(result_unpacked_dest, result_src,\n                     dxbc::Src::LP(packed_scales), dxbc::Src::LP(packed_zeros));\n          } break;\n          default:\n            assert_unhandled_case(instr.attributes.signed_rf_mode);\n        }\n      }\n    } else {\n      a_.OpUBFE(result_unpacked_dest, dxbc::Src::LP(packed_widths),\n                dxbc::Src::LP(packed_offsets),\n                dxbc::Src::R(system_temp_result_, packed_swizzle));\n      a_.OpUToF(result_unpacked_dest, result_src);\n      if (!instr.attributes.is_integer) {\n        float packed_scales[4] = {};\n        uint32_t packed_scales_mask = 0b0000;\n        for (uint32_t i = 0; i < 4; ++i) {\n          if (!(used_format_components & (1 << i))) {\n            continue;\n          }\n          if (packed_widths[i] > 1) {\n            packed_scales[i] =\n                1.0f / float((uint32_t(1) << packed_widths[i]) - 1);\n            packed_scales_mask |= 1 << i;\n          }\n        }\n        if (packed_scales_mask) {\n          a_.OpMul(dxbc::Dest::R(system_temp_result_, packed_scales_mask),\n                   result_src, dxbc::Src::LP(packed_scales));\n        }\n      }\n    }\n  } else {\n    switch (instr.attributes.data_format) {\n      case xenos::VertexFormat::k_16_16_FLOAT:\n      case xenos::VertexFormat::k_16_16_16_16_FLOAT:\n        // FIXME(Triang3l): This converts from D3D10+ float16 with NaNs instead\n        // of Xbox 360 float16 with extended range. However, haven't encountered\n        // games relying on that yet.\n        a_.OpUBFE(result_unpacked_dest, dxbc::Src::LU(16),\n                  dxbc::Src::LU(0, 16, 0, 16),\n                  dxbc::Src::R(system_temp_result_, 0b01010000));\n        a_.OpF16ToF32(result_unpacked_dest, result_src);\n        break;\n      case xenos::VertexFormat::k_32:\n      case xenos::VertexFormat::k_32_32:\n      case xenos::VertexFormat::k_32_32_32_32:\n        if (instr.attributes.is_signed) {\n          a_.OpIToF(result_unpacked_dest, result_src);\n        } else {\n          a_.OpUToF(result_unpacked_dest, result_src);\n        }\n        if (!instr.attributes.is_integer) {\n          if (instr.attributes.is_signed) {\n            switch (instr.attributes.signed_rf_mode) {\n              case xenos::SignedRepeatingFractionMode::kZeroClampMinusOne:\n                a_.OpMul(result_unpacked_dest, result_src,\n                         dxbc::Src::LF(1.0f / 2147483647.0f));\n                // No need to clamp to -1 if signed - 1/(2^31-1) is rounded to\n                // 1/(2^31) as float32.\n                break;\n              case xenos::SignedRepeatingFractionMode::kNoZero:\n                a_.OpMAd(result_unpacked_dest, result_src,\n                         dxbc::Src::LF(1.0f / 2147483647.5f),\n                         dxbc::Src::LF(0.5f / 2147483647.5f));\n                break;\n              default:\n                assert_unhandled_case(instr.attributes.signed_rf_mode);\n            }\n          } else {\n            a_.OpMul(result_unpacked_dest, result_src,\n                     dxbc::Src::LF(1.0f / 4294967295.0f));\n          }\n        }\n        break;\n      case xenos::VertexFormat::k_32_FLOAT:\n      case xenos::VertexFormat::k_32_32_FLOAT:\n      case xenos::VertexFormat::k_32_32_32_32_FLOAT:\n      case xenos::VertexFormat::k_32_32_32_FLOAT:\n        // Already in the needed result components.\n        break;\n      default:\n        // Packed integer or unknown format.\n        assert_not_zero(packed_widths[0]);\n        break;\n    }\n  }\n\n  // - Apply the exponent bias.\n\n  if (instr.attributes.exp_adjust) {\n    a_.OpMul(result_unpacked_dest, result_src,\n             dxbc::Src::LF(std::ldexp(1.0f, instr.attributes.exp_adjust)));\n  }\n\n  // - Write zeros to components not present in the format.\n\n  uint32_t used_missing_components =\n      used_result_components & ~used_format_components;\n  if (used_missing_components) {\n    a_.OpMov(dxbc::Dest::R(system_temp_result_, used_missing_components),\n             dxbc::Src::LF(0.0f));\n  }\n\n  StoreResult(instr.result, dxbc::Src::R(system_temp_result_));\n}\n\nuint32_t DxbcShaderTranslator::FindOrAddTextureBinding(\n    uint32_t fetch_constant, xenos::FetchOpDimension dimension,\n    bool is_signed) {\n  // 1D and 2D textures (including stacked ones) are treated as 2D arrays for\n  // binding and coordinate simplicity.\n  if (dimension == xenos::FetchOpDimension::k1D) {\n    dimension = xenos::FetchOpDimension::k2D;\n  }\n  uint32_t srv_index = UINT32_MAX;\n  for (uint32_t i = 0; i < uint32_t(texture_bindings_.size()); ++i) {\n    const TextureBinding& texture_binding = texture_bindings_[i];\n    if (texture_binding.fetch_constant == fetch_constant &&\n        texture_binding.dimension == dimension &&\n        texture_binding.is_signed == is_signed) {\n      return i;\n    }\n  }\n  if (texture_bindings_.size() >= kMaxTextureBindings) {\n    assert_always();\n    return kMaxTextureBindings - 1;\n  }\n  uint32_t texture_binding_index = uint32_t(texture_bindings_.size());\n  TextureBinding& new_texture_binding = texture_bindings_.emplace_back();\n  if (!bindless_resources_used_) {\n    new_texture_binding.bindful_srv_index = srv_count_++;\n    texture_bindings_for_bindful_srv_indices_.insert(\n        {new_texture_binding.bindful_srv_index, texture_binding_index});\n    const char* dimension_name;\n    switch (dimension) {\n      case xenos::FetchOpDimension::k3DOrStacked:\n        dimension_name = \"3d\";\n        break;\n      case xenos::FetchOpDimension::kCube:\n        dimension_name = \"cube\";\n        break;\n      default:\n        dimension_name = \"2d\";\n    }\n    new_texture_binding.bindful_name =\n        fmt::format(\"xe_texture{}_{}_{}\", fetch_constant, dimension_name,\n                    is_signed ? 's' : 'u');\n  } else {\n    new_texture_binding.bindful_srv_index = kBindingIndexUnallocated;\n  }\n  new_texture_binding.bindful_srv_rdef_name_ptr = 0;\n  // Consistently 0 if not bindless as it may be used for hashing.\n  new_texture_binding.bindless_descriptor_index =\n      bindless_resources_used_ ? GetBindlessResourceCount() : 0;\n  new_texture_binding.fetch_constant = fetch_constant;\n  new_texture_binding.dimension = dimension;\n  new_texture_binding.is_signed = is_signed;\n  return texture_binding_index;\n}\n\nuint32_t DxbcShaderTranslator::FindOrAddSamplerBinding(\n    uint32_t fetch_constant, xenos::TextureFilter mag_filter,\n    xenos::TextureFilter min_filter, xenos::TextureFilter mip_filter,\n    xenos::AnisoFilter aniso_filter) {\n  // In Direct3D 12, anisotropic filtering implies linear filtering.\n  if (aniso_filter != xenos::AnisoFilter::kDisabled &&\n      aniso_filter != xenos::AnisoFilter::kUseFetchConst) {\n    mag_filter = xenos::TextureFilter::kLinear;\n    min_filter = xenos::TextureFilter::kLinear;\n    mip_filter = xenos::TextureFilter::kLinear;\n    aniso_filter = std::min(aniso_filter, xenos::AnisoFilter::kMax_16_1);\n  }\n  uint32_t sampler_index = UINT32_MAX;\n  for (uint32_t i = 0; i < uint32_t(sampler_bindings_.size()); ++i) {\n    const SamplerBinding& sampler_binding = sampler_bindings_[i];\n    if (sampler_binding.fetch_constant == fetch_constant &&\n        sampler_binding.mag_filter == mag_filter &&\n        sampler_binding.min_filter == min_filter &&\n        sampler_binding.mip_filter == mip_filter &&\n        sampler_binding.aniso_filter == aniso_filter) {\n      return i;\n    }\n  }\n  if (sampler_bindings_.size() >= kMaxSamplerBindings) {\n    assert_always();\n    return kMaxSamplerBindings - 1;\n  }\n  SamplerBinding& new_sampler_binding = sampler_bindings_.emplace_back();\n  // Consistently 0 if not bindless as it may be used for hashing.\n  new_sampler_binding.bindless_descriptor_index =\n      bindless_resources_used_ ? GetBindlessResourceCount() : 0;\n  new_sampler_binding.fetch_constant = fetch_constant;\n  new_sampler_binding.mag_filter = mag_filter;\n  new_sampler_binding.min_filter = min_filter;\n  new_sampler_binding.mip_filter = mip_filter;\n  new_sampler_binding.aniso_filter = aniso_filter;\n  if (!bindless_resources_used_) {\n    std::ostringstream name;\n    name << \"xe_sampler\" << fetch_constant;\n    if (aniso_filter == xenos::AnisoFilter::kDisabled ||\n        aniso_filter == xenos::AnisoFilter::kUseFetchConst) {\n      static const char kFilterSuffixes[] = {'p', 'l', 'b', 'f'};\n      name << '_' << kFilterSuffixes[uint32_t(mag_filter)]\n           << kFilterSuffixes[uint32_t(min_filter)]\n           << kFilterSuffixes[uint32_t(mip_filter)];\n    }\n    if (aniso_filter != xenos::AnisoFilter::kUseFetchConst) {\n      if (aniso_filter == xenos::AnisoFilter::kDisabled) {\n        name << \"_a0\";\n      } else {\n        name << \"_a\" << (UINT32_C(1) << (uint32_t(aniso_filter) - 1));\n      }\n    }\n    new_sampler_binding.bindful_name = name.str();\n  }\n  return uint32_t(sampler_bindings_.size() - 1);\n}\n\nvoid DxbcShaderTranslator::ProcessTextureFetchInstruction(\n    const ParsedTextureFetchInstruction& instr) {\n  if (emit_source_map_) {\n    instruction_disassembly_buffer_.Reset();\n    instr.Disassemble(&instruction_disassembly_buffer_);\n  }\n  UpdateInstructionPredicationAndEmitDisassembly(instr.is_predicated,\n                                                 instr.predicate_condition);\n\n  // Handle instructions for setting register LOD.\n  switch (instr.opcode) {\n    case FetchOpcode::kSetTextureLod: {\n      bool lod_operand_temp_pushed = false;\n      a_.OpMov(dxbc::Dest::R(system_temp_grad_h_lod_, 0b1000),\n               LoadOperand(instr.operands[0], 0b0001, lod_operand_temp_pushed)\n                   .SelectFromSwizzled(0));\n      if (lod_operand_temp_pushed) {\n        PopSystemTemp();\n      }\n      return;\n    }\n    case FetchOpcode::kSetTextureGradientsHorz: {\n      bool grad_operand_temp_pushed = false;\n      a_.OpMov(\n          dxbc::Dest::R(system_temp_grad_h_lod_, 0b0111),\n          LoadOperand(instr.operands[0], 0b0111, grad_operand_temp_pushed));\n      if (grad_operand_temp_pushed) {\n        PopSystemTemp();\n      }\n      return;\n    }\n    case FetchOpcode::kSetTextureGradientsVert: {\n      bool grad_operand_temp_pushed = false;\n      a_.OpMov(\n          dxbc::Dest::R(system_temp_grad_v_vfetch_address_, 0b0111),\n          LoadOperand(instr.operands[0], 0b0111, grad_operand_temp_pushed));\n      if (grad_operand_temp_pushed) {\n        PopSystemTemp();\n      }\n      return;\n    }\n    default:\n      break;\n  }\n\n  // Handle instructions that store something.\n  uint32_t used_result_components = instr.result.GetUsedResultComponents();\n  uint32_t used_result_nonzero_components = instr.GetNonZeroResultComponents();\n  // FIXME(Triang3l): Currently disregarding the LOD completely in getWeights\n  // because the needed code would be very complicated, while getWeights is\n  // mostly used for things like PCF of shadow maps, that don't have mips. The\n  // LOD would be needed for the mip lerp factor in W of the return value and to\n  // choose the LOD where interpolation would take place for XYZ. That would\n  // require either implementing the LOD calculation algorithm using the ALU\n  // (since the `lod` instruction is limited to pixel shaders and can't be used\n  // when there's control flow divergence, unlike explicit gradients), or\n  // sampling a texture filled with LOD numbers (easier and more consistent -\n  // unclamped LOD doesn't make sense for getWeights anyway). The same applies\n  // to offsets.\n  if (instr.opcode == FetchOpcode::kGetTextureWeights) {\n    used_result_nonzero_components &= ~uint32_t(0b1000);\n  }\n  if (!used_result_nonzero_components) {\n    // Nothing to fetch, only constant 0/1 writes.\n    StoreResult(instr.result, dxbc::Src::LF(0.0f));\n    return;\n  }\n\n  if (instr.opcode == FetchOpcode::kGetTextureGradients) {\n    // Handle before doing anything that actually needs the texture.\n    bool grad_operand_temp_pushed = false;\n    dxbc::Src grad_operand = LoadOperand(\n        instr.operands[0],\n        ((used_result_nonzero_components & 0b0011) ? 0b0001 : 0) |\n            ((used_result_nonzero_components & 0b1100) ? 0b0010 : 0),\n        grad_operand_temp_pushed);\n    if (used_result_nonzero_components & 0b0101) {\n      a_.OpDerivRTXCoarse(\n          dxbc::Dest::R(system_temp_result_,\n                        used_result_nonzero_components & 0b0101),\n          grad_operand.SwizzleSwizzled(0b010000));\n    }\n    if (used_result_nonzero_components & 0b1010) {\n      a_.OpDerivRTYCoarse(\n          dxbc::Dest::R(system_temp_result_,\n                        used_result_nonzero_components & 0b1010),\n          grad_operand.SwizzleSwizzled(0b01000000));\n    }\n    if (grad_operand_temp_pushed) {\n      PopSystemTemp();\n    }\n    StoreResult(instr.result, dxbc::Src::R(system_temp_result_));\n    return;\n  }\n\n  // Handle instructions that need the coordinates, the fetch constant, the LOD\n  // and possibly the SRV - kTextureFetch, kGetTextureBorderColorFrac,\n  // kGetTextureComputedLod, kGetTextureWeights.\n\n  if (instr.opcode == FetchOpcode::kGetTextureBorderColorFrac) {\n    // TODO(Triang3l): Bind a black texture with a white border to calculate the\n    // border color fraction (in the X component of the result).\n    assert_always();\n    EmitTranslationError(\"getBCF is unimplemented\", false);\n    StoreResult(instr.result, dxbc::Src::LF(0.0f));\n    return;\n  }\n\n  if (instr.opcode != FetchOpcode::kTextureFetch &&\n      instr.opcode != FetchOpcode::kGetTextureBorderColorFrac &&\n      instr.opcode != FetchOpcode::kGetTextureComputedLod &&\n      instr.opcode != FetchOpcode::kGetTextureWeights) {\n    assert_unhandled_case(instr.opcode);\n    EmitTranslationError(\"Unknown texture fetch operation\");\n    StoreResult(instr.result, dxbc::Src::LF(0.0f));\n    return;\n  }\n\n  uint32_t tfetch_index = instr.operands[1].storage_index;\n\n  // Whether to use gradients (implicit or explicit) for LOD calculation.\n  bool use_computed_lod =\n      instr.attributes.use_computed_lod &&\n      (is_pixel_shader() || instr.attributes.use_register_gradients);\n  if (instr.opcode == FetchOpcode::kGetTextureComputedLod &&\n      (!use_computed_lod || instr.attributes.use_register_gradients)) {\n    assert_always();\n    EmitTranslationError(\n        \"getCompTexLOD used with explicit LOD or gradients - contradicts MSDN\",\n        false);\n    StoreResult(instr.result, dxbc::Src::LF(0.0f));\n    return;\n  }\n\n  // Get offsets applied to the coordinates before sampling.\n  // `offsets` is used for float4 literal construction,\n  // FIXME(Triang3l): Offsets need to be applied at the LOD being fetched, not\n  // at LOD 0. However, since offsets have granularity of 0.5, not 1, on the\n  // Xbox 360, they can't be passed directly as AOffImmI to the `sample`\n  // instruction (plus-minus 0.5 offsets are very common in games). But\n  // offsetting at mip levels is a rare usage case, mostly offsets are used for\n  // things like shadow maps and blur, where there are no mips.\n  float offsets[3] = {};\n  // MSDN doesn't list offsets as getCompTexLOD parameters.\n  if (instr.opcode != FetchOpcode::kGetTextureComputedLod) {\n    // Add a small epsilon to the offset (1.5/4 the fixed-point texture\n    // coordinate ULP - shouldn't significantly effect the fixed-point\n    // conversion; 1/4 is also not enough with 3x resolution scaling very\n    // noticeably on the weapon in 4D5307E6) to resolve ambiguity when fetching\n    // point-sampled textures between texels. This applies to both normalized\n    // (58410954 Xbox Live Arcade logo, coordinates interpolated between\n    // vertices with half-pixel offset) and unnormalized (4D5307E6 lighting\n    // G-buffer reading, ps_param_gen pixels) coordinates. On Nvidia Pascal,\n    // without this adjustment, blockiness is visible in both cases. Possibly\n    // there is a better way, however, an attempt was made to error-correct\n    // division by adding the difference between original and re-denormalized\n    // coordinates, but on Nvidia, `mul` and internal multiplication in texture\n    // sampling apparently round differently, so `mul` gives a value that would\n    // be floored as expected, but the left/upper pixel is still sampled\n    // instead.\n    const float rounding_offset = 1.5f / 1024.0f;\n    switch (instr.dimension) {\n      case xenos::FetchOpDimension::k1D:\n        offsets[0] = instr.attributes.offset_x + rounding_offset;\n        if (instr.opcode == FetchOpcode::kGetTextureWeights) {\n          // For coordinate lerp factors. This needs to be done separately for\n          // point mag/min filters, but they're currently not handled here\n          // anyway.\n          offsets[0] -= 0.5f;\n        }\n        break;\n      case xenos::FetchOpDimension::k2D:\n        offsets[0] = instr.attributes.offset_x + rounding_offset;\n        offsets[1] = instr.attributes.offset_y + rounding_offset;\n        if (instr.opcode == FetchOpcode::kGetTextureWeights) {\n          offsets[0] -= 0.5f;\n          offsets[1] -= 0.5f;\n        }\n        break;\n      case xenos::FetchOpDimension::k3DOrStacked:\n        offsets[0] = instr.attributes.offset_x + rounding_offset;\n        offsets[1] = instr.attributes.offset_y + rounding_offset;\n        offsets[2] = instr.attributes.offset_z + rounding_offset;\n        if (instr.opcode == FetchOpcode::kGetTextureWeights) {\n          offsets[0] -= 0.5f;\n          offsets[1] -= 0.5f;\n          offsets[2] -= 0.5f;\n        }\n        break;\n      case xenos::FetchOpDimension::kCube:\n        // Applying the rounding epsilon to cube maps too for potential game\n        // passes processing cube map faces themselves.\n        offsets[0] = instr.attributes.offset_x + rounding_offset;\n        offsets[1] = instr.attributes.offset_y + rounding_offset;\n        if (instr.opcode == FetchOpcode::kGetTextureWeights) {\n          offsets[0] -= 0.5f;\n          offsets[1] -= 0.5f;\n          // The logic for ST weights is the same for all faces.\n          // FIXME(Triang3l): If LOD calculation is added to getWeights, face\n          // offset probably will need to be handled too (if the hardware\n          // supports it at all, though MSDN lists OffsetZ in tfetchCube).\n        } else {\n          offsets[2] = instr.attributes.offset_z;\n        }\n        break;\n    }\n  }\n  uint32_t offsets_not_zero = 0b000;\n  for (uint32_t i = 0; i < 3; ++i) {\n    if (offsets[i]) {\n      offsets_not_zero |= 1 << i;\n    }\n  }\n  dxbc::Src offsets_src(\n      dxbc::Src::LF(offsets[0], offsets[1], offsets[2], 0.0f));\n\n  // Load the texture size if needed.\n  // 1D: X - width.\n  // 2D, cube: X - width, Y - height (cube maps probably can be only square, but\n  //           for simplicity).\n  // 3D: X - width, Y - height, Z - depth, W - 0 if stacked 2D, 1 if 3D.\n  uint32_t size_needed_components = 0b0000;\n  if (instr.opcode == FetchOpcode::kGetTextureWeights) {\n    // Size needed for denormalization for coordinate lerp factor.\n    // FIXME(Triang3l): Currently disregarding the LOD completely in getWeights.\n    // However, if the LOD lerp factor and the LOD where filtering would happen\n    // are ever calculated, all components of the size may be needed for ALU LOD\n    // calculation with normalized coordinates (or, if a texture filled with LOD\n    // indices is used, coordinates will need to be normalized as normally).\n    if (!instr.attributes.unnormalized_coordinates) {\n      switch (instr.dimension) {\n        case xenos::FetchOpDimension::k1D:\n          size_needed_components |= used_result_nonzero_components & 0b0001;\n          break;\n        case xenos::FetchOpDimension::k2D:\n        case xenos::FetchOpDimension::kCube:\n          size_needed_components |= used_result_nonzero_components & 0b0011;\n          break;\n        case xenos::FetchOpDimension::k3DOrStacked:\n          size_needed_components |= used_result_nonzero_components & 0b0111;\n          break;\n      }\n    }\n  } else {\n    // Size needed for normalization (or, for stacked texture layers,\n    // denormalization) and for offsets.\n    size_needed_components |= offsets_not_zero;\n    switch (instr.dimension) {\n      case xenos::FetchOpDimension::k1D:\n        if (instr.attributes.unnormalized_coordinates) {\n          size_needed_components |= 0b0001;\n        }\n        break;\n      case xenos::FetchOpDimension::k2D:\n        if (instr.attributes.unnormalized_coordinates) {\n          size_needed_components |= 0b0011;\n        }\n        break;\n      case xenos::FetchOpDimension::k3DOrStacked:\n        // Stacked and 3D textures are fetched from different SRVs - the check\n        // is always needed.\n        size_needed_components |= 0b1000;\n        if (instr.attributes.unnormalized_coordinates) {\n          // Need to normalize all (if 3D).\n          size_needed_components |= 0b0111;\n        } else {\n          // Need to denormalize Z (if stacked).\n          size_needed_components |= 0b0100;\n        }\n        break;\n      case xenos::FetchOpDimension::kCube:\n        if (instr.attributes.unnormalized_coordinates) {\n          size_needed_components |= 0b0011;\n        }\n        // The size is not needed for face ID offset.\n        size_needed_components &= 0b0011;\n        break;\n    }\n  }\n  if (instr.dimension == xenos::FetchOpDimension::k3DOrStacked &&\n      size_needed_components) {\n    // Stacked and 3D textures have different size packing - need to get whether\n    // the texture is 3D unconditionally.\n    size_needed_components |= 0b1000;\n  }\n  uint32_t size_and_is_3d_temp =\n      size_needed_components ? PushSystemTemp() : UINT32_MAX;\n  if (size_needed_components) {\n    switch (instr.dimension) {\n      case xenos::FetchOpDimension::k1D:\n        a_.OpUBFE(dxbc::Dest::R(size_and_is_3d_temp, 0b0001), dxbc::Src::LU(24),\n                  dxbc::Src::LU(0),\n                  RequestTextureFetchConstantWord(tfetch_index, 2));\n        break;\n      case xenos::FetchOpDimension::k2D:\n      case xenos::FetchOpDimension::kCube:\n        a_.OpUBFE(dxbc::Dest::R(size_and_is_3d_temp, size_needed_components),\n                  dxbc::Src::LU(13, 13, 0, 0), dxbc::Src::LU(0, 13, 0, 0),\n                  RequestTextureFetchConstantWord(tfetch_index, 2));\n        break;\n      case xenos::FetchOpDimension::k3DOrStacked:\n        // tfetch3D is used for both stacked and 3D - first, check if 3D.\n        a_.OpUBFE(dxbc::Dest::R(size_and_is_3d_temp, 0b1000), dxbc::Src::LU(2),\n                  dxbc::Src::LU(9),\n                  RequestTextureFetchConstantWord(tfetch_index, 5));\n        a_.OpIEq(dxbc::Dest::R(size_and_is_3d_temp, 0b1000),\n                 dxbc::Src::R(size_and_is_3d_temp, dxbc::Src::kWWWW),\n                 dxbc::Src::LU(uint32_t(xenos::DataDimension::k3D)));\n        if (size_needed_components & 0b0111) {\n          // Even if depth isn't needed specifically for stacked or specifically\n          // for 3D later, load both cases anyway to make sure the register is\n          // always initialized.\n          a_.OpIf(true, dxbc::Src::R(size_and_is_3d_temp, dxbc::Src::kWWWW));\n          // Load the 3D texture size.\n          a_.OpUBFE(dxbc::Dest::R(size_and_is_3d_temp,\n                                  size_needed_components & 0b0111),\n                    dxbc::Src::LU(11, 11, 10, 0), dxbc::Src::LU(0, 11, 22, 0),\n                    RequestTextureFetchConstantWord(tfetch_index, 2));\n          a_.OpElse();\n          // Load the 2D stacked texture size.\n          a_.OpUBFE(dxbc::Dest::R(size_and_is_3d_temp,\n                                  size_needed_components & 0b0111),\n                    dxbc::Src::LU(13, 13, 6, 0), dxbc::Src::LU(0, 13, 26, 0),\n                    RequestTextureFetchConstantWord(tfetch_index, 2));\n          a_.OpEndIf();\n        }\n        break;\n    }\n    if (size_needed_components & 0b0111) {\n      // Fetch constants store size minus 1 - add 1.\n      a_.OpIAdd(\n          dxbc::Dest::R(size_and_is_3d_temp, size_needed_components & 0b0111),\n          dxbc::Src::R(size_and_is_3d_temp), dxbc::Src::LU(1));\n      // Convert the size to float for multiplication/division.\n      a_.OpUToF(\n          dxbc::Dest::R(size_and_is_3d_temp, size_needed_components & 0b0111),\n          dxbc::Src::R(size_and_is_3d_temp));\n    }\n  }\n  uint32_t revert_resolution_scale_axes =\n      cvars::draw_resolution_scaled_texture_offsets\n          ? uint32_t(draw_resolution_scale_x_ > 1) |\n                (uint32_t(draw_resolution_scale_y_ > 1) << 1)\n          : 0;\n\n  if (instr.opcode == FetchOpcode::kGetTextureWeights) {\n    // FIXME(Triang3l): Mip lerp factor needs to be calculated, and the\n    // coordinate lerp factors should be calculated at the mip level texels\n    // would be sampled from. That would require some way of calculating the LOD\n    // that would be applicable to explicit gradients and vertex shaders. Also,\n    // with point sampling, possibly lerp factors need to be 0. W  (mip lerp\n    // factor) should have been masked out previously because it's not supported\n    // currently.\n    assert_zero(used_result_nonzero_components & 0b1000);\n\n    // FIXME(Triang3l): Filtering modes should possibly be taken into account,\n    // but for simplicity, not doing that - from a high level point of view,\n    // would be useless to get weights that will always be zero.\n\n    // Need unnormalized coordinates.\n    bool coord_operand_temp_pushed = false;\n    dxbc::Src coord_operand =\n        LoadOperand(instr.operands[0], used_result_nonzero_components,\n                    coord_operand_temp_pushed);\n    dxbc::Src coord_src(coord_operand);\n    // If needed, apply the resolution scale to the width / height and the\n    // unnormalized coordinates.\n    uint32_t resolution_scaled_result_components =\n        used_result_nonzero_components & revert_resolution_scale_axes;\n    uint32_t resolution_scaled_coord_components =\n        instr.attributes.unnormalized_coordinates\n            ? resolution_scaled_result_components\n            : 0b0000;\n    uint32_t resolution_scaled_size_components =\n        size_needed_components & resolution_scaled_result_components;\n    if (resolution_scaled_coord_components ||\n        resolution_scaled_size_components) {\n      if (resolution_scaled_coord_components &&\n          (coord_src.type_ != dxbc::OperandType::kTemp ||\n           coord_src.index_1d_.index_ != system_temp_result_)) {\n        // Use system_temp_result_ as a temporary for conditionally\n        // resolution-scaled coordinates.\n        a_.OpMov(\n            dxbc::Dest::R(system_temp_result_, used_result_nonzero_components),\n            coord_src);\n        coord_src = dxbc::Src::R(system_temp_result_);\n      }\n      // Using system_temp_result_.w as a temporary for the flag indicating\n      // whether the texture is resolution-scaled - not involved in coordinate\n      // calculations.\n      assert_zero(used_result_nonzero_components & 0b1000);\n      a_.OpAnd(dxbc::Dest::R(system_temp_result_, 0b1000),\n               LoadSystemConstant(\n                   SystemConstants::Index::kTexturesResolutionScaled,\n                   offsetof(SystemConstants, textures_resolution_scaled),\n                   dxbc::Src::kXXXX),\n               dxbc::Src::LU(uint32_t(1) << tfetch_index));\n      a_.OpIf(true, dxbc::Src::R(system_temp_result_, dxbc::Src::kWWWW));\n      // The texture is resolution-scaled - scale the coordinates and the size.\n      dxbc::Src resolution_scale_src(\n          dxbc::Src::LF(float(draw_resolution_scale_x_),\n                        float(draw_resolution_scale_y_), 1.0f, 1.0f));\n      if (resolution_scaled_coord_components) {\n        a_.OpMul(dxbc::Dest::R(system_temp_result_,\n                               resolution_scaled_coord_components),\n                 coord_src, resolution_scale_src);\n      }\n      if (resolution_scaled_size_components) {\n        a_.OpMul(dxbc::Dest::R(size_and_is_3d_temp,\n                               resolution_scaled_size_components),\n                 dxbc::Src::R(size_and_is_3d_temp), resolution_scale_src);\n      }\n      a_.OpEndIf();\n    }\n    uint32_t offsets_needed = offsets_not_zero & used_result_nonzero_components;\n    if (!instr.attributes.unnormalized_coordinates || offsets_needed) {\n      // Using system_temp_result_ as a temporary for coordinate denormalization\n      // and offsetting. May already contain the coordinates loaded if\n      // resolution scaling was applied to the coordinates.\n      coord_src = dxbc::Src::R(system_temp_result_);\n      dxbc::Dest coord_dest(\n          dxbc::Dest::R(system_temp_result_, used_result_nonzero_components));\n      if (instr.attributes.unnormalized_coordinates) {\n        if (offsets_needed) {\n          a_.OpAdd(coord_dest, coord_operand, offsets_src);\n        }\n      } else {\n        assert_true((size_needed_components & used_result_nonzero_components) ==\n                    used_result_nonzero_components);\n        if (offsets_needed) {\n          a_.OpMAd(coord_dest, coord_operand, dxbc::Src::R(size_and_is_3d_temp),\n                   offsets_src);\n        } else {\n          a_.OpMul(coord_dest, coord_operand,\n                   dxbc::Src::R(size_and_is_3d_temp));\n        }\n      }\n    }\n    // 0.5 has already been subtracted via offsets previously.\n    a_.OpFrc(dxbc::Dest::R(system_temp_result_, used_result_nonzero_components),\n             coord_src);\n    if (coord_operand_temp_pushed) {\n      PopSystemTemp();\n    }\n  } else {\n    // - Component signedness, for selecting the SRV, and if data is needed.\n\n    dxbc::Src signs_uint_src(\n        GetSystemConstantSrc(offsetof(SystemConstants, texture_swizzled_signs) +\n                                 sizeof(uint32_t) * (tfetch_index >> 2),\n                             dxbc::Src::kXXXX));\n    uint32_t signs_shift = (tfetch_index & 3) * 8;\n    uint32_t signs_temp = UINT32_MAX;\n    if (instr.opcode == FetchOpcode::kTextureFetch) {\n      signs_temp = PushSystemTemp();\n      MarkSystemConstantUsed(SystemConstants::Index::kTextureSwizzledSigns);\n      a_.OpUBFE(dxbc::Dest::R(signs_temp, used_result_nonzero_components),\n                dxbc::Src::LU(2),\n                dxbc::Src::LU(signs_shift, signs_shift + 2, signs_shift + 4,\n                              signs_shift + 6),\n                signs_uint_src);\n    }\n\n    // - Coordinates.\n\n    // Will need a temporary in all cases:\n    // - 1D, 2D array - need to be padded to 2D array coordinates.\n    // - 3D - Z needs to be unnormalized for stacked and normalized for 3D.\n    // - Cube - coordinates need to be transformed into the cube space.\n    // Bindless sampler index will be loaded to W after loading the coordinates\n    // (so W can be used as a temporary for coordinate loading).\n    uint32_t coord_and_sampler_temp = PushSystemTemp();\n\n    // Need normalized coordinates (except for Z - keep it as is, will be\n    // converted later according to whether the texture is 3D). For cube maps,\n    // coordinates need to be transformed back into the cube space.\n    bool coord_operand_temp_pushed = false;\n    dxbc::Src coord_operand = LoadOperand(\n        instr.operands[0],\n        (1 << xenos::GetFetchOpDimensionComponentCount(instr.dimension)) - 1,\n        coord_operand_temp_pushed);\n    uint32_t normalized_components = 0b0000;\n    switch (instr.dimension) {\n      case xenos::FetchOpDimension::k1D:\n        normalized_components = 0b0001;\n        break;\n      case xenos::FetchOpDimension::k2D:\n      case xenos::FetchOpDimension::kCube:\n        normalized_components = 0b0011;\n        break;\n      case xenos::FetchOpDimension::k3DOrStacked:\n        normalized_components = 0b0111;\n        break;\n    }\n    uint32_t normalized_components_with_offsets =\n        normalized_components & offsets_not_zero;\n    uint32_t normalized_components_with_scaled_offsets =\n        normalized_components_with_offsets & revert_resolution_scale_axes;\n    uint32_t normalized_components_with_unscaled_offsets =\n        normalized_components_with_offsets &\n        ~normalized_components_with_scaled_offsets;\n    uint32_t normalized_components_without_offsets =\n        normalized_components & ~normalized_components_with_offsets;\n    if (instr.attributes.unnormalized_coordinates) {\n      // Unnormalized coordinates - normalize XY, and if 3D, normalize Z.\n      assert_not_zero(normalized_components);\n      assert_true((size_needed_components & normalized_components) ==\n                  normalized_components);\n      if (normalized_components_with_offsets) {\n        // Apply the offsets to components to normalize where needed, or just\n        // copy the components to coord_and_sampler_temp where not.\n        // FIXME(Triang3l): Offsets need to be applied at the LOD being fetched.\n        if (normalized_components_with_scaled_offsets) {\n          // Using coord_and_sampler_temp.w as a temporary for the needed\n          // resolution scale inverse - sampler not loaded yet.\n          a_.OpAnd(dxbc::Dest::R(coord_and_sampler_temp, 0b1000),\n                   LoadSystemConstant(\n                       SystemConstants::Index::kTexturesResolutionScaled,\n                       offsetof(SystemConstants, textures_resolution_scaled),\n                       dxbc::Src::kXXXX),\n                   dxbc::Src::LU(uint32_t(1) << tfetch_index));\n          a_.OpIf(true, dxbc::Src::R(coord_and_sampler_temp, dxbc::Src::kWWWW));\n          a_.OpAdd(\n              dxbc::Dest::R(coord_and_sampler_temp,\n                            normalized_components_with_scaled_offsets),\n              coord_operand,\n              dxbc::Src::LF(offsets[0] / draw_resolution_scale_x_,\n                            offsets[1] / draw_resolution_scale_y_, 0.0f, 0.0f));\n          a_.OpElse();\n          a_.OpAdd(dxbc::Dest::R(coord_and_sampler_temp,\n                                 normalized_components_with_scaled_offsets),\n                   coord_operand, offsets_src);\n          a_.OpEndIf();\n        }\n        if (normalized_components_with_unscaled_offsets) {\n          a_.OpAdd(dxbc::Dest::R(coord_and_sampler_temp,\n                                 normalized_components_with_unscaled_offsets),\n                   coord_operand, offsets_src);\n        }\n        if (normalized_components_without_offsets) {\n          a_.OpMov(dxbc::Dest::R(coord_and_sampler_temp,\n                                 normalized_components_without_offsets),\n                   coord_operand);\n        }\n        assert_not_zero(normalized_components & 0b011);\n        a_.OpDiv(dxbc::Dest::R(coord_and_sampler_temp,\n                               normalized_components & 0b011),\n                 dxbc::Src::R(coord_and_sampler_temp),\n                 dxbc::Src::R(size_and_is_3d_temp));\n        if (instr.dimension == xenos::FetchOpDimension::k3DOrStacked) {\n          // Normalize if 3D.\n          assert_true((size_needed_components & 0b1100) == 0b1100);\n          a_.OpIf(true, dxbc::Src::R(size_and_is_3d_temp, dxbc::Src::kWWWW));\n          a_.OpDiv(dxbc::Dest::R(coord_and_sampler_temp, 0b0100),\n                   dxbc::Src::R(coord_and_sampler_temp, dxbc::Src::kZZZZ),\n                   dxbc::Src::R(size_and_is_3d_temp, dxbc::Src::kZZZZ));\n          a_.OpEndIf();\n        }\n      } else {\n        a_.OpDiv(dxbc::Dest::R(coord_and_sampler_temp, normalized_components),\n                 coord_operand, dxbc::Src::R(size_and_is_3d_temp));\n        if (instr.dimension == xenos::FetchOpDimension::k3DOrStacked) {\n          // Don't normalize if stacked.\n          assert_true((size_needed_components & 0b1000) == 0b1000);\n          a_.OpMovC(dxbc::Dest::R(coord_and_sampler_temp, 0b0100),\n                    dxbc::Src::R(size_and_is_3d_temp, dxbc::Src::kWWWW),\n                    dxbc::Src::R(coord_and_sampler_temp, dxbc::Src::kZZZZ),\n                    coord_operand.SelectFromSwizzled(2));\n        }\n      }\n    } else {\n      // Normalized coordinates - apply offsets to XY or copy them to\n      // coord_and_sampler_temp, and if stacked, denormalize Z.\n      if (normalized_components_with_offsets) {\n        // FIXME(Triang3l): Offsets need to be applied at the LOD being fetched.\n        assert_true(\n            (size_needed_components & normalized_components_with_offsets) ==\n            normalized_components_with_offsets);\n        a_.OpDiv(dxbc::Dest::R(coord_and_sampler_temp,\n                               normalized_components_with_offsets),\n                 offsets_src, dxbc::Src::R(size_and_is_3d_temp));\n        if (normalized_components_with_scaled_offsets) {\n          // Using coord_and_sampler_temp.w as a temporary for the needed\n          // resolution scale inverse - sampler not loaded yet.\n          a_.OpAnd(dxbc::Dest::R(coord_and_sampler_temp, 0b1000),\n                   LoadSystemConstant(\n                       SystemConstants::Index::kTexturesResolutionScaled,\n                       offsetof(SystemConstants, textures_resolution_scaled),\n                       dxbc::Src::kXXXX),\n                   dxbc::Src::LU(uint32_t(1) << tfetch_index));\n          a_.OpIf(true, dxbc::Src::R(coord_and_sampler_temp, dxbc::Src::kWWWW));\n          a_.OpMAd(dxbc::Dest::R(coord_and_sampler_temp,\n                                 normalized_components_with_scaled_offsets),\n                   dxbc::Src::R(coord_and_sampler_temp),\n                   dxbc::Src::LF(1.0f / draw_resolution_scale_x_,\n                                 1.0f / draw_resolution_scale_y_, 1.0f, 1.0f),\n                   coord_operand);\n          a_.OpElse();\n          a_.OpAdd(dxbc::Dest::R(coord_and_sampler_temp,\n                                 normalized_components_with_scaled_offsets),\n                   coord_operand, dxbc::Src::R(coord_and_sampler_temp));\n          a_.OpEndIf();\n        }\n        if (normalized_components_with_unscaled_offsets) {\n          a_.OpAdd(dxbc::Dest::R(coord_and_sampler_temp,\n                                 normalized_components_with_unscaled_offsets),\n                   coord_operand, dxbc::Src::R(coord_and_sampler_temp));\n        }\n      }\n      // 3D/stacked without offset is handled separately.\n      if (normalized_components_without_offsets & 0b011) {\n        a_.OpMov(dxbc::Dest::R(coord_and_sampler_temp,\n                               normalized_components_without_offsets & 0b011),\n                 coord_operand);\n      }\n      if (instr.dimension == xenos::FetchOpDimension::k3DOrStacked) {\n        assert_true((size_needed_components & 0b1100) == 0b1100);\n        if (normalized_components_with_offsets & 0b100) {\n          // Denormalize and offset Z (re-apply the offset not to lose precision\n          // as a result of division) if stacked.\n          a_.OpIf(false, dxbc::Src::R(size_and_is_3d_temp, dxbc::Src::kWWWW));\n          a_.OpMAd(dxbc::Dest::R(coord_and_sampler_temp, 0b0100),\n                   coord_operand.SelectFromSwizzled(2),\n                   dxbc::Src::R(size_and_is_3d_temp, dxbc::Src::kZZZZ),\n                   dxbc::Src::LF(offsets[2]));\n          a_.OpEndIf();\n        } else {\n          // Denormalize Z if stacked, and revert to normalized if 3D.\n          a_.OpMul(dxbc::Dest::R(coord_and_sampler_temp, 0b0100),\n                   coord_operand.SelectFromSwizzled(2),\n                   dxbc::Src::R(size_and_is_3d_temp, dxbc::Src::kZZZZ));\n          a_.OpMovC(dxbc::Dest::R(coord_and_sampler_temp, 0b0100),\n                    dxbc::Src::R(size_and_is_3d_temp, dxbc::Src::kWWWW),\n                    coord_operand.SelectFromSwizzled(2),\n                    dxbc::Src::R(coord_and_sampler_temp, dxbc::Src::kZZZZ));\n        }\n      }\n    }\n    switch (instr.dimension) {\n      case xenos::FetchOpDimension::k1D:\n        // Pad to 2D array coordinates.\n        a_.OpMov(dxbc::Dest::R(coord_and_sampler_temp, 0b0110),\n                 dxbc::Src::LF(0.0f));\n        break;\n      case xenos::FetchOpDimension::k2D:\n        // Pad to 2D array coordinates.\n        a_.OpMov(dxbc::Dest::R(coord_and_sampler_temp, 0b0100),\n                 dxbc::Src::LF(0.0f));\n        break;\n      case xenos::FetchOpDimension::kCube: {\n        // Transform from the major axis SC/TC plus 1 into cube coordinates.\n        // Move SC/TC from 1...2 to -1...1.\n        a_.OpMAd(dxbc::Dest::R(coord_and_sampler_temp, 0b0011),\n                 dxbc::Src::R(coord_and_sampler_temp), dxbc::Src::LF(2.0f),\n                 dxbc::Src::LF(-3.0f));\n        // Get the face index (floored, within 0...5) as an integer to\n        // coord_and_sampler_temp.z.\n        if (offsets[2]) {\n          a_.OpAdd(dxbc::Dest::R(coord_and_sampler_temp, 0b0100),\n                   coord_operand.SelectFromSwizzled(2),\n                   dxbc::Src::LF(offsets[2]));\n          a_.OpFToU(dxbc::Dest::R(coord_and_sampler_temp, 0b0100),\n                    dxbc::Src::R(coord_and_sampler_temp, dxbc::Src::kZZZZ));\n        } else {\n          a_.OpFToU(dxbc::Dest::R(coord_and_sampler_temp, 0b0100),\n                    coord_operand.SelectFromSwizzled(2));\n        }\n        a_.OpUMin(dxbc::Dest::R(coord_and_sampler_temp, 0b0100),\n                  dxbc::Src::R(coord_and_sampler_temp, dxbc::Src::kZZZZ),\n                  dxbc::Src::LU(5));\n        // Split the face index into axis and sign (0 - positive, 1 - negative)\n        // to coord_and_sampler_temp.zw (sign in W so it won't be overwritten).\n        // Fine to overwrite W at this point, the sampler index hasn't been\n        // loaded yet.\n        a_.OpUBFE(dxbc::Dest::R(coord_and_sampler_temp, 0b1100),\n                  dxbc::Src::LU(0, 0, 2, 1), dxbc::Src::LU(0, 0, 1, 0),\n                  dxbc::Src::R(coord_and_sampler_temp, dxbc::Src::kZZZZ));\n        // Remap the axes in a way opposite to the ALU cube instruction.\n        a_.OpSwitch(dxbc::Src::R(coord_and_sampler_temp, dxbc::Src::kZZZZ));\n        a_.OpCase(dxbc::Src::LU(0));\n        {\n          // X is the major axis.\n          // Y = -TC (TC overwritten).\n          a_.OpMov(dxbc::Dest::R(coord_and_sampler_temp, 0b0010),\n                   -dxbc::Src::R(coord_and_sampler_temp, dxbc::Src::kYYYY));\n          // Z = neg ? SC : -SC.\n          a_.OpMovC(dxbc::Dest::R(coord_and_sampler_temp, 0b0100),\n                    dxbc::Src::R(coord_and_sampler_temp, dxbc::Src::kWWWW),\n                    dxbc::Src::R(coord_and_sampler_temp, dxbc::Src::kXXXX),\n                    -dxbc::Src::R(coord_and_sampler_temp, dxbc::Src::kXXXX));\n          // X = neg ? -1 : 1 (SC overwritten).\n          a_.OpMovC(dxbc::Dest::R(coord_and_sampler_temp, 0b0001),\n                    dxbc::Src::R(coord_and_sampler_temp, dxbc::Src::kWWWW),\n                    dxbc::Src::LF(-1.0f), dxbc::Src::LF(1.0f));\n        }\n        a_.OpBreak();\n        a_.OpCase(dxbc::Src::LU(1));\n        {\n          // Y is the major axis.\n          // X = SC (already there).\n          // Z = neg ? -TC : TC.\n          a_.OpMovC(dxbc::Dest::R(coord_and_sampler_temp, 0b0100),\n                    dxbc::Src::R(coord_and_sampler_temp, dxbc::Src::kWWWW),\n                    -dxbc::Src::R(coord_and_sampler_temp, dxbc::Src::kYYYY),\n                    dxbc::Src::R(coord_and_sampler_temp, dxbc::Src::kYYYY));\n          // Y = neg ? -1 : 1 (TC overwritten).\n          a_.OpMovC(dxbc::Dest::R(coord_and_sampler_temp, 0b0010),\n                    dxbc::Src::R(coord_and_sampler_temp, dxbc::Src::kWWWW),\n                    dxbc::Src::LF(-1.0f), dxbc::Src::LF(1.0f));\n        }\n        a_.OpBreak();\n        a_.OpDefault();\n        {\n          // Z is the major axis.\n          // X = neg ? -SC : SC (SC overwritten).\n          a_.OpMovC(dxbc::Dest::R(coord_and_sampler_temp, 0b0001),\n                    dxbc::Src::R(coord_and_sampler_temp, dxbc::Src::kWWWW),\n                    -dxbc::Src::R(coord_and_sampler_temp, dxbc::Src::kXXXX),\n                    dxbc::Src::R(coord_and_sampler_temp, dxbc::Src::kXXXX));\n          // Y = -TC (TC overwritten).\n          a_.OpMov(dxbc::Dest::R(coord_and_sampler_temp, 0b0010),\n                   -dxbc::Src::R(coord_and_sampler_temp, dxbc::Src::kYYYY));\n          // Z = neg ? -1 : 1.\n          a_.OpMovC(dxbc::Dest::R(coord_and_sampler_temp, 0b0100),\n                    dxbc::Src::R(coord_and_sampler_temp, dxbc::Src::kWWWW),\n                    dxbc::Src::LF(-1.0f), dxbc::Src::LF(1.0f));\n        }\n        a_.OpBreak();\n        a_.OpEndSwitch();\n      } break;\n      default:\n        break;\n    }\n    if (coord_operand_temp_pushed) {\n      PopSystemTemp();\n    }\n\n    if (instr.opcode == FetchOpcode::kGetTextureComputedLod) {\n      // Because the `lod` instruction is not defined for point sampling, and\n      // since the return value can be used with bias later, forcing linear mip\n      // filtering (the XNA assembler also doesn't accept MipFilter overrides\n      // for getCompTexLOD).\n      uint32_t sampler_binding_index = FindOrAddSamplerBinding(\n          tfetch_index, instr.attributes.mag_filter,\n          instr.attributes.min_filter, xenos::TextureFilter::kLinear,\n          instr.attributes.aniso_filter);\n      dxbc::Src sampler(\n          dxbc::Src::S(sampler_binding_index, sampler_binding_index));\n      if (bindless_resources_used_) {\n        // Load the sampler index to coord_and_sampler_temp.w and use relative\n        // sampler indexing.\n        if (cbuffer_index_descriptor_indices_ == kBindingIndexUnallocated) {\n          cbuffer_index_descriptor_indices_ = cbuffer_count_++;\n        }\n        uint32_t sampler_bindless_descriptor_index =\n            sampler_bindings_[sampler_binding_index].bindless_descriptor_index;\n        a_.OpMov(dxbc::Dest::R(coord_and_sampler_temp, 0b1000),\n                 dxbc::Src::CB(cbuffer_index_descriptor_indices_,\n                               uint32_t(CbufferRegister::kDescriptorIndices),\n                               sampler_bindless_descriptor_index >> 2)\n                     .Select(sampler_bindless_descriptor_index & 3));\n        sampler = dxbc::Src::S(0, dxbc::Index(coord_and_sampler_temp, 3));\n      }\n      // Check which SRV needs to be accessed - signed or unsigned. If there is\n      // at least one non-signed component, will be using the unsigned one.\n      uint32_t is_unsigned_temp = PushSystemTemp();\n      MarkSystemConstantUsed(SystemConstants::Index::kTextureSwizzledSigns);\n      a_.OpUBFE(dxbc::Dest::R(is_unsigned_temp, 0b0001), dxbc::Src::LU(8),\n                dxbc::Src::LU(signs_shift), signs_uint_src);\n      a_.OpINE(\n          dxbc::Dest::R(is_unsigned_temp, 0b0001),\n          dxbc::Src::R(is_unsigned_temp, dxbc::Src::kXXXX),\n          dxbc::Src::LU(uint32_t(xenos::TextureSign::kSigned) * 0b01010101));\n      if (bindless_resources_used_) {\n        // Bindless path - select the SRV index between unsigned and signed to\n        // query.\n        if (instr.dimension == xenos::FetchOpDimension::k3DOrStacked) {\n          // Check if 3D.\n          assert_true((size_needed_components & 0b1000) == 0b1000);\n          a_.OpIf(true, dxbc::Src::R(size_and_is_3d_temp, dxbc::Src::kWWWW));\n        }\n        for (uint32_t is_stacked = 0;\n             is_stacked <\n             (instr.dimension == xenos::FetchOpDimension::k3DOrStacked ? 2u\n                                                                       : 1u);\n             ++is_stacked) {\n          xenos::FetchOpDimension srv_dimension = instr.dimension;\n          if (is_stacked) {\n            srv_dimension = xenos::FetchOpDimension::k2D;\n            a_.OpElse();\n          }\n          uint32_t texture_binding_index_unsigned =\n              FindOrAddTextureBinding(tfetch_index, srv_dimension, false);\n          uint32_t texture_binding_index_signed =\n              FindOrAddTextureBinding(tfetch_index, srv_dimension, true);\n          uint32_t texture_bindless_descriptor_index_unsigned =\n              texture_bindings_[texture_binding_index_unsigned]\n                  .bindless_descriptor_index;\n          uint32_t texture_bindless_descriptor_index_signed =\n              texture_bindings_[texture_binding_index_signed]\n                  .bindless_descriptor_index;\n          if (cbuffer_index_descriptor_indices_ == kBindingIndexUnallocated) {\n            cbuffer_index_descriptor_indices_ = cbuffer_count_++;\n          }\n          a_.OpMovC(\n              dxbc::Dest::R(is_unsigned_temp, 0b0001),\n              dxbc::Src::R(is_unsigned_temp, dxbc::Src::kXXXX),\n              dxbc::Src::CB(cbuffer_index_descriptor_indices_,\n                            uint32_t(CbufferRegister::kDescriptorIndices),\n                            texture_bindless_descriptor_index_unsigned >> 2)\n                  .Select(texture_bindless_descriptor_index_unsigned & 3),\n              dxbc::Src::CB(cbuffer_index_descriptor_indices_,\n                            uint32_t(CbufferRegister::kDescriptorIndices),\n                            texture_bindless_descriptor_index_signed >> 2)\n                  .Select(texture_bindless_descriptor_index_signed & 3));\n          // Always 3 coordinate components (1D and 2D are padded to 2D\n          // arrays, 3D and cube have 3 coordinate dimensions). Not caring\n          // about normalization of the array layer because it doesn't\n          // participate in LOD calculation in Direct3D 12.\n          // The `lod` instruction returns the unclamped LOD (probably need\n          // unclamped so it can be biased back into the range later) in the Y\n          // component, and the resource swizzle is the return value swizzle.\n          // FIXME(Triang3l): Gradient exponent adjustment from the fetch\n          // constant needs to be applied here, would require math involving\n          // SV_Position parity, replacing coordinates for one pixel with 0\n          // and for another with the adjusted gradient, but possibly not used\n          // by any games.\n          assert_true(used_result_nonzero_components == 0b0001);\n          uint32_t* bindless_srv_index = nullptr;\n          switch (srv_dimension) {\n            case xenos::FetchOpDimension::k1D:\n            case xenos::FetchOpDimension::k2D:\n              bindless_srv_index = &srv_index_bindless_textures_2d_;\n              break;\n            case xenos::FetchOpDimension::k3DOrStacked:\n              bindless_srv_index = &srv_index_bindless_textures_3d_;\n              break;\n            case xenos::FetchOpDimension::kCube:\n              bindless_srv_index = &srv_index_bindless_textures_cube_;\n              break;\n          }\n          assert_not_null(bindless_srv_index);\n          if (*bindless_srv_index == kBindingIndexUnallocated) {\n            *bindless_srv_index = srv_count_++;\n          }\n          a_.OpLOD(\n              dxbc::Dest::R(system_temp_result_, 0b0001),\n              dxbc::Src::R(coord_and_sampler_temp), 3,\n              dxbc::Src::T(*bindless_srv_index,\n                           dxbc::Index(is_unsigned_temp, 0), dxbc::Src::kYYYY),\n              sampler);\n        }\n        if (instr.dimension == xenos::FetchOpDimension::k3DOrStacked) {\n          // Close the 3D/stacked check.\n          a_.OpEndIf();\n        }\n      } else {\n        // Bindful path - conditionally query one of the SRVs.\n        a_.OpIf(true, dxbc::Src::R(is_unsigned_temp, dxbc::Src::kXXXX));\n        for (uint32_t is_signed = 0; is_signed < 2; ++is_signed) {\n          if (is_signed) {\n            a_.OpElse();\n          }\n          if (instr.dimension == xenos::FetchOpDimension::k3DOrStacked) {\n            // Check if 3D.\n            assert_true((size_needed_components & 0b1000) == 0b1000);\n            a_.OpIf(true, dxbc::Src::R(size_and_is_3d_temp, dxbc::Src::kWWWW));\n          }\n          for (uint32_t is_stacked = 0;\n               is_stacked <\n               (instr.dimension == xenos::FetchOpDimension::k3DOrStacked ? 2u\n                                                                         : 1u);\n               ++is_stacked) {\n            if (is_stacked) {\n              a_.OpElse();\n            }\n            assert_true(used_result_nonzero_components == 0b0001);\n            uint32_t texture_binding_index = FindOrAddTextureBinding(\n                tfetch_index,\n                is_stacked ? xenos::FetchOpDimension::k2D : instr.dimension,\n                is_signed != 0);\n            a_.OpLOD(\n                dxbc::Dest::R(system_temp_result_, 0b0001),\n                dxbc::Src::R(coord_and_sampler_temp), 3,\n                dxbc::Src::T(\n                    texture_bindings_[texture_binding_index].bindful_srv_index,\n                    uint32_t(SRVMainRegister::kBindfulTexturesStart) +\n                        texture_binding_index,\n                    dxbc::Src::kYYYY),\n                sampler);\n          }\n          if (instr.dimension == xenos::FetchOpDimension::k3DOrStacked) {\n            // Close the 3D/stacked check.\n            a_.OpEndIf();\n          }\n        }\n        // Close the signedness check.\n        a_.OpEndIf();\n      }\n      // Release is_unsigned_temp.\n      PopSystemTemp();\n    } else {\n      // - Gradients or LOD to be passed to the sample_d/sample_l.\n\n      dxbc::Src lod_src(dxbc::Src::LF(0.0f));\n      uint32_t grad_component_count = 0;\n      // Will be allocated for both explicit and computed LOD.\n      uint32_t grad_h_lod_temp = UINT32_MAX;\n      // Will be allocated for computed LOD only, and if not using basemap mip\n      // filter.\n      uint32_t grad_v_temp = UINT32_MAX;\n      if (instr.attributes.mip_filter != xenos::TextureFilter::kBaseMap) {\n        grad_h_lod_temp = PushSystemTemp();\n        lod_src = dxbc::Src::R(grad_h_lod_temp, dxbc::Src::kWWWW);\n        // Accumulate the explicit LOD sources (in D3D11.3 specification order:\n        // specified LOD + sampler LOD bias + instruction LOD bias).\n        dxbc::Dest lod_dest(dxbc::Dest::R(grad_h_lod_temp, 0b1000));\n        // Fetch constant LOD bias * 32.\n        a_.OpIBFE(lod_dest, dxbc::Src::LU(10), dxbc::Src::LU(12),\n                  RequestTextureFetchConstantWord(tfetch_index, 4));\n        a_.OpIToF(lod_dest, lod_src);\n        if (instr.attributes.use_register_lod) {\n          // Divide the fetch constant LOD bias by 32, and add the register LOD\n          // and the instruction LOD bias.\n          a_.OpMAd(lod_dest, lod_src, dxbc::Src::LF(1.0f / 32.0f),\n                   dxbc::Src::R(system_temp_grad_h_lod_, dxbc::Src::kWWWW));\n          if (instr.attributes.lod_bias) {\n            a_.OpAdd(lod_dest, lod_src,\n                     dxbc::Src::LF(instr.attributes.lod_bias));\n          }\n        } else {\n          // Divide the fetch constant LOD by 32, and add the instruction LOD\n          // bias.\n          if (instr.attributes.lod_bias) {\n            a_.OpMAd(lod_dest, lod_src, dxbc::Src::LF(1.0f / 32.0f),\n                     dxbc::Src::LF(instr.attributes.lod_bias));\n          } else {\n            a_.OpMul(lod_dest, lod_src, dxbc::Src::LF(1.0f / 32.0f));\n          }\n        }\n        if (use_computed_lod) {\n          grad_v_temp = PushSystemTemp();\n          switch (instr.dimension) {\n            case xenos::FetchOpDimension::k1D:\n              grad_component_count = 1;\n              break;\n            case xenos::FetchOpDimension::k2D:\n              grad_component_count = 2;\n              break;\n            case xenos::FetchOpDimension::k3DOrStacked:\n            case xenos::FetchOpDimension::kCube:\n              grad_component_count = 3;\n              break;\n          }\n          assert_not_zero(grad_component_count);\n          uint32_t grad_mask = (1 << grad_component_count) - 1;\n          // Convert the bias to a gradient scale.\n          a_.OpExp(lod_dest, lod_src);\n          // FIXME(Triang3l): Gradient exponent adjustment is currently not done\n          // in getCompTexLOD, so don't do it here too.\n#if 0\n          // Extract gradient exponent biases from the fetch constant and merge\n          // them with the LOD bias.\n          a_.OpIBFE(dxbc::Dest::R(grad_h_lod_temp, 0b0011), dxbc::Src::LU(5),\n                    dxbc::Src::LU(22, 27, 0, 0),\n                    RequestTextureFetchConstantWord(tfetch_index, 4));\n          a_.OpIMAd(dxbc::Dest::R(grad_h_lod_temp, 0b0011),\n                    dxbc::Src::R(grad_h_lod_temp),\n                    dxbc::Src::LI(int32_t(1) << 23), dxbc::Src::LF(1.0f));\n          a_.OpMul(dxbc::Dest::R(grad_v_temp, 0b1000), lod_src,\n                   dxbc::Src::R(grad_h_lod_temp, dxbc::Src::kYYYY));\n          a_.OpMul(lod_dest, lod_src,\n                   dxbc::Src::R(grad_h_lod_temp, dxbc::Src::kXXXX));\n#endif\n          // Obtain the gradients and apply biases to them.\n          if (instr.attributes.use_register_gradients) {\n            // Register gradients are already in the cube space for cube maps.\n            a_.OpMul(dxbc::Dest::R(grad_h_lod_temp, grad_mask),\n                     dxbc::Src::R(system_temp_grad_h_lod_), lod_src);\n            // FIXME(Triang3l): Gradient exponent adjustment is currently not\n            // done in getCompTexLOD, so don't do it here too.\n#if 0\n            a_.OpMul(dxbc::Dest::R(grad_v_temp, grad_mask),\n                     dxbc::Src::R(system_temp_grad_v_vfetch_address_),\n                     dxbc::Src::R(grad_v_temp, dxbc::Src::kWWWW));\n#else\n            a_.OpMul(dxbc::Dest::R(grad_v_temp, grad_mask),\n                     dxbc::Src::R(system_temp_grad_v_vfetch_address_), lod_src);\n#endif\n            // TODO(Triang3l): Are cube map register gradients unnormalized if\n            // the coordinates themselves are unnormalized?\n            if (instr.attributes.unnormalized_coordinates &&\n                instr.dimension != xenos::FetchOpDimension::kCube) {\n              uint32_t grad_norm_mask = grad_mask;\n              if (instr.dimension == xenos::FetchOpDimension::k3DOrStacked) {\n                grad_norm_mask &= 0b0011;\n              }\n              assert_true((size_needed_components & grad_norm_mask) ==\n                          grad_norm_mask);\n              a_.OpDiv(dxbc::Dest::R(grad_h_lod_temp, grad_norm_mask),\n                       dxbc::Src::R(grad_h_lod_temp),\n                       dxbc::Src::R(size_and_is_3d_temp));\n              a_.OpDiv(dxbc::Dest::R(grad_v_temp, grad_norm_mask),\n                       dxbc::Src::R(grad_v_temp),\n                       dxbc::Src::R(size_and_is_3d_temp));\n              // Normalize Z of the gradients for fetching from the 3D texture.\n              assert_true((size_needed_components & 0b1100) == 0b1100);\n              a_.OpIf(true,\n                      dxbc::Src::R(size_and_is_3d_temp, dxbc::Src::kWWWW));\n              a_.OpDiv(dxbc::Dest::R(grad_h_lod_temp, 0b0100),\n                       dxbc::Src::R(grad_h_lod_temp, dxbc::Src::kZZZZ),\n                       dxbc::Src::R(size_and_is_3d_temp, dxbc::Src::kZZZZ));\n              a_.OpDiv(dxbc::Dest::R(grad_v_temp, 0b0100),\n                       dxbc::Src::R(grad_v_temp, dxbc::Src::kZZZZ),\n                       dxbc::Src::R(size_and_is_3d_temp, dxbc::Src::kZZZZ));\n              a_.OpEndIf();\n            }\n          } else {\n            // Coarse is according to the Direct3D 11.3 specification.\n            a_.OpDerivRTXCoarse(dxbc::Dest::R(grad_h_lod_temp, grad_mask),\n                                dxbc::Src::R(coord_and_sampler_temp));\n            a_.OpMul(dxbc::Dest::R(grad_h_lod_temp, grad_mask),\n                     dxbc::Src::R(grad_h_lod_temp), lod_src);\n            a_.OpDerivRTYCoarse(dxbc::Dest::R(grad_v_temp, grad_mask),\n                                dxbc::Src::R(coord_and_sampler_temp));\n            // FIXME(Triang3l): Gradient exponent adjustment is currently not\n            // done in getCompTexLOD, so don't do it here too.\n#if 0\n            a_.OpMul(dxbc::Dest::R(grad_v_temp, grad_mask),\n                     dxbc::Src::R(grad_v_temp),\n                     dxbc::Src::R(grad_v_temp, dxbc::Src::kWWWW));\n#else\n            a_.OpMul(dxbc::Dest::R(grad_v_temp, grad_mask),\n                     dxbc::Src::R(grad_v_temp), lod_src);\n#endif\n          }\n          if (instr.dimension == xenos::FetchOpDimension::k1D) {\n            // Pad the gradients to 2D because 1D textures are fetched as 2D\n            // arrays.\n            a_.OpMov(dxbc::Dest::R(grad_h_lod_temp, 0b0010),\n                     dxbc::Src::LF(0.0f));\n            a_.OpMov(dxbc::Dest::R(grad_v_temp, 0b0010), dxbc::Src::LF(0.0f));\n            grad_component_count = 2;\n          }\n        }\n      }\n\n      // - Data.\n\n      // 4D5307F2 uses vertex displacement map textures for tessellated models\n      // like the beehive tree with explicit LOD with point sampling (they store\n      // values packed in two components), however, the fetch constant has\n      // anisotropic filtering enabled. However, Direct3D 12 doesn't allow\n      // mixing anisotropic and point filtering. Possibly anistropic filtering\n      // should be disabled when explicit LOD is used - do this here.\n      uint32_t sampler_binding_index = FindOrAddSamplerBinding(\n          tfetch_index, instr.attributes.mag_filter,\n          instr.attributes.min_filter, instr.attributes.mip_filter,\n          use_computed_lod ? instr.attributes.aniso_filter\n                           : xenos::AnisoFilter::kDisabled);\n      dxbc::Src sampler(\n          dxbc::Src::S(sampler_binding_index, sampler_binding_index));\n      if (bindless_resources_used_) {\n        // Load the sampler index to coord_and_sampler_temp.w and use relative\n        // sampler indexing.\n        if (cbuffer_index_descriptor_indices_ == kBindingIndexUnallocated) {\n          cbuffer_index_descriptor_indices_ = cbuffer_count_++;\n        }\n        uint32_t sampler_bindless_descriptor_index =\n            sampler_bindings_[sampler_binding_index].bindless_descriptor_index;\n        a_.OpMov(dxbc::Dest::R(coord_and_sampler_temp, 0b1000),\n                 dxbc::Src::CB(cbuffer_index_descriptor_indices_,\n                               uint32_t(CbufferRegister::kDescriptorIndices),\n                               sampler_bindless_descriptor_index >> 2)\n                     .Select(sampler_bindless_descriptor_index & 3));\n        sampler = dxbc::Src::S(0, dxbc::Index(coord_and_sampler_temp, 3));\n      }\n\n      // Break result register dependencies because textures will be sampled\n      // conditionally, including the primary signs.\n      a_.OpMov(\n          dxbc::Dest::R(system_temp_result_, used_result_nonzero_components),\n          dxbc::Src::LF(0.0f));\n\n      // Extract whether each component is signed.\n      uint32_t is_signed_temp = PushSystemTemp();\n      a_.OpIEq(dxbc::Dest::R(is_signed_temp, used_result_nonzero_components),\n               dxbc::Src::R(signs_temp),\n               dxbc::Src::LU(uint32_t(xenos::TextureSign::kSigned)));\n\n      // Calculate the lerp factor between stacked texture layers if needed (or\n      // 0 if point-sampled), and check which signedness SRVs need to be\n      // sampled.\n      // As a result, if srv_selection_temp is allocated at all:\n      // - srv_selection_temp.x - if multiple components, whether all components\n      //   are signed, wrapped by is_all_signed_src with a fallback for the\n      //   single component case. If false, the unsigned SRV needs to be\n      //   sampled.\n      // - srv_selection_temp.y - if multiple components, whether any component\n      //   is signed, wrapped by is_any_signed_src with a fallback for the\n      //   single component case. If true, the signed SRV needs to be sampled.\n      // - srv_selection_temp.z - if stacked and not forced to be point-sampled,\n      //   the lerp factor between two layers, wrapped by layer_lerp_factor_src\n      //   with l(0.0) fallback for the point sampling case.\n      // - srv_selection_temp.w - first, scratch for calculations involving\n      //   these, then, unsigned or signed SRV description index.\n      dxbc::Src layer_lerp_factor_src(dxbc::Src::LF(0.0f));\n      // W is always needed for bindless.\n      uint32_t srv_selection_temp =\n          bindless_resources_used_ ? PushSystemTemp() : UINT32_MAX;\n      if (instr.dimension == xenos::FetchOpDimension::k3DOrStacked) {\n        bool vol_mag_filter_is_fetch_const =\n            instr.attributes.vol_mag_filter ==\n            xenos::TextureFilter::kUseFetchConst;\n        bool vol_min_filter_is_fetch_const =\n            instr.attributes.vol_min_filter ==\n            xenos::TextureFilter::kUseFetchConst;\n        bool vol_mag_filter_is_linear =\n            instr.attributes.vol_mag_filter == xenos::TextureFilter::kLinear;\n        bool vol_min_filter_is_linear =\n            instr.attributes.vol_min_filter == xenos::TextureFilter::kLinear;\n        if (grad_v_temp != UINT32_MAX &&\n            (vol_mag_filter_is_fetch_const || vol_min_filter_is_fetch_const ||\n             vol_mag_filter_is_linear != vol_min_filter_is_linear)) {\n          if (srv_selection_temp == UINT32_MAX) {\n            srv_selection_temp = PushSystemTemp();\n          }\n          layer_lerp_factor_src =\n              dxbc::Src::R(srv_selection_temp, dxbc::Src::kZZZZ);\n          // Initialize to point sampling, and break register dependency for 3D.\n          a_.OpMov(dxbc::Dest::R(srv_selection_temp, 0b0100),\n                   dxbc::Src::LF(0.0f));\n          assert_true((size_needed_components & 0b1000) == 0b1000);\n          a_.OpIf(false, dxbc::Src::R(size_and_is_3d_temp, dxbc::Src::kWWWW));\n          // Check if minifying along layers (derivative > 1 along any axis).\n          a_.OpMax(dxbc::Dest::R(srv_selection_temp, 0b1000),\n                   dxbc::Src::R(grad_h_lod_temp, dxbc::Src::kZZZZ),\n                   dxbc::Src::R(grad_v_temp, dxbc::Src::kZZZZ));\n          if (!instr.attributes.unnormalized_coordinates) {\n            // Denormalize the gradient if provided as normalized.\n            assert_true((size_needed_components & 0b0100) == 0b0100);\n            a_.OpMul(dxbc::Dest::R(srv_selection_temp, 0b1000),\n                     dxbc::Src::R(srv_selection_temp, dxbc::Src::kWWWW),\n                     dxbc::Src::R(size_and_is_3d_temp, dxbc::Src::kZZZZ));\n          }\n          // For NaN, considering that magnification is being done. Zero\n          // srv_selection_temp.w means magnifying, non-zero means minifying.\n          a_.OpLT(dxbc::Dest::R(srv_selection_temp, 0b1000),\n                  dxbc::Src::LF(1.0f),\n                  dxbc::Src::R(srv_selection_temp, dxbc::Src::kWWWW));\n          if (vol_mag_filter_is_fetch_const || vol_min_filter_is_fetch_const) {\n            a_.OpIf(false, dxbc::Src::R(srv_selection_temp, dxbc::Src::kWWWW));\n            // Write the magnification filter to srv_selection_temp.w. In the\n            // \"if\" rather than \"else\" because this is more likely to happen if\n            // the layer is constant.\n            if (vol_mag_filter_is_fetch_const) {\n              a_.OpAnd(dxbc::Dest::R(srv_selection_temp, 0b1000),\n                       RequestTextureFetchConstantWord(tfetch_index, 4),\n                       dxbc::Src::LU(1));\n            } else {\n              a_.OpMov(dxbc::Dest::R(srv_selection_temp, 0b1000),\n                       dxbc::Src::LU(uint32_t(vol_mag_filter_is_linear)));\n            }\n            a_.OpElse();\n            // Write the minification filter to srv_selection_temp.w.\n            if (vol_min_filter_is_fetch_const) {\n              a_.OpUBFE(dxbc::Dest::R(srv_selection_temp, 0b1000),\n                        dxbc::Src::LU(1), dxbc::Src::LU(1),\n                        RequestTextureFetchConstantWord(tfetch_index, 4));\n            } else {\n              a_.OpMov(dxbc::Dest::R(srv_selection_temp, 0b1000),\n                       dxbc::Src::LU(uint32_t(vol_min_filter_is_linear)));\n            }\n            // Close the magnification check.\n            a_.OpEndIf();\n            // Check if the filter is linear.\n            a_.OpIf(true, dxbc::Src::R(srv_selection_temp, dxbc::Src::kWWWW));\n          } else if (vol_mag_filter_is_linear) {\n            assert_false(vol_min_filter_is_linear);\n            // Both overridden, one (magnification) is linear, another\n            // (minification) is not - handle linear filtering if magnifying.\n            a_.OpIf(false, dxbc::Src::R(srv_selection_temp, dxbc::Src::kWWWW));\n          } else {\n            assert_true(vol_min_filter_is_linear);\n            assert_false(vol_mag_filter_is_linear);\n            // Both overridden, one (minification) is linear, another\n            // (magnification) is not - handle linear filtering if minifying.\n            a_.OpIf(true, dxbc::Src::R(srv_selection_temp, dxbc::Src::kWWWW));\n          }\n          // For linear filtering, subtract 0.5 from the coordinates and store\n          // the lerp factor. Flooring will be done later.\n          a_.OpAdd(dxbc::Dest::R(coord_and_sampler_temp, 0b0100),\n                   dxbc::Src::R(coord_and_sampler_temp, dxbc::Src::kZZZZ),\n                   dxbc::Src::LF(-0.5f));\n          a_.OpFrc(dxbc::Dest::R(srv_selection_temp, 0b0100),\n                   dxbc::Src::R(coord_and_sampler_temp, dxbc::Src::kZZZZ));\n          // Close the linear check.\n          a_.OpEndIf();\n          // Close the stacked check.\n          a_.OpEndIf();\n        } else {\n          // No gradients, or using the same filter overrides for magnifying and\n          // minifying. Assume always magnifying if no gradients (LOD 0, always\n          // <= 0). LOD is within 2D layers, not between them (unlike in 3D\n          // textures, which have mips with depth reduced).\n          if (vol_mag_filter_is_fetch_const || vol_mag_filter_is_linear) {\n            if (srv_selection_temp == UINT32_MAX) {\n              srv_selection_temp = PushSystemTemp();\n            }\n            layer_lerp_factor_src =\n                dxbc::Src::R(srv_selection_temp, dxbc::Src::kZZZZ);\n            // Initialize to point sampling, and break register dependency for\n            // 3D.\n            a_.OpMov(dxbc::Dest::R(srv_selection_temp, 0b0100),\n                     dxbc::Src::LF(0.0f));\n            assert_true((size_needed_components & 0b1000) == 0b1000);\n            a_.OpIf(false, dxbc::Src::R(size_and_is_3d_temp, dxbc::Src::kWWWW));\n            if (vol_mag_filter_is_fetch_const) {\n              // Extract the magnification filtering mode from the fetch\n              // constant.\n              a_.OpAnd(dxbc::Dest::R(srv_selection_temp, 0b1000),\n                       RequestTextureFetchConstantWord(tfetch_index, 4),\n                       dxbc::Src::LU(1));\n              // Check if it's linear.\n              a_.OpIf(true, dxbc::Src::R(srv_selection_temp, dxbc::Src::kWWWW));\n            }\n            // For linear filtering, subtract 0.5 from the coordinates and store\n            // the lerp factor. Flooring will be done later.\n            a_.OpAdd(dxbc::Dest::R(coord_and_sampler_temp, 0b0100),\n                     dxbc::Src::R(coord_and_sampler_temp, dxbc::Src::kZZZZ),\n                     dxbc::Src::LF(-0.5f));\n            a_.OpFrc(dxbc::Dest::R(srv_selection_temp, 0b0100),\n                     dxbc::Src::R(coord_and_sampler_temp, dxbc::Src::kZZZZ));\n            if (vol_mag_filter_is_fetch_const) {\n              // Close the fetch constant linear filtering mode check.\n              a_.OpEndIf();\n            }\n            // Close the stacked check.\n            a_.OpEndIf();\n          }\n        }\n      }\n      // Check if any component is not signed, and if any component is signed.\n      uint32_t result_first_component;\n      xe::bit_scan_forward(used_result_nonzero_components,\n                           &result_first_component);\n      dxbc::Src is_all_signed_src(\n          dxbc::Src::R(is_signed_temp).Select(result_first_component));\n      dxbc::Src is_any_signed_src(\n          dxbc::Src::R(is_signed_temp).Select(result_first_component));\n      if (used_result_nonzero_components != (1 << result_first_component)) {\n        // Multiple components fetched - need to merge.\n        if (srv_selection_temp == UINT32_MAX) {\n          srv_selection_temp = PushSystemTemp();\n        }\n        dxbc::Dest is_all_signed_dest(\n            dxbc::Dest::R(srv_selection_temp, 0b0001));\n        dxbc::Dest is_any_signed_dest(\n            dxbc::Dest::R(srv_selection_temp, 0b0010));\n        uint32_t result_remaining_components =\n            used_result_nonzero_components &\n            ~(uint32_t(1) << result_first_component);\n        uint32_t result_component;\n        while (xe::bit_scan_forward(result_remaining_components,\n                                    &result_component)) {\n          result_remaining_components &= ~(uint32_t(1) << result_component);\n          a_.OpAnd(is_all_signed_dest, is_all_signed_src,\n                   dxbc::Src::R(is_signed_temp).Select(result_component));\n          a_.OpOr(is_any_signed_dest, is_any_signed_src,\n                  dxbc::Src::R(is_signed_temp).Select(result_component));\n          // For the first component, both sources must both be two is_signed\n          // components, to initialize.\n          is_all_signed_src =\n              dxbc::Src::R(srv_selection_temp, dxbc::Src::kXXXX);\n          is_any_signed_src =\n              dxbc::Src::R(srv_selection_temp, dxbc::Src::kYYYY);\n        }\n      }\n\n      // Sample the texture - choose between 3D and stacked, and then sample\n      // unsigned and signed SRVs and choose between them.\n\n      if (instr.dimension == xenos::FetchOpDimension::k3DOrStacked) {\n        assert_true((size_needed_components & 0b1000) == 0b1000);\n        // The first fetch attempt will be for the 3D SRV.\n        a_.OpIf(true, dxbc::Src::R(size_and_is_3d_temp, dxbc::Src::kWWWW));\n      }\n      for (uint32_t is_stacked = 0;\n           is_stacked <\n           (instr.dimension == xenos::FetchOpDimension::k3DOrStacked ? 2u : 1u);\n           ++is_stacked) {\n        // i == 0 - 1D/2D/3D/cube.\n        // i == 1 - 2D stacked.\n        xenos::FetchOpDimension srv_dimension = instr.dimension;\n        uint32_t srv_grad_component_count = grad_component_count;\n        bool layer_lerp_needed = false;\n        if (is_stacked) {\n          srv_dimension = xenos::FetchOpDimension::k2D;\n          srv_grad_component_count = 2;\n          layer_lerp_needed =\n              layer_lerp_factor_src.type_ != dxbc::OperandType::kImmediate32;\n          a_.OpElse();\n          // Floor the array layer (Direct3D 12 does rounding to nearest even\n          // for the layer index, but on the Xbox 360, addressing is similar to\n          // that of 3D textures). This is needed for both point and linear\n          // filtering (with linear, 0.5 was subtracted previously).\n          a_.OpRoundNI(dxbc::Dest::R(coord_and_sampler_temp, 0b0100),\n                       dxbc::Src::R(coord_and_sampler_temp, dxbc::Src::kZZZZ));\n        }\n        uint32_t texture_binding_index_unsigned =\n            FindOrAddTextureBinding(tfetch_index, srv_dimension, false);\n        uint32_t texture_binding_index_signed =\n            FindOrAddTextureBinding(tfetch_index, srv_dimension, true);\n        const TextureBinding& texture_binding_unsigned =\n            texture_bindings_[texture_binding_index_unsigned];\n        const TextureBinding& texture_binding_signed =\n            texture_bindings_[texture_binding_index_signed];\n        dxbc::Src srv_unsigned(dxbc::Src::LF(0.0f)),\n            srv_signed(dxbc::Src::LF(0.0f));\n        if (bindless_resources_used_) {\n          uint32_t* bindless_srv_index = nullptr;\n          switch (srv_dimension) {\n            case xenos::FetchOpDimension::k1D:\n            case xenos::FetchOpDimension::k2D:\n              bindless_srv_index = &srv_index_bindless_textures_2d_;\n              break;\n            case xenos::FetchOpDimension::k3DOrStacked:\n              bindless_srv_index = &srv_index_bindless_textures_3d_;\n              break;\n            case xenos::FetchOpDimension::kCube:\n              bindless_srv_index = &srv_index_bindless_textures_cube_;\n              break;\n          }\n          assert_not_null(bindless_srv_index);\n          if (*bindless_srv_index == kBindingIndexUnallocated) {\n            *bindless_srv_index = srv_count_++;\n          }\n          assert_true(srv_selection_temp != UINT32_MAX);\n          srv_unsigned = dxbc::Src::T(*bindless_srv_index,\n                                      dxbc::Index(srv_selection_temp, 3));\n          srv_signed = srv_unsigned;\n        } else {\n          srv_unsigned =\n              dxbc::Src::T(texture_binding_unsigned.bindful_srv_index,\n                           uint32_t(SRVMainRegister::kBindfulTexturesStart) +\n                               texture_binding_index_unsigned);\n          srv_signed =\n              dxbc::Src::T(texture_binding_signed.bindful_srv_index,\n                           uint32_t(SRVMainRegister::kBindfulTexturesStart) +\n                               texture_binding_index_signed);\n        }\n        for (uint32_t layer = 0; layer < (layer_lerp_needed ? 2u : 1u);\n             ++layer) {\n          uint32_t layer_value_temp = system_temp_result_;\n          if (layer) {\n            layer_value_temp = PushSystemTemp();\n            // Check if the lerp factor is not zero (or NaN).\n            a_.OpNE(dxbc::Dest::R(layer_value_temp, 0b0001),\n                    layer_lerp_factor_src, dxbc::Src::LF(0.0f));\n            // If the lerp factor is not zero, sample the next layer.\n            a_.OpIf(true, dxbc::Src::R(layer_value_temp, dxbc::Src::kXXXX));\n            // Go to the next layer.\n            a_.OpAdd(dxbc::Dest::R(coord_and_sampler_temp, 0b0100),\n                     dxbc::Src::R(coord_and_sampler_temp, dxbc::Src::kZZZZ),\n                     dxbc::Src::LF(1.0f));\n          }\n          // Always 3 coordinate components (1D and 2D are padded to 2D arrays,\n          // 3D and cube have 3 coordinate dimensions).\n          a_.OpIf(false, is_all_signed_src);\n          {\n            // Sample the unsigned texture.\n            if (bindless_resources_used_) {\n              // Load the unsigned texture descriptor index.\n              assert_true(srv_selection_temp != UINT32_MAX);\n              if (cbuffer_index_descriptor_indices_ ==\n                  kBindingIndexUnallocated) {\n                cbuffer_index_descriptor_indices_ = cbuffer_count_++;\n              }\n              uint32_t texture_bindless_descriptor_index =\n                  texture_binding_unsigned.bindless_descriptor_index;\n              a_.OpMov(\n                  dxbc::Dest::R(srv_selection_temp, 0b1000),\n                  dxbc::Src::CB(cbuffer_index_descriptor_indices_,\n                                uint32_t(CbufferRegister::kDescriptorIndices),\n                                texture_bindless_descriptor_index >> 2)\n                      .Select(texture_bindless_descriptor_index & 3));\n            }\n            if (grad_v_temp != UINT32_MAX) {\n              assert_not_zero(grad_component_count);\n              a_.OpSampleD(dxbc::Dest::R(layer_value_temp,\n                                         used_result_nonzero_components),\n                           dxbc::Src::R(coord_and_sampler_temp), 3,\n                           srv_unsigned, sampler, dxbc::Src::R(grad_h_lod_temp),\n                           dxbc::Src::R(grad_v_temp), srv_grad_component_count);\n            } else {\n              a_.OpSampleL(dxbc::Dest::R(layer_value_temp,\n                                         used_result_nonzero_components),\n                           dxbc::Src::R(coord_and_sampler_temp), 3,\n                           srv_unsigned, sampler, lod_src);\n            }\n          }\n          a_.OpEndIf();\n          a_.OpIf(true, is_any_signed_src);\n          {\n            // Sample the signed texture.\n            uint32_t signed_temp = PushSystemTemp();\n            if (bindless_resources_used_) {\n              // Load the signed texture descriptor index.\n              assert_true(srv_selection_temp != UINT32_MAX);\n              if (cbuffer_index_descriptor_indices_ ==\n                  kBindingIndexUnallocated) {\n                cbuffer_index_descriptor_indices_ = cbuffer_count_++;\n              }\n              uint32_t texture_bindless_descriptor_index =\n                  texture_binding_signed.bindless_descriptor_index;\n              a_.OpMov(\n                  dxbc::Dest::R(srv_selection_temp, 0b1000),\n                  dxbc::Src::CB(cbuffer_index_descriptor_indices_,\n                                uint32_t(CbufferRegister::kDescriptorIndices),\n                                texture_bindless_descriptor_index >> 2)\n                      .Select(texture_bindless_descriptor_index & 3));\n            }\n            if (grad_v_temp != UINT32_MAX) {\n              assert_not_zero(grad_component_count);\n              a_.OpSampleD(\n                  dxbc::Dest::R(signed_temp, used_result_nonzero_components),\n                  dxbc::Src::R(coord_and_sampler_temp), 3, srv_signed, sampler,\n                  dxbc::Src::R(grad_h_lod_temp), dxbc::Src::R(grad_v_temp),\n                  srv_grad_component_count);\n            } else {\n              a_.OpSampleL(\n                  dxbc::Dest::R(signed_temp, used_result_nonzero_components),\n                  dxbc::Src::R(coord_and_sampler_temp), 3, srv_signed, sampler,\n                  lod_src);\n            }\n            a_.OpMovC(\n                dxbc::Dest::R(layer_value_temp, used_result_nonzero_components),\n                dxbc::Src::R(is_signed_temp), dxbc::Src::R(signed_temp),\n                dxbc::Src::R(layer_value_temp));\n            // Release signed_temp.\n            PopSystemTemp();\n          }\n          a_.OpEndIf();\n          if (layer) {\n            assert_true(layer_value_temp != system_temp_result_);\n            // Interpolate between the two layers.\n            a_.OpAdd(\n                dxbc::Dest::R(layer_value_temp, used_result_nonzero_components),\n                dxbc::Src::R(layer_value_temp),\n                -dxbc::Src::R(system_temp_result_));\n            a_.OpMAd(dxbc::Dest::R(system_temp_result_,\n                                   used_result_nonzero_components),\n                     dxbc::Src::R(layer_value_temp), layer_lerp_factor_src,\n                     dxbc::Src::R(system_temp_result_));\n            // Close the linear filtering check.\n            a_.OpEndIf();\n            // Release the allocated layer_value_temp.\n            PopSystemTemp();\n          }\n        }\n      }\n      if (instr.dimension == xenos::FetchOpDimension::k3DOrStacked) {\n        // Close the stacked/3D check.\n        a_.OpEndIf();\n      }\n\n      if (srv_selection_temp != UINT32_MAX) {\n        PopSystemTemp();\n      }\n      // Release is_signed_temp.\n      PopSystemTemp();\n\n      // Release grad_h_lod_temp and grad_v_temp.\n      if (grad_v_temp != UINT32_MAX) {\n        PopSystemTemp();\n      }\n      if (grad_h_lod_temp != UINT32_MAX) {\n        PopSystemTemp();\n      }\n    }\n\n    // Release coord_and_sampler_temp.\n    PopSystemTemp();\n\n    // Apply the bias and gamma correction (gamma is after filtering here,\n    // likely should be before, but it's outside Xenia's control for host\n    // sampler filtering).\n    if (instr.opcode == FetchOpcode::kTextureFetch) {\n      assert_true(signs_temp != UINT32_MAX);\n      for (uint32_t i = 0; i < 4; ++i) {\n        if (!(used_result_nonzero_components & (1 << i))) {\n          continue;\n        }\n        dxbc::Dest component_dest(dxbc::Dest::R(system_temp_result_, 1 << i));\n        dxbc::Src component_src(dxbc::Src::R(system_temp_result_).Select(i));\n        a_.OpSwitch(dxbc::Src::R(signs_temp).Select(i));\n        a_.OpCase(dxbc::Src::LU(uint32_t(xenos::TextureSign::kUnsignedBiased)));\n        a_.OpMAd(component_dest, component_src, dxbc::Src::LF(2.0f),\n                 dxbc::Src::LF(-1.0f));\n        a_.OpBreak();\n        a_.OpCase(dxbc::Src::LU(uint32_t(xenos::TextureSign::kGamma)));\n        uint32_t gamma_temp = PushSystemTemp();\n        // Convert from piecewise linear.\n        PWLGammaToLinear(a_, system_temp_result_, i, system_temp_result_, i,\n                         false, gamma_temp, 0, gamma_temp, 1);\n        // Release gamma_temp.\n        PopSystemTemp();\n        a_.OpBreak();\n        a_.OpEndSwitch();\n      }\n    }\n    if (signs_temp != UINT32_MAX) {\n      PopSystemTemp();\n    }\n  }\n\n  if (size_and_is_3d_temp != UINT32_MAX) {\n    PopSystemTemp();\n  }\n\n  if (instr.opcode == FetchOpcode::kTextureFetch) {\n    // Apply the result exponent bias.\n    uint32_t exp_adjust_temp = PushSystemTemp();\n    a_.OpIBFE(dxbc::Dest::R(exp_adjust_temp, 0b0001), dxbc::Src::LU(6),\n              dxbc::Src::LU(13),\n              RequestTextureFetchConstantWord(tfetch_index, 3));\n    a_.OpIMAd(dxbc::Dest::R(exp_adjust_temp, 0b0001),\n              dxbc::Src::R(exp_adjust_temp, dxbc::Src::kXXXX),\n              dxbc::Src::LI(int32_t(1) << 23), dxbc::Src::LF(1.0f));\n    a_.OpMul(dxbc::Dest::R(system_temp_result_, used_result_nonzero_components),\n             dxbc::Src::R(system_temp_result_),\n             dxbc::Src::R(exp_adjust_temp, dxbc::Src::kXXXX));\n    // Release exp_adjust_temp.\n    PopSystemTemp();\n  }\n\n  uint32_t used_result_zero_components =\n      used_result_components & ~used_result_nonzero_components;\n  if (used_result_zero_components) {\n    a_.OpMov(dxbc::Dest::R(system_temp_result_, used_result_zero_components),\n             dxbc::Src::LF(0.0f));\n  }\n  StoreResult(instr.result, dxbc::Src::R(system_temp_result_));\n}\n\n}  // namespace gpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/dxbc_shader_translator_memexport.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2023 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include <array>\n#include <cstdint>\n#include <functional>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/gpu/dxbc_shader_translator.h\"\n\nnamespace xe {\nnamespace gpu {\nusing namespace ucode;\n\nvoid DxbcShaderTranslator::ExportToMemory(uint8_t export_eM) {\n  if (!export_eM) {\n    return;\n  }\n\n  assert_zero(export_eM & ~current_shader().memexport_eM_written());\n\n  // Check if memory export is allowed in this invocation.\n  a_.OpIf(true, dxbc::Src::R(system_temp_memexport_enabled_and_eM_written_,\n                             dxbc::Src::kXXXX));\n\n  // Check if the address with the correct sign and exponent was written, and\n  // that the index doesn't overflow the mantissa bits.\n  {\n    uint32_t address_check_temp = PushSystemTemp();\n    a_.OpUShR(dxbc::Dest::R(address_check_temp),\n              dxbc::Src::R(system_temp_memexport_address_),\n              dxbc::Src::LU(30, 23, 23, 23));\n    a_.OpIEq(dxbc::Dest::R(address_check_temp),\n             dxbc::Src::R(address_check_temp),\n             dxbc::Src::LU(0x1, 0x96, 0x96, 0x96));\n    a_.OpAnd(dxbc::Dest::R(address_check_temp, 0b0011),\n             dxbc::Src::R(address_check_temp),\n             dxbc::Src::R(address_check_temp, 0b1110));\n    a_.OpAnd(dxbc::Dest::R(address_check_temp, 0b0001),\n             dxbc::Src::R(address_check_temp, dxbc::Src::kXXXX),\n             dxbc::Src::R(address_check_temp, dxbc::Src::kYYYY));\n    a_.OpIf(true, dxbc::Src::R(address_check_temp, dxbc::Src::kXXXX));\n    // Release address_check_temp.\n    PopSystemTemp();\n  }\n\n  uint8_t eM_remaining;\n  uint32_t eM_index;\n\n  // Swap red and blue components if needed.\n  {\n    uint32_t red_blue_swap_temp = PushSystemTemp();\n    a_.OpIBFE(dxbc::Dest::R(red_blue_swap_temp, 0b0001), dxbc::Src::LU(1),\n              dxbc::Src::LU(19),\n              dxbc::Src::R(system_temp_memexport_address_, dxbc::Src::kZZZZ));\n    a_.OpIf(true, dxbc::Src::R(red_blue_swap_temp, dxbc::Src::kXXXX));\n    // Release red_blue_swap_temp.\n    PopSystemTemp();\n\n    eM_remaining = export_eM;\n    while (xe::bit_scan_forward(eM_remaining, &eM_index)) {\n      eM_remaining &= ~(uint8_t(1) << eM_index);\n      a_.OpMov(\n          dxbc::Dest::R(system_temps_memexport_data_[eM_index], 0b0101),\n          dxbc::Src::R(system_temps_memexport_data_[eM_index], 0b11000110));\n    }\n\n    // Close the red/blue swap conditional.\n    a_.OpEndIf();\n  }\n\n  uint32_t temp = PushSystemTemp();\n\n  // Extract the color format and the numeric format.\n  // temp.x = color format.\n  // temp.y = numeric format is signed.\n  // temp.z = numeric format is integer.\n  a_.OpUBFE(dxbc::Dest::R(temp, 0b0111), dxbc::Src::LU(6, 1, 1, 0),\n            dxbc::Src::LU(8, 16, 17, 0),\n            dxbc::Src::R(system_temp_memexport_address_, dxbc::Src::kZZZZ));\n\n  // Perform format packing.\n  // After the switch, temp.x must contain log2 of the number of bytes in an\n  // element, of UINT32_MAX if the format is unknown.\n  a_.OpSwitch(dxbc::Src::R(temp, dxbc::Src::kXXXX));\n  {\n    dxbc::Dest element_size_dest(dxbc::Dest::R(temp, 0b0001));\n    dxbc::Src num_format_signed(dxbc::Src::R(temp, dxbc::Src::kYYYY));\n    dxbc::Src num_format_integer(dxbc::Src::R(temp, dxbc::Src::kZZZZ));\n\n    auto flush_nan = [this, export_eM](uint32_t components) {\n      uint8_t eM_remaining = export_eM;\n      uint32_t eM_index;\n      uint32_t is_nan_temp = PushSystemTemp();\n      while (xe::bit_scan_forward(eM_remaining, &eM_index)) {\n        eM_remaining &= ~(uint8_t(1) << eM_index);\n        uint32_t eM = system_temps_memexport_data_[eM_index];\n        a_.OpNE(dxbc::Dest::R(is_nan_temp, components), dxbc::Src::R(eM),\n                dxbc::Src::R(eM));\n        a_.OpMovC(dxbc::Dest::R(eM, components), dxbc::Src::R(is_nan_temp),\n                  dxbc::Src::LF(0.0f), dxbc::Src::R(eM));\n      }\n      // Release is_nan_temp.\n      PopSystemTemp();\n    };\n\n    // The result will be in eM#.x. The widths must be without holes (R, RG,\n    // RGB, RGBA), and expecting the widths to add up to the size of the stored\n    // texel (8, 16 or 32 bits), as the unused upper bits will contain junk from\n    // the sign extension of X if the number is signed.\n    auto pack_8_16_32 = [&](std::array<uint32_t, 4> widths) {\n      uint8_t eM_remaining;\n      uint32_t eM_index;\n\n      uint32_t components = 0;\n      std::array<uint32_t, 4> offsets = {};\n      for (uint32_t i = 0; i < 4; ++i) {\n        if (widths[i]) {\n          // Only formats for which max + 0.5 can be represented exactly.\n          assert(widths[i] <= 23);\n          components |= uint32_t(1) << i;\n        }\n        if (i) {\n          offsets[i] = offsets[i - 1] + widths[i - 1];\n        }\n      }\n      // Will be packing components into eM#.x starting from green, assume red\n      // will already be there after the conversion.\n      assert_not_zero(components & 0b1);\n\n      flush_nan(components);\n\n      a_.OpIf(true, num_format_signed);\n      {\n        // Signed.\n        a_.OpIf(true, num_format_integer);\n        {\n          // Signed integer.\n          float min_value[4] = {}, max_value[4] = {};\n          for (uint32_t i = 0; i < 4; ++i) {\n            if (widths[i]) {\n              max_value[i] = float((uint32_t(1) << (widths[i] - 1)) - 1);\n              min_value[i] = -1.0f - max_value[i];\n            }\n          }\n          dxbc::Src min_value_src(dxbc::Src::LP(min_value));\n          dxbc::Src max_value_src(dxbc::Src::LP(max_value));\n          eM_remaining = export_eM;\n          while (xe::bit_scan_forward(eM_remaining, &eM_index)) {\n            eM_remaining &= ~(uint8_t(1) << eM_index);\n            uint32_t eM = system_temps_memexport_data_[eM_index];\n            a_.OpMax(dxbc::Dest::R(eM, components), min_value_src,\n                     dxbc::Src::R(eM));\n            a_.OpMin(dxbc::Dest::R(eM, components), max_value_src,\n                     dxbc::Src::R(eM));\n          }\n        }\n        a_.OpElse();\n        {\n          // Signed normalized.\n          uint32_t scale_components = 0;\n          float scale[4] = {};\n          for (uint32_t i = 0; i < 4; ++i) {\n            if (widths[i] > 2) {\n              scale_components |= uint32_t(1) << i;\n              scale[i] = float((uint32_t(1) << (widths[i] - 1)) - 1);\n            }\n          }\n          dxbc::Src scale_src(dxbc::Src::LP(scale));\n          eM_remaining = export_eM;\n          while (xe::bit_scan_forward(eM_remaining, &eM_index)) {\n            eM_remaining &= ~(uint8_t(1) << eM_index);\n            uint32_t eM = system_temps_memexport_data_[eM_index];\n            a_.OpMax(dxbc::Dest::R(eM, components), dxbc::Src::LF(-1.0f),\n                     dxbc::Src::R(eM));\n            a_.OpMin(dxbc::Dest::R(eM, components), dxbc::Src::LF(1.0f),\n                     dxbc::Src::R(eM));\n            if (scale_components) {\n              a_.OpMul(dxbc::Dest::R(eM, scale_components), dxbc::Src::R(eM),\n                       scale_src);\n            }\n          }\n        }\n        a_.OpEndIf();\n\n        // Add plus/minus 0.5 before truncating according to the Direct3D format\n        // conversion rules, and convert to signed integers.\n        uint32_t round_bias_temp = PushSystemTemp();\n        eM_remaining = export_eM;\n        while (xe::bit_scan_forward(eM_remaining, &eM_index)) {\n          eM_remaining &= ~(uint8_t(1) << eM_index);\n          uint32_t eM = system_temps_memexport_data_[eM_index];\n          a_.OpBFI(dxbc::Dest::R(eM, components), dxbc::Src::LU(31),\n                   dxbc::Src::LU(0), dxbc::Src::LF(0.5f), dxbc::Src::R(eM));\n          a_.OpAdd(dxbc::Dest::R(eM, components), dxbc::Src::R(eM),\n                   dxbc::Src::R(round_bias_temp));\n          a_.OpFToI(dxbc::Dest::R(eM, components), dxbc::Src::R(eM));\n        }\n        // Release round_bias_temp.\n        PopSystemTemp();\n      }\n      a_.OpElse();\n      {\n        // Unsigned.\n        a_.OpIf(true, num_format_integer);\n        {\n          // Unsigned integer.\n          float max_value[4];\n          for (uint32_t i = 0; i < 4; ++i) {\n            max_value[i] = float((uint32_t(1) << widths[i]) - 1);\n          }\n          dxbc::Src max_value_src(dxbc::Src::LP(max_value));\n          eM_remaining = export_eM;\n          while (xe::bit_scan_forward(eM_remaining, &eM_index)) {\n            eM_remaining &= ~(uint8_t(1) << eM_index);\n            uint32_t eM = system_temps_memexport_data_[eM_index];\n            a_.OpMax(dxbc::Dest::R(eM, components), dxbc::Src::LF(0.0f),\n                     dxbc::Src::R(eM));\n            a_.OpMin(dxbc::Dest::R(eM, components), max_value_src,\n                     dxbc::Src::R(eM));\n          }\n        }\n        a_.OpElse();\n        {\n          // Unsigned normalized.\n          uint32_t scale_components = 0;\n          float scale[4] = {};\n          for (uint32_t i = 0; i < 4; ++i) {\n            if (widths[i] > 1) {\n              scale_components |= uint32_t(1) << i;\n              scale[i] = float((uint32_t(1) << widths[i]) - 1);\n            }\n          }\n          dxbc::Src scale_src(dxbc::Src::LP(scale));\n          eM_remaining = export_eM;\n          while (xe::bit_scan_forward(eM_remaining, &eM_index)) {\n            eM_remaining &= ~(uint8_t(1) << eM_index);\n            uint32_t eM = system_temps_memexport_data_[eM_index];\n            // Saturate.\n            a_.OpMov(dxbc::Dest::R(eM, components), dxbc::Src::R(eM), true);\n            if (scale_components) {\n              a_.OpMul(dxbc::Dest::R(eM, scale_components), dxbc::Src::R(eM),\n                       scale_src);\n            }\n          }\n        }\n        a_.OpEndIf();\n\n        // Add 0.5 before truncating according to the Direct3D format conversion\n        // rules, and convert to unsigned integers.\n        eM_remaining = export_eM;\n        while (xe::bit_scan_forward(eM_remaining, &eM_index)) {\n          eM_remaining &= ~(uint8_t(1) << eM_index);\n          uint32_t eM = system_temps_memexport_data_[eM_index];\n          a_.OpAdd(dxbc::Dest::R(eM, components), dxbc::Src::R(eM),\n                   dxbc::Src::LF(0.5f));\n          a_.OpFToU(dxbc::Dest::R(eM, components), dxbc::Src::R(eM));\n        }\n      }\n      a_.OpEndIf();\n\n      // Pack into 32 bits.\n      for (uint32_t i = 0; i < 4; ++i) {\n        if (!widths[i]) {\n          continue;\n        }\n        dxbc::Src width_src(dxbc::Src::LU(widths[i]));\n        dxbc::Src offset_src(dxbc::Src::LU(offsets[i]));\n        eM_remaining = export_eM;\n        while (xe::bit_scan_forward(eM_remaining, &eM_index)) {\n          eM_remaining &= ~(uint8_t(1) << eM_index);\n          uint32_t eM = system_temps_memexport_data_[eM_index];\n          a_.OpBFI(dxbc::Dest::R(eM, 0b0001), width_src, offset_src,\n                   dxbc::Src::R(eM).Select(i),\n                   dxbc::Src::R(eM, dxbc::Src::kXXXX));\n        }\n      }\n    };\n\n    a_.OpCase(dxbc::Src::LU(uint32_t(xenos::ColorFormat::k_8)));\n    // TODO(Triang3l): Investigate how input should be treated for k_8_A, k_8_B,\n    // k_8_8_8_8_A.\n    a_.OpCase(dxbc::Src::LU(uint32_t(xenos::ColorFormat::k_8_A)));\n    a_.OpCase(dxbc::Src::LU(uint32_t(xenos::ColorFormat::k_8_B)));\n    {\n      pack_8_16_32({8});\n      a_.OpMov(element_size_dest, dxbc::Src::LU(0));\n    }\n    a_.OpBreak();\n\n    a_.OpCase(dxbc::Src::LU(uint32_t(xenos::ColorFormat::k_1_5_5_5)));\n    {\n      pack_8_16_32({5, 5, 5, 1});\n      a_.OpMov(element_size_dest, dxbc::Src::LU(1));\n    }\n    a_.OpBreak();\n\n    a_.OpCase(dxbc::Src::LU(uint32_t(xenos::ColorFormat::k_5_6_5)));\n    {\n      pack_8_16_32({5, 6, 5});\n      a_.OpMov(element_size_dest, dxbc::Src::LU(1));\n    }\n    a_.OpBreak();\n\n    a_.OpCase(dxbc::Src::LU(uint32_t(xenos::ColorFormat::k_6_5_5)));\n    {\n      pack_8_16_32({5, 5, 6});\n      a_.OpMov(element_size_dest, dxbc::Src::LU(1));\n    }\n    a_.OpBreak();\n\n    a_.OpCase(dxbc::Src::LU(uint32_t(xenos::ColorFormat::k_8_8_8_8)));\n    a_.OpCase(dxbc::Src::LU(uint32_t(xenos::ColorFormat::k_8_8_8_8_A)));\n    a_.OpCase(\n        dxbc::Src::LU(uint32_t(xenos::ColorFormat::k_8_8_8_8_AS_16_16_16_16)));\n    {\n      pack_8_16_32({8, 8, 8, 8});\n      a_.OpMov(element_size_dest, dxbc::Src::LU(2));\n    }\n    a_.OpBreak();\n\n    a_.OpCase(dxbc::Src::LU(uint32_t(xenos::ColorFormat::k_2_10_10_10)));\n    a_.OpCase(dxbc::Src::LU(\n        uint32_t(xenos::ColorFormat::k_2_10_10_10_AS_16_16_16_16)));\n    {\n      pack_8_16_32({10, 10, 10, 2});\n      a_.OpMov(element_size_dest, dxbc::Src::LU(2));\n    }\n    a_.OpBreak();\n\n    a_.OpCase(dxbc::Src::LU(uint32_t(xenos::ColorFormat::k_8_8)));\n    {\n      pack_8_16_32({8, 8});\n      a_.OpMov(element_size_dest, dxbc::Src::LU(1));\n    }\n    a_.OpBreak();\n\n    a_.OpCase(dxbc::Src::LU(uint32_t(xenos::ColorFormat::k_4_4_4_4)));\n    {\n      pack_8_16_32({4, 4, 4, 4});\n      a_.OpMov(element_size_dest, dxbc::Src::LU(1));\n    }\n    a_.OpBreak();\n\n    a_.OpCase(dxbc::Src::LU(uint32_t(xenos::ColorFormat::k_10_11_11)));\n    a_.OpCase(\n        dxbc::Src::LU(uint32_t(xenos::ColorFormat::k_10_11_11_AS_16_16_16_16)));\n    {\n      pack_8_16_32({11, 11, 10});\n      a_.OpMov(element_size_dest, dxbc::Src::LU(2));\n    }\n    a_.OpBreak();\n\n    a_.OpCase(dxbc::Src::LU(uint32_t(xenos::ColorFormat::k_11_11_10)));\n    a_.OpCase(\n        dxbc::Src::LU(uint32_t(xenos::ColorFormat::k_11_11_10_AS_16_16_16_16)));\n    {\n      pack_8_16_32({10, 11, 11});\n      a_.OpMov(element_size_dest, dxbc::Src::LU(2));\n    }\n    a_.OpBreak();\n\n    a_.OpCase(dxbc::Src::LU(uint32_t(xenos::ColorFormat::k_16)));\n    {\n      pack_8_16_32({16});\n      a_.OpMov(element_size_dest, dxbc::Src::LU(1));\n    }\n    a_.OpBreak();\n\n    a_.OpCase(dxbc::Src::LU(uint32_t(xenos::ColorFormat::k_16_16)));\n    {\n      pack_8_16_32({16, 16});\n      a_.OpMov(element_size_dest, dxbc::Src::LU(2));\n    }\n    a_.OpBreak();\n\n    a_.OpCase(dxbc::Src::LU(uint32_t(xenos::ColorFormat::k_16_16_16_16)));\n    {\n      flush_nan(0b1111);\n\n      a_.OpIf(true, num_format_signed);\n      {\n        // Signed.\n        a_.OpIf(true, num_format_integer);\n        {\n          // Signed integer.\n          eM_remaining = export_eM;\n          while (xe::bit_scan_forward(eM_remaining, &eM_index)) {\n            eM_remaining &= ~(uint8_t(1) << eM_index);\n            uint32_t eM = system_temps_memexport_data_[eM_index];\n            a_.OpMax(dxbc::Dest::R(eM), dxbc::Src::LF(float(INT16_MIN)),\n                     dxbc::Src::R(eM));\n            a_.OpMin(dxbc::Dest::R(eM), dxbc::Src::LF(float(INT16_MAX)),\n                     dxbc::Src::R(eM));\n          }\n        }\n        a_.OpElse();\n        {\n          // Signed normalized.\n          eM_remaining = export_eM;\n          while (xe::bit_scan_forward(eM_remaining, &eM_index)) {\n            eM_remaining &= ~(uint8_t(1) << eM_index);\n            uint32_t eM = system_temps_memexport_data_[eM_index];\n            a_.OpMax(dxbc::Dest::R(eM), dxbc::Src::LF(-1.0f), dxbc::Src::R(eM));\n            a_.OpMin(dxbc::Dest::R(eM), dxbc::Src::LF(1.0f), dxbc::Src::R(eM));\n            a_.OpMul(dxbc::Dest::R(eM), dxbc::Src::R(eM),\n                     dxbc::Src::LF(float(INT16_MAX)));\n          }\n        }\n        a_.OpEndIf();\n\n        // Add plus/minus 0.5 before truncating according to the Direct3D format\n        // conversion rules, and convert to signed integers.\n        uint32_t round_bias_temp = PushSystemTemp();\n        eM_remaining = export_eM;\n        while (xe::bit_scan_forward(eM_remaining, &eM_index)) {\n          eM_remaining &= ~(uint8_t(1) << eM_index);\n          uint32_t eM = system_temps_memexport_data_[eM_index];\n          a_.OpBFI(dxbc::Dest::R(eM), dxbc::Src::LU(31), dxbc::Src::LU(0),\n                   dxbc::Src::LF(0.5f), dxbc::Src::R(eM));\n          a_.OpAdd(dxbc::Dest::R(eM), dxbc::Src::R(eM),\n                   dxbc::Src::R(round_bias_temp));\n          a_.OpFToI(dxbc::Dest::R(eM), dxbc::Src::R(eM));\n        }\n        // Release round_bias_temp.\n        PopSystemTemp();\n      }\n      a_.OpElse();\n      {\n        // Unsigned.\n        a_.OpIf(true, num_format_integer);\n        {\n          // Unsigned integer.\n          eM_remaining = export_eM;\n          while (xe::bit_scan_forward(eM_remaining, &eM_index)) {\n            eM_remaining &= ~(uint8_t(1) << eM_index);\n            uint32_t eM = system_temps_memexport_data_[eM_index];\n            a_.OpMax(dxbc::Dest::R(eM), dxbc::Src::LF(0.0f), dxbc::Src::R(eM));\n            a_.OpMin(dxbc::Dest::R(eM), dxbc::Src::LF(float(UINT16_MAX)),\n                     dxbc::Src::R(eM));\n          }\n        }\n        a_.OpElse();\n        {\n          // Unsigned normalized.\n          eM_remaining = export_eM;\n          while (xe::bit_scan_forward(eM_remaining, &eM_index)) {\n            eM_remaining &= ~(uint8_t(1) << eM_index);\n            uint32_t eM = system_temps_memexport_data_[eM_index];\n            // Saturate.\n            a_.OpMov(dxbc::Dest::R(eM), dxbc::Src::R(eM), true);\n            a_.OpMul(dxbc::Dest::R(eM), dxbc::Src::R(eM),\n                     dxbc::Src::LF(float(UINT16_MAX)));\n          }\n        }\n        a_.OpEndIf();\n\n        // Add 0.5 before truncating according to the Direct3D format conversion\n        // rules, and convert to unsigned integers.\n        eM_remaining = export_eM;\n        while (xe::bit_scan_forward(eM_remaining, &eM_index)) {\n          eM_remaining &= ~(uint8_t(1) << eM_index);\n          uint32_t eM = system_temps_memexport_data_[eM_index];\n          a_.OpAdd(dxbc::Dest::R(eM), dxbc::Src::R(eM), dxbc::Src::LF(0.5f));\n          a_.OpFToU(dxbc::Dest::R(eM), dxbc::Src::R(eM));\n        }\n      }\n      a_.OpEndIf();\n\n      // Pack.\n      eM_remaining = export_eM;\n      while (xe::bit_scan_forward(eM_remaining, &eM_index)) {\n        eM_remaining &= ~(uint8_t(1) << eM_index);\n        uint32_t eM = system_temps_memexport_data_[eM_index];\n        a_.OpBFI(dxbc::Dest::R(eM, 0b0011), dxbc::Src::LU(16),\n                 dxbc::Src::LU(16), dxbc::Src::R(eM, 0b1101),\n                 dxbc::Src::R(eM, 0b1000));\n      }\n\n      a_.OpMov(element_size_dest, dxbc::Src::LU(3));\n    }\n    a_.OpBreak();\n\n    a_.OpCase(dxbc::Src::LU(uint32_t(xenos::ColorFormat::k_16_FLOAT)));\n    {\n      // TODO(Triang3l): Use extended range conversion.\n      eM_remaining = export_eM;\n      while (xe::bit_scan_forward(eM_remaining, &eM_index)) {\n        eM_remaining &= ~(uint8_t(1) << eM_index);\n        uint32_t eM = system_temps_memexport_data_[eM_index];\n        a_.OpF32ToF16(dxbc::Dest::R(eM, 0b0001),\n                      dxbc::Src::R(eM, dxbc::Src::kXXXX));\n      }\n      a_.OpMov(element_size_dest, dxbc::Src::LU(1));\n    }\n    a_.OpBreak();\n\n    a_.OpCase(dxbc::Src::LU(uint32_t(xenos::ColorFormat::k_16_16_FLOAT)));\n    {\n      // TODO(Triang3l): Use extended range conversion.\n      eM_remaining = export_eM;\n      while (xe::bit_scan_forward(eM_remaining, &eM_index)) {\n        eM_remaining &= ~(uint8_t(1) << eM_index);\n        uint32_t eM = system_temps_memexport_data_[eM_index];\n        a_.OpF32ToF16(dxbc::Dest::R(eM, 0b0011), dxbc::Src::R(eM));\n        a_.OpBFI(dxbc::Dest::R(eM, 0b0001), dxbc::Src::LU(16),\n                 dxbc::Src::LU(16), dxbc::Src::R(eM, dxbc::Src::kYYYY),\n                 dxbc::Src::R(eM, dxbc::Src::kXXXX));\n      }\n      a_.OpMov(element_size_dest, dxbc::Src::LU(2));\n    }\n    a_.OpBreak();\n\n    a_.OpCase(dxbc::Src::LU(uint32_t(xenos::ColorFormat::k_16_16_16_16_FLOAT)));\n    {\n      // TODO(Triang3l): Use extended range conversion.\n      eM_remaining = export_eM;\n      while (xe::bit_scan_forward(eM_remaining, &eM_index)) {\n        eM_remaining &= ~(uint8_t(1) << eM_index);\n        uint32_t eM = system_temps_memexport_data_[eM_index];\n        a_.OpF32ToF16(dxbc::Dest::R(eM), dxbc::Src::R(eM));\n        a_.OpBFI(dxbc::Dest::R(eM, 0b0011), dxbc::Src::LU(16),\n                 dxbc::Src::LU(16), dxbc::Src::R(eM, 0b1101),\n                 dxbc::Src::R(eM, 0b1000));\n      }\n      a_.OpMov(element_size_dest, dxbc::Src::LU(3));\n    }\n    a_.OpBreak();\n\n    a_.OpCase(dxbc::Src::LU(uint32_t(xenos::ColorFormat::k_32_FLOAT)));\n    {\n      // Already in eM#.\n      a_.OpMov(element_size_dest, dxbc::Src::LU(2));\n    }\n    a_.OpBreak();\n\n    a_.OpCase(dxbc::Src::LU(uint32_t(xenos::ColorFormat::k_32_32_FLOAT)));\n    {\n      // Already in eM#.\n      a_.OpMov(element_size_dest, dxbc::Src::LU(3));\n    }\n    a_.OpBreak();\n\n    a_.OpCase(dxbc::Src::LU(uint32_t(xenos::ColorFormat::k_32_32_32_32_FLOAT)));\n    {\n      // Already in eM#.\n      a_.OpMov(element_size_dest, dxbc::Src::LU(4));\n    }\n    a_.OpBreak();\n\n    a_.OpDefault();\n    a_.OpMov(element_size_dest, dxbc::Src::LU(UINT32_MAX));\n    a_.OpBreak();\n  }\n  // Close the color format switch.\n  a_.OpEndSwitch();\n\n  dxbc::Src element_size_src(dxbc::Src::R(temp, dxbc::Src::kXXXX));\n\n  // Only temp.x is used currently (for the element size log2).\n\n  // Do endian swap, using temp.y for the endianness value, and temp.z as a\n  // temporary value.\n  {\n    dxbc::Dest endian_dest(dxbc::Dest::R(temp, 0b0010));\n    dxbc::Src endian_src(dxbc::Src::R(temp, dxbc::Src::kYYYY));\n    // Extract endianness into temp.y.\n    a_.OpUBFE(endian_dest, dxbc::Src::LU(3), dxbc::Src::LU(0),\n              dxbc::Src::R(system_temp_memexport_address_, dxbc::Src::kZZZZ));\n\n    // Change 8-in-64 and 8-in-128 to 8-in-32.\n    for (uint32_t i = 0; i < 2; ++i) {\n      a_.OpIEq(dxbc::Dest::R(temp, 0b0100), endian_src,\n               dxbc::Src::LU(uint32_t(i ? xenos::Endian128::k8in128\n                                        : xenos::Endian128::k8in64)));\n      eM_remaining = export_eM;\n      while (xe::bit_scan_forward(eM_remaining, &eM_index)) {\n        eM_remaining &= ~(uint8_t(1) << eM_index);\n        uint32_t eM = system_temps_memexport_data_[eM_index];\n        a_.OpMovC(dxbc::Dest::R(eM), dxbc::Src::R(temp, dxbc::Src::kZZZZ),\n                  dxbc::Src::R(eM, i ? 0b00011011 : 0b10110001),\n                  dxbc::Src::R(eM));\n      }\n      a_.OpMovC(endian_dest, dxbc::Src::R(temp, dxbc::Src::kZZZZ),\n                dxbc::Src::LU(uint32_t(xenos::Endian128::k8in32)), endian_src);\n    }\n\n    uint32_t swap_temp = PushSystemTemp();\n    dxbc::Dest swap_temp_dest(dxbc::Dest::R(swap_temp));\n    dxbc::Src swap_temp_src(dxbc::Src::R(swap_temp));\n\n    // 8-in-16 or one half of 8-in-32.\n    a_.OpSwitch(endian_src);\n    a_.OpCase(dxbc::Src::LU(uint32_t(xenos::Endian128::k8in16)));\n    a_.OpCase(dxbc::Src::LU(uint32_t(xenos::Endian128::k8in32)));\n    eM_remaining = export_eM;\n    while (xe::bit_scan_forward(eM_remaining, &eM_index)) {\n      eM_remaining &= ~(uint8_t(1) << eM_index);\n      uint32_t eM = system_temps_memexport_data_[eM_index];\n      dxbc::Dest eM_dest(dxbc::Dest::R(eM));\n      dxbc::Src eM_src(dxbc::Src::R(eM));\n      // Temp = X0Z0.\n      a_.OpAnd(swap_temp_dest, eM_src, dxbc::Src::LU(0x00FF00FF));\n      // eM = YZW0.\n      a_.OpUShR(eM_dest, eM_src, dxbc::Src::LU(8));\n      // eM = Y0W0.\n      a_.OpAnd(eM_dest, eM_src, dxbc::Src::LU(0x00FF00FF));\n      // eM = YXWZ.\n      a_.OpUMAd(eM_dest, swap_temp_src, dxbc::Src::LU(256), eM_src);\n    }\n    a_.OpBreak();\n    a_.OpEndSwitch();\n\n    // 16-in-32 or another half of 8-in-32.\n    a_.OpSwitch(endian_src);\n    a_.OpCase(dxbc::Src::LU(uint32_t(xenos::Endian128::k8in32)));\n    a_.OpCase(dxbc::Src::LU(uint32_t(xenos::Endian128::k16in32)));\n    eM_remaining = export_eM;\n    while (xe::bit_scan_forward(eM_remaining, &eM_index)) {\n      eM_remaining &= ~(uint8_t(1) << eM_index);\n      uint32_t eM = system_temps_memexport_data_[eM_index];\n      dxbc::Dest eM_dest(dxbc::Dest::R(eM));\n      dxbc::Src eM_src(dxbc::Src::R(eM));\n      // Temp = ZW00.\n      a_.OpUShR(swap_temp_dest, eM_src, dxbc::Src::LU(16));\n      // eM = ZWXY.\n      a_.OpBFI(eM_dest, dxbc::Src::LU(16), dxbc::Src::LU(16), eM_src,\n               swap_temp_src);\n    }\n    a_.OpBreak();\n    a_.OpEndSwitch();\n\n    // Release swap_temp.\n    PopSystemTemp();\n  }\n\n  // Extract the base index to temp.y and the index upper bound to temp.z.\n  a_.OpUBFE(dxbc::Dest::R(temp, 0b0110), dxbc::Src::LU(23), dxbc::Src::LU(0),\n            dxbc::Src::R(system_temp_memexport_address_, 0b1101 << 2));\n  dxbc::Dest eM0_address_dest(dxbc::Dest::R(temp, 0b0010));\n  dxbc::Src eM0_address_src(dxbc::Src::R(temp, dxbc::Src::kYYYY));\n  dxbc::Src index_count_src(dxbc::Src::R(temp, dxbc::Src::kZZZZ));\n\n  // Check if eM0 isn't out of bounds via temp.w - if it is, eM1...4 also are\n  // (the base index can't be negative).\n  a_.OpILT(dxbc::Dest::R(temp, 0b1000), eM0_address_src, index_count_src);\n  a_.OpIf(true, dxbc::Src::R(temp, dxbc::Src::kWWWW));\n\n  // Extract the base address to temp.w as bytes (30 lower bits to 30 upper bits\n  // with 0 below).\n  a_.OpIShL(dxbc::Dest::R(temp, 0b1000),\n            dxbc::Src::R(system_temp_memexport_address_, dxbc::Src::kXXXX),\n            dxbc::Src::LU(2));\n  dxbc::Src base_address_src(dxbc::Src::R(temp, dxbc::Src::kWWWW));\n\n  uint8_t export_eM14 = export_eM >> 1;\n  assert_zero(export_eM14 >> 4);\n  uint32_t eM14_address_temp = UINT32_MAX, store_eM14_temp = UINT32_MAX;\n  if (export_eM14) {\n    // Get eM1...4 indices and check if they're in bounds.\n    eM14_address_temp = PushSystemTemp();\n    dxbc::Dest eM14_address_dest(dxbc::Dest::R(eM14_address_temp, export_eM14));\n    dxbc::Src eM14_address_src(dxbc::Src::R(eM14_address_temp));\n    store_eM14_temp = PushSystemTemp();\n    dxbc::Dest store_eM14_dest(dxbc::Dest::R(store_eM14_temp, export_eM14));\n    dxbc::Src store_eM14_src(dxbc::Src::R(store_eM14_temp));\n    a_.OpIAdd(eM14_address_dest, eM0_address_src, dxbc::Src::LU(1, 2, 3, 4));\n    a_.OpILT(store_eM14_dest, eM14_address_src, index_count_src);\n    // Check if eM1...4 were actually written by the invocation and merge the\n    // result with store_eM14_temp.\n    uint32_t eM14_written_temp = PushSystemTemp();\n    a_.OpIBFE(dxbc::Dest::R(eM14_written_temp, export_eM14), dxbc::Src::LU(1),\n              dxbc::Src::LU(1, 2, 3, 4),\n              dxbc::Src::R(system_temp_memexport_enabled_and_eM_written_,\n                           dxbc::Src::kYYYY));\n    a_.OpAnd(store_eM14_dest, store_eM14_src, dxbc::Src::R(eM14_written_temp));\n    // Release eM14_written_temp.\n    PopSystemTemp();\n    // Convert eM1...4 indices to global byte addresses.\n    a_.OpIShL(eM14_address_dest, eM14_address_src, element_size_src);\n    a_.OpIAdd(eM14_address_dest, base_address_src, eM14_address_src);\n  }\n  if (export_eM & 0b1) {\n    // Convert eM0 index to a global byte address if it's needed.\n    a_.OpIShL(eM0_address_dest, eM0_address_src, element_size_src);\n    a_.OpIAdd(eM0_address_dest, base_address_src, eM0_address_src);\n    // base_address_src and index_count_src are deallocated at this point (even\n    // if eM0 isn't potentially written), temp.zw are now free.\n    // Extract if eM0 was actually written by the invocation to temp.z.\n    a_.OpIBFE(dxbc::Dest::R(temp, 0b0100), dxbc::Src::LU(1), dxbc::Src::LU(0),\n              dxbc::Src::R(system_temp_memexport_enabled_and_eM_written_,\n                           dxbc::Src::kYYYY));\n  }\n  dxbc::Src eM0_written_src(dxbc::Src::R(temp, dxbc::Src::kZZZZ));\n\n  // Write depending on the element size.\n  // No switch case will be entered for an unknown format (UINT32_MAX size\n  // written), so writing won't be attempted for it.\n  if (uav_index_shared_memory_ == kBindingIndexUnallocated) {\n    uav_index_shared_memory_ = uav_count_++;\n  }\n  uint8_t eM14_remaining;\n  uint32_t eM14_index;\n  a_.OpSwitch(element_size_src);\n\n  // 8bpp, 16bpp.\n  dxbc::Dest atomic_dest(dxbc::Dest::U(\n      uav_index_shared_memory_, uint32_t(UAVRegister::kSharedMemory), 0));\n  for (uint32_t i = 0; i <= 1; ++i) {\n    a_.OpCase(dxbc::Src::LU(i));\n    dxbc::Src width_src(dxbc::Src::LU(8 << i));\n    uint32_t sub_dword_temp = PushSystemTemp();\n    if (export_eM & 0b1) {\n      a_.OpIf(true, eM0_written_src);\n      // sub_dword_temp.x = eM0 offset in the dword (8 << (byte_address & 3))\n      // (assuming a little-endian host).\n      a_.OpBFI(dxbc::Dest::R(sub_dword_temp, 0b0001), dxbc::Src::LU(2),\n               dxbc::Src::LU(3), eM0_address_src, dxbc::Src::LU(0));\n      // Keep only the dword part of the address.\n      a_.OpAnd(eM0_address_dest, eM0_address_src, dxbc::Src::LU(~uint32_t(3)));\n      // Erase the bits that will be replaced with eM0 via sub_dword_temp.y.\n      a_.OpBFI(dxbc::Dest::R(sub_dword_temp, 0b0010), width_src,\n               dxbc::Src::R(sub_dword_temp, dxbc::Src::kXXXX), dxbc::Src::LU(0),\n               dxbc::Src::LU(UINT32_MAX));\n      a_.OpAtomicAnd(atomic_dest, eM0_address_src, 0b0001,\n                     dxbc::Src::R(sub_dword_temp, dxbc::Src::kYYYY));\n      // Add the eM0 bits via sub_dword_temp.y.\n      a_.OpBFI(dxbc::Dest::R(sub_dword_temp, 0b0010), width_src,\n               dxbc::Src::R(sub_dword_temp, dxbc::Src::kXXXX),\n               dxbc::Src::R(system_temps_memexport_data_[0], dxbc::Src::kXXXX),\n               dxbc::Src::LU(0));\n      a_.OpAtomicOr(atomic_dest, eM0_address_src, 0b0001,\n                    dxbc::Src::R(sub_dword_temp, dxbc::Src::kYYYY));\n      a_.OpEndIf();\n    }\n    if (export_eM14) {\n      // sub_dword_temp = eM# offset in the dword (8 << (byte_address & 3))\n      // (assuming a little-endian host).\n      a_.OpBFI(dxbc::Dest::R(sub_dword_temp, export_eM14), dxbc::Src::LU(2),\n               dxbc::Src::LU(3), dxbc::Src::R(eM14_address_temp),\n               dxbc::Src::LU(0));\n      // Keep only the dword part of the address.\n      a_.OpAnd(dxbc::Dest::R(eM14_address_temp, export_eM14),\n               dxbc::Src::R(eM14_address_temp), dxbc::Src::LU(~uint32_t(3)));\n      uint32_t sub_dword_data_temp = PushSystemTemp();\n      eM14_remaining = export_eM14;\n      while (xe::bit_scan_forward(eM14_remaining, &eM14_index)) {\n        eM14_remaining &= ~(uint8_t(1) << eM14_index);\n        a_.OpIf(true, dxbc::Src::R(store_eM14_temp).Select(eM14_index));\n        // Erase the bits that will be replaced with eM# via\n        // sub_dword_data_temp.x.\n        a_.OpBFI(dxbc::Dest::R(sub_dword_data_temp, 0b0001), width_src,\n                 dxbc::Src::R(sub_dword_temp).Select(eM14_index),\n                 dxbc::Src::LU(0), dxbc::Src::LU(UINT32_MAX));\n        a_.OpAtomicAnd(\n            atomic_dest, dxbc::Src::R(eM14_address_temp).Select(eM14_index),\n            0b0001, dxbc::Src::R(sub_dword_data_temp, dxbc::Src::kXXXX));\n        // Add the eM# bits via sub_dword_temp.y.\n        a_.OpBFI(dxbc::Dest::R(sub_dword_data_temp, 0b0001), width_src,\n                 dxbc::Src::R(sub_dword_temp).Select(eM14_index),\n                 dxbc::Src::R(system_temps_memexport_data_[1 + eM14_index],\n                              dxbc::Src::kXXXX),\n                 dxbc::Src::LU(0));\n        a_.OpAtomicOr(\n            atomic_dest, dxbc::Src::R(eM14_address_temp).Select(eM14_index),\n            0b0001, dxbc::Src::R(sub_dword_data_temp, dxbc::Src::kXXXX));\n        a_.OpEndIf();\n      }\n      // Release sub_dword_data_temp.\n      PopSystemTemp();\n    }\n    // Release sub_dword_temp.\n    PopSystemTemp();\n    a_.OpBreak();\n  }\n\n  // 32bpp, 64bpp, 128bpp.\n  for (uint32_t i = 2; i <= 4; ++i) {\n    a_.OpCase(dxbc::Src::LU(i));\n    // Store (0b0001), Store2 (0b0011), Store4 (0b1111).\n    uint32_t store_mask = (uint32_t(1) << (uint32_t(1) << (i - 2))) - 1;\n    dxbc::Dest store_dest(dxbc::Dest::U(uav_index_shared_memory_,\n                                        uint32_t(UAVRegister::kSharedMemory),\n                                        store_mask));\n    if (export_eM & 0b1) {\n      a_.OpIf(true, eM0_written_src);\n      a_.OpStoreRaw(store_dest, eM0_address_src,\n                    dxbc::Src::R(system_temps_memexport_data_[0]));\n      a_.OpEndIf();\n    }\n    eM14_remaining = export_eM14;\n    while (xe::bit_scan_forward(eM14_remaining, &eM14_index)) {\n      eM14_remaining &= ~(uint8_t(1) << eM14_index);\n      a_.OpIf(true, dxbc::Src::R(store_eM14_temp).Select(eM14_index));\n      a_.OpStoreRaw(store_dest,\n                    dxbc::Src::R(eM14_address_temp).Select(eM14_index),\n                    dxbc::Src::R(system_temps_memexport_data_[1 + eM14_index]));\n      a_.OpEndIf();\n    }\n    a_.OpBreak();\n  }\n\n  // Close the element size switch.\n  a_.OpEndSwitch();\n\n  if (export_eM14) {\n    // Release eM14_address_temp and store_eM14_temp.\n    PopSystemTemp(2);\n  }\n\n  // Close the eM0 bounds check.\n  a_.OpEndIf();\n\n  // Release temp.\n  PopSystemTemp();\n\n  // Close the address correctness conditional.\n  a_.OpEndIf();\n\n  // Close the memory export allowed conditional.\n  a_.OpEndIf();\n}\n\n}  // namespace gpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/dxbc_shader_translator_om.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/dxbc_shader_translator.h\"\n\n#include <cstdint>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/gpu/draw_util.h\"\n#include \"xenia/gpu/render_target_cache.h\"\n#include \"xenia/gpu/texture_cache.h\"\n\nnamespace xe {\nnamespace gpu {\nusing namespace ucode;\n\nvoid DxbcShaderTranslator::StartPixelShader_LoadROVParameters() {\n  bool any_color_targets_written = current_shader().writes_color_targets() != 0;\n\n  // ***************************************************************************\n  // Get EDRAM offsets for the pixel:\n  // system_temp_rov_params_.y - for depth (absolute).\n  // system_temp_rov_params_.z - for 32bpp color (base-relative).\n  // system_temp_rov_params_.w - for 64bpp color (base-relative).\n  // ***************************************************************************\n\n  // For now, while we don't know the encoding of 64bpp render targets when\n  // interpreted as 32bpp (no game has been seen reinterpreting between the two\n  // yet), for consistency with the conventional render target logic and to have\n  // the same resolve logic for both, storing 64bpp color as 40x16 samples\n  // (multiplied by the resolution scale) per 1280-byte tile. It's also\n  // convenient to use 40x16 granularity in the calculations here because depth\n  // render targets have 40-sample halves swapped as opposed to color in each\n  // tile, and reinterpretation between depth and color is common for depth /\n  // stencil reloading into the EDRAM (such as in the background of the main\n  // menu of 4D5307E6).\n\n  // Convert the host pixel position to integer to system_temp_rov_params_.xy.\n  // system_temp_rov_params_.x = X host pixel position as uint\n  // system_temp_rov_params_.y = Y host pixel position as uint\n  in_position_used_ |= 0b0011;\n  a_.OpFToU(dxbc::Dest::R(system_temp_rov_params_, 0b0011),\n            dxbc::Src::V1D(in_reg_ps_position_));\n  // Convert the position from pixels to samples.\n  // system_temp_rov_params_.x = X sample 0 position\n  // system_temp_rov_params_.y = Y sample 0 position\n  a_.OpIShL(\n      dxbc::Dest::R(system_temp_rov_params_, 0b0011),\n      dxbc::Src::R(system_temp_rov_params_),\n      LoadSystemConstant(SystemConstants::Index::kSampleCountLog2,\n                         offsetof(SystemConstants, sample_count_log2), 0b0100));\n  // For cases of both color and depth:\n  //   Get 40 x 16 x resolution scale 32bpp half-tile or 40x16 64bpp tile index\n  //   to system_temp_rov_params_.zw, and put the sample index within such a\n  //   region in system_temp_rov_params_.xy.\n  //   Working with 40x16-sample portions for 64bpp and for swapping for depth -\n  //   dividing by 40, not by 80.\n  // For depth-only:\n  //   Same, but for full 80x16 tiles, not 40x16 half-tiles.\n  uint32_t tile_width =\n      xenos::kEdramTileWidthSamples * draw_resolution_scale_x_;\n  uint32_t tile_or_tile_half_width =\n      tile_width >> uint32_t(any_color_targets_written);\n  uint32_t tile_height =\n      xenos::kEdramTileHeightSamples * draw_resolution_scale_y_;\n  // system_temp_rov_params_.x = X sample 0 position within the half-tile or\n  //                             tile\n  // system_temp_rov_params_.y = Y sample 0 position within the (half-)tile\n  // system_temp_rov_params_.z = X half-tile or tile position\n  // system_temp_rov_params_.w = Y tile position\n  a_.OpUDiv(dxbc::Dest::R(system_temp_rov_params_, 0b1100),\n            dxbc::Dest::R(system_temp_rov_params_, 0b0011),\n            dxbc::Src::R(system_temp_rov_params_, 0b01000100),\n            dxbc::Src::LU(tile_or_tile_half_width, tile_height,\n                          tile_or_tile_half_width, tile_height));\n\n  // Convert the Y sample 0 position within the half-tile or tile to the dword\n  // offset of the row within a 80x16 32bpp tile or a 40x16 64bpp half-tile to\n  // system_temp_rov_params_.y.\n  // system_temp_rov_params_.x = X sample 0 position within the half-tile or\n  //                             tile\n  // system_temp_rov_params_.y = Y sample 0 row dword offset within the\n  //                             80x16-dword tile\n  // system_temp_rov_params_.z = X half-tile position\n  // system_temp_rov_params_.w = Y tile position\n  a_.OpUMul(dxbc::Dest::Null(), dxbc::Dest::R(system_temp_rov_params_, 0b0010),\n            dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kYYYY),\n            dxbc::Src::LU(tile_width));\n\n  uint32_t tile_size = tile_width * tile_height;\n  uint32_t tile_half_width = tile_width >> 1;\n  if (any_color_targets_written) {\n    // Depth, 32bpp color, 64bpp color are all needed.\n\n    // X sample 0 position within in the half-tile in system_temp_rov_params_.x,\n    // for 64bpp, will be used directly as sample X the within the 80x16-dword\n    // region, but for 32bpp color and depth, 40x16 half-tile index within the\n    // 80x16 tile - system_temp_rov_params_.z & 1 - will also be taken into\n    // account when calculating the X (directly for color, flipped for depth).\n\n    uint32_t rov_address_temp = PushSystemTemp();\n\n    // Multiply the Y tile position by the surface tile pitch in dwords to get\n    // the address of the origin of the row of tiles within a 32bpp surface in\n    // dwords (later it needs to be multiplied by 2 for 64bpp).\n    // system_temp_rov_params_.x = X sample 0 position within the half-tile\n    // system_temp_rov_params_.y = Y sample 0 row dword offset within the\n    //                             80x16-dword tile\n    // system_temp_rov_params_.z = X half-tile position\n    // system_temp_rov_params_.w = Y tile row dword origin in a 32bpp surface\n    a_.OpUMul(\n        dxbc::Dest::Null(), dxbc::Dest::R(system_temp_rov_params_, 0b1000),\n        dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kWWWW),\n        LoadSystemConstant(\n            SystemConstants::Index::kEdram32bppTilePitchDwordsScaled,\n            offsetof(SystemConstants, edram_32bpp_tile_pitch_dwords_scaled),\n            dxbc::Src::kXXXX));\n\n    // Get the 32bpp tile X position within the row of tiles to\n    // rov_address_temp.x.\n    // system_temp_rov_params_.x = X sample 0 position within the half-tile\n    // system_temp_rov_params_.y = Y sample 0 row dword offset within the\n    //                             80x16-dword tile\n    // system_temp_rov_params_.z = X half-tile position\n    // system_temp_rov_params_.w = Y tile row dword origin in a 32bpp surface\n    // rov_address_temp.x = X 32bpp tile position\n    a_.OpUShR(dxbc::Dest::R(rov_address_temp, 0b0001),\n              dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kZZZZ),\n              dxbc::Src::LU(1));\n    // Get the dword offset of the beginning of the row of samples within a row\n    // of 32bpp 80x16 tiles to rov_address_temp.x.\n    // system_temp_rov_params_.x = X sample 0 position within the half-tile\n    // system_temp_rov_params_.y = Y sample 0 row dword offset within the\n    //                             80x16-dword tile\n    // system_temp_rov_params_.z = X half-tile position\n    // system_temp_rov_params_.w = Y tile row dword origin in a 32bpp surface\n    // rov_address_temp.x = dword offset of the beginning of the row of samples\n    //                      within a row of 32bpp tiles\n    a_.OpUMAd(dxbc::Dest::R(rov_address_temp, 0b0001),\n              dxbc::Src::R(rov_address_temp, dxbc::Src::kXXXX),\n              dxbc::Src::LU(tile_size),\n              dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kYYYY));\n    // Get the dword offset of the beginning of the row of samples within a\n    // 32bpp surface to rov_address_temp.x.\n    // system_temp_rov_params_.x = X sample 0 position within the half-tile\n    // system_temp_rov_params_.y = Y sample 0 row dword offset within the\n    //                             80x16-dword tile\n    // system_temp_rov_params_.z = X half-tile position\n    // system_temp_rov_params_.w = Y tile row dword origin in a 32bpp surface\n    // rov_address_temp.x = dword offset of the beginning of the row of samples\n    //                      within a 32bpp surface\n    a_.OpIAdd(dxbc::Dest::R(rov_address_temp, 0b0001),\n              dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kWWWW),\n              dxbc::Src::R(rov_address_temp, dxbc::Src::kXXXX));\n\n    // Get the dword offset of the beginning of the row of samples within a row\n    // of 64bpp 80x16 tiles to system_temp_rov_params_.y (last time the\n    // tile-local Y offset is needed).\n    // system_temp_rov_params_.x = X sample 0 position within the half-tile\n    // system_temp_rov_params_.y = dword offset of the beginning of the row of\n    //                             samples within a row of 64bpp tiles\n    // system_temp_rov_params_.z = X half-tile position\n    // system_temp_rov_params_.w = Y tile row dword origin in a 32bpp surface\n    // rov_address_temp.x = dword offset of the beginning of the row of samples\n    //                      within a 32bpp surface\n    a_.OpUMAd(dxbc::Dest::R(system_temp_rov_params_, 0b0010),\n              dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kZZZZ),\n              dxbc::Src::LU(tile_size),\n              dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kYYYY));\n    // Get the dword offset of the beginning of the row of samples within a\n    // 64bpp surface to system_temp_rov_params_.w (last time the Y tile row\n    // offset is needed).\n    // system_temp_rov_params_.x = X sample 0 position within the half-tile\n    // system_temp_rov_params_.y = free\n    // system_temp_rov_params_.z = X half-tile position\n    // system_temp_rov_params_.w = dword offset of the beginning of the row of\n    //                             samples within a 64bpp surface\n    // rov_address_temp.x = dword offset of the beginning of the row of samples\n    //                      within a 32bpp surface\n    a_.OpUMAd(dxbc::Dest::R(system_temp_rov_params_, 0b1000),\n              dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kWWWW),\n              dxbc::Src::LU(2),\n              dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kYYYY));\n\n    // Get the final offset of the sample 0 within a 64bpp surface to\n    // system_temp_rov_params_.w.\n    // system_temp_rov_params_.x = X sample 0 position within the half-tile\n    // system_temp_rov_params_.z = X half-tile position\n    // system_temp_rov_params_.w = dword sample 0 offset within a 64bpp surface\n    // rov_address_temp.x = dword offset of the beginning of the row of samples\n    //                      within a 32bpp surface\n    a_.OpUMAd(dxbc::Dest::R(system_temp_rov_params_, 0b1000),\n              dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kXXXX),\n              dxbc::Src::LU(2),\n              dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kWWWW));\n\n    // Get the half-tile index within the tile to system_temp_rov_params_.y\n    // (last time the X half-tile position is needed).\n    // system_temp_rov_params_.x = X sample 0 position within the half-tile\n    // system_temp_rov_params_.y = half-tile index within the tile\n    // system_temp_rov_params_.z = free\n    // system_temp_rov_params_.w = dword sample 0 offset within a 64bpp surface\n    // rov_address_temp.x = dword offset of the beginning of the row of samples\n    //                      within a 32bpp surface\n    a_.OpAnd(dxbc::Dest::R(system_temp_rov_params_, 0b0010),\n             dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kZZZZ),\n             dxbc::Src::LU(1));\n\n    // Get the X position within the 32bpp tile to system_temp_rov_params_.z\n    // (last time the X position within the half-tile is needed).\n    // system_temp_rov_params_.x = free\n    // system_temp_rov_params_.y = half-tile index within the tile\n    // system_temp_rov_params_.z = X sample 0 position within the tile\n    // system_temp_rov_params_.w = dword sample 0 offset within a 64bpp surface\n    // rov_address_temp.x = dword offset of the beginning of the row of samples\n    //                      within a 32bpp surface\n    a_.OpUMAd(dxbc::Dest::R(system_temp_rov_params_, 0b0100),\n              dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kYYYY),\n              dxbc::Src::LU(tile_half_width),\n              dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kXXXX));\n    // Get the final offset of the sample 0 within a 32bpp color surface to\n    // system_temp_rov_params_.z (last time the 32bpp row offset is needed).\n    // system_temp_rov_params_.y = half-tile index within the tile\n    // system_temp_rov_params_.z = dword sample 0 offset within a 32bpp surface\n    // system_temp_rov_params_.w = dword sample 0 offset within a 64bpp surface\n    // rov_address_temp.x = free\n    a_.OpIAdd(dxbc::Dest::R(system_temp_rov_params_, 0b0100),\n              dxbc::Src::R(rov_address_temp, dxbc::Src::kXXXX),\n              dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kZZZZ));\n\n    // Flip the 40x16 half-tiles for depth / stencil as opposed to 32bpp color -\n    // get the dword offset to add for flipping to system_temp_rov_params_.y.\n    // system_temp_rov_params_.y = depth half-tile flipping offset\n    // system_temp_rov_params_.z = dword sample 0 offset within a 32bpp surface\n    // system_temp_rov_params_.w = dword sample 0 offset within a 64bpp surface\n    a_.OpMovC(dxbc::Dest::R(system_temp_rov_params_, 0b0010),\n              dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kYYYY),\n              dxbc::Src::LI(-int32_t(tile_half_width)),\n              dxbc::Src::LI(int32_t(tile_half_width)));\n    // Flip the 40x16 half-tiles for depth / stencil as opposed to 32bpp color -\n    // get the final offset of the sample 0 within a 32bpp depth / stencil\n    // surface to system_temp_rov_params_.y.\n    // system_temp_rov_params_.y = dword sample 0 offset within depth / stencil\n    // system_temp_rov_params_.z = dword sample 0 offset within a 32bpp surface\n    // system_temp_rov_params_.w = dword sample 0 offset within a 64bpp surface\n    a_.OpIAdd(dxbc::Dest::R(system_temp_rov_params_, 0b0010),\n              dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kZZZZ),\n              dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kYYYY));\n\n    // Release rov_address_temp.\n    PopSystemTemp();\n  } else {\n    // Simpler logic for depth-only, not involving half-tile indices (flipping\n    // half-tiles via comparison).\n\n    // Get the dword offset of the beginning of the row of samples within a row\n    // of 32bpp 80x16 tiles to system_temp_rov_params_.z (last time the X tile\n    // position is needed).\n    // system_temp_rov_params_.x = X sample 0 position within the tile\n    // system_temp_rov_params_.y = Y sample 0 row dword offset within the\n    //                             80x16-dword tile\n    // system_temp_rov_params_.z = dword offset of the beginning of the row of\n    //                             samples within a row of 32bpp tiles\n    // system_temp_rov_params_.w = Y tile position\n    a_.OpUMAd(dxbc::Dest::R(system_temp_rov_params_, 0b0100),\n              dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kZZZZ),\n              dxbc::Src::LU(tile_size),\n              dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kYYYY));\n    // Get the dword offset of the beginning of the row of samples within a\n    // 32bpp surface to system_temp_rov_params_.y (last time anything Y-related\n    // is needed, as well as the sample row offset within the tile row).\n    // system_temp_rov_params_.x = X sample 0 position within the tile\n    // system_temp_rov_params_.y = dword offset of the beginning of the row of\n    //                             samples within a 32bpp surface\n    // system_temp_rov_params_.z = free\n    // system_temp_rov_params_.w = free\n    a_.OpUMAd(\n        dxbc::Dest::R(system_temp_rov_params_, 0b0010),\n        dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kWWWW),\n        LoadSystemConstant(\n            SystemConstants::Index::kEdram32bppTilePitchDwordsScaled,\n            offsetof(SystemConstants, edram_32bpp_tile_pitch_dwords_scaled),\n            dxbc::Src::kXXXX),\n        dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kZZZZ));\n    // Add the tile-local X to the depth offset in system_temp_rov_params_.y.\n    // system_temp_rov_params_.x = X sample 0 position within the tile\n    // system_temp_rov_params_.y = dword sample 0 offset within a 32bpp surface\n    a_.OpIAdd(dxbc::Dest::R(system_temp_rov_params_, 0b0010),\n              dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kYYYY),\n              dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kXXXX));\n    // Flip the 40x16 half-tiles for depth / stencil as opposed to 32bpp color -\n    // check in which half-tile the pixel is in to system_temp_rov_params_.x.\n    // system_temp_rov_params_.x = free\n    // system_temp_rov_params_.y = dword sample 0 offset within a 32bpp surface\n    // system_temp_rov_params_.z = 0xFFFFFFFF if in the right half-tile, 0\n    //                             otherwise\n    a_.OpUGE(dxbc::Dest::R(system_temp_rov_params_, 0b0001),\n             dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kXXXX),\n             dxbc::Src::LU(tile_half_width));\n    // Flip the 40x16 half-tiles for depth / stencil as opposed to 32bpp color -\n    // get the dword offset to add for flipping to system_temp_rov_params_.x.\n    // system_temp_rov_params_.x = depth half-tile flipping offset\n    // system_temp_rov_params_.y = dword sample 0 offset within a 32bpp surface\n    a_.OpMovC(dxbc::Dest::R(system_temp_rov_params_, 0b0001),\n              dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kXXXX),\n              dxbc::Src::LI(-int32_t(tile_half_width)),\n              dxbc::Src::LI(int32_t(tile_half_width)));\n    // Flip the 40x16 half-tiles for depth / stencil as opposed to 32bpp color -\n    // get the final offset of the sample 0 within a 32bpp depth / stencil\n    // surface to system_temp_rov_params_.y.\n    // system_temp_rov_params_.x = free\n    // system_temp_rov_params_.y = dword sample 0 offset within depth / stencil\n    a_.OpIAdd(dxbc::Dest::R(system_temp_rov_params_, 0b0010),\n              dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kYYYY),\n              dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kXXXX));\n  }\n\n  // Add the EDRAM base for depth/stencil.\n  // system_temp_rov_params_.y = non-wrapped EDRAM depth / stencil address\n  // system_temp_rov_params_.z = dword sample 0 offset within a 32bpp surface if\n  //                             needed\n  // system_temp_rov_params_.w = dword sample 0 offset within a 64bpp surface if\n  //                             needed\n  a_.OpIAdd(dxbc::Dest::R(system_temp_rov_params_, 0b0010),\n            dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kYYYY),\n            LoadSystemConstant(\n                SystemConstants::Index::kEdramDepthBaseDwordsScaled,\n                offsetof(SystemConstants, edram_depth_base_dwords_scaled),\n                dxbc::Src::kXXXX));\n  // Wrap EDRAM addressing for depth/stencil.\n  // system_temp_rov_params_.y = EDRAM depth / stencil address\n  // system_temp_rov_params_.z = dword sample 0 offset within a 32bpp surface if\n  //                             needed\n  // system_temp_rov_params_.w = dword sample 0 offset within a 64bpp surface if\n  //                             needed\n  a_.OpUDiv(dxbc::Dest::Null(), dxbc::Dest::R(system_temp_rov_params_, 0b0010),\n            dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kYYYY),\n            dxbc::Src::LU(tile_size * xenos::kEdramTileCount));\n\n  // ***************************************************************************\n  // Sample coverage to system_temp_rov_params_.x.\n  // ***************************************************************************\n\n  // Using ForcedSampleCount of 4 (2 is not supported on Nvidia), so for 2x\n  // MSAA, handling samples 0 and 3 (upper-left and lower-right) as 0 and 1.\n\n  // Check if 4x MSAA is enabled.\n  a_.OpIf(true, LoadSystemConstant(SystemConstants::Index::kSampleCountLog2,\n                                   offsetof(SystemConstants, sample_count_log2),\n                                   dxbc::Src::kXXXX));\n  {\n    // Copy the 4x AA coverage to system_temp_rov_params_.x, making top-right\n    // the sample [2] and bottom-left the sample [1] (the opposite of Direct3D\n    // 12), because on the Xbox 360, 2x MSAA doubles the storage height, 4x MSAA\n    // doubles the storage width.\n    // Flip samples in bits 0:1 to bits 29:30.\n    a_.OpBFRev(dxbc::Dest::R(system_temp_rov_params_, 0b0001),\n               dxbc::Src::VCoverage());\n    a_.OpUShR(dxbc::Dest::R(system_temp_rov_params_, 0b0001),\n              dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kXXXX),\n              dxbc::Src::LU(29));\n    a_.OpBFI(dxbc::Dest::R(system_temp_rov_params_, 0b0001), dxbc::Src::LU(2),\n             dxbc::Src::LU(1),\n             dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kXXXX),\n             dxbc::Src::VCoverage());\n  }\n  // Handle 1 or 2 samples.\n  a_.OpElse();\n  {\n    // Extract sample 3 coverage, which will be used as sample 1.\n    a_.OpUBFE(dxbc::Dest::R(system_temp_rov_params_, 0b0001), dxbc::Src::LU(1),\n              dxbc::Src::LU(3), dxbc::Src::VCoverage());\n    // Combine coverage of samples 0 (in bit 0 of vCoverage) and 3 (in bit 0 of\n    // system_temp_rov_params_.x).\n    a_.OpBFI(dxbc::Dest::R(system_temp_rov_params_, 0b0001), dxbc::Src::LU(31),\n             dxbc::Src::LU(1),\n             dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kXXXX),\n             dxbc::Src::VCoverage());\n  }\n  // Close the 4x MSAA conditional.\n  a_.OpEndIf();\n}\n\nvoid DxbcShaderTranslator::ROV_DepthStencilTest() {\n  uint32_t temp = PushSystemTemp();\n  dxbc::Dest temp_x_dest(dxbc::Dest::R(temp, 0b0001));\n  dxbc::Src temp_x_src(dxbc::Src::R(temp, dxbc::Src::kXXXX));\n  dxbc::Dest temp_y_dest(dxbc::Dest::R(temp, 0b0010));\n  dxbc::Src temp_y_src(dxbc::Src::R(temp, dxbc::Src::kYYYY));\n  dxbc::Dest temp_z_dest(dxbc::Dest::R(temp, 0b0100));\n  dxbc::Src temp_z_src(dxbc::Src::R(temp, dxbc::Src::kZZZZ));\n  dxbc::Dest temp_w_dest(dxbc::Dest::R(temp, 0b1000));\n  dxbc::Src temp_w_src(dxbc::Src::R(temp, dxbc::Src::kWWWW));\n\n  // Check whether depth/stencil is enabled.\n  // temp.x = kSysFlag_ROVDepthStencil\n  a_.OpAnd(temp_x_dest, LoadFlagsSystemConstant(),\n           dxbc::Src::LU(kSysFlag_ROVDepthStencil));\n  // Open the depth/stencil enabled conditional.\n  // temp.x = free\n  a_.OpIf(true, temp_x_src);\n\n  bool shader_writes_depth = current_shader().writes_depth();\n  bool depth_stencil_early = ROV_IsDepthStencilEarly();\n\n  dxbc::Src z_ddx_src(dxbc::Src::LF(0.0f)), z_ddy_src(dxbc::Src::LF(0.0f));\n\n  if (shader_writes_depth) {\n    // Convert the shader-generated depth to 24-bit, using temp.x as\n    // temporary. oDepth is already written by StoreResult with saturation,\n    // no need to clamp here. Adreno 200 doesn't have PA_SC_VPORT_ZMIN/ZMAX,\n    // so likely there's no need to clamp to the viewport depth bounds.\n    ROV_DepthTo24Bit(system_temp_depth_stencil_, 0, system_temp_depth_stencil_,\n                     0, temp, 0);\n  } else {\n    dxbc::Src in_position_z(\n        dxbc::Src::V1D(in_reg_ps_position_, dxbc::Src::kZZZZ));\n    // Get the derivatives of the screen-space (but not clamped to the viewport\n    // depth bounds yet - this happens after the pixel shader in Direct3D 11+;\n    // also linear within the triangle - thus constant derivatives along the\n    // triangle) Z for calculating per-sample depth values and the slope-scaled\n    // polygon offset.\n    // We're using derivatives instead of eval_sample_index for various reasons:\n    // - eval_sample_index doesn't work with SV_Position - need to use an\n    //   additional interpolant.\n    // - On AMD, eval_sample_index is actually implemented via calculation and\n    //   scaling of derivatives of barycentric coordinates, therefore there's no\n    //   advantage of using it there.\n    // - eval_sample_index is (inconsistently, but often) one of the sources of\n    //   the infamous AMD shader compiler crashes when ROV is used in Xenia, in\n    //   addition to shader compiler crashes on WARP.\n    if (depth_stencil_early) {\n      z_ddx_src = dxbc::Src::R(temp, dxbc::Src::kXXXX);\n      z_ddy_src = dxbc::Src::R(temp, dxbc::Src::kYYYY);\n      // temp.x = ddx(z)\n      // temp.y = ddy(z)\n      in_position_used_ |= 0b0100;\n      a_.OpDerivRTXCoarse(temp_x_dest, in_position_z);\n      a_.OpDerivRTYCoarse(temp_y_dest, in_position_z);\n    } else {\n      // For late depth / stencil testing, derivatives are calculated in the\n      // beginning of the shader before any return statement is possibly\n      // reached, and written to system_temp_depth_stencil_.xy.\n      assert_true(system_temp_depth_stencil_ != UINT32_MAX);\n      z_ddx_src = dxbc::Src::R(system_temp_depth_stencil_, dxbc::Src::kXXXX);\n      z_ddy_src = dxbc::Src::R(system_temp_depth_stencil_, dxbc::Src::kYYYY);\n    }\n    // Get the maximum depth slope for polygon offset.\n    // https://docs.microsoft.com/en-us/windows/desktop/direct3d9/depth-bias\n    // temp.x if early = ddx(z)\n    // temp.y if early = ddy(z)\n    // temp.z = max(|ddx(z)|, |ddy(z)|)\n    a_.OpMax(temp_z_dest, z_ddx_src.Abs(), z_ddy_src.Abs());\n    // Calculate the depth bias for the needed faceness.\n    in_front_face_used_ = true;\n    a_.OpIf(true, dxbc::Src::V1D(in_reg_ps_front_face_sample_index_,\n                                 dxbc::Src::kXXXX));\n    // temp.x if early = ddx(z)\n    // temp.y if early = ddy(z)\n    // temp.z = front face polygon offset\n    // temp.w = free\n    a_.OpMAd(\n        temp_z_dest, temp_z_src,\n        LoadSystemConstant(SystemConstants::Index::kEdramPolyOffsetFront,\n                           offsetof(SystemConstants, edram_poly_offset_front),\n                           dxbc::Src::kXXXX),\n        LoadSystemConstant(SystemConstants::Index::kEdramPolyOffsetFront,\n                           offsetof(SystemConstants, edram_poly_offset_front),\n                           dxbc::Src::kYYYY));\n    a_.OpElse();\n    // temp.x if early = ddx(z)\n    // temp.y if early = ddy(z)\n    // temp.z = back face polygon offset\n    // temp.w = free\n    a_.OpMAd(\n        temp_z_dest, temp_z_src,\n        LoadSystemConstant(SystemConstants::Index::kEdramPolyOffsetBack,\n                           offsetof(SystemConstants, edram_poly_offset_back),\n                           dxbc::Src::kXXXX),\n        LoadSystemConstant(SystemConstants::Index::kEdramPolyOffsetBack,\n                           offsetof(SystemConstants, edram_poly_offset_back),\n                           dxbc::Src::kYYYY));\n    a_.OpEndIf();\n    // Apply the post-clip and post-viewport polygon offset to the fragment's\n    // depth. Not clamping yet as this is at the center, which is not\n    // necessarily covered and not necessarily inside the bounds - derivatives\n    // scaled by sample positions will be added to this value, and it must be\n    // linear.\n    // temp.x if early = ddx(z)\n    // temp.y if early = ddy(z)\n    // temp.z = biased depth in the center\n    in_position_used_ |= 0b0100;\n    a_.OpAdd(temp_z_dest, temp_z_src, in_position_z);\n  }\n\n  for (uint32_t i = 0; i < 4; ++i) {\n    // With early depth/stencil, depth/stencil writing may be deferred to the\n    // end of the shader to prevent writing in case something (like alpha test,\n    // which is dynamic GPU state) discards the pixel. So, write directly to the\n    // persistent register, system_temp_depth_stencil_, instead of a local\n    // temporary register.\n    dxbc::Dest sample_depth_stencil_dest(\n        depth_stencil_early ? dxbc::Dest::R(system_temp_depth_stencil_, 1 << i)\n                            : temp_w_dest);\n    dxbc::Src sample_depth_stencil_src(\n        depth_stencil_early ? dxbc::Src::R(system_temp_depth_stencil_).Select(i)\n                            : temp_w_src);\n\n    // Get if the current sample is covered.\n    // temp.x if no oDepth and early = ddx(z)\n    // temp.y if no oDepth and early = ddy(z)\n    // temp.z if no oDepth = biased depth in the center\n    // temp.w = coverage of the current sample\n    a_.OpAnd(temp_w_dest,\n             dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kXXXX),\n             dxbc::Src::LU(1 << i));\n    // Check if the current sample is covered.\n    // temp.x if no oDepth and early = ddx(z)\n    // temp.y if no oDepth and early = ddy(z)\n    // temp.z if no oDepth = biased depth in the center\n    // temp.w = free\n    a_.OpIf(true, temp_w_src);\n\n    uint32_t sample_temp = PushSystemTemp();\n    dxbc::Dest sample_temp_x_dest(dxbc::Dest::R(sample_temp, 0b0001));\n    dxbc::Src sample_temp_x_src(dxbc::Src::R(sample_temp, dxbc::Src::kXXXX));\n    dxbc::Dest sample_temp_y_dest(dxbc::Dest::R(sample_temp, 0b0010));\n    dxbc::Src sample_temp_y_src(dxbc::Src::R(sample_temp, dxbc::Src::kYYYY));\n    dxbc::Dest sample_temp_z_dest(dxbc::Dest::R(sample_temp, 0b0100));\n    dxbc::Src sample_temp_z_src(dxbc::Src::R(sample_temp, dxbc::Src::kZZZZ));\n    dxbc::Dest sample_temp_w_dest(dxbc::Dest::R(sample_temp, 0b1000));\n    dxbc::Src sample_temp_w_src(dxbc::Src::R(sample_temp, dxbc::Src::kWWWW));\n\n    if (shader_writes_depth) {\n      // Copy the 24-bit depth common to all samples to sample_depth_stencil.\n      // temp.w = shader-generated 24-bit depth\n      assert_false(depth_stencil_early);\n      a_.OpMov(sample_depth_stencil_dest,\n               dxbc::Src::R(system_temp_depth_stencil_, dxbc::Src::kXXXX));\n    } else {\n      // Adreno 200 doesn't have PA_SC_VPORT_ZMIN/ZMAX, so likely there's no\n      // need to clamp to the viewport depth bounds, just to 0...1 - thus only\n      // saturating in the end of the per-sample depth calculation.\n      switch (i) {\n        case 0:\n          // First sample - off-center for MSAA, in the center without it.\n          // Using ForcedSampleCount 4 for both 2x and 4x MSAA because\n          // ForcedSampleCount 2 is not supported on Nvidia, thus the position\n          // of the top-left sample (0 in Xenia) is always that of the top-left\n          // sample of host 4x MSAA.\n          // Calculate the depth in the sample 0 for 2x or 4x MSAA.\n          // temp.x if early = ddx(z)\n          // temp.y if early = ddy(z)\n          // temp.z = biased depth in the center\n          // temp.w if late = unsaturated sample 0 depth at 4x MSAA\n          a_.OpMAd(\n              sample_depth_stencil_dest, z_ddx_src,\n              dxbc::Src::LF(draw_util::kD3D10StandardSamplePositions4x[0][0] *\n                            (1.0f / 16.0f)),\n              temp_z_src);\n          a_.OpMAd(\n              sample_depth_stencil_dest, z_ddy_src,\n              dxbc::Src::LF(draw_util::kD3D10StandardSamplePositions4x[0][1] *\n                            (1.0f / 16.0f)),\n              sample_depth_stencil_src);\n          // Choose between the sample and the center depth depending on whether\n          // at least 2x MSAA is enabled and saturate.\n          // temp.x if early = ddx(z)\n          // temp.y if early = ddy(z)\n          // temp.z = biased depth in the center\n          // temp.w if late = sample 0 depth\n          a_.OpMovC(\n              sample_depth_stencil_dest,\n              LoadSystemConstant(SystemConstants::Index::kSampleCountLog2,\n                                 offsetof(SystemConstants, sample_count_log2),\n                                 dxbc::Src::kYYYY),\n              sample_depth_stencil_src, temp_z_src, true);\n          break;\n        case 1:\n          // - 2x MSAA: Bottom sample -> bottom-right (3) with Direct3D 11's\n          //   ForcedSampleCount 4.\n          // - 4x MSAA: Bottom-left Xenia sample -> Direct3D 11 sample 2.\n          // Check if 4x MSAA is used.\n          a_.OpIf(true, LoadSystemConstant(\n                            SystemConstants::Index::kSampleCountLog2,\n                            offsetof(SystemConstants, sample_count_log2),\n                            dxbc::Src::kXXXX));\n          // 4x MSAA.\n          // temp.x if early = ddx(z)\n          // temp.y if early = ddy(z)\n          // temp.z = biased depth in the center\n          // temp.w if late = saturated sample 1 depth at 4x MSAA\n          a_.OpMAd(\n              sample_depth_stencil_dest, z_ddx_src,\n              dxbc::Src::LF(draw_util::kD3D10StandardSamplePositions4x[2][0] *\n                            (1.0f / 16.0f)),\n              temp_z_src);\n          a_.OpMAd(\n              sample_depth_stencil_dest, z_ddy_src,\n              dxbc::Src::LF(draw_util::kD3D10StandardSamplePositions4x[2][1] *\n                            (1.0f / 16.0f)),\n              sample_depth_stencil_src, true);\n          a_.OpElse();\n          // 2x MSAA as ForcedSampleCount 4 on the host.\n          // temp.x if early = ddx(z)\n          // temp.y if early = ddy(z)\n          // temp.z = biased depth in the center\n          // temp.w if late = saturated sample 1 depth at 2x MSAA\n          a_.OpMAd(\n              sample_depth_stencil_dest, z_ddx_src,\n              dxbc::Src::LF(draw_util::kD3D10StandardSamplePositions4x[3][0] *\n                            (1.0f / 16.0f)),\n              temp_z_src);\n          a_.OpMAd(\n              sample_depth_stencil_dest, z_ddy_src,\n              dxbc::Src::LF(draw_util::kD3D10StandardSamplePositions4x[3][1] *\n                            (1.0f / 16.0f)),\n              sample_depth_stencil_src, true);\n          a_.OpEndIf();\n          break;\n        default: {\n          // Xenia samples 2 and 3 (top-right and bottom-right) -> Direct3D 11\n          // samples 1 and 3.\n          // temp.x if early = ddx(z)\n          // temp.y if early = ddy(z)\n          // temp.z = biased depth in the center\n          // temp.w if late = saturated sample 2 or 3 depth\n          const int8_t* sample_position =\n              draw_util::kD3D10StandardSamplePositions4x[i ^\n                                                         (((i & 1) ^ (i >> 1)) *\n                                                          0b11)];\n          a_.OpMAd(sample_depth_stencil_dest, z_ddx_src,\n                   dxbc::Src::LF(sample_position[0] * (1.0f / 16.0f)),\n                   temp_z_src);\n          a_.OpMAd(sample_depth_stencil_dest, z_ddy_src,\n                   dxbc::Src::LF(sample_position[1] * (1.0f / 16.0f)),\n                   sample_depth_stencil_src, true);\n        } break;\n      }\n      // Convert the sample's depth to 24-bit, using sample_temp.x as a\n      // temporary.\n      // temp.x if early = ddx(z)\n      // temp.y if early = ddy(z)\n      // temp.z = biased depth in the center\n      // temp.w if late = sample's 24-bit Z\n      ROV_DepthTo24Bit(sample_depth_stencil_src.index_1d_.index_,\n                       sample_depth_stencil_src.swizzle_ & 3,\n                       sample_depth_stencil_src.index_1d_.index_,\n                       sample_depth_stencil_src.swizzle_ & 3, sample_temp, 0);\n    }\n\n    // Load the old depth/stencil value.\n    // sample_temp.x = old depth/stencil\n    if (uav_index_edram_ == kBindingIndexUnallocated) {\n      uav_index_edram_ = uav_count_++;\n    }\n    a_.OpLdUAVTyped(\n        sample_temp_x_dest,\n        dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kYYYY), 1,\n        dxbc::Src::U(uav_index_edram_, uint32_t(UAVRegister::kEdram),\n                     dxbc::Src::kXXXX));\n\n    // Depth test.\n\n    // Extract the old depth part to sample_depth_stencil.\n    // sample_temp.x = old depth/stencil\n    // sample_temp.y = old depth\n    a_.OpUShR(sample_temp_y_dest, sample_temp_x_src, dxbc::Src::LU(8));\n    // Get the difference between the new and the old depth, > 0 - greater,\n    // == 0 - equal, < 0 - less.\n    // sample_temp.x = old depth/stencil\n    // sample_temp.y = old depth\n    // sample_temp.z = depth difference\n    a_.OpIAdd(sample_temp_z_dest, sample_depth_stencil_src, -sample_temp_y_src);\n    // Check if the depth is \"less\" or \"greater or equal\".\n    // sample_temp.x = old depth/stencil\n    // sample_temp.y = old depth\n    // sample_temp.z = depth difference\n    // sample_temp.w = depth difference less than 0\n    a_.OpILT(sample_temp_w_dest, sample_temp_z_src, dxbc::Src::LI(0));\n    // Choose the passed depth function bits for \"less\" or for \"greater\".\n    // sample_temp.x = old depth/stencil\n    // sample_temp.y = old depth\n    // sample_temp.z = depth difference\n    // sample_temp.w = depth function passed bits for \"less\" or \"greater\"\n    a_.OpMovC(sample_temp_w_dest, sample_temp_w_src,\n              dxbc::Src::LU(kSysFlag_ROVDepthPassIfLess),\n              dxbc::Src::LU(kSysFlag_ROVDepthPassIfGreater));\n    // Do the \"equal\" testing.\n    // sample_temp.x = old depth/stencil\n    // sample_temp.y = old depth\n    // sample_temp.z = depth function passed bits\n    // sample_temp.w = free\n    a_.OpMovC(sample_temp_z_dest, sample_temp_z_src, sample_temp_w_src,\n              dxbc::Src::LU(kSysFlag_ROVDepthPassIfEqual));\n    // Mask the resulting bits with the ones that should pass.\n    // sample_temp.x = old depth/stencil\n    // sample_temp.y = old depth\n    // sample_temp.z = masked depth function passed bits\n    a_.OpAnd(sample_temp_z_dest, sample_temp_z_src, LoadFlagsSystemConstant());\n    // Check if depth test has passed.\n    // sample_temp.x = old depth/stencil\n    // sample_temp.y = old depth\n    // sample_temp.z = free\n    a_.OpIf(true, sample_temp_z_src);\n    {\n      // Extract the depth write flag.\n      // sample_temp.x = old depth/stencil\n      // sample_temp.y = old depth\n      // sample_temp.z = depth write mask\n      a_.OpAnd(sample_temp_z_dest, LoadFlagsSystemConstant(),\n               dxbc::Src::LU(kSysFlag_ROVDepthWrite));\n      // If depth writing is disabled, don't change the depth.\n      // temp.x if no oDepth and early = ddx(z)\n      // temp.y if no oDepth and early = ddy(z)\n      // temp.z if no oDepth = biased depth in the center\n      // temp.w if late = resulting sample depth after the depth test\n      // sample_temp.x = old depth/stencil\n      // sample_temp.y = free\n      // sample_temp.z = free\n      a_.OpMovC(sample_depth_stencil_dest, sample_temp_z_src,\n                sample_depth_stencil_src, sample_temp_y_src);\n    }\n    // Depth test has failed.\n    a_.OpElse();\n    {\n      // Exclude the bit from the covered sample mask.\n      // sample_temp.x = old depth/stencil\n      // sample_temp.y = old depth\n      a_.OpAnd(dxbc::Dest::R(system_temp_rov_params_, 0b0001),\n               dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kXXXX),\n               dxbc::Src::LU(~uint32_t(1 << i)));\n    }\n    a_.OpEndIf();\n    // Create packed depth/stencil, with the stencil value unchanged at this\n    // point.\n    // temp.x if no oDepth and early = ddx(z)\n    // temp.y if no oDepth and early = ddy(z)\n    // temp.z if no oDepth = biased depth in the center\n    // temp.w if late = resulting sample depth, current resulting stencil\n    // sample_temp.x = old depth/stencil\n    a_.OpBFI(sample_depth_stencil_dest, dxbc::Src::LU(24), dxbc::Src::LU(8),\n             sample_depth_stencil_src, sample_temp_x_src);\n\n    // Stencil test.\n\n    // Extract the stencil test bit.\n    // sample_temp.x = old depth/stencil\n    // sample_temp.y = stencil test enabled\n    a_.OpAnd(sample_temp_y_dest, LoadFlagsSystemConstant(),\n             dxbc::Src::LU(kSysFlag_ROVStencilTest));\n    // Check if stencil test is enabled.\n    // sample_temp.x = old depth/stencil\n    // sample_temp.y = free\n    a_.OpIf(true, sample_temp_y_src);\n    {\n      // Check the current face to get the reference and apply the read mask.\n      in_front_face_used_ = true;\n      a_.OpIf(true, dxbc::Src::V1D(in_reg_ps_front_face_sample_index_,\n                                   dxbc::Src::kXXXX));\n      for (uint32_t j = 0; j < 2; ++j) {\n        if (j) {\n          // Go to the back face.\n          a_.OpElse();\n        }\n        dxbc::Src stencil_read_mask_src(LoadSystemConstant(\n            SystemConstants::Index::kEdramStencil,\n            j ? offsetof(SystemConstants, edram_stencil_back_read_mask)\n              : offsetof(SystemConstants, edram_stencil_front_read_mask),\n            dxbc::Src::kXXXX));\n        // Read-mask the stencil reference.\n        // sample_temp.x = old depth/stencil\n        // sample_temp.y = read-masked stencil reference\n        a_.OpAnd(\n            sample_temp_y_dest,\n            LoadSystemConstant(\n                SystemConstants::Index::kEdramStencil,\n                j ? offsetof(SystemConstants, edram_stencil_back_reference)\n                  : offsetof(SystemConstants, edram_stencil_front_reference),\n                dxbc::Src::kXXXX),\n            stencil_read_mask_src);\n        // Read-mask the old stencil value (also dropping the depth bits).\n        // sample_temp.x = old depth/stencil\n        // sample_temp.y = read-masked stencil reference\n        // sample_temp.z = read-masked old stencil\n        a_.OpAnd(sample_temp_z_dest, sample_temp_x_src, stencil_read_mask_src);\n      }\n      // Close the face check.\n      a_.OpEndIf();\n      // Get the difference between the stencil reference and the old stencil,\n      // > 0 - greater, == 0 - equal, < 0 - less.\n      // sample_temp.x = old depth/stencil\n      // sample_temp.y = stencil difference\n      // sample_temp.z = free\n      a_.OpIAdd(sample_temp_y_dest, sample_temp_y_src, -sample_temp_z_src);\n      // Check if the stencil is \"less\" or \"greater or equal\".\n      // sample_temp.x = old depth/stencil\n      // sample_temp.y = stencil difference\n      // sample_temp.z = stencil difference less than 0\n      a_.OpILT(sample_temp_z_dest, sample_temp_y_src, dxbc::Src::LI(0));\n      // Choose the passed depth function bits for \"less\" or for \"greater\".\n      // sample_temp.x = old depth/stencil\n      // sample_temp.y = stencil difference\n      // sample_temp.z = stencil function passed bits for \"less\" or \"greater\"\n      a_.OpMovC(sample_temp_z_dest, sample_temp_z_src,\n                dxbc::Src::LU(uint32_t(xenos::CompareFunction::kLess)),\n                dxbc::Src::LU(uint32_t(xenos::CompareFunction::kGreater)));\n      // Do the \"equal\" testing.\n      // sample_temp.x = old depth/stencil\n      // sample_temp.y = stencil function passed bits\n      // sample_temp.z = free\n      a_.OpMovC(sample_temp_y_dest, sample_temp_y_src, sample_temp_z_src,\n                dxbc::Src::LU(uint32_t(xenos::CompareFunction::kEqual)));\n      // Get the comparison function and the operations for the current face.\n      // sample_temp.x = old depth/stencil\n      // sample_temp.y = stencil function passed bits\n      // sample_temp.z = stencil function and operations\n      in_front_face_used_ = true;\n      a_.OpMovC(\n          sample_temp_z_dest,\n          dxbc::Src::V1D(in_reg_ps_front_face_sample_index_, dxbc::Src::kXXXX),\n          LoadSystemConstant(\n              SystemConstants::Index::kEdramStencil,\n              offsetof(SystemConstants, edram_stencil_front_func_ops),\n              dxbc::Src::kXXXX),\n          LoadSystemConstant(\n              SystemConstants::Index::kEdramStencil,\n              offsetof(SystemConstants, edram_stencil_back_func_ops),\n              dxbc::Src::kXXXX));\n      // Mask the resulting bits with the ones that should pass (the comparison\n      // function is in the low 3 bits of the constant, and only ANDing 3-bit\n      // values with it, so safe not to UBFE the function).\n      // sample_temp.x = old depth/stencil\n      // sample_temp.y = stencil test result\n      // sample_temp.z = stencil function and operations\n      a_.OpAnd(sample_temp_y_dest, sample_temp_y_src, sample_temp_z_src);\n      // Handle passing and failure of the stencil test, to choose the operation\n      // and to discard the sample.\n      // sample_temp.x = old depth/stencil\n      // sample_temp.y = free\n      // sample_temp.z = stencil function and operations\n      a_.OpIf(true, sample_temp_y_src);\n      {\n        // Check if depth test has passed for this sample (the sample will only\n        // be processed if it's covered, so the only thing that could unset the\n        // bit at this point that matters is the depth test).\n        // sample_temp.x = old depth/stencil\n        // sample_temp.y = depth test result\n        // sample_temp.z = stencil function and operations\n        a_.OpAnd(sample_temp_y_dest,\n                 dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kXXXX),\n                 dxbc::Src::LU(1 << i));\n        // Choose the bit offset of the stencil operation.\n        // sample_temp.x = old depth/stencil\n        // sample_temp.y = sample operation offset\n        // sample_temp.z = stencil function and operations\n        a_.OpMovC(sample_temp_y_dest, sample_temp_y_src, dxbc::Src::LU(6),\n                  dxbc::Src::LU(9));\n        // Extract the stencil operation.\n        // sample_temp.x = old depth/stencil\n        // sample_temp.y = stencil operation\n        // sample_temp.z = free\n        a_.OpUBFE(sample_temp_y_dest, dxbc::Src::LU(3), sample_temp_y_src,\n                  sample_temp_z_src);\n      }\n      // Stencil test has failed.\n      a_.OpElse();\n      {\n        // Extract the stencil fail operation.\n        // sample_temp.x = old depth/stencil\n        // sample_temp.y = stencil operation\n        // sample_temp.z = free\n        a_.OpUBFE(sample_temp_y_dest, dxbc::Src::LU(3), dxbc::Src::LU(3),\n                  sample_temp_z_src);\n        // Exclude the bit from the covered sample mask.\n        // sample_temp.x = old depth/stencil\n        // sample_temp.y = stencil operation\n        a_.OpAnd(dxbc::Dest::R(system_temp_rov_params_, 0b0001),\n                 dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kXXXX),\n                 dxbc::Src::LU(~uint32_t(1 << i)));\n      }\n      // Close the stencil pass check.\n      a_.OpEndIf();\n\n      // Open the stencil operation switch for writing the new stencil (not\n      // caring about bits 8:31).\n      // sample_temp.x = old depth/stencil\n      // sample_temp.y = will contain unmasked new stencil in 0:7 and junk above\n      a_.OpSwitch(sample_temp_y_src);\n      {\n        // Zero.\n        a_.OpCase(dxbc::Src::LU(uint32_t(xenos::StencilOp::kZero)));\n        a_.OpMov(sample_temp_y_dest, dxbc::Src::LU(0));\n        a_.OpBreak();\n        // Replace.\n        a_.OpCase(dxbc::Src::LU(uint32_t(xenos::StencilOp::kReplace)));\n        in_front_face_used_ = true;\n        a_.OpMovC(sample_temp_y_dest,\n                  dxbc::Src::V1D(in_reg_ps_front_face_sample_index_,\n                                 dxbc::Src::kXXXX),\n                  LoadSystemConstant(\n                      SystemConstants::Index::kEdramStencil,\n                      offsetof(SystemConstants, edram_stencil_front_reference),\n                      dxbc::Src::kXXXX),\n                  LoadSystemConstant(\n                      SystemConstants::Index::kEdramStencil,\n                      offsetof(SystemConstants, edram_stencil_back_reference),\n                      dxbc::Src::kXXXX));\n        a_.OpBreak();\n        // Increment and clamp.\n        a_.OpCase(dxbc::Src::LU(uint32_t(xenos::StencilOp::kIncrementClamp)));\n        {\n          // Clear the upper bits for saturation.\n          a_.OpAnd(sample_temp_y_dest, sample_temp_x_src,\n                   dxbc::Src::LU(UINT8_MAX));\n          // Increment.\n          a_.OpIAdd(sample_temp_y_dest, sample_temp_y_src, dxbc::Src::LI(1));\n          // Clamp.\n          a_.OpIMin(sample_temp_y_dest, sample_temp_y_src,\n                    dxbc::Src::LI(UINT8_MAX));\n        }\n        a_.OpBreak();\n        // Decrement and clamp.\n        a_.OpCase(dxbc::Src::LU(uint32_t(xenos::StencilOp::kDecrementClamp)));\n        {\n          // Clear the upper bits for saturation.\n          a_.OpAnd(sample_temp_y_dest, sample_temp_x_src,\n                   dxbc::Src::LU(UINT8_MAX));\n          // Increment.\n          a_.OpIAdd(sample_temp_y_dest, sample_temp_y_src, dxbc::Src::LI(-1));\n          // Clamp.\n          a_.OpIMax(sample_temp_y_dest, sample_temp_y_src, dxbc::Src::LI(0));\n        }\n        a_.OpBreak();\n        // Invert.\n        a_.OpCase(dxbc::Src::LU(uint32_t(xenos::StencilOp::kInvert)));\n        a_.OpNot(sample_temp_y_dest, sample_temp_x_src);\n        a_.OpBreak();\n        // Increment and wrap.\n        a_.OpCase(dxbc::Src::LU(uint32_t(xenos::StencilOp::kIncrementWrap)));\n        a_.OpIAdd(sample_temp_y_dest, sample_temp_x_src, dxbc::Src::LI(1));\n        a_.OpBreak();\n        // Decrement and wrap.\n        a_.OpCase(dxbc::Src::LU(uint32_t(xenos::StencilOp::kDecrementWrap)));\n        a_.OpIAdd(sample_temp_y_dest, sample_temp_x_src, dxbc::Src::LI(-1));\n        a_.OpBreak();\n        // Keep.\n        a_.OpDefault();\n        a_.OpMov(sample_temp_y_dest, sample_temp_x_src);\n        a_.OpBreak();\n      }\n      // Close the new stencil switch.\n      a_.OpEndSwitch();\n\n      // Select the stencil write mask for the face.\n      // sample_temp.x = old depth/stencil\n      // sample_temp.y = unmasked new stencil in 0:7 and junk above\n      // sample_temp.z = stencil write mask\n      in_front_face_used_ = true;\n      a_.OpMovC(\n          sample_temp_z_dest,\n          dxbc::Src::V1D(in_reg_ps_front_face_sample_index_, dxbc::Src::kXXXX),\n          LoadSystemConstant(\n              SystemConstants::Index::kEdramStencil,\n              offsetof(SystemConstants, edram_stencil_front_write_mask),\n              dxbc::Src::kXXXX),\n          LoadSystemConstant(\n              SystemConstants::Index::kEdramStencil,\n              offsetof(SystemConstants, edram_stencil_back_write_mask),\n              dxbc::Src::kXXXX));\n      // Apply the write mask to the new stencil, also dropping the upper 24\n      // bits.\n      // sample_temp.x = old depth/stencil\n      // sample_temp.y = masked new stencil\n      // sample_temp.z = stencil write mask\n      a_.OpAnd(sample_temp_y_dest, sample_temp_y_src, sample_temp_z_src);\n      // Invert the write mask for keeping the old stencil and the depth bits.\n      // sample_temp.x = old depth/stencil\n      // sample_temp.y = masked new stencil\n      // sample_temp.z = inverted stencil write mask\n      a_.OpNot(sample_temp_z_dest, sample_temp_z_src);\n      // Remove the bits that will be replaced from the combined depth/stencil\n      // before inserting their new values.\n      // sample_temp.x = old depth/stencil\n      // sample_temp.y = masked new stencil\n      // sample_temp.z = free\n      // temp.x if no oDepth and early = ddx(z)\n      // temp.y if no oDepth and early = ddy(z)\n      // temp.z if no oDepth = biased depth in the center\n      // temp.w if late = resulting sample depth, inverse-write-masked old\n      //                  stencil\n      a_.OpAnd(sample_depth_stencil_dest, sample_depth_stencil_src,\n               sample_temp_z_src);\n      // Merge the old and the new stencil.\n      // temp.x if no oDepth and early = ddx(z)\n      // temp.y if no oDepth and early = ddy(z)\n      // temp.z if no oDepth = biased depth in the center\n      // temp.w if late = resulting sample depth/stencil\n      // sample_temp.x = old depth/stencil\n      // sample_temp.y = free\n      a_.OpOr(sample_depth_stencil_dest, sample_depth_stencil_src,\n              sample_temp_y_src);\n    }\n    // Close the stencil test check.\n    a_.OpEndIf();\n\n    // Check if the depth/stencil has failed not to modify the depth if it has.\n    // sample_temp.x = old depth/stencil\n    // sample_temp.y = whether depth/stencil has passed for this sample\n    a_.OpAnd(sample_temp_y_dest,\n             dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kXXXX),\n             dxbc::Src::LU(1 << i));\n    // If the depth/stencil test has failed, don't change the depth.\n    // sample_temp.x = old depth/stencil\n    // sample_temp.y = free\n    a_.OpIf(false, sample_temp_y_src);\n    {\n      // Copy the new stencil over the old depth.\n      // temp.x if no oDepth and early = ddx(z)\n      // temp.y if no oDepth and early = ddy(z)\n      // temp.z if no oDepth = biased depth in the center\n      // temp.w if late = resulting sample depth/stencil\n      a_.OpBFI(sample_depth_stencil_dest, dxbc::Src::LU(8), dxbc::Src::LU(0),\n               sample_depth_stencil_src, sample_temp_x_src);\n    }\n    // Close the depth/stencil passing check.\n    a_.OpEndIf();\n    // Check if the new depth/stencil is different, and thus needs to be\n    // written.\n    // sample_temp.x = old depth/stencil\n    a_.OpINE(sample_temp_x_dest, sample_depth_stencil_src, sample_temp_x_src);\n    if (depth_stencil_early &&\n        !current_shader().implicit_early_z_write_allowed()) {\n      // Set the sample bit in bits 4:7 of system_temp_rov_params_.x - always\n      // need to write late in this shader, as it may do something like\n      // explicitly killing pixels.\n      a_.OpBFI(dxbc::Dest::R(system_temp_rov_params_, 0b0001), dxbc::Src::LU(1),\n               dxbc::Src::LU(4 + i), sample_temp_x_src,\n               dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kXXXX));\n    } else {\n      // Check if need to write.\n      // sample_temp.x = free\n      a_.OpIf(true, sample_temp_x_src);\n      {\n        if (depth_stencil_early) {\n          // Get if early depth/stencil write is enabled.\n          // sample_temp.x = whether early depth/stencil write is enabled\n          a_.OpAnd(sample_temp_x_dest, LoadFlagsSystemConstant(),\n                   dxbc::Src::LU(kSysFlag_ROVDepthStencilEarlyWrite));\n          // Check if need to write early.\n          // sample_temp.x = free\n          a_.OpIf(true, sample_temp_x_src);\n        }\n        // Write the new depth/stencil.\n        if (uav_index_edram_ == kBindingIndexUnallocated) {\n          uav_index_edram_ = uav_count_++;\n        }\n        a_.OpStoreUAVTyped(\n            dxbc::Dest::U(uav_index_edram_, uint32_t(UAVRegister::kEdram)),\n            dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kYYYY), 1,\n            sample_depth_stencil_src);\n        if (depth_stencil_early) {\n          // Need to still run the shader to know whether to write the\n          // depth/stencil value.\n          a_.OpElse();\n          // Set the sample bit in bits 4:7 of system_temp_rov_params_.x if need\n          // to write later (after checking if the sample is not discarded by a\n          // kill instruction, alphatest or alpha-to-coverage).\n          a_.OpOr(dxbc::Dest::R(system_temp_rov_params_, 0b0001),\n                  dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kXXXX),\n                  dxbc::Src::LU(1 << (4 + i)));\n          // Close the early depth/stencil check.\n          a_.OpEndIf();\n        }\n      }\n      // Close the write check.\n      a_.OpEndIf();\n    }\n\n    // Release sample_temp.\n    PopSystemTemp();\n\n    // Close the sample conditional.\n    a_.OpEndIf();\n\n    // Go to the next sample (samples are at +0, +(80*scale_x), +1,\n    // +(80*scale_x+1), so need to do +(80*scale_x), -(80*scale_x-1),\n    // +(80*scale_x) and -(80*scale_x+1) after each sample).\n    uint32_t tile_width =\n        xenos::kEdramTileWidthSamples * draw_resolution_scale_x_;\n    a_.OpIAdd(dxbc::Dest::R(system_temp_rov_params_, 0b0010),\n              dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kYYYY),\n              dxbc::Src::LI((i & 1) ? -int32_t(tile_width) + 2 - i\n                                    : int32_t(tile_width)));\n  }\n\n  if (ROV_IsDepthStencilEarly()) {\n    // Check if safe to discard the whole 2x2 quad early, without running the\n    // translated pixel shader, by checking if coverage is 0 in all pixels in\n    // the quad and if there are no samples which failed the depth test, but\n    // where stencil was modified and needs to be written in the end. Must\n    // reject at 2x2 quad granularity because texture fetches need derivatives.\n\n    // temp.x = coverage | deferred depth/stencil write\n    a_.OpAnd(dxbc::Dest::R(temp, 0b0001),\n             dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kXXXX),\n             dxbc::Src::LU(0b11111111));\n    // temp.x = 1.0 if any sample is covered or potentially needs stencil write\n    // in the end of the shader in the current pixel\n    a_.OpMovC(dxbc::Dest::R(temp, 0b0001), dxbc::Src::R(temp, dxbc::Src::kXXXX),\n              dxbc::Src::LF(1.0f), dxbc::Src::LF(0.0f));\n    // temp.x = 1.0 if any sample is covered or potentially needs stencil write\n    // in the end of the shader in the current pixel\n    // temp.y = non-zero if anything is covered in the pixel across X\n    a_.OpDerivRTXFine(dxbc::Dest::R(temp, 0b0010),\n                      dxbc::Src::R(temp, dxbc::Src::kXXXX));\n    // temp.x = 1.0 if anything is covered in the current half of the quad\n    // temp.y = free\n    a_.OpMovC(dxbc::Dest::R(temp, 0b0001), dxbc::Src::R(temp, dxbc::Src::kYYYY),\n              dxbc::Src::LF(1.0f), dxbc::Src::R(temp, dxbc::Src::kXXXX));\n    // temp.x = 1.0 if anything is covered in the current half of the quad\n    // temp.y = non-zero if anything is covered in the two pixels across Y\n    a_.OpDerivRTYCoarse(dxbc::Dest::R(temp, 0b0010),\n                        dxbc::Src::R(temp, dxbc::Src::kXXXX));\n    // temp.x = 1.0 if anything is covered in the current whole quad\n    // temp.y = free\n    a_.OpMovC(dxbc::Dest::R(temp, 0b0001), dxbc::Src::R(temp, dxbc::Src::kYYYY),\n              dxbc::Src::LF(1.0f), dxbc::Src::R(temp, dxbc::Src::kXXXX));\n    // End the shader if nothing is covered in the 2x2 quad after early\n    // depth/stencil.\n    // temp.x = free\n    a_.OpRetC(false, dxbc::Src::R(temp, dxbc::Src::kXXXX));\n  }\n\n  // Close the large depth/stencil conditional.\n  a_.OpEndIf();\n\n  // Release temp.\n  PopSystemTemp();\n}\n\nvoid DxbcShaderTranslator::ROV_UnpackColor(\n    uint32_t rt_index, uint32_t packed_temp, uint32_t packed_temp_components,\n    uint32_t color_temp, uint32_t temp1, uint32_t temp1_component,\n    uint32_t temp2, uint32_t temp2_component) {\n  assert_true(color_temp != packed_temp || packed_temp_components == 0);\n\n  dxbc::Src packed_temp_low(\n      dxbc::Src::R(packed_temp).Select(packed_temp_components));\n  dxbc::Dest temp1_dest(dxbc::Dest::R(temp1, 1 << temp1_component));\n  dxbc::Src temp1_src(dxbc::Src::R(temp1).Select(temp1_component));\n  dxbc::Dest temp2_dest(dxbc::Dest::R(temp2, 1 << temp2_component));\n  dxbc::Src temp2_src(dxbc::Src::R(temp2).Select(temp2_component));\n\n  // Break register dependencies and initialize if there are not enough\n  // components. The rest of the function will write at least RG (k_32_FLOAT and\n  // k_32_32_FLOAT handled with the same default label), and if packed_temp is\n  // the same as color_temp, the packed color won't be touched.\n  a_.OpMov(dxbc::Dest::R(color_temp, 0b1100),\n           dxbc::Src::LF(0.0f, 0.0f, 0.0f, 1.0f));\n\n  // Choose the packing based on the render target's format.\n  a_.OpSwitch(\n      LoadSystemConstant(SystemConstants::Index::kEdramRTFormatFlags,\n                         offsetof(SystemConstants, edram_rt_format_flags) +\n                             sizeof(uint32_t) * rt_index,\n                         dxbc::Src::kXXXX));\n\n  // ***************************************************************************\n  // k_8_8_8_8\n  // k_8_8_8_8_GAMMA\n  // ***************************************************************************\n  for (uint32_t i = 0; i < 2; ++i) {\n    a_.OpCase(dxbc::Src::LU(RenderTargetCache::AddPSIColorFormatFlags(\n        i ? xenos::ColorRenderTargetFormat::k_8_8_8_8_GAMMA\n          : xenos::ColorRenderTargetFormat::k_8_8_8_8)));\n    // Unpack the components.\n    a_.OpUBFE(dxbc::Dest::R(color_temp), dxbc::Src::LU(8),\n              dxbc::Src::LU(0, 8, 16, 24), packed_temp_low);\n    // Convert from fixed-point.\n    a_.OpUToF(dxbc::Dest::R(color_temp), dxbc::Src::R(color_temp));\n    // Normalize.\n    a_.OpMul(dxbc::Dest::R(color_temp), dxbc::Src::R(color_temp),\n             dxbc::Src::LF(1.0f / 255.0f));\n    if (i) {\n      for (uint32_t j = 0; j < 3; ++j) {\n        PWLGammaToLinear(a_, color_temp, j, color_temp, j, true, temp1,\n                         temp1_component, temp2, temp2_component);\n      }\n    }\n    a_.OpBreak();\n  }\n\n  // ***************************************************************************\n  // k_2_10_10_10\n  // k_2_10_10_10_AS_10_10_10_10\n  // ***************************************************************************\n  a_.OpCase(dxbc::Src::LU(RenderTargetCache::AddPSIColorFormatFlags(\n      xenos::ColorRenderTargetFormat::k_2_10_10_10)));\n  a_.OpCase(dxbc::Src::LU(RenderTargetCache::AddPSIColorFormatFlags(\n      xenos::ColorRenderTargetFormat::k_2_10_10_10_AS_10_10_10_10)));\n  {\n    // Unpack the components.\n    a_.OpUBFE(dxbc::Dest::R(color_temp), dxbc::Src::LU(10, 10, 10, 2),\n              dxbc::Src::LU(0, 10, 20, 30), packed_temp_low);\n    // Convert from fixed-point.\n    a_.OpUToF(dxbc::Dest::R(color_temp), dxbc::Src::R(color_temp));\n    // Normalize.\n    a_.OpMul(dxbc::Dest::R(color_temp), dxbc::Src::R(color_temp),\n             dxbc::Src::LF(1.0f / 1023.0f, 1.0f / 1023.0f, 1.0f / 1023.0f,\n                           1.0f / 3.0f));\n  }\n  a_.OpBreak();\n\n  // ***************************************************************************\n  // k_2_10_10_10_FLOAT\n  // k_2_10_10_10_FLOAT_AS_16_16_16_16\n  // https://github.com/Microsoft/DirectXTex/blob/master/DirectXTex/DirectXTexConvert.cpp\n  // ***************************************************************************\n  a_.OpCase(dxbc::Src::LU(RenderTargetCache::AddPSIColorFormatFlags(\n      xenos::ColorRenderTargetFormat::k_2_10_10_10_FLOAT)));\n  a_.OpCase(dxbc::Src::LU(RenderTargetCache::AddPSIColorFormatFlags(\n      xenos::ColorRenderTargetFormat::k_2_10_10_10_FLOAT_AS_16_16_16_16)));\n  {\n    // Unpack the alpha.\n    a_.OpUBFE(dxbc::Dest::R(color_temp, 0b1000), dxbc::Src::LU(2),\n              dxbc::Src::LU(30), packed_temp_low);\n    // Convert the alpha from fixed-point.\n    a_.OpUToF(dxbc::Dest::R(color_temp, 0b1000),\n              dxbc::Src::R(color_temp, dxbc::Src::kWWWW));\n    // Normalize the alpha.\n    a_.OpMul(dxbc::Dest::R(color_temp, 0b1000),\n             dxbc::Src::R(color_temp, dxbc::Src::kWWWW),\n             dxbc::Src::LF(1.0f / 3.0f));\n    // Process the components in reverse order because color_temp.r stores the\n    // packed color which shouldn't be touched until G and B are converted if\n    // packed_temp and color_temp are the same.\n    for (int32_t i = 2; i >= 0; --i) {\n      Float7e3To32(a_, dxbc::Dest::R(color_temp, 1 << i), packed_temp,\n                   packed_temp_components, i * 10, color_temp, i, temp1,\n                   temp1_component);\n    }\n  }\n  a_.OpBreak();\n\n  // ***************************************************************************\n  // k_16_16\n  // k_16_16_16_16 (64bpp)\n  // ***************************************************************************\n  for (uint32_t i = 0; i < 2; ++i) {\n    a_.OpCase(dxbc::Src::LU(RenderTargetCache::AddPSIColorFormatFlags(\n        i ? xenos::ColorRenderTargetFormat::k_16_16_16_16\n          : xenos::ColorRenderTargetFormat::k_16_16)));\n    dxbc::Dest color_components_dest(\n        dxbc::Dest::R(color_temp, i ? 0b1111 : 0b0011));\n    // Unpack the components.\n    a_.OpIBFE(color_components_dest, dxbc::Src::LU(16),\n              dxbc::Src::LU(0, 16, 0, 16),\n              dxbc::Src::R(packed_temp,\n                           0b01010000 + packed_temp_components * 0b01010101));\n    // Convert from fixed-point.\n    a_.OpIToF(color_components_dest, dxbc::Src::R(color_temp));\n    // Normalize.\n    a_.OpMul(color_components_dest, dxbc::Src::R(color_temp),\n             dxbc::Src::LF(32.0f / 32767.0f));\n    a_.OpBreak();\n  }\n\n  // ***************************************************************************\n  // k_16_16_FLOAT\n  // k_16_16_16_16_FLOAT (64bpp)\n  // ***************************************************************************\n  for (uint32_t i = 0; i < 2; ++i) {\n    a_.OpCase(dxbc::Src::LU(RenderTargetCache::AddPSIColorFormatFlags(\n        i ? xenos::ColorRenderTargetFormat::k_16_16_16_16_FLOAT\n          : xenos::ColorRenderTargetFormat::k_16_16_FLOAT)));\n    dxbc::Dest color_components_dest(\n        dxbc::Dest::R(color_temp, i ? 0b1111 : 0b0011));\n    // Unpack the components.\n    a_.OpUBFE(color_components_dest, dxbc::Src::LU(16),\n              dxbc::Src::LU(0, 16, 0, 16),\n              dxbc::Src::R(packed_temp,\n                           0b01010000 + packed_temp_components * 0b01010101));\n    // Convert from 16-bit float.\n    a_.OpF16ToF32(color_components_dest, dxbc::Src::R(color_temp));\n    a_.OpBreak();\n  }\n\n  if (packed_temp != color_temp) {\n    // Assume k_32_FLOAT or k_32_32_FLOAT for the rest.\n    a_.OpDefault();\n    a_.OpMov(\n        dxbc::Dest::R(color_temp, 0b0011),\n        dxbc::Src::R(packed_temp, 0b0100 + packed_temp_components * 0b0101));\n    a_.OpBreak();\n  }\n\n  a_.OpEndSwitch();\n}\n\nvoid DxbcShaderTranslator::ROV_PackPreClampedColor(\n    uint32_t rt_index, uint32_t color_temp, uint32_t packed_temp,\n    uint32_t packed_temp_components, uint32_t temp1, uint32_t temp1_component,\n    uint32_t temp2, uint32_t temp2_component) {\n  // Packing normalized formats according to the Direct3D 11.3 functional\n  // specification, but assuming clamping was done by the caller.\n\n  assert_true(color_temp != packed_temp || packed_temp_components == 0);\n\n  dxbc::Dest packed_dest_low(\n      dxbc::Dest::R(packed_temp, 1 << packed_temp_components));\n  dxbc::Src packed_src_low(\n      dxbc::Src::R(packed_temp).Select(packed_temp_components));\n  dxbc::Dest temp1_dest(dxbc::Dest::R(temp1, 1 << temp1_component));\n  dxbc::Src temp1_src(dxbc::Src::R(temp1).Select(temp1_component));\n  dxbc::Dest temp2_dest(dxbc::Dest::R(temp2, 1 << temp2_component));\n  dxbc::Src temp2_src(dxbc::Src::R(temp2).Select(temp2_component));\n\n  // Break register dependency after 32bpp cases.\n  a_.OpMov(dxbc::Dest::R(packed_temp, 1 << (packed_temp_components + 1)),\n           dxbc::Src::LU(0));\n\n  // Choose the packing based on the render target's format.\n  a_.OpSwitch(\n      LoadSystemConstant(SystemConstants::Index::kEdramRTFormatFlags,\n                         offsetof(SystemConstants, edram_rt_format_flags) +\n                             sizeof(uint32_t) * rt_index,\n                         dxbc::Src::kXXXX));\n\n  // ***************************************************************************\n  // k_8_8_8_8\n  // k_8_8_8_8_GAMMA\n  // ***************************************************************************\n  for (uint32_t i = 0; i < 2; ++i) {\n    a_.OpCase(dxbc::Src::LU(RenderTargetCache::AddPSIColorFormatFlags(\n        i ? xenos::ColorRenderTargetFormat::k_8_8_8_8_GAMMA\n          : xenos::ColorRenderTargetFormat::k_8_8_8_8)));\n    for (uint32_t j = 0; j < 4; ++j) {\n      if (i && j < 3) {\n        PreSaturatedLinearToPWLGamma(a_, temp1, temp1_component, color_temp, j,\n                                     temp1, temp1_component, temp2,\n                                     temp2_component);\n        // Denormalize and add 0.5 for rounding.\n        a_.OpMAd(temp1_dest, temp1_src, dxbc::Src::LF(255.0f),\n                 dxbc::Src::LF(0.5f));\n      } else {\n        // Denormalize and add 0.5 for rounding.\n        a_.OpMAd(temp1_dest, dxbc::Src::R(color_temp).Select(j),\n                 dxbc::Src::LF(255.0f), dxbc::Src::LF(0.5f));\n      }\n      // Convert to fixed-point.\n      a_.OpFToU(j ? temp1_dest : packed_dest_low, temp1_src);\n      // Pack the upper components.\n      if (j) {\n        a_.OpBFI(packed_dest_low, dxbc::Src::LU(8), dxbc::Src::LU(j * 8),\n                 temp1_src, packed_src_low);\n      }\n    }\n    a_.OpBreak();\n  }\n\n  // ***************************************************************************\n  // k_2_10_10_10\n  // k_2_10_10_10_AS_10_10_10_10\n  // ***************************************************************************\n  a_.OpCase(dxbc::Src::LU(RenderTargetCache::AddPSIColorFormatFlags(\n      xenos::ColorRenderTargetFormat::k_2_10_10_10)));\n  a_.OpCase(dxbc::Src::LU(RenderTargetCache::AddPSIColorFormatFlags(\n      xenos::ColorRenderTargetFormat::k_2_10_10_10_AS_10_10_10_10)));\n  for (uint32_t i = 0; i < 4; ++i) {\n    // Denormalize and convert to fixed-point.\n    a_.OpMAd(temp1_dest, dxbc::Src::R(color_temp).Select(i),\n             dxbc::Src::LF(i < 3 ? 1023.0f : 3.0f), dxbc::Src::LF(0.5f));\n    a_.OpFToU(i ? temp1_dest : packed_dest_low, temp1_src);\n    // Pack the upper components.\n    if (i) {\n      a_.OpBFI(packed_dest_low, dxbc::Src::LU(i < 3 ? 10 : 2),\n               dxbc::Src::LU(i * 10), temp1_src, packed_src_low);\n    }\n  }\n  a_.OpBreak();\n\n  // ***************************************************************************\n  // k_2_10_10_10_FLOAT\n  // k_2_10_10_10_FLOAT_AS_16_16_16_16\n  // https://github.com/Microsoft/DirectXTex/blob/master/DirectXTex/DirectXTexConvert.cpp\n  // ***************************************************************************\n  a_.OpCase(dxbc::Src::LU(RenderTargetCache::AddPSIColorFormatFlags(\n      xenos::ColorRenderTargetFormat::k_2_10_10_10_FLOAT)));\n  a_.OpCase(dxbc::Src::LU(RenderTargetCache::AddPSIColorFormatFlags(\n      xenos::ColorRenderTargetFormat::k_2_10_10_10_FLOAT_AS_16_16_16_16)));\n  {\n    // Convert red directly to the destination, which may be the same as the\n    // source, but PreClampedFloat32To7e3 allows that.\n    PreClampedFloat32To7e3(a_, packed_temp, packed_temp_components, color_temp,\n                           0, temp1, temp1_component);\n    for (uint32_t i = 1; i < 3; ++i) {\n      // Convert green and blue to a temporary register and insert them into the\n      // result.\n      PreClampedFloat32To7e3(a_, temp1, temp1_component, color_temp, i, temp2,\n                             temp2_component);\n      a_.OpBFI(packed_dest_low, dxbc::Src::LU(10), dxbc::Src::LU(i * 10),\n               temp1_src, packed_src_low);\n    }\n    // Denormalize the alpha and convert it to fixed-point.\n    a_.OpMAd(temp1_dest, dxbc::Src::R(color_temp, dxbc::Src::kWWWW),\n             dxbc::Src::LF(3.0f), dxbc::Src::LF(0.5f));\n    a_.OpFToU(temp1_dest, temp1_src);\n    // Pack the alpha.\n    a_.OpBFI(packed_dest_low, dxbc::Src::LU(2), dxbc::Src::LU(30), temp1_src,\n             packed_src_low);\n  }\n  a_.OpBreak();\n\n  // ***************************************************************************\n  // k_16_16\n  // k_16_16_16_16 (64bpp)\n  // ***************************************************************************\n  for (uint32_t i = 0; i < 2; ++i) {\n    a_.OpCase(dxbc::Src::LU(RenderTargetCache::AddPSIColorFormatFlags(\n        i ? xenos::ColorRenderTargetFormat::k_16_16_16_16\n          : xenos::ColorRenderTargetFormat::k_16_16)));\n    for (uint32_t j = 0; j < (uint32_t(2) << i); ++j) {\n      // Denormalize and convert to fixed-point, making 0.5 with the proper sign\n      // in temp2.\n      a_.OpGE(temp2_dest, dxbc::Src::R(color_temp).Select(j),\n              dxbc::Src::LF(0.0f));\n      a_.OpMovC(temp2_dest, temp2_src, dxbc::Src::LF(0.5f),\n                dxbc::Src::LF(-0.5f));\n      a_.OpMAd(temp1_dest, dxbc::Src::R(color_temp).Select(j),\n               dxbc::Src::LF(32767.0f / 32.0f), temp2_src);\n      dxbc::Dest packed_dest_half(\n          dxbc::Dest::R(packed_temp, 1 << (packed_temp_components + (j >> 1))));\n      // Convert to fixed-point.\n      a_.OpFToI((j & 1) ? temp1_dest : packed_dest_half, temp1_src);\n      // Pack green or alpha.\n      if (j & 1) {\n        a_.OpBFI(packed_dest_half, dxbc::Src::LU(16), dxbc::Src::LU(16),\n                 temp1_src,\n                 dxbc::Src::R(packed_temp)\n                     .Select(packed_temp_components + (j >> 1)));\n      }\n    }\n    a_.OpBreak();\n  }\n\n  // ***************************************************************************\n  // k_16_16_FLOAT\n  // k_16_16_16_16_FLOAT (64bpp)\n  // ***************************************************************************\n  for (uint32_t i = 0; i < 2; ++i) {\n    a_.OpCase(dxbc::Src::LU(RenderTargetCache::AddPSIColorFormatFlags(\n        i ? xenos::ColorRenderTargetFormat::k_16_16_16_16_FLOAT\n          : xenos::ColorRenderTargetFormat::k_16_16_FLOAT)));\n    for (uint32_t j = 0; j < (uint32_t(2) << i); ++j) {\n      dxbc::Dest packed_dest_half(\n          dxbc::Dest::R(packed_temp, 1 << (packed_temp_components + (j >> 1))));\n      // Convert to 16-bit float.\n      a_.OpF32ToF16((j & 1) ? temp1_dest : packed_dest_half,\n                    dxbc::Src::R(color_temp).Select(j));\n      // Pack green or alpha.\n      if (j & 1) {\n        a_.OpBFI(packed_dest_half, dxbc::Src::LU(16), dxbc::Src::LU(16),\n                 temp1_src,\n                 dxbc::Src::R(packed_temp)\n                     .Select(packed_temp_components + (j >> 1)));\n      }\n    }\n    a_.OpBreak();\n  }\n\n  if (packed_temp != color_temp) {\n    // Assume k_32_FLOAT or k_32_32_FLOAT for the rest.\n    a_.OpDefault();\n    a_.OpMov(dxbc::Dest::R(packed_temp, 0b11 << packed_temp_components),\n             dxbc::Src::R(color_temp, 0b0100 << (packed_temp_components * 2)));\n    a_.OpBreak();\n  }\n\n  a_.OpEndSwitch();\n}\n\nvoid DxbcShaderTranslator::ROV_HandleColorBlendFactorCases(\n    uint32_t src_temp, uint32_t dst_temp, uint32_t factor_temp) {\n  dxbc::Dest factor_dest(dxbc::Dest::R(factor_temp, 0b0111));\n  dxbc::Src one_src(dxbc::Src::LF(1.0f));\n\n  // kOne.\n  a_.OpCase(dxbc::Src::LU(uint32_t(xenos::BlendFactor::kOne)));\n  a_.OpMov(factor_dest, one_src);\n  a_.OpBreak();\n\n  // kSrcColor\n  a_.OpCase(dxbc::Src::LU(uint32_t(xenos::BlendFactor::kSrcColor)));\n  if (factor_temp != src_temp) {\n    a_.OpMov(factor_dest, dxbc::Src::R(src_temp));\n  }\n  a_.OpBreak();\n\n  // kOneMinusSrcColor\n  a_.OpCase(dxbc::Src::LU(uint32_t(xenos::BlendFactor::kOneMinusSrcColor)));\n  a_.OpAdd(factor_dest, one_src, -dxbc::Src::R(src_temp));\n  a_.OpBreak();\n\n  // kSrcAlpha\n  a_.OpCase(dxbc::Src::LU(uint32_t(xenos::BlendFactor::kSrcAlpha)));\n  a_.OpMov(factor_dest, dxbc::Src::R(src_temp, dxbc::Src::kWWWW));\n  a_.OpBreak();\n\n  // kOneMinusSrcAlpha\n  a_.OpCase(dxbc::Src::LU(uint32_t(xenos::BlendFactor::kOneMinusSrcAlpha)));\n  a_.OpAdd(factor_dest, one_src, -dxbc::Src::R(src_temp, dxbc::Src::kWWWW));\n  a_.OpBreak();\n\n  // kDstColor\n  a_.OpCase(dxbc::Src::LU(uint32_t(xenos::BlendFactor::kDstColor)));\n  if (factor_temp != dst_temp) {\n    a_.OpMov(factor_dest, dxbc::Src::R(dst_temp));\n  }\n  a_.OpBreak();\n\n  // kOneMinusDstColor\n  a_.OpCase(dxbc::Src::LU(uint32_t(xenos::BlendFactor::kOneMinusDstColor)));\n  a_.OpAdd(factor_dest, one_src, -dxbc::Src::R(dst_temp));\n  a_.OpBreak();\n\n  // kDstAlpha\n  a_.OpCase(dxbc::Src::LU(uint32_t(xenos::BlendFactor::kDstAlpha)));\n  a_.OpMov(factor_dest, dxbc::Src::R(dst_temp, dxbc::Src::kWWWW));\n  a_.OpBreak();\n\n  // kOneMinusDstAlpha\n  a_.OpCase(dxbc::Src::LU(uint32_t(xenos::BlendFactor::kOneMinusDstAlpha)));\n  a_.OpAdd(factor_dest, one_src, -dxbc::Src::R(dst_temp, dxbc::Src::kWWWW));\n  a_.OpBreak();\n\n  // Factors involving the constant.\n\n  // kConstantColor\n  a_.OpCase(dxbc::Src::LU(uint32_t(xenos::BlendFactor::kConstantColor)));\n  a_.OpMov(factor_dest,\n           LoadSystemConstant(SystemConstants::Index::kEdramBlendConstant,\n                              offsetof(SystemConstants, edram_blend_constant),\n                              dxbc::Src::kXYZW));\n  a_.OpBreak();\n\n  // kOneMinusConstantColor\n  a_.OpCase(\n      dxbc::Src::LU(uint32_t(xenos::BlendFactor::kOneMinusConstantColor)));\n  a_.OpAdd(factor_dest, one_src,\n           -LoadSystemConstant(SystemConstants::Index::kEdramBlendConstant,\n                               offsetof(SystemConstants, edram_blend_constant),\n                               dxbc::Src::kXYZW));\n  a_.OpBreak();\n\n  // kConstantAlpha\n  a_.OpCase(dxbc::Src::LU(uint32_t(xenos::BlendFactor::kConstantAlpha)));\n  a_.OpMov(factor_dest,\n           LoadSystemConstant(SystemConstants::Index::kEdramBlendConstant,\n                              offsetof(SystemConstants, edram_blend_constant),\n                              dxbc::Src::kWWWW));\n  a_.OpBreak();\n\n  // kOneMinusConstantAlpha\n  a_.OpCase(\n      dxbc::Src::LU(uint32_t(xenos::BlendFactor::kOneMinusConstantAlpha)));\n  a_.OpAdd(factor_dest, one_src,\n           -LoadSystemConstant(SystemConstants::Index::kEdramBlendConstant,\n                               offsetof(SystemConstants, edram_blend_constant),\n                               dxbc::Src::kWWWW));\n  a_.OpBreak();\n\n  // kSrcAlphaSaturate\n  a_.OpCase(dxbc::Src::LU(uint32_t(xenos::BlendFactor::kSrcAlphaSaturate)));\n  a_.OpAdd(dxbc::Dest::R(factor_temp, 0b0001), one_src,\n           -dxbc::Src::R(dst_temp, dxbc::Src::kWWWW));\n  a_.OpMin(factor_dest, dxbc::Src::R(src_temp, dxbc::Src::kWWWW),\n           dxbc::Src::R(factor_temp, dxbc::Src::kXXXX));\n  a_.OpBreak();\n\n  // kZero default.\n  a_.OpDefault();\n  a_.OpMov(factor_dest, dxbc::Src::LF(0.0f));\n  a_.OpBreak();\n}\n\nvoid DxbcShaderTranslator::ROV_HandleAlphaBlendFactorCases(\n    uint32_t src_temp, uint32_t dst_temp, uint32_t factor_temp,\n    uint32_t factor_component) {\n  dxbc::Dest factor_dest(dxbc::Dest::R(factor_temp, 1 << factor_component));\n  dxbc::Src one_src(dxbc::Src::LF(1.0f));\n\n  // kOne, kSrcAlphaSaturate.\n  a_.OpCase(dxbc::Src::LU(uint32_t(xenos::BlendFactor::kOne)));\n  a_.OpCase(dxbc::Src::LU(uint32_t(xenos::BlendFactor::kSrcAlphaSaturate)));\n  a_.OpMov(factor_dest, one_src);\n  a_.OpBreak();\n\n  // kSrcColor, kSrcAlpha.\n  a_.OpCase(dxbc::Src::LU(uint32_t(xenos::BlendFactor::kSrcColor)));\n  a_.OpCase(dxbc::Src::LU(uint32_t(xenos::BlendFactor::kSrcAlpha)));\n  if (factor_temp != src_temp || factor_component != 3) {\n    a_.OpMov(factor_dest, dxbc::Src::R(src_temp, dxbc::Src::kWWWW));\n  }\n  a_.OpBreak();\n\n  // kOneMinusSrcColor, kOneMinusSrcAlpha.\n  a_.OpCase(dxbc::Src::LU(uint32_t(xenos::BlendFactor::kOneMinusSrcColor)));\n  a_.OpCase(dxbc::Src::LU(uint32_t(xenos::BlendFactor::kOneMinusSrcAlpha)));\n  a_.OpAdd(factor_dest, one_src, -dxbc::Src::R(src_temp, dxbc::Src::kWWWW));\n  a_.OpBreak();\n\n  // kDstColor, kDstAlpha.\n  a_.OpCase(dxbc::Src::LU(uint32_t(xenos::BlendFactor::kDstColor)));\n  a_.OpCase(dxbc::Src::LU(uint32_t(xenos::BlendFactor::kDstAlpha)));\n  if (factor_temp != dst_temp || factor_component != 3) {\n    a_.OpMov(factor_dest, dxbc::Src::R(dst_temp, dxbc::Src::kWWWW));\n  }\n  a_.OpBreak();\n\n  // kOneMinusDstColor, kOneMinusDstAlpha.\n  a_.OpCase(dxbc::Src::LU(uint32_t(xenos::BlendFactor::kOneMinusDstColor)));\n  a_.OpCase(dxbc::Src::LU(uint32_t(xenos::BlendFactor::kOneMinusDstAlpha)));\n  a_.OpAdd(factor_dest, one_src, -dxbc::Src::R(dst_temp, dxbc::Src::kWWWW));\n  a_.OpBreak();\n\n  // Factors involving the constant.\n\n  // kConstantColor, kConstantAlpha.\n  a_.OpCase(dxbc::Src::LU(uint32_t(xenos::BlendFactor::kConstantColor)));\n  a_.OpCase(dxbc::Src::LU(uint32_t(xenos::BlendFactor::kConstantAlpha)));\n  a_.OpMov(factor_dest,\n           LoadSystemConstant(SystemConstants::Index::kEdramBlendConstant,\n                              offsetof(SystemConstants, edram_blend_constant),\n                              dxbc::Src::kWWWW));\n  a_.OpBreak();\n\n  // kOneMinusConstantColor, kOneMinusConstantAlpha.\n  a_.OpCase(\n      dxbc::Src::LU(uint32_t(xenos::BlendFactor::kOneMinusConstantColor)));\n  a_.OpCase(\n      dxbc::Src::LU(uint32_t(xenos::BlendFactor::kOneMinusConstantAlpha)));\n  a_.OpAdd(factor_dest, one_src,\n           -LoadSystemConstant(SystemConstants::Index::kEdramBlendConstant,\n                               offsetof(SystemConstants, edram_blend_constant),\n                               dxbc::Src::kWWWW));\n  a_.OpBreak();\n\n  // kZero default.\n  a_.OpDefault();\n  a_.OpMov(factor_dest, dxbc::Src::LF(0.0f));\n  a_.OpBreak();\n}\n\nvoid DxbcShaderTranslator::CompletePixelShader_WriteToRTVs() {\n  uint32_t shader_writes_color_targets =\n      current_shader().writes_color_targets();\n  if (!shader_writes_color_targets) {\n    return;\n  }\n\n  uint32_t gamma_temp = PushSystemTemp();\n  for (uint32_t i = 0; i < 4; ++i) {\n    if (!(shader_writes_color_targets & (1 << i))) {\n      continue;\n    }\n    uint32_t system_temp_color = system_temps_color_[i];\n    // Apply the exponent bias after alpha to coverage because it needs the\n    // unbiased alpha from the shader.\n    a_.OpMul(dxbc::Dest::R(system_temp_color), dxbc::Src::R(system_temp_color),\n             LoadSystemConstant(\n                 SystemConstants::Index::kColorExpBias,\n                 offsetof(SystemConstants, color_exp_bias) + sizeof(float) * i,\n                 dxbc::Src::kXXXX));\n    if (gamma_render_target_as_unorm8_) {\n      // Convert to gamma space - this is incorrect, since it must be done after\n      // blending on the Xbox 360, but this is just one of many blending issues\n      // in the RTV path.\n      a_.OpAnd(dxbc::Dest::R(gamma_temp, 0b0001), LoadFlagsSystemConstant(),\n               dxbc::Src::LU(kSysFlag_ConvertColor0ToGamma << i));\n      a_.OpIf(true, dxbc::Src::R(gamma_temp, dxbc::Src::kXXXX));\n      // Saturate before the gamma conversion.\n      a_.OpMov(dxbc::Dest::R(system_temp_color, 0b0111),\n               dxbc::Src::R(system_temp_color), true);\n      for (uint32_t j = 0; j < 3; ++j) {\n        PreSaturatedLinearToPWLGamma(a_, system_temp_color, j,\n                                     system_temp_color, j, gamma_temp, 0,\n                                     gamma_temp, 1);\n      }\n      a_.OpEndIf();\n    }\n    // Copy the color from a readable temp register to an output register.\n    a_.OpMov(dxbc::Dest::O(i), dxbc::Src::R(system_temp_color));\n  }\n  // Release gamma_temp.\n  PopSystemTemp();\n}\n\nvoid DxbcShaderTranslator::CompletePixelShader_DSV_DepthTo24Bit() {\n  bool shader_writes_depth = current_shader().writes_depth();\n\n  if (!DSV_IsWritingFloat24Depth()) {\n    if (shader_writes_depth) {\n      // If not converting, but the shader writes depth explicitly, for float24,\n      // need to scale it from guest 0...1 to host 0...0.5 to support\n      // reinterpretation round trips as viewport scaling doesn't apply to\n      // oDepth.\n      a_.OpAnd(dxbc::Dest::R(system_temp_depth_stencil_, 0b0010),\n               LoadFlagsSystemConstant(), dxbc::Src::LU(kSysFlag_DepthFloat24));\n      a_.OpIf(true, dxbc::Src::R(system_temp_depth_stencil_, dxbc::Src::kYYYY));\n      a_.OpMul(dxbc::Dest::R(system_temp_depth_stencil_, 0b0001),\n               dxbc::Src::R(system_temp_depth_stencil_, dxbc::Src::kXXXX),\n               dxbc::Src::LF(0.5f));\n      a_.OpEndIf();\n      // Write the depth from the temporary to the system depth output.\n      a_.OpMov(dxbc::Dest::ODepth(),\n               dxbc::Src::R(system_temp_depth_stencil_, dxbc::Src::kXXXX));\n    }\n    return;\n  }\n\n  uint32_t temp;\n  if (shader_writes_depth) {\n    // The depth is already written to system_temp_depth_stencil_.x and clamped\n    // to 0...1 with NaNs dropped (saturating in StoreResult); yzw are free.\n    temp = system_temp_depth_stencil_;\n  } else {\n    // Need a temporary variable; remap the sample's depth input from host\n    // 0...0.5 back to guest 0...1 for conversion purposes to it and saturate it\n    // (in Direct3D 11, depth is clamped to the viewport bounds after the pixel\n    // shader, and SV_Position.z contains the unclamped depth, which may be\n    // outside the viewport's depth range if it's biased); though it will be\n    // clamped to the viewport bounds anyway, but to be able to make the\n    // assumption of it being clamped while working with the bit representation.\n    temp = PushSystemTemp();\n    in_position_used_ |= 0b0100;\n    a_.OpMul(dxbc::Dest::R(temp, 0b0001),\n             dxbc::Src::V1D(in_reg_ps_position_, dxbc::Src::kZZZZ),\n             dxbc::Src::LF(2.0f), true);\n  }\n\n  dxbc::Dest temp_x_dest(dxbc::Dest::R(temp, 0b0001));\n  dxbc::Src temp_x_src(dxbc::Src::R(temp, dxbc::Src::kXXXX));\n  dxbc::Dest temp_y_dest(dxbc::Dest::R(temp, 0b0010));\n  dxbc::Src temp_y_src(dxbc::Src::R(temp, dxbc::Src::kYYYY));\n\n  if (GetDxbcShaderModification().pixel.depth_stencil_mode ==\n      Modification::DepthStencilMode::kFloat24Truncating) {\n    // Simplified conversion, always less than or equal to the original value -\n    // just drop the lower bits.\n    // The float32 exponent bias is 127.\n    // After saturating, the exponent range is -127...0.\n    // The smallest normalized 20e4 exponent is -14 - should drop 3 mantissa\n    // bits at -14 or above.\n    // The smallest denormalized 20e4 number is -34 - should drop 23 mantissa\n    // bits at -34.\n    // Anything smaller than 2^-34 becomes 0.\n    dxbc::Dest truncate_dest(shader_writes_depth ? dxbc::Dest::ODepth()\n                                                 : dxbc::Dest::ODepthLE());\n    // Check if the number is representable as a float24 after truncation - the\n    // exponent is at least -34.\n    a_.OpUGE(temp_y_dest, temp_x_src, dxbc::Src::LU(0x2E800000));\n    a_.OpIf(true, temp_y_src);\n    {\n      // Extract the biased float32 exponent to temp.y.\n      // temp.y = 113+ at exponent -14+.\n      // temp.y = 93 at exponent -34.\n      a_.OpUBFE(temp_y_dest, dxbc::Src::LU(8), dxbc::Src::LU(23), temp_x_src);\n      // Convert exponent to the unclamped number of bits to truncate.\n      // 116 - 113 = 3.\n      // 116 - 93 = 23.\n      // temp.y = 3+ at exponent -14+.\n      // temp.y = 23 at exponent -34.\n      a_.OpIAdd(temp_y_dest, dxbc::Src::LI(116), -temp_y_src);\n      // Clamp the truncated bit count to drop 3 bits of any normal number.\n      // Exponents below -34 are handled separately.\n      // temp.y = 3 at exponent -14.\n      // temp.y = 23 at exponent -34.\n      a_.OpIMax(temp_y_dest, temp_y_src, dxbc::Src::LI(3));\n      // Truncate the mantissa - fill the low bits with zeros.\n      // temp.x = result in 0...1 range\n      a_.OpBFI(temp_x_dest, temp_y_src, dxbc::Src::LU(0), dxbc::Src::LU(0),\n               temp_x_src);\n      // Remap from guest 0...1 to host 0...0.5.\n      a_.OpMul(truncate_dest, temp_x_src, dxbc::Src::LF(0.5f));\n    }\n    // The number is not representable as float24 after truncation - zero.\n    a_.OpElse();\n    a_.OpMov(truncate_dest, dxbc::Src::LF(0.0f));\n    // Close the non-zero result check.\n    a_.OpEndIf();\n  } else {\n    // Properly convert to 20e4, with rounding to the nearest even (the bias was\n    // pre-applied by multiplying by 2), then convert back restoring the bias.\n    PreClampedDepthTo20e4(a_, temp, 0, temp, 0, temp, 1, true, false);\n    Depth20e4To32(a_, dxbc::Dest::ODepth(), temp, 0, 0, temp, 0, temp, 1, true);\n  }\n\n  if (!shader_writes_depth) {\n    // Release temp.\n    PopSystemTemp();\n  }\n}\n\nvoid DxbcShaderTranslator::CompletePixelShader_AlphaToMaskSample(\n    bool initialize, uint32_t sample_index, float threshold_base,\n    dxbc::Src threshold_offset, float threshold_offset_scale,\n    uint32_t coverage_temp, uint32_t coverage_temp_component, uint32_t temp,\n    uint32_t temp_component) {\n  dxbc::Dest temp_dest(dxbc::Dest::R(temp, 1 << temp_component));\n  dxbc::Src temp_src(dxbc::Src::R(temp).Select(temp_component));\n  // Calculate the threshold.\n  a_.OpMAd(temp_dest, threshold_offset, dxbc::Src::LF(-threshold_offset_scale),\n           dxbc::Src::LF(threshold_base));\n  // Check if alpha of oC0 is at or greater than the threshold (handling NaN\n  // according to the Direct3D 11.3 functional specification, as not covered).\n  a_.OpGE(temp_dest, dxbc::Src::R(system_temps_color_[0], dxbc::Src::kWWWW),\n          temp_src);\n  dxbc::Dest coverage_dest(\n      dxbc::Dest::R(coverage_temp, 1 << coverage_temp_component));\n  dxbc::Src coverage_src(\n      dxbc::Src::R(coverage_temp).Select(coverage_temp_component));\n  if (edram_rov_used_) {\n    assert_true(coverage_temp != temp ||\n                coverage_temp_component != temp_component);\n    // Keep all bits in but the ones that need to be removed in case of failure.\n    // For ROV, the test must effect not only the coverage bits, but also the\n    // deferred depth/stencil write bits since the coverage is zeroed for\n    // samples that have failed the depth/stencil test, but stencil may still\n    // require writing - but if the sample is discarded by alpha to coverage, it\n    // must not be written at all.\n    a_.OpOr(temp_dest, temp_src,\n            dxbc::Src::LU(~(uint32_t(0b00010001) << sample_index)));\n    // Clear the coverage for samples that have failed the test.\n    a_.OpAnd(coverage_dest, coverage_src, temp_src);\n  } else {\n    if (initialize) {\n      // First sample tested - initialize.\n      assert_true(coverage_temp != temp ||\n                  coverage_temp_component != temp_component);\n      a_.OpAnd(coverage_dest, temp_src,\n               dxbc::Src::LU(uint32_t(1) << sample_index));\n    } else {\n      // Not first sample tested - add.\n      a_.OpAnd(temp_dest, temp_src, dxbc::Src::LU(uint32_t(1) << sample_index));\n      a_.OpOr(coverage_dest, coverage_src, temp_src);\n    }\n  }\n}\n\nvoid DxbcShaderTranslator::CompletePixelShader_AlphaToMask() {\n  // Check if alpha to coverage can be done at all in this shader.\n  if (!current_shader().writes_color_target(0) ||\n      IsForceEarlyDepthStencilGlobalFlagEnabled()) {\n    return;\n  }\n\n  if (!edram_rov_used_) {\n    // Initialize the output coverage for the case if alpha to mask is not\n    // enabled - it needs to be written on every execution path.\n    a_.OpMov(dxbc::Dest::OMask(), dxbc::Src::LU(UINT32_MAX));\n  }\n\n  // Check if alpha to coverage is enabled.\n  dxbc::Src alpha_to_mask_constant_src(LoadSystemConstant(\n      SystemConstants::Index::kAlphaToMask,\n      offsetof(SystemConstants, alpha_to_mask), dxbc::Src::kXXXX));\n  a_.OpIf(true, alpha_to_mask_constant_src);\n\n  uint32_t temp = PushSystemTemp();\n  dxbc::Dest temp_x_dest(dxbc::Dest::R(temp, 0b0001));\n  dxbc::Src temp_x_src(dxbc::Src::R(temp, dxbc::Src::kXXXX));\n\n  // Get the dithering threshold offset index for the pixel, Y - low bit of\n  // offset index, X - high bit, and extract the offset and convert it to\n  // floating-point. With resolution scaling, still using host pixels, to\n  // preserve the idea of dithering.\n  // temp.x = alpha to coverage offset as float 0.0...3.0.\n  in_position_used_ |= 0b0011;\n  a_.OpFToU(dxbc::Dest::R(temp, 0b0011), dxbc::Src::V1D(in_reg_ps_position_));\n  a_.OpAnd(dxbc::Dest::R(temp, 0b0010), dxbc::Src::R(temp, dxbc::Src::kYYYY),\n           dxbc::Src::LU(1));\n  a_.OpBFI(temp_x_dest, dxbc::Src::LU(1), dxbc::Src::LU(1), temp_x_src,\n           dxbc::Src::R(temp, dxbc::Src::kYYYY));\n  a_.OpIShL(temp_x_dest, temp_x_src, dxbc::Src::LU(1));\n  a_.OpUBFE(temp_x_dest, dxbc::Src::LU(2), temp_x_src,\n            alpha_to_mask_constant_src);\n  a_.OpUToF(temp_x_dest, temp_x_src);\n\n  // Write the result to temp.z for RTV or to system_temp_rov_params_.x for ROV.\n  // temp.x = alpha to coverage offset as float 0.0...3.0.\n  // temp.z = without ROV, accumulated coverage.\n  uint32_t coverage_temp = edram_rov_used_ ? system_temp_rov_params_ : temp;\n  uint32_t coverage_temp_component = edram_rov_used_ ? 0 : 2;\n\n  // Check if MSAA is enabled.\n  a_.OpIf(true, LoadSystemConstant(SystemConstants::Index::kSampleCountLog2,\n                                   offsetof(SystemConstants, sample_count_log2),\n                                   dxbc::Src::kYYYY));\n  {\n    // Check if MSAA is 4x or 2x.\n    a_.OpIf(true,\n            LoadSystemConstant(SystemConstants::Index::kSampleCountLog2,\n                               offsetof(SystemConstants, sample_count_log2),\n                               dxbc::Src::kXXXX));\n    // 4x MSAA.\n    // Sample 0 must be checked first - CompletePixelShader_AlphaToMaskSample\n    // initializes the result for sample index 0.\n    CompletePixelShader_AlphaToMaskSample(true, 0, 0.75f, temp_x_src,\n                                          1.0f / 16.0f, coverage_temp,\n                                          coverage_temp_component, temp, 1);\n    CompletePixelShader_AlphaToMaskSample(false, 1, 0.25f, temp_x_src,\n                                          1.0f / 16.0f, coverage_temp,\n                                          coverage_temp_component, temp, 1);\n    CompletePixelShader_AlphaToMaskSample(false, 2, 0.5f, temp_x_src,\n                                          1.0f / 16.0f, coverage_temp,\n                                          coverage_temp_component, temp, 1);\n    CompletePixelShader_AlphaToMaskSample(false, 3, 1.0f, temp_x_src,\n                                          1.0f / 16.0f, coverage_temp,\n                                          coverage_temp_component, temp, 1);\n    // 2x MSAA.\n    // With ROV, using guest sample indices.\n    // Without ROV:\n    // - Native 2x: top (0 in Xenia) is 1 in D3D10.1+, bottom (1 in Xenia) is 0.\n    // - 2x as 4x: top is 0, bottom is 3.\n    a_.OpElse();\n    CompletePixelShader_AlphaToMaskSample(\n        true, (!edram_rov_used_ && msaa_2x_supported_) ? 1 : 0, 0.5f,\n        temp_x_src, 1.0f / 8.0f, coverage_temp, coverage_temp_component, temp,\n        1);\n    CompletePixelShader_AlphaToMaskSample(\n        false, edram_rov_used_ ? 1 : (msaa_2x_supported_ ? 0 : 3), 1.0f,\n        temp_x_src, 1.0f / 8.0f, coverage_temp, coverage_temp_component, temp,\n        1);\n    // Close the 4x check.\n    a_.OpEndIf();\n  }\n  // MSAA is disabled.\n  a_.OpElse();\n  CompletePixelShader_AlphaToMaskSample(true, 0, 1.0f, temp_x_src, 1.0f / 4.0f,\n                                        coverage_temp, coverage_temp_component,\n                                        temp, 1);\n  // Close the 2x/4x check.\n  a_.OpEndIf();\n\n  // Check if any sample is still covered and return to avoid unneeded work (the\n  // driver's shader compiler may place return after a discard, but it will\n  // likely not place one during SV_Coverage assignment - that's what the AMD\n  // compiler does, at least). Then, if needed, write the coverage value.\n  if (edram_rov_used_) {\n    // The mask includes both 0:3 and 4:7 parts because there may be samples\n    // which passed alpha to coverage, but not stencil test, and the stencil\n    // buffer needs to be modified - in this case, samples would be dropped in\n    // 0:3, but not in 4:7).\n    a_.OpAnd(temp_x_dest,\n             dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kXXXX),\n             dxbc::Src::LU(0b11111111));\n    a_.OpRetC(false, temp_x_src);\n  } else {\n    dxbc::Src coverage_src(\n        dxbc::Src::R(coverage_temp, coverage_temp_component));\n    a_.OpDiscard(false, coverage_src);\n    a_.OpMov(dxbc::Dest::OMask(), coverage_src);\n  }\n\n  // Release temp.\n  PopSystemTemp();\n\n  // Close the alpha to coverage check.\n  a_.OpEndIf();\n}\n\nvoid DxbcShaderTranslator::CompletePixelShader_WriteToROV() {\n  uint32_t temp = PushSystemTemp();\n  dxbc::Dest temp_x_dest(dxbc::Dest::R(temp, 0b0001));\n  dxbc::Src temp_x_src(dxbc::Src::R(temp, dxbc::Src::kXXXX));\n  dxbc::Dest temp_y_dest(dxbc::Dest::R(temp, 0b0010));\n  dxbc::Src temp_y_src(dxbc::Src::R(temp, dxbc::Src::kYYYY));\n  dxbc::Dest temp_z_dest(dxbc::Dest::R(temp, 0b0100));\n  dxbc::Src temp_z_src(dxbc::Src::R(temp, dxbc::Src::kZZZZ));\n  dxbc::Dest temp_w_dest(dxbc::Dest::R(temp, 0b1000));\n  dxbc::Src temp_w_src(dxbc::Src::R(temp, dxbc::Src::kWWWW));\n\n  uint32_t tile_width =\n      xenos::kEdramTileWidthSamples * draw_resolution_scale_x_;\n\n  // Do late depth/stencil test (which includes writing) if needed or deferred\n  // depth writing.\n  if (ROV_IsDepthStencilEarly()) {\n    // Write modified depth/stencil.\n    for (uint32_t i = 0; i < 4; ++i) {\n      // Get if need to write to temp.x.\n      // temp.x = whether the depth sample needs to be written.\n      a_.OpAnd(temp_x_dest,\n               dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kXXXX),\n               dxbc::Src::LU(1 << (4 + i)));\n      // Check if need to write.\n      // temp.x = free.\n      a_.OpIf(true, temp_x_src);\n      {\n        // Write the new depth/stencil.\n        if (uav_index_edram_ == kBindingIndexUnallocated) {\n          uav_index_edram_ = uav_count_++;\n        }\n        a_.OpStoreUAVTyped(\n            dxbc::Dest::U(uav_index_edram_, uint32_t(UAVRegister::kEdram)),\n            dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kYYYY), 1,\n            dxbc::Src::R(system_temp_depth_stencil_).Select(i));\n      }\n      // Close the write check.\n      a_.OpEndIf();\n      // Go to the next sample (samples are at +0, +(80*scale_x), +1,\n      // +(80*scale_x+1), so need to do +(80*scale_x), -(80*scale_x-1),\n      // +(80*scale_x) and -(80*scale_x+1) after each sample).\n      if (i < 3) {\n        a_.OpIAdd(dxbc::Dest::R(system_temp_rov_params_, 0b0010),\n                  dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kYYYY),\n                  dxbc::Src::LI((i & 1) ? -int32_t(tile_width) + 2 - i\n                                        : int32_t(tile_width)));\n      }\n    }\n  } else {\n    ROV_DepthStencilTest();\n  }\n\n  // system_temp_rov_params_.y (the depth / stencil sample address) is not\n  // needed anymore, can be used for color writing.\n\n  if (!is_depth_only_pixel_shader_) {\n    // Check if any sample is still covered after depth testing and writing,\n    // skip color writing completely in this case.\n    // temp.x = whether any sample is still covered.\n    a_.OpAnd(temp_x_dest,\n             dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kXXXX),\n             dxbc::Src::LU(0b1111));\n    // temp.x = free.\n    a_.OpRetC(false, temp_x_src);\n  }\n\n  // Write color values.\n  uint32_t shader_writes_color_targets =\n      current_shader().writes_color_targets();\n  uint32_t edram_size_32bpp_samples =\n      (xenos::kEdramTileHeightSamples * draw_resolution_scale_y_) * tile_width *\n      xenos::kEdramTileCount;\n  for (uint32_t i = 0; i < 4; ++i) {\n    if (!(shader_writes_color_targets & (1 << i))) {\n      continue;\n    }\n\n    // This includes a swizzle to choose XY for even render targets or ZW for\n    // odd ones - use SelectFromSwizzled and SwizzleSwizzled.\n    dxbc::Src keep_mask_src(\n        LoadSystemConstant(SystemConstants::Index::kEdramRTKeepMask,\n                           offsetof(SystemConstants, edram_rt_keep_mask) +\n                               sizeof(uint32_t) * 2 * i,\n                           0b0100));\n\n    // Check if color writing is disabled - special keep mask constant case,\n    // both 32bpp parts are forced UINT32_MAX, but also check whether the shader\n    // has written anything to this target at all.\n\n    // Combine both parts of the keep mask to check if both are 0xFFFFFFFF.\n    // temp.x = whether all bits need to be kept.\n    a_.OpAnd(temp_x_dest, keep_mask_src.SelectFromSwizzled(0),\n             keep_mask_src.SelectFromSwizzled(1));\n    // Flip the bits so both UINT32_MAX would result in 0 - not writing.\n    // temp.x = whether any bits need to be written.\n    a_.OpNot(temp_x_dest, temp_x_src);\n    // Get the bits that will be used for checking wherther the render target\n    // has been written to on the taken execution path - if the write mask is\n    // empty, AND zero with the test bit to always get zero.\n    // temp.x = bits for checking whether the render target has been written to.\n    a_.OpMovC(temp_x_dest, temp_x_src,\n              dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kXXXX),\n              dxbc::Src::LU(0));\n    // Check if the render target was written to on the execution path.\n    // temp.x = whether anything was written and needs to be stored.\n    a_.OpAnd(temp_x_dest, temp_x_src, dxbc::Src::LU(1 << (8 + i)));\n    // Check if need to write anything to the render target.\n    // temp.x = free.\n    a_.OpIf(true, temp_x_src);\n\n    // Apply the exponent bias after alpha to coverage because it needs the\n    // unbiased alpha from the shader.\n    a_.OpMul(dxbc::Dest::R(system_temps_color_[i]),\n             dxbc::Src::R(system_temps_color_[i]),\n             LoadSystemConstant(\n                 SystemConstants::Index::kColorExpBias,\n                 offsetof(SystemConstants, color_exp_bias) + sizeof(float) * i,\n                 dxbc::Src::kXXXX));\n\n    dxbc::Src rt_format_flags_src(LoadSystemConstant(\n        SystemConstants::Index::kEdramRTFormatFlags,\n        offsetof(SystemConstants, edram_rt_format_flags) + sizeof(uint32_t) * i,\n        dxbc::Src::kXXXX));\n\n    // Load whether the render target is 64bpp to system_temp_rov_params_.y to\n    // get the needed relative sample address.\n    a_.OpAnd(dxbc::Dest::R(system_temp_rov_params_, 0b0010),\n             rt_format_flags_src,\n             dxbc::Src::LU(RenderTargetCache::kPSIColorFormatFlag_64bpp));\n    // Choose the relative sample address for the render target to\n    // system_temp_rov_params_.y.\n    a_.OpMovC(dxbc::Dest::R(system_temp_rov_params_, 0b0010),\n              dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kYYYY),\n              dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kWWWW),\n              dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kZZZZ));\n    // Add the EDRAM base of the render target to system_temp_rov_params_.y.\n    a_.OpIAdd(dxbc::Dest::R(system_temp_rov_params_, 0b0010),\n              dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kYYYY),\n              LoadSystemConstant(\n                  SystemConstants::Index::kEdramRTBaseDwordsScaled,\n                  offsetof(SystemConstants, edram_rt_base_dwords_scaled) +\n                      sizeof(uint32_t) * i,\n                  dxbc::Src::kXXXX));\n    // Wrap EDRAM addressing for the color render target to get the final sample\n    // address in the EDRAM to system_temp_rov_params_.y.\n    a_.OpUDiv(dxbc::Dest::Null(),\n              dxbc::Dest::R(system_temp_rov_params_, 0b0010),\n              dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kYYYY),\n              dxbc::Src::LU(edram_size_32bpp_samples));\n\n    dxbc::Src rt_blend_factors_ops_src(LoadSystemConstant(\n        SystemConstants::Index::kEdramRTBlendFactorsOps,\n        offsetof(SystemConstants, edram_rt_blend_factors_ops) +\n            sizeof(uint32_t) * i,\n        dxbc::Src::kXXXX));\n    dxbc::Src rt_clamp_vec_src(LoadSystemConstant(\n        SystemConstants::Index::kEdramRTClamp,\n        offsetof(SystemConstants, edram_rt_clamp) + sizeof(float) * 4 * i,\n        dxbc::Src::kXYZW));\n    // Get if not blending to pack the color once for all 4 samples.\n    // temp.x = whether blending is disabled.\n    a_.OpIEq(temp_x_dest, rt_blend_factors_ops_src, dxbc::Src::LU(0x00010001));\n    // Check if not blending.\n    // temp.x = free.\n    a_.OpIf(true, temp_x_src);\n    {\n      // Clamp the color to the render target's representable range - will be\n      // packed.\n      a_.OpMax(dxbc::Dest::R(system_temps_color_[i]),\n               dxbc::Src::R(system_temps_color_[i]),\n               rt_clamp_vec_src.Swizzle(0b01000000));\n      a_.OpMin(dxbc::Dest::R(system_temps_color_[i]),\n               dxbc::Src::R(system_temps_color_[i]),\n               rt_clamp_vec_src.Swizzle(0b11101010));\n      // Pack the color once if blending.\n      // temp.xy = packed color.\n      ROV_PackPreClampedColor(i, system_temps_color_[i], temp, 0, temp, 2, temp,\n                              3);\n    }\n    // Blending is enabled.\n    a_.OpElse();\n    {\n      // Get if the blending source color is fixed-point for clamping if it is.\n      // temp.x = whether color is fixed-point.\n      a_.OpAnd(temp_x_dest, rt_format_flags_src,\n               dxbc::Src::LU(\n                   RenderTargetCache::kPSIColorFormatFlag_FixedPointColor));\n      // Check if the blending source color is fixed-point and needs clamping.\n      // temp.x = free.\n      a_.OpIf(true, temp_x_src);\n      {\n        // Clamp the blending source color if needed.\n        a_.OpMax(dxbc::Dest::R(system_temps_color_[i], 0b0111),\n                 dxbc::Src::R(system_temps_color_[i]),\n                 rt_clamp_vec_src.Select(0));\n        a_.OpMin(dxbc::Dest::R(system_temps_color_[i], 0b0111),\n                 dxbc::Src::R(system_temps_color_[i]),\n                 rt_clamp_vec_src.Select(2));\n      }\n      // Close the fixed-point color check.\n      a_.OpEndIf();\n\n      // Get if the blending source alpha is fixed-point for clamping if it is.\n      // temp.x = whether alpha is fixed-point.\n      a_.OpAnd(temp_x_dest, rt_format_flags_src,\n               dxbc::Src::LU(\n                   RenderTargetCache::kPSIColorFormatFlag_FixedPointAlpha));\n      // Check if the blending source alpha is fixed-point and needs clamping.\n      // temp.x = free.\n      a_.OpIf(true, temp_x_src);\n      {\n        // Clamp the blending source alpha if needed.\n        a_.OpMax(dxbc::Dest::R(system_temps_color_[i], 0b1000),\n                 dxbc::Src::R(system_temps_color_[i], dxbc::Src::kWWWW),\n                 rt_clamp_vec_src.Select(1));\n        a_.OpMin(dxbc::Dest::R(system_temps_color_[i], 0b1000),\n                 dxbc::Src::R(system_temps_color_[i], dxbc::Src::kWWWW),\n                 rt_clamp_vec_src.Select(3));\n      }\n      // Close the fixed-point alpha check.\n      a_.OpEndIf();\n      // Break register dependency in the color sample raster operation.\n      // temp.xy = 0 instead of packed color.\n      a_.OpMov(dxbc::Dest::R(temp, 0b0011), dxbc::Src::LU(0));\n    }\n    a_.OpEndIf();\n\n    // Blend, mask and write all samples.\n    for (uint32_t j = 0; j < 4; ++j) {\n      // Get if the sample is covered.\n      // temp.z = whether the sample is covered.\n      a_.OpAnd(temp_z_dest,\n               dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kXXXX),\n               dxbc::Src::LU(1 << j));\n\n      // Check if the sample is covered.\n      // temp.z = free.\n      a_.OpIf(true, temp_z_src);\n\n      // Only temp.xy are used at this point (containing the packed color from\n      // the shader if not blending).\n\n      // ***********************************************************************\n      // Color sample raster operation.\n      // ***********************************************************************\n\n      // ***********************************************************************\n      // Checking if color loading must be done - if any component needs to be\n      // kept or if blending is enabled.\n      // ***********************************************************************\n\n      // Get if need to keep any components to temp.z.\n      // temp.z = whether any components must be kept (OR of keep masks).\n      a_.OpOr(temp_z_dest, keep_mask_src.SelectFromSwizzled(0),\n              keep_mask_src.SelectFromSwizzled(1));\n      // Blending isn't done if it's 1 * source + 0 * destination. But since the\n      // previous color also needs to be loaded if any original components need\n      // to be kept, force the blend control to something with blending in this\n      // case in temp.z.\n      // temp.z = blending mode used to check if need to load.\n      a_.OpMovC(temp_z_dest, temp_z_src, dxbc::Src::LU(0),\n                rt_blend_factors_ops_src);\n      // Get if the blend control register requires loading the color to temp.z.\n      // temp.z = whether need to load the color.\n      a_.OpINE(temp_z_dest, temp_z_src, dxbc::Src::LU(0x00010001));\n      // Check if need to do something with the previous color.\n      // temp.z = free.\n      a_.OpIf(true, temp_z_src);\n      {\n        // *********************************************************************\n        // Loading the previous color to temp.zw.\n        // *********************************************************************\n\n        // Load the 32bpp color, or the lower 32 bits of the 64bpp color, to\n        // temp.z.\n        // temp.z = 32-bit packed color or lower 32 bits of the packed color.\n        if (uav_index_edram_ == kBindingIndexUnallocated) {\n          uav_index_edram_ = uav_count_++;\n        }\n        a_.OpLdUAVTyped(\n            temp_z_dest,\n            dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kYYYY), 1,\n            dxbc::Src::U(uav_index_edram_, uint32_t(UAVRegister::kEdram),\n                         dxbc::Src::kXXXX));\n        // Get if the format is 64bpp to temp.w.\n        // temp.w = whether the render target is 64bpp.\n        a_.OpAnd(temp_w_dest, rt_format_flags_src,\n                 dxbc::Src::LU(RenderTargetCache::kPSIColorFormatFlag_64bpp));\n        // Check if the format is 64bpp.\n        // temp.w = free.\n        a_.OpIf(true, temp_w_src);\n        {\n          // Get the address of the upper 32 bits of the color to temp.w.\n          // temp.w = address of the upper 32 bits of the packed color.\n          a_.OpIAdd(temp_w_dest,\n                    dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kYYYY),\n                    dxbc::Src::LU(1));\n          // Load the upper 32 bits of the 64bpp color to temp.w.\n          // temp.zw = packed destination color/alpha.\n          if (uav_index_edram_ == kBindingIndexUnallocated) {\n            uav_index_edram_ = uav_count_++;\n          }\n          a_.OpLdUAVTyped(\n              temp_w_dest, temp_w_src, 1,\n              dxbc::Src::U(uav_index_edram_, uint32_t(UAVRegister::kEdram),\n                           dxbc::Src::kXXXX));\n        }\n        // The color is 32bpp.\n        a_.OpElse();\n        {\n          // Break register dependency in temp.w if the color is 32bpp.\n          // temp.zw = packed destination color/alpha.\n          a_.OpMov(temp_w_dest, dxbc::Src::LU(0));\n        }\n        // Close the color format check.\n        a_.OpEndIf();\n\n        uint32_t color_temp = PushSystemTemp();\n        dxbc::Dest color_temp_rgb_dest(dxbc::Dest::R(color_temp, 0b0111));\n        dxbc::Dest color_temp_a_dest(dxbc::Dest::R(color_temp, 0b1000));\n        dxbc::Src color_temp_src(dxbc::Src::R(color_temp));\n        dxbc::Src color_temp_a_src(dxbc::Src::R(color_temp, dxbc::Src::kWWWW));\n\n        // Get if blending is enabled to color_temp.x.\n        // color_temp.x = whether blending is enabled.\n        a_.OpINE(dxbc::Dest::R(color_temp, 0b0001), rt_blend_factors_ops_src,\n                 dxbc::Src::LU(0x00010001));\n        // Check if need to blend.\n        // color_temp.x = free.\n        a_.OpIf(true, dxbc::Src::R(color_temp, dxbc::Src::kXXXX));\n        {\n          // Now, when blending is enabled, temp.xy are used as scratch since\n          // the color is packed after blending.\n\n          // Unpack the destination color to color_temp, using temp.xy as temps.\n          // The destination color never needs clamping because out-of-range\n          // values can't be loaded.\n          // color_temp.xyzw = destination color/alpha.\n          ROV_UnpackColor(i, temp, 2, color_temp, temp, 0, temp, 1);\n\n          // *******************************************************************\n          // Color blending.\n          // *******************************************************************\n\n          // Extract the color min/max bit to temp.x.\n          // temp.x = whether min/max should be used for color.\n          a_.OpAnd(temp_x_dest, rt_blend_factors_ops_src,\n                   dxbc::Src::LU(1 << (5 + 1)));\n          // Check if need to do blend the color with factors.\n          // temp.x = free.\n          a_.OpIf(false, temp_x_src);\n          {\n            uint32_t blend_src_temp = PushSystemTemp();\n            dxbc::Dest blend_src_temp_rgb_dest(\n                dxbc::Dest::R(blend_src_temp, 0b0111));\n            dxbc::Src blend_src_temp_src(dxbc::Src::R(blend_src_temp));\n\n            // Extract the source color factor to temp.x.\n            // temp.x = source color factor index.\n            a_.OpAnd(temp_x_dest, rt_blend_factors_ops_src,\n                     dxbc::Src::LU((1 << 5) - 1));\n            // Check if the source color factor is not zero - if it is, the\n            // source must be ignored completely, and Infinity and NaN in it\n            // shouldn't affect blending.\n            a_.OpIf(true, temp_x_src);\n            {\n              // Open the switch for choosing the source color blend factor.\n              // temp.x = free.\n              a_.OpSwitch(temp_x_src);\n              // Write the source color factor to blend_src_temp.xyz.\n              // blend_src_temp.xyz = unclamped source color factor.\n              ROV_HandleColorBlendFactorCases(system_temps_color_[i],\n                                              color_temp, blend_src_temp);\n              // Close the source color factor switch.\n              a_.OpEndSwitch();\n              // Get if the render target color is fixed-point and the source\n              // color factor needs clamping to temp.x.\n              // temp.x = whether color is fixed-point.\n              a_.OpAnd(\n                  temp_x_dest, rt_format_flags_src,\n                  dxbc::Src::LU(\n                      RenderTargetCache::kPSIColorFormatFlag_FixedPointColor));\n              // Check if the source color factor needs clamping.\n              a_.OpIf(true, temp_x_src);\n              {\n                // Clamp the source color factor in blend_src_temp.xyz.\n                // blend_src_temp.xyz = source color factor.\n                a_.OpMax(blend_src_temp_rgb_dest, blend_src_temp_src,\n                         rt_clamp_vec_src.Select(0));\n                a_.OpMin(blend_src_temp_rgb_dest, blend_src_temp_src,\n                         rt_clamp_vec_src.Select(2));\n              }\n              // Close the source color factor clamping check.\n              a_.OpEndIf();\n              // Apply the factor to the source color.\n              // blend_src_temp.xyz = unclamped source color part without\n              //                      addition sign.\n              a_.OpMul(blend_src_temp_rgb_dest,\n                       dxbc::Src::R(system_temps_color_[i]),\n                       blend_src_temp_src);\n              // Check if the source color part needs clamping after the\n              // multiplication.\n              // temp.x = free.\n              a_.OpIf(true, temp_x_src);\n              {\n                // Clamp the source color part.\n                // blend_src_temp.xyz = source color part without addition sign.\n                a_.OpMax(blend_src_temp_rgb_dest, blend_src_temp_src,\n                         rt_clamp_vec_src.Select(0));\n                a_.OpMin(blend_src_temp_rgb_dest, blend_src_temp_src,\n                         rt_clamp_vec_src.Select(2));\n              }\n              // Close the source color part clamping check.\n              a_.OpEndIf();\n              // Extract the source color sign to temp.x.\n              // temp.x = source color sign as zero for 1 and non-zero for -1.\n              a_.OpAnd(temp_x_dest, rt_blend_factors_ops_src,\n                       dxbc::Src::LU(1 << (5 + 2)));\n              // Apply the source color sign.\n              // blend_src_temp.xyz = source color part.\n              // temp.x = free.\n              a_.OpMovC(blend_src_temp_rgb_dest, temp_x_src,\n                        -blend_src_temp_src, blend_src_temp_src);\n            }\n            // The source color factor is zero.\n            a_.OpElse();\n            {\n              // Write zero to the source color part.\n              // blend_src_temp.xyz = source color part.\n              // temp.x = free.\n              a_.OpMov(blend_src_temp_rgb_dest, dxbc::Src::LF(0.0f));\n            }\n            // Close the source color factor zero check.\n            a_.OpEndIf();\n\n            // Extract the destination color factor to temp.x.\n            // temp.x = destination color factor index.\n            a_.OpUBFE(temp_x_dest, dxbc::Src::LU(5), dxbc::Src::LU(8),\n                      rt_blend_factors_ops_src);\n            // Check if the destination color factor is not zero.\n            a_.OpIf(true, temp_x_src);\n            {\n              uint32_t blend_dest_factor_temp = PushSystemTemp();\n              dxbc::Src blend_dest_factor_temp_src(\n                  dxbc::Src::R(blend_dest_factor_temp));\n              // Open the switch for choosing the destination color blend\n              // factor.\n              // temp.x = free.\n              a_.OpSwitch(temp_x_src);\n              // Write the destination color factor to\n              // blend_dest_factor_temp.xyz.\n              // blend_dest_factor_temp.xyz = unclamped destination color\n              //                              factor.\n              ROV_HandleColorBlendFactorCases(\n                  system_temps_color_[i], color_temp, blend_dest_factor_temp);\n              // Close the destination color factor switch.\n              a_.OpEndSwitch();\n              // Get if the render target color is fixed-point and the\n              // destination color factor needs clamping to temp.x.\n              // temp.x = whether color is fixed-point.\n              a_.OpAnd(\n                  temp_x_dest, rt_format_flags_src,\n                  dxbc::Src::LU(\n                      RenderTargetCache::kPSIColorFormatFlag_FixedPointColor));\n              // Check if the destination color factor needs clamping.\n              a_.OpIf(true, temp_x_src);\n              {\n                // Clamp the destination color factor in\n                // blend_dest_factor_temp.xyz.\n                // blend_dest_factor_temp.xyz = destination color factor.\n                a_.OpMax(dxbc::Dest::R(blend_dest_factor_temp, 0b0111),\n                         blend_dest_factor_temp_src,\n                         rt_clamp_vec_src.Select(0));\n                a_.OpMin(dxbc::Dest::R(blend_dest_factor_temp, 0b0111),\n                         blend_dest_factor_temp_src,\n                         rt_clamp_vec_src.Select(2));\n              }\n              // Close the destination color factor clamping check.\n              a_.OpEndIf();\n              // Apply the factor to the destination color in color_temp.xyz.\n              // color_temp.xyz = unclamped destination color part without\n              //                  addition sign.\n              // blend_dest_temp.xyz = free.\n              a_.OpMul(color_temp_rgb_dest, color_temp_src,\n                       blend_dest_factor_temp_src);\n              // Release blend_dest_factor_temp.\n              PopSystemTemp();\n              // Check if the destination color part needs clamping after the\n              // multiplication.\n              // temp.x = free.\n              a_.OpIf(true, temp_x_src);\n              {\n                // Clamp the destination color part.\n                // color_temp.xyz = destination color part without addition\n                // sign.\n                a_.OpMax(color_temp_rgb_dest, color_temp_src,\n                         rt_clamp_vec_src.Select(0));\n                a_.OpMin(color_temp_rgb_dest, color_temp_src,\n                         rt_clamp_vec_src.Select(2));\n              }\n              // Close the destination color part clamping check.\n              a_.OpEndIf();\n              // Extract the destination color sign to temp.x.\n              // temp.x = destination color sign as zero for 1 and non-zero for\n              //          -1.\n              a_.OpAnd(temp_x_dest, rt_blend_factors_ops_src,\n                       dxbc::Src::LU(1 << 5));\n              // Select the sign for destination multiply-add as 1.0 or -1.0 to\n              // temp.x.\n              // temp.x = destination color sign as float.\n              a_.OpMovC(temp_x_dest, temp_x_src, dxbc::Src::LF(-1.0f),\n                        dxbc::Src::LF(1.0f));\n              // Perform color blending to color_temp.xyz.\n              // color_temp.xyz = unclamped blended color.\n              // blend_src_temp.xyz = free.\n              // temp.x = free.\n              a_.OpMAd(color_temp_rgb_dest, color_temp_src, temp_x_src,\n                       blend_src_temp_src);\n            }\n            // The destination color factor is zero.\n            a_.OpElse();\n            {\n              // Write the source color part without applying the destination\n              // color.\n              // color_temp.xyz = unclamped blended color.\n              // blend_src_temp.xyz = free.\n              // temp.x = free.\n              a_.OpMov(color_temp_rgb_dest, blend_src_temp_src);\n            }\n            // Close the destination color factor zero check.\n            a_.OpEndIf();\n\n            // Release blend_src_temp.\n            PopSystemTemp();\n\n            // Clamp the color in color_temp.xyz before packing.\n            // color_temp.xyz = blended color.\n            a_.OpMax(color_temp_rgb_dest, color_temp_src,\n                     rt_clamp_vec_src.Select(0));\n            a_.OpMin(color_temp_rgb_dest, color_temp_src,\n                     rt_clamp_vec_src.Select(2));\n          }\n          // Need to do min/max for color.\n          a_.OpElse();\n          {\n            // Extract the color min (0) or max (1) bit to temp.x\n            // temp.x = whether min or max should be used for color.\n            a_.OpAnd(temp_x_dest, rt_blend_factors_ops_src,\n                     dxbc::Src::LU(1 << 5));\n            // Check if need to do min or max for color.\n            // temp.x = free.\n            a_.OpIf(true, temp_x_src);\n            {\n              // Choose max of the colors without applying the factors to\n              // color_temp.xyz.\n              // color_temp.xyz = blended color.\n              a_.OpMax(color_temp_rgb_dest,\n                       dxbc::Src::R(system_temps_color_[i]), color_temp_src);\n            }\n            // Need to do min.\n            a_.OpElse();\n            {\n              // Choose min of the colors without applying the factors to\n              // color_temp.xyz.\n              // color_temp.xyz = blended color.\n              a_.OpMin(color_temp_rgb_dest,\n                       dxbc::Src::R(system_temps_color_[i]), color_temp_src);\n            }\n            // Close the min or max check.\n            a_.OpEndIf();\n          }\n          // Close the color factor blending or min/max check.\n          a_.OpEndIf();\n\n          // *******************************************************************\n          // Alpha blending.\n          // *******************************************************************\n\n          // Extract the alpha min/max bit to temp.x.\n          // temp.x = whether min/max should be used for alpha.\n          a_.OpAnd(temp_x_dest, rt_blend_factors_ops_src,\n                   dxbc::Src::LU(1 << (21 + 1)));\n          // Check if need to do blend the color with factors.\n          // temp.x = free.\n          a_.OpIf(false, temp_x_src);\n          {\n            // Extract the source alpha factor to temp.x.\n            // temp.x = source alpha factor index.\n            a_.OpUBFE(temp_x_dest, dxbc::Src::LU(5), dxbc::Src::LU(16),\n                      rt_blend_factors_ops_src);\n            // Check if the source alpha factor is not zero.\n            a_.OpIf(true, temp_x_src);\n            {\n              // Open the switch for choosing the source alpha blend factor.\n              // temp.x = free.\n              a_.OpSwitch(temp_x_src);\n              // Write the source alpha factor to temp.x.\n              // temp.x = unclamped source alpha factor.\n              ROV_HandleAlphaBlendFactorCases(system_temps_color_[i],\n                                              color_temp, temp, 0);\n              // Close the source alpha factor switch.\n              a_.OpEndSwitch();\n              // Get if the render target alpha is fixed-point and the source\n              // alpha factor needs clamping to temp.y.\n              // temp.y = whether alpha is fixed-point.\n              a_.OpAnd(\n                  temp_y_dest, rt_format_flags_src,\n                  dxbc::Src::LU(\n                      RenderTargetCache::kPSIColorFormatFlag_FixedPointAlpha));\n              // Check if the source alpha factor needs clamping.\n              a_.OpIf(true, temp_y_src);\n              {\n                // Clamp the source alpha factor in temp.x.\n                // temp.x = source alpha factor.\n                a_.OpMax(temp_x_dest, temp_x_src, rt_clamp_vec_src.Select(1));\n                a_.OpMin(temp_x_dest, temp_x_src, rt_clamp_vec_src.Select(3));\n              }\n              // Close the source alpha factor clamping check.\n              a_.OpEndIf();\n              // Apply the factor to the source alpha.\n              // temp.x = unclamped source alpha part without addition sign.\n              a_.OpMul(temp_x_dest,\n                       dxbc::Src::R(system_temps_color_[i], dxbc::Src::kWWWW),\n                       temp_x_src);\n              // Check if the source alpha part needs clamping after the\n              // multiplication.\n              // temp.y = free.\n              a_.OpIf(true, temp_y_src);\n              {\n                // Clamp the source alpha part.\n                // temp.x = source alpha part without addition sign.\n                a_.OpMax(temp_x_dest, temp_x_src, rt_clamp_vec_src.Select(1));\n                a_.OpMin(temp_x_dest, temp_x_src, rt_clamp_vec_src.Select(3));\n              }\n              // Close the source alpha part clamping check.\n              a_.OpEndIf();\n              // Extract the source alpha sign to temp.y.\n              // temp.y = source alpha sign as zero for 1 and non-zero for -1.\n              a_.OpAnd(temp_y_dest, rt_blend_factors_ops_src,\n                       dxbc::Src::LU(1 << (21 + 2)));\n              // Apply the source alpha sign.\n              // temp.x = source alpha part.\n              a_.OpMovC(temp_x_dest, temp_y_src, -temp_x_src, temp_x_src);\n            }\n            // The source alpha factor is zero.\n            a_.OpElse();\n            {\n              // Write zero to the source alpha part.\n              // temp.x = source alpha part.\n              a_.OpMov(temp_x_dest, dxbc::Src::LF(0.0f));\n            }\n            // Close the source alpha factor zero check.\n            a_.OpEndIf();\n\n            // Extract the destination alpha factor to temp.y.\n            // temp.y = destination alpha factor index.\n            a_.OpUBFE(temp_y_dest, dxbc::Src::LU(5), dxbc::Src::LU(24),\n                      rt_blend_factors_ops_src);\n            // Check if the destination alpha factor is not zero.\n            a_.OpIf(true, temp_y_src);\n            {\n              // Open the switch for choosing the destination alpha blend\n              // factor.\n              // temp.y = free.\n              a_.OpSwitch(temp_y_src);\n              // Write the destination alpha factor to temp.y.\n              // temp.y = unclamped destination alpha factor.\n              ROV_HandleAlphaBlendFactorCases(system_temps_color_[i],\n                                              color_temp, temp, 1);\n              // Close the destination alpha factor switch.\n              a_.OpEndSwitch();\n              // Get if the render target alpha is fixed-point and the\n              // destination alpha factor needs clamping.\n              // alpha_is_fixed_temp.x = whether alpha is fixed-point.\n              uint32_t alpha_is_fixed_temp = PushSystemTemp();\n              a_.OpAnd(\n                  dxbc::Dest::R(alpha_is_fixed_temp, 0b0001),\n                  rt_format_flags_src,\n                  dxbc::Src::LU(\n                      RenderTargetCache::kPSIColorFormatFlag_FixedPointAlpha));\n              // Check if the destination alpha factor needs clamping.\n              a_.OpIf(true,\n                      dxbc::Src::R(alpha_is_fixed_temp, dxbc::Src::kXXXX));\n              {\n                // Clamp the destination alpha factor in temp.y.\n                // temp.y = destination alpha factor.\n                a_.OpMax(temp_y_dest, temp_y_src, rt_clamp_vec_src.Select(1));\n                a_.OpMin(temp_y_dest, temp_y_src, rt_clamp_vec_src.Select(3));\n              }\n              // Close the destination alpha factor clamping check.\n              a_.OpEndIf();\n              // Apply the factor to the destination alpha in color_temp.w.\n              // color_temp.w = unclamped destination alpha part without\n              //                addition sign.\n              a_.OpMul(color_temp_a_dest, color_temp_a_src, temp_y_src);\n              // Check if the destination alpha part needs clamping after the\n              // multiplication.\n              // alpha_is_fixed_temp.x = free.\n              a_.OpIf(true,\n                      dxbc::Src::R(alpha_is_fixed_temp, dxbc::Src::kXXXX));\n              // Release alpha_is_fixed_temp.\n              PopSystemTemp();\n              {\n                // Clamp the destination alpha part.\n                // color_temp.w = destination alpha part without addition sign.\n                a_.OpMax(color_temp_a_dest, color_temp_a_src,\n                         rt_clamp_vec_src.Select(1));\n                a_.OpMin(color_temp_a_dest, color_temp_a_src,\n                         rt_clamp_vec_src.Select(3));\n              }\n              // Close the destination alpha factor clamping check.\n              a_.OpEndIf();\n              // Extract the destination alpha sign to temp.y.\n              // temp.y = destination alpha sign as zero for 1 and non-zero for\n              //          -1.\n              a_.OpAnd(temp_y_dest, rt_blend_factors_ops_src,\n                       dxbc::Src::LU(1 << 21));\n              // Select the sign for destination multiply-add as 1.0 or -1.0 to\n              // temp.y.\n              // temp.y = destination alpha sign as float.\n              a_.OpMovC(temp_y_dest, temp_y_src, dxbc::Src::LF(-1.0f),\n                        dxbc::Src::LF(1.0f));\n              // Perform alpha blending to color_temp.w.\n              // color_temp.w = unclamped blended alpha.\n              // temp.xy = free.\n              a_.OpMAd(color_temp_a_dest, color_temp_a_src, temp_y_src,\n                       temp_x_src);\n            }\n            // The destination alpha factor is zero.\n            a_.OpElse();\n            {\n              // Write the source alpha part without applying the destination\n              // alpha.\n              // color_temp.w = unclamped blended alpha.\n              // temp.xy = free.\n              a_.OpMov(color_temp_a_dest, temp_x_src);\n            }\n            // Close the destination alpha factor zero check.\n            a_.OpEndIf();\n\n            // Clamp the alpha in color_temp.w before packing.\n            // color_temp.w = blended alpha.\n            a_.OpMax(color_temp_a_dest, color_temp_a_src,\n                     rt_clamp_vec_src.Select(1));\n            a_.OpMin(color_temp_a_dest, color_temp_a_src,\n                     rt_clamp_vec_src.Select(3));\n          }\n          // Need to do min/max for alpha.\n          a_.OpElse();\n          {\n            // Extract the alpha min (0) or max (1) bit to temp.x.\n            // temp.x = whether min or max should be used for alpha.\n            a_.OpAnd(temp_x_dest, rt_blend_factors_ops_src,\n                     dxbc::Src::LU(1 << 21));\n            // Check if need to do min or max for alpha.\n            // temp.x = free.\n            a_.OpIf(true, temp_x_src);\n            {\n              // Choose max of the alphas without applying the factors to\n              // color_temp.w.\n              // color_temp.w = blended alpha.\n              a_.OpMax(color_temp_a_dest,\n                       dxbc::Src::R(system_temps_color_[i], dxbc::Src::kWWWW),\n                       color_temp_a_src);\n            }\n            // Need to do min.\n            a_.OpElse();\n            {\n              // Choose min of the alphas without applying the factors to\n              // color_temp.w.\n              // color_temp.w = blended alpha.\n              a_.OpMin(color_temp_a_dest,\n                       dxbc::Src::R(system_temps_color_[i], dxbc::Src::kWWWW),\n                       color_temp_a_src);\n            }\n            // Close the min or max check.\n            a_.OpEndIf();\n          }\n          // Close the alpha factor blending or min/max check.\n          a_.OpEndIf();\n\n          // Pack the new color/alpha to temp.xy.\n          // temp.xy = packed new color/alpha.\n          uint32_t color_pack_temp = PushSystemTemp();\n          ROV_PackPreClampedColor(i, color_temp, temp, 0, color_pack_temp, 0,\n                                  color_pack_temp, 1);\n          // Release color_pack_temp.\n          PopSystemTemp();\n        }\n        // Close the blending check.\n        a_.OpEndIf();\n\n        // *********************************************************************\n        // Write mask application\n        // *********************************************************************\n\n        // Apply the keep mask to the previous packed color/alpha in temp.zw.\n        // temp.zw = masked packed old color/alpha.\n        a_.OpAnd(dxbc::Dest::R(temp, 0b1100), dxbc::Src::R(temp),\n                 keep_mask_src.SwizzleSwizzled(0b0100 << 4));\n        // Invert the keep mask into color_temp.xy.\n        // color_temp.xy = inverted keep mask (write mask).\n        a_.OpNot(dxbc::Dest::R(color_temp, 0b0011), keep_mask_src);\n        // Release color_temp.\n        PopSystemTemp();\n        // Apply the write mask to the new color/alpha in temp.xy.\n        // temp.xy = masked packed new color/alpha.\n        a_.OpAnd(dxbc::Dest::R(temp, 0b0011), dxbc::Src::R(temp),\n                 dxbc::Src::R(color_temp));\n        // Combine the masked colors into temp.xy.\n        // temp.xy = packed resulting color/alpha.\n        // temp.zw = free.\n        a_.OpOr(dxbc::Dest::R(temp, 0b0011), dxbc::Src::R(temp),\n                dxbc::Src::R(temp, 0b1110));\n      }\n      // Close the previous color load check.\n      a_.OpEndIf();\n\n      // ***********************************************************************\n      // Writing the color\n      // ***********************************************************************\n\n      // Store the 32bpp color or the lower 32 bits of the 64bpp color.\n      if (uav_index_edram_ == kBindingIndexUnallocated) {\n        uav_index_edram_ = uav_count_++;\n      }\n      a_.OpStoreUAVTyped(\n          dxbc::Dest::U(uav_index_edram_, uint32_t(UAVRegister::kEdram)),\n          dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kYYYY), 1,\n          temp_x_src);\n      // Get if the format is 64bpp to temp.z.\n      // temp.z = whether the render target is 64bpp.\n      a_.OpAnd(temp_z_dest, rt_format_flags_src,\n               dxbc::Src::LU(RenderTargetCache::kPSIColorFormatFlag_64bpp));\n      // Check if the format is 64bpp.\n      // temp.z = free.\n      a_.OpIf(true, temp_z_src);\n      {\n        // Get the address of the upper 32 bits of the color to temp.z (can't\n        // use temp.x because components when not blending, packing is done once\n        // for all samples, so it has to be preserved).\n        a_.OpIAdd(temp_z_dest,\n                  dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kYYYY),\n                  dxbc::Src::LU(1));\n        // Store the upper 32 bits of the 64bpp color.\n        if (uav_index_edram_ == kBindingIndexUnallocated) {\n          uav_index_edram_ = uav_count_++;\n        }\n        a_.OpStoreUAVTyped(\n            dxbc::Dest::U(uav_index_edram_, uint32_t(UAVRegister::kEdram)),\n            temp_z_src, 1, temp_y_src);\n      }\n      // Close the 64bpp conditional.\n      a_.OpEndIf();\n\n      // ***********************************************************************\n      // End of color sample raster operation.\n      // ***********************************************************************\n\n      // Close the sample covered check.\n      a_.OpEndIf();\n\n      // Go to the next sample (samples are at +0, +(80*scale_x), +dwpp,\n      // +(80*scale_x+dwpp), so need to do +(80*scale_x), -(80*scale_x-dwpp),\n      // +(80*scale_x) and -(80*scale_x+dwpp) after each sample).\n      // Though no need to do this for the last sample as for the next render\n      // target, the address will be recalculated.\n      if (j < 3) {\n        if (j & 1) {\n          // temp.z = whether the render target is 64bpp.\n          a_.OpAnd(temp_z_dest, rt_format_flags_src,\n                   dxbc::Src::LU(RenderTargetCache::kPSIColorFormatFlag_64bpp));\n          // temp.z = offset from the current sample to the next.\n          a_.OpMovC(temp_z_dest, temp_z_src,\n                    dxbc::Src::LI(-int32_t(tile_width) + 2 * (2 - int32_t(j))),\n                    dxbc::Src::LI(-int32_t(tile_width) + (2 - int32_t(j))));\n          // temp.z = free.\n          a_.OpIAdd(dxbc::Dest::R(system_temp_rov_params_, 0b0010),\n                    dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kYYYY),\n                    temp_z_src);\n        } else {\n          a_.OpIAdd(dxbc::Dest::R(system_temp_rov_params_, 0b0010),\n                    dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kYYYY),\n                    dxbc::Src::LU(tile_width));\n        }\n      }\n    }\n\n    // Close the render target write check.\n    a_.OpEndIf();\n  }\n\n  // Release temp.\n  PopSystemTemp();\n}\n\nvoid DxbcShaderTranslator::CompletePixelShader() {\n  if (is_depth_only_pixel_shader_) {\n    // The depth-only shader only needs to do the depth test and to write the\n    // depth to the ROV.\n    if (edram_rov_used_) {\n      CompletePixelShader_WriteToROV();\n    }\n    return;\n  }\n\n  if (current_shader().writes_color_target(0) &&\n      !IsForceEarlyDepthStencilGlobalFlagEnabled()) {\n    if (edram_rov_used_) {\n      // Check if the render target 0 was written to on the execution path.\n      uint32_t rt_0_written_temp = PushSystemTemp();\n      a_.OpAnd(dxbc::Dest::R(rt_0_written_temp, 0b0001),\n               dxbc::Src::R(system_temp_rov_params_, dxbc::Src::kXXXX),\n               dxbc::Src::LU(1 << 8));\n      a_.OpIf(true, dxbc::Src::R(rt_0_written_temp, dxbc::Src::kXXXX));\n      // Release rt_0_written_temp.\n      PopSystemTemp();\n    }\n\n    // Alpha test.\n    // X - mask, then masked result (SGPR for loading, VGPR for masking).\n    // Y - operation result (SGPR for mask operations, VGPR for alpha\n    //     operations).\n    uint32_t alpha_test_temp = PushSystemTemp();\n    dxbc::Dest alpha_test_mask_dest(dxbc::Dest::R(alpha_test_temp, 0b0001));\n    dxbc::Src alpha_test_mask_src(\n        dxbc::Src::R(alpha_test_temp, dxbc::Src::kXXXX));\n    dxbc::Dest alpha_test_op_dest(dxbc::Dest::R(alpha_test_temp, 0b0010));\n    dxbc::Src alpha_test_op_src(\n        dxbc::Src::R(alpha_test_temp, dxbc::Src::kYYYY));\n    // Extract the comparison mask to check if the test needs to be done at all.\n    // Don't care about flow control being somewhat dynamic - early Z is forced\n    // using a special version of the shader anyway.\n    a_.OpUBFE(alpha_test_mask_dest, dxbc::Src::LU(3),\n              dxbc::Src::LU(kSysFlag_AlphaPassIfLess_Shift),\n              LoadFlagsSystemConstant());\n    // Compare the mask to ALWAYS to check if the test shouldn't be done (will\n    // pass even for NaNs, though the expected behavior in this case hasn't been\n    // checked, but let's assume this means \"always\", not \"less, equal or\n    // greater\".\n    // TODO(Triang3l): Check how alpha test works with NaN on Direct3D 9.\n    a_.OpINE(alpha_test_op_dest, alpha_test_mask_src,\n             dxbc::Src::LU(uint32_t(xenos::CompareFunction::kAlways)));\n    // Don't do the test if the mode is \"always\".\n    a_.OpIf(true, alpha_test_op_src);\n    {\n      // Do the test.\n      dxbc::Src alpha_src(\n          dxbc::Src::R(system_temps_color_[0], dxbc::Src::kWWWW));\n      dxbc::Src alpha_test_reference_src(LoadSystemConstant(\n          SystemConstants::Index::kAlphaTestReference,\n          offsetof(SystemConstants, alpha_test_reference), dxbc::Src::kXXXX));\n      // Handle \"not equal\" specially (specifically as \"not equal\" so it's true\n      // for NaN, not \"less or greater\" which is false for NaN).\n      a_.OpIEq(alpha_test_op_dest, alpha_test_mask_src,\n               dxbc::Src::LU(uint32_t(xenos::CompareFunction::kNotEqual)));\n      a_.OpIf(true, alpha_test_op_src);\n      { a_.OpNE(alpha_test_mask_dest, alpha_src, alpha_test_reference_src); }\n      a_.OpElse();\n      {\n        // Less than.\n        a_.OpLT(alpha_test_op_dest, alpha_src, alpha_test_reference_src);\n        a_.OpOr(alpha_test_op_dest, alpha_test_op_src,\n                dxbc::Src::LU(~uint32_t(1 << 0)));\n        a_.OpAnd(alpha_test_mask_dest, alpha_test_mask_src, alpha_test_op_src);\n        // Equals to.\n        a_.OpEq(alpha_test_op_dest, alpha_src, alpha_test_reference_src);\n        a_.OpOr(alpha_test_op_dest, alpha_test_op_src,\n                dxbc::Src::LU(~uint32_t(1 << 1)));\n        a_.OpAnd(alpha_test_mask_dest, alpha_test_mask_src, alpha_test_op_src);\n        // Greater than.\n        a_.OpLT(alpha_test_op_dest, alpha_test_reference_src, alpha_src);\n        a_.OpOr(alpha_test_op_dest, alpha_test_op_src,\n                dxbc::Src::LU(~uint32_t(1 << 2)));\n        a_.OpAnd(alpha_test_mask_dest, alpha_test_mask_src, alpha_test_op_src);\n      }\n      // Close the \"not equal\" check.\n      a_.OpEndIf();\n      // Discard the pixel if it has failed the test.\n      if (edram_rov_used_) {\n        a_.OpRetC(false, alpha_test_mask_src);\n      } else {\n        a_.OpDiscard(false, alpha_test_mask_src);\n      }\n    }\n    // Close the \"not always\" check.\n    a_.OpEndIf();\n    // Release alpha_test_temp.\n    PopSystemTemp();\n\n    // Discard samples with alpha to coverage.\n    CompletePixelShader_AlphaToMask();\n\n    if (edram_rov_used_) {\n      // Close the render target 0 written check.\n      a_.OpEndIf();\n    }\n  }\n\n  // Write the values to the render targets. Not applying the exponent bias yet\n  // because the original 0 to 1 alpha value is needed for alpha to coverage,\n  // which is done differently for ROV and RTV/DSV.\n  if (edram_rov_used_) {\n    CompletePixelShader_WriteToROV();\n  } else {\n    CompletePixelShader_WriteToRTVs();\n    CompletePixelShader_DSV_DepthTo24Bit();\n  }\n}\n\nvoid DxbcShaderTranslator::PreClampedFloat32To7e3(\n    dxbc::Assembler& a, uint32_t f10_temp, uint32_t f10_temp_component,\n    uint32_t f32_temp, uint32_t f32_temp_component, uint32_t temp_temp,\n    uint32_t temp_temp_component) {\n  assert_true(temp_temp != f10_temp ||\n              temp_temp_component != f10_temp_component);\n  assert_true(temp_temp != f32_temp ||\n              temp_temp_component != f32_temp_component);\n  // Source and destination may be the same.\n  dxbc::Dest f10_dest(dxbc::Dest::R(f10_temp, 1 << f10_temp_component));\n  dxbc::Src f10_src(dxbc::Src::R(f10_temp).Select(f10_temp_component));\n  dxbc::Src f32_src(dxbc::Src::R(f32_temp).Select(f32_temp_component));\n  dxbc::Dest temp_dest(dxbc::Dest::R(temp_temp, 1 << temp_temp_component));\n  dxbc::Src temp_src(dxbc::Src::R(temp_temp).Select(temp_temp_component));\n\n  // https://github.com/Microsoft/DirectXTex/blob/master/DirectXTex/DirectXTexConvert.cpp\n  // Assuming the color is already clamped to [0, 31.875].\n\n  // Check if the number is too small to be represented as normalized 7e3.\n  // temp = f32 < 2^-2\n  a.OpULT(temp_dest, f32_src, dxbc::Src::LU(0x3E800000));\n  // Handle denormalized numbers separately.\n  a.OpIf(true, temp_src);\n  {\n    // temp = f32 >> 23\n    a.OpUShR(temp_dest, f32_src, dxbc::Src::LU(23));\n    // temp = 125 - (f32 >> 23)\n    a.OpIAdd(temp_dest, dxbc::Src::LI(125), -temp_src);\n    // Don't allow the shift to overflow, since in DXBC the lower 5 bits of the\n    // shift amount are used.\n    // temp = min(125 - (f32 >> 23), 24)\n    a.OpUMin(temp_dest, temp_src, dxbc::Src::LU(24));\n    // biased_f32 = (f32 & 0x7FFFFF) | 0x800000\n    a.OpBFI(f10_dest, dxbc::Src::LU(9), dxbc::Src::LU(23), dxbc::Src::LU(1),\n            f32_src);\n    // biased_f32 = ((f32 & 0x7FFFFF) | 0x800000) >> min(125 - (f32 >> 23), 24)\n    a.OpUShR(f10_dest, f10_src, temp_src);\n  }\n  // Not denormalized?\n  a.OpElse();\n  {\n    // Bias the exponent.\n    // biased_f32 = f32 + (-124 << 23)\n    // (left shift of a negative value is undefined behavior)\n    a.OpIAdd(f10_dest, f32_src, dxbc::Src::LU(0xC2000000u));\n  }\n  // Close the denormal check.\n  a.OpEndIf();\n  // Build the 7e3 number.\n  // temp = (biased_f32 >> 16) & 1\n  a.OpUBFE(temp_dest, dxbc::Src::LU(1), dxbc::Src::LU(16), f10_src);\n  // f10 = biased_f32 + 0x7FFF\n  a.OpIAdd(f10_dest, f10_src, dxbc::Src::LU(0x7FFF));\n  // f10 = biased_f32 + 0x7FFF + ((biased_f32 >> 16) & 1)\n  a.OpIAdd(f10_dest, f10_src, temp_src);\n  // f24 = ((biased_f32 + 0x7FFF + ((biased_f32 >> 16) & 1)) >> 16) & 0x3FF\n  a.OpUBFE(f10_dest, dxbc::Src::LU(10), dxbc::Src::LU(16), f10_src);\n}\n\nvoid DxbcShaderTranslator::UnclampedFloat32To7e3(\n    dxbc::Assembler& a, uint32_t f10_temp, uint32_t f10_temp_component,\n    uint32_t f32_temp, uint32_t f32_temp_component, uint32_t temp_temp,\n    uint32_t temp_temp_component) {\n  // Source and destination might be the same or different, just like in\n  // PreClampedFloat32To7e3 - clamp to the destination and use it as source.\n  a.OpMax(dxbc::Dest::R(f10_temp, 1 << f10_temp_component),\n          dxbc::Src::R(f32_temp).Select(f32_temp_component),\n          dxbc::Src::LF(0.0f));\n  a.OpMin(dxbc::Dest::R(f10_temp, 1 << f10_temp_component),\n          dxbc::Src::R(f10_temp).Select(f10_temp_component),\n          dxbc::Src::LF(31.875f));\n  PreClampedFloat32To7e3(a, f10_temp, f10_temp_component, f10_temp,\n                         f10_temp_component, temp_temp, temp_temp_component);\n}\n\nvoid DxbcShaderTranslator::Float7e3To32(\n    dxbc::Assembler& a, const dxbc::Dest& f32, uint32_t f10_temp,\n    uint32_t f10_temp_component, uint32_t f10_shift, uint32_t temp1_temp,\n    uint32_t temp1_temp_component, uint32_t temp2_temp,\n    uint32_t temp2_temp_component) {\n  assert_true(f10_shift <= (32 - 10));\n  assert_true(temp1_temp != temp2_temp ||\n              temp1_temp_component != temp2_temp_component);\n  // Source may be the same as temp1 or temp2.\n  dxbc::Dest exponent_dest(\n      dxbc::Dest::R(temp1_temp, 1 << temp1_temp_component));\n  dxbc::Src exponent_src(dxbc::Src::R(temp1_temp).Select(temp1_temp_component));\n  dxbc::Dest mantissa_dest(\n      dxbc::Dest::R(temp2_temp, 1 << temp2_temp_component));\n  dxbc::Src mantissa_src(dxbc::Src::R(temp2_temp).Select(temp2_temp_component));\n\n  // https://github.com/Microsoft/DirectXTex/blob/master/DirectXTex/DirectXTexConvert.cpp\n\n  if (!(f10_temp == temp1_temp && f10_temp_component == temp1_temp_component)) {\n    // Unpack the exponent before the mantissa if that doesn't overwrite the\n    // source.\n    a.OpUBFE(exponent_dest, dxbc::Src::LU(3), dxbc::Src::LU(f10_shift + 7),\n             dxbc::Src::R(f10_temp).Select(f10_temp_component));\n  }\n  // Unpack the mantissa.\n  a.OpUBFE(mantissa_dest, dxbc::Src::LU(7), dxbc::Src::LU(f10_shift),\n           dxbc::Src::R(f10_temp).Select(f10_temp_component));\n  if (f10_temp == temp1_temp && f10_temp_component == temp1_temp_component) {\n    // Unpack the exponent after the mantissa if doing that before the mantissa\n    // would overwrite the source.\n    a.OpUBFE(exponent_dest, dxbc::Src::LU(3), dxbc::Src::LU(f10_shift + 7),\n             dxbc::Src::R(f10_temp).Select(f10_temp_component));\n  }\n  // Check if the number is denormalized.\n  a.OpIf(false, exponent_src);\n  {\n    // Check if the number is non-zero (if the mantissa isn't zero - the\n    // exponent is known to be zero at this point).\n    a.OpIf(true, mantissa_src);\n    {\n      // Normalize the mantissa.\n      // Note that HLSL firstbithigh(x) is compiled to DXBC like:\n      // `x ? 31 - firstbit_hi(x) : -1`\n      // (returns the index from the LSB, not the MSB, but -1 for zero too).\n      // exponent = firstbit_hi(mantissa)\n      a.OpFirstBitHi(exponent_dest, mantissa_src);\n      // exponent = 7 - firstbithigh(mantissa)\n      // Or:\n      // exponent = 7 - (31 - firstbit_hi(mantissa))\n      a.OpIAdd(exponent_dest, exponent_src, dxbc::Src::LI(7 - 31));\n      // mantissa = mantissa << (7 - firstbithigh(mantissa))\n      // AND 0x7F not needed after this - BFI will do it.\n      a.OpIShL(mantissa_dest, mantissa_src, exponent_src);\n      // Get the normalized exponent.\n      // exponent = 1 - (7 - firstbithigh(mantissa))\n      a.OpIAdd(exponent_dest, dxbc::Src::LI(1), -exponent_src);\n    }\n    // The number is zero.\n    a.OpElse();\n    {\n      // Set the unbiased exponent to -124 for zero - 124 will be added later,\n      // resulting in zero float32.\n      a.OpMov(exponent_dest, dxbc::Src::LI(-124));\n    }\n    // Close the non-zero check.\n    a.OpEndIf();\n  }\n  // Close the denormal check.\n  a.OpEndIf();\n  // Bias the exponent and move it to the correct location in f32.\n  a.OpIMAd(exponent_dest, exponent_src, dxbc::Src::LI(1 << 23),\n           dxbc::Src::LI(124 << 23));\n  // Combine the mantissa and the exponent.\n  a.OpBFI(f32, dxbc::Src::LU(7), dxbc::Src::LU(23 - 7), mantissa_src,\n          exponent_src);\n}\n\nvoid DxbcShaderTranslator::PreClampedDepthTo20e4(\n    dxbc::Assembler& a, uint32_t f24_temp, uint32_t f24_temp_component,\n    uint32_t f32_temp, uint32_t f32_temp_component, uint32_t temp_temp,\n    uint32_t temp_temp_component, bool round_to_nearest_even,\n    bool remap_from_0_to_0_5) {\n  assert_true(temp_temp != f24_temp ||\n              temp_temp_component != f24_temp_component);\n  assert_true(temp_temp != f32_temp ||\n              temp_temp_component != f32_temp_component);\n  // Source and destination may be the same.\n  dxbc::Dest f24_dest(dxbc::Dest::R(f24_temp, 1 << f24_temp_component));\n  dxbc::Src f24_src(dxbc::Src::R(f24_temp).Select(f24_temp_component));\n  dxbc::Src f32_src(dxbc::Src::R(f32_temp).Select(f32_temp_component));\n  dxbc::Dest temp_dest(dxbc::Dest::R(temp_temp, 1 << temp_temp_component));\n  dxbc::Src temp_src(dxbc::Src::R(temp_temp).Select(temp_temp_component));\n\n  // CFloat24 from d3dref9.dll +\n  // https://github.com/Microsoft/DirectXTex/blob/master/DirectXTex/DirectXTexConvert.cpp\n  // Assuming the depth is already clamped to [0, 2) (in all places, the depth\n  // is written with the saturate flag set).\n\n  uint32_t remap_bias = uint32_t(remap_from_0_to_0_5);\n\n  // Check if the number is too small to be represented as normalized 20e4.\n  // temp = f32 < 2^-14\n  a.OpULT(temp_dest, f32_src, dxbc::Src::LU(0x38800000 - (remap_bias << 23)));\n  // Handle denormalized numbers separately.\n  a.OpIf(true, temp_src);\n  {\n    // temp = f32 >> 23\n    a.OpUShR(temp_dest, f32_src, dxbc::Src::LU(23));\n    // temp = 113 - (f32 >> 23)\n    a.OpIAdd(temp_dest, dxbc::Src::LI(113 - remap_bias), -temp_src);\n    // Don't allow the shift to overflow, since in DXBC the lower 5 bits of the\n    // shift amount are used (otherwise 0 becomes 8).\n    // temp = min(113 - (f32 >> 23), 24)\n    a.OpUMin(temp_dest, temp_src, dxbc::Src::LU(24));\n    // biased_f32 = (f32 & 0x7FFFFF) | 0x800000\n    a.OpBFI(f24_dest, dxbc::Src::LU(9), dxbc::Src::LU(23), dxbc::Src::LU(1),\n            f32_src);\n    // biased_f32 = ((f32 & 0x7FFFFF) | 0x800000) >> min(113 - (f32 >> 23), 24)\n    a.OpUShR(f24_dest, f24_src, temp_src);\n  }\n  // Not denormalized?\n  a.OpElse();\n  {\n    // Bias the exponent.\n    // biased_f32 = f32 + (-112 << 23)\n    // (left shift of a negative value is undefined behavior)\n    a.OpIAdd(f24_dest, f32_src,\n             dxbc::Src::LU(0xC8000000u + (remap_bias << 23)));\n  }\n  // Close the denormal check.\n  a.OpEndIf();\n  // Build the 20e4 number.\n  if (round_to_nearest_even) {\n    // temp = (biased_f32 >> 3) & 1\n    a.OpUBFE(temp_dest, dxbc::Src::LU(1), dxbc::Src::LU(3), f24_src);\n    // f24 = biased_f32 + 3\n    a.OpIAdd(f24_dest, f24_src, dxbc::Src::LU(3));\n    // f24 = biased_f32 + 3 + ((biased_f32 >> 3) & 1)\n    a.OpIAdd(f24_dest, f24_src, temp_src);\n  }\n  // For rounding to the nearest even:\n  // f24 = ((biased_f32 + 3 + ((biased_f32 >> 3) & 1)) >> 3) & 0xFFFFFF\n  // For rounding towards zero:\n  // f24 = (biased_f32 >> 3) & 0xFFFFFF\n  a.OpUBFE(f24_dest, dxbc::Src::LU(24), dxbc::Src::LU(3), f24_src);\n}\n\nvoid DxbcShaderTranslator::Depth20e4To32(\n    dxbc::Assembler& a, const dxbc::Dest& f32, uint32_t f24_temp,\n    uint32_t f24_temp_component, uint32_t f24_shift, uint32_t temp1_temp,\n    uint32_t temp1_temp_component, uint32_t temp2_temp,\n    uint32_t temp2_temp_component, bool remap_to_0_to_0_5) {\n  assert_true(f24_shift <= (32 - 24));\n  assert_true(temp1_temp != temp2_temp ||\n              temp1_temp_component != temp2_temp_component);\n  // Source may be the same as temp1 or temp2.\n  dxbc::Dest exponent_dest(\n      dxbc::Dest::R(temp1_temp, 1 << temp1_temp_component));\n  dxbc::Src exponent_src(dxbc::Src::R(temp1_temp).Select(temp1_temp_component));\n  dxbc::Dest mantissa_dest(\n      dxbc::Dest::R(temp2_temp, 1 << temp2_temp_component));\n  dxbc::Src mantissa_src(dxbc::Src::R(temp2_temp).Select(temp2_temp_component));\n\n  // CFloat24 from d3dref9.dll +\n  // https://github.com/Microsoft/DirectXTex/blob/master/DirectXTex/DirectXTexConvert.cpp\n\n  uint32_t remap_bias = uint32_t(remap_to_0_to_0_5);\n\n  if (!(f24_temp == temp1_temp && f24_temp_component == temp1_temp_component)) {\n    // Unpack the exponent before the mantissa if that doesn't overwrite the\n    // source.\n    a.OpUBFE(exponent_dest, dxbc::Src::LU(4), dxbc::Src::LU(f24_shift + 20),\n             dxbc::Src::R(f24_temp).Select(f24_temp_component));\n  }\n  // Unpack the mantissa.\n  a.OpUBFE(mantissa_dest, dxbc::Src::LU(20), dxbc::Src::LU(f24_shift),\n           dxbc::Src::R(f24_temp).Select(f24_temp_component));\n  if (f24_temp == temp1_temp && f24_temp_component == temp1_temp_component) {\n    // Unpack the exponent after the mantissa if doing that before the mantissa\n    // would overwrite the source.\n    a.OpUBFE(exponent_dest, dxbc::Src::LU(4), dxbc::Src::LU(f24_shift + 20),\n             dxbc::Src::R(f24_temp).Select(f24_temp_component));\n  }\n  // Check if the number is denormalized.\n  a.OpIf(false, exponent_src);\n  {\n    // Check if the number is non-zero (if the mantissa isn't zero - the\n    // exponent is known to be zero at this point).\n    a.OpIf(true, mantissa_src);\n    {\n      // Normalize the mantissa.\n      // Note that HLSL firstbithigh(x) is compiled to DXBC like:\n      // `x ? 31 - firstbit_hi(x) : -1`\n      // (returns the index from the LSB, not the MSB, but -1 for zero too).\n      // exponent = firstbit_hi(mantissa)\n      a.OpFirstBitHi(exponent_dest, mantissa_src);\n      // exponent = 20 - firstbithigh(mantissa)\n      // Or:\n      // exponent = 20 - (31 - firstbit_hi(mantissa))\n      a.OpIAdd(exponent_dest, exponent_src, dxbc::Src::LI(20 - 31));\n      // mantissa = mantissa << (20 - firstbithigh(mantissa))\n      // AND 0xFFFFF not needed after this - BFI will do it.\n      a.OpIShL(mantissa_dest, mantissa_src, exponent_src);\n      // Get the normalized exponent.\n      // exponent = 1 - (20 - firstbithigh(mantissa))\n      a.OpIAdd(exponent_dest, dxbc::Src::LI(1), -exponent_src);\n    }\n    // The number is zero.\n    a.OpElse();\n    {\n      // Set the unbiased exponent to -112 for zero - 112 will be added later\n      // (taking the range remap bias into account), resulting in zero float32.\n      a.OpMov(exponent_dest, dxbc::Src::LI(-int32_t(112 - remap_bias)));\n    }\n    // Close the non-zero check.\n    a.OpEndIf();\n  }\n  // Close the denormal check.\n  a.OpEndIf();\n  // Bias the exponent and move it to the correct location in f32, and also\n  // remap from guest 0...1 to host 0...0.5 if needed.\n  a.OpIMAd(exponent_dest, exponent_src, dxbc::Src::LI(1 << 23),\n           dxbc::Src::LI((112 - remap_bias) << 23));\n  // Combine the mantissa and the exponent.\n  a.OpBFI(f32, dxbc::Src::LU(20), dxbc::Src::LU(23 - 20), mantissa_src,\n          exponent_src);\n}\n\nvoid DxbcShaderTranslator::ROV_DepthTo24Bit(uint32_t d24_temp,\n                                            uint32_t d24_temp_component,\n                                            uint32_t d32_temp,\n                                            uint32_t d32_temp_component,\n                                            uint32_t temp_temp,\n                                            uint32_t temp_temp_component) {\n  assert_true(temp_temp != d32_temp ||\n              temp_temp_component != d32_temp_component);\n  // Source and destination may be the same.\n\n  a_.OpAnd(dxbc::Dest::R(temp_temp, 1 << temp_temp_component),\n           LoadFlagsSystemConstant(), dxbc::Src::LU(kSysFlag_DepthFloat24));\n  // Convert according to the format.\n  a_.OpIf(true, dxbc::Src::R(temp_temp).Select(temp_temp_component));\n  {\n    // 20e4 conversion.\n    PreClampedDepthTo20e4(a_, d24_temp, d24_temp_component, d32_temp,\n                          d32_temp_component, temp_temp, temp_temp_component,\n                          true, false);\n  }\n  a_.OpElse();\n  {\n    // Unorm24 conversion.\n    dxbc::Dest d24_dest(dxbc::Dest::R(d24_temp, 1 << d24_temp_component));\n    dxbc::Src d24_src(dxbc::Src::R(d24_temp).Select(d24_temp_component));\n    a_.OpMul(d24_dest, dxbc::Src::R(d32_temp).Select(d32_temp_component),\n             dxbc::Src::LF(float(0xFFFFFF)));\n    // Round to the nearest even integer. This seems to be the correct way:\n    // rounding towards zero gives 0xFF instead of 0x100 in clear shaders in,\n    // for instance, 4D5307E6, but other clear shaders in it are also broken if\n    // 0.5 is added before ftou instead of round_ne.\n    a_.OpRoundNE(d24_dest, d24_src);\n    // Convert to fixed-point.\n    a_.OpFToU(d24_dest, d24_src);\n  }\n  a_.OpEndIf();\n}\n\n}  // namespace gpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/gpu_flags.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/gpu_flags.h\"\n\nDEFINE_path(trace_gpu_prefix, \"scratch/gpu/\",\n            \"Prefix path for GPU trace files.\", \"GPU\");\nDEFINE_bool(trace_gpu_stream, false, \"Trace all GPU packets.\", \"GPU\");\n\nDEFINE_path(\n    dump_shaders, \"\",\n    \"For shader debugging, path to dump GPU shaders to as they are compiled.\",\n    \"GPU\");\n\nDEFINE_bool(vsync, true, \"Enable VSYNC.\", \"GPU\");\n\nDEFINE_bool(\n    gpu_allow_invalid_fetch_constants, false,\n    \"Allow texture and vertex fetch constants with invalid type - generally \"\n    \"unsafe because the constant may contain completely invalid values, but \"\n    \"may be used to bypass fetch constant type errors in certain games until \"\n    \"the real reason why they're invalid is found.\",\n    \"GPU\");\n\nDEFINE_bool(\n    non_seamless_cube_map, true,\n    \"Disable filtering between cube map faces near edges where possible \"\n    \"(Vulkan with VK_EXT_non_seamless_cube_map) to reproduce the Direct3D 9 \"\n    \"behavior.\",\n    \"GPU\");\n\n// Extremely bright screen borders in 4D5307E6.\n// Reading between texels with half-pixel offset in 58410954.\nDEFINE_bool(\n    half_pixel_offset, true,\n    \"Enable support of vertex half-pixel offset (D3D9 PA_SU_VTX_CNTL \"\n    \"PIX_CENTER). Generally games are aware of the half-pixel offset, and \"\n    \"having this enabled is the correct behavior (disabling this may \"\n    \"significantly break post-processing in some games), but in certain games \"\n    \"it might have been ignored, resulting in slight blurriness of UI \"\n    \"textures, for instance, when they are read between texels rather than \"\n    \"at texel centers, or the leftmost/topmost pixels may not be fully covered \"\n    \"when MSAA is used with fullscreen passes.\",\n    \"GPU\");\n\nDEFINE_int32(query_occlusion_fake_sample_count, 1000,\n             \"If set to -1 no sample counts are written, games may hang. Else, \"\n             \"the sample count of every tile will be incremented on every \"\n             \"EVENT_WRITE_ZPD by this number. Setting this to 0 means \"\n             \"everything is reported as occluded.\",\n             \"GPU\");\n"
  },
  {
    "path": "src/xenia/gpu/gpu_flags.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_GPU_FLAGS_H_\n#define XENIA_GPU_GPU_FLAGS_H_\n#include \"xenia/base/cvar.h\"\n\nDECLARE_path(trace_gpu_prefix);\nDECLARE_bool(trace_gpu_stream);\n\nDECLARE_path(dump_shaders);\n\nDECLARE_bool(vsync);\n\nDECLARE_bool(gpu_allow_invalid_fetch_constants);\n\nDECLARE_bool(non_seamless_cube_map);\n\nDECLARE_bool(half_pixel_offset);\n\nDECLARE_int32(query_occlusion_fake_sample_count);\n\n#define XE_GPU_FINE_GRAINED_DRAW_SCOPES 1\n\n#endif  // XENIA_GPU_GPU_FLAGS_H_\n"
  },
  {
    "path": "src/xenia/gpu/graphics_system.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/graphics_system.h\"\n\n#include <cstdint>\n#include <functional>\n#include <memory>\n#include <mutex>\n#include <utility>\n\n#include \"xenia/base/byte_stream.h\"\n#include \"xenia/base/clock.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/profiling.h\"\n#include \"xenia/base/threading.h\"\n#include \"xenia/gpu/command_processor.h\"\n#include \"xenia/gpu/gpu_flags.h\"\n#include \"xenia/ui/graphics_provider.h\"\n#include \"xenia/ui/window.h\"\n#include \"xenia/ui/windowed_app_context.h\"\n\nDEFINE_bool(\n    store_shaders, true,\n    \"Store shaders persistently and load them when loading games to avoid \"\n    \"runtime spikes and freezes when playing the game not for the first time.\",\n    \"GPU\");\n\nnamespace xe {\nnamespace gpu {\n\n// Nvidia Optimus/AMD PowerXpress support.\n// These exports force the process to trigger the discrete GPU in multi-GPU\n// systems.\n// https://developer.download.nvidia.com/devzone/devcenter/gamegraphics/files/OptimusRenderingPolicies.pdf\n// https://stackoverflow.com/questions/17458803/amd-equivalent-to-nvoptimusenablement\n#if XE_PLATFORM_WIN32\nextern \"C\" {\n__declspec(dllexport) uint32_t NvOptimusEnablement = 0x00000001;\n__declspec(dllexport) uint32_t AmdPowerXpressRequestHighPerformance = 1;\n}  // extern \"C\"\n#endif  // XE_PLATFORM_WIN32\n\nGraphicsSystem::GraphicsSystem() : vsync_worker_running_(false) {}\n\nGraphicsSystem::~GraphicsSystem() = default;\n\nX_STATUS GraphicsSystem::Setup(cpu::Processor* processor,\n                               kernel::KernelState* kernel_state,\n                               ui::WindowedAppContext* app_context,\n                               bool with_presentation) {\n  memory_ = processor->memory();\n  processor_ = processor;\n  kernel_state_ = kernel_state;\n  app_context_ = app_context;\n\n  if (with_presentation && provider_) {\n    // Safe if either the UI thread call or the presenter creation fails.\n    if (app_context_) {\n      app_context_->CallInUIThreadSynchronous([this]() {\n        presenter_ = provider_->CreatePresenter(\n            [this](bool is_responsible, bool statically_from_ui_thread) {\n              OnHostGpuLossFromAnyThread(is_responsible);\n            });\n      });\n    } else {\n      // May be needed for offscreen use, such as capturing the guest output\n      // image.\n      presenter_ = provider_->CreatePresenter(\n          [this](bool is_responsible, bool statically_from_ui_thread) {\n            OnHostGpuLossFromAnyThread(is_responsible);\n          });\n    }\n  }\n\n  // Create command processor. This will spin up a thread to process all\n  // incoming ringbuffer packets.\n  command_processor_ = CreateCommandProcessor();\n  if (!command_processor_->Initialize()) {\n    XELOGE(\"Unable to initialize command processor\");\n    return X_STATUS_UNSUCCESSFUL;\n  }\n\n  // Let the processor know we want register access callbacks.\n  memory_->AddVirtualMappedRange(\n      0x7FC80000, 0xFFFF0000, 0x0000FFFF, this,\n      reinterpret_cast<cpu::MMIOReadCallback>(ReadRegisterThunk),\n      reinterpret_cast<cpu::MMIOWriteCallback>(WriteRegisterThunk));\n\n  // 60hz vsync timer.\n  vsync_worker_running_ = true;\n  vsync_worker_thread_ = kernel::object_ref<kernel::XHostThread>(\n      new kernel::XHostThread(kernel_state_, 128 * 1024, 0, [this]() {\n        uint64_t vsync_duration = cvars::vsync ? 16 : 1;\n        uint64_t last_frame_time = Clock::QueryGuestTickCount();\n        while (vsync_worker_running_) {\n          uint64_t current_time = Clock::QueryGuestTickCount();\n          uint64_t elapsed = (current_time - last_frame_time) /\n                             (Clock::guest_tick_frequency() / 1000);\n          if (elapsed >= vsync_duration) {\n            MarkVblank();\n            last_frame_time = current_time;\n          }\n          xe::threading::Sleep(std::chrono::milliseconds(1));\n        }\n        return 0;\n      }));\n  // As we run vblank interrupts the debugger must be able to suspend us.\n  vsync_worker_thread_->set_can_debugger_suspend(true);\n  vsync_worker_thread_->set_name(\"GPU VSync\");\n  vsync_worker_thread_->Create();\n\n  if (cvars::trace_gpu_stream) {\n    BeginTracing();\n  }\n\n  return X_STATUS_SUCCESS;\n}\n\nvoid GraphicsSystem::Shutdown() {\n  if (command_processor_) {\n    EndTracing();\n    command_processor_->Shutdown();\n    command_processor_.reset();\n  }\n\n  if (vsync_worker_thread_) {\n    vsync_worker_running_ = false;\n    vsync_worker_thread_->Wait(0, 0, 0, nullptr);\n    vsync_worker_thread_.reset();\n  }\n\n  if (presenter_) {\n    if (app_context_) {\n      app_context_->CallInUIThreadSynchronous([this]() { presenter_.reset(); });\n    }\n    // If there's no app context (thus the presenter is owned by the thread that\n    // initialized the GraphicsSystem) or can't be queueing UI thread calls\n    // anymore, shutdown anyway.\n    presenter_.reset();\n  }\n\n  provider_.reset();\n}\n\nvoid GraphicsSystem::OnHostGpuLossFromAnyThread(\n    [[maybe_unused]] bool is_responsible) {\n  // TODO(Triang3l): Somehow gain exclusive ownership of the Provider (may be\n  // used by the command processor, the presenter, and possibly anything else,\n  // it's considered free-threaded, except for lifetime management which will be\n  // involved in this case) and reset it so a new host GPU API device is\n  // created. Then ask the command processor to reset itself in its thread, and\n  // ask the UI thread to reset the Presenter (the UI thread manages its\n  // lifetime - but if there's no WindowedAppContext, either don't reset it as\n  // in this case there's no user who needs uninterrupted gameplay, or somehow\n  // protect it with a mutex so any thread can be considered a UI thread and\n  // reset).\n  if (host_gpu_loss_reported_.test_and_set(std::memory_order_relaxed)) {\n    return;\n  }\n  xe::FatalError(\"Graphics device lost (probably due to an internal error)\");\n}\n\nuint32_t GraphicsSystem::ReadRegisterThunk(void* ppc_context,\n                                           GraphicsSystem* gs, uint32_t addr) {\n  return gs->ReadRegister(addr);\n}\n\nvoid GraphicsSystem::WriteRegisterThunk(void* ppc_context, GraphicsSystem* gs,\n                                        uint32_t addr, uint32_t value) {\n  gs->WriteRegister(addr, value);\n}\n\nuint32_t GraphicsSystem::ReadRegister(uint32_t addr) {\n  uint32_t r = (addr & 0xFFFF) / 4;\n\n  switch (r) {\n    case 0x0F00:  // RB_EDRAM_TIMING\n      return 0x08100748;\n    case 0x0F01:  // RB_BC_CONTROL\n      return 0x0000200E;\n    case 0x194C:  // R500_D1MODE_V_COUNTER\n      return 0x000002D0;\n    case 0x1951:  // interrupt status\n      return 1;   // vblank\n    case 0x1961:  // AVIVO_D1MODE_VIEWPORT_SIZE\n                  // Screen res - 1280x720\n                  // maximum [width(0x0FFF), height(0x0FFF)]\n      return 0x050002D0;\n    default:\n      if (!register_file_.GetRegisterInfo(r)) {\n        XELOGE(\"GPU: Read from unknown register ({:04X})\", r);\n      }\n  }\n\n  assert_true(r < RegisterFile::kRegisterCount);\n  return register_file_.values[r];\n}\n\nvoid GraphicsSystem::WriteRegister(uint32_t addr, uint32_t value) {\n  uint32_t r = (addr & 0xFFFF) / 4;\n\n  switch (r) {\n    case 0x01C5:  // CP_RB_WPTR\n      command_processor_->UpdateWritePointer(value);\n      break;\n    case 0x1844:  // AVIVO_D1GRPH_PRIMARY_SURFACE_ADDRESS\n      break;\n    default:\n      XELOGW(\"Unknown GPU register {:04X} write: {:08X}\", r, value);\n      break;\n  }\n\n  assert_true(r < RegisterFile::kRegisterCount);\n  register_file_.values[r] = value;\n}\n\nvoid GraphicsSystem::InitializeRingBuffer(uint32_t ptr, uint32_t size_log2) {\n  command_processor_->InitializeRingBuffer(ptr, size_log2);\n}\n\nvoid GraphicsSystem::EnableReadPointerWriteBack(uint32_t ptr,\n                                                uint32_t block_size_log2) {\n  command_processor_->EnableReadPointerWriteBack(ptr, block_size_log2);\n}\n\nvoid GraphicsSystem::SetInterruptCallback(uint32_t callback,\n                                          uint32_t user_data) {\n  interrupt_callback_ = callback;\n  interrupt_callback_data_ = user_data;\n  XELOGGPU(\"SetInterruptCallback({:08X}, {:08X})\", callback, user_data);\n}\n\nvoid GraphicsSystem::DispatchInterruptCallback(uint32_t source, uint32_t cpu) {\n  if (!interrupt_callback_) {\n    return;\n  }\n\n  auto thread = kernel::XThread::GetCurrentThread();\n  assert_not_null(thread);\n\n  // Pick a CPU, if needed. We're going to guess 2. Because.\n  if (cpu == 0xFFFFFFFF) {\n    cpu = 2;\n  }\n  thread->SetActiveCpu(cpu);\n\n  // XELOGGPU(\"Dispatching GPU interrupt at {:08X} w/ mode {} on cpu {}\",\n  //          interrupt_callback_, source, cpu);\n\n  uint64_t args[] = {source, interrupt_callback_data_};\n  processor_->ExecuteInterrupt(thread->thread_state(), interrupt_callback_,\n                               args, xe::countof(args));\n}\n\nvoid GraphicsSystem::MarkVblank() {\n  SCOPE_profile_cpu_f(\"gpu\");\n\n  // Increment vblank counter (so the game sees us making progress).\n  command_processor_->increment_counter();\n\n  // TODO(benvanik): we shouldn't need to do the dispatch here, but there's\n  //     something wrong and the CP will block waiting for code that\n  //     needs to be run in the interrupt.\n  DispatchInterruptCallback(0, 2);\n}\n\nvoid GraphicsSystem::ClearCaches() {\n  command_processor_->CallInThread(\n      [&]() { command_processor_->ClearCaches(); });\n}\n\nvoid GraphicsSystem::InitializeShaderStorage(\n    const std::filesystem::path& cache_root, uint32_t title_id, bool blocking) {\n  if (!cvars::store_shaders) {\n    return;\n  }\n  if (blocking) {\n    if (command_processor_->is_paused()) {\n      // Safe to run on any thread while the command processor is paused, no\n      // race condition.\n      command_processor_->InitializeShaderStorage(cache_root, title_id, true);\n    } else {\n      xe::threading::Fence fence;\n      command_processor_->CallInThread([this, cache_root, title_id, &fence]() {\n        command_processor_->InitializeShaderStorage(cache_root, title_id, true);\n        fence.Signal();\n      });\n      fence.Wait();\n    }\n  } else {\n    command_processor_->CallInThread([this, cache_root, title_id]() {\n      command_processor_->InitializeShaderStorage(cache_root, title_id, false);\n    });\n  }\n}\n\nvoid GraphicsSystem::RequestFrameTrace() {\n  command_processor_->RequestFrameTrace(cvars::trace_gpu_prefix);\n}\n\nvoid GraphicsSystem::BeginTracing() {\n  command_processor_->BeginTracing(cvars::trace_gpu_prefix);\n}\n\nvoid GraphicsSystem::EndTracing() { command_processor_->EndTracing(); }\n\nvoid GraphicsSystem::Pause() {\n  paused_ = true;\n\n  command_processor_->Pause();\n}\n\nvoid GraphicsSystem::Resume() {\n  paused_ = false;\n\n  command_processor_->Resume();\n}\n\nbool GraphicsSystem::Save(ByteStream* stream) {\n  stream->Write<uint32_t>(interrupt_callback_);\n  stream->Write<uint32_t>(interrupt_callback_data_);\n\n  return command_processor_->Save(stream);\n}\n\nbool GraphicsSystem::Restore(ByteStream* stream) {\n  interrupt_callback_ = stream->Read<uint32_t>();\n  interrupt_callback_data_ = stream->Read<uint32_t>();\n\n  return command_processor_->Restore(stream);\n}\n\n}  // namespace gpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/graphics_system.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_GRAPHICS_SYSTEM_H_\n#define XENIA_GPU_GRAPHICS_SYSTEM_H_\n\n#include <atomic>\n#include <cstdint>\n#include <functional>\n#include <memory>\n#include <mutex>\n#include <string>\n#include <thread>\n\n#include \"xenia/cpu/processor.h\"\n#include \"xenia/gpu/register_file.h\"\n#include \"xenia/kernel/xthread.h\"\n#include \"xenia/memory.h\"\n#include \"xenia/ui/graphics_provider.h\"\n#include \"xenia/ui/presenter.h\"\n#include \"xenia/ui/windowed_app_context.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nclass Emulator;\n}  // namespace xe\n\nnamespace xe {\nnamespace gpu {\n\nclass CommandProcessor;\n\nclass GraphicsSystem {\n public:\n  virtual ~GraphicsSystem();\n\n  virtual std::string name() const = 0;\n\n  Memory* memory() const { return memory_; }\n  cpu::Processor* processor() const { return processor_; }\n  kernel::KernelState* kernel_state() const { return kernel_state_; }\n  ui::GraphicsProvider* provider() const { return provider_.get(); }\n  ui::Presenter* presenter() const { return presenter_.get(); }\n\n  virtual X_STATUS Setup(cpu::Processor* processor,\n                         kernel::KernelState* kernel_state,\n                         ui::WindowedAppContext* app_context,\n                         bool with_presentation);\n  virtual void Shutdown();\n\n  // May be called from any thread any number of times, even during recovery\n  // from a device loss.\n  void OnHostGpuLossFromAnyThread(bool is_responsible);\n\n  RegisterFile* register_file() { return &register_file_; }\n  CommandProcessor* command_processor() const {\n    return command_processor_.get();\n  }\n\n  virtual void InitializeRingBuffer(uint32_t ptr, uint32_t size_log2);\n  virtual void EnableReadPointerWriteBack(uint32_t ptr,\n                                          uint32_t block_size_log2);\n\n  virtual void SetInterruptCallback(uint32_t callback, uint32_t user_data);\n  void DispatchInterruptCallback(uint32_t source, uint32_t cpu);\n\n  virtual void ClearCaches();\n\n  void InitializeShaderStorage(const std::filesystem::path& cache_root,\n                               uint32_t title_id, bool blocking);\n\n  void RequestFrameTrace();\n  void BeginTracing();\n  void EndTracing();\n\n  bool is_paused() const { return paused_; }\n  void Pause();\n  void Resume();\n\n  bool Save(ByteStream* stream);\n  bool Restore(ByteStream* stream);\n\n protected:\n  GraphicsSystem();\n\n  virtual std::unique_ptr<CommandProcessor> CreateCommandProcessor() = 0;\n\n  static uint32_t ReadRegisterThunk(void* ppc_context, GraphicsSystem* gs,\n                                    uint32_t addr);\n  static void WriteRegisterThunk(void* ppc_context, GraphicsSystem* gs,\n                                 uint32_t addr, uint32_t value);\n  uint32_t ReadRegister(uint32_t addr);\n  void WriteRegister(uint32_t addr, uint32_t value);\n\n  void MarkVblank();\n\n  Memory* memory_ = nullptr;\n  cpu::Processor* processor_ = nullptr;\n  kernel::KernelState* kernel_state_ = nullptr;\n  ui::WindowedAppContext* app_context_ = nullptr;\n  std::unique_ptr<ui::GraphicsProvider> provider_;\n\n  uint32_t interrupt_callback_ = 0;\n  uint32_t interrupt_callback_data_ = 0;\n\n  std::atomic<bool> vsync_worker_running_;\n  kernel::object_ref<kernel::XHostThread> vsync_worker_thread_;\n\n  RegisterFile register_file_;\n  std::unique_ptr<CommandProcessor> command_processor_;\n\n  bool paused_ = false;\n\n private:\n  std::unique_ptr<ui::Presenter> presenter_;\n\n  std::atomic_flag host_gpu_loss_reported_;\n};\n\n}  // namespace gpu\n}  // namespace xe\n\n#endif  // XENIA_GPU_GRAPHICS_SYSTEM_H_\n"
  },
  {
    "path": "src/xenia/gpu/null/null_command_processor.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2016 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/null/null_command_processor.h\"\n\nnamespace xe {\nnamespace gpu {\nnamespace null {\n\nNullCommandProcessor::NullCommandProcessor(NullGraphicsSystem* graphics_system,\n                                           kernel::KernelState* kernel_state)\n    : CommandProcessor(graphics_system, kernel_state) {}\nNullCommandProcessor::~NullCommandProcessor() = default;\n\nvoid NullCommandProcessor::TracePlaybackWroteMemory(uint32_t base_ptr,\n                                                    uint32_t length) {}\n\nvoid NullCommandProcessor::RestoreEdramSnapshot(const void* snapshot) {}\n\nbool NullCommandProcessor::SetupContext() {\n  return CommandProcessor::SetupContext();\n}\n\nvoid NullCommandProcessor::ShutdownContext() {\n  return CommandProcessor::ShutdownContext();\n}\n\nvoid NullCommandProcessor::IssueSwap(uint32_t frontbuffer_ptr,\n                                     uint32_t frontbuffer_width,\n                                     uint32_t frontbuffer_height) {}\n\nShader* NullCommandProcessor::LoadShader(xenos::ShaderType shader_type,\n                                         uint32_t guest_address,\n                                         const uint32_t* host_address,\n                                         uint32_t dword_count) {\n  return nullptr;\n}\n\nbool NullCommandProcessor::IssueDraw(xenos::PrimitiveType prim_type,\n                                     uint32_t index_count,\n                                     IndexBufferInfo* index_buffer_info,\n                                     bool major_mode_explicit) {\n  return true;\n}\n\nbool NullCommandProcessor::IssueCopy() { return true; }\n\nvoid NullCommandProcessor::InitializeTrace() {}\n\n}  // namespace null\n}  // namespace gpu\n}  // namespace xe"
  },
  {
    "path": "src/xenia/gpu/null/null_command_processor.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2016 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_NULL_NULL_COMMAND_PROCESSOR_H_\n#define XENIA_GPU_NULL_NULL_COMMAND_PROCESSOR_H_\n\n#include \"xenia/gpu/command_processor.h\"\n#include \"xenia/gpu/null/null_graphics_system.h\"\n#include \"xenia/gpu/xenos.h\"\n#include \"xenia/kernel/kernel_state.h\"\n\nnamespace xe {\nnamespace gpu {\nnamespace null {\n\nclass NullCommandProcessor : public CommandProcessor {\n public:\n  NullCommandProcessor(NullGraphicsSystem* graphics_system,\n                       kernel::KernelState* kernel_state);\n  ~NullCommandProcessor();\n\n  void TracePlaybackWroteMemory(uint32_t base_ptr, uint32_t length) override;\n\n  void RestoreEdramSnapshot(const void* snapshot) override;\n\n private:\n  bool SetupContext() override;\n  void ShutdownContext() override;\n\n  void IssueSwap(uint32_t frontbuffer_ptr, uint32_t frontbuffer_width,\n                 uint32_t frontbuffer_height) override;\n\n  Shader* LoadShader(xenos::ShaderType shader_type, uint32_t guest_address,\n                     const uint32_t* host_address,\n                     uint32_t dword_count) override;\n\n  bool IssueDraw(xenos::PrimitiveType prim_type, uint32_t index_count,\n                 IndexBufferInfo* index_buffer_info,\n                 bool major_mode_explicit) override;\n  bool IssueCopy() override;\n\n  void InitializeTrace() override;\n};\n\n}  // namespace null\n}  // namespace gpu\n}  // namespace xe\n\n#endif  // XENIA_GPU_NULL_NULL_COMMAND_PROCESSOR_H_"
  },
  {
    "path": "src/xenia/gpu/null/null_graphics_system.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2016 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/null/null_graphics_system.h\"\n\n#include \"xenia/gpu/null//null_command_processor.h\"\n#include \"xenia/ui/vulkan/vulkan_provider.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace gpu {\nnamespace null {\n\nNullGraphicsSystem::NullGraphicsSystem() {}\n\nNullGraphicsSystem::~NullGraphicsSystem() {}\n\nX_STATUS NullGraphicsSystem::Setup(cpu::Processor* processor,\n                                   kernel::KernelState* kernel_state,\n                                   ui::WindowedAppContext* app_context,\n                                   bool with_presentation) {\n  // This is a null graphics system, but we still setup vulkan because UI needs\n  // it through us :|\n  provider_ = xe::ui::vulkan::VulkanProvider::Create(false, with_presentation);\n  return GraphicsSystem::Setup(processor, kernel_state, app_context,\n                               with_presentation);\n}\n\nstd::unique_ptr<CommandProcessor> NullGraphicsSystem::CreateCommandProcessor() {\n  return std::unique_ptr<CommandProcessor>(\n      new NullCommandProcessor(this, kernel_state_));\n}\n\n}  // namespace null\n}  // namespace gpu\n}  // namespace xe"
  },
  {
    "path": "src/xenia/gpu/null/null_graphics_system.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_NULL_NULL_GRAPHICS_SYSTEM_H_\n#define XENIA_GPU_NULL_NULL_GRAPHICS_SYSTEM_H_\n\n#include <memory>\n\n#include \"xenia/gpu/command_processor.h\"\n#include \"xenia/gpu/graphics_system.h\"\n\nnamespace xe {\nnamespace gpu {\nnamespace null {\n\nclass NullGraphicsSystem : public GraphicsSystem {\n public:\n  NullGraphicsSystem();\n  ~NullGraphicsSystem() override;\n\n  static bool IsAvailable() { return true; }\n\n  std::string name() const override { return \"null\"; }\n\n  X_STATUS Setup(cpu::Processor* processor, kernel::KernelState* kernel_state,\n                 ui::WindowedAppContext* app_context,\n                 bool with_presentation) override;\n\n private:\n  std::unique_ptr<CommandProcessor> CreateCommandProcessor() override;\n};\n\n}  // namespace null\n}  // namespace gpu\n}  // namespace xe\n\n#endif  // XENIA_GPU_NULL_NULL_GRAPHICS_SYSTEM_H_"
  },
  {
    "path": "src/xenia/gpu/null/premake5.lua",
    "content": "project_root = \"../../../..\"\ninclude(project_root..\"/tools/build\")\n\ngroup(\"src\")\nproject(\"xenia-gpu-null\")\n  uuid(\"42FCA0B3-4C20-4532-95E9-07D297013BE4\")\n  kind(\"StaticLib\")\n  language(\"C++\")\n  links({\n    \"xenia-base\",\n    \"xenia-gpu\",\n    \"xenia-ui\",\n    \"xenia-ui-vulkan\",\n    \"xxhash\",\n  })\n  includedirs({\n    project_root..\"/third_party/Vulkan-Headers/include\",\n  })\n  local_platform_files()\n"
  },
  {
    "path": "src/xenia/gpu/packet_disassembler.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2015 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/packet_disassembler.h\"\n\n#include \"xenia/gpu/xenos.h\"\n\nnamespace xe {\nnamespace gpu {\n\nusing namespace xe::gpu::xenos;\n\nPacketCategory PacketDisassembler::GetPacketCategory(const uint8_t* base_ptr) {\n  const uint32_t packet = xe::load_and_swap<uint32_t>(base_ptr);\n  const uint32_t packet_type = packet >> 30;\n  switch (packet_type) {\n    case 0x00:\n    case 0x01:\n    case 0x02: {\n      return PacketCategory::kGeneric;\n    }\n    case 0x03: {\n      uint32_t opcode = (packet >> 8) & 0x7F;\n      switch (opcode) {\n        case PM4_DRAW_INDX:\n        case PM4_DRAW_INDX_2:\n          return PacketCategory::kDraw;\n        case PM4_XE_SWAP:\n          return PacketCategory::kSwap;\n        default:\n          return PacketCategory::kGeneric;\n      }\n    }\n    default: {\n      assert_unhandled_case(packet_type);\n      return PacketCategory::kGeneric;\n    }\n  }\n}\n\nbool PacketDisassembler::DisasmPacketType0(const uint8_t* base_ptr,\n                                           uint32_t packet,\n                                           PacketInfo* out_info) {\n  static const PacketTypeInfo type_0_info = {PacketCategory::kGeneric,\n                                             \"PM4_TYPE0\"};\n  out_info->type_info = &type_0_info;\n\n  uint32_t count = ((packet >> 16) & 0x3FFF) + 1;\n  out_info->count = 1 + count;\n  auto ptr = base_ptr + 4;\n\n  uint32_t base_index = (packet & 0x7FFF);\n  uint32_t write_one_reg = (packet >> 15) & 0x1;\n  for (uint32_t m = 0; m < count; m++) {\n    uint32_t reg_data = xe::load_and_swap<uint32_t>(ptr);\n    uint32_t target_index = write_one_reg ? base_index : base_index + m;\n    out_info->actions.emplace_back(\n        PacketAction::RegisterWrite(target_index, reg_data));\n    ptr += 4;\n  }\n\n  return true;\n}\n\nbool PacketDisassembler::DisasmPacketType1(const uint8_t* base_ptr,\n                                           uint32_t packet,\n                                           PacketInfo* out_info) {\n  static const PacketTypeInfo type_1_info = {PacketCategory::kGeneric,\n                                             \"PM4_TYPE1\"};\n  out_info->type_info = &type_1_info;\n\n  out_info->count = 1 + 2;\n  auto ptr = base_ptr + 4;\n\n  uint32_t reg_index_1 = packet & 0x7FF;\n  uint32_t reg_index_2 = (packet >> 11) & 0x7FF;\n  uint32_t reg_data_1 = xe::load_and_swap<uint32_t>(ptr);\n  uint32_t reg_data_2 = xe::load_and_swap<uint32_t>(ptr + 4);\n  out_info->actions.emplace_back(\n      PacketAction::RegisterWrite(reg_index_1, reg_data_1));\n  out_info->actions.emplace_back(\n      PacketAction::RegisterWrite(reg_index_2, reg_data_2));\n\n  return true;\n}\n\nbool PacketDisassembler::DisasmPacketType2(const uint8_t* base_ptr,\n                                           uint32_t packet,\n                                           PacketInfo* out_info) {\n  static const PacketTypeInfo type_2_info = {PacketCategory::kGeneric,\n                                             \"PM4_TYPE2\"};\n  out_info->type_info = &type_2_info;\n\n  out_info->count = 1;\n\n  return true;\n}\n\nbool PacketDisassembler::DisasmPacketType3(const uint8_t* base_ptr,\n                                           uint32_t packet,\n                                           PacketInfo* out_info) {\n  static const PacketTypeInfo type_3_unknown_info = {PacketCategory::kGeneric,\n                                                     \"PM4_TYPE3_UNKNOWN\"};\n  out_info->type_info = &type_3_unknown_info;\n\n  uint32_t opcode = (packet >> 8) & 0x7F;\n  uint32_t count = ((packet >> 16) & 0x3FFF) + 1;\n  out_info->count = 1 + count;\n  auto ptr = base_ptr + 4;\n\n  if (packet & 1) {\n    out_info->predicated = true;\n  }\n\n  bool result = true;\n  switch (opcode) {\n    case PM4_ME_INIT: {\n      // initialize CP's micro-engine\n      static const PacketTypeInfo op_info = {PacketCategory::kGeneric,\n                                             \"PM4_ME_INIT\"};\n      out_info->type_info = &op_info;\n      break;\n    }\n    case PM4_NOP: {\n      // skip N 32-bit words to get to the next packet\n      // No-op, ignore some data.\n      static const PacketTypeInfo op_info = {PacketCategory::kGeneric,\n                                             \"PM4_NOP\"};\n      out_info->type_info = &op_info;\n      break;\n    }\n    case PM4_INTERRUPT: {\n      // generate interrupt from the command stream\n      static const PacketTypeInfo op_info = {PacketCategory::kGeneric,\n                                             \"PM4_INTERRUPT\"};\n      out_info->type_info = &op_info;\n      uint32_t cpu_mask = xe::load_and_swap<uint32_t>(ptr + 0);\n      for (int n = 0; n < 6; n++) {\n        if (cpu_mask & (1 << n)) {\n          // graphics_system_->DispatchInterruptCallback(1, n);\n        }\n      }\n      break;\n    }\n    case PM4_XE_SWAP: {\n      // Xenia-specific VdSwap hook.\n      // VdSwap will post this to tell us we need to swap the screen/fire an\n      // interrupt.\n      // 63 words here, but only the first has any data.\n      static const PacketTypeInfo op_info = {PacketCategory::kSwap,\n                                             \"PM4_XE_SWAP\"};\n      out_info->type_info = &op_info;\n      uint32_t frontbuffer_ptr = xe::load_and_swap<uint32_t>(ptr + 0);\n      break;\n    }\n    case PM4_INDIRECT_BUFFER:\n    case PM4_INDIRECT_BUFFER_PFD: {\n      // indirect buffer dispatch\n      static const PacketTypeInfo op_info = {PacketCategory::kGeneric,\n                                             \"PM4_INDIRECT_BUFFER\"};\n      out_info->type_info = &op_info;\n      uint32_t list_ptr = xe::load_and_swap<uint32_t>(ptr + 0);\n      uint32_t list_length = xe::load_and_swap<uint32_t>(ptr + 4);\n      break;\n    }\n    case PM4_WAIT_REG_MEM: {\n      // wait until a register or memory location is a specific value\n      static const PacketTypeInfo op_info = {PacketCategory::kGeneric,\n                                             \"PM4_WAIT_REG_MEM\"};\n      out_info->type_info = &op_info;\n      uint32_t wait_info = xe::load_and_swap<uint32_t>(ptr + 0);\n      uint32_t poll_reg_addr = xe::load_and_swap<uint32_t>(ptr + 4);\n      uint32_t ref = xe::load_and_swap<uint32_t>(ptr + 8);\n      uint32_t mask = xe::load_and_swap<uint32_t>(ptr + 12);\n      uint32_t wait = xe::load_and_swap<uint32_t>(ptr + 16);\n      break;\n    }\n    case PM4_REG_RMW: {\n      // register read/modify/write\n      // ? (used during shader upload and edram setup)\n      static const PacketTypeInfo op_info = {PacketCategory::kGeneric,\n                                             \"PM4_REG_RMW\"};\n      out_info->type_info = &op_info;\n      uint32_t rmw_info = xe::load_and_swap<uint32_t>(ptr + 0);\n      uint32_t and_mask = xe::load_and_swap<uint32_t>(ptr + 4);\n      uint32_t or_mask = xe::load_and_swap<uint32_t>(ptr + 8);\n      break;\n    }\n    case PM4_COND_WRITE: {\n      // conditional write to memory or register\n      static const PacketTypeInfo op_info = {PacketCategory::kGeneric,\n                                             \"PM4_COND_WRITE\"};\n      out_info->type_info = &op_info;\n      uint32_t wait_info = xe::load_and_swap<uint32_t>(ptr + 0);\n      uint32_t poll_reg_addr = xe::load_and_swap<uint32_t>(ptr + 4);\n      uint32_t ref = xe::load_and_swap<uint32_t>(ptr + 8);\n      uint32_t mask = xe::load_and_swap<uint32_t>(ptr + 12);\n      uint32_t write_reg_addr = xe::load_and_swap<uint32_t>(ptr + 16);\n      uint32_t write_data = xe::load_and_swap<uint32_t>(ptr + 20);\n      break;\n    }\n    case PM4_EVENT_WRITE: {\n      // generate an event that creates a write to memory when completed\n      static const PacketTypeInfo op_info = {PacketCategory::kGeneric,\n                                             \"PM4_EVENT_WRITE\"};\n      out_info->type_info = &op_info;\n      uint32_t initiator = xe::load_and_swap<uint32_t>(ptr + 0);\n      break;\n    }\n    case PM4_EVENT_WRITE_SHD: {\n      // generate a VS|PS_done event\n      static const PacketTypeInfo op_info = {PacketCategory::kGeneric,\n                                             \"PM4_EVENT_WRITE_SHD\"};\n      out_info->type_info = &op_info;\n      uint32_t initiator = xe::load_and_swap<uint32_t>(ptr + 0);\n      uint32_t address = xe::load_and_swap<uint32_t>(ptr + 4);\n      uint32_t value = xe::load_and_swap<uint32_t>(ptr + 8);\n      break;\n    }\n    case PM4_EVENT_WRITE_EXT: {\n      // generate a screen extent event\n      static const PacketTypeInfo op_info = {PacketCategory::kGeneric,\n                                             \"PM4_EVENT_WRITE_EXT\"};\n      out_info->type_info = &op_info;\n      uint32_t unk0 = xe::load_and_swap<uint32_t>(ptr + 0);\n      uint32_t unk1 = xe::load_and_swap<uint32_t>(ptr + 4);\n      break;\n    }\n    case PM4_DRAW_INDX: {\n      // initiate fetch of index buffer and draw\n      // dword0 = viz query info\n      static const PacketTypeInfo op_info = {PacketCategory::kDraw,\n                                             \"PM4_DRAW_INDX\"};\n      out_info->type_info = &op_info;\n      uint32_t dword0 = xe::load_and_swap<uint32_t>(ptr + 0);\n      uint32_t dword1 = xe::load_and_swap<uint32_t>(ptr + 4);\n      uint32_t index_count = dword1 >> 16;\n      auto prim_type = static_cast<xenos::PrimitiveType>(dword1 & 0x3F);\n      uint32_t src_sel = (dword1 >> 6) & 0x3;\n      if (src_sel == 0x0) {\n        // Indexed draw.\n        uint32_t guest_base = xe::load_and_swap<uint32_t>(ptr + 8);\n        uint32_t index_size = xe::load_and_swap<uint32_t>(ptr + 12);\n        auto endianness = static_cast<xenos::Endian>(index_size >> 30);\n        index_size &= 0x00FFFFFF;\n        bool index_32bit = (dword1 >> 11) & 0x1;\n        index_size *= index_32bit ? 4 : 2;\n      } else if (src_sel == 0x2) {\n        // Auto draw.\n      } else {\n        // Unknown source select.\n        assert_always();\n      }\n      break;\n    }\n    case PM4_DRAW_INDX_2: {\n      // draw using supplied indices in packet\n      static const PacketTypeInfo op_info = {PacketCategory::kDraw,\n                                             \"PM4_DRAW_INDX_2\"};\n      out_info->type_info = &op_info;\n      uint32_t dword0 = xe::load_and_swap<uint32_t>(ptr + 0);\n      uint32_t index_count = dword0 >> 16;\n      auto prim_type = static_cast<xenos::PrimitiveType>(dword0 & 0x3F);\n      uint32_t src_sel = (dword0 >> 6) & 0x3;\n      assert_true(src_sel == 0x2);  // 'SrcSel=AutoIndex'\n      bool index_32bit = (dword0 >> 11) & 0x1;\n      uint32_t indices_size = index_count * (index_32bit ? 4 : 2);\n      auto index_ptr = ptr + 4;\n      break;\n    }\n    case PM4_SET_CONSTANT: {\n      // load constant into chip and to memory\n      // PM4_REG(reg) ((0x4 << 16) | (GSL_HAL_SUBBLOCK_OFFSET(reg)))\n      //                                     reg - 0x2000\n      static const PacketTypeInfo op_info = {PacketCategory::kGeneric,\n                                             \"PM4_SET_CONSTANT\"};\n      out_info->type_info = &op_info;\n      uint32_t offset_type = xe::load_and_swap<uint32_t>(ptr + 0);\n      uint32_t index = offset_type & 0x7FF;\n      uint32_t type = (offset_type >> 16) & 0xFF;\n      switch (type) {\n        case 0:  // ALU\n          index += 0x4000;\n          break;\n        case 1:  // FETCH\n          index += 0x4800;\n          break;\n        case 2:  // BOOL\n          index += 0x4900;\n          break;\n        case 3:  // LOOP\n          index += 0x4908;\n          break;\n        case 4:  // REGISTERS\n          index += 0x2000;\n          break;\n        default:\n          assert_always();\n          result = false;\n          break;\n      }\n      for (uint32_t n = 0; n < count - 1; n++, index++) {\n        uint32_t data = xe::load_and_swap<uint32_t>(ptr + 4 + n * 4);\n        out_info->actions.emplace_back(\n            PacketAction::RegisterWrite(index, data));\n      }\n      break;\n    }\n    case PM4_SET_CONSTANT2: {\n      static const PacketTypeInfo op_info = {PacketCategory::kGeneric,\n                                             \"PM4_SET_CONSTANT2\"};\n      out_info->type_info = &op_info;\n      uint32_t offset_type = xe::load_and_swap<uint32_t>(ptr + 0);\n      uint32_t index = offset_type & 0xFFFF;\n      for (uint32_t n = 0; n < count - 1; n++, index++) {\n        uint32_t data = xe::load_and_swap<uint32_t>(ptr + 4 + n * 4);\n        out_info->actions.emplace_back(\n            PacketAction::RegisterWrite(index, data));\n      }\n      return true;\n      break;\n    }\n    case PM4_LOAD_ALU_CONSTANT: {\n      // load constants from memory\n      static const PacketTypeInfo op_info = {PacketCategory::kGeneric,\n                                             \"PM4_LOAD_ALU_CONSTANT\"};\n      out_info->type_info = &op_info;\n      uint32_t address = xe::load_and_swap<uint32_t>(ptr + 0);\n      address &= 0x3FFFFFFF;\n      uint32_t offset_type = xe::load_and_swap<uint32_t>(ptr + 4);\n      uint32_t index = offset_type & 0x7FF;\n      uint32_t size_dwords = xe::load_and_swap<uint32_t>(ptr + 8);\n      size_dwords &= 0xFFF;\n      uint32_t type = (offset_type >> 16) & 0xFF;\n      switch (type) {\n        case 0:  // ALU\n          index += 0x4000;\n          break;\n        case 1:  // FETCH\n          index += 0x4800;\n          break;\n        case 2:  // BOOL\n          index += 0x4900;\n          break;\n        case 3:  // LOOP\n          index += 0x4908;\n          break;\n        case 4:  // REGISTERS\n          index += 0x2000;\n          break;\n        default:\n          assert_always();\n          return true;\n      }\n      for (uint32_t n = 0; n < size_dwords; n++, index++) {\n        // Hrm, ?\n        // xe::load_and_swap<uint32_t>(membase_ + GpuToCpu(address + n * 4));\n        uint32_t data = 0xDEADBEEF;\n        out_info->actions.emplace_back(\n            PacketAction::RegisterWrite(index, data));\n      }\n      break;\n    }\n    case PM4_SET_SHADER_CONSTANTS: {\n      static const PacketTypeInfo op_info = {PacketCategory::kGeneric,\n                                             \"PM4_SET_SHADER_CONSTANTS\"};\n      out_info->type_info = &op_info;\n      uint32_t offset_type = xe::load_and_swap<uint32_t>(ptr + 0);\n      uint32_t index = offset_type & 0xFFFF;\n      for (uint32_t n = 0; n < count - 1; n++, index++) {\n        uint32_t data = xe::load_and_swap<uint32_t>(ptr + 4 + n * 4);\n        out_info->actions.emplace_back(\n            PacketAction::RegisterWrite(index, data));\n      }\n      return true;\n    }\n    case PM4_IM_LOAD: {\n      // load sequencer instruction memory (pointer-based)\n      static const PacketTypeInfo op_info = {PacketCategory::kGeneric,\n                                             \"PM4_IM_LOAD\"};\n      out_info->type_info = &op_info;\n      uint32_t addr_type = xe::load_and_swap<uint32_t>(ptr + 0);\n      auto shader_type = static_cast<xenos::ShaderType>(addr_type & 0x3);\n      uint32_t addr = addr_type & ~0x3;\n      uint32_t start_size = xe::load_and_swap<uint32_t>(ptr + 4);\n      uint32_t start = start_size >> 16;\n      uint32_t size_dwords = start_size & 0xFFFF;  // dwords\n      assert_true(start == 0);\n      break;\n    }\n    case PM4_IM_LOAD_IMMEDIATE: {\n      // load sequencer instruction memory (code embedded in packet)\n      static const PacketTypeInfo op_info = {PacketCategory::kGeneric,\n                                             \"PM4_IM_LOAD_IMMEDIATE\"};\n      out_info->type_info = &op_info;\n      uint32_t dword0 = xe::load_and_swap<uint32_t>(ptr + 0);\n      uint32_t dword1 = xe::load_and_swap<uint32_t>(ptr + 4);\n      auto shader_type = static_cast<xenos::ShaderType>(dword0);\n      uint32_t start_size = dword1;\n      uint32_t start = start_size >> 16;\n      uint32_t size_dwords = start_size & 0xFFFF;  // dwords\n      assert_true(start == 0);\n      break;\n    }\n    case PM4_INVALIDATE_STATE: {\n      // selective invalidation of state pointers\n      static const PacketTypeInfo op_info = {PacketCategory::kGeneric,\n                                             \"PM4_INVALIDATE_STATE\"};\n      out_info->type_info = &op_info;\n      uint32_t mask = xe::load_and_swap<uint32_t>(ptr + 0);\n      break;\n    }\n    case PM4_SET_BIN_MASK_LO: {\n      static const PacketTypeInfo op_info = {PacketCategory::kGeneric,\n                                             \"PM4_SET_BIN_MASK_LO\"};\n      out_info->type_info = &op_info;\n      uint32_t value = xe::load_and_swap<uint32_t>(ptr);\n      // bin_mask_ = (bin_mask_ & 0xFFFFFFFF00000000ull) | value;\n      out_info->actions.emplace_back(PacketAction::SetBinMask(value));\n      break;\n    }\n    case PM4_SET_BIN_MASK_HI: {\n      static const PacketTypeInfo op_info = {PacketCategory::kGeneric,\n                                             \"PM4_SET_BIN_MASK_HI\"};\n      out_info->type_info = &op_info;\n      uint32_t value = xe::load_and_swap<uint32_t>(ptr);\n      // bin_mask_ =\n      //  (bin_mask_ & 0xFFFFFFFFull) | (static_cast<uint64_t>(value) << 32);\n      break;\n    }\n    case PM4_SET_BIN_SELECT_LO: {\n      static const PacketTypeInfo op_info = {PacketCategory::kGeneric,\n                                             \"PM4_SET_BIN_SELECT_LO\"};\n      out_info->type_info = &op_info;\n      uint32_t value = xe::load_and_swap<uint32_t>(ptr);\n      // bin_select_ = (bin_select_ & 0xFFFFFFFF00000000ull) | value;\n      out_info->actions.emplace_back(PacketAction::SetBinSelect(value));\n      break;\n    }\n    case PM4_SET_BIN_SELECT_HI: {\n      static const PacketTypeInfo op_info = {PacketCategory::kGeneric,\n                                             \"PM4_SET_BIN_SELECT_HI\"};\n      out_info->type_info = &op_info;\n      uint32_t value = xe::load_and_swap<uint32_t>(ptr);\n      // bin_select_ =\n      //  (bin_select_ & 0xFFFFFFFFull) | (static_cast<uint64_t>(value) <<\n      //  32);\n      break;\n    }\n\n    // Ignored packets - useful if breaking on the default handler below.\n    case 0x50: {  // 0xC0015000 usually 2 words, 0xFFFFFFFF / 0x00000000\n      static const PacketTypeInfo op_info = {PacketCategory::kGeneric,\n                                             \"PM4_TYPE3_0x50\"};\n      out_info->type_info = &op_info;\n      break;\n    }\n    case 0x51: {  // 0xC0015100 usually 2 words, 0xFFFFFFFF / 0xFFFFFFFF\n      static const PacketTypeInfo op_info = {PacketCategory::kGeneric,\n                                             \"PM4_TYPE3_0x51\"};\n      out_info->type_info = &op_info;\n      break;\n    }\n    default: {\n      result = false;\n      break;\n    }\n  }\n\n  return result;\n}\n\nbool PacketDisassembler::DisasmPacket(const uint8_t* base_ptr,\n                                      PacketInfo* out_info) {\n  const uint32_t packet = xe::load_and_swap<uint32_t>(base_ptr);\n  const uint32_t packet_type = packet >> 30;\n  switch (packet_type) {\n    case 0x00:\n      return DisasmPacketType0(base_ptr, packet, out_info);\n    case 0x01:\n      return DisasmPacketType1(base_ptr, packet, out_info);\n    case 0x02:\n      return DisasmPacketType2(base_ptr, packet, out_info);\n    case 0x03:\n      return DisasmPacketType3(base_ptr, packet, out_info);\n    default:\n      assert_unhandled_case(packet_type);\n      return false;\n  }\n}\n\n}  //  namespace gpu\n}  //  namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/packet_disassembler.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2015 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_PACKET_DISASSEMBLER_H_\n#define XENIA_GPU_PACKET_DISASSEMBLER_H_\n\n#include <vector>\n\n#include \"xenia/gpu/register_file.h\"\n#include \"xenia/gpu/trace_protocol.h\"\n#include \"xenia/gpu/trace_reader.h\"\n#include \"xenia/memory.h\"\n\nnamespace xe {\nnamespace gpu {\n\nenum class PacketCategory {\n  kGeneric,\n  kDraw,\n  kSwap,\n};\n\nstruct PacketTypeInfo {\n  PacketCategory category;\n  const char* name;\n};\n\nstruct PacketAction {\n  enum class Type {\n    kRegisterWrite,\n    kSetBinMask,\n    kSetBinSelect,\n  };\n  Type type;\n\n  union {\n    struct {\n      uint32_t index;\n      uint32_t value;\n    } register_write;\n    struct {\n      uint64_t value;\n    } set_bin_mask;\n    struct {\n      uint64_t value;\n    } set_bin_select;\n  };\n\n  static PacketAction RegisterWrite(uint32_t index, uint32_t value) {\n    PacketAction action;\n    action.type = Type::kRegisterWrite;\n    action.register_write.index = index;\n    action.register_write.value = value;\n    return action;\n  }\n\n  static PacketAction SetBinMask(uint64_t value) {\n    PacketAction action;\n    action.type = Type::kSetBinMask;\n    action.set_bin_mask.value = value;\n    return action;\n  }\n\n  static PacketAction SetBinSelect(uint64_t value) {\n    PacketAction action;\n    action.type = Type::kSetBinSelect;\n    action.set_bin_select.value = value;\n    return action;\n  }\n};\n\nstruct PacketInfo {\n  const PacketTypeInfo* type_info;\n  bool predicated;\n  uint32_t count;\n  std::vector<PacketAction> actions;\n};\n\nclass PacketDisassembler {\n public:\n  static PacketCategory GetPacketCategory(const uint8_t* base_ptr);\n\n  static bool DisasmPacketType0(const uint8_t* base_ptr, uint32_t packet,\n                                PacketInfo* out_info);\n  static bool DisasmPacketType1(const uint8_t* base_ptr, uint32_t packet,\n                                PacketInfo* out_info);\n  static bool DisasmPacketType2(const uint8_t* base_ptr, uint32_t packet,\n                                PacketInfo* out_info);\n  static bool DisasmPacketType3(const uint8_t* base_ptr, uint32_t packet,\n                                PacketInfo* out_info);\n  static bool DisasmPacket(const uint8_t* base_ptr, PacketInfo* out_info);\n};\n\n}  // namespace gpu\n}  // namespace xe\n\n#endif  // XENIA_GPU_PACKET_DISASSEMBLER_H_\n"
  },
  {
    "path": "src/xenia/gpu/premake5.lua",
    "content": "project_root = \"../../..\"\ninclude(project_root..\"/tools/build\")\n\ngroup(\"src\")\nproject(\"xenia-gpu\")\n  uuid(\"0e8d3370-e4b1-4b05-a2e8-39ebbcdf9b17\")\n  kind(\"StaticLib\")\n  language(\"C++\")\n  links({\n    \"dxbc\",\n    \"fmt\",\n    \"glslang-spirv\",\n    \"snappy\",\n    \"xenia-base\",\n    \"xenia-ui\",\n    \"xxhash\",\n  })\n  includedirs({\n    project_root..\"/third_party/Vulkan-Headers/include\",\n  })\n  local_platform_files()\n\ngroup(\"src\")\nproject(\"xenia-gpu-shader-compiler\")\n  uuid(\"ad76d3e4-4c62-439b-a0f6-f83fcf0e83c5\")\n  kind(\"ConsoleApp\")\n  language(\"C++\")\n  links({\n    \"dxbc\",\n    \"fmt\",\n    \"glslang-spirv\",\n    \"snappy\",\n    \"xenia-base\",\n    \"xenia-gpu\",\n    \"xenia-ui\",\n    \"xenia-ui-vulkan\",\n  })\n  includedirs({\n    project_root..\"/third_party/Vulkan-Headers/include\",\n  })\n  files({\n    \"shader_compiler_main.cc\",\n    \"../base/console_app_main_\"..platform_suffix..\".cc\",\n  })\n\n  filter(\"platforms:Windows\")\n    -- Only create the .user file if it doesn't already exist.\n    local user_file = project_root..\"/build/xenia-gpu-shader-compiler.vcxproj.user\"\n    if not os.isfile(user_file) then\n      debugdir(project_root)\n      debugargs({\n        \"2>&1\",\n        \"1>scratch/stdout-shader-compiler.txt\",\n      })\n    end\n"
  },
  {
    "path": "src/xenia/gpu/primitive_processor.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/primitive_processor.h\"\n\n#include <algorithm>\n#include <cstring>\n#include <functional>\n#include <utility>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/byte_order.h\"\n#include \"xenia/base/cvar.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/profiling.h\"\n#include \"xenia/gpu/register_file.h\"\n#include \"xenia/gpu/registers.h\"\n#include \"xenia/gpu/shader.h\"\n#include \"xenia/gpu/trace_writer.h\"\n#include \"xenia/gpu/xenos.h\"\n\n// All these overrides are always safe to use as all backends are expected to\n// support triangle lists and line strips.\nDEFINE_bool(\n    force_convert_triangle_fans_to_lists, false,\n    \"For host graphics API downlevel support testing only, force CPU \"\n    \"conversion of triangle fans to triangle lists even if the host supports \"\n    \"triangle fan primitives natively.\",\n    \"GPU\");\nDEFINE_bool(\n    force_convert_line_loops_to_strips, false,\n    \"For host graphics API downlevel support testing only, force CPU \"\n    \"conversion of line loops to line strips even if the host supports line \"\n    \"loop primitives natively.\",\n    \"GPU\");\nDEFINE_bool(\n    force_convert_quad_lists_to_triangle_lists, false,\n    \"For host graphics API downlevel support testing only, force CPU \"\n    \"conversion of quad lists to quad strips even if the host supports quad \"\n    \"list primitives natively or via geometry shader emulation.\\n\"\n    \"May also be useful for graphics debugging when the debugger doesn't \"\n    \"display the geometry generated by geometry shaders properly.\",\n    \"GPU\");\nDEFINE_bool(\n    ignore_32bit_vertex_index_support, false,\n    \"For host graphics API downlevel testing only (useful only for Qualcomm \"\n    \"Adreno 4xx-level host GPU testing), force indirection or pre-masking and \"\n    \"pre-swapping of 32-bit vertex indices as if the host only supports 24-bit \"\n    \"indices.\",\n    \"GPU\");\n// TODO(Triang3l): More investigation of the cache threshold as cache lookups\n// and insertions require global critical region locking, and insertions also\n// require protecting pages. At 1024, the cache only made the performance worse\n// (415607D4, 16-bit primitive reset index replacement).\nDEFINE_int32(\n    primitive_processor_cache_min_indices, 4096,\n    \"Smallest number of guest indices to store in the cache to try reusing \"\n    \"later in the same frame if processing (such as primitive type conversion \"\n    \"or reset index replacement) is performed.\\n\"\n    \"Setting this to a very high value may result in excessive CPU processing, \"\n    \"while a very low value may result in excessive locking and lookups.\\n\"\n    \"Negative values disable caching.\",\n    \"GPU\");\n\nnamespace xe {\nnamespace gpu {\n\n// SIMD processing here assumes that alignment is not required (neither AVX nor\n// Neon requires it) and there's no punishment for using an unaligned access\n// instruction when the data is actually aligned (AVX has separate aligned /\n// unaligned movs, but they have the same performance nowadays; Neon dropped the\n// alignment specifier in AArch64), but truly unaligned access may result in two\n// hardware memory operations if some boundary that is >= vector size is\n// crossed.\n//\n// Therefore, to minimize unaligned access (primarily reads - since we depend on\n// the data immediately), SIMD usage here is performed according to the\n// following pattern (though we try to co-align the destination and the source\n// prior to calling, but still doing all the operations for more code\n// correctness and fewer unobvious conditions):\n// - Until the source pointer is vector-aligned, process the first indices\n//   without SIMD.\n//   - The best possible outcome of this is that both the source and the\n//     destination will be vector-aligned (if they were co-aligned prior to the\n//     call), in this case, neither load nor store instructions will be crossing\n//     cache lines.\n//   - The other possible outcome is that the source will be aligned (1 memory\n//     read per load), while the destination will be unaligned (1-2 memory\n//     writes per store).\n// - Process whole vectors with SIMD.\n// - If there are less elements than a vector can hold remaining, process them\n//   without SIMD.\n//\n// We assume that indices are at least aligned to their natural alignment (2 or\n// 4 bytes depending on the format) - the R6xx documentation says that in\n// DRAW_INDEX, INDEX_BASE_LO is word-aligned, and that's required by host\n// graphics APIs.\n\nPrimitiveProcessor::~PrimitiveProcessor() { ShutdownCommon(); }\n\nbool PrimitiveProcessor::InitializeCommon(\n    bool full_32bit_vertex_indices_supported, bool triangle_fans_supported,\n    bool line_loops_supported, bool quad_lists_supported,\n    bool point_sprites_supported_without_vs_expansion,\n    bool rectangle_lists_supported_without_vs_expansion) {\n  full_32bit_vertex_indices_used_ = full_32bit_vertex_indices_supported;\n  convert_triangle_fans_to_lists_ =\n      !triangle_fans_supported || cvars::force_convert_triangle_fans_to_lists;\n  convert_line_loops_to_strips_ =\n      !line_loops_supported || cvars::force_convert_line_loops_to_strips;\n  convert_quad_lists_to_triangle_lists_ =\n      !quad_lists_supported ||\n      cvars::force_convert_quad_lists_to_triangle_lists;\n  // No override cvars as hosts are not required to support the fallback paths\n  // since they require different vertex shader structure (for the fallback\n  // HostVertexShaderTypes).\n  expand_point_sprites_in_vs_ = !point_sprites_supported_without_vs_expansion;\n  expand_rectangle_lists_in_vs_ =\n      !rectangle_lists_supported_without_vs_expansion;\n\n  // Initialize the index buffer for conversion of auto-indexed primitive types.\n  size_t builtin_index_buffer_size = 0;\n  // 32-bit, before 16-bit due to alignment (for primitive expansion - when the\n  // indices encode not only the guest vertex index, but also a part needed for\n  // host expansion, thus may contain values above UINT16_MAX, such as up to\n  // (UINT16_MAX - 1) * 4 + 3 for point sprites).\n  // Using an index buffer for point sprite and rectangle list expansion instead\n  // of instancing as how instancing is implemented may vary wildly between\n  // GPUs, potentially slowly (like no different instances in the same\n  // wavefront) with small vertex counts per instance. Also using triangle\n  // strips with primitive restart, not triangle lists, so the vertex shader may\n  // be invoked once for the inner edge vertices, which is important for memory\n  // export in guest shaders, not to write to the same location from two\n  // invocations.\n  uint32_t builtin_ib_two_triangle_strip_count = 0;\n  if (expand_point_sprites_in_vs_) {\n    builtin_ib_two_triangle_strip_count =\n        std::max(uint32_t(UINT16_MAX), builtin_ib_two_triangle_strip_count);\n  }\n  if (expand_rectangle_lists_in_vs_) {\n    builtin_ib_two_triangle_strip_count =\n        std::max(uint32_t(UINT16_MAX / 3), builtin_ib_two_triangle_strip_count);\n  }\n  if (builtin_ib_two_triangle_strip_count) {\n    builtin_ib_offset_two_triangle_strips_ = builtin_index_buffer_size;\n    builtin_index_buffer_size +=\n        sizeof(uint32_t) *\n        GetTwoTriangleStripIndexCount(builtin_ib_two_triangle_strip_count);\n  } else {\n    builtin_ib_offset_two_triangle_strips_ = SIZE_MAX;\n  }\n  // 16-bit (for indirection on top of single auto-indexed vertices) - enough\n  // even if the backend has primitive reset enabled all the time (Metal) as\n  // auto-indexed draws are limited to UINT16_MAX vertices, not UINT16_MAX + 1.\n  if (convert_triangle_fans_to_lists_) {\n    builtin_ib_offset_triangle_fans_to_lists_ = builtin_index_buffer_size;\n    builtin_index_buffer_size +=\n        sizeof(uint16_t) * GetTriangleFanListIndexCount(UINT16_MAX);\n  } else {\n    builtin_ib_offset_triangle_fans_to_lists_ = SIZE_MAX;\n  }\n  if (convert_quad_lists_to_triangle_lists_) {\n    builtin_ib_offset_quad_lists_to_triangle_lists_ = builtin_index_buffer_size;\n    builtin_index_buffer_size +=\n        sizeof(uint16_t) * GetQuadListTriangleListIndexCount(UINT16_MAX);\n  } else {\n    builtin_ib_offset_quad_lists_to_triangle_lists_ = SIZE_MAX;\n  }\n  if (builtin_index_buffer_size) {\n    if (!InitializeBuiltinIndexBuffer(\n            builtin_index_buffer_size,\n            [this, builtin_ib_two_triangle_strip_count](void* mapping) {\n              uint32_t* mapping_32bit = reinterpret_cast<uint32_t*>(mapping);\n              if (builtin_ib_offset_two_triangle_strips_ != SIZE_MAX) {\n                // Two-triangle strips.\n                uint32_t* two_triangle_strip_ptr =\n                    mapping_32bit +\n                    builtin_ib_offset_two_triangle_strips_ / sizeof(uint32_t);\n                for (uint32_t i = 0; i < builtin_ib_two_triangle_strip_count;\n                     ++i) {\n                  if (i) {\n                    // Primitive restart.\n                    *(two_triangle_strip_ptr++) = UINT32_MAX;\n                  }\n                  // Host vertex index within the pair in the lower 2 bits,\n                  // guest primitive index in the rest.\n                  uint32_t two_triangle_strip_first_index = i << 2;\n                  for (uint32_t j = 0; j < 4; ++j) {\n                    *(two_triangle_strip_ptr++) =\n                        two_triangle_strip_first_index + j;\n                  }\n                }\n              }\n              uint16_t* mapping_16bit = reinterpret_cast<uint16_t*>(mapping);\n              if (builtin_ib_offset_triangle_fans_to_lists_ != SIZE_MAX) {\n                // Triangle fans as triangle lists.\n                // Ordered as (v1, v2, v0), (v2, v3, v0) in Direct3D.\n                // https://docs.microsoft.com/en-us/windows/desktop/direct3d9/triangle-fans\n                uint16_t* triangle_list_ptr =\n                    mapping_16bit + builtin_ib_offset_triangle_fans_to_lists_ /\n                                        sizeof(uint16_t);\n                for (uint32_t i = 2; i < UINT16_MAX; ++i) {\n                  *(triangle_list_ptr++) = uint16_t(i - 1);\n                  *(triangle_list_ptr++) = uint16_t(i);\n                  *(triangle_list_ptr++) = 0;\n                }\n              }\n              if (builtin_ib_offset_quad_lists_to_triangle_lists_ != SIZE_MAX) {\n                uint16_t* triangle_list_ptr =\n                    mapping_16bit +\n                    builtin_ib_offset_quad_lists_to_triangle_lists_ /\n                        sizeof(uint16_t);\n                // TODO(Triang3l): SIMD for faster initialization?\n                for (uint32_t i = 0; i < UINT16_MAX / 4; ++i) {\n                  uint16_t quad_first_index = uint16_t(i * 4);\n                  // TODO(Triang3l): Find the correct order.\n                  // v0, v1, v2.\n                  *(triangle_list_ptr++) = quad_first_index;\n                  *(triangle_list_ptr++) = quad_first_index + 1;\n                  *(triangle_list_ptr++) = quad_first_index + 2;\n                  // v0, v2, v3.\n                  *(triangle_list_ptr++) = quad_first_index;\n                  *(triangle_list_ptr++) = quad_first_index + 2;\n                  *(triangle_list_ptr++) = quad_first_index + 3;\n                }\n              }\n            })) {\n      ShutdownCommon();\n      return false;\n    }\n  }\n\n  return true;\n}\n\nvoid PrimitiveProcessor::ShutdownCommon() {\n  if (memory_invalidation_callback_handle_) {\n    // Clear the cache if it has ever been used and unregister the invalidation\n    // callback.\n    {\n      auto global_lock = global_critical_region_.Acquire();\n      cache_map_.clear();\n      cache_bucket_free_first_entry_ = SIZE_MAX;\n      std::memset(cache_buckets_non_empty_l1_, 0,\n                  sizeof(cache_buckets_non_empty_l1_));\n      std::memset(cache_buckets_non_empty_l2_, 0,\n                  sizeof(cache_buckets_non_empty_l2_));\n    }\n    memory_.UnregisterPhysicalMemoryInvalidationCallback(\n        memory_invalidation_callback_handle_);\n    memory_invalidation_callback_handle_ = nullptr;\n    cache_entry_pool_.clear();\n  }\n}\n\nvoid PrimitiveProcessor::ClearPerFrameCache() {\n  if (!memory_invalidation_callback_handle_) {\n    // Only do clearing if cache has ever been used.\n    return;\n  }\n  auto global_lock = global_critical_region_.Acquire();\n  for (const std::pair<CacheKey, size_t>& cache_map_entry : cache_map_) {\n    cache_entry_pool_[cache_map_entry.second].free_next =\n        cache_bucket_free_first_entry_;\n    cache_bucket_free_first_entry_ = cache_map_entry.second;\n  }\n  cache_map_.clear();\n  std::memset(cache_buckets_non_empty_l1_, 0,\n              sizeof(cache_buckets_non_empty_l1_));\n  std::memset(cache_buckets_non_empty_l2_, 0,\n              sizeof(cache_buckets_non_empty_l2_));\n}\n\nbool PrimitiveProcessor::Process(ProcessingResult& result_out) {\n  SCOPE_profile_cpu_f(\"gpu\");\n\n  const RegisterFile& regs = register_file_;\n  auto vgt_draw_initiator = regs.Get<reg::VGT_DRAW_INITIATOR>();\n\n  // Parse the primitive type and the tessellation state (VGT_OUTPUT_PATH_CNTL\n  // is only used in the explicit major mode) - there are cases in games when\n  // this register is left over after usage of tessellation in draws that don't\n  // need it.\n  xenos::PrimitiveType guest_primitive_type = vgt_draw_initiator.prim_type;\n  xenos::PrimitiveType host_primitive_type = guest_primitive_type;\n  bool tessellation_enabled =\n      xenos::IsMajorModeExplicit(vgt_draw_initiator.major_mode,\n                                 vgt_draw_initiator.prim_type) &&\n      regs.Get<reg::VGT_OUTPUT_PATH_CNTL>().path_select ==\n          xenos::VGTOutputPath::kTessellationEnable;\n  xenos::TessellationMode tessellation_mode =\n      regs.Get<reg::VGT_HOS_CNTL>().tess_mode;\n  Shader::HostVertexShaderType host_vertex_shader_type;\n  if (tessellation_enabled) {\n    // Currently only supporting tessellation in known cases for safety, and not\n    // yet converting patch strips / fans to patch lists until games using them\n    // are found for easier debugging when it actually happens.\n    // TODO(Triang3l): Conversion of patch strips / fans if found.\n    host_vertex_shader_type = Shader::HostVertexShaderType(-1);\n    switch (guest_primitive_type) {\n      case xenos::PrimitiveType::kTriangleList:\n        // Also supported by triangle strips and fans according to:\n        // https://www.khronos.org/registry/OpenGL/extensions/AMD/AMD_vertex_shader_tessellator.txt\n        // Would need to convert those to triangle lists, but haven't seen any\n        // games using tessellated strips / fans so far.\n        switch (tessellation_mode) {\n          case xenos::TessellationMode::kDiscrete:\n            // - 415607E1 - nets above barrels in the beginning of the first\n            //   mission (turn right after the end of the intro) -\n            //   kTriangleList.\n            host_vertex_shader_type =\n                Shader::HostVertexShaderType::kTriangleDomainCPIndexed;\n            break;\n          case xenos::TessellationMode::kContinuous:\n            // - 4D5307F2 - tree building with a beehive in the beginning\n            //   (visible on the start screen behind the logo), waterfall in the\n            //   beginning - kTriangleList.\n            host_vertex_shader_type =\n                Shader::HostVertexShaderType::kTriangleDomainCPIndexed;\n            break;\n          default:\n            break;\n        }\n        break;\n      case xenos::PrimitiveType::kQuadList:\n        switch (tessellation_mode) {\n          // Also supported by quad strips according to:\n          // https://www.khronos.org/registry/OpenGL/extensions/AMD/AMD_vertex_shader_tessellator.txt\n          // Would need to convert those to quad lists, but haven't seen any\n          // games using tessellated strips so far.\n          case xenos::TessellationMode::kDiscrete:\n            // Not seen in games so far.\n            host_vertex_shader_type =\n                Shader::HostVertexShaderType::kQuadDomainCPIndexed;\n            break;\n          case xenos::TessellationMode::kContinuous:\n            // - 58410823 - retro screen and beams in the main menu - kQuadList.\n            host_vertex_shader_type =\n                Shader::HostVertexShaderType::kQuadDomainCPIndexed;\n            break;\n          default:\n            break;\n        }\n        break;\n      case xenos::PrimitiveType::kTrianglePatch:\n        // - 4D5307E6 - water - adaptive.\n        // - 4D5307ED - water - adaptive.\n        host_vertex_shader_type =\n            Shader::HostVertexShaderType::kTriangleDomainPatchIndexed;\n        break;\n      case xenos::PrimitiveType::kQuadPatch:\n        // - 4D5307F1 - ground - continuous.\n        // - 4D5307F2 - garden ground - adaptive.\n        host_vertex_shader_type =\n            Shader::HostVertexShaderType::kQuadDomainPatchIndexed;\n        break;\n      default:\n        // TODO(Triang3l): Support line patches.\n        break;\n    }\n    if (host_vertex_shader_type == Shader::HostVertexShaderType(-1)) {\n      XELOGE(\n          \"Primitive processor: Unsupported tessellation mode {} for primitive \"\n          \"type {}. Report the game to Xenia developers!\",\n          uint32_t(tessellation_mode), uint32_t(guest_primitive_type));\n      assert_always();\n      return false;\n    }\n  } else {\n    host_vertex_shader_type = Shader::HostVertexShaderType::kVertex;\n    switch (guest_primitive_type) {\n      case xenos::PrimitiveType::kPointList:\n        if (expand_point_sprites_in_vs_) {\n          host_primitive_type = xenos::PrimitiveType::kTriangleStrip;\n          host_vertex_shader_type =\n              Shader::HostVertexShaderType::kPointListAsTriangleStrip;\n        }\n        break;\n      case xenos::PrimitiveType::kLineList:\n      case xenos::PrimitiveType::kLineStrip:\n      case xenos::PrimitiveType::kTriangleList:\n      case xenos::PrimitiveType::kTriangleStrip:\n        // Supported natively on all backends.\n        break;\n      case xenos::PrimitiveType::kRectangleList:\n        if (expand_rectangle_lists_in_vs_) {\n          host_primitive_type = xenos::PrimitiveType::kTriangleStrip;\n          host_vertex_shader_type =\n              Shader::HostVertexShaderType::kRectangleListAsTriangleStrip;\n        }\n        break;\n      case xenos::PrimitiveType::kTriangleFan:\n        if (convert_triangle_fans_to_lists_) {\n          host_primitive_type = xenos::PrimitiveType::kTriangleList;\n        }\n        break;\n      case xenos::PrimitiveType::kLineLoop:\n        if (convert_line_loops_to_strips_) {\n          host_primitive_type = xenos::PrimitiveType::kLineStrip;\n        }\n        break;\n      case xenos::PrimitiveType::kQuadList:\n        if (convert_quad_lists_to_triangle_lists_) {\n          host_primitive_type = xenos::PrimitiveType::kTriangleList;\n        }\n        break;\n      default:\n        XELOGE(\n            \"Primitive processor: Unsupported primitive type {}. Report the \"\n            \"game to Xenia developers!\",\n            uint32_t(guest_primitive_type));\n        assert_always();\n        return false;\n    }\n  }\n\n  // Process the indices.\n  uint32_t guest_draw_vertex_count = vgt_draw_initiator.num_indices;\n  auto vgt_dma_size = regs.Get<reg::VGT_DMA_SIZE>();\n  if (vgt_draw_initiator.source_select == xenos::SourceSelect::kDMA &&\n      guest_draw_vertex_count > vgt_dma_size.num_words) {\n    XELOGW(\n        \"Primitive processor: {} vertices attempted to be drawn with an index \"\n        \"buffer only containing {}. Should be fetching zero indices instead of \"\n        \"overflowing ones, but this is a rare situation, so not handled yet. \"\n        \"Report the game to Xenia developers!\",\n        guest_draw_vertex_count, vgt_dma_size.num_words);\n    guest_draw_vertex_count = vgt_dma_size.num_words;\n  }\n  uint32_t line_loop_closing_index = 0;\n  uint32_t guest_index_base = 0, guest_index_buffer_needed_bytes = 0;\n  CachedResult cacheable;\n  cacheable.host_draw_vertex_count = guest_draw_vertex_count;\n  cacheable.host_primitive_reset_enabled = false;\n  cacheable.host_index_buffer_handle = SIZE_MAX;\n  if (host_vertex_shader_type ==\n          Shader::HostVertexShaderType::kPointListAsTriangleStrip ||\n      host_vertex_shader_type ==\n          Shader::HostVertexShaderType::kRectangleListAsTriangleStrip) {\n    // As two-triangle strips, with guest indices being either autogenerated or\n    // fetched via DMA.\n    uint32_t primitive_count = guest_draw_vertex_count;\n    if (host_vertex_shader_type ==\n        Shader::HostVertexShaderType::kRectangleListAsTriangleStrip) {\n      primitive_count /= 3;\n    }\n    cacheable.host_draw_vertex_count =\n        GetTwoTriangleStripIndexCount(primitive_count);\n    cacheable.host_index_format = xenos::IndexFormat::kInt32;\n    cacheable.host_primitive_reset_enabled = true;\n    assert_true(builtin_ib_offset_two_triangle_strips_ != SIZE_MAX);\n    cacheable.host_index_buffer_handle = builtin_ib_offset_two_triangle_strips_;\n    if (vgt_draw_initiator.source_select == xenos::SourceSelect::kAutoIndex) {\n      cacheable.index_buffer_type =\n          ProcessedIndexBufferType::kHostBuiltinForAuto;\n      cacheable.host_shader_index_endian = xenos::Endian::kNone;\n    } else {\n      // There is an index buffer.\n      assert_true(vgt_draw_initiator.source_select ==\n                  xenos::SourceSelect::kDMA);\n      if (vgt_draw_initiator.source_select != xenos::SourceSelect::kDMA) {\n        // TODO(Triang3l): Support immediate-indexed vertices.\n        XELOGE(\n            \"Primitive processor: Unsupported vertex index source {}. Report \"\n            \"the game to Xenia developers!\",\n            uint32_t(vgt_draw_initiator.source_select));\n        return false;\n      }\n      xenos::IndexFormat guest_index_format = vgt_draw_initiator.index_size;\n      // Normalize the endian.\n      cacheable.index_buffer_type =\n          ProcessedIndexBufferType::kHostBuiltinForDMA;\n      xenos::Endian guest_index_endian = vgt_dma_size.swap_mode;\n      if (guest_index_format == xenos::IndexFormat::kInt16 &&\n          (guest_index_endian != xenos::Endian::kNone &&\n           guest_index_endian != xenos::Endian::k8in16)) {\n        XELOGW(\n            \"Primitive processor: 32-bit endian swap mode {} is used for \"\n            \"16-bit indices. This shouldn't normally be happening, but report \"\n            \"the game to Xenia developers for investigation of the intended \"\n            \"behavior (ignore or actually swap across adjacent indices)! \"\n            \"Currently disabling the swap for 16-and-32 and replacing 8-in-32 \"\n            \"with 8-in-16.\",\n            uint32_t(guest_index_endian));\n        guest_index_endian = guest_index_endian == xenos::Endian::k8in32\n                                 ? xenos::Endian::k8in16\n                                 : xenos::Endian::kNone;\n      }\n      cacheable.host_shader_index_endian = guest_index_endian;\n      // Get the index buffer memory range.\n      uint32_t index_size_log2 =\n          guest_index_format == xenos::IndexFormat::kInt16 ? 1 : 2;\n      // The base should already be aligned, but aligning here too for safety.\n      guest_index_base =\n          regs[XE_GPU_REG_VGT_DMA_BASE] & ~uint32_t((1 << index_size_log2) - 1);\n      guest_index_buffer_needed_bytes = guest_draw_vertex_count\n                                        << index_size_log2;\n      if (guest_index_base > SharedMemory::kBufferSize ||\n          SharedMemory::kBufferSize - guest_index_base <\n              guest_index_buffer_needed_bytes) {\n        XELOGE(\n            \"Primitive processor: Index buffer at 0x{:08X}, 0x{:X} bytes \"\n            \"required, is out of the physical memory bounds\",\n            guest_index_base, guest_index_buffer_needed_bytes);\n        assert_always();\n        return false;\n      }\n    }\n  } else if (vgt_draw_initiator.source_select ==\n             xenos::SourceSelect::kAutoIndex) {\n    // Auto-indexed - use a remapping index buffer if needed to change the\n    // primitive type.\n    if (tessellation_enabled &&\n        tessellation_mode == xenos::TessellationMode::kAdaptive) {\n      XELOGE(\n          \"Primitive processor: Adaptive tessellation requires 32-bit \"\n          \"floating-point edge tessellation factors in the index buffer, but \"\n          \"no index buffer is provided by the guest.\");\n      assert_always();\n      return false;\n    }\n    cacheable.host_index_format = xenos::IndexFormat::kInt16;\n    cacheable.host_shader_index_endian = xenos::Endian::kNone;\n    cacheable.host_primitive_reset_enabled = false;\n    cacheable.index_buffer_type = ProcessedIndexBufferType::kNone;\n    if (host_primitive_type != guest_primitive_type) {\n      switch (guest_primitive_type) {\n        case xenos::PrimitiveType::kTriangleFan:\n          assert_true(host_primitive_type ==\n                      xenos::PrimitiveType::kTriangleList);\n          cacheable.host_draw_vertex_count =\n              GetTriangleFanListIndexCount(cacheable.host_draw_vertex_count);\n          cacheable.index_buffer_type =\n              ProcessedIndexBufferType::kHostBuiltinForAuto;\n          assert_true(builtin_ib_offset_triangle_fans_to_lists_ != SIZE_MAX);\n          cacheable.host_index_buffer_handle =\n              builtin_ib_offset_triangle_fans_to_lists_;\n          break;\n        case xenos::PrimitiveType::kLineLoop:\n          // Plus 1 element (if there's anything to draw) in the strip, still\n          // auto-indexed, but the added excess index should be treated as 0 by\n          // the vertex shaders.\n          assert_true(host_primitive_type == xenos::PrimitiveType::kLineStrip);\n          cacheable.host_draw_vertex_count =\n              GetLineLoopStripIndexCount(cacheable.host_draw_vertex_count);\n          if (cacheable.host_draw_vertex_count) {\n            line_loop_closing_index = cacheable.host_draw_vertex_count - 1;\n          }\n          break;\n        case xenos::PrimitiveType::kQuadList:\n          assert_true(host_primitive_type ==\n                      xenos::PrimitiveType::kTriangleList);\n          cacheable.host_draw_vertex_count = GetQuadListTriangleListIndexCount(\n              cacheable.host_draw_vertex_count);\n          cacheable.index_buffer_type =\n              ProcessedIndexBufferType::kHostBuiltinForAuto;\n          assert_true(builtin_ib_offset_quad_lists_to_triangle_lists_ !=\n                      SIZE_MAX);\n          cacheable.host_index_buffer_handle =\n              builtin_ib_offset_quad_lists_to_triangle_lists_;\n          break;\n        default:\n          assert_always();\n          return false;\n      }\n    }\n  } else {\n    // There is an index buffer.\n    assert_true(vgt_draw_initiator.source_select == xenos::SourceSelect::kDMA);\n    if (vgt_draw_initiator.source_select != xenos::SourceSelect::kDMA) {\n      // TODO(Triang3l): Support immediate-indexed vertices.\n      XELOGE(\n          \"Primitive processor: Unsupported vertex index source {}. Report the \"\n          \"game to Xenia developers!\",\n          uint32_t(vgt_draw_initiator.source_select));\n      return false;\n    }\n    xenos::IndexFormat guest_index_format = vgt_draw_initiator.index_size;\n    cacheable.host_index_format = guest_index_format;\n    // Normalize the endian and the reset index.\n    xenos::Endian guest_index_endian = vgt_dma_size.swap_mode;\n    if (guest_index_format == xenos::IndexFormat::kInt16 &&\n        (guest_index_endian != xenos::Endian::kNone &&\n         guest_index_endian != xenos::Endian::k8in16)) {\n      XELOGW(\n          \"Primitive processor: 32-bit endian swap mode {} is used for 16-bit \"\n          \"indices. This shouldn't normally be happening, but report the game \"\n          \"to Xenia developers for investigation of the intended behavior \"\n          \"(ignore or actually swap across adjacent indices)! Currently \"\n          \"disabling the swap for 16-and-32 and replacing 8-in-32 with \"\n          \"8-in-16.\",\n          uint32_t(guest_index_endian));\n      guest_index_endian = guest_index_endian == xenos::Endian::k8in32\n                               ? xenos::Endian::k8in16\n                               : xenos::Endian::kNone;\n    }\n    bool guest_primitive_reset_enabled = false;\n    uint32_t guest_primitive_reset_index_guest_endian = 0;\n    if (tessellation_enabled &&\n        tessellation_mode == xenos::TessellationMode::kAdaptive) {\n      // Adaptive tessellation uses the index buffer not for indices, but for\n      // 32-bit floating-point edge factors - no primitive reset.\n      if (guest_index_format != xenos::IndexFormat::kInt32) {\n        XELOGE(\n            \"Primitive processor: Adaptive tessellation requires 32-bit \"\n            \"floating-point edge tessellation factors in the index buffer, but \"\n            \"16-bit index buffer is provided by the guest.\");\n        assert_always();\n        return false;\n      }\n    } else {\n      if (regs.Get<reg::PA_SU_SC_MODE_CNTL>().multi_prim_ib_ena) {\n        switch (guest_primitive_type) {\n          case xenos::PrimitiveType::kLineStrip:\n          case xenos::PrimitiveType::kTriangleFan:\n          case xenos::PrimitiveType::kTriangleStrip:\n          case xenos::PrimitiveType::kLineLoop:\n          case xenos::PrimitiveType::kQuadStrip:\n          case xenos::PrimitiveType::kPolygon:\n          case xenos::PrimitiveType::k2DLineStrip:\n          case xenos::PrimitiveType::k2DTriStrip:\n            guest_primitive_reset_index_guest_endian = xenos::GpuSwap(\n                regs.Get<reg::VGT_MULTI_PRIM_IB_RESET_INDX>().reset_indx,\n                guest_index_endian);\n            // - VGT, what does the guest say about its primitive reset index?\n            // - It's over 0xFFFF!!!\n            // - What!? 0xFFFF!? There's no way that can be stored in 16 bits!\n            guest_primitive_reset_enabled =\n                guest_index_format == xenos::IndexFormat::kInt16\n                    ? guest_primitive_reset_index_guest_endian <= UINT16_MAX\n                    : true;\n            break;\n          default:\n            // Vulkan explicitly disallows primitive restart index for \"list\"\n            // topologies. In Direct3D 12, it's valid for non-strips, but has\n            // implementation-defined behavior. Make backend usage simpler by\n            // explicitly filtering lists out, and hope the guest never uses\n            // primitive reset for lists.\n            break;\n        }\n      }\n    }\n\n    // Get the index buffer memory range.\n    uint32_t index_size_log2 =\n        guest_index_format == xenos::IndexFormat::kInt16 ? 1 : 2;\n    // The base should already be aligned, but aligning here too for safety.\n    guest_index_base =\n        regs[XE_GPU_REG_VGT_DMA_BASE] & ~uint32_t((1 << index_size_log2) - 1);\n    guest_index_buffer_needed_bytes = guest_draw_vertex_count\n                                      << index_size_log2;\n    if (guest_index_base > SharedMemory::kBufferSize ||\n        SharedMemory::kBufferSize - guest_index_base <\n            guest_index_buffer_needed_bytes) {\n      XELOGE(\n          \"Primitive processor: Index buffer at 0x{:08X}, 0x{:X} bytes \"\n          \"required, is out of the physical memory bounds\",\n          guest_index_base, guest_index_buffer_needed_bytes);\n      assert_always();\n      return false;\n    }\n\n    cacheable.host_index_format = guest_index_format;\n    cacheable.host_shader_index_endian = guest_index_endian;\n    uint32_t guest_index_mask_guest_endian =\n        guest_index_format == xenos::IndexFormat::kInt16\n            ? UINT16_MAX\n            : GpuSwap(xenos::kVertexIndexMask, guest_index_endian);\n    if (host_primitive_type != guest_primitive_type) {\n      // Already converting to a different index type - primitive reset is\n      // performed during conversion here. Also doing the endian swap here for\n      // hosts not supporting 32-bit indices because indirection is only used\n      // for the shared memory buffer.\n      // Writing to the trace irrespective of the cache lookup result because\n      // cache behavior depends on runtime configuration and state.\n      trace_writer_.WriteMemoryRead(guest_index_base,\n                                    guest_index_buffer_needed_bytes);\n      CacheTransaction cache_transaction(\n          *this, CacheKey(guest_index_base, guest_draw_vertex_count,\n                          guest_index_format, guest_index_endian,\n                          guest_primitive_reset_enabled, guest_primitive_type));\n      if (cache_transaction.GetFoundResult()) {\n        cacheable = *cache_transaction.GetFoundResult();\n      } else {\n        const void* guest_indices_ptr =\n            memory_.TranslatePhysical(guest_index_base);\n        cacheable.index_buffer_type = ProcessedIndexBufferType::kHostConverted;\n        cacheable.host_primitive_reset_enabled = false;\n        std::function<uint32_t(uint32_t)> host_index_count_getter;\n        switch (guest_primitive_type) {\n          case xenos::PrimitiveType::kTriangleFan:\n            host_index_count_getter = GetTriangleFanListIndexCount;\n            break;\n          case xenos::PrimitiveType::kLineLoop:\n            host_index_count_getter = GetLineLoopStripIndexCount;\n            break;\n          case xenos::PrimitiveType::kQuadList:\n            host_index_count_getter = GetQuadListTriangleListIndexCount;\n            break;\n          default:\n            assert_unhandled_case(guest_primitive_type);\n            return false;\n        }\n        single_primitive_ranges_.clear();\n        if (guest_index_format == xenos::IndexFormat::kInt16) {\n          // 16-bit indices - just convert the primitive (or multiple\n          // primitives) to the host topology.\n          // TODO(Triang3l): 16-bit > 32-bit primitive type conversion for\n          // Metal, where primitive reset is always enabled, if UINT16_MAX is\n          // used as a real vertex index.\n          auto guest_indices =\n              reinterpret_cast<const uint16_t*>(guest_indices_ptr);\n          if (guest_primitive_reset_enabled &&\n              IsResetUsed(guest_indices, guest_draw_vertex_count,\n                          guest_primitive_reset_index_guest_endian)) {\n            // Multiple primitives in the index buffer - gather all single\n            // primitives.\n            cacheable.host_draw_vertex_count =\n                GetMultiPrimitiveHostIndexCountAndRanges(\n                    host_index_count_getter, guest_indices,\n                    guest_draw_vertex_count,\n                    guest_primitive_reset_index_guest_endian,\n                    single_primitive_ranges_);\n          } else {\n            cacheable.host_draw_vertex_count =\n                host_index_count_getter(guest_draw_vertex_count);\n            single_primitive_ranges_.emplace_back(\n                0, guest_draw_vertex_count, cacheable.host_draw_vertex_count);\n          }\n          auto host_indices = reinterpret_cast<uint16_t*>(\n              RequestHostConvertedIndexBufferForCurrentFrame(\n                  xenos::IndexFormat::kInt16, cacheable.host_draw_vertex_count,\n                  false, guest_index_base, cacheable.host_index_buffer_handle));\n          if (!host_indices) {\n            return false;\n          }\n          ConvertSinglePrimitiveRanges(\n              host_indices, guest_indices, guest_primitive_type,\n              PassthroughIndexTransform(), single_primitive_ranges_.cbegin(),\n              single_primitive_ranges_.cend());\n        } else {\n          // 32-bit indices - may need to pre-swap and pre-mask also if the host\n          // doesn't support full 32-bit vertex indices.\n          auto guest_indices =\n              reinterpret_cast<const uint32_t*>(guest_indices_ptr);\n          if (guest_primitive_reset_enabled &&\n              IsResetUsed(guest_indices, guest_draw_vertex_count,\n                          guest_primitive_reset_index_guest_endian,\n                          guest_index_mask_guest_endian)) {\n            // Multiple primitives in the index buffer - gather all single\n            // primitives.\n            cacheable.host_draw_vertex_count =\n                GetMultiPrimitiveHostIndexCountAndRanges(\n                    host_index_count_getter, guest_indices,\n                    guest_draw_vertex_count,\n                    guest_primitive_reset_index_guest_endian,\n                    guest_index_mask_guest_endian, single_primitive_ranges_);\n          } else {\n            cacheable.host_draw_vertex_count =\n                host_index_count_getter(guest_draw_vertex_count);\n            single_primitive_ranges_.emplace_back(\n                0, guest_draw_vertex_count, cacheable.host_draw_vertex_count);\n          }\n          auto host_indices = reinterpret_cast<uint32_t*>(\n              RequestHostConvertedIndexBufferForCurrentFrame(\n                  xenos::IndexFormat::kInt32, cacheable.host_draw_vertex_count,\n                  false, guest_index_base, cacheable.host_index_buffer_handle));\n          if (!host_indices) {\n            return false;\n          }\n          auto single_primitive_ranges_beginning =\n              single_primitive_ranges_.cbegin();\n          auto single_primitive_ranges_end = single_primitive_ranges_.cend();\n          if (full_32bit_vertex_indices_used_) {\n            ConvertSinglePrimitiveRanges(\n                host_indices, guest_indices, guest_primitive_type,\n                PassthroughIndexTransform(), single_primitive_ranges_beginning,\n                single_primitive_ranges_end);\n          } else {\n            switch (guest_index_endian) {\n              case xenos::Endian::kNone:\n                ConvertSinglePrimitiveRanges(host_indices, guest_indices,\n                                             guest_primitive_type,\n                                             To24NonSwappingIndexTransform(),\n                                             single_primitive_ranges_beginning,\n                                             single_primitive_ranges_end);\n                break;\n              case xenos::Endian::k8in16:\n                ConvertSinglePrimitiveRanges(host_indices, guest_indices,\n                                             guest_primitive_type,\n                                             To24Swapping8In16IndexTransform(),\n                                             single_primitive_ranges_beginning,\n                                             single_primitive_ranges_end);\n                break;\n              case xenos::Endian::k8in32:\n                ConvertSinglePrimitiveRanges(host_indices, guest_indices,\n                                             guest_primitive_type,\n                                             To24Swapping8In32IndexTransform(),\n                                             single_primitive_ranges_beginning,\n                                             single_primitive_ranges_end);\n                break;\n              case xenos::Endian::k16in32:\n                ConvertSinglePrimitiveRanges(host_indices, guest_indices,\n                                             guest_primitive_type,\n                                             To24Swapping16In32IndexTransform(),\n                                             single_primitive_ranges_beginning,\n                                             single_primitive_ranges_end);\n                break;\n              default:\n                assert_unhandled_case(guest_index_endian);\n                return false;\n            }\n            cacheable.host_shader_index_endian = xenos::Endian::kNone;\n          }\n        }\n        cache_transaction.SetNewResult(cacheable);\n      }\n    } else {\n      // Using the same indices on the host as on the guest, either directly or\n      // (for backends not supporting full 32-bit indices, thus unable to\n      // endian-swap, or even to safely drop the upper 8 bits if no swap is even\n      // needed) indirectly.\n      cacheable.host_draw_vertex_count = guest_draw_vertex_count;\n      cacheable.index_buffer_type = ProcessedIndexBufferType::kGuestDMA;\n      cacheable.host_primitive_reset_enabled = guest_primitive_reset_enabled;\n      if (guest_primitive_reset_enabled) {\n        if (guest_index_format == xenos::IndexFormat::kInt16) {\n          // The whole 16-bit index is compared to the primitive reset index.\n          // Does not need indirection on backends not supporting full 32-bit\n          // indices.\n          if (guest_primitive_reset_index_guest_endian != UINT16_MAX) {\n            // If primitive reset with a non-0xFFFF index is used, replace with\n            // 0xFFFF if 0xFFFF is not used as a real index, or with 0xFFFFFFFF\n            // if it is.\n            // Writing to the trace irrespective of the cache lookup result\n            // because cache behavior depends on runtime configuration and\n            // state.\n            // Example of 16-bit reset index replacement: 415607D4.\n            trace_writer_.WriteMemoryRead(guest_index_base,\n                                          guest_index_buffer_needed_bytes);\n            // Not specifying the primitive type in the cache key because not\n            // replacing it, only the reset index in a type-independent way.\n            CacheTransaction cache_transaction(\n                *this, CacheKey(guest_index_base, guest_draw_vertex_count,\n                                guest_index_format, guest_index_endian,\n                                guest_primitive_reset_enabled));\n            if (cache_transaction.GetFoundResult()) {\n              cacheable = *cache_transaction.GetFoundResult();\n            } else {\n              auto guest_indices =\n                  memory_.TranslatePhysical<const uint16_t*>(guest_index_base);\n              bool is_reset_index_used, is_ffff_used_as_vertex_index;\n              Get16BitResetIndexUsage(guest_indices, guest_draw_vertex_count,\n                                      guest_primitive_reset_index_guest_endian,\n                                      is_reset_index_used,\n                                      is_ffff_used_as_vertex_index);\n              if (is_reset_index_used) {\n                cacheable.index_buffer_type =\n                    ProcessedIndexBufferType::kHostConverted;\n                cacheable.host_index_format = is_ffff_used_as_vertex_index\n                                                  ? xenos::IndexFormat::kInt32\n                                                  : xenos::IndexFormat::kInt16;\n                void* host_indices_ptr =\n                    RequestHostConvertedIndexBufferForCurrentFrame(\n                        cacheable.host_index_format, guest_draw_vertex_count,\n                        true, guest_index_base,\n                        cacheable.host_index_buffer_handle);\n                if (!host_indices_ptr) {\n                  return false;\n                }\n                if (is_ffff_used_as_vertex_index) {\n                  ReplaceResetIndex16To24(\n                      reinterpret_cast<uint32_t*>(host_indices_ptr),\n                      guest_indices, guest_draw_vertex_count,\n                      guest_primitive_reset_index_guest_endian);\n                } else {\n                  ReplaceResetIndex16To16(\n                      reinterpret_cast<uint16_t*>(host_indices_ptr),\n                      guest_indices, guest_draw_vertex_count,\n                      guest_primitive_reset_index_guest_endian);\n                }\n              }\n              cache_transaction.SetNewResult(cacheable);\n            }\n          }\n        } else {\n          // Low 24 bits of the guest index are compared to the primitive reset\n          // index. If the backend doesn't support full 32-bit indices, for\n          // ProcessedIndexBufferType::kGuestDMA, the host needs to read the\n          // buffer indirectly in the vertex shaders and swap, and for\n          // ProcessedIndexBufferType::kHostConverted (if primitive reset is\n          // actually used, thus exactly 0xFFFFFFFF must be sent to the host for\n          // it in a true index buffer), no indirection is done, but\n          // pre-swapping and pre-masking is done here.\n          // Writing to the trace irrespective of the cache lookup result\n          // because cache behavior depends on runtime configuration and state.\n          trace_writer_.WriteMemoryRead(guest_index_base,\n                                        guest_index_buffer_needed_bytes);\n          // Not specifying the primitive type in the cache key because not\n          // replacing it, only the reset index in a type-independent way.\n          CacheTransaction cache_transaction(\n              *this, CacheKey(guest_index_base, guest_draw_vertex_count,\n                              guest_index_format, guest_index_endian,\n                              guest_primitive_reset_enabled));\n          if (cache_transaction.GetFoundResult()) {\n            cacheable = *cache_transaction.GetFoundResult();\n          } else {\n            auto guest_indices =\n                memory_.TranslatePhysical<const uint32_t*>(guest_index_base);\n            if (IsResetUsed(guest_indices, guest_draw_vertex_count,\n                            guest_primitive_reset_index_guest_endian,\n                            guest_index_mask_guest_endian)) {\n              cacheable.index_buffer_type =\n                  ProcessedIndexBufferType::kHostConverted;\n              auto host_indices = reinterpret_cast<uint32_t*>(\n                  RequestHostConvertedIndexBufferForCurrentFrame(\n                      xenos::IndexFormat::kInt32, guest_draw_vertex_count, true,\n                      guest_index_base, cacheable.host_index_buffer_handle));\n              if (!host_indices) {\n                return false;\n              }\n              if (full_32bit_vertex_indices_used_ ||\n                  guest_index_endian == xenos::Endian::kNone) {\n                ReplaceResetIndex32To24<xenos::Endian::kNone>(\n                    host_indices, guest_indices, guest_draw_vertex_count,\n                    guest_primitive_reset_index_guest_endian,\n                    guest_index_mask_guest_endian);\n              } else if (guest_index_endian == xenos::Endian::k8in16) {\n                ReplaceResetIndex32To24<xenos::Endian::k8in16>(\n                    host_indices, guest_indices, guest_draw_vertex_count,\n                    guest_primitive_reset_index_guest_endian,\n                    guest_index_mask_guest_endian);\n              } else if (guest_index_endian == xenos::Endian::k8in32) {\n                ReplaceResetIndex32To24<xenos::Endian::k8in32>(\n                    host_indices, guest_indices, guest_draw_vertex_count,\n                    guest_primitive_reset_index_guest_endian,\n                    guest_index_mask_guest_endian);\n              } else if (guest_index_endian == xenos::Endian::k16in32) {\n                ReplaceResetIndex32To24<xenos::Endian::k16in32>(\n                    host_indices, guest_indices, guest_draw_vertex_count,\n                    guest_primitive_reset_index_guest_endian,\n                    guest_index_mask_guest_endian);\n              } else {\n                assert_unhandled_case(guest_index_endian);\n                return false;\n              }\n              cacheable.host_shader_index_endian =\n                  full_32bit_vertex_indices_used_ ? guest_index_endian\n                                                  : xenos::Endian::kNone;\n            }\n            cache_transaction.SetNewResult(cacheable);\n          }\n        }\n      }\n    }\n  }\n\n  // Request the indices in the shared memory if they need to be accessed from\n  // there on the GPU.\n  if (cacheable.index_buffer_type == ProcessedIndexBufferType::kGuestDMA ||\n      cacheable.index_buffer_type ==\n          ProcessedIndexBufferType::kHostBuiltinForDMA) {\n    // Request the index buffer memory.\n    // TODO(Triang3l): Shared memory request cache.\n    if (!shared_memory_.RequestRange(guest_index_base,\n                                     guest_index_buffer_needed_bytes)) {\n      XELOGE(\n          \"PrimitiveProcessor: Failed to request index buffer 0x{:08X}, 0x{:X} \"\n          \"bytes needed, in the shared memory\",\n          guest_index_base, guest_index_buffer_needed_bytes);\n      return false;\n    }\n  }\n\n  result_out.guest_primitive_type = guest_primitive_type;\n  result_out.host_primitive_type = host_primitive_type;\n  result_out.host_vertex_shader_type = host_vertex_shader_type;\n  result_out.tessellation_mode = tessellation_mode;\n  result_out.host_draw_vertex_count = cacheable.host_draw_vertex_count;\n  result_out.line_loop_closing_index = line_loop_closing_index;\n  result_out.index_buffer_type = cacheable.index_buffer_type;\n  result_out.guest_index_base = guest_index_base;\n  result_out.host_index_format = cacheable.host_index_format;\n  result_out.host_shader_index_endian = cacheable.host_shader_index_endian;\n  result_out.host_primitive_reset_enabled =\n      cacheable.host_primitive_reset_enabled;\n  result_out.host_index_buffer_handle = cacheable.host_index_buffer_handle;\n  return true;\n}\n\nbool PrimitiveProcessor::IsResetUsed(const uint16_t* source, uint32_t count,\n                                     uint16_t reset_index_guest_endian) {\n#if XE_GPU_PRIMITIVE_PROCESSOR_SIMD_SIZE\n  while (count && (reinterpret_cast<uintptr_t>(source) &\n                   (XE_GPU_PRIMITIVE_PROCESSOR_SIMD_SIZE - 1))) {\n    --count;\n    if (*(source++) == reset_index_guest_endian) {\n      return true;\n    }\n  }\n  if (count >= kSimdVectorU16Elements) {\n    SimdVectorU16 reset_index_guest_endian_simd =\n        ReplicateU16(reset_index_guest_endian);\n    while (count >= kSimdVectorU16Elements) {\n      count -= kSimdVectorU16Elements;\n      SimdVectorU16 source_simd = LoadAlignedVectorU16(source);\n      source += kSimdVectorU16Elements;\n#if XE_ARCH_AMD64\n      if (_mm_movemask_epi8(\n              _mm_cmpeq_epi16(source_simd, reset_index_guest_endian_simd))) {\n        return true;\n      }\n#elif XE_ARCH_ARM64\n      uint64x1_t is_any = vreinterpret_u64_u32(vqmovn_u64(vreinterpretq_u64_u16(\n          vceqq_u16(source_simd, reset_index_guest_endian_simd))));\n      if (*reinterpret_cast<const uint64_t*>(&is_any)) {\n        return true;\n      }\n#else\n#error SIMD 16-bit IsResetUsed not implemented.\n#endif  // XE_ARCH\n    }\n  }\n#endif  // XE_GPU_PRIMITIVE_PROCESSOR_SIMD_SIZE\n  while (count--) {\n    if (*(source++) == reset_index_guest_endian) {\n      return true;\n    }\n  }\n  return false;\n}\n\nvoid PrimitiveProcessor::Get16BitResetIndexUsage(\n    const uint16_t* source, uint32_t count, uint16_t reset_index_guest_endian,\n    bool& is_reset_index_used_out, bool& is_ffff_used_as_vertex_index_out) {\n  // Optimized for the more common case (reset index not used at all), therefore\n  // not doing early-outs if both conditions are true for a simpler loop body.\n  // Using the index 0xFFFF is likely not that common in general.\n  // TODO(Triang3l): Revisit this - maybe the early-out will be free if this\n  // function is bandwidth-bound.\n  is_ffff_used_as_vertex_index_out = false;\n  if (reset_index_guest_endian == UINT16_MAX) {\n    is_reset_index_used_out =\n        IsResetUsed(source, count, reset_index_guest_endian);\n    return;\n  }\n  is_reset_index_used_out = false;\n#if XE_GPU_PRIMITIVE_PROCESSOR_SIMD_SIZE\n  while (count && (reinterpret_cast<uintptr_t>(source) &\n                   (XE_GPU_PRIMITIVE_PROCESSOR_SIMD_SIZE - 1))) {\n    --count;\n    uint16_t index = *(source++);\n    if (index == reset_index_guest_endian) {\n      is_reset_index_used_out = true;\n    }\n    if (index == UINT16_MAX) {\n      is_ffff_used_as_vertex_index_out = true;\n    }\n  }\n  if (count >= kSimdVectorU16Elements) {\n    SimdVectorU16 reset_index_guest_endian_simd =\n        ReplicateU16(reset_index_guest_endian);\n    SimdVectorU16 ffff_simd = ReplicateU16(UINT16_MAX);\n    SimdVectorU16 is_reset_simd = ReplicateU16(0);\n    SimdVectorU16 is_ffff_simd = ReplicateU16(0);\n    while (count >= kSimdVectorU16Elements) {\n      count -= kSimdVectorU16Elements;\n      SimdVectorU16 source_simd = LoadAlignedVectorU16(source);\n      source += kSimdVectorU16Elements;\n#if XE_ARCH_AMD64\n      is_reset_simd = _mm_or_si128(\n          is_reset_simd,\n          _mm_cmpeq_epi16(source_simd, reset_index_guest_endian_simd));\n      is_ffff_simd =\n          _mm_or_si128(is_ffff_simd, _mm_cmpeq_epi16(source_simd, ffff_simd));\n#elif XE_ARCH_ARM64\n      is_reset_simd = vorrq_u16(\n          is_reset_simd, vceqq_u16(source_simd, reset_index_guest_endian_simd));\n      is_ffff_simd = vmaxq_u16(is_ffff_simd, source_simd);\n#else\n#error SIMD Get16BitResetIndexUsage not implemented.\n#endif  // XE_ARCH\n    }\n#if XE_ARCH_AMD64\n    if (_mm_movemask_epi8(is_reset_simd)) {\n      is_reset_index_used_out = true;\n    }\n    if (_mm_movemask_epi8(is_ffff_simd)) {\n      is_ffff_used_as_vertex_index_out = true;\n    }\n#elif XE_ARCH_ARM64\n    uint64x1_t is_reset_any =\n        vreinterpret_u64_u32(vqmovn_u64(vreinterpretq_u64_u16(is_reset_simd)));\n    if (*reinterpret_cast<const uint64_t*>(&is_reset_any)) {\n      is_reset_index_used_out = true;\n    }\n    uint64x1_t is_ffff_any = vreinterpret_u64_u32(\n        vqmovn_u64(vreinterpretq_u64_u16(vceqq_u16(is_ffff_simd, ffff_simd))));\n    if (*reinterpret_cast<const uint64_t*>(&is_ffff_any)) {\n      is_ffff_used_as_vertex_index_out = true;\n    }\n#else\n#error SIMD Get16BitResetIndexUsage not implemented.\n#endif  // XE_ARCH\n  }\n#endif  // XE_GPU_PRIMITIVE_PROCESSOR_SIMD_SIZE\n  while (count--) {\n    uint16_t index = *(source++);\n    if (index == reset_index_guest_endian) {\n      is_reset_index_used_out = true;\n    }\n    if (index == UINT16_MAX) {\n      is_ffff_used_as_vertex_index_out = true;\n    }\n  }\n}\n\nbool PrimitiveProcessor::IsResetUsed(const uint32_t* source, uint32_t count,\n                                     uint32_t reset_index_guest_endian,\n                                     uint32_t low_bits_mask_guest_endian) {\n  // The Xbox 360's GPU only uses the low 24 bits of the index - masking before\n  // comparing.\n#if XE_GPU_PRIMITIVE_PROCESSOR_SIMD_SIZE\n  while (count && (reinterpret_cast<uintptr_t>(source) &\n                   (XE_GPU_PRIMITIVE_PROCESSOR_SIMD_SIZE - 1))) {\n    --count;\n    if ((*(source++) & low_bits_mask_guest_endian) ==\n        reset_index_guest_endian) {\n      return true;\n    }\n  }\n  if (count >= kSimdVectorU32Elements) {\n    SimdVectorU32 reset_index_guest_endian_simd =\n        ReplicateU32(reset_index_guest_endian);\n    while (count >= kSimdVectorU32Elements) {\n      count -= kSimdVectorU32Elements;\n      SimdVectorU32 source_simd = LoadAlignedVectorU32(source);\n      source += kSimdVectorU32Elements;\n      SimdVectorU32 low_bits_mask_guest_endian_simd =\n          ReplicateU32(low_bits_mask_guest_endian);\n#if XE_ARCH_AMD64\n      source_simd = _mm_and_si128(source_simd, low_bits_mask_guest_endian_simd);\n      if (_mm_movemask_epi8(\n              _mm_cmpeq_epi32(source_simd, reset_index_guest_endian_simd))) {\n        return true;\n      }\n#elif XE_ARCH_ARM64\n      source_simd = vandq_u32(source_simd, low_bits_mask_guest_endian_simd);\n      uint64x1_t is_any = vreinterpret_u64_u32(vqmovn_u64(vreinterpretq_u64_u32(\n          vceqq_u32(source_simd, reset_index_guest_endian_simd))));\n      if (*reinterpret_cast<const uint64_t*>(&is_any)) {\n        return true;\n      }\n#else\n#error SIMD 32-bit IsResetUsed not implemented.\n#endif  // XE_ARCH\n    }\n  }\n#endif  // XE_GPU_PRIMITIVE_PROCESSOR_SIMD_SIZE\n  while (count--) {\n    if ((*(source++) & low_bits_mask_guest_endian) ==\n        reset_index_guest_endian) {\n      return true;\n    }\n  }\n  return false;\n}\n\nvoid PrimitiveProcessor::ReplaceResetIndex16To16(\n    uint16_t* dest, const uint16_t* source, uint32_t count,\n    uint16_t reset_index_guest_endian) {\n#if XE_GPU_PRIMITIVE_PROCESSOR_SIMD_SIZE\n  while (count && (reinterpret_cast<uintptr_t>(source) &\n                   (XE_GPU_PRIMITIVE_PROCESSOR_SIMD_SIZE - 1))) {\n    --count;\n    uint16_t index = *(source++);\n    *(dest++) = index != reset_index_guest_endian ? index : UINT16_MAX;\n  }\n  if (count >= kSimdVectorU16Elements) {\n    SimdVectorU16 reset_index_guest_endian_simd =\n        ReplicateU16(reset_index_guest_endian);\n    while (count >= kSimdVectorU16Elements) {\n      count -= kSimdVectorU16Elements;\n      // Comparison produces 0 or 0xFFFF on AVX and Neon - we need 0xFFFF as the\n      // result for the primitive reset indices, so the result is\n      // `index | (index == reset_index)`.\n      SimdVectorU16 source_simd = LoadAlignedVectorU16(source);\n      source += kSimdVectorU16Elements;\n      SimdVectorU16 result_simd;\n#if XE_ARCH_AMD64\n      result_simd = _mm_or_si128(\n          source_simd,\n          _mm_cmpeq_epi16(source_simd, reset_index_guest_endian_simd));\n#elif XE_ARCH_ARM64\n      result_simd = vorrq_u16(\n          source_simd, vceqq_u16(source_simd, reset_index_guest_endian_simd));\n#else\n#error SIMD ReplaceResetIndex16To16 not implemented.\n#endif  // XE_ARCH\n      StoreUnalignedVectorU16(dest, result_simd);\n      dest += kSimdVectorU16Elements;\n    }\n  }\n#endif  // XE_GPU_PRIMITIVE_PROCESSOR_SIMD_SIZE\n  while (count--) {\n    uint16_t index = *(source++);\n    *(dest++) = index != reset_index_guest_endian ? index : UINT16_MAX;\n  }\n}\n\nvoid PrimitiveProcessor::ReplaceResetIndex16To24(\n    uint32_t* dest, const uint16_t* source, uint32_t count,\n    uint16_t reset_index_guest_endian) {\n#if XE_GPU_PRIMITIVE_PROCESSOR_SIMD_SIZE\n  while (count && (reinterpret_cast<uintptr_t>(source) &\n                   (XE_GPU_PRIMITIVE_PROCESSOR_SIMD_SIZE - 1))) {\n    --count;\n    uint16_t index = *(source++);\n    *(dest++) = index != reset_index_guest_endian ? index : UINT32_MAX;\n  }\n  if (count >= kSimdVectorU16Elements) {\n    SimdVectorU16 reset_index_guest_endian_simd =\n        ReplicateU16(reset_index_guest_endian);\n    while (count >= kSimdVectorU16Elements) {\n      count -= kSimdVectorU16Elements;\n      SimdVectorU16 source_simd = LoadAlignedVectorU16(source);\n      source += kSimdVectorU16Elements;\n      // 1) Compare to the reset index as uint16, getting 0 or 0xFFFF.\n      // 2) For primitive reset indices, replace the lower 16 bits with 0xFFFF\n      //    via OR with the comparison result.\n      // 3) Expand to 32-bit, putting 0xFFFF in the upper 16 bits where\n      //    the comparison has passed, creating 0xFFFFFFFF for primitive reset\n      //    or 0x0000#### for non-primitive-reset indices (including\n      //    0x0000FFFF if the original index buffer had 0xFFFF, but the\n      //    primitive reset index is different).\n      // 4) Store.\n#if XE_ARCH_AMD64\n      __m128i are_reset =\n          _mm_cmpeq_epi16(source_simd, reset_index_guest_endian_simd);\n      __m128i result = _mm_or_si128(source_simd, are_reset);\n      StoreUnalignedVectorU32(dest, _mm_unpacklo_epi16(result, are_reset));\n      // Expecting kSimdVectorU16Elements / 2 to be in the immediate offset\n      // part of the address.\n      StoreUnalignedVectorU32(dest + kSimdVectorU16Elements / 2,\n                              _mm_unpackhi_epi16(result, are_reset));\n#elif XE_ARCH_ARM64\n      // Interleaving the indices and 0 / 0xFFFF via st2.\n      uint16x8x2_t result;\n      result.val[1] = vceqq_u16(source_simd, reset_index_guest_endian_simd);\n      result.val[0] = vorrq_u16(source_simd, result.val[1]);\n      vst2q_u16(reinterpret_cast<uint16_t*>(dest), result);\n#else\n#error SIMD ReplaceResetIndex16To24 not implemented.\n#endif  // XE_ARCH\n      dest += kSimdVectorU16Elements;\n    }\n  }\n#endif  // XE_GPU_PRIMITIVE_PROCESSOR_SIMD_SIZE\n  while (count--) {\n    uint16_t index = *(source++);\n    *(dest++) = index != reset_index_guest_endian ? index : UINT32_MAX;\n  }\n}\n\ntemplate void PrimitiveProcessor::ReplaceResetIndex32To24<xenos::Endian::kNone>(\n    uint32_t* dest, const uint32_t* source, uint32_t count,\n    uint32_t reset_index_guest_endian, uint32_t low_bits_mask_guest_endian);\ntemplate void\nPrimitiveProcessor::ReplaceResetIndex32To24<xenos::Endian::k8in16>(\n    uint32_t* dest, const uint32_t* source, uint32_t count,\n    uint32_t reset_index_guest_endian, uint32_t low_bits_mask_guest_endian);\ntemplate void\nPrimitiveProcessor::ReplaceResetIndex32To24<xenos::Endian::k8in32>(\n    uint32_t* dest, const uint32_t* source, uint32_t count,\n    uint32_t reset_index_guest_endian, uint32_t low_bits_mask_guest_endian);\ntemplate void\nPrimitiveProcessor::ReplaceResetIndex32To24<xenos::Endian::k16in32>(\n    uint32_t* dest, const uint32_t* source, uint32_t count,\n    uint32_t reset_index_guest_endian, uint32_t low_bits_mask_guest_endian);\n\n#define XE_GPU_PRIMITIVE_PROCESSOR_INSTANTIATE_CONVERSION_NO_PASSTHROUGH(  \\\n    ConverterName)                                                         \\\n  template void PrimitiveProcessor::ConverterName(                         \\\n      uint32_t* dest, const uint32_t* source, uint32_t source_index_count, \\\n      const To24NonSwappingIndexTransform& index_transform);               \\\n  template void PrimitiveProcessor::ConverterName(                         \\\n      uint32_t* dest, const uint32_t* source, uint32_t source_index_count, \\\n      const To24Swapping8In16IndexTransform& index_transform);             \\\n  template void PrimitiveProcessor::ConverterName(                         \\\n      uint32_t* dest, const uint32_t* source, uint32_t source_index_count, \\\n      const To24Swapping8In32IndexTransform& index_transform);             \\\n  template void PrimitiveProcessor::ConverterName(                         \\\n      uint32_t* dest, const uint32_t* source, uint32_t source_index_count, \\\n      const To24Swapping16In32IndexTransform& index_transform);\n#define XE_GPU_PRIMITIVE_PROCESSOR_INSTANTIATE_CONVERSION(ConverterName)   \\\n  template void PrimitiveProcessor::ConverterName(                         \\\n      uint16_t* dest, const uint16_t* source, uint32_t source_index_count, \\\n      const PassthroughIndexTransform& index_transform);                   \\\n  template void PrimitiveProcessor::ConverterName(                         \\\n      uint32_t* dest, const uint32_t* source, uint32_t source_index_count, \\\n      const PassthroughIndexTransform& index_transform);                   \\\n  XE_GPU_PRIMITIVE_PROCESSOR_INSTANTIATE_CONVERSION_NO_PASSTHROUGH(        \\\n      ConverterName)\nXE_GPU_PRIMITIVE_PROCESSOR_INSTANTIATE_CONVERSION(TriangleFanToList)\nXE_GPU_PRIMITIVE_PROCESSOR_INSTANTIATE_CONVERSION_NO_PASSTHROUGH(\n    LineLoopToStrip)\n// TODO(Triang3l): SIMD quad conversion maybe - 2 vectors to 3 vectors (though\n// multiple quads are rarely drawn anyway).\nXE_GPU_PRIMITIVE_PROCESSOR_INSTANTIATE_CONVERSION(QuadListToTriangleList)\n#undef XE_GPU_PRIMITIVE_PROCESSOR_INSTANTIATE_CONVERSION_NO_PASSTHROUGH\n#undef XE_GPU_PRIMITIVE_PROCESSOR_INSTANTIATE_CONVERSION\n\nvoid PrimitiveProcessor::LineLoopToStrip(\n    uint16_t* dest, const uint16_t* source, uint32_t source_index_count,\n    const PassthroughIndexTransform& index_transform) {\n  if (source_index_count <= 1) {\n    // To match GetLineLoopStripIndexCount.\n    return;\n  }\n  std::memcpy(dest, source, sizeof(*source) * source_index_count);\n  dest[source_index_count] = source[0];\n}\nvoid PrimitiveProcessor::LineLoopToStrip(\n    uint32_t* dest, const uint32_t* source, uint32_t source_index_count,\n    const PassthroughIndexTransform& index_transform) {\n  if (source_index_count <= 1) {\n    // To match GetLineLoopStripIndexCount.\n    return;\n  }\n  std::memcpy(dest, source, sizeof(*source) * source_index_count);\n  dest[source_index_count] = source[0];\n}\n\nuint32_t PrimitiveProcessor::GetMultiPrimitiveHostIndexCountAndRanges(\n    std::function<uint32_t(uint32_t)> single_primitive_guest_to_host_count,\n    const uint16_t* source, uint32_t source_index_count,\n    uint16_t reset_index_guest_endian,\n    std::deque<SinglePrimitiveRange>& ranges_append_out) {\n  uint32_t host_total_index_count = 0;\n  uint32_t guest_index_offset = 0;\n  for (;;) {\n    uint32_t guest_primitive_offset = guest_index_offset;\n    while (guest_index_offset < source_index_count) {\n      if (source[guest_index_offset] == reset_index_guest_endian) {\n        break;\n      }\n      ++guest_index_offset;\n    }\n    // Reset encountered or end of the index buffer - add the range.\n    uint32_t guest_primitive_index_count =\n        guest_index_offset - guest_primitive_offset;\n    uint32_t host_primitive_index_count =\n        single_primitive_guest_to_host_count(guest_primitive_index_count);\n    if (host_primitive_index_count) {\n      ranges_append_out.emplace_back(guest_primitive_offset,\n                                     guest_primitive_index_count,\n                                     host_primitive_index_count);\n      host_total_index_count += host_primitive_index_count;\n    }\n    if (guest_index_offset >= source_index_count) {\n      // End of the index buffer.\n      break;\n    }\n    // Reset index encountered - skip.\n    ++guest_index_offset;\n  }\n  return host_total_index_count;\n}\n\nuint32_t PrimitiveProcessor::GetMultiPrimitiveHostIndexCountAndRanges(\n    std::function<uint32_t(uint32_t)> single_primitive_guest_to_host_count,\n    const uint32_t* source, uint32_t source_index_count,\n    uint32_t reset_index_guest_endian, uint32_t low_bits_mask_guest_endian,\n    std::deque<SinglePrimitiveRange>& ranges_append_out) {\n  uint32_t host_total_index_count = 0;\n  uint32_t guest_index_offset = 0;\n  for (;;) {\n    uint32_t guest_primitive_offset = guest_index_offset;\n    while (guest_index_offset < source_index_count) {\n      if ((source[guest_index_offset] & low_bits_mask_guest_endian) ==\n          reset_index_guest_endian) {\n        break;\n      }\n      ++guest_index_offset;\n    }\n    // Reset encountered or end of the index buffer - add the range.\n    uint32_t guest_primitive_index_count =\n        guest_index_offset - guest_primitive_offset;\n    uint32_t host_primitive_index_count =\n        single_primitive_guest_to_host_count(guest_primitive_index_count);\n    if (host_primitive_index_count) {\n      ranges_append_out.emplace_back(guest_primitive_offset,\n                                     guest_primitive_index_count,\n                                     host_primitive_index_count);\n      host_total_index_count += host_primitive_index_count;\n    }\n    if (guest_index_offset >= source_index_count) {\n      // End of the index buffer.\n      break;\n    }\n    // Reset index encountered - skip.\n    ++guest_index_offset;\n  }\n  return host_total_index_count;\n}\n\nPrimitiveProcessor::CacheTransaction::CacheTransaction(\n    PrimitiveProcessor& processor, CacheKey key)\n    : processor_(processor), key_(key) {\n  assert_zero(processor_.cache_currently_processing_size_bytes_);\n  if (cvars::primitive_processor_cache_min_indices < 0 ||\n      key_.count < uint32_t(cvars::primitive_processor_cache_min_indices)) {\n    // Don't cache if the vertex count is too small.\n    key_.key = 0;\n  }\n  if (!key_.count) {\n    return;\n  }\n  uint32_t size_bytes =\n      (key_.format == xenos::IndexFormat::kInt16 ? sizeof(uint16_t)\n                                                 : sizeof(uint32_t)) *\n      key_.count;\n  {\n    auto global_lock = processor_.global_critical_region_.Acquire();\n    auto cache_map_it = processor_.cache_map_.find(key_);\n    if (cache_map_it != processor_.cache_map_.end()) {\n      result_ = processor_.cache_entry_pool_[cache_map_it->second].result;\n      result_type_ = ResultType::kExisting;\n    } else {\n      // Inhibit writing the new result if the range happens to be modified\n      // during the processing outside the lock.\n      processor_.cache_currently_processing_base_ = key_.base;\n      processor_.cache_currently_processing_size_bytes_ = size_bytes;\n    }\n  }\n  if (result_type_ != ResultType::kExisting) {\n    // Enable the invalidation callback before reading the indices.\n    // Also, only enable invalidation callbacks if anything needed processing at\n    // all - don't waste time in the access violation handler doing nothing if\n    // the guest doesn't use anything requiring host conversion.\n    if (!processor_.memory_invalidation_callback_handle_) {\n      processor_.memory_invalidation_callback_handle_ =\n          processor_.memory_.RegisterPhysicalMemoryInvalidationCallback(\n              MemoryInvalidationCallbackThunk, &processor_);\n    }\n    processor_.memory_.EnablePhysicalMemoryAccessCallbacks(\n        key_.base, size_bytes, true, false);\n  }\n}\n\nPrimitiveProcessor::CacheTransaction::~CacheTransaction() {\n  if (!key_.count || result_type_ == ResultType::kExisting) {\n    return;\n  }\n\n  auto global_lock = processor_.global_critical_region_.Acquire();\n\n  processor_.cache_currently_processing_base_ = 0;\n  processor_.cache_currently_processing_size_bytes_ = 0;\n\n  if (result_type_ == ResultType::kNewSet) {\n    size_t new_entry_index;\n    if (processor_.cache_bucket_free_first_entry_ != SIZE_MAX) {\n      new_entry_index = processor_.cache_bucket_free_first_entry_;\n      processor_.cache_bucket_free_first_entry_ =\n          processor_.cache_entry_pool_[new_entry_index].free_next;\n    } else {\n      new_entry_index = processor_.cache_entry_pool_.size();\n      processor_.cache_entry_pool_.emplace_back();\n    }\n    CacheEntry& new_entry = processor_.cache_entry_pool_[new_entry_index];\n\n    // Put the entry in 1 or 2 buckets.\n    uint32_t bucket_start_index = key_.base >> kCacheBucketSizeBytesLog2;\n    uint32_t bucket_count = CacheEntry::GetBucketCount(key_);\n    for (uint32_t link_index = 0; link_index < bucket_count; ++link_index) {\n      new_entry.buckets_prev[link_index] = SIZE_MAX;\n      uint32_t bucket_index = bucket_start_index + link_index;\n      uint64_t& bucket_non_empty_l1_ref =\n          processor_.cache_buckets_non_empty_l1_[bucket_index >> 6];\n      uint64_t bucket_non_empty_l1_bit = uint64_t(1) << (bucket_index & 63);\n      size_t& bucket_first_entry_ref =\n          processor_.cache_bucket_first_entries_[bucket_index];\n      if (bucket_non_empty_l1_ref & bucket_non_empty_l1_bit) {\n        // There is at least one entry already in the bucket - link to the\n        // first.\n        new_entry.buckets_next[link_index] = bucket_first_entry_ref;\n        CacheEntry& bucket_first_entry =\n            processor_.cache_entry_pool_[bucket_first_entry_ref];\n        // If the start ([0]) bucket of bucket_first_entry is bucket_index,\n        // update its link [0]. Otherwise, since a cache entry may belong only\n        // to at most 2 buckets, bucket_index must be its [1] bucket.\n        bucket_first_entry\n            .buckets_prev[size_t((bucket_first_entry.key.base >>\n                                  kCacheBucketSizeBytesLog2) != bucket_index)] =\n            new_entry_index;\n      } else {\n        new_entry.buckets_next[link_index] = SIZE_MAX;\n        bucket_non_empty_l1_ref |= bucket_non_empty_l1_bit;\n        processor_.UpdateCacheBucketsNonEmptyL2(bucket_index >> 6, global_lock);\n      }\n      bucket_first_entry_ref = new_entry_index;\n    }\n\n    new_entry.key = key_;\n    new_entry.result = result_;\n\n    processor_.cache_map_.emplace(key_, new_entry_index);\n  }\n}\n\nstd::pair<uint32_t, uint32_t> PrimitiveProcessor::MemoryInvalidationCallback(\n    uint32_t physical_address_start, uint32_t length, bool exact_range) {\n  if (length == 0 || physical_address_start >= SharedMemory::kBufferSize) {\n    return std::make_pair(uint32_t(0), UINT32_MAX);\n  }\n  length = std::min(length, SharedMemory::kBufferSize - physical_address_start);\n  uint32_t physical_address_end = physical_address_start + length;\n  if (!exact_range) {\n    // Invalidate entire buckets if this is an access callback rather than\n    // something like a file read to disable access violation handling for a\n    // bigger range for higher performance.\n    physical_address_start &= ~(kCacheBucketSizeBytes - 1);\n    physical_address_end =\n        xe::align(physical_address_end, kCacheBucketSizeBytes);\n  }\n  bool any_invalidated = false;\n  uint32_t bucket_index_first =\n      physical_address_start >> kCacheBucketSizeBytesLog2;\n  uint32_t bucket_index_last =\n      (physical_address_end - 1) >> kCacheBucketSizeBytesLog2;\n  uint32_t bucket_l1_bits_index_first = bucket_index_first >> 6;\n  uint32_t bucket_l1_bits_index_last = bucket_index_last >> 6;\n  uint32_t bucket_l2_bits_index_first = bucket_index_first >> 12;\n  uint32_t bucket_l2_bits_index_last = bucket_index_last >> 12;\n  auto global_lock = global_critical_region_.Acquire();\n  for (uint32_t bucket_l2_bits_index = bucket_l2_bits_index_first;\n       bucket_l2_bits_index <= bucket_l2_bits_index_last;\n       ++bucket_l2_bits_index) {\n    uint64_t bucket_l2_bits_mask = UINT64_MAX;\n    if (bucket_l2_bits_index == bucket_l2_bits_index_first) {\n      bucket_l2_bits_mask &=\n          ~((uint64_t(1) << (bucket_l1_bits_index_first & 63)) - 1);\n    }\n    if (bucket_l2_bits_index == bucket_l2_bits_index_last &&\n        (bucket_l1_bits_index_last & 63) != 63) {\n      bucket_l2_bits_mask &=\n          (uint64_t(1) << ((bucket_l1_bits_index_last & 63) + 1)) - 1;\n    }\n    // Not caching L2 bits because they may be modified by unlinking.\n    // Loop until any bits in the 64-bit portion of the L2 bit set are left.\n    while (bucket_l2_bits_mask) {\n      uint32_t bucket_l2_bit_shift;\n      if (!xe::bit_scan_forward(\n              cache_buckets_non_empty_l2_[bucket_l2_bits_index] &\n                  bucket_l2_bits_mask,\n              &bucket_l2_bit_shift)) {\n        break;\n      }\n      bucket_l2_bits_mask &= ~(uint64_t(1) << bucket_l2_bit_shift);\n      uint32_t bucket_l1_bits_index =\n          (bucket_l2_bits_index << 6) | bucket_l2_bit_shift;\n      uint64_t bucket_l1_bits_mask = UINT64_MAX;\n      if (bucket_l1_bits_index == bucket_l1_bits_index_first) {\n        bucket_l1_bits_mask &=\n            ~((uint64_t(1) << (bucket_index_first & 63)) - 1);\n      }\n      if (bucket_l1_bits_index == bucket_l1_bits_index_last &&\n          (bucket_index_last & 63) != 63) {\n        bucket_l1_bits_mask &=\n            (uint64_t(1) << ((bucket_index_last & 63) + 1)) - 1;\n      }\n      // Not caching L1 bits because they may be modified by unlinking.\n      // Loop over buckets until any bits in the 64-bit portion of the L1 bit\n      // set are left.\n      while (bucket_l1_bits_mask) {\n        uint32_t bucket_l1_bit_shift;\n        if (!xe::bit_scan_forward(\n                cache_buckets_non_empty_l1_[bucket_l1_bits_index] &\n                    bucket_l1_bits_mask,\n                &bucket_l1_bit_shift)) {\n          break;\n        }\n        bucket_l1_bits_mask &= ~(uint64_t(1) << bucket_l1_bit_shift);\n        uint32_t bucket_index =\n            (bucket_l1_bits_index << 6) | bucket_l1_bit_shift;\n        // Invalidate the entries in the bucket, fully or partially.\n        size_t entry_index = cache_bucket_first_entries_[bucket_index];\n        do {\n          CacheEntry& entry = cache_entry_pool_[entry_index];\n          CacheKey entry_key = entry.key;\n          // If the start ([0]) bucket of the entry is bucket_index, the link\n          // within this bucket is its link [0]. Otherwise, since a cache entry\n          // may belong only to at most 2 buckets, bucket_index must be its [1]\n          // bucket.\n          uint32_t entry_bucket_index_first =\n              entry_key.base >> kCacheBucketSizeBytesLog2;\n          assert_true((bucket_index - entry_bucket_index_first) <= 1,\n                      \"Cache entries only store list links within two buckets\");\n          size_t next_entry_index =\n              entry.buckets_next[bucket_index - entry_bucket_index_first];\n          // For exact_range, don't invalidate bucket entries that are outside\n          // the specified range.\n          if (entry_key.base < physical_address_end) {\n            uint32_t entry_end = entry_key.base + entry_key.GetSizeBytes();\n            if (entry_end > physical_address_end) {\n              // Invalidate the entry.\n              any_invalidated = true;\n              // Remove the entry from the cache map.\n              auto entry_map_it = cache_map_.find(entry_key);\n              assert_true(entry_map_it != cache_map_.end());\n              if (entry_map_it != cache_map_.end()) {\n                cache_map_.erase(entry_map_it);\n              }\n              // Unlink the entry from the bucket's list.\n              uint32_t entry_link_index_last =\n                  ((entry_end - 1) >> kCacheBucketSizeBytesLog2) -\n                  entry_bucket_index_first;\n              assert_true(\n                  entry_link_index_last <= 1,\n                  \"Cache entries only store list links within two buckets\");\n              for (uint32_t entry_link_index = 0;\n                   entry_link_index <= entry_link_index_last;\n                   ++entry_link_index) {\n                uint32_t entry_bucket_index =\n                    entry_bucket_index_first + entry_link_index;\n                size_t entry_link_prev = entry.buckets_prev[entry_link_index];\n                size_t entry_link_next = entry.buckets_next[entry_link_index];\n                if (entry_link_prev != SIZE_MAX) {\n                  CacheEntry& entry_prev = cache_entry_pool_[entry_link_prev];\n                  entry_prev.buckets_next[size_t(\n                      (entry_prev.key.base >> kCacheBucketSizeBytesLog2) !=\n                      entry_bucket_index)] = entry_link_next;\n                } else {\n                  if (entry_link_next != SIZE_MAX) {\n                    cache_bucket_first_entries_[entry_bucket_index] =\n                        entry_link_next;\n                  } else {\n                    // The only entry that was remaining in the bucket - it's\n                    // empty now.\n                    cache_buckets_non_empty_l1_[entry_bucket_index >> 6] &=\n                        ~(uint64_t(1) << (entry_bucket_index & 63));\n                    UpdateCacheBucketsNonEmptyL2(entry_bucket_index >> 6,\n                                                 global_lock);\n                  }\n                }\n                if (entry_link_next != SIZE_MAX) {\n                  CacheEntry& entry_next = cache_entry_pool_[entry_link_next];\n                  entry_next.buckets_prev[size_t(\n                      (entry_next.key.base >> kCacheBucketSizeBytesLog2) !=\n                      entry_bucket_index)] = entry_link_prev;\n                }\n              }\n              // Make the entry free for reuse.\n              entry.free_next = cache_bucket_free_first_entry_;\n              cache_bucket_free_first_entry_ = entry_index;\n            }\n          }\n          entry_index = next_entry_index;\n        } while (entry_index != SIZE_MAX);\n      }\n    }\n  }\n  return any_invalidated\n             ? std::make_pair(physical_address_start,\n                              physical_address_end - physical_address_start)\n             : std::make_pair(uint32_t(0), UINT32_MAX);\n}\n\nstd::pair<uint32_t, uint32_t>\nPrimitiveProcessor::MemoryInvalidationCallbackThunk(\n    void* context_ptr, uint32_t physical_address_start, uint32_t length,\n    bool exact_range) {\n  return reinterpret_cast<PrimitiveProcessor*>(context_ptr)\n      ->MemoryInvalidationCallback(physical_address_start, length, exact_range);\n}\n\n}  // namespace gpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/primitive_processor.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_PRIMITIVE_PROCESSOR_H_\n#define XENIA_GPU_PRIMITIVE_PROCESSOR_H_\n\n#include <algorithm>\n#include <climits>\n#include <cstddef>\n#include <cstdint>\n#include <cstring>\n#include <deque>\n#include <functional>\n#include <mutex>\n#include <unordered_map>\n#include <utility>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/cvar.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/mutex.h\"\n#include \"xenia/base/platform.h\"\n#include \"xenia/gpu/register_file.h\"\n#include \"xenia/gpu/shader.h\"\n#include \"xenia/gpu/shared_memory.h\"\n#include \"xenia/gpu/trace_writer.h\"\n#include \"xenia/gpu/xenos.h\"\n#include \"xenia/memory.h\"\n\n#if XE_ARCH_AMD64\n// 128-bit SSSE3-level (SSE2+ for integer comparison, SSSE3 for pshufb) or AVX\n// (256-bit AVX only got integer operations such as comparison in AVX2, which is\n// above the minimum requirements of Xenia).\n#include <tmmintrin.h>\n#define XE_GPU_PRIMITIVE_PROCESSOR_SIMD_SIZE 16\n#elif XE_ARCH_ARM64\n#include <arm_neon.h>\n#define XE_GPU_PRIMITIVE_PROCESSOR_SIMD_SIZE 16\n#else\n#define XE_GPU_PRIMITIVE_PROCESSOR_SIMD_SIZE 0\n#endif  // XE_ARCH\n\n// The idea behind this config variable is to force both indirection without\n// primitive reset and pre-masking / pre-swapping with primitive reset,\n// therefore this is supposed to be checked only by the host if it supports\n// indirection. It's pretty pointless to do only half of this on backends that\n// support full 32-bit indices unconditionally.\nDECLARE_bool(ignore_32bit_vertex_index_support);\n\nnamespace xe {\nnamespace gpu {\n\n// Normalizes primitive data in various ways for use with Direct3D 12 and Vulkan\n// (down to its minimum requirements plus the portability subset).\n//\n// This solves various issues:\n// - Triangle fans not supported on Direct3D 10+ and the Vulkan portability\n//   subset.\n//   - Converts to triangle lists, both with and without primitive reset.\n// - Line loops are not supported on Direct3D 12 or Vulkan.\n//   - Converts to line strips.\n// - Quads not reproducible with line lists with adjacency without geometry\n//   shaders (some Vulkan implementations), as well as being hard to debug in\n//   PIX due to \"catastrophic failures\".\n//   - Converts to triangle lists.\n// - Vulkan requiring 0xFFFF primitive restart index for 16-bit indices and\n//   0xFFFFFFFF for 32-bit (Direct3D 12 slightly relaxes this, allowing 0xFFFF\n//   for 32-bit also, but it's of no use to Xenia since guest indices are\n//   big-endian usually. Also, only 24 lower bits of the vertex index being used\n//   on the guest (tested on an Adreno 200 phone with drawing, though not with\n//   primitive restart as OpenGL ES 2.0 doesn't expose it), so the upper 8 bits\n//   likely shouldn't have effect on primitive restart (guest reset index\n//   0xFFFFFF likely working for 0xFFFFFF, 0xFFFFFFFF, and 254 more indices),\n//   while Vulkan and Direct3D 12 require exactly 0xFFFFFFFF.\n//   - For 16-bit indices with guest reset index other than 0xFFFF (passing\n//     0xFFFF directly to the host is fine because it's the same irrespective of\n//     endianness), there are two possible solutions:\n//     - If the index buffer otherwise doesn't contain 0xFFFF otherwise (since\n//       it's a valid vertex index in this case), replacing the primitive reset\n//       index with 0xFFFF in the 16-bit buffer.\n//     - If the index buffer contains any usage of 0xFFFF as a real vertex\n//       index, converting the index buffer to 32-bit, and replacing the\n//       primitive reset index with 0xFFFFFFFF.\n//   - For 32-bit indices, there are two paths:\n//     - If the guest reset index is 0xFFFFFF, and the index buffer actually\n//       uses only 0xFFFFFFFF for reset, using it without changes.\n//     - If the guest uses something other than 0xFFFFFFFF for primitive reset,\n//       replacing elements with (index & 0xFFFFFF) == reset_index with\n//       0xFFFFFFFF.\n// - Some Vulkan implementations only support 24-bit indices. The guests usually\n//   pass big-endian vertices, so we need all 32 bits (as the least significant\n//   bits will be in 24...31) to perform the byte swapping. For this reason, we\n//   load 32-bit indices indirectly, doing non-indexed draws and fetching the\n//   indices from the shared memory. This, however, is not compatible with\n//   primitive restart.\n//   - Pre-swapping, masking to 24 bits, and converting the reset index to\n//     0xFFFFFFFF, resulting in an index buffer that can be used directly.\n\nclass PrimitiveProcessor {\n public:\n  enum ProcessedIndexBufferType {\n    // Auto-indexed on the host.\n    kNone,\n    // GPU DMA, from the shared memory.\n    // For 32-bit, indirection is needed if the host only supports 24-bit\n    // indices (even for non-endian-swapped, as the GPU should be ignoring the\n    // upper 8 bits completely, rather than exhibiting undefined behavior.\n    kGuestDMA,\n    // Converted and stored in the primitive converter for the current draw\n    // command. For 32-bit indices, if the host doesn't support all 32 bits,\n    // this kind of an index buffer will always be pre-masked and pre-swapped.\n    kHostConverted,\n    // Auto-indexed on the guest, but with an adapter index buffer on the host.\n    kHostBuiltinForAuto,\n    // Adapter index buffer on the host for indirect loading of indices via DMA\n    // (from the shared memory).\n    kHostBuiltinForDMA,\n  };\n\n  struct ProcessingResult {\n    xenos::PrimitiveType guest_primitive_type;\n    xenos::PrimitiveType host_primitive_type;\n    // Includes whether tessellation is enabled (not kVertex) and the type of\n    // tessellation.\n    Shader::HostVertexShaderType host_vertex_shader_type;\n    // Only used for non-kVertex host_vertex_shader_type. For kAdaptive, the\n    // index buffer is always from the guest and fully 32-bit, and contains the\n    // floating-point tessellation factors.\n    xenos::TessellationMode tessellation_mode;\n    // TODO(Triang3l): If important, split into the index count and the actual\n    // index buffer size, using zeros for out-of-bounds indices.\n    uint32_t host_draw_vertex_count;\n    uint32_t line_loop_closing_index;\n    ProcessedIndexBufferType index_buffer_type;\n    uint32_t guest_index_base;\n    xenos::IndexFormat host_index_format;\n    xenos::Endian host_shader_index_endian;\n    // The reset index, if enabled, is always 0xFFFF for host_index_format\n    // kInt16 and 0xFFFFFFFF for kInt32. Never enabled for \"list\" primitive\n    // types, thus safe for direct usage on Vulkan.\n    bool host_primitive_reset_enabled;\n    // Backend-specific handle for the index buffer valid for the current draw,\n    // only valid for index_buffer_type kHostConverted, kHostBuiltinForAuto and\n    // kHostBuiltinForDMA.\n    size_t host_index_buffer_handle;\n    bool IsTessellated() const {\n      return Shader::IsHostVertexShaderTypeDomain(host_vertex_shader_type);\n    }\n  };\n\n  virtual ~PrimitiveProcessor();\n\n  bool AreFull32BitVertexIndicesUsed() const {\n    return full_32bit_vertex_indices_used_;\n  }\n  bool IsConvertingTriangleFansToLists() const {\n    return convert_triangle_fans_to_lists_;\n  }\n  bool IsConvertingLineLoopsToStrips() const {\n    return convert_line_loops_to_strips_;\n  }\n  // Quad lists may be emulated as line lists with adjacency and a geometry\n  // shader, but geometry shaders must be supported for this.\n  bool IsConvertingQuadListsToTriangleLists() const {\n    return convert_quad_lists_to_triangle_lists_;\n  }\n  bool IsExpandingPointSpritesInVS() const {\n    return expand_point_sprites_in_vs_;\n  }\n  bool IsExpandingRectangleListsInVS() const {\n    return expand_rectangle_lists_in_vs_;\n  }\n\n  // Submission must be open to call (may request the index buffer in the shared\n  // memory).\n  bool Process(ProcessingResult& result_out);\n\n  // Invalidates the cache within the range.\n  std::pair<uint32_t, uint32_t> MemoryInvalidationCallback(\n      uint32_t physical_address_start, uint32_t length, bool exact_range);\n\n protected:\n  // For host-side index buffer creation, the biggest possibly needed contiguous\n  // allocation, in indices.\n  // - No conversion: up to 0xFFFF vertices (as the vertex count in\n  //   VGT_DRAW_INITIATOR is 16-bit).\n  // - Triangle fans to lists: since the 3rd vertex, every guest vertex creates\n  //   a triangle, thus the maximum is 3 * (UINT16_MAX - 2), or 0x2FFF7.\n  //   Primitive reset can only slow down the amplification - the 3 vertices\n  //   after a reset add 1 host vertex each, not 3 each.\n  // - Line loops to strips: adding 1 vertex if there are at least 2 vertices in\n  //   the original primitive, either replacing the primitive reset index with\n  //   this new closing vertex, or in case of the final primitive, just adding a\n  //   vertex - thus the absolute limit is UINT16_MAX + 1, or 0x10000.\n  // - Quad lists to triangle lists: vertices are processed in groups of 4, each\n  //   group converted to 6 vertices, so the limit is 1.5 * 0xFFFC, or 0x17FFA.\n  // Thus, the maximum vertex count is defined by triangle fan to list\n  // conversion.\n  // Also include padding for co-alignment of the source and the destination for\n  // SIMD.\n  static constexpr uint32_t kMinRequiredConvertedIndexBufferSize =\n      sizeof(uint32_t) * (UINT16_MAX - 2) * 3 *\n      +XE_GPU_PRIMITIVE_PROCESSOR_SIMD_SIZE;\n\n  PrimitiveProcessor(const RegisterFile& register_file, Memory& memory,\n                     TraceWriter& trace_writer, SharedMemory& shared_memory)\n      : register_file_(register_file),\n        memory_(memory),\n        trace_writer_(trace_writer),\n        shared_memory_(shared_memory) {}\n\n  // Call from the backend-specific initialization function.\n  // - full_32bit_vertex_indices_supported:\n  //   - If the backend supports 32-bit indices unconditionally, and doesn't\n  //     generate indirection logic in vertex shaders, pass hard-coded `true`.\n  //   - Otherwise:\n  //     - If the host doesn't support full 32-bit indices (but supports at\n  //       least 24-bit indices), pass `false`.\n  //     - If the host supports 32-bit indices, but the backend can handle both\n  //       cases, pass `cvars::ignore_32bit_vertex_index_support`, and\n  //       afterwards, check `AreFull32BitVertexIndicesUsed()` externally to see\n  //       if indirection may be needed.\n  //     - When full 32-bit indices are not supported, the host must be using\n  //       auto-indexed draws for 32-bit indices of ProcessedIndexBufferType\n  //       kGuestDMA, while fetching the index data manually from the shared\n  //       memory buffer and endian-swapping it.\n  //     - Indirection, however, precludes primitive reset usage - so if\n  //       primitive reset is needed, the primitive processor will pre-swap and\n  //       pre-mask the index buffer so there are only host-endian 0x00###### or\n  //       0xFFFFFFFF values in it. In this case, a kHostConverted index buffer\n  //       is returned from Process, and indirection is not needed (and\n  //       impossible since the index buffer is not in the shared memory buffer\n  //       anymore), though byte swap is still needed as 16-bit indices may also\n  //       be kHostConverted, while they are completely unaffected by this. The\n  //       same applies to primitive type conversion - if it happens for 32-bit\n  //       guest indices, and kHostConverted is returned, they will be\n  //       pre-swapped and pre-masked.\n  // - triangle_fans_supported, line_loops_supported, quad_lists_supported:\n  //   - Pass true or false depending on whether the host actually supports\n  //     those guest primitive types directly or through geometry shader\n  //     emulation. Debug overriding will be resolved in the common code if\n  //     needed.\n  // - point_sprites_supported_without_vs_expansion,\n  //   rectangle_lists_supported_without_vs_expansion:\n  //   - Pass true or false depending on whether the host actually supports\n  //     those guest primitive types directly or through geometry shader\n  //     emulation. Overrides do not apply to these as hosts are not required to\n  //     support the fallback paths since they require different vertex shader\n  //     structure (for the fallback HostVertexShaderTypes).\n  bool InitializeCommon(bool full_32bit_vertex_indices_supported,\n                        bool triangle_fans_supported, bool line_loops_supported,\n                        bool quad_lists_supported,\n                        bool point_sprites_supported_without_vs_expansion,\n                        bool rectangle_lists_supported_without_vs_expansion);\n  // If any primitive type conversion is needed for auto-indexed draws, called\n  // from InitializeCommon (thus only once in the primitive processor's\n  // lifetime) to set up the backend's index buffer containing indices for\n  // primitive type remapping. The backend must allocate a 4-byte-aligned buffer\n  // with `size_bytes` and call fill_callback for its mapping if creation has\n  // been successful.\n  virtual bool InitializeBuiltinIndexBuffer(\n      size_t size_bytes, std::function<void(void*)> fill_callback) = 0;\n  // Call last in implementation-specific shutdown, also callable from the\n  // destructor.\n  void ShutdownCommon();\n\n  // Call at boundaries of lifespans of converted data (between frames,\n  // preferably in the end of a frame so between the swap and the next draw,\n  // access violation handlers need to do less work).\n  void ClearPerFrameCache();\n\n  static constexpr size_t GetBuiltinIndexBufferOffsetBytes(size_t handle) {\n    // For simplicity, just using the handles as byte offsets.\n    return handle;\n  }\n\n  // The destination allocation must have XE_GPU_PRIMITIVE_PROCESSOR_SIMD_SIZE\n  // excess bytes.\n  static ptrdiff_t GetSimdCoalignmentOffset(const void* host_index_ptr,\n                                            uint32_t guest_index_base) {\n#if XE_GPU_PRIMITIVE_PROCESSOR_SIMD_SIZE\n    // Always moving the host pointer only forward into the allocation padding\n    // space of XE_GPU_PRIMITIVE_PROCESSOR_SIMD_SIZE bytes. Without relying on\n    // two's complement wrapping overflow behavior, the logic would look like:\n    // uintptr_t host_subalignment =\n    //     reinterpret_cast<uintptr_t>(host_index_ptr) &\n    //     (XE_GPU_PRIMITIVE_PROCESSOR_SIMD_SIZE - 1);\n    // uint32_t guest_subalignment = guest_index_base &\n    //                               (XE_GPU_PRIMITIVE_PROCESSOR_SIMD_SIZE - 1);\n    // uintptr_t host_index_address_aligned = host_index_address;\n    // if (guest_subalignment >= host_subalignment) {\n    //   return guest_subalignment - host_subalignment;\n    // }\n    // return XE_GPU_PRIMITIVE_PROCESSOR_SIMD_SIZE -\n    //        (host_subalignment - guest_subalignment);\n    return ptrdiff_t(\n        (guest_index_base - reinterpret_cast<uintptr_t>(host_index_ptr)) &\n        (XE_GPU_PRIMITIVE_PROCESSOR_SIMD_SIZE - 1));\n#else\n    return 0;\n#endif\n  }\n\n  // Requests a buffer to write the new transformed indices to. The lifetime of\n  // the returned buffer must be that of the current frame. Returns the mapping\n  // of the buffer to write to, or nullptr in case of failure, in addition to,\n  // if successful, a handle that can be used by the backend's command processor\n  // to access the backend-specific data for binding the buffer.\n  virtual void* RequestHostConvertedIndexBufferForCurrentFrame(\n      xenos::IndexFormat format, uint32_t index_count, bool coalign_for_simd,\n      uint32_t coalignment_original_address, size_t& backend_handle_out) = 0;\n\n private:\n#if XE_GPU_PRIMITIVE_PROCESSOR_SIMD_SIZE\n#if XE_ARCH_AMD64\n  // SSSE3 or AVX.\n  using SimdVectorU16 = __m128i;\n  using SimdVectorU32 = __m128i;\n  static SimdVectorU16 ReplicateU16(uint16_t value) {\n    return _mm_set1_epi16(int16_t(value));\n  }\n  static SimdVectorU32 ReplicateU32(uint32_t value) {\n    return _mm_set1_epi32(int32_t(value));\n  }\n  static SimdVectorU16 LoadAlignedVectorU16(const uint16_t* source) {\n    return _mm_load_si128(reinterpret_cast<const __m128i*>(source));\n  }\n  static SimdVectorU32 LoadAlignedVectorU32(const uint32_t* source) {\n    return _mm_load_si128(reinterpret_cast<const __m128i*>(source));\n  }\n  static void StoreUnalignedVectorU16(uint16_t* dest, SimdVectorU16 source) {\n    _mm_storeu_si128(reinterpret_cast<__m128i*>(dest), source);\n  }\n  static void StoreUnalignedVectorU32(uint32_t* dest, SimdVectorU32 source) {\n    _mm_storeu_si128(reinterpret_cast<__m128i*>(dest), source);\n  }\n#elif XE_ARCH_ARM64\n  // NEON.\n  using SimdVectorU16 = uint16x8_t;\n  using SimdVectorU32 = uint32x4_t;\n  static SimdVectorU16 ReplicateU16(uint16_t value) {\n    return vdupq_n_u16(value);\n  }\n  static SimdVectorU32 ReplicateU32(uint32_t value) {\n    return vdupq_n_u32(value);\n  }\n  static SimdVectorU16 LoadAlignedVectorU16(const uint16_t* source) {\n#if XE_COMPILER_MSVC\n    return vld1q_u16_ex(source, sizeof(uint16x8_t) * CHAR_BIT);\n#else\n    return vld1q_u16(reinterpret_cast<const uint16_t*>(\n        __builtin_assume_aligned(source, sizeof(uint16x8_t))));\n#endif\n  }\n  static SimdVectorU32 LoadAlignedVectorU32(const uint32_t* source) {\n#if XE_COMPILER_MSVC\n    return vld1q_u32_ex(source, sizeof(uint16x8_t) * CHAR_BIT);\n#else\n    return vld1q_u32(reinterpret_cast<const uint32_t*>(\n        __builtin_assume_aligned(source, sizeof(uint32x4_t))));\n#endif\n  }\n  static void StoreUnalignedVectorU16(uint16_t* dest, SimdVectorU16 source) {\n    vst1q_u16(dest, source);\n  }\n  static void StoreUnalignedVectorU32(uint32_t* dest, SimdVectorU32 source) {\n    vst1q_u32(dest, source);\n  }\n#else\n#error SIMD vector types and constant loads not specified.\n#endif  // XE_ARCH\n  static_assert(\n      sizeof(SimdVectorU16) == XE_GPU_PRIMITIVE_PROCESSOR_SIMD_SIZE,\n      \"XE_GPU_PRIMITIVE_PROCESSOR_SIMD_SIZE must reflect the vector size \"\n      \"actually used\");\n  static_assert(\n      sizeof(SimdVectorU32) == XE_GPU_PRIMITIVE_PROCESSOR_SIMD_SIZE,\n      \"XE_GPU_PRIMITIVE_PROCESSOR_SIMD_SIZE must reflect the vector size \"\n      \"actually used\");\n  static constexpr uint32_t kSimdVectorU16Elements =\n      sizeof(SimdVectorU16) / sizeof(uint16_t);\n  static constexpr uint32_t kSimdVectorU32Elements =\n      sizeof(SimdVectorU32) / sizeof(uint32_t);\n#endif  // XE_GPU_PRIMITIVE_PROCESSOR_SIMD_SIZE\n\n  static bool IsResetUsed(const uint16_t* source, uint32_t count,\n                          uint16_t reset_index_guest_endian);\n  static void Get16BitResetIndexUsage(const uint16_t* source, uint32_t count,\n                                      uint16_t reset_index_guest_endian,\n                                      bool& is_reset_index_used_out,\n                                      bool& is_ffff_used_as_vertex_index_out);\n  static bool IsResetUsed(const uint32_t* source, uint32_t count,\n                          uint32_t reset_index_guest_endian,\n                          uint32_t low_bits_mask_guest_endian);\n  static void ReplaceResetIndex16To16(uint16_t* dest, const uint16_t* source,\n                                      uint32_t count,\n                                      uint16_t reset_index_guest_endian);\n  // For use when the reset index is not 0xFFFF, and 0xFFFF is also used as a\n  // valid index - keeps 0xFFFF as a real index and replaces the reset index\n  // with 0xFFFFFFFF instead.\n  static void ReplaceResetIndex16To24(uint32_t* dest, const uint16_t* source,\n                                      uint32_t count,\n                                      uint16_t reset_index_guest_endian);\n  // The reset index and the low 24 bits mask are taken explicitly because this\n  // function may be used two ways:\n  // - Passthrough - when the vertex shader swaps the indices (when 32-bit\n  //   indices are supported on the host), in this case HostSwap is kNone, but\n  //   the reset index and the guest low bits mask can be swapped according to\n  //   the guest endian.\n  // - Swapping for the host - when only 24 bits of an index are supported on\n  //   the host. In this case, masking and comparison are done before applying\n  //   HostSwap, but according to HostSwap, if needed, the data is swapped from\n  //   the PowerPC's big endianness to the host GPU little endianness that we\n  //   assume, which matches the Xenos's little endianness.\n  template <xenos::Endian HostSwap>\n  static void ReplaceResetIndex32To24(uint32_t* dest, const uint32_t* source,\n                                      uint32_t count,\n                                      uint32_t reset_index_guest_endian,\n                                      uint32_t low_bits_mask_guest_endian) {\n    // The Xbox 360's GPU only uses the low 24 bits of the index - masking.\n#if XE_GPU_PRIMITIVE_PROCESSOR_SIMD_SIZE\n    while (count && (reinterpret_cast<uintptr_t>(source) &\n                     (XE_GPU_PRIMITIVE_PROCESSOR_SIMD_SIZE - 1))) {\n      --count;\n      uint32_t index = *(source++) & low_bits_mask_guest_endian;\n      *(dest++) = index != reset_index_guest_endian\n                      ? xenos::GpuSwap(index, HostSwap)\n                      : UINT32_MAX;\n    }\n    if (count >= kSimdVectorU32Elements) {\n      SimdVectorU32 reset_index_guest_endian_simd =\n          ReplicateU32(reset_index_guest_endian);\n      SimdVectorU32 low_bits_mask_guest_endian_simd =\n          ReplicateU32(low_bits_mask_guest_endian);\n#if XE_ARCH_AMD64\n      __m128i host_swap_shuffle;\n      if constexpr (HostSwap != xenos::Endian::kNone) {\n        host_swap_shuffle = _mm_set_epi32(\n            int32_t(xenos::GpuSwap(uint32_t(0x0F0E0D0C), HostSwap)),\n            int32_t(xenos::GpuSwap(uint32_t(0x0B0A0908), HostSwap)),\n            int32_t(xenos::GpuSwap(uint32_t(0x07060504), HostSwap)),\n            int32_t(xenos::GpuSwap(uint32_t(0x03020100), HostSwap)));\n      }\n#endif  // XE_ARCH_AMD64\n      while (count >= kSimdVectorU32Elements) {\n        count -= kSimdVectorU32Elements;\n        // Comparison produces 0 or 0xFFFF on AVX and Neon - we need 0xFFFF as\n        // the result for the primitive reset indices, so the result is\n        // `index | (index == reset_index)`.\n        SimdVectorU32 source_simd = LoadAlignedVectorU32(source);\n        source += kSimdVectorU32Elements;\n        SimdVectorU32 result_simd;\n#if XE_ARCH_AMD64\n        source_simd =\n            _mm_and_si128(source_simd, low_bits_mask_guest_endian_simd);\n        result_simd = _mm_or_si128(\n            source_simd,\n            _mm_cmpeq_epi32(source_simd, reset_index_guest_endian_simd));\n        if constexpr (HostSwap != xenos::Endian::kNone) {\n          result_simd = _mm_shuffle_epi8(result_simd, host_swap_shuffle);\n        }\n#elif XE_ARCH_ARM64\n        source_simd = vandq_u32(source_simd, low_bits_mask_guest_endian_simd);\n        result_simd = vorrq_u32(\n            source_simd, vceqq_u32(source_simd, reset_index_guest_endian_simd));\n        if constexpr (HostSwap == xenos::Endian::k8in16) {\n          result_simd = vreinterpretq_u32_u8(\n              vrev16q_u8(vreinterpretq_u8_u32(result_simd)));\n        } else if constexpr (HostSwap == xenos::Endian::k8in32) {\n          result_simd = vreinterpretq_u32_u8(\n              vrev32q_u8(vreinterpretq_u8_u32(result_simd)));\n        } else if constexpr (HostSwap == xenos::Endian::k16in32) {\n          result_simd = vreinterpretq_u32_u16(\n              vrev32q_u16(vreinterpretq_u16_u32(result_simd)));\n        }\n#else\n#error SIMD ReplaceResetIndex32To24 not implemented.\n#endif  // XE_ARCH\n        StoreUnalignedVectorU32(dest, result_simd);\n        dest += kSimdVectorU32Elements;\n      }\n    }\n#endif  // XE_GPU_PRIMITIVE_PROCESSOR_SIMD_SIZE\n    while (count--) {\n      uint32_t index = *(source++) & low_bits_mask_guest_endian;\n      *(dest++) = index != reset_index_guest_endian\n                      ? xenos::GpuSwap(index, HostSwap)\n                      : UINT32_MAX;\n    }\n  }\n\n  // TODO(Triang3l): 16-bit > 32-bit primitive type conversion for Metal, where\n  // primitive reset is always enabled, if UINT16_MAX is used as a real vertex\n  // index.\n\n  struct PassthroughIndexTransform {\n    uint16_t operator()(uint16_t index) const { return index; }\n    uint32_t operator()(uint32_t index) const { return index; }\n  };\n  struct To24NonSwappingIndexTransform {\n    uint32_t operator()(uint32_t index) const {\n      return index & xenos::kVertexIndexMask;\n    }\n  };\n  struct To24Swapping8In16IndexTransform {\n    uint32_t operator()(uint32_t index) const {\n      return xenos::GpuSwap(index, xenos::Endian::k8in16) &\n             xenos::kVertexIndexMask;\n    }\n  };\n  struct To24Swapping8In32IndexTransform {\n    uint32_t operator()(uint32_t index) const {\n      return xenos::GpuSwap(index, xenos::Endian::k8in32) &\n             xenos::kVertexIndexMask;\n    }\n  };\n  struct To24Swapping16In32IndexTransform {\n    uint32_t operator()(uint32_t index) const {\n      return xenos::GpuSwap(index, xenos::Endian::k16in32) &\n             xenos::kVertexIndexMask;\n    }\n  };\n\n  static constexpr uint32_t GetTwoTriangleStripIndexCount(\n      uint32_t strip_count) {\n    // 4 vertices per strip, and primitive restarts between strips.\n    return 4 * strip_count + (std::max(strip_count, UINT32_C(1)) - 1);\n  }\n\n  // Triangle fan test cases:\n  // - 4D5307E6 - main menu - game logo, developer logo, backgrounds of the menu\n  //   item list (the whole menu and individual items) - no index buffer.\n  // - 4E4D87E6 - terrain - with an index buffer and primitive reset (note that\n  //   there, vfetch indices are computed in the vertex shader, involving\n  //   floating-point reciprocal, so this case is very sensitive to rounding,\n  //   and incorrect geometry may occur not because of vertex grouping issues,\n  //   but also due to the behavior of the vertex shader).\n  // Triangle fans as triangle lists.\n  // Ordered as (v1, v2, v0), (v2, v3, v0) in Direct3D.\n  // https://docs.microsoft.com/en-us/windows/desktop/direct3d9/triangle-fans\n  static constexpr uint32_t GetTriangleFanListIndexCount(\n      uint32_t fan_index_count) {\n    return fan_index_count > 2 ? (fan_index_count - 2) * 3 : 0;\n  }\n  template <typename Index, typename IndexTransform>\n  static void TriangleFanToList(Index* dest, const Index* source,\n                                uint32_t source_index_count,\n                                const IndexTransform& index_transform) {\n    if (source_index_count <= 2) {\n      // To match GetTriangleFanListIndexCount.\n      return;\n    }\n    Index index_first = index_transform(source[0]);\n    Index index_previous = index_transform(source[1]);\n    for (uint32_t i = 2; i < source_index_count; ++i) {\n      Index index_current = index_transform(source[i]);\n      *(dest++) = index_previous;\n      *(dest++) = index_current;\n      *(dest++) = index_first;\n      index_previous = index_current;\n    }\n  }\n\n  static constexpr uint32_t GetLineLoopStripIndexCount(\n      uint32_t loop_index_count) {\n    // Even if 2 vertices are supplied, two lines are still drawn between them.\n    // https://www.khronos.org/opengl/wiki/Primitive\n    // \"You get n lines for n input vertices\"\n    // \"If the user only specifies 1 vertex, the drawing command is ignored\"\n    return loop_index_count > 1 ? loop_index_count + 1 : 0;\n  }\n  template <typename Index, typename IndexTransform>\n  static void LineLoopToStrip(Index* dest, const Index* source,\n                              uint32_t source_index_count,\n                              const IndexTransform& index_transform) {\n    if (source_index_count <= 1) {\n      // To match GetLineLoopStripIndexCount.\n      return;\n    }\n    Index index_first = index_transform(source[0]);\n    dest[0] = index_first;\n    for (uint32_t i = 1; i < source_index_count; ++i) {\n      dest[i] = index_transform(source[i]);\n    }\n    dest[source_index_count] = index_first;\n  }\n  static void LineLoopToStrip(uint16_t* dest, const uint16_t* source,\n                              uint32_t source_index_count,\n                              const PassthroughIndexTransform& index_transform);\n  static void LineLoopToStrip(uint32_t* dest, const uint32_t* source,\n                              uint32_t source_index_count,\n                              const PassthroughIndexTransform& index_transform);\n\n  // Quad list test cases:\n  // - 4D5307E6 - main menu - flying dust on the road - no index buffer.\n  static constexpr uint32_t GetQuadListTriangleListIndexCount(\n      uint32_t quad_list_index_count) {\n    return (quad_list_index_count / 4) * 6;\n  }\n  template <typename Index, typename IndexTransform>\n  static void QuadListToTriangleList(Index* dest, const Index* source,\n                                     uint32_t source_index_count,\n                                     const IndexTransform& index_transform) {\n    uint32_t quad_count = source_index_count / 4;\n    for (uint32_t i = 0; i < quad_count; ++i) {\n      // TODO(Triang3l): Find the correct order.\n      // v0, v1, v2.\n      Index common_index_0 = index_transform(*(source++));\n      *(dest++) = common_index_0;\n      *(dest++) = index_transform(*(source++));\n      Index common_index_2 = index_transform(*(source++));\n      *(dest++) = common_index_2;\n      // v0, v2, v3.\n      *(dest++) = common_index_0;\n      *(dest++) = common_index_2;\n      *(dest++) = index_transform(*(source++));\n    }\n  }\n\n  // Pre-gathering the ranges allows for usage of the same functions for\n  // conversion with and without reset. In addition, this increases safety in\n  // weird cases - there won't be mismatch between the pre-calculation of the\n  // post-conversion index count and the actual conversion if the game for some\n  // reason modifies the index buffer between the two and adds or removes reset\n  // indices in it.\n  struct SinglePrimitiveRange {\n    SinglePrimitiveRange(uint32_t guest_offset, uint32_t guest_index_count,\n                         uint32_t host_index_count)\n        : guest_offset(guest_offset),\n          guest_index_count(guest_index_count),\n          host_index_count(host_index_count) {}\n    uint32_t guest_offset;\n    uint32_t guest_index_count;\n    uint32_t host_index_count;\n  };\n  static uint32_t GetMultiPrimitiveHostIndexCountAndRanges(\n      std::function<uint32_t(uint32_t)> single_primitive_guest_to_host_count,\n      const uint16_t* source, uint32_t source_index_count,\n      uint16_t reset_index_guest_endian,\n      std::deque<SinglePrimitiveRange>& ranges_append_out);\n  static uint32_t GetMultiPrimitiveHostIndexCountAndRanges(\n      std::function<uint32_t(uint32_t)> single_primitive_guest_to_host_count,\n      const uint32_t* source, uint32_t source_index_count,\n      uint32_t reset_index_guest_endian, uint32_t low_bits_mask_guest_endian,\n      std::deque<SinglePrimitiveRange>& ranges_append_out);\n\n  template <typename Index, typename IndexTransform,\n            typename PrimitiveRangeIterator>\n  static void ConvertSinglePrimitiveRanges(\n      Index* dest, const Index* source,\n      xenos::PrimitiveType source_primitive_type,\n      const IndexTransform& index_transform,\n      PrimitiveRangeIterator ranges_beginning,\n      PrimitiveRangeIterator ranges_end) {\n    Index* dest_write_ptr = dest;\n    switch (source_primitive_type) {\n      case xenos::PrimitiveType::kTriangleFan:\n        for (PrimitiveRangeIterator range_it = ranges_beginning;\n             range_it != ranges_end; ++range_it) {\n          TriangleFanToList(dest_write_ptr, source + range_it->guest_offset,\n                            range_it->guest_index_count, index_transform);\n          dest_write_ptr += range_it->host_index_count;\n        }\n        break;\n      case xenos::PrimitiveType::kLineLoop:\n        for (PrimitiveRangeIterator range_it = ranges_beginning;\n             range_it != ranges_end; ++range_it) {\n          LineLoopToStrip(dest_write_ptr, source + range_it->guest_offset,\n                          range_it->guest_index_count, index_transform);\n          dest_write_ptr += range_it->host_index_count;\n        }\n        break;\n      case xenos::PrimitiveType::kQuadList:\n        for (PrimitiveRangeIterator range_it = ranges_beginning;\n             range_it != ranges_end; ++range_it) {\n          QuadListToTriangleList(dest_write_ptr,\n                                 source + range_it->guest_offset,\n                                 range_it->guest_index_count, index_transform);\n          dest_write_ptr += range_it->host_index_count;\n        }\n        break;\n      default:\n        assert_unhandled_case(source_primitive_type);\n    }\n  }\n\n  const RegisterFile& register_file_;\n  Memory& memory_;\n  TraceWriter& trace_writer_;\n  SharedMemory& shared_memory_;\n\n  bool full_32bit_vertex_indices_used_ = false;\n  bool convert_triangle_fans_to_lists_ = false;\n  bool convert_line_loops_to_strips_ = false;\n  bool convert_quad_lists_to_triangle_lists_ = false;\n  bool expand_point_sprites_in_vs_ = false;\n  bool expand_rectangle_lists_in_vs_ = false;\n\n  // Byte offsets used, for simplicity, directly as handles.\n  size_t builtin_ib_offset_two_triangle_strips_ = SIZE_MAX;\n  size_t builtin_ib_offset_triangle_fans_to_lists_ = SIZE_MAX;\n  size_t builtin_ib_offset_quad_lists_to_triangle_lists_ = SIZE_MAX;\n\n  std::deque<SinglePrimitiveRange> single_primitive_ranges_;\n\n  // Caching for reuse of converted indices within a frame.\n\n  // 256 KB as the largest possible guest index buffer - 0xFFFF 32-bit indices -\n  // is slightly smaller than 256 KB, thus cache entries need store links within\n  // at most 2 buckets.\n  static constexpr uint32_t kCacheBucketSizeBytesLog2 = 18;\n  static constexpr uint32_t kCacheBucketSizeBytes =\n      uint32_t(1) << kCacheBucketSizeBytesLog2;\n  static constexpr uint32_t kCacheBucketCount =\n      xe::align(SharedMemory::kBufferSize, kCacheBucketSizeBytes) /\n      kCacheBucketSizeBytes;\n\n  union CacheKey {\n    uint64_t key;\n    struct {\n      uint32_t base;                  // 32 total\n      uint32_t count : 16;            // 48\n      xenos::IndexFormat format : 1;  // 49\n      xenos::Endian endian : 2;       // 52\n      uint32_t is_reset_enabled : 1;  // 53\n      // kNone if not changing the type (like only processing the reset index).\n      xenos::PrimitiveType conversion_guest_primitive_type : 6;  // 59\n    };\n\n    CacheKey() : key(0) { static_assert_size(*this, sizeof(key)); }\n    CacheKey(uint32_t base, uint32_t count, xenos::IndexFormat format,\n             xenos::Endian endian, bool is_reset_enabled,\n             xenos::PrimitiveType conversion_guest_primitive_type =\n                 xenos::PrimitiveType::kNone) {\n      // Clear unused bits, then set each field explicitly, not via the\n      // initializer list (which causes `uint64_t key = 0;` to be ignored, and\n      // also can't contain initializers for aliasing union members).\n      key = 0;\n      this->base = base;\n      this->count = count;\n      this->format = format;\n      this->endian = endian;\n      this->is_reset_enabled = is_reset_enabled;\n      this->conversion_guest_primitive_type = conversion_guest_primitive_type;\n    }\n\n    struct Hasher {\n      size_t operator()(const CacheKey& key) const {\n        return std::hash<uint64_t>{}(key.key);\n      }\n    };\n    bool operator==(const CacheKey& other_key) const {\n      return key == other_key.key;\n    }\n\n    uint32_t GetSizeBytes() const {\n      return count * (format == xenos::IndexFormat::kInt16 ? sizeof(uint16_t)\n                                                           : sizeof(uint32_t));\n    }\n  };\n\n  // Subset of ConversionResult that can be reused for different primitive types\n  // if the same result is used irrespective of one (like when only processing\n  // the reset index).\n  struct CachedResult {\n    uint32_t host_draw_vertex_count;\n    ProcessedIndexBufferType index_buffer_type;\n    xenos::IndexFormat host_index_format;\n    xenos::Endian host_shader_index_endian;\n    bool host_primitive_reset_enabled;\n    size_t host_index_buffer_handle;\n  };\n\n  struct CacheEntry {\n    static_assert(\n        UINT16_MAX * sizeof(uint32_t) <=\n            (size_t(1) << kCacheBucketSizeBytesLog2),\n        \"Assuming that primitive processor cache entries need to store to the \"\n        \"previous and to the next entries only within up to 2 buckets, so the \"\n        \"size of the cache buckets must be not smaller than the maximum guest \"\n        \"index buffer size\");\n    union {\n      size_t free_next;\n      size_t buckets_prev[2];\n    };\n    size_t buckets_next[2];\n    CacheKey key;\n    CachedResult result;\n    static uint32_t GetBucketCount(CacheKey key) {\n      uint32_t count =\n          ((key.base + (key.GetSizeBytes() - 1)) >> kCacheBucketSizeBytesLog2) -\n          (key.base >> kCacheBucketSizeBytesLog2) + 1;\n      assert_true(count <= 2,\n                  \"Cache entries only store list links within two buckets\");\n      return count;\n    }\n    uint32_t GetBucketCount() const { return GetBucketCount(key); }\n  };\n\n  // A cache transaction performs a few operations in a RAII-like way (so\n  // processing may return an error for any reason, and won't have to clean up\n  // cache_currently_processing_base_ / size_bytes_ explicitly):\n  // - Transaction initialization:\n  //   - Lookup of previously processed indices in the cache.\n  //   - If not found, beginning to add a new entry that is going to be\n  //     processed:\n  //     - Marking the range as currently being processed, for slightly safer\n  //       race condition handling if one happens - if invalidation happens\n  //       during the transaction (but outside a global critical region lock,\n  //       since processing may take a long time), the new cache entry won't be\n  //       stored as it will already be invalid at the time of the completion of\n  //       the transaction.\n  //     - Enabling an access callback for the range.\n  // - Setting the new result after processing (if not found in the cache\n  //   previously).\n  // - Transaction completion:\n  //   - If the range wasn't invalidated during the transaction, storing the new\n  //     entry in the cache.\n  // If an entry was found in the cache (GetFoundResult results non-null), it\n  // MUST be used instead of processing - this class doesn't provide the\n  // possibility replace existing entries.\n  class CacheTransaction final {\n   public:\n    CacheTransaction(PrimitiveProcessor& processor, CacheKey key);\n    const CachedResult* GetFoundResult() const {\n      return result_type_ == ResultType::kExisting ? &result_ : nullptr;\n    }\n    void SetNewResult(const CachedResult& new_result) {\n      // Replacement of an existing entry is not allowed.\n      assert_true(result_type_ != ResultType::kExisting);\n      result_ = new_result;\n      result_type_ = ResultType::kNewSet;\n    }\n    ~CacheTransaction();\n\n   private:\n    PrimitiveProcessor& processor_;\n    // If key_.count == 0, this transaction shouldn't do anything - for empty\n    // ranges it's pointless, and it's unsafe to get the end pointer without\n    // special logic, and count == 0 is also used as a special indicator for\n    // vertex count below the cache usage threshold.\n    CacheKey key_;\n    CachedResult result_;\n    enum class ResultType {\n      kNewUnset,\n      kNewSet,\n      kExisting,\n    };\n    ResultType result_type_ = ResultType::kNewUnset;\n  };\n\n  std::deque<CacheEntry> cache_entry_pool_;\n\n  void* memory_invalidation_callback_handle_ = nullptr;\n\n  xe::global_critical_region global_critical_region_;\n  // Modified by both the processor and the invalidation callback.\n  std::unordered_map<CacheKey, size_t, CacheKey::Hasher> cache_map_;\n  // The conversion is performed while the lock is released since it may take a\n  // long time.\n  // If during the conversion the region currently being converted is\n  // invalidated, the current entry will not be added to the cache.\n  // Modified by the processor, read by the invalidation callback.\n  uint32_t cache_currently_processing_base_ = 0;\n  // 0 if not in a cache transaction that hasn't found an existing entry\n  // currently.\n  uint32_t cache_currently_processing_size_bytes_ = 0;\n  // Modified by both the processor and the invalidation callback.\n  size_t cache_bucket_free_first_entry_ = SIZE_MAX;\n  // Modified by both the processor and the invalidation callback.\n  uint64_t cache_buckets_non_empty_l1_[(kCacheBucketCount + 63) / 64] = {};\n  // For even faster handling of memory invalidation - whether any bit is set in\n  // each cache_buckets_non_empty_l1_.\n  // Modified by both the processor and the invalidation callback.\n  uint64_t cache_buckets_non_empty_l2_[(kCacheBucketCount + (64 * 64 - 1)) /\n                                       (64 * 64)] = {};\n  // Must be called in a global critical region.\n  void UpdateCacheBucketsNonEmptyL2(\n      uint32_t bucket_index_div_64,\n      [[maybe_unused]] const std::unique_lock<std::recursive_mutex>&\n          global_lock) {\n    uint64_t& cache_buckets_non_empty_l2_ref =\n        cache_buckets_non_empty_l2_[bucket_index_div_64 >> 6];\n    uint64_t cache_buckets_non_empty_l2_bit = uint64_t(1)\n                                              << (bucket_index_div_64 & 63);\n    if (cache_buckets_non_empty_l1_[bucket_index_div_64]) {\n      cache_buckets_non_empty_l2_ref |= cache_buckets_non_empty_l2_bit;\n    } else {\n      cache_buckets_non_empty_l2_ref &= ~cache_buckets_non_empty_l2_bit;\n    }\n  }\n  // cache_buckets_non_empty_l1_ (along with cache_buckets_non_empty_l2_, which\n  // must be kept in sync) used for indication whether each entry is non-empty,\n  // for faster clearing (there's no special index here for an empty entry).\n  // Huge, so it's the last in the class.\n  // Modified by both the processor and the invalidation callback.\n  size_t cache_bucket_first_entries_[kCacheBucketCount];\n  static std::pair<uint32_t, uint32_t> MemoryInvalidationCallbackThunk(\n      void* context_ptr, uint32_t physical_address_start, uint32_t length,\n      bool exact_range);\n};\n\n}  // namespace gpu\n}  // namespace xe\n\n#endif  // XENIA_GPU_PRIMITIVE_PROCESSOR_H_\n"
  },
  {
    "path": "src/xenia/gpu/register_file.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/register_file.h\"\n\n#include <cstring>\n\n#include \"xenia/base/math.h\"\n\nnamespace xe {\nnamespace gpu {\n\nRegisterFile::RegisterFile() { std::memset(values, 0, sizeof(values)); }\n\nconst RegisterInfo* RegisterFile::GetRegisterInfo(uint32_t index) {\n  switch (index) {\n#define XE_GPU_REGISTER(index, type, name) \\\n  case index: {                            \\\n    static const RegisterInfo reg_info = { \\\n        RegisterInfo::Type::type,          \\\n        #name,                             \\\n    };                                     \\\n    return &reg_info;                      \\\n  }\n#include \"xenia/gpu/register_table.inc\"\n#undef XE_GPU_REGISTER\n    default:\n      return nullptr;\n  }\n}\n\n}  //  namespace gpu\n}  //  namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/register_file.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_REGISTER_FILE_H_\n#define XENIA_GPU_REGISTER_FILE_H_\n\n#include <cstdint>\n#include <cstdlib>\n#include <cstring>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/memory.h\"\n#include \"xenia/gpu/registers.h\"\n#include \"xenia/gpu/xenos.h\"\n\nnamespace xe {\nnamespace gpu {\n\nstruct RegisterInfo {\n  enum class Type {\n    kDword,\n    kFloat,\n  };\n  Type type;\n  const char* name;\n};\n\nclass RegisterFile {\n public:\n  RegisterFile();\n\n  static const RegisterInfo* GetRegisterInfo(uint32_t index);\n\n  static constexpr size_t kRegisterCount = 0x5003;\n  uint32_t values[kRegisterCount];\n\n  const uint32_t& operator[](uint32_t reg) const { return values[reg]; }\n  uint32_t& operator[](uint32_t reg) { return values[reg]; }\n\n  template <typename T>\n  T Get(uint32_t reg) const {\n    return xe::memory::Reinterpret<T>(values[reg]);\n  }\n  template <typename T>\n  T Get(Register reg) const {\n    return Get<T>(static_cast<uint32_t>(reg));\n  }\n  template <typename T>\n  T Get() const {\n    return Get<T>(T::register_index);\n  }\n\n  xenos::xe_gpu_vertex_fetch_t GetVertexFetch(uint32_t index) const {\n    assert_true(index < 96);\n    xenos::xe_gpu_vertex_fetch_t fetch;\n    std::memcpy(&fetch,\n                &values[XE_GPU_REG_SHADER_CONSTANT_FETCH_00_0 +\n                        (sizeof(fetch) / sizeof(uint32_t)) * index],\n                sizeof(fetch));\n    return fetch;\n  }\n\n  xenos::xe_gpu_texture_fetch_t GetTextureFetch(uint32_t index) const {\n    assert_true(index < 32);\n    xenos::xe_gpu_texture_fetch_t fetch;\n    std::memcpy(&fetch,\n                &values[XE_GPU_REG_SHADER_CONSTANT_FETCH_00_0 +\n                        (sizeof(fetch) / sizeof(uint32_t)) * index],\n                sizeof(fetch));\n    return fetch;\n  }\n\n  xenos::xe_gpu_memexport_stream_t GetMemExportStream(\n      uint32_t float_constant_index) const {\n    assert_true(float_constant_index < 512);\n    xenos::xe_gpu_memexport_stream_t stream;\n    std::memcpy(\n        &stream,\n        &values[XE_GPU_REG_SHADER_CONSTANT_000_X + 4 * float_constant_index],\n        sizeof(stream));\n    return stream;\n  }\n};\n\n}  // namespace gpu\n}  // namespace xe\n\n#endif  // XENIA_GPU_REGISTER_FILE_H_\n"
  },
  {
    "path": "src/xenia/gpu/register_table.inc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2025 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n// This is a partial file designed to be included by other files when\n// constructing various tables.\n\n// Most 3D registers are the same as in the Qualcomm Adreno 200 (AMD Z430,\n// another R400 architecture family chip):\n// https://github.com/UDOOboard/Kernel_Unico/blob/master/drivers/mxc/amd-gpu/include/reg/yamato/10/yamato_offset.h\n// https://github.com/freedreno/amd-gpu/blob/master/include/reg/yamato/10/yamato_offset.h\n//\n// The addresses in this file are specified in dwords, similarly to how they are\n// defined in yamato_offset.h. AMD, however, generally uses byte addresses in\n// their documentation and open source drivers, so when looking up similar\n// registers there, multiply by 4 and convert to hexadecimal.\n//\n// Display controller register addresses mostly match the M56 ones:\n// https://www.x.org/docs/AMD/old/RRG-216M56-03oOEM.pdf\n//\n// 3D registers on the later chips such as the R600 are very different, but some\n// of them are still partially or fully the same, and also share the address.\n// However, on the R600, the 3D register space (at 0x8000 bytes, or 0x2000\n// dwords, on the Xenos) is split into config registers (at 0x8000 bytes) and\n// context registers (at 0x28000 bytes), but the lower bits of the address may\n// still be the same.\n\n//#define XE_GPU_REGISTER(index, type, name)\n\nXE_GPU_REGISTER(0x0048, kDword, BIF_PERFCOUNTER0_SELECT)\nXE_GPU_REGISTER(0x0049, kDword, BIF_PERFCOUNTER0_HI)\nXE_GPU_REGISTER(0x004A, kDword, BIF_PERFCOUNTER0_LOW)\n\nXE_GPU_REGISTER(0x01DD, kDword, SCRATCH_ADDR)\nXE_GPU_REGISTER(0x01DC, kDword, SCRATCH_UMSK)\n\nXE_GPU_REGISTER(0x01E6, kDword, CP_PERFCOUNTER0_SELECT)\nXE_GPU_REGISTER(0x01E7, kDword, CP_PERFCOUNTER0_LOW)\nXE_GPU_REGISTER(0x01E8, kDword, CP_PERFCOUNTER0_HI)\nXE_GPU_REGISTER(0x01F5, kDword, CP_PERFMON_CNTL)\n\nXE_GPU_REGISTER(0x0395, kDword, RBBM_PERFCOUNTER0_SELECT)\nXE_GPU_REGISTER(0x0396, kDword, RBBM_PERFCOUNTER1_SELECT)\nXE_GPU_REGISTER(0x0397, kDword, RBBM_PERFCOUNTER0_LOW)\nXE_GPU_REGISTER(0x0398, kDword, RBBM_PERFCOUNTER0_HI)\nXE_GPU_REGISTER(0x0399, kDword, RBBM_PERFCOUNTER1_LOW)\nXE_GPU_REGISTER(0x039A, kDword, RBBM_PERFCOUNTER1_HI)\n\nXE_GPU_REGISTER(0x045E, kDword, CALLBACK_ACK)\n\nXE_GPU_REGISTER(0x0578, kDword, SCRATCH_REG0)  // interrupt sync\nXE_GPU_REGISTER(0x0579, kDword, SCRATCH_REG1)  // present interval\nXE_GPU_REGISTER(0x057A, kDword, SCRATCH_REG2)\nXE_GPU_REGISTER(0x057B, kDword, SCRATCH_REG3)\nXE_GPU_REGISTER(0x057C, kDword, CALLBACK_ADDRESS)\nXE_GPU_REGISTER(0x057D, kDword, CALLBACK_CONTEXT)\nXE_GPU_REGISTER(0x057E, kDword, SCRATCH_REG6)\nXE_GPU_REGISTER(0x057F, kDword, SCRATCH_REG7)\n\nXE_GPU_REGISTER(0x05C8, kDword, WAIT_UNTIL)\n\nXE_GPU_REGISTER(0x0815, kDword, MC0_PERFCOUNTER0_SELECT)\nXE_GPU_REGISTER(0x0816, kDword, MC0_PERFCOUNTER0_HI)\nXE_GPU_REGISTER(0x0817, kDword, MC0_PERFCOUNTER0_LOW)\nXE_GPU_REGISTER(0x0855, kDword, MC1_PERFCOUNTER0_SELECT)\nXE_GPU_REGISTER(0x0856, kDword, MC1_PERFCOUNTER0_HI)\nXE_GPU_REGISTER(0x0857, kDword, MC1_PERFCOUNTER0_LOW)\n\nXE_GPU_REGISTER(0x0A02, kDword, UNKNOWN_0A02)\nXE_GPU_REGISTER(0x0A03, kDword, UNKNOWN_0A03)\nXE_GPU_REGISTER(0x0A04, kDword, UNKNOWN_0A04)\nXE_GPU_REGISTER(0x0A05, kDword, UNKNOWN_0A05)\n\nXE_GPU_REGISTER(0x0A18, kDword, MH_PERFCOUNTER0_SELECT)\nXE_GPU_REGISTER(0x0A19, kDword, MH_PERFCOUNTER0_HI)\nXE_GPU_REGISTER(0x0A1A, kDword, MH_PERFCOUNTER0_LOW)\nXE_GPU_REGISTER(0x0A1B, kDword, MH_PERFCOUNTER1_SELECT)\nXE_GPU_REGISTER(0x0A1C, kDword, MH_PERFCOUNTER1_HI)\nXE_GPU_REGISTER(0x0A1D, kDword, MH_PERFCOUNTER1_LOW)\nXE_GPU_REGISTER(0x0A1E, kDword, MH_PERFCOUNTER2_SELECT)\nXE_GPU_REGISTER(0x0A1F, kDword, MH_PERFCOUNTER2_HI)\nXE_GPU_REGISTER(0x0A20, kDword, MH_PERFCOUNTER2_LOW)\n\nXE_GPU_REGISTER(0x0A2F, kDword, COHER_SIZE_HOST)\nXE_GPU_REGISTER(0x0A30, kDword, COHER_BASE_HOST)\nXE_GPU_REGISTER(0x0A31, kDword, COHER_STATUS_HOST)\n\n// Status flags of viz queries, doesn't seem to be read back by d3d\n// queries 0x00 to 0x1f (be), bit set when visible\nXE_GPU_REGISTER(0x0C44, kDword, PA_SC_VIZ_QUERY_STATUS_0)\n// queries 0x20 to 0x3f (be)\nXE_GPU_REGISTER(0x0C45, kDword, PA_SC_VIZ_QUERY_STATUS_1)\n\nXE_GPU_REGISTER(0x0C48, kDword, VGT_PERFCOUNTER0_SELECT)\nXE_GPU_REGISTER(0x0C49, kDword, VGT_PERFCOUNTER1_SELECT)\nXE_GPU_REGISTER(0x0C4A, kDword, VGT_PERFCOUNTER2_SELECT)\nXE_GPU_REGISTER(0x0C4B, kDword, VGT_PERFCOUNTER3_SELECT)\nXE_GPU_REGISTER(0x0C4C, kDword, VGT_PERFCOUNTER0_LOW)\nXE_GPU_REGISTER(0x0C4D, kDword, VGT_PERFCOUNTER0_HI)\nXE_GPU_REGISTER(0x0C4E, kDword, VGT_PERFCOUNTER1_LOW)\nXE_GPU_REGISTER(0x0C4F, kDword, VGT_PERFCOUNTER1_HI)\nXE_GPU_REGISTER(0x0C50, kDword, VGT_PERFCOUNTER2_LOW)\nXE_GPU_REGISTER(0x0C51, kDword, VGT_PERFCOUNTER2_HI)\nXE_GPU_REGISTER(0x0C52, kDword, VGT_PERFCOUNTER3_LOW)\nXE_GPU_REGISTER(0x0C53, kDword, VGT_PERFCOUNTER3_HI)\n\nXE_GPU_REGISTER(0x0C85, kDword, PA_CL_ENHANCE)\n\nXE_GPU_REGISTER(0x0C88, kDword, PA_SU_PERFCOUNTER0_SELECT)\nXE_GPU_REGISTER(0x0C89, kDword, PA_SU_PERFCOUNTER1_SELECT)\nXE_GPU_REGISTER(0x0C8A, kDword, PA_SU_PERFCOUNTER2_SELECT)\nXE_GPU_REGISTER(0x0C8B, kDword, PA_SU_PERFCOUNTER3_SELECT)\nXE_GPU_REGISTER(0x0C8C, kDword, PA_SU_PERFCOUNTER0_LOW)\nXE_GPU_REGISTER(0x0C8D, kDword, PA_SU_PERFCOUNTER0_HI)\nXE_GPU_REGISTER(0x0C8E, kDword, PA_SU_PERFCOUNTER1_LOW)\nXE_GPU_REGISTER(0x0C8F, kDword, PA_SU_PERFCOUNTER1_HI)\nXE_GPU_REGISTER(0x0C90, kDword, PA_SU_PERFCOUNTER2_LOW)\nXE_GPU_REGISTER(0x0C91, kDword, PA_SU_PERFCOUNTER2_HI)\nXE_GPU_REGISTER(0x0C92, kDword, PA_SU_PERFCOUNTER3_LOW)\nXE_GPU_REGISTER(0x0C93, kDword, PA_SU_PERFCOUNTER3_HI)\nXE_GPU_REGISTER(0x0C98, kDword, PA_SC_PERFCOUNTER0_SELECT)\nXE_GPU_REGISTER(0x0C99, kDword, PA_SC_PERFCOUNTER1_SELECT)\nXE_GPU_REGISTER(0x0C9A, kDword, PA_SC_PERFCOUNTER2_SELECT)\nXE_GPU_REGISTER(0x0C9B, kDword, PA_SC_PERFCOUNTER3_SELECT)\nXE_GPU_REGISTER(0x0C9C, kDword, PA_SC_PERFCOUNTER0_LOW)\nXE_GPU_REGISTER(0x0C9D, kDword, PA_SC_PERFCOUNTER0_HI)\nXE_GPU_REGISTER(0x0C9E, kDword, PA_SC_PERFCOUNTER1_LOW)\nXE_GPU_REGISTER(0x0C9F, kDword, PA_SC_PERFCOUNTER1_HI)\nXE_GPU_REGISTER(0x0CA0, kDword, PA_SC_PERFCOUNTER2_LOW)\nXE_GPU_REGISTER(0x0CA1, kDword, PA_SC_PERFCOUNTER2_HI)\nXE_GPU_REGISTER(0x0CA2, kDword, PA_SC_PERFCOUNTER3_LOW)\nXE_GPU_REGISTER(0x0CA3, kDword, PA_SC_PERFCOUNTER3_HI)\n\nXE_GPU_REGISTER(0x0D00, kDword, SQ_GPR_MANAGEMENT)\nXE_GPU_REGISTER(0x0D01, kDword, SQ_FLOW_CONTROL)\nXE_GPU_REGISTER(0x0D02, kDword, SQ_INST_STORE_MANAGMENT)\n\nXE_GPU_REGISTER(0x0D04, kDword, SQ_EO_RT)\n\nXE_GPU_REGISTER(0x0DC8, kDword, SQ_PERFCOUNTER0_SELECT)\nXE_GPU_REGISTER(0x0DC9, kDword, SQ_PERFCOUNTER1_SELECT)\nXE_GPU_REGISTER(0x0DCA, kDword, SQ_PERFCOUNTER2_SELECT)\nXE_GPU_REGISTER(0x0DCB, kDword, SQ_PERFCOUNTER3_SELECT)\nXE_GPU_REGISTER(0x0DCC, kDword, SQ_PERFCOUNTER0_LOW)\nXE_GPU_REGISTER(0x0DCD, kDword, SQ_PERFCOUNTER0_HI)\nXE_GPU_REGISTER(0x0DCE, kDword, SQ_PERFCOUNTER1_LOW)\nXE_GPU_REGISTER(0x0DCF, kDword, SQ_PERFCOUNTER1_HI)\nXE_GPU_REGISTER(0x0DD0, kDword, SQ_PERFCOUNTER2_LOW)\nXE_GPU_REGISTER(0x0DD1, kDword, SQ_PERFCOUNTER2_HI)\nXE_GPU_REGISTER(0x0DD2, kDword, SQ_PERFCOUNTER3_LOW)\nXE_GPU_REGISTER(0x0DD3, kDword, SQ_PERFCOUNTER3_HI)\nXE_GPU_REGISTER(0x0DD4, kDword, SX_PERFCOUNTER0_SELECT)\nXE_GPU_REGISTER(0x0DD8, kDword, SX_PERFCOUNTER0_LOW)\nXE_GPU_REGISTER(0x0DD9, kDword, SX_PERFCOUNTER0_HI)\n\n// Set with WAIT_UNTIL = WAIT_3D_IDLECLEAN\nXE_GPU_REGISTER(0x0E00, kDword, UNKNOWN_0E00)\n\nXE_GPU_REGISTER(0x0E05, kDword, TCR_PERFCOUNTER0_SELECT)\nXE_GPU_REGISTER(0x0E06, kDword, TCR_PERFCOUNTER0_HI)\nXE_GPU_REGISTER(0x0E07, kDword, TCR_PERFCOUNTER0_LOW)\nXE_GPU_REGISTER(0x0E08, kDword, TCR_PERFCOUNTER1_SELECT)\nXE_GPU_REGISTER(0x0E09, kDword, TCR_PERFCOUNTER1_HI)\nXE_GPU_REGISTER(0x0E0A, kDword, TCR_PERFCOUNTER1_LOW)\n\nXE_GPU_REGISTER(0x0E1F, kDword, TP0_PERFCOUNTER0_SELECT)\nXE_GPU_REGISTER(0x0E20, kDword, TP0_PERFCOUNTER0_HI)\nXE_GPU_REGISTER(0x0E21, kDword, TP0_PERFCOUNTER0_LOW)\nXE_GPU_REGISTER(0x0E22, kDword, TP0_PERFCOUNTER1_SELECT)\nXE_GPU_REGISTER(0x0E23, kDword, TP0_PERFCOUNTER1_HI)\nXE_GPU_REGISTER(0x0E24, kDword, TP0_PERFCOUNTER1_LOW)\n\nXE_GPU_REGISTER(0x0E28, kDword, TP1_PERFCOUNTER0_SELECT)\nXE_GPU_REGISTER(0x0E29, kDword, TP1_PERFCOUNTER0_HI)\nXE_GPU_REGISTER(0x0E2A, kDword, TP1_PERFCOUNTER0_LOW)\nXE_GPU_REGISTER(0x0E2B, kDword, TP1_PERFCOUNTER1_SELECT)\nXE_GPU_REGISTER(0x0E2C, kDword, TP1_PERFCOUNTER1_HI)\nXE_GPU_REGISTER(0x0E2D, kDword, TP1_PERFCOUNTER1_LOW)\n\nXE_GPU_REGISTER(0x0E31, kDword, TP2_PERFCOUNTER0_SELECT)\nXE_GPU_REGISTER(0x0E32, kDword, TP2_PERFCOUNTER0_HI)\nXE_GPU_REGISTER(0x0E33, kDword, TP2_PERFCOUNTER0_LOW)\nXE_GPU_REGISTER(0x0E34, kDword, TP2_PERFCOUNTER1_SELECT)\nXE_GPU_REGISTER(0x0E35, kDword, TP2_PERFCOUNTER1_HI)\nXE_GPU_REGISTER(0x0E36, kDword, TP2_PERFCOUNTER1_LOW)\n\nXE_GPU_REGISTER(0x0E3A, kDword, TP3_PERFCOUNTER0_SELECT)\nXE_GPU_REGISTER(0x0E3B, kDword, TP3_PERFCOUNTER0_HI)\nXE_GPU_REGISTER(0x0E3C, kDword, TP3_PERFCOUNTER0_LOW)\nXE_GPU_REGISTER(0x0E3D, kDword, TP3_PERFCOUNTER1_SELECT)\nXE_GPU_REGISTER(0x0E3E, kDword, TP3_PERFCOUNTER1_HI)\nXE_GPU_REGISTER(0x0E3F, kDword, TP3_PERFCOUNTER1_LOW)\n\n// Set with WAIT_UNTIL = WAIT_3D_IDLECLEAN\nXE_GPU_REGISTER(0x0E40, kDword, UNKNOWN_0E40)\n\n// Set during GPU initialization by D3D\nXE_GPU_REGISTER(0x0E42, kDword, UNKNOWN_0E42)\n\nXE_GPU_REGISTER(0x0E48, kDword, VC_PERFCOUNTER0_SELECT)\nXE_GPU_REGISTER(0x0E49, kDword, VC_PERFCOUNTER0_HI)\nXE_GPU_REGISTER(0x0E4A, kDword, VC_PERFCOUNTER0_LOW)\nXE_GPU_REGISTER(0x0E4B, kDword, VC_PERFCOUNTER1_SELECT)\nXE_GPU_REGISTER(0x0E4C, kDword, VC_PERFCOUNTER1_HI)\nXE_GPU_REGISTER(0x0E4D, kDword, VC_PERFCOUNTER1_LOW)\nXE_GPU_REGISTER(0x0E4E, kDword, VC_PERFCOUNTER2_SELECT)\nXE_GPU_REGISTER(0x0E4F, kDword, VC_PERFCOUNTER2_HI)\nXE_GPU_REGISTER(0x0E50, kDword, VC_PERFCOUNTER2_LOW)\nXE_GPU_REGISTER(0x0E51, kDword, VC_PERFCOUNTER3_SELECT)\nXE_GPU_REGISTER(0x0E52, kDword, VC_PERFCOUNTER3_HI)\nXE_GPU_REGISTER(0x0E53, kDword, VC_PERFCOUNTER3_LOW)\n\nXE_GPU_REGISTER(0x0E54, kDword, TCM_PERFCOUNTER0_SELECT)\nXE_GPU_REGISTER(0x0E55, kDword, TCM_PERFCOUNTER0_HI)\nXE_GPU_REGISTER(0x0E56, kDword, TCM_PERFCOUNTER0_LOW)\nXE_GPU_REGISTER(0x0E57, kDword, TCM_PERFCOUNTER1_SELECT)\nXE_GPU_REGISTER(0x0E58, kDword, TCM_PERFCOUNTER1_HI)\nXE_GPU_REGISTER(0x0E59, kDword, TCM_PERFCOUNTER1_LOW)\n\nXE_GPU_REGISTER(0x0E5A, kDword, TCF_PERFCOUNTER0_SELECT)\nXE_GPU_REGISTER(0x0E5B, kDword, TCF_PERFCOUNTER0_HI)\nXE_GPU_REGISTER(0x0E5C, kDword, TCF_PERFCOUNTER0_LOW)\nXE_GPU_REGISTER(0x0E5D, kDword, TCF_PERFCOUNTER1_SELECT)\nXE_GPU_REGISTER(0x0E5E, kDword, TCF_PERFCOUNTER1_HI)\nXE_GPU_REGISTER(0x0E5F, kDword, TCF_PERFCOUNTER1_LOW)\nXE_GPU_REGISTER(0x0E60, kDword, TCF_PERFCOUNTER2_SELECT)\nXE_GPU_REGISTER(0x0E61, kDword, TCF_PERFCOUNTER2_HI)\nXE_GPU_REGISTER(0x0E62, kDword, TCF_PERFCOUNTER2_LOW)\nXE_GPU_REGISTER(0x0E63, kDword, TCF_PERFCOUNTER3_SELECT)\nXE_GPU_REGISTER(0x0E64, kDword, TCF_PERFCOUNTER3_HI)\nXE_GPU_REGISTER(0x0E65, kDword, TCF_PERFCOUNTER3_LOW)\nXE_GPU_REGISTER(0x0E66, kDword, TCF_PERFCOUNTER4_SELECT)\nXE_GPU_REGISTER(0x0E67, kDword, TCF_PERFCOUNTER4_HI)\nXE_GPU_REGISTER(0x0E68, kDword, TCF_PERFCOUNTER4_LOW)\nXE_GPU_REGISTER(0x0E69, kDword, TCF_PERFCOUNTER5_SELECT)\nXE_GPU_REGISTER(0x0E6A, kDword, TCF_PERFCOUNTER5_HI)\nXE_GPU_REGISTER(0x0E6B, kDword, TCF_PERFCOUNTER5_LOW)\nXE_GPU_REGISTER(0x0E6C, kDword, TCF_PERFCOUNTER6_SELECT)\nXE_GPU_REGISTER(0x0E6D, kDword, TCF_PERFCOUNTER6_HI)\nXE_GPU_REGISTER(0x0E6E, kDword, TCF_PERFCOUNTER6_LOW)\nXE_GPU_REGISTER(0x0E6F, kDword, TCF_PERFCOUNTER7_SELECT)\nXE_GPU_REGISTER(0x0E70, kDword, TCF_PERFCOUNTER7_HI)\nXE_GPU_REGISTER(0x0E71, kDword, TCF_PERFCOUNTER7_LOW)\nXE_GPU_REGISTER(0x0E72, kDword, TCF_PERFCOUNTER8_SELECT)\nXE_GPU_REGISTER(0x0E73, kDword, TCF_PERFCOUNTER8_HI)\nXE_GPU_REGISTER(0x0E74, kDword, TCF_PERFCOUNTER8_LOW)\nXE_GPU_REGISTER(0x0E75, kDword, TCF_PERFCOUNTER9_SELECT)\nXE_GPU_REGISTER(0x0E76, kDword, TCF_PERFCOUNTER9_HI)\nXE_GPU_REGISTER(0x0E77, kDword, TCF_PERFCOUNTER9_LOW)\nXE_GPU_REGISTER(0x0E78, kDword, TCF_PERFCOUNTER10_SELECT)\nXE_GPU_REGISTER(0x0E79, kDword, TCF_PERFCOUNTER10_HI)\nXE_GPU_REGISTER(0x0E7A, kDword, TCF_PERFCOUNTER10_LOW)\nXE_GPU_REGISTER(0x0E7B, kDword, TCF_PERFCOUNTER11_SELECT)\nXE_GPU_REGISTER(0x0E7C, kDword, TCF_PERFCOUNTER11_HI)\nXE_GPU_REGISTER(0x0E7D, kDword, TCF_PERFCOUNTER11_LOW)\n\nXE_GPU_REGISTER(0x0F01, kDword, RB_BC_CONTROL)\nXE_GPU_REGISTER(0x0F02, kDword, RB_EDRAM_INFO)\n\nXE_GPU_REGISTER(0x0F04, kDword, BC_PERFCOUNTER0_SELECT)\nXE_GPU_REGISTER(0x0F05, kDword, BC_PERFCOUNTER1_SELECT)\nXE_GPU_REGISTER(0x0F06, kDword, BC_PERFCOUNTER2_SELECT)\nXE_GPU_REGISTER(0x0F07, kDword, BC_PERFCOUNTER3_SELECT)\nXE_GPU_REGISTER(0x0F08, kDword, BC_PERFCOUNTER0_LOW)\nXE_GPU_REGISTER(0x0F09, kDword, BC_PERFCOUNTER0_HI)\nXE_GPU_REGISTER(0x0F0A, kDword, BC_PERFCOUNTER1_LOW)\nXE_GPU_REGISTER(0x0F0B, kDword, BC_PERFCOUNTER1_HI)\nXE_GPU_REGISTER(0x0F0C, kDword, BC_PERFCOUNTER2_LOW)\nXE_GPU_REGISTER(0x0F0D, kDword, BC_PERFCOUNTER2_HI)\nXE_GPU_REGISTER(0x0F0E, kDword, BC_PERFCOUNTER3_LOW)\nXE_GPU_REGISTER(0x0F0F, kDword, BC_PERFCOUNTER3_HI)\n\nXE_GPU_REGISTER(0x1004, kDword, HZ_PERFCOUNTER0_SELECT)\nXE_GPU_REGISTER(0x1005, kDword, HZ_PERFCOUNTER0_HI)\nXE_GPU_REGISTER(0x1006, kDword, HZ_PERFCOUNTER0_LOW)\nXE_GPU_REGISTER(0x1007, kDword, HZ_PERFCOUNTER1_SELECT)\nXE_GPU_REGISTER(0x1008, kDword, HZ_PERFCOUNTER1_HI)\nXE_GPU_REGISTER(0x1009, kDword, HZ_PERFCOUNTER1_LOW)\n\n// D1*, LUT, and AVIVO registers taken from libxenon and\n// https://www.x.org/docs/AMD/old/RRG-216M56-03oOEM.pdf\nXE_GPU_REGISTER(0x1838, kDword, D1MODE_MASTER_UPDATE_LOCK)\n\nXE_GPU_REGISTER(0x1841, kDword, D1GRPH_CONTROL)\n\nXE_GPU_REGISTER(0x1844, kDword, D1GRPH_PRIMARY_SURFACE_ADDRESS)\n\nXE_GPU_REGISTER(0x1852, kDword, D1GRPH_FLIP_CONTROL)\n\n// In 4B4F07FE, the 256-entry gamma ramp for the 8bpc framebuffer is set to\n// different values in multiple places in the game. For VdGetCurrentDisplayGamma\n// returning 1 (sRGB), it's set up in the beginning as:\n// DC_LUTA_CONTROL = 0x00000000 (256-entry unsigned fixed-point)\n// DC_LUT_RW_MODE = 0x00000000\n// DC_LUT_RW_INDEX = 0x00000000\n// DC_LUT_WRITE_EN_MASK = 0x00000007\n// DC_LUT_30_COLOR = 0x00000000\n// DC_LUT_RW_INDEX = 0x00000001\n// DC_LUT_30_COLOR = 0x04812048\n// DC_LUT_RW_INDEX = 0x00000002\n// DC_LUT_30_COLOR = 0x05916459\n// DC_LUT_RW_INDEX = 0x00000003\n// DC_LUT_30_COLOR = 0x06519465\n// ...\n// DC_LUT_RW_INDEX = 0x000000FE\n// DC_LUT_30_COLOR = 0x3FBFEFFB\n// DC_LUT_RW_INDEX = 0x000000FF\n// DC_LUT_30_COLOR = 0x3FFFFFFF\n// DC_LUT_RW_INDEX = 0x00000100\n//\n// One another possible setup in 4B4F07FE is:\n// DC_LUTA_CONTROL = 0x00000000 (256-entry unsigned fixed-point)\n// DC_LUT_RW_MODE = 0x00000000\n// DC_LUT_RW_INDEX = 0x00000000\n// DC_LUT_WRITE_EN_MASK = 0x00000007\n// DC_LUT_30_COLOR = 0x00000000\n// DC_LUT_RW_INDEX = 0x00000001\n// DC_LUT_30_COLOR = 0x01A0681A\n// DC_LUT_RW_INDEX = 0x00000002\n// DC_LUT_30_COLOR = 0x02709C27\n// ...\n// DC_LUT_RW_INDEX = 0x000000FE\n// DC_LUT_30_COLOR = 0x3FBFEFFB\n// DC_LUT_RW_INDEX = 0x000000FF\n// DC_LUT_30_COLOR = 0x3FFFFFFF\n// DC_LUT_RW_INDEX = 0x00000100\n//\n// In 4D5307E6, the 128-entry PWL gamma ramp for the 10bpc framebuffer, for\n// VdGetCurrentDisplayGamma returning 1 (sRGB), is set up right after launching\n// the game as:\n// DC_LUTA_CONTROL = 0x00000003 (8-increment unsigned fixed-point)\n// DC_LUT_RW_MODE = 0x00000001\n// DC_LUT_RW_INDEX = 0x00000000\n// DC_LUT_WRITE_EN_MASK = 0x00000007\n// DC_LUT_PWL_DATA = 0x02000000\n// DC_LUT_PWL_DATA = 0x02000000\n// DC_LUT_PWL_DATA = 0x02000000\n// DC_LUT_RW_INDEX = 0x00000001\n// DC_LUT_PWL_DATA = 0x02000200\n// DC_LUT_PWL_DATA = 0x02000200\n// DC_LUT_PWL_DATA = 0x02000200\n// DC_LUT_RW_INDEX = 0x00000001\n// DC_LUT_PWL_DATA = 0x02000400\n// DC_LUT_PWL_DATA = 0x02000400\n// DC_LUT_PWL_DATA = 0x02000400\n// ...\n// DC_LUT_RW_INDEX = 0x0000007D\n// DC_LUT_PWL_DATA = 0x0200FBC0\n// DC_LUT_PWL_DATA = 0x0200FBC0\n// DC_LUT_PWL_DATA = 0x0200FBC0\n// DC_LUT_RW_INDEX = 0x0000007E\n// DC_LUT_PWL_DATA = 0x0200FDC0\n// DC_LUT_PWL_DATA = 0x0200FDC0\n// DC_LUT_PWL_DATA = 0x0200FDC0\n// DC_LUT_RW_INDEX = 0x0000007F\n// DC_LUT_PWL_DATA = 0x0000FFC0\n// DC_LUT_PWL_DATA = 0x0000FFC0\n// DC_LUT_PWL_DATA = 0x0000FFC0\n// DC_LUT_RW_INDEX = 0x00000080\n//\n// Later in 4D5307E6, for the game itself (apparently for conversion of the bit\n// representation of 7e3 floating-point data in the front buffer to 10-bit fixed\n// point, as the game draws the final passes to a 7e3 framebuffer), with\n// VdGetCurrentDisplayGamma returning 1 (sRGB) and the normal brightness in the\n// game settings, it's:\n// DC_LUTA_CONTROL = 0x00000003 (8-increment unsigned fixed-point)\n// DC_LUT_RW_MODE = 0x00000001\n// DC_LUT_RW_INDEX = 0x00000000\n// DC_LUT_WRITE_EN_MASK = 0x00000007\n// DC_LUT_PWL_DATA = 0x05000000\n// DC_LUT_PWL_DATA = 0x05000000\n// DC_LUT_PWL_DATA = 0x05000000\n// DC_LUT_RW_INDEX = 0x00000001\n// DC_LUT_PWL_DATA = 0x02000500\n// DC_LUT_PWL_DATA = 0x02000500\n// DC_LUT_PWL_DATA = 0x02000500\n// DC_LUT_RW_INDEX = 0x00000001\n// DC_LUT_PWL_DATA = 0x01800740\n// DC_LUT_PWL_DATA = 0x01800740\n// DC_LUT_PWL_DATA = 0x01800740\n// ...\n// DC_LUT_RW_INDEX = 0x0000007D\n// DC_LUT_PWL_DATA = 0x0440F340\n// DC_LUT_PWL_DATA = 0x0440F340\n// DC_LUT_PWL_DATA = 0x0440F340\n// DC_LUT_RW_INDEX = 0x0000007E\n// DC_LUT_PWL_DATA = 0x0400F780\n// DC_LUT_PWL_DATA = 0x0400F780\n// DC_LUT_PWL_DATA = 0x0400F780\n// DC_LUT_RW_INDEX = 0x0000007F\n// DC_LUT_PWL_DATA = 0x0400FBC0\n// DC_LUT_PWL_DATA = 0x0400FBC0\n// DC_LUT_PWL_DATA = 0x0400FBC0\n// DC_LUT_RW_INDEX = 0x00000080\n//\n// In 535107D4, the 256-entry gamma ramp for the 8bpc framebuffer is\n// configurable from the game's settings menu for each channel independently.\n// For VdGetCurrentDisplayGamma returning 1 (sRGB), when in the settings, the\n// red gamma is at the maximum of 5.56, green is at 1.00, and blue is at the\n// minimum of 0.17, the setup is done as:\n// DC_LUT_RW_MODE = 0x00000000\n// DC_LUT_RW_INDEX = 0x00000000\n// DC_LUT_WRITE_EN_MASK = 0x00000007\n// DC_LUT_30_COLOR = 0x00000000\n// DC_LUT_RW_INDEX = 0x00000001\n// DC_LUT_30_COLOR = 0x17901000\n// DC_LUT_RW_INDEX = 0x00000002\n// DC_LUT_30_COLOR = 0x1AB02000\n// ...\n// DC_LUT_RW_INDEX = 0x000000FE\n// DC_LUT_30_COLOR = 0x3FEFE3D2\n// DC_LUT_RW_INDEX = 0x000000FF\n// DC_LUT_30_COLOR = 0x3FFFF3E9\n// DC_LUT_RW_INDEX = 0x00000100\n\n// Read / write mode in bit 0: 0 - 256-entry table, 1 - PWL.\n// Default: 0x00000000.\nXE_GPU_REGISTER(0x1921, kDword, DC_LUT_RW_MODE)\n// Read / write index. No lower and upper halves on the Xenos apparently, for\n// the 256-entry table, the bits 0:7 are the index directly (unlike on the M56,\n// not split into the index in 1:7 and the lower or upper 10 bits selection in\n// 0:0, instead, on the Xenos, the index in 0:7 is just increased\n// monotonically). For some reason though Direct3D 9 writes an index that\n// overflows by one (0x100 for the 256-entry table, 0x80 for the 128-entry PWL\n// gamma ramp) after setting up all the values. However, the index is 8-bit, and\n// for PWL, according to the M56 documentation, the bit 7 is not used.\n// Default: 0x00000000.\nXE_GPU_REGISTER(0x1922, kDword, DC_LUT_RW_INDEX)\n// Sequential 10-bit R, G, B host read / write for the 256-entry table. After\n// reset or writing DC_LUT_RW_INDEX, the first access is for the red component,\n// the second is for green, the third is for blue, and after blue is accessed,\n// the LUT index is increased by 1 (without having to explicitly change\n// DC_LUT_RW_INDEX). Bits 0:5 are hardwired to zero.\n// Default: 0x00000000.\nXE_GPU_REGISTER(0x1923, kDword, DC_LUT_SEQ_COLOR)\n// Read / write, 0:15 - base, 16:31 - delta. Bits 0:5 of both the base and the\n// delta are hardwired to zero. The LUT index is increased by 1 when\n// DC_LUT_PWL_DATA is accessed, though three DC_LUT_PWL_DATA writes are done for\n// one entry (the order is likely R, G, B, similar to DC_LUT_SEQ_COLOR, but this\n// hasn't been verified yet as no games using the PWL gamma ramp with separate\n// settings for each channel have been found yet).\n// Default: 0x00000000.\nXE_GPU_REGISTER(0x1924, kDword, DC_LUT_PWL_DATA)\n// Read / write, 0:9 - blue, 10:19 - green, 20:29 - red. The LUT index is\n// increased by 1 when DC_LUT_30_COLOR is accessed.\n// Default: 0x00000000.\nXE_GPU_REGISTER(0x1925, kDword, DC_LUT_30_COLOR)\n\n// Only LUT pipe 1 on the Xenos apparently (Direct3D 9 sets DC_LUT_WRITE_EN_MASK\n// to 0b111 before writing the gamma ramp), 3 bits set, rather than 6 on the\n// M56.\n// Bit 0 - blue write enable mask.\n// Bit 1 - green write enable mask.\n// Bit 2 - red write enable mask.\n// Default: 0x00000007 (though 0x0000003F on the M56 where there are two pipes).\nXE_GPU_REGISTER(0x1927, kDword, DC_LUT_WRITE_EN_MASK)\n\n// Single set of parameters for all channels apparently unlike on the M56\n// (4D5307E6 sets DC_LUTA_CONTROL to 0x00000003 for the data increment of 8 in\n// the 128-entry PWL gamma ramp for a 10bpc framebuffer). Also set not only\n// during setup, but also apparently during every swap by Direct3D 9, though not\n// directly in all games (happens in 4B4F07FE and 4D5307E6 even without proper\n// VdSwap emulation, but in 535107D4, with a fake VdSwap packet rather than the\n// real ones, the register is not set at all, though the expected behavior is\n// that of the value of 0x00000000).\n// Default: 0x00000000.\nXE_GPU_REGISTER(0x1930, kDword, DC_LUTA_CONTROL)\n\nXE_GPU_REGISTER(0x1961, kDword, AVIVO_D1MODE_VIEWPORT_SIZE)\n\nXE_GPU_REGISTER(0x1964, kDword, AVIVO_D1SCL_SCALER_ENABLE)\n\nXE_GPU_REGISTER(0x1973, kDword, AVIVO_D1SCL_UPDATE)\n\nXE_GPU_REGISTER(0x2000, kDword, RB_SURFACE_INFO)\nXE_GPU_REGISTER(0x2001, kDword, RB_COLOR_INFO)\nXE_GPU_REGISTER(0x2002, kDword, RB_DEPTH_INFO)\nXE_GPU_REGISTER(0x2003, kDword, RB_COLOR1_INFO)\nXE_GPU_REGISTER(0x2004, kDword, RB_COLOR2_INFO)\nXE_GPU_REGISTER(0x2005, kDword, RB_COLOR3_INFO)\nXE_GPU_REGISTER(0x2006, kDword, COHER_DEST_BASE_0)\nXE_GPU_REGISTER(0x2007, kDword, COHER_DEST_BASE_1)\nXE_GPU_REGISTER(0x2008, kDword, COHER_DEST_BASE_2)\nXE_GPU_REGISTER(0x2009, kDword, COHER_DEST_BASE_3)\nXE_GPU_REGISTER(0x200A, kDword, COHER_DEST_BASE_4)\nXE_GPU_REGISTER(0x200B, kDword, COHER_DEST_BASE_5)\nXE_GPU_REGISTER(0x200C, kDword, COHER_DEST_BASE_6)\nXE_GPU_REGISTER(0x200D, kDword, COHER_DEST_BASE_7)\nXE_GPU_REGISTER(0x200E, kDword, PA_SC_SCREEN_SCISSOR_TL)\nXE_GPU_REGISTER(0x200F, kDword, PA_SC_SCREEN_SCISSOR_BR)\n\nXE_GPU_REGISTER(0x2080, kDword, PA_SC_WINDOW_OFFSET)\nXE_GPU_REGISTER(0x2081, kDword, PA_SC_WINDOW_SCISSOR_TL)\nXE_GPU_REGISTER(0x2082, kDword, PA_SC_WINDOW_SCISSOR_BR)\n\nXE_GPU_REGISTER(0x2100, kDword, VGT_MAX_VTX_INDX)\nXE_GPU_REGISTER(0x2101, kDword, VGT_MIN_VTX_INDX)\nXE_GPU_REGISTER(0x2102, kDword, VGT_INDX_OFFSET)\nXE_GPU_REGISTER(0x2103, kDword, VGT_MULTI_PRIM_IB_RESET_INDX)\nXE_GPU_REGISTER(0x2104, kDword, RB_COLOR_MASK)\nXE_GPU_REGISTER(0x2105, kFloat, RB_BLEND_RED)\nXE_GPU_REGISTER(0x2106, kFloat, RB_BLEND_GREEN)\nXE_GPU_REGISTER(0x2107, kFloat, RB_BLEND_BLUE)\nXE_GPU_REGISTER(0x2108, kFloat, RB_BLEND_ALPHA)\nXE_GPU_REGISTER(0x2109, kFloat, RB_FOG_COLOR_RED)\nXE_GPU_REGISTER(0x210A, kFloat, RB_FOG_COLOR_GREEN)\nXE_GPU_REGISTER(0x210B, kFloat, RB_FOG_COLOR_BLUE)\nXE_GPU_REGISTER(0x210C, kDword, RB_STENCILREFMASK_BF)\nXE_GPU_REGISTER(0x210D, kDword, RB_STENCILREFMASK)\nXE_GPU_REGISTER(0x210E, kFloat, RB_ALPHA_REF)\nXE_GPU_REGISTER(0x210F, kFloat, PA_CL_VPORT_XSCALE)\nXE_GPU_REGISTER(0x2110, kFloat, PA_CL_VPORT_XOFFSET)\nXE_GPU_REGISTER(0x2111, kFloat, PA_CL_VPORT_YSCALE)\nXE_GPU_REGISTER(0x2112, kFloat, PA_CL_VPORT_YOFFSET)\nXE_GPU_REGISTER(0x2113, kFloat, PA_CL_VPORT_ZSCALE)\nXE_GPU_REGISTER(0x2114, kFloat, PA_CL_VPORT_ZOFFSET)\n\nXE_GPU_REGISTER(0x2180, kDword, SQ_PROGRAM_CNTL)\nXE_GPU_REGISTER(0x2181, kDword, SQ_CONTEXT_MISC)\nXE_GPU_REGISTER(0x2182, kDword, SQ_INTERPOLATOR_CNTL)\nXE_GPU_REGISTER(0x2183, kDword, SQ_WRAPPING_0)\nXE_GPU_REGISTER(0x2184, kDword, SQ_WRAPPING_1)\n\n// These three registers are set by the command processor.\nXE_GPU_REGISTER(0x21F9, kDword, VGT_EVENT_INITIATOR)\nXE_GPU_REGISTER(0x21FA, kDword, VGT_DMA_BASE)\nXE_GPU_REGISTER(0x21FB, kDword, VGT_DMA_SIZE)\nXE_GPU_REGISTER(0x21FC, kDword, VGT_DRAW_INITIATOR)\nXE_GPU_REGISTER(0x21FD, kDword, VGT_IMMED_DATA)\n\nXE_GPU_REGISTER(0x2200, kDword, RB_DEPTHCONTROL)\nXE_GPU_REGISTER(0x2201, kDword, RB_BLENDCONTROL0)\nXE_GPU_REGISTER(0x2202, kDword, RB_COLORCONTROL)\nXE_GPU_REGISTER(0x2203, kDword, RB_HIZCONTROL)\nXE_GPU_REGISTER(0x2204, kDword, PA_CL_CLIP_CNTL)\nXE_GPU_REGISTER(0x2205, kDword, PA_SU_SC_MODE_CNTL)\nXE_GPU_REGISTER(0x2206, kDword, PA_CL_VTE_CNTL)\nXE_GPU_REGISTER(0x2207, kDword, VGT_CURRENT_BIN_ID_MIN)\nXE_GPU_REGISTER(0x2208, kDword, RB_MODECONTROL)\nXE_GPU_REGISTER(0x2209, kDword, RB_BLENDCONTROL1)\nXE_GPU_REGISTER(0x220A, kDword, RB_BLENDCONTROL2)\nXE_GPU_REGISTER(0x220B, kDword, RB_BLENDCONTROL3)\n\nXE_GPU_REGISTER(0x2280, kDword, PA_SU_POINT_SIZE)\nXE_GPU_REGISTER(0x2281, kDword, PA_SU_POINT_MINMAX)\nXE_GPU_REGISTER(0x2282, kDword, PA_SU_LINE_CNTL)\nXE_GPU_REGISTER(0x2283, kDword, PA_SC_LINE_STIPPLE)\nXE_GPU_REGISTER(0x2284, kDword, VGT_OUTPUT_PATH_CNTL)\nXE_GPU_REGISTER(0x2285, kDword, VGT_HOS_CNTL)\nXE_GPU_REGISTER(0x2286, kFloat, VGT_HOS_MAX_TESS_LEVEL)\nXE_GPU_REGISTER(0x2287, kFloat, VGT_HOS_MIN_TESS_LEVEL)\nXE_GPU_REGISTER(0x2288, kDword, VGT_HOS_REUSE_DEPTH)\nXE_GPU_REGISTER(0x2289, kDword, VGT_GROUP_PRIM_TYPE)\nXE_GPU_REGISTER(0x228A, kDword, VGT_GROUP_FIRST_DECR)\nXE_GPU_REGISTER(0x228B, kDword, VGT_GROUP_DECR)\nXE_GPU_REGISTER(0x228C, kDword, VGT_GROUP_VECT_0_CNTL)\nXE_GPU_REGISTER(0x228D, kDword, VGT_GROUP_VECT_1_CNTL)\nXE_GPU_REGISTER(0x228E, kDword, VGT_GROUP_VECT_0_FMT_CNTL)\nXE_GPU_REGISTER(0x228F, kDword, VGT_GROUP_VECT_1_FMT_CNTL)\nXE_GPU_REGISTER(0x2290, kDword, UNKNOWN_2290)\nXE_GPU_REGISTER(0x2291, kDword, UNKNOWN_2291)\nXE_GPU_REGISTER(0x2292, kDword, PA_SC_MPASS_PS_CNTL)\nXE_GPU_REGISTER(0x2293, kDword, PA_SC_VIZ_QUERY)\nXE_GPU_REGISTER(0x2294, kDword, VGT_ENHANCE)\n\nXE_GPU_REGISTER(0x2300, kDword, PA_SC_LINE_CNTL)\nXE_GPU_REGISTER(0x2301, kDword, PA_SC_AA_CONFIG)\nXE_GPU_REGISTER(0x2302, kDword, PA_SU_VTX_CNTL)\nXE_GPU_REGISTER(0x2303, kFloat, PA_CL_GB_VERT_CLIP_ADJ)\nXE_GPU_REGISTER(0x2304, kFloat, PA_CL_GB_VERT_DISC_ADJ)\nXE_GPU_REGISTER(0x2305, kFloat, PA_CL_GB_HORZ_CLIP_ADJ)\nXE_GPU_REGISTER(0x2306, kFloat, PA_CL_GB_HORZ_DISC_ADJ)\nXE_GPU_REGISTER(0x2307, kDword, SQ_VS_CONST)\nXE_GPU_REGISTER(0x2308, kDword, SQ_PS_CONST)\nXE_GPU_REGISTER(0x2309, kDword, SQ_DEBUG_MISC_0)\nXE_GPU_REGISTER(0x230A, kDword, SQ_DEBUG_MISC_1)\nXE_GPU_REGISTER(0x230B, kDword, UNKNOWN_230B)\nXE_GPU_REGISTER(0x230C, kDword, UNKNOWN_230C)\nXE_GPU_REGISTER(0x230D, kDword, UNKNOWN_230D)\nXE_GPU_REGISTER(0x230E, kDword, UNKNOWN_230E)\nXE_GPU_REGISTER(0x230F, kDword, UNKNOWN_230F)\nXE_GPU_REGISTER(0x2310, kDword, UNKNOWN_2310)\nXE_GPU_REGISTER(0x2311, kDword, UNKNOWN_2311)\nXE_GPU_REGISTER(0x2312, kDword, PA_SC_AA_MASK)\nXE_GPU_REGISTER(0x2313, kDword, UNKNOWN_2313)\nXE_GPU_REGISTER(0x2314, kDword, UNKNOWN_2314)\nXE_GPU_REGISTER(0x2315, kDword, SQ_CF_PROGRAM_SIZE)\nXE_GPU_REGISTER(0x2316, kDword, VGT_VERTEX_REUSE_BLOCK_CNTL)\nXE_GPU_REGISTER(0x2317, kDword, VGT_OUT_DEALLOC_CNTL)\nXE_GPU_REGISTER(0x2318, kDword, RB_COPY_CONTROL)\nXE_GPU_REGISTER(0x2319, kDword, RB_COPY_DEST_BASE)\nXE_GPU_REGISTER(0x231A, kDword, RB_COPY_DEST_PITCH)\nXE_GPU_REGISTER(0x231B, kDword, RB_COPY_DEST_INFO)\nXE_GPU_REGISTER(0x231C, kDword, RB_HIZ_CLEAR)\nXE_GPU_REGISTER(0x231D, kDword, RB_DEPTH_CLEAR)\nXE_GPU_REGISTER(0x231E, kDword, RB_COLOR_CLEAR)\nXE_GPU_REGISTER(0x231F, kDword, RB_COLOR_CLEAR_LO)\nXE_GPU_REGISTER(0x2320, kDword, RB_COPY_FUNC)\nXE_GPU_REGISTER(0x2321, kDword, RB_COPY_REF)\nXE_GPU_REGISTER(0x2322, kDword, RB_COPY_MASK)\nXE_GPU_REGISTER(0x2323, kDword, RB_COPY_SURFACE_SLICE)\nXE_GPU_REGISTER(0x2324, kDword, RB_SAMPLE_COUNT_CTL)\nXE_GPU_REGISTER(0x2325, kDword, RB_SAMPLE_COUNT_ADDR)\n\n// Polygon offset scales and offsets are 32-bit floating-point.\n// \"slope computed in subpixels (1/12 or 1/16)\" - R5xx Acceleration.\n// But the correct scale for conversion of the slope scale (FRONT_BACK/SCALE)\n// from subpixels to pixels is likely 1/16 according to:\n// https://github.com/mesa3d/mesa/blob/54ad9b444c8e73da498211870e785239ad3ff1aa/src/gallium/drivers/radeonsi/si_state.c#L946\nXE_GPU_REGISTER(0x2380, kFloat, PA_SU_POLY_OFFSET_FRONT_SCALE)\nXE_GPU_REGISTER(0x2381, kFloat, PA_SU_POLY_OFFSET_FRONT_OFFSET)\nXE_GPU_REGISTER(0x2382, kFloat, PA_SU_POLY_OFFSET_BACK_SCALE)\nXE_GPU_REGISTER(0x2383, kFloat, PA_SU_POLY_OFFSET_BACK_OFFSET)\nXE_GPU_REGISTER(0x2384, kFloat, PA_CL_POINT_X_RAD)\nXE_GPU_REGISTER(0x2385, kFloat, PA_CL_POINT_Y_RAD)\nXE_GPU_REGISTER(0x2386, kFloat, PA_CL_POINT_SIZE)\nXE_GPU_REGISTER(0x2387, kFloat, PA_CL_POINT_CULL_RAD)\nXE_GPU_REGISTER(0x2388, kFloat, PA_CL_UCP_0_X)\nXE_GPU_REGISTER(0x2389, kFloat, PA_CL_UCP_0_Y)\nXE_GPU_REGISTER(0x238A, kFloat, PA_CL_UCP_0_Z)\nXE_GPU_REGISTER(0x238B, kFloat, PA_CL_UCP_0_W)\nXE_GPU_REGISTER(0x238C, kFloat, PA_CL_UCP_1_X)\nXE_GPU_REGISTER(0x238D, kFloat, PA_CL_UCP_1_Y)\nXE_GPU_REGISTER(0x238E, kFloat, PA_CL_UCP_1_Z)\nXE_GPU_REGISTER(0x238F, kFloat, PA_CL_UCP_1_W)\nXE_GPU_REGISTER(0x2390, kFloat, PA_CL_UCP_2_X)\nXE_GPU_REGISTER(0x2391, kFloat, PA_CL_UCP_2_Y)\nXE_GPU_REGISTER(0x2392, kFloat, PA_CL_UCP_2_Z)\nXE_GPU_REGISTER(0x2393, kFloat, PA_CL_UCP_2_W)\nXE_GPU_REGISTER(0x2394, kFloat, PA_CL_UCP_3_X)\nXE_GPU_REGISTER(0x2395, kFloat, PA_CL_UCP_3_Y)\nXE_GPU_REGISTER(0x2396, kFloat, PA_CL_UCP_3_Z)\nXE_GPU_REGISTER(0x2397, kFloat, PA_CL_UCP_3_W)\nXE_GPU_REGISTER(0x2398, kFloat, PA_CL_UCP_4_X)\nXE_GPU_REGISTER(0x2399, kFloat, PA_CL_UCP_4_Y)\nXE_GPU_REGISTER(0x239A, kFloat, PA_CL_UCP_4_Z)\nXE_GPU_REGISTER(0x239B, kFloat, PA_CL_UCP_4_W)\nXE_GPU_REGISTER(0x239C, kFloat, PA_CL_UCP_5_X)\nXE_GPU_REGISTER(0x239D, kFloat, PA_CL_UCP_5_Y)\nXE_GPU_REGISTER(0x239E, kFloat, PA_CL_UCP_5_Z)\nXE_GPU_REGISTER(0x239F, kFloat, PA_CL_UCP_5_W)\n\nXE_GPU_REGISTER(0x4000, kFloat, SHADER_CONSTANT_000_X)\nXE_GPU_REGISTER(0x4001, kFloat, SHADER_CONSTANT_000_Y)\nXE_GPU_REGISTER(0x4002, kFloat, SHADER_CONSTANT_000_Z)\nXE_GPU_REGISTER(0x4003, kFloat, SHADER_CONSTANT_000_W)\nXE_GPU_REGISTER(0x4004, kFloat, SHADER_CONSTANT_001_X)\nXE_GPU_REGISTER(0x4005, kFloat, SHADER_CONSTANT_001_Y)\nXE_GPU_REGISTER(0x4006, kFloat, SHADER_CONSTANT_001_Z)\nXE_GPU_REGISTER(0x4007, kFloat, SHADER_CONSTANT_001_W)\nXE_GPU_REGISTER(0x4008, kFloat, SHADER_CONSTANT_002_X)\nXE_GPU_REGISTER(0x4009, kFloat, SHADER_CONSTANT_002_Y)\nXE_GPU_REGISTER(0x400A, kFloat, SHADER_CONSTANT_002_Z)\nXE_GPU_REGISTER(0x400B, kFloat, SHADER_CONSTANT_002_W)\nXE_GPU_REGISTER(0x400C, kFloat, SHADER_CONSTANT_003_X)\nXE_GPU_REGISTER(0x400D, kFloat, SHADER_CONSTANT_003_Y)\nXE_GPU_REGISTER(0x400E, kFloat, SHADER_CONSTANT_003_Z)\nXE_GPU_REGISTER(0x400F, kFloat, SHADER_CONSTANT_003_W)\nXE_GPU_REGISTER(0x4010, kFloat, SHADER_CONSTANT_004_X)\nXE_GPU_REGISTER(0x4011, kFloat, SHADER_CONSTANT_004_Y)\nXE_GPU_REGISTER(0x4012, kFloat, SHADER_CONSTANT_004_Z)\nXE_GPU_REGISTER(0x4013, kFloat, SHADER_CONSTANT_004_W)\nXE_GPU_REGISTER(0x4014, kFloat, SHADER_CONSTANT_005_X)\nXE_GPU_REGISTER(0x4015, kFloat, SHADER_CONSTANT_005_Y)\nXE_GPU_REGISTER(0x4016, kFloat, SHADER_CONSTANT_005_Z)\nXE_GPU_REGISTER(0x4017, kFloat, SHADER_CONSTANT_005_W)\nXE_GPU_REGISTER(0x4018, kFloat, SHADER_CONSTANT_006_X)\nXE_GPU_REGISTER(0x4019, kFloat, SHADER_CONSTANT_006_Y)\nXE_GPU_REGISTER(0x401A, kFloat, SHADER_CONSTANT_006_Z)\nXE_GPU_REGISTER(0x401B, kFloat, SHADER_CONSTANT_006_W)\nXE_GPU_REGISTER(0x401C, kFloat, SHADER_CONSTANT_007_X)\nXE_GPU_REGISTER(0x401D, kFloat, SHADER_CONSTANT_007_Y)\nXE_GPU_REGISTER(0x401E, kFloat, SHADER_CONSTANT_007_Z)\nXE_GPU_REGISTER(0x401F, kFloat, SHADER_CONSTANT_007_W)\nXE_GPU_REGISTER(0x4020, kFloat, SHADER_CONSTANT_008_X)\nXE_GPU_REGISTER(0x4021, kFloat, SHADER_CONSTANT_008_Y)\nXE_GPU_REGISTER(0x4022, kFloat, SHADER_CONSTANT_008_Z)\nXE_GPU_REGISTER(0x4023, kFloat, SHADER_CONSTANT_008_W)\nXE_GPU_REGISTER(0x4024, kFloat, SHADER_CONSTANT_009_X)\nXE_GPU_REGISTER(0x4025, kFloat, SHADER_CONSTANT_009_Y)\nXE_GPU_REGISTER(0x4026, kFloat, SHADER_CONSTANT_009_Z)\nXE_GPU_REGISTER(0x4027, kFloat, SHADER_CONSTANT_009_W)\nXE_GPU_REGISTER(0x4028, kFloat, SHADER_CONSTANT_010_X)\nXE_GPU_REGISTER(0x4029, kFloat, SHADER_CONSTANT_010_Y)\nXE_GPU_REGISTER(0x402A, kFloat, SHADER_CONSTANT_010_Z)\nXE_GPU_REGISTER(0x402B, kFloat, SHADER_CONSTANT_010_W)\nXE_GPU_REGISTER(0x402C, kFloat, SHADER_CONSTANT_011_X)\nXE_GPU_REGISTER(0x402D, kFloat, SHADER_CONSTANT_011_Y)\nXE_GPU_REGISTER(0x402E, kFloat, SHADER_CONSTANT_011_Z)\nXE_GPU_REGISTER(0x402F, kFloat, SHADER_CONSTANT_011_W)\nXE_GPU_REGISTER(0x4030, kFloat, SHADER_CONSTANT_012_X)\nXE_GPU_REGISTER(0x4031, kFloat, SHADER_CONSTANT_012_Y)\nXE_GPU_REGISTER(0x4032, kFloat, SHADER_CONSTANT_012_Z)\nXE_GPU_REGISTER(0x4033, kFloat, SHADER_CONSTANT_012_W)\nXE_GPU_REGISTER(0x4034, kFloat, SHADER_CONSTANT_013_X)\nXE_GPU_REGISTER(0x4035, kFloat, SHADER_CONSTANT_013_Y)\nXE_GPU_REGISTER(0x4036, kFloat, SHADER_CONSTANT_013_Z)\nXE_GPU_REGISTER(0x4037, kFloat, SHADER_CONSTANT_013_W)\nXE_GPU_REGISTER(0x4038, kFloat, SHADER_CONSTANT_014_X)\nXE_GPU_REGISTER(0x4039, kFloat, SHADER_CONSTANT_014_Y)\nXE_GPU_REGISTER(0x403A, kFloat, SHADER_CONSTANT_014_Z)\nXE_GPU_REGISTER(0x403B, kFloat, SHADER_CONSTANT_014_W)\nXE_GPU_REGISTER(0x403C, kFloat, SHADER_CONSTANT_015_X)\nXE_GPU_REGISTER(0x403D, kFloat, SHADER_CONSTANT_015_Y)\nXE_GPU_REGISTER(0x403E, kFloat, SHADER_CONSTANT_015_Z)\nXE_GPU_REGISTER(0x403F, kFloat, SHADER_CONSTANT_015_W)\nXE_GPU_REGISTER(0x4040, kFloat, SHADER_CONSTANT_016_X)\nXE_GPU_REGISTER(0x4041, kFloat, SHADER_CONSTANT_016_Y)\nXE_GPU_REGISTER(0x4042, kFloat, SHADER_CONSTANT_016_Z)\nXE_GPU_REGISTER(0x4043, kFloat, SHADER_CONSTANT_016_W)\nXE_GPU_REGISTER(0x4044, kFloat, SHADER_CONSTANT_017_X)\nXE_GPU_REGISTER(0x4045, kFloat, SHADER_CONSTANT_017_Y)\nXE_GPU_REGISTER(0x4046, kFloat, SHADER_CONSTANT_017_Z)\nXE_GPU_REGISTER(0x4047, kFloat, SHADER_CONSTANT_017_W)\nXE_GPU_REGISTER(0x4048, kFloat, SHADER_CONSTANT_018_X)\nXE_GPU_REGISTER(0x4049, kFloat, SHADER_CONSTANT_018_Y)\nXE_GPU_REGISTER(0x404A, kFloat, SHADER_CONSTANT_018_Z)\nXE_GPU_REGISTER(0x404B, kFloat, SHADER_CONSTANT_018_W)\nXE_GPU_REGISTER(0x404C, kFloat, SHADER_CONSTANT_019_X)\nXE_GPU_REGISTER(0x404D, kFloat, SHADER_CONSTANT_019_Y)\nXE_GPU_REGISTER(0x404E, kFloat, SHADER_CONSTANT_019_Z)\nXE_GPU_REGISTER(0x404F, kFloat, SHADER_CONSTANT_019_W)\nXE_GPU_REGISTER(0x4050, kFloat, SHADER_CONSTANT_020_X)\nXE_GPU_REGISTER(0x4051, kFloat, SHADER_CONSTANT_020_Y)\nXE_GPU_REGISTER(0x4052, kFloat, SHADER_CONSTANT_020_Z)\nXE_GPU_REGISTER(0x4053, kFloat, SHADER_CONSTANT_020_W)\nXE_GPU_REGISTER(0x4054, kFloat, SHADER_CONSTANT_021_X)\nXE_GPU_REGISTER(0x4055, kFloat, SHADER_CONSTANT_021_Y)\nXE_GPU_REGISTER(0x4056, kFloat, SHADER_CONSTANT_021_Z)\nXE_GPU_REGISTER(0x4057, kFloat, SHADER_CONSTANT_021_W)\nXE_GPU_REGISTER(0x4058, kFloat, SHADER_CONSTANT_022_X)\nXE_GPU_REGISTER(0x4059, kFloat, SHADER_CONSTANT_022_Y)\nXE_GPU_REGISTER(0x405A, kFloat, SHADER_CONSTANT_022_Z)\nXE_GPU_REGISTER(0x405B, kFloat, SHADER_CONSTANT_022_W)\nXE_GPU_REGISTER(0x405C, kFloat, SHADER_CONSTANT_023_X)\nXE_GPU_REGISTER(0x405D, kFloat, SHADER_CONSTANT_023_Y)\nXE_GPU_REGISTER(0x405E, kFloat, SHADER_CONSTANT_023_Z)\nXE_GPU_REGISTER(0x405F, kFloat, SHADER_CONSTANT_023_W)\nXE_GPU_REGISTER(0x4060, kFloat, SHADER_CONSTANT_024_X)\nXE_GPU_REGISTER(0x4061, kFloat, SHADER_CONSTANT_024_Y)\nXE_GPU_REGISTER(0x4062, kFloat, SHADER_CONSTANT_024_Z)\nXE_GPU_REGISTER(0x4063, kFloat, SHADER_CONSTANT_024_W)\nXE_GPU_REGISTER(0x4064, kFloat, SHADER_CONSTANT_025_X)\nXE_GPU_REGISTER(0x4065, kFloat, SHADER_CONSTANT_025_Y)\nXE_GPU_REGISTER(0x4066, kFloat, SHADER_CONSTANT_025_Z)\nXE_GPU_REGISTER(0x4067, kFloat, SHADER_CONSTANT_025_W)\nXE_GPU_REGISTER(0x4068, kFloat, SHADER_CONSTANT_026_X)\nXE_GPU_REGISTER(0x4069, kFloat, SHADER_CONSTANT_026_Y)\nXE_GPU_REGISTER(0x406A, kFloat, SHADER_CONSTANT_026_Z)\nXE_GPU_REGISTER(0x406B, kFloat, SHADER_CONSTANT_026_W)\nXE_GPU_REGISTER(0x406C, kFloat, SHADER_CONSTANT_027_X)\nXE_GPU_REGISTER(0x406D, kFloat, SHADER_CONSTANT_027_Y)\nXE_GPU_REGISTER(0x406E, kFloat, SHADER_CONSTANT_027_Z)\nXE_GPU_REGISTER(0x406F, kFloat, SHADER_CONSTANT_027_W)\nXE_GPU_REGISTER(0x4070, kFloat, SHADER_CONSTANT_028_X)\nXE_GPU_REGISTER(0x4071, kFloat, SHADER_CONSTANT_028_Y)\nXE_GPU_REGISTER(0x4072, kFloat, SHADER_CONSTANT_028_Z)\nXE_GPU_REGISTER(0x4073, kFloat, SHADER_CONSTANT_028_W)\nXE_GPU_REGISTER(0x4074, kFloat, SHADER_CONSTANT_029_X)\nXE_GPU_REGISTER(0x4075, kFloat, SHADER_CONSTANT_029_Y)\nXE_GPU_REGISTER(0x4076, kFloat, SHADER_CONSTANT_029_Z)\nXE_GPU_REGISTER(0x4077, kFloat, SHADER_CONSTANT_029_W)\nXE_GPU_REGISTER(0x4078, kFloat, SHADER_CONSTANT_030_X)\nXE_GPU_REGISTER(0x4079, kFloat, SHADER_CONSTANT_030_Y)\nXE_GPU_REGISTER(0x407A, kFloat, SHADER_CONSTANT_030_Z)\nXE_GPU_REGISTER(0x407B, kFloat, SHADER_CONSTANT_030_W)\nXE_GPU_REGISTER(0x407C, kFloat, SHADER_CONSTANT_031_X)\nXE_GPU_REGISTER(0x407D, kFloat, SHADER_CONSTANT_031_Y)\nXE_GPU_REGISTER(0x407E, kFloat, SHADER_CONSTANT_031_Z)\nXE_GPU_REGISTER(0x407F, kFloat, SHADER_CONSTANT_031_W)\nXE_GPU_REGISTER(0x4080, kFloat, SHADER_CONSTANT_032_X)\nXE_GPU_REGISTER(0x4081, kFloat, SHADER_CONSTANT_032_Y)\nXE_GPU_REGISTER(0x4082, kFloat, SHADER_CONSTANT_032_Z)\nXE_GPU_REGISTER(0x4083, kFloat, SHADER_CONSTANT_032_W)\nXE_GPU_REGISTER(0x4084, kFloat, SHADER_CONSTANT_033_X)\nXE_GPU_REGISTER(0x4085, kFloat, SHADER_CONSTANT_033_Y)\nXE_GPU_REGISTER(0x4086, kFloat, SHADER_CONSTANT_033_Z)\nXE_GPU_REGISTER(0x4087, kFloat, SHADER_CONSTANT_033_W)\nXE_GPU_REGISTER(0x4088, kFloat, SHADER_CONSTANT_034_X)\nXE_GPU_REGISTER(0x4089, kFloat, SHADER_CONSTANT_034_Y)\nXE_GPU_REGISTER(0x408A, kFloat, SHADER_CONSTANT_034_Z)\nXE_GPU_REGISTER(0x408B, kFloat, SHADER_CONSTANT_034_W)\nXE_GPU_REGISTER(0x408C, kFloat, SHADER_CONSTANT_035_X)\nXE_GPU_REGISTER(0x408D, kFloat, SHADER_CONSTANT_035_Y)\nXE_GPU_REGISTER(0x408E, kFloat, SHADER_CONSTANT_035_Z)\nXE_GPU_REGISTER(0x408F, kFloat, SHADER_CONSTANT_035_W)\nXE_GPU_REGISTER(0x4090, kFloat, SHADER_CONSTANT_036_X)\nXE_GPU_REGISTER(0x4091, kFloat, SHADER_CONSTANT_036_Y)\nXE_GPU_REGISTER(0x4092, kFloat, SHADER_CONSTANT_036_Z)\nXE_GPU_REGISTER(0x4093, kFloat, SHADER_CONSTANT_036_W)\nXE_GPU_REGISTER(0x4094, kFloat, SHADER_CONSTANT_037_X)\nXE_GPU_REGISTER(0x4095, kFloat, SHADER_CONSTANT_037_Y)\nXE_GPU_REGISTER(0x4096, kFloat, SHADER_CONSTANT_037_Z)\nXE_GPU_REGISTER(0x4097, kFloat, SHADER_CONSTANT_037_W)\nXE_GPU_REGISTER(0x4098, kFloat, SHADER_CONSTANT_038_X)\nXE_GPU_REGISTER(0x4099, kFloat, SHADER_CONSTANT_038_Y)\nXE_GPU_REGISTER(0x409A, kFloat, SHADER_CONSTANT_038_Z)\nXE_GPU_REGISTER(0x409B, kFloat, SHADER_CONSTANT_038_W)\nXE_GPU_REGISTER(0x409C, kFloat, SHADER_CONSTANT_039_X)\nXE_GPU_REGISTER(0x409D, kFloat, SHADER_CONSTANT_039_Y)\nXE_GPU_REGISTER(0x409E, kFloat, SHADER_CONSTANT_039_Z)\nXE_GPU_REGISTER(0x409F, kFloat, SHADER_CONSTANT_039_W)\nXE_GPU_REGISTER(0x40A0, kFloat, SHADER_CONSTANT_040_X)\nXE_GPU_REGISTER(0x40A1, kFloat, SHADER_CONSTANT_040_Y)\nXE_GPU_REGISTER(0x40A2, kFloat, SHADER_CONSTANT_040_Z)\nXE_GPU_REGISTER(0x40A3, kFloat, SHADER_CONSTANT_040_W)\nXE_GPU_REGISTER(0x40A4, kFloat, SHADER_CONSTANT_041_X)\nXE_GPU_REGISTER(0x40A5, kFloat, SHADER_CONSTANT_041_Y)\nXE_GPU_REGISTER(0x40A6, kFloat, SHADER_CONSTANT_041_Z)\nXE_GPU_REGISTER(0x40A7, kFloat, SHADER_CONSTANT_041_W)\nXE_GPU_REGISTER(0x40A8, kFloat, SHADER_CONSTANT_042_X)\nXE_GPU_REGISTER(0x40A9, kFloat, SHADER_CONSTANT_042_Y)\nXE_GPU_REGISTER(0x40AA, kFloat, SHADER_CONSTANT_042_Z)\nXE_GPU_REGISTER(0x40AB, kFloat, SHADER_CONSTANT_042_W)\nXE_GPU_REGISTER(0x40AC, kFloat, SHADER_CONSTANT_043_X)\nXE_GPU_REGISTER(0x40AD, kFloat, SHADER_CONSTANT_043_Y)\nXE_GPU_REGISTER(0x40AE, kFloat, SHADER_CONSTANT_043_Z)\nXE_GPU_REGISTER(0x40AF, kFloat, SHADER_CONSTANT_043_W)\nXE_GPU_REGISTER(0x40B0, kFloat, SHADER_CONSTANT_044_X)\nXE_GPU_REGISTER(0x40B1, kFloat, SHADER_CONSTANT_044_Y)\nXE_GPU_REGISTER(0x40B2, kFloat, SHADER_CONSTANT_044_Z)\nXE_GPU_REGISTER(0x40B3, kFloat, SHADER_CONSTANT_044_W)\nXE_GPU_REGISTER(0x40B4, kFloat, SHADER_CONSTANT_045_X)\nXE_GPU_REGISTER(0x40B5, kFloat, SHADER_CONSTANT_045_Y)\nXE_GPU_REGISTER(0x40B6, kFloat, SHADER_CONSTANT_045_Z)\nXE_GPU_REGISTER(0x40B7, kFloat, SHADER_CONSTANT_045_W)\nXE_GPU_REGISTER(0x40B8, kFloat, SHADER_CONSTANT_046_X)\nXE_GPU_REGISTER(0x40B9, kFloat, SHADER_CONSTANT_046_Y)\nXE_GPU_REGISTER(0x40BA, kFloat, SHADER_CONSTANT_046_Z)\nXE_GPU_REGISTER(0x40BB, kFloat, SHADER_CONSTANT_046_W)\nXE_GPU_REGISTER(0x40BC, kFloat, SHADER_CONSTANT_047_X)\nXE_GPU_REGISTER(0x40BD, kFloat, SHADER_CONSTANT_047_Y)\nXE_GPU_REGISTER(0x40BE, kFloat, SHADER_CONSTANT_047_Z)\nXE_GPU_REGISTER(0x40BF, kFloat, SHADER_CONSTANT_047_W)\nXE_GPU_REGISTER(0x40C0, kFloat, SHADER_CONSTANT_048_X)\nXE_GPU_REGISTER(0x40C1, kFloat, SHADER_CONSTANT_048_Y)\nXE_GPU_REGISTER(0x40C2, kFloat, SHADER_CONSTANT_048_Z)\nXE_GPU_REGISTER(0x40C3, kFloat, SHADER_CONSTANT_048_W)\nXE_GPU_REGISTER(0x40C4, kFloat, SHADER_CONSTANT_049_X)\nXE_GPU_REGISTER(0x40C5, kFloat, SHADER_CONSTANT_049_Y)\nXE_GPU_REGISTER(0x40C6, kFloat, SHADER_CONSTANT_049_Z)\nXE_GPU_REGISTER(0x40C7, kFloat, SHADER_CONSTANT_049_W)\nXE_GPU_REGISTER(0x40C8, kFloat, SHADER_CONSTANT_050_X)\nXE_GPU_REGISTER(0x40C9, kFloat, SHADER_CONSTANT_050_Y)\nXE_GPU_REGISTER(0x40CA, kFloat, SHADER_CONSTANT_050_Z)\nXE_GPU_REGISTER(0x40CB, kFloat, SHADER_CONSTANT_050_W)\nXE_GPU_REGISTER(0x40CC, kFloat, SHADER_CONSTANT_051_X)\nXE_GPU_REGISTER(0x40CD, kFloat, SHADER_CONSTANT_051_Y)\nXE_GPU_REGISTER(0x40CE, kFloat, SHADER_CONSTANT_051_Z)\nXE_GPU_REGISTER(0x40CF, kFloat, SHADER_CONSTANT_051_W)\nXE_GPU_REGISTER(0x40D0, kFloat, SHADER_CONSTANT_052_X)\nXE_GPU_REGISTER(0x40D1, kFloat, SHADER_CONSTANT_052_Y)\nXE_GPU_REGISTER(0x40D2, kFloat, SHADER_CONSTANT_052_Z)\nXE_GPU_REGISTER(0x40D3, kFloat, SHADER_CONSTANT_052_W)\nXE_GPU_REGISTER(0x40D4, kFloat, SHADER_CONSTANT_053_X)\nXE_GPU_REGISTER(0x40D5, kFloat, SHADER_CONSTANT_053_Y)\nXE_GPU_REGISTER(0x40D6, kFloat, SHADER_CONSTANT_053_Z)\nXE_GPU_REGISTER(0x40D7, kFloat, SHADER_CONSTANT_053_W)\nXE_GPU_REGISTER(0x40D8, kFloat, SHADER_CONSTANT_054_X)\nXE_GPU_REGISTER(0x40D9, kFloat, SHADER_CONSTANT_054_Y)\nXE_GPU_REGISTER(0x40DA, kFloat, SHADER_CONSTANT_054_Z)\nXE_GPU_REGISTER(0x40DB, kFloat, SHADER_CONSTANT_054_W)\nXE_GPU_REGISTER(0x40DC, kFloat, SHADER_CONSTANT_055_X)\nXE_GPU_REGISTER(0x40DD, kFloat, SHADER_CONSTANT_055_Y)\nXE_GPU_REGISTER(0x40DE, kFloat, SHADER_CONSTANT_055_Z)\nXE_GPU_REGISTER(0x40DF, kFloat, SHADER_CONSTANT_055_W)\nXE_GPU_REGISTER(0x40E0, kFloat, SHADER_CONSTANT_056_X)\nXE_GPU_REGISTER(0x40E1, kFloat, SHADER_CONSTANT_056_Y)\nXE_GPU_REGISTER(0x40E2, kFloat, SHADER_CONSTANT_056_Z)\nXE_GPU_REGISTER(0x40E3, kFloat, SHADER_CONSTANT_056_W)\nXE_GPU_REGISTER(0x40E4, kFloat, SHADER_CONSTANT_057_X)\nXE_GPU_REGISTER(0x40E5, kFloat, SHADER_CONSTANT_057_Y)\nXE_GPU_REGISTER(0x40E6, kFloat, SHADER_CONSTANT_057_Z)\nXE_GPU_REGISTER(0x40E7, kFloat, SHADER_CONSTANT_057_W)\nXE_GPU_REGISTER(0x40E8, kFloat, SHADER_CONSTANT_058_X)\nXE_GPU_REGISTER(0x40E9, kFloat, SHADER_CONSTANT_058_Y)\nXE_GPU_REGISTER(0x40EA, kFloat, SHADER_CONSTANT_058_Z)\nXE_GPU_REGISTER(0x40EB, kFloat, SHADER_CONSTANT_058_W)\nXE_GPU_REGISTER(0x40EC, kFloat, SHADER_CONSTANT_059_X)\nXE_GPU_REGISTER(0x40ED, kFloat, SHADER_CONSTANT_059_Y)\nXE_GPU_REGISTER(0x40EE, kFloat, SHADER_CONSTANT_059_Z)\nXE_GPU_REGISTER(0x40EF, kFloat, SHADER_CONSTANT_059_W)\nXE_GPU_REGISTER(0x40F0, kFloat, SHADER_CONSTANT_060_X)\nXE_GPU_REGISTER(0x40F1, kFloat, SHADER_CONSTANT_060_Y)\nXE_GPU_REGISTER(0x40F2, kFloat, SHADER_CONSTANT_060_Z)\nXE_GPU_REGISTER(0x40F3, kFloat, SHADER_CONSTANT_060_W)\nXE_GPU_REGISTER(0x40F4, kFloat, SHADER_CONSTANT_061_X)\nXE_GPU_REGISTER(0x40F5, kFloat, SHADER_CONSTANT_061_Y)\nXE_GPU_REGISTER(0x40F6, kFloat, SHADER_CONSTANT_061_Z)\nXE_GPU_REGISTER(0x40F7, kFloat, SHADER_CONSTANT_061_W)\nXE_GPU_REGISTER(0x40F8, kFloat, SHADER_CONSTANT_062_X)\nXE_GPU_REGISTER(0x40F9, kFloat, SHADER_CONSTANT_062_Y)\nXE_GPU_REGISTER(0x40FA, kFloat, SHADER_CONSTANT_062_Z)\nXE_GPU_REGISTER(0x40FB, kFloat, SHADER_CONSTANT_062_W)\nXE_GPU_REGISTER(0x40FC, kFloat, SHADER_CONSTANT_063_X)\nXE_GPU_REGISTER(0x40FD, kFloat, SHADER_CONSTANT_063_Y)\nXE_GPU_REGISTER(0x40FE, kFloat, SHADER_CONSTANT_063_Z)\nXE_GPU_REGISTER(0x40FF, kFloat, SHADER_CONSTANT_063_W)\nXE_GPU_REGISTER(0x4100, kFloat, SHADER_CONSTANT_064_X)\nXE_GPU_REGISTER(0x4101, kFloat, SHADER_CONSTANT_064_Y)\nXE_GPU_REGISTER(0x4102, kFloat, SHADER_CONSTANT_064_Z)\nXE_GPU_REGISTER(0x4103, kFloat, SHADER_CONSTANT_064_W)\nXE_GPU_REGISTER(0x4104, kFloat, SHADER_CONSTANT_065_X)\nXE_GPU_REGISTER(0x4105, kFloat, SHADER_CONSTANT_065_Y)\nXE_GPU_REGISTER(0x4106, kFloat, SHADER_CONSTANT_065_Z)\nXE_GPU_REGISTER(0x4107, kFloat, SHADER_CONSTANT_065_W)\nXE_GPU_REGISTER(0x4108, kFloat, SHADER_CONSTANT_066_X)\nXE_GPU_REGISTER(0x4109, kFloat, SHADER_CONSTANT_066_Y)\nXE_GPU_REGISTER(0x410A, kFloat, SHADER_CONSTANT_066_Z)\nXE_GPU_REGISTER(0x410B, kFloat, SHADER_CONSTANT_066_W)\nXE_GPU_REGISTER(0x410C, kFloat, SHADER_CONSTANT_067_X)\nXE_GPU_REGISTER(0x410D, kFloat, SHADER_CONSTANT_067_Y)\nXE_GPU_REGISTER(0x410E, kFloat, SHADER_CONSTANT_067_Z)\nXE_GPU_REGISTER(0x410F, kFloat, SHADER_CONSTANT_067_W)\nXE_GPU_REGISTER(0x4110, kFloat, SHADER_CONSTANT_068_X)\nXE_GPU_REGISTER(0x4111, kFloat, SHADER_CONSTANT_068_Y)\nXE_GPU_REGISTER(0x4112, kFloat, SHADER_CONSTANT_068_Z)\nXE_GPU_REGISTER(0x4113, kFloat, SHADER_CONSTANT_068_W)\nXE_GPU_REGISTER(0x4114, kFloat, SHADER_CONSTANT_069_X)\nXE_GPU_REGISTER(0x4115, kFloat, SHADER_CONSTANT_069_Y)\nXE_GPU_REGISTER(0x4116, kFloat, SHADER_CONSTANT_069_Z)\nXE_GPU_REGISTER(0x4117, kFloat, SHADER_CONSTANT_069_W)\nXE_GPU_REGISTER(0x4118, kFloat, SHADER_CONSTANT_070_X)\nXE_GPU_REGISTER(0x4119, kFloat, SHADER_CONSTANT_070_Y)\nXE_GPU_REGISTER(0x411A, kFloat, SHADER_CONSTANT_070_Z)\nXE_GPU_REGISTER(0x411B, kFloat, SHADER_CONSTANT_070_W)\nXE_GPU_REGISTER(0x411C, kFloat, SHADER_CONSTANT_071_X)\nXE_GPU_REGISTER(0x411D, kFloat, SHADER_CONSTANT_071_Y)\nXE_GPU_REGISTER(0x411E, kFloat, SHADER_CONSTANT_071_Z)\nXE_GPU_REGISTER(0x411F, kFloat, SHADER_CONSTANT_071_W)\nXE_GPU_REGISTER(0x4120, kFloat, SHADER_CONSTANT_072_X)\nXE_GPU_REGISTER(0x4121, kFloat, SHADER_CONSTANT_072_Y)\nXE_GPU_REGISTER(0x4122, kFloat, SHADER_CONSTANT_072_Z)\nXE_GPU_REGISTER(0x4123, kFloat, SHADER_CONSTANT_072_W)\nXE_GPU_REGISTER(0x4124, kFloat, SHADER_CONSTANT_073_X)\nXE_GPU_REGISTER(0x4125, kFloat, SHADER_CONSTANT_073_Y)\nXE_GPU_REGISTER(0x4126, kFloat, SHADER_CONSTANT_073_Z)\nXE_GPU_REGISTER(0x4127, kFloat, SHADER_CONSTANT_073_W)\nXE_GPU_REGISTER(0x4128, kFloat, SHADER_CONSTANT_074_X)\nXE_GPU_REGISTER(0x4129, kFloat, SHADER_CONSTANT_074_Y)\nXE_GPU_REGISTER(0x412A, kFloat, SHADER_CONSTANT_074_Z)\nXE_GPU_REGISTER(0x412B, kFloat, SHADER_CONSTANT_074_W)\nXE_GPU_REGISTER(0x412C, kFloat, SHADER_CONSTANT_075_X)\nXE_GPU_REGISTER(0x412D, kFloat, SHADER_CONSTANT_075_Y)\nXE_GPU_REGISTER(0x412E, kFloat, SHADER_CONSTANT_075_Z)\nXE_GPU_REGISTER(0x412F, kFloat, SHADER_CONSTANT_075_W)\nXE_GPU_REGISTER(0x4130, kFloat, SHADER_CONSTANT_076_X)\nXE_GPU_REGISTER(0x4131, kFloat, SHADER_CONSTANT_076_Y)\nXE_GPU_REGISTER(0x4132, kFloat, SHADER_CONSTANT_076_Z)\nXE_GPU_REGISTER(0x4133, kFloat, SHADER_CONSTANT_076_W)\nXE_GPU_REGISTER(0x4134, kFloat, SHADER_CONSTANT_077_X)\nXE_GPU_REGISTER(0x4135, kFloat, SHADER_CONSTANT_077_Y)\nXE_GPU_REGISTER(0x4136, kFloat, SHADER_CONSTANT_077_Z)\nXE_GPU_REGISTER(0x4137, kFloat, SHADER_CONSTANT_077_W)\nXE_GPU_REGISTER(0x4138, kFloat, SHADER_CONSTANT_078_X)\nXE_GPU_REGISTER(0x4139, kFloat, SHADER_CONSTANT_078_Y)\nXE_GPU_REGISTER(0x413A, kFloat, SHADER_CONSTANT_078_Z)\nXE_GPU_REGISTER(0x413B, kFloat, SHADER_CONSTANT_078_W)\nXE_GPU_REGISTER(0x413C, kFloat, SHADER_CONSTANT_079_X)\nXE_GPU_REGISTER(0x413D, kFloat, SHADER_CONSTANT_079_Y)\nXE_GPU_REGISTER(0x413E, kFloat, SHADER_CONSTANT_079_Z)\nXE_GPU_REGISTER(0x413F, kFloat, SHADER_CONSTANT_079_W)\nXE_GPU_REGISTER(0x4140, kFloat, SHADER_CONSTANT_080_X)\nXE_GPU_REGISTER(0x4141, kFloat, SHADER_CONSTANT_080_Y)\nXE_GPU_REGISTER(0x4142, kFloat, SHADER_CONSTANT_080_Z)\nXE_GPU_REGISTER(0x4143, kFloat, SHADER_CONSTANT_080_W)\nXE_GPU_REGISTER(0x4144, kFloat, SHADER_CONSTANT_081_X)\nXE_GPU_REGISTER(0x4145, kFloat, SHADER_CONSTANT_081_Y)\nXE_GPU_REGISTER(0x4146, kFloat, SHADER_CONSTANT_081_Z)\nXE_GPU_REGISTER(0x4147, kFloat, SHADER_CONSTANT_081_W)\nXE_GPU_REGISTER(0x4148, kFloat, SHADER_CONSTANT_082_X)\nXE_GPU_REGISTER(0x4149, kFloat, SHADER_CONSTANT_082_Y)\nXE_GPU_REGISTER(0x414A, kFloat, SHADER_CONSTANT_082_Z)\nXE_GPU_REGISTER(0x414B, kFloat, SHADER_CONSTANT_082_W)\nXE_GPU_REGISTER(0x414C, kFloat, SHADER_CONSTANT_083_X)\nXE_GPU_REGISTER(0x414D, kFloat, SHADER_CONSTANT_083_Y)\nXE_GPU_REGISTER(0x414E, kFloat, SHADER_CONSTANT_083_Z)\nXE_GPU_REGISTER(0x414F, kFloat, SHADER_CONSTANT_083_W)\nXE_GPU_REGISTER(0x4150, kFloat, SHADER_CONSTANT_084_X)\nXE_GPU_REGISTER(0x4151, kFloat, SHADER_CONSTANT_084_Y)\nXE_GPU_REGISTER(0x4152, kFloat, SHADER_CONSTANT_084_Z)\nXE_GPU_REGISTER(0x4153, kFloat, SHADER_CONSTANT_084_W)\nXE_GPU_REGISTER(0x4154, kFloat, SHADER_CONSTANT_085_X)\nXE_GPU_REGISTER(0x4155, kFloat, SHADER_CONSTANT_085_Y)\nXE_GPU_REGISTER(0x4156, kFloat, SHADER_CONSTANT_085_Z)\nXE_GPU_REGISTER(0x4157, kFloat, SHADER_CONSTANT_085_W)\nXE_GPU_REGISTER(0x4158, kFloat, SHADER_CONSTANT_086_X)\nXE_GPU_REGISTER(0x4159, kFloat, SHADER_CONSTANT_086_Y)\nXE_GPU_REGISTER(0x415A, kFloat, SHADER_CONSTANT_086_Z)\nXE_GPU_REGISTER(0x415B, kFloat, SHADER_CONSTANT_086_W)\nXE_GPU_REGISTER(0x415C, kFloat, SHADER_CONSTANT_087_X)\nXE_GPU_REGISTER(0x415D, kFloat, SHADER_CONSTANT_087_Y)\nXE_GPU_REGISTER(0x415E, kFloat, SHADER_CONSTANT_087_Z)\nXE_GPU_REGISTER(0x415F, kFloat, SHADER_CONSTANT_087_W)\nXE_GPU_REGISTER(0x4160, kFloat, SHADER_CONSTANT_088_X)\nXE_GPU_REGISTER(0x4161, kFloat, SHADER_CONSTANT_088_Y)\nXE_GPU_REGISTER(0x4162, kFloat, SHADER_CONSTANT_088_Z)\nXE_GPU_REGISTER(0x4163, kFloat, SHADER_CONSTANT_088_W)\nXE_GPU_REGISTER(0x4164, kFloat, SHADER_CONSTANT_089_X)\nXE_GPU_REGISTER(0x4165, kFloat, SHADER_CONSTANT_089_Y)\nXE_GPU_REGISTER(0x4166, kFloat, SHADER_CONSTANT_089_Z)\nXE_GPU_REGISTER(0x4167, kFloat, SHADER_CONSTANT_089_W)\nXE_GPU_REGISTER(0x4168, kFloat, SHADER_CONSTANT_090_X)\nXE_GPU_REGISTER(0x4169, kFloat, SHADER_CONSTANT_090_Y)\nXE_GPU_REGISTER(0x416A, kFloat, SHADER_CONSTANT_090_Z)\nXE_GPU_REGISTER(0x416B, kFloat, SHADER_CONSTANT_090_W)\nXE_GPU_REGISTER(0x416C, kFloat, SHADER_CONSTANT_091_X)\nXE_GPU_REGISTER(0x416D, kFloat, SHADER_CONSTANT_091_Y)\nXE_GPU_REGISTER(0x416E, kFloat, SHADER_CONSTANT_091_Z)\nXE_GPU_REGISTER(0x416F, kFloat, SHADER_CONSTANT_091_W)\nXE_GPU_REGISTER(0x4170, kFloat, SHADER_CONSTANT_092_X)\nXE_GPU_REGISTER(0x4171, kFloat, SHADER_CONSTANT_092_Y)\nXE_GPU_REGISTER(0x4172, kFloat, SHADER_CONSTANT_092_Z)\nXE_GPU_REGISTER(0x4173, kFloat, SHADER_CONSTANT_092_W)\nXE_GPU_REGISTER(0x4174, kFloat, SHADER_CONSTANT_093_X)\nXE_GPU_REGISTER(0x4175, kFloat, SHADER_CONSTANT_093_Y)\nXE_GPU_REGISTER(0x4176, kFloat, SHADER_CONSTANT_093_Z)\nXE_GPU_REGISTER(0x4177, kFloat, SHADER_CONSTANT_093_W)\nXE_GPU_REGISTER(0x4178, kFloat, SHADER_CONSTANT_094_X)\nXE_GPU_REGISTER(0x4179, kFloat, SHADER_CONSTANT_094_Y)\nXE_GPU_REGISTER(0x417A, kFloat, SHADER_CONSTANT_094_Z)\nXE_GPU_REGISTER(0x417B, kFloat, SHADER_CONSTANT_094_W)\nXE_GPU_REGISTER(0x417C, kFloat, SHADER_CONSTANT_095_X)\nXE_GPU_REGISTER(0x417D, kFloat, SHADER_CONSTANT_095_Y)\nXE_GPU_REGISTER(0x417E, kFloat, SHADER_CONSTANT_095_Z)\nXE_GPU_REGISTER(0x417F, kFloat, SHADER_CONSTANT_095_W)\nXE_GPU_REGISTER(0x4180, kFloat, SHADER_CONSTANT_096_X)\nXE_GPU_REGISTER(0x4181, kFloat, SHADER_CONSTANT_096_Y)\nXE_GPU_REGISTER(0x4182, kFloat, SHADER_CONSTANT_096_Z)\nXE_GPU_REGISTER(0x4183, kFloat, SHADER_CONSTANT_096_W)\nXE_GPU_REGISTER(0x4184, kFloat, SHADER_CONSTANT_097_X)\nXE_GPU_REGISTER(0x4185, kFloat, SHADER_CONSTANT_097_Y)\nXE_GPU_REGISTER(0x4186, kFloat, SHADER_CONSTANT_097_Z)\nXE_GPU_REGISTER(0x4187, kFloat, SHADER_CONSTANT_097_W)\nXE_GPU_REGISTER(0x4188, kFloat, SHADER_CONSTANT_098_X)\nXE_GPU_REGISTER(0x4189, kFloat, SHADER_CONSTANT_098_Y)\nXE_GPU_REGISTER(0x418A, kFloat, SHADER_CONSTANT_098_Z)\nXE_GPU_REGISTER(0x418B, kFloat, SHADER_CONSTANT_098_W)\nXE_GPU_REGISTER(0x418C, kFloat, SHADER_CONSTANT_099_X)\nXE_GPU_REGISTER(0x418D, kFloat, SHADER_CONSTANT_099_Y)\nXE_GPU_REGISTER(0x418E, kFloat, SHADER_CONSTANT_099_Z)\nXE_GPU_REGISTER(0x418F, kFloat, SHADER_CONSTANT_099_W)\nXE_GPU_REGISTER(0x4190, kFloat, SHADER_CONSTANT_100_X)\nXE_GPU_REGISTER(0x4191, kFloat, SHADER_CONSTANT_100_Y)\nXE_GPU_REGISTER(0x4192, kFloat, SHADER_CONSTANT_100_Z)\nXE_GPU_REGISTER(0x4193, kFloat, SHADER_CONSTANT_100_W)\nXE_GPU_REGISTER(0x4194, kFloat, SHADER_CONSTANT_101_X)\nXE_GPU_REGISTER(0x4195, kFloat, SHADER_CONSTANT_101_Y)\nXE_GPU_REGISTER(0x4196, kFloat, SHADER_CONSTANT_101_Z)\nXE_GPU_REGISTER(0x4197, kFloat, SHADER_CONSTANT_101_W)\nXE_GPU_REGISTER(0x4198, kFloat, SHADER_CONSTANT_102_X)\nXE_GPU_REGISTER(0x4199, kFloat, SHADER_CONSTANT_102_Y)\nXE_GPU_REGISTER(0x419A, kFloat, SHADER_CONSTANT_102_Z)\nXE_GPU_REGISTER(0x419B, kFloat, SHADER_CONSTANT_102_W)\nXE_GPU_REGISTER(0x419C, kFloat, SHADER_CONSTANT_103_X)\nXE_GPU_REGISTER(0x419D, kFloat, SHADER_CONSTANT_103_Y)\nXE_GPU_REGISTER(0x419E, kFloat, SHADER_CONSTANT_103_Z)\nXE_GPU_REGISTER(0x419F, kFloat, SHADER_CONSTANT_103_W)\nXE_GPU_REGISTER(0x41A0, kFloat, SHADER_CONSTANT_104_X)\nXE_GPU_REGISTER(0x41A1, kFloat, SHADER_CONSTANT_104_Y)\nXE_GPU_REGISTER(0x41A2, kFloat, SHADER_CONSTANT_104_Z)\nXE_GPU_REGISTER(0x41A3, kFloat, SHADER_CONSTANT_104_W)\nXE_GPU_REGISTER(0x41A4, kFloat, SHADER_CONSTANT_105_X)\nXE_GPU_REGISTER(0x41A5, kFloat, SHADER_CONSTANT_105_Y)\nXE_GPU_REGISTER(0x41A6, kFloat, SHADER_CONSTANT_105_Z)\nXE_GPU_REGISTER(0x41A7, kFloat, SHADER_CONSTANT_105_W)\nXE_GPU_REGISTER(0x41A8, kFloat, SHADER_CONSTANT_106_X)\nXE_GPU_REGISTER(0x41A9, kFloat, SHADER_CONSTANT_106_Y)\nXE_GPU_REGISTER(0x41AA, kFloat, SHADER_CONSTANT_106_Z)\nXE_GPU_REGISTER(0x41AB, kFloat, SHADER_CONSTANT_106_W)\nXE_GPU_REGISTER(0x41AC, kFloat, SHADER_CONSTANT_107_X)\nXE_GPU_REGISTER(0x41AD, kFloat, SHADER_CONSTANT_107_Y)\nXE_GPU_REGISTER(0x41AE, kFloat, SHADER_CONSTANT_107_Z)\nXE_GPU_REGISTER(0x41AF, kFloat, SHADER_CONSTANT_107_W)\nXE_GPU_REGISTER(0x41B0, kFloat, SHADER_CONSTANT_108_X)\nXE_GPU_REGISTER(0x41B1, kFloat, SHADER_CONSTANT_108_Y)\nXE_GPU_REGISTER(0x41B2, kFloat, SHADER_CONSTANT_108_Z)\nXE_GPU_REGISTER(0x41B3, kFloat, SHADER_CONSTANT_108_W)\nXE_GPU_REGISTER(0x41B4, kFloat, SHADER_CONSTANT_109_X)\nXE_GPU_REGISTER(0x41B5, kFloat, SHADER_CONSTANT_109_Y)\nXE_GPU_REGISTER(0x41B6, kFloat, SHADER_CONSTANT_109_Z)\nXE_GPU_REGISTER(0x41B7, kFloat, SHADER_CONSTANT_109_W)\nXE_GPU_REGISTER(0x41B8, kFloat, SHADER_CONSTANT_110_X)\nXE_GPU_REGISTER(0x41B9, kFloat, SHADER_CONSTANT_110_Y)\nXE_GPU_REGISTER(0x41BA, kFloat, SHADER_CONSTANT_110_Z)\nXE_GPU_REGISTER(0x41BB, kFloat, SHADER_CONSTANT_110_W)\nXE_GPU_REGISTER(0x41BC, kFloat, SHADER_CONSTANT_111_X)\nXE_GPU_REGISTER(0x41BD, kFloat, SHADER_CONSTANT_111_Y)\nXE_GPU_REGISTER(0x41BE, kFloat, SHADER_CONSTANT_111_Z)\nXE_GPU_REGISTER(0x41BF, kFloat, SHADER_CONSTANT_111_W)\nXE_GPU_REGISTER(0x41C0, kFloat, SHADER_CONSTANT_112_X)\nXE_GPU_REGISTER(0x41C1, kFloat, SHADER_CONSTANT_112_Y)\nXE_GPU_REGISTER(0x41C2, kFloat, SHADER_CONSTANT_112_Z)\nXE_GPU_REGISTER(0x41C3, kFloat, SHADER_CONSTANT_112_W)\nXE_GPU_REGISTER(0x41C4, kFloat, SHADER_CONSTANT_113_X)\nXE_GPU_REGISTER(0x41C5, kFloat, SHADER_CONSTANT_113_Y)\nXE_GPU_REGISTER(0x41C6, kFloat, SHADER_CONSTANT_113_Z)\nXE_GPU_REGISTER(0x41C7, kFloat, SHADER_CONSTANT_113_W)\nXE_GPU_REGISTER(0x41C8, kFloat, SHADER_CONSTANT_114_X)\nXE_GPU_REGISTER(0x41C9, kFloat, SHADER_CONSTANT_114_Y)\nXE_GPU_REGISTER(0x41CA, kFloat, SHADER_CONSTANT_114_Z)\nXE_GPU_REGISTER(0x41CB, kFloat, SHADER_CONSTANT_114_W)\nXE_GPU_REGISTER(0x41CC, kFloat, SHADER_CONSTANT_115_X)\nXE_GPU_REGISTER(0x41CD, kFloat, SHADER_CONSTANT_115_Y)\nXE_GPU_REGISTER(0x41CE, kFloat, SHADER_CONSTANT_115_Z)\nXE_GPU_REGISTER(0x41CF, kFloat, SHADER_CONSTANT_115_W)\nXE_GPU_REGISTER(0x41D0, kFloat, SHADER_CONSTANT_116_X)\nXE_GPU_REGISTER(0x41D1, kFloat, SHADER_CONSTANT_116_Y)\nXE_GPU_REGISTER(0x41D2, kFloat, SHADER_CONSTANT_116_Z)\nXE_GPU_REGISTER(0x41D3, kFloat, SHADER_CONSTANT_116_W)\nXE_GPU_REGISTER(0x41D4, kFloat, SHADER_CONSTANT_117_X)\nXE_GPU_REGISTER(0x41D5, kFloat, SHADER_CONSTANT_117_Y)\nXE_GPU_REGISTER(0x41D6, kFloat, SHADER_CONSTANT_117_Z)\nXE_GPU_REGISTER(0x41D7, kFloat, SHADER_CONSTANT_117_W)\nXE_GPU_REGISTER(0x41D8, kFloat, SHADER_CONSTANT_118_X)\nXE_GPU_REGISTER(0x41D9, kFloat, SHADER_CONSTANT_118_Y)\nXE_GPU_REGISTER(0x41DA, kFloat, SHADER_CONSTANT_118_Z)\nXE_GPU_REGISTER(0x41DB, kFloat, SHADER_CONSTANT_118_W)\nXE_GPU_REGISTER(0x41DC, kFloat, SHADER_CONSTANT_119_X)\nXE_GPU_REGISTER(0x41DD, kFloat, SHADER_CONSTANT_119_Y)\nXE_GPU_REGISTER(0x41DE, kFloat, SHADER_CONSTANT_119_Z)\nXE_GPU_REGISTER(0x41DF, kFloat, SHADER_CONSTANT_119_W)\nXE_GPU_REGISTER(0x41E0, kFloat, SHADER_CONSTANT_120_X)\nXE_GPU_REGISTER(0x41E1, kFloat, SHADER_CONSTANT_120_Y)\nXE_GPU_REGISTER(0x41E2, kFloat, SHADER_CONSTANT_120_Z)\nXE_GPU_REGISTER(0x41E3, kFloat, SHADER_CONSTANT_120_W)\nXE_GPU_REGISTER(0x41E4, kFloat, SHADER_CONSTANT_121_X)\nXE_GPU_REGISTER(0x41E5, kFloat, SHADER_CONSTANT_121_Y)\nXE_GPU_REGISTER(0x41E6, kFloat, SHADER_CONSTANT_121_Z)\nXE_GPU_REGISTER(0x41E7, kFloat, SHADER_CONSTANT_121_W)\nXE_GPU_REGISTER(0x41E8, kFloat, SHADER_CONSTANT_122_X)\nXE_GPU_REGISTER(0x41E9, kFloat, SHADER_CONSTANT_122_Y)\nXE_GPU_REGISTER(0x41EA, kFloat, SHADER_CONSTANT_122_Z)\nXE_GPU_REGISTER(0x41EB, kFloat, SHADER_CONSTANT_122_W)\nXE_GPU_REGISTER(0x41EC, kFloat, SHADER_CONSTANT_123_X)\nXE_GPU_REGISTER(0x41ED, kFloat, SHADER_CONSTANT_123_Y)\nXE_GPU_REGISTER(0x41EE, kFloat, SHADER_CONSTANT_123_Z)\nXE_GPU_REGISTER(0x41EF, kFloat, SHADER_CONSTANT_123_W)\nXE_GPU_REGISTER(0x41F0, kFloat, SHADER_CONSTANT_124_X)\nXE_GPU_REGISTER(0x41F1, kFloat, SHADER_CONSTANT_124_Y)\nXE_GPU_REGISTER(0x41F2, kFloat, SHADER_CONSTANT_124_Z)\nXE_GPU_REGISTER(0x41F3, kFloat, SHADER_CONSTANT_124_W)\nXE_GPU_REGISTER(0x41F4, kFloat, SHADER_CONSTANT_125_X)\nXE_GPU_REGISTER(0x41F5, kFloat, SHADER_CONSTANT_125_Y)\nXE_GPU_REGISTER(0x41F6, kFloat, SHADER_CONSTANT_125_Z)\nXE_GPU_REGISTER(0x41F7, kFloat, SHADER_CONSTANT_125_W)\nXE_GPU_REGISTER(0x41F8, kFloat, SHADER_CONSTANT_126_X)\nXE_GPU_REGISTER(0x41F9, kFloat, SHADER_CONSTANT_126_Y)\nXE_GPU_REGISTER(0x41FA, kFloat, SHADER_CONSTANT_126_Z)\nXE_GPU_REGISTER(0x41FB, kFloat, SHADER_CONSTANT_126_W)\nXE_GPU_REGISTER(0x41FC, kFloat, SHADER_CONSTANT_127_X)\nXE_GPU_REGISTER(0x41FD, kFloat, SHADER_CONSTANT_127_Y)\nXE_GPU_REGISTER(0x41FE, kFloat, SHADER_CONSTANT_127_Z)\nXE_GPU_REGISTER(0x41FF, kFloat, SHADER_CONSTANT_127_W)\nXE_GPU_REGISTER(0x4200, kFloat, SHADER_CONSTANT_128_X)\nXE_GPU_REGISTER(0x4201, kFloat, SHADER_CONSTANT_128_Y)\nXE_GPU_REGISTER(0x4202, kFloat, SHADER_CONSTANT_128_Z)\nXE_GPU_REGISTER(0x4203, kFloat, SHADER_CONSTANT_128_W)\nXE_GPU_REGISTER(0x4204, kFloat, SHADER_CONSTANT_129_X)\nXE_GPU_REGISTER(0x4205, kFloat, SHADER_CONSTANT_129_Y)\nXE_GPU_REGISTER(0x4206, kFloat, SHADER_CONSTANT_129_Z)\nXE_GPU_REGISTER(0x4207, kFloat, SHADER_CONSTANT_129_W)\nXE_GPU_REGISTER(0x4208, kFloat, SHADER_CONSTANT_130_X)\nXE_GPU_REGISTER(0x4209, kFloat, SHADER_CONSTANT_130_Y)\nXE_GPU_REGISTER(0x420A, kFloat, SHADER_CONSTANT_130_Z)\nXE_GPU_REGISTER(0x420B, kFloat, SHADER_CONSTANT_130_W)\nXE_GPU_REGISTER(0x420C, kFloat, SHADER_CONSTANT_131_X)\nXE_GPU_REGISTER(0x420D, kFloat, SHADER_CONSTANT_131_Y)\nXE_GPU_REGISTER(0x420E, kFloat, SHADER_CONSTANT_131_Z)\nXE_GPU_REGISTER(0x420F, kFloat, SHADER_CONSTANT_131_W)\nXE_GPU_REGISTER(0x4210, kFloat, SHADER_CONSTANT_132_X)\nXE_GPU_REGISTER(0x4211, kFloat, SHADER_CONSTANT_132_Y)\nXE_GPU_REGISTER(0x4212, kFloat, SHADER_CONSTANT_132_Z)\nXE_GPU_REGISTER(0x4213, kFloat, SHADER_CONSTANT_132_W)\nXE_GPU_REGISTER(0x4214, kFloat, SHADER_CONSTANT_133_X)\nXE_GPU_REGISTER(0x4215, kFloat, SHADER_CONSTANT_133_Y)\nXE_GPU_REGISTER(0x4216, kFloat, SHADER_CONSTANT_133_Z)\nXE_GPU_REGISTER(0x4217, kFloat, SHADER_CONSTANT_133_W)\nXE_GPU_REGISTER(0x4218, kFloat, SHADER_CONSTANT_134_X)\nXE_GPU_REGISTER(0x4219, kFloat, SHADER_CONSTANT_134_Y)\nXE_GPU_REGISTER(0x421A, kFloat, SHADER_CONSTANT_134_Z)\nXE_GPU_REGISTER(0x421B, kFloat, SHADER_CONSTANT_134_W)\nXE_GPU_REGISTER(0x421C, kFloat, SHADER_CONSTANT_135_X)\nXE_GPU_REGISTER(0x421D, kFloat, SHADER_CONSTANT_135_Y)\nXE_GPU_REGISTER(0x421E, kFloat, SHADER_CONSTANT_135_Z)\nXE_GPU_REGISTER(0x421F, kFloat, SHADER_CONSTANT_135_W)\nXE_GPU_REGISTER(0x4220, kFloat, SHADER_CONSTANT_136_X)\nXE_GPU_REGISTER(0x4221, kFloat, SHADER_CONSTANT_136_Y)\nXE_GPU_REGISTER(0x4222, kFloat, SHADER_CONSTANT_136_Z)\nXE_GPU_REGISTER(0x4223, kFloat, SHADER_CONSTANT_136_W)\nXE_GPU_REGISTER(0x4224, kFloat, SHADER_CONSTANT_137_X)\nXE_GPU_REGISTER(0x4225, kFloat, SHADER_CONSTANT_137_Y)\nXE_GPU_REGISTER(0x4226, kFloat, SHADER_CONSTANT_137_Z)\nXE_GPU_REGISTER(0x4227, kFloat, SHADER_CONSTANT_137_W)\nXE_GPU_REGISTER(0x4228, kFloat, SHADER_CONSTANT_138_X)\nXE_GPU_REGISTER(0x4229, kFloat, SHADER_CONSTANT_138_Y)\nXE_GPU_REGISTER(0x422A, kFloat, SHADER_CONSTANT_138_Z)\nXE_GPU_REGISTER(0x422B, kFloat, SHADER_CONSTANT_138_W)\nXE_GPU_REGISTER(0x422C, kFloat, SHADER_CONSTANT_139_X)\nXE_GPU_REGISTER(0x422D, kFloat, SHADER_CONSTANT_139_Y)\nXE_GPU_REGISTER(0x422E, kFloat, SHADER_CONSTANT_139_Z)\nXE_GPU_REGISTER(0x422F, kFloat, SHADER_CONSTANT_139_W)\nXE_GPU_REGISTER(0x4230, kFloat, SHADER_CONSTANT_140_X)\nXE_GPU_REGISTER(0x4231, kFloat, SHADER_CONSTANT_140_Y)\nXE_GPU_REGISTER(0x4232, kFloat, SHADER_CONSTANT_140_Z)\nXE_GPU_REGISTER(0x4233, kFloat, SHADER_CONSTANT_140_W)\nXE_GPU_REGISTER(0x4234, kFloat, SHADER_CONSTANT_141_X)\nXE_GPU_REGISTER(0x4235, kFloat, SHADER_CONSTANT_141_Y)\nXE_GPU_REGISTER(0x4236, kFloat, SHADER_CONSTANT_141_Z)\nXE_GPU_REGISTER(0x4237, kFloat, SHADER_CONSTANT_141_W)\nXE_GPU_REGISTER(0x4238, kFloat, SHADER_CONSTANT_142_X)\nXE_GPU_REGISTER(0x4239, kFloat, SHADER_CONSTANT_142_Y)\nXE_GPU_REGISTER(0x423A, kFloat, SHADER_CONSTANT_142_Z)\nXE_GPU_REGISTER(0x423B, kFloat, SHADER_CONSTANT_142_W)\nXE_GPU_REGISTER(0x423C, kFloat, SHADER_CONSTANT_143_X)\nXE_GPU_REGISTER(0x423D, kFloat, SHADER_CONSTANT_143_Y)\nXE_GPU_REGISTER(0x423E, kFloat, SHADER_CONSTANT_143_Z)\nXE_GPU_REGISTER(0x423F, kFloat, SHADER_CONSTANT_143_W)\nXE_GPU_REGISTER(0x4240, kFloat, SHADER_CONSTANT_144_X)\nXE_GPU_REGISTER(0x4241, kFloat, SHADER_CONSTANT_144_Y)\nXE_GPU_REGISTER(0x4242, kFloat, SHADER_CONSTANT_144_Z)\nXE_GPU_REGISTER(0x4243, kFloat, SHADER_CONSTANT_144_W)\nXE_GPU_REGISTER(0x4244, kFloat, SHADER_CONSTANT_145_X)\nXE_GPU_REGISTER(0x4245, kFloat, SHADER_CONSTANT_145_Y)\nXE_GPU_REGISTER(0x4246, kFloat, SHADER_CONSTANT_145_Z)\nXE_GPU_REGISTER(0x4247, kFloat, SHADER_CONSTANT_145_W)\nXE_GPU_REGISTER(0x4248, kFloat, SHADER_CONSTANT_146_X)\nXE_GPU_REGISTER(0x4249, kFloat, SHADER_CONSTANT_146_Y)\nXE_GPU_REGISTER(0x424A, kFloat, SHADER_CONSTANT_146_Z)\nXE_GPU_REGISTER(0x424B, kFloat, SHADER_CONSTANT_146_W)\nXE_GPU_REGISTER(0x424C, kFloat, SHADER_CONSTANT_147_X)\nXE_GPU_REGISTER(0x424D, kFloat, SHADER_CONSTANT_147_Y)\nXE_GPU_REGISTER(0x424E, kFloat, SHADER_CONSTANT_147_Z)\nXE_GPU_REGISTER(0x424F, kFloat, SHADER_CONSTANT_147_W)\nXE_GPU_REGISTER(0x4250, kFloat, SHADER_CONSTANT_148_X)\nXE_GPU_REGISTER(0x4251, kFloat, SHADER_CONSTANT_148_Y)\nXE_GPU_REGISTER(0x4252, kFloat, SHADER_CONSTANT_148_Z)\nXE_GPU_REGISTER(0x4253, kFloat, SHADER_CONSTANT_148_W)\nXE_GPU_REGISTER(0x4254, kFloat, SHADER_CONSTANT_149_X)\nXE_GPU_REGISTER(0x4255, kFloat, SHADER_CONSTANT_149_Y)\nXE_GPU_REGISTER(0x4256, kFloat, SHADER_CONSTANT_149_Z)\nXE_GPU_REGISTER(0x4257, kFloat, SHADER_CONSTANT_149_W)\nXE_GPU_REGISTER(0x4258, kFloat, SHADER_CONSTANT_150_X)\nXE_GPU_REGISTER(0x4259, kFloat, SHADER_CONSTANT_150_Y)\nXE_GPU_REGISTER(0x425A, kFloat, SHADER_CONSTANT_150_Z)\nXE_GPU_REGISTER(0x425B, kFloat, SHADER_CONSTANT_150_W)\nXE_GPU_REGISTER(0x425C, kFloat, SHADER_CONSTANT_151_X)\nXE_GPU_REGISTER(0x425D, kFloat, SHADER_CONSTANT_151_Y)\nXE_GPU_REGISTER(0x425E, kFloat, SHADER_CONSTANT_151_Z)\nXE_GPU_REGISTER(0x425F, kFloat, SHADER_CONSTANT_151_W)\nXE_GPU_REGISTER(0x4260, kFloat, SHADER_CONSTANT_152_X)\nXE_GPU_REGISTER(0x4261, kFloat, SHADER_CONSTANT_152_Y)\nXE_GPU_REGISTER(0x4262, kFloat, SHADER_CONSTANT_152_Z)\nXE_GPU_REGISTER(0x4263, kFloat, SHADER_CONSTANT_152_W)\nXE_GPU_REGISTER(0x4264, kFloat, SHADER_CONSTANT_153_X)\nXE_GPU_REGISTER(0x4265, kFloat, SHADER_CONSTANT_153_Y)\nXE_GPU_REGISTER(0x4266, kFloat, SHADER_CONSTANT_153_Z)\nXE_GPU_REGISTER(0x4267, kFloat, SHADER_CONSTANT_153_W)\nXE_GPU_REGISTER(0x4268, kFloat, SHADER_CONSTANT_154_X)\nXE_GPU_REGISTER(0x4269, kFloat, SHADER_CONSTANT_154_Y)\nXE_GPU_REGISTER(0x426A, kFloat, SHADER_CONSTANT_154_Z)\nXE_GPU_REGISTER(0x426B, kFloat, SHADER_CONSTANT_154_W)\nXE_GPU_REGISTER(0x426C, kFloat, SHADER_CONSTANT_155_X)\nXE_GPU_REGISTER(0x426D, kFloat, SHADER_CONSTANT_155_Y)\nXE_GPU_REGISTER(0x426E, kFloat, SHADER_CONSTANT_155_Z)\nXE_GPU_REGISTER(0x426F, kFloat, SHADER_CONSTANT_155_W)\nXE_GPU_REGISTER(0x4270, kFloat, SHADER_CONSTANT_156_X)\nXE_GPU_REGISTER(0x4271, kFloat, SHADER_CONSTANT_156_Y)\nXE_GPU_REGISTER(0x4272, kFloat, SHADER_CONSTANT_156_Z)\nXE_GPU_REGISTER(0x4273, kFloat, SHADER_CONSTANT_156_W)\nXE_GPU_REGISTER(0x4274, kFloat, SHADER_CONSTANT_157_X)\nXE_GPU_REGISTER(0x4275, kFloat, SHADER_CONSTANT_157_Y)\nXE_GPU_REGISTER(0x4276, kFloat, SHADER_CONSTANT_157_Z)\nXE_GPU_REGISTER(0x4277, kFloat, SHADER_CONSTANT_157_W)\nXE_GPU_REGISTER(0x4278, kFloat, SHADER_CONSTANT_158_X)\nXE_GPU_REGISTER(0x4279, kFloat, SHADER_CONSTANT_158_Y)\nXE_GPU_REGISTER(0x427A, kFloat, SHADER_CONSTANT_158_Z)\nXE_GPU_REGISTER(0x427B, kFloat, SHADER_CONSTANT_158_W)\nXE_GPU_REGISTER(0x427C, kFloat, SHADER_CONSTANT_159_X)\nXE_GPU_REGISTER(0x427D, kFloat, SHADER_CONSTANT_159_Y)\nXE_GPU_REGISTER(0x427E, kFloat, SHADER_CONSTANT_159_Z)\nXE_GPU_REGISTER(0x427F, kFloat, SHADER_CONSTANT_159_W)\nXE_GPU_REGISTER(0x4280, kFloat, SHADER_CONSTANT_160_X)\nXE_GPU_REGISTER(0x4281, kFloat, SHADER_CONSTANT_160_Y)\nXE_GPU_REGISTER(0x4282, kFloat, SHADER_CONSTANT_160_Z)\nXE_GPU_REGISTER(0x4283, kFloat, SHADER_CONSTANT_160_W)\nXE_GPU_REGISTER(0x4284, kFloat, SHADER_CONSTANT_161_X)\nXE_GPU_REGISTER(0x4285, kFloat, SHADER_CONSTANT_161_Y)\nXE_GPU_REGISTER(0x4286, kFloat, SHADER_CONSTANT_161_Z)\nXE_GPU_REGISTER(0x4287, kFloat, SHADER_CONSTANT_161_W)\nXE_GPU_REGISTER(0x4288, kFloat, SHADER_CONSTANT_162_X)\nXE_GPU_REGISTER(0x4289, kFloat, SHADER_CONSTANT_162_Y)\nXE_GPU_REGISTER(0x428A, kFloat, SHADER_CONSTANT_162_Z)\nXE_GPU_REGISTER(0x428B, kFloat, SHADER_CONSTANT_162_W)\nXE_GPU_REGISTER(0x428C, kFloat, SHADER_CONSTANT_163_X)\nXE_GPU_REGISTER(0x428D, kFloat, SHADER_CONSTANT_163_Y)\nXE_GPU_REGISTER(0x428E, kFloat, SHADER_CONSTANT_163_Z)\nXE_GPU_REGISTER(0x428F, kFloat, SHADER_CONSTANT_163_W)\nXE_GPU_REGISTER(0x4290, kFloat, SHADER_CONSTANT_164_X)\nXE_GPU_REGISTER(0x4291, kFloat, SHADER_CONSTANT_164_Y)\nXE_GPU_REGISTER(0x4292, kFloat, SHADER_CONSTANT_164_Z)\nXE_GPU_REGISTER(0x4293, kFloat, SHADER_CONSTANT_164_W)\nXE_GPU_REGISTER(0x4294, kFloat, SHADER_CONSTANT_165_X)\nXE_GPU_REGISTER(0x4295, kFloat, SHADER_CONSTANT_165_Y)\nXE_GPU_REGISTER(0x4296, kFloat, SHADER_CONSTANT_165_Z)\nXE_GPU_REGISTER(0x4297, kFloat, SHADER_CONSTANT_165_W)\nXE_GPU_REGISTER(0x4298, kFloat, SHADER_CONSTANT_166_X)\nXE_GPU_REGISTER(0x4299, kFloat, SHADER_CONSTANT_166_Y)\nXE_GPU_REGISTER(0x429A, kFloat, SHADER_CONSTANT_166_Z)\nXE_GPU_REGISTER(0x429B, kFloat, SHADER_CONSTANT_166_W)\nXE_GPU_REGISTER(0x429C, kFloat, SHADER_CONSTANT_167_X)\nXE_GPU_REGISTER(0x429D, kFloat, SHADER_CONSTANT_167_Y)\nXE_GPU_REGISTER(0x429E, kFloat, SHADER_CONSTANT_167_Z)\nXE_GPU_REGISTER(0x429F, kFloat, SHADER_CONSTANT_167_W)\nXE_GPU_REGISTER(0x42A0, kFloat, SHADER_CONSTANT_168_X)\nXE_GPU_REGISTER(0x42A1, kFloat, SHADER_CONSTANT_168_Y)\nXE_GPU_REGISTER(0x42A2, kFloat, SHADER_CONSTANT_168_Z)\nXE_GPU_REGISTER(0x42A3, kFloat, SHADER_CONSTANT_168_W)\nXE_GPU_REGISTER(0x42A4, kFloat, SHADER_CONSTANT_169_X)\nXE_GPU_REGISTER(0x42A5, kFloat, SHADER_CONSTANT_169_Y)\nXE_GPU_REGISTER(0x42A6, kFloat, SHADER_CONSTANT_169_Z)\nXE_GPU_REGISTER(0x42A7, kFloat, SHADER_CONSTANT_169_W)\nXE_GPU_REGISTER(0x42A8, kFloat, SHADER_CONSTANT_170_X)\nXE_GPU_REGISTER(0x42A9, kFloat, SHADER_CONSTANT_170_Y)\nXE_GPU_REGISTER(0x42AA, kFloat, SHADER_CONSTANT_170_Z)\nXE_GPU_REGISTER(0x42AB, kFloat, SHADER_CONSTANT_170_W)\nXE_GPU_REGISTER(0x42AC, kFloat, SHADER_CONSTANT_171_X)\nXE_GPU_REGISTER(0x42AD, kFloat, SHADER_CONSTANT_171_Y)\nXE_GPU_REGISTER(0x42AE, kFloat, SHADER_CONSTANT_171_Z)\nXE_GPU_REGISTER(0x42AF, kFloat, SHADER_CONSTANT_171_W)\nXE_GPU_REGISTER(0x42B0, kFloat, SHADER_CONSTANT_172_X)\nXE_GPU_REGISTER(0x42B1, kFloat, SHADER_CONSTANT_172_Y)\nXE_GPU_REGISTER(0x42B2, kFloat, SHADER_CONSTANT_172_Z)\nXE_GPU_REGISTER(0x42B3, kFloat, SHADER_CONSTANT_172_W)\nXE_GPU_REGISTER(0x42B4, kFloat, SHADER_CONSTANT_173_X)\nXE_GPU_REGISTER(0x42B5, kFloat, SHADER_CONSTANT_173_Y)\nXE_GPU_REGISTER(0x42B6, kFloat, SHADER_CONSTANT_173_Z)\nXE_GPU_REGISTER(0x42B7, kFloat, SHADER_CONSTANT_173_W)\nXE_GPU_REGISTER(0x42B8, kFloat, SHADER_CONSTANT_174_X)\nXE_GPU_REGISTER(0x42B9, kFloat, SHADER_CONSTANT_174_Y)\nXE_GPU_REGISTER(0x42BA, kFloat, SHADER_CONSTANT_174_Z)\nXE_GPU_REGISTER(0x42BB, kFloat, SHADER_CONSTANT_174_W)\nXE_GPU_REGISTER(0x42BC, kFloat, SHADER_CONSTANT_175_X)\nXE_GPU_REGISTER(0x42BD, kFloat, SHADER_CONSTANT_175_Y)\nXE_GPU_REGISTER(0x42BE, kFloat, SHADER_CONSTANT_175_Z)\nXE_GPU_REGISTER(0x42BF, kFloat, SHADER_CONSTANT_175_W)\nXE_GPU_REGISTER(0x42C0, kFloat, SHADER_CONSTANT_176_X)\nXE_GPU_REGISTER(0x42C1, kFloat, SHADER_CONSTANT_176_Y)\nXE_GPU_REGISTER(0x42C2, kFloat, SHADER_CONSTANT_176_Z)\nXE_GPU_REGISTER(0x42C3, kFloat, SHADER_CONSTANT_176_W)\nXE_GPU_REGISTER(0x42C4, kFloat, SHADER_CONSTANT_177_X)\nXE_GPU_REGISTER(0x42C5, kFloat, SHADER_CONSTANT_177_Y)\nXE_GPU_REGISTER(0x42C6, kFloat, SHADER_CONSTANT_177_Z)\nXE_GPU_REGISTER(0x42C7, kFloat, SHADER_CONSTANT_177_W)\nXE_GPU_REGISTER(0x42C8, kFloat, SHADER_CONSTANT_178_X)\nXE_GPU_REGISTER(0x42C9, kFloat, SHADER_CONSTANT_178_Y)\nXE_GPU_REGISTER(0x42CA, kFloat, SHADER_CONSTANT_178_Z)\nXE_GPU_REGISTER(0x42CB, kFloat, SHADER_CONSTANT_178_W)\nXE_GPU_REGISTER(0x42CC, kFloat, SHADER_CONSTANT_179_X)\nXE_GPU_REGISTER(0x42CD, kFloat, SHADER_CONSTANT_179_Y)\nXE_GPU_REGISTER(0x42CE, kFloat, SHADER_CONSTANT_179_Z)\nXE_GPU_REGISTER(0x42CF, kFloat, SHADER_CONSTANT_179_W)\nXE_GPU_REGISTER(0x42D0, kFloat, SHADER_CONSTANT_180_X)\nXE_GPU_REGISTER(0x42D1, kFloat, SHADER_CONSTANT_180_Y)\nXE_GPU_REGISTER(0x42D2, kFloat, SHADER_CONSTANT_180_Z)\nXE_GPU_REGISTER(0x42D3, kFloat, SHADER_CONSTANT_180_W)\nXE_GPU_REGISTER(0x42D4, kFloat, SHADER_CONSTANT_181_X)\nXE_GPU_REGISTER(0x42D5, kFloat, SHADER_CONSTANT_181_Y)\nXE_GPU_REGISTER(0x42D6, kFloat, SHADER_CONSTANT_181_Z)\nXE_GPU_REGISTER(0x42D7, kFloat, SHADER_CONSTANT_181_W)\nXE_GPU_REGISTER(0x42D8, kFloat, SHADER_CONSTANT_182_X)\nXE_GPU_REGISTER(0x42D9, kFloat, SHADER_CONSTANT_182_Y)\nXE_GPU_REGISTER(0x42DA, kFloat, SHADER_CONSTANT_182_Z)\nXE_GPU_REGISTER(0x42DB, kFloat, SHADER_CONSTANT_182_W)\nXE_GPU_REGISTER(0x42DC, kFloat, SHADER_CONSTANT_183_X)\nXE_GPU_REGISTER(0x42DD, kFloat, SHADER_CONSTANT_183_Y)\nXE_GPU_REGISTER(0x42DE, kFloat, SHADER_CONSTANT_183_Z)\nXE_GPU_REGISTER(0x42DF, kFloat, SHADER_CONSTANT_183_W)\nXE_GPU_REGISTER(0x42E0, kFloat, SHADER_CONSTANT_184_X)\nXE_GPU_REGISTER(0x42E1, kFloat, SHADER_CONSTANT_184_Y)\nXE_GPU_REGISTER(0x42E2, kFloat, SHADER_CONSTANT_184_Z)\nXE_GPU_REGISTER(0x42E3, kFloat, SHADER_CONSTANT_184_W)\nXE_GPU_REGISTER(0x42E4, kFloat, SHADER_CONSTANT_185_X)\nXE_GPU_REGISTER(0x42E5, kFloat, SHADER_CONSTANT_185_Y)\nXE_GPU_REGISTER(0x42E6, kFloat, SHADER_CONSTANT_185_Z)\nXE_GPU_REGISTER(0x42E7, kFloat, SHADER_CONSTANT_185_W)\nXE_GPU_REGISTER(0x42E8, kFloat, SHADER_CONSTANT_186_X)\nXE_GPU_REGISTER(0x42E9, kFloat, SHADER_CONSTANT_186_Y)\nXE_GPU_REGISTER(0x42EA, kFloat, SHADER_CONSTANT_186_Z)\nXE_GPU_REGISTER(0x42EB, kFloat, SHADER_CONSTANT_186_W)\nXE_GPU_REGISTER(0x42EC, kFloat, SHADER_CONSTANT_187_X)\nXE_GPU_REGISTER(0x42ED, kFloat, SHADER_CONSTANT_187_Y)\nXE_GPU_REGISTER(0x42EE, kFloat, SHADER_CONSTANT_187_Z)\nXE_GPU_REGISTER(0x42EF, kFloat, SHADER_CONSTANT_187_W)\nXE_GPU_REGISTER(0x42F0, kFloat, SHADER_CONSTANT_188_X)\nXE_GPU_REGISTER(0x42F1, kFloat, SHADER_CONSTANT_188_Y)\nXE_GPU_REGISTER(0x42F2, kFloat, SHADER_CONSTANT_188_Z)\nXE_GPU_REGISTER(0x42F3, kFloat, SHADER_CONSTANT_188_W)\nXE_GPU_REGISTER(0x42F4, kFloat, SHADER_CONSTANT_189_X)\nXE_GPU_REGISTER(0x42F5, kFloat, SHADER_CONSTANT_189_Y)\nXE_GPU_REGISTER(0x42F6, kFloat, SHADER_CONSTANT_189_Z)\nXE_GPU_REGISTER(0x42F7, kFloat, SHADER_CONSTANT_189_W)\nXE_GPU_REGISTER(0x42F8, kFloat, SHADER_CONSTANT_190_X)\nXE_GPU_REGISTER(0x42F9, kFloat, SHADER_CONSTANT_190_Y)\nXE_GPU_REGISTER(0x42FA, kFloat, SHADER_CONSTANT_190_Z)\nXE_GPU_REGISTER(0x42FB, kFloat, SHADER_CONSTANT_190_W)\nXE_GPU_REGISTER(0x42FC, kFloat, SHADER_CONSTANT_191_X)\nXE_GPU_REGISTER(0x42FD, kFloat, SHADER_CONSTANT_191_Y)\nXE_GPU_REGISTER(0x42FE, kFloat, SHADER_CONSTANT_191_Z)\nXE_GPU_REGISTER(0x42FF, kFloat, SHADER_CONSTANT_191_W)\nXE_GPU_REGISTER(0x4300, kFloat, SHADER_CONSTANT_192_X)\nXE_GPU_REGISTER(0x4301, kFloat, SHADER_CONSTANT_192_Y)\nXE_GPU_REGISTER(0x4302, kFloat, SHADER_CONSTANT_192_Z)\nXE_GPU_REGISTER(0x4303, kFloat, SHADER_CONSTANT_192_W)\nXE_GPU_REGISTER(0x4304, kFloat, SHADER_CONSTANT_193_X)\nXE_GPU_REGISTER(0x4305, kFloat, SHADER_CONSTANT_193_Y)\nXE_GPU_REGISTER(0x4306, kFloat, SHADER_CONSTANT_193_Z)\nXE_GPU_REGISTER(0x4307, kFloat, SHADER_CONSTANT_193_W)\nXE_GPU_REGISTER(0x4308, kFloat, SHADER_CONSTANT_194_X)\nXE_GPU_REGISTER(0x4309, kFloat, SHADER_CONSTANT_194_Y)\nXE_GPU_REGISTER(0x430A, kFloat, SHADER_CONSTANT_194_Z)\nXE_GPU_REGISTER(0x430B, kFloat, SHADER_CONSTANT_194_W)\nXE_GPU_REGISTER(0x430C, kFloat, SHADER_CONSTANT_195_X)\nXE_GPU_REGISTER(0x430D, kFloat, SHADER_CONSTANT_195_Y)\nXE_GPU_REGISTER(0x430E, kFloat, SHADER_CONSTANT_195_Z)\nXE_GPU_REGISTER(0x430F, kFloat, SHADER_CONSTANT_195_W)\nXE_GPU_REGISTER(0x4310, kFloat, SHADER_CONSTANT_196_X)\nXE_GPU_REGISTER(0x4311, kFloat, SHADER_CONSTANT_196_Y)\nXE_GPU_REGISTER(0x4312, kFloat, SHADER_CONSTANT_196_Z)\nXE_GPU_REGISTER(0x4313, kFloat, SHADER_CONSTANT_196_W)\nXE_GPU_REGISTER(0x4314, kFloat, SHADER_CONSTANT_197_X)\nXE_GPU_REGISTER(0x4315, kFloat, SHADER_CONSTANT_197_Y)\nXE_GPU_REGISTER(0x4316, kFloat, SHADER_CONSTANT_197_Z)\nXE_GPU_REGISTER(0x4317, kFloat, SHADER_CONSTANT_197_W)\nXE_GPU_REGISTER(0x4318, kFloat, SHADER_CONSTANT_198_X)\nXE_GPU_REGISTER(0x4319, kFloat, SHADER_CONSTANT_198_Y)\nXE_GPU_REGISTER(0x431A, kFloat, SHADER_CONSTANT_198_Z)\nXE_GPU_REGISTER(0x431B, kFloat, SHADER_CONSTANT_198_W)\nXE_GPU_REGISTER(0x431C, kFloat, SHADER_CONSTANT_199_X)\nXE_GPU_REGISTER(0x431D, kFloat, SHADER_CONSTANT_199_Y)\nXE_GPU_REGISTER(0x431E, kFloat, SHADER_CONSTANT_199_Z)\nXE_GPU_REGISTER(0x431F, kFloat, SHADER_CONSTANT_199_W)\nXE_GPU_REGISTER(0x4320, kFloat, SHADER_CONSTANT_200_X)\nXE_GPU_REGISTER(0x4321, kFloat, SHADER_CONSTANT_200_Y)\nXE_GPU_REGISTER(0x4322, kFloat, SHADER_CONSTANT_200_Z)\nXE_GPU_REGISTER(0x4323, kFloat, SHADER_CONSTANT_200_W)\nXE_GPU_REGISTER(0x4324, kFloat, SHADER_CONSTANT_201_X)\nXE_GPU_REGISTER(0x4325, kFloat, SHADER_CONSTANT_201_Y)\nXE_GPU_REGISTER(0x4326, kFloat, SHADER_CONSTANT_201_Z)\nXE_GPU_REGISTER(0x4327, kFloat, SHADER_CONSTANT_201_W)\nXE_GPU_REGISTER(0x4328, kFloat, SHADER_CONSTANT_202_X)\nXE_GPU_REGISTER(0x4329, kFloat, SHADER_CONSTANT_202_Y)\nXE_GPU_REGISTER(0x432A, kFloat, SHADER_CONSTANT_202_Z)\nXE_GPU_REGISTER(0x432B, kFloat, SHADER_CONSTANT_202_W)\nXE_GPU_REGISTER(0x432C, kFloat, SHADER_CONSTANT_203_X)\nXE_GPU_REGISTER(0x432D, kFloat, SHADER_CONSTANT_203_Y)\nXE_GPU_REGISTER(0x432E, kFloat, SHADER_CONSTANT_203_Z)\nXE_GPU_REGISTER(0x432F, kFloat, SHADER_CONSTANT_203_W)\nXE_GPU_REGISTER(0x4330, kFloat, SHADER_CONSTANT_204_X)\nXE_GPU_REGISTER(0x4331, kFloat, SHADER_CONSTANT_204_Y)\nXE_GPU_REGISTER(0x4332, kFloat, SHADER_CONSTANT_204_Z)\nXE_GPU_REGISTER(0x4333, kFloat, SHADER_CONSTANT_204_W)\nXE_GPU_REGISTER(0x4334, kFloat, SHADER_CONSTANT_205_X)\nXE_GPU_REGISTER(0x4335, kFloat, SHADER_CONSTANT_205_Y)\nXE_GPU_REGISTER(0x4336, kFloat, SHADER_CONSTANT_205_Z)\nXE_GPU_REGISTER(0x4337, kFloat, SHADER_CONSTANT_205_W)\nXE_GPU_REGISTER(0x4338, kFloat, SHADER_CONSTANT_206_X)\nXE_GPU_REGISTER(0x4339, kFloat, SHADER_CONSTANT_206_Y)\nXE_GPU_REGISTER(0x433A, kFloat, SHADER_CONSTANT_206_Z)\nXE_GPU_REGISTER(0x433B, kFloat, SHADER_CONSTANT_206_W)\nXE_GPU_REGISTER(0x433C, kFloat, SHADER_CONSTANT_207_X)\nXE_GPU_REGISTER(0x433D, kFloat, SHADER_CONSTANT_207_Y)\nXE_GPU_REGISTER(0x433E, kFloat, SHADER_CONSTANT_207_Z)\nXE_GPU_REGISTER(0x433F, kFloat, SHADER_CONSTANT_207_W)\nXE_GPU_REGISTER(0x4340, kFloat, SHADER_CONSTANT_208_X)\nXE_GPU_REGISTER(0x4341, kFloat, SHADER_CONSTANT_208_Y)\nXE_GPU_REGISTER(0x4342, kFloat, SHADER_CONSTANT_208_Z)\nXE_GPU_REGISTER(0x4343, kFloat, SHADER_CONSTANT_208_W)\nXE_GPU_REGISTER(0x4344, kFloat, SHADER_CONSTANT_209_X)\nXE_GPU_REGISTER(0x4345, kFloat, SHADER_CONSTANT_209_Y)\nXE_GPU_REGISTER(0x4346, kFloat, SHADER_CONSTANT_209_Z)\nXE_GPU_REGISTER(0x4347, kFloat, SHADER_CONSTANT_209_W)\nXE_GPU_REGISTER(0x4348, kFloat, SHADER_CONSTANT_210_X)\nXE_GPU_REGISTER(0x4349, kFloat, SHADER_CONSTANT_210_Y)\nXE_GPU_REGISTER(0x434A, kFloat, SHADER_CONSTANT_210_Z)\nXE_GPU_REGISTER(0x434B, kFloat, SHADER_CONSTANT_210_W)\nXE_GPU_REGISTER(0x434C, kFloat, SHADER_CONSTANT_211_X)\nXE_GPU_REGISTER(0x434D, kFloat, SHADER_CONSTANT_211_Y)\nXE_GPU_REGISTER(0x434E, kFloat, SHADER_CONSTANT_211_Z)\nXE_GPU_REGISTER(0x434F, kFloat, SHADER_CONSTANT_211_W)\nXE_GPU_REGISTER(0x4350, kFloat, SHADER_CONSTANT_212_X)\nXE_GPU_REGISTER(0x4351, kFloat, SHADER_CONSTANT_212_Y)\nXE_GPU_REGISTER(0x4352, kFloat, SHADER_CONSTANT_212_Z)\nXE_GPU_REGISTER(0x4353, kFloat, SHADER_CONSTANT_212_W)\nXE_GPU_REGISTER(0x4354, kFloat, SHADER_CONSTANT_213_X)\nXE_GPU_REGISTER(0x4355, kFloat, SHADER_CONSTANT_213_Y)\nXE_GPU_REGISTER(0x4356, kFloat, SHADER_CONSTANT_213_Z)\nXE_GPU_REGISTER(0x4357, kFloat, SHADER_CONSTANT_213_W)\nXE_GPU_REGISTER(0x4358, kFloat, SHADER_CONSTANT_214_X)\nXE_GPU_REGISTER(0x4359, kFloat, SHADER_CONSTANT_214_Y)\nXE_GPU_REGISTER(0x435A, kFloat, SHADER_CONSTANT_214_Z)\nXE_GPU_REGISTER(0x435B, kFloat, SHADER_CONSTANT_214_W)\nXE_GPU_REGISTER(0x435C, kFloat, SHADER_CONSTANT_215_X)\nXE_GPU_REGISTER(0x435D, kFloat, SHADER_CONSTANT_215_Y)\nXE_GPU_REGISTER(0x435E, kFloat, SHADER_CONSTANT_215_Z)\nXE_GPU_REGISTER(0x435F, kFloat, SHADER_CONSTANT_215_W)\nXE_GPU_REGISTER(0x4360, kFloat, SHADER_CONSTANT_216_X)\nXE_GPU_REGISTER(0x4361, kFloat, SHADER_CONSTANT_216_Y)\nXE_GPU_REGISTER(0x4362, kFloat, SHADER_CONSTANT_216_Z)\nXE_GPU_REGISTER(0x4363, kFloat, SHADER_CONSTANT_216_W)\nXE_GPU_REGISTER(0x4364, kFloat, SHADER_CONSTANT_217_X)\nXE_GPU_REGISTER(0x4365, kFloat, SHADER_CONSTANT_217_Y)\nXE_GPU_REGISTER(0x4366, kFloat, SHADER_CONSTANT_217_Z)\nXE_GPU_REGISTER(0x4367, kFloat, SHADER_CONSTANT_217_W)\nXE_GPU_REGISTER(0x4368, kFloat, SHADER_CONSTANT_218_X)\nXE_GPU_REGISTER(0x4369, kFloat, SHADER_CONSTANT_218_Y)\nXE_GPU_REGISTER(0x436A, kFloat, SHADER_CONSTANT_218_Z)\nXE_GPU_REGISTER(0x436B, kFloat, SHADER_CONSTANT_218_W)\nXE_GPU_REGISTER(0x436C, kFloat, SHADER_CONSTANT_219_X)\nXE_GPU_REGISTER(0x436D, kFloat, SHADER_CONSTANT_219_Y)\nXE_GPU_REGISTER(0x436E, kFloat, SHADER_CONSTANT_219_Z)\nXE_GPU_REGISTER(0x436F, kFloat, SHADER_CONSTANT_219_W)\nXE_GPU_REGISTER(0x4370, kFloat, SHADER_CONSTANT_220_X)\nXE_GPU_REGISTER(0x4371, kFloat, SHADER_CONSTANT_220_Y)\nXE_GPU_REGISTER(0x4372, kFloat, SHADER_CONSTANT_220_Z)\nXE_GPU_REGISTER(0x4373, kFloat, SHADER_CONSTANT_220_W)\nXE_GPU_REGISTER(0x4374, kFloat, SHADER_CONSTANT_221_X)\nXE_GPU_REGISTER(0x4375, kFloat, SHADER_CONSTANT_221_Y)\nXE_GPU_REGISTER(0x4376, kFloat, SHADER_CONSTANT_221_Z)\nXE_GPU_REGISTER(0x4377, kFloat, SHADER_CONSTANT_221_W)\nXE_GPU_REGISTER(0x4378, kFloat, SHADER_CONSTANT_222_X)\nXE_GPU_REGISTER(0x4379, kFloat, SHADER_CONSTANT_222_Y)\nXE_GPU_REGISTER(0x437A, kFloat, SHADER_CONSTANT_222_Z)\nXE_GPU_REGISTER(0x437B, kFloat, SHADER_CONSTANT_222_W)\nXE_GPU_REGISTER(0x437C, kFloat, SHADER_CONSTANT_223_X)\nXE_GPU_REGISTER(0x437D, kFloat, SHADER_CONSTANT_223_Y)\nXE_GPU_REGISTER(0x437E, kFloat, SHADER_CONSTANT_223_Z)\nXE_GPU_REGISTER(0x437F, kFloat, SHADER_CONSTANT_223_W)\nXE_GPU_REGISTER(0x4380, kFloat, SHADER_CONSTANT_224_X)\nXE_GPU_REGISTER(0x4381, kFloat, SHADER_CONSTANT_224_Y)\nXE_GPU_REGISTER(0x4382, kFloat, SHADER_CONSTANT_224_Z)\nXE_GPU_REGISTER(0x4383, kFloat, SHADER_CONSTANT_224_W)\nXE_GPU_REGISTER(0x4384, kFloat, SHADER_CONSTANT_225_X)\nXE_GPU_REGISTER(0x4385, kFloat, SHADER_CONSTANT_225_Y)\nXE_GPU_REGISTER(0x4386, kFloat, SHADER_CONSTANT_225_Z)\nXE_GPU_REGISTER(0x4387, kFloat, SHADER_CONSTANT_225_W)\nXE_GPU_REGISTER(0x4388, kFloat, SHADER_CONSTANT_226_X)\nXE_GPU_REGISTER(0x4389, kFloat, SHADER_CONSTANT_226_Y)\nXE_GPU_REGISTER(0x438A, kFloat, SHADER_CONSTANT_226_Z)\nXE_GPU_REGISTER(0x438B, kFloat, SHADER_CONSTANT_226_W)\nXE_GPU_REGISTER(0x438C, kFloat, SHADER_CONSTANT_227_X)\nXE_GPU_REGISTER(0x438D, kFloat, SHADER_CONSTANT_227_Y)\nXE_GPU_REGISTER(0x438E, kFloat, SHADER_CONSTANT_227_Z)\nXE_GPU_REGISTER(0x438F, kFloat, SHADER_CONSTANT_227_W)\nXE_GPU_REGISTER(0x4390, kFloat, SHADER_CONSTANT_228_X)\nXE_GPU_REGISTER(0x4391, kFloat, SHADER_CONSTANT_228_Y)\nXE_GPU_REGISTER(0x4392, kFloat, SHADER_CONSTANT_228_Z)\nXE_GPU_REGISTER(0x4393, kFloat, SHADER_CONSTANT_228_W)\nXE_GPU_REGISTER(0x4394, kFloat, SHADER_CONSTANT_229_X)\nXE_GPU_REGISTER(0x4395, kFloat, SHADER_CONSTANT_229_Y)\nXE_GPU_REGISTER(0x4396, kFloat, SHADER_CONSTANT_229_Z)\nXE_GPU_REGISTER(0x4397, kFloat, SHADER_CONSTANT_229_W)\nXE_GPU_REGISTER(0x4398, kFloat, SHADER_CONSTANT_230_X)\nXE_GPU_REGISTER(0x4399, kFloat, SHADER_CONSTANT_230_Y)\nXE_GPU_REGISTER(0x439A, kFloat, SHADER_CONSTANT_230_Z)\nXE_GPU_REGISTER(0x439B, kFloat, SHADER_CONSTANT_230_W)\nXE_GPU_REGISTER(0x439C, kFloat, SHADER_CONSTANT_231_X)\nXE_GPU_REGISTER(0x439D, kFloat, SHADER_CONSTANT_231_Y)\nXE_GPU_REGISTER(0x439E, kFloat, SHADER_CONSTANT_231_Z)\nXE_GPU_REGISTER(0x439F, kFloat, SHADER_CONSTANT_231_W)\nXE_GPU_REGISTER(0x43A0, kFloat, SHADER_CONSTANT_232_X)\nXE_GPU_REGISTER(0x43A1, kFloat, SHADER_CONSTANT_232_Y)\nXE_GPU_REGISTER(0x43A2, kFloat, SHADER_CONSTANT_232_Z)\nXE_GPU_REGISTER(0x43A3, kFloat, SHADER_CONSTANT_232_W)\nXE_GPU_REGISTER(0x43A4, kFloat, SHADER_CONSTANT_233_X)\nXE_GPU_REGISTER(0x43A5, kFloat, SHADER_CONSTANT_233_Y)\nXE_GPU_REGISTER(0x43A6, kFloat, SHADER_CONSTANT_233_Z)\nXE_GPU_REGISTER(0x43A7, kFloat, SHADER_CONSTANT_233_W)\nXE_GPU_REGISTER(0x43A8, kFloat, SHADER_CONSTANT_234_X)\nXE_GPU_REGISTER(0x43A9, kFloat, SHADER_CONSTANT_234_Y)\nXE_GPU_REGISTER(0x43AA, kFloat, SHADER_CONSTANT_234_Z)\nXE_GPU_REGISTER(0x43AB, kFloat, SHADER_CONSTANT_234_W)\nXE_GPU_REGISTER(0x43AC, kFloat, SHADER_CONSTANT_235_X)\nXE_GPU_REGISTER(0x43AD, kFloat, SHADER_CONSTANT_235_Y)\nXE_GPU_REGISTER(0x43AE, kFloat, SHADER_CONSTANT_235_Z)\nXE_GPU_REGISTER(0x43AF, kFloat, SHADER_CONSTANT_235_W)\nXE_GPU_REGISTER(0x43B0, kFloat, SHADER_CONSTANT_236_X)\nXE_GPU_REGISTER(0x43B1, kFloat, SHADER_CONSTANT_236_Y)\nXE_GPU_REGISTER(0x43B2, kFloat, SHADER_CONSTANT_236_Z)\nXE_GPU_REGISTER(0x43B3, kFloat, SHADER_CONSTANT_236_W)\nXE_GPU_REGISTER(0x43B4, kFloat, SHADER_CONSTANT_237_X)\nXE_GPU_REGISTER(0x43B5, kFloat, SHADER_CONSTANT_237_Y)\nXE_GPU_REGISTER(0x43B6, kFloat, SHADER_CONSTANT_237_Z)\nXE_GPU_REGISTER(0x43B7, kFloat, SHADER_CONSTANT_237_W)\nXE_GPU_REGISTER(0x43B8, kFloat, SHADER_CONSTANT_238_X)\nXE_GPU_REGISTER(0x43B9, kFloat, SHADER_CONSTANT_238_Y)\nXE_GPU_REGISTER(0x43BA, kFloat, SHADER_CONSTANT_238_Z)\nXE_GPU_REGISTER(0x43BB, kFloat, SHADER_CONSTANT_238_W)\nXE_GPU_REGISTER(0x43BC, kFloat, SHADER_CONSTANT_239_X)\nXE_GPU_REGISTER(0x43BD, kFloat, SHADER_CONSTANT_239_Y)\nXE_GPU_REGISTER(0x43BE, kFloat, SHADER_CONSTANT_239_Z)\nXE_GPU_REGISTER(0x43BF, kFloat, SHADER_CONSTANT_239_W)\nXE_GPU_REGISTER(0x43C0, kFloat, SHADER_CONSTANT_240_X)\nXE_GPU_REGISTER(0x43C1, kFloat, SHADER_CONSTANT_240_Y)\nXE_GPU_REGISTER(0x43C2, kFloat, SHADER_CONSTANT_240_Z)\nXE_GPU_REGISTER(0x43C3, kFloat, SHADER_CONSTANT_240_W)\nXE_GPU_REGISTER(0x43C4, kFloat, SHADER_CONSTANT_241_X)\nXE_GPU_REGISTER(0x43C5, kFloat, SHADER_CONSTANT_241_Y)\nXE_GPU_REGISTER(0x43C6, kFloat, SHADER_CONSTANT_241_Z)\nXE_GPU_REGISTER(0x43C7, kFloat, SHADER_CONSTANT_241_W)\nXE_GPU_REGISTER(0x43C8, kFloat, SHADER_CONSTANT_242_X)\nXE_GPU_REGISTER(0x43C9, kFloat, SHADER_CONSTANT_242_Y)\nXE_GPU_REGISTER(0x43CA, kFloat, SHADER_CONSTANT_242_Z)\nXE_GPU_REGISTER(0x43CB, kFloat, SHADER_CONSTANT_242_W)\nXE_GPU_REGISTER(0x43CC, kFloat, SHADER_CONSTANT_243_X)\nXE_GPU_REGISTER(0x43CD, kFloat, SHADER_CONSTANT_243_Y)\nXE_GPU_REGISTER(0x43CE, kFloat, SHADER_CONSTANT_243_Z)\nXE_GPU_REGISTER(0x43CF, kFloat, SHADER_CONSTANT_243_W)\nXE_GPU_REGISTER(0x43D0, kFloat, SHADER_CONSTANT_244_X)\nXE_GPU_REGISTER(0x43D1, kFloat, SHADER_CONSTANT_244_Y)\nXE_GPU_REGISTER(0x43D2, kFloat, SHADER_CONSTANT_244_Z)\nXE_GPU_REGISTER(0x43D3, kFloat, SHADER_CONSTANT_244_W)\nXE_GPU_REGISTER(0x43D4, kFloat, SHADER_CONSTANT_245_X)\nXE_GPU_REGISTER(0x43D5, kFloat, SHADER_CONSTANT_245_Y)\nXE_GPU_REGISTER(0x43D6, kFloat, SHADER_CONSTANT_245_Z)\nXE_GPU_REGISTER(0x43D7, kFloat, SHADER_CONSTANT_245_W)\nXE_GPU_REGISTER(0x43D8, kFloat, SHADER_CONSTANT_246_X)\nXE_GPU_REGISTER(0x43D9, kFloat, SHADER_CONSTANT_246_Y)\nXE_GPU_REGISTER(0x43DA, kFloat, SHADER_CONSTANT_246_Z)\nXE_GPU_REGISTER(0x43DB, kFloat, SHADER_CONSTANT_246_W)\nXE_GPU_REGISTER(0x43DC, kFloat, SHADER_CONSTANT_247_X)\nXE_GPU_REGISTER(0x43DD, kFloat, SHADER_CONSTANT_247_Y)\nXE_GPU_REGISTER(0x43DE, kFloat, SHADER_CONSTANT_247_Z)\nXE_GPU_REGISTER(0x43DF, kFloat, SHADER_CONSTANT_247_W)\nXE_GPU_REGISTER(0x43E0, kFloat, SHADER_CONSTANT_248_X)\nXE_GPU_REGISTER(0x43E1, kFloat, SHADER_CONSTANT_248_Y)\nXE_GPU_REGISTER(0x43E2, kFloat, SHADER_CONSTANT_248_Z)\nXE_GPU_REGISTER(0x43E3, kFloat, SHADER_CONSTANT_248_W)\nXE_GPU_REGISTER(0x43E4, kFloat, SHADER_CONSTANT_249_X)\nXE_GPU_REGISTER(0x43E5, kFloat, SHADER_CONSTANT_249_Y)\nXE_GPU_REGISTER(0x43E6, kFloat, SHADER_CONSTANT_249_Z)\nXE_GPU_REGISTER(0x43E7, kFloat, SHADER_CONSTANT_249_W)\nXE_GPU_REGISTER(0x43E8, kFloat, SHADER_CONSTANT_250_X)\nXE_GPU_REGISTER(0x43E9, kFloat, SHADER_CONSTANT_250_Y)\nXE_GPU_REGISTER(0x43EA, kFloat, SHADER_CONSTANT_250_Z)\nXE_GPU_REGISTER(0x43EB, kFloat, SHADER_CONSTANT_250_W)\nXE_GPU_REGISTER(0x43EC, kFloat, SHADER_CONSTANT_251_X)\nXE_GPU_REGISTER(0x43ED, kFloat, SHADER_CONSTANT_251_Y)\nXE_GPU_REGISTER(0x43EE, kFloat, SHADER_CONSTANT_251_Z)\nXE_GPU_REGISTER(0x43EF, kFloat, SHADER_CONSTANT_251_W)\nXE_GPU_REGISTER(0x43F0, kFloat, SHADER_CONSTANT_252_X)\nXE_GPU_REGISTER(0x43F1, kFloat, SHADER_CONSTANT_252_Y)\nXE_GPU_REGISTER(0x43F2, kFloat, SHADER_CONSTANT_252_Z)\nXE_GPU_REGISTER(0x43F3, kFloat, SHADER_CONSTANT_252_W)\nXE_GPU_REGISTER(0x43F4, kFloat, SHADER_CONSTANT_253_X)\nXE_GPU_REGISTER(0x43F5, kFloat, SHADER_CONSTANT_253_Y)\nXE_GPU_REGISTER(0x43F6, kFloat, SHADER_CONSTANT_253_Z)\nXE_GPU_REGISTER(0x43F7, kFloat, SHADER_CONSTANT_253_W)\nXE_GPU_REGISTER(0x43F8, kFloat, SHADER_CONSTANT_254_X)\nXE_GPU_REGISTER(0x43F9, kFloat, SHADER_CONSTANT_254_Y)\nXE_GPU_REGISTER(0x43FA, kFloat, SHADER_CONSTANT_254_Z)\nXE_GPU_REGISTER(0x43FB, kFloat, SHADER_CONSTANT_254_W)\nXE_GPU_REGISTER(0x43FC, kFloat, SHADER_CONSTANT_255_X)\nXE_GPU_REGISTER(0x43FD, kFloat, SHADER_CONSTANT_255_Y)\nXE_GPU_REGISTER(0x43FE, kFloat, SHADER_CONSTANT_255_Z)\nXE_GPU_REGISTER(0x43FF, kFloat, SHADER_CONSTANT_255_W)\nXE_GPU_REGISTER(0x4400, kFloat, SHADER_CONSTANT_256_X)\nXE_GPU_REGISTER(0x4401, kFloat, SHADER_CONSTANT_256_Y)\nXE_GPU_REGISTER(0x4402, kFloat, SHADER_CONSTANT_256_Z)\nXE_GPU_REGISTER(0x4403, kFloat, SHADER_CONSTANT_256_W)\nXE_GPU_REGISTER(0x4404, kFloat, SHADER_CONSTANT_257_X)\nXE_GPU_REGISTER(0x4405, kFloat, SHADER_CONSTANT_257_Y)\nXE_GPU_REGISTER(0x4406, kFloat, SHADER_CONSTANT_257_Z)\nXE_GPU_REGISTER(0x4407, kFloat, SHADER_CONSTANT_257_W)\nXE_GPU_REGISTER(0x4408, kFloat, SHADER_CONSTANT_258_X)\nXE_GPU_REGISTER(0x4409, kFloat, SHADER_CONSTANT_258_Y)\nXE_GPU_REGISTER(0x440A, kFloat, SHADER_CONSTANT_258_Z)\nXE_GPU_REGISTER(0x440B, kFloat, SHADER_CONSTANT_258_W)\nXE_GPU_REGISTER(0x440C, kFloat, SHADER_CONSTANT_259_X)\nXE_GPU_REGISTER(0x440D, kFloat, SHADER_CONSTANT_259_Y)\nXE_GPU_REGISTER(0x440E, kFloat, SHADER_CONSTANT_259_Z)\nXE_GPU_REGISTER(0x440F, kFloat, SHADER_CONSTANT_259_W)\nXE_GPU_REGISTER(0x4410, kFloat, SHADER_CONSTANT_260_X)\nXE_GPU_REGISTER(0x4411, kFloat, SHADER_CONSTANT_260_Y)\nXE_GPU_REGISTER(0x4412, kFloat, SHADER_CONSTANT_260_Z)\nXE_GPU_REGISTER(0x4413, kFloat, SHADER_CONSTANT_260_W)\nXE_GPU_REGISTER(0x4414, kFloat, SHADER_CONSTANT_261_X)\nXE_GPU_REGISTER(0x4415, kFloat, SHADER_CONSTANT_261_Y)\nXE_GPU_REGISTER(0x4416, kFloat, SHADER_CONSTANT_261_Z)\nXE_GPU_REGISTER(0x4417, kFloat, SHADER_CONSTANT_261_W)\nXE_GPU_REGISTER(0x4418, kFloat, SHADER_CONSTANT_262_X)\nXE_GPU_REGISTER(0x4419, kFloat, SHADER_CONSTANT_262_Y)\nXE_GPU_REGISTER(0x441A, kFloat, SHADER_CONSTANT_262_Z)\nXE_GPU_REGISTER(0x441B, kFloat, SHADER_CONSTANT_262_W)\nXE_GPU_REGISTER(0x441C, kFloat, SHADER_CONSTANT_263_X)\nXE_GPU_REGISTER(0x441D, kFloat, SHADER_CONSTANT_263_Y)\nXE_GPU_REGISTER(0x441E, kFloat, SHADER_CONSTANT_263_Z)\nXE_GPU_REGISTER(0x441F, kFloat, SHADER_CONSTANT_263_W)\nXE_GPU_REGISTER(0x4420, kFloat, SHADER_CONSTANT_264_X)\nXE_GPU_REGISTER(0x4421, kFloat, SHADER_CONSTANT_264_Y)\nXE_GPU_REGISTER(0x4422, kFloat, SHADER_CONSTANT_264_Z)\nXE_GPU_REGISTER(0x4423, kFloat, SHADER_CONSTANT_264_W)\nXE_GPU_REGISTER(0x4424, kFloat, SHADER_CONSTANT_265_X)\nXE_GPU_REGISTER(0x4425, kFloat, SHADER_CONSTANT_265_Y)\nXE_GPU_REGISTER(0x4426, kFloat, SHADER_CONSTANT_265_Z)\nXE_GPU_REGISTER(0x4427, kFloat, SHADER_CONSTANT_265_W)\nXE_GPU_REGISTER(0x4428, kFloat, SHADER_CONSTANT_266_X)\nXE_GPU_REGISTER(0x4429, kFloat, SHADER_CONSTANT_266_Y)\nXE_GPU_REGISTER(0x442A, kFloat, SHADER_CONSTANT_266_Z)\nXE_GPU_REGISTER(0x442B, kFloat, SHADER_CONSTANT_266_W)\nXE_GPU_REGISTER(0x442C, kFloat, SHADER_CONSTANT_267_X)\nXE_GPU_REGISTER(0x442D, kFloat, SHADER_CONSTANT_267_Y)\nXE_GPU_REGISTER(0x442E, kFloat, SHADER_CONSTANT_267_Z)\nXE_GPU_REGISTER(0x442F, kFloat, SHADER_CONSTANT_267_W)\nXE_GPU_REGISTER(0x4430, kFloat, SHADER_CONSTANT_268_X)\nXE_GPU_REGISTER(0x4431, kFloat, SHADER_CONSTANT_268_Y)\nXE_GPU_REGISTER(0x4432, kFloat, SHADER_CONSTANT_268_Z)\nXE_GPU_REGISTER(0x4433, kFloat, SHADER_CONSTANT_268_W)\nXE_GPU_REGISTER(0x4434, kFloat, SHADER_CONSTANT_269_X)\nXE_GPU_REGISTER(0x4435, kFloat, SHADER_CONSTANT_269_Y)\nXE_GPU_REGISTER(0x4436, kFloat, SHADER_CONSTANT_269_Z)\nXE_GPU_REGISTER(0x4437, kFloat, SHADER_CONSTANT_269_W)\nXE_GPU_REGISTER(0x4438, kFloat, SHADER_CONSTANT_270_X)\nXE_GPU_REGISTER(0x4439, kFloat, SHADER_CONSTANT_270_Y)\nXE_GPU_REGISTER(0x443A, kFloat, SHADER_CONSTANT_270_Z)\nXE_GPU_REGISTER(0x443B, kFloat, SHADER_CONSTANT_270_W)\nXE_GPU_REGISTER(0x443C, kFloat, SHADER_CONSTANT_271_X)\nXE_GPU_REGISTER(0x443D, kFloat, SHADER_CONSTANT_271_Y)\nXE_GPU_REGISTER(0x443E, kFloat, SHADER_CONSTANT_271_Z)\nXE_GPU_REGISTER(0x443F, kFloat, SHADER_CONSTANT_271_W)\nXE_GPU_REGISTER(0x4440, kFloat, SHADER_CONSTANT_272_X)\nXE_GPU_REGISTER(0x4441, kFloat, SHADER_CONSTANT_272_Y)\nXE_GPU_REGISTER(0x4442, kFloat, SHADER_CONSTANT_272_Z)\nXE_GPU_REGISTER(0x4443, kFloat, SHADER_CONSTANT_272_W)\nXE_GPU_REGISTER(0x4444, kFloat, SHADER_CONSTANT_273_X)\nXE_GPU_REGISTER(0x4445, kFloat, SHADER_CONSTANT_273_Y)\nXE_GPU_REGISTER(0x4446, kFloat, SHADER_CONSTANT_273_Z)\nXE_GPU_REGISTER(0x4447, kFloat, SHADER_CONSTANT_273_W)\nXE_GPU_REGISTER(0x4448, kFloat, SHADER_CONSTANT_274_X)\nXE_GPU_REGISTER(0x4449, kFloat, SHADER_CONSTANT_274_Y)\nXE_GPU_REGISTER(0x444A, kFloat, SHADER_CONSTANT_274_Z)\nXE_GPU_REGISTER(0x444B, kFloat, SHADER_CONSTANT_274_W)\nXE_GPU_REGISTER(0x444C, kFloat, SHADER_CONSTANT_275_X)\nXE_GPU_REGISTER(0x444D, kFloat, SHADER_CONSTANT_275_Y)\nXE_GPU_REGISTER(0x444E, kFloat, SHADER_CONSTANT_275_Z)\nXE_GPU_REGISTER(0x444F, kFloat, SHADER_CONSTANT_275_W)\nXE_GPU_REGISTER(0x4450, kFloat, SHADER_CONSTANT_276_X)\nXE_GPU_REGISTER(0x4451, kFloat, SHADER_CONSTANT_276_Y)\nXE_GPU_REGISTER(0x4452, kFloat, SHADER_CONSTANT_276_Z)\nXE_GPU_REGISTER(0x4453, kFloat, SHADER_CONSTANT_276_W)\nXE_GPU_REGISTER(0x4454, kFloat, SHADER_CONSTANT_277_X)\nXE_GPU_REGISTER(0x4455, kFloat, SHADER_CONSTANT_277_Y)\nXE_GPU_REGISTER(0x4456, kFloat, SHADER_CONSTANT_277_Z)\nXE_GPU_REGISTER(0x4457, kFloat, SHADER_CONSTANT_277_W)\nXE_GPU_REGISTER(0x4458, kFloat, SHADER_CONSTANT_278_X)\nXE_GPU_REGISTER(0x4459, kFloat, SHADER_CONSTANT_278_Y)\nXE_GPU_REGISTER(0x445A, kFloat, SHADER_CONSTANT_278_Z)\nXE_GPU_REGISTER(0x445B, kFloat, SHADER_CONSTANT_278_W)\nXE_GPU_REGISTER(0x445C, kFloat, SHADER_CONSTANT_279_X)\nXE_GPU_REGISTER(0x445D, kFloat, SHADER_CONSTANT_279_Y)\nXE_GPU_REGISTER(0x445E, kFloat, SHADER_CONSTANT_279_Z)\nXE_GPU_REGISTER(0x445F, kFloat, SHADER_CONSTANT_279_W)\nXE_GPU_REGISTER(0x4460, kFloat, SHADER_CONSTANT_280_X)\nXE_GPU_REGISTER(0x4461, kFloat, SHADER_CONSTANT_280_Y)\nXE_GPU_REGISTER(0x4462, kFloat, SHADER_CONSTANT_280_Z)\nXE_GPU_REGISTER(0x4463, kFloat, SHADER_CONSTANT_280_W)\nXE_GPU_REGISTER(0x4464, kFloat, SHADER_CONSTANT_281_X)\nXE_GPU_REGISTER(0x4465, kFloat, SHADER_CONSTANT_281_Y)\nXE_GPU_REGISTER(0x4466, kFloat, SHADER_CONSTANT_281_Z)\nXE_GPU_REGISTER(0x4467, kFloat, SHADER_CONSTANT_281_W)\nXE_GPU_REGISTER(0x4468, kFloat, SHADER_CONSTANT_282_X)\nXE_GPU_REGISTER(0x4469, kFloat, SHADER_CONSTANT_282_Y)\nXE_GPU_REGISTER(0x446A, kFloat, SHADER_CONSTANT_282_Z)\nXE_GPU_REGISTER(0x446B, kFloat, SHADER_CONSTANT_282_W)\nXE_GPU_REGISTER(0x446C, kFloat, SHADER_CONSTANT_283_X)\nXE_GPU_REGISTER(0x446D, kFloat, SHADER_CONSTANT_283_Y)\nXE_GPU_REGISTER(0x446E, kFloat, SHADER_CONSTANT_283_Z)\nXE_GPU_REGISTER(0x446F, kFloat, SHADER_CONSTANT_283_W)\nXE_GPU_REGISTER(0x4470, kFloat, SHADER_CONSTANT_284_X)\nXE_GPU_REGISTER(0x4471, kFloat, SHADER_CONSTANT_284_Y)\nXE_GPU_REGISTER(0x4472, kFloat, SHADER_CONSTANT_284_Z)\nXE_GPU_REGISTER(0x4473, kFloat, SHADER_CONSTANT_284_W)\nXE_GPU_REGISTER(0x4474, kFloat, SHADER_CONSTANT_285_X)\nXE_GPU_REGISTER(0x4475, kFloat, SHADER_CONSTANT_285_Y)\nXE_GPU_REGISTER(0x4476, kFloat, SHADER_CONSTANT_285_Z)\nXE_GPU_REGISTER(0x4477, kFloat, SHADER_CONSTANT_285_W)\nXE_GPU_REGISTER(0x4478, kFloat, SHADER_CONSTANT_286_X)\nXE_GPU_REGISTER(0x4479, kFloat, SHADER_CONSTANT_286_Y)\nXE_GPU_REGISTER(0x447A, kFloat, SHADER_CONSTANT_286_Z)\nXE_GPU_REGISTER(0x447B, kFloat, SHADER_CONSTANT_286_W)\nXE_GPU_REGISTER(0x447C, kFloat, SHADER_CONSTANT_287_X)\nXE_GPU_REGISTER(0x447D, kFloat, SHADER_CONSTANT_287_Y)\nXE_GPU_REGISTER(0x447E, kFloat, SHADER_CONSTANT_287_Z)\nXE_GPU_REGISTER(0x447F, kFloat, SHADER_CONSTANT_287_W)\nXE_GPU_REGISTER(0x4480, kFloat, SHADER_CONSTANT_288_X)\nXE_GPU_REGISTER(0x4481, kFloat, SHADER_CONSTANT_288_Y)\nXE_GPU_REGISTER(0x4482, kFloat, SHADER_CONSTANT_288_Z)\nXE_GPU_REGISTER(0x4483, kFloat, SHADER_CONSTANT_288_W)\nXE_GPU_REGISTER(0x4484, kFloat, SHADER_CONSTANT_289_X)\nXE_GPU_REGISTER(0x4485, kFloat, SHADER_CONSTANT_289_Y)\nXE_GPU_REGISTER(0x4486, kFloat, SHADER_CONSTANT_289_Z)\nXE_GPU_REGISTER(0x4487, kFloat, SHADER_CONSTANT_289_W)\nXE_GPU_REGISTER(0x4488, kFloat, SHADER_CONSTANT_290_X)\nXE_GPU_REGISTER(0x4489, kFloat, SHADER_CONSTANT_290_Y)\nXE_GPU_REGISTER(0x448A, kFloat, SHADER_CONSTANT_290_Z)\nXE_GPU_REGISTER(0x448B, kFloat, SHADER_CONSTANT_290_W)\nXE_GPU_REGISTER(0x448C, kFloat, SHADER_CONSTANT_291_X)\nXE_GPU_REGISTER(0x448D, kFloat, SHADER_CONSTANT_291_Y)\nXE_GPU_REGISTER(0x448E, kFloat, SHADER_CONSTANT_291_Z)\nXE_GPU_REGISTER(0x448F, kFloat, SHADER_CONSTANT_291_W)\nXE_GPU_REGISTER(0x4490, kFloat, SHADER_CONSTANT_292_X)\nXE_GPU_REGISTER(0x4491, kFloat, SHADER_CONSTANT_292_Y)\nXE_GPU_REGISTER(0x4492, kFloat, SHADER_CONSTANT_292_Z)\nXE_GPU_REGISTER(0x4493, kFloat, SHADER_CONSTANT_292_W)\nXE_GPU_REGISTER(0x4494, kFloat, SHADER_CONSTANT_293_X)\nXE_GPU_REGISTER(0x4495, kFloat, SHADER_CONSTANT_293_Y)\nXE_GPU_REGISTER(0x4496, kFloat, SHADER_CONSTANT_293_Z)\nXE_GPU_REGISTER(0x4497, kFloat, SHADER_CONSTANT_293_W)\nXE_GPU_REGISTER(0x4498, kFloat, SHADER_CONSTANT_294_X)\nXE_GPU_REGISTER(0x4499, kFloat, SHADER_CONSTANT_294_Y)\nXE_GPU_REGISTER(0x449A, kFloat, SHADER_CONSTANT_294_Z)\nXE_GPU_REGISTER(0x449B, kFloat, SHADER_CONSTANT_294_W)\nXE_GPU_REGISTER(0x449C, kFloat, SHADER_CONSTANT_295_X)\nXE_GPU_REGISTER(0x449D, kFloat, SHADER_CONSTANT_295_Y)\nXE_GPU_REGISTER(0x449E, kFloat, SHADER_CONSTANT_295_Z)\nXE_GPU_REGISTER(0x449F, kFloat, SHADER_CONSTANT_295_W)\nXE_GPU_REGISTER(0x44A0, kFloat, SHADER_CONSTANT_296_X)\nXE_GPU_REGISTER(0x44A1, kFloat, SHADER_CONSTANT_296_Y)\nXE_GPU_REGISTER(0x44A2, kFloat, SHADER_CONSTANT_296_Z)\nXE_GPU_REGISTER(0x44A3, kFloat, SHADER_CONSTANT_296_W)\nXE_GPU_REGISTER(0x44A4, kFloat, SHADER_CONSTANT_297_X)\nXE_GPU_REGISTER(0x44A5, kFloat, SHADER_CONSTANT_297_Y)\nXE_GPU_REGISTER(0x44A6, kFloat, SHADER_CONSTANT_297_Z)\nXE_GPU_REGISTER(0x44A7, kFloat, SHADER_CONSTANT_297_W)\nXE_GPU_REGISTER(0x44A8, kFloat, SHADER_CONSTANT_298_X)\nXE_GPU_REGISTER(0x44A9, kFloat, SHADER_CONSTANT_298_Y)\nXE_GPU_REGISTER(0x44AA, kFloat, SHADER_CONSTANT_298_Z)\nXE_GPU_REGISTER(0x44AB, kFloat, SHADER_CONSTANT_298_W)\nXE_GPU_REGISTER(0x44AC, kFloat, SHADER_CONSTANT_299_X)\nXE_GPU_REGISTER(0x44AD, kFloat, SHADER_CONSTANT_299_Y)\nXE_GPU_REGISTER(0x44AE, kFloat, SHADER_CONSTANT_299_Z)\nXE_GPU_REGISTER(0x44AF, kFloat, SHADER_CONSTANT_299_W)\nXE_GPU_REGISTER(0x44B0, kFloat, SHADER_CONSTANT_300_X)\nXE_GPU_REGISTER(0x44B1, kFloat, SHADER_CONSTANT_300_Y)\nXE_GPU_REGISTER(0x44B2, kFloat, SHADER_CONSTANT_300_Z)\nXE_GPU_REGISTER(0x44B3, kFloat, SHADER_CONSTANT_300_W)\nXE_GPU_REGISTER(0x44B4, kFloat, SHADER_CONSTANT_301_X)\nXE_GPU_REGISTER(0x44B5, kFloat, SHADER_CONSTANT_301_Y)\nXE_GPU_REGISTER(0x44B6, kFloat, SHADER_CONSTANT_301_Z)\nXE_GPU_REGISTER(0x44B7, kFloat, SHADER_CONSTANT_301_W)\nXE_GPU_REGISTER(0x44B8, kFloat, SHADER_CONSTANT_302_X)\nXE_GPU_REGISTER(0x44B9, kFloat, SHADER_CONSTANT_302_Y)\nXE_GPU_REGISTER(0x44BA, kFloat, SHADER_CONSTANT_302_Z)\nXE_GPU_REGISTER(0x44BB, kFloat, SHADER_CONSTANT_302_W)\nXE_GPU_REGISTER(0x44BC, kFloat, SHADER_CONSTANT_303_X)\nXE_GPU_REGISTER(0x44BD, kFloat, SHADER_CONSTANT_303_Y)\nXE_GPU_REGISTER(0x44BE, kFloat, SHADER_CONSTANT_303_Z)\nXE_GPU_REGISTER(0x44BF, kFloat, SHADER_CONSTANT_303_W)\nXE_GPU_REGISTER(0x44C0, kFloat, SHADER_CONSTANT_304_X)\nXE_GPU_REGISTER(0x44C1, kFloat, SHADER_CONSTANT_304_Y)\nXE_GPU_REGISTER(0x44C2, kFloat, SHADER_CONSTANT_304_Z)\nXE_GPU_REGISTER(0x44C3, kFloat, SHADER_CONSTANT_304_W)\nXE_GPU_REGISTER(0x44C4, kFloat, SHADER_CONSTANT_305_X)\nXE_GPU_REGISTER(0x44C5, kFloat, SHADER_CONSTANT_305_Y)\nXE_GPU_REGISTER(0x44C6, kFloat, SHADER_CONSTANT_305_Z)\nXE_GPU_REGISTER(0x44C7, kFloat, SHADER_CONSTANT_305_W)\nXE_GPU_REGISTER(0x44C8, kFloat, SHADER_CONSTANT_306_X)\nXE_GPU_REGISTER(0x44C9, kFloat, SHADER_CONSTANT_306_Y)\nXE_GPU_REGISTER(0x44CA, kFloat, SHADER_CONSTANT_306_Z)\nXE_GPU_REGISTER(0x44CB, kFloat, SHADER_CONSTANT_306_W)\nXE_GPU_REGISTER(0x44CC, kFloat, SHADER_CONSTANT_307_X)\nXE_GPU_REGISTER(0x44CD, kFloat, SHADER_CONSTANT_307_Y)\nXE_GPU_REGISTER(0x44CE, kFloat, SHADER_CONSTANT_307_Z)\nXE_GPU_REGISTER(0x44CF, kFloat, SHADER_CONSTANT_307_W)\nXE_GPU_REGISTER(0x44D0, kFloat, SHADER_CONSTANT_308_X)\nXE_GPU_REGISTER(0x44D1, kFloat, SHADER_CONSTANT_308_Y)\nXE_GPU_REGISTER(0x44D2, kFloat, SHADER_CONSTANT_308_Z)\nXE_GPU_REGISTER(0x44D3, kFloat, SHADER_CONSTANT_308_W)\nXE_GPU_REGISTER(0x44D4, kFloat, SHADER_CONSTANT_309_X)\nXE_GPU_REGISTER(0x44D5, kFloat, SHADER_CONSTANT_309_Y)\nXE_GPU_REGISTER(0x44D6, kFloat, SHADER_CONSTANT_309_Z)\nXE_GPU_REGISTER(0x44D7, kFloat, SHADER_CONSTANT_309_W)\nXE_GPU_REGISTER(0x44D8, kFloat, SHADER_CONSTANT_310_X)\nXE_GPU_REGISTER(0x44D9, kFloat, SHADER_CONSTANT_310_Y)\nXE_GPU_REGISTER(0x44DA, kFloat, SHADER_CONSTANT_310_Z)\nXE_GPU_REGISTER(0x44DB, kFloat, SHADER_CONSTANT_310_W)\nXE_GPU_REGISTER(0x44DC, kFloat, SHADER_CONSTANT_311_X)\nXE_GPU_REGISTER(0x44DD, kFloat, SHADER_CONSTANT_311_Y)\nXE_GPU_REGISTER(0x44DE, kFloat, SHADER_CONSTANT_311_Z)\nXE_GPU_REGISTER(0x44DF, kFloat, SHADER_CONSTANT_311_W)\nXE_GPU_REGISTER(0x44E0, kFloat, SHADER_CONSTANT_312_X)\nXE_GPU_REGISTER(0x44E1, kFloat, SHADER_CONSTANT_312_Y)\nXE_GPU_REGISTER(0x44E2, kFloat, SHADER_CONSTANT_312_Z)\nXE_GPU_REGISTER(0x44E3, kFloat, SHADER_CONSTANT_312_W)\nXE_GPU_REGISTER(0x44E4, kFloat, SHADER_CONSTANT_313_X)\nXE_GPU_REGISTER(0x44E5, kFloat, SHADER_CONSTANT_313_Y)\nXE_GPU_REGISTER(0x44E6, kFloat, SHADER_CONSTANT_313_Z)\nXE_GPU_REGISTER(0x44E7, kFloat, SHADER_CONSTANT_313_W)\nXE_GPU_REGISTER(0x44E8, kFloat, SHADER_CONSTANT_314_X)\nXE_GPU_REGISTER(0x44E9, kFloat, SHADER_CONSTANT_314_Y)\nXE_GPU_REGISTER(0x44EA, kFloat, SHADER_CONSTANT_314_Z)\nXE_GPU_REGISTER(0x44EB, kFloat, SHADER_CONSTANT_314_W)\nXE_GPU_REGISTER(0x44EC, kFloat, SHADER_CONSTANT_315_X)\nXE_GPU_REGISTER(0x44ED, kFloat, SHADER_CONSTANT_315_Y)\nXE_GPU_REGISTER(0x44EE, kFloat, SHADER_CONSTANT_315_Z)\nXE_GPU_REGISTER(0x44EF, kFloat, SHADER_CONSTANT_315_W)\nXE_GPU_REGISTER(0x44F0, kFloat, SHADER_CONSTANT_316_X)\nXE_GPU_REGISTER(0x44F1, kFloat, SHADER_CONSTANT_316_Y)\nXE_GPU_REGISTER(0x44F2, kFloat, SHADER_CONSTANT_316_Z)\nXE_GPU_REGISTER(0x44F3, kFloat, SHADER_CONSTANT_316_W)\nXE_GPU_REGISTER(0x44F4, kFloat, SHADER_CONSTANT_317_X)\nXE_GPU_REGISTER(0x44F5, kFloat, SHADER_CONSTANT_317_Y)\nXE_GPU_REGISTER(0x44F6, kFloat, SHADER_CONSTANT_317_Z)\nXE_GPU_REGISTER(0x44F7, kFloat, SHADER_CONSTANT_317_W)\nXE_GPU_REGISTER(0x44F8, kFloat, SHADER_CONSTANT_318_X)\nXE_GPU_REGISTER(0x44F9, kFloat, SHADER_CONSTANT_318_Y)\nXE_GPU_REGISTER(0x44FA, kFloat, SHADER_CONSTANT_318_Z)\nXE_GPU_REGISTER(0x44FB, kFloat, SHADER_CONSTANT_318_W)\nXE_GPU_REGISTER(0x44FC, kFloat, SHADER_CONSTANT_319_X)\nXE_GPU_REGISTER(0x44FD, kFloat, SHADER_CONSTANT_319_Y)\nXE_GPU_REGISTER(0x44FE, kFloat, SHADER_CONSTANT_319_Z)\nXE_GPU_REGISTER(0x44FF, kFloat, SHADER_CONSTANT_319_W)\nXE_GPU_REGISTER(0x4500, kFloat, SHADER_CONSTANT_320_X)\nXE_GPU_REGISTER(0x4501, kFloat, SHADER_CONSTANT_320_Y)\nXE_GPU_REGISTER(0x4502, kFloat, SHADER_CONSTANT_320_Z)\nXE_GPU_REGISTER(0x4503, kFloat, SHADER_CONSTANT_320_W)\nXE_GPU_REGISTER(0x4504, kFloat, SHADER_CONSTANT_321_X)\nXE_GPU_REGISTER(0x4505, kFloat, SHADER_CONSTANT_321_Y)\nXE_GPU_REGISTER(0x4506, kFloat, SHADER_CONSTANT_321_Z)\nXE_GPU_REGISTER(0x4507, kFloat, SHADER_CONSTANT_321_W)\nXE_GPU_REGISTER(0x4508, kFloat, SHADER_CONSTANT_322_X)\nXE_GPU_REGISTER(0x4509, kFloat, SHADER_CONSTANT_322_Y)\nXE_GPU_REGISTER(0x450A, kFloat, SHADER_CONSTANT_322_Z)\nXE_GPU_REGISTER(0x450B, kFloat, SHADER_CONSTANT_322_W)\nXE_GPU_REGISTER(0x450C, kFloat, SHADER_CONSTANT_323_X)\nXE_GPU_REGISTER(0x450D, kFloat, SHADER_CONSTANT_323_Y)\nXE_GPU_REGISTER(0x450E, kFloat, SHADER_CONSTANT_323_Z)\nXE_GPU_REGISTER(0x450F, kFloat, SHADER_CONSTANT_323_W)\nXE_GPU_REGISTER(0x4510, kFloat, SHADER_CONSTANT_324_X)\nXE_GPU_REGISTER(0x4511, kFloat, SHADER_CONSTANT_324_Y)\nXE_GPU_REGISTER(0x4512, kFloat, SHADER_CONSTANT_324_Z)\nXE_GPU_REGISTER(0x4513, kFloat, SHADER_CONSTANT_324_W)\nXE_GPU_REGISTER(0x4514, kFloat, SHADER_CONSTANT_325_X)\nXE_GPU_REGISTER(0x4515, kFloat, SHADER_CONSTANT_325_Y)\nXE_GPU_REGISTER(0x4516, kFloat, SHADER_CONSTANT_325_Z)\nXE_GPU_REGISTER(0x4517, kFloat, SHADER_CONSTANT_325_W)\nXE_GPU_REGISTER(0x4518, kFloat, SHADER_CONSTANT_326_X)\nXE_GPU_REGISTER(0x4519, kFloat, SHADER_CONSTANT_326_Y)\nXE_GPU_REGISTER(0x451A, kFloat, SHADER_CONSTANT_326_Z)\nXE_GPU_REGISTER(0x451B, kFloat, SHADER_CONSTANT_326_W)\nXE_GPU_REGISTER(0x451C, kFloat, SHADER_CONSTANT_327_X)\nXE_GPU_REGISTER(0x451D, kFloat, SHADER_CONSTANT_327_Y)\nXE_GPU_REGISTER(0x451E, kFloat, SHADER_CONSTANT_327_Z)\nXE_GPU_REGISTER(0x451F, kFloat, SHADER_CONSTANT_327_W)\nXE_GPU_REGISTER(0x4520, kFloat, SHADER_CONSTANT_328_X)\nXE_GPU_REGISTER(0x4521, kFloat, SHADER_CONSTANT_328_Y)\nXE_GPU_REGISTER(0x4522, kFloat, SHADER_CONSTANT_328_Z)\nXE_GPU_REGISTER(0x4523, kFloat, SHADER_CONSTANT_328_W)\nXE_GPU_REGISTER(0x4524, kFloat, SHADER_CONSTANT_329_X)\nXE_GPU_REGISTER(0x4525, kFloat, SHADER_CONSTANT_329_Y)\nXE_GPU_REGISTER(0x4526, kFloat, SHADER_CONSTANT_329_Z)\nXE_GPU_REGISTER(0x4527, kFloat, SHADER_CONSTANT_329_W)\nXE_GPU_REGISTER(0x4528, kFloat, SHADER_CONSTANT_330_X)\nXE_GPU_REGISTER(0x4529, kFloat, SHADER_CONSTANT_330_Y)\nXE_GPU_REGISTER(0x452A, kFloat, SHADER_CONSTANT_330_Z)\nXE_GPU_REGISTER(0x452B, kFloat, SHADER_CONSTANT_330_W)\nXE_GPU_REGISTER(0x452C, kFloat, SHADER_CONSTANT_331_X)\nXE_GPU_REGISTER(0x452D, kFloat, SHADER_CONSTANT_331_Y)\nXE_GPU_REGISTER(0x452E, kFloat, SHADER_CONSTANT_331_Z)\nXE_GPU_REGISTER(0x452F, kFloat, SHADER_CONSTANT_331_W)\nXE_GPU_REGISTER(0x4530, kFloat, SHADER_CONSTANT_332_X)\nXE_GPU_REGISTER(0x4531, kFloat, SHADER_CONSTANT_332_Y)\nXE_GPU_REGISTER(0x4532, kFloat, SHADER_CONSTANT_332_Z)\nXE_GPU_REGISTER(0x4533, kFloat, SHADER_CONSTANT_332_W)\nXE_GPU_REGISTER(0x4534, kFloat, SHADER_CONSTANT_333_X)\nXE_GPU_REGISTER(0x4535, kFloat, SHADER_CONSTANT_333_Y)\nXE_GPU_REGISTER(0x4536, kFloat, SHADER_CONSTANT_333_Z)\nXE_GPU_REGISTER(0x4537, kFloat, SHADER_CONSTANT_333_W)\nXE_GPU_REGISTER(0x4538, kFloat, SHADER_CONSTANT_334_X)\nXE_GPU_REGISTER(0x4539, kFloat, SHADER_CONSTANT_334_Y)\nXE_GPU_REGISTER(0x453A, kFloat, SHADER_CONSTANT_334_Z)\nXE_GPU_REGISTER(0x453B, kFloat, SHADER_CONSTANT_334_W)\nXE_GPU_REGISTER(0x453C, kFloat, SHADER_CONSTANT_335_X)\nXE_GPU_REGISTER(0x453D, kFloat, SHADER_CONSTANT_335_Y)\nXE_GPU_REGISTER(0x453E, kFloat, SHADER_CONSTANT_335_Z)\nXE_GPU_REGISTER(0x453F, kFloat, SHADER_CONSTANT_335_W)\nXE_GPU_REGISTER(0x4540, kFloat, SHADER_CONSTANT_336_X)\nXE_GPU_REGISTER(0x4541, kFloat, SHADER_CONSTANT_336_Y)\nXE_GPU_REGISTER(0x4542, kFloat, SHADER_CONSTANT_336_Z)\nXE_GPU_REGISTER(0x4543, kFloat, SHADER_CONSTANT_336_W)\nXE_GPU_REGISTER(0x4544, kFloat, SHADER_CONSTANT_337_X)\nXE_GPU_REGISTER(0x4545, kFloat, SHADER_CONSTANT_337_Y)\nXE_GPU_REGISTER(0x4546, kFloat, SHADER_CONSTANT_337_Z)\nXE_GPU_REGISTER(0x4547, kFloat, SHADER_CONSTANT_337_W)\nXE_GPU_REGISTER(0x4548, kFloat, SHADER_CONSTANT_338_X)\nXE_GPU_REGISTER(0x4549, kFloat, SHADER_CONSTANT_338_Y)\nXE_GPU_REGISTER(0x454A, kFloat, SHADER_CONSTANT_338_Z)\nXE_GPU_REGISTER(0x454B, kFloat, SHADER_CONSTANT_338_W)\nXE_GPU_REGISTER(0x454C, kFloat, SHADER_CONSTANT_339_X)\nXE_GPU_REGISTER(0x454D, kFloat, SHADER_CONSTANT_339_Y)\nXE_GPU_REGISTER(0x454E, kFloat, SHADER_CONSTANT_339_Z)\nXE_GPU_REGISTER(0x454F, kFloat, SHADER_CONSTANT_339_W)\nXE_GPU_REGISTER(0x4550, kFloat, SHADER_CONSTANT_340_X)\nXE_GPU_REGISTER(0x4551, kFloat, SHADER_CONSTANT_340_Y)\nXE_GPU_REGISTER(0x4552, kFloat, SHADER_CONSTANT_340_Z)\nXE_GPU_REGISTER(0x4553, kFloat, SHADER_CONSTANT_340_W)\nXE_GPU_REGISTER(0x4554, kFloat, SHADER_CONSTANT_341_X)\nXE_GPU_REGISTER(0x4555, kFloat, SHADER_CONSTANT_341_Y)\nXE_GPU_REGISTER(0x4556, kFloat, SHADER_CONSTANT_341_Z)\nXE_GPU_REGISTER(0x4557, kFloat, SHADER_CONSTANT_341_W)\nXE_GPU_REGISTER(0x4558, kFloat, SHADER_CONSTANT_342_X)\nXE_GPU_REGISTER(0x4559, kFloat, SHADER_CONSTANT_342_Y)\nXE_GPU_REGISTER(0x455A, kFloat, SHADER_CONSTANT_342_Z)\nXE_GPU_REGISTER(0x455B, kFloat, SHADER_CONSTANT_342_W)\nXE_GPU_REGISTER(0x455C, kFloat, SHADER_CONSTANT_343_X)\nXE_GPU_REGISTER(0x455D, kFloat, SHADER_CONSTANT_343_Y)\nXE_GPU_REGISTER(0x455E, kFloat, SHADER_CONSTANT_343_Z)\nXE_GPU_REGISTER(0x455F, kFloat, SHADER_CONSTANT_343_W)\nXE_GPU_REGISTER(0x4560, kFloat, SHADER_CONSTANT_344_X)\nXE_GPU_REGISTER(0x4561, kFloat, SHADER_CONSTANT_344_Y)\nXE_GPU_REGISTER(0x4562, kFloat, SHADER_CONSTANT_344_Z)\nXE_GPU_REGISTER(0x4563, kFloat, SHADER_CONSTANT_344_W)\nXE_GPU_REGISTER(0x4564, kFloat, SHADER_CONSTANT_345_X)\nXE_GPU_REGISTER(0x4565, kFloat, SHADER_CONSTANT_345_Y)\nXE_GPU_REGISTER(0x4566, kFloat, SHADER_CONSTANT_345_Z)\nXE_GPU_REGISTER(0x4567, kFloat, SHADER_CONSTANT_345_W)\nXE_GPU_REGISTER(0x4568, kFloat, SHADER_CONSTANT_346_X)\nXE_GPU_REGISTER(0x4569, kFloat, SHADER_CONSTANT_346_Y)\nXE_GPU_REGISTER(0x456A, kFloat, SHADER_CONSTANT_346_Z)\nXE_GPU_REGISTER(0x456B, kFloat, SHADER_CONSTANT_346_W)\nXE_GPU_REGISTER(0x456C, kFloat, SHADER_CONSTANT_347_X)\nXE_GPU_REGISTER(0x456D, kFloat, SHADER_CONSTANT_347_Y)\nXE_GPU_REGISTER(0x456E, kFloat, SHADER_CONSTANT_347_Z)\nXE_GPU_REGISTER(0x456F, kFloat, SHADER_CONSTANT_347_W)\nXE_GPU_REGISTER(0x4570, kFloat, SHADER_CONSTANT_348_X)\nXE_GPU_REGISTER(0x4571, kFloat, SHADER_CONSTANT_348_Y)\nXE_GPU_REGISTER(0x4572, kFloat, SHADER_CONSTANT_348_Z)\nXE_GPU_REGISTER(0x4573, kFloat, SHADER_CONSTANT_348_W)\nXE_GPU_REGISTER(0x4574, kFloat, SHADER_CONSTANT_349_X)\nXE_GPU_REGISTER(0x4575, kFloat, SHADER_CONSTANT_349_Y)\nXE_GPU_REGISTER(0x4576, kFloat, SHADER_CONSTANT_349_Z)\nXE_GPU_REGISTER(0x4577, kFloat, SHADER_CONSTANT_349_W)\nXE_GPU_REGISTER(0x4578, kFloat, SHADER_CONSTANT_350_X)\nXE_GPU_REGISTER(0x4579, kFloat, SHADER_CONSTANT_350_Y)\nXE_GPU_REGISTER(0x457A, kFloat, SHADER_CONSTANT_350_Z)\nXE_GPU_REGISTER(0x457B, kFloat, SHADER_CONSTANT_350_W)\nXE_GPU_REGISTER(0x457C, kFloat, SHADER_CONSTANT_351_X)\nXE_GPU_REGISTER(0x457D, kFloat, SHADER_CONSTANT_351_Y)\nXE_GPU_REGISTER(0x457E, kFloat, SHADER_CONSTANT_351_Z)\nXE_GPU_REGISTER(0x457F, kFloat, SHADER_CONSTANT_351_W)\nXE_GPU_REGISTER(0x4580, kFloat, SHADER_CONSTANT_352_X)\nXE_GPU_REGISTER(0x4581, kFloat, SHADER_CONSTANT_352_Y)\nXE_GPU_REGISTER(0x4582, kFloat, SHADER_CONSTANT_352_Z)\nXE_GPU_REGISTER(0x4583, kFloat, SHADER_CONSTANT_352_W)\nXE_GPU_REGISTER(0x4584, kFloat, SHADER_CONSTANT_353_X)\nXE_GPU_REGISTER(0x4585, kFloat, SHADER_CONSTANT_353_Y)\nXE_GPU_REGISTER(0x4586, kFloat, SHADER_CONSTANT_353_Z)\nXE_GPU_REGISTER(0x4587, kFloat, SHADER_CONSTANT_353_W)\nXE_GPU_REGISTER(0x4588, kFloat, SHADER_CONSTANT_354_X)\nXE_GPU_REGISTER(0x4589, kFloat, SHADER_CONSTANT_354_Y)\nXE_GPU_REGISTER(0x458A, kFloat, SHADER_CONSTANT_354_Z)\nXE_GPU_REGISTER(0x458B, kFloat, SHADER_CONSTANT_354_W)\nXE_GPU_REGISTER(0x458C, kFloat, SHADER_CONSTANT_355_X)\nXE_GPU_REGISTER(0x458D, kFloat, SHADER_CONSTANT_355_Y)\nXE_GPU_REGISTER(0x458E, kFloat, SHADER_CONSTANT_355_Z)\nXE_GPU_REGISTER(0x458F, kFloat, SHADER_CONSTANT_355_W)\nXE_GPU_REGISTER(0x4590, kFloat, SHADER_CONSTANT_356_X)\nXE_GPU_REGISTER(0x4591, kFloat, SHADER_CONSTANT_356_Y)\nXE_GPU_REGISTER(0x4592, kFloat, SHADER_CONSTANT_356_Z)\nXE_GPU_REGISTER(0x4593, kFloat, SHADER_CONSTANT_356_W)\nXE_GPU_REGISTER(0x4594, kFloat, SHADER_CONSTANT_357_X)\nXE_GPU_REGISTER(0x4595, kFloat, SHADER_CONSTANT_357_Y)\nXE_GPU_REGISTER(0x4596, kFloat, SHADER_CONSTANT_357_Z)\nXE_GPU_REGISTER(0x4597, kFloat, SHADER_CONSTANT_357_W)\nXE_GPU_REGISTER(0x4598, kFloat, SHADER_CONSTANT_358_X)\nXE_GPU_REGISTER(0x4599, kFloat, SHADER_CONSTANT_358_Y)\nXE_GPU_REGISTER(0x459A, kFloat, SHADER_CONSTANT_358_Z)\nXE_GPU_REGISTER(0x459B, kFloat, SHADER_CONSTANT_358_W)\nXE_GPU_REGISTER(0x459C, kFloat, SHADER_CONSTANT_359_X)\nXE_GPU_REGISTER(0x459D, kFloat, SHADER_CONSTANT_359_Y)\nXE_GPU_REGISTER(0x459E, kFloat, SHADER_CONSTANT_359_Z)\nXE_GPU_REGISTER(0x459F, kFloat, SHADER_CONSTANT_359_W)\nXE_GPU_REGISTER(0x45A0, kFloat, SHADER_CONSTANT_360_X)\nXE_GPU_REGISTER(0x45A1, kFloat, SHADER_CONSTANT_360_Y)\nXE_GPU_REGISTER(0x45A2, kFloat, SHADER_CONSTANT_360_Z)\nXE_GPU_REGISTER(0x45A3, kFloat, SHADER_CONSTANT_360_W)\nXE_GPU_REGISTER(0x45A4, kFloat, SHADER_CONSTANT_361_X)\nXE_GPU_REGISTER(0x45A5, kFloat, SHADER_CONSTANT_361_Y)\nXE_GPU_REGISTER(0x45A6, kFloat, SHADER_CONSTANT_361_Z)\nXE_GPU_REGISTER(0x45A7, kFloat, SHADER_CONSTANT_361_W)\nXE_GPU_REGISTER(0x45A8, kFloat, SHADER_CONSTANT_362_X)\nXE_GPU_REGISTER(0x45A9, kFloat, SHADER_CONSTANT_362_Y)\nXE_GPU_REGISTER(0x45AA, kFloat, SHADER_CONSTANT_362_Z)\nXE_GPU_REGISTER(0x45AB, kFloat, SHADER_CONSTANT_362_W)\nXE_GPU_REGISTER(0x45AC, kFloat, SHADER_CONSTANT_363_X)\nXE_GPU_REGISTER(0x45AD, kFloat, SHADER_CONSTANT_363_Y)\nXE_GPU_REGISTER(0x45AE, kFloat, SHADER_CONSTANT_363_Z)\nXE_GPU_REGISTER(0x45AF, kFloat, SHADER_CONSTANT_363_W)\nXE_GPU_REGISTER(0x45B0, kFloat, SHADER_CONSTANT_364_X)\nXE_GPU_REGISTER(0x45B1, kFloat, SHADER_CONSTANT_364_Y)\nXE_GPU_REGISTER(0x45B2, kFloat, SHADER_CONSTANT_364_Z)\nXE_GPU_REGISTER(0x45B3, kFloat, SHADER_CONSTANT_364_W)\nXE_GPU_REGISTER(0x45B4, kFloat, SHADER_CONSTANT_365_X)\nXE_GPU_REGISTER(0x45B5, kFloat, SHADER_CONSTANT_365_Y)\nXE_GPU_REGISTER(0x45B6, kFloat, SHADER_CONSTANT_365_Z)\nXE_GPU_REGISTER(0x45B7, kFloat, SHADER_CONSTANT_365_W)\nXE_GPU_REGISTER(0x45B8, kFloat, SHADER_CONSTANT_366_X)\nXE_GPU_REGISTER(0x45B9, kFloat, SHADER_CONSTANT_366_Y)\nXE_GPU_REGISTER(0x45BA, kFloat, SHADER_CONSTANT_366_Z)\nXE_GPU_REGISTER(0x45BB, kFloat, SHADER_CONSTANT_366_W)\nXE_GPU_REGISTER(0x45BC, kFloat, SHADER_CONSTANT_367_X)\nXE_GPU_REGISTER(0x45BD, kFloat, SHADER_CONSTANT_367_Y)\nXE_GPU_REGISTER(0x45BE, kFloat, SHADER_CONSTANT_367_Z)\nXE_GPU_REGISTER(0x45BF, kFloat, SHADER_CONSTANT_367_W)\nXE_GPU_REGISTER(0x45C0, kFloat, SHADER_CONSTANT_368_X)\nXE_GPU_REGISTER(0x45C1, kFloat, SHADER_CONSTANT_368_Y)\nXE_GPU_REGISTER(0x45C2, kFloat, SHADER_CONSTANT_368_Z)\nXE_GPU_REGISTER(0x45C3, kFloat, SHADER_CONSTANT_368_W)\nXE_GPU_REGISTER(0x45C4, kFloat, SHADER_CONSTANT_369_X)\nXE_GPU_REGISTER(0x45C5, kFloat, SHADER_CONSTANT_369_Y)\nXE_GPU_REGISTER(0x45C6, kFloat, SHADER_CONSTANT_369_Z)\nXE_GPU_REGISTER(0x45C7, kFloat, SHADER_CONSTANT_369_W)\nXE_GPU_REGISTER(0x45C8, kFloat, SHADER_CONSTANT_370_X)\nXE_GPU_REGISTER(0x45C9, kFloat, SHADER_CONSTANT_370_Y)\nXE_GPU_REGISTER(0x45CA, kFloat, SHADER_CONSTANT_370_Z)\nXE_GPU_REGISTER(0x45CB, kFloat, SHADER_CONSTANT_370_W)\nXE_GPU_REGISTER(0x45CC, kFloat, SHADER_CONSTANT_371_X)\nXE_GPU_REGISTER(0x45CD, kFloat, SHADER_CONSTANT_371_Y)\nXE_GPU_REGISTER(0x45CE, kFloat, SHADER_CONSTANT_371_Z)\nXE_GPU_REGISTER(0x45CF, kFloat, SHADER_CONSTANT_371_W)\nXE_GPU_REGISTER(0x45D0, kFloat, SHADER_CONSTANT_372_X)\nXE_GPU_REGISTER(0x45D1, kFloat, SHADER_CONSTANT_372_Y)\nXE_GPU_REGISTER(0x45D2, kFloat, SHADER_CONSTANT_372_Z)\nXE_GPU_REGISTER(0x45D3, kFloat, SHADER_CONSTANT_372_W)\nXE_GPU_REGISTER(0x45D4, kFloat, SHADER_CONSTANT_373_X)\nXE_GPU_REGISTER(0x45D5, kFloat, SHADER_CONSTANT_373_Y)\nXE_GPU_REGISTER(0x45D6, kFloat, SHADER_CONSTANT_373_Z)\nXE_GPU_REGISTER(0x45D7, kFloat, SHADER_CONSTANT_373_W)\nXE_GPU_REGISTER(0x45D8, kFloat, SHADER_CONSTANT_374_X)\nXE_GPU_REGISTER(0x45D9, kFloat, SHADER_CONSTANT_374_Y)\nXE_GPU_REGISTER(0x45DA, kFloat, SHADER_CONSTANT_374_Z)\nXE_GPU_REGISTER(0x45DB, kFloat, SHADER_CONSTANT_374_W)\nXE_GPU_REGISTER(0x45DC, kFloat, SHADER_CONSTANT_375_X)\nXE_GPU_REGISTER(0x45DD, kFloat, SHADER_CONSTANT_375_Y)\nXE_GPU_REGISTER(0x45DE, kFloat, SHADER_CONSTANT_375_Z)\nXE_GPU_REGISTER(0x45DF, kFloat, SHADER_CONSTANT_375_W)\nXE_GPU_REGISTER(0x45E0, kFloat, SHADER_CONSTANT_376_X)\nXE_GPU_REGISTER(0x45E1, kFloat, SHADER_CONSTANT_376_Y)\nXE_GPU_REGISTER(0x45E2, kFloat, SHADER_CONSTANT_376_Z)\nXE_GPU_REGISTER(0x45E3, kFloat, SHADER_CONSTANT_376_W)\nXE_GPU_REGISTER(0x45E4, kFloat, SHADER_CONSTANT_377_X)\nXE_GPU_REGISTER(0x45E5, kFloat, SHADER_CONSTANT_377_Y)\nXE_GPU_REGISTER(0x45E6, kFloat, SHADER_CONSTANT_377_Z)\nXE_GPU_REGISTER(0x45E7, kFloat, SHADER_CONSTANT_377_W)\nXE_GPU_REGISTER(0x45E8, kFloat, SHADER_CONSTANT_378_X)\nXE_GPU_REGISTER(0x45E9, kFloat, SHADER_CONSTANT_378_Y)\nXE_GPU_REGISTER(0x45EA, kFloat, SHADER_CONSTANT_378_Z)\nXE_GPU_REGISTER(0x45EB, kFloat, SHADER_CONSTANT_378_W)\nXE_GPU_REGISTER(0x45EC, kFloat, SHADER_CONSTANT_379_X)\nXE_GPU_REGISTER(0x45ED, kFloat, SHADER_CONSTANT_379_Y)\nXE_GPU_REGISTER(0x45EE, kFloat, SHADER_CONSTANT_379_Z)\nXE_GPU_REGISTER(0x45EF, kFloat, SHADER_CONSTANT_379_W)\nXE_GPU_REGISTER(0x45F0, kFloat, SHADER_CONSTANT_380_X)\nXE_GPU_REGISTER(0x45F1, kFloat, SHADER_CONSTANT_380_Y)\nXE_GPU_REGISTER(0x45F2, kFloat, SHADER_CONSTANT_380_Z)\nXE_GPU_REGISTER(0x45F3, kFloat, SHADER_CONSTANT_380_W)\nXE_GPU_REGISTER(0x45F4, kFloat, SHADER_CONSTANT_381_X)\nXE_GPU_REGISTER(0x45F5, kFloat, SHADER_CONSTANT_381_Y)\nXE_GPU_REGISTER(0x45F6, kFloat, SHADER_CONSTANT_381_Z)\nXE_GPU_REGISTER(0x45F7, kFloat, SHADER_CONSTANT_381_W)\nXE_GPU_REGISTER(0x45F8, kFloat, SHADER_CONSTANT_382_X)\nXE_GPU_REGISTER(0x45F9, kFloat, SHADER_CONSTANT_382_Y)\nXE_GPU_REGISTER(0x45FA, kFloat, SHADER_CONSTANT_382_Z)\nXE_GPU_REGISTER(0x45FB, kFloat, SHADER_CONSTANT_382_W)\nXE_GPU_REGISTER(0x45FC, kFloat, SHADER_CONSTANT_383_X)\nXE_GPU_REGISTER(0x45FD, kFloat, SHADER_CONSTANT_383_Y)\nXE_GPU_REGISTER(0x45FE, kFloat, SHADER_CONSTANT_383_Z)\nXE_GPU_REGISTER(0x45FF, kFloat, SHADER_CONSTANT_383_W)\nXE_GPU_REGISTER(0x4600, kFloat, SHADER_CONSTANT_384_X)\nXE_GPU_REGISTER(0x4601, kFloat, SHADER_CONSTANT_384_Y)\nXE_GPU_REGISTER(0x4602, kFloat, SHADER_CONSTANT_384_Z)\nXE_GPU_REGISTER(0x4603, kFloat, SHADER_CONSTANT_384_W)\nXE_GPU_REGISTER(0x4604, kFloat, SHADER_CONSTANT_385_X)\nXE_GPU_REGISTER(0x4605, kFloat, SHADER_CONSTANT_385_Y)\nXE_GPU_REGISTER(0x4606, kFloat, SHADER_CONSTANT_385_Z)\nXE_GPU_REGISTER(0x4607, kFloat, SHADER_CONSTANT_385_W)\nXE_GPU_REGISTER(0x4608, kFloat, SHADER_CONSTANT_386_X)\nXE_GPU_REGISTER(0x4609, kFloat, SHADER_CONSTANT_386_Y)\nXE_GPU_REGISTER(0x460A, kFloat, SHADER_CONSTANT_386_Z)\nXE_GPU_REGISTER(0x460B, kFloat, SHADER_CONSTANT_386_W)\nXE_GPU_REGISTER(0x460C, kFloat, SHADER_CONSTANT_387_X)\nXE_GPU_REGISTER(0x460D, kFloat, SHADER_CONSTANT_387_Y)\nXE_GPU_REGISTER(0x460E, kFloat, SHADER_CONSTANT_387_Z)\nXE_GPU_REGISTER(0x460F, kFloat, SHADER_CONSTANT_387_W)\nXE_GPU_REGISTER(0x4610, kFloat, SHADER_CONSTANT_388_X)\nXE_GPU_REGISTER(0x4611, kFloat, SHADER_CONSTANT_388_Y)\nXE_GPU_REGISTER(0x4612, kFloat, SHADER_CONSTANT_388_Z)\nXE_GPU_REGISTER(0x4613, kFloat, SHADER_CONSTANT_388_W)\nXE_GPU_REGISTER(0x4614, kFloat, SHADER_CONSTANT_389_X)\nXE_GPU_REGISTER(0x4615, kFloat, SHADER_CONSTANT_389_Y)\nXE_GPU_REGISTER(0x4616, kFloat, SHADER_CONSTANT_389_Z)\nXE_GPU_REGISTER(0x4617, kFloat, SHADER_CONSTANT_389_W)\nXE_GPU_REGISTER(0x4618, kFloat, SHADER_CONSTANT_390_X)\nXE_GPU_REGISTER(0x4619, kFloat, SHADER_CONSTANT_390_Y)\nXE_GPU_REGISTER(0x461A, kFloat, SHADER_CONSTANT_390_Z)\nXE_GPU_REGISTER(0x461B, kFloat, SHADER_CONSTANT_390_W)\nXE_GPU_REGISTER(0x461C, kFloat, SHADER_CONSTANT_391_X)\nXE_GPU_REGISTER(0x461D, kFloat, SHADER_CONSTANT_391_Y)\nXE_GPU_REGISTER(0x461E, kFloat, SHADER_CONSTANT_391_Z)\nXE_GPU_REGISTER(0x461F, kFloat, SHADER_CONSTANT_391_W)\nXE_GPU_REGISTER(0x4620, kFloat, SHADER_CONSTANT_392_X)\nXE_GPU_REGISTER(0x4621, kFloat, SHADER_CONSTANT_392_Y)\nXE_GPU_REGISTER(0x4622, kFloat, SHADER_CONSTANT_392_Z)\nXE_GPU_REGISTER(0x4623, kFloat, SHADER_CONSTANT_392_W)\nXE_GPU_REGISTER(0x4624, kFloat, SHADER_CONSTANT_393_X)\nXE_GPU_REGISTER(0x4625, kFloat, SHADER_CONSTANT_393_Y)\nXE_GPU_REGISTER(0x4626, kFloat, SHADER_CONSTANT_393_Z)\nXE_GPU_REGISTER(0x4627, kFloat, SHADER_CONSTANT_393_W)\nXE_GPU_REGISTER(0x4628, kFloat, SHADER_CONSTANT_394_X)\nXE_GPU_REGISTER(0x4629, kFloat, SHADER_CONSTANT_394_Y)\nXE_GPU_REGISTER(0x462A, kFloat, SHADER_CONSTANT_394_Z)\nXE_GPU_REGISTER(0x462B, kFloat, SHADER_CONSTANT_394_W)\nXE_GPU_REGISTER(0x462C, kFloat, SHADER_CONSTANT_395_X)\nXE_GPU_REGISTER(0x462D, kFloat, SHADER_CONSTANT_395_Y)\nXE_GPU_REGISTER(0x462E, kFloat, SHADER_CONSTANT_395_Z)\nXE_GPU_REGISTER(0x462F, kFloat, SHADER_CONSTANT_395_W)\nXE_GPU_REGISTER(0x4630, kFloat, SHADER_CONSTANT_396_X)\nXE_GPU_REGISTER(0x4631, kFloat, SHADER_CONSTANT_396_Y)\nXE_GPU_REGISTER(0x4632, kFloat, SHADER_CONSTANT_396_Z)\nXE_GPU_REGISTER(0x4633, kFloat, SHADER_CONSTANT_396_W)\nXE_GPU_REGISTER(0x4634, kFloat, SHADER_CONSTANT_397_X)\nXE_GPU_REGISTER(0x4635, kFloat, SHADER_CONSTANT_397_Y)\nXE_GPU_REGISTER(0x4636, kFloat, SHADER_CONSTANT_397_Z)\nXE_GPU_REGISTER(0x4637, kFloat, SHADER_CONSTANT_397_W)\nXE_GPU_REGISTER(0x4638, kFloat, SHADER_CONSTANT_398_X)\nXE_GPU_REGISTER(0x4639, kFloat, SHADER_CONSTANT_398_Y)\nXE_GPU_REGISTER(0x463A, kFloat, SHADER_CONSTANT_398_Z)\nXE_GPU_REGISTER(0x463B, kFloat, SHADER_CONSTANT_398_W)\nXE_GPU_REGISTER(0x463C, kFloat, SHADER_CONSTANT_399_X)\nXE_GPU_REGISTER(0x463D, kFloat, SHADER_CONSTANT_399_Y)\nXE_GPU_REGISTER(0x463E, kFloat, SHADER_CONSTANT_399_Z)\nXE_GPU_REGISTER(0x463F, kFloat, SHADER_CONSTANT_399_W)\nXE_GPU_REGISTER(0x4640, kFloat, SHADER_CONSTANT_400_X)\nXE_GPU_REGISTER(0x4641, kFloat, SHADER_CONSTANT_400_Y)\nXE_GPU_REGISTER(0x4642, kFloat, SHADER_CONSTANT_400_Z)\nXE_GPU_REGISTER(0x4643, kFloat, SHADER_CONSTANT_400_W)\nXE_GPU_REGISTER(0x4644, kFloat, SHADER_CONSTANT_401_X)\nXE_GPU_REGISTER(0x4645, kFloat, SHADER_CONSTANT_401_Y)\nXE_GPU_REGISTER(0x4646, kFloat, SHADER_CONSTANT_401_Z)\nXE_GPU_REGISTER(0x4647, kFloat, SHADER_CONSTANT_401_W)\nXE_GPU_REGISTER(0x4648, kFloat, SHADER_CONSTANT_402_X)\nXE_GPU_REGISTER(0x4649, kFloat, SHADER_CONSTANT_402_Y)\nXE_GPU_REGISTER(0x464A, kFloat, SHADER_CONSTANT_402_Z)\nXE_GPU_REGISTER(0x464B, kFloat, SHADER_CONSTANT_402_W)\nXE_GPU_REGISTER(0x464C, kFloat, SHADER_CONSTANT_403_X)\nXE_GPU_REGISTER(0x464D, kFloat, SHADER_CONSTANT_403_Y)\nXE_GPU_REGISTER(0x464E, kFloat, SHADER_CONSTANT_403_Z)\nXE_GPU_REGISTER(0x464F, kFloat, SHADER_CONSTANT_403_W)\nXE_GPU_REGISTER(0x4650, kFloat, SHADER_CONSTANT_404_X)\nXE_GPU_REGISTER(0x4651, kFloat, SHADER_CONSTANT_404_Y)\nXE_GPU_REGISTER(0x4652, kFloat, SHADER_CONSTANT_404_Z)\nXE_GPU_REGISTER(0x4653, kFloat, SHADER_CONSTANT_404_W)\nXE_GPU_REGISTER(0x4654, kFloat, SHADER_CONSTANT_405_X)\nXE_GPU_REGISTER(0x4655, kFloat, SHADER_CONSTANT_405_Y)\nXE_GPU_REGISTER(0x4656, kFloat, SHADER_CONSTANT_405_Z)\nXE_GPU_REGISTER(0x4657, kFloat, SHADER_CONSTANT_405_W)\nXE_GPU_REGISTER(0x4658, kFloat, SHADER_CONSTANT_406_X)\nXE_GPU_REGISTER(0x4659, kFloat, SHADER_CONSTANT_406_Y)\nXE_GPU_REGISTER(0x465A, kFloat, SHADER_CONSTANT_406_Z)\nXE_GPU_REGISTER(0x465B, kFloat, SHADER_CONSTANT_406_W)\nXE_GPU_REGISTER(0x465C, kFloat, SHADER_CONSTANT_407_X)\nXE_GPU_REGISTER(0x465D, kFloat, SHADER_CONSTANT_407_Y)\nXE_GPU_REGISTER(0x465E, kFloat, SHADER_CONSTANT_407_Z)\nXE_GPU_REGISTER(0x465F, kFloat, SHADER_CONSTANT_407_W)\nXE_GPU_REGISTER(0x4660, kFloat, SHADER_CONSTANT_408_X)\nXE_GPU_REGISTER(0x4661, kFloat, SHADER_CONSTANT_408_Y)\nXE_GPU_REGISTER(0x4662, kFloat, SHADER_CONSTANT_408_Z)\nXE_GPU_REGISTER(0x4663, kFloat, SHADER_CONSTANT_408_W)\nXE_GPU_REGISTER(0x4664, kFloat, SHADER_CONSTANT_409_X)\nXE_GPU_REGISTER(0x4665, kFloat, SHADER_CONSTANT_409_Y)\nXE_GPU_REGISTER(0x4666, kFloat, SHADER_CONSTANT_409_Z)\nXE_GPU_REGISTER(0x4667, kFloat, SHADER_CONSTANT_409_W)\nXE_GPU_REGISTER(0x4668, kFloat, SHADER_CONSTANT_410_X)\nXE_GPU_REGISTER(0x4669, kFloat, SHADER_CONSTANT_410_Y)\nXE_GPU_REGISTER(0x466A, kFloat, SHADER_CONSTANT_410_Z)\nXE_GPU_REGISTER(0x466B, kFloat, SHADER_CONSTANT_410_W)\nXE_GPU_REGISTER(0x466C, kFloat, SHADER_CONSTANT_411_X)\nXE_GPU_REGISTER(0x466D, kFloat, SHADER_CONSTANT_411_Y)\nXE_GPU_REGISTER(0x466E, kFloat, SHADER_CONSTANT_411_Z)\nXE_GPU_REGISTER(0x466F, kFloat, SHADER_CONSTANT_411_W)\nXE_GPU_REGISTER(0x4670, kFloat, SHADER_CONSTANT_412_X)\nXE_GPU_REGISTER(0x4671, kFloat, SHADER_CONSTANT_412_Y)\nXE_GPU_REGISTER(0x4672, kFloat, SHADER_CONSTANT_412_Z)\nXE_GPU_REGISTER(0x4673, kFloat, SHADER_CONSTANT_412_W)\nXE_GPU_REGISTER(0x4674, kFloat, SHADER_CONSTANT_413_X)\nXE_GPU_REGISTER(0x4675, kFloat, SHADER_CONSTANT_413_Y)\nXE_GPU_REGISTER(0x4676, kFloat, SHADER_CONSTANT_413_Z)\nXE_GPU_REGISTER(0x4677, kFloat, SHADER_CONSTANT_413_W)\nXE_GPU_REGISTER(0x4678, kFloat, SHADER_CONSTANT_414_X)\nXE_GPU_REGISTER(0x4679, kFloat, SHADER_CONSTANT_414_Y)\nXE_GPU_REGISTER(0x467A, kFloat, SHADER_CONSTANT_414_Z)\nXE_GPU_REGISTER(0x467B, kFloat, SHADER_CONSTANT_414_W)\nXE_GPU_REGISTER(0x467C, kFloat, SHADER_CONSTANT_415_X)\nXE_GPU_REGISTER(0x467D, kFloat, SHADER_CONSTANT_415_Y)\nXE_GPU_REGISTER(0x467E, kFloat, SHADER_CONSTANT_415_Z)\nXE_GPU_REGISTER(0x467F, kFloat, SHADER_CONSTANT_415_W)\nXE_GPU_REGISTER(0x4680, kFloat, SHADER_CONSTANT_416_X)\nXE_GPU_REGISTER(0x4681, kFloat, SHADER_CONSTANT_416_Y)\nXE_GPU_REGISTER(0x4682, kFloat, SHADER_CONSTANT_416_Z)\nXE_GPU_REGISTER(0x4683, kFloat, SHADER_CONSTANT_416_W)\nXE_GPU_REGISTER(0x4684, kFloat, SHADER_CONSTANT_417_X)\nXE_GPU_REGISTER(0x4685, kFloat, SHADER_CONSTANT_417_Y)\nXE_GPU_REGISTER(0x4686, kFloat, SHADER_CONSTANT_417_Z)\nXE_GPU_REGISTER(0x4687, kFloat, SHADER_CONSTANT_417_W)\nXE_GPU_REGISTER(0x4688, kFloat, SHADER_CONSTANT_418_X)\nXE_GPU_REGISTER(0x4689, kFloat, SHADER_CONSTANT_418_Y)\nXE_GPU_REGISTER(0x468A, kFloat, SHADER_CONSTANT_418_Z)\nXE_GPU_REGISTER(0x468B, kFloat, SHADER_CONSTANT_418_W)\nXE_GPU_REGISTER(0x468C, kFloat, SHADER_CONSTANT_419_X)\nXE_GPU_REGISTER(0x468D, kFloat, SHADER_CONSTANT_419_Y)\nXE_GPU_REGISTER(0x468E, kFloat, SHADER_CONSTANT_419_Z)\nXE_GPU_REGISTER(0x468F, kFloat, SHADER_CONSTANT_419_W)\nXE_GPU_REGISTER(0x4690, kFloat, SHADER_CONSTANT_420_X)\nXE_GPU_REGISTER(0x4691, kFloat, SHADER_CONSTANT_420_Y)\nXE_GPU_REGISTER(0x4692, kFloat, SHADER_CONSTANT_420_Z)\nXE_GPU_REGISTER(0x4693, kFloat, SHADER_CONSTANT_420_W)\nXE_GPU_REGISTER(0x4694, kFloat, SHADER_CONSTANT_421_X)\nXE_GPU_REGISTER(0x4695, kFloat, SHADER_CONSTANT_421_Y)\nXE_GPU_REGISTER(0x4696, kFloat, SHADER_CONSTANT_421_Z)\nXE_GPU_REGISTER(0x4697, kFloat, SHADER_CONSTANT_421_W)\nXE_GPU_REGISTER(0x4698, kFloat, SHADER_CONSTANT_422_X)\nXE_GPU_REGISTER(0x4699, kFloat, SHADER_CONSTANT_422_Y)\nXE_GPU_REGISTER(0x469A, kFloat, SHADER_CONSTANT_422_Z)\nXE_GPU_REGISTER(0x469B, kFloat, SHADER_CONSTANT_422_W)\nXE_GPU_REGISTER(0x469C, kFloat, SHADER_CONSTANT_423_X)\nXE_GPU_REGISTER(0x469D, kFloat, SHADER_CONSTANT_423_Y)\nXE_GPU_REGISTER(0x469E, kFloat, SHADER_CONSTANT_423_Z)\nXE_GPU_REGISTER(0x469F, kFloat, SHADER_CONSTANT_423_W)\nXE_GPU_REGISTER(0x46A0, kFloat, SHADER_CONSTANT_424_X)\nXE_GPU_REGISTER(0x46A1, kFloat, SHADER_CONSTANT_424_Y)\nXE_GPU_REGISTER(0x46A2, kFloat, SHADER_CONSTANT_424_Z)\nXE_GPU_REGISTER(0x46A3, kFloat, SHADER_CONSTANT_424_W)\nXE_GPU_REGISTER(0x46A4, kFloat, SHADER_CONSTANT_425_X)\nXE_GPU_REGISTER(0x46A5, kFloat, SHADER_CONSTANT_425_Y)\nXE_GPU_REGISTER(0x46A6, kFloat, SHADER_CONSTANT_425_Z)\nXE_GPU_REGISTER(0x46A7, kFloat, SHADER_CONSTANT_425_W)\nXE_GPU_REGISTER(0x46A8, kFloat, SHADER_CONSTANT_426_X)\nXE_GPU_REGISTER(0x46A9, kFloat, SHADER_CONSTANT_426_Y)\nXE_GPU_REGISTER(0x46AA, kFloat, SHADER_CONSTANT_426_Z)\nXE_GPU_REGISTER(0x46AB, kFloat, SHADER_CONSTANT_426_W)\nXE_GPU_REGISTER(0x46AC, kFloat, SHADER_CONSTANT_427_X)\nXE_GPU_REGISTER(0x46AD, kFloat, SHADER_CONSTANT_427_Y)\nXE_GPU_REGISTER(0x46AE, kFloat, SHADER_CONSTANT_427_Z)\nXE_GPU_REGISTER(0x46AF, kFloat, SHADER_CONSTANT_427_W)\nXE_GPU_REGISTER(0x46B0, kFloat, SHADER_CONSTANT_428_X)\nXE_GPU_REGISTER(0x46B1, kFloat, SHADER_CONSTANT_428_Y)\nXE_GPU_REGISTER(0x46B2, kFloat, SHADER_CONSTANT_428_Z)\nXE_GPU_REGISTER(0x46B3, kFloat, SHADER_CONSTANT_428_W)\nXE_GPU_REGISTER(0x46B4, kFloat, SHADER_CONSTANT_429_X)\nXE_GPU_REGISTER(0x46B5, kFloat, SHADER_CONSTANT_429_Y)\nXE_GPU_REGISTER(0x46B6, kFloat, SHADER_CONSTANT_429_Z)\nXE_GPU_REGISTER(0x46B7, kFloat, SHADER_CONSTANT_429_W)\nXE_GPU_REGISTER(0x46B8, kFloat, SHADER_CONSTANT_430_X)\nXE_GPU_REGISTER(0x46B9, kFloat, SHADER_CONSTANT_430_Y)\nXE_GPU_REGISTER(0x46BA, kFloat, SHADER_CONSTANT_430_Z)\nXE_GPU_REGISTER(0x46BB, kFloat, SHADER_CONSTANT_430_W)\nXE_GPU_REGISTER(0x46BC, kFloat, SHADER_CONSTANT_431_X)\nXE_GPU_REGISTER(0x46BD, kFloat, SHADER_CONSTANT_431_Y)\nXE_GPU_REGISTER(0x46BE, kFloat, SHADER_CONSTANT_431_Z)\nXE_GPU_REGISTER(0x46BF, kFloat, SHADER_CONSTANT_431_W)\nXE_GPU_REGISTER(0x46C0, kFloat, SHADER_CONSTANT_432_X)\nXE_GPU_REGISTER(0x46C1, kFloat, SHADER_CONSTANT_432_Y)\nXE_GPU_REGISTER(0x46C2, kFloat, SHADER_CONSTANT_432_Z)\nXE_GPU_REGISTER(0x46C3, kFloat, SHADER_CONSTANT_432_W)\nXE_GPU_REGISTER(0x46C4, kFloat, SHADER_CONSTANT_433_X)\nXE_GPU_REGISTER(0x46C5, kFloat, SHADER_CONSTANT_433_Y)\nXE_GPU_REGISTER(0x46C6, kFloat, SHADER_CONSTANT_433_Z)\nXE_GPU_REGISTER(0x46C7, kFloat, SHADER_CONSTANT_433_W)\nXE_GPU_REGISTER(0x46C8, kFloat, SHADER_CONSTANT_434_X)\nXE_GPU_REGISTER(0x46C9, kFloat, SHADER_CONSTANT_434_Y)\nXE_GPU_REGISTER(0x46CA, kFloat, SHADER_CONSTANT_434_Z)\nXE_GPU_REGISTER(0x46CB, kFloat, SHADER_CONSTANT_434_W)\nXE_GPU_REGISTER(0x46CC, kFloat, SHADER_CONSTANT_435_X)\nXE_GPU_REGISTER(0x46CD, kFloat, SHADER_CONSTANT_435_Y)\nXE_GPU_REGISTER(0x46CE, kFloat, SHADER_CONSTANT_435_Z)\nXE_GPU_REGISTER(0x46CF, kFloat, SHADER_CONSTANT_435_W)\nXE_GPU_REGISTER(0x46D0, kFloat, SHADER_CONSTANT_436_X)\nXE_GPU_REGISTER(0x46D1, kFloat, SHADER_CONSTANT_436_Y)\nXE_GPU_REGISTER(0x46D2, kFloat, SHADER_CONSTANT_436_Z)\nXE_GPU_REGISTER(0x46D3, kFloat, SHADER_CONSTANT_436_W)\nXE_GPU_REGISTER(0x46D4, kFloat, SHADER_CONSTANT_437_X)\nXE_GPU_REGISTER(0x46D5, kFloat, SHADER_CONSTANT_437_Y)\nXE_GPU_REGISTER(0x46D6, kFloat, SHADER_CONSTANT_437_Z)\nXE_GPU_REGISTER(0x46D7, kFloat, SHADER_CONSTANT_437_W)\nXE_GPU_REGISTER(0x46D8, kFloat, SHADER_CONSTANT_438_X)\nXE_GPU_REGISTER(0x46D9, kFloat, SHADER_CONSTANT_438_Y)\nXE_GPU_REGISTER(0x46DA, kFloat, SHADER_CONSTANT_438_Z)\nXE_GPU_REGISTER(0x46DB, kFloat, SHADER_CONSTANT_438_W)\nXE_GPU_REGISTER(0x46DC, kFloat, SHADER_CONSTANT_439_X)\nXE_GPU_REGISTER(0x46DD, kFloat, SHADER_CONSTANT_439_Y)\nXE_GPU_REGISTER(0x46DE, kFloat, SHADER_CONSTANT_439_Z)\nXE_GPU_REGISTER(0x46DF, kFloat, SHADER_CONSTANT_439_W)\nXE_GPU_REGISTER(0x46E0, kFloat, SHADER_CONSTANT_440_X)\nXE_GPU_REGISTER(0x46E1, kFloat, SHADER_CONSTANT_440_Y)\nXE_GPU_REGISTER(0x46E2, kFloat, SHADER_CONSTANT_440_Z)\nXE_GPU_REGISTER(0x46E3, kFloat, SHADER_CONSTANT_440_W)\nXE_GPU_REGISTER(0x46E4, kFloat, SHADER_CONSTANT_441_X)\nXE_GPU_REGISTER(0x46E5, kFloat, SHADER_CONSTANT_441_Y)\nXE_GPU_REGISTER(0x46E6, kFloat, SHADER_CONSTANT_441_Z)\nXE_GPU_REGISTER(0x46E7, kFloat, SHADER_CONSTANT_441_W)\nXE_GPU_REGISTER(0x46E8, kFloat, SHADER_CONSTANT_442_X)\nXE_GPU_REGISTER(0x46E9, kFloat, SHADER_CONSTANT_442_Y)\nXE_GPU_REGISTER(0x46EA, kFloat, SHADER_CONSTANT_442_Z)\nXE_GPU_REGISTER(0x46EB, kFloat, SHADER_CONSTANT_442_W)\nXE_GPU_REGISTER(0x46EC, kFloat, SHADER_CONSTANT_443_X)\nXE_GPU_REGISTER(0x46ED, kFloat, SHADER_CONSTANT_443_Y)\nXE_GPU_REGISTER(0x46EE, kFloat, SHADER_CONSTANT_443_Z)\nXE_GPU_REGISTER(0x46EF, kFloat, SHADER_CONSTANT_443_W)\nXE_GPU_REGISTER(0x46F0, kFloat, SHADER_CONSTANT_444_X)\nXE_GPU_REGISTER(0x46F1, kFloat, SHADER_CONSTANT_444_Y)\nXE_GPU_REGISTER(0x46F2, kFloat, SHADER_CONSTANT_444_Z)\nXE_GPU_REGISTER(0x46F3, kFloat, SHADER_CONSTANT_444_W)\nXE_GPU_REGISTER(0x46F4, kFloat, SHADER_CONSTANT_445_X)\nXE_GPU_REGISTER(0x46F5, kFloat, SHADER_CONSTANT_445_Y)\nXE_GPU_REGISTER(0x46F6, kFloat, SHADER_CONSTANT_445_Z)\nXE_GPU_REGISTER(0x46F7, kFloat, SHADER_CONSTANT_445_W)\nXE_GPU_REGISTER(0x46F8, kFloat, SHADER_CONSTANT_446_X)\nXE_GPU_REGISTER(0x46F9, kFloat, SHADER_CONSTANT_446_Y)\nXE_GPU_REGISTER(0x46FA, kFloat, SHADER_CONSTANT_446_Z)\nXE_GPU_REGISTER(0x46FB, kFloat, SHADER_CONSTANT_446_W)\nXE_GPU_REGISTER(0x46FC, kFloat, SHADER_CONSTANT_447_X)\nXE_GPU_REGISTER(0x46FD, kFloat, SHADER_CONSTANT_447_Y)\nXE_GPU_REGISTER(0x46FE, kFloat, SHADER_CONSTANT_447_Z)\nXE_GPU_REGISTER(0x46FF, kFloat, SHADER_CONSTANT_447_W)\nXE_GPU_REGISTER(0x4700, kFloat, SHADER_CONSTANT_448_X)\nXE_GPU_REGISTER(0x4701, kFloat, SHADER_CONSTANT_448_Y)\nXE_GPU_REGISTER(0x4702, kFloat, SHADER_CONSTANT_448_Z)\nXE_GPU_REGISTER(0x4703, kFloat, SHADER_CONSTANT_448_W)\nXE_GPU_REGISTER(0x4704, kFloat, SHADER_CONSTANT_449_X)\nXE_GPU_REGISTER(0x4705, kFloat, SHADER_CONSTANT_449_Y)\nXE_GPU_REGISTER(0x4706, kFloat, SHADER_CONSTANT_449_Z)\nXE_GPU_REGISTER(0x4707, kFloat, SHADER_CONSTANT_449_W)\nXE_GPU_REGISTER(0x4708, kFloat, SHADER_CONSTANT_450_X)\nXE_GPU_REGISTER(0x4709, kFloat, SHADER_CONSTANT_450_Y)\nXE_GPU_REGISTER(0x470A, kFloat, SHADER_CONSTANT_450_Z)\nXE_GPU_REGISTER(0x470B, kFloat, SHADER_CONSTANT_450_W)\nXE_GPU_REGISTER(0x470C, kFloat, SHADER_CONSTANT_451_X)\nXE_GPU_REGISTER(0x470D, kFloat, SHADER_CONSTANT_451_Y)\nXE_GPU_REGISTER(0x470E, kFloat, SHADER_CONSTANT_451_Z)\nXE_GPU_REGISTER(0x470F, kFloat, SHADER_CONSTANT_451_W)\nXE_GPU_REGISTER(0x4710, kFloat, SHADER_CONSTANT_452_X)\nXE_GPU_REGISTER(0x4711, kFloat, SHADER_CONSTANT_452_Y)\nXE_GPU_REGISTER(0x4712, kFloat, SHADER_CONSTANT_452_Z)\nXE_GPU_REGISTER(0x4713, kFloat, SHADER_CONSTANT_452_W)\nXE_GPU_REGISTER(0x4714, kFloat, SHADER_CONSTANT_453_X)\nXE_GPU_REGISTER(0x4715, kFloat, SHADER_CONSTANT_453_Y)\nXE_GPU_REGISTER(0x4716, kFloat, SHADER_CONSTANT_453_Z)\nXE_GPU_REGISTER(0x4717, kFloat, SHADER_CONSTANT_453_W)\nXE_GPU_REGISTER(0x4718, kFloat, SHADER_CONSTANT_454_X)\nXE_GPU_REGISTER(0x4719, kFloat, SHADER_CONSTANT_454_Y)\nXE_GPU_REGISTER(0x471A, kFloat, SHADER_CONSTANT_454_Z)\nXE_GPU_REGISTER(0x471B, kFloat, SHADER_CONSTANT_454_W)\nXE_GPU_REGISTER(0x471C, kFloat, SHADER_CONSTANT_455_X)\nXE_GPU_REGISTER(0x471D, kFloat, SHADER_CONSTANT_455_Y)\nXE_GPU_REGISTER(0x471E, kFloat, SHADER_CONSTANT_455_Z)\nXE_GPU_REGISTER(0x471F, kFloat, SHADER_CONSTANT_455_W)\nXE_GPU_REGISTER(0x4720, kFloat, SHADER_CONSTANT_456_X)\nXE_GPU_REGISTER(0x4721, kFloat, SHADER_CONSTANT_456_Y)\nXE_GPU_REGISTER(0x4722, kFloat, SHADER_CONSTANT_456_Z)\nXE_GPU_REGISTER(0x4723, kFloat, SHADER_CONSTANT_456_W)\nXE_GPU_REGISTER(0x4724, kFloat, SHADER_CONSTANT_457_X)\nXE_GPU_REGISTER(0x4725, kFloat, SHADER_CONSTANT_457_Y)\nXE_GPU_REGISTER(0x4726, kFloat, SHADER_CONSTANT_457_Z)\nXE_GPU_REGISTER(0x4727, kFloat, SHADER_CONSTANT_457_W)\nXE_GPU_REGISTER(0x4728, kFloat, SHADER_CONSTANT_458_X)\nXE_GPU_REGISTER(0x4729, kFloat, SHADER_CONSTANT_458_Y)\nXE_GPU_REGISTER(0x472A, kFloat, SHADER_CONSTANT_458_Z)\nXE_GPU_REGISTER(0x472B, kFloat, SHADER_CONSTANT_458_W)\nXE_GPU_REGISTER(0x472C, kFloat, SHADER_CONSTANT_459_X)\nXE_GPU_REGISTER(0x472D, kFloat, SHADER_CONSTANT_459_Y)\nXE_GPU_REGISTER(0x472E, kFloat, SHADER_CONSTANT_459_Z)\nXE_GPU_REGISTER(0x472F, kFloat, SHADER_CONSTANT_459_W)\nXE_GPU_REGISTER(0x4730, kFloat, SHADER_CONSTANT_460_X)\nXE_GPU_REGISTER(0x4731, kFloat, SHADER_CONSTANT_460_Y)\nXE_GPU_REGISTER(0x4732, kFloat, SHADER_CONSTANT_460_Z)\nXE_GPU_REGISTER(0x4733, kFloat, SHADER_CONSTANT_460_W)\nXE_GPU_REGISTER(0x4734, kFloat, SHADER_CONSTANT_461_X)\nXE_GPU_REGISTER(0x4735, kFloat, SHADER_CONSTANT_461_Y)\nXE_GPU_REGISTER(0x4736, kFloat, SHADER_CONSTANT_461_Z)\nXE_GPU_REGISTER(0x4737, kFloat, SHADER_CONSTANT_461_W)\nXE_GPU_REGISTER(0x4738, kFloat, SHADER_CONSTANT_462_X)\nXE_GPU_REGISTER(0x4739, kFloat, SHADER_CONSTANT_462_Y)\nXE_GPU_REGISTER(0x473A, kFloat, SHADER_CONSTANT_462_Z)\nXE_GPU_REGISTER(0x473B, kFloat, SHADER_CONSTANT_462_W)\nXE_GPU_REGISTER(0x473C, kFloat, SHADER_CONSTANT_463_X)\nXE_GPU_REGISTER(0x473D, kFloat, SHADER_CONSTANT_463_Y)\nXE_GPU_REGISTER(0x473E, kFloat, SHADER_CONSTANT_463_Z)\nXE_GPU_REGISTER(0x473F, kFloat, SHADER_CONSTANT_463_W)\nXE_GPU_REGISTER(0x4740, kFloat, SHADER_CONSTANT_464_X)\nXE_GPU_REGISTER(0x4741, kFloat, SHADER_CONSTANT_464_Y)\nXE_GPU_REGISTER(0x4742, kFloat, SHADER_CONSTANT_464_Z)\nXE_GPU_REGISTER(0x4743, kFloat, SHADER_CONSTANT_464_W)\nXE_GPU_REGISTER(0x4744, kFloat, SHADER_CONSTANT_465_X)\nXE_GPU_REGISTER(0x4745, kFloat, SHADER_CONSTANT_465_Y)\nXE_GPU_REGISTER(0x4746, kFloat, SHADER_CONSTANT_465_Z)\nXE_GPU_REGISTER(0x4747, kFloat, SHADER_CONSTANT_465_W)\nXE_GPU_REGISTER(0x4748, kFloat, SHADER_CONSTANT_466_X)\nXE_GPU_REGISTER(0x4749, kFloat, SHADER_CONSTANT_466_Y)\nXE_GPU_REGISTER(0x474A, kFloat, SHADER_CONSTANT_466_Z)\nXE_GPU_REGISTER(0x474B, kFloat, SHADER_CONSTANT_466_W)\nXE_GPU_REGISTER(0x474C, kFloat, SHADER_CONSTANT_467_X)\nXE_GPU_REGISTER(0x474D, kFloat, SHADER_CONSTANT_467_Y)\nXE_GPU_REGISTER(0x474E, kFloat, SHADER_CONSTANT_467_Z)\nXE_GPU_REGISTER(0x474F, kFloat, SHADER_CONSTANT_467_W)\nXE_GPU_REGISTER(0x4750, kFloat, SHADER_CONSTANT_468_X)\nXE_GPU_REGISTER(0x4751, kFloat, SHADER_CONSTANT_468_Y)\nXE_GPU_REGISTER(0x4752, kFloat, SHADER_CONSTANT_468_Z)\nXE_GPU_REGISTER(0x4753, kFloat, SHADER_CONSTANT_468_W)\nXE_GPU_REGISTER(0x4754, kFloat, SHADER_CONSTANT_469_X)\nXE_GPU_REGISTER(0x4755, kFloat, SHADER_CONSTANT_469_Y)\nXE_GPU_REGISTER(0x4756, kFloat, SHADER_CONSTANT_469_Z)\nXE_GPU_REGISTER(0x4757, kFloat, SHADER_CONSTANT_469_W)\nXE_GPU_REGISTER(0x4758, kFloat, SHADER_CONSTANT_470_X)\nXE_GPU_REGISTER(0x4759, kFloat, SHADER_CONSTANT_470_Y)\nXE_GPU_REGISTER(0x475A, kFloat, SHADER_CONSTANT_470_Z)\nXE_GPU_REGISTER(0x475B, kFloat, SHADER_CONSTANT_470_W)\nXE_GPU_REGISTER(0x475C, kFloat, SHADER_CONSTANT_471_X)\nXE_GPU_REGISTER(0x475D, kFloat, SHADER_CONSTANT_471_Y)\nXE_GPU_REGISTER(0x475E, kFloat, SHADER_CONSTANT_471_Z)\nXE_GPU_REGISTER(0x475F, kFloat, SHADER_CONSTANT_471_W)\nXE_GPU_REGISTER(0x4760, kFloat, SHADER_CONSTANT_472_X)\nXE_GPU_REGISTER(0x4761, kFloat, SHADER_CONSTANT_472_Y)\nXE_GPU_REGISTER(0x4762, kFloat, SHADER_CONSTANT_472_Z)\nXE_GPU_REGISTER(0x4763, kFloat, SHADER_CONSTANT_472_W)\nXE_GPU_REGISTER(0x4764, kFloat, SHADER_CONSTANT_473_X)\nXE_GPU_REGISTER(0x4765, kFloat, SHADER_CONSTANT_473_Y)\nXE_GPU_REGISTER(0x4766, kFloat, SHADER_CONSTANT_473_Z)\nXE_GPU_REGISTER(0x4767, kFloat, SHADER_CONSTANT_473_W)\nXE_GPU_REGISTER(0x4768, kFloat, SHADER_CONSTANT_474_X)\nXE_GPU_REGISTER(0x4769, kFloat, SHADER_CONSTANT_474_Y)\nXE_GPU_REGISTER(0x476A, kFloat, SHADER_CONSTANT_474_Z)\nXE_GPU_REGISTER(0x476B, kFloat, SHADER_CONSTANT_474_W)\nXE_GPU_REGISTER(0x476C, kFloat, SHADER_CONSTANT_475_X)\nXE_GPU_REGISTER(0x476D, kFloat, SHADER_CONSTANT_475_Y)\nXE_GPU_REGISTER(0x476E, kFloat, SHADER_CONSTANT_475_Z)\nXE_GPU_REGISTER(0x476F, kFloat, SHADER_CONSTANT_475_W)\nXE_GPU_REGISTER(0x4770, kFloat, SHADER_CONSTANT_476_X)\nXE_GPU_REGISTER(0x4771, kFloat, SHADER_CONSTANT_476_Y)\nXE_GPU_REGISTER(0x4772, kFloat, SHADER_CONSTANT_476_Z)\nXE_GPU_REGISTER(0x4773, kFloat, SHADER_CONSTANT_476_W)\nXE_GPU_REGISTER(0x4774, kFloat, SHADER_CONSTANT_477_X)\nXE_GPU_REGISTER(0x4775, kFloat, SHADER_CONSTANT_477_Y)\nXE_GPU_REGISTER(0x4776, kFloat, SHADER_CONSTANT_477_Z)\nXE_GPU_REGISTER(0x4777, kFloat, SHADER_CONSTANT_477_W)\nXE_GPU_REGISTER(0x4778, kFloat, SHADER_CONSTANT_478_X)\nXE_GPU_REGISTER(0x4779, kFloat, SHADER_CONSTANT_478_Y)\nXE_GPU_REGISTER(0x477A, kFloat, SHADER_CONSTANT_478_Z)\nXE_GPU_REGISTER(0x477B, kFloat, SHADER_CONSTANT_478_W)\nXE_GPU_REGISTER(0x477C, kFloat, SHADER_CONSTANT_479_X)\nXE_GPU_REGISTER(0x477D, kFloat, SHADER_CONSTANT_479_Y)\nXE_GPU_REGISTER(0x477E, kFloat, SHADER_CONSTANT_479_Z)\nXE_GPU_REGISTER(0x477F, kFloat, SHADER_CONSTANT_479_W)\nXE_GPU_REGISTER(0x4780, kFloat, SHADER_CONSTANT_480_X)\nXE_GPU_REGISTER(0x4781, kFloat, SHADER_CONSTANT_480_Y)\nXE_GPU_REGISTER(0x4782, kFloat, SHADER_CONSTANT_480_Z)\nXE_GPU_REGISTER(0x4783, kFloat, SHADER_CONSTANT_480_W)\nXE_GPU_REGISTER(0x4784, kFloat, SHADER_CONSTANT_481_X)\nXE_GPU_REGISTER(0x4785, kFloat, SHADER_CONSTANT_481_Y)\nXE_GPU_REGISTER(0x4786, kFloat, SHADER_CONSTANT_481_Z)\nXE_GPU_REGISTER(0x4787, kFloat, SHADER_CONSTANT_481_W)\nXE_GPU_REGISTER(0x4788, kFloat, SHADER_CONSTANT_482_X)\nXE_GPU_REGISTER(0x4789, kFloat, SHADER_CONSTANT_482_Y)\nXE_GPU_REGISTER(0x478A, kFloat, SHADER_CONSTANT_482_Z)\nXE_GPU_REGISTER(0x478B, kFloat, SHADER_CONSTANT_482_W)\nXE_GPU_REGISTER(0x478C, kFloat, SHADER_CONSTANT_483_X)\nXE_GPU_REGISTER(0x478D, kFloat, SHADER_CONSTANT_483_Y)\nXE_GPU_REGISTER(0x478E, kFloat, SHADER_CONSTANT_483_Z)\nXE_GPU_REGISTER(0x478F, kFloat, SHADER_CONSTANT_483_W)\nXE_GPU_REGISTER(0x4790, kFloat, SHADER_CONSTANT_484_X)\nXE_GPU_REGISTER(0x4791, kFloat, SHADER_CONSTANT_484_Y)\nXE_GPU_REGISTER(0x4792, kFloat, SHADER_CONSTANT_484_Z)\nXE_GPU_REGISTER(0x4793, kFloat, SHADER_CONSTANT_484_W)\nXE_GPU_REGISTER(0x4794, kFloat, SHADER_CONSTANT_485_X)\nXE_GPU_REGISTER(0x4795, kFloat, SHADER_CONSTANT_485_Y)\nXE_GPU_REGISTER(0x4796, kFloat, SHADER_CONSTANT_485_Z)\nXE_GPU_REGISTER(0x4797, kFloat, SHADER_CONSTANT_485_W)\nXE_GPU_REGISTER(0x4798, kFloat, SHADER_CONSTANT_486_X)\nXE_GPU_REGISTER(0x4799, kFloat, SHADER_CONSTANT_486_Y)\nXE_GPU_REGISTER(0x479A, kFloat, SHADER_CONSTANT_486_Z)\nXE_GPU_REGISTER(0x479B, kFloat, SHADER_CONSTANT_486_W)\nXE_GPU_REGISTER(0x479C, kFloat, SHADER_CONSTANT_487_X)\nXE_GPU_REGISTER(0x479D, kFloat, SHADER_CONSTANT_487_Y)\nXE_GPU_REGISTER(0x479E, kFloat, SHADER_CONSTANT_487_Z)\nXE_GPU_REGISTER(0x479F, kFloat, SHADER_CONSTANT_487_W)\nXE_GPU_REGISTER(0x47A0, kFloat, SHADER_CONSTANT_488_X)\nXE_GPU_REGISTER(0x47A1, kFloat, SHADER_CONSTANT_488_Y)\nXE_GPU_REGISTER(0x47A2, kFloat, SHADER_CONSTANT_488_Z)\nXE_GPU_REGISTER(0x47A3, kFloat, SHADER_CONSTANT_488_W)\nXE_GPU_REGISTER(0x47A4, kFloat, SHADER_CONSTANT_489_X)\nXE_GPU_REGISTER(0x47A5, kFloat, SHADER_CONSTANT_489_Y)\nXE_GPU_REGISTER(0x47A6, kFloat, SHADER_CONSTANT_489_Z)\nXE_GPU_REGISTER(0x47A7, kFloat, SHADER_CONSTANT_489_W)\nXE_GPU_REGISTER(0x47A8, kFloat, SHADER_CONSTANT_490_X)\nXE_GPU_REGISTER(0x47A9, kFloat, SHADER_CONSTANT_490_Y)\nXE_GPU_REGISTER(0x47AA, kFloat, SHADER_CONSTANT_490_Z)\nXE_GPU_REGISTER(0x47AB, kFloat, SHADER_CONSTANT_490_W)\nXE_GPU_REGISTER(0x47AC, kFloat, SHADER_CONSTANT_491_X)\nXE_GPU_REGISTER(0x47AD, kFloat, SHADER_CONSTANT_491_Y)\nXE_GPU_REGISTER(0x47AE, kFloat, SHADER_CONSTANT_491_Z)\nXE_GPU_REGISTER(0x47AF, kFloat, SHADER_CONSTANT_491_W)\nXE_GPU_REGISTER(0x47B0, kFloat, SHADER_CONSTANT_492_X)\nXE_GPU_REGISTER(0x47B1, kFloat, SHADER_CONSTANT_492_Y)\nXE_GPU_REGISTER(0x47B2, kFloat, SHADER_CONSTANT_492_Z)\nXE_GPU_REGISTER(0x47B3, kFloat, SHADER_CONSTANT_492_W)\nXE_GPU_REGISTER(0x47B4, kFloat, SHADER_CONSTANT_493_X)\nXE_GPU_REGISTER(0x47B5, kFloat, SHADER_CONSTANT_493_Y)\nXE_GPU_REGISTER(0x47B6, kFloat, SHADER_CONSTANT_493_Z)\nXE_GPU_REGISTER(0x47B7, kFloat, SHADER_CONSTANT_493_W)\nXE_GPU_REGISTER(0x47B8, kFloat, SHADER_CONSTANT_494_X)\nXE_GPU_REGISTER(0x47B9, kFloat, SHADER_CONSTANT_494_Y)\nXE_GPU_REGISTER(0x47BA, kFloat, SHADER_CONSTANT_494_Z)\nXE_GPU_REGISTER(0x47BB, kFloat, SHADER_CONSTANT_494_W)\nXE_GPU_REGISTER(0x47BC, kFloat, SHADER_CONSTANT_495_X)\nXE_GPU_REGISTER(0x47BD, kFloat, SHADER_CONSTANT_495_Y)\nXE_GPU_REGISTER(0x47BE, kFloat, SHADER_CONSTANT_495_Z)\nXE_GPU_REGISTER(0x47BF, kFloat, SHADER_CONSTANT_495_W)\nXE_GPU_REGISTER(0x47C0, kFloat, SHADER_CONSTANT_496_X)\nXE_GPU_REGISTER(0x47C1, kFloat, SHADER_CONSTANT_496_Y)\nXE_GPU_REGISTER(0x47C2, kFloat, SHADER_CONSTANT_496_Z)\nXE_GPU_REGISTER(0x47C3, kFloat, SHADER_CONSTANT_496_W)\nXE_GPU_REGISTER(0x47C4, kFloat, SHADER_CONSTANT_497_X)\nXE_GPU_REGISTER(0x47C5, kFloat, SHADER_CONSTANT_497_Y)\nXE_GPU_REGISTER(0x47C6, kFloat, SHADER_CONSTANT_497_Z)\nXE_GPU_REGISTER(0x47C7, kFloat, SHADER_CONSTANT_497_W)\nXE_GPU_REGISTER(0x47C8, kFloat, SHADER_CONSTANT_498_X)\nXE_GPU_REGISTER(0x47C9, kFloat, SHADER_CONSTANT_498_Y)\nXE_GPU_REGISTER(0x47CA, kFloat, SHADER_CONSTANT_498_Z)\nXE_GPU_REGISTER(0x47CB, kFloat, SHADER_CONSTANT_498_W)\nXE_GPU_REGISTER(0x47CC, kFloat, SHADER_CONSTANT_499_X)\nXE_GPU_REGISTER(0x47CD, kFloat, SHADER_CONSTANT_499_Y)\nXE_GPU_REGISTER(0x47CE, kFloat, SHADER_CONSTANT_499_Z)\nXE_GPU_REGISTER(0x47CF, kFloat, SHADER_CONSTANT_499_W)\nXE_GPU_REGISTER(0x47D0, kFloat, SHADER_CONSTANT_500_X)\nXE_GPU_REGISTER(0x47D1, kFloat, SHADER_CONSTANT_500_Y)\nXE_GPU_REGISTER(0x47D2, kFloat, SHADER_CONSTANT_500_Z)\nXE_GPU_REGISTER(0x47D3, kFloat, SHADER_CONSTANT_500_W)\nXE_GPU_REGISTER(0x47D4, kFloat, SHADER_CONSTANT_501_X)\nXE_GPU_REGISTER(0x47D5, kFloat, SHADER_CONSTANT_501_Y)\nXE_GPU_REGISTER(0x47D6, kFloat, SHADER_CONSTANT_501_Z)\nXE_GPU_REGISTER(0x47D7, kFloat, SHADER_CONSTANT_501_W)\nXE_GPU_REGISTER(0x47D8, kFloat, SHADER_CONSTANT_502_X)\nXE_GPU_REGISTER(0x47D9, kFloat, SHADER_CONSTANT_502_Y)\nXE_GPU_REGISTER(0x47DA, kFloat, SHADER_CONSTANT_502_Z)\nXE_GPU_REGISTER(0x47DB, kFloat, SHADER_CONSTANT_502_W)\nXE_GPU_REGISTER(0x47DC, kFloat, SHADER_CONSTANT_503_X)\nXE_GPU_REGISTER(0x47DD, kFloat, SHADER_CONSTANT_503_Y)\nXE_GPU_REGISTER(0x47DE, kFloat, SHADER_CONSTANT_503_Z)\nXE_GPU_REGISTER(0x47DF, kFloat, SHADER_CONSTANT_503_W)\nXE_GPU_REGISTER(0x47E0, kFloat, SHADER_CONSTANT_504_X)\nXE_GPU_REGISTER(0x47E1, kFloat, SHADER_CONSTANT_504_Y)\nXE_GPU_REGISTER(0x47E2, kFloat, SHADER_CONSTANT_504_Z)\nXE_GPU_REGISTER(0x47E3, kFloat, SHADER_CONSTANT_504_W)\nXE_GPU_REGISTER(0x47E4, kFloat, SHADER_CONSTANT_505_X)\nXE_GPU_REGISTER(0x47E5, kFloat, SHADER_CONSTANT_505_Y)\nXE_GPU_REGISTER(0x47E6, kFloat, SHADER_CONSTANT_505_Z)\nXE_GPU_REGISTER(0x47E7, kFloat, SHADER_CONSTANT_505_W)\nXE_GPU_REGISTER(0x47E8, kFloat, SHADER_CONSTANT_506_X)\nXE_GPU_REGISTER(0x47E9, kFloat, SHADER_CONSTANT_506_Y)\nXE_GPU_REGISTER(0x47EA, kFloat, SHADER_CONSTANT_506_Z)\nXE_GPU_REGISTER(0x47EB, kFloat, SHADER_CONSTANT_506_W)\nXE_GPU_REGISTER(0x47EC, kFloat, SHADER_CONSTANT_507_X)\nXE_GPU_REGISTER(0x47ED, kFloat, SHADER_CONSTANT_507_Y)\nXE_GPU_REGISTER(0x47EE, kFloat, SHADER_CONSTANT_507_Z)\nXE_GPU_REGISTER(0x47EF, kFloat, SHADER_CONSTANT_507_W)\nXE_GPU_REGISTER(0x47F0, kFloat, SHADER_CONSTANT_508_X)\nXE_GPU_REGISTER(0x47F1, kFloat, SHADER_CONSTANT_508_Y)\nXE_GPU_REGISTER(0x47F2, kFloat, SHADER_CONSTANT_508_Z)\nXE_GPU_REGISTER(0x47F3, kFloat, SHADER_CONSTANT_508_W)\nXE_GPU_REGISTER(0x47F4, kFloat, SHADER_CONSTANT_509_X)\nXE_GPU_REGISTER(0x47F5, kFloat, SHADER_CONSTANT_509_Y)\nXE_GPU_REGISTER(0x47F6, kFloat, SHADER_CONSTANT_509_Z)\nXE_GPU_REGISTER(0x47F7, kFloat, SHADER_CONSTANT_509_W)\nXE_GPU_REGISTER(0x47F8, kFloat, SHADER_CONSTANT_510_X)\nXE_GPU_REGISTER(0x47F9, kFloat, SHADER_CONSTANT_510_Y)\nXE_GPU_REGISTER(0x47FA, kFloat, SHADER_CONSTANT_510_Z)\nXE_GPU_REGISTER(0x47FB, kFloat, SHADER_CONSTANT_510_W)\nXE_GPU_REGISTER(0x47FC, kFloat, SHADER_CONSTANT_511_X)\nXE_GPU_REGISTER(0x47FD, kFloat, SHADER_CONSTANT_511_Y)\nXE_GPU_REGISTER(0x47FE, kFloat, SHADER_CONSTANT_511_Z)\nXE_GPU_REGISTER(0x47FF, kFloat, SHADER_CONSTANT_511_W)\n\nXE_GPU_REGISTER(0x4800, kDword, SHADER_CONSTANT_FETCH_00_0)\nXE_GPU_REGISTER(0x4801, kDword, SHADER_CONSTANT_FETCH_00_1)\nXE_GPU_REGISTER(0x4802, kDword, SHADER_CONSTANT_FETCH_00_2)\nXE_GPU_REGISTER(0x4803, kDword, SHADER_CONSTANT_FETCH_00_3)\nXE_GPU_REGISTER(0x4804, kDword, SHADER_CONSTANT_FETCH_00_4)\nXE_GPU_REGISTER(0x4805, kDword, SHADER_CONSTANT_FETCH_00_5)\nXE_GPU_REGISTER(0x4806, kDword, SHADER_CONSTANT_FETCH_01_0)\nXE_GPU_REGISTER(0x4807, kDword, SHADER_CONSTANT_FETCH_01_1)\nXE_GPU_REGISTER(0x4808, kDword, SHADER_CONSTANT_FETCH_01_2)\nXE_GPU_REGISTER(0x4809, kDword, SHADER_CONSTANT_FETCH_01_3)\nXE_GPU_REGISTER(0x480A, kDword, SHADER_CONSTANT_FETCH_01_4)\nXE_GPU_REGISTER(0x480B, kDword, SHADER_CONSTANT_FETCH_01_5)\nXE_GPU_REGISTER(0x480C, kDword, SHADER_CONSTANT_FETCH_02_0)\nXE_GPU_REGISTER(0x480D, kDword, SHADER_CONSTANT_FETCH_02_1)\nXE_GPU_REGISTER(0x480E, kDword, SHADER_CONSTANT_FETCH_02_2)\nXE_GPU_REGISTER(0x480F, kDword, SHADER_CONSTANT_FETCH_02_3)\nXE_GPU_REGISTER(0x4810, kDword, SHADER_CONSTANT_FETCH_02_4)\nXE_GPU_REGISTER(0x4811, kDword, SHADER_CONSTANT_FETCH_02_5)\nXE_GPU_REGISTER(0x4812, kDword, SHADER_CONSTANT_FETCH_03_0)\nXE_GPU_REGISTER(0x4813, kDword, SHADER_CONSTANT_FETCH_03_1)\nXE_GPU_REGISTER(0x4814, kDword, SHADER_CONSTANT_FETCH_03_2)\nXE_GPU_REGISTER(0x4815, kDword, SHADER_CONSTANT_FETCH_03_3)\nXE_GPU_REGISTER(0x4816, kDword, SHADER_CONSTANT_FETCH_03_4)\nXE_GPU_REGISTER(0x4817, kDword, SHADER_CONSTANT_FETCH_03_5)\nXE_GPU_REGISTER(0x4818, kDword, SHADER_CONSTANT_FETCH_04_0)\nXE_GPU_REGISTER(0x4819, kDword, SHADER_CONSTANT_FETCH_04_1)\nXE_GPU_REGISTER(0x481A, kDword, SHADER_CONSTANT_FETCH_04_2)\nXE_GPU_REGISTER(0x481B, kDword, SHADER_CONSTANT_FETCH_04_3)\nXE_GPU_REGISTER(0x481C, kDword, SHADER_CONSTANT_FETCH_04_4)\nXE_GPU_REGISTER(0x481D, kDword, SHADER_CONSTANT_FETCH_04_5)\nXE_GPU_REGISTER(0x481E, kDword, SHADER_CONSTANT_FETCH_05_0)\nXE_GPU_REGISTER(0x481F, kDword, SHADER_CONSTANT_FETCH_05_1)\nXE_GPU_REGISTER(0x4820, kDword, SHADER_CONSTANT_FETCH_05_2)\nXE_GPU_REGISTER(0x4821, kDword, SHADER_CONSTANT_FETCH_05_3)\nXE_GPU_REGISTER(0x4822, kDword, SHADER_CONSTANT_FETCH_05_4)\nXE_GPU_REGISTER(0x4823, kDword, SHADER_CONSTANT_FETCH_05_5)\nXE_GPU_REGISTER(0x4824, kDword, SHADER_CONSTANT_FETCH_06_0)\nXE_GPU_REGISTER(0x4825, kDword, SHADER_CONSTANT_FETCH_06_1)\nXE_GPU_REGISTER(0x4826, kDword, SHADER_CONSTANT_FETCH_06_2)\nXE_GPU_REGISTER(0x4827, kDword, SHADER_CONSTANT_FETCH_06_3)\nXE_GPU_REGISTER(0x4828, kDword, SHADER_CONSTANT_FETCH_06_4)\nXE_GPU_REGISTER(0x4829, kDword, SHADER_CONSTANT_FETCH_06_5)\nXE_GPU_REGISTER(0x482A, kDword, SHADER_CONSTANT_FETCH_07_0)\nXE_GPU_REGISTER(0x482B, kDword, SHADER_CONSTANT_FETCH_07_1)\nXE_GPU_REGISTER(0x482C, kDword, SHADER_CONSTANT_FETCH_07_2)\nXE_GPU_REGISTER(0x482D, kDword, SHADER_CONSTANT_FETCH_07_3)\nXE_GPU_REGISTER(0x482E, kDword, SHADER_CONSTANT_FETCH_07_4)\nXE_GPU_REGISTER(0x482F, kDword, SHADER_CONSTANT_FETCH_07_5)\nXE_GPU_REGISTER(0x4830, kDword, SHADER_CONSTANT_FETCH_08_0)\nXE_GPU_REGISTER(0x4831, kDword, SHADER_CONSTANT_FETCH_08_1)\nXE_GPU_REGISTER(0x4832, kDword, SHADER_CONSTANT_FETCH_08_2)\nXE_GPU_REGISTER(0x4833, kDword, SHADER_CONSTANT_FETCH_08_3)\nXE_GPU_REGISTER(0x4834, kDword, SHADER_CONSTANT_FETCH_08_4)\nXE_GPU_REGISTER(0x4835, kDword, SHADER_CONSTANT_FETCH_08_5)\nXE_GPU_REGISTER(0x4836, kDword, SHADER_CONSTANT_FETCH_09_0)\nXE_GPU_REGISTER(0x4837, kDword, SHADER_CONSTANT_FETCH_09_1)\nXE_GPU_REGISTER(0x4838, kDword, SHADER_CONSTANT_FETCH_09_2)\nXE_GPU_REGISTER(0x4839, kDword, SHADER_CONSTANT_FETCH_09_3)\nXE_GPU_REGISTER(0x483A, kDword, SHADER_CONSTANT_FETCH_09_4)\nXE_GPU_REGISTER(0x483B, kDword, SHADER_CONSTANT_FETCH_09_5)\nXE_GPU_REGISTER(0x483C, kDword, SHADER_CONSTANT_FETCH_10_0)\nXE_GPU_REGISTER(0x483D, kDword, SHADER_CONSTANT_FETCH_10_1)\nXE_GPU_REGISTER(0x483E, kDword, SHADER_CONSTANT_FETCH_10_2)\nXE_GPU_REGISTER(0x483F, kDword, SHADER_CONSTANT_FETCH_10_3)\nXE_GPU_REGISTER(0x4840, kDword, SHADER_CONSTANT_FETCH_10_4)\nXE_GPU_REGISTER(0x4841, kDword, SHADER_CONSTANT_FETCH_10_5)\nXE_GPU_REGISTER(0x4842, kDword, SHADER_CONSTANT_FETCH_11_0)\nXE_GPU_REGISTER(0x4843, kDword, SHADER_CONSTANT_FETCH_11_1)\nXE_GPU_REGISTER(0x4844, kDword, SHADER_CONSTANT_FETCH_11_2)\nXE_GPU_REGISTER(0x4845, kDword, SHADER_CONSTANT_FETCH_11_3)\nXE_GPU_REGISTER(0x4846, kDword, SHADER_CONSTANT_FETCH_11_4)\nXE_GPU_REGISTER(0x4847, kDword, SHADER_CONSTANT_FETCH_11_5)\nXE_GPU_REGISTER(0x4848, kDword, SHADER_CONSTANT_FETCH_12_0)\nXE_GPU_REGISTER(0x4849, kDword, SHADER_CONSTANT_FETCH_12_1)\nXE_GPU_REGISTER(0x484A, kDword, SHADER_CONSTANT_FETCH_12_2)\nXE_GPU_REGISTER(0x484B, kDword, SHADER_CONSTANT_FETCH_12_3)\nXE_GPU_REGISTER(0x484C, kDword, SHADER_CONSTANT_FETCH_12_4)\nXE_GPU_REGISTER(0x484D, kDword, SHADER_CONSTANT_FETCH_12_5)\nXE_GPU_REGISTER(0x484E, kDword, SHADER_CONSTANT_FETCH_13_0)\nXE_GPU_REGISTER(0x484F, kDword, SHADER_CONSTANT_FETCH_13_1)\nXE_GPU_REGISTER(0x4850, kDword, SHADER_CONSTANT_FETCH_13_2)\nXE_GPU_REGISTER(0x4851, kDword, SHADER_CONSTANT_FETCH_13_3)\nXE_GPU_REGISTER(0x4852, kDword, SHADER_CONSTANT_FETCH_13_4)\nXE_GPU_REGISTER(0x4853, kDword, SHADER_CONSTANT_FETCH_13_5)\nXE_GPU_REGISTER(0x4854, kDword, SHADER_CONSTANT_FETCH_14_0)\nXE_GPU_REGISTER(0x4855, kDword, SHADER_CONSTANT_FETCH_14_1)\nXE_GPU_REGISTER(0x4856, kDword, SHADER_CONSTANT_FETCH_14_2)\nXE_GPU_REGISTER(0x4857, kDword, SHADER_CONSTANT_FETCH_14_3)\nXE_GPU_REGISTER(0x4858, kDword, SHADER_CONSTANT_FETCH_14_4)\nXE_GPU_REGISTER(0x4859, kDword, SHADER_CONSTANT_FETCH_14_5)\nXE_GPU_REGISTER(0x485A, kDword, SHADER_CONSTANT_FETCH_15_0)\nXE_GPU_REGISTER(0x485B, kDword, SHADER_CONSTANT_FETCH_15_1)\nXE_GPU_REGISTER(0x485C, kDword, SHADER_CONSTANT_FETCH_15_2)\nXE_GPU_REGISTER(0x485D, kDword, SHADER_CONSTANT_FETCH_15_3)\nXE_GPU_REGISTER(0x485E, kDword, SHADER_CONSTANT_FETCH_15_4)\nXE_GPU_REGISTER(0x485F, kDword, SHADER_CONSTANT_FETCH_15_5)\nXE_GPU_REGISTER(0x4860, kDword, SHADER_CONSTANT_FETCH_16_0)\nXE_GPU_REGISTER(0x4861, kDword, SHADER_CONSTANT_FETCH_16_1)\nXE_GPU_REGISTER(0x4862, kDword, SHADER_CONSTANT_FETCH_16_2)\nXE_GPU_REGISTER(0x4863, kDword, SHADER_CONSTANT_FETCH_16_3)\nXE_GPU_REGISTER(0x4864, kDword, SHADER_CONSTANT_FETCH_16_4)\nXE_GPU_REGISTER(0x4865, kDword, SHADER_CONSTANT_FETCH_16_5)\nXE_GPU_REGISTER(0x4866, kDword, SHADER_CONSTANT_FETCH_17_0)\nXE_GPU_REGISTER(0x4867, kDword, SHADER_CONSTANT_FETCH_17_1)\nXE_GPU_REGISTER(0x4868, kDword, SHADER_CONSTANT_FETCH_17_2)\nXE_GPU_REGISTER(0x4869, kDword, SHADER_CONSTANT_FETCH_17_3)\nXE_GPU_REGISTER(0x486A, kDword, SHADER_CONSTANT_FETCH_17_4)\nXE_GPU_REGISTER(0x486B, kDword, SHADER_CONSTANT_FETCH_17_5)\nXE_GPU_REGISTER(0x486C, kDword, SHADER_CONSTANT_FETCH_18_0)\nXE_GPU_REGISTER(0x486D, kDword, SHADER_CONSTANT_FETCH_18_1)\nXE_GPU_REGISTER(0x486E, kDword, SHADER_CONSTANT_FETCH_18_2)\nXE_GPU_REGISTER(0x486F, kDword, SHADER_CONSTANT_FETCH_18_3)\nXE_GPU_REGISTER(0x4870, kDword, SHADER_CONSTANT_FETCH_18_4)\nXE_GPU_REGISTER(0x4871, kDword, SHADER_CONSTANT_FETCH_18_5)\nXE_GPU_REGISTER(0x4872, kDword, SHADER_CONSTANT_FETCH_19_0)\nXE_GPU_REGISTER(0x4873, kDword, SHADER_CONSTANT_FETCH_19_1)\nXE_GPU_REGISTER(0x4874, kDword, SHADER_CONSTANT_FETCH_19_2)\nXE_GPU_REGISTER(0x4875, kDword, SHADER_CONSTANT_FETCH_19_3)\nXE_GPU_REGISTER(0x4876, kDword, SHADER_CONSTANT_FETCH_19_4)\nXE_GPU_REGISTER(0x4877, kDword, SHADER_CONSTANT_FETCH_19_5)\nXE_GPU_REGISTER(0x4878, kDword, SHADER_CONSTANT_FETCH_20_0)\nXE_GPU_REGISTER(0x4879, kDword, SHADER_CONSTANT_FETCH_20_1)\nXE_GPU_REGISTER(0x487A, kDword, SHADER_CONSTANT_FETCH_20_2)\nXE_GPU_REGISTER(0x487B, kDword, SHADER_CONSTANT_FETCH_20_3)\nXE_GPU_REGISTER(0x487C, kDword, SHADER_CONSTANT_FETCH_20_4)\nXE_GPU_REGISTER(0x487D, kDword, SHADER_CONSTANT_FETCH_20_5)\nXE_GPU_REGISTER(0x487E, kDword, SHADER_CONSTANT_FETCH_21_0)\nXE_GPU_REGISTER(0x487F, kDword, SHADER_CONSTANT_FETCH_21_1)\nXE_GPU_REGISTER(0x4880, kDword, SHADER_CONSTANT_FETCH_21_2)\nXE_GPU_REGISTER(0x4881, kDword, SHADER_CONSTANT_FETCH_21_3)\nXE_GPU_REGISTER(0x4882, kDword, SHADER_CONSTANT_FETCH_21_4)\nXE_GPU_REGISTER(0x4883, kDword, SHADER_CONSTANT_FETCH_21_5)\nXE_GPU_REGISTER(0x4884, kDword, SHADER_CONSTANT_FETCH_22_0)\nXE_GPU_REGISTER(0x4885, kDword, SHADER_CONSTANT_FETCH_22_1)\nXE_GPU_REGISTER(0x4886, kDword, SHADER_CONSTANT_FETCH_22_2)\nXE_GPU_REGISTER(0x4887, kDword, SHADER_CONSTANT_FETCH_22_3)\nXE_GPU_REGISTER(0x4888, kDword, SHADER_CONSTANT_FETCH_22_4)\nXE_GPU_REGISTER(0x4889, kDword, SHADER_CONSTANT_FETCH_22_5)\nXE_GPU_REGISTER(0x488A, kDword, SHADER_CONSTANT_FETCH_23_0)\nXE_GPU_REGISTER(0x488B, kDword, SHADER_CONSTANT_FETCH_23_1)\nXE_GPU_REGISTER(0x488C, kDword, SHADER_CONSTANT_FETCH_23_2)\nXE_GPU_REGISTER(0x488D, kDword, SHADER_CONSTANT_FETCH_23_3)\nXE_GPU_REGISTER(0x488E, kDword, SHADER_CONSTANT_FETCH_23_4)\nXE_GPU_REGISTER(0x488F, kDword, SHADER_CONSTANT_FETCH_23_5)\nXE_GPU_REGISTER(0x4890, kDword, SHADER_CONSTANT_FETCH_24_0)\nXE_GPU_REGISTER(0x4891, kDword, SHADER_CONSTANT_FETCH_24_1)\nXE_GPU_REGISTER(0x4892, kDword, SHADER_CONSTANT_FETCH_24_2)\nXE_GPU_REGISTER(0x4893, kDword, SHADER_CONSTANT_FETCH_24_3)\nXE_GPU_REGISTER(0x4894, kDword, SHADER_CONSTANT_FETCH_24_4)\nXE_GPU_REGISTER(0x4895, kDword, SHADER_CONSTANT_FETCH_24_5)\nXE_GPU_REGISTER(0x4896, kDword, SHADER_CONSTANT_FETCH_25_0)\nXE_GPU_REGISTER(0x4897, kDword, SHADER_CONSTANT_FETCH_25_1)\nXE_GPU_REGISTER(0x4898, kDword, SHADER_CONSTANT_FETCH_25_2)\nXE_GPU_REGISTER(0x4899, kDword, SHADER_CONSTANT_FETCH_25_3)\nXE_GPU_REGISTER(0x489A, kDword, SHADER_CONSTANT_FETCH_25_4)\nXE_GPU_REGISTER(0x489B, kDword, SHADER_CONSTANT_FETCH_25_5)\nXE_GPU_REGISTER(0x489C, kDword, SHADER_CONSTANT_FETCH_26_0)\nXE_GPU_REGISTER(0x489D, kDword, SHADER_CONSTANT_FETCH_26_1)\nXE_GPU_REGISTER(0x489E, kDword, SHADER_CONSTANT_FETCH_26_2)\nXE_GPU_REGISTER(0x489F, kDword, SHADER_CONSTANT_FETCH_26_3)\nXE_GPU_REGISTER(0x48A0, kDword, SHADER_CONSTANT_FETCH_26_4)\nXE_GPU_REGISTER(0x48A1, kDword, SHADER_CONSTANT_FETCH_26_5)\nXE_GPU_REGISTER(0x48A2, kDword, SHADER_CONSTANT_FETCH_27_0)\nXE_GPU_REGISTER(0x48A3, kDword, SHADER_CONSTANT_FETCH_27_1)\nXE_GPU_REGISTER(0x48A4, kDword, SHADER_CONSTANT_FETCH_27_2)\nXE_GPU_REGISTER(0x48A5, kDword, SHADER_CONSTANT_FETCH_27_3)\nXE_GPU_REGISTER(0x48A6, kDword, SHADER_CONSTANT_FETCH_27_4)\nXE_GPU_REGISTER(0x48A7, kDword, SHADER_CONSTANT_FETCH_27_5)\nXE_GPU_REGISTER(0x48A8, kDword, SHADER_CONSTANT_FETCH_28_0)\nXE_GPU_REGISTER(0x48A9, kDword, SHADER_CONSTANT_FETCH_28_1)\nXE_GPU_REGISTER(0x48AA, kDword, SHADER_CONSTANT_FETCH_28_2)\nXE_GPU_REGISTER(0x48AB, kDword, SHADER_CONSTANT_FETCH_28_3)\nXE_GPU_REGISTER(0x48AC, kDword, SHADER_CONSTANT_FETCH_28_4)\nXE_GPU_REGISTER(0x48AD, kDword, SHADER_CONSTANT_FETCH_28_5)\nXE_GPU_REGISTER(0x48AE, kDword, SHADER_CONSTANT_FETCH_29_0)\nXE_GPU_REGISTER(0x48AF, kDword, SHADER_CONSTANT_FETCH_29_1)\nXE_GPU_REGISTER(0x48B0, kDword, SHADER_CONSTANT_FETCH_29_2)\nXE_GPU_REGISTER(0x48B1, kDword, SHADER_CONSTANT_FETCH_29_3)\nXE_GPU_REGISTER(0x48B2, kDword, SHADER_CONSTANT_FETCH_29_4)\nXE_GPU_REGISTER(0x48B3, kDword, SHADER_CONSTANT_FETCH_29_5)\nXE_GPU_REGISTER(0x48B4, kDword, SHADER_CONSTANT_FETCH_30_0)\nXE_GPU_REGISTER(0x48B5, kDword, SHADER_CONSTANT_FETCH_30_1)\nXE_GPU_REGISTER(0x48B6, kDword, SHADER_CONSTANT_FETCH_30_2)\nXE_GPU_REGISTER(0x48B7, kDword, SHADER_CONSTANT_FETCH_30_3)\nXE_GPU_REGISTER(0x48B8, kDword, SHADER_CONSTANT_FETCH_30_4)\nXE_GPU_REGISTER(0x48B9, kDword, SHADER_CONSTANT_FETCH_30_5)\nXE_GPU_REGISTER(0x48BA, kDword, SHADER_CONSTANT_FETCH_31_0)\nXE_GPU_REGISTER(0x48BB, kDword, SHADER_CONSTANT_FETCH_31_1)\nXE_GPU_REGISTER(0x48BC, kDword, SHADER_CONSTANT_FETCH_31_2)\nXE_GPU_REGISTER(0x48BD, kDword, SHADER_CONSTANT_FETCH_31_3)\nXE_GPU_REGISTER(0x48BE, kDword, SHADER_CONSTANT_FETCH_31_4)\nXE_GPU_REGISTER(0x48BF, kDword, SHADER_CONSTANT_FETCH_31_5)\n\nXE_GPU_REGISTER(0x4900, kDword, SHADER_CONSTANT_BOOL_000_031)\nXE_GPU_REGISTER(0x4901, kDword, SHADER_CONSTANT_BOOL_032_063)\nXE_GPU_REGISTER(0x4902, kDword, SHADER_CONSTANT_BOOL_064_095)\nXE_GPU_REGISTER(0x4903, kDword, SHADER_CONSTANT_BOOL_096_127)\nXE_GPU_REGISTER(0x4904, kDword, SHADER_CONSTANT_BOOL_128_159)\nXE_GPU_REGISTER(0x4905, kDword, SHADER_CONSTANT_BOOL_160_191)\nXE_GPU_REGISTER(0x4906, kDword, SHADER_CONSTANT_BOOL_192_223)\nXE_GPU_REGISTER(0x4907, kDword, SHADER_CONSTANT_BOOL_224_255)\n\nXE_GPU_REGISTER(0x4908, kDword, SHADER_CONSTANT_LOOP_00)\nXE_GPU_REGISTER(0x4909, kDword, SHADER_CONSTANT_LOOP_01)\nXE_GPU_REGISTER(0x490A, kDword, SHADER_CONSTANT_LOOP_02)\nXE_GPU_REGISTER(0x490B, kDword, SHADER_CONSTANT_LOOP_03)\nXE_GPU_REGISTER(0x490C, kDword, SHADER_CONSTANT_LOOP_04)\nXE_GPU_REGISTER(0x490D, kDword, SHADER_CONSTANT_LOOP_05)\nXE_GPU_REGISTER(0x490E, kDword, SHADER_CONSTANT_LOOP_06)\nXE_GPU_REGISTER(0x490F, kDword, SHADER_CONSTANT_LOOP_07)\nXE_GPU_REGISTER(0x4910, kDword, SHADER_CONSTANT_LOOP_08)\nXE_GPU_REGISTER(0x4911, kDword, SHADER_CONSTANT_LOOP_09)\nXE_GPU_REGISTER(0x4912, kDword, SHADER_CONSTANT_LOOP_10)\nXE_GPU_REGISTER(0x4913, kDword, SHADER_CONSTANT_LOOP_11)\nXE_GPU_REGISTER(0x4914, kDword, SHADER_CONSTANT_LOOP_12)\nXE_GPU_REGISTER(0x4915, kDword, SHADER_CONSTANT_LOOP_13)\nXE_GPU_REGISTER(0x4916, kDword, SHADER_CONSTANT_LOOP_14)\nXE_GPU_REGISTER(0x4917, kDword, SHADER_CONSTANT_LOOP_15)\nXE_GPU_REGISTER(0x4918, kDword, SHADER_CONSTANT_LOOP_16)\nXE_GPU_REGISTER(0x4919, kDword, SHADER_CONSTANT_LOOP_17)\nXE_GPU_REGISTER(0x491A, kDword, SHADER_CONSTANT_LOOP_18)\nXE_GPU_REGISTER(0x491B, kDword, SHADER_CONSTANT_LOOP_19)\nXE_GPU_REGISTER(0x491C, kDword, SHADER_CONSTANT_LOOP_20)\nXE_GPU_REGISTER(0x491D, kDword, SHADER_CONSTANT_LOOP_21)\nXE_GPU_REGISTER(0x491E, kDword, SHADER_CONSTANT_LOOP_22)\nXE_GPU_REGISTER(0x491F, kDword, SHADER_CONSTANT_LOOP_23)\nXE_GPU_REGISTER(0x4920, kDword, SHADER_CONSTANT_LOOP_24)\nXE_GPU_REGISTER(0x4921, kDword, SHADER_CONSTANT_LOOP_25)\nXE_GPU_REGISTER(0x4922, kDword, SHADER_CONSTANT_LOOP_26)\nXE_GPU_REGISTER(0x4923, kDword, SHADER_CONSTANT_LOOP_27)\nXE_GPU_REGISTER(0x4924, kDword, SHADER_CONSTANT_LOOP_28)\nXE_GPU_REGISTER(0x4925, kDword, SHADER_CONSTANT_LOOP_29)\nXE_GPU_REGISTER(0x4926, kDword, SHADER_CONSTANT_LOOP_30)\nXE_GPU_REGISTER(0x4927, kDword, SHADER_CONSTANT_LOOP_31)\n\nXE_GPU_REGISTER(0x5000, kDword, SHADER_CONSTANT_FLUSH_FETCH_0)\nXE_GPU_REGISTER(0x5001, kDword, SHADER_CONSTANT_FLUSH_FETCH_1)\nXE_GPU_REGISTER(0x5002, kDword, SHADER_CONSTANT_FLUSH_FETCH_2)\n\n// Ignored because I have no clue what these are.\n// XE_GPU_REGISTER(0x8D00, kDword, UNKNOWN_8D00)\n// XE_GPU_REGISTER(0x8D01, kDword, UNKNOWN_8D01)\n// XE_GPU_REGISTER(0x8D02, kDword, UNKNOWN_8D02)\n// XE_GPU_REGISTER(0x8D03, kDword, UNKNOWN_8D03)\n// XE_GPU_REGISTER(0x8D04, kDword, UNKNOWN_8D04)\n// XE_GPU_REGISTER(0x8D05, kDword, UNKNOWN_8D05)\n// XE_GPU_REGISTER(0x8D06, kDword, UNKNOWN_8D06)\n// XE_GPU_REGISTER(0x8D07, kDword, UNKNOWN_8D07)\n"
  },
  {
    "path": "src/xenia/gpu/registers.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2019 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/registers.h\"\n\nnamespace xe {\nnamespace gpu {\nnamespace reg {\n\nconst Register RB_COLOR_INFO::rt_register_indices[4] = {\n    XE_GPU_REG_RB_COLOR_INFO,\n    XE_GPU_REG_RB_COLOR1_INFO,\n    XE_GPU_REG_RB_COLOR2_INFO,\n    XE_GPU_REG_RB_COLOR3_INFO,\n};\n\nconst Register RB_BLENDCONTROL::rt_register_indices[4] = {\n    XE_GPU_REG_RB_BLENDCONTROL0,\n    XE_GPU_REG_RB_BLENDCONTROL1,\n    XE_GPU_REG_RB_BLENDCONTROL2,\n    XE_GPU_REG_RB_BLENDCONTROL3,\n};\n\n}  //  namespace reg\n}  //  namespace gpu\n}  //  namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/registers.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2025 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_REGISTERS_H_\n#define XENIA_GPU_REGISTERS_H_\n\n#include <cstdint>\n#include <cstdlib>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/gpu/xenos.h\"\n\n// Most 3D registers are the same as in the Qualcomm Adreno 200 (AMD Z430,\n// another R400 architecture family chip):\n//\n// https://github.com/UDOOboard/Kernel_Unico/blob/master/drivers/mxc/amd-gpu/include/reg/yamato/10/yamato_registers.h\n// https://github.com/freedreno/amd-gpu/blob/master/include/reg/yamato/10/yamato_registers.h\n//\n// https://gitlab.freedesktop.org/mesa/mesa/-/blob/main/src/freedreno/registers/adreno/a2xx.xml\n//\n// The Adreno 200, however, has various differences in its registers (primarily\n// in the render backend, but not limited to that). Before adding the\n// definitions from the Adreno 200, see the actual values of those registers set\n// by games, and/or test them on the Xenos hardware.\n//\n// Other useful sources are the register references for later ATI/AMD 3D chips,\n// most importantly the R600 - while it has a massive amount of differences,\n// it's the closest relative of the R400 architecture that is available on the\n// PC. Documentation for newer AMD GPUs, such as Evergreen, Northern Islands,\n// and even GCN also can provide details in some cases. The earlier ATI's\n// architecture, R3xx/R5xx, has very differently structured registers (although\n// some are still very similar), but can provide some historical context.\n//\n// Display controller register addresses mostly match the M56 ones:\n// https://www.x.org/docs/AMD/old/RRG-216M56-03oOEM.pdf\n\n// All unused bits are intentionally declared as named fields for stable\n// comparisons when register values are constructed or modified by Xenia itself.\n\n// Only 32-bit types (uint32_t, int32_t, float or enums with uint32_t / int32_t\n// as the underlying type) are allowed in the bit fields here, as Visual C++\n// restarts packing when a field requires different alignment than the previous\n// one.\n\nnamespace xe {\nnamespace gpu {\n\nenum Register {\n#define XE_GPU_REGISTER(index, type, name) XE_GPU_REG_##name = index,\n#include \"xenia/gpu/register_table.inc\"\n#undef XE_GPU_REGISTER\n};\n\nnamespace reg {\n\n/*******************************************************************************\n   ___ ___  _  _ _____ ___  ___  _\n  / __/ _ \\| \\| |_   _| _ \\/ _ \\| |\n | (_| (_) | .` | | | |   / (_) | |__\n  \\___\\___/|_|\\_| |_| |_|_\\\\___/|____|\n\n*******************************************************************************/\n\nunion alignas(uint32_t) COHER_STATUS_HOST {\n  uint32_t value;\n  struct {\n    uint32_t matching_contexts : 8;      // +0\n    uint32_t rb_copy_dest_base_ena : 1;  // +8\n    uint32_t dest_base_0_ena : 1;        // +9\n    uint32_t dest_base_1_ena : 1;        // +10\n    uint32_t dest_base_2_ena : 1;        // +11\n    uint32_t dest_base_3_ena : 1;        // +12\n    uint32_t dest_base_4_ena : 1;        // +13\n    uint32_t dest_base_5_ena : 1;        // +14\n    uint32_t dest_base_6_ena : 1;        // +15\n    uint32_t dest_base_7_ena : 1;        // +16\n    uint32_t _pad_17 : 7;                // +17\n    uint32_t vc_action_ena : 1;          // +24\n    uint32_t tc_action_ena : 1;          // +25\n    uint32_t pglb_action_ena : 1;        // +26\n    uint32_t _pad_27 : 4;                // +27\n    uint32_t status : 1;                 // +31\n  };\n  static constexpr Register register_index = XE_GPU_REG_COHER_STATUS_HOST;\n};\nstatic_assert_size(COHER_STATUS_HOST, sizeof(uint32_t));\n\nunion alignas(uint32_t) WAIT_UNTIL {\n  uint32_t value;\n  struct {\n    uint32_t _pad_0 : 1;             // +0\n    uint32_t wait_re_vsync : 1;      // +1\n    uint32_t wait_fe_vsync : 1;      // +2\n    uint32_t wait_vsync : 1;         // +3\n    uint32_t wait_dsply_id0 : 1;     // +4\n    uint32_t wait_dsply_id1 : 1;     // +5\n    uint32_t wait_dsply_id2 : 1;     // +6\n    uint32_t _pad_7 : 3;             // +7\n    uint32_t wait_cmdfifo : 1;       // +10\n    uint32_t _pad_11 : 3;            // +11\n    uint32_t wait_2d_idle : 1;       // +14\n    uint32_t wait_3d_idle : 1;       // +15\n    uint32_t wait_2d_idleclean : 1;  // +16\n    uint32_t wait_3d_idleclean : 1;  // +17\n    uint32_t _pad_18 : 2;            // +18\n    uint32_t cmdfifo_entries : 4;    // +20\n    uint32_t _pad_24 : 8;            // +24\n  };\n  static constexpr Register register_index = XE_GPU_REG_WAIT_UNTIL;\n};\nstatic_assert_size(WAIT_UNTIL, sizeof(uint32_t));\n\n/*******************************************************************************\n  ___ ___ ___  _   _ ___ _  _  ___ ___ ___\n / __| __/ _ \\| | | | __| \\| |/ __| __| _ \\\n \\__ \\ _| (_) | |_| | _|| .` | (__| _||   /\n |___/___\\__\\_\\\\___/|___|_|\\_|\\___|___|_|_\\\n\n*******************************************************************************/\n\nunion alignas(uint32_t) SQ_PROGRAM_CNTL {\n  uint32_t value;\n  struct {\n    // GPR counts minus 1.\n    // Ignore the Freedreno a2xx.xml note about the bit 7 for zero registers,\n    // the fields are 6-bit, not 8-bit, in yamato_registers.h, and games never\n    // set the bits 7:6.\n    uint32_t vs_num_reg : 6;                           // +0, value minus 1\n    uint32_t _pad_6 : 2;                               // +6\n    uint32_t ps_num_reg : 6;                           // +8, value minus 1\n    uint32_t _pad_14 : 2;                              // +14\n    uint32_t vs_resource : 1;                          // +16\n    uint32_t ps_resource : 1;                          // +17\n    uint32_t param_gen : 1;                            // +18\n    uint32_t gen_index_pix : 1;                        // +19\n    // Interpolator output count minus 1.\n    uint32_t vs_export_count : 4;                      // +20, value minus 1\n    xenos::VertexShaderExportMode vs_export_mode : 3;  // +24\n    uint32_t ps_export_mode : 4;                       // +27\n    uint32_t gen_index_vtx : 1;                        // +31\n  };\n  static constexpr Register register_index = XE_GPU_REG_SQ_PROGRAM_CNTL;\n};\nstatic_assert_size(SQ_PROGRAM_CNTL, sizeof(uint32_t));\n\nunion alignas(uint32_t) SQ_CONTEXT_MISC {\n  uint32_t value;\n  struct {\n    uint32_t inst_pred_optimize : 1;          // +0\n    uint32_t sc_output_screen_xy : 1;         // +1\n    xenos::SampleControl sc_sample_cntl : 2;  // +2\n    uint32_t _pad_4 : 4;                      // +4\n    // Pixel shader interpolator (according to the XNA microcode validator -\n    // limited to the interpolator count, 16, not the total register count of\n    // 64) index to write pixel parameters to.\n    // See https://portal.unifiedpatents.com/ptab/case/IPR2015-00325 Exhibit\n    // 2039 R400 Sequencer Specification 2.11 (a significantly early version of\n    // the specification, however) section 19.2 \"Sprites/ XY screen coordinates/\n    // FB information\" for additional details.\n    // * |XY| - position on screen (vPos - the XNA assembler translates ps_3_0\n    //   vPos directly to this, so at least in Direct3D 9 pixel center mode,\n    //   this contains 0, 1, 2, not 0.5, 1.5, 2.5). flto also said in the\n    //   Freedreno IRC that it's .0 even in OpenGL:\n    //   https://dri.freedesktop.org/~cbrill/dri-log/?channel=freedreno&date=2020-04-19\n    //   According to the actual usage, in the final version of the hardware,\n    //   the screen coordinates are passed to the shader directly as floats\n    //   (contrary to what's written in the early 2.11 version of the sequencer\n    //   specification from IPR2015-00325, where the coordinates are specified\n    //   to be 2^23-biased, essentially packed as integers in the low mantissa\n    //   bits of 2^23).\n    //   * On Android, according to LG P705 - checked on the driver V@6.0 AU@\n    //     (CL@3050818) - GL_OES_get_program_binary disassembly, gl_FragCoord.xy\n    //     is |r0.xy| * c221.xy + c222.zw. Though we haven't yet been able to\n    //     dump the actual constant values by exploiting a huge uniform array,\n    //     but flto says c222.zw contains tile offset plus 0.5. It also appears\n    //     that the multiplication by c221.xy is done to flip the direction of\n    //     the Y axis in gl_FragCoord (c221.y is probably -1). According to the\n    //     tests performed with triangles and point sprites, the hardware uses\n    //     the top-left rasterization rule just like Direct3D (tie-breaking\n    //     sample coverage towards gl_FragCoord.-x+y, while Direct3D tie-breaks\n    //     towards VPOS.-x-y), and the R400 / Z430 doesn't seem to have the\n    //     equivalent of R5xx's SC_EDGERULE register for configuring this).\n    //     Also, both OpenGL and apparently Direct3D 9 define the point sprite V\n    //     coordinate to be 0 in the top, and 1 in the bottom (but OpenGL\n    //     gl_FragCoord.y is towards the top, while Direct3D 9's VPOS.y is\n    //     towards the bottom), gl_PointCoord.y is |PsParamGen.w| directly, and\n    //     the R400 / Z430 doesn't appear to have an equivalent of R6xx's\n    //     SPI_INTERP_CONTROL_0::PNT_SPRITE_TOP_1 for toggling the direction.\n    //     So, it looks like the internal screen coordinates in the official\n    //     OpenGL ES 2.0 driver are still top-to-bottom like in Direct3D, but\n    //     gl_FragCoord.y is flipped in the shader code so it's bottom-to-top\n    //     as OpenGL specifies.\n    //     https://docs.microsoft.com/en-us/windows/win32/direct3d9/point-sprites\n    // * |ZW| - UV within a point sprite, [0, 1]. In OpenGL ES 2.0, this is\n    //   interpreted directly as gl_PointCoord, with the directions matching the\n    //   OpenGL ES 2.0 specification - 0 in the top (towards +gl_FragCoord.y in\n    //   OpenGL ES bottom-to-top screen coordinates - but towards -PsParamGen.y\n    //   likely, see the explanation of gl_FragCoord.xy above), 1 in the bottom\n    //   (towards -gl_FragCoord.y, or +PsParamGen.y likely). The point sprite\n    //   coordinates are exposed differently on the Xbox 360 and the PC\n    //   Direct3D 9 - the Xbox 360 passes the whole PsParamGen register via the\n    //   SPRITETEXCOORD input semantic directly (unlike on the PC, where point\n    //   sprite coordinates are written to XY of TEXCOORD0), and shaders should\n    //   take abs(SPRITETEXCOORD.zw) explicitly.\n    //   https://shawnhargreaves.com/blog/point-sprites-on-xbox.html\n    //   4D5307F1 has snowflake point sprites with an asymmetric texture.\n    //   * For non-point primitives, according to LG P705, this may be the IJ\n    //     barycentric coordinates, however, it's not yet known how intentional,\n    //     well-defined and reliable this behavior is, and whether any game uses\n    //     it on purpose. Also, the mapping between the vertex indices and the\n    //     order of these coordinates seems to vary possibly depending on the\n    //     positions of the vertices relative to each other even when the\n    //     winding order stays the same. It's also unknown what effect the\n    //     provoking vertex convention has on the order.\n    // TODO(Triang3l): Research the order, as well as the sampling location, of\n    // PsParamGen.zw, the behavior (whether they're extrapolated) when the\n    // center of the pixel is not covered, on the real hardware.\n    // * Sign bit of X - is front face (according to the disassembly of vFace\n    //   and gl_FrontFacing usage), non-negative for front face, negative for\n    //   back face (used with `rcpc` in shaders to take signedness of 0 into\n    //   account in `cndge`).\n    // * Sign bit of Y - is the primitive type a point (according to the\n    //   IPR2015-00325 sequencer specification), negative for a point,\n    //   non-negative for other primitive types.\n    // * Sign bit of Z - is the primitive type a line (according to the\n    //   IPR2015-00325 sequencer specification), negative for a line,\n    //   non-negative for other primitive types.\n    uint32_t param_gen_pos : 8;    // +8\n    uint32_t perfcounter_ref : 1;  // +16\n    uint32_t yield_optimize : 1;   // +17\n    uint32_t tx_cache_sel : 1;     // +18\n    uint32_t _pad_19 : 13;         // +19\n  };\n  static constexpr Register register_index = XE_GPU_REG_SQ_CONTEXT_MISC;\n};\nstatic_assert_size(SQ_CONTEXT_MISC, sizeof(uint32_t));\n\nunion alignas(uint32_t) SQ_INTERPOLATOR_CNTL {\n  uint32_t value;\n  struct {\n    uint32_t param_shade : 16;  // +0\n    // SampleLocation bits - 0 for centroid, 1 for center, if\n    // SQ_CONTEXT_MISC::sc_sample_cntl is kCentroidsAndCenters.\n    uint32_t sampling_pattern : 16;  // +16\n  };\n  static constexpr Register register_index = XE_GPU_REG_SQ_INTERPOLATOR_CNTL;\n};\nstatic_assert_size(SQ_INTERPOLATOR_CNTL, sizeof(uint32_t));\n\nunion alignas(uint32_t) SQ_VS_CONST {\n  uint32_t value;\n  struct {\n    uint32_t base : 9;    // +0\n    uint32_t _pad_9 : 3;  // +9\n    // Vec4 count minus one.\n    uint32_t size : 9;      // +12, value minus 1\n    uint32_t _pad_21 : 11;  // +21\n  };\n  static constexpr Register register_index = XE_GPU_REG_SQ_VS_CONST;\n};\nstatic_assert_size(SQ_VS_CONST, sizeof(uint32_t));\n\n// Same as SQ_VS_CONST.\nunion alignas(uint32_t) SQ_PS_CONST {\n  uint32_t value;\n  struct {\n    uint32_t base : 9;    // +0\n    uint32_t _pad_9 : 3;  // +9\n    // Vec4 count minus one.\n    uint32_t size : 9;      // +12, value minus 1\n    uint32_t _pad_21 : 11;  // +21\n  };\n  static constexpr Register register_index = XE_GPU_REG_SQ_PS_CONST;\n};\nstatic_assert_size(SQ_PS_CONST, sizeof(uint32_t));\n\n/*******************************************************************************\n __   _____ ___ _____ _____  __\n \\ \\ / / __| _ \\_   _| __\\ \\/ /\n  \\ V /| _||   / | | | _| >  <\n   \\_/ |___|_|_\\ |_| |___/_/\\_\\\n\n   ___ ___  ___  _   _ ___ ___ ___     _   _  _ ___\n  / __| _ \\/ _ \\| | | | _ \\ __| _ \\   /_\\ | \\| |   \\\n | (_ |   / (_) | |_| |  _/ _||   /  / _ \\| .` | |) |\n  \\___|_|_\\\\___/ \\___/|_| |___|_|_\\ /_/ \\_\\_|\\_|___/\n\n  _____ ___ ___ ___ ___ _    _      _ _____ ___  ___\n |_   _| __/ __/ __| __| |  | |    /_\\_   _/ _ \\| _ \\\n   | | | _|\\__ \\__ \\ _|| |__| |__ / _ \\| || (_) |   /\n   |_| |___|___/___/___|____|____/_/ \\_\\_| \\___/|_|_\\\n\n*******************************************************************************/\n\nunion alignas(uint32_t) VGT_DMA_SIZE {\n  uint32_t value;\n  struct {\n    uint32_t num_words : 24;      // +0\n    uint32_t _pad_24 : 6;         // +24\n    xenos::Endian swap_mode : 2;  // +30\n  };\n  static constexpr Register register_index = XE_GPU_REG_VGT_DMA_SIZE;\n};\n\nunion alignas(uint32_t) VGT_DRAW_INITIATOR {\n  uint32_t value;\n  // Has differences from the Adreno 200.\n  struct {\n    xenos::PrimitiveType prim_type : 6;     // +0\n    xenos::SourceSelect source_select : 2;  // +6\n    // Adreno 200 replaced this with FACENESS_CULL_SELECT possibly due to the\n    // removal of tessellation, but on the Xenos this is MAJOR_MODE like on the\n    // R600, it's set to the explicit mode mainly for tessellated draws in games\n    // (because VGT_OUTPUT_PATH_CNTL where tessellation is enabled is ignored in\n    // the implicit major mode).\n    xenos::MajorMode major_mode : 2;        // +8\n    uint32_t _pad_10 : 1;                   // +10\n    xenos::IndexFormat index_size : 1;      // +11\n    uint32_t not_eop : 1;                   // +12\n    uint32_t _pad_13 : 3;                   // +13\n    uint32_t num_indices : 16;              // +16\n  };\n  static constexpr Register register_index = XE_GPU_REG_VGT_DRAW_INITIATOR;\n};\nstatic_assert_size(VGT_DRAW_INITIATOR, sizeof(uint32_t));\n\n// Unlike on R6xx (but closer to R5xx), and according to the Adreno 200 header,\n// the registers related to the vertex index are 24-bit. Vertex indices are\n// unsigned, and only the lower 24 bits of them are actually used by the GPU -\n// this has been verified on an Adreno 200 phone (LG Optimus L7) on OpenGL ES\n// using a GL_UNSIGNED_INT element array buffer with junk in the upper 8 bits\n// that had no effect on drawing.\n\n// The order of operations is primitive reset index checking -> offsetting ->\n// clamping.\n\nunion alignas(uint32_t) VGT_MULTI_PRIM_IB_RESET_INDX {\n  uint32_t value;\n  struct {\n    // The upper 8 bits of the value from the index buffer are confirmed to be\n    // ignored. So, though this specifically is untested (because\n    // GL_PRIMITIVE_RESTART_FIXED_INDEX was added only in OpenGL ES 3.0, though\n    // it behaves conceptually close to our expectations anyway - uses the\n    // 0xFFFFFFFF restart index while GL_MAX_ELEMENT_INDEX may be 0xFFFFFF),\n    // the restart index check likely only involves the lower 24 bit of the\n    // vertex index - therefore, if reset_indx is 0xFFFFFF, likely 0xFFFFFF,\n    // 0x1FFFFFF, 0xFFFFFFFF all cause primitive reset.\n    uint32_t reset_indx : 24;  // +0\n    uint32_t _pad_24 : 8;      // +24\n  };\n  static constexpr Register register_index =\n      XE_GPU_REG_VGT_MULTI_PRIM_IB_RESET_INDX;\n};\nstatic_assert_size(VGT_MULTI_PRIM_IB_RESET_INDX, sizeof(uint32_t));\n\nunion alignas(uint32_t) VGT_INDX_OFFSET {\n  uint32_t value;\n  struct {\n    // Unlike R5xx's VAP_INDEX_OFFSET, which is signed 25-bit, this is 24-bit -\n    // and signedness doesn't matter as index calculations are done in 24-bit\n    // integers, and ((0xFFFFFE + 3) & 0xFFFFFF) == 1 anyway, just like\n    // ((0xFFFFFFFE + 3) & 0xFFFFFF) == 1 if we treated it as signed by\n    // sign-extending on the host. Direct3D 9 just writes BaseVertexIndex as a\n    // signed int32 to the entire register, but the upper 8 bits are ignored\n    // anyway, and that has no effect on offsets that fit in 24 bits.\n    uint32_t indx_offset : 24;  // +0\n    uint32_t _pad_24 : 8;       // +24\n  };\n  static constexpr Register register_index = XE_GPU_REG_VGT_INDX_OFFSET;\n};\nstatic_assert_size(VGT_INDX_OFFSET, sizeof(uint32_t));\n\nunion alignas(uint32_t) VGT_MIN_VTX_INDX {\n  uint32_t value;\n  struct {\n    uint32_t min_indx : 24;  // +0\n    uint32_t _pad_24 : 8;    // +24\n  };\n  static constexpr Register register_index = XE_GPU_REG_VGT_MIN_VTX_INDX;\n};\nstatic_assert_size(VGT_MIN_VTX_INDX, sizeof(uint32_t));\n\nunion alignas(uint32_t) VGT_MAX_VTX_INDX {\n  uint32_t value;\n  struct {\n    // Usually 0xFFFF or 0xFFFFFF.\n    uint32_t max_indx : 24;  // +0\n    uint32_t _pad_24 : 8;    // +24\n  };\n  static constexpr Register register_index = XE_GPU_REG_VGT_MAX_VTX_INDX;\n};\nstatic_assert_size(VGT_MAX_VTX_INDX, sizeof(uint32_t));\n\nunion alignas(uint32_t) VGT_OUTPUT_PATH_CNTL {\n  uint32_t value;\n  struct {\n    xenos::VGTOutputPath path_select : 2;  // +0\n    uint32_t _pad_2 : 30;                  // +2\n  };\n  static constexpr Register register_index = XE_GPU_REG_VGT_OUTPUT_PATH_CNTL;\n};\nstatic_assert_size(VGT_OUTPUT_PATH_CNTL, sizeof(uint32_t));\n\nunion alignas(uint32_t) VGT_HOS_CNTL {\n  uint32_t value;\n  struct {\n    xenos::TessellationMode tess_mode : 2;  // +0\n    uint32_t _pad_2 : 30;                   // +2\n  };\n  static constexpr Register register_index = XE_GPU_REG_VGT_HOS_CNTL;\n};\nstatic_assert_size(VGT_HOS_CNTL, sizeof(uint32_t));\n\n/*******************************************************************************\n  ___ ___ ___ __  __ ___ _____ _____   _____\n | _ \\ _ \\_ _|  \\/  |_ _|_   _|_ _\\ \\ / / __|\n |  _/   /| || |\\/| || |  | |  | | \\ V /| _|\n |_| |_|_\\___|_|  |_|___| |_| |___| \\_/ |___|\n\n    _   ___ ___ ___ __  __ ___ _    ___ ___\n   /_\\ / __/ __| __|  \\/  | _ ) |  | __| _ \\\n  / _ \\\\__ \\__ \\ _|| |\\/| | _ \\ |__| _||   /\n /_/ \\_\\___/___/___|_|  |_|___/____|___|_|_\\\n\n*******************************************************************************/\n\nunion alignas(uint32_t) PA_SU_POINT_MINMAX {\n  uint32_t value;\n  struct {\n    // For per-vertex size specification, radius (1/2 size), 12.4 fixed point.\n    uint32_t min_size : 16;  // +0\n    uint32_t max_size : 16;  // +16\n  };\n  static constexpr Register register_index = XE_GPU_REG_PA_SU_POINT_MINMAX;\n};\nstatic_assert_size(PA_SU_POINT_MINMAX, sizeof(uint32_t));\n\nunion alignas(uint32_t) PA_SU_POINT_SIZE {\n  uint32_t value;\n  struct {\n    // 1/2 width or height, 12.4 fixed point.\n    uint32_t height : 16;  // +0\n    uint32_t width : 16;   // +16\n  };\n  static constexpr Register register_index = XE_GPU_REG_PA_SU_POINT_SIZE;\n};\nstatic_assert_size(PA_SU_POINT_SIZE, sizeof(uint32_t));\n\n// Setup Unit / Scanline Converter mode cntl\nunion alignas(uint32_t) PA_SU_SC_MODE_CNTL {\n  uint32_t value;\n  struct {\n    uint32_t cull_front : 1;  // +0\n    uint32_t cull_back : 1;   // +1\n    // 0 - front is CCW, 1 - front is CW.\n    uint32_t face : 1;  // +2\n    // 4541096E uses poly_mode 2 for triangles, which is \"reserved\" on R6xx and\n    // not defined on Adreno 2xx, but polymode_front/back_ptype are 0 (points)\n    // in this case in 4541096E, which should not be respected for non-kDualMode\n    // as the title wants to draw filled triangles.\n    xenos::PolygonModeEnable poly_mode : 2;       // +3\n    xenos::PolygonType polymode_front_ptype : 3;  // +5\n    xenos::PolygonType polymode_back_ptype : 3;   // +8\n    uint32_t poly_offset_front_enable : 1;        // +11\n    uint32_t poly_offset_back_enable : 1;         // +12\n    uint32_t poly_offset_para_enable : 1;         // +13\n    uint32_t _pad_14 : 1;                         // +14\n    uint32_t msaa_enable : 1;                     // +15\n    uint32_t vtx_window_offset_enable : 1;        // +16\n    // LINE_STIPPLE_ENABLE was added on Adreno.\n    uint32_t _pad_17 : 2;                // +17\n    uint32_t provoking_vtx_last : 1;     // +19\n    uint32_t persp_corr_dis : 1;         // +20\n    uint32_t multi_prim_ib_ena : 1;      // +21\n    uint32_t _pad_22 : 1;                // +22\n    uint32_t quad_order_enable : 1;      // +23\n    uint32_t sc_one_quad_per_clock : 1;  // +24\n    // WAIT_RB_IDLE_ALL_TRI and WAIT_RB_IDLE_FIRST_TRI_NEW_STATE were added on\n    // Adreno.\n    uint32_t _pad_25 : 7;  // +25\n  };\n  static constexpr Register register_index = XE_GPU_REG_PA_SU_SC_MODE_CNTL;\n};\nstatic_assert_size(PA_SU_SC_MODE_CNTL, sizeof(uint32_t));\n\n// Setup Unit Vertex Control\nunion alignas(uint32_t) PA_SU_VTX_CNTL {\n  uint32_t value;\n  struct {\n    xenos::PixelCenter pix_center : 1;         // +0\n    xenos::VertexRounding round_mode : 2;      // +1\n    xenos::VertexQuantization quant_mode : 3;  // +3\n    uint32_t _pad_6 : 26;     // +6\n  };\n  static constexpr Register register_index = XE_GPU_REG_PA_SU_VTX_CNTL;\n};\nstatic_assert_size(PA_SU_VTX_CNTL, sizeof(uint32_t));\n\nunion alignas(uint32_t) PA_SC_MPASS_PS_CNTL {\n  uint32_t value;\n  struct {\n    uint32_t mpass_pix_vec_per_pass : 20;  // +0\n    uint32_t _pad_20 : 11;                 // +20\n    uint32_t mpass_ps_ena : 1;             // +31\n  };\n  static constexpr Register register_index = XE_GPU_REG_PA_SC_MPASS_PS_CNTL;\n};\nstatic_assert_size(PA_SC_MPASS_PS_CNTL, sizeof(uint32_t));\n\n// Scanline converter viz query, used by D3D for gpu side conditional rendering\nunion alignas(uint32_t) PA_SC_VIZ_QUERY {\n  uint32_t value;\n  struct {\n    // the visibility of draws should be evaluated\n    uint32_t viz_query_ena : 1;  // +0\n    uint32_t viz_query_id : 6;   // +1\n    // discard geometry after test (but use for testing)\n    uint32_t kill_pix_post_hi_z : 1;  // +7\n    // not used with d3d\n    uint32_t kill_pix_post_detail_mask : 1;  // +8\n    uint32_t _pad_9 : 23;                    // +9\n  };\n  static constexpr Register register_index = XE_GPU_REG_PA_SC_VIZ_QUERY;\n};\nstatic_assert_size(PA_SC_VIZ_QUERY, sizeof(uint32_t));\n\n// Clipper clip control\nunion alignas(uint32_t) PA_CL_CLIP_CNTL {\n  uint32_t value;\n  struct {\n    // Like on the Adreno 200, but with user clip planes from R3xx (used in\n    // 4D5307E6 for the hanging lamp on Last Resort).\n    uint32_t ucp_ena_0 : 1;               // +0\n    uint32_t ucp_ena_1 : 1;               // +1\n    uint32_t ucp_ena_2 : 1;               // +2\n    uint32_t ucp_ena_3 : 1;               // +3\n    uint32_t ucp_ena_4 : 1;               // +4\n    uint32_t ucp_ena_5 : 1;               // +5\n    uint32_t _pad_6 : 8;                  // +6\n    uint32_t ps_ucp_mode : 2;             // +14\n    uint32_t clip_disable : 1;            // +16\n    uint32_t ucp_cull_only_ena : 1;       // +17\n    uint32_t boundary_edge_flag_ena : 1;  // +18\n    uint32_t dx_clip_space_def : 1;       // +19\n    uint32_t dis_clip_err_detect : 1;     // +20\n    uint32_t vtx_kill_or : 1;             // +21\n    uint32_t xy_nan_retain : 1;           // +22\n    uint32_t z_nan_retain : 1;            // +23\n    uint32_t w_nan_retain : 1;            // +24\n    uint32_t _pad_25 : 7;                 // +25\n  };\n  struct {\n    uint32_t ucp_ena : 6;\n  };\n  static constexpr Register register_index = XE_GPU_REG_PA_CL_CLIP_CNTL;\n};\nstatic_assert_size(PA_CL_CLIP_CNTL, sizeof(uint32_t));\n\n// Viewport transform engine control\nunion alignas(uint32_t) PA_CL_VTE_CNTL {\n  uint32_t value;\n  struct {\n    uint32_t vport_x_scale_ena : 1;   // +0\n    uint32_t vport_x_offset_ena : 1;  // +1\n    uint32_t vport_y_scale_ena : 1;   // +2\n    uint32_t vport_y_offset_ena : 1;  // +3\n    uint32_t vport_z_scale_ena : 1;   // +4\n    uint32_t vport_z_offset_ena : 1;  // +5\n    uint32_t _pad_6 : 2;              // +6\n    uint32_t vtx_xy_fmt : 1;          // +8\n    uint32_t vtx_z_fmt : 1;           // +9\n    uint32_t vtx_w0_fmt : 1;          // +10\n    uint32_t perfcounter_ref : 1;     // +11\n    uint32_t _pad_12 : 20;            // +12\n  };\n  static constexpr Register register_index = XE_GPU_REG_PA_CL_VTE_CNTL;\n};\nstatic_assert_size(PA_CL_VTE_CNTL, sizeof(uint32_t));\n\nunion alignas(uint32_t) PA_SC_SCREEN_SCISSOR_TL {\n  uint32_t value;\n  struct {\n    int32_t tl_x : 15;     // +0\n    uint32_t _pad_15 : 1;  // +15\n    int32_t tl_y : 15;     // +16\n    uint32_t _pad_31 : 1;  // +31\n  };\n  static constexpr Register register_index = XE_GPU_REG_PA_SC_SCREEN_SCISSOR_TL;\n};\nstatic_assert_size(PA_SC_SCREEN_SCISSOR_TL, sizeof(uint32_t));\n\nunion alignas(uint32_t) PA_SC_SCREEN_SCISSOR_BR {\n  uint32_t value;\n  struct {\n    int32_t br_x : 15;     // +0\n    uint32_t _pad_15 : 1;  // +15\n    int32_t br_y : 15;     // +16\n    uint32_t _pad_31 : 1;  // +31\n  };\n  static constexpr Register register_index = XE_GPU_REG_PA_SC_SCREEN_SCISSOR_BR;\n};\nstatic_assert_size(PA_SC_SCREEN_SCISSOR_BR, sizeof(uint32_t));\n\nunion alignas(uint32_t) PA_SC_WINDOW_OFFSET {\n  uint32_t value;\n  struct {\n    int32_t window_x_offset : 15;  // +0\n    uint32_t _pad_15 : 1;          // +15\n    int32_t window_y_offset : 15;  // +16\n    uint32_t _pad_31 : 1;          // +31\n  };\n  static constexpr Register register_index = XE_GPU_REG_PA_SC_WINDOW_OFFSET;\n};\nstatic_assert_size(PA_SC_WINDOW_OFFSET, sizeof(uint32_t));\n\nunion alignas(uint32_t) PA_SC_WINDOW_SCISSOR_TL {\n  uint32_t value;\n  struct {\n    uint32_t tl_x : 14;                  // +0\n    uint32_t _pad_14 : 2;                // +14\n    uint32_t tl_y : 14;                  // +16\n    uint32_t _pad_30 : 1;                // +30\n    uint32_t window_offset_disable : 1;  // +31\n  };\n  static constexpr Register register_index = XE_GPU_REG_PA_SC_WINDOW_SCISSOR_TL;\n};\nstatic_assert_size(PA_SC_WINDOW_SCISSOR_TL, sizeof(uint32_t));\n\nunion alignas(uint32_t) PA_SC_WINDOW_SCISSOR_BR {\n  uint32_t value;\n  struct {\n    uint32_t br_x : 14;    // +0\n    uint32_t _pad_14 : 2;  // +14\n    uint32_t br_y : 14;    // +16\n    uint32_t _pad_30 : 2;  // +30\n  };\n  static constexpr Register register_index = XE_GPU_REG_PA_SC_WINDOW_SCISSOR_BR;\n};\nstatic_assert_size(PA_SC_WINDOW_SCISSOR_BR, sizeof(uint32_t));\n\n/*******************************************************************************\n  ___ ___ _  _ ___  ___ ___\n | _ \\ __| \\| |   \\| __| _ \\\n |   / _|| .` | |) | _||   /\n |_|_\\___|_|\\_|___/|___|_|_\\\n\n  ___   _   ___ _  _____ _  _ ___\n | _ ) /_\\ / __| |/ / __| \\| |   \\\n | _ \\/ _ \\ (__| ' <| _|| .` | |) |\n |___/_/ \\_\\___|_|\\_\\___|_|\\_|___/\n\n*******************************************************************************/\n\nunion alignas(uint32_t) RB_MODECONTROL {\n  uint32_t value;\n  struct {\n    xenos::EdramMode edram_mode : 3;  // +0\n    uint32_t _pad_3 : 29;             // +3\n  };\n  static constexpr Register register_index = XE_GPU_REG_RB_MODECONTROL;\n};\nstatic_assert_size(RB_MODECONTROL, sizeof(uint32_t));\n\nunion alignas(uint32_t) RB_SURFACE_INFO {\n  uint32_t value;\n  struct {\n    uint32_t surface_pitch : 14;          // +0 in pixels.\n    uint32_t _pad_14 : 2;                 // +14\n    xenos::MsaaSamples msaa_samples : 2;  // +16\n    uint32_t hiz_pitch : 14;              // +18\n  };\n  static constexpr Register register_index = XE_GPU_REG_RB_SURFACE_INFO;\n};\nstatic_assert_size(RB_SURFACE_INFO, sizeof(uint32_t));\n\nunion alignas(uint32_t) RB_COLORCONTROL {\n  uint32_t value;\n  struct {\n    xenos::CompareFunction alpha_func : 3;  // +0\n    uint32_t alpha_test_enable : 1;         // +3\n    uint32_t alpha_to_mask_enable : 1;      // +4\n    // Everything in between was added on Adreno.\n    uint32_t _pad_5 : 19;  // +5\n    // TODO(Triang3l): Redo these tests and possibly flip these vertically in\n    // the comment and in the actual implementation. It appears that\n    // gl_FragCoord.y is mirrored as opposed to the actual screen coordinates in\n    // the rasterizer (see the SQ_CONTEXT_MISC::param_gen_pos comment here).\n    // According to tests on an Adreno 200 device (LG Optimus L7), done by\n    // drawing 0.5x0.5 rectangles in different corners of four pixels in a quad\n    // to a multisampled GLSurfaceView, the coverage mask is the following for 4\n    // samples:\n    // 0.25)  [0.25, 0.5)  [0.5, 0.75)  [0.75, 1)   [1\n    //  --        --           --          --       --\n    // |  |      |  |         | #|        |##|     |##|\n    // |  |      |# |         |# |        |# |     |##|\n    //  --        --           --          --       --\n    // (gl_FragCoord.y near 0 in the top, near 1 in the bottom here - D3D-like.)\n    // For 2 samples, the top sample (closer to gl_FragCoord.y 0) is covered\n    // when alpha is in [0.5, 1), the bottom sample is covered when the alpha is\n    // [1. With these thresholds, however, in 5454082B, almost all distant trees\n    // are transparent, this is asymmetric - fully transparent for a quarter of\n    // the range (or even half of the range for 2x and almost the entire range\n    // for 1x), but fully opaque only in one value.\n    // Though, 2, 2, 2, 2 offset values are commonly used for undithered alpha\n    // to coverage (in games such as 5454082B, and overall in AMD driver\n    // implementations) - it appears that 2, 2, 2, 2 offsets are supposed to\n    // make this symmetric.\n    // Both 5454082B and RADV (which used AMDVLK as a reference) use 3, 1, 0, 2\n    // offsets for dithered alpha to mask.\n    // https://gitlab.freedesktop.org/nchery/mesa/commit/8a52e4cc4fad4f1c75acc0badd624778f9dfe202\n    // It appears that the offsets lower the thresholds by (offset / 4 /\n    // sample count). That's consistent with both 2, 2, 2, 2 making the test\n    // symmetric and 0, 0, 0, 0 (forgetting to set the offset values) resulting\n    // in what the official Adreno 200 driver for Android (which is pretty buggy\n    // overall) produces.\n    // According to Evergreen register reference:\n    // - offset0 is for pixel (0, 0) in each quad.\n    // - offset1 is for pixel (0, 1) in each quad.\n    // - offset2 is for pixel (1, 0) in each quad.\n    // - offset3 is for pixel (1, 1) in each quad.\n    uint32_t alpha_to_mask_offset0 : 2;  // +24\n    uint32_t alpha_to_mask_offset1 : 2;  // +26\n    uint32_t alpha_to_mask_offset2 : 2;  // +28\n    uint32_t alpha_to_mask_offset3 : 2;  // +30\n  };\n  static constexpr Register register_index = XE_GPU_REG_RB_COLORCONTROL;\n};\nstatic_assert_size(RB_COLORCONTROL, sizeof(uint32_t));\n\nunion alignas(uint32_t) RB_COLOR_INFO {\n  uint32_t value;\n  struct {\n    // The original R400 structure has 12-bit color_base, however the Xenos has\n    // periodic 11-bit EDRAM tile addressing, so this field was split in Xenia\n    // for convenience and to avoid mistakes.\n    uint32_t color_base : 11;                         // +0 in tiles.\n    uint32_t color_base_bit_11 : 1;                   // +11\n    uint32_t _pad_12 : 4;                             // +12\n    xenos::ColorRenderTargetFormat color_format : 4;  // +16\n    int32_t color_exp_bias : 6;                       // +20\n    uint32_t _pad_26 : 6;                             // +26\n  };\n  static constexpr Register register_index = XE_GPU_REG_RB_COLOR_INFO;\n  // RB_COLOR[1-3]_INFO also use this format.\n  static const Register rt_register_indices[4];\n};\nstatic_assert_size(RB_COLOR_INFO, sizeof(uint32_t));\n\nunion alignas(uint32_t) RB_COLOR_MASK {\n  uint32_t value;\n  struct {\n    uint32_t write_red0 : 1;    // +0\n    uint32_t write_green0 : 1;  // +1\n    uint32_t write_blue0 : 1;   // +2\n    uint32_t write_alpha0 : 1;  // +3\n    uint32_t write_red1 : 1;    // +4\n    uint32_t write_green1 : 1;  // +5\n    uint32_t write_blue1 : 1;   // +6\n    uint32_t write_alpha1 : 1;  // +7\n    uint32_t write_red2 : 1;    // +8\n    uint32_t write_green2 : 1;  // +9\n    uint32_t write_blue2 : 1;   // +10\n    uint32_t write_alpha2 : 1;  // +11\n    uint32_t write_red3 : 1;    // +12\n    uint32_t write_green3 : 1;  // +13\n    uint32_t write_blue3 : 1;   // +14\n    uint32_t write_alpha3 : 1;  // +15\n    uint32_t _pad_16 : 16;      // +16\n  };\n  static constexpr Register register_index = XE_GPU_REG_RB_COLOR_MASK;\n};\nstatic_assert_size(RB_COLOR_MASK, sizeof(uint32_t));\n\nunion alignas(uint32_t) RB_BLENDCONTROL {\n  uint32_t value;\n  struct {\n    xenos::BlendFactor color_srcblend : 5;   // +0\n    xenos::BlendOp color_comb_fcn : 3;       // +5\n    xenos::BlendFactor color_destblend : 5;  // +8\n    uint32_t _pad_13 : 3;                    // +13\n    xenos::BlendFactor alpha_srcblend : 5;   // +16\n    xenos::BlendOp alpha_comb_fcn : 3;       // +21\n    xenos::BlendFactor alpha_destblend : 5;  // +24\n    // BLEND_FORCE_ENABLE and BLEND_FORCE were added on Adreno.\n    uint32_t _pad_29 : 3;  // +29\n  };\n  // RB_BLENDCONTROL[0-3] use this format.\n  static constexpr Register register_index = XE_GPU_REG_RB_BLENDCONTROL0;\n  static const Register rt_register_indices[4];\n};\nstatic_assert_size(RB_BLENDCONTROL, sizeof(uint32_t));\n\nunion alignas(uint32_t) RB_DEPTHCONTROL {\n  uint32_t value;\n  struct {\n    uint32_t stencil_enable : 1;  // +0\n    uint32_t z_enable : 1;        // +1\n    uint32_t z_write_enable : 1;  // +2\n    // EARLY_Z_ENABLE was added on Adreno, never set by Xbox 360 games.\n    uint32_t _pad_3 : 1;                        // +3\n    xenos::CompareFunction zfunc : 3;           // +4\n    uint32_t backface_enable : 1;               // +7\n    xenos::CompareFunction stencilfunc : 3;     // +8\n    xenos::StencilOp stencilfail : 3;           // +11\n    xenos::StencilOp stencilzpass : 3;          // +14\n    xenos::StencilOp stencilzfail : 3;          // +17\n    xenos::CompareFunction stencilfunc_bf : 3;  // +20\n    xenos::StencilOp stencilfail_bf : 3;        // +23\n    xenos::StencilOp stencilzpass_bf : 3;       // +26\n    xenos::StencilOp stencilzfail_bf : 3;       // +29\n  };\n  static constexpr Register register_index = XE_GPU_REG_RB_DEPTHCONTROL;\n};\nstatic_assert_size(RB_DEPTHCONTROL, sizeof(uint32_t));\n\nunion alignas(uint32_t) RB_STENCILREFMASK {\n  uint32_t value;\n  struct {\n    uint32_t stencilref : 8;        // +0\n    uint32_t stencilmask : 8;       // +8\n    uint32_t stencilwritemask : 8;  // +16\n    uint32_t _pad_24 : 8;           // +24\n  };\n  static constexpr Register register_index = XE_GPU_REG_RB_STENCILREFMASK;\n  // RB_STENCILREFMASK_BF also uses this format.\n};\nstatic_assert_size(RB_STENCILREFMASK, sizeof(uint32_t));\n\nunion alignas(uint32_t) RB_DEPTH_INFO {\n  uint32_t value;\n  struct {\n    // The original R400 structure has 12-bit depth_base, however the Xenos has\n    // periodic 11-bit EDRAM tile addressing, so this field was split in Xenia\n    // for convenience and to avoid mistakes.\n    uint32_t depth_base : 11;                         // +0 in tiles.\n    uint32_t depth_base_bit_11 : 1;                   // +11\n    uint32_t _pad_12 : 4;                             // +12\n    xenos::DepthRenderTargetFormat depth_format : 1;  // +16\n    uint32_t _pad_17 : 15;                            // +17\n  };\n  static constexpr Register register_index = XE_GPU_REG_RB_DEPTH_INFO;\n};\nstatic_assert_size(RB_DEPTH_INFO, sizeof(uint32_t));\n\n// Copy registers are very different than on Adreno.\n\nunion alignas(uint32_t) RB_COPY_CONTROL {\n  uint32_t value;\n  struct {\n    uint32_t copy_src_select : 3;                    // +0 Depth is 4.\n    uint32_t _pad_3 : 1;                             // +3\n    xenos::CopySampleSelect copy_sample_select : 3;  // +4\n    uint32_t _pad_7 : 1;                             // +7\n    uint32_t color_clear_enable : 1;                 // +8\n    uint32_t depth_clear_enable : 1;                 // +9\n    uint32_t _pad_10 : 10;                           // +10\n    xenos::CopyCommand copy_command : 2;             // +20\n    uint32_t _pad_22 : 10;                           // +22\n  };\n  static constexpr Register register_index = XE_GPU_REG_RB_COPY_CONTROL;\n};\nstatic_assert_size(RB_COPY_CONTROL, sizeof(uint32_t));\n\nunion alignas(uint32_t) RB_COPY_DEST_INFO {\n  uint32_t value;\n  struct {\n    xenos::Endian128 copy_dest_endian : 3;            // +0\n    uint32_t copy_dest_array : 1;                     // +3\n    uint32_t copy_dest_slice : 3;                     // +4\n    xenos::ColorFormat copy_dest_format : 6;          // +7\n    xenos::SurfaceNumberFormat copy_dest_number : 3;  // +13\n    int32_t copy_dest_exp_bias : 6;                   // +16\n    uint32_t _pad_22 : 2;                             // +22\n    uint32_t copy_dest_swap : 1;                      // +24\n    uint32_t _pad_25 : 7;                             // +25\n  };\n  static constexpr Register register_index = XE_GPU_REG_RB_COPY_DEST_INFO;\n};\nstatic_assert_size(RB_COPY_DEST_INFO, sizeof(uint32_t));\n\nunion alignas(uint32_t) RB_COPY_DEST_PITCH {\n  uint32_t value;\n  struct {\n    uint32_t copy_dest_pitch : 14;   // +0\n    uint32_t _pad_14 : 2;            // +14\n    uint32_t copy_dest_height : 14;  // +16\n    uint32_t _pad_30 : 2;            // +30\n  };\n  static constexpr Register register_index = XE_GPU_REG_RB_COPY_DEST_PITCH;\n};\nstatic_assert_size(RB_COPY_DEST_PITCH, sizeof(uint32_t));\n\n/*******************************************************************************\n  ___ ___ ___ ___ _      ___   __\n |   \\_ _/ __| _ \\ |    /_\\ \\ / /\n | |) | |\\__ \\  _/ |__ / _ \\ V /\n |___/___|___/_| |____/_/ \\_\\_|\n\n   ___ ___  _  _ _____ ___  ___  _    _    ___ ___\n  / __/ _ \\| \\| |_   _| _ \\/ _ \\| |  | |  | __| _ \\\n | (_| (_) | .` | | | |   / (_) | |__| |__| _||   /\n  \\___\\___/|_|\\_| |_| |_|_\\\\___/|____|____|___|_|_\\\n\n*******************************************************************************/\n\nunion alignas(uint32_t) DC_LUT_RW_INDEX {\n  uint32_t value;\n  struct {\n    // Unlike in the M56 documentation, for the 256-table entry, this is the\n    // absolute index, without the lower or upper 10 bits selection in the\n    // bit 0. For PWL, the bit 7 is ignored.\n    uint32_t rw_index : 8;  // +0\n    uint32_t _pad_8 : 24;   // +8\n  };\n  static constexpr Register register_index = XE_GPU_REG_DC_LUT_RW_INDEX;\n};\nstatic_assert_size(DC_LUT_RW_INDEX, sizeof(uint32_t));\n\nunion alignas(uint32_t) DC_LUT_SEQ_COLOR {\n  uint32_t value;\n  struct {\n    uint32_t seq_color : 16;  // +0, bits 0:5 are hardwired to zero\n    uint32_t _pad_16 : 16;    // +16\n  };\n  static constexpr Register register_index = XE_GPU_REG_DC_LUT_SEQ_COLOR;\n};\nstatic_assert_size(DC_LUT_SEQ_COLOR, sizeof(uint32_t));\n\nunion alignas(uint32_t) DC_LUT_PWL_DATA {\n  uint32_t value;\n  struct {\n    // See the M56 DC_LUTA_CONTROL for information about the way these should be\n    // interpreted (`output = base + (multiplier * delta) / 2^increment`, where\n    // the increment is the value specified in DC_LUTA_CONTROL for the specific\n    // color channel, the base is 7 bits of the front buffer value above\n    // `increment` bits, the multiplier is the lower `increment` bits of it; the\n    // increment is nonzero, otherwise the 256-entry table should be used\n    // instead).\n    uint32_t base : 16;   // +0, bits 0:5 are hardwired to zero\n    uint32_t delta : 16;  // +16, bits 0:5 are hardwired to zero\n  };\n  static constexpr Register register_index = XE_GPU_REG_DC_LUT_PWL_DATA;\n};\nstatic_assert_size(DC_LUT_PWL_DATA, sizeof(uint32_t));\n\nunion alignas(uint32_t) DC_LUT_30_COLOR {\n  uint32_t value;\n  struct {\n    uint32_t color_10_blue : 10;   // +0\n    uint32_t color_10_green : 10;  // +10\n    uint32_t color_10_red : 10;    // +20\n    uint32_t _pad_30 : 2;          // +30\n  };\n  static constexpr Register register_index = XE_GPU_REG_DC_LUT_30_COLOR;\n};\nstatic_assert_size(DC_LUT_30_COLOR, sizeof(uint32_t));\n\n}  // namespace reg\n\n}  // namespace gpu\n}  // namespace xe\n\n#endif  // XENIA_GPU_REGISTERS_H_\n"
  },
  {
    "path": "src/xenia/gpu/render_target_cache.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/render_target_cache.h\"\n\n#include <algorithm>\n#include <cmath>\n#include <cstring>\n#include <iterator>\n#include <tuple>\n#include <unordered_set>\n#include <utility>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/cvar.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/gpu/draw_util.h\"\n#include \"xenia/gpu/register_file.h\"\n#include \"xenia/gpu/registers.h\"\n#include \"xenia/gpu/xenos.h\"\n\nDEFINE_bool(\n    depth_transfer_not_equal_test, true,\n    \"When transferring data between depth render targets, use the \\\"not \"\n    \"equal\\\" test to avoid writing rewriting depth via shader depth output if \"\n    \"it's the same as the one currently in the depth buffer in case of round \"\n    \"trips of the data.\\n\"\n    \"Settings this to true may make transfer round trips more friendly to \"\n    \"depth compression depending on how the GPU implements it (as arbitrary \"\n    \"depth output may result in it being disabled completely), which is \"\n    \"beneficial to subsequent rendering, while setting this to false may \"\n    \"reduce bandwidth usage during transfers as the previous depth won't need \"\n    \"to be read.\",\n    \"GPU\");\n// Lossless round trip: 545407F2.\n// Lossy round trip with the \"greater or equal\" test afterwards: 4D530919.\n// Lossy round trip with the \"equal\" test afterwards: 535107F5, 565507EF.\nDEFINE_bool(\n    depth_float24_round, false,\n    \"Whether to round to the nearest even, rather than truncating (rounding \"\n    \"towards zero), the depth when converting it to 24-bit floating-point \"\n    \"(20e4) from the host precision (32-bit floating point) when using a host \"\n    \"depth buffer.\\n\"\n    \"false:\\n\"\n    \" Recommended.\\n\"\n    \" The conversion may move the depth values farther away from the camera.\\n\"\n    \" Without depth_float24_convert_in_pixel_shader:\\n\"\n    \"  The \\\"greater or equal\\\" depth test function continues to work fine if \"\n    \"the full host precision depth data is lost, it's still possible to draw \"\n    \"another pass of the same geometry with it.\\n\"\n    \"  (See the description of depth_float24_convert_in_pixel_shader for more \"\n    \"information about full precision depth data loss.)\\n\"\n    \" With depth_float24_convert_in_pixel_shader:\\n\"\n    \"  Faster - the pixel shader for hidden surfaces may still be skipped \"\n    \"(using conservative depth output).\\n\"\n    \"true:\\n\"\n    \" Only for special cases of issues caused by minor 32-bit floating-point \"\n    \"rounding errors, for instance, when the game tries to draw something at \"\n    \"the camera plane by setting Z of the vertex position to W.\\n\"\n    \" The conversion may move the depth values closer or farther.\\n\"\n    \" Using the same rounding mode as in the Direct3D 9 reference rasterizer.\\n\"\n    \" Without depth_float24_convert_in_pixel_shader:\\n\"\n    \"  Not possible to recover from a full host precision depth data loss - in \"\n    \"subsequent passes of rendering the same geometry, half of the samples \"\n    \"will be failing the depth test with the \\\"greater or equal\\\" depth test \"\n    \"function.\\n\"\n    \" With depth_float24_convert_in_pixel_shader:\\n\"\n    \"  Slower - depth rejection before the pixel shader is not possible.\\n\"\n    \"When the depth buffer is emulated in software (via the fragment shader \"\n    \"interlock / rasterizer-ordered view), this is ignored, and rounding to \"\n    \"the nearest even is always done.\",\n    \"GPU\");\n// With MSAA, when converting the depth in pixel shaders, they must run at\n// sample frequency - otherwise, if the depth is the same for the entire pixel,\n// intersections of polygons cannot be antialiased.\n//\n// Important usage note: When using this mode, bounds of the fixed-function\n// viewport must be converted to and back from float24 too (preferably using\n// rounding to the nearest even regardless of whether truncation was requested\n// for the values, to reduce the error already caused by truncation rather than\n// to amplify it). This ensures that clamping to the viewport bounds, which\n// happens after the pixel shader even if it overwrites the resulting depth, is\n// never done to a value not representable as float24 (for example, if the\n// minimum Z is a number too small to be represented as float24, but not zero,\n// it won't be possible to write what should become 0x000000 to the depth\n// buffer). Note that this may add some error to the depth values from the\n// rasterizer; however, modifying Z in the vertex shader to make interpolated\n// depth values would cause clipping to be done to different bounds, which may\n// be more undesirable, especially in cases when Z is explicitly set to a value\n// like 0 or W (in such cases, the adjusted polygon may go outside 0...W in clip\n// space and disappear).\n//\n// If false, doing the depth test at the host precision, converting to 20e4 to\n// support reinterpretation, but keeping track of both the last color (or\n// non-20e4 depth) value (let's call it stored_f24) and the last host depth\n// value (stored_host) for each EDRAM pixel, reloading the last host depth value\n// if stored_f24 == to_f24(stored_host) (otherwise it was overwritten by\n// something else, like clearing, or an actually used color buffer; this is\n// inexact though, and will incorrectly load pixels that were overwritten by\n// something else in the EDRAM, but turned out to have the same value on the\n// guest as before - an outdated host-precision value will be loaded in these\n// cases instead).\nDEFINE_bool(\n    depth_float24_convert_in_pixel_shader, false,\n    \"Whether to convert the depth values to 24-bit floating-point (20e4) from \"\n    \"the host precision (32-bit floating point) directly in the pixel shaders \"\n    \"of guest draws when using a host depth buffer.\\n\"\n    \"This prevents visual artifacts (interleaved stripes of parts of surfaces \"\n    \"rendered and parts not rendered, having either the same width in case of \"\n    \"the \\\"greater or equal\\\" depth test function, or the former being much \"\n    \"thinner than the latter with the \\\"equal\\\" function) if the full host \"\n    \"precision depth data is lost.\\n\"\n    \"This issue may happen if the game reloads the depth data previously \"\n    \"evicted from the EDRAM to the RAM back to the EDRAM, but the EDRAM region \"\n    \"that previously contained that depth buffer was overwritten by another \"\n    \"depth buffer, or the game loads it to a different location in the EDRAM \"\n    \"than it was previously placed at, thus Xenia is unable to restore the \"\n    \"depth data with the original precision, and instead falls back to \"\n    \"converting the lower-precision values, so in subsequent rendering passes \"\n    \"for the same geometry, the actual depth values of the surfaces don't \"\n    \"match those stored in the depth buffer anymore.\\n\"\n    \"This is a costly option because it makes the GPU unable to use depth \"\n    \"buffer compression, and also with MSAA, forces the pixel shader to run \"\n    \"for every subpixel sample rather than for the entire pixel, making pixel \"\n    \"shading 2 or 4 times heavier depending on the MSAA sample count.\\n\"\n    \"The rounding direction is controlled by the depth_float24_round \"\n    \"configuration variable.\\n\"\n    \"Note that with depth_float24_round = true, this becomes even more costly \"\n    \"because pixel shaders must be executed regardless of whether the surface \"\n    \"is behind the previously drawn surfaces. With depth_float24_round = \"\n    \"false, conservative depth output is used, however, so depth rejection \"\n    \"before the pixel shader may still work.\\n\"\n    \"If sample-rate shading is not supported by the host GPU, the conversion \"\n    \"in the pixel shader is done only when MSAA is not used.\\n\"\n    \"When the depth buffer is emulated in software (via the fragment shader \"\n    \"interlock / rasterizer-ordered view), this is ignored because 24-bit \"\n    \"depth is always used directly.\",\n    \"GPU\");\nDEFINE_bool(\n    draw_resolution_scaled_texture_offsets, true,\n    \"Apply offsets from texture fetch instructions taking resolution scale \"\n    \"into account for render-to-texture, for more correct shadow filtering, \"\n    \"bloom, etc., in some cases.\",\n    \"GPU\");\nDEFINE_bool(\n    gamma_render_target_as_unorm16, true,\n    \"When the host can't write 8 bits per component pixels with piecewise \"\n    \"linear gamma encoding directly with correct blending, use the 16-bit \"\n    \"unsigned normalized format, if supported, for conceptually correct \"\n    \"8_8_8_8_GAMMA render target format blending in linear color space. \"\n    \"Greatly increases accuracy for this format, but may result in render \"\n    \"target copying costs if the game switches between 8_8_8_8_GAMMA and \"\n    \"8_8_8_8 views for the same EDRAM render target.\",\n    \"GPU\");\nDEFINE_bool(\n    mrt_edram_used_range_clamp_to_min, true,\n    \"With host render targets, if multiple render targets are bound, estimate \"\n    \"the EDRAM range modified in any of them to be not bigger than the \"\n    \"distance between any two render targets in the EDRAM, rather than \"\n    \"allowing the last one claim the rest of the EDRAM.\\n\"\n    \"Has effect primarily on draws without viewport clipping.\\n\"\n    \"Setting this to false results in higher accuracy in rare cases, but may \"\n    \"increase the amount of copying that needs to be done sometimes.\",\n    \"GPU\");\nDEFINE_bool(\n    native_2x_msaa, true,\n    \"Use host 2x MSAA when available. Can be disabled for scalability testing \"\n    \"on host GPU APIs where 2x is not mandatory, in this case, 2 samples of 4x \"\n    \"MSAA will be used instead (with similar or worse quality and higher \"\n    \"memory usage).\",\n    \"GPU\");\nDEFINE_bool(\n    native_stencil_value_output, true,\n    \"Use pixel shader stencil reference output where available for purposes \"\n    \"like copying between render targets. Can be disabled for scalability \"\n    \"testing, in this case, much more expensive drawing of 8 quads will be \"\n    \"done.\",\n    \"GPU\");\nDEFINE_bool(\n    snorm16_render_target_full_range, true,\n    \"When the host can only support 16_16 and 16_16_16_16 render targets as \"\n    \"-1...1, remap -32...32 to -1...1 to use the full possible range of \"\n    \"values, at the expense of multiplicative blending correctness.\",\n    \"GPU\");\n// Enabled by default as the GPU is overall usually the bottleneck when the\n// pixel shader interlock render backend implementation is used, anything that\n// may improve GPU performance is favorable.\nDEFINE_bool(\n    execute_unclipped_draw_vs_on_cpu_for_psi_render_backend, true,\n    \"If execute_unclipped_draw_vs_on_cpu is enabled, execute the vertex shader \"\n    \"for unclipped draws on the CPU even when using the pixel shader interlock \"\n    \"(rasterizer-ordered view) implementation of the render backend on the \"\n    \"host, for which no expensive copying between host render targets is \"\n    \"needed when the ownership of a EDRAM range is changed.\\n\"\n    \"If this is enabled, excessive barriers may be eliminated when switching \"\n    \"between different render targets in separate EDRAM locations.\",\n    \"GPU\");\n\nnamespace xe {\nnamespace gpu {\n\nvoid RenderTargetCache::GetPSIColorFormatInfo(\n    xenos::ColorRenderTargetFormat format, uint32_t write_mask,\n    float& clamp_rgb_low, float& clamp_alpha_low, float& clamp_rgb_high,\n    float& clamp_alpha_high, uint32_t& keep_mask_low,\n    uint32_t& keep_mask_high) {\n  keep_mask_low = keep_mask_high = 0;\n  switch (format) {\n    case xenos::ColorRenderTargetFormat::k_8_8_8_8:\n    case xenos::ColorRenderTargetFormat::k_8_8_8_8_GAMMA: {\n      clamp_rgb_low = clamp_alpha_low = 0.0f;\n      clamp_rgb_high = clamp_alpha_high = 1.0f;\n      for (uint32_t i = 0; i < 4; ++i) {\n        if (!(write_mask & (1 << i))) {\n          keep_mask_low |= uint32_t(0xFF) << (i * 8);\n        }\n      }\n    } break;\n    case xenos::ColorRenderTargetFormat::k_2_10_10_10:\n    case xenos::ColorRenderTargetFormat::k_2_10_10_10_AS_10_10_10_10: {\n      clamp_rgb_low = clamp_alpha_low = 0.0f;\n      clamp_rgb_high = clamp_alpha_high = 1.0f;\n      for (uint32_t i = 0; i < 3; ++i) {\n        if (!(write_mask & (1 << i))) {\n          keep_mask_low |= uint32_t(0x3FF) << (i * 10);\n        }\n      }\n      if (!(write_mask & 0b1000)) {\n        keep_mask_low |= uint32_t(3) << 30;\n      }\n    } break;\n    case xenos::ColorRenderTargetFormat::k_2_10_10_10_FLOAT:\n    case xenos::ColorRenderTargetFormat::k_2_10_10_10_FLOAT_AS_16_16_16_16: {\n      clamp_rgb_low = clamp_alpha_low = 0.0f;\n      clamp_rgb_high = 31.875f;\n      clamp_alpha_high = 1.0f;\n      for (uint32_t i = 0; i < 3; ++i) {\n        if (!(write_mask & (1 << i))) {\n          keep_mask_low |= uint32_t(0x3FF) << (i * 10);\n        }\n      }\n      if (!(write_mask & 0b1000)) {\n        keep_mask_low |= uint32_t(3) << 30;\n      }\n    } break;\n    case xenos::ColorRenderTargetFormat::k_16_16:\n    case xenos::ColorRenderTargetFormat::k_16_16_16_16:\n      // Alpha clamping affects blending source, so it's non-zero for alpha for\n      // k_16_16 (the render target is fixed-point). There's one deviation from\n      // how Direct3D 11.3 functional specification defines SNorm conversion\n      // (NaN should be 0, not the lowest negative number), and that needs to be\n      // handled separately.\n      clamp_rgb_low = clamp_alpha_low = -32.0f;\n      clamp_rgb_high = clamp_alpha_high = 32.0f;\n      if (!(write_mask & 0b0001)) {\n        keep_mask_low |= 0xFFFFu;\n      }\n      if (!(write_mask & 0b0010)) {\n        keep_mask_low |= 0xFFFF0000u;\n      }\n      if (format == xenos::ColorRenderTargetFormat::k_16_16_16_16) {\n        if (!(write_mask & 0b0100)) {\n          keep_mask_high |= 0xFFFFu;\n        }\n        if (!(write_mask & 0b1000)) {\n          keep_mask_high |= 0xFFFF0000u;\n        }\n      } else {\n        write_mask &= 0b0011;\n      }\n      break;\n    case xenos::ColorRenderTargetFormat::k_16_16_FLOAT:\n    case xenos::ColorRenderTargetFormat::k_16_16_16_16_FLOAT:\n      // No NaNs on the Xbox 360 GPU, though can't use the extended range with\n      // Direct3D and Vulkan conversions.\n      // TODO(Triang3l): Use the extended-range encoding in all implementations.\n      clamp_rgb_low = clamp_alpha_low = -65504.0f;\n      clamp_rgb_high = clamp_alpha_high = 65504.0f;\n      if (!(write_mask & 0b0001)) {\n        keep_mask_low |= 0xFFFFu;\n      }\n      if (!(write_mask & 0b0010)) {\n        keep_mask_low |= 0xFFFF0000u;\n      }\n      if (format == xenos::ColorRenderTargetFormat::k_16_16_16_16_FLOAT) {\n        if (!(write_mask & 0b0100)) {\n          keep_mask_high |= 0xFFFFu;\n        }\n        if (!(write_mask & 0b1000)) {\n          keep_mask_high |= 0xFFFF0000u;\n        }\n      } else {\n        write_mask &= 0b0011;\n      }\n      break;\n    case xenos::ColorRenderTargetFormat::k_32_FLOAT:\n      // No clamping - let min/max always pick the original value.\n      clamp_rgb_low = clamp_alpha_low = clamp_rgb_high = clamp_alpha_high =\n          std::nanf(\"\");\n      write_mask &= 0b0001;\n      if (!(write_mask & 0b0001)) {\n        keep_mask_low = ~uint32_t(0);\n      }\n      break;\n    case xenos::ColorRenderTargetFormat::k_32_32_FLOAT:\n      // No clamping - let min/max always pick the original value.\n      clamp_rgb_low = clamp_alpha_low = clamp_rgb_high = clamp_alpha_high =\n          std::nanf(\"\");\n      write_mask &= 0b0011;\n      if (!(write_mask & 0b0001)) {\n        keep_mask_low = ~uint32_t(0);\n      }\n      if (!(write_mask & 0b0010)) {\n        keep_mask_high = ~uint32_t(0);\n      }\n      break;\n    default:\n      assert_unhandled_case(format);\n      // Disable invalid render targets.\n      write_mask = 0;\n      break;\n  }\n  // Special case handled in the shaders for empty write mask to completely skip\n  // a disabled render target: all keep bits are set.\n  if (!write_mask) {\n    keep_mask_low = keep_mask_high = ~uint32_t(0);\n  }\n}\n\nuint32_t RenderTargetCache::Transfer::GetRangeRectangles(\n    uint32_t start_tiles, uint32_t end_tiles, uint32_t base_tiles,\n    uint32_t pitch_tiles, xenos::MsaaSamples msaa_samples, bool is_64bpp,\n    Rectangle* rectangles_out, const Rectangle* cutout) {\n  // EDRAM addressing wrapping must be handled by doing GetRangeRectangles for\n  // two clamped ranges, in this case start_tiles == end_tiles will also\n  // unambiguously mean an empty range rather than the entire EDRAM.\n  assert_true(start_tiles < xenos::kEdramTileCount);\n  assert_true(end_tiles <= xenos::kEdramTileCount);\n  assert_true(start_tiles <= end_tiles);\n  // If start_tiles < base_tiles, this is the tail after EDRAM addressing\n  // wrapping.\n  assert_true(start_tiles >= base_tiles || end_tiles <= base_tiles);\n  assert_not_zero(pitch_tiles);\n  if (start_tiles == end_tiles) {\n    return 0;\n  }\n  uint32_t tile_width =\n      xenos::kEdramTileWidthSamples >>\n      (uint32_t(msaa_samples >= xenos::MsaaSamples::k4X) + uint32_t(is_64bpp));\n  uint32_t tile_height = xenos::kEdramTileHeightSamples >>\n                         uint32_t(msaa_samples >= xenos::MsaaSamples::k2X);\n  // If the first and / or the last rows have the same X spans as the middle\n  // part, merge them with it.\n  uint32_t rectangle_count = 0;\n  // If start_tiles < base_tiles, this is the tail after EDRAM addressing\n  // wrapping.\n  uint32_t local_offset = start_tiles < base_tiles ? xenos::kEdramTileCount : 0;\n  uint32_t local_start = local_offset + start_tiles - base_tiles;\n  uint32_t local_end = local_offset + end_tiles - base_tiles;\n  // Inclusive.\n  uint32_t rows_start = local_start / pitch_tiles;\n  // Exclusive.\n  uint32_t rows_end = (local_end + (pitch_tiles - 1)) / pitch_tiles;\n  uint32_t row_first_start = local_start - rows_start * pitch_tiles;\n  uint32_t row_last_end = pitch_tiles - (rows_end * pitch_tiles - local_end);\n  uint32_t rows = rows_end - rows_start;\n  if (rows == 1 || row_first_start) {\n    Rectangle rectangle_first;\n    rectangle_first.x_pixels = row_first_start * tile_width;\n    rectangle_first.y_pixels = rows_start * tile_height;\n    rectangle_first.width_pixels =\n        ((rows == 1 ? row_last_end : pitch_tiles) - row_first_start) *\n        tile_width;\n    rectangle_first.height_pixels = tile_height;\n    rectangle_count += AddRectangle(\n        rectangle_first,\n        rectangles_out ? rectangles_out + rectangle_count : nullptr, cutout);\n    if (rows == 1) {\n      return rectangle_count;\n    }\n  }\n  uint32_t mid_rows_start = rows_start + 1;\n  uint32_t mid_rows = rows - 2;\n  if (!row_first_start) {\n    --mid_rows_start;\n    ++mid_rows;\n  }\n  if (row_last_end == pitch_tiles) {\n    ++mid_rows;\n  }\n  if (mid_rows) {\n    Rectangle rectangle_mid;\n    rectangle_mid.x_pixels = 0;\n    rectangle_mid.y_pixels = mid_rows_start * tile_height;\n    rectangle_mid.width_pixels = pitch_tiles * tile_width;\n    rectangle_mid.height_pixels = mid_rows * tile_height;\n    rectangle_count += AddRectangle(\n        rectangle_mid,\n        rectangles_out ? rectangles_out + rectangle_count : nullptr, cutout);\n  }\n  if (row_last_end != pitch_tiles) {\n    Rectangle rectangle_last;\n    rectangle_last.x_pixels = 0;\n    rectangle_last.y_pixels = (rows_end - 1) * tile_height;\n    rectangle_last.width_pixels = row_last_end * tile_width;\n    rectangle_last.height_pixels = tile_height;\n    rectangle_count += AddRectangle(\n        rectangle_last,\n        rectangles_out ? rectangles_out + rectangle_count : nullptr, cutout);\n  }\n  assert_true(rectangle_count <= (cutout ? kMaxRectanglesWithCutout\n                                         : kMaxRectanglesWithoutCutout));\n  return rectangle_count;\n}\n\nuint32_t RenderTargetCache::Transfer::AddRectangle(const Rectangle& rectangle,\n                                                   Rectangle* rectangles_out,\n                                                   const Rectangle* cutout) {\n  uint32_t rectangle_right = rectangle.x_pixels + rectangle.width_pixels;\n  uint32_t rectangle_bottom = rectangle.y_pixels + rectangle.height_pixels;\n  // If nothing to cut out (no region specified, or no intersection - if the\n  // cutout region is in the middle on Y, but completely to the left / right on\n  // X, don't split), add the whole rectangle.\n  if (!cutout || !cutout->width_pixels || !cutout->height_pixels ||\n      cutout->x_pixels >= rectangle_right ||\n      cutout->x_pixels + cutout->width_pixels <= rectangle.x_pixels ||\n      cutout->y_pixels >= rectangle_bottom ||\n      cutout->y_pixels + cutout->height_pixels <= rectangle.y_pixels) {\n    if (rectangles_out) {\n      rectangles_out[0] = rectangle;\n    }\n    return 1;\n  }\n  uint32_t rectangle_count = 0;\n  uint32_t cutout_right = cutout->x_pixels + cutout->width_pixels;\n  uint32_t cutout_bottom = cutout->y_pixels + cutout->height_pixels;\n  // Upper part after cutout.\n  if (cutout->y_pixels > rectangle.y_pixels) {\n    // The completely outside case has already been checked.\n    assert_true(cutout->y_pixels < rectangle_bottom);\n    if (rectangles_out) {\n      Rectangle& rectangle_upper = rectangles_out[rectangle_count];\n      rectangle_upper.x_pixels = rectangle.x_pixels;\n      rectangle_upper.y_pixels = rectangle.y_pixels;\n      rectangle_upper.width_pixels = rectangle.width_pixels;\n      // cutout->y_pixels is already known to be < rectangle_bottom, no need for\n      // min(cutout->y_pixels - rectangle.y_pixels, rectangle.height_pixels).\n      rectangle_upper.height_pixels = cutout->y_pixels - rectangle.y_pixels;\n    }\n    ++rectangle_count;\n  }\n  // Middle part after cutout.\n  uint32_t middle_top = std::max(cutout->y_pixels, rectangle.y_pixels);\n  uint32_t middle_height =\n      std::min(cutout_bottom, rectangle_bottom) - middle_top;\n  // Middle left.\n  if (cutout->x_pixels > rectangle.x_pixels) {\n    assert_true(cutout->x_pixels < rectangle_right);\n    if (rectangles_out) {\n      Rectangle& rectangle_middle_left = rectangles_out[rectangle_count];\n      rectangle_middle_left.x_pixels = rectangle.x_pixels;\n      rectangle_middle_left.y_pixels = middle_top;\n      rectangle_middle_left.width_pixels =\n          cutout->x_pixels - rectangle.x_pixels;\n      rectangle_middle_left.height_pixels = middle_height;\n    }\n    ++rectangle_count;\n  }\n  // Middle right.\n  if (cutout_right < rectangle_right) {\n    assert_true(cutout_right > rectangle.x_pixels);\n    if (rectangles_out) {\n      Rectangle& rectangle_middle_right = rectangles_out[rectangle_count];\n      rectangle_middle_right.x_pixels = cutout_right;\n      rectangle_middle_right.y_pixels = middle_top;\n      rectangle_middle_right.width_pixels = rectangle_right - cutout_right;\n      rectangle_middle_right.height_pixels = middle_height;\n    }\n    ++rectangle_count;\n  }\n  // Lower part after cutout.\n  if (cutout_bottom < rectangle_bottom) {\n    assert_true(cutout_bottom > rectangle.y_pixels);\n    if (rectangles_out) {\n      Rectangle& rectangle_upper = rectangles_out[rectangle_count];\n      rectangle_upper.x_pixels = rectangle.x_pixels;\n      rectangle_upper.y_pixels = cutout_bottom;\n      rectangle_upper.width_pixels = rectangle.width_pixels;\n      rectangle_upper.height_pixels = rectangle_bottom - cutout_bottom;\n    }\n    ++rectangle_count;\n  }\n  assert_true(rectangle_count <= kMaxCutoutBorderRectangles);\n  return rectangle_count;\n}\n\nRenderTargetCache::~RenderTargetCache() { ShutdownCommon(); }\n\nvoid RenderTargetCache::InitializeCommon() {\n  assert_true(ownership_ranges_.empty());\n  ownership_ranges_.emplace(\n      std::piecewise_construct, std::forward_as_tuple(uint32_t(0)),\n      std::forward_as_tuple(xenos::kEdramTileCount, RenderTargetKey(),\n                            RenderTargetKey(), RenderTargetKey()));\n}\n\nvoid RenderTargetCache::DestroyAllRenderTargets(bool shutting_down) {\n  ownership_ranges_.clear();\n  if (!shutting_down) {\n    ownership_ranges_.emplace(\n        std::piecewise_construct, std::forward_as_tuple(uint32_t(0)),\n        std::forward_as_tuple(xenos::kEdramTileCount, RenderTargetKey(),\n                              RenderTargetKey(), RenderTargetKey()));\n  }\n\n  for (const auto& render_target_pair : render_targets_) {\n    if (render_target_pair.second) {\n      delete render_target_pair.second;\n    }\n  }\n  render_targets_.clear();\n}\n\nvoid RenderTargetCache::ShutdownCommon() { DestroyAllRenderTargets(true); }\n\nvoid RenderTargetCache::ClearCache() {\n  // Keep only render targets currently owning any EDRAM data.\n  if (!render_targets_.empty()) {\n    std::unordered_set<RenderTargetKey, RenderTargetKey::Hasher>\n        used_render_targets;\n    for (const auto& ownership_range_pair : ownership_ranges_) {\n      const OwnershipRange& ownership_range = ownership_range_pair.second;\n      if (!ownership_range.render_target.IsEmpty()) {\n        used_render_targets.emplace(ownership_range.render_target);\n      }\n      if (!ownership_range.host_depth_render_target_unorm24.IsEmpty()) {\n        used_render_targets.emplace(\n            ownership_range.host_depth_render_target_unorm24);\n      }\n      if (!ownership_range.host_depth_render_target_float24.IsEmpty()) {\n        used_render_targets.emplace(\n            ownership_range.host_depth_render_target_float24);\n      }\n    }\n    if (render_targets_.size() != used_render_targets.size()) {\n      typename decltype(render_targets_)::iterator it_next;\n      for (auto it = render_targets_.begin(); it != render_targets_.end();\n           it = it_next) {\n        it_next = std::next(it);\n        if (!it->second) {\n          render_targets_.erase(it);\n          continue;\n        }\n        if (used_render_targets.find(it->second->key()) ==\n            used_render_targets.end()) {\n          delete it->second;\n          render_targets_.erase(it);\n        }\n      }\n    }\n  }\n}\n\nvoid RenderTargetCache::BeginFrame() { ResetAccumulatedRenderTargets(); }\n\nbool RenderTargetCache::Update(bool is_rasterization_done,\n                               reg::RB_DEPTHCONTROL normalized_depth_control,\n                               uint32_t normalized_color_mask,\n                               const Shader& vertex_shader) {\n  const RegisterFile& regs = register_file();\n  bool interlock_barrier_only = GetPath() == Path::kPixelShaderInterlock;\n\n  auto rb_surface_info = regs.Get<reg::RB_SURFACE_INFO>();\n  xenos::MsaaSamples msaa_samples = rb_surface_info.msaa_samples;\n  assert_true(msaa_samples <= xenos::MsaaSamples::k4X);\n  if (msaa_samples > xenos::MsaaSamples::k4X) {\n    // Safety check because a lot of code assumes up to 4x.\n    assert_always();\n    XELOGE(\"{}x MSAA requested by the guest, Xenos only supports up to 4x\",\n           uint32_t(1) << uint32_t(msaa_samples));\n    return false;\n  }\n  uint32_t msaa_samples_x_log2 =\n      uint32_t(msaa_samples >= xenos::MsaaSamples::k4X);\n  uint32_t pitch_pixels = rb_surface_info.surface_pitch;\n  // surface_pitch 0 should be handled in disabling rasterization (hopefully\n  // it's safe to assume that).\n  assert_true(pitch_pixels || !is_rasterization_done);\n  if (!pitch_pixels) {\n    is_rasterization_done = false;\n  } else if (pitch_pixels > xenos::kTexture2DCubeMaxWidthHeight) {\n    XELOGE(\n        \"Surface pitch {} larger than the maximum texture width {} specified \"\n        \"by the guest\",\n        pitch_pixels, xenos::kTexture2DCubeMaxWidthHeight);\n    return false;\n  }\n  uint32_t pitch_tiles_at_32bpp = ((pitch_pixels << msaa_samples_x_log2) +\n                                   (xenos::kEdramTileWidthSamples - 1)) /\n                                  xenos::kEdramTileWidthSamples;\n  if (!interlock_barrier_only) {\n    uint32_t pitch_pixels_tile_aligned_scaled =\n        pitch_tiles_at_32bpp *\n        (xenos::kEdramTileWidthSamples >> msaa_samples_x_log2) *\n        draw_resolution_scale_x();\n    uint32_t max_render_target_width = GetMaxRenderTargetWidth();\n    if (pitch_pixels_tile_aligned_scaled > max_render_target_width) {\n      // TODO(Triang3l): If really needed for some game on some device, clamp\n      // the pitch and generate multiple ranges (each for every row of tiles)\n      // with gaps for padding. Very few PowerVR GPUs have 4096, not 8192, as\n      // the limit, though with 8192 (on Mali) the actual limit for Xenia is\n      // 8160 because tile padding is stored - but 8192 should be extremely rare\n      // anyway.\n      XELOGE(\n          \"Surface pitch aligned to EDRAM tiles and resolution-scaled {} \"\n          \"larger than the maximum host render target width {}\",\n          pitch_pixels_tile_aligned_scaled, max_render_target_width);\n      return false;\n    }\n  }\n\n  // Get used render targets.\n  // [0] is depth / stencil where relevant, [1...4] is color.\n  // Depth / stencil testing / writing is before color in the pipeline.\n  uint32_t depth_and_color_rts_used_bits = 0;\n  // depth_and_color_rts_used_bits -> EDRAM base.\n  uint32_t edram_bases[1 + xenos::kMaxColorRenderTargets];\n  uint32_t resource_formats[1 + xenos::kMaxColorRenderTargets];\n  uint32_t rts_are_64bpp = 0;\n  if (is_rasterization_done) {\n    if (normalized_depth_control.z_enable ||\n        normalized_depth_control.stencil_enable) {\n      depth_and_color_rts_used_bits |= 1;\n      auto rb_depth_info = regs.Get<reg::RB_DEPTH_INFO>();\n      edram_bases[0] = rb_depth_info.depth_base;\n      // With pixel shader interlock, always the same addressing disregarding\n      // the format.\n      resource_formats[0] =\n          interlock_barrier_only ? 0 : uint32_t(rb_depth_info.depth_format);\n    }\n    for (uint32_t i = 0; i < xenos::kMaxColorRenderTargets; ++i) {\n      if (!(normalized_color_mask & (uint32_t(0b1111) << (4 * i)))) {\n        continue;\n      }\n      auto color_info = regs.Get<reg::RB_COLOR_INFO>(\n          reg::RB_COLOR_INFO::rt_register_indices[i]);\n      uint32_t rt_bit_index = 1 + i;\n      depth_and_color_rts_used_bits |= uint32_t(1) << rt_bit_index;\n      edram_bases[rt_bit_index] = color_info.color_base;\n      xenos::ColorRenderTargetFormat color_format =\n          regs.Get<reg::RB_COLOR_INFO>(\n                  reg::RB_COLOR_INFO::rt_register_indices[i])\n              .color_format;\n      bool is_64bpp = xenos::IsColorRenderTargetFormat64bpp(color_format);\n      if (is_64bpp) {\n        rts_are_64bpp |= uint32_t(1) << rt_bit_index;\n      }\n      xenos::ColorRenderTargetFormat color_resource_format;\n      if (interlock_barrier_only) {\n        // Only changes in mapping between coordinates and addresses are\n        // interesting (along with access overlap between draw calls), thus only\n        // pixel size is relevant.\n        color_resource_format =\n            is_64bpp ? xenos::ColorRenderTargetFormat::k_16_16_16_16\n                     : xenos::ColorRenderTargetFormat::k_8_8_8_8;\n      } else {\n        color_resource_format =\n            GetColorResourceFormat(xenos::GetStorageColorFormat(color_format));\n      }\n      resource_formats[rt_bit_index] = uint32_t(color_resource_format);\n    }\n  }\n\n  uint32_t rts_remaining;\n  uint32_t rt_index;\n\n  // Eliminate other bound render targets if their EDRAM base conflicts with\n  // another render target - it's an error in most host implementations to bind\n  // the same render target into multiple slots, also the behavior would be\n  // unpredictable if that happens.\n  // Depth is considered the least important as it's earlier in the pipeline\n  // (issues caused by color and depth render target collisions haven't been\n  // found yet), but render targets with smaller index are considered more\n  // important - specifically, because of the usage in the lighting pass of\n  // 4D5307E6, which can be checked in the vertical look calibration sequence in\n  // the beginning of the game: if render target 0 is removed in favor of 1, the\n  // characters and the world will be too dark, like fully in shadow -\n  // especially prominent on the helmet. This happens because the shader picks\n  // between two render targets to write dynamically (though with a static, bool\n  // constant condition), but all other state is set up in a way that implies\n  // the same render target being bound twice. On Direct3D 9, if you don't write\n  // to a color pixel shader output on the control flow that was taken, the\n  // render target will not be written to. However, this has been relaxed in\n  // Direct3D 10, where if the shader declares an output, it's assumed to be\n  // always written (or with an undefined value otherwise).\n  rts_remaining = depth_and_color_rts_used_bits & ~(uint32_t(1));\n  while (xe::bit_scan_forward(rts_remaining, &rt_index)) {\n    rts_remaining &= ~(uint32_t(1) << rt_index);\n    uint32_t edram_base = edram_bases[rt_index];\n    uint32_t rts_other_remaining =\n        depth_and_color_rts_used_bits &\n        (~((uint32_t(1) << (rt_index + 1)) - 1) | uint32_t(1));\n    uint32_t rt_other_index;\n    while (xe::bit_scan_forward(rts_other_remaining, &rt_other_index)) {\n      rts_other_remaining &= ~(uint32_t(1) << rt_other_index);\n      if (edram_bases[rt_other_index] == edram_base) {\n        depth_and_color_rts_used_bits &= ~(uint32_t(1) << rt_other_index);\n      }\n    }\n  }\n\n  // Clear ownership transfers before adding any.\n  if (!interlock_barrier_only) {\n    for (size_t i = 0; i < xe::countof(last_update_transfers_); ++i) {\n      last_update_transfers_[i].clear();\n    }\n  }\n\n  if (!depth_and_color_rts_used_bits) {\n    // Nothing to bind, don't waste time on things like memexport-only draws -\n    // just check if old bindings can still be used.\n    std::memset(last_update_used_render_targets_, 0,\n                sizeof(last_update_used_render_targets_));\n    if (are_accumulated_render_targets_valid_) {\n      for (size_t i = 0;\n           i < xe::countof(last_update_accumulated_render_targets_); ++i) {\n        const RenderTarget* render_target =\n            last_update_accumulated_render_targets_[i];\n        if (!render_target) {\n          continue;\n        }\n        RenderTargetKey rt_key = render_target->key();\n        if (rt_key.pitch_tiles_at_32bpp != pitch_tiles_at_32bpp ||\n            rt_key.msaa_samples != msaa_samples) {\n          are_accumulated_render_targets_valid_ = false;\n          break;\n        }\n      }\n    }\n    if (!are_accumulated_render_targets_valid_) {\n      std::memset(last_update_accumulated_render_targets_, 0,\n                  sizeof(last_update_accumulated_render_targets_));\n    }\n    return true;\n  }\n\n  // Estimate height used by render targets (for color for writes, for depth /\n  // stencil for both reads and writes) from various sources.\n  uint32_t height_used = std::min(\n      GetRenderTargetHeight(pitch_tiles_at_32bpp, msaa_samples),\n      draw_extent_estimator_.EstimateMaxY(\n          interlock_barrier_only\n              ? cvars::execute_unclipped_draw_vs_on_cpu_for_psi_render_backend\n              : true,\n          vertex_shader));\n\n  // Sorted by EDRAM base and then by index in the pipeline - for simplicity,\n  // treat render targets placed closer to the end of the EDRAM as truncating\n  // the previous one (and in case multiple render targets are placed at the\n  // same EDRAM base, though normally this shouldn't happen, treat the color\n  // ones as more important than the depth one, which may be not needed and just\n  // a leftover if the draw, for instance, has depth / stencil happening to be\n  // always passing and never writing with the current state, and also because\n  // depth testing has to happen before the color is written). Overall it's\n  // normal for estimated EDRAM ranges of render targets to intersect if drawing\n  // without a viewport (as there's nothing to clamp the estimated height) and\n  // multiple render targets are bound.\n  std::pair<uint32_t, uint32_t>\n      edram_bases_sorted[1 + xenos::kMaxColorRenderTargets];\n  uint32_t edram_bases_sorted_count = 0;\n  rts_remaining = depth_and_color_rts_used_bits;\n  while (xe::bit_scan_forward(rts_remaining, &rt_index)) {\n    rts_remaining &= ~(uint32_t(1) << rt_index);\n    edram_bases_sorted[edram_bases_sorted_count++] =\n        std::make_pair(edram_bases[rt_index], rt_index);\n  }\n  std::sort(edram_bases_sorted, edram_bases_sorted + edram_bases_sorted_count);\n  // \"As if it was 64bpp\" (contribution of 32bpp render targets multiplied by 2,\n  // and clamping for 32bpp render targets divides this by 2) because 32bpp\n  // render targets can be combined with twice as long 64bpp render targets. An\n  // example is the 4541099D menu background (1-sample 1152x720, or 1200x720\n  // after rounding to tiles, with a 32bpp depth buffer at 0 requiring 675\n  // tiles, and a 64bpp color buffer at 675 requiring 1350 tiles, but the\n  // smallest distance between two render target bases is 675 tiles).\n  uint32_t rt_max_distance_tiles_at_64bpp = xenos::kEdramTileCount * 2;\n  if (cvars::mrt_edram_used_range_clamp_to_min &&\n      edram_bases_sorted_count >= 2) {\n    for (uint32_t i = 1; i < edram_bases_sorted_count; ++i) {\n      const std::pair<uint32_t, uint32_t>& rt_base_prev =\n          edram_bases_sorted[i - 1];\n      rt_max_distance_tiles_at_64bpp =\n          std::min(rt_max_distance_tiles_at_64bpp,\n                   (edram_bases_sorted[i].first - rt_base_prev.first)\n                       << (((rts_are_64bpp >> rt_base_prev.second) & 1) ^ 1));\n    }\n    // Clamp to the distance from the last render target to the first with\n    // EDRAM addressing wrapping.\n    const std::pair<uint32_t, uint32_t>& rt_base_last =\n        edram_bases_sorted[edram_bases_sorted_count - 1];\n    rt_max_distance_tiles_at_64bpp =\n        std::min(rt_max_distance_tiles_at_64bpp,\n                 (xenos::kEdramTileCount + edram_bases_sorted[0].first -\n                  rt_base_last.first)\n                     << (((rts_are_64bpp >> rt_base_last.second) & 1) ^ 1));\n  }\n\n  // Make sure all the needed render targets are created, and gather lengths of\n  // ranges used by each render target.\n  RenderTargetKey rt_keys[1 + xenos::kMaxColorRenderTargets];\n  RenderTarget* rts[1 + xenos::kMaxColorRenderTargets];\n  uint32_t rt_lengths_tiles[1 + xenos::kMaxColorRenderTargets];\n  uint32_t length_used_tiles_at_32bpp =\n      ((height_used << uint32_t(msaa_samples >= xenos::MsaaSamples::k2X)) +\n       (xenos::kEdramTileHeightSamples - 1)) /\n      xenos::kEdramTileHeightSamples * pitch_tiles_at_32bpp;\n  for (uint32_t i = 0; i < edram_bases_sorted_count; ++i) {\n    const std::pair<uint32_t, uint32_t>& rt_base_index = edram_bases_sorted[i];\n    uint32_t rt_base = rt_base_index.first;\n    uint32_t rt_bit_index = rt_base_index.second;\n    RenderTargetKey& rt_key = rt_keys[rt_bit_index];\n    rt_key.base_tiles = rt_base;\n    rt_key.pitch_tiles_at_32bpp = pitch_tiles_at_32bpp;\n    rt_key.msaa_samples = msaa_samples;\n    rt_key.is_depth = rt_bit_index == 0;\n    rt_key.resource_format = resource_formats[rt_bit_index];\n    if (!interlock_barrier_only) {\n      RenderTarget* render_target = GetOrCreateRenderTarget(rt_key);\n      if (!render_target) {\n        return false;\n      }\n      rts[rt_bit_index] = render_target;\n    }\n    uint32_t rt_is_64bpp = (rts_are_64bpp >> rt_bit_index) & 1;\n    // The last render target can occupy the EDRAM until the base of the first\n    // render target (itself in case of 1 render target) with EDRAM addressing\n    // wrapping.\n    rt_lengths_tiles[i] = std::min(\n        std::min(length_used_tiles_at_32bpp << rt_is_64bpp,\n                 rt_max_distance_tiles_at_64bpp >> (rt_is_64bpp ^ 1)),\n        ((i + 1 < edram_bases_sorted_count)\n             ? edram_bases_sorted[i + 1].first\n             : (xenos::kEdramTileCount + edram_bases_sorted[0].first)) -\n            rt_base);\n  }\n\n  if (interlock_barrier_only) {\n    // Because a full pixel shader interlock barrier may clear the ownership map\n    // (since it flushes all previous writes, and there's no need for another\n    // barrier if an overlap is encountered later between pre-barrier and\n    // post-barrier usages), check if any overlap requiring a barrier happens,\n    // and then insert the barrier if needed.\n    bool interlock_barrier_needed = false;\n    for (uint32_t i = 0; i < edram_bases_sorted_count; ++i) {\n      const std::pair<uint32_t, uint32_t>& rt_base_index =\n          edram_bases_sorted[i];\n      if (WouldOwnershipChangeRequireTransfers(rt_keys[rt_base_index.second], 0,\n                                               rt_lengths_tiles[i])) {\n        interlock_barrier_needed = true;\n        break;\n      }\n    }\n    if (interlock_barrier_needed) {\n      RequestPixelShaderInterlockBarrier();\n    }\n  }\n\n  // From now on ownership transfers should succeed for simplicity and\n  // consistency, even if they fail in the implementation (just ignore that and\n  // draw with whatever contents currently are in the render target in this\n  // case).\n\n  for (uint32_t i = 0; i < edram_bases_sorted_count; ++i) {\n    const std::pair<uint32_t, uint32_t>& rt_base_index = edram_bases_sorted[i];\n    uint32_t rt_bit_index = rt_base_index.second;\n    ChangeOwnership(rt_keys[rt_bit_index], 0, rt_lengths_tiles[i],\n                    interlock_barrier_only\n                        ? nullptr\n                        : &last_update_transfers_[rt_bit_index]);\n  }\n\n  if (interlock_barrier_only) {\n    // No copying transfers or render target bindings - only needed the barrier.\n    return true;\n  }\n\n  // If everything succeeded, update the used render targets.\n  for (uint32_t i = 0; i < 1 + xenos::kMaxColorRenderTargets; ++i) {\n    last_update_used_render_targets_[i] =\n        (depth_and_color_rts_used_bits & (uint32_t(1) << i)) ? rts[i] : nullptr;\n  }\n  if (are_accumulated_render_targets_valid_) {\n    // Check if the only re-enabling a previously bound render target.\n    for (uint32_t i = 0; i < 1 + xenos::kMaxColorRenderTargets; ++i) {\n      RenderTarget* current_rt =\n          (depth_and_color_rts_used_bits & (uint32_t(1) << i)) ? rts[i]\n                                                               : nullptr;\n      const RenderTarget* accumulated_rt =\n          last_update_accumulated_render_targets_[i];\n      if (!accumulated_rt) {\n        if (current_rt) {\n          // Binding a totally new render target - won't keep the existing\n          // render pass anyway, no much need to try to re-enable previously\n          // disabled render targets in other slots as well, even though that\n          // would be valid.\n          are_accumulated_render_targets_valid_ = false;\n          break;\n        }\n        // Append the new render target.\n        last_update_accumulated_render_targets_[i] = current_rt;\n        continue;\n      }\n      if (current_rt) {\n        if (current_rt != accumulated_rt) {\n          // Changing a render target in a slot.\n          are_accumulated_render_targets_valid_ = false;\n          break;\n        }\n      } else {\n        RenderTargetKey accumulated_rt_key = accumulated_rt->key();\n        if (accumulated_rt_key.pitch_tiles_at_32bpp != pitch_tiles_at_32bpp ||\n            accumulated_rt_key.msaa_samples != msaa_samples) {\n          // The previously bound render target is incompatible with the\n          // current surface info.\n          are_accumulated_render_targets_valid_ = false;\n          break;\n        }\n      }\n    }\n    // Make sure the same render target isn't bound into two different slots\n    // over time.\n    for (uint32_t i = 1; are_accumulated_render_targets_valid_ &&\n                         i < 1 + xenos::kMaxColorRenderTargets;\n         ++i) {\n      const RenderTarget* render_target =\n          last_update_accumulated_render_targets_[i];\n      if (!render_target) {\n        continue;\n      }\n      for (uint32_t j = 0; j < i; ++j) {\n        if (last_update_accumulated_render_targets_[j] == render_target) {\n          are_accumulated_render_targets_valid_ = false;\n          break;\n        }\n      }\n    }\n  }\n  if (!are_accumulated_render_targets_valid_) {\n    std::memcpy(last_update_accumulated_render_targets_,\n                last_update_used_render_targets_,\n                sizeof(last_update_accumulated_render_targets_));\n    are_accumulated_render_targets_valid_ = true;\n  }\n\n  return true;\n}\n\nuint32_t RenderTargetCache::GetLastUpdateBoundRenderTargets(\n    uint32_t* depth_and_color_formats_out) const {\n  if (GetPath() != Path::kHostRenderTargets) {\n    if (depth_and_color_formats_out) {\n      std::memset(depth_and_color_formats_out, 0,\n                  sizeof(uint32_t) * (1 + xenos::kMaxColorRenderTargets));\n    }\n    return 0;\n  }\n  uint32_t rts_used = 0;\n  for (uint32_t i = 0; i < 1 + xenos::kMaxColorRenderTargets; ++i) {\n    const RenderTarget* render_target =\n        last_update_accumulated_render_targets_[i];\n    if (!render_target) {\n      if (depth_and_color_formats_out) {\n        depth_and_color_formats_out[i] = 0;\n      }\n      continue;\n    }\n    rts_used |= uint32_t(1) << i;\n    if (depth_and_color_formats_out) {\n      depth_and_color_formats_out[i] = render_target->key().resource_format;\n    }\n  }\n  return rts_used;\n}\n\nuint32_t RenderTargetCache::GetRenderTargetHeight(\n    uint32_t pitch_tiles_at_32bpp, xenos::MsaaSamples msaa_samples) const {\n  if (!pitch_tiles_at_32bpp) {\n    return 0;\n  }\n  // Down to the beginning of the render target in the next 11-bit EDRAM\n  // addressing period.\n  uint32_t tile_rows = (xenos::kEdramTileCount + (pitch_tiles_at_32bpp - 1)) /\n                       pitch_tiles_at_32bpp;\n  // Clamp to the guest limit (tile padding should exceed it) and to the host\n  // limit (tile padding mustn't exceed it).\n  static_assert(\n      !(xenos::kTexture2DCubeMaxWidthHeight % xenos::kEdramTileHeightSamples),\n      \"Maximum guest render target height is assumed to always be a multiple \"\n      \"of an EDRAM tile height\");\n  uint32_t max_height_scaled =\n      std::min(xenos::kTexture2DCubeMaxWidthHeight * draw_resolution_scale_y(),\n               GetMaxRenderTargetHeight());\n  uint32_t msaa_samples_y_log2 =\n      uint32_t(msaa_samples >= xenos::MsaaSamples::k2X);\n  uint32_t tile_height_samples_scaled =\n      xenos::kEdramTileHeightSamples * draw_resolution_scale_y();\n  tile_rows = std::min(tile_rows, (max_height_scaled << msaa_samples_y_log2) /\n                                      tile_height_samples_scaled);\n  assert_not_zero(tile_rows);\n  return tile_rows * (xenos::kEdramTileHeightSamples >> msaa_samples_y_log2);\n}\n\nvoid RenderTargetCache::GetHostDepthStoreRectangleInfo(\n    const Transfer::Rectangle& transfer_rectangle,\n    xenos::MsaaSamples msaa_samples,\n    HostDepthStoreRectangleConstant& rectangle_constant_out,\n    uint32_t& group_count_x_out, uint32_t& group_count_y_out) const {\n  // Initialize to all bits zeroed.\n  HostDepthStoreRectangleConstant rectangle_constant;\n  // 8 pixels is the resolve granularity, both clearing and tile size are\n  // aligned to 8.\n  assert_zero(transfer_rectangle.x_pixels & 7);\n  assert_zero(transfer_rectangle.y_pixels & 7);\n  assert_zero(transfer_rectangle.width_pixels & 7);\n  assert_zero(transfer_rectangle.height_pixels & 7);\n  assert_not_zero(transfer_rectangle.width_pixels);\n  rectangle_constant.x_pixels_div_8 = transfer_rectangle.x_pixels >> 3;\n  rectangle_constant.y_pixels_div_8 = transfer_rectangle.y_pixels >> 3;\n  rectangle_constant.width_pixels_div_8_minus_1 =\n      (transfer_rectangle.width_pixels >> 3) - 1;\n  rectangle_constant_out = rectangle_constant;\n  // 1 thread group = 64x8 host samples.\n  uint32_t pixel_size_x = draw_resolution_scale_x()\n                          << uint32_t(msaa_samples >= xenos::MsaaSamples::k4X);\n  uint32_t pixel_size_y = draw_resolution_scale_y()\n                          << uint32_t(msaa_samples >= xenos::MsaaSamples::k2X);\n  group_count_x_out =\n      (transfer_rectangle.width_pixels * pixel_size_x + 63) >> 6;\n  group_count_y_out = (transfer_rectangle.height_pixels * pixel_size_y) >> 3;\n}\n\nvoid RenderTargetCache::GetResolveCopyRectanglesToDump(\n    uint32_t base, uint32_t row_length, uint32_t rows, uint32_t pitch,\n    std::vector<ResolveCopyDumpRectangle>& rectangles_out) const {\n  rectangles_out.clear();\n  assert_true(row_length <= pitch);\n  row_length = std::min(row_length, pitch);\n  if (!row_length || !rows) {\n    return;\n  }\n  auto get_rectangles_in_extent = [&](uint32_t extent_start,\n                                      uint32_t extent_end,\n                                      uint32_t range_local_offset) {\n    // Collect render targets owning ranges within the specified rectangle. The\n    // first render target in the range may be before the lower_bound, only\n    // being in the range with its tail.\n    auto it = ownership_ranges_.lower_bound(extent_start);\n    if (it != ownership_ranges_.cbegin()) {\n      auto it_pre = std::prev(it);\n      if (it_pre->second.end_tiles > extent_start) {\n        it = it_pre;\n      }\n    }\n    for (; it != ownership_ranges_.cend(); ++it) {\n      uint32_t range_global_start = std::max(it->first, extent_start);\n      if (range_global_start >= extent_end) {\n        break;\n      }\n      RenderTargetKey rt_key = it->second.render_target;\n      if (rt_key.IsEmpty()) {\n        continue;\n      }\n      // Merge with other render target ranges with the same current ownership,\n      // but different depth ownership, since it's not relevant to resolving.\n      while (it != ownership_ranges_.cend()) {\n        auto it_next = std::next(it);\n        if (it_next == ownership_ranges_.cend() ||\n            it_next->first >= extent_end ||\n            it_next->second.render_target != rt_key) {\n          break;\n        }\n        it = it_next;\n      }\n\n      uint32_t range_local_start = range_local_offset +\n                                   std::max(range_global_start, extent_start) -\n                                   base;\n      uint32_t range_local_end = range_local_offset +\n                                 std::min(it->second.end_tiles, extent_end) -\n                                 base;\n      assert_true(range_local_start < range_local_end);\n\n      uint32_t rows_start = range_local_start / pitch;\n      uint32_t rows_end = (range_local_end + (pitch - 1)) / pitch;\n      uint32_t row_first_start = range_local_start - rows_start * pitch;\n      if (row_first_start >= row_length) {\n        // The first row starts within the pitch padding.\n        if (rows_start + 1 < rows_end) {\n          // Multiple rows - start at the second.\n          ++rows_start;\n          row_first_start = 0;\n        } else {\n          // Single row - nothing to dump.\n          continue;\n        }\n      }\n\n      auto it_rt = render_targets_.find(rt_key);\n      assert_true(it_rt != render_targets_.cend());\n      assert_not_null(it_rt->second);\n      // Don't include pitch padding in the last row.\n      rectangles_out.emplace_back(\n          it_rt->second, rows_start, rows_end - rows_start, row_first_start,\n          std::min(pitch - (rows_end * pitch - range_local_end), row_length));\n    }\n  };\n  uint32_t resolve_area_end = base + (rows - 1) * pitch + row_length;\n  get_rectangles_in_extent(\n      base, std::min(resolve_area_end, xenos::kEdramTileCount), 0);\n  if (resolve_area_end > xenos::kEdramTileCount) {\n    // The resolve area goes to the next EDRAM addressing period.\n    get_rectangles_in_extent(\n        0, std::min(resolve_area_end & (xenos::kEdramTileCount - 1), base),\n        xenos::kEdramTileCount);\n  }\n}\n\nbool RenderTargetCache::PrepareHostRenderTargetsResolveClear(\n    const draw_util::ResolveInfo& resolve_info,\n    Transfer::Rectangle& clear_rectangle_out,\n    RenderTarget*& depth_render_target_out,\n    std::vector<Transfer>& depth_transfers_out,\n    RenderTarget*& color_render_target_out,\n    std::vector<Transfer>& color_transfers_out) {\n  assert_true(GetPath() == Path::kHostRenderTargets);\n\n  uint32_t pitch_tiles_at_32bpp;\n  uint32_t base_offset_tiles_at_32bpp;\n  xenos::MsaaSamples msaa_samples;\n  if (resolve_info.IsClearingDepth()) {\n    pitch_tiles_at_32bpp = resolve_info.depth_edram_info.pitch_tiles;\n    base_offset_tiles_at_32bpp = resolve_info.depth_edram_info.base_tiles -\n                                 resolve_info.depth_original_base;\n    msaa_samples = resolve_info.depth_edram_info.msaa_samples;\n  } else if (resolve_info.IsClearingColor()) {\n    pitch_tiles_at_32bpp = resolve_info.color_edram_info.pitch_tiles;\n    base_offset_tiles_at_32bpp = resolve_info.color_edram_info.base_tiles -\n                                 resolve_info.color_original_base;\n    if (resolve_info.color_edram_info.format_is_64bpp) {\n      assert_zero(pitch_tiles_at_32bpp & 1);\n      pitch_tiles_at_32bpp >>= 1;\n      assert_zero(base_offset_tiles_at_32bpp & 1);\n      base_offset_tiles_at_32bpp >>= 1;\n    }\n    msaa_samples = resolve_info.color_edram_info.msaa_samples;\n  } else {\n    return false;\n  }\n  assert_true(msaa_samples <= xenos::MsaaSamples::k4X);\n  if (!pitch_tiles_at_32bpp) {\n    return false;\n  }\n  uint32_t msaa_samples_x_log2 =\n      uint32_t(msaa_samples >= xenos::MsaaSamples::k4X);\n  uint32_t msaa_samples_y_log2 =\n      uint32_t(msaa_samples >= xenos::MsaaSamples::k2X);\n  if (pitch_tiles_at_32bpp >\n      ((xenos::kTexture2DCubeMaxWidthHeight << msaa_samples_x_log2) +\n       (xenos::kEdramTileWidthSamples - 1)) /\n          xenos::kEdramTileWidthSamples) {\n    XELOGE(\n        \"Surface pitch in 80-sample groups {} at {}x MSAA larger than the \"\n        \"maximum texture width {} specified by the guest in a resolve\",\n        pitch_tiles_at_32bpp, uint32_t(1) << uint32_t(msaa_samples),\n        xenos::kTexture2DCubeMaxWidthHeight);\n    return false;\n  }\n  uint32_t pitch_pixels =\n      pitch_tiles_at_32bpp *\n      (xenos::kEdramTileWidthSamples >> msaa_samples_x_log2);\n  uint32_t pitch_pixels_scaled = pitch_pixels * draw_resolution_scale_x();\n  uint32_t max_render_target_width = GetMaxRenderTargetWidth();\n  if (pitch_pixels_scaled > max_render_target_width) {\n    // TODO(Triang3l): If really needed for some game on some device, clamp the\n    // pitch the same way as explained in the comment in Update.\n    XELOGE(\n        \"Surface pitch aligned to EDRAM tiles and resolution-scaled {} larger \"\n        \"than the maximum host render target width {} in a resolve\",\n        pitch_pixels_scaled, max_render_target_width);\n    return false;\n  }\n\n  uint32_t render_target_height_pixels =\n      GetRenderTargetHeight(pitch_tiles_at_32bpp, msaa_samples);\n  uint32_t base_offset_rows_at_32bpp =\n      base_offset_tiles_at_32bpp / pitch_tiles_at_32bpp;\n  Transfer::Rectangle clear_rectangle;\n  clear_rectangle.x_pixels = std::min(\n      (base_offset_tiles_at_32bpp -\n       base_offset_rows_at_32bpp * pitch_tiles_at_32bpp) *\n              (xenos::kEdramTileWidthSamples >> msaa_samples_x_log2) +\n          (uint32_t(resolve_info.coordinate_info.edram_offset_x_div_8) << 3),\n      pitch_pixels);\n  clear_rectangle.y_pixels = std::min(\n      base_offset_rows_at_32bpp *\n              (xenos::kEdramTileHeightSamples >> msaa_samples_y_log2) +\n          (uint32_t(resolve_info.coordinate_info.edram_offset_y_div_8) << 3),\n      render_target_height_pixels);\n  clear_rectangle.width_pixels =\n      std::min(uint32_t(resolve_info.coordinate_info.width_div_8) << 3,\n               pitch_pixels - clear_rectangle.x_pixels);\n  clear_rectangle.height_pixels =\n      std::min(uint32_t(resolve_info.height_div_8) << 3,\n               render_target_height_pixels - clear_rectangle.y_pixels);\n  if (!clear_rectangle.width_pixels || !clear_rectangle.height_pixels) {\n    // Outside the pitch / height (or initially specified as 0).\n    return false;\n  }\n\n  // Change ownership of the tiles containing the area to be cleared, so the\n  // up-to-date host render target for the cleared range will be the cleared\n  // one.\n  uint32_t clear_start_tiles_at_32bpp =\n      ((clear_rectangle.y_pixels << msaa_samples_y_log2) /\n       xenos::kEdramTileHeightSamples) *\n          pitch_tiles_at_32bpp +\n      (clear_rectangle.x_pixels << msaa_samples_x_log2) /\n          xenos::kEdramTileWidthSamples;\n  uint32_t clear_length_tiles_at_32bpp =\n      (((clear_rectangle.y_pixels + clear_rectangle.height_pixels - 1)\n        << msaa_samples_y_log2) /\n       xenos::kEdramTileHeightSamples) *\n          pitch_tiles_at_32bpp +\n      ((clear_rectangle.x_pixels + clear_rectangle.width_pixels - 1)\n       << msaa_samples_x_log2) /\n          xenos::kEdramTileWidthSamples +\n      1 - clear_start_tiles_at_32bpp;\n  // Up to the range from the base in the current 11 tile index bits to the base\n  // in the next 11 tile index bits after wrapping can be cleared.\n  uint32_t depth_clear_start_tiles_base_relative = 0;\n  uint32_t depth_clear_length_tiles = 0;\n  if (resolve_info.IsClearingDepth()) {\n    depth_clear_start_tiles_base_relative =\n        std::min(clear_start_tiles_at_32bpp, xenos::kEdramTileCount);\n    depth_clear_length_tiles =\n        std::min(clear_start_tiles_at_32bpp + clear_length_tiles_at_32bpp,\n                 xenos::kEdramTileCount) -\n        depth_clear_start_tiles_base_relative;\n  }\n  uint32_t color_clear_start_tiles_base_relative = 0;\n  uint32_t color_clear_length_tiles = 0;\n  if (resolve_info.IsClearingColor()) {\n    color_clear_start_tiles_base_relative =\n        std::min(clear_start_tiles_at_32bpp\n                     << resolve_info.color_edram_info.format_is_64bpp,\n                 xenos::kEdramTileCount);\n    color_clear_length_tiles =\n        std::min((clear_start_tiles_at_32bpp + clear_length_tiles_at_32bpp)\n                     << resolve_info.color_edram_info.format_is_64bpp,\n                 xenos::kEdramTileCount) -\n        color_clear_start_tiles_base_relative;\n  }\n  if (depth_clear_length_tiles && color_clear_length_tiles) {\n    // Prevent overlap - clear the depth only until the color, the color only\n    // until the depth, in the current or the next 11 bits of the tile index.\n    uint32_t depth_clear_start_tiles_wrapped =\n        (resolve_info.depth_original_base +\n         depth_clear_start_tiles_base_relative) &\n        (xenos::kEdramTileCount - 1);\n    uint32_t color_clear_start_tiles_wrapped =\n        (resolve_info.color_original_base +\n         color_clear_start_tiles_base_relative) &\n        (xenos::kEdramTileCount - 1);\n    depth_clear_length_tiles = std::min(\n        depth_clear_length_tiles,\n        ((color_clear_start_tiles_wrapped < depth_clear_start_tiles_wrapped)\n             ? xenos::kEdramTileCount\n             : 0) +\n            color_clear_start_tiles_wrapped - depth_clear_start_tiles_wrapped);\n    color_clear_length_tiles = std::min(\n        color_clear_length_tiles,\n        ((depth_clear_start_tiles_wrapped < color_clear_start_tiles_wrapped)\n             ? xenos::kEdramTileCount\n             : 0) +\n            depth_clear_start_tiles_wrapped - color_clear_start_tiles_wrapped);\n  }\n\n  RenderTargetKey depth_render_target_key;\n  RenderTarget* depth_render_target = nullptr;\n  if (depth_clear_length_tiles) {\n    depth_render_target_key.base_tiles = resolve_info.depth_original_base;\n    depth_render_target_key.pitch_tiles_at_32bpp = pitch_tiles_at_32bpp;\n    depth_render_target_key.msaa_samples = msaa_samples;\n    depth_render_target_key.is_depth = 1;\n    depth_render_target_key.resource_format =\n        resolve_info.depth_edram_info.format;\n    depth_render_target = GetOrCreateRenderTarget(depth_render_target_key);\n    if (!depth_render_target) {\n      // Failed to create the depth render target, don't clear it.\n      depth_render_target_key = RenderTargetKey();\n      depth_clear_length_tiles = 0;\n    }\n  }\n  RenderTargetKey color_render_target_key;\n  RenderTarget* color_render_target = nullptr;\n  if (color_clear_length_tiles) {\n    color_render_target_key.base_tiles = resolve_info.color_original_base;\n    color_render_target_key.pitch_tiles_at_32bpp = pitch_tiles_at_32bpp;\n    color_render_target_key.msaa_samples = msaa_samples;\n    color_render_target_key.is_depth = 0;\n    color_render_target_key.resource_format = uint32_t(GetColorResourceFormat(\n        xenos::ColorRenderTargetFormat(resolve_info.color_edram_info.format)));\n    color_render_target = GetOrCreateRenderTarget(color_render_target_key);\n    if (!color_render_target) {\n      // Failed to create the color render target, don't clear it.\n      color_render_target_key = RenderTargetKey();\n      color_clear_length_tiles = 0;\n    }\n  }\n  if (!depth_clear_length_tiles && !color_clear_length_tiles) {\n    // Complete overlap, or failed to create all the render targets.\n    return false;\n  }\n\n  clear_rectangle_out = clear_rectangle;\n  depth_render_target_out = depth_render_target;\n  depth_transfers_out.clear();\n  if (depth_render_target) {\n    ChangeOwnership(\n        depth_render_target_key, depth_clear_start_tiles_base_relative,\n        depth_clear_length_tiles, &depth_transfers_out, &clear_rectangle);\n  }\n  color_render_target_out = color_render_target;\n  color_transfers_out.clear();\n  if (color_render_target) {\n    ChangeOwnership(\n        color_render_target_key, color_clear_start_tiles_base_relative,\n        color_clear_length_tiles, &color_transfers_out, &clear_rectangle);\n  }\n  return true;\n}\n\nRenderTargetCache::RenderTarget*\nRenderTargetCache::PrepareFullEdram1280xRenderTargetForSnapshotRestoration(\n    xenos::ColorRenderTargetFormat color_format) {\n  assert_true(GetPath() == Path::kHostRenderTargets);\n  constexpr uint32_t kPitchTilesAt32bpp = 16;\n  constexpr uint32_t kWidth =\n      kPitchTilesAt32bpp * xenos::kEdramTileWidthSamples;\n  if (kWidth * draw_resolution_scale_x() > GetMaxRenderTargetWidth()) {\n    return nullptr;\n  }\n  // Same render target height is used for 32bpp and 64bpp to allow mixing them.\n  constexpr uint32_t kHeightTileRows =\n      xenos::kEdramTileCount / kPitchTilesAt32bpp;\n  static_assert(\n      kPitchTilesAt32bpp * kHeightTileRows == xenos::kEdramTileCount,\n      \"Using width of the render target for EDRAM snapshot restoration that is \"\n      \"expected to result in the last row being fully utilized.\");\n  constexpr uint32_t kHeight = kHeightTileRows * xenos::kEdramTileHeightSamples;\n  static_assert(\n      kHeight <= xenos::kTexture2DCubeMaxWidthHeight,\n      \"Using width of the render target for EDRAM snapshot restoration that is \"\n      \"expect to fully cover the EDRAM without exceeding the maximum guest \"\n      \"render target height.\");\n  if (kHeight * draw_resolution_scale_y() > GetMaxRenderTargetHeight()) {\n    return nullptr;\n  }\n  RenderTargetKey render_target_key;\n  render_target_key.pitch_tiles_at_32bpp = kPitchTilesAt32bpp;\n  render_target_key.resource_format =\n      uint32_t(GetColorResourceFormat(color_format));\n  RenderTarget* render_target = GetOrCreateRenderTarget(render_target_key);\n  if (!render_target) {\n    return nullptr;\n  }\n  // Change ownership, but don't transfer the contents - they will be replaced\n  // anyway.\n  ownership_ranges_.clear();\n  ownership_ranges_.emplace(\n      std::piecewise_construct, std::forward_as_tuple(uint32_t(0)),\n      std::forward_as_tuple(xenos::kEdramTileCount, render_target_key,\n                            RenderTargetKey(), RenderTargetKey()));\n  return render_target;\n}\n\nvoid RenderTargetCache::PixelShaderInterlockFullEdramBarrierPlaced() {\n  assert_true(GetPath() == Path::kPixelShaderInterlock);\n  // Clear ownership - any overlap of data written before the barrier is safe.\n  OwnershipRange empty_range(xenos::kEdramTileCount, RenderTargetKey(),\n                             RenderTargetKey(), RenderTargetKey());\n  if (ownership_ranges_.size() == 1) {\n    // Do not reallocate map elements if not needed (either nothing drawn since\n    // the last barrier, or all of the EDRAM is owned by one render target).\n    // The ownership map contains no gaps - the first element should always be\n    // at 0.\n    assert_true(!ownership_ranges_.begin()->first);\n    OwnershipRange& all_edram_range = ownership_ranges_.begin()->second;\n    assert_true(all_edram_range.end_tiles == xenos::kEdramTileCount);\n    all_edram_range = empty_range;\n    return;\n  }\n  ownership_ranges_.clear();\n  ownership_ranges_.emplace(0, empty_range);\n}\n\nRenderTargetCache::RenderTarget* RenderTargetCache::GetOrCreateRenderTarget(\n    RenderTargetKey key) {\n  assert_true(GetPath() == Path::kHostRenderTargets);\n  auto it_rt = render_targets_.find(key);\n  RenderTarget* render_target;\n  if (it_rt != render_targets_.end()) {\n    render_target = it_rt->second;\n  } else {\n    render_target = CreateRenderTarget(key);\n    uint32_t width = key.GetWidth();\n    uint32_t height =\n        GetRenderTargetHeight(key.pitch_tiles_at_32bpp, key.msaa_samples);\n    if (render_target) {\n      XELOGGPU(\n          \"Created a {}x{} {}xMSAA {} render target with guest format {} at \"\n          \"EDRAM base {}\",\n          width, height, uint32_t(1) << uint32_t(key.msaa_samples),\n          key.is_depth ? \"depth\" : \"color\", key.resource_format,\n          key.base_tiles);\n    } else {\n      XELOGE(\n          \"Failed to create a {}x{} {}xMSAA {} render target with guest format \"\n          \"{} at EDRAM base {}\",\n          width, height, uint32_t(1) << uint32_t(key.msaa_samples),\n          key.is_depth ? \"depth\" : \"color\", key.resource_format,\n          key.base_tiles);\n    }\n    // Insert even if failed to create, not to try to create again.\n    render_targets_.emplace(key, render_target);\n  }\n  return render_target;\n}\n\nbool RenderTargetCache::WouldOwnershipChangeRequireTransfers(\n    RenderTargetKey dest, uint32_t start_tiles_base_relative,\n    uint32_t length_tiles) const {\n  // xenos::kEdramTileCount with length 0 is fine if both the start and the end\n  // are clamped to xenos::kEdramTileCount.\n  assert_true(start_tiles_base_relative <=\n              (xenos::kEdramTileCount - uint32_t(length_tiles != 0)));\n  assert_true(length_tiles <= xenos::kEdramTileCount);\n  if (length_tiles == 0) {\n    return false;\n  }\n  bool host_depth_encoding_different =\n      dest.is_depth && GetPath() == Path::kHostRenderTargets &&\n      IsHostDepthEncodingDifferent(dest.GetDepthFormat());\n  auto would_require_transfers_in_extent = [&](uint32_t extent_start,\n                                               uint32_t extent_end) -> bool {\n    // The map contains consecutive ranges, merged if the adjacent ones are the\n    // same. Find the range starting at >= the start. A portion of the range\n    // preceding it may be intersecting the render target's range (or even fully\n    // contain it).\n    auto it = ownership_ranges_.lower_bound(extent_start);\n    if (it != ownership_ranges_.begin()) {\n      auto it_pre = std::prev(it);\n      if (it_pre->second.end_tiles > extent_start) {\n        it = it_pre;\n      }\n    }\n    for (; it != ownership_ranges_.end(); ++it) {\n      if (it->first >= extent_end) {\n        // Outside the touched extent already.\n        break;\n      }\n      if (it->second.IsOwnedBy(dest, host_depth_encoding_different)) {\n        // Already owned by the needed render target - no need to transfer\n        // anything.\n        continue;\n      }\n      RenderTargetKey transfer_source = it->second.render_target;\n      // Only perform the transfer when actually changing the latest owner, not\n      // just the latest host depth owner - the transfer source is expected to\n      // be different than the destination.\n      if (!transfer_source.IsEmpty() && transfer_source != dest) {\n        return true;\n      }\n    }\n    return false;\n  };\n  // start_tiles_base_relative may already be in the next 11 bits - wrap the\n  // start tile index to use the same code as if that was not the case.\n  uint32_t start_tiles = (dest.base_tiles + start_tiles_base_relative) &\n                         (xenos::kEdramTileCount - 1);\n  uint32_t end_tiles = start_tiles + length_tiles;\n  if (would_require_transfers_in_extent(\n          start_tiles, std::min(end_tiles, xenos::kEdramTileCount))) {\n    return true;\n  }\n  if (end_tiles > xenos::kEdramTileCount) {\n    // The check extent goes to the next EDRAM addressing period.\n    if (would_require_transfers_in_extent(\n            0,\n            std::min(end_tiles & (xenos::kEdramTileCount - 1), start_tiles))) {\n      return true;\n    }\n  }\n  return false;\n}\n\nvoid RenderTargetCache::ChangeOwnership(\n    RenderTargetKey dest, uint32_t start_tiles_base_relative,\n    uint32_t length_tiles, std::vector<Transfer>* transfers_append_out,\n    const Transfer::Rectangle* resolve_clear_cutout) {\n  // xenos::kEdramTileCount with length 0 is fine if both the start and the end\n  // are clamped to xenos::kEdramTileCount.\n  assert_true(start_tiles_base_relative <=\n              (xenos::kEdramTileCount - uint32_t(length_tiles != 0)));\n  assert_true(length_tiles <= xenos::kEdramTileCount);\n  if (length_tiles == 0) {\n    return;\n  }\n  uint32_t dest_pitch_tiles = dest.GetPitchTiles();\n  bool dest_is_64bpp = dest.Is64bpp();\n  bool host_depth_encoding_different =\n      dest.is_depth && GetPath() == Path::kHostRenderTargets &&\n      IsHostDepthEncodingDifferent(dest.GetDepthFormat());\n  auto change_ownership_in_extent = [&](uint32_t extent_start,\n                                        uint32_t extent_end) {\n    // The map contains consecutive ranges, merged if the adjacent ones are the\n    // same. Find the range starting at >= the start. A portion of the range\n    // preceding it may be intersecting the render target's range (or even fully\n    // contain it) - split it into the untouched head and the claimed tail if\n    // needed.\n    auto it = ownership_ranges_.lower_bound(extent_start);\n    if (it != ownership_ranges_.begin()) {\n      auto it_pre = std::prev(it);\n      if (it_pre->second.end_tiles > extent_start &&\n          !it_pre->second.IsOwnedBy(dest, host_depth_encoding_different)) {\n        // Different render target overlapping the range - split the head.\n        ownership_ranges_.emplace(extent_start, it_pre->second);\n        it_pre->second.end_tiles = extent_start;\n        // Let the next loop do the transfer and needed merging and splitting\n        // starting from the added tail.\n        it = std::next(it_pre);\n      }\n    }\n    while (it != ownership_ranges_.end()) {\n      if (it->first >= extent_end) {\n        // Outside the touched extent already.\n        break;\n      }\n      if (it->second.IsOwnedBy(dest, host_depth_encoding_different)) {\n        // Already owned by the needed render target - no need to transfer\n        // anything.\n        ++it;\n        continue;\n      }\n      // Take over the current range. Handle the tail - may be outside the range\n      // (split in this case) or within it.\n      if (it->second.end_tiles > extent_end) {\n        // Split the tail.\n        ownership_ranges_.emplace(extent_end, it->second);\n        it->second.end_tiles = extent_end;\n      }\n      if (transfers_append_out) {\n        RenderTargetKey transfer_source = it->second.render_target;\n        // Only perform the copying when actually changing the latest owner, not\n        // just the latest host depth owner - the transfer source is expected to\n        // be different than the destination.\n        if (!transfer_source.IsEmpty() && transfer_source != dest) {\n          uint32_t transfer_end_tiles =\n              std::min(it->second.end_tiles, extent_end);\n          if (!resolve_clear_cutout ||\n              Transfer::GetRangeRectangles(it->first, transfer_end_tiles,\n                                           dest.base_tiles, dest_pitch_tiles,\n                                           dest.msaa_samples, dest_is_64bpp,\n                                           nullptr, resolve_clear_cutout)) {\n            RenderTargetKey transfer_host_depth_source =\n                host_depth_encoding_different\n                    ? it->second.GetHostDepthRenderTarget(dest.GetDepthFormat())\n                    : RenderTargetKey();\n            if (transfer_host_depth_source == transfer_source) {\n              // Same render target, don't provide a separate host depth source.\n              transfer_host_depth_source = RenderTargetKey();\n            }\n            if (!transfers_append_out->empty() &&\n                transfers_append_out->back().end_tiles == it->first &&\n                transfers_append_out->back().source->key() == transfer_source &&\n                ((transfers_append_out->back().host_depth_source == nullptr) ==\n                 transfer_host_depth_source.IsEmpty()) &&\n                (transfer_host_depth_source.IsEmpty() ||\n                 transfers_append_out->back().host_depth_source->key() ==\n                     transfer_host_depth_source)) {\n              // Extend the last transfer if, for example, transferring color,\n              // but host depth is different.\n              transfers_append_out->back().end_tiles = transfer_end_tiles;\n            } else {\n              auto transfer_source_rt_it =\n                  render_targets_.find(transfer_source);\n              if (transfer_source_rt_it != render_targets_.end()) {\n                assert_not_null(transfer_source_rt_it->second);\n                auto transfer_host_depth_source_rt_it =\n                    !transfer_host_depth_source.IsEmpty()\n                        ? render_targets_.find(transfer_host_depth_source)\n                        : render_targets_.end();\n                if (transfer_host_depth_source.IsEmpty() ||\n                    transfer_host_depth_source_rt_it != render_targets_.end()) {\n                  assert_false(transfer_host_depth_source_rt_it !=\n                                   render_targets_.end() &&\n                               !transfer_host_depth_source_rt_it->second);\n                  transfers_append_out->emplace_back(\n                      it->first, transfer_end_tiles,\n                      transfer_source_rt_it->second,\n                      transfer_host_depth_source_rt_it != render_targets_.end()\n                          ? transfer_host_depth_source_rt_it->second\n                          : nullptr);\n                }\n              }\n            }\n          }\n        }\n      }\n      // Claim the current range.\n      it->second.render_target = dest;\n      if (host_depth_encoding_different) {\n        it->second.GetHostDepthRenderTarget(dest.GetDepthFormat()) = dest;\n      }\n      // Check if can merge with the next range after claiming.\n      std::map<uint32_t, OwnershipRange>::iterator it_next;\n      if (it != ownership_ranges_.end()) {\n        it_next = std::next(it);\n        if (it_next != ownership_ranges_.end() &&\n            it_next->second.AreOwnersSame(it->second)) {\n          // Merge with the next range.\n          it->second.end_tiles = it_next->second.end_tiles;\n          auto it_after = std::next(it_next);\n          ownership_ranges_.erase(it_next);\n          it_next = it_after;\n        }\n      } else {\n        it_next = ownership_ranges_.end();\n      }\n      // Check if can merge with the previous range after claiming and merging\n      // with the next (thus obtaining the correct end pointer).\n      if (it != ownership_ranges_.begin()) {\n        auto it_prev = std::prev(it);\n        if (it_prev->second.AreOwnersSame(it->second)) {\n          it_prev->second.end_tiles = it->second.end_tiles;\n          ownership_ranges_.erase(it);\n        }\n      }\n      it = it_next;\n    }\n  };\n  // start_tiles_base_relative may already be in the next 11 bits - wrap the\n  // start tile index to use the same code as if that was not the case.\n  uint32_t start_tiles = (dest.base_tiles + start_tiles_base_relative) &\n                         (xenos::kEdramTileCount - 1);\n  uint32_t end_tiles = start_tiles + length_tiles;\n  change_ownership_in_extent(start_tiles,\n                             std::min(end_tiles, xenos::kEdramTileCount));\n  if (end_tiles > xenos::kEdramTileCount) {\n    // The ownership change extent goes to the next EDRAM addressing period.\n    change_ownership_in_extent(\n        0, std::min(end_tiles & (xenos::kEdramTileCount - 1), start_tiles));\n  }\n}\n\n}  // namespace gpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/render_target_cache.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_RENDER_TARGET_CACHE_H_\n#define XENIA_GPU_RENDER_TARGET_CACHE_H_\n\n#include <cmath>\n#include <cstdint>\n#include <functional>\n#include <map>\n#include <unordered_map>\n#include <utility>\n#include <vector>\n\n#include \"third_party/fmt/include/fmt/format.h\"\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/cvar.h\"\n#include \"xenia/gpu/draw_extent_estimator.h\"\n#include \"xenia/gpu/draw_util.h\"\n#include \"xenia/gpu/register_file.h\"\n#include \"xenia/gpu/registers.h\"\n#include \"xenia/gpu/shader.h\"\n#include \"xenia/gpu/xenos.h\"\n\nDECLARE_bool(depth_transfer_not_equal_test);\nDECLARE_bool(depth_float24_round);\nDECLARE_bool(depth_float24_convert_in_pixel_shader);\nDECLARE_bool(draw_resolution_scaled_texture_offsets);\nDECLARE_bool(gamma_render_target_as_unorm16);\nDECLARE_bool(native_2x_msaa);\nDECLARE_bool(native_stencil_value_output);\nDECLARE_bool(snorm16_render_target_full_range);\n\nnamespace xe {\nnamespace gpu {\n\nclass RenderTargetCache {\n public:\n  // High-level emulation logic implementation path.\n  enum class Path {\n    // Approximate method using conventional host render targets and copying\n    // (\"transferring ownership\" of tiles) between render targets to support\n    // aliasing.\n    //\n    // May be irreparably inaccurate, completely at the mercy of the host API's\n    // fixed-function output-merger, primarily because it has to perform\n    // blending - and when using a different pixel format, it will behave\n    // differently (the most important factor here is the range - it's clamped\n    // for normalized formats, but not for floating-point ones).\n    //\n    // On a Direct3D 11-level device, formats which can be mapped directly\n    // (disregarding things like blending internal precision details):\n    // - 8_8_8_8\n    // - 2_10_10_10\n    // - 32_FLOAT\n    // - 32_32_FLOAT\n    // - D24S8\n    // Can be mapped directly, but require handling in shaders:\n    // - D24FS8 with truncated SV_DepthLessEqual output (or SV_Depth, which is\n    //   suboptimal, as it prevents early depth / stencil from working). To\n    //   support bit-exact reinterpretation to and from D24F for unmodified\n    //   areas using pixel shader depth output without unrestricted depth range,\n    //   0...1 of the guest depth should be mapped to 0...0.5 on the host in the\n    //   viewport and conversion.\n    // Can be mapped directly, but not supporting rare edge cases:\n    // - 16_16_FLOAT, k_16_16_16_16_FLOAT - the Xenos float16 doesn't have\n    //   special values.\n    // Significant differences:\n    // - 8_8_8_8_GAMMA - the piecewise linear gamma precision distribution\n    //   encoding is very different from sRGB. Linear space blending can be\n    //   obtained by promoting to R16G16B16A16_UNORM, but for compact storage,\n    //   conversion in pixel shader output may be done, though it results in\n    //   incorrect blending, especially visible on decals in 4D5307E6. Emulating\n    //   by replacing the encoding with sRGB for render target writes and\n    //   resolved texture reads could work for some games, but certain games,\n    //   such as 4541080F, perform piecewise gamma encoding calculations in\n    //   their code, and that produces noticeably incorrect results if the\n    //   encoding is changed in guest texture memory.\n    // - 2_10_10_10_FLOAT - ranges significantly different than in float16, much\n    //   smaller RGB range, and alpha is fixed-point and has only 2 bits.\n    // - 16_16, 16_16_16_16 - has -32 to 32 range, not -1 to 1 - need either to\n    //   truncate the range for blending to work correctly, or divide by 32 in\n    //   shaders breaking multiplication in blending.\n    kHostRenderTargets,\n\n    // Custom output-merger implementation, with full per-pixel and per-sample\n    // control, however, only available on hosts with raster-ordered writes from\n    // pixel shaders.\n    kPixelShaderInterlock,\n  };\n\n  // Pixel shader interlock implementation helpers.\n\n  // Appended to the format in the format constant via bitwise OR.\n  enum : uint32_t {\n    kPSIColorFormatFlag_64bpp_Shift = xenos::kColorRenderTargetFormatBits,\n    // Requires clamping of blending sources and factors.\n    kPSIColorFormatFlag_FixedPointColor_Shift,\n    kPSIColorFormatFlag_FixedPointAlpha_Shift,\n\n    kPSIColorFormatFlag_64bpp = uint32_t(1) << kPSIColorFormatFlag_64bpp_Shift,\n    kPSIColorFormatFlag_FixedPointColor =\n        uint32_t(1) << kPSIColorFormatFlag_FixedPointColor_Shift,\n    kPSIColorFormatFlag_FixedPointAlpha =\n        uint32_t(1) << kPSIColorFormatFlag_FixedPointAlpha_Shift,\n  };\n\n  static constexpr uint32_t AddPSIColorFormatFlags(\n      xenos::ColorRenderTargetFormat format) {\n    uint32_t format_flags = uint32_t(format);\n    if (format == xenos::ColorRenderTargetFormat::k_16_16_16_16 ||\n        format == xenos::ColorRenderTargetFormat::k_16_16_16_16_FLOAT ||\n        format == xenos::ColorRenderTargetFormat::k_32_32_FLOAT) {\n      format_flags |= kPSIColorFormatFlag_64bpp;\n    }\n    if (format == xenos::ColorRenderTargetFormat::k_8_8_8_8 ||\n        format == xenos::ColorRenderTargetFormat::k_8_8_8_8_GAMMA ||\n        format == xenos::ColorRenderTargetFormat::k_2_10_10_10 ||\n        format == xenos::ColorRenderTargetFormat::k_16_16 ||\n        format == xenos::ColorRenderTargetFormat::k_16_16_16_16 ||\n        format == xenos::ColorRenderTargetFormat::k_2_10_10_10_AS_10_10_10_10) {\n      format_flags |= kPSIColorFormatFlag_FixedPointColor |\n                      kPSIColorFormatFlag_FixedPointAlpha;\n    } else if (format == xenos::ColorRenderTargetFormat::k_2_10_10_10_FLOAT ||\n               format == xenos::ColorRenderTargetFormat::\n                             k_2_10_10_10_FLOAT_AS_16_16_16_16) {\n      format_flags |= kPSIColorFormatFlag_FixedPointAlpha;\n    }\n    return format_flags;\n  }\n\n  static void GetPSIColorFormatInfo(xenos::ColorRenderTargetFormat format,\n                                    uint32_t write_mask, float& clamp_rgb_low,\n                                    float& clamp_alpha_low,\n                                    float& clamp_rgb_high,\n                                    float& clamp_alpha_high,\n                                    uint32_t& keep_mask_low,\n                                    uint32_t& keep_mask_high);\n\n  virtual ~RenderTargetCache();\n\n  virtual Path GetPath() const = 0;\n\n  // Resolution scaling on the EDRAM side is performed by multiplying the EDRAM\n  // tile size by the resolution scale.\n  // Note: Only integer scaling factors are provided because fractional ones,\n  // even with 0.5 granularity, cause significant issues in addition to the ones\n  // already present with integer scaling. 1.5 (from 1280x720 to 1920x1080) may\n  // be useful, but it would cause pixel coverage issues with odd dimensions of\n  // screen-space geometry, most importantly 1x1 that is often the final step in\n  // reduction algorithms such as average luminance computation in HDR. A\n  // single-pixel quad, either 0...1 without half-pixel offset or 0.5...1.5 with\n  // it (covers only the first pixel according the top-left rule), with 1.5x\n  // resolution scaling, would become 0...1.5 (only the first pixel covered) or\n  // 0.75...2.25 (only the second). The workaround used in Xenia for 2x and 3x\n  // resolution scaling for filling the gap caused by the half-pixel offset\n  // becoming whole-pixel - stretching the second column / row of pixels into\n  // the first - will not work in this case, as for one-pixel primitives without\n  // half-pixel offset (covering only the first pixel, but not the second, with\n  // 1.5x), it will actually cause the pixel to be erased with 1.5x scaling. As\n  // within one pass there can be geometry both with and without the half-pixel\n  // offset (not only depending on PA_SU_VTX_CNTL::PIX_CENTER, but also with the\n  // half-pixel offset possibly reverted manually), the emulator can't decide\n  // whether the stretching workaround actually needs to be used. So, with 1.5x,\n  // depending on how the game draws its screen-space effects and on whether the\n  // workaround is used, in some cases, nothing will just be drawn to the first\n  // pixel, while in other cases, the effect will be drawn to it, but the\n  // stretching workaround will replace it with the undefined value in the\n  // second pixel. Also, with 1.5x, rounding of integer coordinates becomes\n  // complicated, also in part due to the half-pixel offset. Odd texture sizes\n  // would need to be rounded down, as according to the top-left rule, a 1.5x1.5\n  // quad at the 0 or 0.75 origin (after the scaling) will cover only 1 pixel -\n  // so, if the resulting texture was 2x2 rather than 1x1, undefined pixels\n  // would participate in filtering. However, 1x1 scissor rounded to 1x1, with\n  // the half-pixel offset of vertices, would cause the entire 0.75...2.25 quad\n  // to be discarded.\n  uint32_t draw_resolution_scale_x() const { return draw_resolution_scale_x_; }\n  uint32_t draw_resolution_scale_y() const { return draw_resolution_scale_y_; }\n  bool IsDrawResolutionScaled() const {\n    return draw_resolution_scale_x() > 1 || draw_resolution_scale_y() > 1;\n  }\n\n  // Virtual (both the common code and the implementation may do something\n  // here), don't call from destructors (does work not needed for shutdown\n  // also).\n  virtual void ClearCache();\n\n  virtual void BeginFrame();\n\n  virtual bool Update(bool is_rasterization_done,\n                      reg::RB_DEPTHCONTROL normalized_depth_control,\n                      uint32_t normalized_color_mask,\n                      const Shader& vertex_shader);\n\n  // Returns bits where 0 is whether a depth render target is currently bound on\n  // the host and 1... are whether the same applies to color render targets, and\n  // formats (resource formats, but if needed, with gamma taken into account) of\n  // each.\n  uint32_t GetLastUpdateBoundRenderTargets(\n      uint32_t* depth_and_color_formats_out = nullptr) const;\n\n protected:\n  RenderTargetCache(const RegisterFile& register_file, const Memory& memory,\n                    TraceWriter* trace_writer, uint32_t draw_resolution_scale_x,\n                    uint32_t draw_resolution_scale_y)\n      : register_file_(register_file),\n        draw_extent_estimator_(register_file, memory, trace_writer),\n        draw_resolution_scale_x_(draw_resolution_scale_x),\n        draw_resolution_scale_y_(draw_resolution_scale_y) {\n    assert_not_zero(draw_resolution_scale_x);\n    assert_not_zero(draw_resolution_scale_y);\n  }\n\n  const RegisterFile& register_file() const { return register_file_; }\n\n  virtual bool IsGammaFormatHostStorageSeparate() const = 0;\n\n  // Call last in implementation-specific initialization (when things like path\n  // are initialized by the implementation).\n  void InitializeCommon();\n  // May be called from the destructor, or from the implementation shutdown to\n  // destroy all render targets before destroying what they depend on in the\n  // implementation.\n  void DestroyAllRenderTargets(bool shutting_down);\n  // Call last in implementation-specific shutdown, also callable from the\n  // destructor.\n  void ShutdownCommon();\n\n  // For host render targets, implemented via transfer of ownership of EDRAM\n  // 80x16-sample tiles between host render targets. When a range is\n  // transferred, its data is copied, bit-exactly from the guest's perspective\n  // (when dangerous, such as because of non-propagated NaN, primarily in the\n  // float16 case, by drawing to an integer view of the render target texture),\n  // from the previous host render target to the new one, by drawing rectangles\n  // with a pixel shader converting the previous host render target to a guest\n  // bit pattern, reinterpreting it in the new format. If depth is emulated with\n  // float32, this may lead to loss of data - specifically for depth, both guest\n  // format ownership and float32 ownership are tracked, and to let color data\n  // overwrite depth data, loading during ownership transfer is done from\n  // intersections of the current guest ownership ranges and float32 ownership\n  // ranges. Ownership transfer happens when a render target is needed - based\n  // on the current viewport; or, if no viewport is available, ownership of the\n  // rest of the EDRAM is transferred.\n\n  union RenderTargetKey {\n    uint32_t key;\n    struct {\n      uint32_t base_tiles : xenos::kEdramBaseTilesBits;  // 11\n      // At 4x MSAA (2 horizontal samples), max. align(8192 * 2, 80) / 80 = 205.\n      // For pitch at 64bpp, multiply by 2 (or use GetPitchTiles).\n      uint32_t pitch_tiles_at_32bpp : 8;                          // 19\n      xenos::MsaaSamples msaa_samples : xenos::kMsaaSamplesBits;  // 21\n      uint32_t is_depth : 1;                                      // 22\n      // Ignoring the blending precision.\n      uint32_t resource_format : xenos::kRenderTargetFormatBits;  // 26\n    };\n\n    RenderTargetKey() : key(0) { static_assert_size(*this, sizeof(key)); }\n\n    struct Hasher {\n      size_t operator()(const RenderTargetKey& render_target_key) const {\n        return std::hash<uint32_t>{}(render_target_key.key);\n      }\n    };\n    bool operator==(const RenderTargetKey& other_key) const {\n      return key == other_key.key;\n    }\n    bool operator!=(const RenderTargetKey& other_key) const {\n      return !(*this == other_key);\n    }\n\n    bool IsEmpty() const {\n      // Meaningless when pitch_tiles_at_32bpp == 0, but for comparison\n      // purposes, only treat everything being 0 as a special case.\n      return key == 0;\n    }\n\n    xenos::ColorRenderTargetFormat GetColorFormat() const {\n      assert_false(is_depth);\n      return xenos::ColorRenderTargetFormat(resource_format);\n    }\n    xenos::DepthRenderTargetFormat GetDepthFormat() const {\n      assert_true(is_depth);\n      return xenos::DepthRenderTargetFormat(resource_format);\n    }\n    bool Is64bpp() const {\n      if (is_depth) {\n        return false;\n      }\n      return xenos::IsColorRenderTargetFormat64bpp(GetColorFormat());\n    }\n    const char* GetFormatName() const {\n      return is_depth ? xenos::GetDepthRenderTargetFormatName(GetDepthFormat())\n                      : xenos::GetColorRenderTargetFormatName(GetColorFormat());\n    }\n\n    uint32_t GetPitchTiles() const {\n      return pitch_tiles_at_32bpp << uint32_t(Is64bpp());\n    }\n    static constexpr uint32_t GetWidth(uint32_t pitch_tiles_at_32bpp,\n                                       xenos::MsaaSamples msaa_samples) {\n      return pitch_tiles_at_32bpp *\n             (xenos::kEdramTileWidthSamples >>\n              uint32_t(msaa_samples >= xenos::MsaaSamples::k4X));\n    }\n    uint32_t GetWidth() const {\n      return GetWidth(pitch_tiles_at_32bpp, msaa_samples);\n    }\n\n    std::string GetDebugName() const {\n      return fmt::format(\"RT @ {}t, <{}t>, {}xMSAA, {}\", base_tiles,\n                         GetPitchTiles(), uint32_t(1) << uint32_t(msaa_samples),\n                         GetFormatName());\n    }\n  };\n\n  class RenderTarget {\n   public:\n    virtual ~RenderTarget() = default;\n    // Exclusive ownership, plus no point in moving (only allocated via new).\n    RenderTarget(const RenderTarget& render_target) = delete;\n    RenderTarget& operator=(const RenderTarget& render_target) = delete;\n    RenderTarget(RenderTarget&& render_target) = delete;\n    RenderTarget& operator=(RenderTarget&& render_target) = delete;\n    RenderTargetKey key() const { return key_; }\n\n   protected:\n    RenderTarget(RenderTargetKey key) : key_(key) {}\n\n   private:\n    RenderTargetKey key_;\n  };\n\n  struct Transfer {\n    uint32_t start_tiles;\n    uint32_t end_tiles;\n    RenderTarget* source;\n    RenderTarget* host_depth_source;\n    Transfer(uint32_t start_tiles, uint32_t end_tiles, RenderTarget* source,\n             RenderTarget* host_depth_source)\n        : start_tiles(start_tiles),\n          end_tiles(end_tiles),\n          source(source),\n          host_depth_source(host_depth_source) {\n      assert_true(start_tiles < end_tiles);\n    }\n    struct Rectangle {\n      uint32_t x_pixels;\n      uint32_t y_pixels;\n      uint32_t width_pixels;\n      uint32_t height_pixels;\n    };\n    static constexpr uint32_t kMaxRectanglesWithoutCutout = 3;\n    static constexpr uint32_t kMaxCutoutBorderRectangles = 4;\n    static constexpr uint32_t kMaxRectanglesWithCutout =\n        kMaxRectanglesWithoutCutout * kMaxCutoutBorderRectangles;\n    // Cutout can be specified for resolve clears - not to transfer areas that\n    // will be cleared to a single value anyway.\n    static uint32_t GetRangeRectangles(uint32_t start_tiles, uint32_t end_tiles,\n                                       uint32_t base_tiles,\n                                       uint32_t pitch_tiles,\n                                       xenos::MsaaSamples msaa_samples,\n                                       bool is_64bpp, Rectangle* rectangles_out,\n                                       const Rectangle* cutout = nullptr);\n    uint32_t GetRectangles(uint32_t base_tiles, uint32_t pitch_tiles,\n                           xenos::MsaaSamples msaa_samples, bool is_64bpp,\n                           Rectangle* rectangles_out,\n                           const Rectangle* cutout = nullptr) const {\n      return GetRangeRectangles(start_tiles, end_tiles, base_tiles, pitch_tiles,\n                                msaa_samples, is_64bpp, rectangles_out, cutout);\n    }\n    bool AreSourcesSame(const Transfer& other_transfer) const {\n      return source == other_transfer.source &&\n             host_depth_source == other_transfer.host_depth_source;\n    }\n\n   private:\n    static uint32_t AddRectangle(const Rectangle& rectangle,\n                                 Rectangle* rectangles_out,\n                                 const Rectangle* cutout = nullptr);\n  };\n\n  union HostDepthStoreRectangleConstant {\n    uint32_t constant;\n    struct {\n      // - 1 because the maximum is 0x1FFF / 8, not 0x2000 / 8.\n      uint32_t x_pixels_div_8 : xenos::kResolveSizeBits - 1 -\n                                xenos::kResolveAlignmentPixelsLog2;\n      uint32_t y_pixels_div_8 : xenos::kResolveSizeBits - 1 -\n                                xenos::kResolveAlignmentPixelsLog2;\n      uint32_t width_pixels_div_8_minus_1 : xenos::kResolveSizeBits - 1 -\n                                            xenos::kResolveAlignmentPixelsLog2;\n    };\n    HostDepthStoreRectangleConstant() : constant(0) {\n      static_assert_size(*this, sizeof(constant));\n    }\n  };\n\n  union HostDepthStoreRenderTargetConstant {\n    uint32_t constant;\n    struct {\n      uint32_t pitch_tiles : xenos::kEdramPitchTilesBits;\n      uint32_t resolution_scale_x : 3;\n      uint32_t resolution_scale_y : 3;\n      // Whether 2x MSAA is supported natively rather than through 4x.\n      uint32_t msaa_2x_supported : 1;\n    };\n    HostDepthStoreRenderTargetConstant() : constant(0) {\n      static_assert_size(*this, sizeof(constant));\n    }\n  };\n\n  struct HostDepthStoreConstants {\n    HostDepthStoreRectangleConstant rectangle;\n    HostDepthStoreRenderTargetConstant render_target;\n  };\n\n  struct ResolveCopyDumpRectangle {\n    RenderTarget* render_target;\n    // If rows == 1:\n    //   Row row_first span:\n    //     [row_first_start, row_last_end)\n    // If rows > 1:\n    //   Row row_first + row span:\n    //     [row_first_start, row_length_used)\n    //   Rows [row_first + 1, row_first + rows - 1) span:\n    //     [row * pitch, row * pitch + row_length_used)\n    //   Row row_first + rows - 1 span:\n    //     [row * pitch, row * pitch + row_last_end)\n    uint32_t row_first;\n    uint32_t rows;\n    uint32_t row_first_start;\n    uint32_t row_last_end;\n    ResolveCopyDumpRectangle(RenderTarget* render_target, uint32_t row_first,\n                             uint32_t rows, uint32_t row_first_start,\n                             uint32_t row_last_end)\n        : render_target(render_target),\n          row_first(row_first),\n          rows(rows),\n          row_first_start(row_first_start),\n          row_last_end(row_last_end) {}\n    struct Dispatch {\n      // Base plus offset may exceed the EDRAM tile count in case of EDRAM\n      // addressing wrapping.\n      uint32_t offset;\n      uint32_t width_tiles;\n      uint32_t height_tiles;\n    };\n    static constexpr uint32_t kMaxDispatches = 3;\n    uint32_t GetDispatches(uint32_t pitch_tiles, uint32_t row_length_used,\n                           Dispatch* dispatches_out) const {\n      if (!rows) {\n        return 0;\n      }\n      // If the first and / or the last rows have the same X spans as the middle\n      // part, merge them with it.\n      uint32_t dispatch_count = 0;\n      if (rows == 1 || row_first_start) {\n        Dispatch& dispatch_first = dispatches_out[dispatch_count++];\n        dispatch_first.offset = row_first * pitch_tiles + row_first_start;\n        dispatch_first.width_tiles =\n            (rows == 1 ? row_last_end : row_length_used) - row_first_start;\n        dispatch_first.height_tiles = 1;\n        if (rows == 1) {\n          return dispatch_count;\n        }\n      }\n      uint32_t mid_row_first = row_first + 1;\n      uint32_t mid_rows = rows - 2;\n      if (!row_first_start) {\n        --mid_row_first;\n        ++mid_rows;\n      }\n      if (row_last_end == row_length_used) {\n        ++mid_rows;\n      }\n      if (mid_rows) {\n        Dispatch& dispatch_mid = dispatches_out[dispatch_count++];\n        dispatch_mid.offset = mid_row_first * pitch_tiles;\n        dispatch_mid.width_tiles = row_length_used;\n        dispatch_mid.height_tiles = mid_rows;\n      }\n      if (row_last_end != row_length_used) {\n        Dispatch& dispatch_last = dispatches_out[dispatch_count++];\n        dispatch_last.offset = (row_first + rows - 1) * pitch_tiles;\n        dispatch_last.width_tiles = row_last_end;\n        dispatch_last.height_tiles = 1;\n      }\n      return dispatch_count;\n    }\n  };\n\n  virtual uint32_t GetMaxRenderTargetWidth() const = 0;\n  virtual uint32_t GetMaxRenderTargetHeight() const = 0;\n\n  // Returns the height of a render target that's needed and can be created,\n  // taking guest and host limits into account. EDRAM base and 32bpp/64bpp are\n  // not taken into account, the same height is used for all render targets even\n  // if the implementation supports mixed-size render targets, so the\n  // implementation can freely disable individual render targets and let the\n  // other ones use the newly available space without restarting the whole\n  // render pass (on Vulkan, the actually used height is specified in\n  // VkFramebuffer).\n  uint32_t GetRenderTargetHeight(uint32_t pitch_tiles_at_32bpp,\n                                 xenos::MsaaSamples msaa_samples) const;\n\n  virtual RenderTarget* CreateRenderTarget(RenderTargetKey key) = 0;\n\n  // Whether depth buffer is encoded differently on the host, thus after\n  // aliasing naively, precision may be lost - host depth must only be\n  // overwritten if the new guest value is different than the current host depth\n  // when converted to the guest format (this catches the usual case of\n  // overwriting the depth buffer for clearing it mostly). 534507D6 intro\n  // cutscene, for example, has a good example of corruption that happens if\n  // this is not handled - the upper 1280x384 pixels are rendered in a very\n  // \"striped\" way if the depth precision is lost (if this is made always return\n  // false).\n  virtual bool IsHostDepthEncodingDifferent(\n      xenos::DepthRenderTargetFormat format) const = 0;\n\n  void ResetAccumulatedRenderTargets() {\n    are_accumulated_render_targets_valid_ = false;\n  }\n  RenderTarget* const* last_update_accumulated_render_targets() const {\n    assert_true(GetPath() == Path::kHostRenderTargets);\n    return last_update_accumulated_render_targets_;\n  }\n\n  const std::vector<Transfer>* last_update_transfers() const {\n    assert_true(GetPath() == Path::kHostRenderTargets);\n    return last_update_transfers_;\n  }\n\n  HostDepthStoreRenderTargetConstant GetHostDepthStoreRenderTargetConstant(\n      uint32_t pitch_tiles, bool msaa_2x_supported) const {\n    HostDepthStoreRenderTargetConstant constant;\n    constant.pitch_tiles = pitch_tiles;\n    // 3 bits for each.\n    assert_true(draw_resolution_scale_x() <= 7);\n    assert_true(draw_resolution_scale_y() <= 7);\n    constant.resolution_scale_x = draw_resolution_scale_x();\n    constant.resolution_scale_y = draw_resolution_scale_y();\n    constant.msaa_2x_supported = uint32_t(msaa_2x_supported);\n    return constant;\n  }\n  void GetHostDepthStoreRectangleInfo(\n      const Transfer::Rectangle& transfer_rectangle,\n      xenos::MsaaSamples msaa_samples,\n      HostDepthStoreRectangleConstant& rectangle_constant_out,\n      uint32_t& group_count_x_out, uint32_t& group_count_y_out) const;\n\n  // Returns mappings between ranges within the specified tile rectangle (not\n  // render target texture rectangle - textures may have any pitch they need)\n  // from ResolveInfo::GetCopyEdramTileSpan and render targets owning them to\n  // rectangles_out.\n  void GetResolveCopyRectanglesToDump(\n      uint32_t base, uint32_t row_length, uint32_t rows, uint32_t pitch,\n      std::vector<ResolveCopyDumpRectangle>& rectangles_out) const;\n\n  // Sets up the needed render targets and transfers to perform a clear in a\n  // resolve operation via a host render target clear. resolve_info is expected\n  // to be obtained via draw_util::GetResolveInfo. Returns whether any clears\n  // need to be done (false in both empty and error cases).\n  // TODO(Triang3l): Try to defer clears until the first draw in the next pass\n  // (if it uses one or both render targets being cleared) for tile-based GPUs.\n  bool PrepareHostRenderTargetsResolveClear(\n      const draw_util::ResolveInfo& resolve_info,\n      Transfer::Rectangle& clear_rectangle_out,\n      RenderTarget*& depth_render_target_out,\n      std::vector<Transfer>& depth_transfers_out,\n      RenderTarget*& color_render_target_out,\n      std::vector<Transfer>& color_transfers_out);\n\n  // For restoring EDRAM contents from frame traces, obtains or creates a render\n  // target at base 0 with of 1280 (only 1 sample and color because copying\n  // between MSAA render targets and buffers is not possible in Direct3D 12, and\n  // depth may require additional format conversions, not needed really) and\n  // transfers ownership of the entire EDRAM to that render target. If a\n  // full-EDRAM render target can't be created (for instance, due to size\n  // limitations on the host), nullptr is returned.\n  RenderTarget* PrepareFullEdram1280xRenderTargetForSnapshotRestoration(\n      xenos::ColorRenderTargetFormat color_format);\n\n  // For pixel shader interlock.\n\n  virtual void RequestPixelShaderInterlockBarrier() {}\n\n  // To be called by the implementation when interlocked writes to all of the\n  // EDRAM memory are committed with a memory barrier.\n  void PixelShaderInterlockFullEdramBarrierPlaced();\n\n private:\n  const RegisterFile& register_file_;\n  uint32_t draw_resolution_scale_x_;\n  uint32_t draw_resolution_scale_y_;\n\n  DrawExtentEstimator draw_extent_estimator_;\n\n  // For host render targets.\n\n  struct OwnershipRange {\n    uint32_t end_tiles;\n    // Need to store keys, not pointers to render targets themselves, because\n    // ownership transfer is also what's used to determine when to place\n    // barriers with pixel shader interlock, and in this case there are no host\n    // render targets.\n    // Render target this range is last used by.\n    RenderTargetKey render_target;\n    // Last host-side depth render targets that used this range even if it has\n    // been used by a different render target since then, only used if the\n    // respective format has a different encoding on the host. They are tracked\n    // separately, overwritten if the host value converted to the guest format\n    // becomes out of sync with the guest value. Even if the host uses float32\n    // to emulate both unorm24 and float24 (Vulkan on AMD), the unorm24 and\n    // float24 render targets are tracked separately from each other, so\n    // switching between unorm24 and float24 for the same depth data (clearing\n    // of most render targets is done through unorm24 without a viewport - very\n    // common) is not destructive as well (f32tof24(host_f32) == guest_f24 does\n    // not imply f32tou24(host_f32) == guest_u24, thus aliasing float24 with\n    // unorm24 through the same float32 buffer will drop the precision of the\n    // float32 value to that of an unorm24 with a totally wrong value). If the\n    // range hasn't been used yet (render_target.IsEmpty() == true), these are\n    // empty too.\n    RenderTargetKey host_depth_render_target_unorm24;\n    RenderTargetKey host_depth_render_target_float24;\n    OwnershipRange(uint32_t end_tiles, RenderTargetKey render_target,\n                   RenderTargetKey host_depth_render_target_unorm24,\n                   RenderTargetKey host_depth_render_target_float24)\n        : end_tiles(end_tiles),\n          render_target(render_target),\n          host_depth_render_target_unorm24(host_depth_render_target_unorm24),\n          host_depth_render_target_float24(host_depth_render_target_float24) {}\n    const RenderTargetKey& GetHostDepthRenderTarget(\n        xenos::DepthRenderTargetFormat resource_format) const {\n      assert_true(\n          resource_format == xenos::DepthRenderTargetFormat::kD24S8 ||\n              resource_format == xenos::DepthRenderTargetFormat::kD24FS8,\n          \"Illegal resource format\");\n      return resource_format == xenos::DepthRenderTargetFormat::kD24S8\n                 ? host_depth_render_target_unorm24\n                 : host_depth_render_target_float24;\n    }\n    RenderTargetKey& GetHostDepthRenderTarget(\n        xenos::DepthRenderTargetFormat resource_format) {\n      return const_cast<RenderTargetKey&>(\n          const_cast<const OwnershipRange*>(this)->GetHostDepthRenderTarget(\n              resource_format));\n    }\n    bool IsOwnedBy(RenderTargetKey key,\n                   bool host_depth_encoding_different) const {\n      if (render_target != key) {\n        // Last time used for something else. If it's a depth render target with\n        // different host depth encoding, might have been overwritten by color,\n        // or by a depth render target of a different format.\n        return false;\n      }\n      if (host_depth_encoding_different && !key.is_depth &&\n          GetHostDepthRenderTarget(key.GetDepthFormat()) != key) {\n        // Depth encoding is the same, but different addressing is needed.\n        return false;\n      }\n      return true;\n    }\n    bool AreOwnersSame(const OwnershipRange& other_range) const {\n      return render_target == other_range.render_target &&\n             host_depth_render_target_unorm24 ==\n                 other_range.host_depth_render_target_unorm24 &&\n             host_depth_render_target_float24 ==\n                 other_range.host_depth_render_target_float24;\n    }\n  };\n\n  xenos::ColorRenderTargetFormat GetColorResourceFormat(\n      xenos::ColorRenderTargetFormat format) const {\n    if (format == xenos::ColorRenderTargetFormat::k_8_8_8_8_GAMMA &&\n        !IsGammaFormatHostStorageSeparate()) {\n      return xenos::ColorRenderTargetFormat::k_8_8_8_8;\n    }\n    return xenos::GetStorageColorFormat(format);\n  }\n\n  RenderTarget* GetOrCreateRenderTarget(RenderTargetKey key);\n\n  // Checks if changing ownership of the range to the specified render target\n  // would require transferring data - primarily for barrier placement on the\n  // pixel shader interlock path (where transfers do not involve copying, but\n  // barriers are still needed before accessing ranges written before the\n  // barrier and addressed by different target-independent rasterization pixel\n  // positions.\n  bool WouldOwnershipChangeRequireTransfers(RenderTargetKey dest,\n                                            uint32_t start_tiles_base_relative,\n                                            uint32_t length_tiles) const;\n  // Updates ownership_ranges_, adds the transfers needed for the ownership\n  // change to transfers_append_out if it's not null.\n  void ChangeOwnership(\n      RenderTargetKey dest, uint32_t start_tiles_base_relative,\n      uint32_t length_tiles, std::vector<Transfer>* transfers_append_out,\n      const Transfer::Rectangle* resolve_clear_cutout = nullptr);\n\n  // If failed to create, may contain nullptr to prevent attempting to create a\n  // render target twice.\n  std::unordered_map<RenderTargetKey, RenderTarget*, RenderTargetKey::Hasher>\n      render_targets_;\n\n  // Map of host render targets currently containing the most up-to-date version\n  // of the tile. Has no gaps, unused parts are represented by empty render\n  // target keys.\n  // TODO(Triang3l): Pool allocator (or a custom red-black tree with one even),\n  // since standard containers use dynamic allocation for elements, though\n  // changes to this throughout a frame are pretty rare.\n  std::map<uint32_t, OwnershipRange> ownership_ranges_;\n\n  // Render targets actually used by the draw call with the last successful\n  // update. 0 is depth, color starting from 1, nullptr if not bound.\n  // Only valid for non-pixel-shader-interlock paths.\n  RenderTarget*\n      last_update_used_render_targets_[1 + xenos::kMaxColorRenderTargets];\n  // Render targets used by the draw call with the last successful update or\n  // previous updates, unless a different or a totally new one was bound (or\n  // surface info was changed), to avoid unneeded render target switching (which\n  // is especially undesirable on tile-based GPUs) in the implementation if\n  // simply disabling depth / stencil test or color writes and then re-enabling\n  // (58410954 does this often with color). Must also be used to determine\n  // whether it's safe to enable depth / stencil or writing to a specific color\n  // render target in the pipeline for this draw call.\n  // Only valid for non-pixel-shader-interlock paths.\n  RenderTarget*\n      last_update_accumulated_render_targets_[1 +\n                                              xenos::kMaxColorRenderTargets];\n  // If false, the next update must copy last_update_used_render_targets_ to\n  // last_update_accumulated_render_targets_ - it's not beneficial or even\n  // incorrect to keep the previously bound render targets.\n  bool are_accumulated_render_targets_valid_ = false;\n  // After an update (for simplicity, even an unsuccessful update invalidates\n  // this), contains needed ownership transfer sources for each of the current\n  // render targets. They are reordered so for one source, all transfers are\n  // consecutive in the array.\n  std::vector<Transfer>\n      last_update_transfers_[1 + xenos::kMaxColorRenderTargets];\n};\n\n}  // namespace gpu\n}  // namespace xe\n\n#endif  // XENIA_GPU_RENDER_TARGET_CACHE_H_\n"
  },
  {
    "path": "src/xenia/gpu/sampler_info.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/sampler_info.h\"\n\n#include <cstring>\n#include <memory>\n\n#include \"xenia/base/xxhash.h\"\n\nnamespace xe {\nnamespace gpu {\n\nbool SamplerInfo::Prepare(const xenos::xe_gpu_texture_fetch_t& fetch,\n                          const ParsedTextureFetchInstruction& fetch_instr,\n                          SamplerInfo* out_info) {\n  std::memset(out_info, 0, sizeof(SamplerInfo));\n\n  out_info->min_filter =\n      fetch_instr.attributes.min_filter == xenos::TextureFilter::kUseFetchConst\n          ? fetch.min_filter\n          : fetch_instr.attributes.min_filter;\n  out_info->mag_filter =\n      fetch_instr.attributes.mag_filter == xenos::TextureFilter::kUseFetchConst\n          ? fetch.mag_filter\n          : fetch_instr.attributes.mag_filter;\n  out_info->mip_filter =\n      fetch_instr.attributes.mip_filter == xenos::TextureFilter::kUseFetchConst\n          ? fetch.mip_filter\n          : fetch_instr.attributes.mip_filter;\n  out_info->clamp_u = fetch.clamp_x;\n  out_info->clamp_v = fetch.clamp_y;\n  out_info->clamp_w = fetch.clamp_z;\n  out_info->aniso_filter =\n      fetch_instr.attributes.aniso_filter == xenos::AnisoFilter::kUseFetchConst\n          ? fetch.aniso_filter\n          : fetch_instr.attributes.aniso_filter;\n\n  out_info->border_color = fetch.border_color;\n  out_info->lod_bias = (fetch.lod_bias) / 32.f;\n  out_info->mip_min_level = fetch.mip_min_level;\n  out_info->mip_max_level = fetch.mip_max_level;\n\n  return true;\n}\n\nuint64_t SamplerInfo::hash() const {\n  return XXH3_64bits(this, sizeof(SamplerInfo));\n}\n\n}  //  namespace gpu\n}  //  namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/sampler_info.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_SAMPLER_INFO_H_\n#define XENIA_GPU_SAMPLER_INFO_H_\n\n#include \"xenia/gpu/shader.h\"\n#include \"xenia/gpu/xenos.h\"\n\nnamespace xe {\nnamespace gpu {\n\nstruct SamplerInfo {\n  xenos::TextureFilter min_filter;\n  xenos::TextureFilter mag_filter;\n  xenos::TextureFilter mip_filter;\n  xenos::ClampMode clamp_u;\n  xenos::ClampMode clamp_v;\n  xenos::ClampMode clamp_w;\n  xenos::AnisoFilter aniso_filter;\n  xenos::BorderColor border_color;\n  float lod_bias;\n  uint32_t mip_min_level;\n  uint32_t mip_max_level;\n\n  static bool Prepare(const xenos::xe_gpu_texture_fetch_t& fetch,\n                      const ParsedTextureFetchInstruction& fetch_instr,\n                      SamplerInfo* out_info);\n\n  uint64_t hash() const;\n  bool operator==(const SamplerInfo& other) const {\n    return min_filter == other.min_filter && mag_filter == other.mag_filter &&\n           mip_filter == other.mip_filter && clamp_u == other.clamp_u &&\n           clamp_v == other.clamp_v && clamp_w == other.clamp_w &&\n           aniso_filter == other.aniso_filter && lod_bias == other.lod_bias &&\n           mip_min_level == other.mip_min_level &&\n           mip_max_level == other.mip_max_level;\n  }\n};\n\n}  // namespace gpu\n}  // namespace xe\n\n#endif  // XENIA_GPU_SAMPLER_INFO_H_\n"
  },
  {
    "path": "src/xenia/gpu/shader.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/shader.h\"\n\n#include <cinttypes>\n#include <cstring>\n#include <utility>\n\n#include \"third_party/fmt/include/fmt/format.h\"\n#include \"xenia/base/filesystem.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/memory.h\"\n#include \"xenia/base/string.h\"\n#include \"xenia/gpu/ucode.h\"\n\nnamespace xe {\nnamespace gpu {\nusing namespace ucode;\n\nShader::Shader(xenos::ShaderType shader_type, uint64_t ucode_data_hash,\n               const uint32_t* ucode_dwords, size_t ucode_dword_count,\n               std::endian ucode_source_endian)\n    : shader_type_(shader_type), ucode_data_hash_(ucode_data_hash) {\n  // We keep ucode data in host native format so it's easier to work with.\n  ucode_data_.resize(ucode_dword_count);\n  if (std::endian::native != ucode_source_endian) {\n    xe::copy_and_swap(ucode_data_.data(), ucode_dwords, ucode_dword_count);\n  } else {\n    std::memcpy(ucode_data_.data(), ucode_dwords,\n                sizeof(uint32_t) * ucode_dword_count);\n  }\n}\n\nShader::~Shader() {\n  for (auto it : translations_) {\n    delete it.second;\n  }\n}\n\nstd::string Shader::Translation::GetTranslatedBinaryString() const {\n  std::string result;\n  result.resize(translated_binary_.size());\n  std::memcpy(const_cast<char*>(result.data()), translated_binary_.data(),\n              translated_binary_.size());\n  return result;\n}\n\nstd::pair<std::filesystem::path, std::filesystem::path>\nShader::Translation::Dump(const std::filesystem::path& base_path,\n                          const char* path_prefix) const {\n  if (!is_valid()) {\n    return std::make_pair(std::filesystem::path(), std::filesystem::path());\n  }\n\n  std::filesystem::path path = base_path;\n  // Ensure target path exists.\n  std::filesystem::path target_path = base_path;\n  if (!target_path.empty()) {\n    target_path = std::filesystem::absolute(target_path);\n    std::filesystem::create_directories(target_path);\n  }\n\n  const char* type_extension =\n      shader().type() == xenos::ShaderType::kVertex ? \"vert\" : \"frag\";\n\n  std::filesystem::path binary_path =\n      target_path / fmt::format(\"shader_{:016X}_{:016X}.{}.bin.{}\",\n                                shader().ucode_data_hash(), modification(),\n                                path_prefix, type_extension);\n  FILE* binary_file = filesystem::OpenFile(binary_path, \"wb\");\n  if (binary_file) {\n    fwrite(translated_binary_.data(), sizeof(*translated_binary_.data()),\n           translated_binary_.size(), binary_file);\n    fclose(binary_file);\n  }\n\n  std::filesystem::path disasm_path;\n  if (!host_disassembly_.empty()) {\n    disasm_path =\n        target_path / fmt::format(\"shader_{:016X}_{:016X}.{}.{}\",\n                                  shader().ucode_data_hash(), modification(),\n                                  path_prefix, type_extension);\n    FILE* disasm_file = filesystem::OpenFile(disasm_path, \"w\");\n    if (disasm_file) {\n      fwrite(host_disassembly_.data(), sizeof(*host_disassembly_.data()),\n             host_disassembly_.size(), disasm_file);\n      fclose(disasm_file);\n    }\n  }\n\n  return std::make_pair(std::move(binary_path), std::move(disasm_path));\n}\n\nShader::Translation* Shader::GetOrCreateTranslation(uint64_t modification,\n                                                    bool* is_new) {\n  auto it = translations_.find(modification);\n  if (it != translations_.end()) {\n    if (is_new) {\n      *is_new = false;\n    }\n    return it->second;\n  }\n  Translation* translation = CreateTranslationInstance(modification);\n  translations_.emplace(modification, translation);\n  if (is_new) {\n    *is_new = true;\n  }\n  return translation;\n}\n\nvoid Shader::DestroyTranslation(uint64_t modification) {\n  auto it = translations_.find(modification);\n  if (it == translations_.end()) {\n    return;\n  }\n  delete it->second;\n  translations_.erase(it);\n}\n\nstd::pair<std::filesystem::path, std::filesystem::path> Shader::DumpUcode(\n    const std::filesystem::path& base_path) const {\n  // Ensure target path exists.\n  std::filesystem::path target_path = base_path;\n  if (!target_path.empty()) {\n    target_path = std::filesystem::absolute(target_path);\n    std::filesystem::create_directories(target_path);\n  }\n\n  const char* type_extension =\n      type() == xenos::ShaderType::kVertex ? \"vert\" : \"frag\";\n\n  std::filesystem::path binary_path =\n      target_path / fmt::format(\"shader_{:016X}.ucode.bin.{}\",\n                                ucode_data_hash(), type_extension);\n  FILE* binary_file = filesystem::OpenFile(binary_path, \"wb\");\n  if (binary_file) {\n    fwrite(ucode_data().data(), sizeof(*ucode_data().data()),\n           ucode_data().size(), binary_file);\n    fclose(binary_file);\n  }\n\n  std::filesystem::path disasm_path;\n  if (is_ucode_analyzed()) {\n    disasm_path = target_path / fmt::format(\"shader_{:016X}.ucode.{}\",\n                                            ucode_data_hash(), type_extension);\n    FILE* disasm_file = filesystem::OpenFile(disasm_path, \"w\");\n    if (disasm_file) {\n      fwrite(ucode_disassembly().data(), sizeof(*ucode_disassembly().data()),\n             ucode_disassembly().size(), disasm_file);\n      fclose(disasm_file);\n    }\n  }\n\n  return std::make_pair(std::move(binary_path), std::move(disasm_path));\n}\n\nShader::Translation* Shader::CreateTranslationInstance(uint64_t modification) {\n  // Default implementation for simple cases like ucode disassembly.\n  return new Translation(*this, modification);\n}\n\n}  //  namespace gpu\n}  //  namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/shader.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_SHADER_H_\n#define XENIA_GPU_SHADER_H_\n\n#include <algorithm>\n#include <cstdint>\n#include <filesystem>\n#include <set>\n#include <string>\n#include <unordered_map>\n#include <utility>\n#include <vector>\n\n#include \"xenia/base/byte_order.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/string_buffer.h\"\n#include \"xenia/gpu/registers.h\"\n#include \"xenia/gpu/ucode.h\"\n#include \"xenia/gpu/xenos.h\"\n\nnamespace xe {\nnamespace gpu {\n\n// The structures here are used for both translation and disassembly.\n//\n// Because disassembly uses them too, to make sure \"assemble -> disassemble ->\n// reassemble\" round trip is always successful with the XNA assembler (as it is\n// the accuracy benchmark for translation), only generalization - not\n// optimization like nop skipping/replacement - must be done while converting\n// microcode to these structures (in other words, parsed shader code should be\n// enough to accurately reconstruct the microcode for any shader that could be\n// written by a human in assembly).\n//\n// During the \"parsed -> host\" part of the translation, however, translators are\n// free to make any optimizations (as long as they don't affect the result, of\n// course) they find appropriate.\n\nenum class InstructionStorageTarget {\n  // Result is not stored.\n  kNone,\n  // Result is stored to a temporary register indexed by storage_index [0-63].\n  kRegister,\n  // Result is stored into a vertex shader interpolator export [0-15].\n  kInterpolator,\n  // Result is stored to the position export (gl_Position).\n  kPosition,\n  // Result is stored to the vertex shader misc export register, see\n  // ucode::ExportRegister::kVSPointSizeEdgeFlagKillVertex for description of\n  // components.\n  kPointSizeEdgeFlagKillVertex,\n  // Result is stored as memexport destination address\n  // (see xenos::xe_gpu_memexport_stream_t).\n  kExportAddress,\n  // Result is stored to memexport destination data.\n  kExportData,\n  // Result is stored to a color target export indexed by storage_index [0-3].\n  kColor,\n  // X of the result is stored to the depth export (gl_FragDepth).\n  kDepth,\n};\n\n// Must be used only in translation to skip unused components, but not in\n// disassembly (because oPts.x000 will be assembled, but oPts.x00_ has both\n// skipped components and zeros, which cannot be encoded, and therefore it will\n// not).\nconstexpr uint32_t GetInstructionStorageTargetUsedComponentCount(\n    InstructionStorageTarget target) {\n  switch (target) {\n    case InstructionStorageTarget::kNone:\n      return 0;\n    case InstructionStorageTarget::kPointSizeEdgeFlagKillVertex:\n      return 3;\n    case InstructionStorageTarget::kDepth:\n      return 1;\n    default:\n      return 4;\n  }\n}\n\nenum class InstructionStorageAddressingMode {\n  // The storage index is not dynamically addressed.\n  kAbsolute,\n  // The storage index is addressed by a0.\n  // Float constants only.\n  kAddressRegisterRelative,\n  // The storage index is addressed by aL.\n  // Float constants and temporary registers only.\n  kLoopRelative,\n};\n\n// Describes the source value of a particular component.\nenum class SwizzleSource {\n  // Component receives the source X.\n  kX,\n  // Component receives the source Y.\n  kY,\n  // Component receives the source Z.\n  kZ,\n  // Component receives the source W.\n  kW,\n  // Component receives constant 0.\n  k0,\n  // Component receives constant 1.\n  k1,\n};\n\nconstexpr SwizzleSource GetSwizzleFromComponentIndex(uint32_t i) {\n  return static_cast<SwizzleSource>(i);\n}\nconstexpr SwizzleSource GetSwizzledAluSourceComponent(\n    uint32_t swizzle, uint32_t component_index) {\n  return GetSwizzleFromComponentIndex(\n      ucode::AluInstruction::GetSwizzledComponentIndex(swizzle,\n                                                       component_index));\n}\ninline char GetCharForComponentIndex(uint32_t i) {\n  const static char kChars[] = {'x', 'y', 'z', 'w'};\n  return kChars[i];\n}\ninline char GetCharForSwizzle(SwizzleSource swizzle_source) {\n  const static char kChars[] = {'x', 'y', 'z', 'w', '0', '1'};\n  return kChars[static_cast<uint32_t>(swizzle_source)];\n}\n\nstruct InstructionResult {\n  // Where the result is going.\n  InstructionStorageTarget storage_target = InstructionStorageTarget::kNone;\n  // Index into the storage_target, if it is indexed.\n  uint32_t storage_index = 0;\n  // How the storage index is dynamically addressed, if it is.\n  InstructionStorageAddressingMode storage_addressing_mode =\n      InstructionStorageAddressingMode::kAbsolute;\n  // True to clamp the result value to [0-1].\n  bool is_clamped = false;\n  // Defines whether each output component is written, though this is from the\n  // original microcode, not taking into account whether such components\n  // actually exist in the target.\n  uint32_t original_write_mask = 0b0000;\n  // Defines the source for each output component xyzw.\n  SwizzleSource components[4] = {SwizzleSource::kX, SwizzleSource::kY,\n                                 SwizzleSource::kZ, SwizzleSource::kW};\n  // Returns the write mask containing only components actually present in the\n  // target.\n  uint32_t GetUsedWriteMask() const {\n    uint32_t target_component_count =\n        GetInstructionStorageTargetUsedComponentCount(storage_target);\n    return original_write_mask & ((1 << target_component_count) - 1);\n  }\n  // True if the components are in their 'standard' swizzle arrangement (xyzw).\n  bool IsStandardSwizzle() const {\n    return (GetUsedWriteMask() == 0b1111) &&\n           components[0] == SwizzleSource::kX &&\n           components[1] == SwizzleSource::kY &&\n           components[2] == SwizzleSource::kZ &&\n           components[3] == SwizzleSource::kW;\n  }\n  // Returns the components of the result, before swizzling, that won't be\n  // discarded or replaced with a constant.\n  uint32_t GetUsedResultComponents() const {\n    uint32_t used_write_mask = GetUsedWriteMask();\n    uint32_t used_components = 0b0000;\n    for (uint32_t i = 0; i < 4; ++i) {\n      if ((used_write_mask & (1 << i)) && components[i] >= SwizzleSource::kX &&\n          components[i] <= SwizzleSource::kW) {\n        used_components |=\n            1 << (uint32_t(components[i]) - uint32_t(SwizzleSource::kX));\n      }\n    }\n    return used_components;\n  }\n  // Returns which components of the used write mask are constant, and what\n  // values they have.\n  uint32_t GetUsedConstantComponents(uint32_t& constant_values_out) const {\n    uint32_t constant_components = 0;\n    uint32_t constant_values = 0;\n    uint32_t used_write_mask = GetUsedWriteMask();\n    for (uint32_t i = 0; i < 4; ++i) {\n      if (!(used_write_mask & (1 << i))) {\n        continue;\n      }\n      SwizzleSource component = components[i];\n      if (component >= SwizzleSource::kX && component <= SwizzleSource::kW) {\n        continue;\n      }\n      constant_components |= 1 << i;\n      if (component == SwizzleSource::k1) {\n        constant_values |= 1 << i;\n      }\n    }\n    constant_values_out = constant_values;\n    return constant_components;\n  }\n};\n\nenum class InstructionStorageSource {\n  // Source is stored in a temporary register indexed by storage_index [0-63].\n  kRegister,\n  // Source is stored in a float constant indexed by storage_index [0-255].\n  kConstantFloat,\n  // Source is stored in a vertex fetch constant indexed by storage_index\n  // [0-95].\n  kVertexFetchConstant,\n  // Source is stored in a texture fetch constant indexed by storage_index\n  // [0-31].\n  kTextureFetchConstant,\n};\n\nstruct InstructionOperand {\n  // Where the source comes from.\n  InstructionStorageSource storage_source = InstructionStorageSource::kRegister;\n  // Index into the storage_target, if it is indexed.\n  uint32_t storage_index = 0;\n  // How the storage index is dynamically addressed, if it is.\n  InstructionStorageAddressingMode storage_addressing_mode =\n      InstructionStorageAddressingMode::kAbsolute;\n  // True to negate the operand value.\n  bool is_negated = false;\n  // True to take the absolute value of the source (before any negation).\n  bool is_absolute_value = false;\n  // Number of components taken from the source operand.\n  uint32_t component_count = 4;\n  // Defines the source for each component xyzw (up to the given\n  // component_count).\n  SwizzleSource components[4] = {SwizzleSource::kX, SwizzleSource::kY,\n                                 SwizzleSource::kZ, SwizzleSource::kW};\n  // Returns the swizzle source for the component, replicating the rightmost\n  // component if there are less than 4 components (similar to what the Xbox 360\n  // shader compiler does as a general rule for unspecified components).\n  SwizzleSource GetComponent(uint32_t index) const {\n    return components[std::min(index, component_count - 1)];\n  }\n  // True if the components are in their 'standard' swizzle arrangement (xyzw).\n  bool IsStandardSwizzle() const {\n    switch (component_count) {\n      case 4:\n        return components[0] == SwizzleSource::kX &&\n               components[1] == SwizzleSource::kY &&\n               components[2] == SwizzleSource::kZ &&\n               components[3] == SwizzleSource::kW;\n    }\n    return false;\n  }\n\n  // Returns which components of two operands will always be bitwise equal\n  // (disregarding component_count for simplicity of usage with GetComponent,\n  // treating the rightmost component as replicated). This, strictly with all\n  // conditions, must be used when emulating Shader Model 3 +-0 * x = +0\n  // multiplication behavior with IEEE-compliant multiplication (because\n  // -0 * |-0|, or -0 * +0, is -0, while the result must be +0).\n  uint32_t GetIdenticalComponents(const InstructionOperand& other) const {\n    if (storage_source != other.storage_source ||\n        storage_index != other.storage_index ||\n        storage_addressing_mode != other.storage_addressing_mode ||\n        is_negated != other.is_negated ||\n        is_absolute_value != other.is_absolute_value) {\n      return 0;\n    }\n    uint32_t identical_components = 0;\n    for (uint32_t i = 0; i < 4; ++i) {\n      identical_components |= uint32_t(GetComponent(i) == other.GetComponent(i))\n                              << i;\n    }\n    return identical_components;\n  }\n};\n\nstruct ParsedExecInstruction {\n  // Index into the ucode dword source.\n  uint32_t dword_index = 0;\n\n  // Opcode for the instruction.\n  ucode::ControlFlowOpcode opcode;\n  // Friendly name of the instruction.\n  const char* opcode_name = nullptr;\n\n  // Instruction address where ALU/fetch instructions reside.\n  uint32_t instruction_address = 0;\n  // Number of instructions to execute.\n  uint32_t instruction_count = 0;\n\n  enum class Type {\n    // Block is always executed.\n    kUnconditional,\n    // Execution is conditional on the value of the boolean constant.\n    kConditional,\n    // Execution is predicated.\n    kPredicated,\n  };\n  // Condition required to execute the instructions.\n  Type type = Type::kUnconditional;\n  // Constant index used as the conditional if kConditional.\n  uint32_t bool_constant_index = 0;\n  // Required condition value of the comparision (true or false).\n  bool condition = false;\n\n  // Whether this exec ends the shader.\n  bool is_end = false;\n  // Whether the hardware doesn't have to wait for the predicate to be updated\n  // after this exec.\n  bool is_predicate_clean = true;\n  // ?\n  bool is_yield = false;\n\n  // Sequence bits, 2 per instruction, indicating whether ALU or fetch.\n  uint32_t sequence = 0;\n\n  // Disassembles the instruction into ucode assembly text.\n  void Disassemble(StringBuffer* out) const;\n};\n\nstruct ParsedLoopStartInstruction {\n  // Index into the ucode dword source.\n  uint32_t dword_index = 0;\n\n  // Integer constant register that holds the loop parameters.\n  // 0:7 - uint8 loop count, 8:15 - uint8 start aL, 16:23 - int8 aL step.\n  uint32_t loop_constant_index = 0;\n  // Whether to reuse the current aL instead of reset it to loop start.\n  bool is_repeat = false;\n\n  // Target address to jump to when skipping the loop.\n  uint32_t loop_skip_address = 0;\n\n  // Disassembles the instruction into ucode assembly text.\n  void Disassemble(StringBuffer* out) const;\n};\n\nstruct ParsedLoopEndInstruction {\n  // Index into the ucode dword source.\n  uint32_t dword_index = 0;\n\n  // Break from the loop if the predicate matches the expected value.\n  bool is_predicated_break = false;\n  // Required condition value of the comparision (true or false).\n  bool predicate_condition = false;\n\n  // Integer constant register that holds the loop parameters.\n  // 0:7 - uint8 loop count, 8:15 - uint8 start aL, 16:23 - int8 aL step.\n  uint32_t loop_constant_index = 0;\n\n  // Target address of the start of the loop body.\n  uint32_t loop_body_address = 0;\n\n  // Disassembles the instruction into ucode assembly text.\n  void Disassemble(StringBuffer* out) const;\n};\n\nstruct ParsedCallInstruction {\n  // Index into the ucode dword source.\n  uint32_t dword_index = 0;\n\n  // Target address.\n  uint32_t target_address = 0;\n\n  enum class Type {\n    // Call is always made.\n    kUnconditional,\n    // Call is conditional on the value of the boolean constant.\n    kConditional,\n    // Call is predicated.\n    kPredicated,\n  };\n  // Condition required to make the call.\n  Type type = Type::kUnconditional;\n  // Constant index used as the conditional if kConditional.\n  uint32_t bool_constant_index = 0;\n  // Required condition value of the comparision (true or false).\n  bool condition = false;\n\n  // Disassembles the instruction into ucode assembly text.\n  void Disassemble(StringBuffer* out) const;\n};\n\nstruct ParsedReturnInstruction {\n  // Index into the ucode dword source.\n  uint32_t dword_index = 0;\n\n  // Disassembles the instruction into ucode assembly text.\n  void Disassemble(StringBuffer* out) const;\n};\n\nstruct ParsedJumpInstruction {\n  // Index into the ucode dword source.\n  uint32_t dword_index = 0;\n\n  // Target address.\n  uint32_t target_address = 0;\n\n  enum class Type {\n    // Jump is always taken.\n    kUnconditional,\n    // Jump is conditional on the value of the boolean constant.\n    kConditional,\n    // Jump is predicated.\n    kPredicated,\n  };\n  // Condition required to make the jump.\n  Type type = Type::kUnconditional;\n  // Constant index used as the conditional if kConditional.\n  uint32_t bool_constant_index = 0;\n  // Required condition value of the comparision (true or false).\n  bool condition = false;\n\n  // Disassembles the instruction into ucode assembly text.\n  void Disassemble(StringBuffer* out) const;\n};\n\nstruct ParsedAllocInstruction {\n  // Index into the ucode dword source.\n  uint32_t dword_index = 0;\n\n  // The type of resource being allocated.\n  ucode::AllocType type = ucode::AllocType::kNone;\n  // Total count associated with the allocation.\n  int count = 0;\n\n  // True if this allocation is in a vertex shader.\n  bool is_vertex_shader = false;\n\n  // Disassembles the instruction into ucode assembly text.\n  void Disassemble(StringBuffer* out) const;\n};\n\nstruct ParsedVertexFetchInstruction {\n  // Opcode for the instruction.\n  ucode::FetchOpcode opcode;\n  // Friendly name of the instruction.\n  const char* opcode_name = nullptr;\n\n  // True if the fetch is reusing a previous full fetch.\n  // The previous fetch source and constant data will be populated.\n  bool is_mini_fetch = false;\n\n  // True if the instruction is predicated on the specified\n  // predicate_condition.\n  bool is_predicated = false;\n  // Expected predication condition value if predicated.\n  bool predicate_condition = false;\n\n  // Describes how the instruction result is stored.\n  // Note that if the result doesn't have any components to write the fetched\n  // value to, the address calculation in vfetch_full must still be performed\n  // because such a vfetch_full may be used to setup addressing for vfetch_mini\n  // (wires in the color pass of 5454082B do vfetch_full to r2.000_, and then a\n  // true vfetch_mini).\n  InstructionResult result;\n\n  // Number of source operands.\n  size_t operand_count = 0;\n  // Describes each source operand.\n  // Note that for vfetch_mini, which inherits the operands from vfetch_full,\n  // the index operand register may been overwritten between the vfetch_full and\n  // the vfetch_mini (happens in 4D530910 for wheels), but that should have no\n  // effect on the index actually used for fetching. A copy of the index\n  // therefore must be stored by vfetch_full (the base address, stride and\n  // rounding may be pre-applied to it since they will be the same in the\n  // vfetch_full and all its vfetch_mini instructions).\n  InstructionOperand operands[2];\n\n  struct Attributes {\n    xenos::VertexFormat data_format = xenos::VertexFormat::kUndefined;\n    int32_t offset = 0;\n    uint32_t stride = 0;  // In dwords.\n    int32_t exp_adjust = 0;\n    // Prefetch count minus 1.\n    uint32_t prefetch_count = 0;\n    xenos::SignedRepeatingFractionMode signed_rf_mode =\n        xenos::SignedRepeatingFractionMode::kZeroClampMinusOne;\n    bool is_index_rounded = false;\n    bool is_signed = false;\n    bool is_integer = false;\n  };\n  // Attributes describing the fetch operation.\n  Attributes attributes;\n\n  // Disassembles the instruction into ucode assembly text.\n  void Disassemble(StringBuffer* out) const;\n};\n\nstruct ParsedTextureFetchInstruction {\n  // Opcode for the instruction.\n  ucode::FetchOpcode opcode;\n  // Friendly name of the instruction.\n  const char* opcode_name = nullptr;\n  // Texture dimension for opcodes that have multiple dimension forms.\n  xenos::FetchOpDimension dimension = xenos::FetchOpDimension::k1D;\n\n  // True if the instruction is predicated on the specified\n  // predicate_condition.\n  bool is_predicated = false;\n  // Expected predication condition value if predicated.\n  bool predicate_condition = false;\n\n  // True if the instruction has a result.\n  bool has_result() const {\n    return result.storage_target != InstructionStorageTarget::kNone;\n  }\n  // Describes how the instruction result is stored.\n  InstructionResult result;\n\n  // Number of source operands.\n  size_t operand_count = 0;\n  // Describes each source operand.\n  InstructionOperand operands[2];\n\n  struct Attributes {\n    bool fetch_valid_only = true;\n    bool unnormalized_coordinates = false;\n    xenos::TextureFilter mag_filter = xenos::TextureFilter::kUseFetchConst;\n    xenos::TextureFilter min_filter = xenos::TextureFilter::kUseFetchConst;\n    xenos::TextureFilter mip_filter = xenos::TextureFilter::kUseFetchConst;\n    xenos::AnisoFilter aniso_filter = xenos::AnisoFilter::kUseFetchConst;\n    xenos::TextureFilter vol_mag_filter = xenos::TextureFilter::kUseFetchConst;\n    xenos::TextureFilter vol_min_filter = xenos::TextureFilter::kUseFetchConst;\n    bool use_computed_lod = true;\n    bool use_register_lod = false;\n    bool use_register_gradients = false;\n    float lod_bias = 0.0f;\n    float offset_x = 0.0f;\n    float offset_y = 0.0f;\n    float offset_z = 0.0f;\n  };\n  // Attributes describing the fetch operation.\n  Attributes attributes;\n\n  // Considering the operation, dimensions, filter overrides, and the result\n  // components, returns which components of the result will have a value that\n  // is not always zero.\n  uint32_t GetNonZeroResultComponents() const;\n\n  // Disassembles the instruction into ucode assembly text.\n  void Disassemble(StringBuffer* out) const;\n};\n\nstruct ParsedAluInstruction {\n  // Opcode for the vector part of the instruction.\n  ucode::AluVectorOpcode vector_opcode = ucode::AluVectorOpcode::kAdd;\n  // Opcode for the scalar part of the instruction.\n  ucode::AluScalarOpcode scalar_opcode = ucode::AluScalarOpcode::kAdds;\n  // Friendly name of the vector instruction.\n  const char* vector_opcode_name = nullptr;\n  // Friendly name of the scalar instruction.\n  const char* scalar_opcode_name = nullptr;\n\n  // True if the instruction is predicated on the specified\n  // predicate_condition.\n  bool is_predicated = false;\n  // Expected predication condition value if predicated.\n  bool predicate_condition = false;\n\n  // Describes how the vector operation result and, for exports, constant 0/1\n  // are stored. For simplicity of translation and disassembly, treating\n  // constant 0/1 writes as a part of the vector operation - they need to be\n  // expressed somehow in the disassembly anyway with a properly disassembled\n  // instruction even if only constants are being exported. The XNA disassembler\n  // falls back to displaying the whole vector operation, even if only constant\n  // components are written, if the scalar operation is a nop or if the vector\n  // operation changes a0, p0 or kills pixels (but if the scalar operation isn't\n  // nop, it outputs the entire constant mask in the scalar operation\n  // destination). Normally the XNA disassembler outputs the constant mask in\n  // both vector and scalar operations, but that's not required by assembler, so\n  // it doesn't really matter whether it's specified in the vector operation, in\n  // the scalar operation, or in both.\n  InstructionResult vector_and_constant_result;\n  // Describes how the scalar operation result is stored.\n  InstructionResult scalar_result;\n  // Both operations must be executed before any result is stored if vector and\n  // scalar operations are paired. There are cases of vector result being used\n  // as scalar operand or vice versa (the ring on Avalanche in 4D5307E6, for\n  // example), in this case there must be no dependency between the two\n  // operations.\n\n  // Number of source operands of the vector operation.\n  uint32_t vector_operand_count = 0;\n  // Describes each source operand of the vector operation.\n  InstructionOperand vector_operands[3];\n  // Number of source operands of the scalar operation.\n  uint32_t scalar_operand_count = 0;\n  // Describes each source operand of the scalar operation.\n  InstructionOperand scalar_operands[2];\n\n  // Whether the vector part of the instruction is the same as if it was omitted\n  // in the assembly (if compiled or assembled with the Xbox 360 shader\n  // compiler), and thus reassembling the shader with this instruction omitted\n  // will result in the same microcode (since instructions with just an empty\n  // write mask may have different values in other fields).\n  // This is for disassembly! Translators should use the write masks and\n  // the changed state bits in the opcode info to skip operations, as this only\n  // covers one very specific nop format!\n  bool IsVectorOpDefaultNop() const;\n  // Whether the scalar part of the instruction is the same as if it was omitted\n  // in the assembly (if compiled or assembled with the Xbox 360 shader\n  // compiler), and thus reassembling the shader with this instruction omitted\n  // will result in the same microcode (since instructions with just an empty\n  // write mask may have different values in other fields).\n  bool IsScalarOpDefaultNop() const;\n\n  // For translation (not disassembly) - whether this instruction has totally no\n  // effect.\n  bool IsNop() const;\n\n  // If this is a \"normal\" eA write recognized by Xenia (MAD with a stream\n  // constant), returns the index of the stream float constant, otherwise\n  // returns UINT32_MAX.\n  uint32_t GetMemExportStreamConstant() const;\n\n  // Disassembles the instruction into ucode assembly text.\n  void Disassemble(StringBuffer* out) const;\n};\n\nvoid ParseControlFlowExec(const ucode::ControlFlowExecInstruction& cf,\n                          uint32_t cf_index, ParsedExecInstruction& instr);\nvoid ParseControlFlowCondExec(const ucode::ControlFlowCondExecInstruction& cf,\n                              uint32_t cf_index, ParsedExecInstruction& instr);\nvoid ParseControlFlowCondExecPred(\n    const ucode::ControlFlowCondExecPredInstruction& cf, uint32_t cf_index,\n    ParsedExecInstruction& instr);\nvoid ParseControlFlowLoopStart(const ucode::ControlFlowLoopStartInstruction& cf,\n                               uint32_t cf_index,\n                               ParsedLoopStartInstruction& instr);\nvoid ParseControlFlowLoopEnd(const ucode::ControlFlowLoopEndInstruction& cf,\n                             uint32_t cf_index,\n                             ParsedLoopEndInstruction& instr);\nvoid ParseControlFlowCondCall(const ucode::ControlFlowCondCallInstruction& cf,\n                              uint32_t cf_index, ParsedCallInstruction& instr);\nvoid ParseControlFlowReturn(const ucode::ControlFlowReturnInstruction& cf,\n                            uint32_t cf_index, ParsedReturnInstruction& instr);\nvoid ParseControlFlowCondJmp(const ucode::ControlFlowCondJmpInstruction& cf,\n                             uint32_t cf_index, ParsedJumpInstruction& instr);\nvoid ParseControlFlowAlloc(const ucode::ControlFlowAllocInstruction& cf,\n                           uint32_t cf_index, bool is_vertex_shader,\n                           ParsedAllocInstruction& instr);\n\n// Returns whether the fetch is a full one, and the next parsed mini vertex\n// fetch should inherit most of its parameters.\nbool ParseVertexFetchInstruction(\n    const ucode::VertexFetchInstruction& op,\n    const ucode::VertexFetchInstruction& previous_full_op,\n    ParsedVertexFetchInstruction& instr);\nvoid ParseTextureFetchInstruction(const ucode::TextureFetchInstruction& op,\n                                  ParsedTextureFetchInstruction& instr);\nvoid ParseAluInstruction(const ucode::AluInstruction& op,\n                         xenos::ShaderType shader_type,\n                         ParsedAluInstruction& instr);\n\nclass Shader {\n public:\n  // Type of the vertex shader on the host - shader interface depends on in, so\n  // it must be known at translation time. If values are changed, INVALIDATE\n  // SHADER STORAGES (increase their version constexpr) where those are stored!\n  // And check bit count where this is packed. This is : uint32_t for simplicity\n  // of packing in bit fields.\n  enum class HostVertexShaderType : uint32_t {\n    kVertex,\n\n    kDomainStart,\n    kLineDomainCPIndexed = kDomainStart,\n    kLineDomainPatchIndexed,\n    kTriangleDomainCPIndexed,\n    kTriangleDomainPatchIndexed,\n    kQuadDomainCPIndexed,\n    kQuadDomainPatchIndexed,\n    kDomainEnd,\n\n    // For implementation without unconditional support for memory writes from\n    // vertex shaders, vertex shader converted to a compute shader doing only\n    // memory export.\n    kMemExportCompute,\n\n    // 4 host vertices for 1 guest vertex, for implementations without\n    // unconditional geometry shader support.\n    kPointListAsTriangleStrip,\n    // 3 guest vertices processed by the host shader invocation to choose the\n    // strip orientation, for implementations without unconditional geometry\n    // shader support.\n    kRectangleListAsTriangleStrip,\n  };\n  // For packing HostVertexShaderType in bit fields.\n  static constexpr uint32_t kHostVertexShaderTypeBitCount = 4;\n\n  static constexpr bool IsHostVertexShaderTypeDomain(\n      HostVertexShaderType host_vertex_shader_type) {\n    return host_vertex_shader_type >= HostVertexShaderType::kDomainStart &&\n           host_vertex_shader_type < HostVertexShaderType::kDomainEnd;\n  }\n\n  struct Error {\n    bool is_fatal = false;\n    std::string message;\n  };\n\n  struct VertexBinding {\n    struct Attribute {\n      // Fetch instruction with all parameters.\n      ParsedVertexFetchInstruction fetch_instr;\n    };\n\n    // Index within the vertex binding listing.\n    int binding_index;\n    // Fetch constant index [0-95].\n    uint32_t fetch_constant;\n    // Stride of the entire binding, in words.\n    uint32_t stride_words;\n    // Packed attributes within the binding buffer.\n    std::vector<Attribute> attributes;\n  };\n\n  struct TextureBinding {\n    // Index within the texture binding listing.\n    size_t binding_index;\n    // Fetch constant index [0-31].\n    uint32_t fetch_constant;\n    // Fetch instruction with all parameters.\n    ParsedTextureFetchInstruction fetch_instr;\n  };\n\n  struct ConstantRegisterMap {\n    // Bitmap of all kConstantFloat registers read by the shader.\n    // Any shader can only read up to 256 of the 512, and the base is dependent\n    // on the shader type and SQ_VS/PS_CONST registers. Each bit corresponds to\n    // a storage index from the type base.\n    uint64_t float_bitmap[256 / 64];\n    // Bitmap of all loop constants read by the shader.\n    // Each bit corresponds to a storage index [0-31].\n    uint32_t loop_bitmap;\n    // Bitmap of all bool constants read by the shader.\n    // Each bit corresponds to a storage index [0-255].\n    uint32_t bool_bitmap[256 / 32];\n    // Bitmap of all vertex fetch constants read by the shader.\n    // Each bit corresponds to a storage index [0-95].\n    uint32_t vertex_fetch_bitmap[96 / 32];\n\n    // Total number of kConstantFloat registers read by the shader.\n    uint32_t float_count;\n\n    // Whether kConstantFloat registers are indexed dynamically - in this case,\n    // float_bitmap must be set to all 1, and tight packing must not be done.\n    bool float_dynamic_addressing;\n\n    // Returns the index of the float4 constant as if all float4 constant\n    // registers actually referenced were tightly packed in a buffer, or\n    // UINT32_MAX if not found.\n    uint32_t GetPackedFloatConstantIndex(uint32_t float_constant) const {\n      if (float_constant >= 256) {\n        return UINT32_MAX;\n      }\n      if (float_dynamic_addressing) {\n        // Any can potentially be read - not packing.\n        return float_constant;\n      }\n      uint32_t block_index = float_constant / 64;\n      uint32_t bit_index = float_constant % 64;\n      if (!(float_bitmap[block_index] & (uint64_t(1) << bit_index))) {\n        return UINT32_MAX;\n      }\n      uint32_t offset = 0;\n      for (uint32_t i = 0; i < block_index; ++i) {\n        offset += xe::bit_count(float_bitmap[i]);\n      }\n      return offset + xe::bit_count(float_bitmap[block_index] &\n                                    ((uint64_t(1) << bit_index) - 1));\n    }\n  };\n\n  struct ControlFlowMemExportInfo {\n    // Which eM elements have potentially (regardless of conditionals, loop\n    // iteration counts, predication) been written earlier in the predecessor\n    // graph of the instruction since an `alloc export`.\n    uint8_t eM_potentially_written_before = 0;\n    // For exec sequences, which eM elements are potentially (regardless of\n    // predication) written by the instructions in the sequence. For other\n    // control flow instructions, it's 0.\n    uint8_t eM_potentially_written_by_exec = 0;\n  };\n\n  class Translation {\n   public:\n    virtual ~Translation() {}\n\n    Shader& shader() const { return shader_; }\n\n    // Translator-specific modification bits.\n    uint64_t modification() const { return modification_; }\n\n    // True if the shader was translated and prepared without error.\n    bool is_valid() const { return is_valid_; }\n\n    // True if the shader has already been translated.\n    bool is_translated() const { return is_translated_; }\n\n    // Errors that occurred during translation.\n    const std::vector<Error>& errors() const { return errors_; }\n\n    // Translated shader binary (or text).\n    const std::vector<uint8_t>& translated_binary() const {\n      return translated_binary_;\n    }\n\n    // Gets the translated shader binary as a string.\n    // This is only valid if it is actually text.\n    std::string GetTranslatedBinaryString() const;\n\n    // Disassembly of the translated from the host graphics layer.\n    // May be empty if the host does not support disassembly.\n    const std::string& host_disassembly() const { return host_disassembly_; }\n\n    // In case disassembly depends on the GPU backend, for setting it\n    // externally.\n    void set_host_disassembly(std::string disassembly) {\n      host_disassembly_ = std::move(disassembly);\n    }\n\n    // For dumping after translation. Dumps the shader's translated code, and,\n    // if available, translated disassembly, to files in the given directory\n    // based on ucode hash. Returns {binary path, disassembly path if written}.\n    std::pair<std::filesystem::path, std::filesystem::path> Dump(\n        const std::filesystem::path& base_path, const char* path_prefix) const;\n\n   protected:\n    Translation(Shader& shader, uint64_t modification)\n        : shader_(shader), modification_(modification) {}\n\n    // If there was some failure during preparation on the implementation side.\n    void MakeInvalid() { is_valid_ = false; }\n\n   private:\n    friend class Shader;\n    friend class ShaderTranslator;\n\n    Shader& shader_;\n    uint64_t modification_;\n\n    bool is_valid_ = false;\n    bool is_translated_ = false;\n    std::vector<Error> errors_;\n    std::vector<uint8_t> translated_binary_;\n    std::string host_disassembly_;\n  };\n\n  // ucode_source_endian specifies the endianness of the ucode_dwords argument -\n  // inside the Shader, the ucode will be stored with the native byte order.\n  Shader(xenos::ShaderType shader_type, uint64_t ucode_data_hash,\n         const uint32_t* ucode_dwords, size_t ucode_dword_count,\n         std::endian ucode_source_endian = std::endian::big);\n  virtual ~Shader();\n\n  // Whether the shader is identified as a vertex or pixel shader.\n  xenos::ShaderType type() const { return shader_type_; }\n\n  // Microcode dwords in host endianness.\n  const std::vector<uint32_t>& ucode_data() const { return ucode_data_; }\n  uint64_t ucode_data_hash() const { return ucode_data_hash_; }\n  const uint32_t* ucode_dwords() const { return ucode_data_.data(); }\n  size_t ucode_dword_count() const { return ucode_data_.size(); }\n\n  bool is_ucode_analyzed() const { return is_ucode_analyzed_; }\n  // ucode_disasm_buffer is temporary storage for disassembly (provided\n  // externally so it won't need to be reallocated for every shader).\n  void AnalyzeUcode(StringBuffer& ucode_disasm_buffer);\n\n  // The following parameters, until the translation, are valid if ucode\n  // information has been gathered.\n\n  // Microcode disassembly in D3D format.\n  const std::string& ucode_disassembly() const { return ucode_disassembly_; }\n\n  // All vertex bindings used in the shader.\n  const std::vector<VertexBinding>& vertex_bindings() const {\n    return vertex_bindings_;\n  }\n\n  // All texture bindings used in the shader.\n  const std::vector<TextureBinding>& texture_bindings() const {\n    return texture_bindings_;\n  }\n\n  // Bitmaps of all constant registers accessed by the shader.\n  const ConstantRegisterMap& constant_register_map() const {\n    return constant_register_map_;\n  }\n\n  // Information about memory export state at each control flow instruction. May\n  // be empty if there are no eM# writes.\n  const std::vector<ControlFlowMemExportInfo>& cf_memexport_info() const {\n    return cf_memexport_info_;\n  }\n\n  uint8_t memexport_eM_written() const { return memexport_eM_written_; }\n  uint8_t memexport_eM_potentially_written_before_end() const {\n    return memexport_eM_potentially_written_before_end_;\n  }\n\n  // c# registers used as the addend in MAD operations to eA.\n  const std::set<uint32_t>& memexport_stream_constants() const {\n    return memexport_stream_constants_;\n  }\n\n  // Labels that jumps (explicit or from loops) can be done to.\n  const std::set<uint32_t>& label_addresses() const { return label_addresses_; }\n\n  // Exclusive upper bound of the indexes of paired control flow instructions\n  // (each corresponds to 3 dwords).\n  uint32_t cf_pair_index_bound() const { return cf_pair_index_bound_; }\n\n  // Upper bound of temporary registers addressed statically by the shader -\n  // highest static register address + 1, or 0 if no registers referenced this\n  // way. SQ_PROGRAM_CNTL is not always reliable - some draws (like single point\n  // draws with oPos = 0001 that are done by Xbox 360's Direct3D 9 sometimes;\n  // can be reproduced by launching the intro mission in 4D5307E6 from the\n  // campaign lobby) that aren't supposed to cover any pixels use an invalid\n  // (zero) SQ_PROGRAM_CNTL, but with an outdated pixel shader loaded, in this\n  // case SQ_PROGRAM_CNTL may contain a number smaller than actually needed by\n  // the pixel shader - SQ_PROGRAM_CNTL should be used to go above this count if\n  // uses_register_dynamic_addressing is true.\n  uint32_t register_static_address_bound() const {\n    return register_static_address_bound_;\n  }\n\n  // Whether the shader addresses temporary registers dynamically, thus\n  // SQ_PROGRAM_CNTL should determine the number of registers to use, not only\n  // register_static_address_bound.\n  bool uses_register_dynamic_addressing() const {\n    return uses_register_dynamic_addressing_;\n  }\n\n  // For building shader modification bits (and also for normalization of them),\n  // returns the amount of temporary registers that need to be allocated\n  // explicitly - if not using register dynamic addressing, the shader\n  // translator will use register_static_address_bound directly.\n  uint32_t GetDynamicAddressableRegisterCount(\n      uint32_t program_cntl_num_reg) const {\n    if (!uses_register_dynamic_addressing()) {\n      return 0;\n    }\n    return std::max(program_cntl_num_reg + uint32_t(1),\n                    register_static_address_bound());\n  }\n\n  // True if the current shader has any `kill` instructions.\n  bool kills_pixels() const { return kills_pixels_; }\n\n  // True if the shader has any texture-related instructions (any fetch\n  // instructions other than vertex fetch) writing any non-constant components.\n  bool uses_texture_fetch_instruction_results() const {\n    return uses_texture_fetch_instruction_results_;\n  }\n\n  // Whether each interpolator is written on any execution path.\n  uint32_t writes_interpolators() const { return writes_interpolators_; }\n\n  // Whether the system vertex shader exports are written on any execution path.\n  uint32_t writes_point_size_edge_flag_kill_vertex() const {\n    return writes_point_size_edge_flag_kill_vertex_;\n  }\n\n  // Returns the mask of the interpolators the pixel shader potentially requires\n  // from the vertex shader, and also the PsParamGen destination register, or\n  // UINT32_MAX if it's not needed.\n  uint32_t GetInterpolatorInputMask(reg::SQ_PROGRAM_CNTL sq_program_cntl,\n                                    reg::SQ_CONTEXT_MISC sq_context_misc,\n                                    uint32_t& param_gen_pos_out) const;\n\n  // True if the shader overrides the pixel depth.\n  bool writes_depth() const { return writes_depth_; }\n\n  // Whether the shader can have early depth and stencil writing enabled, unless\n  // alpha test or alpha to coverage is enabled.\n  bool implicit_early_z_write_allowed() const {\n    // TODO(Triang3l): Investigate what happens to memexport when the pixel\n    // fails the depth/stencil test, but in Direct3D 11 UAV writes disable early\n    // depth/stencil.\n    return !kills_pixels() && !writes_depth() && !memexport_eM_written();\n  }\n\n  // Whether each color render target is written to on any execution path.\n  uint32_t writes_color_targets() const { return writes_color_targets_; }\n  bool writes_color_target(uint32_t i) const {\n    return (writes_color_targets() & (uint32_t(1) << i)) != 0;\n  }\n\n  // Host translations with the specified modification bits. Not thread-safe\n  // with respect to translation creation/destruction.\n  const std::unordered_map<uint64_t, Translation*>& translations() const {\n    return translations_;\n  }\n  Translation* GetTranslation(uint64_t modification) const {\n    auto it = translations_.find(modification);\n    if (it != translations_.cend()) {\n      return it->second;\n    }\n    return nullptr;\n  }\n  Translation* GetOrCreateTranslation(uint64_t modification,\n                                      bool* is_new = nullptr);\n  // For shader storage loading, to remove a modification in case of translation\n  // failure. Not thread-safe.\n  void DestroyTranslation(uint64_t modification);\n\n  // An externally managed identifier of the shader storage the microcode of the\n  // shader was last written to, or was loaded from, to only write the shader\n  // microcode to the storage once. UINT32_MAX by default.\n  uint32_t ucode_storage_index() const { return ucode_storage_index_; }\n  void set_ucode_storage_index(uint32_t storage_index) {\n    ucode_storage_index_ = storage_index;\n  }\n\n  // Dumps the shader's microcode binary and, if analyzed, disassembly, to files\n  // in the given directory based on ucode hash. Returns the name of the written\n  // file. Can be called at any time, doesn't require the shader to be\n  // translated. Returns {binary path, disassembly path if written}.\n  std::pair<std::filesystem::path, std::filesystem::path> DumpUcode(\n      const std::filesystem::path& base_path) const;\n\n protected:\n  friend class ShaderTranslator;\n\n  virtual Translation* CreateTranslationInstance(uint64_t modification);\n\n  xenos::ShaderType shader_type_;\n  std::vector<uint32_t> ucode_data_;\n  uint64_t ucode_data_hash_;\n\n  // Whether info needed before translating has been gathered already - may be\n  // needed to determine which modifications are actually needed and make sense\n  // (for instance, there may be draws not covering anything and not allocating\n  // any pixel shader registers in SQ_PROGRAM_CNTL, but still using the pixel\n  // shader from the previous draw - in this case, every shader that happens to\n  // be before such draw will need to be translated again with a different\n  // dynamically addressed register count, which may cause compilation of\n  // different random pipelines across many random frames, thus causing\n  // stuttering - normally host pipeline states are deterministically only\n  // compiled when a new material appears in the game, and having the order of\n  // draws also matter in such unpredictable way would break this rule; limit\n  // the effect to shaders with dynamic register addressing only, which are\n  // extremely rare; however care should be taken regarding depth format-related\n  // translation modifications in this case), also some info needed for drawing\n  // is collected during the ucode analysis.\n  bool is_ucode_analyzed_ = false;\n\n  std::string ucode_disassembly_;\n  std::vector<VertexBinding> vertex_bindings_;\n  std::vector<TextureBinding> texture_bindings_;\n  ConstantRegisterMap constant_register_map_ = {0};\n  std::set<uint32_t> label_addresses_;\n  uint32_t cf_pair_index_bound_ = 0;\n  uint32_t register_static_address_bound_ = 0;\n  uint32_t writes_interpolators_ = 0;\n  uint32_t writes_point_size_edge_flag_kill_vertex_ = 0;\n  uint32_t writes_color_targets_ = 0b0000;\n  bool uses_register_dynamic_addressing_ = false;\n  bool kills_pixels_ = false;\n  bool uses_texture_fetch_instruction_results_ = false;\n  bool writes_depth_ = false;\n\n  // Memory export eM write info for each control flow instruction, if there are\n  // any eM writes in the shader.\n  std::vector<ControlFlowMemExportInfo> cf_memexport_info_;\n  // Which memexport elements (eM#) are written for any memexport in the shader.\n  uint8_t memexport_eM_written_ = 0;\n  // ControlFlowMemExportInfo::eM_potentially_written_before equivalent for the\n  // end of the shader, for the last memory export (or exports if the end has\n  // multiple predecessor chains exporting to memory).\n  uint8_t memexport_eM_potentially_written_before_end_ = 0;\n  std::set<uint32_t> memexport_stream_constants_;\n\n  // Modification bits -> translation.\n  std::unordered_map<uint64_t, Translation*> translations_;\n\n  uint32_t ucode_storage_index_ = UINT32_MAX;\n\n private:\n  void GatherExecInformation(\n      const ParsedExecInstruction& instr,\n      ucode::VertexFetchInstruction& previous_vfetch_full,\n      uint32_t& unique_texture_bindings, StringBuffer& ucode_disasm_buffer);\n  void GatherVertexFetchInformation(\n      const ucode::VertexFetchInstruction& op,\n      ucode::VertexFetchInstruction& previous_vfetch_full,\n      StringBuffer& ucode_disasm_buffer);\n  void GatherTextureFetchInformation(const ucode::TextureFetchInstruction& op,\n                                     uint32_t& unique_texture_bindings,\n                                     StringBuffer& ucode_disasm_buffer);\n  void GatherAluInstructionInformation(const ucode::AluInstruction& op,\n                                       uint32_t exec_cf_index,\n                                       StringBuffer& ucode_disasm_buffer);\n  void GatherOperandInformation(const InstructionOperand& operand);\n  void GatherFetchResultInformation(const InstructionResult& result);\n  void GatherAluResultInformation(const InstructionResult& result,\n                                  uint32_t exec_cf_index);\n};\n\n}  // namespace gpu\n}  // namespace xe\n\n#endif  // XENIA_GPU_SHADER_H_\n"
  },
  {
    "path": "src/xenia/gpu/shader_compiler_main.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include <cinttypes>\n#include <cstring>\n#include <sstream>\n#include <string>\n#include <utility>\n#include <vector>\n\n#include \"third_party/glslang/SPIRV/disassemble.h\"\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/console_app_main.h\"\n#include \"xenia/base/cvar.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/platform.h\"\n#include \"xenia/base/string.h\"\n#include \"xenia/base/string_buffer.h\"\n#include \"xenia/gpu/dxbc_shader_translator.h\"\n#include \"xenia/gpu/shader_translator.h\"\n#include \"xenia/gpu/spirv_shader_translator.h\"\n#include \"xenia/gpu/xenos.h\"\n#include \"xenia/ui/vulkan/spirv_tools_context.h\"\n\n// For D3DDisassemble:\n#if XE_PLATFORM_WIN32\n#include \"xenia/ui/d3d12/d3d12_api.h\"\n#endif  // XE_PLATFORM_WIN32\n\nDEFINE_path(shader_input, \"\", \"Input shader binary file path.\", \"GPU\");\nDEFINE_string(shader_input_type, \"\",\n              \"'vs', 'ps', or unspecified to infer from the given filename.\",\n              \"GPU\");\nDEFINE_bool(\n    shader_input_little_endian, false,\n    \"Whether the input shader binary is little-endian (from an Arm device with \"\n    \"the Qualcomm Adreno 200, for instance).\",\n    \"GPU\");\nDEFINE_path(shader_output, \"\", \"Output shader file path.\", \"GPU\");\nDEFINE_string(shader_output_type, \"ucode\",\n              \"Translator to use: [ucode, spirv, spirvtext, dxbc, dxbctext].\",\n              \"GPU\");\nDEFINE_string(\n    vertex_shader_output_type, \"\",\n    \"Type of the host interface to produce the vertex or domain shader for: \"\n    \"[vertex or unspecified, linedomaincp, linedomainpatch, triangledomaincp, \"\n    \"triangledomainpatch, quaddomaincp, quaddomainpatch].\",\n    \"GPU\");\nDEFINE_bool(shader_output_bindless_resources, false,\n            \"Output host shader with bindless resources used.\", \"GPU\");\nDEFINE_bool(\n    shader_output_pixel_shader_interlock, false,\n    \"Output host shader with a render backend implementation based on pixel \"\n    \"shader interlock.\",\n    \"GPU\");\n\nnamespace xe {\nnamespace gpu {\n\nint shader_compiler_main(const std::vector<std::string>& args) {\n  xenos::ShaderType shader_type;\n  if (!cvars::shader_input_type.empty()) {\n    if (cvars::shader_input_type == \"vs\") {\n      shader_type = xenos::ShaderType::kVertex;\n    } else if (cvars::shader_input_type == \"ps\") {\n      shader_type = xenos::ShaderType::kPixel;\n    } else {\n      XELOGE(\"Invalid --shader_input_type; must be 'vs' or 'ps'.\");\n      return 1;\n    }\n  } else {\n    bool valid_type = false;\n    if (cvars::shader_input.has_extension()) {\n      auto extension = cvars::shader_input.extension();\n      if (extension == \".vs\") {\n        shader_type = xenos::ShaderType::kVertex;\n        valid_type = true;\n      } else if (extension == \".ps\") {\n        shader_type = xenos::ShaderType::kPixel;\n        valid_type = true;\n      }\n    }\n    if (!valid_type) {\n      XELOGE(\n          \"File type not recognized (use .vs, .ps or \"\n          \"--shader_input_type=vs|ps).\");\n      return 1;\n    }\n  }\n\n  auto input_file = filesystem::OpenFile(cvars::shader_input, \"rb\");\n  if (!input_file) {\n    XELOGE(\"Unable to open input file: {}\",\n           xe::path_to_utf8(cvars::shader_input));\n    return 1;\n  }\n  fseek(input_file, 0, SEEK_END);\n  size_t input_file_size = ftell(input_file);\n  fseek(input_file, 0, SEEK_SET);\n  std::vector<uint32_t> ucode_dwords(input_file_size / 4);\n  fread(ucode_dwords.data(), 4, ucode_dwords.size(), input_file);\n  fclose(input_file);\n\n  XELOGI(\"Opened {} as a {} shader, {} words ({} bytes).\",\n         xe::path_to_utf8(cvars::shader_input),\n         shader_type == xenos::ShaderType::kVertex ? \"vertex\" : \"pixel\",\n         ucode_dwords.size(), ucode_dwords.size() * 4);\n\n  // TODO(benvanik): hash? need to return the data to big-endian format first.\n  uint64_t ucode_data_hash = 0;\n  auto shader = std::make_unique<Shader>(\n      shader_type, ucode_data_hash, ucode_dwords.data(), ucode_dwords.size(),\n      cvars::shader_input_little_endian ? std::endian::little\n                                        : std::endian::big);\n\n  StringBuffer ucode_disasm_buffer;\n  shader->AnalyzeUcode(ucode_disasm_buffer);\n\n  std::unique_ptr<ShaderTranslator> translator;\n  SpirvShaderTranslator::Features spirv_features(true);\n  if (cvars::shader_output_type == \"spirv\" ||\n      cvars::shader_output_type == \"spirvtext\") {\n    translator = std::make_unique<SpirvShaderTranslator>(\n        spirv_features, true, true,\n        cvars::shader_output_pixel_shader_interlock);\n  } else if (cvars::shader_output_type == \"dxbc\" ||\n             cvars::shader_output_type == \"dxbctext\") {\n    translator = std::make_unique<DxbcShaderTranslator>(\n        ui::GraphicsProvider::GpuVendorID(0),\n        cvars::shader_output_bindless_resources,\n        cvars::shader_output_pixel_shader_interlock);\n  } else {\n    // Just output microcode disassembly generated during microcode information\n    // gathering.\n    if (!cvars::shader_output.empty()) {\n      auto output_file = filesystem::OpenFile(cvars::shader_output, \"wb\");\n      fwrite(shader->ucode_disassembly().c_str(), 1,\n             shader->ucode_disassembly().length(), output_file);\n      fclose(output_file);\n    }\n    return 0;\n  }\n\n  Shader::HostVertexShaderType host_vertex_shader_type =\n      Shader::HostVertexShaderType::kVertex;\n  if (shader_type == xenos::ShaderType::kVertex) {\n    if (cvars::vertex_shader_output_type == \"linedomaincp\") {\n      host_vertex_shader_type =\n          Shader::HostVertexShaderType::kLineDomainCPIndexed;\n    } else if (cvars::vertex_shader_output_type == \"linedomainpatch\") {\n      host_vertex_shader_type =\n          Shader::HostVertexShaderType::kLineDomainPatchIndexed;\n    } else if (cvars::vertex_shader_output_type == \"triangledomaincp\") {\n      host_vertex_shader_type =\n          Shader::HostVertexShaderType::kTriangleDomainCPIndexed;\n    } else if (cvars::vertex_shader_output_type == \"triangledomainpatch\") {\n      host_vertex_shader_type =\n          Shader::HostVertexShaderType::kTriangleDomainPatchIndexed;\n    } else if (cvars::vertex_shader_output_type == \"quaddomaincp\") {\n      host_vertex_shader_type =\n          Shader::HostVertexShaderType::kQuadDomainCPIndexed;\n    } else if (cvars::vertex_shader_output_type == \"quaddomainpatch\") {\n      host_vertex_shader_type =\n          Shader::HostVertexShaderType::kQuadDomainPatchIndexed;\n    }\n  }\n  uint64_t modification;\n  switch (shader_type) {\n    case xenos::ShaderType::kVertex:\n      modification = translator->GetDefaultVertexShaderModification(\n          xenos::kMaxShaderTempRegisters, host_vertex_shader_type);\n      break;\n    case xenos::ShaderType::kPixel:\n      modification = translator->GetDefaultPixelShaderModification(\n          xenos::kMaxShaderTempRegisters);\n      break;\n    default:\n      assert_unhandled_case(shader_type);\n      return 1;\n  }\n\n  Shader::Translation* translation =\n      shader->GetOrCreateTranslation(modification);\n  translator->TranslateAnalyzedShader(*translation);\n\n  const void* source_data = translation->translated_binary().data();\n  size_t source_data_size = translation->translated_binary().size();\n\n  std::string spirv_disasm;\n  if (cvars::shader_output_type == \"spirvtext\") {\n    std::ostringstream spirv_disasm_stream;\n    std::vector<unsigned int> spirv_source;\n    spirv_source.reserve(source_data_size / sizeof(unsigned int));\n    spirv_source.insert(spirv_source.cend(),\n                        reinterpret_cast<const unsigned int*>(source_data),\n                        reinterpret_cast<const unsigned int*>(source_data) +\n                            source_data_size / sizeof(unsigned int));\n    spv::Disassemble(spirv_disasm_stream, spirv_source);\n    spirv_disasm = std::move(spirv_disasm_stream.str());\n    ui::vulkan::SpirvToolsContext spirv_tools_context;\n    if (spirv_tools_context.Initialize(spirv_features.spirv_version)) {\n      std::string spirv_validation_error;\n      spirv_tools_context.Validate(\n          reinterpret_cast<const uint32_t*>(spirv_source.data()),\n          spirv_source.size(), &spirv_validation_error);\n      if (!spirv_validation_error.empty()) {\n        spirv_disasm.append(1, '\\n');\n        spirv_disasm.append(spirv_validation_error);\n      }\n    }\n    source_data = spirv_disasm.c_str();\n    source_data_size = spirv_disasm.size();\n  }\n#if XE_PLATFORM_WIN32\n  ID3DBlob* dxbc_disasm_blob = nullptr;\n  if (cvars::shader_output_type == \"dxbctext\") {\n    HMODULE d3d_compiler = LoadLibraryW(L\"D3DCompiler_47.dll\");\n    if (d3d_compiler != nullptr) {\n      pD3DDisassemble d3d_disassemble =\n          pD3DDisassemble(GetProcAddress(d3d_compiler, \"D3DDisassemble\"));\n      if (d3d_disassemble != nullptr) {\n        // Disassemble DXBC.\n        if (SUCCEEDED(d3d_disassemble(source_data, source_data_size,\n                                      D3D_DISASM_ENABLE_INSTRUCTION_NUMBERING |\n                                          D3D_DISASM_ENABLE_INSTRUCTION_OFFSET,\n                                      nullptr, &dxbc_disasm_blob))) {\n          source_data = dxbc_disasm_blob->GetBufferPointer();\n          source_data_size = dxbc_disasm_blob->GetBufferSize();\n          // Stop at the null terminator.\n          for (size_t i = 0; i < source_data_size; ++i) {\n            if (reinterpret_cast<const char*>(source_data)[i] == '\\0') {\n              source_data_size = i;\n              break;\n            }\n          }\n        }\n      }\n      FreeLibrary(d3d_compiler);\n    }\n  }\n#endif  // XE_PLATFORM_WIN32\n\n  if (!cvars::shader_output.empty()) {\n    auto output_file = filesystem::OpenFile(cvars::shader_output, \"wb\");\n    fwrite(source_data, 1, source_data_size, output_file);\n    fclose(output_file);\n  }\n\n#if XE_PLATFORM_WIN32\n  if (dxbc_disasm_blob != nullptr) {\n    dxbc_disasm_blob->Release();\n  }\n#endif  // XE_PLATFORM_WIN32\n\n  return 0;\n}\n\n}  // namespace gpu\n}  // namespace xe\n\nXE_DEFINE_CONSOLE_APP(\"xenia-gpu-shader-compiler\",\n                      xe::gpu::shader_compiler_main, \"shader.bin\",\n                      \"shader_input\");\n"
  },
  {
    "path": "src/xenia/gpu/shader_interpreter.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/shader_interpreter.h\"\n\n#include <cfloat>\n#include <cmath>\n#include <cstring>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/byte_order.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/gpu/registers.h\"\n#include \"xenia/gpu/trace_writer.h\"\n#include \"xenia/gpu/xenos.h\"\n\nnamespace xe {\nnamespace gpu {\n\nvoid ShaderInterpreter::Execute() {\n  // For more consistency between invocations in case of a malformed shader.\n  state_.Reset();\n\n  const uint32_t* bool_constants =\n      &register_file_[XE_GPU_REG_SHADER_CONSTANT_BOOL_000_031];\n\n  bool exec_ended = false;\n  uint32_t cf_index_next = 1;\n  for (uint32_t cf_index = 0; !exec_ended; cf_index = cf_index_next) {\n    cf_index_next = cf_index + 1;\n\n    const uint32_t* cf_pair = &ucode_[3 * (cf_index >> 1)];\n    ucode::ControlFlowInstruction cf_instr;\n    if (cf_index & 1) {\n      cf_instr.dword_0 = (cf_pair[1] >> 16) | (cf_pair[2] << 16);\n      cf_instr.dword_1 = cf_pair[2] >> 16;\n    } else {\n      cf_instr.dword_0 = cf_pair[0];\n      cf_instr.dword_1 = cf_pair[1] & 0xFFFF;\n    }\n\n    ucode::ControlFlowOpcode cf_opcode = cf_instr.opcode();\n    switch (cf_opcode) {\n      case ucode::ControlFlowOpcode::kNop: {\n      } break;\n\n      case ucode::ControlFlowOpcode::kExec:\n      case ucode::ControlFlowOpcode::kExecEnd:\n      case ucode::ControlFlowOpcode::kCondExec:\n      case ucode::ControlFlowOpcode::kCondExecEnd:\n      case ucode::ControlFlowOpcode::kCondExecPred:\n      case ucode::ControlFlowOpcode::kCondExecPredEnd:\n      case ucode::ControlFlowOpcode::kCondExecPredClean:\n      case ucode::ControlFlowOpcode::kCondExecPredCleanEnd: {\n        ucode::ControlFlowExecInstruction cf_exec =\n            *reinterpret_cast<const ucode::ControlFlowExecInstruction*>(\n                &cf_instr);\n\n        switch (cf_opcode) {\n          case ucode::ControlFlowOpcode::kCondExec:\n          case ucode::ControlFlowOpcode::kCondExecEnd:\n          case ucode::ControlFlowOpcode::kCondExecPredClean:\n          case ucode::ControlFlowOpcode::kCondExecPredCleanEnd: {\n            const ucode::ControlFlowCondExecInstruction cf_cond_exec =\n                *reinterpret_cast<const ucode::ControlFlowCondExecInstruction*>(\n                    &cf_exec);\n            uint32_t bool_address = cf_cond_exec.bool_address();\n            if (cf_cond_exec.condition() !=\n                ((bool_constants[bool_address >> 5] &\n                  (UINT32_C(1) << (bool_address & 31))) != 0)) {\n              continue;\n            }\n          } break;\n          case ucode::ControlFlowOpcode::kCondExecPred:\n          case ucode::ControlFlowOpcode::kCondExecPredEnd: {\n            const ucode::ControlFlowCondExecPredInstruction cf_cond_exec_pred =\n                *reinterpret_cast<\n                    const ucode::ControlFlowCondExecPredInstruction*>(&cf_exec);\n            if (cf_cond_exec_pred.condition() != state_.predicate) {\n              continue;\n            }\n          } break;\n          default:\n            break;\n        }\n\n        for (uint32_t exec_index = 0; exec_index < cf_exec.count();\n             ++exec_index) {\n          const uint32_t* exec_instruction =\n              &ucode_[3 * (cf_exec.address() + exec_index)];\n          if ((cf_exec.sequence() >> (exec_index << 1)) & 0b01) {\n            const ucode::FetchInstruction& fetch_instr =\n                *reinterpret_cast<const ucode::FetchInstruction*>(\n                    exec_instruction);\n            if (fetch_instr.is_predicated() &&\n                fetch_instr.predicate_condition() != state_.predicate) {\n              continue;\n            }\n            if (fetch_instr.opcode() == ucode::FetchOpcode::kVertexFetch) {\n              ExecuteVertexFetchInstruction(fetch_instr.vertex_fetch());\n            } else {\n              // Not supporting texture fetching (very complex).\n              float zero_result[4] = {};\n              StoreFetchResult(fetch_instr.dest(),\n                               fetch_instr.is_dest_relative(),\n                               fetch_instr.dest_swizzle(), zero_result);\n            }\n          } else {\n            const ucode::AluInstruction& alu_instr =\n                *reinterpret_cast<const ucode::AluInstruction*>(\n                    exec_instruction);\n            if (alu_instr.is_predicated() &&\n                alu_instr.predicate_condition() != state_.predicate) {\n              continue;\n            }\n            ExecuteAluInstruction(alu_instr);\n          }\n        }\n\n        if (ucode::DoesControlFlowOpcodeEndShader(cf_opcode)) {\n          exec_ended = true;\n        }\n      } break;\n\n      case ucode::ControlFlowOpcode::kLoopStart: {\n        ucode::ControlFlowLoopStartInstruction cf_loop_start =\n            *reinterpret_cast<const ucode::ControlFlowLoopStartInstruction*>(\n                &cf_instr);\n        assert_true(state_.loop_stack_depth < 4);\n        if (++state_.loop_stack_depth > 4) {\n          cf_index_next = cf_loop_start.address();\n          continue;\n        }\n        auto loop_constant = register_file_.Get<xenos::LoopConstant>(\n            XE_GPU_REG_SHADER_CONSTANT_LOOP_00 + cf_loop_start.loop_id());\n        state_.loop_constants[state_.loop_stack_depth] = loop_constant;\n        uint32_t& loop_iterator_ref =\n            state_.loop_iterators[state_.loop_stack_depth];\n        if (!cf_loop_start.is_repeat()) {\n          loop_iterator_ref = 0;\n        }\n        if (loop_iterator_ref >= loop_constant.count) {\n          cf_index_next = cf_loop_start.address();\n          continue;\n        }\n        ++state_.loop_stack_depth;\n      } break;\n\n      case ucode::ControlFlowOpcode::kLoopEnd: {\n        assert_not_zero(state_.loop_stack_depth);\n        if (!state_.loop_stack_depth) {\n          continue;\n        }\n        assert_true(state_.loop_stack_depth <= 4);\n        if (state_.loop_stack_depth > 4) {\n          --state_.loop_stack_depth;\n          continue;\n        }\n        ucode::ControlFlowLoopEndInstruction cf_loop_end =\n            *reinterpret_cast<const ucode::ControlFlowLoopEndInstruction*>(\n                &cf_instr);\n        xenos::LoopConstant loop_constant =\n            state_.loop_constants[state_.loop_stack_depth - 1];\n        assert_zero(\n            std::memcmp(&loop_constant,\n                        &register_file_[XE_GPU_REG_SHADER_CONSTANT_LOOP_00 +\n                                        cf_loop_end.loop_id()],\n                        sizeof(loop_constant)));\n        uint32_t loop_iterator =\n            ++state_.loop_iterators[state_.loop_stack_depth - 1];\n        if (loop_iterator < loop_constant.count &&\n            (!cf_loop_end.is_predicated_break() ||\n             cf_loop_end.condition() != state_.predicate)) {\n          cf_index_next = cf_loop_end.address();\n          continue;\n        }\n        --state_.loop_stack_depth;\n      } break;\n\n      case ucode::ControlFlowOpcode::kCondCall: {\n        assert_true(state_.call_stack_depth < 4);\n        if (state_.call_stack_depth >= 4) {\n          continue;\n        }\n        const ucode::ControlFlowCondCallInstruction cf_cond_call =\n            *reinterpret_cast<const ucode::ControlFlowCondCallInstruction*>(\n                &cf_instr);\n        if (!cf_cond_call.is_unconditional()) {\n          if (cf_cond_call.is_predicated()) {\n            if (cf_cond_call.condition() != state_.predicate) {\n              continue;\n            }\n          } else {\n            uint32_t bool_address = cf_cond_call.bool_address();\n            if (cf_cond_call.condition() !=\n                ((bool_constants[bool_address >> 5] &\n                  (UINT32_C(1) << (bool_address & 31))) != 0)) {\n              continue;\n            }\n          }\n        }\n        state_.call_return_addresses[state_.call_stack_depth++] = cf_index + 1;\n        cf_index_next = cf_cond_call.address();\n      } break;\n\n      case ucode::ControlFlowOpcode::kReturn: {\n        // No stack depth assertion - skipping the return is a well-defined\n        // behavior for `return` outside a function call.\n        if (!state_.call_stack_depth) {\n          continue;\n        }\n        cf_index_next = state_.call_return_addresses[--state_.call_stack_depth];\n      } break;\n\n      case ucode::ControlFlowOpcode::kCondJmp: {\n        const ucode::ControlFlowCondJmpInstruction cf_cond_jmp =\n            *reinterpret_cast<const ucode::ControlFlowCondJmpInstruction*>(\n                &cf_instr);\n        if (!cf_cond_jmp.is_unconditional()) {\n          if (cf_cond_jmp.is_predicated()) {\n            if (cf_cond_jmp.condition() != state_.predicate) {\n              continue;\n            }\n          } else {\n            uint32_t bool_address = cf_cond_jmp.bool_address();\n            if (cf_cond_jmp.condition() !=\n                ((bool_constants[bool_address >> 5] &\n                  (UINT32_C(1) << (bool_address & 31))) != 0)) {\n              continue;\n            }\n          }\n        }\n        cf_index_next = cf_cond_jmp.address();\n      } break;\n\n      case ucode::ControlFlowOpcode::kAlloc: {\n        if (export_sink_) {\n          const ucode::ControlFlowAllocInstruction& cf_alloc =\n              *reinterpret_cast<const ucode::ControlFlowAllocInstruction*>(\n                  &cf_instr);\n          export_sink_->AllocExport(cf_alloc.alloc_type(), cf_alloc.size());\n        }\n      } break;\n\n      case ucode::ControlFlowOpcode::kMarkVsFetchDone: {\n      } break;\n\n      default:\n        assert_unhandled_case(cf_opcode);\n    }\n  }\n}\n\nconst std::array<float, 4> ShaderInterpreter::GetFloatConstant(\n    uint32_t address, bool is_relative, bool relative_address_is_a0) const {\n  int32_t index = int32_t(address);\n  if (is_relative) {\n    index += relative_address_is_a0 ? state_.address_register\n                                    : state_.GetLoopAddress();\n  }\n  if (index < 0) {\n    return std::array<float, 4>();\n  }\n  auto base_and_size_minus_1 = register_file_.Get<reg::SQ_VS_CONST>(\n      shader_type_ == xenos::ShaderType::kVertex ? XE_GPU_REG_SQ_VS_CONST\n                                                 : XE_GPU_REG_SQ_PS_CONST);\n  if (uint32_t(index) > base_and_size_minus_1.size) {\n    return std::array<float, 4>();\n  }\n  index += base_and_size_minus_1.base;\n  if (index >= 512) {\n    return std::array<float, 4>();\n  }\n  std::array<float, 4> value;\n  std::memcpy(value.data(),\n              &register_file_[XE_GPU_REG_SHADER_CONSTANT_000_X + 4 * index],\n              sizeof(float) * 4);\n  return value;\n}\n\nvoid ShaderInterpreter::ExecuteAluInstruction(ucode::AluInstruction instr) {\n  // Vector operation.\n  float vector_result[4] = {};\n  ucode::AluVectorOpcode vector_opcode = instr.vector_opcode();\n  const ucode::AluVectorOpcodeInfo& vector_opcode_info =\n      ucode::GetAluVectorOpcodeInfo(vector_opcode);\n  uint32_t vector_result_write_mask = instr.GetVectorOpResultWriteMask();\n  if (vector_result_write_mask || vector_opcode_info.changed_state) {\n    float vector_operands[3][4];\n    for (uint32_t i = 0; i < 3; ++i) {\n      if (!vector_opcode_info.operand_components_used[i]) {\n        continue;\n      }\n      const float* vector_src_ptr;\n      uint32_t vector_src_register = instr.src_reg(1 + i);\n      bool vector_src_absolute = false;\n      std::array<float, 4> vector_src_float_constant;\n      if (instr.src_is_temp(1 + i)) {\n        vector_src_ptr = GetTempRegister(\n            ucode::AluInstruction::src_temp_reg(vector_src_register),\n            ucode::AluInstruction::is_src_temp_relative(vector_src_register));\n        vector_src_absolute = ucode::AluInstruction::is_src_temp_value_absolute(\n            vector_src_register);\n      } else {\n        vector_src_float_constant = GetFloatConstant(\n            vector_src_register, instr.src_const_is_addressed(1 + i),\n            instr.is_const_address_register_relative());\n        vector_src_ptr = vector_src_float_constant.data();\n      }\n      uint32_t vector_src_absolute_mask =\n          ~(uint32_t(vector_src_absolute) << 31);\n      uint32_t vector_src_negate_bit = uint32_t(instr.src_negate(1 + i)) << 31;\n      uint32_t vector_src_swizzle = instr.src_swizzle(1 + i);\n      for (uint32_t j = 0; j < 4; ++j) {\n        float vector_src_component = FlushDenormal(\n            vector_src_ptr[ucode::AluInstruction::GetSwizzledComponentIndex(\n                vector_src_swizzle, j)]);\n        *reinterpret_cast<uint32_t*>(&vector_src_component) =\n            (*reinterpret_cast<const uint32_t*>(&vector_src_component) &\n             vector_src_absolute_mask) ^\n            vector_src_negate_bit;\n        vector_operands[i][j] = vector_src_component;\n      }\n    }\n\n    bool replicate_vector_result_x = false;\n    switch (vector_opcode) {\n      case ucode::AluVectorOpcode::kAdd: {\n        for (uint32_t i = 0; i < 4; ++i) {\n          vector_result[i] = vector_operands[0][i] + vector_operands[1][i];\n        }\n      } break;\n      case ucode::AluVectorOpcode::kMul: {\n        for (uint32_t i = 0; i < 4; ++i) {\n          // Direct3D 9 behavior (0 or denormal * anything = +0).\n          vector_result[i] = (vector_operands[0][i] && vector_operands[1][i])\n                                 ? vector_operands[0][i] * vector_operands[1][i]\n                                 : 0.0f;\n        }\n      } break;\n      case ucode::AluVectorOpcode::kMax: {\n        for (uint32_t i = 0; i < 4; ++i) {\n          vector_result[i] =\n              std::isgreaterequal(vector_operands[0][i], vector_operands[1][i])\n                  ? vector_operands[0][i]\n                  : vector_operands[1][i];\n        }\n      } break;\n      case ucode::AluVectorOpcode::kMin: {\n        for (uint32_t i = 0; i < 4; ++i) {\n          vector_result[i] =\n              std::isless(vector_operands[0][i], vector_operands[1][i])\n                  ? vector_operands[0][i]\n                  : vector_operands[1][i];\n        }\n      } break;\n      case ucode::AluVectorOpcode::kSeq: {\n        for (uint32_t i = 0; i < 4; ++i) {\n          vector_result[i] =\n              float(vector_operands[0][i] == vector_operands[1][i]);\n        }\n      } break;\n      case ucode::AluVectorOpcode::kSgt: {\n        for (uint32_t i = 0; i < 4; ++i) {\n          vector_result[i] = float(\n              std::isgreater(vector_operands[0][i], vector_operands[1][i]));\n        }\n      } break;\n      case ucode::AluVectorOpcode::kSge: {\n        for (uint32_t i = 0; i < 4; ++i) {\n          vector_result[i] = float(std::isgreaterequal(vector_operands[0][i],\n                                                       vector_operands[1][i]));\n        }\n      } break;\n      case ucode::AluVectorOpcode::kSne: {\n        for (uint32_t i = 0; i < 4; ++i) {\n          vector_result[i] =\n              float(vector_operands[0][i] != vector_operands[1][i]);\n        }\n      } break;\n      case ucode::AluVectorOpcode::kFrc: {\n        for (uint32_t i = 0; i < 4; ++i) {\n          vector_result[i] =\n              vector_operands[0][i] - std::floor(vector_operands[0][i]);\n        }\n      } break;\n      case ucode::AluVectorOpcode::kTrunc: {\n        for (uint32_t i = 0; i < 4; ++i) {\n          vector_result[i] = std::trunc(vector_operands[0][i]);\n        }\n      } break;\n      case ucode::AluVectorOpcode::kFloor: {\n        for (uint32_t i = 0; i < 4; ++i) {\n          vector_result[i] = std::floor(vector_operands[0][i]);\n        }\n      } break;\n      case ucode::AluVectorOpcode::kMad: {\n        for (uint32_t i = 0; i < 4; ++i) {\n          // Direct3D 9 behavior (0 or denormal * anything = +0).\n          // Doing the addition rather than conditional assignment even for zero\n          // operands because +0 + -0 must be +0.\n          vector_result[i] =\n              ((vector_operands[0][i] && vector_operands[1][i])\n                   ? vector_operands[0][i] * vector_operands[1][i]\n                   : 0.0f) +\n              vector_operands[2][i];\n        }\n      } break;\n      case ucode::AluVectorOpcode::kCndEq: {\n        for (uint32_t i = 0; i < 4; ++i) {\n          vector_result[i] = vector_operands[0][i] == 0.0f\n                                 ? vector_operands[1][i]\n                                 : vector_operands[2][i];\n        }\n      } break;\n      case ucode::AluVectorOpcode::kCndGe: {\n        for (uint32_t i = 0; i < 4; ++i) {\n          vector_result[i] = std::isgreaterequal(vector_operands[0][i], 0.0f)\n                                 ? vector_operands[1][i]\n                                 : vector_operands[2][i];\n        }\n      } break;\n      case ucode::AluVectorOpcode::kCndGt: {\n        for (uint32_t i = 0; i < 4; ++i) {\n          vector_result[i] = std::isgreater(vector_operands[0][i], 0.0f)\n                                 ? vector_operands[1][i]\n                                 : vector_operands[2][i];\n        }\n      } break;\n      case ucode::AluVectorOpcode::kDp4: {\n        vector_result[0] = 0.0f;\n        for (uint32_t i = 0; i < 4; ++i) {\n          // Direct3D 9 behavior (0 or denormal * anything = +0).\n          // Doing the addition even for zero operands because +0 + -0 must be\n          // +0.\n          vector_result[0] +=\n              (vector_operands[0][i] && vector_operands[1][i])\n                  ? vector_operands[0][i] * vector_operands[1][i]\n                  : 0.0f;\n        }\n        replicate_vector_result_x = true;\n      } break;\n      case ucode::AluVectorOpcode::kDp3: {\n        vector_result[0] = 0.0f;\n        for (uint32_t i = 0; i < 3; ++i) {\n          // Direct3D 9 behavior (0 or denormal * anything = +0).\n          // Doing the addition even for zero operands because +0 + -0 must be\n          // +0.\n          vector_result[0] +=\n              (vector_operands[0][i] && vector_operands[1][i])\n                  ? vector_operands[0][i] * vector_operands[1][i]\n                  : 0.0f;\n        }\n        replicate_vector_result_x = true;\n      } break;\n      case ucode::AluVectorOpcode::kDp2Add: {\n        // Doing the addition even for zero operands because +0 + -0 must be +0.\n        vector_result[0] = 0.0f;\n        for (uint32_t i = 0; i < 2; ++i) {\n          // Direct3D 9 behavior (0 or denormal * anything = +0).\n          vector_result[0] +=\n              (vector_operands[0][i] && vector_operands[1][i])\n                  ? vector_operands[0][i] * vector_operands[1][i]\n                  : 0.0f;\n        }\n        vector_result[0] += vector_operands[2][0];\n        replicate_vector_result_x = true;\n      } break;\n      case ucode::AluVectorOpcode::kCube: {\n        // Operand [0] is .z_xy.\n        float x = vector_operands[0][2];\n        float y = vector_operands[0][3];\n        float z = vector_operands[0][0];\n        float x_abs = std::abs(x), y_abs = std::abs(y), z_abs = std::abs(z);\n        // Result is T coordinate, S coordinate, 2 * major axis, face ID.\n        if (z_abs >= x_abs && z_abs >= y_abs) {\n          bool z_negative = std::isless(z, 0.0f);\n          vector_result[0] = -y;\n          vector_result[1] = z_negative ? -x : x;\n          vector_result[2] = z;\n          vector_result[3] = z_negative ? 5.0f : 4.0f;\n        } else if (y_abs >= x_abs) {\n          bool y_negative = std::isless(y, 0.0f);\n          vector_result[0] = y_negative ? -z : z;\n          vector_result[1] = x;\n          vector_result[2] = y;\n          vector_result[3] = y_negative ? 3.0f : 2.0f;\n        } else {\n          bool x_negative = std::isless(x, 0.0f);\n          vector_result[0] = -y;\n          vector_result[1] = x_negative ? z : -z;\n          vector_result[2] = x;\n          vector_result[3] = x_negative ? 1.0f : 0.0f;\n        }\n        vector_result[2] *= 2.0f;\n      } break;\n      case ucode::AluVectorOpcode::kMax4: {\n        if (std::isgreaterequal(vector_operands[0][0], vector_operands[0][1]) &&\n            std::isgreaterequal(vector_operands[0][0], vector_operands[0][2]) &&\n            std::isgreaterequal(vector_operands[0][0], vector_operands[0][3])) {\n          vector_result[0] = vector_operands[0][0];\n        } else if (std::isgreaterequal(vector_operands[0][1],\n                                       vector_operands[0][2]) &&\n                   std::isgreaterequal(vector_operands[0][1],\n                                       vector_operands[0][3])) {\n          vector_result[0] = vector_operands[0][1];\n        } else if (std::isgreaterequal(vector_operands[0][2],\n                                       vector_operands[0][3])) {\n          vector_result[0] = vector_operands[0][2];\n        } else {\n          vector_result[0] = vector_operands[0][3];\n        }\n        replicate_vector_result_x = true;\n      } break;\n      case ucode::AluVectorOpcode::kSetpEqPush: {\n        state_.predicate =\n            vector_operands[0][3] == 0.0f && vector_operands[1][3] == 0.0f;\n        vector_result[0] =\n            (vector_operands[0][0] == 0.0f && vector_operands[1][0] == 0.0f)\n                ? 0.0f\n                : vector_operands[0][0] + 1.0f;\n        replicate_vector_result_x = true;\n      } break;\n      case ucode::AluVectorOpcode::kSetpNePush: {\n        state_.predicate =\n            vector_operands[0][3] == 0.0f && vector_operands[1][3] != 0.0f;\n        vector_result[0] =\n            (vector_operands[0][0] == 0.0f && vector_operands[1][0] != 0.0f)\n                ? 0.0f\n                : vector_operands[0][0] + 1.0f;\n        replicate_vector_result_x = true;\n      } break;\n      case ucode::AluVectorOpcode::kSetpGtPush: {\n        state_.predicate = vector_operands[0][3] == 0.0f &&\n                           std::isgreater(vector_operands[1][3], 0.0f);\n        vector_result[0] = (vector_operands[0][0] == 0.0f &&\n                            std::isgreater(vector_operands[1][0], 0.0f))\n                               ? 0.0f\n                               : vector_operands[0][0] + 1.0f;\n        replicate_vector_result_x = true;\n      } break;\n      case ucode::AluVectorOpcode::kSetpGePush: {\n        state_.predicate = vector_operands[0][3] == 0.0f &&\n                           std::isgreaterequal(vector_operands[1][3], 0.0f);\n        vector_result[0] = (vector_operands[0][0] == 0.0f &&\n                            std::isgreaterequal(vector_operands[1][0], 0.0f))\n                               ? 0.0f\n                               : vector_operands[0][0] + 1.0f;\n        replicate_vector_result_x = true;\n      } break;\n      // Not implementing pixel kill currently, the interpreter is currently\n      // used only for vertex shaders.\n      case ucode::AluVectorOpcode::kKillEq: {\n        vector_result[0] =\n            float(vector_operands[0][0] == vector_operands[1][0] ||\n                  vector_operands[0][1] == vector_operands[1][1] ||\n                  vector_operands[0][2] == vector_operands[1][2] ||\n                  vector_operands[0][3] == vector_operands[1][3]);\n        replicate_vector_result_x = true;\n      } break;\n      case ucode::AluVectorOpcode::kKillGt: {\n        vector_result[0] = float(\n            std::isgreater(vector_operands[0][0], vector_operands[1][0]) ||\n            std::isgreater(vector_operands[0][1], vector_operands[1][1]) ||\n            std::isgreater(vector_operands[0][2], vector_operands[1][2]) ||\n            std::isgreater(vector_operands[0][3], vector_operands[1][3]));\n        replicate_vector_result_x = true;\n      } break;\n      case ucode::AluVectorOpcode::kKillGe: {\n        vector_result[0] = float(\n            std::isgreaterequal(vector_operands[0][0], vector_operands[1][0]) ||\n            std::isgreaterequal(vector_operands[0][1], vector_operands[1][1]) ||\n            std::isgreaterequal(vector_operands[0][2], vector_operands[1][2]) ||\n            std::isgreaterequal(vector_operands[0][3], vector_operands[1][3]));\n        replicate_vector_result_x = true;\n      } break;\n      case ucode::AluVectorOpcode::kKillNe: {\n        vector_result[0] =\n            float(vector_operands[0][0] != vector_operands[1][0] ||\n                  vector_operands[0][1] != vector_operands[1][1] ||\n                  vector_operands[0][2] != vector_operands[1][2] ||\n                  vector_operands[0][3] != vector_operands[1][3]);\n        replicate_vector_result_x = true;\n      } break;\n      case ucode::AluVectorOpcode::kDst: {\n        vector_result[0] = 1.0f;\n        // Direct3D 9 behavior (0 or denormal * anything = +0).\n        vector_result[1] = (vector_operands[0][1] && vector_operands[1][1])\n                               ? vector_operands[0][1] * vector_operands[1][1]\n                               : 0.0f;\n        vector_result[2] = vector_operands[0][2];\n        vector_result[3] = vector_operands[1][3];\n      } break;\n      case ucode::AluVectorOpcode::kMaxA: {\n        state_.address_register = int32_t(std::floor(\n            xe::clamp_float(vector_operands[0][3], -256.0f, 255.0f) + 0.5f));\n        for (uint32_t i = 0; i < 4; ++i) {\n          vector_result[i] =\n              std::isgreaterequal(vector_operands[0][i], vector_operands[1][i])\n                  ? vector_operands[0][i]\n                  : vector_operands[1][i];\n        }\n      } break;\n      default: {\n        assert_unhandled_case(vector_opcode);\n      }\n    }\n    if (replicate_vector_result_x) {\n      for (uint32_t i = 1; i < 4; ++i) {\n        vector_result[i] = vector_result[0];\n      }\n    }\n  }\n\n  // Scalar operation.\n  ucode::AluScalarOpcode scalar_opcode = instr.scalar_opcode();\n  const ucode::AluScalarOpcodeInfo& scalar_opcode_info =\n      ucode::GetAluScalarOpcodeInfo(scalar_opcode);\n  float scalar_operands[2];\n  uint32_t scalar_operand_component_count = 0;\n  bool scalar_src_absolute = false;\n  switch (scalar_opcode_info.operand_count) {\n    case 1: {\n      // r#/c#.w or r#/c#.wx.\n      const float* scalar_src_ptr;\n      uint32_t scalar_src_register = instr.src_reg(3);\n      std::array<float, 4> scalar_src_float_constant;\n      if (instr.src_is_temp(3)) {\n        scalar_src_ptr = GetTempRegister(\n            ucode::AluInstruction::src_temp_reg(scalar_src_register),\n            ucode::AluInstruction::is_src_temp_relative(scalar_src_register));\n        scalar_src_absolute = ucode::AluInstruction::is_src_temp_value_absolute(\n            scalar_src_register);\n      } else {\n        scalar_src_float_constant = GetFloatConstant(\n            scalar_src_register, instr.src_const_is_addressed(3),\n            instr.is_const_address_register_relative());\n        scalar_src_ptr = scalar_src_float_constant.data();\n      }\n      uint32_t scalar_src_swizzle = instr.src_swizzle(3);\n      scalar_operand_component_count =\n          scalar_opcode_info.single_operand_is_two_component ? 2 : 1;\n      for (uint32_t i = 0; i < scalar_operand_component_count; ++i) {\n        scalar_operands[i] =\n            scalar_src_ptr[ucode::AluInstruction::GetSwizzledComponentIndex(\n                scalar_src_swizzle, (3 + i) & 3)];\n      }\n    } break;\n    case 2: {\n      scalar_operand_component_count = 2;\n      uint32_t scalar_src_absolute_mask =\n          ~(uint32_t(instr.abs_constants()) << 31);\n      uint32_t scalar_src_negate_bit = uint32_t(instr.src_negate(3)) << 31;\n      uint32_t scalar_src_swizzle = instr.src_swizzle(3);\n      // c#.w.\n      scalar_operands[0] =\n          GetFloatConstant(instr.src_reg(3), instr.src_const_is_addressed(3),\n                           instr.is_const_address_register_relative())\n              [ucode::AluInstruction::GetSwizzledComponentIndex(\n                  scalar_src_swizzle, 3)];\n      // r#.x.\n      scalar_operands[1] = GetTempRegister(\n          instr.scalar_const_reg_op_src_temp_reg(),\n          false)[ucode::AluInstruction::GetSwizzledComponentIndex(\n          scalar_src_swizzle, 0)];\n    } break;\n  }\n  if (scalar_operand_component_count) {\n    uint32_t scalar_src_absolute_mask = ~(uint32_t(scalar_src_absolute) << 31);\n    uint32_t scalar_src_negate_bit = uint32_t(instr.src_negate(3)) << 31;\n    for (uint32_t i = 0; i < scalar_operand_component_count; ++i) {\n      float scalar_operand = FlushDenormal(scalar_operands[i]);\n      *reinterpret_cast<uint32_t*>(&scalar_operand) =\n          (*reinterpret_cast<const uint32_t*>(&scalar_operand) &\n           scalar_src_absolute_mask) ^\n          scalar_src_negate_bit;\n      scalar_operands[i] = scalar_operand;\n    }\n  }\n  switch (scalar_opcode) {\n    case ucode::AluScalarOpcode::kAdds:\n    case ucode::AluScalarOpcode::kAddsc0:\n    case ucode::AluScalarOpcode::kAddsc1: {\n      state_.previous_scalar = scalar_operands[0] + scalar_operands[1];\n    } break;\n    case ucode::AluScalarOpcode::kAddsPrev: {\n      state_.previous_scalar = scalar_operands[0] + state_.previous_scalar;\n    } break;\n    case ucode::AluScalarOpcode::kMuls:\n    case ucode::AluScalarOpcode::kMulsc0:\n    case ucode::AluScalarOpcode::kMulsc1: {\n      // Direct3D 9 behavior (0 or denormal * anything = +0).\n      state_.previous_scalar = (scalar_operands[0] && scalar_operands[1])\n                                   ? scalar_operands[0] * scalar_operands[1]\n                                   : 0.0f;\n    } break;\n    case ucode::AluScalarOpcode::kMulsPrev: {\n      // Direct3D 9 behavior (0 or denormal * anything = +0).\n      state_.previous_scalar = (scalar_operands[0] && state_.previous_scalar)\n                                   ? scalar_operands[0] * state_.previous_scalar\n                                   : 0.0f;\n    } break;\n    case ucode::AluScalarOpcode::kMulsPrev2: {\n      if (state_.previous_scalar == -FLT_MAX ||\n          !std::isfinite(state_.previous_scalar) ||\n          !std::isfinite(scalar_operands[1]) ||\n          std::islessequal(scalar_operands[1], 0.0f)) {\n        state_.previous_scalar = -FLT_MAX;\n      } else {\n        // Direct3D 9 behavior (0 or denormal * anything = +0).\n        state_.previous_scalar =\n            (scalar_operands[0] && state_.previous_scalar)\n                ? scalar_operands[0] * state_.previous_scalar\n                : 0.0f;\n      }\n    } break;\n    case ucode::AluScalarOpcode::kMaxs: {\n      state_.previous_scalar =\n          std::isgreaterequal(scalar_operands[0], scalar_operands[1])\n              ? scalar_operands[0]\n              : scalar_operands[1];\n    } break;\n    case ucode::AluScalarOpcode::kMins: {\n      state_.previous_scalar =\n          std::isless(scalar_operands[0], scalar_operands[1])\n              ? scalar_operands[0]\n              : scalar_operands[1];\n    } break;\n    case ucode::AluScalarOpcode::kSeqs: {\n      state_.previous_scalar = float(scalar_operands[0] == 0.0f);\n    } break;\n    case ucode::AluScalarOpcode::kSgts: {\n      state_.previous_scalar = float(std::isgreater(scalar_operands[0], 0.0f));\n    } break;\n    case ucode::AluScalarOpcode::kSges: {\n      state_.previous_scalar =\n          float(std::isgreaterequal(scalar_operands[0], 0.0f));\n    } break;\n    case ucode::AluScalarOpcode::kSnes: {\n      state_.previous_scalar = float(scalar_operands[0] != 0.0f);\n    } break;\n    case ucode::AluScalarOpcode::kFrcs: {\n      state_.previous_scalar =\n          scalar_operands[0] - std::floor(scalar_operands[0]);\n    } break;\n    case ucode::AluScalarOpcode::kTruncs: {\n      state_.previous_scalar = std::trunc(scalar_operands[0]);\n    } break;\n    case ucode::AluScalarOpcode::kFloors: {\n      state_.previous_scalar = std::floor(scalar_operands[0]);\n    } break;\n    case ucode::AluScalarOpcode::kExp: {\n      state_.previous_scalar = std::exp2(scalar_operands[0]);\n    } break;\n    case ucode::AluScalarOpcode::kLogc: {\n      state_.previous_scalar = std::log2(scalar_operands[0]);\n      if (state_.previous_scalar == -INFINITY) {\n        state_.previous_scalar = -FLT_MAX;\n      }\n    } break;\n    case ucode::AluScalarOpcode::kLog: {\n      state_.previous_scalar = std::log2(scalar_operands[0]);\n    } break;\n    case ucode::AluScalarOpcode::kRcpc: {\n      state_.previous_scalar = 1.0f / scalar_operands[0];\n      if (state_.previous_scalar == -INFINITY) {\n        state_.previous_scalar = -FLT_MAX;\n      } else if (state_.previous_scalar == INFINITY) {\n        state_.previous_scalar = FLT_MAX;\n      }\n    } break;\n    case ucode::AluScalarOpcode::kRcpf: {\n      state_.previous_scalar = 1.0f / scalar_operands[0];\n      if (state_.previous_scalar == -INFINITY) {\n        state_.previous_scalar = -0.0f;\n      } else if (state_.previous_scalar == INFINITY) {\n        state_.previous_scalar = 0.0f;\n      }\n    } break;\n    case ucode::AluScalarOpcode::kRcp: {\n      state_.previous_scalar = 1.0f / scalar_operands[0];\n    } break;\n    case ucode::AluScalarOpcode::kRsqc: {\n      state_.previous_scalar = 1.0f / std::sqrt(scalar_operands[0]);\n      if (state_.previous_scalar == -INFINITY) {\n        state_.previous_scalar = -FLT_MAX;\n      } else if (state_.previous_scalar == INFINITY) {\n        state_.previous_scalar = FLT_MAX;\n      }\n    } break;\n    case ucode::AluScalarOpcode::kRsqf: {\n      state_.previous_scalar = 1.0f / std::sqrt(scalar_operands[0]);\n      if (state_.previous_scalar == -INFINITY) {\n        state_.previous_scalar = -0.0f;\n      } else if (state_.previous_scalar == INFINITY) {\n        state_.previous_scalar = 0.0f;\n      }\n    } break;\n    case ucode::AluScalarOpcode::kRsq: {\n      state_.previous_scalar = 1.0f / std::sqrt(scalar_operands[0]);\n    } break;\n    case ucode::AluScalarOpcode::kMaxAs: {\n      state_.address_register = int32_t(std::floor(\n          xe::clamp_float(scalar_operands[0], -256.0f, 255.0f) + 0.5f));\n      state_.previous_scalar =\n          std::isgreaterequal(scalar_operands[0], scalar_operands[1])\n              ? scalar_operands[0]\n              : scalar_operands[1];\n    } break;\n    case ucode::AluScalarOpcode::kMaxAsf: {\n      state_.address_register = int32_t(\n          std::floor(xe::clamp_float(scalar_operands[0], -256.0f, 255.0f)));\n      state_.previous_scalar =\n          std::isgreaterequal(scalar_operands[0], scalar_operands[1])\n              ? scalar_operands[0]\n              : scalar_operands[1];\n    } break;\n    case ucode::AluScalarOpcode::kSubs:\n    case ucode::AluScalarOpcode::kSubsc0:\n    case ucode::AluScalarOpcode::kSubsc1: {\n      state_.previous_scalar = scalar_operands[0] - scalar_operands[1];\n    } break;\n    case ucode::AluScalarOpcode::kSubsPrev: {\n      state_.previous_scalar = scalar_operands[0] - state_.previous_scalar;\n    } break;\n    case ucode::AluScalarOpcode::kSetpEq: {\n      state_.predicate = scalar_operands[0] == 0.0f;\n      state_.previous_scalar = float(!state_.predicate);\n    } break;\n    case ucode::AluScalarOpcode::kSetpNe: {\n      state_.predicate = scalar_operands[0] != 0.0f;\n      state_.previous_scalar = float(!state_.predicate);\n    } break;\n    case ucode::AluScalarOpcode::kSetpGt: {\n      state_.predicate = std::isgreater(scalar_operands[0], 0.0f);\n      state_.previous_scalar = float(!state_.predicate);\n    } break;\n    case ucode::AluScalarOpcode::kSetpGe: {\n      state_.predicate = std::isgreaterequal(scalar_operands[0], 0.0f);\n      state_.previous_scalar = float(!state_.predicate);\n    } break;\n    case ucode::AluScalarOpcode::kSetpInv: {\n      state_.predicate = scalar_operands[0] == 1.0f;\n      state_.previous_scalar =\n          state_.predicate\n              ? 0.0f\n              : (scalar_operands[0] == 0.0f ? 1.0f : scalar_operands[0]);\n    } break;\n    case ucode::AluScalarOpcode::kSetpPop: {\n      float new_counter = scalar_operands[0] - 1.0f;\n      state_.predicate = std::islessequal(new_counter, 0.0f);\n      state_.previous_scalar = state_.predicate ? 0.0f : new_counter;\n    } break;\n    case ucode::AluScalarOpcode::kSetpClr: {\n      state_.predicate = false;\n      state_.previous_scalar = FLT_MAX;\n    } break;\n    case ucode::AluScalarOpcode::kSetpRstr: {\n      state_.predicate = scalar_operands[0] == 0.0f;\n      state_.previous_scalar = state_.predicate ? 0.0f : scalar_operands[0];\n    } break;\n    // Not implementing pixel kill currently, the interpreter is currently used\n    // only for vertex shaders.\n    case ucode::AluScalarOpcode::kKillsEq: {\n      state_.previous_scalar = float(scalar_operands[0] == 0.0f);\n    } break;\n    case ucode::AluScalarOpcode::kKillsGt: {\n      state_.previous_scalar = float(std::isgreater(scalar_operands[0], 0.0f));\n    } break;\n    case ucode::AluScalarOpcode::kKillsGe: {\n      state_.previous_scalar =\n          float(std::isgreaterequal(scalar_operands[0], 0.0f));\n    } break;\n    case ucode::AluScalarOpcode::kKillsNe: {\n      state_.previous_scalar = float(scalar_operands[0] != 0.0f);\n    } break;\n    case ucode::AluScalarOpcode::kKillsOne: {\n      state_.previous_scalar = float(scalar_operands[0] == 1.0f);\n    } break;\n    case ucode::AluScalarOpcode::kSqrt: {\n      state_.previous_scalar = std::sqrt(scalar_operands[0]);\n    } break;\n    case ucode::AluScalarOpcode::kSin: {\n      state_.previous_scalar = std::sin(scalar_operands[0]);\n    } break;\n    case ucode::AluScalarOpcode::kCos: {\n      state_.previous_scalar = std::cos(scalar_operands[0]);\n    } break;\n    case ucode::AluScalarOpcode::kRetainPrev: {\n    } break;\n    default: {\n      assert_unhandled_case(scalar_opcode);\n    }\n  }\n\n  if (instr.vector_clamp()) {\n    for (uint32_t i = 0; i < 4; ++i) {\n      vector_result[i] = xe::saturate(vector_result[i]);\n    }\n  }\n  float scalar_result = instr.scalar_clamp()\n                            ? xe::saturate(state_.previous_scalar)\n                            : state_.previous_scalar;\n\n  uint32_t scalar_result_write_mask = instr.GetScalarOpResultWriteMask();\n  if (instr.is_export()) {\n    if (export_sink_) {\n      float export_value[4];\n      uint32_t export_constant_1_mask = instr.GetConstant1WriteMask();\n      uint32_t export_mask =\n          vector_result_write_mask | scalar_result_write_mask |\n          instr.GetConstant0WriteMask() | export_constant_1_mask;\n      for (uint32_t i = 0; i < 4; ++i) {\n        uint32_t export_component_bit = UINT32_C(1) << i;\n        float export_component = 0.0f;\n        if (vector_result_write_mask & export_component_bit) {\n          export_component = vector_result[i];\n        } else if (scalar_result_write_mask & export_component_bit) {\n          export_component = scalar_result;\n        } else if (export_constant_1_mask & export_component_bit) {\n          export_component = 1.0f;\n        } else {\n          export_component = 0.0f;\n        }\n        export_value[i] = export_component;\n      }\n      export_sink_->Export(\n          ucode::ExportRegister(instr.vector_dest()), export_value,\n          vector_result_write_mask | scalar_result_write_mask |\n              instr.GetConstant0WriteMask() | export_constant_1_mask);\n    }\n  } else {\n    if (vector_result_write_mask) {\n      float* vector_dest =\n          GetTempRegister(instr.vector_dest(), instr.is_vector_dest_relative());\n      for (uint32_t i = 0; i < 4; ++i) {\n        if (vector_result_write_mask & (UINT32_C(1) << i)) {\n          vector_dest[i] = vector_result[i];\n        }\n      }\n    }\n    if (scalar_result_write_mask) {\n      float* scalar_dest =\n          GetTempRegister(instr.scalar_dest(), instr.is_scalar_dest_relative());\n      for (uint32_t i = 0; i < 4; ++i) {\n        if (scalar_result_write_mask & (UINT32_C(1) << i)) {\n          scalar_dest[i] = scalar_result;\n        }\n      }\n    }\n  }\n}\n\nvoid ShaderInterpreter::StoreFetchResult(uint32_t dest, bool is_dest_relative,\n                                         uint32_t swizzle, const float* value) {\n  float* dest_data = GetTempRegister(dest, is_dest_relative);\n  for (uint32_t i = 0; i < 4; ++i) {\n    ucode::FetchDestinationSwizzle component_swizzle =\n        ucode::GetFetchDestinationComponentSwizzle(swizzle, i);\n    switch (component_swizzle) {\n      case ucode::FetchDestinationSwizzle::kX:\n        dest_data[i] = value[0];\n        break;\n      case ucode::FetchDestinationSwizzle::kY:\n        dest_data[i] = value[1];\n        break;\n      case ucode::FetchDestinationSwizzle::kZ:\n        dest_data[i] = value[2];\n        break;\n      case ucode::FetchDestinationSwizzle::kW:\n        dest_data[i] = value[3];\n        break;\n      case ucode::FetchDestinationSwizzle::k1:\n        dest_data[i] = 1.0f;\n        break;\n      case ucode::FetchDestinationSwizzle::kKeep:\n        break;\n      default:\n        // ucode::FetchDestinationSwizzle::k0 or the invalid swizzle 6.\n        // TODO(Triang3l): Find the correct handling of the invalid swizzle 6.\n        assert_true(component_swizzle == ucode::FetchDestinationSwizzle::k0);\n        dest_data[i] = 0.0f;\n        break;\n    }\n  }\n}\n\nvoid ShaderInterpreter::ExecuteVertexFetchInstruction(\n    ucode::VertexFetchInstruction instr) {\n  // FIXME(Triang3l): Bit scan loops over components cause a link-time\n  // optimization internal error in Visual Studio 2019, mainly in the format\n  // unpacking. Using loops with up to 4 iterations here instead.\n\n  if (!instr.is_mini_fetch()) {\n    state_.vfetch_full_last = instr;\n  }\n\n  xenos::xe_gpu_vertex_fetch_t fetch_constant = register_file_.GetVertexFetch(\n      state_.vfetch_full_last.fetch_constant_index());\n\n  if (!instr.is_mini_fetch()) {\n    // Get the part of the address that depends on vfetch_full data.\n    uint32_t vertex_index = uint32_t(std::floor(\n        GetTempRegister(instr.src(),\n                        instr.is_src_relative())[instr.src_swizzle()] +\n        (instr.is_index_rounded() ? 0.5f : 0.0f)));\n    state_.vfetch_address_dwords =\n        instr.stride() * vertex_index + fetch_constant.address;\n  }\n\n  // TODO(Triang3l): Find the default values for unused components.\n  float result[4] = {};\n  uint32_t dest_swizzle = instr.dest_swizzle();\n  uint32_t used_result_components = 0b0000;\n  for (uint32_t i = 0; i < 4; ++i) {\n    uint32_t dest_component_swizzle = (dest_swizzle >> (3 * i)) & 0b111;\n    if (dest_component_swizzle <= 3) {\n      used_result_components |= UINT32_C(1) << dest_component_swizzle;\n    }\n  }\n  uint32_t needed_dwords = xenos::GetVertexFormatNeededWords(\n      instr.data_format(), used_result_components);\n  if (needed_dwords) {\n    uint32_t data[4] = {};\n    const uint32_t* memory_dwords =\n        reinterpret_cast<const uint32_t*>(memory_.physical_membase());\n    uint32_t buffer_end_dwords = fetch_constant.address + fetch_constant.size;\n    uint32_t dword_0_address_dwords =\n        uint32_t(int32_t(state_.vfetch_address_dwords) + instr.offset());\n    for (uint32_t i = 0; i < 4; ++i) {\n      if (!(needed_dwords & (UINT32_C(1) << i))) {\n        continue;\n      }\n      uint32_t dword_value = 0;\n      uint32_t dword_address_dwords = dword_0_address_dwords + i;\n      if (dword_address_dwords >= fetch_constant.address &&\n          dword_address_dwords < buffer_end_dwords) {\n        if (trace_writer_) {\n          trace_writer_->WriteMemoryRead(\n              sizeof(uint32_t) * dword_address_dwords, sizeof(uint32_t));\n        }\n        dword_value = xenos::GpuSwap(memory_dwords[dword_address_dwords],\n                                     fetch_constant.endian);\n      }\n      data[i] = dword_value;\n    }\n\n    uint32_t packed_components = 0b0000;\n    uint32_t packed_widths[4], packed_offsets[4];\n    uint32_t packed_dwords[] = {data[0], data[0]};\n    switch (instr.data_format()) {\n      case xenos::VertexFormat::k_8_8_8_8: {\n        packed_components = 0b1111;\n        packed_widths[0] = packed_widths[1] = packed_widths[2] =\n            packed_widths[3] = 8;\n        packed_offsets[1] = 8;\n        packed_offsets[2] = 16;\n        packed_offsets[3] = 24;\n      } break;\n      case xenos::VertexFormat::k_2_10_10_10: {\n        packed_components = 0b1111;\n        packed_widths[0] = packed_widths[1] = packed_widths[2] = 10;\n        packed_widths[3] = 2;\n        packed_offsets[1] = 10;\n        packed_offsets[2] = 20;\n        packed_offsets[3] = 30;\n      } break;\n      case xenos::VertexFormat::k_10_11_11: {\n        packed_components = 0b0111;\n        packed_widths[0] = packed_widths[1] = 11;\n        packed_widths[2] = 10;\n        packed_offsets[1] = 11;\n        packed_offsets[2] = 22;\n      } break;\n      case xenos::VertexFormat::k_11_11_10: {\n        packed_components = 0b0111;\n        packed_widths[0] = 10;\n        packed_widths[1] = packed_widths[2] = 11;\n        packed_offsets[1] = 10;\n        packed_offsets[2] = 21;\n      } break;\n      case xenos::VertexFormat::k_16_16: {\n        packed_components = 0b0011;\n        packed_widths[0] = packed_widths[1] = 16;\n        packed_offsets[1] = 16;\n      } break;\n      case xenos::VertexFormat::k_16_16_16_16: {\n        packed_components = 0b1111;\n        packed_widths[0] = packed_widths[1] = packed_widths[2] =\n            packed_widths[3] = 16;\n        packed_offsets[1] = packed_offsets[3] = 16;\n        packed_dwords[1] = data[1];\n      } break;\n      case xenos::VertexFormat::k_16_16_16_16_FLOAT: {\n        if (used_result_components & 0b1000) {\n          result[3] = xe::xenos_half_to_float(uint16_t(data[1] >> 16));\n        }\n        if (used_result_components & 0b0100) {\n          result[2] = xe::xenos_half_to_float(uint16_t(data[1]));\n        }\n      }\n        [[fallthrough]];\n      case xenos::VertexFormat::k_16_16_FLOAT: {\n        if (used_result_components & 0b0010) {\n          result[1] = xe::xenos_half_to_float(uint16_t(data[0] >> 16));\n        }\n        if (used_result_components & 0b0001) {\n          result[0] = xe::xenos_half_to_float(uint16_t(data[0]));\n        }\n      } break;\n      case xenos::VertexFormat::k_32:\n      case xenos::VertexFormat::k_32_32:\n      case xenos::VertexFormat::k_32_32_32_32: {\n        if (instr.is_signed()) {\n          for (uint32_t i = 0; i < 4; ++i) {\n            result[i] = float(int32_t(data[i]));\n          }\n          if (instr.is_normalized()) {\n            if (instr.signed_rf_mode() ==\n                xenos::SignedRepeatingFractionMode::kNoZero) {\n              for (uint32_t i = 0; i < 4; ++i) {\n                result[i] = (result[i] + 0.5f) / 2147483647.5f;\n              }\n            } else {\n              for (uint32_t i = 0; i < 4; ++i) {\n                result[i] /= 2147483647.0f;\n                // No need to clamp to -1 if signed - the smallest value will be\n                // -2^23 / 2^23 due to rounding.\n              }\n            }\n          }\n        } else {\n          for (uint32_t i = 0; i < 4; ++i) {\n            result[i] = float(data[i]);\n          }\n          if (instr.is_normalized()) {\n            for (uint32_t i = 0; i < 4; ++i) {\n              result[i] /= 4294967295.0f;\n            }\n          }\n        }\n      } break;\n      case xenos::VertexFormat::k_32_FLOAT:\n      case xenos::VertexFormat::k_32_32_FLOAT:\n      case xenos::VertexFormat::k_32_32_32_32_FLOAT:\n      case xenos::VertexFormat::k_32_32_32_FLOAT: {\n        for (uint32_t i = 0; i < 4; ++i) {\n          result[i] = *reinterpret_cast<const float*>(&data[i]);\n        }\n      } break;\n      default:\n        assert_unhandled_case(instr.data_format());\n        break;\n    }\n\n    packed_components &= used_result_components;\n    if (packed_components) {\n      if (instr.is_signed()) {\n        for (uint32_t i = 0; i < 4; ++i) {\n          if (!(packed_components & (UINT32_C(1) << i))) {\n            continue;\n          }\n          uint32_t packed_width = packed_widths[i];\n          result[i] = float(int32_t(packed_dwords[i >> 1])\n                                << (32 - (packed_width + packed_offsets[i])) >>\n                            (32 - packed_width));\n        }\n        if (instr.is_normalized()) {\n          if (instr.signed_rf_mode() ==\n              xenos::SignedRepeatingFractionMode::kNoZero) {\n            for (uint32_t i = 0; i < 4; ++i) {\n              if (!(packed_components & (UINT32_C(1) << i))) {\n                continue;\n              }\n              result[i] = (result[i] + 0.5f) * 2.0f /\n                          float((UINT32_C(1) << packed_widths[i]) - 1);\n            }\n          } else {\n            for (uint32_t i = 0; i < 4; ++i) {\n              if (!(packed_components & (UINT32_C(1) << i))) {\n                continue;\n              }\n              result[i] = std::max(\n                  -1.0f,\n                  result[i] /\n                      float((UINT32_C(1) << (packed_widths[i] - 1)) - 1));\n            }\n          }\n        }\n      } else {\n        for (uint32_t i = 0; i < 4; ++i) {\n          if (!(packed_components & (UINT32_C(1) << i))) {\n            continue;\n          }\n          uint32_t packed_width = packed_widths[i];\n          result[i] = float(packed_dwords[i >> 1] &\n                            ((UINT32_C(1) << packed_widths[i]) - 1));\n        }\n        if (instr.is_normalized()) {\n          for (uint32_t i = 0; i < 4; ++i) {\n            if (!(packed_components & (UINT32_C(1) << i))) {\n              continue;\n            }\n            result[i] /= float((UINT32_C(1) << packed_widths[i]) - 1);\n          }\n        }\n      }\n    }\n  }\n\n  int32_t exp_adjust = instr.exp_adjust();\n  if (exp_adjust) {\n    float exp_adjust_factor = std::ldexp(1.0f, exp_adjust);\n    for (uint32_t i = 0; i < 4; ++i) {\n      result[i] *= exp_adjust_factor;\n    }\n  }\n\n  StoreFetchResult(instr.dest(), instr.is_dest_relative(), instr.dest_swizzle(),\n                   result);\n}\n\n}  // namespace gpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/shader_interpreter.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_SHADER_INTERPRETER_H_\n#define XENIA_GPU_SHADER_INTERPRETER_H_\n\n#include <algorithm>\n#include <array>\n#include <cstddef>\n#include <cstdint>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/gpu/register_file.h\"\n#include \"xenia/gpu/shader.h\"\n#include \"xenia/gpu/trace_writer.h\"\n#include \"xenia/gpu/ucode.h\"\n#include \"xenia/gpu/xenos.h\"\n#include \"xenia/memory.h\"\n\nnamespace xe {\nnamespace gpu {\n\nclass ShaderInterpreter {\n public:\n  ShaderInterpreter(const RegisterFile& register_file, const Memory& memory)\n      : register_file_(register_file), memory_(memory) {}\n\n  class ExportSink {\n   public:\n    virtual ~ExportSink() = default;\n    virtual void AllocExport(ucode::AllocType type, uint32_t size) {}\n    virtual void Export(ucode::ExportRegister export_register,\n                        const float* value, uint32_t value_mask) {}\n  };\n\n  void SetTraceWriter(TraceWriter* new_trace_writer) {\n    trace_writer_ = new_trace_writer;\n  }\n\n  ExportSink* GetExportSink() const { return export_sink_; }\n  void SetExportSink(ExportSink* new_export_sink) {\n    export_sink_ = new_export_sink;\n  }\n\n  const float* temp_registers() const { return &temp_registers_[0][0]; }\n  float* temp_registers() { return &temp_registers_[0][0]; }\n\n  static bool CanInterpretShader(const Shader& shader) {\n    assert_true(shader.is_ucode_analyzed());\n    // Texture instructions are not very common in vertex shaders (and not used\n    // in Direct3D 9's internal rectangles such as clears) and are extremely\n    // complex, not implemented.\n    if (shader.uses_texture_fetch_instruction_results()) {\n      return false;\n    }\n    return true;\n  }\n  void SetShader(xenos::ShaderType shader_type, const uint32_t* ucode) {\n    shader_type_ = shader_type;\n    ucode_ = ucode;\n  }\n  void SetShader(const Shader& shader) {\n    assert_true(CanInterpretShader(shader));\n    SetShader(shader.type(), shader.ucode_dwords());\n  }\n\n  void Execute();\n\n private:\n  struct State {\n    ucode::VertexFetchInstruction vfetch_full_last;\n    uint32_t vfetch_address_dwords;\n    float previous_scalar;\n    uint32_t call_stack_depth;\n    uint32_t call_return_addresses[4];\n    uint32_t loop_stack_depth;\n    xenos::LoopConstant loop_constants[4];\n    uint32_t loop_iterators[4];\n    int32_t address_register;\n    bool predicate;\n\n    void Reset() { std::memset(this, 0, sizeof(*this)); }\n\n    int32_t GetLoopAddress() const {\n      assert_true(loop_stack_depth && loop_stack_depth < 4);\n      if (!loop_stack_depth || loop_stack_depth >= 4) {\n        return 0;\n      }\n      xenos::LoopConstant loop_constant = loop_constants[loop_stack_depth];\n      // Clamp to the real range specified in the IPR2015-00325 sequencer\n      // specification.\n      // https://portal.unifiedpatents.com/ptab/case/IPR2015-00325\n      return std::min(\n          INT32_C(256),\n          std::max(INT32_C(-256),\n                   int32_t(int32_t(loop_iterators[loop_stack_depth]) *\n                               loop_constant.step +\n                           loop_constant.start)));\n    }\n  };\n\n  static float FlushDenormal(float value) {\n    uint32_t bits = *reinterpret_cast<const uint32_t*>(&value);\n    bits &= (bits & UINT32_C(0x7F800000)) ? ~UINT32_C(0) : (UINT32_C(1) << 31);\n    return *reinterpret_cast<const float*>(&bits);\n  }\n\n  uint32_t GetTempRegisterIndex(uint32_t address, bool is_relative) const {\n    return (int32_t(address) + (is_relative ? state_.GetLoopAddress() : 0)) &\n           ((UINT32_C(1) << xenos::kMaxShaderTempRegistersLog2) - 1);\n  }\n  const float* GetTempRegister(uint32_t address, bool is_relative) const {\n    return temp_registers_[GetTempRegisterIndex(address, is_relative)];\n  }\n  float* GetTempRegister(uint32_t address, bool is_relative) {\n    return temp_registers_[GetTempRegisterIndex(address, is_relative)];\n  }\n  const std::array<float, 4> GetFloatConstant(\n      uint32_t address, bool is_relative, bool relative_address_is_a0) const;\n\n  void ExecuteAluInstruction(ucode::AluInstruction instr);\n  void StoreFetchResult(uint32_t dest, bool is_dest_relative, uint32_t swizzle,\n                        const float* value);\n  void ExecuteVertexFetchInstruction(ucode::VertexFetchInstruction instr);\n\n  const RegisterFile& register_file_;\n  const Memory& memory_;\n\n  TraceWriter* trace_writer_ = nullptr;\n\n  ExportSink* export_sink_ = nullptr;\n\n  xenos::ShaderType shader_type_ = xenos::ShaderType::kVertex;\n  const uint32_t* ucode_ = nullptr;\n\n  // For both inputs and locals.\n  float temp_registers_[xenos::kMaxShaderTempRegisters][4];\n\n  State state_;\n};\n\n}  // namespace gpu\n}  // namespace xe\n\n#endif  // XENIA_GPU_SHADER_INTERPRETER_H_\n"
  },
  {
    "path": "src/xenia/gpu/shader_translator.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2015 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/shader_translator.h\"\n\n#include <algorithm>\n#include <cstdarg>\n#include <cstring>\n#include <set>\n#include <string>\n#include <utility>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/gpu/gpu_flags.h\"\n\nnamespace xe {\nnamespace gpu {\n\nusing namespace ucode;\n\n// The Xbox 360 GPU is effectively an Adreno A200:\n// https://github.com/freedreno/freedreno/wiki/A2XX-Shader-Instruction-Set-Architecture\n//\n// A lot of this information is derived from the freedreno drivers, AMD's\n// documentation, publicly available Xbox presentations (from GDC/etc), and\n// other reverse engineering.\n//\n// Naming has been matched as closely as possible to the real thing by using the\n// publicly available XNA Game Studio shader assembler.\n// You can find a tool for exploring this under tools/shader-playground/,\n// allowing interative assembling/disassembling of shader code.\n//\n// Though the 360's GPU is similar to the Adreno r200, the microcode format is\n// slightly different. Though this is a great guide it cannot be assumed it\n// matches the 360 in all areas:\n// https://github.com/freedreno/freedreno/blob/master/util/disasm-a2xx.c\n//\n// Lots of naming comes from the disassembly spit out by the XNA GS compiler\n// and dumps of d3dcompiler and games: https://pastebin.com/i4kAv7bB\n\nvoid Shader::AnalyzeUcode(StringBuffer& ucode_disasm_buffer) {\n  if (is_ucode_analyzed_) {\n    return;\n  }\n\n  // Control flow instructions come paired in blocks of 3 dwords and all are\n  // listed at the top of the ucode.\n  // Each control flow instruction is executed sequentially until the final\n  // ending instruction.\n  // Gather the upper bound of the control flow instructions, and label\n  // addresses, which are needed for disassembly.\n  cf_pair_index_bound_ = uint32_t(ucode_data_.size() / 3);\n  for (uint32_t i = 0; i < cf_pair_index_bound_; ++i) {\n    ControlFlowInstruction cf_ab[2];\n    UnpackControlFlowInstructions(ucode_data_.data() + i * 3, cf_ab);\n    for (uint32_t j = 0; j < 2; ++j) {\n      // Guess how long the control flow program is by scanning for the first\n      // kExec-ish and instruction and using its address as the upper bound.\n      // This is what freedreno does.\n      const ControlFlowInstruction& cf = cf_ab[j];\n      if (IsControlFlowOpcodeExec(cf.opcode())) {\n        cf_pair_index_bound_ =\n            std::min(cf_pair_index_bound_, cf.exec.address());\n      }\n      switch (cf.opcode()) {\n        case ControlFlowOpcode::kCondCall:\n          label_addresses_.insert(cf.cond_call.address());\n          break;\n        case ControlFlowOpcode::kCondJmp:\n          label_addresses_.insert(cf.cond_jmp.address());\n          break;\n        case ControlFlowOpcode::kLoopStart:\n          label_addresses_.insert(cf.loop_start.address());\n          break;\n        case ControlFlowOpcode::kLoopEnd:\n          label_addresses_.insert(cf.loop_end.address());\n          break;\n        default:\n          break;\n      }\n    }\n  }\n\n  // Disassemble and gather information.\n  ucode_disasm_buffer.Reset();\n  VertexFetchInstruction previous_vfetch_full;\n  std::memset(&previous_vfetch_full, 0, sizeof(previous_vfetch_full));\n  uint32_t unique_texture_bindings = 0;\n  for (uint32_t i = 0; i < cf_pair_index_bound_; ++i) {\n    ControlFlowInstruction cf_ab[2];\n    UnpackControlFlowInstructions(ucode_data_.data() + i * 3, cf_ab);\n    for (uint32_t j = 0; j < 2; ++j) {\n      uint32_t cf_index = i * 2 + j;\n      if (label_addresses_.find(cf_index) != label_addresses_.end()) {\n        ucode_disasm_buffer.AppendFormat(\"                label L{}\\n\",\n                                         cf_index);\n      }\n      ucode_disasm_buffer.AppendFormat(\"/* {:4d}.{} */ \", i, j);\n\n      const ControlFlowInstruction& cf = cf_ab[j];\n      uint32_t bool_constant_index = UINT32_MAX;\n      switch (cf.opcode()) {\n        case ControlFlowOpcode::kNop:\n          ucode_disasm_buffer.Append(\"      cnop\\n\");\n          break;\n        case ControlFlowOpcode::kExec:\n        case ControlFlowOpcode::kExecEnd: {\n          ParsedExecInstruction instr;\n          ParseControlFlowExec(cf.exec, cf_index, instr);\n          GatherExecInformation(instr, previous_vfetch_full,\n                                unique_texture_bindings, ucode_disasm_buffer);\n        } break;\n        case ControlFlowOpcode::kCondExec:\n        case ControlFlowOpcode::kCondExecEnd:\n        case ControlFlowOpcode::kCondExecPredClean:\n        case ControlFlowOpcode::kCondExecPredCleanEnd: {\n          bool_constant_index = cf.cond_exec.bool_address();\n          ParsedExecInstruction instr;\n          ParseControlFlowCondExec(cf.cond_exec, cf_index, instr);\n          GatherExecInformation(instr, previous_vfetch_full,\n                                unique_texture_bindings, ucode_disasm_buffer);\n        } break;\n        case ControlFlowOpcode::kCondExecPred:\n        case ControlFlowOpcode::kCondExecPredEnd: {\n          ParsedExecInstruction instr;\n          ParseControlFlowCondExecPred(cf.cond_exec_pred, cf_index, instr);\n          GatherExecInformation(instr, previous_vfetch_full,\n                                unique_texture_bindings, ucode_disasm_buffer);\n        } break;\n        case ControlFlowOpcode::kLoopStart: {\n          ParsedLoopStartInstruction instr;\n          ParseControlFlowLoopStart(cf.loop_start, cf_index, instr);\n          instr.Disassemble(&ucode_disasm_buffer);\n          constant_register_map_.loop_bitmap |= uint32_t(1)\n                                                << instr.loop_constant_index;\n        } break;\n        case ControlFlowOpcode::kLoopEnd: {\n          ParsedLoopEndInstruction instr;\n          ParseControlFlowLoopEnd(cf.loop_end, cf_index, instr);\n          instr.Disassemble(&ucode_disasm_buffer);\n          constant_register_map_.loop_bitmap |= uint32_t(1)\n                                                << instr.loop_constant_index;\n        } break;\n        case ControlFlowOpcode::kCondCall: {\n          ParsedCallInstruction instr;\n          ParseControlFlowCondCall(cf.cond_call, cf_index, instr);\n          instr.Disassemble(&ucode_disasm_buffer);\n          if (instr.type == ParsedCallInstruction::Type::kConditional) {\n            bool_constant_index = instr.bool_constant_index;\n          }\n        } break;\n        case ControlFlowOpcode::kReturn: {\n          ParsedReturnInstruction instr;\n          ParseControlFlowReturn(cf.ret, cf_index, instr);\n          instr.Disassemble(&ucode_disasm_buffer);\n        } break;\n        case ControlFlowOpcode::kCondJmp: {\n          ParsedJumpInstruction instr;\n          ParseControlFlowCondJmp(cf.cond_jmp, cf_index, instr);\n          instr.Disassemble(&ucode_disasm_buffer);\n          if (instr.type == ParsedJumpInstruction::Type::kConditional) {\n            bool_constant_index = instr.bool_constant_index;\n          }\n        } break;\n        case ControlFlowOpcode::kAlloc: {\n          ParsedAllocInstruction instr;\n          ParseControlFlowAlloc(cf.alloc, cf_index,\n                                type() == xenos::ShaderType::kVertex, instr);\n          instr.Disassemble(&ucode_disasm_buffer);\n        } break;\n        case ControlFlowOpcode::kMarkVsFetchDone:\n          break;\n        default:\n          assert_unhandled_case(cf.opcode);\n          break;\n      }\n      if (bool_constant_index != UINT32_MAX) {\n        constant_register_map_.bool_bitmap[bool_constant_index / 32] |=\n            uint32_t(1) << (bool_constant_index % 32);\n      }\n    }\n  }\n  ucode_disassembly_ = ucode_disasm_buffer.to_string();\n\n  if (constant_register_map_.float_dynamic_addressing) {\n    // All potentially can be referenced.\n    constant_register_map_.float_count = 256;\n    memset(constant_register_map_.float_bitmap, UINT8_MAX,\n           sizeof(constant_register_map_.float_bitmap));\n  } else {\n    constant_register_map_.float_count = 0;\n    for (int i = 0; i < 4; ++i) {\n      // Each bit indicates a vec4 (4 floats).\n      constant_register_map_.float_count +=\n          xe::bit_count(constant_register_map_.float_bitmap[i]);\n    }\n  }\n\n  if (!cf_memexport_info_.empty()) {\n    // Gather potentially \"dirty\" memexport elements before each control flow\n    // instruction. `alloc` (any, not only `export`) flushes the previous memory\n    // export. On the guest GPU, yielding / serializing also terminates memory\n    // exports, but for simplicity disregarding that, as that functionally does\n    // nothing compared to flushing the previous memory export only at `alloc`\n    // or even only specifically at `alloc export`, Microsoft's validator checks\n    // if eM# aren't written after a `serialize`.\n    std::vector<uint32_t> successor_stack;\n    for (uint32_t i = 0; i < cf_pair_index_bound_; ++i) {\n      ControlFlowInstruction eM_writing_cf_ab[2];\n      UnpackControlFlowInstructions(ucode_data_.data() + i * 3,\n                                    eM_writing_cf_ab);\n      for (uint32_t j = 0; j < 2; ++j) {\n        uint32_t eM_writing_cf_index = i * 2 + j;\n        uint32_t eM_written_by_cf_instr =\n            cf_memexport_info_[eM_writing_cf_index]\n                .eM_potentially_written_by_exec;\n        if (eM_writing_cf_ab[j].opcode() == ControlFlowOpcode::kCondCall) {\n          // Until subroutine calls are handled accurately, assume that all eM#\n          // have potentially been written by the subroutine for simplicity.\n          eM_written_by_cf_instr = memexport_eM_written_;\n        }\n        if (!eM_written_by_cf_instr) {\n          continue;\n        }\n\n        // If the control flow instruction potentially results in any eM# being\n        // written, mark those eM# as potentially written before each successor.\n        bool is_successor_graph_head = true;\n        successor_stack.push_back(eM_writing_cf_index);\n        while (!successor_stack.empty()) {\n          uint32_t successor_cf_index = successor_stack.back();\n          successor_stack.pop_back();\n\n          ControlFlowMemExportInfo& successor_memexport_info =\n              cf_memexport_info_[successor_cf_index];\n          if ((successor_memexport_info.eM_potentially_written_before &\n               eM_written_by_cf_instr) == eM_written_by_cf_instr) {\n            // Already marked as written before this instruction (and thus\n            // before all its successors too). Possibly this instruction is in a\n            // loop, in this case an instruction may succeed itself.\n            break;\n          }\n          // The first instruction in the traversal is the writing instruction\n          // itself, not its successor. However, if it has been visited by the\n          // traversal twice, it's in a loop, so it succeeds itself, and thus\n          // writes from it are potentially done before it too.\n          if (!is_successor_graph_head) {\n            successor_memexport_info.eM_potentially_written_before |=\n                eM_written_by_cf_instr;\n          }\n          is_successor_graph_head = false;\n\n          ControlFlowInstruction successor_cf_ab[2];\n          UnpackControlFlowInstructions(\n              ucode_data_.data() + (successor_cf_index >> 1) * 3,\n              successor_cf_ab);\n          const ControlFlowInstruction& successor_cf =\n              successor_cf_ab[successor_cf_index & 1];\n\n          bool next_instr_is_new_successor = true;\n          switch (successor_cf.opcode()) {\n            case ControlFlowOpcode::kExecEnd:\n              // One successor: end.\n              memexport_eM_potentially_written_before_end_ |=\n                  eM_written_by_cf_instr;\n              next_instr_is_new_successor = false;\n              break;\n            case ControlFlowOpcode::kCondExecEnd:\n            case ControlFlowOpcode::kCondExecPredEnd:\n            case ControlFlowOpcode::kCondExecPredCleanEnd:\n              // Two successors: next, end.\n              memexport_eM_potentially_written_before_end_ |=\n                  eM_written_by_cf_instr;\n              break;\n            case ControlFlowOpcode::kLoopStart:\n              // Two successors: next, skip.\n              successor_stack.push_back(successor_cf.loop_start.address());\n              break;\n            case ControlFlowOpcode::kLoopEnd:\n              // Two successors: next, repeat.\n              successor_stack.push_back(successor_cf.loop_end.address());\n              break;\n            case ControlFlowOpcode::kCondCall:\n              // Two successors: next, target.\n              successor_stack.push_back(successor_cf.cond_call.address());\n              break;\n            case ControlFlowOpcode::kReturn:\n              // Currently treating all subroutine calls as potentially writing\n              // all eM# for simplicity, so just exit the subroutine.\n              next_instr_is_new_successor = false;\n              break;\n            case ControlFlowOpcode::kCondJmp:\n              // One or two successors: next if conditional, target.\n              successor_stack.push_back(successor_cf.cond_jmp.address());\n              if (successor_cf.cond_jmp.is_unconditional()) {\n                next_instr_is_new_successor = false;\n              }\n              break;\n            case ControlFlowOpcode::kAlloc:\n              // Any `alloc` ends the previous export.\n              next_instr_is_new_successor = false;\n              break;\n            default:\n              break;\n          }\n          if (next_instr_is_new_successor) {\n            if (successor_cf_index < (cf_pair_index_bound_ << 1)) {\n              successor_stack.push_back(successor_cf_index + 1);\n            } else {\n              memexport_eM_potentially_written_before_end_ |=\n                  eM_written_by_cf_instr;\n            }\n          }\n        }\n      }\n    }\n  }\n\n  is_ucode_analyzed_ = true;\n\n  // An empty shader can be created internally by shader translators as a dummy,\n  // don't dump it.\n  if (!cvars::dump_shaders.empty() && !ucode_data().empty()) {\n    DumpUcode(cvars::dump_shaders);\n  }\n}\n\nuint32_t Shader::GetInterpolatorInputMask(reg::SQ_PROGRAM_CNTL sq_program_cntl,\n                                          reg::SQ_CONTEXT_MISC sq_context_misc,\n                                          uint32_t& param_gen_pos_out) const {\n  assert_true(type() == xenos::ShaderType::kPixel);\n  uint32_t interpolator_count = std::min(\n      xenos::kMaxInterpolators,\n      std::max(register_static_address_bound(),\n               GetDynamicAddressableRegisterCount(sq_program_cntl.ps_num_reg)));\n  uint32_t interpolator_mask = (UINT32_C(1) << interpolator_count) - 1;\n  if (sq_program_cntl.param_gen &&\n      sq_context_misc.param_gen_pos < interpolator_count) {\n    // Will be overwritten by PsParamGen.\n    interpolator_mask &= ~(UINT32_C(1) << sq_context_misc.param_gen_pos);\n    param_gen_pos_out = sq_context_misc.param_gen_pos;\n  } else {\n    param_gen_pos_out = UINT32_MAX;\n  }\n  return interpolator_mask;\n}\n\nvoid Shader::GatherExecInformation(\n    const ParsedExecInstruction& instr,\n    ucode::VertexFetchInstruction& previous_vfetch_full,\n    uint32_t& unique_texture_bindings, StringBuffer& ucode_disasm_buffer) {\n  instr.Disassemble(&ucode_disasm_buffer);\n  uint32_t sequence = instr.sequence;\n  for (uint32_t instr_offset = instr.instruction_address;\n       instr_offset < instr.instruction_address + instr.instruction_count;\n       ++instr_offset, sequence >>= 2) {\n    ucode_disasm_buffer.AppendFormat(\"/* {:4d}   */ \", instr_offset);\n    if (sequence & 0b10) {\n      ucode_disasm_buffer.Append(\"         serialize\\n             \");\n    }\n    const uint32_t* op_ptr = ucode_data_.data() + instr_offset * 3;\n    if (sequence & 0b01) {\n      auto& op = *reinterpret_cast<const FetchInstruction*>(op_ptr);\n      if (op.opcode() == FetchOpcode::kVertexFetch) {\n        GatherVertexFetchInformation(op.vertex_fetch(), previous_vfetch_full,\n                                     ucode_disasm_buffer);\n      } else {\n        GatherTextureFetchInformation(\n            op.texture_fetch(), unique_texture_bindings, ucode_disasm_buffer);\n      }\n    } else {\n      auto& op = *reinterpret_cast<const AluInstruction*>(op_ptr);\n      GatherAluInstructionInformation(op, instr.dword_index,\n                                      ucode_disasm_buffer);\n    }\n  }\n}\n\nvoid Shader::GatherVertexFetchInformation(\n    const VertexFetchInstruction& op,\n    VertexFetchInstruction& previous_vfetch_full,\n    StringBuffer& ucode_disasm_buffer) {\n  ParsedVertexFetchInstruction fetch_instr;\n  if (ParseVertexFetchInstruction(op, previous_vfetch_full, fetch_instr)) {\n    previous_vfetch_full = op;\n  }\n  fetch_instr.Disassemble(&ucode_disasm_buffer);\n\n  GatherFetchResultInformation(fetch_instr.result);\n\n  // Mini-fetches inherit the operands from full fetches.\n  if (!fetch_instr.is_mini_fetch) {\n    for (size_t i = 0; i < fetch_instr.operand_count; ++i) {\n      GatherOperandInformation(fetch_instr.operands[i]);\n    }\n  }\n\n  // Don't bother setting up a binding for an instruction that fetches nothing.\n  // In case of vfetch_full, however, it may still be used to set up addressing\n  // for the subsequent vfetch_mini, so operand information must still be\n  // gathered.\n  if (!fetch_instr.result.GetUsedResultComponents()) {\n    return;\n  }\n\n  // Try to allocate an attribute on an existing binding.\n  // If no binding for this fetch slot is found create it.\n  using VertexBinding = Shader::VertexBinding;\n  VertexBinding::Attribute* attrib = nullptr;\n  for (auto& vertex_binding : vertex_bindings_) {\n    if (vertex_binding.fetch_constant == op.fetch_constant_index()) {\n      // It may not hold that all strides are equal, but I hope it does.\n      assert_true(!fetch_instr.attributes.stride ||\n                  vertex_binding.stride_words == fetch_instr.attributes.stride);\n      vertex_binding.attributes.push_back({});\n      attrib = &vertex_binding.attributes.back();\n      break;\n    }\n  }\n  if (!attrib) {\n    assert_not_zero(fetch_instr.attributes.stride);\n    VertexBinding vertex_binding;\n    vertex_binding.binding_index = int(vertex_bindings_.size());\n    vertex_binding.fetch_constant = op.fetch_constant_index();\n    vertex_binding.stride_words = fetch_instr.attributes.stride;\n    vertex_binding.attributes.push_back({});\n    vertex_bindings_.emplace_back(std::move(vertex_binding));\n    attrib = &vertex_bindings_.back().attributes.back();\n  }\n\n  // Populate attribute.\n  attrib->fetch_instr = fetch_instr;\n}\n\nvoid Shader::GatherTextureFetchInformation(const TextureFetchInstruction& op,\n                                           uint32_t& unique_texture_bindings,\n                                           StringBuffer& ucode_disasm_buffer) {\n  TextureBinding binding;\n  ParseTextureFetchInstruction(op, binding.fetch_instr);\n  binding.fetch_instr.Disassemble(&ucode_disasm_buffer);\n\n  GatherFetchResultInformation(binding.fetch_instr.result);\n  for (size_t i = 0; i < binding.fetch_instr.operand_count; ++i) {\n    GatherOperandInformation(binding.fetch_instr.operands[i]);\n  }\n\n  if (binding.fetch_instr.result.GetUsedResultComponents()) {\n    uses_texture_fetch_instruction_results_ = true;\n  }\n\n  switch (op.opcode()) {\n    case FetchOpcode::kSetTextureLod:\n    case FetchOpcode::kSetTextureGradientsHorz:\n    case FetchOpcode::kSetTextureGradientsVert:\n      // Doesn't use bindings.\n      return;\n    default:\n      // Continue.\n      break;\n  }\n  binding.binding_index = -1;\n  binding.fetch_constant = binding.fetch_instr.operands[1].storage_index;\n\n  // Check and see if this fetch constant was previously used...\n  for (auto& tex_binding : texture_bindings_) {\n    if (tex_binding.fetch_constant == binding.fetch_constant) {\n      binding.binding_index = tex_binding.binding_index;\n      break;\n    }\n  }\n\n  if (binding.binding_index == -1) {\n    // Assign a unique binding index.\n    binding.binding_index = unique_texture_bindings++;\n  }\n\n  texture_bindings_.emplace_back(std::move(binding));\n}\n\nvoid Shader::GatherAluInstructionInformation(\n    const AluInstruction& op, uint32_t exec_cf_index,\n    StringBuffer& ucode_disasm_buffer) {\n  ParsedAluInstruction instr;\n  ParseAluInstruction(op, type(), instr);\n  instr.Disassemble(&ucode_disasm_buffer);\n\n  kills_pixels_ =\n      kills_pixels_ ||\n      (ucode::GetAluVectorOpcodeInfo(op.vector_opcode()).changed_state &\n       ucode::kAluOpChangedStatePixelKill) ||\n      (ucode::GetAluScalarOpcodeInfo(op.scalar_opcode()).changed_state &\n       ucode::kAluOpChangedStatePixelKill);\n\n  GatherAluResultInformation(instr.vector_and_constant_result, exec_cf_index);\n  GatherAluResultInformation(instr.scalar_result, exec_cf_index);\n  for (size_t i = 0; i < instr.vector_operand_count; ++i) {\n    GatherOperandInformation(instr.vector_operands[i]);\n  }\n  for (size_t i = 0; i < instr.scalar_operand_count; ++i) {\n    GatherOperandInformation(instr.scalar_operands[i]);\n  }\n\n  // Store used memexport constants because CPU code needs addresses and sizes.\n  // eA is (hopefully) always written to using:\n  // mad eA, r#, const0100, c#\n  // (though there are some exceptions, shaders in 4D5307E6 for some reason set\n  // eA to zeros, but the swizzle of the constant is not .xyzw in this case, and\n  // they don't write to eM#).\n  // Export is done to vector_dest of the ucode instruction for both vector and\n  // scalar operations - no need to check separately.\n  if (instr.vector_and_constant_result.storage_target ==\n      InstructionStorageTarget::kExportAddress) {\n    uint32_t memexport_stream_constant = instr.GetMemExportStreamConstant();\n    if (memexport_stream_constant != UINT32_MAX) {\n      memexport_stream_constants_.insert(memexport_stream_constant);\n    } else {\n      XELOGE(\n          \"ShaderTranslator::GatherAluInstructionInformation: Couldn't extract \"\n          \"memexport stream constant index\");\n    }\n  }\n}\n\nvoid Shader::GatherOperandInformation(const InstructionOperand& operand) {\n  switch (operand.storage_source) {\n    case InstructionStorageSource::kRegister:\n      if (operand.storage_addressing_mode ==\n          InstructionStorageAddressingMode::kAbsolute) {\n        register_static_address_bound_ =\n            std::max(register_static_address_bound_,\n                     operand.storage_index + uint32_t(1));\n      } else {\n        uses_register_dynamic_addressing_ = true;\n      }\n      break;\n    case InstructionStorageSource::kConstantFloat:\n      if (operand.storage_addressing_mode ==\n          InstructionStorageAddressingMode::kAbsolute) {\n        // Store used float constants before translating so the\n        // translator can use tightly packed indices if not dynamically\n        // indexed.\n        constant_register_map_.float_bitmap[operand.storage_index >> 6] |=\n            uint64_t(1) << (operand.storage_index & 63);\n      } else {\n        constant_register_map_.float_dynamic_addressing = true;\n      }\n      break;\n    case InstructionStorageSource::kVertexFetchConstant:\n      constant_register_map_.vertex_fetch_bitmap[operand.storage_index >> 5] |=\n          uint32_t(1) << (operand.storage_index & 31);\n      break;\n    default:\n      break;\n  }\n}\n\nvoid Shader::GatherFetchResultInformation(const InstructionResult& result) {\n  if (!result.GetUsedWriteMask()) {\n    return;\n  }\n  // Fetch instructions can't export - don't need the current memexport count\n  // operand.\n  assert_true(result.storage_target == InstructionStorageTarget::kRegister);\n  if (result.storage_addressing_mode ==\n      InstructionStorageAddressingMode::kAbsolute) {\n    register_static_address_bound_ = std::max(\n        register_static_address_bound_, result.storage_index + uint32_t(1));\n  } else {\n    uses_register_dynamic_addressing_ = true;\n  }\n}\n\nvoid Shader::GatherAluResultInformation(const InstructionResult& result,\n                                        uint32_t exec_cf_index) {\n  uint32_t used_write_mask = result.GetUsedWriteMask();\n  if (!used_write_mask) {\n    return;\n  }\n  switch (result.storage_target) {\n    case InstructionStorageTarget::kRegister:\n      if (result.storage_addressing_mode ==\n          InstructionStorageAddressingMode::kAbsolute) {\n        register_static_address_bound_ = std::max(\n            register_static_address_bound_, result.storage_index + uint32_t(1));\n      } else {\n        uses_register_dynamic_addressing_ = true;\n      }\n      break;\n    case InstructionStorageTarget::kInterpolator:\n      writes_interpolators_ |= uint32_t(1) << result.storage_index;\n      break;\n    case InstructionStorageTarget::kPointSizeEdgeFlagKillVertex:\n      writes_point_size_edge_flag_kill_vertex_ |= used_write_mask;\n      break;\n    case InstructionStorageTarget::kExportData:\n      memexport_eM_written_ |= uint8_t(1) << result.storage_index;\n      if (cf_memexport_info_.empty()) {\n        cf_memexport_info_.resize(2 * cf_pair_index_bound_);\n      }\n      cf_memexport_info_[exec_cf_index].eM_potentially_written_by_exec |=\n          uint32_t(1) << result.storage_index;\n      break;\n    case InstructionStorageTarget::kColor:\n      writes_color_targets_ |= uint32_t(1) << result.storage_index;\n      break;\n    case InstructionStorageTarget::kDepth:\n      writes_depth_ = true;\n      break;\n    default:\n      break;\n  }\n}\n\nShaderTranslator::ShaderTranslator() = default;\n\nShaderTranslator::~ShaderTranslator() = default;\n\nvoid ShaderTranslator::Reset() {\n  errors_.clear();\n  std::memset(&previous_vfetch_full_, 0, sizeof(previous_vfetch_full_));\n}\n\nbool ShaderTranslator::TranslateAnalyzedShader(\n    Shader::Translation& translation) {\n  const Shader& shader = translation.shader();\n  assert_true(shader.is_ucode_analyzed());\n  if (!shader.is_ucode_analyzed()) {\n    XELOGE(\"AnalyzeUcode must be done on the shader before translation\");\n    return false;\n  }\n  translation_ = &translation;\n\n  Reset();\n\n  register_count_ = shader.register_static_address_bound();\n  if (shader.uses_register_dynamic_addressing()) {\n    // An array of registers at the end of the r# space may be dynamically\n    // addressable - ensure enough space, as specified in SQ_PROGRAM_CNTL, is\n    // allocated.\n    register_count_ = std::max(register_count_, GetModificationRegisterCount());\n  }\n\n  StartTranslation();\n\n  const uint32_t* ucode_dwords = shader.ucode_data().data();\n\n  // TODO(Triang3l): Remove when the old SPIR-V shader translator is deleted.\n  uint32_t cf_pair_index_bound = shader.cf_pair_index_bound();\n  std::vector<ControlFlowInstruction> cf_instructions;\n  for (uint32_t i = 0; i < cf_pair_index_bound; ++i) {\n    ControlFlowInstruction cf_ab[2];\n    UnpackControlFlowInstructions(ucode_dwords + i * 3, cf_ab);\n    cf_instructions.push_back(cf_ab[0]);\n    cf_instructions.push_back(cf_ab[1]);\n  }\n  PreProcessControlFlowInstructions(cf_instructions);\n\n  // Translate all instructions.\n  const std::set<uint32_t>& label_addresses = shader.label_addresses();\n  for (uint32_t i = 0; i < cf_pair_index_bound; ++i) {\n    ControlFlowInstruction cf_ab[2];\n    UnpackControlFlowInstructions(ucode_dwords + i * 3, cf_ab);\n    for (uint32_t j = 0; j < 2; ++j) {\n      uint32_t cf_index = i * 2 + j;\n      cf_index_ = cf_index;\n      if (label_addresses.find(cf_index) != label_addresses.end()) {\n        ProcessLabel(cf_index);\n      }\n      ProcessControlFlowInstructionBegin(cf_index);\n      TranslateControlFlowInstruction(cf_ab[j]);\n      ProcessControlFlowInstructionEnd(cf_index);\n    }\n  }\n\n  translation.errors_ = std::move(errors_);\n  translation.translated_binary_ = CompleteTranslation();\n  translation.is_translated_ = true;\n\n  bool is_valid = true;\n  for (const auto& error : translation.errors_) {\n    if (error.is_fatal) {\n      is_valid = false;\n      break;\n    }\n  }\n  translation.is_valid_ = is_valid;\n\n  PostTranslation();\n\n  // In case is_valid_ is modified by PostTranslation, reload.\n  return translation.is_valid_;\n}\n\nvoid ShaderTranslator::EmitTranslationError(const char* message,\n                                            bool is_fatal) {\n  Shader::Error error;\n  error.is_fatal = is_fatal;\n  error.message = message;\n  // TODO(benvanik): location information.\n  errors_.push_back(std::move(error));\n  XELOGE(\"Shader translation {}error: {}\", is_fatal ? \"fatal \" : \"\", message);\n}\n\nvoid ShaderTranslator::TranslateControlFlowInstruction(\n    const ControlFlowInstruction& cf) {\n  switch (cf.opcode()) {\n    case ControlFlowOpcode::kNop:\n      ProcessControlFlowNopInstruction(cf_index_);\n      break;\n    case ControlFlowOpcode::kExec:\n    case ControlFlowOpcode::kExecEnd: {\n      ParsedExecInstruction instr;\n      ParseControlFlowExec(cf.exec, cf_index_, instr);\n      TranslateExecInstructions(instr);\n    } break;\n    case ControlFlowOpcode::kCondExec:\n    case ControlFlowOpcode::kCondExecEnd:\n    case ControlFlowOpcode::kCondExecPredClean:\n    case ControlFlowOpcode::kCondExecPredCleanEnd: {\n      ParsedExecInstruction instr;\n      ParseControlFlowCondExec(cf.cond_exec, cf_index_, instr);\n      TranslateExecInstructions(instr);\n    } break;\n    case ControlFlowOpcode::kCondExecPred:\n    case ControlFlowOpcode::kCondExecPredEnd: {\n      ParsedExecInstruction instr;\n      ParseControlFlowCondExecPred(cf.cond_exec_pred, cf_index_, instr);\n      TranslateExecInstructions(instr);\n    } break;\n    case ControlFlowOpcode::kLoopStart: {\n      ParsedLoopStartInstruction instr;\n      ParseControlFlowLoopStart(cf.loop_start, cf_index_, instr);\n      ProcessLoopStartInstruction(instr);\n    } break;\n    case ControlFlowOpcode::kLoopEnd: {\n      ParsedLoopEndInstruction instr;\n      ParseControlFlowLoopEnd(cf.loop_end, cf_index_, instr);\n      ProcessLoopEndInstruction(instr);\n    } break;\n    case ControlFlowOpcode::kCondCall: {\n      ParsedCallInstruction instr;\n      ParseControlFlowCondCall(cf.cond_call, cf_index_, instr);\n      ProcessCallInstruction(instr);\n    } break;\n    case ControlFlowOpcode::kReturn: {\n      ParsedReturnInstruction instr;\n      ParseControlFlowReturn(cf.ret, cf_index_, instr);\n      ProcessReturnInstruction(instr);\n    } break;\n    case ControlFlowOpcode::kCondJmp: {\n      ParsedJumpInstruction instr;\n      ParseControlFlowCondJmp(cf.cond_jmp, cf_index_, instr);\n      ProcessJumpInstruction(instr);\n    } break;\n    case ControlFlowOpcode::kAlloc: {\n      ParsedAllocInstruction instr;\n      ParseControlFlowAlloc(cf.alloc, cf_index_, is_vertex_shader(), instr);\n      const std::vector<Shader::ControlFlowMemExportInfo>& cf_memexport_info =\n          current_shader().cf_memexport_info();\n      ProcessAllocInstruction(instr,\n                              instr.dword_index < cf_memexport_info.size()\n                                  ? cf_memexport_info[instr.dword_index]\n                                        .eM_potentially_written_before\n                                  : 0);\n    } break;\n    case ControlFlowOpcode::kMarkVsFetchDone:\n      break;\n    default:\n      assert_unhandled_case(cf.opcode);\n      break;\n  }\n  // TODO(benvanik): return if (DoesControlFlowOpcodeEndShader(cf.opcode()))?\n}\n\nvoid ParseControlFlowExec(const ControlFlowExecInstruction& cf,\n                          uint32_t cf_index, ParsedExecInstruction& instr) {\n  instr.dword_index = cf_index;\n  instr.opcode = cf.opcode();\n  instr.opcode_name =\n      cf.opcode() == ControlFlowOpcode::kExecEnd ? \"exece\" : \"exec\";\n  instr.instruction_address = cf.address();\n  instr.instruction_count = cf.count();\n  instr.type = ParsedExecInstruction::Type::kUnconditional;\n  instr.is_end = cf.opcode() == ControlFlowOpcode::kExecEnd;\n  instr.is_predicate_clean = cf.is_predicate_clean();\n  instr.is_yield = cf.is_yield();\n  instr.sequence = cf.sequence();\n}\n\nvoid ParseControlFlowCondExec(const ControlFlowCondExecInstruction& cf,\n                              uint32_t cf_index, ParsedExecInstruction& instr) {\n  instr.dword_index = cf_index;\n  instr.opcode = cf.opcode();\n  instr.opcode_name = \"cexec\";\n  switch (cf.opcode()) {\n    case ControlFlowOpcode::kCondExecEnd:\n    case ControlFlowOpcode::kCondExecPredCleanEnd:\n      instr.opcode_name = \"cexece\";\n      instr.is_end = true;\n      break;\n    default:\n      break;\n  }\n  instr.instruction_address = cf.address();\n  instr.instruction_count = cf.count();\n  instr.type = ParsedExecInstruction::Type::kConditional;\n  instr.bool_constant_index = cf.bool_address();\n  instr.condition = cf.condition();\n  switch (cf.opcode()) {\n    case ControlFlowOpcode::kCondExec:\n    case ControlFlowOpcode::kCondExecEnd:\n      instr.is_predicate_clean = false;\n      break;\n    default:\n      break;\n  }\n  instr.is_yield = cf.is_yield();\n  instr.sequence = cf.sequence();\n}\n\nvoid ParseControlFlowCondExecPred(const ControlFlowCondExecPredInstruction& cf,\n                                  uint32_t cf_index,\n                                  ParsedExecInstruction& instr) {\n  instr.dword_index = cf_index;\n  instr.opcode = cf.opcode();\n  instr.opcode_name =\n      cf.opcode() == ControlFlowOpcode::kCondExecPredEnd ? \"exece\" : \"exec\";\n  instr.instruction_address = cf.address();\n  instr.instruction_count = cf.count();\n  instr.type = ParsedExecInstruction::Type::kPredicated;\n  instr.condition = cf.condition();\n  instr.is_end = cf.opcode() == ControlFlowOpcode::kCondExecPredEnd;\n  instr.is_predicate_clean = cf.is_predicate_clean();\n  instr.is_yield = cf.is_yield();\n  instr.sequence = cf.sequence();\n}\n\nvoid ParseControlFlowLoopStart(const ControlFlowLoopStartInstruction& cf,\n                               uint32_t cf_index,\n                               ParsedLoopStartInstruction& instr) {\n  instr.dword_index = cf_index;\n  instr.loop_constant_index = cf.loop_id();\n  instr.is_repeat = cf.is_repeat();\n  instr.loop_skip_address = cf.address();\n}\n\nvoid ParseControlFlowLoopEnd(const ControlFlowLoopEndInstruction& cf,\n                             uint32_t cf_index,\n                             ParsedLoopEndInstruction& instr) {\n  instr.dword_index = cf_index;\n  instr.is_predicated_break = cf.is_predicated_break();\n  instr.predicate_condition = cf.condition();\n  instr.loop_constant_index = cf.loop_id();\n  instr.loop_body_address = cf.address();\n}\n\nvoid ParseControlFlowCondCall(const ControlFlowCondCallInstruction& cf,\n                              uint32_t cf_index, ParsedCallInstruction& instr) {\n  instr.dword_index = cf_index;\n  instr.target_address = cf.address();\n  if (cf.is_unconditional()) {\n    instr.type = ParsedCallInstruction::Type::kUnconditional;\n  } else if (cf.is_predicated()) {\n    instr.type = ParsedCallInstruction::Type::kPredicated;\n    instr.condition = cf.condition();\n  } else {\n    instr.type = ParsedCallInstruction::Type::kConditional;\n    instr.bool_constant_index = cf.bool_address();\n    instr.condition = cf.condition();\n  }\n}\n\nvoid ParseControlFlowReturn(const ControlFlowReturnInstruction& cf,\n                            uint32_t cf_index, ParsedReturnInstruction& instr) {\n  instr.dword_index = cf_index;\n}\n\nvoid ParseControlFlowCondJmp(const ControlFlowCondJmpInstruction& cf,\n                             uint32_t cf_index, ParsedJumpInstruction& instr) {\n  instr.dword_index = cf_index;\n  instr.target_address = cf.address();\n  if (cf.is_unconditional()) {\n    instr.type = ParsedJumpInstruction::Type::kUnconditional;\n  } else if (cf.is_predicated()) {\n    instr.type = ParsedJumpInstruction::Type::kPredicated;\n    instr.condition = cf.condition();\n  } else {\n    instr.type = ParsedJumpInstruction::Type::kConditional;\n    instr.bool_constant_index = cf.bool_address();\n    instr.condition = cf.condition();\n  }\n}\n\nvoid ParseControlFlowAlloc(const ControlFlowAllocInstruction& cf,\n                           uint32_t cf_index, bool is_vertex_shader,\n                           ParsedAllocInstruction& instr) {\n  instr.dword_index = cf_index;\n  instr.type = cf.alloc_type();\n  instr.count = cf.size();\n  instr.is_vertex_shader = is_vertex_shader;\n}\n\nvoid ShaderTranslator::TranslateExecInstructions(\n    const ParsedExecInstruction& instr) {\n  ProcessExecInstructionBegin(instr);\n\n  const std::vector<Shader::ControlFlowMemExportInfo>& cf_memexport_info =\n      current_shader().cf_memexport_info();\n  uint8_t eM_potentially_written_before =\n      instr.dword_index < cf_memexport_info.size()\n          ? cf_memexport_info[instr.dword_index].eM_potentially_written_before\n          : 0;\n\n  const uint32_t* ucode_dwords = current_shader().ucode_data().data();\n  uint32_t sequence = instr.sequence;\n  for (uint32_t instr_offset = instr.instruction_address;\n       instr_offset < instr.instruction_address + instr.instruction_count;\n       ++instr_offset, sequence >>= 2) {\n    const uint32_t* op_ptr = ucode_dwords + instr_offset * 3;\n    if (sequence & 0b01) {\n      auto& op = *reinterpret_cast<const FetchInstruction*>(op_ptr);\n      if (op.opcode() == FetchOpcode::kVertexFetch) {\n        const VertexFetchInstruction& vfetch_op = op.vertex_fetch();\n        ParsedVertexFetchInstruction vfetch_instr;\n        if (ParseVertexFetchInstruction(vfetch_op, previous_vfetch_full_,\n                                        vfetch_instr)) {\n          previous_vfetch_full_ = vfetch_op;\n        }\n        ProcessVertexFetchInstruction(vfetch_instr);\n      } else {\n        ParsedTextureFetchInstruction tfetch_instr;\n        ParseTextureFetchInstruction(op.texture_fetch(), tfetch_instr);\n        ProcessTextureFetchInstruction(tfetch_instr);\n      }\n    } else {\n      auto& op = *reinterpret_cast<const AluInstruction*>(op_ptr);\n      ParsedAluInstruction alu_instr;\n      ParseAluInstruction(op, current_shader().type(), alu_instr);\n      ProcessAluInstruction(alu_instr, eM_potentially_written_before);\n      if (alu_instr.vector_and_constant_result.storage_target ==\n              InstructionStorageTarget::kExportData &&\n          alu_instr.vector_and_constant_result.GetUsedWriteMask()) {\n        eM_potentially_written_before |=\n            uint8_t(1) << alu_instr.vector_and_constant_result.storage_index;\n      }\n      if (alu_instr.scalar_result.storage_target ==\n              InstructionStorageTarget::kExportData &&\n          alu_instr.scalar_result.GetUsedWriteMask()) {\n        eM_potentially_written_before |=\n            uint8_t(1) << alu_instr.scalar_result.storage_index;\n      }\n    }\n  }\n\n  ProcessExecInstructionEnd(instr);\n}\n\nstatic void ParseFetchInstructionResult(uint32_t dest, uint32_t swizzle,\n                                        bool is_relative,\n                                        InstructionResult& result) {\n  result.storage_target = InstructionStorageTarget::kRegister;\n  result.storage_index = dest;\n  result.is_clamped = false;\n  result.storage_addressing_mode =\n      is_relative ? InstructionStorageAddressingMode::kLoopRelative\n                  : InstructionStorageAddressingMode::kAbsolute;\n  result.original_write_mask = 0b1111;\n  for (int i = 0; i < 4; ++i) {\n    SwizzleSource component_source = SwizzleSource::k0;\n    ucode::FetchDestinationSwizzle component_swizzle =\n        ucode::GetFetchDestinationComponentSwizzle(swizzle, i);\n    switch (component_swizzle) {\n      case ucode::FetchDestinationSwizzle::kX:\n        component_source = SwizzleSource::kX;\n        break;\n      case ucode::FetchDestinationSwizzle::kY:\n        component_source = SwizzleSource::kY;\n        break;\n      case ucode::FetchDestinationSwizzle::kZ:\n        component_source = SwizzleSource::kZ;\n        break;\n      case ucode::FetchDestinationSwizzle::kW:\n        component_source = SwizzleSource::kW;\n        break;\n      case ucode::FetchDestinationSwizzle::k1:\n        component_source = SwizzleSource::k1;\n        break;\n      case ucode::FetchDestinationSwizzle::kKeep:\n        result.original_write_mask &= ~(UINT32_C(1) << i);\n        break;\n      default:\n        // ucode::FetchDestinationSwizzle::k0 or the invalid swizzle 6.\n        // TODO(Triang3l): Find the correct handling of the invalid swizzle 6.\n        assert_true(component_swizzle == ucode::FetchDestinationSwizzle::k0);\n        component_source = SwizzleSource::k0;\n        break;\n    }\n    result.components[i] = component_source;\n  }\n}\n\nbool ParseVertexFetchInstruction(const VertexFetchInstruction& op,\n                                 const VertexFetchInstruction& previous_full_op,\n                                 ParsedVertexFetchInstruction& instr) {\n  instr.opcode = FetchOpcode::kVertexFetch;\n  instr.opcode_name = op.is_mini_fetch() ? \"vfetch_mini\" : \"vfetch_full\";\n  instr.is_mini_fetch = op.is_mini_fetch();\n  instr.is_predicated = op.is_predicated();\n  instr.predicate_condition = op.predicate_condition();\n\n  ParseFetchInstructionResult(op.dest(), op.dest_swizzle(),\n                              op.is_dest_relative(), instr.result);\n\n  // Reuse previous vfetch_full if this is a mini.\n  const auto& full_op = op.is_mini_fetch() ? previous_full_op : op;\n  auto& src_op = instr.operands[instr.operand_count++];\n  src_op.storage_source = InstructionStorageSource::kRegister;\n  src_op.storage_index = full_op.src();\n  src_op.storage_addressing_mode =\n      full_op.is_src_relative()\n          ? InstructionStorageAddressingMode::kLoopRelative\n          : InstructionStorageAddressingMode::kAbsolute;\n  src_op.is_negated = false;\n  src_op.is_absolute_value = false;\n  src_op.component_count = 1;\n  uint32_t swizzle = full_op.src_swizzle();\n  for (uint32_t j = 0; j < src_op.component_count; ++j, swizzle >>= 2) {\n    src_op.components[j] = GetSwizzleFromComponentIndex(swizzle & 0x3);\n  }\n\n  auto& const_op = instr.operands[instr.operand_count++];\n  const_op.storage_source = InstructionStorageSource::kVertexFetchConstant;\n  const_op.storage_index = full_op.fetch_constant_index();\n\n  instr.attributes.data_format = op.data_format();\n  instr.attributes.offset = op.offset();\n  instr.attributes.stride = full_op.stride();\n  instr.attributes.exp_adjust = op.exp_adjust();\n  instr.attributes.prefetch_count = op.prefetch_count();\n  instr.attributes.is_index_rounded = full_op.is_index_rounded();\n  instr.attributes.is_signed = op.is_signed();\n  instr.attributes.is_integer = !op.is_normalized();\n  instr.attributes.signed_rf_mode = op.signed_rf_mode();\n\n  return !op.is_mini_fetch();\n}\n\nvoid ParseTextureFetchInstruction(const TextureFetchInstruction& op,\n                                  ParsedTextureFetchInstruction& instr) {\n  struct TextureFetchOpcodeInfo {\n    const char* name;\n    bool has_dest;\n    bool has_const;\n    bool has_attributes;\n    uint32_t override_component_count;\n  } opcode_info;\n  switch (op.opcode()) {\n    case FetchOpcode::kTextureFetch: {\n      static const char* kNames[] = {\"tfetch1D\", \"tfetch2D\", \"tfetch3D\",\n                                     \"tfetchCube\"};\n      opcode_info = {kNames[static_cast<int>(op.dimension())], true, true, true,\n                     0};\n    } break;\n    case FetchOpcode::kGetTextureBorderColorFrac: {\n      static const char* kNames[] = {\"getBCF1D\", \"getBCF2D\", \"getBCF3D\",\n                                     \"getBCFCube\"};\n      opcode_info = {kNames[static_cast<int>(op.dimension())], true, true, true,\n                     0};\n    } break;\n    case FetchOpcode::kGetTextureComputedLod: {\n      static const char* kNames[] = {\"getCompTexLOD1D\", \"getCompTexLOD2D\",\n                                     \"getCompTexLOD3D\", \"getCompTexLODCube\"};\n      opcode_info = {kNames[static_cast<int>(op.dimension())], true, true, true,\n                     0};\n    } break;\n    case FetchOpcode::kGetTextureGradients:\n      opcode_info = {\"getGradients\", true, true, true, 2};\n      break;\n    case FetchOpcode::kGetTextureWeights: {\n      static const char* kNames[] = {\"getWeights1D\", \"getWeights2D\",\n                                     \"getWeights3D\", \"getWeightsCube\"};\n      opcode_info = {kNames[static_cast<int>(op.dimension())], true, true, true,\n                     0};\n    } break;\n    case FetchOpcode::kSetTextureLod:\n      opcode_info = {\"setTexLOD\", false, false, false, 1};\n      break;\n    case FetchOpcode::kSetTextureGradientsHorz:\n      opcode_info = {\"setGradientH\", false, false, false, 3};\n      break;\n    case FetchOpcode::kSetTextureGradientsVert:\n      opcode_info = {\"setGradientV\", false, false, false, 3};\n      break;\n    default:\n      assert_unhandled_case(fetch_opcode);\n      return;\n  }\n\n  instr.opcode = op.opcode();\n  instr.opcode_name = opcode_info.name;\n  instr.dimension = op.dimension();\n  instr.is_predicated = op.is_predicated();\n  instr.predicate_condition = op.predicate_condition();\n\n  if (opcode_info.has_dest) {\n    ParseFetchInstructionResult(op.dest(), op.dest_swizzle(),\n                                op.is_dest_relative(), instr.result);\n  } else {\n    instr.result.storage_target = InstructionStorageTarget::kNone;\n  }\n\n  auto& src_op = instr.operands[instr.operand_count++];\n  src_op.storage_source = InstructionStorageSource::kRegister;\n  src_op.storage_index = op.src();\n  src_op.storage_addressing_mode =\n      op.is_src_relative() ? InstructionStorageAddressingMode::kLoopRelative\n                           : InstructionStorageAddressingMode::kAbsolute;\n  src_op.is_negated = false;\n  src_op.is_absolute_value = false;\n  src_op.component_count =\n      opcode_info.override_component_count\n          ? opcode_info.override_component_count\n          : xenos::GetFetchOpDimensionComponentCount(op.dimension());\n  uint32_t swizzle = op.src_swizzle();\n  for (uint32_t j = 0; j < src_op.component_count; ++j, swizzle >>= 2) {\n    src_op.components[j] = GetSwizzleFromComponentIndex(swizzle & 0x3);\n  }\n\n  if (opcode_info.has_const) {\n    auto& const_op = instr.operands[instr.operand_count++];\n    const_op.storage_source = InstructionStorageSource::kTextureFetchConstant;\n    const_op.storage_index = op.fetch_constant_index();\n  }\n\n  if (opcode_info.has_attributes) {\n    instr.attributes.fetch_valid_only = op.fetch_valid_only();\n    instr.attributes.unnormalized_coordinates = op.unnormalized_coordinates();\n    instr.attributes.mag_filter = op.mag_filter();\n    instr.attributes.min_filter = op.min_filter();\n    instr.attributes.mip_filter = op.mip_filter();\n    instr.attributes.aniso_filter = op.aniso_filter();\n    instr.attributes.vol_mag_filter = op.vol_mag_filter();\n    instr.attributes.vol_min_filter = op.vol_min_filter();\n    instr.attributes.use_computed_lod = op.use_computed_lod();\n    instr.attributes.use_register_lod = op.use_register_lod();\n    instr.attributes.use_register_gradients = op.use_register_gradients();\n    instr.attributes.lod_bias = op.lod_bias();\n    instr.attributes.offset_x = op.offset_x();\n    instr.attributes.offset_y = op.offset_y();\n    instr.attributes.offset_z = op.offset_z();\n  }\n}\n\nuint32_t ParsedTextureFetchInstruction::GetNonZeroResultComponents() const {\n  uint32_t components = 0b0000;\n  switch (opcode) {\n    case FetchOpcode::kTextureFetch:\n    case FetchOpcode::kGetTextureGradients:\n      components = 0b1111;\n      break;\n    case FetchOpcode::kGetTextureBorderColorFrac:\n      components = 0b0001;\n      break;\n    case FetchOpcode::kGetTextureComputedLod:\n      // Not checking if the MipFilter is basemap because XNA doesn't accept\n      // MipFilter for getCompTexLOD.\n      components = 0b0001;\n      break;\n    case FetchOpcode::kGetTextureWeights:\n      // FIXME(Triang3l): Not caring about mag/min filters currently for\n      // simplicity. It's very unlikely that this instruction is ever seriously\n      // used to retrieve weights of zero though.\n      switch (dimension) {\n        case xenos::FetchOpDimension::k1D:\n          components = 0b1001;\n          break;\n        case xenos::FetchOpDimension::k2D:\n        case xenos::FetchOpDimension::kCube:\n          // TODO(Triang3l): Is the depth lerp factor always 0 for cube maps?\n          components = 0b1011;\n          break;\n        case xenos::FetchOpDimension::k3DOrStacked:\n          components = 0b1111;\n          break;\n      }\n      if (attributes.mip_filter == xenos::TextureFilter::kBaseMap ||\n          attributes.mip_filter == xenos::TextureFilter::kPoint) {\n        components &= ~uint32_t(0b1000);\n      }\n      break;\n    case FetchOpcode::kSetTextureLod:\n    case FetchOpcode::kSetTextureGradientsHorz:\n    case FetchOpcode::kSetTextureGradientsVert:\n      components = 0b0000;\n      break;\n    default:\n      assert_unhandled_case(opcode);\n  }\n  return result.GetUsedResultComponents() & components;\n}\n\nstatic void ParseAluInstructionOperand(const AluInstruction& op, uint32_t i,\n                                       uint32_t swizzle_component_count,\n                                       InstructionOperand& out_op) {\n  out_op.is_negated = op.src_negate(i);\n  uint32_t reg = op.src_reg(i);\n  if (op.src_is_temp(i)) {\n    out_op.storage_source = InstructionStorageSource::kRegister;\n    out_op.storage_index = AluInstruction::src_temp_reg(reg);\n    out_op.is_absolute_value = AluInstruction::is_src_temp_value_absolute(reg);\n    out_op.storage_addressing_mode =\n        AluInstruction::is_src_temp_relative(reg)\n            ? InstructionStorageAddressingMode::kLoopRelative\n            : InstructionStorageAddressingMode::kAbsolute;\n  } else {\n    out_op.storage_source = InstructionStorageSource::kConstantFloat;\n    out_op.storage_index = reg;\n    if (op.src_const_is_addressed(i)) {\n      if (op.is_const_address_register_relative()) {\n        out_op.storage_addressing_mode =\n            InstructionStorageAddressingMode::kAddressRegisterRelative;\n      } else {\n        out_op.storage_addressing_mode =\n            InstructionStorageAddressingMode::kLoopRelative;\n      }\n    } else {\n      out_op.storage_addressing_mode =\n          InstructionStorageAddressingMode::kAbsolute;\n    }\n    out_op.is_absolute_value = op.abs_constants();\n  }\n  out_op.component_count = swizzle_component_count;\n  uint32_t swizzle = op.src_swizzle(i);\n  if (swizzle_component_count == 1) {\n    // Scalar `a` (W).\n    out_op.components[0] = GetSwizzledAluSourceComponent(swizzle, 3);\n  } else if (swizzle_component_count == 2) {\n    // Scalar left-hand `a` (W) and right-hand `b` (X).\n    out_op.components[0] = GetSwizzledAluSourceComponent(swizzle, 3);\n    out_op.components[1] = GetSwizzledAluSourceComponent(swizzle, 0);\n  } else if (swizzle_component_count == 3) {\n    assert_always();\n  } else if (swizzle_component_count == 4) {\n    for (uint32_t j = 0; j < swizzle_component_count; ++j) {\n      out_op.components[j] = GetSwizzledAluSourceComponent(swizzle, j);\n    }\n  }\n}\n\nbool ParsedAluInstruction::IsVectorOpDefaultNop() const {\n  if (vector_opcode != ucode::AluVectorOpcode::kMax ||\n      vector_and_constant_result.original_write_mask ||\n      vector_and_constant_result.is_clamped ||\n      vector_operands[0].storage_source !=\n          InstructionStorageSource::kRegister ||\n      vector_operands[0].storage_index != 0 ||\n      vector_operands[0].storage_addressing_mode !=\n          InstructionStorageAddressingMode::kAbsolute ||\n      vector_operands[0].is_negated || vector_operands[0].is_absolute_value ||\n      !vector_operands[0].IsStandardSwizzle() ||\n      vector_operands[1].storage_source !=\n          InstructionStorageSource::kRegister ||\n      vector_operands[1].storage_index != 0 ||\n      vector_operands[1].storage_addressing_mode !=\n          InstructionStorageAddressingMode::kAbsolute ||\n      vector_operands[1].is_negated || vector_operands[1].is_absolute_value ||\n      !vector_operands[1].IsStandardSwizzle()) {\n    return false;\n  }\n  if (vector_and_constant_result.storage_target ==\n      InstructionStorageTarget::kRegister) {\n    if (vector_and_constant_result.storage_index != 0 ||\n        vector_and_constant_result.storage_addressing_mode !=\n            InstructionStorageAddressingMode::kAbsolute) {\n      return false;\n    }\n  } else {\n    // In case both vector and scalar operations are nop, still need to write\n    // somewhere that it's an export, not mov r0._, r0 + retain_prev r0._.\n    // Accurate round trip is possible only if the target is o0 or oC0, because\n    // if the total write mask is empty, the XNA assembler forces the\n    // destination to be o0/oC0, but this doesn't really matter in this case.\n    if (IsScalarOpDefaultNop()) {\n      return false;\n    }\n  }\n  return true;\n}\n\nvoid ParseAluInstruction(const AluInstruction& op,\n                         xenos::ShaderType shader_type,\n                         ParsedAluInstruction& instr) {\n  instr.is_predicated = op.is_predicated();\n  instr.predicate_condition = op.predicate_condition();\n\n  bool is_export = op.is_export();\n\n  InstructionStorageTarget storage_target = InstructionStorageTarget::kRegister;\n  uint32_t storage_index_export = 0;\n  if (is_export) {\n    storage_target = InstructionStorageTarget::kNone;\n    // Both vector and scalar operation export to vector_dest.\n    ExportRegister export_register = ExportRegister(op.vector_dest());\n    if (export_register == ExportRegister::kExportAddress) {\n      storage_target = InstructionStorageTarget::kExportAddress;\n    } else if (export_register >= ExportRegister::kExportData0 &&\n               export_register <= ExportRegister::kExportData4) {\n      storage_target = InstructionStorageTarget::kExportData;\n      storage_index_export =\n          uint32_t(export_register) - uint32_t(ExportRegister::kExportData0);\n    } else if (shader_type == xenos::ShaderType::kVertex) {\n      if (export_register >= ExportRegister::kVSInterpolator0 &&\n          export_register <= ExportRegister::kVSInterpolator15) {\n        storage_target = InstructionStorageTarget::kInterpolator;\n        storage_index_export = uint32_t(export_register) -\n                               uint32_t(ExportRegister::kVSInterpolator0);\n      } else if (export_register == ExportRegister::kVSPosition) {\n        storage_target = InstructionStorageTarget::kPosition;\n      } else if (export_register ==\n                 ExportRegister::kVSPointSizeEdgeFlagKillVertex) {\n        storage_target = InstructionStorageTarget::kPointSizeEdgeFlagKillVertex;\n      }\n    } else if (shader_type == xenos::ShaderType::kPixel) {\n      if (export_register >= ExportRegister::kPSColor0 &&\n          export_register <= ExportRegister::kPSColor3) {\n        storage_target = InstructionStorageTarget::kColor;\n        storage_index_export =\n            uint32_t(export_register) - uint32_t(ExportRegister::kPSColor0);\n      } else if (export_register == ExportRegister::kPSDepth) {\n        storage_target = InstructionStorageTarget::kDepth;\n      }\n    }\n    if (storage_target == InstructionStorageTarget::kNone) {\n      assert_always();\n      XELOGE(\n          \"ShaderTranslator::ParseAluInstruction: Unsupported write to export \"\n          \"{}\",\n          uint32_t(export_register));\n    }\n  }\n\n  // Vector operation and constant 0/1 writes.\n\n  ucode::AluVectorOpcode vector_opcode = op.vector_opcode();\n  instr.vector_opcode = vector_opcode;\n  const ucode::AluVectorOpcodeInfo& vector_opcode_info =\n      ucode::GetAluVectorOpcodeInfo(vector_opcode);\n  instr.vector_opcode_name = vector_opcode_info.name;\n\n  instr.vector_and_constant_result.storage_target = storage_target;\n  instr.vector_and_constant_result.storage_addressing_mode =\n      InstructionStorageAddressingMode::kAbsolute;\n  if (is_export) {\n    instr.vector_and_constant_result.storage_index = storage_index_export;\n  } else {\n    instr.vector_and_constant_result.storage_index = op.vector_dest();\n    if (op.is_vector_dest_relative()) {\n      instr.vector_and_constant_result.storage_addressing_mode =\n          InstructionStorageAddressingMode::kLoopRelative;\n    }\n  }\n  instr.vector_and_constant_result.is_clamped = op.vector_clamp();\n  uint32_t constant_0_mask = op.GetConstant0WriteMask();\n  uint32_t constant_1_mask = op.GetConstant1WriteMask();\n  instr.vector_and_constant_result.original_write_mask =\n      op.GetVectorOpResultWriteMask() | constant_0_mask | constant_1_mask;\n  for (uint32_t i = 0; i < 4; ++i) {\n    SwizzleSource component = GetSwizzleFromComponentIndex(i);\n    if (constant_0_mask & (1 << i)) {\n      component = SwizzleSource::k0;\n    } else if (constant_1_mask & (1 << i)) {\n      component = SwizzleSource::k1;\n    }\n    instr.vector_and_constant_result.components[i] = component;\n  }\n\n  instr.vector_operand_count = vector_opcode_info.GetOperandCount();\n  for (uint32_t i = 0; i < instr.vector_operand_count; ++i) {\n    InstructionOperand& vector_operand = instr.vector_operands[i];\n    ParseAluInstructionOperand(op, i + 1, 4, vector_operand);\n  }\n\n  // Scalar operation.\n\n  ucode::AluScalarOpcode scalar_opcode = op.scalar_opcode();\n  instr.scalar_opcode = scalar_opcode;\n  const ucode::AluScalarOpcodeInfo& scalar_opcode_info =\n      ucode::GetAluScalarOpcodeInfo(scalar_opcode);\n  instr.scalar_opcode_name = scalar_opcode_info.name;\n\n  instr.scalar_result.storage_target = storage_target;\n  instr.scalar_result.storage_addressing_mode =\n      InstructionStorageAddressingMode::kAbsolute;\n  if (is_export) {\n    instr.scalar_result.storage_index = storage_index_export;\n  } else {\n    instr.scalar_result.storage_index = op.scalar_dest();\n    if (op.is_scalar_dest_relative()) {\n      instr.scalar_result.storage_addressing_mode =\n          InstructionStorageAddressingMode::kLoopRelative;\n    }\n  }\n  instr.scalar_result.is_clamped = op.scalar_clamp();\n  instr.scalar_result.original_write_mask = op.GetScalarOpResultWriteMask();\n  for (uint32_t i = 0; i < 4; ++i) {\n    instr.scalar_result.components[i] = GetSwizzleFromComponentIndex(i);\n  }\n\n  instr.scalar_operand_count = scalar_opcode_info.operand_count;\n  if (instr.scalar_operand_count) {\n    if (instr.scalar_operand_count == 1) {\n      ParseAluInstructionOperand(\n          op, 3, scalar_opcode_info.single_operand_is_two_component ? 2 : 1,\n          instr.scalar_operands[0]);\n    } else {\n      // Constant and temporary register.\n\n      bool src3_negate = op.src_negate(3);\n      uint32_t src3_swizzle = op.src_swizzle(3);\n\n      // Left-hand constant operand (`a` - W swizzle).\n      InstructionOperand& const_op = instr.scalar_operands[0];\n      const_op.is_negated = src3_negate;\n      const_op.is_absolute_value = op.abs_constants();\n      const_op.storage_source = InstructionStorageSource::kConstantFloat;\n      const_op.storage_index = op.src_reg(3);\n      if (op.src_const_is_addressed(3)) {\n        if (op.is_const_address_register_relative()) {\n          const_op.storage_addressing_mode =\n              InstructionStorageAddressingMode::kAddressRegisterRelative;\n        } else {\n          const_op.storage_addressing_mode =\n              InstructionStorageAddressingMode::kLoopRelative;\n        }\n      } else {\n        const_op.storage_addressing_mode =\n            InstructionStorageAddressingMode::kAbsolute;\n      }\n      const_op.component_count = 1;\n      const_op.components[0] = GetSwizzledAluSourceComponent(src3_swizzle, 3);\n\n      // Right-hand temporary register operand (`b` - X swizzle).\n      InstructionOperand& temp_op = instr.scalar_operands[1];\n      temp_op.is_negated = src3_negate;\n      temp_op.is_absolute_value = op.abs_constants();\n      temp_op.storage_source = InstructionStorageSource::kRegister;\n      temp_op.storage_index = op.scalar_const_reg_op_src_temp_reg();\n      temp_op.storage_addressing_mode =\n          InstructionStorageAddressingMode::kAbsolute;\n      temp_op.component_count = 1;\n      temp_op.components[0] = GetSwizzledAluSourceComponent(src3_swizzle, 0);\n    }\n  }\n}\n\nbool ParsedAluInstruction::IsScalarOpDefaultNop() const {\n  if (scalar_opcode != ucode::AluScalarOpcode::kRetainPrev ||\n      scalar_result.original_write_mask || scalar_result.is_clamped) {\n    return false;\n  }\n  if (scalar_result.storage_target == InstructionStorageTarget::kRegister) {\n    if (scalar_result.storage_index != 0 ||\n        scalar_result.storage_addressing_mode !=\n            InstructionStorageAddressingMode::kAbsolute) {\n      return false;\n    }\n  }\n  // For exports, if both are nop, the vector operation will be kept to state in\n  // the microcode that the destination in the microcode is an export.\n  return true;\n}\n\nbool ParsedAluInstruction::IsNop() const {\n  return scalar_opcode == ucode::AluScalarOpcode::kRetainPrev &&\n         !scalar_result.GetUsedWriteMask() &&\n         !vector_and_constant_result.GetUsedWriteMask() &&\n         !ucode::GetAluVectorOpcodeInfo(vector_opcode).changed_state;\n}\n\nuint32_t ParsedAluInstruction::GetMemExportStreamConstant() const {\n  if (vector_and_constant_result.storage_target ==\n          InstructionStorageTarget::kExportAddress &&\n      vector_opcode == ucode::AluVectorOpcode::kMad &&\n      vector_and_constant_result.GetUsedResultComponents() == 0b1111 &&\n      !vector_and_constant_result.is_clamped &&\n      vector_operands[2].storage_source ==\n          InstructionStorageSource::kConstantFloat &&\n      vector_operands[2].storage_addressing_mode ==\n          InstructionStorageAddressingMode::kAbsolute &&\n      vector_operands[2].IsStandardSwizzle() &&\n      !vector_operands[2].is_negated && !vector_operands[2].is_absolute_value) {\n    return vector_operands[2].storage_index;\n  }\n  return UINT32_MAX;\n}\n\n}  // namespace gpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/shader_translator.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2015 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_SHADER_TRANSLATOR_H_\n#define XENIA_GPU_SHADER_TRANSLATOR_H_\n\n#include <memory>\n#include <set>\n#include <string>\n#include <vector>\n\n#include \"xenia/base/math.h\"\n#include \"xenia/base/string_buffer.h\"\n#include \"xenia/gpu/registers.h\"\n#include \"xenia/gpu/shader.h\"\n#include \"xenia/gpu/ucode.h\"\n#include \"xenia/gpu/xenos.h\"\n\nnamespace xe {\nnamespace gpu {\n\nclass ShaderTranslator {\n public:\n  virtual ~ShaderTranslator();\n\n  virtual uint64_t GetDefaultVertexShaderModification(\n      uint32_t dynamic_addressable_register_count,\n      Shader::HostVertexShaderType host_vertex_shader_type =\n          Shader::HostVertexShaderType::kVertex) const {\n    return 0;\n  }\n  virtual uint64_t GetDefaultPixelShaderModification(\n      uint32_t dynamic_addressable_register_count) const {\n    return 0;\n  }\n\n  // AnalyzeUcode must be done on the shader before translating!\n  bool TranslateAnalyzedShader(Shader::Translation& translation);\n\n protected:\n  ShaderTranslator();\n\n  // Resets translator state before beginning translation.\n  virtual void Reset();\n\n  // Shader and modification currently being translated.\n  Shader::Translation& current_translation() const { return *translation_; }\n  Shader& current_shader() const { return current_translation().shader(); }\n\n  // Register count from SQ_PROGRAM_CNTL, stored by the implementation in its\n  // modification bits.\n  virtual uint32_t GetModificationRegisterCount() const {\n    return xenos::kMaxShaderTempRegisters;\n  }\n\n  // True if the current shader is a vertex shader.\n  bool is_vertex_shader() const {\n    return current_shader().type() == xenos::ShaderType::kVertex;\n  }\n  // True if the current shader is a pixel shader.\n  bool is_pixel_shader() const {\n    return current_shader().type() == xenos::ShaderType::kPixel;\n  }\n\n  // Temporary register count, accessible via static and dynamic addressing.\n  uint32_t register_count() const { return register_count_; }\n\n  // Emits a translation error that will be passed back in the result.\n  virtual void EmitTranslationError(const char* message, bool is_fatal = true);\n\n  // Handles the start of translation.\n  // At this point the vertex and texture bindings have been gathered.\n  virtual void StartTranslation() {}\n\n  // Handles the end of translation when all ucode has been processed.\n  // Returns the translated shader binary.\n  virtual std::vector<uint8_t> CompleteTranslation() {\n    return std::vector<uint8_t>();\n  }\n\n  // Handles post-translation tasks when the shader has been fully translated.\n  virtual void PostTranslation() {}\n  // Sets the host disassembly on a shader.\n  void set_host_disassembly(Shader::Translation& translation,\n                            std::string value) {\n    translation.host_disassembly_ = std::move(value);\n  }\n\n  // Pre-process a control-flow instruction before anything else.\n  virtual void PreProcessControlFlowInstructions(\n      std::vector<ucode::ControlFlowInstruction> instrs) {}\n\n  // Handles translation for control flow label addresses.\n  // This is triggered once for each label required (due to control flow\n  // operations) before any of the instructions within the target exec.\n  virtual void ProcessLabel(uint32_t cf_index) {}\n\n  // Handles translation for control flow nop instructions.\n  virtual void ProcessControlFlowNopInstruction(uint32_t cf_index) {}\n  // Handles the start of a control flow instruction at the given address.\n  virtual void ProcessControlFlowInstructionBegin(uint32_t cf_index) {}\n  // Handles the end of a control flow instruction that began at the given\n  // address.\n  virtual void ProcessControlFlowInstructionEnd(uint32_t cf_index) {}\n  // Handles translation for control flow exec instructions prior to their\n  // contained ALU/fetch instructions.\n  virtual void ProcessExecInstructionBegin(const ParsedExecInstruction& instr) {\n  }\n  // Handles translation for control flow exec instructions after their\n  // contained ALU/fetch instructions.\n  virtual void ProcessExecInstructionEnd(const ParsedExecInstruction& instr) {}\n  // Handles translation for loop start instructions.\n  virtual void ProcessLoopStartInstruction(\n      const ParsedLoopStartInstruction& instr) {}\n  // Handles translation for loop end instructions.\n  virtual void ProcessLoopEndInstruction(\n      const ParsedLoopEndInstruction& instr) {}\n  // Handles translation for function call instructions.\n  virtual void ProcessCallInstruction(const ParsedCallInstruction& instr) {}\n  // Handles translation for function return instructions.\n  virtual void ProcessReturnInstruction(const ParsedReturnInstruction& instr) {}\n  // Handles translation for jump instructions.\n  virtual void ProcessJumpInstruction(const ParsedJumpInstruction& instr) {}\n  // Handles translation for alloc instructions. Memory exports for eM#\n  // indicated by export_eM must be performed, regardless of the alloc type.\n  virtual void ProcessAllocInstruction(const ParsedAllocInstruction& instr,\n                                       uint8_t export_eM) {}\n\n  // Handles translation for vertex fetch instructions.\n  virtual void ProcessVertexFetchInstruction(\n      const ParsedVertexFetchInstruction& instr) {}\n  // Handles translation for texture fetch instructions.\n  virtual void ProcessTextureFetchInstruction(\n      const ParsedTextureFetchInstruction& instr) {}\n  // Handles translation for ALU instructions.\n  // memexport_eM_potentially_written_before needs to be handled by `kill`\n  // instruction to make sure memory exports for the eM# writes earlier in\n  // previous execs and the current exec are done before the invocation becomes\n  // inactive.\n  virtual void ProcessAluInstruction(\n      const ParsedAluInstruction& instr,\n      uint8_t memexport_eM_potentially_written_before) {}\n\n private:\n  void TranslateControlFlowInstruction(const ucode::ControlFlowInstruction& cf);\n  void TranslateExecInstructions(const ParsedExecInstruction& instr);\n\n  // Current shader and modification being translated.\n  Shader::Translation* translation_ = nullptr;\n\n  // Accumulated translation errors.\n  std::vector<Shader::Error> errors_;\n\n  // Temporary register count, accessible via static and dynamic addressing.\n  uint32_t register_count_ = 0;\n\n  // Current control flow dword index.\n  uint32_t cf_index_ = 0;\n\n  // Kept for supporting vfetch_mini.\n  ucode::VertexFetchInstruction previous_vfetch_full_;\n};\n\n}  // namespace gpu\n}  // namespace xe\n\n#endif  // XENIA_GPU_SHADER_TRANSLATOR_H_\n"
  },
  {
    "path": "src/xenia/gpu/shader_translator_disasm.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2015 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/shader_translator.h\"\n\n#include <cstdarg>\n#include <set>\n#include <string>\n\n#include \"xenia/base/math.h\"\n\nnamespace xe {\nnamespace gpu {\n\nusing namespace ucode;\n\nvoid DisassembleResultOperand(const InstructionResult& result,\n                              StringBuffer* out) {\n  bool uses_storage_index = false;\n  switch (result.storage_target) {\n    case InstructionStorageTarget::kRegister:\n      out->Append('r');\n      uses_storage_index = true;\n      break;\n    case InstructionStorageTarget::kInterpolator:\n      out->Append('o');\n      uses_storage_index = true;\n      break;\n    case InstructionStorageTarget::kPosition:\n      out->Append(\"oPos\");\n      break;\n    case InstructionStorageTarget::kPointSizeEdgeFlagKillVertex:\n      out->Append(\"oPts\");\n      break;\n    case InstructionStorageTarget::kExportAddress:\n      out->Append(\"eA\");\n      break;\n    case InstructionStorageTarget::kExportData:\n      out->Append(\"eM\");\n      uses_storage_index = true;\n      break;\n    case InstructionStorageTarget::kColor:\n      out->Append(\"oC\");\n      uses_storage_index = true;\n      break;\n    case InstructionStorageTarget::kDepth:\n      out->Append(\"oDepth\");\n      break;\n    case InstructionStorageTarget::kNone:\n      break;\n  }\n  if (uses_storage_index) {\n    switch (result.storage_addressing_mode) {\n      case InstructionStorageAddressingMode::kAbsolute:\n        out->AppendFormat(\"{}\", result.storage_index);\n        break;\n      case InstructionStorageAddressingMode::kAddressRegisterRelative:\n        out->AppendFormat(\"[{}+a0]\", result.storage_index);\n        break;\n      case InstructionStorageAddressingMode::kLoopRelative:\n        out->AppendFormat(\"[{}+aL]\", result.storage_index);\n        break;\n    }\n  }\n  // Not using GetUsedWriteMask/IsStandardSwizzle because they filter out\n  // components not having any runtime effect, but those components are still\n  // present in the microcode.\n  if (!result.original_write_mask) {\n    out->Append(\"._\");\n  } else if (result.original_write_mask != 0b1111 ||\n             result.components[0] != SwizzleSource::kX ||\n             result.components[1] != SwizzleSource::kY ||\n             result.components[2] != SwizzleSource::kZ ||\n             result.components[3] != SwizzleSource::kW) {\n    out->Append('.');\n    for (int i = 0; i < 4; ++i) {\n      if (result.original_write_mask & (1 << i)) {\n        out->Append(GetCharForSwizzle(result.components[i]));\n      } else {\n        out->Append('_');\n      }\n    }\n  }\n}\n\nvoid DisassembleSourceOperand(const InstructionOperand& op, StringBuffer* out) {\n  if (op.is_negated) {\n    out->Append('-');\n  }\n  switch (op.storage_source) {\n    case InstructionStorageSource::kRegister:\n      out->Append('r');\n      break;\n    case InstructionStorageSource::kConstantFloat:\n      out->Append('c');\n      break;\n    case InstructionStorageSource::kTextureFetchConstant:\n    case InstructionStorageSource::kVertexFetchConstant:\n      assert_always();\n      break;\n  }\n  if (op.is_absolute_value) {\n    out->Append(\"_abs\");\n  }\n  switch (op.storage_addressing_mode) {\n    case InstructionStorageAddressingMode::kAbsolute:\n      if (op.is_absolute_value) {\n        out->AppendFormat(\"[{}]\", op.storage_index);\n      } else {\n        out->AppendFormat(\"{}\", op.storage_index);\n      }\n      break;\n    case InstructionStorageAddressingMode::kAddressRegisterRelative:\n      out->AppendFormat(\"[{}+a0]\", op.storage_index);\n      break;\n    case InstructionStorageAddressingMode::kLoopRelative:\n      out->AppendFormat(\"[{}+aL]\", op.storage_index);\n      break;\n  }\n  if (!op.IsStandardSwizzle()) {\n    out->Append('.');\n    if (op.component_count == 1) {\n      out->Append(GetCharForSwizzle(op.components[0]));\n    } else if (op.component_count == 2) {\n      out->Append(GetCharForSwizzle(op.components[0]));\n      out->Append(GetCharForSwizzle(op.components[1]));\n    } else {\n      for (uint32_t j = 0; j < op.component_count; ++j) {\n        out->Append(GetCharForSwizzle(op.components[j]));\n      }\n    }\n  }\n}\n\nvoid ParsedExecInstruction::Disassemble(StringBuffer* out) const {\n  switch (type) {\n    case Type::kUnconditional:\n      out->AppendFormat(\"      {}\", opcode_name);\n      break;\n    case Type::kPredicated:\n      out->Append(condition ? \" (p0) \" : \"(!p0) \");\n      out->AppendFormat(\"{}\", opcode_name);\n      break;\n    case Type::kConditional:\n      out->AppendFormat(\"      {} {}b{}\", opcode_name, condition ? \"\" : \"!\",\n                        bool_constant_index);\n      break;\n  }\n  if (is_yield) {\n    if (type == Type::kConditional) {\n      // For `exec` or `(p0) exec` (but not `cexec`), \"unexpected token ','\" if\n      // preceded by a comma.\n      out->Append(',');\n    }\n    out->Append(\" Yield=true\");\n  }\n  if (!is_predicate_clean) {\n    out->Append(\"    // PredicateClean=false\");\n  }\n  out->Append('\\n');\n}\n\nvoid ParsedLoopStartInstruction::Disassemble(StringBuffer* out) const {\n  out->Append(\"      loop \");\n  out->AppendFormat(\"i{}, L{}\", loop_constant_index, loop_skip_address);\n  if (is_repeat) {\n    out->Append(\", Repeat=true\");\n  }\n  out->Append('\\n');\n}\n\nvoid ParsedLoopEndInstruction::Disassemble(StringBuffer* out) const {\n  if (is_predicated_break) {\n    out->Append(predicate_condition ? \" (p0) \" : \"(!p0) \");\n  } else {\n    out->Append(\"      \");\n  }\n  out->AppendFormat(\"endloop i{}, L{}\", loop_constant_index, loop_body_address);\n  out->Append('\\n');\n}\n\nvoid ParsedCallInstruction::Disassemble(StringBuffer* out) const {\n  switch (type) {\n    case Type::kUnconditional:\n      out->Append(\"      call \");\n      break;\n    case Type::kPredicated:\n      out->Append(condition ? \" (p0) \" : \"(!p0) \");\n      out->Append(\"call \");\n      break;\n    case Type::kConditional:\n      out->Append(\"      ccall \");\n      if (!condition) {\n        out->Append('!');\n      }\n      out->AppendFormat(\"b{}, \", bool_constant_index);\n      break;\n  }\n  out->AppendFormat(\"L{}\", target_address);\n  out->Append('\\n');\n}\n\nvoid ParsedReturnInstruction::Disassemble(StringBuffer* out) const {\n  out->Append(\"      ret\\n\");\n}\n\nvoid ParsedJumpInstruction::Disassemble(StringBuffer* out) const {\n  switch (type) {\n    case Type::kUnconditional:\n      out->Append(\"      jmp \");\n      break;\n    case Type::kPredicated:\n      out->Append(condition ? \" (p0) \" : \"(!p0) \");\n      out->Append(\"jmp \");\n      break;\n    case Type::kConditional:\n      out->Append(\"      cjmp \");\n      if (!condition) {\n        out->Append('!');\n      }\n      out->AppendFormat(\"b{}, \", bool_constant_index);\n      break;\n  }\n  out->AppendFormat(\"L{}\", target_address);\n  out->Append('\\n');\n}\n\nvoid ParsedAllocInstruction::Disassemble(StringBuffer* out) const {\n  out->Append(\"      alloc \");\n  switch (type) {\n    case AllocType::kNone:\n      break;\n    case AllocType::kVsPosition:\n      out->Append(\"position\");\n      break;\n    case AllocType::kVsInterpolators:  // or AllocType::kPsColors\n      if (is_vertex_shader) {\n        out->Append(\"interpolators\");\n      } else {\n        out->Append(\"colors\");\n      }\n      break;\n    case AllocType::kMemory:\n      out->AppendFormat(\"export = {}\", count);\n      break;\n  }\n  out->Append('\\n');\n}\n\nvoid ParsedVertexFetchInstruction::Disassemble(StringBuffer* out) const {\n  static const struct {\n    const char* name;\n  } kVertexFetchDataFormats[0xff] = {\n#define TYPE(id) {#id}\n      {0},\n      {0},\n      {0},\n      {0},\n      {0},\n      {0},\n      TYPE(FMT_8_8_8_8),     // 6\n      TYPE(FMT_2_10_10_10),  // 7\n      {0},\n      {0},\n      {0},\n      {0},\n      {0},\n      {0},\n      {0},\n      {0},\n      TYPE(FMT_10_11_11),  // 16\n      TYPE(FMT_11_11_10),  // 17\n      {0},\n      {0},\n      {0},\n      {0},\n      {0},\n      {0},\n      {0},\n      TYPE(FMT_16_16),        // 25\n      TYPE(FMT_16_16_16_16),  // 26\n      {0},\n      {0},\n      {0},\n      {0},\n      TYPE(FMT_16_16_FLOAT),        // 31\n      TYPE(FMT_16_16_16_16_FLOAT),  // 32\n      TYPE(FMT_32),                 // 33\n      TYPE(FMT_32_32),              // 34\n      TYPE(FMT_32_32_32_32),        // 35\n      TYPE(FMT_32_FLOAT),           // 36\n      TYPE(FMT_32_32_FLOAT),        // 37\n      TYPE(FMT_32_32_32_32_FLOAT),  // 38\n      {0},\n      {0},\n      {0},\n      {0},\n      {0},\n      {0},\n      {0},\n      {0},\n      {0},\n      {0},\n      {0},\n      {0},\n      {0},\n      {0},\n      {0},\n      {0},\n      {0},\n      {0},\n      TYPE(FMT_32_32_32_FLOAT),  // 57\n#undef TYPE\n  };\n  out->Append(\"   \");\n  if (is_predicated) {\n    out->Append(predicate_condition ? \" (p0) \" : \"(!p0) \");\n  } else {\n    out->Append(\"      \");\n  }\n  out->Append(opcode_name);\n  out->Append(' ');\n  DisassembleResultOperand(result, out);\n  if (!is_mini_fetch) {\n    out->Append(\", \");\n    DisassembleSourceOperand(operands[0], out);\n    out->AppendFormat(\", vf{}\", 95 - operands[1].storage_index);\n    if (attributes.is_index_rounded) {\n      out->Append(\", RoundIndex=true\");\n    }\n  }\n\n  if (attributes.exp_adjust) {\n    out->AppendFormat(\", ExpAdjust={}\", attributes.exp_adjust);\n  }\n  if (attributes.offset) {\n    out->AppendFormat(\", Offset={}\", attributes.offset);\n  }\n  if (attributes.data_format != xenos::VertexFormat::kUndefined) {\n    out->AppendFormat(\n        \", DataFormat={}\",\n        kVertexFetchDataFormats[static_cast<int>(attributes.data_format)].name);\n  }\n  if (!is_mini_fetch && attributes.stride) {\n    out->AppendFormat(\", Stride={}\", attributes.stride);\n  }\n  if (attributes.is_signed) {\n    out->Append(\", Signed=true\");\n  }\n  if (attributes.is_integer) {\n    out->Append(\", NumFormat=integer\");\n  }\n  if (attributes.prefetch_count) {\n    out->AppendFormat(\", PrefetchCount={}\", attributes.prefetch_count + 1);\n  }\n\n  out->Append('\\n');\n}\n\nvoid ParsedTextureFetchInstruction::Disassemble(StringBuffer* out) const {\n  static const char* kTextureFilterNames[] = {\n      \"point\",\n      \"linear\",\n      \"basemap\",\n      \"keep\",\n  };\n  static const char* kAnisoFilterNames[] = {\n      \"disabled\", \"max1to1\",  \"max2to1\", \"max4to1\",\n      \"max8to1\",  \"max16to1\", \"keep\",\n  };\n\n  out->Append(\"   \");\n  if (is_predicated) {\n    out->Append(predicate_condition ? \" (p0) \" : \"(!p0) \");\n  } else {\n    out->Append(\"      \");\n  }\n  out->Append(opcode_name);\n  out->Append(' ');\n  bool needs_comma = false;\n  if (has_result()) {\n    DisassembleResultOperand(result, out);\n    needs_comma = true;\n  }\n  if (needs_comma) {\n    out->Append(\", \");\n  }\n  DisassembleSourceOperand(operands[0], out);\n  if (operand_count > 1) {\n    if (needs_comma) {\n      out->Append(\", \");\n    }\n    out->AppendFormat(\"tf{}\", operands[1].storage_index);\n  }\n\n  if (!attributes.fetch_valid_only) {\n    out->Append(\", FetchValidOnly=false\");\n  }\n  if (attributes.unnormalized_coordinates) {\n    out->Append(\", UnnormalizedTextureCoords=true\");\n  }\n  if (attributes.mag_filter != xenos::TextureFilter::kUseFetchConst) {\n    out->AppendFormat(\n        \", MagFilter={}\",\n        kTextureFilterNames[static_cast<int>(attributes.mag_filter)]);\n  }\n  if (attributes.min_filter != xenos::TextureFilter::kUseFetchConst) {\n    out->AppendFormat(\n        \", MinFilter={}\",\n        kTextureFilterNames[static_cast<int>(attributes.min_filter)]);\n  }\n  if (attributes.mip_filter != xenos::TextureFilter::kUseFetchConst) {\n    out->AppendFormat(\n        \", MipFilter={}\",\n        kTextureFilterNames[static_cast<int>(attributes.mip_filter)]);\n  }\n  if (attributes.aniso_filter != xenos::AnisoFilter::kUseFetchConst) {\n    out->AppendFormat(\n        \", AnisoFilter={}\",\n        kAnisoFilterNames[static_cast<int>(attributes.aniso_filter)]);\n  }\n  if (attributes.vol_mag_filter != xenos::TextureFilter::kUseFetchConst) {\n    out->AppendFormat(\n        \", VolMagFilter={}\",\n        kTextureFilterNames[static_cast<int>(attributes.vol_mag_filter)]);\n  }\n  if (attributes.vol_min_filter != xenos::TextureFilter::kUseFetchConst) {\n    out->AppendFormat(\n        \", VolMinFilter={}\",\n        kTextureFilterNames[static_cast<int>(attributes.vol_min_filter)]);\n  }\n  if (!attributes.use_computed_lod) {\n    out->Append(\", UseComputedLOD=false\");\n  }\n  if (attributes.use_register_lod) {\n    out->Append(\", UseRegisterLOD=true\");\n  }\n  if (attributes.use_register_gradients) {\n    out->Append(\", UseRegisterGradients=true\");\n  }\n  if (attributes.lod_bias != 0.0f) {\n    out->AppendFormat(\", LODBias={:g}\", attributes.lod_bias);\n  }\n  int component_count = xenos::GetFetchOpDimensionComponentCount(dimension);\n  if (attributes.offset_x != 0.0f) {\n    out->AppendFormat(\", OffsetX={:g}\", attributes.offset_x);\n  }\n  if (component_count > 1 && attributes.offset_y != 0.0f) {\n    out->AppendFormat(\", OffsetY={:g}\", attributes.offset_y);\n  }\n  if (component_count > 2 && attributes.offset_z != 0.0f) {\n    out->AppendFormat(\", OffsetZ={:g}\", attributes.offset_z);\n  }\n\n  out->Append('\\n');\n}\n\nvoid ParsedAluInstruction::Disassemble(StringBuffer* out) const {\n  bool is_vector_op_default_nop = IsVectorOpDefaultNop();\n  bool is_scalar_op_default_nop = IsScalarOpDefaultNop();\n  if (is_vector_op_default_nop && is_scalar_op_default_nop) {\n    out->Append(\"   \");\n    if (is_predicated) {\n      out->Append(predicate_condition ? \" (p0) \" : \"(!p0) \");\n    } else {\n      out->Append(\"      \");\n    }\n    out->Append(\"nop\\n\");\n    return;\n  }\n  if (!is_vector_op_default_nop) {\n    out->Append(\"   \");\n    if (is_predicated) {\n      out->Append(predicate_condition ? \" (p0) \" : \"(!p0) \");\n    } else {\n      out->Append(\"      \");\n    }\n    out->Append(vector_opcode_name);\n    if (vector_and_constant_result.is_clamped) {\n      out->Append(\"_sat\");\n    }\n    out->Append(' ');\n    DisassembleResultOperand(vector_and_constant_result, out);\n    for (uint32_t i = 0; i < vector_operand_count; ++i) {\n      out->Append(\", \");\n      DisassembleSourceOperand(vector_operands[i], out);\n    }\n    out->Append('\\n');\n  }\n  if (!is_scalar_op_default_nop) {\n    out->Append(is_vector_op_default_nop ? \"   \" : \"              + \");\n    if (is_predicated) {\n      out->Append(predicate_condition ? \" (p0) \" : \"(!p0) \");\n    } else {\n      out->Append(\"      \");\n    }\n    out->Append(scalar_opcode_name);\n    if (scalar_result.is_clamped) {\n      out->Append(\"_sat\");\n    }\n    out->Append(' ');\n    DisassembleResultOperand(scalar_result, out);\n    for (uint32_t i = 0; i < scalar_operand_count; ++i) {\n      out->Append(\", \");\n      DisassembleSourceOperand(scalar_operands[i], out);\n    }\n    out->Append('\\n');\n  }\n}\n\n}  // namespace gpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/shaders/adaptive_quad.hs.hlsl",
    "content": "#include \"xenos_draw.hlsli\"\n\nstruct XeHSConstantDataOutput {\n  float edges[4] : SV_TessFactor;\n  float inside[2] : SV_InsideTessFactor;\n};\n\nXeHSConstantDataOutput XePatchConstant(\n    InputPatch<XeHSControlPointInputAdaptive, 4> xe_input_patch) {\n  XeHSConstantDataOutput output = (XeHSConstantDataOutput)0;\n  uint i;\n\n  // 1.0 added to the factors according to the images in\n  // https://www.slideshare.net/blackdevilvikas/next-generation-graphics-programming-on-xbox-360\n  // (fractional_even also requires a factor of at least 2.0), to the min/max it\n  // has already been added on the CPU.\n\n  // Direct3D 12 (goes in a direction along the perimeter):\n  // [0] - between U0V1 and U0V0.\n  // [1] - between U0V0 and U1V0.\n  // [2] - between U1V0 and U1V1.\n  // [3] - between U1V1 and U0V1.\n  // Xbox 360 factors go along the perimeter too according to the example of\n  // edge factors in Next Generation Graphics Programming on Xbox 360.\n  // However, if v0->v1... that seems to be working for triangle patches applies\n  // here too, with the swizzle Xenia uses in domain shaders:\n  // [0] - between U0V0 and U1V0.\n  // [1] - between U1V0 and U1V1.\n  // [2] - between U1V1 and U0V1.\n  // [3] - between U0V1 and U0V0.\n  [unroll] for (i = 0u; i < 4u; ++i) {\n    output.edges[i] = xe_input_patch[(i + 3u) & 3u].edge_factor;\n  }\n\n  // On the Xbox 360, according to the presentation, the inside factor is the\n  // minimum of the factors of the edges along the axis.\n  // Direct3D 12:\n  // [0] - along U.\n  // [1] - along V.\n  output.inside[0u] = min(output.edges[1u], output.edges[3u]);\n  output.inside[1u] = min(output.edges[0u], output.edges[2u]);\n\n  return output;\n}\n\n[domain(\"quad\")]\n[partitioning(\"fractional_even\")]\n[outputtopology(\"triangle_cw\")]\n[outputcontrolpoints(1)]\n[patchconstantfunc(\"XePatchConstant\")]\nXeHSControlPointOutput main(\n    InputPatch<XeHSControlPointInputAdaptive, 4> xe_input_patch,\n    uint xe_primitive_id : SV_PrimitiveID) {\n  XeHSControlPointOutput output;\n  // Only the lower 24 bits of the vertex index are used (tested on an Adreno\n  // 200 phone). `((index & 0xFFFFFF) + offset) & 0xFFFFFF` is the same as\n  // `(index + offset) & 0xFFFFFF`.\n  output.index =\n      float(clamp((xe_primitive_id + xe_vertex_index_offset) & 0xFFFFFFu,\n                  xe_vertex_index_min_max.x, xe_vertex_index_min_max.y));\n  return output;\n}\n"
  },
  {
    "path": "src/xenia/gpu/shaders/adaptive_triangle.hs.hlsl",
    "content": "#include \"xenos_draw.hlsli\"\n\nstruct XeHSConstantDataOutput {\n  float edges[3] : SV_TessFactor;\n  float inside : SV_InsideTessFactor;\n};\n\nXeHSConstantDataOutput XePatchConstant(\n    InputPatch<XeHSControlPointInputAdaptive, 3> xe_input_patch) {\n  XeHSConstantDataOutput output = (XeHSConstantDataOutput)0;\n  uint i;\n\n  // Factors for adaptive tessellation are taken from the index buffer.\n\n  // 1.0 added to the factors according to the images in\n  // https://www.slideshare.net/blackdevilvikas/next-generation-graphics-programming-on-xbox-360\n  // (fractional_even also requires a factor of at least 2.0), to the min/max it\n  // has already been added on the CPU.\n\n  // Fork phase.\n  // It appears that on the Xbox 360:\n  // - [0] is the factor for the v0->v1 edge.\n  // - [1] is the factor for the v1->v2 edge.\n  // - [2] is the factor for the v2->v0 edge.\n  // Where v0 is the U1V0W0 vertex, v1 is the U0V1W0 vertex, and v2 is the\n  // U0V0W1 vertex.\n  // The hint at the order was provided in the Code Listing 15 of:\n  // http://www.uraldev.ru/files/download/21/Real-Time_Tessellation_on_GPU.pdf\n  // In Direct3D 12:\n  // - [0] is the factor for the U0 edge (v1->v2).\n  // - [1] is the factor for the V0 edge (v2->v0),\n  // - [2] is the factor for the W0 edge (v0->v1).\n  // Direct3D 12 provides barycentrics as X for v0, Y for v1, Z for v2.\n  // In Xenia's domain shaders, the barycentric coordinates are handled as:\n  // 1) vDomain.xyz -> r0.zyx by Xenia.\n  // 2) r0.zyx -> r0.zyx by the guest (because r1.y is set to 0 by Xenia, which\n  //    apparently means identity swizzle to games).\n  // 3) r0.z * v0 + r0.y * v1 + r0.x * v2 by the guest.\n  // With this order, there are no cracks in 4D5307E6 water.\n  [unroll] for (i = 0u; i < 3u; ++i) {\n    output.edges[i] = xe_input_patch[(i + 1u) % 3u].edge_factor;\n  }\n\n  // Join phase. vpc0, vpc1, vpc2 taken as inputs.\n  output.inside =\n      min(min(output.edges[0u], output.edges[1u]), output.edges[2u]);\n\n  return output;\n}\n\n[domain(\"tri\")]\n[partitioning(\"fractional_even\")]\n[outputtopology(\"triangle_cw\")]\n[outputcontrolpoints(1)]\n[patchconstantfunc(\"XePatchConstant\")]\nXeHSControlPointOutput main(\n    InputPatch<XeHSControlPointInputAdaptive, 3> xe_input_patch,\n    uint xe_primitive_id : SV_PrimitiveID) {\n  XeHSControlPointOutput output;\n  // Only the lower 24 bits of the vertex index are used (tested on an Adreno\n  // 200 phone). `((index & 0xFFFFFF) + offset) & 0xFFFFFF` is the same as\n  // `(index + offset) & 0xFFFFFF`.\n  output.index =\n      float(clamp((xe_primitive_id + xe_vertex_index_offset) & 0xFFFFFFu,\n                  xe_vertex_index_min_max.x, xe_vertex_index_min_max.y));\n  return output;\n}\n"
  },
  {
    "path": "src/xenia/gpu/shaders/apply_gamma_pwl.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#define XE_APPLY_GAMMA_COMPUTE\n#include \"apply_gamma_pwl.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/apply_gamma_pwl.ps.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"apply_gamma_pwl.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/apply_gamma_pwl.xesli",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"../../ui/shaders/xesl.xesli\"\n\nfloat XeApplyPWLGamma(uint input_value, uint2_xe ramp_value) {\n  // output = base + (multiplier * delta) / increment\n  // https://developer.amd.com/wordpress/media/2012/10/RRG-216M56-03oOEM.pdf\n  // The lower 6 bits of the base and the delta are 0 (though enforcing that in\n  // the shader is not necessary).\n  // The `(multiplier * delta) / increment` part may result in a nonzero value\n  // in the lower 6 bits of the result, however, so doing `* (1.0f / 64.0f)`\n  // instead of `>> 6` to preserve them (if the render target is 16bpc rather\n  // than 10bpc, for instance).\n  return saturate_xe(\n      (float(ramp_value.x) +\n       float((input_value & 7u) * ramp_value.y) * (1.0f / 8.0f)) *\n      (1.0f / (64.0f * 1023.0f)));\n}\n\n#ifdef XE_APPLY_GAMMA_COMPUTE\n#ifdef XE_APPLY_GAMMA_FXAA_LUMA\n  #define XE_APPLY_GAMMA_DEST_FORMAT image_format_rgba16f_xe\n#else\n  #define XE_APPLY_GAMMA_DEST_FORMAT image_format_rgb10_a2_xe\n#endif\npush_const_begin_xe(b0, space0)\n  uint2_xe xe_apply_gamma_size;\npush_const_end_xe\n#define LOCAL_SIZE_X_XE 16\n#define LOCAL_SIZE_Y_XE 8\n#define LOCAL_SIZE_Z_XE 1\nentry_bindings_begin_compute_xe\n  push_const_binding_xe(buffer(0))\n  entry_binding_next_xe\n  texture_xe(texture_buffer_uint_xe, xe_apply_gamma_ramp, set=0, binding=0, t0,\n             space0, texture(0))\n  entry_binding_next_xe\n  texture_xe(texture_2d_xe, xe_apply_gamma_source, set=1, binding=0, t1, space0,\n             texture(1))\n  entry_binding_next_xe\n  image_wo_xe(image_2d_xe, XE_APPLY_GAMMA_DEST_FORMAT, xe_apply_gamma_dest,\n              set=2, binding=0, u0, space0, texture(2))\nentry_bindings_end_inputs_begin_compute_xe\n  entry_in_global_thread_id_xe\nentry_inputs_end_code_begin_compute_xe\n  uint2_xe pixel_index = in_global_thread_id_xe.xy;\n  dont_flatten_xe\n  if (any(greater_than_equal_xe(pixel_index,\n                                push_const_xe(xe_apply_gamma_size)))) {\n    return;\n  }\n#else\nentry_outputs_begin_xe\n  entry_out_target_xe(float4_xe, xe_apply_gamma_dest, 0)\nentry_outputs_end_stage_inputs_begin_xe\nentry_stage_inputs_end_bindings_begin_pixel_xe\n  texture_xe(texture_buffer_uint_xe, xe_apply_gamma_ramp, set=0, binding=0, t0,\n             space0, texture(0))\n  entry_binding_next_xe\n  texture_xe(texture_2d_xe, xe_apply_gamma_source, set=1, binding=0, t1, space0,\n             texture(1))\nentry_bindings_end_inputs_begin_xe\n  entry_in_pixel_coord_xe\nentry_inputs_end_code_begin_xe\n  uint2_xe pixel_index = uint2_xe(in_pixel_coord_xe.xy);\n#endif  // XE_APPLY_GAMMA_COMPUTE\n  // UNORM conversion according to the Direct3D 10+ rules.\n  uint3_xe apply_gamma_input = uint3_xe(\n      texel_fetch_2d_xe(xe_apply_gamma_source, pixel_index, 0).rgb * 1023.0f +\n      0.5f);\n  // TODO(Triang3l): If this is ever used for gamma other than 128 entries for a\n  // 10bpc front buffer, handle the increment from DC_LUTA/B_CONTROL. Currently\n  // assuming it's 2^3 = 8, or 1024 / 128.\n  float4_xe apply_gamma_output;\n  apply_gamma_output.r = XeApplyPWLGamma(\n      apply_gamma_input.r,\n      texel_fetch_buffer_xe(xe_apply_gamma_ramp,\n                            (apply_gamma_input.r >> 3u) * 3u).rg);\n  apply_gamma_output.g = XeApplyPWLGamma(\n      apply_gamma_input.g,\n      texel_fetch_buffer_xe(xe_apply_gamma_ramp,\n                            (apply_gamma_input.g >> 3u) * 3u + 1u).rg);\n  apply_gamma_output.b = XeApplyPWLGamma(\n      apply_gamma_input.b,\n      texel_fetch_buffer_xe(xe_apply_gamma_ramp,\n                            (apply_gamma_input.b >> 3u) * 3u + 2u).rg);\n  #ifdef XE_APPLY_GAMMA_FXAA_LUMA\n    // Perceptual luma.\n    apply_gamma_output.a =\n        dot(apply_gamma_output.rgb, float3_xe(0.299f, 0.587f, 0.114f));\n  #else\n    apply_gamma_output.a = 1.0f;\n  #endif\n#ifdef XE_APPLY_GAMMA_COMPUTE\n  image_store_2d_rgba_xe(xe_apply_gamma_dest, pixel_index, apply_gamma_output);\nentry_code_end_compute_xe\n#else\n  out_xe(xe_apply_gamma_dest) = apply_gamma_output;\nentry_code_end_xe\n#endif\n"
  },
  {
    "path": "src/xenia/gpu/shaders/apply_gamma_pwl_fxaa_luma.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#define XE_APPLY_GAMMA_FXAA_LUMA\n#define XE_APPLY_GAMMA_COMPUTE\n#include \"apply_gamma_pwl.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/apply_gamma_pwl_fxaa_luma.ps.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#define XE_APPLY_GAMMA_FXAA_LUMA\n#include \"apply_gamma_pwl.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/apply_gamma_table.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#define XE_APPLY_GAMMA_COMPUTE\n#include \"apply_gamma_table.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/apply_gamma_table.ps.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"apply_gamma_table.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/apply_gamma_table.xesli",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"../../ui/shaders/xesl.xesli\"\n\n#ifdef XE_APPLY_GAMMA_COMPUTE\n#ifdef XE_APPLY_GAMMA_FXAA_LUMA\n  #define XE_APPLY_GAMMA_DEST_FORMAT image_format_rgba16f_xe\n#else\n  #define XE_APPLY_GAMMA_DEST_FORMAT image_format_rgb10_a2_xe\n#endif\npush_const_begin_xe(b0, space0)\n  uint2_xe xe_apply_gamma_size;\npush_const_end_xe\n#define LOCAL_SIZE_X_XE 16\n#define LOCAL_SIZE_Y_XE 8\n#define LOCAL_SIZE_Z_XE 1\nentry_bindings_begin_compute_xe\n  push_const_binding_xe(buffer(0))\n  entry_binding_next_xe\n  texture_xe(texture_buffer_xe, xe_apply_gamma_ramp, set=0, binding=0, t0,\n             space0, texture(0))\n  entry_binding_next_xe\n  texture_xe(texture_2d_xe, xe_apply_gamma_source, set=1, binding=0, t1,\n             space0, texture(1))\n  entry_binding_next_xe\n  image_wo_xe(image_2d_xe, XE_APPLY_GAMMA_DEST_FORMAT, xe_apply_gamma_dest,\n              set=2, binding=0, u0, space0, texture(2))\nentry_bindings_end_inputs_begin_compute_xe\n  entry_in_global_thread_id_xe\nentry_inputs_end_code_begin_compute_xe\n  uint2_xe pixel_index = in_global_thread_id_xe.xy;\n  dont_flatten_xe\n  if (any(greater_than_equal_xe(pixel_index,\n                                push_const_xe(xe_apply_gamma_size)))) {\n    return;\n  }\n#else\nentry_outputs_begin_xe\n  entry_out_target_xe(float4_xe, xe_apply_gamma_dest, 0)\nentry_outputs_end_stage_inputs_begin_xe\nentry_stage_inputs_end_bindings_begin_pixel_xe\n  texture_xe(texture_buffer_xe, xe_apply_gamma_ramp, set=0, binding=0, t0,\n             space0, texture(0))\n  entry_binding_next_xe\n  texture_xe(texture_2d_xe, xe_apply_gamma_source, set=1, binding=0, t1,\n             space0, texture(1))\nentry_bindings_end_inputs_begin_xe\n  entry_in_pixel_coord_xe\nentry_inputs_end_code_begin_xe\n  uint2_xe pixel_index = uint2_xe(in_pixel_coord_xe.xy);\n#endif  // XE_APPLY_GAMMA_COMPUTE\n  // UNORM conversion according to the Direct3D 10+ rules.\n  uint3_xe apply_gamma_input = uint3_xe(\n      texel_fetch_2d_xe(xe_apply_gamma_source, pixel_index, 0).rgb * 255.0f +\n      0.5f);\n  // The ramp has blue in bits 0:9, green in 10:19, red in 20:29 - BGR passed as\n  // an R10G10B10A2 buffer.\n  float4_xe apply_gamma_output;\n  apply_gamma_output.r =\n      texel_fetch_buffer_xe(xe_apply_gamma_ramp, apply_gamma_input.r).b;\n  apply_gamma_output.g =\n      texel_fetch_buffer_xe(xe_apply_gamma_ramp, apply_gamma_input.g).g;\n  apply_gamma_output.b =\n      texel_fetch_buffer_xe(xe_apply_gamma_ramp, apply_gamma_input.b).r;\n  #ifdef XE_APPLY_GAMMA_FXAA_LUMA\n    // Perceptual luma.\n    apply_gamma_output.a =\n        dot(apply_gamma_output.rgb, float3_xe(0.299f, 0.587f, 0.114f));\n  #else\n    // Perceptual luma.\n    apply_gamma_output.a = 1.0f;\n  #endif\n#ifdef XE_APPLY_GAMMA_COMPUTE\n  image_store_2d_rgba_xe(xe_apply_gamma_dest, pixel_index, apply_gamma_output);\nentry_code_end_compute_xe\n#else\n  out_xe(xe_apply_gamma_dest) = apply_gamma_output;\nentry_code_end_xe\n#endif\n"
  },
  {
    "path": "src/xenia/gpu/shaders/apply_gamma_table_fxaa_luma.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#define XE_APPLY_GAMMA_FXAA_LUMA\n#define XE_APPLY_GAMMA_COMPUTE\n#include \"apply_gamma_table.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/apply_gamma_table_fxaa_luma.ps.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#define XE_APPLY_GAMMA_FXAA_LUMA\n#include \"apply_gamma_table.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/.clang-format",
    "content": "DisableFormat: true\nSortIncludes: false\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/adaptive_quad_hs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer xe_system_cbuffer\n// {\n//\n//   uint xe_flags;                     // Offset:    0 Size:     4 [unused]\n//   float2 xe_tessellation_factor_range;// Offset:    4 Size:     8 [unused]\n//   uint xe_line_loop_closing_index;   // Offset:   12 Size:     4 [unused]\n//   uint xe_vertex_index_endian;       // Offset:   16 Size:     4 [unused]\n//   uint xe_vertex_index_offset;       // Offset:   20 Size:     4\n//   uint2 xe_vertex_index_min_max;     // Offset:   24 Size:     8\n//   float4 xe_user_clip_planes[6];     // Offset:   32 Size:    96 [unused]\n//   float3 xe_ndc_scale;               // Offset:  128 Size:    12 [unused]\n//   float xe_point_vertex_diameter_min;// Offset:  140 Size:     4 [unused]\n//   float3 xe_ndc_offset;              // Offset:  144 Size:    12 [unused]\n//   float xe_point_vertex_diameter_max;// Offset:  156 Size:     4 [unused]\n//   float2 xe_point_constant_diameter; // Offset:  160 Size:     8 [unused]\n//   float2 xe_point_screen_diameter_to_ndc_radius;// Offset:  168 Size:     8 [unused]\n//   uint4 xe_texture_swizzled_signs[2];// Offset:  176 Size:    32 [unused]\n//   uint xe_textures_resolution_scaled;// Offset:  208 Size:     4 [unused]\n//   uint2 xe_sample_count_log2;        // Offset:  212 Size:     8 [unused]\n//   float xe_alpha_test_reference;     // Offset:  220 Size:     4 [unused]\n//   uint xe_alpha_to_mask;             // Offset:  224 Size:     4 [unused]\n//   uint xe_edram_32bpp_tile_pitch_dwords_scaled;// Offset:  228 Size:     4 [unused]\n//   uint xe_edram_depth_base_dwords_scaled;// Offset:  232 Size:     4 [unused]\n//   float4 xe_color_exp_bias;          // Offset:  240 Size:    16 [unused]\n//   float2 xe_edram_poly_offset_front; // Offset:  256 Size:     8 [unused]\n//   float2 xe_edram_poly_offset_back;  // Offset:  264 Size:     8 [unused]\n//   uint4 xe_edram_stencil[2];         // Offset:  272 Size:    32 [unused]\n//   uint4 xe_edram_rt_base_dwords_scaled;// Offset:  304 Size:    16 [unused]\n//   uint4 xe_edram_rt_format_flags;    // Offset:  320 Size:    16 [unused]\n//   float4 xe_edram_rt_clamp[4];       // Offset:  336 Size:    64 [unused]\n//   uint4 xe_edram_rt_keep_mask[2];    // Offset:  400 Size:    32 [unused]\n//   uint4 xe_edram_rt_blend_factors_ops;// Offset:  432 Size:    16 [unused]\n//   float4 xe_edram_blend_constant;    // Offset:  448 Size:    16 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_system_cbuffer                 cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Patch Constant signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// SV_TessFactor            0   x           0 QUADEDGE   float   x   \n// SV_TessFactor            1   x           1 QUADEDGE   float   x   \n// SV_TessFactor            2   x           2 QUADEDGE   float   x   \n// SV_TessFactor            3   x           3 QUADEDGE   float   x   \n// SV_InsideTessFactor      0   x           4  QUADINT   float   x   \n// SV_InsideTessFactor      1   x           5  QUADINT   float   x   \n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// XETESSFACTOR             0   x           0     NONE   float   x   \n//\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// XEVERTEXID               0   x           0     NONE   float   x   \n//\n// Tessellation Domain   # of control points\n// -------------------- --------------------\n// Quadrilateral                           1\n//\n// Tessellation Output Primitive  Partitioning Type \n// ------------------------------ ------------------\n// Clockwise Triangles            Even Fractional   \n//\nhs_5_1\nhs_decls \ndcl_input_control_point_count 4\ndcl_output_control_point_count 1\ndcl_tessellator_domain domain_quad\ndcl_tessellator_partitioning partitioning_fractional_even\ndcl_tessellator_output_primitive output_triangle_cw\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][2], immediateIndexed, space=0\nhs_control_point_phase \ndcl_input vPrim\ndcl_output o0.x\ndcl_temps 1\niadd r0.x, vPrim, CB0[0][1].y\nand r0.x, r0.x, l(0x00ffffff)\numax r0.x, r0.x, CB0[0][1].z\numin r0.x, r0.x, CB0[0][1].w\nutof o0.x, r0.x\nret \nhs_fork_phase \ndcl_hs_fork_phase_instance_count 4\ndcl_input vForkInstanceID\ndcl_input vicp[4][0].x\ndcl_output_siv o0.x, finalQuadUeq0EdgeTessFactor\ndcl_output_siv o1.x, finalQuadVeq0EdgeTessFactor\ndcl_output_siv o2.x, finalQuadUeq1EdgeTessFactor\ndcl_output_siv o3.x, finalQuadVeq1EdgeTessFactor\ndcl_temps 1\ndcl_indexrange o0.x 4\niadd r0.x, vForkInstanceID.x, l(3)\nand r0.x, r0.x, l(3)\nmov r0.y, vForkInstanceID.x\nmov o[r0.y + 0].x, vicp[r0.x + 0][0].x\nret \nhs_fork_phase \ndcl_hs_fork_phase_instance_count 2\ndcl_input vForkInstanceID\ndcl_input vicp[4][0].x\ndcl_output_siv o4.x, finalQuadUInsideTessFactor\ndcl_output_siv o5.x, finalQuadVInsideTessFactor\ndcl_temps 1\ndcl_indexrange o4.x 2\nult r0.x, vForkInstanceID.x, l(1)\nmovc r0.x, r0.x, l(0), l(3)\nineg r0.y, vForkInstanceID.x\nmin r0.x, vicp[r0.y + 2][0].x, vicp[r0.x + 0][0].x\nmov r0.y, vForkInstanceID.x\nmov o[r0.y + 4].x, r0.x\nret \n// Approximately 18 instruction slots used\n#endif\n\nconst BYTE adaptive_quad_hs[] =\n{\n     68,  88,  66,  67, 219, 255, \n     95, 234, 102, 219, 156, 208, \n    233, 150, 227, 140,  59,  51, \n    198, 162,   1,   0,   0,   0, \n     48,  15,   0,   0,   6,   0, \n      0,   0,  56,   0,   0,   0, \n    116,  10,   0,   0, 172,  10, \n      0,   0, 224,  10,   0,   0, \n    164,  11,   0,   0, 148,  14, \n      0,   0,  82,  68,  69,  70, \n     52,  10,   0,   0,   1,   0, \n      0,   0, 120,   0,   0,   0, \n      1,   0,   0,   0,  60,   0, \n      0,   0,   1,   5,  83,  72, \n      0,   5,   0,   0,  10,  10, \n      0,   0,  19,  19,  68,  37, \n     60,   0,   0,   0,  24,   0, \n      0,   0,  40,   0,   0,   0, \n     40,   0,   0,   0,  36,   0, \n      0,   0,  12,   0,   0,   0, \n      0,   0,   0,   0, 100,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 120, 101,  95, 115, \n    121, 115, 116, 101, 109,  95, \n     99,  98, 117, 102, 102, 101, \n    114,   0, 171, 171, 100,   0, \n      0,   0,  30,   0,   0,   0, \n    144,   0,   0,   0, 208,   1, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  64,   5, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,  80,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 116,   5,   0,   0, \n      4,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n    152,   5,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    188,   5,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,  80,   5, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 215,   5, \n      0,   0,  16,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,  80,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 238,   5,   0,   0, \n     20,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n     80,   5,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n      5,   6,   0,   0,  24,   0, \n      0,   0,   8,   0,   0,   0, \n      2,   0,   0,   0,  36,   6, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  72,   6, \n      0,   0,  32,   0,   0,   0, \n     96,   0,   0,   0,   0,   0, \n      0,   0, 100,   6,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 136,   6,   0,   0, \n    128,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    156,   6,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    192,   6,   0,   0, 140,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0, 228,   6, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,   8,   7, \n      0,   0, 144,   0,   0,   0, \n     12,   0,   0,   0,   0,   0, \n      0,   0, 156,   6,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  22,   7,   0,   0, \n    156,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n    228,   6,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     51,   7,   0,   0, 160,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0, 152,   5, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  78,   7, \n      0,   0, 168,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0, 152,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 117,   7,   0,   0, \n    176,   0,   0,   0,  32,   0, \n      0,   0,   0,   0,   0,   0, \n    152,   7,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    188,   7,   0,   0, 208,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,  80,   5, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 218,   7, \n      0,   0, 212,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  36,   6,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 239,   7,   0,   0, \n    220,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n    228,   6,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n      7,   8,   0,   0, 224,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,  80,   5, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  24,   8, \n      0,   0, 228,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,  80,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  64,   8,   0,   0, \n    232,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n     80,   5,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     98,   8,   0,   0, 240,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0, 116,   8, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 152,   8, \n      0,   0,   0,   1,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0, 152,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 179,   8,   0,   0, \n      8,   1,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n    152,   5,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    205,   8,   0,   0,  16,   1, \n      0,   0,  32,   0,   0,   0, \n      0,   0,   0,   0, 224,   8, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,   4,   9, \n      0,   0,  48,   1,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  36,   9,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  72,   9,   0,   0, \n     64,   1,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     36,   9,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     97,   9,   0,   0,  80,   1, \n      0,   0,  64,   0,   0,   0, \n      0,   0,   0,   0, 116,   9, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 152,   9, \n      0,   0, 144,   1,   0,   0, \n     32,   0,   0,   0,   0,   0, \n      0,   0, 176,   9,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 212,   9,   0,   0, \n    176,   1,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     36,   9,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    242,   9,   0,   0, 192,   1, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0, 116,   8, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 120, 101, \n     95, 102, 108,  97, 103, 115, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  73,   5, \n      0,   0, 120, 101,  95, 116, \n    101, 115, 115, 101, 108, 108, \n     97, 116, 105, 111, 110,  95, \n    102,  97,  99, 116, 111, 114, \n     95, 114,  97, 110, 103, 101, \n      0, 102, 108, 111,  97, 116, \n     50,   0,   1,   0,   3,   0, \n      1,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 145,   5, \n      0,   0, 120, 101,  95, 108, \n    105, 110, 101,  95, 108, 111, \n    111, 112,  95,  99, 108, 111, \n    115, 105, 110, 103,  95, 105, \n    110, 100, 101, 120,   0, 120, \n    101,  95, 118, 101, 114, 116, \n    101, 120,  95, 105, 110, 100, \n    101, 120,  95, 101, 110, 100, \n    105,  97, 110,   0, 120, 101, \n     95, 118, 101, 114, 116, 101, \n    120,  95, 105, 110, 100, 101, \n    120,  95, 111, 102, 102, 115, \n    101, 116,   0, 120, 101,  95, \n    118, 101, 114, 116, 101, 120, \n     95, 105, 110, 100, 101, 120, \n     95, 109, 105, 110,  95, 109, \n     97, 120,   0, 117, 105, 110, \n    116,  50,   0, 171,   1,   0, \n     19,   0,   1,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     29,   6,   0,   0, 120, 101, \n     95, 117, 115, 101, 114,  95, \n     99, 108, 105, 112,  95, 112, \n    108,  97, 110, 101, 115,   0, \n    102, 108, 111,  97, 116,  52, \n      0, 171,   1,   0,   3,   0, \n      1,   0,   4,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  92,   6, \n      0,   0, 120, 101,  95, 110, \n    100,  99,  95, 115,  99,  97, \n    108, 101,   0, 102, 108, 111, \n     97, 116,  51,   0,   1,   0, \n      3,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    149,   6,   0,   0, 120, 101, \n     95, 112, 111, 105, 110, 116, \n     95, 118, 101, 114, 116, 101, \n    120,  95, 100, 105,  97, 109, \n    101, 116, 101, 114,  95, 109, \n    105, 110,   0, 102, 108, 111, \n     97, 116,   0, 171,   0,   0, \n      3,   0,   1,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    221,   6,   0,   0, 120, 101, \n     95, 110, 100,  99,  95, 111, \n    102, 102, 115, 101, 116,   0, \n    120, 101,  95, 112, 111, 105, \n    110, 116,  95, 118, 101, 114, \n    116, 101, 120,  95, 100, 105, \n     97, 109, 101, 116, 101, 114, \n     95, 109,  97, 120,   0, 120, \n    101,  95, 112, 111, 105, 110, \n    116,  95,  99, 111, 110, 115, \n    116,  97, 110, 116,  95, 100, \n    105,  97, 109, 101, 116, 101, \n    114,   0, 120, 101,  95, 112, \n    111, 105, 110, 116,  95, 115, \n     99, 114, 101, 101, 110,  95, \n    100, 105,  97, 109, 101, 116, \n    101, 114,  95, 116, 111,  95, \n    110, 100,  99,  95, 114,  97, \n    100, 105, 117, 115,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 115, 119, \n    105, 122, 122, 108, 101, 100, \n     95, 115, 105, 103, 110, 115, \n      0, 117, 105, 110, 116,  52, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   4,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    143,   7,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101, 115,  95, 114, 101, \n    115, 111, 108, 117, 116, 105, \n    111, 110,  95, 115,  99,  97, \n    108, 101, 100,   0, 120, 101, \n     95, 115,  97, 109, 112, 108, \n    101,  95,  99, 111, 117, 110, \n    116,  95, 108, 111, 103,  50, \n      0, 120, 101,  95,  97, 108, \n    112, 104,  97,  95, 116, 101, \n    115, 116,  95, 114, 101, 102, \n    101, 114, 101, 110,  99, 101, \n      0, 120, 101,  95,  97, 108, \n    112, 104,  97,  95, 116, 111, \n     95, 109,  97, 115, 107,   0, \n    120, 101,  95, 101, 100, 114, \n     97, 109,  95,  51,  50,  98, \n    112, 112,  95, 116, 105, 108, \n    101,  95, 112, 105, 116,  99, \n    104,  95, 100, 119, 111, 114, \n    100, 115,  95, 115,  99,  97, \n    108, 101, 100,   0, 120, 101, \n     95, 101, 100, 114,  97, 109, \n     95, 100, 101, 112, 116, 104, \n     95,  98,  97, 115, 101,  95, \n    100, 119, 111, 114, 100, 115, \n     95, 115,  99,  97, 108, 101, \n    100,   0, 120, 101,  95,  99, \n    111, 108, 111, 114,  95, 101, \n    120, 112,  95,  98, 105,  97, \n    115,   0,   1,   0,   3,   0, \n      1,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  92,   6, \n      0,   0, 120, 101,  95, 101, \n    100, 114,  97, 109,  95, 112, \n    111, 108, 121,  95, 111, 102, \n    102, 115, 101, 116,  95, 102, \n    114, 111, 110, 116,   0, 120, \n    101,  95, 101, 100, 114,  97, \n    109,  95, 112, 111, 108, 121, \n     95, 111, 102, 102, 115, 101, \n    116,  95,  98,  97,  99, 107, \n      0, 120, 101,  95, 101, 100, \n    114,  97, 109,  95, 115, 116, \n    101, 110,  99, 105, 108,   0, \n    171, 171,   1,   0,  19,   0, \n      1,   0,   4,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 143,   7, \n      0,   0, 120, 101,  95, 101, \n    100, 114,  97, 109,  95, 114, \n    116,  95,  98,  97, 115, 101, \n     95, 100, 119, 111, 114, 100, \n    115,  95, 115,  99,  97, 108, \n    101, 100,   0, 171,   1,   0, \n     19,   0,   1,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    143,   7,   0,   0, 120, 101, \n     95, 101, 100, 114,  97, 109, \n     95, 114, 116,  95, 102, 111, \n    114, 109,  97, 116,  95, 102, \n    108,  97, 103, 115,   0, 120, \n    101,  95, 101, 100, 114,  97, \n    109,  95, 114, 116,  95,  99, \n    108,  97, 109, 112,   0, 171, \n      1,   0,   3,   0,   1,   0, \n      4,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  92,   6,   0,   0, \n    120, 101,  95, 101, 100, 114, \n     97, 109,  95, 114, 116,  95, \n    107, 101, 101, 112,  95, 109, \n     97, 115, 107,   0, 171, 171, \n      1,   0,  19,   0,   1,   0, \n      4,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 143,   7,   0,   0, \n    120, 101,  95, 101, 100, 114, \n     97, 109,  95, 114, 116,  95, \n     98, 108, 101, 110, 100,  95, \n    102,  97,  99, 116, 111, 114, \n    115,  95, 111, 112, 115,   0, \n    120, 101,  95, 101, 100, 114, \n     97, 109,  95,  98, 108, 101, \n    110, 100,  95,  99, 111, 110, \n    115, 116,  97, 110, 116,   0, \n     77, 105,  99, 114, 111, 115, \n    111, 102, 116,  32,  40,  82, \n     41,  32,  72,  76,  83,  76, \n     32,  83, 104,  97, 100, 101, \n    114,  32,  67, 111, 109, 112, \n    105, 108, 101, 114,  32,  49, \n     48,  46,  49,   0, 171, 171, \n     73,  83,  71,  78,  48,   0, \n      0,   0,   1,   0,   0,   0, \n      8,   0,   0,   0,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   1,   0,   0,  88,  69, \n     84,  69,  83,  83,  70,  65, \n     67,  84,  79,  82,   0, 171, \n    171, 171,  79,  83,  71,  78, \n     44,   0,   0,   0,   1,   0, \n      0,   0,   8,   0,   0,   0, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   1,  14,   0,   0, \n     88,  69,  86,  69,  82,  84, \n     69,  88,  73,  68,   0, 171, \n     80,  67,  83,  71, 188,   0, \n      0,   0,   6,   0,   0,   0, \n      8,   0,   0,   0, 152,   0, \n      0,   0,   0,   0,   0,   0, \n     11,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  14,   0,   0, 152,   0, \n      0,   0,   1,   0,   0,   0, \n     11,   0,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n      1,  14,   0,   0, 152,   0, \n      0,   0,   2,   0,   0,   0, \n     11,   0,   0,   0,   3,   0, \n      0,   0,   2,   0,   0,   0, \n      1,  14,   0,   0, 152,   0, \n      0,   0,   3,   0,   0,   0, \n     11,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      1,  14,   0,   0, 166,   0, \n      0,   0,   0,   0,   0,   0, \n     12,   0,   0,   0,   3,   0, \n      0,   0,   4,   0,   0,   0, \n      1,  14,   0,   0, 166,   0, \n      0,   0,   1,   0,   0,   0, \n     12,   0,   0,   0,   3,   0, \n      0,   0,   5,   0,   0,   0, \n      1,  14,   0,   0,  83,  86, \n     95,  84, 101, 115, 115,  70, \n     97,  99, 116, 111, 114,   0, \n     83,  86,  95,  73, 110, 115, \n    105, 100, 101,  84, 101, 115, \n    115,  70,  97,  99, 116, 111, \n    114,   0, 171, 171,  83,  72, \n     69,  88, 232,   2,   0,   0, \n     81,   0,   3,   0, 186,   0, \n      0,   0, 113,   0,   0,   1, \n    147,  32,   0,   1, 148,   8, \n      0,   1, 149,  24,   0,   1, \n    150,  32,   0,   1, 151,  24, \n      0,   1, 106,   8,   0,   1, \n     89,   0,   0,   7,  70, 142, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0, 114,   0, \n      0,   1,  95,   0,   0,   2, \n      0, 176,   0,   0, 101,   0, \n      0,   3,  18,  32,  16,   0, \n      0,   0,   0,   0, 104,   0, \n      0,   2,   1,   0,   0,   0, \n     30,   0,   0,   8,  18,   0, \n     16,   0,   0,   0,   0,   0, \n      1, 176,   0,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0, 255, 255, 255,   0, \n     83,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  42, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     84,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  58, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     86,   0,   0,   5,  18,  32, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  62,   0,   0,   1, \n    115,   0,   0,   1, 153,   0, \n      0,   2,   4,   0,   0,   0, \n     95,   0,   0,   2,   0, 112, \n      1,   0,  95,   0,   0,   4, \n     18, 144,  33,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n    103,   0,   0,   4,  18,  32, \n     16,   0,   0,   0,   0,   0, \n     11,   0,   0,   0, 103,   0, \n      0,   4,  18,  32,  16,   0, \n      1,   0,   0,   0,  12,   0, \n      0,   0, 103,   0,   0,   4, \n     18,  32,  16,   0,   2,   0, \n      0,   0,  13,   0,   0,   0, \n    103,   0,   0,   4,  18,  32, \n     16,   0,   3,   0,   0,   0, \n     14,   0,   0,   0, 104,   0, \n      0,   2,   1,   0,   0,   0, \n     91,   0,   0,   4,  18,  32, \n     16,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,  30,   0, \n      0,   6,  18,   0,  16,   0, \n      0,   0,   0,   0,  10, 112, \n      1,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  54,   0,   0,   4, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  10, 112,   1,   0, \n     54,   0,   0,   8,  18,  32, \n    144,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  10, 144, \n    161,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  62,   0,   0,   1, \n    115,   0,   0,   1, 153,   0, \n      0,   2,   2,   0,   0,   0, \n     95,   0,   0,   2,   0, 112, \n      1,   0,  95,   0,   0,   4, \n     18, 144,  33,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n    103,   0,   0,   4,  18,  32, \n     16,   0,   4,   0,   0,   0, \n     15,   0,   0,   0, 103,   0, \n      0,   4,  18,  32,  16,   0, \n      5,   0,   0,   0,  16,   0, \n      0,   0, 104,   0,   0,   2, \n      1,   0,   0,   0,  91,   0, \n      0,   4,  18,  32,  16,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0,  79,   0,   0,   6, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10, 112,   1,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  55,   0,   0,   9, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  40,   0,   0,   4, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  10, 112,   1,   0, \n     51,   0,   0,  12,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10, 144, 225,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  10, 144, 161,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   4,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     10, 112,   1,   0,  54,   0, \n      0,   7,  18,  32, 208,   0, \n      4,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  62,   0,   0,   1, \n     83,  84,  65,  84, 148,   0, \n      0,   0,  18,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   3,   0, \n      0,   0,   5,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  11,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      3,   0,   0,   0,   4,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/adaptive_triangle_hs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer xe_system_cbuffer\n// {\n//\n//   uint xe_flags;                     // Offset:    0 Size:     4 [unused]\n//   float2 xe_tessellation_factor_range;// Offset:    4 Size:     8 [unused]\n//   uint xe_line_loop_closing_index;   // Offset:   12 Size:     4 [unused]\n//   uint xe_vertex_index_endian;       // Offset:   16 Size:     4 [unused]\n//   uint xe_vertex_index_offset;       // Offset:   20 Size:     4\n//   uint2 xe_vertex_index_min_max;     // Offset:   24 Size:     8\n//   float4 xe_user_clip_planes[6];     // Offset:   32 Size:    96 [unused]\n//   float3 xe_ndc_scale;               // Offset:  128 Size:    12 [unused]\n//   float xe_point_vertex_diameter_min;// Offset:  140 Size:     4 [unused]\n//   float3 xe_ndc_offset;              // Offset:  144 Size:    12 [unused]\n//   float xe_point_vertex_diameter_max;// Offset:  156 Size:     4 [unused]\n//   float2 xe_point_constant_diameter; // Offset:  160 Size:     8 [unused]\n//   float2 xe_point_screen_diameter_to_ndc_radius;// Offset:  168 Size:     8 [unused]\n//   uint4 xe_texture_swizzled_signs[2];// Offset:  176 Size:    32 [unused]\n//   uint xe_textures_resolution_scaled;// Offset:  208 Size:     4 [unused]\n//   uint2 xe_sample_count_log2;        // Offset:  212 Size:     8 [unused]\n//   float xe_alpha_test_reference;     // Offset:  220 Size:     4 [unused]\n//   uint xe_alpha_to_mask;             // Offset:  224 Size:     4 [unused]\n//   uint xe_edram_32bpp_tile_pitch_dwords_scaled;// Offset:  228 Size:     4 [unused]\n//   uint xe_edram_depth_base_dwords_scaled;// Offset:  232 Size:     4 [unused]\n//   float4 xe_color_exp_bias;          // Offset:  240 Size:    16 [unused]\n//   float2 xe_edram_poly_offset_front; // Offset:  256 Size:     8 [unused]\n//   float2 xe_edram_poly_offset_back;  // Offset:  264 Size:     8 [unused]\n//   uint4 xe_edram_stencil[2];         // Offset:  272 Size:    32 [unused]\n//   uint4 xe_edram_rt_base_dwords_scaled;// Offset:  304 Size:    16 [unused]\n//   uint4 xe_edram_rt_format_flags;    // Offset:  320 Size:    16 [unused]\n//   float4 xe_edram_rt_clamp[4];       // Offset:  336 Size:    64 [unused]\n//   uint4 xe_edram_rt_keep_mask[2];    // Offset:  400 Size:    32 [unused]\n//   uint4 xe_edram_rt_blend_factors_ops;// Offset:  432 Size:    16 [unused]\n//   float4 xe_edram_blend_constant;    // Offset:  448 Size:    16 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_system_cbuffer                 cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Patch Constant signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// SV_TessFactor            0   x           0  TRIEDGE   float   x   \n// SV_TessFactor            1   x           1  TRIEDGE   float   x   \n// SV_TessFactor            2   x           2  TRIEDGE   float   x   \n// SV_InsideTessFactor      0   x           3   TRIINT   float   x   \n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// XETESSFACTOR             0   x           0     NONE   float   x   \n//\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// XEVERTEXID               0   x           0     NONE   float   x   \n//\n// Tessellation Domain   # of control points\n// -------------------- --------------------\n// Triangle                                1\n//\n// Tessellation Output Primitive  Partitioning Type \n// ------------------------------ ------------------\n// Clockwise Triangles            Even Fractional   \n//\nhs_5_1\nhs_decls \ndcl_input_control_point_count 3\ndcl_output_control_point_count 1\ndcl_tessellator_domain domain_tri\ndcl_tessellator_partitioning partitioning_fractional_even\ndcl_tessellator_output_primitive output_triangle_cw\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][2], immediateIndexed, space=0\nhs_control_point_phase \ndcl_input vPrim\ndcl_output o0.x\ndcl_temps 1\niadd r0.x, vPrim, CB0[0][1].y\nand r0.x, r0.x, l(0x00ffffff)\numax r0.x, r0.x, CB0[0][1].z\numin r0.x, r0.x, CB0[0][1].w\nutof o0.x, r0.x\nret \nhs_fork_phase \ndcl_hs_fork_phase_instance_count 3\ndcl_input vForkInstanceID\ndcl_input vicp[3][0].x\ndcl_output_siv o0.x, finalTriUeq0EdgeTessFactor\ndcl_output_siv o1.x, finalTriVeq0EdgeTessFactor\ndcl_output_siv o2.x, finalTriWeq0EdgeTessFactor\ndcl_temps 1\ndcl_indexrange o0.x 3\niadd r0.x, vForkInstanceID.x, l(1)\nudiv null, r0.x, r0.x, l(3)\nmov r0.y, vForkInstanceID.x\nmov o[r0.y + 0].x, vicp[r0.x + 0][0].x\nret \nhs_fork_phase \ndcl_input vicp[3][0].x\ndcl_output_siv o3.x, finalTriInsideTessFactor\ndcl_temps 1\nmin r0.x, vicp[2][0].x, vicp[1][0].x\nmin o3.x, r0.x, vicp[0][0].x\nret \n// Approximately 14 instruction slots used\n#endif\n\nconst BYTE adaptive_triangle_hs[] =\n{\n     68,  88,  66,  67, 119, 178, \n    165,  28, 236, 219, 246,   2, \n    103,  49, 167,  10, 199, 138, \n    243, 175,   1,   0,   0,   0, \n     96,  14,   0,   0,   6,   0, \n      0,   0,  56,   0,   0,   0, \n    116,  10,   0,   0, 172,  10, \n      0,   0, 224,  10,   0,   0, \n    116,  11,   0,   0, 196,  13, \n      0,   0,  82,  68,  69,  70, \n     52,  10,   0,   0,   1,   0, \n      0,   0, 120,   0,   0,   0, \n      1,   0,   0,   0,  60,   0, \n      0,   0,   1,   5,  83,  72, \n      0,   5,   0,   0,  10,  10, \n      0,   0,  19,  19,  68,  37, \n     60,   0,   0,   0,  24,   0, \n      0,   0,  40,   0,   0,   0, \n     40,   0,   0,   0,  36,   0, \n      0,   0,  12,   0,   0,   0, \n      0,   0,   0,   0, 100,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 120, 101,  95, 115, \n    121, 115, 116, 101, 109,  95, \n     99,  98, 117, 102, 102, 101, \n    114,   0, 171, 171, 100,   0, \n      0,   0,  30,   0,   0,   0, \n    144,   0,   0,   0, 208,   1, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  64,   5, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,  80,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 116,   5,   0,   0, \n      4,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n    152,   5,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    188,   5,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,  80,   5, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 215,   5, \n      0,   0,  16,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,  80,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 238,   5,   0,   0, \n     20,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n     80,   5,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n      5,   6,   0,   0,  24,   0, \n      0,   0,   8,   0,   0,   0, \n      2,   0,   0,   0,  36,   6, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  72,   6, \n      0,   0,  32,   0,   0,   0, \n     96,   0,   0,   0,   0,   0, \n      0,   0, 100,   6,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 136,   6,   0,   0, \n    128,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    156,   6,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    192,   6,   0,   0, 140,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0, 228,   6, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,   8,   7, \n      0,   0, 144,   0,   0,   0, \n     12,   0,   0,   0,   0,   0, \n      0,   0, 156,   6,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  22,   7,   0,   0, \n    156,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n    228,   6,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     51,   7,   0,   0, 160,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0, 152,   5, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  78,   7, \n      0,   0, 168,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0, 152,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 117,   7,   0,   0, \n    176,   0,   0,   0,  32,   0, \n      0,   0,   0,   0,   0,   0, \n    152,   7,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    188,   7,   0,   0, 208,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,  80,   5, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 218,   7, \n      0,   0, 212,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  36,   6,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 239,   7,   0,   0, \n    220,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n    228,   6,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n      7,   8,   0,   0, 224,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,  80,   5, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  24,   8, \n      0,   0, 228,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,  80,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  64,   8,   0,   0, \n    232,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n     80,   5,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     98,   8,   0,   0, 240,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0, 116,   8, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 152,   8, \n      0,   0,   0,   1,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0, 152,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 179,   8,   0,   0, \n      8,   1,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n    152,   5,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    205,   8,   0,   0,  16,   1, \n      0,   0,  32,   0,   0,   0, \n      0,   0,   0,   0, 224,   8, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,   4,   9, \n      0,   0,  48,   1,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  36,   9,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  72,   9,   0,   0, \n     64,   1,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     36,   9,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     97,   9,   0,   0,  80,   1, \n      0,   0,  64,   0,   0,   0, \n      0,   0,   0,   0, 116,   9, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 152,   9, \n      0,   0, 144,   1,   0,   0, \n     32,   0,   0,   0,   0,   0, \n      0,   0, 176,   9,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 212,   9,   0,   0, \n    176,   1,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     36,   9,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    242,   9,   0,   0, 192,   1, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0, 116,   8, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 120, 101, \n     95, 102, 108,  97, 103, 115, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  73,   5, \n      0,   0, 120, 101,  95, 116, \n    101, 115, 115, 101, 108, 108, \n     97, 116, 105, 111, 110,  95, \n    102,  97,  99, 116, 111, 114, \n     95, 114,  97, 110, 103, 101, \n      0, 102, 108, 111,  97, 116, \n     50,   0,   1,   0,   3,   0, \n      1,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 145,   5, \n      0,   0, 120, 101,  95, 108, \n    105, 110, 101,  95, 108, 111, \n    111, 112,  95,  99, 108, 111, \n    115, 105, 110, 103,  95, 105, \n    110, 100, 101, 120,   0, 120, \n    101,  95, 118, 101, 114, 116, \n    101, 120,  95, 105, 110, 100, \n    101, 120,  95, 101, 110, 100, \n    105,  97, 110,   0, 120, 101, \n     95, 118, 101, 114, 116, 101, \n    120,  95, 105, 110, 100, 101, \n    120,  95, 111, 102, 102, 115, \n    101, 116,   0, 120, 101,  95, \n    118, 101, 114, 116, 101, 120, \n     95, 105, 110, 100, 101, 120, \n     95, 109, 105, 110,  95, 109, \n     97, 120,   0, 117, 105, 110, \n    116,  50,   0, 171,   1,   0, \n     19,   0,   1,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     29,   6,   0,   0, 120, 101, \n     95, 117, 115, 101, 114,  95, \n     99, 108, 105, 112,  95, 112, \n    108,  97, 110, 101, 115,   0, \n    102, 108, 111,  97, 116,  52, \n      0, 171,   1,   0,   3,   0, \n      1,   0,   4,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  92,   6, \n      0,   0, 120, 101,  95, 110, \n    100,  99,  95, 115,  99,  97, \n    108, 101,   0, 102, 108, 111, \n     97, 116,  51,   0,   1,   0, \n      3,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    149,   6,   0,   0, 120, 101, \n     95, 112, 111, 105, 110, 116, \n     95, 118, 101, 114, 116, 101, \n    120,  95, 100, 105,  97, 109, \n    101, 116, 101, 114,  95, 109, \n    105, 110,   0, 102, 108, 111, \n     97, 116,   0, 171,   0,   0, \n      3,   0,   1,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    221,   6,   0,   0, 120, 101, \n     95, 110, 100,  99,  95, 111, \n    102, 102, 115, 101, 116,   0, \n    120, 101,  95, 112, 111, 105, \n    110, 116,  95, 118, 101, 114, \n    116, 101, 120,  95, 100, 105, \n     97, 109, 101, 116, 101, 114, \n     95, 109,  97, 120,   0, 120, \n    101,  95, 112, 111, 105, 110, \n    116,  95,  99, 111, 110, 115, \n    116,  97, 110, 116,  95, 100, \n    105,  97, 109, 101, 116, 101, \n    114,   0, 120, 101,  95, 112, \n    111, 105, 110, 116,  95, 115, \n     99, 114, 101, 101, 110,  95, \n    100, 105,  97, 109, 101, 116, \n    101, 114,  95, 116, 111,  95, \n    110, 100,  99,  95, 114,  97, \n    100, 105, 117, 115,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 115, 119, \n    105, 122, 122, 108, 101, 100, \n     95, 115, 105, 103, 110, 115, \n      0, 117, 105, 110, 116,  52, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   4,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    143,   7,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101, 115,  95, 114, 101, \n    115, 111, 108, 117, 116, 105, \n    111, 110,  95, 115,  99,  97, \n    108, 101, 100,   0, 120, 101, \n     95, 115,  97, 109, 112, 108, \n    101,  95,  99, 111, 117, 110, \n    116,  95, 108, 111, 103,  50, \n      0, 120, 101,  95,  97, 108, \n    112, 104,  97,  95, 116, 101, \n    115, 116,  95, 114, 101, 102, \n    101, 114, 101, 110,  99, 101, \n      0, 120, 101,  95,  97, 108, \n    112, 104,  97,  95, 116, 111, \n     95, 109,  97, 115, 107,   0, \n    120, 101,  95, 101, 100, 114, \n     97, 109,  95,  51,  50,  98, \n    112, 112,  95, 116, 105, 108, \n    101,  95, 112, 105, 116,  99, \n    104,  95, 100, 119, 111, 114, \n    100, 115,  95, 115,  99,  97, \n    108, 101, 100,   0, 120, 101, \n     95, 101, 100, 114,  97, 109, \n     95, 100, 101, 112, 116, 104, \n     95,  98,  97, 115, 101,  95, \n    100, 119, 111, 114, 100, 115, \n     95, 115,  99,  97, 108, 101, \n    100,   0, 120, 101,  95,  99, \n    111, 108, 111, 114,  95, 101, \n    120, 112,  95,  98, 105,  97, \n    115,   0,   1,   0,   3,   0, \n      1,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  92,   6, \n      0,   0, 120, 101,  95, 101, \n    100, 114,  97, 109,  95, 112, \n    111, 108, 121,  95, 111, 102, \n    102, 115, 101, 116,  95, 102, \n    114, 111, 110, 116,   0, 120, \n    101,  95, 101, 100, 114,  97, \n    109,  95, 112, 111, 108, 121, \n     95, 111, 102, 102, 115, 101, \n    116,  95,  98,  97,  99, 107, \n      0, 120, 101,  95, 101, 100, \n    114,  97, 109,  95, 115, 116, \n    101, 110,  99, 105, 108,   0, \n    171, 171,   1,   0,  19,   0, \n      1,   0,   4,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 143,   7, \n      0,   0, 120, 101,  95, 101, \n    100, 114,  97, 109,  95, 114, \n    116,  95,  98,  97, 115, 101, \n     95, 100, 119, 111, 114, 100, \n    115,  95, 115,  99,  97, 108, \n    101, 100,   0, 171,   1,   0, \n     19,   0,   1,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    143,   7,   0,   0, 120, 101, \n     95, 101, 100, 114,  97, 109, \n     95, 114, 116,  95, 102, 111, \n    114, 109,  97, 116,  95, 102, \n    108,  97, 103, 115,   0, 120, \n    101,  95, 101, 100, 114,  97, \n    109,  95, 114, 116,  95,  99, \n    108,  97, 109, 112,   0, 171, \n      1,   0,   3,   0,   1,   0, \n      4,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  92,   6,   0,   0, \n    120, 101,  95, 101, 100, 114, \n     97, 109,  95, 114, 116,  95, \n    107, 101, 101, 112,  95, 109, \n     97, 115, 107,   0, 171, 171, \n      1,   0,  19,   0,   1,   0, \n      4,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 143,   7,   0,   0, \n    120, 101,  95, 101, 100, 114, \n     97, 109,  95, 114, 116,  95, \n     98, 108, 101, 110, 100,  95, \n    102,  97,  99, 116, 111, 114, \n    115,  95, 111, 112, 115,   0, \n    120, 101,  95, 101, 100, 114, \n     97, 109,  95,  98, 108, 101, \n    110, 100,  95,  99, 111, 110, \n    115, 116,  97, 110, 116,   0, \n     77, 105,  99, 114, 111, 115, \n    111, 102, 116,  32,  40,  82, \n     41,  32,  72,  76,  83,  76, \n     32,  83, 104,  97, 100, 101, \n    114,  32,  67, 111, 109, 112, \n    105, 108, 101, 114,  32,  49, \n     48,  46,  49,   0, 171, 171, \n     73,  83,  71,  78,  48,   0, \n      0,   0,   1,   0,   0,   0, \n      8,   0,   0,   0,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   1,   0,   0,  88,  69, \n     84,  69,  83,  83,  70,  65, \n     67,  84,  79,  82,   0, 171, \n    171, 171,  79,  83,  71,  78, \n     44,   0,   0,   0,   1,   0, \n      0,   0,   8,   0,   0,   0, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   1,  14,   0,   0, \n     88,  69,  86,  69,  82,  84, \n     69,  88,  73,  68,   0, 171, \n     80,  67,  83,  71, 140,   0, \n      0,   0,   4,   0,   0,   0, \n      8,   0,   0,   0, 104,   0, \n      0,   0,   0,   0,   0,   0, \n     13,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  14,   0,   0, 104,   0, \n      0,   0,   1,   0,   0,   0, \n     13,   0,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n      1,  14,   0,   0, 104,   0, \n      0,   0,   2,   0,   0,   0, \n     13,   0,   0,   0,   3,   0, \n      0,   0,   2,   0,   0,   0, \n      1,  14,   0,   0, 118,   0, \n      0,   0,   0,   0,   0,   0, \n     14,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      1,  14,   0,   0,  83,  86, \n     95,  84, 101, 115, 115,  70, \n     97,  99, 116, 111, 114,   0, \n     83,  86,  95,  73, 110, 115, \n    105, 100, 101,  84, 101, 115, \n    115,  70,  97,  99, 116, 111, \n    114,   0, 171, 171,  83,  72, \n     69,  88,  72,   2,   0,   0, \n     81,   0,   3,   0, 146,   0, \n      0,   0, 113,   0,   0,   1, \n    147,  24,   0,   1, 148,   8, \n      0,   1, 149,  16,   0,   1, \n    150,  32,   0,   1, 151,  24, \n      0,   1, 106,   8,   0,   1, \n     89,   0,   0,   7,  70, 142, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0, 114,   0, \n      0,   1,  95,   0,   0,   2, \n      0, 176,   0,   0, 101,   0, \n      0,   3,  18,  32,  16,   0, \n      0,   0,   0,   0, 104,   0, \n      0,   2,   1,   0,   0,   0, \n     30,   0,   0,   8,  18,   0, \n     16,   0,   0,   0,   0,   0, \n      1, 176,   0,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0, 255, 255, 255,   0, \n     83,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  42, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     84,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  58, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     86,   0,   0,   5,  18,  32, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  62,   0,   0,   1, \n    115,   0,   0,   1, 153,   0, \n      0,   2,   3,   0,   0,   0, \n     95,   0,   0,   2,   0, 112, \n      1,   0,  95,   0,   0,   4, \n     18, 144,  33,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n    103,   0,   0,   4,  18,  32, \n     16,   0,   0,   0,   0,   0, \n     17,   0,   0,   0, 103,   0, \n      0,   4,  18,  32,  16,   0, \n      1,   0,   0,   0,  18,   0, \n      0,   0, 103,   0,   0,   4, \n     18,  32,  16,   0,   2,   0, \n      0,   0,  19,   0,   0,   0, \n    104,   0,   0,   2,   1,   0, \n      0,   0,  91,   0,   0,   4, \n     18,  32,  16,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n     30,   0,   0,   6,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10, 112,   1,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     78,   0,   0,   8,   0, 208, \n      0,   0,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  54,   0,   0,   4, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  10, 112,   1,   0, \n     54,   0,   0,   8,  18,  32, \n    144,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  10, 144, \n    161,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  62,   0,   0,   1, \n    115,   0,   0,   1,  95,   0, \n      0,   4,  18, 144,  33,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 103,   0,   0,   4, \n     18,  32,  16,   0,   3,   0, \n      0,   0,  20,   0,   0,   0, \n    104,   0,   0,   2,   1,   0, \n      0,   0,  51,   0,   0,   9, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10, 144,  33,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,  10, 144,  33,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  51,   0,   0,   8, \n     18,  32,  16,   0,   3,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  10, 144, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  62,   0, \n      0,   1,  83,  84,  65,  84, \n    148,   0,   0,   0,  14,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   5,   0, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     10,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   3,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/apply_gamma_pwl_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint2 xe_apply_gamma_size;         // Offset:    0 Size:     8\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_apply_gamma_ramp               texture   uint4         buf      T0             t0      1 \n// xe_apply_gamma_source             texture  float4          2d      T1             t1      1 \n// xe_apply_gamma_dest                   UAV  unorm4          2d      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][1], immediateIndexed, space=0\ndcl_resource_buffer (uint,uint,uint,uint) T0[0:0], space=0\ndcl_resource_texture2d (float,float,float,float) T1[1:1], space=0\ndcl_uav_typed_texture2d (unorm,unorm,unorm,unorm) U0[0:0], space=0\ndcl_input vThreadID.xy\ndcl_temps 3\ndcl_thread_group 16, 8, 1\nuge r0.xy, vThreadID.xyxx, CB0[0][0].xyxx\nor r0.x, r0.y, r0.x\nif_nz r0.x\n  ret \nendif \nmov r0.xy, vThreadID.xyxx\nmov r0.zw, l(0,0,0,0)\nld r0.xyz, r0.xyzw, T1[1].xyzw\nmad r0.xyz, r0.xyzx, l(1023.000000, 1023.000000, 1023.000000, 0.000000), l(0.500000, 0.500000, 0.500000, 0.000000)\nftou r0.xyz, r0.xyzx\nushr r1.xyz, r0.xyzx, l(3, 3, 3, 0)\nimul null, r0.w, r1.x, l(3)\nld r1.xw, r0.wwww, T0[0].xzwy\nutof r0.w, r1.x\nand r0.xyz, r0.xyzx, l(7, 7, 7, 0)\nimul null, r0.x, r1.w, r0.x\nutof r0.x, r0.x\nmad r0.x, r0.x, l(0.125000), r0.w\nmul r0.x, r0.x, l(0.000015)\nmin r2.x, r0.x, l(1.000000)\nimad r0.xw, r1.yyyz, l(3, 0, 0, 3), l(1, 0, 0, 2)\nld r1.xy, r0.xxxx, T0[0].xyzw\nutof r0.x, r1.x\nimul null, r0.y, r0.y, r1.y\nutof r0.y, r0.y\nmad r0.x, r0.y, l(0.125000), r0.x\nmul r0.x, r0.x, l(0.000015)\nmin r2.y, r0.x, l(1.000000)\nld r0.xy, r0.wwww, T0[0].xyzw\nimul null, r0.y, r0.y, r0.z\nutof r0.xy, r0.xyxx\nmad r0.x, r0.y, l(0.125000), r0.x\nmul r0.x, r0.x, l(0.000015)\nmin r2.z, r0.x, l(1.000000)\nmov r2.w, l(1.000000)\nstore_uav_typed U0[0].xyzw, vThreadID.xyyy, r2.xyzw\nret \n// Approximately 37 instruction slots used\n#endif\n\nconst BYTE apply_gamma_pwl_cs[] =\n{\n     68,  88,  66,  67,  92,   6, \n    102,  66, 107, 123,  97, 185, \n     70, 227, 155,  50, 177,  34, \n    170, 181,   1,   0,   0,   0, \n    120,   7,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     16,   2,   0,   0,  32,   2, \n      0,   0,  48,   2,   0,   0, \n    220,   6,   0,   0,  82,  68, \n     69,  70, 212,   1,   0,   0, \n      1,   0,   0,   0,  44,   1, \n      0,   0,   4,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    172,   1,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    220,   0,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      1,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n      1,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 240,   0, \n      0,   0,   2,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0, 255, 255, 255, 255, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  12,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   6,   1,   0,   0, \n      4,   0,   0,   0,   1,   0, \n      0,   0,   4,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     12,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     26,   1,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 120, 101, \n     95,  97, 112, 112, 108, 121, \n     95, 103,  97, 109, 109,  97, \n     95, 114,  97, 109, 112,   0, \n    120, 101,  95,  97, 112, 112, \n    108, 121,  95, 103,  97, 109, \n    109,  97,  95, 115, 111, 117, \n    114,  99, 101,   0, 120, 101, \n     95,  97, 112, 112, 108, 121, \n     95, 103,  97, 109, 109,  97, \n     95, 100, 101, 115, 116,   0, \n    112, 117, 115, 104,  95,  99, \n    111, 110, 115, 116, 115,  95, \n    120, 101,   0, 171, 171, 171, \n     26,   1,   0,   0,   1,   0, \n      0,   0,  68,   1,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    108,   1,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n      2,   0,   0,   0, 136,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 120, 101, \n     95,  97, 112, 112, 108, 121, \n     95, 103,  97, 109, 109,  97, \n     95, 115, 105, 122, 101,   0, \n    117, 105, 110, 116,  50,   0, \n    171, 171,   1,   0,  19,   0, \n      1,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 128,   1, \n      0,   0,  77, 105,  99, 114, \n    111, 115, 111, 102, 116,  32, \n     40,  82,  41,  32,  72,  76, \n     83,  76,  32,  83, 104,  97, \n    100, 101, 114,  32,  67, 111, \n    109, 112, 105, 108, 101, 114, \n     32,  49,  48,  46,  49,   0, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n    164,   4,   0,   0,  81,   0, \n      5,   0,  41,   1,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  88,   8,   0,   7, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  68,  68, \n      0,   0,   0,   0,   0,   0, \n     88,  24,   0,   7,  70, 126, \n     48,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  85,  85,   0,   0, \n      0,   0,   0,   0, 156,  24, \n      0,   7,  70, 238,  49,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     17,  17,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n     50,   0,   2,   0, 104,   0, \n      0,   2,   3,   0,   0,   0, \n    155,   0,   0,   4,  16,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,   0,  80,   0, \n      0,   8,  50,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n      2,   0,  70, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  31,   0, \n      4,   3,  10,   0,  16,   0, \n      0,   0,   0,   0,  62,   0, \n      0,   1,  21,   0,   0,   1, \n     54,   0,   0,   4,  50,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   0,   2,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     45,   0,   0,   8, 114,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  50,   0,   0,  15, \n    114,   0,  16,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0, 192, 127,  68, \n      0, 192, 127,  68,   0, 192, \n    127,  68,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,   0,  28,   0,   0,   5, \n    114,   0,  16,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10, 114,   0,  16,   0, \n      1,   0,   0,   0,  70,   2, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  45,   0, \n      0,   8, 146,   0,  16,   0, \n      1,   0,   0,   0, 246,  15, \n     16,   0,   0,   0,   0,   0, \n    134, 119,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     86,   0,   0,   5, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0,  18,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  86,   0,   0,   5, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  50,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  62,  58,   0,  16,   0, \n      0,   0,   0,   0,  56,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   8,  32, \n    128,  55,  51,   0,   0,   7, \n     18,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0, 128,  63, \n     35,   0,   0,  15, 146,   0, \n     16,   0,   0,   0,   0,   0, \n     86,   9,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n     45,   0,   0,   8,  50,   0, \n     16,   0,   1,   0,   0,   0, \n      6,   0,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  86,   0,   0,   5, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     86,   0,   0,   5,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  50,   0,   0,   9, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,  62, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  56,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   8,  32, 128,  55, \n     51,   0,   0,   7,  34,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0, 128,  63,  45,   0, \n      0,   8,  50,   0,  16,   0, \n      0,   0,   0,   0, 246,  15, \n     16,   0,   0,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  86,   0,   0,   5, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      0,   0,   0,   0,  50,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  62,  10,   0,  16,   0, \n      0,   0,   0,   0,  56,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   8,  32, \n    128,  55,  51,   0,   0,   7, \n     66,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0, 128,  63, \n     54,   0,   0,   5, 130,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n    128,  63, 164,   0,   0,   7, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   5,   2,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     62,   0,   0,   1,  83,  84, \n     65,  84, 148,   0,   0,   0, \n     37,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  10,   0, \n      0,   0,   5,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      6,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/apply_gamma_pwl_fxaa_luma_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint2 xe_apply_gamma_size;         // Offset:    0 Size:     8\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_apply_gamma_ramp               texture   uint4         buf      T0             t0      1 \n// xe_apply_gamma_source             texture  float4          2d      T1             t1      1 \n// xe_apply_gamma_dest                   UAV  float4          2d      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][1], immediateIndexed, space=0\ndcl_resource_buffer (uint,uint,uint,uint) T0[0:0], space=0\ndcl_resource_texture2d (float,float,float,float) T1[1:1], space=0\ndcl_uav_typed_texture2d (float,float,float,float) U0[0:0], space=0\ndcl_input vThreadID.xy\ndcl_temps 3\ndcl_thread_group 16, 8, 1\nuge r0.xy, vThreadID.xyxx, CB0[0][0].xyxx\nor r0.x, r0.y, r0.x\nif_nz r0.x\n  ret \nendif \nmov r0.xy, vThreadID.xyxx\nmov r0.zw, l(0,0,0,0)\nld r0.xyz, r0.xyzw, T1[1].xyzw\nmad r0.xyz, r0.xyzx, l(1023.000000, 1023.000000, 1023.000000, 0.000000), l(0.500000, 0.500000, 0.500000, 0.000000)\nftou r0.xyz, r0.xyzx\nushr r1.xyz, r0.xyzx, l(3, 3, 3, 0)\nimul null, r0.w, r1.x, l(3)\nld r1.xw, r0.wwww, T0[0].xzwy\nutof r0.w, r1.x\nand r0.xyz, r0.xyzx, l(7, 7, 7, 0)\nimul null, r0.x, r1.w, r0.x\nutof r0.x, r0.x\nmad r0.x, r0.x, l(0.125000), r0.w\nmul r0.x, r0.x, l(0.000015)\nmin r2.x, r0.x, l(1.000000)\nimad r0.xw, r1.yyyz, l(3, 0, 0, 3), l(1, 0, 0, 2)\nld r1.xy, r0.xxxx, T0[0].xyzw\nutof r0.x, r1.x\nimul null, r0.y, r0.y, r1.y\nutof r0.y, r0.y\nmad r0.x, r0.y, l(0.125000), r0.x\nmul r0.x, r0.x, l(0.000015)\nmin r2.y, r0.x, l(1.000000)\nld r0.xy, r0.wwww, T0[0].xyzw\nimul null, r0.y, r0.y, r0.z\nutof r0.xy, r0.xyxx\nmad r0.x, r0.y, l(0.125000), r0.x\nmul r0.x, r0.x, l(0.000015)\nmin r2.z, r0.x, l(1.000000)\ndp3 r2.w, r2.xyzx, l(0.299000, 0.587000, 0.114000, 0.000000)\nstore_uav_typed U0[0].xyzw, vThreadID.xyyy, r2.xyzw\nret \n// Approximately 37 instruction slots used\n#endif\n\nconst BYTE apply_gamma_pwl_fxaa_luma_cs[] =\n{\n     68,  88,  66,  67,  96, 224, \n    168, 165,  77, 202,  54,  14, \n    176,  64,   7,  12, 228, 221, \n    231,  44,   1,   0,   0,   0, \n    140,   7,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     16,   2,   0,   0,  32,   2, \n      0,   0,  48,   2,   0,   0, \n    240,   6,   0,   0,  82,  68, \n     69,  70, 212,   1,   0,   0, \n      1,   0,   0,   0,  44,   1, \n      0,   0,   4,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    172,   1,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    220,   0,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      1,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n      1,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 240,   0, \n      0,   0,   2,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0, 255, 255, 255, 255, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  12,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   6,   1,   0,   0, \n      4,   0,   0,   0,   5,   0, \n      0,   0,   4,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     12,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     26,   1,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 120, 101, \n     95,  97, 112, 112, 108, 121, \n     95, 103,  97, 109, 109,  97, \n     95, 114,  97, 109, 112,   0, \n    120, 101,  95,  97, 112, 112, \n    108, 121,  95, 103,  97, 109, \n    109,  97,  95, 115, 111, 117, \n    114,  99, 101,   0, 120, 101, \n     95,  97, 112, 112, 108, 121, \n     95, 103,  97, 109, 109,  97, \n     95, 100, 101, 115, 116,   0, \n    112, 117, 115, 104,  95,  99, \n    111, 110, 115, 116, 115,  95, \n    120, 101,   0, 171, 171, 171, \n     26,   1,   0,   0,   1,   0, \n      0,   0,  68,   1,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    108,   1,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n      2,   0,   0,   0, 136,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 120, 101, \n     95,  97, 112, 112, 108, 121, \n     95, 103,  97, 109, 109,  97, \n     95, 115, 105, 122, 101,   0, \n    117, 105, 110, 116,  50,   0, \n    171, 171,   1,   0,  19,   0, \n      1,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 128,   1, \n      0,   0,  77, 105,  99, 114, \n    111, 115, 111, 102, 116,  32, \n     40,  82,  41,  32,  72,  76, \n     83,  76,  32,  83, 104,  97, \n    100, 101, 114,  32,  67, 111, \n    109, 112, 105, 108, 101, 114, \n     32,  49,  48,  46,  49,   0, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n    184,   4,   0,   0,  81,   0, \n      5,   0,  46,   1,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  88,   8,   0,   7, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  68,  68, \n      0,   0,   0,   0,   0,   0, \n     88,  24,   0,   7,  70, 126, \n     48,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  85,  85,   0,   0, \n      0,   0,   0,   0, 156,  24, \n      0,   7,  70, 238,  49,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     85,  85,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n     50,   0,   2,   0, 104,   0, \n      0,   2,   3,   0,   0,   0, \n    155,   0,   0,   4,  16,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,   0,  80,   0, \n      0,   8,  50,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n      2,   0,  70, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  31,   0, \n      4,   3,  10,   0,  16,   0, \n      0,   0,   0,   0,  62,   0, \n      0,   1,  21,   0,   0,   1, \n     54,   0,   0,   4,  50,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   0,   2,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     45,   0,   0,   8, 114,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  50,   0,   0,  15, \n    114,   0,  16,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0, 192, 127,  68, \n      0, 192, 127,  68,   0, 192, \n    127,  68,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,   0,  28,   0,   0,   5, \n    114,   0,  16,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10, 114,   0,  16,   0, \n      1,   0,   0,   0,  70,   2, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  45,   0, \n      0,   8, 146,   0,  16,   0, \n      1,   0,   0,   0, 246,  15, \n     16,   0,   0,   0,   0,   0, \n    134, 119,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     86,   0,   0,   5, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0,  18,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  86,   0,   0,   5, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  50,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  62,  58,   0,  16,   0, \n      0,   0,   0,   0,  56,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   8,  32, \n    128,  55,  51,   0,   0,   7, \n     18,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0, 128,  63, \n     35,   0,   0,  15, 146,   0, \n     16,   0,   0,   0,   0,   0, \n     86,   9,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n     45,   0,   0,   8,  50,   0, \n     16,   0,   1,   0,   0,   0, \n      6,   0,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  86,   0,   0,   5, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     86,   0,   0,   5,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  50,   0,   0,   9, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,  62, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  56,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   8,  32, 128,  55, \n     51,   0,   0,   7,  34,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0, 128,  63,  45,   0, \n      0,   8,  50,   0,  16,   0, \n      0,   0,   0,   0, 246,  15, \n     16,   0,   0,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  86,   0,   0,   5, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      0,   0,   0,   0,  50,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  62,  10,   0,  16,   0, \n      0,   0,   0,   0,  56,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   8,  32, \n    128,  55,  51,   0,   0,   7, \n     66,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0, 128,  63, \n     16,   0,   0,  10, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     70,   2,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n    135,  22, 153,  62, 162,  69, \n     22,  63, 213, 120, 233,  61, \n      0,   0,   0,   0, 164,   0, \n      0,   7, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,   5,   2,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  62,   0,   0,   1, \n     83,  84,  65,  84, 148,   0, \n      0,   0,  37,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     11,   0,   0,   0,   5,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   6,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/apply_gamma_pwl_fxaa_luma_ps.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_apply_gamma_ramp               texture   uint4         buf      T0             t0      1 \n// xe_apply_gamma_source             texture  float4          2d      T1             t1      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// SV_Position              0   xyzw        0      POS   float   xy  \n//\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// SV_Target                0   xyzw        0   TARGET   float   xyzw\n//\nps_5_1\ndcl_globalFlags refactoringAllowed\ndcl_resource_buffer (uint,uint,uint,uint) T0[0:0], space=0\ndcl_resource_texture2d (float,float,float,float) T1[1:1], space=0\ndcl_input_ps_siv linear noperspective v0.xy, position\ndcl_output o0.xyzw\ndcl_temps 3\nftou r0.xy, v0.xyxx\nmov r0.zw, l(0,0,0,0)\nld r0.xyz, r0.xyzw, T1[1].xyzw\nmad r0.xyz, r0.xyzx, l(1023.000000, 1023.000000, 1023.000000, 0.000000), l(0.500000, 0.500000, 0.500000, 0.000000)\nftou r0.xyz, r0.xyzx\nushr r1.xyz, r0.xyzx, l(3, 3, 3, 0)\nimul null, r0.w, r1.x, l(3)\nld r1.xw, r0.wwww, T0[0].xzwy\nutof r0.w, r1.x\nand r0.xyz, r0.xyzx, l(7, 7, 7, 0)\nimul null, r0.x, r1.w, r0.x\nutof r0.x, r0.x\nmad r0.x, r0.x, l(0.125000), r0.w\nmul r0.x, r0.x, l(0.000015)\nmin r2.x, r0.x, l(1.000000)\nimad r0.xw, r1.yyyz, l(3, 0, 0, 3), l(1, 0, 0, 2)\nld r1.xy, r0.xxxx, T0[0].xyzw\nutof r0.x, r1.x\nimul null, r0.y, r0.y, r1.y\nutof r0.y, r0.y\nmad r0.x, r0.y, l(0.125000), r0.x\nmul r0.x, r0.x, l(0.000015)\nmin r2.y, r0.x, l(1.000000)\nld r0.xy, r0.wwww, T0[0].xyzw\nimul null, r0.y, r0.y, r0.z\nutof r0.xy, r0.xyxx\nmad r0.x, r0.y, l(0.125000), r0.x\nmul r0.x, r0.x, l(0.000015)\nmin r2.z, r0.x, l(1.000000)\ndp3 o0.w, r2.xyzx, l(0.299000, 0.587000, 0.114000, 0.000000)\nmov o0.xyz, r2.xyzx\nret \n// Approximately 32 instruction slots used\n#endif\n\nconst BYTE apply_gamma_pwl_fxaa_luma_ps[] =\n{\n     68,  88,  66,  67, 202, 241, \n     49, 179, 160, 182, 197, 116, \n    174, 174,  57, 216, 126, 205, \n    210, 129,   1,   0,   0,   0, \n     88,   6,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     28,   1,   0,   0,  80,   1, \n      0,   0, 132,   1,   0,   0, \n    188,   5,   0,   0,  82,  68, \n     69,  70, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n    255, 255,   0,   5,   0,   0, \n    182,   0,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      1,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n      1,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 160,   0, \n      0,   0,   2,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0, 255, 255, 255, 255, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  12,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0, 120, 101,  95,  97, \n    112, 112, 108, 121,  95, 103, \n     97, 109, 109,  97,  95, 114, \n     97, 109, 112,   0, 120, 101, \n     95,  97, 112, 112, 108, 121, \n     95, 103,  97, 109, 109,  97, \n     95, 115, 111, 117, 114,  99, \n    101,   0,  77, 105,  99, 114, \n    111, 115, 111, 102, 116,  32, \n     40,  82,  41,  32,  72,  76, \n     83,  76,  32,  83, 104,  97, \n    100, 101, 114,  32,  67, 111, \n    109, 112, 105, 108, 101, 114, \n     32,  49,  48,  46,  49,   0, \n    171, 171,  73,  83,  71,  78, \n     44,   0,   0,   0,   1,   0, \n      0,   0,   8,   0,   0,   0, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,  15,   3,   0,   0, \n     83,  86,  95,  80, 111, 115, \n    105, 116, 105, 111, 110,   0, \n     79,  83,  71,  78,  44,   0, \n      0,   0,   1,   0,   0,   0, \n      8,   0,   0,   0,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n     15,   0,   0,   0,  83,  86, \n     95,  84,  97, 114, 103, 101, \n    116,   0, 171, 171,  83,  72, \n     69,  88,  48,   4,   0,   0, \n     81,   0,   0,   0,  12,   1, \n      0,   0, 106,   8,   0,   1, \n     88,   8,   0,   7,  70, 126, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  68,  68,   0,   0, \n      0,   0,   0,   0,  88,  24, \n      0,   7,  70, 126,  48,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n     85,  85,   0,   0,   0,   0, \n      0,   0, 100,  32,   0,   4, \n     50,  16,  16,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n    101,   0,   0,   3, 242,  32, \n     16,   0,   0,   0,   0,   0, \n    104,   0,   0,   2,   3,   0, \n      0,   0,  28,   0,   0,   5, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,  16,  16,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     45,   0,   0,   8, 114,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  50,   0,   0,  15, \n    114,   0,  16,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0, 192, 127,  68, \n      0, 192, 127,  68,   0, 192, \n    127,  68,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,   0,  28,   0,   0,   5, \n    114,   0,  16,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10, 114,   0,  16,   0, \n      1,   0,   0,   0,  70,   2, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  45,   0, \n      0,   8, 146,   0,  16,   0, \n      1,   0,   0,   0, 246,  15, \n     16,   0,   0,   0,   0,   0, \n    134, 119,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     86,   0,   0,   5, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0,  18,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  86,   0,   0,   5, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  50,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  62,  58,   0,  16,   0, \n      0,   0,   0,   0,  56,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   8,  32, \n    128,  55,  51,   0,   0,   7, \n     18,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0, 128,  63, \n     35,   0,   0,  15, 146,   0, \n     16,   0,   0,   0,   0,   0, \n     86,   9,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n     45,   0,   0,   8,  50,   0, \n     16,   0,   1,   0,   0,   0, \n      6,   0,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  86,   0,   0,   5, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     86,   0,   0,   5,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  50,   0,   0,   9, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,  62, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  56,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   8,  32, 128,  55, \n     51,   0,   0,   7,  34,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0, 128,  63,  45,   0, \n      0,   8,  50,   0,  16,   0, \n      0,   0,   0,   0, 246,  15, \n     16,   0,   0,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  86,   0,   0,   5, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      0,   0,   0,   0,  50,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  62,  10,   0,  16,   0, \n      0,   0,   0,   0,  56,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   8,  32, \n    128,  55,  51,   0,   0,   7, \n     66,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0, 128,  63, \n     16,   0,   0,  10, 130,  32, \n     16,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n    135,  22, 153,  62, 162,  69, \n     22,  63, 213, 120, 233,  61, \n      0,   0,   0,   0,  54,   0, \n      0,   5, 114,  32,  16,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,   2,   0,   0,   0, \n     62,   0,   0,   1,  83,  84, \n     65,  84, 148,   0,   0,   0, \n     32,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,  11,   0, \n      0,   0,   5,   0,   0,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/apply_gamma_pwl_ps.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_apply_gamma_ramp               texture   uint4         buf      T0             t0      1 \n// xe_apply_gamma_source             texture  float4          2d      T1             t1      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// SV_Position              0   xyzw        0      POS   float   xy  \n//\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// SV_Target                0   xyzw        0   TARGET   float   xyzw\n//\nps_5_1\ndcl_globalFlags refactoringAllowed\ndcl_resource_buffer (uint,uint,uint,uint) T0[0:0], space=0\ndcl_resource_texture2d (float,float,float,float) T1[1:1], space=0\ndcl_input_ps_siv linear noperspective v0.xy, position\ndcl_output o0.xyzw\ndcl_temps 2\nftou r0.xy, v0.xyxx\nmov r0.zw, l(0,0,0,0)\nld r0.xyz, r0.xyzw, T1[1].xyzw\nmad r0.xyz, r0.xyzx, l(1023.000000, 1023.000000, 1023.000000, 0.000000), l(0.500000, 0.500000, 0.500000, 0.000000)\nftou r0.xyz, r0.xyzx\nushr r1.xyz, r0.xyzx, l(3, 3, 3, 0)\nimul null, r0.w, r1.x, l(3)\nld r1.xw, r0.wwww, T0[0].xzwy\nutof r0.w, r1.x\nand r0.xyz, r0.xyzx, l(7, 7, 7, 0)\nimul null, r0.x, r1.w, r0.x\nutof r0.x, r0.x\nmad r0.x, r0.x, l(0.125000), r0.w\nmul r0.x, r0.x, l(0.000015)\nmin o0.x, r0.x, l(1.000000)\nimad r0.xw, r1.yyyz, l(3, 0, 0, 3), l(1, 0, 0, 2)\nld r1.xy, r0.xxxx, T0[0].xyzw\nutof r0.x, r1.x\nimul null, r0.y, r0.y, r1.y\nutof r0.y, r0.y\nmad r0.x, r0.y, l(0.125000), r0.x\nmul r0.x, r0.x, l(0.000015)\nmin o0.y, r0.x, l(1.000000)\nld r0.xy, r0.wwww, T0[0].xyzw\nimul null, r0.y, r0.y, r0.z\nutof r0.xy, r0.xyxx\nmad r0.x, r0.y, l(0.125000), r0.x\nmul r0.x, r0.x, l(0.000015)\nmin o0.z, r0.x, l(1.000000)\nmov o0.w, l(1.000000)\nret \n// Approximately 31 instruction slots used\n#endif\n\nconst BYTE apply_gamma_pwl_ps[] =\n{\n     68,  88,  66,  67, 197, 255, \n    198, 206, 158, 112,  94, 186, \n      5, 215,   2,   4, 116, 239, \n      1, 249,   1,   0,   0,   0, \n     48,   6,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     28,   1,   0,   0,  80,   1, \n      0,   0, 132,   1,   0,   0, \n    148,   5,   0,   0,  82,  68, \n     69,  70, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n    255, 255,   0,   5,   0,   0, \n    182,   0,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      1,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n      1,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 160,   0, \n      0,   0,   2,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0, 255, 255, 255, 255, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  12,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0, 120, 101,  95,  97, \n    112, 112, 108, 121,  95, 103, \n     97, 109, 109,  97,  95, 114, \n     97, 109, 112,   0, 120, 101, \n     95,  97, 112, 112, 108, 121, \n     95, 103,  97, 109, 109,  97, \n     95, 115, 111, 117, 114,  99, \n    101,   0,  77, 105,  99, 114, \n    111, 115, 111, 102, 116,  32, \n     40,  82,  41,  32,  72,  76, \n     83,  76,  32,  83, 104,  97, \n    100, 101, 114,  32,  67, 111, \n    109, 112, 105, 108, 101, 114, \n     32,  49,  48,  46,  49,   0, \n    171, 171,  73,  83,  71,  78, \n     44,   0,   0,   0,   1,   0, \n      0,   0,   8,   0,   0,   0, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,  15,   3,   0,   0, \n     83,  86,  95,  80, 111, 115, \n    105, 116, 105, 111, 110,   0, \n     79,  83,  71,  78,  44,   0, \n      0,   0,   1,   0,   0,   0, \n      8,   0,   0,   0,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n     15,   0,   0,   0,  83,  86, \n     95,  84,  97, 114, 103, 101, \n    116,   0, 171, 171,  83,  72, \n     69,  88,   8,   4,   0,   0, \n     81,   0,   0,   0,   2,   1, \n      0,   0, 106,   8,   0,   1, \n     88,   8,   0,   7,  70, 126, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  68,  68,   0,   0, \n      0,   0,   0,   0,  88,  24, \n      0,   7,  70, 126,  48,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n     85,  85,   0,   0,   0,   0, \n      0,   0, 100,  32,   0,   4, \n     50,  16,  16,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n    101,   0,   0,   3, 242,  32, \n     16,   0,   0,   0,   0,   0, \n    104,   0,   0,   2,   2,   0, \n      0,   0,  28,   0,   0,   5, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,  16,  16,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     45,   0,   0,   8, 114,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  50,   0,   0,  15, \n    114,   0,  16,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0, 192, 127,  68, \n      0, 192, 127,  68,   0, 192, \n    127,  68,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,   0,  28,   0,   0,   5, \n    114,   0,  16,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10, 114,   0,  16,   0, \n      1,   0,   0,   0,  70,   2, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  45,   0, \n      0,   8, 146,   0,  16,   0, \n      1,   0,   0,   0, 246,  15, \n     16,   0,   0,   0,   0,   0, \n    134, 119,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     86,   0,   0,   5, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0,  18,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  86,   0,   0,   5, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  50,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  62,  58,   0,  16,   0, \n      0,   0,   0,   0,  56,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   8,  32, \n    128,  55,  51,   0,   0,   7, \n     18,  32,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0, 128,  63, \n     35,   0,   0,  15, 146,   0, \n     16,   0,   0,   0,   0,   0, \n     86,   9,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n     45,   0,   0,   8,  50,   0, \n     16,   0,   1,   0,   0,   0, \n      6,   0,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  86,   0,   0,   5, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     86,   0,   0,   5,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  50,   0,   0,   9, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,  62, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  56,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   8,  32, 128,  55, \n     51,   0,   0,   7,  34,  32, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0, 128,  63,  45,   0, \n      0,   8,  50,   0,  16,   0, \n      0,   0,   0,   0, 246,  15, \n     16,   0,   0,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  86,   0,   0,   5, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      0,   0,   0,   0,  50,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  62,  10,   0,  16,   0, \n      0,   0,   0,   0,  56,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   8,  32, \n    128,  55,  51,   0,   0,   7, \n     66,  32,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0, 128,  63, \n     54,   0,   0,   5, 130,  32, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n    128,  63,  62,   0,   0,   1, \n     83,  84,  65,  84, 148,   0, \n      0,   0,  31,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n     10,   0,   0,   0,   5,   0, \n      0,   0,   2,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/apply_gamma_table_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint2 xe_apply_gamma_size;         // Offset:    0 Size:     8\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_apply_gamma_ramp               texture  float4         buf      T0             t0      1 \n// xe_apply_gamma_source             texture  float4          2d      T1             t1      1 \n// xe_apply_gamma_dest                   UAV  unorm4          2d      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][1], immediateIndexed, space=0\ndcl_resource_buffer (float,float,float,float) T0[0:0], space=0\ndcl_resource_texture2d (float,float,float,float) T1[1:1], space=0\ndcl_uav_typed_texture2d (unorm,unorm,unorm,unorm) U0[0:0], space=0\ndcl_input vThreadID.xy\ndcl_temps 2\ndcl_thread_group 16, 8, 1\nuge r0.xy, vThreadID.xyxx, CB0[0][0].xyxx\nor r0.x, r0.y, r0.x\nif_nz r0.x\n  ret \nendif \nmov r0.xy, vThreadID.xyxx\nmov r0.zw, l(0,0,0,0)\nld r0.xyz, r0.xyzw, T1[1].xyzw\nmad r0.xyz, r0.xyzx, l(255.000000, 255.000000, 255.000000, 0.000000), l(0.500000, 0.500000, 0.500000, 0.000000)\nftou r0.xyz, r0.xyzx\nld r1.x, r0.xxxx, T0[0].zxyw\nld r1.y, r0.yyyy, T0[0].xyzw\nld r1.z, r0.zzzz, T0[0].yzxw\nmov r1.w, l(1.000000)\nstore_uav_typed U0[0].xyzw, vThreadID.xyyy, r1.xyzw\nret \n// Approximately 16 instruction slots used\n#endif\n\nconst BYTE apply_gamma_table_cs[] =\n{\n     68,  88,  66,  67, 224, 187, \n    208, 232, 174, 162, 162, 142, \n     57,  39, 145, 206,  92, 198, \n    122, 202,   1,   0,   0,   0, \n    244,   4,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     16,   2,   0,   0,  32,   2, \n      0,   0,  48,   2,   0,   0, \n     88,   4,   0,   0,  82,  68, \n     69,  70, 212,   1,   0,   0, \n      1,   0,   0,   0,  44,   1, \n      0,   0,   4,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    172,   1,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    220,   0,   0,   0,   2,   0, \n      0,   0,   5,   0,   0,   0, \n      1,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n      1,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 240,   0, \n      0,   0,   2,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0, 255, 255, 255, 255, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  12,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   6,   1,   0,   0, \n      4,   0,   0,   0,   1,   0, \n      0,   0,   4,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     12,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     26,   1,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 120, 101, \n     95,  97, 112, 112, 108, 121, \n     95, 103,  97, 109, 109,  97, \n     95, 114,  97, 109, 112,   0, \n    120, 101,  95,  97, 112, 112, \n    108, 121,  95, 103,  97, 109, \n    109,  97,  95, 115, 111, 117, \n    114,  99, 101,   0, 120, 101, \n     95,  97, 112, 112, 108, 121, \n     95, 103,  97, 109, 109,  97, \n     95, 100, 101, 115, 116,   0, \n    112, 117, 115, 104,  95,  99, \n    111, 110, 115, 116, 115,  95, \n    120, 101,   0, 171, 171, 171, \n     26,   1,   0,   0,   1,   0, \n      0,   0,  68,   1,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    108,   1,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n      2,   0,   0,   0, 136,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 120, 101, \n     95,  97, 112, 112, 108, 121, \n     95, 103,  97, 109, 109,  97, \n     95, 115, 105, 122, 101,   0, \n    117, 105, 110, 116,  50,   0, \n    171, 171,   1,   0,  19,   0, \n      1,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 128,   1, \n      0,   0,  77, 105,  99, 114, \n    111, 115, 111, 102, 116,  32, \n     40,  82,  41,  32,  72,  76, \n     83,  76,  32,  83, 104,  97, \n    100, 101, 114,  32,  67, 111, \n    109, 112, 105, 108, 101, 114, \n     32,  49,  48,  46,  49,   0, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n     32,   2,   0,   0,  81,   0, \n      5,   0, 136,   0,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  88,   8,   0,   7, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  85,  85, \n      0,   0,   0,   0,   0,   0, \n     88,  24,   0,   7,  70, 126, \n     48,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  85,  85,   0,   0, \n      0,   0,   0,   0, 156,  24, \n      0,   7,  70, 238,  49,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     17,  17,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n     50,   0,   2,   0, 104,   0, \n      0,   2,   2,   0,   0,   0, \n    155,   0,   0,   4,  16,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,   0,  80,   0, \n      0,   8,  50,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n      2,   0,  70, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  31,   0, \n      4,   3,  10,   0,  16,   0, \n      0,   0,   0,   0,  62,   0, \n      0,   1,  21,   0,   0,   1, \n     54,   0,   0,   4,  50,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   0,   2,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     45,   0,   0,   8, 114,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  50,   0,   0,  15, \n    114,   0,  16,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 127,  67, \n      0,   0, 127,  67,   0,   0, \n    127,  67,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,   0,  28,   0,   0,   5, \n    114,   0,  16,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n      0,   0,   0,   0,  45,   0, \n      0,   8,  18,   0,  16,   0, \n      1,   0,   0,   0,   6,   0, \n     16,   0,   0,   0,   0,   0, \n     38, 125,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     45,   0,   0,   8,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  45,   0,   0,   8, \n     66,   0,  16,   0,   1,   0, \n      0,   0, 166,  10,  16,   0, \n      0,   0,   0,   0, 150, 124, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5, 130,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   0,   0, 128,  63, \n    164,   0,   0,   7, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  70,   5, \n      2,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  62,   0, \n      0,   1,  83,  84,  65,  84, \n    148,   0,   0,   0,  16,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/apply_gamma_table_fxaa_luma_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint2 xe_apply_gamma_size;         // Offset:    0 Size:     8\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_apply_gamma_ramp               texture  float4         buf      T0             t0      1 \n// xe_apply_gamma_source             texture  float4          2d      T1             t1      1 \n// xe_apply_gamma_dest                   UAV  float4          2d      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][1], immediateIndexed, space=0\ndcl_resource_buffer (float,float,float,float) T0[0:0], space=0\ndcl_resource_texture2d (float,float,float,float) T1[1:1], space=0\ndcl_uav_typed_texture2d (float,float,float,float) U0[0:0], space=0\ndcl_input vThreadID.xy\ndcl_temps 2\ndcl_thread_group 16, 8, 1\nuge r0.xy, vThreadID.xyxx, CB0[0][0].xyxx\nor r0.x, r0.y, r0.x\nif_nz r0.x\n  ret \nendif \nmov r0.xy, vThreadID.xyxx\nmov r0.zw, l(0,0,0,0)\nld r0.xyz, r0.xyzw, T1[1].xyzw\nmad r0.xyz, r0.xyzx, l(255.000000, 255.000000, 255.000000, 0.000000), l(0.500000, 0.500000, 0.500000, 0.000000)\nftou r0.xyz, r0.xyzx\nld r1.x, r0.xxxx, T0[0].zxyw\nld r1.y, r0.yyyy, T0[0].xyzw\nld r1.z, r0.zzzz, T0[0].yzxw\ndp3 r1.w, r1.xyzx, l(0.299000, 0.587000, 0.114000, 0.000000)\nstore_uav_typed U0[0].xyzw, vThreadID.xyyy, r1.xyzw\nret \n// Approximately 16 instruction slots used\n#endif\n\nconst BYTE apply_gamma_table_fxaa_luma_cs[] =\n{\n     68,  88,  66,  67, 128, 162, \n     66,  16, 174,  83, 136, 225, \n     62,  54, 160, 145, 249,  15, \n    149,  77,   1,   0,   0,   0, \n      8,   5,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     16,   2,   0,   0,  32,   2, \n      0,   0,  48,   2,   0,   0, \n    108,   4,   0,   0,  82,  68, \n     69,  70, 212,   1,   0,   0, \n      1,   0,   0,   0,  44,   1, \n      0,   0,   4,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    172,   1,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    220,   0,   0,   0,   2,   0, \n      0,   0,   5,   0,   0,   0, \n      1,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n      1,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 240,   0, \n      0,   0,   2,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0, 255, 255, 255, 255, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  12,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   6,   1,   0,   0, \n      4,   0,   0,   0,   5,   0, \n      0,   0,   4,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     12,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     26,   1,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 120, 101, \n     95,  97, 112, 112, 108, 121, \n     95, 103,  97, 109, 109,  97, \n     95, 114,  97, 109, 112,   0, \n    120, 101,  95,  97, 112, 112, \n    108, 121,  95, 103,  97, 109, \n    109,  97,  95, 115, 111, 117, \n    114,  99, 101,   0, 120, 101, \n     95,  97, 112, 112, 108, 121, \n     95, 103,  97, 109, 109,  97, \n     95, 100, 101, 115, 116,   0, \n    112, 117, 115, 104,  95,  99, \n    111, 110, 115, 116, 115,  95, \n    120, 101,   0, 171, 171, 171, \n     26,   1,   0,   0,   1,   0, \n      0,   0,  68,   1,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    108,   1,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n      2,   0,   0,   0, 136,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 120, 101, \n     95,  97, 112, 112, 108, 121, \n     95, 103,  97, 109, 109,  97, \n     95, 115, 105, 122, 101,   0, \n    117, 105, 110, 116,  50,   0, \n    171, 171,   1,   0,  19,   0, \n      1,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 128,   1, \n      0,   0,  77, 105,  99, 114, \n    111, 115, 111, 102, 116,  32, \n     40,  82,  41,  32,  72,  76, \n     83,  76,  32,  83, 104,  97, \n    100, 101, 114,  32,  67, 111, \n    109, 112, 105, 108, 101, 114, \n     32,  49,  48,  46,  49,   0, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n     52,   2,   0,   0,  81,   0, \n      5,   0, 141,   0,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  88,   8,   0,   7, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  85,  85, \n      0,   0,   0,   0,   0,   0, \n     88,  24,   0,   7,  70, 126, \n     48,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  85,  85,   0,   0, \n      0,   0,   0,   0, 156,  24, \n      0,   7,  70, 238,  49,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     85,  85,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n     50,   0,   2,   0, 104,   0, \n      0,   2,   2,   0,   0,   0, \n    155,   0,   0,   4,  16,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,   0,  80,   0, \n      0,   8,  50,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n      2,   0,  70, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  31,   0, \n      4,   3,  10,   0,  16,   0, \n      0,   0,   0,   0,  62,   0, \n      0,   1,  21,   0,   0,   1, \n     54,   0,   0,   4,  50,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   0,   2,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     45,   0,   0,   8, 114,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  50,   0,   0,  15, \n    114,   0,  16,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 127,  67, \n      0,   0, 127,  67,   0,   0, \n    127,  67,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,   0,  28,   0,   0,   5, \n    114,   0,  16,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n      0,   0,   0,   0,  45,   0, \n      0,   8,  18,   0,  16,   0, \n      1,   0,   0,   0,   6,   0, \n     16,   0,   0,   0,   0,   0, \n     38, 125,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     45,   0,   0,   8,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  45,   0,   0,   8, \n     66,   0,  16,   0,   1,   0, \n      0,   0, 166,  10,  16,   0, \n      0,   0,   0,   0, 150, 124, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,  10, 130,   0,  16,   0, \n      1,   0,   0,   0,  70,   2, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0, 135,  22, \n    153,  62, 162,  69,  22,  63, \n    213, 120, 233,  61,   0,   0, \n      0,   0, 164,   0,   0,   7, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   5,   2,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     62,   0,   0,   1,  83,  84, \n     65,  84, 148,   0,   0,   0, \n     16,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/apply_gamma_table_fxaa_luma_ps.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_apply_gamma_ramp               texture  float4         buf      T0             t0      1 \n// xe_apply_gamma_source             texture  float4          2d      T1             t1      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// SV_Position              0   xyzw        0      POS   float   xy  \n//\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// SV_Target                0   xyzw        0   TARGET   float   xyzw\n//\nps_5_1\ndcl_globalFlags refactoringAllowed\ndcl_resource_buffer (float,float,float,float) T0[0:0], space=0\ndcl_resource_texture2d (float,float,float,float) T1[1:1], space=0\ndcl_input_ps_siv linear noperspective v0.xy, position\ndcl_output o0.xyzw\ndcl_temps 2\nftou r0.xy, v0.xyxx\nmov r0.zw, l(0,0,0,0)\nld r0.xyz, r0.xyzw, T1[1].xyzw\nmad r0.xyz, r0.xyzx, l(255.000000, 255.000000, 255.000000, 0.000000), l(0.500000, 0.500000, 0.500000, 0.000000)\nftou r0.xyz, r0.xyzx\nld r1.x, r0.xxxx, T0[0].zxyw\nld r1.y, r0.yyyy, T0[0].xyzw\nld r1.z, r0.zzzz, T0[0].yzxw\ndp3 o0.w, r1.xyzx, l(0.299000, 0.587000, 0.114000, 0.000000)\nmov o0.xyz, r1.xyzx\nret \n// Approximately 11 instruction slots used\n#endif\n\nconst BYTE apply_gamma_table_fxaa_luma_ps[] =\n{\n     68,  88,  66,  67,  99,  93, \n     21, 205, 152,  99, 210,  93, \n    126, 200,  23, 156,  88,  34, \n    136,  17,   1,   0,   0,   0, \n    212,   3,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     28,   1,   0,   0,  80,   1, \n      0,   0, 132,   1,   0,   0, \n     56,   3,   0,   0,  82,  68, \n     69,  70, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n    255, 255,   0,   5,   0,   0, \n    182,   0,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,   0,   2,   0, \n      0,   0,   5,   0,   0,   0, \n      1,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n      1,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 160,   0, \n      0,   0,   2,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0, 255, 255, 255, 255, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  12,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0, 120, 101,  95,  97, \n    112, 112, 108, 121,  95, 103, \n     97, 109, 109,  97,  95, 114, \n     97, 109, 112,   0, 120, 101, \n     95,  97, 112, 112, 108, 121, \n     95, 103,  97, 109, 109,  97, \n     95, 115, 111, 117, 114,  99, \n    101,   0,  77, 105,  99, 114, \n    111, 115, 111, 102, 116,  32, \n     40,  82,  41,  32,  72,  76, \n     83,  76,  32,  83, 104,  97, \n    100, 101, 114,  32,  67, 111, \n    109, 112, 105, 108, 101, 114, \n     32,  49,  48,  46,  49,   0, \n    171, 171,  73,  83,  71,  78, \n     44,   0,   0,   0,   1,   0, \n      0,   0,   8,   0,   0,   0, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,  15,   3,   0,   0, \n     83,  86,  95,  80, 111, 115, \n    105, 116, 105, 111, 110,   0, \n     79,  83,  71,  78,  44,   0, \n      0,   0,   1,   0,   0,   0, \n      8,   0,   0,   0,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n     15,   0,   0,   0,  83,  86, \n     95,  84,  97, 114, 103, 101, \n    116,   0, 171, 171,  83,  72, \n     69,  88, 172,   1,   0,   0, \n     81,   0,   0,   0, 107,   0, \n      0,   0, 106,   8,   0,   1, \n     88,   8,   0,   7,  70, 126, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  85,  85,   0,   0, \n      0,   0,   0,   0,  88,  24, \n      0,   7,  70, 126,  48,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n     85,  85,   0,   0,   0,   0, \n      0,   0, 100,  32,   0,   4, \n     50,  16,  16,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n    101,   0,   0,   3, 242,  32, \n     16,   0,   0,   0,   0,   0, \n    104,   0,   0,   2,   2,   0, \n      0,   0,  28,   0,   0,   5, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,  16,  16,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     45,   0,   0,   8, 114,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  50,   0,   0,  15, \n    114,   0,  16,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 127,  67, \n      0,   0, 127,  67,   0,   0, \n    127,  67,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,   0,  28,   0,   0,   5, \n    114,   0,  16,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n      0,   0,   0,   0,  45,   0, \n      0,   8,  18,   0,  16,   0, \n      1,   0,   0,   0,   6,   0, \n     16,   0,   0,   0,   0,   0, \n     38, 125,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     45,   0,   0,   8,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  45,   0,   0,   8, \n     66,   0,  16,   0,   1,   0, \n      0,   0, 166,  10,  16,   0, \n      0,   0,   0,   0, 150, 124, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,  10, 130,  32,  16,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0, 135,  22, \n    153,  62, 162,  69,  22,  63, \n    213, 120, 233,  61,   0,   0, \n      0,   0,  54,   0,   0,   5, \n    114,  32,  16,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n      1,   0,   0,   0,  62,   0, \n      0,   1,  83,  84,  65,  84, \n    148,   0,   0,   0,  11,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/apply_gamma_table_ps.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_apply_gamma_ramp               texture  float4         buf      T0             t0      1 \n// xe_apply_gamma_source             texture  float4          2d      T1             t1      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// SV_Position              0   xyzw        0      POS   float   xy  \n//\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// SV_Target                0   xyzw        0   TARGET   float   xyzw\n//\nps_5_1\ndcl_globalFlags refactoringAllowed\ndcl_resource_buffer (float,float,float,float) T0[0:0], space=0\ndcl_resource_texture2d (float,float,float,float) T1[1:1], space=0\ndcl_input_ps_siv linear noperspective v0.xy, position\ndcl_output o0.xyzw\ndcl_temps 1\nftou r0.xy, v0.xyxx\nmov r0.zw, l(0,0,0,0)\nld r0.xyz, r0.xyzw, T1[1].xyzw\nmad r0.xyz, r0.xyzx, l(255.000000, 255.000000, 255.000000, 0.000000), l(0.500000, 0.500000, 0.500000, 0.000000)\nftou r0.xyz, r0.xyzx\nld r0.x, r0.xxxx, T0[0].zxyw\nld r0.y, r0.yyyy, T0[0].xyzw\nld r0.z, r0.zzzz, T0[0].yzxw\nmov o0.xyz, r0.xyzx\nmov o0.w, l(1.000000)\nret \n// Approximately 11 instruction slots used\n#endif\n\nconst BYTE apply_gamma_table_ps[] =\n{\n     68,  88,  66,  67,  74,  64, \n    188, 148,   1,  73, 166, 187, \n     95, 221, 233, 140, 224,   9, \n    117, 169,   1,   0,   0,   0, \n    192,   3,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     28,   1,   0,   0,  80,   1, \n      0,   0, 132,   1,   0,   0, \n     36,   3,   0,   0,  82,  68, \n     69,  70, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n    255, 255,   0,   5,   0,   0, \n    182,   0,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,   0,   2,   0, \n      0,   0,   5,   0,   0,   0, \n      1,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n      1,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 160,   0, \n      0,   0,   2,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0, 255, 255, 255, 255, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  12,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0, 120, 101,  95,  97, \n    112, 112, 108, 121,  95, 103, \n     97, 109, 109,  97,  95, 114, \n     97, 109, 112,   0, 120, 101, \n     95,  97, 112, 112, 108, 121, \n     95, 103,  97, 109, 109,  97, \n     95, 115, 111, 117, 114,  99, \n    101,   0,  77, 105,  99, 114, \n    111, 115, 111, 102, 116,  32, \n     40,  82,  41,  32,  72,  76, \n     83,  76,  32,  83, 104,  97, \n    100, 101, 114,  32,  67, 111, \n    109, 112, 105, 108, 101, 114, \n     32,  49,  48,  46,  49,   0, \n    171, 171,  73,  83,  71,  78, \n     44,   0,   0,   0,   1,   0, \n      0,   0,   8,   0,   0,   0, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,  15,   3,   0,   0, \n     83,  86,  95,  80, 111, 115, \n    105, 116, 105, 111, 110,   0, \n     79,  83,  71,  78,  44,   0, \n      0,   0,   1,   0,   0,   0, \n      8,   0,   0,   0,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n     15,   0,   0,   0,  83,  86, \n     95,  84,  97, 114, 103, 101, \n    116,   0, 171, 171,  83,  72, \n     69,  88, 152,   1,   0,   0, \n     81,   0,   0,   0, 102,   0, \n      0,   0, 106,   8,   0,   1, \n     88,   8,   0,   7,  70, 126, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  85,  85,   0,   0, \n      0,   0,   0,   0,  88,  24, \n      0,   7,  70, 126,  48,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n     85,  85,   0,   0,   0,   0, \n      0,   0, 100,  32,   0,   4, \n     50,  16,  16,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n    101,   0,   0,   3, 242,  32, \n     16,   0,   0,   0,   0,   0, \n    104,   0,   0,   2,   1,   0, \n      0,   0,  28,   0,   0,   5, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,  16,  16,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     45,   0,   0,   8, 114,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  50,   0,   0,  15, \n    114,   0,  16,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 127,  67, \n      0,   0, 127,  67,   0,   0, \n    127,  67,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,   0,  28,   0,   0,   5, \n    114,   0,  16,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n      0,   0,   0,   0,  45,   0, \n      0,   8,  18,   0,  16,   0, \n      0,   0,   0,   0,   6,   0, \n     16,   0,   0,   0,   0,   0, \n     38, 125,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     45,   0,   0,   8,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  45,   0,   0,   8, \n     66,   0,  16,   0,   0,   0, \n      0,   0, 166,  10,  16,   0, \n      0,   0,   0,   0, 150, 124, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5, 114,  32,  16,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,   0,   0,   0,   0, \n     54,   0,   0,   5, 130,  32, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n    128,  63,  62,   0,   0,   1, \n     83,  84,  65,  84, 148,   0, \n      0,   0,  11,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/clear_uint2_ps.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer XeClearConstants\n// {\n//\n//   uint2 xe_clear_value;              // Offset:    0 Size:     8\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// XeClearConstants                  cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// SV_Target                0   xy          0   TARGET    uint   xy  \n//\nps_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][1], immediateIndexed, space=0\ndcl_output o0.xy\nmov o0.xy, CB0[0][0].xyxx\nret \n// Approximately 2 instruction slots used\n#endif\n\nconst BYTE clear_uint2_ps[] =\n{\n     68,  88,  66,  67,  90,  79, \n     67,  15,  17, 175, 210, 170, \n    189, 222, 209, 228,  62,  31, \n    153, 246,   1,   0,   0,   0, \n    148,   2,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     88,   1,   0,   0, 104,   1, \n      0,   0, 156,   1,   0,   0, \n    248,   1,   0,   0,  82,  68, \n     69,  70,  28,   1,   0,   0, \n      1,   0,   0,   0, 120,   0, \n      0,   0,   1,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n    255, 255,   0,   5,   0,   0, \n    244,   0,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    100,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  88, 101, \n     67, 108, 101,  97, 114,  67, \n    111, 110, 115, 116,  97, 110, \n    116, 115,   0, 171, 171, 171, \n    100,   0,   0,   0,   1,   0, \n      0,   0, 144,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    184,   0,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n      2,   0,   0,   0, 208,   0, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 120, 101, \n     95,  99, 108, 101,  97, 114, \n     95, 118,  97, 108, 117, 101, \n      0, 117, 105, 110, 116,  50, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    199,   0,   0,   0,  77, 105, \n     99, 114, 111, 115, 111, 102, \n    116,  32,  40,  82,  41,  32, \n     72,  76,  83,  76,  32,  83, \n    104,  97, 100, 101, 114,  32, \n     67, 111, 109, 112, 105, 108, \n    101, 114,  32,  49,  48,  46, \n     49,   0,  73,  83,  71,  78, \n      8,   0,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     79,  83,  71,  78,  44,   0, \n      0,   0,   1,   0,   0,   0, \n      8,   0,   0,   0,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      3,  12,   0,   0,  83,  86, \n     95,  84,  97, 114, 103, 101, \n    116,   0, 171, 171,  83,  72, \n     69,  88,  84,   0,   0,   0, \n     81,   0,   0,   0,  21,   0, \n      0,   0, 106,   8,   0,   1, \n     89,   0,   0,   7,  70, 142, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0, 101,   0, \n      0,   3,  50,  32,  16,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   7,  50,  32,  16,   0, \n      0,   0,   0,   0,  70, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  62,   0,   0,   1, \n     83,  84,  65,  84, 148,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/continuous_quad_1cp_hs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer xe_system_cbuffer\n// {\n//\n//   uint xe_flags;                     // Offset:    0 Size:     4 [unused]\n//   float2 xe_tessellation_factor_range;// Offset:    4 Size:     8\n//   uint xe_line_loop_closing_index;   // Offset:   12 Size:     4 [unused]\n//   uint xe_vertex_index_endian;       // Offset:   16 Size:     4 [unused]\n//   uint xe_vertex_index_offset;       // Offset:   20 Size:     4 [unused]\n//   uint2 xe_vertex_index_min_max;     // Offset:   24 Size:     8 [unused]\n//   float4 xe_user_clip_planes[6];     // Offset:   32 Size:    96 [unused]\n//   float3 xe_ndc_scale;               // Offset:  128 Size:    12 [unused]\n//   float xe_point_vertex_diameter_min;// Offset:  140 Size:     4 [unused]\n//   float3 xe_ndc_offset;              // Offset:  144 Size:    12 [unused]\n//   float xe_point_vertex_diameter_max;// Offset:  156 Size:     4 [unused]\n//   float2 xe_point_constant_diameter; // Offset:  160 Size:     8 [unused]\n//   float2 xe_point_screen_diameter_to_ndc_radius;// Offset:  168 Size:     8 [unused]\n//   uint4 xe_texture_swizzled_signs[2];// Offset:  176 Size:    32 [unused]\n//   uint xe_textures_resolution_scaled;// Offset:  208 Size:     4 [unused]\n//   uint2 xe_sample_count_log2;        // Offset:  212 Size:     8 [unused]\n//   float xe_alpha_test_reference;     // Offset:  220 Size:     4 [unused]\n//   uint xe_alpha_to_mask;             // Offset:  224 Size:     4 [unused]\n//   uint xe_edram_32bpp_tile_pitch_dwords_scaled;// Offset:  228 Size:     4 [unused]\n//   uint xe_edram_depth_base_dwords_scaled;// Offset:  232 Size:     4 [unused]\n//   float4 xe_color_exp_bias;          // Offset:  240 Size:    16 [unused]\n//   float2 xe_edram_poly_offset_front; // Offset:  256 Size:     8 [unused]\n//   float2 xe_edram_poly_offset_back;  // Offset:  264 Size:     8 [unused]\n//   uint4 xe_edram_stencil[2];         // Offset:  272 Size:    32 [unused]\n//   uint4 xe_edram_rt_base_dwords_scaled;// Offset:  304 Size:    16 [unused]\n//   uint4 xe_edram_rt_format_flags;    // Offset:  320 Size:    16 [unused]\n//   float4 xe_edram_rt_clamp[4];       // Offset:  336 Size:    64 [unused]\n//   uint4 xe_edram_rt_keep_mask[2];    // Offset:  400 Size:    32 [unused]\n//   uint4 xe_edram_rt_blend_factors_ops;// Offset:  432 Size:    16 [unused]\n//   float4 xe_edram_blend_constant;    // Offset:  448 Size:    16 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_system_cbuffer                 cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Patch Constant signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// SV_TessFactor            0   x           0 QUADEDGE   float   x   \n// SV_TessFactor            1   x           1 QUADEDGE   float   x   \n// SV_TessFactor            2   x           2 QUADEDGE   float   x   \n// SV_TessFactor            3   x           3 QUADEDGE   float   x   \n// SV_InsideTessFactor      0   x           4  QUADINT   float   x   \n// SV_InsideTessFactor      1   x           5  QUADINT   float   x   \n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// XEVERTEXID               0   x           0     NONE   float   x   \n//\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// XEVERTEXID               0   x           0     NONE   float   x   \n//\n// Tessellation Domain   # of control points\n// -------------------- --------------------\n// Quadrilateral                           1\n//\n// Tessellation Output Primitive  Partitioning Type \n// ------------------------------ ------------------\n// Clockwise Triangles            Even Fractional   \n//\nhs_5_1\nhs_decls \ndcl_input_control_point_count 1\ndcl_output_control_point_count 1\ndcl_tessellator_domain domain_quad\ndcl_tessellator_partitioning partitioning_fractional_even\ndcl_tessellator_output_primitive output_triangle_cw\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][1], immediateIndexed, space=0\nhs_control_point_phase \ndcl_input v[1][0].x\ndcl_output o0.x\nmov o0.x, v[0][0].x\nret \nhs_fork_phase \ndcl_hs_fork_phase_instance_count 4\ndcl_input vForkInstanceID\ndcl_output_siv o0.x, finalQuadUeq0EdgeTessFactor\ndcl_output_siv o1.x, finalQuadVeq0EdgeTessFactor\ndcl_output_siv o2.x, finalQuadUeq1EdgeTessFactor\ndcl_output_siv o3.x, finalQuadVeq1EdgeTessFactor\ndcl_temps 1\ndcl_indexrange o0.x 4\nmov r0.x, vForkInstanceID.x\nmov o[r0.x + 0].x, CB0[0][0].z\nret \nhs_fork_phase \ndcl_hs_fork_phase_instance_count 2\ndcl_input vForkInstanceID\ndcl_output_siv o4.x, finalQuadUInsideTessFactor\ndcl_output_siv o5.x, finalQuadVInsideTessFactor\ndcl_temps 1\ndcl_indexrange o4.x 2\nmov r0.x, vForkInstanceID.x\nmov o[r0.x + 4].x, CB0[0][0].z\nret \n// Approximately 8 instruction slots used\n#endif\n\nconst BYTE continuous_quad_1cp_hs[] =\n{\n     68,  88,  66,  67,  75,   3, \n    204,  69, 118,  69, 237, 244, \n     19, 228,   4,  30, 244,  91, \n    101, 237,   1,   0,   0,   0, \n    228,  13,   0,   0,   6,   0, \n      0,   0,  56,   0,   0,   0, \n    116,  10,   0,   0, 168,  10, \n      0,   0, 220,  10,   0,   0, \n    160,  11,   0,   0,  72,  13, \n      0,   0,  82,  68,  69,  70, \n     52,  10,   0,   0,   1,   0, \n      0,   0, 120,   0,   0,   0, \n      1,   0,   0,   0,  60,   0, \n      0,   0,   1,   5,  83,  72, \n      0,   5,   0,   0,  10,  10, \n      0,   0,  19,  19,  68,  37, \n     60,   0,   0,   0,  24,   0, \n      0,   0,  40,   0,   0,   0, \n     40,   0,   0,   0,  36,   0, \n      0,   0,  12,   0,   0,   0, \n      0,   0,   0,   0, 100,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 120, 101,  95, 115, \n    121, 115, 116, 101, 109,  95, \n     99,  98, 117, 102, 102, 101, \n    114,   0, 171, 171, 100,   0, \n      0,   0,  30,   0,   0,   0, \n    144,   0,   0,   0, 208,   1, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  64,   5, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,  80,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 116,   5,   0,   0, \n      4,   0,   0,   0,   8,   0, \n      0,   0,   2,   0,   0,   0, \n    152,   5,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    188,   5,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,  80,   5, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 215,   5, \n      0,   0,  16,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,  80,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 238,   5,   0,   0, \n     20,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n     80,   5,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n      5,   6,   0,   0,  24,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  36,   6, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  72,   6, \n      0,   0,  32,   0,   0,   0, \n     96,   0,   0,   0,   0,   0, \n      0,   0, 100,   6,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 136,   6,   0,   0, \n    128,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    156,   6,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    192,   6,   0,   0, 140,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0, 228,   6, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,   8,   7, \n      0,   0, 144,   0,   0,   0, \n     12,   0,   0,   0,   0,   0, \n      0,   0, 156,   6,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  22,   7,   0,   0, \n    156,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n    228,   6,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     51,   7,   0,   0, 160,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0, 152,   5, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  78,   7, \n      0,   0, 168,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0, 152,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 117,   7,   0,   0, \n    176,   0,   0,   0,  32,   0, \n      0,   0,   0,   0,   0,   0, \n    152,   7,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    188,   7,   0,   0, 208,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,  80,   5, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 218,   7, \n      0,   0, 212,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  36,   6,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 239,   7,   0,   0, \n    220,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n    228,   6,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n      7,   8,   0,   0, 224,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,  80,   5, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  24,   8, \n      0,   0, 228,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,  80,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  64,   8,   0,   0, \n    232,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n     80,   5,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     98,   8,   0,   0, 240,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0, 116,   8, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 152,   8, \n      0,   0,   0,   1,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0, 152,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 179,   8,   0,   0, \n      8,   1,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n    152,   5,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    205,   8,   0,   0,  16,   1, \n      0,   0,  32,   0,   0,   0, \n      0,   0,   0,   0, 224,   8, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,   4,   9, \n      0,   0,  48,   1,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  36,   9,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  72,   9,   0,   0, \n     64,   1,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     36,   9,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     97,   9,   0,   0,  80,   1, \n      0,   0,  64,   0,   0,   0, \n      0,   0,   0,   0, 116,   9, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 152,   9, \n      0,   0, 144,   1,   0,   0, \n     32,   0,   0,   0,   0,   0, \n      0,   0, 176,   9,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 212,   9,   0,   0, \n    176,   1,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     36,   9,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    242,   9,   0,   0, 192,   1, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0, 116,   8, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 120, 101, \n     95, 102, 108,  97, 103, 115, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  73,   5, \n      0,   0, 120, 101,  95, 116, \n    101, 115, 115, 101, 108, 108, \n     97, 116, 105, 111, 110,  95, \n    102,  97,  99, 116, 111, 114, \n     95, 114,  97, 110, 103, 101, \n      0, 102, 108, 111,  97, 116, \n     50,   0,   1,   0,   3,   0, \n      1,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 145,   5, \n      0,   0, 120, 101,  95, 108, \n    105, 110, 101,  95, 108, 111, \n    111, 112,  95,  99, 108, 111, \n    115, 105, 110, 103,  95, 105, \n    110, 100, 101, 120,   0, 120, \n    101,  95, 118, 101, 114, 116, \n    101, 120,  95, 105, 110, 100, \n    101, 120,  95, 101, 110, 100, \n    105,  97, 110,   0, 120, 101, \n     95, 118, 101, 114, 116, 101, \n    120,  95, 105, 110, 100, 101, \n    120,  95, 111, 102, 102, 115, \n    101, 116,   0, 120, 101,  95, \n    118, 101, 114, 116, 101, 120, \n     95, 105, 110, 100, 101, 120, \n     95, 109, 105, 110,  95, 109, \n     97, 120,   0, 117, 105, 110, \n    116,  50,   0, 171,   1,   0, \n     19,   0,   1,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     29,   6,   0,   0, 120, 101, \n     95, 117, 115, 101, 114,  95, \n     99, 108, 105, 112,  95, 112, \n    108,  97, 110, 101, 115,   0, \n    102, 108, 111,  97, 116,  52, \n      0, 171,   1,   0,   3,   0, \n      1,   0,   4,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  92,   6, \n      0,   0, 120, 101,  95, 110, \n    100,  99,  95, 115,  99,  97, \n    108, 101,   0, 102, 108, 111, \n     97, 116,  51,   0,   1,   0, \n      3,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    149,   6,   0,   0, 120, 101, \n     95, 112, 111, 105, 110, 116, \n     95, 118, 101, 114, 116, 101, \n    120,  95, 100, 105,  97, 109, \n    101, 116, 101, 114,  95, 109, \n    105, 110,   0, 102, 108, 111, \n     97, 116,   0, 171,   0,   0, \n      3,   0,   1,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    221,   6,   0,   0, 120, 101, \n     95, 110, 100,  99,  95, 111, \n    102, 102, 115, 101, 116,   0, \n    120, 101,  95, 112, 111, 105, \n    110, 116,  95, 118, 101, 114, \n    116, 101, 120,  95, 100, 105, \n     97, 109, 101, 116, 101, 114, \n     95, 109,  97, 120,   0, 120, \n    101,  95, 112, 111, 105, 110, \n    116,  95,  99, 111, 110, 115, \n    116,  97, 110, 116,  95, 100, \n    105,  97, 109, 101, 116, 101, \n    114,   0, 120, 101,  95, 112, \n    111, 105, 110, 116,  95, 115, \n     99, 114, 101, 101, 110,  95, \n    100, 105,  97, 109, 101, 116, \n    101, 114,  95, 116, 111,  95, \n    110, 100,  99,  95, 114,  97, \n    100, 105, 117, 115,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 115, 119, \n    105, 122, 122, 108, 101, 100, \n     95, 115, 105, 103, 110, 115, \n      0, 117, 105, 110, 116,  52, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   4,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    143,   7,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101, 115,  95, 114, 101, \n    115, 111, 108, 117, 116, 105, \n    111, 110,  95, 115,  99,  97, \n    108, 101, 100,   0, 120, 101, \n     95, 115,  97, 109, 112, 108, \n    101,  95,  99, 111, 117, 110, \n    116,  95, 108, 111, 103,  50, \n      0, 120, 101,  95,  97, 108, \n    112, 104,  97,  95, 116, 101, \n    115, 116,  95, 114, 101, 102, \n    101, 114, 101, 110,  99, 101, \n      0, 120, 101,  95,  97, 108, \n    112, 104,  97,  95, 116, 111, \n     95, 109,  97, 115, 107,   0, \n    120, 101,  95, 101, 100, 114, \n     97, 109,  95,  51,  50,  98, \n    112, 112,  95, 116, 105, 108, \n    101,  95, 112, 105, 116,  99, \n    104,  95, 100, 119, 111, 114, \n    100, 115,  95, 115,  99,  97, \n    108, 101, 100,   0, 120, 101, \n     95, 101, 100, 114,  97, 109, \n     95, 100, 101, 112, 116, 104, \n     95,  98,  97, 115, 101,  95, \n    100, 119, 111, 114, 100, 115, \n     95, 115,  99,  97, 108, 101, \n    100,   0, 120, 101,  95,  99, \n    111, 108, 111, 114,  95, 101, \n    120, 112,  95,  98, 105,  97, \n    115,   0,   1,   0,   3,   0, \n      1,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  92,   6, \n      0,   0, 120, 101,  95, 101, \n    100, 114,  97, 109,  95, 112, \n    111, 108, 121,  95, 111, 102, \n    102, 115, 101, 116,  95, 102, \n    114, 111, 110, 116,   0, 120, \n    101,  95, 101, 100, 114,  97, \n    109,  95, 112, 111, 108, 121, \n     95, 111, 102, 102, 115, 101, \n    116,  95,  98,  97,  99, 107, \n      0, 120, 101,  95, 101, 100, \n    114,  97, 109,  95, 115, 116, \n    101, 110,  99, 105, 108,   0, \n    171, 171,   1,   0,  19,   0, \n      1,   0,   4,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 143,   7, \n      0,   0, 120, 101,  95, 101, \n    100, 114,  97, 109,  95, 114, \n    116,  95,  98,  97, 115, 101, \n     95, 100, 119, 111, 114, 100, \n    115,  95, 115,  99,  97, 108, \n    101, 100,   0, 171,   1,   0, \n     19,   0,   1,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    143,   7,   0,   0, 120, 101, \n     95, 101, 100, 114,  97, 109, \n     95, 114, 116,  95, 102, 111, \n    114, 109,  97, 116,  95, 102, \n    108,  97, 103, 115,   0, 120, \n    101,  95, 101, 100, 114,  97, \n    109,  95, 114, 116,  95,  99, \n    108,  97, 109, 112,   0, 171, \n      1,   0,   3,   0,   1,   0, \n      4,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  92,   6,   0,   0, \n    120, 101,  95, 101, 100, 114, \n     97, 109,  95, 114, 116,  95, \n    107, 101, 101, 112,  95, 109, \n     97, 115, 107,   0, 171, 171, \n      1,   0,  19,   0,   1,   0, \n      4,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 143,   7,   0,   0, \n    120, 101,  95, 101, 100, 114, \n     97, 109,  95, 114, 116,  95, \n     98, 108, 101, 110, 100,  95, \n    102,  97,  99, 116, 111, 114, \n    115,  95, 111, 112, 115,   0, \n    120, 101,  95, 101, 100, 114, \n     97, 109,  95,  98, 108, 101, \n    110, 100,  95,  99, 111, 110, \n    115, 116,  97, 110, 116,   0, \n     77, 105,  99, 114, 111, 115, \n    111, 102, 116,  32,  40,  82, \n     41,  32,  72,  76,  83,  76, \n     32,  83, 104,  97, 100, 101, \n    114,  32,  67, 111, 109, 112, \n    105, 108, 101, 114,  32,  49, \n     48,  46,  49,   0, 171, 171, \n     73,  83,  71,  78,  44,   0, \n      0,   0,   1,   0,   0,   0, \n      8,   0,   0,   0,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   1,   0,   0,  88,  69, \n     86,  69,  82,  84,  69,  88, \n     73,  68,   0, 171,  79,  83, \n     71,  78,  44,   0,   0,   0, \n      1,   0,   0,   0,   8,   0, \n      0,   0,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   1,  14, \n      0,   0,  88,  69,  86,  69, \n     82,  84,  69,  88,  73,  68, \n      0, 171,  80,  67,  83,  71, \n    188,   0,   0,   0,   6,   0, \n      0,   0,   8,   0,   0,   0, \n    152,   0,   0,   0,   0,   0, \n      0,   0,  11,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   1,  14,   0,   0, \n    152,   0,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   0,   1,  14,   0,   0, \n    152,   0,   0,   0,   2,   0, \n      0,   0,  11,   0,   0,   0, \n      3,   0,   0,   0,   2,   0, \n      0,   0,   1,  14,   0,   0, \n    152,   0,   0,   0,   3,   0, \n      0,   0,  11,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   1,  14,   0,   0, \n    166,   0,   0,   0,   0,   0, \n      0,   0,  12,   0,   0,   0, \n      3,   0,   0,   0,   4,   0, \n      0,   0,   1,  14,   0,   0, \n    166,   0,   0,   0,   1,   0, \n      0,   0,  12,   0,   0,   0, \n      3,   0,   0,   0,   5,   0, \n      0,   0,   1,  14,   0,   0, \n     83,  86,  95,  84, 101, 115, \n    115,  70,  97,  99, 116, 111, \n    114,   0,  83,  86,  95,  73, \n    110, 115, 105, 100, 101,  84, \n    101, 115, 115,  70,  97,  99, \n    116, 111, 114,   0, 171, 171, \n     83,  72,  69,  88, 160,   1, \n      0,   0,  81,   0,   3,   0, \n    104,   0,   0,   0, 113,   0, \n      0,   1, 147,   8,   0,   1, \n    148,   8,   0,   1, 149,  24, \n      0,   1, 150,  32,   0,   1, \n    151,  24,   0,   1, 106,   8, \n      0,   1,  89,   0,   0,   7, \n     70, 142,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n    114,   0,   0,   1,  95,   0, \n      0,   4,  18,  16,  32,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0, 101,   0,   0,   3, \n     18,  32,  16,   0,   0,   0, \n      0,   0,  54,   0,   0,   6, \n     18,  32,  16,   0,   0,   0, \n      0,   0,  10,  16,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  62,   0,   0,   1, \n    115,   0,   0,   1, 153,   0, \n      0,   2,   4,   0,   0,   0, \n     95,   0,   0,   2,   0, 112, \n      1,   0, 103,   0,   0,   4, \n     18,  32,  16,   0,   0,   0, \n      0,   0,  11,   0,   0,   0, \n    103,   0,   0,   4,  18,  32, \n     16,   0,   1,   0,   0,   0, \n     12,   0,   0,   0, 103,   0, \n      0,   4,  18,  32,  16,   0, \n      2,   0,   0,   0,  13,   0, \n      0,   0, 103,   0,   0,   4, \n     18,  32,  16,   0,   3,   0, \n      0,   0,  14,   0,   0,   0, \n    104,   0,   0,   2,   1,   0, \n      0,   0,  91,   0,   0,   4, \n     18,  32,  16,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n     54,   0,   0,   4,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10, 112,   1,   0,  54,   0, \n      0,   8,  18,  32, 144,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  42, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     62,   0,   0,   1, 115,   0, \n      0,   1, 153,   0,   0,   2, \n      2,   0,   0,   0,  95,   0, \n      0,   2,   0, 112,   1,   0, \n    103,   0,   0,   4,  18,  32, \n     16,   0,   4,   0,   0,   0, \n     15,   0,   0,   0, 103,   0, \n      0,   4,  18,  32,  16,   0, \n      5,   0,   0,   0,  16,   0, \n      0,   0, 104,   0,   0,   2, \n      1,   0,   0,   0,  91,   0, \n      0,   4,  18,  32,  16,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0,  54,   0,   0,   4, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10, 112,   1,   0, \n     54,   0,   0,   9,  18,  32, \n    208,   0,   4,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  42, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  83,  84, \n     65,  84, 148,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   5,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   3,   0, \n      0,   0,   4,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/continuous_quad_4cp_hs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer xe_system_cbuffer\n// {\n//\n//   uint xe_flags;                     // Offset:    0 Size:     4 [unused]\n//   float2 xe_tessellation_factor_range;// Offset:    4 Size:     8\n//   uint xe_line_loop_closing_index;   // Offset:   12 Size:     4 [unused]\n//   uint xe_vertex_index_endian;       // Offset:   16 Size:     4 [unused]\n//   uint xe_vertex_index_offset;       // Offset:   20 Size:     4 [unused]\n//   uint2 xe_vertex_index_min_max;     // Offset:   24 Size:     8 [unused]\n//   float4 xe_user_clip_planes[6];     // Offset:   32 Size:    96 [unused]\n//   float3 xe_ndc_scale;               // Offset:  128 Size:    12 [unused]\n//   float xe_point_vertex_diameter_min;// Offset:  140 Size:     4 [unused]\n//   float3 xe_ndc_offset;              // Offset:  144 Size:    12 [unused]\n//   float xe_point_vertex_diameter_max;// Offset:  156 Size:     4 [unused]\n//   float2 xe_point_constant_diameter; // Offset:  160 Size:     8 [unused]\n//   float2 xe_point_screen_diameter_to_ndc_radius;// Offset:  168 Size:     8 [unused]\n//   uint4 xe_texture_swizzled_signs[2];// Offset:  176 Size:    32 [unused]\n//   uint xe_textures_resolution_scaled;// Offset:  208 Size:     4 [unused]\n//   uint2 xe_sample_count_log2;        // Offset:  212 Size:     8 [unused]\n//   float xe_alpha_test_reference;     // Offset:  220 Size:     4 [unused]\n//   uint xe_alpha_to_mask;             // Offset:  224 Size:     4 [unused]\n//   uint xe_edram_32bpp_tile_pitch_dwords_scaled;// Offset:  228 Size:     4 [unused]\n//   uint xe_edram_depth_base_dwords_scaled;// Offset:  232 Size:     4 [unused]\n//   float4 xe_color_exp_bias;          // Offset:  240 Size:    16 [unused]\n//   float2 xe_edram_poly_offset_front; // Offset:  256 Size:     8 [unused]\n//   float2 xe_edram_poly_offset_back;  // Offset:  264 Size:     8 [unused]\n//   uint4 xe_edram_stencil[2];         // Offset:  272 Size:    32 [unused]\n//   uint4 xe_edram_rt_base_dwords_scaled;// Offset:  304 Size:    16 [unused]\n//   uint4 xe_edram_rt_format_flags;    // Offset:  320 Size:    16 [unused]\n//   float4 xe_edram_rt_clamp[4];       // Offset:  336 Size:    64 [unused]\n//   uint4 xe_edram_rt_keep_mask[2];    // Offset:  400 Size:    32 [unused]\n//   uint4 xe_edram_rt_blend_factors_ops;// Offset:  432 Size:    16 [unused]\n//   float4 xe_edram_blend_constant;    // Offset:  448 Size:    16 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_system_cbuffer                 cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Patch Constant signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// SV_TessFactor            0   x           0 QUADEDGE   float   x   \n// SV_TessFactor            1   x           1 QUADEDGE   float   x   \n// SV_TessFactor            2   x           2 QUADEDGE   float   x   \n// SV_TessFactor            3   x           3 QUADEDGE   float   x   \n// SV_InsideTessFactor      0   x           4  QUADINT   float   x   \n// SV_InsideTessFactor      1   x           5  QUADINT   float   x   \n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// XEVERTEXID               0   x           0     NONE   float   x   \n//\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// XEVERTEXID               0   x           0     NONE   float   x   \n//\n// Tessellation Domain   # of control points\n// -------------------- --------------------\n// Quadrilateral                           4\n//\n// Tessellation Output Primitive  Partitioning Type \n// ------------------------------ ------------------\n// Clockwise Triangles            Even Fractional   \n//\nhs_5_1\nhs_decls \ndcl_input_control_point_count 4\ndcl_output_control_point_count 4\ndcl_tessellator_domain domain_quad\ndcl_tessellator_partitioning partitioning_fractional_even\ndcl_tessellator_output_primitive output_triangle_cw\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][1], immediateIndexed, space=0\nhs_fork_phase \ndcl_hs_fork_phase_instance_count 4\ndcl_input vForkInstanceID\ndcl_output_siv o0.x, finalQuadUeq0EdgeTessFactor\ndcl_output_siv o1.x, finalQuadVeq0EdgeTessFactor\ndcl_output_siv o2.x, finalQuadUeq1EdgeTessFactor\ndcl_output_siv o3.x, finalQuadVeq1EdgeTessFactor\ndcl_temps 1\ndcl_indexrange o0.x 4\nmov r0.x, vForkInstanceID.x\nmov o[r0.x + 0].x, CB0[0][0].z\nret \nhs_fork_phase \ndcl_hs_fork_phase_instance_count 2\ndcl_input vForkInstanceID\ndcl_output_siv o4.x, finalQuadUInsideTessFactor\ndcl_output_siv o5.x, finalQuadVInsideTessFactor\ndcl_temps 1\ndcl_indexrange o4.x 2\nmov r0.x, vForkInstanceID.x\nmov o[r0.x + 4].x, CB0[0][0].z\nret \n// Approximately 6 instruction slots used\n#endif\n\nconst BYTE continuous_quad_4cp_hs[] =\n{\n     68,  88,  66,  67,   6,  62, \n     31, 216, 142, 131, 210,  70, \n    184,  74,  84,  23, 232, 171, \n    185, 244,   1,   0,   0,   0, \n    168,  13,   0,   0,   6,   0, \n      0,   0,  56,   0,   0,   0, \n    116,  10,   0,   0, 168,  10, \n      0,   0, 220,  10,   0,   0, \n    160,  11,   0,   0,  12,  13, \n      0,   0,  82,  68,  69,  70, \n     52,  10,   0,   0,   1,   0, \n      0,   0, 120,   0,   0,   0, \n      1,   0,   0,   0,  60,   0, \n      0,   0,   1,   5,  83,  72, \n      0,   5,   0,   0,  10,  10, \n      0,   0,  19,  19,  68,  37, \n     60,   0,   0,   0,  24,   0, \n      0,   0,  40,   0,   0,   0, \n     40,   0,   0,   0,  36,   0, \n      0,   0,  12,   0,   0,   0, \n      0,   0,   0,   0, 100,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 120, 101,  95, 115, \n    121, 115, 116, 101, 109,  95, \n     99,  98, 117, 102, 102, 101, \n    114,   0, 171, 171, 100,   0, \n      0,   0,  30,   0,   0,   0, \n    144,   0,   0,   0, 208,   1, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  64,   5, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,  80,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 116,   5,   0,   0, \n      4,   0,   0,   0,   8,   0, \n      0,   0,   2,   0,   0,   0, \n    152,   5,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    188,   5,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,  80,   5, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 215,   5, \n      0,   0,  16,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,  80,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 238,   5,   0,   0, \n     20,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n     80,   5,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n      5,   6,   0,   0,  24,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  36,   6, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  72,   6, \n      0,   0,  32,   0,   0,   0, \n     96,   0,   0,   0,   0,   0, \n      0,   0, 100,   6,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 136,   6,   0,   0, \n    128,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    156,   6,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    192,   6,   0,   0, 140,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0, 228,   6, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,   8,   7, \n      0,   0, 144,   0,   0,   0, \n     12,   0,   0,   0,   0,   0, \n      0,   0, 156,   6,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  22,   7,   0,   0, \n    156,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n    228,   6,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     51,   7,   0,   0, 160,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0, 152,   5, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  78,   7, \n      0,   0, 168,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0, 152,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 117,   7,   0,   0, \n    176,   0,   0,   0,  32,   0, \n      0,   0,   0,   0,   0,   0, \n    152,   7,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    188,   7,   0,   0, 208,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,  80,   5, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 218,   7, \n      0,   0, 212,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  36,   6,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 239,   7,   0,   0, \n    220,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n    228,   6,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n      7,   8,   0,   0, 224,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,  80,   5, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  24,   8, \n      0,   0, 228,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,  80,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  64,   8,   0,   0, \n    232,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n     80,   5,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     98,   8,   0,   0, 240,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0, 116,   8, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 152,   8, \n      0,   0,   0,   1,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0, 152,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 179,   8,   0,   0, \n      8,   1,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n    152,   5,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    205,   8,   0,   0,  16,   1, \n      0,   0,  32,   0,   0,   0, \n      0,   0,   0,   0, 224,   8, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,   4,   9, \n      0,   0,  48,   1,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  36,   9,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  72,   9,   0,   0, \n     64,   1,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     36,   9,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     97,   9,   0,   0,  80,   1, \n      0,   0,  64,   0,   0,   0, \n      0,   0,   0,   0, 116,   9, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 152,   9, \n      0,   0, 144,   1,   0,   0, \n     32,   0,   0,   0,   0,   0, \n      0,   0, 176,   9,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 212,   9,   0,   0, \n    176,   1,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     36,   9,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    242,   9,   0,   0, 192,   1, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0, 116,   8, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 120, 101, \n     95, 102, 108,  97, 103, 115, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  73,   5, \n      0,   0, 120, 101,  95, 116, \n    101, 115, 115, 101, 108, 108, \n     97, 116, 105, 111, 110,  95, \n    102,  97,  99, 116, 111, 114, \n     95, 114,  97, 110, 103, 101, \n      0, 102, 108, 111,  97, 116, \n     50,   0,   1,   0,   3,   0, \n      1,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 145,   5, \n      0,   0, 120, 101,  95, 108, \n    105, 110, 101,  95, 108, 111, \n    111, 112,  95,  99, 108, 111, \n    115, 105, 110, 103,  95, 105, \n    110, 100, 101, 120,   0, 120, \n    101,  95, 118, 101, 114, 116, \n    101, 120,  95, 105, 110, 100, \n    101, 120,  95, 101, 110, 100, \n    105,  97, 110,   0, 120, 101, \n     95, 118, 101, 114, 116, 101, \n    120,  95, 105, 110, 100, 101, \n    120,  95, 111, 102, 102, 115, \n    101, 116,   0, 120, 101,  95, \n    118, 101, 114, 116, 101, 120, \n     95, 105, 110, 100, 101, 120, \n     95, 109, 105, 110,  95, 109, \n     97, 120,   0, 117, 105, 110, \n    116,  50,   0, 171,   1,   0, \n     19,   0,   1,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     29,   6,   0,   0, 120, 101, \n     95, 117, 115, 101, 114,  95, \n     99, 108, 105, 112,  95, 112, \n    108,  97, 110, 101, 115,   0, \n    102, 108, 111,  97, 116,  52, \n      0, 171,   1,   0,   3,   0, \n      1,   0,   4,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  92,   6, \n      0,   0, 120, 101,  95, 110, \n    100,  99,  95, 115,  99,  97, \n    108, 101,   0, 102, 108, 111, \n     97, 116,  51,   0,   1,   0, \n      3,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    149,   6,   0,   0, 120, 101, \n     95, 112, 111, 105, 110, 116, \n     95, 118, 101, 114, 116, 101, \n    120,  95, 100, 105,  97, 109, \n    101, 116, 101, 114,  95, 109, \n    105, 110,   0, 102, 108, 111, \n     97, 116,   0, 171,   0,   0, \n      3,   0,   1,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    221,   6,   0,   0, 120, 101, \n     95, 110, 100,  99,  95, 111, \n    102, 102, 115, 101, 116,   0, \n    120, 101,  95, 112, 111, 105, \n    110, 116,  95, 118, 101, 114, \n    116, 101, 120,  95, 100, 105, \n     97, 109, 101, 116, 101, 114, \n     95, 109,  97, 120,   0, 120, \n    101,  95, 112, 111, 105, 110, \n    116,  95,  99, 111, 110, 115, \n    116,  97, 110, 116,  95, 100, \n    105,  97, 109, 101, 116, 101, \n    114,   0, 120, 101,  95, 112, \n    111, 105, 110, 116,  95, 115, \n     99, 114, 101, 101, 110,  95, \n    100, 105,  97, 109, 101, 116, \n    101, 114,  95, 116, 111,  95, \n    110, 100,  99,  95, 114,  97, \n    100, 105, 117, 115,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 115, 119, \n    105, 122, 122, 108, 101, 100, \n     95, 115, 105, 103, 110, 115, \n      0, 117, 105, 110, 116,  52, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   4,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    143,   7,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101, 115,  95, 114, 101, \n    115, 111, 108, 117, 116, 105, \n    111, 110,  95, 115,  99,  97, \n    108, 101, 100,   0, 120, 101, \n     95, 115,  97, 109, 112, 108, \n    101,  95,  99, 111, 117, 110, \n    116,  95, 108, 111, 103,  50, \n      0, 120, 101,  95,  97, 108, \n    112, 104,  97,  95, 116, 101, \n    115, 116,  95, 114, 101, 102, \n    101, 114, 101, 110,  99, 101, \n      0, 120, 101,  95,  97, 108, \n    112, 104,  97,  95, 116, 111, \n     95, 109,  97, 115, 107,   0, \n    120, 101,  95, 101, 100, 114, \n     97, 109,  95,  51,  50,  98, \n    112, 112,  95, 116, 105, 108, \n    101,  95, 112, 105, 116,  99, \n    104,  95, 100, 119, 111, 114, \n    100, 115,  95, 115,  99,  97, \n    108, 101, 100,   0, 120, 101, \n     95, 101, 100, 114,  97, 109, \n     95, 100, 101, 112, 116, 104, \n     95,  98,  97, 115, 101,  95, \n    100, 119, 111, 114, 100, 115, \n     95, 115,  99,  97, 108, 101, \n    100,   0, 120, 101,  95,  99, \n    111, 108, 111, 114,  95, 101, \n    120, 112,  95,  98, 105,  97, \n    115,   0,   1,   0,   3,   0, \n      1,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  92,   6, \n      0,   0, 120, 101,  95, 101, \n    100, 114,  97, 109,  95, 112, \n    111, 108, 121,  95, 111, 102, \n    102, 115, 101, 116,  95, 102, \n    114, 111, 110, 116,   0, 120, \n    101,  95, 101, 100, 114,  97, \n    109,  95, 112, 111, 108, 121, \n     95, 111, 102, 102, 115, 101, \n    116,  95,  98,  97,  99, 107, \n      0, 120, 101,  95, 101, 100, \n    114,  97, 109,  95, 115, 116, \n    101, 110,  99, 105, 108,   0, \n    171, 171,   1,   0,  19,   0, \n      1,   0,   4,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 143,   7, \n      0,   0, 120, 101,  95, 101, \n    100, 114,  97, 109,  95, 114, \n    116,  95,  98,  97, 115, 101, \n     95, 100, 119, 111, 114, 100, \n    115,  95, 115,  99,  97, 108, \n    101, 100,   0, 171,   1,   0, \n     19,   0,   1,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    143,   7,   0,   0, 120, 101, \n     95, 101, 100, 114,  97, 109, \n     95, 114, 116,  95, 102, 111, \n    114, 109,  97, 116,  95, 102, \n    108,  97, 103, 115,   0, 120, \n    101,  95, 101, 100, 114,  97, \n    109,  95, 114, 116,  95,  99, \n    108,  97, 109, 112,   0, 171, \n      1,   0,   3,   0,   1,   0, \n      4,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  92,   6,   0,   0, \n    120, 101,  95, 101, 100, 114, \n     97, 109,  95, 114, 116,  95, \n    107, 101, 101, 112,  95, 109, \n     97, 115, 107,   0, 171, 171, \n      1,   0,  19,   0,   1,   0, \n      4,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 143,   7,   0,   0, \n    120, 101,  95, 101, 100, 114, \n     97, 109,  95, 114, 116,  95, \n     98, 108, 101, 110, 100,  95, \n    102,  97,  99, 116, 111, 114, \n    115,  95, 111, 112, 115,   0, \n    120, 101,  95, 101, 100, 114, \n     97, 109,  95,  98, 108, 101, \n    110, 100,  95,  99, 111, 110, \n    115, 116,  97, 110, 116,   0, \n     77, 105,  99, 114, 111, 115, \n    111, 102, 116,  32,  40,  82, \n     41,  32,  72,  76,  83,  76, \n     32,  83, 104,  97, 100, 101, \n    114,  32,  67, 111, 109, 112, \n    105, 108, 101, 114,  32,  49, \n     48,  46,  49,   0, 171, 171, \n     73,  83,  71,  78,  44,   0, \n      0,   0,   1,   0,   0,   0, \n      8,   0,   0,   0,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   1,   0,   0,  88,  69, \n     86,  69,  82,  84,  69,  88, \n     73,  68,   0, 171,  79,  83, \n     71,  78,  44,   0,   0,   0, \n      1,   0,   0,   0,   8,   0, \n      0,   0,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   1,  14, \n      0,   0,  88,  69,  86,  69, \n     82,  84,  69,  88,  73,  68, \n      0, 171,  80,  67,  83,  71, \n    188,   0,   0,   0,   6,   0, \n      0,   0,   8,   0,   0,   0, \n    152,   0,   0,   0,   0,   0, \n      0,   0,  11,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   1,  14,   0,   0, \n    152,   0,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   0,   1,  14,   0,   0, \n    152,   0,   0,   0,   2,   0, \n      0,   0,  11,   0,   0,   0, \n      3,   0,   0,   0,   2,   0, \n      0,   0,   1,  14,   0,   0, \n    152,   0,   0,   0,   3,   0, \n      0,   0,  11,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   1,  14,   0,   0, \n    166,   0,   0,   0,   0,   0, \n      0,   0,  12,   0,   0,   0, \n      3,   0,   0,   0,   4,   0, \n      0,   0,   1,  14,   0,   0, \n    166,   0,   0,   0,   1,   0, \n      0,   0,  12,   0,   0,   0, \n      3,   0,   0,   0,   5,   0, \n      0,   0,   1,  14,   0,   0, \n     83,  86,  95,  84, 101, 115, \n    115,  70,  97,  99, 116, 111, \n    114,   0,  83,  86,  95,  73, \n    110, 115, 105, 100, 101,  84, \n    101, 115, 115,  70,  97,  99, \n    116, 111, 114,   0, 171, 171, \n     83,  72,  69,  88, 100,   1, \n      0,   0,  81,   0,   3,   0, \n     89,   0,   0,   0, 113,   0, \n      0,   1, 147,  32,   0,   1, \n    148,  32,   0,   1, 149,  24, \n      0,   1, 150,  32,   0,   1, \n    151,  24,   0,   1, 106,   8, \n      0,   1,  89,   0,   0,   7, \n     70, 142,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n    115,   0,   0,   1, 153,   0, \n      0,   2,   4,   0,   0,   0, \n     95,   0,   0,   2,   0, 112, \n      1,   0, 103,   0,   0,   4, \n     18,  32,  16,   0,   0,   0, \n      0,   0,  11,   0,   0,   0, \n    103,   0,   0,   4,  18,  32, \n     16,   0,   1,   0,   0,   0, \n     12,   0,   0,   0, 103,   0, \n      0,   4,  18,  32,  16,   0, \n      2,   0,   0,   0,  13,   0, \n      0,   0, 103,   0,   0,   4, \n     18,  32,  16,   0,   3,   0, \n      0,   0,  14,   0,   0,   0, \n    104,   0,   0,   2,   1,   0, \n      0,   0,  91,   0,   0,   4, \n     18,  32,  16,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n     54,   0,   0,   4,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10, 112,   1,   0,  54,   0, \n      0,   8,  18,  32, 144,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  42, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     62,   0,   0,   1, 115,   0, \n      0,   1, 153,   0,   0,   2, \n      2,   0,   0,   0,  95,   0, \n      0,   2,   0, 112,   1,   0, \n    103,   0,   0,   4,  18,  32, \n     16,   0,   4,   0,   0,   0, \n     15,   0,   0,   0, 103,   0, \n      0,   4,  18,  32,  16,   0, \n      5,   0,   0,   0,  16,   0, \n      0,   0, 104,   0,   0,   2, \n      1,   0,   0,   0,  91,   0, \n      0,   4,  18,  32,  16,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0,  54,   0,   0,   4, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10, 112,   1,   0, \n     54,   0,   0,   9,  18,  32, \n    208,   0,   4,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  42, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  83,  84, \n     65,  84, 148,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   3,   0, \n      0,   0,   4,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/continuous_triangle_1cp_hs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer xe_system_cbuffer\n// {\n//\n//   uint xe_flags;                     // Offset:    0 Size:     4 [unused]\n//   float2 xe_tessellation_factor_range;// Offset:    4 Size:     8\n//   uint xe_line_loop_closing_index;   // Offset:   12 Size:     4 [unused]\n//   uint xe_vertex_index_endian;       // Offset:   16 Size:     4 [unused]\n//   uint xe_vertex_index_offset;       // Offset:   20 Size:     4 [unused]\n//   uint2 xe_vertex_index_min_max;     // Offset:   24 Size:     8 [unused]\n//   float4 xe_user_clip_planes[6];     // Offset:   32 Size:    96 [unused]\n//   float3 xe_ndc_scale;               // Offset:  128 Size:    12 [unused]\n//   float xe_point_vertex_diameter_min;// Offset:  140 Size:     4 [unused]\n//   float3 xe_ndc_offset;              // Offset:  144 Size:    12 [unused]\n//   float xe_point_vertex_diameter_max;// Offset:  156 Size:     4 [unused]\n//   float2 xe_point_constant_diameter; // Offset:  160 Size:     8 [unused]\n//   float2 xe_point_screen_diameter_to_ndc_radius;// Offset:  168 Size:     8 [unused]\n//   uint4 xe_texture_swizzled_signs[2];// Offset:  176 Size:    32 [unused]\n//   uint xe_textures_resolution_scaled;// Offset:  208 Size:     4 [unused]\n//   uint2 xe_sample_count_log2;        // Offset:  212 Size:     8 [unused]\n//   float xe_alpha_test_reference;     // Offset:  220 Size:     4 [unused]\n//   uint xe_alpha_to_mask;             // Offset:  224 Size:     4 [unused]\n//   uint xe_edram_32bpp_tile_pitch_dwords_scaled;// Offset:  228 Size:     4 [unused]\n//   uint xe_edram_depth_base_dwords_scaled;// Offset:  232 Size:     4 [unused]\n//   float4 xe_color_exp_bias;          // Offset:  240 Size:    16 [unused]\n//   float2 xe_edram_poly_offset_front; // Offset:  256 Size:     8 [unused]\n//   float2 xe_edram_poly_offset_back;  // Offset:  264 Size:     8 [unused]\n//   uint4 xe_edram_stencil[2];         // Offset:  272 Size:    32 [unused]\n//   uint4 xe_edram_rt_base_dwords_scaled;// Offset:  304 Size:    16 [unused]\n//   uint4 xe_edram_rt_format_flags;    // Offset:  320 Size:    16 [unused]\n//   float4 xe_edram_rt_clamp[4];       // Offset:  336 Size:    64 [unused]\n//   uint4 xe_edram_rt_keep_mask[2];    // Offset:  400 Size:    32 [unused]\n//   uint4 xe_edram_rt_blend_factors_ops;// Offset:  432 Size:    16 [unused]\n//   float4 xe_edram_blend_constant;    // Offset:  448 Size:    16 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_system_cbuffer                 cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Patch Constant signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// SV_TessFactor            0   x           0  TRIEDGE   float   x   \n// SV_TessFactor            1   x           1  TRIEDGE   float   x   \n// SV_TessFactor            2   x           2  TRIEDGE   float   x   \n// SV_InsideTessFactor      0   x           3   TRIINT   float   x   \n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// XEVERTEXID               0   x           0     NONE   float   x   \n//\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// XEVERTEXID               0   x           0     NONE   float   x   \n//\n// Tessellation Domain   # of control points\n// -------------------- --------------------\n// Triangle                                1\n//\n// Tessellation Output Primitive  Partitioning Type \n// ------------------------------ ------------------\n// Clockwise Triangles            Even Fractional   \n//\nhs_5_1\nhs_decls \ndcl_input_control_point_count 1\ndcl_output_control_point_count 1\ndcl_tessellator_domain domain_tri\ndcl_tessellator_partitioning partitioning_fractional_even\ndcl_tessellator_output_primitive output_triangle_cw\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][1], immediateIndexed, space=0\nhs_control_point_phase \ndcl_input v[1][0].x\ndcl_output o0.x\nmov o0.x, v[0][0].x\nret \nhs_fork_phase \ndcl_hs_fork_phase_instance_count 3\ndcl_input vForkInstanceID\ndcl_output_siv o0.x, finalTriUeq0EdgeTessFactor\ndcl_output_siv o1.x, finalTriVeq0EdgeTessFactor\ndcl_output_siv o2.x, finalTriWeq0EdgeTessFactor\ndcl_temps 1\ndcl_indexrange o0.x 3\nmov r0.x, vForkInstanceID.x\nmov o[r0.x + 0].x, CB0[0][0].z\nret \nhs_fork_phase \ndcl_output_siv o3.x, finalTriInsideTessFactor\nmov o3.x, CB0[0][0].z\nret \n// Approximately 7 instruction slots used\n#endif\n\nconst BYTE continuous_triangle_1cp_hs[] =\n{\n     68,  88,  66,  67,   7, 179, \n     83, 139, 111, 125,   9, 167, \n    130, 181,  49, 127,  87, 182, \n     14,  89,   1,   0,   0,   0, \n     84,  13,   0,   0,   6,   0, \n      0,   0,  56,   0,   0,   0, \n    116,  10,   0,   0, 168,  10, \n      0,   0, 220,  10,   0,   0, \n    112,  11,   0,   0, 184,  12, \n      0,   0,  82,  68,  69,  70, \n     52,  10,   0,   0,   1,   0, \n      0,   0, 120,   0,   0,   0, \n      1,   0,   0,   0,  60,   0, \n      0,   0,   1,   5,  83,  72, \n      0,   5,   0,   0,  10,  10, \n      0,   0,  19,  19,  68,  37, \n     60,   0,   0,   0,  24,   0, \n      0,   0,  40,   0,   0,   0, \n     40,   0,   0,   0,  36,   0, \n      0,   0,  12,   0,   0,   0, \n      0,   0,   0,   0, 100,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 120, 101,  95, 115, \n    121, 115, 116, 101, 109,  95, \n     99,  98, 117, 102, 102, 101, \n    114,   0, 171, 171, 100,   0, \n      0,   0,  30,   0,   0,   0, \n    144,   0,   0,   0, 208,   1, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  64,   5, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,  80,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 116,   5,   0,   0, \n      4,   0,   0,   0,   8,   0, \n      0,   0,   2,   0,   0,   0, \n    152,   5,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    188,   5,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,  80,   5, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 215,   5, \n      0,   0,  16,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,  80,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 238,   5,   0,   0, \n     20,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n     80,   5,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n      5,   6,   0,   0,  24,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  36,   6, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  72,   6, \n      0,   0,  32,   0,   0,   0, \n     96,   0,   0,   0,   0,   0, \n      0,   0, 100,   6,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 136,   6,   0,   0, \n    128,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    156,   6,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    192,   6,   0,   0, 140,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0, 228,   6, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,   8,   7, \n      0,   0, 144,   0,   0,   0, \n     12,   0,   0,   0,   0,   0, \n      0,   0, 156,   6,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  22,   7,   0,   0, \n    156,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n    228,   6,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     51,   7,   0,   0, 160,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0, 152,   5, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  78,   7, \n      0,   0, 168,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0, 152,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 117,   7,   0,   0, \n    176,   0,   0,   0,  32,   0, \n      0,   0,   0,   0,   0,   0, \n    152,   7,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    188,   7,   0,   0, 208,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,  80,   5, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 218,   7, \n      0,   0, 212,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  36,   6,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 239,   7,   0,   0, \n    220,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n    228,   6,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n      7,   8,   0,   0, 224,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,  80,   5, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  24,   8, \n      0,   0, 228,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,  80,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  64,   8,   0,   0, \n    232,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n     80,   5,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     98,   8,   0,   0, 240,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0, 116,   8, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 152,   8, \n      0,   0,   0,   1,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0, 152,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 179,   8,   0,   0, \n      8,   1,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n    152,   5,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    205,   8,   0,   0,  16,   1, \n      0,   0,  32,   0,   0,   0, \n      0,   0,   0,   0, 224,   8, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,   4,   9, \n      0,   0,  48,   1,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  36,   9,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  72,   9,   0,   0, \n     64,   1,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     36,   9,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     97,   9,   0,   0,  80,   1, \n      0,   0,  64,   0,   0,   0, \n      0,   0,   0,   0, 116,   9, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 152,   9, \n      0,   0, 144,   1,   0,   0, \n     32,   0,   0,   0,   0,   0, \n      0,   0, 176,   9,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 212,   9,   0,   0, \n    176,   1,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     36,   9,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    242,   9,   0,   0, 192,   1, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0, 116,   8, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 120, 101, \n     95, 102, 108,  97, 103, 115, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  73,   5, \n      0,   0, 120, 101,  95, 116, \n    101, 115, 115, 101, 108, 108, \n     97, 116, 105, 111, 110,  95, \n    102,  97,  99, 116, 111, 114, \n     95, 114,  97, 110, 103, 101, \n      0, 102, 108, 111,  97, 116, \n     50,   0,   1,   0,   3,   0, \n      1,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 145,   5, \n      0,   0, 120, 101,  95, 108, \n    105, 110, 101,  95, 108, 111, \n    111, 112,  95,  99, 108, 111, \n    115, 105, 110, 103,  95, 105, \n    110, 100, 101, 120,   0, 120, \n    101,  95, 118, 101, 114, 116, \n    101, 120,  95, 105, 110, 100, \n    101, 120,  95, 101, 110, 100, \n    105,  97, 110,   0, 120, 101, \n     95, 118, 101, 114, 116, 101, \n    120,  95, 105, 110, 100, 101, \n    120,  95, 111, 102, 102, 115, \n    101, 116,   0, 120, 101,  95, \n    118, 101, 114, 116, 101, 120, \n     95, 105, 110, 100, 101, 120, \n     95, 109, 105, 110,  95, 109, \n     97, 120,   0, 117, 105, 110, \n    116,  50,   0, 171,   1,   0, \n     19,   0,   1,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     29,   6,   0,   0, 120, 101, \n     95, 117, 115, 101, 114,  95, \n     99, 108, 105, 112,  95, 112, \n    108,  97, 110, 101, 115,   0, \n    102, 108, 111,  97, 116,  52, \n      0, 171,   1,   0,   3,   0, \n      1,   0,   4,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  92,   6, \n      0,   0, 120, 101,  95, 110, \n    100,  99,  95, 115,  99,  97, \n    108, 101,   0, 102, 108, 111, \n     97, 116,  51,   0,   1,   0, \n      3,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    149,   6,   0,   0, 120, 101, \n     95, 112, 111, 105, 110, 116, \n     95, 118, 101, 114, 116, 101, \n    120,  95, 100, 105,  97, 109, \n    101, 116, 101, 114,  95, 109, \n    105, 110,   0, 102, 108, 111, \n     97, 116,   0, 171,   0,   0, \n      3,   0,   1,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    221,   6,   0,   0, 120, 101, \n     95, 110, 100,  99,  95, 111, \n    102, 102, 115, 101, 116,   0, \n    120, 101,  95, 112, 111, 105, \n    110, 116,  95, 118, 101, 114, \n    116, 101, 120,  95, 100, 105, \n     97, 109, 101, 116, 101, 114, \n     95, 109,  97, 120,   0, 120, \n    101,  95, 112, 111, 105, 110, \n    116,  95,  99, 111, 110, 115, \n    116,  97, 110, 116,  95, 100, \n    105,  97, 109, 101, 116, 101, \n    114,   0, 120, 101,  95, 112, \n    111, 105, 110, 116,  95, 115, \n     99, 114, 101, 101, 110,  95, \n    100, 105,  97, 109, 101, 116, \n    101, 114,  95, 116, 111,  95, \n    110, 100,  99,  95, 114,  97, \n    100, 105, 117, 115,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 115, 119, \n    105, 122, 122, 108, 101, 100, \n     95, 115, 105, 103, 110, 115, \n      0, 117, 105, 110, 116,  52, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   4,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    143,   7,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101, 115,  95, 114, 101, \n    115, 111, 108, 117, 116, 105, \n    111, 110,  95, 115,  99,  97, \n    108, 101, 100,   0, 120, 101, \n     95, 115,  97, 109, 112, 108, \n    101,  95,  99, 111, 117, 110, \n    116,  95, 108, 111, 103,  50, \n      0, 120, 101,  95,  97, 108, \n    112, 104,  97,  95, 116, 101, \n    115, 116,  95, 114, 101, 102, \n    101, 114, 101, 110,  99, 101, \n      0, 120, 101,  95,  97, 108, \n    112, 104,  97,  95, 116, 111, \n     95, 109,  97, 115, 107,   0, \n    120, 101,  95, 101, 100, 114, \n     97, 109,  95,  51,  50,  98, \n    112, 112,  95, 116, 105, 108, \n    101,  95, 112, 105, 116,  99, \n    104,  95, 100, 119, 111, 114, \n    100, 115,  95, 115,  99,  97, \n    108, 101, 100,   0, 120, 101, \n     95, 101, 100, 114,  97, 109, \n     95, 100, 101, 112, 116, 104, \n     95,  98,  97, 115, 101,  95, \n    100, 119, 111, 114, 100, 115, \n     95, 115,  99,  97, 108, 101, \n    100,   0, 120, 101,  95,  99, \n    111, 108, 111, 114,  95, 101, \n    120, 112,  95,  98, 105,  97, \n    115,   0,   1,   0,   3,   0, \n      1,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  92,   6, \n      0,   0, 120, 101,  95, 101, \n    100, 114,  97, 109,  95, 112, \n    111, 108, 121,  95, 111, 102, \n    102, 115, 101, 116,  95, 102, \n    114, 111, 110, 116,   0, 120, \n    101,  95, 101, 100, 114,  97, \n    109,  95, 112, 111, 108, 121, \n     95, 111, 102, 102, 115, 101, \n    116,  95,  98,  97,  99, 107, \n      0, 120, 101,  95, 101, 100, \n    114,  97, 109,  95, 115, 116, \n    101, 110,  99, 105, 108,   0, \n    171, 171,   1,   0,  19,   0, \n      1,   0,   4,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 143,   7, \n      0,   0, 120, 101,  95, 101, \n    100, 114,  97, 109,  95, 114, \n    116,  95,  98,  97, 115, 101, \n     95, 100, 119, 111, 114, 100, \n    115,  95, 115,  99,  97, 108, \n    101, 100,   0, 171,   1,   0, \n     19,   0,   1,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    143,   7,   0,   0, 120, 101, \n     95, 101, 100, 114,  97, 109, \n     95, 114, 116,  95, 102, 111, \n    114, 109,  97, 116,  95, 102, \n    108,  97, 103, 115,   0, 120, \n    101,  95, 101, 100, 114,  97, \n    109,  95, 114, 116,  95,  99, \n    108,  97, 109, 112,   0, 171, \n      1,   0,   3,   0,   1,   0, \n      4,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  92,   6,   0,   0, \n    120, 101,  95, 101, 100, 114, \n     97, 109,  95, 114, 116,  95, \n    107, 101, 101, 112,  95, 109, \n     97, 115, 107,   0, 171, 171, \n      1,   0,  19,   0,   1,   0, \n      4,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 143,   7,   0,   0, \n    120, 101,  95, 101, 100, 114, \n     97, 109,  95, 114, 116,  95, \n     98, 108, 101, 110, 100,  95, \n    102,  97,  99, 116, 111, 114, \n    115,  95, 111, 112, 115,   0, \n    120, 101,  95, 101, 100, 114, \n     97, 109,  95,  98, 108, 101, \n    110, 100,  95,  99, 111, 110, \n    115, 116,  97, 110, 116,   0, \n     77, 105,  99, 114, 111, 115, \n    111, 102, 116,  32,  40,  82, \n     41,  32,  72,  76,  83,  76, \n     32,  83, 104,  97, 100, 101, \n    114,  32,  67, 111, 109, 112, \n    105, 108, 101, 114,  32,  49, \n     48,  46,  49,   0, 171, 171, \n     73,  83,  71,  78,  44,   0, \n      0,   0,   1,   0,   0,   0, \n      8,   0,   0,   0,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   1,   0,   0,  88,  69, \n     86,  69,  82,  84,  69,  88, \n     73,  68,   0, 171,  79,  83, \n     71,  78,  44,   0,   0,   0, \n      1,   0,   0,   0,   8,   0, \n      0,   0,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   1,  14, \n      0,   0,  88,  69,  86,  69, \n     82,  84,  69,  88,  73,  68, \n      0, 171,  80,  67,  83,  71, \n    140,   0,   0,   0,   4,   0, \n      0,   0,   8,   0,   0,   0, \n    104,   0,   0,   0,   0,   0, \n      0,   0,  13,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   1,  14,   0,   0, \n    104,   0,   0,   0,   1,   0, \n      0,   0,  13,   0,   0,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   0,   1,  14,   0,   0, \n    104,   0,   0,   0,   2,   0, \n      0,   0,  13,   0,   0,   0, \n      3,   0,   0,   0,   2,   0, \n      0,   0,   1,  14,   0,   0, \n    118,   0,   0,   0,   0,   0, \n      0,   0,  14,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   1,  14,   0,   0, \n     83,  86,  95,  84, 101, 115, \n    115,  70,  97,  99, 116, 111, \n    114,   0,  83,  86,  95,  73, \n    110, 115, 105, 100, 101,  84, \n    101, 115, 115,  70,  97,  99, \n    116, 111, 114,   0, 171, 171, \n     83,  72,  69,  88,  64,   1, \n      0,   0,  81,   0,   3,   0, \n     80,   0,   0,   0, 113,   0, \n      0,   1, 147,   8,   0,   1, \n    148,   8,   0,   1, 149,  16, \n      0,   1, 150,  32,   0,   1, \n    151,  24,   0,   1, 106,   8, \n      0,   1,  89,   0,   0,   7, \n     70, 142,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n    114,   0,   0,   1,  95,   0, \n      0,   4,  18,  16,  32,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0, 101,   0,   0,   3, \n     18,  32,  16,   0,   0,   0, \n      0,   0,  54,   0,   0,   6, \n     18,  32,  16,   0,   0,   0, \n      0,   0,  10,  16,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  62,   0,   0,   1, \n    115,   0,   0,   1, 153,   0, \n      0,   2,   3,   0,   0,   0, \n     95,   0,   0,   2,   0, 112, \n      1,   0, 103,   0,   0,   4, \n     18,  32,  16,   0,   0,   0, \n      0,   0,  17,   0,   0,   0, \n    103,   0,   0,   4,  18,  32, \n     16,   0,   1,   0,   0,   0, \n     18,   0,   0,   0, 103,   0, \n      0,   4,  18,  32,  16,   0, \n      2,   0,   0,   0,  19,   0, \n      0,   0, 104,   0,   0,   2, \n      1,   0,   0,   0,  91,   0, \n      0,   4,  18,  32,  16,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,  54,   0,   0,   4, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10, 112,   1,   0, \n     54,   0,   0,   8,  18,  32, \n    144,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  62,   0,   0,   1, \n    115,   0,   0,   1, 103,   0, \n      0,   4,  18,  32,  16,   0, \n      3,   0,   0,   0,  20,   0, \n      0,   0,  54,   0,   0,   7, \n     18,  32,  16,   0,   3,   0, \n      0,   0,  42, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  83,  84, \n     65,  84, 148,   0,   0,   0, \n      7,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   3,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/continuous_triangle_3cp_hs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer xe_system_cbuffer\n// {\n//\n//   uint xe_flags;                     // Offset:    0 Size:     4 [unused]\n//   float2 xe_tessellation_factor_range;// Offset:    4 Size:     8\n//   uint xe_line_loop_closing_index;   // Offset:   12 Size:     4 [unused]\n//   uint xe_vertex_index_endian;       // Offset:   16 Size:     4 [unused]\n//   uint xe_vertex_index_offset;       // Offset:   20 Size:     4 [unused]\n//   uint2 xe_vertex_index_min_max;     // Offset:   24 Size:     8 [unused]\n//   float4 xe_user_clip_planes[6];     // Offset:   32 Size:    96 [unused]\n//   float3 xe_ndc_scale;               // Offset:  128 Size:    12 [unused]\n//   float xe_point_vertex_diameter_min;// Offset:  140 Size:     4 [unused]\n//   float3 xe_ndc_offset;              // Offset:  144 Size:    12 [unused]\n//   float xe_point_vertex_diameter_max;// Offset:  156 Size:     4 [unused]\n//   float2 xe_point_constant_diameter; // Offset:  160 Size:     8 [unused]\n//   float2 xe_point_screen_diameter_to_ndc_radius;// Offset:  168 Size:     8 [unused]\n//   uint4 xe_texture_swizzled_signs[2];// Offset:  176 Size:    32 [unused]\n//   uint xe_textures_resolution_scaled;// Offset:  208 Size:     4 [unused]\n//   uint2 xe_sample_count_log2;        // Offset:  212 Size:     8 [unused]\n//   float xe_alpha_test_reference;     // Offset:  220 Size:     4 [unused]\n//   uint xe_alpha_to_mask;             // Offset:  224 Size:     4 [unused]\n//   uint xe_edram_32bpp_tile_pitch_dwords_scaled;// Offset:  228 Size:     4 [unused]\n//   uint xe_edram_depth_base_dwords_scaled;// Offset:  232 Size:     4 [unused]\n//   float4 xe_color_exp_bias;          // Offset:  240 Size:    16 [unused]\n//   float2 xe_edram_poly_offset_front; // Offset:  256 Size:     8 [unused]\n//   float2 xe_edram_poly_offset_back;  // Offset:  264 Size:     8 [unused]\n//   uint4 xe_edram_stencil[2];         // Offset:  272 Size:    32 [unused]\n//   uint4 xe_edram_rt_base_dwords_scaled;// Offset:  304 Size:    16 [unused]\n//   uint4 xe_edram_rt_format_flags;    // Offset:  320 Size:    16 [unused]\n//   float4 xe_edram_rt_clamp[4];       // Offset:  336 Size:    64 [unused]\n//   uint4 xe_edram_rt_keep_mask[2];    // Offset:  400 Size:    32 [unused]\n//   uint4 xe_edram_rt_blend_factors_ops;// Offset:  432 Size:    16 [unused]\n//   float4 xe_edram_blend_constant;    // Offset:  448 Size:    16 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_system_cbuffer                 cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Patch Constant signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// SV_TessFactor            0   x           0  TRIEDGE   float   x   \n// SV_TessFactor            1   x           1  TRIEDGE   float   x   \n// SV_TessFactor            2   x           2  TRIEDGE   float   x   \n// SV_InsideTessFactor      0   x           3   TRIINT   float   x   \n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// XEVERTEXID               0   x           0     NONE   float   x   \n//\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// XEVERTEXID               0   x           0     NONE   float   x   \n//\n// Tessellation Domain   # of control points\n// -------------------- --------------------\n// Triangle                                3\n//\n// Tessellation Output Primitive  Partitioning Type \n// ------------------------------ ------------------\n// Clockwise Triangles            Even Fractional   \n//\nhs_5_1\nhs_decls \ndcl_input_control_point_count 3\ndcl_output_control_point_count 3\ndcl_tessellator_domain domain_tri\ndcl_tessellator_partitioning partitioning_fractional_even\ndcl_tessellator_output_primitive output_triangle_cw\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][1], immediateIndexed, space=0\nhs_fork_phase \ndcl_hs_fork_phase_instance_count 3\ndcl_input vForkInstanceID\ndcl_output_siv o0.x, finalTriUeq0EdgeTessFactor\ndcl_output_siv o1.x, finalTriVeq0EdgeTessFactor\ndcl_output_siv o2.x, finalTriWeq0EdgeTessFactor\ndcl_temps 1\ndcl_indexrange o0.x 3\nmov r0.x, vForkInstanceID.x\nmov o[r0.x + 0].x, CB0[0][0].z\nret \nhs_fork_phase \ndcl_output_siv o3.x, finalTriInsideTessFactor\nmov o3.x, CB0[0][0].z\nret \n// Approximately 5 instruction slots used\n#endif\n\nconst BYTE continuous_triangle_3cp_hs[] =\n{\n     68,  88,  66,  67, 231,  10, \n     78, 117, 211,  32, 114, 128, \n    168, 236,  27,  22,  27, 130, \n    116, 185,   1,   0,   0,   0, \n     24,  13,   0,   0,   6,   0, \n      0,   0,  56,   0,   0,   0, \n    116,  10,   0,   0, 168,  10, \n      0,   0, 220,  10,   0,   0, \n    112,  11,   0,   0, 124,  12, \n      0,   0,  82,  68,  69,  70, \n     52,  10,   0,   0,   1,   0, \n      0,   0, 120,   0,   0,   0, \n      1,   0,   0,   0,  60,   0, \n      0,   0,   1,   5,  83,  72, \n      0,   5,   0,   0,  10,  10, \n      0,   0,  19,  19,  68,  37, \n     60,   0,   0,   0,  24,   0, \n      0,   0,  40,   0,   0,   0, \n     40,   0,   0,   0,  36,   0, \n      0,   0,  12,   0,   0,   0, \n      0,   0,   0,   0, 100,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 120, 101,  95, 115, \n    121, 115, 116, 101, 109,  95, \n     99,  98, 117, 102, 102, 101, \n    114,   0, 171, 171, 100,   0, \n      0,   0,  30,   0,   0,   0, \n    144,   0,   0,   0, 208,   1, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  64,   5, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,  80,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 116,   5,   0,   0, \n      4,   0,   0,   0,   8,   0, \n      0,   0,   2,   0,   0,   0, \n    152,   5,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    188,   5,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,  80,   5, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 215,   5, \n      0,   0,  16,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,  80,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 238,   5,   0,   0, \n     20,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n     80,   5,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n      5,   6,   0,   0,  24,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  36,   6, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  72,   6, \n      0,   0,  32,   0,   0,   0, \n     96,   0,   0,   0,   0,   0, \n      0,   0, 100,   6,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 136,   6,   0,   0, \n    128,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    156,   6,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    192,   6,   0,   0, 140,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0, 228,   6, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,   8,   7, \n      0,   0, 144,   0,   0,   0, \n     12,   0,   0,   0,   0,   0, \n      0,   0, 156,   6,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  22,   7,   0,   0, \n    156,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n    228,   6,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     51,   7,   0,   0, 160,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0, 152,   5, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  78,   7, \n      0,   0, 168,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0, 152,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 117,   7,   0,   0, \n    176,   0,   0,   0,  32,   0, \n      0,   0,   0,   0,   0,   0, \n    152,   7,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    188,   7,   0,   0, 208,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,  80,   5, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 218,   7, \n      0,   0, 212,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  36,   6,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 239,   7,   0,   0, \n    220,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n    228,   6,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n      7,   8,   0,   0, 224,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,  80,   5, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  24,   8, \n      0,   0, 228,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,  80,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  64,   8,   0,   0, \n    232,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n     80,   5,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     98,   8,   0,   0, 240,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0, 116,   8, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 152,   8, \n      0,   0,   0,   1,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0, 152,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 179,   8,   0,   0, \n      8,   1,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n    152,   5,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    205,   8,   0,   0,  16,   1, \n      0,   0,  32,   0,   0,   0, \n      0,   0,   0,   0, 224,   8, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,   4,   9, \n      0,   0,  48,   1,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  36,   9,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  72,   9,   0,   0, \n     64,   1,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     36,   9,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     97,   9,   0,   0,  80,   1, \n      0,   0,  64,   0,   0,   0, \n      0,   0,   0,   0, 116,   9, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 152,   9, \n      0,   0, 144,   1,   0,   0, \n     32,   0,   0,   0,   0,   0, \n      0,   0, 176,   9,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 212,   9,   0,   0, \n    176,   1,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     36,   9,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    242,   9,   0,   0, 192,   1, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0, 116,   8, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 120, 101, \n     95, 102, 108,  97, 103, 115, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  73,   5, \n      0,   0, 120, 101,  95, 116, \n    101, 115, 115, 101, 108, 108, \n     97, 116, 105, 111, 110,  95, \n    102,  97,  99, 116, 111, 114, \n     95, 114,  97, 110, 103, 101, \n      0, 102, 108, 111,  97, 116, \n     50,   0,   1,   0,   3,   0, \n      1,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 145,   5, \n      0,   0, 120, 101,  95, 108, \n    105, 110, 101,  95, 108, 111, \n    111, 112,  95,  99, 108, 111, \n    115, 105, 110, 103,  95, 105, \n    110, 100, 101, 120,   0, 120, \n    101,  95, 118, 101, 114, 116, \n    101, 120,  95, 105, 110, 100, \n    101, 120,  95, 101, 110, 100, \n    105,  97, 110,   0, 120, 101, \n     95, 118, 101, 114, 116, 101, \n    120,  95, 105, 110, 100, 101, \n    120,  95, 111, 102, 102, 115, \n    101, 116,   0, 120, 101,  95, \n    118, 101, 114, 116, 101, 120, \n     95, 105, 110, 100, 101, 120, \n     95, 109, 105, 110,  95, 109, \n     97, 120,   0, 117, 105, 110, \n    116,  50,   0, 171,   1,   0, \n     19,   0,   1,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     29,   6,   0,   0, 120, 101, \n     95, 117, 115, 101, 114,  95, \n     99, 108, 105, 112,  95, 112, \n    108,  97, 110, 101, 115,   0, \n    102, 108, 111,  97, 116,  52, \n      0, 171,   1,   0,   3,   0, \n      1,   0,   4,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  92,   6, \n      0,   0, 120, 101,  95, 110, \n    100,  99,  95, 115,  99,  97, \n    108, 101,   0, 102, 108, 111, \n     97, 116,  51,   0,   1,   0, \n      3,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    149,   6,   0,   0, 120, 101, \n     95, 112, 111, 105, 110, 116, \n     95, 118, 101, 114, 116, 101, \n    120,  95, 100, 105,  97, 109, \n    101, 116, 101, 114,  95, 109, \n    105, 110,   0, 102, 108, 111, \n     97, 116,   0, 171,   0,   0, \n      3,   0,   1,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    221,   6,   0,   0, 120, 101, \n     95, 110, 100,  99,  95, 111, \n    102, 102, 115, 101, 116,   0, \n    120, 101,  95, 112, 111, 105, \n    110, 116,  95, 118, 101, 114, \n    116, 101, 120,  95, 100, 105, \n     97, 109, 101, 116, 101, 114, \n     95, 109,  97, 120,   0, 120, \n    101,  95, 112, 111, 105, 110, \n    116,  95,  99, 111, 110, 115, \n    116,  97, 110, 116,  95, 100, \n    105,  97, 109, 101, 116, 101, \n    114,   0, 120, 101,  95, 112, \n    111, 105, 110, 116,  95, 115, \n     99, 114, 101, 101, 110,  95, \n    100, 105,  97, 109, 101, 116, \n    101, 114,  95, 116, 111,  95, \n    110, 100,  99,  95, 114,  97, \n    100, 105, 117, 115,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 115, 119, \n    105, 122, 122, 108, 101, 100, \n     95, 115, 105, 103, 110, 115, \n      0, 117, 105, 110, 116,  52, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   4,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    143,   7,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101, 115,  95, 114, 101, \n    115, 111, 108, 117, 116, 105, \n    111, 110,  95, 115,  99,  97, \n    108, 101, 100,   0, 120, 101, \n     95, 115,  97, 109, 112, 108, \n    101,  95,  99, 111, 117, 110, \n    116,  95, 108, 111, 103,  50, \n      0, 120, 101,  95,  97, 108, \n    112, 104,  97,  95, 116, 101, \n    115, 116,  95, 114, 101, 102, \n    101, 114, 101, 110,  99, 101, \n      0, 120, 101,  95,  97, 108, \n    112, 104,  97,  95, 116, 111, \n     95, 109,  97, 115, 107,   0, \n    120, 101,  95, 101, 100, 114, \n     97, 109,  95,  51,  50,  98, \n    112, 112,  95, 116, 105, 108, \n    101,  95, 112, 105, 116,  99, \n    104,  95, 100, 119, 111, 114, \n    100, 115,  95, 115,  99,  97, \n    108, 101, 100,   0, 120, 101, \n     95, 101, 100, 114,  97, 109, \n     95, 100, 101, 112, 116, 104, \n     95,  98,  97, 115, 101,  95, \n    100, 119, 111, 114, 100, 115, \n     95, 115,  99,  97, 108, 101, \n    100,   0, 120, 101,  95,  99, \n    111, 108, 111, 114,  95, 101, \n    120, 112,  95,  98, 105,  97, \n    115,   0,   1,   0,   3,   0, \n      1,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  92,   6, \n      0,   0, 120, 101,  95, 101, \n    100, 114,  97, 109,  95, 112, \n    111, 108, 121,  95, 111, 102, \n    102, 115, 101, 116,  95, 102, \n    114, 111, 110, 116,   0, 120, \n    101,  95, 101, 100, 114,  97, \n    109,  95, 112, 111, 108, 121, \n     95, 111, 102, 102, 115, 101, \n    116,  95,  98,  97,  99, 107, \n      0, 120, 101,  95, 101, 100, \n    114,  97, 109,  95, 115, 116, \n    101, 110,  99, 105, 108,   0, \n    171, 171,   1,   0,  19,   0, \n      1,   0,   4,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 143,   7, \n      0,   0, 120, 101,  95, 101, \n    100, 114,  97, 109,  95, 114, \n    116,  95,  98,  97, 115, 101, \n     95, 100, 119, 111, 114, 100, \n    115,  95, 115,  99,  97, 108, \n    101, 100,   0, 171,   1,   0, \n     19,   0,   1,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    143,   7,   0,   0, 120, 101, \n     95, 101, 100, 114,  97, 109, \n     95, 114, 116,  95, 102, 111, \n    114, 109,  97, 116,  95, 102, \n    108,  97, 103, 115,   0, 120, \n    101,  95, 101, 100, 114,  97, \n    109,  95, 114, 116,  95,  99, \n    108,  97, 109, 112,   0, 171, \n      1,   0,   3,   0,   1,   0, \n      4,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  92,   6,   0,   0, \n    120, 101,  95, 101, 100, 114, \n     97, 109,  95, 114, 116,  95, \n    107, 101, 101, 112,  95, 109, \n     97, 115, 107,   0, 171, 171, \n      1,   0,  19,   0,   1,   0, \n      4,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 143,   7,   0,   0, \n    120, 101,  95, 101, 100, 114, \n     97, 109,  95, 114, 116,  95, \n     98, 108, 101, 110, 100,  95, \n    102,  97,  99, 116, 111, 114, \n    115,  95, 111, 112, 115,   0, \n    120, 101,  95, 101, 100, 114, \n     97, 109,  95,  98, 108, 101, \n    110, 100,  95,  99, 111, 110, \n    115, 116,  97, 110, 116,   0, \n     77, 105,  99, 114, 111, 115, \n    111, 102, 116,  32,  40,  82, \n     41,  32,  72,  76,  83,  76, \n     32,  83, 104,  97, 100, 101, \n    114,  32,  67, 111, 109, 112, \n    105, 108, 101, 114,  32,  49, \n     48,  46,  49,   0, 171, 171, \n     73,  83,  71,  78,  44,   0, \n      0,   0,   1,   0,   0,   0, \n      8,   0,   0,   0,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   1,   0,   0,  88,  69, \n     86,  69,  82,  84,  69,  88, \n     73,  68,   0, 171,  79,  83, \n     71,  78,  44,   0,   0,   0, \n      1,   0,   0,   0,   8,   0, \n      0,   0,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   1,  14, \n      0,   0,  88,  69,  86,  69, \n     82,  84,  69,  88,  73,  68, \n      0, 171,  80,  67,  83,  71, \n    140,   0,   0,   0,   4,   0, \n      0,   0,   8,   0,   0,   0, \n    104,   0,   0,   0,   0,   0, \n      0,   0,  13,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   1,  14,   0,   0, \n    104,   0,   0,   0,   1,   0, \n      0,   0,  13,   0,   0,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   0,   1,  14,   0,   0, \n    104,   0,   0,   0,   2,   0, \n      0,   0,  13,   0,   0,   0, \n      3,   0,   0,   0,   2,   0, \n      0,   0,   1,  14,   0,   0, \n    118,   0,   0,   0,   0,   0, \n      0,   0,  14,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   1,  14,   0,   0, \n     83,  86,  95,  84, 101, 115, \n    115,  70,  97,  99, 116, 111, \n    114,   0,  83,  86,  95,  73, \n    110, 115, 105, 100, 101,  84, \n    101, 115, 115,  70,  97,  99, \n    116, 111, 114,   0, 171, 171, \n     83,  72,  69,  88,   4,   1, \n      0,   0,  81,   0,   3,   0, \n     65,   0,   0,   0, 113,   0, \n      0,   1, 147,  24,   0,   1, \n    148,  24,   0,   1, 149,  16, \n      0,   1, 150,  32,   0,   1, \n    151,  24,   0,   1, 106,   8, \n      0,   1,  89,   0,   0,   7, \n     70, 142,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n    115,   0,   0,   1, 153,   0, \n      0,   2,   3,   0,   0,   0, \n     95,   0,   0,   2,   0, 112, \n      1,   0, 103,   0,   0,   4, \n     18,  32,  16,   0,   0,   0, \n      0,   0,  17,   0,   0,   0, \n    103,   0,   0,   4,  18,  32, \n     16,   0,   1,   0,   0,   0, \n     18,   0,   0,   0, 103,   0, \n      0,   4,  18,  32,  16,   0, \n      2,   0,   0,   0,  19,   0, \n      0,   0, 104,   0,   0,   2, \n      1,   0,   0,   0,  91,   0, \n      0,   4,  18,  32,  16,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,  54,   0,   0,   4, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10, 112,   1,   0, \n     54,   0,   0,   8,  18,  32, \n    144,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  62,   0,   0,   1, \n    115,   0,   0,   1, 103,   0, \n      0,   4,  18,  32,  16,   0, \n      3,   0,   0,   0,  20,   0, \n      0,   0,  54,   0,   0,   7, \n     18,  32,  16,   0,   3,   0, \n      0,   0,  42, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  83,  84, \n     65,  84, 148,   0,   0,   0, \n      5,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/discrete_quad_1cp_hs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer xe_system_cbuffer\n// {\n//\n//   uint xe_flags;                     // Offset:    0 Size:     4 [unused]\n//   float2 xe_tessellation_factor_range;// Offset:    4 Size:     8\n//   uint xe_line_loop_closing_index;   // Offset:   12 Size:     4 [unused]\n//   uint xe_vertex_index_endian;       // Offset:   16 Size:     4 [unused]\n//   uint xe_vertex_index_offset;       // Offset:   20 Size:     4 [unused]\n//   uint2 xe_vertex_index_min_max;     // Offset:   24 Size:     8 [unused]\n//   float4 xe_user_clip_planes[6];     // Offset:   32 Size:    96 [unused]\n//   float3 xe_ndc_scale;               // Offset:  128 Size:    12 [unused]\n//   float xe_point_vertex_diameter_min;// Offset:  140 Size:     4 [unused]\n//   float3 xe_ndc_offset;              // Offset:  144 Size:    12 [unused]\n//   float xe_point_vertex_diameter_max;// Offset:  156 Size:     4 [unused]\n//   float2 xe_point_constant_diameter; // Offset:  160 Size:     8 [unused]\n//   float2 xe_point_screen_diameter_to_ndc_radius;// Offset:  168 Size:     8 [unused]\n//   uint4 xe_texture_swizzled_signs[2];// Offset:  176 Size:    32 [unused]\n//   uint xe_textures_resolution_scaled;// Offset:  208 Size:     4 [unused]\n//   uint2 xe_sample_count_log2;        // Offset:  212 Size:     8 [unused]\n//   float xe_alpha_test_reference;     // Offset:  220 Size:     4 [unused]\n//   uint xe_alpha_to_mask;             // Offset:  224 Size:     4 [unused]\n//   uint xe_edram_32bpp_tile_pitch_dwords_scaled;// Offset:  228 Size:     4 [unused]\n//   uint xe_edram_depth_base_dwords_scaled;// Offset:  232 Size:     4 [unused]\n//   float4 xe_color_exp_bias;          // Offset:  240 Size:    16 [unused]\n//   float2 xe_edram_poly_offset_front; // Offset:  256 Size:     8 [unused]\n//   float2 xe_edram_poly_offset_back;  // Offset:  264 Size:     8 [unused]\n//   uint4 xe_edram_stencil[2];         // Offset:  272 Size:    32 [unused]\n//   uint4 xe_edram_rt_base_dwords_scaled;// Offset:  304 Size:    16 [unused]\n//   uint4 xe_edram_rt_format_flags;    // Offset:  320 Size:    16 [unused]\n//   float4 xe_edram_rt_clamp[4];       // Offset:  336 Size:    64 [unused]\n//   uint4 xe_edram_rt_keep_mask[2];    // Offset:  400 Size:    32 [unused]\n//   uint4 xe_edram_rt_blend_factors_ops;// Offset:  432 Size:    16 [unused]\n//   float4 xe_edram_blend_constant;    // Offset:  448 Size:    16 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_system_cbuffer                 cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Patch Constant signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// SV_TessFactor            0   x           0 QUADEDGE   float   x   \n// SV_TessFactor            1   x           1 QUADEDGE   float   x   \n// SV_TessFactor            2   x           2 QUADEDGE   float   x   \n// SV_TessFactor            3   x           3 QUADEDGE   float   x   \n// SV_InsideTessFactor      0   x           4  QUADINT   float   x   \n// SV_InsideTessFactor      1   x           5  QUADINT   float   x   \n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// XEVERTEXID               0   x           0     NONE   float   x   \n//\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// XEVERTEXID               0   x           0     NONE   float   x   \n//\n// Tessellation Domain   # of control points\n// -------------------- --------------------\n// Quadrilateral                           1\n//\n// Tessellation Output Primitive  Partitioning Type \n// ------------------------------ ------------------\n// Clockwise Triangles            Integer           \n//\nhs_5_1\nhs_decls \ndcl_input_control_point_count 1\ndcl_output_control_point_count 1\ndcl_tessellator_domain domain_quad\ndcl_tessellator_partitioning partitioning_integer\ndcl_tessellator_output_primitive output_triangle_cw\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][1], immediateIndexed, space=0\nhs_control_point_phase \ndcl_input v[1][0].x\ndcl_output o0.x\nmov o0.x, v[0][0].x\nret \nhs_fork_phase \ndcl_hs_fork_phase_instance_count 4\ndcl_input vForkInstanceID\ndcl_output_siv o0.x, finalQuadUeq0EdgeTessFactor\ndcl_output_siv o1.x, finalQuadVeq0EdgeTessFactor\ndcl_output_siv o2.x, finalQuadUeq1EdgeTessFactor\ndcl_output_siv o3.x, finalQuadVeq1EdgeTessFactor\ndcl_temps 1\ndcl_indexrange o0.x 4\nmov r0.x, vForkInstanceID.x\nmov o[r0.x + 0].x, CB0[0][0].z\nret \nhs_fork_phase \ndcl_hs_fork_phase_instance_count 2\ndcl_input vForkInstanceID\ndcl_output_siv o4.x, finalQuadUInsideTessFactor\ndcl_output_siv o5.x, finalQuadVInsideTessFactor\ndcl_temps 1\ndcl_indexrange o4.x 2\nmov r0.x, vForkInstanceID.x\nmov o[r0.x + 4].x, CB0[0][0].z\nret \n// Approximately 8 instruction slots used\n#endif\n\nconst BYTE discrete_quad_1cp_hs[] =\n{\n     68,  88,  66,  67,  42, 101, \n    116,  28,  76, 214, 165,  58, \n    178, 236, 109, 197, 185, 155, \n    144, 115,   1,   0,   0,   0, \n    228,  13,   0,   0,   6,   0, \n      0,   0,  56,   0,   0,   0, \n    116,  10,   0,   0, 168,  10, \n      0,   0, 220,  10,   0,   0, \n    160,  11,   0,   0,  72,  13, \n      0,   0,  82,  68,  69,  70, \n     52,  10,   0,   0,   1,   0, \n      0,   0, 120,   0,   0,   0, \n      1,   0,   0,   0,  60,   0, \n      0,   0,   1,   5,  83,  72, \n      0,   5,   0,   0,  10,  10, \n      0,   0,  19,  19,  68,  37, \n     60,   0,   0,   0,  24,   0, \n      0,   0,  40,   0,   0,   0, \n     40,   0,   0,   0,  36,   0, \n      0,   0,  12,   0,   0,   0, \n      0,   0,   0,   0, 100,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 120, 101,  95, 115, \n    121, 115, 116, 101, 109,  95, \n     99,  98, 117, 102, 102, 101, \n    114,   0, 171, 171, 100,   0, \n      0,   0,  30,   0,   0,   0, \n    144,   0,   0,   0, 208,   1, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  64,   5, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,  80,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 116,   5,   0,   0, \n      4,   0,   0,   0,   8,   0, \n      0,   0,   2,   0,   0,   0, \n    152,   5,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    188,   5,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,  80,   5, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 215,   5, \n      0,   0,  16,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,  80,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 238,   5,   0,   0, \n     20,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n     80,   5,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n      5,   6,   0,   0,  24,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  36,   6, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  72,   6, \n      0,   0,  32,   0,   0,   0, \n     96,   0,   0,   0,   0,   0, \n      0,   0, 100,   6,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 136,   6,   0,   0, \n    128,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    156,   6,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    192,   6,   0,   0, 140,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0, 228,   6, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,   8,   7, \n      0,   0, 144,   0,   0,   0, \n     12,   0,   0,   0,   0,   0, \n      0,   0, 156,   6,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  22,   7,   0,   0, \n    156,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n    228,   6,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     51,   7,   0,   0, 160,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0, 152,   5, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  78,   7, \n      0,   0, 168,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0, 152,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 117,   7,   0,   0, \n    176,   0,   0,   0,  32,   0, \n      0,   0,   0,   0,   0,   0, \n    152,   7,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    188,   7,   0,   0, 208,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,  80,   5, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 218,   7, \n      0,   0, 212,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  36,   6,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 239,   7,   0,   0, \n    220,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n    228,   6,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n      7,   8,   0,   0, 224,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,  80,   5, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  24,   8, \n      0,   0, 228,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,  80,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  64,   8,   0,   0, \n    232,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n     80,   5,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     98,   8,   0,   0, 240,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0, 116,   8, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 152,   8, \n      0,   0,   0,   1,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0, 152,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 179,   8,   0,   0, \n      8,   1,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n    152,   5,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    205,   8,   0,   0,  16,   1, \n      0,   0,  32,   0,   0,   0, \n      0,   0,   0,   0, 224,   8, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,   4,   9, \n      0,   0,  48,   1,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  36,   9,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  72,   9,   0,   0, \n     64,   1,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     36,   9,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     97,   9,   0,   0,  80,   1, \n      0,   0,  64,   0,   0,   0, \n      0,   0,   0,   0, 116,   9, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 152,   9, \n      0,   0, 144,   1,   0,   0, \n     32,   0,   0,   0,   0,   0, \n      0,   0, 176,   9,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 212,   9,   0,   0, \n    176,   1,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     36,   9,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    242,   9,   0,   0, 192,   1, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0, 116,   8, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 120, 101, \n     95, 102, 108,  97, 103, 115, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  73,   5, \n      0,   0, 120, 101,  95, 116, \n    101, 115, 115, 101, 108, 108, \n     97, 116, 105, 111, 110,  95, \n    102,  97,  99, 116, 111, 114, \n     95, 114,  97, 110, 103, 101, \n      0, 102, 108, 111,  97, 116, \n     50,   0,   1,   0,   3,   0, \n      1,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 145,   5, \n      0,   0, 120, 101,  95, 108, \n    105, 110, 101,  95, 108, 111, \n    111, 112,  95,  99, 108, 111, \n    115, 105, 110, 103,  95, 105, \n    110, 100, 101, 120,   0, 120, \n    101,  95, 118, 101, 114, 116, \n    101, 120,  95, 105, 110, 100, \n    101, 120,  95, 101, 110, 100, \n    105,  97, 110,   0, 120, 101, \n     95, 118, 101, 114, 116, 101, \n    120,  95, 105, 110, 100, 101, \n    120,  95, 111, 102, 102, 115, \n    101, 116,   0, 120, 101,  95, \n    118, 101, 114, 116, 101, 120, \n     95, 105, 110, 100, 101, 120, \n     95, 109, 105, 110,  95, 109, \n     97, 120,   0, 117, 105, 110, \n    116,  50,   0, 171,   1,   0, \n     19,   0,   1,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     29,   6,   0,   0, 120, 101, \n     95, 117, 115, 101, 114,  95, \n     99, 108, 105, 112,  95, 112, \n    108,  97, 110, 101, 115,   0, \n    102, 108, 111,  97, 116,  52, \n      0, 171,   1,   0,   3,   0, \n      1,   0,   4,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  92,   6, \n      0,   0, 120, 101,  95, 110, \n    100,  99,  95, 115,  99,  97, \n    108, 101,   0, 102, 108, 111, \n     97, 116,  51,   0,   1,   0, \n      3,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    149,   6,   0,   0, 120, 101, \n     95, 112, 111, 105, 110, 116, \n     95, 118, 101, 114, 116, 101, \n    120,  95, 100, 105,  97, 109, \n    101, 116, 101, 114,  95, 109, \n    105, 110,   0, 102, 108, 111, \n     97, 116,   0, 171,   0,   0, \n      3,   0,   1,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    221,   6,   0,   0, 120, 101, \n     95, 110, 100,  99,  95, 111, \n    102, 102, 115, 101, 116,   0, \n    120, 101,  95, 112, 111, 105, \n    110, 116,  95, 118, 101, 114, \n    116, 101, 120,  95, 100, 105, \n     97, 109, 101, 116, 101, 114, \n     95, 109,  97, 120,   0, 120, \n    101,  95, 112, 111, 105, 110, \n    116,  95,  99, 111, 110, 115, \n    116,  97, 110, 116,  95, 100, \n    105,  97, 109, 101, 116, 101, \n    114,   0, 120, 101,  95, 112, \n    111, 105, 110, 116,  95, 115, \n     99, 114, 101, 101, 110,  95, \n    100, 105,  97, 109, 101, 116, \n    101, 114,  95, 116, 111,  95, \n    110, 100,  99,  95, 114,  97, \n    100, 105, 117, 115,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 115, 119, \n    105, 122, 122, 108, 101, 100, \n     95, 115, 105, 103, 110, 115, \n      0, 117, 105, 110, 116,  52, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   4,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    143,   7,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101, 115,  95, 114, 101, \n    115, 111, 108, 117, 116, 105, \n    111, 110,  95, 115,  99,  97, \n    108, 101, 100,   0, 120, 101, \n     95, 115,  97, 109, 112, 108, \n    101,  95,  99, 111, 117, 110, \n    116,  95, 108, 111, 103,  50, \n      0, 120, 101,  95,  97, 108, \n    112, 104,  97,  95, 116, 101, \n    115, 116,  95, 114, 101, 102, \n    101, 114, 101, 110,  99, 101, \n      0, 120, 101,  95,  97, 108, \n    112, 104,  97,  95, 116, 111, \n     95, 109,  97, 115, 107,   0, \n    120, 101,  95, 101, 100, 114, \n     97, 109,  95,  51,  50,  98, \n    112, 112,  95, 116, 105, 108, \n    101,  95, 112, 105, 116,  99, \n    104,  95, 100, 119, 111, 114, \n    100, 115,  95, 115,  99,  97, \n    108, 101, 100,   0, 120, 101, \n     95, 101, 100, 114,  97, 109, \n     95, 100, 101, 112, 116, 104, \n     95,  98,  97, 115, 101,  95, \n    100, 119, 111, 114, 100, 115, \n     95, 115,  99,  97, 108, 101, \n    100,   0, 120, 101,  95,  99, \n    111, 108, 111, 114,  95, 101, \n    120, 112,  95,  98, 105,  97, \n    115,   0,   1,   0,   3,   0, \n      1,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  92,   6, \n      0,   0, 120, 101,  95, 101, \n    100, 114,  97, 109,  95, 112, \n    111, 108, 121,  95, 111, 102, \n    102, 115, 101, 116,  95, 102, \n    114, 111, 110, 116,   0, 120, \n    101,  95, 101, 100, 114,  97, \n    109,  95, 112, 111, 108, 121, \n     95, 111, 102, 102, 115, 101, \n    116,  95,  98,  97,  99, 107, \n      0, 120, 101,  95, 101, 100, \n    114,  97, 109,  95, 115, 116, \n    101, 110,  99, 105, 108,   0, \n    171, 171,   1,   0,  19,   0, \n      1,   0,   4,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 143,   7, \n      0,   0, 120, 101,  95, 101, \n    100, 114,  97, 109,  95, 114, \n    116,  95,  98,  97, 115, 101, \n     95, 100, 119, 111, 114, 100, \n    115,  95, 115,  99,  97, 108, \n    101, 100,   0, 171,   1,   0, \n     19,   0,   1,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    143,   7,   0,   0, 120, 101, \n     95, 101, 100, 114,  97, 109, \n     95, 114, 116,  95, 102, 111, \n    114, 109,  97, 116,  95, 102, \n    108,  97, 103, 115,   0, 120, \n    101,  95, 101, 100, 114,  97, \n    109,  95, 114, 116,  95,  99, \n    108,  97, 109, 112,   0, 171, \n      1,   0,   3,   0,   1,   0, \n      4,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  92,   6,   0,   0, \n    120, 101,  95, 101, 100, 114, \n     97, 109,  95, 114, 116,  95, \n    107, 101, 101, 112,  95, 109, \n     97, 115, 107,   0, 171, 171, \n      1,   0,  19,   0,   1,   0, \n      4,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 143,   7,   0,   0, \n    120, 101,  95, 101, 100, 114, \n     97, 109,  95, 114, 116,  95, \n     98, 108, 101, 110, 100,  95, \n    102,  97,  99, 116, 111, 114, \n    115,  95, 111, 112, 115,   0, \n    120, 101,  95, 101, 100, 114, \n     97, 109,  95,  98, 108, 101, \n    110, 100,  95,  99, 111, 110, \n    115, 116,  97, 110, 116,   0, \n     77, 105,  99, 114, 111, 115, \n    111, 102, 116,  32,  40,  82, \n     41,  32,  72,  76,  83,  76, \n     32,  83, 104,  97, 100, 101, \n    114,  32,  67, 111, 109, 112, \n    105, 108, 101, 114,  32,  49, \n     48,  46,  49,   0, 171, 171, \n     73,  83,  71,  78,  44,   0, \n      0,   0,   1,   0,   0,   0, \n      8,   0,   0,   0,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   1,   0,   0,  88,  69, \n     86,  69,  82,  84,  69,  88, \n     73,  68,   0, 171,  79,  83, \n     71,  78,  44,   0,   0,   0, \n      1,   0,   0,   0,   8,   0, \n      0,   0,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   1,  14, \n      0,   0,  88,  69,  86,  69, \n     82,  84,  69,  88,  73,  68, \n      0, 171,  80,  67,  83,  71, \n    188,   0,   0,   0,   6,   0, \n      0,   0,   8,   0,   0,   0, \n    152,   0,   0,   0,   0,   0, \n      0,   0,  11,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   1,  14,   0,   0, \n    152,   0,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   0,   1,  14,   0,   0, \n    152,   0,   0,   0,   2,   0, \n      0,   0,  11,   0,   0,   0, \n      3,   0,   0,   0,   2,   0, \n      0,   0,   1,  14,   0,   0, \n    152,   0,   0,   0,   3,   0, \n      0,   0,  11,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   1,  14,   0,   0, \n    166,   0,   0,   0,   0,   0, \n      0,   0,  12,   0,   0,   0, \n      3,   0,   0,   0,   4,   0, \n      0,   0,   1,  14,   0,   0, \n    166,   0,   0,   0,   1,   0, \n      0,   0,  12,   0,   0,   0, \n      3,   0,   0,   0,   5,   0, \n      0,   0,   1,  14,   0,   0, \n     83,  86,  95,  84, 101, 115, \n    115,  70,  97,  99, 116, 111, \n    114,   0,  83,  86,  95,  73, \n    110, 115, 105, 100, 101,  84, \n    101, 115, 115,  70,  97,  99, \n    116, 111, 114,   0, 171, 171, \n     83,  72,  69,  88, 160,   1, \n      0,   0,  81,   0,   3,   0, \n    104,   0,   0,   0, 113,   0, \n      0,   1, 147,   8,   0,   1, \n    148,   8,   0,   1, 149,  24, \n      0,   1, 150,   8,   0,   1, \n    151,  24,   0,   1, 106,   8, \n      0,   1,  89,   0,   0,   7, \n     70, 142,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n    114,   0,   0,   1,  95,   0, \n      0,   4,  18,  16,  32,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0, 101,   0,   0,   3, \n     18,  32,  16,   0,   0,   0, \n      0,   0,  54,   0,   0,   6, \n     18,  32,  16,   0,   0,   0, \n      0,   0,  10,  16,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  62,   0,   0,   1, \n    115,   0,   0,   1, 153,   0, \n      0,   2,   4,   0,   0,   0, \n     95,   0,   0,   2,   0, 112, \n      1,   0, 103,   0,   0,   4, \n     18,  32,  16,   0,   0,   0, \n      0,   0,  11,   0,   0,   0, \n    103,   0,   0,   4,  18,  32, \n     16,   0,   1,   0,   0,   0, \n     12,   0,   0,   0, 103,   0, \n      0,   4,  18,  32,  16,   0, \n      2,   0,   0,   0,  13,   0, \n      0,   0, 103,   0,   0,   4, \n     18,  32,  16,   0,   3,   0, \n      0,   0,  14,   0,   0,   0, \n    104,   0,   0,   2,   1,   0, \n      0,   0,  91,   0,   0,   4, \n     18,  32,  16,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n     54,   0,   0,   4,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10, 112,   1,   0,  54,   0, \n      0,   8,  18,  32, 144,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  42, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     62,   0,   0,   1, 115,   0, \n      0,   1, 153,   0,   0,   2, \n      2,   0,   0,   0,  95,   0, \n      0,   2,   0, 112,   1,   0, \n    103,   0,   0,   4,  18,  32, \n     16,   0,   4,   0,   0,   0, \n     15,   0,   0,   0, 103,   0, \n      0,   4,  18,  32,  16,   0, \n      5,   0,   0,   0,  16,   0, \n      0,   0, 104,   0,   0,   2, \n      1,   0,   0,   0,  91,   0, \n      0,   4,  18,  32,  16,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0,  54,   0,   0,   4, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10, 112,   1,   0, \n     54,   0,   0,   9,  18,  32, \n    208,   0,   4,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  42, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  83,  84, \n     65,  84, 148,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   5,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/discrete_quad_4cp_hs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer xe_system_cbuffer\n// {\n//\n//   uint xe_flags;                     // Offset:    0 Size:     4 [unused]\n//   float2 xe_tessellation_factor_range;// Offset:    4 Size:     8\n//   uint xe_line_loop_closing_index;   // Offset:   12 Size:     4 [unused]\n//   uint xe_vertex_index_endian;       // Offset:   16 Size:     4 [unused]\n//   uint xe_vertex_index_offset;       // Offset:   20 Size:     4 [unused]\n//   uint2 xe_vertex_index_min_max;     // Offset:   24 Size:     8 [unused]\n//   float4 xe_user_clip_planes[6];     // Offset:   32 Size:    96 [unused]\n//   float3 xe_ndc_scale;               // Offset:  128 Size:    12 [unused]\n//   float xe_point_vertex_diameter_min;// Offset:  140 Size:     4 [unused]\n//   float3 xe_ndc_offset;              // Offset:  144 Size:    12 [unused]\n//   float xe_point_vertex_diameter_max;// Offset:  156 Size:     4 [unused]\n//   float2 xe_point_constant_diameter; // Offset:  160 Size:     8 [unused]\n//   float2 xe_point_screen_diameter_to_ndc_radius;// Offset:  168 Size:     8 [unused]\n//   uint4 xe_texture_swizzled_signs[2];// Offset:  176 Size:    32 [unused]\n//   uint xe_textures_resolution_scaled;// Offset:  208 Size:     4 [unused]\n//   uint2 xe_sample_count_log2;        // Offset:  212 Size:     8 [unused]\n//   float xe_alpha_test_reference;     // Offset:  220 Size:     4 [unused]\n//   uint xe_alpha_to_mask;             // Offset:  224 Size:     4 [unused]\n//   uint xe_edram_32bpp_tile_pitch_dwords_scaled;// Offset:  228 Size:     4 [unused]\n//   uint xe_edram_depth_base_dwords_scaled;// Offset:  232 Size:     4 [unused]\n//   float4 xe_color_exp_bias;          // Offset:  240 Size:    16 [unused]\n//   float2 xe_edram_poly_offset_front; // Offset:  256 Size:     8 [unused]\n//   float2 xe_edram_poly_offset_back;  // Offset:  264 Size:     8 [unused]\n//   uint4 xe_edram_stencil[2];         // Offset:  272 Size:    32 [unused]\n//   uint4 xe_edram_rt_base_dwords_scaled;// Offset:  304 Size:    16 [unused]\n//   uint4 xe_edram_rt_format_flags;    // Offset:  320 Size:    16 [unused]\n//   float4 xe_edram_rt_clamp[4];       // Offset:  336 Size:    64 [unused]\n//   uint4 xe_edram_rt_keep_mask[2];    // Offset:  400 Size:    32 [unused]\n//   uint4 xe_edram_rt_blend_factors_ops;// Offset:  432 Size:    16 [unused]\n//   float4 xe_edram_blend_constant;    // Offset:  448 Size:    16 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_system_cbuffer                 cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Patch Constant signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// SV_TessFactor            0   x           0 QUADEDGE   float   x   \n// SV_TessFactor            1   x           1 QUADEDGE   float   x   \n// SV_TessFactor            2   x           2 QUADEDGE   float   x   \n// SV_TessFactor            3   x           3 QUADEDGE   float   x   \n// SV_InsideTessFactor      0   x           4  QUADINT   float   x   \n// SV_InsideTessFactor      1   x           5  QUADINT   float   x   \n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// XEVERTEXID               0   x           0     NONE   float   x   \n//\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// XEVERTEXID               0   x           0     NONE   float   x   \n//\n// Tessellation Domain   # of control points\n// -------------------- --------------------\n// Quadrilateral                           4\n//\n// Tessellation Output Primitive  Partitioning Type \n// ------------------------------ ------------------\n// Clockwise Triangles            Integer           \n//\nhs_5_1\nhs_decls \ndcl_input_control_point_count 4\ndcl_output_control_point_count 4\ndcl_tessellator_domain domain_quad\ndcl_tessellator_partitioning partitioning_integer\ndcl_tessellator_output_primitive output_triangle_cw\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][1], immediateIndexed, space=0\nhs_fork_phase \ndcl_hs_fork_phase_instance_count 4\ndcl_input vForkInstanceID\ndcl_output_siv o0.x, finalQuadUeq0EdgeTessFactor\ndcl_output_siv o1.x, finalQuadVeq0EdgeTessFactor\ndcl_output_siv o2.x, finalQuadUeq1EdgeTessFactor\ndcl_output_siv o3.x, finalQuadVeq1EdgeTessFactor\ndcl_temps 1\ndcl_indexrange o0.x 4\nmov r0.x, vForkInstanceID.x\nmov o[r0.x + 0].x, CB0[0][0].z\nret \nhs_fork_phase \ndcl_hs_fork_phase_instance_count 2\ndcl_input vForkInstanceID\ndcl_output_siv o4.x, finalQuadUInsideTessFactor\ndcl_output_siv o5.x, finalQuadVInsideTessFactor\ndcl_temps 1\ndcl_indexrange o4.x 2\nmov r0.x, vForkInstanceID.x\nmov o[r0.x + 4].x, CB0[0][0].z\nret \n// Approximately 6 instruction slots used\n#endif\n\nconst BYTE discrete_quad_4cp_hs[] =\n{\n     68,  88,  66,  67, 158, 194, \n     46,  27, 202, 133, 207,  72, \n     70,  10, 181, 145, 243, 232, \n     70,  63,   1,   0,   0,   0, \n    168,  13,   0,   0,   6,   0, \n      0,   0,  56,   0,   0,   0, \n    116,  10,   0,   0, 168,  10, \n      0,   0, 220,  10,   0,   0, \n    160,  11,   0,   0,  12,  13, \n      0,   0,  82,  68,  69,  70, \n     52,  10,   0,   0,   1,   0, \n      0,   0, 120,   0,   0,   0, \n      1,   0,   0,   0,  60,   0, \n      0,   0,   1,   5,  83,  72, \n      0,   5,   0,   0,  10,  10, \n      0,   0,  19,  19,  68,  37, \n     60,   0,   0,   0,  24,   0, \n      0,   0,  40,   0,   0,   0, \n     40,   0,   0,   0,  36,   0, \n      0,   0,  12,   0,   0,   0, \n      0,   0,   0,   0, 100,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 120, 101,  95, 115, \n    121, 115, 116, 101, 109,  95, \n     99,  98, 117, 102, 102, 101, \n    114,   0, 171, 171, 100,   0, \n      0,   0,  30,   0,   0,   0, \n    144,   0,   0,   0, 208,   1, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  64,   5, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,  80,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 116,   5,   0,   0, \n      4,   0,   0,   0,   8,   0, \n      0,   0,   2,   0,   0,   0, \n    152,   5,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    188,   5,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,  80,   5, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 215,   5, \n      0,   0,  16,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,  80,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 238,   5,   0,   0, \n     20,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n     80,   5,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n      5,   6,   0,   0,  24,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  36,   6, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  72,   6, \n      0,   0,  32,   0,   0,   0, \n     96,   0,   0,   0,   0,   0, \n      0,   0, 100,   6,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 136,   6,   0,   0, \n    128,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    156,   6,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    192,   6,   0,   0, 140,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0, 228,   6, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,   8,   7, \n      0,   0, 144,   0,   0,   0, \n     12,   0,   0,   0,   0,   0, \n      0,   0, 156,   6,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  22,   7,   0,   0, \n    156,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n    228,   6,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     51,   7,   0,   0, 160,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0, 152,   5, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  78,   7, \n      0,   0, 168,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0, 152,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 117,   7,   0,   0, \n    176,   0,   0,   0,  32,   0, \n      0,   0,   0,   0,   0,   0, \n    152,   7,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    188,   7,   0,   0, 208,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,  80,   5, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 218,   7, \n      0,   0, 212,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  36,   6,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 239,   7,   0,   0, \n    220,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n    228,   6,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n      7,   8,   0,   0, 224,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,  80,   5, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  24,   8, \n      0,   0, 228,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,  80,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  64,   8,   0,   0, \n    232,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n     80,   5,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     98,   8,   0,   0, 240,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0, 116,   8, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 152,   8, \n      0,   0,   0,   1,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0, 152,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 179,   8,   0,   0, \n      8,   1,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n    152,   5,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    205,   8,   0,   0,  16,   1, \n      0,   0,  32,   0,   0,   0, \n      0,   0,   0,   0, 224,   8, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,   4,   9, \n      0,   0,  48,   1,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  36,   9,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  72,   9,   0,   0, \n     64,   1,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     36,   9,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     97,   9,   0,   0,  80,   1, \n      0,   0,  64,   0,   0,   0, \n      0,   0,   0,   0, 116,   9, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 152,   9, \n      0,   0, 144,   1,   0,   0, \n     32,   0,   0,   0,   0,   0, \n      0,   0, 176,   9,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 212,   9,   0,   0, \n    176,   1,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     36,   9,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    242,   9,   0,   0, 192,   1, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0, 116,   8, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 120, 101, \n     95, 102, 108,  97, 103, 115, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  73,   5, \n      0,   0, 120, 101,  95, 116, \n    101, 115, 115, 101, 108, 108, \n     97, 116, 105, 111, 110,  95, \n    102,  97,  99, 116, 111, 114, \n     95, 114,  97, 110, 103, 101, \n      0, 102, 108, 111,  97, 116, \n     50,   0,   1,   0,   3,   0, \n      1,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 145,   5, \n      0,   0, 120, 101,  95, 108, \n    105, 110, 101,  95, 108, 111, \n    111, 112,  95,  99, 108, 111, \n    115, 105, 110, 103,  95, 105, \n    110, 100, 101, 120,   0, 120, \n    101,  95, 118, 101, 114, 116, \n    101, 120,  95, 105, 110, 100, \n    101, 120,  95, 101, 110, 100, \n    105,  97, 110,   0, 120, 101, \n     95, 118, 101, 114, 116, 101, \n    120,  95, 105, 110, 100, 101, \n    120,  95, 111, 102, 102, 115, \n    101, 116,   0, 120, 101,  95, \n    118, 101, 114, 116, 101, 120, \n     95, 105, 110, 100, 101, 120, \n     95, 109, 105, 110,  95, 109, \n     97, 120,   0, 117, 105, 110, \n    116,  50,   0, 171,   1,   0, \n     19,   0,   1,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     29,   6,   0,   0, 120, 101, \n     95, 117, 115, 101, 114,  95, \n     99, 108, 105, 112,  95, 112, \n    108,  97, 110, 101, 115,   0, \n    102, 108, 111,  97, 116,  52, \n      0, 171,   1,   0,   3,   0, \n      1,   0,   4,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  92,   6, \n      0,   0, 120, 101,  95, 110, \n    100,  99,  95, 115,  99,  97, \n    108, 101,   0, 102, 108, 111, \n     97, 116,  51,   0,   1,   0, \n      3,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    149,   6,   0,   0, 120, 101, \n     95, 112, 111, 105, 110, 116, \n     95, 118, 101, 114, 116, 101, \n    120,  95, 100, 105,  97, 109, \n    101, 116, 101, 114,  95, 109, \n    105, 110,   0, 102, 108, 111, \n     97, 116,   0, 171,   0,   0, \n      3,   0,   1,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    221,   6,   0,   0, 120, 101, \n     95, 110, 100,  99,  95, 111, \n    102, 102, 115, 101, 116,   0, \n    120, 101,  95, 112, 111, 105, \n    110, 116,  95, 118, 101, 114, \n    116, 101, 120,  95, 100, 105, \n     97, 109, 101, 116, 101, 114, \n     95, 109,  97, 120,   0, 120, \n    101,  95, 112, 111, 105, 110, \n    116,  95,  99, 111, 110, 115, \n    116,  97, 110, 116,  95, 100, \n    105,  97, 109, 101, 116, 101, \n    114,   0, 120, 101,  95, 112, \n    111, 105, 110, 116,  95, 115, \n     99, 114, 101, 101, 110,  95, \n    100, 105,  97, 109, 101, 116, \n    101, 114,  95, 116, 111,  95, \n    110, 100,  99,  95, 114,  97, \n    100, 105, 117, 115,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 115, 119, \n    105, 122, 122, 108, 101, 100, \n     95, 115, 105, 103, 110, 115, \n      0, 117, 105, 110, 116,  52, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   4,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    143,   7,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101, 115,  95, 114, 101, \n    115, 111, 108, 117, 116, 105, \n    111, 110,  95, 115,  99,  97, \n    108, 101, 100,   0, 120, 101, \n     95, 115,  97, 109, 112, 108, \n    101,  95,  99, 111, 117, 110, \n    116,  95, 108, 111, 103,  50, \n      0, 120, 101,  95,  97, 108, \n    112, 104,  97,  95, 116, 101, \n    115, 116,  95, 114, 101, 102, \n    101, 114, 101, 110,  99, 101, \n      0, 120, 101,  95,  97, 108, \n    112, 104,  97,  95, 116, 111, \n     95, 109,  97, 115, 107,   0, \n    120, 101,  95, 101, 100, 114, \n     97, 109,  95,  51,  50,  98, \n    112, 112,  95, 116, 105, 108, \n    101,  95, 112, 105, 116,  99, \n    104,  95, 100, 119, 111, 114, \n    100, 115,  95, 115,  99,  97, \n    108, 101, 100,   0, 120, 101, \n     95, 101, 100, 114,  97, 109, \n     95, 100, 101, 112, 116, 104, \n     95,  98,  97, 115, 101,  95, \n    100, 119, 111, 114, 100, 115, \n     95, 115,  99,  97, 108, 101, \n    100,   0, 120, 101,  95,  99, \n    111, 108, 111, 114,  95, 101, \n    120, 112,  95,  98, 105,  97, \n    115,   0,   1,   0,   3,   0, \n      1,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  92,   6, \n      0,   0, 120, 101,  95, 101, \n    100, 114,  97, 109,  95, 112, \n    111, 108, 121,  95, 111, 102, \n    102, 115, 101, 116,  95, 102, \n    114, 111, 110, 116,   0, 120, \n    101,  95, 101, 100, 114,  97, \n    109,  95, 112, 111, 108, 121, \n     95, 111, 102, 102, 115, 101, \n    116,  95,  98,  97,  99, 107, \n      0, 120, 101,  95, 101, 100, \n    114,  97, 109,  95, 115, 116, \n    101, 110,  99, 105, 108,   0, \n    171, 171,   1,   0,  19,   0, \n      1,   0,   4,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 143,   7, \n      0,   0, 120, 101,  95, 101, \n    100, 114,  97, 109,  95, 114, \n    116,  95,  98,  97, 115, 101, \n     95, 100, 119, 111, 114, 100, \n    115,  95, 115,  99,  97, 108, \n    101, 100,   0, 171,   1,   0, \n     19,   0,   1,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    143,   7,   0,   0, 120, 101, \n     95, 101, 100, 114,  97, 109, \n     95, 114, 116,  95, 102, 111, \n    114, 109,  97, 116,  95, 102, \n    108,  97, 103, 115,   0, 120, \n    101,  95, 101, 100, 114,  97, \n    109,  95, 114, 116,  95,  99, \n    108,  97, 109, 112,   0, 171, \n      1,   0,   3,   0,   1,   0, \n      4,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  92,   6,   0,   0, \n    120, 101,  95, 101, 100, 114, \n     97, 109,  95, 114, 116,  95, \n    107, 101, 101, 112,  95, 109, \n     97, 115, 107,   0, 171, 171, \n      1,   0,  19,   0,   1,   0, \n      4,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 143,   7,   0,   0, \n    120, 101,  95, 101, 100, 114, \n     97, 109,  95, 114, 116,  95, \n     98, 108, 101, 110, 100,  95, \n    102,  97,  99, 116, 111, 114, \n    115,  95, 111, 112, 115,   0, \n    120, 101,  95, 101, 100, 114, \n     97, 109,  95,  98, 108, 101, \n    110, 100,  95,  99, 111, 110, \n    115, 116,  97, 110, 116,   0, \n     77, 105,  99, 114, 111, 115, \n    111, 102, 116,  32,  40,  82, \n     41,  32,  72,  76,  83,  76, \n     32,  83, 104,  97, 100, 101, \n    114,  32,  67, 111, 109, 112, \n    105, 108, 101, 114,  32,  49, \n     48,  46,  49,   0, 171, 171, \n     73,  83,  71,  78,  44,   0, \n      0,   0,   1,   0,   0,   0, \n      8,   0,   0,   0,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   1,   0,   0,  88,  69, \n     86,  69,  82,  84,  69,  88, \n     73,  68,   0, 171,  79,  83, \n     71,  78,  44,   0,   0,   0, \n      1,   0,   0,   0,   8,   0, \n      0,   0,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   1,  14, \n      0,   0,  88,  69,  86,  69, \n     82,  84,  69,  88,  73,  68, \n      0, 171,  80,  67,  83,  71, \n    188,   0,   0,   0,   6,   0, \n      0,   0,   8,   0,   0,   0, \n    152,   0,   0,   0,   0,   0, \n      0,   0,  11,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   1,  14,   0,   0, \n    152,   0,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   0,   1,  14,   0,   0, \n    152,   0,   0,   0,   2,   0, \n      0,   0,  11,   0,   0,   0, \n      3,   0,   0,   0,   2,   0, \n      0,   0,   1,  14,   0,   0, \n    152,   0,   0,   0,   3,   0, \n      0,   0,  11,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   1,  14,   0,   0, \n    166,   0,   0,   0,   0,   0, \n      0,   0,  12,   0,   0,   0, \n      3,   0,   0,   0,   4,   0, \n      0,   0,   1,  14,   0,   0, \n    166,   0,   0,   0,   1,   0, \n      0,   0,  12,   0,   0,   0, \n      3,   0,   0,   0,   5,   0, \n      0,   0,   1,  14,   0,   0, \n     83,  86,  95,  84, 101, 115, \n    115,  70,  97,  99, 116, 111, \n    114,   0,  83,  86,  95,  73, \n    110, 115, 105, 100, 101,  84, \n    101, 115, 115,  70,  97,  99, \n    116, 111, 114,   0, 171, 171, \n     83,  72,  69,  88, 100,   1, \n      0,   0,  81,   0,   3,   0, \n     89,   0,   0,   0, 113,   0, \n      0,   1, 147,  32,   0,   1, \n    148,  32,   0,   1, 149,  24, \n      0,   1, 150,   8,   0,   1, \n    151,  24,   0,   1, 106,   8, \n      0,   1,  89,   0,   0,   7, \n     70, 142,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n    115,   0,   0,   1, 153,   0, \n      0,   2,   4,   0,   0,   0, \n     95,   0,   0,   2,   0, 112, \n      1,   0, 103,   0,   0,   4, \n     18,  32,  16,   0,   0,   0, \n      0,   0,  11,   0,   0,   0, \n    103,   0,   0,   4,  18,  32, \n     16,   0,   1,   0,   0,   0, \n     12,   0,   0,   0, 103,   0, \n      0,   4,  18,  32,  16,   0, \n      2,   0,   0,   0,  13,   0, \n      0,   0, 103,   0,   0,   4, \n     18,  32,  16,   0,   3,   0, \n      0,   0,  14,   0,   0,   0, \n    104,   0,   0,   2,   1,   0, \n      0,   0,  91,   0,   0,   4, \n     18,  32,  16,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n     54,   0,   0,   4,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10, 112,   1,   0,  54,   0, \n      0,   8,  18,  32, 144,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  42, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     62,   0,   0,   1, 115,   0, \n      0,   1, 153,   0,   0,   2, \n      2,   0,   0,   0,  95,   0, \n      0,   2,   0, 112,   1,   0, \n    103,   0,   0,   4,  18,  32, \n     16,   0,   4,   0,   0,   0, \n     15,   0,   0,   0, 103,   0, \n      0,   4,  18,  32,  16,   0, \n      5,   0,   0,   0,  16,   0, \n      0,   0, 104,   0,   0,   2, \n      1,   0,   0,   0,  91,   0, \n      0,   4,  18,  32,  16,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0,  54,   0,   0,   4, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10, 112,   1,   0, \n     54,   0,   0,   9,  18,  32, \n    208,   0,   4,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  42, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  83,  84, \n     65,  84, 148,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/discrete_triangle_1cp_hs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer xe_system_cbuffer\n// {\n//\n//   uint xe_flags;                     // Offset:    0 Size:     4 [unused]\n//   float2 xe_tessellation_factor_range;// Offset:    4 Size:     8\n//   uint xe_line_loop_closing_index;   // Offset:   12 Size:     4 [unused]\n//   uint xe_vertex_index_endian;       // Offset:   16 Size:     4 [unused]\n//   uint xe_vertex_index_offset;       // Offset:   20 Size:     4 [unused]\n//   uint2 xe_vertex_index_min_max;     // Offset:   24 Size:     8 [unused]\n//   float4 xe_user_clip_planes[6];     // Offset:   32 Size:    96 [unused]\n//   float3 xe_ndc_scale;               // Offset:  128 Size:    12 [unused]\n//   float xe_point_vertex_diameter_min;// Offset:  140 Size:     4 [unused]\n//   float3 xe_ndc_offset;              // Offset:  144 Size:    12 [unused]\n//   float xe_point_vertex_diameter_max;// Offset:  156 Size:     4 [unused]\n//   float2 xe_point_constant_diameter; // Offset:  160 Size:     8 [unused]\n//   float2 xe_point_screen_diameter_to_ndc_radius;// Offset:  168 Size:     8 [unused]\n//   uint4 xe_texture_swizzled_signs[2];// Offset:  176 Size:    32 [unused]\n//   uint xe_textures_resolution_scaled;// Offset:  208 Size:     4 [unused]\n//   uint2 xe_sample_count_log2;        // Offset:  212 Size:     8 [unused]\n//   float xe_alpha_test_reference;     // Offset:  220 Size:     4 [unused]\n//   uint xe_alpha_to_mask;             // Offset:  224 Size:     4 [unused]\n//   uint xe_edram_32bpp_tile_pitch_dwords_scaled;// Offset:  228 Size:     4 [unused]\n//   uint xe_edram_depth_base_dwords_scaled;// Offset:  232 Size:     4 [unused]\n//   float4 xe_color_exp_bias;          // Offset:  240 Size:    16 [unused]\n//   float2 xe_edram_poly_offset_front; // Offset:  256 Size:     8 [unused]\n//   float2 xe_edram_poly_offset_back;  // Offset:  264 Size:     8 [unused]\n//   uint4 xe_edram_stencil[2];         // Offset:  272 Size:    32 [unused]\n//   uint4 xe_edram_rt_base_dwords_scaled;// Offset:  304 Size:    16 [unused]\n//   uint4 xe_edram_rt_format_flags;    // Offset:  320 Size:    16 [unused]\n//   float4 xe_edram_rt_clamp[4];       // Offset:  336 Size:    64 [unused]\n//   uint4 xe_edram_rt_keep_mask[2];    // Offset:  400 Size:    32 [unused]\n//   uint4 xe_edram_rt_blend_factors_ops;// Offset:  432 Size:    16 [unused]\n//   float4 xe_edram_blend_constant;    // Offset:  448 Size:    16 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_system_cbuffer                 cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Patch Constant signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// SV_TessFactor            0   x           0  TRIEDGE   float   x   \n// SV_TessFactor            1   x           1  TRIEDGE   float   x   \n// SV_TessFactor            2   x           2  TRIEDGE   float   x   \n// SV_InsideTessFactor      0   x           3   TRIINT   float   x   \n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// XEVERTEXID               0   x           0     NONE   float   x   \n//\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// XEVERTEXID               0   x           0     NONE   float   x   \n//\n// Tessellation Domain   # of control points\n// -------------------- --------------------\n// Triangle                                1\n//\n// Tessellation Output Primitive  Partitioning Type \n// ------------------------------ ------------------\n// Clockwise Triangles            Integer           \n//\nhs_5_1\nhs_decls \ndcl_input_control_point_count 1\ndcl_output_control_point_count 1\ndcl_tessellator_domain domain_tri\ndcl_tessellator_partitioning partitioning_integer\ndcl_tessellator_output_primitive output_triangle_cw\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][1], immediateIndexed, space=0\nhs_control_point_phase \ndcl_input v[1][0].x\ndcl_output o0.x\nmov o0.x, v[0][0].x\nret \nhs_fork_phase \ndcl_hs_fork_phase_instance_count 3\ndcl_input vForkInstanceID\ndcl_output_siv o0.x, finalTriUeq0EdgeTessFactor\ndcl_output_siv o1.x, finalTriVeq0EdgeTessFactor\ndcl_output_siv o2.x, finalTriWeq0EdgeTessFactor\ndcl_temps 1\ndcl_indexrange o0.x 3\nmov r0.x, vForkInstanceID.x\nmov o[r0.x + 0].x, CB0[0][0].z\nret \nhs_fork_phase \ndcl_output_siv o3.x, finalTriInsideTessFactor\nmov o3.x, CB0[0][0].z\nret \n// Approximately 7 instruction slots used\n#endif\n\nconst BYTE discrete_triangle_1cp_hs[] =\n{\n     68,  88,  66,  67, 115, 241, \n    168,  52, 141, 229,  16,  29, \n    225, 108,  55, 105, 208,  26, \n    191, 168,   1,   0,   0,   0, \n     84,  13,   0,   0,   6,   0, \n      0,   0,  56,   0,   0,   0, \n    116,  10,   0,   0, 168,  10, \n      0,   0, 220,  10,   0,   0, \n    112,  11,   0,   0, 184,  12, \n      0,   0,  82,  68,  69,  70, \n     52,  10,   0,   0,   1,   0, \n      0,   0, 120,   0,   0,   0, \n      1,   0,   0,   0,  60,   0, \n      0,   0,   1,   5,  83,  72, \n      0,   5,   0,   0,  10,  10, \n      0,   0,  19,  19,  68,  37, \n     60,   0,   0,   0,  24,   0, \n      0,   0,  40,   0,   0,   0, \n     40,   0,   0,   0,  36,   0, \n      0,   0,  12,   0,   0,   0, \n      0,   0,   0,   0, 100,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 120, 101,  95, 115, \n    121, 115, 116, 101, 109,  95, \n     99,  98, 117, 102, 102, 101, \n    114,   0, 171, 171, 100,   0, \n      0,   0,  30,   0,   0,   0, \n    144,   0,   0,   0, 208,   1, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  64,   5, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,  80,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 116,   5,   0,   0, \n      4,   0,   0,   0,   8,   0, \n      0,   0,   2,   0,   0,   0, \n    152,   5,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    188,   5,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,  80,   5, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 215,   5, \n      0,   0,  16,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,  80,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 238,   5,   0,   0, \n     20,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n     80,   5,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n      5,   6,   0,   0,  24,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  36,   6, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  72,   6, \n      0,   0,  32,   0,   0,   0, \n     96,   0,   0,   0,   0,   0, \n      0,   0, 100,   6,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 136,   6,   0,   0, \n    128,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    156,   6,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    192,   6,   0,   0, 140,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0, 228,   6, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,   8,   7, \n      0,   0, 144,   0,   0,   0, \n     12,   0,   0,   0,   0,   0, \n      0,   0, 156,   6,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  22,   7,   0,   0, \n    156,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n    228,   6,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     51,   7,   0,   0, 160,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0, 152,   5, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  78,   7, \n      0,   0, 168,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0, 152,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 117,   7,   0,   0, \n    176,   0,   0,   0,  32,   0, \n      0,   0,   0,   0,   0,   0, \n    152,   7,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    188,   7,   0,   0, 208,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,  80,   5, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 218,   7, \n      0,   0, 212,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  36,   6,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 239,   7,   0,   0, \n    220,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n    228,   6,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n      7,   8,   0,   0, 224,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,  80,   5, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  24,   8, \n      0,   0, 228,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,  80,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  64,   8,   0,   0, \n    232,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n     80,   5,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     98,   8,   0,   0, 240,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0, 116,   8, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 152,   8, \n      0,   0,   0,   1,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0, 152,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 179,   8,   0,   0, \n      8,   1,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n    152,   5,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    205,   8,   0,   0,  16,   1, \n      0,   0,  32,   0,   0,   0, \n      0,   0,   0,   0, 224,   8, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,   4,   9, \n      0,   0,  48,   1,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  36,   9,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  72,   9,   0,   0, \n     64,   1,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     36,   9,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     97,   9,   0,   0,  80,   1, \n      0,   0,  64,   0,   0,   0, \n      0,   0,   0,   0, 116,   9, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 152,   9, \n      0,   0, 144,   1,   0,   0, \n     32,   0,   0,   0,   0,   0, \n      0,   0, 176,   9,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 212,   9,   0,   0, \n    176,   1,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     36,   9,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    242,   9,   0,   0, 192,   1, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0, 116,   8, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 120, 101, \n     95, 102, 108,  97, 103, 115, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  73,   5, \n      0,   0, 120, 101,  95, 116, \n    101, 115, 115, 101, 108, 108, \n     97, 116, 105, 111, 110,  95, \n    102,  97,  99, 116, 111, 114, \n     95, 114,  97, 110, 103, 101, \n      0, 102, 108, 111,  97, 116, \n     50,   0,   1,   0,   3,   0, \n      1,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 145,   5, \n      0,   0, 120, 101,  95, 108, \n    105, 110, 101,  95, 108, 111, \n    111, 112,  95,  99, 108, 111, \n    115, 105, 110, 103,  95, 105, \n    110, 100, 101, 120,   0, 120, \n    101,  95, 118, 101, 114, 116, \n    101, 120,  95, 105, 110, 100, \n    101, 120,  95, 101, 110, 100, \n    105,  97, 110,   0, 120, 101, \n     95, 118, 101, 114, 116, 101, \n    120,  95, 105, 110, 100, 101, \n    120,  95, 111, 102, 102, 115, \n    101, 116,   0, 120, 101,  95, \n    118, 101, 114, 116, 101, 120, \n     95, 105, 110, 100, 101, 120, \n     95, 109, 105, 110,  95, 109, \n     97, 120,   0, 117, 105, 110, \n    116,  50,   0, 171,   1,   0, \n     19,   0,   1,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     29,   6,   0,   0, 120, 101, \n     95, 117, 115, 101, 114,  95, \n     99, 108, 105, 112,  95, 112, \n    108,  97, 110, 101, 115,   0, \n    102, 108, 111,  97, 116,  52, \n      0, 171,   1,   0,   3,   0, \n      1,   0,   4,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  92,   6, \n      0,   0, 120, 101,  95, 110, \n    100,  99,  95, 115,  99,  97, \n    108, 101,   0, 102, 108, 111, \n     97, 116,  51,   0,   1,   0, \n      3,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    149,   6,   0,   0, 120, 101, \n     95, 112, 111, 105, 110, 116, \n     95, 118, 101, 114, 116, 101, \n    120,  95, 100, 105,  97, 109, \n    101, 116, 101, 114,  95, 109, \n    105, 110,   0, 102, 108, 111, \n     97, 116,   0, 171,   0,   0, \n      3,   0,   1,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    221,   6,   0,   0, 120, 101, \n     95, 110, 100,  99,  95, 111, \n    102, 102, 115, 101, 116,   0, \n    120, 101,  95, 112, 111, 105, \n    110, 116,  95, 118, 101, 114, \n    116, 101, 120,  95, 100, 105, \n     97, 109, 101, 116, 101, 114, \n     95, 109,  97, 120,   0, 120, \n    101,  95, 112, 111, 105, 110, \n    116,  95,  99, 111, 110, 115, \n    116,  97, 110, 116,  95, 100, \n    105,  97, 109, 101, 116, 101, \n    114,   0, 120, 101,  95, 112, \n    111, 105, 110, 116,  95, 115, \n     99, 114, 101, 101, 110,  95, \n    100, 105,  97, 109, 101, 116, \n    101, 114,  95, 116, 111,  95, \n    110, 100,  99,  95, 114,  97, \n    100, 105, 117, 115,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 115, 119, \n    105, 122, 122, 108, 101, 100, \n     95, 115, 105, 103, 110, 115, \n      0, 117, 105, 110, 116,  52, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   4,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    143,   7,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101, 115,  95, 114, 101, \n    115, 111, 108, 117, 116, 105, \n    111, 110,  95, 115,  99,  97, \n    108, 101, 100,   0, 120, 101, \n     95, 115,  97, 109, 112, 108, \n    101,  95,  99, 111, 117, 110, \n    116,  95, 108, 111, 103,  50, \n      0, 120, 101,  95,  97, 108, \n    112, 104,  97,  95, 116, 101, \n    115, 116,  95, 114, 101, 102, \n    101, 114, 101, 110,  99, 101, \n      0, 120, 101,  95,  97, 108, \n    112, 104,  97,  95, 116, 111, \n     95, 109,  97, 115, 107,   0, \n    120, 101,  95, 101, 100, 114, \n     97, 109,  95,  51,  50,  98, \n    112, 112,  95, 116, 105, 108, \n    101,  95, 112, 105, 116,  99, \n    104,  95, 100, 119, 111, 114, \n    100, 115,  95, 115,  99,  97, \n    108, 101, 100,   0, 120, 101, \n     95, 101, 100, 114,  97, 109, \n     95, 100, 101, 112, 116, 104, \n     95,  98,  97, 115, 101,  95, \n    100, 119, 111, 114, 100, 115, \n     95, 115,  99,  97, 108, 101, \n    100,   0, 120, 101,  95,  99, \n    111, 108, 111, 114,  95, 101, \n    120, 112,  95,  98, 105,  97, \n    115,   0,   1,   0,   3,   0, \n      1,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  92,   6, \n      0,   0, 120, 101,  95, 101, \n    100, 114,  97, 109,  95, 112, \n    111, 108, 121,  95, 111, 102, \n    102, 115, 101, 116,  95, 102, \n    114, 111, 110, 116,   0, 120, \n    101,  95, 101, 100, 114,  97, \n    109,  95, 112, 111, 108, 121, \n     95, 111, 102, 102, 115, 101, \n    116,  95,  98,  97,  99, 107, \n      0, 120, 101,  95, 101, 100, \n    114,  97, 109,  95, 115, 116, \n    101, 110,  99, 105, 108,   0, \n    171, 171,   1,   0,  19,   0, \n      1,   0,   4,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 143,   7, \n      0,   0, 120, 101,  95, 101, \n    100, 114,  97, 109,  95, 114, \n    116,  95,  98,  97, 115, 101, \n     95, 100, 119, 111, 114, 100, \n    115,  95, 115,  99,  97, 108, \n    101, 100,   0, 171,   1,   0, \n     19,   0,   1,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    143,   7,   0,   0, 120, 101, \n     95, 101, 100, 114,  97, 109, \n     95, 114, 116,  95, 102, 111, \n    114, 109,  97, 116,  95, 102, \n    108,  97, 103, 115,   0, 120, \n    101,  95, 101, 100, 114,  97, \n    109,  95, 114, 116,  95,  99, \n    108,  97, 109, 112,   0, 171, \n      1,   0,   3,   0,   1,   0, \n      4,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  92,   6,   0,   0, \n    120, 101,  95, 101, 100, 114, \n     97, 109,  95, 114, 116,  95, \n    107, 101, 101, 112,  95, 109, \n     97, 115, 107,   0, 171, 171, \n      1,   0,  19,   0,   1,   0, \n      4,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 143,   7,   0,   0, \n    120, 101,  95, 101, 100, 114, \n     97, 109,  95, 114, 116,  95, \n     98, 108, 101, 110, 100,  95, \n    102,  97,  99, 116, 111, 114, \n    115,  95, 111, 112, 115,   0, \n    120, 101,  95, 101, 100, 114, \n     97, 109,  95,  98, 108, 101, \n    110, 100,  95,  99, 111, 110, \n    115, 116,  97, 110, 116,   0, \n     77, 105,  99, 114, 111, 115, \n    111, 102, 116,  32,  40,  82, \n     41,  32,  72,  76,  83,  76, \n     32,  83, 104,  97, 100, 101, \n    114,  32,  67, 111, 109, 112, \n    105, 108, 101, 114,  32,  49, \n     48,  46,  49,   0, 171, 171, \n     73,  83,  71,  78,  44,   0, \n      0,   0,   1,   0,   0,   0, \n      8,   0,   0,   0,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   1,   0,   0,  88,  69, \n     86,  69,  82,  84,  69,  88, \n     73,  68,   0, 171,  79,  83, \n     71,  78,  44,   0,   0,   0, \n      1,   0,   0,   0,   8,   0, \n      0,   0,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   1,  14, \n      0,   0,  88,  69,  86,  69, \n     82,  84,  69,  88,  73,  68, \n      0, 171,  80,  67,  83,  71, \n    140,   0,   0,   0,   4,   0, \n      0,   0,   8,   0,   0,   0, \n    104,   0,   0,   0,   0,   0, \n      0,   0,  13,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   1,  14,   0,   0, \n    104,   0,   0,   0,   1,   0, \n      0,   0,  13,   0,   0,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   0,   1,  14,   0,   0, \n    104,   0,   0,   0,   2,   0, \n      0,   0,  13,   0,   0,   0, \n      3,   0,   0,   0,   2,   0, \n      0,   0,   1,  14,   0,   0, \n    118,   0,   0,   0,   0,   0, \n      0,   0,  14,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   1,  14,   0,   0, \n     83,  86,  95,  84, 101, 115, \n    115,  70,  97,  99, 116, 111, \n    114,   0,  83,  86,  95,  73, \n    110, 115, 105, 100, 101,  84, \n    101, 115, 115,  70,  97,  99, \n    116, 111, 114,   0, 171, 171, \n     83,  72,  69,  88,  64,   1, \n      0,   0,  81,   0,   3,   0, \n     80,   0,   0,   0, 113,   0, \n      0,   1, 147,   8,   0,   1, \n    148,   8,   0,   1, 149,  16, \n      0,   1, 150,   8,   0,   1, \n    151,  24,   0,   1, 106,   8, \n      0,   1,  89,   0,   0,   7, \n     70, 142,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n    114,   0,   0,   1,  95,   0, \n      0,   4,  18,  16,  32,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0, 101,   0,   0,   3, \n     18,  32,  16,   0,   0,   0, \n      0,   0,  54,   0,   0,   6, \n     18,  32,  16,   0,   0,   0, \n      0,   0,  10,  16,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  62,   0,   0,   1, \n    115,   0,   0,   1, 153,   0, \n      0,   2,   3,   0,   0,   0, \n     95,   0,   0,   2,   0, 112, \n      1,   0, 103,   0,   0,   4, \n     18,  32,  16,   0,   0,   0, \n      0,   0,  17,   0,   0,   0, \n    103,   0,   0,   4,  18,  32, \n     16,   0,   1,   0,   0,   0, \n     18,   0,   0,   0, 103,   0, \n      0,   4,  18,  32,  16,   0, \n      2,   0,   0,   0,  19,   0, \n      0,   0, 104,   0,   0,   2, \n      1,   0,   0,   0,  91,   0, \n      0,   4,  18,  32,  16,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,  54,   0,   0,   4, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10, 112,   1,   0, \n     54,   0,   0,   8,  18,  32, \n    144,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  62,   0,   0,   1, \n    115,   0,   0,   1, 103,   0, \n      0,   4,  18,  32,  16,   0, \n      3,   0,   0,   0,  20,   0, \n      0,   0,  54,   0,   0,   7, \n     18,  32,  16,   0,   3,   0, \n      0,   0,  42, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  83,  84, \n     65,  84, 148,   0,   0,   0, \n      7,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/discrete_triangle_3cp_hs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer xe_system_cbuffer\n// {\n//\n//   uint xe_flags;                     // Offset:    0 Size:     4 [unused]\n//   float2 xe_tessellation_factor_range;// Offset:    4 Size:     8\n//   uint xe_line_loop_closing_index;   // Offset:   12 Size:     4 [unused]\n//   uint xe_vertex_index_endian;       // Offset:   16 Size:     4 [unused]\n//   uint xe_vertex_index_offset;       // Offset:   20 Size:     4 [unused]\n//   uint2 xe_vertex_index_min_max;     // Offset:   24 Size:     8 [unused]\n//   float4 xe_user_clip_planes[6];     // Offset:   32 Size:    96 [unused]\n//   float3 xe_ndc_scale;               // Offset:  128 Size:    12 [unused]\n//   float xe_point_vertex_diameter_min;// Offset:  140 Size:     4 [unused]\n//   float3 xe_ndc_offset;              // Offset:  144 Size:    12 [unused]\n//   float xe_point_vertex_diameter_max;// Offset:  156 Size:     4 [unused]\n//   float2 xe_point_constant_diameter; // Offset:  160 Size:     8 [unused]\n//   float2 xe_point_screen_diameter_to_ndc_radius;// Offset:  168 Size:     8 [unused]\n//   uint4 xe_texture_swizzled_signs[2];// Offset:  176 Size:    32 [unused]\n//   uint xe_textures_resolution_scaled;// Offset:  208 Size:     4 [unused]\n//   uint2 xe_sample_count_log2;        // Offset:  212 Size:     8 [unused]\n//   float xe_alpha_test_reference;     // Offset:  220 Size:     4 [unused]\n//   uint xe_alpha_to_mask;             // Offset:  224 Size:     4 [unused]\n//   uint xe_edram_32bpp_tile_pitch_dwords_scaled;// Offset:  228 Size:     4 [unused]\n//   uint xe_edram_depth_base_dwords_scaled;// Offset:  232 Size:     4 [unused]\n//   float4 xe_color_exp_bias;          // Offset:  240 Size:    16 [unused]\n//   float2 xe_edram_poly_offset_front; // Offset:  256 Size:     8 [unused]\n//   float2 xe_edram_poly_offset_back;  // Offset:  264 Size:     8 [unused]\n//   uint4 xe_edram_stencil[2];         // Offset:  272 Size:    32 [unused]\n//   uint4 xe_edram_rt_base_dwords_scaled;// Offset:  304 Size:    16 [unused]\n//   uint4 xe_edram_rt_format_flags;    // Offset:  320 Size:    16 [unused]\n//   float4 xe_edram_rt_clamp[4];       // Offset:  336 Size:    64 [unused]\n//   uint4 xe_edram_rt_keep_mask[2];    // Offset:  400 Size:    32 [unused]\n//   uint4 xe_edram_rt_blend_factors_ops;// Offset:  432 Size:    16 [unused]\n//   float4 xe_edram_blend_constant;    // Offset:  448 Size:    16 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_system_cbuffer                 cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Patch Constant signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// SV_TessFactor            0   x           0  TRIEDGE   float   x   \n// SV_TessFactor            1   x           1  TRIEDGE   float   x   \n// SV_TessFactor            2   x           2  TRIEDGE   float   x   \n// SV_InsideTessFactor      0   x           3   TRIINT   float   x   \n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// XEVERTEXID               0   x           0     NONE   float   x   \n//\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// XEVERTEXID               0   x           0     NONE   float   x   \n//\n// Tessellation Domain   # of control points\n// -------------------- --------------------\n// Triangle                                3\n//\n// Tessellation Output Primitive  Partitioning Type \n// ------------------------------ ------------------\n// Clockwise Triangles            Integer           \n//\nhs_5_1\nhs_decls \ndcl_input_control_point_count 3\ndcl_output_control_point_count 3\ndcl_tessellator_domain domain_tri\ndcl_tessellator_partitioning partitioning_integer\ndcl_tessellator_output_primitive output_triangle_cw\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][1], immediateIndexed, space=0\nhs_fork_phase \ndcl_hs_fork_phase_instance_count 3\ndcl_input vForkInstanceID\ndcl_output_siv o0.x, finalTriUeq0EdgeTessFactor\ndcl_output_siv o1.x, finalTriVeq0EdgeTessFactor\ndcl_output_siv o2.x, finalTriWeq0EdgeTessFactor\ndcl_temps 1\ndcl_indexrange o0.x 3\nmov r0.x, vForkInstanceID.x\nmov o[r0.x + 0].x, CB0[0][0].z\nret \nhs_fork_phase \ndcl_output_siv o3.x, finalTriInsideTessFactor\nmov o3.x, CB0[0][0].z\nret \n// Approximately 5 instruction slots used\n#endif\n\nconst BYTE discrete_triangle_3cp_hs[] =\n{\n     68,  88,  66,  67,  32,  22, \n    215, 129, 127, 110,  70, 162, \n     42,  32,  73,  43,  11,  32, \n    196,  23,   1,   0,   0,   0, \n     24,  13,   0,   0,   6,   0, \n      0,   0,  56,   0,   0,   0, \n    116,  10,   0,   0, 168,  10, \n      0,   0, 220,  10,   0,   0, \n    112,  11,   0,   0, 124,  12, \n      0,   0,  82,  68,  69,  70, \n     52,  10,   0,   0,   1,   0, \n      0,   0, 120,   0,   0,   0, \n      1,   0,   0,   0,  60,   0, \n      0,   0,   1,   5,  83,  72, \n      0,   5,   0,   0,  10,  10, \n      0,   0,  19,  19,  68,  37, \n     60,   0,   0,   0,  24,   0, \n      0,   0,  40,   0,   0,   0, \n     40,   0,   0,   0,  36,   0, \n      0,   0,  12,   0,   0,   0, \n      0,   0,   0,   0, 100,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 120, 101,  95, 115, \n    121, 115, 116, 101, 109,  95, \n     99,  98, 117, 102, 102, 101, \n    114,   0, 171, 171, 100,   0, \n      0,   0,  30,   0,   0,   0, \n    144,   0,   0,   0, 208,   1, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  64,   5, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,  80,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 116,   5,   0,   0, \n      4,   0,   0,   0,   8,   0, \n      0,   0,   2,   0,   0,   0, \n    152,   5,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    188,   5,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,  80,   5, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 215,   5, \n      0,   0,  16,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,  80,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 238,   5,   0,   0, \n     20,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n     80,   5,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n      5,   6,   0,   0,  24,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  36,   6, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  72,   6, \n      0,   0,  32,   0,   0,   0, \n     96,   0,   0,   0,   0,   0, \n      0,   0, 100,   6,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 136,   6,   0,   0, \n    128,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    156,   6,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    192,   6,   0,   0, 140,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0, 228,   6, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,   8,   7, \n      0,   0, 144,   0,   0,   0, \n     12,   0,   0,   0,   0,   0, \n      0,   0, 156,   6,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  22,   7,   0,   0, \n    156,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n    228,   6,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     51,   7,   0,   0, 160,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0, 152,   5, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  78,   7, \n      0,   0, 168,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0, 152,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 117,   7,   0,   0, \n    176,   0,   0,   0,  32,   0, \n      0,   0,   0,   0,   0,   0, \n    152,   7,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    188,   7,   0,   0, 208,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,  80,   5, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 218,   7, \n      0,   0, 212,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  36,   6,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 239,   7,   0,   0, \n    220,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n    228,   6,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n      7,   8,   0,   0, 224,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,  80,   5, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  24,   8, \n      0,   0, 228,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,  80,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  64,   8,   0,   0, \n    232,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n     80,   5,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     98,   8,   0,   0, 240,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0, 116,   8, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 152,   8, \n      0,   0,   0,   1,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0, 152,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 179,   8,   0,   0, \n      8,   1,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n    152,   5,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    205,   8,   0,   0,  16,   1, \n      0,   0,  32,   0,   0,   0, \n      0,   0,   0,   0, 224,   8, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,   4,   9, \n      0,   0,  48,   1,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  36,   9,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  72,   9,   0,   0, \n     64,   1,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     36,   9,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     97,   9,   0,   0,  80,   1, \n      0,   0,  64,   0,   0,   0, \n      0,   0,   0,   0, 116,   9, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 152,   9, \n      0,   0, 144,   1,   0,   0, \n     32,   0,   0,   0,   0,   0, \n      0,   0, 176,   9,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 212,   9,   0,   0, \n    176,   1,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     36,   9,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    242,   9,   0,   0, 192,   1, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0, 116,   8, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 120, 101, \n     95, 102, 108,  97, 103, 115, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  73,   5, \n      0,   0, 120, 101,  95, 116, \n    101, 115, 115, 101, 108, 108, \n     97, 116, 105, 111, 110,  95, \n    102,  97,  99, 116, 111, 114, \n     95, 114,  97, 110, 103, 101, \n      0, 102, 108, 111,  97, 116, \n     50,   0,   1,   0,   3,   0, \n      1,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 145,   5, \n      0,   0, 120, 101,  95, 108, \n    105, 110, 101,  95, 108, 111, \n    111, 112,  95,  99, 108, 111, \n    115, 105, 110, 103,  95, 105, \n    110, 100, 101, 120,   0, 120, \n    101,  95, 118, 101, 114, 116, \n    101, 120,  95, 105, 110, 100, \n    101, 120,  95, 101, 110, 100, \n    105,  97, 110,   0, 120, 101, \n     95, 118, 101, 114, 116, 101, \n    120,  95, 105, 110, 100, 101, \n    120,  95, 111, 102, 102, 115, \n    101, 116,   0, 120, 101,  95, \n    118, 101, 114, 116, 101, 120, \n     95, 105, 110, 100, 101, 120, \n     95, 109, 105, 110,  95, 109, \n     97, 120,   0, 117, 105, 110, \n    116,  50,   0, 171,   1,   0, \n     19,   0,   1,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     29,   6,   0,   0, 120, 101, \n     95, 117, 115, 101, 114,  95, \n     99, 108, 105, 112,  95, 112, \n    108,  97, 110, 101, 115,   0, \n    102, 108, 111,  97, 116,  52, \n      0, 171,   1,   0,   3,   0, \n      1,   0,   4,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  92,   6, \n      0,   0, 120, 101,  95, 110, \n    100,  99,  95, 115,  99,  97, \n    108, 101,   0, 102, 108, 111, \n     97, 116,  51,   0,   1,   0, \n      3,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    149,   6,   0,   0, 120, 101, \n     95, 112, 111, 105, 110, 116, \n     95, 118, 101, 114, 116, 101, \n    120,  95, 100, 105,  97, 109, \n    101, 116, 101, 114,  95, 109, \n    105, 110,   0, 102, 108, 111, \n     97, 116,   0, 171,   0,   0, \n      3,   0,   1,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    221,   6,   0,   0, 120, 101, \n     95, 110, 100,  99,  95, 111, \n    102, 102, 115, 101, 116,   0, \n    120, 101,  95, 112, 111, 105, \n    110, 116,  95, 118, 101, 114, \n    116, 101, 120,  95, 100, 105, \n     97, 109, 101, 116, 101, 114, \n     95, 109,  97, 120,   0, 120, \n    101,  95, 112, 111, 105, 110, \n    116,  95,  99, 111, 110, 115, \n    116,  97, 110, 116,  95, 100, \n    105,  97, 109, 101, 116, 101, \n    114,   0, 120, 101,  95, 112, \n    111, 105, 110, 116,  95, 115, \n     99, 114, 101, 101, 110,  95, \n    100, 105,  97, 109, 101, 116, \n    101, 114,  95, 116, 111,  95, \n    110, 100,  99,  95, 114,  97, \n    100, 105, 117, 115,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 115, 119, \n    105, 122, 122, 108, 101, 100, \n     95, 115, 105, 103, 110, 115, \n      0, 117, 105, 110, 116,  52, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   4,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    143,   7,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101, 115,  95, 114, 101, \n    115, 111, 108, 117, 116, 105, \n    111, 110,  95, 115,  99,  97, \n    108, 101, 100,   0, 120, 101, \n     95, 115,  97, 109, 112, 108, \n    101,  95,  99, 111, 117, 110, \n    116,  95, 108, 111, 103,  50, \n      0, 120, 101,  95,  97, 108, \n    112, 104,  97,  95, 116, 101, \n    115, 116,  95, 114, 101, 102, \n    101, 114, 101, 110,  99, 101, \n      0, 120, 101,  95,  97, 108, \n    112, 104,  97,  95, 116, 111, \n     95, 109,  97, 115, 107,   0, \n    120, 101,  95, 101, 100, 114, \n     97, 109,  95,  51,  50,  98, \n    112, 112,  95, 116, 105, 108, \n    101,  95, 112, 105, 116,  99, \n    104,  95, 100, 119, 111, 114, \n    100, 115,  95, 115,  99,  97, \n    108, 101, 100,   0, 120, 101, \n     95, 101, 100, 114,  97, 109, \n     95, 100, 101, 112, 116, 104, \n     95,  98,  97, 115, 101,  95, \n    100, 119, 111, 114, 100, 115, \n     95, 115,  99,  97, 108, 101, \n    100,   0, 120, 101,  95,  99, \n    111, 108, 111, 114,  95, 101, \n    120, 112,  95,  98, 105,  97, \n    115,   0,   1,   0,   3,   0, \n      1,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  92,   6, \n      0,   0, 120, 101,  95, 101, \n    100, 114,  97, 109,  95, 112, \n    111, 108, 121,  95, 111, 102, \n    102, 115, 101, 116,  95, 102, \n    114, 111, 110, 116,   0, 120, \n    101,  95, 101, 100, 114,  97, \n    109,  95, 112, 111, 108, 121, \n     95, 111, 102, 102, 115, 101, \n    116,  95,  98,  97,  99, 107, \n      0, 120, 101,  95, 101, 100, \n    114,  97, 109,  95, 115, 116, \n    101, 110,  99, 105, 108,   0, \n    171, 171,   1,   0,  19,   0, \n      1,   0,   4,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 143,   7, \n      0,   0, 120, 101,  95, 101, \n    100, 114,  97, 109,  95, 114, \n    116,  95,  98,  97, 115, 101, \n     95, 100, 119, 111, 114, 100, \n    115,  95, 115,  99,  97, 108, \n    101, 100,   0, 171,   1,   0, \n     19,   0,   1,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    143,   7,   0,   0, 120, 101, \n     95, 101, 100, 114,  97, 109, \n     95, 114, 116,  95, 102, 111, \n    114, 109,  97, 116,  95, 102, \n    108,  97, 103, 115,   0, 120, \n    101,  95, 101, 100, 114,  97, \n    109,  95, 114, 116,  95,  99, \n    108,  97, 109, 112,   0, 171, \n      1,   0,   3,   0,   1,   0, \n      4,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  92,   6,   0,   0, \n    120, 101,  95, 101, 100, 114, \n     97, 109,  95, 114, 116,  95, \n    107, 101, 101, 112,  95, 109, \n     97, 115, 107,   0, 171, 171, \n      1,   0,  19,   0,   1,   0, \n      4,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 143,   7,   0,   0, \n    120, 101,  95, 101, 100, 114, \n     97, 109,  95, 114, 116,  95, \n     98, 108, 101, 110, 100,  95, \n    102,  97,  99, 116, 111, 114, \n    115,  95, 111, 112, 115,   0, \n    120, 101,  95, 101, 100, 114, \n     97, 109,  95,  98, 108, 101, \n    110, 100,  95,  99, 111, 110, \n    115, 116,  97, 110, 116,   0, \n     77, 105,  99, 114, 111, 115, \n    111, 102, 116,  32,  40,  82, \n     41,  32,  72,  76,  83,  76, \n     32,  83, 104,  97, 100, 101, \n    114,  32,  67, 111, 109, 112, \n    105, 108, 101, 114,  32,  49, \n     48,  46,  49,   0, 171, 171, \n     73,  83,  71,  78,  44,   0, \n      0,   0,   1,   0,   0,   0, \n      8,   0,   0,   0,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   1,   0,   0,  88,  69, \n     86,  69,  82,  84,  69,  88, \n     73,  68,   0, 171,  79,  83, \n     71,  78,  44,   0,   0,   0, \n      1,   0,   0,   0,   8,   0, \n      0,   0,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   1,  14, \n      0,   0,  88,  69,  86,  69, \n     82,  84,  69,  88,  73,  68, \n      0, 171,  80,  67,  83,  71, \n    140,   0,   0,   0,   4,   0, \n      0,   0,   8,   0,   0,   0, \n    104,   0,   0,   0,   0,   0, \n      0,   0,  13,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   1,  14,   0,   0, \n    104,   0,   0,   0,   1,   0, \n      0,   0,  13,   0,   0,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   0,   1,  14,   0,   0, \n    104,   0,   0,   0,   2,   0, \n      0,   0,  13,   0,   0,   0, \n      3,   0,   0,   0,   2,   0, \n      0,   0,   1,  14,   0,   0, \n    118,   0,   0,   0,   0,   0, \n      0,   0,  14,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   1,  14,   0,   0, \n     83,  86,  95,  84, 101, 115, \n    115,  70,  97,  99, 116, 111, \n    114,   0,  83,  86,  95,  73, \n    110, 115, 105, 100, 101,  84, \n    101, 115, 115,  70,  97,  99, \n    116, 111, 114,   0, 171, 171, \n     83,  72,  69,  88,   4,   1, \n      0,   0,  81,   0,   3,   0, \n     65,   0,   0,   0, 113,   0, \n      0,   1, 147,  24,   0,   1, \n    148,  24,   0,   1, 149,  16, \n      0,   1, 150,   8,   0,   1, \n    151,  24,   0,   1, 106,   8, \n      0,   1,  89,   0,   0,   7, \n     70, 142,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n    115,   0,   0,   1, 153,   0, \n      0,   2,   3,   0,   0,   0, \n     95,   0,   0,   2,   0, 112, \n      1,   0, 103,   0,   0,   4, \n     18,  32,  16,   0,   0,   0, \n      0,   0,  17,   0,   0,   0, \n    103,   0,   0,   4,  18,  32, \n     16,   0,   1,   0,   0,   0, \n     18,   0,   0,   0, 103,   0, \n      0,   4,  18,  32,  16,   0, \n      2,   0,   0,   0,  19,   0, \n      0,   0, 104,   0,   0,   2, \n      1,   0,   0,   0,  91,   0, \n      0,   4,  18,  32,  16,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,  54,   0,   0,   4, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10, 112,   1,   0, \n     54,   0,   0,   8,  18,  32, \n    144,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  62,   0,   0,   1, \n    115,   0,   0,   1, 103,   0, \n      0,   4,  18,  32,  16,   0, \n      3,   0,   0,   0,  20,   0, \n      0,   0,  54,   0,   0,   7, \n     18,  32,  16,   0,   3,   0, \n      0,   0,  42, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  83,  84, \n     65,  84, 148,   0,   0,   0, \n      5,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/float24_round_ps.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// TEXCOORD                 0   xyzw        0     NONE   float       \n// TEXCOORD                 1   xyzw        1     NONE   float       \n// TEXCOORD                 2   xyzw        2     NONE   float       \n// TEXCOORD                 3   xyzw        3     NONE   float       \n// TEXCOORD                 4   xyzw        4     NONE   float       \n// TEXCOORD                 5   xyzw        5     NONE   float       \n// TEXCOORD                 6   xyzw        6     NONE   float       \n// TEXCOORD                 7   xyzw        7     NONE   float       \n// TEXCOORD                 8   xyzw        8     NONE   float       \n// TEXCOORD                 9   xyzw        9     NONE   float       \n// TEXCOORD                10   xyzw       10     NONE   float       \n// TEXCOORD                11   xyzw       11     NONE   float       \n// TEXCOORD                12   xyzw       12     NONE   float       \n// TEXCOORD                13   xyzw       13     NONE   float       \n// TEXCOORD                14   xyzw       14     NONE   float       \n// TEXCOORD                15   xyzw       15     NONE   float       \n// TEXCOORD                16   xyz        16     NONE   float       \n// SV_Position              0   xyzw       17      POS   float     z \n//\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// SV_Depth                 0    N/A   oDepth    DEPTH   float    YES\n//\n// Pixel Shader runs at sample frequency\n//\nps_5_1\ndcl_globalFlags refactoringAllowed\ndcl_input_ps_siv linear noperspective sample v17.z, position\ndcl_output oDepth\ndcl_temps 2\nmul_sat [precise(x)] r0.x, v17.z, l(2.000000)\nuge [precise(y)] r0.y, l(0x7fffffff), r0.x\nand [precise(x)] r0.x, r0.x, r0.y\numin [precise(x)] r0.x, r0.x, l(0x3ffffff8)\nbfi [precise(y)] r0.y, l(23), l(0), r0.x, l(0x00800000)\nushr [precise(z)] r0.z, r0.x, l(23)\niadd [precise(z)] r0.z, -r0.z, l(113)\numin [precise(z)] r0.z, r0.z, l(24)\nushr [precise(y)] r0.y, r0.y, r0.z\nult [precise(z)] r0.z, r0.x, l(0x38800000)\niadd [precise(x)] r0.x, r0.x, l(0xc8000000)\nmovc [precise(x)] r0.x, r0.z, r0.y, r0.x\nubfe [precise(y)] r0.y, l(1), l(3), r0.x\niadd [precise(x)] r0.x, r0.y, r0.x\niadd [precise(x)] r0.x, r0.x, l(3)\nubfe [precise(xyz)] r0.xyz, l(24, 20, 4, 0), l(3, 3, 23, 0), r0.xxxx\nfirstbit_hi [precise(w)] r0.w, r0.y\niadd [precise(w)] r0.w, r0.w, l(-11)\nmovc [precise(w)] r0.w, r0.y, r0.w, l(21)\niadd [precise(x)] r1.x, -r0.w, l(1)\nmovc [precise(x)] r1.x, r0.z, r0.z, r1.x\nishl [precise(w)] r0.w, r0.y, r0.w\nand [precise(w)] r0.w, r0.w, l(0x000fffff)\nmovc [precise(y)] r0.y, r0.z, r0.y, r0.w\nishl [precise(z)] r0.z, r1.x, l(23)\niadd [precise(z)] r0.z, r0.z, l(0x37800000)\nishl [precise(y)] r0.y, r0.y, l(3)\niadd [precise(y)] r0.y, r0.z, r0.y\nmovc [precise(x)] oDepth, r0.x, r0.y, l(0)\nret \n// Approximately 30 instruction slots used\n#endif\n\nconst BYTE float24_round_ps[] =\n{\n     68,  88,  66,  67, 110,  79, \n     84, 202, 151, 165, 237, 180, \n     64,  17,   0, 132, 236, 126, \n    142, 105,   1,   0,   0,   0, \n      8,   7,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n    160,   0,   0,   0, 120,   2, \n      0,   0, 172,   2,   0,   0, \n    108,   6,   0,   0,  82,  68, \n     69,  70, 100,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n    255, 255,   0,   5,   0,   0, \n     60,   0,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n     77, 105,  99, 114, 111, 115, \n    111, 102, 116,  32,  40,  82, \n     41,  32,  72,  76,  83,  76, \n     32,  83, 104,  97, 100, 101, \n    114,  32,  67, 111, 109, 112, \n    105, 108, 101, 114,  32,  49, \n     48,  46,  49,   0,  73,  83, \n     71,  78, 208,   1,   0,   0, \n     18,   0,   0,   0,   8,   0, \n      0,   0, 184,   1,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,  15,   0, \n      0,   0, 184,   1,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,  15,   0, \n      0,   0, 184,   1,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      2,   0,   0,   0,  15,   0, \n      0,   0, 184,   1,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  15,   0, \n      0,   0, 184,   1,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      4,   0,   0,   0,  15,   0, \n      0,   0, 184,   1,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      5,   0,   0,   0,  15,   0, \n      0,   0, 184,   1,   0,   0, \n      6,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      6,   0,   0,   0,  15,   0, \n      0,   0, 184,   1,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      7,   0,   0,   0,  15,   0, \n      0,   0, 184,   1,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      8,   0,   0,   0,  15,   0, \n      0,   0, 184,   1,   0,   0, \n      9,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      9,   0,   0,   0,  15,   0, \n      0,   0, 184,   1,   0,   0, \n     10,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n     10,   0,   0,   0,  15,   0, \n      0,   0, 184,   1,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n     11,   0,   0,   0,  15,   0, \n      0,   0, 184,   1,   0,   0, \n     12,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n     12,   0,   0,   0,  15,   0, \n      0,   0, 184,   1,   0,   0, \n     13,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n     13,   0,   0,   0,  15,   0, \n      0,   0, 184,   1,   0,   0, \n     14,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n     14,   0,   0,   0,  15,   0, \n      0,   0, 184,   1,   0,   0, \n     15,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n     15,   0,   0,   0,  15,   0, \n      0,   0, 184,   1,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n     16,   0,   0,   0,   7,   0, \n      0,   0, 193,   1,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   3,   0,   0,   0, \n     17,   0,   0,   0,  15,   4, \n      0,   0,  84,  69,  88,  67, \n     79,  79,  82,  68,   0,  83, \n     86,  95,  80, 111, 115, 105, \n    116, 105, 111, 110,   0, 171, \n    171, 171,  79,  83,  71,  78, \n     44,   0,   0,   0,   1,   0, \n      0,   0,   8,   0,   0,   0, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0, 255, 255, \n    255, 255,   1,  14,   0,   0, \n     83,  86,  95,  68, 101, 112, \n    116, 104,   0, 171, 171, 171, \n     83,  72,  69,  88, 184,   3, \n      0,   0,  81,   0,   0,   0, \n    238,   0,   0,   0, 106,   8, \n      0,   1, 100,  56,   0,   4, \n     66,  16,  16,   0,  17,   0, \n      0,   0,   1,   0,   0,   0, \n    101,   0,   0,   2,   1, 192, \n      0,   0, 104,   0,   0,   2, \n      2,   0,   0,   0,  56,  32, \n      8,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  42,  16, \n     16,   0,  17,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  64,  80,   0,  16,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n    255, 255, 255, 127,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,   0,   8,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  84,   0, \n      8,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0, 248, 255, \n    255,  63, 140,   0,  16,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     23,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0, 128,   0,  85,   0, \n     32,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  23,   0, \n      0,   0,  30,   0,  32,   8, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16, 128, \n     65,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n    113,   0,   0,   0,  84,   0, \n     32,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  24,   0, \n      0,   0,  85,   0,  16,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     79,   0,  32,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0, 128,  56,  30,   0, \n      8,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0, 200,  55,   0,   8,   9, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0, 138,   0,  16,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  30,   0,   8,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     30,   0,   8,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0, 138,   0, \n     56,  15, 114,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,  24,   0,   0,   0, \n     20,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     23,   0,   0,   0,   0,   0, \n      0,   0,   6,   0,  16,   0, \n      0,   0,   0,   0, 135,   0, \n     64,   5, 130,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     30,   0,  64,   7, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n    245, 255, 255, 255,  55,   0, \n     64,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     21,   0,   0,   0,  30,   0, \n      8,   8,  18,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16, 128,  65,   0,   0,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     55,   0,   8,   9,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     41,   0,  64,   7, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,   1,   0, \n     64,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0, 255, 255, \n     15,   0,  55,   0,  16,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  41,   0,  32,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  23,   0,   0,   0, \n     30,   0,  32,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0, 128,  55,  41,   0, \n     16,   7,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  30,   0,  16,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     55,   0,   8,   8,   1, 192, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  62,   0,   0,   1, \n     83,  84,  65,  84, 148,   0, \n      0,   0,  30,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      1,   0,   0,   0,  11,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   5,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/float24_truncate_ps.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// TEXCOORD                 0   xyzw        0     NONE   float       \n// TEXCOORD                 1   xyzw        1     NONE   float       \n// TEXCOORD                 2   xyzw        2     NONE   float       \n// TEXCOORD                 3   xyzw        3     NONE   float       \n// TEXCOORD                 4   xyzw        4     NONE   float       \n// TEXCOORD                 5   xyzw        5     NONE   float       \n// TEXCOORD                 6   xyzw        6     NONE   float       \n// TEXCOORD                 7   xyzw        7     NONE   float       \n// TEXCOORD                 8   xyzw        8     NONE   float       \n// TEXCOORD                 9   xyzw        9     NONE   float       \n// TEXCOORD                10   xyzw       10     NONE   float       \n// TEXCOORD                11   xyzw       11     NONE   float       \n// TEXCOORD                12   xyzw       12     NONE   float       \n// TEXCOORD                13   xyzw       13     NONE   float       \n// TEXCOORD                14   xyzw       14     NONE   float       \n// TEXCOORD                15   xyzw       15     NONE   float       \n// TEXCOORD                16   xyz        16     NONE   float       \n// SV_Position              0   xyzw       17      POS   float     z \n//\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// SV_DepthLessEqual        0    N/A oDepthLE  DEPTHLE   float    YES\n//\n// Pixel Shader runs at sample frequency\n//\nps_5_1\ndcl_globalFlags refactoringAllowed\ndcl_input_ps_siv linear noperspective sample v17.z, position\ndcl_output oDepthLE\ndcl_temps 1\nmul_sat [precise(x)] r0.x, v17.z, l(2.000000)\nuge [precise(y)] r0.y, r0.x, l(0x2e800000)\nif_nz r0.y\n  ubfe [precise(y)] r0.y, l(8), l(23), r0.x\n  iadd [precise(y)] r0.y, -r0.y, l(116)\n  imax [precise(y)] r0.y, r0.y, l(3)\n  bfi [precise(x)] r0.x, r0.y, l(0), l(0), r0.x\nelse \n  mov [precise(x)] r0.x, l(0)\nendif \nmul [precise(x)] oDepthLE, r0.x, l(0.500000)\nret \n// Approximately 12 instruction slots used\n#endif\n\nconst BYTE float24_truncate_ps[] =\n{\n     68,  88,  66,  67, 234,  72, \n    187, 196, 185, 155,  10, 179, \n    119, 204,  17,  88, 131, 142, \n    107, 205,   1,   0,   0,   0, \n    140,   4,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n    160,   0,   0,   0, 120,   2, \n      0,   0, 180,   2,   0,   0, \n    240,   3,   0,   0,  82,  68, \n     69,  70, 100,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n    255, 255,   0,   5,   0,   0, \n     60,   0,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n     77, 105,  99, 114, 111, 115, \n    111, 102, 116,  32,  40,  82, \n     41,  32,  72,  76,  83,  76, \n     32,  83, 104,  97, 100, 101, \n    114,  32,  67, 111, 109, 112, \n    105, 108, 101, 114,  32,  49, \n     48,  46,  49,   0,  73,  83, \n     71,  78, 208,   1,   0,   0, \n     18,   0,   0,   0,   8,   0, \n      0,   0, 184,   1,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,  15,   0, \n      0,   0, 184,   1,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,  15,   0, \n      0,   0, 184,   1,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      2,   0,   0,   0,  15,   0, \n      0,   0, 184,   1,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  15,   0, \n      0,   0, 184,   1,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      4,   0,   0,   0,  15,   0, \n      0,   0, 184,   1,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      5,   0,   0,   0,  15,   0, \n      0,   0, 184,   1,   0,   0, \n      6,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      6,   0,   0,   0,  15,   0, \n      0,   0, 184,   1,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      7,   0,   0,   0,  15,   0, \n      0,   0, 184,   1,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      8,   0,   0,   0,  15,   0, \n      0,   0, 184,   1,   0,   0, \n      9,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      9,   0,   0,   0,  15,   0, \n      0,   0, 184,   1,   0,   0, \n     10,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n     10,   0,   0,   0,  15,   0, \n      0,   0, 184,   1,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n     11,   0,   0,   0,  15,   0, \n      0,   0, 184,   1,   0,   0, \n     12,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n     12,   0,   0,   0,  15,   0, \n      0,   0, 184,   1,   0,   0, \n     13,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n     13,   0,   0,   0,  15,   0, \n      0,   0, 184,   1,   0,   0, \n     14,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n     14,   0,   0,   0,  15,   0, \n      0,   0, 184,   1,   0,   0, \n     15,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n     15,   0,   0,   0,  15,   0, \n      0,   0, 184,   1,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n     16,   0,   0,   0,   7,   0, \n      0,   0, 193,   1,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   3,   0,   0,   0, \n     17,   0,   0,   0,  15,   4, \n      0,   0,  84,  69,  88,  67, \n     79,  79,  82,  68,   0,  83, \n     86,  95,  80, 111, 115, 105, \n    116, 105, 111, 110,   0, 171, \n    171, 171,  79,  83,  71,  78, \n     52,   0,   0,   0,   1,   0, \n      0,   0,   8,   0,   0,   0, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0, 255, 255, \n    255, 255,   1,  14,   0,   0, \n     83,  86,  95,  68, 101, 112, \n    116, 104,  76, 101, 115, 115, \n     69, 113, 117,  97, 108,   0, \n    171, 171,  83,  72,  69,  88, \n     52,   1,   0,   0,  81,   0, \n      0,   0,  77,   0,   0,   0, \n    106,   8,   0,   1, 100,  56, \n      0,   4,  66,  16,  16,   0, \n     17,   0,   0,   0,   1,   0, \n      0,   0, 101,   0,   0,   2, \n      1, 112,   2,   0, 104,   0, \n      0,   2,   1,   0,   0,   0, \n     56,  32,   8,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     42,  16,  16,   0,  17,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,  64,  80,   0, \n     16,   7,  34,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n    128,  46,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0, 138,   0,  16,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,   1,  64, \n      0,   0,  23,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  30,   0,  16,   8, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16, 128, \n     65,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n    116,   0,   0,   0,  36,   0, \n     16,   7,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0, 140,   0,   8,  11, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  18,   0, \n      0,   1,  54,   0,   8,   5, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  56,   0,   8,   6, \n      1, 112,   2,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  63,  62,   0,   0,   1, \n     83,  84,  65,  84, 148,   0, \n      0,   0,  12,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/fullscreen_cw_vs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// SV_VertexID              0   x           0   VERTID    uint   x   \n//\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// SV_Position              0   xyzw        0      POS   float   xyzw\n//\nvs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_input_sgv v0.x, vertex_id\ndcl_output_siv o0.xyzw, position\ndcl_temps 1\nushr r0.y, v0.x, l(1)\nmov r0.x, v0.x\nand r0.xy, r0.xyxx, l(1, 1, 0, 0)\nutof r0.xy, r0.xyxx\nmad o0.xy, r0.xyxx, l(4.000000, -4.000000, 0.000000, 0.000000), l(-1.000000, 1.000000, 0.000000, 0.000000)\nmov o0.zw, l(0,0,0,1.000000)\nret \n// Approximately 7 instruction slots used\n#endif\n\nconst BYTE fullscreen_cw_vs[] =\n{\n     68,  88,  66,  67,  38, 212, \n     32, 171,  28, 206, 206,  51, \n     24, 105, 112,  99, 117, 136, \n      1,  11,   1,   0,   0,   0, \n    172,   2,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n    160,   0,   0,   0, 212,   0, \n      0,   0,   8,   1,   0,   0, \n     16,   2,   0,   0,  82,  68, \n     69,  70, 100,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n    254, 255,   0,   5,   0,   0, \n     60,   0,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n     77, 105,  99, 114, 111, 115, \n    111, 102, 116,  32,  40,  82, \n     41,  32,  72,  76,  83,  76, \n     32,  83, 104,  97, 100, 101, \n    114,  32,  67, 111, 109, 112, \n    105, 108, 101, 114,  32,  49, \n     48,  46,  49,   0,  73,  83, \n     71,  78,  44,   0,   0,   0, \n      1,   0,   0,   0,   8,   0, \n      0,   0,  32,   0,   0,   0, \n      0,   0,   0,   0,   6,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   1,   1, \n      0,   0,  83,  86,  95,  86, \n    101, 114, 116, 101, 120,  73, \n     68,   0,  79,  83,  71,  78, \n     44,   0,   0,   0,   1,   0, \n      0,   0,   8,   0,   0,   0, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,  15,   0,   0,   0, \n     83,  86,  95,  80, 111, 115, \n    105, 116, 105, 111, 110,   0, \n     83,  72,  69,  88,   0,   1, \n      0,   0,  81,   0,   1,   0, \n     64,   0,   0,   0, 106,   8, \n      0,   1,  96,   0,   0,   4, \n     18,  16,  16,   0,   0,   0, \n      0,   0,   6,   0,   0,   0, \n    103,   0,   0,   4, 242,  32, \n     16,   0,   0,   0,   0,   0, \n      1,   0,   0,   0, 104,   0, \n      0,   2,   1,   0,   0,   0, \n     85,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     10,  16,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,  16, \n     16,   0,   0,   0,   0,   0, \n      1,   0,   0,  10,  50,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   0, \n      0,   5,  50,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n     50,   0,   0,  15,  50,  32, \n     16,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128,  64,   0,   0, \n    128, 192,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128,  63,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,  32, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    128,  63,  62,   0,   0,   1, \n     83,  84,  65,  84, 148,   0, \n      0,   0,   7,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/fxaa_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer XeApplyGammaRampConstants\n// {\n//\n//   uint2 xe_fxaa_size;                // Offset:    0 Size:     8\n//   float2 xe_fxaa_size_inv;           // Offset:    8 Size:     8\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_sampler_linear_clamp           sampler      NA          NA      S0             s0      1 \n// xe_fxaa_source                    texture  float4          2d      T0             t0      1 \n// xe_fxaa_dest                          UAV  unorm4          2d      U0             u0      1 \n// XeApplyGammaRampConstants         cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][1], immediateIndexed, space=0\ndcl_sampler S0[0:0], mode_default, space=0\ndcl_resource_texture2d (float,float,float,float) T0[0:0], space=0\ndcl_uav_typed_texture2d (unorm,unorm,unorm,unorm) U0[0:0], space=0\ndcl_input vThreadID.xy\ndcl_temps 7\ndcl_thread_group 16, 8, 1\nuge r0.xy, vThreadID.xyxx, CB0[0][0].xyxx\nor r0.x, r0.y, r0.x\nif_nz r0.x\n  ret \nendif \nutof r0.xy, vThreadID.xyxx\nadd r0.xy, r0.xyxx, l(0.500000, 0.500000, 0.000000, 0.000000)\nmul r0.zw, r0.xxxy, CB0[0][0].zzzw\nsample_l r1.xyzw, r0.zwzz, T0[0].xyzw, S0[0], l(0.000000)\ngather4 r2.xyz, r0.zwzz, T0[0].xyzw, S0[0].w\ngather4_aoffimmi(-1,-1,0) r3.xyz, r0.zwzz, T0[0].zxwy, S0[0].w\nmax r2.w, r1.w, r2.x\nmin r3.w, r1.w, r2.x\nmax r2.w, r2.w, r2.z\nmin r3.w, r2.z, r3.w\nmax r4.x, r3.y, r3.x\nmin r4.y, r3.y, r3.x\nmax r2.w, r2.w, r4.x\nmin r3.w, r3.w, r4.y\nmul r4.x, r2.w, l(0.166000)\nadd r2.w, r2.w, -r3.w\nmax r3.w, r4.x, l(0.083300)\nlt r3.w, r2.w, r3.w\nif_z r3.w\nendif \nif_z r3.w\n  sample_l_aoffimmi(1,-1,0) r3.w, r0.zwzz, T0[0].xyzw, S0[0], l(0.000000)\n  sample_l_aoffimmi(-1,1,0) r4.x, r0.zwzz, T0[0].wxyz, S0[0], l(0.000000)\n  add r4.yz, r2.xxzx, r3.xxyx\n  div r2.w, l(1.000000, 1.000000, 1.000000, 1.000000), r2.w\n  add r4.w, r4.z, r4.y\n  mad r4.yz, r1.wwww, l(0.000000, -2.000000, -2.000000, 0.000000), r4.yyzy\n  add r5.x, r2.y, r3.w\n  add r3.w, r3.w, r3.z\n  mad r5.y, r2.z, l(-2.000000), r5.x\n  mad r3.w, r3.x, l(-2.000000), r3.w\n  add r3.z, r3.z, r4.x\n  add r2.y, r2.y, r4.x\n  mad r4.x, |r4.y|, l(2.000000), |r5.y|\n  mad r3.w, |r4.z|, l(2.000000), |r3.w|\n  mad r4.y, r3.y, l(-2.000000), r3.z\n  mad r2.y, r2.x, l(-2.000000), r2.y\n  add r4.x, r4.x, |r4.y|\n  add r2.y, r3.w, |r2.y|\n  add r3.z, r5.x, r3.z\n  ge r2.y, r4.x, r2.y\n  mad r3.z, r4.w, l(2.000000), r3.z\n  if_z r2.y\n    mov r3.x, r3.y\n    mov r2.x, r2.z\n  endif \n  if_nz r2.y\n    mov r2.z, CB0[0][0].w\n  else \n    mov r2.z, CB0[0][0].z\n  endif \n  mad r3.y, r3.z, l(0.083333), -r1.w\n  add r3.z, -r1.w, r3.x\n  add r3.w, -r1.w, r2.x\n  ge r4.x, |r3.z|, |r3.w|\n  max r3.z, |r3.w|, |r3.z|\n  if_nz r4.x\n    mov r2.z, -r2.z\n  endif \n  mul_sat r2.w, r2.w, |r3.y|\n  and r3.y, r2.y, CB0[0][0].z\n  movc r3.w, r2.y, l(0), CB0[0][0].w\n  if_z r2.y\n    mad r4.y, r2.z, l(0.500000), r0.z\n  else \n    mov r4.y, r0.z\n  endif \n  if_nz r2.y\n    mad r4.z, r2.z, l(0.500000), r0.w\n  else \n    mov r4.z, r0.w\n  endif \n  add r5.xy, -r3.ywyy, r4.yzyy\n  add r4.yw, r3.yyyw, r4.yyyz\n  mad r4.z, r2.w, l(-2.000000), l(3.000000)\n  sample_l r5.z, r5.xyxx, T0[0].xywz, S0[0], l(0.000000)\n  mul r2.w, r2.w, r2.w\n  sample_l r5.w, r4.ywyy, T0[0].xyzw, S0[0], l(0.000000)\n  if_z r4.x\n    add r3.x, r1.w, r2.x\n  else \n    add r3.x, r1.w, r3.x\n  endif \n  mul r2.x, r3.z, l(0.250000)\n  mad r3.z, -r3.x, l(0.500000), r1.w\n  mul r2.w, r2.w, r4.z\n  lt r3.z, r3.z, l(0.000000)\n  mad r6.x, -r3.x, l(0.500000), r5.z\n  mad r6.y, -r3.x, l(0.500000), r5.w\n  lt r4.xz, |r6.xxyx|, r2.xxxx\n  if_nz r4.x\n    mad r5.x, -r3.y, l(1.500000), r5.x\n    mad r5.y, -r3.w, l(1.500000), r5.y\n  endif \n  or r5.z, r4.z, r4.x\n  if_nz r4.z\n    mad r4.y, r3.y, l(1.500000), r4.y\n    mad r4.w, r3.w, l(1.500000), r4.w\n  endif \n  if_nz r5.z\n    if_nz r4.x\n      sample_l r6.x, r5.xyxx, T0[0].wxyz, S0[0], l(0.000000)\n    endif \n    if_nz r4.z\n      sample_l r6.y, r4.ywyy, T0[0].xwyz, S0[0], l(0.000000)\n    endif \n    if_nz r4.x\n      mad r6.x, -r3.x, l(0.500000), r6.x\n    endif \n    if_nz r4.z\n      mad r6.y, -r3.x, l(0.500000), r6.y\n    endif \n    lt r4.xz, |r6.xxyx|, r2.xxxx\n    if_nz r4.x\n      mad r5.x, -r3.y, l(2.000000), r5.x\n      mad r5.y, -r3.w, l(2.000000), r5.y\n    endif \n    or r5.z, r4.z, r4.x\n    if_nz r4.z\n      mad r4.y, r3.y, l(2.000000), r4.y\n      mad r4.w, r3.w, l(2.000000), r4.w\n    endif \n    if_nz r5.z\n      if_nz r4.x\n        sample_l r6.x, r5.xyxx, T0[0].wxyz, S0[0], l(0.000000)\n      endif \n      if_nz r4.z\n        sample_l r6.y, r4.ywyy, T0[0].xwyz, S0[0], l(0.000000)\n      endif \n      if_nz r4.x\n        mad r6.x, -r3.x, l(0.500000), r6.x\n      endif \n      if_nz r4.z\n        mad r6.y, -r3.x, l(0.500000), r6.y\n      endif \n      lt r4.xz, |r6.xxyx|, r2.xxxx\n      if_nz r4.x\n        mad r5.x, -r3.y, l(4.000000), r5.x\n        mad r5.y, -r3.w, l(4.000000), r5.y\n      endif \n      or r5.z, r4.z, r4.x\n      if_nz r4.z\n        mad r4.y, r3.y, l(4.000000), r4.y\n        mad r4.w, r3.w, l(4.000000), r4.w\n      endif \n      if_nz r5.z\n        if_nz r4.x\n          sample_l r6.x, r5.xyxx, T0[0].wxyz, S0[0], l(0.000000)\n        endif \n        if_nz r4.z\n          sample_l r6.y, r4.ywyy, T0[0].xwyz, S0[0], l(0.000000)\n        endif \n        if_nz r4.x\n          mad r6.x, -r3.x, l(0.500000), r6.x\n        endif \n        if_nz r4.z\n          mad r6.y, -r3.x, l(0.500000), r6.y\n        endif \n        lt r4.xz, |r6.xxyx|, r2.xxxx\n        if_nz r4.x\n          mad r5.x, -r3.y, l(12.000000), r5.x\n          mad r5.y, -r3.w, l(12.000000), r5.y\n        endif \n        if_nz r4.z\n          mad r4.y, r3.y, l(12.000000), r4.y\n          mad r4.w, r3.w, l(12.000000), r4.w\n        endif \n      endif \n    endif \n  endif \n  if_z r2.y\n    mad r2.x, r0.y, CB0[0][0].w, -r5.y\n    mad r0.x, -r0.y, CB0[0][0].w, r4.w\n  else \n    mad r2.x, r0.x, CB0[0][0].z, -r5.x\n    mad r0.x, -r0.x, CB0[0][0].z, r4.y\n  endif \n  lt r3.xy, r6.xyxx, l(0.000000, 0.000000, 0.000000, 0.000000)\n  add r0.y, r2.x, r0.x\n  ine r3.xy, r3.zzzz, r3.xyxx\n  div r0.y, l(1.000000, 1.000000, 1.000000, 1.000000), r0.y\n  lt r3.z, r2.x, r0.x\n  min r0.x, r0.x, r2.x\n  movc r2.x, r3.z, r3.x, r3.y\n  mul r2.w, r2.w, r2.w\n  mad r0.x, r0.x, -r0.y, l(0.500000)\n  mul r0.y, r2.w, l(0.750000)\n  and r0.x, r0.x, r2.x\n  max r0.x, r0.y, r0.x\n  if_z r2.y\n    mad r0.z, r0.x, r2.z, r0.z\n  endif \n  if_nz r2.y\n    mad r0.w, r0.x, r2.z, r0.w\n  endif \n  sample_l r1.xyz, r0.zwzz, T0[0].xyzw, S0[0], l(0.000000)\nendif \nmov r1.w, l(1.000000)\nstore_uav_typed U0[0].xyzw, vThreadID.xyyy, r1.xyzw\nret \n// Approximately 205 instruction slots used\n#endif\n\nconst BYTE fxaa_cs[] =\n{\n     68,  88,  66,  67, 166,  45, \n    113, 211, 255,  20,  36, 199, \n     11, 156, 236,  21,  81,  60, \n    246,  32,   1,   0,   0,   0, \n    184,  23,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n    108,   2,   0,   0, 124,   2, \n      0,   0, 140,   2,   0,   0, \n     28,  23,   0,   0,  82,  68, \n     69,  70,  48,   2,   0,   0, \n      1,   0,   0,   0,  44,   1, \n      0,   0,   4,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n      8,   2,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    220,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 244,   0, \n      0,   0,   2,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  12,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   3,   1,   0,   0, \n      4,   0,   0,   0,   1,   0, \n      0,   0,   4,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     12,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   1,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 120, 101, \n     95, 115,  97, 109, 112, 108, \n    101, 114,  95, 108, 105, 110, \n    101,  97, 114,  95,  99, 108, \n     97, 109, 112,   0, 120, 101, \n     95, 102, 120,  97,  97,  95, \n    115, 111, 117, 114,  99, 101, \n      0, 120, 101,  95, 102, 120, \n     97,  97,  95, 100, 101, 115, \n    116,   0,  88, 101,  65, 112, \n    112, 108, 121,  71,  97, 109, \n    109,  97,  82,  97, 109, 112, \n     67, 111, 110, 115, 116,  97, \n    110, 116, 115,   0, 171, 171, \n     16,   1,   0,   0,   2,   0, \n      0,   0,  68,   1,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    148,   1,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n      2,   0,   0,   0, 168,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 204,   1, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   2,   0, \n      0,   0, 228,   1,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 102, \n    120,  97,  97,  95, 115, 105, \n    122, 101,   0, 117, 105, 110, \n    116,  50,   0, 171,   1,   0, \n     19,   0,   1,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    161,   1,   0,   0, 120, 101, \n     95, 102, 120,  97,  97,  95, \n    115, 105, 122, 101,  95, 105, \n    110, 118,   0, 102, 108, 111, \n     97, 116,  50,   0,   1,   0, \n      3,   0,   1,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    221,   1,   0,   0,  77, 105, \n     99, 114, 111, 115, 111, 102, \n    116,  32,  40,  82,  41,  32, \n     72,  76,  83,  76,  32,  83, \n    104,  97, 100, 101, 114,  32, \n     67, 111, 109, 112, 105, 108, \n    101, 114,  32,  49,  48,  46, \n     49,   0,  73,  83,  71,  78, \n      8,   0,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     79,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  83,  72, \n     69,  88, 136,  20,   0,   0, \n     81,   0,   5,   0,  34,   5, \n      0,   0, 106,   8,   0,   1, \n     89,   0,   0,   7,  70, 142, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  90,   0, \n      0,   6,  70, 110,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  88,  24, \n      0,   7,  70, 126,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     85,  85,   0,   0,   0,   0, \n      0,   0, 156,  24,   0,   7, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  17,  17, \n      0,   0,   0,   0,   0,   0, \n     95,   0,   0,   2,  50,   0, \n      2,   0, 104,   0,   0,   2, \n      7,   0,   0,   0, 155,   0, \n      0,   4,  16,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,   0,  80,   0,   0,   8, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,   2,   0, \n     70, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  60,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  62,   0,   0,   1, \n     21,   0,   0,   1,  86,   0, \n      0,   4,  50,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n      2,   0,   0,   0,   0,  10, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     56,   0,   0,   9, 194,   0, \n     16,   0,   0,   0,   0,   0, \n      6,   4,  16,   0,   0,   0, \n      0,   0, 166, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   0,   0,  13, 242,   0, \n     16,   0,   1,   0,   0,   0, \n    230,  10,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,  96,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 109,   0, \n      0,  11, 114,   0,  16,   0, \n      2,   0,   0,   0, 230,  10, \n     16,   0,   0,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     58,  96,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    109,   0,   0, 140,   1, 254, \n      1,   0, 114,   0,  16,   0, \n      3,   0,   0,   0, 230,  10, \n     16,   0,   0,   0,   0,   0, \n     38, 119,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     58,  96,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     52,   0,   0,   7, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  51,   0, \n      0,   7, 130,   0,  16,   0, \n      3,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  52,   0,   0,   7, \n    130,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     51,   0,   0,   7, 130,   0, \n     16,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,  52,   0, \n      0,   7,  18,   0,  16,   0, \n      4,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   3,   0, \n      0,   0,  51,   0,   0,   7, \n     34,   0,  16,   0,   4,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,  10,   0, \n     16,   0,   3,   0,   0,   0, \n     52,   0,   0,   7, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      4,   0,   0,   0,  51,   0, \n      0,   7, 130,   0,  16,   0, \n      3,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0,  56,   0,   0,   7, \n     18,   0,  16,   0,   4,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0, 231, 251,  41,  62, \n      0,   0,   0,   8, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16, 128, \n     65,   0,   0,   0,   3,   0, \n      0,   0,  52,   0,   0,   7, \n    130,   0,  16,   0,   3,   0, \n      0,   0,  10,   0,  16,   0, \n      4,   0,   0,   0,   1,  64, \n      0,   0,  49, 153, 170,  61, \n     49,   0,   0,   7, 130,   0, \n     16,   0,   3,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,  31,   0, \n      0,   3,  58,   0,  16,   0, \n      3,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   0,   3, \n     58,   0,  16,   0,   3,   0, \n      0,   0,  72,   0,   0, 142, \n      1, 226,   1,   0, 130,   0, \n     16,   0,   3,   0,   0,   0, \n    230,  10,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,  96,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  72,   0, \n      0, 142,   1,  62,   0,   0, \n     18,   0,  16,   0,   4,   0, \n      0,   0, 230,  10,  16,   0, \n      0,   0,   0,   0,  54, 121, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,  96, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   7,  98,   0, \n     16,   0,   4,   0,   0,   0, \n      6,   2,  16,   0,   2,   0, \n      0,   0,   6,   1,  16,   0, \n      3,   0,   0,   0,  14,   0, \n      0,  10, 130,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128,  63, \n      0,   0, 128,  63,   0,   0, \n    128,  63,   0,   0, 128,  63, \n     58,   0,  16,   0,   2,   0, \n      0,   0,   0,   0,   0,   7, \n    130,   0,  16,   0,   4,   0, \n      0,   0,  42,   0,  16,   0, \n      4,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n     50,   0,   0,  12,  98,   0, \n     16,   0,   4,   0,   0,   0, \n    246,  15,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0, 192,   0,   0,   0, 192, \n      0,   0,   0,   0,  86,   6, \n     16,   0,   4,   0,   0,   0, \n      0,   0,   0,   7,  18,   0, \n     16,   0,   5,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   7, 130,   0,  16,   0, \n      3,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0,  50,   0,   0,   9, \n     34,   0,  16,   0,   5,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0, 192, \n     10,   0,  16,   0,   5,   0, \n      0,   0,  50,   0,   0,   9, \n    130,   0,  16,   0,   3,   0, \n      0,   0,  10,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0, 192, \n     58,   0,  16,   0,   3,   0, \n      0,   0,   0,   0,   0,   7, \n     66,   0,  16,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n      0,   0,   0,   7,  34,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      4,   0,   0,   0,  50,   0, \n      0,  11,  18,   0,  16,   0, \n      4,   0,   0,   0,  26,   0, \n     16, 128, 129,   0,   0,   0, \n      4,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,  64, \n     26,   0,  16, 128, 129,   0, \n      0,   0,   5,   0,   0,   0, \n     50,   0,   0,  11, 130,   0, \n     16,   0,   3,   0,   0,   0, \n     42,   0,  16, 128, 129,   0, \n      0,   0,   4,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  64,  58,   0,  16, 128, \n    129,   0,   0,   0,   3,   0, \n      0,   0,  50,   0,   0,   9, \n     34,   0,  16,   0,   4,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0, 192, \n     42,   0,  16,   0,   3,   0, \n      0,   0,  50,   0,   0,   9, \n     34,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0, 192, \n     26,   0,  16,   0,   2,   0, \n      0,   0,   0,   0,   0,   8, \n     18,   0,  16,   0,   4,   0, \n      0,   0,  10,   0,  16,   0, \n      4,   0,   0,   0,  26,   0, \n     16, 128, 129,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   8,  34,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n     26,   0,  16, 128, 129,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   7,  66,   0, \n     16,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   5,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0,  29,   0, \n      0,   7,  34,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  50,   0,   0,   9, \n     66,   0,  16,   0,   3,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,  64, \n     42,   0,  16,   0,   3,   0, \n      0,   0,  31,   0,   0,   3, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      2,   0,   0,   0,  54,   0, \n      0,   7,  66,   0,  16,   0, \n      2,   0,   0,   0,  58, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  18,   0,   0,   1, \n     54,   0,   0,   7,  66,   0, \n     16,   0,   2,   0,   0,   0, \n     42, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  50,   0,   0,  10, \n     34,   0,  16,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0, 171, 170, 170,  61, \n     58,   0,  16, 128,  65,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   8,  66,   0, \n     16,   0,   3,   0,   0,   0, \n     58,   0,  16, 128,  65,   0, \n      0,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   3,   0, \n      0,   0,   0,   0,   0,   8, \n    130,   0,  16,   0,   3,   0, \n      0,   0,  58,   0,  16, 128, \n     65,   0,   0,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  29,   0, \n      0,   9,  18,   0,  16,   0, \n      4,   0,   0,   0,  42,   0, \n     16, 128, 129,   0,   0,   0, \n      3,   0,   0,   0,  58,   0, \n     16, 128, 129,   0,   0,   0, \n      3,   0,   0,   0,  52,   0, \n      0,   9,  66,   0,  16,   0, \n      3,   0,   0,   0,  58,   0, \n     16, 128, 129,   0,   0,   0, \n      3,   0,   0,   0,  42,   0, \n     16, 128, 129,   0,   0,   0, \n      3,   0,   0,   0,  31,   0, \n      4,   3,  10,   0,  16,   0, \n      4,   0,   0,   0,  54,   0, \n      0,   6,  66,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16, 128,  65,   0,   0,   0, \n      2,   0,   0,   0,  21,   0, \n      0,   1,  56,  32,   0,   8, \n    130,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16, 128, 129,   0,   0,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   9,  34,   0,  16,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     42, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,  11, 130,   0,  16,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  58, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     31,   0,   0,   3,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     50,   0,   0,   9,  34,   0, \n     16,   0,   4,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,  63,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     18,   0,   0,   1,  54,   0, \n      0,   5,  34,   0,  16,   0, \n      4,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      2,   0,   0,   0,  50,   0, \n      0,   9,  66,   0,  16,   0, \n      4,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  63,  58,   0,  16,   0, \n      0,   0,   0,   0,  18,   0, \n      0,   1,  54,   0,   0,   5, \n     66,   0,  16,   0,   4,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,   0,   0,   0,   8, \n     50,   0,  16,   0,   5,   0, \n      0,   0, 214,   5,  16, 128, \n     65,   0,   0,   0,   3,   0, \n      0,   0, 150,   5,  16,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   7, 162,   0,  16,   0, \n      4,   0,   0,   0,  86,  13, \n     16,   0,   3,   0,   0,   0, \n     86,   9,  16,   0,   4,   0, \n      0,   0,  50,   0,   0,   9, \n     66,   0,  16,   0,   4,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0, 192, \n      1,  64,   0,   0,   0,   0, \n     64,  64,  72,   0,   0,  13, \n     66,   0,  16,   0,   5,   0, \n      0,   0,  70,   0,  16,   0, \n      5,   0,   0,   0,  70, 123, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,  96, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     56,   0,   0,   7, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,  72,   0, \n      0,  13, 130,   0,  16,   0, \n      5,   0,   0,   0, 214,   5, \n     16,   0,   4,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,  96,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  31,   0,   0,   3, \n     10,   0,  16,   0,   4,   0, \n      0,   0,   0,   0,   0,   7, \n     18,   0,  16,   0,   3,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     18,   0,   0,   1,   0,   0, \n      0,   7,  18,   0,  16,   0, \n      3,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   3,   0, \n      0,   0,  21,   0,   0,   1, \n     56,   0,   0,   7,  18,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0, 128,  62,  50,   0, \n      0,  10,  66,   0,  16,   0, \n      3,   0,   0,   0,  10,   0, \n     16, 128,  65,   0,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,  63, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  56,   0,   0,   7, \n    130,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   4,   0,   0,   0, \n     49,   0,   0,   7,  66,   0, \n     16,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  50,   0, \n      0,  10,  18,   0,  16,   0, \n      6,   0,   0,   0,  10,   0, \n     16, 128,  65,   0,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,  63, \n     42,   0,  16,   0,   5,   0, \n      0,   0,  50,   0,   0,  10, \n     34,   0,  16,   0,   6,   0, \n      0,   0,  10,   0,  16, 128, \n     65,   0,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,  63,  58,   0, \n     16,   0,   5,   0,   0,   0, \n     49,   0,   0,   8,  82,   0, \n     16,   0,   4,   0,   0,   0, \n      6,   1,  16, 128, 129,   0, \n      0,   0,   6,   0,   0,   0, \n      6,   0,  16,   0,   2,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   4,   0, \n      0,   0,  50,   0,   0,  10, \n     18,   0,  16,   0,   5,   0, \n      0,   0,  26,   0,  16, 128, \n     65,   0,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0, 192,  63,  10,   0, \n     16,   0,   5,   0,   0,   0, \n     50,   0,   0,  10,  34,   0, \n     16,   0,   5,   0,   0,   0, \n     58,   0,  16, 128,  65,   0, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n    192,  63,  26,   0,  16,   0, \n      5,   0,   0,   0,  21,   0, \n      0,   1,  60,   0,   0,   7, \n     66,   0,  16,   0,   5,   0, \n      0,   0,  42,   0,  16,   0, \n      4,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   4,   0,   0,   0, \n     50,   0,   0,   9,  34,   0, \n     16,   0,   4,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0, 192,  63,  26,   0, \n     16,   0,   4,   0,   0,   0, \n     50,   0,   0,   9, 130,   0, \n     16,   0,   4,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0, 192,  63,  58,   0, \n     16,   0,   4,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      5,   0,   0,   0,  31,   0, \n      4,   3,  10,   0,  16,   0, \n      4,   0,   0,   0,  72,   0, \n      0,  13,  18,   0,  16,   0, \n      6,   0,   0,   0,  70,   0, \n     16,   0,   5,   0,   0,   0, \n     54, 121,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,  96,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   4,   0,   0,   0, \n     72,   0,   0,  13,  34,   0, \n     16,   0,   6,   0,   0,   0, \n    214,   5,  16,   0,   4,   0, \n      0,   0, 198, 121,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,  96,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     10,   0,  16,   0,   4,   0, \n      0,   0,  50,   0,   0,  10, \n     18,   0,  16,   0,   6,   0, \n      0,   0,  10,   0,  16, 128, \n     65,   0,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,  63,  10,   0, \n     16,   0,   6,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      4,   0,   0,   0,  50,   0, \n      0,  10,  34,   0,  16,   0, \n      6,   0,   0,   0,  10,   0, \n     16, 128,  65,   0,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,  63, \n     26,   0,  16,   0,   6,   0, \n      0,   0,  21,   0,   0,   1, \n     49,   0,   0,   8,  82,   0, \n     16,   0,   4,   0,   0,   0, \n      6,   1,  16, 128, 129,   0, \n      0,   0,   6,   0,   0,   0, \n      6,   0,  16,   0,   2,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   4,   0, \n      0,   0,  50,   0,   0,  10, \n     18,   0,  16,   0,   5,   0, \n      0,   0,  26,   0,  16, 128, \n     65,   0,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,  64,  10,   0, \n     16,   0,   5,   0,   0,   0, \n     50,   0,   0,  10,  34,   0, \n     16,   0,   5,   0,   0,   0, \n     58,   0,  16, 128,  65,   0, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  64,  26,   0,  16,   0, \n      5,   0,   0,   0,  21,   0, \n      0,   1,  60,   0,   0,   7, \n     66,   0,  16,   0,   5,   0, \n      0,   0,  42,   0,  16,   0, \n      4,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   4,   0,   0,   0, \n     50,   0,   0,   9,  34,   0, \n     16,   0,   4,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,  64,  26,   0, \n     16,   0,   4,   0,   0,   0, \n     50,   0,   0,   9, 130,   0, \n     16,   0,   4,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,  64,  58,   0, \n     16,   0,   4,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      5,   0,   0,   0,  31,   0, \n      4,   3,  10,   0,  16,   0, \n      4,   0,   0,   0,  72,   0, \n      0,  13,  18,   0,  16,   0, \n      6,   0,   0,   0,  70,   0, \n     16,   0,   5,   0,   0,   0, \n     54, 121,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,  96,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   4,   0,   0,   0, \n     72,   0,   0,  13,  34,   0, \n     16,   0,   6,   0,   0,   0, \n    214,   5,  16,   0,   4,   0, \n      0,   0, 198, 121,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,  96,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     10,   0,  16,   0,   4,   0, \n      0,   0,  50,   0,   0,  10, \n     18,   0,  16,   0,   6,   0, \n      0,   0,  10,   0,  16, 128, \n     65,   0,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,  63,  10,   0, \n     16,   0,   6,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      4,   0,   0,   0,  50,   0, \n      0,  10,  34,   0,  16,   0, \n      6,   0,   0,   0,  10,   0, \n     16, 128,  65,   0,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,  63, \n     26,   0,  16,   0,   6,   0, \n      0,   0,  21,   0,   0,   1, \n     49,   0,   0,   8,  82,   0, \n     16,   0,   4,   0,   0,   0, \n      6,   1,  16, 128, 129,   0, \n      0,   0,   6,   0,   0,   0, \n      6,   0,  16,   0,   2,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   4,   0, \n      0,   0,  50,   0,   0,  10, \n     18,   0,  16,   0,   5,   0, \n      0,   0,  26,   0,  16, 128, \n     65,   0,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0, 128,  64,  10,   0, \n     16,   0,   5,   0,   0,   0, \n     50,   0,   0,  10,  34,   0, \n     16,   0,   5,   0,   0,   0, \n     58,   0,  16, 128,  65,   0, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n    128,  64,  26,   0,  16,   0, \n      5,   0,   0,   0,  21,   0, \n      0,   1,  60,   0,   0,   7, \n     66,   0,  16,   0,   5,   0, \n      0,   0,  42,   0,  16,   0, \n      4,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   4,   0,   0,   0, \n     50,   0,   0,   9,  34,   0, \n     16,   0,   4,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0, 128,  64,  26,   0, \n     16,   0,   4,   0,   0,   0, \n     50,   0,   0,   9, 130,   0, \n     16,   0,   4,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0, 128,  64,  58,   0, \n     16,   0,   4,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      5,   0,   0,   0,  31,   0, \n      4,   3,  10,   0,  16,   0, \n      4,   0,   0,   0,  72,   0, \n      0,  13,  18,   0,  16,   0, \n      6,   0,   0,   0,  70,   0, \n     16,   0,   5,   0,   0,   0, \n     54, 121,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,  96,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   4,   0,   0,   0, \n     72,   0,   0,  13,  34,   0, \n     16,   0,   6,   0,   0,   0, \n    214,   5,  16,   0,   4,   0, \n      0,   0, 198, 121,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,  96,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     10,   0,  16,   0,   4,   0, \n      0,   0,  50,   0,   0,  10, \n     18,   0,  16,   0,   6,   0, \n      0,   0,  10,   0,  16, 128, \n     65,   0,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,  63,  10,   0, \n     16,   0,   6,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      4,   0,   0,   0,  50,   0, \n      0,  10,  34,   0,  16,   0, \n      6,   0,   0,   0,  10,   0, \n     16, 128,  65,   0,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,  63, \n     26,   0,  16,   0,   6,   0, \n      0,   0,  21,   0,   0,   1, \n     49,   0,   0,   8,  82,   0, \n     16,   0,   4,   0,   0,   0, \n      6,   1,  16, 128, 129,   0, \n      0,   0,   6,   0,   0,   0, \n      6,   0,  16,   0,   2,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   4,   0, \n      0,   0,  50,   0,   0,  10, \n     18,   0,  16,   0,   5,   0, \n      0,   0,  26,   0,  16, 128, \n     65,   0,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,  64,  65,  10,   0, \n     16,   0,   5,   0,   0,   0, \n     50,   0,   0,  10,  34,   0, \n     16,   0,   5,   0,   0,   0, \n     58,   0,  16, 128,  65,   0, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n     64,  65,  26,   0,  16,   0, \n      5,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     42,   0,  16,   0,   4,   0, \n      0,   0,  50,   0,   0,   9, \n     34,   0,  16,   0,   4,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,  64,  65, \n     26,   0,  16,   0,   4,   0, \n      0,   0,  50,   0,   0,   9, \n    130,   0,  16,   0,   4,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,  64,  65, \n     58,   0,  16,   0,   4,   0, \n      0,   0,  21,   0,   0,   1, \n     21,   0,   0,   1,  21,   0, \n      0,   1,  21,   0,   0,   1, \n     31,   0,   0,   3,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     50,   0,   0,  12,  18,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  58, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     26,   0,  16, 128,  65,   0, \n      0,   0,   5,   0,   0,   0, \n     50,   0,   0,  12,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16, 128,  65,   0, \n      0,   0,   0,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   4,   0,   0,   0, \n     18,   0,   0,   1,  50,   0, \n      0,  12,  18,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     42, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  10,   0, \n     16, 128,  65,   0,   0,   0, \n      5,   0,   0,   0,  50,   0, \n      0,  12,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16, 128,  65,   0,   0,   0, \n      0,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      4,   0,   0,   0,  21,   0, \n      0,   1,  49,   0,   0,  10, \n     50,   0,  16,   0,   3,   0, \n      0,   0,  70,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  39,   0, \n      0,   7,  50,   0,  16,   0, \n      3,   0,   0,   0, 166,  10, \n     16,   0,   3,   0,   0,   0, \n     70,   0,  16,   0,   3,   0, \n      0,   0,  14,   0,   0,  10, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128,  63,   0,   0, \n    128,  63,   0,   0, 128,  63, \n      0,   0, 128,  63,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     49,   0,   0,   7,  66,   0, \n     16,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  51,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  55,   0,   0,   9, \n     18,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0,  10,   0, \n     16,   0,   3,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,  56,   0,   0,   7, \n    130,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n     50,   0,   0,  10,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16, 128, \n     65,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,  63,  56,   0, \n      0,   7,  34,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n     64,  63,   1,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     52,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  31,   0, \n      0,   3,  26,   0,  16,   0, \n      2,   0,   0,   0,  50,   0, \n      0,   9,  66,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  50,   0,   0,   9, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     72,   0,   0,  13, 114,   0, \n     16,   0,   1,   0,   0,   0, \n    230,  10,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,  96,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  54,   0,   0,   5, \n    130,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0, 128,  63, 164,   0, \n      0,   7, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,   5,   2,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  62,   0,   0,   1, \n     83,  84,  65,  84, 148,   0, \n      0,   0, 205,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     94,   0,   0,   0,   1,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,  35,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  12,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/fxaa_extreme_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer XeApplyGammaRampConstants\n// {\n//\n//   uint2 xe_fxaa_size;                // Offset:    0 Size:     8\n//   float2 xe_fxaa_size_inv;           // Offset:    8 Size:     8\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_sampler_linear_clamp           sampler      NA          NA      S0             s0      1 \n// xe_fxaa_source                    texture  float4          2d      T0             t0      1 \n// xe_fxaa_dest                          UAV  unorm4          2d      U0             u0      1 \n// XeApplyGammaRampConstants         cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][1], immediateIndexed, space=0\ndcl_sampler S0[0:0], mode_default, space=0\ndcl_resource_texture2d (float,float,float,float) T0[0:0], space=0\ndcl_uav_typed_texture2d (unorm,unorm,unorm,unorm) U0[0:0], space=0\ndcl_input vThreadID.xy\ndcl_temps 7\ndcl_thread_group 16, 8, 1\nuge r0.xy, vThreadID.xyxx, CB0[0][0].xyxx\nor r0.x, r0.y, r0.x\nif_nz r0.x\n  ret \nendif \nutof r0.xy, vThreadID.xyxx\nadd r0.xy, r0.xyxx, l(0.500000, 0.500000, 0.000000, 0.000000)\nmul r0.zw, r0.xxxy, CB0[0][0].zzzw\nsample_l r1.xyzw, r0.zwzz, T0[0].xyzw, S0[0], l(0.000000)\ngather4 r2.xyz, r0.zwzz, T0[0].xyzw, S0[0].w\ngather4_aoffimmi(-1,-1,0) r3.xyz, r0.zwzz, T0[0].zxwy, S0[0].w\nmax r2.w, r1.w, r2.x\nmin r3.w, r1.w, r2.x\nmax r2.w, r2.w, r2.z\nmin r3.w, r2.z, r3.w\nmax r4.x, r3.y, r3.x\nmin r4.y, r3.y, r3.x\nmax r2.w, r2.w, r4.x\nmin r3.w, r3.w, r4.y\nmul r4.x, r2.w, l(0.063000)\nadd r2.w, r2.w, -r3.w\nmax r3.w, r4.x, l(0.031200)\nlt r3.w, r2.w, r3.w\nif_z r3.w\nendif \nif_z r3.w\n  sample_l_aoffimmi(1,-1,0) r3.w, r0.zwzz, T0[0].xyzw, S0[0], l(0.000000)\n  sample_l_aoffimmi(-1,1,0) r4.x, r0.zwzz, T0[0].wxyz, S0[0], l(0.000000)\n  add r4.yz, r2.xxzx, r3.xxyx\n  div r2.w, l(1.000000, 1.000000, 1.000000, 1.000000), r2.w\n  add r4.w, r4.z, r4.y\n  mad r4.yz, r1.wwww, l(0.000000, -2.000000, -2.000000, 0.000000), r4.yyzy\n  add r5.x, r2.y, r3.w\n  add r3.w, r3.w, r3.z\n  mad r5.y, r2.z, l(-2.000000), r5.x\n  mad r3.w, r3.x, l(-2.000000), r3.w\n  add r3.z, r3.z, r4.x\n  add r2.y, r2.y, r4.x\n  mad r4.x, |r4.y|, l(2.000000), |r5.y|\n  mad r3.w, |r4.z|, l(2.000000), |r3.w|\n  mad r4.y, r3.y, l(-2.000000), r3.z\n  mad r2.y, r2.x, l(-2.000000), r2.y\n  add r4.x, r4.x, |r4.y|\n  add r2.y, r3.w, |r2.y|\n  add r3.z, r5.x, r3.z\n  ge r2.y, r4.x, r2.y\n  mad r3.z, r4.w, l(2.000000), r3.z\n  if_z r2.y\n    mov r3.x, r3.y\n    mov r2.x, r2.z\n  endif \n  if_nz r2.y\n    mov r2.z, CB0[0][0].w\n  else \n    mov r2.z, CB0[0][0].z\n  endif \n  mad r3.y, r3.z, l(0.083333), -r1.w\n  add r3.z, -r1.w, r3.x\n  add r3.w, -r1.w, r2.x\n  ge r4.x, |r3.z|, |r3.w|\n  max r3.z, |r3.w|, |r3.z|\n  if_nz r4.x\n    mov r2.z, -r2.z\n  endif \n  mul_sat r2.w, r2.w, |r3.y|\n  and r3.y, r2.y, CB0[0][0].z\n  movc r3.w, r2.y, l(0), CB0[0][0].w\n  if_z r2.y\n    mad r4.y, r2.z, l(0.500000), r0.z\n  else \n    mov r4.y, r0.z\n  endif \n  if_nz r2.y\n    mad r4.z, r2.z, l(0.500000), r0.w\n  else \n    mov r4.z, r0.w\n  endif \n  add r5.xy, -r3.ywyy, r4.yzyy\n  add r4.yw, r3.yyyw, r4.yyyz\n  mad r4.z, r2.w, l(-2.000000), l(3.000000)\n  sample_l r5.z, r5.xyxx, T0[0].xywz, S0[0], l(0.000000)\n  mul r2.w, r2.w, r2.w\n  sample_l r5.w, r4.ywyy, T0[0].xyzw, S0[0], l(0.000000)\n  if_z r4.x\n    add r3.x, r1.w, r2.x\n  else \n    add r3.x, r1.w, r3.x\n  endif \n  mul r2.x, r3.z, l(0.250000)\n  mad r3.z, -r3.x, l(0.500000), r1.w\n  mul r2.w, r2.w, r4.z\n  lt r3.z, r3.z, l(0.000000)\n  mad r6.x, -r3.x, l(0.500000), r5.z\n  mad r6.y, -r3.x, l(0.500000), r5.w\n  lt r4.xz, |r6.xxyx|, r2.xxxx\n  if_nz r4.x\n    add r5.xy, -r3.ywyy, r5.xyxx\n  endif \n  or r5.z, r4.z, r4.x\n  if_nz r4.z\n    add r4.yw, r3.yyyw, r4.yyyw\n  endif \n  if_nz r5.z\n    if_nz r4.x\n      sample_l r6.x, r5.xyxx, T0[0].wxyz, S0[0], l(0.000000)\n    endif \n    if_nz r4.z\n      sample_l r6.y, r4.ywyy, T0[0].xwyz, S0[0], l(0.000000)\n    endif \n    if_nz r4.x\n      mad r6.x, -r3.x, l(0.500000), r6.x\n    endif \n    if_nz r4.z\n      mad r6.y, -r3.x, l(0.500000), r6.y\n    endif \n    lt r4.xz, |r6.xxyx|, r2.xxxx\n    if_nz r4.x\n      add r5.xy, -r3.ywyy, r5.xyxx\n    endif \n    or r5.z, r4.z, r4.x\n    if_nz r4.z\n      add r4.yw, r3.yyyw, r4.yyyw\n    endif \n    if_nz r5.z\n      if_nz r4.x\n        sample_l r6.x, r5.xyxx, T0[0].wxyz, S0[0], l(0.000000)\n      endif \n      if_nz r4.z\n        sample_l r6.y, r4.ywyy, T0[0].xwyz, S0[0], l(0.000000)\n      endif \n      if_nz r4.x\n        mad r6.x, -r3.x, l(0.500000), r6.x\n      endif \n      if_nz r4.z\n        mad r6.y, -r3.x, l(0.500000), r6.y\n      endif \n      lt r4.xz, |r6.xxyx|, r2.xxxx\n      if_nz r4.x\n        add r5.xy, -r3.ywyy, r5.xyxx\n      endif \n      or r5.z, r4.z, r4.x\n      if_nz r4.z\n        add r4.yw, r3.yyyw, r4.yyyw\n      endif \n      if_nz r5.z\n        if_nz r4.x\n          sample_l r6.x, r5.xyxx, T0[0].wxyz, S0[0], l(0.000000)\n        endif \n        if_nz r4.z\n          sample_l r6.y, r4.ywyy, T0[0].xwyz, S0[0], l(0.000000)\n        endif \n        if_nz r4.x\n          mad r6.x, -r3.x, l(0.500000), r6.x\n        endif \n        if_nz r4.z\n          mad r6.y, -r3.x, l(0.500000), r6.y\n        endif \n        lt r4.xz, |r6.xxyx|, r2.xxxx\n        if_nz r4.x\n          add r5.xy, -r3.ywyy, r5.xyxx\n        endif \n        or r5.z, r4.z, r4.x\n        if_nz r4.z\n          add r4.yw, r3.yyyw, r4.yyyw\n        endif \n        if_nz r5.z\n          if_nz r4.x\n            sample_l r6.x, r5.xyxx, T0[0].wxyz, S0[0], l(0.000000)\n          endif \n          if_nz r4.z\n            sample_l r6.y, r4.ywyy, T0[0].xwyz, S0[0], l(0.000000)\n          endif \n          if_nz r4.x\n            mad r6.x, -r3.x, l(0.500000), r6.x\n          endif \n          if_nz r4.z\n            mad r6.y, -r3.x, l(0.500000), r6.y\n          endif \n          lt r4.xz, |r6.xxyx|, r2.xxxx\n          if_nz r4.x\n            mad r5.x, -r3.y, l(1.500000), r5.x\n            mad r5.y, -r3.w, l(1.500000), r5.y\n          endif \n          or r5.z, r4.z, r4.x\n          if_nz r4.z\n            mad r4.y, r3.y, l(1.500000), r4.y\n            mad r4.w, r3.w, l(1.500000), r4.w\n          endif \n          if_nz r5.z\n            if_nz r4.x\n              sample_l r6.x, r5.xyxx, T0[0].wxyz, S0[0], l(0.000000)\n            endif \n            if_nz r4.z\n              sample_l r6.y, r4.ywyy, T0[0].xwyz, S0[0], l(0.000000)\n            endif \n            if_nz r4.x\n              mad r6.x, -r3.x, l(0.500000), r6.x\n            endif \n            if_nz r4.z\n              mad r6.y, -r3.x, l(0.500000), r6.y\n            endif \n            lt r4.xz, |r6.xxyx|, r2.xxxx\n            if_nz r4.x\n              mad r5.x, -r3.y, l(2.000000), r5.x\n              mad r5.y, -r3.w, l(2.000000), r5.y\n            endif \n            or r5.z, r4.z, r4.x\n            if_nz r4.z\n              mad r4.y, r3.y, l(2.000000), r4.y\n              mad r4.w, r3.w, l(2.000000), r4.w\n            endif \n            if_nz r5.z\n              if_nz r4.x\n                sample_l r6.x, r5.xyxx, T0[0].wxyz, S0[0], l(0.000000)\n              endif \n              if_nz r4.z\n                sample_l r6.y, r4.ywyy, T0[0].xwyz, S0[0], l(0.000000)\n              endif \n              if_nz r4.x\n                mad r6.x, -r3.x, l(0.500000), r6.x\n              endif \n              if_nz r4.z\n                mad r6.y, -r3.x, l(0.500000), r6.y\n              endif \n              lt r4.xz, |r6.xxyx|, r2.xxxx\n              if_nz r4.x\n                mad r5.x, -r3.y, l(2.000000), r5.x\n                mad r5.y, -r3.w, l(2.000000), r5.y\n              endif \n              or r5.z, r4.z, r4.x\n              if_nz r4.z\n                mad r4.y, r3.y, l(2.000000), r4.y\n                mad r4.w, r3.w, l(2.000000), r4.w\n              endif \n              if_nz r5.z\n                if_nz r4.x\n                  sample_l r6.x, r5.xyxx, T0[0].wxyz, S0[0], l(0.000000)\n                endif \n                if_nz r4.z\n                  sample_l r6.y, r4.ywyy, T0[0].xwyz, S0[0], l(0.000000)\n                endif \n                if_nz r4.x\n                  mad r6.x, -r3.x, l(0.500000), r6.x\n                endif \n                if_nz r4.z\n                  mad r6.y, -r3.x, l(0.500000), r6.y\n                endif \n                lt r4.xz, |r6.xxyx|, r2.xxxx\n                if_nz r4.x\n                  mad r5.x, -r3.y, l(2.000000), r5.x\n                  mad r5.y, -r3.w, l(2.000000), r5.y\n                endif \n                or r5.z, r4.z, r4.x\n                if_nz r4.z\n                  mad r4.y, r3.y, l(2.000000), r4.y\n                  mad r4.w, r3.w, l(2.000000), r4.w\n                endif \n                if_nz r5.z\n                  if_nz r4.x\n                    sample_l r6.x, r5.xyxx, T0[0].wxyz, S0[0], l(0.000000)\n                  endif \n                  if_nz r4.z\n                    sample_l r6.y, r4.ywyy, T0[0].xwyz, S0[0], l(0.000000)\n                  endif \n                  if_nz r4.x\n                    mad r6.x, -r3.x, l(0.500000), r6.x\n                  endif \n                  if_nz r4.z\n                    mad r6.y, -r3.x, l(0.500000), r6.y\n                  endif \n                  lt r4.xz, |r6.xxyx|, r2.xxxx\n                  if_nz r4.x\n                    mad r5.x, -r3.y, l(2.000000), r5.x\n                    mad r5.y, -r3.w, l(2.000000), r5.y\n                  endif \n                  or r5.z, r4.z, r4.x\n                  if_nz r4.z\n                    mad r4.y, r3.y, l(2.000000), r4.y\n                    mad r4.w, r3.w, l(2.000000), r4.w\n                  endif \n                  if_nz r5.z\n                    if_nz r4.x\n                      sample_l r6.x, r5.xyxx, T0[0].wxyz, S0[0], l(0.000000)\n                    endif \n                    if_nz r4.z\n                      sample_l r6.y, r4.ywyy, T0[0].xwyz, S0[0], l(0.000000)\n                    endif \n                    if_nz r4.x\n                      mad r6.x, -r3.x, l(0.500000), r6.x\n                    endif \n                    if_nz r4.z\n                      mad r6.y, -r3.x, l(0.500000), r6.y\n                    endif \n                    lt r4.xz, |r6.xxyx|, r2.xxxx\n                    if_nz r4.x\n                      mad r5.x, -r3.y, l(4.000000), r5.x\n                      mad r5.y, -r3.w, l(4.000000), r5.y\n                    endif \n                    or r5.z, r4.z, r4.x\n                    if_nz r4.z\n                      mad r4.y, r3.y, l(4.000000), r4.y\n                      mad r4.w, r3.w, l(4.000000), r4.w\n                    endif \n                    if_nz r5.z\n                      if_nz r4.x\n                        sample_l r6.x, r5.xyxx, T0[0].wxyz, S0[0], l(0.000000)\n                      endif \n                      if_nz r4.z\n                        sample_l r6.y, r4.ywyy, T0[0].xwyz, S0[0], l(0.000000)\n                      endif \n                      if_nz r4.x\n                        mad r6.x, -r3.x, l(0.500000), r6.x\n                      endif \n                      if_nz r4.z\n                        mad r6.y, -r3.x, l(0.500000), r6.y\n                      endif \n                      lt r4.xz, |r6.xxyx|, r2.xxxx\n                      if_nz r4.x\n                        mad r5.x, -r3.y, l(8.000000), r5.x\n                        mad r5.y, -r3.w, l(8.000000), r5.y\n                      endif \n                      if_nz r4.z\n                        mad r4.y, r3.y, l(8.000000), r4.y\n                        mad r4.w, r3.w, l(8.000000), r4.w\n                      endif \n                    endif \n                  endif \n                endif \n              endif \n            endif \n          endif \n        endif \n      endif \n    endif \n  endif \n  if_z r2.y\n    mad r2.x, r0.y, CB0[0][0].w, -r5.y\n    mad r0.x, -r0.y, CB0[0][0].w, r4.w\n  else \n    mad r2.x, r0.x, CB0[0][0].z, -r5.x\n    mad r0.x, -r0.x, CB0[0][0].z, r4.y\n  endif \n  lt r3.xy, r6.xyxx, l(0.000000, 0.000000, 0.000000, 0.000000)\n  add r0.y, r2.x, r0.x\n  ine r3.xy, r3.zzzz, r3.xyxx\n  div r0.y, l(1.000000, 1.000000, 1.000000, 1.000000), r0.y\n  lt r3.z, r2.x, r0.x\n  min r0.x, r0.x, r2.x\n  movc r2.x, r3.z, r3.x, r3.y\n  mul r2.w, r2.w, r2.w\n  mad r0.x, r0.x, -r0.y, l(0.500000)\n  and r0.x, r0.x, r2.x\n  max r0.x, r2.w, r0.x\n  if_z r2.y\n    mad r0.z, r0.x, r2.z, r0.z\n  endif \n  if_nz r2.y\n    mad r0.w, r0.x, r2.z, r0.w\n  endif \n  sample_l r1.xyz, r0.zwzz, T0[0].xyzw, S0[0], l(0.000000)\nendif \nmov r1.w, l(1.000000)\nstore_uav_typed U0[0].xyzw, vThreadID.xyyy, r1.xyzw\nret \n// Approximately 364 instruction slots used\n#endif\n\nconst BYTE fxaa_extreme_cs[] =\n{\n     68,  88,  66,  67, 201, 241, \n     80, 129, 142, 182,  61,  91, \n     66,  45, 161, 133, 204,  62, \n    115, 180,   1,   0,   0,   0, \n     16,  36,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n    108,   2,   0,   0, 124,   2, \n      0,   0, 140,   2,   0,   0, \n    116,  35,   0,   0,  82,  68, \n     69,  70,  48,   2,   0,   0, \n      1,   0,   0,   0,  44,   1, \n      0,   0,   4,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n      8,   2,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    220,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 244,   0, \n      0,   0,   2,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  12,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   3,   1,   0,   0, \n      4,   0,   0,   0,   1,   0, \n      0,   0,   4,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     12,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   1,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 120, 101, \n     95, 115,  97, 109, 112, 108, \n    101, 114,  95, 108, 105, 110, \n    101,  97, 114,  95,  99, 108, \n     97, 109, 112,   0, 120, 101, \n     95, 102, 120,  97,  97,  95, \n    115, 111, 117, 114,  99, 101, \n      0, 120, 101,  95, 102, 120, \n     97,  97,  95, 100, 101, 115, \n    116,   0,  88, 101,  65, 112, \n    112, 108, 121,  71,  97, 109, \n    109,  97,  82,  97, 109, 112, \n     67, 111, 110, 115, 116,  97, \n    110, 116, 115,   0, 171, 171, \n     16,   1,   0,   0,   2,   0, \n      0,   0,  68,   1,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    148,   1,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n      2,   0,   0,   0, 168,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 204,   1, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   2,   0, \n      0,   0, 228,   1,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 102, \n    120,  97,  97,  95, 115, 105, \n    122, 101,   0, 117, 105, 110, \n    116,  50,   0, 171,   1,   0, \n     19,   0,   1,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    161,   1,   0,   0, 120, 101, \n     95, 102, 120,  97,  97,  95, \n    115, 105, 122, 101,  95, 105, \n    110, 118,   0, 102, 108, 111, \n     97, 116,  50,   0,   1,   0, \n      3,   0,   1,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    221,   1,   0,   0,  77, 105, \n     99, 114, 111, 115, 111, 102, \n    116,  32,  40,  82,  41,  32, \n     72,  76,  83,  76,  32,  83, \n    104,  97, 100, 101, 114,  32, \n     67, 111, 109, 112, 105, 108, \n    101, 114,  32,  49,  48,  46, \n     49,   0,  73,  83,  71,  78, \n      8,   0,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     79,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  83,  72, \n     69,  88, 224,  32,   0,   0, \n     81,   0,   5,   0,  56,   8, \n      0,   0, 106,   8,   0,   1, \n     89,   0,   0,   7,  70, 142, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  90,   0, \n      0,   6,  70, 110,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  88,  24, \n      0,   7,  70, 126,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     85,  85,   0,   0,   0,   0, \n      0,   0, 156,  24,   0,   7, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  17,  17, \n      0,   0,   0,   0,   0,   0, \n     95,   0,   0,   2,  50,   0, \n      2,   0, 104,   0,   0,   2, \n      7,   0,   0,   0, 155,   0, \n      0,   4,  16,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,   0,  80,   0,   0,   8, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,   2,   0, \n     70, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  60,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  62,   0,   0,   1, \n     21,   0,   0,   1,  86,   0, \n      0,   4,  50,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n      2,   0,   0,   0,   0,  10, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     56,   0,   0,   9, 194,   0, \n     16,   0,   0,   0,   0,   0, \n      6,   4,  16,   0,   0,   0, \n      0,   0, 166, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   0,   0,  13, 242,   0, \n     16,   0,   1,   0,   0,   0, \n    230,  10,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,  96,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 109,   0, \n      0,  11, 114,   0,  16,   0, \n      2,   0,   0,   0, 230,  10, \n     16,   0,   0,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     58,  96,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    109,   0,   0, 140,   1, 254, \n      1,   0, 114,   0,  16,   0, \n      3,   0,   0,   0, 230,  10, \n     16,   0,   0,   0,   0,   0, \n     38, 119,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     58,  96,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     52,   0,   0,   7, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  51,   0, \n      0,   7, 130,   0,  16,   0, \n      3,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  52,   0,   0,   7, \n    130,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     51,   0,   0,   7, 130,   0, \n     16,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,  52,   0, \n      0,   7,  18,   0,  16,   0, \n      4,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   3,   0, \n      0,   0,  51,   0,   0,   7, \n     34,   0,  16,   0,   4,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,  10,   0, \n     16,   0,   3,   0,   0,   0, \n     52,   0,   0,   7, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      4,   0,   0,   0,  51,   0, \n      0,   7, 130,   0,  16,   0, \n      3,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0,  56,   0,   0,   7, \n     18,   0,  16,   0,   4,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,  37,   6, 129,  61, \n      0,   0,   0,   8, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16, 128, \n     65,   0,   0,   0,   3,   0, \n      0,   0,  52,   0,   0,   7, \n    130,   0,  16,   0,   3,   0, \n      0,   0,  10,   0,  16,   0, \n      4,   0,   0,   0,   1,  64, \n      0,   0,  36, 151, 255,  60, \n     49,   0,   0,   7, 130,   0, \n     16,   0,   3,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,  31,   0, \n      0,   3,  58,   0,  16,   0, \n      3,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   0,   3, \n     58,   0,  16,   0,   3,   0, \n      0,   0,  72,   0,   0, 142, \n      1, 226,   1,   0, 130,   0, \n     16,   0,   3,   0,   0,   0, \n    230,  10,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,  96,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  72,   0, \n      0, 142,   1,  62,   0,   0, \n     18,   0,  16,   0,   4,   0, \n      0,   0, 230,  10,  16,   0, \n      0,   0,   0,   0,  54, 121, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,  96, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   7,  98,   0, \n     16,   0,   4,   0,   0,   0, \n      6,   2,  16,   0,   2,   0, \n      0,   0,   6,   1,  16,   0, \n      3,   0,   0,   0,  14,   0, \n      0,  10, 130,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128,  63, \n      0,   0, 128,  63,   0,   0, \n    128,  63,   0,   0, 128,  63, \n     58,   0,  16,   0,   2,   0, \n      0,   0,   0,   0,   0,   7, \n    130,   0,  16,   0,   4,   0, \n      0,   0,  42,   0,  16,   0, \n      4,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n     50,   0,   0,  12,  98,   0, \n     16,   0,   4,   0,   0,   0, \n    246,  15,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0, 192,   0,   0,   0, 192, \n      0,   0,   0,   0,  86,   6, \n     16,   0,   4,   0,   0,   0, \n      0,   0,   0,   7,  18,   0, \n     16,   0,   5,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   7, 130,   0,  16,   0, \n      3,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0,  50,   0,   0,   9, \n     34,   0,  16,   0,   5,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0, 192, \n     10,   0,  16,   0,   5,   0, \n      0,   0,  50,   0,   0,   9, \n    130,   0,  16,   0,   3,   0, \n      0,   0,  10,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0, 192, \n     58,   0,  16,   0,   3,   0, \n      0,   0,   0,   0,   0,   7, \n     66,   0,  16,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n      0,   0,   0,   7,  34,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      4,   0,   0,   0,  50,   0, \n      0,  11,  18,   0,  16,   0, \n      4,   0,   0,   0,  26,   0, \n     16, 128, 129,   0,   0,   0, \n      4,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,  64, \n     26,   0,  16, 128, 129,   0, \n      0,   0,   5,   0,   0,   0, \n     50,   0,   0,  11, 130,   0, \n     16,   0,   3,   0,   0,   0, \n     42,   0,  16, 128, 129,   0, \n      0,   0,   4,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  64,  58,   0,  16, 128, \n    129,   0,   0,   0,   3,   0, \n      0,   0,  50,   0,   0,   9, \n     34,   0,  16,   0,   4,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0, 192, \n     42,   0,  16,   0,   3,   0, \n      0,   0,  50,   0,   0,   9, \n     34,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0, 192, \n     26,   0,  16,   0,   2,   0, \n      0,   0,   0,   0,   0,   8, \n     18,   0,  16,   0,   4,   0, \n      0,   0,  10,   0,  16,   0, \n      4,   0,   0,   0,  26,   0, \n     16, 128, 129,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   8,  34,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n     26,   0,  16, 128, 129,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   7,  66,   0, \n     16,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   5,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0,  29,   0, \n      0,   7,  34,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  50,   0,   0,   9, \n     66,   0,  16,   0,   3,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,  64, \n     42,   0,  16,   0,   3,   0, \n      0,   0,  31,   0,   0,   3, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      2,   0,   0,   0,  54,   0, \n      0,   7,  66,   0,  16,   0, \n      2,   0,   0,   0,  58, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  18,   0,   0,   1, \n     54,   0,   0,   7,  66,   0, \n     16,   0,   2,   0,   0,   0, \n     42, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  50,   0,   0,  10, \n     34,   0,  16,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0, 171, 170, 170,  61, \n     58,   0,  16, 128,  65,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   8,  66,   0, \n     16,   0,   3,   0,   0,   0, \n     58,   0,  16, 128,  65,   0, \n      0,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   3,   0, \n      0,   0,   0,   0,   0,   8, \n    130,   0,  16,   0,   3,   0, \n      0,   0,  58,   0,  16, 128, \n     65,   0,   0,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  29,   0, \n      0,   9,  18,   0,  16,   0, \n      4,   0,   0,   0,  42,   0, \n     16, 128, 129,   0,   0,   0, \n      3,   0,   0,   0,  58,   0, \n     16, 128, 129,   0,   0,   0, \n      3,   0,   0,   0,  52,   0, \n      0,   9,  66,   0,  16,   0, \n      3,   0,   0,   0,  58,   0, \n     16, 128, 129,   0,   0,   0, \n      3,   0,   0,   0,  42,   0, \n     16, 128, 129,   0,   0,   0, \n      3,   0,   0,   0,  31,   0, \n      4,   3,  10,   0,  16,   0, \n      4,   0,   0,   0,  54,   0, \n      0,   6,  66,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16, 128,  65,   0,   0,   0, \n      2,   0,   0,   0,  21,   0, \n      0,   1,  56,  32,   0,   8, \n    130,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16, 128, 129,   0,   0,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   9,  34,   0,  16,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     42, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,  11, 130,   0,  16,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  58, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     31,   0,   0,   3,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     50,   0,   0,   9,  34,   0, \n     16,   0,   4,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,  63,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     18,   0,   0,   1,  54,   0, \n      0,   5,  34,   0,  16,   0, \n      4,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      2,   0,   0,   0,  50,   0, \n      0,   9,  66,   0,  16,   0, \n      4,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  63,  58,   0,  16,   0, \n      0,   0,   0,   0,  18,   0, \n      0,   1,  54,   0,   0,   5, \n     66,   0,  16,   0,   4,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,   0,   0,   0,   8, \n     50,   0,  16,   0,   5,   0, \n      0,   0, 214,   5,  16, 128, \n     65,   0,   0,   0,   3,   0, \n      0,   0, 150,   5,  16,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   7, 162,   0,  16,   0, \n      4,   0,   0,   0,  86,  13, \n     16,   0,   3,   0,   0,   0, \n     86,   9,  16,   0,   4,   0, \n      0,   0,  50,   0,   0,   9, \n     66,   0,  16,   0,   4,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0, 192, \n      1,  64,   0,   0,   0,   0, \n     64,  64,  72,   0,   0,  13, \n     66,   0,  16,   0,   5,   0, \n      0,   0,  70,   0,  16,   0, \n      5,   0,   0,   0,  70, 123, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,  96, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     56,   0,   0,   7, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,  72,   0, \n      0,  13, 130,   0,  16,   0, \n      5,   0,   0,   0, 214,   5, \n     16,   0,   4,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,  96,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  31,   0,   0,   3, \n     10,   0,  16,   0,   4,   0, \n      0,   0,   0,   0,   0,   7, \n     18,   0,  16,   0,   3,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     18,   0,   0,   1,   0,   0, \n      0,   7,  18,   0,  16,   0, \n      3,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   3,   0, \n      0,   0,  21,   0,   0,   1, \n     56,   0,   0,   7,  18,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0, 128,  62,  50,   0, \n      0,  10,  66,   0,  16,   0, \n      3,   0,   0,   0,  10,   0, \n     16, 128,  65,   0,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,  63, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  56,   0,   0,   7, \n    130,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   4,   0,   0,   0, \n     49,   0,   0,   7,  66,   0, \n     16,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  50,   0, \n      0,  10,  18,   0,  16,   0, \n      6,   0,   0,   0,  10,   0, \n     16, 128,  65,   0,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,  63, \n     42,   0,  16,   0,   5,   0, \n      0,   0,  50,   0,   0,  10, \n     34,   0,  16,   0,   6,   0, \n      0,   0,  10,   0,  16, 128, \n     65,   0,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,  63,  58,   0, \n     16,   0,   5,   0,   0,   0, \n     49,   0,   0,   8,  82,   0, \n     16,   0,   4,   0,   0,   0, \n      6,   1,  16, 128, 129,   0, \n      0,   0,   6,   0,   0,   0, \n      6,   0,  16,   0,   2,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   4,   0, \n      0,   0,   0,   0,   0,   8, \n     50,   0,  16,   0,   5,   0, \n      0,   0, 214,   5,  16, 128, \n     65,   0,   0,   0,   3,   0, \n      0,   0,  70,   0,  16,   0, \n      5,   0,   0,   0,  21,   0, \n      0,   1,  60,   0,   0,   7, \n     66,   0,  16,   0,   5,   0, \n      0,   0,  42,   0,  16,   0, \n      4,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   4,   0,   0,   0, \n      0,   0,   0,   7, 162,   0, \n     16,   0,   4,   0,   0,   0, \n     86,  13,  16,   0,   3,   0, \n      0,   0,  86,  13,  16,   0, \n      4,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     42,   0,  16,   0,   5,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   4,   0, \n      0,   0,  72,   0,   0,  13, \n     18,   0,  16,   0,   6,   0, \n      0,   0,  70,   0,  16,   0, \n      5,   0,   0,   0,  54, 121, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,  96, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      4,   0,   0,   0,  72,   0, \n      0,  13,  34,   0,  16,   0, \n      6,   0,   0,   0, 214,   5, \n     16,   0,   4,   0,   0,   0, \n    198, 121,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,  96,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     50,   0,   0,  10,  18,   0, \n     16,   0,   6,   0,   0,   0, \n     10,   0,  16, 128,  65,   0, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  63,  10,   0,  16,   0, \n      6,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     42,   0,  16,   0,   4,   0, \n      0,   0,  50,   0,   0,  10, \n     34,   0,  16,   0,   6,   0, \n      0,   0,  10,   0,  16, 128, \n     65,   0,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,  63,  26,   0, \n     16,   0,   6,   0,   0,   0, \n     21,   0,   0,   1,  49,   0, \n      0,   8,  82,   0,  16,   0, \n      4,   0,   0,   0,   6,   1, \n     16, 128, 129,   0,   0,   0, \n      6,   0,   0,   0,   6,   0, \n     16,   0,   2,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   4,   0,   0,   0, \n      0,   0,   0,   8,  50,   0, \n     16,   0,   5,   0,   0,   0, \n    214,   5,  16, 128,  65,   0, \n      0,   0,   3,   0,   0,   0, \n     70,   0,  16,   0,   5,   0, \n      0,   0,  21,   0,   0,   1, \n     60,   0,   0,   7,  66,   0, \n     16,   0,   5,   0,   0,   0, \n     42,   0,  16,   0,   4,   0, \n      0,   0,  10,   0,  16,   0, \n      4,   0,   0,   0,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   7, 162,   0,  16,   0, \n      4,   0,   0,   0,  86,  13, \n     16,   0,   3,   0,   0,   0, \n     86,  13,  16,   0,   4,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   5,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     72,   0,   0,  13,  18,   0, \n     16,   0,   6,   0,   0,   0, \n     70,   0,  16,   0,   5,   0, \n      0,   0,  54, 121,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,  96,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     42,   0,  16,   0,   4,   0, \n      0,   0,  72,   0,   0,  13, \n     34,   0,  16,   0,   6,   0, \n      0,   0, 214,   5,  16,   0, \n      4,   0,   0,   0, 198, 121, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,  96, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  10,   0,  16,   0, \n      4,   0,   0,   0,  50,   0, \n      0,  10,  18,   0,  16,   0, \n      6,   0,   0,   0,  10,   0, \n     16, 128,  65,   0,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,  63, \n     10,   0,  16,   0,   6,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   4,   0,   0,   0, \n     50,   0,   0,  10,  34,   0, \n     16,   0,   6,   0,   0,   0, \n     10,   0,  16, 128,  65,   0, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  63,  26,   0,  16,   0, \n      6,   0,   0,   0,  21,   0, \n      0,   1,  49,   0,   0,   8, \n     82,   0,  16,   0,   4,   0, \n      0,   0,   6,   1,  16, 128, \n    129,   0,   0,   0,   6,   0, \n      0,   0,   6,   0,  16,   0, \n      2,   0,   0,   0,  31,   0, \n      4,   3,  10,   0,  16,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   8,  50,   0,  16,   0, \n      5,   0,   0,   0, 214,   5, \n     16, 128,  65,   0,   0,   0, \n      3,   0,   0,   0,  70,   0, \n     16,   0,   5,   0,   0,   0, \n     21,   0,   0,   1,  60,   0, \n      0,   7,  66,   0,  16,   0, \n      5,   0,   0,   0,  42,   0, \n     16,   0,   4,   0,   0,   0, \n     10,   0,  16,   0,   4,   0, \n      0,   0,  31,   0,   4,   3, \n     42,   0,  16,   0,   4,   0, \n      0,   0,   0,   0,   0,   7, \n    162,   0,  16,   0,   4,   0, \n      0,   0,  86,  13,  16,   0, \n      3,   0,   0,   0,  86,  13, \n     16,   0,   4,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      5,   0,   0,   0,  31,   0, \n      4,   3,  10,   0,  16,   0, \n      4,   0,   0,   0,  72,   0, \n      0,  13,  18,   0,  16,   0, \n      6,   0,   0,   0,  70,   0, \n     16,   0,   5,   0,   0,   0, \n     54, 121,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,  96,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   4,   0,   0,   0, \n     72,   0,   0,  13,  34,   0, \n     16,   0,   6,   0,   0,   0, \n    214,   5,  16,   0,   4,   0, \n      0,   0, 198, 121,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,  96,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     10,   0,  16,   0,   4,   0, \n      0,   0,  50,   0,   0,  10, \n     18,   0,  16,   0,   6,   0, \n      0,   0,  10,   0,  16, 128, \n     65,   0,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,  63,  10,   0, \n     16,   0,   6,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      4,   0,   0,   0,  50,   0, \n      0,  10,  34,   0,  16,   0, \n      6,   0,   0,   0,  10,   0, \n     16, 128,  65,   0,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,  63, \n     26,   0,  16,   0,   6,   0, \n      0,   0,  21,   0,   0,   1, \n     49,   0,   0,   8,  82,   0, \n     16,   0,   4,   0,   0,   0, \n      6,   1,  16, 128, 129,   0, \n      0,   0,   6,   0,   0,   0, \n      6,   0,  16,   0,   2,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   4,   0, \n      0,   0,   0,   0,   0,   8, \n     50,   0,  16,   0,   5,   0, \n      0,   0, 214,   5,  16, 128, \n     65,   0,   0,   0,   3,   0, \n      0,   0,  70,   0,  16,   0, \n      5,   0,   0,   0,  21,   0, \n      0,   1,  60,   0,   0,   7, \n     66,   0,  16,   0,   5,   0, \n      0,   0,  42,   0,  16,   0, \n      4,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   4,   0,   0,   0, \n      0,   0,   0,   7, 162,   0, \n     16,   0,   4,   0,   0,   0, \n     86,  13,  16,   0,   3,   0, \n      0,   0,  86,  13,  16,   0, \n      4,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     42,   0,  16,   0,   5,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   4,   0, \n      0,   0,  72,   0,   0,  13, \n     18,   0,  16,   0,   6,   0, \n      0,   0,  70,   0,  16,   0, \n      5,   0,   0,   0,  54, 121, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,  96, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      4,   0,   0,   0,  72,   0, \n      0,  13,  34,   0,  16,   0, \n      6,   0,   0,   0, 214,   5, \n     16,   0,   4,   0,   0,   0, \n    198, 121,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,  96,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     50,   0,   0,  10,  18,   0, \n     16,   0,   6,   0,   0,   0, \n     10,   0,  16, 128,  65,   0, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  63,  10,   0,  16,   0, \n      6,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     42,   0,  16,   0,   4,   0, \n      0,   0,  50,   0,   0,  10, \n     34,   0,  16,   0,   6,   0, \n      0,   0,  10,   0,  16, 128, \n     65,   0,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,  63,  26,   0, \n     16,   0,   6,   0,   0,   0, \n     21,   0,   0,   1,  49,   0, \n      0,   8,  82,   0,  16,   0, \n      4,   0,   0,   0,   6,   1, \n     16, 128, 129,   0,   0,   0, \n      6,   0,   0,   0,   6,   0, \n     16,   0,   2,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     50,   0,   0,  10,  18,   0, \n     16,   0,   5,   0,   0,   0, \n     26,   0,  16, 128,  65,   0, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n    192,  63,  10,   0,  16,   0, \n      5,   0,   0,   0,  50,   0, \n      0,  10,  34,   0,  16,   0, \n      5,   0,   0,   0,  58,   0, \n     16, 128,  65,   0,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0, 192,  63, \n     26,   0,  16,   0,   5,   0, \n      0,   0,  21,   0,   0,   1, \n     60,   0,   0,   7,  66,   0, \n     16,   0,   5,   0,   0,   0, \n     42,   0,  16,   0,   4,   0, \n      0,   0,  10,   0,  16,   0, \n      4,   0,   0,   0,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      4,   0,   0,   0,  50,   0, \n      0,   9,  34,   0,  16,   0, \n      4,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n    192,  63,  26,   0,  16,   0, \n      4,   0,   0,   0,  50,   0, \n      0,   9, 130,   0,  16,   0, \n      4,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n    192,  63,  58,   0,  16,   0, \n      4,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     42,   0,  16,   0,   5,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   4,   0, \n      0,   0,  72,   0,   0,  13, \n     18,   0,  16,   0,   6,   0, \n      0,   0,  70,   0,  16,   0, \n      5,   0,   0,   0,  54, 121, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,  96, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      4,   0,   0,   0,  72,   0, \n      0,  13,  34,   0,  16,   0, \n      6,   0,   0,   0, 214,   5, \n     16,   0,   4,   0,   0,   0, \n    198, 121,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,  96,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     50,   0,   0,  10,  18,   0, \n     16,   0,   6,   0,   0,   0, \n     10,   0,  16, 128,  65,   0, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  63,  10,   0,  16,   0, \n      6,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     42,   0,  16,   0,   4,   0, \n      0,   0,  50,   0,   0,  10, \n     34,   0,  16,   0,   6,   0, \n      0,   0,  10,   0,  16, 128, \n     65,   0,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,  63,  26,   0, \n     16,   0,   6,   0,   0,   0, \n     21,   0,   0,   1,  49,   0, \n      0,   8,  82,   0,  16,   0, \n      4,   0,   0,   0,   6,   1, \n     16, 128, 129,   0,   0,   0, \n      6,   0,   0,   0,   6,   0, \n     16,   0,   2,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     50,   0,   0,  10,  18,   0, \n     16,   0,   5,   0,   0,   0, \n     26,   0,  16, 128,  65,   0, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  64,  10,   0,  16,   0, \n      5,   0,   0,   0,  50,   0, \n      0,  10,  34,   0,  16,   0, \n      5,   0,   0,   0,  58,   0, \n     16, 128,  65,   0,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,  64, \n     26,   0,  16,   0,   5,   0, \n      0,   0,  21,   0,   0,   1, \n     60,   0,   0,   7,  66,   0, \n     16,   0,   5,   0,   0,   0, \n     42,   0,  16,   0,   4,   0, \n      0,   0,  10,   0,  16,   0, \n      4,   0,   0,   0,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      4,   0,   0,   0,  50,   0, \n      0,   9,  34,   0,  16,   0, \n      4,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  64,  26,   0,  16,   0, \n      4,   0,   0,   0,  50,   0, \n      0,   9, 130,   0,  16,   0, \n      4,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  64,  58,   0,  16,   0, \n      4,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     42,   0,  16,   0,   5,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   4,   0, \n      0,   0,  72,   0,   0,  13, \n     18,   0,  16,   0,   6,   0, \n      0,   0,  70,   0,  16,   0, \n      5,   0,   0,   0,  54, 121, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,  96, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      4,   0,   0,   0,  72,   0, \n      0,  13,  34,   0,  16,   0, \n      6,   0,   0,   0, 214,   5, \n     16,   0,   4,   0,   0,   0, \n    198, 121,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,  96,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     50,   0,   0,  10,  18,   0, \n     16,   0,   6,   0,   0,   0, \n     10,   0,  16, 128,  65,   0, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  63,  10,   0,  16,   0, \n      6,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     42,   0,  16,   0,   4,   0, \n      0,   0,  50,   0,   0,  10, \n     34,   0,  16,   0,   6,   0, \n      0,   0,  10,   0,  16, 128, \n     65,   0,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,  63,  26,   0, \n     16,   0,   6,   0,   0,   0, \n     21,   0,   0,   1,  49,   0, \n      0,   8,  82,   0,  16,   0, \n      4,   0,   0,   0,   6,   1, \n     16, 128, 129,   0,   0,   0, \n      6,   0,   0,   0,   6,   0, \n     16,   0,   2,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     50,   0,   0,  10,  18,   0, \n     16,   0,   5,   0,   0,   0, \n     26,   0,  16, 128,  65,   0, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  64,  10,   0,  16,   0, \n      5,   0,   0,   0,  50,   0, \n      0,  10,  34,   0,  16,   0, \n      5,   0,   0,   0,  58,   0, \n     16, 128,  65,   0,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,  64, \n     26,   0,  16,   0,   5,   0, \n      0,   0,  21,   0,   0,   1, \n     60,   0,   0,   7,  66,   0, \n     16,   0,   5,   0,   0,   0, \n     42,   0,  16,   0,   4,   0, \n      0,   0,  10,   0,  16,   0, \n      4,   0,   0,   0,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      4,   0,   0,   0,  50,   0, \n      0,   9,  34,   0,  16,   0, \n      4,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  64,  26,   0,  16,   0, \n      4,   0,   0,   0,  50,   0, \n      0,   9, 130,   0,  16,   0, \n      4,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  64,  58,   0,  16,   0, \n      4,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     42,   0,  16,   0,   5,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   4,   0, \n      0,   0,  72,   0,   0,  13, \n     18,   0,  16,   0,   6,   0, \n      0,   0,  70,   0,  16,   0, \n      5,   0,   0,   0,  54, 121, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,  96, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      4,   0,   0,   0,  72,   0, \n      0,  13,  34,   0,  16,   0, \n      6,   0,   0,   0, 214,   5, \n     16,   0,   4,   0,   0,   0, \n    198, 121,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,  96,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     50,   0,   0,  10,  18,   0, \n     16,   0,   6,   0,   0,   0, \n     10,   0,  16, 128,  65,   0, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  63,  10,   0,  16,   0, \n      6,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     42,   0,  16,   0,   4,   0, \n      0,   0,  50,   0,   0,  10, \n     34,   0,  16,   0,   6,   0, \n      0,   0,  10,   0,  16, 128, \n     65,   0,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,  63,  26,   0, \n     16,   0,   6,   0,   0,   0, \n     21,   0,   0,   1,  49,   0, \n      0,   8,  82,   0,  16,   0, \n      4,   0,   0,   0,   6,   1, \n     16, 128, 129,   0,   0,   0, \n      6,   0,   0,   0,   6,   0, \n     16,   0,   2,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     50,   0,   0,  10,  18,   0, \n     16,   0,   5,   0,   0,   0, \n     26,   0,  16, 128,  65,   0, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  64,  10,   0,  16,   0, \n      5,   0,   0,   0,  50,   0, \n      0,  10,  34,   0,  16,   0, \n      5,   0,   0,   0,  58,   0, \n     16, 128,  65,   0,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,  64, \n     26,   0,  16,   0,   5,   0, \n      0,   0,  21,   0,   0,   1, \n     60,   0,   0,   7,  66,   0, \n     16,   0,   5,   0,   0,   0, \n     42,   0,  16,   0,   4,   0, \n      0,   0,  10,   0,  16,   0, \n      4,   0,   0,   0,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      4,   0,   0,   0,  50,   0, \n      0,   9,  34,   0,  16,   0, \n      4,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  64,  26,   0,  16,   0, \n      4,   0,   0,   0,  50,   0, \n      0,   9, 130,   0,  16,   0, \n      4,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  64,  58,   0,  16,   0, \n      4,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     42,   0,  16,   0,   5,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   4,   0, \n      0,   0,  72,   0,   0,  13, \n     18,   0,  16,   0,   6,   0, \n      0,   0,  70,   0,  16,   0, \n      5,   0,   0,   0,  54, 121, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,  96, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      4,   0,   0,   0,  72,   0, \n      0,  13,  34,   0,  16,   0, \n      6,   0,   0,   0, 214,   5, \n     16,   0,   4,   0,   0,   0, \n    198, 121,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,  96,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     50,   0,   0,  10,  18,   0, \n     16,   0,   6,   0,   0,   0, \n     10,   0,  16, 128,  65,   0, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  63,  10,   0,  16,   0, \n      6,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     42,   0,  16,   0,   4,   0, \n      0,   0,  50,   0,   0,  10, \n     34,   0,  16,   0,   6,   0, \n      0,   0,  10,   0,  16, 128, \n     65,   0,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,  63,  26,   0, \n     16,   0,   6,   0,   0,   0, \n     21,   0,   0,   1,  49,   0, \n      0,   8,  82,   0,  16,   0, \n      4,   0,   0,   0,   6,   1, \n     16, 128, 129,   0,   0,   0, \n      6,   0,   0,   0,   6,   0, \n     16,   0,   2,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     50,   0,   0,  10,  18,   0, \n     16,   0,   5,   0,   0,   0, \n     26,   0,  16, 128,  65,   0, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  64,  10,   0,  16,   0, \n      5,   0,   0,   0,  50,   0, \n      0,  10,  34,   0,  16,   0, \n      5,   0,   0,   0,  58,   0, \n     16, 128,  65,   0,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,  64, \n     26,   0,  16,   0,   5,   0, \n      0,   0,  21,   0,   0,   1, \n     60,   0,   0,   7,  66,   0, \n     16,   0,   5,   0,   0,   0, \n     42,   0,  16,   0,   4,   0, \n      0,   0,  10,   0,  16,   0, \n      4,   0,   0,   0,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      4,   0,   0,   0,  50,   0, \n      0,   9,  34,   0,  16,   0, \n      4,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  64,  26,   0,  16,   0, \n      4,   0,   0,   0,  50,   0, \n      0,   9, 130,   0,  16,   0, \n      4,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  64,  58,   0,  16,   0, \n      4,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     42,   0,  16,   0,   5,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   4,   0, \n      0,   0,  72,   0,   0,  13, \n     18,   0,  16,   0,   6,   0, \n      0,   0,  70,   0,  16,   0, \n      5,   0,   0,   0,  54, 121, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,  96, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      4,   0,   0,   0,  72,   0, \n      0,  13,  34,   0,  16,   0, \n      6,   0,   0,   0, 214,   5, \n     16,   0,   4,   0,   0,   0, \n    198, 121,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,  96,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     50,   0,   0,  10,  18,   0, \n     16,   0,   6,   0,   0,   0, \n     10,   0,  16, 128,  65,   0, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  63,  10,   0,  16,   0, \n      6,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     42,   0,  16,   0,   4,   0, \n      0,   0,  50,   0,   0,  10, \n     34,   0,  16,   0,   6,   0, \n      0,   0,  10,   0,  16, 128, \n     65,   0,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,  63,  26,   0, \n     16,   0,   6,   0,   0,   0, \n     21,   0,   0,   1,  49,   0, \n      0,   8,  82,   0,  16,   0, \n      4,   0,   0,   0,   6,   1, \n     16, 128, 129,   0,   0,   0, \n      6,   0,   0,   0,   6,   0, \n     16,   0,   2,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     50,   0,   0,  10,  18,   0, \n     16,   0,   5,   0,   0,   0, \n     26,   0,  16, 128,  65,   0, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n    128,  64,  10,   0,  16,   0, \n      5,   0,   0,   0,  50,   0, \n      0,  10,  34,   0,  16,   0, \n      5,   0,   0,   0,  58,   0, \n     16, 128,  65,   0,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0, 128,  64, \n     26,   0,  16,   0,   5,   0, \n      0,   0,  21,   0,   0,   1, \n     60,   0,   0,   7,  66,   0, \n     16,   0,   5,   0,   0,   0, \n     42,   0,  16,   0,   4,   0, \n      0,   0,  10,   0,  16,   0, \n      4,   0,   0,   0,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      4,   0,   0,   0,  50,   0, \n      0,   9,  34,   0,  16,   0, \n      4,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n    128,  64,  26,   0,  16,   0, \n      4,   0,   0,   0,  50,   0, \n      0,   9, 130,   0,  16,   0, \n      4,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n    128,  64,  58,   0,  16,   0, \n      4,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     42,   0,  16,   0,   5,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   4,   0, \n      0,   0,  72,   0,   0,  13, \n     18,   0,  16,   0,   6,   0, \n      0,   0,  70,   0,  16,   0, \n      5,   0,   0,   0,  54, 121, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,  96, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      4,   0,   0,   0,  72,   0, \n      0,  13,  34,   0,  16,   0, \n      6,   0,   0,   0, 214,   5, \n     16,   0,   4,   0,   0,   0, \n    198, 121,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,  96,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     50,   0,   0,  10,  18,   0, \n     16,   0,   6,   0,   0,   0, \n     10,   0,  16, 128,  65,   0, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  63,  10,   0,  16,   0, \n      6,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     42,   0,  16,   0,   4,   0, \n      0,   0,  50,   0,   0,  10, \n     34,   0,  16,   0,   6,   0, \n      0,   0,  10,   0,  16, 128, \n     65,   0,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,  63,  26,   0, \n     16,   0,   6,   0,   0,   0, \n     21,   0,   0,   1,  49,   0, \n      0,   8,  82,   0,  16,   0, \n      4,   0,   0,   0,   6,   1, \n     16, 128, 129,   0,   0,   0, \n      6,   0,   0,   0,   6,   0, \n     16,   0,   2,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     50,   0,   0,  10,  18,   0, \n     16,   0,   5,   0,   0,   0, \n     26,   0,  16, 128,  65,   0, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  65,  10,   0,  16,   0, \n      5,   0,   0,   0,  50,   0, \n      0,  10,  34,   0,  16,   0, \n      5,   0,   0,   0,  58,   0, \n     16, 128,  65,   0,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,  65, \n     26,   0,  16,   0,   5,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   4,   0,   0,   0, \n     50,   0,   0,   9,  34,   0, \n     16,   0,   4,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,  65,  26,   0, \n     16,   0,   4,   0,   0,   0, \n     50,   0,   0,   9, 130,   0, \n     16,   0,   4,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,  65,  58,   0, \n     16,   0,   4,   0,   0,   0, \n     21,   0,   0,   1,  21,   0, \n      0,   1,  21,   0,   0,   1, \n     21,   0,   0,   1,  21,   0, \n      0,   1,  21,   0,   0,   1, \n     21,   0,   0,   1,  21,   0, \n      0,   1,  21,   0,   0,   1, \n     21,   0,   0,   1,  21,   0, \n      0,   1,  31,   0,   0,   3, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  50,   0,   0,  12, \n     18,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  58, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  26,   0,  16, 128, \n     65,   0,   0,   0,   5,   0, \n      0,   0,  50,   0,   0,  12, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16, 128, \n     65,   0,   0,   0,   0,   0, \n      0,   0,  58, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   4,   0, \n      0,   0,  18,   0,   0,   1, \n     50,   0,   0,  12,  18,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  42, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     10,   0,  16, 128,  65,   0, \n      0,   0,   5,   0,   0,   0, \n     50,   0,   0,  12,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16, 128,  65,   0, \n      0,   0,   0,   0,   0,   0, \n     42, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n     21,   0,   0,   1,  49,   0, \n      0,  10,  50,   0,  16,   0, \n      3,   0,   0,   0,  70,   0, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     39,   0,   0,   7,  50,   0, \n     16,   0,   3,   0,   0,   0, \n    166,  10,  16,   0,   3,   0, \n      0,   0,  70,   0,  16,   0, \n      3,   0,   0,   0,  14,   0, \n      0,  10,  34,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128,  63, \n      0,   0, 128,  63,   0,   0, \n    128,  63,   0,   0, 128,  63, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  49,   0,   0,   7, \n     66,   0,  16,   0,   3,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     51,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  55,   0, \n      0,   9,  18,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,  56,   0, \n      0,   7, 130,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  50,   0,   0,  10, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16, 128,  65,   0,   0,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,  63, \n      1,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  52,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  31,   0,   0,   3, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  50,   0,   0,   9, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     50,   0,   0,   9, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  72,   0, \n      0,  13, 114,   0,  16,   0, \n      1,   0,   0,   0, 230,  10, \n     16,   0,   0,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,  96,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     54,   0,   0,   5, 130,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n    128,  63, 164,   0,   0,   7, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   5,   2,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     62,   0,   0,   1,  83,  84, \n     65,  84, 148,   0,   0,   0, \n    108,   1,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0, 134,   0, \n      0,   0,   1,   0,   0,   0, \n     14,   0,   0,   0,   7,   0, \n      0,   0,  84,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     26,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,   2,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/host_depth_store_1xmsaa_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_host_depth_store_rectangle;// Offset:    0 Size:     4\n//   uint xe_host_depth_store_render_target;// Offset:    4 Size:     4\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_host_depth_store_source        texture  float4          2d      T0             t0      1 \n// xe_host_depth_store_dest              UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][1], immediateIndexed, space=0\ndcl_resource_texture2d (float,float,float,float) T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xy\ndcl_temps 5\ndcl_thread_group 8, 8, 1\nubfe r0.xyz, l(3, 3, 10, 0), l(10, 13, 20, 0), CB0[0][0].yyxy\niadd r0.z, r0.z, l(1)\nimul null, r0.z, r0.x, r0.z\nuge r0.z, vThreadID.x, r0.z\nif_nz r0.z\n  ret \nendif \nushr r1.y, CB0[0][0].x, l(10)\nmov r1.x, CB0[0][0].x\nbfi r0.zw, l(0, 0, 10, 10), l(0, 0, 3, 3), r1.xxxy, l(0, 0, 0, 0)\nishl r1.x, vThreadID.x, l(3)\nmov r1.y, vThreadID.y\nimad r1.xy, r0.zwzz, r0.xyxx, r1.xyxx\nand r0.z, CB0[0][0].y, l(1023)\nimul null, r0.xy, r0.xyxx, l(80, 16, 0, 0)\nudiv r2.xy, null, r1.xyxx, r0.xyxx\nimad r0.z, r2.y, r0.z, r2.x\nimad r2.xy, -r2.xyxx, r0.xyxx, r1.xyxx\nimul null, r0.y, r0.y, r0.x\nimad r0.x, r2.y, r0.x, r2.x\nimad r0.x, r0.z, r0.y, r0.x\nishl r0.x, r0.x, l(2)\nmov r1.zw, l(0,0,0,0)\nld r2.x, r1.xyzw, T0[0].xyzw\niadd r3.xyzw, r1.xyxy, l(2, 0, 1, 0)\nmov r4.xy, r3.zwzz\nmov r4.zw, l(0,0,0,0)\nld r2.y, r4.xyzw, T0[0].yxzw\nmov r3.zw, l(0,0,0,0)\nld r2.z, r3.xyzw, T0[0].yzxw\niadd r3.xyzw, r1.xyxy, l(4, 0, 3, 0)\nmov r4.xy, r3.zwzz\nmov r4.zw, l(0,0,0,0)\nld r2.w, r4.xyzw, T0[0].yzwx\nstore_raw U0[0].xyzw, r0.x, r2.xyzw\niadd r0.y, r0.x, l(16)\nmov r3.zw, l(0,0,0,0)\nld r2.x, r3.xyzw, T0[0].xyzw\niadd r3.xyzw, r1.xyxy, l(6, 0, 5, 0)\nmov r4.xy, r3.zwzz\nmov r4.zw, l(0,0,0,0)\nld r2.y, r4.xyzw, T0[0].yxzw\nmov r3.zw, l(0,0,0,0)\nld r2.z, r3.xyzw, T0[0].yzxw\niadd r1.xy, r1.xyxx, l(7, 0, 0, 0)\nmov r1.zw, l(0,0,0,0)\nld r2.w, r1.xyzw, T0[0].yzwx\nstore_raw U0[0].xyzw, r0.y, r2.xyzw\nret \n// Approximately 49 instruction slots used\n#endif\n\nconst BYTE host_depth_store_1xmsaa_cs[] =\n{\n     68,  88,  66,  67, 214, 181, \n     12,  26,  64, 165, 163, 121, \n    193, 142, 110, 162, 166,  35, \n     80, 108,   1,   0,   0,   0, \n    116,   9,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     48,   2,   0,   0,  64,   2, \n      0,   0,  80,   2,   0,   0, \n    216,   8,   0,   0,  82,  68, \n     69,  70, 244,   1,   0,   0, \n      1,   0,   0,   0, 248,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    202,   1,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   2,   0, \n      0,   0,   5,   0,   0,   0, \n      4,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n      1,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 207,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 232,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 104, 111, 115, \n    116,  95, 100, 101, 112, 116, \n    104,  95, 115, 116, 111, 114, \n    101,  95, 115, 111, 117, 114, \n     99, 101,   0, 120, 101,  95, \n    104, 111, 115, 116,  95, 100, \n    101, 112, 116, 104,  95, 115, \n    116, 111, 114, 101,  95, 100, \n    101, 115, 116,   0, 112, 117, \n    115, 104,  95,  99, 111, 110, \n    115, 116, 115,  95, 120, 101, \n      0, 171, 232,   0,   0,   0, \n      2,   0,   0,   0,  16,   1, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  96,   1,   0,   0, \n      0,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    132,   1,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    168,   1,   0,   0,   4,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 132,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 120, 101, \n     95, 104, 111, 115, 116,  95, \n    100, 101, 112, 116, 104,  95, \n    115, 116, 111, 114, 101,  95, \n    114, 101,  99, 116,  97, 110, \n    103, 108, 101,   0, 100, 119, \n    111, 114, 100,   0,   0,   0, \n     19,   0,   1,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    126,   1,   0,   0, 120, 101, \n     95, 104, 111, 115, 116,  95, \n    100, 101, 112, 116, 104,  95, \n    115, 116, 111, 114, 101,  95, \n    114, 101, 110, 100, 101, 114, \n     95, 116,  97, 114, 103, 101, \n    116,   0,  77, 105,  99, 114, \n    111, 115, 111, 102, 116,  32, \n     40,  82,  41,  32,  72,  76, \n     83,  76,  32,  83, 104,  97, \n    100, 101, 114,  32,  67, 111, \n    109, 112, 105, 108, 101, 114, \n     32,  49,  48,  46,  49,   0, \n    171, 171,  73,  83,  71,  78, \n      8,   0,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     79,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  83,  72, \n     69,  88, 128,   6,   0,   0, \n     81,   0,   5,   0, 160,   1, \n      0,   0, 106,   8,   0,   1, \n     89,   0,   0,   7,  70, 142, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  88,  24, \n      0,   7,  70, 126,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     85,  85,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n     50,   0,   2,   0, 104,   0, \n      0,   2,   5,   0,   0,   0, \n    155,   0,   0,   4,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,   0, 138,   0, \n      0,  17, 114,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  10,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  13,   0,   0,   0, \n     20,   0,   0,   0,   0,   0, \n      0,   0,  86, 132,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     80,   0,   0,   6,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,   2,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1,  85,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  10, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  10,   0, \n      0,   0,  54,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  10, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  20, 194,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   6,   4, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,   6, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,   2,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  54,   0,   0,   4, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,   2,   0, \n     35,   0,   0,   9,  50,   0, \n     16,   0,   1,   0,   0,   0, \n    230,  10,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n      1,   0,   0,   9,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0, 255,   3,   0,   0, \n     38,   0,   0,  11,   0, 208, \n      0,   0,  50,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,  80,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  78,   0,   0,   8, \n     50,   0,  16,   0,   2,   0, \n      0,   0,   0, 208,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  35,   0, \n      0,  10,  50,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16, 128,  65,   0,   0,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  45,   0, \n      0,   8,  18,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,   4,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  50,   0,  16,   0, \n      4,   0,   0,   0, 230,  10, \n     16,   0,   3,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  45,   0,   0,   8, \n     34,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  22, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     45,   0,   0,   8,  66,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0, 150, 124,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,   4,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  50,   0, \n     16,   0,   4,   0,   0,   0, \n    230,  10,  16,   0,   3,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  45,   0, \n      0,   8, 130,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n    150, 115,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  30,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  45,   0,   0,   8, \n     18,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,   4, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     50,   0,  16,   0,   4,   0, \n      0,   0, 230,  10,  16,   0, \n      3,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     45,   0,   0,   8,  34,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  22, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  45,   0, \n      0,   8,  66,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n    150, 124,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  10,  50,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     45,   0,   0,   8, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0, 150, 115,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  62,   0, \n      0,   1,  83,  84,  65,  84, \n    148,   0,   0,   0,  49,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  13,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/host_depth_store_2xmsaa_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_host_depth_store_rectangle;// Offset:    0 Size:     4\n//   uint xe_host_depth_store_render_target;// Offset:    4 Size:     4\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_host_depth_store_source        texture  float4        2dMS      T0             t0      1 \n// xe_host_depth_store_dest              UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][1], immediateIndexed, space=0\ndcl_resource_texture2dms(0) (float,float,float,float) T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xy\ndcl_temps 5\ndcl_thread_group 8, 8, 1\nubfe r0.xyz, l(3, 3, 10, 0), l(10, 13, 20, 0), CB0[0][0].yyxy\niadd r0.z, r0.z, l(1)\nimul null, r0.z, r0.x, r0.z\nuge r0.z, vThreadID.x, r0.z\nif_nz r0.z\n  ret \nendif \nushr r1.y, CB0[0][0].x, l(10)\nmov r1.x, CB0[0][0].x\nbfi r0.zw, l(0, 0, 10, 10), l(0, 0, 3, 3), r1.xxxy, l(0, 0, 0, 0)\nishl r1.x, vThreadID.x, l(3)\nushr r1.y, vThreadID.y, l(1)\nimad r1.xy, r0.zwzz, r0.xyxx, r1.xyxx\nand r2.y, vThreadID.y, l(1)\nand r0.z, CB0[0][0].y, l(1023)\nishl r1.z, r1.y, l(1)\nmov r2.x, l(0)\niadd r2.xz, r1.xxzx, r2.xxyx\nimul null, r0.xy, r0.xyxx, l(80, 16, 0, 0)\nudiv r3.xy, null, r2.xzxx, r0.xyxx\nimad r0.z, r3.y, r0.z, r3.x\nimad r2.xz, -r3.xxyx, r0.xxyx, r2.xxzx\nimul null, r0.y, r0.y, r0.x\nimad r0.x, r2.z, r0.x, r2.x\nimad r0.x, r0.z, r0.y, r0.x\nishl r0.x, r0.x, l(2)\nubfe r0.y, l(1), l(16), CB0[0][0].y\nmovc r0.zw, r2.yyyy, l(0,0,0,3), l(0,0,1,0)\nmovc r0.y, r0.y, r0.z, r0.w\nmov r1.w, l(0)\nldms r2.x, r1.xyww, T0[0].xyzw, r0.y\niadd r3.xyzw, r1.xyxy, l(2, 0, 1, 0)\nmov r4.xy, r3.zwzz\nmov r4.zw, l(0,0,0,0)\nldms r2.y, r4.xyzw, T0[0].yxzw, r0.y\nmov r3.zw, l(0,0,0,0)\nldms r2.z, r3.xyzw, T0[0].yzxw, r0.y\niadd r3.xyzw, r1.xyxy, l(4, 0, 3, 0)\nmov r4.xy, r3.zwzz\nmov r4.zw, l(0,0,0,0)\nldms r2.w, r4.xyzw, T0[0].yzwx, r0.y\nstore_raw U0[0].xyzw, r0.x, r2.xyzw\niadd r0.z, r0.x, l(16)\nmov r3.zw, l(0,0,0,0)\nldms r2.x, r3.xyzw, T0[0].xyzw, r0.y\niadd r3.xyzw, r1.xyxy, l(6, 0, 5, 0)\nmov r4.xy, r3.zwzz\nmov r4.zw, l(0,0,0,0)\nldms r2.y, r4.xyzw, T0[0].yxzw, r0.y\nmov r3.zw, l(0,0,0,0)\nldms r2.z, r3.xyzw, T0[0].yzxw, r0.y\niadd r1.xy, r1.xyxx, l(7, 0, 0, 0)\nmov r1.zw, l(0,0,0,0)\nldms r2.w, r1.xyzw, T0[0].yzwx, r0.y\nstore_raw U0[0].xyzw, r0.z, r2.xyzw\nret \n// Approximately 56 instruction slots used\n#endif\n\nconst BYTE host_depth_store_2xmsaa_cs[] =\n{\n     68,  88,  66,  67, 252, 126, \n    171,  23,  87, 160,  99, 116, \n    141,   2, 255,  84,  10,  42, \n    252,  50,   1,   0,   0,   0, \n    160,  10,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     48,   2,   0,   0,  64,   2, \n      0,   0,  80,   2,   0,   0, \n      4,  10,   0,   0,  82,  68, \n     69,  70, 244,   1,   0,   0, \n      1,   0,   0,   0, 248,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    202,   1,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   2,   0, \n      0,   0,   5,   0,   0,   0, \n      6,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 207,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 232,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 104, 111, 115, \n    116,  95, 100, 101, 112, 116, \n    104,  95, 115, 116, 111, 114, \n    101,  95, 115, 111, 117, 114, \n     99, 101,   0, 120, 101,  95, \n    104, 111, 115, 116,  95, 100, \n    101, 112, 116, 104,  95, 115, \n    116, 111, 114, 101,  95, 100, \n    101, 115, 116,   0, 112, 117, \n    115, 104,  95,  99, 111, 110, \n    115, 116, 115,  95, 120, 101, \n      0, 171, 232,   0,   0,   0, \n      2,   0,   0,   0,  16,   1, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  96,   1,   0,   0, \n      0,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    132,   1,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    168,   1,   0,   0,   4,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 132,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 120, 101, \n     95, 104, 111, 115, 116,  95, \n    100, 101, 112, 116, 104,  95, \n    115, 116, 111, 114, 101,  95, \n    114, 101,  99, 116,  97, 110, \n    103, 108, 101,   0, 100, 119, \n    111, 114, 100,   0,   0,   0, \n     19,   0,   1,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    126,   1,   0,   0, 120, 101, \n     95, 104, 111, 115, 116,  95, \n    100, 101, 112, 116, 104,  95, \n    115, 116, 111, 114, 101,  95, \n    114, 101, 110, 100, 101, 114, \n     95, 116,  97, 114, 103, 101, \n    116,   0,  77, 105,  99, 114, \n    111, 115, 111, 102, 116,  32, \n     40,  82,  41,  32,  72,  76, \n     83,  76,  32,  83, 104,  97, \n    100, 101, 114,  32,  67, 111, \n    109, 112, 105, 108, 101, 114, \n     32,  49,  48,  46,  49,   0, \n    171, 171,  73,  83,  71,  78, \n      8,   0,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     79,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  83,  72, \n     69,  88, 172,   7,   0,   0, \n     81,   0,   5,   0, 235,   1, \n      0,   0, 106,   8,   0,   1, \n     89,   0,   0,   7,  70, 142, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  88,  32, \n      0,   7,  70, 126,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     85,  85,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n     50,   0,   2,   0, 104,   0, \n      0,   2,   5,   0,   0,   0, \n    155,   0,   0,   4,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,   0, 138,   0, \n      0,  17, 114,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  10,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  13,   0,   0,   0, \n     20,   0,   0,   0,   0,   0, \n      0,   0,  86, 132,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     80,   0,   0,   6,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,   2,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1,  85,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  10, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  10,   0, \n      0,   0,  54,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  10, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  20, 194,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   6,   4, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,   6, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,   2,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  85,   0,   0,   6, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,   2,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  35,   0,   0,   9, \n     50,   0,  16,   0,   1,   0, \n      0,   0, 230,  10,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,   1,   0,   0,   6, \n     34,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,   2,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   9, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  26, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0, 255,   3, \n      0,   0,  41,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     82,   0,  16,   0,   2,   0, \n      0,   0,   6,   2,  16,   0, \n      1,   0,   0,   0,   6,   1, \n     16,   0,   2,   0,   0,   0, \n     38,   0,   0,  11,   0, 208, \n      0,   0,  50,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,  80,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  78,   0,   0,   8, \n     50,   0,  16,   0,   3,   0, \n      0,   0,   0, 208,   0,   0, \n    134,   0,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      3,   0,   0,   0,  35,   0, \n      0,  10,  82,   0,  16,   0, \n      2,   0,   0,   0,   6,   1, \n     16, 128,  65,   0,   0,   0, \n      3,   0,   0,   0,   6,   1, \n     16,   0,   0,   0,   0,   0, \n      6,   2,  16,   0,   2,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0, 138,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,  15, 194,   0,  16,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5, 130,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     46,   0,   0,  10,  18,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  15,  16,   0,   1,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,   4, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     50,   0,  16,   0,   4,   0, \n      0,   0, 230,  10,  16,   0, \n      3,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     46,   0,   0,  10,  34,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  22, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     46,   0,   0,  10,  66,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0, 150, 124,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,   4, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     50,   0,  16,   0,   4,   0, \n      0,   0, 230,  10,  16,   0, \n      3,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     46,   0,   0,  10, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0, 150, 115,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     46,   0,   0,  10,  18,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,   4, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     50,   0,  16,   0,   4,   0, \n      0,   0, 230,  10,  16,   0, \n      3,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     46,   0,   0,  10,  34,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  22, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     46,   0,   0,  10,  66,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0, 150, 124,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  10,  50,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  46,   0, \n      0,  10, 130,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n    150, 115,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  62,   0, \n      0,   1,  83,  84,  65,  84, \n    148,   0,   0,   0,  56,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     18,   0,   0,   0,   6,   0, \n      0,   0,   2,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  13,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/host_depth_store_4xmsaa_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_host_depth_store_rectangle;// Offset:    0 Size:     4\n//   uint xe_host_depth_store_render_target;// Offset:    4 Size:     4\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_host_depth_store_source        texture  float4        2dMS      T0             t0      1 \n// xe_host_depth_store_dest              UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][1], immediateIndexed, space=0\ndcl_resource_texture2dms(0) (float,float,float,float) T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xy\ndcl_temps 5\ndcl_thread_group 8, 8, 1\nushr r0.x, vThreadID.x, l(1)\nubfe r0.yzw, l(0, 3, 3, 10), l(0, 10, 13, 20), CB0[0][0].yyyx\niadd r0.w, r0.w, l(1)\nimul null, r0.w, r0.y, r0.w\nuge r0.x, r0.x, r0.w\nif_nz r0.x\n  ret \nendif \nushr r1.y, CB0[0][0].x, l(10)\nmov r1.x, CB0[0][0].x\nbfi r0.xw, l(10, 0, 0, 10), l(3, 0, 0, 3), r1.xxxy, l(0, 0, 0, 0)\nishl r1.x, vThreadID.x, l(2)\nushr r1.y, vThreadID.y, l(1)\nimad r1.xy, r0.xwxx, r0.yzyy, r1.xyxx\nbfi r0.xw, l(31, 0, 0, 31), l(1, 0, 0, 1), r1.xxxy, vThreadID.xxxy\nand r2.x, CB0[0][0].y, l(1023)\nimul null, r0.yz, r0.yyzy, l(0, 80, 16, 0)\nudiv r2.yz, null, r0.xxwx, r0.yyzy\nimad r2.x, r2.z, r2.x, r2.y\nimad r0.xw, -r2.yyyz, r0.yyyz, r0.xxxw\nimul null, r0.z, r0.z, r0.y\nimad r0.x, r0.w, r0.y, r0.x\nimad r0.x, r2.x, r0.z, r0.x\nishl r0.x, r0.x, l(2)\nbfi r0.y, l(1), l(1), vThreadID.y, l(0)\niadd r0.z, r0.y, l(1)\nmov r1.zw, l(0,0,0,0)\nldms r2.x, r1.xyww, T0[0].xyzw, r0.y\nldms r2.y, r1.xyzw, T0[0].yxzw, r0.z\niadd r3.xyzw, r1.xyxy, l(2, 0, 1, 0)\nmov r4.xy, r3.zwzz\nmov r4.zw, l(0,0,0,0)\nldms r2.z, r4.xyww, T0[0].yzxw, r0.y\nldms r2.w, r4.xyzw, T0[0].yzwx, r0.z\nstore_raw U0[0].xyzw, r0.x, r2.xyzw\niadd r0.w, r0.x, l(16)\nmov r3.zw, l(0,0,0,0)\nldms r2.x, r3.xyww, T0[0].xyzw, r0.y\nldms r2.y, r3.xyzw, T0[0].yxzw, r0.z\niadd r1.xy, r1.xyxx, l(3, 0, 0, 0)\nmov r1.zw, l(0,0,0,0)\nldms r2.z, r1.xyww, T0[0].yzxw, r0.y\nldms r2.w, r1.xyzw, T0[0].yzwx, r0.z\nstore_raw U0[0].xyzw, r0.w, r2.xyzw\nret \n// Approximately 45 instruction slots used\n#endif\n\nconst BYTE host_depth_store_4xmsaa_cs[] =\n{\n     68,  88,  66,  67,  76, 194, \n    244, 226, 239, 227,  94, 136, \n     20, 181,   8,  32, 209, 210, \n     82, 235,   1,   0,   0,   0, \n    100,   9,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     48,   2,   0,   0,  64,   2, \n      0,   0,  80,   2,   0,   0, \n    200,   8,   0,   0,  82,  68, \n     69,  70, 244,   1,   0,   0, \n      1,   0,   0,   0, 248,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    202,   1,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   2,   0, \n      0,   0,   5,   0,   0,   0, \n      6,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 207,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 232,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 104, 111, 115, \n    116,  95, 100, 101, 112, 116, \n    104,  95, 115, 116, 111, 114, \n    101,  95, 115, 111, 117, 114, \n     99, 101,   0, 120, 101,  95, \n    104, 111, 115, 116,  95, 100, \n    101, 112, 116, 104,  95, 115, \n    116, 111, 114, 101,  95, 100, \n    101, 115, 116,   0, 112, 117, \n    115, 104,  95,  99, 111, 110, \n    115, 116, 115,  95, 120, 101, \n      0, 171, 232,   0,   0,   0, \n      2,   0,   0,   0,  16,   1, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  96,   1,   0,   0, \n      0,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    132,   1,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    168,   1,   0,   0,   4,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 132,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 120, 101, \n     95, 104, 111, 115, 116,  95, \n    100, 101, 112, 116, 104,  95, \n    115, 116, 111, 114, 101,  95, \n    114, 101,  99, 116,  97, 110, \n    103, 108, 101,   0, 100, 119, \n    111, 114, 100,   0,   0,   0, \n     19,   0,   1,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    126,   1,   0,   0, 120, 101, \n     95, 104, 111, 115, 116,  95, \n    100, 101, 112, 116, 104,  95, \n    115, 116, 111, 114, 101,  95, \n    114, 101, 110, 100, 101, 114, \n     95, 116,  97, 114, 103, 101, \n    116,   0,  77, 105,  99, 114, \n    111, 115, 111, 102, 116,  32, \n     40,  82,  41,  32,  72,  76, \n     83,  76,  32,  83, 104,  97, \n    100, 101, 114,  32,  67, 111, \n    109, 112, 105, 108, 101, 114, \n     32,  49,  48,  46,  49,   0, \n    171, 171,  73,  83,  71,  78, \n      8,   0,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     79,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  83,  72, \n     69,  88, 112,   6,   0,   0, \n     81,   0,   5,   0, 156,   1, \n      0,   0, 106,   8,   0,   1, \n     89,   0,   0,   7,  70, 142, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  88,  32, \n      0,   7,  70, 126,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     85,  85,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n     50,   0,   2,   0, 104,   0, \n      0,   2,   5,   0,   0,   0, \n    155,   0,   0,   4,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,   0,  85,   0, \n      0,   6,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      1,   0,   0,   0, 138,   0, \n      0,  17, 226,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n     13,   0,   0,   0,  20,   0, \n      0,   0,  86, 129,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     80,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  31,   0, \n      4,   3,  10,   0,  16,   0, \n      0,   0,   0,   0,  62,   0, \n      0,   1,  21,   0,   0,   1, \n     85,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  10,   0,   0,   0, \n     54,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  20, 146,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     41,   0,   0,   6,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,   2,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     85,   0,   0,   6,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,   2,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     35,   0,   0,   9,  50,   0, \n     16,   0,   1,   0,   0,   0, \n    198,   0,  16,   0,   0,   0, \n      0,   0, 150,   5,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  16, 146,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,  31,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  31,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   6,   4, \n     16,   0,   1,   0,   0,   0, \n      6,   4,   2,   0,   1,   0, \n      0,   9,  18,   0,  16,   0, \n      2,   0,   0,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n    255,   3,   0,   0,  38,   0, \n      0,  11,   0, 208,   0,   0, \n     98,   0,  16,   0,   0,   0, \n      0,   0,  86,   6,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     80,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     78,   0,   0,   8,  98,   0, \n     16,   0,   2,   0,   0,   0, \n      0, 208,   0,   0,   6,   3, \n     16,   0,   0,   0,   0,   0, \n     86,   6,  16,   0,   0,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  35,   0,   0,  10, \n    146,   0,  16,   0,   0,   0, \n      0,   0,  86,   9,  16, 128, \n     65,   0,   0,   0,   2,   0, \n      0,   0,  86,   9,  16,   0, \n      0,   0,   0,   0,   6,  12, \n     16,   0,   0,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  41,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n    140,   0,   0,  10,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  46,   0, \n      0,  10,  18,   0,  16,   0, \n      2,   0,   0,   0,  70,  15, \n     16,   0,   1,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  46,   0,   0,  10, \n     34,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  22, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     30,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,   4,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  50,   0,  16,   0, \n      4,   0,   0,   0, 230,  10, \n     16,   0,   3,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  46,   0,   0,  10, \n     66,   0,  16,   0,   2,   0, \n      0,   0,  70,  15,  16,   0, \n      4,   0,   0,   0, 150, 124, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     46,   0,   0,  10, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0, 150, 115,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     30,   0,   0,   7, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     46,   0,   0,  10,  18,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  15,  16,   0,   3,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  46,   0, \n      0,  10,  34,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     22, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  46,   0,   0,  10, \n     66,   0,  16,   0,   2,   0, \n      0,   0,  70,  15,  16,   0, \n      1,   0,   0,   0, 150, 124, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     46,   0,   0,  10, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0, 150, 115,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     62,   0,   0,   1,  83,  84, \n     65,  84, 148,   0,   0,   0, \n     45,   0,   0,   0,   5,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  15,   0,   0,   0, \n      6,   0,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/passthrough_position_xy_vs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// POSITION                 0   xy          0     NONE   float   xy  \n//\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// SV_Position              0   xyzw        0      POS   float   xyzw\n//\nvs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_input v0.xy\ndcl_output_siv o0.xyzw, position\nmov o0.xy, v0.xyxx\nmov o0.zw, l(0,0,0,1.000000)\nret \n// Approximately 3 instruction slots used\n#endif\n\nconst BYTE passthrough_position_xy_vs[] =\n{\n     68,  88,  66,  67,  92, 220, \n      0, 199, 190,  67, 183, 153, \n    171, 192,   4,  39,  67,  55, \n    215, 255,   1,   0,   0,   0, \n     12,   2,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n    160,   0,   0,   0, 212,   0, \n      0,   0,   8,   1,   0,   0, \n    112,   1,   0,   0,  82,  68, \n     69,  70, 100,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n    254, 255,   0,   5,   0,   0, \n     60,   0,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n     77, 105,  99, 114, 111, 115, \n    111, 102, 116,  32,  40,  82, \n     41,  32,  72,  76,  83,  76, \n     32,  83, 104,  97, 100, 101, \n    114,  32,  67, 111, 109, 112, \n    105, 108, 101, 114,  32,  49, \n     48,  46,  49,   0,  73,  83, \n     71,  78,  44,   0,   0,   0, \n      1,   0,   0,   0,   8,   0, \n      0,   0,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   3,   3, \n      0,   0,  80,  79,  83,  73, \n     84,  73,  79,  78,   0, 171, \n    171, 171,  79,  83,  71,  78, \n     44,   0,   0,   0,   1,   0, \n      0,   0,   8,   0,   0,   0, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,  15,   0,   0,   0, \n     83,  86,  95,  80, 111, 115, \n    105, 116, 105, 111, 110,   0, \n     83,  72,  69,  88,  96,   0, \n      0,   0,  81,   0,   1,   0, \n     24,   0,   0,   0, 106,   8, \n      0,   1,  95,   0,   0,   3, \n     50,  16,  16,   0,   0,   0, \n      0,   0, 103,   0,   0,   4, \n    242,  32,  16,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     54,   0,   0,   5,  50,  32, \n     16,   0,   0,   0,   0,   0, \n     70,  16,  16,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,  32,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 128,  63,  62,   0, \n      0,   1,  83,  84,  65,  84, \n    148,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/resolve_clear_32bpp_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint2 xe_resolve_clear_value;      // Offset:    0 Size:     8\n//   uint xe_resolve_edram_info;        // Offset:    8 Size:     4\n//   uint xe_resolve_coordinate_info;   // Offset:   12 Size:     4\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_resolve_edram                      UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][1], immediateIndexed, space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xy\ndcl_temps 3\ndcl_thread_group 8, 8, 1\nand r0.xy, CB0[0][0].zzzz, l(1023, 4096, 0, 0)\nushr r1.y, CB0[0][0].w, l(4)\nubfe r0.zw, l(0, 0, 2, 11), l(0, 0, 10, 5), CB0[0][0].zzzw\nuge r1.zw, r0.zzzz, l(0, 0, 2, 1)\nand r0.z, r1.z, l(1)\nishl r0.z, r0.w, r0.z\nuge r0.z, vThreadID.x, r0.z\nif_nz r0.z\n  ret \nendif \nubfe r0.z, l(11), l(13), CB0[0][0].z\nishl r2.x, vThreadID.x, l(3)\nmovc r1.zw, r1.zzzw, l(0,0,4,4), l(0,0,3,3)\nmov r1.x, CB0[0][0].w\nbfi r1.xy, l(4, 1, 0, 0), r1.zwzz, r1.xyxx, l(0, 0, 0, 0)\nmov r2.y, vThreadID.y\niadd r1.xy, r1.xyxx, r2.xyxx\nudiv r1.zw, null, r1.xxxy, l(0, 0, 80, 16)\nimad r0.x, r1.w, r0.x, r1.z\niadd r0.x, r0.x, r0.z\nimad r0.zw, -r1.zzzw, l(0, 0, 80, 16), r1.xxxy\nif_nz r0.y\n  uge r0.y, r0.z, l(40)\n  movc r0.y, r0.y, l(-40), l(40)\n  iadd r0.z, r0.y, r0.z\nendif \nimad r0.y, r0.w, l(80), r0.z\nimad r0.x, r0.x, l(1280), r0.y\nudiv null, r0.x, r0.x, l(0x00280000)\nishl r0.x, r0.x, l(2)\nstore_raw U0[0].xyzw, r0.x, CB0[0][0].xxxx\niadd r0.y, r0.x, l(16)\nstore_raw U0[0].xyzw, r0.y, CB0[0][0].xxxx\nret \n// Approximately 34 instruction slots used\n#endif\n\nconst BYTE resolve_clear_32bpp_cs[] =\n{\n     68,  88,  66,  67,  17, 240, \n    231, 151,  85, 182, 191,  42, \n    253, 100,  77, 232,  66,  76, \n     29,  83,   1,   0,   0,   0, \n    148,   7,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     64,   2,   0,   0,  80,   2, \n      0,   0,  96,   2,   0,   0, \n    248,   6,   0,   0,  82,  68, \n     69,  70,   4,   2,   0,   0, \n      1,   0,   0,   0, 172,   0, \n      0,   0,   2,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    219,   1,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,   0,   8,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 157,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 120, 101,  95, 114, \n    101, 115, 111, 108, 118, 101, \n     95, 101, 100, 114,  97, 109, \n      0, 112, 117, 115, 104,  95, \n     99, 111, 110, 115, 116, 115, \n     95, 120, 101,   0, 157,   0, \n      0,   0,   3,   0,   0,   0, \n    196,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  60,   1, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,   2,   0, \n      0,   0,  92,   1,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 128,   1,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    156,   1,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    192,   1,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 156,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 120, 101, \n     95, 114, 101, 115, 111, 108, \n    118, 101,  95,  99, 108, 101, \n     97, 114,  95, 118,  97, 108, \n    117, 101,   0, 117, 105, 110, \n    116,  50,   0, 171, 171, 171, \n      1,   0,  19,   0,   1,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  83,   1,   0,   0, \n    120, 101,  95, 114, 101, 115, \n    111, 108, 118, 101,  95, 101, \n    100, 114,  97, 109,  95, 105, \n    110, 102, 111,   0, 100, 119, \n    111, 114, 100,   0,   0,   0, \n     19,   0,   1,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    150,   1,   0,   0, 120, 101, \n     95, 114, 101, 115, 111, 108, \n    118, 101,  95,  99, 111, 111, \n    114, 100, 105, 110,  97, 116, \n    101,  95, 105, 110, 102, 111, \n      0,  77, 105,  99, 114, 111, \n    115, 111, 102, 116,  32,  40, \n     82,  41,  32,  72,  76,  83, \n     76,  32,  83, 104,  97, 100, \n    101, 114,  32,  67, 111, 109, \n    112, 105, 108, 101, 114,  32, \n     49,  48,  46,  49,   0, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n    144,   4,   0,   0,  81,   0, \n      5,   0,  36,   1,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n     50,   0,   2,   0, 104,   0, \n      0,   2,   3,   0,   0,   0, \n    155,   0,   0,   4,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  12,  50,   0,  16,   0, \n      0,   0,   0,   0, 166, 138, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0,   0,  16, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  58, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0, 138,   0, \n      0,  17, 194,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     10,   0,   0,   0,   5,   0, \n      0,   0, 166, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     80,   0,   0,  10, 194,   0, \n     16,   0,   1,   0,   0,   0, \n    166,  10,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  41,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     80,   0,   0,   6,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,   2,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  11, \n     66,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     11,   0,   0,   0,   1,  64, \n      0,   0,  13,   0,   0,   0, \n     42, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  55,   0, \n      0,  15, 194,   0,  16,   0, \n      1,   0,   0,   0, 166,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  54,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  58, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  17, \n     50,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 230,  10, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n      2,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     78,   0,   0,  11, 194,   0, \n     16,   0,   1,   0,   0,   0, \n      0, 208,   0,   0,   6,   4, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     80,   0,   0,   0,  16,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     35,   0,   0,  13, 194,   0, \n     16,   0,   0,   0,   0,   0, \n    166,  14,  16, 128,  65,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     80,   0,   0,   0,  16,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      0,   0,   0,   0,  80,   0, \n      0,   7,  34,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  40,   0, \n      0,   0,  55,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0, 216, 255, 255, 255, \n      1,  64,   0,   0,  40,   0, \n      0,   0,  30,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  80,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   5, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  78,   0, \n      0,   8,   0, 208,   0,   0, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,  40,   0, \n     41,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0, 166,   0, \n      0,  10, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   6, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n    166,   0,   0,  10, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      6, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  62,   0, \n      0,   1,  83,  84,  65,  84, \n    148,   0,   0,   0,  34,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     11,   0,   0,   0,   8,   0, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/resolve_clear_32bpp_scaled_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint2 xe_resolve_clear_value;      // Offset:    0 Size:     8\n//   uint xe_resolve_edram_info;        // Offset:    8 Size:     4\n//   uint xe_resolve_coordinate_info;   // Offset:   12 Size:     4\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_resolve_edram                      UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][1], immediateIndexed, space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xy\ndcl_temps 4\ndcl_thread_group 8, 8, 1\nand r0.xy, CB0[0][0].zzzz, l(1023, 4096, 0, 0)\nushr r1.y, CB0[0][0].w, l(4)\nubfe r2.xyzw, l(2, 3, 3, 11), l(10, 16, 19, 5), CB0[0][0].zwww\nimul null, r0.z, r2.y, r2.w\nuge r1.zw, r2.xxxx, l(0, 0, 2, 1)\nand r1.zw, r1.zzzw, l(0, 0, 1, 1)\nishl r0.z, r0.z, r1.z\nuge r0.z, vThreadID.x, r0.z\nif_nz r0.z\n  ret \nendif \nubfe r0.z, l(11), l(13), CB0[0][0].z\nmov r1.x, CB0[0][0].w\nbfi r1.xy, l(4, 1, 0, 0), l(3, 3, 0, 0), r1.xyxx, l(0, 0, 0, 0)\nimul null, r1.xy, r2.yzyy, r1.xyxx\nishl r3.x, vThreadID.x, l(3)\nishl r1.xy, r1.xyxx, r1.zwzz\nmov r3.y, vThreadID.y\niadd r1.xy, r1.xyxx, r3.xyxx\nimul null, r1.zw, r2.yyyz, l(0, 0, 80, 16)\nudiv r2.xy, null, r1.xyxx, r1.zwzz\nimad r0.x, r2.y, r0.x, r2.x\niadd r0.x, r0.x, r0.z\nimad r0.zw, -r2.xxxy, r1.zzzw, r1.xxxy\nif_nz r0.y\n  ushr r0.y, r1.z, l(1)\n  uge r1.x, r0.z, r0.y\n  ineg r1.y, r0.y\n  movc r0.y, r1.x, r1.y, r0.y\n  iadd r0.z, r0.y, r0.z\nendif \nimul null, r0.y, r1.w, r1.z\nimad r0.z, r0.w, r1.z, r0.z\nimad r0.x, r0.x, r0.y, r0.z\nishl r0.y, r0.y, l(11)\nudiv null, r0.x, r0.x, r0.y\nishl r0.x, r0.x, l(2)\nstore_raw U0[0].xyzw, r0.x, CB0[0][0].xxxx\niadd r0.y, r0.x, l(16)\nstore_raw U0[0].xyzw, r0.y, CB0[0][0].xxxx\nret \n// Approximately 41 instruction slots used\n#endif\n\nconst BYTE resolve_clear_32bpp_scaled_cs[] =\n{\n     68,  88,  66,  67,  27,  65, \n     19,  89,  95, 235,  88, 246, \n    162, 208, 213,  57, 175, 159, \n      3,  48,   1,   0,   0,   0, \n     76,   8,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     64,   2,   0,   0,  80,   2, \n      0,   0,  96,   2,   0,   0, \n    176,   7,   0,   0,  82,  68, \n     69,  70,   4,   2,   0,   0, \n      1,   0,   0,   0, 172,   0, \n      0,   0,   2,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    219,   1,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,   0,   8,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 157,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 120, 101,  95, 114, \n    101, 115, 111, 108, 118, 101, \n     95, 101, 100, 114,  97, 109, \n      0, 112, 117, 115, 104,  95, \n     99, 111, 110, 115, 116, 115, \n     95, 120, 101,   0, 157,   0, \n      0,   0,   3,   0,   0,   0, \n    196,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  60,   1, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,   2,   0, \n      0,   0,  92,   1,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 128,   1,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    156,   1,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    192,   1,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 156,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 120, 101, \n     95, 114, 101, 115, 111, 108, \n    118, 101,  95,  99, 108, 101, \n     97, 114,  95, 118,  97, 108, \n    117, 101,   0, 117, 105, 110, \n    116,  50,   0, 171, 171, 171, \n      1,   0,  19,   0,   1,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  83,   1,   0,   0, \n    120, 101,  95, 114, 101, 115, \n    111, 108, 118, 101,  95, 101, \n    100, 114,  97, 109,  95, 105, \n    110, 102, 111,   0, 100, 119, \n    111, 114, 100,   0,   0,   0, \n     19,   0,   1,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    150,   1,   0,   0, 120, 101, \n     95, 114, 101, 115, 111, 108, \n    118, 101,  95,  99, 111, 111, \n    114, 100, 105, 110,  97, 116, \n    101,  95, 105, 110, 102, 111, \n      0,  77, 105,  99, 114, 111, \n    115, 111, 102, 116,  32,  40, \n     82,  41,  32,  72,  76,  83, \n     76,  32,  83, 104,  97, 100, \n    101, 114,  32,  67, 111, 109, \n    112, 105, 108, 101, 114,  32, \n     49,  48,  46,  49,   0, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n     72,   5,   0,   0,  81,   0, \n      5,   0,  82,   1,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n     50,   0,   2,   0, 104,   0, \n      0,   2,   4,   0,   0,   0, \n    155,   0,   0,   4,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  12,  50,   0,  16,   0, \n      0,   0,   0,   0, 166, 138, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0,   0,  16, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  58, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0, 138,   0, \n      0,  17, 242,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  16,   0,   0,   0, \n     19,   0,   0,   0,   5,   0, \n      0,   0, 230, 143,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0,  66,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  80,   0,   0,  10, \n    194,   0,  16,   0,   1,   0, \n      0,   0,   6,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,  10, 194,   0, \n     16,   0,   1,   0,   0,   0, \n    166,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,  41,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  80,   0,   0,   6, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,   2,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  62,   0,   0,   1, \n     21,   0,   0,   1, 138,   0, \n      0,  11,  66,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  11,   0,   0,   0, \n      1,  64,   0,   0,  13,   0, \n      0,   0,  42, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  20,  50,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   4,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0,  50,   0,  16,   0, \n      1,   0,   0,   0, 150,   5, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  41,   0,   0,   6, \n     18,   0,  16,   0,   3,   0, \n      0,   0,  10,   0,   2,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  41,   0,   0,   7, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0, 230,  10, \n     16,   0,   1,   0,   0,   0, \n     54,   0,   0,   4,  34,   0, \n     16,   0,   3,   0,   0,   0, \n     26,   0,   2,   0,  30,   0, \n      0,   7,  50,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   3,   0, \n      0,   0,  38,   0,   0,  11, \n      0, 208,   0,   0, 194,   0, \n     16,   0,   1,   0,   0,   0, \n     86,   9,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  80,   0,   0,   0, \n     16,   0,   0,   0,  78,   0, \n      0,   8,  50,   0,  16,   0, \n      2,   0,   0,   0,   0, 208, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0, 230,  10, \n     16,   0,   1,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     30,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,  10, 194,   0,  16,   0, \n      0,   0,   0,   0,   6,   4, \n     16, 128,  65,   0,   0,   0, \n      2,   0,   0,   0, 166,  14, \n     16,   0,   1,   0,   0,   0, \n      6,   4,  16,   0,   1,   0, \n      0,   0,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     80,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  40,   0, \n      0,   5,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     55,   0,   0,   9,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  38,   0,   0,   8, \n      0, 208,   0,   0,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  11,   0, \n      0,   0,  78,   0,   0,   8, \n      0, 208,   0,   0,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0, 166,   0,   0,  10, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   6, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0, 166,   0, \n      0,  10, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,   6, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  62,   0,   0,   1, \n     83,  84,  65,  84, 148,   0, \n      0,   0,  41,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  18,   0, \n      0,   0,   9,   0,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/resolve_clear_64bpp_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint2 xe_resolve_clear_value;      // Offset:    0 Size:     8\n//   uint xe_resolve_edram_info;        // Offset:    8 Size:     4\n//   uint xe_resolve_coordinate_info;   // Offset:   12 Size:     4\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_resolve_edram                      UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][1], immediateIndexed, space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xy\ndcl_temps 3\ndcl_thread_group 8, 8, 1\nand r0.x, CB0[0][0].z, l(1023)\nushr r1.y, CB0[0][0].w, l(4)\nubfe r0.yz, l(0, 2, 11, 0), l(0, 10, 5, 0), CB0[0][0].zzwz\nuge r0.yw, r0.yyyy, l(0, 2, 0, 1)\nand r1.z, r0.y, l(1)\nishl r0.z, r0.z, r1.z\nuge r0.z, vThreadID.x, r0.z\nif_nz r0.z\n  ret \nendif \nubfe r0.z, l(11), l(13), CB0[0][0].z\nishl r2.x, vThreadID.x, l(3)\nmovc r0.yw, r0.yyyw, l(0,4,0,4), l(0,3,0,3)\nmov r1.x, CB0[0][0].w\nbfi r0.yw, l(0, 4, 0, 1), r0.yyyw, r1.xxxy, l(0, 0, 0, 0)\nmov r2.y, vThreadID.y\niadd r0.yw, r0.yyyw, r2.xxxy\nudiv r1.xy, null, r0.ywyy, l(40, 16, 0, 0)\nimad r0.x, r1.y, r0.x, r1.x\niadd r0.x, r0.x, r0.z\nimad r0.yz, -r1.xxyx, l(0, 40, 16, 0), r0.yywy\nimad r0.y, r0.z, l(40), r0.y\nishl r0.y, r0.y, l(1)\nimad r0.x, r0.x, l(1280), r0.y\nudiv null, r0.x, r0.x, l(0x00280000)\nishl r0.x, r0.x, l(2)\nstore_raw U0[0].xyzw, r0.x, CB0[0][0].xyxy\niadd r0.yzw, r0.xxxx, l(0, 16, 32, 48)\nstore_raw U0[0].xyzw, r0.y, CB0[0][0].xyxy\nstore_raw U0[0].xyzw, r0.z, CB0[0][0].xyxy\nstore_raw U0[0].xyzw, r0.w, CB0[0][0].xyxy\nret \n// Approximately 32 instruction slots used\n#endif\n\nconst BYTE resolve_clear_64bpp_cs[] =\n{\n     68,  88,  66,  67,  94, 177, \n    200,  99,  37, 217, 178,  40, \n     12, 100, 144, 225, 123,  43, \n    123,  61,   1,   0,   0,   0, \n    148,   7,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     64,   2,   0,   0,  80,   2, \n      0,   0,  96,   2,   0,   0, \n    248,   6,   0,   0,  82,  68, \n     69,  70,   4,   2,   0,   0, \n      1,   0,   0,   0, 172,   0, \n      0,   0,   2,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    219,   1,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,   0,   8,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 157,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 120, 101,  95, 114, \n    101, 115, 111, 108, 118, 101, \n     95, 101, 100, 114,  97, 109, \n      0, 112, 117, 115, 104,  95, \n     99, 111, 110, 115, 116, 115, \n     95, 120, 101,   0, 157,   0, \n      0,   0,   3,   0,   0,   0, \n    196,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  60,   1, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,   2,   0, \n      0,   0,  92,   1,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 128,   1,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    156,   1,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    192,   1,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 156,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 120, 101, \n     95, 114, 101, 115, 111, 108, \n    118, 101,  95,  99, 108, 101, \n     97, 114,  95, 118,  97, 108, \n    117, 101,   0, 117, 105, 110, \n    116,  50,   0, 171, 171, 171, \n      1,   0,  19,   0,   1,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  83,   1,   0,   0, \n    120, 101,  95, 114, 101, 115, \n    111, 108, 118, 101,  95, 101, \n    100, 114,  97, 109,  95, 105, \n    110, 102, 111,   0, 100, 119, \n    111, 114, 100,   0,   0,   0, \n     19,   0,   1,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    150,   1,   0,   0, 120, 101, \n     95, 114, 101, 115, 111, 108, \n    118, 101,  95,  99, 111, 111, \n    114, 100, 105, 110,  97, 116, \n    101,  95, 105, 110, 102, 111, \n      0,  77, 105,  99, 114, 111, \n    115, 111, 102, 116,  32,  40, \n     82,  41,  32,  72,  76,  83, \n     76,  32,  83, 104,  97, 100, \n    101, 114,  32,  67, 111, 109, \n    112, 105, 108, 101, 114,  32, \n     49,  48,  46,  49,   0, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n    144,   4,   0,   0,  81,   0, \n      5,   0,  36,   1,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n     50,   0,   2,   0, 104,   0, \n      0,   2,   3,   0,   0,   0, \n    155,   0,   0,   4,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n    255,   3,   0,   0,  85,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  58, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0, 138,   0, \n      0,  17,  98,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,  11,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0, 166, 139,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     80,   0,   0,  10, 162,   0, \n     16,   0,   0,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  41,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     80,   0,   0,   6,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,   2,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  11, \n     66,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     11,   0,   0,   0,   1,  64, \n      0,   0,  13,   0,   0,   0, \n     42, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  55,   0, \n      0,  15, 162,   0,  16,   0, \n      0,   0,   0,   0,  86,  13, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,  54,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  58, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  17, \n    162,   0,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  86,  13, \n     16,   0,   0,   0,   0,   0, \n      6,   4,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n      2,   0,  30,   0,   0,   7, \n    162,   0,  16,   0,   0,   0, \n      0,   0,  86,  13,  16,   0, \n      0,   0,   0,   0,   6,   4, \n     16,   0,   2,   0,   0,   0, \n     78,   0,   0,  11,  50,   0, \n     16,   0,   1,   0,   0,   0, \n      0, 208,   0,   0, 214,   5, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,  40,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     35,   0,   0,  13,  98,   0, \n     16,   0,   0,   0,   0,   0, \n      6,   1,  16, 128,  65,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  40,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  86,   7,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  40,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   5,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  78,   0,   0,   8, \n      0, 208,   0,   0,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,  40,   0,  41,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0, 166,   0,   0,  10, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  70, 132,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  10, 226,   0, \n     16,   0,   0,   0,   0,   0, \n      6,   0,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,  32,   0,   0,   0, \n     48,   0,   0,   0, 166,   0, \n      0,  10, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  70, 132, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 166,   0,   0,  10, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  70, 132,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    166,   0,   0,  10, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     70, 132,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  62,   0, \n      0,   1,  83,  84,  65,  84, \n    148,   0,   0,   0,  32,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     11,   0,   0,   0,   7,   0, \n      0,   0,   2,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   4,   0, \n      0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/resolve_clear_64bpp_scaled_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint2 xe_resolve_clear_value;      // Offset:    0 Size:     8\n//   uint xe_resolve_edram_info;        // Offset:    8 Size:     4\n//   uint xe_resolve_coordinate_info;   // Offset:   12 Size:     4\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_resolve_edram                      UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][1], immediateIndexed, space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xy\ndcl_temps 4\ndcl_thread_group 8, 8, 1\nand r0.x, CB0[0][0].z, l(1023)\nushr r1.y, CB0[0][0].w, l(4)\nubfe r2.xyzw, l(2, 3, 3, 11), l(10, 16, 19, 5), CB0[0][0].zwww\nimul null, r0.y, r2.y, r2.w\nuge r0.zw, r2.xxxx, l(0, 0, 2, 1)\nand r0.zw, r0.zzzw, l(0, 0, 1, 1)\nishl r0.y, r0.y, r0.z\nuge r0.y, vThreadID.x, r0.y\nif_nz r0.y\n  ret \nendif \nubfe r0.y, l(11), l(13), CB0[0][0].z\nmov r1.x, CB0[0][0].w\nbfi r1.xy, l(4, 1, 0, 0), l(3, 3, 0, 0), r1.xyxx, l(0, 0, 0, 0)\nimul null, r1.xy, r2.yzyy, r1.xyxx\nishl r3.x, vThreadID.x, l(3)\nishl r0.zw, r1.xxxy, r0.zzzw\nmov r3.y, vThreadID.y\niadd r0.zw, r0.zzzw, r3.xxxy\nimul null, r1.yz, r2.yyzy, l(0, 80, 16, 0)\nushr r1.x, r1.y, l(1)\nudiv r2.xy, null, r0.zwzz, r1.xzxx\nimad r0.x, r2.y, r0.x, r2.x\niadd r0.x, r0.x, r0.y\nimad r0.yz, -r2.xxyx, r1.xxzx, r0.zzwz\nimul null, r0.w, r1.z, r1.y\nimad r0.y, r0.z, r1.x, r0.y\nishl r0.y, r0.y, l(1)\nimad r0.x, r0.x, r0.w, r0.y\nishl r0.y, r0.w, l(11)\nudiv null, r0.x, r0.x, r0.y\nishl r0.x, r0.x, l(2)\nstore_raw U0[0].xyzw, r0.x, CB0[0][0].xyxy\niadd r0.yzw, r0.xxxx, l(0, 16, 32, 48)\nstore_raw U0[0].xyzw, r0.y, CB0[0][0].xyxy\nstore_raw U0[0].xyzw, r0.z, CB0[0][0].xyxy\nstore_raw U0[0].xyzw, r0.w, CB0[0][0].xyxy\nret \n// Approximately 38 instruction slots used\n#endif\n\nconst BYTE resolve_clear_64bpp_scaled_cs[] =\n{\n     68,  88,  66,  67, 141, 173, \n     58, 103,  65, 194, 224, 243, \n     67, 217, 210,  75, 102,  25, \n    195, 205,   1,   0,   0,   0, \n     56,   8,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     64,   2,   0,   0,  80,   2, \n      0,   0,  96,   2,   0,   0, \n    156,   7,   0,   0,  82,  68, \n     69,  70,   4,   2,   0,   0, \n      1,   0,   0,   0, 172,   0, \n      0,   0,   2,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    219,   1,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,   0,   8,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 157,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 120, 101,  95, 114, \n    101, 115, 111, 108, 118, 101, \n     95, 101, 100, 114,  97, 109, \n      0, 112, 117, 115, 104,  95, \n     99, 111, 110, 115, 116, 115, \n     95, 120, 101,   0, 157,   0, \n      0,   0,   3,   0,   0,   0, \n    196,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  60,   1, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,   2,   0, \n      0,   0,  92,   1,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 128,   1,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    156,   1,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    192,   1,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 156,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 120, 101, \n     95, 114, 101, 115, 111, 108, \n    118, 101,  95,  99, 108, 101, \n     97, 114,  95, 118,  97, 108, \n    117, 101,   0, 117, 105, 110, \n    116,  50,   0, 171, 171, 171, \n      1,   0,  19,   0,   1,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  83,   1,   0,   0, \n    120, 101,  95, 114, 101, 115, \n    111, 108, 118, 101,  95, 101, \n    100, 114,  97, 109,  95, 105, \n    110, 102, 111,   0, 100, 119, \n    111, 114, 100,   0,   0,   0, \n     19,   0,   1,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    150,   1,   0,   0, 120, 101, \n     95, 114, 101, 115, 111, 108, \n    118, 101,  95,  99, 111, 111, \n    114, 100, 105, 110,  97, 116, \n    101,  95, 105, 110, 102, 111, \n      0,  77, 105,  99, 114, 111, \n    115, 111, 102, 116,  32,  40, \n     82,  41,  32,  72,  76,  83, \n     76,  32,  83, 104,  97, 100, \n    101, 114,  32,  67, 111, 109, \n    112, 105, 108, 101, 114,  32, \n     49,  48,  46,  49,   0, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n     52,   5,   0,   0,  81,   0, \n      5,   0,  77,   1,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n     50,   0,   2,   0, 104,   0, \n      0,   2,   4,   0,   0,   0, \n    155,   0,   0,   4,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n    255,   3,   0,   0,  85,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  58, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0, 138,   0, \n      0,  17, 242,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  16,   0,   0,   0, \n     19,   0,   0,   0,   5,   0, \n      0,   0, 230, 143,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  80,   0,   0,  10, \n    194,   0,  16,   0,   0,   0, \n      0,   0,   6,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,  10, 194,   0, \n     16,   0,   0,   0,   0,   0, \n    166,  14,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,  41,   0, \n      0,   7,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  80,   0,   0,   6, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,   2,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  62,   0,   0,   1, \n     21,   0,   0,   1, 138,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  11,   0,   0,   0, \n      1,  64,   0,   0,  13,   0, \n      0,   0,  42, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  20,  50,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   4,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0,  50,   0,  16,   0, \n      1,   0,   0,   0, 150,   5, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  41,   0,   0,   6, \n     18,   0,  16,   0,   3,   0, \n      0,   0,  10,   0,   2,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  41,   0,   0,   7, \n    194,   0,  16,   0,   0,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0, 166,  14, \n     16,   0,   0,   0,   0,   0, \n     54,   0,   0,   4,  34,   0, \n     16,   0,   3,   0,   0,   0, \n     26,   0,   2,   0,  30,   0, \n      0,   7, 194,   0,  16,   0, \n      0,   0,   0,   0, 166,  14, \n     16,   0,   0,   0,   0,   0, \n      6,   4,  16,   0,   3,   0, \n      0,   0,  38,   0,   0,  11, \n      0, 208,   0,   0,  98,   0, \n     16,   0,   1,   0,   0,   0, \n     86,   6,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  80,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  78,   0,   0,   8, \n     50,   0,  16,   0,   2,   0, \n      0,   0,   0, 208,   0,   0, \n    230,  10,  16,   0,   0,   0, \n      0,   0, 134,   0,  16,   0, \n      1,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  35,   0,   0,  10, \n     98,   0,  16,   0,   0,   0, \n      0,   0,   6,   1,  16, 128, \n     65,   0,   0,   0,   2,   0, \n      0,   0,   6,   2,  16,   0, \n      1,   0,   0,   0, 166,  11, \n     16,   0,   0,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0, 130,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  41,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     41,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     11,   0,   0,   0,  78,   0, \n      0,   8,   0, 208,   0,   0, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     41,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0, 166,   0, \n      0,  10, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  70, 132, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    226,   0,  16,   0,   0,   0, \n      0,   0,   6,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,  32,   0, \n      0,   0,  48,   0,   0,   0, \n    166,   0,   0,  10, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     70, 132,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 166,   0, \n      0,  10, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  70, 132, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 166,   0,   0,  10, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  70, 132,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  83,  84, \n     65,  84, 148,   0,   0,   0, \n     38,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  17,   0,   0,   0, \n      8,   0,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/resolve_fast_32bpp_1x2xmsaa_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_resolve_edram_info;        // Offset:    0 Size:     4\n//   uint xe_resolve_coordinate_info;   // Offset:    4 Size:     4\n//   uint xe_resolve_dest_info;         // Offset:    8 Size:     4\n//   uint xe_resolve_dest_coordinate_info;// Offset:   12 Size:     4\n//   uint xe_resolve_dest_base;         // Offset:   16 Size:     4\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_resolve_edram                  texture    byte         r/o      T0             t0      1 \n// xe_resolve_dest                       UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][2], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xy\ndcl_temps 9\ndcl_thread_group 8, 8, 1\nubfe r0.x, l(11), l(5), CB0[0][0].y\nand r1.xyzw, CB0[0][0].xxzz, l(1023, 4096, 7, 8)\nand r0.yz, CB0[0][0].zzwz, l(0, 0x01000000, 1023, 0)\nushr r2.xyzw, CB0[0][0].ywww, l(4, 10, 20, 24)\nuge r0.x, vThreadID.x, r0.x\nif_nz r0.x\n  ret \nendif \nmov r3.x, CB0[0][0].y\nmov r3.y, r2.x\nbfi r0.xw, l(4, 0, 0, 1), l(3, 0, 0, 3), r3.xxxy, l(0, 0, 0, 0)\nbfi r3.xyzw, l(4, 4, 4, 4), l(3, 3, 3, 3), r2.wzww, l(0, 0, 0, 0)\nubfe r2.xzw, l(2, 0, 3, 11), l(10, 0, 28, 13), CB0[0][0].xxwx\nishl r4.y, vThreadID.x, l(3)\nmov r4.xzw, vThreadID.yyyy\niadd r0.xw, r0.xxxw, r4.yyyw\nuge r5.x, l(3), r2.z\nif_z r5.x\n  ieq r5.x, r2.z, l(5)\n  if_nz r5.x\n    mov r2.z, l(2)\n  else \n    mov r2.z, l(0)\n  endif \nendif \nuge r5.xy, r2.xxxx, l(2, 1, 0, 0)\nand r5.xy, r5.xyxx, l(1, 1, 0, 0)\nishl r0.xw, r0.xxxw, r5.xxxy\nushr r2.x, r2.z, l(1)\nand r2.xz, r2.xxzx, l(1, 0, 1, 0)\niadd r0.xw, r0.xxxw, r2.xxxz\nudiv r2.xz, null, r0.xxwx, l(80, 0, 16, 0)\nimad r1.x, r2.z, r1.x, r2.x\niadd r1.x, r1.x, r2.w\nimad r0.xw, -r2.xxxz, l(80, 0, 0, 16), r0.xxxw\nif_nz r1.y\n  uge r1.y, r0.x, l(40)\n  movc r1.y, r1.y, l(-40), l(40)\n  iadd r0.x, r0.x, r1.y\nendif \nimad r0.x, r0.w, l(80), r0.x\nimad r0.x, r1.x, l(1280), r0.x\nudiv null, r0.x, r0.x, l(0x00280000)\nishl r0.x, r0.x, l(2)\nld_raw r5.xyzw, r0.x, T0[0].xyzw\niadd r0.x, r0.x, l(16)\nld_raw r6.xyzw, r0.x, T0[0].xyzw\nif_nz r0.y\n  ubfe r0.x, l(4), l(24), CB0[0][0].x\n  switch r0.x\n    case l(0)\n    case l(1)\n    and r7.xyzw, r5.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n    bfi r7.xyzw, l(8, 8, 8, 8), l(16, 16, 16, 16), r5.xyzw, r7.xyzw\n    ubfe r8.xyzw, l(8, 8, 8, 8), l(16, 16, 16, 16), r5.xyzw\n    iadd r5.xyzw, r7.xyzw, r8.xyzw\n    and r7.xyzw, r6.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n    bfi r7.xyzw, l(8, 8, 8, 8), l(16, 16, 16, 16), r6.xyzw, r7.xyzw\n    ubfe r8.xyzw, l(8, 8, 8, 8), l(16, 16, 16, 16), r6.xyzw\n    iadd r6.xyzw, r7.xyzw, r8.xyzw\n    break \n    case l(2)\n    case l(3)\n    case l(10)\n    case l(12)\n    and r7.xyzw, r5.xyzw, l(0xc00ffc00, 0xc00ffc00, 0xc00ffc00, 0xc00ffc00)\n    bfi r7.xyzw, l(10, 10, 10, 10), l(20, 20, 20, 20), r5.xyzw, r7.xyzw\n    ubfe r8.xyzw, l(10, 10, 10, 10), l(20, 20, 20, 20), r5.xyzw\n    iadd r5.xyzw, r7.xyzw, r8.xyzw\n    and r7.xyzw, r6.xyzw, l(0xc00ffc00, 0xc00ffc00, 0xc00ffc00, 0xc00ffc00)\n    bfi r7.xyzw, l(10, 10, 10, 10), l(20, 20, 20, 20), r6.xyzw, r7.xyzw\n    ubfe r8.xyzw, l(10, 10, 10, 10), l(20, 20, 20, 20), r6.xyzw\n    iadd r6.xyzw, r7.xyzw, r8.xyzw\n    break \n    default \n    break \n  endswitch \nendif \niadd r3.xyzw, r3.xyzw, r4.xyzw\nif_nz r1.w\n  ubfe r0.x, l(3), l(4), CB0[0][0].z\n  bfi r0.y, l(10), l(1), r2.y, l(0)\n  ishr r0.w, r0.x, l(2)\n  ishr r2.xyzw, r3.wyww, l(4, 5, 1, 3)\n  imad r0.y, r0.w, r0.y, r2.x\n  imad r0.y, r0.y, r0.z, r2.y\n  bfi r0.x, l(2), l(5), r0.x, l(0)\n  bfi r1.x, l(2), l(3), r2.z, l(0)\n  iadd r0.x, r0.x, r1.x\n  bfi r0.x, l(25), l(7), r0.y, r0.x\n  xor r0.y, r0.w, r2.w\n  ubfe r0.w, l(2), l(3), r3.y\n  bfi r1.xy, l(1, 1, 0, 0), l(1, 11, 0, 0), r0.yyyy, l(0, 0, 0, 0)\n  xor r0.y, r0.w, r1.x\n  bfi r0.w, l(1), l(4), r3.w, l(0)\n  imad r0.y, r0.y, l(64), r0.w\n  iadd r0.y, r1.y, r0.y\n  ibfe r0.xw, l(27, 0, 0, 24), l(3, 0, 0, 6), r0.xxxx\n  bfi r0.x, l(3), l(8), r0.x, r0.y\n  bfi r0.x, l(20), l(12), r0.w, r0.x\nelse \n  ishr r2.xyzw, r3.xyzw, l(5, 5, 1, 4)\n  imad r0.y, r2.x, r0.z, r2.y\n  bfi r0.zw, l(0, 0, 3, 1), l(0, 0, 3, 11), r2.zzzw, l(0, 0, 0, 0)\n  imad r0.y, r0.y, l(64), r0.z\n  ubfe r0.z, l(2), l(3), r3.y\n  ishr r1.x, r3.w, l(3)\n  bfi r1.x, l(1), l(1), r1.x, l(0)\n  xor r0.z, r0.z, r1.x\n  bfi r1.x, l(1), l(4), r3.w, l(0)\n  imad r0.z, r0.z, l(64), r1.x\n  iadd r0.z, r0.w, r0.z\n  ibfe r0.yw, l(0, 27, 0, 24), l(0, 3, 0, 6), r0.yyyy\n  bfi r0.y, l(3), l(8), r0.y, r0.z\n  bfi r0.x, l(20), l(12), r0.w, r0.y\nendif \niadd r0.x, r0.x, CB0[0][1].x\nieq r0.yzw, r1.zzzz, l(0, 1, 2, 3)\nor r0.yz, r0.zzwz, r0.yyzy\nif_nz r0.y\n  ishl r1.xyzw, r5.xyzw, l(8, 8, 8, 8)\n  and r1.xyzw, r1.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r2.xyzw, r5.xyzw, l(8, 8, 8, 8)\n  and r2.xyzw, r2.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r5.xyzw, r1.xyzw, r2.xyzw\nendif \nif_nz r0.z\n  ushr r1.xyzw, r5.xyzw, l(16, 16, 16, 16)\n  bfi r5.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r5.xyzw, r1.xyzw\nendif \nstore_raw U0[0].xyzw, r0.x, r5.xyzw\niadd r0.x, r0.x, l(32)\nif_nz r0.y\n  ishl r1.xyzw, r6.xyzw, l(8, 8, 8, 8)\n  and r1.xyzw, r1.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r2.xyzw, r6.xyzw, l(8, 8, 8, 8)\n  and r2.xyzw, r2.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r6.xyzw, r1.xyzw, r2.xyzw\nendif \nif_nz r0.z\n  ushr r1.xyzw, r6.xyzw, l(16, 16, 16, 16)\n  bfi r6.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r6.xyzw, r1.xyzw\nendif \nstore_raw U0[0].xyzw, r0.x, r6.xyzw\nret \n// Approximately 145 instruction slots used\n#endif\n\nconst BYTE resolve_fast_32bpp_1x2xmsaa_cs[] =\n{\n     68,  88,  66,  67, 191, 115, \n    177, 193,  66,  70,  48,  59, \n     33,  92,  57, 165, 198, 247, \n     18, 216,   1,   0,   0,   0, \n     60,  22,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n    208,   2,   0,   0, 224,   2, \n      0,   0, 240,   2,   0,   0, \n    160,  21,   0,   0,  82,  68, \n     69,  70, 148,   2,   0,   0, \n      1,   0,   0,   0, 228,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    105,   2,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 197,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 213,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 114, 101, 115, \n    111, 108, 118, 101,  95, 101, \n    100, 114,  97, 109,   0, 120, \n    101,  95, 114, 101, 115, 111, \n    108, 118, 101,  95, 100, 101, \n    115, 116,   0, 112, 117, 115, \n    104,  95,  99, 111, 110, 115, \n    116, 115,  95, 120, 101,   0, \n    213,   0,   0,   0,   5,   0, \n      0,   0, 252,   0,   0,   0, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    196,   1,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 224,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,   4,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 224,   1,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  31,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    224,   1,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     52,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 224,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  84,   2, \n      0,   0,  16,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 224,   1,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 114, \n    101, 115, 111, 108, 118, 101, \n     95, 101, 100, 114,  97, 109, \n     95, 105, 110, 102, 111,   0, \n    100, 119, 111, 114, 100,   0, \n      0,   0,  19,   0,   1,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 218,   1,   0,   0, \n    120, 101,  95, 114, 101, 115, \n    111, 108, 118, 101,  95,  99, \n    111, 111, 114, 100, 105, 110, \n     97, 116, 101,  95, 105, 110, \n    102, 111,   0, 120, 101,  95, \n    114, 101, 115, 111, 108, 118, \n    101,  95, 100, 101, 115, 116, \n     95, 105, 110, 102, 111,   0, \n    120, 101,  95, 114, 101, 115, \n    111, 108, 118, 101,  95, 100, \n    101, 115, 116,  95,  99, 111, \n    111, 114, 100, 105, 110,  97, \n    116, 101,  95, 105, 110, 102, \n    111,   0, 120, 101,  95, 114, \n    101, 115, 111, 108, 118, 101, \n     95, 100, 101, 115, 116,  95, \n     98,  97, 115, 101,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n    168,  18,   0,   0,  81,   0, \n      5,   0, 170,   4,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n     50,   0,   2,   0, 104,   0, \n      0,   2,   9,   0,   0,   0, \n    155,   0,   0,   4,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,   0, 138,   0, \n      0,  11,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  11,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  26, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  12, 242,   0, \n     16,   0,   1,   0,   0,   0, \n      6, 138,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n      0,  16,   0,   0,   7,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  12,  98,   0, \n     16,   0,   0,   0,   0,   0, \n    166, 139,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   1, 255,   3, \n      0,   0,   0,   0,   0,   0, \n     85,   0,   0,  12, 242,   0, \n     16,   0,   2,   0,   0,   0, \n    214, 143,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   4,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  24,   0,   0,   0, \n     80,   0,   0,   6,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,   2,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1,  54,   0,   0,   7, \n     18,   0,  16,   0,   3,   0, \n      0,   0,  26, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  34,   0, \n     16,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0, 140,   0,   0,  20, \n    146,   0,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      6,   4,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   4,   0, \n      0,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0, 182,  15,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    138,   0,   0,  17, 210,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,   0,   0, \n      0,   0,  28,   0,   0,   0, \n     13,   0,   0,   0,   6, 131, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,   6, \n     34,   0,  16,   0,   4,   0, \n      0,   0,  10,   0,   2,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  54,   0,   0,   4, \n    210,   0,  16,   0,   4,   0, \n      0,   0,  86,   5,   2,   0, \n     30,   0,   0,   7, 146,   0, \n     16,   0,   0,   0,   0,   0, \n      6,  12,  16,   0,   0,   0, \n      0,   0,  86,  13,  16,   0, \n      4,   0,   0,   0,  80,   0, \n      0,   7,  18,   0,  16,   0, \n      5,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  31,   0,   0,   3, \n     10,   0,  16,   0,   5,   0, \n      0,   0,  32,   0,   0,   7, \n     18,   0,  16,   0,   5,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   5,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   5,   0,   0,   0, \n     54,   0,   0,   5,  66,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,  18,   0,   0,   1, \n     54,   0,   0,   5,  66,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     21,   0,   0,   1,  80,   0, \n      0,  10,  50,   0,  16,   0, \n      5,   0,   0,   0,   6,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n     50,   0,  16,   0,   5,   0, \n      0,   0,  70,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     41,   0,   0,   7, 146,   0, \n     16,   0,   0,   0,   0,   0, \n      6,  12,  16,   0,   0,   0, \n      0,   0,   6,   4,  16,   0, \n      5,   0,   0,   0,  85,   0, \n      0,   7,  18,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,  10, \n     82,   0,  16,   0,   2,   0, \n      0,   0,   6,   2,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 146,   0, \n     16,   0,   0,   0,   0,   0, \n      6,  12,  16,   0,   0,   0, \n      0,   0,   6,   8,  16,   0, \n      2,   0,   0,   0,  78,   0, \n      0,  11,  82,   0,  16,   0, \n      2,   0,   0,   0,   0, 208, \n      0,   0,   6,   3,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,  80,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     30,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,  35,   0, \n      0,  13, 146,   0,  16,   0, \n      0,   0,   0,   0,   6,   8, \n     16, 128,  65,   0,   0,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  80,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n      6,  12,  16,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  80,   0,   0,   7, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  40,   0,   0,   0, \n     55,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n    216, 255, 255, 255,   1,  64, \n      0,   0,  40,   0,   0,   0, \n     30,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  21,   0, \n      0,   1,  35,   0,   0,   9, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  80,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   0,   5,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  78,   0,   0,   8, \n      0, 208,   0,   0,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,  40,   0,  41,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  11,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n      1,  64,   0,   0,  24,   0, \n      0,   0,  10, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     76,   0,   0,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   0,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255, 140,   0,   0,  17, \n    242,   0,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,  10,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,  12,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 252,  15, 192,   0, 252, \n     15, 192,   0, 252,  15, 192, \n      0, 252,  15, 192, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   0, 252, \n     15, 192,   0, 252,  15, 192, \n      0, 252,  15, 192,   0, 252, \n     15, 192, 140,   0,   0,  17, \n    242,   0,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,   2,   0,   0,   1, \n     10,   0,   0,   1,   2,   0, \n      0,   1,  23,   0,   0,   1, \n     21,   0,   0,   1,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  31,   0,   4,   3, \n     58,   0,  16,   0,   1,   0, \n      0,   0, 138,   0,   0,  11, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     42, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  10,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     42,   0,   0,   7, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0, 118,  15, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   4,   0, \n      0,   0,   5,   0,   0,   0, \n      1,   0,   0,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   5,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  25,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     87,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0, 138,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0, 140,   0, \n      0,  20,  50,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  86,   5,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11, 130,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     64,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0, 139,   0, \n      0,  15, 146,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,  27,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  24,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   6,   0, \n      0,   0,   6,   0,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   8,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  18,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  20,   0, \n      0,   0,   1,  64,   0,   0, \n     12,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  18,   0,   0,   1, \n     42,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,   1,   0,   0,   0, \n      4,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  20, 194,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,  11,   0, \n      0,   0, 166,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     64,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n    138,   0,   0,   9,  66,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n     42,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     35,   0,   0,   9,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     64,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0, 139,   0, \n      0,  15, 162,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     27,   0,   0,   0,   0,   0, \n      0,   0,  24,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   6,   0, \n      0,   0,  86,   5,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   8,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  18,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  20,   0, \n      0,   0,   1,  64,   0,   0, \n     12,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     30,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  10, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     32,   0,   0,  10, 226,   0, \n     16,   0,   0,   0,   0,   0, \n    166,  10,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   2,   0,   0,   0, \n      3,   0,   0,   0,  60,   0, \n      0,   7,  98,   0,  16,   0, \n      0,   0,   0,   0, 166,  11, \n     16,   0,   0,   0,   0,   0, \n     86,   6,  16,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  21,   0,   0,   1, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  32,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,  85,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     21,   0,   0,   1, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     62,   0,   0,   1,  83,  84, \n     65,  84, 148,   0,   0,   0, \n    145,   0,   0,   0,   9,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  38,   0,   0,   0, \n     28,   0,   0,   0,   7,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   5,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/resolve_fast_32bpp_1x2xmsaa_scaled_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_resolve_edram_info;        // Offset:    0 Size:     4\n//   uint xe_resolve_coordinate_info;   // Offset:    4 Size:     4\n//   uint xe_resolve_dest_info;         // Offset:    8 Size:     4\n//   uint xe_resolve_dest_coordinate_info;// Offset:   12 Size:     4\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_resolve_edram                  texture    byte         r/o      T0             t0      1 \n// xe_resolve_dest                       UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][1], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xy\ndcl_temps 9\ndcl_thread_group 8, 8, 1\nand r0.xyzw, CB0[0][0].xxxz, l(1023, 4096, 0x20000000, 7)\nif_nz r0.z\n  ubfe r1.xy, l(2, 2, 0, 0), l(17, 20, 0, 0), CB0[0][0].yyyy\nelse \n  mov r1.xy, l(0,0,0,0)\nendif \nubfe r2.xyz, l(3, 3, 11, 0), l(16, 19, 5, 0), CB0[0][0].yyyy\nimul null, r0.z, r2.x, r2.z\nand r3.xyz, CB0[0][0].zzwz, l(8, 0x01000000, 1023, 0)\nushr r4.xyzw, CB0[0][0].ywww, l(4, 10, 20, 24)\nuge r0.z, vThreadID.x, r0.z\nif_nz r0.z\n  ret \nendif \nmov r5.x, CB0[0][0].y\nmov r5.y, r4.x\nbfi r1.zw, l(0, 0, 4, 1), l(0, 0, 3, 3), r5.xxxy, l(0, 0, 0, 0)\nbfi r2.zw, l(0, 0, 4, 4), l(0, 0, 3, 3), r4.wwwz, l(0, 0, 0, 0)\nubfe r4.xzw, l(2, 0, 3, 11), l(10, 0, 28, 13), CB0[0][0].xxwx\nishl r5.x, vThreadID.x, l(3)\numax r5.y, r1.y, vThreadID.y\nimad r1.yz, r1.zzwz, r2.xxyx, r5.xxyx\nuge r0.z, l(3), r4.z\nif_z r0.z\n  ieq r0.z, r4.z, l(5)\n  if_nz r0.z\n    mov r4.z, l(2)\n  else \n    mov r4.z, l(0)\n  endif \nendif \nuge r5.yw, r4.xxxx, l(0, 2, 0, 1)\nand r5.yw, r5.yyyw, l(0, 1, 0, 1)\nishl r1.yz, r1.yyzy, r5.yywy\nushr r4.x, r4.z, l(1)\nand r4.xz, r4.xxzx, l(1, 0, 1, 0)\niadd r1.yz, r1.yyzy, r4.xxzx\nimul null, r4.xz, r2.xxyx, l(80, 0, 16, 0)\nudiv r5.yw, null, r1.yyyz, r4.xxxz\nimad r0.x, r5.w, r0.x, r5.y\niadd r0.x, r0.x, r4.w\nimad r1.yz, -r5.yywy, r4.xxzx, r1.yyzy\nif_nz r0.y\n  ushr r0.y, r4.x, l(1)\n  uge r0.z, r1.y, r0.y\n  ineg r1.w, r0.y\n  movc r0.y, r0.z, r1.w, r0.y\n  iadd r1.y, r0.y, r1.y\nendif \nimul null, r0.y, r4.z, r4.x\nimad r0.z, r1.z, r4.x, r1.y\nimad r0.x, r0.x, r0.y, r0.z\nishl r0.y, r0.y, l(11)\nudiv null, r0.x, r0.x, r0.y\nishl r0.x, r0.x, l(2)\nld_raw r6.xyzw, r0.x, T0[0].zxyw\niadd r0.x, r0.x, l(16)\nld_raw r7.xyzw, r0.x, T0[0].xyzw\nieq r0.x, r5.x, l(0)\nine r0.y, r1.x, l(0)\nand r0.x, r0.y, r0.x\nif_nz r0.x\n  uge r0.x, r1.x, l(2)\n  if_nz r0.x\n    uge r0.x, r1.x, l(3)\n    if_nz r0.x\n      mov r6.x, r6.w\n    endif \n    mov r6.xz, r6.xxxx\n  endif \n  mov r6.xyz, r6.xzzx\nendif \nif_nz r3.y\n  ubfe r0.x, l(4), l(24), CB0[0][0].x\n  switch r0.x\n    case l(0)\n    case l(1)\n    and r1.xyzw, r6.yzxw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n    bfi r1.xyzw, l(8, 8, 8, 8), l(16, 16, 16, 16), r6.yzxw, r1.xyzw\n    ubfe r8.xyzw, l(8, 8, 8, 8), l(16, 16, 16, 16), r6.yzxw\n    iadd r6.xyzw, r1.zxyw, r8.zxyw\n    and r1.xyzw, r7.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n    bfi r1.xyzw, l(8, 8, 8, 8), l(16, 16, 16, 16), r7.xyzw, r1.xyzw\n    ubfe r8.xyzw, l(8, 8, 8, 8), l(16, 16, 16, 16), r7.xyzw\n    iadd r7.xyzw, r1.xyzw, r8.xyzw\n    break \n    case l(2)\n    case l(3)\n    case l(10)\n    case l(12)\n    and r1.xyzw, r6.yzxw, l(0xc00ffc00, 0xc00ffc00, 0xc00ffc00, 0xc00ffc00)\n    bfi r1.xyzw, l(10, 10, 10, 10), l(20, 20, 20, 20), r6.yzxw, r1.xyzw\n    ubfe r8.xyzw, l(10, 10, 10, 10), l(20, 20, 20, 20), r6.yzxw\n    iadd r6.xyzw, r1.zxyw, r8.zxyw\n    and r1.xyzw, r7.xyzw, l(0xc00ffc00, 0xc00ffc00, 0xc00ffc00, 0xc00ffc00)\n    bfi r1.xyzw, l(10, 10, 10, 10), l(20, 20, 20, 20), r7.xyzw, r1.xyzw\n    ubfe r8.xyzw, l(10, 10, 10, 10), l(20, 20, 20, 20), r7.xyzw\n    iadd r7.xyzw, r1.xyzw, r8.xyzw\n    break \n    default \n    break \n  endswitch \nendif \nmov r5.z, vThreadID.y\nimad r0.xy, r2.zwzz, r2.yxyy, r5.zxzz\nushr r1.xy, r0.yxyy, l(4, 1, 0, 0)\nudiv r5.xyzw, null, r1.yxyy, r2.yxyy\nimad r1.xy, -r2.xyxx, r5.ywyy, r1.xyxx\nishl r0.z, r5.y, l(4)\nimad r1.x, r1.x, r2.y, r1.y\nbfi r0.xy, l(1, 4, 0, 0), l(6, 2, 0, 0), r0.xyxx, l(0, 0, 0, 0)\nbfi r0.x, l(25), l(7), r1.x, r0.x\niadd r0.x, r0.x, r0.y\nif_nz r3.x\n  ubfe r0.y, l(3), l(4), CB0[0][0].z\n  bfi r1.x, l(10), l(1), r4.y, l(0)\n  ishr r1.y, r0.y, l(2)\n  ibfe r4.xyzw, l(28, 27, 31, 29), l(3, 1, 0, 2), r5.wyww\n  imad r1.x, r1.y, r1.x, r4.x\n  imad r1.x, r1.x, r3.z, r4.y\n  bfi r0.y, l(2), l(5), r0.y, l(0)\n  bfi r1.z, l(2), l(3), r4.z, l(0)\n  iadd r0.y, r0.y, r1.z\n  bfi r0.y, l(25), l(7), r1.x, r0.y\n  xor r1.x, r1.y, r4.w\n  ishr r1.y, r0.z, l(3)\n  and r1.y, r1.y, l(2)\n  bfi r1.xz, l(1, 0, 1, 0), l(1, 0, 11, 0), r1.xxxx, l(0, 0, 0, 0)\n  xor r1.x, r1.x, r1.y\n  ishl r1.x, r1.x, l(6)\n  iadd r1.x, r1.z, r1.x\n  ibfe r1.yz, l(0, 27, 24, 0), l(0, 3, 6, 0), r0.yyyy\n  bfi r0.y, l(3), l(8), r1.y, r1.x\n  bfi r0.y, l(20), l(12), r1.z, r0.y\nelse \n  ibfe r1.xyzw, l(27, 27, 31, 28), l(4, 1, 0, 3), r5.xyzw\n  imad r1.x, r1.x, r3.z, r1.y\n  bfi r1.yz, l(0, 3, 1, 0), l(0, 3, 11, 0), r1.zzwz, l(0, 0, 0, 0)\n  bfi r1.x, l(26), l(6), r1.x, r1.y\n  ishr r0.z, r0.z, l(3)\n  and r0.z, r0.z, l(2)\n  ibfe r1.y, l(29), l(2), r5.w\n  bfi r1.y, l(1), l(1), r1.y, l(0)\n  xor r0.z, r0.z, r1.y\n  ishl r0.z, r0.z, l(6)\n  iadd r0.z, r1.z, r0.z\n  ibfe r1.xy, l(27, 24, 0, 0), l(3, 6, 0, 0), r1.xxxx\n  bfi r0.z, l(3), l(8), r1.x, r0.z\n  bfi r0.y, l(20), l(12), r1.y, r0.z\nendif \nimul null, r0.z, r2.y, r2.x\nimad r0.x, r0.y, r0.z, r0.x\nieq r0.yzw, r0.wwww, l(0, 1, 2, 3)\nor r0.yz, r0.zzwz, r0.yyzy\nif_nz r0.y\n  ishl r1.xyzw, r6.yzxw, l(8, 8, 8, 8)\n  and r1.xyzw, r1.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r2.xyzw, r6.yzxw, l(8, 8, 8, 8)\n  and r2.xyzw, r2.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r6.xyzw, r1.zxyw, r2.zxyw\nendif \nif_nz r0.z\n  ushr r1.xyzw, r6.yzxw, l(16, 16, 16, 16)\n  bfi r6.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r6.xyzw, r1.zxyw\nendif \nstore_raw U0[0].xyzw, r0.x, r6.yzxw\niadd r0.w, r0.x, l(16)\nif_nz r0.y\n  ishl r1.xyzw, r7.xyzw, l(8, 8, 8, 8)\n  and r1.xyzw, r1.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r2.xyzw, r7.xyzw, l(8, 8, 8, 8)\n  and r2.xyzw, r2.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r7.xyzw, r1.xyzw, r2.xyzw\nendif \nif_nz r0.z\n  ushr r1.xyzw, r7.xyzw, l(16, 16, 16, 16)\n  bfi r7.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r7.xyzw, r1.xyzw\nendif \nstore_raw U0[0].xyzw, r0.w, r7.xyzw\nret \n// Approximately 180 instruction slots used\n#endif\n\nconst BYTE resolve_fast_32bpp_1x2xmsaa_scaled_cs[] =\n{\n     68,  88,  66,  67, 131, 244, \n      9,  21, 252, 193, 101,  56, \n    131, 150, 205, 150,  69, 114, \n    133,  67,   1,   0,   0,   0, \n    172,  25,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n    144,   2,   0,   0, 160,   2, \n      0,   0, 176,   2,   0,   0, \n     16,  25,   0,   0,  82,  68, \n     69,  70,  84,   2,   0,   0, \n      1,   0,   0,   0, 228,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n     44,   2,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 197,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 213,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 114, 101, 115, \n    111, 108, 118, 101,  95, 101, \n    100, 114,  97, 109,   0, 120, \n    101,  95, 114, 101, 115, 111, \n    108, 118, 101,  95, 100, 101, \n    115, 116,   0, 112, 117, 115, \n    104,  95,  99, 111, 110, 115, \n    116, 115,  95, 120, 101,   0, \n    213,   0,   0,   0,   4,   0, \n      0,   0, 252,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    156,   1,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 184,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 220,   1, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 184,   1,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 247,   1,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    184,   1,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     12,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 184,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 120, 101, \n     95, 114, 101, 115, 111, 108, \n    118, 101,  95, 101, 100, 114, \n     97, 109,  95, 105, 110, 102, \n    111,   0, 100, 119, 111, 114, \n    100,   0,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 178,   1, \n      0,   0, 120, 101,  95, 114, \n    101, 115, 111, 108, 118, 101, \n     95,  99, 111, 111, 114, 100, \n    105, 110,  97, 116, 101,  95, \n    105, 110, 102, 111,   0, 120, \n    101,  95, 114, 101, 115, 111, \n    108, 118, 101,  95, 100, 101, \n    115, 116,  95, 105, 110, 102, \n    111,   0, 120, 101,  95, 114, \n    101, 115, 111, 108, 118, 101, \n     95, 100, 101, 115, 116,  95, \n     99, 111, 111, 114, 100, 105, \n    110,  97, 116, 101,  95, 105, \n    110, 102, 111,   0,  77, 105, \n     99, 114, 111, 115, 111, 102, \n    116,  32,  40,  82,  41,  32, \n     72,  76,  83,  76,  32,  83, \n    104,  97, 100, 101, 114,  32, \n     67, 111, 109, 112, 105, 108, \n    101, 114,  32,  49,  48,  46, \n     49,   0,  73,  83,  71,  78, \n      8,   0,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     79,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  83,  72, \n     69,  88,  88,  22,   0,   0, \n     81,   0,   5,   0, 150,   5, \n      0,   0, 106,   8,   0,   1, \n     89,   0,   0,   7,  70, 142, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0, 161,   0, \n      0,   6,  70, 126,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 157,   0, \n      0,   6,  70, 238,  49,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  95,   0, \n      0,   2,  50,   0,   2,   0, \n    104,   0,   0,   2,   9,   0, \n      0,   0, 155,   0,   0,   4, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,  12, 242,   0, \n     16,   0,   0,   0,   0,   0, \n      6, 136,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n      0,  16,   0,   0,   0,   0, \n      0,  32,   7,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n    138,   0,   0,  17,  50,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n     17,   0,   0,   0,  20,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86, 133, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  18,   0,   0,   1, \n     54,   0,   0,   8,  50,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n    138,   0,   0,  17, 114,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  19,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,  86, 133, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,   1,   0, \n      0,  12, 114,   0,  16,   0, \n      3,   0,   0,   0, 166, 139, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   1, 255,   3,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  12, 242,   0,  16,   0, \n      4,   0,   0,   0, 214, 143, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     24,   0,   0,   0,  80,   0, \n      0,   6,  66,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n      2,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      0,   0,   0,   0,  62,   0, \n      0,   1,  21,   0,   0,   1, \n     54,   0,   0,   7,  18,   0, \n     16,   0,   5,   0,   0,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  34,   0,  16,   0, \n      5,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n    140,   0,   0,  20, 194,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   6,   4, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  20, \n    194,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n    246,  11,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  17, 210,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,   0,   0,   0,   0, \n     28,   0,   0,   0,  13,   0, \n      0,   0,   6, 131,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     41,   0,   0,   6,  18,   0, \n     16,   0,   5,   0,   0,   0, \n     10,   0,   2,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     83,   0,   0,   6,  34,   0, \n     16,   0,   5,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,   2,   0, \n     35,   0,   0,   9,  98,   0, \n     16,   0,   1,   0,   0,   0, \n    166,  11,  16,   0,   1,   0, \n      0,   0,   6,   1,  16,   0, \n      2,   0,   0,   0,   6,   1, \n     16,   0,   5,   0,   0,   0, \n     80,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      4,   0,   0,   0,  31,   0, \n      0,   3,  42,   0,  16,   0, \n      0,   0,   0,   0,  32,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   4,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  31,   0,   4,   3, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     66,   0,  16,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  18,   0, \n      0,   1,  54,   0,   0,   5, \n     66,   0,  16,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  21,   0,   0,   1, \n     80,   0,   0,  10, 162,   0, \n     16,   0,   5,   0,   0,   0, \n      6,   0,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  10, 162,   0,  16,   0, \n      5,   0,   0,   0,  86,  13, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  41,   0,   0,   7, \n     98,   0,  16,   0,   1,   0, \n      0,   0,  86,   6,  16,   0, \n      1,   0,   0,   0,  86,   7, \n     16,   0,   5,   0,   0,   0, \n     85,   0,   0,   7,  18,   0, \n     16,   0,   4,   0,   0,   0, \n     42,   0,  16,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  10,  82,   0,  16,   0, \n      4,   0,   0,   0,   6,   2, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     98,   0,  16,   0,   1,   0, \n      0,   0,  86,   6,  16,   0, \n      1,   0,   0,   0,   6,   2, \n     16,   0,   4,   0,   0,   0, \n     38,   0,   0,  11,   0, 208, \n      0,   0,  82,   0,  16,   0, \n      4,   0,   0,   0,   6,   1, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  80,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  78,   0,   0,   8, \n    162,   0,  16,   0,   5,   0, \n      0,   0,   0, 208,   0,   0, \n     86,   9,  16,   0,   1,   0, \n      0,   0,   6,   8,  16,   0, \n      4,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   5,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      5,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   4,   0, \n      0,   0,  35,   0,   0,  10, \n     98,   0,  16,   0,   1,   0, \n      0,   0,  86,   7,  16, 128, \n     65,   0,   0,   0,   5,   0, \n      0,   0,   6,   2,  16,   0, \n      4,   0,   0,   0,  86,   6, \n     16,   0,   1,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     85,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  80,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  40,   0,   0,   5, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  21,   0,   0,   1, \n     38,   0,   0,   8,   0, 208, \n      0,   0,  34,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   4,   0,   0,   0, \n     10,   0,  16,   0,   4,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  41,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  11,   0,   0,   0, \n     78,   0,   0,   8,   0, 208, \n      0,   0,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  41,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  38, 125,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  32,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      5,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     39,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  80,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     80,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  31,   0, \n      4,   3,  10,   0,  16,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      6,   0,   0,   0,  58,   0, \n     16,   0,   6,   0,   0,   0, \n     21,   0,   0,   1,  54,   0, \n      0,   5,  82,   0,  16,   0, \n      6,   0,   0,   0,   6,   0, \n     16,   0,   6,   0,   0,   0, \n     21,   0,   0,   1,  54,   0, \n      0,   5, 114,   0,  16,   0, \n      6,   0,   0,   0, 134,   2, \n     16,   0,   6,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      3,   0,   0,   0, 138,   0, \n      0,  11,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n      1,  64,   0,   0,  24,   0, \n      0,   0,  10, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     76,   0,   0,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   0,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   1,   0,   0,   0, \n    150,  12,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 150,  12,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 150,  12, \n     16,   0,   6,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     38,  13,  16,   0,   1,   0, \n      0,   0,  38,  13,  16,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255, 140,   0,   0,  17, \n    242,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,  10,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,  12,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   1,   0,   0,   0, \n    150,  12,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 252,  15, 192,   0, 252, \n     15, 192,   0, 252,  15, 192, \n      0, 252,  15, 192, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0, 150,  12,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0, 150,  12, \n     16,   0,   6,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     38,  13,  16,   0,   1,   0, \n      0,   0,  38,  13,  16,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   0, 252, \n     15, 192,   0, 252,  15, 192, \n      0, 252,  15, 192,   0, 252, \n     15, 192, 140,   0,   0,  17, \n    242,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,   2,   0,   0,   1, \n     10,   0,   0,   1,   2,   0, \n      0,   1,  23,   0,   0,   1, \n     21,   0,   0,   1,  54,   0, \n      0,   4,  66,   0,  16,   0, \n      5,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,   9, \n     50,   0,  16,   0,   0,   0, \n      0,   0, 230,  10,  16,   0, \n      2,   0,   0,   0,  22,   5, \n     16,   0,   2,   0,   0,   0, \n     38,  10,  16,   0,   5,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  22,   5,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   4,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     78,   0,   0,   8, 242,   0, \n     16,   0,   5,   0,   0,   0, \n      0, 208,   0,   0,  22,   5, \n     16,   0,   1,   0,   0,   0, \n     22,   5,  16,   0,   2,   0, \n      0,   0,  35,   0,   0,  10, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16, 128, \n     65,   0,   0,   0,   2,   0, \n      0,   0, 214,   5,  16,   0, \n      5,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n     41,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  20,  50,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   6,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  18,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  25,   0, \n      0,   0,   1,  64,   0,   0, \n      7,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   3,   0,   0,   0, \n    138,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     10,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  42,   0, \n      0,   7,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0, 139,   0,   0,  15, \n    242,   0,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n     28,   0,   0,   0,  27,   0, \n      0,   0,  31,   0,   0,   0, \n     29,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n    118,  15,  16,   0,   5,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   4,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   5,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  66,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      4,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  25,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     87,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,  42,   0, \n      0,   7,  34,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   7, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n    140,   0,   0,  20,  82,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0,   6,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     41,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 139,   0,   0,  15, \n     98,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  27,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     18,   0,   0,   1, 139,   0, \n      0,  15, 242,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  27,   0,   0,   0, \n     27,   0,   0,   0,  31,   0, \n      0,   0,  28,   0,   0,   0, \n      2,  64,   0,   0,   4,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  20,  98,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0, 166,  11,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  18,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  26,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0, 139,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  29,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      5,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  41,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  30,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n    139,   0,   0,  15,  50,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  27,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   6,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  66,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  38,   0,   0,   8, \n      0, 208,   0,   0,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  32,   0, \n      0,  10, 226,   0,  16,   0, \n      0,   0,   0,   0, 246,  15, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      2,   0,   0,   0,   3,   0, \n      0,   0,  60,   0,   0,   7, \n     98,   0,  16,   0,   0,   0, \n      0,   0, 166,  11,  16,   0, \n      0,   0,   0,   0,  86,   6, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   1,   0,   0,   0, \n    150,  12,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,  85,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0, 150,  12,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      6,   0,   0,   0,  38,  13, \n     16,   0,   1,   0,   0,   0, \n     38,  13,  16,   0,   2,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   1,   0,   0,   0, \n    150,  12,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  38,  13, \n     16,   0,   1,   0,   0,   0, \n     21,   0,   0,   1, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0, 150,  12, \n     16,   0,   6,   0,   0,   0, \n     30,   0,   0,   7, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  21,   0, \n      0,   1, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,  62,   0, \n      0,   1,  83,  84,  65,  84, \n    148,   0,   0,   0, 180,   0, \n      0,   0,   9,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     48,   0,   0,   0,  37,   0, \n      0,   0,   8,   0,   0,   0, \n     15,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   9,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/resolve_fast_32bpp_4xmsaa_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_resolve_edram_info;        // Offset:    0 Size:     4\n//   uint xe_resolve_coordinate_info;   // Offset:    4 Size:     4\n//   uint xe_resolve_dest_info;         // Offset:    8 Size:     4\n//   uint xe_resolve_dest_coordinate_info;// Offset:   12 Size:     4\n//   uint xe_resolve_dest_base;         // Offset:   16 Size:     4\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_resolve_edram                  texture    byte         r/o      T0             t0      1 \n// xe_resolve_dest                       UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][2], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xy\ndcl_temps 9\ndcl_thread_group 8, 8, 1\nubfe r0.x, l(11), l(5), CB0[0][0].y\nand r1.xyzw, CB0[0][0].xxzz, l(1023, 4096, 7, 8)\nand r0.yz, CB0[0][0].zzwz, l(0, 0x01000000, 1023, 0)\nushr r2.xyzw, CB0[0][0].ywww, l(4, 10, 20, 24)\nuge r0.x, vThreadID.x, r0.x\nif_nz r0.x\n  ret \nendif \nmov r3.x, CB0[0][0].y\nmov r3.y, r2.x\nbfi r0.xw, l(4, 0, 0, 1), l(3, 0, 0, 3), r3.xxxy, l(0, 0, 0, 0)\nbfi r3.xyzw, l(4, 4, 4, 4), l(3, 3, 3, 3), r2.wzww, l(0, 0, 0, 0)\nubfe r2.xz, l(11, 0, 3, 0), l(13, 0, 28, 0), CB0[0][0].xxwx\nishl r4.y, vThreadID.x, l(3)\nmov r4.xzw, vThreadID.yyyy\niadd r0.xw, r0.xxxw, r4.yyyw\nuge r2.w, l(3), r2.z\nif_nz r2.w\n  mov r5.y, r2.z\nelse \n  ieq r2.w, r2.z, l(5)\n  if_nz r2.w\n    mov r5.y, l(2)\n  else \n    mov r5.y, l(0)\n  endif \nendif \nishl r0.xw, r0.xxxw, l(1, 0, 0, 1)\nushr r5.x, r5.y, l(1)\nbfi r0.xw, l(4, 0, 0, 1), l(0, 0, 0, 0), r5.xxxy, r0.xxxw\nudiv r5.xy, null, r0.xwxx, l(80, 16, 0, 0)\nimad r1.x, r5.y, r1.x, r5.x\niadd r1.x, r1.x, r2.x\nimad r0.xw, -r5.xxxy, l(80, 0, 0, 16), r0.xxxw\nif_nz r1.y\n  uge r1.y, r0.x, l(40)\n  movc r1.y, r1.y, l(-40), l(40)\n  iadd r0.x, r0.x, r1.y\nendif \nimad r0.x, r0.w, l(80), r0.x\nimad r0.x, r1.x, l(1280), r0.x\nudiv null, r0.x, r0.x, l(0x00280000)\nishl r0.x, r0.x, l(2)\nine r1.xy, r2.zzzz, l(2, 3, 0, 0)\nand r0.w, r1.y, r1.x\nif_nz r0.w\n  ld_raw r5.x, r0.x, T0[0].xxxx\n  iadd r2.xzw, r0.xxxx, l(8, 0, 16, 24)\n  ld_raw r5.y, r2.x, T0[0].xxxx\n  ld_raw r5.z, r2.z, T0[0].xxxx\n  ld_raw r5.w, r2.w, T0[0].xxxx\n  iadd r1.xy, r0.xxxx, l(32, 48, 0, 0)\n  ld_raw r6.x, r1.x, T0[0].xxxx\n  or r2.xz, r1.xxyx, l(8, 0, 24, 0)\n  ld_raw r6.y, r2.x, T0[0].xxxx\n  ld_raw r6.z, r1.y, T0[0].xxxx\n  ld_raw r6.w, r2.z, T0[0].xxxx\nelse \n  iadd r2.xzw, r0.xxxx, l(4, 0, 12, 36)\n  ld_raw r5.x, r2.x, T0[0].xxxx\n  ld_raw r5.y, r2.z, T0[0].xxxx\n  iadd r0.w, r0.x, l(16)\n  iadd r1.xy, r0.wwww, l(4, 12, 0, 0)\n  ld_raw r5.z, r1.x, T0[0].xxxx\n  ld_raw r5.w, r1.y, T0[0].xxxx\n  ld_raw r6.x, r2.w, T0[0].xxxx\n  iadd r2.xzw, r0.xxxx, l(44, 0, 52, 60)\n  ld_raw r6.y, r2.x, T0[0].xxxx\n  ld_raw r6.z, r2.z, T0[0].xxxx\n  ld_raw r6.w, r2.w, T0[0].xxxx\nendif \nif_nz r0.y\n  ubfe r0.x, l(4), l(24), CB0[0][0].x\n  switch r0.x\n    case l(0)\n    case l(1)\n    and r7.xyzw, r5.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n    bfi r7.xyzw, l(8, 8, 8, 8), l(16, 16, 16, 16), r5.xyzw, r7.xyzw\n    ubfe r8.xyzw, l(8, 8, 8, 8), l(16, 16, 16, 16), r5.xyzw\n    iadd r5.xyzw, r7.xyzw, r8.xyzw\n    and r7.xyzw, r6.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n    bfi r7.xyzw, l(8, 8, 8, 8), l(16, 16, 16, 16), r6.xyzw, r7.xyzw\n    ubfe r8.xyzw, l(8, 8, 8, 8), l(16, 16, 16, 16), r6.xyzw\n    iadd r6.xyzw, r7.xyzw, r8.xyzw\n    break \n    case l(2)\n    case l(3)\n    case l(10)\n    case l(12)\n    and r7.xyzw, r5.xyzw, l(0xc00ffc00, 0xc00ffc00, 0xc00ffc00, 0xc00ffc00)\n    bfi r7.xyzw, l(10, 10, 10, 10), l(20, 20, 20, 20), r5.xyzw, r7.xyzw\n    ubfe r8.xyzw, l(10, 10, 10, 10), l(20, 20, 20, 20), r5.xyzw\n    iadd r5.xyzw, r7.xyzw, r8.xyzw\n    and r7.xyzw, r6.xyzw, l(0xc00ffc00, 0xc00ffc00, 0xc00ffc00, 0xc00ffc00)\n    bfi r7.xyzw, l(10, 10, 10, 10), l(20, 20, 20, 20), r6.xyzw, r7.xyzw\n    ubfe r8.xyzw, l(10, 10, 10, 10), l(20, 20, 20, 20), r6.xyzw\n    iadd r6.xyzw, r7.xyzw, r8.xyzw\n    break \n    default \n    break \n  endswitch \nendif \niadd r3.xyzw, r3.xyzw, r4.xyzw\nif_nz r1.w\n  ubfe r0.x, l(3), l(4), CB0[0][0].z\n  bfi r0.y, l(10), l(1), r2.y, l(0)\n  ishr r0.w, r0.x, l(2)\n  ishr r2.xyzw, r3.wyww, l(4, 5, 1, 3)\n  imad r0.y, r0.w, r0.y, r2.x\n  imad r0.y, r0.y, r0.z, r2.y\n  bfi r0.x, l(2), l(5), r0.x, l(0)\n  bfi r1.x, l(2), l(3), r2.z, l(0)\n  iadd r0.x, r0.x, r1.x\n  bfi r0.x, l(25), l(7), r0.y, r0.x\n  xor r0.y, r0.w, r2.w\n  ubfe r0.w, l(2), l(3), r3.y\n  bfi r1.xy, l(1, 1, 0, 0), l(1, 11, 0, 0), r0.yyyy, l(0, 0, 0, 0)\n  xor r0.y, r0.w, r1.x\n  bfi r0.w, l(1), l(4), r3.w, l(0)\n  imad r0.y, r0.y, l(64), r0.w\n  iadd r0.y, r1.y, r0.y\n  ibfe r0.xw, l(27, 0, 0, 24), l(3, 0, 0, 6), r0.xxxx\n  bfi r0.x, l(3), l(8), r0.x, r0.y\n  bfi r0.x, l(20), l(12), r0.w, r0.x\nelse \n  ishr r2.xyzw, r3.xyzw, l(5, 5, 1, 4)\n  imad r0.y, r2.x, r0.z, r2.y\n  bfi r0.zw, l(0, 0, 3, 1), l(0, 0, 3, 11), r2.zzzw, l(0, 0, 0, 0)\n  imad r0.y, r0.y, l(64), r0.z\n  ubfe r0.z, l(2), l(3), r3.y\n  ishr r1.x, r3.w, l(3)\n  bfi r1.x, l(1), l(1), r1.x, l(0)\n  xor r0.z, r0.z, r1.x\n  bfi r1.x, l(1), l(4), r3.w, l(0)\n  imad r0.z, r0.z, l(64), r1.x\n  iadd r0.z, r0.w, r0.z\n  ibfe r0.yw, l(0, 27, 0, 24), l(0, 3, 0, 6), r0.yyyy\n  bfi r0.y, l(3), l(8), r0.y, r0.z\n  bfi r0.x, l(20), l(12), r0.w, r0.y\nendif \niadd r0.x, r0.x, CB0[0][1].x\nieq r0.yzw, r1.zzzz, l(0, 1, 2, 3)\nor r0.yz, r0.zzwz, r0.yyzy\nif_nz r0.y\n  ishl r1.xyzw, r5.xyzw, l(8, 8, 8, 8)\n  and r1.xyzw, r1.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r2.xyzw, r5.xyzw, l(8, 8, 8, 8)\n  and r2.xyzw, r2.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r5.xyzw, r1.xyzw, r2.xyzw\nendif \nif_nz r0.z\n  ushr r1.xyzw, r5.xyzw, l(16, 16, 16, 16)\n  bfi r5.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r5.xyzw, r1.xyzw\nendif \nstore_raw U0[0].xyzw, r0.x, r5.xyzw\niadd r0.x, r0.x, l(32)\nif_nz r0.y\n  ishl r1.xyzw, r6.xyzw, l(8, 8, 8, 8)\n  and r1.xyzw, r1.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r2.xyzw, r6.xyzw, l(8, 8, 8, 8)\n  and r2.xyzw, r2.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r6.xyzw, r1.xyzw, r2.xyzw\nendif \nif_nz r0.z\n  ushr r1.xyzw, r6.xyzw, l(16, 16, 16, 16)\n  bfi r6.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r6.xyzw, r1.xyzw\nendif \nstore_raw U0[0].xyzw, r0.x, r6.xyzw\nret \n// Approximately 169 instruction slots used\n#endif\n\nconst BYTE resolve_fast_32bpp_4xmsaa_cs[] =\n{\n     68,  88,  66,  67,  52, 173, \n    192,  89,  83, 161, 116, 221, \n     62, 193, 116, 133, 141,  99, \n    255,  47,   1,   0,   0,   0, \n     24,  25,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n    208,   2,   0,   0, 224,   2, \n      0,   0, 240,   2,   0,   0, \n    124,  24,   0,   0,  82,  68, \n     69,  70, 148,   2,   0,   0, \n      1,   0,   0,   0, 228,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    105,   2,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 197,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 213,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 114, 101, 115, \n    111, 108, 118, 101,  95, 101, \n    100, 114,  97, 109,   0, 120, \n    101,  95, 114, 101, 115, 111, \n    108, 118, 101,  95, 100, 101, \n    115, 116,   0, 112, 117, 115, \n    104,  95,  99, 111, 110, 115, \n    116, 115,  95, 120, 101,   0, \n    213,   0,   0,   0,   5,   0, \n      0,   0, 252,   0,   0,   0, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    196,   1,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 224,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,   4,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 224,   1,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  31,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    224,   1,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     52,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 224,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  84,   2, \n      0,   0,  16,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 224,   1,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 114, \n    101, 115, 111, 108, 118, 101, \n     95, 101, 100, 114,  97, 109, \n     95, 105, 110, 102, 111,   0, \n    100, 119, 111, 114, 100,   0, \n      0,   0,  19,   0,   1,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 218,   1,   0,   0, \n    120, 101,  95, 114, 101, 115, \n    111, 108, 118, 101,  95,  99, \n    111, 111, 114, 100, 105, 110, \n     97, 116, 101,  95, 105, 110, \n    102, 111,   0, 120, 101,  95, \n    114, 101, 115, 111, 108, 118, \n    101,  95, 100, 101, 115, 116, \n     95, 105, 110, 102, 111,   0, \n    120, 101,  95, 114, 101, 115, \n    111, 108, 118, 101,  95, 100, \n    101, 115, 116,  95,  99, 111, \n    111, 114, 100, 105, 110,  97, \n    116, 101,  95, 105, 110, 102, \n    111,   0, 120, 101,  95, 114, \n    101, 115, 111, 108, 118, 101, \n     95, 100, 101, 115, 116,  95, \n     98,  97, 115, 101,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n    132,  21,   0,   0,  81,   0, \n      5,   0,  97,   5,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n     50,   0,   2,   0, 104,   0, \n      0,   2,   9,   0,   0,   0, \n    155,   0,   0,   4,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,   0, 138,   0, \n      0,  11,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  11,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  26, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  12, 242,   0, \n     16,   0,   1,   0,   0,   0, \n      6, 138,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n      0,  16,   0,   0,   7,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  12,  98,   0, \n     16,   0,   0,   0,   0,   0, \n    166, 139,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   1, 255,   3, \n      0,   0,   0,   0,   0,   0, \n     85,   0,   0,  12, 242,   0, \n     16,   0,   2,   0,   0,   0, \n    214, 143,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   4,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  24,   0,   0,   0, \n     80,   0,   0,   6,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,   2,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1,  54,   0,   0,   7, \n     18,   0,  16,   0,   3,   0, \n      0,   0,  26, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  34,   0, \n     16,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0, 140,   0,   0,  20, \n    146,   0,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      6,   4,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   4,   0, \n      0,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0, 182,  15,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    138,   0,   0,  17,  82,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  11,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n     13,   0,   0,   0,   0,   0, \n      0,   0,  28,   0,   0,   0, \n      0,   0,   0,   0,   6, 131, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,   6, \n     34,   0,  16,   0,   4,   0, \n      0,   0,  10,   0,   2,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  54,   0,   0,   4, \n    210,   0,  16,   0,   4,   0, \n      0,   0,  86,   5,   2,   0, \n     30,   0,   0,   7, 146,   0, \n     16,   0,   0,   0,   0,   0, \n      6,  12,  16,   0,   0,   0, \n      0,   0,  86,  13,  16,   0, \n      4,   0,   0,   0,  80,   0, \n      0,   7, 130,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  31,   0,   4,   3, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  54,   0,   0,   5, \n     34,   0,  16,   0,   5,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  18,   0, \n      0,   1,  32,   0,   0,   7, \n    130,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   5,   0,   0,   0, \n     31,   0,   4,   3,  58,   0, \n     16,   0,   2,   0,   0,   0, \n     54,   0,   0,   5,  34,   0, \n     16,   0,   5,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,  18,   0,   0,   1, \n     54,   0,   0,   5,  34,   0, \n     16,   0,   5,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     21,   0,   0,   1,  41,   0, \n      0,  10, 146,   0,  16,   0, \n      0,   0,   0,   0,   6,  12, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  85,   0,   0,   7, \n     18,   0,  16,   0,   5,   0, \n      0,   0,  26,   0,  16,   0, \n      5,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n    140,   0,   0,  17, 146,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   6,   4, \n     16,   0,   5,   0,   0,   0, \n      6,  12,  16,   0,   0,   0, \n      0,   0,  78,   0,   0,  11, \n     50,   0,  16,   0,   5,   0, \n      0,   0,   0, 208,   0,   0, \n    198,   0,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n     80,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   5,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      5,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  35,   0,   0,  13, \n    146,   0,  16,   0,   0,   0, \n      0,   0,   6,   4,  16, 128, \n     65,   0,   0,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n     80,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,   6,  12, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     80,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     40,   0,   0,   0,  55,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0, 216, 255, \n    255, 255,   1,  64,   0,   0, \n     40,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  21,   0,   0,   1, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     80,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   5,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     78,   0,   0,   8,   0, 208, \n      0,   0,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n     40,   0,  41,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     39,   0,   0,  10,  50,   0, \n     16,   0,   1,   0,   0,   0, \n    166,  10,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  31,   0,   4,   3, \n     58,   0,  16,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n     18,   0,  16,   0,   5,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  10, 210,   0,  16,   0, \n      2,   0,   0,   0,   6,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,  24,   0, \n      0,   0, 165,   0,   0,   8, \n     34,   0,  16,   0,   5,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8,  66,   0,  16,   0, \n      5,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    165,   0,   0,   8, 130,   0, \n     16,   0,   5,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n     50,   0,  16,   0,   1,   0, \n      0,   0,   6,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,  32,   0,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    165,   0,   0,   8,  18,   0, \n     16,   0,   6,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,  10, \n     82,   0,  16,   0,   2,   0, \n      0,   0,   6,   1,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  24,   0, \n      0,   0,   0,   0,   0,   0, \n    165,   0,   0,   8,  34,   0, \n     16,   0,   6,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n     66,   0,  16,   0,   6,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8, 130,   0,  16,   0, \n      6,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     18,   0,   0,   1,  30,   0, \n      0,  10, 210,   0,  16,   0, \n      2,   0,   0,   0,   6,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n     12,   0,   0,   0,  36,   0, \n      0,   0, 165,   0,   0,   8, \n     18,   0,  16,   0,   5,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8,  34,   0,  16,   0, \n      5,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0,  30,   0, \n      0,  10,  50,   0,  16,   0, \n      1,   0,   0,   0, 246,  15, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   4,   0, \n      0,   0,  12,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n     66,   0,  16,   0,   5,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8, 130,   0,  16,   0, \n      5,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    165,   0,   0,   8,  18,   0, \n     16,   0,   6,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    210,   0,  16,   0,   2,   0, \n      0,   0,   6,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,  44,   0,   0,   0, \n      0,   0,   0,   0,  52,   0, \n      0,   0,  60,   0,   0,   0, \n    165,   0,   0,   8,  34,   0, \n     16,   0,   6,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n     66,   0,  16,   0,   6,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8, 130,   0,  16,   0, \n      6,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  11,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n      1,  64,   0,   0,  24,   0, \n      0,   0,  10, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     76,   0,   0,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   0,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255, 140,   0,   0,  17, \n    242,   0,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,  10,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,  12,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 252,  15, 192,   0, 252, \n     15, 192,   0, 252,  15, 192, \n      0, 252,  15, 192, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   0, 252, \n     15, 192,   0, 252,  15, 192, \n      0, 252,  15, 192,   0, 252, \n     15, 192, 140,   0,   0,  17, \n    242,   0,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,   2,   0,   0,   1, \n     10,   0,   0,   1,   2,   0, \n      0,   1,  23,   0,   0,   1, \n     21,   0,   0,   1,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  31,   0,   4,   3, \n     58,   0,  16,   0,   1,   0, \n      0,   0, 138,   0,   0,  11, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     42, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  10,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     42,   0,   0,   7, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0, 118,  15, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   4,   0, \n      0,   0,   5,   0,   0,   0, \n      1,   0,   0,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   5,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  25,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     87,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0, 138,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0, 140,   0, \n      0,  20,  50,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  86,   5,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11, 130,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     64,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0, 139,   0, \n      0,  15, 146,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,  27,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  24,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   6,   0, \n      0,   0,   6,   0,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   8,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  18,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  20,   0, \n      0,   0,   1,  64,   0,   0, \n     12,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  18,   0,   0,   1, \n     42,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,   1,   0,   0,   0, \n      4,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  20, 194,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,  11,   0, \n      0,   0, 166,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     64,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n    138,   0,   0,   9,  66,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n     42,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     35,   0,   0,   9,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     64,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0, 139,   0, \n      0,  15, 162,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     27,   0,   0,   0,   0,   0, \n      0,   0,  24,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   6,   0, \n      0,   0,  86,   5,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   8,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  18,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  20,   0, \n      0,   0,   1,  64,   0,   0, \n     12,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     30,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  10, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     32,   0,   0,  10, 226,   0, \n     16,   0,   0,   0,   0,   0, \n    166,  10,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   2,   0,   0,   0, \n      3,   0,   0,   0,  60,   0, \n      0,   7,  98,   0,  16,   0, \n      0,   0,   0,   0, 166,  11, \n     16,   0,   0,   0,   0,   0, \n     86,   6,  16,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  21,   0,   0,   1, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  32,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,  85,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     21,   0,   0,   1, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     62,   0,   0,   1,  83,  84, \n     65,  84, 148,   0,   0,   0, \n    169,   0,   0,   0,   9,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  43,   0,   0,   0, \n     27,   0,   0,   0,   9,   0, \n      0,   0,  12,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   6,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/resolve_fast_32bpp_4xmsaa_scaled_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_resolve_edram_info;        // Offset:    0 Size:     4\n//   uint xe_resolve_coordinate_info;   // Offset:    4 Size:     4\n//   uint xe_resolve_dest_info;         // Offset:    8 Size:     4\n//   uint xe_resolve_dest_coordinate_info;// Offset:   12 Size:     4\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_resolve_edram                  texture    byte         r/o      T0             t0      1 \n// xe_resolve_dest                       UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][1], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xy\ndcl_temps 9\ndcl_thread_group 8, 8, 1\nand r0.xyzw, CB0[0][0].xxxz, l(1023, 4096, 0x20000000, 7)\nif_nz r0.z\n  ubfe r1.xy, l(2, 2, 0, 0), l(17, 20, 0, 0), CB0[0][0].yyyy\nelse \n  mov r1.xy, l(0,0,0,0)\nendif \nubfe r2.xyz, l(3, 3, 11, 0), l(16, 19, 5, 0), CB0[0][0].yyyy\nimul null, r0.z, r2.x, r2.z\nand r3.xyz, CB0[0][0].zzwz, l(8, 0x01000000, 1023, 0)\nushr r4.xyzw, CB0[0][0].ywww, l(4, 10, 20, 24)\nuge r0.z, vThreadID.x, r0.z\nif_nz r0.z\n  ret \nendif \nmov r5.x, CB0[0][0].y\nmov r5.y, r4.x\nbfi r1.zw, l(0, 0, 4, 1), l(0, 0, 3, 3), r5.xxxy, l(0, 0, 0, 0)\nbfi r2.zw, l(0, 0, 4, 4), l(0, 0, 3, 3), r4.wwwz, l(0, 0, 0, 0)\nubfe r4.xz, l(11, 0, 3, 0), l(13, 0, 28, 0), CB0[0][0].xxwx\nishl r5.x, vThreadID.x, l(3)\numax r5.y, r1.y, vThreadID.y\nimad r1.yz, r1.zzwz, r2.xxyx, r5.xxyx\nuge r0.z, l(3), r4.z\nif_nz r0.z\n  mov r6.y, r4.z\nelse \n  ieq r0.z, r4.z, l(5)\n  if_nz r0.z\n    mov r6.y, l(2)\n  else \n    mov r6.y, l(0)\n  endif \nendif \nishl r1.yz, r1.yyzy, l(0, 1, 1, 0)\nushr r6.x, r6.y, l(1)\nbfi r1.yz, l(0, 4, 1, 0), l(0, 0, 0, 0), r6.xxyx, r1.yyzy\nimul null, r5.yw, r2.xxxy, l(0, 80, 0, 16)\nudiv r6.xy, null, r1.yzyy, r5.ywyy\nimad r0.x, r6.y, r0.x, r6.x\niadd r0.x, r0.x, r4.x\nimad r1.yz, -r6.xxyx, r5.yywy, r1.yyzy\nif_nz r0.y\n  ushr r0.y, r5.y, l(1)\n  uge r0.z, r1.y, r0.y\n  ineg r1.w, r0.y\n  movc r0.y, r0.z, r1.w, r0.y\n  iadd r1.y, r0.y, r1.y\nendif \nimul null, r0.y, r5.w, r5.y\nimad r0.z, r1.z, r5.y, r1.y\nimad r0.x, r0.x, r0.y, r0.z\nishl r0.y, r0.y, l(11)\nudiv null, r0.x, r0.x, r0.y\nishl r0.x, r0.x, l(2)\nine r0.yz, r4.zzzz, l(0, 2, 3, 0)\nand r0.y, r0.z, r0.y\nif_nz r0.y\n  ld_raw r6.y, r0.x, T0[0].xxxx\n  iadd r1.yzw, r0.xxxx, l(0, 8, 16, 24)\n  ld_raw r6.z, r1.y, T0[0].xxxx\n  ld_raw r6.x, r1.z, T0[0].xxxx\n  ld_raw r6.w, r1.w, T0[0].xxxx\n  iadd r0.yz, r0.xxxx, l(0, 32, 48, 0)\n  ld_raw r7.x, r0.y, T0[0].xxxx\n  or r1.yz, r0.yyzy, l(0, 8, 24, 0)\n  ld_raw r7.y, r1.y, T0[0].xxxx\n  ld_raw r7.z, r0.z, T0[0].xxxx\n  ld_raw r7.w, r1.z, T0[0].xxxx\nelse \n  iadd r1.yzw, r0.xxxx, l(0, 4, 12, 36)\n  ld_raw r6.y, r1.y, T0[0].xxxx\n  ld_raw r6.z, r1.z, T0[0].xxxx\n  iadd r0.y, r0.x, l(16)\n  iadd r0.yz, r0.yyyy, l(0, 4, 12, 0)\n  ld_raw r6.x, r0.y, T0[0].xxxx\n  ld_raw r6.w, r0.z, T0[0].xxxx\n  ld_raw r7.x, r1.w, T0[0].xxxx\n  iadd r0.xyz, r0.xxxx, l(44, 52, 60, 0)\n  ld_raw r7.y, r0.x, T0[0].xxxx\n  ld_raw r7.z, r0.y, T0[0].xxxx\n  ld_raw r7.w, r0.z, T0[0].xxxx\nendif \nieq r0.x, r5.x, l(0)\nine r0.y, r1.x, l(0)\nand r0.x, r0.y, r0.x\nif_nz r0.x\n  uge r0.x, r1.x, l(2)\n  if_nz r0.x\n    uge r0.x, r1.x, l(3)\n    if_nz r0.x\n      mov r6.x, r6.w\n    endif \n    mov r6.xz, r6.xxxx\n  endif \n  mov r6.xyz, r6.xzzx\nendif \nif_nz r3.y\n  ubfe r0.x, l(4), l(24), CB0[0][0].x\n  switch r0.x\n    case l(0)\n    case l(1)\n    and r1.xyzw, r6.yzxw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n    bfi r1.xyzw, l(8, 8, 8, 8), l(16, 16, 16, 16), r6.yzxw, r1.xyzw\n    ubfe r8.xyzw, l(8, 8, 8, 8), l(16, 16, 16, 16), r6.yzxw\n    iadd r6.xyzw, r1.zxyw, r8.zxyw\n    and r1.xyzw, r7.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n    bfi r1.xyzw, l(8, 8, 8, 8), l(16, 16, 16, 16), r7.xyzw, r1.xyzw\n    ubfe r8.xyzw, l(8, 8, 8, 8), l(16, 16, 16, 16), r7.xyzw\n    iadd r7.xyzw, r1.xyzw, r8.xyzw\n    break \n    case l(2)\n    case l(3)\n    case l(10)\n    case l(12)\n    and r1.xyzw, r6.yzxw, l(0xc00ffc00, 0xc00ffc00, 0xc00ffc00, 0xc00ffc00)\n    bfi r1.xyzw, l(10, 10, 10, 10), l(20, 20, 20, 20), r6.yzxw, r1.xyzw\n    ubfe r8.xyzw, l(10, 10, 10, 10), l(20, 20, 20, 20), r6.yzxw\n    iadd r6.xyzw, r1.zxyw, r8.zxyw\n    and r1.xyzw, r7.xyzw, l(0xc00ffc00, 0xc00ffc00, 0xc00ffc00, 0xc00ffc00)\n    bfi r1.xyzw, l(10, 10, 10, 10), l(20, 20, 20, 20), r7.xyzw, r1.xyzw\n    ubfe r8.xyzw, l(10, 10, 10, 10), l(20, 20, 20, 20), r7.xyzw\n    iadd r7.xyzw, r1.xyzw, r8.xyzw\n    break \n    default \n    break \n  endswitch \nendif \nmov r5.z, vThreadID.y\nimad r0.xy, r2.zwzz, r2.yxyy, r5.zxzz\nushr r1.xy, r0.yxyy, l(4, 1, 0, 0)\nudiv r5.xyzw, null, r1.yxyy, r2.yxyy\nimad r1.xy, -r2.xyxx, r5.ywyy, r1.xyxx\nishl r0.z, r5.y, l(4)\nimad r1.x, r1.x, r2.y, r1.y\nbfi r0.xy, l(1, 4, 0, 0), l(6, 2, 0, 0), r0.xyxx, l(0, 0, 0, 0)\nbfi r0.x, l(25), l(7), r1.x, r0.x\niadd r0.x, r0.x, r0.y\nif_nz r3.x\n  ubfe r0.y, l(3), l(4), CB0[0][0].z\n  bfi r1.x, l(10), l(1), r4.y, l(0)\n  ishr r1.y, r0.y, l(2)\n  ibfe r4.xyzw, l(28, 27, 31, 29), l(3, 1, 0, 2), r5.wyww\n  imad r1.x, r1.y, r1.x, r4.x\n  imad r1.x, r1.x, r3.z, r4.y\n  bfi r0.y, l(2), l(5), r0.y, l(0)\n  bfi r1.z, l(2), l(3), r4.z, l(0)\n  iadd r0.y, r0.y, r1.z\n  bfi r0.y, l(25), l(7), r1.x, r0.y\n  xor r1.x, r1.y, r4.w\n  ishr r1.y, r0.z, l(3)\n  and r1.y, r1.y, l(2)\n  bfi r1.xz, l(1, 0, 1, 0), l(1, 0, 11, 0), r1.xxxx, l(0, 0, 0, 0)\n  xor r1.x, r1.x, r1.y\n  ishl r1.x, r1.x, l(6)\n  iadd r1.x, r1.z, r1.x\n  ibfe r1.yz, l(0, 27, 24, 0), l(0, 3, 6, 0), r0.yyyy\n  bfi r0.y, l(3), l(8), r1.y, r1.x\n  bfi r0.y, l(20), l(12), r1.z, r0.y\nelse \n  ibfe r1.xyzw, l(27, 27, 31, 28), l(4, 1, 0, 3), r5.xyzw\n  imad r1.x, r1.x, r3.z, r1.y\n  bfi r1.yz, l(0, 3, 1, 0), l(0, 3, 11, 0), r1.zzwz, l(0, 0, 0, 0)\n  bfi r1.x, l(26), l(6), r1.x, r1.y\n  ishr r0.z, r0.z, l(3)\n  and r0.z, r0.z, l(2)\n  ibfe r1.y, l(29), l(2), r5.w\n  bfi r1.y, l(1), l(1), r1.y, l(0)\n  xor r0.z, r0.z, r1.y\n  ishl r0.z, r0.z, l(6)\n  iadd r0.z, r1.z, r0.z\n  ibfe r1.xy, l(27, 24, 0, 0), l(3, 6, 0, 0), r1.xxxx\n  bfi r0.z, l(3), l(8), r1.x, r0.z\n  bfi r0.y, l(20), l(12), r1.y, r0.z\nendif \nimul null, r0.z, r2.y, r2.x\nimad r0.x, r0.y, r0.z, r0.x\nieq r0.yzw, r0.wwww, l(0, 1, 2, 3)\nor r0.yz, r0.zzwz, r0.yyzy\nif_nz r0.y\n  ishl r1.xyzw, r6.yzxw, l(8, 8, 8, 8)\n  and r1.xyzw, r1.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r2.xyzw, r6.yzxw, l(8, 8, 8, 8)\n  and r2.xyzw, r2.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r6.xyzw, r1.zxyw, r2.zxyw\nendif \nif_nz r0.z\n  ushr r1.xyzw, r6.yzxw, l(16, 16, 16, 16)\n  bfi r6.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r6.xyzw, r1.zxyw\nendif \nstore_raw U0[0].xyzw, r0.x, r6.yzxw\niadd r0.w, r0.x, l(16)\nif_nz r0.y\n  ishl r1.xyzw, r7.xyzw, l(8, 8, 8, 8)\n  and r1.xyzw, r1.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r2.xyzw, r7.xyzw, l(8, 8, 8, 8)\n  and r2.xyzw, r2.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r7.xyzw, r1.xyzw, r2.xyzw\nendif \nif_nz r0.z\n  ushr r1.xyzw, r7.xyzw, l(16, 16, 16, 16)\n  bfi r7.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r7.xyzw, r1.xyzw\nendif \nstore_raw U0[0].xyzw, r0.w, r7.xyzw\nret \n// Approximately 204 instruction slots used\n#endif\n\nconst BYTE resolve_fast_32bpp_4xmsaa_scaled_cs[] =\n{\n     68,  88,  66,  67, 194, 121, \n    121, 225,  40, 225, 180, 222, \n     93, 169,  68, 154, 182, 193, \n     54,  25,   1,   0,   0,   0, \n    136,  28,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n    144,   2,   0,   0, 160,   2, \n      0,   0, 176,   2,   0,   0, \n    236,  27,   0,   0,  82,  68, \n     69,  70,  84,   2,   0,   0, \n      1,   0,   0,   0, 228,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n     44,   2,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 197,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 213,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 114, 101, 115, \n    111, 108, 118, 101,  95, 101, \n    100, 114,  97, 109,   0, 120, \n    101,  95, 114, 101, 115, 111, \n    108, 118, 101,  95, 100, 101, \n    115, 116,   0, 112, 117, 115, \n    104,  95,  99, 111, 110, 115, \n    116, 115,  95, 120, 101,   0, \n    213,   0,   0,   0,   4,   0, \n      0,   0, 252,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    156,   1,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 184,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 220,   1, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 184,   1,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 247,   1,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    184,   1,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     12,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 184,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 120, 101, \n     95, 114, 101, 115, 111, 108, \n    118, 101,  95, 101, 100, 114, \n     97, 109,  95, 105, 110, 102, \n    111,   0, 100, 119, 111, 114, \n    100,   0,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 178,   1, \n      0,   0, 120, 101,  95, 114, \n    101, 115, 111, 108, 118, 101, \n     95,  99, 111, 111, 114, 100, \n    105, 110,  97, 116, 101,  95, \n    105, 110, 102, 111,   0, 120, \n    101,  95, 114, 101, 115, 111, \n    108, 118, 101,  95, 100, 101, \n    115, 116,  95, 105, 110, 102, \n    111,   0, 120, 101,  95, 114, \n    101, 115, 111, 108, 118, 101, \n     95, 100, 101, 115, 116,  95, \n     99, 111, 111, 114, 100, 105, \n    110,  97, 116, 101,  95, 105, \n    110, 102, 111,   0,  77, 105, \n     99, 114, 111, 115, 111, 102, \n    116,  32,  40,  82,  41,  32, \n     72,  76,  83,  76,  32,  83, \n    104,  97, 100, 101, 114,  32, \n     67, 111, 109, 112, 105, 108, \n    101, 114,  32,  49,  48,  46, \n     49,   0,  73,  83,  71,  78, \n      8,   0,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     79,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  83,  72, \n     69,  88,  52,  25,   0,   0, \n     81,   0,   5,   0,  77,   6, \n      0,   0, 106,   8,   0,   1, \n     89,   0,   0,   7,  70, 142, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0, 161,   0, \n      0,   6,  70, 126,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 157,   0, \n      0,   6,  70, 238,  49,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  95,   0, \n      0,   2,  50,   0,   2,   0, \n    104,   0,   0,   2,   9,   0, \n      0,   0, 155,   0,   0,   4, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,  12, 242,   0, \n     16,   0,   0,   0,   0,   0, \n      6, 136,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n      0,  16,   0,   0,   0,   0, \n      0,  32,   7,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n    138,   0,   0,  17,  50,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n     17,   0,   0,   0,  20,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86, 133, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  18,   0,   0,   1, \n     54,   0,   0,   8,  50,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n    138,   0,   0,  17, 114,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  19,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,  86, 133, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,   1,   0, \n      0,  12, 114,   0,  16,   0, \n      3,   0,   0,   0, 166, 139, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   1, 255,   3,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  12, 242,   0,  16,   0, \n      4,   0,   0,   0, 214, 143, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     24,   0,   0,   0,  80,   0, \n      0,   6,  66,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n      2,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      0,   0,   0,   0,  62,   0, \n      0,   1,  21,   0,   0,   1, \n     54,   0,   0,   7,  18,   0, \n     16,   0,   5,   0,   0,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  34,   0,  16,   0, \n      5,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n    140,   0,   0,  20, 194,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   6,   4, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  20, \n    194,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n    246,  11,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  17,  82,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,  13,   0, \n      0,   0,   0,   0,   0,   0, \n     28,   0,   0,   0,   0,   0, \n      0,   0,   6, 131,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     41,   0,   0,   6,  18,   0, \n     16,   0,   5,   0,   0,   0, \n     10,   0,   2,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     83,   0,   0,   6,  34,   0, \n     16,   0,   5,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,   2,   0, \n     35,   0,   0,   9,  98,   0, \n     16,   0,   1,   0,   0,   0, \n    166,  11,  16,   0,   1,   0, \n      0,   0,   6,   1,  16,   0, \n      2,   0,   0,   0,   6,   1, \n     16,   0,   5,   0,   0,   0, \n     80,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      4,   0,   0,   0,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  34,   0,  16,   0, \n      6,   0,   0,   0,  42,   0, \n     16,   0,   4,   0,   0,   0, \n     18,   0,   0,   1,  32,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   4,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  31,   0,   4,   3, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     34,   0,  16,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  18,   0, \n      0,   1,  54,   0,   0,   5, \n     34,   0,  16,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  21,   0,   0,   1, \n     41,   0,   0,  10,  98,   0, \n     16,   0,   1,   0,   0,   0, \n     86,   6,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,   7,  18,   0,  16,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   6,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0, 140,   0,   0,  17, \n     98,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   4,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      6,   1,  16,   0,   6,   0, \n      0,   0,  86,   6,  16,   0, \n      1,   0,   0,   0,  38,   0, \n      0,  11,   0, 208,   0,   0, \n    162,   0,  16,   0,   5,   0, \n      0,   0,   6,   4,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     80,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     78,   0,   0,   8,  50,   0, \n     16,   0,   6,   0,   0,   0, \n      0, 208,   0,   0, 150,   5, \n     16,   0,   1,   0,   0,   0, \n    214,   5,  16,   0,   5,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      6,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   6,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     35,   0,   0,  10,  98,   0, \n     16,   0,   1,   0,   0,   0, \n      6,   1,  16, 128,  65,   0, \n      0,   0,   6,   0,   0,   0, \n     86,   7,  16,   0,   5,   0, \n      0,   0,  86,   6,  16,   0, \n      1,   0,   0,   0,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      0,   0,   0,   0,  85,   0, \n      0,   7,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   5,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  80,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     40,   0,   0,   5, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     21,   0,   0,   1,  38,   0, \n      0,   8,   0, 208,   0,   0, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      5,   0,   0,   0,  26,   0, \n     16,   0,   5,   0,   0,   0, \n     35,   0,   0,   9,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      5,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     41,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     11,   0,   0,   0,  78,   0, \n      0,   8,   0, 208,   0,   0, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     41,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  39,   0, \n      0,  10,  98,   0,  16,   0, \n      0,   0,   0,   0, 166,  10, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   0,   0,   0,   0, \n    165,   0,   0,   8,  34,   0, \n     16,   0,   6,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    226,   0,  16,   0,   1,   0, \n      0,   0,   6,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n    165,   0,   0,   8,  66,   0, \n     16,   0,   6,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n     18,   0,  16,   0,   6,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8, 130,   0,  16,   0, \n      6,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  10,  98,   0, \n     16,   0,   0,   0,   0,   0, \n      6,   0,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  32,   0, \n      0,   0,  48,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8,  18,   0,  16,   0, \n      7,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,  10,  98,   0, \n     16,   0,   1,   0,   0,   0, \n     86,   6,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8,  34,   0,  16,   0, \n      7,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    165,   0,   0,   8,  66,   0, \n     16,   0,   7,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n    130,   0,  16,   0,   7,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  18,   0, \n      0,   1,  30,   0,   0,  10, \n    226,   0,  16,   0,   1,   0, \n      0,   0,   6,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,  12,   0, \n      0,   0,  36,   0,   0,   0, \n    165,   0,   0,   8,  34,   0, \n     16,   0,   6,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n     66,   0,  16,   0,   6,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  34,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0,  30,   0,   0,  10, \n     98,   0,  16,   0,   0,   0, \n      0,   0,  86,   5,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    165,   0,   0,   8,  18,   0, \n     16,   0,   6,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n    130,   0,  16,   0,   6,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8,  18,   0,  16,   0, \n      7,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,   0,   0,   0,   0, \n      6,   0,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n     44,   0,   0,   0,  52,   0, \n      0,   0,  60,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8,  34,   0,  16,   0, \n      7,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    165,   0,   0,   8,  66,   0, \n     16,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n    130,   0,  16,   0,   7,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  32,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      5,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     39,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  80,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     80,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  31,   0, \n      4,   3,  10,   0,  16,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      6,   0,   0,   0,  58,   0, \n     16,   0,   6,   0,   0,   0, \n     21,   0,   0,   1,  54,   0, \n      0,   5,  82,   0,  16,   0, \n      6,   0,   0,   0,   6,   0, \n     16,   0,   6,   0,   0,   0, \n     21,   0,   0,   1,  54,   0, \n      0,   5, 114,   0,  16,   0, \n      6,   0,   0,   0, 134,   2, \n     16,   0,   6,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      3,   0,   0,   0, 138,   0, \n      0,  11,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n      1,  64,   0,   0,  24,   0, \n      0,   0,  10, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     76,   0,   0,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   0,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   1,   0,   0,   0, \n    150,  12,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 150,  12,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 150,  12, \n     16,   0,   6,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     38,  13,  16,   0,   1,   0, \n      0,   0,  38,  13,  16,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255, 140,   0,   0,  17, \n    242,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,  10,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,  12,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   1,   0,   0,   0, \n    150,  12,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 252,  15, 192,   0, 252, \n     15, 192,   0, 252,  15, 192, \n      0, 252,  15, 192, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0, 150,  12,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0, 150,  12, \n     16,   0,   6,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     38,  13,  16,   0,   1,   0, \n      0,   0,  38,  13,  16,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   0, 252, \n     15, 192,   0, 252,  15, 192, \n      0, 252,  15, 192,   0, 252, \n     15, 192, 140,   0,   0,  17, \n    242,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,   2,   0,   0,   1, \n     10,   0,   0,   1,   2,   0, \n      0,   1,  23,   0,   0,   1, \n     21,   0,   0,   1,  54,   0, \n      0,   4,  66,   0,  16,   0, \n      5,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,   9, \n     50,   0,  16,   0,   0,   0, \n      0,   0, 230,  10,  16,   0, \n      2,   0,   0,   0,  22,   5, \n     16,   0,   2,   0,   0,   0, \n     38,  10,  16,   0,   5,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  22,   5,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   4,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     78,   0,   0,   8, 242,   0, \n     16,   0,   5,   0,   0,   0, \n      0, 208,   0,   0,  22,   5, \n     16,   0,   1,   0,   0,   0, \n     22,   5,  16,   0,   2,   0, \n      0,   0,  35,   0,   0,  10, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16, 128, \n     65,   0,   0,   0,   2,   0, \n      0,   0, 214,   5,  16,   0, \n      5,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n     41,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  20,  50,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   6,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  18,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  25,   0, \n      0,   0,   1,  64,   0,   0, \n      7,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   3,   0,   0,   0, \n    138,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     10,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  42,   0, \n      0,   7,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0, 139,   0,   0,  15, \n    242,   0,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n     28,   0,   0,   0,  27,   0, \n      0,   0,  31,   0,   0,   0, \n     29,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n    118,  15,  16,   0,   5,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   4,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   5,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  66,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      4,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  25,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     87,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,  42,   0, \n      0,   7,  34,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   7, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n    140,   0,   0,  20,  82,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0,   6,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     41,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 139,   0,   0,  15, \n     98,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  27,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     18,   0,   0,   1, 139,   0, \n      0,  15, 242,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  27,   0,   0,   0, \n     27,   0,   0,   0,  31,   0, \n      0,   0,  28,   0,   0,   0, \n      2,  64,   0,   0,   4,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  20,  98,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0, 166,  11,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  18,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  26,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0, 139,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  29,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      5,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  41,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  30,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n    139,   0,   0,  15,  50,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  27,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   6,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  66,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  38,   0,   0,   8, \n      0, 208,   0,   0,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  32,   0, \n      0,  10, 226,   0,  16,   0, \n      0,   0,   0,   0, 246,  15, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      2,   0,   0,   0,   3,   0, \n      0,   0,  60,   0,   0,   7, \n     98,   0,  16,   0,   0,   0, \n      0,   0, 166,  11,  16,   0, \n      0,   0,   0,   0,  86,   6, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   1,   0,   0,   0, \n    150,  12,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,  85,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0, 150,  12,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      6,   0,   0,   0,  38,  13, \n     16,   0,   1,   0,   0,   0, \n     38,  13,  16,   0,   2,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   1,   0,   0,   0, \n    150,  12,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  38,  13, \n     16,   0,   1,   0,   0,   0, \n     21,   0,   0,   1, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0, 150,  12, \n     16,   0,   6,   0,   0,   0, \n     30,   0,   0,   7, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  21,   0, \n      0,   1, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,  62,   0, \n      0,   1,  83,  84,  65,  84, \n    148,   0,   0,   0, 204,   0, \n      0,   0,   9,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     53,   0,   0,   0,  36,   0, \n      0,   0,  10,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/resolve_fast_64bpp_1x2xmsaa_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_resolve_edram_info;        // Offset:    0 Size:     4\n//   uint xe_resolve_coordinate_info;   // Offset:    4 Size:     4\n//   uint xe_resolve_dest_info;         // Offset:    8 Size:     4\n//   uint xe_resolve_dest_coordinate_info;// Offset:   12 Size:     4\n//   uint xe_resolve_dest_base;         // Offset:   16 Size:     4\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_resolve_edram                  texture    byte         r/o      T0             t0      1 \n// xe_resolve_dest                       UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][2], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xy\ndcl_temps 7\ndcl_thread_group 8, 8, 1\nand r0.xyzw, CB0[0][0].zxzz, l(7, 1023, 8, 0x01000000)\nand r1.x, CB0[0][0].w, l(1023)\nushr r2.xyz, CB0[0][0].yywy, l(4, 5, 10, 0)\nushr r3.xyzw, CB0[0][0].wwww, l(24, 20, 24, 24)\nishl r4.y, vThreadID.x, l(2)\nbfi r1.y, l(11), l(3), r2.y, l(0)\nuge r1.y, r4.y, r1.y\nif_nz r1.y\n  ret \nendif \nmov r2.w, CB0[0][0].y\nbfi r1.yz, l(0, 4, 1, 0), l(0, 3, 3, 0), r2.wwxw, l(0, 0, 0, 0)\nbfi r3.xyzw, l(4, 4, 4, 4), l(3, 3, 3, 3), r3.xyzw, l(0, 0, 0, 0)\nubfe r2.xyw, l(2, 3, 0, 11), l(10, 28, 0, 13), CB0[0][0].xwxx\nmov r4.xzw, vThreadID.yyyy\niadd r1.yz, r1.yyzy, r4.yywy\nuge r1.w, l(3), r2.y\nif_z r1.w\n  ieq r1.w, r2.y, l(5)\n  if_nz r1.w\n    mov r2.y, l(2)\n  else \n    mov r2.y, l(0)\n  endif \nendif \nuge r5.xy, r2.xxxx, l(2, 1, 0, 0)\nand r5.xy, r5.xyxx, l(1, 1, 0, 0)\nishl r1.yz, r1.yyzy, r5.xxyx\nushr r2.x, r2.y, l(1)\nand r2.xy, r2.xyxx, l(1, 1, 0, 0)\niadd r1.yz, r1.yyzy, r2.xxyx\nudiv r2.xy, null, r1.yzyy, l(40, 16, 0, 0)\nimad r0.y, r2.y, r0.y, r2.x\niadd r0.y, r0.y, r2.w\nimad r1.yz, -r2.xxyx, l(0, 40, 16, 0), r1.yyzy\nimad r1.y, r1.z, l(40), r1.y\nishl r1.y, r1.y, l(1)\nimad r0.y, r0.y, l(1280), r1.y\nudiv null, r0.y, r0.y, l(0x00280000)\nishl r0.y, r0.y, l(2)\nld_raw r5.xyzw, r0.y, T0[0].xyzw\niadd r0.y, r0.y, l(16)\nld_raw r6.xyzw, r0.y, T0[0].xyzw\nif_nz r0.w\n  ubfe r0.y, l(4), l(24), CB0[0][0].x\n  ieq r0.yw, r0.yyyy, l(0, 5, 0, 7)\n  or r0.y, r0.w, r0.y\n  if_nz r0.y\n    bfi r5.xyzw, l(16, 16, 16, 16), l(0, 0, 0, 0), r5.yxwz, r5.xyzw\n    bfi r6.xyzw, l(16, 16, 16, 16), l(0, 0, 0, 0), r6.yxwz, r6.xyzw\n  endif \nendif \niadd r3.xyzw, r3.xyzw, r4.xyzw\nif_nz r0.z\n  ubfe r0.y, l(3), l(4), CB0[0][0].z\n  bfi r0.z, l(10), l(1), r2.z, l(0)\n  ishr r0.w, r0.y, l(2)\n  ishr r2.xyzw, r3.wyww, l(4, 5, 1, 3)\n  imad r0.z, r0.w, r0.z, r2.x\n  imad r0.z, r0.z, r1.x, r2.y\n  bfi r0.y, l(2), l(5), r0.y, l(0)\n  bfi r1.y, l(2), l(3), r2.z, l(0)\n  iadd r0.y, r0.y, r1.y\n  bfi r0.y, l(3), l(0), r3.y, r0.y\n  bfi r0.y, l(25), l(7), r0.z, r0.y\n  xor r0.z, r0.w, r2.w\n  ubfe r0.w, l(2), l(3), r3.y\n  bfi r1.yz, l(0, 1, 1, 0), l(0, 1, 11, 0), r0.zzzz, l(0, 0, 0, 0)\n  xor r0.z, r0.w, r1.y\n  bfi r0.w, l(1), l(4), r3.w, l(0)\n  imad r0.z, r0.z, l(64), r0.w\n  iadd r0.z, r1.z, r0.z\n  ibfe r0.yw, l(0, 27, 0, 24), l(0, 2, 0, 5), r0.yyyy\n  bfi r0.y, l(3), l(8), r0.y, r0.z\n  bfi r0.y, l(20), l(12), r0.w, r0.y\nelse \n  ishr r2.xyzw, r3.xyzw, l(5, 5, 1, 4)\n  imad r0.z, r2.x, r1.x, r2.y\n  bfi r1.xy, l(3, 1, 0, 0), l(3, 11, 0, 0), r2.zwzz, l(0, 0, 0, 0)\n  bfi r0.w, l(3), l(0), r3.y, r1.x\n  imad r0.z, r0.z, l(64), r0.w\n  ubfe r0.w, l(2), l(3), r3.y\n  ishr r1.x, r3.w, l(3)\n  bfi r1.x, l(1), l(1), r1.x, l(0)\n  xor r0.w, r0.w, r1.x\n  bfi r1.x, l(1), l(4), r3.w, l(0)\n  imad r0.w, r0.w, l(64), r1.x\n  iadd r0.w, r1.y, r0.w\n  ibfe r1.xy, l(27, 24, 0, 0), l(2, 5, 0, 0), r0.zzzz\n  bfi r0.z, l(3), l(8), r1.x, r0.w\n  bfi r0.y, l(20), l(12), r1.y, r0.z\nendif \niadd r0.y, r0.y, CB0[0][1].x\nieq r0.z, r0.x, l(4)\nif_nz r0.z\n  mov r5.xyzw, r5.yxwz\n  mov r0.w, l(2)\nelse \n  mov r0.w, r0.x\nendif \nieq r1.xyz, r0.wwww, l(1, 2, 3, 0)\nor r1.xy, r1.yzyy, r1.xyxx\nif_nz r1.x\n  ishl r2.xyzw, r5.xyzw, l(8, 8, 8, 8)\n  and r2.xyzw, r2.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r3.xyzw, r5.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r5.xyzw, r2.xyzw, r3.xyzw\nendif \nif_nz r1.y\n  ushr r1.xyzw, r5.xyzw, l(16, 16, 16, 16)\n  bfi r5.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r5.xyzw, r1.xyzw\nendif \nstore_raw U0[0].xyzw, r0.y, r5.xyzw\niadd r0.y, r0.y, l(32)\nif_nz r0.z\n  mov r6.xyzw, r6.yxwz\n  mov r0.x, l(2)\nendif \nieq r0.xzw, r0.xxxx, l(1, 0, 2, 3)\nor r0.xz, r0.zzwz, r0.xxzx\nif_nz r0.x\n  ishl r1.xyzw, r6.xyzw, l(8, 8, 8, 8)\n  and r1.xyzw, r1.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r2.xyzw, r6.xyzw, l(8, 8, 8, 8)\n  and r2.xyzw, r2.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r6.xyzw, r1.xyzw, r2.xyzw\nendif \nif_nz r0.z\n  ushr r1.xyzw, r6.xyzw, l(16, 16, 16, 16)\n  bfi r6.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r6.xyzw, r1.xyzw\nendif \nstore_raw U0[0].xyzw, r0.y, r6.xyzw\nret \n// Approximately 134 instruction slots used\n#endif\n\nconst BYTE resolve_fast_64bpp_1x2xmsaa_cs[] =\n{\n     68,  88,  66,  67, 208, 185, \n    147,   7, 140, 202,   6,  94, \n    222,  29, 191,  24, 167,  93, \n    220, 206,   1,   0,   0,   0, \n    164,  20,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n    208,   2,   0,   0, 224,   2, \n      0,   0, 240,   2,   0,   0, \n      8,  20,   0,   0,  82,  68, \n     69,  70, 148,   2,   0,   0, \n      1,   0,   0,   0, 228,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    105,   2,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 197,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 213,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 114, 101, 115, \n    111, 108, 118, 101,  95, 101, \n    100, 114,  97, 109,   0, 120, \n    101,  95, 114, 101, 115, 111, \n    108, 118, 101,  95, 100, 101, \n    115, 116,   0, 112, 117, 115, \n    104,  95,  99, 111, 110, 115, \n    116, 115,  95, 120, 101,   0, \n    213,   0,   0,   0,   5,   0, \n      0,   0, 252,   0,   0,   0, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    196,   1,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 224,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,   4,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 224,   1,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  31,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    224,   1,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     52,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 224,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  84,   2, \n      0,   0,  16,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 224,   1,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 114, \n    101, 115, 111, 108, 118, 101, \n     95, 101, 100, 114,  97, 109, \n     95, 105, 110, 102, 111,   0, \n    100, 119, 111, 114, 100,   0, \n      0,   0,  19,   0,   1,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 218,   1,   0,   0, \n    120, 101,  95, 114, 101, 115, \n    111, 108, 118, 101,  95,  99, \n    111, 111, 114, 100, 105, 110, \n     97, 116, 101,  95, 105, 110, \n    102, 111,   0, 120, 101,  95, \n    114, 101, 115, 111, 108, 118, \n    101,  95, 100, 101, 115, 116, \n     95, 105, 110, 102, 111,   0, \n    120, 101,  95, 114, 101, 115, \n    111, 108, 118, 101,  95, 100, \n    101, 115, 116,  95,  99, 111, \n    111, 114, 100, 105, 110,  97, \n    116, 101,  95, 105, 110, 102, \n    111,   0, 120, 101,  95, 114, \n    101, 115, 111, 108, 118, 101, \n     95, 100, 101, 115, 116,  95, \n     98,  97, 115, 101,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n     16,  17,   0,   0,  81,   0, \n      5,   0,  68,   4,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n     50,   0,   2,   0, 104,   0, \n      0,   2,   7,   0,   0,   0, \n    155,   0,   0,   4,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  12, 242,   0,  16,   0, \n      0,   0,   0,   0,  38, 138, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0, 255,   3, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   1,   1,   0, \n      0,   9,  18,   0,  16,   0, \n      1,   0,   0,   0,  58, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n    255,   3,   0,   0,  85,   0, \n      0,  12, 114,   0,  16,   0, \n      2,   0,   0,   0,  86, 135, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,   5,   0, \n      0,   0,  10,   0,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  12, 242,   0,  16,   0, \n      3,   0,   0,   0, 246, 143, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n     24,   0,   0,   0,  20,   0, \n      0,   0,  24,   0,   0,   0, \n     24,   0,   0,   0,  41,   0, \n      0,   6,  34,   0,  16,   0, \n      4,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  11,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     80,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      1,   0,   0,   0,  62,   0, \n      0,   1,  21,   0,   0,   1, \n     54,   0,   0,   7, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  20,  98,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 246,  12,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  20, 242,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   4,   0, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  17, \n    178,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     28,   0,   0,   0,   0,   0, \n      0,   0,  13,   0,   0,   0, \n    198, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   4, 210,   0,  16,   0, \n      4,   0,   0,   0,  86,   5, \n      2,   0,  30,   0,   0,   7, \n     98,   0,  16,   0,   1,   0, \n      0,   0,  86,   6,  16,   0, \n      1,   0,   0,   0,  86,   7, \n     16,   0,   4,   0,   0,   0, \n     80,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  31,   0, \n      0,   3,  58,   0,  16,   0, \n      1,   0,   0,   0,  32,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  31,   0,   4,   3, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  54,   0,   0,   5, \n     34,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  18,   0, \n      0,   1,  54,   0,   0,   5, \n     34,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  21,   0,   0,   1, \n     80,   0,   0,  10,  50,   0, \n     16,   0,   5,   0,   0,   0, \n      6,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10,  50,   0,  16,   0, \n      5,   0,   0,   0,  70,   0, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,   7, \n     98,   0,  16,   0,   1,   0, \n      0,   0,  86,   6,  16,   0, \n      1,   0,   0,   0,   6,   1, \n     16,   0,   5,   0,   0,   0, \n     85,   0,   0,   7,  18,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  10,  50,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     98,   0,  16,   0,   1,   0, \n      0,   0,  86,   6,  16,   0, \n      1,   0,   0,   0,   6,   1, \n     16,   0,   2,   0,   0,   0, \n     78,   0,   0,  11,  50,   0, \n     16,   0,   2,   0,   0,   0, \n      0, 208,   0,   0, 150,   5, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  40,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  30,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,  13,  98,   0, \n     16,   0,   1,   0,   0,   0, \n      6,   1,  16, 128,  65,   0, \n      0,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  40,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  86,   6,  16,   0, \n      1,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  40,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  41,   0, \n      0,   7,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   5,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  78,   0,   0,   8, \n      0, 208,   0,   0,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,  40,   0,  41,   0, \n      0,   7,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  31,   0, \n      4,   3,  58,   0,  16,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n      1,  64,   0,   0,  24,   0, \n      0,   0,  10, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     32,   0,   0,  10, 162,   0, \n     16,   0,   0,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   5,   0, \n      0,   0,   0,   0,   0,   0, \n      7,   0,   0,   0,  60,   0, \n      0,   7,  34,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     22,  11,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  22,  11,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     21,   0,   0,   1,  21,   0, \n      0,   1,  30,   0,   0,   7, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n    138,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     66,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     10,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  42,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0, 118,  15,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   4,   0,   0,   0, \n      5,   0,   0,   0,   1,   0, \n      0,   0,   3,   0,   0,   0, \n     35,   0,   0,   9,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,   9,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  25,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     87,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0, 138,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0, 140,   0, \n      0,  20,  98,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0, 166,  10,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11, 130,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     35,   0,   0,   9,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     64,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0, 139,   0, \n      0,  15, 162,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     27,   0,   0,   0,   0,   0, \n      0,   0,  24,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   5,   0, \n      0,   0,  86,   5,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   8,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  20,   0, \n      0,   0,   1,  64,   0,   0, \n     12,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  18,   0,   0,   1, \n     42,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,   1,   0,   0,   0, \n      4,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  20,  50,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 230,  10,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  11, 130,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  64,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0, 138,   0,   0,   9, \n    130,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,  42,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n    140,   0,   0,  11,  18,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  18,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  35,   0,   0,   9, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  64,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n    139,   0,   0,  15,  50,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  27,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   5,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 166,  10, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  66,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  30,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  32,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     54,   0,   0,   5, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     22,  11,  16,   0,   5,   0, \n      0,   0,  54,   0,   0,   5, \n    130,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  18,   0, \n      0,   1,  54,   0,   0,   5, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  32,   0,   0,  10, \n    114,   0,  16,   0,   1,   0, \n      0,   0, 246,  15,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      2,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,   1,   0,   0,   0, \n    150,   5,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,  31,   0, \n      4,   3,  10,   0,  16,   0, \n      1,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      1,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  21,   0, \n      0,   1, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  30,   0, \n      0,   7,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  32,   0, \n      0,   0,  31,   0,   4,   3, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  22,  11,  16,   0, \n      6,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     21,   0,   0,   1,  32,   0, \n      0,  10, 210,   0,  16,   0, \n      0,   0,   0,   0,   6,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   3,   0, \n      0,   0,  60,   0,   0,   7, \n     82,   0,  16,   0,   0,   0, \n      0,   0, 166,  11,  16,   0, \n      0,   0,   0,   0,   6,   2, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,  85,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     21,   0,   0,   1, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     62,   0,   0,   1,  83,  84, \n     65,  84, 148,   0,   0,   0, \n    134,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  37,   0,   0,   0, \n     26,   0,   0,   0,   5,   0, \n      0,   0,  12,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   9,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/resolve_fast_64bpp_1x2xmsaa_scaled_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_resolve_edram_info;        // Offset:    0 Size:     4\n//   uint xe_resolve_coordinate_info;   // Offset:    4 Size:     4\n//   uint xe_resolve_dest_info;         // Offset:    8 Size:     4\n//   uint xe_resolve_dest_coordinate_info;// Offset:   12 Size:     4\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_resolve_edram                  texture    byte         r/o      T0             t0      1 \n// xe_resolve_dest                       UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][1], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xy\ndcl_temps 7\ndcl_thread_group 8, 8, 1\nand r0.xyzw, CB0[0][0].zxxz, l(7, 1023, 0x20000000, 8)\nif_nz r0.z\n  ubfe r1.xy, l(2, 2, 0, 0), l(17, 20, 0, 0), CB0[0][0].yyyy\nelse \n  mov r1.xy, l(0,0,0,0)\nendif \nubfe r2.xyz, l(3, 3, 11, 0), l(16, 19, 5, 0), CB0[0][0].yyyy\nimul null, r0.z, r2.x, r2.z\nand r1.zw, CB0[0][0].zzzw, l(0, 0, 0x01000000, 1023)\nushr r3.xyzw, CB0[0][0].ywww, l(4, 10, 20, 24)\nishl r4.x, vThreadID.x, l(2)\nishl r0.z, r0.z, l(3)\nuge r0.z, r4.x, r0.z\nif_nz r0.z\n  ret \nendif \nmov r5.x, CB0[0][0].y\nmov r5.y, r3.x\nbfi r2.zw, l(0, 0, 4, 1), l(0, 0, 3, 3), r5.xxxy, l(0, 0, 0, 0)\nbfi r3.xz, l(4, 0, 4, 0), l(3, 0, 3, 0), r3.zzwz, l(0, 0, 0, 0)\nubfe r5.xyz, l(2, 3, 11, 0), l(10, 28, 13, 0), CB0[0][0].xwxx\numax r4.y, r1.y, vThreadID.y\nimad r2.zw, r2.zzzw, r2.xxxy, r4.xxxy\nuge r0.z, l(3), r5.y\nif_z r0.z\n  ieq r0.z, r5.y, l(5)\n  if_nz r0.z\n    mov r5.y, l(2)\n  else \n    mov r5.y, l(0)\n  endif \nendif \nuge r4.yw, r5.xxxx, l(0, 2, 0, 1)\nand r4.yw, r4.yyyw, l(0, 1, 0, 1)\nishl r2.zw, r2.zzzw, r4.yyyw\nushr r5.x, r5.y, l(1)\nand r4.yw, r5.xxxy, l(0, 1, 0, 1)\niadd r2.zw, r2.zzzw, r4.yyyw\nimul null, r6.yz, r2.xxyx, l(0, 80, 16, 0)\nushr r6.x, r6.y, l(1)\nudiv r4.yw, null, r2.zzzw, r6.xxxz\nimad r0.y, r4.w, r0.y, r4.y\niadd r0.y, r0.y, r5.z\nimad r2.zw, -r4.yyyw, r6.xxxz, r2.zzzw\nimul null, r0.z, r6.z, r6.y\nimad r1.y, r2.w, r6.x, r2.z\nishl r1.y, r1.y, l(1)\nimad r0.y, r0.y, r0.z, r1.y\nishl r0.z, r0.z, l(11)\nudiv null, r0.y, r0.y, r0.z\nishl r0.y, r0.y, l(2)\nld_raw r5.xyzw, r0.y, T0[0].zwxy\niadd r0.y, r0.y, l(16)\nld_raw r6.xyzw, r0.y, T0[0].xyzw\nieq r0.y, r4.x, l(0)\nine r0.z, r1.x, l(0)\nand r0.y, r0.z, r0.y\nif_nz r0.y\n  uge r0.y, r1.x, l(2)\n  if_nz r0.y\n    uge r0.y, r1.x, l(3)\n    if_nz r0.y\n      mov r6.xy, r6.zwzz\n    endif \n    mov r5.xy, r6.xyxx\n  endif \n  mov r5.xyzw, r5.xyxy\nendif \nif_nz r1.z\n  ubfe r0.y, l(4), l(24), CB0[0][0].x\n  ieq r0.yz, r0.yyyy, l(0, 5, 7, 0)\n  or r0.y, r0.z, r0.y\n  if_nz r0.y\n    bfi r5.xyzw, l(16, 16, 16, 16), l(0, 0, 0, 0), r5.yxwz, r5.xyzw\n    mov r6.zw, r6.wwwz\n    bfi r6.xyzw, l(16, 16, 16, 16), l(0, 0, 0, 0), r6.yxzw, r6.xywz\n  endif \nendif \nmov r4.z, vThreadID.y\nimad r0.yz, r3.xxzx, r2.xxyx, r4.xxzx\nushr r1.xy, r0.yzyy, l(2, 1, 0, 0)\nudiv r2.zw, null, r1.xxxy, r2.xxxy\nimad r1.xy, -r2.xyxx, r2.zwzz, r1.xyxx\nishl r0.y, r2.z, l(2)\nimad r1.x, r1.x, r2.y, r1.y\nbfi r0.z, l(1), l(5), r0.z, l(0)\nbfi r0.z, l(26), l(6), r1.x, r0.z\nif_nz r0.w\n  ubfe r0.w, l(3), l(4), CB0[0][0].z\n  bfi r1.x, l(10), l(1), r3.y, l(0)\n  ishr r1.y, r0.w, l(2)\n  ibfe r3.xyzw, l(28, 27, 31, 29), l(3, 3, 0, 2), r2.wzww\n  imad r1.x, r1.y, r1.x, r3.x\n  imad r1.x, r1.x, r1.w, r3.y\n  bfi r0.w, l(2), l(5), r0.w, l(0)\n  bfi r1.z, l(2), l(3), r3.z, l(0)\n  iadd r0.w, r0.w, r1.z\n  bfi r0.w, l(3), l(0), r0.y, r0.w\n  bfi r0.w, l(25), l(7), r1.x, r0.w\n  xor r1.x, r1.y, r3.w\n  ibfe r1.y, l(29), l(1), r2.z\n  and r1.y, r1.y, l(3)\n  bfi r1.xz, l(1, 0, 1, 0), l(1, 0, 11, 0), r1.xxxx, l(0, 0, 0, 0)\n  xor r1.x, r1.x, r1.y\n  ishl r1.x, r1.x, l(6)\n  iadd r1.x, r1.z, r1.x\n  ibfe r1.yz, l(0, 27, 24, 0), l(0, 2, 5, 0), r0.wwww\n  bfi r0.w, l(3), l(8), r1.y, r1.x\n  bfi r0.w, l(20), l(12), r1.z, r0.w\nelse \n  ibfe r3.xyzw, l(27, 27, 31, 28), l(4, 3, 0, 3), r2.wzww\n  imad r1.x, r3.x, r1.w, r3.y\n  bfi r1.yz, l(0, 3, 1, 0), l(0, 3, 11, 0), r3.zzwz, l(0, 0, 0, 0)\n  bfi r0.y, l(3), l(0), r0.y, r1.y\n  bfi r0.y, l(26), l(6), r1.x, r0.y\n  ibfe r1.xy, l(29, 29, 0, 0), l(1, 2, 0, 0), r2.zwzz\n  and r1.x, r1.x, l(3)\n  bfi r1.y, l(1), l(1), r1.y, l(0)\n  xor r1.x, r1.y, r1.x\n  ishl r1.x, r1.x, l(6)\n  iadd r1.x, r1.z, r1.x\n  ibfe r1.yz, l(0, 27, 24, 0), l(0, 2, 5, 0), r0.yyyy\n  bfi r0.y, l(3), l(8), r1.y, r1.x\n  bfi r0.w, l(20), l(12), r1.z, r0.y\nendif \nimul null, r0.y, r2.y, r2.x\nimad r0.y, r0.w, r0.y, r0.z\nieq r0.z, r0.x, l(4)\nif_nz r0.z\n  mov r5.xyzw, r5.yxwz\n  mov r0.w, l(2)\nelse \n  mov r0.w, r0.x\nendif \nieq r1.xyz, r0.wwww, l(1, 2, 3, 0)\nor r1.xy, r1.yzyy, r1.xyxx\nif_nz r1.x\n  ishl r2.xyzw, r5.zwxy, l(8, 8, 8, 8)\n  and r2.xyzw, r2.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r3.xyzw, r5.zwxy, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r5.xyzw, r2.zwxy, r3.zwxy\nendif \nif_nz r1.y\n  ushr r1.xyzw, r5.zwxy, l(16, 16, 16, 16)\n  bfi r5.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r5.xyzw, r1.zwxy\nendif \nstore_raw U0[0].xyzw, r0.y, r5.zwxy\niadd r0.w, r0.y, l(16)\nif_nz r0.z\n  mov r6.xyzw, r6.yxwz\n  mov r0.x, l(2)\nendif \nieq r1.xyz, r0.xxxx, l(1, 2, 3, 0)\nor r0.xz, r1.yyzy, r1.xxyx\nif_nz r0.x\n  ishl r1.xyzw, r6.xyzw, l(8, 8, 8, 8)\n  and r1.xyzw, r1.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r2.xyzw, r6.xyzw, l(8, 8, 8, 8)\n  and r2.xyzw, r2.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r6.xyzw, r1.xyzw, r2.xyzw\nendif \nif_nz r0.z\n  ushr r1.xyzw, r6.xyzw, l(16, 16, 16, 16)\n  bfi r6.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r6.xyzw, r1.xyzw\nendif \nstore_raw U0[0].xyzw, r0.w, r6.xyzw\nret \n// Approximately 168 instruction slots used\n#endif\n\nconst BYTE resolve_fast_64bpp_1x2xmsaa_scaled_cs[] =\n{\n     68,  88,  66,  67,  16, 143, \n    210, 226, 155, 128, 235, 227, \n     57, 174, 138, 142,  81,  93, \n     78,  56,   1,   0,   0,   0, \n    228,  23,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n    144,   2,   0,   0, 160,   2, \n      0,   0, 176,   2,   0,   0, \n     72,  23,   0,   0,  82,  68, \n     69,  70,  84,   2,   0,   0, \n      1,   0,   0,   0, 228,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n     44,   2,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 197,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 213,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 114, 101, 115, \n    111, 108, 118, 101,  95, 101, \n    100, 114,  97, 109,   0, 120, \n    101,  95, 114, 101, 115, 111, \n    108, 118, 101,  95, 100, 101, \n    115, 116,   0, 112, 117, 115, \n    104,  95,  99, 111, 110, 115, \n    116, 115,  95, 120, 101,   0, \n    213,   0,   0,   0,   4,   0, \n      0,   0, 252,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    156,   1,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 184,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 220,   1, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 184,   1,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 247,   1,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    184,   1,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     12,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 184,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 120, 101, \n     95, 114, 101, 115, 111, 108, \n    118, 101,  95, 101, 100, 114, \n     97, 109,  95, 105, 110, 102, \n    111,   0, 100, 119, 111, 114, \n    100,   0,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 178,   1, \n      0,   0, 120, 101,  95, 114, \n    101, 115, 111, 108, 118, 101, \n     95,  99, 111, 111, 114, 100, \n    105, 110,  97, 116, 101,  95, \n    105, 110, 102, 111,   0, 120, \n    101,  95, 114, 101, 115, 111, \n    108, 118, 101,  95, 100, 101, \n    115, 116,  95, 105, 110, 102, \n    111,   0, 120, 101,  95, 114, \n    101, 115, 111, 108, 118, 101, \n     95, 100, 101, 115, 116,  95, \n     99, 111, 111, 114, 100, 105, \n    110,  97, 116, 101,  95, 105, \n    110, 102, 111,   0,  77, 105, \n     99, 114, 111, 115, 111, 102, \n    116,  32,  40,  82,  41,  32, \n     72,  76,  83,  76,  32,  83, \n    104,  97, 100, 101, 114,  32, \n     67, 111, 109, 112, 105, 108, \n    101, 114,  32,  49,  48,  46, \n     49,   0,  73,  83,  71,  78, \n      8,   0,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     79,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  83,  72, \n     69,  88, 144,  20,   0,   0, \n     81,   0,   5,   0,  36,   5, \n      0,   0, 106,   8,   0,   1, \n     89,   0,   0,   7,  70, 142, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0, 161,   0, \n      0,   6,  70, 126,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 157,   0, \n      0,   6,  70, 238,  49,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  95,   0, \n      0,   2,  50,   0,   2,   0, \n    104,   0,   0,   2,   7,   0, \n      0,   0, 155,   0,   0,   4, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,  12, 242,   0, \n     16,   0,   0,   0,   0,   0, \n     38, 136,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n    255,   3,   0,   0,   0,   0, \n      0,  32,   8,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n    138,   0,   0,  17,  50,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n     17,   0,   0,   0,  20,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86, 133, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  18,   0,   0,   1, \n     54,   0,   0,   8,  50,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n    138,   0,   0,  17, 114,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  19,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,  86, 133, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,   1,   0, \n      0,  12, 194,   0,  16,   0, \n      1,   0,   0,   0, 166, 142, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   1, \n    255,   3,   0,   0,  85,   0, \n      0,  12, 242,   0,  16,   0, \n      3,   0,   0,   0, 214, 143, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     24,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      4,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  80,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      4,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1,  54,   0,   0,   7, \n     18,   0,  16,   0,   5,   0, \n      0,   0,  26, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  34,   0, \n     16,   0,   5,   0,   0,   0, \n     10,   0,  16,   0,   3,   0, \n      0,   0, 140,   0,   0,  20, \n    194,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      6,   4,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  20,  82,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 166,  11,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    138,   0,   0,  17, 114,   0, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   3,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  28,   0, \n      0,   0,  13,   0,   0,   0, \n      0,   0,   0,   0, 198, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  83,   0,   0,   6, \n     34,   0,  16,   0,   4,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,   9, \n    194,   0,  16,   0,   2,   0, \n      0,   0, 166,  14,  16,   0, \n      2,   0,   0,   0,   6,   4, \n     16,   0,   2,   0,   0,   0, \n      6,   4,  16,   0,   4,   0, \n      0,   0,  80,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   5,   0,   0,   0, \n     31,   0,   0,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     32,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  34,   0,  16,   0, \n      5,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     18,   0,   0,   1,  54,   0, \n      0,   5,  34,   0,  16,   0, \n      5,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  21,   0, \n      0,   1,  80,   0,   0,  10, \n    162,   0,  16,   0,   4,   0, \n      0,   0,   6,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,  10, 162,   0, \n     16,   0,   4,   0,   0,   0, \n     86,  13,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  41,   0, \n      0,   7, 194,   0,  16,   0, \n      2,   0,   0,   0, 166,  14, \n     16,   0,   2,   0,   0,   0, \n     86,  13,  16,   0,   4,   0, \n      0,   0,  85,   0,   0,   7, \n     18,   0,  16,   0,   5,   0, \n      0,   0,  26,   0,  16,   0, \n      5,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,  10, 162,   0, \n     16,   0,   4,   0,   0,   0, \n      6,   4,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7, 194,   0,  16,   0, \n      2,   0,   0,   0, 166,  14, \n     16,   0,   2,   0,   0,   0, \n     86,  13,  16,   0,   4,   0, \n      0,   0,  38,   0,   0,  11, \n      0, 208,   0,   0,  98,   0, \n     16,   0,   6,   0,   0,   0, \n      6,   1,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  80,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,   7,  18,   0,  16,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   6,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  78,   0,   0,   8, \n    162,   0,  16,   0,   4,   0, \n      0,   0,   0, 208,   0,   0, \n    166,  14,  16,   0,   2,   0, \n      0,   0,   6,   8,  16,   0, \n      6,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   4,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      4,   0,   0,   0,  30,   0, \n      0,   7,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   5,   0, \n      0,   0,  35,   0,   0,  10, \n    194,   0,  16,   0,   2,   0, \n      0,   0,  86,  13,  16, 128, \n     65,   0,   0,   0,   4,   0, \n      0,   0,   6,   8,  16,   0, \n      6,   0,   0,   0, 166,  14, \n     16,   0,   2,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   6,   0,   0,   0, \n     26,   0,  16,   0,   6,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   6,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  41,   0,   0,   7, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     41,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     11,   0,   0,   0,  78,   0, \n      0,   8,   0, 208,   0,   0, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     41,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      5,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n    230, 116,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     32,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  39,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     80,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      0,   0,   0,   0,  80,   0, \n      0,   7,  34,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     50,   0,  16,   0,   6,   0, \n      0,   0, 230,  10,  16,   0, \n      6,   0,   0,   0,  21,   0, \n      0,   1,  54,   0,   0,   5, \n     50,   0,  16,   0,   5,   0, \n      0,   0,  70,   0,  16,   0, \n      6,   0,   0,   0,  21,   0, \n      0,   1,  54,   0,   0,   5, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,   4,  16,   0, \n      5,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     42,   0,  16,   0,   1,   0, \n      0,   0, 138,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,   1,  64, \n      0,   0,  24,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  32,   0, \n      0,  10,  98,   0,  16,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   5,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  22,  11, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  54,   0,   0,   5, \n    194,   0,  16,   0,   6,   0, \n      0,   0, 246,  11,  16,   0, \n      6,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  22,  14,  16,   0, \n      6,   0,   0,   0,  70,  11, \n     16,   0,   6,   0,   0,   0, \n     21,   0,   0,   1,  21,   0, \n      0,   1,  54,   0,   0,   4, \n     66,   0,  16,   0,   4,   0, \n      0,   0,  26,   0,   2,   0, \n     35,   0,   0,   9,  98,   0, \n     16,   0,   0,   0,   0,   0, \n      6,   2,  16,   0,   3,   0, \n      0,   0,   6,   1,  16,   0, \n      2,   0,   0,   0,   6,   2, \n     16,   0,   4,   0,   0,   0, \n     85,   0,   0,  10,  50,   0, \n     16,   0,   1,   0,   0,   0, \n    150,   5,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  78,   0, \n      0,   8, 194,   0,  16,   0, \n      2,   0,   0,   0,   0, 208, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0,   6,   4, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,  10,  50,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16, 128,  65,   0, \n      0,   0,   2,   0,   0,   0, \n    230,  10,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,  41,   0, \n      0,   7,  34,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     66,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   5,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  66,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  26,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  58,   0, \n     16,   0,   0,   0,   0,   0, \n    138,   0,   0,  11, 130,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     10,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  42,   0, \n      0,   7,  34,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0, 139,   0,   0,  15, \n    242,   0,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n     28,   0,   0,   0,  27,   0, \n      0,   0,  31,   0,   0,   0, \n     29,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n    182,  15,  16,   0,   2,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0, 140,   0,   0,  11, \n    130,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   5,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  66,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11, 130,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11, 130,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  25,   0, \n      0,   0,   1,  64,   0,   0, \n      7,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n    139,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  29,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n      1,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0, 140,   0, \n      0,  20,  82,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0,   6,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  41,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    139,   0,   0,  15,  98,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  27,   0,   0,   0, \n     24,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0, 246,  15, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11, 130,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n    130,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  18,   0, \n      0,   1, 139,   0,   0,  15, \n    242,   0,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n     27,   0,   0,   0,  27,   0, \n      0,   0,  31,   0,   0,   0, \n     28,   0,   0,   0,   2,  64, \n      0,   0,   4,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n    182,  15,  16,   0,   2,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      3,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0, 140,   0,   0,  20, \n     98,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,  11,   0, \n      0,   0,   0,   0,   0,   0, \n    166,  11,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  26,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0, 139,   0,   0,  15, \n     50,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     29,   0,   0,   0,  29,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    230,  10,  16,   0,   2,   0, \n      0,   0,   1,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     41,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 139,   0,   0,  15, \n     98,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  27,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   5,   0, \n      0,   0,   0,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11, 130,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  38,   0, \n      0,   8,   0, 208,   0,   0, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     32,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5, 242,   0,  16,   0, \n      5,   0,   0,   0,  22,  11, \n     16,   0,   5,   0,   0,   0, \n     54,   0,   0,   5, 130,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,  18,   0,   0,   1, \n     54,   0,   0,   5, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     32,   0,   0,  10, 114,   0, \n     16,   0,   1,   0,   0,   0, \n    246,  15,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,  60,   0, \n      0,   7,  50,   0,  16,   0, \n      1,   0,   0,   0, 150,   5, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0, 230,   4,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0, 230,   4, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   5,   0,   0,   0, \n    230,   4,  16,   0,   2,   0, \n      0,   0, 230,   4,  16,   0, \n      3,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   1,   0, \n      0,   0, 230,   4,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n    230,   4,  16,   0,   1,   0, \n      0,   0,  21,   0,   0,   1, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n    230,   4,  16,   0,   5,   0, \n      0,   0,  30,   0,   0,   7, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     54,   0,   0,   5, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     22,  11,  16,   0,   6,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  21,   0, \n      0,   1,  32,   0,   0,  10, \n    114,   0,  16,   0,   1,   0, \n      0,   0,   6,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      2,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  82,   0, \n     16,   0,   0,   0,   0,   0, \n     86,   6,  16,   0,   1,   0, \n      0,   0,   6,   1,  16,   0, \n      1,   0,   0,   0,  31,   0, \n      4,   3,  10,   0,  16,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  21,   0, \n      0,   1, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  62,   0, \n      0,   1,  83,  84,  65,  84, \n    148,   0,   0,   0, 168,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     44,   0,   0,   0,  34,   0, \n      0,   0,   6,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  15,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/resolve_fast_64bpp_4xmsaa_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_resolve_edram_info;        // Offset:    0 Size:     4\n//   uint xe_resolve_coordinate_info;   // Offset:    4 Size:     4\n//   uint xe_resolve_dest_info;         // Offset:    8 Size:     4\n//   uint xe_resolve_dest_coordinate_info;// Offset:   12 Size:     4\n//   uint xe_resolve_dest_base;         // Offset:   16 Size:     4\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_resolve_edram                  texture    byte         r/o      T0             t0      1 \n// xe_resolve_dest                       UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][2], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xy\ndcl_temps 7\ndcl_thread_group 8, 8, 1\nand r0.xyzw, CB0[0][0].zxzz, l(7, 1023, 8, 0x01000000)\nand r1.x, CB0[0][0].w, l(1023)\nushr r2.xyz, CB0[0][0].yywy, l(4, 5, 10, 0)\nushr r3.xyzw, CB0[0][0].wwww, l(24, 20, 24, 24)\nishl r4.y, vThreadID.x, l(2)\nbfi r1.y, l(11), l(3), r2.y, l(0)\nuge r1.y, r4.y, r1.y\nif_nz r1.y\n  ret \nendif \nmov r2.w, CB0[0][0].y\nbfi r1.yz, l(0, 4, 1, 0), l(0, 3, 3, 0), r2.wwxw, l(0, 0, 0, 0)\nbfi r3.xyzw, l(4, 4, 4, 4), l(3, 3, 3, 3), r3.xyzw, l(0, 0, 0, 0)\nubfe r2.xy, l(11, 3, 0, 0), l(13, 28, 0, 0), CB0[0][0].xwxx\nmov r4.xzw, vThreadID.yyyy\niadd r1.yz, r1.yyzy, r4.yywy\nuge r1.w, l(3), r2.y\nif_nz r1.w\n  mov r5.y, r2.y\nelse \n  ieq r1.w, r2.y, l(5)\n  if_nz r1.w\n    mov r5.y, l(2)\n  else \n    mov r5.y, l(0)\n  endif \nendif \nishl r1.yz, r1.yyzy, l(0, 1, 1, 0)\nushr r5.x, r5.y, l(1)\nbfi r1.yz, l(0, 3, 1, 0), l(0, 0, 0, 0), r5.xxyx, r1.yyzy\nudiv r2.yw, null, r1.yyyz, l(0, 40, 0, 16)\nimad r0.y, r2.w, r0.y, r2.y\niadd r0.y, r0.y, r2.x\nimad r1.yz, -r2.yywy, l(0, 40, 16, 0), r1.yyzy\nimad r1.y, r1.z, l(40), r1.y\nishl r1.y, r1.y, l(1)\nimad r0.y, r0.y, l(1280), r1.y\nudiv null, r0.y, r0.y, l(0x00280000)\nishl r0.y, r0.y, l(2)\nld_raw r5.xy, r0.y, T0[0].xyxx\niadd r1.yzw, r0.yyyy, l(0, 16, 32, 48)\nld_raw r5.zw, r1.y, T0[0].xxxy\nld_raw r6.xy, r1.z, T0[0].xyxx\nld_raw r6.zw, r1.w, T0[0].xxxy\nif_nz r0.w\n  ubfe r0.y, l(4), l(24), CB0[0][0].x\n  ieq r0.yw, r0.yyyy, l(0, 5, 0, 7)\n  or r0.y, r0.w, r0.y\n  if_nz r0.y\n    bfi r5.xyzw, l(16, 16, 16, 16), l(0, 0, 0, 0), r5.yxwz, r5.xyzw\n    bfi r6.xyzw, l(16, 16, 16, 16), l(0, 0, 0, 0), r6.yxwz, r6.xyzw\n  endif \nendif \niadd r3.xyzw, r3.xyzw, r4.xyzw\nif_nz r0.z\n  ubfe r0.y, l(3), l(4), CB0[0][0].z\n  bfi r0.z, l(10), l(1), r2.z, l(0)\n  ishr r0.w, r0.y, l(2)\n  ishr r2.xyzw, r3.wyww, l(4, 5, 1, 3)\n  imad r0.z, r0.w, r0.z, r2.x\n  imad r0.z, r0.z, r1.x, r2.y\n  bfi r0.y, l(2), l(5), r0.y, l(0)\n  bfi r1.y, l(2), l(3), r2.z, l(0)\n  iadd r0.y, r0.y, r1.y\n  bfi r0.y, l(3), l(0), r3.y, r0.y\n  bfi r0.y, l(25), l(7), r0.z, r0.y\n  xor r0.z, r0.w, r2.w\n  ubfe r0.w, l(2), l(3), r3.y\n  bfi r1.yz, l(0, 1, 1, 0), l(0, 1, 11, 0), r0.zzzz, l(0, 0, 0, 0)\n  xor r0.z, r0.w, r1.y\n  bfi r0.w, l(1), l(4), r3.w, l(0)\n  imad r0.z, r0.z, l(64), r0.w\n  iadd r0.z, r1.z, r0.z\n  ibfe r0.yw, l(0, 27, 0, 24), l(0, 2, 0, 5), r0.yyyy\n  bfi r0.y, l(3), l(8), r0.y, r0.z\n  bfi r0.y, l(20), l(12), r0.w, r0.y\nelse \n  ishr r2.xyzw, r3.xyzw, l(5, 5, 1, 4)\n  imad r0.z, r2.x, r1.x, r2.y\n  bfi r1.xy, l(3, 1, 0, 0), l(3, 11, 0, 0), r2.zwzz, l(0, 0, 0, 0)\n  bfi r0.w, l(3), l(0), r3.y, r1.x\n  imad r0.z, r0.z, l(64), r0.w\n  ubfe r0.w, l(2), l(3), r3.y\n  ishr r1.x, r3.w, l(3)\n  bfi r1.x, l(1), l(1), r1.x, l(0)\n  xor r0.w, r0.w, r1.x\n  bfi r1.x, l(1), l(4), r3.w, l(0)\n  imad r0.w, r0.w, l(64), r1.x\n  iadd r0.w, r1.y, r0.w\n  ibfe r1.xy, l(27, 24, 0, 0), l(2, 5, 0, 0), r0.zzzz\n  bfi r0.z, l(3), l(8), r1.x, r0.w\n  bfi r0.y, l(20), l(12), r1.y, r0.z\nendif \niadd r0.y, r0.y, CB0[0][1].x\nieq r0.z, r0.x, l(4)\nif_nz r0.z\n  mov r5.xyzw, r5.yxwz\n  mov r0.w, l(2)\nelse \n  mov r0.w, r0.x\nendif \nieq r1.xyz, r0.wwww, l(1, 2, 3, 0)\nor r1.xy, r1.yzyy, r1.xyxx\nif_nz r1.x\n  ishl r2.xyzw, r5.xyzw, l(8, 8, 8, 8)\n  and r2.xyzw, r2.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r3.xyzw, r5.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r5.xyzw, r2.xyzw, r3.xyzw\nendif \nif_nz r1.y\n  ushr r1.xyzw, r5.xyzw, l(16, 16, 16, 16)\n  bfi r5.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r5.xyzw, r1.xyzw\nendif \nstore_raw U0[0].xyzw, r0.y, r5.xyzw\niadd r0.y, r0.y, l(32)\nif_nz r0.z\n  mov r6.xyzw, r6.yxwz\n  mov r0.x, l(2)\nendif \nieq r0.xzw, r0.xxxx, l(1, 0, 2, 3)\nor r0.xz, r0.zzwz, r0.xxzx\nif_nz r0.x\n  ishl r1.xyzw, r6.xyzw, l(8, 8, 8, 8)\n  and r1.xyzw, r1.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r2.xyzw, r6.xyzw, l(8, 8, 8, 8)\n  and r2.xyzw, r2.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r6.xyzw, r1.xyzw, r2.xyzw\nendif \nif_nz r0.z\n  ushr r1.xyzw, r6.xyzw, l(16, 16, 16, 16)\n  bfi r6.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r6.xyzw, r1.xyzw\nendif \nstore_raw U0[0].xyzw, r0.y, r6.xyzw\nret \n// Approximately 135 instruction slots used\n#endif\n\nconst BYTE resolve_fast_64bpp_4xmsaa_cs[] =\n{\n     68,  88,  66,  67, 240,  97, \n    101, 150, 223, 192, 214,   8, \n     10,  93, 208,  93, 198, 163, \n     77,  47,   1,   0,   0,   0, \n    196,  20,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n    208,   2,   0,   0, 224,   2, \n      0,   0, 240,   2,   0,   0, \n     40,  20,   0,   0,  82,  68, \n     69,  70, 148,   2,   0,   0, \n      1,   0,   0,   0, 228,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    105,   2,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 197,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 213,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 114, 101, 115, \n    111, 108, 118, 101,  95, 101, \n    100, 114,  97, 109,   0, 120, \n    101,  95, 114, 101, 115, 111, \n    108, 118, 101,  95, 100, 101, \n    115, 116,   0, 112, 117, 115, \n    104,  95,  99, 111, 110, 115, \n    116, 115,  95, 120, 101,   0, \n    213,   0,   0,   0,   5,   0, \n      0,   0, 252,   0,   0,   0, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    196,   1,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 224,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,   4,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 224,   1,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  31,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    224,   1,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     52,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 224,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  84,   2, \n      0,   0,  16,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 224,   1,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 114, \n    101, 115, 111, 108, 118, 101, \n     95, 101, 100, 114,  97, 109, \n     95, 105, 110, 102, 111,   0, \n    100, 119, 111, 114, 100,   0, \n      0,   0,  19,   0,   1,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 218,   1,   0,   0, \n    120, 101,  95, 114, 101, 115, \n    111, 108, 118, 101,  95,  99, \n    111, 111, 114, 100, 105, 110, \n     97, 116, 101,  95, 105, 110, \n    102, 111,   0, 120, 101,  95, \n    114, 101, 115, 111, 108, 118, \n    101,  95, 100, 101, 115, 116, \n     95, 105, 110, 102, 111,   0, \n    120, 101,  95, 114, 101, 115, \n    111, 108, 118, 101,  95, 100, \n    101, 115, 116,  95,  99, 111, \n    111, 114, 100, 105, 110,  97, \n    116, 101,  95, 105, 110, 102, \n    111,   0, 120, 101,  95, 114, \n    101, 115, 111, 108, 118, 101, \n     95, 100, 101, 115, 116,  95, \n     98,  97, 115, 101,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n     48,  17,   0,   0,  81,   0, \n      5,   0,  76,   4,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n     50,   0,   2,   0, 104,   0, \n      0,   2,   7,   0,   0,   0, \n    155,   0,   0,   4,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  12, 242,   0,  16,   0, \n      0,   0,   0,   0,  38, 138, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0, 255,   3, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   1,   1,   0, \n      0,   9,  18,   0,  16,   0, \n      1,   0,   0,   0,  58, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n    255,   3,   0,   0,  85,   0, \n      0,  12, 114,   0,  16,   0, \n      2,   0,   0,   0,  86, 135, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,   5,   0, \n      0,   0,  10,   0,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  12, 242,   0,  16,   0, \n      3,   0,   0,   0, 246, 143, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n     24,   0,   0,   0,  20,   0, \n      0,   0,  24,   0,   0,   0, \n     24,   0,   0,   0,  41,   0, \n      0,   6,  34,   0,  16,   0, \n      4,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  11,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     80,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      1,   0,   0,   0,  62,   0, \n      0,   1,  21,   0,   0,   1, \n     54,   0,   0,   7, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  20,  98,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 246,  12,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  20, 242,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   4,   0, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  17, \n     50,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     11,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,  13,   0,   0,   0, \n     28,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    198, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   4, 210,   0,  16,   0, \n      4,   0,   0,   0,  86,   5, \n      2,   0,  30,   0,   0,   7, \n     98,   0,  16,   0,   1,   0, \n      0,   0,  86,   6,  16,   0, \n      1,   0,   0,   0,  86,   7, \n     16,   0,   4,   0,   0,   0, \n     80,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  31,   0, \n      4,   3,  58,   0,  16,   0, \n      1,   0,   0,   0,  54,   0, \n      0,   5,  34,   0,  16,   0, \n      5,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     18,   0,   0,   1,  32,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  31,   0,   4,   3, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  54,   0,   0,   5, \n     34,   0,  16,   0,   5,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  18,   0, \n      0,   1,  54,   0,   0,   5, \n     34,   0,  16,   0,   5,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  21,   0,   0,   1, \n     41,   0,   0,  10,  98,   0, \n     16,   0,   1,   0,   0,   0, \n     86,   6,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,   7,  18,   0,  16,   0, \n      5,   0,   0,   0,  26,   0, \n     16,   0,   5,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0, 140,   0,   0,  17, \n     98,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      6,   1,  16,   0,   5,   0, \n      0,   0,  86,   6,  16,   0, \n      1,   0,   0,   0,  78,   0, \n      0,  11, 162,   0,  16,   0, \n      2,   0,   0,   0,   0, 208, \n      0,   0,  86,   9,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     40,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     30,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  35,   0, \n      0,  13,  98,   0,  16,   0, \n      1,   0,   0,   0,  86,   7, \n     16, 128,  65,   0,   0,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     40,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     86,   6,  16,   0,   1,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  40,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  41,   0,   0,   7, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   5,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     78,   0,   0,   8,   0, 208, \n      0,   0,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n     40,   0,  41,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n    165,   0,   0,   8,  50,   0, \n     16,   0,   5,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  70, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    226,   0,  16,   0,   1,   0, \n      0,   0,  86,   5,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,  32,   0, \n      0,   0,  48,   0,   0,   0, \n    165,   0,   0,   8, 194,   0, \n     16,   0,   5,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,   6, 116,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n     50,   0,  16,   0,   6,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  70, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8, 194,   0,  16,   0, \n      6,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n      6, 116,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  58,   0, \n     16,   0,   0,   0,   0,   0, \n    138,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n     24,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  32,   0,   0,  10, \n    162,   0,  16,   0,   0,   0, \n      0,   0,  86,   5,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   7,   0,   0,   0, \n     60,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  22,  11,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  22,  11, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  21,   0,   0,   1, \n     21,   0,   0,   1,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  31,   0,   4,   3, \n     42,   0,  16,   0,   0,   0, \n      0,   0, 138,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     42, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  66,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  10,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     42,   0,   0,   7, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0, 118,  15, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   4,   0, \n      0,   0,   5,   0,   0,   0, \n      1,   0,   0,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   5,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  25,   0, \n      0,   0,   1,  64,   0,   0, \n      7,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n    138,   0,   0,   9, 130,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n    140,   0,   0,  20,  98,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0, 166,  10, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11, 130,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  64,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n    139,   0,   0,  15, 162,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  27,   0,   0,   0, \n      0,   0,   0,   0,  24,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,  86,   5, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  18,   0, \n      0,   1,  42,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,   1,   0, \n      0,   0,   4,   0,   0,   0, \n     35,   0,   0,   9,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n    140,   0,   0,  20,  50,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,  11,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 230,  10, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n    130,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  64,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0, 138,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,  42,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  87,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  64,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0, 139,   0,   0,  15, \n     50,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     27,   0,   0,   0,  24,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    166,  10,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     66,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  30,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  32,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  31,   0,   4,   3, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  22,  11,  16,   0, \n      5,   0,   0,   0,  54,   0, \n      0,   5, 130,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     18,   0,   0,   1,  54,   0, \n      0,   5, 130,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  32,   0, \n      0,  10, 114,   0,  16,   0, \n      1,   0,   0,   0, 246,  15, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   2,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   1,   0, \n      0,   0, 150,   5,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,  85,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     21,   0,   0,   1, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     30,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     32,   0,   0,   0,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5, 242,   0,  16,   0, \n      6,   0,   0,   0,  22,  11, \n     16,   0,   6,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,  21,   0,   0,   1, \n     32,   0,   0,  10, 210,   0, \n     16,   0,   0,   0,   0,   0, \n      6,   0,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      3,   0,   0,   0,  60,   0, \n      0,   7,  82,   0,  16,   0, \n      0,   0,   0,   0, 166,  11, \n     16,   0,   0,   0,   0,   0, \n      6,   2,  16,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  21,   0,   0,   1, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  62,   0,   0,   1, \n     83,  84,  65,  84, 148,   0, \n      0,   0, 135,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  36,   0, \n      0,   0,  23,   0,   0,   0, \n      6,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     10,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/resolve_fast_64bpp_4xmsaa_scaled_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_resolve_edram_info;        // Offset:    0 Size:     4\n//   uint xe_resolve_coordinate_info;   // Offset:    4 Size:     4\n//   uint xe_resolve_dest_info;         // Offset:    8 Size:     4\n//   uint xe_resolve_dest_coordinate_info;// Offset:   12 Size:     4\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_resolve_edram                  texture    byte         r/o      T0             t0      1 \n// xe_resolve_dest                       UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][1], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xy\ndcl_temps 8\ndcl_thread_group 8, 8, 1\nand r0.xyzw, CB0[0][0].zxxz, l(7, 1023, 0x20000000, 8)\nif_nz r0.z\n  ubfe r1.xy, l(2, 2, 0, 0), l(17, 20, 0, 0), CB0[0][0].yyyy\nelse \n  mov r1.xy, l(0,0,0,0)\nendif \nubfe r2.xyz, l(3, 3, 11, 0), l(16, 19, 5, 0), CB0[0][0].yyyy\nimul null, r0.z, r2.x, r2.z\nand r1.zw, CB0[0][0].zzzw, l(0, 0, 0x01000000, 1023)\nushr r3.xyzw, CB0[0][0].ywww, l(4, 10, 20, 24)\nishl r4.x, vThreadID.x, l(2)\nishl r0.z, r0.z, l(3)\nuge r0.z, r4.x, r0.z\nif_nz r0.z\n  ret \nendif \nmov r5.x, CB0[0][0].y\nmov r5.y, r3.x\nbfi r2.zw, l(0, 0, 4, 1), l(0, 0, 3, 3), r5.xxxy, l(0, 0, 0, 0)\nbfi r3.xz, l(4, 0, 4, 0), l(3, 0, 3, 0), r3.zzwz, l(0, 0, 0, 0)\nubfe r5.xy, l(11, 3, 0, 0), l(13, 28, 0, 0), CB0[0][0].xwxx\numax r4.y, r1.y, vThreadID.y\nimad r2.zw, r2.zzzw, r2.xxxy, r4.xxxy\nuge r0.z, l(3), r5.y\nif_nz r0.z\n  mov r6.y, r5.y\nelse \n  ieq r0.z, r5.y, l(5)\n  if_nz r0.z\n    mov r6.y, l(2)\n  else \n    mov r6.y, l(0)\n  endif \nendif \nishl r2.zw, r2.zzzw, l(0, 0, 1, 1)\nushr r6.x, r6.y, l(1)\nbfi r2.zw, l(0, 0, 3, 1), l(0, 0, 0, 0), r6.xxxy, r2.zzzw\nimul null, r6.yz, r2.xxyx, l(0, 80, 16, 0)\nushr r6.x, r6.y, l(1)\nudiv r4.yw, null, r2.zzzw, r6.xxxz\nimad r0.y, r4.w, r0.y, r4.y\niadd r0.y, r0.y, r5.x\nimad r2.zw, -r4.yyyw, r6.xxxz, r2.zzzw\nimul null, r0.z, r6.z, r6.y\nimad r1.y, r2.w, r6.x, r2.z\nishl r1.y, r1.y, l(1)\nimad r0.y, r0.y, r0.z, r1.y\nishl r0.z, r0.z, l(11)\nudiv null, r0.y, r0.y, r0.z\nishl r0.y, r0.y, l(2)\nld_raw r5.zw, r0.y, T0[0].xxxy\niadd r6.xyz, r0.yyyy, l(16, 32, 48, 0)\nld_raw r5.xy, r6.x, T0[0].xyxx\nld_raw r7.xy, r6.y, T0[0].xyxx\nld_raw r7.zw, r6.z, T0[0].xxxy\nieq r0.y, r4.x, l(0)\nine r0.z, r1.x, l(0)\nand r0.y, r0.z, r0.y\nif_nz r0.y\n  uge r0.y, r1.x, l(2)\n  if_nz r0.y\n    uge r0.y, r1.x, l(3)\n    if_nz r0.y\n      mov r7.xy, r7.zwzz\n    endif \n    mov r5.xy, r7.xyxx\n  endif \n  mov r5.xyzw, r5.xyxy\nendif \nif_nz r1.z\n  ubfe r0.y, l(4), l(24), CB0[0][0].x\n  ieq r0.yz, r0.yyyy, l(0, 5, 7, 0)\n  or r0.y, r0.z, r0.y\n  if_nz r0.y\n    bfi r5.xyzw, l(16, 16, 16, 16), l(0, 0, 0, 0), r5.yxwz, r5.xyzw\n    bfi r7.xyzw, l(16, 16, 16, 16), l(0, 0, 0, 0), r7.yxwz, r7.xyzw\n  endif \nendif \nmov r4.z, vThreadID.y\nimad r0.yz, r3.xxzx, r2.xxyx, r4.xxzx\nushr r1.xy, r0.yzyy, l(2, 1, 0, 0)\nudiv r2.zw, null, r1.xxxy, r2.xxxy\nimad r1.xy, -r2.xyxx, r2.zwzz, r1.xyxx\nishl r0.y, r2.z, l(2)\nimad r1.x, r1.x, r2.y, r1.y\nbfi r0.z, l(1), l(5), r0.z, l(0)\nbfi r0.z, l(26), l(6), r1.x, r0.z\nif_nz r0.w\n  ubfe r0.w, l(3), l(4), CB0[0][0].z\n  bfi r1.x, l(10), l(1), r3.y, l(0)\n  ishr r1.y, r0.w, l(2)\n  ibfe r3.xyzw, l(28, 27, 31, 29), l(3, 3, 0, 2), r2.wzww\n  imad r1.x, r1.y, r1.x, r3.x\n  imad r1.x, r1.x, r1.w, r3.y\n  bfi r0.w, l(2), l(5), r0.w, l(0)\n  bfi r1.z, l(2), l(3), r3.z, l(0)\n  iadd r0.w, r0.w, r1.z\n  bfi r0.w, l(3), l(0), r0.y, r0.w\n  bfi r0.w, l(25), l(7), r1.x, r0.w\n  xor r1.x, r1.y, r3.w\n  ibfe r1.y, l(29), l(1), r2.z\n  and r1.y, r1.y, l(3)\n  bfi r1.xz, l(1, 0, 1, 0), l(1, 0, 11, 0), r1.xxxx, l(0, 0, 0, 0)\n  xor r1.x, r1.x, r1.y\n  ishl r1.x, r1.x, l(6)\n  iadd r1.x, r1.z, r1.x\n  ibfe r1.yz, l(0, 27, 24, 0), l(0, 2, 5, 0), r0.wwww\n  bfi r0.w, l(3), l(8), r1.y, r1.x\n  bfi r0.w, l(20), l(12), r1.z, r0.w\nelse \n  ibfe r3.xyzw, l(27, 27, 31, 28), l(4, 3, 0, 3), r2.wzww\n  imad r1.x, r3.x, r1.w, r3.y\n  bfi r1.yz, l(0, 3, 1, 0), l(0, 3, 11, 0), r3.zzwz, l(0, 0, 0, 0)\n  bfi r0.y, l(3), l(0), r0.y, r1.y\n  bfi r0.y, l(26), l(6), r1.x, r0.y\n  ibfe r1.xy, l(29, 29, 0, 0), l(1, 2, 0, 0), r2.zwzz\n  and r1.x, r1.x, l(3)\n  bfi r1.y, l(1), l(1), r1.y, l(0)\n  xor r1.x, r1.y, r1.x\n  ishl r1.x, r1.x, l(6)\n  iadd r1.x, r1.z, r1.x\n  ibfe r1.yz, l(0, 27, 24, 0), l(0, 2, 5, 0), r0.yyyy\n  bfi r0.y, l(3), l(8), r1.y, r1.x\n  bfi r0.w, l(20), l(12), r1.z, r0.y\nendif \nimul null, r0.y, r2.y, r2.x\nimad r0.y, r0.w, r0.y, r0.z\nieq r0.z, r0.x, l(4)\nif_nz r0.z\n  mov r5.xyzw, r5.yxwz\n  mov r0.w, l(2)\nelse \n  mov r0.w, r0.x\nendif \nieq r1.xyz, r0.wwww, l(1, 2, 3, 0)\nor r1.xy, r1.yzyy, r1.xyxx\nif_nz r1.x\n  ishl r2.xyzw, r5.zwxy, l(8, 8, 8, 8)\n  and r2.xyzw, r2.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r3.xyzw, r5.zwxy, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r5.xyzw, r2.zwxy, r3.zwxy\nendif \nif_nz r1.y\n  ushr r1.xyzw, r5.zwxy, l(16, 16, 16, 16)\n  bfi r5.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r5.xyzw, r1.zwxy\nendif \nstore_raw U0[0].xyzw, r0.y, r5.zwxy\niadd r0.w, r0.y, l(16)\nif_nz r0.z\n  mov r7.xyzw, r7.yxwz\n  mov r0.x, l(2)\nendif \nieq r1.xyz, r0.xxxx, l(1, 2, 3, 0)\nor r0.xz, r1.yyzy, r1.xxyx\nif_nz r0.x\n  ishl r1.xyzw, r7.xyzw, l(8, 8, 8, 8)\n  and r1.xyzw, r1.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r2.xyzw, r7.xyzw, l(8, 8, 8, 8)\n  and r2.xyzw, r2.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r7.xyzw, r1.xyzw, r2.xyzw\nendif \nif_nz r0.z\n  ushr r1.xyzw, r7.xyzw, l(16, 16, 16, 16)\n  bfi r7.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r7.xyzw, r1.xyzw\nendif \nstore_raw U0[0].xyzw, r0.w, r7.xyzw\nret \n// Approximately 168 instruction slots used\n#endif\n\nconst BYTE resolve_fast_64bpp_4xmsaa_scaled_cs[] =\n{\n     68,  88,  66,  67,   2, 160, \n    111,  88, 221, 222,  25,  62, \n     24, 209, 207, 103,  10,  26, \n    193, 117,   1,   0,   0,   0, \n    240,  23,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n    144,   2,   0,   0, 160,   2, \n      0,   0, 176,   2,   0,   0, \n     84,  23,   0,   0,  82,  68, \n     69,  70,  84,   2,   0,   0, \n      1,   0,   0,   0, 228,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n     44,   2,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 197,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 213,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 114, 101, 115, \n    111, 108, 118, 101,  95, 101, \n    100, 114,  97, 109,   0, 120, \n    101,  95, 114, 101, 115, 111, \n    108, 118, 101,  95, 100, 101, \n    115, 116,   0, 112, 117, 115, \n    104,  95,  99, 111, 110, 115, \n    116, 115,  95, 120, 101,   0, \n    213,   0,   0,   0,   4,   0, \n      0,   0, 252,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    156,   1,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 184,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 220,   1, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 184,   1,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 247,   1,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    184,   1,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     12,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 184,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 120, 101, \n     95, 114, 101, 115, 111, 108, \n    118, 101,  95, 101, 100, 114, \n     97, 109,  95, 105, 110, 102, \n    111,   0, 100, 119, 111, 114, \n    100,   0,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 178,   1, \n      0,   0, 120, 101,  95, 114, \n    101, 115, 111, 108, 118, 101, \n     95,  99, 111, 111, 114, 100, \n    105, 110,  97, 116, 101,  95, \n    105, 110, 102, 111,   0, 120, \n    101,  95, 114, 101, 115, 111, \n    108, 118, 101,  95, 100, 101, \n    115, 116,  95, 105, 110, 102, \n    111,   0, 120, 101,  95, 114, \n    101, 115, 111, 108, 118, 101, \n     95, 100, 101, 115, 116,  95, \n     99, 111, 111, 114, 100, 105, \n    110,  97, 116, 101,  95, 105, \n    110, 102, 111,   0,  77, 105, \n     99, 114, 111, 115, 111, 102, \n    116,  32,  40,  82,  41,  32, \n     72,  76,  83,  76,  32,  83, \n    104,  97, 100, 101, 114,  32, \n     67, 111, 109, 112, 105, 108, \n    101, 114,  32,  49,  48,  46, \n     49,   0,  73,  83,  71,  78, \n      8,   0,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     79,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  83,  72, \n     69,  88, 156,  20,   0,   0, \n     81,   0,   5,   0,  39,   5, \n      0,   0, 106,   8,   0,   1, \n     89,   0,   0,   7,  70, 142, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0, 161,   0, \n      0,   6,  70, 126,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 157,   0, \n      0,   6,  70, 238,  49,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  95,   0, \n      0,   2,  50,   0,   2,   0, \n    104,   0,   0,   2,   8,   0, \n      0,   0, 155,   0,   0,   4, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,  12, 242,   0, \n     16,   0,   0,   0,   0,   0, \n     38, 136,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n    255,   3,   0,   0,   0,   0, \n      0,  32,   8,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n    138,   0,   0,  17,  50,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n     17,   0,   0,   0,  20,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86, 133, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  18,   0,   0,   1, \n     54,   0,   0,   8,  50,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n    138,   0,   0,  17, 114,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  19,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,  86, 133, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,   1,   0, \n      0,  12, 194,   0,  16,   0, \n      1,   0,   0,   0, 166, 142, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   1, \n    255,   3,   0,   0,  85,   0, \n      0,  12, 242,   0,  16,   0, \n      3,   0,   0,   0, 214, 143, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     24,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      4,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  80,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      4,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1,  54,   0,   0,   7, \n     18,   0,  16,   0,   5,   0, \n      0,   0,  26, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  34,   0, \n     16,   0,   5,   0,   0,   0, \n     10,   0,  16,   0,   3,   0, \n      0,   0, 140,   0,   0,  20, \n    194,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      6,   4,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  20,  82,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 166,  11,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    138,   0,   0,  17,  50,   0, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,  11,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n     13,   0,   0,   0,  28,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 198, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  83,   0,   0,   6, \n     34,   0,  16,   0,   4,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,   9, \n    194,   0,  16,   0,   2,   0, \n      0,   0, 166,  14,  16,   0, \n      2,   0,   0,   0,   6,   4, \n     16,   0,   2,   0,   0,   0, \n      6,   4,  16,   0,   4,   0, \n      0,   0,  80,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   5,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  34,   0, \n     16,   0,   6,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0,  18,   0,   0,   1, \n     32,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  34,   0,  16,   0, \n      6,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     18,   0,   0,   1,  54,   0, \n      0,   5,  34,   0,  16,   0, \n      6,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  21,   0, \n      0,   1,  41,   0,   0,  10, \n    194,   0,  16,   0,   2,   0, \n      0,   0, 166,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n     85,   0,   0,   7,  18,   0, \n     16,   0,   6,   0,   0,   0, \n     26,   0,  16,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  17, 194,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   6,   4,  16,   0, \n      6,   0,   0,   0, 166,  14, \n     16,   0,   2,   0,   0,   0, \n     38,   0,   0,  11,   0, 208, \n      0,   0,  98,   0,  16,   0, \n      6,   0,   0,   0,   6,   1, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  80,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,   7, \n     18,   0,  16,   0,   6,   0, \n      0,   0,  26,   0,  16,   0, \n      6,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     78,   0,   0,   8, 162,   0, \n     16,   0,   4,   0,   0,   0, \n      0, 208,   0,   0, 166,  14, \n     16,   0,   2,   0,   0,   0, \n      6,   8,  16,   0,   6,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0,  30,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   5,   0,   0,   0, \n     35,   0,   0,  10, 194,   0, \n     16,   0,   2,   0,   0,   0, \n     86,  13,  16, 128,  65,   0, \n      0,   0,   4,   0,   0,   0, \n      6,   8,  16,   0,   6,   0, \n      0,   0, 166,  14,  16,   0, \n      2,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   6,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      6,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     41,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  41,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  11,   0, \n      0,   0,  78,   0,   0,   8, \n      0, 208,   0,   0,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0, 165,   0,   0,   8, \n    194,   0,  16,   0,   5,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,   6, 116, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n      6,   0,   0,   0,  86,   5, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  32,   0,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n     50,   0,  16,   0,   5,   0, \n      0,   0,  10,   0,  16,   0, \n      6,   0,   0,   0,  70, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8,  50,   0,  16,   0, \n      7,   0,   0,   0,  26,   0, \n     16,   0,   6,   0,   0,   0, \n     70, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    165,   0,   0,   8, 194,   0, \n     16,   0,   7,   0,   0,   0, \n     42,   0,  16,   0,   6,   0, \n      0,   0,   6, 116,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  32,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      4,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     39,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   7,  34,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  80,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     80,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  50,   0,  16,   0, \n      7,   0,   0,   0, 230,  10, \n     16,   0,   7,   0,   0,   0, \n     21,   0,   0,   1,  54,   0, \n      0,   5,  50,   0,  16,   0, \n      5,   0,   0,   0,  70,   0, \n     16,   0,   7,   0,   0,   0, \n     21,   0,   0,   1,  54,   0, \n      0,   5, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,   4, \n     16,   0,   5,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      1,   0,   0,   0, 138,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n      1,  64,   0,   0,  24,   0, \n      0,   0,  10, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     32,   0,   0,  10,  98,   0, \n     16,   0,   0,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   5,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  60,   0, \n      0,   7,  34,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     22,  11,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  22,  11,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n     21,   0,   0,   1,  21,   0, \n      0,   1,  54,   0,   0,   4, \n     66,   0,  16,   0,   4,   0, \n      0,   0,  26,   0,   2,   0, \n     35,   0,   0,   9,  98,   0, \n     16,   0,   0,   0,   0,   0, \n      6,   2,  16,   0,   3,   0, \n      0,   0,   6,   1,  16,   0, \n      2,   0,   0,   0,   6,   2, \n     16,   0,   4,   0,   0,   0, \n     85,   0,   0,  10,  50,   0, \n     16,   0,   1,   0,   0,   0, \n    150,   5,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  78,   0, \n      0,   8, 194,   0,  16,   0, \n      2,   0,   0,   0,   0, 208, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0,   6,   4, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,  10,  50,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16, 128,  65,   0, \n      0,   0,   2,   0,   0,   0, \n    230,  10,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,  41,   0, \n      0,   7,  34,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     66,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   5,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  66,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  26,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  58,   0, \n     16,   0,   0,   0,   0,   0, \n    138,   0,   0,  11, 130,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     10,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  42,   0, \n      0,   7,  34,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0, 139,   0,   0,  15, \n    242,   0,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n     28,   0,   0,   0,  27,   0, \n      0,   0,  31,   0,   0,   0, \n     29,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n    182,  15,  16,   0,   2,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0, 140,   0,   0,  11, \n    130,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   5,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  66,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11, 130,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11, 130,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  25,   0, \n      0,   0,   1,  64,   0,   0, \n      7,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n    139,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  29,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n      1,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0, 140,   0, \n      0,  20,  82,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0,   6,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  41,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    139,   0,   0,  15,  98,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  27,   0,   0,   0, \n     24,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0, 246,  15, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11, 130,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n    130,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  18,   0, \n      0,   1, 139,   0,   0,  15, \n    242,   0,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n     27,   0,   0,   0,  27,   0, \n      0,   0,  31,   0,   0,   0, \n     28,   0,   0,   0,   2,  64, \n      0,   0,   4,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n    182,  15,  16,   0,   2,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      3,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0, 140,   0,   0,  20, \n     98,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,  11,   0, \n      0,   0,   0,   0,   0,   0, \n    166,  11,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  26,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0, 139,   0,   0,  15, \n     50,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     29,   0,   0,   0,  29,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    230,  10,  16,   0,   2,   0, \n      0,   0,   1,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     41,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 139,   0,   0,  15, \n     98,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  27,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   5,   0, \n      0,   0,   0,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11, 130,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  38,   0, \n      0,   8,   0, 208,   0,   0, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     32,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5, 242,   0,  16,   0, \n      5,   0,   0,   0,  22,  11, \n     16,   0,   5,   0,   0,   0, \n     54,   0,   0,   5, 130,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,  18,   0,   0,   1, \n     54,   0,   0,   5, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     32,   0,   0,  10, 114,   0, \n     16,   0,   1,   0,   0,   0, \n    246,  15,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,  60,   0, \n      0,   7,  50,   0,  16,   0, \n      1,   0,   0,   0, 150,   5, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0, 230,   4,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0, 230,   4, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   5,   0,   0,   0, \n    230,   4,  16,   0,   2,   0, \n      0,   0, 230,   4,  16,   0, \n      3,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   1,   0, \n      0,   0, 230,   4,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n    230,   4,  16,   0,   1,   0, \n      0,   0,  21,   0,   0,   1, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n    230,   4,  16,   0,   5,   0, \n      0,   0,  30,   0,   0,   7, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     54,   0,   0,   5, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     22,  11,  16,   0,   7,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  21,   0, \n      0,   1,  32,   0,   0,  10, \n    114,   0,  16,   0,   1,   0, \n      0,   0,   6,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      2,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  82,   0, \n     16,   0,   0,   0,   0,   0, \n     86,   6,  16,   0,   1,   0, \n      0,   0,   6,   1,  16,   0, \n      1,   0,   0,   0,  31,   0, \n      4,   3,  10,   0,  16,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  21,   0, \n      0,   1, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,  62,   0, \n      0,   1,  83,  84,  65,  84, \n    148,   0,   0,   0, 168,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   0,   0,   0,  31,   0, \n      0,   0,   7,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  15,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/resolve_full_128bpp_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_resolve_edram_info;        // Offset:    0 Size:     4\n//   uint xe_resolve_coordinate_info;   // Offset:    4 Size:     4\n//   uint xe_resolve_dest_info;         // Offset:    8 Size:     4\n//   uint xe_resolve_dest_coordinate_info;// Offset:   12 Size:     4\n//   uint xe_resolve_dest_base;         // Offset:   16 Size:     4\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_resolve_edram                  texture    byte         r/o      T0             t0      1 \n// xe_resolve_dest                       UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][2], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xy\ndcl_temps 15\ndcl_thread_group 8, 8, 1\nand r0.xyzw, CB0[0][0].zxzz, l(7, 1023, 8, 0x01000000)\nand r1.x, CB0[0][0].w, l(1023)\nushr r2.xyz, CB0[0][0].yywy, l(4, 5, 10, 0)\nushr r3.xyzw, CB0[0][0].wwww, l(24, 20, 24, 24)\nishl r4.y, vThreadID.x, l(1)\nbfi r1.y, l(11), l(3), r2.y, l(0)\nuge r1.y, r4.y, r1.y\nif_nz r1.y\n  ret \nendif \nubfe r5.xyzw, l(2, 11, 4, 1), l(10, 13, 24, 28), CB0[0][0].xxxx\nmov r2.w, CB0[0][0].y\nbfi r1.yz, l(0, 4, 1, 0), l(0, 3, 3, 0), r2.wwxw, l(0, 0, 0, 0)\nibfe r1.w, l(6), l(16), CB0[0][0].z\nishl r1.w, r1.w, l(23)\niadd r1.w, r1.w, l(0x3f800000)\nbfi r3.xyzw, l(4, 4, 4, 4), l(3, 3, 3, 3), r3.xyzw, l(0, 0, 0, 0)\nubfe r2.x, l(3), l(28), CB0[0][0].w\nmov r4.xzw, vThreadID.yyyy\niadd r1.yz, r1.yyzy, r4.yywy\nuge r2.y, l(3), r2.x\nif_nz r2.y\n  mov r6.y, r2.x\nelse \n  ieq r2.y, r2.x, l(5)\n  if_nz r2.y\n    mov r6.y, l(2)\n  else \n    mov r6.y, l(0)\n  endif \nendif \nuge r2.yw, r5.xxxx, l(0, 2, 0, 1)\nand r2.yw, r2.yyyw, l(0, 1, 0, 1)\nishl r1.yz, r1.yyzy, r2.yywy\nushr r6.x, r6.y, l(1)\nand r6.xy, r6.xyxx, l(1, 1, 0, 0)\niadd r1.yz, r1.yyzy, r6.xxyx\nushr r6.x, l(80), r5.w\nmov r6.y, l(16)\nudiv r6.zw, null, r1.yyyz, r6.xxxy\nimad r0.y, r6.w, r0.y, r6.z\niadd r0.y, r0.y, r5.y\nimad r1.yz, -r6.zzwz, r6.xxyx, r1.yyzy\nimad r1.y, r1.z, r6.x, r1.y\nishl r1.y, r1.y, r5.w\nimad r0.y, r0.y, l(1280), r1.y\nudiv null, r0.y, r0.y, l(0x00280000)\nishl r0.y, r0.y, l(2)\niadd r1.y, r2.y, r5.w\nishl r1.y, l(4), r1.y\nif_nz r5.w\n  ieq r1.z, r1.y, l(8)\n  if_nz r1.z\n    ld_raw r6.xyzw, r0.y, T0[0].zwxy\n    mov r7.xy, r6.zwzz\n  else \n    ld_raw r7.xy, r0.y, T0[0].xyxx\n    iadd r1.z, r0.y, r1.y\n    ld_raw r6.xy, r1.z, T0[0].xyxx\n  endif \n  switch r5.z\n    case l(5)\n    ishl r7.zw, r7.xxxy, l(0, 0, 16, 16)\n    ishr r8.xyzw, r7.zxwy, l(16, 16, 16, 16)\n    itof r8.xyzw, r8.xyzw\n    mul r8.xyzw, r8.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n    max r7.xyzw, r8.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n    ishl r6.zw, r6.xxxy, l(0, 0, 16, 16)\n    ishr r8.xyzw, r6.zxwy, l(16, 16, 16, 16)\n    itof r8.xyzw, r8.xyzw\n    mul r8.xyzw, r8.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n    max r6.xyzw, r8.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n    break \n    case l(7)\n    ushr r2.yw, r7.xxxy, l(0, 16, 0, 16)\n    f16tof32 r7.xz, r7.xxyx\n    f16tof32 r7.yw, r2.yyyw\n    ushr r2.yw, r6.xxxy, l(0, 16, 0, 16)\n    f16tof32 r6.xz, r6.xxyx\n    f16tof32 r6.yw, r2.yyyw\n    break \n    default \n    mov r7.zw, l(0,0,0,0)\n    mov r6.zw, l(0,0,0,0)\n    break \n  endswitch \nelse \n  ieq r1.z, r1.y, l(4)\n  if_nz r1.z\n    ld_raw r6.xy, r0.y, T0[0].yxxx\n    mov r7.x, r6.y\n  else \n    ld_raw r7.x, r0.y, T0[0].xxxx\n    iadd r1.z, r0.y, r1.y\n    ld_raw r6.x, r1.z, T0[0].xxxx\n  endif \n  switch r5.z\n    case l(0)\n    case l(1)\n    ushr r7.yzw, r7.xxxx, l(0, 8, 16, 24)\n    and r8.xyzw, r7.xyzw, l(255, 255, 255, 255)\n    utof r8.xyzw, r8.xyzw\n    mul r7.xyzw, r8.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n    ushr r6.yzw, r6.xxxx, l(0, 8, 16, 24)\n    and r8.xyzw, r6.xyzw, l(255, 255, 255, 255)\n    utof r8.xyzw, r8.xyzw\n    mul r6.xyzw, r8.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n    break \n    case l(2)\n    case l(10)\n    ushr r7.yzw, r7.xxxx, l(0, 10, 20, 30)\n    and r8.xyzw, r7.xyzw, l(1023, 1023, 1023, 3)\n    utof r8.xyzw, r8.xyzw\n    mul r7.xyzw, r8.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n    ushr r6.yzw, r6.xxxx, l(0, 10, 20, 30)\n    and r8.xyzw, r6.xyzw, l(1023, 1023, 1023, 3)\n    utof r8.xyzw, r8.xyzw\n    mul r6.xyzw, r8.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n    break \n    case l(3)\n    case l(12)\n    ushr r7.yzw, r7.xxxx, l(0, 10, 20, 30)\n    and r8.xyz, r7.xyzx, l(1023, 1023, 1023, 0)\n    and r9.xyz, r7.xyzx, l(127, 127, 127, 0)\n    ubfe r10.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r7.xyzx\n    firstbit_hi r11.xyz, r9.xyzx\n    iadd r11.xyz, r11.xyzx, l(-24, -24, -24, 0)\n    movc r11.xyz, r9.xyzx, r11.xyzx, l(8,8,8,0)\n    iadd r12.xyz, -r11.xyzx, l(1, 1, 1, 0)\n    movc r12.xyz, r10.xyzx, r10.xyzx, r12.xyzx\n    bfi r11.xyz, l(7, 7, 7, 0), r11.xyzx, r7.xyzx, l(0, 0, 0, 0)\n    and r11.xyz, r11.xyzx, l(127, 127, 127, 0)\n    movc r9.xyz, r10.xyzx, r9.xyzx, r11.xyzx\n    ishl r10.xyz, r12.xyzx, l(23, 23, 23, 0)\n    iadd r10.xyz, r10.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n    ishl r9.xyz, r9.xyzx, l(16, 16, 16, 0)\n    iadd r9.xyz, r10.xyzx, r9.xyzx\n    movc r7.xyz, r8.xyzx, r9.xyzx, l(0,0,0,0)\n    utof r1.z, r7.w\n    mul r7.w, r1.z, l(0.333333)\n    ushr r6.yzw, r6.xxxx, l(0, 10, 20, 30)\n    and r8.xyz, r6.xyzx, l(1023, 1023, 1023, 0)\n    and r9.xyz, r6.xyzx, l(127, 127, 127, 0)\n    ubfe r10.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r6.xyzx\n    firstbit_hi r11.xyz, r9.xyzx\n    iadd r11.xyz, r11.xyzx, l(-24, -24, -24, 0)\n    movc r11.xyz, r9.xyzx, r11.xyzx, l(8,8,8,0)\n    iadd r12.xyz, -r11.xyzx, l(1, 1, 1, 0)\n    movc r12.xyz, r10.xyzx, r10.xyzx, r12.xyzx\n    bfi r11.xyz, l(7, 7, 7, 0), r11.xyzx, r6.xyzx, l(0, 0, 0, 0)\n    and r11.xyz, r11.xyzx, l(127, 127, 127, 0)\n    movc r9.xyz, r10.xyzx, r9.xyzx, r11.xyzx\n    ishl r10.xyz, r12.xyzx, l(23, 23, 23, 0)\n    iadd r10.xyz, r10.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n    ishl r9.xyz, r9.xyzx, l(16, 16, 16, 0)\n    iadd r9.xyz, r10.xyzx, r9.xyzx\n    movc r6.xyz, r8.xyzx, r9.xyzx, l(0,0,0,0)\n    utof r1.z, r6.w\n    mul r6.w, r1.z, l(0.333333)\n    break \n    case l(4)\n    ishl r7.y, r7.x, l(16)\n    ishr r2.yw, r7.yyyx, l(0, 16, 0, 16)\n    itof r2.yw, r2.yyyw\n    mul r2.yw, r2.yyyw, l(0.000000, 0.000977, 0.000000, 0.000977)\n    max r7.xy, r2.ywyy, l(-1.000000, -1.000000, 0.000000, 0.000000)\n    ishl r6.y, r6.x, l(16)\n    ishr r2.yw, r6.yyyx, l(0, 16, 0, 16)\n    itof r2.yw, r2.yyyw\n    mul r2.yw, r2.yyyw, l(0.000000, 0.000977, 0.000000, 0.000977)\n    max r6.xy, r2.ywyy, l(-1.000000, -1.000000, 0.000000, 0.000000)\n    mov r7.zw, l(0,0,0,0)\n    mov r6.zw, l(0,0,0,0)\n    break \n    case l(6)\n    ushr r1.z, r7.x, l(16)\n    f16tof32 r7.x, r7.x\n    f16tof32 r7.y, r1.z\n    ushr r1.z, r6.x, l(16)\n    f16tof32 r6.x, r6.x\n    f16tof32 r6.y, r1.z\n    mov r7.zw, l(0,0,0,0)\n    mov r6.zw, l(0,0,0,0)\n    break \n    default \n    mov r7.yzw, l(0,0,0,0)\n    mov r6.yzw, l(0,0,0,0)\n    break \n  endswitch \nendif \nuge r1.z, r2.x, l(4)\nif_nz r1.z\n  mul r1.z, r1.w, l(0.500000)\n  iadd r2.y, r0.y, l(320)\n  if_nz r5.w\n    ieq r2.w, r1.y, l(8)\n    if_nz r2.w\n      ld_raw r8.xyzw, r2.y, T0[0].zwxy\n      mov r9.xy, r8.zwzz\n    else \n      ld_raw r9.xy, r2.y, T0[0].xyxx\n      iadd r2.w, r1.y, r2.y\n      ld_raw r8.xy, r2.w, T0[0].xyxx\n    endif \n    switch r5.z\n      case l(5)\n      ishl r9.zw, r9.xxxy, l(0, 0, 16, 16)\n      ishr r10.xyzw, r9.zxwy, l(16, 16, 16, 16)\n      itof r10.xyzw, r10.xyzw\n      mul r10.xyzw, r10.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n      max r9.xyzw, r10.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n      ishl r8.zw, r8.xxxy, l(0, 0, 16, 16)\n      ishr r10.xyzw, r8.zxwy, l(16, 16, 16, 16)\n      itof r10.xyzw, r10.xyzw\n      mul r10.xyzw, r10.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n      max r8.xyzw, r10.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n      break \n      case l(7)\n      ushr r5.xy, r9.xyxx, l(16, 16, 0, 0)\n      f16tof32 r9.xz, r9.xxyx\n      f16tof32 r9.yw, r5.xxxy\n      ushr r5.xy, r8.xyxx, l(16, 16, 0, 0)\n      f16tof32 r8.xz, r8.xxyx\n      f16tof32 r8.yw, r5.xxxy\n      break \n      default \n      mov r9.zw, l(0,0,0,0)\n      mov r8.zw, l(0,0,0,0)\n      break \n    endswitch \n  else \n    ieq r2.w, r1.y, l(4)\n    if_nz r2.w\n      ld_raw r8.xy, r2.y, T0[0].yxxx\n      mov r9.x, r8.y\n    else \n      ld_raw r9.x, r2.y, T0[0].xxxx\n      iadd r2.w, r1.y, r2.y\n      ld_raw r8.x, r2.w, T0[0].xxxx\n    endif \n    switch r5.z\n      case l(0)\n      case l(1)\n      ushr r9.yzw, r9.xxxx, l(0, 8, 16, 24)\n      and r10.xyzw, r9.xyzw, l(255, 255, 255, 255)\n      utof r10.xyzw, r10.xyzw\n      mul r9.xyzw, r10.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n      ushr r8.yzw, r8.xxxx, l(0, 8, 16, 24)\n      and r10.xyzw, r8.xyzw, l(255, 255, 255, 255)\n      utof r10.xyzw, r10.xyzw\n      mul r8.xyzw, r10.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n      break \n      case l(2)\n      case l(10)\n      ushr r9.yzw, r9.xxxx, l(0, 10, 20, 30)\n      and r10.xyzw, r9.xyzw, l(1023, 1023, 1023, 3)\n      utof r10.xyzw, r10.xyzw\n      mul r9.xyzw, r10.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n      ushr r8.yzw, r8.xxxx, l(0, 10, 20, 30)\n      and r10.xyzw, r8.xyzw, l(1023, 1023, 1023, 3)\n      utof r10.xyzw, r10.xyzw\n      mul r8.xyzw, r10.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n      break \n      case l(3)\n      case l(12)\n      ushr r9.yzw, r9.xxxx, l(0, 10, 20, 30)\n      and r10.xyz, r9.xyzx, l(1023, 1023, 1023, 0)\n      and r11.xyz, r9.xyzx, l(127, 127, 127, 0)\n      ubfe r12.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r9.xyzx\n      firstbit_hi r13.xyz, r11.xyzx\n      iadd r13.xyz, r13.xyzx, l(-24, -24, -24, 0)\n      movc r13.xyz, r11.xyzx, r13.xyzx, l(8,8,8,0)\n      iadd r14.xyz, -r13.xyzx, l(1, 1, 1, 0)\n      movc r14.xyz, r12.xyzx, r12.xyzx, r14.xyzx\n      bfi r13.xyz, l(7, 7, 7, 0), r13.xyzx, r9.xyzx, l(0, 0, 0, 0)\n      and r13.xyz, r13.xyzx, l(127, 127, 127, 0)\n      movc r11.xyz, r12.xyzx, r11.xyzx, r13.xyzx\n      ishl r12.xyz, r14.xyzx, l(23, 23, 23, 0)\n      iadd r12.xyz, r12.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n      ishl r11.xyz, r11.xyzx, l(16, 16, 16, 0)\n      iadd r11.xyz, r12.xyzx, r11.xyzx\n      movc r9.xyz, r10.xyzx, r11.xyzx, l(0,0,0,0)\n      utof r2.w, r9.w\n      mul r9.w, r2.w, l(0.333333)\n      ushr r8.yzw, r8.xxxx, l(0, 10, 20, 30)\n      and r10.xyz, r8.xyzx, l(1023, 1023, 1023, 0)\n      and r11.xyz, r8.xyzx, l(127, 127, 127, 0)\n      ubfe r12.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r8.xyzx\n      firstbit_hi r13.xyz, r11.xyzx\n      iadd r13.xyz, r13.xyzx, l(-24, -24, -24, 0)\n      movc r13.xyz, r11.xyzx, r13.xyzx, l(8,8,8,0)\n      iadd r14.xyz, -r13.xyzx, l(1, 1, 1, 0)\n      movc r14.xyz, r12.xyzx, r12.xyzx, r14.xyzx\n      bfi r13.xyz, l(7, 7, 7, 0), r13.xyzx, r8.xyzx, l(0, 0, 0, 0)\n      and r13.xyz, r13.xyzx, l(127, 127, 127, 0)\n      movc r11.xyz, r12.xyzx, r11.xyzx, r13.xyzx\n      ishl r12.xyz, r14.xyzx, l(23, 23, 23, 0)\n      iadd r12.xyz, r12.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n      ishl r11.xyz, r11.xyzx, l(16, 16, 16, 0)\n      iadd r11.xyz, r12.xyzx, r11.xyzx\n      movc r8.xyz, r10.xyzx, r11.xyzx, l(0,0,0,0)\n      utof r2.w, r8.w\n      mul r8.w, r2.w, l(0.333333)\n      break \n      case l(4)\n      ishl r9.y, r9.x, l(16)\n      ishr r5.xy, r9.yxyy, l(16, 16, 0, 0)\n      itof r5.xy, r5.xyxx\n      mul r5.xy, r5.xyxx, l(0.000977, 0.000977, 0.000000, 0.000000)\n      max r9.xy, r5.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n      ishl r8.y, r8.x, l(16)\n      ishr r5.xy, r8.yxyy, l(16, 16, 0, 0)\n      itof r5.xy, r5.xyxx\n      mul r5.xy, r5.xyxx, l(0.000977, 0.000977, 0.000000, 0.000000)\n      max r8.xy, r5.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n      mov r9.zw, l(0,0,0,0)\n      mov r8.zw, l(0,0,0,0)\n      break \n      case l(6)\n      ushr r2.w, r9.x, l(16)\n      f16tof32 r9.x, r9.x\n      f16tof32 r9.y, r2.w\n      ushr r2.w, r8.x, l(16)\n      f16tof32 r8.x, r8.x\n      f16tof32 r8.y, r2.w\n      mov r9.zw, l(0,0,0,0)\n      mov r8.zw, l(0,0,0,0)\n      break \n      default \n      mov r9.yzw, l(0,0,0,0)\n      mov r8.yzw, l(0,0,0,0)\n      break \n    endswitch \n  endif \n  add r7.xyzw, r7.xyzw, r9.xyzw\n  add r6.xyzw, r6.xyzw, r8.xyzw\n  uge r2.x, r2.x, l(6)\n  if_nz r2.x\n    ishl r2.x, l(4), r5.w\n    mul r1.w, r1.w, l(0.250000)\n    iadd r0.y, r0.y, r2.x\n    if_nz r5.w\n      ieq r2.w, r1.y, l(8)\n      if_nz r2.w\n        ld_raw r8.xyzw, r0.y, T0[0].zwxy\n        mov r9.xy, r8.zwzz\n      else \n        ld_raw r9.xy, r0.y, T0[0].xyxx\n        iadd r2.w, r1.y, r0.y\n        ld_raw r8.xy, r2.w, T0[0].xyxx\n      endif \n      switch r5.z\n        case l(5)\n        ishl r9.zw, r9.xxxy, l(0, 0, 16, 16)\n        ishr r10.xyzw, r9.zxwy, l(16, 16, 16, 16)\n        itof r10.xyzw, r10.xyzw\n        mul r10.xyzw, r10.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r9.xyzw, r10.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        ishl r8.zw, r8.xxxy, l(0, 0, 16, 16)\n        ishr r10.xyzw, r8.zxwy, l(16, 16, 16, 16)\n        itof r10.xyzw, r10.xyzw\n        mul r10.xyzw, r10.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r8.xyzw, r10.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        break \n        case l(7)\n        ushr r5.xy, r9.xyxx, l(16, 16, 0, 0)\n        f16tof32 r9.xz, r9.xxyx\n        f16tof32 r9.yw, r5.xxxy\n        ushr r5.xy, r8.xyxx, l(16, 16, 0, 0)\n        f16tof32 r8.xz, r8.xxyx\n        f16tof32 r8.yw, r5.xxxy\n        break \n        default \n        mov r9.zw, l(0,0,0,0)\n        mov r8.zw, l(0,0,0,0)\n        break \n      endswitch \n    else \n      ieq r2.w, r1.y, l(4)\n      if_nz r2.w\n        ld_raw r8.xy, r0.y, T0[0].yxxx\n        mov r9.x, r8.y\n      else \n        ld_raw r9.x, r0.y, T0[0].xxxx\n        iadd r0.y, r1.y, r0.y\n        ld_raw r8.x, r0.y, T0[0].xxxx\n      endif \n      switch r5.z\n        case l(0)\n        case l(1)\n        ushr r9.yzw, r9.xxxx, l(0, 8, 16, 24)\n        and r10.xyzw, r9.xyzw, l(255, 255, 255, 255)\n        utof r10.xyzw, r10.xyzw\n        mul r9.xyzw, r10.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        ushr r8.yzw, r8.xxxx, l(0, 8, 16, 24)\n        and r10.xyzw, r8.xyzw, l(255, 255, 255, 255)\n        utof r10.xyzw, r10.xyzw\n        mul r8.xyzw, r10.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        break \n        case l(2)\n        case l(10)\n        ushr r9.yzw, r9.xxxx, l(0, 10, 20, 30)\n        and r10.xyzw, r9.xyzw, l(1023, 1023, 1023, 3)\n        utof r10.xyzw, r10.xyzw\n        mul r9.xyzw, r10.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        ushr r8.yzw, r8.xxxx, l(0, 10, 20, 30)\n        and r10.xyzw, r8.xyzw, l(1023, 1023, 1023, 3)\n        utof r10.xyzw, r10.xyzw\n        mul r8.xyzw, r10.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        break \n        case l(3)\n        case l(12)\n        ushr r9.yzw, r9.xxxx, l(0, 10, 20, 30)\n        and r10.xyz, r9.xyzx, l(1023, 1023, 1023, 0)\n        and r11.xyz, r9.xyzx, l(127, 127, 127, 0)\n        ubfe r12.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r9.xyzx\n        firstbit_hi r13.xyz, r11.xyzx\n        iadd r13.xyz, r13.xyzx, l(-24, -24, -24, 0)\n        movc r13.xyz, r11.xyzx, r13.xyzx, l(8,8,8,0)\n        iadd r14.xyz, -r13.xyzx, l(1, 1, 1, 0)\n        movc r14.xyz, r12.xyzx, r12.xyzx, r14.xyzx\n        bfi r13.xyz, l(7, 7, 7, 0), r13.xyzx, r9.xyzx, l(0, 0, 0, 0)\n        and r13.xyz, r13.xyzx, l(127, 127, 127, 0)\n        movc r11.xyz, r12.xyzx, r11.xyzx, r13.xyzx\n        ishl r12.xyz, r14.xyzx, l(23, 23, 23, 0)\n        iadd r12.xyz, r12.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r11.xyz, r11.xyzx, l(16, 16, 16, 0)\n        iadd r11.xyz, r12.xyzx, r11.xyzx\n        movc r9.xyz, r10.xyzx, r11.xyzx, l(0,0,0,0)\n        utof r0.y, r9.w\n        mul r9.w, r0.y, l(0.333333)\n        ushr r8.yzw, r8.xxxx, l(0, 10, 20, 30)\n        and r10.xyz, r8.xyzx, l(1023, 1023, 1023, 0)\n        and r11.xyz, r8.xyzx, l(127, 127, 127, 0)\n        ubfe r12.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r8.xyzx\n        firstbit_hi r13.xyz, r11.xyzx\n        iadd r13.xyz, r13.xyzx, l(-24, -24, -24, 0)\n        movc r13.xyz, r11.xyzx, r13.xyzx, l(8,8,8,0)\n        iadd r14.xyz, -r13.xyzx, l(1, 1, 1, 0)\n        movc r14.xyz, r12.xyzx, r12.xyzx, r14.xyzx\n        bfi r13.xyz, l(7, 7, 7, 0), r13.xyzx, r8.xyzx, l(0, 0, 0, 0)\n        and r13.xyz, r13.xyzx, l(127, 127, 127, 0)\n        movc r11.xyz, r12.xyzx, r11.xyzx, r13.xyzx\n        ishl r12.xyz, r14.xyzx, l(23, 23, 23, 0)\n        iadd r12.xyz, r12.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r11.xyz, r11.xyzx, l(16, 16, 16, 0)\n        iadd r11.xyz, r12.xyzx, r11.xyzx\n        movc r8.xyz, r10.xyzx, r11.xyzx, l(0,0,0,0)\n        utof r0.y, r8.w\n        mul r8.w, r0.y, l(0.333333)\n        break \n        case l(4)\n        ishl r9.y, r9.x, l(16)\n        ishr r5.xy, r9.yxyy, l(16, 16, 0, 0)\n        itof r5.xy, r5.xyxx\n        mul r5.xy, r5.xyxx, l(0.000977, 0.000977, 0.000000, 0.000000)\n        max r9.xy, r5.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        ishl r8.y, r8.x, l(16)\n        ishr r5.xy, r8.yxyy, l(16, 16, 0, 0)\n        itof r5.xy, r5.xyxx\n        mul r5.xy, r5.xyxx, l(0.000977, 0.000977, 0.000000, 0.000000)\n        max r8.xy, r5.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        mov r9.zw, l(0,0,0,0)\n        mov r8.zw, l(0,0,0,0)\n        break \n        case l(6)\n        ushr r0.y, r9.x, l(16)\n        f16tof32 r9.x, r9.x\n        f16tof32 r9.y, r0.y\n        ushr r0.y, r8.x, l(16)\n        f16tof32 r8.x, r8.x\n        f16tof32 r8.y, r0.y\n        mov r9.zw, l(0,0,0,0)\n        mov r8.zw, l(0,0,0,0)\n        break \n        default \n        mov r9.yzw, l(0,0,0,0)\n        mov r8.yzw, l(0,0,0,0)\n        break \n      endswitch \n    endif \n    add r9.xyzw, r7.xyzw, r9.xyzw\n    add r8.xyzw, r6.xyzw, r8.xyzw\n    iadd r0.y, r2.x, r2.y\n    if_nz r5.w\n      ieq r2.x, r1.y, l(8)\n      if_nz r2.x\n        ld_raw r10.xyzw, r0.y, T0[0].zwxy\n        mov r11.xy, r10.zwzz\n      else \n        ld_raw r11.xy, r0.y, T0[0].xyxx\n        iadd r2.x, r1.y, r0.y\n        ld_raw r10.xy, r2.x, T0[0].xyxx\n      endif \n      switch r5.z\n        case l(5)\n        ishl r11.zw, r11.xxxy, l(0, 0, 16, 16)\n        ishr r12.xyzw, r11.zxwy, l(16, 16, 16, 16)\n        itof r12.xyzw, r12.xyzw\n        mul r12.xyzw, r12.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r11.xyzw, r12.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        ishl r10.zw, r10.xxxy, l(0, 0, 16, 16)\n        ishr r12.xyzw, r10.zxwy, l(16, 16, 16, 16)\n        itof r12.xyzw, r12.xyzw\n        mul r12.xyzw, r12.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r10.xyzw, r12.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        break \n        case l(7)\n        ushr r2.xy, r11.xyxx, l(16, 16, 0, 0)\n        f16tof32 r11.xz, r11.xxyx\n        f16tof32 r11.yw, r2.xxxy\n        ushr r2.xy, r10.xyxx, l(16, 16, 0, 0)\n        f16tof32 r10.xz, r10.xxyx\n        f16tof32 r10.yw, r2.xxxy\n        break \n        default \n        mov r11.zw, l(0,0,0,0)\n        mov r10.zw, l(0,0,0,0)\n        break \n      endswitch \n    else \n      ieq r2.x, r1.y, l(4)\n      if_nz r2.x\n        ld_raw r10.xy, r0.y, T0[0].yxxx\n        mov r11.x, r10.y\n      else \n        ld_raw r11.x, r0.y, T0[0].xxxx\n        iadd r0.y, r1.y, r0.y\n        ld_raw r10.x, r0.y, T0[0].xxxx\n      endif \n      switch r5.z\n        case l(0)\n        case l(1)\n        ushr r11.yzw, r11.xxxx, l(0, 8, 16, 24)\n        and r5.xyzw, r11.xyzw, l(255, 255, 255, 255)\n        utof r5.xyzw, r5.xyzw\n        mul r11.xyzw, r5.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        ushr r10.yzw, r10.xxxx, l(0, 8, 16, 24)\n        and r5.xyzw, r10.xyzw, l(255, 255, 255, 255)\n        utof r5.xyzw, r5.xyzw\n        mul r10.xyzw, r5.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        break \n        case l(2)\n        case l(10)\n        ushr r11.yzw, r11.xxxx, l(0, 10, 20, 30)\n        and r5.xyzw, r11.xyzw, l(1023, 1023, 1023, 3)\n        utof r5.xyzw, r5.xyzw\n        mul r11.xyzw, r5.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        ushr r10.yzw, r10.xxxx, l(0, 10, 20, 30)\n        and r5.xyzw, r10.xyzw, l(1023, 1023, 1023, 3)\n        utof r5.xyzw, r5.xyzw\n        mul r10.xyzw, r5.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        break \n        case l(3)\n        case l(12)\n        ushr r11.yzw, r11.xxxx, l(0, 10, 20, 30)\n        and r2.xyw, r11.xyxz, l(1023, 1023, 0, 1023)\n        and r5.xyz, r11.xyzx, l(127, 127, 127, 0)\n        ubfe r12.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r11.xyzx\n        firstbit_hi r13.xyz, r5.xyzx\n        iadd r13.xyz, r13.xyzx, l(-24, -24, -24, 0)\n        movc r13.xyz, r5.xyzx, r13.xyzx, l(8,8,8,0)\n        iadd r14.xyz, -r13.xyzx, l(1, 1, 1, 0)\n        movc r14.xyz, r12.xyzx, r12.xyzx, r14.xyzx\n        bfi r13.xyz, l(7, 7, 7, 0), r13.xyzx, r11.xyzx, l(0, 0, 0, 0)\n        and r13.xyz, r13.xyzx, l(127, 127, 127, 0)\n        movc r5.xyz, r12.xyzx, r5.xyzx, r13.xyzx\n        ishl r12.xyz, r14.xyzx, l(23, 23, 23, 0)\n        iadd r12.xyz, r12.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r5.xyz, r5.xyzx, l(16, 16, 16, 0)\n        iadd r5.xyz, r12.xyzx, r5.xyzx\n        movc r11.xyz, r2.xywx, r5.xyzx, l(0,0,0,0)\n        utof r0.y, r11.w\n        mul r11.w, r0.y, l(0.333333)\n        ushr r10.yzw, r10.xxxx, l(0, 10, 20, 30)\n        and r2.xyw, r10.xyxz, l(1023, 1023, 0, 1023)\n        and r5.xyz, r10.xyzx, l(127, 127, 127, 0)\n        ubfe r12.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r10.xyzx\n        firstbit_hi r13.xyz, r5.xyzx\n        iadd r13.xyz, r13.xyzx, l(-24, -24, -24, 0)\n        movc r13.xyz, r5.xyzx, r13.xyzx, l(8,8,8,0)\n        iadd r14.xyz, -r13.xyzx, l(1, 1, 1, 0)\n        movc r14.xyz, r12.xyzx, r12.xyzx, r14.xyzx\n        bfi r13.xyz, l(7, 7, 7, 0), r13.xyzx, r10.xyzx, l(0, 0, 0, 0)\n        and r13.xyz, r13.xyzx, l(127, 127, 127, 0)\n        movc r5.xyz, r12.xyzx, r5.xyzx, r13.xyzx\n        ishl r12.xyz, r14.xyzx, l(23, 23, 23, 0)\n        iadd r12.xyz, r12.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r5.xyz, r5.xyzx, l(16, 16, 16, 0)\n        iadd r5.xyz, r12.xyzx, r5.xyzx\n        movc r10.xyz, r2.xywx, r5.xyzx, l(0,0,0,0)\n        utof r0.y, r10.w\n        mul r10.w, r0.y, l(0.333333)\n        break \n        case l(4)\n        ishl r11.y, r11.x, l(16)\n        ishr r2.xy, r11.yxyy, l(16, 16, 0, 0)\n        itof r2.xy, r2.xyxx\n        mul r2.xy, r2.xyxx, l(0.000977, 0.000977, 0.000000, 0.000000)\n        max r11.xy, r2.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        ishl r10.y, r10.x, l(16)\n        ishr r2.xy, r10.yxyy, l(16, 16, 0, 0)\n        itof r2.xy, r2.xyxx\n        mul r2.xy, r2.xyxx, l(0.000977, 0.000977, 0.000000, 0.000000)\n        max r10.xy, r2.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        mov r11.zw, l(0,0,0,0)\n        mov r10.zw, l(0,0,0,0)\n        break \n        case l(6)\n        ushr r0.y, r11.x, l(16)\n        f16tof32 r11.x, r11.x\n        f16tof32 r11.y, r0.y\n        ushr r0.y, r10.x, l(16)\n        f16tof32 r10.x, r10.x\n        f16tof32 r10.y, r0.y\n        mov r11.zw, l(0,0,0,0)\n        mov r10.zw, l(0,0,0,0)\n        break \n        default \n        mov r11.yzw, l(0,0,0,0)\n        mov r10.yzw, l(0,0,0,0)\n        break \n      endswitch \n    endif \n    add r7.xyzw, r9.xyzw, r11.xyzw\n    add r6.xyzw, r8.xyzw, r10.xyzw\n  else \n    mov r1.w, r1.z\n  endif \nendif \nmul r5.xyzw, r1.wwww, r7.xyzw\nmul r6.xyzw, r1.wwww, r6.xyzw\nif_nz r0.w\n  mov r5.xz, r5.zzxz\n  mov r6.xz, r6.zzxz\nendif \niadd r3.xyzw, r3.xyzw, r4.xyzw\nif_nz r0.z\n  ubfe r0.y, l(3), l(4), CB0[0][0].z\n  bfi r0.z, l(10), l(1), r2.z, l(0)\n  ishr r0.w, r0.y, l(2)\n  ishr r2.xyzw, r3.wyww, l(4, 5, 1, 3)\n  imad r0.z, r0.w, r0.z, r2.x\n  imad r0.z, r0.z, r1.x, r2.y\n  bfi r0.y, l(2), l(5), r0.y, l(0)\n  bfi r1.y, l(2), l(3), r2.z, l(0)\n  iadd r0.y, r0.y, r1.y\n  bfi r0.y, l(3), l(0), r3.y, r0.y\n  bfi r0.y, l(25), l(7), r0.z, r0.y\n  xor r0.z, r0.w, r2.w\n  ubfe r0.w, l(2), l(3), r3.y\n  bfi r1.yz, l(0, 1, 1, 0), l(0, 1, 11, 0), r0.zzzz, l(0, 0, 0, 0)\n  xor r0.z, r0.w, r1.y\n  bfi r0.w, l(1), l(4), r3.w, l(0)\n  imad r0.z, r0.z, l(64), r0.w\n  iadd r0.z, r1.z, r0.z\n  ibfe r0.yw, l(0, 27, 0, 24), l(0, 1, 0, 4), r0.yyyy\n  bfi r0.y, l(3), l(8), r0.y, r0.z\n  bfi r0.y, l(20), l(12), r0.w, r0.y\nelse \n  ishr r2.xyzw, r3.xyzw, l(5, 5, 1, 4)\n  imad r0.z, r2.x, r1.x, r2.y\n  bfi r1.xy, l(3, 1, 0, 0), l(3, 11, 0, 0), r2.zwzz, l(0, 0, 0, 0)\n  bfi r0.w, l(3), l(0), r3.y, r1.x\n  imad r0.z, r0.z, l(64), r0.w\n  ubfe r0.w, l(2), l(3), r3.y\n  ishr r1.x, r3.w, l(3)\n  bfi r1.x, l(1), l(1), r1.x, l(0)\n  xor r0.w, r0.w, r1.x\n  bfi r1.x, l(1), l(4), r3.w, l(0)\n  imad r0.w, r0.w, l(64), r1.x\n  iadd r0.w, r1.y, r0.w\n  ibfe r1.xy, l(27, 24, 0, 0), l(1, 4, 0, 0), r0.zzzz\n  bfi r0.z, l(3), l(8), r1.x, r0.w\n  bfi r0.y, l(20), l(12), r1.y, r0.z\nendif \niadd r0.y, r0.y, CB0[0][1].x\nieq r0.z, r0.x, l(5)\nif_nz r0.z\n  mov r5.yw, r5.wwwy\n  mov r5.xyzw, r5.yzwx\n  mov r0.w, l(2)\nelse \n  mov r0.w, r0.x\nendif \nieq r1.x, r0.w, l(4)\nif_nz r1.x\n  mov r5.xyzw, r5.yxwz\n  mov r0.w, l(2)\nendif \nieq r1.xyz, r0.wwww, l(1, 2, 3, 0)\nor r1.xy, r1.yzyy, r1.xyxx\nif_nz r1.x\n  ishl r2.xyzw, r5.xyzw, l(8, 8, 8, 8)\n  and r2.xyzw, r2.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r3.xyzw, r5.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r5.xyzw, r2.xyzw, r3.xyzw\nendif \nif_nz r1.y\n  ushr r1.xyzw, r5.xyzw, l(16, 16, 16, 16)\n  bfi r5.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r5.xyzw, r1.xyzw\nendif \nstore_raw U0[0].xyzw, r0.y, r5.xyzw\niadd r0.y, r0.y, l(32)\nif_nz r0.z\n  mov r6.yw, r6.wwwy\n  mov r6.xyzw, r6.yzwx\n  mov r0.x, l(2)\nendif \nieq r0.z, r0.x, l(4)\nif_nz r0.z\n  mov r6.xyzw, r6.yxwz\n  mov r0.x, l(2)\nendif \nieq r0.xzw, r0.xxxx, l(1, 0, 2, 3)\nor r0.xz, r0.zzwz, r0.xxzx\nif_nz r0.x\n  ishl r1.xyzw, r6.xyzw, l(8, 8, 8, 8)\n  and r1.xyzw, r1.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r2.xyzw, r6.xyzw, l(8, 8, 8, 8)\n  and r2.xyzw, r2.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r6.xyzw, r1.xyzw, r2.xyzw\nendif \nif_nz r0.z\n  ushr r1.xyzw, r6.xyzw, l(16, 16, 16, 16)\n  bfi r6.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r6.xyzw, r1.xyzw\nendif \nstore_raw U0[0].xyzw, r0.y, r6.xyzw\nret \n// Approximately 730 instruction slots used\n#endif\n\nconst BYTE resolve_full_128bpp_cs[] =\n{\n     68,  88,  66,  67, 220,  42, \n     20, 247, 199, 175,  18, 112, \n     43,  71, 195, 131, 147,  27, \n    241, 203,   1,   0,   0,   0, \n    104,  84,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n    208,   2,   0,   0, 224,   2, \n      0,   0, 240,   2,   0,   0, \n    204,  83,   0,   0,  82,  68, \n     69,  70, 148,   2,   0,   0, \n      1,   0,   0,   0, 228,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    105,   2,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 197,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 213,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 114, 101, 115, \n    111, 108, 118, 101,  95, 101, \n    100, 114,  97, 109,   0, 120, \n    101,  95, 114, 101, 115, 111, \n    108, 118, 101,  95, 100, 101, \n    115, 116,   0, 112, 117, 115, \n    104,  95,  99, 111, 110, 115, \n    116, 115,  95, 120, 101,   0, \n    213,   0,   0,   0,   5,   0, \n      0,   0, 252,   0,   0,   0, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    196,   1,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 224,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,   4,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 224,   1,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  31,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    224,   1,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     52,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 224,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  84,   2, \n      0,   0,  16,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 224,   1,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 114, \n    101, 115, 111, 108, 118, 101, \n     95, 101, 100, 114,  97, 109, \n     95, 105, 110, 102, 111,   0, \n    100, 119, 111, 114, 100,   0, \n      0,   0,  19,   0,   1,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 218,   1,   0,   0, \n    120, 101,  95, 114, 101, 115, \n    111, 108, 118, 101,  95,  99, \n    111, 111, 114, 100, 105, 110, \n     97, 116, 101,  95, 105, 110, \n    102, 111,   0, 120, 101,  95, \n    114, 101, 115, 111, 108, 118, \n    101,  95, 100, 101, 115, 116, \n     95, 105, 110, 102, 111,   0, \n    120, 101,  95, 114, 101, 115, \n    111, 108, 118, 101,  95, 100, \n    101, 115, 116,  95,  99, 111, \n    111, 114, 100, 105, 110,  97, \n    116, 101,  95, 105, 110, 102, \n    111,   0, 120, 101,  95, 114, \n    101, 115, 111, 108, 118, 101, \n     95, 100, 101, 115, 116,  95, \n     98,  97, 115, 101,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n    212,  80,   0,   0,  81,   0, \n      5,   0,  53,  20,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n     50,   0,   2,   0, 104,   0, \n      0,   2,  15,   0,   0,   0, \n    155,   0,   0,   4,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  12, 242,   0,  16,   0, \n      0,   0,   0,   0,  38, 138, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0, 255,   3, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   1,   1,   0, \n      0,   9,  18,   0,  16,   0, \n      1,   0,   0,   0,  58, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n    255,   3,   0,   0,  85,   0, \n      0,  12, 114,   0,  16,   0, \n      2,   0,   0,   0,  86, 135, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,   5,   0, \n      0,   0,  10,   0,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  12, 242,   0,  16,   0, \n      3,   0,   0,   0, 246, 143, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n     24,   0,   0,   0,  20,   0, \n      0,   0,  24,   0,   0,   0, \n     24,   0,   0,   0,  41,   0, \n      0,   6,  34,   0,  16,   0, \n      4,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  11,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     80,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      1,   0,   0,   0,  62,   0, \n      0,   1,  21,   0,   0,   1, \n    138,   0,   0,  17, 242,   0, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,  11,   0,   0,   0, \n      4,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  13,   0, \n      0,   0,  24,   0,   0,   0, \n     28,   0,   0,   0,   6, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   7, \n    130,   0,  16,   0,   2,   0, \n      0,   0,  26, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  20,  98,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0, 246,  12, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 139,   0,   0,  11, \n    130,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n     42, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  23,   0, \n      0,   0,  30,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   0,   0, 128,  63, \n    140,   0,   0,  20, 242,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   4,   0, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  11, \n     18,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,  28,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   4, 210,   0,  16,   0, \n      4,   0,   0,   0,  86,   5, \n      2,   0,  30,   0,   0,   7, \n     98,   0,  16,   0,   1,   0, \n      0,   0,  86,   6,  16,   0, \n      1,   0,   0,   0,  86,   7, \n     16,   0,   4,   0,   0,   0, \n     80,   0,   0,   7,  34,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      2,   0,   0,   0,  54,   0, \n      0,   5,  34,   0,  16,   0, \n      6,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     18,   0,   0,   1,  32,   0, \n      0,   7,  34,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  31,   0,   4,   3, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  54,   0,   0,   5, \n     34,   0,  16,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  18,   0, \n      0,   1,  54,   0,   0,   5, \n     34,   0,  16,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  21,   0,   0,   1, \n     80,   0,   0,  10, 162,   0, \n     16,   0,   2,   0,   0,   0, \n      6,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  10, 162,   0,  16,   0, \n      2,   0,   0,   0,  86,  13, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  41,   0,   0,   7, \n     98,   0,  16,   0,   1,   0, \n      0,   0,  86,   6,  16,   0, \n      1,   0,   0,   0,  86,   7, \n     16,   0,   2,   0,   0,   0, \n     85,   0,   0,   7,  18,   0, \n     16,   0,   6,   0,   0,   0, \n     26,   0,  16,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  10,  50,   0,  16,   0, \n      6,   0,   0,   0,  70,   0, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     98,   0,  16,   0,   1,   0, \n      0,   0,  86,   6,  16,   0, \n      1,   0,   0,   0,   6,   1, \n     16,   0,   6,   0,   0,   0, \n     85,   0,   0,   7,  18,   0, \n     16,   0,   6,   0,   0,   0, \n      1,  64,   0,   0,  80,   0, \n      0,   0,  58,   0,  16,   0, \n      5,   0,   0,   0,  54,   0, \n      0,   5,  34,   0,  16,   0, \n      6,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n     78,   0,   0,   8, 194,   0, \n     16,   0,   6,   0,   0,   0, \n      0, 208,   0,   0,  86,   9, \n     16,   0,   1,   0,   0,   0, \n      6,   4,  16,   0,   6,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   6,   0, \n      0,   0,  30,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   5,   0,   0,   0, \n     35,   0,   0,  10,  98,   0, \n     16,   0,   1,   0,   0,   0, \n    166,  11,  16, 128,  65,   0, \n      0,   0,   6,   0,   0,   0, \n      6,   1,  16,   0,   6,   0, \n      0,   0,  86,   6,  16,   0, \n      1,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   6,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  41,   0, \n      0,   7,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   5,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   5,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  78,   0,   0,   8, \n      0, 208,   0,   0,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,  40,   0,  41,   0, \n      0,   7,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,  30,   0,   0,   7, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   5,   0,   0,   0, \n     41,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  31,   0, \n      4,   3,  58,   0,  16,   0, \n      5,   0,   0,   0,  32,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   8,   0, \n      0,   0,  31,   0,   4,   3, \n     42,   0,  16,   0,   1,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0, 230, 116, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  50,   0,  16,   0, \n      7,   0,   0,   0, 230,  10, \n     16,   0,   6,   0,   0,   0, \n     18,   0,   0,   1, 165,   0, \n      0,   8,  50,   0,  16,   0, \n      7,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     70, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0, 165,   0, \n      0,   8,  50,   0,  16,   0, \n      6,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     70, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  76,   0, \n      0,   3,  42,   0,  16,   0, \n      5,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      5,   0,   0,   0,  41,   0, \n      0,  10, 194,   0,  16,   0, \n      7,   0,   0,   0,   6,   4, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  38,   7,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,  41,   0, \n      0,  10, 194,   0,  16,   0, \n      6,   0,   0,   0,   6,   4, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  38,   7,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  85,   0,   0,  10, \n    162,   0,  16,   0,   2,   0, \n      0,   0,   6,   4,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n    131,   0,   0,   5,  82,   0, \n     16,   0,   7,   0,   0,   0, \n      6,   1,  16,   0,   7,   0, \n      0,   0, 131,   0,   0,   5, \n    162,   0,  16,   0,   7,   0, \n      0,   0,  86,  13,  16,   0, \n      2,   0,   0,   0,  85,   0, \n      0,  10, 162,   0,  16,   0, \n      2,   0,   0,   0,   6,   4, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0, 131,   0,   0,   5, \n     82,   0,  16,   0,   6,   0, \n      0,   0,   6,   1,  16,   0, \n      6,   0,   0,   0, 131,   0, \n      0,   5, 162,   0,  16,   0, \n      6,   0,   0,   0,  86,  13, \n     16,   0,   2,   0,   0,   0, \n      2,   0,   0,   1,  10,   0, \n      0,   1,  54,   0,   0,   8, \n    194,   0,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,  23,   0, \n      0,   1,  18,   0,   0,   1, \n     32,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      1,   0,   0,   0, 165,   0, \n      0,   8,  50,   0,  16,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     22, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   6,   0, \n      0,   0,  18,   0,   0,   1, \n    165,   0,   0,   8,  18,   0, \n     16,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n    165,   0,   0,   8,  18,   0, \n     16,   0,   6,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     76,   0,   0,   3,  42,   0, \n     16,   0,   5,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   0,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   7,   0,   0,   0, \n      6,   0,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  16,   0,   0,   0, \n     24,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59,  85,   0,   0,  10, \n    226,   0,  16,   0,   6,   0, \n      0,   0,   6,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,  10,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,   7,   0, \n      0,   0,   6,   0,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      3,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      8,  32, 128,  58,   8,  32, \n    128,  58,   8,  32, 128,  58, \n    171, 170, 170,  62,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      6,   0,   0,   0,   6,   0, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   3,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   8,  32, 128,  58, \n      8,  32, 128,  58,   8,  32, \n    128,  58, 171, 170, 170,  62, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n     12,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      7,   0,   0,   0,   6,   0, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,   8,   0, \n      0,   0,  70,   2,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,   9,   0,   0,   0, \n     70,   2,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 114,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n      7,   0,   0,   0, 135,   0, \n      0,   5, 114,   0,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,   9,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  11,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n    232, 255, 255, 255, 232, 255, \n    255, 255, 232, 255, 255, 255, \n      0,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,   9,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  11, 114,   0,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16, 128,  65,   0,   0,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  10,   0, \n      0,   0,  70,   2,  16,   0, \n     10,   0,   0,   0,  70,   2, \n     16,   0,  12,   0,   0,   0, \n    140,   0,   0,  17, 114,   0, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  11,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,   9,   0,   0,   0, \n     70,   2,  16,   0,  10,   0, \n      0,   0,  70,   2,  16,   0, \n      9,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  10,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     10,   0,   0,   0,  70,   2, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,   9,   0, \n      0,   0,  70,   2,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 114,   0, \n     16,   0,   9,   0,   0,   0, \n     70,   2,  16,   0,  10,   0, \n      0,   0,  70,   2,  16,   0, \n      9,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n      7,   0,   0,   0,  70,   2, \n     16,   0,   8,   0,   0,   0, \n     70,   2,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   0, \n      0,   5,  66,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   7,   0,   0,   0, \n     56,   0,   0,   7, 130,   0, \n     16,   0,   7,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n    171, 170, 170,  62,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      6,   0,   0,   0,   6,   0, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,   8,   0, \n      0,   0,  70,   2,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,   9,   0,   0,   0, \n     70,   2,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 114,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n      6,   0,   0,   0, 135,   0, \n      0,   5, 114,   0,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,   9,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  11,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n    232, 255, 255, 255, 232, 255, \n    255, 255, 232, 255, 255, 255, \n      0,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,   9,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  11, 114,   0,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16, 128,  65,   0,   0,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  10,   0, \n      0,   0,  70,   2,  16,   0, \n     10,   0,   0,   0,  70,   2, \n     16,   0,  12,   0,   0,   0, \n    140,   0,   0,  17, 114,   0, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  11,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,   9,   0,   0,   0, \n     70,   2,  16,   0,  10,   0, \n      0,   0,  70,   2,  16,   0, \n      9,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  10,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     10,   0,   0,   0,  70,   2, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,   9,   0, \n      0,   0,  70,   2,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 114,   0, \n     16,   0,   9,   0,   0,   0, \n     70,   2,  16,   0,  10,   0, \n      0,   0,  70,   2,  16,   0, \n      9,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n      6,   0,   0,   0,  70,   2, \n     16,   0,   8,   0,   0,   0, \n     70,   2,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   0, \n      0,   5,  66,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   6,   0,   0,   0, \n     56,   0,   0,   7, 130,   0, \n     16,   0,   6,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n    171, 170, 170,  62,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  41,   0,   0,   7, \n     34,   0,  16,   0,   7,   0, \n      0,   0,  10,   0,  16,   0, \n      7,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n     42,   0,   0,  10, 162,   0, \n     16,   0,   2,   0,   0,   0, \n     86,   1,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 162,   0,  16,   0, \n      2,   0,   0,   0,  86,  13, \n     16,   0,   2,   0,   0,   0, \n     56,   0,   0,  10, 162,   0, \n     16,   0,   2,   0,   0,   0, \n     86,  13,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   1, \n    128,  58,   0,   0,   0,   0, \n      0,   1, 128,  58,  52,   0, \n      0,  10,  50,   0,  16,   0, \n      7,   0,   0,   0, 214,   5, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,   7, \n     34,   0,  16,   0,   6,   0, \n      0,   0,  10,   0,  16,   0, \n      6,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n     42,   0,   0,  10, 162,   0, \n     16,   0,   2,   0,   0,   0, \n     86,   1,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 162,   0,  16,   0, \n      2,   0,   0,   0,  86,  13, \n     16,   0,   2,   0,   0,   0, \n     56,   0,   0,  10, 162,   0, \n     16,   0,   2,   0,   0,   0, \n     86,  13,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   1, \n    128,  58,   0,   0,   0,   0, \n      0,   1, 128,  58,  52,   0, \n      0,  10,  50,   0,  16,   0, \n      6,   0,   0,   0, 214,   5, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      6,   0,   0,   0,  85,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   7,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0, 131,   0,   0,   5, \n     18,   0,  16,   0,   7,   0, \n      0,   0,  10,   0,  16,   0, \n      7,   0,   0,   0, 131,   0, \n      0,   5,  34,   0,  16,   0, \n      7,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     85,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0, 131,   0, \n      0,   5,  18,   0,  16,   0, \n      6,   0,   0,   0,  10,   0, \n     16,   0,   6,   0,   0,   0, \n    131,   0,   0,   5,  34,   0, \n     16,   0,   6,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,  10,   0, \n      0,   1,  54,   0,   0,   8, \n    226,   0,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 226,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,  23,   0, \n      0,   1,  21,   0,   0,   1, \n     80,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      1,   0,   0,   0,  56,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  63,  30,   0,   0,   7, \n     34,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  64,   1,   0,   0, \n     31,   0,   4,   3,  58,   0, \n     16,   0,   5,   0,   0,   0, \n     32,   0,   0,   7, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  31,   0, \n      4,   3,  58,   0,  16,   0, \n      2,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      8,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n    230, 116,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  50,   0, \n     16,   0,   9,   0,   0,   0, \n    230,  10,  16,   0,   8,   0, \n      0,   0,  18,   0,   0,   1, \n    165,   0,   0,   8,  50,   0, \n     16,   0,   9,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  70, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    130,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n    165,   0,   0,   8,  50,   0, \n     16,   0,   8,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  70, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     76,   0,   0,   3,  42,   0, \n     16,   0,   5,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   5,   0,   0,   0, \n     41,   0,   0,  10, 194,   0, \n     16,   0,   9,   0,   0,   0, \n      6,   4,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  38,   7, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n     41,   0,   0,  10, 194,   0, \n     16,   0,   8,   0,   0,   0, \n      6,   4,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  38,   7, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      7,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      5,   0,   0,   0,  70,   0, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 131,   0,   0,   5, \n     82,   0,  16,   0,   9,   0, \n      0,   0,   6,   1,  16,   0, \n      9,   0,   0,   0, 131,   0, \n      0,   5, 162,   0,  16,   0, \n      9,   0,   0,   0,   6,   4, \n     16,   0,   5,   0,   0,   0, \n     85,   0,   0,  10,  50,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   0,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 131,   0, \n      0,   5,  82,   0,  16,   0, \n      8,   0,   0,   0,   6,   1, \n     16,   0,   8,   0,   0,   0, \n    131,   0,   0,   5, 162,   0, \n     16,   0,   8,   0,   0,   0, \n      6,   4,  16,   0,   5,   0, \n      0,   0,   2,   0,   0,   1, \n     10,   0,   0,   1,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   1, \n     23,   0,   0,   1,  18,   0, \n      0,   1,  32,   0,   0,   7, \n    130,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     31,   0,   4,   3,  58,   0, \n     16,   0,   2,   0,   0,   0, \n    165,   0,   0,   8,  50,   0, \n     16,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  22, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   9,   0, \n      0,   0,  26,   0,  16,   0, \n      8,   0,   0,   0,  18,   0, \n      0,   1, 165,   0,   0,   8, \n     18,   0,  16,   0,   9,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 130,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 165,   0,   0,   8, \n     18,   0,  16,   0,   8,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  76,   0,   0,   3, \n     42,   0,  16,   0,   5,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,   0,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,   9,   0, \n      0,   0,   6,   0,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      8,   0,   0,   0,   6,   0, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     16,   0,   0,   0,  24,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      2,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n     10,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      9,   0,   0,   0,   6,   0, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   3,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   8,  32, 128,  58, \n      8,  32, 128,  58,   8,  32, \n    128,  58, 171, 170, 170,  62, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   8,   0,   0,   0, \n      6,   0,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     30,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   3,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   8,  32, \n    128,  58,   8,  32, 128,  58, \n      8,  32, 128,  58, 171, 170, \n    170,  62,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   9,   0,   0,   0, \n      6,   0,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     30,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     10,   0,   0,   0,  70,   2, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  11,   0, \n      0,   0,  70,   2,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n    138,   0,   0,  15, 114,   0, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,   9,   0,   0,   0, \n    135,   0,   0,   5, 114,   0, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0, 232, 255, 255, 255, \n    232, 255, 255, 255, 232, 255, \n    255, 255,   0,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,  70,   2,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  11, 114,   0, \n     16,   0,  14,   0,   0,   0, \n     70,   2,  16, 128,  65,   0, \n      0,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  14,   0, \n      0,   0,  70,   2,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  14,   0, \n      0,   0, 140,   0,   0,  17, \n    114,   0,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  11,   0, \n      0,   0,  70,   2,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  12,   0, \n      0,   0,  70,   2,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    114,   0,  16,   0,  11,   0, \n      0,   0,  70,   2,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,   9,   0,   0,   0, \n     70,   2,  16,   0,  10,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     86,   0,   0,   5, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   9,   0, \n      0,   0,  56,   0,   0,   7, \n    130,   0,  16,   0,   9,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0, 171, 170, 170,  62, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   8,   0,   0,   0, \n      6,   0,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     30,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     10,   0,   0,   0,  70,   2, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  11,   0, \n      0,   0,  70,   2,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n    138,   0,   0,  15, 114,   0, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,   8,   0,   0,   0, \n    135,   0,   0,   5, 114,   0, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0, 232, 255, 255, 255, \n    232, 255, 255, 255, 232, 255, \n    255, 255,   0,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,  70,   2,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  11, 114,   0, \n     16,   0,  14,   0,   0,   0, \n     70,   2,  16, 128,  65,   0, \n      0,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  14,   0, \n      0,   0,  70,   2,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  14,   0, \n      0,   0, 140,   0,   0,  17, \n    114,   0,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  11,   0, \n      0,   0,  70,   2,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  12,   0, \n      0,   0,  70,   2,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    114,   0,  16,   0,  11,   0, \n      0,   0,  70,   2,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,   8,   0,   0,   0, \n     70,   2,  16,   0,  10,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     86,   0,   0,   5, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   8,   0, \n      0,   0,  56,   0,   0,   7, \n    130,   0,  16,   0,   8,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0, 171, 170, 170,  62, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      4,   0,   0,   0,  41,   0, \n      0,   7,  34,   0,  16,   0, \n      9,   0,   0,   0,  10,   0, \n     16,   0,   9,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0,  42,   0,   0,  10, \n     50,   0,  16,   0,   5,   0, \n      0,   0,  22,   5,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   0,   0,   5,  50,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   0,  16,   0,   5,   0, \n      0,   0,  56,   0,   0,  10, \n     50,   0,  16,   0,   5,   0, \n      0,   0,  70,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     52,   0,   0,  10,  50,   0, \n     16,   0,   9,   0,   0,   0, \n     70,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7,  34,   0,  16,   0, \n      8,   0,   0,   0,  10,   0, \n     16,   0,   8,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0,  42,   0,   0,  10, \n     50,   0,  16,   0,   5,   0, \n      0,   0,  22,   5,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   0,   0,   5,  50,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   0,  16,   0,   5,   0, \n      0,   0,  56,   0,   0,  10, \n     50,   0,  16,   0,   5,   0, \n      0,   0,  70,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     52,   0,   0,  10,  50,   0, \n     16,   0,   8,   0,   0,   0, \n     70,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   6,   0,   0,   0, \n     85,   0,   0,   7, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   9,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0, 131,   0, \n      0,   5,  18,   0,  16,   0, \n      9,   0,   0,   0,  10,   0, \n     16,   0,   9,   0,   0,   0, \n    131,   0,   0,   5,  34,   0, \n     16,   0,   9,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  85,   0,   0,   7, \n    130,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      8,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n    131,   0,   0,   5,  18,   0, \n     16,   0,   8,   0,   0,   0, \n     10,   0,  16,   0,   8,   0, \n      0,   0, 131,   0,   0,   5, \n     34,   0,  16,   0,   8,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   1, \n     10,   0,   0,   1,  54,   0, \n      0,   8, 226,   0,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 226,   0, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   1, \n     23,   0,   0,   1,  21,   0, \n      0,   1,   0,   0,   0,   7, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n      0,   0,   0,   7, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,  80,   0, \n      0,   7,  18,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  41,   0,   0,   7, \n     18,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  58,   0, \n     16,   0,   5,   0,   0,   0, \n     56,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0, 128,  62,  30,   0, \n      0,   7,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  31,   0,   4,   3, \n     58,   0,  16,   0,   5,   0, \n      0,   0,  32,   0,   0,   7, \n    130,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     31,   0,   4,   3,  58,   0, \n     16,   0,   2,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0, 230, 116,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     50,   0,  16,   0,   9,   0, \n      0,   0, 230,  10,  16,   0, \n      8,   0,   0,   0,  18,   0, \n      0,   1, 165,   0,   0,   8, \n     50,   0,  16,   0,   9,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  70, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 130,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n     50,   0,  16,   0,   8,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,  70, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  76,   0,   0,   3, \n     42,   0,  16,   0,   5,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  41,   0,   0,  10, \n    194,   0,  16,   0,   9,   0, \n      0,   0,   6,   4,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     38,   7,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,  41,   0,   0,  10, \n    194,   0,  16,   0,   8,   0, \n      0,   0,   6,   4,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     38,   7,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     85,   0,   0,  10,  50,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   0,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 131,   0, \n      0,   5,  82,   0,  16,   0, \n      9,   0,   0,   0,   6,   1, \n     16,   0,   9,   0,   0,   0, \n    131,   0,   0,   5, 162,   0, \n     16,   0,   9,   0,   0,   0, \n      6,   4,  16,   0,   5,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   5,   0, \n      0,   0,  70,   0,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    131,   0,   0,   5,  82,   0, \n     16,   0,   8,   0,   0,   0, \n      6,   1,  16,   0,   8,   0, \n      0,   0, 131,   0,   0,   5, \n    162,   0,  16,   0,   8,   0, \n      0,   0,   6,   4,  16,   0, \n      5,   0,   0,   0,   2,   0, \n      0,   1,  10,   0,   0,   1, \n     54,   0,   0,   8, 194,   0, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   1,  23,   0,   0,   1, \n     18,   0,   0,   1,  32,   0, \n      0,   7, 130,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  31,   0,   4,   3, \n     58,   0,  16,   0,   2,   0, \n      0,   0, 165,   0,   0,   8, \n     50,   0,  16,   0,   8,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  22, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      9,   0,   0,   0,  26,   0, \n     16,   0,   8,   0,   0,   0, \n     18,   0,   0,   1, 165,   0, \n      0,   8,  18,   0,  16,   0, \n      9,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8,  18,   0,  16,   0, \n      8,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  76,   0, \n      0,   3,  42,   0,  16,   0, \n      5,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      0,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      1,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      9,   0,   0,   0,   6,   0, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     16,   0,   0,   0,  24,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   8,   0,   0,   0, \n      6,   0,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  16,   0,   0,   0, \n     24,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,  10,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   9,   0,   0,   0, \n      6,   0,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     30,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   3,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   8,  32, \n    128,  58,   8,  32, 128,  58, \n      8,  32, 128,  58, 171, 170, \n    170,  62,  85,   0,   0,  10, \n    226,   0,  16,   0,   8,   0, \n      0,   0,   6,   0,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      3,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      8,  32, 128,  58,   8,  32, \n    128,  58,   8,  32, 128,  58, \n    171, 170, 170,  62,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,   9,   0, \n      0,   0,   6,   0,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  10,   0,   0,   0, \n     70,   2,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,   9,   0, \n      0,   0, 135,   0,   0,   5, \n    114,   0,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255,   0,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  11, \n    114,   0,  16,   0,  14,   0, \n      0,   0,  70,   2,  16, 128, \n     65,   0,   0,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,  70,   2,  16,   0, \n     14,   0,   0,   0, 140,   0, \n      0,  17, 114,   0,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,  70,   2,  16,   0, \n     13,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  12,   0, \n      0,   0,  70,   2,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  11,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 114,   0,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,   9,   0, \n      0,   0,  70,   2,  16,   0, \n     10,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  86,   0,   0,   5, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      9,   0,   0,   0,  56,   0, \n      0,   7, 130,   0,  16,   0, \n      9,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0, 171, 170, \n    170,  62,  85,   0,   0,  10, \n    226,   0,  16,   0,   8,   0, \n      0,   0,   6,   0,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  10,   0,   0,   0, \n     70,   2,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,   8,   0, \n      0,   0, 135,   0,   0,   5, \n    114,   0,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255,   0,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  11, \n    114,   0,  16,   0,  14,   0, \n      0,   0,  70,   2,  16, 128, \n     65,   0,   0,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,  70,   2,  16,   0, \n     14,   0,   0,   0, 140,   0, \n      0,  17, 114,   0,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,  70,   2,  16,   0, \n     13,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  12,   0, \n      0,   0,  70,   2,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  11,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 114,   0,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,   8,   0, \n      0,   0,  70,   2,  16,   0, \n     10,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  86,   0,   0,   5, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      8,   0,   0,   0,  56,   0, \n      0,   7, 130,   0,  16,   0, \n      8,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0, 171, 170, \n    170,  62,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     41,   0,   0,   7,  34,   0, \n     16,   0,   9,   0,   0,   0, \n     10,   0,  16,   0,   9,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0,  42,   0, \n      0,  10,  50,   0,  16,   0, \n      5,   0,   0,   0,  22,   5, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  43,   0,   0,   5, \n     50,   0,  16,   0,   5,   0, \n      0,   0,  70,   0,  16,   0, \n      5,   0,   0,   0,  56,   0, \n      0,  10,  50,   0,  16,   0, \n      5,   0,   0,   0,  70,   0, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  52,   0,   0,  10, \n     50,   0,  16,   0,   9,   0, \n      0,   0,  70,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     41,   0,   0,   7,  34,   0, \n     16,   0,   8,   0,   0,   0, \n     10,   0,  16,   0,   8,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0,  42,   0, \n      0,  10,  50,   0,  16,   0, \n      5,   0,   0,   0,  22,   5, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  43,   0,   0,   5, \n     50,   0,  16,   0,   5,   0, \n      0,   0,  70,   0,  16,   0, \n      5,   0,   0,   0,  56,   0, \n      0,  10,  50,   0,  16,   0, \n      5,   0,   0,   0,  70,   0, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  52,   0,   0,  10, \n     50,   0,  16,   0,   8,   0, \n      0,   0,  70,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  85,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      9,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n    131,   0,   0,   5,  18,   0, \n     16,   0,   9,   0,   0,   0, \n     10,   0,  16,   0,   9,   0, \n      0,   0, 131,   0,   0,   5, \n     34,   0,  16,   0,   9,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  85,   0, \n      0,   7,  34,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   8,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0, 131,   0,   0,   5, \n     18,   0,  16,   0,   8,   0, \n      0,   0,  10,   0,  16,   0, \n      8,   0,   0,   0, 131,   0, \n      0,   5,  34,   0,  16,   0, \n      8,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   1,  10,   0,   0,   1, \n     54,   0,   0,   8, 226,   0, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    226,   0,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   1,  23,   0,   0,   1, \n     21,   0,   0,   1,   0,   0, \n      0,   7, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,   0,   0,   0,   7, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n     30,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  31,   0, \n      4,   3,  58,   0,  16,   0, \n      5,   0,   0,   0,  32,   0, \n      0,   7,  18,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   8,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   2,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0, 230, 116, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  50,   0,  16,   0, \n     11,   0,   0,   0, 230,  10, \n     16,   0,  10,   0,   0,   0, \n     18,   0,   0,   1, 165,   0, \n      0,   8,  50,   0,  16,   0, \n     11,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     70, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  18,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8,  50,   0,  16,   0, \n     10,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     70, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  76,   0, \n      0,   3,  42,   0,  16,   0, \n      5,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      5,   0,   0,   0,  41,   0, \n      0,  10, 194,   0,  16,   0, \n     11,   0,   0,   0,   6,   4, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  38,   7,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,  41,   0, \n      0,  10, 194,   0,  16,   0, \n     10,   0,   0,   0,   6,   4, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  38,   7,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    131,   0,   0,   5,  82,   0, \n     16,   0,  11,   0,   0,   0, \n      6,   1,  16,   0,  11,   0, \n      0,   0, 131,   0,   0,   5, \n    162,   0,  16,   0,  11,   0, \n      0,   0,   6,   4,  16,   0, \n      2,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 131,   0,   0,   5, \n     82,   0,  16,   0,  10,   0, \n      0,   0,   6,   1,  16,   0, \n     10,   0,   0,   0, 131,   0, \n      0,   5, 162,   0,  16,   0, \n     10,   0,   0,   0,   6,   4, \n     16,   0,   2,   0,   0,   0, \n      2,   0,   0,   1,  10,   0, \n      0,   1,  54,   0,   0,   8, \n    194,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,  23,   0, \n      0,   1,  18,   0,   0,   1, \n     32,   0,   0,   7,  18,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  31,   0, \n      4,   3,  10,   0,  16,   0, \n      2,   0,   0,   0, 165,   0, \n      0,   8,  50,   0,  16,   0, \n     10,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     22, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  11,   0,   0,   0, \n     26,   0,  16,   0,  10,   0, \n      0,   0,  18,   0,   0,   1, \n    165,   0,   0,   8,  18,   0, \n     16,   0,  11,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n    165,   0,   0,   8,  18,   0, \n     16,   0,  10,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     76,   0,   0,   3,  42,   0, \n     16,   0,   5,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   0,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  11,   0,   0,   0, \n      6,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  16,   0,   0,   0, \n     24,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59,  85,   0,   0,  10, \n    226,   0,  16,   0,  10,   0, \n      0,   0,   6,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,  10,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,  11,   0, \n      0,   0,   6,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      3,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      8,  32, 128,  58,   8,  32, \n    128,  58,   8,  32, 128,  58, \n    171, 170, 170,  62,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     10,   0,   0,   0,   6,   0, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   3,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   8,  32, 128,  58, \n      8,  32, 128,  58,   8,  32, \n    128,  58, 171, 170, 170,  62, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n     12,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     11,   0,   0,   0,   6,   0, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,   1,   0,   0,  10, \n    178,   0,  16,   0,   2,   0, \n      0,   0,  70,   8,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   0,   0, \n      0,   0, 255,   3,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 114,   0,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0, 135,   0, \n      0,   5, 114,   0,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,   5,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n    232, 255, 255, 255, 232, 255, \n    255, 255, 232, 255, 255, 255, \n      0,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,   5,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  11, 114,   0,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16, 128,  65,   0,   0,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  14,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,  70,   2,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  14,   0,   0,   0, \n    140,   0,   0,  17, 114,   0, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0,  70,   2, \n     16,   0,  13,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,   5,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 114,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     11,   0,   0,   0,  70,   3, \n     16,   0,   2,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   0, \n      0,   5,  34,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,  11,   0,   0,   0, \n     56,   0,   0,   7, 130,   0, \n     16,   0,  11,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n    171, 170, 170,  62,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     10,   0,   0,   0,   6,   0, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,   1,   0,   0,  10, \n    178,   0,  16,   0,   2,   0, \n      0,   0,  70,   8,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   0,   0, \n      0,   0, 255,   3,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   2,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 114,   0,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     10,   0,   0,   0, 135,   0, \n      0,   5, 114,   0,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,   5,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n    232, 255, 255, 255, 232, 255, \n    255, 255, 232, 255, 255, 255, \n      0,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,   5,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  11, 114,   0,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16, 128,  65,   0,   0,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  14,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,  70,   2,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  14,   0,   0,   0, \n    140,   0,   0,  17, 114,   0, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0,  70,   2, \n     16,   0,  13,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,   5,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 114,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     10,   0,   0,   0,  70,   3, \n     16,   0,   2,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   0, \n      0,   5,  34,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,  10,   0,   0,   0, \n     56,   0,   0,   7, 130,   0, \n     16,   0,  10,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n    171, 170, 170,  62,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  41,   0,   0,   7, \n     34,   0,  16,   0,  11,   0, \n      0,   0,  10,   0,  16,   0, \n     11,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n     42,   0,   0,  10,  50,   0, \n     16,   0,   2,   0,   0,   0, \n     22,   5,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  43,   0, \n      0,   5,  50,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     56,   0,   0,  10,  50,   0, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,  52,   0, \n      0,  10,  50,   0,  16,   0, \n     11,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,   7, \n     34,   0,  16,   0,  10,   0, \n      0,   0,  10,   0,  16,   0, \n     10,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n     42,   0,   0,  10,  50,   0, \n     16,   0,   2,   0,   0,   0, \n     22,   5,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  43,   0, \n      0,   5,  50,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     56,   0,   0,  10,  50,   0, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,  52,   0, \n      0,  10,  50,   0,  16,   0, \n     10,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      6,   0,   0,   0,  85,   0, \n      0,   7,  34,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,  11,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0, 131,   0,   0,   5, \n     18,   0,  16,   0,  11,   0, \n      0,   0,  10,   0,  16,   0, \n     11,   0,   0,   0, 131,   0, \n      0,   5,  34,   0,  16,   0, \n     11,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     85,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,  10,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0, 131,   0, \n      0,   5,  18,   0,  16,   0, \n     10,   0,   0,   0,  10,   0, \n     16,   0,  10,   0,   0,   0, \n    131,   0,   0,   5,  34,   0, \n     16,   0,  10,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,  10,   0, \n      0,   1,  54,   0,   0,   8, \n    226,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 226,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,  23,   0, \n      0,   1,  21,   0,   0,   1, \n      0,   0,   0,   7, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   7, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  18,   0,   0,   1, \n     54,   0,   0,   5, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  21,   0,   0,   1, \n     21,   0,   0,   1,  56,   0, \n      0,   7, 242,   0,  16,   0, \n      5,   0,   0,   0, 246,  15, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  56,   0,   0,   7, \n    242,   0,  16,   0,   6,   0, \n      0,   0, 246,  15,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     31,   0,   4,   3,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  82,   0, \n     16,   0,   5,   0,   0,   0, \n    166,   8,  16,   0,   5,   0, \n      0,   0,  54,   0,   0,   5, \n     82,   0,  16,   0,   6,   0, \n      0,   0, 166,   8,  16,   0, \n      6,   0,   0,   0,  21,   0, \n      0,   1,  30,   0,   0,   7, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n    138,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     66,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     10,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  42,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0, 118,  15,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   4,   0,   0,   0, \n      5,   0,   0,   0,   1,   0, \n      0,   0,   3,   0,   0,   0, \n     35,   0,   0,   9,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,   9,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  25,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     87,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0, 138,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0, 140,   0, \n      0,  20,  98,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0, 166,  10,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11, 130,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     35,   0,   0,   9,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     64,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0, 139,   0, \n      0,  15, 162,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     27,   0,   0,   0,   0,   0, \n      0,   0,  24,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   4,   0, \n      0,   0,  86,   5,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   8,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  20,   0, \n      0,   0,   1,  64,   0,   0, \n     12,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  18,   0,   0,   1, \n     42,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,   1,   0,   0,   0, \n      4,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  20,  50,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 230,  10,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  11, 130,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  64,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0, 138,   0,   0,   9, \n    130,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,  42,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n    140,   0,   0,  11,  18,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  18,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  35,   0,   0,   9, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  64,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n    139,   0,   0,  15,  50,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  27,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 166,  10, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  66,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  30,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  32,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   5,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     54,   0,   0,   5, 162,   0, \n     16,   0,   5,   0,   0,   0, \n    246,   7,  16,   0,   5,   0, \n      0,   0,  54,   0,   0,   5, \n    242,   0,  16,   0,   5,   0, \n      0,   0, 150,   3,  16,   0, \n      5,   0,   0,   0,  54,   0, \n      0,   5, 130,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     18,   0,   0,   1,  54,   0, \n      0,   5, 130,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  32,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  54,   0,   0,   5, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  22,  11,  16,   0, \n      5,   0,   0,   0,  54,   0, \n      0,   5, 130,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     21,   0,   0,   1,  32,   0, \n      0,  10, 114,   0,  16,   0, \n      1,   0,   0,   0, 246,  15, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   2,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   1,   0, \n      0,   0, 150,   5,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,  85,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     21,   0,   0,   1, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     30,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     32,   0,   0,   0,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5, 162,   0,  16,   0, \n      6,   0,   0,   0, 246,   7, \n     16,   0,   6,   0,   0,   0, \n     54,   0,   0,   5, 242,   0, \n     16,   0,   6,   0,   0,   0, \n    150,   3,  16,   0,   6,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  21,   0, \n      0,   1,  32,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     54,   0,   0,   5, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     22,  11,  16,   0,   6,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  21,   0, \n      0,   1,  32,   0,   0,  10, \n    210,   0,  16,   0,   0,   0, \n      0,   0,   6,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   7,  82,   0, \n     16,   0,   0,   0,   0,   0, \n    166,  11,  16,   0,   0,   0, \n      0,   0,   6,   2,  16,   0, \n      0,   0,   0,   0,  31,   0, \n      4,   3,  10,   0,  16,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  21,   0, \n      0,   1, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  62,   0, \n      0,   1,  83,  84,  65,  84, \n    148,   0,   0,   0, 218,   2, \n      0,   0,  15,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  66,   0,   0,   0, \n    141,   0,   0,   0, 108,   0, \n      0,   0,  55,   0,   0,   0, \n     35,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  24,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   0, \n     32,   0,   0,   0,  40,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/resolve_full_128bpp_scaled_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_resolve_edram_info;        // Offset:    0 Size:     4\n//   uint xe_resolve_coordinate_info;   // Offset:    4 Size:     4\n//   uint xe_resolve_dest_info;         // Offset:    8 Size:     4\n//   uint xe_resolve_dest_coordinate_info;// Offset:   12 Size:     4\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_resolve_edram                  texture    byte         r/o      T0             t0      1 \n// xe_resolve_dest                       UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][1], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xy\ndcl_temps 16\ndcl_thread_group 8, 8, 1\nand r0.xyzw, CB0[0][0].zxxz, l(7, 1023, 0x20000000, 8)\nif_nz r0.z\n  ubfe r1.xy, l(2, 2, 0, 0), l(17, 20, 0, 0), CB0[0][0].yyyy\nelse \n  mov r1.xy, l(0,0,0,0)\nendif \nubfe r2.xyz, l(3, 3, 11, 0), l(16, 19, 5, 0), CB0[0][0].yyyy\nimul null, r0.z, r2.x, r2.z\nand r1.zw, CB0[0][0].zzzw, l(0, 0, 0x01000000, 1023)\nushr r3.xyzw, CB0[0][0].ywww, l(4, 10, 20, 24)\nishl r4.x, vThreadID.x, l(1)\nishl r0.z, r0.z, l(3)\nuge r0.z, r4.x, r0.z\nif_nz r0.z\n  ret \nendif \nubfe r5.xyzw, l(2, 11, 4, 1), l(10, 13, 24, 28), CB0[0][0].xxxx\nmov r6.x, CB0[0][0].y\nmov r6.y, r3.x\nbfi r2.zw, l(0, 0, 4, 1), l(0, 0, 3, 3), r6.xxxy, l(0, 0, 0, 0)\nibfe r0.z, l(6), l(16), CB0[0][0].z\nishl r0.z, r0.z, l(23)\niadd r0.z, r0.z, l(0x3f800000)\nbfi r3.xz, l(4, 0, 4, 0), l(3, 0, 3, 0), r3.zzwz, l(0, 0, 0, 0)\nubfe r3.w, l(3), l(28), CB0[0][0].w\numax r6.x, r1.x, r4.x\numax r6.y, r1.y, vThreadID.y\nimad r2.zw, r2.zzzw, r2.xxxy, r6.xxxy\nuge r1.y, l(3), r3.w\nif_nz r1.y\n  mov r6.y, r3.w\nelse \n  ieq r1.y, r3.w, l(5)\n  if_nz r1.y\n    mov r6.y, l(2)\n  else \n    mov r6.y, l(0)\n  endif \nendif \nuge r4.zw, r5.xxxx, l(0, 0, 2, 1)\nand r4.zw, r4.zzzw, l(0, 0, 1, 1)\nishl r2.zw, r2.zzzw, r4.zzzw\nushr r6.x, r6.y, l(1)\nand r6.xy, r6.xyxx, l(1, 1, 0, 0)\niadd r2.zw, r2.zzzw, r6.xxxy\nimul null, r6.yz, r2.xxyx, l(0, 80, 16, 0)\nushr r6.x, r6.y, r5.w\nudiv r7.xy, null, r2.zwzz, r6.xzxx\nimad r0.y, r7.y, r0.y, r7.x\niadd r0.y, r0.y, r5.y\nimad r2.zw, -r7.xxxy, r6.xxxz, r2.zzzw\nimul null, r1.y, r6.z, r6.y\nimad r2.z, r2.w, r6.x, r2.z\nishl r2.z, r2.z, r5.w\nimad r0.y, r0.y, r1.y, r2.z\nishl r1.y, r1.y, l(11)\nudiv null, r0.y, r0.y, r1.y\nishl r0.y, r0.y, l(2)\niadd r1.y, r4.z, r5.w\nishl r1.y, l(4), r1.y\nif_nz r5.w\n  ieq r2.z, r1.y, l(8)\n  if_nz r2.z\n    ld_raw r6.xyzw, r0.y, T0[0].zwxy\n    mov r7.xy, r6.zwzz\n  else \n    ld_raw r7.xy, r0.y, T0[0].xyxx\n    iadd r2.z, r0.y, r1.y\n    ld_raw r6.xy, r2.z, T0[0].xyxx\n  endif \n  switch r5.z\n    case l(5)\n    ishl r7.zw, r7.xxxy, l(0, 0, 16, 16)\n    ishr r8.xyzw, r7.zxwy, l(16, 16, 16, 16)\n    itof r8.xyzw, r8.xyzw\n    mul r8.xyzw, r8.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n    max r7.xyzw, r8.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n    ishl r6.zw, r6.xxxy, l(0, 0, 16, 16)\n    ishr r8.xyzw, r6.zxwy, l(16, 16, 16, 16)\n    itof r8.xyzw, r8.xyzw\n    mul r8.xyzw, r8.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n    max r6.xyzw, r8.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n    break \n    case l(7)\n    ushr r2.zw, r7.xxxy, l(0, 0, 16, 16)\n    f16tof32 r7.xz, r7.xxyx\n    f16tof32 r7.yw, r2.zzzw\n    ushr r2.zw, r6.xxxy, l(0, 0, 16, 16)\n    f16tof32 r6.xz, r6.xxyx\n    f16tof32 r6.yw, r2.zzzw\n    break \n    default \n    mov r7.zw, l(0,0,0,0)\n    mov r6.zw, l(0,0,0,0)\n    break \n  endswitch \nelse \n  ieq r2.z, r1.y, l(4)\n  if_nz r2.z\n    ld_raw r6.xy, r0.y, T0[0].yxxx\n    mov r7.x, r6.y\n  else \n    ld_raw r7.x, r0.y, T0[0].xxxx\n    iadd r2.z, r0.y, r1.y\n    ld_raw r6.x, r2.z, T0[0].xxxx\n  endif \n  switch r5.z\n    case l(0)\n    case l(1)\n    ushr r7.yzw, r7.xxxx, l(0, 8, 16, 24)\n    and r8.xyzw, r7.xyzw, l(255, 255, 255, 255)\n    utof r8.xyzw, r8.xyzw\n    mul r7.xyzw, r8.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n    ushr r6.yzw, r6.xxxx, l(0, 8, 16, 24)\n    and r8.xyzw, r6.xyzw, l(255, 255, 255, 255)\n    utof r8.xyzw, r8.xyzw\n    mul r6.xyzw, r8.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n    break \n    case l(2)\n    case l(10)\n    ushr r7.yzw, r7.xxxx, l(0, 10, 20, 30)\n    and r8.xyzw, r7.xyzw, l(1023, 1023, 1023, 3)\n    utof r8.xyzw, r8.xyzw\n    mul r7.xyzw, r8.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n    ushr r6.yzw, r6.xxxx, l(0, 10, 20, 30)\n    and r8.xyzw, r6.xyzw, l(1023, 1023, 1023, 3)\n    utof r8.xyzw, r8.xyzw\n    mul r6.xyzw, r8.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n    break \n    case l(3)\n    case l(12)\n    ushr r7.yzw, r7.xxxx, l(0, 10, 20, 30)\n    and r8.xyz, r7.xyzx, l(1023, 1023, 1023, 0)\n    and r9.xyz, r7.xyzx, l(127, 127, 127, 0)\n    ubfe r10.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r7.xyzx\n    firstbit_hi r11.xyz, r9.xyzx\n    iadd r11.xyz, r11.xyzx, l(-24, -24, -24, 0)\n    movc r11.xyz, r9.xyzx, r11.xyzx, l(8,8,8,0)\n    iadd r12.xyz, -r11.xyzx, l(1, 1, 1, 0)\n    movc r12.xyz, r10.xyzx, r10.xyzx, r12.xyzx\n    bfi r11.xyz, l(7, 7, 7, 0), r11.xyzx, r7.xyzx, l(0, 0, 0, 0)\n    and r11.xyz, r11.xyzx, l(127, 127, 127, 0)\n    movc r9.xyz, r10.xyzx, r9.xyzx, r11.xyzx\n    ishl r10.xyz, r12.xyzx, l(23, 23, 23, 0)\n    iadd r10.xyz, r10.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n    ishl r9.xyz, r9.xyzx, l(16, 16, 16, 0)\n    iadd r9.xyz, r10.xyzx, r9.xyzx\n    movc r7.xyz, r8.xyzx, r9.xyzx, l(0,0,0,0)\n    utof r2.z, r7.w\n    mul r7.w, r2.z, l(0.333333)\n    ushr r6.yzw, r6.xxxx, l(0, 10, 20, 30)\n    and r8.xyz, r6.xyzx, l(1023, 1023, 1023, 0)\n    and r9.xyz, r6.xyzx, l(127, 127, 127, 0)\n    ubfe r10.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r6.xyzx\n    firstbit_hi r11.xyz, r9.xyzx\n    iadd r11.xyz, r11.xyzx, l(-24, -24, -24, 0)\n    movc r11.xyz, r9.xyzx, r11.xyzx, l(8,8,8,0)\n    iadd r12.xyz, -r11.xyzx, l(1, 1, 1, 0)\n    movc r12.xyz, r10.xyzx, r10.xyzx, r12.xyzx\n    bfi r11.xyz, l(7, 7, 7, 0), r11.xyzx, r6.xyzx, l(0, 0, 0, 0)\n    and r11.xyz, r11.xyzx, l(127, 127, 127, 0)\n    movc r9.xyz, r10.xyzx, r9.xyzx, r11.xyzx\n    ishl r10.xyz, r12.xyzx, l(23, 23, 23, 0)\n    iadd r10.xyz, r10.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n    ishl r9.xyz, r9.xyzx, l(16, 16, 16, 0)\n    iadd r9.xyz, r10.xyzx, r9.xyzx\n    movc r6.xyz, r8.xyzx, r9.xyzx, l(0,0,0,0)\n    utof r2.z, r6.w\n    mul r6.w, r2.z, l(0.333333)\n    break \n    case l(4)\n    ishl r7.y, r7.x, l(16)\n    ishr r2.zw, r7.yyyx, l(0, 0, 16, 16)\n    itof r2.zw, r2.zzzw\n    mul r2.zw, r2.zzzw, l(0.000000, 0.000000, 0.000977, 0.000977)\n    max r7.xy, r2.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n    ishl r6.y, r6.x, l(16)\n    ishr r2.zw, r6.yyyx, l(0, 0, 16, 16)\n    itof r2.zw, r2.zzzw\n    mul r2.zw, r2.zzzw, l(0.000000, 0.000000, 0.000977, 0.000977)\n    max r6.xy, r2.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n    mov r7.zw, l(0,0,0,0)\n    mov r6.zw, l(0,0,0,0)\n    break \n    case l(6)\n    ushr r2.z, r7.x, l(16)\n    f16tof32 r7.x, r7.x\n    f16tof32 r7.y, r2.z\n    ushr r2.z, r6.x, l(16)\n    f16tof32 r6.x, r6.x\n    f16tof32 r6.y, r2.z\n    mov r7.zw, l(0,0,0,0)\n    mov r6.zw, l(0,0,0,0)\n    break \n    default \n    mov r7.yzw, l(0,0,0,0)\n    mov r6.yzw, l(0,0,0,0)\n    break \n  endswitch \nendif \nuge r2.z, r3.w, l(4)\nif_nz r2.z\n  mul r2.z, r0.z, l(0.500000)\n  imad r2.w, l(320), r2.x, r0.y\n  if_nz r5.w\n    ieq r4.z, r1.y, l(8)\n    if_nz r4.z\n      ld_raw r8.xyzw, r2.w, T0[0].zwxy\n      mov r9.xy, r8.zwzz\n    else \n      ld_raw r9.xy, r2.w, T0[0].xyxx\n      iadd r4.z, r1.y, r2.w\n      ld_raw r8.xy, r4.z, T0[0].xyxx\n    endif \n    switch r5.z\n      case l(5)\n      ishl r9.zw, r9.xxxy, l(0, 0, 16, 16)\n      ishr r10.xyzw, r9.zxwy, l(16, 16, 16, 16)\n      itof r10.xyzw, r10.xyzw\n      mul r10.xyzw, r10.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n      max r9.xyzw, r10.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n      ishl r8.zw, r8.xxxy, l(0, 0, 16, 16)\n      ishr r10.xyzw, r8.zxwy, l(16, 16, 16, 16)\n      itof r10.xyzw, r10.xyzw\n      mul r10.xyzw, r10.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n      max r8.xyzw, r10.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n      break \n      case l(7)\n      ushr r4.zw, r9.xxxy, l(0, 0, 16, 16)\n      f16tof32 r9.xz, r9.xxyx\n      f16tof32 r9.yw, r4.zzzw\n      ushr r4.zw, r8.xxxy, l(0, 0, 16, 16)\n      f16tof32 r8.xz, r8.xxyx\n      f16tof32 r8.yw, r4.zzzw\n      break \n      default \n      mov r9.zw, l(0,0,0,0)\n      mov r8.zw, l(0,0,0,0)\n      break \n    endswitch \n  else \n    ieq r4.z, r1.y, l(4)\n    if_nz r4.z\n      ld_raw r8.xy, r2.w, T0[0].yxxx\n      mov r9.x, r8.y\n    else \n      ld_raw r9.x, r2.w, T0[0].xxxx\n      iadd r4.z, r1.y, r2.w\n      ld_raw r8.x, r4.z, T0[0].xxxx\n    endif \n    switch r5.z\n      case l(0)\n      case l(1)\n      ushr r9.yzw, r9.xxxx, l(0, 8, 16, 24)\n      and r10.xyzw, r9.xyzw, l(255, 255, 255, 255)\n      utof r10.xyzw, r10.xyzw\n      mul r9.xyzw, r10.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n      ushr r8.yzw, r8.xxxx, l(0, 8, 16, 24)\n      and r10.xyzw, r8.xyzw, l(255, 255, 255, 255)\n      utof r10.xyzw, r10.xyzw\n      mul r8.xyzw, r10.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n      break \n      case l(2)\n      case l(10)\n      ushr r9.yzw, r9.xxxx, l(0, 10, 20, 30)\n      and r10.xyzw, r9.xyzw, l(1023, 1023, 1023, 3)\n      utof r10.xyzw, r10.xyzw\n      mul r9.xyzw, r10.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n      ushr r8.yzw, r8.xxxx, l(0, 10, 20, 30)\n      and r10.xyzw, r8.xyzw, l(1023, 1023, 1023, 3)\n      utof r10.xyzw, r10.xyzw\n      mul r8.xyzw, r10.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n      break \n      case l(3)\n      case l(12)\n      ushr r9.yzw, r9.xxxx, l(0, 10, 20, 30)\n      and r10.xyz, r9.xyzx, l(1023, 1023, 1023, 0)\n      and r11.xyz, r9.xyzx, l(127, 127, 127, 0)\n      ubfe r12.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r9.xyzx\n      firstbit_hi r13.xyz, r11.xyzx\n      iadd r13.xyz, r13.xyzx, l(-24, -24, -24, 0)\n      movc r13.xyz, r11.xyzx, r13.xyzx, l(8,8,8,0)\n      iadd r14.xyz, -r13.xyzx, l(1, 1, 1, 0)\n      movc r14.xyz, r12.xyzx, r12.xyzx, r14.xyzx\n      bfi r13.xyz, l(7, 7, 7, 0), r13.xyzx, r9.xyzx, l(0, 0, 0, 0)\n      and r13.xyz, r13.xyzx, l(127, 127, 127, 0)\n      movc r11.xyz, r12.xyzx, r11.xyzx, r13.xyzx\n      ishl r12.xyz, r14.xyzx, l(23, 23, 23, 0)\n      iadd r12.xyz, r12.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n      ishl r11.xyz, r11.xyzx, l(16, 16, 16, 0)\n      iadd r11.xyz, r12.xyzx, r11.xyzx\n      movc r9.xyz, r10.xyzx, r11.xyzx, l(0,0,0,0)\n      utof r4.z, r9.w\n      mul r9.w, r4.z, l(0.333333)\n      ushr r8.yzw, r8.xxxx, l(0, 10, 20, 30)\n      and r10.xyz, r8.xyzx, l(1023, 1023, 1023, 0)\n      and r11.xyz, r8.xyzx, l(127, 127, 127, 0)\n      ubfe r12.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r8.xyzx\n      firstbit_hi r13.xyz, r11.xyzx\n      iadd r13.xyz, r13.xyzx, l(-24, -24, -24, 0)\n      movc r13.xyz, r11.xyzx, r13.xyzx, l(8,8,8,0)\n      iadd r14.xyz, -r13.xyzx, l(1, 1, 1, 0)\n      movc r14.xyz, r12.xyzx, r12.xyzx, r14.xyzx\n      bfi r13.xyz, l(7, 7, 7, 0), r13.xyzx, r8.xyzx, l(0, 0, 0, 0)\n      and r13.xyz, r13.xyzx, l(127, 127, 127, 0)\n      movc r11.xyz, r12.xyzx, r11.xyzx, r13.xyzx\n      ishl r12.xyz, r14.xyzx, l(23, 23, 23, 0)\n      iadd r12.xyz, r12.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n      ishl r11.xyz, r11.xyzx, l(16, 16, 16, 0)\n      iadd r11.xyz, r12.xyzx, r11.xyzx\n      movc r8.xyz, r10.xyzx, r11.xyzx, l(0,0,0,0)\n      utof r4.z, r8.w\n      mul r8.w, r4.z, l(0.333333)\n      break \n      case l(4)\n      ishl r9.y, r9.x, l(16)\n      ishr r4.zw, r9.yyyx, l(0, 0, 16, 16)\n      itof r4.zw, r4.zzzw\n      mul r4.zw, r4.zzzw, l(0.000000, 0.000000, 0.000977, 0.000977)\n      max r9.xy, r4.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n      ishl r8.y, r8.x, l(16)\n      ishr r4.zw, r8.yyyx, l(0, 0, 16, 16)\n      itof r4.zw, r4.zzzw\n      mul r4.zw, r4.zzzw, l(0.000000, 0.000000, 0.000977, 0.000977)\n      max r8.xy, r4.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n      mov r9.zw, l(0,0,0,0)\n      mov r8.zw, l(0,0,0,0)\n      break \n      case l(6)\n      ushr r4.z, r9.x, l(16)\n      f16tof32 r9.x, r9.x\n      f16tof32 r9.y, r4.z\n      ushr r4.z, r8.x, l(16)\n      f16tof32 r8.x, r8.x\n      f16tof32 r8.y, r4.z\n      mov r9.zw, l(0,0,0,0)\n      mov r8.zw, l(0,0,0,0)\n      break \n      default \n      mov r9.yzw, l(0,0,0,0)\n      mov r8.yzw, l(0,0,0,0)\n      break \n    endswitch \n  endif \n  add r7.xyzw, r7.xyzw, r9.xyzw\n  add r6.xyzw, r6.xyzw, r8.xyzw\n  uge r3.w, r3.w, l(6)\n  if_nz r3.w\n    ishl r3.w, l(4), r5.w\n    mul r0.z, r0.z, l(0.250000)\n    iadd r0.y, r0.y, r3.w\n    if_nz r5.w\n      ieq r4.z, r1.y, l(8)\n      if_nz r4.z\n        ld_raw r8.xyzw, r0.y, T0[0].zwxy\n        mov r9.xy, r8.zwzz\n      else \n        ld_raw r9.xy, r0.y, T0[0].xyxx\n        iadd r4.z, r1.y, r0.y\n        ld_raw r8.xy, r4.z, T0[0].xyxx\n      endif \n      switch r5.z\n        case l(5)\n        ishl r9.zw, r9.xxxy, l(0, 0, 16, 16)\n        ishr r10.xyzw, r9.zxwy, l(16, 16, 16, 16)\n        itof r10.xyzw, r10.xyzw\n        mul r10.xyzw, r10.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r9.xyzw, r10.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        ishl r8.zw, r8.xxxy, l(0, 0, 16, 16)\n        ishr r10.xyzw, r8.zxwy, l(16, 16, 16, 16)\n        itof r10.xyzw, r10.xyzw\n        mul r10.xyzw, r10.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r8.xyzw, r10.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        break \n        case l(7)\n        ushr r4.zw, r9.xxxy, l(0, 0, 16, 16)\n        f16tof32 r9.xz, r9.xxyx\n        f16tof32 r9.yw, r4.zzzw\n        ushr r4.zw, r8.xxxy, l(0, 0, 16, 16)\n        f16tof32 r8.xz, r8.xxyx\n        f16tof32 r8.yw, r4.zzzw\n        break \n        default \n        mov r9.zw, l(0,0,0,0)\n        mov r8.zw, l(0,0,0,0)\n        break \n      endswitch \n    else \n      ieq r4.z, r1.y, l(4)\n      if_nz r4.z\n        ld_raw r8.xy, r0.y, T0[0].yxxx\n        mov r9.x, r8.y\n      else \n        ld_raw r9.x, r0.y, T0[0].xxxx\n        iadd r0.y, r1.y, r0.y\n        ld_raw r8.x, r0.y, T0[0].xxxx\n      endif \n      switch r5.z\n        case l(0)\n        case l(1)\n        ushr r9.yzw, r9.xxxx, l(0, 8, 16, 24)\n        and r10.xyzw, r9.xyzw, l(255, 255, 255, 255)\n        utof r10.xyzw, r10.xyzw\n        mul r9.xyzw, r10.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        ushr r8.yzw, r8.xxxx, l(0, 8, 16, 24)\n        and r10.xyzw, r8.xyzw, l(255, 255, 255, 255)\n        utof r10.xyzw, r10.xyzw\n        mul r8.xyzw, r10.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        break \n        case l(2)\n        case l(10)\n        ushr r9.yzw, r9.xxxx, l(0, 10, 20, 30)\n        and r10.xyzw, r9.xyzw, l(1023, 1023, 1023, 3)\n        utof r10.xyzw, r10.xyzw\n        mul r9.xyzw, r10.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        ushr r8.yzw, r8.xxxx, l(0, 10, 20, 30)\n        and r10.xyzw, r8.xyzw, l(1023, 1023, 1023, 3)\n        utof r10.xyzw, r10.xyzw\n        mul r8.xyzw, r10.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        break \n        case l(3)\n        case l(12)\n        ushr r9.yzw, r9.xxxx, l(0, 10, 20, 30)\n        and r10.xyz, r9.xyzx, l(1023, 1023, 1023, 0)\n        and r11.xyz, r9.xyzx, l(127, 127, 127, 0)\n        ubfe r12.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r9.xyzx\n        firstbit_hi r13.xyz, r11.xyzx\n        iadd r13.xyz, r13.xyzx, l(-24, -24, -24, 0)\n        movc r13.xyz, r11.xyzx, r13.xyzx, l(8,8,8,0)\n        iadd r14.xyz, -r13.xyzx, l(1, 1, 1, 0)\n        movc r14.xyz, r12.xyzx, r12.xyzx, r14.xyzx\n        bfi r13.xyz, l(7, 7, 7, 0), r13.xyzx, r9.xyzx, l(0, 0, 0, 0)\n        and r13.xyz, r13.xyzx, l(127, 127, 127, 0)\n        movc r11.xyz, r12.xyzx, r11.xyzx, r13.xyzx\n        ishl r12.xyz, r14.xyzx, l(23, 23, 23, 0)\n        iadd r12.xyz, r12.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r11.xyz, r11.xyzx, l(16, 16, 16, 0)\n        iadd r11.xyz, r12.xyzx, r11.xyzx\n        movc r9.xyz, r10.xyzx, r11.xyzx, l(0,0,0,0)\n        utof r0.y, r9.w\n        mul r9.w, r0.y, l(0.333333)\n        ushr r8.yzw, r8.xxxx, l(0, 10, 20, 30)\n        and r10.xyz, r8.xyzx, l(1023, 1023, 1023, 0)\n        and r11.xyz, r8.xyzx, l(127, 127, 127, 0)\n        ubfe r12.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r8.xyzx\n        firstbit_hi r13.xyz, r11.xyzx\n        iadd r13.xyz, r13.xyzx, l(-24, -24, -24, 0)\n        movc r13.xyz, r11.xyzx, r13.xyzx, l(8,8,8,0)\n        iadd r14.xyz, -r13.xyzx, l(1, 1, 1, 0)\n        movc r14.xyz, r12.xyzx, r12.xyzx, r14.xyzx\n        bfi r13.xyz, l(7, 7, 7, 0), r13.xyzx, r8.xyzx, l(0, 0, 0, 0)\n        and r13.xyz, r13.xyzx, l(127, 127, 127, 0)\n        movc r11.xyz, r12.xyzx, r11.xyzx, r13.xyzx\n        ishl r12.xyz, r14.xyzx, l(23, 23, 23, 0)\n        iadd r12.xyz, r12.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r11.xyz, r11.xyzx, l(16, 16, 16, 0)\n        iadd r11.xyz, r12.xyzx, r11.xyzx\n        movc r8.xyz, r10.xyzx, r11.xyzx, l(0,0,0,0)\n        utof r0.y, r8.w\n        mul r8.w, r0.y, l(0.333333)\n        break \n        case l(4)\n        ishl r9.y, r9.x, l(16)\n        ishr r4.zw, r9.yyyx, l(0, 0, 16, 16)\n        itof r4.zw, r4.zzzw\n        mul r4.zw, r4.zzzw, l(0.000000, 0.000000, 0.000977, 0.000977)\n        max r9.xy, r4.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        ishl r8.y, r8.x, l(16)\n        ishr r4.zw, r8.yyyx, l(0, 0, 16, 16)\n        itof r4.zw, r4.zzzw\n        mul r4.zw, r4.zzzw, l(0.000000, 0.000000, 0.000977, 0.000977)\n        max r8.xy, r4.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        mov r9.zw, l(0,0,0,0)\n        mov r8.zw, l(0,0,0,0)\n        break \n        case l(6)\n        ushr r0.y, r9.x, l(16)\n        f16tof32 r9.x, r9.x\n        f16tof32 r9.y, r0.y\n        ushr r0.y, r8.x, l(16)\n        f16tof32 r8.x, r8.x\n        f16tof32 r8.y, r0.y\n        mov r9.zw, l(0,0,0,0)\n        mov r8.zw, l(0,0,0,0)\n        break \n        default \n        mov r9.yzw, l(0,0,0,0)\n        mov r8.yzw, l(0,0,0,0)\n        break \n      endswitch \n    endif \n    add r9.xyzw, r7.xyzw, r9.xyzw\n    add r8.xyzw, r6.xyzw, r8.xyzw\n    iadd r0.y, r2.w, r3.w\n    if_nz r5.w\n      ieq r2.w, r1.y, l(8)\n      if_nz r2.w\n        ld_raw r10.xyzw, r0.y, T0[0].zwxy\n        mov r11.xy, r10.zwzz\n      else \n        ld_raw r11.xy, r0.y, T0[0].xyxx\n        iadd r2.w, r1.y, r0.y\n        ld_raw r10.xy, r2.w, T0[0].xyxx\n      endif \n      switch r5.z\n        case l(5)\n        ishl r11.zw, r11.xxxy, l(0, 0, 16, 16)\n        ishr r12.xyzw, r11.zxwy, l(16, 16, 16, 16)\n        itof r12.xyzw, r12.xyzw\n        mul r12.xyzw, r12.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r11.xyzw, r12.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        ishl r10.zw, r10.xxxy, l(0, 0, 16, 16)\n        ishr r12.xyzw, r10.zxwy, l(16, 16, 16, 16)\n        itof r12.xyzw, r12.xyzw\n        mul r12.xyzw, r12.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r10.xyzw, r12.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        break \n        case l(7)\n        ushr r4.zw, r11.xxxy, l(0, 0, 16, 16)\n        f16tof32 r11.xz, r11.xxyx\n        f16tof32 r11.yw, r4.zzzw\n        ushr r4.zw, r10.xxxy, l(0, 0, 16, 16)\n        f16tof32 r10.xz, r10.xxyx\n        f16tof32 r10.yw, r4.zzzw\n        break \n        default \n        mov r11.zw, l(0,0,0,0)\n        mov r10.zw, l(0,0,0,0)\n        break \n      endswitch \n    else \n      ieq r2.w, r1.y, l(4)\n      if_nz r2.w\n        ld_raw r10.xy, r0.y, T0[0].yxxx\n        mov r11.x, r10.y\n      else \n        ld_raw r11.x, r0.y, T0[0].xxxx\n        iadd r0.y, r1.y, r0.y\n        ld_raw r10.x, r0.y, T0[0].xxxx\n      endif \n      switch r5.z\n        case l(0)\n        case l(1)\n        ushr r11.yzw, r11.xxxx, l(0, 8, 16, 24)\n        and r5.xyzw, r11.xyzw, l(255, 255, 255, 255)\n        utof r5.xyzw, r5.xyzw\n        mul r11.xyzw, r5.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        ushr r10.yzw, r10.xxxx, l(0, 8, 16, 24)\n        and r5.xyzw, r10.xyzw, l(255, 255, 255, 255)\n        utof r5.xyzw, r5.xyzw\n        mul r10.xyzw, r5.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        break \n        case l(2)\n        case l(10)\n        ushr r11.yzw, r11.xxxx, l(0, 10, 20, 30)\n        and r5.xyzw, r11.xyzw, l(1023, 1023, 1023, 3)\n        utof r5.xyzw, r5.xyzw\n        mul r11.xyzw, r5.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        ushr r10.yzw, r10.xxxx, l(0, 10, 20, 30)\n        and r5.xyzw, r10.xyzw, l(1023, 1023, 1023, 3)\n        utof r5.xyzw, r5.xyzw\n        mul r10.xyzw, r5.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        break \n        case l(3)\n        case l(12)\n        ushr r11.yzw, r11.xxxx, l(0, 10, 20, 30)\n        and r5.xyz, r11.xyzx, l(1023, 1023, 1023, 0)\n        and r12.xyz, r11.xyzx, l(127, 127, 127, 0)\n        ubfe r13.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r11.xyzx\n        firstbit_hi r14.xyz, r12.xyzx\n        iadd r14.xyz, r14.xyzx, l(-24, -24, -24, 0)\n        movc r14.xyz, r12.xyzx, r14.xyzx, l(8,8,8,0)\n        iadd r15.xyz, -r14.xyzx, l(1, 1, 1, 0)\n        movc r15.xyz, r13.xyzx, r13.xyzx, r15.xyzx\n        bfi r14.xyz, l(7, 7, 7, 0), r14.xyzx, r11.xyzx, l(0, 0, 0, 0)\n        and r14.xyz, r14.xyzx, l(127, 127, 127, 0)\n        movc r12.xyz, r13.xyzx, r12.xyzx, r14.xyzx\n        ishl r13.xyz, r15.xyzx, l(23, 23, 23, 0)\n        iadd r13.xyz, r13.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r12.xyz, r12.xyzx, l(16, 16, 16, 0)\n        iadd r12.xyz, r13.xyzx, r12.xyzx\n        movc r11.xyz, r5.xyzx, r12.xyzx, l(0,0,0,0)\n        utof r0.y, r11.w\n        mul r11.w, r0.y, l(0.333333)\n        ushr r10.yzw, r10.xxxx, l(0, 10, 20, 30)\n        and r5.xyz, r10.xyzx, l(1023, 1023, 1023, 0)\n        and r12.xyz, r10.xyzx, l(127, 127, 127, 0)\n        ubfe r13.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r10.xyzx\n        firstbit_hi r14.xyz, r12.xyzx\n        iadd r14.xyz, r14.xyzx, l(-24, -24, -24, 0)\n        movc r14.xyz, r12.xyzx, r14.xyzx, l(8,8,8,0)\n        iadd r15.xyz, -r14.xyzx, l(1, 1, 1, 0)\n        movc r15.xyz, r13.xyzx, r13.xyzx, r15.xyzx\n        bfi r14.xyz, l(7, 7, 7, 0), r14.xyzx, r10.xyzx, l(0, 0, 0, 0)\n        and r14.xyz, r14.xyzx, l(127, 127, 127, 0)\n        movc r12.xyz, r13.xyzx, r12.xyzx, r14.xyzx\n        ishl r13.xyz, r15.xyzx, l(23, 23, 23, 0)\n        iadd r13.xyz, r13.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r12.xyz, r12.xyzx, l(16, 16, 16, 0)\n        iadd r12.xyz, r13.xyzx, r12.xyzx\n        movc r10.xyz, r5.xyzx, r12.xyzx, l(0,0,0,0)\n        utof r0.y, r10.w\n        mul r10.w, r0.y, l(0.333333)\n        break \n        case l(4)\n        ishl r11.y, r11.x, l(16)\n        ishr r4.zw, r11.yyyx, l(0, 0, 16, 16)\n        itof r4.zw, r4.zzzw\n        mul r4.zw, r4.zzzw, l(0.000000, 0.000000, 0.000977, 0.000977)\n        max r11.xy, r4.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        ishl r10.y, r10.x, l(16)\n        ishr r4.zw, r10.yyyx, l(0, 0, 16, 16)\n        itof r4.zw, r4.zzzw\n        mul r4.zw, r4.zzzw, l(0.000000, 0.000000, 0.000977, 0.000977)\n        max r10.xy, r4.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        mov r11.zw, l(0,0,0,0)\n        mov r10.zw, l(0,0,0,0)\n        break \n        case l(6)\n        ushr r0.y, r11.x, l(16)\n        f16tof32 r11.x, r11.x\n        f16tof32 r11.y, r0.y\n        ushr r0.y, r10.x, l(16)\n        f16tof32 r10.x, r10.x\n        f16tof32 r10.y, r0.y\n        mov r11.zw, l(0,0,0,0)\n        mov r10.zw, l(0,0,0,0)\n        break \n        default \n        mov r11.yzw, l(0,0,0,0)\n        mov r10.yzw, l(0,0,0,0)\n        break \n      endswitch \n    endif \n    add r7.xyzw, r9.xyzw, r11.xyzw\n    add r6.xyzw, r8.xyzw, r10.xyzw\n  else \n    mov r0.z, r2.z\n  endif \nendif \nmul r5.xyzw, r0.zzzz, r7.xyzw\nmul r6.xyzw, r0.zzzz, r6.xyzw\nif_nz r1.z\n  mov r7.xy, r5.zxzz\n  mov r6.xz, r6.zzxz\nelse \n  mov r7.xy, r5.xzxx\nendif \nult r0.y, r4.x, r1.x\nif_nz r0.y\n  mov r7.zw, r5.yyyw\n  mov r6.xyzw, r7.xzyw\nendif \nmov r4.y, vThreadID.y\nimad r0.yz, r3.xxzx, r2.xxyx, r4.xxyx\nushr r1.xy, r0.yzyy, l(1, 1, 0, 0)\nudiv r2.zw, null, r1.xxxy, r2.xxxy\nimad r1.xy, -r2.xyxx, r2.zwzz, r1.xyxx\nishl r0.y, r2.z, l(1)\nimad r1.x, r1.x, r2.y, r1.y\nbfi r0.z, l(1), l(5), r0.z, l(0)\nbfi r0.z, l(26), l(6), r1.x, r0.z\nif_nz r0.w\n  ubfe r0.w, l(3), l(4), CB0[0][0].z\n  bfi r1.x, l(10), l(1), r3.y, l(0)\n  ishr r1.y, r0.w, l(2)\n  ibfe r3.xyzw, l(28, 27, 31, 29), l(3, 4, 0, 2), r2.wzww\n  imad r1.x, r1.y, r1.x, r3.x\n  imad r1.x, r1.x, r1.w, r3.y\n  bfi r0.w, l(2), l(5), r0.w, l(0)\n  bfi r1.z, l(2), l(3), r3.z, l(0)\n  iadd r0.w, r0.w, r1.z\n  bfi r0.w, l(3), l(0), r0.y, r0.w\n  bfi r0.w, l(25), l(7), r1.x, r0.w\n  xor r1.x, r1.y, r3.w\n  ibfe r1.y, l(29), l(2), r2.z\n  and r1.y, r1.y, l(3)\n  bfi r1.xz, l(1, 0, 1, 0), l(1, 0, 11, 0), r1.xxxx, l(0, 0, 0, 0)\n  xor r1.x, r1.x, r1.y\n  ishl r1.x, r1.x, l(6)\n  iadd r1.x, r1.z, r1.x\n  ibfe r1.yz, l(0, 27, 24, 0), l(0, 1, 4, 0), r0.wwww\n  bfi r0.w, l(3), l(8), r1.y, r1.x\n  bfi r0.w, l(20), l(12), r1.z, r0.w\nelse \n  ibfe r3.xyzw, l(27, 27, 31, 28), l(4, 4, 0, 3), r2.wzww\n  imad r1.x, r3.x, r1.w, r3.y\n  bfi r1.yz, l(0, 3, 1, 0), l(0, 3, 11, 0), r3.zzwz, l(0, 0, 0, 0)\n  bfi r0.y, l(3), l(0), r0.y, r1.y\n  bfi r0.y, l(26), l(6), r1.x, r0.y\n  ibfe r1.xy, l(29, 29, 0, 0), l(2, 2, 0, 0), r2.zwzz\n  and r1.x, r1.x, l(3)\n  bfi r1.y, l(1), l(1), r1.y, l(0)\n  xor r1.x, r1.y, r1.x\n  ishl r1.x, r1.x, l(6)\n  iadd r1.x, r1.z, r1.x\n  ibfe r1.yz, l(0, 27, 24, 0), l(0, 1, 4, 0), r0.yyyy\n  bfi r0.y, l(3), l(8), r1.y, r1.x\n  bfi r0.w, l(20), l(12), r1.z, r0.y\nendif \nimul null, r0.y, r2.y, r2.x\nimad r0.y, r0.w, r0.y, r0.z\nieq r0.z, r0.x, l(5)\nif_nz r0.z\n  mov r5.xz, r5.wwyw\n  mov r5.yw, r7.yyyx\n  mov r0.w, l(2)\nelse \n  mov r5.xz, r7.xxyx\n  mov r0.w, r0.x\nendif \nieq r1.x, r0.w, l(4)\nif_nz r1.x\n  mov r5.xyzw, r5.yxwz\n  mov r0.w, l(2)\nendif \nieq r1.xyz, r0.wwww, l(1, 2, 3, 0)\nor r1.xy, r1.yzyy, r1.xyxx\nif_nz r1.x\n  ishl r2.xyzw, r5.xyzw, l(8, 8, 8, 8)\n  and r2.xyzw, r2.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r3.xyzw, r5.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r5.xyzw, r2.xyzw, r3.xyzw\nendif \nif_nz r1.y\n  ushr r1.xyzw, r5.xyzw, l(16, 16, 16, 16)\n  bfi r5.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r5.xyzw, r1.xyzw\nendif \nstore_raw U0[0].xyzw, r0.y, r5.xyzw\niadd r0.w, r0.y, l(16)\nif_nz r0.z\n  mov r6.xyzw, r6.wzyx\n  mov r0.x, l(2)\nendif \nieq r0.z, r0.x, l(4)\nif_nz r0.z\n  mov r6.xyzw, r6.yxwz\n  mov r0.x, l(2)\nendif \nieq r1.xyz, r0.xxxx, l(1, 2, 3, 0)\nor r0.xz, r1.yyzy, r1.xxyx\nif_nz r0.x\n  ishl r1.xyzw, r6.xyzw, l(8, 8, 8, 8)\n  and r1.xyzw, r1.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r2.xyzw, r6.xyzw, l(8, 8, 8, 8)\n  and r2.xyzw, r2.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r6.xyzw, r1.xyzw, r2.xyzw\nendif \nif_nz r0.z\n  ushr r1.xyzw, r6.xyzw, l(16, 16, 16, 16)\n  bfi r6.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r6.xyzw, r1.xyzw\nendif \nstore_raw U0[0].xyzw, r0.w, r6.xyzw\nret \n// Approximately 755 instruction slots used\n#endif\n\nconst BYTE resolve_full_128bpp_scaled_cs[] =\n{\n     68,  88,  66,  67,  19, 203, \n     20, 130, 196,  43, 217,  79, \n     42,  98,   1, 198,  40,  79, \n    105, 104,   1,   0,   0,   0, \n     20,  87,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n    144,   2,   0,   0, 160,   2, \n      0,   0, 176,   2,   0,   0, \n    120,  86,   0,   0,  82,  68, \n     69,  70,  84,   2,   0,   0, \n      1,   0,   0,   0, 228,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n     44,   2,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 197,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 213,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 114, 101, 115, \n    111, 108, 118, 101,  95, 101, \n    100, 114,  97, 109,   0, 120, \n    101,  95, 114, 101, 115, 111, \n    108, 118, 101,  95, 100, 101, \n    115, 116,   0, 112, 117, 115, \n    104,  95,  99, 111, 110, 115, \n    116, 115,  95, 120, 101,   0, \n    213,   0,   0,   0,   4,   0, \n      0,   0, 252,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    156,   1,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 184,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 220,   1, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 184,   1,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 247,   1,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    184,   1,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     12,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 184,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 120, 101, \n     95, 114, 101, 115, 111, 108, \n    118, 101,  95, 101, 100, 114, \n     97, 109,  95, 105, 110, 102, \n    111,   0, 100, 119, 111, 114, \n    100,   0,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 178,   1, \n      0,   0, 120, 101,  95, 114, \n    101, 115, 111, 108, 118, 101, \n     95,  99, 111, 111, 114, 100, \n    105, 110,  97, 116, 101,  95, \n    105, 110, 102, 111,   0, 120, \n    101,  95, 114, 101, 115, 111, \n    108, 118, 101,  95, 100, 101, \n    115, 116,  95, 105, 110, 102, \n    111,   0, 120, 101,  95, 114, \n    101, 115, 111, 108, 118, 101, \n     95, 100, 101, 115, 116,  95, \n     99, 111, 111, 114, 100, 105, \n    110,  97, 116, 101,  95, 105, \n    110, 102, 111,   0,  77, 105, \n     99, 114, 111, 115, 111, 102, \n    116,  32,  40,  82,  41,  32, \n     72,  76,  83,  76,  32,  83, \n    104,  97, 100, 101, 114,  32, \n     67, 111, 109, 112, 105, 108, \n    101, 114,  32,  49,  48,  46, \n     49,   0,  73,  83,  71,  78, \n      8,   0,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     79,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  83,  72, \n     69,  88, 192,  83,   0,   0, \n     81,   0,   5,   0, 240,  20, \n      0,   0, 106,   8,   0,   1, \n     89,   0,   0,   7,  70, 142, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0, 161,   0, \n      0,   6,  70, 126,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 157,   0, \n      0,   6,  70, 238,  49,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  95,   0, \n      0,   2,  50,   0,   2,   0, \n    104,   0,   0,   2,  16,   0, \n      0,   0, 155,   0,   0,   4, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,  12, 242,   0, \n     16,   0,   0,   0,   0,   0, \n     38, 136,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n    255,   3,   0,   0,   0,   0, \n      0,  32,   8,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n    138,   0,   0,  17,  50,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n     17,   0,   0,   0,  20,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86, 133, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  18,   0,   0,   1, \n     54,   0,   0,   8,  50,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n    138,   0,   0,  17, 114,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  19,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,  86, 133, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,   1,   0, \n      0,  12, 194,   0,  16,   0, \n      1,   0,   0,   0, 166, 142, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   1, \n    255,   3,   0,   0,  85,   0, \n      0,  12, 242,   0,  16,   0, \n      3,   0,   0,   0, 214, 143, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     24,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      4,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  41,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  80,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      4,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  17, \n    242,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,  11,   0, \n      0,   0,   4,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     13,   0,   0,   0,  24,   0, \n      0,   0,  28,   0,   0,   0, \n      6, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   7,  18,   0,  16,   0, \n      6,   0,   0,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     34,   0,  16,   0,   6,   0, \n      0,   0,  10,   0,  16,   0, \n      3,   0,   0,   0, 140,   0, \n      0,  20, 194,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   4,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   6,   4,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    139,   0,   0,  11,  66,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  23,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0, 128,  63, 140,   0, \n      0,  20,  82,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 166,  11,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    138,   0,   0,  11, 130,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n     28,   0,   0,   0,  58, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  83,   0,   0,   7, \n     18,   0,  16,   0,   6,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     83,   0,   0,   6,  34,   0, \n     16,   0,   6,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,   2,   0, \n     35,   0,   0,   9, 194,   0, \n     16,   0,   2,   0,   0,   0, \n    166,  14,  16,   0,   2,   0, \n      0,   0,   6,   4,  16,   0, \n      2,   0,   0,   0,   6,   4, \n     16,   0,   6,   0,   0,   0, \n     80,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      1,   0,   0,   0,  54,   0, \n      0,   5,  34,   0,  16,   0, \n      6,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n     18,   0,   0,   1,  32,   0, \n      0,   7,  34,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  31,   0,   4,   3, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  54,   0,   0,   5, \n     34,   0,  16,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  18,   0, \n      0,   1,  54,   0,   0,   5, \n     34,   0,  16,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  21,   0,   0,   1, \n     80,   0,   0,  10, 194,   0, \n     16,   0,   4,   0,   0,   0, \n      6,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  10, 194,   0,  16,   0, \n      4,   0,   0,   0, 166,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  41,   0,   0,   7, \n    194,   0,  16,   0,   2,   0, \n      0,   0, 166,  14,  16,   0, \n      2,   0,   0,   0, 166,  14, \n     16,   0,   4,   0,   0,   0, \n     85,   0,   0,   7,  18,   0, \n     16,   0,   6,   0,   0,   0, \n     26,   0,  16,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  10,  50,   0,  16,   0, \n      6,   0,   0,   0,  70,   0, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    194,   0,  16,   0,   2,   0, \n      0,   0, 166,  14,  16,   0, \n      2,   0,   0,   0,   6,   4, \n     16,   0,   6,   0,   0,   0, \n     38,   0,   0,  11,   0, 208, \n      0,   0,  98,   0,  16,   0, \n      6,   0,   0,   0,   6,   1, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  80,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,   7, \n     18,   0,  16,   0,   6,   0, \n      0,   0,  26,   0,  16,   0, \n      6,   0,   0,   0,  58,   0, \n     16,   0,   5,   0,   0,   0, \n     78,   0,   0,   8,  50,   0, \n     16,   0,   7,   0,   0,   0, \n      0, 208,   0,   0, 230,  10, \n     16,   0,   2,   0,   0,   0, \n    134,   0,  16,   0,   6,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      7,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   7,   0, \n      0,   0,  30,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   5,   0,   0,   0, \n     35,   0,   0,  10, 194,   0, \n     16,   0,   2,   0,   0,   0, \n      6,   4,  16, 128,  65,   0, \n      0,   0,   7,   0,   0,   0, \n      6,   8,  16,   0,   6,   0, \n      0,   0, 166,  14,  16,   0, \n      2,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   6,   0,   0,   0, \n     35,   0,   0,   9,  66,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      6,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     41,   0,   0,   7,  66,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      5,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   7,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  11,   0, \n      0,   0,  78,   0,   0,   8, \n      0, 208,   0,   0,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  41,   0, \n      0,   7,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,  30,   0,   0,   7, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      4,   0,   0,   0,  58,   0, \n     16,   0,   5,   0,   0,   0, \n     41,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  31,   0, \n      4,   3,  58,   0,  16,   0, \n      5,   0,   0,   0,  32,   0, \n      0,   7,  66,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   8,   0, \n      0,   0,  31,   0,   4,   3, \n     42,   0,  16,   0,   2,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0, 230, 116, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  50,   0,  16,   0, \n      7,   0,   0,   0, 230,  10, \n     16,   0,   6,   0,   0,   0, \n     18,   0,   0,   1, 165,   0, \n      0,   8,  50,   0,  16,   0, \n      7,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     70, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0, 165,   0, \n      0,   8,  50,   0,  16,   0, \n      6,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     70, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  76,   0, \n      0,   3,  42,   0,  16,   0, \n      5,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      5,   0,   0,   0,  41,   0, \n      0,  10, 194,   0,  16,   0, \n      7,   0,   0,   0,   6,   4, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  38,   7,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,  41,   0, \n      0,  10, 194,   0,  16,   0, \n      6,   0,   0,   0,   6,   4, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  38,   7,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  85,   0,   0,  10, \n    194,   0,  16,   0,   2,   0, \n      0,   0,   6,   4,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    131,   0,   0,   5,  82,   0, \n     16,   0,   7,   0,   0,   0, \n      6,   1,  16,   0,   7,   0, \n      0,   0, 131,   0,   0,   5, \n    162,   0,  16,   0,   7,   0, \n      0,   0, 166,  14,  16,   0, \n      2,   0,   0,   0,  85,   0, \n      0,  10, 194,   0,  16,   0, \n      2,   0,   0,   0,   6,   4, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 131,   0,   0,   5, \n     82,   0,  16,   0,   6,   0, \n      0,   0,   6,   1,  16,   0, \n      6,   0,   0,   0, 131,   0, \n      0,   5, 162,   0,  16,   0, \n      6,   0,   0,   0, 166,  14, \n     16,   0,   2,   0,   0,   0, \n      2,   0,   0,   1,  10,   0, \n      0,   1,  54,   0,   0,   8, \n    194,   0,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,  23,   0, \n      0,   1,  18,   0,   0,   1, \n     32,   0,   0,   7,  66,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      2,   0,   0,   0, 165,   0, \n      0,   8,  50,   0,  16,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     22, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   6,   0, \n      0,   0,  18,   0,   0,   1, \n    165,   0,   0,   8,  18,   0, \n     16,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     66,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n    165,   0,   0,   8,  18,   0, \n     16,   0,   6,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     76,   0,   0,   3,  42,   0, \n     16,   0,   5,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   0,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   7,   0,   0,   0, \n      6,   0,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  16,   0,   0,   0, \n     24,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59,  85,   0,   0,  10, \n    226,   0,  16,   0,   6,   0, \n      0,   0,   6,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,  10,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,   7,   0, \n      0,   0,   6,   0,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      3,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      8,  32, 128,  58,   8,  32, \n    128,  58,   8,  32, 128,  58, \n    171, 170, 170,  62,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      6,   0,   0,   0,   6,   0, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   3,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   8,  32, 128,  58, \n      8,  32, 128,  58,   8,  32, \n    128,  58, 171, 170, 170,  62, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n     12,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      7,   0,   0,   0,   6,   0, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,   8,   0, \n      0,   0,  70,   2,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,   9,   0,   0,   0, \n     70,   2,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 114,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n      7,   0,   0,   0, 135,   0, \n      0,   5, 114,   0,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,   9,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  11,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n    232, 255, 255, 255, 232, 255, \n    255, 255, 232, 255, 255, 255, \n      0,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,   9,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  11, 114,   0,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16, 128,  65,   0,   0,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  10,   0, \n      0,   0,  70,   2,  16,   0, \n     10,   0,   0,   0,  70,   2, \n     16,   0,  12,   0,   0,   0, \n    140,   0,   0,  17, 114,   0, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  11,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,   9,   0,   0,   0, \n     70,   2,  16,   0,  10,   0, \n      0,   0,  70,   2,  16,   0, \n      9,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  10,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     10,   0,   0,   0,  70,   2, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,   9,   0, \n      0,   0,  70,   2,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 114,   0, \n     16,   0,   9,   0,   0,   0, \n     70,   2,  16,   0,  10,   0, \n      0,   0,  70,   2,  16,   0, \n      9,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n      7,   0,   0,   0,  70,   2, \n     16,   0,   8,   0,   0,   0, \n     70,   2,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   0, \n      0,   5,  66,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   7,   0,   0,   0, \n     56,   0,   0,   7, 130,   0, \n     16,   0,   7,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n    171, 170, 170,  62,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      6,   0,   0,   0,   6,   0, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,   8,   0, \n      0,   0,  70,   2,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,   9,   0,   0,   0, \n     70,   2,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 114,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n      6,   0,   0,   0, 135,   0, \n      0,   5, 114,   0,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,   9,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  11,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n    232, 255, 255, 255, 232, 255, \n    255, 255, 232, 255, 255, 255, \n      0,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,   9,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  11, 114,   0,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16, 128,  65,   0,   0,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  10,   0, \n      0,   0,  70,   2,  16,   0, \n     10,   0,   0,   0,  70,   2, \n     16,   0,  12,   0,   0,   0, \n    140,   0,   0,  17, 114,   0, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  11,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,   9,   0,   0,   0, \n     70,   2,  16,   0,  10,   0, \n      0,   0,  70,   2,  16,   0, \n      9,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  10,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     10,   0,   0,   0,  70,   2, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,   9,   0, \n      0,   0,  70,   2,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 114,   0, \n     16,   0,   9,   0,   0,   0, \n     70,   2,  16,   0,  10,   0, \n      0,   0,  70,   2,  16,   0, \n      9,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n      6,   0,   0,   0,  70,   2, \n     16,   0,   8,   0,   0,   0, \n     70,   2,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   0, \n      0,   5,  66,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   6,   0,   0,   0, \n     56,   0,   0,   7, 130,   0, \n     16,   0,   6,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n    171, 170, 170,  62,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  41,   0,   0,   7, \n     34,   0,  16,   0,   7,   0, \n      0,   0,  10,   0,  16,   0, \n      7,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n     42,   0,   0,  10, 194,   0, \n     16,   0,   2,   0,   0,   0, \n     86,   1,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 194,   0,  16,   0, \n      2,   0,   0,   0, 166,  14, \n     16,   0,   2,   0,   0,   0, \n     56,   0,   0,  10, 194,   0, \n     16,   0,   2,   0,   0,   0, \n    166,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10,  50,   0,  16,   0, \n      7,   0,   0,   0, 230,  10, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,   7, \n     34,   0,  16,   0,   6,   0, \n      0,   0,  10,   0,  16,   0, \n      6,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n     42,   0,   0,  10, 194,   0, \n     16,   0,   2,   0,   0,   0, \n     86,   1,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 194,   0,  16,   0, \n      2,   0,   0,   0, 166,  14, \n     16,   0,   2,   0,   0,   0, \n     56,   0,   0,  10, 194,   0, \n     16,   0,   2,   0,   0,   0, \n    166,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10,  50,   0,  16,   0, \n      6,   0,   0,   0, 230,  10, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      6,   0,   0,   0,  85,   0, \n      0,   7,  66,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   7,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0, 131,   0,   0,   5, \n     18,   0,  16,   0,   7,   0, \n      0,   0,  10,   0,  16,   0, \n      7,   0,   0,   0, 131,   0, \n      0,   5,  34,   0,  16,   0, \n      7,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     85,   0,   0,   7,  66,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0, 131,   0, \n      0,   5,  18,   0,  16,   0, \n      6,   0,   0,   0,  10,   0, \n     16,   0,   6,   0,   0,   0, \n    131,   0,   0,   5,  34,   0, \n     16,   0,   6,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,  10,   0, \n      0,   1,  54,   0,   0,   8, \n    226,   0,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 226,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,  23,   0, \n      0,   1,  21,   0,   0,   1, \n     80,   0,   0,   7,  66,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      2,   0,   0,   0,  56,   0, \n      0,   7,  66,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  63,  35,   0,   0,   9, \n    130,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n     64,   1,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     58,   0,  16,   0,   5,   0, \n      0,   0,  32,   0,   0,   7, \n     66,   0,  16,   0,   4,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   4,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0, 230, 116,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     50,   0,  16,   0,   9,   0, \n      0,   0, 230,  10,  16,   0, \n      8,   0,   0,   0,  18,   0, \n      0,   1, 165,   0,   0,   8, \n     50,   0,  16,   0,   9,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,  70, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      4,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0, 165,   0,   0,   8, \n     50,   0,  16,   0,   8,   0, \n      0,   0,  42,   0,  16,   0, \n      4,   0,   0,   0,  70, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  76,   0,   0,   3, \n     42,   0,  16,   0,   5,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  41,   0,   0,  10, \n    194,   0,  16,   0,   9,   0, \n      0,   0,   6,   4,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     38,   7,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,  41,   0,   0,  10, \n    194,   0,  16,   0,   8,   0, \n      0,   0,   6,   4,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     38,   7,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     85,   0,   0,  10, 194,   0, \n     16,   0,   4,   0,   0,   0, \n      6,   4,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 131,   0, \n      0,   5,  82,   0,  16,   0, \n      9,   0,   0,   0,   6,   1, \n     16,   0,   9,   0,   0,   0, \n    131,   0,   0,   5, 162,   0, \n     16,   0,   9,   0,   0,   0, \n    166,  14,  16,   0,   4,   0, \n      0,   0,  85,   0,   0,  10, \n    194,   0,  16,   0,   4,   0, \n      0,   0,   6,   4,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    131,   0,   0,   5,  82,   0, \n     16,   0,   8,   0,   0,   0, \n      6,   1,  16,   0,   8,   0, \n      0,   0, 131,   0,   0,   5, \n    162,   0,  16,   0,   8,   0, \n      0,   0, 166,  14,  16,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   1,  10,   0,   0,   1, \n     54,   0,   0,   8, 194,   0, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   1,  23,   0,   0,   1, \n     18,   0,   0,   1,  32,   0, \n      0,   7,  66,   0,  16,   0, \n      4,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  31,   0,   4,   3, \n     42,   0,  16,   0,   4,   0, \n      0,   0, 165,   0,   0,   8, \n     50,   0,  16,   0,   8,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,  22, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      9,   0,   0,   0,  26,   0, \n     16,   0,   8,   0,   0,   0, \n     18,   0,   0,   1, 165,   0, \n      0,   8,  18,   0,  16,   0, \n      9,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   4,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0, 165,   0, \n      0,   8,  18,   0,  16,   0, \n      8,   0,   0,   0,  42,   0, \n     16,   0,   4,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  76,   0, \n      0,   3,  42,   0,  16,   0, \n      5,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      0,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      1,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      9,   0,   0,   0,   6,   0, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     16,   0,   0,   0,  24,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   8,   0,   0,   0, \n      6,   0,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  16,   0,   0,   0, \n     24,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,  10,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   9,   0,   0,   0, \n      6,   0,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     30,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   3,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   8,  32, \n    128,  58,   8,  32, 128,  58, \n      8,  32, 128,  58, 171, 170, \n    170,  62,  85,   0,   0,  10, \n    226,   0,  16,   0,   8,   0, \n      0,   0,   6,   0,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      3,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      8,  32, 128,  58,   8,  32, \n    128,  58,   8,  32, 128,  58, \n    171, 170, 170,  62,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,   9,   0, \n      0,   0,   6,   0,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  10,   0,   0,   0, \n     70,   2,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,   9,   0, \n      0,   0, 135,   0,   0,   5, \n    114,   0,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255,   0,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  11, \n    114,   0,  16,   0,  14,   0, \n      0,   0,  70,   2,  16, 128, \n     65,   0,   0,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,  70,   2,  16,   0, \n     14,   0,   0,   0, 140,   0, \n      0,  17, 114,   0,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,  70,   2,  16,   0, \n     13,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  12,   0, \n      0,   0,  70,   2,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  11,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 114,   0,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,   9,   0, \n      0,   0,  70,   2,  16,   0, \n     10,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  86,   0,   0,   5, \n     66,   0,  16,   0,   4,   0, \n      0,   0,  58,   0,  16,   0, \n      9,   0,   0,   0,  56,   0, \n      0,   7, 130,   0,  16,   0, \n      9,   0,   0,   0,  42,   0, \n     16,   0,   4,   0,   0,   0, \n      1,  64,   0,   0, 171, 170, \n    170,  62,  85,   0,   0,  10, \n    226,   0,  16,   0,   8,   0, \n      0,   0,   6,   0,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  10,   0,   0,   0, \n     70,   2,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,   8,   0, \n      0,   0, 135,   0,   0,   5, \n    114,   0,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255,   0,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  11, \n    114,   0,  16,   0,  14,   0, \n      0,   0,  70,   2,  16, 128, \n     65,   0,   0,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,  70,   2,  16,   0, \n     14,   0,   0,   0, 140,   0, \n      0,  17, 114,   0,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,  70,   2,  16,   0, \n     13,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  12,   0, \n      0,   0,  70,   2,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  11,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 114,   0,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,   8,   0, \n      0,   0,  70,   2,  16,   0, \n     10,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  86,   0,   0,   5, \n     66,   0,  16,   0,   4,   0, \n      0,   0,  58,   0,  16,   0, \n      8,   0,   0,   0,  56,   0, \n      0,   7, 130,   0,  16,   0, \n      8,   0,   0,   0,  42,   0, \n     16,   0,   4,   0,   0,   0, \n      1,  64,   0,   0, 171, 170, \n    170,  62,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     41,   0,   0,   7,  34,   0, \n     16,   0,   9,   0,   0,   0, \n     10,   0,  16,   0,   9,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0,  42,   0, \n      0,  10, 194,   0,  16,   0, \n      4,   0,   0,   0,  86,   1, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    194,   0,  16,   0,   4,   0, \n      0,   0, 166,  14,  16,   0, \n      4,   0,   0,   0,  56,   0, \n      0,  10, 194,   0,  16,   0, \n      4,   0,   0,   0, 166,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n     50,   0,  16,   0,   9,   0, \n      0,   0, 230,  10,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     41,   0,   0,   7,  34,   0, \n     16,   0,   8,   0,   0,   0, \n     10,   0,  16,   0,   8,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0,  42,   0, \n      0,  10, 194,   0,  16,   0, \n      4,   0,   0,   0,  86,   1, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    194,   0,  16,   0,   4,   0, \n      0,   0, 166,  14,  16,   0, \n      4,   0,   0,   0,  56,   0, \n      0,  10, 194,   0,  16,   0, \n      4,   0,   0,   0, 166,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n     50,   0,  16,   0,   8,   0, \n      0,   0, 230,  10,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  85,   0,   0,   7, \n     66,   0,  16,   0,   4,   0, \n      0,   0,  10,   0,  16,   0, \n      9,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n    131,   0,   0,   5,  18,   0, \n     16,   0,   9,   0,   0,   0, \n     10,   0,  16,   0,   9,   0, \n      0,   0, 131,   0,   0,   5, \n     34,   0,  16,   0,   9,   0, \n      0,   0,  42,   0,  16,   0, \n      4,   0,   0,   0,  85,   0, \n      0,   7,  66,   0,  16,   0, \n      4,   0,   0,   0,  10,   0, \n     16,   0,   8,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0, 131,   0,   0,   5, \n     18,   0,  16,   0,   8,   0, \n      0,   0,  10,   0,  16,   0, \n      8,   0,   0,   0, 131,   0, \n      0,   5,  34,   0,  16,   0, \n      8,   0,   0,   0,  42,   0, \n     16,   0,   4,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   1,  10,   0,   0,   1, \n     54,   0,   0,   8, 226,   0, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    226,   0,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   1,  23,   0,   0,   1, \n     21,   0,   0,   1,   0,   0, \n      0,   7, 242,   0,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,   0,   0,   0,   7, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n     80,   0,   0,   7, 130,   0, \n     16,   0,   3,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  31,   0, \n      4,   3,  58,   0,  16,   0, \n      3,   0,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     58,   0,  16,   0,   5,   0, \n      0,   0,  56,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0, 128,  62, \n     30,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,  31,   0, \n      4,   3,  58,   0,  16,   0, \n      5,   0,   0,   0,  32,   0, \n      0,   7,  66,   0,  16,   0, \n      4,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   8,   0, \n      0,   0,  31,   0,   4,   3, \n     42,   0,  16,   0,   4,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0, 230, 116, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  50,   0,  16,   0, \n      9,   0,   0,   0, 230,  10, \n     16,   0,   8,   0,   0,   0, \n     18,   0,   0,   1, 165,   0, \n      0,   8,  50,   0,  16,   0, \n      9,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     70, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   4,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8,  50,   0,  16,   0, \n      8,   0,   0,   0,  42,   0, \n     16,   0,   4,   0,   0,   0, \n     70, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  76,   0, \n      0,   3,  42,   0,  16,   0, \n      5,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      5,   0,   0,   0,  41,   0, \n      0,  10, 194,   0,  16,   0, \n      9,   0,   0,   0,   6,   4, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  38,   7,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,  41,   0, \n      0,  10, 194,   0,  16,   0, \n      8,   0,   0,   0,   6,   4, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  38,   7,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  85,   0,   0,  10, \n    194,   0,  16,   0,   4,   0, \n      0,   0,   6,   4,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    131,   0,   0,   5,  82,   0, \n     16,   0,   9,   0,   0,   0, \n      6,   1,  16,   0,   9,   0, \n      0,   0, 131,   0,   0,   5, \n    162,   0,  16,   0,   9,   0, \n      0,   0, 166,  14,  16,   0, \n      4,   0,   0,   0,  85,   0, \n      0,  10, 194,   0,  16,   0, \n      4,   0,   0,   0,   6,   4, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 131,   0,   0,   5, \n     82,   0,  16,   0,   8,   0, \n      0,   0,   6,   1,  16,   0, \n      8,   0,   0,   0, 131,   0, \n      0,   5, 162,   0,  16,   0, \n      8,   0,   0,   0, 166,  14, \n     16,   0,   4,   0,   0,   0, \n      2,   0,   0,   1,  10,   0, \n      0,   1,  54,   0,   0,   8, \n    194,   0,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,  23,   0, \n      0,   1,  18,   0,   0,   1, \n     32,   0,   0,   7,  66,   0, \n     16,   0,   4,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      4,   0,   0,   0, 165,   0, \n      0,   8,  50,   0,  16,   0, \n      8,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     22, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   9,   0,   0,   0, \n     26,   0,  16,   0,   8,   0, \n      0,   0,  18,   0,   0,   1, \n    165,   0,   0,   8,  18,   0, \n     16,   0,   9,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n    165,   0,   0,   8,  18,   0, \n     16,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     76,   0,   0,   3,  42,   0, \n     16,   0,   5,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   0,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   9,   0,   0,   0, \n      6,   0,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  16,   0,   0,   0, \n     24,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59,  85,   0,   0,  10, \n    226,   0,  16,   0,   8,   0, \n      0,   0,   6,   0,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,  10,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,   9,   0, \n      0,   0,   6,   0,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      3,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      8,  32, 128,  58,   8,  32, \n    128,  58,   8,  32, 128,  58, \n    171, 170, 170,  62,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      8,   0,   0,   0,   6,   0, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   3,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   8,  32, 128,  58, \n      8,  32, 128,  58,   8,  32, \n    128,  58, 171, 170, 170,  62, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n     12,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      9,   0,   0,   0,   6,   0, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  10,   0, \n      0,   0,  70,   2,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  11,   0,   0,   0, \n     70,   2,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 114,   0,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n      9,   0,   0,   0, 135,   0, \n      0,   5, 114,   0,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n    232, 255, 255, 255, 232, 255, \n    255, 255, 232, 255, 255, 255, \n      0,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  11, 114,   0,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16, 128,  65,   0,   0,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  14,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,  70,   2,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  14,   0,   0,   0, \n    140,   0,   0,  17, 114,   0, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  11,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,  13,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  11,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 114,   0, \n     16,   0,  11,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n      9,   0,   0,   0,  70,   2, \n     16,   0,  10,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   0, \n      0,   5,  34,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   9,   0,   0,   0, \n     56,   0,   0,   7, 130,   0, \n     16,   0,   9,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n    171, 170, 170,  62,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      8,   0,   0,   0,   6,   0, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  10,   0, \n      0,   0,  70,   2,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  11,   0,   0,   0, \n     70,   2,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 114,   0,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n      8,   0,   0,   0, 135,   0, \n      0,   5, 114,   0,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n    232, 255, 255, 255, 232, 255, \n    255, 255, 232, 255, 255, 255, \n      0,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  11, 114,   0,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16, 128,  65,   0,   0,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  14,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,  70,   2,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  14,   0,   0,   0, \n    140,   0,   0,  17, 114,   0, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  11,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,  13,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  11,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 114,   0, \n     16,   0,  11,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n      8,   0,   0,   0,  70,   2, \n     16,   0,  10,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   0, \n      0,   5,  34,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   8,   0,   0,   0, \n     56,   0,   0,   7, 130,   0, \n     16,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n    171, 170, 170,  62,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  41,   0,   0,   7, \n     34,   0,  16,   0,   9,   0, \n      0,   0,  10,   0,  16,   0, \n      9,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n     42,   0,   0,  10, 194,   0, \n     16,   0,   4,   0,   0,   0, \n     86,   1,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 194,   0,  16,   0, \n      4,   0,   0,   0, 166,  14, \n     16,   0,   4,   0,   0,   0, \n     56,   0,   0,  10, 194,   0, \n     16,   0,   4,   0,   0,   0, \n    166,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10,  50,   0,  16,   0, \n      9,   0,   0,   0, 230,  10, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,   7, \n     34,   0,  16,   0,   8,   0, \n      0,   0,  10,   0,  16,   0, \n      8,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n     42,   0,   0,  10, 194,   0, \n     16,   0,   4,   0,   0,   0, \n     86,   1,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 194,   0,  16,   0, \n      4,   0,   0,   0, 166,  14, \n     16,   0,   4,   0,   0,   0, \n     56,   0,   0,  10, 194,   0, \n     16,   0,   4,   0,   0,   0, \n    166,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10,  50,   0,  16,   0, \n      8,   0,   0,   0, 230,  10, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      6,   0,   0,   0,  85,   0, \n      0,   7,  34,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   9,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0, 131,   0,   0,   5, \n     18,   0,  16,   0,   9,   0, \n      0,   0,  10,   0,  16,   0, \n      9,   0,   0,   0, 131,   0, \n      0,   5,  34,   0,  16,   0, \n      9,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     85,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   8,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0, 131,   0, \n      0,   5,  18,   0,  16,   0, \n      8,   0,   0,   0,  10,   0, \n     16,   0,   8,   0,   0,   0, \n    131,   0,   0,   5,  34,   0, \n     16,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,  10,   0, \n      0,   1,  54,   0,   0,   8, \n    226,   0,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 226,   0,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,  23,   0, \n      0,   1,  21,   0,   0,   1, \n      0,   0,   0,   7, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,   0,   0, \n      0,   7, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,  30,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n     31,   0,   4,   3,  58,   0, \n     16,   0,   5,   0,   0,   0, \n     32,   0,   0,   7, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  31,   0, \n      4,   3,  58,   0,  16,   0, \n      2,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n     10,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n    230, 116,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  50,   0, \n     16,   0,  11,   0,   0,   0, \n    230,  10,  16,   0,  10,   0, \n      0,   0,  18,   0,   0,   1, \n    165,   0,   0,   8,  50,   0, \n     16,   0,  11,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  70, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    130,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n    165,   0,   0,   8,  50,   0, \n     16,   0,  10,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  70, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     76,   0,   0,   3,  42,   0, \n     16,   0,   5,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   5,   0,   0,   0, \n     41,   0,   0,  10, 194,   0, \n     16,   0,  11,   0,   0,   0, \n      6,   4,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n     12,   0,   0,   0,  38,   7, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n     41,   0,   0,  10, 194,   0, \n     16,   0,  10,   0,   0,   0, \n      6,   4,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n     12,   0,   0,   0,  38,   7, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      7,   0,   0,   0,  85,   0, \n      0,  10, 194,   0,  16,   0, \n      4,   0,   0,   0,   6,   4, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 131,   0,   0,   5, \n     82,   0,  16,   0,  11,   0, \n      0,   0,   6,   1,  16,   0, \n     11,   0,   0,   0, 131,   0, \n      0,   5, 162,   0,  16,   0, \n     11,   0,   0,   0, 166,  14, \n     16,   0,   4,   0,   0,   0, \n     85,   0,   0,  10, 194,   0, \n     16,   0,   4,   0,   0,   0, \n      6,   4,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 131,   0, \n      0,   5,  82,   0,  16,   0, \n     10,   0,   0,   0,   6,   1, \n     16,   0,  10,   0,   0,   0, \n    131,   0,   0,   5, 162,   0, \n     16,   0,  10,   0,   0,   0, \n    166,  14,  16,   0,   4,   0, \n      0,   0,   2,   0,   0,   1, \n     10,   0,   0,   1,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   1, \n     23,   0,   0,   1,  18,   0, \n      0,   1,  32,   0,   0,   7, \n    130,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     31,   0,   4,   3,  58,   0, \n     16,   0,   2,   0,   0,   0, \n    165,   0,   0,   8,  50,   0, \n     16,   0,  10,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  22, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  11,   0, \n      0,   0,  26,   0,  16,   0, \n     10,   0,   0,   0,  18,   0, \n      0,   1, 165,   0,   0,   8, \n     18,   0,  16,   0,  11,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n     18,   0,  16,   0,  10,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  76,   0,   0,   3, \n     42,   0,  16,   0,   5,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,   0,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,  11,   0, \n      0,   0,   6,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     10,   0,   0,   0,   6,   0, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     16,   0,   0,   0,  24,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      2,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n     10,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     11,   0,   0,   0,   6,   0, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   3,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   8,  32, 128,  58, \n      8,  32, 128,  58,   8,  32, \n    128,  58, 171, 170, 170,  62, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  10,   0,   0,   0, \n      6,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     30,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   3,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   8,  32, \n    128,  58,   8,  32, 128,  58, \n      8,  32, 128,  58, 171, 170, \n    170,  62,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  11,   0,   0,   0, \n      6,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     30,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n      5,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  12,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n    138,   0,   0,  15, 114,   0, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n    135,   0,   0,   5, 114,   0, \n     16,   0,  14,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  14,   0, \n      0,   0,  70,   2,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0, 232, 255, 255, 255, \n    232, 255, 255, 255, 232, 255, \n    255, 255,   0,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  14,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,  70,   2,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  11, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16, 128,  65,   0, \n      0,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0, 140,   0,   0,  17, \n    114,   0,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  14,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  12,   0, \n      0,   0,  70,   2,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  14,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    114,   0,  16,   0,  12,   0, \n      0,   0,  70,   2,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,  12,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  11,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,  70,   2,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     86,   0,   0,   5,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,  11,   0, \n      0,   0,  56,   0,   0,   7, \n    130,   0,  16,   0,  11,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0, 171, 170, 170,  62, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  10,   0,   0,   0, \n      6,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     30,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n      5,   0,   0,   0,  70,   2, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  12,   0, \n      0,   0,  70,   2,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n    138,   0,   0,  15, 114,   0, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  10,   0,   0,   0, \n    135,   0,   0,   5, 114,   0, \n     16,   0,  14,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  14,   0, \n      0,   0,  70,   2,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0, 232, 255, 255, 255, \n    232, 255, 255, 255, 232, 255, \n    255, 255,   0,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  14,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,  70,   2,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  11, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16, 128,  65,   0, \n      0,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0, 140,   0,   0,  17, \n    114,   0,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  14,   0,   0,   0, \n     70,   2,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  12,   0, \n      0,   0,  70,   2,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  14,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    114,   0,  16,   0,  12,   0, \n      0,   0,  70,   2,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,  12,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  10,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,  70,   2,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     86,   0,   0,   5,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,  10,   0, \n      0,   0,  56,   0,   0,   7, \n    130,   0,  16,   0,  10,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0, 171, 170, 170,  62, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      4,   0,   0,   0,  41,   0, \n      0,   7,  34,   0,  16,   0, \n     11,   0,   0,   0,  10,   0, \n     16,   0,  11,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0,  42,   0,   0,  10, \n    194,   0,  16,   0,   4,   0, \n      0,   0,  86,   1,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 194,   0, \n     16,   0,   4,   0,   0,   0, \n    166,  14,  16,   0,   4,   0, \n      0,   0,  56,   0,   0,  10, \n    194,   0,  16,   0,   4,   0, \n      0,   0, 166,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10,  50,   0, \n     16,   0,  11,   0,   0,   0, \n    230,  10,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7,  34,   0,  16,   0, \n     10,   0,   0,   0,  10,   0, \n     16,   0,  10,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0,  42,   0,   0,  10, \n    194,   0,  16,   0,   4,   0, \n      0,   0,  86,   1,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 194,   0, \n     16,   0,   4,   0,   0,   0, \n    166,  14,  16,   0,   4,   0, \n      0,   0,  56,   0,   0,  10, \n    194,   0,  16,   0,   4,   0, \n      0,   0, 166,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10,  50,   0, \n     16,   0,  10,   0,   0,   0, \n    230,  10,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   6,   0,   0,   0, \n     85,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,  11,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0, 131,   0, \n      0,   5,  18,   0,  16,   0, \n     11,   0,   0,   0,  10,   0, \n     16,   0,  11,   0,   0,   0, \n    131,   0,   0,   5,  34,   0, \n     16,   0,  11,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n     10,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n    131,   0,   0,   5,  18,   0, \n     16,   0,  10,   0,   0,   0, \n     10,   0,  16,   0,  10,   0, \n      0,   0, 131,   0,   0,   5, \n     34,   0,  16,   0,  10,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   1, \n     10,   0,   0,   1,  54,   0, \n      0,   8, 226,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 226,   0, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   1, \n     23,   0,   0,   1,  21,   0, \n      0,   1,   0,   0,   0,   7, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      0,   0,   0,   7, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  18,   0, \n      0,   1,  54,   0,   0,   5, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  21,   0, \n      0,   1,  21,   0,   0,   1, \n     56,   0,   0,   7, 242,   0, \n     16,   0,   5,   0,   0,   0, \n    166,  10,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,  56,   0, \n      0,   7, 242,   0,  16,   0, \n      6,   0,   0,   0, 166,  10, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  31,   0,   4,   3, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  54,   0,   0,   5, \n     50,   0,  16,   0,   7,   0, \n      0,   0,  38,  10,  16,   0, \n      5,   0,   0,   0,  54,   0, \n      0,   5,  82,   0,  16,   0, \n      6,   0,   0,   0, 166,   8, \n     16,   0,   6,   0,   0,   0, \n     18,   0,   0,   1,  54,   0, \n      0,   5,  50,   0,  16,   0, \n      7,   0,   0,   0, 134,   0, \n     16,   0,   5,   0,   0,   0, \n     21,   0,   0,   1,  79,   0, \n      0,   7,  34,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n    194,   0,  16,   0,   7,   0, \n      0,   0,  86,  13,  16,   0, \n      5,   0,   0,   0,  54,   0, \n      0,   5, 242,   0,  16,   0, \n      6,   0,   0,   0, 134,  13, \n     16,   0,   7,   0,   0,   0, \n     21,   0,   0,   1,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      4,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,   9, \n     98,   0,  16,   0,   0,   0, \n      0,   0,   6,   2,  16,   0, \n      3,   0,   0,   0,   6,   1, \n     16,   0,   2,   0,   0,   0, \n      6,   1,  16,   0,   4,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   1,   0, \n      0,   0, 150,   5,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     78,   0,   0,   8, 194,   0, \n     16,   0,   2,   0,   0,   0, \n      0, 208,   0,   0,   6,   4, \n     16,   0,   1,   0,   0,   0, \n      6,   4,  16,   0,   2,   0, \n      0,   0,  35,   0,   0,  10, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16, 128, \n     65,   0,   0,   0,   2,   0, \n      0,   0, 230,  10,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n     41,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  66,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  66,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  26,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     58,   0,  16,   0,   0,   0, \n      0,   0, 138,   0,   0,  11, \n    130,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     42, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  10,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     42,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0, 139,   0, \n      0,  15, 242,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,  28,   0,   0,   0, \n     27,   0,   0,   0,  31,   0, \n      0,   0,  29,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0, 182,  15,  16,   0, \n      2,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      3,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0, 140,   0, \n      0,  11, 130,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  66,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11, 130,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n    130,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     25,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  87,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0, 139,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     29,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,   0,   0,   7, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n    140,   0,   0,  20,  82,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0,   6,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     41,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 139,   0,   0,  15, \n     98,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  27,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n    246,  15,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n    130,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11, 130,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     18,   0,   0,   1, 139,   0, \n      0,  15, 242,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,  27,   0,   0,   0, \n     27,   0,   0,   0,  31,   0, \n      0,   0,  28,   0,   0,   0, \n      2,  64,   0,   0,   4,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0, 182,  15,  16,   0, \n      2,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   3,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0, 140,   0, \n      0,  20,  98,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0, 166,  11,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     26,   0,   0,   0,   1,  64, \n      0,   0,   6,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0, 139,   0, \n      0,  15,  50,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  29,   0,   0,   0, \n     29,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 230,  10,  16,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  87,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  41,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   6,   0,   0,   0, \n     30,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0, 139,   0, \n      0,  15,  98,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     27,   0,   0,   0,  24,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,  86,   5,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   8,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11, 130,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  20,   0, \n      0,   0,   1,  64,   0,   0, \n     12,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     38,   0,   0,   8,   0, 208, \n      0,   0,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  32,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   5,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  82,   0, \n     16,   0,   5,   0,   0,   0, \n    246,  13,  16,   0,   5,   0, \n      0,   0,  54,   0,   0,   5, \n    162,   0,  16,   0,   5,   0, \n      0,   0,  86,   1,  16,   0, \n      7,   0,   0,   0,  54,   0, \n      0,   5, 130,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     18,   0,   0,   1,  54,   0, \n      0,   5,  82,   0,  16,   0, \n      5,   0,   0,   0,   6,   1, \n     16,   0,   7,   0,   0,   0, \n     54,   0,   0,   5, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     32,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  31,   0, \n      4,   3,  10,   0,  16,   0, \n      1,   0,   0,   0,  54,   0, \n      0,   5, 242,   0,  16,   0, \n      5,   0,   0,   0,  22,  11, \n     16,   0,   5,   0,   0,   0, \n     54,   0,   0,   5, 130,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,  21,   0,   0,   1, \n     32,   0,   0,  10, 114,   0, \n     16,   0,   1,   0,   0,   0, \n    246,  15,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,  60,   0, \n      0,   7,  50,   0,  16,   0, \n      1,   0,   0,   0, 150,   5, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  21,   0,   0,   1, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  30,   0,   0,   7, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     54,   0,   0,   5, 242,   0, \n     16,   0,   6,   0,   0,   0, \n    182,   1,  16,   0,   6,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  21,   0, \n      0,   1,  32,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     54,   0,   0,   5, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     22,  11,  16,   0,   6,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  21,   0, \n      0,   1,  32,   0,   0,  10, \n    114,   0,  16,   0,   1,   0, \n      0,   0,   6,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      2,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  82,   0, \n     16,   0,   0,   0,   0,   0, \n     86,   6,  16,   0,   1,   0, \n      0,   0,   6,   1,  16,   0, \n      1,   0,   0,   0,  31,   0, \n      4,   3,  10,   0,  16,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  21,   0, \n      0,   1, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  62,   0, \n      0,   1,  83,  84,  65,  84, \n    148,   0,   0,   0, 243,   2, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  66,   0,   0,   0, \n    146,   0,   0,   0, 114,   0, \n      0,   0,  57,   0,   0,   0, \n     37,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  24,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  64,   0,   0,   0, \n     32,   0,   0,   0,  40,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/resolve_full_16bpp_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_resolve_edram_info;        // Offset:    0 Size:     4\n//   uint xe_resolve_coordinate_info;   // Offset:    4 Size:     4\n//   uint xe_resolve_dest_info;         // Offset:    8 Size:     4\n//   uint xe_resolve_dest_coordinate_info;// Offset:   12 Size:     4\n//   uint xe_resolve_dest_base;         // Offset:   16 Size:     4\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_resolve_edram                  texture    byte         r/o      T0             t0      1 \n// xe_resolve_dest                       UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][2], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xy\ndcl_temps 24\ndcl_thread_group 8, 8, 1\nand r0.xyzw, CB0[0][0].xzzz, l(1023, 7, 8, 0x01000000)\nand r1.x, CB0[0][0].w, l(1023)\nushr r2.xyz, CB0[0][0].yywy, l(4, 5, 10, 0)\nushr r3.xyzw, CB0[0][0].wwww, l(24, 20, 24, 24)\nishl r4.y, vThreadID.x, l(2)\nbfi r1.y, l(11), l(3), r2.y, l(0)\nuge r1.y, r4.y, r1.y\nif_nz r1.y\n  ret \nendif \nubfe r5.xyzw, l(2, 11, 4, 1), l(10, 13, 24, 28), CB0[0][0].xxxx\nmov r2.w, CB0[0][0].y\nbfi r1.yz, l(0, 4, 1, 0), l(0, 3, 3, 0), r2.wwxw, l(0, 0, 0, 0)\nibfe r1.w, l(6), l(16), CB0[0][0].z\nishl r1.w, r1.w, l(23)\niadd r1.w, r1.w, l(0x3f800000)\nbfi r3.xyzw, l(4, 4, 4, 4), l(3, 3, 3, 3), r3.xyzw, l(0, 0, 0, 0)\nubfe r2.xy, l(6, 3, 0, 0), l(7, 28, 0, 0), CB0[0][0].zwzz\nmov r4.xzw, vThreadID.yyyy\niadd r1.yz, r1.yyzy, r4.yywy\nuge r2.w, l(3), r2.y\nif_nz r2.w\n  mov r6.y, r2.y\nelse \n  ieq r2.w, r2.y, l(5)\n  if_nz r2.w\n    mov r6.y, l(2)\n  else \n    mov r6.y, l(0)\n  endif \nendif \nuge r6.zw, r5.xxxx, l(0, 0, 2, 1)\nand r6.zw, r6.zzzw, l(0, 0, 1, 1)\nishl r1.yz, r1.yyzy, r6.zzwz\nushr r6.x, r6.y, l(1)\nand r6.xy, r6.xyxx, l(1, 1, 0, 0)\niadd r1.yz, r1.yyzy, r6.xxyx\nushr r6.x, l(80), r5.w\nmov r6.y, l(16)\nudiv r7.xy, null, r1.yzyy, r6.xyxx\nimad r0.x, r7.y, r0.x, r7.x\niadd r0.x, r0.x, r5.y\nimad r1.yz, -r7.xxyx, r6.xxyx, r1.yyzy\nimad r1.y, r1.z, r6.x, r1.y\nishl r1.y, r1.y, r5.w\nimad r0.x, r0.x, l(1280), r1.y\nudiv null, r0.x, r0.x, l(0x00280000)\nishl r0.x, r0.x, l(2)\niadd r1.y, r5.w, r6.z\nishl r1.z, l(4), r1.y\nif_nz r5.w\n  ieq r2.w, r1.z, l(8)\n  if_nz r2.w\n    ld_raw r6.xyzw, r0.x, T0[0].zwxy\n    iadd r2.w, r0.x, l(16)\n    ld_raw r7.xyzw, r2.w, T0[0].zwxy\n    mov r8.xy, r6.zwzz\n    mov r9.xy, r7.zwzz\n  else \n    ld_raw r8.xy, r0.x, T0[0].xyxx\n    iadd r2.w, r0.x, r1.z\n    ld_raw r6.xy, r2.w, T0[0].xyxx\n    ishl r5.xy, l(8, 12, 0, 0), r1.yyyy\n    iadd r5.xy, r0.xxxx, r5.xyxx\n    ld_raw r9.xy, r5.x, T0[0].xyxx\n    ld_raw r7.xy, r5.y, T0[0].xyxx\n  endif \n  switch r5.z\n    case l(5)\n    ishl r8.zw, r8.xxxy, l(0, 0, 16, 16)\n    ishr r10.xyzw, r8.zxwy, l(16, 16, 16, 16)\n    itof r10.xyzw, r10.xyzw\n    mul r10.xyzw, r10.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n    max r8.xyzw, r10.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n    ishl r6.zw, r6.xxxy, l(0, 0, 16, 16)\n    ishr r10.xyzw, r6.zxwy, l(16, 16, 16, 16)\n    itof r10.xyzw, r10.xyzw\n    mul r10.xyzw, r10.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n    max r6.xyzw, r10.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n    ishl r9.zw, r9.xxxy, l(0, 0, 16, 16)\n    ishr r10.xyzw, r9.zxwy, l(16, 16, 16, 16)\n    itof r10.xyzw, r10.xyzw\n    mul r10.xyzw, r10.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n    max r9.xyzw, r10.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n    ishl r7.zw, r7.xxxy, l(0, 0, 16, 16)\n    ishr r10.xyzw, r7.zxwy, l(16, 16, 16, 16)\n    itof r10.xyzw, r10.xyzw\n    mul r10.xyzw, r10.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n    max r7.xyzw, r10.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n    break \n    case l(7)\n    ushr r5.xy, r8.xyxx, l(16, 16, 0, 0)\n    f16tof32 r8.xz, r8.xxyx\n    f16tof32 r8.yw, r5.xxxy\n    ushr r5.xy, r6.xyxx, l(16, 16, 0, 0)\n    f16tof32 r6.xz, r6.xxyx\n    f16tof32 r6.yw, r5.xxxy\n    ushr r5.xy, r9.xyxx, l(16, 16, 0, 0)\n    f16tof32 r9.xz, r9.xxyx\n    f16tof32 r9.yw, r5.xxxy\n    ushr r5.xy, r7.xyxx, l(16, 16, 0, 0)\n    f16tof32 r7.xz, r7.xxyx\n    f16tof32 r7.yw, r5.xxxy\n    break \n    default \n    mov r8.zw, l(0,0,0,0)\n    mov r6.zw, l(0,0,0,0)\n    mov r9.zw, l(0,0,0,0)\n    mov r7.zw, l(0,0,0,0)\n    break \n  endswitch \nelse \n  ieq r2.w, r1.z, l(4)\n  if_nz r2.w\n    ld_raw r7.xyzw, r0.x, T0[0].wxyz\n  else \n    ld_raw r7.y, r0.x, T0[0].xxxx\n    iadd r2.w, r0.x, r1.z\n    ld_raw r7.z, r2.w, T0[0].xxxx\n    ishl r5.xy, l(8, 12, 0, 0), r1.yyyy\n    iadd r5.xy, r0.xxxx, r5.xyxx\n    ld_raw r7.w, r5.x, T0[0].xxxx\n    ld_raw r7.x, r5.y, T0[0].xxxx\n  endif \n  switch r5.z\n    case l(0)\n    case l(1)\n    ushr r10.yzw, r7.yyyy, l(0, 8, 16, 24)\n    mov r10.x, r7.y\n    and r10.xyzw, r10.xyzw, l(255, 255, 255, 255)\n    utof r10.xyzw, r10.xyzw\n    mul r8.xyzw, r10.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n    ushr r10.yzw, r7.zzzz, l(0, 8, 16, 24)\n    mov r10.x, r7.z\n    and r10.xyzw, r10.xyzw, l(255, 255, 255, 255)\n    utof r10.xyzw, r10.xyzw\n    mul r6.xyzw, r10.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n    ushr r10.yzw, r7.wwww, l(0, 8, 16, 24)\n    mov r10.x, r7.w\n    and r10.xyzw, r10.xyzw, l(255, 255, 255, 255)\n    utof r10.xyzw, r10.xyzw\n    mul r9.xyzw, r10.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n    ushr r7.yzw, r7.xxxx, l(0, 8, 16, 24)\n    and r10.xyzw, r7.xyzw, l(255, 255, 255, 255)\n    utof r10.xyzw, r10.xyzw\n    mul r7.xyzw, r10.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n    break \n    case l(2)\n    case l(10)\n    ushr r10.yzw, r7.yyyy, l(0, 10, 20, 30)\n    mov r10.x, r7.y\n    and r10.xyzw, r10.xyzw, l(1023, 1023, 1023, 3)\n    utof r10.xyzw, r10.xyzw\n    mul r8.xyzw, r10.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n    ushr r10.yzw, r7.zzzz, l(0, 10, 20, 30)\n    mov r10.x, r7.z\n    and r10.xyzw, r10.xyzw, l(1023, 1023, 1023, 3)\n    utof r10.xyzw, r10.xyzw\n    mul r6.xyzw, r10.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n    ushr r10.yzw, r7.wwww, l(0, 10, 20, 30)\n    mov r10.x, r7.w\n    and r10.xyzw, r10.xyzw, l(1023, 1023, 1023, 3)\n    utof r10.xyzw, r10.xyzw\n    mul r9.xyzw, r10.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n    ushr r7.yzw, r7.xxxx, l(0, 10, 20, 30)\n    and r10.xyzw, r7.xyzw, l(1023, 1023, 1023, 3)\n    utof r10.xyzw, r10.xyzw\n    mul r7.xyzw, r10.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n    break \n    case l(3)\n    case l(12)\n    ushr r10.xyzw, r7.yyyz, l(10, 20, 30, 30)\n    mov r11.x, r7.y\n    mov r11.yz, r10.xxyx\n    and r12.xyz, r11.xyzx, l(1023, 1023, 1023, 0)\n    and r13.xyz, r11.xyzx, l(127, 127, 127, 0)\n    ubfe r14.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r11.xyzx\n    firstbit_hi r15.xyz, r13.xyzx\n    iadd r15.xyz, r15.xyzx, l(-24, -24, -24, 0)\n    movc r15.xyz, r13.xyzx, r15.xyzx, l(8,8,8,0)\n    iadd r16.xyz, -r15.xyzx, l(1, 1, 1, 0)\n    movc r16.xyz, r14.xyzx, r14.xyzx, r16.xyzx\n    bfi r11.xyz, l(7, 7, 7, 0), r15.xyzx, r11.xyzx, l(0, 0, 0, 0)\n    and r11.xyz, r11.xyzx, l(127, 127, 127, 0)\n    movc r11.xyz, r14.xyzx, r13.xyzx, r11.xyzx\n    ishl r13.xyz, r16.xyzx, l(23, 23, 23, 0)\n    iadd r13.xyz, r13.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n    ishl r11.xyz, r11.xyzx, l(16, 16, 16, 0)\n    iadd r11.xyz, r13.xyzx, r11.xyzx\n    movc r8.xyz, r12.xyzx, r11.xyzx, l(0,0,0,0)\n    utof r5.xy, r10.zwzz\n    ushr r10.xyzw, r7.zwwz, l(10, 10, 20, 20)\n    mov r11.x, r7.z\n    mov r11.yz, r10.xxwx\n    and r12.xyz, r11.xyzx, l(1023, 1023, 1023, 0)\n    and r13.xyz, r11.xyzx, l(127, 127, 127, 0)\n    ubfe r14.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r11.xyzx\n    firstbit_hi r15.xyz, r13.xyzx\n    iadd r15.xyz, r15.xyzx, l(-24, -24, -24, 0)\n    movc r15.xyz, r13.xyzx, r15.xyzx, l(8,8,8,0)\n    iadd r16.xyz, -r15.xyzx, l(1, 1, 1, 0)\n    movc r16.xyz, r14.xyzx, r14.xyzx, r16.xyzx\n    bfi r11.xyz, l(7, 7, 7, 0), r15.xyzx, r11.xyzx, l(0, 0, 0, 0)\n    and r11.xyz, r11.xyzx, l(127, 127, 127, 0)\n    movc r11.xyz, r14.xyzx, r13.xyzx, r11.xyzx\n    ishl r13.xyz, r16.xyzx, l(23, 23, 23, 0)\n    iadd r13.xyz, r13.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n    ishl r11.xyz, r11.xyzx, l(16, 16, 16, 0)\n    iadd r11.xyz, r13.xyzx, r11.xyzx\n    movc r6.xyz, r12.xyzx, r11.xyzx, l(0,0,0,0)\n    mul r5.xy, r5.xyxx, l(0.333333, 0.333333, 0.000000, 0.000000)\n    mov r10.x, r7.w\n    and r11.xyz, r10.xyzx, l(1023, 1023, 1023, 0)\n    and r12.xyz, r10.xyzx, l(127, 127, 127, 0)\n    ubfe r13.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r10.xyzx\n    firstbit_hi r14.xyz, r12.xyzx\n    iadd r14.xyz, r14.xyzx, l(-24, -24, -24, 0)\n    movc r14.xyz, r12.xyzx, r14.xyzx, l(8,8,8,0)\n    iadd r15.xyz, -r14.xyzx, l(1, 1, 1, 0)\n    movc r15.xyz, r13.xyzx, r13.xyzx, r15.xyzx\n    bfi r10.xyz, l(7, 7, 7, 0), r14.xyzx, r10.xyzx, l(0, 0, 0, 0)\n    and r10.xyz, r10.xyzx, l(127, 127, 127, 0)\n    movc r10.xyz, r13.xyzx, r12.xyzx, r10.xyzx\n    ishl r12.xyz, r15.xyzx, l(23, 23, 23, 0)\n    iadd r12.xyz, r12.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n    ishl r10.xyz, r10.xyzx, l(16, 16, 16, 0)\n    iadd r10.xyz, r12.xyzx, r10.xyzx\n    movc r9.xyz, r11.xyzx, r10.xyzx, l(0,0,0,0)\n    ushr r10.xyzw, r7.wxxx, l(30, 10, 20, 30)\n    utof r11.xy, r10.xwxx\n    mov r10.x, r7.x\n    and r12.xyz, r10.xyzx, l(1023, 1023, 1023, 0)\n    and r13.xyz, r10.xyzx, l(127, 127, 127, 0)\n    ubfe r14.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r10.xyzx\n    firstbit_hi r15.xyz, r13.xyzx\n    iadd r15.xyz, r15.xyzx, l(-24, -24, -24, 0)\n    movc r15.xyz, r13.xyzx, r15.xyzx, l(8,8,8,0)\n    iadd r16.xyz, -r15.xyzx, l(1, 1, 1, 0)\n    movc r16.xyz, r14.xyzx, r14.xyzx, r16.xyzx\n    bfi r10.xyz, l(7, 7, 7, 0), r15.xyzx, r10.xyzx, l(0, 0, 0, 0)\n    and r10.xyz, r10.xyzx, l(127, 127, 127, 0)\n    movc r10.xyz, r14.xyzx, r13.xyzx, r10.xyzx\n    ishl r13.xyz, r16.xyzx, l(23, 23, 23, 0)\n    iadd r13.xyz, r13.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n    ishl r10.xyz, r10.xyzx, l(16, 16, 16, 0)\n    iadd r10.xyz, r13.xyzx, r10.xyzx\n    movc r7.xyz, r12.xyzx, r10.xyzx, l(0,0,0,0)\n    mul r10.xy, r11.xyxx, l(0.333333, 0.333333, 0.000000, 0.000000)\n    mov r8.w, r5.x\n    mov r6.w, r5.y\n    mov r9.w, r10.x\n    mov r7.w, r10.y\n    break \n    case l(4)\n    ishl r10.xyzw, r7.yzwx, l(16, 16, 16, 16)\n    mov r11.xz, r10.xxyx\n    mov r11.yw, r7.yyyz\n    ishr r11.xyzw, r11.xyzw, l(16, 16, 16, 16)\n    itof r11.xyzw, r11.xyzw\n    mul r11.xyzw, r11.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n    max r8.xy, r11.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n    max r6.xy, r11.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n    mov r7.yz, r10.zzwz\n    ishr r10.xyzw, r7.ywzx, l(16, 16, 16, 16)\n    itof r10.xyzw, r10.xyzw\n    mul r10.xyzw, r10.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n    max r9.xy, r10.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n    max r7.xy, r10.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n    mov r8.zw, l(0,0,0,0)\n    mov r6.zw, l(0,0,0,0)\n    mov r9.zw, l(0,0,0,0)\n    mov r7.zw, l(0,0,0,0)\n    break \n    case l(6)\n    ushr r10.xyzw, r7.yzwx, l(16, 16, 16, 16)\n    f16tof32 r8.x, r7.y\n    f16tof32 r8.y, r10.x\n    f16tof32 r6.x, r7.z\n    f16tof32 r6.y, r10.y\n    f16tof32 r9.x, r7.w\n    f16tof32 r9.y, r10.z\n    f16tof32 r7.x, r7.x\n    f16tof32 r7.y, r10.w\n    mov r8.zw, l(0,0,0,0)\n    mov r6.zw, l(0,0,0,0)\n    mov r9.zw, l(0,0,0,0)\n    mov r7.zw, l(0,0,0,0)\n    break \n    default \n    mov r8.x, r7.y\n    mov r8.yzw, l(0,0,0,0)\n    mov r6.x, r7.z\n    mov r6.yzw, l(0,0,0,0)\n    mov r9.x, r7.w\n    mov r9.yzw, l(0,0,0,0)\n    mov r7.yzw, l(0,0,0,0)\n    break \n  endswitch \nendif \nuge r2.w, r2.y, l(4)\nif_nz r2.w\n  mul r2.w, r1.w, l(0.500000)\n  iadd r5.x, r0.x, l(320)\n  if_nz r5.w\n    ieq r5.y, r1.z, l(8)\n    if_nz r5.y\n      ld_raw r10.xyzw, r5.x, T0[0].zwxy\n      iadd r5.y, r0.x, l(336)\n      ld_raw r11.xyzw, r5.y, T0[0].zwxy\n      mov r12.xy, r10.zwzz\n      mov r14.xy, r11.zwzz\n    else \n      ld_raw r12.xy, r5.x, T0[0].xyxx\n      iadd r5.y, r1.z, r5.x\n      ld_raw r10.xy, r5.y, T0[0].xyxx\n      ishl r13.xy, l(8, 12, 0, 0), r1.yyyy\n      iadd r13.xy, r5.xxxx, r13.xyxx\n      ld_raw r14.xy, r13.x, T0[0].xyxx\n      ld_raw r11.xy, r13.y, T0[0].xyxx\n    endif \n    switch r5.z\n      case l(5)\n      ishl r12.zw, r12.xxxy, l(0, 0, 16, 16)\n      ishr r13.xyzw, r12.zxwy, l(16, 16, 16, 16)\n      itof r13.xyzw, r13.xyzw\n      mul r13.xyzw, r13.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n      max r12.xyzw, r13.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n      ishl r10.zw, r10.xxxy, l(0, 0, 16, 16)\n      ishr r13.xyzw, r10.zxwy, l(16, 16, 16, 16)\n      itof r13.xyzw, r13.xyzw\n      mul r13.xyzw, r13.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n      max r10.xyzw, r13.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n      ishl r14.zw, r14.xxxy, l(0, 0, 16, 16)\n      ishr r13.xyzw, r14.zxwy, l(16, 16, 16, 16)\n      itof r13.xyzw, r13.xyzw\n      mul r13.xyzw, r13.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n      max r14.xyzw, r13.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n      ishl r11.zw, r11.xxxy, l(0, 0, 16, 16)\n      ishr r13.xyzw, r11.zxwy, l(16, 16, 16, 16)\n      itof r13.xyzw, r13.xyzw\n      mul r13.xyzw, r13.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n      max r11.xyzw, r13.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n      break \n      case l(7)\n      ushr r13.xy, r12.xyxx, l(16, 16, 0, 0)\n      f16tof32 r12.xz, r12.xxyx\n      f16tof32 r12.yw, r13.xxxy\n      ushr r13.xy, r10.xyxx, l(16, 16, 0, 0)\n      f16tof32 r10.xz, r10.xxyx\n      f16tof32 r10.yw, r13.xxxy\n      ushr r13.xy, r14.xyxx, l(16, 16, 0, 0)\n      f16tof32 r14.xz, r14.xxyx\n      f16tof32 r14.yw, r13.xxxy\n      ushr r13.xy, r11.xyxx, l(16, 16, 0, 0)\n      f16tof32 r11.xz, r11.xxyx\n      f16tof32 r11.yw, r13.xxxy\n      break \n      default \n      mov r12.zw, l(0,0,0,0)\n      mov r10.zw, l(0,0,0,0)\n      mov r14.zw, l(0,0,0,0)\n      mov r11.zw, l(0,0,0,0)\n      break \n    endswitch \n  else \n    ieq r5.y, r1.z, l(4)\n    if_nz r5.y\n      ld_raw r11.xyzw, r5.x, T0[0].wxyz\n    else \n      ld_raw r11.y, r5.x, T0[0].xxxx\n      iadd r5.y, r1.z, r5.x\n      ld_raw r11.z, r5.y, T0[0].xxxx\n      ishl r13.xy, l(8, 12, 0, 0), r1.yyyy\n      iadd r13.xy, r5.xxxx, r13.xyxx\n      ld_raw r11.w, r13.x, T0[0].xxxx\n      ld_raw r11.x, r13.y, T0[0].xxxx\n    endif \n    switch r5.z\n      case l(0)\n      case l(1)\n      ushr r13.yzw, r11.yyyy, l(0, 8, 16, 24)\n      mov r13.x, r11.y\n      and r13.xyzw, r13.xyzw, l(255, 255, 255, 255)\n      utof r13.xyzw, r13.xyzw\n      mul r12.xyzw, r13.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n      ushr r13.yzw, r11.zzzz, l(0, 8, 16, 24)\n      mov r13.x, r11.z\n      and r13.xyzw, r13.xyzw, l(255, 255, 255, 255)\n      utof r13.xyzw, r13.xyzw\n      mul r10.xyzw, r13.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n      ushr r13.yzw, r11.wwww, l(0, 8, 16, 24)\n      mov r13.x, r11.w\n      and r13.xyzw, r13.xyzw, l(255, 255, 255, 255)\n      utof r13.xyzw, r13.xyzw\n      mul r14.xyzw, r13.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n      ushr r11.yzw, r11.xxxx, l(0, 8, 16, 24)\n      and r13.xyzw, r11.xyzw, l(255, 255, 255, 255)\n      utof r13.xyzw, r13.xyzw\n      mul r11.xyzw, r13.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n      break \n      case l(2)\n      case l(10)\n      ushr r13.yzw, r11.yyyy, l(0, 10, 20, 30)\n      mov r13.x, r11.y\n      and r13.xyzw, r13.xyzw, l(1023, 1023, 1023, 3)\n      utof r13.xyzw, r13.xyzw\n      mul r12.xyzw, r13.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n      ushr r13.yzw, r11.zzzz, l(0, 10, 20, 30)\n      mov r13.x, r11.z\n      and r13.xyzw, r13.xyzw, l(1023, 1023, 1023, 3)\n      utof r13.xyzw, r13.xyzw\n      mul r10.xyzw, r13.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n      ushr r13.yzw, r11.wwww, l(0, 10, 20, 30)\n      mov r13.x, r11.w\n      and r13.xyzw, r13.xyzw, l(1023, 1023, 1023, 3)\n      utof r13.xyzw, r13.xyzw\n      mul r14.xyzw, r13.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n      ushr r11.yzw, r11.xxxx, l(0, 10, 20, 30)\n      and r13.xyzw, r11.xyzw, l(1023, 1023, 1023, 3)\n      utof r13.xyzw, r13.xyzw\n      mul r11.xyzw, r13.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n      break \n      case l(3)\n      case l(12)\n      ushr r13.xyzw, r11.yyyz, l(10, 20, 30, 30)\n      mov r15.x, r11.y\n      mov r15.yz, r13.xxyx\n      and r16.xyz, r15.xyzx, l(1023, 1023, 1023, 0)\n      and r17.xyz, r15.xyzx, l(127, 127, 127, 0)\n      ubfe r18.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r15.xyzx\n      firstbit_hi r19.xyz, r17.xyzx\n      iadd r19.xyz, r19.xyzx, l(-24, -24, -24, 0)\n      movc r19.xyz, r17.xyzx, r19.xyzx, l(8,8,8,0)\n      iadd r20.xyz, -r19.xyzx, l(1, 1, 1, 0)\n      movc r20.xyz, r18.xyzx, r18.xyzx, r20.xyzx\n      bfi r15.xyz, l(7, 7, 7, 0), r19.xyzx, r15.xyzx, l(0, 0, 0, 0)\n      and r15.xyz, r15.xyzx, l(127, 127, 127, 0)\n      movc r15.xyz, r18.xyzx, r17.xyzx, r15.xyzx\n      ishl r17.xyz, r20.xyzx, l(23, 23, 23, 0)\n      iadd r17.xyz, r17.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n      ishl r15.xyz, r15.xyzx, l(16, 16, 16, 0)\n      iadd r15.xyz, r17.xyzx, r15.xyzx\n      movc r12.xyz, r16.xyzx, r15.xyzx, l(0,0,0,0)\n      utof r13.xy, r13.zwzz\n      ushr r15.xyzw, r11.zwwz, l(10, 10, 20, 20)\n      mov r16.x, r11.z\n      mov r16.yz, r15.xxwx\n      and r17.xyz, r16.xyzx, l(1023, 1023, 1023, 0)\n      and r18.xyz, r16.xyzx, l(127, 127, 127, 0)\n      ubfe r19.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r16.xyzx\n      firstbit_hi r20.xyz, r18.xyzx\n      iadd r20.xyz, r20.xyzx, l(-24, -24, -24, 0)\n      movc r20.xyz, r18.xyzx, r20.xyzx, l(8,8,8,0)\n      iadd r21.xyz, -r20.xyzx, l(1, 1, 1, 0)\n      movc r21.xyz, r19.xyzx, r19.xyzx, r21.xyzx\n      bfi r16.xyz, l(7, 7, 7, 0), r20.xyzx, r16.xyzx, l(0, 0, 0, 0)\n      and r16.xyz, r16.xyzx, l(127, 127, 127, 0)\n      movc r16.xyz, r19.xyzx, r18.xyzx, r16.xyzx\n      ishl r18.xyz, r21.xyzx, l(23, 23, 23, 0)\n      iadd r18.xyz, r18.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n      ishl r16.xyz, r16.xyzx, l(16, 16, 16, 0)\n      iadd r16.xyz, r18.xyzx, r16.xyzx\n      movc r10.xyz, r17.xyzx, r16.xyzx, l(0,0,0,0)\n      mov r15.x, r11.w\n      and r16.xyz, r15.xyzx, l(1023, 1023, 1023, 0)\n      and r17.xyz, r15.xyzx, l(127, 127, 127, 0)\n      ubfe r18.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r15.xyzx\n      firstbit_hi r19.xyz, r17.xyzx\n      iadd r19.xyz, r19.xyzx, l(-24, -24, -24, 0)\n      movc r19.xyz, r17.xyzx, r19.xyzx, l(8,8,8,0)\n      iadd r20.xyz, -r19.xyzx, l(1, 1, 1, 0)\n      movc r20.xyz, r18.xyzx, r18.xyzx, r20.xyzx\n      bfi r15.xyz, l(7, 7, 7, 0), r19.xyzx, r15.xyzx, l(0, 0, 0, 0)\n      and r15.xyz, r15.xyzx, l(127, 127, 127, 0)\n      movc r15.xyz, r18.xyzx, r17.xyzx, r15.xyzx\n      ishl r17.xyz, r20.xyzx, l(23, 23, 23, 0)\n      iadd r17.xyz, r17.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n      ishl r15.xyz, r15.xyzx, l(16, 16, 16, 0)\n      iadd r15.xyz, r17.xyzx, r15.xyzx\n      movc r14.xyz, r16.xyzx, r15.xyzx, l(0,0,0,0)\n      ushr r15.xyzw, r11.wxxx, l(30, 10, 20, 30)\n      utof r13.zw, r15.xxxw\n      mov r15.x, r11.x\n      and r16.xyz, r15.xyzx, l(1023, 1023, 1023, 0)\n      and r17.xyz, r15.xyzx, l(127, 127, 127, 0)\n      ubfe r18.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r15.xyzx\n      firstbit_hi r19.xyz, r17.xyzx\n      iadd r19.xyz, r19.xyzx, l(-24, -24, -24, 0)\n      movc r19.xyz, r17.xyzx, r19.xyzx, l(8,8,8,0)\n      iadd r20.xyz, -r19.xyzx, l(1, 1, 1, 0)\n      movc r20.xyz, r18.xyzx, r18.xyzx, r20.xyzx\n      bfi r15.xyz, l(7, 7, 7, 0), r19.xyzx, r15.xyzx, l(0, 0, 0, 0)\n      and r15.xyz, r15.xyzx, l(127, 127, 127, 0)\n      movc r15.xyz, r18.xyzx, r17.xyzx, r15.xyzx\n      ishl r17.xyz, r20.xyzx, l(23, 23, 23, 0)\n      iadd r17.xyz, r17.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n      ishl r15.xyz, r15.xyzx, l(16, 16, 16, 0)\n      iadd r15.xyz, r17.xyzx, r15.xyzx\n      movc r11.xyz, r16.xyzx, r15.xyzx, l(0,0,0,0)\n      mul r13.xyzw, r13.xyzw, l(0.333333, 0.333333, 0.333333, 0.333333)\n      mov r12.w, r13.x\n      mov r10.w, r13.y\n      mov r14.w, r13.z\n      mov r11.w, r13.w\n      break \n      case l(4)\n      ishl r13.xyzw, r11.yzwx, l(16, 16, 16, 16)\n      mov r15.xz, r13.xxyx\n      mov r15.yw, r11.yyyz\n      ishr r15.xyzw, r15.xyzw, l(16, 16, 16, 16)\n      itof r15.xyzw, r15.xyzw\n      mul r15.xyzw, r15.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n      max r12.xy, r15.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n      max r10.xy, r15.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n      mov r11.yz, r13.zzwz\n      ishr r13.xyzw, r11.ywzx, l(16, 16, 16, 16)\n      itof r13.xyzw, r13.xyzw\n      mul r13.xyzw, r13.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n      max r14.xy, r13.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n      max r11.xy, r13.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n      mov r12.zw, l(0,0,0,0)\n      mov r10.zw, l(0,0,0,0)\n      mov r14.zw, l(0,0,0,0)\n      mov r11.zw, l(0,0,0,0)\n      break \n      case l(6)\n      ushr r13.xyzw, r11.yzwx, l(16, 16, 16, 16)\n      f16tof32 r12.x, r11.y\n      f16tof32 r12.y, r13.x\n      f16tof32 r10.x, r11.z\n      f16tof32 r10.y, r13.y\n      f16tof32 r14.x, r11.w\n      f16tof32 r14.y, r13.z\n      f16tof32 r11.x, r11.x\n      f16tof32 r11.y, r13.w\n      mov r12.zw, l(0,0,0,0)\n      mov r10.zw, l(0,0,0,0)\n      mov r14.zw, l(0,0,0,0)\n      mov r11.zw, l(0,0,0,0)\n      break \n      default \n      mov r12.x, r11.y\n      mov r12.yzw, l(0,0,0,0)\n      mov r10.x, r11.z\n      mov r10.yzw, l(0,0,0,0)\n      mov r14.x, r11.w\n      mov r14.yzw, l(0,0,0,0)\n      mov r11.yzw, l(0,0,0,0)\n      break \n    endswitch \n  endif \n  add r8.xyzw, r8.xyzw, r12.xyzw\n  add r6.xyzw, r6.xyzw, r10.xyzw\n  add r9.xyzw, r9.xyzw, r14.xyzw\n  add r7.xyzw, r7.xyzw, r11.xyzw\n  uge r2.y, r2.y, l(6)\n  if_nz r2.y\n    ishl r2.y, l(4), r5.w\n    mul r1.w, r1.w, l(0.250000)\n    iadd r0.x, r0.x, r2.y\n    if_nz r5.w\n      ieq r5.y, r1.z, l(8)\n      if_nz r5.y\n        ld_raw r10.xyzw, r0.x, T0[0].zwxy\n        iadd r5.y, r0.x, l(16)\n        ld_raw r11.xyzw, r5.y, T0[0].zwxy\n        mov r12.xy, r10.zwzz\n        mov r14.xy, r11.zwzz\n      else \n        ld_raw r12.xy, r0.x, T0[0].xyxx\n        iadd r5.y, r1.z, r0.x\n        ld_raw r10.xy, r5.y, T0[0].xyxx\n        ishl r13.xy, l(8, 12, 0, 0), r1.yyyy\n        iadd r13.xy, r0.xxxx, r13.xyxx\n        ld_raw r14.xy, r13.x, T0[0].xyxx\n        ld_raw r11.xy, r13.y, T0[0].xyxx\n      endif \n      switch r5.z\n        case l(5)\n        ishl r12.zw, r12.xxxy, l(0, 0, 16, 16)\n        ishr r13.xyzw, r12.zxwy, l(16, 16, 16, 16)\n        itof r13.xyzw, r13.xyzw\n        mul r13.xyzw, r13.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r12.xyzw, r13.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        ishl r10.zw, r10.xxxy, l(0, 0, 16, 16)\n        ishr r13.xyzw, r10.zxwy, l(16, 16, 16, 16)\n        itof r13.xyzw, r13.xyzw\n        mul r13.xyzw, r13.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r10.xyzw, r13.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        ishl r14.zw, r14.xxxy, l(0, 0, 16, 16)\n        ishr r13.xyzw, r14.zxwy, l(16, 16, 16, 16)\n        itof r13.xyzw, r13.xyzw\n        mul r13.xyzw, r13.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r14.xyzw, r13.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        ishl r11.zw, r11.xxxy, l(0, 0, 16, 16)\n        ishr r13.xyzw, r11.zxwy, l(16, 16, 16, 16)\n        itof r13.xyzw, r13.xyzw\n        mul r13.xyzw, r13.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r11.xyzw, r13.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        break \n        case l(7)\n        ushr r13.xy, r12.xyxx, l(16, 16, 0, 0)\n        f16tof32 r12.xz, r12.xxyx\n        f16tof32 r12.yw, r13.xxxy\n        ushr r13.xy, r10.xyxx, l(16, 16, 0, 0)\n        f16tof32 r10.xz, r10.xxyx\n        f16tof32 r10.yw, r13.xxxy\n        ushr r13.xy, r14.xyxx, l(16, 16, 0, 0)\n        f16tof32 r14.xz, r14.xxyx\n        f16tof32 r14.yw, r13.xxxy\n        ushr r13.xy, r11.xyxx, l(16, 16, 0, 0)\n        f16tof32 r11.xz, r11.xxyx\n        f16tof32 r11.yw, r13.xxxy\n        break \n        default \n        mov r12.zw, l(0,0,0,0)\n        mov r10.zw, l(0,0,0,0)\n        mov r14.zw, l(0,0,0,0)\n        mov r11.zw, l(0,0,0,0)\n        break \n      endswitch \n    else \n      ieq r5.y, r1.z, l(4)\n      if_nz r5.y\n        ld_raw r11.xyzw, r0.x, T0[0].wxyz\n      else \n        ld_raw r11.y, r0.x, T0[0].xxxx\n        iadd r5.y, r1.z, r0.x\n        ld_raw r11.z, r5.y, T0[0].xxxx\n        ishl r13.xy, l(8, 12, 0, 0), r1.yyyy\n        iadd r13.xy, r0.xxxx, r13.xyxx\n        ld_raw r11.w, r13.x, T0[0].xxxx\n        ld_raw r11.x, r13.y, T0[0].xxxx\n      endif \n      switch r5.z\n        case l(0)\n        case l(1)\n        ushr r13.yzw, r11.yyyy, l(0, 8, 16, 24)\n        mov r13.x, r11.y\n        and r13.xyzw, r13.xyzw, l(255, 255, 255, 255)\n        utof r13.xyzw, r13.xyzw\n        mul r12.xyzw, r13.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        ushr r13.yzw, r11.zzzz, l(0, 8, 16, 24)\n        mov r13.x, r11.z\n        and r13.xyzw, r13.xyzw, l(255, 255, 255, 255)\n        utof r13.xyzw, r13.xyzw\n        mul r10.xyzw, r13.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        ushr r13.yzw, r11.wwww, l(0, 8, 16, 24)\n        mov r13.x, r11.w\n        and r13.xyzw, r13.xyzw, l(255, 255, 255, 255)\n        utof r13.xyzw, r13.xyzw\n        mul r14.xyzw, r13.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        ushr r11.yzw, r11.xxxx, l(0, 8, 16, 24)\n        and r13.xyzw, r11.xyzw, l(255, 255, 255, 255)\n        utof r13.xyzw, r13.xyzw\n        mul r11.xyzw, r13.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        break \n        case l(2)\n        case l(10)\n        ushr r13.yzw, r11.yyyy, l(0, 10, 20, 30)\n        mov r13.x, r11.y\n        and r13.xyzw, r13.xyzw, l(1023, 1023, 1023, 3)\n        utof r13.xyzw, r13.xyzw\n        mul r12.xyzw, r13.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        ushr r13.yzw, r11.zzzz, l(0, 10, 20, 30)\n        mov r13.x, r11.z\n        and r13.xyzw, r13.xyzw, l(1023, 1023, 1023, 3)\n        utof r13.xyzw, r13.xyzw\n        mul r10.xyzw, r13.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        ushr r13.yzw, r11.wwww, l(0, 10, 20, 30)\n        mov r13.x, r11.w\n        and r13.xyzw, r13.xyzw, l(1023, 1023, 1023, 3)\n        utof r13.xyzw, r13.xyzw\n        mul r14.xyzw, r13.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        ushr r11.yzw, r11.xxxx, l(0, 10, 20, 30)\n        and r13.xyzw, r11.xyzw, l(1023, 1023, 1023, 3)\n        utof r13.xyzw, r13.xyzw\n        mul r11.xyzw, r13.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        break \n        case l(3)\n        case l(12)\n        ushr r13.xyzw, r11.yyyz, l(10, 20, 30, 30)\n        mov r15.x, r11.y\n        mov r15.yz, r13.xxyx\n        and r16.xyz, r15.xyzx, l(1023, 1023, 1023, 0)\n        and r17.xyz, r15.xyzx, l(127, 127, 127, 0)\n        ubfe r18.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r15.xyzx\n        firstbit_hi r19.xyz, r17.xyzx\n        iadd r19.xyz, r19.xyzx, l(-24, -24, -24, 0)\n        movc r19.xyz, r17.xyzx, r19.xyzx, l(8,8,8,0)\n        iadd r20.xyz, -r19.xyzx, l(1, 1, 1, 0)\n        movc r20.xyz, r18.xyzx, r18.xyzx, r20.xyzx\n        bfi r15.xyz, l(7, 7, 7, 0), r19.xyzx, r15.xyzx, l(0, 0, 0, 0)\n        and r15.xyz, r15.xyzx, l(127, 127, 127, 0)\n        movc r15.xyz, r18.xyzx, r17.xyzx, r15.xyzx\n        ishl r17.xyz, r20.xyzx, l(23, 23, 23, 0)\n        iadd r17.xyz, r17.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r15.xyz, r15.xyzx, l(16, 16, 16, 0)\n        iadd r15.xyz, r17.xyzx, r15.xyzx\n        movc r12.xyz, r16.xyzx, r15.xyzx, l(0,0,0,0)\n        utof r13.xy, r13.zwzz\n        ushr r15.xyzw, r11.zwwz, l(10, 10, 20, 20)\n        mov r16.x, r11.z\n        mov r16.yz, r15.xxwx\n        and r17.xyz, r16.xyzx, l(1023, 1023, 1023, 0)\n        and r18.xyz, r16.xyzx, l(127, 127, 127, 0)\n        ubfe r19.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r16.xyzx\n        firstbit_hi r20.xyz, r18.xyzx\n        iadd r20.xyz, r20.xyzx, l(-24, -24, -24, 0)\n        movc r20.xyz, r18.xyzx, r20.xyzx, l(8,8,8,0)\n        iadd r21.xyz, -r20.xyzx, l(1, 1, 1, 0)\n        movc r21.xyz, r19.xyzx, r19.xyzx, r21.xyzx\n        bfi r16.xyz, l(7, 7, 7, 0), r20.xyzx, r16.xyzx, l(0, 0, 0, 0)\n        and r16.xyz, r16.xyzx, l(127, 127, 127, 0)\n        movc r16.xyz, r19.xyzx, r18.xyzx, r16.xyzx\n        ishl r18.xyz, r21.xyzx, l(23, 23, 23, 0)\n        iadd r18.xyz, r18.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r16.xyz, r16.xyzx, l(16, 16, 16, 0)\n        iadd r16.xyz, r18.xyzx, r16.xyzx\n        movc r10.xyz, r17.xyzx, r16.xyzx, l(0,0,0,0)\n        mov r15.x, r11.w\n        and r16.xyz, r15.xyzx, l(1023, 1023, 1023, 0)\n        and r17.xyz, r15.xyzx, l(127, 127, 127, 0)\n        ubfe r18.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r15.xyzx\n        firstbit_hi r19.xyz, r17.xyzx\n        iadd r19.xyz, r19.xyzx, l(-24, -24, -24, 0)\n        movc r19.xyz, r17.xyzx, r19.xyzx, l(8,8,8,0)\n        iadd r20.xyz, -r19.xyzx, l(1, 1, 1, 0)\n        movc r20.xyz, r18.xyzx, r18.xyzx, r20.xyzx\n        bfi r15.xyz, l(7, 7, 7, 0), r19.xyzx, r15.xyzx, l(0, 0, 0, 0)\n        and r15.xyz, r15.xyzx, l(127, 127, 127, 0)\n        movc r15.xyz, r18.xyzx, r17.xyzx, r15.xyzx\n        ishl r17.xyz, r20.xyzx, l(23, 23, 23, 0)\n        iadd r17.xyz, r17.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r15.xyz, r15.xyzx, l(16, 16, 16, 0)\n        iadd r15.xyz, r17.xyzx, r15.xyzx\n        movc r14.xyz, r16.xyzx, r15.xyzx, l(0,0,0,0)\n        ushr r15.xyzw, r11.wxxx, l(30, 10, 20, 30)\n        utof r13.zw, r15.xxxw\n        mov r15.x, r11.x\n        and r16.xyz, r15.xyzx, l(1023, 1023, 1023, 0)\n        and r17.xyz, r15.xyzx, l(127, 127, 127, 0)\n        ubfe r18.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r15.xyzx\n        firstbit_hi r19.xyz, r17.xyzx\n        iadd r19.xyz, r19.xyzx, l(-24, -24, -24, 0)\n        movc r19.xyz, r17.xyzx, r19.xyzx, l(8,8,8,0)\n        iadd r20.xyz, -r19.xyzx, l(1, 1, 1, 0)\n        movc r20.xyz, r18.xyzx, r18.xyzx, r20.xyzx\n        bfi r15.xyz, l(7, 7, 7, 0), r19.xyzx, r15.xyzx, l(0, 0, 0, 0)\n        and r15.xyz, r15.xyzx, l(127, 127, 127, 0)\n        movc r15.xyz, r18.xyzx, r17.xyzx, r15.xyzx\n        ishl r17.xyz, r20.xyzx, l(23, 23, 23, 0)\n        iadd r17.xyz, r17.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r15.xyz, r15.xyzx, l(16, 16, 16, 0)\n        iadd r15.xyz, r17.xyzx, r15.xyzx\n        movc r11.xyz, r16.xyzx, r15.xyzx, l(0,0,0,0)\n        mul r13.xyzw, r13.xyzw, l(0.333333, 0.333333, 0.333333, 0.333333)\n        mov r12.w, r13.x\n        mov r10.w, r13.y\n        mov r14.w, r13.z\n        mov r11.w, r13.w\n        break \n        case l(4)\n        ishl r13.xyzw, r11.yzwx, l(16, 16, 16, 16)\n        mov r15.xz, r13.xxyx\n        mov r15.yw, r11.yyyz\n        ishr r15.xyzw, r15.xyzw, l(16, 16, 16, 16)\n        itof r15.xyzw, r15.xyzw\n        mul r15.xyzw, r15.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r12.xy, r15.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        max r10.xy, r15.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        mov r11.yz, r13.zzwz\n        ishr r13.xyzw, r11.ywzx, l(16, 16, 16, 16)\n        itof r13.xyzw, r13.xyzw\n        mul r13.xyzw, r13.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r14.xy, r13.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        max r11.xy, r13.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        mov r12.zw, l(0,0,0,0)\n        mov r10.zw, l(0,0,0,0)\n        mov r14.zw, l(0,0,0,0)\n        mov r11.zw, l(0,0,0,0)\n        break \n        case l(6)\n        ushr r13.xyzw, r11.yzwx, l(16, 16, 16, 16)\n        f16tof32 r12.x, r11.y\n        f16tof32 r12.y, r13.x\n        f16tof32 r10.x, r11.z\n        f16tof32 r10.y, r13.y\n        f16tof32 r14.x, r11.w\n        f16tof32 r14.y, r13.z\n        f16tof32 r11.x, r11.x\n        f16tof32 r11.y, r13.w\n        mov r12.zw, l(0,0,0,0)\n        mov r10.zw, l(0,0,0,0)\n        mov r14.zw, l(0,0,0,0)\n        mov r11.zw, l(0,0,0,0)\n        break \n        default \n        mov r12.x, r11.y\n        mov r12.yzw, l(0,0,0,0)\n        mov r10.x, r11.z\n        mov r10.yzw, l(0,0,0,0)\n        mov r14.x, r11.w\n        mov r14.yzw, l(0,0,0,0)\n        mov r11.yzw, l(0,0,0,0)\n        break \n      endswitch \n    endif \n    add r12.xyzw, r8.xyzw, r12.xyzw\n    add r10.xyzw, r6.xyzw, r10.xyzw\n    add r13.xyzw, r9.xyzw, r14.xyzw\n    add r11.xyzw, r7.xyzw, r11.xyzw\n    iadd r0.x, r2.y, r5.x\n    if_nz r5.w\n      ieq r2.y, r1.z, l(8)\n      if_nz r2.y\n        ld_raw r14.xyzw, r0.x, T0[0].zwxy\n        iadd r2.y, r0.x, l(16)\n        ld_raw r15.xyzw, r2.y, T0[0].zwxy\n        mov r16.xy, r14.zwzz\n        mov r17.xy, r15.zwzz\n      else \n        ld_raw r16.xy, r0.x, T0[0].xyxx\n        iadd r2.y, r1.z, r0.x\n        ld_raw r14.xy, r2.y, T0[0].xyxx\n        ishl r5.xy, l(8, 12, 0, 0), r1.yyyy\n        iadd r5.xy, r0.xxxx, r5.xyxx\n        ld_raw r17.xy, r5.x, T0[0].xyxx\n        ld_raw r15.xy, r5.y, T0[0].xyxx\n      endif \n      switch r5.z\n        case l(5)\n        ishl r16.zw, r16.xxxy, l(0, 0, 16, 16)\n        ishr r18.xyzw, r16.zxwy, l(16, 16, 16, 16)\n        itof r18.xyzw, r18.xyzw\n        mul r18.xyzw, r18.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r16.xyzw, r18.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        ishl r14.zw, r14.xxxy, l(0, 0, 16, 16)\n        ishr r18.xyzw, r14.zxwy, l(16, 16, 16, 16)\n        itof r18.xyzw, r18.xyzw\n        mul r18.xyzw, r18.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r14.xyzw, r18.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        ishl r17.zw, r17.xxxy, l(0, 0, 16, 16)\n        ishr r18.xyzw, r17.zxwy, l(16, 16, 16, 16)\n        itof r18.xyzw, r18.xyzw\n        mul r18.xyzw, r18.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r17.xyzw, r18.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        ishl r15.zw, r15.xxxy, l(0, 0, 16, 16)\n        ishr r18.xyzw, r15.zxwy, l(16, 16, 16, 16)\n        itof r18.xyzw, r18.xyzw\n        mul r18.xyzw, r18.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r15.xyzw, r18.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        break \n        case l(7)\n        ushr r5.xy, r16.xyxx, l(16, 16, 0, 0)\n        f16tof32 r16.xz, r16.xxyx\n        f16tof32 r16.yw, r5.xxxy\n        ushr r5.xy, r14.xyxx, l(16, 16, 0, 0)\n        f16tof32 r14.xz, r14.xxyx\n        f16tof32 r14.yw, r5.xxxy\n        ushr r5.xy, r17.xyxx, l(16, 16, 0, 0)\n        f16tof32 r17.xz, r17.xxyx\n        f16tof32 r17.yw, r5.xxxy\n        ushr r5.xy, r15.xyxx, l(16, 16, 0, 0)\n        f16tof32 r15.xz, r15.xxyx\n        f16tof32 r15.yw, r5.xxxy\n        break \n        default \n        mov r16.zw, l(0,0,0,0)\n        mov r14.zw, l(0,0,0,0)\n        mov r17.zw, l(0,0,0,0)\n        mov r15.zw, l(0,0,0,0)\n        break \n      endswitch \n    else \n      ieq r2.y, r1.z, l(4)\n      if_nz r2.y\n        ld_raw r15.xyzw, r0.x, T0[0].wxyz\n      else \n        ld_raw r15.y, r0.x, T0[0].xxxx\n        iadd r1.z, r1.z, r0.x\n        ld_raw r15.z, r1.z, T0[0].xxxx\n        ishl r1.yz, l(0, 8, 12, 0), r1.yyyy\n        iadd r1.yz, r0.xxxx, r1.yyzy\n        ld_raw r15.w, r1.y, T0[0].xxxx\n        ld_raw r15.x, r1.z, T0[0].xxxx\n      endif \n      switch r5.z\n        case l(0)\n        case l(1)\n        ushr r5.yzw, r15.yyyy, l(0, 8, 16, 24)\n        mov r5.x, r15.y\n        and r5.xyzw, r5.xyzw, l(255, 255, 255, 255)\n        utof r5.xyzw, r5.xyzw\n        mul r16.xyzw, r5.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        ushr r5.yzw, r15.zzzz, l(0, 8, 16, 24)\n        mov r5.x, r15.z\n        and r5.xyzw, r5.xyzw, l(255, 255, 255, 255)\n        utof r5.xyzw, r5.xyzw\n        mul r14.xyzw, r5.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        ushr r5.yzw, r15.wwww, l(0, 8, 16, 24)\n        mov r5.x, r15.w\n        and r5.xyzw, r5.xyzw, l(255, 255, 255, 255)\n        utof r5.xyzw, r5.xyzw\n        mul r17.xyzw, r5.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        ushr r15.yzw, r15.xxxx, l(0, 8, 16, 24)\n        and r5.xyzw, r15.xyzw, l(255, 255, 255, 255)\n        utof r5.xyzw, r5.xyzw\n        mul r15.xyzw, r5.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        break \n        case l(2)\n        case l(10)\n        ushr r5.yzw, r15.yyyy, l(0, 10, 20, 30)\n        mov r5.x, r15.y\n        and r5.xyzw, r5.xyzw, l(1023, 1023, 1023, 3)\n        utof r5.xyzw, r5.xyzw\n        mul r16.xyzw, r5.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        ushr r5.yzw, r15.zzzz, l(0, 10, 20, 30)\n        mov r5.x, r15.z\n        and r5.xyzw, r5.xyzw, l(1023, 1023, 1023, 3)\n        utof r5.xyzw, r5.xyzw\n        mul r14.xyzw, r5.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        ushr r5.yzw, r15.wwww, l(0, 10, 20, 30)\n        mov r5.x, r15.w\n        and r5.xyzw, r5.xyzw, l(1023, 1023, 1023, 3)\n        utof r5.xyzw, r5.xyzw\n        mul r17.xyzw, r5.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        ushr r15.yzw, r15.xxxx, l(0, 10, 20, 30)\n        and r5.xyzw, r15.xyzw, l(1023, 1023, 1023, 3)\n        utof r5.xyzw, r5.xyzw\n        mul r15.xyzw, r5.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        break \n        case l(3)\n        case l(12)\n        ushr r5.xyzw, r15.yyyz, l(10, 20, 30, 30)\n        mov r18.x, r15.y\n        mov r18.yz, r5.xxyx\n        and r19.xyz, r18.xyzx, l(1023, 1023, 1023, 0)\n        and r20.xyz, r18.xyzx, l(127, 127, 127, 0)\n        ubfe r21.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r18.xyzx\n        firstbit_hi r22.xyz, r20.xyzx\n        iadd r22.xyz, r22.xyzx, l(-24, -24, -24, 0)\n        movc r22.xyz, r20.xyzx, r22.xyzx, l(8,8,8,0)\n        iadd r23.xyz, -r22.xyzx, l(1, 1, 1, 0)\n        movc r23.xyz, r21.xyzx, r21.xyzx, r23.xyzx\n        bfi r18.xyz, l(7, 7, 7, 0), r22.xyzx, r18.xyzx, l(0, 0, 0, 0)\n        and r18.xyz, r18.xyzx, l(127, 127, 127, 0)\n        movc r18.xyz, r21.xyzx, r20.xyzx, r18.xyzx\n        ishl r20.xyz, r23.xyzx, l(23, 23, 23, 0)\n        iadd r20.xyz, r20.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r18.xyz, r18.xyzx, l(16, 16, 16, 0)\n        iadd r18.xyz, r20.xyzx, r18.xyzx\n        movc r16.xyz, r19.xyzx, r18.xyzx, l(0,0,0,0)\n        utof r1.yz, r5.zzwz\n        ushr r5.xyzw, r15.zwwz, l(10, 10, 20, 20)\n        mov r18.x, r15.z\n        mov r18.yz, r5.xxwx\n        and r19.xyz, r18.xyzx, l(1023, 1023, 1023, 0)\n        and r20.xyz, r18.xyzx, l(127, 127, 127, 0)\n        ubfe r21.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r18.xyzx\n        firstbit_hi r22.xyz, r20.xyzx\n        iadd r22.xyz, r22.xyzx, l(-24, -24, -24, 0)\n        movc r22.xyz, r20.xyzx, r22.xyzx, l(8,8,8,0)\n        iadd r23.xyz, -r22.xyzx, l(1, 1, 1, 0)\n        movc r23.xyz, r21.xyzx, r21.xyzx, r23.xyzx\n        bfi r18.xyz, l(7, 7, 7, 0), r22.xyzx, r18.xyzx, l(0, 0, 0, 0)\n        and r18.xyz, r18.xyzx, l(127, 127, 127, 0)\n        movc r18.xyz, r21.xyzx, r20.xyzx, r18.xyzx\n        ishl r20.xyz, r23.xyzx, l(23, 23, 23, 0)\n        iadd r20.xyz, r20.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r18.xyz, r18.xyzx, l(16, 16, 16, 0)\n        iadd r18.xyz, r20.xyzx, r18.xyzx\n        movc r14.xyz, r19.xyzx, r18.xyzx, l(0,0,0,0)\n        mul r1.yz, r1.yyzy, l(0.000000, 0.333333, 0.333333, 0.000000)\n        mov r5.x, r15.w\n        and r18.xyz, r5.xyzx, l(1023, 1023, 1023, 0)\n        and r19.xyz, r5.xyzx, l(127, 127, 127, 0)\n        ubfe r20.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r5.xyzx\n        firstbit_hi r21.xyz, r19.xyzx\n        iadd r21.xyz, r21.xyzx, l(-24, -24, -24, 0)\n        movc r21.xyz, r19.xyzx, r21.xyzx, l(8,8,8,0)\n        iadd r22.xyz, -r21.xyzx, l(1, 1, 1, 0)\n        movc r22.xyz, r20.xyzx, r20.xyzx, r22.xyzx\n        bfi r5.xyz, l(7, 7, 7, 0), r21.xyzx, r5.xyzx, l(0, 0, 0, 0)\n        and r5.xyz, r5.xyzx, l(127, 127, 127, 0)\n        movc r5.xyz, r20.xyzx, r19.xyzx, r5.xyzx\n        ishl r19.xyz, r22.xyzx, l(23, 23, 23, 0)\n        iadd r19.xyz, r19.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r5.xyz, r5.xyzx, l(16, 16, 16, 0)\n        iadd r5.xyz, r19.xyzx, r5.xyzx\n        movc r17.xyz, r18.xyzx, r5.xyzx, l(0,0,0,0)\n        ushr r5.xyzw, r15.wxxx, l(30, 10, 20, 30)\n        utof r18.xy, r5.xwxx\n        mov r5.x, r15.x\n        and r19.xyz, r5.xyzx, l(1023, 1023, 1023, 0)\n        and r20.xyz, r5.xyzx, l(127, 127, 127, 0)\n        ubfe r21.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r5.xyzx\n        firstbit_hi r22.xyz, r20.xyzx\n        iadd r22.xyz, r22.xyzx, l(-24, -24, -24, 0)\n        movc r22.xyz, r20.xyzx, r22.xyzx, l(8,8,8,0)\n        iadd r23.xyz, -r22.xyzx, l(1, 1, 1, 0)\n        movc r23.xyz, r21.xyzx, r21.xyzx, r23.xyzx\n        bfi r5.xyz, l(7, 7, 7, 0), r22.xyzx, r5.xyzx, l(0, 0, 0, 0)\n        and r5.xyz, r5.xyzx, l(127, 127, 127, 0)\n        movc r5.xyz, r21.xyzx, r20.xyzx, r5.xyzx\n        ishl r20.xyz, r23.xyzx, l(23, 23, 23, 0)\n        iadd r20.xyz, r20.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r5.xyz, r5.xyzx, l(16, 16, 16, 0)\n        iadd r5.xyz, r20.xyzx, r5.xyzx\n        movc r15.xyz, r19.xyzx, r5.xyzx, l(0,0,0,0)\n        mul r5.xy, r18.xyxx, l(0.333333, 0.333333, 0.000000, 0.000000)\n        mov r16.w, r1.y\n        mov r14.w, r1.z\n        mov r17.w, r5.x\n        mov r15.w, r5.y\n        break \n        case l(4)\n        ishl r5.xyzw, r15.yzwx, l(16, 16, 16, 16)\n        mov r18.xz, r5.xxyx\n        mov r18.yw, r15.yyyz\n        ishr r18.xyzw, r18.xyzw, l(16, 16, 16, 16)\n        itof r18.xyzw, r18.xyzw\n        mul r18.xyzw, r18.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r16.xy, r18.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        max r14.xy, r18.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        mov r15.yz, r5.zzwz\n        ishr r5.xyzw, r15.ywzx, l(16, 16, 16, 16)\n        itof r5.xyzw, r5.xyzw\n        mul r5.xyzw, r5.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r17.xy, r5.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        max r15.xy, r5.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        mov r16.zw, l(0,0,0,0)\n        mov r14.zw, l(0,0,0,0)\n        mov r17.zw, l(0,0,0,0)\n        mov r15.zw, l(0,0,0,0)\n        break \n        case l(6)\n        ushr r5.xyzw, r15.yzwx, l(16, 16, 16, 16)\n        f16tof32 r16.x, r15.y\n        f16tof32 r16.y, r5.x\n        f16tof32 r14.x, r15.z\n        f16tof32 r14.y, r5.y\n        f16tof32 r17.x, r15.w\n        f16tof32 r17.y, r5.z\n        f16tof32 r15.x, r15.x\n        f16tof32 r15.y, r5.w\n        mov r16.zw, l(0,0,0,0)\n        mov r14.zw, l(0,0,0,0)\n        mov r17.zw, l(0,0,0,0)\n        mov r15.zw, l(0,0,0,0)\n        break \n        default \n        mov r16.x, r15.y\n        mov r16.yzw, l(0,0,0,0)\n        mov r14.x, r15.z\n        mov r14.yzw, l(0,0,0,0)\n        mov r17.x, r15.w\n        mov r17.yzw, l(0,0,0,0)\n        mov r15.yzw, l(0,0,0,0)\n        break \n      endswitch \n    endif \n    add r8.xyzw, r12.xyzw, r16.xyzw\n    add r6.xyzw, r10.xyzw, r14.xyzw\n    add r9.xyzw, r13.xyzw, r17.xyzw\n    add r7.xyzw, r11.xyzw, r15.xyzw\n  else \n    mov r1.w, r2.w\n  endif \nendif \nmul r5.xyzw, r1.wwww, r8.xyzw\nmul r6.xyzw, r1.wwww, r6.xyzw\nmul r8.xyzw, r1.wwww, r9.xyzw\nmul r7.xyzw, r1.wwww, r7.xyzw\nif_nz r0.w\n  mov r5.xz, r5.zzxz\n  mov r6.xz, r6.zzxz\n  mov r8.xz, r8.zzxz\n  mov r7.xz, r7.zzxz\nendif \nswitch r2.x\n  case l(3)\n  mov_sat r5.xyzw, r5.xyzw\n  mad r9.xyzw, r5.xyzw, l(31.000000, 31.000000, 31.000000, 1.000000), l(0.500000, 0.500000, 0.500000, 0.500000)\n  ftou r9.xyzw, r9.xyzw\n  imad r1.y, r9.y, l(32), r9.x\n  imad r1.y, r9.z, l(1024), r1.y\n  imad r1.y, r9.w, l(0x00008000), r1.y\n  mov_sat r6.xyzw, r6.xyzw\n  mad r9.xyzw, r6.xyzw, l(31.000000, 31.000000, 31.000000, 1.000000), l(0.500000, 0.500000, 0.500000, 0.500000)\n  ftou r9.xyzw, r9.xyzw\n  imad r1.z, r9.y, l(32), r9.x\n  imad r1.z, r9.z, l(1024), r1.z\n  ishl r1.w, r9.w, l(31)\n  imad r1.z, r1.z, l(0x00010000), r1.w\n  iadd r0.x, r1.z, r1.y\n  mov_sat r8.xyzw, r8.xyzw\n  mad r9.xyzw, r8.xyzw, l(31.000000, 31.000000, 31.000000, 1.000000), l(0.500000, 0.500000, 0.500000, 0.500000)\n  ftou r9.xyzw, r9.xyzw\n  imad r1.y, r9.y, l(32), r9.x\n  imad r1.y, r9.z, l(1024), r1.y\n  imad r1.y, r9.w, l(0x00008000), r1.y\n  mov_sat r7.xyzw, r7.xyzw\n  mad r9.xyzw, r7.xyzw, l(31.000000, 31.000000, 31.000000, 1.000000), l(0.500000, 0.500000, 0.500000, 0.500000)\n  ftou r9.xyzw, r9.xyzw\n  imad r1.z, r9.y, l(32), r9.x\n  imad r1.z, r9.z, l(1024), r1.z\n  ishl r1.w, r9.w, l(31)\n  imad r1.z, r1.z, l(0x00010000), r1.w\n  iadd r0.w, r1.z, r1.y\n  break \n  case l(4)\n  mov_sat r5.xyz, r5.xyzx\n  mad r1.yzw, r5.xxyz, l(0.000000, 31.000000, 63.000000, 31.000000), l(0.000000, 0.500000, 0.500000, 0.500000)\n  ftou r1.yzw, r1.yyzw\n  imad r1.y, r1.z, l(32), r1.y\n  imad r1.y, r1.w, l(2048), r1.y\n  mov_sat r6.xyz, r6.xyzx\n  mad r2.xyw, r6.xyxz, l(31.000000, 63.000000, 0.000000, 31.000000), l(0.500000, 0.500000, 0.000000, 0.500000)\n  ftou r2.xyw, r2.xyxw\n  imad r1.z, r2.y, l(32), r2.x\n  ishl r1.w, r2.w, l(27)\n  imad r1.z, r1.z, l(0x00010000), r1.w\n  iadd r0.x, r1.z, r1.y\n  mov_sat r8.xyz, r8.xyzx\n  mad r1.yzw, r8.xxyz, l(0.000000, 31.000000, 63.000000, 31.000000), l(0.000000, 0.500000, 0.500000, 0.500000)\n  ftou r1.yzw, r1.yyzw\n  imad r1.y, r1.z, l(32), r1.y\n  imad r1.y, r1.w, l(2048), r1.y\n  mov_sat r7.xyz, r7.xyzx\n  mad r2.xyw, r7.xyxz, l(31.000000, 63.000000, 0.000000, 31.000000), l(0.500000, 0.500000, 0.000000, 0.500000)\n  ftou r2.xyw, r2.xyxw\n  imad r1.z, r2.y, l(32), r2.x\n  ishl r1.w, r2.w, l(27)\n  imad r1.z, r1.z, l(0x00010000), r1.w\n  iadd r0.w, r1.z, r1.y\n  break \n  case l(5)\n  mov_sat r5.xyz, r5.xyzx\n  mad r1.yzw, r5.xxyz, l(0.000000, 31.000000, 31.000000, 63.000000), l(0.000000, 0.500000, 0.500000, 0.500000)\n  ftou r1.yzw, r1.yyzw\n  imad r1.y, r1.z, l(32), r1.y\n  imad r1.y, r1.w, l(1024), r1.y\n  mov_sat r6.xyz, r6.xyzx\n  mad r2.xyw, r6.xyxz, l(31.000000, 31.000000, 0.000000, 63.000000), l(0.500000, 0.500000, 0.000000, 0.500000)\n  ftou r2.xyw, r2.xyxw\n  imad r1.z, r2.y, l(32), r2.x\n  ishl r1.w, r2.w, l(26)\n  imad r1.z, r1.z, l(0x00010000), r1.w\n  iadd r0.x, r1.z, r1.y\n  mov_sat r8.xyz, r8.xyzx\n  mad r1.yzw, r8.xxyz, l(0.000000, 31.000000, 31.000000, 63.000000), l(0.000000, 0.500000, 0.500000, 0.500000)\n  ftou r1.yzw, r1.yyzw\n  imad r1.y, r1.z, l(32), r1.y\n  imad r1.y, r1.w, l(1024), r1.y\n  mov_sat r7.xyz, r7.xyzx\n  mad r2.xyw, r7.xyxz, l(31.000000, 31.000000, 0.000000, 63.000000), l(0.500000, 0.500000, 0.000000, 0.500000)\n  ftou r2.xyw, r2.xyxw\n  imad r1.z, r2.y, l(32), r2.x\n  ishl r1.w, r2.w, l(26)\n  imad r1.z, r1.z, l(0x00010000), r1.w\n  iadd r0.w, r1.z, r1.y\n  break \n  case l(10)\n  mov_sat r5.xy, r5.xyxx\n  mov_sat r5.zw, r6.xxxy\n  mad r9.xyzw, r5.xyzw, l(255.000000, 255.000000, 255.000000, 255.000000), l(0.500000, 0.500000, 0.500000, 0.500000)\n  ftou r9.xyzw, r9.xyzw\n  imad r1.y, r9.y, l(256), r9.x\n  imad r1.y, r9.z, l(0x00010000), r1.y\n  imad r0.x, r9.w, l(0x01000000), r1.y\n  mov_sat r8.xy, r8.xyxx\n  mov_sat r8.zw, r7.xxxy\n  mad r9.xyzw, r8.xyzw, l(255.000000, 255.000000, 255.000000, 255.000000), l(0.500000, 0.500000, 0.500000, 0.500000)\n  ftou r9.xyzw, r9.xyzw\n  imad r1.y, r9.y, l(256), r9.x\n  imad r1.y, r9.z, l(0x00010000), r1.y\n  imad r0.w, r9.w, l(0x01000000), r1.y\n  break \n  case l(15)\n  mov_sat r5.xyzw, r5.xyzw\n  mad r9.xyzw, r5.xyzw, l(15.000000, 15.000000, 15.000000, 15.000000), l(0.500000, 0.500000, 0.500000, 0.500000)\n  ftou r9.xyzw, r9.xyzw\n  imad r1.y, r9.y, l(16), r9.x\n  imad r1.y, r9.z, l(256), r1.y\n  imad r1.y, r9.w, l(4096), r1.y\n  mov_sat r6.xyzw, r6.xyzw\n  mad r9.xyzw, r6.xyzw, l(15.000000, 15.000000, 15.000000, 15.000000), l(0.500000, 0.500000, 0.500000, 0.500000)\n  ftou r9.xyzw, r9.xyzw\n  imad r1.z, r9.y, l(16), r9.x\n  imad r1.z, r9.z, l(256), r1.z\n  ishl r1.w, r9.w, l(28)\n  imad r1.z, r1.z, l(0x00010000), r1.w\n  iadd r0.x, r1.z, r1.y\n  mov_sat r8.xyzw, r8.xyzw\n  mad r9.xyzw, r8.xyzw, l(15.000000, 15.000000, 15.000000, 15.000000), l(0.500000, 0.500000, 0.500000, 0.500000)\n  ftou r9.xyzw, r9.xyzw\n  imad r1.y, r9.y, l(16), r9.x\n  imad r1.y, r9.z, l(256), r1.y\n  imad r1.y, r9.w, l(4096), r1.y\n  mov_sat r7.xyzw, r7.xyzw\n  mad r9.xyzw, r7.xyzw, l(15.000000, 15.000000, 15.000000, 15.000000), l(0.500000, 0.500000, 0.500000, 0.500000)\n  ftou r9.xyzw, r9.xyzw\n  imad r1.z, r9.y, l(16), r9.x\n  imad r1.z, r9.z, l(256), r1.z\n  ishl r1.w, r9.w, l(28)\n  imad r1.z, r1.z, l(0x00010000), r1.w\n  iadd r0.w, r1.z, r1.y\n  break \n  case l(24)\n  mov_sat r7.z, r5.x\n  mov_sat r7.y, r6.x\n  mov_sat r7.w, r8.x\n  mov_sat r7.x, r7.x\n  mad r9.xyzw, r7.zywx, l(65535.000000, 65535.000000, 65535.000000, 65535.000000), l(0.500000, 0.500000, 0.500000, 0.500000)\n  ftou r9.xyzw, r9.xyzw\n  imad r0.xw, r9.yyyw, l(0x00010000, 0, 0, 0x00010000), r9.xxxz\n  break \n  default \n  f32tof16 r1.y, r5.x\n  f32tof16 r1.z, r6.x\n  imad r0.x, r1.z, l(0x00010000), r1.y\n  f32tof16 r1.y, r8.x\n  f32tof16 r1.z, r7.x\n  imad r0.w, r1.z, l(0x00010000), r1.y\n  break \nendswitch \niadd r3.xyzw, r3.xyzw, r4.xyzw\nif_nz r0.z\n  ubfe r0.z, l(3), l(4), CB0[0][0].z\n  bfi r1.y, l(10), l(1), r2.z, l(0)\n  ishr r1.z, r0.z, l(2)\n  ishr r2.xyzw, r3.wyww, l(4, 5, 1, 3)\n  imad r1.y, r1.z, r1.y, r2.x\n  imad r1.y, r1.y, r1.x, r2.y\n  bfi r2.xy, l(2, 2, 0, 0), l(5, 6, 0, 0), r0.zzzz, l(0, 0, 0, 0)\n  bfi r0.z, l(2), l(3), r2.z, l(0)\n  bfi r2.xy, l(5, 5, 0, 0), l(0, 1, 0, 0), r0.zzzz, r2.xyxx\n  bfi r2.xy, l(3, 3, 0, 0), l(0, 1, 0, 0), r3.yyyy, r2.xyxx\n  bfi r1.yw, l(0, 25, 0, 25), l(0, 7, 0, 8), r1.yyyy, r2.xxxy\n  xor r0.z, r1.z, r2.w\n  ubfe r1.z, l(2), l(3), r3.y\n  bfi r2.xy, l(1, 1, 0, 0), l(1, 11, 0, 0), r0.zzzz, l(0, 0, 0, 0)\n  xor r0.z, r1.z, r2.x\n  bfi r1.z, l(1), l(4), r3.w, l(0)\n  imad r0.z, r0.z, l(64), r1.z\n  iadd r0.z, r2.y, r0.z\n  bfi r0.z, l(4), l(0), r1.w, r0.z\n  ibfe r1.yzw, l(0, 28, 27, 24), l(0, 3, 4, 7), r1.yyyy\n  bfi r0.z, l(1), l(5), r1.y, r0.z\n  bfi r0.z, l(3), l(8), r1.z, r0.z\n  bfi r0.z, l(20), l(12), r1.w, r0.z\nelse \n  ishr r2.xyzw, r3.xyzw, l(5, 5, 1, 4)\n  imad r1.x, r2.x, r1.x, r2.y\n  bfi r1.yzw, l(0, 3, 3, 1), l(0, 3, 4, 11), r2.zzzw, l(0, 0, 0, 0)\n  bfi r1.yz, l(0, 3, 3, 0), l(0, 0, 1, 0), r3.yyyy, r1.yyzy\n  imad r1.xy, r1.xxxx, l(64, 128, 0, 0), r1.yzyy\n  ubfe r1.z, l(2), l(3), r3.y\n  ishr r2.x, r3.w, l(3)\n  bfi r2.x, l(1), l(1), r2.x, l(0)\n  xor r1.z, r1.z, r2.x\n  bfi r2.x, l(1), l(4), r3.w, l(0)\n  imad r1.z, r1.z, l(64), r2.x\n  iadd r1.z, r1.w, r1.z\n  bfi r1.y, l(4), l(0), r1.y, r1.z\n  ibfe r1.xzw, l(28, 0, 27, 24), l(3, 0, 4, 7), r1.xxxx\n  bfi r1.x, l(1), l(5), r1.x, r1.y\n  bfi r1.x, l(3), l(8), r1.z, r1.x\n  bfi r0.z, l(20), l(12), r1.w, r1.x\nendif \niadd r0.z, r0.z, CB0[0][1].x\nieq r0.y, r0.y, l(1)\nif_nz r0.y\n  ishl r1.xy, r0.xwxx, l(8, 8, 0, 0)\n  ushr r1.zw, r0.xxxw, l(0, 0, 8, 8)\n  and r1.xyzw, r1.xyzw, l(0xff00ff00, 0xff00ff00, 0x00ff00ff, 0x00ff00ff)\n  iadd r0.xw, r1.zzzw, r1.xxxy\nendif \nstore_raw U0[0].xy, r0.z, r0.xwxx\nret \n// Approximately 1281 instruction slots used\n#endif\n\nconst BYTE resolve_full_16bpp_cs[] =\n{\n     68,  88,  66,  67,  86, 108, \n    126, 178, 167,  22, 226,  99, \n    154,  58, 193, 125, 196, 229, \n     57, 101,   1,   0,   0,   0, \n    120, 156,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n    208,   2,   0,   0, 224,   2, \n      0,   0, 240,   2,   0,   0, \n    220, 155,   0,   0,  82,  68, \n     69,  70, 148,   2,   0,   0, \n      1,   0,   0,   0, 228,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    105,   2,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 197,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 213,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 114, 101, 115, \n    111, 108, 118, 101,  95, 101, \n    100, 114,  97, 109,   0, 120, \n    101,  95, 114, 101, 115, 111, \n    108, 118, 101,  95, 100, 101, \n    115, 116,   0, 112, 117, 115, \n    104,  95,  99, 111, 110, 115, \n    116, 115,  95, 120, 101,   0, \n    213,   0,   0,   0,   5,   0, \n      0,   0, 252,   0,   0,   0, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    196,   1,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 224,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,   4,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 224,   1,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  31,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    224,   1,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     52,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 224,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  84,   2, \n      0,   0,  16,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 224,   1,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 114, \n    101, 115, 111, 108, 118, 101, \n     95, 101, 100, 114,  97, 109, \n     95, 105, 110, 102, 111,   0, \n    100, 119, 111, 114, 100,   0, \n      0,   0,  19,   0,   1,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 218,   1,   0,   0, \n    120, 101,  95, 114, 101, 115, \n    111, 108, 118, 101,  95,  99, \n    111, 111, 114, 100, 105, 110, \n     97, 116, 101,  95, 105, 110, \n    102, 111,   0, 120, 101,  95, \n    114, 101, 115, 111, 108, 118, \n    101,  95, 100, 101, 115, 116, \n     95, 105, 110, 102, 111,   0, \n    120, 101,  95, 114, 101, 115, \n    111, 108, 118, 101,  95, 100, \n    101, 115, 116,  95,  99, 111, \n    111, 114, 100, 105, 110,  97, \n    116, 101,  95, 105, 110, 102, \n    111,   0, 120, 101,  95, 114, \n    101, 115, 111, 108, 118, 101, \n     95, 100, 101, 115, 116,  95, \n     98,  97, 115, 101,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n    228, 152,   0,   0,  81,   0, \n      5,   0,  57,  38,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n     50,   0,   2,   0, 104,   0, \n      0,   2,  24,   0,   0,   0, \n    155,   0,   0,   4,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  12, 242,   0,  16,   0, \n      0,   0,   0,   0, 134, 138, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0,   7,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   1,   1,   0, \n      0,   9,  18,   0,  16,   0, \n      1,   0,   0,   0,  58, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n    255,   3,   0,   0,  85,   0, \n      0,  12, 114,   0,  16,   0, \n      2,   0,   0,   0,  86, 135, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,   5,   0, \n      0,   0,  10,   0,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  12, 242,   0,  16,   0, \n      3,   0,   0,   0, 246, 143, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n     24,   0,   0,   0,  20,   0, \n      0,   0,  24,   0,   0,   0, \n     24,   0,   0,   0,  41,   0, \n      0,   6,  34,   0,  16,   0, \n      4,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  11,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     80,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      1,   0,   0,   0,  62,   0, \n      0,   1,  21,   0,   0,   1, \n    138,   0,   0,  17, 242,   0, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,  11,   0,   0,   0, \n      4,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  13,   0, \n      0,   0,  24,   0,   0,   0, \n     28,   0,   0,   0,   6, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   7, \n    130,   0,  16,   0,   2,   0, \n      0,   0,  26, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  20,  98,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0, 246,  12, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 139,   0,   0,  11, \n    130,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n     42, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  23,   0, \n      0,   0,  30,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   0,   0, 128,  63, \n    140,   0,   0,  20, 242,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   4,   0, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  17, \n     50,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      6,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n     28,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    230, 138,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   4, 210,   0,  16,   0, \n      4,   0,   0,   0,  86,   5, \n      2,   0,  30,   0,   0,   7, \n     98,   0,  16,   0,   1,   0, \n      0,   0,  86,   6,  16,   0, \n      1,   0,   0,   0,  86,   7, \n     16,   0,   4,   0,   0,   0, \n     80,   0,   0,   7, 130,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  31,   0, \n      4,   3,  58,   0,  16,   0, \n      2,   0,   0,   0,  54,   0, \n      0,   5,  34,   0,  16,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     18,   0,   0,   1,  32,   0, \n      0,   7, 130,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  31,   0,   4,   3, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  54,   0,   0,   5, \n     34,   0,  16,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  18,   0, \n      0,   1,  54,   0,   0,   5, \n     34,   0,  16,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  21,   0,   0,   1, \n     80,   0,   0,  10, 194,   0, \n     16,   0,   6,   0,   0,   0, \n      6,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  10, 194,   0,  16,   0, \n      6,   0,   0,   0, 166,  14, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  41,   0,   0,   7, \n     98,   0,  16,   0,   1,   0, \n      0,   0,  86,   6,  16,   0, \n      1,   0,   0,   0, 166,  11, \n     16,   0,   6,   0,   0,   0, \n     85,   0,   0,   7,  18,   0, \n     16,   0,   6,   0,   0,   0, \n     26,   0,  16,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  10,  50,   0,  16,   0, \n      6,   0,   0,   0,  70,   0, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     98,   0,  16,   0,   1,   0, \n      0,   0,  86,   6,  16,   0, \n      1,   0,   0,   0,   6,   1, \n     16,   0,   6,   0,   0,   0, \n     85,   0,   0,   7,  18,   0, \n     16,   0,   6,   0,   0,   0, \n      1,  64,   0,   0,  80,   0, \n      0,   0,  58,   0,  16,   0, \n      5,   0,   0,   0,  54,   0, \n      0,   5,  34,   0,  16,   0, \n      6,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n     78,   0,   0,   8,  50,   0, \n     16,   0,   7,   0,   0,   0, \n      0, 208,   0,   0, 150,   5, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   6,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      7,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   7,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   5,   0,   0,   0, \n     35,   0,   0,  10,  98,   0, \n     16,   0,   1,   0,   0,   0, \n      6,   1,  16, 128,  65,   0, \n      0,   0,   7,   0,   0,   0, \n      6,   1,  16,   0,   6,   0, \n      0,   0,  86,   6,  16,   0, \n      1,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   6,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  41,   0, \n      0,   7,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   5,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   5,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  78,   0,   0,   8, \n      0, 208,   0,   0,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,  40,   0,  41,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,  30,   0,   0,   7, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      5,   0,   0,   0,  42,   0, \n     16,   0,   6,   0,   0,   0, \n     41,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  31,   0, \n      4,   3,  58,   0,  16,   0, \n      5,   0,   0,   0,  32,   0, \n      0,   7, 130,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   8,   0, \n      0,   0,  31,   0,   4,   3, \n     58,   0,  16,   0,   2,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0, 230, 116, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 130,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0, 230, 116, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  50,   0,  16,   0, \n      8,   0,   0,   0, 230,  10, \n     16,   0,   6,   0,   0,   0, \n     54,   0,   0,   5,  50,   0, \n     16,   0,   9,   0,   0,   0, \n    230,  10,  16,   0,   7,   0, \n      0,   0,  18,   0,   0,   1, \n    165,   0,   0,   8,  50,   0, \n     16,   0,   8,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  70, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    130,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    165,   0,   0,   8,  50,   0, \n     16,   0,   6,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  70, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n     50,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,   5,   0,   0,   0, \n      6,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      5,   0,   0,   0, 165,   0, \n      0,   8,  50,   0,  16,   0, \n      9,   0,   0,   0,  10,   0, \n     16,   0,   5,   0,   0,   0, \n     70, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    165,   0,   0,   8,  50,   0, \n     16,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0,  70, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     76,   0,   0,   3,  42,   0, \n     16,   0,   5,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   5,   0,   0,   0, \n     41,   0,   0,  10, 194,   0, \n     16,   0,   8,   0,   0,   0, \n      6,   4,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  38,   7, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n     41,   0,   0,  10, 194,   0, \n     16,   0,   6,   0,   0,   0, \n      6,   4,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  38,   7, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n     41,   0,   0,  10, 194,   0, \n     16,   0,   9,   0,   0,   0, \n      6,   4,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  38,   7, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n     41,   0,   0,  10, 194,   0, \n     16,   0,   7,   0,   0,   0, \n      6,   4,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  38,   7, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      7,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      5,   0,   0,   0,  70,   0, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 131,   0,   0,   5, \n     82,   0,  16,   0,   8,   0, \n      0,   0,   6,   1,  16,   0, \n      8,   0,   0,   0, 131,   0, \n      0,   5, 162,   0,  16,   0, \n      8,   0,   0,   0,   6,   4, \n     16,   0,   5,   0,   0,   0, \n     85,   0,   0,  10,  50,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   0,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 131,   0, \n      0,   5,  82,   0,  16,   0, \n      6,   0,   0,   0,   6,   1, \n     16,   0,   6,   0,   0,   0, \n    131,   0,   0,   5, 162,   0, \n     16,   0,   6,   0,   0,   0, \n      6,   4,  16,   0,   5,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   5,   0, \n      0,   0,  70,   0,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    131,   0,   0,   5,  82,   0, \n     16,   0,   9,   0,   0,   0, \n      6,   1,  16,   0,   9,   0, \n      0,   0, 131,   0,   0,   5, \n    162,   0,  16,   0,   9,   0, \n      0,   0,   6,   4,  16,   0, \n      5,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      5,   0,   0,   0,  70,   0, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 131,   0,   0,   5, \n     82,   0,  16,   0,   7,   0, \n      0,   0,   6,   1,  16,   0, \n      7,   0,   0,   0, 131,   0, \n      0,   5, 162,   0,  16,   0, \n      7,   0,   0,   0,   6,   4, \n     16,   0,   5,   0,   0,   0, \n      2,   0,   0,   1,  10,   0, \n      0,   1,  54,   0,   0,   8, \n    194,   0,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   1,  23,   0,   0,   1, \n     18,   0,   0,   1,  32,   0, \n      0,   7, 130,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  31,   0,   4,   3, \n     58,   0,  16,   0,   2,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  54, 121, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  18,   0, \n      0,   1, 165,   0,   0,   8, \n     34,   0,  16,   0,   7,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 130,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0, 165,   0,   0,   8, \n     66,   0,  16,   0,   7,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10,  50,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n     12,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   5,   0, \n      0,   0,   6,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   5,   0,   0,   0, \n    165,   0,   0,   8, 130,   0, \n     16,   0,   7,   0,   0,   0, \n     10,   0,  16,   0,   5,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n     18,   0,  16,   0,   7,   0, \n      0,   0,  26,   0,  16,   0, \n      5,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  76,   0,   0,   3, \n     42,   0,  16,   0,   5,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,   0,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,  10,   0, \n      0,   0,  86,   5,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  10,   0,   0,   0, \n     26,   0,  16,   0,   7,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  10,   0,   0,   0, \n    166,  10,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  16,   0,   0,   0, \n     24,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     10,   0,   0,   0,  42,   0, \n     16,   0,   7,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     10,   0,   0,   0, 246,  15, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     16,   0,   0,   0,  24,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  10,   0, \n      0,   0,  58,   0,  16,   0, \n      7,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59,  85,   0,   0,  10, \n    226,   0,  16,   0,   7,   0, \n      0,   0,   6,   0,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,  10,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,  10,   0, \n      0,   0,  86,   5,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  10,   0,   0,   0, \n     26,   0,  16,   0,   7,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   3,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   8,  32, 128,  58, \n      8,  32, 128,  58,   8,  32, \n    128,  58, 171, 170, 170,  62, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  10,   0,   0,   0, \n    166,  10,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     30,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     10,   0,   0,   0,  42,   0, \n     16,   0,   7,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      3,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      8,  32, 128,  58,   8,  32, \n    128,  58,   8,  32, 128,  58, \n    171, 170, 170,  62,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     10,   0,   0,   0, 246,  15, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  10,   0, \n      0,   0,  58,   0,  16,   0, \n      7,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   3,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   8,  32, \n    128,  58,   8,  32, 128,  58, \n      8,  32, 128,  58, 171, 170, \n    170,  62,  85,   0,   0,  10, \n    226,   0,  16,   0,   7,   0, \n      0,   0,   6,   0,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      3,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      8,  32, 128,  58,   8,  32, \n    128,  58,   8,  32, 128,  58, \n    171, 170, 170,  62,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  86,   9,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,  30,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  11,   0,   0,   0, \n     26,   0,  16,   0,   7,   0, \n      0,   0,  54,   0,   0,   5, \n     98,   0,  16,   0,  11,   0, \n      0,   0,   6,   1,  16,   0, \n     10,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n    138,   0,   0,  15, 114,   0, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n    135,   0,   0,   5, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 232, 255, 255, 255, \n    232, 255, 255, 255, 232, 255, \n    255, 255,   0,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  11, 114,   0, \n     16,   0,  16,   0,   0,   0, \n     70,   2,  16, 128,  65,   0, \n      0,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16,   0,  14,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0, 140,   0,   0,  17, \n    114,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  11,   0, \n      0,   0,  70,   2,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    114,   0,  16,   0,  11,   0, \n      0,   0,  70,   2,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,   8,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     86,   0,   0,   5,  50,   0, \n     16,   0,   5,   0,   0,   0, \n    230,  10,  16,   0,  10,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0, 230,  11,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  11,   0,   0,   0, \n     42,   0,  16,   0,   7,   0, \n      0,   0,  54,   0,   0,   5, \n     98,   0,  16,   0,  11,   0, \n      0,   0,   6,   3,  16,   0, \n     10,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n    138,   0,   0,  15, 114,   0, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n    135,   0,   0,   5, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 232, 255, 255, 255, \n    232, 255, 255, 255, 232, 255, \n    255, 255,   0,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  11, 114,   0, \n     16,   0,  16,   0,   0,   0, \n     70,   2,  16, 128,  65,   0, \n      0,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16,   0,  14,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0, 140,   0,   0,  17, \n    114,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  11,   0, \n      0,   0,  70,   2,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    114,   0,  16,   0,  11,   0, \n      0,   0,  70,   2,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,   6,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     56,   0,   0,  10,  50,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n    171, 170, 170,  62, 171, 170, \n    170,  62,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     10,   0,   0,   0,  58,   0, \n     16,   0,   7,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  11,   0,   0,   0, \n     70,   2,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  10,   0, \n      0,   0, 135,   0,   0,   5, \n    114,   0,  16,   0,  14,   0, \n      0,   0,  70,   2,  16,   0, \n     12,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255,   0,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  14,   0, \n      0,   0,  70,   2,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  11, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16, 128, \n     65,   0,   0,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0, 140,   0, \n      0,  17, 114,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  14,   0, \n      0,   0,  70,   2,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  10,   0,   0,   0, \n     70,   2,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     10,   0,   0,   0,  70,   2, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,  70,   2,  16,   0, \n     10,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  12,   0, \n      0,   0,  70,   2,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  10,   0,   0,   0, \n     70,   2,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 114,   0,  16,   0, \n     10,   0,   0,   0,  70,   2, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  10,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,   9,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  54,   0,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,  30,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n     86,   0,   0,   5,  50,   0, \n     16,   0,  11,   0,   0,   0, \n    198,   0,  16,   0,  10,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  10,   0, \n      0,   0,  10,   0,  16,   0, \n      7,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n    138,   0,   0,  15, 114,   0, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  10,   0,   0,   0, \n    135,   0,   0,   5, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 232, 255, 255, 255, \n    232, 255, 255, 255, 232, 255, \n    255, 255,   0,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  11, 114,   0, \n     16,   0,  16,   0,   0,   0, \n     70,   2,  16, 128,  65,   0, \n      0,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16,   0,  14,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0, 140,   0,   0,  17, \n    114,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     10,   0,   0,   0,  70,   2, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  10,   0, \n      0,   0,  70,   2,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  10,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     10,   0,   0,   0,  70,   2, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    114,   0,  16,   0,  10,   0, \n      0,   0,  70,   2,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,  10,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,   7,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,  70,   2,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     56,   0,   0,  10,  50,   0, \n     16,   0,  10,   0,   0,   0, \n     70,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n    171, 170, 170,  62, 171, 170, \n    170,  62,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5, 130,   0,  16,   0, \n      8,   0,   0,   0,  10,   0, \n     16,   0,   5,   0,   0,   0, \n     54,   0,   0,   5, 130,   0, \n     16,   0,   6,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0,  54,   0,   0,   5, \n    130,   0,  16,   0,   9,   0, \n      0,   0,  10,   0,  16,   0, \n     10,   0,   0,   0,  54,   0, \n      0,   5, 130,   0,  16,   0, \n      7,   0,   0,   0,  26,   0, \n     16,   0,  10,   0,   0,   0, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      4,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0, 150,   3, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  54,   0,   0,   5, \n     82,   0,  16,   0,  11,   0, \n      0,   0,   6,   1,  16,   0, \n     10,   0,   0,   0,  54,   0, \n      0,   5, 162,   0,  16,   0, \n     11,   0,   0,   0,  86,   9, \n     16,   0,   7,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10,  50,   0,  16,   0, \n      8,   0,   0,   0,  70,   0, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  52,   0,   0,  10, \n     50,   0,  16,   0,   6,   0, \n      0,   0, 230,  10,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  98,   0, \n     16,   0,   7,   0,   0,   0, \n    166,  11,  16,   0,  10,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0, 214,   2,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10,  50,   0, \n     16,   0,   9,   0,   0,   0, \n     70,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0,   0,   0, \n      0,   0,   0,   0,  52,   0, \n      0,  10,  50,   0,  16,   0, \n      7,   0,   0,   0, 230,  10, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0, 150,   3,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    131,   0,   0,   5,  18,   0, \n     16,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,   7,   0, \n      0,   0, 131,   0,   0,   5, \n     34,   0,  16,   0,   8,   0, \n      0,   0,  10,   0,  16,   0, \n     10,   0,   0,   0, 131,   0, \n      0,   5,  18,   0,  16,   0, \n      6,   0,   0,   0,  42,   0, \n     16,   0,   7,   0,   0,   0, \n    131,   0,   0,   5,  34,   0, \n     16,   0,   6,   0,   0,   0, \n     26,   0,  16,   0,  10,   0, \n      0,   0, 131,   0,   0,   5, \n     18,   0,  16,   0,   9,   0, \n      0,   0,  58,   0,  16,   0, \n      7,   0,   0,   0, 131,   0, \n      0,   5,  34,   0,  16,   0, \n      9,   0,   0,   0,  42,   0, \n     16,   0,  10,   0,   0,   0, \n    131,   0,   0,   5,  18,   0, \n     16,   0,   7,   0,   0,   0, \n     10,   0,  16,   0,   7,   0, \n      0,   0, 131,   0,   0,   5, \n     34,   0,  16,   0,   7,   0, \n      0,   0,  58,   0,  16,   0, \n     10,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,  10,   0, \n      0,   1,  54,   0,   0,   5, \n     18,   0,  16,   0,   8,   0, \n      0,   0,  26,   0,  16,   0, \n      7,   0,   0,   0,  54,   0, \n      0,   8, 226,   0,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   6,   0,   0,   0, \n     42,   0,  16,   0,   7,   0, \n      0,   0,  54,   0,   0,   8, \n    226,   0,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      9,   0,   0,   0,  58,   0, \n     16,   0,   7,   0,   0,   0, \n     54,   0,   0,   8, 226,   0, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    226,   0,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   1,  23,   0,   0,   1, \n     21,   0,   0,   1,  80,   0, \n      0,   7, 130,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  31,   0,   4,   3, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  56,   0,   0,   7, \n    130,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,  63, \n     30,   0,   0,   7,  18,   0, \n     16,   0,   5,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     64,   1,   0,   0,  31,   0, \n      4,   3,  58,   0,  16,   0, \n      5,   0,   0,   0,  32,   0, \n      0,   7,  34,   0,  16,   0, \n      5,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   8,   0, \n      0,   0,  31,   0,   4,   3, \n     26,   0,  16,   0,   5,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  10,   0,  16,   0, \n      5,   0,   0,   0, 230, 116, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  34,   0,  16,   0, \n      5,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  80,   1, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  26,   0,  16,   0, \n      5,   0,   0,   0, 230, 116, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  50,   0,  16,   0, \n     12,   0,   0,   0, 230,  10, \n     16,   0,  10,   0,   0,   0, \n     54,   0,   0,   5,  50,   0, \n     16,   0,  14,   0,   0,   0, \n    230,  10,  16,   0,  11,   0, \n      0,   0,  18,   0,   0,   1, \n    165,   0,   0,   8,  50,   0, \n     16,   0,  12,   0,   0,   0, \n     10,   0,  16,   0,   5,   0, \n      0,   0,  70, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     34,   0,  16,   0,   5,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   5,   0,   0,   0, \n    165,   0,   0,   8,  50,   0, \n     16,   0,  10,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0,  70, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n     50,   0,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,  13,   0,   0,   0, \n      6,   0,  16,   0,   5,   0, \n      0,   0,  70,   0,  16,   0, \n     13,   0,   0,   0, 165,   0, \n      0,   8,  50,   0,  16,   0, \n     14,   0,   0,   0,  10,   0, \n     16,   0,  13,   0,   0,   0, \n     70, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    165,   0,   0,   8,  50,   0, \n     16,   0,  11,   0,   0,   0, \n     26,   0,  16,   0,  13,   0, \n      0,   0,  70, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     76,   0,   0,   3,  42,   0, \n     16,   0,   5,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   5,   0,   0,   0, \n     41,   0,   0,  10, 194,   0, \n     16,   0,  12,   0,   0,   0, \n      6,   4,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  38,   7, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n     41,   0,   0,  10, 194,   0, \n     16,   0,  10,   0,   0,   0, \n      6,   4,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  38,   7, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n     41,   0,   0,  10, 194,   0, \n     16,   0,  14,   0,   0,   0, \n      6,   4,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  38,   7, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n    242,   0,  16,   0,  14,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n     41,   0,   0,  10, 194,   0, \n     16,   0,  11,   0,   0,   0, \n      6,   4,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  38,   7, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      7,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n     13,   0,   0,   0,  70,   0, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 131,   0,   0,   5, \n     82,   0,  16,   0,  12,   0, \n      0,   0,   6,   1,  16,   0, \n     12,   0,   0,   0, 131,   0, \n      0,   5, 162,   0,  16,   0, \n     12,   0,   0,   0,   6,   4, \n     16,   0,  13,   0,   0,   0, \n     85,   0,   0,  10,  50,   0, \n     16,   0,  13,   0,   0,   0, \n     70,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 131,   0, \n      0,   5,  82,   0,  16,   0, \n     10,   0,   0,   0,   6,   1, \n     16,   0,  10,   0,   0,   0, \n    131,   0,   0,   5, 162,   0, \n     16,   0,  10,   0,   0,   0, \n      6,   4,  16,   0,  13,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,  13,   0, \n      0,   0,  70,   0,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    131,   0,   0,   5,  82,   0, \n     16,   0,  14,   0,   0,   0, \n      6,   1,  16,   0,  14,   0, \n      0,   0, 131,   0,   0,   5, \n    162,   0,  16,   0,  14,   0, \n      0,   0,   6,   4,  16,   0, \n     13,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n     13,   0,   0,   0,  70,   0, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 131,   0,   0,   5, \n     82,   0,  16,   0,  11,   0, \n      0,   0,   6,   1,  16,   0, \n     11,   0,   0,   0, 131,   0, \n      0,   5, 162,   0,  16,   0, \n     11,   0,   0,   0,   6,   4, \n     16,   0,  13,   0,   0,   0, \n      2,   0,   0,   1,  10,   0, \n      0,   1,  54,   0,   0,   8, \n    194,   0,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   1,  23,   0,   0,   1, \n     18,   0,   0,   1,  32,   0, \n      0,   7,  34,   0,  16,   0, \n      5,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  31,   0,   4,   3, \n     26,   0,  16,   0,   5,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  10,   0,  16,   0, \n      5,   0,   0,   0,  54, 121, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  18,   0, \n      0,   1, 165,   0,   0,   8, \n     34,   0,  16,   0,  11,   0, \n      0,   0,  10,   0,  16,   0, \n      5,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  34,   0,  16,   0, \n      5,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   5,   0, \n      0,   0, 165,   0,   0,   8, \n     66,   0,  16,   0,  11,   0, \n      0,   0,  26,   0,  16,   0, \n      5,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10,  50,   0,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n     12,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,  13,   0, \n      0,   0,   6,   0,  16,   0, \n      5,   0,   0,   0,  70,   0, \n     16,   0,  13,   0,   0,   0, \n    165,   0,   0,   8, 130,   0, \n     16,   0,  11,   0,   0,   0, \n     10,   0,  16,   0,  13,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n     18,   0,  16,   0,  11,   0, \n      0,   0,  26,   0,  16,   0, \n     13,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  76,   0,   0,   3, \n     42,   0,  16,   0,   5,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,   0,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,  13,   0, \n      0,   0,  86,   5,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  13,   0,   0,   0, \n     26,   0,  16,   0,  11,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  13,   0,   0,   0, \n    166,  10,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  16,   0,   0,   0, \n     24,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     13,   0,   0,   0,  42,   0, \n     16,   0,  11,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     13,   0,   0,   0, 246,  15, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     16,   0,   0,   0,  24,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  13,   0, \n      0,   0,  58,   0,  16,   0, \n     11,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     14,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59,  85,   0,   0,  10, \n    226,   0,  16,   0,  11,   0, \n      0,   0,   6,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,  10,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,  13,   0, \n      0,   0,  86,   5,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  13,   0,   0,   0, \n     26,   0,  16,   0,  11,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   3,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   8,  32, 128,  58, \n      8,  32, 128,  58,   8,  32, \n    128,  58, 171, 170, 170,  62, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  13,   0,   0,   0, \n    166,  10,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     30,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     13,   0,   0,   0,  42,   0, \n     16,   0,  11,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      3,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      8,  32, 128,  58,   8,  32, \n    128,  58,   8,  32, 128,  58, \n    171, 170, 170,  62,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     13,   0,   0,   0, 246,  15, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  13,   0, \n      0,   0,  58,   0,  16,   0, \n     11,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   3,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     14,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   8,  32, \n    128,  58,   8,  32, 128,  58, \n      8,  32, 128,  58, 171, 170, \n    170,  62,  85,   0,   0,  10, \n    226,   0,  16,   0,  11,   0, \n      0,   0,   6,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      3,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      8,  32, 128,  58,   8,  32, \n    128,  58,   8,  32, 128,  58, \n    171, 170, 170,  62,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  86,   9,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,  30,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  15,   0,   0,   0, \n     26,   0,  16,   0,  11,   0, \n      0,   0,  54,   0,   0,   5, \n     98,   0,  16,   0,  15,   0, \n      0,   0,   6,   1,  16,   0, \n     13,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n    138,   0,   0,  15, 114,   0, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n    135,   0,   0,   5, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0, 232, 255, 255, 255, \n    232, 255, 255, 255, 232, 255, \n    255, 255,   0,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  11, 114,   0, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16, 128,  65,   0, \n      0,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0, 140,   0,   0,  17, \n    114,   0,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     86,   0,   0,   5,  50,   0, \n     16,   0,  13,   0,   0,   0, \n    230,  10,  16,   0,  13,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0, 230,  11,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  16,   0,   0,   0, \n     42,   0,  16,   0,  11,   0, \n      0,   0,  54,   0,   0,   5, \n     98,   0,  16,   0,  16,   0, \n      0,   0,   6,   3,  16,   0, \n     15,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n    138,   0,   0,  15, 114,   0, \n     16,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n    135,   0,   0,   5, 114,   0, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0, 232, 255, 255, 255, \n    232, 255, 255, 255, 232, 255, \n    255, 255,   0,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  11, 114,   0, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16, 128,  65,   0, \n      0,   0,  20,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  21,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  21,   0, \n      0,   0, 140,   0,   0,  17, \n    114,   0,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n     21,   0,   0,   0,   2,  64, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  10,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  15,   0,   0,   0, \n     58,   0,  16,   0,  11,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 114,   0,  16,   0, \n     18,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0, 135,   0, \n      0,   5, 114,   0,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n    232, 255, 255, 255, 232, 255, \n    255, 255, 232, 255, 255, 255, \n      0,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  11, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16, 128,  65,   0,   0,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  20,   0,   0,   0, \n    140,   0,   0,  17, 114,   0, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,   2,  64,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  54,   0, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,  30,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,  86,   0,   0,   5, \n    194,   0,  16,   0,  13,   0, \n      0,   0,   6,  12,  16,   0, \n     15,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     15,   0,   0,   0,  10,   0, \n     16,   0,  11,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  16,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0, 135,   0,   0,   5, \n    114,   0,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     17,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n      2,  64,   0,   0, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255,   0,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  11, \n    114,   0,  16,   0,  20,   0, \n      0,   0,  70,   2,  16, 128, \n     65,   0,   0,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0, 140,   0, \n      0,  17, 114,   0,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  20,   0,   0,   0, \n      2,  64,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     17,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  11,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0, 171, 170, 170,  62, \n    171, 170, 170,  62, 171, 170, \n    170,  62, 171, 170, 170,  62, \n     54,   0,   0,   5, 130,   0, \n     16,   0,  12,   0,   0,   0, \n     10,   0,  16,   0,  13,   0, \n      0,   0,  54,   0,   0,   5, \n    130,   0,  16,   0,  10,   0, \n      0,   0,  26,   0,  16,   0, \n     13,   0,   0,   0,  54,   0, \n      0,   5, 130,   0,  16,   0, \n     14,   0,   0,   0,  42,   0, \n     16,   0,  13,   0,   0,   0, \n     54,   0,   0,   5, 130,   0, \n     16,   0,  11,   0,   0,   0, \n     58,   0,  16,   0,  13,   0, \n      0,   0,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,  13,   0,   0,   0, \n    150,   3,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  54,   0, \n      0,   5,  82,   0,  16,   0, \n     15,   0,   0,   0,   6,   1, \n     16,   0,  13,   0,   0,   0, \n     54,   0,   0,   5, 162,   0, \n     16,   0,  15,   0,   0,   0, \n     86,   9,  16,   0,  11,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10,  50,   0, \n     16,   0,  12,   0,   0,   0, \n     70,   0,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0,   0,   0, \n      0,   0,   0,   0,  52,   0, \n      0,  10,  50,   0,  16,   0, \n     10,   0,   0,   0, 230,  10, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     98,   0,  16,   0,  11,   0, \n      0,   0, 166,  11,  16,   0, \n     13,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0, 214,   2, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n     50,   0,  16,   0,  14,   0, \n      0,   0,  70,   0,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     52,   0,   0,  10,  50,   0, \n     16,   0,  11,   0,   0,   0, \n    230,  10,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      6,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0, 150,   3, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 131,   0,   0,   5, \n     18,   0,  16,   0,  12,   0, \n      0,   0,  26,   0,  16,   0, \n     11,   0,   0,   0, 131,   0, \n      0,   5,  34,   0,  16,   0, \n     12,   0,   0,   0,  10,   0, \n     16,   0,  13,   0,   0,   0, \n    131,   0,   0,   5,  18,   0, \n     16,   0,  10,   0,   0,   0, \n     42,   0,  16,   0,  11,   0, \n      0,   0, 131,   0,   0,   5, \n     34,   0,  16,   0,  10,   0, \n      0,   0,  26,   0,  16,   0, \n     13,   0,   0,   0, 131,   0, \n      0,   5,  18,   0,  16,   0, \n     14,   0,   0,   0,  58,   0, \n     16,   0,  11,   0,   0,   0, \n    131,   0,   0,   5,  34,   0, \n     16,   0,  14,   0,   0,   0, \n     42,   0,  16,   0,  13,   0, \n      0,   0, 131,   0,   0,   5, \n     18,   0,  16,   0,  11,   0, \n      0,   0,  10,   0,  16,   0, \n     11,   0,   0,   0, 131,   0, \n      0,   5,  34,   0,  16,   0, \n     11,   0,   0,   0,  58,   0, \n     16,   0,  13,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   1, \n     10,   0,   0,   1,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     12,   0,   0,   0,  26,   0, \n     16,   0,  11,   0,   0,   0, \n     54,   0,   0,   8, 226,   0, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  10,   0, \n      0,   0,  42,   0,  16,   0, \n     11,   0,   0,   0,  54,   0, \n      0,   8, 226,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  14,   0,   0,   0, \n     58,   0,  16,   0,  11,   0, \n      0,   0,  54,   0,   0,   8, \n    226,   0,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 226,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,  23,   0, \n      0,   1,  21,   0,   0,   1, \n      0,   0,   0,   7, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,   0,   0, \n      0,   7, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   0,   0,   0,   7, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,  14,   0,   0,   0, \n      0,   0,   0,   7, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  80,   0, \n      0,   7,  34,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  31,   0,   4,   3, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  41,   0,   0,   7, \n     34,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  58,   0, \n     16,   0,   5,   0,   0,   0, \n     56,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0, 128,  62,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  31,   0,   4,   3, \n     58,   0,  16,   0,   5,   0, \n      0,   0,  32,   0,   0,   7, \n     34,   0,  16,   0,   5,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   5,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0, 230, 116,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     34,   0,  16,   0,   5,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0, 230, 116,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     50,   0,  16,   0,  12,   0, \n      0,   0, 230,  10,  16,   0, \n     10,   0,   0,   0,  54,   0, \n      0,   5,  50,   0,  16,   0, \n     14,   0,   0,   0, 230,  10, \n     16,   0,  11,   0,   0,   0, \n     18,   0,   0,   1, 165,   0, \n      0,   8,  50,   0,  16,   0, \n     12,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     70, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  34,   0, \n     16,   0,   5,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8,  50,   0,  16,   0, \n     10,   0,   0,   0,  26,   0, \n     16,   0,   5,   0,   0,   0, \n     70, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     41,   0,   0,  10,  50,   0, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,  12,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  86,   5,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  50,   0,  16,   0, \n     13,   0,   0,   0,   6,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,  13,   0, \n      0,   0, 165,   0,   0,   8, \n     50,   0,  16,   0,  14,   0, \n      0,   0,  10,   0,  16,   0, \n     13,   0,   0,   0,  70, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8,  50,   0,  16,   0, \n     11,   0,   0,   0,  26,   0, \n     16,   0,  13,   0,   0,   0, \n     70, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  76,   0, \n      0,   3,  42,   0,  16,   0, \n      5,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      5,   0,   0,   0,  41,   0, \n      0,  10, 194,   0,  16,   0, \n     12,   0,   0,   0,   6,   4, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  38,   7,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,  41,   0, \n      0,  10, 194,   0,  16,   0, \n     10,   0,   0,   0,   6,   4, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  38,   7,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,  41,   0, \n      0,  10, 194,   0,  16,   0, \n     14,   0,   0,   0,   6,   4, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  38,   7,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10, 242,   0, \n     16,   0,  14,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,  41,   0, \n      0,  10, 194,   0,  16,   0, \n     11,   0,   0,   0,   6,   4, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  38,   7,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,  13,   0, \n      0,   0,  70,   0,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    131,   0,   0,   5,  82,   0, \n     16,   0,  12,   0,   0,   0, \n      6,   1,  16,   0,  12,   0, \n      0,   0, 131,   0,   0,   5, \n    162,   0,  16,   0,  12,   0, \n      0,   0,   6,   4,  16,   0, \n     13,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n     13,   0,   0,   0,  70,   0, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 131,   0,   0,   5, \n     82,   0,  16,   0,  10,   0, \n      0,   0,   6,   1,  16,   0, \n     10,   0,   0,   0, 131,   0, \n      0,   5, 162,   0,  16,   0, \n     10,   0,   0,   0,   6,   4, \n     16,   0,  13,   0,   0,   0, \n     85,   0,   0,  10,  50,   0, \n     16,   0,  13,   0,   0,   0, \n     70,   0,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 131,   0, \n      0,   5,  82,   0,  16,   0, \n     14,   0,   0,   0,   6,   1, \n     16,   0,  14,   0,   0,   0, \n    131,   0,   0,   5, 162,   0, \n     16,   0,  14,   0,   0,   0, \n      6,   4,  16,   0,  13,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,  13,   0, \n      0,   0,  70,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    131,   0,   0,   5,  82,   0, \n     16,   0,  11,   0,   0,   0, \n      6,   1,  16,   0,  11,   0, \n      0,   0, 131,   0,   0,   5, \n    162,   0,  16,   0,  11,   0, \n      0,   0,   6,   4,  16,   0, \n     13,   0,   0,   0,   2,   0, \n      0,   1,  10,   0,   0,   1, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   1, \n     23,   0,   0,   1,  18,   0, \n      0,   1,  32,   0,   0,   7, \n     34,   0,  16,   0,   5,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   5,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  54, 121,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  18,   0,   0,   1, \n    165,   0,   0,   8,  34,   0, \n     16,   0,  11,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     34,   0,  16,   0,   5,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n    165,   0,   0,   8,  66,   0, \n     16,   0,  11,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n     50,   0,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,  13,   0,   0,   0, \n      6,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n     13,   0,   0,   0, 165,   0, \n      0,   8, 130,   0,  16,   0, \n     11,   0,   0,   0,  10,   0, \n     16,   0,  13,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    165,   0,   0,   8,  18,   0, \n     16,   0,  11,   0,   0,   0, \n     26,   0,  16,   0,  13,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     76,   0,   0,   3,  42,   0, \n     16,   0,   5,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   0,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  13,   0,   0,   0, \n     86,   5,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  16,   0,   0,   0, \n     24,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     13,   0,   0,   0,  26,   0, \n     16,   0,  11,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     13,   0,   0,   0, 166,  10, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     16,   0,   0,   0,  24,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  13,   0, \n      0,   0,  42,   0,  16,   0, \n     11,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59,  85,   0,   0,  10, \n    226,   0,  16,   0,  13,   0, \n      0,   0, 246,  15,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  13,   0,   0,   0, \n     58,   0,  16,   0,  11,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  14,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  11,   0,   0,   0, \n      6,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  16,   0,   0,   0, \n     24,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,  10,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  13,   0,   0,   0, \n     86,   5,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     30,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     13,   0,   0,   0,  26,   0, \n     16,   0,  11,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      3,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      8,  32, 128,  58,   8,  32, \n    128,  58,   8,  32, 128,  58, \n    171, 170, 170,  62,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     13,   0,   0,   0, 166,  10, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  13,   0, \n      0,   0,  42,   0,  16,   0, \n     11,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   3,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   8,  32, \n    128,  58,   8,  32, 128,  58, \n      8,  32, 128,  58, 171, 170, \n    170,  62,  85,   0,   0,  10, \n    226,   0,  16,   0,  13,   0, \n      0,   0, 246,  15,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  13,   0,   0,   0, \n     58,   0,  16,   0,  11,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   3,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  14,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   8,  32, 128,  58, \n      8,  32, 128,  58,   8,  32, \n    128,  58, 171, 170, 170,  62, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  11,   0,   0,   0, \n      6,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     30,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   3,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   8,  32, \n    128,  58,   8,  32, 128,  58, \n      8,  32, 128,  58, 171, 170, \n    170,  62,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     86,   9,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n     30,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     15,   0,   0,   0,  26,   0, \n     16,   0,  11,   0,   0,   0, \n     54,   0,   0,   5,  98,   0, \n     16,   0,  15,   0,   0,   0, \n      6,   1,  16,   0,  13,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 114,   0,  16,   0, \n     18,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0, 135,   0, \n      0,   5, 114,   0,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n    232, 255, 255, 255, 232, 255, \n    255, 255, 232, 255, 255, 255, \n      0,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  11, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16, 128,  65,   0,   0,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  20,   0,   0,   0, \n    140,   0,   0,  17, 114,   0, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,   2,  64,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   0, \n      0,   5,  50,   0,  16,   0, \n     13,   0,   0,   0, 230,  10, \n     16,   0,  13,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,  15,   0,   0,   0, \n    230,  11,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     16,   0,   0,   0,  42,   0, \n     16,   0,  11,   0,   0,   0, \n     54,   0,   0,   5,  98,   0, \n     16,   0,  16,   0,   0,   0, \n      6,   3,  16,   0,  15,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 114,   0,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0, 135,   0, \n      0,   5, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,   2,  64,   0,   0, \n    232, 255, 255, 255, 232, 255, \n    255, 255, 232, 255, 255, 255, \n      0,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  11, 114,   0,  16,   0, \n     21,   0,   0,   0,  70,   2, \n     16, 128,  65,   0,   0,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  21,   0,   0,   0, \n    140,   0,   0,  17, 114,   0, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  16,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  21,   0, \n      0,   0,   2,  64,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 114,   0, \n     16,   0,  16,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     10,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     15,   0,   0,   0,  58,   0, \n     16,   0,  11,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  16,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0, 135,   0,   0,   5, \n    114,   0,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     17,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n      2,  64,   0,   0, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255,   0,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  11, \n    114,   0,  16,   0,  20,   0, \n      0,   0,  70,   2,  16, 128, \n     65,   0,   0,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0, 140,   0, \n      0,  17, 114,   0,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  20,   0,   0,   0, \n      2,  64,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     17,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  14,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  54,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,  30,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n     86,   0,   0,   5, 194,   0, \n     16,   0,  13,   0,   0,   0, \n      6,  12,  16,   0,  15,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  15,   0, \n      0,   0,  10,   0,  16,   0, \n     11,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n    138,   0,   0,  15, 114,   0, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n    135,   0,   0,   5, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0, 232, 255, 255, 255, \n    232, 255, 255, 255, 232, 255, \n    255, 255,   0,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  11, 114,   0, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16, 128,  65,   0, \n      0,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0, 140,   0,   0,  17, \n    114,   0,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  11,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n    171, 170, 170,  62, 171, 170, \n    170,  62, 171, 170, 170,  62, \n    171, 170, 170,  62,  54,   0, \n      0,   5, 130,   0,  16,   0, \n     12,   0,   0,   0,  10,   0, \n     16,   0,  13,   0,   0,   0, \n     54,   0,   0,   5, 130,   0, \n     16,   0,  10,   0,   0,   0, \n     26,   0,  16,   0,  13,   0, \n      0,   0,  54,   0,   0,   5, \n    130,   0,  16,   0,  14,   0, \n      0,   0,  42,   0,  16,   0, \n     13,   0,   0,   0,  54,   0, \n      0,   5, 130,   0,  16,   0, \n     11,   0,   0,   0,  58,   0, \n     16,   0,  13,   0,   0,   0, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      4,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0, 150,   3, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  54,   0,   0,   5, \n     82,   0,  16,   0,  15,   0, \n      0,   0,   6,   1,  16,   0, \n     13,   0,   0,   0,  54,   0, \n      0,   5, 162,   0,  16,   0, \n     15,   0,   0,   0,  86,   9, \n     16,   0,  11,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10,  50,   0,  16,   0, \n     12,   0,   0,   0,  70,   0, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  52,   0,   0,  10, \n     50,   0,  16,   0,  10,   0, \n      0,   0, 230,  10,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  98,   0, \n     16,   0,  11,   0,   0,   0, \n    166,  11,  16,   0,  13,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0, 214,   2,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10,  50,   0, \n     16,   0,  14,   0,   0,   0, \n     70,   0,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0,   0,   0, \n      0,   0,   0,   0,  52,   0, \n      0,  10,  50,   0,  16,   0, \n     11,   0,   0,   0, 230,  10, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0, 150,   3,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    131,   0,   0,   5,  18,   0, \n     16,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,  11,   0, \n      0,   0, 131,   0,   0,   5, \n     34,   0,  16,   0,  12,   0, \n      0,   0,  10,   0,  16,   0, \n     13,   0,   0,   0, 131,   0, \n      0,   5,  18,   0,  16,   0, \n     10,   0,   0,   0,  42,   0, \n     16,   0,  11,   0,   0,   0, \n    131,   0,   0,   5,  34,   0, \n     16,   0,  10,   0,   0,   0, \n     26,   0,  16,   0,  13,   0, \n      0,   0, 131,   0,   0,   5, \n     18,   0,  16,   0,  14,   0, \n      0,   0,  58,   0,  16,   0, \n     11,   0,   0,   0, 131,   0, \n      0,   5,  34,   0,  16,   0, \n     14,   0,   0,   0,  42,   0, \n     16,   0,  13,   0,   0,   0, \n    131,   0,   0,   5,  18,   0, \n     16,   0,  11,   0,   0,   0, \n     10,   0,  16,   0,  11,   0, \n      0,   0, 131,   0,   0,   5, \n     34,   0,  16,   0,  11,   0, \n      0,   0,  58,   0,  16,   0, \n     13,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,  10,   0, \n      0,   1,  54,   0,   0,   5, \n     18,   0,  16,   0,  12,   0, \n      0,   0,  26,   0,  16,   0, \n     11,   0,   0,   0,  54,   0, \n      0,   8, 226,   0,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  10,   0,   0,   0, \n     42,   0,  16,   0,  11,   0, \n      0,   0,  54,   0,   0,   8, \n    226,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     14,   0,   0,   0,  58,   0, \n     16,   0,  11,   0,   0,   0, \n     54,   0,   0,   8, 226,   0, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    226,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   1,  23,   0,   0,   1, \n     21,   0,   0,   1,   0,   0, \n      0,   7, 242,   0,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,   0,   0,   0,   7, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      0,   0,   0,   7, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n     14,   0,   0,   0,   0,   0, \n      0,   7, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   5,   0,   0,   0, \n     31,   0,   4,   3,  58,   0, \n     16,   0,   5,   0,   0,   0, \n     32,   0,   0,   7,  34,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      2,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n     14,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n    230, 116,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  34,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n     15,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n    230, 116,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  50,   0, \n     16,   0,  16,   0,   0,   0, \n    230,  10,  16,   0,  14,   0, \n      0,   0,  54,   0,   0,   5, \n     50,   0,  16,   0,  17,   0, \n      0,   0, 230,  10,  16,   0, \n     15,   0,   0,   0,  18,   0, \n      0,   1, 165,   0,   0,   8, \n     50,   0,  16,   0,  16,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  70, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  34,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n     50,   0,  16,   0,  14,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  70, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10,  50,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n     12,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   5,   0, \n      0,   0,   6,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   5,   0,   0,   0, \n    165,   0,   0,   8,  50,   0, \n     16,   0,  17,   0,   0,   0, \n     10,   0,  16,   0,   5,   0, \n      0,   0,  70, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n     50,   0,  16,   0,  15,   0, \n      0,   0,  26,   0,  16,   0, \n      5,   0,   0,   0,  70, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  76,   0,   0,   3, \n     42,   0,  16,   0,   5,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  41,   0,   0,  10, \n    194,   0,  16,   0,  16,   0, \n      0,   0,   6,   4,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,  18,   0,   0,   0, \n     38,   7,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     18,   0,   0,   0,  70,  14, \n     16,   0,  18,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  18,   0,   0,   0, \n     70,  14,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10, 242,   0,  16,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,  41,   0,   0,  10, \n    194,   0,  16,   0,  14,   0, \n      0,   0,   6,   4,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,  18,   0,   0,   0, \n     38,   7,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     18,   0,   0,   0,  70,  14, \n     16,   0,  18,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  18,   0,   0,   0, \n     70,  14,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10, 242,   0,  16,   0, \n     14,   0,   0,   0,  70,  14, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,  41,   0,   0,  10, \n    194,   0,  16,   0,  17,   0, \n      0,   0,   6,   4,  16,   0, \n     17,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,  18,   0,   0,   0, \n     38,   7,  16,   0,  17,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     18,   0,   0,   0,  70,  14, \n     16,   0,  18,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  18,   0,   0,   0, \n     70,  14,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10, 242,   0,  16,   0, \n     17,   0,   0,   0,  70,  14, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,  41,   0,   0,  10, \n    194,   0,  16,   0,  15,   0, \n      0,   0,   6,   4,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,  18,   0,   0,   0, \n     38,   7,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     18,   0,   0,   0,  70,  14, \n     16,   0,  18,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  18,   0,   0,   0, \n     70,  14,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     85,   0,   0,  10,  50,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   0,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 131,   0, \n      0,   5,  82,   0,  16,   0, \n     16,   0,   0,   0,   6,   1, \n     16,   0,  16,   0,   0,   0, \n    131,   0,   0,   5, 162,   0, \n     16,   0,  16,   0,   0,   0, \n      6,   4,  16,   0,   5,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   5,   0, \n      0,   0,  70,   0,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    131,   0,   0,   5,  82,   0, \n     16,   0,  14,   0,   0,   0, \n      6,   1,  16,   0,  14,   0, \n      0,   0, 131,   0,   0,   5, \n    162,   0,  16,   0,  14,   0, \n      0,   0,   6,   4,  16,   0, \n      5,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      5,   0,   0,   0,  70,   0, \n     16,   0,  17,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 131,   0,   0,   5, \n     82,   0,  16,   0,  17,   0, \n      0,   0,   6,   1,  16,   0, \n     17,   0,   0,   0, 131,   0, \n      0,   5, 162,   0,  16,   0, \n     17,   0,   0,   0,   6,   4, \n     16,   0,   5,   0,   0,   0, \n     85,   0,   0,  10,  50,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   0,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 131,   0, \n      0,   5,  82,   0,  16,   0, \n     15,   0,   0,   0,   6,   1, \n     16,   0,  15,   0,   0,   0, \n    131,   0,   0,   5, 162,   0, \n     16,   0,  15,   0,   0,   0, \n      6,   4,  16,   0,   5,   0, \n      0,   0,   2,   0,   0,   1, \n     10,   0,   0,   1,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  17,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,  23,   0, \n      0,   1,  18,   0,   0,   1, \n     32,   0,   0,   7,  34,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      2,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n     15,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     54, 121,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     18,   0,   0,   1, 165,   0, \n      0,   8,  34,   0,  16,   0, \n     15,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8,  66,   0,  16,   0, \n     15,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     41,   0,   0,  10,  98,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     12,   0,   0,   0,   0,   0, \n      0,   0,  86,   5,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  98,   0,  16,   0, \n      1,   0,   0,   0,   6,   0, \n     16,   0,   0,   0,   0,   0, \n     86,   6,  16,   0,   1,   0, \n      0,   0, 165,   0,   0,   8, \n    130,   0,  16,   0,  15,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8,  18,   0,  16,   0, \n     15,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  76,   0, \n      0,   3,  42,   0,  16,   0, \n      5,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      0,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      1,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      5,   0,   0,   0,  86,   5, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     16,   0,   0,   0,  24,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   5,   0, \n      0,   0,  26,   0,  16,   0, \n     15,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59,  85,   0,   0,  10, \n    226,   0,  16,   0,   5,   0, \n      0,   0, 166,  10,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   5,   0,   0,   0, \n     42,   0,  16,   0,  15,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  14,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   5,   0,   0,   0, \n    246,  15,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  16,   0,   0,   0, \n     24,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      5,   0,   0,   0,  58,   0, \n     16,   0,  15,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  17,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     15,   0,   0,   0,   6,   0, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     16,   0,   0,   0,  24,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      2,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n     10,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      5,   0,   0,   0,  86,   5, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   5,   0, \n      0,   0,  26,   0,  16,   0, \n     15,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   3,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   8,  32, \n    128,  58,   8,  32, 128,  58, \n      8,  32, 128,  58, 171, 170, \n    170,  62,  85,   0,   0,  10, \n    226,   0,  16,   0,   5,   0, \n      0,   0, 166,  10,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   5,   0,   0,   0, \n     42,   0,  16,   0,  15,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   3,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  14,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   8,  32, 128,  58, \n      8,  32, 128,  58,   8,  32, \n    128,  58, 171, 170, 170,  62, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   5,   0,   0,   0, \n    246,  15,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     30,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      5,   0,   0,   0,  58,   0, \n     16,   0,  15,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      3,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  17,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      8,  32, 128,  58,   8,  32, \n    128,  58,   8,  32, 128,  58, \n    171, 170, 170,  62,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     15,   0,   0,   0,   6,   0, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   3,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   8,  32, 128,  58, \n      8,  32, 128,  58,   8,  32, \n    128,  58, 171, 170, 170,  62, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n     12,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  86,   9, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     30,   0,   0,   0,  30,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  18,   0, \n      0,   0,  26,   0,  16,   0, \n     15,   0,   0,   0,  54,   0, \n      0,   5,  98,   0,  16,   0, \n     18,   0,   0,   0,   6,   1, \n     16,   0,   5,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,  21,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0, 135,   0,   0,   5, \n    114,   0,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     22,   0,   0,   0,  70,   2, \n     16,   0,  22,   0,   0,   0, \n      2,  64,   0,   0, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255,   0,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  22,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  11, \n    114,   0,  16,   0,  23,   0, \n      0,   0,  70,   2,  16, 128, \n     65,   0,   0,   0,  22,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     23,   0,   0,   0,  70,   2, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16,   0,  21,   0, \n      0,   0,  70,   2,  16,   0, \n     23,   0,   0,   0, 140,   0, \n      0,  17, 114,   0,  16,   0, \n     18,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  23,   0,   0,   0, \n      2,  64,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 114,   0,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  86,   0,   0,   5, \n     98,   0,  16,   0,   1,   0, \n      0,   0, 166,  11,  16,   0, \n      5,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0, 230,  11, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  18,   0, \n      0,   0,  42,   0,  16,   0, \n     15,   0,   0,   0,  54,   0, \n      0,   5,  98,   0,  16,   0, \n     18,   0,   0,   0,   6,   3, \n     16,   0,   5,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,  21,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0, 135,   0,   0,   5, \n    114,   0,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     22,   0,   0,   0,  70,   2, \n     16,   0,  22,   0,   0,   0, \n      2,  64,   0,   0, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255,   0,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  22,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  11, \n    114,   0,  16,   0,  23,   0, \n      0,   0,  70,   2,  16, 128, \n     65,   0,   0,   0,  22,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     23,   0,   0,   0,  70,   2, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16,   0,  21,   0, \n      0,   0,  70,   2,  16,   0, \n     23,   0,   0,   0, 140,   0, \n      0,  17, 114,   0,  16,   0, \n     18,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  23,   0,   0,   0, \n      2,  64,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 114,   0,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  14,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  56,   0,   0,  10, \n     98,   0,  16,   0,   1,   0, \n      0,   0,  86,   6,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n    171, 170, 170,  62, 171, 170, \n    170,  62,   0,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   5,   0,   0,   0, \n     58,   0,  16,   0,  15,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 114,   0,  16,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0, 135,   0, \n      0,   5, 114,   0,  16,   0, \n     21,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16,   0,  21,   0, \n      0,   0,   2,  64,   0,   0, \n    232, 255, 255, 255, 232, 255, \n    255, 255, 232, 255, 255, 255, \n      0,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     21,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  21,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  11, 114,   0,  16,   0, \n     22,   0,   0,   0,  70,   2, \n     16, 128,  65,   0,   0,   0, \n     21,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  22,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  22,   0,   0,   0, \n    140,   0,   0,  17, 114,   0, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     21,   0,   0,   0,  70,   2, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,   5,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,   5,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  22,   0, \n      0,   0,   2,  64,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,   5,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 114,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  54,   0, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,  30,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,  86,   0,   0,   5, \n     50,   0,  16,   0,  18,   0, \n      0,   0, 198,   0,  16,   0, \n      5,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      5,   0,   0,   0,  10,   0, \n     16,   0,  15,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,  21,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0, 135,   0,   0,   5, \n    114,   0,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     22,   0,   0,   0,  70,   2, \n     16,   0,  22,   0,   0,   0, \n      2,  64,   0,   0, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255,   0,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  22,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  11, \n    114,   0,  16,   0,  23,   0, \n      0,   0,  70,   2,  16, 128, \n     65,   0,   0,   0,  22,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     23,   0,   0,   0,  70,   2, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16,   0,  21,   0, \n      0,   0,  70,   2,  16,   0, \n     23,   0,   0,   0, 140,   0, \n      0,  17, 114,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n      5,   0,   0,   0,  70,   2, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  23,   0,   0,   0, \n      2,  64,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 114,   0,  16,   0, \n      5,   0,   0,   0,  70,   2, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  56,   0,   0,  10, \n     50,   0,  16,   0,   5,   0, \n      0,   0,  70,   0,  16,   0, \n     18,   0,   0,   0,   2,  64, \n      0,   0, 171, 170, 170,  62, \n    171, 170, 170,  62,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5, 130,   0, \n     16,   0,  16,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  54,   0,   0,   5, \n    130,   0,  16,   0,  14,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  54,   0, \n      0,   5, 130,   0,  16,   0, \n     17,   0,   0,   0,  10,   0, \n     16,   0,   5,   0,   0,   0, \n     54,   0,   0,   5, 130,   0, \n     16,   0,  15,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n    150,   3,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  54,   0, \n      0,   5,  82,   0,  16,   0, \n     18,   0,   0,   0,   6,   1, \n     16,   0,   5,   0,   0,   0, \n     54,   0,   0,   5, 162,   0, \n     16,   0,  18,   0,   0,   0, \n     86,   9,  16,   0,  15,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,  18,   0, \n      0,   0,  70,  14,  16,   0, \n     18,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  18,   0,   0,   0, \n     70,  14,  16,   0,  18,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  18,   0, \n      0,   0,  70,  14,  16,   0, \n     18,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10,  50,   0, \n     16,   0,  16,   0,   0,   0, \n     70,   0,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0,   0,   0, \n      0,   0,   0,   0,  52,   0, \n      0,  10,  50,   0,  16,   0, \n     14,   0,   0,   0, 230,  10, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     98,   0,  16,   0,  15,   0, \n      0,   0, 166,  11,  16,   0, \n      5,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0, 214,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n     50,   0,  16,   0,  17,   0, \n      0,   0,  70,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     52,   0,   0,  10,  50,   0, \n     16,   0,  15,   0,   0,   0, \n    230,  10,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  17,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      6,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0, 150,   3, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 131,   0,   0,   5, \n     18,   0,  16,   0,  16,   0, \n      0,   0,  26,   0,  16,   0, \n     15,   0,   0,   0, 131,   0, \n      0,   5,  34,   0,  16,   0, \n     16,   0,   0,   0,  10,   0, \n     16,   0,   5,   0,   0,   0, \n    131,   0,   0,   5,  18,   0, \n     16,   0,  14,   0,   0,   0, \n     42,   0,  16,   0,  15,   0, \n      0,   0, 131,   0,   0,   5, \n     34,   0,  16,   0,  14,   0, \n      0,   0,  26,   0,  16,   0, \n      5,   0,   0,   0, 131,   0, \n      0,   5,  18,   0,  16,   0, \n     17,   0,   0,   0,  58,   0, \n     16,   0,  15,   0,   0,   0, \n    131,   0,   0,   5,  34,   0, \n     16,   0,  17,   0,   0,   0, \n     42,   0,  16,   0,   5,   0, \n      0,   0, 131,   0,   0,   5, \n     18,   0,  16,   0,  15,   0, \n      0,   0,  10,   0,  16,   0, \n     15,   0,   0,   0, 131,   0, \n      0,   5,  34,   0,  16,   0, \n     15,   0,   0,   0,  58,   0, \n     16,   0,   5,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     17,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   1, \n     10,   0,   0,   1,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     16,   0,   0,   0,  26,   0, \n     16,   0,  15,   0,   0,   0, \n     54,   0,   0,   8, 226,   0, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  14,   0, \n      0,   0,  42,   0,  16,   0, \n     15,   0,   0,   0,  54,   0, \n      0,   8, 226,   0,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  17,   0,   0,   0, \n     58,   0,  16,   0,  15,   0, \n      0,   0,  54,   0,   0,   8, \n    226,   0,  16,   0,  17,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 226,   0,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,  23,   0, \n      0,   1,  21,   0,   0,   1, \n      0,   0,   0,   7, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   7, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  14,   0, \n      0,   0,   0,   0,   0,   7, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  17,   0,   0,   0, \n      0,   0,   0,   7, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,  18,   0, \n      0,   1,  54,   0,   0,   5, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,  21,   0, \n      0,   1,  21,   0,   0,   1, \n     56,   0,   0,   7, 242,   0, \n     16,   0,   5,   0,   0,   0, \n    246,  15,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,  56,   0, \n      0,   7, 242,   0,  16,   0, \n      6,   0,   0,   0, 246,  15, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  56,   0,   0,   7, \n    242,   0,  16,   0,   8,   0, \n      0,   0, 246,  15,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n     56,   0,   0,   7, 242,   0, \n     16,   0,   7,   0,   0,   0, \n    246,  15,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,  31,   0, \n      4,   3,  58,   0,  16,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  82,   0,  16,   0, \n      5,   0,   0,   0, 166,   8, \n     16,   0,   5,   0,   0,   0, \n     54,   0,   0,   5,  82,   0, \n     16,   0,   6,   0,   0,   0, \n    166,   8,  16,   0,   6,   0, \n      0,   0,  54,   0,   0,   5, \n     82,   0,  16,   0,   8,   0, \n      0,   0, 166,   8,  16,   0, \n      8,   0,   0,   0,  54,   0, \n      0,   5,  82,   0,  16,   0, \n      7,   0,   0,   0, 166,   8, \n     16,   0,   7,   0,   0,   0, \n     21,   0,   0,   1,  76,   0, \n      0,   3,  10,   0,  16,   0, \n      2,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      3,   0,   0,   0,  54,  32, \n      0,   5, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     50,   0,   0,  15, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 248,  65,   0,   0, \n    248,  65,   0,   0, 248,  65, \n      0,   0, 128,  63,   2,  64, \n      0,   0,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,  63,   0,   0,   0,  63, \n     28,   0,   0,   5, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      9,   0,   0,   0,   1,  64, \n      0,   0,  32,   0,   0,   0, \n     10,   0,  16,   0,   9,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      9,   0,   0,   0,   1,  64, \n      0,   0,   0,   4,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      9,   0,   0,   0,   1,  64, \n      0,   0,   0, 128,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  54,  32,   0,   5, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  50,   0, \n      0,  15, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    248,  65,   0,   0, 248,  65, \n      0,   0, 248,  65,   0,   0, \n    128,  63,   2,  64,   0,   0, \n      0,   0,   0,  63,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,  28,   0, \n      0,   5, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n     35,   0,   0,   9,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   9,   0, \n      0,   0,   1,  64,   0,   0, \n     32,   0,   0,   0,  10,   0, \n     16,   0,   9,   0,   0,   0, \n     35,   0,   0,   9,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   9,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   4,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     41,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   9,   0, \n      0,   0,   1,  64,   0,   0, \n     31,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      1,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  54,  32,   0,   5, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,  50,   0, \n      0,  15, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    248,  65,   0,   0, 248,  65, \n      0,   0, 248,  65,   0,   0, \n    128,  63,   2,  64,   0,   0, \n      0,   0,   0,  63,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,  28,   0, \n      0,   5, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   9,   0, \n      0,   0,   1,  64,   0,   0, \n     32,   0,   0,   0,  10,   0, \n     16,   0,   9,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   9,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   4,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   9,   0, \n      0,   0,   1,  64,   0,   0, \n      0, 128,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     54,  32,   0,   5, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  50,   0,   0,  15, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 248,  65, \n      0,   0, 248,  65,   0,   0, \n    248,  65,   0,   0, 128,  63, \n      2,  64,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,  63,  28,   0,   0,   5, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   9,   0,   0,   0, \n      1,  64,   0,   0,  32,   0, \n      0,   0,  10,   0,  16,   0, \n      9,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   9,   0,   0,   0, \n      1,  64,   0,   0,   0,   4, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   9,   0,   0,   0, \n      1,  64,   0,   0,  31,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   1,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      4,   0,   0,   0,  54,  32, \n      0,   5, 114,   0,  16,   0, \n      5,   0,   0,   0,  70,   2, \n     16,   0,   5,   0,   0,   0, \n     50,   0,   0,  15, 226,   0, \n     16,   0,   1,   0,   0,   0, \n      6,   9,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    248,  65,   0,   0, 124,  66, \n      0,   0, 248,  65,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,  63,   0,   0, \n      0,  63,   0,   0,   0,  63, \n     28,   0,   0,   5, 226,   0, \n     16,   0,   1,   0,   0,   0, \n     86,  14,  16,   0,   1,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  32,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   0,   8,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  54,  32,   0,   5, \n    114,   0,  16,   0,   6,   0, \n      0,   0,  70,   2,  16,   0, \n      6,   0,   0,   0,  50,   0, \n      0,  15, 178,   0,  16,   0, \n      2,   0,   0,   0,  70,   8, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    248,  65,   0,   0, 124,  66, \n      0,   0,   0,   0,   0,   0, \n    248,  65,   2,  64,   0,   0, \n      0,   0,   0,  63,   0,   0, \n      0,  63,   0,   0,   0,   0, \n      0,   0,   0,  63,  28,   0, \n      0,   5, 178,   0,  16,   0, \n      2,   0,   0,   0,  70,  12, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,   9,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n     32,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     41,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n     27,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      1,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  54,  32,   0,   5, \n    114,   0,  16,   0,   8,   0, \n      0,   0,  70,   2,  16,   0, \n      8,   0,   0,   0,  50,   0, \n      0,  15, 226,   0,  16,   0, \n      1,   0,   0,   0,   6,   9, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0, 248,  65, \n      0,   0, 124,  66,   0,   0, \n    248,  65,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,  28,   0, \n      0,   5, 226,   0,  16,   0, \n      1,   0,   0,   0,  86,  14, \n     16,   0,   1,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     32,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   8,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     54,  32,   0,   5, 114,   0, \n     16,   0,   7,   0,   0,   0, \n     70,   2,  16,   0,   7,   0, \n      0,   0,  50,   0,   0,  15, \n    178,   0,  16,   0,   2,   0, \n      0,   0,  70,   8,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 248,  65, \n      0,   0, 124,  66,   0,   0, \n      0,   0,   0,   0, 248,  65, \n      2,  64,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,   0,   0,   0, \n      0,  63,  28,   0,   0,   5, \n    178,   0,  16,   0,   2,   0, \n      0,   0,  70,  12,  16,   0, \n      2,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,  32,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,  27,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   1,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      5,   0,   0,   0,  54,  32, \n      0,   5, 114,   0,  16,   0, \n      5,   0,   0,   0,  70,   2, \n     16,   0,   5,   0,   0,   0, \n     50,   0,   0,  15, 226,   0, \n     16,   0,   1,   0,   0,   0, \n      6,   9,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    248,  65,   0,   0, 248,  65, \n      0,   0, 124,  66,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,  63,   0,   0, \n      0,  63,   0,   0,   0,  63, \n     28,   0,   0,   5, 226,   0, \n     16,   0,   1,   0,   0,   0, \n     86,  14,  16,   0,   1,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  32,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   0,   4,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  54,  32,   0,   5, \n    114,   0,  16,   0,   6,   0, \n      0,   0,  70,   2,  16,   0, \n      6,   0,   0,   0,  50,   0, \n      0,  15, 178,   0,  16,   0, \n      2,   0,   0,   0,  70,   8, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    248,  65,   0,   0, 248,  65, \n      0,   0,   0,   0,   0,   0, \n    124,  66,   2,  64,   0,   0, \n      0,   0,   0,  63,   0,   0, \n      0,  63,   0,   0,   0,   0, \n      0,   0,   0,  63,  28,   0, \n      0,   5, 178,   0,  16,   0, \n      2,   0,   0,   0,  70,  12, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,   9,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n     32,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     41,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n     26,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      1,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  54,  32,   0,   5, \n    114,   0,  16,   0,   8,   0, \n      0,   0,  70,   2,  16,   0, \n      8,   0,   0,   0,  50,   0, \n      0,  15, 226,   0,  16,   0, \n      1,   0,   0,   0,   6,   9, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0, 248,  65, \n      0,   0, 248,  65,   0,   0, \n    124,  66,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,  28,   0, \n      0,   5, 226,   0,  16,   0, \n      1,   0,   0,   0,  86,  14, \n     16,   0,   1,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     32,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   4,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     54,  32,   0,   5, 114,   0, \n     16,   0,   7,   0,   0,   0, \n     70,   2,  16,   0,   7,   0, \n      0,   0,  50,   0,   0,  15, \n    178,   0,  16,   0,   2,   0, \n      0,   0,  70,   8,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 248,  65, \n      0,   0, 248,  65,   0,   0, \n      0,   0,   0,   0, 124,  66, \n      2,  64,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,   0,   0,   0, \n      0,  63,  28,   0,   0,   5, \n    178,   0,  16,   0,   2,   0, \n      0,   0,  70,  12,  16,   0, \n      2,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,  32,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,  26,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   1,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n     10,   0,   0,   0,  54,  32, \n      0,   5,  50,   0,  16,   0, \n      5,   0,   0,   0,  70,   0, \n     16,   0,   5,   0,   0,   0, \n     54,  32,   0,   5, 194,   0, \n     16,   0,   5,   0,   0,   0, \n      6,   4,  16,   0,   6,   0, \n      0,   0,  50,   0,   0,  15, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 127,  67, \n      0,   0, 127,  67,   0,   0, \n    127,  67,   0,   0, 127,  67, \n      2,  64,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,  63,  28,   0,   0,   5, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   9,   0,   0,   0, \n      1,  64,   0,   0,   0,   1, \n      0,   0,  10,   0,  16,   0, \n      9,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   9,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      1,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   9,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   1,  26,   0,  16,   0, \n      1,   0,   0,   0,  54,  32, \n      0,   5,  50,   0,  16,   0, \n      8,   0,   0,   0,  70,   0, \n     16,   0,   8,   0,   0,   0, \n     54,  32,   0,   5, 194,   0, \n     16,   0,   8,   0,   0,   0, \n      6,   4,  16,   0,   7,   0, \n      0,   0,  50,   0,   0,  15, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 127,  67, \n      0,   0, 127,  67,   0,   0, \n    127,  67,   0,   0, 127,  67, \n      2,  64,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,  63,  28,   0,   0,   5, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   9,   0,   0,   0, \n      1,  64,   0,   0,   0,   1, \n      0,   0,  10,   0,  16,   0, \n      9,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   9,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      1,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  35,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   9,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   1,  26,   0,  16,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,  15,   0, \n      0,   0,  54,  32,   0,   5, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  50,   0, \n      0,  15, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    112,  65,   0,   0, 112,  65, \n      0,   0, 112,  65,   0,   0, \n    112,  65,   2,  64,   0,   0, \n      0,   0,   0,  63,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,  28,   0, \n      0,   5, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   9,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0,  10,   0, \n     16,   0,   9,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   9,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   1,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   9,   0, \n      0,   0,   1,  64,   0,   0, \n      0,  16,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     54,  32,   0,   5, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  50,   0,   0,  15, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 112,  65, \n      0,   0, 112,  65,   0,   0, \n    112,  65,   0,   0, 112,  65, \n      2,  64,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,  63,  28,   0,   0,   5, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   9,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0,  10,   0,  16,   0, \n      9,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   9,   0,   0,   0, \n      1,  64,   0,   0,   0,   1, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   9,   0,   0,   0, \n      1,  64,   0,   0,  28,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   1,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     54,  32,   0,   5, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,  50,   0,   0,  15, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 112,  65, \n      0,   0, 112,  65,   0,   0, \n    112,  65,   0,   0, 112,  65, \n      2,  64,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,  63,  28,   0,   0,   5, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   9,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0,  10,   0,  16,   0, \n      9,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   9,   0,   0,   0, \n      1,  64,   0,   0,   0,   1, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   9,   0,   0,   0, \n      1,  64,   0,   0,   0,  16, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  54,  32, \n      0,   5, 242,   0,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n     50,   0,   0,  15, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 112,  65,   0,   0, \n    112,  65,   0,   0, 112,  65, \n      0,   0, 112,  65,   2,  64, \n      0,   0,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,  63,   0,   0,   0,  63, \n     28,   0,   0,   5, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      9,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n     10,   0,  16,   0,   9,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      9,   0,   0,   0,   1,  64, \n      0,   0,   0,   1,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  41,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      9,   0,   0,   0,   1,  64, \n      0,   0,  28,   0,   0,   0, \n     35,   0,   0,   9,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   1,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,  24,   0, \n      0,   0,  54,  32,   0,   5, \n     66,   0,  16,   0,   7,   0, \n      0,   0,  10,   0,  16,   0, \n      5,   0,   0,   0,  54,  32, \n      0,   5,  34,   0,  16,   0, \n      7,   0,   0,   0,  10,   0, \n     16,   0,   6,   0,   0,   0, \n     54,  32,   0,   5, 130,   0, \n     16,   0,   7,   0,   0,   0, \n     10,   0,  16,   0,   8,   0, \n      0,   0,  54,  32,   0,   5, \n     18,   0,  16,   0,   7,   0, \n      0,   0,  10,   0,  16,   0, \n      7,   0,   0,   0,  50,   0, \n      0,  15, 242,   0,  16,   0, \n      9,   0,   0,   0, 102,   3, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n    127,  71,   0, 255, 127,  71, \n      0, 255, 127,  71,   0, 255, \n    127,  71,   2,  64,   0,   0, \n      0,   0,   0,  63,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,  28,   0, \n      0,   5, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n     35,   0,   0,  12, 146,   0, \n     16,   0,   0,   0,   0,   0, \n     86,  13,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   6,   8, \n     16,   0,   9,   0,   0,   0, \n      2,   0,   0,   1,  10,   0, \n      0,   1, 130,   0,   0,   5, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      5,   0,   0,   0, 130,   0, \n      0,   5,  66,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   6,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   1,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n    130,   0,   0,   5,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   8,   0, \n      0,   0, 130,   0,   0,   5, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      7,   0,   0,   0,  35,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      1,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   1,  23,   0,   0,   1, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  11,  66,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  42, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  10,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  42,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n    118,  15,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,   5,   0, \n      0,   0,   1,   0,   0,   0, \n      3,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  20,  50,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   6,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 166,  10,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  66,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  17, \n     50,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    166,  10,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  17,  50,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  86,   5,  16,   0, \n      3,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n    140,   0,   0,  17, 162,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  25,   0,   0,   0, \n      0,   0,   0,   0,  25,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n      6,   4,  16,   0,   2,   0, \n      0,   0,  87,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n    138,   0,   0,   9,  66,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n    140,   0,   0,  20,  50,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,  11,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 166,  10, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n    140,   0,   0,  11,  66,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  64,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  66,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0, 139,   0,   0,  15, \n    226,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  28,   0, \n      0,   0,  27,   0,   0,   0, \n     24,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   4,   0, \n      0,   0,   7,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     66,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   5,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  66,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   8,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  66,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  20,   0, \n      0,   0,   1,  64,   0,   0, \n     12,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  18,   0,   0,   1, \n     42,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,   1,   0,   0,   0, \n      4,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  20, 226,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      4,   0,   0,   0,  11,   0, \n      0,   0, 166,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  17,  98,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   3,   0,   0,   0, \n     86,   6,  16,   0,   1,   0, \n      0,   0,  35,   0,   0,  12, \n     50,   0,  16,   0,   1,   0, \n      0,   0,   6,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  64,   0,   0,   0, \n    128,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    150,   5,  16,   0,   1,   0, \n      0,   0, 138,   0,   0,   9, \n     66,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,  42,   0,   0,   7, \n     18,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n    140,   0,   0,  11,  18,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n    140,   0,   0,  11,  18,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  64,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  30,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0, 139,   0,   0,  15, \n    210,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     28,   0,   0,   0,   0,   0, \n      0,   0,  27,   0,   0,   0, \n     24,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   4,   0, \n      0,   0,   7,   0,   0,   0, \n      6,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   5,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   8,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  66,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  20,   0, \n      0,   0,   1,  64,   0,   0, \n     12,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  21,   0,   0,   1, \n     30,   0,   0,   9,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  10, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     32,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10,  50,   0,  16,   0, \n      1,   0,   0,   0, 198,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n    194,   0,  16,   0,   1,   0, \n      0,   0,   6,  12,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255, 255,   0, 255,   0, \n    255,   0, 255,   0,  30,   0, \n      0,   7, 146,   0,  16,   0, \n      0,   0,   0,   0, 166,  14, \n     16,   0,   1,   0,   0,   0, \n      6,   4,  16,   0,   1,   0, \n      0,   0,  21,   0,   0,   1, \n    166,   0,   0,   8,  50, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n    198,   0,  16,   0,   0,   0, \n      0,   0,  62,   0,   0,   1, \n     83,  84,  65,  84, 148,   0, \n      0,   0,   1,   5,   0,   0, \n     24,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n    131,   0,   0,   0,  22,   1, \n      0,   0, 164,   0,   0,   0, \n     61,   0,   0,   0,  29,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  44,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    195,   0,   0,   0,  64,   0, \n      0,   0,  83,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/resolve_full_16bpp_scaled_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_resolve_edram_info;        // Offset:    0 Size:     4\n//   uint xe_resolve_coordinate_info;   // Offset:    4 Size:     4\n//   uint xe_resolve_dest_info;         // Offset:    8 Size:     4\n//   uint xe_resolve_dest_coordinate_info;// Offset:   12 Size:     4\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_resolve_edram                  texture    byte         r/o      T0             t0      1 \n// xe_resolve_dest                       UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][1], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xy\ndcl_temps 24\ndcl_thread_group 8, 8, 1\nand r0.xyzw, CB0[0][0].xxzz, l(1023, 0x20000000, 7, 8)\nif_nz r0.y\n  ubfe r1.xy, l(2, 2, 0, 0), l(17, 20, 0, 0), CB0[0][0].yyyy\nelse \n  mov r1.xy, l(0,0,0,0)\nendif \nubfe r2.xyz, l(3, 3, 11, 0), l(16, 19, 5, 0), CB0[0][0].yyyy\nimul null, r0.y, r2.x, r2.z\nand r1.zw, CB0[0][0].zzzw, l(0, 0, 0x01000000, 1023)\nushr r3.xyzw, CB0[0][0].ywww, l(4, 10, 20, 24)\nishl r4.x, vThreadID.x, l(2)\nishl r0.y, r0.y, l(3)\nuge r0.y, r4.x, r0.y\nif_nz r0.y\n  ret \nendif \nubfe r5.xyzw, l(2, 11, 4, 1), l(10, 13, 24, 28), CB0[0][0].xxxx\nmov r6.x, CB0[0][0].y\nmov r6.y, r3.x\nbfi r2.zw, l(0, 0, 4, 1), l(0, 0, 3, 3), r6.xxxy, l(0, 0, 0, 0)\nibfe r0.y, l(6), l(16), CB0[0][0].z\nishl r0.y, r0.y, l(23)\niadd r0.y, r0.y, l(0x3f800000)\nbfi r3.xz, l(4, 0, 4, 0), l(3, 0, 3, 0), r3.wwzw, l(0, 0, 0, 0)\nubfe r6.xy, l(6, 3, 0, 0), l(7, 28, 0, 0), CB0[0][0].zwzz\numax r4.y, r1.y, vThreadID.y\nimad r2.zw, r2.zzzw, r2.xxxy, r4.xxxy\nuge r1.y, l(3), r6.y\nif_nz r1.y\n  mov r7.y, r6.y\nelse \n  ieq r1.y, r6.y, l(5)\n  if_nz r1.y\n    mov r7.y, l(2)\n  else \n    mov r7.y, l(0)\n  endif \nendif \nuge r4.yw, r5.xxxx, l(0, 2, 0, 1)\nand r4.yw, r4.yyyw, l(0, 1, 0, 1)\nishl r2.zw, r2.zzzw, r4.yyyw\nushr r7.x, r7.y, l(1)\nand r6.zw, r7.xxxy, l(0, 0, 1, 1)\niadd r2.zw, r2.zzzw, r6.zzzw\nimul null, r7.yz, r2.xxyx, l(0, 80, 16, 0)\nushr r7.x, r7.y, r5.w\nudiv r6.zw, null, r2.zzzw, r7.xxxz\nimad r0.x, r6.w, r0.x, r6.z\niadd r0.x, r0.x, r5.y\nimad r2.zw, -r6.zzzw, r7.xxxz, r2.zzzw\nimul null, r1.y, r7.z, r7.y\nimad r2.z, r2.w, r7.x, r2.z\nishl r2.z, r2.z, r5.w\nimad r0.x, r0.x, r1.y, r2.z\nishl r1.y, r1.y, l(11)\nudiv null, r0.x, r0.x, r1.y\nishl r0.x, r0.x, l(2)\niadd r1.y, r4.y, r5.w\nishl r2.z, l(4), r1.y\nif_nz r5.w\n  ieq r2.w, r2.z, l(8)\n  if_nz r2.w\n    ld_raw r7.xyzw, r0.x, T0[0].zwxy\n    iadd r2.w, r0.x, l(16)\n    ld_raw r8.xyzw, r2.w, T0[0].zwxy\n    mov r9.xy, r7.zwzz\n    mov r10.xy, r8.zwzz\n  else \n    ld_raw r9.xy, r0.x, T0[0].xyxx\n    iadd r2.w, r0.x, r2.z\n    ld_raw r7.xy, r2.w, T0[0].xyxx\n    ishl r4.yw, l(0, 8, 0, 12), r1.yyyy\n    iadd r4.yw, r0.xxxx, r4.yyyw\n    ld_raw r10.xy, r4.y, T0[0].xyxx\n    ld_raw r8.xy, r4.w, T0[0].xyxx\n  endif \n  switch r5.z\n    case l(5)\n    ishl r9.zw, r9.xxxy, l(0, 0, 16, 16)\n    ishr r11.xyzw, r9.zxwy, l(16, 16, 16, 16)\n    itof r11.xyzw, r11.xyzw\n    mul r11.xyzw, r11.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n    max r9.xyzw, r11.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n    ishl r7.zw, r7.xxxy, l(0, 0, 16, 16)\n    ishr r11.xyzw, r7.zxwy, l(16, 16, 16, 16)\n    itof r11.xyzw, r11.xyzw\n    mul r11.xyzw, r11.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n    max r7.xyzw, r11.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n    ishl r10.zw, r10.xxxy, l(0, 0, 16, 16)\n    ishr r11.xyzw, r10.zxwy, l(16, 16, 16, 16)\n    itof r11.xyzw, r11.xyzw\n    mul r11.xyzw, r11.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n    max r10.xyzw, r11.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n    ishl r8.zw, r8.xxxy, l(0, 0, 16, 16)\n    ishr r11.xyzw, r8.zxwy, l(16, 16, 16, 16)\n    itof r11.xyzw, r11.xyzw\n    mul r11.xyzw, r11.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n    max r8.xyzw, r11.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n    break \n    case l(7)\n    ushr r4.yw, r9.xxxy, l(0, 16, 0, 16)\n    f16tof32 r9.xz, r9.xxyx\n    f16tof32 r9.yw, r4.yyyw\n    ushr r4.yw, r7.xxxy, l(0, 16, 0, 16)\n    f16tof32 r7.xz, r7.xxyx\n    f16tof32 r7.yw, r4.yyyw\n    ushr r4.yw, r10.xxxy, l(0, 16, 0, 16)\n    f16tof32 r10.xz, r10.xxyx\n    f16tof32 r10.yw, r4.yyyw\n    ushr r4.yw, r8.xxxy, l(0, 16, 0, 16)\n    f16tof32 r8.xz, r8.xxyx\n    f16tof32 r8.yw, r4.yyyw\n    break \n    default \n    mov r9.zw, l(0,0,0,0)\n    mov r7.zw, l(0,0,0,0)\n    mov r10.zw, l(0,0,0,0)\n    mov r8.zw, l(0,0,0,0)\n    break \n  endswitch \nelse \n  ieq r2.w, r2.z, l(4)\n  if_nz r2.w\n    ld_raw r8.xyzw, r0.x, T0[0].wxyz\n  else \n    ld_raw r8.y, r0.x, T0[0].xxxx\n    iadd r2.w, r0.x, r2.z\n    ld_raw r8.z, r2.w, T0[0].xxxx\n    ishl r4.yw, l(0, 8, 0, 12), r1.yyyy\n    iadd r4.yw, r0.xxxx, r4.yyyw\n    ld_raw r8.w, r4.y, T0[0].xxxx\n    ld_raw r8.x, r4.w, T0[0].xxxx\n  endif \n  switch r5.z\n    case l(0)\n    case l(1)\n    ushr r11.yzw, r8.yyyy, l(0, 8, 16, 24)\n    mov r11.x, r8.y\n    and r11.xyzw, r11.xyzw, l(255, 255, 255, 255)\n    utof r11.xyzw, r11.xyzw\n    mul r9.xyzw, r11.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n    ushr r11.yzw, r8.zzzz, l(0, 8, 16, 24)\n    mov r11.x, r8.z\n    and r11.xyzw, r11.xyzw, l(255, 255, 255, 255)\n    utof r11.xyzw, r11.xyzw\n    mul r7.xyzw, r11.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n    ushr r11.yzw, r8.wwww, l(0, 8, 16, 24)\n    mov r11.x, r8.w\n    and r11.xyzw, r11.xyzw, l(255, 255, 255, 255)\n    utof r11.xyzw, r11.xyzw\n    mul r10.xyzw, r11.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n    ushr r8.yzw, r8.xxxx, l(0, 8, 16, 24)\n    and r11.xyzw, r8.xyzw, l(255, 255, 255, 255)\n    utof r11.xyzw, r11.xyzw\n    mul r8.xyzw, r11.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n    break \n    case l(2)\n    case l(10)\n    ushr r11.yzw, r8.yyyy, l(0, 10, 20, 30)\n    mov r11.x, r8.y\n    and r11.xyzw, r11.xyzw, l(1023, 1023, 1023, 3)\n    utof r11.xyzw, r11.xyzw\n    mul r9.xyzw, r11.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n    ushr r11.yzw, r8.zzzz, l(0, 10, 20, 30)\n    mov r11.x, r8.z\n    and r11.xyzw, r11.xyzw, l(1023, 1023, 1023, 3)\n    utof r11.xyzw, r11.xyzw\n    mul r7.xyzw, r11.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n    ushr r11.yzw, r8.wwww, l(0, 10, 20, 30)\n    mov r11.x, r8.w\n    and r11.xyzw, r11.xyzw, l(1023, 1023, 1023, 3)\n    utof r11.xyzw, r11.xyzw\n    mul r10.xyzw, r11.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n    ushr r8.yzw, r8.xxxx, l(0, 10, 20, 30)\n    and r11.xyzw, r8.xyzw, l(1023, 1023, 1023, 3)\n    utof r11.xyzw, r11.xyzw\n    mul r8.xyzw, r11.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n    break \n    case l(3)\n    case l(12)\n    ushr r11.xyzw, r8.yyyz, l(10, 20, 30, 30)\n    mov r12.x, r8.y\n    mov r12.yz, r11.xxyx\n    and r13.xyz, r12.xyzx, l(1023, 1023, 1023, 0)\n    and r14.xyz, r12.xyzx, l(127, 127, 127, 0)\n    ubfe r15.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r12.xyzx\n    firstbit_hi r16.xyz, r14.xyzx\n    iadd r16.xyz, r16.xyzx, l(-24, -24, -24, 0)\n    movc r16.xyz, r14.xyzx, r16.xyzx, l(8,8,8,0)\n    iadd r17.xyz, -r16.xyzx, l(1, 1, 1, 0)\n    movc r17.xyz, r15.xyzx, r15.xyzx, r17.xyzx\n    bfi r12.xyz, l(7, 7, 7, 0), r16.xyzx, r12.xyzx, l(0, 0, 0, 0)\n    and r12.xyz, r12.xyzx, l(127, 127, 127, 0)\n    movc r12.xyz, r15.xyzx, r14.xyzx, r12.xyzx\n    ishl r14.xyz, r17.xyzx, l(23, 23, 23, 0)\n    iadd r14.xyz, r14.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n    ishl r12.xyz, r12.xyzx, l(16, 16, 16, 0)\n    iadd r12.xyz, r14.xyzx, r12.xyzx\n    movc r9.xyz, r13.xyzx, r12.xyzx, l(0,0,0,0)\n    utof r4.yw, r11.zzzw\n    ushr r11.xyzw, r8.zwwz, l(10, 10, 20, 20)\n    mov r12.x, r8.z\n    mov r12.yz, r11.xxwx\n    and r13.xyz, r12.xyzx, l(1023, 1023, 1023, 0)\n    and r14.xyz, r12.xyzx, l(127, 127, 127, 0)\n    ubfe r15.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r12.xyzx\n    firstbit_hi r16.xyz, r14.xyzx\n    iadd r16.xyz, r16.xyzx, l(-24, -24, -24, 0)\n    movc r16.xyz, r14.xyzx, r16.xyzx, l(8,8,8,0)\n    iadd r17.xyz, -r16.xyzx, l(1, 1, 1, 0)\n    movc r17.xyz, r15.xyzx, r15.xyzx, r17.xyzx\n    bfi r12.xyz, l(7, 7, 7, 0), r16.xyzx, r12.xyzx, l(0, 0, 0, 0)\n    and r12.xyz, r12.xyzx, l(127, 127, 127, 0)\n    movc r12.xyz, r15.xyzx, r14.xyzx, r12.xyzx\n    ishl r14.xyz, r17.xyzx, l(23, 23, 23, 0)\n    iadd r14.xyz, r14.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n    ishl r12.xyz, r12.xyzx, l(16, 16, 16, 0)\n    iadd r12.xyz, r14.xyzx, r12.xyzx\n    movc r7.xyz, r13.xyzx, r12.xyzx, l(0,0,0,0)\n    mul r4.yw, r4.yyyw, l(0.000000, 0.333333, 0.000000, 0.333333)\n    mov r11.x, r8.w\n    and r12.xyz, r11.xyzx, l(1023, 1023, 1023, 0)\n    and r13.xyz, r11.xyzx, l(127, 127, 127, 0)\n    ubfe r14.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r11.xyzx\n    firstbit_hi r15.xyz, r13.xyzx\n    iadd r15.xyz, r15.xyzx, l(-24, -24, -24, 0)\n    movc r15.xyz, r13.xyzx, r15.xyzx, l(8,8,8,0)\n    iadd r16.xyz, -r15.xyzx, l(1, 1, 1, 0)\n    movc r16.xyz, r14.xyzx, r14.xyzx, r16.xyzx\n    bfi r11.xyz, l(7, 7, 7, 0), r15.xyzx, r11.xyzx, l(0, 0, 0, 0)\n    and r11.xyz, r11.xyzx, l(127, 127, 127, 0)\n    movc r11.xyz, r14.xyzx, r13.xyzx, r11.xyzx\n    ishl r13.xyz, r16.xyzx, l(23, 23, 23, 0)\n    iadd r13.xyz, r13.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n    ishl r11.xyz, r11.xyzx, l(16, 16, 16, 0)\n    iadd r11.xyz, r13.xyzx, r11.xyzx\n    movc r10.xyz, r12.xyzx, r11.xyzx, l(0,0,0,0)\n    ushr r11.xyzw, r8.wxxx, l(30, 10, 20, 30)\n    utof r5.xy, r11.xwxx\n    mov r11.x, r8.x\n    and r12.xyz, r11.xyzx, l(1023, 1023, 1023, 0)\n    and r13.xyz, r11.xyzx, l(127, 127, 127, 0)\n    ubfe r14.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r11.xyzx\n    firstbit_hi r15.xyz, r13.xyzx\n    iadd r15.xyz, r15.xyzx, l(-24, -24, -24, 0)\n    movc r15.xyz, r13.xyzx, r15.xyzx, l(8,8,8,0)\n    iadd r16.xyz, -r15.xyzx, l(1, 1, 1, 0)\n    movc r16.xyz, r14.xyzx, r14.xyzx, r16.xyzx\n    bfi r11.xyz, l(7, 7, 7, 0), r15.xyzx, r11.xyzx, l(0, 0, 0, 0)\n    and r11.xyz, r11.xyzx, l(127, 127, 127, 0)\n    movc r11.xyz, r14.xyzx, r13.xyzx, r11.xyzx\n    ishl r13.xyz, r16.xyzx, l(23, 23, 23, 0)\n    iadd r13.xyz, r13.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n    ishl r11.xyz, r11.xyzx, l(16, 16, 16, 0)\n    iadd r11.xyz, r13.xyzx, r11.xyzx\n    movc r8.xyz, r12.xyzx, r11.xyzx, l(0,0,0,0)\n    mul r5.xy, r5.xyxx, l(0.333333, 0.333333, 0.000000, 0.000000)\n    mov r9.w, r4.y\n    mov r7.w, r4.w\n    mov r10.w, r5.x\n    mov r8.w, r5.y\n    break \n    case l(4)\n    ishl r11.xyzw, r8.yzwx, l(16, 16, 16, 16)\n    mov r12.xz, r11.xxyx\n    mov r12.yw, r8.yyyz\n    ishr r12.xyzw, r12.xyzw, l(16, 16, 16, 16)\n    itof r12.xyzw, r12.xyzw\n    mul r12.xyzw, r12.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n    max r9.xy, r12.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n    max r7.xy, r12.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n    mov r8.yz, r11.zzwz\n    ishr r11.xyzw, r8.ywzx, l(16, 16, 16, 16)\n    itof r11.xyzw, r11.xyzw\n    mul r11.xyzw, r11.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n    max r10.xy, r11.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n    max r8.xy, r11.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n    mov r9.zw, l(0,0,0,0)\n    mov r7.zw, l(0,0,0,0)\n    mov r10.zw, l(0,0,0,0)\n    mov r8.zw, l(0,0,0,0)\n    break \n    case l(6)\n    ushr r11.xyzw, r8.yzwx, l(16, 16, 16, 16)\n    f16tof32 r9.x, r8.y\n    f16tof32 r9.y, r11.x\n    f16tof32 r7.x, r8.z\n    f16tof32 r7.y, r11.y\n    f16tof32 r10.x, r8.w\n    f16tof32 r10.y, r11.z\n    f16tof32 r8.x, r8.x\n    f16tof32 r8.y, r11.w\n    mov r9.zw, l(0,0,0,0)\n    mov r7.zw, l(0,0,0,0)\n    mov r10.zw, l(0,0,0,0)\n    mov r8.zw, l(0,0,0,0)\n    break \n    default \n    mov r9.x, r8.y\n    mov r9.yzw, l(0,0,0,0)\n    mov r7.x, r8.z\n    mov r7.yzw, l(0,0,0,0)\n    mov r10.x, r8.w\n    mov r10.yzw, l(0,0,0,0)\n    mov r8.yzw, l(0,0,0,0)\n    break \n  endswitch \nendif \nuge r2.w, r6.y, l(4)\nif_nz r2.w\n  mul r2.w, r0.y, l(0.500000)\n  imad r3.w, l(320), r2.x, r0.x\n  if_nz r5.w\n    ieq r4.y, r2.z, l(8)\n    if_nz r4.y\n      ld_raw r11.xyzw, r3.w, T0[0].zwxy\n      iadd r4.y, r3.w, l(16)\n      ld_raw r12.xyzw, r4.y, T0[0].zwxy\n      mov r13.xy, r11.zwzz\n      mov r14.xy, r12.zwzz\n    else \n      ld_raw r13.xy, r3.w, T0[0].xyxx\n      iadd r4.y, r2.z, r3.w\n      ld_raw r11.xy, r4.y, T0[0].xyxx\n      ishl r4.yw, l(0, 8, 0, 12), r1.yyyy\n      iadd r4.yw, r3.wwww, r4.yyyw\n      ld_raw r14.xy, r4.y, T0[0].xyxx\n      ld_raw r12.xy, r4.w, T0[0].xyxx\n    endif \n    switch r5.z\n      case l(5)\n      ishl r13.zw, r13.xxxy, l(0, 0, 16, 16)\n      ishr r15.xyzw, r13.zxwy, l(16, 16, 16, 16)\n      itof r15.xyzw, r15.xyzw\n      mul r15.xyzw, r15.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n      max r13.xyzw, r15.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n      ishl r11.zw, r11.xxxy, l(0, 0, 16, 16)\n      ishr r15.xyzw, r11.zxwy, l(16, 16, 16, 16)\n      itof r15.xyzw, r15.xyzw\n      mul r15.xyzw, r15.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n      max r11.xyzw, r15.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n      ishl r14.zw, r14.xxxy, l(0, 0, 16, 16)\n      ishr r15.xyzw, r14.zxwy, l(16, 16, 16, 16)\n      itof r15.xyzw, r15.xyzw\n      mul r15.xyzw, r15.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n      max r14.xyzw, r15.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n      ishl r12.zw, r12.xxxy, l(0, 0, 16, 16)\n      ishr r15.xyzw, r12.zxwy, l(16, 16, 16, 16)\n      itof r15.xyzw, r15.xyzw\n      mul r15.xyzw, r15.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n      max r12.xyzw, r15.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n      break \n      case l(7)\n      ushr r4.yw, r13.xxxy, l(0, 16, 0, 16)\n      f16tof32 r13.xz, r13.xxyx\n      f16tof32 r13.yw, r4.yyyw\n      ushr r4.yw, r11.xxxy, l(0, 16, 0, 16)\n      f16tof32 r11.xz, r11.xxyx\n      f16tof32 r11.yw, r4.yyyw\n      ushr r4.yw, r14.xxxy, l(0, 16, 0, 16)\n      f16tof32 r14.xz, r14.xxyx\n      f16tof32 r14.yw, r4.yyyw\n      ushr r4.yw, r12.xxxy, l(0, 16, 0, 16)\n      f16tof32 r12.xz, r12.xxyx\n      f16tof32 r12.yw, r4.yyyw\n      break \n      default \n      mov r13.zw, l(0,0,0,0)\n      mov r11.zw, l(0,0,0,0)\n      mov r14.zw, l(0,0,0,0)\n      mov r12.zw, l(0,0,0,0)\n      break \n    endswitch \n  else \n    ieq r4.y, r2.z, l(4)\n    if_nz r4.y\n      ld_raw r12.xyzw, r3.w, T0[0].wxyz\n    else \n      ld_raw r12.y, r3.w, T0[0].xxxx\n      iadd r4.y, r2.z, r3.w\n      ld_raw r12.z, r4.y, T0[0].xxxx\n      ishl r4.yw, l(0, 8, 0, 12), r1.yyyy\n      iadd r4.yw, r3.wwww, r4.yyyw\n      ld_raw r12.w, r4.y, T0[0].xxxx\n      ld_raw r12.x, r4.w, T0[0].xxxx\n    endif \n    switch r5.z\n      case l(0)\n      case l(1)\n      ushr r15.yzw, r12.yyyy, l(0, 8, 16, 24)\n      mov r15.x, r12.y\n      and r15.xyzw, r15.xyzw, l(255, 255, 255, 255)\n      utof r15.xyzw, r15.xyzw\n      mul r13.xyzw, r15.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n      ushr r15.yzw, r12.zzzz, l(0, 8, 16, 24)\n      mov r15.x, r12.z\n      and r15.xyzw, r15.xyzw, l(255, 255, 255, 255)\n      utof r15.xyzw, r15.xyzw\n      mul r11.xyzw, r15.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n      ushr r15.yzw, r12.wwww, l(0, 8, 16, 24)\n      mov r15.x, r12.w\n      and r15.xyzw, r15.xyzw, l(255, 255, 255, 255)\n      utof r15.xyzw, r15.xyzw\n      mul r14.xyzw, r15.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n      ushr r12.yzw, r12.xxxx, l(0, 8, 16, 24)\n      and r15.xyzw, r12.xyzw, l(255, 255, 255, 255)\n      utof r15.xyzw, r15.xyzw\n      mul r12.xyzw, r15.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n      break \n      case l(2)\n      case l(10)\n      ushr r15.yzw, r12.yyyy, l(0, 10, 20, 30)\n      mov r15.x, r12.y\n      and r15.xyzw, r15.xyzw, l(1023, 1023, 1023, 3)\n      utof r15.xyzw, r15.xyzw\n      mul r13.xyzw, r15.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n      ushr r15.yzw, r12.zzzz, l(0, 10, 20, 30)\n      mov r15.x, r12.z\n      and r15.xyzw, r15.xyzw, l(1023, 1023, 1023, 3)\n      utof r15.xyzw, r15.xyzw\n      mul r11.xyzw, r15.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n      ushr r15.yzw, r12.wwww, l(0, 10, 20, 30)\n      mov r15.x, r12.w\n      and r15.xyzw, r15.xyzw, l(1023, 1023, 1023, 3)\n      utof r15.xyzw, r15.xyzw\n      mul r14.xyzw, r15.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n      ushr r12.yzw, r12.xxxx, l(0, 10, 20, 30)\n      and r15.xyzw, r12.xyzw, l(1023, 1023, 1023, 3)\n      utof r15.xyzw, r15.xyzw\n      mul r12.xyzw, r15.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n      break \n      case l(3)\n      case l(12)\n      ushr r15.xyzw, r12.yyyz, l(10, 20, 30, 30)\n      mov r16.x, r12.y\n      mov r16.yz, r15.xxyx\n      and r17.xyz, r16.xyzx, l(1023, 1023, 1023, 0)\n      and r18.xyz, r16.xyzx, l(127, 127, 127, 0)\n      ubfe r19.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r16.xyzx\n      firstbit_hi r20.xyz, r18.xyzx\n      iadd r20.xyz, r20.xyzx, l(-24, -24, -24, 0)\n      movc r20.xyz, r18.xyzx, r20.xyzx, l(8,8,8,0)\n      iadd r21.xyz, -r20.xyzx, l(1, 1, 1, 0)\n      movc r21.xyz, r19.xyzx, r19.xyzx, r21.xyzx\n      bfi r16.xyz, l(7, 7, 7, 0), r20.xyzx, r16.xyzx, l(0, 0, 0, 0)\n      and r16.xyz, r16.xyzx, l(127, 127, 127, 0)\n      movc r16.xyz, r19.xyzx, r18.xyzx, r16.xyzx\n      ishl r18.xyz, r21.xyzx, l(23, 23, 23, 0)\n      iadd r18.xyz, r18.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n      ishl r16.xyz, r16.xyzx, l(16, 16, 16, 0)\n      iadd r16.xyz, r18.xyzx, r16.xyzx\n      movc r13.xyz, r17.xyzx, r16.xyzx, l(0,0,0,0)\n      utof r4.yw, r15.zzzw\n      ushr r15.xyzw, r12.zwwz, l(10, 10, 20, 20)\n      mov r16.x, r12.z\n      mov r16.yz, r15.xxwx\n      and r17.xyz, r16.xyzx, l(1023, 1023, 1023, 0)\n      and r18.xyz, r16.xyzx, l(127, 127, 127, 0)\n      ubfe r19.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r16.xyzx\n      firstbit_hi r20.xyz, r18.xyzx\n      iadd r20.xyz, r20.xyzx, l(-24, -24, -24, 0)\n      movc r20.xyz, r18.xyzx, r20.xyzx, l(8,8,8,0)\n      iadd r21.xyz, -r20.xyzx, l(1, 1, 1, 0)\n      movc r21.xyz, r19.xyzx, r19.xyzx, r21.xyzx\n      bfi r16.xyz, l(7, 7, 7, 0), r20.xyzx, r16.xyzx, l(0, 0, 0, 0)\n      and r16.xyz, r16.xyzx, l(127, 127, 127, 0)\n      movc r16.xyz, r19.xyzx, r18.xyzx, r16.xyzx\n      ishl r18.xyz, r21.xyzx, l(23, 23, 23, 0)\n      iadd r18.xyz, r18.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n      ishl r16.xyz, r16.xyzx, l(16, 16, 16, 0)\n      iadd r16.xyz, r18.xyzx, r16.xyzx\n      movc r11.xyz, r17.xyzx, r16.xyzx, l(0,0,0,0)\n      mul r4.yw, r4.yyyw, l(0.000000, 0.333333, 0.000000, 0.333333)\n      mov r15.x, r12.w\n      and r16.xyz, r15.xyzx, l(1023, 1023, 1023, 0)\n      and r17.xyz, r15.xyzx, l(127, 127, 127, 0)\n      ubfe r18.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r15.xyzx\n      firstbit_hi r19.xyz, r17.xyzx\n      iadd r19.xyz, r19.xyzx, l(-24, -24, -24, 0)\n      movc r19.xyz, r17.xyzx, r19.xyzx, l(8,8,8,0)\n      iadd r20.xyz, -r19.xyzx, l(1, 1, 1, 0)\n      movc r20.xyz, r18.xyzx, r18.xyzx, r20.xyzx\n      bfi r15.xyz, l(7, 7, 7, 0), r19.xyzx, r15.xyzx, l(0, 0, 0, 0)\n      and r15.xyz, r15.xyzx, l(127, 127, 127, 0)\n      movc r15.xyz, r18.xyzx, r17.xyzx, r15.xyzx\n      ishl r17.xyz, r20.xyzx, l(23, 23, 23, 0)\n      iadd r17.xyz, r17.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n      ishl r15.xyz, r15.xyzx, l(16, 16, 16, 0)\n      iadd r15.xyz, r17.xyzx, r15.xyzx\n      movc r14.xyz, r16.xyzx, r15.xyzx, l(0,0,0,0)\n      ushr r15.xyzw, r12.wxxx, l(30, 10, 20, 30)\n      utof r5.xy, r15.xwxx\n      mov r15.x, r12.x\n      and r16.xyz, r15.xyzx, l(1023, 1023, 1023, 0)\n      and r17.xyz, r15.xyzx, l(127, 127, 127, 0)\n      ubfe r18.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r15.xyzx\n      firstbit_hi r19.xyz, r17.xyzx\n      iadd r19.xyz, r19.xyzx, l(-24, -24, -24, 0)\n      movc r19.xyz, r17.xyzx, r19.xyzx, l(8,8,8,0)\n      iadd r20.xyz, -r19.xyzx, l(1, 1, 1, 0)\n      movc r20.xyz, r18.xyzx, r18.xyzx, r20.xyzx\n      bfi r15.xyz, l(7, 7, 7, 0), r19.xyzx, r15.xyzx, l(0, 0, 0, 0)\n      and r15.xyz, r15.xyzx, l(127, 127, 127, 0)\n      movc r15.xyz, r18.xyzx, r17.xyzx, r15.xyzx\n      ishl r17.xyz, r20.xyzx, l(23, 23, 23, 0)\n      iadd r17.xyz, r17.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n      ishl r15.xyz, r15.xyzx, l(16, 16, 16, 0)\n      iadd r15.xyz, r17.xyzx, r15.xyzx\n      movc r12.xyz, r16.xyzx, r15.xyzx, l(0,0,0,0)\n      mul r5.xy, r5.xyxx, l(0.333333, 0.333333, 0.000000, 0.000000)\n      mov r13.w, r4.y\n      mov r11.w, r4.w\n      mov r14.w, r5.x\n      mov r12.w, r5.y\n      break \n      case l(4)\n      ishl r15.xyzw, r12.yzwx, l(16, 16, 16, 16)\n      mov r16.xz, r15.xxyx\n      mov r16.yw, r12.yyyz\n      ishr r16.xyzw, r16.xyzw, l(16, 16, 16, 16)\n      itof r16.xyzw, r16.xyzw\n      mul r16.xyzw, r16.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n      max r13.xy, r16.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n      max r11.xy, r16.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n      mov r12.yz, r15.zzwz\n      ishr r15.xyzw, r12.ywzx, l(16, 16, 16, 16)\n      itof r15.xyzw, r15.xyzw\n      mul r15.xyzw, r15.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n      max r14.xy, r15.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n      max r12.xy, r15.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n      mov r13.zw, l(0,0,0,0)\n      mov r11.zw, l(0,0,0,0)\n      mov r14.zw, l(0,0,0,0)\n      mov r12.zw, l(0,0,0,0)\n      break \n      case l(6)\n      ushr r15.xyzw, r12.yzwx, l(16, 16, 16, 16)\n      f16tof32 r13.x, r12.y\n      f16tof32 r13.y, r15.x\n      f16tof32 r11.x, r12.z\n      f16tof32 r11.y, r15.y\n      f16tof32 r14.x, r12.w\n      f16tof32 r14.y, r15.z\n      f16tof32 r12.x, r12.x\n      f16tof32 r12.y, r15.w\n      mov r13.zw, l(0,0,0,0)\n      mov r11.zw, l(0,0,0,0)\n      mov r14.zw, l(0,0,0,0)\n      mov r12.zw, l(0,0,0,0)\n      break \n      default \n      mov r13.x, r12.y\n      mov r13.yzw, l(0,0,0,0)\n      mov r11.x, r12.z\n      mov r11.yzw, l(0,0,0,0)\n      mov r14.x, r12.w\n      mov r14.yzw, l(0,0,0,0)\n      mov r12.yzw, l(0,0,0,0)\n      break \n    endswitch \n  endif \n  add r9.xyzw, r9.xyzw, r13.xyzw\n  add r7.xyzw, r7.xyzw, r11.xyzw\n  add r10.xyzw, r10.xyzw, r14.xyzw\n  add r8.xyzw, r8.xyzw, r12.xyzw\n  uge r4.y, r6.y, l(6)\n  if_nz r4.y\n    ishl r4.y, l(4), r5.w\n    mul r0.y, r0.y, l(0.250000)\n    iadd r0.x, r0.x, r4.y\n    if_nz r5.w\n      ieq r4.w, r2.z, l(8)\n      if_nz r4.w\n        ld_raw r11.xyzw, r0.x, T0[0].zwxy\n        iadd r4.w, r0.x, l(16)\n        ld_raw r12.xyzw, r4.w, T0[0].zwxy\n        mov r13.xy, r11.zwzz\n        mov r14.xy, r12.zwzz\n      else \n        ld_raw r13.xy, r0.x, T0[0].xyxx\n        iadd r4.w, r2.z, r0.x\n        ld_raw r11.xy, r4.w, T0[0].xyxx\n        ishl r5.xy, l(8, 12, 0, 0), r1.yyyy\n        iadd r5.xy, r0.xxxx, r5.xyxx\n        ld_raw r14.xy, r5.x, T0[0].xyxx\n        ld_raw r12.xy, r5.y, T0[0].xyxx\n      endif \n      switch r5.z\n        case l(5)\n        ishl r13.zw, r13.xxxy, l(0, 0, 16, 16)\n        ishr r15.xyzw, r13.zxwy, l(16, 16, 16, 16)\n        itof r15.xyzw, r15.xyzw\n        mul r15.xyzw, r15.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r13.xyzw, r15.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        ishl r11.zw, r11.xxxy, l(0, 0, 16, 16)\n        ishr r15.xyzw, r11.zxwy, l(16, 16, 16, 16)\n        itof r15.xyzw, r15.xyzw\n        mul r15.xyzw, r15.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r11.xyzw, r15.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        ishl r14.zw, r14.xxxy, l(0, 0, 16, 16)\n        ishr r15.xyzw, r14.zxwy, l(16, 16, 16, 16)\n        itof r15.xyzw, r15.xyzw\n        mul r15.xyzw, r15.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r14.xyzw, r15.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        ishl r12.zw, r12.xxxy, l(0, 0, 16, 16)\n        ishr r15.xyzw, r12.zxwy, l(16, 16, 16, 16)\n        itof r15.xyzw, r15.xyzw\n        mul r15.xyzw, r15.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r12.xyzw, r15.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        break \n        case l(7)\n        ushr r5.xy, r13.xyxx, l(16, 16, 0, 0)\n        f16tof32 r13.xz, r13.xxyx\n        f16tof32 r13.yw, r5.xxxy\n        ushr r5.xy, r11.xyxx, l(16, 16, 0, 0)\n        f16tof32 r11.xz, r11.xxyx\n        f16tof32 r11.yw, r5.xxxy\n        ushr r5.xy, r14.xyxx, l(16, 16, 0, 0)\n        f16tof32 r14.xz, r14.xxyx\n        f16tof32 r14.yw, r5.xxxy\n        ushr r5.xy, r12.xyxx, l(16, 16, 0, 0)\n        f16tof32 r12.xz, r12.xxyx\n        f16tof32 r12.yw, r5.xxxy\n        break \n        default \n        mov r13.zw, l(0,0,0,0)\n        mov r11.zw, l(0,0,0,0)\n        mov r14.zw, l(0,0,0,0)\n        mov r12.zw, l(0,0,0,0)\n        break \n      endswitch \n    else \n      ieq r4.w, r2.z, l(4)\n      if_nz r4.w\n        ld_raw r12.xyzw, r0.x, T0[0].wxyz\n      else \n        ld_raw r12.y, r0.x, T0[0].xxxx\n        iadd r4.w, r2.z, r0.x\n        ld_raw r12.z, r4.w, T0[0].xxxx\n        ishl r5.xy, l(8, 12, 0, 0), r1.yyyy\n        iadd r5.xy, r0.xxxx, r5.xyxx\n        ld_raw r12.w, r5.x, T0[0].xxxx\n        ld_raw r12.x, r5.y, T0[0].xxxx\n      endif \n      switch r5.z\n        case l(0)\n        case l(1)\n        ushr r15.yzw, r12.yyyy, l(0, 8, 16, 24)\n        mov r15.x, r12.y\n        and r15.xyzw, r15.xyzw, l(255, 255, 255, 255)\n        utof r15.xyzw, r15.xyzw\n        mul r13.xyzw, r15.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        ushr r15.yzw, r12.zzzz, l(0, 8, 16, 24)\n        mov r15.x, r12.z\n        and r15.xyzw, r15.xyzw, l(255, 255, 255, 255)\n        utof r15.xyzw, r15.xyzw\n        mul r11.xyzw, r15.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        ushr r15.yzw, r12.wwww, l(0, 8, 16, 24)\n        mov r15.x, r12.w\n        and r15.xyzw, r15.xyzw, l(255, 255, 255, 255)\n        utof r15.xyzw, r15.xyzw\n        mul r14.xyzw, r15.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        ushr r12.yzw, r12.xxxx, l(0, 8, 16, 24)\n        and r15.xyzw, r12.xyzw, l(255, 255, 255, 255)\n        utof r15.xyzw, r15.xyzw\n        mul r12.xyzw, r15.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        break \n        case l(2)\n        case l(10)\n        ushr r15.yzw, r12.yyyy, l(0, 10, 20, 30)\n        mov r15.x, r12.y\n        and r15.xyzw, r15.xyzw, l(1023, 1023, 1023, 3)\n        utof r15.xyzw, r15.xyzw\n        mul r13.xyzw, r15.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        ushr r15.yzw, r12.zzzz, l(0, 10, 20, 30)\n        mov r15.x, r12.z\n        and r15.xyzw, r15.xyzw, l(1023, 1023, 1023, 3)\n        utof r15.xyzw, r15.xyzw\n        mul r11.xyzw, r15.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        ushr r15.yzw, r12.wwww, l(0, 10, 20, 30)\n        mov r15.x, r12.w\n        and r15.xyzw, r15.xyzw, l(1023, 1023, 1023, 3)\n        utof r15.xyzw, r15.xyzw\n        mul r14.xyzw, r15.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        ushr r12.yzw, r12.xxxx, l(0, 10, 20, 30)\n        and r15.xyzw, r12.xyzw, l(1023, 1023, 1023, 3)\n        utof r15.xyzw, r15.xyzw\n        mul r12.xyzw, r15.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        break \n        case l(3)\n        case l(12)\n        ushr r15.xyzw, r12.yyyz, l(10, 20, 30, 30)\n        mov r16.x, r12.y\n        mov r16.yz, r15.xxyx\n        and r6.yzw, r16.xxyz, l(0, 1023, 1023, 1023)\n        and r17.xyz, r16.xyzx, l(127, 127, 127, 0)\n        ubfe r18.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r16.xyzx\n        firstbit_hi r19.xyz, r17.xyzx\n        iadd r19.xyz, r19.xyzx, l(-24, -24, -24, 0)\n        movc r19.xyz, r17.xyzx, r19.xyzx, l(8,8,8,0)\n        iadd r20.xyz, -r19.xyzx, l(1, 1, 1, 0)\n        movc r20.xyz, r18.xyzx, r18.xyzx, r20.xyzx\n        bfi r16.xyz, l(7, 7, 7, 0), r19.xyzx, r16.xyzx, l(0, 0, 0, 0)\n        and r16.xyz, r16.xyzx, l(127, 127, 127, 0)\n        movc r16.xyz, r18.xyzx, r17.xyzx, r16.xyzx\n        ishl r17.xyz, r20.xyzx, l(23, 23, 23, 0)\n        iadd r17.xyz, r17.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r16.xyz, r16.xyzx, l(16, 16, 16, 0)\n        iadd r16.xyz, r17.xyzx, r16.xyzx\n        movc r13.xyz, r6.yzwy, r16.xyzx, l(0,0,0,0)\n        utof r5.xy, r15.zwzz\n        ushr r15.xyzw, r12.zwwz, l(10, 10, 20, 20)\n        mov r16.x, r12.z\n        mov r16.yz, r15.xxwx\n        and r6.yzw, r16.xxyz, l(0, 1023, 1023, 1023)\n        and r17.xyz, r16.xyzx, l(127, 127, 127, 0)\n        ubfe r18.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r16.xyzx\n        firstbit_hi r19.xyz, r17.xyzx\n        iadd r19.xyz, r19.xyzx, l(-24, -24, -24, 0)\n        movc r19.xyz, r17.xyzx, r19.xyzx, l(8,8,8,0)\n        iadd r20.xyz, -r19.xyzx, l(1, 1, 1, 0)\n        movc r20.xyz, r18.xyzx, r18.xyzx, r20.xyzx\n        bfi r16.xyz, l(7, 7, 7, 0), r19.xyzx, r16.xyzx, l(0, 0, 0, 0)\n        and r16.xyz, r16.xyzx, l(127, 127, 127, 0)\n        movc r16.xyz, r18.xyzx, r17.xyzx, r16.xyzx\n        ishl r17.xyz, r20.xyzx, l(23, 23, 23, 0)\n        iadd r17.xyz, r17.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r16.xyz, r16.xyzx, l(16, 16, 16, 0)\n        iadd r16.xyz, r17.xyzx, r16.xyzx\n        movc r11.xyz, r6.yzwy, r16.xyzx, l(0,0,0,0)\n        mul r5.xy, r5.xyxx, l(0.333333, 0.333333, 0.000000, 0.000000)\n        mov r15.x, r12.w\n        and r6.yzw, r15.xxyz, l(0, 1023, 1023, 1023)\n        and r16.xyz, r15.xyzx, l(127, 127, 127, 0)\n        ubfe r17.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r15.xyzx\n        firstbit_hi r18.xyz, r16.xyzx\n        iadd r18.xyz, r18.xyzx, l(-24, -24, -24, 0)\n        movc r18.xyz, r16.xyzx, r18.xyzx, l(8,8,8,0)\n        iadd r19.xyz, -r18.xyzx, l(1, 1, 1, 0)\n        movc r19.xyz, r17.xyzx, r17.xyzx, r19.xyzx\n        bfi r15.xyz, l(7, 7, 7, 0), r18.xyzx, r15.xyzx, l(0, 0, 0, 0)\n        and r15.xyz, r15.xyzx, l(127, 127, 127, 0)\n        movc r15.xyz, r17.xyzx, r16.xyzx, r15.xyzx\n        ishl r16.xyz, r19.xyzx, l(23, 23, 23, 0)\n        iadd r16.xyz, r16.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r15.xyz, r15.xyzx, l(16, 16, 16, 0)\n        iadd r15.xyz, r16.xyzx, r15.xyzx\n        movc r14.xyz, r6.yzwy, r15.xyzx, l(0,0,0,0)\n        ushr r15.xyzw, r12.wxxx, l(30, 10, 20, 30)\n        utof r6.yz, r15.xxwx\n        mov r15.x, r12.x\n        and r16.xyz, r15.xyzx, l(1023, 1023, 1023, 0)\n        and r17.xyz, r15.xyzx, l(127, 127, 127, 0)\n        ubfe r18.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r15.xyzx\n        firstbit_hi r19.xyz, r17.xyzx\n        iadd r19.xyz, r19.xyzx, l(-24, -24, -24, 0)\n        movc r19.xyz, r17.xyzx, r19.xyzx, l(8,8,8,0)\n        iadd r20.xyz, -r19.xyzx, l(1, 1, 1, 0)\n        movc r20.xyz, r18.xyzx, r18.xyzx, r20.xyzx\n        bfi r15.xyz, l(7, 7, 7, 0), r19.xyzx, r15.xyzx, l(0, 0, 0, 0)\n        and r15.xyz, r15.xyzx, l(127, 127, 127, 0)\n        movc r15.xyz, r18.xyzx, r17.xyzx, r15.xyzx\n        ishl r17.xyz, r20.xyzx, l(23, 23, 23, 0)\n        iadd r17.xyz, r17.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r15.xyz, r15.xyzx, l(16, 16, 16, 0)\n        iadd r15.xyz, r17.xyzx, r15.xyzx\n        movc r12.xyz, r16.xyzx, r15.xyzx, l(0,0,0,0)\n        mul r6.yz, r6.yyzy, l(0.000000, 0.333333, 0.333333, 0.000000)\n        mov r13.w, r5.x\n        mov r11.w, r5.y\n        mov r14.w, r6.y\n        mov r12.w, r6.z\n        break \n        case l(4)\n        ishl r15.xyzw, r12.yzwx, l(16, 16, 16, 16)\n        mov r16.xz, r15.xxyx\n        mov r16.yw, r12.yyyz\n        ishr r16.xyzw, r16.xyzw, l(16, 16, 16, 16)\n        itof r16.xyzw, r16.xyzw\n        mul r16.xyzw, r16.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r13.xy, r16.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        max r11.xy, r16.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        mov r12.yz, r15.zzwz\n        ishr r15.xyzw, r12.ywzx, l(16, 16, 16, 16)\n        itof r15.xyzw, r15.xyzw\n        mul r15.xyzw, r15.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r14.xy, r15.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        max r12.xy, r15.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        mov r13.zw, l(0,0,0,0)\n        mov r11.zw, l(0,0,0,0)\n        mov r14.zw, l(0,0,0,0)\n        mov r12.zw, l(0,0,0,0)\n        break \n        case l(6)\n        ushr r15.xyzw, r12.yzwx, l(16, 16, 16, 16)\n        f16tof32 r13.x, r12.y\n        f16tof32 r13.y, r15.x\n        f16tof32 r11.x, r12.z\n        f16tof32 r11.y, r15.y\n        f16tof32 r14.x, r12.w\n        f16tof32 r14.y, r15.z\n        f16tof32 r12.x, r12.x\n        f16tof32 r12.y, r15.w\n        mov r13.zw, l(0,0,0,0)\n        mov r11.zw, l(0,0,0,0)\n        mov r14.zw, l(0,0,0,0)\n        mov r12.zw, l(0,0,0,0)\n        break \n        default \n        mov r13.x, r12.y\n        mov r13.yzw, l(0,0,0,0)\n        mov r11.x, r12.z\n        mov r11.yzw, l(0,0,0,0)\n        mov r14.x, r12.w\n        mov r14.yzw, l(0,0,0,0)\n        mov r12.yzw, l(0,0,0,0)\n        break \n      endswitch \n    endif \n    add r13.xyzw, r9.xyzw, r13.xyzw\n    add r11.xyzw, r7.xyzw, r11.xyzw\n    add r14.xyzw, r10.xyzw, r14.xyzw\n    add r12.xyzw, r8.xyzw, r12.xyzw\n    iadd r0.x, r3.w, r4.y\n    if_nz r5.w\n      ieq r3.w, r2.z, l(8)\n      if_nz r3.w\n        ld_raw r15.xyzw, r0.x, T0[0].zwxy\n        iadd r3.w, r0.x, l(16)\n        ld_raw r16.xyzw, r3.w, T0[0].zwxy\n        mov r17.xy, r15.zwzz\n        mov r18.xy, r16.zwzz\n      else \n        ld_raw r17.xy, r0.x, T0[0].xyxx\n        iadd r3.w, r2.z, r0.x\n        ld_raw r15.xy, r3.w, T0[0].xyxx\n        ishl r4.yw, l(0, 8, 0, 12), r1.yyyy\n        iadd r4.yw, r0.xxxx, r4.yyyw\n        ld_raw r18.xy, r4.y, T0[0].xyxx\n        ld_raw r16.xy, r4.w, T0[0].xyxx\n      endif \n      switch r5.z\n        case l(5)\n        ishl r17.zw, r17.xxxy, l(0, 0, 16, 16)\n        ishr r19.xyzw, r17.zxwy, l(16, 16, 16, 16)\n        itof r19.xyzw, r19.xyzw\n        mul r19.xyzw, r19.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r17.xyzw, r19.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        ishl r15.zw, r15.xxxy, l(0, 0, 16, 16)\n        ishr r19.xyzw, r15.zxwy, l(16, 16, 16, 16)\n        itof r19.xyzw, r19.xyzw\n        mul r19.xyzw, r19.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r15.xyzw, r19.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        ishl r18.zw, r18.xxxy, l(0, 0, 16, 16)\n        ishr r19.xyzw, r18.zxwy, l(16, 16, 16, 16)\n        itof r19.xyzw, r19.xyzw\n        mul r19.xyzw, r19.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r18.xyzw, r19.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        ishl r16.zw, r16.xxxy, l(0, 0, 16, 16)\n        ishr r19.xyzw, r16.zxwy, l(16, 16, 16, 16)\n        itof r19.xyzw, r19.xyzw\n        mul r19.xyzw, r19.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r16.xyzw, r19.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        break \n        case l(7)\n        ushr r4.yw, r17.xxxy, l(0, 16, 0, 16)\n        f16tof32 r17.xz, r17.xxyx\n        f16tof32 r17.yw, r4.yyyw\n        ushr r4.yw, r15.xxxy, l(0, 16, 0, 16)\n        f16tof32 r15.xz, r15.xxyx\n        f16tof32 r15.yw, r4.yyyw\n        ushr r4.yw, r18.xxxy, l(0, 16, 0, 16)\n        f16tof32 r18.xz, r18.xxyx\n        f16tof32 r18.yw, r4.yyyw\n        ushr r4.yw, r16.xxxy, l(0, 16, 0, 16)\n        f16tof32 r16.xz, r16.xxyx\n        f16tof32 r16.yw, r4.yyyw\n        break \n        default \n        mov r17.zw, l(0,0,0,0)\n        mov r15.zw, l(0,0,0,0)\n        mov r18.zw, l(0,0,0,0)\n        mov r16.zw, l(0,0,0,0)\n        break \n      endswitch \n    else \n      ieq r3.w, r2.z, l(4)\n      if_nz r3.w\n        ld_raw r16.xyzw, r0.x, T0[0].wxyz\n      else \n        ld_raw r16.y, r0.x, T0[0].xxxx\n        iadd r2.z, r2.z, r0.x\n        ld_raw r16.z, r2.z, T0[0].xxxx\n        ishl r4.yw, l(0, 8, 0, 12), r1.yyyy\n        iadd r4.yw, r0.xxxx, r4.yyyw\n        ld_raw r16.w, r4.y, T0[0].xxxx\n        ld_raw r16.x, r4.w, T0[0].xxxx\n      endif \n      switch r5.z\n        case l(0)\n        case l(1)\n        ushr r5.yzw, r16.yyyy, l(0, 8, 16, 24)\n        mov r5.x, r16.y\n        and r5.xyzw, r5.xyzw, l(255, 255, 255, 255)\n        utof r5.xyzw, r5.xyzw\n        mul r17.xyzw, r5.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        ushr r5.yzw, r16.zzzz, l(0, 8, 16, 24)\n        mov r5.x, r16.z\n        and r5.xyzw, r5.xyzw, l(255, 255, 255, 255)\n        utof r5.xyzw, r5.xyzw\n        mul r15.xyzw, r5.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        ushr r5.yzw, r16.wwww, l(0, 8, 16, 24)\n        mov r5.x, r16.w\n        and r5.xyzw, r5.xyzw, l(255, 255, 255, 255)\n        utof r5.xyzw, r5.xyzw\n        mul r18.xyzw, r5.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        ushr r16.yzw, r16.xxxx, l(0, 8, 16, 24)\n        and r5.xyzw, r16.xyzw, l(255, 255, 255, 255)\n        utof r5.xyzw, r5.xyzw\n        mul r16.xyzw, r5.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        break \n        case l(2)\n        case l(10)\n        ushr r5.yzw, r16.yyyy, l(0, 10, 20, 30)\n        mov r5.x, r16.y\n        and r5.xyzw, r5.xyzw, l(1023, 1023, 1023, 3)\n        utof r5.xyzw, r5.xyzw\n        mul r17.xyzw, r5.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        ushr r5.yzw, r16.zzzz, l(0, 10, 20, 30)\n        mov r5.x, r16.z\n        and r5.xyzw, r5.xyzw, l(1023, 1023, 1023, 3)\n        utof r5.xyzw, r5.xyzw\n        mul r15.xyzw, r5.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        ushr r5.yzw, r16.wwww, l(0, 10, 20, 30)\n        mov r5.x, r16.w\n        and r5.xyzw, r5.xyzw, l(1023, 1023, 1023, 3)\n        utof r5.xyzw, r5.xyzw\n        mul r18.xyzw, r5.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        ushr r16.yzw, r16.xxxx, l(0, 10, 20, 30)\n        and r5.xyzw, r16.xyzw, l(1023, 1023, 1023, 3)\n        utof r5.xyzw, r5.xyzw\n        mul r16.xyzw, r5.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        break \n        case l(3)\n        case l(12)\n        ushr r5.xyzw, r16.yyyz, l(10, 20, 30, 30)\n        mov r19.x, r16.y\n        mov r19.yz, r5.xxyx\n        and r6.yzw, r19.xxyz, l(0, 1023, 1023, 1023)\n        and r20.xyz, r19.xyzx, l(127, 127, 127, 0)\n        ubfe r21.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r19.xyzx\n        firstbit_hi r22.xyz, r20.xyzx\n        iadd r22.xyz, r22.xyzx, l(-24, -24, -24, 0)\n        movc r22.xyz, r20.xyzx, r22.xyzx, l(8,8,8,0)\n        iadd r23.xyz, -r22.xyzx, l(1, 1, 1, 0)\n        movc r23.xyz, r21.xyzx, r21.xyzx, r23.xyzx\n        bfi r19.xyz, l(7, 7, 7, 0), r22.xyzx, r19.xyzx, l(0, 0, 0, 0)\n        and r19.xyz, r19.xyzx, l(127, 127, 127, 0)\n        movc r19.xyz, r21.xyzx, r20.xyzx, r19.xyzx\n        ishl r20.xyz, r23.xyzx, l(23, 23, 23, 0)\n        iadd r20.xyz, r20.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r19.xyz, r19.xyzx, l(16, 16, 16, 0)\n        iadd r19.xyz, r20.xyzx, r19.xyzx\n        movc r17.xyz, r6.yzwy, r19.xyzx, l(0,0,0,0)\n        utof r4.yw, r5.zzzw\n        ushr r5.xyzw, r16.zwwz, l(10, 10, 20, 20)\n        mov r19.x, r16.z\n        mov r19.yz, r5.xxwx\n        and r6.yzw, r19.xxyz, l(0, 1023, 1023, 1023)\n        and r20.xyz, r19.xyzx, l(127, 127, 127, 0)\n        ubfe r21.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r19.xyzx\n        firstbit_hi r22.xyz, r20.xyzx\n        iadd r22.xyz, r22.xyzx, l(-24, -24, -24, 0)\n        movc r22.xyz, r20.xyzx, r22.xyzx, l(8,8,8,0)\n        iadd r23.xyz, -r22.xyzx, l(1, 1, 1, 0)\n        movc r23.xyz, r21.xyzx, r21.xyzx, r23.xyzx\n        bfi r19.xyz, l(7, 7, 7, 0), r22.xyzx, r19.xyzx, l(0, 0, 0, 0)\n        and r19.xyz, r19.xyzx, l(127, 127, 127, 0)\n        movc r19.xyz, r21.xyzx, r20.xyzx, r19.xyzx\n        ishl r20.xyz, r23.xyzx, l(23, 23, 23, 0)\n        iadd r20.xyz, r20.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r19.xyz, r19.xyzx, l(16, 16, 16, 0)\n        iadd r19.xyz, r20.xyzx, r19.xyzx\n        movc r15.xyz, r6.yzwy, r19.xyzx, l(0,0,0,0)\n        mul r4.yw, r4.yyyw, l(0.000000, 0.333333, 0.000000, 0.333333)\n        mov r5.x, r16.w\n        and r6.yzw, r5.xxyz, l(0, 1023, 1023, 1023)\n        and r19.xyz, r5.xyzx, l(127, 127, 127, 0)\n        ubfe r20.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r5.xyzx\n        firstbit_hi r21.xyz, r19.xyzx\n        iadd r21.xyz, r21.xyzx, l(-24, -24, -24, 0)\n        movc r21.xyz, r19.xyzx, r21.xyzx, l(8,8,8,0)\n        iadd r22.xyz, -r21.xyzx, l(1, 1, 1, 0)\n        movc r22.xyz, r20.xyzx, r20.xyzx, r22.xyzx\n        bfi r5.xyz, l(7, 7, 7, 0), r21.xyzx, r5.xyzx, l(0, 0, 0, 0)\n        and r5.xyz, r5.xyzx, l(127, 127, 127, 0)\n        movc r5.xyz, r20.xyzx, r19.xyzx, r5.xyzx\n        ishl r19.xyz, r22.xyzx, l(23, 23, 23, 0)\n        iadd r19.xyz, r19.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r5.xyz, r5.xyzx, l(16, 16, 16, 0)\n        iadd r5.xyz, r19.xyzx, r5.xyzx\n        movc r18.xyz, r6.yzwy, r5.xyzx, l(0,0,0,0)\n        ushr r5.xyzw, r16.wxxx, l(30, 10, 20, 30)\n        utof r6.yz, r5.xxwx\n        mov r5.x, r16.x\n        and r19.xyz, r5.xyzx, l(1023, 1023, 1023, 0)\n        and r20.xyz, r5.xyzx, l(127, 127, 127, 0)\n        ubfe r21.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r5.xyzx\n        firstbit_hi r22.xyz, r20.xyzx\n        iadd r22.xyz, r22.xyzx, l(-24, -24, -24, 0)\n        movc r22.xyz, r20.xyzx, r22.xyzx, l(8,8,8,0)\n        iadd r23.xyz, -r22.xyzx, l(1, 1, 1, 0)\n        movc r23.xyz, r21.xyzx, r21.xyzx, r23.xyzx\n        bfi r5.xyz, l(7, 7, 7, 0), r22.xyzx, r5.xyzx, l(0, 0, 0, 0)\n        and r5.xyz, r5.xyzx, l(127, 127, 127, 0)\n        movc r5.xyz, r21.xyzx, r20.xyzx, r5.xyzx\n        ishl r20.xyz, r23.xyzx, l(23, 23, 23, 0)\n        iadd r20.xyz, r20.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r5.xyz, r5.xyzx, l(16, 16, 16, 0)\n        iadd r5.xyz, r20.xyzx, r5.xyzx\n        movc r16.xyz, r19.xyzx, r5.xyzx, l(0,0,0,0)\n        mul r5.xy, r6.yzyy, l(0.333333, 0.333333, 0.000000, 0.000000)\n        mov r17.w, r4.y\n        mov r15.w, r4.w\n        mov r18.w, r5.x\n        mov r16.w, r5.y\n        break \n        case l(4)\n        ishl r5.xyzw, r16.yzwx, l(16, 16, 16, 16)\n        mov r19.xz, r5.xxyx\n        mov r19.yw, r16.yyyz\n        ishr r19.xyzw, r19.xyzw, l(16, 16, 16, 16)\n        itof r19.xyzw, r19.xyzw\n        mul r19.xyzw, r19.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r17.xy, r19.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        max r15.xy, r19.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        mov r16.yz, r5.zzwz\n        ishr r5.xyzw, r16.ywzx, l(16, 16, 16, 16)\n        itof r5.xyzw, r5.xyzw\n        mul r5.xyzw, r5.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r18.xy, r5.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        max r16.xy, r5.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        mov r17.zw, l(0,0,0,0)\n        mov r15.zw, l(0,0,0,0)\n        mov r18.zw, l(0,0,0,0)\n        mov r16.zw, l(0,0,0,0)\n        break \n        case l(6)\n        ushr r5.xyzw, r16.yzwx, l(16, 16, 16, 16)\n        f16tof32 r17.x, r16.y\n        f16tof32 r17.y, r5.x\n        f16tof32 r15.x, r16.z\n        f16tof32 r15.y, r5.y\n        f16tof32 r18.x, r16.w\n        f16tof32 r18.y, r5.z\n        f16tof32 r16.x, r16.x\n        f16tof32 r16.y, r5.w\n        mov r17.zw, l(0,0,0,0)\n        mov r15.zw, l(0,0,0,0)\n        mov r18.zw, l(0,0,0,0)\n        mov r16.zw, l(0,0,0,0)\n        break \n        default \n        mov r17.x, r16.y\n        mov r17.yzw, l(0,0,0,0)\n        mov r15.x, r16.z\n        mov r15.yzw, l(0,0,0,0)\n        mov r18.x, r16.w\n        mov r18.yzw, l(0,0,0,0)\n        mov r16.yzw, l(0,0,0,0)\n        break \n      endswitch \n    endif \n    add r9.xyzw, r13.xyzw, r17.xyzw\n    add r7.xyzw, r11.xyzw, r15.xyzw\n    add r10.xyzw, r14.xyzw, r18.xyzw\n    add r8.xyzw, r12.xyzw, r16.xyzw\n  else \n    mov r0.y, r2.w\n  endif \nendif \nmul r5.xyzw, r0.yyyy, r9.xyzw\nmul r7.xyzw, r0.yyyy, r7.xyzw\nmul r9.xyzw, r0.yyyy, r10.xyzw\nmul r8.xyzw, r0.yyyy, r8.xyzw\nif_nz r1.z\n  mov r5.xz, r5.zzxz\n  mov r7.xz, r7.zzxz\n  mov r9.xz, r9.zzxz\n  mov r8.xz, r8.zzxz\nendif \nswitch r6.x\n  case l(3)\n  mov_sat r5.xyzw, r5.xyzw\n  mad r6.xyzw, r5.xyzw, l(31.000000, 31.000000, 31.000000, 1.000000), l(0.500000, 0.500000, 0.500000, 0.500000)\n  ftou r6.xyzw, r6.xyzw\n  imad r1.y, r6.y, l(32), r6.x\n  imad r1.y, r6.z, l(1024), r1.y\n  imad r1.y, r6.w, l(0x00008000), r1.y\n  mov_sat r7.xyzw, r7.xyzw\n  mad r6.xyzw, r7.xyzw, l(31.000000, 31.000000, 31.000000, 1.000000), l(0.500000, 0.500000, 0.500000, 0.500000)\n  ftou r6.xyzw, r6.xyzw\n  imad r1.z, r6.y, l(32), r6.x\n  imad r1.z, r6.z, l(1024), r1.z\n  ishl r2.z, r6.w, l(31)\n  imad r1.z, r1.z, l(0x00010000), r2.z\n  iadd r0.x, r1.z, r1.y\n  mov_sat r9.xyzw, r9.xyzw\n  mad r6.xyzw, r9.xyzw, l(31.000000, 31.000000, 31.000000, 1.000000), l(0.500000, 0.500000, 0.500000, 0.500000)\n  ftou r6.xyzw, r6.xyzw\n  imad r1.y, r6.y, l(32), r6.x\n  imad r1.y, r6.z, l(1024), r1.y\n  imad r1.y, r6.w, l(0x00008000), r1.y\n  mov_sat r8.xyzw, r8.xyzw\n  mad r6.xyzw, r8.xyzw, l(31.000000, 31.000000, 31.000000, 1.000000), l(0.500000, 0.500000, 0.500000, 0.500000)\n  ftou r6.xyzw, r6.xyzw\n  imad r1.z, r6.y, l(32), r6.x\n  imad r1.z, r6.z, l(1024), r1.z\n  ishl r2.z, r6.w, l(31)\n  imad r1.z, r1.z, l(0x00010000), r2.z\n  iadd r0.y, r1.z, r1.y\n  break \n  case l(4)\n  mov_sat r5.xyz, r5.xyzx\n  mad r6.xyz, r5.xyzx, l(31.000000, 63.000000, 31.000000, 0.000000), l(0.500000, 0.500000, 0.500000, 0.000000)\n  ftou r6.xyz, r6.xyzx\n  imad r1.y, r6.y, l(32), r6.x\n  imad r1.y, r6.z, l(2048), r1.y\n  mov_sat r7.xyz, r7.xyzx\n  mad r6.xyz, r7.xyzx, l(31.000000, 63.000000, 31.000000, 0.000000), l(0.500000, 0.500000, 0.500000, 0.000000)\n  ftou r6.xyz, r6.xyzx\n  imad r1.z, r6.y, l(32), r6.x\n  ishl r2.z, r6.z, l(27)\n  imad r1.z, r1.z, l(0x00010000), r2.z\n  iadd r0.x, r1.z, r1.y\n  mov_sat r9.xyz, r9.xyzx\n  mad r6.xyz, r9.xyzx, l(31.000000, 63.000000, 31.000000, 0.000000), l(0.500000, 0.500000, 0.500000, 0.000000)\n  ftou r6.xyz, r6.xyzx\n  imad r1.y, r6.y, l(32), r6.x\n  imad r1.y, r6.z, l(2048), r1.y\n  mov_sat r8.xyz, r8.xyzx\n  mad r6.xyz, r8.xyzx, l(31.000000, 63.000000, 31.000000, 0.000000), l(0.500000, 0.500000, 0.500000, 0.000000)\n  ftou r6.xyz, r6.xyzx\n  imad r1.z, r6.y, l(32), r6.x\n  ishl r2.z, r6.z, l(27)\n  imad r1.z, r1.z, l(0x00010000), r2.z\n  iadd r0.y, r1.z, r1.y\n  break \n  case l(5)\n  mov_sat r5.xyz, r5.xyzx\n  mad r6.xyz, r5.xyzx, l(31.000000, 31.000000, 63.000000, 0.000000), l(0.500000, 0.500000, 0.500000, 0.000000)\n  ftou r6.xyz, r6.xyzx\n  imad r1.y, r6.y, l(32), r6.x\n  imad r1.y, r6.z, l(1024), r1.y\n  mov_sat r7.xyz, r7.xyzx\n  mad r6.xyz, r7.xyzx, l(31.000000, 31.000000, 63.000000, 0.000000), l(0.500000, 0.500000, 0.500000, 0.000000)\n  ftou r6.xyz, r6.xyzx\n  imad r1.z, r6.y, l(32), r6.x\n  ishl r2.z, r6.z, l(26)\n  imad r1.z, r1.z, l(0x00010000), r2.z\n  iadd r0.x, r1.z, r1.y\n  mov_sat r9.xyz, r9.xyzx\n  mad r6.xyz, r9.xyzx, l(31.000000, 31.000000, 63.000000, 0.000000), l(0.500000, 0.500000, 0.500000, 0.000000)\n  ftou r6.xyz, r6.xyzx\n  imad r1.y, r6.y, l(32), r6.x\n  imad r1.y, r6.z, l(1024), r1.y\n  mov_sat r8.xyz, r8.xyzx\n  mad r6.xyz, r8.xyzx, l(31.000000, 31.000000, 63.000000, 0.000000), l(0.500000, 0.500000, 0.500000, 0.000000)\n  ftou r6.xyz, r6.xyzx\n  imad r1.z, r6.y, l(32), r6.x\n  ishl r2.z, r6.z, l(26)\n  imad r1.z, r1.z, l(0x00010000), r2.z\n  iadd r0.y, r1.z, r1.y\n  break \n  case l(10)\n  mov_sat r5.xy, r5.xyxx\n  mov_sat r5.zw, r7.xxxy\n  mad r6.xyzw, r5.xyzw, l(255.000000, 255.000000, 255.000000, 255.000000), l(0.500000, 0.500000, 0.500000, 0.500000)\n  ftou r6.xyzw, r6.xyzw\n  imad r1.y, r6.y, l(256), r6.x\n  imad r1.y, r6.z, l(0x00010000), r1.y\n  imad r0.x, r6.w, l(0x01000000), r1.y\n  mov_sat r9.xy, r9.xyxx\n  mov_sat r9.zw, r8.xxxy\n  mad r6.xyzw, r9.xyzw, l(255.000000, 255.000000, 255.000000, 255.000000), l(0.500000, 0.500000, 0.500000, 0.500000)\n  ftou r6.xyzw, r6.xyzw\n  imad r1.y, r6.y, l(256), r6.x\n  imad r1.y, r6.z, l(0x00010000), r1.y\n  imad r0.y, r6.w, l(0x01000000), r1.y\n  break \n  case l(15)\n  mov_sat r5.xyzw, r5.xyzw\n  mad r6.xyzw, r5.xyzw, l(15.000000, 15.000000, 15.000000, 15.000000), l(0.500000, 0.500000, 0.500000, 0.500000)\n  ftou r6.xyzw, r6.xyzw\n  imad r1.y, r6.y, l(16), r6.x\n  imad r1.y, r6.z, l(256), r1.y\n  imad r1.y, r6.w, l(4096), r1.y\n  mov_sat r7.xyzw, r7.xyzw\n  mad r6.xyzw, r7.xyzw, l(15.000000, 15.000000, 15.000000, 15.000000), l(0.500000, 0.500000, 0.500000, 0.500000)\n  ftou r6.xyzw, r6.xyzw\n  imad r1.z, r6.y, l(16), r6.x\n  imad r1.z, r6.z, l(256), r1.z\n  ishl r2.z, r6.w, l(28)\n  imad r1.z, r1.z, l(0x00010000), r2.z\n  iadd r0.x, r1.z, r1.y\n  mov_sat r9.xyzw, r9.xyzw\n  mad r6.xyzw, r9.xyzw, l(15.000000, 15.000000, 15.000000, 15.000000), l(0.500000, 0.500000, 0.500000, 0.500000)\n  ftou r6.xyzw, r6.xyzw\n  imad r1.y, r6.y, l(16), r6.x\n  imad r1.y, r6.z, l(256), r1.y\n  imad r1.y, r6.w, l(4096), r1.y\n  mov_sat r8.xyzw, r8.xyzw\n  mad r6.xyzw, r8.xyzw, l(15.000000, 15.000000, 15.000000, 15.000000), l(0.500000, 0.500000, 0.500000, 0.500000)\n  ftou r6.xyzw, r6.xyzw\n  imad r1.z, r6.y, l(16), r6.x\n  imad r1.z, r6.z, l(256), r1.z\n  ishl r2.z, r6.w, l(28)\n  imad r1.z, r1.z, l(0x00010000), r2.z\n  iadd r0.y, r1.z, r1.y\n  break \n  case l(24)\n  mov_sat r8.z, r5.x\n  mov_sat r8.y, r7.x\n  mov_sat r8.w, r9.x\n  mov_sat r8.x, r8.x\n  mad r6.xyzw, r8.zywx, l(65535.000000, 65535.000000, 65535.000000, 65535.000000), l(0.500000, 0.500000, 0.500000, 0.500000)\n  ftou r6.xyzw, r6.xyzw\n  imad r0.xy, r6.ywyy, l(0x00010000, 0x00010000, 0, 0), r6.xzxx\n  break \n  default \n  f32tof16 r1.y, r5.x\n  f32tof16 r1.z, r7.x\n  imad r0.x, r1.z, l(0x00010000), r1.y\n  f32tof16 r1.y, r9.x\n  f32tof16 r1.z, r8.x\n  imad r0.y, r1.z, l(0x00010000), r1.y\n  break \nendswitch \nieq r1.y, r4.x, l(0)\nine r1.z, r1.x, l(0)\nand r1.y, r1.z, r1.y\nif_nz r1.y\n  uge r1.y, r1.x, l(2)\n  if_nz r1.y\n    uge r1.x, r1.x, l(3)\n    if_nz r1.x\n      ushr r1.x, r0.y, l(16)\n      bfi r0.y, l(16), l(0), r1.x, r0.y\n    endif \n    bfi r0.x, l(16), l(16), r0.y, r0.x\n  endif \n  ushr r1.x, r0.x, l(16)\n  bfi r0.x, l(16), l(0), r1.x, r0.x\nendif \nmov r4.z, vThreadID.y\nimad r1.xy, r3.xzxx, r2.yxyy, r4.zxzz\nushr r2.zw, r1.yyyx, l(0, 0, 4, 2)\nudiv r4.xyzw, null, r2.wzww, r2.yxyy\nimad r2.zw, -r2.xxxy, r4.yyyw, r2.zzzw\nishl r3.xz, r4.wwyw, l(2, 0, 4, 0)\nimad r1.z, r2.z, r2.y, r2.w\nbfi r1.xy, l(2, 4, 0, 0), l(5, 1, 0, 0), r1.xyxx, l(0, 0, 0, 0)\nbfi r1.x, l(25), l(7), r1.z, r1.x\niadd r1.x, r1.x, r1.y\nif_nz r0.w\n  ubfe r0.w, l(3), l(4), CB0[0][0].z\n  bfi r1.y, l(10), l(1), r3.y, l(0)\n  ishr r1.z, r0.w, l(2)\n  ibfe r5.xyz, l(28, 27, 29, 0), l(2, 1, 1, 0), r4.wyww\n  imad r1.y, r1.z, r1.y, r5.x\n  imad r1.y, r1.y, r1.w, r5.y\n  bfi r0.w, l(2), l(5), r0.w, l(0)\n  ishr r2.zw, r3.xxxz, l(0, 0, 1, 3)\n  bfi r2.z, l(2), l(3), r2.z, l(0)\n  iadd r0.w, r0.w, r2.z\n  bfi r0.w, l(25), l(7), r1.y, r0.w\n  xor r1.y, r1.z, r5.z\n  and r1.z, r2.w, l(2)\n  bfi r2.zw, l(0, 0, 1, 1), l(0, 0, 1, 11), r1.yyyy, l(0, 0, 0, 0)\n  xor r1.y, r1.z, r2.z\n  ishl r1.y, r1.y, l(6)\n  iadd r1.y, r2.w, r1.y\n  ibfe r2.zw, l(0, 0, 27, 24), l(0, 0, 4, 7), r0.wwww\n  bfi r0.w, l(3), l(8), r2.z, r1.y\n  bfi r0.w, l(20), l(12), r2.w, r0.w\nelse \n  ibfe r4.xyzw, l(27, 27, 28, 29), l(3, 1, 2, 1), r4.xyzw\n  imad r1.y, r4.x, r1.w, r4.y\n  ishr r1.zw, r3.xxxz, l(0, 0, 1, 3)\n  bfi r1.z, l(3), l(3), r1.z, l(0)\n  bfi r1.y, l(26), l(6), r1.y, r1.z\n  and r1.z, r1.w, l(2)\n  bfi r2.zw, l(0, 0, 1, 1), l(0, 0, 1, 11), r4.wwwz, l(0, 0, 0, 0)\n  xor r1.z, r1.z, r2.z\n  ishl r1.z, r1.z, l(6)\n  iadd r1.z, r2.w, r1.z\n  ibfe r1.yw, l(0, 27, 0, 24), l(0, 4, 0, 7), r1.yyyy\n  bfi r1.y, l(3), l(8), r1.y, r1.z\n  bfi r0.w, l(20), l(12), r1.w, r1.y\nendif \nimul null, r1.y, r2.y, r2.x\nimad r0.w, r0.w, r1.y, r1.x\nieq r0.z, r0.z, l(1)\nif_nz r0.z\n  ishl r1.xy, r0.xyxx, l(8, 8, 0, 0)\n  ushr r1.zw, r0.xxxy, l(0, 0, 8, 8)\n  and r1.xyzw, r1.xyzw, l(0xff00ff00, 0xff00ff00, 0x00ff00ff, 0x00ff00ff)\n  iadd r0.xy, r1.zwzz, r1.xyxx\nendif \nstore_raw U0[0].xy, r0.w, r0.xyxx\nret \n// Approximately 1311 instruction slots used\n#endif\n\nconst BYTE resolve_full_16bpp_scaled_cs[] =\n{\n     68,  88,  66,  67, 123, 149, \n    117, 123, 241, 181, 139, 198, \n     26,  56,  32, 252,  88, 215, \n    125,  69,   1,   0,   0,   0, \n    248, 158,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n    144,   2,   0,   0, 160,   2, \n      0,   0, 176,   2,   0,   0, \n     92, 158,   0,   0,  82,  68, \n     69,  70,  84,   2,   0,   0, \n      1,   0,   0,   0, 228,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n     44,   2,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 197,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 213,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 114, 101, 115, \n    111, 108, 118, 101,  95, 101, \n    100, 114,  97, 109,   0, 120, \n    101,  95, 114, 101, 115, 111, \n    108, 118, 101,  95, 100, 101, \n    115, 116,   0, 112, 117, 115, \n    104,  95,  99, 111, 110, 115, \n    116, 115,  95, 120, 101,   0, \n    213,   0,   0,   0,   4,   0, \n      0,   0, 252,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    156,   1,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 184,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 220,   1, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 184,   1,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 247,   1,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    184,   1,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     12,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 184,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 120, 101, \n     95, 114, 101, 115, 111, 108, \n    118, 101,  95, 101, 100, 114, \n     97, 109,  95, 105, 110, 102, \n    111,   0, 100, 119, 111, 114, \n    100,   0,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 178,   1, \n      0,   0, 120, 101,  95, 114, \n    101, 115, 111, 108, 118, 101, \n     95,  99, 111, 111, 114, 100, \n    105, 110,  97, 116, 101,  95, \n    105, 110, 102, 111,   0, 120, \n    101,  95, 114, 101, 115, 111, \n    108, 118, 101,  95, 100, 101, \n    115, 116,  95, 105, 110, 102, \n    111,   0, 120, 101,  95, 114, \n    101, 115, 111, 108, 118, 101, \n     95, 100, 101, 115, 116,  95, \n     99, 111, 111, 114, 100, 105, \n    110,  97, 116, 101,  95, 105, \n    110, 102, 111,   0,  77, 105, \n     99, 114, 111, 115, 111, 102, \n    116,  32,  40,  82,  41,  32, \n     72,  76,  83,  76,  32,  83, \n    104,  97, 100, 101, 114,  32, \n     67, 111, 109, 112, 105, 108, \n    101, 114,  32,  49,  48,  46, \n     49,   0,  73,  83,  71,  78, \n      8,   0,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     79,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  83,  72, \n     69,  88, 164, 155,   0,   0, \n     81,   0,   5,   0, 233,  38, \n      0,   0, 106,   8,   0,   1, \n     89,   0,   0,   7,  70, 142, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0, 161,   0, \n      0,   6,  70, 126,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 157,   0, \n      0,   6,  70, 238,  49,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  95,   0, \n      0,   2,  50,   0,   2,   0, \n    104,   0,   0,   2,  24,   0, \n      0,   0, 155,   0,   0,   4, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,  12, 242,   0, \n     16,   0,   0,   0,   0,   0, \n      6, 138,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n      0,   0,   0,  32,   7,   0, \n      0,   0,   8,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   0,   0,   0,   0, \n    138,   0,   0,  17,  50,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n     17,   0,   0,   0,  20,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86, 133, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  18,   0,   0,   1, \n     54,   0,   0,   8,  50,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n    138,   0,   0,  17, 114,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  19,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,  86, 133, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,   1,   0, \n      0,  12, 194,   0,  16,   0, \n      1,   0,   0,   0, 166, 142, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   1, \n    255,   3,   0,   0,  85,   0, \n      0,  12, 242,   0,  16,   0, \n      3,   0,   0,   0, 214, 143, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     24,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      4,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   7,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  80,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      4,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  17, \n    242,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,  11,   0, \n      0,   0,   4,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     13,   0,   0,   0,  24,   0, \n      0,   0,  28,   0,   0,   0, \n      6, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   7,  18,   0,  16,   0, \n      6,   0,   0,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     34,   0,  16,   0,   6,   0, \n      0,   0,  10,   0,  16,   0, \n      3,   0,   0,   0, 140,   0, \n      0,  20, 194,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   4,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   6,   4,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    139,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  23,   0,   0,   0, \n     30,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0, 128,  63, 140,   0, \n      0,  20,  82,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 246,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    138,   0,   0,  17,  50,   0, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   6,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,  28,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 230, 138, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  83,   0,   0,   6, \n     34,   0,  16,   0,   4,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,   9, \n    194,   0,  16,   0,   2,   0, \n      0,   0, 166,  14,  16,   0, \n      2,   0,   0,   0,   6,   4, \n     16,   0,   2,   0,   0,   0, \n      6,   4,  16,   0,   4,   0, \n      0,   0,  80,   0,   0,   7, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   6,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     54,   0,   0,   5,  34,   0, \n     16,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   6,   0, \n      0,   0,  18,   0,   0,   1, \n     32,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      1,   0,   0,   0,  54,   0, \n      0,   5,  34,   0,  16,   0, \n      7,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     18,   0,   0,   1,  54,   0, \n      0,   5,  34,   0,  16,   0, \n      7,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  21,   0, \n      0,   1,  80,   0,   0,  10, \n    162,   0,  16,   0,   4,   0, \n      0,   0,   6,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,  10, 162,   0, \n     16,   0,   4,   0,   0,   0, \n     86,  13,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  41,   0, \n      0,   7, 194,   0,  16,   0, \n      2,   0,   0,   0, 166,  14, \n     16,   0,   2,   0,   0,   0, \n     86,  13,  16,   0,   4,   0, \n      0,   0,  85,   0,   0,   7, \n     18,   0,  16,   0,   7,   0, \n      0,   0,  26,   0,  16,   0, \n      7,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,  10, 194,   0, \n     16,   0,   6,   0,   0,   0, \n      6,   4,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7, 194,   0,  16,   0, \n      2,   0,   0,   0, 166,  14, \n     16,   0,   2,   0,   0,   0, \n    166,  14,  16,   0,   6,   0, \n      0,   0,  38,   0,   0,  11, \n      0, 208,   0,   0,  98,   0, \n     16,   0,   7,   0,   0,   0, \n      6,   1,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  80,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,   7,  18,   0,  16,   0, \n      7,   0,   0,   0,  26,   0, \n     16,   0,   7,   0,   0,   0, \n     58,   0,  16,   0,   5,   0, \n      0,   0,  78,   0,   0,   8, \n    194,   0,  16,   0,   6,   0, \n      0,   0,   0, 208,   0,   0, \n    166,  14,  16,   0,   2,   0, \n      0,   0,   6,   8,  16,   0, \n      7,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   6,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      6,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0,  35,   0,   0,  10, \n    194,   0,  16,   0,   2,   0, \n      0,   0, 166,  14,  16, 128, \n     65,   0,   0,   0,   6,   0, \n      0,   0,   6,   8,  16,   0, \n      7,   0,   0,   0, 166,  14, \n     16,   0,   2,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0,  34,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   7,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   7,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  41,   0,   0,   7, \n     66,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   5,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     41,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     11,   0,   0,   0,  78,   0, \n      0,   8,   0, 208,   0,   0, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     41,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  30,   0, \n      0,   7,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n     58,   0,  16,   0,   5,   0, \n      0,   0,  41,   0,   0,   7, \n     66,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     31,   0,   4,   3,  58,   0, \n     16,   0,   5,   0,   0,   0, \n     32,   0,   0,   7, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  31,   0, \n      4,   3,  58,   0,  16,   0, \n      2,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      7,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n    230, 116,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      8,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n    230, 116,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  50,   0, \n     16,   0,   9,   0,   0,   0, \n    230,  10,  16,   0,   7,   0, \n      0,   0,  54,   0,   0,   5, \n     50,   0,  16,   0,  10,   0, \n      0,   0, 230,  10,  16,   0, \n      8,   0,   0,   0,  18,   0, \n      0,   1, 165,   0,   0,   8, \n     50,   0,  16,   0,   9,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  70, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 130,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0, 165,   0,   0,   8, \n     50,   0,  16,   0,   7,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,  70, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 162,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  12,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n    162,   0,  16,   0,   4,   0, \n      0,   0,   6,   0,  16,   0, \n      0,   0,   0,   0,  86,  13, \n     16,   0,   4,   0,   0,   0, \n    165,   0,   0,   8,  50,   0, \n     16,   0,  10,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0,  70, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n     50,   0,  16,   0,   8,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,  70, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  76,   0,   0,   3, \n     42,   0,  16,   0,   5,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  41,   0,   0,  10, \n    194,   0,  16,   0,   9,   0, \n      0,   0,   6,   4,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     38,   7,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,  41,   0,   0,  10, \n    194,   0,  16,   0,   7,   0, \n      0,   0,   6,   4,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     38,   7,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10, 242,   0,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,  41,   0,   0,  10, \n    194,   0,  16,   0,  10,   0, \n      0,   0,   6,   4,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     38,   7,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,  41,   0,   0,  10, \n    194,   0,  16,   0,   8,   0, \n      0,   0,   6,   4,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     38,   7,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     85,   0,   0,  10, 162,   0, \n     16,   0,   4,   0,   0,   0, \n      6,   4,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0, 131,   0, \n      0,   5,  82,   0,  16,   0, \n      9,   0,   0,   0,   6,   1, \n     16,   0,   9,   0,   0,   0, \n    131,   0,   0,   5, 162,   0, \n     16,   0,   9,   0,   0,   0, \n     86,  13,  16,   0,   4,   0, \n      0,   0,  85,   0,   0,  10, \n    162,   0,  16,   0,   4,   0, \n      0,   0,   6,   4,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n    131,   0,   0,   5,  82,   0, \n     16,   0,   7,   0,   0,   0, \n      6,   1,  16,   0,   7,   0, \n      0,   0, 131,   0,   0,   5, \n    162,   0,  16,   0,   7,   0, \n      0,   0,  86,  13,  16,   0, \n      4,   0,   0,   0,  85,   0, \n      0,  10, 162,   0,  16,   0, \n      4,   0,   0,   0,   6,   4, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0, 131,   0,   0,   5, \n     82,   0,  16,   0,  10,   0, \n      0,   0,   6,   1,  16,   0, \n     10,   0,   0,   0, 131,   0, \n      0,   5, 162,   0,  16,   0, \n     10,   0,   0,   0,  86,  13, \n     16,   0,   4,   0,   0,   0, \n     85,   0,   0,  10, 162,   0, \n     16,   0,   4,   0,   0,   0, \n      6,   4,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0, 131,   0, \n      0,   5,  82,   0,  16,   0, \n      8,   0,   0,   0,   6,   1, \n     16,   0,   8,   0,   0,   0, \n    131,   0,   0,   5, 162,   0, \n     16,   0,   8,   0,   0,   0, \n     86,  13,  16,   0,   4,   0, \n      0,   0,   2,   0,   0,   1, \n     10,   0,   0,   1,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,  23,   0, \n      0,   1,  18,   0,   0,   1, \n     32,   0,   0,   7, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  31,   0, \n      4,   3,  58,   0,  16,   0, \n      2,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      8,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     54, 121,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     18,   0,   0,   1, 165,   0, \n      0,   8,  34,   0,  16,   0, \n      8,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0, 165,   0, \n      0,   8,  66,   0,  16,   0, \n      8,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     41,   0,   0,  10, 162,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  12,   0, \n      0,   0,  86,   5,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7, 162,   0,  16,   0, \n      4,   0,   0,   0,   6,   0, \n     16,   0,   0,   0,   0,   0, \n     86,  13,  16,   0,   4,   0, \n      0,   0, 165,   0,   0,   8, \n    130,   0,  16,   0,   8,   0, \n      0,   0,  26,   0,  16,   0, \n      4,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8,  18,   0,  16,   0, \n      8,   0,   0,   0,  58,   0, \n     16,   0,   4,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  76,   0, \n      0,   3,  42,   0,  16,   0, \n      5,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      0,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      1,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     11,   0,   0,   0,  86,   5, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     16,   0,   0,   0,  24,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  11,   0, \n      0,   0,  26,   0,  16,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59,  85,   0,   0,  10, \n    226,   0,  16,   0,  11,   0, \n      0,   0, 166,  10,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  11,   0,   0,   0, \n     42,   0,  16,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  11,   0,   0,   0, \n    246,  15,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  16,   0,   0,   0, \n     24,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     11,   0,   0,   0,  58,   0, \n     16,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      8,   0,   0,   0,   6,   0, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     16,   0,   0,   0,  24,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      2,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n     10,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     11,   0,   0,   0,  86,   5, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  11,   0, \n      0,   0,  26,   0,  16,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   3,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   8,  32, \n    128,  58,   8,  32, 128,  58, \n      8,  32, 128,  58, 171, 170, \n    170,  62,  85,   0,   0,  10, \n    226,   0,  16,   0,  11,   0, \n      0,   0, 166,  10,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  11,   0,   0,   0, \n     42,   0,  16,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   3,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   8,  32, 128,  58, \n      8,  32, 128,  58,   8,  32, \n    128,  58, 171, 170, 170,  62, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  11,   0,   0,   0, \n    246,  15,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     30,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     11,   0,   0,   0,  58,   0, \n     16,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      3,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      8,  32, 128,  58,   8,  32, \n    128,  58,   8,  32, 128,  58, \n    171, 170, 170,  62,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      8,   0,   0,   0,   6,   0, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   3,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   8,  32, 128,  58, \n      8,  32, 128,  58,   8,  32, \n    128,  58, 171, 170, 170,  62, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n     12,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0,  86,   9, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     30,   0,   0,   0,  30,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  12,   0, \n      0,   0,  26,   0,  16,   0, \n      8,   0,   0,   0,  54,   0, \n      0,   5,  98,   0,  16,   0, \n     12,   0,   0,   0,   6,   1, \n     16,   0,  11,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0, 135,   0,   0,   5, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     14,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255,   0,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  11, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16, 128, \n     65,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     17,   0,   0,   0, 140,   0, \n      0,  17, 114,   0,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  14,   0, \n      0,   0,  70,   2,  16,   0, \n     12,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n      2,  64,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  14,   0, \n      0,   0,  70,   2,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 114,   0,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  14,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,   9,   0, \n      0,   0,  70,   2,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  86,   0,   0,   5, \n    162,   0,  16,   0,   4,   0, \n      0,   0, 166,  14,  16,   0, \n     11,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0, 230,  11, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  12,   0, \n      0,   0,  42,   0,  16,   0, \n      8,   0,   0,   0,  54,   0, \n      0,   5,  98,   0,  16,   0, \n     12,   0,   0,   0,   6,   3, \n     16,   0,  11,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0, 135,   0,   0,   5, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     14,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255,   0,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  11, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16, 128, \n     65,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     17,   0,   0,   0, 140,   0, \n      0,  17, 114,   0,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  14,   0, \n      0,   0,  70,   2,  16,   0, \n     12,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n      2,  64,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  14,   0, \n      0,   0,  70,   2,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 114,   0,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  14,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,   7,   0, \n      0,   0,  70,   2,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  56,   0,   0,  10, \n    162,   0,  16,   0,   4,   0, \n      0,   0,  86,  13,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n    171, 170, 170,  62,   0,   0, \n      0,   0, 171, 170, 170,  62, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  11,   0,   0,   0, \n     58,   0,  16,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  12,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 114,   0,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0, 135,   0, \n      0,   5, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  13,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n    232, 255, 255, 255, 232, 255, \n    255, 255, 232, 255, 255, 255, \n      0,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  11, 114,   0,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16, 128,  65,   0,   0,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  16,   0,   0,   0, \n     70,   2,  16,   0,  14,   0, \n      0,   0,  70,   2,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n    140,   0,   0,  17, 114,   0, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  11,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  11,   0,   0,   0, \n     70,   2,  16,   0,  14,   0, \n      0,   0,  70,   2,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  11,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 114,   0, \n     16,   0,  11,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     10,   0,   0,   0,  70,   2, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0,  54,   0, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,  30,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,  86,   0,   0,   5, \n     50,   0,  16,   0,   5,   0, \n      0,   0, 198,   0,  16,   0, \n     11,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     11,   0,   0,   0,  10,   0, \n     16,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0, 135,   0,   0,   5, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     13,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255,   0,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  11, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16, 128, \n     65,   0,   0,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  14,   0,   0,   0, \n     70,   2,  16,   0,  14,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0, 140,   0, \n      0,  17, 114,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  11,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,  14,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  11,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 114,   0,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,   8,   0, \n      0,   0,  70,   2,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  56,   0,   0,  10, \n     50,   0,  16,   0,   5,   0, \n      0,   0,  70,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0, 171, 170, 170,  62, \n    171, 170, 170,  62,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5, 130,   0, \n     16,   0,   9,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0,  54,   0,   0,   5, \n    130,   0,  16,   0,   7,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,  54,   0, \n      0,   5, 130,   0,  16,   0, \n     10,   0,   0,   0,  10,   0, \n     16,   0,   5,   0,   0,   0, \n     54,   0,   0,   5, 130,   0, \n     16,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n    150,   3,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  54,   0, \n      0,   5,  82,   0,  16,   0, \n     12,   0,   0,   0,   6,   1, \n     16,   0,  11,   0,   0,   0, \n     54,   0,   0,   5, 162,   0, \n     16,   0,  12,   0,   0,   0, \n     86,   9,  16,   0,   8,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10,  50,   0, \n     16,   0,   9,   0,   0,   0, \n     70,   0,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0,   0,   0, \n      0,   0,   0,   0,  52,   0, \n      0,  10,  50,   0,  16,   0, \n      7,   0,   0,   0, 230,  10, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     98,   0,  16,   0,   8,   0, \n      0,   0, 166,  11,  16,   0, \n     11,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0, 214,   2, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n     50,   0,  16,   0,  10,   0, \n      0,   0,  70,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     52,   0,   0,  10,  50,   0, \n     16,   0,   8,   0,   0,   0, \n    230,  10,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      6,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0, 150,   3, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 131,   0,   0,   5, \n     18,   0,  16,   0,   9,   0, \n      0,   0,  26,   0,  16,   0, \n      8,   0,   0,   0, 131,   0, \n      0,   5,  34,   0,  16,   0, \n      9,   0,   0,   0,  10,   0, \n     16,   0,  11,   0,   0,   0, \n    131,   0,   0,   5,  18,   0, \n     16,   0,   7,   0,   0,   0, \n     42,   0,  16,   0,   8,   0, \n      0,   0, 131,   0,   0,   5, \n     34,   0,  16,   0,   7,   0, \n      0,   0,  26,   0,  16,   0, \n     11,   0,   0,   0, 131,   0, \n      0,   5,  18,   0,  16,   0, \n     10,   0,   0,   0,  58,   0, \n     16,   0,   8,   0,   0,   0, \n    131,   0,   0,   5,  34,   0, \n     16,   0,  10,   0,   0,   0, \n     42,   0,  16,   0,  11,   0, \n      0,   0, 131,   0,   0,   5, \n     18,   0,  16,   0,   8,   0, \n      0,   0,  10,   0,  16,   0, \n      8,   0,   0,   0, 131,   0, \n      0,   5,  34,   0,  16,   0, \n      8,   0,   0,   0,  58,   0, \n     16,   0,  11,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   1, \n     10,   0,   0,   1,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      9,   0,   0,   0,  26,   0, \n     16,   0,   8,   0,   0,   0, \n     54,   0,   0,   8, 226,   0, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   7,   0, \n      0,   0,  42,   0,  16,   0, \n      8,   0,   0,   0,  54,   0, \n      0,   8, 226,   0,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  10,   0,   0,   0, \n     58,   0,  16,   0,   8,   0, \n      0,   0,  54,   0,   0,   8, \n    226,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 226,   0,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,  23,   0, \n      0,   1,  21,   0,   0,   1, \n     80,   0,   0,   7, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  31,   0, \n      4,   3,  58,   0,  16,   0, \n      2,   0,   0,   0,  56,   0, \n      0,   7, 130,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  63,  35,   0,   0,   9, \n    130,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n     64,   1,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     58,   0,  16,   0,   5,   0, \n      0,   0,  32,   0,   0,   7, \n     34,   0,  16,   0,   4,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   4,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0, 230, 116,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     34,   0,  16,   0,   4,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0, 230, 116,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     50,   0,  16,   0,  13,   0, \n      0,   0, 230,  10,  16,   0, \n     11,   0,   0,   0,  54,   0, \n      0,   5,  50,   0,  16,   0, \n     14,   0,   0,   0, 230,  10, \n     16,   0,  12,   0,   0,   0, \n     18,   0,   0,   1, 165,   0, \n      0,   8,  50,   0,  16,   0, \n     13,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n     70, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  34,   0, \n     16,   0,   4,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0, 165,   0, \n      0,   8,  50,   0,  16,   0, \n     11,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n     70, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     41,   0,   0,  10, 162,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  12,   0, \n      0,   0,  86,   5,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7, 162,   0,  16,   0, \n      4,   0,   0,   0, 246,  15, \n     16,   0,   3,   0,   0,   0, \n     86,  13,  16,   0,   4,   0, \n      0,   0, 165,   0,   0,   8, \n     50,   0,  16,   0,  14,   0, \n      0,   0,  26,   0,  16,   0, \n      4,   0,   0,   0,  70, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8,  50,   0,  16,   0, \n     12,   0,   0,   0,  58,   0, \n     16,   0,   4,   0,   0,   0, \n     70, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  76,   0, \n      0,   3,  42,   0,  16,   0, \n      5,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      5,   0,   0,   0,  41,   0, \n      0,  10, 194,   0,  16,   0, \n     13,   0,   0,   0,   6,   4, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  38,   7,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,  41,   0, \n      0,  10, 194,   0,  16,   0, \n     11,   0,   0,   0,   6,   4, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  38,   7,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,  41,   0, \n      0,  10, 194,   0,  16,   0, \n     14,   0,   0,   0,   6,   4, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  38,   7,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10, 242,   0, \n     16,   0,  14,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,  41,   0, \n      0,  10, 194,   0,  16,   0, \n     12,   0,   0,   0,   6,   4, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  38,   7,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  85,   0,   0,  10, \n    162,   0,  16,   0,   4,   0, \n      0,   0,   6,   4,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n    131,   0,   0,   5,  82,   0, \n     16,   0,  13,   0,   0,   0, \n      6,   1,  16,   0,  13,   0, \n      0,   0, 131,   0,   0,   5, \n    162,   0,  16,   0,  13,   0, \n      0,   0,  86,  13,  16,   0, \n      4,   0,   0,   0,  85,   0, \n      0,  10, 162,   0,  16,   0, \n      4,   0,   0,   0,   6,   4, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0, 131,   0,   0,   5, \n     82,   0,  16,   0,  11,   0, \n      0,   0,   6,   1,  16,   0, \n     11,   0,   0,   0, 131,   0, \n      0,   5, 162,   0,  16,   0, \n     11,   0,   0,   0,  86,  13, \n     16,   0,   4,   0,   0,   0, \n     85,   0,   0,  10, 162,   0, \n     16,   0,   4,   0,   0,   0, \n      6,   4,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0, 131,   0, \n      0,   5,  82,   0,  16,   0, \n     14,   0,   0,   0,   6,   1, \n     16,   0,  14,   0,   0,   0, \n    131,   0,   0,   5, 162,   0, \n     16,   0,  14,   0,   0,   0, \n     86,  13,  16,   0,   4,   0, \n      0,   0,  85,   0,   0,  10, \n    162,   0,  16,   0,   4,   0, \n      0,   0,   6,   4,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n    131,   0,   0,   5,  82,   0, \n     16,   0,  12,   0,   0,   0, \n      6,   1,  16,   0,  12,   0, \n      0,   0, 131,   0,   0,   5, \n    162,   0,  16,   0,  12,   0, \n      0,   0,  86,  13,  16,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   1,  10,   0,   0,   1, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   1, \n     23,   0,   0,   1,  18,   0, \n      0,   1,  32,   0,   0,   7, \n     34,   0,  16,   0,   4,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   4,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,  54, 121,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  18,   0,   0,   1, \n    165,   0,   0,   8,  34,   0, \n     16,   0,  12,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     34,   0,  16,   0,   4,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n    165,   0,   0,   8,  66,   0, \n     16,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    162,   0,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n     12,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7, 162,   0, \n     16,   0,   4,   0,   0,   0, \n    246,  15,  16,   0,   3,   0, \n      0,   0,  86,  13,  16,   0, \n      4,   0,   0,   0, 165,   0, \n      0,   8, 130,   0,  16,   0, \n     12,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    165,   0,   0,   8,  18,   0, \n     16,   0,  12,   0,   0,   0, \n     58,   0,  16,   0,   4,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     76,   0,   0,   3,  42,   0, \n     16,   0,   5,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   0,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  15,   0,   0,   0, \n     86,   5,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  16,   0,   0,   0, \n     24,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     15,   0,   0,   0,  26,   0, \n     16,   0,  12,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     15,   0,   0,   0, 166,  10, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     16,   0,   0,   0,  24,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  15,   0, \n      0,   0,  42,   0,  16,   0, \n     12,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59,  85,   0,   0,  10, \n    226,   0,  16,   0,  15,   0, \n      0,   0, 246,  15,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  15,   0,   0,   0, \n     58,   0,  16,   0,  12,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  14,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  12,   0,   0,   0, \n      6,   0,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  16,   0,   0,   0, \n     24,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,  10,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  15,   0,   0,   0, \n     86,   5,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     30,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     15,   0,   0,   0,  26,   0, \n     16,   0,  12,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      3,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      8,  32, 128,  58,   8,  32, \n    128,  58,   8,  32, 128,  58, \n    171, 170, 170,  62,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     15,   0,   0,   0, 166,  10, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  15,   0, \n      0,   0,  42,   0,  16,   0, \n     12,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   3,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   8,  32, \n    128,  58,   8,  32, 128,  58, \n      8,  32, 128,  58, 171, 170, \n    170,  62,  85,   0,   0,  10, \n    226,   0,  16,   0,  15,   0, \n      0,   0, 246,  15,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  15,   0,   0,   0, \n     58,   0,  16,   0,  12,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   3,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  14,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   8,  32, 128,  58, \n      8,  32, 128,  58,   8,  32, \n    128,  58, 171, 170, 170,  62, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  12,   0,   0,   0, \n      6,   0,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     30,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   3,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   8,  32, \n    128,  58,   8,  32, 128,  58, \n      8,  32, 128,  58, 171, 170, \n    170,  62,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     86,   9,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n     30,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     16,   0,   0,   0,  26,   0, \n     16,   0,  12,   0,   0,   0, \n     54,   0,   0,   5,  98,   0, \n     16,   0,  16,   0,   0,   0, \n      6,   1,  16,   0,  15,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 114,   0,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0, 135,   0, \n      0,   5, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,   2,  64,   0,   0, \n    232, 255, 255, 255, 232, 255, \n    255, 255, 232, 255, 255, 255, \n      0,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  11, 114,   0,  16,   0, \n     21,   0,   0,   0,  70,   2, \n     16, 128,  65,   0,   0,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  21,   0,   0,   0, \n    140,   0,   0,  17, 114,   0, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  16,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  21,   0, \n      0,   0,   2,  64,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 114,   0, \n     16,   0,  16,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   0, \n      0,   5, 162,   0,  16,   0, \n      4,   0,   0,   0, 166,  14, \n     16,   0,  15,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,  15,   0,   0,   0, \n    230,  11,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     16,   0,   0,   0,  42,   0, \n     16,   0,  12,   0,   0,   0, \n     54,   0,   0,   5,  98,   0, \n     16,   0,  16,   0,   0,   0, \n      6,   3,  16,   0,  15,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 114,   0,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0, 135,   0, \n      0,   5, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,   2,  64,   0,   0, \n    232, 255, 255, 255, 232, 255, \n    255, 255, 232, 255, 255, 255, \n      0,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  11, 114,   0,  16,   0, \n     21,   0,   0,   0,  70,   2, \n     16, 128,  65,   0,   0,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  21,   0,   0,   0, \n    140,   0,   0,  17, 114,   0, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  16,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  21,   0, \n      0,   0,   2,  64,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 114,   0, \n     16,   0,  16,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  56,   0, \n      0,  10, 162,   0,  16,   0, \n      4,   0,   0,   0,  86,  13, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0, 171, 170, 170,  62, \n      0,   0,   0,   0, 171, 170, \n    170,  62,  54,   0,   0,   5, \n     18,   0,  16,   0,  15,   0, \n      0,   0,  58,   0,  16,   0, \n     12,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n    138,   0,   0,  15, 114,   0, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n    135,   0,   0,   5, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0, 232, 255, 255, 255, \n    232, 255, 255, 255, 232, 255, \n    255, 255,   0,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  11, 114,   0, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16, 128,  65,   0, \n      0,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0, 140,   0,   0,  17, \n    114,   0,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  14,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     54,   0,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n     30,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     30,   0,   0,   0,  86,   0, \n      0,   5,  50,   0,  16,   0, \n      5,   0,   0,   0, 198,   0, \n     16,   0,  15,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  15,   0,   0,   0, \n     10,   0,  16,   0,  12,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 114,   0,  16,   0, \n     18,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0, 135,   0, \n      0,   5, 114,   0,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n    232, 255, 255, 255, 232, 255, \n    255, 255, 232, 255, 255, 255, \n      0,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  11, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16, 128,  65,   0,   0,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  20,   0,   0,   0, \n    140,   0,   0,  17, 114,   0, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,   2,  64,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  56,   0, \n      0,  10,  50,   0,  16,   0, \n      5,   0,   0,   0,  70,   0, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0, 171, 170, \n    170,  62, 171, 170, 170,  62, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n    130,   0,  16,   0,  13,   0, \n      0,   0,  26,   0,  16,   0, \n      4,   0,   0,   0,  54,   0, \n      0,   5, 130,   0,  16,   0, \n     11,   0,   0,   0,  58,   0, \n     16,   0,   4,   0,   0,   0, \n     54,   0,   0,   5, 130,   0, \n     16,   0,  14,   0,   0,   0, \n     10,   0,  16,   0,   5,   0, \n      0,   0,  54,   0,   0,   5, \n    130,   0,  16,   0,  12,   0, \n      0,   0,  26,   0,  16,   0, \n      5,   0,   0,   0,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0, 150,   3,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     54,   0,   0,   5,  82,   0, \n     16,   0,  16,   0,   0,   0, \n      6,   1,  16,   0,  15,   0, \n      0,   0,  54,   0,   0,   5, \n    162,   0,  16,   0,  16,   0, \n      0,   0,  86,   9,  16,   0, \n     12,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n     16,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n     50,   0,  16,   0,  13,   0, \n      0,   0,  70,   0,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     52,   0,   0,  10,  50,   0, \n     16,   0,  11,   0,   0,   0, \n    230,  10,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  98,   0,  16,   0, \n     12,   0,   0,   0, 166,  11, \n     16,   0,  15,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,  15,   0,   0,   0, \n    214,   2,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10,  50,   0,  16,   0, \n     14,   0,   0,   0,  70,   0, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  52,   0,   0,  10, \n     50,   0,  16,   0,  12,   0, \n      0,   0, 230,  10,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   6,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,  15,   0,   0,   0, \n    150,   3,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 131,   0, \n      0,   5,  18,   0,  16,   0, \n     13,   0,   0,   0,  26,   0, \n     16,   0,  12,   0,   0,   0, \n    131,   0,   0,   5,  34,   0, \n     16,   0,  13,   0,   0,   0, \n     10,   0,  16,   0,  15,   0, \n      0,   0, 131,   0,   0,   5, \n     18,   0,  16,   0,  11,   0, \n      0,   0,  42,   0,  16,   0, \n     12,   0,   0,   0, 131,   0, \n      0,   5,  34,   0,  16,   0, \n     11,   0,   0,   0,  26,   0, \n     16,   0,  15,   0,   0,   0, \n    131,   0,   0,   5,  18,   0, \n     16,   0,  14,   0,   0,   0, \n     58,   0,  16,   0,  12,   0, \n      0,   0, 131,   0,   0,   5, \n     34,   0,  16,   0,  14,   0, \n      0,   0,  42,   0,  16,   0, \n     15,   0,   0,   0, 131,   0, \n      0,   5,  18,   0,  16,   0, \n     12,   0,   0,   0,  10,   0, \n     16,   0,  12,   0,   0,   0, \n    131,   0,   0,   5,  34,   0, \n     16,   0,  12,   0,   0,   0, \n     58,   0,  16,   0,  15,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   1,  10,   0,   0,   1, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  13,   0,   0,   0, \n     26,   0,  16,   0,  12,   0, \n      0,   0,  54,   0,   0,   8, \n    226,   0,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     11,   0,   0,   0,  42,   0, \n     16,   0,  12,   0,   0,   0, \n     54,   0,   0,   8, 226,   0, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  14,   0, \n      0,   0,  58,   0,  16,   0, \n     12,   0,   0,   0,  54,   0, \n      0,   8, 226,   0,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 226,   0, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   1, \n     23,   0,   0,   1,  21,   0, \n      0,   1,   0,   0,   0,   7, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n      0,   0,   0,   7, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   7, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  14,   0, \n      0,   0,   0,   0,   0,   7, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n     80,   0,   0,   7,  34,   0, \n     16,   0,   4,   0,   0,   0, \n     26,   0,  16,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      4,   0,   0,   0,  41,   0, \n      0,   7,  34,   0,  16,   0, \n      4,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     58,   0,  16,   0,   5,   0, \n      0,   0,  56,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0, 128,  62, \n     30,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      4,   0,   0,   0,  31,   0, \n      4,   3,  58,   0,  16,   0, \n      5,   0,   0,   0,  32,   0, \n      0,   7, 130,   0,  16,   0, \n      4,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   8,   0, \n      0,   0,  31,   0,   4,   3, \n     58,   0,  16,   0,   4,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0, 230, 116, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 130,   0,  16,   0, \n      4,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0, 230, 116, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  50,   0,  16,   0, \n     13,   0,   0,   0, 230,  10, \n     16,   0,  11,   0,   0,   0, \n     54,   0,   0,   5,  50,   0, \n     16,   0,  14,   0,   0,   0, \n    230,  10,  16,   0,  12,   0, \n      0,   0,  18,   0,   0,   1, \n    165,   0,   0,   8,  50,   0, \n     16,   0,  13,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  70, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    130,   0,  16,   0,   4,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n    165,   0,   0,   8,  50,   0, \n     16,   0,  11,   0,   0,   0, \n     58,   0,  16,   0,   4,   0, \n      0,   0,  70, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n     50,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,   5,   0,   0,   0, \n      6,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      5,   0,   0,   0, 165,   0, \n      0,   8,  50,   0,  16,   0, \n     14,   0,   0,   0,  10,   0, \n     16,   0,   5,   0,   0,   0, \n     70, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    165,   0,   0,   8,  50,   0, \n     16,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0,  70, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     76,   0,   0,   3,  42,   0, \n     16,   0,   5,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   5,   0,   0,   0, \n     41,   0,   0,  10, 194,   0, \n     16,   0,  13,   0,   0,   0, \n      6,   4,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  38,   7, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n     41,   0,   0,  10, 194,   0, \n     16,   0,  11,   0,   0,   0, \n      6,   4,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  38,   7, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n     41,   0,   0,  10, 194,   0, \n     16,   0,  14,   0,   0,   0, \n      6,   4,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  38,   7, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n    242,   0,  16,   0,  14,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n     41,   0,   0,  10, 194,   0, \n     16,   0,  12,   0,   0,   0, \n      6,   4,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  38,   7, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      7,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      5,   0,   0,   0,  70,   0, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 131,   0,   0,   5, \n     82,   0,  16,   0,  13,   0, \n      0,   0,   6,   1,  16,   0, \n     13,   0,   0,   0, 131,   0, \n      0,   5, 162,   0,  16,   0, \n     13,   0,   0,   0,   6,   4, \n     16,   0,   5,   0,   0,   0, \n     85,   0,   0,  10,  50,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 131,   0, \n      0,   5,  82,   0,  16,   0, \n     11,   0,   0,   0,   6,   1, \n     16,   0,  11,   0,   0,   0, \n    131,   0,   0,   5, 162,   0, \n     16,   0,  11,   0,   0,   0, \n      6,   4,  16,   0,   5,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   5,   0, \n      0,   0,  70,   0,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    131,   0,   0,   5,  82,   0, \n     16,   0,  14,   0,   0,   0, \n      6,   1,  16,   0,  14,   0, \n      0,   0, 131,   0,   0,   5, \n    162,   0,  16,   0,  14,   0, \n      0,   0,   6,   4,  16,   0, \n      5,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      5,   0,   0,   0,  70,   0, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 131,   0,   0,   5, \n     82,   0,  16,   0,  12,   0, \n      0,   0,   6,   1,  16,   0, \n     12,   0,   0,   0, 131,   0, \n      0,   5, 162,   0,  16,   0, \n     12,   0,   0,   0,   6,   4, \n     16,   0,   5,   0,   0,   0, \n      2,   0,   0,   1,  10,   0, \n      0,   1,  54,   0,   0,   8, \n    194,   0,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   1,  23,   0,   0,   1, \n     18,   0,   0,   1,  32,   0, \n      0,   7, 130,   0,  16,   0, \n      4,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  31,   0,   4,   3, \n     58,   0,  16,   0,   4,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  54, 121, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  18,   0, \n      0,   1, 165,   0,   0,   8, \n     34,   0,  16,   0,  12,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 130,   0,  16,   0, \n      4,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n     66,   0,  16,   0,  12,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10,  50,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n     12,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   5,   0, \n      0,   0,   6,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   5,   0,   0,   0, \n    165,   0,   0,   8, 130,   0, \n     16,   0,  12,   0,   0,   0, \n     10,   0,  16,   0,   5,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n     18,   0,  16,   0,  12,   0, \n      0,   0,  26,   0,  16,   0, \n      5,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  76,   0,   0,   3, \n     42,   0,  16,   0,   5,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,   0,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,  15,   0, \n      0,   0,  86,   5,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  15,   0,   0,   0, \n     26,   0,  16,   0,  12,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  15,   0,   0,   0, \n    166,  10,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  16,   0,   0,   0, \n     24,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     15,   0,   0,   0,  42,   0, \n     16,   0,  12,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     15,   0,   0,   0, 246,  15, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     16,   0,   0,   0,  24,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  15,   0, \n      0,   0,  58,   0,  16,   0, \n     12,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     14,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59,  85,   0,   0,  10, \n    226,   0,  16,   0,  12,   0, \n      0,   0,   6,   0,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,  10,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,  15,   0, \n      0,   0,  86,   5,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  15,   0,   0,   0, \n     26,   0,  16,   0,  12,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   3,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   8,  32, 128,  58, \n      8,  32, 128,  58,   8,  32, \n    128,  58, 171, 170, 170,  62, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  15,   0,   0,   0, \n    166,  10,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     30,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     15,   0,   0,   0,  42,   0, \n     16,   0,  12,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      3,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      8,  32, 128,  58,   8,  32, \n    128,  58,   8,  32, 128,  58, \n    171, 170, 170,  62,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     15,   0,   0,   0, 246,  15, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  15,   0, \n      0,   0,  58,   0,  16,   0, \n     12,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   3,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     14,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   8,  32, \n    128,  58,   8,  32, 128,  58, \n      8,  32, 128,  58, 171, 170, \n    170,  62,  85,   0,   0,  10, \n    226,   0,  16,   0,  12,   0, \n      0,   0,   6,   0,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      3,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      8,  32, 128,  58,   8,  32, \n    128,  58,   8,  32, 128,  58, \n    171, 170, 170,  62,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  86,   9,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,  30,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  16,   0,   0,   0, \n     26,   0,  16,   0,  12,   0, \n      0,   0,  54,   0,   0,   5, \n     98,   0,  16,   0,  16,   0, \n      0,   0,   6,   1,  16,   0, \n     15,   0,   0,   0,   1,   0, \n      0,  10, 226,   0,  16,   0, \n      6,   0,   0,   0,   6,   9, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n    138,   0,   0,  15, 114,   0, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n    135,   0,   0,   5, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0, 232, 255, 255, 255, \n    232, 255, 255, 255, 232, 255, \n    255, 255,   0,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  11, 114,   0, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16, 128,  65,   0, \n      0,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0, 140,   0,   0,  17, \n    114,   0,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  13,   0,   0,   0, \n    150,   7,  16,   0,   6,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     86,   0,   0,   5,  50,   0, \n     16,   0,   5,   0,   0,   0, \n    230,  10,  16,   0,  15,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0, 230,  11,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  16,   0,   0,   0, \n     42,   0,  16,   0,  12,   0, \n      0,   0,  54,   0,   0,   5, \n     98,   0,  16,   0,  16,   0, \n      0,   0,   6,   3,  16,   0, \n     15,   0,   0,   0,   1,   0, \n      0,  10, 226,   0,  16,   0, \n      6,   0,   0,   0,   6,   9, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n    138,   0,   0,  15, 114,   0, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n    135,   0,   0,   5, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0, 232, 255, 255, 255, \n    232, 255, 255, 255, 232, 255, \n    255, 255,   0,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  11, 114,   0, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16, 128,  65,   0, \n      0,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0, 140,   0,   0,  17, \n    114,   0,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  11,   0,   0,   0, \n    150,   7,  16,   0,   6,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     56,   0,   0,  10,  50,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n    171, 170, 170,  62, 171, 170, \n    170,  62,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     15,   0,   0,   0,  58,   0, \n     16,   0,  12,   0,   0,   0, \n      1,   0,   0,  10, 226,   0, \n     16,   0,   6,   0,   0,   0, \n      6,   9,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,  17,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0, 135,   0,   0,   5, \n    114,   0,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255,   0,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  11, \n    114,   0,  16,   0,  19,   0, \n      0,   0,  70,   2,  16, 128, \n     65,   0,   0,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0, 140,   0, \n      0,  17, 114,   0,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  14,   0, \n      0,   0, 150,   7,  16,   0, \n      6,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  54,   0,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,  30,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n     86,   0,   0,   5,  98,   0, \n     16,   0,   6,   0,   0,   0, \n      6,   3,  16,   0,  15,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  15,   0, \n      0,   0,  10,   0,  16,   0, \n     12,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n    138,   0,   0,  15, 114,   0, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n    135,   0,   0,   5, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0, 232, 255, 255, 255, \n    232, 255, 255, 255, 232, 255, \n    255, 255,   0,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  11, 114,   0, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16, 128,  65,   0, \n      0,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0, 140,   0,   0,  17, \n    114,   0,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     56,   0,   0,  10,  98,   0, \n     16,   0,   6,   0,   0,   0, \n     86,   6,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0, 171, 170, \n    170,  62, 171, 170, 170,  62, \n      0,   0,   0,   0,  54,   0, \n      0,   5, 130,   0,  16,   0, \n     13,   0,   0,   0,  10,   0, \n     16,   0,   5,   0,   0,   0, \n     54,   0,   0,   5, 130,   0, \n     16,   0,  11,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0,  54,   0,   0,   5, \n    130,   0,  16,   0,  14,   0, \n      0,   0,  26,   0,  16,   0, \n      6,   0,   0,   0,  54,   0, \n      0,   5, 130,   0,  16,   0, \n     12,   0,   0,   0,  42,   0, \n     16,   0,   6,   0,   0,   0, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      4,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0, 150,   3, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  54,   0,   0,   5, \n     82,   0,  16,   0,  16,   0, \n      0,   0,   6,   1,  16,   0, \n     15,   0,   0,   0,  54,   0, \n      0,   5, 162,   0,  16,   0, \n     16,   0,   0,   0,  86,   9, \n     16,   0,  12,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,  16,   0,   0,   0, \n     70,  14,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,  16,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  16,   0,   0,   0, \n     70,  14,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10,  50,   0,  16,   0, \n     13,   0,   0,   0,  70,   0, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  52,   0,   0,  10, \n     50,   0,  16,   0,  11,   0, \n      0,   0, 230,  10,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  98,   0, \n     16,   0,  12,   0,   0,   0, \n    166,  11,  16,   0,  15,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0, 214,   2,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10,  50,   0, \n     16,   0,  14,   0,   0,   0, \n     70,   0,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0,   0,   0, \n      0,   0,   0,   0,  52,   0, \n      0,  10,  50,   0,  16,   0, \n     12,   0,   0,   0, 230,  10, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0, 150,   3,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    131,   0,   0,   5,  18,   0, \n     16,   0,  13,   0,   0,   0, \n     26,   0,  16,   0,  12,   0, \n      0,   0, 131,   0,   0,   5, \n     34,   0,  16,   0,  13,   0, \n      0,   0,  10,   0,  16,   0, \n     15,   0,   0,   0, 131,   0, \n      0,   5,  18,   0,  16,   0, \n     11,   0,   0,   0,  42,   0, \n     16,   0,  12,   0,   0,   0, \n    131,   0,   0,   5,  34,   0, \n     16,   0,  11,   0,   0,   0, \n     26,   0,  16,   0,  15,   0, \n      0,   0, 131,   0,   0,   5, \n     18,   0,  16,   0,  14,   0, \n      0,   0,  58,   0,  16,   0, \n     12,   0,   0,   0, 131,   0, \n      0,   5,  34,   0,  16,   0, \n     14,   0,   0,   0,  42,   0, \n     16,   0,  15,   0,   0,   0, \n    131,   0,   0,   5,  18,   0, \n     16,   0,  12,   0,   0,   0, \n     10,   0,  16,   0,  12,   0, \n      0,   0, 131,   0,   0,   5, \n     34,   0,  16,   0,  12,   0, \n      0,   0,  58,   0,  16,   0, \n     15,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,  10,   0, \n      0,   1,  54,   0,   0,   5, \n     18,   0,  16,   0,  13,   0, \n      0,   0,  26,   0,  16,   0, \n     12,   0,   0,   0,  54,   0, \n      0,   8, 226,   0,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  11,   0,   0,   0, \n     42,   0,  16,   0,  12,   0, \n      0,   0,  54,   0,   0,   8, \n    226,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     14,   0,   0,   0,  58,   0, \n     16,   0,  12,   0,   0,   0, \n     54,   0,   0,   8, 226,   0, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    226,   0,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   1,  23,   0,   0,   1, \n     21,   0,   0,   1,   0,   0, \n      0,   7, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   0,   0,   0,   7, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      0,   0,   0,   7, 242,   0, \n     16,   0,  14,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     14,   0,   0,   0,   0,   0, \n      0,   7, 242,   0,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n     31,   0,   4,   3,  58,   0, \n     16,   0,   5,   0,   0,   0, \n     32,   0,   0,   7, 130,   0, \n     16,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  31,   0, \n      4,   3,  58,   0,  16,   0, \n      3,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n     15,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n    230, 116,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 130,   0, \n     16,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n     16,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n    230, 116,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  50,   0, \n     16,   0,  17,   0,   0,   0, \n    230,  10,  16,   0,  15,   0, \n      0,   0,  54,   0,   0,   5, \n     50,   0,  16,   0,  18,   0, \n      0,   0, 230,  10,  16,   0, \n     16,   0,   0,   0,  18,   0, \n      0,   1, 165,   0,   0,   8, \n     50,   0,  16,   0,  17,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  70, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 130,   0,  16,   0, \n      3,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n     50,   0,  16,   0,  15,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,  70, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 162,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  12,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n    162,   0,  16,   0,   4,   0, \n      0,   0,   6,   0,  16,   0, \n      0,   0,   0,   0,  86,  13, \n     16,   0,   4,   0,   0,   0, \n    165,   0,   0,   8,  50,   0, \n     16,   0,  18,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0,  70, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n     50,   0,  16,   0,  16,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,  70, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  76,   0,   0,   3, \n     42,   0,  16,   0,   5,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  41,   0,   0,  10, \n    194,   0,  16,   0,  17,   0, \n      0,   0,   6,   4,  16,   0, \n     17,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,  19,   0,   0,   0, \n     38,   7,  16,   0,  17,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     19,   0,   0,   0,  70,  14, \n     16,   0,  19,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  19,   0,   0,   0, \n     70,  14,  16,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10, 242,   0,  16,   0, \n     17,   0,   0,   0,  70,  14, \n     16,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,  41,   0,   0,  10, \n    194,   0,  16,   0,  15,   0, \n      0,   0,   6,   4,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,  19,   0,   0,   0, \n     38,   7,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     19,   0,   0,   0,  70,  14, \n     16,   0,  19,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  19,   0,   0,   0, \n     70,  14,  16,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,  41,   0,   0,  10, \n    194,   0,  16,   0,  18,   0, \n      0,   0,   6,   4,  16,   0, \n     18,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,  19,   0,   0,   0, \n     38,   7,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     19,   0,   0,   0,  70,  14, \n     16,   0,  19,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  19,   0,   0,   0, \n     70,  14,  16,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10, 242,   0,  16,   0, \n     18,   0,   0,   0,  70,  14, \n     16,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,  41,   0,   0,  10, \n    194,   0,  16,   0,  16,   0, \n      0,   0,   6,   4,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,  19,   0,   0,   0, \n     38,   7,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     19,   0,   0,   0,  70,  14, \n     16,   0,  19,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  19,   0,   0,   0, \n     70,  14,  16,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10, 242,   0,  16,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     85,   0,   0,  10, 162,   0, \n     16,   0,   4,   0,   0,   0, \n      6,   4,  16,   0,  17,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0, 131,   0, \n      0,   5,  82,   0,  16,   0, \n     17,   0,   0,   0,   6,   1, \n     16,   0,  17,   0,   0,   0, \n    131,   0,   0,   5, 162,   0, \n     16,   0,  17,   0,   0,   0, \n     86,  13,  16,   0,   4,   0, \n      0,   0,  85,   0,   0,  10, \n    162,   0,  16,   0,   4,   0, \n      0,   0,   6,   4,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n    131,   0,   0,   5,  82,   0, \n     16,   0,  15,   0,   0,   0, \n      6,   1,  16,   0,  15,   0, \n      0,   0, 131,   0,   0,   5, \n    162,   0,  16,   0,  15,   0, \n      0,   0,  86,  13,  16,   0, \n      4,   0,   0,   0,  85,   0, \n      0,  10, 162,   0,  16,   0, \n      4,   0,   0,   0,   6,   4, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0, 131,   0,   0,   5, \n     82,   0,  16,   0,  18,   0, \n      0,   0,   6,   1,  16,   0, \n     18,   0,   0,   0, 131,   0, \n      0,   5, 162,   0,  16,   0, \n     18,   0,   0,   0,  86,  13, \n     16,   0,   4,   0,   0,   0, \n     85,   0,   0,  10, 162,   0, \n     16,   0,   4,   0,   0,   0, \n      6,   4,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0, 131,   0, \n      0,   5,  82,   0,  16,   0, \n     16,   0,   0,   0,   6,   1, \n     16,   0,  16,   0,   0,   0, \n    131,   0,   0,   5, 162,   0, \n     16,   0,  16,   0,   0,   0, \n     86,  13,  16,   0,   4,   0, \n      0,   0,   2,   0,   0,   1, \n     10,   0,   0,   1,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     17,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,  23,   0, \n      0,   1,  18,   0,   0,   1, \n     32,   0,   0,   7, 130,   0, \n     16,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  31,   0, \n      4,   3,  58,   0,  16,   0, \n      3,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n     16,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     54, 121,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     18,   0,   0,   1, 165,   0, \n      0,   8,  34,   0,  16,   0, \n     16,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8,  66,   0,  16,   0, \n     16,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     41,   0,   0,  10, 162,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  12,   0, \n      0,   0,  86,   5,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7, 162,   0,  16,   0, \n      4,   0,   0,   0,   6,   0, \n     16,   0,   0,   0,   0,   0, \n     86,  13,  16,   0,   4,   0, \n      0,   0, 165,   0,   0,   8, \n    130,   0,  16,   0,  16,   0, \n      0,   0,  26,   0,  16,   0, \n      4,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8,  18,   0,  16,   0, \n     16,   0,   0,   0,  58,   0, \n     16,   0,   4,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  76,   0, \n      0,   3,  42,   0,  16,   0, \n      5,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      0,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      1,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      5,   0,   0,   0,  86,   5, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     16,   0,   0,   0,  24,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   5,   0, \n      0,   0,  26,   0,  16,   0, \n     16,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     17,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59,  85,   0,   0,  10, \n    226,   0,  16,   0,   5,   0, \n      0,   0, 166,  10,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   5,   0,   0,   0, \n     42,   0,  16,   0,  16,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   5,   0,   0,   0, \n    246,  15,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  16,   0,   0,   0, \n     24,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      5,   0,   0,   0,  58,   0, \n     16,   0,  16,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  18,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     16,   0,   0,   0,   6,   0, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     16,   0,   0,   0,  24,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      2,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n     10,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      5,   0,   0,   0,  86,   5, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   5,   0, \n      0,   0,  26,   0,  16,   0, \n     16,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   3,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     17,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   8,  32, \n    128,  58,   8,  32, 128,  58, \n      8,  32, 128,  58, 171, 170, \n    170,  62,  85,   0,   0,  10, \n    226,   0,  16,   0,   5,   0, \n      0,   0, 166,  10,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   5,   0,   0,   0, \n     42,   0,  16,   0,  16,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   3,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   8,  32, 128,  58, \n      8,  32, 128,  58,   8,  32, \n    128,  58, 171, 170, 170,  62, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   5,   0,   0,   0, \n    246,  15,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     30,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      5,   0,   0,   0,  58,   0, \n     16,   0,  16,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      3,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  18,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      8,  32, 128,  58,   8,  32, \n    128,  58,   8,  32, 128,  58, \n    171, 170, 170,  62,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     16,   0,   0,   0,   6,   0, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   3,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   8,  32, 128,  58, \n      8,  32, 128,  58,   8,  32, \n    128,  58, 171, 170, 170,  62, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n     12,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  86,   9, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     30,   0,   0,   0,  30,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  19,   0, \n      0,   0,  26,   0,  16,   0, \n     16,   0,   0,   0,  54,   0, \n      0,   5,  98,   0,  16,   0, \n     19,   0,   0,   0,   6,   1, \n     16,   0,   5,   0,   0,   0, \n      1,   0,   0,  10, 226,   0, \n     16,   0,   6,   0,   0,   0, \n      6,   9,  16,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,  21,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0, 135,   0,   0,   5, \n    114,   0,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     22,   0,   0,   0,  70,   2, \n     16,   0,  22,   0,   0,   0, \n      2,  64,   0,   0, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255,   0,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  22,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  11, \n    114,   0,  16,   0,  23,   0, \n      0,   0,  70,   2,  16, 128, \n     65,   0,   0,   0,  22,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     23,   0,   0,   0,  70,   2, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16,   0,  21,   0, \n      0,   0,  70,   2,  16,   0, \n     23,   0,   0,   0, 140,   0, \n      0,  17, 114,   0,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  23,   0,   0,   0, \n      2,  64,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 114,   0,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  17,   0, \n      0,   0, 150,   7,  16,   0, \n      6,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  86,   0,   0,   5, \n    162,   0,  16,   0,   4,   0, \n      0,   0, 166,  14,  16,   0, \n      5,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0, 230,  11, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  19,   0, \n      0,   0,  42,   0,  16,   0, \n     16,   0,   0,   0,  54,   0, \n      0,   5,  98,   0,  16,   0, \n     19,   0,   0,   0,   6,   3, \n     16,   0,   5,   0,   0,   0, \n      1,   0,   0,  10, 226,   0, \n     16,   0,   6,   0,   0,   0, \n      6,   9,  16,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,  21,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0, 135,   0,   0,   5, \n    114,   0,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     22,   0,   0,   0,  70,   2, \n     16,   0,  22,   0,   0,   0, \n      2,  64,   0,   0, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255,   0,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  22,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  11, \n    114,   0,  16,   0,  23,   0, \n      0,   0,  70,   2,  16, 128, \n     65,   0,   0,   0,  22,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     23,   0,   0,   0,  70,   2, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16,   0,  21,   0, \n      0,   0,  70,   2,  16,   0, \n     23,   0,   0,   0, 140,   0, \n      0,  17, 114,   0,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  23,   0,   0,   0, \n      2,  64,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 114,   0,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  15,   0, \n      0,   0, 150,   7,  16,   0, \n      6,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  56,   0,   0,  10, \n    162,   0,  16,   0,   4,   0, \n      0,   0,  86,  13,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n    171, 170, 170,  62,   0,   0, \n      0,   0, 171, 170, 170,  62, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   5,   0,   0,   0, \n     58,   0,  16,   0,  16,   0, \n      0,   0,   1,   0,   0,  10, \n    226,   0,  16,   0,   6,   0, \n      0,   0,   6,   9,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 114,   0,  16,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0, 135,   0, \n      0,   5, 114,   0,  16,   0, \n     21,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16,   0,  21,   0, \n      0,   0,   2,  64,   0,   0, \n    232, 255, 255, 255, 232, 255, \n    255, 255, 232, 255, 255, 255, \n      0,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     21,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  21,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  11, 114,   0,  16,   0, \n     22,   0,   0,   0,  70,   2, \n     16, 128,  65,   0,   0,   0, \n     21,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  22,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  22,   0,   0,   0, \n    140,   0,   0,  17, 114,   0, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     21,   0,   0,   0,  70,   2, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,   5,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,   5,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  22,   0, \n      0,   0,   2,  64,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,   5,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 114,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     18,   0,   0,   0, 150,   7, \n     16,   0,   6,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  54,   0, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  30,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,  86,   0,   0,   5, \n     98,   0,  16,   0,   6,   0, \n      0,   0,   6,   3,  16,   0, \n      5,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      5,   0,   0,   0,  10,   0, \n     16,   0,  16,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,  21,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0, 135,   0,   0,   5, \n    114,   0,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     22,   0,   0,   0,  70,   2, \n     16,   0,  22,   0,   0,   0, \n      2,  64,   0,   0, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255,   0,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  22,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  11, \n    114,   0,  16,   0,  23,   0, \n      0,   0,  70,   2,  16, 128, \n     65,   0,   0,   0,  22,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     23,   0,   0,   0,  70,   2, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16,   0,  21,   0, \n      0,   0,  70,   2,  16,   0, \n     23,   0,   0,   0, 140,   0, \n      0,  17, 114,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n      5,   0,   0,   0,  70,   2, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  23,   0,   0,   0, \n      2,  64,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 114,   0,  16,   0, \n      5,   0,   0,   0,  70,   2, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  56,   0,   0,  10, \n     50,   0,  16,   0,   5,   0, \n      0,   0, 150,   5,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0, 171, 170, 170,  62, \n    171, 170, 170,  62,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5, 130,   0, \n     16,   0,  17,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0,  54,   0,   0,   5, \n    130,   0,  16,   0,  15,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,  54,   0, \n      0,   5, 130,   0,  16,   0, \n     18,   0,   0,   0,  10,   0, \n     16,   0,   5,   0,   0,   0, \n     54,   0,   0,   5, 130,   0, \n     16,   0,  16,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n    150,   3,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  54,   0, \n      0,   5,  82,   0,  16,   0, \n     19,   0,   0,   0,   6,   1, \n     16,   0,   5,   0,   0,   0, \n     54,   0,   0,   5, 162,   0, \n     16,   0,  19,   0,   0,   0, \n     86,   9,  16,   0,  16,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,  19,   0, \n      0,   0,  70,  14,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  19,   0,   0,   0, \n     70,  14,  16,   0,  19,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  19,   0, \n      0,   0,  70,  14,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10,  50,   0, \n     16,   0,  17,   0,   0,   0, \n     70,   0,  16,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0,   0,   0, \n      0,   0,   0,   0,  52,   0, \n      0,  10,  50,   0,  16,   0, \n     15,   0,   0,   0, 230,  10, \n     16,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     98,   0,  16,   0,  16,   0, \n      0,   0, 166,  11,  16,   0, \n      5,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0, 214,   2, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n     50,   0,  16,   0,  18,   0, \n      0,   0,  70,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     52,   0,   0,  10,  50,   0, \n     16,   0,  16,   0,   0,   0, \n    230,  10,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     17,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      6,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0, 150,   3, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 131,   0,   0,   5, \n     18,   0,  16,   0,  17,   0, \n      0,   0,  26,   0,  16,   0, \n     16,   0,   0,   0, 131,   0, \n      0,   5,  34,   0,  16,   0, \n     17,   0,   0,   0,  10,   0, \n     16,   0,   5,   0,   0,   0, \n    131,   0,   0,   5,  18,   0, \n     16,   0,  15,   0,   0,   0, \n     42,   0,  16,   0,  16,   0, \n      0,   0, 131,   0,   0,   5, \n     34,   0,  16,   0,  15,   0, \n      0,   0,  26,   0,  16,   0, \n      5,   0,   0,   0, 131,   0, \n      0,   5,  18,   0,  16,   0, \n     18,   0,   0,   0,  58,   0, \n     16,   0,  16,   0,   0,   0, \n    131,   0,   0,   5,  34,   0, \n     16,   0,  18,   0,   0,   0, \n     42,   0,  16,   0,   5,   0, \n      0,   0, 131,   0,   0,   5, \n     18,   0,  16,   0,  16,   0, \n      0,   0,  10,   0,  16,   0, \n     16,   0,   0,   0, 131,   0, \n      0,   5,  34,   0,  16,   0, \n     16,   0,   0,   0,  58,   0, \n     16,   0,   5,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  17,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     18,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   1, \n     10,   0,   0,   1,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     17,   0,   0,   0,  26,   0, \n     16,   0,  16,   0,   0,   0, \n     54,   0,   0,   8, 226,   0, \n     16,   0,  17,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  15,   0, \n      0,   0,  42,   0,  16,   0, \n     16,   0,   0,   0,  54,   0, \n      0,   8, 226,   0,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  18,   0,   0,   0, \n     58,   0,  16,   0,  16,   0, \n      0,   0,  54,   0,   0,   8, \n    226,   0,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 226,   0,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,  23,   0, \n      0,   1,  21,   0,   0,   1, \n      0,   0,   0,   7, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     17,   0,   0,   0,   0,   0, \n      0,   7, 242,   0,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   0,   0,   0,   7, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     14,   0,   0,   0,  70,  14, \n     16,   0,  18,   0,   0,   0, \n      0,   0,   0,   7, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     16,   0,   0,   0,  18,   0, \n      0,   1,  54,   0,   0,   5, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,  21,   0, \n      0,   1,  21,   0,   0,   1, \n     56,   0,   0,   7, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,  56,   0, \n      0,   7, 242,   0,  16,   0, \n      7,   0,   0,   0,  86,   5, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  56,   0,   0,   7, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  86,   5,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     56,   0,   0,   7, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      1,   0,   0,   0,  54,   0, \n      0,   5,  82,   0,  16,   0, \n      5,   0,   0,   0, 166,   8, \n     16,   0,   5,   0,   0,   0, \n     54,   0,   0,   5,  82,   0, \n     16,   0,   7,   0,   0,   0, \n    166,   8,  16,   0,   7,   0, \n      0,   0,  54,   0,   0,   5, \n     82,   0,  16,   0,   9,   0, \n      0,   0, 166,   8,  16,   0, \n      9,   0,   0,   0,  54,   0, \n      0,   5,  82,   0,  16,   0, \n      8,   0,   0,   0, 166,   8, \n     16,   0,   8,   0,   0,   0, \n     21,   0,   0,   1,  76,   0, \n      0,   3,  10,   0,  16,   0, \n      6,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      3,   0,   0,   0,  54,  32, \n      0,   5, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     50,   0,   0,  15, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 248,  65,   0,   0, \n    248,  65,   0,   0, 248,  65, \n      0,   0, 128,  63,   2,  64, \n      0,   0,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,  63,   0,   0,   0,  63, \n     28,   0,   0,   5, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      6,   0,   0,   0,   1,  64, \n      0,   0,  32,   0,   0,   0, \n     10,   0,  16,   0,   6,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      6,   0,   0,   0,   1,  64, \n      0,   0,   0,   4,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      6,   0,   0,   0,   1,  64, \n      0,   0,   0, 128,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  54,  32,   0,   5, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,  50,   0, \n      0,  15, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    248,  65,   0,   0, 248,  65, \n      0,   0, 248,  65,   0,   0, \n    128,  63,   2,  64,   0,   0, \n      0,   0,   0,  63,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,  28,   0, \n      0,   5, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     35,   0,   0,   9,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n     32,   0,   0,   0,  10,   0, \n     16,   0,   6,   0,   0,   0, \n     35,   0,   0,   9,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   4,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     41,   0,   0,   7,  66,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n     31,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      1,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  54,  32,   0,   5, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,  50,   0, \n      0,  15, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    248,  65,   0,   0, 248,  65, \n      0,   0, 248,  65,   0,   0, \n    128,  63,   2,  64,   0,   0, \n      0,   0,   0,  63,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,  28,   0, \n      0,   5, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n     32,   0,   0,   0,  10,   0, \n     16,   0,   6,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   4,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n      0, 128,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     54,  32,   0,   5, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,  50,   0,   0,  15, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 248,  65, \n      0,   0, 248,  65,   0,   0, \n    248,  65,   0,   0, 128,  63, \n      2,  64,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,  63,  28,   0,   0,   5, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   6,   0,   0,   0, \n      1,  64,   0,   0,  32,   0, \n      0,   0,  10,   0,  16,   0, \n      6,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   6,   0,   0,   0, \n      1,  64,   0,   0,   0,   4, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  41,   0, \n      0,   7,  66,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   6,   0,   0,   0, \n      1,  64,   0,   0,  31,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   1,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  30,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      4,   0,   0,   0,  54,  32, \n      0,   5, 114,   0,  16,   0, \n      5,   0,   0,   0,  70,   2, \n     16,   0,   5,   0,   0,   0, \n     50,   0,   0,  15, 114,   0, \n     16,   0,   6,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 248,  65,   0,   0, \n    124,  66,   0,   0, 248,  65, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,  63,   0,   0,   0,   0, \n     28,   0,   0,   5, 114,   0, \n     16,   0,   6,   0,   0,   0, \n     70,   2,  16,   0,   6,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      6,   0,   0,   0,   1,  64, \n      0,   0,  32,   0,   0,   0, \n     10,   0,  16,   0,   6,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      6,   0,   0,   0,   1,  64, \n      0,   0,   0,   8,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  54,  32,   0,   5, \n    114,   0,  16,   0,   7,   0, \n      0,   0,  70,   2,  16,   0, \n      7,   0,   0,   0,  50,   0, \n      0,  15, 114,   0,  16,   0, \n      6,   0,   0,   0,  70,   2, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    248,  65,   0,   0, 124,  66, \n      0,   0, 248,  65,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,  63,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,   0,  28,   0, \n      0,   5, 114,   0,  16,   0, \n      6,   0,   0,   0,  70,   2, \n     16,   0,   6,   0,   0,   0, \n     35,   0,   0,   9,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n     32,   0,   0,   0,  10,   0, \n     16,   0,   6,   0,   0,   0, \n     41,   0,   0,   7,  66,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n     27,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      1,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  54,  32,   0,   5, \n    114,   0,  16,   0,   9,   0, \n      0,   0,  70,   2,  16,   0, \n      9,   0,   0,   0,  50,   0, \n      0,  15, 114,   0,  16,   0, \n      6,   0,   0,   0,  70,   2, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    248,  65,   0,   0, 124,  66, \n      0,   0, 248,  65,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,  63,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,   0,  28,   0, \n      0,   5, 114,   0,  16,   0, \n      6,   0,   0,   0,  70,   2, \n     16,   0,   6,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n     32,   0,   0,   0,  10,   0, \n     16,   0,   6,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   8,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     54,  32,   0,   5, 114,   0, \n     16,   0,   8,   0,   0,   0, \n     70,   2,  16,   0,   8,   0, \n      0,   0,  50,   0,   0,  15, \n    114,   0,  16,   0,   6,   0, \n      0,   0,  70,   2,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 248,  65, \n      0,   0, 124,  66,   0,   0, \n    248,  65,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,   0,  28,   0,   0,   5, \n    114,   0,  16,   0,   6,   0, \n      0,   0,  70,   2,  16,   0, \n      6,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   6,   0,   0,   0, \n      1,  64,   0,   0,  32,   0, \n      0,   0,  10,   0,  16,   0, \n      6,   0,   0,   0,  41,   0, \n      0,   7,  66,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   6,   0,   0,   0, \n      1,  64,   0,   0,  27,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   1,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  30,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      5,   0,   0,   0,  54,  32, \n      0,   5, 114,   0,  16,   0, \n      5,   0,   0,   0,  70,   2, \n     16,   0,   5,   0,   0,   0, \n     50,   0,   0,  15, 114,   0, \n     16,   0,   6,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 248,  65,   0,   0, \n    248,  65,   0,   0, 124,  66, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,  63,   0,   0,   0,   0, \n     28,   0,   0,   5, 114,   0, \n     16,   0,   6,   0,   0,   0, \n     70,   2,  16,   0,   6,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      6,   0,   0,   0,   1,  64, \n      0,   0,  32,   0,   0,   0, \n     10,   0,  16,   0,   6,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      6,   0,   0,   0,   1,  64, \n      0,   0,   0,   4,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  54,  32,   0,   5, \n    114,   0,  16,   0,   7,   0, \n      0,   0,  70,   2,  16,   0, \n      7,   0,   0,   0,  50,   0, \n      0,  15, 114,   0,  16,   0, \n      6,   0,   0,   0,  70,   2, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    248,  65,   0,   0, 248,  65, \n      0,   0, 124,  66,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,  63,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,   0,  28,   0, \n      0,   5, 114,   0,  16,   0, \n      6,   0,   0,   0,  70,   2, \n     16,   0,   6,   0,   0,   0, \n     35,   0,   0,   9,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n     32,   0,   0,   0,  10,   0, \n     16,   0,   6,   0,   0,   0, \n     41,   0,   0,   7,  66,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n     26,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      1,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  54,  32,   0,   5, \n    114,   0,  16,   0,   9,   0, \n      0,   0,  70,   2,  16,   0, \n      9,   0,   0,   0,  50,   0, \n      0,  15, 114,   0,  16,   0, \n      6,   0,   0,   0,  70,   2, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    248,  65,   0,   0, 248,  65, \n      0,   0, 124,  66,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,  63,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,   0,  28,   0, \n      0,   5, 114,   0,  16,   0, \n      6,   0,   0,   0,  70,   2, \n     16,   0,   6,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n     32,   0,   0,   0,  10,   0, \n     16,   0,   6,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   4,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     54,  32,   0,   5, 114,   0, \n     16,   0,   8,   0,   0,   0, \n     70,   2,  16,   0,   8,   0, \n      0,   0,  50,   0,   0,  15, \n    114,   0,  16,   0,   6,   0, \n      0,   0,  70,   2,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 248,  65, \n      0,   0, 248,  65,   0,   0, \n    124,  66,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,   0,  28,   0,   0,   5, \n    114,   0,  16,   0,   6,   0, \n      0,   0,  70,   2,  16,   0, \n      6,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   6,   0,   0,   0, \n      1,  64,   0,   0,  32,   0, \n      0,   0,  10,   0,  16,   0, \n      6,   0,   0,   0,  41,   0, \n      0,   7,  66,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   6,   0,   0,   0, \n      1,  64,   0,   0,  26,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   1,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  30,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n     10,   0,   0,   0,  54,  32, \n      0,   5,  50,   0,  16,   0, \n      5,   0,   0,   0,  70,   0, \n     16,   0,   5,   0,   0,   0, \n     54,  32,   0,   5, 194,   0, \n     16,   0,   5,   0,   0,   0, \n      6,   4,  16,   0,   7,   0, \n      0,   0,  50,   0,   0,  15, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 127,  67, \n      0,   0, 127,  67,   0,   0, \n    127,  67,   0,   0, 127,  67, \n      2,  64,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,  63,  28,   0,   0,   5, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   6,   0,   0,   0, \n      1,  64,   0,   0,   0,   1, \n      0,   0,  10,   0,  16,   0, \n      6,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   6,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      1,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   6,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   1,  26,   0,  16,   0, \n      1,   0,   0,   0,  54,  32, \n      0,   5,  50,   0,  16,   0, \n      9,   0,   0,   0,  70,   0, \n     16,   0,   9,   0,   0,   0, \n     54,  32,   0,   5, 194,   0, \n     16,   0,   9,   0,   0,   0, \n      6,   4,  16,   0,   8,   0, \n      0,   0,  50,   0,   0,  15, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 127,  67, \n      0,   0, 127,  67,   0,   0, \n    127,  67,   0,   0, 127,  67, \n      2,  64,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,  63,  28,   0,   0,   5, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   6,   0,   0,   0, \n      1,  64,   0,   0,   0,   1, \n      0,   0,  10,   0,  16,   0, \n      6,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   6,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      1,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   6,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   1,  26,   0,  16,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,  15,   0, \n      0,   0,  54,  32,   0,   5, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  50,   0, \n      0,  15, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    112,  65,   0,   0, 112,  65, \n      0,   0, 112,  65,   0,   0, \n    112,  65,   2,  64,   0,   0, \n      0,   0,   0,  63,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,  28,   0, \n      0,   5, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0,  10,   0, \n     16,   0,   6,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   1,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n      0,  16,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     54,  32,   0,   5, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  50,   0,   0,  15, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 112,  65, \n      0,   0, 112,  65,   0,   0, \n    112,  65,   0,   0, 112,  65, \n      2,  64,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,  63,  28,   0,   0,   5, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   6,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0,  10,   0,  16,   0, \n      6,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   6,   0,   0,   0, \n      1,  64,   0,   0,   0,   1, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  41,   0, \n      0,   7,  66,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   6,   0,   0,   0, \n      1,  64,   0,   0,  28,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   1,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     54,  32,   0,   5, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,  50,   0,   0,  15, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 112,  65, \n      0,   0, 112,  65,   0,   0, \n    112,  65,   0,   0, 112,  65, \n      2,  64,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,  63,  28,   0,   0,   5, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   6,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0,  10,   0,  16,   0, \n      6,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   6,   0,   0,   0, \n      1,  64,   0,   0,   0,   1, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   6,   0,   0,   0, \n      1,  64,   0,   0,   0,  16, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  54,  32, \n      0,   5, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n     50,   0,   0,  15, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 112,  65,   0,   0, \n    112,  65,   0,   0, 112,  65, \n      0,   0, 112,  65,   2,  64, \n      0,   0,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,  63,   0,   0,   0,  63, \n     28,   0,   0,   5, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      6,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n     10,   0,  16,   0,   6,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      6,   0,   0,   0,   1,  64, \n      0,   0,   0,   1,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  41,   0,   0,   7, \n     66,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      6,   0,   0,   0,   1,  64, \n      0,   0,  28,   0,   0,   0, \n     35,   0,   0,   9,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   1,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     30,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,  24,   0, \n      0,   0,  54,  32,   0,   5, \n     66,   0,  16,   0,   8,   0, \n      0,   0,  10,   0,  16,   0, \n      5,   0,   0,   0,  54,  32, \n      0,   5,  34,   0,  16,   0, \n      8,   0,   0,   0,  10,   0, \n     16,   0,   7,   0,   0,   0, \n     54,  32,   0,   5, 130,   0, \n     16,   0,   8,   0,   0,   0, \n     10,   0,  16,   0,   9,   0, \n      0,   0,  54,  32,   0,   5, \n     18,   0,  16,   0,   8,   0, \n      0,   0,  10,   0,  16,   0, \n      8,   0,   0,   0,  50,   0, \n      0,  15, 242,   0,  16,   0, \n      6,   0,   0,   0, 102,   3, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n    127,  71,   0, 255, 127,  71, \n      0, 255, 127,  71,   0, 255, \n    127,  71,   2,  64,   0,   0, \n      0,   0,   0,  63,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,  28,   0, \n      0,   5, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     35,   0,   0,  12,  50,   0, \n     16,   0,   0,   0,   0,   0, \n    214,   5,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 134,   0, \n     16,   0,   6,   0,   0,   0, \n      2,   0,   0,   1,  10,   0, \n      0,   1, 130,   0,   0,   5, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      5,   0,   0,   0, 130,   0, \n      0,   5,  66,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   7,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   1,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n    130,   0,   0,   5,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   9,   0, \n      0,   0, 130,   0,   0,   5, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      8,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      1,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   1,  23,   0,   0,   1, \n     32,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  39,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   7, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     80,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      1,   0,   0,   0,  80,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  85,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n    140,   0,   0,  11,  18,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     85,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  54,   0, \n      0,   4,  66,   0,  16,   0, \n      4,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,   9, \n     50,   0,  16,   0,   1,   0, \n      0,   0, 134,   0,  16,   0, \n      3,   0,   0,   0,  22,   5, \n     16,   0,   2,   0,   0,   0, \n     38,  10,  16,   0,   4,   0, \n      0,   0,  85,   0,   0,  10, \n    194,   0,  16,   0,   2,   0, \n      0,   0,  86,   1,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n     78,   0,   0,   8, 242,   0, \n     16,   0,   4,   0,   0,   0, \n      0, 208,   0,   0, 182,  15, \n     16,   0,   2,   0,   0,   0, \n     22,   5,  16,   0,   2,   0, \n      0,   0,  35,   0,   0,  10, \n    194,   0,  16,   0,   2,   0, \n      0,   0,   6,   4,  16, 128, \n     65,   0,   0,   0,   2,   0, \n      0,   0,  86,  13,  16,   0, \n      4,   0,   0,   0, 166,  14, \n     16,   0,   2,   0,   0,   0, \n     41,   0,   0,  10,  82,   0, \n     16,   0,   3,   0,   0,   0, \n    246,  13,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  20,  50,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  18,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  25,   0, \n      0,   0,   1,  64,   0,   0, \n      7,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     31,   0,   4,   3,  58,   0, \n     16,   0,   0,   0,   0,   0, \n    138,   0,   0,  11, 130,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     10,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  42,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0, 139,   0,   0,  15, \n    114,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n     28,   0,   0,   0,  27,   0, \n      0,   0,  29,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n    118,  15,  16,   0,   4,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   5,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0, 140,   0,   0,  11, \n    130,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   5,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  42,   0, \n      0,  10, 194,   0,  16,   0, \n      2,   0,   0,   0,   6,   8, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   3,   0, \n      0,   0, 140,   0,   0,  11, \n     66,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0, 140,   0,   0,  11, \n    130,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     25,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  87,   0, \n      0,   7,  34,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   5,   0, \n      0,   0,   1,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n    140,   0,   0,  20, 194,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     11,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     41,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  30,   0, \n      0,   7,  34,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0, 139,   0,   0,  15, \n    194,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  27,   0,   0,   0, \n     24,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   4,   0, \n      0,   0,   7,   0,   0,   0, \n    246,  15,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n    130,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11, 130,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     18,   0,   0,   1, 139,   0, \n      0,  15, 242,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,  27,   0,   0,   0, \n     27,   0,   0,   0,  28,   0, \n      0,   0,  29,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      4,   0,   0,   0,  42,   0, \n      0,  10, 194,   0,  16,   0, \n      1,   0,   0,   0,   6,   8, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   3,   0, \n      0,   0, 140,   0,   0,  11, \n     66,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  26,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  20, 194,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  11,   0, \n      0,   0, 246,  11,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  30,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    139,   0,   0,  15, 162,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  27,   0,   0,   0, \n      0,   0,   0,   0,  24,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n      7,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n    130,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  21,   0, \n      0,   1,  38,   0,   0,   8, \n      0, 208,   0,   0,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  35,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  32,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  31,   0,   4,   3, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     85,   0,   0,  10, 194,   0, \n     16,   0,   1,   0,   0,   0, \n      6,   4,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n    255,   0, 255,   0, 255,   0, \n    255,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   0,   0, \n      0,   0, 230,  10,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n     21,   0,   0,   1, 166,   0, \n      0,   8,  50, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  83,  84, \n     65,  84, 148,   0,   0,   0, \n     31,   5,   0,   0,  24,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0, 133,   0, \n      0,   0,  33,   1,   0,   0, \n    173,   0,   0,   0,  62,   0, \n      0,   0,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     44,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 196,   0, \n      0,   0,  64,   0,   0,   0, \n     83,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/resolve_full_32bpp_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_resolve_edram_info;        // Offset:    0 Size:     4\n//   uint xe_resolve_coordinate_info;   // Offset:    4 Size:     4\n//   uint xe_resolve_dest_info;         // Offset:    8 Size:     4\n//   uint xe_resolve_dest_coordinate_info;// Offset:   12 Size:     4\n//   uint xe_resolve_dest_base;         // Offset:   16 Size:     4\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_resolve_edram                  texture    byte         r/o      T0             t0      1 \n// xe_resolve_dest                       UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][2], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xy\ndcl_temps 24\ndcl_thread_group 8, 8, 1\nand r0.xyzw, CB0[0][0].xzzz, l(1023, 7, 8, 0x01000000)\nand r1.x, CB0[0][0].w, l(1023)\nushr r2.xyz, CB0[0][0].yywy, l(4, 5, 10, 0)\nushr r3.xyzw, CB0[0][0].wwww, l(24, 20, 24, 24)\nishl r4.y, vThreadID.x, l(2)\nbfi r1.y, l(11), l(3), r2.y, l(0)\nuge r1.y, r4.y, r1.y\nif_nz r1.y\n  ret \nendif \nubfe r5.xyzw, l(2, 11, 4, 1), l(10, 13, 24, 28), CB0[0][0].xxxx\nmov r2.w, CB0[0][0].y\nbfi r1.yz, l(0, 4, 1, 0), l(0, 3, 3, 0), r2.wwxw, l(0, 0, 0, 0)\nibfe r1.w, l(6), l(16), CB0[0][0].z\nishl r1.w, r1.w, l(23)\niadd r1.w, r1.w, l(0x3f800000)\nbfi r3.xyzw, l(4, 4, 4, 4), l(3, 3, 3, 3), r3.xyzw, l(0, 0, 0, 0)\nubfe r2.xy, l(6, 3, 0, 0), l(7, 28, 0, 0), CB0[0][0].zwzz\nmov r4.xzw, vThreadID.yyyy\niadd r1.yz, r1.yyzy, r4.yywy\nuge r2.w, l(3), r2.y\nif_nz r2.w\n  mov r6.y, r2.y\nelse \n  ieq r2.w, r2.y, l(5)\n  if_nz r2.w\n    mov r6.y, l(2)\n  else \n    mov r6.y, l(0)\n  endif \nendif \nuge r6.zw, r5.xxxx, l(0, 0, 2, 1)\nand r6.zw, r6.zzzw, l(0, 0, 1, 1)\nishl r1.yz, r1.yyzy, r6.zzwz\nushr r6.x, r6.y, l(1)\nand r6.xy, r6.xyxx, l(1, 1, 0, 0)\niadd r1.yz, r1.yyzy, r6.xxyx\nushr r6.x, l(80), r5.w\nmov r6.y, l(16)\nudiv r7.xy, null, r1.yzyy, r6.xyxx\nimad r0.x, r7.y, r0.x, r7.x\niadd r0.x, r0.x, r5.y\nimad r1.yz, -r7.xxyx, r6.xxyx, r1.yyzy\nimad r1.y, r1.z, r6.x, r1.y\nishl r1.y, r1.y, r5.w\nimad r0.x, r0.x, l(1280), r1.y\nudiv null, r0.x, r0.x, l(0x00280000)\nishl r0.x, r0.x, l(2)\niadd r1.y, r5.w, r6.z\nishl r1.z, l(4), r1.y\nif_nz r5.w\n  ieq r2.w, r1.z, l(8)\n  if_nz r2.w\n    ld_raw r6.xyzw, r0.x, T0[0].zwxy\n    iadd r2.w, r0.x, l(16)\n    ld_raw r7.xyzw, r2.w, T0[0].zwxy\n    mov r8.xy, r6.zwzz\n    mov r9.xy, r7.zwzz\n  else \n    ld_raw r8.xy, r0.x, T0[0].xyxx\n    iadd r2.w, r0.x, r1.z\n    ld_raw r6.xy, r2.w, T0[0].xyxx\n    ishl r5.xy, l(8, 12, 0, 0), r1.yyyy\n    iadd r5.xy, r0.xxxx, r5.xyxx\n    ld_raw r9.xy, r5.x, T0[0].xyxx\n    ld_raw r7.xy, r5.y, T0[0].xyxx\n  endif \n  switch r5.z\n    case l(5)\n    ishl r8.zw, r8.xxxy, l(0, 0, 16, 16)\n    ishr r10.xyzw, r8.zxwy, l(16, 16, 16, 16)\n    itof r10.xyzw, r10.xyzw\n    mul r10.xyzw, r10.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n    max r8.xyzw, r10.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n    ishl r6.zw, r6.xxxy, l(0, 0, 16, 16)\n    ishr r10.xyzw, r6.zxwy, l(16, 16, 16, 16)\n    itof r10.xyzw, r10.xyzw\n    mul r10.xyzw, r10.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n    max r6.xyzw, r10.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n    ishl r9.zw, r9.xxxy, l(0, 0, 16, 16)\n    ishr r10.xyzw, r9.zxwy, l(16, 16, 16, 16)\n    itof r10.xyzw, r10.xyzw\n    mul r10.xyzw, r10.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n    max r9.xyzw, r10.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n    ishl r7.zw, r7.xxxy, l(0, 0, 16, 16)\n    ishr r10.xyzw, r7.zxwy, l(16, 16, 16, 16)\n    itof r10.xyzw, r10.xyzw\n    mul r10.xyzw, r10.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n    max r7.xyzw, r10.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n    break \n    case l(7)\n    ushr r5.xy, r8.xyxx, l(16, 16, 0, 0)\n    f16tof32 r8.xz, r8.xxyx\n    f16tof32 r8.yw, r5.xxxy\n    ushr r5.xy, r6.xyxx, l(16, 16, 0, 0)\n    f16tof32 r6.xz, r6.xxyx\n    f16tof32 r6.yw, r5.xxxy\n    ushr r5.xy, r9.xyxx, l(16, 16, 0, 0)\n    f16tof32 r9.xz, r9.xxyx\n    f16tof32 r9.yw, r5.xxxy\n    ushr r5.xy, r7.xyxx, l(16, 16, 0, 0)\n    f16tof32 r7.xz, r7.xxyx\n    f16tof32 r7.yw, r5.xxxy\n    break \n    default \n    mov r8.zw, l(0,0,0,0)\n    mov r6.zw, l(0,0,0,0)\n    mov r9.zw, l(0,0,0,0)\n    mov r7.zw, l(0,0,0,0)\n    break \n  endswitch \nelse \n  ieq r2.w, r1.z, l(4)\n  if_nz r2.w\n    ld_raw r7.xyzw, r0.x, T0[0].wxyz\n  else \n    ld_raw r7.y, r0.x, T0[0].xxxx\n    iadd r2.w, r0.x, r1.z\n    ld_raw r7.z, r2.w, T0[0].xxxx\n    ishl r5.xy, l(8, 12, 0, 0), r1.yyyy\n    iadd r5.xy, r0.xxxx, r5.xyxx\n    ld_raw r7.w, r5.x, T0[0].xxxx\n    ld_raw r7.x, r5.y, T0[0].xxxx\n  endif \n  switch r5.z\n    case l(0)\n    case l(1)\n    ushr r10.yzw, r7.yyyy, l(0, 8, 16, 24)\n    mov r10.x, r7.y\n    and r10.xyzw, r10.xyzw, l(255, 255, 255, 255)\n    utof r10.xyzw, r10.xyzw\n    mul r8.xyzw, r10.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n    ushr r10.yzw, r7.zzzz, l(0, 8, 16, 24)\n    mov r10.x, r7.z\n    and r10.xyzw, r10.xyzw, l(255, 255, 255, 255)\n    utof r10.xyzw, r10.xyzw\n    mul r6.xyzw, r10.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n    ushr r10.yzw, r7.wwww, l(0, 8, 16, 24)\n    mov r10.x, r7.w\n    and r10.xyzw, r10.xyzw, l(255, 255, 255, 255)\n    utof r10.xyzw, r10.xyzw\n    mul r9.xyzw, r10.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n    ushr r7.yzw, r7.xxxx, l(0, 8, 16, 24)\n    and r10.xyzw, r7.xyzw, l(255, 255, 255, 255)\n    utof r10.xyzw, r10.xyzw\n    mul r7.xyzw, r10.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n    break \n    case l(2)\n    case l(10)\n    ushr r10.yzw, r7.yyyy, l(0, 10, 20, 30)\n    mov r10.x, r7.y\n    and r10.xyzw, r10.xyzw, l(1023, 1023, 1023, 3)\n    utof r10.xyzw, r10.xyzw\n    mul r8.xyzw, r10.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n    ushr r10.yzw, r7.zzzz, l(0, 10, 20, 30)\n    mov r10.x, r7.z\n    and r10.xyzw, r10.xyzw, l(1023, 1023, 1023, 3)\n    utof r10.xyzw, r10.xyzw\n    mul r6.xyzw, r10.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n    ushr r10.yzw, r7.wwww, l(0, 10, 20, 30)\n    mov r10.x, r7.w\n    and r10.xyzw, r10.xyzw, l(1023, 1023, 1023, 3)\n    utof r10.xyzw, r10.xyzw\n    mul r9.xyzw, r10.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n    ushr r7.yzw, r7.xxxx, l(0, 10, 20, 30)\n    and r10.xyzw, r7.xyzw, l(1023, 1023, 1023, 3)\n    utof r10.xyzw, r10.xyzw\n    mul r7.xyzw, r10.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n    break \n    case l(3)\n    case l(12)\n    ushr r10.xyzw, r7.yyyz, l(10, 20, 30, 30)\n    mov r11.x, r7.y\n    mov r11.yz, r10.xxyx\n    and r12.xyz, r11.xyzx, l(1023, 1023, 1023, 0)\n    and r13.xyz, r11.xyzx, l(127, 127, 127, 0)\n    ubfe r14.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r11.xyzx\n    firstbit_hi r15.xyz, r13.xyzx\n    iadd r15.xyz, r15.xyzx, l(-24, -24, -24, 0)\n    movc r15.xyz, r13.xyzx, r15.xyzx, l(8,8,8,0)\n    iadd r16.xyz, -r15.xyzx, l(1, 1, 1, 0)\n    movc r16.xyz, r14.xyzx, r14.xyzx, r16.xyzx\n    bfi r11.xyz, l(7, 7, 7, 0), r15.xyzx, r11.xyzx, l(0, 0, 0, 0)\n    and r11.xyz, r11.xyzx, l(127, 127, 127, 0)\n    movc r11.xyz, r14.xyzx, r13.xyzx, r11.xyzx\n    ishl r13.xyz, r16.xyzx, l(23, 23, 23, 0)\n    iadd r13.xyz, r13.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n    ishl r11.xyz, r11.xyzx, l(16, 16, 16, 0)\n    iadd r11.xyz, r13.xyzx, r11.xyzx\n    movc r8.xyz, r12.xyzx, r11.xyzx, l(0,0,0,0)\n    utof r5.xy, r10.zwzz\n    ushr r10.xyzw, r7.zwwz, l(10, 10, 20, 20)\n    mov r11.x, r7.z\n    mov r11.yz, r10.xxwx\n    and r12.xyz, r11.xyzx, l(1023, 1023, 1023, 0)\n    and r13.xyz, r11.xyzx, l(127, 127, 127, 0)\n    ubfe r14.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r11.xyzx\n    firstbit_hi r15.xyz, r13.xyzx\n    iadd r15.xyz, r15.xyzx, l(-24, -24, -24, 0)\n    movc r15.xyz, r13.xyzx, r15.xyzx, l(8,8,8,0)\n    iadd r16.xyz, -r15.xyzx, l(1, 1, 1, 0)\n    movc r16.xyz, r14.xyzx, r14.xyzx, r16.xyzx\n    bfi r11.xyz, l(7, 7, 7, 0), r15.xyzx, r11.xyzx, l(0, 0, 0, 0)\n    and r11.xyz, r11.xyzx, l(127, 127, 127, 0)\n    movc r11.xyz, r14.xyzx, r13.xyzx, r11.xyzx\n    ishl r13.xyz, r16.xyzx, l(23, 23, 23, 0)\n    iadd r13.xyz, r13.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n    ishl r11.xyz, r11.xyzx, l(16, 16, 16, 0)\n    iadd r11.xyz, r13.xyzx, r11.xyzx\n    movc r6.xyz, r12.xyzx, r11.xyzx, l(0,0,0,0)\n    mul r5.xy, r5.xyxx, l(0.333333, 0.333333, 0.000000, 0.000000)\n    mov r10.x, r7.w\n    and r11.xyz, r10.xyzx, l(1023, 1023, 1023, 0)\n    and r12.xyz, r10.xyzx, l(127, 127, 127, 0)\n    ubfe r13.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r10.xyzx\n    firstbit_hi r14.xyz, r12.xyzx\n    iadd r14.xyz, r14.xyzx, l(-24, -24, -24, 0)\n    movc r14.xyz, r12.xyzx, r14.xyzx, l(8,8,8,0)\n    iadd r15.xyz, -r14.xyzx, l(1, 1, 1, 0)\n    movc r15.xyz, r13.xyzx, r13.xyzx, r15.xyzx\n    bfi r10.xyz, l(7, 7, 7, 0), r14.xyzx, r10.xyzx, l(0, 0, 0, 0)\n    and r10.xyz, r10.xyzx, l(127, 127, 127, 0)\n    movc r10.xyz, r13.xyzx, r12.xyzx, r10.xyzx\n    ishl r12.xyz, r15.xyzx, l(23, 23, 23, 0)\n    iadd r12.xyz, r12.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n    ishl r10.xyz, r10.xyzx, l(16, 16, 16, 0)\n    iadd r10.xyz, r12.xyzx, r10.xyzx\n    movc r9.xyz, r11.xyzx, r10.xyzx, l(0,0,0,0)\n    ushr r10.xyzw, r7.wxxx, l(30, 10, 20, 30)\n    utof r11.xy, r10.xwxx\n    mov r10.x, r7.x\n    and r12.xyz, r10.xyzx, l(1023, 1023, 1023, 0)\n    and r13.xyz, r10.xyzx, l(127, 127, 127, 0)\n    ubfe r14.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r10.xyzx\n    firstbit_hi r15.xyz, r13.xyzx\n    iadd r15.xyz, r15.xyzx, l(-24, -24, -24, 0)\n    movc r15.xyz, r13.xyzx, r15.xyzx, l(8,8,8,0)\n    iadd r16.xyz, -r15.xyzx, l(1, 1, 1, 0)\n    movc r16.xyz, r14.xyzx, r14.xyzx, r16.xyzx\n    bfi r10.xyz, l(7, 7, 7, 0), r15.xyzx, r10.xyzx, l(0, 0, 0, 0)\n    and r10.xyz, r10.xyzx, l(127, 127, 127, 0)\n    movc r10.xyz, r14.xyzx, r13.xyzx, r10.xyzx\n    ishl r13.xyz, r16.xyzx, l(23, 23, 23, 0)\n    iadd r13.xyz, r13.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n    ishl r10.xyz, r10.xyzx, l(16, 16, 16, 0)\n    iadd r10.xyz, r13.xyzx, r10.xyzx\n    movc r7.xyz, r12.xyzx, r10.xyzx, l(0,0,0,0)\n    mul r10.xy, r11.xyxx, l(0.333333, 0.333333, 0.000000, 0.000000)\n    mov r8.w, r5.x\n    mov r6.w, r5.y\n    mov r9.w, r10.x\n    mov r7.w, r10.y\n    break \n    case l(4)\n    ishl r10.xyzw, r7.yzwx, l(16, 16, 16, 16)\n    mov r11.xz, r10.xxyx\n    mov r11.yw, r7.yyyz\n    ishr r11.xyzw, r11.xyzw, l(16, 16, 16, 16)\n    itof r11.xyzw, r11.xyzw\n    mul r11.xyzw, r11.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n    max r8.xy, r11.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n    max r6.xy, r11.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n    mov r7.yz, r10.zzwz\n    ishr r10.xyzw, r7.ywzx, l(16, 16, 16, 16)\n    itof r10.xyzw, r10.xyzw\n    mul r10.xyzw, r10.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n    max r9.xy, r10.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n    max r7.xy, r10.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n    mov r8.zw, l(0,0,0,0)\n    mov r6.zw, l(0,0,0,0)\n    mov r9.zw, l(0,0,0,0)\n    mov r7.zw, l(0,0,0,0)\n    break \n    case l(6)\n    ushr r10.xyzw, r7.yzwx, l(16, 16, 16, 16)\n    f16tof32 r8.x, r7.y\n    f16tof32 r8.y, r10.x\n    f16tof32 r6.x, r7.z\n    f16tof32 r6.y, r10.y\n    f16tof32 r9.x, r7.w\n    f16tof32 r9.y, r10.z\n    f16tof32 r7.x, r7.x\n    f16tof32 r7.y, r10.w\n    mov r8.zw, l(0,0,0,0)\n    mov r6.zw, l(0,0,0,0)\n    mov r9.zw, l(0,0,0,0)\n    mov r7.zw, l(0,0,0,0)\n    break \n    default \n    mov r8.x, r7.y\n    mov r8.yzw, l(0,0,0,0)\n    mov r6.x, r7.z\n    mov r6.yzw, l(0,0,0,0)\n    mov r9.x, r7.w\n    mov r9.yzw, l(0,0,0,0)\n    mov r7.yzw, l(0,0,0,0)\n    break \n  endswitch \nendif \nuge r2.w, r2.y, l(4)\nif_nz r2.w\n  mul r2.w, r1.w, l(0.500000)\n  iadd r5.x, r0.x, l(320)\n  if_nz r5.w\n    ieq r5.y, r1.z, l(8)\n    if_nz r5.y\n      ld_raw r10.xyzw, r5.x, T0[0].zwxy\n      iadd r5.y, r0.x, l(336)\n      ld_raw r11.xyzw, r5.y, T0[0].zwxy\n      mov r12.xy, r10.zwzz\n      mov r14.xy, r11.zwzz\n    else \n      ld_raw r12.xy, r5.x, T0[0].xyxx\n      iadd r5.y, r1.z, r5.x\n      ld_raw r10.xy, r5.y, T0[0].xyxx\n      ishl r13.xy, l(8, 12, 0, 0), r1.yyyy\n      iadd r13.xy, r5.xxxx, r13.xyxx\n      ld_raw r14.xy, r13.x, T0[0].xyxx\n      ld_raw r11.xy, r13.y, T0[0].xyxx\n    endif \n    switch r5.z\n      case l(5)\n      ishl r12.zw, r12.xxxy, l(0, 0, 16, 16)\n      ishr r13.xyzw, r12.zxwy, l(16, 16, 16, 16)\n      itof r13.xyzw, r13.xyzw\n      mul r13.xyzw, r13.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n      max r12.xyzw, r13.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n      ishl r10.zw, r10.xxxy, l(0, 0, 16, 16)\n      ishr r13.xyzw, r10.zxwy, l(16, 16, 16, 16)\n      itof r13.xyzw, r13.xyzw\n      mul r13.xyzw, r13.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n      max r10.xyzw, r13.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n      ishl r14.zw, r14.xxxy, l(0, 0, 16, 16)\n      ishr r13.xyzw, r14.zxwy, l(16, 16, 16, 16)\n      itof r13.xyzw, r13.xyzw\n      mul r13.xyzw, r13.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n      max r14.xyzw, r13.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n      ishl r11.zw, r11.xxxy, l(0, 0, 16, 16)\n      ishr r13.xyzw, r11.zxwy, l(16, 16, 16, 16)\n      itof r13.xyzw, r13.xyzw\n      mul r13.xyzw, r13.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n      max r11.xyzw, r13.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n      break \n      case l(7)\n      ushr r13.xy, r12.xyxx, l(16, 16, 0, 0)\n      f16tof32 r12.xz, r12.xxyx\n      f16tof32 r12.yw, r13.xxxy\n      ushr r13.xy, r10.xyxx, l(16, 16, 0, 0)\n      f16tof32 r10.xz, r10.xxyx\n      f16tof32 r10.yw, r13.xxxy\n      ushr r13.xy, r14.xyxx, l(16, 16, 0, 0)\n      f16tof32 r14.xz, r14.xxyx\n      f16tof32 r14.yw, r13.xxxy\n      ushr r13.xy, r11.xyxx, l(16, 16, 0, 0)\n      f16tof32 r11.xz, r11.xxyx\n      f16tof32 r11.yw, r13.xxxy\n      break \n      default \n      mov r12.zw, l(0,0,0,0)\n      mov r10.zw, l(0,0,0,0)\n      mov r14.zw, l(0,0,0,0)\n      mov r11.zw, l(0,0,0,0)\n      break \n    endswitch \n  else \n    ieq r5.y, r1.z, l(4)\n    if_nz r5.y\n      ld_raw r11.xyzw, r5.x, T0[0].wxyz\n    else \n      ld_raw r11.y, r5.x, T0[0].xxxx\n      iadd r5.y, r1.z, r5.x\n      ld_raw r11.z, r5.y, T0[0].xxxx\n      ishl r13.xy, l(8, 12, 0, 0), r1.yyyy\n      iadd r13.xy, r5.xxxx, r13.xyxx\n      ld_raw r11.w, r13.x, T0[0].xxxx\n      ld_raw r11.x, r13.y, T0[0].xxxx\n    endif \n    switch r5.z\n      case l(0)\n      case l(1)\n      ushr r13.yzw, r11.yyyy, l(0, 8, 16, 24)\n      mov r13.x, r11.y\n      and r13.xyzw, r13.xyzw, l(255, 255, 255, 255)\n      utof r13.xyzw, r13.xyzw\n      mul r12.xyzw, r13.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n      ushr r13.yzw, r11.zzzz, l(0, 8, 16, 24)\n      mov r13.x, r11.z\n      and r13.xyzw, r13.xyzw, l(255, 255, 255, 255)\n      utof r13.xyzw, r13.xyzw\n      mul r10.xyzw, r13.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n      ushr r13.yzw, r11.wwww, l(0, 8, 16, 24)\n      mov r13.x, r11.w\n      and r13.xyzw, r13.xyzw, l(255, 255, 255, 255)\n      utof r13.xyzw, r13.xyzw\n      mul r14.xyzw, r13.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n      ushr r11.yzw, r11.xxxx, l(0, 8, 16, 24)\n      and r13.xyzw, r11.xyzw, l(255, 255, 255, 255)\n      utof r13.xyzw, r13.xyzw\n      mul r11.xyzw, r13.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n      break \n      case l(2)\n      case l(10)\n      ushr r13.yzw, r11.yyyy, l(0, 10, 20, 30)\n      mov r13.x, r11.y\n      and r13.xyzw, r13.xyzw, l(1023, 1023, 1023, 3)\n      utof r13.xyzw, r13.xyzw\n      mul r12.xyzw, r13.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n      ushr r13.yzw, r11.zzzz, l(0, 10, 20, 30)\n      mov r13.x, r11.z\n      and r13.xyzw, r13.xyzw, l(1023, 1023, 1023, 3)\n      utof r13.xyzw, r13.xyzw\n      mul r10.xyzw, r13.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n      ushr r13.yzw, r11.wwww, l(0, 10, 20, 30)\n      mov r13.x, r11.w\n      and r13.xyzw, r13.xyzw, l(1023, 1023, 1023, 3)\n      utof r13.xyzw, r13.xyzw\n      mul r14.xyzw, r13.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n      ushr r11.yzw, r11.xxxx, l(0, 10, 20, 30)\n      and r13.xyzw, r11.xyzw, l(1023, 1023, 1023, 3)\n      utof r13.xyzw, r13.xyzw\n      mul r11.xyzw, r13.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n      break \n      case l(3)\n      case l(12)\n      ushr r13.xyzw, r11.yyyz, l(10, 20, 30, 30)\n      mov r15.x, r11.y\n      mov r15.yz, r13.xxyx\n      and r16.xyz, r15.xyzx, l(1023, 1023, 1023, 0)\n      and r17.xyz, r15.xyzx, l(127, 127, 127, 0)\n      ubfe r18.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r15.xyzx\n      firstbit_hi r19.xyz, r17.xyzx\n      iadd r19.xyz, r19.xyzx, l(-24, -24, -24, 0)\n      movc r19.xyz, r17.xyzx, r19.xyzx, l(8,8,8,0)\n      iadd r20.xyz, -r19.xyzx, l(1, 1, 1, 0)\n      movc r20.xyz, r18.xyzx, r18.xyzx, r20.xyzx\n      bfi r15.xyz, l(7, 7, 7, 0), r19.xyzx, r15.xyzx, l(0, 0, 0, 0)\n      and r15.xyz, r15.xyzx, l(127, 127, 127, 0)\n      movc r15.xyz, r18.xyzx, r17.xyzx, r15.xyzx\n      ishl r17.xyz, r20.xyzx, l(23, 23, 23, 0)\n      iadd r17.xyz, r17.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n      ishl r15.xyz, r15.xyzx, l(16, 16, 16, 0)\n      iadd r15.xyz, r17.xyzx, r15.xyzx\n      movc r12.xyz, r16.xyzx, r15.xyzx, l(0,0,0,0)\n      utof r13.xy, r13.zwzz\n      ushr r15.xyzw, r11.zwwz, l(10, 10, 20, 20)\n      mov r16.x, r11.z\n      mov r16.yz, r15.xxwx\n      and r17.xyz, r16.xyzx, l(1023, 1023, 1023, 0)\n      and r18.xyz, r16.xyzx, l(127, 127, 127, 0)\n      ubfe r19.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r16.xyzx\n      firstbit_hi r20.xyz, r18.xyzx\n      iadd r20.xyz, r20.xyzx, l(-24, -24, -24, 0)\n      movc r20.xyz, r18.xyzx, r20.xyzx, l(8,8,8,0)\n      iadd r21.xyz, -r20.xyzx, l(1, 1, 1, 0)\n      movc r21.xyz, r19.xyzx, r19.xyzx, r21.xyzx\n      bfi r16.xyz, l(7, 7, 7, 0), r20.xyzx, r16.xyzx, l(0, 0, 0, 0)\n      and r16.xyz, r16.xyzx, l(127, 127, 127, 0)\n      movc r16.xyz, r19.xyzx, r18.xyzx, r16.xyzx\n      ishl r18.xyz, r21.xyzx, l(23, 23, 23, 0)\n      iadd r18.xyz, r18.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n      ishl r16.xyz, r16.xyzx, l(16, 16, 16, 0)\n      iadd r16.xyz, r18.xyzx, r16.xyzx\n      movc r10.xyz, r17.xyzx, r16.xyzx, l(0,0,0,0)\n      mov r15.x, r11.w\n      and r16.xyz, r15.xyzx, l(1023, 1023, 1023, 0)\n      and r17.xyz, r15.xyzx, l(127, 127, 127, 0)\n      ubfe r18.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r15.xyzx\n      firstbit_hi r19.xyz, r17.xyzx\n      iadd r19.xyz, r19.xyzx, l(-24, -24, -24, 0)\n      movc r19.xyz, r17.xyzx, r19.xyzx, l(8,8,8,0)\n      iadd r20.xyz, -r19.xyzx, l(1, 1, 1, 0)\n      movc r20.xyz, r18.xyzx, r18.xyzx, r20.xyzx\n      bfi r15.xyz, l(7, 7, 7, 0), r19.xyzx, r15.xyzx, l(0, 0, 0, 0)\n      and r15.xyz, r15.xyzx, l(127, 127, 127, 0)\n      movc r15.xyz, r18.xyzx, r17.xyzx, r15.xyzx\n      ishl r17.xyz, r20.xyzx, l(23, 23, 23, 0)\n      iadd r17.xyz, r17.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n      ishl r15.xyz, r15.xyzx, l(16, 16, 16, 0)\n      iadd r15.xyz, r17.xyzx, r15.xyzx\n      movc r14.xyz, r16.xyzx, r15.xyzx, l(0,0,0,0)\n      ushr r15.xyzw, r11.wxxx, l(30, 10, 20, 30)\n      utof r13.zw, r15.xxxw\n      mov r15.x, r11.x\n      and r16.xyz, r15.xyzx, l(1023, 1023, 1023, 0)\n      and r17.xyz, r15.xyzx, l(127, 127, 127, 0)\n      ubfe r18.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r15.xyzx\n      firstbit_hi r19.xyz, r17.xyzx\n      iadd r19.xyz, r19.xyzx, l(-24, -24, -24, 0)\n      movc r19.xyz, r17.xyzx, r19.xyzx, l(8,8,8,0)\n      iadd r20.xyz, -r19.xyzx, l(1, 1, 1, 0)\n      movc r20.xyz, r18.xyzx, r18.xyzx, r20.xyzx\n      bfi r15.xyz, l(7, 7, 7, 0), r19.xyzx, r15.xyzx, l(0, 0, 0, 0)\n      and r15.xyz, r15.xyzx, l(127, 127, 127, 0)\n      movc r15.xyz, r18.xyzx, r17.xyzx, r15.xyzx\n      ishl r17.xyz, r20.xyzx, l(23, 23, 23, 0)\n      iadd r17.xyz, r17.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n      ishl r15.xyz, r15.xyzx, l(16, 16, 16, 0)\n      iadd r15.xyz, r17.xyzx, r15.xyzx\n      movc r11.xyz, r16.xyzx, r15.xyzx, l(0,0,0,0)\n      mul r13.xyzw, r13.xyzw, l(0.333333, 0.333333, 0.333333, 0.333333)\n      mov r12.w, r13.x\n      mov r10.w, r13.y\n      mov r14.w, r13.z\n      mov r11.w, r13.w\n      break \n      case l(4)\n      ishl r13.xyzw, r11.yzwx, l(16, 16, 16, 16)\n      mov r15.xz, r13.xxyx\n      mov r15.yw, r11.yyyz\n      ishr r15.xyzw, r15.xyzw, l(16, 16, 16, 16)\n      itof r15.xyzw, r15.xyzw\n      mul r15.xyzw, r15.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n      max r12.xy, r15.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n      max r10.xy, r15.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n      mov r11.yz, r13.zzwz\n      ishr r13.xyzw, r11.ywzx, l(16, 16, 16, 16)\n      itof r13.xyzw, r13.xyzw\n      mul r13.xyzw, r13.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n      max r14.xy, r13.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n      max r11.xy, r13.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n      mov r12.zw, l(0,0,0,0)\n      mov r10.zw, l(0,0,0,0)\n      mov r14.zw, l(0,0,0,0)\n      mov r11.zw, l(0,0,0,0)\n      break \n      case l(6)\n      ushr r13.xyzw, r11.yzwx, l(16, 16, 16, 16)\n      f16tof32 r12.x, r11.y\n      f16tof32 r12.y, r13.x\n      f16tof32 r10.x, r11.z\n      f16tof32 r10.y, r13.y\n      f16tof32 r14.x, r11.w\n      f16tof32 r14.y, r13.z\n      f16tof32 r11.x, r11.x\n      f16tof32 r11.y, r13.w\n      mov r12.zw, l(0,0,0,0)\n      mov r10.zw, l(0,0,0,0)\n      mov r14.zw, l(0,0,0,0)\n      mov r11.zw, l(0,0,0,0)\n      break \n      default \n      mov r12.x, r11.y\n      mov r12.yzw, l(0,0,0,0)\n      mov r10.x, r11.z\n      mov r10.yzw, l(0,0,0,0)\n      mov r14.x, r11.w\n      mov r14.yzw, l(0,0,0,0)\n      mov r11.yzw, l(0,0,0,0)\n      break \n    endswitch \n  endif \n  add r8.xyzw, r8.xyzw, r12.xyzw\n  add r6.xyzw, r6.xyzw, r10.xyzw\n  add r9.xyzw, r9.xyzw, r14.xyzw\n  add r7.xyzw, r7.xyzw, r11.xyzw\n  uge r2.y, r2.y, l(6)\n  if_nz r2.y\n    ishl r2.y, l(4), r5.w\n    mul r1.w, r1.w, l(0.250000)\n    iadd r0.x, r0.x, r2.y\n    if_nz r5.w\n      ieq r5.y, r1.z, l(8)\n      if_nz r5.y\n        ld_raw r10.xyzw, r0.x, T0[0].zwxy\n        iadd r5.y, r0.x, l(16)\n        ld_raw r11.xyzw, r5.y, T0[0].zwxy\n        mov r12.xy, r10.zwzz\n        mov r14.xy, r11.zwzz\n      else \n        ld_raw r12.xy, r0.x, T0[0].xyxx\n        iadd r5.y, r1.z, r0.x\n        ld_raw r10.xy, r5.y, T0[0].xyxx\n        ishl r13.xy, l(8, 12, 0, 0), r1.yyyy\n        iadd r13.xy, r0.xxxx, r13.xyxx\n        ld_raw r14.xy, r13.x, T0[0].xyxx\n        ld_raw r11.xy, r13.y, T0[0].xyxx\n      endif \n      switch r5.z\n        case l(5)\n        ishl r12.zw, r12.xxxy, l(0, 0, 16, 16)\n        ishr r13.xyzw, r12.zxwy, l(16, 16, 16, 16)\n        itof r13.xyzw, r13.xyzw\n        mul r13.xyzw, r13.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r12.xyzw, r13.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        ishl r10.zw, r10.xxxy, l(0, 0, 16, 16)\n        ishr r13.xyzw, r10.zxwy, l(16, 16, 16, 16)\n        itof r13.xyzw, r13.xyzw\n        mul r13.xyzw, r13.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r10.xyzw, r13.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        ishl r14.zw, r14.xxxy, l(0, 0, 16, 16)\n        ishr r13.xyzw, r14.zxwy, l(16, 16, 16, 16)\n        itof r13.xyzw, r13.xyzw\n        mul r13.xyzw, r13.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r14.xyzw, r13.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        ishl r11.zw, r11.xxxy, l(0, 0, 16, 16)\n        ishr r13.xyzw, r11.zxwy, l(16, 16, 16, 16)\n        itof r13.xyzw, r13.xyzw\n        mul r13.xyzw, r13.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r11.xyzw, r13.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        break \n        case l(7)\n        ushr r13.xy, r12.xyxx, l(16, 16, 0, 0)\n        f16tof32 r12.xz, r12.xxyx\n        f16tof32 r12.yw, r13.xxxy\n        ushr r13.xy, r10.xyxx, l(16, 16, 0, 0)\n        f16tof32 r10.xz, r10.xxyx\n        f16tof32 r10.yw, r13.xxxy\n        ushr r13.xy, r14.xyxx, l(16, 16, 0, 0)\n        f16tof32 r14.xz, r14.xxyx\n        f16tof32 r14.yw, r13.xxxy\n        ushr r13.xy, r11.xyxx, l(16, 16, 0, 0)\n        f16tof32 r11.xz, r11.xxyx\n        f16tof32 r11.yw, r13.xxxy\n        break \n        default \n        mov r12.zw, l(0,0,0,0)\n        mov r10.zw, l(0,0,0,0)\n        mov r14.zw, l(0,0,0,0)\n        mov r11.zw, l(0,0,0,0)\n        break \n      endswitch \n    else \n      ieq r5.y, r1.z, l(4)\n      if_nz r5.y\n        ld_raw r11.xyzw, r0.x, T0[0].wxyz\n      else \n        ld_raw r11.y, r0.x, T0[0].xxxx\n        iadd r5.y, r1.z, r0.x\n        ld_raw r11.z, r5.y, T0[0].xxxx\n        ishl r13.xy, l(8, 12, 0, 0), r1.yyyy\n        iadd r13.xy, r0.xxxx, r13.xyxx\n        ld_raw r11.w, r13.x, T0[0].xxxx\n        ld_raw r11.x, r13.y, T0[0].xxxx\n      endif \n      switch r5.z\n        case l(0)\n        case l(1)\n        ushr r13.yzw, r11.yyyy, l(0, 8, 16, 24)\n        mov r13.x, r11.y\n        and r13.xyzw, r13.xyzw, l(255, 255, 255, 255)\n        utof r13.xyzw, r13.xyzw\n        mul r12.xyzw, r13.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        ushr r13.yzw, r11.zzzz, l(0, 8, 16, 24)\n        mov r13.x, r11.z\n        and r13.xyzw, r13.xyzw, l(255, 255, 255, 255)\n        utof r13.xyzw, r13.xyzw\n        mul r10.xyzw, r13.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        ushr r13.yzw, r11.wwww, l(0, 8, 16, 24)\n        mov r13.x, r11.w\n        and r13.xyzw, r13.xyzw, l(255, 255, 255, 255)\n        utof r13.xyzw, r13.xyzw\n        mul r14.xyzw, r13.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        ushr r11.yzw, r11.xxxx, l(0, 8, 16, 24)\n        and r13.xyzw, r11.xyzw, l(255, 255, 255, 255)\n        utof r13.xyzw, r13.xyzw\n        mul r11.xyzw, r13.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        break \n        case l(2)\n        case l(10)\n        ushr r13.yzw, r11.yyyy, l(0, 10, 20, 30)\n        mov r13.x, r11.y\n        and r13.xyzw, r13.xyzw, l(1023, 1023, 1023, 3)\n        utof r13.xyzw, r13.xyzw\n        mul r12.xyzw, r13.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        ushr r13.yzw, r11.zzzz, l(0, 10, 20, 30)\n        mov r13.x, r11.z\n        and r13.xyzw, r13.xyzw, l(1023, 1023, 1023, 3)\n        utof r13.xyzw, r13.xyzw\n        mul r10.xyzw, r13.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        ushr r13.yzw, r11.wwww, l(0, 10, 20, 30)\n        mov r13.x, r11.w\n        and r13.xyzw, r13.xyzw, l(1023, 1023, 1023, 3)\n        utof r13.xyzw, r13.xyzw\n        mul r14.xyzw, r13.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        ushr r11.yzw, r11.xxxx, l(0, 10, 20, 30)\n        and r13.xyzw, r11.xyzw, l(1023, 1023, 1023, 3)\n        utof r13.xyzw, r13.xyzw\n        mul r11.xyzw, r13.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        break \n        case l(3)\n        case l(12)\n        ushr r13.xyzw, r11.yyyz, l(10, 20, 30, 30)\n        mov r15.x, r11.y\n        mov r15.yz, r13.xxyx\n        and r16.xyz, r15.xyzx, l(1023, 1023, 1023, 0)\n        and r17.xyz, r15.xyzx, l(127, 127, 127, 0)\n        ubfe r18.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r15.xyzx\n        firstbit_hi r19.xyz, r17.xyzx\n        iadd r19.xyz, r19.xyzx, l(-24, -24, -24, 0)\n        movc r19.xyz, r17.xyzx, r19.xyzx, l(8,8,8,0)\n        iadd r20.xyz, -r19.xyzx, l(1, 1, 1, 0)\n        movc r20.xyz, r18.xyzx, r18.xyzx, r20.xyzx\n        bfi r15.xyz, l(7, 7, 7, 0), r19.xyzx, r15.xyzx, l(0, 0, 0, 0)\n        and r15.xyz, r15.xyzx, l(127, 127, 127, 0)\n        movc r15.xyz, r18.xyzx, r17.xyzx, r15.xyzx\n        ishl r17.xyz, r20.xyzx, l(23, 23, 23, 0)\n        iadd r17.xyz, r17.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r15.xyz, r15.xyzx, l(16, 16, 16, 0)\n        iadd r15.xyz, r17.xyzx, r15.xyzx\n        movc r12.xyz, r16.xyzx, r15.xyzx, l(0,0,0,0)\n        utof r13.xy, r13.zwzz\n        ushr r15.xyzw, r11.zwwz, l(10, 10, 20, 20)\n        mov r16.x, r11.z\n        mov r16.yz, r15.xxwx\n        and r17.xyz, r16.xyzx, l(1023, 1023, 1023, 0)\n        and r18.xyz, r16.xyzx, l(127, 127, 127, 0)\n        ubfe r19.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r16.xyzx\n        firstbit_hi r20.xyz, r18.xyzx\n        iadd r20.xyz, r20.xyzx, l(-24, -24, -24, 0)\n        movc r20.xyz, r18.xyzx, r20.xyzx, l(8,8,8,0)\n        iadd r21.xyz, -r20.xyzx, l(1, 1, 1, 0)\n        movc r21.xyz, r19.xyzx, r19.xyzx, r21.xyzx\n        bfi r16.xyz, l(7, 7, 7, 0), r20.xyzx, r16.xyzx, l(0, 0, 0, 0)\n        and r16.xyz, r16.xyzx, l(127, 127, 127, 0)\n        movc r16.xyz, r19.xyzx, r18.xyzx, r16.xyzx\n        ishl r18.xyz, r21.xyzx, l(23, 23, 23, 0)\n        iadd r18.xyz, r18.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r16.xyz, r16.xyzx, l(16, 16, 16, 0)\n        iadd r16.xyz, r18.xyzx, r16.xyzx\n        movc r10.xyz, r17.xyzx, r16.xyzx, l(0,0,0,0)\n        mov r15.x, r11.w\n        and r16.xyz, r15.xyzx, l(1023, 1023, 1023, 0)\n        and r17.xyz, r15.xyzx, l(127, 127, 127, 0)\n        ubfe r18.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r15.xyzx\n        firstbit_hi r19.xyz, r17.xyzx\n        iadd r19.xyz, r19.xyzx, l(-24, -24, -24, 0)\n        movc r19.xyz, r17.xyzx, r19.xyzx, l(8,8,8,0)\n        iadd r20.xyz, -r19.xyzx, l(1, 1, 1, 0)\n        movc r20.xyz, r18.xyzx, r18.xyzx, r20.xyzx\n        bfi r15.xyz, l(7, 7, 7, 0), r19.xyzx, r15.xyzx, l(0, 0, 0, 0)\n        and r15.xyz, r15.xyzx, l(127, 127, 127, 0)\n        movc r15.xyz, r18.xyzx, r17.xyzx, r15.xyzx\n        ishl r17.xyz, r20.xyzx, l(23, 23, 23, 0)\n        iadd r17.xyz, r17.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r15.xyz, r15.xyzx, l(16, 16, 16, 0)\n        iadd r15.xyz, r17.xyzx, r15.xyzx\n        movc r14.xyz, r16.xyzx, r15.xyzx, l(0,0,0,0)\n        ushr r15.xyzw, r11.wxxx, l(30, 10, 20, 30)\n        utof r13.zw, r15.xxxw\n        mov r15.x, r11.x\n        and r16.xyz, r15.xyzx, l(1023, 1023, 1023, 0)\n        and r17.xyz, r15.xyzx, l(127, 127, 127, 0)\n        ubfe r18.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r15.xyzx\n        firstbit_hi r19.xyz, r17.xyzx\n        iadd r19.xyz, r19.xyzx, l(-24, -24, -24, 0)\n        movc r19.xyz, r17.xyzx, r19.xyzx, l(8,8,8,0)\n        iadd r20.xyz, -r19.xyzx, l(1, 1, 1, 0)\n        movc r20.xyz, r18.xyzx, r18.xyzx, r20.xyzx\n        bfi r15.xyz, l(7, 7, 7, 0), r19.xyzx, r15.xyzx, l(0, 0, 0, 0)\n        and r15.xyz, r15.xyzx, l(127, 127, 127, 0)\n        movc r15.xyz, r18.xyzx, r17.xyzx, r15.xyzx\n        ishl r17.xyz, r20.xyzx, l(23, 23, 23, 0)\n        iadd r17.xyz, r17.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r15.xyz, r15.xyzx, l(16, 16, 16, 0)\n        iadd r15.xyz, r17.xyzx, r15.xyzx\n        movc r11.xyz, r16.xyzx, r15.xyzx, l(0,0,0,0)\n        mul r13.xyzw, r13.xyzw, l(0.333333, 0.333333, 0.333333, 0.333333)\n        mov r12.w, r13.x\n        mov r10.w, r13.y\n        mov r14.w, r13.z\n        mov r11.w, r13.w\n        break \n        case l(4)\n        ishl r13.xyzw, r11.yzwx, l(16, 16, 16, 16)\n        mov r15.xz, r13.xxyx\n        mov r15.yw, r11.yyyz\n        ishr r15.xyzw, r15.xyzw, l(16, 16, 16, 16)\n        itof r15.xyzw, r15.xyzw\n        mul r15.xyzw, r15.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r12.xy, r15.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        max r10.xy, r15.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        mov r11.yz, r13.zzwz\n        ishr r13.xyzw, r11.ywzx, l(16, 16, 16, 16)\n        itof r13.xyzw, r13.xyzw\n        mul r13.xyzw, r13.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r14.xy, r13.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        max r11.xy, r13.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        mov r12.zw, l(0,0,0,0)\n        mov r10.zw, l(0,0,0,0)\n        mov r14.zw, l(0,0,0,0)\n        mov r11.zw, l(0,0,0,0)\n        break \n        case l(6)\n        ushr r13.xyzw, r11.yzwx, l(16, 16, 16, 16)\n        f16tof32 r12.x, r11.y\n        f16tof32 r12.y, r13.x\n        f16tof32 r10.x, r11.z\n        f16tof32 r10.y, r13.y\n        f16tof32 r14.x, r11.w\n        f16tof32 r14.y, r13.z\n        f16tof32 r11.x, r11.x\n        f16tof32 r11.y, r13.w\n        mov r12.zw, l(0,0,0,0)\n        mov r10.zw, l(0,0,0,0)\n        mov r14.zw, l(0,0,0,0)\n        mov r11.zw, l(0,0,0,0)\n        break \n        default \n        mov r12.x, r11.y\n        mov r12.yzw, l(0,0,0,0)\n        mov r10.x, r11.z\n        mov r10.yzw, l(0,0,0,0)\n        mov r14.x, r11.w\n        mov r14.yzw, l(0,0,0,0)\n        mov r11.yzw, l(0,0,0,0)\n        break \n      endswitch \n    endif \n    add r12.xyzw, r8.xyzw, r12.xyzw\n    add r10.xyzw, r6.xyzw, r10.xyzw\n    add r13.xyzw, r9.xyzw, r14.xyzw\n    add r11.xyzw, r7.xyzw, r11.xyzw\n    iadd r0.x, r2.y, r5.x\n    if_nz r5.w\n      ieq r2.y, r1.z, l(8)\n      if_nz r2.y\n        ld_raw r14.xyzw, r0.x, T0[0].zwxy\n        iadd r2.y, r0.x, l(16)\n        ld_raw r15.xyzw, r2.y, T0[0].zwxy\n        mov r16.xy, r14.zwzz\n        mov r17.xy, r15.zwzz\n      else \n        ld_raw r16.xy, r0.x, T0[0].xyxx\n        iadd r2.y, r1.z, r0.x\n        ld_raw r14.xy, r2.y, T0[0].xyxx\n        ishl r5.xy, l(8, 12, 0, 0), r1.yyyy\n        iadd r5.xy, r0.xxxx, r5.xyxx\n        ld_raw r17.xy, r5.x, T0[0].xyxx\n        ld_raw r15.xy, r5.y, T0[0].xyxx\n      endif \n      switch r5.z\n        case l(5)\n        ishl r16.zw, r16.xxxy, l(0, 0, 16, 16)\n        ishr r18.xyzw, r16.zxwy, l(16, 16, 16, 16)\n        itof r18.xyzw, r18.xyzw\n        mul r18.xyzw, r18.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r16.xyzw, r18.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        ishl r14.zw, r14.xxxy, l(0, 0, 16, 16)\n        ishr r18.xyzw, r14.zxwy, l(16, 16, 16, 16)\n        itof r18.xyzw, r18.xyzw\n        mul r18.xyzw, r18.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r14.xyzw, r18.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        ishl r17.zw, r17.xxxy, l(0, 0, 16, 16)\n        ishr r18.xyzw, r17.zxwy, l(16, 16, 16, 16)\n        itof r18.xyzw, r18.xyzw\n        mul r18.xyzw, r18.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r17.xyzw, r18.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        ishl r15.zw, r15.xxxy, l(0, 0, 16, 16)\n        ishr r18.xyzw, r15.zxwy, l(16, 16, 16, 16)\n        itof r18.xyzw, r18.xyzw\n        mul r18.xyzw, r18.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r15.xyzw, r18.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        break \n        case l(7)\n        ushr r5.xy, r16.xyxx, l(16, 16, 0, 0)\n        f16tof32 r16.xz, r16.xxyx\n        f16tof32 r16.yw, r5.xxxy\n        ushr r5.xy, r14.xyxx, l(16, 16, 0, 0)\n        f16tof32 r14.xz, r14.xxyx\n        f16tof32 r14.yw, r5.xxxy\n        ushr r5.xy, r17.xyxx, l(16, 16, 0, 0)\n        f16tof32 r17.xz, r17.xxyx\n        f16tof32 r17.yw, r5.xxxy\n        ushr r5.xy, r15.xyxx, l(16, 16, 0, 0)\n        f16tof32 r15.xz, r15.xxyx\n        f16tof32 r15.yw, r5.xxxy\n        break \n        default \n        mov r16.zw, l(0,0,0,0)\n        mov r14.zw, l(0,0,0,0)\n        mov r17.zw, l(0,0,0,0)\n        mov r15.zw, l(0,0,0,0)\n        break \n      endswitch \n    else \n      ieq r2.y, r1.z, l(4)\n      if_nz r2.y\n        ld_raw r15.xyzw, r0.x, T0[0].wxyz\n      else \n        ld_raw r15.y, r0.x, T0[0].xxxx\n        iadd r1.z, r1.z, r0.x\n        ld_raw r15.z, r1.z, T0[0].xxxx\n        ishl r1.yz, l(0, 8, 12, 0), r1.yyyy\n        iadd r1.yz, r0.xxxx, r1.yyzy\n        ld_raw r15.w, r1.y, T0[0].xxxx\n        ld_raw r15.x, r1.z, T0[0].xxxx\n      endif \n      switch r5.z\n        case l(0)\n        case l(1)\n        ushr r5.yzw, r15.yyyy, l(0, 8, 16, 24)\n        mov r5.x, r15.y\n        and r5.xyzw, r5.xyzw, l(255, 255, 255, 255)\n        utof r5.xyzw, r5.xyzw\n        mul r16.xyzw, r5.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        ushr r5.yzw, r15.zzzz, l(0, 8, 16, 24)\n        mov r5.x, r15.z\n        and r5.xyzw, r5.xyzw, l(255, 255, 255, 255)\n        utof r5.xyzw, r5.xyzw\n        mul r14.xyzw, r5.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        ushr r5.yzw, r15.wwww, l(0, 8, 16, 24)\n        mov r5.x, r15.w\n        and r5.xyzw, r5.xyzw, l(255, 255, 255, 255)\n        utof r5.xyzw, r5.xyzw\n        mul r17.xyzw, r5.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        ushr r15.yzw, r15.xxxx, l(0, 8, 16, 24)\n        and r5.xyzw, r15.xyzw, l(255, 255, 255, 255)\n        utof r5.xyzw, r5.xyzw\n        mul r15.xyzw, r5.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        break \n        case l(2)\n        case l(10)\n        ushr r5.yzw, r15.yyyy, l(0, 10, 20, 30)\n        mov r5.x, r15.y\n        and r5.xyzw, r5.xyzw, l(1023, 1023, 1023, 3)\n        utof r5.xyzw, r5.xyzw\n        mul r16.xyzw, r5.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        ushr r5.yzw, r15.zzzz, l(0, 10, 20, 30)\n        mov r5.x, r15.z\n        and r5.xyzw, r5.xyzw, l(1023, 1023, 1023, 3)\n        utof r5.xyzw, r5.xyzw\n        mul r14.xyzw, r5.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        ushr r5.yzw, r15.wwww, l(0, 10, 20, 30)\n        mov r5.x, r15.w\n        and r5.xyzw, r5.xyzw, l(1023, 1023, 1023, 3)\n        utof r5.xyzw, r5.xyzw\n        mul r17.xyzw, r5.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        ushr r15.yzw, r15.xxxx, l(0, 10, 20, 30)\n        and r5.xyzw, r15.xyzw, l(1023, 1023, 1023, 3)\n        utof r5.xyzw, r5.xyzw\n        mul r15.xyzw, r5.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        break \n        case l(3)\n        case l(12)\n        ushr r5.xyzw, r15.yyyz, l(10, 20, 30, 30)\n        mov r18.x, r15.y\n        mov r18.yz, r5.xxyx\n        and r19.xyz, r18.xyzx, l(1023, 1023, 1023, 0)\n        and r20.xyz, r18.xyzx, l(127, 127, 127, 0)\n        ubfe r21.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r18.xyzx\n        firstbit_hi r22.xyz, r20.xyzx\n        iadd r22.xyz, r22.xyzx, l(-24, -24, -24, 0)\n        movc r22.xyz, r20.xyzx, r22.xyzx, l(8,8,8,0)\n        iadd r23.xyz, -r22.xyzx, l(1, 1, 1, 0)\n        movc r23.xyz, r21.xyzx, r21.xyzx, r23.xyzx\n        bfi r18.xyz, l(7, 7, 7, 0), r22.xyzx, r18.xyzx, l(0, 0, 0, 0)\n        and r18.xyz, r18.xyzx, l(127, 127, 127, 0)\n        movc r18.xyz, r21.xyzx, r20.xyzx, r18.xyzx\n        ishl r20.xyz, r23.xyzx, l(23, 23, 23, 0)\n        iadd r20.xyz, r20.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r18.xyz, r18.xyzx, l(16, 16, 16, 0)\n        iadd r18.xyz, r20.xyzx, r18.xyzx\n        movc r16.xyz, r19.xyzx, r18.xyzx, l(0,0,0,0)\n        utof r1.yz, r5.zzwz\n        ushr r5.xyzw, r15.zwwz, l(10, 10, 20, 20)\n        mov r18.x, r15.z\n        mov r18.yz, r5.xxwx\n        and r19.xyz, r18.xyzx, l(1023, 1023, 1023, 0)\n        and r20.xyz, r18.xyzx, l(127, 127, 127, 0)\n        ubfe r21.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r18.xyzx\n        firstbit_hi r22.xyz, r20.xyzx\n        iadd r22.xyz, r22.xyzx, l(-24, -24, -24, 0)\n        movc r22.xyz, r20.xyzx, r22.xyzx, l(8,8,8,0)\n        iadd r23.xyz, -r22.xyzx, l(1, 1, 1, 0)\n        movc r23.xyz, r21.xyzx, r21.xyzx, r23.xyzx\n        bfi r18.xyz, l(7, 7, 7, 0), r22.xyzx, r18.xyzx, l(0, 0, 0, 0)\n        and r18.xyz, r18.xyzx, l(127, 127, 127, 0)\n        movc r18.xyz, r21.xyzx, r20.xyzx, r18.xyzx\n        ishl r20.xyz, r23.xyzx, l(23, 23, 23, 0)\n        iadd r20.xyz, r20.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r18.xyz, r18.xyzx, l(16, 16, 16, 0)\n        iadd r18.xyz, r20.xyzx, r18.xyzx\n        movc r14.xyz, r19.xyzx, r18.xyzx, l(0,0,0,0)\n        mul r1.yz, r1.yyzy, l(0.000000, 0.333333, 0.333333, 0.000000)\n        mov r5.x, r15.w\n        and r18.xyz, r5.xyzx, l(1023, 1023, 1023, 0)\n        and r19.xyz, r5.xyzx, l(127, 127, 127, 0)\n        ubfe r20.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r5.xyzx\n        firstbit_hi r21.xyz, r19.xyzx\n        iadd r21.xyz, r21.xyzx, l(-24, -24, -24, 0)\n        movc r21.xyz, r19.xyzx, r21.xyzx, l(8,8,8,0)\n        iadd r22.xyz, -r21.xyzx, l(1, 1, 1, 0)\n        movc r22.xyz, r20.xyzx, r20.xyzx, r22.xyzx\n        bfi r5.xyz, l(7, 7, 7, 0), r21.xyzx, r5.xyzx, l(0, 0, 0, 0)\n        and r5.xyz, r5.xyzx, l(127, 127, 127, 0)\n        movc r5.xyz, r20.xyzx, r19.xyzx, r5.xyzx\n        ishl r19.xyz, r22.xyzx, l(23, 23, 23, 0)\n        iadd r19.xyz, r19.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r5.xyz, r5.xyzx, l(16, 16, 16, 0)\n        iadd r5.xyz, r19.xyzx, r5.xyzx\n        movc r17.xyz, r18.xyzx, r5.xyzx, l(0,0,0,0)\n        ushr r5.xyzw, r15.wxxx, l(30, 10, 20, 30)\n        utof r18.xy, r5.xwxx\n        mov r5.x, r15.x\n        and r19.xyz, r5.xyzx, l(1023, 1023, 1023, 0)\n        and r20.xyz, r5.xyzx, l(127, 127, 127, 0)\n        ubfe r21.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r5.xyzx\n        firstbit_hi r22.xyz, r20.xyzx\n        iadd r22.xyz, r22.xyzx, l(-24, -24, -24, 0)\n        movc r22.xyz, r20.xyzx, r22.xyzx, l(8,8,8,0)\n        iadd r23.xyz, -r22.xyzx, l(1, 1, 1, 0)\n        movc r23.xyz, r21.xyzx, r21.xyzx, r23.xyzx\n        bfi r5.xyz, l(7, 7, 7, 0), r22.xyzx, r5.xyzx, l(0, 0, 0, 0)\n        and r5.xyz, r5.xyzx, l(127, 127, 127, 0)\n        movc r5.xyz, r21.xyzx, r20.xyzx, r5.xyzx\n        ishl r20.xyz, r23.xyzx, l(23, 23, 23, 0)\n        iadd r20.xyz, r20.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r5.xyz, r5.xyzx, l(16, 16, 16, 0)\n        iadd r5.xyz, r20.xyzx, r5.xyzx\n        movc r15.xyz, r19.xyzx, r5.xyzx, l(0,0,0,0)\n        mul r5.xy, r18.xyxx, l(0.333333, 0.333333, 0.000000, 0.000000)\n        mov r16.w, r1.y\n        mov r14.w, r1.z\n        mov r17.w, r5.x\n        mov r15.w, r5.y\n        break \n        case l(4)\n        ishl r5.xyzw, r15.yzwx, l(16, 16, 16, 16)\n        mov r18.xz, r5.xxyx\n        mov r18.yw, r15.yyyz\n        ishr r18.xyzw, r18.xyzw, l(16, 16, 16, 16)\n        itof r18.xyzw, r18.xyzw\n        mul r18.xyzw, r18.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r16.xy, r18.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        max r14.xy, r18.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        mov r15.yz, r5.zzwz\n        ishr r5.xyzw, r15.ywzx, l(16, 16, 16, 16)\n        itof r5.xyzw, r5.xyzw\n        mul r5.xyzw, r5.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r17.xy, r5.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        max r15.xy, r5.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        mov r16.zw, l(0,0,0,0)\n        mov r14.zw, l(0,0,0,0)\n        mov r17.zw, l(0,0,0,0)\n        mov r15.zw, l(0,0,0,0)\n        break \n        case l(6)\n        ushr r5.xyzw, r15.yzwx, l(16, 16, 16, 16)\n        f16tof32 r16.x, r15.y\n        f16tof32 r16.y, r5.x\n        f16tof32 r14.x, r15.z\n        f16tof32 r14.y, r5.y\n        f16tof32 r17.x, r15.w\n        f16tof32 r17.y, r5.z\n        f16tof32 r15.x, r15.x\n        f16tof32 r15.y, r5.w\n        mov r16.zw, l(0,0,0,0)\n        mov r14.zw, l(0,0,0,0)\n        mov r17.zw, l(0,0,0,0)\n        mov r15.zw, l(0,0,0,0)\n        break \n        default \n        mov r16.x, r15.y\n        mov r16.yzw, l(0,0,0,0)\n        mov r14.x, r15.z\n        mov r14.yzw, l(0,0,0,0)\n        mov r17.x, r15.w\n        mov r17.yzw, l(0,0,0,0)\n        mov r15.yzw, l(0,0,0,0)\n        break \n      endswitch \n    endif \n    add r8.xyzw, r12.xyzw, r16.xyzw\n    add r6.xyzw, r10.xyzw, r14.xyzw\n    add r9.xyzw, r13.xyzw, r17.xyzw\n    add r7.xyzw, r11.xyzw, r15.xyzw\n  else \n    mov r1.w, r2.w\n  endif \nendif \nmul r5.xyzw, r1.wwww, r8.xyzw\nmul r6.xyzw, r1.wwww, r6.xyzw\nmul r8.xyzw, r1.wwww, r9.xyzw\nmul r7.xyzw, r1.wwww, r7.xyzw\nif_nz r0.w\n  mov r5.xz, r5.zzxz\n  mov r6.xz, r6.zzxz\n  mov r8.xz, r8.zzxz\n  mov r9.xz, r7.zzxz\nelse \n  mov r9.xz, r7.xxzx\nendif \nswitch r2.x\n  case l(6)\n  case l(14)\n  case l(50)\n  mov_sat r5.xyzw, r5.xyzw\n  mad r10.xyzw, r5.xyzw, l(255.000000, 255.000000, 255.000000, 255.000000), l(0.500000, 0.500000, 0.500000, 0.500000)\n  ftou r10.xyzw, r10.xyzw\n  imad r0.x, r10.y, l(256), r10.x\n  imad r0.x, r10.z, l(0x00010000), r0.x\n  imad r10.x, r10.w, l(0x01000000), r0.x\n  mov_sat r6.xyzw, r6.xyzw\n  mad r11.xyzw, r6.xyzw, l(255.000000, 255.000000, 255.000000, 255.000000), l(0.500000, 0.500000, 0.500000, 0.500000)\n  ftou r11.xyzw, r11.xyzw\n  imad r0.x, r11.y, l(256), r11.x\n  imad r0.x, r11.z, l(0x00010000), r0.x\n  imad r10.y, r11.w, l(0x01000000), r0.x\n  mov_sat r8.xyzw, r8.xyzw\n  mad r11.xyzw, r8.xyzw, l(255.000000, 255.000000, 255.000000, 255.000000), l(0.500000, 0.500000, 0.500000, 0.500000)\n  ftou r11.xyzw, r11.xyzw\n  imad r0.x, r11.y, l(256), r11.x\n  imad r0.x, r11.z, l(0x00010000), r0.x\n  imad r10.z, r11.w, l(0x01000000), r0.x\n  mov r9.yw, r7.yyyw\n  mov_sat r9.xyzw, r9.xyzw\n  mad r11.xyzw, r9.xyzw, l(255.000000, 255.000000, 255.000000, 255.000000), l(0.500000, 0.500000, 0.500000, 0.500000)\n  ftou r11.xyzw, r11.xyzw\n  imad r0.x, r11.y, l(256), r11.x\n  imad r0.x, r11.z, l(0x00010000), r0.x\n  imad r10.w, r11.w, l(0x01000000), r0.x\n  mov r9.xyzw, r10.wyxz\n  break \n  case l(7)\n  case l(54)\n  mov_sat r5.xyzw, r5.xyzw\n  mad r10.xyzw, r5.xyzw, l(1023.000000, 1023.000000, 1023.000000, 3.000000), l(0.500000, 0.500000, 0.500000, 0.500000)\n  ftou r10.xyzw, r10.xyzw\n  imad r0.x, r10.y, l(1024), r10.x\n  imad r0.x, r10.z, l(0x00100000), r0.x\n  imad r10.x, r10.w, l(0x40000000), r0.x\n  mov_sat r6.xyzw, r6.xyzw\n  mad r11.xyzw, r6.xyzw, l(1023.000000, 1023.000000, 1023.000000, 3.000000), l(0.500000, 0.500000, 0.500000, 0.500000)\n  ftou r11.xyzw, r11.xyzw\n  imad r0.x, r11.y, l(1024), r11.x\n  imad r0.x, r11.z, l(0x00100000), r0.x\n  imad r10.y, r11.w, l(0x40000000), r0.x\n  mov_sat r8.xyzw, r8.xyzw\n  mad r11.xyzw, r8.xyzw, l(1023.000000, 1023.000000, 1023.000000, 3.000000), l(0.500000, 0.500000, 0.500000, 0.500000)\n  ftou r11.xyzw, r11.xyzw\n  imad r0.x, r11.y, l(1024), r11.x\n  imad r0.x, r11.z, l(0x00100000), r0.x\n  imad r10.z, r11.w, l(0x40000000), r0.x\n  mov_sat r7.xz, r9.xxzx\n  mov_sat r7.yw, r7.yyyw\n  mad r11.xyzw, r7.xyzw, l(1023.000000, 1023.000000, 1023.000000, 3.000000), l(0.500000, 0.500000, 0.500000, 0.500000)\n  ftou r11.xyzw, r11.xyzw\n  imad r0.x, r11.y, l(1024), r11.x\n  imad r0.x, r11.z, l(0x00100000), r0.x\n  imad r10.w, r11.w, l(0x40000000), r0.x\n  mov r9.xyzw, r10.wyxz\n  break \n  case l(16)\n  case l(55)\n  mov_sat r5.xyz, r5.xyzx\n  mad r1.yzw, r5.xxyz, l(0.000000, 2047.000000, 2047.000000, 1023.000000), l(0.000000, 0.500000, 0.500000, 0.500000)\n  ftou r1.yzw, r1.yyzw\n  imad r0.x, r1.z, l(2048), r1.y\n  imad r10.x, r1.w, l(0x00400000), r0.x\n  mov_sat r6.xyz, r6.xyzx\n  mad r1.yzw, r6.xxyz, l(0.000000, 2047.000000, 2047.000000, 1023.000000), l(0.000000, 0.500000, 0.500000, 0.500000)\n  ftou r1.yzw, r1.yyzw\n  imad r0.x, r1.z, l(2048), r1.y\n  imad r10.y, r1.w, l(0x00400000), r0.x\n  mov_sat r8.xyz, r8.xyzx\n  mad r1.yzw, r8.xxyz, l(0.000000, 2047.000000, 2047.000000, 1023.000000), l(0.000000, 0.500000, 0.500000, 0.500000)\n  ftou r1.yzw, r1.yyzw\n  imad r0.x, r1.z, l(2048), r1.y\n  imad r10.z, r1.w, l(0x00400000), r0.x\n  mov_sat r7.xz, r9.xxzx\n  mov_sat r7.y, r7.y\n  mad r1.yzw, r7.xxyz, l(0.000000, 2047.000000, 2047.000000, 1023.000000), l(0.000000, 0.500000, 0.500000, 0.500000)\n  ftou r1.yzw, r1.yyzw\n  imad r0.x, r1.z, l(2048), r1.y\n  imad r10.w, r1.w, l(0x00400000), r0.x\n  mov r9.xyzw, r10.wyxz\n  break \n  case l(17)\n  case l(56)\n  mov_sat r5.xyz, r5.xyzx\n  mad r1.yzw, r5.xxyz, l(0.000000, 1023.000000, 2047.000000, 2047.000000), l(0.000000, 0.500000, 0.500000, 0.500000)\n  ftou r1.yzw, r1.yyzw\n  imad r0.x, r1.z, l(1024), r1.y\n  imad r10.x, r1.w, l(0x00200000), r0.x\n  mov_sat r6.xyz, r6.xyzx\n  mad r1.yzw, r6.xxyz, l(0.000000, 1023.000000, 2047.000000, 2047.000000), l(0.000000, 0.500000, 0.500000, 0.500000)\n  ftou r1.yzw, r1.yyzw\n  imad r0.x, r1.z, l(1024), r1.y\n  imad r10.y, r1.w, l(0x00200000), r0.x\n  mov_sat r8.xyz, r8.xyzx\n  mad r1.yzw, r8.xxyz, l(0.000000, 1023.000000, 2047.000000, 2047.000000), l(0.000000, 0.500000, 0.500000, 0.500000)\n  ftou r1.yzw, r1.yyzw\n  imad r0.x, r1.z, l(1024), r1.y\n  imad r10.z, r1.w, l(0x00200000), r0.x\n  mov_sat r7.xz, r9.xxzx\n  mov_sat r7.y, r7.y\n  mad r1.yzw, r7.xxyz, l(0.000000, 1023.000000, 2047.000000, 2047.000000), l(0.000000, 0.500000, 0.500000, 0.500000)\n  ftou r1.yzw, r1.yyzw\n  imad r0.x, r1.z, l(1024), r1.y\n  imad r10.w, r1.w, l(0x00200000), r0.x\n  mov r9.xyzw, r10.wyxz\n  break \n  case l(25)\n  mov_sat r5.xy, r5.xyxx\n  mad r0.xw, r5.xxxy, l(65535.000000, 0.000000, 0.000000, 65535.000000), l(0.500000, 0.000000, 0.000000, 0.500000)\n  ftou r0.xw, r0.xxxw\n  imad r9.z, r0.w, l(0x00010000), r0.x\n  mov_sat r6.xy, r6.xyxx\n  mad r0.xw, r6.xxxy, l(65535.000000, 0.000000, 0.000000, 65535.000000), l(0.500000, 0.000000, 0.000000, 0.500000)\n  ftou r0.xw, r0.xxxw\n  imad r9.y, r0.w, l(0x00010000), r0.x\n  mov_sat r8.xy, r8.xyxx\n  mad r0.xw, r8.xxxy, l(65535.000000, 0.000000, 0.000000, 65535.000000), l(0.500000, 0.000000, 0.000000, 0.500000)\n  ftou r0.xw, r0.xxxw\n  imad r9.w, r0.w, l(0x00010000), r0.x\n  mov_sat r7.x, r9.x\n  mov_sat r7.y, r7.y\n  mad r0.xw, r7.xxxy, l(65535.000000, 0.000000, 0.000000, 65535.000000), l(0.500000, 0.000000, 0.000000, 0.500000)\n  ftou r0.xw, r0.xxxw\n  imad r9.x, r0.w, l(0x00010000), r0.x\n  break \n  case l(31)\n  f32tof16 r0.xw, r5.xxxy\n  imad r9.z, r0.w, l(0x00010000), r0.x\n  f32tof16 r0.xw, r6.xxxy\n  imad r9.y, r0.w, l(0x00010000), r0.x\n  f32tof16 r0.xw, r8.xxxy\n  imad r9.w, r0.w, l(0x00010000), r0.x\n  f32tof16 r0.x, r9.x\n  f32tof16 r0.w, r7.y\n  imad r9.x, r0.w, l(0x00010000), r0.x\n  break \n  default \n  mov r9.z, r5.x\n  mov r9.y, r6.x\n  mov r9.w, r8.x\n  break \nendswitch \niadd r3.xyzw, r3.xyzw, r4.xyzw\nif_nz r0.z\n  ubfe r0.x, l(3), l(4), CB0[0][0].z\n  bfi r0.z, l(10), l(1), r2.z, l(0)\n  ishr r0.w, r0.x, l(2)\n  ishr r2.xyzw, r3.wyww, l(4, 5, 1, 3)\n  imad r0.z, r0.w, r0.z, r2.x\n  imad r0.z, r0.z, r1.x, r2.y\n  bfi r0.x, l(2), l(5), r0.x, l(0)\n  bfi r1.y, l(2), l(3), r2.z, l(0)\n  iadd r0.x, r0.x, r1.y\n  bfi r0.x, l(3), l(0), r3.y, r0.x\n  bfi r0.x, l(25), l(7), r0.z, r0.x\n  xor r0.z, r0.w, r2.w\n  ubfe r0.w, l(2), l(3), r3.y\n  bfi r1.yz, l(0, 1, 1, 0), l(0, 1, 11, 0), r0.zzzz, l(0, 0, 0, 0)\n  xor r0.z, r0.w, r1.y\n  bfi r0.w, l(1), l(4), r3.w, l(0)\n  imad r0.z, r0.z, l(64), r0.w\n  iadd r0.z, r1.z, r0.z\n  ibfe r1.yzw, l(0, 28, 27, 24), l(0, 2, 3, 6), r0.xxxx\n  bfi r0.x, l(1), l(5), r1.y, r0.z\n  bfi r0.x, l(3), l(8), r1.z, r0.x\n  bfi r0.x, l(20), l(12), r1.w, r0.x\nelse \n  ishr r2.xyzw, r3.xyzw, l(5, 5, 1, 4)\n  imad r0.z, r2.x, r1.x, r2.y\n  bfi r1.xy, l(3, 1, 0, 0), l(3, 11, 0, 0), r2.zwzz, l(0, 0, 0, 0)\n  bfi r0.w, l(3), l(0), r3.y, r1.x\n  imad r0.z, r0.z, l(64), r0.w\n  ubfe r0.w, l(2), l(3), r3.y\n  ishr r1.x, r3.w, l(3)\n  bfi r1.x, l(1), l(1), r1.x, l(0)\n  xor r0.w, r0.w, r1.x\n  bfi r1.x, l(1), l(4), r3.w, l(0)\n  imad r0.w, r0.w, l(64), r1.x\n  iadd r0.w, r1.y, r0.w\n  ibfe r1.xyz, l(28, 27, 24, 0), l(2, 3, 6, 0), r0.zzzz\n  bfi r0.z, l(1), l(5), r1.x, r0.w\n  bfi r0.z, l(3), l(8), r1.y, r0.z\n  bfi r0.x, l(20), l(12), r1.z, r0.z\nendif \niadd r0.x, r0.x, CB0[0][1].x\nieq r0.yzw, r0.yyyy, l(0, 1, 2, 3)\nor r0.yz, r0.zzwz, r0.yyzy\nif_nz r0.y\n  ishl r1.xyzw, r9.zywx, l(8, 8, 8, 8)\n  and r1.xyzw, r1.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r2.xyzw, r9.zywx, l(8, 8, 8, 8)\n  and r2.xyzw, r2.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r9.xyzw, r1.wyxz, r2.wyxz\nendif \nif_nz r0.z\n  ushr r1.xyzw, r9.zywx, l(16, 16, 16, 16)\n  bfi r9.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r9.xyzw, r1.wyxz\nendif \nstore_raw U0[0].xyzw, r0.x, r9.zywx\nret \n// Approximately 1286 instruction slots used\n#endif\n\nconst BYTE resolve_full_32bpp_cs[] =\n{\n     68,  88,  66,  67,  59, 181, \n    146, 160,  11, 158, 208,   2, \n    111, 217, 106,  31,  49,  75, \n    105, 210,   1,   0,   0,   0, \n    180, 155,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n    208,   2,   0,   0, 224,   2, \n      0,   0, 240,   2,   0,   0, \n     24, 155,   0,   0,  82,  68, \n     69,  70, 148,   2,   0,   0, \n      1,   0,   0,   0, 228,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    105,   2,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 197,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 213,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 114, 101, 115, \n    111, 108, 118, 101,  95, 101, \n    100, 114,  97, 109,   0, 120, \n    101,  95, 114, 101, 115, 111, \n    108, 118, 101,  95, 100, 101, \n    115, 116,   0, 112, 117, 115, \n    104,  95,  99, 111, 110, 115, \n    116, 115,  95, 120, 101,   0, \n    213,   0,   0,   0,   5,   0, \n      0,   0, 252,   0,   0,   0, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    196,   1,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 224,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,   4,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 224,   1,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  31,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    224,   1,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     52,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 224,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  84,   2, \n      0,   0,  16,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 224,   1,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 114, \n    101, 115, 111, 108, 118, 101, \n     95, 101, 100, 114,  97, 109, \n     95, 105, 110, 102, 111,   0, \n    100, 119, 111, 114, 100,   0, \n      0,   0,  19,   0,   1,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 218,   1,   0,   0, \n    120, 101,  95, 114, 101, 115, \n    111, 108, 118, 101,  95,  99, \n    111, 111, 114, 100, 105, 110, \n     97, 116, 101,  95, 105, 110, \n    102, 111,   0, 120, 101,  95, \n    114, 101, 115, 111, 108, 118, \n    101,  95, 100, 101, 115, 116, \n     95, 105, 110, 102, 111,   0, \n    120, 101,  95, 114, 101, 115, \n    111, 108, 118, 101,  95, 100, \n    101, 115, 116,  95,  99, 111, \n    111, 114, 100, 105, 110,  97, \n    116, 101,  95, 105, 110, 102, \n    111,   0, 120, 101,  95, 114, \n    101, 115, 111, 108, 118, 101, \n     95, 100, 101, 115, 116,  95, \n     98,  97, 115, 101,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n     32, 152,   0,   0,  81,   0, \n      5,   0,   8,  38,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n     50,   0,   2,   0, 104,   0, \n      0,   2,  24,   0,   0,   0, \n    155,   0,   0,   4,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  12, 242,   0,  16,   0, \n      0,   0,   0,   0, 134, 138, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0,   7,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   1,   1,   0, \n      0,   9,  18,   0,  16,   0, \n      1,   0,   0,   0,  58, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n    255,   3,   0,   0,  85,   0, \n      0,  12, 114,   0,  16,   0, \n      2,   0,   0,   0,  86, 135, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,   5,   0, \n      0,   0,  10,   0,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  12, 242,   0,  16,   0, \n      3,   0,   0,   0, 246, 143, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n     24,   0,   0,   0,  20,   0, \n      0,   0,  24,   0,   0,   0, \n     24,   0,   0,   0,  41,   0, \n      0,   6,  34,   0,  16,   0, \n      4,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  11,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     80,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      1,   0,   0,   0,  62,   0, \n      0,   1,  21,   0,   0,   1, \n    138,   0,   0,  17, 242,   0, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,  11,   0,   0,   0, \n      4,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  13,   0, \n      0,   0,  24,   0,   0,   0, \n     28,   0,   0,   0,   6, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   7, \n    130,   0,  16,   0,   2,   0, \n      0,   0,  26, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  20,  98,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0, 246,  12, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 139,   0,   0,  11, \n    130,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n     42, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  23,   0, \n      0,   0,  30,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   0,   0, 128,  63, \n    140,   0,   0,  20, 242,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   4,   0, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  17, \n     50,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      6,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n     28,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    230, 138,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   4, 210,   0,  16,   0, \n      4,   0,   0,   0,  86,   5, \n      2,   0,  30,   0,   0,   7, \n     98,   0,  16,   0,   1,   0, \n      0,   0,  86,   6,  16,   0, \n      1,   0,   0,   0,  86,   7, \n     16,   0,   4,   0,   0,   0, \n     80,   0,   0,   7, 130,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  31,   0, \n      4,   3,  58,   0,  16,   0, \n      2,   0,   0,   0,  54,   0, \n      0,   5,  34,   0,  16,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     18,   0,   0,   1,  32,   0, \n      0,   7, 130,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  31,   0,   4,   3, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  54,   0,   0,   5, \n     34,   0,  16,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  18,   0, \n      0,   1,  54,   0,   0,   5, \n     34,   0,  16,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  21,   0,   0,   1, \n     80,   0,   0,  10, 194,   0, \n     16,   0,   6,   0,   0,   0, \n      6,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  10, 194,   0,  16,   0, \n      6,   0,   0,   0, 166,  14, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  41,   0,   0,   7, \n     98,   0,  16,   0,   1,   0, \n      0,   0,  86,   6,  16,   0, \n      1,   0,   0,   0, 166,  11, \n     16,   0,   6,   0,   0,   0, \n     85,   0,   0,   7,  18,   0, \n     16,   0,   6,   0,   0,   0, \n     26,   0,  16,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  10,  50,   0,  16,   0, \n      6,   0,   0,   0,  70,   0, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     98,   0,  16,   0,   1,   0, \n      0,   0,  86,   6,  16,   0, \n      1,   0,   0,   0,   6,   1, \n     16,   0,   6,   0,   0,   0, \n     85,   0,   0,   7,  18,   0, \n     16,   0,   6,   0,   0,   0, \n      1,  64,   0,   0,  80,   0, \n      0,   0,  58,   0,  16,   0, \n      5,   0,   0,   0,  54,   0, \n      0,   5,  34,   0,  16,   0, \n      6,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n     78,   0,   0,   8,  50,   0, \n     16,   0,   7,   0,   0,   0, \n      0, 208,   0,   0, 150,   5, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   6,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      7,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   7,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   5,   0,   0,   0, \n     35,   0,   0,  10,  98,   0, \n     16,   0,   1,   0,   0,   0, \n      6,   1,  16, 128,  65,   0, \n      0,   0,   7,   0,   0,   0, \n      6,   1,  16,   0,   6,   0, \n      0,   0,  86,   6,  16,   0, \n      1,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   6,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  41,   0, \n      0,   7,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   5,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   5,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  78,   0,   0,   8, \n      0, 208,   0,   0,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,  40,   0,  41,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,  30,   0,   0,   7, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      5,   0,   0,   0,  42,   0, \n     16,   0,   6,   0,   0,   0, \n     41,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  31,   0, \n      4,   3,  58,   0,  16,   0, \n      5,   0,   0,   0,  32,   0, \n      0,   7, 130,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   8,   0, \n      0,   0,  31,   0,   4,   3, \n     58,   0,  16,   0,   2,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0, 230, 116, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 130,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0, 230, 116, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  50,   0,  16,   0, \n      8,   0,   0,   0, 230,  10, \n     16,   0,   6,   0,   0,   0, \n     54,   0,   0,   5,  50,   0, \n     16,   0,   9,   0,   0,   0, \n    230,  10,  16,   0,   7,   0, \n      0,   0,  18,   0,   0,   1, \n    165,   0,   0,   8,  50,   0, \n     16,   0,   8,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  70, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    130,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    165,   0,   0,   8,  50,   0, \n     16,   0,   6,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  70, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n     50,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,   5,   0,   0,   0, \n      6,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      5,   0,   0,   0, 165,   0, \n      0,   8,  50,   0,  16,   0, \n      9,   0,   0,   0,  10,   0, \n     16,   0,   5,   0,   0,   0, \n     70, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    165,   0,   0,   8,  50,   0, \n     16,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0,  70, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     76,   0,   0,   3,  42,   0, \n     16,   0,   5,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   5,   0,   0,   0, \n     41,   0,   0,  10, 194,   0, \n     16,   0,   8,   0,   0,   0, \n      6,   4,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  38,   7, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n     41,   0,   0,  10, 194,   0, \n     16,   0,   6,   0,   0,   0, \n      6,   4,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  38,   7, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n     41,   0,   0,  10, 194,   0, \n     16,   0,   9,   0,   0,   0, \n      6,   4,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  38,   7, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n     41,   0,   0,  10, 194,   0, \n     16,   0,   7,   0,   0,   0, \n      6,   4,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  38,   7, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      7,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      5,   0,   0,   0,  70,   0, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 131,   0,   0,   5, \n     82,   0,  16,   0,   8,   0, \n      0,   0,   6,   1,  16,   0, \n      8,   0,   0,   0, 131,   0, \n      0,   5, 162,   0,  16,   0, \n      8,   0,   0,   0,   6,   4, \n     16,   0,   5,   0,   0,   0, \n     85,   0,   0,  10,  50,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   0,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 131,   0, \n      0,   5,  82,   0,  16,   0, \n      6,   0,   0,   0,   6,   1, \n     16,   0,   6,   0,   0,   0, \n    131,   0,   0,   5, 162,   0, \n     16,   0,   6,   0,   0,   0, \n      6,   4,  16,   0,   5,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   5,   0, \n      0,   0,  70,   0,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    131,   0,   0,   5,  82,   0, \n     16,   0,   9,   0,   0,   0, \n      6,   1,  16,   0,   9,   0, \n      0,   0, 131,   0,   0,   5, \n    162,   0,  16,   0,   9,   0, \n      0,   0,   6,   4,  16,   0, \n      5,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      5,   0,   0,   0,  70,   0, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 131,   0,   0,   5, \n     82,   0,  16,   0,   7,   0, \n      0,   0,   6,   1,  16,   0, \n      7,   0,   0,   0, 131,   0, \n      0,   5, 162,   0,  16,   0, \n      7,   0,   0,   0,   6,   4, \n     16,   0,   5,   0,   0,   0, \n      2,   0,   0,   1,  10,   0, \n      0,   1,  54,   0,   0,   8, \n    194,   0,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   1,  23,   0,   0,   1, \n     18,   0,   0,   1,  32,   0, \n      0,   7, 130,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  31,   0,   4,   3, \n     58,   0,  16,   0,   2,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  54, 121, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  18,   0, \n      0,   1, 165,   0,   0,   8, \n     34,   0,  16,   0,   7,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 130,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0, 165,   0,   0,   8, \n     66,   0,  16,   0,   7,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10,  50,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n     12,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   5,   0, \n      0,   0,   6,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   5,   0,   0,   0, \n    165,   0,   0,   8, 130,   0, \n     16,   0,   7,   0,   0,   0, \n     10,   0,  16,   0,   5,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n     18,   0,  16,   0,   7,   0, \n      0,   0,  26,   0,  16,   0, \n      5,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  76,   0,   0,   3, \n     42,   0,  16,   0,   5,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,   0,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,  10,   0, \n      0,   0,  86,   5,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  10,   0,   0,   0, \n     26,   0,  16,   0,   7,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  10,   0,   0,   0, \n    166,  10,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  16,   0,   0,   0, \n     24,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     10,   0,   0,   0,  42,   0, \n     16,   0,   7,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     10,   0,   0,   0, 246,  15, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     16,   0,   0,   0,  24,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  10,   0, \n      0,   0,  58,   0,  16,   0, \n      7,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59,  85,   0,   0,  10, \n    226,   0,  16,   0,   7,   0, \n      0,   0,   6,   0,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,  10,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,  10,   0, \n      0,   0,  86,   5,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  10,   0,   0,   0, \n     26,   0,  16,   0,   7,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   3,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   8,  32, 128,  58, \n      8,  32, 128,  58,   8,  32, \n    128,  58, 171, 170, 170,  62, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  10,   0,   0,   0, \n    166,  10,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     30,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     10,   0,   0,   0,  42,   0, \n     16,   0,   7,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      3,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      8,  32, 128,  58,   8,  32, \n    128,  58,   8,  32, 128,  58, \n    171, 170, 170,  62,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     10,   0,   0,   0, 246,  15, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  10,   0, \n      0,   0,  58,   0,  16,   0, \n      7,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   3,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   8,  32, \n    128,  58,   8,  32, 128,  58, \n      8,  32, 128,  58, 171, 170, \n    170,  62,  85,   0,   0,  10, \n    226,   0,  16,   0,   7,   0, \n      0,   0,   6,   0,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      3,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      8,  32, 128,  58,   8,  32, \n    128,  58,   8,  32, 128,  58, \n    171, 170, 170,  62,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  86,   9,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,  30,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  11,   0,   0,   0, \n     26,   0,  16,   0,   7,   0, \n      0,   0,  54,   0,   0,   5, \n     98,   0,  16,   0,  11,   0, \n      0,   0,   6,   1,  16,   0, \n     10,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n    138,   0,   0,  15, 114,   0, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n    135,   0,   0,   5, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 232, 255, 255, 255, \n    232, 255, 255, 255, 232, 255, \n    255, 255,   0,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  11, 114,   0, \n     16,   0,  16,   0,   0,   0, \n     70,   2,  16, 128,  65,   0, \n      0,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16,   0,  14,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0, 140,   0,   0,  17, \n    114,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  11,   0, \n      0,   0,  70,   2,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    114,   0,  16,   0,  11,   0, \n      0,   0,  70,   2,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,   8,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     86,   0,   0,   5,  50,   0, \n     16,   0,   5,   0,   0,   0, \n    230,  10,  16,   0,  10,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0, 230,  11,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  11,   0,   0,   0, \n     42,   0,  16,   0,   7,   0, \n      0,   0,  54,   0,   0,   5, \n     98,   0,  16,   0,  11,   0, \n      0,   0,   6,   3,  16,   0, \n     10,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n    138,   0,   0,  15, 114,   0, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n    135,   0,   0,   5, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 232, 255, 255, 255, \n    232, 255, 255, 255, 232, 255, \n    255, 255,   0,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  11, 114,   0, \n     16,   0,  16,   0,   0,   0, \n     70,   2,  16, 128,  65,   0, \n      0,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16,   0,  14,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0, 140,   0,   0,  17, \n    114,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  11,   0, \n      0,   0,  70,   2,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    114,   0,  16,   0,  11,   0, \n      0,   0,  70,   2,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,   6,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     56,   0,   0,  10,  50,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n    171, 170, 170,  62, 171, 170, \n    170,  62,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     10,   0,   0,   0,  58,   0, \n     16,   0,   7,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  11,   0,   0,   0, \n     70,   2,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  10,   0, \n      0,   0, 135,   0,   0,   5, \n    114,   0,  16,   0,  14,   0, \n      0,   0,  70,   2,  16,   0, \n     12,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255,   0,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  14,   0, \n      0,   0,  70,   2,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  11, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16, 128, \n     65,   0,   0,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0, 140,   0, \n      0,  17, 114,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  14,   0, \n      0,   0,  70,   2,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  10,   0,   0,   0, \n     70,   2,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     10,   0,   0,   0,  70,   2, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,  70,   2,  16,   0, \n     10,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  12,   0, \n      0,   0,  70,   2,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  10,   0,   0,   0, \n     70,   2,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 114,   0,  16,   0, \n     10,   0,   0,   0,  70,   2, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  10,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,   9,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  54,   0,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,  30,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n     86,   0,   0,   5,  50,   0, \n     16,   0,  11,   0,   0,   0, \n    198,   0,  16,   0,  10,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  10,   0, \n      0,   0,  10,   0,  16,   0, \n      7,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n    138,   0,   0,  15, 114,   0, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  10,   0,   0,   0, \n    135,   0,   0,   5, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 232, 255, 255, 255, \n    232, 255, 255, 255, 232, 255, \n    255, 255,   0,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  11, 114,   0, \n     16,   0,  16,   0,   0,   0, \n     70,   2,  16, 128,  65,   0, \n      0,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16,   0,  14,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0, 140,   0,   0,  17, \n    114,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     10,   0,   0,   0,  70,   2, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  10,   0, \n      0,   0,  70,   2,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  10,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     10,   0,   0,   0,  70,   2, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    114,   0,  16,   0,  10,   0, \n      0,   0,  70,   2,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,  10,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,   7,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,  70,   2,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     56,   0,   0,  10,  50,   0, \n     16,   0,  10,   0,   0,   0, \n     70,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n    171, 170, 170,  62, 171, 170, \n    170,  62,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5, 130,   0,  16,   0, \n      8,   0,   0,   0,  10,   0, \n     16,   0,   5,   0,   0,   0, \n     54,   0,   0,   5, 130,   0, \n     16,   0,   6,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0,  54,   0,   0,   5, \n    130,   0,  16,   0,   9,   0, \n      0,   0,  10,   0,  16,   0, \n     10,   0,   0,   0,  54,   0, \n      0,   5, 130,   0,  16,   0, \n      7,   0,   0,   0,  26,   0, \n     16,   0,  10,   0,   0,   0, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      4,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0, 150,   3, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  54,   0,   0,   5, \n     82,   0,  16,   0,  11,   0, \n      0,   0,   6,   1,  16,   0, \n     10,   0,   0,   0,  54,   0, \n      0,   5, 162,   0,  16,   0, \n     11,   0,   0,   0,  86,   9, \n     16,   0,   7,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10,  50,   0,  16,   0, \n      8,   0,   0,   0,  70,   0, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  52,   0,   0,  10, \n     50,   0,  16,   0,   6,   0, \n      0,   0, 230,  10,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  98,   0, \n     16,   0,   7,   0,   0,   0, \n    166,  11,  16,   0,  10,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0, 214,   2,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10,  50,   0, \n     16,   0,   9,   0,   0,   0, \n     70,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0,   0,   0, \n      0,   0,   0,   0,  52,   0, \n      0,  10,  50,   0,  16,   0, \n      7,   0,   0,   0, 230,  10, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0, 150,   3,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    131,   0,   0,   5,  18,   0, \n     16,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,   7,   0, \n      0,   0, 131,   0,   0,   5, \n     34,   0,  16,   0,   8,   0, \n      0,   0,  10,   0,  16,   0, \n     10,   0,   0,   0, 131,   0, \n      0,   5,  18,   0,  16,   0, \n      6,   0,   0,   0,  42,   0, \n     16,   0,   7,   0,   0,   0, \n    131,   0,   0,   5,  34,   0, \n     16,   0,   6,   0,   0,   0, \n     26,   0,  16,   0,  10,   0, \n      0,   0, 131,   0,   0,   5, \n     18,   0,  16,   0,   9,   0, \n      0,   0,  58,   0,  16,   0, \n      7,   0,   0,   0, 131,   0, \n      0,   5,  34,   0,  16,   0, \n      9,   0,   0,   0,  42,   0, \n     16,   0,  10,   0,   0,   0, \n    131,   0,   0,   5,  18,   0, \n     16,   0,   7,   0,   0,   0, \n     10,   0,  16,   0,   7,   0, \n      0,   0, 131,   0,   0,   5, \n     34,   0,  16,   0,   7,   0, \n      0,   0,  58,   0,  16,   0, \n     10,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,  10,   0, \n      0,   1,  54,   0,   0,   5, \n     18,   0,  16,   0,   8,   0, \n      0,   0,  26,   0,  16,   0, \n      7,   0,   0,   0,  54,   0, \n      0,   8, 226,   0,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   6,   0,   0,   0, \n     42,   0,  16,   0,   7,   0, \n      0,   0,  54,   0,   0,   8, \n    226,   0,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      9,   0,   0,   0,  58,   0, \n     16,   0,   7,   0,   0,   0, \n     54,   0,   0,   8, 226,   0, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    226,   0,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   1,  23,   0,   0,   1, \n     21,   0,   0,   1,  80,   0, \n      0,   7, 130,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  31,   0,   4,   3, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  56,   0,   0,   7, \n    130,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,  63, \n     30,   0,   0,   7,  18,   0, \n     16,   0,   5,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     64,   1,   0,   0,  31,   0, \n      4,   3,  58,   0,  16,   0, \n      5,   0,   0,   0,  32,   0, \n      0,   7,  34,   0,  16,   0, \n      5,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   8,   0, \n      0,   0,  31,   0,   4,   3, \n     26,   0,  16,   0,   5,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  10,   0,  16,   0, \n      5,   0,   0,   0, 230, 116, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  34,   0,  16,   0, \n      5,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  80,   1, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  26,   0,  16,   0, \n      5,   0,   0,   0, 230, 116, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  50,   0,  16,   0, \n     12,   0,   0,   0, 230,  10, \n     16,   0,  10,   0,   0,   0, \n     54,   0,   0,   5,  50,   0, \n     16,   0,  14,   0,   0,   0, \n    230,  10,  16,   0,  11,   0, \n      0,   0,  18,   0,   0,   1, \n    165,   0,   0,   8,  50,   0, \n     16,   0,  12,   0,   0,   0, \n     10,   0,  16,   0,   5,   0, \n      0,   0,  70, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     34,   0,  16,   0,   5,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   5,   0,   0,   0, \n    165,   0,   0,   8,  50,   0, \n     16,   0,  10,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0,  70, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n     50,   0,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,  13,   0,   0,   0, \n      6,   0,  16,   0,   5,   0, \n      0,   0,  70,   0,  16,   0, \n     13,   0,   0,   0, 165,   0, \n      0,   8,  50,   0,  16,   0, \n     14,   0,   0,   0,  10,   0, \n     16,   0,  13,   0,   0,   0, \n     70, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    165,   0,   0,   8,  50,   0, \n     16,   0,  11,   0,   0,   0, \n     26,   0,  16,   0,  13,   0, \n      0,   0,  70, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     76,   0,   0,   3,  42,   0, \n     16,   0,   5,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   5,   0,   0,   0, \n     41,   0,   0,  10, 194,   0, \n     16,   0,  12,   0,   0,   0, \n      6,   4,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  38,   7, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n     41,   0,   0,  10, 194,   0, \n     16,   0,  10,   0,   0,   0, \n      6,   4,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  38,   7, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n     41,   0,   0,  10, 194,   0, \n     16,   0,  14,   0,   0,   0, \n      6,   4,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  38,   7, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n    242,   0,  16,   0,  14,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n     41,   0,   0,  10, 194,   0, \n     16,   0,  11,   0,   0,   0, \n      6,   4,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  38,   7, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      7,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n     13,   0,   0,   0,  70,   0, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 131,   0,   0,   5, \n     82,   0,  16,   0,  12,   0, \n      0,   0,   6,   1,  16,   0, \n     12,   0,   0,   0, 131,   0, \n      0,   5, 162,   0,  16,   0, \n     12,   0,   0,   0,   6,   4, \n     16,   0,  13,   0,   0,   0, \n     85,   0,   0,  10,  50,   0, \n     16,   0,  13,   0,   0,   0, \n     70,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 131,   0, \n      0,   5,  82,   0,  16,   0, \n     10,   0,   0,   0,   6,   1, \n     16,   0,  10,   0,   0,   0, \n    131,   0,   0,   5, 162,   0, \n     16,   0,  10,   0,   0,   0, \n      6,   4,  16,   0,  13,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,  13,   0, \n      0,   0,  70,   0,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    131,   0,   0,   5,  82,   0, \n     16,   0,  14,   0,   0,   0, \n      6,   1,  16,   0,  14,   0, \n      0,   0, 131,   0,   0,   5, \n    162,   0,  16,   0,  14,   0, \n      0,   0,   6,   4,  16,   0, \n     13,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n     13,   0,   0,   0,  70,   0, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 131,   0,   0,   5, \n     82,   0,  16,   0,  11,   0, \n      0,   0,   6,   1,  16,   0, \n     11,   0,   0,   0, 131,   0, \n      0,   5, 162,   0,  16,   0, \n     11,   0,   0,   0,   6,   4, \n     16,   0,  13,   0,   0,   0, \n      2,   0,   0,   1,  10,   0, \n      0,   1,  54,   0,   0,   8, \n    194,   0,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   1,  23,   0,   0,   1, \n     18,   0,   0,   1,  32,   0, \n      0,   7,  34,   0,  16,   0, \n      5,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  31,   0,   4,   3, \n     26,   0,  16,   0,   5,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  10,   0,  16,   0, \n      5,   0,   0,   0,  54, 121, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  18,   0, \n      0,   1, 165,   0,   0,   8, \n     34,   0,  16,   0,  11,   0, \n      0,   0,  10,   0,  16,   0, \n      5,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  34,   0,  16,   0, \n      5,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   5,   0, \n      0,   0, 165,   0,   0,   8, \n     66,   0,  16,   0,  11,   0, \n      0,   0,  26,   0,  16,   0, \n      5,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10,  50,   0,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n     12,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,  13,   0, \n      0,   0,   6,   0,  16,   0, \n      5,   0,   0,   0,  70,   0, \n     16,   0,  13,   0,   0,   0, \n    165,   0,   0,   8, 130,   0, \n     16,   0,  11,   0,   0,   0, \n     10,   0,  16,   0,  13,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n     18,   0,  16,   0,  11,   0, \n      0,   0,  26,   0,  16,   0, \n     13,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  76,   0,   0,   3, \n     42,   0,  16,   0,   5,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,   0,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,  13,   0, \n      0,   0,  86,   5,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  13,   0,   0,   0, \n     26,   0,  16,   0,  11,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  13,   0,   0,   0, \n    166,  10,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  16,   0,   0,   0, \n     24,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     13,   0,   0,   0,  42,   0, \n     16,   0,  11,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     13,   0,   0,   0, 246,  15, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     16,   0,   0,   0,  24,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  13,   0, \n      0,   0,  58,   0,  16,   0, \n     11,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     14,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59,  85,   0,   0,  10, \n    226,   0,  16,   0,  11,   0, \n      0,   0,   6,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,  10,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,  13,   0, \n      0,   0,  86,   5,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  13,   0,   0,   0, \n     26,   0,  16,   0,  11,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   3,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   8,  32, 128,  58, \n      8,  32, 128,  58,   8,  32, \n    128,  58, 171, 170, 170,  62, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  13,   0,   0,   0, \n    166,  10,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     30,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     13,   0,   0,   0,  42,   0, \n     16,   0,  11,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      3,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      8,  32, 128,  58,   8,  32, \n    128,  58,   8,  32, 128,  58, \n    171, 170, 170,  62,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     13,   0,   0,   0, 246,  15, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  13,   0, \n      0,   0,  58,   0,  16,   0, \n     11,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   3,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     14,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   8,  32, \n    128,  58,   8,  32, 128,  58, \n      8,  32, 128,  58, 171, 170, \n    170,  62,  85,   0,   0,  10, \n    226,   0,  16,   0,  11,   0, \n      0,   0,   6,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      3,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      8,  32, 128,  58,   8,  32, \n    128,  58,   8,  32, 128,  58, \n    171, 170, 170,  62,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  86,   9,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,  30,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  15,   0,   0,   0, \n     26,   0,  16,   0,  11,   0, \n      0,   0,  54,   0,   0,   5, \n     98,   0,  16,   0,  15,   0, \n      0,   0,   6,   1,  16,   0, \n     13,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n    138,   0,   0,  15, 114,   0, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n    135,   0,   0,   5, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0, 232, 255, 255, 255, \n    232, 255, 255, 255, 232, 255, \n    255, 255,   0,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  11, 114,   0, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16, 128,  65,   0, \n      0,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0, 140,   0,   0,  17, \n    114,   0,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     86,   0,   0,   5,  50,   0, \n     16,   0,  13,   0,   0,   0, \n    230,  10,  16,   0,  13,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0, 230,  11,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  16,   0,   0,   0, \n     42,   0,  16,   0,  11,   0, \n      0,   0,  54,   0,   0,   5, \n     98,   0,  16,   0,  16,   0, \n      0,   0,   6,   3,  16,   0, \n     15,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n    138,   0,   0,  15, 114,   0, \n     16,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n    135,   0,   0,   5, 114,   0, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0, 232, 255, 255, 255, \n    232, 255, 255, 255, 232, 255, \n    255, 255,   0,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  11, 114,   0, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16, 128,  65,   0, \n      0,   0,  20,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  21,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  21,   0, \n      0,   0, 140,   0,   0,  17, \n    114,   0,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n     21,   0,   0,   0,   2,  64, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  10,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  15,   0,   0,   0, \n     58,   0,  16,   0,  11,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 114,   0,  16,   0, \n     18,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0, 135,   0, \n      0,   5, 114,   0,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n    232, 255, 255, 255, 232, 255, \n    255, 255, 232, 255, 255, 255, \n      0,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  11, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16, 128,  65,   0,   0,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  20,   0,   0,   0, \n    140,   0,   0,  17, 114,   0, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,   2,  64,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  54,   0, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,  30,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,  86,   0,   0,   5, \n    194,   0,  16,   0,  13,   0, \n      0,   0,   6,  12,  16,   0, \n     15,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     15,   0,   0,   0,  10,   0, \n     16,   0,  11,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  16,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0, 135,   0,   0,   5, \n    114,   0,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     17,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n      2,  64,   0,   0, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255,   0,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  11, \n    114,   0,  16,   0,  20,   0, \n      0,   0,  70,   2,  16, 128, \n     65,   0,   0,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0, 140,   0, \n      0,  17, 114,   0,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  20,   0,   0,   0, \n      2,  64,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     17,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  11,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0, 171, 170, 170,  62, \n    171, 170, 170,  62, 171, 170, \n    170,  62, 171, 170, 170,  62, \n     54,   0,   0,   5, 130,   0, \n     16,   0,  12,   0,   0,   0, \n     10,   0,  16,   0,  13,   0, \n      0,   0,  54,   0,   0,   5, \n    130,   0,  16,   0,  10,   0, \n      0,   0,  26,   0,  16,   0, \n     13,   0,   0,   0,  54,   0, \n      0,   5, 130,   0,  16,   0, \n     14,   0,   0,   0,  42,   0, \n     16,   0,  13,   0,   0,   0, \n     54,   0,   0,   5, 130,   0, \n     16,   0,  11,   0,   0,   0, \n     58,   0,  16,   0,  13,   0, \n      0,   0,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,  13,   0,   0,   0, \n    150,   3,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  54,   0, \n      0,   5,  82,   0,  16,   0, \n     15,   0,   0,   0,   6,   1, \n     16,   0,  13,   0,   0,   0, \n     54,   0,   0,   5, 162,   0, \n     16,   0,  15,   0,   0,   0, \n     86,   9,  16,   0,  11,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10,  50,   0, \n     16,   0,  12,   0,   0,   0, \n     70,   0,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0,   0,   0, \n      0,   0,   0,   0,  52,   0, \n      0,  10,  50,   0,  16,   0, \n     10,   0,   0,   0, 230,  10, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     98,   0,  16,   0,  11,   0, \n      0,   0, 166,  11,  16,   0, \n     13,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0, 214,   2, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n     50,   0,  16,   0,  14,   0, \n      0,   0,  70,   0,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     52,   0,   0,  10,  50,   0, \n     16,   0,  11,   0,   0,   0, \n    230,  10,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      6,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0, 150,   3, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 131,   0,   0,   5, \n     18,   0,  16,   0,  12,   0, \n      0,   0,  26,   0,  16,   0, \n     11,   0,   0,   0, 131,   0, \n      0,   5,  34,   0,  16,   0, \n     12,   0,   0,   0,  10,   0, \n     16,   0,  13,   0,   0,   0, \n    131,   0,   0,   5,  18,   0, \n     16,   0,  10,   0,   0,   0, \n     42,   0,  16,   0,  11,   0, \n      0,   0, 131,   0,   0,   5, \n     34,   0,  16,   0,  10,   0, \n      0,   0,  26,   0,  16,   0, \n     13,   0,   0,   0, 131,   0, \n      0,   5,  18,   0,  16,   0, \n     14,   0,   0,   0,  58,   0, \n     16,   0,  11,   0,   0,   0, \n    131,   0,   0,   5,  34,   0, \n     16,   0,  14,   0,   0,   0, \n     42,   0,  16,   0,  13,   0, \n      0,   0, 131,   0,   0,   5, \n     18,   0,  16,   0,  11,   0, \n      0,   0,  10,   0,  16,   0, \n     11,   0,   0,   0, 131,   0, \n      0,   5,  34,   0,  16,   0, \n     11,   0,   0,   0,  58,   0, \n     16,   0,  13,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   1, \n     10,   0,   0,   1,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     12,   0,   0,   0,  26,   0, \n     16,   0,  11,   0,   0,   0, \n     54,   0,   0,   8, 226,   0, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  10,   0, \n      0,   0,  42,   0,  16,   0, \n     11,   0,   0,   0,  54,   0, \n      0,   8, 226,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  14,   0,   0,   0, \n     58,   0,  16,   0,  11,   0, \n      0,   0,  54,   0,   0,   8, \n    226,   0,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 226,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,  23,   0, \n      0,   1,  21,   0,   0,   1, \n      0,   0,   0,   7, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,   0,   0, \n      0,   7, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   0,   0,   0,   7, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,  14,   0,   0,   0, \n      0,   0,   0,   7, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  80,   0, \n      0,   7,  34,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  31,   0,   4,   3, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  41,   0,   0,   7, \n     34,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  58,   0, \n     16,   0,   5,   0,   0,   0, \n     56,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0, 128,  62,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  31,   0,   4,   3, \n     58,   0,  16,   0,   5,   0, \n      0,   0,  32,   0,   0,   7, \n     34,   0,  16,   0,   5,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   5,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0, 230, 116,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     34,   0,  16,   0,   5,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0, 230, 116,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     50,   0,  16,   0,  12,   0, \n      0,   0, 230,  10,  16,   0, \n     10,   0,   0,   0,  54,   0, \n      0,   5,  50,   0,  16,   0, \n     14,   0,   0,   0, 230,  10, \n     16,   0,  11,   0,   0,   0, \n     18,   0,   0,   1, 165,   0, \n      0,   8,  50,   0,  16,   0, \n     12,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     70, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  34,   0, \n     16,   0,   5,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8,  50,   0,  16,   0, \n     10,   0,   0,   0,  26,   0, \n     16,   0,   5,   0,   0,   0, \n     70, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     41,   0,   0,  10,  50,   0, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,  12,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  86,   5,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  50,   0,  16,   0, \n     13,   0,   0,   0,   6,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,  13,   0, \n      0,   0, 165,   0,   0,   8, \n     50,   0,  16,   0,  14,   0, \n      0,   0,  10,   0,  16,   0, \n     13,   0,   0,   0,  70, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8,  50,   0,  16,   0, \n     11,   0,   0,   0,  26,   0, \n     16,   0,  13,   0,   0,   0, \n     70, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  76,   0, \n      0,   3,  42,   0,  16,   0, \n      5,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      5,   0,   0,   0,  41,   0, \n      0,  10, 194,   0,  16,   0, \n     12,   0,   0,   0,   6,   4, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  38,   7,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,  41,   0, \n      0,  10, 194,   0,  16,   0, \n     10,   0,   0,   0,   6,   4, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  38,   7,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,  41,   0, \n      0,  10, 194,   0,  16,   0, \n     14,   0,   0,   0,   6,   4, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  38,   7,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10, 242,   0, \n     16,   0,  14,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,  41,   0, \n      0,  10, 194,   0,  16,   0, \n     11,   0,   0,   0,   6,   4, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  38,   7,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,  13,   0, \n      0,   0,  70,   0,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    131,   0,   0,   5,  82,   0, \n     16,   0,  12,   0,   0,   0, \n      6,   1,  16,   0,  12,   0, \n      0,   0, 131,   0,   0,   5, \n    162,   0,  16,   0,  12,   0, \n      0,   0,   6,   4,  16,   0, \n     13,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n     13,   0,   0,   0,  70,   0, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 131,   0,   0,   5, \n     82,   0,  16,   0,  10,   0, \n      0,   0,   6,   1,  16,   0, \n     10,   0,   0,   0, 131,   0, \n      0,   5, 162,   0,  16,   0, \n     10,   0,   0,   0,   6,   4, \n     16,   0,  13,   0,   0,   0, \n     85,   0,   0,  10,  50,   0, \n     16,   0,  13,   0,   0,   0, \n     70,   0,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 131,   0, \n      0,   5,  82,   0,  16,   0, \n     14,   0,   0,   0,   6,   1, \n     16,   0,  14,   0,   0,   0, \n    131,   0,   0,   5, 162,   0, \n     16,   0,  14,   0,   0,   0, \n      6,   4,  16,   0,  13,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,  13,   0, \n      0,   0,  70,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    131,   0,   0,   5,  82,   0, \n     16,   0,  11,   0,   0,   0, \n      6,   1,  16,   0,  11,   0, \n      0,   0, 131,   0,   0,   5, \n    162,   0,  16,   0,  11,   0, \n      0,   0,   6,   4,  16,   0, \n     13,   0,   0,   0,   2,   0, \n      0,   1,  10,   0,   0,   1, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   1, \n     23,   0,   0,   1,  18,   0, \n      0,   1,  32,   0,   0,   7, \n     34,   0,  16,   0,   5,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   5,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  54, 121,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  18,   0,   0,   1, \n    165,   0,   0,   8,  34,   0, \n     16,   0,  11,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     34,   0,  16,   0,   5,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n    165,   0,   0,   8,  66,   0, \n     16,   0,  11,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n     50,   0,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,  13,   0,   0,   0, \n      6,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n     13,   0,   0,   0, 165,   0, \n      0,   8, 130,   0,  16,   0, \n     11,   0,   0,   0,  10,   0, \n     16,   0,  13,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    165,   0,   0,   8,  18,   0, \n     16,   0,  11,   0,   0,   0, \n     26,   0,  16,   0,  13,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     76,   0,   0,   3,  42,   0, \n     16,   0,   5,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   0,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  13,   0,   0,   0, \n     86,   5,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  16,   0,   0,   0, \n     24,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     13,   0,   0,   0,  26,   0, \n     16,   0,  11,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     13,   0,   0,   0, 166,  10, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     16,   0,   0,   0,  24,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  13,   0, \n      0,   0,  42,   0,  16,   0, \n     11,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59,  85,   0,   0,  10, \n    226,   0,  16,   0,  13,   0, \n      0,   0, 246,  15,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  13,   0,   0,   0, \n     58,   0,  16,   0,  11,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  14,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  11,   0,   0,   0, \n      6,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  16,   0,   0,   0, \n     24,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,  10,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  13,   0,   0,   0, \n     86,   5,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     30,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     13,   0,   0,   0,  26,   0, \n     16,   0,  11,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      3,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      8,  32, 128,  58,   8,  32, \n    128,  58,   8,  32, 128,  58, \n    171, 170, 170,  62,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     13,   0,   0,   0, 166,  10, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  13,   0, \n      0,   0,  42,   0,  16,   0, \n     11,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   3,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   8,  32, \n    128,  58,   8,  32, 128,  58, \n      8,  32, 128,  58, 171, 170, \n    170,  62,  85,   0,   0,  10, \n    226,   0,  16,   0,  13,   0, \n      0,   0, 246,  15,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  13,   0,   0,   0, \n     58,   0,  16,   0,  11,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   3,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  14,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   8,  32, 128,  58, \n      8,  32, 128,  58,   8,  32, \n    128,  58, 171, 170, 170,  62, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  11,   0,   0,   0, \n      6,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     30,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   3,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   8,  32, \n    128,  58,   8,  32, 128,  58, \n      8,  32, 128,  58, 171, 170, \n    170,  62,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     86,   9,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n     30,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     15,   0,   0,   0,  26,   0, \n     16,   0,  11,   0,   0,   0, \n     54,   0,   0,   5,  98,   0, \n     16,   0,  15,   0,   0,   0, \n      6,   1,  16,   0,  13,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 114,   0,  16,   0, \n     18,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0, 135,   0, \n      0,   5, 114,   0,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n    232, 255, 255, 255, 232, 255, \n    255, 255, 232, 255, 255, 255, \n      0,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  11, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16, 128,  65,   0,   0,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  20,   0,   0,   0, \n    140,   0,   0,  17, 114,   0, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,   2,  64,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   0, \n      0,   5,  50,   0,  16,   0, \n     13,   0,   0,   0, 230,  10, \n     16,   0,  13,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,  15,   0,   0,   0, \n    230,  11,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     16,   0,   0,   0,  42,   0, \n     16,   0,  11,   0,   0,   0, \n     54,   0,   0,   5,  98,   0, \n     16,   0,  16,   0,   0,   0, \n      6,   3,  16,   0,  15,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 114,   0,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0, 135,   0, \n      0,   5, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,   2,  64,   0,   0, \n    232, 255, 255, 255, 232, 255, \n    255, 255, 232, 255, 255, 255, \n      0,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  11, 114,   0,  16,   0, \n     21,   0,   0,   0,  70,   2, \n     16, 128,  65,   0,   0,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  21,   0,   0,   0, \n    140,   0,   0,  17, 114,   0, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  16,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  21,   0, \n      0,   0,   2,  64,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 114,   0, \n     16,   0,  16,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     10,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     15,   0,   0,   0,  58,   0, \n     16,   0,  11,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  16,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0, 135,   0,   0,   5, \n    114,   0,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     17,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n      2,  64,   0,   0, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255,   0,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  11, \n    114,   0,  16,   0,  20,   0, \n      0,   0,  70,   2,  16, 128, \n     65,   0,   0,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0, 140,   0, \n      0,  17, 114,   0,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  20,   0,   0,   0, \n      2,  64,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     17,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  14,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  54,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,  30,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n     86,   0,   0,   5, 194,   0, \n     16,   0,  13,   0,   0,   0, \n      6,  12,  16,   0,  15,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  15,   0, \n      0,   0,  10,   0,  16,   0, \n     11,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n    138,   0,   0,  15, 114,   0, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n    135,   0,   0,   5, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0, 232, 255, 255, 255, \n    232, 255, 255, 255, 232, 255, \n    255, 255,   0,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  11, 114,   0, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16, 128,  65,   0, \n      0,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0, 140,   0,   0,  17, \n    114,   0,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  11,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n    171, 170, 170,  62, 171, 170, \n    170,  62, 171, 170, 170,  62, \n    171, 170, 170,  62,  54,   0, \n      0,   5, 130,   0,  16,   0, \n     12,   0,   0,   0,  10,   0, \n     16,   0,  13,   0,   0,   0, \n     54,   0,   0,   5, 130,   0, \n     16,   0,  10,   0,   0,   0, \n     26,   0,  16,   0,  13,   0, \n      0,   0,  54,   0,   0,   5, \n    130,   0,  16,   0,  14,   0, \n      0,   0,  42,   0,  16,   0, \n     13,   0,   0,   0,  54,   0, \n      0,   5, 130,   0,  16,   0, \n     11,   0,   0,   0,  58,   0, \n     16,   0,  13,   0,   0,   0, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      4,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0, 150,   3, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  54,   0,   0,   5, \n     82,   0,  16,   0,  15,   0, \n      0,   0,   6,   1,  16,   0, \n     13,   0,   0,   0,  54,   0, \n      0,   5, 162,   0,  16,   0, \n     15,   0,   0,   0,  86,   9, \n     16,   0,  11,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10,  50,   0,  16,   0, \n     12,   0,   0,   0,  70,   0, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  52,   0,   0,  10, \n     50,   0,  16,   0,  10,   0, \n      0,   0, 230,  10,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  98,   0, \n     16,   0,  11,   0,   0,   0, \n    166,  11,  16,   0,  13,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0, 214,   2,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10,  50,   0, \n     16,   0,  14,   0,   0,   0, \n     70,   0,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0,   0,   0, \n      0,   0,   0,   0,  52,   0, \n      0,  10,  50,   0,  16,   0, \n     11,   0,   0,   0, 230,  10, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0, 150,   3,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    131,   0,   0,   5,  18,   0, \n     16,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,  11,   0, \n      0,   0, 131,   0,   0,   5, \n     34,   0,  16,   0,  12,   0, \n      0,   0,  10,   0,  16,   0, \n     13,   0,   0,   0, 131,   0, \n      0,   5,  18,   0,  16,   0, \n     10,   0,   0,   0,  42,   0, \n     16,   0,  11,   0,   0,   0, \n    131,   0,   0,   5,  34,   0, \n     16,   0,  10,   0,   0,   0, \n     26,   0,  16,   0,  13,   0, \n      0,   0, 131,   0,   0,   5, \n     18,   0,  16,   0,  14,   0, \n      0,   0,  58,   0,  16,   0, \n     11,   0,   0,   0, 131,   0, \n      0,   5,  34,   0,  16,   0, \n     14,   0,   0,   0,  42,   0, \n     16,   0,  13,   0,   0,   0, \n    131,   0,   0,   5,  18,   0, \n     16,   0,  11,   0,   0,   0, \n     10,   0,  16,   0,  11,   0, \n      0,   0, 131,   0,   0,   5, \n     34,   0,  16,   0,  11,   0, \n      0,   0,  58,   0,  16,   0, \n     13,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,  10,   0, \n      0,   1,  54,   0,   0,   5, \n     18,   0,  16,   0,  12,   0, \n      0,   0,  26,   0,  16,   0, \n     11,   0,   0,   0,  54,   0, \n      0,   8, 226,   0,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  10,   0,   0,   0, \n     42,   0,  16,   0,  11,   0, \n      0,   0,  54,   0,   0,   8, \n    226,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     14,   0,   0,   0,  58,   0, \n     16,   0,  11,   0,   0,   0, \n     54,   0,   0,   8, 226,   0, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    226,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   1,  23,   0,   0,   1, \n     21,   0,   0,   1,   0,   0, \n      0,   7, 242,   0,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,   0,   0,   0,   7, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      0,   0,   0,   7, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n     14,   0,   0,   0,   0,   0, \n      0,   7, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   5,   0,   0,   0, \n     31,   0,   4,   3,  58,   0, \n     16,   0,   5,   0,   0,   0, \n     32,   0,   0,   7,  34,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      2,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n     14,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n    230, 116,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  34,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n     15,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n    230, 116,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  50,   0, \n     16,   0,  16,   0,   0,   0, \n    230,  10,  16,   0,  14,   0, \n      0,   0,  54,   0,   0,   5, \n     50,   0,  16,   0,  17,   0, \n      0,   0, 230,  10,  16,   0, \n     15,   0,   0,   0,  18,   0, \n      0,   1, 165,   0,   0,   8, \n     50,   0,  16,   0,  16,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  70, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  34,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n     50,   0,  16,   0,  14,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  70, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10,  50,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n     12,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   5,   0, \n      0,   0,   6,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   5,   0,   0,   0, \n    165,   0,   0,   8,  50,   0, \n     16,   0,  17,   0,   0,   0, \n     10,   0,  16,   0,   5,   0, \n      0,   0,  70, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n     50,   0,  16,   0,  15,   0, \n      0,   0,  26,   0,  16,   0, \n      5,   0,   0,   0,  70, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  76,   0,   0,   3, \n     42,   0,  16,   0,   5,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  41,   0,   0,  10, \n    194,   0,  16,   0,  16,   0, \n      0,   0,   6,   4,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,  18,   0,   0,   0, \n     38,   7,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     18,   0,   0,   0,  70,  14, \n     16,   0,  18,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  18,   0,   0,   0, \n     70,  14,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10, 242,   0,  16,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,  41,   0,   0,  10, \n    194,   0,  16,   0,  14,   0, \n      0,   0,   6,   4,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,  18,   0,   0,   0, \n     38,   7,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     18,   0,   0,   0,  70,  14, \n     16,   0,  18,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  18,   0,   0,   0, \n     70,  14,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10, 242,   0,  16,   0, \n     14,   0,   0,   0,  70,  14, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,  41,   0,   0,  10, \n    194,   0,  16,   0,  17,   0, \n      0,   0,   6,   4,  16,   0, \n     17,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,  18,   0,   0,   0, \n     38,   7,  16,   0,  17,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     18,   0,   0,   0,  70,  14, \n     16,   0,  18,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  18,   0,   0,   0, \n     70,  14,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10, 242,   0,  16,   0, \n     17,   0,   0,   0,  70,  14, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,  41,   0,   0,  10, \n    194,   0,  16,   0,  15,   0, \n      0,   0,   6,   4,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,  18,   0,   0,   0, \n     38,   7,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     18,   0,   0,   0,  70,  14, \n     16,   0,  18,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  18,   0,   0,   0, \n     70,  14,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     85,   0,   0,  10,  50,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   0,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 131,   0, \n      0,   5,  82,   0,  16,   0, \n     16,   0,   0,   0,   6,   1, \n     16,   0,  16,   0,   0,   0, \n    131,   0,   0,   5, 162,   0, \n     16,   0,  16,   0,   0,   0, \n      6,   4,  16,   0,   5,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   5,   0, \n      0,   0,  70,   0,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    131,   0,   0,   5,  82,   0, \n     16,   0,  14,   0,   0,   0, \n      6,   1,  16,   0,  14,   0, \n      0,   0, 131,   0,   0,   5, \n    162,   0,  16,   0,  14,   0, \n      0,   0,   6,   4,  16,   0, \n      5,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      5,   0,   0,   0,  70,   0, \n     16,   0,  17,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 131,   0,   0,   5, \n     82,   0,  16,   0,  17,   0, \n      0,   0,   6,   1,  16,   0, \n     17,   0,   0,   0, 131,   0, \n      0,   5, 162,   0,  16,   0, \n     17,   0,   0,   0,   6,   4, \n     16,   0,   5,   0,   0,   0, \n     85,   0,   0,  10,  50,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   0,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 131,   0, \n      0,   5,  82,   0,  16,   0, \n     15,   0,   0,   0,   6,   1, \n     16,   0,  15,   0,   0,   0, \n    131,   0,   0,   5, 162,   0, \n     16,   0,  15,   0,   0,   0, \n      6,   4,  16,   0,   5,   0, \n      0,   0,   2,   0,   0,   1, \n     10,   0,   0,   1,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  17,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,  23,   0, \n      0,   1,  18,   0,   0,   1, \n     32,   0,   0,   7,  34,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      2,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n     15,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     54, 121,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     18,   0,   0,   1, 165,   0, \n      0,   8,  34,   0,  16,   0, \n     15,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8,  66,   0,  16,   0, \n     15,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     41,   0,   0,  10,  98,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     12,   0,   0,   0,   0,   0, \n      0,   0,  86,   5,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  98,   0,  16,   0, \n      1,   0,   0,   0,   6,   0, \n     16,   0,   0,   0,   0,   0, \n     86,   6,  16,   0,   1,   0, \n      0,   0, 165,   0,   0,   8, \n    130,   0,  16,   0,  15,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8,  18,   0,  16,   0, \n     15,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  76,   0, \n      0,   3,  42,   0,  16,   0, \n      5,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      0,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      1,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      5,   0,   0,   0,  86,   5, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     16,   0,   0,   0,  24,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   5,   0, \n      0,   0,  26,   0,  16,   0, \n     15,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59,  85,   0,   0,  10, \n    226,   0,  16,   0,   5,   0, \n      0,   0, 166,  10,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   5,   0,   0,   0, \n     42,   0,  16,   0,  15,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  14,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   5,   0,   0,   0, \n    246,  15,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  16,   0,   0,   0, \n     24,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      5,   0,   0,   0,  58,   0, \n     16,   0,  15,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  17,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     15,   0,   0,   0,   6,   0, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     16,   0,   0,   0,  24,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      2,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n     10,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      5,   0,   0,   0,  86,   5, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   5,   0, \n      0,   0,  26,   0,  16,   0, \n     15,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   3,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   8,  32, \n    128,  58,   8,  32, 128,  58, \n      8,  32, 128,  58, 171, 170, \n    170,  62,  85,   0,   0,  10, \n    226,   0,  16,   0,   5,   0, \n      0,   0, 166,  10,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   5,   0,   0,   0, \n     42,   0,  16,   0,  15,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   3,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  14,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   8,  32, 128,  58, \n      8,  32, 128,  58,   8,  32, \n    128,  58, 171, 170, 170,  62, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   5,   0,   0,   0, \n    246,  15,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     30,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      5,   0,   0,   0,  58,   0, \n     16,   0,  15,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      3,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  17,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      8,  32, 128,  58,   8,  32, \n    128,  58,   8,  32, 128,  58, \n    171, 170, 170,  62,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     15,   0,   0,   0,   6,   0, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   3,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   8,  32, 128,  58, \n      8,  32, 128,  58,   8,  32, \n    128,  58, 171, 170, 170,  62, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n     12,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  86,   9, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     30,   0,   0,   0,  30,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  18,   0, \n      0,   0,  26,   0,  16,   0, \n     15,   0,   0,   0,  54,   0, \n      0,   5,  98,   0,  16,   0, \n     18,   0,   0,   0,   6,   1, \n     16,   0,   5,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,  21,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0, 135,   0,   0,   5, \n    114,   0,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     22,   0,   0,   0,  70,   2, \n     16,   0,  22,   0,   0,   0, \n      2,  64,   0,   0, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255,   0,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  22,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  11, \n    114,   0,  16,   0,  23,   0, \n      0,   0,  70,   2,  16, 128, \n     65,   0,   0,   0,  22,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     23,   0,   0,   0,  70,   2, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16,   0,  21,   0, \n      0,   0,  70,   2,  16,   0, \n     23,   0,   0,   0, 140,   0, \n      0,  17, 114,   0,  16,   0, \n     18,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  23,   0,   0,   0, \n      2,  64,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 114,   0,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  86,   0,   0,   5, \n     98,   0,  16,   0,   1,   0, \n      0,   0, 166,  11,  16,   0, \n      5,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0, 230,  11, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  18,   0, \n      0,   0,  42,   0,  16,   0, \n     15,   0,   0,   0,  54,   0, \n      0,   5,  98,   0,  16,   0, \n     18,   0,   0,   0,   6,   3, \n     16,   0,   5,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,  21,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0, 135,   0,   0,   5, \n    114,   0,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     22,   0,   0,   0,  70,   2, \n     16,   0,  22,   0,   0,   0, \n      2,  64,   0,   0, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255,   0,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  22,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  11, \n    114,   0,  16,   0,  23,   0, \n      0,   0,  70,   2,  16, 128, \n     65,   0,   0,   0,  22,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     23,   0,   0,   0,  70,   2, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16,   0,  21,   0, \n      0,   0,  70,   2,  16,   0, \n     23,   0,   0,   0, 140,   0, \n      0,  17, 114,   0,  16,   0, \n     18,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  23,   0,   0,   0, \n      2,  64,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 114,   0,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  14,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  56,   0,   0,  10, \n     98,   0,  16,   0,   1,   0, \n      0,   0,  86,   6,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n    171, 170, 170,  62, 171, 170, \n    170,  62,   0,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   5,   0,   0,   0, \n     58,   0,  16,   0,  15,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 114,   0,  16,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0, 135,   0, \n      0,   5, 114,   0,  16,   0, \n     21,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16,   0,  21,   0, \n      0,   0,   2,  64,   0,   0, \n    232, 255, 255, 255, 232, 255, \n    255, 255, 232, 255, 255, 255, \n      0,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     21,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  21,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  11, 114,   0,  16,   0, \n     22,   0,   0,   0,  70,   2, \n     16, 128,  65,   0,   0,   0, \n     21,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  22,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  22,   0,   0,   0, \n    140,   0,   0,  17, 114,   0, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     21,   0,   0,   0,  70,   2, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,   5,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,   5,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  22,   0, \n      0,   0,   2,  64,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,   5,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 114,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  54,   0, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,  30,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,  86,   0,   0,   5, \n     50,   0,  16,   0,  18,   0, \n      0,   0, 198,   0,  16,   0, \n      5,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      5,   0,   0,   0,  10,   0, \n     16,   0,  15,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,  21,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0, 135,   0,   0,   5, \n    114,   0,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     22,   0,   0,   0,  70,   2, \n     16,   0,  22,   0,   0,   0, \n      2,  64,   0,   0, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255,   0,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  22,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  11, \n    114,   0,  16,   0,  23,   0, \n      0,   0,  70,   2,  16, 128, \n     65,   0,   0,   0,  22,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     23,   0,   0,   0,  70,   2, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16,   0,  21,   0, \n      0,   0,  70,   2,  16,   0, \n     23,   0,   0,   0, 140,   0, \n      0,  17, 114,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n      5,   0,   0,   0,  70,   2, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  23,   0,   0,   0, \n      2,  64,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 114,   0,  16,   0, \n      5,   0,   0,   0,  70,   2, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  56,   0,   0,  10, \n     50,   0,  16,   0,   5,   0, \n      0,   0,  70,   0,  16,   0, \n     18,   0,   0,   0,   2,  64, \n      0,   0, 171, 170, 170,  62, \n    171, 170, 170,  62,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5, 130,   0, \n     16,   0,  16,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  54,   0,   0,   5, \n    130,   0,  16,   0,  14,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  54,   0, \n      0,   5, 130,   0,  16,   0, \n     17,   0,   0,   0,  10,   0, \n     16,   0,   5,   0,   0,   0, \n     54,   0,   0,   5, 130,   0, \n     16,   0,  15,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n    150,   3,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  54,   0, \n      0,   5,  82,   0,  16,   0, \n     18,   0,   0,   0,   6,   1, \n     16,   0,   5,   0,   0,   0, \n     54,   0,   0,   5, 162,   0, \n     16,   0,  18,   0,   0,   0, \n     86,   9,  16,   0,  15,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,  18,   0, \n      0,   0,  70,  14,  16,   0, \n     18,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  18,   0,   0,   0, \n     70,  14,  16,   0,  18,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  18,   0, \n      0,   0,  70,  14,  16,   0, \n     18,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10,  50,   0, \n     16,   0,  16,   0,   0,   0, \n     70,   0,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0,   0,   0, \n      0,   0,   0,   0,  52,   0, \n      0,  10,  50,   0,  16,   0, \n     14,   0,   0,   0, 230,  10, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     98,   0,  16,   0,  15,   0, \n      0,   0, 166,  11,  16,   0, \n      5,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0, 214,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n     50,   0,  16,   0,  17,   0, \n      0,   0,  70,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     52,   0,   0,  10,  50,   0, \n     16,   0,  15,   0,   0,   0, \n    230,  10,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  17,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      6,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0, 150,   3, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 131,   0,   0,   5, \n     18,   0,  16,   0,  16,   0, \n      0,   0,  26,   0,  16,   0, \n     15,   0,   0,   0, 131,   0, \n      0,   5,  34,   0,  16,   0, \n     16,   0,   0,   0,  10,   0, \n     16,   0,   5,   0,   0,   0, \n    131,   0,   0,   5,  18,   0, \n     16,   0,  14,   0,   0,   0, \n     42,   0,  16,   0,  15,   0, \n      0,   0, 131,   0,   0,   5, \n     34,   0,  16,   0,  14,   0, \n      0,   0,  26,   0,  16,   0, \n      5,   0,   0,   0, 131,   0, \n      0,   5,  18,   0,  16,   0, \n     17,   0,   0,   0,  58,   0, \n     16,   0,  15,   0,   0,   0, \n    131,   0,   0,   5,  34,   0, \n     16,   0,  17,   0,   0,   0, \n     42,   0,  16,   0,   5,   0, \n      0,   0, 131,   0,   0,   5, \n     18,   0,  16,   0,  15,   0, \n      0,   0,  10,   0,  16,   0, \n     15,   0,   0,   0, 131,   0, \n      0,   5,  34,   0,  16,   0, \n     15,   0,   0,   0,  58,   0, \n     16,   0,   5,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     17,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   1, \n     10,   0,   0,   1,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     16,   0,   0,   0,  26,   0, \n     16,   0,  15,   0,   0,   0, \n     54,   0,   0,   8, 226,   0, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  14,   0, \n      0,   0,  42,   0,  16,   0, \n     15,   0,   0,   0,  54,   0, \n      0,   8, 226,   0,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  17,   0,   0,   0, \n     58,   0,  16,   0,  15,   0, \n      0,   0,  54,   0,   0,   8, \n    226,   0,  16,   0,  17,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 226,   0,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,  23,   0, \n      0,   1,  21,   0,   0,   1, \n      0,   0,   0,   7, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   7, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  14,   0, \n      0,   0,   0,   0,   0,   7, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  17,   0,   0,   0, \n      0,   0,   0,   7, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,  18,   0, \n      0,   1,  54,   0,   0,   5, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,  21,   0, \n      0,   1,  21,   0,   0,   1, \n     56,   0,   0,   7, 242,   0, \n     16,   0,   5,   0,   0,   0, \n    246,  15,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,  56,   0, \n      0,   7, 242,   0,  16,   0, \n      6,   0,   0,   0, 246,  15, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  56,   0,   0,   7, \n    242,   0,  16,   0,   8,   0, \n      0,   0, 246,  15,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n     56,   0,   0,   7, 242,   0, \n     16,   0,   7,   0,   0,   0, \n    246,  15,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,  31,   0, \n      4,   3,  58,   0,  16,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  82,   0,  16,   0, \n      5,   0,   0,   0, 166,   8, \n     16,   0,   5,   0,   0,   0, \n     54,   0,   0,   5,  82,   0, \n     16,   0,   6,   0,   0,   0, \n    166,   8,  16,   0,   6,   0, \n      0,   0,  54,   0,   0,   5, \n     82,   0,  16,   0,   8,   0, \n      0,   0, 166,   8,  16,   0, \n      8,   0,   0,   0,  54,   0, \n      0,   5,  82,   0,  16,   0, \n      9,   0,   0,   0, 166,   8, \n     16,   0,   7,   0,   0,   0, \n     18,   0,   0,   1,  54,   0, \n      0,   5,  82,   0,  16,   0, \n      9,   0,   0,   0,   6,   2, \n     16,   0,   7,   0,   0,   0, \n     21,   0,   0,   1,  76,   0, \n      0,   3,  10,   0,  16,   0, \n      2,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      6,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n     14,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n     50,   0,   0,   0,  54,  32, \n      0,   5, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     50,   0,   0,  15, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 127,  67,   0,   0, \n    127,  67,   0,   0, 127,  67, \n      0,   0, 127,  67,   2,  64, \n      0,   0,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,  63,   0,   0,   0,  63, \n     28,   0,   0,   5, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n     10,   0,   0,   0,   1,  64, \n      0,   0,   0,   1,   0,   0, \n     10,   0,  16,   0,  10,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n     10,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   1,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,  10,   0, \n      0,   0,  58,   0,  16,   0, \n     10,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   1, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  54,  32,   0,   5, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  50,   0, \n      0,  15, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    127,  67,   0,   0, 127,  67, \n      0,   0, 127,  67,   0,   0, \n    127,  67,   2,  64,   0,   0, \n      0,   0,   0,  63,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,  28,   0, \n      0,   5, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,  11,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   1,   0,   0,  10,   0, \n     16,   0,  11,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,  11,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   1,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,  10,   0,   0,   0, \n     58,   0,  16,   0,  11,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   1,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     54,  32,   0,   5, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,  50,   0,   0,  15, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 127,  67, \n      0,   0, 127,  67,   0,   0, \n    127,  67,   0,   0, 127,  67, \n      2,  64,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,  63,  28,   0,   0,   5, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,  11,   0,   0,   0, \n      1,  64,   0,   0,   0,   1, \n      0,   0,  10,   0,  16,   0, \n     11,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,  11,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      1,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n     10,   0,   0,   0,  58,   0, \n     16,   0,  11,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   1,  10,   0,  16,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5, 162,   0,  16,   0, \n      9,   0,   0,   0,  86,  13, \n     16,   0,   7,   0,   0,   0, \n     54,  32,   0,   5, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,  50,   0,   0,  15, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 127,  67, \n      0,   0, 127,  67,   0,   0, \n    127,  67,   0,   0, 127,  67, \n      2,  64,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,  63,  28,   0,   0,   5, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,  11,   0,   0,   0, \n      1,  64,   0,   0,   0,   1, \n      0,   0,  10,   0,  16,   0, \n     11,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,  11,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      1,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9, 130,   0,  16,   0, \n     10,   0,   0,   0,  58,   0, \n     16,   0,  11,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   1,  10,   0,  16,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5, 242,   0,  16,   0, \n      9,   0,   0,   0, 118,   8, \n     16,   0,  10,   0,   0,   0, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      7,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n     54,   0,   0,   0,  54,  32, \n      0,   5, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     50,   0,   0,  15, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 192, 127,  68,   0, 192, \n    127,  68,   0, 192, 127,  68, \n      0,   0,  64,  64,   2,  64, \n      0,   0,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,  63,   0,   0,   0,  63, \n     28,   0,   0,   5, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n     10,   0,   0,   0,   1,  64, \n      0,   0,   0,   4,   0,   0, \n     10,   0,  16,   0,  10,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n     10,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,  16,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,  10,   0, \n      0,   0,  58,   0,  16,   0, \n     10,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,  64, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  54,  32,   0,   5, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  50,   0, \n      0,  15, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   0, 192, \n    127,  68,   0, 192, 127,  68, \n      0, 192, 127,  68,   0,   0, \n     64,  64,   2,  64,   0,   0, \n      0,   0,   0,  63,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,  28,   0, \n      0,   5, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,  11,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   4,   0,   0,  10,   0, \n     16,   0,  11,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,  11,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,  16,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,  10,   0,   0,   0, \n     58,   0,  16,   0,  11,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,  64,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     54,  32,   0,   5, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,  50,   0,   0,  15, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0, 192, 127,  68, \n      0, 192, 127,  68,   0, 192, \n    127,  68,   0,   0,  64,  64, \n      2,  64,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,  63,  28,   0,   0,   5, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,  11,   0,   0,   0, \n      1,  64,   0,   0,   0,   4, \n      0,   0,  10,   0,  16,   0, \n     11,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,  11,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n     16,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n     10,   0,   0,   0,  58,   0, \n     16,   0,  11,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  64,  10,   0,  16,   0, \n      0,   0,   0,   0,  54,  32, \n      0,   5,  82,   0,  16,   0, \n      7,   0,   0,   0,   6,   2, \n     16,   0,   9,   0,   0,   0, \n     54,  32,   0,   5, 162,   0, \n     16,   0,   7,   0,   0,   0, \n     86,  13,  16,   0,   7,   0, \n      0,   0,  50,   0,   0,  15, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   0, 192, 127,  68, \n      0, 192, 127,  68,   0, 192, \n    127,  68,   0,   0,  64,  64, \n      2,  64,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,  63,  28,   0,   0,   5, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,  11,   0,   0,   0, \n      1,  64,   0,   0,   0,   4, \n      0,   0,  10,   0,  16,   0, \n     11,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,  11,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n     16,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9, 130,   0,  16,   0, \n     10,   0,   0,   0,  58,   0, \n     16,   0,  11,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  64,  10,   0,  16,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5, 242,   0,  16,   0, \n      9,   0,   0,   0, 118,   8, \n     16,   0,  10,   0,   0,   0, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n     16,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n     55,   0,   0,   0,  54,  32, \n      0,   5, 114,   0,  16,   0, \n      5,   0,   0,   0,  70,   2, \n     16,   0,   5,   0,   0,   0, \n     50,   0,   0,  15, 226,   0, \n     16,   0,   1,   0,   0,   0, \n      6,   9,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0, 224, \n    255,  68,   0, 224, 255,  68, \n      0, 192, 127,  68,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,  63,   0,   0, \n      0,  63,   0,   0,   0,  63, \n     28,   0,   0,   5, 226,   0, \n     16,   0,   1,   0,   0,   0, \n     86,  14,  16,   0,   1,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   0,   8,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,  10,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,  64,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  54,  32,   0,   5, \n    114,   0,  16,   0,   6,   0, \n      0,   0,  70,   2,  16,   0, \n      6,   0,   0,   0,  50,   0, \n      0,  15, 226,   0,  16,   0, \n      1,   0,   0,   0,   6,   9, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0, 224, 255,  68, \n      0, 224, 255,  68,   0, 192, \n    127,  68,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,  28,   0, \n      0,   5, 226,   0,  16,   0, \n      1,   0,   0,   0,  86,  14, \n     16,   0,   1,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   8,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,  10,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,  64,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     54,  32,   0,   5, 114,   0, \n     16,   0,   8,   0,   0,   0, \n     70,   2,  16,   0,   8,   0, \n      0,   0,  50,   0,   0,  15, \n    226,   0,  16,   0,   1,   0, \n      0,   0,   6,   9,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0, 224, 255,  68,   0, 224, \n    255,  68,   0, 192, 127,  68, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,  63,  28,   0,   0,   5, \n    226,   0,  16,   0,   1,   0, \n      0,   0,  86,  14,  16,   0, \n      1,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   0,   8, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n     10,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n     64,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  54,  32, \n      0,   5,  82,   0,  16,   0, \n      7,   0,   0,   0,   6,   2, \n     16,   0,   9,   0,   0,   0, \n     54,  32,   0,   5,  34,   0, \n     16,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   7,   0, \n      0,   0,  50,   0,   0,  15, \n    226,   0,  16,   0,   1,   0, \n      0,   0,   6,   9,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0, 224, 255,  68,   0, 224, \n    255,  68,   0, 192, 127,  68, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,  63,  28,   0,   0,   5, \n    226,   0,  16,   0,   1,   0, \n      0,   0,  86,  14,  16,   0, \n      1,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   0,   8, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  35,   0, \n      0,   9, 130,   0,  16,   0, \n     10,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n     64,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5, 242,   0,  16,   0, \n      9,   0,   0,   0, 118,   8, \n     16,   0,  10,   0,   0,   0, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n     17,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n     56,   0,   0,   0,  54,  32, \n      0,   5, 114,   0,  16,   0, \n      5,   0,   0,   0,  70,   2, \n     16,   0,   5,   0,   0,   0, \n     50,   0,   0,  15, 226,   0, \n     16,   0,   1,   0,   0,   0, \n      6,   9,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0, 192, \n    127,  68,   0, 224, 255,  68, \n      0, 224, 255,  68,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,  63,   0,   0, \n      0,  63,   0,   0,   0,  63, \n     28,   0,   0,   5, 226,   0, \n     16,   0,   1,   0,   0,   0, \n     86,  14,  16,   0,   1,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   0,   4,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,  10,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,  32,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  54,  32,   0,   5, \n    114,   0,  16,   0,   6,   0, \n      0,   0,  70,   2,  16,   0, \n      6,   0,   0,   0,  50,   0, \n      0,  15, 226,   0,  16,   0, \n      1,   0,   0,   0,   6,   9, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0, 192, 127,  68, \n      0, 224, 255,  68,   0, 224, \n    255,  68,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,  28,   0, \n      0,   5, 226,   0,  16,   0, \n      1,   0,   0,   0,  86,  14, \n     16,   0,   1,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   4,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,  10,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,  32,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     54,  32,   0,   5, 114,   0, \n     16,   0,   8,   0,   0,   0, \n     70,   2,  16,   0,   8,   0, \n      0,   0,  50,   0,   0,  15, \n    226,   0,  16,   0,   1,   0, \n      0,   0,   6,   9,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0, 192, 127,  68,   0, 224, \n    255,  68,   0, 224, 255,  68, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,  63,  28,   0,   0,   5, \n    226,   0,  16,   0,   1,   0, \n      0,   0,  86,  14,  16,   0, \n      1,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   0,   4, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n     10,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n     32,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  54,  32, \n      0,   5,  82,   0,  16,   0, \n      7,   0,   0,   0,   6,   2, \n     16,   0,   9,   0,   0,   0, \n     54,  32,   0,   5,  34,   0, \n     16,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   7,   0, \n      0,   0,  50,   0,   0,  15, \n    226,   0,  16,   0,   1,   0, \n      0,   0,   6,   9,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0, 192, 127,  68,   0, 224, \n    255,  68,   0, 224, 255,  68, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,  63,  28,   0,   0,   5, \n    226,   0,  16,   0,   1,   0, \n      0,   0,  86,  14,  16,   0, \n      1,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   0,   4, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  35,   0, \n      0,   9, 130,   0,  16,   0, \n     10,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n     32,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5, 242,   0,  16,   0, \n      9,   0,   0,   0, 118,   8, \n     16,   0,  10,   0,   0,   0, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n     25,   0,   0,   0,  54,  32, \n      0,   5,  50,   0,  16,   0, \n      5,   0,   0,   0,  70,   0, \n     16,   0,   5,   0,   0,   0, \n     50,   0,   0,  15, 146,   0, \n     16,   0,   0,   0,   0,   0, \n      6,   4,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255, 127,  71,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0, 255, 127,  71,   2,  64, \n      0,   0,   0,   0,   0,  63, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,  63, \n     28,   0,   0,   5, 146,   0, \n     16,   0,   0,   0,   0,   0, \n      6,  12,  16,   0,   0,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   9,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   1,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  54,  32,   0,   5, \n     50,   0,  16,   0,   6,   0, \n      0,   0,  70,   0,  16,   0, \n      6,   0,   0,   0,  50,   0, \n      0,  15, 146,   0,  16,   0, \n      0,   0,   0,   0,   6,   4, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n    127,  71,   0,   0,   0,   0, \n      0,   0,   0,   0,   0, 255, \n    127,  71,   2,  64,   0,   0, \n      0,   0,   0,  63,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,  63,  28,   0, \n      0,   5, 146,   0,  16,   0, \n      0,   0,   0,   0,   6,  12, \n     16,   0,   0,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   9,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   1,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     54,  32,   0,   5,  50,   0, \n     16,   0,   8,   0,   0,   0, \n     70,   0,  16,   0,   8,   0, \n      0,   0,  50,   0,   0,  15, \n    146,   0,  16,   0,   0,   0, \n      0,   0,   6,   4,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0, 255, 127,  71, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0, 255, 127,  71, \n      2,  64,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,  63,  28,   0,   0,   5, \n    146,   0,  16,   0,   0,   0, \n      0,   0,   6,  12,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9, 130,   0,  16,   0, \n      9,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      1,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  54,  32, \n      0,   5,  18,   0,  16,   0, \n      7,   0,   0,   0,  10,   0, \n     16,   0,   9,   0,   0,   0, \n     54,  32,   0,   5,  34,   0, \n     16,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   7,   0, \n      0,   0,  50,   0,   0,  15, \n    146,   0,  16,   0,   0,   0, \n      0,   0,   6,   4,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   0, 255, 127,  71, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0, 255, 127,  71, \n      2,  64,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,  63,  28,   0,   0,   5, \n    146,   0,  16,   0,   0,   0, \n      0,   0,   6,  12,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      9,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      1,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,  31,   0, \n      0,   0, 130,   0,   0,   5, \n    146,   0,  16,   0,   0,   0, \n      0,   0,   6,   4,  16,   0, \n      5,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n      9,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      1,   0,  10,   0,  16,   0, \n      0,   0,   0,   0, 130,   0, \n      0,   5, 146,   0,  16,   0, \n      0,   0,   0,   0,   6,   4, \n     16,   0,   6,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   9,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   1,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n    130,   0,   0,   5, 146,   0, \n     16,   0,   0,   0,   0,   0, \n      6,   4,  16,   0,   8,   0, \n      0,   0,  35,   0,   0,   9, \n    130,   0,  16,   0,   9,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   1,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0, 130,   0,   0,   5, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      9,   0,   0,   0, 130,   0, \n      0,   5, 130,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   7,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   9,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   1,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,  10,   0, \n      0,   1,  54,   0,   0,   5, \n     66,   0,  16,   0,   9,   0, \n      0,   0,  10,   0,  16,   0, \n      5,   0,   0,   0,  54,   0, \n      0,   5,  34,   0,  16,   0, \n      9,   0,   0,   0,  10,   0, \n     16,   0,   6,   0,   0,   0, \n     54,   0,   0,   5, 130,   0, \n     16,   0,   9,   0,   0,   0, \n     10,   0,  16,   0,   8,   0, \n      0,   0,   2,   0,   0,   1, \n     23,   0,   0,   1,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  31,   0,   4,   3, \n     42,   0,  16,   0,   0,   0, \n      0,   0, 138,   0,   0,  11, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     42, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  66,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  10,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     42,   0,   0,   7, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0, 118,  15, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   4,   0, \n      0,   0,   5,   0,   0,   0, \n      1,   0,   0,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   5,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  18,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  25,   0, \n      0,   0,   1,  64,   0,   0, \n      7,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n    138,   0,   0,   9, 130,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n    140,   0,   0,  20,  98,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0, 166,  10, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11, 130,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  64,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n    139,   0,   0,  15, 226,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  28,   0,   0,   0, \n     27,   0,   0,   0,  24,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   3,   0,   0,   0, \n      6,   0,   0,   0,   6,   0, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  18,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     18,   0,   0,   1,  42,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n      1,   0,   0,   0,   4,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 140,   0,   0,  20, \n     50,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    230,  10,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11, 130,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     35,   0,   0,   9,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     64,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n    138,   0,   0,   9, 130,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n     42,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     35,   0,   0,   9, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     64,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0, 139,   0, \n      0,  15, 114,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  28,   0,   0,   0, \n     27,   0,   0,   0,  24,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   3,   0,   0,   0, \n      6,   0,   0,   0,   0,   0, \n      0,   0, 166,  10,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  66,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  66,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  30,   0,   0,   9, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  32,   0,   0,  10, \n    226,   0,  16,   0,   0,   0, \n      0,   0,  86,   5,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   7,  98,   0, \n     16,   0,   0,   0,   0,   0, \n    166,  11,  16,   0,   0,   0, \n      0,   0,  86,   6,  16,   0, \n      0,   0,   0,   0,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      1,   0,   0,   0, 102,   3, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n    102,   3,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   9,   0, \n      0,   0, 118,   8,  16,   0, \n      1,   0,   0,   0, 118,   8, \n     16,   0,   2,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      1,   0,   0,   0, 102,   3, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0, 118,   8,  16,   0, \n      1,   0,   0,   0,  21,   0, \n      0,   1, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0, 102,   3,  16,   0, \n      9,   0,   0,   0,  62,   0, \n      0,   1,  83,  84,  65,  84, \n    148,   0,   0,   0,   6,   5, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0, 132,   0,   0,   0, \n      6,   1,   0,   0, 167,   0, \n      0,   0,  62,   0,   0,   0, \n     30,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  44,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 204,   0,   0,   0, \n     64,   0,   0,   0,  84,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/resolve_full_32bpp_scaled_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_resolve_edram_info;        // Offset:    0 Size:     4\n//   uint xe_resolve_coordinate_info;   // Offset:    4 Size:     4\n//   uint xe_resolve_dest_info;         // Offset:    8 Size:     4\n//   uint xe_resolve_dest_coordinate_info;// Offset:   12 Size:     4\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_resolve_edram                  texture    byte         r/o      T0             t0      1 \n// xe_resolve_dest                       UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][1], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xy\ndcl_temps 24\ndcl_thread_group 8, 8, 1\nand r0.xyzw, CB0[0][0].xxzz, l(1023, 0x20000000, 7, 8)\nif_nz r0.y\n  ubfe r1.xy, l(2, 2, 0, 0), l(17, 20, 0, 0), CB0[0][0].yyyy\nelse \n  mov r1.xy, l(0,0,0,0)\nendif \nubfe r2.xyz, l(3, 3, 11, 0), l(16, 19, 5, 0), CB0[0][0].yyyy\nimul null, r0.y, r2.x, r2.z\nand r1.zw, CB0[0][0].zzzw, l(0, 0, 0x01000000, 1023)\nushr r3.xyzw, CB0[0][0].ywww, l(4, 10, 20, 24)\nishl r4.x, vThreadID.x, l(2)\nishl r0.y, r0.y, l(3)\nuge r0.y, r4.x, r0.y\nif_nz r0.y\n  ret \nendif \nubfe r5.xyzw, l(2, 11, 4, 1), l(10, 13, 24, 28), CB0[0][0].xxxx\nmov r6.x, CB0[0][0].y\nmov r6.y, r3.x\nbfi r2.zw, l(0, 0, 4, 1), l(0, 0, 3, 3), r6.xxxy, l(0, 0, 0, 0)\nibfe r0.y, l(6), l(16), CB0[0][0].z\nishl r0.y, r0.y, l(23)\niadd r0.y, r0.y, l(0x3f800000)\nbfi r3.xz, l(4, 0, 4, 0), l(3, 0, 3, 0), r3.wwzw, l(0, 0, 0, 0)\nubfe r6.xy, l(6, 3, 0, 0), l(7, 28, 0, 0), CB0[0][0].zwzz\numax r4.y, r1.y, vThreadID.y\nimad r2.zw, r2.zzzw, r2.xxxy, r4.xxxy\nuge r1.y, l(3), r6.y\nif_nz r1.y\n  mov r7.y, r6.y\nelse \n  ieq r1.y, r6.y, l(5)\n  if_nz r1.y\n    mov r7.y, l(2)\n  else \n    mov r7.y, l(0)\n  endif \nendif \nuge r4.yw, r5.xxxx, l(0, 2, 0, 1)\nand r4.yw, r4.yyyw, l(0, 1, 0, 1)\nishl r2.zw, r2.zzzw, r4.yyyw\nushr r7.x, r7.y, l(1)\nand r6.zw, r7.xxxy, l(0, 0, 1, 1)\niadd r2.zw, r2.zzzw, r6.zzzw\nimul null, r7.yz, r2.xxyx, l(0, 80, 16, 0)\nushr r7.x, r7.y, r5.w\nudiv r6.zw, null, r2.zzzw, r7.xxxz\nimad r0.x, r6.w, r0.x, r6.z\niadd r0.x, r0.x, r5.y\nimad r2.zw, -r6.zzzw, r7.xxxz, r2.zzzw\nimul null, r1.y, r7.z, r7.y\nimad r2.z, r2.w, r7.x, r2.z\nishl r2.z, r2.z, r5.w\nimad r0.x, r0.x, r1.y, r2.z\nishl r1.y, r1.y, l(11)\nudiv null, r0.x, r0.x, r1.y\nishl r0.x, r0.x, l(2)\niadd r1.y, r4.y, r5.w\nishl r2.z, l(4), r1.y\nif_nz r5.w\n  ieq r2.w, r2.z, l(8)\n  if_nz r2.w\n    ld_raw r7.xyzw, r0.x, T0[0].zwxy\n    iadd r2.w, r0.x, l(16)\n    ld_raw r8.xyzw, r2.w, T0[0].zwxy\n    mov r9.xy, r7.zwzz\n    mov r10.xy, r8.zwzz\n  else \n    ld_raw r9.xy, r0.x, T0[0].xyxx\n    iadd r2.w, r0.x, r2.z\n    ld_raw r7.xy, r2.w, T0[0].xyxx\n    ishl r4.yw, l(0, 8, 0, 12), r1.yyyy\n    iadd r4.yw, r0.xxxx, r4.yyyw\n    ld_raw r10.xy, r4.y, T0[0].xyxx\n    ld_raw r8.xy, r4.w, T0[0].xyxx\n  endif \n  switch r5.z\n    case l(5)\n    ishl r9.zw, r9.xxxy, l(0, 0, 16, 16)\n    ishr r11.xyzw, r9.zxwy, l(16, 16, 16, 16)\n    itof r11.xyzw, r11.xyzw\n    mul r11.xyzw, r11.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n    max r9.xyzw, r11.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n    ishl r7.zw, r7.xxxy, l(0, 0, 16, 16)\n    ishr r11.xyzw, r7.zxwy, l(16, 16, 16, 16)\n    itof r11.xyzw, r11.xyzw\n    mul r11.xyzw, r11.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n    max r7.xyzw, r11.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n    ishl r10.zw, r10.xxxy, l(0, 0, 16, 16)\n    ishr r11.xyzw, r10.zxwy, l(16, 16, 16, 16)\n    itof r11.xyzw, r11.xyzw\n    mul r11.xyzw, r11.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n    max r10.xyzw, r11.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n    ishl r8.zw, r8.xxxy, l(0, 0, 16, 16)\n    ishr r11.xyzw, r8.zxwy, l(16, 16, 16, 16)\n    itof r11.xyzw, r11.xyzw\n    mul r11.xyzw, r11.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n    max r8.xyzw, r11.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n    break \n    case l(7)\n    ushr r4.yw, r9.xxxy, l(0, 16, 0, 16)\n    f16tof32 r9.xz, r9.xxyx\n    f16tof32 r9.yw, r4.yyyw\n    ushr r4.yw, r7.xxxy, l(0, 16, 0, 16)\n    f16tof32 r7.xz, r7.xxyx\n    f16tof32 r7.yw, r4.yyyw\n    ushr r4.yw, r10.xxxy, l(0, 16, 0, 16)\n    f16tof32 r10.xz, r10.xxyx\n    f16tof32 r10.yw, r4.yyyw\n    ushr r4.yw, r8.xxxy, l(0, 16, 0, 16)\n    f16tof32 r8.xz, r8.xxyx\n    f16tof32 r8.yw, r4.yyyw\n    break \n    default \n    mov r9.zw, l(0,0,0,0)\n    mov r7.zw, l(0,0,0,0)\n    mov r10.zw, l(0,0,0,0)\n    mov r8.zw, l(0,0,0,0)\n    break \n  endswitch \nelse \n  ieq r2.w, r2.z, l(4)\n  if_nz r2.w\n    ld_raw r8.xyzw, r0.x, T0[0].wxyz\n  else \n    ld_raw r8.y, r0.x, T0[0].xxxx\n    iadd r2.w, r0.x, r2.z\n    ld_raw r8.z, r2.w, T0[0].xxxx\n    ishl r4.yw, l(0, 8, 0, 12), r1.yyyy\n    iadd r4.yw, r0.xxxx, r4.yyyw\n    ld_raw r8.w, r4.y, T0[0].xxxx\n    ld_raw r8.x, r4.w, T0[0].xxxx\n  endif \n  switch r5.z\n    case l(0)\n    case l(1)\n    ushr r11.yzw, r8.yyyy, l(0, 8, 16, 24)\n    mov r11.x, r8.y\n    and r11.xyzw, r11.xyzw, l(255, 255, 255, 255)\n    utof r11.xyzw, r11.xyzw\n    mul r9.xyzw, r11.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n    ushr r11.yzw, r8.zzzz, l(0, 8, 16, 24)\n    mov r11.x, r8.z\n    and r11.xyzw, r11.xyzw, l(255, 255, 255, 255)\n    utof r11.xyzw, r11.xyzw\n    mul r7.xyzw, r11.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n    ushr r11.yzw, r8.wwww, l(0, 8, 16, 24)\n    mov r11.x, r8.w\n    and r11.xyzw, r11.xyzw, l(255, 255, 255, 255)\n    utof r11.xyzw, r11.xyzw\n    mul r10.xyzw, r11.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n    ushr r8.yzw, r8.xxxx, l(0, 8, 16, 24)\n    and r11.xyzw, r8.xyzw, l(255, 255, 255, 255)\n    utof r11.xyzw, r11.xyzw\n    mul r8.xyzw, r11.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n    break \n    case l(2)\n    case l(10)\n    ushr r11.yzw, r8.yyyy, l(0, 10, 20, 30)\n    mov r11.x, r8.y\n    and r11.xyzw, r11.xyzw, l(1023, 1023, 1023, 3)\n    utof r11.xyzw, r11.xyzw\n    mul r9.xyzw, r11.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n    ushr r11.yzw, r8.zzzz, l(0, 10, 20, 30)\n    mov r11.x, r8.z\n    and r11.xyzw, r11.xyzw, l(1023, 1023, 1023, 3)\n    utof r11.xyzw, r11.xyzw\n    mul r7.xyzw, r11.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n    ushr r11.yzw, r8.wwww, l(0, 10, 20, 30)\n    mov r11.x, r8.w\n    and r11.xyzw, r11.xyzw, l(1023, 1023, 1023, 3)\n    utof r11.xyzw, r11.xyzw\n    mul r10.xyzw, r11.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n    ushr r8.yzw, r8.xxxx, l(0, 10, 20, 30)\n    and r11.xyzw, r8.xyzw, l(1023, 1023, 1023, 3)\n    utof r11.xyzw, r11.xyzw\n    mul r8.xyzw, r11.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n    break \n    case l(3)\n    case l(12)\n    ushr r11.xyzw, r8.yyyz, l(10, 20, 30, 30)\n    mov r12.x, r8.y\n    mov r12.yz, r11.xxyx\n    and r13.xyz, r12.xyzx, l(1023, 1023, 1023, 0)\n    and r14.xyz, r12.xyzx, l(127, 127, 127, 0)\n    ubfe r15.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r12.xyzx\n    firstbit_hi r16.xyz, r14.xyzx\n    iadd r16.xyz, r16.xyzx, l(-24, -24, -24, 0)\n    movc r16.xyz, r14.xyzx, r16.xyzx, l(8,8,8,0)\n    iadd r17.xyz, -r16.xyzx, l(1, 1, 1, 0)\n    movc r17.xyz, r15.xyzx, r15.xyzx, r17.xyzx\n    bfi r12.xyz, l(7, 7, 7, 0), r16.xyzx, r12.xyzx, l(0, 0, 0, 0)\n    and r12.xyz, r12.xyzx, l(127, 127, 127, 0)\n    movc r12.xyz, r15.xyzx, r14.xyzx, r12.xyzx\n    ishl r14.xyz, r17.xyzx, l(23, 23, 23, 0)\n    iadd r14.xyz, r14.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n    ishl r12.xyz, r12.xyzx, l(16, 16, 16, 0)\n    iadd r12.xyz, r14.xyzx, r12.xyzx\n    movc r9.xyz, r13.xyzx, r12.xyzx, l(0,0,0,0)\n    utof r4.yw, r11.zzzw\n    ushr r11.xyzw, r8.zwwz, l(10, 10, 20, 20)\n    mov r12.x, r8.z\n    mov r12.yz, r11.xxwx\n    and r13.xyz, r12.xyzx, l(1023, 1023, 1023, 0)\n    and r14.xyz, r12.xyzx, l(127, 127, 127, 0)\n    ubfe r15.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r12.xyzx\n    firstbit_hi r16.xyz, r14.xyzx\n    iadd r16.xyz, r16.xyzx, l(-24, -24, -24, 0)\n    movc r16.xyz, r14.xyzx, r16.xyzx, l(8,8,8,0)\n    iadd r17.xyz, -r16.xyzx, l(1, 1, 1, 0)\n    movc r17.xyz, r15.xyzx, r15.xyzx, r17.xyzx\n    bfi r12.xyz, l(7, 7, 7, 0), r16.xyzx, r12.xyzx, l(0, 0, 0, 0)\n    and r12.xyz, r12.xyzx, l(127, 127, 127, 0)\n    movc r12.xyz, r15.xyzx, r14.xyzx, r12.xyzx\n    ishl r14.xyz, r17.xyzx, l(23, 23, 23, 0)\n    iadd r14.xyz, r14.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n    ishl r12.xyz, r12.xyzx, l(16, 16, 16, 0)\n    iadd r12.xyz, r14.xyzx, r12.xyzx\n    movc r7.xyz, r13.xyzx, r12.xyzx, l(0,0,0,0)\n    mul r4.yw, r4.yyyw, l(0.000000, 0.333333, 0.000000, 0.333333)\n    mov r11.x, r8.w\n    and r12.xyz, r11.xyzx, l(1023, 1023, 1023, 0)\n    and r13.xyz, r11.xyzx, l(127, 127, 127, 0)\n    ubfe r14.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r11.xyzx\n    firstbit_hi r15.xyz, r13.xyzx\n    iadd r15.xyz, r15.xyzx, l(-24, -24, -24, 0)\n    movc r15.xyz, r13.xyzx, r15.xyzx, l(8,8,8,0)\n    iadd r16.xyz, -r15.xyzx, l(1, 1, 1, 0)\n    movc r16.xyz, r14.xyzx, r14.xyzx, r16.xyzx\n    bfi r11.xyz, l(7, 7, 7, 0), r15.xyzx, r11.xyzx, l(0, 0, 0, 0)\n    and r11.xyz, r11.xyzx, l(127, 127, 127, 0)\n    movc r11.xyz, r14.xyzx, r13.xyzx, r11.xyzx\n    ishl r13.xyz, r16.xyzx, l(23, 23, 23, 0)\n    iadd r13.xyz, r13.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n    ishl r11.xyz, r11.xyzx, l(16, 16, 16, 0)\n    iadd r11.xyz, r13.xyzx, r11.xyzx\n    movc r10.xyz, r12.xyzx, r11.xyzx, l(0,0,0,0)\n    ushr r11.xyzw, r8.wxxx, l(30, 10, 20, 30)\n    utof r5.xy, r11.xwxx\n    mov r11.x, r8.x\n    and r12.xyz, r11.xyzx, l(1023, 1023, 1023, 0)\n    and r13.xyz, r11.xyzx, l(127, 127, 127, 0)\n    ubfe r14.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r11.xyzx\n    firstbit_hi r15.xyz, r13.xyzx\n    iadd r15.xyz, r15.xyzx, l(-24, -24, -24, 0)\n    movc r15.xyz, r13.xyzx, r15.xyzx, l(8,8,8,0)\n    iadd r16.xyz, -r15.xyzx, l(1, 1, 1, 0)\n    movc r16.xyz, r14.xyzx, r14.xyzx, r16.xyzx\n    bfi r11.xyz, l(7, 7, 7, 0), r15.xyzx, r11.xyzx, l(0, 0, 0, 0)\n    and r11.xyz, r11.xyzx, l(127, 127, 127, 0)\n    movc r11.xyz, r14.xyzx, r13.xyzx, r11.xyzx\n    ishl r13.xyz, r16.xyzx, l(23, 23, 23, 0)\n    iadd r13.xyz, r13.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n    ishl r11.xyz, r11.xyzx, l(16, 16, 16, 0)\n    iadd r11.xyz, r13.xyzx, r11.xyzx\n    movc r8.xyz, r12.xyzx, r11.xyzx, l(0,0,0,0)\n    mul r5.xy, r5.xyxx, l(0.333333, 0.333333, 0.000000, 0.000000)\n    mov r9.w, r4.y\n    mov r7.w, r4.w\n    mov r10.w, r5.x\n    mov r8.w, r5.y\n    break \n    case l(4)\n    ishl r11.xyzw, r8.yzwx, l(16, 16, 16, 16)\n    mov r12.xz, r11.xxyx\n    mov r12.yw, r8.yyyz\n    ishr r12.xyzw, r12.xyzw, l(16, 16, 16, 16)\n    itof r12.xyzw, r12.xyzw\n    mul r12.xyzw, r12.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n    max r9.xy, r12.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n    max r7.xy, r12.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n    mov r8.yz, r11.zzwz\n    ishr r11.xyzw, r8.ywzx, l(16, 16, 16, 16)\n    itof r11.xyzw, r11.xyzw\n    mul r11.xyzw, r11.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n    max r10.xy, r11.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n    max r8.xy, r11.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n    mov r9.zw, l(0,0,0,0)\n    mov r7.zw, l(0,0,0,0)\n    mov r10.zw, l(0,0,0,0)\n    mov r8.zw, l(0,0,0,0)\n    break \n    case l(6)\n    ushr r11.xyzw, r8.yzwx, l(16, 16, 16, 16)\n    f16tof32 r9.x, r8.y\n    f16tof32 r9.y, r11.x\n    f16tof32 r7.x, r8.z\n    f16tof32 r7.y, r11.y\n    f16tof32 r10.x, r8.w\n    f16tof32 r10.y, r11.z\n    f16tof32 r8.x, r8.x\n    f16tof32 r8.y, r11.w\n    mov r9.zw, l(0,0,0,0)\n    mov r7.zw, l(0,0,0,0)\n    mov r10.zw, l(0,0,0,0)\n    mov r8.zw, l(0,0,0,0)\n    break \n    default \n    mov r9.x, r8.y\n    mov r9.yzw, l(0,0,0,0)\n    mov r7.x, r8.z\n    mov r7.yzw, l(0,0,0,0)\n    mov r10.x, r8.w\n    mov r10.yzw, l(0,0,0,0)\n    mov r8.yzw, l(0,0,0,0)\n    break \n  endswitch \nendif \nuge r2.w, r6.y, l(4)\nif_nz r2.w\n  mul r2.w, r0.y, l(0.500000)\n  imad r3.w, l(320), r2.x, r0.x\n  if_nz r5.w\n    ieq r4.y, r2.z, l(8)\n    if_nz r4.y\n      ld_raw r11.xyzw, r3.w, T0[0].zwxy\n      iadd r4.y, r3.w, l(16)\n      ld_raw r12.xyzw, r4.y, T0[0].zwxy\n      mov r13.xy, r11.zwzz\n      mov r14.xy, r12.zwzz\n    else \n      ld_raw r13.xy, r3.w, T0[0].xyxx\n      iadd r4.y, r2.z, r3.w\n      ld_raw r11.xy, r4.y, T0[0].xyxx\n      ishl r4.yw, l(0, 8, 0, 12), r1.yyyy\n      iadd r4.yw, r3.wwww, r4.yyyw\n      ld_raw r14.xy, r4.y, T0[0].xyxx\n      ld_raw r12.xy, r4.w, T0[0].xyxx\n    endif \n    switch r5.z\n      case l(5)\n      ishl r13.zw, r13.xxxy, l(0, 0, 16, 16)\n      ishr r15.xyzw, r13.zxwy, l(16, 16, 16, 16)\n      itof r15.xyzw, r15.xyzw\n      mul r15.xyzw, r15.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n      max r13.xyzw, r15.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n      ishl r11.zw, r11.xxxy, l(0, 0, 16, 16)\n      ishr r15.xyzw, r11.zxwy, l(16, 16, 16, 16)\n      itof r15.xyzw, r15.xyzw\n      mul r15.xyzw, r15.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n      max r11.xyzw, r15.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n      ishl r14.zw, r14.xxxy, l(0, 0, 16, 16)\n      ishr r15.xyzw, r14.zxwy, l(16, 16, 16, 16)\n      itof r15.xyzw, r15.xyzw\n      mul r15.xyzw, r15.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n      max r14.xyzw, r15.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n      ishl r12.zw, r12.xxxy, l(0, 0, 16, 16)\n      ishr r15.xyzw, r12.zxwy, l(16, 16, 16, 16)\n      itof r15.xyzw, r15.xyzw\n      mul r15.xyzw, r15.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n      max r12.xyzw, r15.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n      break \n      case l(7)\n      ushr r4.yw, r13.xxxy, l(0, 16, 0, 16)\n      f16tof32 r13.xz, r13.xxyx\n      f16tof32 r13.yw, r4.yyyw\n      ushr r4.yw, r11.xxxy, l(0, 16, 0, 16)\n      f16tof32 r11.xz, r11.xxyx\n      f16tof32 r11.yw, r4.yyyw\n      ushr r4.yw, r14.xxxy, l(0, 16, 0, 16)\n      f16tof32 r14.xz, r14.xxyx\n      f16tof32 r14.yw, r4.yyyw\n      ushr r4.yw, r12.xxxy, l(0, 16, 0, 16)\n      f16tof32 r12.xz, r12.xxyx\n      f16tof32 r12.yw, r4.yyyw\n      break \n      default \n      mov r13.zw, l(0,0,0,0)\n      mov r11.zw, l(0,0,0,0)\n      mov r14.zw, l(0,0,0,0)\n      mov r12.zw, l(0,0,0,0)\n      break \n    endswitch \n  else \n    ieq r4.y, r2.z, l(4)\n    if_nz r4.y\n      ld_raw r12.xyzw, r3.w, T0[0].wxyz\n    else \n      ld_raw r12.y, r3.w, T0[0].xxxx\n      iadd r4.y, r2.z, r3.w\n      ld_raw r12.z, r4.y, T0[0].xxxx\n      ishl r4.yw, l(0, 8, 0, 12), r1.yyyy\n      iadd r4.yw, r3.wwww, r4.yyyw\n      ld_raw r12.w, r4.y, T0[0].xxxx\n      ld_raw r12.x, r4.w, T0[0].xxxx\n    endif \n    switch r5.z\n      case l(0)\n      case l(1)\n      ushr r15.yzw, r12.yyyy, l(0, 8, 16, 24)\n      mov r15.x, r12.y\n      and r15.xyzw, r15.xyzw, l(255, 255, 255, 255)\n      utof r15.xyzw, r15.xyzw\n      mul r13.xyzw, r15.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n      ushr r15.yzw, r12.zzzz, l(0, 8, 16, 24)\n      mov r15.x, r12.z\n      and r15.xyzw, r15.xyzw, l(255, 255, 255, 255)\n      utof r15.xyzw, r15.xyzw\n      mul r11.xyzw, r15.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n      ushr r15.yzw, r12.wwww, l(0, 8, 16, 24)\n      mov r15.x, r12.w\n      and r15.xyzw, r15.xyzw, l(255, 255, 255, 255)\n      utof r15.xyzw, r15.xyzw\n      mul r14.xyzw, r15.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n      ushr r12.yzw, r12.xxxx, l(0, 8, 16, 24)\n      and r15.xyzw, r12.xyzw, l(255, 255, 255, 255)\n      utof r15.xyzw, r15.xyzw\n      mul r12.xyzw, r15.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n      break \n      case l(2)\n      case l(10)\n      ushr r15.yzw, r12.yyyy, l(0, 10, 20, 30)\n      mov r15.x, r12.y\n      and r15.xyzw, r15.xyzw, l(1023, 1023, 1023, 3)\n      utof r15.xyzw, r15.xyzw\n      mul r13.xyzw, r15.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n      ushr r15.yzw, r12.zzzz, l(0, 10, 20, 30)\n      mov r15.x, r12.z\n      and r15.xyzw, r15.xyzw, l(1023, 1023, 1023, 3)\n      utof r15.xyzw, r15.xyzw\n      mul r11.xyzw, r15.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n      ushr r15.yzw, r12.wwww, l(0, 10, 20, 30)\n      mov r15.x, r12.w\n      and r15.xyzw, r15.xyzw, l(1023, 1023, 1023, 3)\n      utof r15.xyzw, r15.xyzw\n      mul r14.xyzw, r15.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n      ushr r12.yzw, r12.xxxx, l(0, 10, 20, 30)\n      and r15.xyzw, r12.xyzw, l(1023, 1023, 1023, 3)\n      utof r15.xyzw, r15.xyzw\n      mul r12.xyzw, r15.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n      break \n      case l(3)\n      case l(12)\n      ushr r15.xyzw, r12.yyyz, l(10, 20, 30, 30)\n      mov r16.x, r12.y\n      mov r16.yz, r15.xxyx\n      and r17.xyz, r16.xyzx, l(1023, 1023, 1023, 0)\n      and r18.xyz, r16.xyzx, l(127, 127, 127, 0)\n      ubfe r19.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r16.xyzx\n      firstbit_hi r20.xyz, r18.xyzx\n      iadd r20.xyz, r20.xyzx, l(-24, -24, -24, 0)\n      movc r20.xyz, r18.xyzx, r20.xyzx, l(8,8,8,0)\n      iadd r21.xyz, -r20.xyzx, l(1, 1, 1, 0)\n      movc r21.xyz, r19.xyzx, r19.xyzx, r21.xyzx\n      bfi r16.xyz, l(7, 7, 7, 0), r20.xyzx, r16.xyzx, l(0, 0, 0, 0)\n      and r16.xyz, r16.xyzx, l(127, 127, 127, 0)\n      movc r16.xyz, r19.xyzx, r18.xyzx, r16.xyzx\n      ishl r18.xyz, r21.xyzx, l(23, 23, 23, 0)\n      iadd r18.xyz, r18.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n      ishl r16.xyz, r16.xyzx, l(16, 16, 16, 0)\n      iadd r16.xyz, r18.xyzx, r16.xyzx\n      movc r13.xyz, r17.xyzx, r16.xyzx, l(0,0,0,0)\n      utof r4.yw, r15.zzzw\n      ushr r15.xyzw, r12.zwwz, l(10, 10, 20, 20)\n      mov r16.x, r12.z\n      mov r16.yz, r15.xxwx\n      and r17.xyz, r16.xyzx, l(1023, 1023, 1023, 0)\n      and r18.xyz, r16.xyzx, l(127, 127, 127, 0)\n      ubfe r19.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r16.xyzx\n      firstbit_hi r20.xyz, r18.xyzx\n      iadd r20.xyz, r20.xyzx, l(-24, -24, -24, 0)\n      movc r20.xyz, r18.xyzx, r20.xyzx, l(8,8,8,0)\n      iadd r21.xyz, -r20.xyzx, l(1, 1, 1, 0)\n      movc r21.xyz, r19.xyzx, r19.xyzx, r21.xyzx\n      bfi r16.xyz, l(7, 7, 7, 0), r20.xyzx, r16.xyzx, l(0, 0, 0, 0)\n      and r16.xyz, r16.xyzx, l(127, 127, 127, 0)\n      movc r16.xyz, r19.xyzx, r18.xyzx, r16.xyzx\n      ishl r18.xyz, r21.xyzx, l(23, 23, 23, 0)\n      iadd r18.xyz, r18.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n      ishl r16.xyz, r16.xyzx, l(16, 16, 16, 0)\n      iadd r16.xyz, r18.xyzx, r16.xyzx\n      movc r11.xyz, r17.xyzx, r16.xyzx, l(0,0,0,0)\n      mul r4.yw, r4.yyyw, l(0.000000, 0.333333, 0.000000, 0.333333)\n      mov r15.x, r12.w\n      and r16.xyz, r15.xyzx, l(1023, 1023, 1023, 0)\n      and r17.xyz, r15.xyzx, l(127, 127, 127, 0)\n      ubfe r18.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r15.xyzx\n      firstbit_hi r19.xyz, r17.xyzx\n      iadd r19.xyz, r19.xyzx, l(-24, -24, -24, 0)\n      movc r19.xyz, r17.xyzx, r19.xyzx, l(8,8,8,0)\n      iadd r20.xyz, -r19.xyzx, l(1, 1, 1, 0)\n      movc r20.xyz, r18.xyzx, r18.xyzx, r20.xyzx\n      bfi r15.xyz, l(7, 7, 7, 0), r19.xyzx, r15.xyzx, l(0, 0, 0, 0)\n      and r15.xyz, r15.xyzx, l(127, 127, 127, 0)\n      movc r15.xyz, r18.xyzx, r17.xyzx, r15.xyzx\n      ishl r17.xyz, r20.xyzx, l(23, 23, 23, 0)\n      iadd r17.xyz, r17.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n      ishl r15.xyz, r15.xyzx, l(16, 16, 16, 0)\n      iadd r15.xyz, r17.xyzx, r15.xyzx\n      movc r14.xyz, r16.xyzx, r15.xyzx, l(0,0,0,0)\n      ushr r15.xyzw, r12.wxxx, l(30, 10, 20, 30)\n      utof r5.xy, r15.xwxx\n      mov r15.x, r12.x\n      and r16.xyz, r15.xyzx, l(1023, 1023, 1023, 0)\n      and r17.xyz, r15.xyzx, l(127, 127, 127, 0)\n      ubfe r18.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r15.xyzx\n      firstbit_hi r19.xyz, r17.xyzx\n      iadd r19.xyz, r19.xyzx, l(-24, -24, -24, 0)\n      movc r19.xyz, r17.xyzx, r19.xyzx, l(8,8,8,0)\n      iadd r20.xyz, -r19.xyzx, l(1, 1, 1, 0)\n      movc r20.xyz, r18.xyzx, r18.xyzx, r20.xyzx\n      bfi r15.xyz, l(7, 7, 7, 0), r19.xyzx, r15.xyzx, l(0, 0, 0, 0)\n      and r15.xyz, r15.xyzx, l(127, 127, 127, 0)\n      movc r15.xyz, r18.xyzx, r17.xyzx, r15.xyzx\n      ishl r17.xyz, r20.xyzx, l(23, 23, 23, 0)\n      iadd r17.xyz, r17.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n      ishl r15.xyz, r15.xyzx, l(16, 16, 16, 0)\n      iadd r15.xyz, r17.xyzx, r15.xyzx\n      movc r12.xyz, r16.xyzx, r15.xyzx, l(0,0,0,0)\n      mul r5.xy, r5.xyxx, l(0.333333, 0.333333, 0.000000, 0.000000)\n      mov r13.w, r4.y\n      mov r11.w, r4.w\n      mov r14.w, r5.x\n      mov r12.w, r5.y\n      break \n      case l(4)\n      ishl r15.xyzw, r12.yzwx, l(16, 16, 16, 16)\n      mov r16.xz, r15.xxyx\n      mov r16.yw, r12.yyyz\n      ishr r16.xyzw, r16.xyzw, l(16, 16, 16, 16)\n      itof r16.xyzw, r16.xyzw\n      mul r16.xyzw, r16.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n      max r13.xy, r16.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n      max r11.xy, r16.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n      mov r12.yz, r15.zzwz\n      ishr r15.xyzw, r12.ywzx, l(16, 16, 16, 16)\n      itof r15.xyzw, r15.xyzw\n      mul r15.xyzw, r15.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n      max r14.xy, r15.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n      max r12.xy, r15.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n      mov r13.zw, l(0,0,0,0)\n      mov r11.zw, l(0,0,0,0)\n      mov r14.zw, l(0,0,0,0)\n      mov r12.zw, l(0,0,0,0)\n      break \n      case l(6)\n      ushr r15.xyzw, r12.yzwx, l(16, 16, 16, 16)\n      f16tof32 r13.x, r12.y\n      f16tof32 r13.y, r15.x\n      f16tof32 r11.x, r12.z\n      f16tof32 r11.y, r15.y\n      f16tof32 r14.x, r12.w\n      f16tof32 r14.y, r15.z\n      f16tof32 r12.x, r12.x\n      f16tof32 r12.y, r15.w\n      mov r13.zw, l(0,0,0,0)\n      mov r11.zw, l(0,0,0,0)\n      mov r14.zw, l(0,0,0,0)\n      mov r12.zw, l(0,0,0,0)\n      break \n      default \n      mov r13.x, r12.y\n      mov r13.yzw, l(0,0,0,0)\n      mov r11.x, r12.z\n      mov r11.yzw, l(0,0,0,0)\n      mov r14.x, r12.w\n      mov r14.yzw, l(0,0,0,0)\n      mov r12.yzw, l(0,0,0,0)\n      break \n    endswitch \n  endif \n  add r9.xyzw, r9.xyzw, r13.xyzw\n  add r7.xyzw, r7.xyzw, r11.xyzw\n  add r10.xyzw, r10.xyzw, r14.xyzw\n  add r8.xyzw, r8.xyzw, r12.xyzw\n  uge r4.y, r6.y, l(6)\n  if_nz r4.y\n    ishl r4.y, l(4), r5.w\n    mul r0.y, r0.y, l(0.250000)\n    iadd r0.x, r0.x, r4.y\n    if_nz r5.w\n      ieq r4.w, r2.z, l(8)\n      if_nz r4.w\n        ld_raw r11.xyzw, r0.x, T0[0].zwxy\n        iadd r4.w, r0.x, l(16)\n        ld_raw r12.xyzw, r4.w, T0[0].zwxy\n        mov r13.xy, r11.zwzz\n        mov r14.xy, r12.zwzz\n      else \n        ld_raw r13.xy, r0.x, T0[0].xyxx\n        iadd r4.w, r2.z, r0.x\n        ld_raw r11.xy, r4.w, T0[0].xyxx\n        ishl r5.xy, l(8, 12, 0, 0), r1.yyyy\n        iadd r5.xy, r0.xxxx, r5.xyxx\n        ld_raw r14.xy, r5.x, T0[0].xyxx\n        ld_raw r12.xy, r5.y, T0[0].xyxx\n      endif \n      switch r5.z\n        case l(5)\n        ishl r13.zw, r13.xxxy, l(0, 0, 16, 16)\n        ishr r15.xyzw, r13.zxwy, l(16, 16, 16, 16)\n        itof r15.xyzw, r15.xyzw\n        mul r15.xyzw, r15.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r13.xyzw, r15.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        ishl r11.zw, r11.xxxy, l(0, 0, 16, 16)\n        ishr r15.xyzw, r11.zxwy, l(16, 16, 16, 16)\n        itof r15.xyzw, r15.xyzw\n        mul r15.xyzw, r15.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r11.xyzw, r15.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        ishl r14.zw, r14.xxxy, l(0, 0, 16, 16)\n        ishr r15.xyzw, r14.zxwy, l(16, 16, 16, 16)\n        itof r15.xyzw, r15.xyzw\n        mul r15.xyzw, r15.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r14.xyzw, r15.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        ishl r12.zw, r12.xxxy, l(0, 0, 16, 16)\n        ishr r15.xyzw, r12.zxwy, l(16, 16, 16, 16)\n        itof r15.xyzw, r15.xyzw\n        mul r15.xyzw, r15.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r12.xyzw, r15.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        break \n        case l(7)\n        ushr r5.xy, r13.xyxx, l(16, 16, 0, 0)\n        f16tof32 r13.xz, r13.xxyx\n        f16tof32 r13.yw, r5.xxxy\n        ushr r5.xy, r11.xyxx, l(16, 16, 0, 0)\n        f16tof32 r11.xz, r11.xxyx\n        f16tof32 r11.yw, r5.xxxy\n        ushr r5.xy, r14.xyxx, l(16, 16, 0, 0)\n        f16tof32 r14.xz, r14.xxyx\n        f16tof32 r14.yw, r5.xxxy\n        ushr r5.xy, r12.xyxx, l(16, 16, 0, 0)\n        f16tof32 r12.xz, r12.xxyx\n        f16tof32 r12.yw, r5.xxxy\n        break \n        default \n        mov r13.zw, l(0,0,0,0)\n        mov r11.zw, l(0,0,0,0)\n        mov r14.zw, l(0,0,0,0)\n        mov r12.zw, l(0,0,0,0)\n        break \n      endswitch \n    else \n      ieq r4.w, r2.z, l(4)\n      if_nz r4.w\n        ld_raw r12.xyzw, r0.x, T0[0].wxyz\n      else \n        ld_raw r12.y, r0.x, T0[0].xxxx\n        iadd r4.w, r2.z, r0.x\n        ld_raw r12.z, r4.w, T0[0].xxxx\n        ishl r5.xy, l(8, 12, 0, 0), r1.yyyy\n        iadd r5.xy, r0.xxxx, r5.xyxx\n        ld_raw r12.w, r5.x, T0[0].xxxx\n        ld_raw r12.x, r5.y, T0[0].xxxx\n      endif \n      switch r5.z\n        case l(0)\n        case l(1)\n        ushr r15.yzw, r12.yyyy, l(0, 8, 16, 24)\n        mov r15.x, r12.y\n        and r15.xyzw, r15.xyzw, l(255, 255, 255, 255)\n        utof r15.xyzw, r15.xyzw\n        mul r13.xyzw, r15.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        ushr r15.yzw, r12.zzzz, l(0, 8, 16, 24)\n        mov r15.x, r12.z\n        and r15.xyzw, r15.xyzw, l(255, 255, 255, 255)\n        utof r15.xyzw, r15.xyzw\n        mul r11.xyzw, r15.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        ushr r15.yzw, r12.wwww, l(0, 8, 16, 24)\n        mov r15.x, r12.w\n        and r15.xyzw, r15.xyzw, l(255, 255, 255, 255)\n        utof r15.xyzw, r15.xyzw\n        mul r14.xyzw, r15.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        ushr r12.yzw, r12.xxxx, l(0, 8, 16, 24)\n        and r15.xyzw, r12.xyzw, l(255, 255, 255, 255)\n        utof r15.xyzw, r15.xyzw\n        mul r12.xyzw, r15.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        break \n        case l(2)\n        case l(10)\n        ushr r15.yzw, r12.yyyy, l(0, 10, 20, 30)\n        mov r15.x, r12.y\n        and r15.xyzw, r15.xyzw, l(1023, 1023, 1023, 3)\n        utof r15.xyzw, r15.xyzw\n        mul r13.xyzw, r15.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        ushr r15.yzw, r12.zzzz, l(0, 10, 20, 30)\n        mov r15.x, r12.z\n        and r15.xyzw, r15.xyzw, l(1023, 1023, 1023, 3)\n        utof r15.xyzw, r15.xyzw\n        mul r11.xyzw, r15.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        ushr r15.yzw, r12.wwww, l(0, 10, 20, 30)\n        mov r15.x, r12.w\n        and r15.xyzw, r15.xyzw, l(1023, 1023, 1023, 3)\n        utof r15.xyzw, r15.xyzw\n        mul r14.xyzw, r15.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        ushr r12.yzw, r12.xxxx, l(0, 10, 20, 30)\n        and r15.xyzw, r12.xyzw, l(1023, 1023, 1023, 3)\n        utof r15.xyzw, r15.xyzw\n        mul r12.xyzw, r15.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        break \n        case l(3)\n        case l(12)\n        ushr r15.xyzw, r12.yyyz, l(10, 20, 30, 30)\n        mov r16.x, r12.y\n        mov r16.yz, r15.xxyx\n        and r6.yzw, r16.xxyz, l(0, 1023, 1023, 1023)\n        and r17.xyz, r16.xyzx, l(127, 127, 127, 0)\n        ubfe r18.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r16.xyzx\n        firstbit_hi r19.xyz, r17.xyzx\n        iadd r19.xyz, r19.xyzx, l(-24, -24, -24, 0)\n        movc r19.xyz, r17.xyzx, r19.xyzx, l(8,8,8,0)\n        iadd r20.xyz, -r19.xyzx, l(1, 1, 1, 0)\n        movc r20.xyz, r18.xyzx, r18.xyzx, r20.xyzx\n        bfi r16.xyz, l(7, 7, 7, 0), r19.xyzx, r16.xyzx, l(0, 0, 0, 0)\n        and r16.xyz, r16.xyzx, l(127, 127, 127, 0)\n        movc r16.xyz, r18.xyzx, r17.xyzx, r16.xyzx\n        ishl r17.xyz, r20.xyzx, l(23, 23, 23, 0)\n        iadd r17.xyz, r17.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r16.xyz, r16.xyzx, l(16, 16, 16, 0)\n        iadd r16.xyz, r17.xyzx, r16.xyzx\n        movc r13.xyz, r6.yzwy, r16.xyzx, l(0,0,0,0)\n        utof r5.xy, r15.zwzz\n        ushr r15.xyzw, r12.zwwz, l(10, 10, 20, 20)\n        mov r16.x, r12.z\n        mov r16.yz, r15.xxwx\n        and r6.yzw, r16.xxyz, l(0, 1023, 1023, 1023)\n        and r17.xyz, r16.xyzx, l(127, 127, 127, 0)\n        ubfe r18.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r16.xyzx\n        firstbit_hi r19.xyz, r17.xyzx\n        iadd r19.xyz, r19.xyzx, l(-24, -24, -24, 0)\n        movc r19.xyz, r17.xyzx, r19.xyzx, l(8,8,8,0)\n        iadd r20.xyz, -r19.xyzx, l(1, 1, 1, 0)\n        movc r20.xyz, r18.xyzx, r18.xyzx, r20.xyzx\n        bfi r16.xyz, l(7, 7, 7, 0), r19.xyzx, r16.xyzx, l(0, 0, 0, 0)\n        and r16.xyz, r16.xyzx, l(127, 127, 127, 0)\n        movc r16.xyz, r18.xyzx, r17.xyzx, r16.xyzx\n        ishl r17.xyz, r20.xyzx, l(23, 23, 23, 0)\n        iadd r17.xyz, r17.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r16.xyz, r16.xyzx, l(16, 16, 16, 0)\n        iadd r16.xyz, r17.xyzx, r16.xyzx\n        movc r11.xyz, r6.yzwy, r16.xyzx, l(0,0,0,0)\n        mul r5.xy, r5.xyxx, l(0.333333, 0.333333, 0.000000, 0.000000)\n        mov r15.x, r12.w\n        and r6.yzw, r15.xxyz, l(0, 1023, 1023, 1023)\n        and r16.xyz, r15.xyzx, l(127, 127, 127, 0)\n        ubfe r17.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r15.xyzx\n        firstbit_hi r18.xyz, r16.xyzx\n        iadd r18.xyz, r18.xyzx, l(-24, -24, -24, 0)\n        movc r18.xyz, r16.xyzx, r18.xyzx, l(8,8,8,0)\n        iadd r19.xyz, -r18.xyzx, l(1, 1, 1, 0)\n        movc r19.xyz, r17.xyzx, r17.xyzx, r19.xyzx\n        bfi r15.xyz, l(7, 7, 7, 0), r18.xyzx, r15.xyzx, l(0, 0, 0, 0)\n        and r15.xyz, r15.xyzx, l(127, 127, 127, 0)\n        movc r15.xyz, r17.xyzx, r16.xyzx, r15.xyzx\n        ishl r16.xyz, r19.xyzx, l(23, 23, 23, 0)\n        iadd r16.xyz, r16.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r15.xyz, r15.xyzx, l(16, 16, 16, 0)\n        iadd r15.xyz, r16.xyzx, r15.xyzx\n        movc r14.xyz, r6.yzwy, r15.xyzx, l(0,0,0,0)\n        ushr r15.xyzw, r12.wxxx, l(30, 10, 20, 30)\n        utof r6.yz, r15.xxwx\n        mov r15.x, r12.x\n        and r16.xyz, r15.xyzx, l(1023, 1023, 1023, 0)\n        and r17.xyz, r15.xyzx, l(127, 127, 127, 0)\n        ubfe r18.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r15.xyzx\n        firstbit_hi r19.xyz, r17.xyzx\n        iadd r19.xyz, r19.xyzx, l(-24, -24, -24, 0)\n        movc r19.xyz, r17.xyzx, r19.xyzx, l(8,8,8,0)\n        iadd r20.xyz, -r19.xyzx, l(1, 1, 1, 0)\n        movc r20.xyz, r18.xyzx, r18.xyzx, r20.xyzx\n        bfi r15.xyz, l(7, 7, 7, 0), r19.xyzx, r15.xyzx, l(0, 0, 0, 0)\n        and r15.xyz, r15.xyzx, l(127, 127, 127, 0)\n        movc r15.xyz, r18.xyzx, r17.xyzx, r15.xyzx\n        ishl r17.xyz, r20.xyzx, l(23, 23, 23, 0)\n        iadd r17.xyz, r17.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r15.xyz, r15.xyzx, l(16, 16, 16, 0)\n        iadd r15.xyz, r17.xyzx, r15.xyzx\n        movc r12.xyz, r16.xyzx, r15.xyzx, l(0,0,0,0)\n        mul r6.yz, r6.yyzy, l(0.000000, 0.333333, 0.333333, 0.000000)\n        mov r13.w, r5.x\n        mov r11.w, r5.y\n        mov r14.w, r6.y\n        mov r12.w, r6.z\n        break \n        case l(4)\n        ishl r15.xyzw, r12.yzwx, l(16, 16, 16, 16)\n        mov r16.xz, r15.xxyx\n        mov r16.yw, r12.yyyz\n        ishr r16.xyzw, r16.xyzw, l(16, 16, 16, 16)\n        itof r16.xyzw, r16.xyzw\n        mul r16.xyzw, r16.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r13.xy, r16.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        max r11.xy, r16.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        mov r12.yz, r15.zzwz\n        ishr r15.xyzw, r12.ywzx, l(16, 16, 16, 16)\n        itof r15.xyzw, r15.xyzw\n        mul r15.xyzw, r15.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r14.xy, r15.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        max r12.xy, r15.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        mov r13.zw, l(0,0,0,0)\n        mov r11.zw, l(0,0,0,0)\n        mov r14.zw, l(0,0,0,0)\n        mov r12.zw, l(0,0,0,0)\n        break \n        case l(6)\n        ushr r15.xyzw, r12.yzwx, l(16, 16, 16, 16)\n        f16tof32 r13.x, r12.y\n        f16tof32 r13.y, r15.x\n        f16tof32 r11.x, r12.z\n        f16tof32 r11.y, r15.y\n        f16tof32 r14.x, r12.w\n        f16tof32 r14.y, r15.z\n        f16tof32 r12.x, r12.x\n        f16tof32 r12.y, r15.w\n        mov r13.zw, l(0,0,0,0)\n        mov r11.zw, l(0,0,0,0)\n        mov r14.zw, l(0,0,0,0)\n        mov r12.zw, l(0,0,0,0)\n        break \n        default \n        mov r13.x, r12.y\n        mov r13.yzw, l(0,0,0,0)\n        mov r11.x, r12.z\n        mov r11.yzw, l(0,0,0,0)\n        mov r14.x, r12.w\n        mov r14.yzw, l(0,0,0,0)\n        mov r12.yzw, l(0,0,0,0)\n        break \n      endswitch \n    endif \n    add r13.xyzw, r9.xyzw, r13.xyzw\n    add r11.xyzw, r7.xyzw, r11.xyzw\n    add r14.xyzw, r10.xyzw, r14.xyzw\n    add r12.xyzw, r8.xyzw, r12.xyzw\n    iadd r0.x, r3.w, r4.y\n    if_nz r5.w\n      ieq r3.w, r2.z, l(8)\n      if_nz r3.w\n        ld_raw r15.xyzw, r0.x, T0[0].zwxy\n        iadd r3.w, r0.x, l(16)\n        ld_raw r16.xyzw, r3.w, T0[0].zwxy\n        mov r17.xy, r15.zwzz\n        mov r18.xy, r16.zwzz\n      else \n        ld_raw r17.xy, r0.x, T0[0].xyxx\n        iadd r3.w, r2.z, r0.x\n        ld_raw r15.xy, r3.w, T0[0].xyxx\n        ishl r4.yw, l(0, 8, 0, 12), r1.yyyy\n        iadd r4.yw, r0.xxxx, r4.yyyw\n        ld_raw r18.xy, r4.y, T0[0].xyxx\n        ld_raw r16.xy, r4.w, T0[0].xyxx\n      endif \n      switch r5.z\n        case l(5)\n        ishl r17.zw, r17.xxxy, l(0, 0, 16, 16)\n        ishr r19.xyzw, r17.zxwy, l(16, 16, 16, 16)\n        itof r19.xyzw, r19.xyzw\n        mul r19.xyzw, r19.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r17.xyzw, r19.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        ishl r15.zw, r15.xxxy, l(0, 0, 16, 16)\n        ishr r19.xyzw, r15.zxwy, l(16, 16, 16, 16)\n        itof r19.xyzw, r19.xyzw\n        mul r19.xyzw, r19.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r15.xyzw, r19.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        ishl r18.zw, r18.xxxy, l(0, 0, 16, 16)\n        ishr r19.xyzw, r18.zxwy, l(16, 16, 16, 16)\n        itof r19.xyzw, r19.xyzw\n        mul r19.xyzw, r19.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r18.xyzw, r19.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        ishl r16.zw, r16.xxxy, l(0, 0, 16, 16)\n        ishr r19.xyzw, r16.zxwy, l(16, 16, 16, 16)\n        itof r19.xyzw, r19.xyzw\n        mul r19.xyzw, r19.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r16.xyzw, r19.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        break \n        case l(7)\n        ushr r4.yw, r17.xxxy, l(0, 16, 0, 16)\n        f16tof32 r17.xz, r17.xxyx\n        f16tof32 r17.yw, r4.yyyw\n        ushr r4.yw, r15.xxxy, l(0, 16, 0, 16)\n        f16tof32 r15.xz, r15.xxyx\n        f16tof32 r15.yw, r4.yyyw\n        ushr r4.yw, r18.xxxy, l(0, 16, 0, 16)\n        f16tof32 r18.xz, r18.xxyx\n        f16tof32 r18.yw, r4.yyyw\n        ushr r4.yw, r16.xxxy, l(0, 16, 0, 16)\n        f16tof32 r16.xz, r16.xxyx\n        f16tof32 r16.yw, r4.yyyw\n        break \n        default \n        mov r17.zw, l(0,0,0,0)\n        mov r15.zw, l(0,0,0,0)\n        mov r18.zw, l(0,0,0,0)\n        mov r16.zw, l(0,0,0,0)\n        break \n      endswitch \n    else \n      ieq r3.w, r2.z, l(4)\n      if_nz r3.w\n        ld_raw r16.xyzw, r0.x, T0[0].wxyz\n      else \n        ld_raw r16.y, r0.x, T0[0].xxxx\n        iadd r2.z, r2.z, r0.x\n        ld_raw r16.z, r2.z, T0[0].xxxx\n        ishl r4.yw, l(0, 8, 0, 12), r1.yyyy\n        iadd r4.yw, r0.xxxx, r4.yyyw\n        ld_raw r16.w, r4.y, T0[0].xxxx\n        ld_raw r16.x, r4.w, T0[0].xxxx\n      endif \n      switch r5.z\n        case l(0)\n        case l(1)\n        ushr r5.yzw, r16.yyyy, l(0, 8, 16, 24)\n        mov r5.x, r16.y\n        and r5.xyzw, r5.xyzw, l(255, 255, 255, 255)\n        utof r5.xyzw, r5.xyzw\n        mul r17.xyzw, r5.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        ushr r5.yzw, r16.zzzz, l(0, 8, 16, 24)\n        mov r5.x, r16.z\n        and r5.xyzw, r5.xyzw, l(255, 255, 255, 255)\n        utof r5.xyzw, r5.xyzw\n        mul r15.xyzw, r5.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        ushr r5.yzw, r16.wwww, l(0, 8, 16, 24)\n        mov r5.x, r16.w\n        and r5.xyzw, r5.xyzw, l(255, 255, 255, 255)\n        utof r5.xyzw, r5.xyzw\n        mul r18.xyzw, r5.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        ushr r16.yzw, r16.xxxx, l(0, 8, 16, 24)\n        and r5.xyzw, r16.xyzw, l(255, 255, 255, 255)\n        utof r5.xyzw, r5.xyzw\n        mul r16.xyzw, r5.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        break \n        case l(2)\n        case l(10)\n        ushr r5.yzw, r16.yyyy, l(0, 10, 20, 30)\n        mov r5.x, r16.y\n        and r5.xyzw, r5.xyzw, l(1023, 1023, 1023, 3)\n        utof r5.xyzw, r5.xyzw\n        mul r17.xyzw, r5.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        ushr r5.yzw, r16.zzzz, l(0, 10, 20, 30)\n        mov r5.x, r16.z\n        and r5.xyzw, r5.xyzw, l(1023, 1023, 1023, 3)\n        utof r5.xyzw, r5.xyzw\n        mul r15.xyzw, r5.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        ushr r5.yzw, r16.wwww, l(0, 10, 20, 30)\n        mov r5.x, r16.w\n        and r5.xyzw, r5.xyzw, l(1023, 1023, 1023, 3)\n        utof r5.xyzw, r5.xyzw\n        mul r18.xyzw, r5.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        ushr r16.yzw, r16.xxxx, l(0, 10, 20, 30)\n        and r5.xyzw, r16.xyzw, l(1023, 1023, 1023, 3)\n        utof r5.xyzw, r5.xyzw\n        mul r16.xyzw, r5.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        break \n        case l(3)\n        case l(12)\n        ushr r5.xyzw, r16.yyyz, l(10, 20, 30, 30)\n        mov r19.x, r16.y\n        mov r19.yz, r5.xxyx\n        and r6.yzw, r19.xxyz, l(0, 1023, 1023, 1023)\n        and r20.xyz, r19.xyzx, l(127, 127, 127, 0)\n        ubfe r21.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r19.xyzx\n        firstbit_hi r22.xyz, r20.xyzx\n        iadd r22.xyz, r22.xyzx, l(-24, -24, -24, 0)\n        movc r22.xyz, r20.xyzx, r22.xyzx, l(8,8,8,0)\n        iadd r23.xyz, -r22.xyzx, l(1, 1, 1, 0)\n        movc r23.xyz, r21.xyzx, r21.xyzx, r23.xyzx\n        bfi r19.xyz, l(7, 7, 7, 0), r22.xyzx, r19.xyzx, l(0, 0, 0, 0)\n        and r19.xyz, r19.xyzx, l(127, 127, 127, 0)\n        movc r19.xyz, r21.xyzx, r20.xyzx, r19.xyzx\n        ishl r20.xyz, r23.xyzx, l(23, 23, 23, 0)\n        iadd r20.xyz, r20.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r19.xyz, r19.xyzx, l(16, 16, 16, 0)\n        iadd r19.xyz, r20.xyzx, r19.xyzx\n        movc r17.xyz, r6.yzwy, r19.xyzx, l(0,0,0,0)\n        utof r4.yw, r5.zzzw\n        ushr r5.xyzw, r16.zwwz, l(10, 10, 20, 20)\n        mov r19.x, r16.z\n        mov r19.yz, r5.xxwx\n        and r6.yzw, r19.xxyz, l(0, 1023, 1023, 1023)\n        and r20.xyz, r19.xyzx, l(127, 127, 127, 0)\n        ubfe r21.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r19.xyzx\n        firstbit_hi r22.xyz, r20.xyzx\n        iadd r22.xyz, r22.xyzx, l(-24, -24, -24, 0)\n        movc r22.xyz, r20.xyzx, r22.xyzx, l(8,8,8,0)\n        iadd r23.xyz, -r22.xyzx, l(1, 1, 1, 0)\n        movc r23.xyz, r21.xyzx, r21.xyzx, r23.xyzx\n        bfi r19.xyz, l(7, 7, 7, 0), r22.xyzx, r19.xyzx, l(0, 0, 0, 0)\n        and r19.xyz, r19.xyzx, l(127, 127, 127, 0)\n        movc r19.xyz, r21.xyzx, r20.xyzx, r19.xyzx\n        ishl r20.xyz, r23.xyzx, l(23, 23, 23, 0)\n        iadd r20.xyz, r20.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r19.xyz, r19.xyzx, l(16, 16, 16, 0)\n        iadd r19.xyz, r20.xyzx, r19.xyzx\n        movc r15.xyz, r6.yzwy, r19.xyzx, l(0,0,0,0)\n        mul r4.yw, r4.yyyw, l(0.000000, 0.333333, 0.000000, 0.333333)\n        mov r5.x, r16.w\n        and r6.yzw, r5.xxyz, l(0, 1023, 1023, 1023)\n        and r19.xyz, r5.xyzx, l(127, 127, 127, 0)\n        ubfe r20.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r5.xyzx\n        firstbit_hi r21.xyz, r19.xyzx\n        iadd r21.xyz, r21.xyzx, l(-24, -24, -24, 0)\n        movc r21.xyz, r19.xyzx, r21.xyzx, l(8,8,8,0)\n        iadd r22.xyz, -r21.xyzx, l(1, 1, 1, 0)\n        movc r22.xyz, r20.xyzx, r20.xyzx, r22.xyzx\n        bfi r5.xyz, l(7, 7, 7, 0), r21.xyzx, r5.xyzx, l(0, 0, 0, 0)\n        and r5.xyz, r5.xyzx, l(127, 127, 127, 0)\n        movc r5.xyz, r20.xyzx, r19.xyzx, r5.xyzx\n        ishl r19.xyz, r22.xyzx, l(23, 23, 23, 0)\n        iadd r19.xyz, r19.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r5.xyz, r5.xyzx, l(16, 16, 16, 0)\n        iadd r5.xyz, r19.xyzx, r5.xyzx\n        movc r18.xyz, r6.yzwy, r5.xyzx, l(0,0,0,0)\n        ushr r5.xyzw, r16.wxxx, l(30, 10, 20, 30)\n        utof r6.yz, r5.xxwx\n        mov r5.x, r16.x\n        and r19.xyz, r5.xyzx, l(1023, 1023, 1023, 0)\n        and r20.xyz, r5.xyzx, l(127, 127, 127, 0)\n        ubfe r21.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r5.xyzx\n        firstbit_hi r22.xyz, r20.xyzx\n        iadd r22.xyz, r22.xyzx, l(-24, -24, -24, 0)\n        movc r22.xyz, r20.xyzx, r22.xyzx, l(8,8,8,0)\n        iadd r23.xyz, -r22.xyzx, l(1, 1, 1, 0)\n        movc r23.xyz, r21.xyzx, r21.xyzx, r23.xyzx\n        bfi r5.xyz, l(7, 7, 7, 0), r22.xyzx, r5.xyzx, l(0, 0, 0, 0)\n        and r5.xyz, r5.xyzx, l(127, 127, 127, 0)\n        movc r5.xyz, r21.xyzx, r20.xyzx, r5.xyzx\n        ishl r20.xyz, r23.xyzx, l(23, 23, 23, 0)\n        iadd r20.xyz, r20.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r5.xyz, r5.xyzx, l(16, 16, 16, 0)\n        iadd r5.xyz, r20.xyzx, r5.xyzx\n        movc r16.xyz, r19.xyzx, r5.xyzx, l(0,0,0,0)\n        mul r5.xy, r6.yzyy, l(0.333333, 0.333333, 0.000000, 0.000000)\n        mov r17.w, r4.y\n        mov r15.w, r4.w\n        mov r18.w, r5.x\n        mov r16.w, r5.y\n        break \n        case l(4)\n        ishl r5.xyzw, r16.yzwx, l(16, 16, 16, 16)\n        mov r19.xz, r5.xxyx\n        mov r19.yw, r16.yyyz\n        ishr r19.xyzw, r19.xyzw, l(16, 16, 16, 16)\n        itof r19.xyzw, r19.xyzw\n        mul r19.xyzw, r19.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r17.xy, r19.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        max r15.xy, r19.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        mov r16.yz, r5.zzwz\n        ishr r5.xyzw, r16.ywzx, l(16, 16, 16, 16)\n        itof r5.xyzw, r5.xyzw\n        mul r5.xyzw, r5.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r18.xy, r5.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        max r16.xy, r5.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        mov r17.zw, l(0,0,0,0)\n        mov r15.zw, l(0,0,0,0)\n        mov r18.zw, l(0,0,0,0)\n        mov r16.zw, l(0,0,0,0)\n        break \n        case l(6)\n        ushr r5.xyzw, r16.yzwx, l(16, 16, 16, 16)\n        f16tof32 r17.x, r16.y\n        f16tof32 r17.y, r5.x\n        f16tof32 r15.x, r16.z\n        f16tof32 r15.y, r5.y\n        f16tof32 r18.x, r16.w\n        f16tof32 r18.y, r5.z\n        f16tof32 r16.x, r16.x\n        f16tof32 r16.y, r5.w\n        mov r17.zw, l(0,0,0,0)\n        mov r15.zw, l(0,0,0,0)\n        mov r18.zw, l(0,0,0,0)\n        mov r16.zw, l(0,0,0,0)\n        break \n        default \n        mov r17.x, r16.y\n        mov r17.yzw, l(0,0,0,0)\n        mov r15.x, r16.z\n        mov r15.yzw, l(0,0,0,0)\n        mov r18.x, r16.w\n        mov r18.yzw, l(0,0,0,0)\n        mov r16.yzw, l(0,0,0,0)\n        break \n      endswitch \n    endif \n    add r9.xyzw, r13.xyzw, r17.xyzw\n    add r7.xyzw, r11.xyzw, r15.xyzw\n    add r10.xyzw, r14.xyzw, r18.xyzw\n    add r8.xyzw, r12.xyzw, r16.xyzw\n  else \n    mov r0.y, r2.w\n  endif \nendif \nmul r5.xyzw, r0.yyyy, r9.xyzw\nmul r7.xyzw, r0.yyyy, r7.xyzw\nmul r9.xyzw, r0.yyyy, r10.xyzw\nmul r8.xyzw, r0.yyyy, r8.xyzw\nif_nz r1.z\n  mov r5.xz, r5.zzxz\n  mov r7.xz, r7.zzxz\n  mov r9.xz, r9.zzxz\n  mov r10.xz, r8.zzxz\nelse \n  mov r10.xz, r8.xxzx\nendif \nswitch r6.x\n  case l(6)\n  case l(14)\n  case l(50)\n  mov_sat r5.xyzw, r5.xyzw\n  mad r6.xyzw, r5.xyzw, l(255.000000, 255.000000, 255.000000, 255.000000), l(0.500000, 0.500000, 0.500000, 0.500000)\n  ftou r6.xyzw, r6.xyzw\n  imad r0.x, r6.y, l(256), r6.x\n  imad r0.x, r6.z, l(0x00010000), r0.x\n  imad r6.x, r6.w, l(0x01000000), r0.x\n  mov_sat r7.xyzw, r7.xyzw\n  mad r11.xyzw, r7.xyzw, l(255.000000, 255.000000, 255.000000, 255.000000), l(0.500000, 0.500000, 0.500000, 0.500000)\n  ftou r11.xyzw, r11.xyzw\n  imad r0.x, r11.y, l(256), r11.x\n  imad r0.x, r11.z, l(0x00010000), r0.x\n  imad r6.y, r11.w, l(0x01000000), r0.x\n  mov_sat r9.xyzw, r9.xyzw\n  mad r11.xyzw, r9.xyzw, l(255.000000, 255.000000, 255.000000, 255.000000), l(0.500000, 0.500000, 0.500000, 0.500000)\n  ftou r11.xyzw, r11.xyzw\n  imad r0.x, r11.y, l(256), r11.x\n  imad r0.x, r11.z, l(0x00010000), r0.x\n  imad r6.z, r11.w, l(0x01000000), r0.x\n  mov r10.yw, r8.yyyw\n  mov_sat r10.xyzw, r10.xyzw\n  mad r11.xyzw, r10.xyzw, l(255.000000, 255.000000, 255.000000, 255.000000), l(0.500000, 0.500000, 0.500000, 0.500000)\n  ftou r11.xyzw, r11.xyzw\n  imad r0.x, r11.y, l(256), r11.x\n  imad r0.x, r11.z, l(0x00010000), r0.x\n  imad r10.x, r11.w, l(0x01000000), r0.x\n  mov r10.yzw, r6.yyxz\n  break \n  case l(7)\n  case l(54)\n  mov_sat r5.xyzw, r5.xyzw\n  mad r6.xyzw, r5.xyzw, l(1023.000000, 1023.000000, 1023.000000, 3.000000), l(0.500000, 0.500000, 0.500000, 0.500000)\n  ftou r6.xyzw, r6.xyzw\n  imad r0.x, r6.y, l(1024), r6.x\n  imad r0.x, r6.z, l(0x00100000), r0.x\n  imad r6.x, r6.w, l(0x40000000), r0.x\n  mov_sat r7.xyzw, r7.xyzw\n  mad r11.xyzw, r7.xyzw, l(1023.000000, 1023.000000, 1023.000000, 3.000000), l(0.500000, 0.500000, 0.500000, 0.500000)\n  ftou r11.xyzw, r11.xyzw\n  imad r0.x, r11.y, l(1024), r11.x\n  imad r0.x, r11.z, l(0x00100000), r0.x\n  imad r6.y, r11.w, l(0x40000000), r0.x\n  mov_sat r9.xyzw, r9.xyzw\n  mad r11.xyzw, r9.xyzw, l(1023.000000, 1023.000000, 1023.000000, 3.000000), l(0.500000, 0.500000, 0.500000, 0.500000)\n  ftou r11.xyzw, r11.xyzw\n  imad r0.x, r11.y, l(1024), r11.x\n  imad r0.x, r11.z, l(0x00100000), r0.x\n  imad r6.z, r11.w, l(0x40000000), r0.x\n  mov_sat r8.xz, r10.xxzx\n  mov_sat r8.yw, r8.yyyw\n  mad r11.xyzw, r8.xyzw, l(1023.000000, 1023.000000, 1023.000000, 3.000000), l(0.500000, 0.500000, 0.500000, 0.500000)\n  ftou r11.xyzw, r11.xyzw\n  imad r0.x, r11.y, l(1024), r11.x\n  imad r0.x, r11.z, l(0x00100000), r0.x\n  imad r10.x, r11.w, l(0x40000000), r0.x\n  mov r10.yzw, r6.yyxz\n  break \n  case l(16)\n  case l(55)\n  mov_sat r5.xyz, r5.xyzx\n  mad r6.xyz, r5.xyzx, l(2047.000000, 2047.000000, 1023.000000, 0.000000), l(0.500000, 0.500000, 0.500000, 0.000000)\n  ftou r6.xyz, r6.xyzx\n  imad r0.x, r6.y, l(2048), r6.x\n  imad r6.x, r6.z, l(0x00400000), r0.x\n  mov_sat r7.xyz, r7.xyzx\n  mad r11.xyz, r7.xyzx, l(2047.000000, 2047.000000, 1023.000000, 0.000000), l(0.500000, 0.500000, 0.500000, 0.000000)\n  ftou r11.xyz, r11.xyzx\n  imad r0.x, r11.y, l(2048), r11.x\n  imad r6.y, r11.z, l(0x00400000), r0.x\n  mov_sat r9.xyz, r9.xyzx\n  mad r11.xyz, r9.xyzx, l(2047.000000, 2047.000000, 1023.000000, 0.000000), l(0.500000, 0.500000, 0.500000, 0.000000)\n  ftou r11.xyz, r11.xyzx\n  imad r0.x, r11.y, l(2048), r11.x\n  imad r6.z, r11.z, l(0x00400000), r0.x\n  mov_sat r8.xz, r10.xxzx\n  mov_sat r8.y, r8.y\n  mad r11.xyz, r8.xyzx, l(2047.000000, 2047.000000, 1023.000000, 0.000000), l(0.500000, 0.500000, 0.500000, 0.000000)\n  ftou r11.xyz, r11.xyzx\n  imad r0.x, r11.y, l(2048), r11.x\n  imad r10.x, r11.z, l(0x00400000), r0.x\n  mov r10.yzw, r6.yyxz\n  break \n  case l(17)\n  case l(56)\n  mov_sat r5.xyz, r5.xyzx\n  mad r6.xyz, r5.xyzx, l(1023.000000, 2047.000000, 2047.000000, 0.000000), l(0.500000, 0.500000, 0.500000, 0.000000)\n  ftou r6.xyz, r6.xyzx\n  imad r0.x, r6.y, l(1024), r6.x\n  imad r6.x, r6.z, l(0x00200000), r0.x\n  mov_sat r7.xyz, r7.xyzx\n  mad r11.xyz, r7.xyzx, l(1023.000000, 2047.000000, 2047.000000, 0.000000), l(0.500000, 0.500000, 0.500000, 0.000000)\n  ftou r11.xyz, r11.xyzx\n  imad r0.x, r11.y, l(1024), r11.x\n  imad r6.y, r11.z, l(0x00200000), r0.x\n  mov_sat r9.xyz, r9.xyzx\n  mad r11.xyz, r9.xyzx, l(1023.000000, 2047.000000, 2047.000000, 0.000000), l(0.500000, 0.500000, 0.500000, 0.000000)\n  ftou r11.xyz, r11.xyzx\n  imad r0.x, r11.y, l(1024), r11.x\n  imad r6.z, r11.z, l(0x00200000), r0.x\n  mov_sat r8.xz, r10.xxzx\n  mov_sat r8.y, r8.y\n  mad r11.xyz, r8.xyzx, l(1023.000000, 2047.000000, 2047.000000, 0.000000), l(0.500000, 0.500000, 0.500000, 0.000000)\n  ftou r11.xyz, r11.xyzx\n  imad r0.x, r11.y, l(1024), r11.x\n  imad r10.x, r11.z, l(0x00200000), r0.x\n  mov r10.yzw, r6.yyxz\n  break \n  case l(25)\n  mov_sat r5.xy, r5.xyxx\n  mad r0.xy, r5.xyxx, l(65535.000000, 65535.000000, 0.000000, 0.000000), l(0.500000, 0.500000, 0.000000, 0.000000)\n  ftou r0.xy, r0.xyxx\n  imad r10.z, r0.y, l(0x00010000), r0.x\n  mov_sat r7.xy, r7.xyxx\n  mad r0.xy, r7.xyxx, l(65535.000000, 65535.000000, 0.000000, 0.000000), l(0.500000, 0.500000, 0.000000, 0.000000)\n  ftou r0.xy, r0.xyxx\n  imad r10.y, r0.y, l(0x00010000), r0.x\n  mov_sat r9.xy, r9.xyxx\n  mad r0.xy, r9.xyxx, l(65535.000000, 65535.000000, 0.000000, 0.000000), l(0.500000, 0.500000, 0.000000, 0.000000)\n  ftou r0.xy, r0.xyxx\n  imad r10.w, r0.y, l(0x00010000), r0.x\n  mov_sat r8.x, r10.x\n  mov_sat r8.y, r8.y\n  mad r0.xy, r8.xyxx, l(65535.000000, 65535.000000, 0.000000, 0.000000), l(0.500000, 0.500000, 0.000000, 0.000000)\n  ftou r0.xy, r0.xyxx\n  imad r10.x, r0.y, l(0x00010000), r0.x\n  break \n  case l(31)\n  f32tof16 r0.xy, r5.xyxx\n  imad r10.z, r0.y, l(0x00010000), r0.x\n  f32tof16 r0.xy, r7.xyxx\n  imad r10.y, r0.y, l(0x00010000), r0.x\n  f32tof16 r0.xy, r9.xyxx\n  imad r10.w, r0.y, l(0x00010000), r0.x\n  f32tof16 r0.x, r10.x\n  f32tof16 r0.y, r8.y\n  imad r10.x, r0.y, l(0x00010000), r0.x\n  break \n  default \n  mov r10.z, r5.x\n  mov r10.y, r7.x\n  mov r10.w, r9.x\n  break \nendswitch \nieq r0.x, r4.x, l(0)\nine r0.y, r1.x, l(0)\nand r0.x, r0.y, r0.x\nif_nz r0.x\n  uge r0.x, r1.x, l(2)\n  if_nz r0.x\n    uge r0.x, r1.x, l(3)\n    if_nz r0.x\n      mov r10.w, r10.x\n    endif \n    mov r10.yw, r10.wwww\n  endif \n  mov r10.yzw, r10.yyyw\nendif \nmov r4.z, vThreadID.y\nimad r0.xy, r3.xzxx, r2.yxyy, r4.zxzz\nushr r1.xy, r0.yxyy, l(4, 1, 0, 0)\nudiv r4.xyzw, null, r1.yxyy, r2.yxyy\nimad r1.xy, -r2.xyxx, r4.ywyy, r1.xyxx\nishl r1.z, r4.y, l(4)\nimad r1.x, r1.x, r2.y, r1.y\nbfi r0.xy, l(1, 4, 0, 0), l(6, 2, 0, 0), r0.xyxx, l(0, 0, 0, 0)\nbfi r0.x, l(25), l(7), r1.x, r0.x\niadd r0.x, r0.x, r0.y\nif_nz r0.w\n  ubfe r0.y, l(3), l(4), CB0[0][0].z\n  bfi r0.w, l(10), l(1), r3.y, l(0)\n  ishr r1.x, r0.y, l(2)\n  ibfe r3.xyzw, l(28, 27, 31, 29), l(3, 1, 0, 2), r4.wyww\n  imad r0.w, r1.x, r0.w, r3.x\n  imad r0.w, r0.w, r1.w, r3.y\n  bfi r0.y, l(2), l(5), r0.y, l(0)\n  bfi r1.y, l(2), l(3), r3.z, l(0)\n  iadd r0.y, r0.y, r1.y\n  bfi r0.y, l(25), l(7), r0.w, r0.y\n  xor r0.w, r1.x, r3.w\n  ishr r1.x, r1.z, l(3)\n  and r1.x, r1.x, l(2)\n  bfi r2.zw, l(0, 0, 1, 1), l(0, 0, 1, 11), r0.wwww, l(0, 0, 0, 0)\n  xor r0.w, r1.x, r2.z\n  ishl r0.w, r0.w, l(6)\n  iadd r0.w, r2.w, r0.w\n  ibfe r1.xy, l(27, 24, 0, 0), l(3, 6, 0, 0), r0.yyyy\n  bfi r0.y, l(3), l(8), r1.x, r0.w\n  bfi r0.y, l(20), l(12), r1.y, r0.y\nelse \n  ibfe r3.xyzw, l(27, 27, 31, 28), l(4, 1, 0, 3), r4.xyzw\n  imad r0.w, r3.x, r1.w, r3.y\n  bfi r1.xy, l(3, 1, 0, 0), l(3, 11, 0, 0), r3.zwzz, l(0, 0, 0, 0)\n  bfi r0.w, l(26), l(6), r0.w, r1.x\n  ishr r1.x, r1.z, l(3)\n  and r1.x, r1.x, l(2)\n  ibfe r1.z, l(29), l(2), r4.w\n  bfi r1.z, l(1), l(1), r1.z, l(0)\n  xor r1.x, r1.z, r1.x\n  ishl r1.x, r1.x, l(6)\n  iadd r1.x, r1.y, r1.x\n  ibfe r1.yz, l(0, 27, 24, 0), l(0, 3, 6, 0), r0.wwww\n  bfi r0.w, l(3), l(8), r1.y, r1.x\n  bfi r0.y, l(20), l(12), r1.z, r0.w\nendif \nimul null, r0.w, r2.y, r2.x\nimad r0.x, r0.y, r0.w, r0.x\nieq r0.yzw, r0.zzzz, l(0, 1, 2, 3)\nor r0.yz, r0.zzwz, r0.yyzy\nif_nz r0.y\n  ishl r1.xyzw, r10.zywx, l(8, 8, 8, 8)\n  and r1.xyzw, r1.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r2.xyzw, r10.zywx, l(8, 8, 8, 8)\n  and r2.xyzw, r2.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r10.xyzw, r1.wyxz, r2.wyxz\nendif \nif_nz r0.z\n  ushr r1.xyzw, r10.zywx, l(16, 16, 16, 16)\n  bfi r10.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r10.xyzw, r1.wyxz\nendif \nstore_raw U0[0].xyzw, r0.x, r10.zywx\nret \n// Approximately 1317 instruction slots used\n#endif\n\nconst BYTE resolve_full_32bpp_scaled_cs[] =\n{\n     68,  88,  66,  67,  46, 230, \n    121, 239,  24, 247, 125, 246, \n    119, 136, 128, 170,  99, 218, \n    234, 230,   1,   0,   0,   0, \n    172, 158,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n    144,   2,   0,   0, 160,   2, \n      0,   0, 176,   2,   0,   0, \n     16, 158,   0,   0,  82,  68, \n     69,  70,  84,   2,   0,   0, \n      1,   0,   0,   0, 228,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n     44,   2,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 197,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 213,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 114, 101, 115, \n    111, 108, 118, 101,  95, 101, \n    100, 114,  97, 109,   0, 120, \n    101,  95, 114, 101, 115, 111, \n    108, 118, 101,  95, 100, 101, \n    115, 116,   0, 112, 117, 115, \n    104,  95,  99, 111, 110, 115, \n    116, 115,  95, 120, 101,   0, \n    213,   0,   0,   0,   4,   0, \n      0,   0, 252,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    156,   1,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 184,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 220,   1, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 184,   1,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 247,   1,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    184,   1,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     12,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 184,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 120, 101, \n     95, 114, 101, 115, 111, 108, \n    118, 101,  95, 101, 100, 114, \n     97, 109,  95, 105, 110, 102, \n    111,   0, 100, 119, 111, 114, \n    100,   0,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 178,   1, \n      0,   0, 120, 101,  95, 114, \n    101, 115, 111, 108, 118, 101, \n     95,  99, 111, 111, 114, 100, \n    105, 110,  97, 116, 101,  95, \n    105, 110, 102, 111,   0, 120, \n    101,  95, 114, 101, 115, 111, \n    108, 118, 101,  95, 100, 101, \n    115, 116,  95, 105, 110, 102, \n    111,   0, 120, 101,  95, 114, \n    101, 115, 111, 108, 118, 101, \n     95, 100, 101, 115, 116,  95, \n     99, 111, 111, 114, 100, 105, \n    110,  97, 116, 101,  95, 105, \n    110, 102, 111,   0,  77, 105, \n     99, 114, 111, 115, 111, 102, \n    116,  32,  40,  82,  41,  32, \n     72,  76,  83,  76,  32,  83, \n    104,  97, 100, 101, 114,  32, \n     67, 111, 109, 112, 105, 108, \n    101, 114,  32,  49,  48,  46, \n     49,   0,  73,  83,  71,  78, \n      8,   0,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     79,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  83,  72, \n     69,  88,  88, 155,   0,   0, \n     81,   0,   5,   0, 214,  38, \n      0,   0, 106,   8,   0,   1, \n     89,   0,   0,   7,  70, 142, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0, 161,   0, \n      0,   6,  70, 126,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 157,   0, \n      0,   6,  70, 238,  49,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  95,   0, \n      0,   2,  50,   0,   2,   0, \n    104,   0,   0,   2,  24,   0, \n      0,   0, 155,   0,   0,   4, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,  12, 242,   0, \n     16,   0,   0,   0,   0,   0, \n      6, 138,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n      0,   0,   0,  32,   7,   0, \n      0,   0,   8,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   0,   0,   0,   0, \n    138,   0,   0,  17,  50,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n     17,   0,   0,   0,  20,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86, 133, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  18,   0,   0,   1, \n     54,   0,   0,   8,  50,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n    138,   0,   0,  17, 114,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  19,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,  86, 133, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,   1,   0, \n      0,  12, 194,   0,  16,   0, \n      1,   0,   0,   0, 166, 142, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   1, \n    255,   3,   0,   0,  85,   0, \n      0,  12, 242,   0,  16,   0, \n      3,   0,   0,   0, 214, 143, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     24,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      4,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   7,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  80,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      4,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  17, \n    242,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,  11,   0, \n      0,   0,   4,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     13,   0,   0,   0,  24,   0, \n      0,   0,  28,   0,   0,   0, \n      6, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   7,  18,   0,  16,   0, \n      6,   0,   0,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     34,   0,  16,   0,   6,   0, \n      0,   0,  10,   0,  16,   0, \n      3,   0,   0,   0, 140,   0, \n      0,  20, 194,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   4,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   6,   4,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    139,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  23,   0,   0,   0, \n     30,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0, 128,  63, 140,   0, \n      0,  20,  82,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 246,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    138,   0,   0,  17,  50,   0, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   6,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,  28,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 230, 138, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  83,   0,   0,   6, \n     34,   0,  16,   0,   4,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,   9, \n    194,   0,  16,   0,   2,   0, \n      0,   0, 166,  14,  16,   0, \n      2,   0,   0,   0,   6,   4, \n     16,   0,   2,   0,   0,   0, \n      6,   4,  16,   0,   4,   0, \n      0,   0,  80,   0,   0,   7, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   6,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     54,   0,   0,   5,  34,   0, \n     16,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   6,   0, \n      0,   0,  18,   0,   0,   1, \n     32,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      1,   0,   0,   0,  54,   0, \n      0,   5,  34,   0,  16,   0, \n      7,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     18,   0,   0,   1,  54,   0, \n      0,   5,  34,   0,  16,   0, \n      7,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  21,   0, \n      0,   1,  80,   0,   0,  10, \n    162,   0,  16,   0,   4,   0, \n      0,   0,   6,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,  10, 162,   0, \n     16,   0,   4,   0,   0,   0, \n     86,  13,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  41,   0, \n      0,   7, 194,   0,  16,   0, \n      2,   0,   0,   0, 166,  14, \n     16,   0,   2,   0,   0,   0, \n     86,  13,  16,   0,   4,   0, \n      0,   0,  85,   0,   0,   7, \n     18,   0,  16,   0,   7,   0, \n      0,   0,  26,   0,  16,   0, \n      7,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,  10, 194,   0, \n     16,   0,   6,   0,   0,   0, \n      6,   4,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7, 194,   0,  16,   0, \n      2,   0,   0,   0, 166,  14, \n     16,   0,   2,   0,   0,   0, \n    166,  14,  16,   0,   6,   0, \n      0,   0,  38,   0,   0,  11, \n      0, 208,   0,   0,  98,   0, \n     16,   0,   7,   0,   0,   0, \n      6,   1,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  80,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,   7,  18,   0,  16,   0, \n      7,   0,   0,   0,  26,   0, \n     16,   0,   7,   0,   0,   0, \n     58,   0,  16,   0,   5,   0, \n      0,   0,  78,   0,   0,   8, \n    194,   0,  16,   0,   6,   0, \n      0,   0,   0, 208,   0,   0, \n    166,  14,  16,   0,   2,   0, \n      0,   0,   6,   8,  16,   0, \n      7,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   6,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      6,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0,  35,   0,   0,  10, \n    194,   0,  16,   0,   2,   0, \n      0,   0, 166,  14,  16, 128, \n     65,   0,   0,   0,   6,   0, \n      0,   0,   6,   8,  16,   0, \n      7,   0,   0,   0, 166,  14, \n     16,   0,   2,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0,  34,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   7,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   7,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  41,   0,   0,   7, \n     66,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   5,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     41,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     11,   0,   0,   0,  78,   0, \n      0,   8,   0, 208,   0,   0, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     41,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  30,   0, \n      0,   7,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n     58,   0,  16,   0,   5,   0, \n      0,   0,  41,   0,   0,   7, \n     66,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     31,   0,   4,   3,  58,   0, \n     16,   0,   5,   0,   0,   0, \n     32,   0,   0,   7, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  31,   0, \n      4,   3,  58,   0,  16,   0, \n      2,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      7,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n    230, 116,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      8,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n    230, 116,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  50,   0, \n     16,   0,   9,   0,   0,   0, \n    230,  10,  16,   0,   7,   0, \n      0,   0,  54,   0,   0,   5, \n     50,   0,  16,   0,  10,   0, \n      0,   0, 230,  10,  16,   0, \n      8,   0,   0,   0,  18,   0, \n      0,   1, 165,   0,   0,   8, \n     50,   0,  16,   0,   9,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  70, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 130,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0, 165,   0,   0,   8, \n     50,   0,  16,   0,   7,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,  70, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 162,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  12,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n    162,   0,  16,   0,   4,   0, \n      0,   0,   6,   0,  16,   0, \n      0,   0,   0,   0,  86,  13, \n     16,   0,   4,   0,   0,   0, \n    165,   0,   0,   8,  50,   0, \n     16,   0,  10,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0,  70, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n     50,   0,  16,   0,   8,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,  70, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  76,   0,   0,   3, \n     42,   0,  16,   0,   5,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  41,   0,   0,  10, \n    194,   0,  16,   0,   9,   0, \n      0,   0,   6,   4,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     38,   7,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,  41,   0,   0,  10, \n    194,   0,  16,   0,   7,   0, \n      0,   0,   6,   4,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     38,   7,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10, 242,   0,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,  41,   0,   0,  10, \n    194,   0,  16,   0,  10,   0, \n      0,   0,   6,   4,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     38,   7,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,  41,   0,   0,  10, \n    194,   0,  16,   0,   8,   0, \n      0,   0,   6,   4,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     38,   7,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     85,   0,   0,  10, 162,   0, \n     16,   0,   4,   0,   0,   0, \n      6,   4,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0, 131,   0, \n      0,   5,  82,   0,  16,   0, \n      9,   0,   0,   0,   6,   1, \n     16,   0,   9,   0,   0,   0, \n    131,   0,   0,   5, 162,   0, \n     16,   0,   9,   0,   0,   0, \n     86,  13,  16,   0,   4,   0, \n      0,   0,  85,   0,   0,  10, \n    162,   0,  16,   0,   4,   0, \n      0,   0,   6,   4,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n    131,   0,   0,   5,  82,   0, \n     16,   0,   7,   0,   0,   0, \n      6,   1,  16,   0,   7,   0, \n      0,   0, 131,   0,   0,   5, \n    162,   0,  16,   0,   7,   0, \n      0,   0,  86,  13,  16,   0, \n      4,   0,   0,   0,  85,   0, \n      0,  10, 162,   0,  16,   0, \n      4,   0,   0,   0,   6,   4, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0, 131,   0,   0,   5, \n     82,   0,  16,   0,  10,   0, \n      0,   0,   6,   1,  16,   0, \n     10,   0,   0,   0, 131,   0, \n      0,   5, 162,   0,  16,   0, \n     10,   0,   0,   0,  86,  13, \n     16,   0,   4,   0,   0,   0, \n     85,   0,   0,  10, 162,   0, \n     16,   0,   4,   0,   0,   0, \n      6,   4,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0, 131,   0, \n      0,   5,  82,   0,  16,   0, \n      8,   0,   0,   0,   6,   1, \n     16,   0,   8,   0,   0,   0, \n    131,   0,   0,   5, 162,   0, \n     16,   0,   8,   0,   0,   0, \n     86,  13,  16,   0,   4,   0, \n      0,   0,   2,   0,   0,   1, \n     10,   0,   0,   1,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,  23,   0, \n      0,   1,  18,   0,   0,   1, \n     32,   0,   0,   7, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  31,   0, \n      4,   3,  58,   0,  16,   0, \n      2,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      8,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     54, 121,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     18,   0,   0,   1, 165,   0, \n      0,   8,  34,   0,  16,   0, \n      8,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0, 165,   0, \n      0,   8,  66,   0,  16,   0, \n      8,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     41,   0,   0,  10, 162,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  12,   0, \n      0,   0,  86,   5,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7, 162,   0,  16,   0, \n      4,   0,   0,   0,   6,   0, \n     16,   0,   0,   0,   0,   0, \n     86,  13,  16,   0,   4,   0, \n      0,   0, 165,   0,   0,   8, \n    130,   0,  16,   0,   8,   0, \n      0,   0,  26,   0,  16,   0, \n      4,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8,  18,   0,  16,   0, \n      8,   0,   0,   0,  58,   0, \n     16,   0,   4,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  76,   0, \n      0,   3,  42,   0,  16,   0, \n      5,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      0,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      1,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     11,   0,   0,   0,  86,   5, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     16,   0,   0,   0,  24,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  11,   0, \n      0,   0,  26,   0,  16,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59,  85,   0,   0,  10, \n    226,   0,  16,   0,  11,   0, \n      0,   0, 166,  10,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  11,   0,   0,   0, \n     42,   0,  16,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  11,   0,   0,   0, \n    246,  15,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  16,   0,   0,   0, \n     24,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     11,   0,   0,   0,  58,   0, \n     16,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      8,   0,   0,   0,   6,   0, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     16,   0,   0,   0,  24,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      2,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n     10,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     11,   0,   0,   0,  86,   5, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  11,   0, \n      0,   0,  26,   0,  16,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   3,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   8,  32, \n    128,  58,   8,  32, 128,  58, \n      8,  32, 128,  58, 171, 170, \n    170,  62,  85,   0,   0,  10, \n    226,   0,  16,   0,  11,   0, \n      0,   0, 166,  10,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  11,   0,   0,   0, \n     42,   0,  16,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   3,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   8,  32, 128,  58, \n      8,  32, 128,  58,   8,  32, \n    128,  58, 171, 170, 170,  62, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  11,   0,   0,   0, \n    246,  15,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     30,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     11,   0,   0,   0,  58,   0, \n     16,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      3,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      8,  32, 128,  58,   8,  32, \n    128,  58,   8,  32, 128,  58, \n    171, 170, 170,  62,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      8,   0,   0,   0,   6,   0, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   3,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   8,  32, 128,  58, \n      8,  32, 128,  58,   8,  32, \n    128,  58, 171, 170, 170,  62, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n     12,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0,  86,   9, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     30,   0,   0,   0,  30,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  12,   0, \n      0,   0,  26,   0,  16,   0, \n      8,   0,   0,   0,  54,   0, \n      0,   5,  98,   0,  16,   0, \n     12,   0,   0,   0,   6,   1, \n     16,   0,  11,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0, 135,   0,   0,   5, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     14,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255,   0,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  11, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16, 128, \n     65,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     17,   0,   0,   0, 140,   0, \n      0,  17, 114,   0,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  14,   0, \n      0,   0,  70,   2,  16,   0, \n     12,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n      2,  64,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  14,   0, \n      0,   0,  70,   2,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 114,   0,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  14,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,   9,   0, \n      0,   0,  70,   2,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  86,   0,   0,   5, \n    162,   0,  16,   0,   4,   0, \n      0,   0, 166,  14,  16,   0, \n     11,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0, 230,  11, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  12,   0, \n      0,   0,  42,   0,  16,   0, \n      8,   0,   0,   0,  54,   0, \n      0,   5,  98,   0,  16,   0, \n     12,   0,   0,   0,   6,   3, \n     16,   0,  11,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0, 135,   0,   0,   5, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     14,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255,   0,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  11, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16, 128, \n     65,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     17,   0,   0,   0, 140,   0, \n      0,  17, 114,   0,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  14,   0, \n      0,   0,  70,   2,  16,   0, \n     12,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n      2,  64,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  14,   0, \n      0,   0,  70,   2,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 114,   0,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  14,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,   7,   0, \n      0,   0,  70,   2,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  56,   0,   0,  10, \n    162,   0,  16,   0,   4,   0, \n      0,   0,  86,  13,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n    171, 170, 170,  62,   0,   0, \n      0,   0, 171, 170, 170,  62, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  11,   0,   0,   0, \n     58,   0,  16,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  12,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 114,   0,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0, 135,   0, \n      0,   5, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  13,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n    232, 255, 255, 255, 232, 255, \n    255, 255, 232, 255, 255, 255, \n      0,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  11, 114,   0,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16, 128,  65,   0,   0,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  16,   0,   0,   0, \n     70,   2,  16,   0,  14,   0, \n      0,   0,  70,   2,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n    140,   0,   0,  17, 114,   0, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  11,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  11,   0,   0,   0, \n     70,   2,  16,   0,  14,   0, \n      0,   0,  70,   2,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  11,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 114,   0, \n     16,   0,  11,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     10,   0,   0,   0,  70,   2, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0,  54,   0, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,  30,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,  86,   0,   0,   5, \n     50,   0,  16,   0,   5,   0, \n      0,   0, 198,   0,  16,   0, \n     11,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     11,   0,   0,   0,  10,   0, \n     16,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0, 135,   0,   0,   5, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     13,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255,   0,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  11, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16, 128, \n     65,   0,   0,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  14,   0,   0,   0, \n     70,   2,  16,   0,  14,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0, 140,   0, \n      0,  17, 114,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  11,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,  14,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  11,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 114,   0,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,   8,   0, \n      0,   0,  70,   2,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  56,   0,   0,  10, \n     50,   0,  16,   0,   5,   0, \n      0,   0,  70,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0, 171, 170, 170,  62, \n    171, 170, 170,  62,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5, 130,   0, \n     16,   0,   9,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0,  54,   0,   0,   5, \n    130,   0,  16,   0,   7,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,  54,   0, \n      0,   5, 130,   0,  16,   0, \n     10,   0,   0,   0,  10,   0, \n     16,   0,   5,   0,   0,   0, \n     54,   0,   0,   5, 130,   0, \n     16,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n    150,   3,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  54,   0, \n      0,   5,  82,   0,  16,   0, \n     12,   0,   0,   0,   6,   1, \n     16,   0,  11,   0,   0,   0, \n     54,   0,   0,   5, 162,   0, \n     16,   0,  12,   0,   0,   0, \n     86,   9,  16,   0,   8,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10,  50,   0, \n     16,   0,   9,   0,   0,   0, \n     70,   0,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0,   0,   0, \n      0,   0,   0,   0,  52,   0, \n      0,  10,  50,   0,  16,   0, \n      7,   0,   0,   0, 230,  10, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     98,   0,  16,   0,   8,   0, \n      0,   0, 166,  11,  16,   0, \n     11,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0, 214,   2, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n     50,   0,  16,   0,  10,   0, \n      0,   0,  70,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     52,   0,   0,  10,  50,   0, \n     16,   0,   8,   0,   0,   0, \n    230,  10,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      6,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0, 150,   3, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 131,   0,   0,   5, \n     18,   0,  16,   0,   9,   0, \n      0,   0,  26,   0,  16,   0, \n      8,   0,   0,   0, 131,   0, \n      0,   5,  34,   0,  16,   0, \n      9,   0,   0,   0,  10,   0, \n     16,   0,  11,   0,   0,   0, \n    131,   0,   0,   5,  18,   0, \n     16,   0,   7,   0,   0,   0, \n     42,   0,  16,   0,   8,   0, \n      0,   0, 131,   0,   0,   5, \n     34,   0,  16,   0,   7,   0, \n      0,   0,  26,   0,  16,   0, \n     11,   0,   0,   0, 131,   0, \n      0,   5,  18,   0,  16,   0, \n     10,   0,   0,   0,  58,   0, \n     16,   0,   8,   0,   0,   0, \n    131,   0,   0,   5,  34,   0, \n     16,   0,  10,   0,   0,   0, \n     42,   0,  16,   0,  11,   0, \n      0,   0, 131,   0,   0,   5, \n     18,   0,  16,   0,   8,   0, \n      0,   0,  10,   0,  16,   0, \n      8,   0,   0,   0, 131,   0, \n      0,   5,  34,   0,  16,   0, \n      8,   0,   0,   0,  58,   0, \n     16,   0,  11,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   1, \n     10,   0,   0,   1,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      9,   0,   0,   0,  26,   0, \n     16,   0,   8,   0,   0,   0, \n     54,   0,   0,   8, 226,   0, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   7,   0, \n      0,   0,  42,   0,  16,   0, \n      8,   0,   0,   0,  54,   0, \n      0,   8, 226,   0,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  10,   0,   0,   0, \n     58,   0,  16,   0,   8,   0, \n      0,   0,  54,   0,   0,   8, \n    226,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 226,   0,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,  23,   0, \n      0,   1,  21,   0,   0,   1, \n     80,   0,   0,   7, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  31,   0, \n      4,   3,  58,   0,  16,   0, \n      2,   0,   0,   0,  56,   0, \n      0,   7, 130,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  63,  35,   0,   0,   9, \n    130,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n     64,   1,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     58,   0,  16,   0,   5,   0, \n      0,   0,  32,   0,   0,   7, \n     34,   0,  16,   0,   4,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   4,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0, 230, 116,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     34,   0,  16,   0,   4,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0, 230, 116,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     50,   0,  16,   0,  13,   0, \n      0,   0, 230,  10,  16,   0, \n     11,   0,   0,   0,  54,   0, \n      0,   5,  50,   0,  16,   0, \n     14,   0,   0,   0, 230,  10, \n     16,   0,  12,   0,   0,   0, \n     18,   0,   0,   1, 165,   0, \n      0,   8,  50,   0,  16,   0, \n     13,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n     70, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  34,   0, \n     16,   0,   4,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0, 165,   0, \n      0,   8,  50,   0,  16,   0, \n     11,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n     70, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     41,   0,   0,  10, 162,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  12,   0, \n      0,   0,  86,   5,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7, 162,   0,  16,   0, \n      4,   0,   0,   0, 246,  15, \n     16,   0,   3,   0,   0,   0, \n     86,  13,  16,   0,   4,   0, \n      0,   0, 165,   0,   0,   8, \n     50,   0,  16,   0,  14,   0, \n      0,   0,  26,   0,  16,   0, \n      4,   0,   0,   0,  70, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8,  50,   0,  16,   0, \n     12,   0,   0,   0,  58,   0, \n     16,   0,   4,   0,   0,   0, \n     70, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  76,   0, \n      0,   3,  42,   0,  16,   0, \n      5,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      5,   0,   0,   0,  41,   0, \n      0,  10, 194,   0,  16,   0, \n     13,   0,   0,   0,   6,   4, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  38,   7,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,  41,   0, \n      0,  10, 194,   0,  16,   0, \n     11,   0,   0,   0,   6,   4, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  38,   7,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,  41,   0, \n      0,  10, 194,   0,  16,   0, \n     14,   0,   0,   0,   6,   4, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  38,   7,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10, 242,   0, \n     16,   0,  14,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,  41,   0, \n      0,  10, 194,   0,  16,   0, \n     12,   0,   0,   0,   6,   4, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  38,   7,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  85,   0,   0,  10, \n    162,   0,  16,   0,   4,   0, \n      0,   0,   6,   4,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n    131,   0,   0,   5,  82,   0, \n     16,   0,  13,   0,   0,   0, \n      6,   1,  16,   0,  13,   0, \n      0,   0, 131,   0,   0,   5, \n    162,   0,  16,   0,  13,   0, \n      0,   0,  86,  13,  16,   0, \n      4,   0,   0,   0,  85,   0, \n      0,  10, 162,   0,  16,   0, \n      4,   0,   0,   0,   6,   4, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0, 131,   0,   0,   5, \n     82,   0,  16,   0,  11,   0, \n      0,   0,   6,   1,  16,   0, \n     11,   0,   0,   0, 131,   0, \n      0,   5, 162,   0,  16,   0, \n     11,   0,   0,   0,  86,  13, \n     16,   0,   4,   0,   0,   0, \n     85,   0,   0,  10, 162,   0, \n     16,   0,   4,   0,   0,   0, \n      6,   4,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0, 131,   0, \n      0,   5,  82,   0,  16,   0, \n     14,   0,   0,   0,   6,   1, \n     16,   0,  14,   0,   0,   0, \n    131,   0,   0,   5, 162,   0, \n     16,   0,  14,   0,   0,   0, \n     86,  13,  16,   0,   4,   0, \n      0,   0,  85,   0,   0,  10, \n    162,   0,  16,   0,   4,   0, \n      0,   0,   6,   4,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n    131,   0,   0,   5,  82,   0, \n     16,   0,  12,   0,   0,   0, \n      6,   1,  16,   0,  12,   0, \n      0,   0, 131,   0,   0,   5, \n    162,   0,  16,   0,  12,   0, \n      0,   0,  86,  13,  16,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   1,  10,   0,   0,   1, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   1, \n     23,   0,   0,   1,  18,   0, \n      0,   1,  32,   0,   0,   7, \n     34,   0,  16,   0,   4,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   4,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,  54, 121,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  18,   0,   0,   1, \n    165,   0,   0,   8,  34,   0, \n     16,   0,  12,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     34,   0,  16,   0,   4,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n    165,   0,   0,   8,  66,   0, \n     16,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    162,   0,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n     12,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7, 162,   0, \n     16,   0,   4,   0,   0,   0, \n    246,  15,  16,   0,   3,   0, \n      0,   0,  86,  13,  16,   0, \n      4,   0,   0,   0, 165,   0, \n      0,   8, 130,   0,  16,   0, \n     12,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    165,   0,   0,   8,  18,   0, \n     16,   0,  12,   0,   0,   0, \n     58,   0,  16,   0,   4,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     76,   0,   0,   3,  42,   0, \n     16,   0,   5,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   0,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  15,   0,   0,   0, \n     86,   5,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  16,   0,   0,   0, \n     24,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     15,   0,   0,   0,  26,   0, \n     16,   0,  12,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     15,   0,   0,   0, 166,  10, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     16,   0,   0,   0,  24,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  15,   0, \n      0,   0,  42,   0,  16,   0, \n     12,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59,  85,   0,   0,  10, \n    226,   0,  16,   0,  15,   0, \n      0,   0, 246,  15,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  15,   0,   0,   0, \n     58,   0,  16,   0,  12,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  14,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  12,   0,   0,   0, \n      6,   0,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  16,   0,   0,   0, \n     24,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,  10,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  15,   0,   0,   0, \n     86,   5,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     30,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     15,   0,   0,   0,  26,   0, \n     16,   0,  12,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      3,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      8,  32, 128,  58,   8,  32, \n    128,  58,   8,  32, 128,  58, \n    171, 170, 170,  62,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     15,   0,   0,   0, 166,  10, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  15,   0, \n      0,   0,  42,   0,  16,   0, \n     12,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   3,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   8,  32, \n    128,  58,   8,  32, 128,  58, \n      8,  32, 128,  58, 171, 170, \n    170,  62,  85,   0,   0,  10, \n    226,   0,  16,   0,  15,   0, \n      0,   0, 246,  15,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  15,   0,   0,   0, \n     58,   0,  16,   0,  12,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   3,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  14,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   8,  32, 128,  58, \n      8,  32, 128,  58,   8,  32, \n    128,  58, 171, 170, 170,  62, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  12,   0,   0,   0, \n      6,   0,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     30,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   3,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   8,  32, \n    128,  58,   8,  32, 128,  58, \n      8,  32, 128,  58, 171, 170, \n    170,  62,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     86,   9,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n     30,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     16,   0,   0,   0,  26,   0, \n     16,   0,  12,   0,   0,   0, \n     54,   0,   0,   5,  98,   0, \n     16,   0,  16,   0,   0,   0, \n      6,   1,  16,   0,  15,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 114,   0,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0, 135,   0, \n      0,   5, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,   2,  64,   0,   0, \n    232, 255, 255, 255, 232, 255, \n    255, 255, 232, 255, 255, 255, \n      0,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  11, 114,   0,  16,   0, \n     21,   0,   0,   0,  70,   2, \n     16, 128,  65,   0,   0,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  21,   0,   0,   0, \n    140,   0,   0,  17, 114,   0, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  16,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  21,   0, \n      0,   0,   2,  64,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 114,   0, \n     16,   0,  16,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   0, \n      0,   5, 162,   0,  16,   0, \n      4,   0,   0,   0, 166,  14, \n     16,   0,  15,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,  15,   0,   0,   0, \n    230,  11,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     16,   0,   0,   0,  42,   0, \n     16,   0,  12,   0,   0,   0, \n     54,   0,   0,   5,  98,   0, \n     16,   0,  16,   0,   0,   0, \n      6,   3,  16,   0,  15,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 114,   0,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0, 135,   0, \n      0,   5, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,   2,  64,   0,   0, \n    232, 255, 255, 255, 232, 255, \n    255, 255, 232, 255, 255, 255, \n      0,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  11, 114,   0,  16,   0, \n     21,   0,   0,   0,  70,   2, \n     16, 128,  65,   0,   0,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  21,   0,   0,   0, \n    140,   0,   0,  17, 114,   0, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  16,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  21,   0, \n      0,   0,   2,  64,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 114,   0, \n     16,   0,  16,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  56,   0, \n      0,  10, 162,   0,  16,   0, \n      4,   0,   0,   0,  86,  13, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0, 171, 170, 170,  62, \n      0,   0,   0,   0, 171, 170, \n    170,  62,  54,   0,   0,   5, \n     18,   0,  16,   0,  15,   0, \n      0,   0,  58,   0,  16,   0, \n     12,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n    138,   0,   0,  15, 114,   0, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n    135,   0,   0,   5, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0, 232, 255, 255, 255, \n    232, 255, 255, 255, 232, 255, \n    255, 255,   0,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  11, 114,   0, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16, 128,  65,   0, \n      0,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0, 140,   0,   0,  17, \n    114,   0,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  14,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     54,   0,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n     30,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     30,   0,   0,   0,  86,   0, \n      0,   5,  50,   0,  16,   0, \n      5,   0,   0,   0, 198,   0, \n     16,   0,  15,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  15,   0,   0,   0, \n     10,   0,  16,   0,  12,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 114,   0,  16,   0, \n     18,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0, 135,   0, \n      0,   5, 114,   0,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n    232, 255, 255, 255, 232, 255, \n    255, 255, 232, 255, 255, 255, \n      0,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  11, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16, 128,  65,   0,   0,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  20,   0,   0,   0, \n    140,   0,   0,  17, 114,   0, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,   2,  64,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  56,   0, \n      0,  10,  50,   0,  16,   0, \n      5,   0,   0,   0,  70,   0, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0, 171, 170, \n    170,  62, 171, 170, 170,  62, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n    130,   0,  16,   0,  13,   0, \n      0,   0,  26,   0,  16,   0, \n      4,   0,   0,   0,  54,   0, \n      0,   5, 130,   0,  16,   0, \n     11,   0,   0,   0,  58,   0, \n     16,   0,   4,   0,   0,   0, \n     54,   0,   0,   5, 130,   0, \n     16,   0,  14,   0,   0,   0, \n     10,   0,  16,   0,   5,   0, \n      0,   0,  54,   0,   0,   5, \n    130,   0,  16,   0,  12,   0, \n      0,   0,  26,   0,  16,   0, \n      5,   0,   0,   0,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0, 150,   3,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     54,   0,   0,   5,  82,   0, \n     16,   0,  16,   0,   0,   0, \n      6,   1,  16,   0,  15,   0, \n      0,   0,  54,   0,   0,   5, \n    162,   0,  16,   0,  16,   0, \n      0,   0,  86,   9,  16,   0, \n     12,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n     16,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n     50,   0,  16,   0,  13,   0, \n      0,   0,  70,   0,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     52,   0,   0,  10,  50,   0, \n     16,   0,  11,   0,   0,   0, \n    230,  10,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  98,   0,  16,   0, \n     12,   0,   0,   0, 166,  11, \n     16,   0,  15,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,  15,   0,   0,   0, \n    214,   2,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10,  50,   0,  16,   0, \n     14,   0,   0,   0,  70,   0, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  52,   0,   0,  10, \n     50,   0,  16,   0,  12,   0, \n      0,   0, 230,  10,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   6,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,  15,   0,   0,   0, \n    150,   3,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 131,   0, \n      0,   5,  18,   0,  16,   0, \n     13,   0,   0,   0,  26,   0, \n     16,   0,  12,   0,   0,   0, \n    131,   0,   0,   5,  34,   0, \n     16,   0,  13,   0,   0,   0, \n     10,   0,  16,   0,  15,   0, \n      0,   0, 131,   0,   0,   5, \n     18,   0,  16,   0,  11,   0, \n      0,   0,  42,   0,  16,   0, \n     12,   0,   0,   0, 131,   0, \n      0,   5,  34,   0,  16,   0, \n     11,   0,   0,   0,  26,   0, \n     16,   0,  15,   0,   0,   0, \n    131,   0,   0,   5,  18,   0, \n     16,   0,  14,   0,   0,   0, \n     58,   0,  16,   0,  12,   0, \n      0,   0, 131,   0,   0,   5, \n     34,   0,  16,   0,  14,   0, \n      0,   0,  42,   0,  16,   0, \n     15,   0,   0,   0, 131,   0, \n      0,   5,  18,   0,  16,   0, \n     12,   0,   0,   0,  10,   0, \n     16,   0,  12,   0,   0,   0, \n    131,   0,   0,   5,  34,   0, \n     16,   0,  12,   0,   0,   0, \n     58,   0,  16,   0,  15,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   1,  10,   0,   0,   1, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  13,   0,   0,   0, \n     26,   0,  16,   0,  12,   0, \n      0,   0,  54,   0,   0,   8, \n    226,   0,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     11,   0,   0,   0,  42,   0, \n     16,   0,  12,   0,   0,   0, \n     54,   0,   0,   8, 226,   0, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  14,   0, \n      0,   0,  58,   0,  16,   0, \n     12,   0,   0,   0,  54,   0, \n      0,   8, 226,   0,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 226,   0, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   1, \n     23,   0,   0,   1,  21,   0, \n      0,   1,   0,   0,   0,   7, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n      0,   0,   0,   7, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   7, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  14,   0, \n      0,   0,   0,   0,   0,   7, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n     80,   0,   0,   7,  34,   0, \n     16,   0,   4,   0,   0,   0, \n     26,   0,  16,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      4,   0,   0,   0,  41,   0, \n      0,   7,  34,   0,  16,   0, \n      4,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     58,   0,  16,   0,   5,   0, \n      0,   0,  56,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0, 128,  62, \n     30,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      4,   0,   0,   0,  31,   0, \n      4,   3,  58,   0,  16,   0, \n      5,   0,   0,   0,  32,   0, \n      0,   7, 130,   0,  16,   0, \n      4,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   8,   0, \n      0,   0,  31,   0,   4,   3, \n     58,   0,  16,   0,   4,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0, 230, 116, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 130,   0,  16,   0, \n      4,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0, 230, 116, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  50,   0,  16,   0, \n     13,   0,   0,   0, 230,  10, \n     16,   0,  11,   0,   0,   0, \n     54,   0,   0,   5,  50,   0, \n     16,   0,  14,   0,   0,   0, \n    230,  10,  16,   0,  12,   0, \n      0,   0,  18,   0,   0,   1, \n    165,   0,   0,   8,  50,   0, \n     16,   0,  13,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  70, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    130,   0,  16,   0,   4,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n    165,   0,   0,   8,  50,   0, \n     16,   0,  11,   0,   0,   0, \n     58,   0,  16,   0,   4,   0, \n      0,   0,  70, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n     50,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,   5,   0,   0,   0, \n      6,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      5,   0,   0,   0, 165,   0, \n      0,   8,  50,   0,  16,   0, \n     14,   0,   0,   0,  10,   0, \n     16,   0,   5,   0,   0,   0, \n     70, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    165,   0,   0,   8,  50,   0, \n     16,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0,  70, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     76,   0,   0,   3,  42,   0, \n     16,   0,   5,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   5,   0,   0,   0, \n     41,   0,   0,  10, 194,   0, \n     16,   0,  13,   0,   0,   0, \n      6,   4,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  38,   7, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n     41,   0,   0,  10, 194,   0, \n     16,   0,  11,   0,   0,   0, \n      6,   4,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  38,   7, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n     41,   0,   0,  10, 194,   0, \n     16,   0,  14,   0,   0,   0, \n      6,   4,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  38,   7, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n    242,   0,  16,   0,  14,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n     41,   0,   0,  10, 194,   0, \n     16,   0,  12,   0,   0,   0, \n      6,   4,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  38,   7, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      7,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      5,   0,   0,   0,  70,   0, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 131,   0,   0,   5, \n     82,   0,  16,   0,  13,   0, \n      0,   0,   6,   1,  16,   0, \n     13,   0,   0,   0, 131,   0, \n      0,   5, 162,   0,  16,   0, \n     13,   0,   0,   0,   6,   4, \n     16,   0,   5,   0,   0,   0, \n     85,   0,   0,  10,  50,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 131,   0, \n      0,   5,  82,   0,  16,   0, \n     11,   0,   0,   0,   6,   1, \n     16,   0,  11,   0,   0,   0, \n    131,   0,   0,   5, 162,   0, \n     16,   0,  11,   0,   0,   0, \n      6,   4,  16,   0,   5,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   5,   0, \n      0,   0,  70,   0,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    131,   0,   0,   5,  82,   0, \n     16,   0,  14,   0,   0,   0, \n      6,   1,  16,   0,  14,   0, \n      0,   0, 131,   0,   0,   5, \n    162,   0,  16,   0,  14,   0, \n      0,   0,   6,   4,  16,   0, \n      5,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      5,   0,   0,   0,  70,   0, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 131,   0,   0,   5, \n     82,   0,  16,   0,  12,   0, \n      0,   0,   6,   1,  16,   0, \n     12,   0,   0,   0, 131,   0, \n      0,   5, 162,   0,  16,   0, \n     12,   0,   0,   0,   6,   4, \n     16,   0,   5,   0,   0,   0, \n      2,   0,   0,   1,  10,   0, \n      0,   1,  54,   0,   0,   8, \n    194,   0,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   1,  23,   0,   0,   1, \n     18,   0,   0,   1,  32,   0, \n      0,   7, 130,   0,  16,   0, \n      4,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  31,   0,   4,   3, \n     58,   0,  16,   0,   4,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  54, 121, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  18,   0, \n      0,   1, 165,   0,   0,   8, \n     34,   0,  16,   0,  12,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 130,   0,  16,   0, \n      4,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n     66,   0,  16,   0,  12,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10,  50,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n     12,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   5,   0, \n      0,   0,   6,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   5,   0,   0,   0, \n    165,   0,   0,   8, 130,   0, \n     16,   0,  12,   0,   0,   0, \n     10,   0,  16,   0,   5,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n     18,   0,  16,   0,  12,   0, \n      0,   0,  26,   0,  16,   0, \n      5,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  76,   0,   0,   3, \n     42,   0,  16,   0,   5,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,   0,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,  15,   0, \n      0,   0,  86,   5,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  15,   0,   0,   0, \n     26,   0,  16,   0,  12,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  15,   0,   0,   0, \n    166,  10,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  16,   0,   0,   0, \n     24,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     15,   0,   0,   0,  42,   0, \n     16,   0,  12,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     15,   0,   0,   0, 246,  15, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     16,   0,   0,   0,  24,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  15,   0, \n      0,   0,  58,   0,  16,   0, \n     12,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     14,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59,  85,   0,   0,  10, \n    226,   0,  16,   0,  12,   0, \n      0,   0,   6,   0,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,  10,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,  15,   0, \n      0,   0,  86,   5,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  15,   0,   0,   0, \n     26,   0,  16,   0,  12,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   3,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   8,  32, 128,  58, \n      8,  32, 128,  58,   8,  32, \n    128,  58, 171, 170, 170,  62, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  15,   0,   0,   0, \n    166,  10,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     30,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     15,   0,   0,   0,  42,   0, \n     16,   0,  12,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      3,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      8,  32, 128,  58,   8,  32, \n    128,  58,   8,  32, 128,  58, \n    171, 170, 170,  62,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     15,   0,   0,   0, 246,  15, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  15,   0, \n      0,   0,  58,   0,  16,   0, \n     12,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   3,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     14,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   8,  32, \n    128,  58,   8,  32, 128,  58, \n      8,  32, 128,  58, 171, 170, \n    170,  62,  85,   0,   0,  10, \n    226,   0,  16,   0,  12,   0, \n      0,   0,   6,   0,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      3,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      8,  32, 128,  58,   8,  32, \n    128,  58,   8,  32, 128,  58, \n    171, 170, 170,  62,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  86,   9,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,  30,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  16,   0,   0,   0, \n     26,   0,  16,   0,  12,   0, \n      0,   0,  54,   0,   0,   5, \n     98,   0,  16,   0,  16,   0, \n      0,   0,   6,   1,  16,   0, \n     15,   0,   0,   0,   1,   0, \n      0,  10, 226,   0,  16,   0, \n      6,   0,   0,   0,   6,   9, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n    138,   0,   0,  15, 114,   0, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n    135,   0,   0,   5, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0, 232, 255, 255, 255, \n    232, 255, 255, 255, 232, 255, \n    255, 255,   0,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  11, 114,   0, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16, 128,  65,   0, \n      0,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0, 140,   0,   0,  17, \n    114,   0,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  13,   0,   0,   0, \n    150,   7,  16,   0,   6,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     86,   0,   0,   5,  50,   0, \n     16,   0,   5,   0,   0,   0, \n    230,  10,  16,   0,  15,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0, 230,  11,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  16,   0,   0,   0, \n     42,   0,  16,   0,  12,   0, \n      0,   0,  54,   0,   0,   5, \n     98,   0,  16,   0,  16,   0, \n      0,   0,   6,   3,  16,   0, \n     15,   0,   0,   0,   1,   0, \n      0,  10, 226,   0,  16,   0, \n      6,   0,   0,   0,   6,   9, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n    138,   0,   0,  15, 114,   0, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n    135,   0,   0,   5, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0, 232, 255, 255, 255, \n    232, 255, 255, 255, 232, 255, \n    255, 255,   0,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  11, 114,   0, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16, 128,  65,   0, \n      0,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0, 140,   0,   0,  17, \n    114,   0,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  11,   0,   0,   0, \n    150,   7,  16,   0,   6,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     56,   0,   0,  10,  50,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n    171, 170, 170,  62, 171, 170, \n    170,  62,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     15,   0,   0,   0,  58,   0, \n     16,   0,  12,   0,   0,   0, \n      1,   0,   0,  10, 226,   0, \n     16,   0,   6,   0,   0,   0, \n      6,   9,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,  17,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0, 135,   0,   0,   5, \n    114,   0,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255,   0,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  11, \n    114,   0,  16,   0,  19,   0, \n      0,   0,  70,   2,  16, 128, \n     65,   0,   0,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0, 140,   0, \n      0,  17, 114,   0,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  14,   0, \n      0,   0, 150,   7,  16,   0, \n      6,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  54,   0,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,  30,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n     86,   0,   0,   5,  98,   0, \n     16,   0,   6,   0,   0,   0, \n      6,   3,  16,   0,  15,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  15,   0, \n      0,   0,  10,   0,  16,   0, \n     12,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n    138,   0,   0,  15, 114,   0, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n    135,   0,   0,   5, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0, 232, 255, 255, 255, \n    232, 255, 255, 255, 232, 255, \n    255, 255,   0,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  11, 114,   0, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16, 128,  65,   0, \n      0,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0, 140,   0,   0,  17, \n    114,   0,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     56,   0,   0,  10,  98,   0, \n     16,   0,   6,   0,   0,   0, \n     86,   6,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0, 171, 170, \n    170,  62, 171, 170, 170,  62, \n      0,   0,   0,   0,  54,   0, \n      0,   5, 130,   0,  16,   0, \n     13,   0,   0,   0,  10,   0, \n     16,   0,   5,   0,   0,   0, \n     54,   0,   0,   5, 130,   0, \n     16,   0,  11,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0,  54,   0,   0,   5, \n    130,   0,  16,   0,  14,   0, \n      0,   0,  26,   0,  16,   0, \n      6,   0,   0,   0,  54,   0, \n      0,   5, 130,   0,  16,   0, \n     12,   0,   0,   0,  42,   0, \n     16,   0,   6,   0,   0,   0, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      4,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0, 150,   3, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  54,   0,   0,   5, \n     82,   0,  16,   0,  16,   0, \n      0,   0,   6,   1,  16,   0, \n     15,   0,   0,   0,  54,   0, \n      0,   5, 162,   0,  16,   0, \n     16,   0,   0,   0,  86,   9, \n     16,   0,  12,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,  16,   0,   0,   0, \n     70,  14,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,  16,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  16,   0,   0,   0, \n     70,  14,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10,  50,   0,  16,   0, \n     13,   0,   0,   0,  70,   0, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  52,   0,   0,  10, \n     50,   0,  16,   0,  11,   0, \n      0,   0, 230,  10,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  98,   0, \n     16,   0,  12,   0,   0,   0, \n    166,  11,  16,   0,  15,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0, 214,   2,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10,  50,   0, \n     16,   0,  14,   0,   0,   0, \n     70,   0,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0,   0,   0, \n      0,   0,   0,   0,  52,   0, \n      0,  10,  50,   0,  16,   0, \n     12,   0,   0,   0, 230,  10, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0, 150,   3,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    131,   0,   0,   5,  18,   0, \n     16,   0,  13,   0,   0,   0, \n     26,   0,  16,   0,  12,   0, \n      0,   0, 131,   0,   0,   5, \n     34,   0,  16,   0,  13,   0, \n      0,   0,  10,   0,  16,   0, \n     15,   0,   0,   0, 131,   0, \n      0,   5,  18,   0,  16,   0, \n     11,   0,   0,   0,  42,   0, \n     16,   0,  12,   0,   0,   0, \n    131,   0,   0,   5,  34,   0, \n     16,   0,  11,   0,   0,   0, \n     26,   0,  16,   0,  15,   0, \n      0,   0, 131,   0,   0,   5, \n     18,   0,  16,   0,  14,   0, \n      0,   0,  58,   0,  16,   0, \n     12,   0,   0,   0, 131,   0, \n      0,   5,  34,   0,  16,   0, \n     14,   0,   0,   0,  42,   0, \n     16,   0,  15,   0,   0,   0, \n    131,   0,   0,   5,  18,   0, \n     16,   0,  12,   0,   0,   0, \n     10,   0,  16,   0,  12,   0, \n      0,   0, 131,   0,   0,   5, \n     34,   0,  16,   0,  12,   0, \n      0,   0,  58,   0,  16,   0, \n     15,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,  10,   0, \n      0,   1,  54,   0,   0,   5, \n     18,   0,  16,   0,  13,   0, \n      0,   0,  26,   0,  16,   0, \n     12,   0,   0,   0,  54,   0, \n      0,   8, 226,   0,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  11,   0,   0,   0, \n     42,   0,  16,   0,  12,   0, \n      0,   0,  54,   0,   0,   8, \n    226,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     14,   0,   0,   0,  58,   0, \n     16,   0,  12,   0,   0,   0, \n     54,   0,   0,   8, 226,   0, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    226,   0,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   1,  23,   0,   0,   1, \n     21,   0,   0,   1,   0,   0, \n      0,   7, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   0,   0,   0,   7, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      0,   0,   0,   7, 242,   0, \n     16,   0,  14,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     14,   0,   0,   0,   0,   0, \n      0,   7, 242,   0,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n     31,   0,   4,   3,  58,   0, \n     16,   0,   5,   0,   0,   0, \n     32,   0,   0,   7, 130,   0, \n     16,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  31,   0, \n      4,   3,  58,   0,  16,   0, \n      3,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n     15,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n    230, 116,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 130,   0, \n     16,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n     16,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n    230, 116,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  50,   0, \n     16,   0,  17,   0,   0,   0, \n    230,  10,  16,   0,  15,   0, \n      0,   0,  54,   0,   0,   5, \n     50,   0,  16,   0,  18,   0, \n      0,   0, 230,  10,  16,   0, \n     16,   0,   0,   0,  18,   0, \n      0,   1, 165,   0,   0,   8, \n     50,   0,  16,   0,  17,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  70, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 130,   0,  16,   0, \n      3,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n     50,   0,  16,   0,  15,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,  70, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 162,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  12,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n    162,   0,  16,   0,   4,   0, \n      0,   0,   6,   0,  16,   0, \n      0,   0,   0,   0,  86,  13, \n     16,   0,   4,   0,   0,   0, \n    165,   0,   0,   8,  50,   0, \n     16,   0,  18,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0,  70, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n     50,   0,  16,   0,  16,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,  70, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  76,   0,   0,   3, \n     42,   0,  16,   0,   5,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  41,   0,   0,  10, \n    194,   0,  16,   0,  17,   0, \n      0,   0,   6,   4,  16,   0, \n     17,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,  19,   0,   0,   0, \n     38,   7,  16,   0,  17,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     19,   0,   0,   0,  70,  14, \n     16,   0,  19,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  19,   0,   0,   0, \n     70,  14,  16,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10, 242,   0,  16,   0, \n     17,   0,   0,   0,  70,  14, \n     16,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,  41,   0,   0,  10, \n    194,   0,  16,   0,  15,   0, \n      0,   0,   6,   4,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,  19,   0,   0,   0, \n     38,   7,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     19,   0,   0,   0,  70,  14, \n     16,   0,  19,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  19,   0,   0,   0, \n     70,  14,  16,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,  41,   0,   0,  10, \n    194,   0,  16,   0,  18,   0, \n      0,   0,   6,   4,  16,   0, \n     18,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,  19,   0,   0,   0, \n     38,   7,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     19,   0,   0,   0,  70,  14, \n     16,   0,  19,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  19,   0,   0,   0, \n     70,  14,  16,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10, 242,   0,  16,   0, \n     18,   0,   0,   0,  70,  14, \n     16,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,  41,   0,   0,  10, \n    194,   0,  16,   0,  16,   0, \n      0,   0,   6,   4,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,  19,   0,   0,   0, \n     38,   7,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     19,   0,   0,   0,  70,  14, \n     16,   0,  19,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  19,   0,   0,   0, \n     70,  14,  16,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10, 242,   0,  16,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     85,   0,   0,  10, 162,   0, \n     16,   0,   4,   0,   0,   0, \n      6,   4,  16,   0,  17,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0, 131,   0, \n      0,   5,  82,   0,  16,   0, \n     17,   0,   0,   0,   6,   1, \n     16,   0,  17,   0,   0,   0, \n    131,   0,   0,   5, 162,   0, \n     16,   0,  17,   0,   0,   0, \n     86,  13,  16,   0,   4,   0, \n      0,   0,  85,   0,   0,  10, \n    162,   0,  16,   0,   4,   0, \n      0,   0,   6,   4,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n    131,   0,   0,   5,  82,   0, \n     16,   0,  15,   0,   0,   0, \n      6,   1,  16,   0,  15,   0, \n      0,   0, 131,   0,   0,   5, \n    162,   0,  16,   0,  15,   0, \n      0,   0,  86,  13,  16,   0, \n      4,   0,   0,   0,  85,   0, \n      0,  10, 162,   0,  16,   0, \n      4,   0,   0,   0,   6,   4, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0, 131,   0,   0,   5, \n     82,   0,  16,   0,  18,   0, \n      0,   0,   6,   1,  16,   0, \n     18,   0,   0,   0, 131,   0, \n      0,   5, 162,   0,  16,   0, \n     18,   0,   0,   0,  86,  13, \n     16,   0,   4,   0,   0,   0, \n     85,   0,   0,  10, 162,   0, \n     16,   0,   4,   0,   0,   0, \n      6,   4,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0, 131,   0, \n      0,   5,  82,   0,  16,   0, \n     16,   0,   0,   0,   6,   1, \n     16,   0,  16,   0,   0,   0, \n    131,   0,   0,   5, 162,   0, \n     16,   0,  16,   0,   0,   0, \n     86,  13,  16,   0,   4,   0, \n      0,   0,   2,   0,   0,   1, \n     10,   0,   0,   1,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     17,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,  23,   0, \n      0,   1,  18,   0,   0,   1, \n     32,   0,   0,   7, 130,   0, \n     16,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  31,   0, \n      4,   3,  58,   0,  16,   0, \n      3,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n     16,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     54, 121,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     18,   0,   0,   1, 165,   0, \n      0,   8,  34,   0,  16,   0, \n     16,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8,  66,   0,  16,   0, \n     16,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     41,   0,   0,  10, 162,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  12,   0, \n      0,   0,  86,   5,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7, 162,   0,  16,   0, \n      4,   0,   0,   0,   6,   0, \n     16,   0,   0,   0,   0,   0, \n     86,  13,  16,   0,   4,   0, \n      0,   0, 165,   0,   0,   8, \n    130,   0,  16,   0,  16,   0, \n      0,   0,  26,   0,  16,   0, \n      4,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8,  18,   0,  16,   0, \n     16,   0,   0,   0,  58,   0, \n     16,   0,   4,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  76,   0, \n      0,   3,  42,   0,  16,   0, \n      5,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      0,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      1,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      5,   0,   0,   0,  86,   5, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     16,   0,   0,   0,  24,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   5,   0, \n      0,   0,  26,   0,  16,   0, \n     16,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     17,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59,  85,   0,   0,  10, \n    226,   0,  16,   0,   5,   0, \n      0,   0, 166,  10,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   5,   0,   0,   0, \n     42,   0,  16,   0,  16,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   5,   0,   0,   0, \n    246,  15,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  16,   0,   0,   0, \n     24,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      5,   0,   0,   0,  58,   0, \n     16,   0,  16,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  18,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     16,   0,   0,   0,   6,   0, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     16,   0,   0,   0,  24,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      2,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n     10,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      5,   0,   0,   0,  86,   5, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   5,   0, \n      0,   0,  26,   0,  16,   0, \n     16,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   3,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     17,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   8,  32, \n    128,  58,   8,  32, 128,  58, \n      8,  32, 128,  58, 171, 170, \n    170,  62,  85,   0,   0,  10, \n    226,   0,  16,   0,   5,   0, \n      0,   0, 166,  10,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   5,   0,   0,   0, \n     42,   0,  16,   0,  16,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   3,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   8,  32, 128,  58, \n      8,  32, 128,  58,   8,  32, \n    128,  58, 171, 170, 170,  62, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   5,   0,   0,   0, \n    246,  15,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     30,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      5,   0,   0,   0,  58,   0, \n     16,   0,  16,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      3,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  18,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      8,  32, 128,  58,   8,  32, \n    128,  58,   8,  32, 128,  58, \n    171, 170, 170,  62,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     16,   0,   0,   0,   6,   0, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   3,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   8,  32, 128,  58, \n      8,  32, 128,  58,   8,  32, \n    128,  58, 171, 170, 170,  62, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n     12,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  86,   9, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     30,   0,   0,   0,  30,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  19,   0, \n      0,   0,  26,   0,  16,   0, \n     16,   0,   0,   0,  54,   0, \n      0,   5,  98,   0,  16,   0, \n     19,   0,   0,   0,   6,   1, \n     16,   0,   5,   0,   0,   0, \n      1,   0,   0,  10, 226,   0, \n     16,   0,   6,   0,   0,   0, \n      6,   9,  16,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,  21,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0, 135,   0,   0,   5, \n    114,   0,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     22,   0,   0,   0,  70,   2, \n     16,   0,  22,   0,   0,   0, \n      2,  64,   0,   0, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255,   0,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  22,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  11, \n    114,   0,  16,   0,  23,   0, \n      0,   0,  70,   2,  16, 128, \n     65,   0,   0,   0,  22,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     23,   0,   0,   0,  70,   2, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16,   0,  21,   0, \n      0,   0,  70,   2,  16,   0, \n     23,   0,   0,   0, 140,   0, \n      0,  17, 114,   0,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  23,   0,   0,   0, \n      2,  64,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 114,   0,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  17,   0, \n      0,   0, 150,   7,  16,   0, \n      6,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  86,   0,   0,   5, \n    162,   0,  16,   0,   4,   0, \n      0,   0, 166,  14,  16,   0, \n      5,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0, 230,  11, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  19,   0, \n      0,   0,  42,   0,  16,   0, \n     16,   0,   0,   0,  54,   0, \n      0,   5,  98,   0,  16,   0, \n     19,   0,   0,   0,   6,   3, \n     16,   0,   5,   0,   0,   0, \n      1,   0,   0,  10, 226,   0, \n     16,   0,   6,   0,   0,   0, \n      6,   9,  16,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,  21,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0, 135,   0,   0,   5, \n    114,   0,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     22,   0,   0,   0,  70,   2, \n     16,   0,  22,   0,   0,   0, \n      2,  64,   0,   0, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255,   0,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  22,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  11, \n    114,   0,  16,   0,  23,   0, \n      0,   0,  70,   2,  16, 128, \n     65,   0,   0,   0,  22,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     23,   0,   0,   0,  70,   2, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16,   0,  21,   0, \n      0,   0,  70,   2,  16,   0, \n     23,   0,   0,   0, 140,   0, \n      0,  17, 114,   0,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  23,   0,   0,   0, \n      2,  64,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 114,   0,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  15,   0, \n      0,   0, 150,   7,  16,   0, \n      6,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  56,   0,   0,  10, \n    162,   0,  16,   0,   4,   0, \n      0,   0,  86,  13,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n    171, 170, 170,  62,   0,   0, \n      0,   0, 171, 170, 170,  62, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   5,   0,   0,   0, \n     58,   0,  16,   0,  16,   0, \n      0,   0,   1,   0,   0,  10, \n    226,   0,  16,   0,   6,   0, \n      0,   0,   6,   9,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 114,   0,  16,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0, 135,   0, \n      0,   5, 114,   0,  16,   0, \n     21,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16,   0,  21,   0, \n      0,   0,   2,  64,   0,   0, \n    232, 255, 255, 255, 232, 255, \n    255, 255, 232, 255, 255, 255, \n      0,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     21,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  21,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  11, 114,   0,  16,   0, \n     22,   0,   0,   0,  70,   2, \n     16, 128,  65,   0,   0,   0, \n     21,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  22,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  22,   0,   0,   0, \n    140,   0,   0,  17, 114,   0, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     21,   0,   0,   0,  70,   2, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,   5,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,   5,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  22,   0, \n      0,   0,   2,  64,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,   5,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 114,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     18,   0,   0,   0, 150,   7, \n     16,   0,   6,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  54,   0, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  30,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,  86,   0,   0,   5, \n     98,   0,  16,   0,   6,   0, \n      0,   0,   6,   3,  16,   0, \n      5,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      5,   0,   0,   0,  10,   0, \n     16,   0,  16,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,  21,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0, 135,   0,   0,   5, \n    114,   0,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     22,   0,   0,   0,  70,   2, \n     16,   0,  22,   0,   0,   0, \n      2,  64,   0,   0, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255,   0,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  22,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  11, \n    114,   0,  16,   0,  23,   0, \n      0,   0,  70,   2,  16, 128, \n     65,   0,   0,   0,  22,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     23,   0,   0,   0,  70,   2, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16,   0,  21,   0, \n      0,   0,  70,   2,  16,   0, \n     23,   0,   0,   0, 140,   0, \n      0,  17, 114,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n      5,   0,   0,   0,  70,   2, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  23,   0,   0,   0, \n      2,  64,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 114,   0,  16,   0, \n      5,   0,   0,   0,  70,   2, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  56,   0,   0,  10, \n     50,   0,  16,   0,   5,   0, \n      0,   0, 150,   5,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0, 171, 170, 170,  62, \n    171, 170, 170,  62,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5, 130,   0, \n     16,   0,  17,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0,  54,   0,   0,   5, \n    130,   0,  16,   0,  15,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,  54,   0, \n      0,   5, 130,   0,  16,   0, \n     18,   0,   0,   0,  10,   0, \n     16,   0,   5,   0,   0,   0, \n     54,   0,   0,   5, 130,   0, \n     16,   0,  16,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n    150,   3,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  54,   0, \n      0,   5,  82,   0,  16,   0, \n     19,   0,   0,   0,   6,   1, \n     16,   0,   5,   0,   0,   0, \n     54,   0,   0,   5, 162,   0, \n     16,   0,  19,   0,   0,   0, \n     86,   9,  16,   0,  16,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,  19,   0, \n      0,   0,  70,  14,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  19,   0,   0,   0, \n     70,  14,  16,   0,  19,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  19,   0, \n      0,   0,  70,  14,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10,  50,   0, \n     16,   0,  17,   0,   0,   0, \n     70,   0,  16,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0,   0,   0, \n      0,   0,   0,   0,  52,   0, \n      0,  10,  50,   0,  16,   0, \n     15,   0,   0,   0, 230,  10, \n     16,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     98,   0,  16,   0,  16,   0, \n      0,   0, 166,  11,  16,   0, \n      5,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0, 214,   2, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n     50,   0,  16,   0,  18,   0, \n      0,   0,  70,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     52,   0,   0,  10,  50,   0, \n     16,   0,  16,   0,   0,   0, \n    230,  10,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     17,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      6,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0, 150,   3, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 131,   0,   0,   5, \n     18,   0,  16,   0,  17,   0, \n      0,   0,  26,   0,  16,   0, \n     16,   0,   0,   0, 131,   0, \n      0,   5,  34,   0,  16,   0, \n     17,   0,   0,   0,  10,   0, \n     16,   0,   5,   0,   0,   0, \n    131,   0,   0,   5,  18,   0, \n     16,   0,  15,   0,   0,   0, \n     42,   0,  16,   0,  16,   0, \n      0,   0, 131,   0,   0,   5, \n     34,   0,  16,   0,  15,   0, \n      0,   0,  26,   0,  16,   0, \n      5,   0,   0,   0, 131,   0, \n      0,   5,  18,   0,  16,   0, \n     18,   0,   0,   0,  58,   0, \n     16,   0,  16,   0,   0,   0, \n    131,   0,   0,   5,  34,   0, \n     16,   0,  18,   0,   0,   0, \n     42,   0,  16,   0,   5,   0, \n      0,   0, 131,   0,   0,   5, \n     18,   0,  16,   0,  16,   0, \n      0,   0,  10,   0,  16,   0, \n     16,   0,   0,   0, 131,   0, \n      0,   5,  34,   0,  16,   0, \n     16,   0,   0,   0,  58,   0, \n     16,   0,   5,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  17,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     18,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   1, \n     10,   0,   0,   1,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     17,   0,   0,   0,  26,   0, \n     16,   0,  16,   0,   0,   0, \n     54,   0,   0,   8, 226,   0, \n     16,   0,  17,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  15,   0, \n      0,   0,  42,   0,  16,   0, \n     16,   0,   0,   0,  54,   0, \n      0,   8, 226,   0,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  18,   0,   0,   0, \n     58,   0,  16,   0,  16,   0, \n      0,   0,  54,   0,   0,   8, \n    226,   0,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 226,   0,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,  23,   0, \n      0,   1,  21,   0,   0,   1, \n      0,   0,   0,   7, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     17,   0,   0,   0,   0,   0, \n      0,   7, 242,   0,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   0,   0,   0,   7, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     14,   0,   0,   0,  70,  14, \n     16,   0,  18,   0,   0,   0, \n      0,   0,   0,   7, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     16,   0,   0,   0,  18,   0, \n      0,   1,  54,   0,   0,   5, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,  21,   0, \n      0,   1,  21,   0,   0,   1, \n     56,   0,   0,   7, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,  56,   0, \n      0,   7, 242,   0,  16,   0, \n      7,   0,   0,   0,  86,   5, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  56,   0,   0,   7, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  86,   5,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     56,   0,   0,   7, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      1,   0,   0,   0,  54,   0, \n      0,   5,  82,   0,  16,   0, \n      5,   0,   0,   0, 166,   8, \n     16,   0,   5,   0,   0,   0, \n     54,   0,   0,   5,  82,   0, \n     16,   0,   7,   0,   0,   0, \n    166,   8,  16,   0,   7,   0, \n      0,   0,  54,   0,   0,   5, \n     82,   0,  16,   0,   9,   0, \n      0,   0, 166,   8,  16,   0, \n      9,   0,   0,   0,  54,   0, \n      0,   5,  82,   0,  16,   0, \n     10,   0,   0,   0, 166,   8, \n     16,   0,   8,   0,   0,   0, \n     18,   0,   0,   1,  54,   0, \n      0,   5,  82,   0,  16,   0, \n     10,   0,   0,   0,   6,   2, \n     16,   0,   8,   0,   0,   0, \n     21,   0,   0,   1,  76,   0, \n      0,   3,  10,   0,  16,   0, \n      6,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      6,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n     14,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n     50,   0,   0,   0,  54,  32, \n      0,   5, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     50,   0,   0,  15, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 127,  67,   0,   0, \n    127,  67,   0,   0, 127,  67, \n      0,   0, 127,  67,   2,  64, \n      0,   0,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,  63,   0,   0,   0,  63, \n     28,   0,   0,   5, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      6,   0,   0,   0,   1,  64, \n      0,   0,   0,   1,   0,   0, \n     10,   0,  16,   0,   6,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      6,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   1,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   6,   0, \n      0,   0,  58,   0,  16,   0, \n      6,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   1, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  54,  32,   0,   5, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,  50,   0, \n      0,  15, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    127,  67,   0,   0, 127,  67, \n      0,   0, 127,  67,   0,   0, \n    127,  67,   2,  64,   0,   0, \n      0,   0,   0,  63,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,  28,   0, \n      0,   5, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,  11,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   1,   0,   0,  10,   0, \n     16,   0,  11,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,  11,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   1,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   6,   0,   0,   0, \n     58,   0,  16,   0,  11,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   1,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     54,  32,   0,   5, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,  50,   0,   0,  15, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 127,  67, \n      0,   0, 127,  67,   0,   0, \n    127,  67,   0,   0, 127,  67, \n      2,  64,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,  63,  28,   0,   0,   5, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,  11,   0,   0,   0, \n      1,  64,   0,   0,   0,   1, \n      0,   0,  10,   0,  16,   0, \n     11,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,  11,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      1,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n      6,   0,   0,   0,  58,   0, \n     16,   0,  11,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   1,  10,   0,  16,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5, 162,   0,  16,   0, \n     10,   0,   0,   0,  86,  13, \n     16,   0,   8,   0,   0,   0, \n     54,  32,   0,   5, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  50,   0,   0,  15, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 127,  67, \n      0,   0, 127,  67,   0,   0, \n    127,  67,   0,   0, 127,  67, \n      2,  64,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,  63,  28,   0,   0,   5, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,  11,   0,   0,   0, \n      1,  64,   0,   0,   0,   1, \n      0,   0,  10,   0,  16,   0, \n     11,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,  11,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      1,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n     10,   0,   0,   0,  58,   0, \n     16,   0,  11,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   1,  10,   0,  16,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5, 226,   0,  16,   0, \n     10,   0,   0,   0,  86,   8, \n     16,   0,   6,   0,   0,   0, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      7,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n     54,   0,   0,   0,  54,  32, \n      0,   5, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     50,   0,   0,  15, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 192, 127,  68,   0, 192, \n    127,  68,   0, 192, 127,  68, \n      0,   0,  64,  64,   2,  64, \n      0,   0,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,  63,   0,   0,   0,  63, \n     28,   0,   0,   5, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      6,   0,   0,   0,   1,  64, \n      0,   0,   0,   4,   0,   0, \n     10,   0,  16,   0,   6,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      6,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,  16,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   6,   0, \n      0,   0,  58,   0,  16,   0, \n      6,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,  64, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  54,  32,   0,   5, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,  50,   0, \n      0,  15, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   0, 192, \n    127,  68,   0, 192, 127,  68, \n      0, 192, 127,  68,   0,   0, \n     64,  64,   2,  64,   0,   0, \n      0,   0,   0,  63,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,  28,   0, \n      0,   5, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,  11,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   4,   0,   0,  10,   0, \n     16,   0,  11,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,  11,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,  16,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   6,   0,   0,   0, \n     58,   0,  16,   0,  11,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,  64,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     54,  32,   0,   5, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,  50,   0,   0,  15, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   0, 192, 127,  68, \n      0, 192, 127,  68,   0, 192, \n    127,  68,   0,   0,  64,  64, \n      2,  64,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,  63,  28,   0,   0,   5, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,  11,   0,   0,   0, \n      1,  64,   0,   0,   0,   4, \n      0,   0,  10,   0,  16,   0, \n     11,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,  11,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n     16,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n      6,   0,   0,   0,  58,   0, \n     16,   0,  11,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  64,  10,   0,  16,   0, \n      0,   0,   0,   0,  54,  32, \n      0,   5,  82,   0,  16,   0, \n      8,   0,   0,   0,   6,   2, \n     16,   0,  10,   0,   0,   0, \n     54,  32,   0,   5, 162,   0, \n     16,   0,   8,   0,   0,   0, \n     86,  13,  16,   0,   8,   0, \n      0,   0,  50,   0,   0,  15, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0, 192, 127,  68, \n      0, 192, 127,  68,   0, 192, \n    127,  68,   0,   0,  64,  64, \n      2,  64,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,  63,  28,   0,   0,   5, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,  11,   0,   0,   0, \n      1,  64,   0,   0,   0,   4, \n      0,   0,  10,   0,  16,   0, \n     11,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,  11,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n     16,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n     10,   0,   0,   0,  58,   0, \n     16,   0,  11,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  64,  10,   0,  16,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5, 226,   0,  16,   0, \n     10,   0,   0,   0,  86,   8, \n     16,   0,   6,   0,   0,   0, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n     16,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n     55,   0,   0,   0,  54,  32, \n      0,   5, 114,   0,  16,   0, \n      5,   0,   0,   0,  70,   2, \n     16,   0,   5,   0,   0,   0, \n     50,   0,   0,  15, 114,   0, \n     16,   0,   6,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 224, 255,  68,   0, 224, \n    255,  68,   0, 192, 127,  68, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,  63,   0,   0,   0,   0, \n     28,   0,   0,   5, 114,   0, \n     16,   0,   6,   0,   0,   0, \n     70,   2,  16,   0,   6,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      6,   0,   0,   0,   1,  64, \n      0,   0,   0,   8,   0,   0, \n     10,   0,  16,   0,   6,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   6,   0, \n      0,   0,  42,   0,  16,   0, \n      6,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,  64,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  54,  32,   0,   5, \n    114,   0,  16,   0,   7,   0, \n      0,   0,  70,   2,  16,   0, \n      7,   0,   0,   0,  50,   0, \n      0,  15, 114,   0,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   0, 224, \n    255,  68,   0, 224, 255,  68, \n      0, 192, 127,  68,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,  63,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,   0,  28,   0, \n      0,   5, 114,   0,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,  11,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   8,   0,   0,  10,   0, \n     16,   0,  11,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   6,   0,   0,   0, \n     42,   0,  16,   0,  11,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,  64,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     54,  32,   0,   5, 114,   0, \n     16,   0,   9,   0,   0,   0, \n     70,   2,  16,   0,   9,   0, \n      0,   0,  50,   0,   0,  15, \n    114,   0,  16,   0,  11,   0, \n      0,   0,  70,   2,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   0, 224, 255,  68, \n      0, 224, 255,  68,   0, 192, \n    127,  68,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,   0,  28,   0,   0,   5, \n    114,   0,  16,   0,  11,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,  11,   0,   0,   0, \n      1,  64,   0,   0,   0,   8, \n      0,   0,  10,   0,  16,   0, \n     11,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n      6,   0,   0,   0,  42,   0, \n     16,   0,  11,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n     64,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  54,  32, \n      0,   5,  82,   0,  16,   0, \n      8,   0,   0,   0,   6,   2, \n     16,   0,  10,   0,   0,   0, \n     54,  32,   0,   5,  34,   0, \n     16,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,   8,   0, \n      0,   0,  50,   0,   0,  15, \n    114,   0,  16,   0,  11,   0, \n      0,   0,  70,   2,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0, 224, 255,  68, \n      0, 224, 255,  68,   0, 192, \n    127,  68,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,   0,  28,   0,   0,   5, \n    114,   0,  16,   0,  11,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,  11,   0,   0,   0, \n      1,  64,   0,   0,   0,   8, \n      0,   0,  10,   0,  16,   0, \n     11,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n     10,   0,   0,   0,  42,   0, \n     16,   0,  11,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n     64,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5, 226,   0,  16,   0, \n     10,   0,   0,   0,  86,   8, \n     16,   0,   6,   0,   0,   0, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n     17,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n     56,   0,   0,   0,  54,  32, \n      0,   5, 114,   0,  16,   0, \n      5,   0,   0,   0,  70,   2, \n     16,   0,   5,   0,   0,   0, \n     50,   0,   0,  15, 114,   0, \n     16,   0,   6,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 192, 127,  68,   0, 224, \n    255,  68,   0, 224, 255,  68, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,  63,   0,   0,   0,   0, \n     28,   0,   0,   5, 114,   0, \n     16,   0,   6,   0,   0,   0, \n     70,   2,  16,   0,   6,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      6,   0,   0,   0,   1,  64, \n      0,   0,   0,   4,   0,   0, \n     10,   0,  16,   0,   6,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   6,   0, \n      0,   0,  42,   0,  16,   0, \n      6,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,  32,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  54,  32,   0,   5, \n    114,   0,  16,   0,   7,   0, \n      0,   0,  70,   2,  16,   0, \n      7,   0,   0,   0,  50,   0, \n      0,  15, 114,   0,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   0, 192, \n    127,  68,   0, 224, 255,  68, \n      0, 224, 255,  68,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,  63,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,   0,  28,   0, \n      0,   5, 114,   0,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,  11,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   4,   0,   0,  10,   0, \n     16,   0,  11,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   6,   0,   0,   0, \n     42,   0,  16,   0,  11,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,  32,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     54,  32,   0,   5, 114,   0, \n     16,   0,   9,   0,   0,   0, \n     70,   2,  16,   0,   9,   0, \n      0,   0,  50,   0,   0,  15, \n    114,   0,  16,   0,  11,   0, \n      0,   0,  70,   2,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   0, 192, 127,  68, \n      0, 224, 255,  68,   0, 224, \n    255,  68,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,   0,  28,   0,   0,   5, \n    114,   0,  16,   0,  11,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,  11,   0,   0,   0, \n      1,  64,   0,   0,   0,   4, \n      0,   0,  10,   0,  16,   0, \n     11,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n      6,   0,   0,   0,  42,   0, \n     16,   0,  11,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n     32,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  54,  32, \n      0,   5,  82,   0,  16,   0, \n      8,   0,   0,   0,   6,   2, \n     16,   0,  10,   0,   0,   0, \n     54,  32,   0,   5,  34,   0, \n     16,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,   8,   0, \n      0,   0,  50,   0,   0,  15, \n    114,   0,  16,   0,  11,   0, \n      0,   0,  70,   2,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0, 192, 127,  68, \n      0, 224, 255,  68,   0, 224, \n    255,  68,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,   0,  28,   0,   0,   5, \n    114,   0,  16,   0,  11,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,  11,   0,   0,   0, \n      1,  64,   0,   0,   0,   4, \n      0,   0,  10,   0,  16,   0, \n     11,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n     10,   0,   0,   0,  42,   0, \n     16,   0,  11,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n     32,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5, 226,   0,  16,   0, \n     10,   0,   0,   0,  86,   8, \n     16,   0,   6,   0,   0,   0, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n     25,   0,   0,   0,  54,  32, \n      0,   5,  50,   0,  16,   0, \n      5,   0,   0,   0,  70,   0, \n     16,   0,   5,   0,   0,   0, \n     50,   0,   0,  15,  50,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255, 127,  71,   0, 255, \n    127,  71,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     28,   0,   0,   5,  50,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,  10,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   1,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  54,  32,   0,   5, \n     50,   0,  16,   0,   7,   0, \n      0,   0,  70,   0,  16,   0, \n      7,   0,   0,   0,  50,   0, \n      0,  15,  50,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n    127,  71,   0, 255, 127,  71, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,  63,   0,   0, \n      0,  63,   0,   0,   0,   0, \n      0,   0,   0,   0,  28,   0, \n      0,   5,  50,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,  10,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   1,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     54,  32,   0,   5,  50,   0, \n     16,   0,   9,   0,   0,   0, \n     70,   0,  16,   0,   9,   0, \n      0,   0,  50,   0,   0,  15, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   0, 255, 127,  71, \n      0, 255, 127,  71,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  28,   0,   0,   5, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9, 130,   0,  16,   0, \n     10,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      1,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  54,  32, \n      0,   5,  18,   0,  16,   0, \n      8,   0,   0,   0,  10,   0, \n     16,   0,  10,   0,   0,   0, \n     54,  32,   0,   5,  34,   0, \n     16,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,   8,   0, \n      0,   0,  50,   0,   0,  15, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0, 255, 127,  71, \n      0, 255, 127,  71,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  28,   0,   0,   5, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n     10,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      1,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,  31,   0, \n      0,   0, 130,   0,   0,   5, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      5,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n     10,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      1,   0,  10,   0,  16,   0, \n      0,   0,   0,   0, 130,   0, \n      0,   5,  50,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   7,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,  10,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   1,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n    130,   0,   0,   5,  50,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   9,   0, \n      0,   0,  35,   0,   0,   9, \n    130,   0,  16,   0,  10,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   1,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0, 130,   0,   0,   5, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n     10,   0,   0,   0, 130,   0, \n      0,   5,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   8,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,  10,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   1,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,  10,   0, \n      0,   1,  54,   0,   0,   5, \n     66,   0,  16,   0,  10,   0, \n      0,   0,  10,   0,  16,   0, \n      5,   0,   0,   0,  54,   0, \n      0,   5,  34,   0,  16,   0, \n     10,   0,   0,   0,  10,   0, \n     16,   0,   7,   0,   0,   0, \n     54,   0,   0,   5, 130,   0, \n     16,   0,  10,   0,   0,   0, \n     10,   0,  16,   0,   9,   0, \n      0,   0,   2,   0,   0,   1, \n     23,   0,   0,   1,  32,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  39,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  31,   0, \n      4,   3,  10,   0,  16,   0, \n      0,   0,   0,   0,  80,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  80,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     54,   0,   0,   5, 130,   0, \n     16,   0,  10,   0,   0,   0, \n     10,   0,  16,   0,  10,   0, \n      0,   0,  21,   0,   0,   1, \n     54,   0,   0,   5, 162,   0, \n     16,   0,  10,   0,   0,   0, \n    246,  15,  16,   0,  10,   0, \n      0,   0,  21,   0,   0,   1, \n     54,   0,   0,   5, 226,   0, \n     16,   0,  10,   0,   0,   0, \n     86,  13,  16,   0,  10,   0, \n      0,   0,  21,   0,   0,   1, \n     54,   0,   0,   4,  66,   0, \n     16,   0,   4,   0,   0,   0, \n     26,   0,   2,   0,  35,   0, \n      0,   9,  50,   0,  16,   0, \n      0,   0,   0,   0, 134,   0, \n     16,   0,   3,   0,   0,   0, \n     22,   5,  16,   0,   2,   0, \n      0,   0,  38,  10,  16,   0, \n      4,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      1,   0,   0,   0,  22,   5, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   4,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  78,   0,   0,   8, \n    242,   0,  16,   0,   4,   0, \n      0,   0,   0, 208,   0,   0, \n     22,   5,  16,   0,   1,   0, \n      0,   0,  22,   5,  16,   0, \n      2,   0,   0,   0,  35,   0, \n      0,  10,  50,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16, 128,  65,   0,   0,   0, \n      2,   0,   0,   0, 214,   5, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  41,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      4,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  20,  50,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      6,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     25,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     58,   0,  16,   0,   0,   0, \n      0,   0, 138,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     42, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11, 130,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  10,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     42,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0, 139,   0, \n      0,  15, 242,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,  28,   0,   0,   0, \n     27,   0,   0,   0,  31,   0, \n      0,   0,  29,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0, 118,  15,  16,   0, \n      4,   0,   0,   0,  35,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      3,   0,   0,   0,  35,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  25,   0, \n      0,   0,   1,  64,   0,   0, \n      7,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n     42,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0, 140,   0,   0,  20, \n    194,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n    246,  15,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  87,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  41,   0,   0,   7, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   6,   0,   0,   0, \n     30,   0,   0,   7, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0, 139,   0, \n      0,  15,  50,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  27,   0,   0,   0, \n     24,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  86,   5,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   8,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  20,   0, \n      0,   0,   1,  64,   0,   0, \n     12,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  18,   0,   0,   1, \n    139,   0,   0,  15, 242,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,  27,   0, \n      0,   0,  27,   0,   0,   0, \n     31,   0,   0,   0,  28,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     35,   0,   0,   9, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   3,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n    140,   0,   0,  20,  50,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,  11,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 230,  10, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n    130,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     26,   0,   0,   0,   1,  64, \n      0,   0,   6,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n    139,   0,   0,   9,  66,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  29,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   4,   0,   0,   0, \n    140,   0,   0,  11,  66,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     41,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 139,   0,   0,  15, \n     98,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  27,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n    246,  15,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n    130,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  38,   0, \n      0,   8,   0, 208,   0,   0, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     32,   0,   0,  10, 226,   0, \n     16,   0,   0,   0,   0,   0, \n    166,  10,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   2,   0,   0,   0, \n      3,   0,   0,   0,  60,   0, \n      0,   7,  98,   0,  16,   0, \n      0,   0,   0,   0, 166,  11, \n     16,   0,   0,   0,   0,   0, \n     86,   6,  16,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   1,   0, \n      0,   0, 102,   3,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0, 102,   3, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,  10,   0,   0,   0, \n    118,   8,  16,   0,   1,   0, \n      0,   0, 118,   8,  16,   0, \n      2,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   1,   0, \n      0,   0, 102,   3,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n    118,   8,  16,   0,   1,   0, \n      0,   0,  21,   0,   0,   1, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n    102,   3,  16,   0,  10,   0, \n      0,   0,  62,   0,   0,   1, \n     83,  84,  65,  84, 148,   0, \n      0,   0,  37,   5,   0,   0, \n     24,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n    134,   0,   0,   0,  16,   1, \n      0,   0, 174,   0,   0,   0, \n     63,   0,   0,   0,  34,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  44,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    208,   0,   0,   0,  64,   0, \n      0,   0,  84,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/resolve_full_64bpp_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_resolve_edram_info;        // Offset:    0 Size:     4\n//   uint xe_resolve_coordinate_info;   // Offset:    4 Size:     4\n//   uint xe_resolve_dest_info;         // Offset:    8 Size:     4\n//   uint xe_resolve_dest_coordinate_info;// Offset:   12 Size:     4\n//   uint xe_resolve_dest_base;         // Offset:   16 Size:     4\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_resolve_edram                  texture    byte         r/o      T0             t0      1 \n// xe_resolve_dest                       UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][2], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xy\ndcl_temps 24\ndcl_thread_group 8, 8, 1\nand r0.xyzw, CB0[0][0].zxzz, l(7, 1023, 8, 0x01000000)\nand r1.x, CB0[0][0].w, l(1023)\nushr r2.xyz, CB0[0][0].yywy, l(4, 5, 10, 0)\nushr r3.xyzw, CB0[0][0].wwww, l(24, 20, 24, 24)\nishl r4.y, vThreadID.x, l(2)\nbfi r1.y, l(11), l(3), r2.y, l(0)\nuge r1.y, r4.y, r1.y\nif_nz r1.y\n  ret \nendif \nubfe r5.xyzw, l(2, 11, 4, 1), l(10, 13, 24, 28), CB0[0][0].xxxx\nmov r2.w, CB0[0][0].y\nbfi r1.yz, l(0, 4, 1, 0), l(0, 3, 3, 0), r2.wwxw, l(0, 0, 0, 0)\nibfe r1.w, l(6), l(16), CB0[0][0].z\nishl r1.w, r1.w, l(23)\niadd r1.w, r1.w, l(0x3f800000)\nbfi r3.xyzw, l(4, 4, 4, 4), l(3, 3, 3, 3), r3.xyzw, l(0, 0, 0, 0)\nubfe r2.xy, l(6, 3, 0, 0), l(7, 28, 0, 0), CB0[0][0].zwzz\nmov r4.xzw, vThreadID.yyyy\niadd r1.yz, r1.yyzy, r4.yywy\nuge r2.w, l(3), r2.y\nif_nz r2.w\n  mov r6.y, r2.y\nelse \n  ieq r2.w, r2.y, l(5)\n  if_nz r2.w\n    mov r6.y, l(2)\n  else \n    mov r6.y, l(0)\n  endif \nendif \nuge r6.zw, r5.xxxx, l(0, 0, 2, 1)\nand r6.zw, r6.zzzw, l(0, 0, 1, 1)\nishl r1.yz, r1.yyzy, r6.zzwz\nushr r6.x, r6.y, l(1)\nand r6.xy, r6.xyxx, l(1, 1, 0, 0)\niadd r1.yz, r1.yyzy, r6.xxyx\nushr r6.x, l(80), r5.w\nmov r6.y, l(16)\nudiv r7.xy, null, r1.yzyy, r6.xyxx\nimad r0.y, r7.y, r0.y, r7.x\niadd r0.y, r0.y, r5.y\nimad r1.yz, -r7.xxyx, r6.xxyx, r1.yyzy\nimad r1.y, r1.z, r6.x, r1.y\nishl r1.y, r1.y, r5.w\nimad r0.y, r0.y, l(1280), r1.y\nudiv null, r0.y, r0.y, l(0x00280000)\nishl r0.y, r0.y, l(2)\niadd r1.y, r5.w, r6.z\nishl r1.z, l(4), r1.y\nif_nz r5.w\n  ieq r2.w, r1.z, l(8)\n  if_nz r2.w\n    ld_raw r6.xyzw, r0.y, T0[0].zwxy\n    iadd r2.w, r0.y, l(16)\n    ld_raw r7.xyzw, r2.w, T0[0].zwxy\n    mov r8.xy, r6.zwzz\n    mov r9.xy, r7.zwzz\n  else \n    ld_raw r8.xy, r0.y, T0[0].xyxx\n    iadd r2.w, r0.y, r1.z\n    ld_raw r6.xy, r2.w, T0[0].xyxx\n    ishl r5.xy, l(8, 12, 0, 0), r1.yyyy\n    iadd r5.xy, r0.yyyy, r5.xyxx\n    ld_raw r9.xy, r5.x, T0[0].xyxx\n    ld_raw r7.xy, r5.y, T0[0].xyxx\n  endif \n  switch r5.z\n    case l(5)\n    ishl r8.zw, r8.xxxy, l(0, 0, 16, 16)\n    ishr r10.xyzw, r8.zxwy, l(16, 16, 16, 16)\n    itof r10.xyzw, r10.xyzw\n    mul r10.xyzw, r10.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n    max r8.xyzw, r10.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n    ishl r6.zw, r6.xxxy, l(0, 0, 16, 16)\n    ishr r10.xyzw, r6.zxwy, l(16, 16, 16, 16)\n    itof r10.xyzw, r10.xyzw\n    mul r10.xyzw, r10.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n    max r6.xyzw, r10.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n    ishl r9.zw, r9.xxxy, l(0, 0, 16, 16)\n    ishr r10.xyzw, r9.zxwy, l(16, 16, 16, 16)\n    itof r10.xyzw, r10.xyzw\n    mul r10.xyzw, r10.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n    max r9.xyzw, r10.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n    ishl r7.zw, r7.xxxy, l(0, 0, 16, 16)\n    ishr r10.xyzw, r7.zxwy, l(16, 16, 16, 16)\n    itof r10.xyzw, r10.xyzw\n    mul r10.xyzw, r10.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n    max r7.xyzw, r10.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n    break \n    case l(7)\n    ushr r5.xy, r8.xyxx, l(16, 16, 0, 0)\n    f16tof32 r8.xz, r8.xxyx\n    f16tof32 r8.yw, r5.xxxy\n    ushr r5.xy, r6.xyxx, l(16, 16, 0, 0)\n    f16tof32 r6.xz, r6.xxyx\n    f16tof32 r6.yw, r5.xxxy\n    ushr r5.xy, r9.xyxx, l(16, 16, 0, 0)\n    f16tof32 r9.xz, r9.xxyx\n    f16tof32 r9.yw, r5.xxxy\n    ushr r5.xy, r7.xyxx, l(16, 16, 0, 0)\n    f16tof32 r7.xz, r7.xxyx\n    f16tof32 r7.yw, r5.xxxy\n    break \n    default \n    mov r8.zw, l(0,0,0,0)\n    mov r6.zw, l(0,0,0,0)\n    mov r9.zw, l(0,0,0,0)\n    mov r7.zw, l(0,0,0,0)\n    break \n  endswitch \nelse \n  ieq r2.w, r1.z, l(4)\n  if_nz r2.w\n    ld_raw r7.xyzw, r0.y, T0[0].wxyz\n  else \n    ld_raw r7.y, r0.y, T0[0].xxxx\n    iadd r2.w, r0.y, r1.z\n    ld_raw r7.z, r2.w, T0[0].xxxx\n    ishl r5.xy, l(8, 12, 0, 0), r1.yyyy\n    iadd r5.xy, r0.yyyy, r5.xyxx\n    ld_raw r7.w, r5.x, T0[0].xxxx\n    ld_raw r7.x, r5.y, T0[0].xxxx\n  endif \n  switch r5.z\n    case l(0)\n    case l(1)\n    ushr r10.yzw, r7.yyyy, l(0, 8, 16, 24)\n    mov r10.x, r7.y\n    and r10.xyzw, r10.xyzw, l(255, 255, 255, 255)\n    utof r10.xyzw, r10.xyzw\n    mul r8.xyzw, r10.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n    ushr r10.yzw, r7.zzzz, l(0, 8, 16, 24)\n    mov r10.x, r7.z\n    and r10.xyzw, r10.xyzw, l(255, 255, 255, 255)\n    utof r10.xyzw, r10.xyzw\n    mul r6.xyzw, r10.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n    ushr r10.yzw, r7.wwww, l(0, 8, 16, 24)\n    mov r10.x, r7.w\n    and r10.xyzw, r10.xyzw, l(255, 255, 255, 255)\n    utof r10.xyzw, r10.xyzw\n    mul r9.xyzw, r10.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n    ushr r7.yzw, r7.xxxx, l(0, 8, 16, 24)\n    and r10.xyzw, r7.xyzw, l(255, 255, 255, 255)\n    utof r10.xyzw, r10.xyzw\n    mul r7.xyzw, r10.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n    break \n    case l(2)\n    case l(10)\n    ushr r10.yzw, r7.yyyy, l(0, 10, 20, 30)\n    mov r10.x, r7.y\n    and r10.xyzw, r10.xyzw, l(1023, 1023, 1023, 3)\n    utof r10.xyzw, r10.xyzw\n    mul r8.xyzw, r10.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n    ushr r10.yzw, r7.zzzz, l(0, 10, 20, 30)\n    mov r10.x, r7.z\n    and r10.xyzw, r10.xyzw, l(1023, 1023, 1023, 3)\n    utof r10.xyzw, r10.xyzw\n    mul r6.xyzw, r10.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n    ushr r10.yzw, r7.wwww, l(0, 10, 20, 30)\n    mov r10.x, r7.w\n    and r10.xyzw, r10.xyzw, l(1023, 1023, 1023, 3)\n    utof r10.xyzw, r10.xyzw\n    mul r9.xyzw, r10.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n    ushr r7.yzw, r7.xxxx, l(0, 10, 20, 30)\n    and r10.xyzw, r7.xyzw, l(1023, 1023, 1023, 3)\n    utof r10.xyzw, r10.xyzw\n    mul r7.xyzw, r10.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n    break \n    case l(3)\n    case l(12)\n    ushr r10.xyzw, r7.yyyz, l(10, 20, 30, 30)\n    mov r11.x, r7.y\n    mov r11.yz, r10.xxyx\n    and r12.xyz, r11.xyzx, l(1023, 1023, 1023, 0)\n    and r13.xyz, r11.xyzx, l(127, 127, 127, 0)\n    ubfe r14.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r11.xyzx\n    firstbit_hi r15.xyz, r13.xyzx\n    iadd r15.xyz, r15.xyzx, l(-24, -24, -24, 0)\n    movc r15.xyz, r13.xyzx, r15.xyzx, l(8,8,8,0)\n    iadd r16.xyz, -r15.xyzx, l(1, 1, 1, 0)\n    movc r16.xyz, r14.xyzx, r14.xyzx, r16.xyzx\n    bfi r11.xyz, l(7, 7, 7, 0), r15.xyzx, r11.xyzx, l(0, 0, 0, 0)\n    and r11.xyz, r11.xyzx, l(127, 127, 127, 0)\n    movc r11.xyz, r14.xyzx, r13.xyzx, r11.xyzx\n    ishl r13.xyz, r16.xyzx, l(23, 23, 23, 0)\n    iadd r13.xyz, r13.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n    ishl r11.xyz, r11.xyzx, l(16, 16, 16, 0)\n    iadd r11.xyz, r13.xyzx, r11.xyzx\n    movc r8.xyz, r12.xyzx, r11.xyzx, l(0,0,0,0)\n    utof r5.xy, r10.zwzz\n    ushr r10.xyzw, r7.zwwz, l(10, 10, 20, 20)\n    mov r11.x, r7.z\n    mov r11.yz, r10.xxwx\n    and r12.xyz, r11.xyzx, l(1023, 1023, 1023, 0)\n    and r13.xyz, r11.xyzx, l(127, 127, 127, 0)\n    ubfe r14.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r11.xyzx\n    firstbit_hi r15.xyz, r13.xyzx\n    iadd r15.xyz, r15.xyzx, l(-24, -24, -24, 0)\n    movc r15.xyz, r13.xyzx, r15.xyzx, l(8,8,8,0)\n    iadd r16.xyz, -r15.xyzx, l(1, 1, 1, 0)\n    movc r16.xyz, r14.xyzx, r14.xyzx, r16.xyzx\n    bfi r11.xyz, l(7, 7, 7, 0), r15.xyzx, r11.xyzx, l(0, 0, 0, 0)\n    and r11.xyz, r11.xyzx, l(127, 127, 127, 0)\n    movc r11.xyz, r14.xyzx, r13.xyzx, r11.xyzx\n    ishl r13.xyz, r16.xyzx, l(23, 23, 23, 0)\n    iadd r13.xyz, r13.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n    ishl r11.xyz, r11.xyzx, l(16, 16, 16, 0)\n    iadd r11.xyz, r13.xyzx, r11.xyzx\n    movc r6.xyz, r12.xyzx, r11.xyzx, l(0,0,0,0)\n    mul r5.xy, r5.xyxx, l(0.333333, 0.333333, 0.000000, 0.000000)\n    mov r10.x, r7.w\n    and r11.xyz, r10.xyzx, l(1023, 1023, 1023, 0)\n    and r12.xyz, r10.xyzx, l(127, 127, 127, 0)\n    ubfe r13.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r10.xyzx\n    firstbit_hi r14.xyz, r12.xyzx\n    iadd r14.xyz, r14.xyzx, l(-24, -24, -24, 0)\n    movc r14.xyz, r12.xyzx, r14.xyzx, l(8,8,8,0)\n    iadd r15.xyz, -r14.xyzx, l(1, 1, 1, 0)\n    movc r15.xyz, r13.xyzx, r13.xyzx, r15.xyzx\n    bfi r10.xyz, l(7, 7, 7, 0), r14.xyzx, r10.xyzx, l(0, 0, 0, 0)\n    and r10.xyz, r10.xyzx, l(127, 127, 127, 0)\n    movc r10.xyz, r13.xyzx, r12.xyzx, r10.xyzx\n    ishl r12.xyz, r15.xyzx, l(23, 23, 23, 0)\n    iadd r12.xyz, r12.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n    ishl r10.xyz, r10.xyzx, l(16, 16, 16, 0)\n    iadd r10.xyz, r12.xyzx, r10.xyzx\n    movc r9.xyz, r11.xyzx, r10.xyzx, l(0,0,0,0)\n    ushr r10.xyzw, r7.wxxx, l(30, 10, 20, 30)\n    utof r11.xy, r10.xwxx\n    mov r10.x, r7.x\n    and r12.xyz, r10.xyzx, l(1023, 1023, 1023, 0)\n    and r13.xyz, r10.xyzx, l(127, 127, 127, 0)\n    ubfe r14.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r10.xyzx\n    firstbit_hi r15.xyz, r13.xyzx\n    iadd r15.xyz, r15.xyzx, l(-24, -24, -24, 0)\n    movc r15.xyz, r13.xyzx, r15.xyzx, l(8,8,8,0)\n    iadd r16.xyz, -r15.xyzx, l(1, 1, 1, 0)\n    movc r16.xyz, r14.xyzx, r14.xyzx, r16.xyzx\n    bfi r10.xyz, l(7, 7, 7, 0), r15.xyzx, r10.xyzx, l(0, 0, 0, 0)\n    and r10.xyz, r10.xyzx, l(127, 127, 127, 0)\n    movc r10.xyz, r14.xyzx, r13.xyzx, r10.xyzx\n    ishl r13.xyz, r16.xyzx, l(23, 23, 23, 0)\n    iadd r13.xyz, r13.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n    ishl r10.xyz, r10.xyzx, l(16, 16, 16, 0)\n    iadd r10.xyz, r13.xyzx, r10.xyzx\n    movc r7.xyz, r12.xyzx, r10.xyzx, l(0,0,0,0)\n    mul r10.xy, r11.xyxx, l(0.333333, 0.333333, 0.000000, 0.000000)\n    mov r8.w, r5.x\n    mov r6.w, r5.y\n    mov r9.w, r10.x\n    mov r7.w, r10.y\n    break \n    case l(4)\n    ishl r10.xyzw, r7.yzwx, l(16, 16, 16, 16)\n    mov r11.xz, r10.xxyx\n    mov r11.yw, r7.yyyz\n    ishr r11.xyzw, r11.xyzw, l(16, 16, 16, 16)\n    itof r11.xyzw, r11.xyzw\n    mul r11.xyzw, r11.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n    max r8.xy, r11.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n    max r6.xy, r11.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n    mov r7.yz, r10.zzwz\n    ishr r10.xyzw, r7.ywzx, l(16, 16, 16, 16)\n    itof r10.xyzw, r10.xyzw\n    mul r10.xyzw, r10.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n    max r9.xy, r10.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n    max r7.xy, r10.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n    mov r8.zw, l(0,0,0,0)\n    mov r6.zw, l(0,0,0,0)\n    mov r9.zw, l(0,0,0,0)\n    mov r7.zw, l(0,0,0,0)\n    break \n    case l(6)\n    ushr r10.xyzw, r7.yzwx, l(16, 16, 16, 16)\n    f16tof32 r8.x, r7.y\n    f16tof32 r8.y, r10.x\n    f16tof32 r6.x, r7.z\n    f16tof32 r6.y, r10.y\n    f16tof32 r9.x, r7.w\n    f16tof32 r9.y, r10.z\n    f16tof32 r7.x, r7.x\n    f16tof32 r7.y, r10.w\n    mov r8.zw, l(0,0,0,0)\n    mov r6.zw, l(0,0,0,0)\n    mov r9.zw, l(0,0,0,0)\n    mov r7.zw, l(0,0,0,0)\n    break \n    default \n    mov r8.x, r7.y\n    mov r8.yzw, l(0,0,0,0)\n    mov r6.x, r7.z\n    mov r6.yzw, l(0,0,0,0)\n    mov r9.x, r7.w\n    mov r9.yzw, l(0,0,0,0)\n    mov r7.yzw, l(0,0,0,0)\n    break \n  endswitch \nendif \nuge r2.w, r2.y, l(4)\nif_nz r2.w\n  mul r2.w, r1.w, l(0.500000)\n  iadd r5.x, r0.y, l(320)\n  if_nz r5.w\n    ieq r5.y, r1.z, l(8)\n    if_nz r5.y\n      ld_raw r10.xyzw, r5.x, T0[0].zwxy\n      iadd r5.y, r0.y, l(336)\n      ld_raw r11.xyzw, r5.y, T0[0].zwxy\n      mov r12.xy, r10.zwzz\n      mov r14.xy, r11.zwzz\n    else \n      ld_raw r12.xy, r5.x, T0[0].xyxx\n      iadd r5.y, r1.z, r5.x\n      ld_raw r10.xy, r5.y, T0[0].xyxx\n      ishl r13.xy, l(8, 12, 0, 0), r1.yyyy\n      iadd r13.xy, r5.xxxx, r13.xyxx\n      ld_raw r14.xy, r13.x, T0[0].xyxx\n      ld_raw r11.xy, r13.y, T0[0].xyxx\n    endif \n    switch r5.z\n      case l(5)\n      ishl r12.zw, r12.xxxy, l(0, 0, 16, 16)\n      ishr r13.xyzw, r12.zxwy, l(16, 16, 16, 16)\n      itof r13.xyzw, r13.xyzw\n      mul r13.xyzw, r13.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n      max r12.xyzw, r13.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n      ishl r10.zw, r10.xxxy, l(0, 0, 16, 16)\n      ishr r13.xyzw, r10.zxwy, l(16, 16, 16, 16)\n      itof r13.xyzw, r13.xyzw\n      mul r13.xyzw, r13.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n      max r10.xyzw, r13.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n      ishl r14.zw, r14.xxxy, l(0, 0, 16, 16)\n      ishr r13.xyzw, r14.zxwy, l(16, 16, 16, 16)\n      itof r13.xyzw, r13.xyzw\n      mul r13.xyzw, r13.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n      max r14.xyzw, r13.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n      ishl r11.zw, r11.xxxy, l(0, 0, 16, 16)\n      ishr r13.xyzw, r11.zxwy, l(16, 16, 16, 16)\n      itof r13.xyzw, r13.xyzw\n      mul r13.xyzw, r13.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n      max r11.xyzw, r13.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n      break \n      case l(7)\n      ushr r13.xy, r12.xyxx, l(16, 16, 0, 0)\n      f16tof32 r12.xz, r12.xxyx\n      f16tof32 r12.yw, r13.xxxy\n      ushr r13.xy, r10.xyxx, l(16, 16, 0, 0)\n      f16tof32 r10.xz, r10.xxyx\n      f16tof32 r10.yw, r13.xxxy\n      ushr r13.xy, r14.xyxx, l(16, 16, 0, 0)\n      f16tof32 r14.xz, r14.xxyx\n      f16tof32 r14.yw, r13.xxxy\n      ushr r13.xy, r11.xyxx, l(16, 16, 0, 0)\n      f16tof32 r11.xz, r11.xxyx\n      f16tof32 r11.yw, r13.xxxy\n      break \n      default \n      mov r12.zw, l(0,0,0,0)\n      mov r10.zw, l(0,0,0,0)\n      mov r14.zw, l(0,0,0,0)\n      mov r11.zw, l(0,0,0,0)\n      break \n    endswitch \n  else \n    ieq r5.y, r1.z, l(4)\n    if_nz r5.y\n      ld_raw r11.xyzw, r5.x, T0[0].wxyz\n    else \n      ld_raw r11.y, r5.x, T0[0].xxxx\n      iadd r5.y, r1.z, r5.x\n      ld_raw r11.z, r5.y, T0[0].xxxx\n      ishl r13.xy, l(8, 12, 0, 0), r1.yyyy\n      iadd r13.xy, r5.xxxx, r13.xyxx\n      ld_raw r11.w, r13.x, T0[0].xxxx\n      ld_raw r11.x, r13.y, T0[0].xxxx\n    endif \n    switch r5.z\n      case l(0)\n      case l(1)\n      ushr r13.yzw, r11.yyyy, l(0, 8, 16, 24)\n      mov r13.x, r11.y\n      and r13.xyzw, r13.xyzw, l(255, 255, 255, 255)\n      utof r13.xyzw, r13.xyzw\n      mul r12.xyzw, r13.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n      ushr r13.yzw, r11.zzzz, l(0, 8, 16, 24)\n      mov r13.x, r11.z\n      and r13.xyzw, r13.xyzw, l(255, 255, 255, 255)\n      utof r13.xyzw, r13.xyzw\n      mul r10.xyzw, r13.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n      ushr r13.yzw, r11.wwww, l(0, 8, 16, 24)\n      mov r13.x, r11.w\n      and r13.xyzw, r13.xyzw, l(255, 255, 255, 255)\n      utof r13.xyzw, r13.xyzw\n      mul r14.xyzw, r13.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n      ushr r11.yzw, r11.xxxx, l(0, 8, 16, 24)\n      and r13.xyzw, r11.xyzw, l(255, 255, 255, 255)\n      utof r13.xyzw, r13.xyzw\n      mul r11.xyzw, r13.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n      break \n      case l(2)\n      case l(10)\n      ushr r13.yzw, r11.yyyy, l(0, 10, 20, 30)\n      mov r13.x, r11.y\n      and r13.xyzw, r13.xyzw, l(1023, 1023, 1023, 3)\n      utof r13.xyzw, r13.xyzw\n      mul r12.xyzw, r13.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n      ushr r13.yzw, r11.zzzz, l(0, 10, 20, 30)\n      mov r13.x, r11.z\n      and r13.xyzw, r13.xyzw, l(1023, 1023, 1023, 3)\n      utof r13.xyzw, r13.xyzw\n      mul r10.xyzw, r13.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n      ushr r13.yzw, r11.wwww, l(0, 10, 20, 30)\n      mov r13.x, r11.w\n      and r13.xyzw, r13.xyzw, l(1023, 1023, 1023, 3)\n      utof r13.xyzw, r13.xyzw\n      mul r14.xyzw, r13.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n      ushr r11.yzw, r11.xxxx, l(0, 10, 20, 30)\n      and r13.xyzw, r11.xyzw, l(1023, 1023, 1023, 3)\n      utof r13.xyzw, r13.xyzw\n      mul r11.xyzw, r13.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n      break \n      case l(3)\n      case l(12)\n      ushr r13.xyzw, r11.yyyz, l(10, 20, 30, 30)\n      mov r15.x, r11.y\n      mov r15.yz, r13.xxyx\n      and r16.xyz, r15.xyzx, l(1023, 1023, 1023, 0)\n      and r17.xyz, r15.xyzx, l(127, 127, 127, 0)\n      ubfe r18.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r15.xyzx\n      firstbit_hi r19.xyz, r17.xyzx\n      iadd r19.xyz, r19.xyzx, l(-24, -24, -24, 0)\n      movc r19.xyz, r17.xyzx, r19.xyzx, l(8,8,8,0)\n      iadd r20.xyz, -r19.xyzx, l(1, 1, 1, 0)\n      movc r20.xyz, r18.xyzx, r18.xyzx, r20.xyzx\n      bfi r15.xyz, l(7, 7, 7, 0), r19.xyzx, r15.xyzx, l(0, 0, 0, 0)\n      and r15.xyz, r15.xyzx, l(127, 127, 127, 0)\n      movc r15.xyz, r18.xyzx, r17.xyzx, r15.xyzx\n      ishl r17.xyz, r20.xyzx, l(23, 23, 23, 0)\n      iadd r17.xyz, r17.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n      ishl r15.xyz, r15.xyzx, l(16, 16, 16, 0)\n      iadd r15.xyz, r17.xyzx, r15.xyzx\n      movc r12.xyz, r16.xyzx, r15.xyzx, l(0,0,0,0)\n      utof r13.xy, r13.zwzz\n      ushr r15.xyzw, r11.zwwz, l(10, 10, 20, 20)\n      mov r16.x, r11.z\n      mov r16.yz, r15.xxwx\n      and r17.xyz, r16.xyzx, l(1023, 1023, 1023, 0)\n      and r18.xyz, r16.xyzx, l(127, 127, 127, 0)\n      ubfe r19.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r16.xyzx\n      firstbit_hi r20.xyz, r18.xyzx\n      iadd r20.xyz, r20.xyzx, l(-24, -24, -24, 0)\n      movc r20.xyz, r18.xyzx, r20.xyzx, l(8,8,8,0)\n      iadd r21.xyz, -r20.xyzx, l(1, 1, 1, 0)\n      movc r21.xyz, r19.xyzx, r19.xyzx, r21.xyzx\n      bfi r16.xyz, l(7, 7, 7, 0), r20.xyzx, r16.xyzx, l(0, 0, 0, 0)\n      and r16.xyz, r16.xyzx, l(127, 127, 127, 0)\n      movc r16.xyz, r19.xyzx, r18.xyzx, r16.xyzx\n      ishl r18.xyz, r21.xyzx, l(23, 23, 23, 0)\n      iadd r18.xyz, r18.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n      ishl r16.xyz, r16.xyzx, l(16, 16, 16, 0)\n      iadd r16.xyz, r18.xyzx, r16.xyzx\n      movc r10.xyz, r17.xyzx, r16.xyzx, l(0,0,0,0)\n      mov r15.x, r11.w\n      and r16.xyz, r15.xyzx, l(1023, 1023, 1023, 0)\n      and r17.xyz, r15.xyzx, l(127, 127, 127, 0)\n      ubfe r18.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r15.xyzx\n      firstbit_hi r19.xyz, r17.xyzx\n      iadd r19.xyz, r19.xyzx, l(-24, -24, -24, 0)\n      movc r19.xyz, r17.xyzx, r19.xyzx, l(8,8,8,0)\n      iadd r20.xyz, -r19.xyzx, l(1, 1, 1, 0)\n      movc r20.xyz, r18.xyzx, r18.xyzx, r20.xyzx\n      bfi r15.xyz, l(7, 7, 7, 0), r19.xyzx, r15.xyzx, l(0, 0, 0, 0)\n      and r15.xyz, r15.xyzx, l(127, 127, 127, 0)\n      movc r15.xyz, r18.xyzx, r17.xyzx, r15.xyzx\n      ishl r17.xyz, r20.xyzx, l(23, 23, 23, 0)\n      iadd r17.xyz, r17.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n      ishl r15.xyz, r15.xyzx, l(16, 16, 16, 0)\n      iadd r15.xyz, r17.xyzx, r15.xyzx\n      movc r14.xyz, r16.xyzx, r15.xyzx, l(0,0,0,0)\n      ushr r15.xyzw, r11.wxxx, l(30, 10, 20, 30)\n      utof r13.zw, r15.xxxw\n      mov r15.x, r11.x\n      and r16.xyz, r15.xyzx, l(1023, 1023, 1023, 0)\n      and r17.xyz, r15.xyzx, l(127, 127, 127, 0)\n      ubfe r18.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r15.xyzx\n      firstbit_hi r19.xyz, r17.xyzx\n      iadd r19.xyz, r19.xyzx, l(-24, -24, -24, 0)\n      movc r19.xyz, r17.xyzx, r19.xyzx, l(8,8,8,0)\n      iadd r20.xyz, -r19.xyzx, l(1, 1, 1, 0)\n      movc r20.xyz, r18.xyzx, r18.xyzx, r20.xyzx\n      bfi r15.xyz, l(7, 7, 7, 0), r19.xyzx, r15.xyzx, l(0, 0, 0, 0)\n      and r15.xyz, r15.xyzx, l(127, 127, 127, 0)\n      movc r15.xyz, r18.xyzx, r17.xyzx, r15.xyzx\n      ishl r17.xyz, r20.xyzx, l(23, 23, 23, 0)\n      iadd r17.xyz, r17.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n      ishl r15.xyz, r15.xyzx, l(16, 16, 16, 0)\n      iadd r15.xyz, r17.xyzx, r15.xyzx\n      movc r11.xyz, r16.xyzx, r15.xyzx, l(0,0,0,0)\n      mul r13.xyzw, r13.xyzw, l(0.333333, 0.333333, 0.333333, 0.333333)\n      mov r12.w, r13.x\n      mov r10.w, r13.y\n      mov r14.w, r13.z\n      mov r11.w, r13.w\n      break \n      case l(4)\n      ishl r13.xyzw, r11.yzwx, l(16, 16, 16, 16)\n      mov r15.xz, r13.xxyx\n      mov r15.yw, r11.yyyz\n      ishr r15.xyzw, r15.xyzw, l(16, 16, 16, 16)\n      itof r15.xyzw, r15.xyzw\n      mul r15.xyzw, r15.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n      max r12.xy, r15.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n      max r10.xy, r15.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n      mov r11.yz, r13.zzwz\n      ishr r13.xyzw, r11.ywzx, l(16, 16, 16, 16)\n      itof r13.xyzw, r13.xyzw\n      mul r13.xyzw, r13.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n      max r14.xy, r13.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n      max r11.xy, r13.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n      mov r12.zw, l(0,0,0,0)\n      mov r10.zw, l(0,0,0,0)\n      mov r14.zw, l(0,0,0,0)\n      mov r11.zw, l(0,0,0,0)\n      break \n      case l(6)\n      ushr r13.xyzw, r11.yzwx, l(16, 16, 16, 16)\n      f16tof32 r12.x, r11.y\n      f16tof32 r12.y, r13.x\n      f16tof32 r10.x, r11.z\n      f16tof32 r10.y, r13.y\n      f16tof32 r14.x, r11.w\n      f16tof32 r14.y, r13.z\n      f16tof32 r11.x, r11.x\n      f16tof32 r11.y, r13.w\n      mov r12.zw, l(0,0,0,0)\n      mov r10.zw, l(0,0,0,0)\n      mov r14.zw, l(0,0,0,0)\n      mov r11.zw, l(0,0,0,0)\n      break \n      default \n      mov r12.x, r11.y\n      mov r12.yzw, l(0,0,0,0)\n      mov r10.x, r11.z\n      mov r10.yzw, l(0,0,0,0)\n      mov r14.x, r11.w\n      mov r14.yzw, l(0,0,0,0)\n      mov r11.yzw, l(0,0,0,0)\n      break \n    endswitch \n  endif \n  add r8.xyzw, r8.xyzw, r12.xyzw\n  add r6.xyzw, r6.xyzw, r10.xyzw\n  add r9.xyzw, r9.xyzw, r14.xyzw\n  add r7.xyzw, r7.xyzw, r11.xyzw\n  uge r2.y, r2.y, l(6)\n  if_nz r2.y\n    ishl r2.y, l(4), r5.w\n    mul r1.w, r1.w, l(0.250000)\n    iadd r0.y, r0.y, r2.y\n    if_nz r5.w\n      ieq r5.y, r1.z, l(8)\n      if_nz r5.y\n        ld_raw r10.xyzw, r0.y, T0[0].zwxy\n        iadd r5.y, r0.y, l(16)\n        ld_raw r11.xyzw, r5.y, T0[0].zwxy\n        mov r12.xy, r10.zwzz\n        mov r14.xy, r11.zwzz\n      else \n        ld_raw r12.xy, r0.y, T0[0].xyxx\n        iadd r5.y, r1.z, r0.y\n        ld_raw r10.xy, r5.y, T0[0].xyxx\n        ishl r13.xy, l(8, 12, 0, 0), r1.yyyy\n        iadd r13.xy, r0.yyyy, r13.xyxx\n        ld_raw r14.xy, r13.x, T0[0].xyxx\n        ld_raw r11.xy, r13.y, T0[0].xyxx\n      endif \n      switch r5.z\n        case l(5)\n        ishl r12.zw, r12.xxxy, l(0, 0, 16, 16)\n        ishr r13.xyzw, r12.zxwy, l(16, 16, 16, 16)\n        itof r13.xyzw, r13.xyzw\n        mul r13.xyzw, r13.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r12.xyzw, r13.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        ishl r10.zw, r10.xxxy, l(0, 0, 16, 16)\n        ishr r13.xyzw, r10.zxwy, l(16, 16, 16, 16)\n        itof r13.xyzw, r13.xyzw\n        mul r13.xyzw, r13.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r10.xyzw, r13.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        ishl r14.zw, r14.xxxy, l(0, 0, 16, 16)\n        ishr r13.xyzw, r14.zxwy, l(16, 16, 16, 16)\n        itof r13.xyzw, r13.xyzw\n        mul r13.xyzw, r13.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r14.xyzw, r13.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        ishl r11.zw, r11.xxxy, l(0, 0, 16, 16)\n        ishr r13.xyzw, r11.zxwy, l(16, 16, 16, 16)\n        itof r13.xyzw, r13.xyzw\n        mul r13.xyzw, r13.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r11.xyzw, r13.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        break \n        case l(7)\n        ushr r13.xy, r12.xyxx, l(16, 16, 0, 0)\n        f16tof32 r12.xz, r12.xxyx\n        f16tof32 r12.yw, r13.xxxy\n        ushr r13.xy, r10.xyxx, l(16, 16, 0, 0)\n        f16tof32 r10.xz, r10.xxyx\n        f16tof32 r10.yw, r13.xxxy\n        ushr r13.xy, r14.xyxx, l(16, 16, 0, 0)\n        f16tof32 r14.xz, r14.xxyx\n        f16tof32 r14.yw, r13.xxxy\n        ushr r13.xy, r11.xyxx, l(16, 16, 0, 0)\n        f16tof32 r11.xz, r11.xxyx\n        f16tof32 r11.yw, r13.xxxy\n        break \n        default \n        mov r12.zw, l(0,0,0,0)\n        mov r10.zw, l(0,0,0,0)\n        mov r14.zw, l(0,0,0,0)\n        mov r11.zw, l(0,0,0,0)\n        break \n      endswitch \n    else \n      ieq r5.y, r1.z, l(4)\n      if_nz r5.y\n        ld_raw r11.xyzw, r0.y, T0[0].wxyz\n      else \n        ld_raw r11.y, r0.y, T0[0].xxxx\n        iadd r5.y, r1.z, r0.y\n        ld_raw r11.z, r5.y, T0[0].xxxx\n        ishl r13.xy, l(8, 12, 0, 0), r1.yyyy\n        iadd r13.xy, r0.yyyy, r13.xyxx\n        ld_raw r11.w, r13.x, T0[0].xxxx\n        ld_raw r11.x, r13.y, T0[0].xxxx\n      endif \n      switch r5.z\n        case l(0)\n        case l(1)\n        ushr r13.yzw, r11.yyyy, l(0, 8, 16, 24)\n        mov r13.x, r11.y\n        and r13.xyzw, r13.xyzw, l(255, 255, 255, 255)\n        utof r13.xyzw, r13.xyzw\n        mul r12.xyzw, r13.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        ushr r13.yzw, r11.zzzz, l(0, 8, 16, 24)\n        mov r13.x, r11.z\n        and r13.xyzw, r13.xyzw, l(255, 255, 255, 255)\n        utof r13.xyzw, r13.xyzw\n        mul r10.xyzw, r13.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        ushr r13.yzw, r11.wwww, l(0, 8, 16, 24)\n        mov r13.x, r11.w\n        and r13.xyzw, r13.xyzw, l(255, 255, 255, 255)\n        utof r13.xyzw, r13.xyzw\n        mul r14.xyzw, r13.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        ushr r11.yzw, r11.xxxx, l(0, 8, 16, 24)\n        and r13.xyzw, r11.xyzw, l(255, 255, 255, 255)\n        utof r13.xyzw, r13.xyzw\n        mul r11.xyzw, r13.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        break \n        case l(2)\n        case l(10)\n        ushr r13.yzw, r11.yyyy, l(0, 10, 20, 30)\n        mov r13.x, r11.y\n        and r13.xyzw, r13.xyzw, l(1023, 1023, 1023, 3)\n        utof r13.xyzw, r13.xyzw\n        mul r12.xyzw, r13.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        ushr r13.yzw, r11.zzzz, l(0, 10, 20, 30)\n        mov r13.x, r11.z\n        and r13.xyzw, r13.xyzw, l(1023, 1023, 1023, 3)\n        utof r13.xyzw, r13.xyzw\n        mul r10.xyzw, r13.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        ushr r13.yzw, r11.wwww, l(0, 10, 20, 30)\n        mov r13.x, r11.w\n        and r13.xyzw, r13.xyzw, l(1023, 1023, 1023, 3)\n        utof r13.xyzw, r13.xyzw\n        mul r14.xyzw, r13.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        ushr r11.yzw, r11.xxxx, l(0, 10, 20, 30)\n        and r13.xyzw, r11.xyzw, l(1023, 1023, 1023, 3)\n        utof r13.xyzw, r13.xyzw\n        mul r11.xyzw, r13.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        break \n        case l(3)\n        case l(12)\n        ushr r13.xyzw, r11.yyyz, l(10, 20, 30, 30)\n        mov r15.x, r11.y\n        mov r15.yz, r13.xxyx\n        and r16.xyz, r15.xyzx, l(1023, 1023, 1023, 0)\n        and r17.xyz, r15.xyzx, l(127, 127, 127, 0)\n        ubfe r18.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r15.xyzx\n        firstbit_hi r19.xyz, r17.xyzx\n        iadd r19.xyz, r19.xyzx, l(-24, -24, -24, 0)\n        movc r19.xyz, r17.xyzx, r19.xyzx, l(8,8,8,0)\n        iadd r20.xyz, -r19.xyzx, l(1, 1, 1, 0)\n        movc r20.xyz, r18.xyzx, r18.xyzx, r20.xyzx\n        bfi r15.xyz, l(7, 7, 7, 0), r19.xyzx, r15.xyzx, l(0, 0, 0, 0)\n        and r15.xyz, r15.xyzx, l(127, 127, 127, 0)\n        movc r15.xyz, r18.xyzx, r17.xyzx, r15.xyzx\n        ishl r17.xyz, r20.xyzx, l(23, 23, 23, 0)\n        iadd r17.xyz, r17.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r15.xyz, r15.xyzx, l(16, 16, 16, 0)\n        iadd r15.xyz, r17.xyzx, r15.xyzx\n        movc r12.xyz, r16.xyzx, r15.xyzx, l(0,0,0,0)\n        utof r13.xy, r13.zwzz\n        ushr r15.xyzw, r11.zwwz, l(10, 10, 20, 20)\n        mov r16.x, r11.z\n        mov r16.yz, r15.xxwx\n        and r17.xyz, r16.xyzx, l(1023, 1023, 1023, 0)\n        and r18.xyz, r16.xyzx, l(127, 127, 127, 0)\n        ubfe r19.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r16.xyzx\n        firstbit_hi r20.xyz, r18.xyzx\n        iadd r20.xyz, r20.xyzx, l(-24, -24, -24, 0)\n        movc r20.xyz, r18.xyzx, r20.xyzx, l(8,8,8,0)\n        iadd r21.xyz, -r20.xyzx, l(1, 1, 1, 0)\n        movc r21.xyz, r19.xyzx, r19.xyzx, r21.xyzx\n        bfi r16.xyz, l(7, 7, 7, 0), r20.xyzx, r16.xyzx, l(0, 0, 0, 0)\n        and r16.xyz, r16.xyzx, l(127, 127, 127, 0)\n        movc r16.xyz, r19.xyzx, r18.xyzx, r16.xyzx\n        ishl r18.xyz, r21.xyzx, l(23, 23, 23, 0)\n        iadd r18.xyz, r18.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r16.xyz, r16.xyzx, l(16, 16, 16, 0)\n        iadd r16.xyz, r18.xyzx, r16.xyzx\n        movc r10.xyz, r17.xyzx, r16.xyzx, l(0,0,0,0)\n        mov r15.x, r11.w\n        and r16.xyz, r15.xyzx, l(1023, 1023, 1023, 0)\n        and r17.xyz, r15.xyzx, l(127, 127, 127, 0)\n        ubfe r18.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r15.xyzx\n        firstbit_hi r19.xyz, r17.xyzx\n        iadd r19.xyz, r19.xyzx, l(-24, -24, -24, 0)\n        movc r19.xyz, r17.xyzx, r19.xyzx, l(8,8,8,0)\n        iadd r20.xyz, -r19.xyzx, l(1, 1, 1, 0)\n        movc r20.xyz, r18.xyzx, r18.xyzx, r20.xyzx\n        bfi r15.xyz, l(7, 7, 7, 0), r19.xyzx, r15.xyzx, l(0, 0, 0, 0)\n        and r15.xyz, r15.xyzx, l(127, 127, 127, 0)\n        movc r15.xyz, r18.xyzx, r17.xyzx, r15.xyzx\n        ishl r17.xyz, r20.xyzx, l(23, 23, 23, 0)\n        iadd r17.xyz, r17.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r15.xyz, r15.xyzx, l(16, 16, 16, 0)\n        iadd r15.xyz, r17.xyzx, r15.xyzx\n        movc r14.xyz, r16.xyzx, r15.xyzx, l(0,0,0,0)\n        ushr r15.xyzw, r11.wxxx, l(30, 10, 20, 30)\n        utof r13.zw, r15.xxxw\n        mov r15.x, r11.x\n        and r16.xyz, r15.xyzx, l(1023, 1023, 1023, 0)\n        and r17.xyz, r15.xyzx, l(127, 127, 127, 0)\n        ubfe r18.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r15.xyzx\n        firstbit_hi r19.xyz, r17.xyzx\n        iadd r19.xyz, r19.xyzx, l(-24, -24, -24, 0)\n        movc r19.xyz, r17.xyzx, r19.xyzx, l(8,8,8,0)\n        iadd r20.xyz, -r19.xyzx, l(1, 1, 1, 0)\n        movc r20.xyz, r18.xyzx, r18.xyzx, r20.xyzx\n        bfi r15.xyz, l(7, 7, 7, 0), r19.xyzx, r15.xyzx, l(0, 0, 0, 0)\n        and r15.xyz, r15.xyzx, l(127, 127, 127, 0)\n        movc r15.xyz, r18.xyzx, r17.xyzx, r15.xyzx\n        ishl r17.xyz, r20.xyzx, l(23, 23, 23, 0)\n        iadd r17.xyz, r17.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r15.xyz, r15.xyzx, l(16, 16, 16, 0)\n        iadd r15.xyz, r17.xyzx, r15.xyzx\n        movc r11.xyz, r16.xyzx, r15.xyzx, l(0,0,0,0)\n        mul r13.xyzw, r13.xyzw, l(0.333333, 0.333333, 0.333333, 0.333333)\n        mov r12.w, r13.x\n        mov r10.w, r13.y\n        mov r14.w, r13.z\n        mov r11.w, r13.w\n        break \n        case l(4)\n        ishl r13.xyzw, r11.yzwx, l(16, 16, 16, 16)\n        mov r15.xz, r13.xxyx\n        mov r15.yw, r11.yyyz\n        ishr r15.xyzw, r15.xyzw, l(16, 16, 16, 16)\n        itof r15.xyzw, r15.xyzw\n        mul r15.xyzw, r15.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r12.xy, r15.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        max r10.xy, r15.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        mov r11.yz, r13.zzwz\n        ishr r13.xyzw, r11.ywzx, l(16, 16, 16, 16)\n        itof r13.xyzw, r13.xyzw\n        mul r13.xyzw, r13.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r14.xy, r13.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        max r11.xy, r13.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        mov r12.zw, l(0,0,0,0)\n        mov r10.zw, l(0,0,0,0)\n        mov r14.zw, l(0,0,0,0)\n        mov r11.zw, l(0,0,0,0)\n        break \n        case l(6)\n        ushr r13.xyzw, r11.yzwx, l(16, 16, 16, 16)\n        f16tof32 r12.x, r11.y\n        f16tof32 r12.y, r13.x\n        f16tof32 r10.x, r11.z\n        f16tof32 r10.y, r13.y\n        f16tof32 r14.x, r11.w\n        f16tof32 r14.y, r13.z\n        f16tof32 r11.x, r11.x\n        f16tof32 r11.y, r13.w\n        mov r12.zw, l(0,0,0,0)\n        mov r10.zw, l(0,0,0,0)\n        mov r14.zw, l(0,0,0,0)\n        mov r11.zw, l(0,0,0,0)\n        break \n        default \n        mov r12.x, r11.y\n        mov r12.yzw, l(0,0,0,0)\n        mov r10.x, r11.z\n        mov r10.yzw, l(0,0,0,0)\n        mov r14.x, r11.w\n        mov r14.yzw, l(0,0,0,0)\n        mov r11.yzw, l(0,0,0,0)\n        break \n      endswitch \n    endif \n    add r12.xyzw, r8.xyzw, r12.xyzw\n    add r10.xyzw, r6.xyzw, r10.xyzw\n    add r13.xyzw, r9.xyzw, r14.xyzw\n    add r11.xyzw, r7.xyzw, r11.xyzw\n    iadd r0.y, r2.y, r5.x\n    if_nz r5.w\n      ieq r2.y, r1.z, l(8)\n      if_nz r2.y\n        ld_raw r14.xyzw, r0.y, T0[0].zwxy\n        iadd r2.y, r0.y, l(16)\n        ld_raw r15.xyzw, r2.y, T0[0].zwxy\n        mov r16.xy, r14.zwzz\n        mov r17.xy, r15.zwzz\n      else \n        ld_raw r16.xy, r0.y, T0[0].xyxx\n        iadd r2.y, r1.z, r0.y\n        ld_raw r14.xy, r2.y, T0[0].xyxx\n        ishl r5.xy, l(8, 12, 0, 0), r1.yyyy\n        iadd r5.xy, r0.yyyy, r5.xyxx\n        ld_raw r17.xy, r5.x, T0[0].xyxx\n        ld_raw r15.xy, r5.y, T0[0].xyxx\n      endif \n      switch r5.z\n        case l(5)\n        ishl r16.zw, r16.xxxy, l(0, 0, 16, 16)\n        ishr r18.xyzw, r16.zxwy, l(16, 16, 16, 16)\n        itof r18.xyzw, r18.xyzw\n        mul r18.xyzw, r18.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r16.xyzw, r18.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        ishl r14.zw, r14.xxxy, l(0, 0, 16, 16)\n        ishr r18.xyzw, r14.zxwy, l(16, 16, 16, 16)\n        itof r18.xyzw, r18.xyzw\n        mul r18.xyzw, r18.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r14.xyzw, r18.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        ishl r17.zw, r17.xxxy, l(0, 0, 16, 16)\n        ishr r18.xyzw, r17.zxwy, l(16, 16, 16, 16)\n        itof r18.xyzw, r18.xyzw\n        mul r18.xyzw, r18.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r17.xyzw, r18.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        ishl r15.zw, r15.xxxy, l(0, 0, 16, 16)\n        ishr r18.xyzw, r15.zxwy, l(16, 16, 16, 16)\n        itof r18.xyzw, r18.xyzw\n        mul r18.xyzw, r18.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r15.xyzw, r18.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        break \n        case l(7)\n        ushr r5.xy, r16.xyxx, l(16, 16, 0, 0)\n        f16tof32 r16.xz, r16.xxyx\n        f16tof32 r16.yw, r5.xxxy\n        ushr r5.xy, r14.xyxx, l(16, 16, 0, 0)\n        f16tof32 r14.xz, r14.xxyx\n        f16tof32 r14.yw, r5.xxxy\n        ushr r5.xy, r17.xyxx, l(16, 16, 0, 0)\n        f16tof32 r17.xz, r17.xxyx\n        f16tof32 r17.yw, r5.xxxy\n        ushr r5.xy, r15.xyxx, l(16, 16, 0, 0)\n        f16tof32 r15.xz, r15.xxyx\n        f16tof32 r15.yw, r5.xxxy\n        break \n        default \n        mov r16.zw, l(0,0,0,0)\n        mov r14.zw, l(0,0,0,0)\n        mov r17.zw, l(0,0,0,0)\n        mov r15.zw, l(0,0,0,0)\n        break \n      endswitch \n    else \n      ieq r2.y, r1.z, l(4)\n      if_nz r2.y\n        ld_raw r15.xyzw, r0.y, T0[0].wxyz\n      else \n        ld_raw r15.y, r0.y, T0[0].xxxx\n        iadd r1.z, r1.z, r0.y\n        ld_raw r15.z, r1.z, T0[0].xxxx\n        ishl r1.yz, l(0, 8, 12, 0), r1.yyyy\n        iadd r1.yz, r0.yyyy, r1.yyzy\n        ld_raw r15.w, r1.y, T0[0].xxxx\n        ld_raw r15.x, r1.z, T0[0].xxxx\n      endif \n      switch r5.z\n        case l(0)\n        case l(1)\n        ushr r5.yzw, r15.yyyy, l(0, 8, 16, 24)\n        mov r5.x, r15.y\n        and r5.xyzw, r5.xyzw, l(255, 255, 255, 255)\n        utof r5.xyzw, r5.xyzw\n        mul r16.xyzw, r5.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        ushr r5.yzw, r15.zzzz, l(0, 8, 16, 24)\n        mov r5.x, r15.z\n        and r5.xyzw, r5.xyzw, l(255, 255, 255, 255)\n        utof r5.xyzw, r5.xyzw\n        mul r14.xyzw, r5.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        ushr r5.yzw, r15.wwww, l(0, 8, 16, 24)\n        mov r5.x, r15.w\n        and r5.xyzw, r5.xyzw, l(255, 255, 255, 255)\n        utof r5.xyzw, r5.xyzw\n        mul r17.xyzw, r5.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        ushr r15.yzw, r15.xxxx, l(0, 8, 16, 24)\n        and r5.xyzw, r15.xyzw, l(255, 255, 255, 255)\n        utof r5.xyzw, r5.xyzw\n        mul r15.xyzw, r5.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        break \n        case l(2)\n        case l(10)\n        ushr r5.yzw, r15.yyyy, l(0, 10, 20, 30)\n        mov r5.x, r15.y\n        and r5.xyzw, r5.xyzw, l(1023, 1023, 1023, 3)\n        utof r5.xyzw, r5.xyzw\n        mul r16.xyzw, r5.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        ushr r5.yzw, r15.zzzz, l(0, 10, 20, 30)\n        mov r5.x, r15.z\n        and r5.xyzw, r5.xyzw, l(1023, 1023, 1023, 3)\n        utof r5.xyzw, r5.xyzw\n        mul r14.xyzw, r5.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        ushr r5.yzw, r15.wwww, l(0, 10, 20, 30)\n        mov r5.x, r15.w\n        and r5.xyzw, r5.xyzw, l(1023, 1023, 1023, 3)\n        utof r5.xyzw, r5.xyzw\n        mul r17.xyzw, r5.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        ushr r15.yzw, r15.xxxx, l(0, 10, 20, 30)\n        and r5.xyzw, r15.xyzw, l(1023, 1023, 1023, 3)\n        utof r5.xyzw, r5.xyzw\n        mul r15.xyzw, r5.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        break \n        case l(3)\n        case l(12)\n        ushr r5.xyzw, r15.yyyz, l(10, 20, 30, 30)\n        mov r18.x, r15.y\n        mov r18.yz, r5.xxyx\n        and r19.xyz, r18.xyzx, l(1023, 1023, 1023, 0)\n        and r20.xyz, r18.xyzx, l(127, 127, 127, 0)\n        ubfe r21.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r18.xyzx\n        firstbit_hi r22.xyz, r20.xyzx\n        iadd r22.xyz, r22.xyzx, l(-24, -24, -24, 0)\n        movc r22.xyz, r20.xyzx, r22.xyzx, l(8,8,8,0)\n        iadd r23.xyz, -r22.xyzx, l(1, 1, 1, 0)\n        movc r23.xyz, r21.xyzx, r21.xyzx, r23.xyzx\n        bfi r18.xyz, l(7, 7, 7, 0), r22.xyzx, r18.xyzx, l(0, 0, 0, 0)\n        and r18.xyz, r18.xyzx, l(127, 127, 127, 0)\n        movc r18.xyz, r21.xyzx, r20.xyzx, r18.xyzx\n        ishl r20.xyz, r23.xyzx, l(23, 23, 23, 0)\n        iadd r20.xyz, r20.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r18.xyz, r18.xyzx, l(16, 16, 16, 0)\n        iadd r18.xyz, r20.xyzx, r18.xyzx\n        movc r16.xyz, r19.xyzx, r18.xyzx, l(0,0,0,0)\n        utof r1.yz, r5.zzwz\n        ushr r5.xyzw, r15.zwwz, l(10, 10, 20, 20)\n        mov r18.x, r15.z\n        mov r18.yz, r5.xxwx\n        and r19.xyz, r18.xyzx, l(1023, 1023, 1023, 0)\n        and r20.xyz, r18.xyzx, l(127, 127, 127, 0)\n        ubfe r21.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r18.xyzx\n        firstbit_hi r22.xyz, r20.xyzx\n        iadd r22.xyz, r22.xyzx, l(-24, -24, -24, 0)\n        movc r22.xyz, r20.xyzx, r22.xyzx, l(8,8,8,0)\n        iadd r23.xyz, -r22.xyzx, l(1, 1, 1, 0)\n        movc r23.xyz, r21.xyzx, r21.xyzx, r23.xyzx\n        bfi r18.xyz, l(7, 7, 7, 0), r22.xyzx, r18.xyzx, l(0, 0, 0, 0)\n        and r18.xyz, r18.xyzx, l(127, 127, 127, 0)\n        movc r18.xyz, r21.xyzx, r20.xyzx, r18.xyzx\n        ishl r20.xyz, r23.xyzx, l(23, 23, 23, 0)\n        iadd r20.xyz, r20.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r18.xyz, r18.xyzx, l(16, 16, 16, 0)\n        iadd r18.xyz, r20.xyzx, r18.xyzx\n        movc r14.xyz, r19.xyzx, r18.xyzx, l(0,0,0,0)\n        mul r1.yz, r1.yyzy, l(0.000000, 0.333333, 0.333333, 0.000000)\n        mov r5.x, r15.w\n        and r18.xyz, r5.xyzx, l(1023, 1023, 1023, 0)\n        and r19.xyz, r5.xyzx, l(127, 127, 127, 0)\n        ubfe r20.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r5.xyzx\n        firstbit_hi r21.xyz, r19.xyzx\n        iadd r21.xyz, r21.xyzx, l(-24, -24, -24, 0)\n        movc r21.xyz, r19.xyzx, r21.xyzx, l(8,8,8,0)\n        iadd r22.xyz, -r21.xyzx, l(1, 1, 1, 0)\n        movc r22.xyz, r20.xyzx, r20.xyzx, r22.xyzx\n        bfi r5.xyz, l(7, 7, 7, 0), r21.xyzx, r5.xyzx, l(0, 0, 0, 0)\n        and r5.xyz, r5.xyzx, l(127, 127, 127, 0)\n        movc r5.xyz, r20.xyzx, r19.xyzx, r5.xyzx\n        ishl r19.xyz, r22.xyzx, l(23, 23, 23, 0)\n        iadd r19.xyz, r19.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r5.xyz, r5.xyzx, l(16, 16, 16, 0)\n        iadd r5.xyz, r19.xyzx, r5.xyzx\n        movc r17.xyz, r18.xyzx, r5.xyzx, l(0,0,0,0)\n        ushr r5.xyzw, r15.wxxx, l(30, 10, 20, 30)\n        utof r18.xy, r5.xwxx\n        mov r5.x, r15.x\n        and r19.xyz, r5.xyzx, l(1023, 1023, 1023, 0)\n        and r20.xyz, r5.xyzx, l(127, 127, 127, 0)\n        ubfe r21.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r5.xyzx\n        firstbit_hi r22.xyz, r20.xyzx\n        iadd r22.xyz, r22.xyzx, l(-24, -24, -24, 0)\n        movc r22.xyz, r20.xyzx, r22.xyzx, l(8,8,8,0)\n        iadd r23.xyz, -r22.xyzx, l(1, 1, 1, 0)\n        movc r23.xyz, r21.xyzx, r21.xyzx, r23.xyzx\n        bfi r5.xyz, l(7, 7, 7, 0), r22.xyzx, r5.xyzx, l(0, 0, 0, 0)\n        and r5.xyz, r5.xyzx, l(127, 127, 127, 0)\n        movc r5.xyz, r21.xyzx, r20.xyzx, r5.xyzx\n        ishl r20.xyz, r23.xyzx, l(23, 23, 23, 0)\n        iadd r20.xyz, r20.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r5.xyz, r5.xyzx, l(16, 16, 16, 0)\n        iadd r5.xyz, r20.xyzx, r5.xyzx\n        movc r15.xyz, r19.xyzx, r5.xyzx, l(0,0,0,0)\n        mul r5.xy, r18.xyxx, l(0.333333, 0.333333, 0.000000, 0.000000)\n        mov r16.w, r1.y\n        mov r14.w, r1.z\n        mov r17.w, r5.x\n        mov r15.w, r5.y\n        break \n        case l(4)\n        ishl r5.xyzw, r15.yzwx, l(16, 16, 16, 16)\n        mov r18.xz, r5.xxyx\n        mov r18.yw, r15.yyyz\n        ishr r18.xyzw, r18.xyzw, l(16, 16, 16, 16)\n        itof r18.xyzw, r18.xyzw\n        mul r18.xyzw, r18.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r16.xy, r18.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        max r14.xy, r18.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        mov r15.yz, r5.zzwz\n        ishr r5.xyzw, r15.ywzx, l(16, 16, 16, 16)\n        itof r5.xyzw, r5.xyzw\n        mul r5.xyzw, r5.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r17.xy, r5.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        max r15.xy, r5.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        mov r16.zw, l(0,0,0,0)\n        mov r14.zw, l(0,0,0,0)\n        mov r17.zw, l(0,0,0,0)\n        mov r15.zw, l(0,0,0,0)\n        break \n        case l(6)\n        ushr r5.xyzw, r15.yzwx, l(16, 16, 16, 16)\n        f16tof32 r16.x, r15.y\n        f16tof32 r16.y, r5.x\n        f16tof32 r14.x, r15.z\n        f16tof32 r14.y, r5.y\n        f16tof32 r17.x, r15.w\n        f16tof32 r17.y, r5.z\n        f16tof32 r15.x, r15.x\n        f16tof32 r15.y, r5.w\n        mov r16.zw, l(0,0,0,0)\n        mov r14.zw, l(0,0,0,0)\n        mov r17.zw, l(0,0,0,0)\n        mov r15.zw, l(0,0,0,0)\n        break \n        default \n        mov r16.x, r15.y\n        mov r16.yzw, l(0,0,0,0)\n        mov r14.x, r15.z\n        mov r14.yzw, l(0,0,0,0)\n        mov r17.x, r15.w\n        mov r17.yzw, l(0,0,0,0)\n        mov r15.yzw, l(0,0,0,0)\n        break \n      endswitch \n    endif \n    add r8.xyzw, r12.xyzw, r16.xyzw\n    add r6.xyzw, r10.xyzw, r14.xyzw\n    add r9.xyzw, r13.xyzw, r17.xyzw\n    add r7.xyzw, r11.xyzw, r15.xyzw\n  else \n    mov r1.w, r2.w\n  endif \nendif \nmul r5.xyzw, r1.wwww, r8.xyzw\nmul r6.xyzw, r1.wwww, r6.xzwy\nmul r8.xyzw, r1.wwww, r9.xyzw\nmul r7.xyzw, r1.wwww, r7.xzwy\nif_nz r0.w\n  mov r5.xz, r5.zzxz\n  mov r9.xz, r6.yyxy\n  mov r8.xz, r8.zzxz\n  mov r10.xz, r7.yyxy\nelse \n  mov r9.xz, r6.xxyx\n  mov r10.xz, r7.xxyx\nendif \nswitch r2.x\n  case l(26)\n  mov_sat r5.xyzw, r5.xyzw\n  mad r11.xyzw, r5.xyzw, l(65535.000000, 65535.000000, 65535.000000, 65535.000000), l(0.500000, 0.500000, 0.500000, 0.500000)\n  ftou r11.xyzw, r11.xyzw\n  imad r6.xy, r11.ywyy, l(0x00010000, 0x00010000, 0, 0), r11.xzxx\n  mov r9.yw, r6.wwwz\n  mov_sat r9.xyzw, r9.xyzw\n  mad r11.xyzw, r9.xyzw, l(65535.000000, 65535.000000, 65535.000000, 65535.000000), l(0.500000, 0.500000, 0.500000, 0.500000)\n  ftou r11.xyzw, r11.xyzw\n  imad r6.zw, r11.yyyw, l(0, 0, 0x00010000, 0x00010000), r11.xxxz\n  mov_sat r8.xyzw, r8.xyzw\n  mad r11.xyzw, r8.xyzw, l(65535.000000, 65535.000000, 65535.000000, 65535.000000), l(0.500000, 0.500000, 0.500000, 0.500000)\n  ftou r11.xyzw, r11.xyzw\n  imad r7.xy, r11.ywyy, l(0x00010000, 0x00010000, 0, 0), r11.xzxx\n  mov r10.yw, r7.wwwz\n  mov_sat r10.xyzw, r10.xyzw\n  mad r11.xyzw, r10.xyzw, l(65535.000000, 65535.000000, 65535.000000, 65535.000000), l(0.500000, 0.500000, 0.500000, 0.500000)\n  ftou r11.xyzw, r11.xyzw\n  imad r7.zw, r11.yyyw, l(0, 0, 0x00010000, 0x00010000), r11.xxxz\n  break \n  case l(32)\n  f32tof16 r0.yw, r5.xxxz\n  f32tof16 r1.yz, r5.yywy\n  imad r6.xy, r1.yzyy, l(0x00010000, 0x00010000, 0, 0), r0.ywyy\n  f32tof16 r0.yw, r9.xxxz\n  f32tof16 r1.yz, r6.wwzw\n  imad r6.zw, r1.yyyz, l(0, 0, 0x00010000, 0x00010000), r0.yyyw\n  f32tof16 r0.yw, r8.xxxz\n  f32tof16 r1.yz, r8.yywy\n  imad r7.xy, r1.yzyy, l(0x00010000, 0x00010000, 0, 0), r0.ywyy\n  f32tof16 r0.yw, r10.xxxz\n  f32tof16 r1.yz, r7.wwzw\n  imad r7.zw, r1.yyyz, l(0, 0, 0x00010000, 0x00010000), r0.yyyw\n  break \n  default \n  mov r6.xy, r5.xyxx\n  mov r6.z, r9.x\n  mov r7.xy, r8.xyxx\n  mov r7.z, r10.x\n  break \nendswitch \niadd r3.xyzw, r3.xyzw, r4.xyzw\nif_nz r0.z\n  ubfe r0.y, l(3), l(4), CB0[0][0].z\n  bfi r0.z, l(10), l(1), r2.z, l(0)\n  ishr r0.w, r0.y, l(2)\n  ishr r2.xyzw, r3.wyww, l(4, 5, 1, 3)\n  imad r0.z, r0.w, r0.z, r2.x\n  imad r0.z, r0.z, r1.x, r2.y\n  bfi r0.y, l(2), l(5), r0.y, l(0)\n  bfi r1.y, l(2), l(3), r2.z, l(0)\n  iadd r0.y, r0.y, r1.y\n  bfi r0.y, l(3), l(0), r3.y, r0.y\n  bfi r0.y, l(25), l(7), r0.z, r0.y\n  xor r0.z, r0.w, r2.w\n  ubfe r0.w, l(2), l(3), r3.y\n  bfi r1.yz, l(0, 1, 1, 0), l(0, 1, 11, 0), r0.zzzz, l(0, 0, 0, 0)\n  xor r0.z, r0.w, r1.y\n  bfi r0.w, l(1), l(4), r3.w, l(0)\n  imad r0.z, r0.z, l(64), r0.w\n  iadd r0.z, r1.z, r0.z\n  ibfe r0.yw, l(0, 27, 0, 24), l(0, 2, 0, 5), r0.yyyy\n  bfi r0.y, l(3), l(8), r0.y, r0.z\n  bfi r0.y, l(20), l(12), r0.w, r0.y\nelse \n  ishr r2.xyzw, r3.xyzw, l(5, 5, 1, 4)\n  imad r0.z, r2.x, r1.x, r2.y\n  bfi r1.xy, l(3, 1, 0, 0), l(3, 11, 0, 0), r2.zwzz, l(0, 0, 0, 0)\n  bfi r0.w, l(3), l(0), r3.y, r1.x\n  imad r0.z, r0.z, l(64), r0.w\n  ubfe r0.w, l(2), l(3), r3.y\n  ishr r1.x, r3.w, l(3)\n  bfi r1.x, l(1), l(1), r1.x, l(0)\n  xor r0.w, r0.w, r1.x\n  bfi r1.x, l(1), l(4), r3.w, l(0)\n  imad r0.w, r0.w, l(64), r1.x\n  iadd r0.w, r1.y, r0.w\n  ibfe r1.xy, l(27, 24, 0, 0), l(2, 5, 0, 0), r0.zzzz\n  bfi r0.z, l(3), l(8), r1.x, r0.w\n  bfi r0.y, l(20), l(12), r1.y, r0.z\nendif \niadd r0.y, r0.y, CB0[0][1].x\nieq r0.z, r0.x, l(4)\nif_nz r0.z\n  mov r6.xyzw, r6.yxwz\n  mov r0.w, l(2)\nelse \n  mov r0.w, r0.x\nendif \nieq r1.xyz, r0.wwww, l(1, 2, 3, 0)\nor r1.xy, r1.yzyy, r1.xyxx\nif_nz r1.x\n  ishl r2.xyzw, r6.xyzw, l(8, 8, 8, 8)\n  and r2.xyzw, r2.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r3.xyzw, r6.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r6.xyzw, r2.xyzw, r3.xyzw\nendif \nif_nz r1.y\n  ushr r1.xyzw, r6.xyzw, l(16, 16, 16, 16)\n  bfi r6.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r6.xyzw, r1.xyzw\nendif \nstore_raw U0[0].xyzw, r0.y, r6.xyzw\niadd r0.y, r0.y, l(32)\nif_nz r0.z\n  mov r7.xyzw, r7.yxwz\n  mov r0.x, l(2)\nendif \nieq r0.xzw, r0.xxxx, l(1, 0, 2, 3)\nor r0.xz, r0.zzwz, r0.xxzx\nif_nz r0.x\n  ishl r1.xyzw, r7.xyzw, l(8, 8, 8, 8)\n  and r1.xyzw, r1.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r2.xyzw, r7.xyzw, l(8, 8, 8, 8)\n  and r2.xyzw, r2.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r7.xyzw, r1.xyzw, r2.xyzw\nendif \nif_nz r0.z\n  ushr r1.xyzw, r7.xyzw, l(16, 16, 16, 16)\n  bfi r7.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r7.xyzw, r1.xyzw\nendif \nstore_raw U0[0].xyzw, r0.y, r7.xyzw\nret \n// Approximately 1207 instruction slots used\n#endif\n\nconst BYTE resolve_full_64bpp_cs[] =\n{\n     68,  88,  66,  67, 127,  68, \n    237,  70, 133, 137,  45,  58, \n    203, 204,  11,  32, 252,  91, \n    167,  68,   1,   0,   0,   0, \n    164, 145,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n    208,   2,   0,   0, 224,   2, \n      0,   0, 240,   2,   0,   0, \n      8, 145,   0,   0,  82,  68, \n     69,  70, 148,   2,   0,   0, \n      1,   0,   0,   0, 228,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    105,   2,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 197,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 213,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 114, 101, 115, \n    111, 108, 118, 101,  95, 101, \n    100, 114,  97, 109,   0, 120, \n    101,  95, 114, 101, 115, 111, \n    108, 118, 101,  95, 100, 101, \n    115, 116,   0, 112, 117, 115, \n    104,  95,  99, 111, 110, 115, \n    116, 115,  95, 120, 101,   0, \n    213,   0,   0,   0,   5,   0, \n      0,   0, 252,   0,   0,   0, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    196,   1,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 224,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,   4,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 224,   1,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  31,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    224,   1,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     52,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 224,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  84,   2, \n      0,   0,  16,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 224,   1,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 114, \n    101, 115, 111, 108, 118, 101, \n     95, 101, 100, 114,  97, 109, \n     95, 105, 110, 102, 111,   0, \n    100, 119, 111, 114, 100,   0, \n      0,   0,  19,   0,   1,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 218,   1,   0,   0, \n    120, 101,  95, 114, 101, 115, \n    111, 108, 118, 101,  95,  99, \n    111, 111, 114, 100, 105, 110, \n     97, 116, 101,  95, 105, 110, \n    102, 111,   0, 120, 101,  95, \n    114, 101, 115, 111, 108, 118, \n    101,  95, 100, 101, 115, 116, \n     95, 105, 110, 102, 111,   0, \n    120, 101,  95, 114, 101, 115, \n    111, 108, 118, 101,  95, 100, \n    101, 115, 116,  95,  99, 111, \n    111, 114, 100, 105, 110,  97, \n    116, 101,  95, 105, 110, 102, \n    111,   0, 120, 101,  95, 114, \n    101, 115, 111, 108, 118, 101, \n     95, 100, 101, 115, 116,  95, \n     98,  97, 115, 101,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n     16, 142,   0,   0,  81,   0, \n      5,   0, 132,  35,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n     50,   0,   2,   0, 104,   0, \n      0,   2,  24,   0,   0,   0, \n    155,   0,   0,   4,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  12, 242,   0,  16,   0, \n      0,   0,   0,   0,  38, 138, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0, 255,   3, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   1,   1,   0, \n      0,   9,  18,   0,  16,   0, \n      1,   0,   0,   0,  58, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n    255,   3,   0,   0,  85,   0, \n      0,  12, 114,   0,  16,   0, \n      2,   0,   0,   0,  86, 135, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,   5,   0, \n      0,   0,  10,   0,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  12, 242,   0,  16,   0, \n      3,   0,   0,   0, 246, 143, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n     24,   0,   0,   0,  20,   0, \n      0,   0,  24,   0,   0,   0, \n     24,   0,   0,   0,  41,   0, \n      0,   6,  34,   0,  16,   0, \n      4,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  11,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     80,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      1,   0,   0,   0,  62,   0, \n      0,   1,  21,   0,   0,   1, \n    138,   0,   0,  17, 242,   0, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,  11,   0,   0,   0, \n      4,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  13,   0, \n      0,   0,  24,   0,   0,   0, \n     28,   0,   0,   0,   6, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   7, \n    130,   0,  16,   0,   2,   0, \n      0,   0,  26, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  20,  98,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0, 246,  12, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 139,   0,   0,  11, \n    130,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n     42, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  23,   0, \n      0,   0,  30,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   0,   0, 128,  63, \n    140,   0,   0,  20, 242,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   4,   0, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  17, \n     50,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      6,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n     28,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    230, 138,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   4, 210,   0,  16,   0, \n      4,   0,   0,   0,  86,   5, \n      2,   0,  30,   0,   0,   7, \n     98,   0,  16,   0,   1,   0, \n      0,   0,  86,   6,  16,   0, \n      1,   0,   0,   0,  86,   7, \n     16,   0,   4,   0,   0,   0, \n     80,   0,   0,   7, 130,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  31,   0, \n      4,   3,  58,   0,  16,   0, \n      2,   0,   0,   0,  54,   0, \n      0,   5,  34,   0,  16,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     18,   0,   0,   1,  32,   0, \n      0,   7, 130,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  31,   0,   4,   3, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  54,   0,   0,   5, \n     34,   0,  16,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  18,   0, \n      0,   1,  54,   0,   0,   5, \n     34,   0,  16,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  21,   0,   0,   1, \n     80,   0,   0,  10, 194,   0, \n     16,   0,   6,   0,   0,   0, \n      6,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  10, 194,   0,  16,   0, \n      6,   0,   0,   0, 166,  14, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  41,   0,   0,   7, \n     98,   0,  16,   0,   1,   0, \n      0,   0,  86,   6,  16,   0, \n      1,   0,   0,   0, 166,  11, \n     16,   0,   6,   0,   0,   0, \n     85,   0,   0,   7,  18,   0, \n     16,   0,   6,   0,   0,   0, \n     26,   0,  16,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  10,  50,   0,  16,   0, \n      6,   0,   0,   0,  70,   0, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     98,   0,  16,   0,   1,   0, \n      0,   0,  86,   6,  16,   0, \n      1,   0,   0,   0,   6,   1, \n     16,   0,   6,   0,   0,   0, \n     85,   0,   0,   7,  18,   0, \n     16,   0,   6,   0,   0,   0, \n      1,  64,   0,   0,  80,   0, \n      0,   0,  58,   0,  16,   0, \n      5,   0,   0,   0,  54,   0, \n      0,   5,  34,   0,  16,   0, \n      6,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n     78,   0,   0,   8,  50,   0, \n     16,   0,   7,   0,   0,   0, \n      0, 208,   0,   0, 150,   5, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   6,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      7,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   7,   0, \n      0,   0,  30,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   5,   0,   0,   0, \n     35,   0,   0,  10,  98,   0, \n     16,   0,   1,   0,   0,   0, \n      6,   1,  16, 128,  65,   0, \n      0,   0,   7,   0,   0,   0, \n      6,   1,  16,   0,   6,   0, \n      0,   0,  86,   6,  16,   0, \n      1,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   6,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  41,   0, \n      0,   7,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   5,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   5,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  78,   0,   0,   8, \n      0, 208,   0,   0,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,  40,   0,  41,   0, \n      0,   7,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,  30,   0,   0,   7, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      5,   0,   0,   0,  42,   0, \n     16,   0,   6,   0,   0,   0, \n     41,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  31,   0, \n      4,   3,  58,   0,  16,   0, \n      5,   0,   0,   0,  32,   0, \n      0,   7, 130,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   8,   0, \n      0,   0,  31,   0,   4,   3, \n     58,   0,  16,   0,   2,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0, 230, 116, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 130,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0, 230, 116, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  50,   0,  16,   0, \n      8,   0,   0,   0, 230,  10, \n     16,   0,   6,   0,   0,   0, \n     54,   0,   0,   5,  50,   0, \n     16,   0,   9,   0,   0,   0, \n    230,  10,  16,   0,   7,   0, \n      0,   0,  18,   0,   0,   1, \n    165,   0,   0,   8,  50,   0, \n     16,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  70, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    130,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    165,   0,   0,   8,  50,   0, \n     16,   0,   6,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  70, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n     50,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,   5,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      5,   0,   0,   0, 165,   0, \n      0,   8,  50,   0,  16,   0, \n      9,   0,   0,   0,  10,   0, \n     16,   0,   5,   0,   0,   0, \n     70, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    165,   0,   0,   8,  50,   0, \n     16,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0,  70, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     76,   0,   0,   3,  42,   0, \n     16,   0,   5,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   5,   0,   0,   0, \n     41,   0,   0,  10, 194,   0, \n     16,   0,   8,   0,   0,   0, \n      6,   4,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  38,   7, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n     41,   0,   0,  10, 194,   0, \n     16,   0,   6,   0,   0,   0, \n      6,   4,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  38,   7, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n     41,   0,   0,  10, 194,   0, \n     16,   0,   9,   0,   0,   0, \n      6,   4,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  38,   7, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n     41,   0,   0,  10, 194,   0, \n     16,   0,   7,   0,   0,   0, \n      6,   4,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  38,   7, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      7,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      5,   0,   0,   0,  70,   0, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 131,   0,   0,   5, \n     82,   0,  16,   0,   8,   0, \n      0,   0,   6,   1,  16,   0, \n      8,   0,   0,   0, 131,   0, \n      0,   5, 162,   0,  16,   0, \n      8,   0,   0,   0,   6,   4, \n     16,   0,   5,   0,   0,   0, \n     85,   0,   0,  10,  50,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   0,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 131,   0, \n      0,   5,  82,   0,  16,   0, \n      6,   0,   0,   0,   6,   1, \n     16,   0,   6,   0,   0,   0, \n    131,   0,   0,   5, 162,   0, \n     16,   0,   6,   0,   0,   0, \n      6,   4,  16,   0,   5,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   5,   0, \n      0,   0,  70,   0,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    131,   0,   0,   5,  82,   0, \n     16,   0,   9,   0,   0,   0, \n      6,   1,  16,   0,   9,   0, \n      0,   0, 131,   0,   0,   5, \n    162,   0,  16,   0,   9,   0, \n      0,   0,   6,   4,  16,   0, \n      5,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      5,   0,   0,   0,  70,   0, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 131,   0,   0,   5, \n     82,   0,  16,   0,   7,   0, \n      0,   0,   6,   1,  16,   0, \n      7,   0,   0,   0, 131,   0, \n      0,   5, 162,   0,  16,   0, \n      7,   0,   0,   0,   6,   4, \n     16,   0,   5,   0,   0,   0, \n      2,   0,   0,   1,  10,   0, \n      0,   1,  54,   0,   0,   8, \n    194,   0,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   1,  23,   0,   0,   1, \n     18,   0,   0,   1,  32,   0, \n      0,   7, 130,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  31,   0,   4,   3, \n     58,   0,  16,   0,   2,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  54, 121, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  18,   0, \n      0,   1, 165,   0,   0,   8, \n     34,   0,  16,   0,   7,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 130,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0, 165,   0,   0,   8, \n     66,   0,  16,   0,   7,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10,  50,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n     12,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   5,   0, \n      0,   0,  86,   5,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   5,   0,   0,   0, \n    165,   0,   0,   8, 130,   0, \n     16,   0,   7,   0,   0,   0, \n     10,   0,  16,   0,   5,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n     18,   0,  16,   0,   7,   0, \n      0,   0,  26,   0,  16,   0, \n      5,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  76,   0,   0,   3, \n     42,   0,  16,   0,   5,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,   0,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,  10,   0, \n      0,   0,  86,   5,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  10,   0,   0,   0, \n     26,   0,  16,   0,   7,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  10,   0,   0,   0, \n    166,  10,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  16,   0,   0,   0, \n     24,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     10,   0,   0,   0,  42,   0, \n     16,   0,   7,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     10,   0,   0,   0, 246,  15, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     16,   0,   0,   0,  24,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  10,   0, \n      0,   0,  58,   0,  16,   0, \n      7,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59,  85,   0,   0,  10, \n    226,   0,  16,   0,   7,   0, \n      0,   0,   6,   0,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,  10,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,  10,   0, \n      0,   0,  86,   5,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  10,   0,   0,   0, \n     26,   0,  16,   0,   7,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   3,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   8,  32, 128,  58, \n      8,  32, 128,  58,   8,  32, \n    128,  58, 171, 170, 170,  62, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  10,   0,   0,   0, \n    166,  10,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     30,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     10,   0,   0,   0,  42,   0, \n     16,   0,   7,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      3,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      8,  32, 128,  58,   8,  32, \n    128,  58,   8,  32, 128,  58, \n    171, 170, 170,  62,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     10,   0,   0,   0, 246,  15, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  10,   0, \n      0,   0,  58,   0,  16,   0, \n      7,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   3,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   8,  32, \n    128,  58,   8,  32, 128,  58, \n      8,  32, 128,  58, 171, 170, \n    170,  62,  85,   0,   0,  10, \n    226,   0,  16,   0,   7,   0, \n      0,   0,   6,   0,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      3,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      8,  32, 128,  58,   8,  32, \n    128,  58,   8,  32, 128,  58, \n    171, 170, 170,  62,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  86,   9,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,  30,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  11,   0,   0,   0, \n     26,   0,  16,   0,   7,   0, \n      0,   0,  54,   0,   0,   5, \n     98,   0,  16,   0,  11,   0, \n      0,   0,   6,   1,  16,   0, \n     10,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n    138,   0,   0,  15, 114,   0, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n    135,   0,   0,   5, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 232, 255, 255, 255, \n    232, 255, 255, 255, 232, 255, \n    255, 255,   0,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  11, 114,   0, \n     16,   0,  16,   0,   0,   0, \n     70,   2,  16, 128,  65,   0, \n      0,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16,   0,  14,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0, 140,   0,   0,  17, \n    114,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  11,   0, \n      0,   0,  70,   2,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    114,   0,  16,   0,  11,   0, \n      0,   0,  70,   2,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,   8,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     86,   0,   0,   5,  50,   0, \n     16,   0,   5,   0,   0,   0, \n    230,  10,  16,   0,  10,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0, 230,  11,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  11,   0,   0,   0, \n     42,   0,  16,   0,   7,   0, \n      0,   0,  54,   0,   0,   5, \n     98,   0,  16,   0,  11,   0, \n      0,   0,   6,   3,  16,   0, \n     10,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n    138,   0,   0,  15, 114,   0, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n    135,   0,   0,   5, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 232, 255, 255, 255, \n    232, 255, 255, 255, 232, 255, \n    255, 255,   0,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  11, 114,   0, \n     16,   0,  16,   0,   0,   0, \n     70,   2,  16, 128,  65,   0, \n      0,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16,   0,  14,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0, 140,   0,   0,  17, \n    114,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  11,   0, \n      0,   0,  70,   2,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    114,   0,  16,   0,  11,   0, \n      0,   0,  70,   2,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,   6,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     56,   0,   0,  10,  50,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n    171, 170, 170,  62, 171, 170, \n    170,  62,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     10,   0,   0,   0,  58,   0, \n     16,   0,   7,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  11,   0,   0,   0, \n     70,   2,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  10,   0, \n      0,   0, 135,   0,   0,   5, \n    114,   0,  16,   0,  14,   0, \n      0,   0,  70,   2,  16,   0, \n     12,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255,   0,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  14,   0, \n      0,   0,  70,   2,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  11, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16, 128, \n     65,   0,   0,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0, 140,   0, \n      0,  17, 114,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  14,   0, \n      0,   0,  70,   2,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  10,   0,   0,   0, \n     70,   2,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     10,   0,   0,   0,  70,   2, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,  70,   2,  16,   0, \n     10,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  12,   0, \n      0,   0,  70,   2,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  10,   0,   0,   0, \n     70,   2,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 114,   0,  16,   0, \n     10,   0,   0,   0,  70,   2, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  10,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,   9,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  54,   0,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,  30,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n     86,   0,   0,   5,  50,   0, \n     16,   0,  11,   0,   0,   0, \n    198,   0,  16,   0,  10,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  10,   0, \n      0,   0,  10,   0,  16,   0, \n      7,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n    138,   0,   0,  15, 114,   0, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  10,   0,   0,   0, \n    135,   0,   0,   5, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 232, 255, 255, 255, \n    232, 255, 255, 255, 232, 255, \n    255, 255,   0,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  11, 114,   0, \n     16,   0,  16,   0,   0,   0, \n     70,   2,  16, 128,  65,   0, \n      0,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16,   0,  14,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0, 140,   0,   0,  17, \n    114,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     10,   0,   0,   0,  70,   2, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  10,   0, \n      0,   0,  70,   2,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  10,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     10,   0,   0,   0,  70,   2, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    114,   0,  16,   0,  10,   0, \n      0,   0,  70,   2,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,  10,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,   7,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,  70,   2,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     56,   0,   0,  10,  50,   0, \n     16,   0,  10,   0,   0,   0, \n     70,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n    171, 170, 170,  62, 171, 170, \n    170,  62,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5, 130,   0,  16,   0, \n      8,   0,   0,   0,  10,   0, \n     16,   0,   5,   0,   0,   0, \n     54,   0,   0,   5, 130,   0, \n     16,   0,   6,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0,  54,   0,   0,   5, \n    130,   0,  16,   0,   9,   0, \n      0,   0,  10,   0,  16,   0, \n     10,   0,   0,   0,  54,   0, \n      0,   5, 130,   0,  16,   0, \n      7,   0,   0,   0,  26,   0, \n     16,   0,  10,   0,   0,   0, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      4,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0, 150,   3, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  54,   0,   0,   5, \n     82,   0,  16,   0,  11,   0, \n      0,   0,   6,   1,  16,   0, \n     10,   0,   0,   0,  54,   0, \n      0,   5, 162,   0,  16,   0, \n     11,   0,   0,   0,  86,   9, \n     16,   0,   7,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10,  50,   0,  16,   0, \n      8,   0,   0,   0,  70,   0, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  52,   0,   0,  10, \n     50,   0,  16,   0,   6,   0, \n      0,   0, 230,  10,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  98,   0, \n     16,   0,   7,   0,   0,   0, \n    166,  11,  16,   0,  10,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0, 214,   2,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10,  50,   0, \n     16,   0,   9,   0,   0,   0, \n     70,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0,   0,   0, \n      0,   0,   0,   0,  52,   0, \n      0,  10,  50,   0,  16,   0, \n      7,   0,   0,   0, 230,  10, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0, 150,   3,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    131,   0,   0,   5,  18,   0, \n     16,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,   7,   0, \n      0,   0, 131,   0,   0,   5, \n     34,   0,  16,   0,   8,   0, \n      0,   0,  10,   0,  16,   0, \n     10,   0,   0,   0, 131,   0, \n      0,   5,  18,   0,  16,   0, \n      6,   0,   0,   0,  42,   0, \n     16,   0,   7,   0,   0,   0, \n    131,   0,   0,   5,  34,   0, \n     16,   0,   6,   0,   0,   0, \n     26,   0,  16,   0,  10,   0, \n      0,   0, 131,   0,   0,   5, \n     18,   0,  16,   0,   9,   0, \n      0,   0,  58,   0,  16,   0, \n      7,   0,   0,   0, 131,   0, \n      0,   5,  34,   0,  16,   0, \n      9,   0,   0,   0,  42,   0, \n     16,   0,  10,   0,   0,   0, \n    131,   0,   0,   5,  18,   0, \n     16,   0,   7,   0,   0,   0, \n     10,   0,  16,   0,   7,   0, \n      0,   0, 131,   0,   0,   5, \n     34,   0,  16,   0,   7,   0, \n      0,   0,  58,   0,  16,   0, \n     10,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,  10,   0, \n      0,   1,  54,   0,   0,   5, \n     18,   0,  16,   0,   8,   0, \n      0,   0,  26,   0,  16,   0, \n      7,   0,   0,   0,  54,   0, \n      0,   8, 226,   0,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   6,   0,   0,   0, \n     42,   0,  16,   0,   7,   0, \n      0,   0,  54,   0,   0,   8, \n    226,   0,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      9,   0,   0,   0,  58,   0, \n     16,   0,   7,   0,   0,   0, \n     54,   0,   0,   8, 226,   0, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    226,   0,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   1,  23,   0,   0,   1, \n     21,   0,   0,   1,  80,   0, \n      0,   7, 130,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  31,   0,   4,   3, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  56,   0,   0,   7, \n    130,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,  63, \n     30,   0,   0,   7,  18,   0, \n     16,   0,   5,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     64,   1,   0,   0,  31,   0, \n      4,   3,  58,   0,  16,   0, \n      5,   0,   0,   0,  32,   0, \n      0,   7,  34,   0,  16,   0, \n      5,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   8,   0, \n      0,   0,  31,   0,   4,   3, \n     26,   0,  16,   0,   5,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  10,   0,  16,   0, \n      5,   0,   0,   0, 230, 116, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  34,   0,  16,   0, \n      5,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  80,   1, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  26,   0,  16,   0, \n      5,   0,   0,   0, 230, 116, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  50,   0,  16,   0, \n     12,   0,   0,   0, 230,  10, \n     16,   0,  10,   0,   0,   0, \n     54,   0,   0,   5,  50,   0, \n     16,   0,  14,   0,   0,   0, \n    230,  10,  16,   0,  11,   0, \n      0,   0,  18,   0,   0,   1, \n    165,   0,   0,   8,  50,   0, \n     16,   0,  12,   0,   0,   0, \n     10,   0,  16,   0,   5,   0, \n      0,   0,  70, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     34,   0,  16,   0,   5,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   5,   0,   0,   0, \n    165,   0,   0,   8,  50,   0, \n     16,   0,  10,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0,  70, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n     50,   0,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,  13,   0,   0,   0, \n      6,   0,  16,   0,   5,   0, \n      0,   0,  70,   0,  16,   0, \n     13,   0,   0,   0, 165,   0, \n      0,   8,  50,   0,  16,   0, \n     14,   0,   0,   0,  10,   0, \n     16,   0,  13,   0,   0,   0, \n     70, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    165,   0,   0,   8,  50,   0, \n     16,   0,  11,   0,   0,   0, \n     26,   0,  16,   0,  13,   0, \n      0,   0,  70, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     76,   0,   0,   3,  42,   0, \n     16,   0,   5,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   5,   0,   0,   0, \n     41,   0,   0,  10, 194,   0, \n     16,   0,  12,   0,   0,   0, \n      6,   4,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  38,   7, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n     41,   0,   0,  10, 194,   0, \n     16,   0,  10,   0,   0,   0, \n      6,   4,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  38,   7, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n     41,   0,   0,  10, 194,   0, \n     16,   0,  14,   0,   0,   0, \n      6,   4,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  38,   7, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n    242,   0,  16,   0,  14,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n     41,   0,   0,  10, 194,   0, \n     16,   0,  11,   0,   0,   0, \n      6,   4,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  38,   7, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      7,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n     13,   0,   0,   0,  70,   0, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 131,   0,   0,   5, \n     82,   0,  16,   0,  12,   0, \n      0,   0,   6,   1,  16,   0, \n     12,   0,   0,   0, 131,   0, \n      0,   5, 162,   0,  16,   0, \n     12,   0,   0,   0,   6,   4, \n     16,   0,  13,   0,   0,   0, \n     85,   0,   0,  10,  50,   0, \n     16,   0,  13,   0,   0,   0, \n     70,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 131,   0, \n      0,   5,  82,   0,  16,   0, \n     10,   0,   0,   0,   6,   1, \n     16,   0,  10,   0,   0,   0, \n    131,   0,   0,   5, 162,   0, \n     16,   0,  10,   0,   0,   0, \n      6,   4,  16,   0,  13,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,  13,   0, \n      0,   0,  70,   0,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    131,   0,   0,   5,  82,   0, \n     16,   0,  14,   0,   0,   0, \n      6,   1,  16,   0,  14,   0, \n      0,   0, 131,   0,   0,   5, \n    162,   0,  16,   0,  14,   0, \n      0,   0,   6,   4,  16,   0, \n     13,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n     13,   0,   0,   0,  70,   0, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 131,   0,   0,   5, \n     82,   0,  16,   0,  11,   0, \n      0,   0,   6,   1,  16,   0, \n     11,   0,   0,   0, 131,   0, \n      0,   5, 162,   0,  16,   0, \n     11,   0,   0,   0,   6,   4, \n     16,   0,  13,   0,   0,   0, \n      2,   0,   0,   1,  10,   0, \n      0,   1,  54,   0,   0,   8, \n    194,   0,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   1,  23,   0,   0,   1, \n     18,   0,   0,   1,  32,   0, \n      0,   7,  34,   0,  16,   0, \n      5,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  31,   0,   4,   3, \n     26,   0,  16,   0,   5,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  10,   0,  16,   0, \n      5,   0,   0,   0,  54, 121, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  18,   0, \n      0,   1, 165,   0,   0,   8, \n     34,   0,  16,   0,  11,   0, \n      0,   0,  10,   0,  16,   0, \n      5,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  34,   0,  16,   0, \n      5,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   5,   0, \n      0,   0, 165,   0,   0,   8, \n     66,   0,  16,   0,  11,   0, \n      0,   0,  26,   0,  16,   0, \n      5,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10,  50,   0,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n     12,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,  13,   0, \n      0,   0,   6,   0,  16,   0, \n      5,   0,   0,   0,  70,   0, \n     16,   0,  13,   0,   0,   0, \n    165,   0,   0,   8, 130,   0, \n     16,   0,  11,   0,   0,   0, \n     10,   0,  16,   0,  13,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n     18,   0,  16,   0,  11,   0, \n      0,   0,  26,   0,  16,   0, \n     13,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  76,   0,   0,   3, \n     42,   0,  16,   0,   5,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,   0,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,  13,   0, \n      0,   0,  86,   5,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  13,   0,   0,   0, \n     26,   0,  16,   0,  11,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  13,   0,   0,   0, \n    166,  10,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  16,   0,   0,   0, \n     24,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     13,   0,   0,   0,  42,   0, \n     16,   0,  11,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     13,   0,   0,   0, 246,  15, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     16,   0,   0,   0,  24,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  13,   0, \n      0,   0,  58,   0,  16,   0, \n     11,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     14,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59,  85,   0,   0,  10, \n    226,   0,  16,   0,  11,   0, \n      0,   0,   6,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,  10,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,  13,   0, \n      0,   0,  86,   5,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  13,   0,   0,   0, \n     26,   0,  16,   0,  11,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   3,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   8,  32, 128,  58, \n      8,  32, 128,  58,   8,  32, \n    128,  58, 171, 170, 170,  62, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  13,   0,   0,   0, \n    166,  10,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     30,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     13,   0,   0,   0,  42,   0, \n     16,   0,  11,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      3,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      8,  32, 128,  58,   8,  32, \n    128,  58,   8,  32, 128,  58, \n    171, 170, 170,  62,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     13,   0,   0,   0, 246,  15, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  13,   0, \n      0,   0,  58,   0,  16,   0, \n     11,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   3,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     14,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   8,  32, \n    128,  58,   8,  32, 128,  58, \n      8,  32, 128,  58, 171, 170, \n    170,  62,  85,   0,   0,  10, \n    226,   0,  16,   0,  11,   0, \n      0,   0,   6,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      3,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      8,  32, 128,  58,   8,  32, \n    128,  58,   8,  32, 128,  58, \n    171, 170, 170,  62,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  86,   9,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,  30,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  15,   0,   0,   0, \n     26,   0,  16,   0,  11,   0, \n      0,   0,  54,   0,   0,   5, \n     98,   0,  16,   0,  15,   0, \n      0,   0,   6,   1,  16,   0, \n     13,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n    138,   0,   0,  15, 114,   0, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n    135,   0,   0,   5, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0, 232, 255, 255, 255, \n    232, 255, 255, 255, 232, 255, \n    255, 255,   0,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  11, 114,   0, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16, 128,  65,   0, \n      0,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0, 140,   0,   0,  17, \n    114,   0,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     86,   0,   0,   5,  50,   0, \n     16,   0,  13,   0,   0,   0, \n    230,  10,  16,   0,  13,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0, 230,  11,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  16,   0,   0,   0, \n     42,   0,  16,   0,  11,   0, \n      0,   0,  54,   0,   0,   5, \n     98,   0,  16,   0,  16,   0, \n      0,   0,   6,   3,  16,   0, \n     15,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n    138,   0,   0,  15, 114,   0, \n     16,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n    135,   0,   0,   5, 114,   0, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0, 232, 255, 255, 255, \n    232, 255, 255, 255, 232, 255, \n    255, 255,   0,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  11, 114,   0, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16, 128,  65,   0, \n      0,   0,  20,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  21,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  21,   0, \n      0,   0, 140,   0,   0,  17, \n    114,   0,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n     21,   0,   0,   0,   2,  64, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  10,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  15,   0,   0,   0, \n     58,   0,  16,   0,  11,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 114,   0,  16,   0, \n     18,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0, 135,   0, \n      0,   5, 114,   0,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n    232, 255, 255, 255, 232, 255, \n    255, 255, 232, 255, 255, 255, \n      0,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  11, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16, 128,  65,   0,   0,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  20,   0,   0,   0, \n    140,   0,   0,  17, 114,   0, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,   2,  64,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  54,   0, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,  30,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,  86,   0,   0,   5, \n    194,   0,  16,   0,  13,   0, \n      0,   0,   6,  12,  16,   0, \n     15,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     15,   0,   0,   0,  10,   0, \n     16,   0,  11,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  16,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0, 135,   0,   0,   5, \n    114,   0,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     17,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n      2,  64,   0,   0, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255,   0,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  11, \n    114,   0,  16,   0,  20,   0, \n      0,   0,  70,   2,  16, 128, \n     65,   0,   0,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0, 140,   0, \n      0,  17, 114,   0,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  20,   0,   0,   0, \n      2,  64,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     17,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  11,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0, 171, 170, 170,  62, \n    171, 170, 170,  62, 171, 170, \n    170,  62, 171, 170, 170,  62, \n     54,   0,   0,   5, 130,   0, \n     16,   0,  12,   0,   0,   0, \n     10,   0,  16,   0,  13,   0, \n      0,   0,  54,   0,   0,   5, \n    130,   0,  16,   0,  10,   0, \n      0,   0,  26,   0,  16,   0, \n     13,   0,   0,   0,  54,   0, \n      0,   5, 130,   0,  16,   0, \n     14,   0,   0,   0,  42,   0, \n     16,   0,  13,   0,   0,   0, \n     54,   0,   0,   5, 130,   0, \n     16,   0,  11,   0,   0,   0, \n     58,   0,  16,   0,  13,   0, \n      0,   0,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,  13,   0,   0,   0, \n    150,   3,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  54,   0, \n      0,   5,  82,   0,  16,   0, \n     15,   0,   0,   0,   6,   1, \n     16,   0,  13,   0,   0,   0, \n     54,   0,   0,   5, 162,   0, \n     16,   0,  15,   0,   0,   0, \n     86,   9,  16,   0,  11,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10,  50,   0, \n     16,   0,  12,   0,   0,   0, \n     70,   0,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0,   0,   0, \n      0,   0,   0,   0,  52,   0, \n      0,  10,  50,   0,  16,   0, \n     10,   0,   0,   0, 230,  10, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     98,   0,  16,   0,  11,   0, \n      0,   0, 166,  11,  16,   0, \n     13,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0, 214,   2, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n     50,   0,  16,   0,  14,   0, \n      0,   0,  70,   0,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     52,   0,   0,  10,  50,   0, \n     16,   0,  11,   0,   0,   0, \n    230,  10,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      6,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0, 150,   3, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 131,   0,   0,   5, \n     18,   0,  16,   0,  12,   0, \n      0,   0,  26,   0,  16,   0, \n     11,   0,   0,   0, 131,   0, \n      0,   5,  34,   0,  16,   0, \n     12,   0,   0,   0,  10,   0, \n     16,   0,  13,   0,   0,   0, \n    131,   0,   0,   5,  18,   0, \n     16,   0,  10,   0,   0,   0, \n     42,   0,  16,   0,  11,   0, \n      0,   0, 131,   0,   0,   5, \n     34,   0,  16,   0,  10,   0, \n      0,   0,  26,   0,  16,   0, \n     13,   0,   0,   0, 131,   0, \n      0,   5,  18,   0,  16,   0, \n     14,   0,   0,   0,  58,   0, \n     16,   0,  11,   0,   0,   0, \n    131,   0,   0,   5,  34,   0, \n     16,   0,  14,   0,   0,   0, \n     42,   0,  16,   0,  13,   0, \n      0,   0, 131,   0,   0,   5, \n     18,   0,  16,   0,  11,   0, \n      0,   0,  10,   0,  16,   0, \n     11,   0,   0,   0, 131,   0, \n      0,   5,  34,   0,  16,   0, \n     11,   0,   0,   0,  58,   0, \n     16,   0,  13,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   1, \n     10,   0,   0,   1,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     12,   0,   0,   0,  26,   0, \n     16,   0,  11,   0,   0,   0, \n     54,   0,   0,   8, 226,   0, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  10,   0, \n      0,   0,  42,   0,  16,   0, \n     11,   0,   0,   0,  54,   0, \n      0,   8, 226,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  14,   0,   0,   0, \n     58,   0,  16,   0,  11,   0, \n      0,   0,  54,   0,   0,   8, \n    226,   0,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 226,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,  23,   0, \n      0,   1,  21,   0,   0,   1, \n      0,   0,   0,   7, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,   0,   0, \n      0,   7, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   0,   0,   0,   7, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,  14,   0,   0,   0, \n      0,   0,   0,   7, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  80,   0, \n      0,   7,  34,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  31,   0,   4,   3, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  41,   0,   0,   7, \n     34,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  58,   0, \n     16,   0,   5,   0,   0,   0, \n     56,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0, 128,  62,  30,   0, \n      0,   7,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  31,   0,   4,   3, \n     58,   0,  16,   0,   5,   0, \n      0,   0,  32,   0,   0,   7, \n     34,   0,  16,   0,   5,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   5,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0, 230, 116,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     34,   0,  16,   0,   5,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0, 230, 116,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     50,   0,  16,   0,  12,   0, \n      0,   0, 230,  10,  16,   0, \n     10,   0,   0,   0,  54,   0, \n      0,   5,  50,   0,  16,   0, \n     14,   0,   0,   0, 230,  10, \n     16,   0,  11,   0,   0,   0, \n     18,   0,   0,   1, 165,   0, \n      0,   8,  50,   0,  16,   0, \n     12,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     70, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  34,   0, \n     16,   0,   5,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8,  50,   0,  16,   0, \n     10,   0,   0,   0,  26,   0, \n     16,   0,   5,   0,   0,   0, \n     70, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     41,   0,   0,  10,  50,   0, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,  12,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  86,   5,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  50,   0,  16,   0, \n     13,   0,   0,   0,  86,   5, \n     16,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,  13,   0, \n      0,   0, 165,   0,   0,   8, \n     50,   0,  16,   0,  14,   0, \n      0,   0,  10,   0,  16,   0, \n     13,   0,   0,   0,  70, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8,  50,   0,  16,   0, \n     11,   0,   0,   0,  26,   0, \n     16,   0,  13,   0,   0,   0, \n     70, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  76,   0, \n      0,   3,  42,   0,  16,   0, \n      5,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      5,   0,   0,   0,  41,   0, \n      0,  10, 194,   0,  16,   0, \n     12,   0,   0,   0,   6,   4, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  38,   7,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,  41,   0, \n      0,  10, 194,   0,  16,   0, \n     10,   0,   0,   0,   6,   4, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  38,   7,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,  41,   0, \n      0,  10, 194,   0,  16,   0, \n     14,   0,   0,   0,   6,   4, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  38,   7,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10, 242,   0, \n     16,   0,  14,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,  41,   0, \n      0,  10, 194,   0,  16,   0, \n     11,   0,   0,   0,   6,   4, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  38,   7,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,  13,   0, \n      0,   0,  70,   0,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    131,   0,   0,   5,  82,   0, \n     16,   0,  12,   0,   0,   0, \n      6,   1,  16,   0,  12,   0, \n      0,   0, 131,   0,   0,   5, \n    162,   0,  16,   0,  12,   0, \n      0,   0,   6,   4,  16,   0, \n     13,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n     13,   0,   0,   0,  70,   0, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 131,   0,   0,   5, \n     82,   0,  16,   0,  10,   0, \n      0,   0,   6,   1,  16,   0, \n     10,   0,   0,   0, 131,   0, \n      0,   5, 162,   0,  16,   0, \n     10,   0,   0,   0,   6,   4, \n     16,   0,  13,   0,   0,   0, \n     85,   0,   0,  10,  50,   0, \n     16,   0,  13,   0,   0,   0, \n     70,   0,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 131,   0, \n      0,   5,  82,   0,  16,   0, \n     14,   0,   0,   0,   6,   1, \n     16,   0,  14,   0,   0,   0, \n    131,   0,   0,   5, 162,   0, \n     16,   0,  14,   0,   0,   0, \n      6,   4,  16,   0,  13,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,  13,   0, \n      0,   0,  70,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    131,   0,   0,   5,  82,   0, \n     16,   0,  11,   0,   0,   0, \n      6,   1,  16,   0,  11,   0, \n      0,   0, 131,   0,   0,   5, \n    162,   0,  16,   0,  11,   0, \n      0,   0,   6,   4,  16,   0, \n     13,   0,   0,   0,   2,   0, \n      0,   1,  10,   0,   0,   1, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   1, \n     23,   0,   0,   1,  18,   0, \n      0,   1,  32,   0,   0,   7, \n     34,   0,  16,   0,   5,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   5,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  54, 121,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  18,   0,   0,   1, \n    165,   0,   0,   8,  34,   0, \n     16,   0,  11,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     34,   0,  16,   0,   5,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n    165,   0,   0,   8,  66,   0, \n     16,   0,  11,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n     50,   0,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,  13,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n     13,   0,   0,   0, 165,   0, \n      0,   8, 130,   0,  16,   0, \n     11,   0,   0,   0,  10,   0, \n     16,   0,  13,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    165,   0,   0,   8,  18,   0, \n     16,   0,  11,   0,   0,   0, \n     26,   0,  16,   0,  13,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     76,   0,   0,   3,  42,   0, \n     16,   0,   5,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   0,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  13,   0,   0,   0, \n     86,   5,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  16,   0,   0,   0, \n     24,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     13,   0,   0,   0,  26,   0, \n     16,   0,  11,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     13,   0,   0,   0, 166,  10, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     16,   0,   0,   0,  24,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  13,   0, \n      0,   0,  42,   0,  16,   0, \n     11,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59,  85,   0,   0,  10, \n    226,   0,  16,   0,  13,   0, \n      0,   0, 246,  15,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  13,   0,   0,   0, \n     58,   0,  16,   0,  11,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  14,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  11,   0,   0,   0, \n      6,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  16,   0,   0,   0, \n     24,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,  10,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  13,   0,   0,   0, \n     86,   5,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     30,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     13,   0,   0,   0,  26,   0, \n     16,   0,  11,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      3,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      8,  32, 128,  58,   8,  32, \n    128,  58,   8,  32, 128,  58, \n    171, 170, 170,  62,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     13,   0,   0,   0, 166,  10, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  13,   0, \n      0,   0,  42,   0,  16,   0, \n     11,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   3,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   8,  32, \n    128,  58,   8,  32, 128,  58, \n      8,  32, 128,  58, 171, 170, \n    170,  62,  85,   0,   0,  10, \n    226,   0,  16,   0,  13,   0, \n      0,   0, 246,  15,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  13,   0,   0,   0, \n     58,   0,  16,   0,  11,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   3,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  14,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   8,  32, 128,  58, \n      8,  32, 128,  58,   8,  32, \n    128,  58, 171, 170, 170,  62, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  11,   0,   0,   0, \n      6,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     30,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   3,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   8,  32, \n    128,  58,   8,  32, 128,  58, \n      8,  32, 128,  58, 171, 170, \n    170,  62,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     86,   9,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n     30,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     15,   0,   0,   0,  26,   0, \n     16,   0,  11,   0,   0,   0, \n     54,   0,   0,   5,  98,   0, \n     16,   0,  15,   0,   0,   0, \n      6,   1,  16,   0,  13,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 114,   0,  16,   0, \n     18,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0, 135,   0, \n      0,   5, 114,   0,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n    232, 255, 255, 255, 232, 255, \n    255, 255, 232, 255, 255, 255, \n      0,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  11, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16, 128,  65,   0,   0,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  20,   0,   0,   0, \n    140,   0,   0,  17, 114,   0, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,   2,  64,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   0, \n      0,   5,  50,   0,  16,   0, \n     13,   0,   0,   0, 230,  10, \n     16,   0,  13,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,  15,   0,   0,   0, \n    230,  11,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     16,   0,   0,   0,  42,   0, \n     16,   0,  11,   0,   0,   0, \n     54,   0,   0,   5,  98,   0, \n     16,   0,  16,   0,   0,   0, \n      6,   3,  16,   0,  15,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 114,   0,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0, 135,   0, \n      0,   5, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,   2,  64,   0,   0, \n    232, 255, 255, 255, 232, 255, \n    255, 255, 232, 255, 255, 255, \n      0,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  11, 114,   0,  16,   0, \n     21,   0,   0,   0,  70,   2, \n     16, 128,  65,   0,   0,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  21,   0,   0,   0, \n    140,   0,   0,  17, 114,   0, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  16,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  21,   0, \n      0,   0,   2,  64,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 114,   0, \n     16,   0,  16,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     10,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     15,   0,   0,   0,  58,   0, \n     16,   0,  11,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  16,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0, 135,   0,   0,   5, \n    114,   0,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     17,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n      2,  64,   0,   0, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255,   0,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  11, \n    114,   0,  16,   0,  20,   0, \n      0,   0,  70,   2,  16, 128, \n     65,   0,   0,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0, 140,   0, \n      0,  17, 114,   0,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  20,   0,   0,   0, \n      2,  64,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     17,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  14,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  54,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,  30,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n     86,   0,   0,   5, 194,   0, \n     16,   0,  13,   0,   0,   0, \n      6,  12,  16,   0,  15,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  15,   0, \n      0,   0,  10,   0,  16,   0, \n     11,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n    138,   0,   0,  15, 114,   0, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n    135,   0,   0,   5, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0, 232, 255, 255, 255, \n    232, 255, 255, 255, 232, 255, \n    255, 255,   0,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  11, 114,   0, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16, 128,  65,   0, \n      0,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0, 140,   0,   0,  17, \n    114,   0,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  11,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n    171, 170, 170,  62, 171, 170, \n    170,  62, 171, 170, 170,  62, \n    171, 170, 170,  62,  54,   0, \n      0,   5, 130,   0,  16,   0, \n     12,   0,   0,   0,  10,   0, \n     16,   0,  13,   0,   0,   0, \n     54,   0,   0,   5, 130,   0, \n     16,   0,  10,   0,   0,   0, \n     26,   0,  16,   0,  13,   0, \n      0,   0,  54,   0,   0,   5, \n    130,   0,  16,   0,  14,   0, \n      0,   0,  42,   0,  16,   0, \n     13,   0,   0,   0,  54,   0, \n      0,   5, 130,   0,  16,   0, \n     11,   0,   0,   0,  58,   0, \n     16,   0,  13,   0,   0,   0, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      4,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0, 150,   3, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  54,   0,   0,   5, \n     82,   0,  16,   0,  15,   0, \n      0,   0,   6,   1,  16,   0, \n     13,   0,   0,   0,  54,   0, \n      0,   5, 162,   0,  16,   0, \n     15,   0,   0,   0,  86,   9, \n     16,   0,  11,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10,  50,   0,  16,   0, \n     12,   0,   0,   0,  70,   0, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  52,   0,   0,  10, \n     50,   0,  16,   0,  10,   0, \n      0,   0, 230,  10,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  98,   0, \n     16,   0,  11,   0,   0,   0, \n    166,  11,  16,   0,  13,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0, 214,   2,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10,  50,   0, \n     16,   0,  14,   0,   0,   0, \n     70,   0,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0,   0,   0, \n      0,   0,   0,   0,  52,   0, \n      0,  10,  50,   0,  16,   0, \n     11,   0,   0,   0, 230,  10, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0, 150,   3,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    131,   0,   0,   5,  18,   0, \n     16,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,  11,   0, \n      0,   0, 131,   0,   0,   5, \n     34,   0,  16,   0,  12,   0, \n      0,   0,  10,   0,  16,   0, \n     13,   0,   0,   0, 131,   0, \n      0,   5,  18,   0,  16,   0, \n     10,   0,   0,   0,  42,   0, \n     16,   0,  11,   0,   0,   0, \n    131,   0,   0,   5,  34,   0, \n     16,   0,  10,   0,   0,   0, \n     26,   0,  16,   0,  13,   0, \n      0,   0, 131,   0,   0,   5, \n     18,   0,  16,   0,  14,   0, \n      0,   0,  58,   0,  16,   0, \n     11,   0,   0,   0, 131,   0, \n      0,   5,  34,   0,  16,   0, \n     14,   0,   0,   0,  42,   0, \n     16,   0,  13,   0,   0,   0, \n    131,   0,   0,   5,  18,   0, \n     16,   0,  11,   0,   0,   0, \n     10,   0,  16,   0,  11,   0, \n      0,   0, 131,   0,   0,   5, \n     34,   0,  16,   0,  11,   0, \n      0,   0,  58,   0,  16,   0, \n     13,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,  10,   0, \n      0,   1,  54,   0,   0,   5, \n     18,   0,  16,   0,  12,   0, \n      0,   0,  26,   0,  16,   0, \n     11,   0,   0,   0,  54,   0, \n      0,   8, 226,   0,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  10,   0,   0,   0, \n     42,   0,  16,   0,  11,   0, \n      0,   0,  54,   0,   0,   8, \n    226,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     14,   0,   0,   0,  58,   0, \n     16,   0,  11,   0,   0,   0, \n     54,   0,   0,   8, 226,   0, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    226,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   1,  23,   0,   0,   1, \n     21,   0,   0,   1,   0,   0, \n      0,   7, 242,   0,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,   0,   0,   0,   7, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      0,   0,   0,   7, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n     14,   0,   0,   0,   0,   0, \n      0,   7, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,  30,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   5,   0,   0,   0, \n     31,   0,   4,   3,  58,   0, \n     16,   0,   5,   0,   0,   0, \n     32,   0,   0,   7,  34,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      2,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n     14,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n    230, 116,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  34,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n     15,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n    230, 116,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  50,   0, \n     16,   0,  16,   0,   0,   0, \n    230,  10,  16,   0,  14,   0, \n      0,   0,  54,   0,   0,   5, \n     50,   0,  16,   0,  17,   0, \n      0,   0, 230,  10,  16,   0, \n     15,   0,   0,   0,  18,   0, \n      0,   1, 165,   0,   0,   8, \n     50,   0,  16,   0,  16,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  70, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  34,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n     50,   0,  16,   0,  14,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  70, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10,  50,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n     12,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   5,   0, \n      0,   0,  86,   5,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   5,   0,   0,   0, \n    165,   0,   0,   8,  50,   0, \n     16,   0,  17,   0,   0,   0, \n     10,   0,  16,   0,   5,   0, \n      0,   0,  70, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n     50,   0,  16,   0,  15,   0, \n      0,   0,  26,   0,  16,   0, \n      5,   0,   0,   0,  70, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  76,   0,   0,   3, \n     42,   0,  16,   0,   5,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  41,   0,   0,  10, \n    194,   0,  16,   0,  16,   0, \n      0,   0,   6,   4,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,  18,   0,   0,   0, \n     38,   7,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     18,   0,   0,   0,  70,  14, \n     16,   0,  18,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  18,   0,   0,   0, \n     70,  14,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10, 242,   0,  16,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,  41,   0,   0,  10, \n    194,   0,  16,   0,  14,   0, \n      0,   0,   6,   4,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,  18,   0,   0,   0, \n     38,   7,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     18,   0,   0,   0,  70,  14, \n     16,   0,  18,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  18,   0,   0,   0, \n     70,  14,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10, 242,   0,  16,   0, \n     14,   0,   0,   0,  70,  14, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,  41,   0,   0,  10, \n    194,   0,  16,   0,  17,   0, \n      0,   0,   6,   4,  16,   0, \n     17,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,  18,   0,   0,   0, \n     38,   7,  16,   0,  17,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     18,   0,   0,   0,  70,  14, \n     16,   0,  18,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  18,   0,   0,   0, \n     70,  14,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10, 242,   0,  16,   0, \n     17,   0,   0,   0,  70,  14, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,  41,   0,   0,  10, \n    194,   0,  16,   0,  15,   0, \n      0,   0,   6,   4,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,  18,   0,   0,   0, \n     38,   7,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     18,   0,   0,   0,  70,  14, \n     16,   0,  18,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  18,   0,   0,   0, \n     70,  14,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     85,   0,   0,  10,  50,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   0,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 131,   0, \n      0,   5,  82,   0,  16,   0, \n     16,   0,   0,   0,   6,   1, \n     16,   0,  16,   0,   0,   0, \n    131,   0,   0,   5, 162,   0, \n     16,   0,  16,   0,   0,   0, \n      6,   4,  16,   0,   5,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   5,   0, \n      0,   0,  70,   0,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    131,   0,   0,   5,  82,   0, \n     16,   0,  14,   0,   0,   0, \n      6,   1,  16,   0,  14,   0, \n      0,   0, 131,   0,   0,   5, \n    162,   0,  16,   0,  14,   0, \n      0,   0,   6,   4,  16,   0, \n      5,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      5,   0,   0,   0,  70,   0, \n     16,   0,  17,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 131,   0,   0,   5, \n     82,   0,  16,   0,  17,   0, \n      0,   0,   6,   1,  16,   0, \n     17,   0,   0,   0, 131,   0, \n      0,   5, 162,   0,  16,   0, \n     17,   0,   0,   0,   6,   4, \n     16,   0,   5,   0,   0,   0, \n     85,   0,   0,  10,  50,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   0,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 131,   0, \n      0,   5,  82,   0,  16,   0, \n     15,   0,   0,   0,   6,   1, \n     16,   0,  15,   0,   0,   0, \n    131,   0,   0,   5, 162,   0, \n     16,   0,  15,   0,   0,   0, \n      6,   4,  16,   0,   5,   0, \n      0,   0,   2,   0,   0,   1, \n     10,   0,   0,   1,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  17,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,  23,   0, \n      0,   1,  18,   0,   0,   1, \n     32,   0,   0,   7,  34,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      2,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n     15,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     54, 121,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     18,   0,   0,   1, 165,   0, \n      0,   8,  34,   0,  16,   0, \n     15,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8,  66,   0,  16,   0, \n     15,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     41,   0,   0,  10,  98,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     12,   0,   0,   0,   0,   0, \n      0,   0,  86,   5,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  98,   0,  16,   0, \n      1,   0,   0,   0,  86,   5, \n     16,   0,   0,   0,   0,   0, \n     86,   6,  16,   0,   1,   0, \n      0,   0, 165,   0,   0,   8, \n    130,   0,  16,   0,  15,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8,  18,   0,  16,   0, \n     15,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  76,   0, \n      0,   3,  42,   0,  16,   0, \n      5,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      0,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      1,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      5,   0,   0,   0,  86,   5, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     16,   0,   0,   0,  24,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   5,   0, \n      0,   0,  26,   0,  16,   0, \n     15,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59,  85,   0,   0,  10, \n    226,   0,  16,   0,   5,   0, \n      0,   0, 166,  10,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   5,   0,   0,   0, \n     42,   0,  16,   0,  15,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  14,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   5,   0,   0,   0, \n    246,  15,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  16,   0,   0,   0, \n     24,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      5,   0,   0,   0,  58,   0, \n     16,   0,  15,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  17,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     15,   0,   0,   0,   6,   0, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     16,   0,   0,   0,  24,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      2,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n     10,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      5,   0,   0,   0,  86,   5, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   5,   0, \n      0,   0,  26,   0,  16,   0, \n     15,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   3,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   8,  32, \n    128,  58,   8,  32, 128,  58, \n      8,  32, 128,  58, 171, 170, \n    170,  62,  85,   0,   0,  10, \n    226,   0,  16,   0,   5,   0, \n      0,   0, 166,  10,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   5,   0,   0,   0, \n     42,   0,  16,   0,  15,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   3,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  14,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   8,  32, 128,  58, \n      8,  32, 128,  58,   8,  32, \n    128,  58, 171, 170, 170,  62, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   5,   0,   0,   0, \n    246,  15,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     30,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      5,   0,   0,   0,  58,   0, \n     16,   0,  15,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      3,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  17,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      8,  32, 128,  58,   8,  32, \n    128,  58,   8,  32, 128,  58, \n    171, 170, 170,  62,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     15,   0,   0,   0,   6,   0, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   3,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   8,  32, 128,  58, \n      8,  32, 128,  58,   8,  32, \n    128,  58, 171, 170, 170,  62, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n     12,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  86,   9, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     30,   0,   0,   0,  30,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  18,   0, \n      0,   0,  26,   0,  16,   0, \n     15,   0,   0,   0,  54,   0, \n      0,   5,  98,   0,  16,   0, \n     18,   0,   0,   0,   6,   1, \n     16,   0,   5,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,  21,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0, 135,   0,   0,   5, \n    114,   0,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     22,   0,   0,   0,  70,   2, \n     16,   0,  22,   0,   0,   0, \n      2,  64,   0,   0, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255,   0,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  22,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  11, \n    114,   0,  16,   0,  23,   0, \n      0,   0,  70,   2,  16, 128, \n     65,   0,   0,   0,  22,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     23,   0,   0,   0,  70,   2, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16,   0,  21,   0, \n      0,   0,  70,   2,  16,   0, \n     23,   0,   0,   0, 140,   0, \n      0,  17, 114,   0,  16,   0, \n     18,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  23,   0,   0,   0, \n      2,  64,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 114,   0,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  86,   0,   0,   5, \n     98,   0,  16,   0,   1,   0, \n      0,   0, 166,  11,  16,   0, \n      5,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0, 230,  11, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  18,   0, \n      0,   0,  42,   0,  16,   0, \n     15,   0,   0,   0,  54,   0, \n      0,   5,  98,   0,  16,   0, \n     18,   0,   0,   0,   6,   3, \n     16,   0,   5,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,  21,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0, 135,   0,   0,   5, \n    114,   0,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     22,   0,   0,   0,  70,   2, \n     16,   0,  22,   0,   0,   0, \n      2,  64,   0,   0, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255,   0,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  22,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  11, \n    114,   0,  16,   0,  23,   0, \n      0,   0,  70,   2,  16, 128, \n     65,   0,   0,   0,  22,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     23,   0,   0,   0,  70,   2, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16,   0,  21,   0, \n      0,   0,  70,   2,  16,   0, \n     23,   0,   0,   0, 140,   0, \n      0,  17, 114,   0,  16,   0, \n     18,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  23,   0,   0,   0, \n      2,  64,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 114,   0,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  14,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  56,   0,   0,  10, \n     98,   0,  16,   0,   1,   0, \n      0,   0,  86,   6,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n    171, 170, 170,  62, 171, 170, \n    170,  62,   0,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   5,   0,   0,   0, \n     58,   0,  16,   0,  15,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 114,   0,  16,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0, 135,   0, \n      0,   5, 114,   0,  16,   0, \n     21,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16,   0,  21,   0, \n      0,   0,   2,  64,   0,   0, \n    232, 255, 255, 255, 232, 255, \n    255, 255, 232, 255, 255, 255, \n      0,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     21,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  21,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  11, 114,   0,  16,   0, \n     22,   0,   0,   0,  70,   2, \n     16, 128,  65,   0,   0,   0, \n     21,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  22,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  22,   0,   0,   0, \n    140,   0,   0,  17, 114,   0, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     21,   0,   0,   0,  70,   2, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,   5,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,   5,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  22,   0, \n      0,   0,   2,  64,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,   5,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 114,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  54,   0, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,  30,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,  86,   0,   0,   5, \n     50,   0,  16,   0,  18,   0, \n      0,   0, 198,   0,  16,   0, \n      5,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      5,   0,   0,   0,  10,   0, \n     16,   0,  15,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,  21,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0, 135,   0,   0,   5, \n    114,   0,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     22,   0,   0,   0,  70,   2, \n     16,   0,  22,   0,   0,   0, \n      2,  64,   0,   0, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255,   0,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  22,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  11, \n    114,   0,  16,   0,  23,   0, \n      0,   0,  70,   2,  16, 128, \n     65,   0,   0,   0,  22,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     23,   0,   0,   0,  70,   2, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16,   0,  21,   0, \n      0,   0,  70,   2,  16,   0, \n     23,   0,   0,   0, 140,   0, \n      0,  17, 114,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n      5,   0,   0,   0,  70,   2, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  23,   0,   0,   0, \n      2,  64,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 114,   0,  16,   0, \n      5,   0,   0,   0,  70,   2, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  56,   0,   0,  10, \n     50,   0,  16,   0,   5,   0, \n      0,   0,  70,   0,  16,   0, \n     18,   0,   0,   0,   2,  64, \n      0,   0, 171, 170, 170,  62, \n    171, 170, 170,  62,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5, 130,   0, \n     16,   0,  16,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  54,   0,   0,   5, \n    130,   0,  16,   0,  14,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  54,   0, \n      0,   5, 130,   0,  16,   0, \n     17,   0,   0,   0,  10,   0, \n     16,   0,   5,   0,   0,   0, \n     54,   0,   0,   5, 130,   0, \n     16,   0,  15,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n    150,   3,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  54,   0, \n      0,   5,  82,   0,  16,   0, \n     18,   0,   0,   0,   6,   1, \n     16,   0,   5,   0,   0,   0, \n     54,   0,   0,   5, 162,   0, \n     16,   0,  18,   0,   0,   0, \n     86,   9,  16,   0,  15,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,  18,   0, \n      0,   0,  70,  14,  16,   0, \n     18,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  18,   0,   0,   0, \n     70,  14,  16,   0,  18,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  18,   0, \n      0,   0,  70,  14,  16,   0, \n     18,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10,  50,   0, \n     16,   0,  16,   0,   0,   0, \n     70,   0,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0,   0,   0, \n      0,   0,   0,   0,  52,   0, \n      0,  10,  50,   0,  16,   0, \n     14,   0,   0,   0, 230,  10, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     98,   0,  16,   0,  15,   0, \n      0,   0, 166,  11,  16,   0, \n      5,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0, 214,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n     50,   0,  16,   0,  17,   0, \n      0,   0,  70,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     52,   0,   0,  10,  50,   0, \n     16,   0,  15,   0,   0,   0, \n    230,  10,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  17,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      6,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0, 150,   3, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 131,   0,   0,   5, \n     18,   0,  16,   0,  16,   0, \n      0,   0,  26,   0,  16,   0, \n     15,   0,   0,   0, 131,   0, \n      0,   5,  34,   0,  16,   0, \n     16,   0,   0,   0,  10,   0, \n     16,   0,   5,   0,   0,   0, \n    131,   0,   0,   5,  18,   0, \n     16,   0,  14,   0,   0,   0, \n     42,   0,  16,   0,  15,   0, \n      0,   0, 131,   0,   0,   5, \n     34,   0,  16,   0,  14,   0, \n      0,   0,  26,   0,  16,   0, \n      5,   0,   0,   0, 131,   0, \n      0,   5,  18,   0,  16,   0, \n     17,   0,   0,   0,  58,   0, \n     16,   0,  15,   0,   0,   0, \n    131,   0,   0,   5,  34,   0, \n     16,   0,  17,   0,   0,   0, \n     42,   0,  16,   0,   5,   0, \n      0,   0, 131,   0,   0,   5, \n     18,   0,  16,   0,  15,   0, \n      0,   0,  10,   0,  16,   0, \n     15,   0,   0,   0, 131,   0, \n      0,   5,  34,   0,  16,   0, \n     15,   0,   0,   0,  58,   0, \n     16,   0,   5,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     17,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   1, \n     10,   0,   0,   1,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     16,   0,   0,   0,  26,   0, \n     16,   0,  15,   0,   0,   0, \n     54,   0,   0,   8, 226,   0, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  14,   0, \n      0,   0,  42,   0,  16,   0, \n     15,   0,   0,   0,  54,   0, \n      0,   8, 226,   0,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  17,   0,   0,   0, \n     58,   0,  16,   0,  15,   0, \n      0,   0,  54,   0,   0,   8, \n    226,   0,  16,   0,  17,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 226,   0,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,  23,   0, \n      0,   1,  21,   0,   0,   1, \n      0,   0,   0,   7, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   7, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  14,   0, \n      0,   0,   0,   0,   0,   7, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  17,   0,   0,   0, \n      0,   0,   0,   7, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,  18,   0, \n      0,   1,  54,   0,   0,   5, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,  21,   0, \n      0,   1,  21,   0,   0,   1, \n     56,   0,   0,   7, 242,   0, \n     16,   0,   5,   0,   0,   0, \n    246,  15,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,  56,   0, \n      0,   7, 242,   0,  16,   0, \n      6,   0,   0,   0, 246,  15, \n     16,   0,   1,   0,   0,   0, \n    134,   7,  16,   0,   6,   0, \n      0,   0,  56,   0,   0,   7, \n    242,   0,  16,   0,   8,   0, \n      0,   0, 246,  15,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n     56,   0,   0,   7, 242,   0, \n     16,   0,   7,   0,   0,   0, \n    246,  15,  16,   0,   1,   0, \n      0,   0, 134,   7,  16,   0, \n      7,   0,   0,   0,  31,   0, \n      4,   3,  58,   0,  16,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  82,   0,  16,   0, \n      5,   0,   0,   0, 166,   8, \n     16,   0,   5,   0,   0,   0, \n     54,   0,   0,   5,  82,   0, \n     16,   0,   9,   0,   0,   0, \n     86,   4,  16,   0,   6,   0, \n      0,   0,  54,   0,   0,   5, \n     82,   0,  16,   0,   8,   0, \n      0,   0, 166,   8,  16,   0, \n      8,   0,   0,   0,  54,   0, \n      0,   5,  82,   0,  16,   0, \n     10,   0,   0,   0,  86,   4, \n     16,   0,   7,   0,   0,   0, \n     18,   0,   0,   1,  54,   0, \n      0,   5,  82,   0,  16,   0, \n      9,   0,   0,   0,   6,   1, \n     16,   0,   6,   0,   0,   0, \n     54,   0,   0,   5,  82,   0, \n     16,   0,  10,   0,   0,   0, \n      6,   1,  16,   0,   7,   0, \n      0,   0,  21,   0,   0,   1, \n     76,   0,   0,   3,  10,   0, \n     16,   0,   2,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,  26,   0,   0,   0, \n     54,  32,   0,   5, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  50,   0,   0,  15, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   0, 255, 127,  71, \n      0, 255, 127,  71,   0, 255, \n    127,  71,   0, 255, 127,  71, \n      2,  64,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,  63,  28,   0,   0,   5, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  35,   0, \n      0,  12,  50,   0,  16,   0, \n      6,   0,   0,   0, 214,   5, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 134,   0,  16,   0, \n     11,   0,   0,   0,  54,   0, \n      0,   5, 162,   0,  16,   0, \n      9,   0,   0,   0, 246,  11, \n     16,   0,   6,   0,   0,   0, \n     54,  32,   0,   5, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,  50,   0,   0,  15, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   0, 255, 127,  71, \n      0, 255, 127,  71,   0, 255, \n    127,  71,   0, 255, 127,  71, \n      2,  64,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,  63,  28,   0,   0,   5, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  35,   0, \n      0,  12, 194,   0,  16,   0, \n      6,   0,   0,   0,  86,  13, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   6,   8,  16,   0, \n     11,   0,   0,   0,  54,  32, \n      0,   5, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n     50,   0,   0,  15, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255, 127,  71,   0, 255, \n    127,  71,   0, 255, 127,  71, \n      0, 255, 127,  71,   2,  64, \n      0,   0,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,  63,   0,   0,   0,  63, \n     28,   0,   0,   5, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,  35,   0,   0,  12, \n     50,   0,  16,   0,   7,   0, \n      0,   0, 214,   5,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    134,   0,  16,   0,  11,   0, \n      0,   0,  54,   0,   0,   5, \n    162,   0,  16,   0,  10,   0, \n      0,   0, 246,  11,  16,   0, \n      7,   0,   0,   0,  54,  32, \n      0,   5, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     50,   0,   0,  15, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255, 127,  71,   0, 255, \n    127,  71,   0, 255, 127,  71, \n      0, 255, 127,  71,   2,  64, \n      0,   0,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,  63,   0,   0,   0,  63, \n     28,   0,   0,   5, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,  35,   0,   0,  12, \n    194,   0,  16,   0,   7,   0, \n      0,   0,  86,  13,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      6,   8,  16,   0,  11,   0, \n      0,   0,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,  32,   0,   0,   0, \n    130,   0,   0,   5, 162,   0, \n     16,   0,   0,   0,   0,   0, \n      6,   8,  16,   0,   5,   0, \n      0,   0, 130,   0,   0,   5, \n     98,   0,  16,   0,   1,   0, \n      0,   0,  86,   7,  16,   0, \n      5,   0,   0,   0,  35,   0, \n      0,  12,  50,   0,  16,   0, \n      6,   0,   0,   0, 150,   5, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 214,   5,  16,   0, \n      0,   0,   0,   0, 130,   0, \n      0,   5, 162,   0,  16,   0, \n      0,   0,   0,   0,   6,   8, \n     16,   0,   9,   0,   0,   0, \n    130,   0,   0,   5,  98,   0, \n     16,   0,   1,   0,   0,   0, \n    246,  14,  16,   0,   6,   0, \n      0,   0,  35,   0,   0,  12, \n    194,   0,  16,   0,   6,   0, \n      0,   0,  86,   9,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n     86,  13,  16,   0,   0,   0, \n      0,   0, 130,   0,   0,   5, \n    162,   0,  16,   0,   0,   0, \n      0,   0,   6,   8,  16,   0, \n      8,   0,   0,   0, 130,   0, \n      0,   5,  98,   0,  16,   0, \n      1,   0,   0,   0,  86,   7, \n     16,   0,   8,   0,   0,   0, \n     35,   0,   0,  12,  50,   0, \n     16,   0,   7,   0,   0,   0, \n    150,   5,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 214,   5, \n     16,   0,   0,   0,   0,   0, \n    130,   0,   0,   5, 162,   0, \n     16,   0,   0,   0,   0,   0, \n      6,   8,  16,   0,  10,   0, \n      0,   0, 130,   0,   0,   5, \n     98,   0,  16,   0,   1,   0, \n      0,   0, 246,  14,  16,   0, \n      7,   0,   0,   0,  35,   0, \n      0,  12, 194,   0,  16,   0, \n      7,   0,   0,   0,  86,   9, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,  86,  13,  16,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   1,  10,   0,   0,   1, \n     54,   0,   0,   5,  50,   0, \n     16,   0,   6,   0,   0,   0, \n     70,   0,  16,   0,   5,   0, \n      0,   0,  54,   0,   0,   5, \n     66,   0,  16,   0,   6,   0, \n      0,   0,  10,   0,  16,   0, \n      9,   0,   0,   0,  54,   0, \n      0,   5,  50,   0,  16,   0, \n      7,   0,   0,   0,  70,   0, \n     16,   0,   8,   0,   0,   0, \n     54,   0,   0,   5,  66,   0, \n     16,   0,   7,   0,   0,   0, \n     10,   0,  16,   0,  10,   0, \n      0,   0,   2,   0,   0,   1, \n     23,   0,   0,   1,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  31,   0,   4,   3, \n     42,   0,  16,   0,   0,   0, \n      0,   0, 138,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     42, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  66,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  10,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     42,   0,   0,   7, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0, 118,  15, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   4,   0, \n      0,   0,   5,   0,   0,   0, \n      1,   0,   0,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   5,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  25,   0, \n      0,   0,   1,  64,   0,   0, \n      7,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n    138,   0,   0,   9, 130,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n    140,   0,   0,  20,  98,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0, 166,  10, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11, 130,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  64,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n    139,   0,   0,  15, 162,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  27,   0,   0,   0, \n      0,   0,   0,   0,  24,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,  86,   5, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  18,   0, \n      0,   1,  42,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,   1,   0, \n      0,   0,   4,   0,   0,   0, \n     35,   0,   0,   9,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n    140,   0,   0,  20,  50,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,  11,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 230,  10, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n    130,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  64,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0, 138,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,  42,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  87,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  64,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0, 139,   0,   0,  15, \n     50,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     27,   0,   0,   0,  24,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    166,  10,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     66,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  30,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  32,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  31,   0,   4,   3, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  22,  11,  16,   0, \n      6,   0,   0,   0,  54,   0, \n      0,   5, 130,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     18,   0,   0,   1,  54,   0, \n      0,   5, 130,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  32,   0, \n      0,  10, 114,   0,  16,   0, \n      1,   0,   0,   0, 246,  15, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   2,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   1,   0, \n      0,   0, 150,   5,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,  85,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     21,   0,   0,   1, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     30,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     32,   0,   0,   0,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5, 242,   0,  16,   0, \n      7,   0,   0,   0,  22,  11, \n     16,   0,   7,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,  21,   0,   0,   1, \n     32,   0,   0,  10, 210,   0, \n     16,   0,   0,   0,   0,   0, \n      6,   0,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      3,   0,   0,   0,  60,   0, \n      0,   7,  82,   0,  16,   0, \n      0,   0,   0,   0, 166,  11, \n     16,   0,   0,   0,   0,   0, \n      6,   2,  16,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  21,   0,   0,   1, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  62,   0,   0,   1, \n     83,  84,  65,  84, 148,   0, \n      0,   0, 183,   4,   0,   0, \n     24,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n    116,   0,   0,   0, 227,   0, \n      0,   0, 172,   0,   0,   0, \n     59,   0,   0,   0,  34,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  44,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    188,   0,   0,   0,  64,   0, \n      0,   0,  68,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/resolve_full_64bpp_scaled_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_resolve_edram_info;        // Offset:    0 Size:     4\n//   uint xe_resolve_coordinate_info;   // Offset:    4 Size:     4\n//   uint xe_resolve_dest_info;         // Offset:    8 Size:     4\n//   uint xe_resolve_dest_coordinate_info;// Offset:   12 Size:     4\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_resolve_edram                  texture    byte         r/o      T0             t0      1 \n// xe_resolve_dest                       UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][1], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xy\ndcl_temps 24\ndcl_thread_group 8, 8, 1\nand r0.xyzw, CB0[0][0].zxxz, l(7, 1023, 0x20000000, 8)\nif_nz r0.z\n  ubfe r1.xy, l(2, 2, 0, 0), l(17, 20, 0, 0), CB0[0][0].yyyy\nelse \n  mov r1.xy, l(0,0,0,0)\nendif \nubfe r2.xyz, l(3, 3, 11, 0), l(16, 19, 5, 0), CB0[0][0].yyyy\nimul null, r0.z, r2.x, r2.z\nand r1.zw, CB0[0][0].zzzw, l(0, 0, 0x01000000, 1023)\nushr r3.xyzw, CB0[0][0].ywww, l(4, 10, 20, 24)\nishl r4.x, vThreadID.x, l(2)\nishl r0.z, r0.z, l(3)\nuge r0.z, r4.x, r0.z\nif_nz r0.z\n  ret \nendif \nubfe r5.xyzw, l(2, 11, 4, 1), l(10, 13, 24, 28), CB0[0][0].xxxx\nmov r6.x, CB0[0][0].y\nmov r6.y, r3.x\nbfi r2.zw, l(0, 0, 4, 1), l(0, 0, 3, 3), r6.xxxy, l(0, 0, 0, 0)\nibfe r0.z, l(6), l(16), CB0[0][0].z\nishl r0.z, r0.z, l(23)\niadd r0.z, r0.z, l(0x3f800000)\nbfi r3.xz, l(4, 0, 4, 0), l(3, 0, 3, 0), r3.zzwz, l(0, 0, 0, 0)\nubfe r6.xy, l(6, 3, 0, 0), l(7, 28, 0, 0), CB0[0][0].zwzz\numax r4.y, r1.y, vThreadID.y\nimad r2.zw, r2.zzzw, r2.xxxy, r4.xxxy\nuge r1.y, l(3), r6.y\nif_nz r1.y\n  mov r7.y, r6.y\nelse \n  ieq r1.y, r6.y, l(5)\n  if_nz r1.y\n    mov r7.y, l(2)\n  else \n    mov r7.y, l(0)\n  endif \nendif \nuge r4.yw, r5.xxxx, l(0, 2, 0, 1)\nand r4.yw, r4.yyyw, l(0, 1, 0, 1)\nishl r2.zw, r2.zzzw, r4.yyyw\nushr r7.x, r7.y, l(1)\nand r6.zw, r7.xxxy, l(0, 0, 1, 1)\niadd r2.zw, r2.zzzw, r6.zzzw\nimul null, r7.yz, r2.xxyx, l(0, 80, 16, 0)\nushr r7.x, r7.y, r5.w\nudiv r6.zw, null, r2.zzzw, r7.xxxz\nimad r0.y, r6.w, r0.y, r6.z\niadd r0.y, r0.y, r5.y\nimad r2.zw, -r6.zzzw, r7.xxxz, r2.zzzw\nimul null, r1.y, r7.z, r7.y\nimad r2.z, r2.w, r7.x, r2.z\nishl r2.z, r2.z, r5.w\nimad r0.y, r0.y, r1.y, r2.z\nishl r1.y, r1.y, l(11)\nudiv null, r0.y, r0.y, r1.y\nishl r0.y, r0.y, l(2)\niadd r1.y, r4.y, r5.w\nishl r2.z, l(4), r1.y\nif_nz r5.w\n  ieq r2.w, r2.z, l(8)\n  if_nz r2.w\n    ld_raw r7.xyzw, r0.y, T0[0].zwxy\n    iadd r2.w, r0.y, l(16)\n    ld_raw r8.xyzw, r2.w, T0[0].zwxy\n    mov r9.xy, r7.zwzz\n    mov r10.xy, r8.zwzz\n  else \n    ld_raw r9.xy, r0.y, T0[0].xyxx\n    iadd r2.w, r0.y, r2.z\n    ld_raw r7.xy, r2.w, T0[0].xyxx\n    ishl r4.yw, l(0, 8, 0, 12), r1.yyyy\n    iadd r4.yw, r0.yyyy, r4.yyyw\n    ld_raw r10.xy, r4.y, T0[0].xyxx\n    ld_raw r8.xy, r4.w, T0[0].xyxx\n  endif \n  switch r5.z\n    case l(5)\n    ishl r9.zw, r9.xxxy, l(0, 0, 16, 16)\n    ishr r11.xyzw, r9.zxwy, l(16, 16, 16, 16)\n    itof r11.xyzw, r11.xyzw\n    mul r11.xyzw, r11.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n    max r9.xyzw, r11.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n    ishl r7.zw, r7.xxxy, l(0, 0, 16, 16)\n    ishr r11.xyzw, r7.zxwy, l(16, 16, 16, 16)\n    itof r11.xyzw, r11.xyzw\n    mul r11.xyzw, r11.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n    max r7.xyzw, r11.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n    ishl r10.zw, r10.xxxy, l(0, 0, 16, 16)\n    ishr r11.xyzw, r10.zxwy, l(16, 16, 16, 16)\n    itof r11.xyzw, r11.xyzw\n    mul r11.xyzw, r11.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n    max r10.xyzw, r11.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n    ishl r8.zw, r8.xxxy, l(0, 0, 16, 16)\n    ishr r11.xyzw, r8.zxwy, l(16, 16, 16, 16)\n    itof r11.xyzw, r11.xyzw\n    mul r11.xyzw, r11.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n    max r8.xyzw, r11.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n    break \n    case l(7)\n    ushr r4.yw, r9.xxxy, l(0, 16, 0, 16)\n    f16tof32 r9.xz, r9.xxyx\n    f16tof32 r9.yw, r4.yyyw\n    ushr r4.yw, r7.xxxy, l(0, 16, 0, 16)\n    f16tof32 r7.xz, r7.xxyx\n    f16tof32 r7.yw, r4.yyyw\n    ushr r4.yw, r10.xxxy, l(0, 16, 0, 16)\n    f16tof32 r10.xz, r10.xxyx\n    f16tof32 r10.yw, r4.yyyw\n    ushr r4.yw, r8.xxxy, l(0, 16, 0, 16)\n    f16tof32 r8.xz, r8.xxyx\n    f16tof32 r8.yw, r4.yyyw\n    break \n    default \n    mov r9.zw, l(0,0,0,0)\n    mov r7.zw, l(0,0,0,0)\n    mov r10.zw, l(0,0,0,0)\n    mov r8.zw, l(0,0,0,0)\n    break \n  endswitch \nelse \n  ieq r2.w, r2.z, l(4)\n  if_nz r2.w\n    ld_raw r8.xyzw, r0.y, T0[0].wxyz\n  else \n    ld_raw r8.y, r0.y, T0[0].xxxx\n    iadd r2.w, r0.y, r2.z\n    ld_raw r8.z, r2.w, T0[0].xxxx\n    ishl r4.yw, l(0, 8, 0, 12), r1.yyyy\n    iadd r4.yw, r0.yyyy, r4.yyyw\n    ld_raw r8.w, r4.y, T0[0].xxxx\n    ld_raw r8.x, r4.w, T0[0].xxxx\n  endif \n  switch r5.z\n    case l(0)\n    case l(1)\n    ushr r11.yzw, r8.yyyy, l(0, 8, 16, 24)\n    mov r11.x, r8.y\n    and r11.xyzw, r11.xyzw, l(255, 255, 255, 255)\n    utof r11.xyzw, r11.xyzw\n    mul r9.xyzw, r11.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n    ushr r11.yzw, r8.zzzz, l(0, 8, 16, 24)\n    mov r11.x, r8.z\n    and r11.xyzw, r11.xyzw, l(255, 255, 255, 255)\n    utof r11.xyzw, r11.xyzw\n    mul r7.xyzw, r11.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n    ushr r11.yzw, r8.wwww, l(0, 8, 16, 24)\n    mov r11.x, r8.w\n    and r11.xyzw, r11.xyzw, l(255, 255, 255, 255)\n    utof r11.xyzw, r11.xyzw\n    mul r10.xyzw, r11.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n    ushr r8.yzw, r8.xxxx, l(0, 8, 16, 24)\n    and r11.xyzw, r8.xyzw, l(255, 255, 255, 255)\n    utof r11.xyzw, r11.xyzw\n    mul r8.xyzw, r11.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n    break \n    case l(2)\n    case l(10)\n    ushr r11.yzw, r8.yyyy, l(0, 10, 20, 30)\n    mov r11.x, r8.y\n    and r11.xyzw, r11.xyzw, l(1023, 1023, 1023, 3)\n    utof r11.xyzw, r11.xyzw\n    mul r9.xyzw, r11.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n    ushr r11.yzw, r8.zzzz, l(0, 10, 20, 30)\n    mov r11.x, r8.z\n    and r11.xyzw, r11.xyzw, l(1023, 1023, 1023, 3)\n    utof r11.xyzw, r11.xyzw\n    mul r7.xyzw, r11.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n    ushr r11.yzw, r8.wwww, l(0, 10, 20, 30)\n    mov r11.x, r8.w\n    and r11.xyzw, r11.xyzw, l(1023, 1023, 1023, 3)\n    utof r11.xyzw, r11.xyzw\n    mul r10.xyzw, r11.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n    ushr r8.yzw, r8.xxxx, l(0, 10, 20, 30)\n    and r11.xyzw, r8.xyzw, l(1023, 1023, 1023, 3)\n    utof r11.xyzw, r11.xyzw\n    mul r8.xyzw, r11.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n    break \n    case l(3)\n    case l(12)\n    ushr r11.xyzw, r8.yyyz, l(10, 20, 30, 30)\n    mov r12.x, r8.y\n    mov r12.yz, r11.xxyx\n    and r13.xyz, r12.xyzx, l(1023, 1023, 1023, 0)\n    and r14.xyz, r12.xyzx, l(127, 127, 127, 0)\n    ubfe r15.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r12.xyzx\n    firstbit_hi r16.xyz, r14.xyzx\n    iadd r16.xyz, r16.xyzx, l(-24, -24, -24, 0)\n    movc r16.xyz, r14.xyzx, r16.xyzx, l(8,8,8,0)\n    iadd r17.xyz, -r16.xyzx, l(1, 1, 1, 0)\n    movc r17.xyz, r15.xyzx, r15.xyzx, r17.xyzx\n    bfi r12.xyz, l(7, 7, 7, 0), r16.xyzx, r12.xyzx, l(0, 0, 0, 0)\n    and r12.xyz, r12.xyzx, l(127, 127, 127, 0)\n    movc r12.xyz, r15.xyzx, r14.xyzx, r12.xyzx\n    ishl r14.xyz, r17.xyzx, l(23, 23, 23, 0)\n    iadd r14.xyz, r14.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n    ishl r12.xyz, r12.xyzx, l(16, 16, 16, 0)\n    iadd r12.xyz, r14.xyzx, r12.xyzx\n    movc r9.xyz, r13.xyzx, r12.xyzx, l(0,0,0,0)\n    utof r4.yw, r11.zzzw\n    ushr r11.xyzw, r8.zwwz, l(10, 10, 20, 20)\n    mov r12.x, r8.z\n    mov r12.yz, r11.xxwx\n    and r13.xyz, r12.xyzx, l(1023, 1023, 1023, 0)\n    and r14.xyz, r12.xyzx, l(127, 127, 127, 0)\n    ubfe r15.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r12.xyzx\n    firstbit_hi r16.xyz, r14.xyzx\n    iadd r16.xyz, r16.xyzx, l(-24, -24, -24, 0)\n    movc r16.xyz, r14.xyzx, r16.xyzx, l(8,8,8,0)\n    iadd r17.xyz, -r16.xyzx, l(1, 1, 1, 0)\n    movc r17.xyz, r15.xyzx, r15.xyzx, r17.xyzx\n    bfi r12.xyz, l(7, 7, 7, 0), r16.xyzx, r12.xyzx, l(0, 0, 0, 0)\n    and r12.xyz, r12.xyzx, l(127, 127, 127, 0)\n    movc r12.xyz, r15.xyzx, r14.xyzx, r12.xyzx\n    ishl r14.xyz, r17.xyzx, l(23, 23, 23, 0)\n    iadd r14.xyz, r14.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n    ishl r12.xyz, r12.xyzx, l(16, 16, 16, 0)\n    iadd r12.xyz, r14.xyzx, r12.xyzx\n    movc r7.xyz, r13.xyzx, r12.xyzx, l(0,0,0,0)\n    mul r4.yw, r4.yyyw, l(0.000000, 0.333333, 0.000000, 0.333333)\n    mov r11.x, r8.w\n    and r12.xyz, r11.xyzx, l(1023, 1023, 1023, 0)\n    and r13.xyz, r11.xyzx, l(127, 127, 127, 0)\n    ubfe r14.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r11.xyzx\n    firstbit_hi r15.xyz, r13.xyzx\n    iadd r15.xyz, r15.xyzx, l(-24, -24, -24, 0)\n    movc r15.xyz, r13.xyzx, r15.xyzx, l(8,8,8,0)\n    iadd r16.xyz, -r15.xyzx, l(1, 1, 1, 0)\n    movc r16.xyz, r14.xyzx, r14.xyzx, r16.xyzx\n    bfi r11.xyz, l(7, 7, 7, 0), r15.xyzx, r11.xyzx, l(0, 0, 0, 0)\n    and r11.xyz, r11.xyzx, l(127, 127, 127, 0)\n    movc r11.xyz, r14.xyzx, r13.xyzx, r11.xyzx\n    ishl r13.xyz, r16.xyzx, l(23, 23, 23, 0)\n    iadd r13.xyz, r13.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n    ishl r11.xyz, r11.xyzx, l(16, 16, 16, 0)\n    iadd r11.xyz, r13.xyzx, r11.xyzx\n    movc r10.xyz, r12.xyzx, r11.xyzx, l(0,0,0,0)\n    ushr r11.xyzw, r8.wxxx, l(30, 10, 20, 30)\n    utof r5.xy, r11.xwxx\n    mov r11.x, r8.x\n    and r12.xyz, r11.xyzx, l(1023, 1023, 1023, 0)\n    and r13.xyz, r11.xyzx, l(127, 127, 127, 0)\n    ubfe r14.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r11.xyzx\n    firstbit_hi r15.xyz, r13.xyzx\n    iadd r15.xyz, r15.xyzx, l(-24, -24, -24, 0)\n    movc r15.xyz, r13.xyzx, r15.xyzx, l(8,8,8,0)\n    iadd r16.xyz, -r15.xyzx, l(1, 1, 1, 0)\n    movc r16.xyz, r14.xyzx, r14.xyzx, r16.xyzx\n    bfi r11.xyz, l(7, 7, 7, 0), r15.xyzx, r11.xyzx, l(0, 0, 0, 0)\n    and r11.xyz, r11.xyzx, l(127, 127, 127, 0)\n    movc r11.xyz, r14.xyzx, r13.xyzx, r11.xyzx\n    ishl r13.xyz, r16.xyzx, l(23, 23, 23, 0)\n    iadd r13.xyz, r13.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n    ishl r11.xyz, r11.xyzx, l(16, 16, 16, 0)\n    iadd r11.xyz, r13.xyzx, r11.xyzx\n    movc r8.xyz, r12.xyzx, r11.xyzx, l(0,0,0,0)\n    mul r5.xy, r5.xyxx, l(0.333333, 0.333333, 0.000000, 0.000000)\n    mov r9.w, r4.y\n    mov r7.w, r4.w\n    mov r10.w, r5.x\n    mov r8.w, r5.y\n    break \n    case l(4)\n    ishl r11.xyzw, r8.yzwx, l(16, 16, 16, 16)\n    mov r12.xz, r11.xxyx\n    mov r12.yw, r8.yyyz\n    ishr r12.xyzw, r12.xyzw, l(16, 16, 16, 16)\n    itof r12.xyzw, r12.xyzw\n    mul r12.xyzw, r12.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n    max r9.xy, r12.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n    max r7.xy, r12.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n    mov r8.yz, r11.zzwz\n    ishr r11.xyzw, r8.ywzx, l(16, 16, 16, 16)\n    itof r11.xyzw, r11.xyzw\n    mul r11.xyzw, r11.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n    max r10.xy, r11.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n    max r8.xy, r11.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n    mov r9.zw, l(0,0,0,0)\n    mov r7.zw, l(0,0,0,0)\n    mov r10.zw, l(0,0,0,0)\n    mov r8.zw, l(0,0,0,0)\n    break \n    case l(6)\n    ushr r11.xyzw, r8.yzwx, l(16, 16, 16, 16)\n    f16tof32 r9.x, r8.y\n    f16tof32 r9.y, r11.x\n    f16tof32 r7.x, r8.z\n    f16tof32 r7.y, r11.y\n    f16tof32 r10.x, r8.w\n    f16tof32 r10.y, r11.z\n    f16tof32 r8.x, r8.x\n    f16tof32 r8.y, r11.w\n    mov r9.zw, l(0,0,0,0)\n    mov r7.zw, l(0,0,0,0)\n    mov r10.zw, l(0,0,0,0)\n    mov r8.zw, l(0,0,0,0)\n    break \n    default \n    mov r9.x, r8.y\n    mov r9.yzw, l(0,0,0,0)\n    mov r7.x, r8.z\n    mov r7.yzw, l(0,0,0,0)\n    mov r10.x, r8.w\n    mov r10.yzw, l(0,0,0,0)\n    mov r8.yzw, l(0,0,0,0)\n    break \n  endswitch \nendif \nuge r2.w, r6.y, l(4)\nif_nz r2.w\n  mul r2.w, r0.z, l(0.500000)\n  imad r3.w, l(320), r2.x, r0.y\n  if_nz r5.w\n    ieq r4.y, r2.z, l(8)\n    if_nz r4.y\n      ld_raw r11.xyzw, r3.w, T0[0].zwxy\n      iadd r4.y, r3.w, l(16)\n      ld_raw r12.xyzw, r4.y, T0[0].zwxy\n      mov r13.xy, r11.zwzz\n      mov r14.xy, r12.zwzz\n    else \n      ld_raw r13.xy, r3.w, T0[0].xyxx\n      iadd r4.y, r2.z, r3.w\n      ld_raw r11.xy, r4.y, T0[0].xyxx\n      ishl r4.yw, l(0, 8, 0, 12), r1.yyyy\n      iadd r4.yw, r3.wwww, r4.yyyw\n      ld_raw r14.xy, r4.y, T0[0].xyxx\n      ld_raw r12.xy, r4.w, T0[0].xyxx\n    endif \n    switch r5.z\n      case l(5)\n      ishl r13.zw, r13.xxxy, l(0, 0, 16, 16)\n      ishr r15.xyzw, r13.zxwy, l(16, 16, 16, 16)\n      itof r15.xyzw, r15.xyzw\n      mul r15.xyzw, r15.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n      max r13.xyzw, r15.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n      ishl r11.zw, r11.xxxy, l(0, 0, 16, 16)\n      ishr r15.xyzw, r11.zxwy, l(16, 16, 16, 16)\n      itof r15.xyzw, r15.xyzw\n      mul r15.xyzw, r15.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n      max r11.xyzw, r15.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n      ishl r14.zw, r14.xxxy, l(0, 0, 16, 16)\n      ishr r15.xyzw, r14.zxwy, l(16, 16, 16, 16)\n      itof r15.xyzw, r15.xyzw\n      mul r15.xyzw, r15.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n      max r14.xyzw, r15.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n      ishl r12.zw, r12.xxxy, l(0, 0, 16, 16)\n      ishr r15.xyzw, r12.zxwy, l(16, 16, 16, 16)\n      itof r15.xyzw, r15.xyzw\n      mul r15.xyzw, r15.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n      max r12.xyzw, r15.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n      break \n      case l(7)\n      ushr r4.yw, r13.xxxy, l(0, 16, 0, 16)\n      f16tof32 r13.xz, r13.xxyx\n      f16tof32 r13.yw, r4.yyyw\n      ushr r4.yw, r11.xxxy, l(0, 16, 0, 16)\n      f16tof32 r11.xz, r11.xxyx\n      f16tof32 r11.yw, r4.yyyw\n      ushr r4.yw, r14.xxxy, l(0, 16, 0, 16)\n      f16tof32 r14.xz, r14.xxyx\n      f16tof32 r14.yw, r4.yyyw\n      ushr r4.yw, r12.xxxy, l(0, 16, 0, 16)\n      f16tof32 r12.xz, r12.xxyx\n      f16tof32 r12.yw, r4.yyyw\n      break \n      default \n      mov r13.zw, l(0,0,0,0)\n      mov r11.zw, l(0,0,0,0)\n      mov r14.zw, l(0,0,0,0)\n      mov r12.zw, l(0,0,0,0)\n      break \n    endswitch \n  else \n    ieq r4.y, r2.z, l(4)\n    if_nz r4.y\n      ld_raw r12.xyzw, r3.w, T0[0].wxyz\n    else \n      ld_raw r12.y, r3.w, T0[0].xxxx\n      iadd r4.y, r2.z, r3.w\n      ld_raw r12.z, r4.y, T0[0].xxxx\n      ishl r4.yw, l(0, 8, 0, 12), r1.yyyy\n      iadd r4.yw, r3.wwww, r4.yyyw\n      ld_raw r12.w, r4.y, T0[0].xxxx\n      ld_raw r12.x, r4.w, T0[0].xxxx\n    endif \n    switch r5.z\n      case l(0)\n      case l(1)\n      ushr r15.yzw, r12.yyyy, l(0, 8, 16, 24)\n      mov r15.x, r12.y\n      and r15.xyzw, r15.xyzw, l(255, 255, 255, 255)\n      utof r15.xyzw, r15.xyzw\n      mul r13.xyzw, r15.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n      ushr r15.yzw, r12.zzzz, l(0, 8, 16, 24)\n      mov r15.x, r12.z\n      and r15.xyzw, r15.xyzw, l(255, 255, 255, 255)\n      utof r15.xyzw, r15.xyzw\n      mul r11.xyzw, r15.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n      ushr r15.yzw, r12.wwww, l(0, 8, 16, 24)\n      mov r15.x, r12.w\n      and r15.xyzw, r15.xyzw, l(255, 255, 255, 255)\n      utof r15.xyzw, r15.xyzw\n      mul r14.xyzw, r15.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n      ushr r12.yzw, r12.xxxx, l(0, 8, 16, 24)\n      and r15.xyzw, r12.xyzw, l(255, 255, 255, 255)\n      utof r15.xyzw, r15.xyzw\n      mul r12.xyzw, r15.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n      break \n      case l(2)\n      case l(10)\n      ushr r15.yzw, r12.yyyy, l(0, 10, 20, 30)\n      mov r15.x, r12.y\n      and r15.xyzw, r15.xyzw, l(1023, 1023, 1023, 3)\n      utof r15.xyzw, r15.xyzw\n      mul r13.xyzw, r15.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n      ushr r15.yzw, r12.zzzz, l(0, 10, 20, 30)\n      mov r15.x, r12.z\n      and r15.xyzw, r15.xyzw, l(1023, 1023, 1023, 3)\n      utof r15.xyzw, r15.xyzw\n      mul r11.xyzw, r15.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n      ushr r15.yzw, r12.wwww, l(0, 10, 20, 30)\n      mov r15.x, r12.w\n      and r15.xyzw, r15.xyzw, l(1023, 1023, 1023, 3)\n      utof r15.xyzw, r15.xyzw\n      mul r14.xyzw, r15.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n      ushr r12.yzw, r12.xxxx, l(0, 10, 20, 30)\n      and r15.xyzw, r12.xyzw, l(1023, 1023, 1023, 3)\n      utof r15.xyzw, r15.xyzw\n      mul r12.xyzw, r15.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n      break \n      case l(3)\n      case l(12)\n      ushr r15.xyzw, r12.yyyz, l(10, 20, 30, 30)\n      mov r16.x, r12.y\n      mov r16.yz, r15.xxyx\n      and r17.xyz, r16.xyzx, l(1023, 1023, 1023, 0)\n      and r18.xyz, r16.xyzx, l(127, 127, 127, 0)\n      ubfe r19.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r16.xyzx\n      firstbit_hi r20.xyz, r18.xyzx\n      iadd r20.xyz, r20.xyzx, l(-24, -24, -24, 0)\n      movc r20.xyz, r18.xyzx, r20.xyzx, l(8,8,8,0)\n      iadd r21.xyz, -r20.xyzx, l(1, 1, 1, 0)\n      movc r21.xyz, r19.xyzx, r19.xyzx, r21.xyzx\n      bfi r16.xyz, l(7, 7, 7, 0), r20.xyzx, r16.xyzx, l(0, 0, 0, 0)\n      and r16.xyz, r16.xyzx, l(127, 127, 127, 0)\n      movc r16.xyz, r19.xyzx, r18.xyzx, r16.xyzx\n      ishl r18.xyz, r21.xyzx, l(23, 23, 23, 0)\n      iadd r18.xyz, r18.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n      ishl r16.xyz, r16.xyzx, l(16, 16, 16, 0)\n      iadd r16.xyz, r18.xyzx, r16.xyzx\n      movc r13.xyz, r17.xyzx, r16.xyzx, l(0,0,0,0)\n      utof r4.yw, r15.zzzw\n      ushr r15.xyzw, r12.zwwz, l(10, 10, 20, 20)\n      mov r16.x, r12.z\n      mov r16.yz, r15.xxwx\n      and r17.xyz, r16.xyzx, l(1023, 1023, 1023, 0)\n      and r18.xyz, r16.xyzx, l(127, 127, 127, 0)\n      ubfe r19.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r16.xyzx\n      firstbit_hi r20.xyz, r18.xyzx\n      iadd r20.xyz, r20.xyzx, l(-24, -24, -24, 0)\n      movc r20.xyz, r18.xyzx, r20.xyzx, l(8,8,8,0)\n      iadd r21.xyz, -r20.xyzx, l(1, 1, 1, 0)\n      movc r21.xyz, r19.xyzx, r19.xyzx, r21.xyzx\n      bfi r16.xyz, l(7, 7, 7, 0), r20.xyzx, r16.xyzx, l(0, 0, 0, 0)\n      and r16.xyz, r16.xyzx, l(127, 127, 127, 0)\n      movc r16.xyz, r19.xyzx, r18.xyzx, r16.xyzx\n      ishl r18.xyz, r21.xyzx, l(23, 23, 23, 0)\n      iadd r18.xyz, r18.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n      ishl r16.xyz, r16.xyzx, l(16, 16, 16, 0)\n      iadd r16.xyz, r18.xyzx, r16.xyzx\n      movc r11.xyz, r17.xyzx, r16.xyzx, l(0,0,0,0)\n      mul r4.yw, r4.yyyw, l(0.000000, 0.333333, 0.000000, 0.333333)\n      mov r15.x, r12.w\n      and r16.xyz, r15.xyzx, l(1023, 1023, 1023, 0)\n      and r17.xyz, r15.xyzx, l(127, 127, 127, 0)\n      ubfe r18.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r15.xyzx\n      firstbit_hi r19.xyz, r17.xyzx\n      iadd r19.xyz, r19.xyzx, l(-24, -24, -24, 0)\n      movc r19.xyz, r17.xyzx, r19.xyzx, l(8,8,8,0)\n      iadd r20.xyz, -r19.xyzx, l(1, 1, 1, 0)\n      movc r20.xyz, r18.xyzx, r18.xyzx, r20.xyzx\n      bfi r15.xyz, l(7, 7, 7, 0), r19.xyzx, r15.xyzx, l(0, 0, 0, 0)\n      and r15.xyz, r15.xyzx, l(127, 127, 127, 0)\n      movc r15.xyz, r18.xyzx, r17.xyzx, r15.xyzx\n      ishl r17.xyz, r20.xyzx, l(23, 23, 23, 0)\n      iadd r17.xyz, r17.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n      ishl r15.xyz, r15.xyzx, l(16, 16, 16, 0)\n      iadd r15.xyz, r17.xyzx, r15.xyzx\n      movc r14.xyz, r16.xyzx, r15.xyzx, l(0,0,0,0)\n      ushr r15.xyzw, r12.wxxx, l(30, 10, 20, 30)\n      utof r5.xy, r15.xwxx\n      mov r15.x, r12.x\n      and r16.xyz, r15.xyzx, l(1023, 1023, 1023, 0)\n      and r17.xyz, r15.xyzx, l(127, 127, 127, 0)\n      ubfe r18.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r15.xyzx\n      firstbit_hi r19.xyz, r17.xyzx\n      iadd r19.xyz, r19.xyzx, l(-24, -24, -24, 0)\n      movc r19.xyz, r17.xyzx, r19.xyzx, l(8,8,8,0)\n      iadd r20.xyz, -r19.xyzx, l(1, 1, 1, 0)\n      movc r20.xyz, r18.xyzx, r18.xyzx, r20.xyzx\n      bfi r15.xyz, l(7, 7, 7, 0), r19.xyzx, r15.xyzx, l(0, 0, 0, 0)\n      and r15.xyz, r15.xyzx, l(127, 127, 127, 0)\n      movc r15.xyz, r18.xyzx, r17.xyzx, r15.xyzx\n      ishl r17.xyz, r20.xyzx, l(23, 23, 23, 0)\n      iadd r17.xyz, r17.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n      ishl r15.xyz, r15.xyzx, l(16, 16, 16, 0)\n      iadd r15.xyz, r17.xyzx, r15.xyzx\n      movc r12.xyz, r16.xyzx, r15.xyzx, l(0,0,0,0)\n      mul r5.xy, r5.xyxx, l(0.333333, 0.333333, 0.000000, 0.000000)\n      mov r13.w, r4.y\n      mov r11.w, r4.w\n      mov r14.w, r5.x\n      mov r12.w, r5.y\n      break \n      case l(4)\n      ishl r15.xyzw, r12.yzwx, l(16, 16, 16, 16)\n      mov r16.xz, r15.xxyx\n      mov r16.yw, r12.yyyz\n      ishr r16.xyzw, r16.xyzw, l(16, 16, 16, 16)\n      itof r16.xyzw, r16.xyzw\n      mul r16.xyzw, r16.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n      max r13.xy, r16.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n      max r11.xy, r16.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n      mov r12.yz, r15.zzwz\n      ishr r15.xyzw, r12.ywzx, l(16, 16, 16, 16)\n      itof r15.xyzw, r15.xyzw\n      mul r15.xyzw, r15.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n      max r14.xy, r15.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n      max r12.xy, r15.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n      mov r13.zw, l(0,0,0,0)\n      mov r11.zw, l(0,0,0,0)\n      mov r14.zw, l(0,0,0,0)\n      mov r12.zw, l(0,0,0,0)\n      break \n      case l(6)\n      ushr r15.xyzw, r12.yzwx, l(16, 16, 16, 16)\n      f16tof32 r13.x, r12.y\n      f16tof32 r13.y, r15.x\n      f16tof32 r11.x, r12.z\n      f16tof32 r11.y, r15.y\n      f16tof32 r14.x, r12.w\n      f16tof32 r14.y, r15.z\n      f16tof32 r12.x, r12.x\n      f16tof32 r12.y, r15.w\n      mov r13.zw, l(0,0,0,0)\n      mov r11.zw, l(0,0,0,0)\n      mov r14.zw, l(0,0,0,0)\n      mov r12.zw, l(0,0,0,0)\n      break \n      default \n      mov r13.x, r12.y\n      mov r13.yzw, l(0,0,0,0)\n      mov r11.x, r12.z\n      mov r11.yzw, l(0,0,0,0)\n      mov r14.x, r12.w\n      mov r14.yzw, l(0,0,0,0)\n      mov r12.yzw, l(0,0,0,0)\n      break \n    endswitch \n  endif \n  add r9.xyzw, r9.xyzw, r13.xyzw\n  add r7.xyzw, r7.xyzw, r11.xyzw\n  add r10.xyzw, r10.xyzw, r14.xyzw\n  add r8.xyzw, r8.xyzw, r12.xyzw\n  uge r4.y, r6.y, l(6)\n  if_nz r4.y\n    ishl r4.y, l(4), r5.w\n    mul r0.z, r0.z, l(0.250000)\n    iadd r0.y, r0.y, r4.y\n    if_nz r5.w\n      ieq r4.w, r2.z, l(8)\n      if_nz r4.w\n        ld_raw r11.xyzw, r0.y, T0[0].zwxy\n        iadd r4.w, r0.y, l(16)\n        ld_raw r12.xyzw, r4.w, T0[0].zwxy\n        mov r13.xy, r11.zwzz\n        mov r14.xy, r12.zwzz\n      else \n        ld_raw r13.xy, r0.y, T0[0].xyxx\n        iadd r4.w, r2.z, r0.y\n        ld_raw r11.xy, r4.w, T0[0].xyxx\n        ishl r5.xy, l(8, 12, 0, 0), r1.yyyy\n        iadd r5.xy, r0.yyyy, r5.xyxx\n        ld_raw r14.xy, r5.x, T0[0].xyxx\n        ld_raw r12.xy, r5.y, T0[0].xyxx\n      endif \n      switch r5.z\n        case l(5)\n        ishl r13.zw, r13.xxxy, l(0, 0, 16, 16)\n        ishr r15.xyzw, r13.zxwy, l(16, 16, 16, 16)\n        itof r15.xyzw, r15.xyzw\n        mul r15.xyzw, r15.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r13.xyzw, r15.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        ishl r11.zw, r11.xxxy, l(0, 0, 16, 16)\n        ishr r15.xyzw, r11.zxwy, l(16, 16, 16, 16)\n        itof r15.xyzw, r15.xyzw\n        mul r15.xyzw, r15.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r11.xyzw, r15.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        ishl r14.zw, r14.xxxy, l(0, 0, 16, 16)\n        ishr r15.xyzw, r14.zxwy, l(16, 16, 16, 16)\n        itof r15.xyzw, r15.xyzw\n        mul r15.xyzw, r15.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r14.xyzw, r15.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        ishl r12.zw, r12.xxxy, l(0, 0, 16, 16)\n        ishr r15.xyzw, r12.zxwy, l(16, 16, 16, 16)\n        itof r15.xyzw, r15.xyzw\n        mul r15.xyzw, r15.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r12.xyzw, r15.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        break \n        case l(7)\n        ushr r5.xy, r13.xyxx, l(16, 16, 0, 0)\n        f16tof32 r13.xz, r13.xxyx\n        f16tof32 r13.yw, r5.xxxy\n        ushr r5.xy, r11.xyxx, l(16, 16, 0, 0)\n        f16tof32 r11.xz, r11.xxyx\n        f16tof32 r11.yw, r5.xxxy\n        ushr r5.xy, r14.xyxx, l(16, 16, 0, 0)\n        f16tof32 r14.xz, r14.xxyx\n        f16tof32 r14.yw, r5.xxxy\n        ushr r5.xy, r12.xyxx, l(16, 16, 0, 0)\n        f16tof32 r12.xz, r12.xxyx\n        f16tof32 r12.yw, r5.xxxy\n        break \n        default \n        mov r13.zw, l(0,0,0,0)\n        mov r11.zw, l(0,0,0,0)\n        mov r14.zw, l(0,0,0,0)\n        mov r12.zw, l(0,0,0,0)\n        break \n      endswitch \n    else \n      ieq r4.w, r2.z, l(4)\n      if_nz r4.w\n        ld_raw r12.xyzw, r0.y, T0[0].wxyz\n      else \n        ld_raw r12.y, r0.y, T0[0].xxxx\n        iadd r4.w, r2.z, r0.y\n        ld_raw r12.z, r4.w, T0[0].xxxx\n        ishl r5.xy, l(8, 12, 0, 0), r1.yyyy\n        iadd r5.xy, r0.yyyy, r5.xyxx\n        ld_raw r12.w, r5.x, T0[0].xxxx\n        ld_raw r12.x, r5.y, T0[0].xxxx\n      endif \n      switch r5.z\n        case l(0)\n        case l(1)\n        ushr r15.yzw, r12.yyyy, l(0, 8, 16, 24)\n        mov r15.x, r12.y\n        and r15.xyzw, r15.xyzw, l(255, 255, 255, 255)\n        utof r15.xyzw, r15.xyzw\n        mul r13.xyzw, r15.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        ushr r15.yzw, r12.zzzz, l(0, 8, 16, 24)\n        mov r15.x, r12.z\n        and r15.xyzw, r15.xyzw, l(255, 255, 255, 255)\n        utof r15.xyzw, r15.xyzw\n        mul r11.xyzw, r15.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        ushr r15.yzw, r12.wwww, l(0, 8, 16, 24)\n        mov r15.x, r12.w\n        and r15.xyzw, r15.xyzw, l(255, 255, 255, 255)\n        utof r15.xyzw, r15.xyzw\n        mul r14.xyzw, r15.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        ushr r12.yzw, r12.xxxx, l(0, 8, 16, 24)\n        and r15.xyzw, r12.xyzw, l(255, 255, 255, 255)\n        utof r15.xyzw, r15.xyzw\n        mul r12.xyzw, r15.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        break \n        case l(2)\n        case l(10)\n        ushr r15.yzw, r12.yyyy, l(0, 10, 20, 30)\n        mov r15.x, r12.y\n        and r15.xyzw, r15.xyzw, l(1023, 1023, 1023, 3)\n        utof r15.xyzw, r15.xyzw\n        mul r13.xyzw, r15.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        ushr r15.yzw, r12.zzzz, l(0, 10, 20, 30)\n        mov r15.x, r12.z\n        and r15.xyzw, r15.xyzw, l(1023, 1023, 1023, 3)\n        utof r15.xyzw, r15.xyzw\n        mul r11.xyzw, r15.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        ushr r15.yzw, r12.wwww, l(0, 10, 20, 30)\n        mov r15.x, r12.w\n        and r15.xyzw, r15.xyzw, l(1023, 1023, 1023, 3)\n        utof r15.xyzw, r15.xyzw\n        mul r14.xyzw, r15.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        ushr r12.yzw, r12.xxxx, l(0, 10, 20, 30)\n        and r15.xyzw, r12.xyzw, l(1023, 1023, 1023, 3)\n        utof r15.xyzw, r15.xyzw\n        mul r12.xyzw, r15.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        break \n        case l(3)\n        case l(12)\n        ushr r15.xyzw, r12.yyyz, l(10, 20, 30, 30)\n        mov r16.x, r12.y\n        mov r16.yz, r15.xxyx\n        and r6.yzw, r16.xxyz, l(0, 1023, 1023, 1023)\n        and r17.xyz, r16.xyzx, l(127, 127, 127, 0)\n        ubfe r18.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r16.xyzx\n        firstbit_hi r19.xyz, r17.xyzx\n        iadd r19.xyz, r19.xyzx, l(-24, -24, -24, 0)\n        movc r19.xyz, r17.xyzx, r19.xyzx, l(8,8,8,0)\n        iadd r20.xyz, -r19.xyzx, l(1, 1, 1, 0)\n        movc r20.xyz, r18.xyzx, r18.xyzx, r20.xyzx\n        bfi r16.xyz, l(7, 7, 7, 0), r19.xyzx, r16.xyzx, l(0, 0, 0, 0)\n        and r16.xyz, r16.xyzx, l(127, 127, 127, 0)\n        movc r16.xyz, r18.xyzx, r17.xyzx, r16.xyzx\n        ishl r17.xyz, r20.xyzx, l(23, 23, 23, 0)\n        iadd r17.xyz, r17.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r16.xyz, r16.xyzx, l(16, 16, 16, 0)\n        iadd r16.xyz, r17.xyzx, r16.xyzx\n        movc r13.xyz, r6.yzwy, r16.xyzx, l(0,0,0,0)\n        utof r5.xy, r15.zwzz\n        ushr r15.xyzw, r12.zwwz, l(10, 10, 20, 20)\n        mov r16.x, r12.z\n        mov r16.yz, r15.xxwx\n        and r6.yzw, r16.xxyz, l(0, 1023, 1023, 1023)\n        and r17.xyz, r16.xyzx, l(127, 127, 127, 0)\n        ubfe r18.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r16.xyzx\n        firstbit_hi r19.xyz, r17.xyzx\n        iadd r19.xyz, r19.xyzx, l(-24, -24, -24, 0)\n        movc r19.xyz, r17.xyzx, r19.xyzx, l(8,8,8,0)\n        iadd r20.xyz, -r19.xyzx, l(1, 1, 1, 0)\n        movc r20.xyz, r18.xyzx, r18.xyzx, r20.xyzx\n        bfi r16.xyz, l(7, 7, 7, 0), r19.xyzx, r16.xyzx, l(0, 0, 0, 0)\n        and r16.xyz, r16.xyzx, l(127, 127, 127, 0)\n        movc r16.xyz, r18.xyzx, r17.xyzx, r16.xyzx\n        ishl r17.xyz, r20.xyzx, l(23, 23, 23, 0)\n        iadd r17.xyz, r17.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r16.xyz, r16.xyzx, l(16, 16, 16, 0)\n        iadd r16.xyz, r17.xyzx, r16.xyzx\n        movc r11.xyz, r6.yzwy, r16.xyzx, l(0,0,0,0)\n        mul r5.xy, r5.xyxx, l(0.333333, 0.333333, 0.000000, 0.000000)\n        mov r15.x, r12.w\n        and r6.yzw, r15.xxyz, l(0, 1023, 1023, 1023)\n        and r16.xyz, r15.xyzx, l(127, 127, 127, 0)\n        ubfe r17.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r15.xyzx\n        firstbit_hi r18.xyz, r16.xyzx\n        iadd r18.xyz, r18.xyzx, l(-24, -24, -24, 0)\n        movc r18.xyz, r16.xyzx, r18.xyzx, l(8,8,8,0)\n        iadd r19.xyz, -r18.xyzx, l(1, 1, 1, 0)\n        movc r19.xyz, r17.xyzx, r17.xyzx, r19.xyzx\n        bfi r15.xyz, l(7, 7, 7, 0), r18.xyzx, r15.xyzx, l(0, 0, 0, 0)\n        and r15.xyz, r15.xyzx, l(127, 127, 127, 0)\n        movc r15.xyz, r17.xyzx, r16.xyzx, r15.xyzx\n        ishl r16.xyz, r19.xyzx, l(23, 23, 23, 0)\n        iadd r16.xyz, r16.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r15.xyz, r15.xyzx, l(16, 16, 16, 0)\n        iadd r15.xyz, r16.xyzx, r15.xyzx\n        movc r14.xyz, r6.yzwy, r15.xyzx, l(0,0,0,0)\n        ushr r15.xyzw, r12.wxxx, l(30, 10, 20, 30)\n        utof r6.yz, r15.xxwx\n        mov r15.x, r12.x\n        and r16.xyz, r15.xyzx, l(1023, 1023, 1023, 0)\n        and r17.xyz, r15.xyzx, l(127, 127, 127, 0)\n        ubfe r18.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r15.xyzx\n        firstbit_hi r19.xyz, r17.xyzx\n        iadd r19.xyz, r19.xyzx, l(-24, -24, -24, 0)\n        movc r19.xyz, r17.xyzx, r19.xyzx, l(8,8,8,0)\n        iadd r20.xyz, -r19.xyzx, l(1, 1, 1, 0)\n        movc r20.xyz, r18.xyzx, r18.xyzx, r20.xyzx\n        bfi r15.xyz, l(7, 7, 7, 0), r19.xyzx, r15.xyzx, l(0, 0, 0, 0)\n        and r15.xyz, r15.xyzx, l(127, 127, 127, 0)\n        movc r15.xyz, r18.xyzx, r17.xyzx, r15.xyzx\n        ishl r17.xyz, r20.xyzx, l(23, 23, 23, 0)\n        iadd r17.xyz, r17.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r15.xyz, r15.xyzx, l(16, 16, 16, 0)\n        iadd r15.xyz, r17.xyzx, r15.xyzx\n        movc r12.xyz, r16.xyzx, r15.xyzx, l(0,0,0,0)\n        mul r6.yz, r6.yyzy, l(0.000000, 0.333333, 0.333333, 0.000000)\n        mov r13.w, r5.x\n        mov r11.w, r5.y\n        mov r14.w, r6.y\n        mov r12.w, r6.z\n        break \n        case l(4)\n        ishl r15.xyzw, r12.yzwx, l(16, 16, 16, 16)\n        mov r16.xz, r15.xxyx\n        mov r16.yw, r12.yyyz\n        ishr r16.xyzw, r16.xyzw, l(16, 16, 16, 16)\n        itof r16.xyzw, r16.xyzw\n        mul r16.xyzw, r16.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r13.xy, r16.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        max r11.xy, r16.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        mov r12.yz, r15.zzwz\n        ishr r15.xyzw, r12.ywzx, l(16, 16, 16, 16)\n        itof r15.xyzw, r15.xyzw\n        mul r15.xyzw, r15.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r14.xy, r15.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        max r12.xy, r15.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        mov r13.zw, l(0,0,0,0)\n        mov r11.zw, l(0,0,0,0)\n        mov r14.zw, l(0,0,0,0)\n        mov r12.zw, l(0,0,0,0)\n        break \n        case l(6)\n        ushr r15.xyzw, r12.yzwx, l(16, 16, 16, 16)\n        f16tof32 r13.x, r12.y\n        f16tof32 r13.y, r15.x\n        f16tof32 r11.x, r12.z\n        f16tof32 r11.y, r15.y\n        f16tof32 r14.x, r12.w\n        f16tof32 r14.y, r15.z\n        f16tof32 r12.x, r12.x\n        f16tof32 r12.y, r15.w\n        mov r13.zw, l(0,0,0,0)\n        mov r11.zw, l(0,0,0,0)\n        mov r14.zw, l(0,0,0,0)\n        mov r12.zw, l(0,0,0,0)\n        break \n        default \n        mov r13.x, r12.y\n        mov r13.yzw, l(0,0,0,0)\n        mov r11.x, r12.z\n        mov r11.yzw, l(0,0,0,0)\n        mov r14.x, r12.w\n        mov r14.yzw, l(0,0,0,0)\n        mov r12.yzw, l(0,0,0,0)\n        break \n      endswitch \n    endif \n    add r13.xyzw, r9.xyzw, r13.xyzw\n    add r11.xyzw, r7.xyzw, r11.xyzw\n    add r14.xyzw, r10.xyzw, r14.xyzw\n    add r12.xyzw, r8.xyzw, r12.xyzw\n    iadd r0.y, r3.w, r4.y\n    if_nz r5.w\n      ieq r3.w, r2.z, l(8)\n      if_nz r3.w\n        ld_raw r15.xyzw, r0.y, T0[0].zwxy\n        iadd r3.w, r0.y, l(16)\n        ld_raw r16.xyzw, r3.w, T0[0].zwxy\n        mov r17.xy, r15.zwzz\n        mov r18.xy, r16.zwzz\n      else \n        ld_raw r17.xy, r0.y, T0[0].xyxx\n        iadd r3.w, r2.z, r0.y\n        ld_raw r15.xy, r3.w, T0[0].xyxx\n        ishl r4.yw, l(0, 8, 0, 12), r1.yyyy\n        iadd r4.yw, r0.yyyy, r4.yyyw\n        ld_raw r18.xy, r4.y, T0[0].xyxx\n        ld_raw r16.xy, r4.w, T0[0].xyxx\n      endif \n      switch r5.z\n        case l(5)\n        ishl r17.zw, r17.xxxy, l(0, 0, 16, 16)\n        ishr r19.xyzw, r17.zxwy, l(16, 16, 16, 16)\n        itof r19.xyzw, r19.xyzw\n        mul r19.xyzw, r19.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r17.xyzw, r19.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        ishl r15.zw, r15.xxxy, l(0, 0, 16, 16)\n        ishr r19.xyzw, r15.zxwy, l(16, 16, 16, 16)\n        itof r19.xyzw, r19.xyzw\n        mul r19.xyzw, r19.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r15.xyzw, r19.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        ishl r18.zw, r18.xxxy, l(0, 0, 16, 16)\n        ishr r19.xyzw, r18.zxwy, l(16, 16, 16, 16)\n        itof r19.xyzw, r19.xyzw\n        mul r19.xyzw, r19.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r18.xyzw, r19.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        ishl r16.zw, r16.xxxy, l(0, 0, 16, 16)\n        ishr r19.xyzw, r16.zxwy, l(16, 16, 16, 16)\n        itof r19.xyzw, r19.xyzw\n        mul r19.xyzw, r19.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r16.xyzw, r19.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        break \n        case l(7)\n        ushr r4.yw, r17.xxxy, l(0, 16, 0, 16)\n        f16tof32 r17.xz, r17.xxyx\n        f16tof32 r17.yw, r4.yyyw\n        ushr r4.yw, r15.xxxy, l(0, 16, 0, 16)\n        f16tof32 r15.xz, r15.xxyx\n        f16tof32 r15.yw, r4.yyyw\n        ushr r4.yw, r18.xxxy, l(0, 16, 0, 16)\n        f16tof32 r18.xz, r18.xxyx\n        f16tof32 r18.yw, r4.yyyw\n        ushr r4.yw, r16.xxxy, l(0, 16, 0, 16)\n        f16tof32 r16.xz, r16.xxyx\n        f16tof32 r16.yw, r4.yyyw\n        break \n        default \n        mov r17.zw, l(0,0,0,0)\n        mov r15.zw, l(0,0,0,0)\n        mov r18.zw, l(0,0,0,0)\n        mov r16.zw, l(0,0,0,0)\n        break \n      endswitch \n    else \n      ieq r3.w, r2.z, l(4)\n      if_nz r3.w\n        ld_raw r16.xyzw, r0.y, T0[0].wxyz\n      else \n        ld_raw r16.y, r0.y, T0[0].xxxx\n        iadd r2.z, r2.z, r0.y\n        ld_raw r16.z, r2.z, T0[0].xxxx\n        ishl r4.yw, l(0, 8, 0, 12), r1.yyyy\n        iadd r4.yw, r0.yyyy, r4.yyyw\n        ld_raw r16.w, r4.y, T0[0].xxxx\n        ld_raw r16.x, r4.w, T0[0].xxxx\n      endif \n      switch r5.z\n        case l(0)\n        case l(1)\n        ushr r5.yzw, r16.yyyy, l(0, 8, 16, 24)\n        mov r5.x, r16.y\n        and r5.xyzw, r5.xyzw, l(255, 255, 255, 255)\n        utof r5.xyzw, r5.xyzw\n        mul r17.xyzw, r5.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        ushr r5.yzw, r16.zzzz, l(0, 8, 16, 24)\n        mov r5.x, r16.z\n        and r5.xyzw, r5.xyzw, l(255, 255, 255, 255)\n        utof r5.xyzw, r5.xyzw\n        mul r15.xyzw, r5.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        ushr r5.yzw, r16.wwww, l(0, 8, 16, 24)\n        mov r5.x, r16.w\n        and r5.xyzw, r5.xyzw, l(255, 255, 255, 255)\n        utof r5.xyzw, r5.xyzw\n        mul r18.xyzw, r5.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        ushr r16.yzw, r16.xxxx, l(0, 8, 16, 24)\n        and r5.xyzw, r16.xyzw, l(255, 255, 255, 255)\n        utof r5.xyzw, r5.xyzw\n        mul r16.xyzw, r5.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        break \n        case l(2)\n        case l(10)\n        ushr r5.yzw, r16.yyyy, l(0, 10, 20, 30)\n        mov r5.x, r16.y\n        and r5.xyzw, r5.xyzw, l(1023, 1023, 1023, 3)\n        utof r5.xyzw, r5.xyzw\n        mul r17.xyzw, r5.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        ushr r5.yzw, r16.zzzz, l(0, 10, 20, 30)\n        mov r5.x, r16.z\n        and r5.xyzw, r5.xyzw, l(1023, 1023, 1023, 3)\n        utof r5.xyzw, r5.xyzw\n        mul r15.xyzw, r5.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        ushr r5.yzw, r16.wwww, l(0, 10, 20, 30)\n        mov r5.x, r16.w\n        and r5.xyzw, r5.xyzw, l(1023, 1023, 1023, 3)\n        utof r5.xyzw, r5.xyzw\n        mul r18.xyzw, r5.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        ushr r16.yzw, r16.xxxx, l(0, 10, 20, 30)\n        and r5.xyzw, r16.xyzw, l(1023, 1023, 1023, 3)\n        utof r5.xyzw, r5.xyzw\n        mul r16.xyzw, r5.xyzw, l(0.000978, 0.000978, 0.000978, 0.333333)\n        break \n        case l(3)\n        case l(12)\n        ushr r5.xyzw, r16.yyyz, l(10, 20, 30, 30)\n        mov r19.x, r16.y\n        mov r19.yz, r5.xxyx\n        and r6.yzw, r19.xxyz, l(0, 1023, 1023, 1023)\n        and r20.xyz, r19.xyzx, l(127, 127, 127, 0)\n        ubfe r21.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r19.xyzx\n        firstbit_hi r22.xyz, r20.xyzx\n        iadd r22.xyz, r22.xyzx, l(-24, -24, -24, 0)\n        movc r22.xyz, r20.xyzx, r22.xyzx, l(8,8,8,0)\n        iadd r23.xyz, -r22.xyzx, l(1, 1, 1, 0)\n        movc r23.xyz, r21.xyzx, r21.xyzx, r23.xyzx\n        bfi r19.xyz, l(7, 7, 7, 0), r22.xyzx, r19.xyzx, l(0, 0, 0, 0)\n        and r19.xyz, r19.xyzx, l(127, 127, 127, 0)\n        movc r19.xyz, r21.xyzx, r20.xyzx, r19.xyzx\n        ishl r20.xyz, r23.xyzx, l(23, 23, 23, 0)\n        iadd r20.xyz, r20.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r19.xyz, r19.xyzx, l(16, 16, 16, 0)\n        iadd r19.xyz, r20.xyzx, r19.xyzx\n        movc r17.xyz, r6.yzwy, r19.xyzx, l(0,0,0,0)\n        utof r4.yw, r5.zzzw\n        ushr r5.xyzw, r16.zwwz, l(10, 10, 20, 20)\n        mov r19.x, r16.z\n        mov r19.yz, r5.xxwx\n        and r6.yzw, r19.xxyz, l(0, 1023, 1023, 1023)\n        and r20.xyz, r19.xyzx, l(127, 127, 127, 0)\n        ubfe r21.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r19.xyzx\n        firstbit_hi r22.xyz, r20.xyzx\n        iadd r22.xyz, r22.xyzx, l(-24, -24, -24, 0)\n        movc r22.xyz, r20.xyzx, r22.xyzx, l(8,8,8,0)\n        iadd r23.xyz, -r22.xyzx, l(1, 1, 1, 0)\n        movc r23.xyz, r21.xyzx, r21.xyzx, r23.xyzx\n        bfi r19.xyz, l(7, 7, 7, 0), r22.xyzx, r19.xyzx, l(0, 0, 0, 0)\n        and r19.xyz, r19.xyzx, l(127, 127, 127, 0)\n        movc r19.xyz, r21.xyzx, r20.xyzx, r19.xyzx\n        ishl r20.xyz, r23.xyzx, l(23, 23, 23, 0)\n        iadd r20.xyz, r20.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r19.xyz, r19.xyzx, l(16, 16, 16, 0)\n        iadd r19.xyz, r20.xyzx, r19.xyzx\n        movc r15.xyz, r6.yzwy, r19.xyzx, l(0,0,0,0)\n        mul r4.yw, r4.yyyw, l(0.000000, 0.333333, 0.000000, 0.333333)\n        mov r5.x, r16.w\n        and r6.yzw, r5.xxyz, l(0, 1023, 1023, 1023)\n        and r19.xyz, r5.xyzx, l(127, 127, 127, 0)\n        ubfe r20.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r5.xyzx\n        firstbit_hi r21.xyz, r19.xyzx\n        iadd r21.xyz, r21.xyzx, l(-24, -24, -24, 0)\n        movc r21.xyz, r19.xyzx, r21.xyzx, l(8,8,8,0)\n        iadd r22.xyz, -r21.xyzx, l(1, 1, 1, 0)\n        movc r22.xyz, r20.xyzx, r20.xyzx, r22.xyzx\n        bfi r5.xyz, l(7, 7, 7, 0), r21.xyzx, r5.xyzx, l(0, 0, 0, 0)\n        and r5.xyz, r5.xyzx, l(127, 127, 127, 0)\n        movc r5.xyz, r20.xyzx, r19.xyzx, r5.xyzx\n        ishl r19.xyz, r22.xyzx, l(23, 23, 23, 0)\n        iadd r19.xyz, r19.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r5.xyz, r5.xyzx, l(16, 16, 16, 0)\n        iadd r5.xyz, r19.xyzx, r5.xyzx\n        movc r18.xyz, r6.yzwy, r5.xyzx, l(0,0,0,0)\n        ushr r5.xyzw, r16.wxxx, l(30, 10, 20, 30)\n        utof r6.yz, r5.xxwx\n        mov r5.x, r16.x\n        and r19.xyz, r5.xyzx, l(1023, 1023, 1023, 0)\n        and r20.xyz, r5.xyzx, l(127, 127, 127, 0)\n        ubfe r21.xyz, l(3, 3, 3, 0), l(7, 7, 7, 0), r5.xyzx\n        firstbit_hi r22.xyz, r20.xyzx\n        iadd r22.xyz, r22.xyzx, l(-24, -24, -24, 0)\n        movc r22.xyz, r20.xyzx, r22.xyzx, l(8,8,8,0)\n        iadd r23.xyz, -r22.xyzx, l(1, 1, 1, 0)\n        movc r23.xyz, r21.xyzx, r21.xyzx, r23.xyzx\n        bfi r5.xyz, l(7, 7, 7, 0), r22.xyzx, r5.xyzx, l(0, 0, 0, 0)\n        and r5.xyz, r5.xyzx, l(127, 127, 127, 0)\n        movc r5.xyz, r21.xyzx, r20.xyzx, r5.xyzx\n        ishl r20.xyz, r23.xyzx, l(23, 23, 23, 0)\n        iadd r20.xyz, r20.xyzx, l(0x3e000000, 0x3e000000, 0x3e000000, 0)\n        ishl r5.xyz, r5.xyzx, l(16, 16, 16, 0)\n        iadd r5.xyz, r20.xyzx, r5.xyzx\n        movc r16.xyz, r19.xyzx, r5.xyzx, l(0,0,0,0)\n        mul r5.xy, r6.yzyy, l(0.333333, 0.333333, 0.000000, 0.000000)\n        mov r17.w, r4.y\n        mov r15.w, r4.w\n        mov r18.w, r5.x\n        mov r16.w, r5.y\n        break \n        case l(4)\n        ishl r5.xyzw, r16.yzwx, l(16, 16, 16, 16)\n        mov r19.xz, r5.xxyx\n        mov r19.yw, r16.yyyz\n        ishr r19.xyzw, r19.xyzw, l(16, 16, 16, 16)\n        itof r19.xyzw, r19.xyzw\n        mul r19.xyzw, r19.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r17.xy, r19.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        max r15.xy, r19.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        mov r16.yz, r5.zzwz\n        ishr r5.xyzw, r16.ywzx, l(16, 16, 16, 16)\n        itof r5.xyzw, r5.xyzw\n        mul r5.xyzw, r5.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r18.xy, r5.xyxx, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        max r16.xy, r5.zwzz, l(-1.000000, -1.000000, 0.000000, 0.000000)\n        mov r17.zw, l(0,0,0,0)\n        mov r15.zw, l(0,0,0,0)\n        mov r18.zw, l(0,0,0,0)\n        mov r16.zw, l(0,0,0,0)\n        break \n        case l(6)\n        ushr r5.xyzw, r16.yzwx, l(16, 16, 16, 16)\n        f16tof32 r17.x, r16.y\n        f16tof32 r17.y, r5.x\n        f16tof32 r15.x, r16.z\n        f16tof32 r15.y, r5.y\n        f16tof32 r18.x, r16.w\n        f16tof32 r18.y, r5.z\n        f16tof32 r16.x, r16.x\n        f16tof32 r16.y, r5.w\n        mov r17.zw, l(0,0,0,0)\n        mov r15.zw, l(0,0,0,0)\n        mov r18.zw, l(0,0,0,0)\n        mov r16.zw, l(0,0,0,0)\n        break \n        default \n        mov r17.x, r16.y\n        mov r17.yzw, l(0,0,0,0)\n        mov r15.x, r16.z\n        mov r15.yzw, l(0,0,0,0)\n        mov r18.x, r16.w\n        mov r18.yzw, l(0,0,0,0)\n        mov r16.yzw, l(0,0,0,0)\n        break \n      endswitch \n    endif \n    add r9.xyzw, r13.xyzw, r17.xyzw\n    add r7.xyzw, r11.xyzw, r15.xyzw\n    add r10.xyzw, r14.xyzw, r18.xyzw\n    add r8.xyzw, r12.xyzw, r16.xyzw\n  else \n    mov r0.z, r2.w\n  endif \nendif \nmul r5.xyzw, r0.zzzz, r9.xyzw\nmul r7.xyzw, r0.zzzz, r7.wyxz\nmul r9.xyzw, r0.zzzz, r10.xyzw\nmul r8.xyzw, r0.zzzz, r8.xzwy\nif_nz r1.z\n  mov r5.xz, r5.zzxz\n  mov r10.xz, r7.wwzw\n  mov r9.xz, r9.zzxz\n  mov r11.xz, r8.yyxy\nelse \n  mov r10.xz, r7.zzwz\n  mov r11.xz, r8.xxyx\nendif \nswitch r6.x\n  case l(26)\n  mov_sat r5.xyzw, r5.xyzw\n  mad r6.xyzw, r5.xyzw, l(65535.000000, 65535.000000, 65535.000000, 65535.000000), l(0.500000, 0.500000, 0.500000, 0.500000)\n  ftou r6.xyzw, r6.xyzw\n  imad r7.zw, r6.yyyw, l(0, 0, 0x00010000, 0x00010000), r6.xxxz\n  mov r10.yw, r7.yyyx\n  mov_sat r10.xyzw, r10.xyzw\n  mad r6.xyzw, r10.xyzw, l(65535.000000, 65535.000000, 65535.000000, 65535.000000), l(0.500000, 0.500000, 0.500000, 0.500000)\n  ftou r6.xyzw, r6.xyzw\n  imad r7.xy, r6.ywyy, l(0x00010000, 0x00010000, 0, 0), r6.xzxx\n  mov_sat r9.xyzw, r9.xyzw\n  mad r6.xyzw, r9.xyzw, l(65535.000000, 65535.000000, 65535.000000, 65535.000000), l(0.500000, 0.500000, 0.500000, 0.500000)\n  ftou r6.xyzw, r6.xyzw\n  imad r8.xy, r6.ywyy, l(0x00010000, 0x00010000, 0, 0), r6.xzxx\n  mov r11.yw, r8.wwwz\n  mov_sat r11.xyzw, r11.xyzw\n  mad r6.xyzw, r11.xyzw, l(65535.000000, 65535.000000, 65535.000000, 65535.000000), l(0.500000, 0.500000, 0.500000, 0.500000)\n  ftou r6.xyzw, r6.xyzw\n  imad r8.zw, r6.yyyw, l(0, 0, 0x00010000, 0x00010000), r6.xxxz\n  break \n  case l(32)\n  f32tof16 r0.yz, r5.xxzx\n  f32tof16 r1.yz, r5.yywy\n  imad r7.zw, r1.yyyz, l(0, 0, 0x00010000, 0x00010000), r0.yyyz\n  f32tof16 r0.yz, r10.xxzx\n  f32tof16 r1.yz, r7.yyxy\n  imad r7.xy, r1.yzyy, l(0x00010000, 0x00010000, 0, 0), r0.yzyy\n  f32tof16 r0.yz, r9.xxzx\n  f32tof16 r1.yz, r9.yywy\n  imad r8.xy, r1.yzyy, l(0x00010000, 0x00010000, 0, 0), r0.yzyy\n  f32tof16 r0.yz, r11.xxzx\n  f32tof16 r1.yz, r8.wwzw\n  imad r8.zw, r1.yyyz, l(0, 0, 0x00010000, 0x00010000), r0.yyyz\n  break \n  default \n  mov r7.zw, r5.xxxy\n  mov r7.x, r10.x\n  mov r8.xy, r9.xyxx\n  mov r8.z, r11.x\n  break \nendswitch \nieq r0.y, r4.x, l(0)\nine r0.z, r1.x, l(0)\nand r0.y, r0.z, r0.y\nif_nz r0.y\n  uge r0.y, r1.x, l(2)\n  if_nz r0.y\n    uge r0.y, r1.x, l(3)\n    if_nz r0.y\n      mov r8.xy, r8.zwzz\n    endif \n    mov r7.xy, r8.xyxx\n  endif \n  mov r7.xyzw, r7.xyxy\nendif \nmov r4.z, vThreadID.y\nimad r0.yz, r3.xxzx, r2.xxyx, r4.xxzx\nushr r1.xy, r0.yzyy, l(2, 1, 0, 0)\nudiv r2.zw, null, r1.xxxy, r2.xxxy\nimad r1.xy, -r2.xyxx, r2.zwzz, r1.xyxx\nishl r0.y, r2.z, l(2)\nimad r1.x, r1.x, r2.y, r1.y\nbfi r0.z, l(1), l(5), r0.z, l(0)\nbfi r0.z, l(26), l(6), r1.x, r0.z\nif_nz r0.w\n  ubfe r0.w, l(3), l(4), CB0[0][0].z\n  bfi r1.x, l(10), l(1), r3.y, l(0)\n  ishr r1.y, r0.w, l(2)\n  ibfe r3.xyzw, l(28, 27, 31, 29), l(3, 3, 0, 2), r2.wzww\n  imad r1.x, r1.y, r1.x, r3.x\n  imad r1.x, r1.x, r1.w, r3.y\n  bfi r0.w, l(2), l(5), r0.w, l(0)\n  bfi r1.z, l(2), l(3), r3.z, l(0)\n  iadd r0.w, r0.w, r1.z\n  bfi r0.w, l(3), l(0), r0.y, r0.w\n  bfi r0.w, l(25), l(7), r1.x, r0.w\n  xor r1.x, r1.y, r3.w\n  ibfe r1.y, l(29), l(1), r2.z\n  and r1.y, r1.y, l(3)\n  bfi r1.xz, l(1, 0, 1, 0), l(1, 0, 11, 0), r1.xxxx, l(0, 0, 0, 0)\n  xor r1.x, r1.x, r1.y\n  ishl r1.x, r1.x, l(6)\n  iadd r1.x, r1.z, r1.x\n  ibfe r1.yz, l(0, 27, 24, 0), l(0, 2, 5, 0), r0.wwww\n  bfi r0.w, l(3), l(8), r1.y, r1.x\n  bfi r0.w, l(20), l(12), r1.z, r0.w\nelse \n  ibfe r3.xyzw, l(27, 27, 31, 28), l(4, 3, 0, 3), r2.wzww\n  imad r1.x, r3.x, r1.w, r3.y\n  bfi r1.yz, l(0, 3, 1, 0), l(0, 3, 11, 0), r3.zzwz, l(0, 0, 0, 0)\n  bfi r0.y, l(3), l(0), r0.y, r1.y\n  bfi r0.y, l(26), l(6), r1.x, r0.y\n  ibfe r1.xy, l(29, 29, 0, 0), l(1, 2, 0, 0), r2.zwzz\n  and r1.x, r1.x, l(3)\n  bfi r1.y, l(1), l(1), r1.y, l(0)\n  xor r1.x, r1.y, r1.x\n  ishl r1.x, r1.x, l(6)\n  iadd r1.x, r1.z, r1.x\n  ibfe r1.yz, l(0, 27, 24, 0), l(0, 2, 5, 0), r0.yyyy\n  bfi r0.y, l(3), l(8), r1.y, r1.x\n  bfi r0.w, l(20), l(12), r1.z, r0.y\nendif \nimul null, r0.y, r2.y, r2.x\nimad r0.y, r0.w, r0.y, r0.z\nieq r0.z, r0.x, l(4)\nif_nz r0.z\n  mov r7.xyzw, r7.yxwz\n  mov r0.w, l(2)\nelse \n  mov r0.w, r0.x\nendif \nieq r1.xyz, r0.wwww, l(1, 2, 3, 0)\nor r1.xy, r1.yzyy, r1.xyxx\nif_nz r1.x\n  ishl r2.xyzw, r7.zwxy, l(8, 8, 8, 8)\n  and r2.xyzw, r2.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r3.xyzw, r7.zwxy, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r7.xyzw, r2.zwxy, r3.zwxy\nendif \nif_nz r1.y\n  ushr r1.xyzw, r7.zwxy, l(16, 16, 16, 16)\n  bfi r7.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r7.xyzw, r1.zwxy\nendif \nstore_raw U0[0].xyzw, r0.y, r7.zwxy\niadd r0.w, r0.y, l(16)\nif_nz r0.z\n  mov r8.zw, r8.wwwz\n  mov r8.xyzw, r8.yxzw\n  mov r0.x, l(2)\nendif \nieq r1.xyz, r0.xxxx, l(1, 2, 3, 0)\nor r0.xz, r1.yyzy, r1.xxyx\nif_nz r0.x\n  ishl r1.xyzw, r8.xyzw, l(8, 8, 8, 8)\n  and r1.xyzw, r1.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r2.xyzw, r8.xyzw, l(8, 8, 8, 8)\n  and r2.xyzw, r2.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r8.xyzw, r1.xyzw, r2.xyzw\nendif \nif_nz r0.z\n  ushr r1.xyzw, r8.xyzw, l(16, 16, 16, 16)\n  bfi r8.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r8.xyzw, r1.xyzw\nendif \nstore_raw U0[0].xyzw, r0.w, r8.xyzw\nret \n// Approximately 1241 instruction slots used\n#endif\n\nconst BYTE resolve_full_64bpp_scaled_cs[] =\n{\n     68,  88,  66,  67, 203, 136, \n    236,   7, 252, 228, 215, 204, \n    141, 141,  25, 144, 254,  17, \n     79, 148,   1,   0,   0,   0, \n     36, 149,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n    144,   2,   0,   0, 160,   2, \n      0,   0, 176,   2,   0,   0, \n    136, 148,   0,   0,  82,  68, \n     69,  70,  84,   2,   0,   0, \n      1,   0,   0,   0, 228,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n     44,   2,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 197,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 213,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 114, 101, 115, \n    111, 108, 118, 101,  95, 101, \n    100, 114,  97, 109,   0, 120, \n    101,  95, 114, 101, 115, 111, \n    108, 118, 101,  95, 100, 101, \n    115, 116,   0, 112, 117, 115, \n    104,  95,  99, 111, 110, 115, \n    116, 115,  95, 120, 101,   0, \n    213,   0,   0,   0,   4,   0, \n      0,   0, 252,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    156,   1,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 184,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 220,   1, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 184,   1,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 247,   1,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    184,   1,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     12,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 184,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 120, 101, \n     95, 114, 101, 115, 111, 108, \n    118, 101,  95, 101, 100, 114, \n     97, 109,  95, 105, 110, 102, \n    111,   0, 100, 119, 111, 114, \n    100,   0,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 178,   1, \n      0,   0, 120, 101,  95, 114, \n    101, 115, 111, 108, 118, 101, \n     95,  99, 111, 111, 114, 100, \n    105, 110,  97, 116, 101,  95, \n    105, 110, 102, 111,   0, 120, \n    101,  95, 114, 101, 115, 111, \n    108, 118, 101,  95, 100, 101, \n    115, 116,  95, 105, 110, 102, \n    111,   0, 120, 101,  95, 114, \n    101, 115, 111, 108, 118, 101, \n     95, 100, 101, 115, 116,  95, \n     99, 111, 111, 114, 100, 105, \n    110,  97, 116, 101,  95, 105, \n    110, 102, 111,   0,  77, 105, \n     99, 114, 111, 115, 111, 102, \n    116,  32,  40,  82,  41,  32, \n     72,  76,  83,  76,  32,  83, \n    104,  97, 100, 101, 114,  32, \n     67, 111, 109, 112, 105, 108, \n    101, 114,  32,  49,  48,  46, \n     49,   0,  73,  83,  71,  78, \n      8,   0,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     79,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  83,  72, \n     69,  88, 208, 145,   0,   0, \n     81,   0,   5,   0, 116,  36, \n      0,   0, 106,   8,   0,   1, \n     89,   0,   0,   7,  70, 142, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0, 161,   0, \n      0,   6,  70, 126,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 157,   0, \n      0,   6,  70, 238,  49,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  95,   0, \n      0,   2,  50,   0,   2,   0, \n    104,   0,   0,   2,  24,   0, \n      0,   0, 155,   0,   0,   4, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,  12, 242,   0, \n     16,   0,   0,   0,   0,   0, \n     38, 136,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n    255,   3,   0,   0,   0,   0, \n      0,  32,   8,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n    138,   0,   0,  17,  50,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n     17,   0,   0,   0,  20,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86, 133, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  18,   0,   0,   1, \n     54,   0,   0,   8,  50,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n    138,   0,   0,  17, 114,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  19,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,  86, 133, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,   1,   0, \n      0,  12, 194,   0,  16,   0, \n      1,   0,   0,   0, 166, 142, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   1, \n    255,   3,   0,   0,  85,   0, \n      0,  12, 242,   0,  16,   0, \n      3,   0,   0,   0, 214, 143, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     24,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      4,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  80,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      4,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  17, \n    242,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,  11,   0, \n      0,   0,   4,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     13,   0,   0,   0,  24,   0, \n      0,   0,  28,   0,   0,   0, \n      6, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   7,  18,   0,  16,   0, \n      6,   0,   0,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     34,   0,  16,   0,   6,   0, \n      0,   0,  10,   0,  16,   0, \n      3,   0,   0,   0, 140,   0, \n      0,  20, 194,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   4,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   6,   4,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    139,   0,   0,  11,  66,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  23,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0, 128,  63, 140,   0, \n      0,  20,  82,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 166,  11,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    138,   0,   0,  17,  50,   0, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   6,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,  28,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 230, 138, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  83,   0,   0,   6, \n     34,   0,  16,   0,   4,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,   9, \n    194,   0,  16,   0,   2,   0, \n      0,   0, 166,  14,  16,   0, \n      2,   0,   0,   0,   6,   4, \n     16,   0,   2,   0,   0,   0, \n      6,   4,  16,   0,   4,   0, \n      0,   0,  80,   0,   0,   7, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   6,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     54,   0,   0,   5,  34,   0, \n     16,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   6,   0, \n      0,   0,  18,   0,   0,   1, \n     32,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      1,   0,   0,   0,  54,   0, \n      0,   5,  34,   0,  16,   0, \n      7,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     18,   0,   0,   1,  54,   0, \n      0,   5,  34,   0,  16,   0, \n      7,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  21,   0, \n      0,   1,  80,   0,   0,  10, \n    162,   0,  16,   0,   4,   0, \n      0,   0,   6,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,  10, 162,   0, \n     16,   0,   4,   0,   0,   0, \n     86,  13,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  41,   0, \n      0,   7, 194,   0,  16,   0, \n      2,   0,   0,   0, 166,  14, \n     16,   0,   2,   0,   0,   0, \n     86,  13,  16,   0,   4,   0, \n      0,   0,  85,   0,   0,   7, \n     18,   0,  16,   0,   7,   0, \n      0,   0,  26,   0,  16,   0, \n      7,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,  10, 194,   0, \n     16,   0,   6,   0,   0,   0, \n      6,   4,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7, 194,   0,  16,   0, \n      2,   0,   0,   0, 166,  14, \n     16,   0,   2,   0,   0,   0, \n    166,  14,  16,   0,   6,   0, \n      0,   0,  38,   0,   0,  11, \n      0, 208,   0,   0,  98,   0, \n     16,   0,   7,   0,   0,   0, \n      6,   1,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  80,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,   7,  18,   0,  16,   0, \n      7,   0,   0,   0,  26,   0, \n     16,   0,   7,   0,   0,   0, \n     58,   0,  16,   0,   5,   0, \n      0,   0,  78,   0,   0,   8, \n    194,   0,  16,   0,   6,   0, \n      0,   0,   0, 208,   0,   0, \n    166,  14,  16,   0,   2,   0, \n      0,   0,   6,   8,  16,   0, \n      7,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   6,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      6,   0,   0,   0,  30,   0, \n      0,   7,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0,  35,   0,   0,  10, \n    194,   0,  16,   0,   2,   0, \n      0,   0, 166,  14,  16, 128, \n     65,   0,   0,   0,   6,   0, \n      0,   0,   6,   8,  16,   0, \n      7,   0,   0,   0, 166,  14, \n     16,   0,   2,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0,  34,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   7,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   7,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  41,   0,   0,   7, \n     66,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   5,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     41,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     11,   0,   0,   0,  78,   0, \n      0,   8,   0, 208,   0,   0, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     41,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  30,   0, \n      0,   7,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n     58,   0,  16,   0,   5,   0, \n      0,   0,  41,   0,   0,   7, \n     66,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     31,   0,   4,   3,  58,   0, \n     16,   0,   5,   0,   0,   0, \n     32,   0,   0,   7, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  31,   0, \n      4,   3,  58,   0,  16,   0, \n      2,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      7,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n    230, 116,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      8,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n    230, 116,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  50,   0, \n     16,   0,   9,   0,   0,   0, \n    230,  10,  16,   0,   7,   0, \n      0,   0,  54,   0,   0,   5, \n     50,   0,  16,   0,  10,   0, \n      0,   0, 230,  10,  16,   0, \n      8,   0,   0,   0,  18,   0, \n      0,   1, 165,   0,   0,   8, \n     50,   0,  16,   0,   9,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  70, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 130,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0, 165,   0,   0,   8, \n     50,   0,  16,   0,   7,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,  70, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 162,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  12,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n    162,   0,  16,   0,   4,   0, \n      0,   0,  86,   5,  16,   0, \n      0,   0,   0,   0,  86,  13, \n     16,   0,   4,   0,   0,   0, \n    165,   0,   0,   8,  50,   0, \n     16,   0,  10,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0,  70, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n     50,   0,  16,   0,   8,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,  70, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  76,   0,   0,   3, \n     42,   0,  16,   0,   5,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  41,   0,   0,  10, \n    194,   0,  16,   0,   9,   0, \n      0,   0,   6,   4,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     38,   7,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,  41,   0,   0,  10, \n    194,   0,  16,   0,   7,   0, \n      0,   0,   6,   4,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     38,   7,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10, 242,   0,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,  41,   0,   0,  10, \n    194,   0,  16,   0,  10,   0, \n      0,   0,   6,   4,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     38,   7,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,  41,   0,   0,  10, \n    194,   0,  16,   0,   8,   0, \n      0,   0,   6,   4,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     38,   7,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     85,   0,   0,  10, 162,   0, \n     16,   0,   4,   0,   0,   0, \n      6,   4,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0, 131,   0, \n      0,   5,  82,   0,  16,   0, \n      9,   0,   0,   0,   6,   1, \n     16,   0,   9,   0,   0,   0, \n    131,   0,   0,   5, 162,   0, \n     16,   0,   9,   0,   0,   0, \n     86,  13,  16,   0,   4,   0, \n      0,   0,  85,   0,   0,  10, \n    162,   0,  16,   0,   4,   0, \n      0,   0,   6,   4,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n    131,   0,   0,   5,  82,   0, \n     16,   0,   7,   0,   0,   0, \n      6,   1,  16,   0,   7,   0, \n      0,   0, 131,   0,   0,   5, \n    162,   0,  16,   0,   7,   0, \n      0,   0,  86,  13,  16,   0, \n      4,   0,   0,   0,  85,   0, \n      0,  10, 162,   0,  16,   0, \n      4,   0,   0,   0,   6,   4, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0, 131,   0,   0,   5, \n     82,   0,  16,   0,  10,   0, \n      0,   0,   6,   1,  16,   0, \n     10,   0,   0,   0, 131,   0, \n      0,   5, 162,   0,  16,   0, \n     10,   0,   0,   0,  86,  13, \n     16,   0,   4,   0,   0,   0, \n     85,   0,   0,  10, 162,   0, \n     16,   0,   4,   0,   0,   0, \n      6,   4,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0, 131,   0, \n      0,   5,  82,   0,  16,   0, \n      8,   0,   0,   0,   6,   1, \n     16,   0,   8,   0,   0,   0, \n    131,   0,   0,   5, 162,   0, \n     16,   0,   8,   0,   0,   0, \n     86,  13,  16,   0,   4,   0, \n      0,   0,   2,   0,   0,   1, \n     10,   0,   0,   1,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,  23,   0, \n      0,   1,  18,   0,   0,   1, \n     32,   0,   0,   7, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  31,   0, \n      4,   3,  58,   0,  16,   0, \n      2,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      8,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     54, 121,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     18,   0,   0,   1, 165,   0, \n      0,   8,  34,   0,  16,   0, \n      8,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0, 165,   0, \n      0,   8,  66,   0,  16,   0, \n      8,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     41,   0,   0,  10, 162,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  12,   0, \n      0,   0,  86,   5,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7, 162,   0,  16,   0, \n      4,   0,   0,   0,  86,   5, \n     16,   0,   0,   0,   0,   0, \n     86,  13,  16,   0,   4,   0, \n      0,   0, 165,   0,   0,   8, \n    130,   0,  16,   0,   8,   0, \n      0,   0,  26,   0,  16,   0, \n      4,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8,  18,   0,  16,   0, \n      8,   0,   0,   0,  58,   0, \n     16,   0,   4,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  76,   0, \n      0,   3,  42,   0,  16,   0, \n      5,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      0,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      1,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     11,   0,   0,   0,  86,   5, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     16,   0,   0,   0,  24,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  11,   0, \n      0,   0,  26,   0,  16,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59,  85,   0,   0,  10, \n    226,   0,  16,   0,  11,   0, \n      0,   0, 166,  10,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  11,   0,   0,   0, \n     42,   0,  16,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  11,   0,   0,   0, \n    246,  15,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  16,   0,   0,   0, \n     24,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     11,   0,   0,   0,  58,   0, \n     16,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      8,   0,   0,   0,   6,   0, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     16,   0,   0,   0,  24,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      2,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n     10,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     11,   0,   0,   0,  86,   5, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  11,   0, \n      0,   0,  26,   0,  16,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   3,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   8,  32, \n    128,  58,   8,  32, 128,  58, \n      8,  32, 128,  58, 171, 170, \n    170,  62,  85,   0,   0,  10, \n    226,   0,  16,   0,  11,   0, \n      0,   0, 166,  10,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  11,   0,   0,   0, \n     42,   0,  16,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   3,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   8,  32, 128,  58, \n      8,  32, 128,  58,   8,  32, \n    128,  58, 171, 170, 170,  62, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  11,   0,   0,   0, \n    246,  15,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     30,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     11,   0,   0,   0,  58,   0, \n     16,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      3,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      8,  32, 128,  58,   8,  32, \n    128,  58,   8,  32, 128,  58, \n    171, 170, 170,  62,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      8,   0,   0,   0,   6,   0, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   3,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   8,  32, 128,  58, \n      8,  32, 128,  58,   8,  32, \n    128,  58, 171, 170, 170,  62, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n     12,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0,  86,   9, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     30,   0,   0,   0,  30,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  12,   0, \n      0,   0,  26,   0,  16,   0, \n      8,   0,   0,   0,  54,   0, \n      0,   5,  98,   0,  16,   0, \n     12,   0,   0,   0,   6,   1, \n     16,   0,  11,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0, 135,   0,   0,   5, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     14,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255,   0,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  11, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16, 128, \n     65,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     17,   0,   0,   0, 140,   0, \n      0,  17, 114,   0,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  14,   0, \n      0,   0,  70,   2,  16,   0, \n     12,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n      2,  64,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  14,   0, \n      0,   0,  70,   2,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 114,   0,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  14,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,   9,   0, \n      0,   0,  70,   2,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  86,   0,   0,   5, \n    162,   0,  16,   0,   4,   0, \n      0,   0, 166,  14,  16,   0, \n     11,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0, 230,  11, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  12,   0, \n      0,   0,  42,   0,  16,   0, \n      8,   0,   0,   0,  54,   0, \n      0,   5,  98,   0,  16,   0, \n     12,   0,   0,   0,   6,   3, \n     16,   0,  11,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0, 135,   0,   0,   5, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     14,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255,   0,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  11, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16, 128, \n     65,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     17,   0,   0,   0, 140,   0, \n      0,  17, 114,   0,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  14,   0, \n      0,   0,  70,   2,  16,   0, \n     12,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n      2,  64,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  14,   0, \n      0,   0,  70,   2,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 114,   0,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  14,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,   7,   0, \n      0,   0,  70,   2,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  56,   0,   0,  10, \n    162,   0,  16,   0,   4,   0, \n      0,   0,  86,  13,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n    171, 170, 170,  62,   0,   0, \n      0,   0, 171, 170, 170,  62, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  11,   0,   0,   0, \n     58,   0,  16,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  12,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 114,   0,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0, 135,   0, \n      0,   5, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  13,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n    232, 255, 255, 255, 232, 255, \n    255, 255, 232, 255, 255, 255, \n      0,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  11, 114,   0,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16, 128,  65,   0,   0,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  16,   0,   0,   0, \n     70,   2,  16,   0,  14,   0, \n      0,   0,  70,   2,  16,   0, \n     14,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n    140,   0,   0,  17, 114,   0, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  11,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  11,   0,   0,   0, \n     70,   2,  16,   0,  14,   0, \n      0,   0,  70,   2,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  11,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 114,   0, \n     16,   0,  11,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     10,   0,   0,   0,  70,   2, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0,  54,   0, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,  30,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,  86,   0,   0,   5, \n     50,   0,  16,   0,   5,   0, \n      0,   0, 198,   0,  16,   0, \n     11,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     11,   0,   0,   0,  10,   0, \n     16,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0, 135,   0,   0,   5, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     13,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255,   0,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  11, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16, 128, \n     65,   0,   0,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  14,   0,   0,   0, \n     70,   2,  16,   0,  14,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0, 140,   0, \n      0,  17, 114,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  11,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,  14,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  11,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 114,   0,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,  13,   0,   0,   0, \n     70,   2,  16,   0,  11,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,   8,   0, \n      0,   0,  70,   2,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  56,   0,   0,  10, \n     50,   0,  16,   0,   5,   0, \n      0,   0,  70,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0, 171, 170, 170,  62, \n    171, 170, 170,  62,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5, 130,   0, \n     16,   0,   9,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0,  54,   0,   0,   5, \n    130,   0,  16,   0,   7,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,  54,   0, \n      0,   5, 130,   0,  16,   0, \n     10,   0,   0,   0,  10,   0, \n     16,   0,   5,   0,   0,   0, \n     54,   0,   0,   5, 130,   0, \n     16,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n    150,   3,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  54,   0, \n      0,   5,  82,   0,  16,   0, \n     12,   0,   0,   0,   6,   1, \n     16,   0,  11,   0,   0,   0, \n     54,   0,   0,   5, 162,   0, \n     16,   0,  12,   0,   0,   0, \n     86,   9,  16,   0,   8,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10,  50,   0, \n     16,   0,   9,   0,   0,   0, \n     70,   0,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0,   0,   0, \n      0,   0,   0,   0,  52,   0, \n      0,  10,  50,   0,  16,   0, \n      7,   0,   0,   0, 230,  10, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     98,   0,  16,   0,   8,   0, \n      0,   0, 166,  11,  16,   0, \n     11,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0, 214,   2, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n     50,   0,  16,   0,  10,   0, \n      0,   0,  70,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     52,   0,   0,  10,  50,   0, \n     16,   0,   8,   0,   0,   0, \n    230,  10,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      6,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0, 150,   3, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 131,   0,   0,   5, \n     18,   0,  16,   0,   9,   0, \n      0,   0,  26,   0,  16,   0, \n      8,   0,   0,   0, 131,   0, \n      0,   5,  34,   0,  16,   0, \n      9,   0,   0,   0,  10,   0, \n     16,   0,  11,   0,   0,   0, \n    131,   0,   0,   5,  18,   0, \n     16,   0,   7,   0,   0,   0, \n     42,   0,  16,   0,   8,   0, \n      0,   0, 131,   0,   0,   5, \n     34,   0,  16,   0,   7,   0, \n      0,   0,  26,   0,  16,   0, \n     11,   0,   0,   0, 131,   0, \n      0,   5,  18,   0,  16,   0, \n     10,   0,   0,   0,  58,   0, \n     16,   0,   8,   0,   0,   0, \n    131,   0,   0,   5,  34,   0, \n     16,   0,  10,   0,   0,   0, \n     42,   0,  16,   0,  11,   0, \n      0,   0, 131,   0,   0,   5, \n     18,   0,  16,   0,   8,   0, \n      0,   0,  10,   0,  16,   0, \n      8,   0,   0,   0, 131,   0, \n      0,   5,  34,   0,  16,   0, \n      8,   0,   0,   0,  58,   0, \n     16,   0,  11,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   1, \n     10,   0,   0,   1,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      9,   0,   0,   0,  26,   0, \n     16,   0,   8,   0,   0,   0, \n     54,   0,   0,   8, 226,   0, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   7,   0, \n      0,   0,  42,   0,  16,   0, \n      8,   0,   0,   0,  54,   0, \n      0,   8, 226,   0,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  10,   0,   0,   0, \n     58,   0,  16,   0,   8,   0, \n      0,   0,  54,   0,   0,   8, \n    226,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 226,   0,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,  23,   0, \n      0,   1,  21,   0,   0,   1, \n     80,   0,   0,   7, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  31,   0, \n      4,   3,  58,   0,  16,   0, \n      2,   0,   0,   0,  56,   0, \n      0,   7, 130,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  63,  35,   0,   0,   9, \n    130,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n     64,   1,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     58,   0,  16,   0,   5,   0, \n      0,   0,  32,   0,   0,   7, \n     34,   0,  16,   0,   4,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   4,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0, 230, 116,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     34,   0,  16,   0,   4,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0, 230, 116,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     50,   0,  16,   0,  13,   0, \n      0,   0, 230,  10,  16,   0, \n     11,   0,   0,   0,  54,   0, \n      0,   5,  50,   0,  16,   0, \n     14,   0,   0,   0, 230,  10, \n     16,   0,  12,   0,   0,   0, \n     18,   0,   0,   1, 165,   0, \n      0,   8,  50,   0,  16,   0, \n     13,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n     70, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  34,   0, \n     16,   0,   4,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0, 165,   0, \n      0,   8,  50,   0,  16,   0, \n     11,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n     70, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     41,   0,   0,  10, 162,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  12,   0, \n      0,   0,  86,   5,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7, 162,   0,  16,   0, \n      4,   0,   0,   0, 246,  15, \n     16,   0,   3,   0,   0,   0, \n     86,  13,  16,   0,   4,   0, \n      0,   0, 165,   0,   0,   8, \n     50,   0,  16,   0,  14,   0, \n      0,   0,  26,   0,  16,   0, \n      4,   0,   0,   0,  70, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8,  50,   0,  16,   0, \n     12,   0,   0,   0,  58,   0, \n     16,   0,   4,   0,   0,   0, \n     70, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  76,   0, \n      0,   3,  42,   0,  16,   0, \n      5,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      5,   0,   0,   0,  41,   0, \n      0,  10, 194,   0,  16,   0, \n     13,   0,   0,   0,   6,   4, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  38,   7,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,  41,   0, \n      0,  10, 194,   0,  16,   0, \n     11,   0,   0,   0,   6,   4, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  38,   7,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,  41,   0, \n      0,  10, 194,   0,  16,   0, \n     14,   0,   0,   0,   6,   4, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  38,   7,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10, 242,   0, \n     16,   0,  14,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,  41,   0, \n      0,  10, 194,   0,  16,   0, \n     12,   0,   0,   0,   6,   4, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  38,   7,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  85,   0,   0,  10, \n    162,   0,  16,   0,   4,   0, \n      0,   0,   6,   4,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n    131,   0,   0,   5,  82,   0, \n     16,   0,  13,   0,   0,   0, \n      6,   1,  16,   0,  13,   0, \n      0,   0, 131,   0,   0,   5, \n    162,   0,  16,   0,  13,   0, \n      0,   0,  86,  13,  16,   0, \n      4,   0,   0,   0,  85,   0, \n      0,  10, 162,   0,  16,   0, \n      4,   0,   0,   0,   6,   4, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0, 131,   0,   0,   5, \n     82,   0,  16,   0,  11,   0, \n      0,   0,   6,   1,  16,   0, \n     11,   0,   0,   0, 131,   0, \n      0,   5, 162,   0,  16,   0, \n     11,   0,   0,   0,  86,  13, \n     16,   0,   4,   0,   0,   0, \n     85,   0,   0,  10, 162,   0, \n     16,   0,   4,   0,   0,   0, \n      6,   4,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0, 131,   0, \n      0,   5,  82,   0,  16,   0, \n     14,   0,   0,   0,   6,   1, \n     16,   0,  14,   0,   0,   0, \n    131,   0,   0,   5, 162,   0, \n     16,   0,  14,   0,   0,   0, \n     86,  13,  16,   0,   4,   0, \n      0,   0,  85,   0,   0,  10, \n    162,   0,  16,   0,   4,   0, \n      0,   0,   6,   4,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n    131,   0,   0,   5,  82,   0, \n     16,   0,  12,   0,   0,   0, \n      6,   1,  16,   0,  12,   0, \n      0,   0, 131,   0,   0,   5, \n    162,   0,  16,   0,  12,   0, \n      0,   0,  86,  13,  16,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   1,  10,   0,   0,   1, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   1, \n     23,   0,   0,   1,  18,   0, \n      0,   1,  32,   0,   0,   7, \n     34,   0,  16,   0,   4,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   4,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,  54, 121,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  18,   0,   0,   1, \n    165,   0,   0,   8,  34,   0, \n     16,   0,  12,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     34,   0,  16,   0,   4,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n    165,   0,   0,   8,  66,   0, \n     16,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    162,   0,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n     12,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7, 162,   0, \n     16,   0,   4,   0,   0,   0, \n    246,  15,  16,   0,   3,   0, \n      0,   0,  86,  13,  16,   0, \n      4,   0,   0,   0, 165,   0, \n      0,   8, 130,   0,  16,   0, \n     12,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    165,   0,   0,   8,  18,   0, \n     16,   0,  12,   0,   0,   0, \n     58,   0,  16,   0,   4,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     76,   0,   0,   3,  42,   0, \n     16,   0,   5,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   0,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  15,   0,   0,   0, \n     86,   5,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  16,   0,   0,   0, \n     24,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     15,   0,   0,   0,  26,   0, \n     16,   0,  12,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     15,   0,   0,   0, 166,  10, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     16,   0,   0,   0,  24,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  15,   0, \n      0,   0,  42,   0,  16,   0, \n     12,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59,  85,   0,   0,  10, \n    226,   0,  16,   0,  15,   0, \n      0,   0, 246,  15,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  15,   0,   0,   0, \n     58,   0,  16,   0,  12,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  14,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  12,   0,   0,   0, \n      6,   0,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  16,   0,   0,   0, \n     24,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,  10,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  15,   0,   0,   0, \n     86,   5,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     30,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     15,   0,   0,   0,  26,   0, \n     16,   0,  12,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      3,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      8,  32, 128,  58,   8,  32, \n    128,  58,   8,  32, 128,  58, \n    171, 170, 170,  62,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     15,   0,   0,   0, 166,  10, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  15,   0, \n      0,   0,  42,   0,  16,   0, \n     12,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   3,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   8,  32, \n    128,  58,   8,  32, 128,  58, \n      8,  32, 128,  58, 171, 170, \n    170,  62,  85,   0,   0,  10, \n    226,   0,  16,   0,  15,   0, \n      0,   0, 246,  15,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  15,   0,   0,   0, \n     58,   0,  16,   0,  12,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   3,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  14,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   8,  32, 128,  58, \n      8,  32, 128,  58,   8,  32, \n    128,  58, 171, 170, 170,  62, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  12,   0,   0,   0, \n      6,   0,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     30,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   3,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   8,  32, \n    128,  58,   8,  32, 128,  58, \n      8,  32, 128,  58, 171, 170, \n    170,  62,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     86,   9,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n     30,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     16,   0,   0,   0,  26,   0, \n     16,   0,  12,   0,   0,   0, \n     54,   0,   0,   5,  98,   0, \n     16,   0,  16,   0,   0,   0, \n      6,   1,  16,   0,  15,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 114,   0,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0, 135,   0, \n      0,   5, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,   2,  64,   0,   0, \n    232, 255, 255, 255, 232, 255, \n    255, 255, 232, 255, 255, 255, \n      0,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  11, 114,   0,  16,   0, \n     21,   0,   0,   0,  70,   2, \n     16, 128,  65,   0,   0,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  21,   0,   0,   0, \n    140,   0,   0,  17, 114,   0, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  16,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  21,   0, \n      0,   0,   2,  64,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 114,   0, \n     16,   0,  16,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     13,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   0, \n      0,   5, 162,   0,  16,   0, \n      4,   0,   0,   0, 166,  14, \n     16,   0,  15,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,  15,   0,   0,   0, \n    230,  11,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     16,   0,   0,   0,  42,   0, \n     16,   0,  12,   0,   0,   0, \n     54,   0,   0,   5,  98,   0, \n     16,   0,  16,   0,   0,   0, \n      6,   3,  16,   0,  15,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 114,   0,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0, 135,   0, \n      0,   5, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,   2,  64,   0,   0, \n    232, 255, 255, 255, 232, 255, \n    255, 255, 232, 255, 255, 255, \n      0,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  11, 114,   0,  16,   0, \n     21,   0,   0,   0,  70,   2, \n     16, 128,  65,   0,   0,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  21,   0,   0,   0, \n    140,   0,   0,  17, 114,   0, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  16,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  21,   0, \n      0,   0,   2,  64,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 114,   0, \n     16,   0,  16,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  56,   0, \n      0,  10, 162,   0,  16,   0, \n      4,   0,   0,   0,  86,  13, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0, 171, 170, 170,  62, \n      0,   0,   0,   0, 171, 170, \n    170,  62,  54,   0,   0,   5, \n     18,   0,  16,   0,  15,   0, \n      0,   0,  58,   0,  16,   0, \n     12,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n    138,   0,   0,  15, 114,   0, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n    135,   0,   0,   5, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0, 232, 255, 255, 255, \n    232, 255, 255, 255, 232, 255, \n    255, 255,   0,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  11, 114,   0, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16, 128,  65,   0, \n      0,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0, 140,   0,   0,  17, \n    114,   0,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  14,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     54,   0,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n     30,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     30,   0,   0,   0,  86,   0, \n      0,   5,  50,   0,  16,   0, \n      5,   0,   0,   0, 198,   0, \n     16,   0,  15,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  15,   0,   0,   0, \n     10,   0,  16,   0,  12,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 114,   0,  16,   0, \n     18,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0, 135,   0, \n      0,   5, 114,   0,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n    232, 255, 255, 255, 232, 255, \n    255, 255, 232, 255, 255, 255, \n      0,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  11, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16, 128,  65,   0,   0,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  20,   0,   0,   0, \n    140,   0,   0,  17, 114,   0, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,   2,  64,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  56,   0, \n      0,  10,  50,   0,  16,   0, \n      5,   0,   0,   0,  70,   0, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0, 171, 170, \n    170,  62, 171, 170, 170,  62, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n    130,   0,  16,   0,  13,   0, \n      0,   0,  26,   0,  16,   0, \n      4,   0,   0,   0,  54,   0, \n      0,   5, 130,   0,  16,   0, \n     11,   0,   0,   0,  58,   0, \n     16,   0,   4,   0,   0,   0, \n     54,   0,   0,   5, 130,   0, \n     16,   0,  14,   0,   0,   0, \n     10,   0,  16,   0,   5,   0, \n      0,   0,  54,   0,   0,   5, \n    130,   0,  16,   0,  12,   0, \n      0,   0,  26,   0,  16,   0, \n      5,   0,   0,   0,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0, 150,   3,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     54,   0,   0,   5,  82,   0, \n     16,   0,  16,   0,   0,   0, \n      6,   1,  16,   0,  15,   0, \n      0,   0,  54,   0,   0,   5, \n    162,   0,  16,   0,  16,   0, \n      0,   0,  86,   9,  16,   0, \n     12,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n     16,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n     50,   0,  16,   0,  13,   0, \n      0,   0,  70,   0,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     52,   0,   0,  10,  50,   0, \n     16,   0,  11,   0,   0,   0, \n    230,  10,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  98,   0,  16,   0, \n     12,   0,   0,   0, 166,  11, \n     16,   0,  15,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,  15,   0,   0,   0, \n    214,   2,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10,  50,   0,  16,   0, \n     14,   0,   0,   0,  70,   0, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  52,   0,   0,  10, \n     50,   0,  16,   0,  12,   0, \n      0,   0, 230,  10,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   6,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,  15,   0,   0,   0, \n    150,   3,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 131,   0, \n      0,   5,  18,   0,  16,   0, \n     13,   0,   0,   0,  26,   0, \n     16,   0,  12,   0,   0,   0, \n    131,   0,   0,   5,  34,   0, \n     16,   0,  13,   0,   0,   0, \n     10,   0,  16,   0,  15,   0, \n      0,   0, 131,   0,   0,   5, \n     18,   0,  16,   0,  11,   0, \n      0,   0,  42,   0,  16,   0, \n     12,   0,   0,   0, 131,   0, \n      0,   5,  34,   0,  16,   0, \n     11,   0,   0,   0,  26,   0, \n     16,   0,  15,   0,   0,   0, \n    131,   0,   0,   5,  18,   0, \n     16,   0,  14,   0,   0,   0, \n     58,   0,  16,   0,  12,   0, \n      0,   0, 131,   0,   0,   5, \n     34,   0,  16,   0,  14,   0, \n      0,   0,  42,   0,  16,   0, \n     15,   0,   0,   0, 131,   0, \n      0,   5,  18,   0,  16,   0, \n     12,   0,   0,   0,  10,   0, \n     16,   0,  12,   0,   0,   0, \n    131,   0,   0,   5,  34,   0, \n     16,   0,  12,   0,   0,   0, \n     58,   0,  16,   0,  15,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   1,  10,   0,   0,   1, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  13,   0,   0,   0, \n     26,   0,  16,   0,  12,   0, \n      0,   0,  54,   0,   0,   8, \n    226,   0,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     11,   0,   0,   0,  42,   0, \n     16,   0,  12,   0,   0,   0, \n     54,   0,   0,   8, 226,   0, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  14,   0, \n      0,   0,  58,   0,  16,   0, \n     12,   0,   0,   0,  54,   0, \n      0,   8, 226,   0,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 226,   0, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   1, \n     23,   0,   0,   1,  21,   0, \n      0,   1,   0,   0,   0,   7, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n      0,   0,   0,   7, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   7, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  14,   0, \n      0,   0,   0,   0,   0,   7, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n     80,   0,   0,   7,  34,   0, \n     16,   0,   4,   0,   0,   0, \n     26,   0,  16,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      4,   0,   0,   0,  41,   0, \n      0,   7,  34,   0,  16,   0, \n      4,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     58,   0,  16,   0,   5,   0, \n      0,   0,  56,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0, 128,  62, \n     30,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      4,   0,   0,   0,  31,   0, \n      4,   3,  58,   0,  16,   0, \n      5,   0,   0,   0,  32,   0, \n      0,   7, 130,   0,  16,   0, \n      4,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   8,   0, \n      0,   0,  31,   0,   4,   3, \n     58,   0,  16,   0,   4,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0, 230, 116, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 130,   0,  16,   0, \n      4,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0, 230, 116, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  50,   0,  16,   0, \n     13,   0,   0,   0, 230,  10, \n     16,   0,  11,   0,   0,   0, \n     54,   0,   0,   5,  50,   0, \n     16,   0,  14,   0,   0,   0, \n    230,  10,  16,   0,  12,   0, \n      0,   0,  18,   0,   0,   1, \n    165,   0,   0,   8,  50,   0, \n     16,   0,  13,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  70, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    130,   0,  16,   0,   4,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n    165,   0,   0,   8,  50,   0, \n     16,   0,  11,   0,   0,   0, \n     58,   0,  16,   0,   4,   0, \n      0,   0,  70, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n     50,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,   5,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      5,   0,   0,   0, 165,   0, \n      0,   8,  50,   0,  16,   0, \n     14,   0,   0,   0,  10,   0, \n     16,   0,   5,   0,   0,   0, \n     70, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    165,   0,   0,   8,  50,   0, \n     16,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0,  70, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     76,   0,   0,   3,  42,   0, \n     16,   0,   5,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   5,   0,   0,   0, \n     41,   0,   0,  10, 194,   0, \n     16,   0,  13,   0,   0,   0, \n      6,   4,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  38,   7, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n     41,   0,   0,  10, 194,   0, \n     16,   0,  11,   0,   0,   0, \n      6,   4,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  38,   7, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n     41,   0,   0,  10, 194,   0, \n     16,   0,  14,   0,   0,   0, \n      6,   4,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  38,   7, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n    242,   0,  16,   0,  14,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n     41,   0,   0,  10, 194,   0, \n     16,   0,  12,   0,   0,   0, \n      6,   4,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  38,   7, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      7,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      5,   0,   0,   0,  70,   0, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 131,   0,   0,   5, \n     82,   0,  16,   0,  13,   0, \n      0,   0,   6,   1,  16,   0, \n     13,   0,   0,   0, 131,   0, \n      0,   5, 162,   0,  16,   0, \n     13,   0,   0,   0,   6,   4, \n     16,   0,   5,   0,   0,   0, \n     85,   0,   0,  10,  50,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 131,   0, \n      0,   5,  82,   0,  16,   0, \n     11,   0,   0,   0,   6,   1, \n     16,   0,  11,   0,   0,   0, \n    131,   0,   0,   5, 162,   0, \n     16,   0,  11,   0,   0,   0, \n      6,   4,  16,   0,   5,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   5,   0, \n      0,   0,  70,   0,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    131,   0,   0,   5,  82,   0, \n     16,   0,  14,   0,   0,   0, \n      6,   1,  16,   0,  14,   0, \n      0,   0, 131,   0,   0,   5, \n    162,   0,  16,   0,  14,   0, \n      0,   0,   6,   4,  16,   0, \n      5,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      5,   0,   0,   0,  70,   0, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 131,   0,   0,   5, \n     82,   0,  16,   0,  12,   0, \n      0,   0,   6,   1,  16,   0, \n     12,   0,   0,   0, 131,   0, \n      0,   5, 162,   0,  16,   0, \n     12,   0,   0,   0,   6,   4, \n     16,   0,   5,   0,   0,   0, \n      2,   0,   0,   1,  10,   0, \n      0,   1,  54,   0,   0,   8, \n    194,   0,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   1,  23,   0,   0,   1, \n     18,   0,   0,   1,  32,   0, \n      0,   7, 130,   0,  16,   0, \n      4,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  31,   0,   4,   3, \n     58,   0,  16,   0,   4,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  54, 121, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  18,   0, \n      0,   1, 165,   0,   0,   8, \n     34,   0,  16,   0,  12,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 130,   0,  16,   0, \n      4,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n     66,   0,  16,   0,  12,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10,  50,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n     12,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   5,   0, \n      0,   0,  86,   5,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   5,   0,   0,   0, \n    165,   0,   0,   8, 130,   0, \n     16,   0,  12,   0,   0,   0, \n     10,   0,  16,   0,   5,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n     18,   0,  16,   0,  12,   0, \n      0,   0,  26,   0,  16,   0, \n      5,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  76,   0,   0,   3, \n     42,   0,  16,   0,   5,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,   0,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,  15,   0, \n      0,   0,  86,   5,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  15,   0,   0,   0, \n     26,   0,  16,   0,  12,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  15,   0,   0,   0, \n    166,  10,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  16,   0,   0,   0, \n     24,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     15,   0,   0,   0,  42,   0, \n     16,   0,  12,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     15,   0,   0,   0, 246,  15, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     16,   0,   0,   0,  24,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  15,   0, \n      0,   0,  58,   0,  16,   0, \n     12,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     14,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59,  85,   0,   0,  10, \n    226,   0,  16,   0,  12,   0, \n      0,   0,   6,   0,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,  10,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,  15,   0, \n      0,   0,  86,   5,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  15,   0,   0,   0, \n     26,   0,  16,   0,  12,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   3,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   8,  32, 128,  58, \n      8,  32, 128,  58,   8,  32, \n    128,  58, 171, 170, 170,  62, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  15,   0,   0,   0, \n    166,  10,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     30,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     15,   0,   0,   0,  42,   0, \n     16,   0,  12,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      3,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      8,  32, 128,  58,   8,  32, \n    128,  58,   8,  32, 128,  58, \n    171, 170, 170,  62,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     15,   0,   0,   0, 246,  15, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  15,   0, \n      0,   0,  58,   0,  16,   0, \n     12,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   3,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     14,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   8,  32, \n    128,  58,   8,  32, 128,  58, \n      8,  32, 128,  58, 171, 170, \n    170,  62,  85,   0,   0,  10, \n    226,   0,  16,   0,  12,   0, \n      0,   0,   6,   0,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      3,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      8,  32, 128,  58,   8,  32, \n    128,  58,   8,  32, 128,  58, \n    171, 170, 170,  62,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  86,   9,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,  30,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  16,   0,   0,   0, \n     26,   0,  16,   0,  12,   0, \n      0,   0,  54,   0,   0,   5, \n     98,   0,  16,   0,  16,   0, \n      0,   0,   6,   1,  16,   0, \n     15,   0,   0,   0,   1,   0, \n      0,  10, 226,   0,  16,   0, \n      6,   0,   0,   0,   6,   9, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n    138,   0,   0,  15, 114,   0, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n    135,   0,   0,   5, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0, 232, 255, 255, 255, \n    232, 255, 255, 255, 232, 255, \n    255, 255,   0,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  11, 114,   0, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16, 128,  65,   0, \n      0,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0, 140,   0,   0,  17, \n    114,   0,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  13,   0,   0,   0, \n    150,   7,  16,   0,   6,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     86,   0,   0,   5,  50,   0, \n     16,   0,   5,   0,   0,   0, \n    230,  10,  16,   0,  15,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0, 230,  11,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  16,   0,   0,   0, \n     42,   0,  16,   0,  12,   0, \n      0,   0,  54,   0,   0,   5, \n     98,   0,  16,   0,  16,   0, \n      0,   0,   6,   3,  16,   0, \n     15,   0,   0,   0,   1,   0, \n      0,  10, 226,   0,  16,   0, \n      6,   0,   0,   0,   6,   9, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n    138,   0,   0,  15, 114,   0, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n    135,   0,   0,   5, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0, 232, 255, 255, 255, \n    232, 255, 255, 255, 232, 255, \n    255, 255,   0,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  11, 114,   0, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16, 128,  65,   0, \n      0,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0, 140,   0,   0,  17, \n    114,   0,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  11,   0,   0,   0, \n    150,   7,  16,   0,   6,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     56,   0,   0,  10,  50,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n    171, 170, 170,  62, 171, 170, \n    170,  62,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     15,   0,   0,   0,  58,   0, \n     16,   0,  12,   0,   0,   0, \n      1,   0,   0,  10, 226,   0, \n     16,   0,   6,   0,   0,   0, \n      6,   9,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,  17,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0, 135,   0,   0,   5, \n    114,   0,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255,   0,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  11, \n    114,   0,  16,   0,  19,   0, \n      0,   0,  70,   2,  16, 128, \n     65,   0,   0,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0, 140,   0, \n      0,  17, 114,   0,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  18,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  14,   0, \n      0,   0, 150,   7,  16,   0, \n      6,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  54,   0,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,  30,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n     86,   0,   0,   5,  98,   0, \n     16,   0,   6,   0,   0,   0, \n      6,   3,  16,   0,  15,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  15,   0, \n      0,   0,  10,   0,  16,   0, \n     12,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n    138,   0,   0,  15, 114,   0, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n    135,   0,   0,   5, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0, 232, 255, 255, 255, \n    232, 255, 255, 255, 232, 255, \n    255, 255,   0,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  11, 114,   0, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16, 128,  65,   0, \n      0,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0, 140,   0,   0,  17, \n    114,   0,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  17,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     15,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    114,   0,  16,   0,  15,   0, \n      0,   0,  70,   2,  16,   0, \n     17,   0,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n     55,   0,   0,  12, 114,   0, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     56,   0,   0,  10,  98,   0, \n     16,   0,   6,   0,   0,   0, \n     86,   6,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0, 171, 170, \n    170,  62, 171, 170, 170,  62, \n      0,   0,   0,   0,  54,   0, \n      0,   5, 130,   0,  16,   0, \n     13,   0,   0,   0,  10,   0, \n     16,   0,   5,   0,   0,   0, \n     54,   0,   0,   5, 130,   0, \n     16,   0,  11,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0,  54,   0,   0,   5, \n    130,   0,  16,   0,  14,   0, \n      0,   0,  26,   0,  16,   0, \n      6,   0,   0,   0,  54,   0, \n      0,   5, 130,   0,  16,   0, \n     12,   0,   0,   0,  42,   0, \n     16,   0,   6,   0,   0,   0, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      4,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0, 150,   3, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  54,   0,   0,   5, \n     82,   0,  16,   0,  16,   0, \n      0,   0,   6,   1,  16,   0, \n     15,   0,   0,   0,  54,   0, \n      0,   5, 162,   0,  16,   0, \n     16,   0,   0,   0,  86,   9, \n     16,   0,  12,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,  16,   0,   0,   0, \n     70,  14,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,  16,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  16,   0,   0,   0, \n     70,  14,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10,  50,   0,  16,   0, \n     13,   0,   0,   0,  70,   0, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  52,   0,   0,  10, \n     50,   0,  16,   0,  11,   0, \n      0,   0, 230,  10,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  98,   0, \n     16,   0,  12,   0,   0,   0, \n    166,  11,  16,   0,  15,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0, 214,   2,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10,  50,   0, \n     16,   0,  14,   0,   0,   0, \n     70,   0,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0,   0,   0, \n      0,   0,   0,   0,  52,   0, \n      0,  10,  50,   0,  16,   0, \n     12,   0,   0,   0, 230,  10, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0, 150,   3,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    131,   0,   0,   5,  18,   0, \n     16,   0,  13,   0,   0,   0, \n     26,   0,  16,   0,  12,   0, \n      0,   0, 131,   0,   0,   5, \n     34,   0,  16,   0,  13,   0, \n      0,   0,  10,   0,  16,   0, \n     15,   0,   0,   0, 131,   0, \n      0,   5,  18,   0,  16,   0, \n     11,   0,   0,   0,  42,   0, \n     16,   0,  12,   0,   0,   0, \n    131,   0,   0,   5,  34,   0, \n     16,   0,  11,   0,   0,   0, \n     26,   0,  16,   0,  15,   0, \n      0,   0, 131,   0,   0,   5, \n     18,   0,  16,   0,  14,   0, \n      0,   0,  58,   0,  16,   0, \n     12,   0,   0,   0, 131,   0, \n      0,   5,  34,   0,  16,   0, \n     14,   0,   0,   0,  42,   0, \n     16,   0,  15,   0,   0,   0, \n    131,   0,   0,   5,  18,   0, \n     16,   0,  12,   0,   0,   0, \n     10,   0,  16,   0,  12,   0, \n      0,   0, 131,   0,   0,   5, \n     34,   0,  16,   0,  12,   0, \n      0,   0,  58,   0,  16,   0, \n     15,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,  10,   0, \n      0,   1,  54,   0,   0,   5, \n     18,   0,  16,   0,  13,   0, \n      0,   0,  26,   0,  16,   0, \n     12,   0,   0,   0,  54,   0, \n      0,   8, 226,   0,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  11,   0,   0,   0, \n     42,   0,  16,   0,  12,   0, \n      0,   0,  54,   0,   0,   8, \n    226,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     14,   0,   0,   0,  58,   0, \n     16,   0,  12,   0,   0,   0, \n     54,   0,   0,   8, 226,   0, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    226,   0,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   1,  23,   0,   0,   1, \n     21,   0,   0,   1,   0,   0, \n      0,   7, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   0,   0,   0,   7, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      0,   0,   0,   7, 242,   0, \n     16,   0,  14,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     14,   0,   0,   0,   0,   0, \n      0,   7, 242,   0,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,  30,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n     31,   0,   4,   3,  58,   0, \n     16,   0,   5,   0,   0,   0, \n     32,   0,   0,   7, 130,   0, \n     16,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  31,   0, \n      4,   3,  58,   0,  16,   0, \n      3,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n     15,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n    230, 116,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 130,   0, \n     16,   0,   3,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n     16,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n    230, 116,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  50,   0, \n     16,   0,  17,   0,   0,   0, \n    230,  10,  16,   0,  15,   0, \n      0,   0,  54,   0,   0,   5, \n     50,   0,  16,   0,  18,   0, \n      0,   0, 230,  10,  16,   0, \n     16,   0,   0,   0,  18,   0, \n      0,   1, 165,   0,   0,   8, \n     50,   0,  16,   0,  17,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  70, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 130,   0,  16,   0, \n      3,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n     50,   0,  16,   0,  15,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,  70, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 162,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  12,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n    162,   0,  16,   0,   4,   0, \n      0,   0,  86,   5,  16,   0, \n      0,   0,   0,   0,  86,  13, \n     16,   0,   4,   0,   0,   0, \n    165,   0,   0,   8,  50,   0, \n     16,   0,  18,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0,  70, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n     50,   0,  16,   0,  16,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,  70, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  76,   0,   0,   3, \n     42,   0,  16,   0,   5,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  41,   0,   0,  10, \n    194,   0,  16,   0,  17,   0, \n      0,   0,   6,   4,  16,   0, \n     17,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,  19,   0,   0,   0, \n     38,   7,  16,   0,  17,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     19,   0,   0,   0,  70,  14, \n     16,   0,  19,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  19,   0,   0,   0, \n     70,  14,  16,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10, 242,   0,  16,   0, \n     17,   0,   0,   0,  70,  14, \n     16,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,  41,   0,   0,  10, \n    194,   0,  16,   0,  15,   0, \n      0,   0,   6,   4,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,  19,   0,   0,   0, \n     38,   7,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     19,   0,   0,   0,  70,  14, \n     16,   0,  19,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  19,   0,   0,   0, \n     70,  14,  16,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,  41,   0,   0,  10, \n    194,   0,  16,   0,  18,   0, \n      0,   0,   6,   4,  16,   0, \n     18,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,  19,   0,   0,   0, \n     38,   7,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     19,   0,   0,   0,  70,  14, \n     16,   0,  19,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  19,   0,   0,   0, \n     70,  14,  16,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10, 242,   0,  16,   0, \n     18,   0,   0,   0,  70,  14, \n     16,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,  41,   0,   0,  10, \n    194,   0,  16,   0,  16,   0, \n      0,   0,   6,   4,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     42,   0,   0,  10, 242,   0, \n     16,   0,  19,   0,   0,   0, \n     38,   7,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     19,   0,   0,   0,  70,  14, \n     16,   0,  19,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  19,   0,   0,   0, \n     70,  14,  16,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10, 242,   0,  16,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     85,   0,   0,  10, 162,   0, \n     16,   0,   4,   0,   0,   0, \n      6,   4,  16,   0,  17,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0, 131,   0, \n      0,   5,  82,   0,  16,   0, \n     17,   0,   0,   0,   6,   1, \n     16,   0,  17,   0,   0,   0, \n    131,   0,   0,   5, 162,   0, \n     16,   0,  17,   0,   0,   0, \n     86,  13,  16,   0,   4,   0, \n      0,   0,  85,   0,   0,  10, \n    162,   0,  16,   0,   4,   0, \n      0,   0,   6,   4,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n    131,   0,   0,   5,  82,   0, \n     16,   0,  15,   0,   0,   0, \n      6,   1,  16,   0,  15,   0, \n      0,   0, 131,   0,   0,   5, \n    162,   0,  16,   0,  15,   0, \n      0,   0,  86,  13,  16,   0, \n      4,   0,   0,   0,  85,   0, \n      0,  10, 162,   0,  16,   0, \n      4,   0,   0,   0,   6,   4, \n     16,   0,  18,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0, 131,   0,   0,   5, \n     82,   0,  16,   0,  18,   0, \n      0,   0,   6,   1,  16,   0, \n     18,   0,   0,   0, 131,   0, \n      0,   5, 162,   0,  16,   0, \n     18,   0,   0,   0,  86,  13, \n     16,   0,   4,   0,   0,   0, \n     85,   0,   0,  10, 162,   0, \n     16,   0,   4,   0,   0,   0, \n      6,   4,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0, 131,   0, \n      0,   5,  82,   0,  16,   0, \n     16,   0,   0,   0,   6,   1, \n     16,   0,  16,   0,   0,   0, \n    131,   0,   0,   5, 162,   0, \n     16,   0,  16,   0,   0,   0, \n     86,  13,  16,   0,   4,   0, \n      0,   0,   2,   0,   0,   1, \n     10,   0,   0,   1,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     17,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,  23,   0, \n      0,   1,  18,   0,   0,   1, \n     32,   0,   0,   7, 130,   0, \n     16,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  31,   0, \n      4,   3,  58,   0,  16,   0, \n      3,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n     16,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     54, 121,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     18,   0,   0,   1, 165,   0, \n      0,   8,  34,   0,  16,   0, \n     16,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8,  66,   0,  16,   0, \n     16,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     41,   0,   0,  10, 162,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  12,   0, \n      0,   0,  86,   5,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7, 162,   0,  16,   0, \n      4,   0,   0,   0,  86,   5, \n     16,   0,   0,   0,   0,   0, \n     86,  13,  16,   0,   4,   0, \n      0,   0, 165,   0,   0,   8, \n    130,   0,  16,   0,  16,   0, \n      0,   0,  26,   0,  16,   0, \n      4,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8,  18,   0,  16,   0, \n     16,   0,   0,   0,  58,   0, \n     16,   0,   4,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  76,   0, \n      0,   3,  42,   0,  16,   0, \n      5,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      0,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      1,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      5,   0,   0,   0,  86,   5, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     16,   0,   0,   0,  24,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   5,   0, \n      0,   0,  26,   0,  16,   0, \n     16,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     17,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59,  85,   0,   0,  10, \n    226,   0,  16,   0,   5,   0, \n      0,   0, 166,  10,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   5,   0,   0,   0, \n     42,   0,  16,   0,  16,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   5,   0,   0,   0, \n    246,  15,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  16,   0,   0,   0, \n     24,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      5,   0,   0,   0,  58,   0, \n     16,   0,  16,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  18,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     16,   0,   0,   0,   6,   0, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     16,   0,   0,   0,  24,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      2,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n     10,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      5,   0,   0,   0,  86,   5, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   5,   0, \n      0,   0,  26,   0,  16,   0, \n     16,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   3,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     17,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   8,  32, \n    128,  58,   8,  32, 128,  58, \n      8,  32, 128,  58, 171, 170, \n    170,  62,  85,   0,   0,  10, \n    226,   0,  16,   0,   5,   0, \n      0,   0, 166,  10,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  30,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   5,   0,   0,   0, \n     42,   0,  16,   0,  16,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   3,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   8,  32, 128,  58, \n      8,  32, 128,  58,   8,  32, \n    128,  58, 171, 170, 170,  62, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   5,   0,   0,   0, \n    246,  15,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     30,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      5,   0,   0,   0,  58,   0, \n     16,   0,  16,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      3,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  18,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      8,  32, 128,  58,   8,  32, \n    128,  58,   8,  32, 128,  58, \n    171, 170, 170,  62,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     16,   0,   0,   0,   6,   0, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   3,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   8,  32, 128,  58, \n      8,  32, 128,  58,   8,  32, \n    128,  58, 171, 170, 170,  62, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n     12,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  86,   9, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     30,   0,   0,   0,  30,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  19,   0, \n      0,   0,  26,   0,  16,   0, \n     16,   0,   0,   0,  54,   0, \n      0,   5,  98,   0,  16,   0, \n     19,   0,   0,   0,   6,   1, \n     16,   0,   5,   0,   0,   0, \n      1,   0,   0,  10, 226,   0, \n     16,   0,   6,   0,   0,   0, \n      6,   9,  16,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,  21,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0, 135,   0,   0,   5, \n    114,   0,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     22,   0,   0,   0,  70,   2, \n     16,   0,  22,   0,   0,   0, \n      2,  64,   0,   0, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255,   0,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  22,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  11, \n    114,   0,  16,   0,  23,   0, \n      0,   0,  70,   2,  16, 128, \n     65,   0,   0,   0,  22,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     23,   0,   0,   0,  70,   2, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16,   0,  21,   0, \n      0,   0,  70,   2,  16,   0, \n     23,   0,   0,   0, 140,   0, \n      0,  17, 114,   0,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  23,   0,   0,   0, \n      2,  64,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 114,   0,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  17,   0, \n      0,   0, 150,   7,  16,   0, \n      6,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  86,   0,   0,   5, \n    162,   0,  16,   0,   4,   0, \n      0,   0, 166,  14,  16,   0, \n      5,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0, 230,  11, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  19,   0, \n      0,   0,  42,   0,  16,   0, \n     16,   0,   0,   0,  54,   0, \n      0,   5,  98,   0,  16,   0, \n     19,   0,   0,   0,   6,   3, \n     16,   0,   5,   0,   0,   0, \n      1,   0,   0,  10, 226,   0, \n     16,   0,   6,   0,   0,   0, \n      6,   9,  16,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,  21,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0, 135,   0,   0,   5, \n    114,   0,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     22,   0,   0,   0,  70,   2, \n     16,   0,  22,   0,   0,   0, \n      2,  64,   0,   0, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255,   0,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  22,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  11, \n    114,   0,  16,   0,  23,   0, \n      0,   0,  70,   2,  16, 128, \n     65,   0,   0,   0,  22,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     23,   0,   0,   0,  70,   2, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16,   0,  21,   0, \n      0,   0,  70,   2,  16,   0, \n     23,   0,   0,   0, 140,   0, \n      0,  17, 114,   0,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  23,   0,   0,   0, \n      2,  64,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 114,   0,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  15,   0, \n      0,   0, 150,   7,  16,   0, \n      6,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  56,   0,   0,  10, \n    162,   0,  16,   0,   4,   0, \n      0,   0,  86,  13,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n    171, 170, 170,  62,   0,   0, \n      0,   0, 171, 170, 170,  62, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   5,   0,   0,   0, \n     58,   0,  16,   0,  16,   0, \n      0,   0,   1,   0,   0,  10, \n    226,   0,  16,   0,   6,   0, \n      0,   0,   6,   9,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 114,   0,  16,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0, 135,   0, \n      0,   5, 114,   0,  16,   0, \n     21,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16,   0,  21,   0, \n      0,   0,   2,  64,   0,   0, \n    232, 255, 255, 255, 232, 255, \n    255, 255, 232, 255, 255, 255, \n      0,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     21,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  21,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  11, 114,   0,  16,   0, \n     22,   0,   0,   0,  70,   2, \n     16, 128,  65,   0,   0,   0, \n     21,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,  22,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  22,   0,   0,   0, \n    140,   0,   0,  17, 114,   0, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n     21,   0,   0,   0,  70,   2, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,   5,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 114,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,   5,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  22,   0, \n      0,   0,   2,  64,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,   5,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 114,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0,  55,   0, \n      0,  12, 114,   0,  16,   0, \n     18,   0,   0,   0, 150,   7, \n     16,   0,   6,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  54,   0, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  30,   0, \n      0,   0,  10,   0,   0,   0, \n     20,   0,   0,   0,  30,   0, \n      0,   0,  86,   0,   0,   5, \n     98,   0,  16,   0,   6,   0, \n      0,   0,   6,   3,  16,   0, \n      5,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      5,   0,   0,   0,  10,   0, \n     16,   0,  16,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,  21,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0, 135,   0,   0,   5, \n    114,   0,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n     22,   0,   0,   0,  70,   2, \n     16,   0,  22,   0,   0,   0, \n      2,  64,   0,   0, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255,   0,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  22,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  11, \n    114,   0,  16,   0,  23,   0, \n      0,   0,  70,   2,  16, 128, \n     65,   0,   0,   0,  22,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n     23,   0,   0,   0,  70,   2, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16,   0,  21,   0, \n      0,   0,  70,   2,  16,   0, \n     23,   0,   0,   0, 140,   0, \n      0,  17, 114,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  22,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9, 114,   0,  16,   0, \n      5,   0,   0,   0,  70,   2, \n     16,   0,  21,   0,   0,   0, \n     70,   2,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n     20,   0,   0,   0,  70,   2, \n     16,   0,  23,   0,   0,   0, \n      2,  64,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,  20,   0, \n      0,   0,  70,   2,  16,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 114,   0,  16,   0, \n      5,   0,   0,   0,  70,   2, \n     16,   0,  20,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,  55,   0,   0,  12, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  56,   0,   0,  10, \n     50,   0,  16,   0,   5,   0, \n      0,   0, 150,   5,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0, 171, 170, 170,  62, \n    171, 170, 170,  62,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5, 130,   0, \n     16,   0,  17,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0,  54,   0,   0,   5, \n    130,   0,  16,   0,  15,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,  54,   0, \n      0,   5, 130,   0,  16,   0, \n     18,   0,   0,   0,  10,   0, \n     16,   0,   5,   0,   0,   0, \n     54,   0,   0,   5, 130,   0, \n     16,   0,  16,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n    150,   3,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  54,   0, \n      0,   5,  82,   0,  16,   0, \n     19,   0,   0,   0,   6,   1, \n     16,   0,   5,   0,   0,   0, \n     54,   0,   0,   5, 162,   0, \n     16,   0,  19,   0,   0,   0, \n     86,   9,  16,   0,  16,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,  19,   0, \n      0,   0,  70,  14,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  19,   0,   0,   0, \n     70,  14,  16,   0,  19,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  19,   0, \n      0,   0,  70,  14,  16,   0, \n     19,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10,  50,   0, \n     16,   0,  17,   0,   0,   0, \n     70,   0,  16,   0,  19,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0,   0,   0, \n      0,   0,   0,   0,  52,   0, \n      0,  10,  50,   0,  16,   0, \n     15,   0,   0,   0, 230,  10, \n     16,   0,  19,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     98,   0,  16,   0,  16,   0, \n      0,   0, 166,  11,  16,   0, \n      5,   0,   0,   0,  42,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0, 214,   2, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n     50,   0,  16,   0,  18,   0, \n      0,   0,  70,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     52,   0,   0,  10,  50,   0, \n     16,   0,  16,   0,   0,   0, \n    230,  10,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     17,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      6,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0, 150,   3, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 131,   0,   0,   5, \n     18,   0,  16,   0,  17,   0, \n      0,   0,  26,   0,  16,   0, \n     16,   0,   0,   0, 131,   0, \n      0,   5,  34,   0,  16,   0, \n     17,   0,   0,   0,  10,   0, \n     16,   0,   5,   0,   0,   0, \n    131,   0,   0,   5,  18,   0, \n     16,   0,  15,   0,   0,   0, \n     42,   0,  16,   0,  16,   0, \n      0,   0, 131,   0,   0,   5, \n     34,   0,  16,   0,  15,   0, \n      0,   0,  26,   0,  16,   0, \n      5,   0,   0,   0, 131,   0, \n      0,   5,  18,   0,  16,   0, \n     18,   0,   0,   0,  58,   0, \n     16,   0,  16,   0,   0,   0, \n    131,   0,   0,   5,  34,   0, \n     16,   0,  18,   0,   0,   0, \n     42,   0,  16,   0,   5,   0, \n      0,   0, 131,   0,   0,   5, \n     18,   0,  16,   0,  16,   0, \n      0,   0,  10,   0,  16,   0, \n     16,   0,   0,   0, 131,   0, \n      0,   5,  34,   0,  16,   0, \n     16,   0,   0,   0,  58,   0, \n     16,   0,   5,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  17,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     18,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   1, \n     10,   0,   0,   1,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     17,   0,   0,   0,  26,   0, \n     16,   0,  16,   0,   0,   0, \n     54,   0,   0,   8, 226,   0, \n     16,   0,  17,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  15,   0, \n      0,   0,  42,   0,  16,   0, \n     16,   0,   0,   0,  54,   0, \n      0,   8, 226,   0,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  18,   0,   0,   0, \n     58,   0,  16,   0,  16,   0, \n      0,   0,  54,   0,   0,   8, \n    226,   0,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 226,   0,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,  23,   0, \n      0,   1,  21,   0,   0,   1, \n      0,   0,   0,   7, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     17,   0,   0,   0,   0,   0, \n      0,   7, 242,   0,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   0,   0,   0,   7, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     14,   0,   0,   0,  70,  14, \n     16,   0,  18,   0,   0,   0, \n      0,   0,   0,   7, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     16,   0,   0,   0,  18,   0, \n      0,   1,  54,   0,   0,   5, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,  21,   0, \n      0,   1,  21,   0,   0,   1, \n     56,   0,   0,   7, 242,   0, \n     16,   0,   5,   0,   0,   0, \n    166,  10,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,  56,   0, \n      0,   7, 242,   0,  16,   0, \n      7,   0,   0,   0, 166,  10, \n     16,   0,   0,   0,   0,   0, \n    118,   8,  16,   0,   7,   0, \n      0,   0,  56,   0,   0,   7, \n    242,   0,  16,   0,   9,   0, \n      0,   0, 166,  10,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     56,   0,   0,   7, 242,   0, \n     16,   0,   8,   0,   0,   0, \n    166,  10,  16,   0,   0,   0, \n      0,   0, 134,   7,  16,   0, \n      8,   0,   0,   0,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      1,   0,   0,   0,  54,   0, \n      0,   5,  82,   0,  16,   0, \n      5,   0,   0,   0, 166,   8, \n     16,   0,   5,   0,   0,   0, \n     54,   0,   0,   5,  82,   0, \n     16,   0,  10,   0,   0,   0, \n    246,  14,  16,   0,   7,   0, \n      0,   0,  54,   0,   0,   5, \n     82,   0,  16,   0,   9,   0, \n      0,   0, 166,   8,  16,   0, \n      9,   0,   0,   0,  54,   0, \n      0,   5,  82,   0,  16,   0, \n     11,   0,   0,   0,  86,   4, \n     16,   0,   8,   0,   0,   0, \n     18,   0,   0,   1,  54,   0, \n      0,   5,  82,   0,  16,   0, \n     10,   0,   0,   0, 166,  11, \n     16,   0,   7,   0,   0,   0, \n     54,   0,   0,   5,  82,   0, \n     16,   0,  11,   0,   0,   0, \n      6,   1,  16,   0,   8,   0, \n      0,   0,  21,   0,   0,   1, \n     76,   0,   0,   3,  10,   0, \n     16,   0,   6,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,  26,   0,   0,   0, \n     54,  32,   0,   5, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  50,   0,   0,  15, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   0, 255, 127,  71, \n      0, 255, 127,  71,   0, 255, \n    127,  71,   0, 255, 127,  71, \n      2,  64,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,  63,  28,   0,   0,   5, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  35,   0, \n      0,  12, 194,   0,  16,   0, \n      7,   0,   0,   0,  86,  13, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   6,   8,  16,   0, \n      6,   0,   0,   0,  54,   0, \n      0,   5, 162,   0,  16,   0, \n     10,   0,   0,   0,  86,   1, \n     16,   0,   7,   0,   0,   0, \n     54,  32,   0,   5, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  50,   0,   0,  15, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0, 255, 127,  71, \n      0, 255, 127,  71,   0, 255, \n    127,  71,   0, 255, 127,  71, \n      2,  64,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,  63,  28,   0,   0,   5, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  35,   0, \n      0,  12,  50,   0,  16,   0, \n      7,   0,   0,   0, 214,   5, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 134,   0,  16,   0, \n      6,   0,   0,   0,  54,  32, \n      0,   5, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n     50,   0,   0,  15, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255, 127,  71,   0, 255, \n    127,  71,   0, 255, 127,  71, \n      0, 255, 127,  71,   2,  64, \n      0,   0,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,  63,   0,   0,   0,  63, \n     28,   0,   0,   5, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  35,   0,   0,  12, \n     50,   0,  16,   0,   8,   0, \n      0,   0, 214,   5,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    134,   0,  16,   0,   6,   0, \n      0,   0,  54,   0,   0,   5, \n    162,   0,  16,   0,  11,   0, \n      0,   0, 246,  11,  16,   0, \n      8,   0,   0,   0,  54,  32, \n      0,   5, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     50,   0,   0,  15, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255, 127,  71,   0, 255, \n    127,  71,   0, 255, 127,  71, \n      0, 255, 127,  71,   2,  64, \n      0,   0,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,  63,   0,   0,   0,  63, \n     28,   0,   0,   5, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  35,   0,   0,  12, \n    194,   0,  16,   0,   8,   0, \n      0,   0,  86,  13,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      6,   8,  16,   0,   6,   0, \n      0,   0,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,  32,   0,   0,   0, \n    130,   0,   0,   5,  98,   0, \n     16,   0,   0,   0,   0,   0, \n      6,   2,  16,   0,   5,   0, \n      0,   0, 130,   0,   0,   5, \n     98,   0,  16,   0,   1,   0, \n      0,   0,  86,   7,  16,   0, \n      5,   0,   0,   0,  35,   0, \n      0,  12, 194,   0,  16,   0, \n      7,   0,   0,   0,  86,   9, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,  86,   9,  16,   0, \n      0,   0,   0,   0, 130,   0, \n      0,   5,  98,   0,  16,   0, \n      0,   0,   0,   0,   6,   2, \n     16,   0,  10,   0,   0,   0, \n    130,   0,   0,   5,  98,   0, \n     16,   0,   1,   0,   0,   0, \n     86,   4,  16,   0,   7,   0, \n      0,   0,  35,   0,   0,  12, \n     50,   0,  16,   0,   7,   0, \n      0,   0, 150,   5,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    150,   5,  16,   0,   0,   0, \n      0,   0, 130,   0,   0,   5, \n     98,   0,  16,   0,   0,   0, \n      0,   0,   6,   2,  16,   0, \n      9,   0,   0,   0, 130,   0, \n      0,   5,  98,   0,  16,   0, \n      1,   0,   0,   0,  86,   7, \n     16,   0,   9,   0,   0,   0, \n     35,   0,   0,  12,  50,   0, \n     16,   0,   8,   0,   0,   0, \n    150,   5,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 150,   5, \n     16,   0,   0,   0,   0,   0, \n    130,   0,   0,   5,  98,   0, \n     16,   0,   0,   0,   0,   0, \n      6,   2,  16,   0,  11,   0, \n      0,   0, 130,   0,   0,   5, \n     98,   0,  16,   0,   1,   0, \n      0,   0, 246,  14,  16,   0, \n      8,   0,   0,   0,  35,   0, \n      0,  12, 194,   0,  16,   0, \n      8,   0,   0,   0,  86,   9, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,  86,   9,  16,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   1,  10,   0,   0,   1, \n     54,   0,   0,   5, 194,   0, \n     16,   0,   7,   0,   0,   0, \n      6,   4,  16,   0,   5,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   7,   0, \n      0,   0,  10,   0,  16,   0, \n     10,   0,   0,   0,  54,   0, \n      0,   5,  50,   0,  16,   0, \n      8,   0,   0,   0,  70,   0, \n     16,   0,   9,   0,   0,   0, \n     54,   0,   0,   5,  66,   0, \n     16,   0,   8,   0,   0,   0, \n     10,   0,  16,   0,  11,   0, \n      0,   0,   2,   0,   0,   1, \n     23,   0,   0,   1,  32,   0, \n      0,   7,  34,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  39,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      0,   0,   0,   0,  80,   0, \n      0,   7,  34,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  80,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  50,   0, \n     16,   0,   8,   0,   0,   0, \n    230,  10,  16,   0,   8,   0, \n      0,   0,  21,   0,   0,   1, \n     54,   0,   0,   5,  50,   0, \n     16,   0,   7,   0,   0,   0, \n     70,   0,  16,   0,   8,   0, \n      0,   0,  21,   0,   0,   1, \n     54,   0,   0,   5, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,   4,  16,   0,   7,   0, \n      0,   0,  21,   0,   0,   1, \n     54,   0,   0,   4,  66,   0, \n     16,   0,   4,   0,   0,   0, \n     26,   0,   2,   0,  35,   0, \n      0,   9,  98,   0,  16,   0, \n      0,   0,   0,   0,   6,   2, \n     16,   0,   3,   0,   0,   0, \n      6,   1,  16,   0,   2,   0, \n      0,   0,   6,   2,  16,   0, \n      4,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      1,   0,   0,   0, 150,   5, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  78,   0,   0,   8, \n    194,   0,  16,   0,   2,   0, \n      0,   0,   0, 208,   0,   0, \n      6,   4,  16,   0,   1,   0, \n      0,   0,   6,   4,  16,   0, \n      2,   0,   0,   0,  35,   0, \n      0,  10,  50,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16, 128,  65,   0,   0,   0, \n      2,   0,   0,   0, 230,  10, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  41,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  66,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     66,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     26,   0,   0,   0,   1,  64, \n      0,   0,   6,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  31,   0, \n      4,   3,  58,   0,  16,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  11, 130,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  42, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  18,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  10,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  42,   0,   0,   7, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n    139,   0,   0,  15, 242,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,  28,   0, \n      0,   0,  27,   0,   0,   0, \n     31,   0,   0,   0,  29,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0, 182,  15, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   3,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n    140,   0,   0,  11, 130,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     66,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n    130,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11, 130,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  25,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     87,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0, 139,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  29,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   7,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0, 140,   0,   0,  20, \n     82,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  11,   0, \n      0,   0,   0,   0,   0,   0, \n      6,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  87,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  41,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   6,   0,   0,   0, \n     30,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0, 139,   0, \n      0,  15,  98,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     27,   0,   0,   0,  24,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0, 246,  15,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11, 130,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   8,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11, 130,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  20,   0, \n      0,   0,   1,  64,   0,   0, \n     12,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  18,   0,   0,   1, \n    139,   0,   0,  15, 242,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,  27,   0, \n      0,   0,  27,   0,   0,   0, \n     31,   0,   0,   0,  28,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0, 182,  15, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   3,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n    140,   0,   0,  20,  98,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0, 166,  11, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  26,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n    139,   0,   0,  15,  50,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  29,   0, \n      0,   0,  29,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 230,  10, \n     16,   0,   2,   0,   0,   0, \n      1,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  41,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    139,   0,   0,  15,  98,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  27,   0,   0,   0, \n     24,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n    130,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  38,   0,   0,   8, \n      0, 208,   0,   0,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  32,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  31,   0,   4,   3, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  22,  11,  16,   0, \n      7,   0,   0,   0,  54,   0, \n      0,   5, 130,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     18,   0,   0,   1,  54,   0, \n      0,   5, 130,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  32,   0, \n      0,  10, 114,   0,  16,   0, \n      1,   0,   0,   0, 246,  15, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   2,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   1,   0, \n      0,   0, 150,   5,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n    230,   4,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,  85,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0, 230,   4,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      7,   0,   0,   0, 230,   4, \n     16,   0,   2,   0,   0,   0, \n    230,   4,  16,   0,   3,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   1,   0,   0,   0, \n    230,   4,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0, 230,   4, \n     16,   0,   1,   0,   0,   0, \n     21,   0,   0,   1, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0, 230,   4, \n     16,   0,   7,   0,   0,   0, \n     30,   0,   0,   7, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5, 194,   0,  16,   0, \n      8,   0,   0,   0, 246,  11, \n     16,   0,   8,   0,   0,   0, \n     54,   0,   0,   5, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     22,  14,  16,   0,   8,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  21,   0, \n      0,   1,  32,   0,   0,  10, \n    114,   0,  16,   0,   1,   0, \n      0,   0,   6,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      2,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  82,   0, \n     16,   0,   0,   0,   0,   0, \n     86,   6,  16,   0,   1,   0, \n      0,   0,   6,   1,  16,   0, \n      1,   0,   0,   0,  31,   0, \n      4,   3,  10,   0,  16,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  21,   0, \n      0,   1, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,  62,   0, \n      0,   1,  83,  84,  65,  84, \n    148,   0,   0,   0, 217,   4, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0, 118,   0,   0,   0, \n    234,   0,   0,   0, 179,   0, \n      0,   0,  60,   0,   0,   0, \n     38,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  44,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 193,   0,   0,   0, \n     64,   0,   0,   0,  68,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/resolve_full_8bpp_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_resolve_edram_info;        // Offset:    0 Size:     4\n//   uint xe_resolve_coordinate_info;   // Offset:    4 Size:     4\n//   uint xe_resolve_dest_info;         // Offset:    8 Size:     4\n//   uint xe_resolve_dest_coordinate_info;// Offset:   12 Size:     4\n//   uint xe_resolve_dest_base;         // Offset:   16 Size:     4\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_resolve_edram                  texture    byte         r/o      T0             t0      1 \n// xe_resolve_dest                       UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][2], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xy\ndcl_temps 18\ndcl_thread_group 8, 8, 1\nubfe r0.x, l(11), l(5), CB0[0][0].y\nand r1.xyzw, CB0[0][0].xzzw, l(1023, 8, 0x01000000, 1023)\nushr r2.xyzw, CB0[0][0].ywww, l(4, 10, 20, 24)\nuge r0.x, vThreadID.x, r0.x\nif_nz r0.x\n  ret \nendif \nubfe r0.xyzw, l(2, 11, 4, 1), l(10, 13, 24, 28), CB0[0][0].xxxx\nmov r3.x, CB0[0][0].y\nmov r3.y, r2.x\nbfi r3.xy, l(4, 1, 0, 0), l(3, 3, 0, 0), r3.xyxx, l(0, 0, 0, 0)\nibfe r2.x, l(6), l(16), CB0[0][0].z\nishl r2.x, r2.x, l(23)\niadd r2.x, r2.x, l(0x3f800000)\nine r3.z, r1.z, l(0)\nbfi r4.xyzw, l(4, 4, 4, 4), l(3, 3, 3, 3), r2.wzww, l(0, 0, 0, 0)\nubfe r2.z, l(3), l(28), CB0[0][0].w\nishl r5.y, vThreadID.x, l(3)\nmov r5.xzw, vThreadID.yyyy\niadd r3.xy, r3.xyxx, r5.ywyy\nuge r2.w, l(3), r2.z\nif_nz r2.w\n  mov r6.y, r2.z\nelse \n  ieq r2.w, r2.z, l(5)\n  if_nz r2.w\n    mov r6.y, l(2)\n  else \n    mov r6.y, l(0)\n  endif \nendif \nuge r6.zw, r0.xxxx, l(0, 0, 2, 1)\nand r6.zw, r6.zzzw, l(0, 0, 1, 1)\nishl r3.xy, r3.xyxx, r6.zwzz\nushr r6.x, r6.y, l(1)\nand r6.xy, r6.xyxx, l(1, 1, 0, 0)\niadd r3.xy, r3.xyxx, r6.xyxx\nushr r6.x, l(80), r0.w\nmov r6.y, l(16)\nudiv r7.xy, null, r3.xyxx, r6.xyxx\nimad r0.x, r7.y, r1.x, r7.x\niadd r0.x, r0.x, r0.y\nimad r3.xy, -r7.xyxx, r6.xyxx, r3.xyxx\nimad r0.y, r3.y, r6.x, r3.x\nishl r0.y, r0.y, r0.w\nimad r0.x, r0.x, l(1280), r0.y\nudiv null, r0.x, r0.x, l(0x00280000)\nishl r0.x, r0.x, l(2)\niadd r0.y, r0.w, r6.z\nishl r1.x, l(4), r0.y\nine r2.w, r0.w, l(0)\nand r2.w, r2.w, r3.z\nif_nz r2.w\n  iadd r0.x, r0.x, l(4)\nendif \nieq r2.w, r1.x, l(4)\nif_nz r2.w\n  ld_raw r3.xyzw, r0.x, T0[0].xyzw\n  iadd r6.x, r0.x, l(16)\n  ld_raw r6.xyzw, r6.x, T0[0].xyzw\nelse \n  ld_raw r3.x, r0.x, T0[0].xxxx\n  iadd r7.x, r1.x, r0.x\n  ld_raw r3.y, r7.x, T0[0].xxxx\n  ishl r7.xyzw, l(8, 12, 16, 20), r0.yyyy\n  iadd r7.xyzw, r0.xxxx, r7.xyzw\n  ld_raw r3.z, r7.x, T0[0].xxxx\n  ld_raw r3.w, r7.y, T0[0].xxxx\n  ld_raw r6.x, r7.z, T0[0].xxxx\n  ld_raw r6.y, r7.w, T0[0].xxxx\n  ishl r7.xy, l(24, 28, 0, 0), r0.yyyy\n  iadd r7.xy, r0.xxxx, r7.xyxx\n  ld_raw r6.z, r7.x, T0[0].xxxx\n  ld_raw r6.w, r7.y, T0[0].xxxx\nendif \nif_nz r0.w\n  switch r0.z\n    case l(5)\n    ibfe r7.xyzw, l(16, 16, 16, 16), l(0, 0, 0, 0), r3.xyzw\n    itof r7.xyzw, r7.xyzw\n    mul r7.xyzw, r7.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n    max r3.xyzw, r7.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n    ibfe r7.xyzw, l(16, 16, 16, 16), l(0, 0, 0, 0), r6.xyzw\n    itof r7.xyzw, r7.xyzw\n    mul r7.xyzw, r7.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n    max r6.xyzw, r7.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n    break \n    case l(7)\n    f16tof32 r3.xyzw, r3.xyzw\n    f16tof32 r6.xyzw, r6.xyzw\n    break \n    default \n    break \n  endswitch \nelse \n  switch r0.z\n    case l(0)\n    case l(1)\n    movc r7.x, r1.z, l(16), l(0)\n    ushr r8.xyzw, r3.xyzw, r7.xxxx\n    and r8.xyzw, r8.xyzw, l(255, 255, 255, 255)\n    utof r8.xyzw, r8.xyzw\n    mul r3.xyzw, r8.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n    ushr r7.xyzw, r6.xyzw, r7.xxxx\n    and r7.xyzw, r7.xyzw, l(255, 255, 255, 255)\n    utof r7.xyzw, r7.xyzw\n    mul r6.xyzw, r7.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n    break \n    case l(2)\n    case l(10)\n    movc r7.x, r1.z, l(20), l(0)\n    ushr r8.xyzw, r3.xyzw, r7.xxxx\n    and r8.xyzw, r8.xyzw, l(1023, 1023, 1023, 1023)\n    utof r8.xyzw, r8.xyzw\n    mul r3.xyzw, r8.xyzw, l(0.000978, 0.000978, 0.000978, 0.000978)\n    ushr r7.xyzw, r6.xyzw, r7.xxxx\n    and r7.xyzw, r7.xyzw, l(1023, 1023, 1023, 1023)\n    utof r7.xyzw, r7.xyzw\n    mul r6.xyzw, r7.xyzw, l(0.000978, 0.000978, 0.000978, 0.000978)\n    break \n    case l(3)\n    case l(12)\n    movc r7.x, r1.z, l(20), l(0)\n    ushr r8.xyzw, r3.xyzw, r7.xxxx\n    and r9.xyzw, r8.xyzw, l(1023, 1023, 1023, 1023)\n    and r10.xyzw, r8.xyzw, l(127, 127, 127, 127)\n    ubfe r11.xyzw, l(3, 3, 3, 3), l(7, 7, 7, 7), r8.xyzw\n    firstbit_hi r12.xyzw, r10.xyzw\n    iadd r12.xyzw, r12.xyzw, l(-24, -24, -24, -24)\n    movc r12.xyzw, r10.xyzw, r12.xyzw, l(8,8,8,8)\n    iadd r13.xyzw, -r12.xyzw, l(1, 1, 1, 1)\n    movc r13.xyzw, r11.xyzw, r11.xyzw, r13.xyzw\n    bfi r8.xyzw, l(7, 7, 7, 7), r12.xyzw, r8.xyzw, l(0, 0, 0, 0)\n    and r8.xyzw, r8.xyzw, l(127, 127, 127, 127)\n    movc r8.xyzw, r11.xyzw, r10.xyzw, r8.xyzw\n    ishl r10.xyzw, r13.xyzw, l(23, 23, 23, 23)\n    iadd r10.xyzw, r10.xyzw, l(0x3e000000, 0x3e000000, 0x3e000000, 0x3e000000)\n    ishl r8.xyzw, r8.xyzw, l(16, 16, 16, 16)\n    iadd r8.xyzw, r10.xyzw, r8.xyzw\n    movc r3.xyzw, r9.xyzw, r8.xyzw, l(0,0,0,0)\n    ushr r7.xyzw, r6.xyzw, r7.xxxx\n    and r8.xyzw, r7.xyzw, l(1023, 1023, 1023, 1023)\n    and r9.xyzw, r7.xyzw, l(127, 127, 127, 127)\n    ubfe r10.xyzw, l(3, 3, 3, 3), l(7, 7, 7, 7), r7.xyzw\n    firstbit_hi r11.xyzw, r9.xyzw\n    iadd r11.xyzw, r11.xyzw, l(-24, -24, -24, -24)\n    movc r11.xyzw, r9.xyzw, r11.xyzw, l(8,8,8,8)\n    iadd r12.xyzw, -r11.xyzw, l(1, 1, 1, 1)\n    movc r12.xyzw, r10.xyzw, r10.xyzw, r12.xyzw\n    bfi r7.xyzw, l(7, 7, 7, 7), r11.xyzw, r7.xyzw, l(0, 0, 0, 0)\n    and r7.xyzw, r7.xyzw, l(127, 127, 127, 127)\n    movc r7.xyzw, r10.xyzw, r9.xyzw, r7.xyzw\n    ishl r9.xyzw, r12.xyzw, l(23, 23, 23, 23)\n    iadd r9.xyzw, r9.xyzw, l(0x3e000000, 0x3e000000, 0x3e000000, 0x3e000000)\n    ishl r7.xyzw, r7.xyzw, l(16, 16, 16, 16)\n    iadd r7.xyzw, r9.xyzw, r7.xyzw\n    movc r6.xyzw, r8.xyzw, r7.xyzw, l(0,0,0,0)\n    break \n    case l(4)\n    ibfe r7.xyzw, l(16, 16, 16, 16), l(0, 0, 0, 0), r3.xyzw\n    itof r7.xyzw, r7.xyzw\n    mul r7.xyzw, r7.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n    max r3.xyzw, r7.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n    ibfe r7.xyzw, l(16, 16, 16, 16), l(0, 0, 0, 0), r6.xyzw\n    itof r7.xyzw, r7.xyzw\n    mul r7.xyzw, r7.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n    max r6.xyzw, r7.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n    break \n    case l(6)\n    f16tof32 r3.xyzw, r3.xyzw\n    f16tof32 r6.xyzw, r6.xyzw\n    break \n    default \n    break \n  endswitch \nendif \nuge r7.x, r2.z, l(4)\nif_nz r7.x\n  mul r7.x, r2.x, l(0.500000)\n  iadd r7.y, r0.x, l(320)\n  if_nz r2.w\n    ld_raw r8.xyzw, r7.y, T0[0].xyzw\n    iadd r7.z, r0.x, l(336)\n    ld_raw r9.xyzw, r7.z, T0[0].xyzw\n  else \n    ld_raw r8.x, r7.y, T0[0].xxxx\n    iadd r7.z, r1.x, r7.y\n    ld_raw r8.y, r7.z, T0[0].xxxx\n    ishl r10.xyzw, l(8, 12, 16, 20), r0.yyyy\n    iadd r10.xyzw, r7.yyyy, r10.xyzw\n    ld_raw r8.z, r10.x, T0[0].xxxx\n    ld_raw r8.w, r10.y, T0[0].xxxx\n    ld_raw r9.x, r10.z, T0[0].xxxx\n    ld_raw r9.y, r10.w, T0[0].xxxx\n    ishl r7.zw, l(0, 0, 24, 28), r0.yyyy\n    iadd r7.zw, r7.zzzw, r7.yyyy\n    ld_raw r9.z, r7.z, T0[0].xxxx\n    ld_raw r9.w, r7.w, T0[0].xxxx\n  endif \n  if_nz r0.w\n    switch r0.z\n      case l(5)\n      ibfe r10.xyzw, l(16, 16, 16, 16), l(0, 0, 0, 0), r8.xyzw\n      itof r10.xyzw, r10.xyzw\n      mul r10.xyzw, r10.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n      max r8.xyzw, r10.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n      ibfe r10.xyzw, l(16, 16, 16, 16), l(0, 0, 0, 0), r9.xyzw\n      itof r10.xyzw, r10.xyzw\n      mul r10.xyzw, r10.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n      max r9.xyzw, r10.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n      break \n      case l(7)\n      f16tof32 r8.xyzw, r8.xyzw\n      f16tof32 r9.xyzw, r9.xyzw\n      break \n      default \n      break \n    endswitch \n  else \n    switch r0.z\n      case l(0)\n      case l(1)\n      movc r7.z, r1.z, l(16), l(0)\n      ushr r10.xyzw, r8.xyzw, r7.zzzz\n      and r10.xyzw, r10.xyzw, l(255, 255, 255, 255)\n      utof r10.xyzw, r10.xyzw\n      mul r8.xyzw, r10.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n      ushr r10.xyzw, r9.xyzw, r7.zzzz\n      and r10.xyzw, r10.xyzw, l(255, 255, 255, 255)\n      utof r10.xyzw, r10.xyzw\n      mul r9.xyzw, r10.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n      break \n      case l(2)\n      case l(10)\n      movc r7.z, r1.z, l(20), l(0)\n      ushr r10.xyzw, r8.xyzw, r7.zzzz\n      and r10.xyzw, r10.xyzw, l(1023, 1023, 1023, 1023)\n      utof r10.xyzw, r10.xyzw\n      mul r8.xyzw, r10.xyzw, l(0.000978, 0.000978, 0.000978, 0.000978)\n      ushr r10.xyzw, r9.xyzw, r7.zzzz\n      and r10.xyzw, r10.xyzw, l(1023, 1023, 1023, 1023)\n      utof r10.xyzw, r10.xyzw\n      mul r9.xyzw, r10.xyzw, l(0.000978, 0.000978, 0.000978, 0.000978)\n      break \n      case l(3)\n      case l(12)\n      movc r7.z, r1.z, l(20), l(0)\n      ushr r10.xyzw, r8.xyzw, r7.zzzz\n      and r11.xyzw, r10.xyzw, l(1023, 1023, 1023, 1023)\n      and r12.xyzw, r10.xyzw, l(127, 127, 127, 127)\n      ubfe r13.xyzw, l(3, 3, 3, 3), l(7, 7, 7, 7), r10.xyzw\n      firstbit_hi r14.xyzw, r12.xyzw\n      iadd r14.xyzw, r14.xyzw, l(-24, -24, -24, -24)\n      movc r14.xyzw, r12.xyzw, r14.xyzw, l(8,8,8,8)\n      iadd r15.xyzw, -r14.xyzw, l(1, 1, 1, 1)\n      movc r15.xyzw, r13.xyzw, r13.xyzw, r15.xyzw\n      bfi r10.xyzw, l(7, 7, 7, 7), r14.xyzw, r10.xyzw, l(0, 0, 0, 0)\n      and r10.xyzw, r10.xyzw, l(127, 127, 127, 127)\n      movc r10.xyzw, r13.xyzw, r12.xyzw, r10.xyzw\n      ishl r12.xyzw, r15.xyzw, l(23, 23, 23, 23)\n      iadd r12.xyzw, r12.xyzw, l(0x3e000000, 0x3e000000, 0x3e000000, 0x3e000000)\n      ishl r10.xyzw, r10.xyzw, l(16, 16, 16, 16)\n      iadd r10.xyzw, r12.xyzw, r10.xyzw\n      movc r8.xyzw, r11.xyzw, r10.xyzw, l(0,0,0,0)\n      ushr r10.xyzw, r9.xyzw, r7.zzzz\n      and r11.xyzw, r10.xyzw, l(1023, 1023, 1023, 1023)\n      and r12.xyzw, r10.xyzw, l(127, 127, 127, 127)\n      ubfe r13.xyzw, l(3, 3, 3, 3), l(7, 7, 7, 7), r10.xyzw\n      firstbit_hi r14.xyzw, r12.xyzw\n      iadd r14.xyzw, r14.xyzw, l(-24, -24, -24, -24)\n      movc r14.xyzw, r12.xyzw, r14.xyzw, l(8,8,8,8)\n      iadd r15.xyzw, -r14.xyzw, l(1, 1, 1, 1)\n      movc r15.xyzw, r13.xyzw, r13.xyzw, r15.xyzw\n      bfi r10.xyzw, l(7, 7, 7, 7), r14.xyzw, r10.xyzw, l(0, 0, 0, 0)\n      and r10.xyzw, r10.xyzw, l(127, 127, 127, 127)\n      movc r10.xyzw, r13.xyzw, r12.xyzw, r10.xyzw\n      ishl r12.xyzw, r15.xyzw, l(23, 23, 23, 23)\n      iadd r12.xyzw, r12.xyzw, l(0x3e000000, 0x3e000000, 0x3e000000, 0x3e000000)\n      ishl r10.xyzw, r10.xyzw, l(16, 16, 16, 16)\n      iadd r10.xyzw, r12.xyzw, r10.xyzw\n      movc r9.xyzw, r11.xyzw, r10.xyzw, l(0,0,0,0)\n      break \n      case l(4)\n      ibfe r10.xyzw, l(16, 16, 16, 16), l(0, 0, 0, 0), r8.xyzw\n      itof r10.xyzw, r10.xyzw\n      mul r10.xyzw, r10.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n      max r8.xyzw, r10.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n      ibfe r10.xyzw, l(16, 16, 16, 16), l(0, 0, 0, 0), r9.xyzw\n      itof r10.xyzw, r10.xyzw\n      mul r10.xyzw, r10.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n      max r9.xyzw, r10.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n      break \n      case l(6)\n      f16tof32 r8.xyzw, r8.xyzw\n      f16tof32 r9.xyzw, r9.xyzw\n      break \n      default \n      break \n    endswitch \n  endif \n  add r3.xyzw, r3.xyzw, r8.xyzw\n  add r6.xyzw, r6.xyzw, r9.xyzw\n  uge r2.z, r2.z, l(6)\n  if_nz r2.z\n    ishl r2.z, l(4), r0.w\n    mul r2.x, r2.x, l(0.250000)\n    iadd r0.x, r0.x, r2.z\n    if_nz r2.w\n      ld_raw r8.xyzw, r0.x, T0[0].xyzw\n      iadd r7.z, r0.x, l(16)\n      ld_raw r9.xyzw, r7.z, T0[0].xyzw\n    else \n      ld_raw r8.x, r0.x, T0[0].xxxx\n      iadd r7.z, r1.x, r0.x\n      ld_raw r8.y, r7.z, T0[0].xxxx\n      ishl r10.xyzw, l(8, 12, 16, 20), r0.yyyy\n      iadd r10.xyzw, r0.xxxx, r10.xyzw\n      ld_raw r8.z, r10.x, T0[0].xxxx\n      ld_raw r8.w, r10.y, T0[0].xxxx\n      ld_raw r9.x, r10.z, T0[0].xxxx\n      ld_raw r9.y, r10.w, T0[0].xxxx\n      ishl r7.zw, l(0, 0, 24, 28), r0.yyyy\n      iadd r7.zw, r0.xxxx, r7.zzzw\n      ld_raw r9.z, r7.z, T0[0].xxxx\n      ld_raw r9.w, r7.w, T0[0].xxxx\n    endif \n    if_nz r0.w\n      switch r0.z\n        case l(5)\n        ibfe r10.xyzw, l(16, 16, 16, 16), l(0, 0, 0, 0), r8.xyzw\n        itof r10.xyzw, r10.xyzw\n        mul r10.xyzw, r10.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r8.xyzw, r10.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        ibfe r10.xyzw, l(16, 16, 16, 16), l(0, 0, 0, 0), r9.xyzw\n        itof r10.xyzw, r10.xyzw\n        mul r10.xyzw, r10.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r9.xyzw, r10.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        break \n        case l(7)\n        f16tof32 r8.xyzw, r8.xyzw\n        f16tof32 r9.xyzw, r9.xyzw\n        break \n        default \n        break \n      endswitch \n    else \n      switch r0.z\n        case l(0)\n        case l(1)\n        movc r0.x, r1.z, l(16), l(0)\n        ushr r10.xyzw, r8.xyzw, r0.xxxx\n        and r10.xyzw, r10.xyzw, l(255, 255, 255, 255)\n        utof r10.xyzw, r10.xyzw\n        mul r8.xyzw, r10.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        ushr r10.xyzw, r9.xyzw, r0.xxxx\n        and r10.xyzw, r10.xyzw, l(255, 255, 255, 255)\n        utof r10.xyzw, r10.xyzw\n        mul r9.xyzw, r10.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        break \n        case l(2)\n        case l(10)\n        movc r0.x, r1.z, l(20), l(0)\n        ushr r10.xyzw, r8.xyzw, r0.xxxx\n        and r10.xyzw, r10.xyzw, l(1023, 1023, 1023, 1023)\n        utof r10.xyzw, r10.xyzw\n        mul r8.xyzw, r10.xyzw, l(0.000978, 0.000978, 0.000978, 0.000978)\n        ushr r10.xyzw, r9.xyzw, r0.xxxx\n        and r10.xyzw, r10.xyzw, l(1023, 1023, 1023, 1023)\n        utof r10.xyzw, r10.xyzw\n        mul r9.xyzw, r10.xyzw, l(0.000978, 0.000978, 0.000978, 0.000978)\n        break \n        case l(3)\n        case l(12)\n        movc r0.x, r1.z, l(20), l(0)\n        ushr r10.xyzw, r8.xyzw, r0.xxxx\n        and r11.xyzw, r10.xyzw, l(1023, 1023, 1023, 1023)\n        and r12.xyzw, r10.xyzw, l(127, 127, 127, 127)\n        ubfe r13.xyzw, l(3, 3, 3, 3), l(7, 7, 7, 7), r10.xyzw\n        firstbit_hi r14.xyzw, r12.xyzw\n        iadd r14.xyzw, r14.xyzw, l(-24, -24, -24, -24)\n        movc r14.xyzw, r12.xyzw, r14.xyzw, l(8,8,8,8)\n        iadd r15.xyzw, -r14.xyzw, l(1, 1, 1, 1)\n        movc r15.xyzw, r13.xyzw, r13.xyzw, r15.xyzw\n        bfi r10.xyzw, l(7, 7, 7, 7), r14.xyzw, r10.xyzw, l(0, 0, 0, 0)\n        and r10.xyzw, r10.xyzw, l(127, 127, 127, 127)\n        movc r10.xyzw, r13.xyzw, r12.xyzw, r10.xyzw\n        ishl r12.xyzw, r15.xyzw, l(23, 23, 23, 23)\n        iadd r12.xyzw, r12.xyzw, l(0x3e000000, 0x3e000000, 0x3e000000, 0x3e000000)\n        ishl r10.xyzw, r10.xyzw, l(16, 16, 16, 16)\n        iadd r10.xyzw, r12.xyzw, r10.xyzw\n        movc r8.xyzw, r11.xyzw, r10.xyzw, l(0,0,0,0)\n        ushr r10.xyzw, r9.xyzw, r0.xxxx\n        and r11.xyzw, r10.xyzw, l(1023, 1023, 1023, 1023)\n        and r12.xyzw, r10.xyzw, l(127, 127, 127, 127)\n        ubfe r13.xyzw, l(3, 3, 3, 3), l(7, 7, 7, 7), r10.xyzw\n        firstbit_hi r14.xyzw, r12.xyzw\n        iadd r14.xyzw, r14.xyzw, l(-24, -24, -24, -24)\n        movc r14.xyzw, r12.xyzw, r14.xyzw, l(8,8,8,8)\n        iadd r15.xyzw, -r14.xyzw, l(1, 1, 1, 1)\n        movc r15.xyzw, r13.xyzw, r13.xyzw, r15.xyzw\n        bfi r10.xyzw, l(7, 7, 7, 7), r14.xyzw, r10.xyzw, l(0, 0, 0, 0)\n        and r10.xyzw, r10.xyzw, l(127, 127, 127, 127)\n        movc r10.xyzw, r13.xyzw, r12.xyzw, r10.xyzw\n        ishl r12.xyzw, r15.xyzw, l(23, 23, 23, 23)\n        iadd r12.xyzw, r12.xyzw, l(0x3e000000, 0x3e000000, 0x3e000000, 0x3e000000)\n        ishl r10.xyzw, r10.xyzw, l(16, 16, 16, 16)\n        iadd r10.xyzw, r12.xyzw, r10.xyzw\n        movc r9.xyzw, r11.xyzw, r10.xyzw, l(0,0,0,0)\n        break \n        case l(4)\n        ibfe r10.xyzw, l(16, 16, 16, 16), l(0, 0, 0, 0), r8.xyzw\n        itof r10.xyzw, r10.xyzw\n        mul r10.xyzw, r10.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r8.xyzw, r10.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        ibfe r10.xyzw, l(16, 16, 16, 16), l(0, 0, 0, 0), r9.xyzw\n        itof r10.xyzw, r10.xyzw\n        mul r10.xyzw, r10.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r9.xyzw, r10.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        break \n        case l(6)\n        f16tof32 r8.xyzw, r8.xyzw\n        f16tof32 r9.xyzw, r9.xyzw\n        break \n        default \n        break \n      endswitch \n    endif \n    add r8.xyzw, r3.xyzw, r8.xyzw\n    add r9.xyzw, r6.xyzw, r9.xyzw\n    iadd r0.x, r2.z, r7.y\n    if_nz r2.w\n      ld_raw r10.xyzw, r0.x, T0[0].xyzw\n      iadd r2.z, r0.x, l(16)\n      ld_raw r11.xyzw, r2.z, T0[0].xyzw\n    else \n      ld_raw r10.x, r0.x, T0[0].xxxx\n      iadd r1.x, r1.x, r0.x\n      ld_raw r10.y, r1.x, T0[0].xxxx\n      ishl r12.xyzw, l(8, 12, 16, 20), r0.yyyy\n      iadd r12.xyzw, r0.xxxx, r12.xyzw\n      ld_raw r10.z, r12.x, T0[0].xxxx\n      ld_raw r10.w, r12.y, T0[0].xxxx\n      ld_raw r11.x, r12.z, T0[0].xxxx\n      ld_raw r11.y, r12.w, T0[0].xxxx\n      ishl r2.zw, l(0, 0, 24, 28), r0.yyyy\n      iadd r0.xy, r0.xxxx, r2.zwzz\n      ld_raw r11.z, r0.x, T0[0].xxxx\n      ld_raw r11.w, r0.y, T0[0].xxxx\n    endif \n    if_nz r0.w\n      switch r0.z\n        case l(5)\n        ibfe r12.xyzw, l(16, 16, 16, 16), l(0, 0, 0, 0), r10.xyzw\n        itof r12.xyzw, r12.xyzw\n        mul r12.xyzw, r12.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r10.xyzw, r12.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        ibfe r12.xyzw, l(16, 16, 16, 16), l(0, 0, 0, 0), r11.xyzw\n        itof r12.xyzw, r12.xyzw\n        mul r12.xyzw, r12.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r11.xyzw, r12.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        break \n        case l(7)\n        f16tof32 r10.xyzw, r10.xyzw\n        f16tof32 r11.xyzw, r11.xyzw\n        break \n        default \n        break \n      endswitch \n    else \n      switch r0.z\n        case l(0)\n        case l(1)\n        movc r0.x, r1.z, l(16), l(0)\n        ushr r12.xyzw, r10.xyzw, r0.xxxx\n        and r12.xyzw, r12.xyzw, l(255, 255, 255, 255)\n        utof r12.xyzw, r12.xyzw\n        mul r10.xyzw, r12.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        ushr r0.xyzw, r11.xyzw, r0.xxxx\n        and r0.xyzw, r0.xyzw, l(255, 255, 255, 255)\n        utof r0.xyzw, r0.xyzw\n        mul r11.xyzw, r0.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        break \n        case l(2)\n        case l(10)\n        movc r0.x, r1.z, l(20), l(0)\n        ushr r12.xyzw, r10.xyzw, r0.xxxx\n        and r12.xyzw, r12.xyzw, l(1023, 1023, 1023, 1023)\n        utof r12.xyzw, r12.xyzw\n        mul r10.xyzw, r12.xyzw, l(0.000978, 0.000978, 0.000978, 0.000978)\n        ushr r0.xyzw, r11.xyzw, r0.xxxx\n        and r0.xyzw, r0.xyzw, l(1023, 1023, 1023, 1023)\n        utof r0.xyzw, r0.xyzw\n        mul r11.xyzw, r0.xyzw, l(0.000978, 0.000978, 0.000978, 0.000978)\n        break \n        case l(3)\n        case l(12)\n        movc r0.x, r1.z, l(20), l(0)\n        ushr r12.xyzw, r10.xyzw, r0.xxxx\n        and r13.xyzw, r12.xyzw, l(1023, 1023, 1023, 1023)\n        and r14.xyzw, r12.xyzw, l(127, 127, 127, 127)\n        ubfe r15.xyzw, l(3, 3, 3, 3), l(7, 7, 7, 7), r12.xyzw\n        firstbit_hi r16.xyzw, r14.xyzw\n        iadd r16.xyzw, r16.xyzw, l(-24, -24, -24, -24)\n        movc r16.xyzw, r14.xyzw, r16.xyzw, l(8,8,8,8)\n        iadd r17.xyzw, -r16.xyzw, l(1, 1, 1, 1)\n        movc r17.xyzw, r15.xyzw, r15.xyzw, r17.xyzw\n        bfi r12.xyzw, l(7, 7, 7, 7), r16.xyzw, r12.xyzw, l(0, 0, 0, 0)\n        and r12.xyzw, r12.xyzw, l(127, 127, 127, 127)\n        movc r12.xyzw, r15.xyzw, r14.xyzw, r12.xyzw\n        ishl r14.xyzw, r17.xyzw, l(23, 23, 23, 23)\n        iadd r14.xyzw, r14.xyzw, l(0x3e000000, 0x3e000000, 0x3e000000, 0x3e000000)\n        ishl r12.xyzw, r12.xyzw, l(16, 16, 16, 16)\n        iadd r12.xyzw, r14.xyzw, r12.xyzw\n        movc r10.xyzw, r13.xyzw, r12.xyzw, l(0,0,0,0)\n        ushr r0.xyzw, r11.xyzw, r0.xxxx\n        and r12.xyzw, r0.xyzw, l(1023, 1023, 1023, 1023)\n        and r13.xyzw, r0.xyzw, l(127, 127, 127, 127)\n        ubfe r14.xyzw, l(3, 3, 3, 3), l(7, 7, 7, 7), r0.xyzw\n        firstbit_hi r15.xyzw, r13.xyzw\n        iadd r15.xyzw, r15.xyzw, l(-24, -24, -24, -24)\n        movc r15.xyzw, r13.xyzw, r15.xyzw, l(8,8,8,8)\n        iadd r16.xyzw, -r15.xyzw, l(1, 1, 1, 1)\n        movc r16.xyzw, r14.xyzw, r14.xyzw, r16.xyzw\n        bfi r0.xyzw, l(7, 7, 7, 7), r15.xyzw, r0.xyzw, l(0, 0, 0, 0)\n        and r0.xyzw, r0.xyzw, l(127, 127, 127, 127)\n        movc r0.xyzw, r14.xyzw, r13.xyzw, r0.xyzw\n        ishl r13.xyzw, r16.xyzw, l(23, 23, 23, 23)\n        iadd r13.xyzw, r13.xyzw, l(0x3e000000, 0x3e000000, 0x3e000000, 0x3e000000)\n        ishl r0.xyzw, r0.xyzw, l(16, 16, 16, 16)\n        iadd r0.xyzw, r13.xyzw, r0.xyzw\n        movc r11.xyzw, r12.xyzw, r0.xyzw, l(0,0,0,0)\n        break \n        case l(4)\n        ibfe r0.xyzw, l(16, 16, 16, 16), l(0, 0, 0, 0), r10.xyzw\n        itof r0.xyzw, r0.xyzw\n        mul r0.xyzw, r0.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r10.xyzw, r0.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        ibfe r0.xyzw, l(16, 16, 16, 16), l(0, 0, 0, 0), r11.xyzw\n        itof r0.xyzw, r0.xyzw\n        mul r0.xyzw, r0.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r11.xyzw, r0.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        break \n        case l(6)\n        f16tof32 r10.xyzw, r10.xyzw\n        f16tof32 r11.xyzw, r11.xyzw\n        break \n        default \n        break \n      endswitch \n    endif \n    add r3.xyzw, r8.xyzw, r10.xyzw\n    add r6.xyzw, r9.xyzw, r11.xyzw\n  else \n    mov r2.x, r7.x\n  endif \nendif \nmul_sat r0.xyzw, r2.xxxx, r3.xyzw\nmul_sat r3.xyzw, r2.xxxx, r6.xyzw\niadd r4.xyzw, r4.xyzw, r5.xyzw\nif_nz r1.y\n  ubfe r1.x, l(3), l(4), CB0[0][0].z\n  bfi r1.y, l(10), l(1), r2.y, l(0)\n  ishr r1.z, r1.x, l(2)\n  ishr r2.xyzw, r4.wyww, l(4, 5, 1, 3)\n  imad r1.y, r1.z, r1.y, r2.x\n  imad r1.y, r1.y, r1.w, r2.y\n  bfi r1.x, l(2), l(5), r1.x, l(0)\n  bfi r2.x, l(2), l(3), r2.z, l(0)\n  iadd r1.x, r1.x, r2.x\n  bfi r1.x, l(25), l(7), r1.y, r1.x\n  xor r1.z, r1.z, r2.w\n  ubfe r2.x, l(2), l(3), r4.y\n  bfi r2.yz, l(0, 1, 1, 0), l(0, 1, 11, 0), r1.zzzz, l(0, 0, 0, 0)\n  xor r1.z, r2.y, r2.x\n  bfi r2.x, l(1), l(4), r4.w, l(0)\n  imad r1.z, r1.z, l(64), r2.x\n  iadd r1.z, r2.z, r1.z\n  bfi r1.z, l(4), l(0), r1.x, r1.z\n  ishr r2.xy, r1.xxxx, l(4, 5, 0, 0)\n  bfi r1.x, l(1), l(5), r2.x, r1.z\n  bfi r1.x, l(3), l(8), r2.y, r1.x\n  ibfe r1.y, l(24), l(1), r1.y\n  bfi r1.x, l(20), l(12), r1.y, r1.x\nelse \n  ishr r2.xyzw, r4.xyzw, l(5, 5, 1, 4)\n  imad r1.y, r2.x, r1.w, r2.y\n  bfi r1.zw, l(0, 0, 3, 1), l(0, 0, 3, 11), r2.zzzw, l(0, 0, 0, 0)\n  imad r1.z, r1.y, l(64), r1.z\n  ubfe r2.x, l(2), l(3), r4.y\n  ishr r2.y, r4.w, l(3)\n  bfi r2.y, l(1), l(1), r2.y, l(0)\n  xor r2.x, r2.y, r2.x\n  bfi r2.y, l(1), l(4), r4.w, l(0)\n  imad r2.x, r2.x, l(64), r2.y\n  iadd r1.w, r1.w, r2.x\n  bfi r1.w, l(4), l(0), r1.z, r1.w\n  ishr r2.xy, r1.zzzz, l(4, 5, 0, 0)\n  bfi r1.z, l(1), l(5), r2.x, r1.w\n  bfi r1.z, l(3), l(8), r2.y, r1.z\n  ibfe r1.y, l(24), l(2), r1.y\n  bfi r1.x, l(20), l(12), r1.y, r1.z\nendif \niadd r1.x, r1.x, CB0[0][1].x\nmad r0.xyzw, r0.xyzw, l(255.000000, 255.000000, 255.000000, 255.000000), l(0.500000, 0.500000, 0.500000, 0.500000)\nftou r0.xyzw, r0.xyzw\nimad r0.x, r0.y, l(256), r0.x\nimad r0.x, r0.z, l(0x00010000), r0.x\nimad r0.x, r0.w, l(0x01000000), r0.x\nmad r2.xyzw, r3.xyzw, l(255.000000, 255.000000, 255.000000, 255.000000), l(0.500000, 0.500000, 0.500000, 0.500000)\nftou r2.xyzw, r2.xyzw\nimad r0.z, r2.y, l(256), r2.x\nimad r0.z, r2.z, l(0x00010000), r0.z\nimad r0.y, r2.w, l(0x01000000), r0.z\nstore_raw U0[0].xy, r1.x, r0.xyxx\nret \n// Approximately 615 instruction slots used\n#endif\n\nconst BYTE resolve_full_8bpp_cs[] =\n{\n     68,  88,  66,  67, 139,  42, \n      8, 138,  81, 248, 232,   5, \n    230, 240, 239, 116, 162, 132, \n    116, 253,   1,   0,   0,   0, \n    208,  74,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n    208,   2,   0,   0, 224,   2, \n      0,   0, 240,   2,   0,   0, \n     52,  74,   0,   0,  82,  68, \n     69,  70, 148,   2,   0,   0, \n      1,   0,   0,   0, 228,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    105,   2,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 197,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 213,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 114, 101, 115, \n    111, 108, 118, 101,  95, 101, \n    100, 114,  97, 109,   0, 120, \n    101,  95, 114, 101, 115, 111, \n    108, 118, 101,  95, 100, 101, \n    115, 116,   0, 112, 117, 115, \n    104,  95,  99, 111, 110, 115, \n    116, 115,  95, 120, 101,   0, \n    213,   0,   0,   0,   5,   0, \n      0,   0, 252,   0,   0,   0, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    196,   1,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 224,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,   4,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 224,   1,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  31,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    224,   1,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     52,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 224,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  84,   2, \n      0,   0,  16,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 224,   1,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 114, \n    101, 115, 111, 108, 118, 101, \n     95, 101, 100, 114,  97, 109, \n     95, 105, 110, 102, 111,   0, \n    100, 119, 111, 114, 100,   0, \n      0,   0,  19,   0,   1,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 218,   1,   0,   0, \n    120, 101,  95, 114, 101, 115, \n    111, 108, 118, 101,  95,  99, \n    111, 111, 114, 100, 105, 110, \n     97, 116, 101,  95, 105, 110, \n    102, 111,   0, 120, 101,  95, \n    114, 101, 115, 111, 108, 118, \n    101,  95, 100, 101, 115, 116, \n     95, 105, 110, 102, 111,   0, \n    120, 101,  95, 114, 101, 115, \n    111, 108, 118, 101,  95, 100, \n    101, 115, 116,  95,  99, 111, \n    111, 114, 100, 105, 110,  97, \n    116, 101,  95, 105, 110, 102, \n    111,   0, 120, 101,  95, 114, \n    101, 115, 111, 108, 118, 101, \n     95, 100, 101, 115, 116,  95, \n     98,  97, 115, 101,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n     60,  71,   0,   0,  81,   0, \n      5,   0, 207,  17,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n     50,   0,   2,   0, 104,   0, \n      0,   2,  18,   0,   0,   0, \n    155,   0,   0,   4,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,   0, 138,   0, \n      0,  11,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  11,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  26, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  12, 242,   0, \n     16,   0,   1,   0,   0,   0, \n    134, 142,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   1, 255,   3,   0,   0, \n     85,   0,   0,  12, 242,   0, \n     16,   0,   2,   0,   0,   0, \n    214, 143,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   4,   0,   0,   0, \n     10,   0,   0,   0,  20,   0, \n      0,   0,  24,   0,   0,   0, \n     80,   0,   0,   6,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,   2,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  17, \n    242,   0,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,  11,   0, \n      0,   0,   4,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     13,   0,   0,   0,  24,   0, \n      0,   0,  28,   0,   0,   0, \n      6, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   7,  18,   0,  16,   0, \n      3,   0,   0,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     34,   0,  16,   0,   3,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  20,  50,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   4,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    139,   0,   0,  11,  18,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,   7, \n     18,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,  23,   0,   0,   0, \n     30,   0,   0,   7,  18,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0, 128,  63,  39,   0, \n      0,   7,  66,   0,  16,   0, \n      3,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  20, \n    242,   0,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,   4,   0, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n    182,  15,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  11,  66,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,  28,   0, \n      0,   0,  58, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     41,   0,   0,   6,  34,   0, \n     16,   0,   5,   0,   0,   0, \n     10,   0,   2,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     54,   0,   0,   4, 210,   0, \n     16,   0,   5,   0,   0,   0, \n     86,   5,   2,   0,  30,   0, \n      0,   7,  50,   0,  16,   0, \n      3,   0,   0,   0,  70,   0, \n     16,   0,   3,   0,   0,   0, \n    214,   5,  16,   0,   5,   0, \n      0,   0,  80,   0,   0,   7, \n    130,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     31,   0,   4,   3,  58,   0, \n     16,   0,   2,   0,   0,   0, \n     54,   0,   0,   5,  34,   0, \n     16,   0,   6,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  18,   0,   0,   1, \n     32,   0,   0,   7, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  31,   0, \n      4,   3,  58,   0,  16,   0, \n      2,   0,   0,   0,  54,   0, \n      0,   5,  34,   0,  16,   0, \n      6,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     18,   0,   0,   1,  54,   0, \n      0,   5,  34,   0,  16,   0, \n      6,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  21,   0, \n      0,   1,  80,   0,   0,  10, \n    194,   0,  16,   0,   6,   0, \n      0,   0,   6,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,  10, 194,   0, \n     16,   0,   6,   0,   0,   0, \n    166,  14,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,  41,   0, \n      0,   7,  50,   0,  16,   0, \n      3,   0,   0,   0,  70,   0, \n     16,   0,   3,   0,   0,   0, \n    230,  10,  16,   0,   6,   0, \n      0,   0,  85,   0,   0,   7, \n     18,   0,  16,   0,   6,   0, \n      0,   0,  26,   0,  16,   0, \n      6,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,  10,  50,   0, \n     16,   0,   6,   0,   0,   0, \n     70,   0,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  50,   0,  16,   0, \n      3,   0,   0,   0,  70,   0, \n     16,   0,   3,   0,   0,   0, \n     70,   0,  16,   0,   6,   0, \n      0,   0,  85,   0,   0,   7, \n     18,   0,  16,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n     80,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  34,   0, \n     16,   0,   6,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0,  78,   0,   0,   8, \n     50,   0,  16,   0,   7,   0, \n      0,   0,   0, 208,   0,   0, \n     70,   0,  16,   0,   3,   0, \n      0,   0,  70,   0,  16,   0, \n      6,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   7,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      7,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  35,   0,   0,  10, \n     50,   0,  16,   0,   3,   0, \n      0,   0,  70,   0,  16, 128, \n     65,   0,   0,   0,   7,   0, \n      0,   0,  70,   0,  16,   0, \n      6,   0,   0,   0,  70,   0, \n     16,   0,   3,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,  10,   0,  16,   0, \n      6,   0,   0,   0,  10,   0, \n     16,   0,   3,   0,   0,   0, \n     41,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   5, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  78,   0, \n      0,   8,   0, 208,   0,   0, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,  40,   0, \n     41,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  30,   0, \n      0,   7,  34,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   6,   0, \n      0,   0,  41,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     39,   0,   0,   7, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   7, 130,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0,  31,   0,   4,   3, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     21,   0,   0,   1,  32,   0, \n      0,   7, 130,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  31,   0,   4,   3, \n     58,   0,  16,   0,   2,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      6,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  10,   0,  16,   0, \n      6,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  18,   0, \n      0,   1, 165,   0,   0,   8, \n     18,   0,  16,   0,   3,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      7,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n     34,   0,  16,   0,   3,   0, \n      0,   0,  10,   0,  16,   0, \n      7,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n     12,   0,   0,   0,  16,   0, \n      0,   0,  20,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   7,   0, \n      0,   0,   6,   0,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n    165,   0,   0,   8,  66,   0, \n     16,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   7,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n    130,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      7,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8,  18,   0,  16,   0, \n      6,   0,   0,   0,  42,   0, \n     16,   0,   7,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    165,   0,   0,   8,  34,   0, \n     16,   0,   6,   0,   0,   0, \n     58,   0,  16,   0,   7,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n     50,   0,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n     24,   0,   0,   0,  28,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,   7,   0,   0,   0, \n      6,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      7,   0,   0,   0, 165,   0, \n      0,   8,  66,   0,  16,   0, \n      6,   0,   0,   0,  10,   0, \n     16,   0,   7,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    165,   0,   0,   8, 130,   0, \n     16,   0,   6,   0,   0,   0, \n     26,   0,  16,   0,   7,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     76,   0,   0,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   5,   0,   0,   0, \n    139,   0,   0,  15, 242,   0, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191, 139,   0, \n      0,  15, 242,   0,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   7,   0,   0,   0, \n    131,   0,   0,   5, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0, 131,   0,   0,   5, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,   2,   0, \n      0,   1,  10,   0,   0,   1, \n      2,   0,   0,   1,  23,   0, \n      0,   1,  18,   0,   0,   1, \n     76,   0,   0,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   0,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     55,   0,   0,   9,  18,   0, \n     16,   0,   7,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     85,   0,   0,   7, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   6,   0,  16,   0, \n      7,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59,  85,   0,   0,   7, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,   6,   0, \n     16,   0,   7,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,  10,   0, \n      0,   0,  55,   0,   0,   9, \n     18,   0,  16,   0,   7,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,   7, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   6,   0, \n     16,   0,   7,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      8,  32, 128,  58,   8,  32, \n    128,  58,   8,  32, 128,  58, \n      8,  32, 128,  58,  85,   0, \n      0,   7, 242,   0,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n      6,   0,  16,   0,   7,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   8,  32, 128,  58, \n      8,  32, 128,  58,   8,  32, \n    128,  58,   8,  32, 128,  58, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n     12,   0,   0,   0,  55,   0, \n      0,   9,  18,   0,  16,   0, \n      7,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  20,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,   7, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      6,   0,  16,   0,   7,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0, 135,   0, \n      0,   5, 242,   0,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     30,   0,   0,  10, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n    232, 255, 255, 255, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255,  55,   0, \n      0,  12, 242,   0,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,  30,   0, \n      0,  11, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16, 128,  65,   0,   0,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n     55,   0,   0,   9, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n     55,   0,   0,   9, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  30,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,  41,   0,   0,  10, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,  55,   0, \n      0,  12, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,   7, 242,   0,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n      6,   0,  16,   0,   7,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0, 135,   0, \n      0,   5, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n     30,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n    232, 255, 255, 255, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255,  55,   0, \n      0,  12, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,  30,   0, \n      0,  11, 242,   0,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16, 128,  65,   0,   0,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n     55,   0,   0,   9, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n     55,   0,   0,   9, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  30,   0, \n      0,  10, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,  41,   0,   0,  10, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,  55,   0, \n      0,  12, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   4,   0, \n      0,   0, 139,   0,   0,  15, \n    242,   0,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n    139,   0,   0,  15, 242,   0, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   6,   0, \n      0,   0, 131,   0,   0,   5, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0, 131,   0, \n      0,   5, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n      2,   0,   0,   1,  10,   0, \n      0,   1,   2,   0,   0,   1, \n     23,   0,   0,   1,  21,   0, \n      0,   1,  80,   0,   0,   7, \n     18,   0,  16,   0,   7,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   7,   0,   0,   0, \n     56,   0,   0,   7,  18,   0, \n     16,   0,   7,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,  63,  30,   0, \n      0,   7,  34,   0,  16,   0, \n      7,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  64,   1, \n      0,   0,  31,   0,   4,   3, \n     58,   0,  16,   0,   2,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  26,   0,  16,   0, \n      7,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      7,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  80,   1, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  42,   0,  16,   0, \n      7,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  18,   0, \n      0,   1, 165,   0,   0,   8, \n     18,   0,  16,   0,   8,   0, \n      0,   0,  26,   0,  16,   0, \n      7,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      7,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   7,   0, \n      0,   0, 165,   0,   0,   8, \n     34,   0,  16,   0,   8,   0, \n      0,   0,  42,   0,  16,   0, \n      7,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n     12,   0,   0,   0,  16,   0, \n      0,   0,  20,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  86,   5,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n    165,   0,   0,   8,  66,   0, \n     16,   0,   8,   0,   0,   0, \n     10,   0,  16,   0,  10,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n    130,   0,  16,   0,   8,   0, \n      0,   0,  26,   0,  16,   0, \n     10,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8,  18,   0,  16,   0, \n      9,   0,   0,   0,  42,   0, \n     16,   0,  10,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    165,   0,   0,   8,  34,   0, \n     16,   0,   9,   0,   0,   0, \n     58,   0,  16,   0,  10,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    194,   0,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  24,   0,   0,   0, \n     28,   0,   0,   0,  86,   5, \n     16,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 194,   0, \n     16,   0,   7,   0,   0,   0, \n    166,  14,  16,   0,   7,   0, \n      0,   0,  86,   5,  16,   0, \n      7,   0,   0,   0, 165,   0, \n      0,   8,  66,   0,  16,   0, \n      9,   0,   0,   0,  42,   0, \n     16,   0,   7,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    165,   0,   0,   8, 130,   0, \n     16,   0,   9,   0,   0,   0, \n     58,   0,  16,   0,   7,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     76,   0,   0,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   5,   0,   0,   0, \n    139,   0,   0,  15, 242,   0, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191, 139,   0, \n      0,  15, 242,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   7,   0,   0,   0, \n    131,   0,   0,   5, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0, 131,   0,   0,   5, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,   2,   0, \n      0,   1,  10,   0,   0,   1, \n      2,   0,   0,   1,  23,   0, \n      0,   1,  18,   0,   0,   1, \n     76,   0,   0,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   0,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     55,   0,   0,   9,  66,   0, \n     16,   0,   7,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     85,   0,   0,   7, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0, 166,  10,  16,   0, \n      7,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59,  85,   0,   0,   7, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0, 166,  10, \n     16,   0,   7,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,  10,   0, \n      0,   0,  55,   0,   0,   9, \n     66,   0,  16,   0,   7,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,   7, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0, 166,  10, \n     16,   0,   7,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      8,  32, 128,  58,   8,  32, \n    128,  58,   8,  32, 128,  58, \n      8,  32, 128,  58,  85,   0, \n      0,   7, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n    166,  10,  16,   0,   7,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   8,  32, 128,  58, \n      8,  32, 128,  58,   8,  32, \n    128,  58,   8,  32, 128,  58, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n     12,   0,   0,   0,  55,   0, \n      0,   9,  66,   0,  16,   0, \n      7,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  20,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,   7, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n    166,  10,  16,   0,   7,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0, 135,   0, \n      0,   5, 242,   0,  16,   0, \n     14,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n     30,   0,   0,  10, 242,   0, \n     16,   0,  14,   0,   0,   0, \n     70,  14,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n    232, 255, 255, 255, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255,  55,   0, \n      0,  12, 242,   0,  16,   0, \n     14,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,  30,   0, \n      0,  11, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16, 128,  65,   0,   0,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n     55,   0,   0,   9, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n     14,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n     55,   0,   0,   9, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  30,   0, \n      0,  10, 242,   0,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,  41,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  55,   0, \n      0,  12, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,   7, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n    166,  10,  16,   0,   7,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0, 135,   0, \n      0,   5, 242,   0,  16,   0, \n     14,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n     30,   0,   0,  10, 242,   0, \n     16,   0,  14,   0,   0,   0, \n     70,  14,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n    232, 255, 255, 255, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255,  55,   0, \n      0,  12, 242,   0,  16,   0, \n     14,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,  30,   0, \n      0,  11, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16, 128,  65,   0,   0,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n     55,   0,   0,   9, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n     14,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n     55,   0,   0,   9, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  30,   0, \n      0,  10, 242,   0,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,  41,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  55,   0, \n      0,  12, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   4,   0, \n      0,   0, 139,   0,   0,  15, \n    242,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n    139,   0,   0,  15, 242,   0, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   6,   0, \n      0,   0, 131,   0,   0,   5, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0, 131,   0, \n      0,   5, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n      2,   0,   0,   1,  10,   0, \n      0,   1,   2,   0,   0,   1, \n     23,   0,   0,   1,  21,   0, \n      0,   1,   0,   0,   0,   7, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      0,   0,   0,   7, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,  80,   0, \n      0,   7,  66,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  31,   0,   4,   3, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  41,   0,   0,   7, \n     66,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     56,   0,   0,   7,  18,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0, 128,  62,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  31,   0,   4,   3, \n     58,   0,  16,   0,   2,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      7,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  42,   0,  16,   0, \n      7,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  18,   0, \n      0,   1, 165,   0,   0,   8, \n     18,   0,  16,   0,   8,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      7,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n     34,   0,  16,   0,   8,   0, \n      0,   0,  42,   0,  16,   0, \n      7,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n     12,   0,   0,   0,  16,   0, \n      0,   0,  20,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,  10,   0, \n      0,   0,   6,   0,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n    165,   0,   0,   8,  66,   0, \n     16,   0,   8,   0,   0,   0, \n     10,   0,  16,   0,  10,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n    130,   0,  16,   0,   8,   0, \n      0,   0,  26,   0,  16,   0, \n     10,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8,  18,   0,  16,   0, \n      9,   0,   0,   0,  42,   0, \n     16,   0,  10,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    165,   0,   0,   8,  34,   0, \n     16,   0,   9,   0,   0,   0, \n     58,   0,  16,   0,  10,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    194,   0,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  24,   0,   0,   0, \n     28,   0,   0,   0,  86,   5, \n     16,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 194,   0, \n     16,   0,   7,   0,   0,   0, \n      6,   0,  16,   0,   0,   0, \n      0,   0, 166,  14,  16,   0, \n      7,   0,   0,   0, 165,   0, \n      0,   8,  66,   0,  16,   0, \n      9,   0,   0,   0,  42,   0, \n     16,   0,   7,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    165,   0,   0,   8, 130,   0, \n     16,   0,   9,   0,   0,   0, \n     58,   0,  16,   0,   7,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     76,   0,   0,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   5,   0,   0,   0, \n    139,   0,   0,  15, 242,   0, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191, 139,   0, \n      0,  15, 242,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   7,   0,   0,   0, \n    131,   0,   0,   5, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0, 131,   0,   0,   5, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,   2,   0, \n      0,   1,  10,   0,   0,   1, \n      2,   0,   0,   1,  23,   0, \n      0,   1,  18,   0,   0,   1, \n     76,   0,   0,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   0,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     55,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     85,   0,   0,   7, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,   6,   0,  16,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59,  85,   0,   0,   7, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,   6,   0, \n     16,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,  10,   0, \n      0,   0,  55,   0,   0,   9, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,   7, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   6,   0, \n     16,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      8,  32, 128,  58,   8,  32, \n    128,  58,   8,  32, 128,  58, \n      8,  32, 128,  58,  85,   0, \n      0,   7, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n      6,   0,  16,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   8,  32, 128,  58, \n      8,  32, 128,  58,   8,  32, \n    128,  58,   8,  32, 128,  58, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n     12,   0,   0,   0,  55,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  20,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,   7, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      6,   0,  16,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0, 135,   0, \n      0,   5, 242,   0,  16,   0, \n     14,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n     30,   0,   0,  10, 242,   0, \n     16,   0,  14,   0,   0,   0, \n     70,  14,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n    232, 255, 255, 255, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255,  55,   0, \n      0,  12, 242,   0,  16,   0, \n     14,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,  30,   0, \n      0,  11, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16, 128,  65,   0,   0,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n     55,   0,   0,   9, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n     14,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n     55,   0,   0,   9, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  30,   0, \n      0,  10, 242,   0,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,  41,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  55,   0, \n      0,  12, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,   7, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n      6,   0,  16,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0, 135,   0, \n      0,   5, 242,   0,  16,   0, \n     14,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n     30,   0,   0,  10, 242,   0, \n     16,   0,  14,   0,   0,   0, \n     70,  14,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n    232, 255, 255, 255, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255,  55,   0, \n      0,  12, 242,   0,  16,   0, \n     14,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,  30,   0, \n      0,  11, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16, 128,  65,   0,   0,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n     55,   0,   0,   9, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n     14,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n     55,   0,   0,   9, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  30,   0, \n      0,  10, 242,   0,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,  41,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  55,   0, \n      0,  12, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   4,   0, \n      0,   0, 139,   0,   0,  15, \n    242,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n    139,   0,   0,  15, 242,   0, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   6,   0, \n      0,   0, 131,   0,   0,   5, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0, 131,   0, \n      0,   5, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n      2,   0,   0,   1,  10,   0, \n      0,   1,   2,   0,   0,   1, \n     23,   0,   0,   1,  21,   0, \n      0,   1,   0,   0,   0,   7, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      0,   0,   0,   7, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   7,   0, \n      0,   0,  31,   0,   4,   3, \n     58,   0,  16,   0,   2,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  18,   0, \n      0,   1, 165,   0,   0,   8, \n     18,   0,  16,   0,  10,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n     34,   0,  16,   0,  10,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n     12,   0,   0,   0,  16,   0, \n      0,   0,  20,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,  12,   0, \n      0,   0,   6,   0,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n    165,   0,   0,   8,  66,   0, \n     16,   0,  10,   0,   0,   0, \n     10,   0,  16,   0,  12,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n    130,   0,  16,   0,  10,   0, \n      0,   0,  26,   0,  16,   0, \n     12,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8,  18,   0,  16,   0, \n     11,   0,   0,   0,  42,   0, \n     16,   0,  12,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    165,   0,   0,   8,  34,   0, \n     16,   0,  11,   0,   0,   0, \n     58,   0,  16,   0,  12,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    194,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  24,   0,   0,   0, \n     28,   0,   0,   0,  86,   5, \n     16,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,   0,   0,   0,   0, \n      6,   0,  16,   0,   0,   0, \n      0,   0, 230,  10,  16,   0, \n      2,   0,   0,   0, 165,   0, \n      0,   8,  66,   0,  16,   0, \n     11,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    165,   0,   0,   8, 130,   0, \n     16,   0,  11,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     76,   0,   0,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   5,   0,   0,   0, \n    139,   0,   0,  15, 242,   0, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191, 139,   0, \n      0,  15, 242,   0,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   7,   0,   0,   0, \n    131,   0,   0,   5, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0, 131,   0,   0,   5, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,   2,   0, \n      0,   1,  10,   0,   0,   1, \n      2,   0,   0,   1,  23,   0, \n      0,   1,  18,   0,   0,   1, \n     76,   0,   0,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   0,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     55,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     85,   0,   0,   7, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   6,   0,  16,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59,  85,   0,   0,   7, \n    242,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,   6,   0, \n     16,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   0,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,  10,   0, \n      0,   0,  55,   0,   0,   9, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,   7, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   6,   0, \n     16,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      8,  32, 128,  58,   8,  32, \n    128,  58,   8,  32, 128,  58, \n      8,  32, 128,  58,  85,   0, \n      0,   7, 242,   0,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      6,   0,  16,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   0,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   8,  32, 128,  58, \n      8,  32, 128,  58,   8,  32, \n    128,  58,   8,  32, 128,  58, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n     12,   0,   0,   0,  55,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  20,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,   7, 242,   0,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      6,   0,  16,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  14,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0, 135,   0, \n      0,   5, 242,   0,  16,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,  14,   0,   0,   0, \n     30,   0,   0,  10, 242,   0, \n     16,   0,  16,   0,   0,   0, \n     70,  14,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n    232, 255, 255, 255, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255,  55,   0, \n      0,  12, 242,   0,  16,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,  14,   0,   0,   0, \n     70,  14,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,  30,   0, \n      0,  11, 242,   0,  16,   0, \n     17,   0,   0,   0,  70,  14, \n     16, 128,  65,   0,   0,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n     55,   0,   0,   9, 242,   0, \n     16,   0,  17,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  17,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n     55,   0,   0,   9, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     14,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,  14,   0,   0,   0, \n     70,  14,  16,   0,  17,   0, \n      0,   0,   2,  64,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  30,   0, \n      0,  10, 242,   0,  16,   0, \n     14,   0,   0,   0,  70,  14, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,  41,   0,   0,  10, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  14,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,  55,   0, \n      0,  12, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,   7, 242,   0,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      6,   0,  16,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      0,   0,   0,   0, 135,   0, \n      0,   5, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n     30,   0,   0,  10, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n    232, 255, 255, 255, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255,  55,   0, \n      0,  12, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,  30,   0, \n      0,  11, 242,   0,  16,   0, \n     16,   0,   0,   0,  70,  14, \n     16, 128,  65,   0,   0,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n     55,   0,   0,   9, 242,   0, \n     16,   0,  16,   0,   0,   0, \n     70,  14,  16,   0,  14,   0, \n      0,   0,  70,  14,  16,   0, \n     14,   0,   0,   0,  70,  14, \n     16,   0,  16,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n     55,   0,   0,   9, 242,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,  14,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,   0,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  30,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,  41,   0,   0,  10, \n    242,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n      0,   0,   0,   0,  55,   0, \n      0,  12, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   4,   0, \n      0,   0, 139,   0,   0,  15, \n    242,   0,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      0,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n    139,   0,   0,  15, 242,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   0,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   6,   0, \n      0,   0, 131,   0,   0,   5, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0, 131,   0, \n      0,   5, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,   0,   0,   1,  10,   0, \n      0,   1,   2,   0,   0,   1, \n     23,   0,   0,   1,  21,   0, \n      0,   1,   0,   0,   0,   7, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      0,   0,   0,   7, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  18,   0, \n      0,   1,  54,   0,   0,   5, \n     18,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      7,   0,   0,   0,  21,   0, \n      0,   1,  21,   0,   0,   1, \n     56,  32,   0,   7, 242,   0, \n     16,   0,   0,   0,   0,   0, \n      6,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  56,  32, \n      0,   7, 242,   0,  16,   0, \n      3,   0,   0,   0,   6,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   1,   0,   0,   0, \n    138,   0,   0,  11,  18,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     10,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  42,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,  42,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0, 118,  15,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   4,   0,   0,   0, \n      5,   0,   0,   0,   1,   0, \n      0,   0,   3,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n    140,   0,   0,  11,  18,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     25,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  87,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0, 138,   0,   0,   9, \n     18,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0, 140,   0,   0,  20, \n     98,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  11,   0, \n      0,   0,   0,   0,   0,   0, \n    166,  10,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  87,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     58,   0,  16,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  64,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     66,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n      0,  10,  50,   0,  16,   0, \n      2,   0,   0,   0,   6,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   4,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   5,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   8,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    139,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  24,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  18,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  20,   0, \n      0,   0,   1,  64,   0,   0, \n     12,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  18,   0,   0,   1, \n     42,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,   1,   0,   0,   0, \n      4,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  20, 194,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,  11,   0, \n      0,   0, 166,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     35,   0,   0,   9,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     64,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    138,   0,   0,   9,  18,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n     42,   0,   0,   7,  34,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7,  18,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n     64,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     30,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  11, 130,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,   0,  10,  50,   0, \n     16,   0,   2,   0,   0,   0, \n    166,  10,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,   5,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  66,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  66,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0, 139,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     24,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  21,   0, \n      0,   1,  30,   0,   0,   9, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  50,   0,   0,  15, \n    242,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 127,  67, \n      0,   0, 127,  67,   0,   0, \n    127,  67,   0,   0, 127,  67, \n      2,  64,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,  63,  28,   0,   0,   5, \n    242,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   1, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      1,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   1,  10,   0,  16,   0, \n      0,   0,   0,   0,  50,   0, \n      0,  15, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    127,  67,   0,   0, 127,  67, \n      0,   0, 127,  67,   0,   0, \n    127,  67,   2,  64,   0,   0, \n      0,   0,   0,  63,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,  28,   0, \n      0,   5, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,   9,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   1,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,   9,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   1,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   1,  42,   0, \n     16,   0,   0,   0,   0,   0, \n    166,   0,   0,   8,  50, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0,  62,   0,   0,   1, \n     83,  84,  65,  84, 148,   0, \n      0,   0, 103,   2,   0,   0, \n     18,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     60,   0,   0,   0, 119,   0, \n      0,   0,  81,   0,   0,   0, \n     50,   0,   0,   0,  23,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  40,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  44,   0, \n      0,   0,  34,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/resolve_full_8bpp_scaled_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_resolve_edram_info;        // Offset:    0 Size:     4\n//   uint xe_resolve_coordinate_info;   // Offset:    4 Size:     4\n//   uint xe_resolve_dest_info;         // Offset:    8 Size:     4\n//   uint xe_resolve_dest_coordinate_info;// Offset:   12 Size:     4\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_resolve_edram                  texture    byte         r/o      T0             t0      1 \n// xe_resolve_dest                       UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][1], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xy\ndcl_temps 17\ndcl_thread_group 8, 8, 1\nand r0.xyzw, CB0[0][0].xxzz, l(1023, 0x20000000, 8, 0x01000000)\nif_nz r0.y\n  ubfe r1.xy, l(2, 2, 0, 0), l(17, 20, 0, 0), CB0[0][0].yyyy\nelse \n  mov r1.xy, l(0,0,0,0)\nendif \nubfe r2.xyz, l(3, 3, 11, 0), l(16, 19, 5, 0), CB0[0][0].yyyy\nimul null, r0.y, r2.x, r2.z\nand r1.z, CB0[0][0].w, l(1023)\nushr r3.xyzw, CB0[0][0].ywww, l(4, 10, 20, 24)\nuge r0.y, vThreadID.x, r0.y\nif_nz r0.y\n  ret \nendif \nubfe r4.xyzw, l(2, 11, 4, 1), l(10, 13, 24, 28), CB0[0][0].xxxx\nmov r5.x, CB0[0][0].y\nmov r5.y, r3.x\nbfi r2.zw, l(0, 0, 4, 1), l(0, 0, 3, 3), r5.xxxy, l(0, 0, 0, 0)\nibfe r0.y, l(6), l(16), CB0[0][0].z\nishl r0.y, r0.y, l(23)\niadd r0.y, r0.y, l(0x3f800000)\nine r1.w, r0.w, l(0)\nbfi r3.xz, l(4, 0, 4, 0), l(3, 0, 3, 0), r3.zzwz, l(0, 0, 0, 0)\nubfe r3.w, l(3), l(28), CB0[0][0].w\nishl r5.x, vThreadID.x, l(3)\numax r5.y, r1.y, vThreadID.y\nimad r2.zw, r2.zzzw, r2.xxxy, r5.xxxy\nuge r1.y, l(3), r3.w\nif_nz r1.y\n  mov r6.y, r3.w\nelse \n  ieq r1.y, r3.w, l(5)\n  if_nz r1.y\n    mov r6.y, l(2)\n  else \n    mov r6.y, l(0)\n  endif \nendif \nuge r5.yw, r4.xxxx, l(0, 2, 0, 1)\nand r5.yw, r5.yyyw, l(0, 1, 0, 1)\nishl r2.zw, r2.zzzw, r5.yyyw\nushr r6.x, r6.y, l(1)\nand r6.xy, r6.xyxx, l(1, 1, 0, 0)\niadd r2.zw, r2.zzzw, r6.xxxy\nimul null, r6.yz, r2.xxyx, l(0, 80, 16, 0)\nushr r6.x, r6.y, r4.w\nudiv r7.xy, null, r2.zwzz, r6.xzxx\nimad r0.x, r7.y, r0.x, r7.x\niadd r0.x, r0.x, r4.y\nimad r2.zw, -r7.xxxy, r6.xxxz, r2.zzzw\nimul null, r1.y, r6.z, r6.y\nimad r2.z, r2.w, r6.x, r2.z\nishl r2.z, r2.z, r4.w\nimad r0.x, r0.x, r1.y, r2.z\nishl r1.y, r1.y, l(11)\nudiv null, r0.x, r0.x, r1.y\nishl r0.x, r0.x, l(2)\niadd r1.y, r4.w, r5.y\nishl r2.z, l(4), r1.y\nine r2.w, r4.w, l(0)\nand r1.w, r1.w, r2.w\nif_nz r1.w\n  iadd r0.x, r0.x, l(4)\nendif \nieq r1.w, r2.z, l(4)\nif_nz r1.w\n  ld_raw r6.xyzw, r0.x, T0[0].xyzw\n  iadd r2.w, r0.x, l(16)\n  ld_raw r7.xyzw, r2.w, T0[0].xyzw\nelse \n  ld_raw r6.x, r0.x, T0[0].xxxx\n  iadd r2.w, r2.z, r0.x\n  ld_raw r6.y, r2.w, T0[0].xxxx\n  ishl r8.xyzw, l(8, 12, 16, 20), r1.yyyy\n  iadd r8.xyzw, r0.xxxx, r8.xyzw\n  ld_raw r6.z, r8.x, T0[0].xxxx\n  ld_raw r6.w, r8.y, T0[0].xxxx\n  ld_raw r7.x, r8.z, T0[0].xxxx\n  ld_raw r7.y, r8.w, T0[0].xxxx\n  ishl r4.xy, l(24, 28, 0, 0), r1.yyyy\n  iadd r4.xy, r0.xxxx, r4.xyxx\n  ld_raw r7.z, r4.x, T0[0].xxxx\n  ld_raw r7.w, r4.y, T0[0].xxxx\nendif \nif_nz r4.w\n  switch r4.z\n    case l(5)\n    ibfe r8.xyzw, l(16, 16, 16, 16), l(0, 0, 0, 0), r6.xyzw\n    itof r8.xyzw, r8.xyzw\n    mul r8.xyzw, r8.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n    max r6.xyzw, r8.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n    ibfe r8.xyzw, l(16, 16, 16, 16), l(0, 0, 0, 0), r7.xyzw\n    itof r8.xyzw, r8.xyzw\n    mul r8.xyzw, r8.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n    max r7.xyzw, r8.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n    break \n    case l(7)\n    f16tof32 r6.xyzw, r6.xyzw\n    f16tof32 r7.xyzw, r7.xyzw\n    break \n    default \n    break \n  endswitch \nelse \n  switch r4.z\n    case l(0)\n    case l(1)\n    movc r2.w, r0.w, l(16), l(0)\n    ushr r8.xyzw, r6.xyzw, r2.wwww\n    and r8.xyzw, r8.xyzw, l(255, 255, 255, 255)\n    utof r8.xyzw, r8.xyzw\n    mul r6.xyzw, r8.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n    ushr r8.xyzw, r7.xyzw, r2.wwww\n    and r8.xyzw, r8.xyzw, l(255, 255, 255, 255)\n    utof r8.xyzw, r8.xyzw\n    mul r7.xyzw, r8.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n    break \n    case l(2)\n    case l(10)\n    movc r2.w, r0.w, l(20), l(0)\n    ushr r8.xyzw, r6.xyzw, r2.wwww\n    and r8.xyzw, r8.xyzw, l(1023, 1023, 1023, 1023)\n    utof r8.xyzw, r8.xyzw\n    mul r6.xyzw, r8.xyzw, l(0.000978, 0.000978, 0.000978, 0.000978)\n    ushr r8.xyzw, r7.xyzw, r2.wwww\n    and r8.xyzw, r8.xyzw, l(1023, 1023, 1023, 1023)\n    utof r8.xyzw, r8.xyzw\n    mul r7.xyzw, r8.xyzw, l(0.000978, 0.000978, 0.000978, 0.000978)\n    break \n    case l(3)\n    case l(12)\n    movc r2.w, r0.w, l(20), l(0)\n    ushr r8.xyzw, r6.xyzw, r2.wwww\n    and r9.xyzw, r8.xyzw, l(1023, 1023, 1023, 1023)\n    and r10.xyzw, r8.xyzw, l(127, 127, 127, 127)\n    ubfe r11.xyzw, l(3, 3, 3, 3), l(7, 7, 7, 7), r8.xyzw\n    firstbit_hi r12.xyzw, r10.xyzw\n    iadd r12.xyzw, r12.xyzw, l(-24, -24, -24, -24)\n    movc r12.xyzw, r10.xyzw, r12.xyzw, l(8,8,8,8)\n    iadd r13.xyzw, -r12.xyzw, l(1, 1, 1, 1)\n    movc r13.xyzw, r11.xyzw, r11.xyzw, r13.xyzw\n    bfi r8.xyzw, l(7, 7, 7, 7), r12.xyzw, r8.xyzw, l(0, 0, 0, 0)\n    and r8.xyzw, r8.xyzw, l(127, 127, 127, 127)\n    movc r8.xyzw, r11.xyzw, r10.xyzw, r8.xyzw\n    ishl r10.xyzw, r13.xyzw, l(23, 23, 23, 23)\n    iadd r10.xyzw, r10.xyzw, l(0x3e000000, 0x3e000000, 0x3e000000, 0x3e000000)\n    ishl r8.xyzw, r8.xyzw, l(16, 16, 16, 16)\n    iadd r8.xyzw, r10.xyzw, r8.xyzw\n    movc r6.xyzw, r9.xyzw, r8.xyzw, l(0,0,0,0)\n    ushr r8.xyzw, r7.xyzw, r2.wwww\n    and r9.xyzw, r8.xyzw, l(1023, 1023, 1023, 1023)\n    and r10.xyzw, r8.xyzw, l(127, 127, 127, 127)\n    ubfe r11.xyzw, l(3, 3, 3, 3), l(7, 7, 7, 7), r8.xyzw\n    firstbit_hi r12.xyzw, r10.xyzw\n    iadd r12.xyzw, r12.xyzw, l(-24, -24, -24, -24)\n    movc r12.xyzw, r10.xyzw, r12.xyzw, l(8,8,8,8)\n    iadd r13.xyzw, -r12.xyzw, l(1, 1, 1, 1)\n    movc r13.xyzw, r11.xyzw, r11.xyzw, r13.xyzw\n    bfi r8.xyzw, l(7, 7, 7, 7), r12.xyzw, r8.xyzw, l(0, 0, 0, 0)\n    and r8.xyzw, r8.xyzw, l(127, 127, 127, 127)\n    movc r8.xyzw, r11.xyzw, r10.xyzw, r8.xyzw\n    ishl r10.xyzw, r13.xyzw, l(23, 23, 23, 23)\n    iadd r10.xyzw, r10.xyzw, l(0x3e000000, 0x3e000000, 0x3e000000, 0x3e000000)\n    ishl r8.xyzw, r8.xyzw, l(16, 16, 16, 16)\n    iadd r8.xyzw, r10.xyzw, r8.xyzw\n    movc r7.xyzw, r9.xyzw, r8.xyzw, l(0,0,0,0)\n    break \n    case l(4)\n    ibfe r8.xyzw, l(16, 16, 16, 16), l(0, 0, 0, 0), r6.xyzw\n    itof r8.xyzw, r8.xyzw\n    mul r8.xyzw, r8.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n    max r6.xyzw, r8.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n    ibfe r8.xyzw, l(16, 16, 16, 16), l(0, 0, 0, 0), r7.xyzw\n    itof r8.xyzw, r8.xyzw\n    mul r8.xyzw, r8.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n    max r7.xyzw, r8.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n    break \n    case l(6)\n    f16tof32 r6.xyzw, r6.xyzw\n    f16tof32 r7.xyzw, r7.xyzw\n    break \n    default \n    break \n  endswitch \nendif \nuge r2.w, r3.w, l(4)\nif_nz r2.w\n  mul r2.w, r0.y, l(0.500000)\n  imad r4.x, l(320), r2.x, r0.x\n  if_nz r1.w\n    ld_raw r8.xyzw, r4.x, T0[0].xyzw\n    iadd r4.y, r4.x, l(16)\n    ld_raw r9.xyzw, r4.y, T0[0].xyzw\n  else \n    ld_raw r8.x, r4.x, T0[0].xxxx\n    iadd r4.y, r2.z, r4.x\n    ld_raw r8.y, r4.y, T0[0].xxxx\n    ishl r10.xyzw, l(8, 12, 16, 20), r1.yyyy\n    iadd r10.xyzw, r4.xxxx, r10.xyzw\n    ld_raw r8.z, r10.x, T0[0].xxxx\n    ld_raw r8.w, r10.y, T0[0].xxxx\n    ld_raw r9.x, r10.z, T0[0].xxxx\n    ld_raw r9.y, r10.w, T0[0].xxxx\n    ishl r5.yw, l(0, 24, 0, 28), r1.yyyy\n    iadd r5.yw, r4.xxxx, r5.yyyw\n    ld_raw r9.z, r5.y, T0[0].xxxx\n    ld_raw r9.w, r5.w, T0[0].xxxx\n  endif \n  if_nz r4.w\n    switch r4.z\n      case l(5)\n      ibfe r10.xyzw, l(16, 16, 16, 16), l(0, 0, 0, 0), r8.xyzw\n      itof r10.xyzw, r10.xyzw\n      mul r10.xyzw, r10.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n      max r8.xyzw, r10.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n      ibfe r10.xyzw, l(16, 16, 16, 16), l(0, 0, 0, 0), r9.xyzw\n      itof r10.xyzw, r10.xyzw\n      mul r10.xyzw, r10.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n      max r9.xyzw, r10.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n      break \n      case l(7)\n      f16tof32 r8.xyzw, r8.xyzw\n      f16tof32 r9.xyzw, r9.xyzw\n      break \n      default \n      break \n    endswitch \n  else \n    switch r4.z\n      case l(0)\n      case l(1)\n      movc r4.y, r0.w, l(16), l(0)\n      ushr r10.xyzw, r8.xyzw, r4.yyyy\n      and r10.xyzw, r10.xyzw, l(255, 255, 255, 255)\n      utof r10.xyzw, r10.xyzw\n      mul r8.xyzw, r10.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n      ushr r10.xyzw, r9.xyzw, r4.yyyy\n      and r10.xyzw, r10.xyzw, l(255, 255, 255, 255)\n      utof r10.xyzw, r10.xyzw\n      mul r9.xyzw, r10.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n      break \n      case l(2)\n      case l(10)\n      movc r4.y, r0.w, l(20), l(0)\n      ushr r10.xyzw, r8.xyzw, r4.yyyy\n      and r10.xyzw, r10.xyzw, l(1023, 1023, 1023, 1023)\n      utof r10.xyzw, r10.xyzw\n      mul r8.xyzw, r10.xyzw, l(0.000978, 0.000978, 0.000978, 0.000978)\n      ushr r10.xyzw, r9.xyzw, r4.yyyy\n      and r10.xyzw, r10.xyzw, l(1023, 1023, 1023, 1023)\n      utof r10.xyzw, r10.xyzw\n      mul r9.xyzw, r10.xyzw, l(0.000978, 0.000978, 0.000978, 0.000978)\n      break \n      case l(3)\n      case l(12)\n      movc r4.y, r0.w, l(20), l(0)\n      ushr r10.xyzw, r8.xyzw, r4.yyyy\n      and r11.xyzw, r10.xyzw, l(1023, 1023, 1023, 1023)\n      and r12.xyzw, r10.xyzw, l(127, 127, 127, 127)\n      ubfe r13.xyzw, l(3, 3, 3, 3), l(7, 7, 7, 7), r10.xyzw\n      firstbit_hi r14.xyzw, r12.xyzw\n      iadd r14.xyzw, r14.xyzw, l(-24, -24, -24, -24)\n      movc r14.xyzw, r12.xyzw, r14.xyzw, l(8,8,8,8)\n      iadd r15.xyzw, -r14.xyzw, l(1, 1, 1, 1)\n      movc r15.xyzw, r13.xyzw, r13.xyzw, r15.xyzw\n      bfi r10.xyzw, l(7, 7, 7, 7), r14.xyzw, r10.xyzw, l(0, 0, 0, 0)\n      and r10.xyzw, r10.xyzw, l(127, 127, 127, 127)\n      movc r10.xyzw, r13.xyzw, r12.xyzw, r10.xyzw\n      ishl r12.xyzw, r15.xyzw, l(23, 23, 23, 23)\n      iadd r12.xyzw, r12.xyzw, l(0x3e000000, 0x3e000000, 0x3e000000, 0x3e000000)\n      ishl r10.xyzw, r10.xyzw, l(16, 16, 16, 16)\n      iadd r10.xyzw, r12.xyzw, r10.xyzw\n      movc r8.xyzw, r11.xyzw, r10.xyzw, l(0,0,0,0)\n      ushr r10.xyzw, r9.xyzw, r4.yyyy\n      and r11.xyzw, r10.xyzw, l(1023, 1023, 1023, 1023)\n      and r12.xyzw, r10.xyzw, l(127, 127, 127, 127)\n      ubfe r13.xyzw, l(3, 3, 3, 3), l(7, 7, 7, 7), r10.xyzw\n      firstbit_hi r14.xyzw, r12.xyzw\n      iadd r14.xyzw, r14.xyzw, l(-24, -24, -24, -24)\n      movc r14.xyzw, r12.xyzw, r14.xyzw, l(8,8,8,8)\n      iadd r15.xyzw, -r14.xyzw, l(1, 1, 1, 1)\n      movc r15.xyzw, r13.xyzw, r13.xyzw, r15.xyzw\n      bfi r10.xyzw, l(7, 7, 7, 7), r14.xyzw, r10.xyzw, l(0, 0, 0, 0)\n      and r10.xyzw, r10.xyzw, l(127, 127, 127, 127)\n      movc r10.xyzw, r13.xyzw, r12.xyzw, r10.xyzw\n      ishl r12.xyzw, r15.xyzw, l(23, 23, 23, 23)\n      iadd r12.xyzw, r12.xyzw, l(0x3e000000, 0x3e000000, 0x3e000000, 0x3e000000)\n      ishl r10.xyzw, r10.xyzw, l(16, 16, 16, 16)\n      iadd r10.xyzw, r12.xyzw, r10.xyzw\n      movc r9.xyzw, r11.xyzw, r10.xyzw, l(0,0,0,0)\n      break \n      case l(4)\n      ibfe r10.xyzw, l(16, 16, 16, 16), l(0, 0, 0, 0), r8.xyzw\n      itof r10.xyzw, r10.xyzw\n      mul r10.xyzw, r10.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n      max r8.xyzw, r10.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n      ibfe r10.xyzw, l(16, 16, 16, 16), l(0, 0, 0, 0), r9.xyzw\n      itof r10.xyzw, r10.xyzw\n      mul r10.xyzw, r10.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n      max r9.xyzw, r10.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n      break \n      case l(6)\n      f16tof32 r8.xyzw, r8.xyzw\n      f16tof32 r9.xyzw, r9.xyzw\n      break \n      default \n      break \n    endswitch \n  endif \n  add r6.xyzw, r6.xyzw, r8.xyzw\n  add r7.xyzw, r7.xyzw, r9.xyzw\n  uge r3.w, r3.w, l(6)\n  if_nz r3.w\n    ishl r3.w, l(4), r4.w\n    mul r0.y, r0.y, l(0.250000)\n    iadd r0.x, r0.x, r3.w\n    if_nz r1.w\n      ld_raw r8.xyzw, r0.x, T0[0].xyzw\n      iadd r4.y, r0.x, l(16)\n      ld_raw r9.xyzw, r4.y, T0[0].xyzw\n    else \n      ld_raw r8.x, r0.x, T0[0].xxxx\n      iadd r4.y, r2.z, r0.x\n      ld_raw r8.y, r4.y, T0[0].xxxx\n      ishl r10.xyzw, l(8, 12, 16, 20), r1.yyyy\n      iadd r10.xyzw, r0.xxxx, r10.xyzw\n      ld_raw r8.z, r10.x, T0[0].xxxx\n      ld_raw r8.w, r10.y, T0[0].xxxx\n      ld_raw r9.x, r10.z, T0[0].xxxx\n      ld_raw r9.y, r10.w, T0[0].xxxx\n      ishl r5.yw, l(0, 24, 0, 28), r1.yyyy\n      iadd r5.yw, r0.xxxx, r5.yyyw\n      ld_raw r9.z, r5.y, T0[0].xxxx\n      ld_raw r9.w, r5.w, T0[0].xxxx\n    endif \n    if_nz r4.w\n      switch r4.z\n        case l(5)\n        ibfe r10.xyzw, l(16, 16, 16, 16), l(0, 0, 0, 0), r8.xyzw\n        itof r10.xyzw, r10.xyzw\n        mul r10.xyzw, r10.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r8.xyzw, r10.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        ibfe r10.xyzw, l(16, 16, 16, 16), l(0, 0, 0, 0), r9.xyzw\n        itof r10.xyzw, r10.xyzw\n        mul r10.xyzw, r10.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r9.xyzw, r10.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        break \n        case l(7)\n        f16tof32 r8.xyzw, r8.xyzw\n        f16tof32 r9.xyzw, r9.xyzw\n        break \n        default \n        break \n      endswitch \n    else \n      switch r4.z\n        case l(0)\n        case l(1)\n        movc r0.x, r0.w, l(16), l(0)\n        ushr r10.xyzw, r8.xyzw, r0.xxxx\n        and r10.xyzw, r10.xyzw, l(255, 255, 255, 255)\n        utof r10.xyzw, r10.xyzw\n        mul r8.xyzw, r10.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        ushr r10.xyzw, r9.xyzw, r0.xxxx\n        and r10.xyzw, r10.xyzw, l(255, 255, 255, 255)\n        utof r10.xyzw, r10.xyzw\n        mul r9.xyzw, r10.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        break \n        case l(2)\n        case l(10)\n        movc r0.x, r0.w, l(20), l(0)\n        ushr r10.xyzw, r8.xyzw, r0.xxxx\n        and r10.xyzw, r10.xyzw, l(1023, 1023, 1023, 1023)\n        utof r10.xyzw, r10.xyzw\n        mul r8.xyzw, r10.xyzw, l(0.000978, 0.000978, 0.000978, 0.000978)\n        ushr r10.xyzw, r9.xyzw, r0.xxxx\n        and r10.xyzw, r10.xyzw, l(1023, 1023, 1023, 1023)\n        utof r10.xyzw, r10.xyzw\n        mul r9.xyzw, r10.xyzw, l(0.000978, 0.000978, 0.000978, 0.000978)\n        break \n        case l(3)\n        case l(12)\n        movc r0.x, r0.w, l(20), l(0)\n        ushr r10.xyzw, r8.xyzw, r0.xxxx\n        and r11.xyzw, r10.xyzw, l(1023, 1023, 1023, 1023)\n        and r12.xyzw, r10.xyzw, l(127, 127, 127, 127)\n        ubfe r13.xyzw, l(3, 3, 3, 3), l(7, 7, 7, 7), r10.xyzw\n        firstbit_hi r14.xyzw, r12.xyzw\n        iadd r14.xyzw, r14.xyzw, l(-24, -24, -24, -24)\n        movc r14.xyzw, r12.xyzw, r14.xyzw, l(8,8,8,8)\n        iadd r15.xyzw, -r14.xyzw, l(1, 1, 1, 1)\n        movc r15.xyzw, r13.xyzw, r13.xyzw, r15.xyzw\n        bfi r10.xyzw, l(7, 7, 7, 7), r14.xyzw, r10.xyzw, l(0, 0, 0, 0)\n        and r10.xyzw, r10.xyzw, l(127, 127, 127, 127)\n        movc r10.xyzw, r13.xyzw, r12.xyzw, r10.xyzw\n        ishl r12.xyzw, r15.xyzw, l(23, 23, 23, 23)\n        iadd r12.xyzw, r12.xyzw, l(0x3e000000, 0x3e000000, 0x3e000000, 0x3e000000)\n        ishl r10.xyzw, r10.xyzw, l(16, 16, 16, 16)\n        iadd r10.xyzw, r12.xyzw, r10.xyzw\n        movc r8.xyzw, r11.xyzw, r10.xyzw, l(0,0,0,0)\n        ushr r10.xyzw, r9.xyzw, r0.xxxx\n        and r11.xyzw, r10.xyzw, l(1023, 1023, 1023, 1023)\n        and r12.xyzw, r10.xyzw, l(127, 127, 127, 127)\n        ubfe r13.xyzw, l(3, 3, 3, 3), l(7, 7, 7, 7), r10.xyzw\n        firstbit_hi r14.xyzw, r12.xyzw\n        iadd r14.xyzw, r14.xyzw, l(-24, -24, -24, -24)\n        movc r14.xyzw, r12.xyzw, r14.xyzw, l(8,8,8,8)\n        iadd r15.xyzw, -r14.xyzw, l(1, 1, 1, 1)\n        movc r15.xyzw, r13.xyzw, r13.xyzw, r15.xyzw\n        bfi r10.xyzw, l(7, 7, 7, 7), r14.xyzw, r10.xyzw, l(0, 0, 0, 0)\n        and r10.xyzw, r10.xyzw, l(127, 127, 127, 127)\n        movc r10.xyzw, r13.xyzw, r12.xyzw, r10.xyzw\n        ishl r12.xyzw, r15.xyzw, l(23, 23, 23, 23)\n        iadd r12.xyzw, r12.xyzw, l(0x3e000000, 0x3e000000, 0x3e000000, 0x3e000000)\n        ishl r10.xyzw, r10.xyzw, l(16, 16, 16, 16)\n        iadd r10.xyzw, r12.xyzw, r10.xyzw\n        movc r9.xyzw, r11.xyzw, r10.xyzw, l(0,0,0,0)\n        break \n        case l(4)\n        ibfe r10.xyzw, l(16, 16, 16, 16), l(0, 0, 0, 0), r8.xyzw\n        itof r10.xyzw, r10.xyzw\n        mul r10.xyzw, r10.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r8.xyzw, r10.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        ibfe r10.xyzw, l(16, 16, 16, 16), l(0, 0, 0, 0), r9.xyzw\n        itof r10.xyzw, r10.xyzw\n        mul r10.xyzw, r10.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r9.xyzw, r10.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        break \n        case l(6)\n        f16tof32 r8.xyzw, r8.xyzw\n        f16tof32 r9.xyzw, r9.xyzw\n        break \n        default \n        break \n      endswitch \n    endif \n    add r8.xyzw, r6.xyzw, r8.xyzw\n    add r9.xyzw, r7.xyzw, r9.xyzw\n    iadd r0.x, r3.w, r4.x\n    if_nz r1.w\n      ld_raw r10.xyzw, r0.x, T0[0].xyzw\n      iadd r1.w, r0.x, l(16)\n      ld_raw r11.xyzw, r1.w, T0[0].xyzw\n    else \n      ld_raw r10.x, r0.x, T0[0].xxxx\n      iadd r1.w, r2.z, r0.x\n      ld_raw r10.y, r1.w, T0[0].xxxx\n      ishl r12.xyzw, l(8, 12, 16, 20), r1.yyyy\n      iadd r12.xyzw, r0.xxxx, r12.xyzw\n      ld_raw r10.z, r12.x, T0[0].xxxx\n      ld_raw r10.w, r12.y, T0[0].xxxx\n      ld_raw r11.x, r12.z, T0[0].xxxx\n      ld_raw r11.y, r12.w, T0[0].xxxx\n      ishl r1.yw, l(0, 24, 0, 28), r1.yyyy\n      iadd r1.yw, r0.xxxx, r1.yyyw\n      ld_raw r11.z, r1.y, T0[0].xxxx\n      ld_raw r11.w, r1.w, T0[0].xxxx\n    endif \n    if_nz r4.w\n      switch r4.z\n        case l(5)\n        ibfe r12.xyzw, l(16, 16, 16, 16), l(0, 0, 0, 0), r10.xyzw\n        itof r12.xyzw, r12.xyzw\n        mul r12.xyzw, r12.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r10.xyzw, r12.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        ibfe r12.xyzw, l(16, 16, 16, 16), l(0, 0, 0, 0), r11.xyzw\n        itof r12.xyzw, r12.xyzw\n        mul r12.xyzw, r12.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r11.xyzw, r12.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        break \n        case l(7)\n        f16tof32 r10.xyzw, r10.xyzw\n        f16tof32 r11.xyzw, r11.xyzw\n        break \n        default \n        break \n      endswitch \n    else \n      switch r4.z\n        case l(0)\n        case l(1)\n        movc r0.x, r0.w, l(16), l(0)\n        ushr r4.xyzw, r10.xyzw, r0.xxxx\n        and r4.xyzw, r4.xyzw, l(255, 255, 255, 255)\n        utof r4.xyzw, r4.xyzw\n        mul r10.xyzw, r4.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        ushr r4.xyzw, r11.xyzw, r0.xxxx\n        and r4.xyzw, r4.xyzw, l(255, 255, 255, 255)\n        utof r4.xyzw, r4.xyzw\n        mul r11.xyzw, r4.xyzw, l(0.003922, 0.003922, 0.003922, 0.003922)\n        break \n        case l(2)\n        case l(10)\n        movc r0.x, r0.w, l(20), l(0)\n        ushr r4.xyzw, r10.xyzw, r0.xxxx\n        and r4.xyzw, r4.xyzw, l(1023, 1023, 1023, 1023)\n        utof r4.xyzw, r4.xyzw\n        mul r10.xyzw, r4.xyzw, l(0.000978, 0.000978, 0.000978, 0.000978)\n        ushr r4.xyzw, r11.xyzw, r0.xxxx\n        and r4.xyzw, r4.xyzw, l(1023, 1023, 1023, 1023)\n        utof r4.xyzw, r4.xyzw\n        mul r11.xyzw, r4.xyzw, l(0.000978, 0.000978, 0.000978, 0.000978)\n        break \n        case l(3)\n        case l(12)\n        movc r0.x, r0.w, l(20), l(0)\n        ushr r4.xyzw, r10.xyzw, r0.xxxx\n        and r12.xyzw, r4.xyzw, l(1023, 1023, 1023, 1023)\n        and r13.xyzw, r4.xyzw, l(127, 127, 127, 127)\n        ubfe r14.xyzw, l(3, 3, 3, 3), l(7, 7, 7, 7), r4.xyzw\n        firstbit_hi r15.xyzw, r13.xyzw\n        iadd r15.xyzw, r15.xyzw, l(-24, -24, -24, -24)\n        movc r15.xyzw, r13.xyzw, r15.xyzw, l(8,8,8,8)\n        iadd r16.xyzw, -r15.xyzw, l(1, 1, 1, 1)\n        movc r16.xyzw, r14.xyzw, r14.xyzw, r16.xyzw\n        bfi r4.xyzw, l(7, 7, 7, 7), r15.xyzw, r4.xyzw, l(0, 0, 0, 0)\n        and r4.xyzw, r4.xyzw, l(127, 127, 127, 127)\n        movc r4.xyzw, r14.xyzw, r13.xyzw, r4.xyzw\n        ishl r13.xyzw, r16.xyzw, l(23, 23, 23, 23)\n        iadd r13.xyzw, r13.xyzw, l(0x3e000000, 0x3e000000, 0x3e000000, 0x3e000000)\n        ishl r4.xyzw, r4.xyzw, l(16, 16, 16, 16)\n        iadd r4.xyzw, r13.xyzw, r4.xyzw\n        movc r10.xyzw, r12.xyzw, r4.xyzw, l(0,0,0,0)\n        ushr r4.xyzw, r11.xyzw, r0.xxxx\n        and r12.xyzw, r4.xyzw, l(1023, 1023, 1023, 1023)\n        and r13.xyzw, r4.xyzw, l(127, 127, 127, 127)\n        ubfe r14.xyzw, l(3, 3, 3, 3), l(7, 7, 7, 7), r4.xyzw\n        firstbit_hi r15.xyzw, r13.xyzw\n        iadd r15.xyzw, r15.xyzw, l(-24, -24, -24, -24)\n        movc r15.xyzw, r13.xyzw, r15.xyzw, l(8,8,8,8)\n        iadd r16.xyzw, -r15.xyzw, l(1, 1, 1, 1)\n        movc r16.xyzw, r14.xyzw, r14.xyzw, r16.xyzw\n        bfi r4.xyzw, l(7, 7, 7, 7), r15.xyzw, r4.xyzw, l(0, 0, 0, 0)\n        and r4.xyzw, r4.xyzw, l(127, 127, 127, 127)\n        movc r4.xyzw, r14.xyzw, r13.xyzw, r4.xyzw\n        ishl r13.xyzw, r16.xyzw, l(23, 23, 23, 23)\n        iadd r13.xyzw, r13.xyzw, l(0x3e000000, 0x3e000000, 0x3e000000, 0x3e000000)\n        ishl r4.xyzw, r4.xyzw, l(16, 16, 16, 16)\n        iadd r4.xyzw, r13.xyzw, r4.xyzw\n        movc r11.xyzw, r12.xyzw, r4.xyzw, l(0,0,0,0)\n        break \n        case l(4)\n        ibfe r4.xyzw, l(16, 16, 16, 16), l(0, 0, 0, 0), r10.xyzw\n        itof r4.xyzw, r4.xyzw\n        mul r4.xyzw, r4.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r10.xyzw, r4.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        ibfe r4.xyzw, l(16, 16, 16, 16), l(0, 0, 0, 0), r11.xyzw\n        itof r4.xyzw, r4.xyzw\n        mul r4.xyzw, r4.xyzw, l(0.000977, 0.000977, 0.000977, 0.000977)\n        max r11.xyzw, r4.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\n        break \n        case l(6)\n        f16tof32 r10.xyzw, r10.xyzw\n        f16tof32 r11.xyzw, r11.xyzw\n        break \n        default \n        break \n      endswitch \n    endif \n    add r6.xyzw, r8.xyzw, r10.xyzw\n    add r7.xyzw, r9.xyzw, r11.xyzw\n  else \n    mov r0.y, r2.w\n  endif \nendif \nmul r4.xyzw, r0.yyyy, r6.zxyw\nmul_sat r6.xyzw, r0.yyyy, r7.xyzw\nieq r0.x, r5.x, l(0)\nine r0.y, r1.x, l(0)\nand r0.x, r0.y, r0.x\nif_nz r0.x\n  uge r0.x, r1.x, l(2)\n  if_nz r0.x\n    uge r0.x, r1.x, l(3)\n    if_nz r0.x\n      mov r4.x, r4.w\n    endif \n    mov r4.xz, r4.xxxx\n  endif \n  mov r4.xyz, r4.xzzx\nendif \nmov r5.z, vThreadID.y\nimad r0.xy, r3.xzxx, r2.xyxx, r5.xzxx\nushr r1.xy, r0.xyxx, l(4, 3, 0, 0)\nudiv r5.xyzw, null, r1.yxyy, r2.yxyy\nimad r1.xy, -r2.xyxx, r5.ywyy, r1.xyxx\nishl r2.zw, r5.wwwy, l(0, 0, 3, 4)\nimad r0.w, r1.x, r2.y, r1.y\nbfi r0.y, l(3), l(4), r0.y, l(0)\nbfi r0.y, l(25), l(7), r0.w, r0.y\nbfi r0.x, l(4), l(0), r0.x, r0.y\nif_nz r0.z\n  ubfe r0.y, l(3), l(4), CB0[0][0].z\n  bfi r0.z, l(10), l(1), r3.y, l(0)\n  ishr r0.w, r0.y, l(2)\n  ibfe r1.xyw, l(28, 27, 0, 29), l(1, 1, 0, 0), r5.wyww\n  imad r0.z, r0.w, r0.z, r1.x\n  imad r0.z, r0.z, r1.z, r1.y\n  bfi r0.y, l(2), l(5), r0.y, l(0)\n  bfi r0.y, l(25), l(7), r0.z, r0.y\n  xor r0.w, r0.w, r1.w\n  ishr r1.x, r2.w, l(3)\n  and r1.x, r1.x, l(2)\n  bfi r1.yw, l(0, 1, 0, 1), l(0, 1, 0, 11), r0.wwww, l(0, 0, 0, 0)\n  xor r0.w, r1.y, r1.x\n  ishl r0.w, r0.w, l(6)\n  iadd r0.w, r1.w, r0.w\n  ishr r0.y, r0.y, l(5)\n  bfi r0.y, l(3), l(8), r0.y, r0.w\n  ibfe r0.z, l(24), l(1), r0.z\n  bfi r0.y, l(20), l(12), r0.z, r0.y\nelse \n  ibfe r3.xyzw, l(27, 27, 28, 29), l(2, 1, 1, 0), r5.xyzw\n  imad r0.z, r3.x, r1.z, r3.y\n  ishr r1.xy, r2.zwzz, l(1, 3, 0, 0)\n  bfi r0.w, l(3), l(3), r1.x, l(0)\n  bfi r0.w, l(26), l(6), r0.z, r0.w\n  and r1.x, r1.y, l(2)\n  bfi r1.yz, l(0, 1, 1, 0), l(0, 1, 11, 0), r3.wwzw, l(0, 0, 0, 0)\n  xor r1.x, r1.y, r1.x\n  ishl r1.x, r1.x, l(6)\n  iadd r1.x, r1.z, r1.x\n  ishr r0.w, r0.w, l(5)\n  bfi r0.w, l(3), l(8), r0.w, r1.x\n  ibfe r0.z, l(24), l(2), r0.z\n  bfi r0.y, l(20), l(12), r0.z, r0.w\nendif \nimul null, r0.z, r2.y, r2.x\nimad r0.x, r0.y, r0.z, r0.x\nmov_sat r4.xyzw, r4.xyzw\nmad r1.xyzw, r4.yzxw, l(255.000000, 255.000000, 255.000000, 255.000000), l(0.500000, 0.500000, 0.500000, 0.500000)\nftou r1.xyzw, r1.xyzw\nimad r0.y, r1.y, l(256), r1.x\nimad r0.y, r1.z, l(0x00010000), r0.y\nimad r1.x, r1.w, l(0x01000000), r0.y\nmad r2.xyzw, r6.xyzw, l(255.000000, 255.000000, 255.000000, 255.000000), l(0.500000, 0.500000, 0.500000, 0.500000)\nftou r2.xyzw, r2.xyzw\nimad r0.y, r2.y, l(256), r2.x\nimad r0.y, r2.z, l(0x00010000), r0.y\nimad r1.y, r2.w, l(0x01000000), r0.y\nstore_raw U0[0].xy, r0.x, r1.xyxx\nret \n// Approximately 642 instruction slots used\n#endif\n\nconst BYTE resolve_full_8bpp_scaled_cs[] =\n{\n     68,  88,  66,  67, 222, 249, \n    142,  26, 121, 224, 141, 171, \n    173, 250, 105,  11,  89,   8, \n    105, 247,   1,   0,   0,   0, \n     36,  77,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n    144,   2,   0,   0, 160,   2, \n      0,   0, 176,   2,   0,   0, \n    136,  76,   0,   0,  82,  68, \n     69,  70,  84,   2,   0,   0, \n      1,   0,   0,   0, 228,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n     44,   2,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 197,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 213,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 114, 101, 115, \n    111, 108, 118, 101,  95, 101, \n    100, 114,  97, 109,   0, 120, \n    101,  95, 114, 101, 115, 111, \n    108, 118, 101,  95, 100, 101, \n    115, 116,   0, 112, 117, 115, \n    104,  95,  99, 111, 110, 115, \n    116, 115,  95, 120, 101,   0, \n    213,   0,   0,   0,   4,   0, \n      0,   0, 252,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    156,   1,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 184,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 220,   1, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 184,   1,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 247,   1,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    184,   1,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     12,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 184,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 120, 101, \n     95, 114, 101, 115, 111, 108, \n    118, 101,  95, 101, 100, 114, \n     97, 109,  95, 105, 110, 102, \n    111,   0, 100, 119, 111, 114, \n    100,   0,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 178,   1, \n      0,   0, 120, 101,  95, 114, \n    101, 115, 111, 108, 118, 101, \n     95,  99, 111, 111, 114, 100, \n    105, 110,  97, 116, 101,  95, \n    105, 110, 102, 111,   0, 120, \n    101,  95, 114, 101, 115, 111, \n    108, 118, 101,  95, 100, 101, \n    115, 116,  95, 105, 110, 102, \n    111,   0, 120, 101,  95, 114, \n    101, 115, 111, 108, 118, 101, \n     95, 100, 101, 115, 116,  95, \n     99, 111, 111, 114, 100, 105, \n    110,  97, 116, 101,  95, 105, \n    110, 102, 111,   0,  77, 105, \n     99, 114, 111, 115, 111, 102, \n    116,  32,  40,  82,  41,  32, \n     72,  76,  83,  76,  32,  83, \n    104,  97, 100, 101, 114,  32, \n     67, 111, 109, 112, 105, 108, \n    101, 114,  32,  49,  48,  46, \n     49,   0,  73,  83,  71,  78, \n      8,   0,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     79,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  83,  72, \n     69,  88, 208,  73,   0,   0, \n     81,   0,   5,   0, 116,  18, \n      0,   0, 106,   8,   0,   1, \n     89,   0,   0,   7,  70, 142, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0, 161,   0, \n      0,   6,  70, 126,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 157,   0, \n      0,   6,  70, 238,  49,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  95,   0, \n      0,   2,  50,   0,   2,   0, \n    104,   0,   0,   2,  17,   0, \n      0,   0, 155,   0,   0,   4, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,  12, 242,   0, \n     16,   0,   0,   0,   0,   0, \n      6, 138,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n      0,   0,   0,  32,   8,   0, \n      0,   0,   0,   0,   0,   1, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   0,   0,   0,   0, \n    138,   0,   0,  17,  50,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n     17,   0,   0,   0,  20,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86, 133, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  18,   0,   0,   1, \n     54,   0,   0,   8,  50,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n    138,   0,   0,  17, 114,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  19,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,  86, 133, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   9,  66,   0,  16,   0, \n      1,   0,   0,   0,  58, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n    255,   3,   0,   0,  85,   0, \n      0,  12, 242,   0,  16,   0, \n      3,   0,   0,   0, 214, 143, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,  10,   0, \n      0,   0,  20,   0,   0,   0, \n     24,   0,   0,   0,  80,   0, \n      0,   6,  34,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n      2,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      0,   0,   0,   0,  62,   0, \n      0,   1,  21,   0,   0,   1, \n    138,   0,   0,  17, 242,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,  11,   0,   0,   0, \n      4,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  13,   0, \n      0,   0,  24,   0,   0,   0, \n     28,   0,   0,   0,   6, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   7, \n     18,   0,  16,   0,   5,   0, \n      0,   0,  26, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  34,   0, \n     16,   0,   5,   0,   0,   0, \n     10,   0,  16,   0,   3,   0, \n      0,   0, 140,   0,   0,  20, \n    194,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      6,   4,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 139,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   6,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0,  42, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     41,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     23,   0,   0,   0,  30,   0, \n      0,   7,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n    128,  63,  39,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  20,  82,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0, 166,  11, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  11, \n    130,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,  28,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      5,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  83,   0, \n      0,   6,  34,   0,  16,   0, \n      5,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,   2,   0,  35,   0, \n      0,   9, 194,   0,  16,   0, \n      2,   0,   0,   0, 166,  14, \n     16,   0,   2,   0,   0,   0, \n      6,   4,  16,   0,   2,   0, \n      0,   0,   6,   4,  16,   0, \n      5,   0,   0,   0,  80,   0, \n      0,   7,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,  31,   0,   4,   3, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  54,   0,   0,   5, \n     34,   0,  16,   0,   6,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,  18,   0, \n      0,   1,  32,   0,   0,   7, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   5,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     54,   0,   0,   5,  34,   0, \n     16,   0,   6,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,  18,   0,   0,   1, \n     54,   0,   0,   5,  34,   0, \n     16,   0,   6,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     21,   0,   0,   1,  80,   0, \n      0,  10, 162,   0,  16,   0, \n      5,   0,   0,   0,   6,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,  10, \n    162,   0,  16,   0,   5,   0, \n      0,   0,  86,  13,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     41,   0,   0,   7, 194,   0, \n     16,   0,   2,   0,   0,   0, \n    166,  14,  16,   0,   2,   0, \n      0,   0,  86,  13,  16,   0, \n      5,   0,   0,   0,  85,   0, \n      0,   7,  18,   0,  16,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   6,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,  10, \n     50,   0,  16,   0,   6,   0, \n      0,   0,  70,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 194,   0, \n     16,   0,   2,   0,   0,   0, \n    166,  14,  16,   0,   2,   0, \n      0,   0,   6,   4,  16,   0, \n      6,   0,   0,   0,  38,   0, \n      0,  11,   0, 208,   0,   0, \n     98,   0,  16,   0,   6,   0, \n      0,   0,   6,   1,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n     80,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     85,   0,   0,   7,  18,   0, \n     16,   0,   6,   0,   0,   0, \n     26,   0,  16,   0,   6,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,  78,   0, \n      0,   8,  50,   0,  16,   0, \n      7,   0,   0,   0,   0, 208, \n      0,   0, 230,  10,  16,   0, \n      2,   0,   0,   0, 134,   0, \n     16,   0,   6,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   7,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   7,   0,   0,   0, \n     30,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      4,   0,   0,   0,  35,   0, \n      0,  10, 194,   0,  16,   0, \n      2,   0,   0,   0,   6,   4, \n     16, 128,  65,   0,   0,   0, \n      7,   0,   0,   0,   6,   8, \n     16,   0,   6,   0,   0,   0, \n    166,  14,  16,   0,   2,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   6,   0, \n      0,   0,  26,   0,  16,   0, \n      6,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   6,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   7,  66,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   4,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  41,   0,   0,   7, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  11,   0,   0,   0, \n     78,   0,   0,   8,   0, 208, \n      0,   0,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  41,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     30,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   4,   0, \n      0,   0,  26,   0,  16,   0, \n      5,   0,   0,   0,  41,   0, \n      0,   7,  66,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  39,   0,   0,   7, \n    130,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,  31,   0, \n      4,   3,  58,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  21,   0,   0,   1, \n     32,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  31,   0, \n      4,   3,  58,   0,  16,   0, \n      1,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      6,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      7,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     18,   0,   0,   1, 165,   0, \n      0,   8,  18,   0,  16,   0, \n      6,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8,  34,   0,  16,   0, \n      6,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,  12,   0,   0,   0, \n     16,   0,   0,   0,  20,   0, \n      0,   0,  86,   5,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      8,   0,   0,   0,   6,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0, 165,   0,   0,   8, \n     66,   0,  16,   0,   6,   0, \n      0,   0,  10,   0,  16,   0, \n      8,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8, 130,   0,  16,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   8,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    165,   0,   0,   8,  18,   0, \n     16,   0,   7,   0,   0,   0, \n     42,   0,  16,   0,   8,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n     34,   0,  16,   0,   7,   0, \n      0,   0,  58,   0,  16,   0, \n      8,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10,  50,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,  24,   0,   0,   0, \n     28,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   4,   0, \n      0,   0,   6,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   4,   0,   0,   0, \n    165,   0,   0,   8,  66,   0, \n     16,   0,   7,   0,   0,   0, \n     10,   0,  16,   0,   4,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n    130,   0,  16,   0,   7,   0, \n      0,   0,  26,   0,  16,   0, \n      4,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     58,   0,  16,   0,   4,   0, \n      0,   0,  76,   0,   0,   3, \n     42,   0,  16,   0,   4,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,   5,   0, \n      0,   0, 139,   0,   0,  15, \n    242,   0,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n    139,   0,   0,  15, 242,   0, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   7,   0, \n      0,   0, 131,   0,   0,   5, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0, 131,   0, \n      0,   5, 242,   0,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n      2,   0,   0,   1,  10,   0, \n      0,   1,   2,   0,   0,   1, \n     23,   0,   0,   1,  18,   0, \n      0,   1,  76,   0,   0,   3, \n     42,   0,  16,   0,   4,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,   0,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  55,   0,   0,   9, \n    130,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,   7, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0, 246,  15, \n     16,   0,   2,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59,  85,   0, \n      0,   7, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n    246,  15,  16,   0,   2,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      2,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n     10,   0,   0,   0,  55,   0, \n      0,   9, 130,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  20,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,   7, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n    246,  15,  16,   0,   2,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   8,  32, 128,  58, \n      8,  32, 128,  58,   8,  32, \n    128,  58,   8,  32, 128,  58, \n     85,   0,   0,   7, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0, 246,  15,  16,   0, \n      2,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   8,  32, \n    128,  58,   8,  32, 128,  58, \n      8,  32, 128,  58,   8,  32, \n    128,  58,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     55,   0,   0,   9, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     85,   0,   0,   7, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0, 246,  15,  16,   0, \n      2,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n    135,   0,   0,   5, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  30,   0,   0,  10, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0, 232, 255, 255, 255, \n    232, 255, 255, 255, 232, 255, \n    255, 255, 232, 255, 255, 255, \n     55,   0,   0,  12, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n     30,   0,   0,  11, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16, 128,  65,   0, \n      0,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  55,   0,   0,   9, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,  55,   0,   0,   9, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     30,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,  62,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n     55,   0,   0,  12, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     85,   0,   0,   7, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0, 246,  15,  16,   0, \n      2,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n    135,   0,   0,   5, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  30,   0,   0,  10, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0, 232, 255, 255, 255, \n    232, 255, 255, 255, 232, 255, \n    255, 255, 232, 255, 255, 255, \n     55,   0,   0,  12, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n     30,   0,   0,  11, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16, 128,  65,   0, \n      0,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  55,   0,   0,   9, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0,  55,   0,   0,   9, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     30,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,  62, \n      0,   0,   0,  62,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n     55,   0,   0,  12, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      4,   0,   0,   0, 139,   0, \n      0,  15, 242,   0,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191, 139,   0,   0,  15, \n    242,   0,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      6,   0,   0,   0, 131,   0, \n      0,   5, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n    131,   0,   0,   5, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,   2,   0,   0,   1, \n     10,   0,   0,   1,   2,   0, \n      0,   1,  23,   0,   0,   1, \n     21,   0,   0,   1,  80,   0, \n      0,   7, 130,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  31,   0,   4,   3, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  56,   0,   0,   7, \n    130,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,  63, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   4,   0,   0,   0, \n      1,  64,   0,   0,  64,   1, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  58,   0, \n     16,   0,   1,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     10,   0,  16,   0,   4,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     34,   0,  16,   0,   4,   0, \n      0,   0,  10,   0,  16,   0, \n      4,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  18,   0,   0,   1, \n    165,   0,   0,   8,  18,   0, \n     16,   0,   8,   0,   0,   0, \n     10,   0,  16,   0,   4,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     34,   0,  16,   0,   4,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n    165,   0,   0,   8,  34,   0, \n     16,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,  12,   0, \n      0,   0,  16,   0,   0,   0, \n     20,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,  10,   0,   0,   0, \n      6,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0, 165,   0, \n      0,   8,  66,   0,  16,   0, \n      8,   0,   0,   0,  10,   0, \n     16,   0,  10,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    165,   0,   0,   8, 130,   0, \n     16,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,  10,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n     18,   0,  16,   0,   9,   0, \n      0,   0,  42,   0,  16,   0, \n     10,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8,  34,   0,  16,   0, \n      9,   0,   0,   0,  58,   0, \n     16,   0,  10,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     41,   0,   0,  10, 162,   0, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,  28,   0, \n      0,   0,  86,   5,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7, 162,   0,  16,   0, \n      5,   0,   0,   0,   6,   0, \n     16,   0,   4,   0,   0,   0, \n     86,  13,  16,   0,   5,   0, \n      0,   0, 165,   0,   0,   8, \n     66,   0,  16,   0,   9,   0, \n      0,   0,  26,   0,  16,   0, \n      5,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8, 130,   0,  16,   0, \n      9,   0,   0,   0,  58,   0, \n     16,   0,   5,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  58,   0,  16,   0, \n      4,   0,   0,   0,  76,   0, \n      0,   3,  42,   0,  16,   0, \n      4,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      5,   0,   0,   0, 139,   0, \n      0,  15, 242,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191, 139,   0,   0,  15, \n    242,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      7,   0,   0,   0, 131,   0, \n      0,   5, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n    131,   0,   0,   5, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,   2,   0,   0,   1, \n     10,   0,   0,   1,   2,   0, \n      0,   1,  23,   0,   0,   1, \n     18,   0,   0,   1,  76,   0, \n      0,   3,  42,   0,  16,   0, \n      4,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      0,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      1,   0,   0,   0,  55,   0, \n      0,   9,  34,   0,  16,   0, \n      4,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,   7, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n     86,   5,  16,   0,   4,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n     85,   0,   0,   7, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,  86,   5,  16,   0, \n      4,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,  10,   0,   0,   0, \n     55,   0,   0,   9,  34,   0, \n     16,   0,   4,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     85,   0,   0,   7, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,  86,   5,  16,   0, \n      4,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   8,  32, \n    128,  58,   8,  32, 128,  58, \n      8,  32, 128,  58,   8,  32, \n    128,  58,  85,   0,   0,   7, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,  86,   5, \n     16,   0,   4,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      8,  32, 128,  58,   8,  32, \n    128,  58,   8,  32, 128,  58, \n      8,  32, 128,  58,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  55,   0,   0,   9, \n     34,   0,  16,   0,   4,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,   7, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,  86,   5, \n     16,   0,   4,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0, 135,   0,   0,   5, \n    242,   0,  16,   0,  14,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,  30,   0, \n      0,  10, 242,   0,  16,   0, \n     14,   0,   0,   0,  70,  14, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255, 232, 255, \n    255, 255,  55,   0,   0,  12, \n    242,   0,  16,   0,  14,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,  30,   0,   0,  11, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16, 128, \n     65,   0,   0,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,  55,   0, \n      0,   9, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,  14,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,  55,   0, \n      0,   9, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  30,   0,   0,  10, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,  62, \n     41,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  55,   0,   0,  12, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,   7, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,  86,   5, \n     16,   0,   4,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0, 135,   0,   0,   5, \n    242,   0,  16,   0,  14,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,  30,   0, \n      0,  10, 242,   0,  16,   0, \n     14,   0,   0,   0,  70,  14, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255, 232, 255, \n    255, 255,  55,   0,   0,  12, \n    242,   0,  16,   0,  14,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,  30,   0,   0,  11, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16, 128, \n     65,   0,   0,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,  55,   0, \n      0,   9, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,  14,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,  55,   0, \n      0,   9, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  30,   0,   0,  10, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,  62, \n     41,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  55,   0,   0,  12, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   4,   0,   0,   0, \n    139,   0,   0,  15, 242,   0, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191, 139,   0, \n      0,  15, 242,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   6,   0,   0,   0, \n    131,   0,   0,   5, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0, 131,   0,   0,   5, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,   2,   0, \n      0,   1,  10,   0,   0,   1, \n      2,   0,   0,   1,  23,   0, \n      0,   1,  21,   0,   0,   1, \n      0,   0,   0,   7, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   7, 242,   0,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,  80,   0,   0,   7, \n    130,   0,  16,   0,   3,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   6,   0,   0,   0, \n     31,   0,   4,   3,  58,   0, \n     16,   0,   3,   0,   0,   0, \n     41,   0,   0,   7, 130,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,  56,   0, \n      0,   7,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n    128,  62,  30,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n     31,   0,   4,   3,  58,   0, \n     16,   0,   1,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     34,   0,  16,   0,   4,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  18,   0,   0,   1, \n    165,   0,   0,   8,  18,   0, \n     16,   0,   8,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     34,   0,  16,   0,   4,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n    165,   0,   0,   8,  34,   0, \n     16,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,  12,   0, \n      0,   0,  16,   0,   0,   0, \n     20,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,  10,   0,   0,   0, \n      6,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0, 165,   0, \n      0,   8,  66,   0,  16,   0, \n      8,   0,   0,   0,  10,   0, \n     16,   0,  10,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    165,   0,   0,   8, 130,   0, \n     16,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,  10,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n     18,   0,  16,   0,   9,   0, \n      0,   0,  42,   0,  16,   0, \n     10,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8,  34,   0,  16,   0, \n      9,   0,   0,   0,  58,   0, \n     16,   0,  10,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     41,   0,   0,  10, 162,   0, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,  28,   0, \n      0,   0,  86,   5,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7, 162,   0,  16,   0, \n      5,   0,   0,   0,   6,   0, \n     16,   0,   0,   0,   0,   0, \n     86,  13,  16,   0,   5,   0, \n      0,   0, 165,   0,   0,   8, \n     66,   0,  16,   0,   9,   0, \n      0,   0,  26,   0,  16,   0, \n      5,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8, 130,   0,  16,   0, \n      9,   0,   0,   0,  58,   0, \n     16,   0,   5,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  58,   0,  16,   0, \n      4,   0,   0,   0,  76,   0, \n      0,   3,  42,   0,  16,   0, \n      4,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      5,   0,   0,   0, 139,   0, \n      0,  15, 242,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191, 139,   0,   0,  15, \n    242,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      7,   0,   0,   0, 131,   0, \n      0,   5, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n    131,   0,   0,   5, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,   2,   0,   0,   1, \n     10,   0,   0,   1,   2,   0, \n      0,   1,  23,   0,   0,   1, \n     18,   0,   0,   1,  76,   0, \n      0,   3,  42,   0,  16,   0, \n      4,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      0,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      1,   0,   0,   0,  55,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,   7, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      6,   0,  16,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n     85,   0,   0,   7, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,   6,   0,  16,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,  10,   0,   0,   0, \n     55,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     85,   0,   0,   7, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,   6,   0,  16,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   8,  32, \n    128,  58,   8,  32, 128,  58, \n      8,  32, 128,  58,   8,  32, \n    128,  58,  85,   0,   0,   7, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,   6,   0, \n     16,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      8,  32, 128,  58,   8,  32, \n    128,  58,   8,  32, 128,  58, \n      8,  32, 128,  58,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  55,   0,   0,   9, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,   7, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   6,   0, \n     16,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0, 135,   0,   0,   5, \n    242,   0,  16,   0,  14,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,  30,   0, \n      0,  10, 242,   0,  16,   0, \n     14,   0,   0,   0,  70,  14, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255, 232, 255, \n    255, 255,  55,   0,   0,  12, \n    242,   0,  16,   0,  14,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,  30,   0,   0,  11, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16, 128, \n     65,   0,   0,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,  55,   0, \n      0,   9, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,  14,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,  55,   0, \n      0,   9, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  30,   0,   0,  10, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,  62, \n     41,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  55,   0,   0,  12, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,   7, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,   6,   0, \n     16,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0, 135,   0,   0,   5, \n    242,   0,  16,   0,  14,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,  30,   0, \n      0,  10, 242,   0,  16,   0, \n     14,   0,   0,   0,  70,  14, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255, 232, 255, \n    255, 255,  55,   0,   0,  12, \n    242,   0,  16,   0,  14,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,  30,   0,   0,  11, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16, 128, \n     65,   0,   0,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,  55,   0, \n      0,   9, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,  14,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,  55,   0, \n      0,   9, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  30,   0,   0,  10, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,  62, \n     41,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  55,   0,   0,  12, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   4,   0,   0,   0, \n    139,   0,   0,  15, 242,   0, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191, 139,   0, \n      0,  15, 242,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   6,   0,   0,   0, \n    131,   0,   0,   5, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0, 131,   0,   0,   5, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,   2,   0, \n      0,   1,  10,   0,   0,   1, \n      2,   0,   0,   1,  23,   0, \n      0,   1,  21,   0,   0,   1, \n      0,   0,   0,   7, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   7, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     31,   0,   4,   3,  58,   0, \n     16,   0,   1,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  18,   0,   0,   1, \n    165,   0,   0,   8,  18,   0, \n     16,   0,  10,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n    165,   0,   0,   8,  34,   0, \n     16,   0,  10,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,  12,   0, \n      0,   0,  16,   0,   0,   0, \n     20,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,  12,   0,   0,   0, \n      6,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0, 165,   0, \n      0,   8,  66,   0,  16,   0, \n     10,   0,   0,   0,  10,   0, \n     16,   0,  12,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    165,   0,   0,   8, 130,   0, \n     16,   0,  10,   0,   0,   0, \n     26,   0,  16,   0,  12,   0, \n      0,   0,   6, 112,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n     18,   0,  16,   0,  11,   0, \n      0,   0,  42,   0,  16,   0, \n     12,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8,  34,   0,  16,   0, \n     11,   0,   0,   0,  58,   0, \n     16,   0,  12,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     41,   0,   0,  10, 162,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,  28,   0, \n      0,   0,  86,   5,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7, 162,   0,  16,   0, \n      1,   0,   0,   0,   6,   0, \n     16,   0,   0,   0,   0,   0, \n     86,  13,  16,   0,   1,   0, \n      0,   0, 165,   0,   0,   8, \n     66,   0,  16,   0,  11,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,   6, 112, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8, 130,   0,  16,   0, \n     11,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n      6, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  58,   0,  16,   0, \n      4,   0,   0,   0,  76,   0, \n      0,   3,  42,   0,  16,   0, \n      4,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      5,   0,   0,   0, 139,   0, \n      0,  15, 242,   0,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191, 139,   0,   0,  15, \n    242,   0,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,  52,   0,   0,  10, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      2,   0,   0,   1,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      7,   0,   0,   0, 131,   0, \n      0,   5, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n    131,   0,   0,   5, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,   0,   0,   1, \n     10,   0,   0,   1,   2,   0, \n      0,   1,  23,   0,   0,   1, \n     18,   0,   0,   1,  76,   0, \n      0,   3,  42,   0,  16,   0, \n      4,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      0,   0,   0,   0,   6,   0, \n      0,   3,   1,  64,   0,   0, \n      1,   0,   0,   0,  55,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,   7, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      6,   0,  16,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59, 129, 128, 128,  59, \n     85,   0,   0,   7, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   6,   0,  16,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0, 129, 128, \n    128,  59, 129, 128, 128,  59, \n    129, 128, 128,  59, 129, 128, \n    128,  59,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      6,   0,   0,   3,   1,  64, \n      0,   0,  10,   0,   0,   0, \n     55,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     85,   0,   0,   7, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   6,   0,  16,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   8,  32, \n    128,  58,   8,  32, 128,  58, \n      8,  32, 128,  58,   8,  32, \n    128,  58,  85,   0,   0,   7, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,   6,   0, \n     16,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      8,  32, 128,  58,   8,  32, \n    128,  58,   8,  32, 128,  58, \n      8,  32, 128,  58,   2,   0, \n      0,   1,   6,   0,   0,   3, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   3, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  55,   0,   0,   9, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,   7, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   6,   0, \n     16,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0, 135,   0,   0,   5, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  30,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255, 232, 255, \n    255, 255,  55,   0,   0,  12, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,  30,   0,   0,  11, \n    242,   0,  16,   0,  16,   0, \n      0,   0,  70,  14,  16, 128, \n     65,   0,   0,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,  55,   0, \n      0,   9, 242,   0,  16,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,  14,   0,   0,   0, \n     70,  14,  16,   0,  14,   0, \n      0,   0,  70,  14,  16,   0, \n     16,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,  55,   0, \n      0,   9, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,  14,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  30,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,  62, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  55,   0,   0,  12, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,   7, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,   6,   0, \n     16,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0, 135,   0,   0,   5, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  30,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 232, 255, \n    255, 255, 232, 255, 255, 255, \n    232, 255, 255, 255, 232, 255, \n    255, 255,  55,   0,   0,  12, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,  30,   0,   0,  11, \n    242,   0,  16,   0,  16,   0, \n      0,   0,  70,  14,  16, 128, \n     65,   0,   0,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,  55,   0, \n      0,   9, 242,   0,  16,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,  14,   0,   0,   0, \n     70,  14,  16,   0,  14,   0, \n      0,   0,  70,  14,  16,   0, \n     16,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n    127,   0,   0,   0, 127,   0, \n      0,   0, 127,   0,   0,   0, \n    127,   0,   0,   0,  55,   0, \n      0,   9, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,  14,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  30,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  62, \n      0,   0,   0,  62,   0,   0, \n      0,  62,   0,   0,   0,  62, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  55,   0,   0,  12, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   4,   0,   0,   0, \n    139,   0,   0,  15, 242,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   1, 128,  58, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n     52,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191, 139,   0, \n      0,  15, 242,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1, 128,  58,   0,   1, \n    128,  58,   0,   1, 128,  58, \n      0,   1, 128,  58,  52,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   2,   0,   0,   1, \n      6,   0,   0,   3,   1,  64, \n      0,   0,   6,   0,   0,   0, \n    131,   0,   0,   5, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0, 131,   0,   0,   5, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,   2,   0, \n      0,   1,  10,   0,   0,   1, \n      2,   0,   0,   1,  23,   0, \n      0,   1,  21,   0,   0,   1, \n      0,   0,   0,   7, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   0,   0, \n      0,   7, 242,   0,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,  18,   0,   0,   1, \n     54,   0,   0,   5,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  21,   0,   0,   1, \n     21,   0,   0,   1,  56,   0, \n      0,   7, 242,   0,  16,   0, \n      4,   0,   0,   0,  86,   5, \n     16,   0,   0,   0,   0,   0, \n     38,  13,  16,   0,   6,   0, \n      0,   0,  56,  32,   0,   7, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  86,   5,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n     32,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   5,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  39,   0, \n      0,   7,  34,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     80,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  31,   0, \n      4,   3,  10,   0,  16,   0, \n      0,   0,   0,   0,  80,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   4,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,  21,   0, \n      0,   1,  54,   0,   0,   5, \n     82,   0,  16,   0,   4,   0, \n      0,   0,   6,   0,  16,   0, \n      4,   0,   0,   0,  21,   0, \n      0,   1,  54,   0,   0,   5, \n    114,   0,  16,   0,   4,   0, \n      0,   0, 134,   2,  16,   0, \n      4,   0,   0,   0,  21,   0, \n      0,   1,  54,   0,   0,   4, \n     66,   0,  16,   0,   5,   0, \n      0,   0,  26,   0,   2,   0, \n     35,   0,   0,   9,  50,   0, \n     16,   0,   0,   0,   0,   0, \n    134,   0,  16,   0,   3,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0, 134,   0, \n     16,   0,   5,   0,   0,   0, \n     85,   0,   0,  10,  50,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  78,   0, \n      0,   8, 242,   0,  16,   0, \n      5,   0,   0,   0,   0, 208, \n      0,   0,  22,   5,  16,   0, \n      1,   0,   0,   0,  22,   5, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,  10,  50,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16, 128,  65,   0, \n      0,   0,   2,   0,   0,   0, \n    214,   5,  16,   0,   5,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,  41,   0, \n      0,  10, 194,   0,  16,   0, \n      2,   0,   0,   0, 246,   7, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   4,   0, \n      0,   0,  35,   0,   0,   9, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  25,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  18,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     42,   0,  16,   0,   0,   0, \n      0,   0, 138,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     42, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  66,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  10,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     42,   0,   0,   7, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0, 139,   0, \n      0,  15, 178,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  28,   0,   0,   0, \n     27,   0,   0,   0,   0,   0, \n      0,   0,  29,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 118,  15,  16,   0, \n      5,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  25,   0, \n      0,   0,   1,  64,   0,   0, \n      7,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0, 140,   0,   0,  20, \n    162,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  11,   0,   0,   0, \n    246,  15,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  87,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  41,   0,   0,   7, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   6,   0,   0,   0, \n     30,   0,   0,   7, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n      0,   7,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0, 139,   0, \n      0,   9,  66,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  24,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     18,   0,   0,   1, 139,   0, \n      0,  15, 242,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,  27,   0,   0,   0, \n     27,   0,   0,   0,  28,   0, \n      0,   0,  29,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,  42,   0, \n      0,  10,  50,   0,  16,   0, \n      1,   0,   0,   0, 230,  10, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n    130,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11, 130,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  26,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n      1,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  20,  98,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0, 246,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  41,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,   0,   7, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0, 140,   0, \n      0,  11, 130,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   8,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    139,   0,   0,   9,  66,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  24,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  20,   0, \n      0,   0,   1,  64,   0,   0, \n     12,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     38,   0,   0,   8,   0, 208, \n      0,   0,  66,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  54,  32,   0,   5, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  50,   0, \n      0,  15, 242,   0,  16,   0, \n      1,   0,   0,   0, 150,  12, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    127,  67,   0,   0, 127,  67, \n      0,   0, 127,  67,   0,   0, \n    127,  67,   2,  64,   0,   0, \n      0,   0,   0,  63,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,  28,   0, \n      0,   5, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   1,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   1,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   1,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     50,   0,   0,  15, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 127,  67,   0,   0, \n    127,  67,   0,   0, 127,  67, \n      0,   0, 127,  67,   2,  64, \n      0,   0,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,  63,   0,   0,   0,  63, \n     28,   0,   0,   5, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   0,   1,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   1,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   1, \n     26,   0,  16,   0,   0,   0, \n      0,   0, 166,   0,   0,   8, \n     50, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,  62,   0, \n      0,   1,  83,  84,  65,  84, \n    148,   0,   0,   0, 130,   2, \n      0,   0,  17,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   0, \n    126,   0,   0,   0,  90,   0, \n      0,   0,  51,   0,   0,   0, \n     27,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  40,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  12,   0,   0,   0, \n     44,   0,   0,   0,  34,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/tessellation_adaptive_vs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer xe_system_cbuffer\n// {\n//\n//   uint xe_flags;                     // Offset:    0 Size:     4 [unused]\n//   float2 xe_tessellation_factor_range;// Offset:    4 Size:     8\n//   uint xe_line_loop_closing_index;   // Offset:   12 Size:     4 [unused]\n//   uint xe_vertex_index_endian;       // Offset:   16 Size:     4\n//   uint xe_vertex_index_offset;       // Offset:   20 Size:     4 [unused]\n//   uint2 xe_vertex_index_min_max;     // Offset:   24 Size:     8 [unused]\n//   float4 xe_user_clip_planes[6];     // Offset:   32 Size:    96 [unused]\n//   float3 xe_ndc_scale;               // Offset:  128 Size:    12 [unused]\n//   float xe_point_vertex_diameter_min;// Offset:  140 Size:     4 [unused]\n//   float3 xe_ndc_offset;              // Offset:  144 Size:    12 [unused]\n//   float xe_point_vertex_diameter_max;// Offset:  156 Size:     4 [unused]\n//   float2 xe_point_constant_diameter; // Offset:  160 Size:     8 [unused]\n//   float2 xe_point_screen_diameter_to_ndc_radius;// Offset:  168 Size:     8 [unused]\n//   uint4 xe_texture_swizzled_signs[2];// Offset:  176 Size:    32 [unused]\n//   uint xe_textures_resolution_scaled;// Offset:  208 Size:     4 [unused]\n//   uint2 xe_sample_count_log2;        // Offset:  212 Size:     8 [unused]\n//   float xe_alpha_test_reference;     // Offset:  220 Size:     4 [unused]\n//   uint xe_alpha_to_mask;             // Offset:  224 Size:     4 [unused]\n//   uint xe_edram_32bpp_tile_pitch_dwords_scaled;// Offset:  228 Size:     4 [unused]\n//   uint xe_edram_depth_base_dwords_scaled;// Offset:  232 Size:     4 [unused]\n//   float4 xe_color_exp_bias;          // Offset:  240 Size:    16 [unused]\n//   float2 xe_edram_poly_offset_front; // Offset:  256 Size:     8 [unused]\n//   float2 xe_edram_poly_offset_back;  // Offset:  264 Size:     8 [unused]\n//   uint4 xe_edram_stencil[2];         // Offset:  272 Size:    32 [unused]\n//   uint4 xe_edram_rt_base_dwords_scaled;// Offset:  304 Size:    16 [unused]\n//   uint4 xe_edram_rt_format_flags;    // Offset:  320 Size:    16 [unused]\n//   float4 xe_edram_rt_clamp[4];       // Offset:  336 Size:    64 [unused]\n//   uint4 xe_edram_rt_keep_mask[2];    // Offset:  400 Size:    32 [unused]\n//   uint4 xe_edram_rt_blend_factors_ops;// Offset:  432 Size:    16 [unused]\n//   float4 xe_edram_blend_constant;    // Offset:  448 Size:    16 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_system_cbuffer                 cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// SV_VertexID              0   x           0   VERTID    uint   x   \n//\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// XETESSFACTOR             0   x           0     NONE   float   x   \n//\nvs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][2], immediateIndexed, space=0\ndcl_input_sgv v0.x, vertex_id\ndcl_output o0.x\ndcl_temps 1\nieq r0.xyz, CB0[0][1].xxxx, l(1, 2, 3, 0)\nor r0.xy, r0.yzyy, r0.xyxx\nif_nz r0.x\n  ishl r0.x, v0.x, l(8)\n  ushr r0.z, v0.x, l(8)\n  and r0.xz, r0.xxzx, l(0xff00ff00, 0, 0x00ff00ff, 0)\n  iadd r0.x, r0.z, r0.x\nelse \n  mov r0.x, v0.x\nendif \nif_nz r0.y\n  ushr r0.y, r0.x, l(16)\n  bfi r0.x, l(16), l(16), r0.x, r0.y\nendif \nadd r0.x, r0.x, l(1.000000)\nmax r0.x, r0.x, CB0[0][0].y\nmin o0.x, r0.x, CB0[0][0].z\nret \n// Approximately 18 instruction slots used\n#endif\n\nconst BYTE tessellation_adaptive_vs[] =\n{\n     68,  88,  66,  67, 176,  83, \n     38, 124,  12, 115, 219,  54, \n     63,  56, 200, 154, 202,  77, \n     95, 132,   1,   0,   0,   0, \n    124,  13,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n    112,  10,   0,   0, 164,  10, \n      0,   0, 220,  10,   0,   0, \n    224,  12,   0,   0,  82,  68, \n     69,  70,  52,  10,   0,   0, \n      1,   0,   0,   0, 120,   0, \n      0,   0,   1,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n    254, 255,   0,   5,   0,   0, \n     10,  10,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    100,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 120, 101, \n     95, 115, 121, 115, 116, 101, \n    109,  95,  99,  98, 117, 102, \n    102, 101, 114,   0, 171, 171, \n    100,   0,   0,   0,  30,   0, \n      0,   0, 144,   0,   0,   0, \n    208,   1,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     64,   5,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,  80,   5, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 116,   5, \n      0,   0,   4,   0,   0,   0, \n      8,   0,   0,   0,   2,   0, \n      0,   0, 152,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 188,   5,   0,   0, \n     12,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n     80,   5,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    215,   5,   0,   0,  16,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0,  80,   5, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 238,   5, \n      0,   0,  20,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,  80,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,   5,   6,   0,   0, \n     24,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n     36,   6,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     72,   6,   0,   0,  32,   0, \n      0,   0,  96,   0,   0,   0, \n      0,   0,   0,   0, 100,   6, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 136,   6, \n      0,   0, 128,   0,   0,   0, \n     12,   0,   0,   0,   0,   0, \n      0,   0, 156,   6,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 192,   6,   0,   0, \n    140,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n    228,   6,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n      8,   7,   0,   0, 144,   0, \n      0,   0,  12,   0,   0,   0, \n      0,   0,   0,   0, 156,   6, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  22,   7, \n      0,   0, 156,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0, 228,   6,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  51,   7,   0,   0, \n    160,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n    152,   5,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     78,   7,   0,   0, 168,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0, 152,   5, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 117,   7, \n      0,   0, 176,   0,   0,   0, \n     32,   0,   0,   0,   0,   0, \n      0,   0, 152,   7,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 188,   7,   0,   0, \n    208,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n     80,   5,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    218,   7,   0,   0, 212,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  36,   6, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 239,   7, \n      0,   0, 220,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0, 228,   6,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,   7,   8,   0,   0, \n    224,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n     80,   5,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     24,   8,   0,   0, 228,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,  80,   5, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  64,   8, \n      0,   0, 232,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,  80,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  98,   8,   0,   0, \n    240,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n    116,   8,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    152,   8,   0,   0,   0,   1, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0, 152,   5, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 179,   8, \n      0,   0,   8,   1,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0, 152,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 205,   8,   0,   0, \n     16,   1,   0,   0,  32,   0, \n      0,   0,   0,   0,   0,   0, \n    224,   8,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n      4,   9,   0,   0,  48,   1, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  36,   9, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  72,   9, \n      0,   0,  64,   1,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  36,   9,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  97,   9,   0,   0, \n     80,   1,   0,   0,  64,   0, \n      0,   0,   0,   0,   0,   0, \n    116,   9,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    152,   9,   0,   0, 144,   1, \n      0,   0,  32,   0,   0,   0, \n      0,   0,   0,   0, 176,   9, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 212,   9, \n      0,   0, 176,   1,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  36,   9,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 242,   9,   0,   0, \n    192,   1,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n    116,   8,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    120, 101,  95, 102, 108,  97, \n    103, 115,   0, 100, 119, 111, \n    114, 100,   0, 171,   0,   0, \n     19,   0,   1,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     73,   5,   0,   0, 120, 101, \n     95, 116, 101, 115, 115, 101, \n    108, 108,  97, 116, 105, 111, \n    110,  95, 102,  97,  99, 116, \n    111, 114,  95, 114,  97, 110, \n    103, 101,   0, 102, 108, 111, \n     97, 116,  50,   0,   1,   0, \n      3,   0,   1,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    145,   5,   0,   0, 120, 101, \n     95, 108, 105, 110, 101,  95, \n    108, 111, 111, 112,  95,  99, \n    108, 111, 115, 105, 110, 103, \n     95, 105, 110, 100, 101, 120, \n      0, 120, 101,  95, 118, 101, \n    114, 116, 101, 120,  95, 105, \n    110, 100, 101, 120,  95, 101, \n    110, 100, 105,  97, 110,   0, \n    120, 101,  95, 118, 101, 114, \n    116, 101, 120,  95, 105, 110, \n    100, 101, 120,  95, 111, 102, \n    102, 115, 101, 116,   0, 120, \n    101,  95, 118, 101, 114, 116, \n    101, 120,  95, 105, 110, 100, \n    101, 120,  95, 109, 105, 110, \n     95, 109,  97, 120,   0, 117, \n    105, 110, 116,  50,   0, 171, \n      1,   0,  19,   0,   1,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  29,   6,   0,   0, \n    120, 101,  95, 117, 115, 101, \n    114,  95,  99, 108, 105, 112, \n     95, 112, 108,  97, 110, 101, \n    115,   0, 102, 108, 111,  97, \n    116,  52,   0, 171,   1,   0, \n      3,   0,   1,   0,   4,   0, \n      6,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     92,   6,   0,   0, 120, 101, \n     95, 110, 100,  99,  95, 115, \n     99,  97, 108, 101,   0, 102, \n    108, 111,  97, 116,  51,   0, \n      1,   0,   3,   0,   1,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 149,   6,   0,   0, \n    120, 101,  95, 112, 111, 105, \n    110, 116,  95, 118, 101, 114, \n    116, 101, 120,  95, 100, 105, \n     97, 109, 101, 116, 101, 114, \n     95, 109, 105, 110,   0, 102, \n    108, 111,  97, 116,   0, 171, \n      0,   0,   3,   0,   1,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 221,   6,   0,   0, \n    120, 101,  95, 110, 100,  99, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 112, \n    111, 105, 110, 116,  95, 118, \n    101, 114, 116, 101, 120,  95, \n    100, 105,  97, 109, 101, 116, \n    101, 114,  95, 109,  97, 120, \n      0, 120, 101,  95, 112, 111, \n    105, 110, 116,  95,  99, 111, \n    110, 115, 116,  97, 110, 116, \n     95, 100, 105,  97, 109, 101, \n    116, 101, 114,   0, 120, 101, \n     95, 112, 111, 105, 110, 116, \n     95, 115,  99, 114, 101, 101, \n    110,  95, 100, 105,  97, 109, \n    101, 116, 101, 114,  95, 116, \n    111,  95, 110, 100,  99,  95, \n    114,  97, 100, 105, 117, 115, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    115, 119, 105, 122, 122, 108, \n    101, 100,  95, 115, 105, 103, \n    110, 115,   0, 117, 105, 110, \n    116,  52,   0, 171, 171, 171, \n      1,   0,  19,   0,   1,   0, \n      4,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 143,   7,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101, 115,  95, \n    114, 101, 115, 111, 108, 117, \n    116, 105, 111, 110,  95, 115, \n     99,  97, 108, 101, 100,   0, \n    120, 101,  95, 115,  97, 109, \n    112, 108, 101,  95,  99, 111, \n    117, 110, 116,  95, 108, 111, \n    103,  50,   0, 120, 101,  95, \n     97, 108, 112, 104,  97,  95, \n    116, 101, 115, 116,  95, 114, \n    101, 102, 101, 114, 101, 110, \n     99, 101,   0, 120, 101,  95, \n     97, 108, 112, 104,  97,  95, \n    116, 111,  95, 109,  97, 115, \n    107,   0, 120, 101,  95, 101, \n    100, 114,  97, 109,  95,  51, \n     50,  98, 112, 112,  95, 116, \n    105, 108, 101,  95, 112, 105, \n    116,  99, 104,  95, 100, 119, \n    111, 114, 100, 115,  95, 115, \n     99,  97, 108, 101, 100,   0, \n    120, 101,  95, 101, 100, 114, \n     97, 109,  95, 100, 101, 112, \n    116, 104,  95,  98,  97, 115, \n    101,  95, 100, 119, 111, 114, \n    100, 115,  95, 115,  99,  97, \n    108, 101, 100,   0, 120, 101, \n     95,  99, 111, 108, 111, 114, \n     95, 101, 120, 112,  95,  98, \n    105,  97, 115,   0,   1,   0, \n      3,   0,   1,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     92,   6,   0,   0, 120, 101, \n     95, 101, 100, 114,  97, 109, \n     95, 112, 111, 108, 121,  95, \n    111, 102, 102, 115, 101, 116, \n     95, 102, 114, 111, 110, 116, \n      0, 120, 101,  95, 101, 100, \n    114,  97, 109,  95, 112, 111, \n    108, 121,  95, 111, 102, 102, \n    115, 101, 116,  95,  98,  97, \n     99, 107,   0, 120, 101,  95, \n    101, 100, 114,  97, 109,  95, \n    115, 116, 101, 110,  99, 105, \n    108,   0, 171, 171,   1,   0, \n     19,   0,   1,   0,   4,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    143,   7,   0,   0, 120, 101, \n     95, 101, 100, 114,  97, 109, \n     95, 114, 116,  95,  98,  97, \n    115, 101,  95, 100, 119, 111, \n    114, 100, 115,  95, 115,  99, \n     97, 108, 101, 100,   0, 171, \n      1,   0,  19,   0,   1,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 143,   7,   0,   0, \n    120, 101,  95, 101, 100, 114, \n     97, 109,  95, 114, 116,  95, \n    102, 111, 114, 109,  97, 116, \n     95, 102, 108,  97, 103, 115, \n      0, 120, 101,  95, 101, 100, \n    114,  97, 109,  95, 114, 116, \n     95,  99, 108,  97, 109, 112, \n      0, 171,   1,   0,   3,   0, \n      1,   0,   4,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  92,   6, \n      0,   0, 120, 101,  95, 101, \n    100, 114,  97, 109,  95, 114, \n    116,  95, 107, 101, 101, 112, \n     95, 109,  97, 115, 107,   0, \n    171, 171,   1,   0,  19,   0, \n      1,   0,   4,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 143,   7, \n      0,   0, 120, 101,  95, 101, \n    100, 114,  97, 109,  95, 114, \n    116,  95,  98, 108, 101, 110, \n    100,  95, 102,  97,  99, 116, \n    111, 114, 115,  95, 111, 112, \n    115,   0, 120, 101,  95, 101, \n    100, 114,  97, 109,  95,  98, \n    108, 101, 110, 100,  95,  99, \n    111, 110, 115, 116,  97, 110, \n    116,   0,  77, 105,  99, 114, \n    111, 115, 111, 102, 116,  32, \n     40,  82,  41,  32,  72,  76, \n     83,  76,  32,  83, 104,  97, \n    100, 101, 114,  32,  67, 111, \n    109, 112, 105, 108, 101, 114, \n     32,  49,  48,  46,  49,   0, \n    171, 171,  73,  83,  71,  78, \n     44,   0,   0,   0,   1,   0, \n      0,   0,   8,   0,   0,   0, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   1,   1,   0,   0, \n     83,  86,  95,  86, 101, 114, \n    116, 101, 120,  73,  68,   0, \n     79,  83,  71,  78,  48,   0, \n      0,   0,   1,   0,   0,   0, \n      8,   0,   0,   0,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  14,   0,   0,  88,  69, \n     84,  69,  83,  83,  70,  65, \n     67,  84,  79,  82,   0, 171, \n    171, 171,  83,  72,  69,  88, \n    252,   1,   0,   0,  81,   0, \n      1,   0, 127,   0,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,  96,   0,   0,   4, \n     18,  16,  16,   0,   0,   0, \n      0,   0,   6,   0,   0,   0, \n    101,   0,   0,   3,  18,  32, \n     16,   0,   0,   0,   0,   0, \n    104,   0,   0,   2,   1,   0, \n      0,   0,  32,   0,   0,  12, \n    114,   0,  16,   0,   0,   0, \n      0,   0,   6, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   2,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   0,   0, \n      0,   0, 150,   5,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     41,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,  16,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  85,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  10,  16, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n     82,   0,  16,   0,   0,   0, \n      0,   0,   6,   2,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0, 255,   0, 255, \n      0,   0,   0,   0, 255,   0, \n    255,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  18,   0, \n      0,   1,  54,   0,   0,   5, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,  16,  16,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n    140,   0,   0,  11,  18,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n      0,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0, 128,  63,  52,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  51,   0, \n      0,   9,  18,  32,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     42, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  62,   0, \n      0,   1,  83,  84,  65,  84, \n    148,   0,   0,   0,  18,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/tessellation_indexed_vs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer xe_system_cbuffer\n// {\n//\n//   uint xe_flags;                     // Offset:    0 Size:     4 [unused]\n//   float2 xe_tessellation_factor_range;// Offset:    4 Size:     8 [unused]\n//   uint xe_line_loop_closing_index;   // Offset:   12 Size:     4 [unused]\n//   uint xe_vertex_index_endian;       // Offset:   16 Size:     4\n//   uint xe_vertex_index_offset;       // Offset:   20 Size:     4\n//   uint2 xe_vertex_index_min_max;     // Offset:   24 Size:     8\n//   float4 xe_user_clip_planes[6];     // Offset:   32 Size:    96 [unused]\n//   float3 xe_ndc_scale;               // Offset:  128 Size:    12 [unused]\n//   float xe_point_vertex_diameter_min;// Offset:  140 Size:     4 [unused]\n//   float3 xe_ndc_offset;              // Offset:  144 Size:    12 [unused]\n//   float xe_point_vertex_diameter_max;// Offset:  156 Size:     4 [unused]\n//   float2 xe_point_constant_diameter; // Offset:  160 Size:     8 [unused]\n//   float2 xe_point_screen_diameter_to_ndc_radius;// Offset:  168 Size:     8 [unused]\n//   uint4 xe_texture_swizzled_signs[2];// Offset:  176 Size:    32 [unused]\n//   uint xe_textures_resolution_scaled;// Offset:  208 Size:     4 [unused]\n//   uint2 xe_sample_count_log2;        // Offset:  212 Size:     8 [unused]\n//   float xe_alpha_test_reference;     // Offset:  220 Size:     4 [unused]\n//   uint xe_alpha_to_mask;             // Offset:  224 Size:     4 [unused]\n//   uint xe_edram_32bpp_tile_pitch_dwords_scaled;// Offset:  228 Size:     4 [unused]\n//   uint xe_edram_depth_base_dwords_scaled;// Offset:  232 Size:     4 [unused]\n//   float4 xe_color_exp_bias;          // Offset:  240 Size:    16 [unused]\n//   float2 xe_edram_poly_offset_front; // Offset:  256 Size:     8 [unused]\n//   float2 xe_edram_poly_offset_back;  // Offset:  264 Size:     8 [unused]\n//   uint4 xe_edram_stencil[2];         // Offset:  272 Size:    32 [unused]\n//   uint4 xe_edram_rt_base_dwords_scaled;// Offset:  304 Size:    16 [unused]\n//   uint4 xe_edram_rt_format_flags;    // Offset:  320 Size:    16 [unused]\n//   float4 xe_edram_rt_clamp[4];       // Offset:  336 Size:    64 [unused]\n//   uint4 xe_edram_rt_keep_mask[2];    // Offset:  400 Size:    32 [unused]\n//   uint4 xe_edram_rt_blend_factors_ops;// Offset:  432 Size:    16 [unused]\n//   float4 xe_edram_blend_constant;    // Offset:  448 Size:    16 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_system_cbuffer                 cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// SV_VertexID              0   x           0   VERTID    uint   x   \n//\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// XEVERTEXID               0   x           0     NONE   float   x   \n//\nvs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][2], immediateIndexed, space=0\ndcl_input_sgv v0.x, vertex_id\ndcl_output o0.x\ndcl_temps 1\nieq r0.xyz, CB0[0][1].xxxx, l(1, 2, 3, 0)\nor r0.xy, r0.yzyy, r0.xyxx\nif_nz r0.x\n  ishl r0.x, v0.x, l(8)\n  ushr r0.z, v0.x, l(8)\n  and r0.xz, r0.xxzx, l(0xff00ff00, 0, 0x00ff00ff, 0)\n  iadd r0.x, r0.z, r0.x\nelse \n  mov r0.x, v0.x\nendif \nif_nz r0.y\n  ushr r0.y, r0.x, l(16)\n  bfi r0.x, l(16), l(16), r0.x, r0.y\nendif \niadd r0.x, r0.x, CB0[0][1].y\nand r0.x, r0.x, l(0x00ffffff)\numax r0.x, r0.x, CB0[0][1].z\numin r0.x, r0.x, CB0[0][1].w\nutof o0.x, r0.x\nret \n// Approximately 20 instruction slots used\n#endif\n\nconst BYTE tessellation_indexed_vs[] =\n{\n     68,  88,  66,  67, 141, 104, \n    237, 168, 205, 100,  22, 191, \n    159,  23, 183,  42,  54,  72, \n     27, 224,   1,   0,   0,   0, \n    176,  13,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n    112,  10,   0,   0, 164,  10, \n      0,   0, 216,  10,   0,   0, \n     20,  13,   0,   0,  82,  68, \n     69,  70,  52,  10,   0,   0, \n      1,   0,   0,   0, 120,   0, \n      0,   0,   1,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n    254, 255,   0,   5,   0,   0, \n     10,  10,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    100,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 120, 101, \n     95, 115, 121, 115, 116, 101, \n    109,  95,  99,  98, 117, 102, \n    102, 101, 114,   0, 171, 171, \n    100,   0,   0,   0,  30,   0, \n      0,   0, 144,   0,   0,   0, \n    208,   1,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     64,   5,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,  80,   5, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 116,   5, \n      0,   0,   4,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0, 152,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 188,   5,   0,   0, \n     12,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n     80,   5,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    215,   5,   0,   0,  16,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0,  80,   5, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 238,   5, \n      0,   0,  20,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0,  80,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,   5,   6,   0,   0, \n     24,   0,   0,   0,   8,   0, \n      0,   0,   2,   0,   0,   0, \n     36,   6,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     72,   6,   0,   0,  32,   0, \n      0,   0,  96,   0,   0,   0, \n      0,   0,   0,   0, 100,   6, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 136,   6, \n      0,   0, 128,   0,   0,   0, \n     12,   0,   0,   0,   0,   0, \n      0,   0, 156,   6,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 192,   6,   0,   0, \n    140,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n    228,   6,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n      8,   7,   0,   0, 144,   0, \n      0,   0,  12,   0,   0,   0, \n      0,   0,   0,   0, 156,   6, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  22,   7, \n      0,   0, 156,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0, 228,   6,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  51,   7,   0,   0, \n    160,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n    152,   5,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     78,   7,   0,   0, 168,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0, 152,   5, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 117,   7, \n      0,   0, 176,   0,   0,   0, \n     32,   0,   0,   0,   0,   0, \n      0,   0, 152,   7,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 188,   7,   0,   0, \n    208,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n     80,   5,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    218,   7,   0,   0, 212,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  36,   6, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 239,   7, \n      0,   0, 220,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0, 228,   6,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,   7,   8,   0,   0, \n    224,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n     80,   5,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     24,   8,   0,   0, 228,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,  80,   5, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  64,   8, \n      0,   0, 232,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,  80,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  98,   8,   0,   0, \n    240,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n    116,   8,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    152,   8,   0,   0,   0,   1, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0, 152,   5, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 179,   8, \n      0,   0,   8,   1,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0, 152,   5,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 205,   8,   0,   0, \n     16,   1,   0,   0,  32,   0, \n      0,   0,   0,   0,   0,   0, \n    224,   8,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n      4,   9,   0,   0,  48,   1, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  36,   9, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  72,   9, \n      0,   0,  64,   1,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  36,   9,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  97,   9,   0,   0, \n     80,   1,   0,   0,  64,   0, \n      0,   0,   0,   0,   0,   0, \n    116,   9,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    152,   9,   0,   0, 144,   1, \n      0,   0,  32,   0,   0,   0, \n      0,   0,   0,   0, 176,   9, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 212,   9, \n      0,   0, 176,   1,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  36,   9,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 242,   9,   0,   0, \n    192,   1,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n    116,   8,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    120, 101,  95, 102, 108,  97, \n    103, 115,   0, 100, 119, 111, \n    114, 100,   0, 171,   0,   0, \n     19,   0,   1,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     73,   5,   0,   0, 120, 101, \n     95, 116, 101, 115, 115, 101, \n    108, 108,  97, 116, 105, 111, \n    110,  95, 102,  97,  99, 116, \n    111, 114,  95, 114,  97, 110, \n    103, 101,   0, 102, 108, 111, \n     97, 116,  50,   0,   1,   0, \n      3,   0,   1,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    145,   5,   0,   0, 120, 101, \n     95, 108, 105, 110, 101,  95, \n    108, 111, 111, 112,  95,  99, \n    108, 111, 115, 105, 110, 103, \n     95, 105, 110, 100, 101, 120, \n      0, 120, 101,  95, 118, 101, \n    114, 116, 101, 120,  95, 105, \n    110, 100, 101, 120,  95, 101, \n    110, 100, 105,  97, 110,   0, \n    120, 101,  95, 118, 101, 114, \n    116, 101, 120,  95, 105, 110, \n    100, 101, 120,  95, 111, 102, \n    102, 115, 101, 116,   0, 120, \n    101,  95, 118, 101, 114, 116, \n    101, 120,  95, 105, 110, 100, \n    101, 120,  95, 109, 105, 110, \n     95, 109,  97, 120,   0, 117, \n    105, 110, 116,  50,   0, 171, \n      1,   0,  19,   0,   1,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  29,   6,   0,   0, \n    120, 101,  95, 117, 115, 101, \n    114,  95,  99, 108, 105, 112, \n     95, 112, 108,  97, 110, 101, \n    115,   0, 102, 108, 111,  97, \n    116,  52,   0, 171,   1,   0, \n      3,   0,   1,   0,   4,   0, \n      6,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     92,   6,   0,   0, 120, 101, \n     95, 110, 100,  99,  95, 115, \n     99,  97, 108, 101,   0, 102, \n    108, 111,  97, 116,  51,   0, \n      1,   0,   3,   0,   1,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 149,   6,   0,   0, \n    120, 101,  95, 112, 111, 105, \n    110, 116,  95, 118, 101, 114, \n    116, 101, 120,  95, 100, 105, \n     97, 109, 101, 116, 101, 114, \n     95, 109, 105, 110,   0, 102, \n    108, 111,  97, 116,   0, 171, \n      0,   0,   3,   0,   1,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 221,   6,   0,   0, \n    120, 101,  95, 110, 100,  99, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 112, \n    111, 105, 110, 116,  95, 118, \n    101, 114, 116, 101, 120,  95, \n    100, 105,  97, 109, 101, 116, \n    101, 114,  95, 109,  97, 120, \n      0, 120, 101,  95, 112, 111, \n    105, 110, 116,  95,  99, 111, \n    110, 115, 116,  97, 110, 116, \n     95, 100, 105,  97, 109, 101, \n    116, 101, 114,   0, 120, 101, \n     95, 112, 111, 105, 110, 116, \n     95, 115,  99, 114, 101, 101, \n    110,  95, 100, 105,  97, 109, \n    101, 116, 101, 114,  95, 116, \n    111,  95, 110, 100,  99,  95, \n    114,  97, 100, 105, 117, 115, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    115, 119, 105, 122, 122, 108, \n    101, 100,  95, 115, 105, 103, \n    110, 115,   0, 117, 105, 110, \n    116,  52,   0, 171, 171, 171, \n      1,   0,  19,   0,   1,   0, \n      4,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 143,   7,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101, 115,  95, \n    114, 101, 115, 111, 108, 117, \n    116, 105, 111, 110,  95, 115, \n     99,  97, 108, 101, 100,   0, \n    120, 101,  95, 115,  97, 109, \n    112, 108, 101,  95,  99, 111, \n    117, 110, 116,  95, 108, 111, \n    103,  50,   0, 120, 101,  95, \n     97, 108, 112, 104,  97,  95, \n    116, 101, 115, 116,  95, 114, \n    101, 102, 101, 114, 101, 110, \n     99, 101,   0, 120, 101,  95, \n     97, 108, 112, 104,  97,  95, \n    116, 111,  95, 109,  97, 115, \n    107,   0, 120, 101,  95, 101, \n    100, 114,  97, 109,  95,  51, \n     50,  98, 112, 112,  95, 116, \n    105, 108, 101,  95, 112, 105, \n    116,  99, 104,  95, 100, 119, \n    111, 114, 100, 115,  95, 115, \n     99,  97, 108, 101, 100,   0, \n    120, 101,  95, 101, 100, 114, \n     97, 109,  95, 100, 101, 112, \n    116, 104,  95,  98,  97, 115, \n    101,  95, 100, 119, 111, 114, \n    100, 115,  95, 115,  99,  97, \n    108, 101, 100,   0, 120, 101, \n     95,  99, 111, 108, 111, 114, \n     95, 101, 120, 112,  95,  98, \n    105,  97, 115,   0,   1,   0, \n      3,   0,   1,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     92,   6,   0,   0, 120, 101, \n     95, 101, 100, 114,  97, 109, \n     95, 112, 111, 108, 121,  95, \n    111, 102, 102, 115, 101, 116, \n     95, 102, 114, 111, 110, 116, \n      0, 120, 101,  95, 101, 100, \n    114,  97, 109,  95, 112, 111, \n    108, 121,  95, 111, 102, 102, \n    115, 101, 116,  95,  98,  97, \n     99, 107,   0, 120, 101,  95, \n    101, 100, 114,  97, 109,  95, \n    115, 116, 101, 110,  99, 105, \n    108,   0, 171, 171,   1,   0, \n     19,   0,   1,   0,   4,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    143,   7,   0,   0, 120, 101, \n     95, 101, 100, 114,  97, 109, \n     95, 114, 116,  95,  98,  97, \n    115, 101,  95, 100, 119, 111, \n    114, 100, 115,  95, 115,  99, \n     97, 108, 101, 100,   0, 171, \n      1,   0,  19,   0,   1,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 143,   7,   0,   0, \n    120, 101,  95, 101, 100, 114, \n     97, 109,  95, 114, 116,  95, \n    102, 111, 114, 109,  97, 116, \n     95, 102, 108,  97, 103, 115, \n      0, 120, 101,  95, 101, 100, \n    114,  97, 109,  95, 114, 116, \n     95,  99, 108,  97, 109, 112, \n      0, 171,   1,   0,   3,   0, \n      1,   0,   4,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  92,   6, \n      0,   0, 120, 101,  95, 101, \n    100, 114,  97, 109,  95, 114, \n    116,  95, 107, 101, 101, 112, \n     95, 109,  97, 115, 107,   0, \n    171, 171,   1,   0,  19,   0, \n      1,   0,   4,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 143,   7, \n      0,   0, 120, 101,  95, 101, \n    100, 114,  97, 109,  95, 114, \n    116,  95,  98, 108, 101, 110, \n    100,  95, 102,  97,  99, 116, \n    111, 114, 115,  95, 111, 112, \n    115,   0, 120, 101,  95, 101, \n    100, 114,  97, 109,  95,  98, \n    108, 101, 110, 100,  95,  99, \n    111, 110, 115, 116,  97, 110, \n    116,   0,  77, 105,  99, 114, \n    111, 115, 111, 102, 116,  32, \n     40,  82,  41,  32,  72,  76, \n     83,  76,  32,  83, 104,  97, \n    100, 101, 114,  32,  67, 111, \n    109, 112, 105, 108, 101, 114, \n     32,  49,  48,  46,  49,   0, \n    171, 171,  73,  83,  71,  78, \n     44,   0,   0,   0,   1,   0, \n      0,   0,   8,   0,   0,   0, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   1,   1,   0,   0, \n     83,  86,  95,  86, 101, 114, \n    116, 101, 120,  73,  68,   0, \n     79,  83,  71,  78,  44,   0, \n      0,   0,   1,   0,   0,   0, \n      8,   0,   0,   0,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  14,   0,   0,  88,  69, \n     86,  69,  82,  84,  69,  88, \n     73,  68,   0, 171,  83,  72, \n     69,  88,  52,   2,   0,   0, \n     81,   0,   1,   0, 141,   0, \n      0,   0, 106,   8,   0,   1, \n     89,   0,   0,   7,  70, 142, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,  96,   0, \n      0,   4,  18,  16,  16,   0, \n      0,   0,   0,   0,   6,   0, \n      0,   0, 101,   0,   0,   3, \n     18,  32,  16,   0,   0,   0, \n      0,   0, 104,   0,   0,   2, \n      1,   0,   0,   0,  32,   0, \n      0,  12, 114,   0,  16,   0, \n      0,   0,   0,   0,   6, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,  60,   0, \n      0,   7,  50,   0,  16,   0, \n      0,   0,   0,   0, 150,   5, \n     16,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  41,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,  16,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     85,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     10,  16,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10,  82,   0,  16,   0, \n      0,   0,   0,   0,   6,   2, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0,   0,   0,   0, \n    255,   0, 255,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     18,   0,   0,   1,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,  16, \n     16,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      0,   0,   0,   0,  85,   0, \n      0,   7,  34,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  30,   0,   0,   9, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0, 255, 255, 255,   0, \n     83,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  42, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     84,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  58, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     86,   0,   0,   5,  18,  32, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  62,   0,   0,   1, \n     83,  84,  65,  84, 148,   0, \n      0,   0,  20,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   4,   0, \n      0,   0,   7,   0,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_128bpb_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 5\ndcl_thread_group 4, 32, 1\nand r0.xy, CB0[0][0].xxxx, l(1, 2, 0, 0)\nishl r1.x, vThreadID.x, l(1)\nmov r1.y, vThreadID.y\nuge r0.zw, r1.xxxy, CB0[0][1].xxxy\nor r0.z, r0.w, r0.z\nif_nz r0.z\n  ret \nendif \nubfe r0.z, l(2), l(2), CB0[0][0].x\nishl r0.w, r1.x, l(4)\nimad r1.y, vThreadID.z, CB0[0][1].y, vThreadID.y\nimad r0.w, r1.y, CB0[0][2].x, r0.w\niadd r0.w, r0.w, CB0[0][1].w\nif_z r0.x\n  imad r1.y, CB0[0][0].w, vThreadID.z, vThreadID.y\n  imad r1.y, CB0[0][0].z, r1.y, r1.x\n  ishl r1.y, r1.y, l(4)\nelse \n  if_nz r0.y\n    ushr r1.zw, CB0[0][0].zzzw, l(0, 0, 5, 4)\n    ishr r2.xyzw, vThreadID.zyyy, l(2, 4, 1, 3)\n    imad r0.y, r2.x, r1.w, r2.y\n    ibfe r1.w, l(27), l(4), vThreadID.x\n    imad r0.y, r0.y, r1.z, r1.w\n    bfi r1.zw, l(0, 0, 2, 1), l(0, 0, 5, 4), vThreadID.zzzy, l(0, 0, 0, 0)\n    bfi r2.y, l(2), l(3), r2.z, l(0)\n    iadd r1.z, r1.z, r2.y\n    bfi r1.z, l(3), l(0), r1.x, r1.z\n    bfi r0.y, l(25), l(7), r0.y, r1.z\n    xor r1.z, r2.x, r2.w\n    ubfe r2.x, l(2), l(3), r1.x\n    bfi r2.yz, l(0, 1, 1, 0), l(0, 1, 11, 0), r1.zzzz, l(0, 0, 0, 0)\n    xor r1.z, r2.y, r2.x\n    imad r1.z, r1.z, l(64), r1.w\n    iadd r1.z, r2.z, r1.z\n    ibfe r2.xy, l(27, 24, 0, 0), l(1, 4, 0, 0), r0.yyyy\n    bfi r0.y, l(3), l(8), r2.x, r1.z\n    bfi r1.y, l(20), l(12), r2.y, r0.y\n  else \n    ushr r0.y, CB0[0][0].z, l(5)\n    ishr r2.xyzw, vThreadID.yyyy, l(5, 1, 4, 3)\n    ibfe r1.z, l(27), l(4), vThreadID.x\n    imad r0.y, r2.x, r0.y, r1.z\n    bfi r2.xyz, l(3, 1, 1, 0), l(3, 1, 11, 0), r2.ywzy, l(0, 0, 0, 0)\n    bfi r1.z, l(3), l(0), r1.x, r2.x\n    bfi r0.y, l(26), l(6), r0.y, r1.z\n    ubfe r1.x, l(2), l(3), r1.x\n    xor r1.x, r2.y, r1.x\n    bfi r1.z, l(1), l(4), vThreadID.y, l(0)\n    imad r1.x, r1.x, l(64), r1.z\n    iadd r1.x, r2.z, r1.x\n    ibfe r1.zw, l(0, 0, 27, 24), l(0, 0, 1, 4), r0.yyyy\n    bfi r0.y, l(3), l(8), r1.z, r1.x\n    bfi r1.y, l(20), l(12), r1.w, r0.y\n  endif \nendif \niadd r0.y, r1.y, CB0[0][0].y\nld_raw r1.xyzw, r0.y, T0[0].xyzw\nieq r2.xyz, r0.zzzz, l(1, 2, 3, 0)\nor r2.xy, r2.yzyy, r2.xyxx\nif_nz r2.x\n  ishl r3.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r1.xyzw, r3.xyzw, r4.xyzw\nendif \nif_nz r2.y\n  ushr r3.xyzw, r1.xyzw, l(16, 16, 16, 16)\n  bfi r1.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r1.xyzw, r3.xyzw\nendif \nstore_raw U0[0].xyzw, r0.w, r1.xyzw\niadd r0.z, r0.w, l(16)\nif_nz r0.x\n  mov r0.x, l(32)\nelse \n  mov r0.x, l(16)\nendif \niadd r0.x, r0.x, r0.y\nld_raw r1.xyzw, r0.x, T0[0].xyzw\nif_nz r2.x\n  ishl r3.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r1.xyzw, r3.xyzw, r4.xyzw\nendif \nif_nz r2.y\n  ushr r2.xyzw, r1.xyzw, l(16, 16, 16, 16)\n  bfi r1.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r1.xyzw, r2.xyzw\nendif \nstore_raw U0[0].xyzw, r0.z, r1.xyzw\nret \n// Approximately 93 instruction slots used\n#endif\n\nconst BYTE texture_load_128bpb_cs[] =\n{\n     68,  88,  66,  67, 176, 166, \n    251,  26, 242, 118, 231,  94, \n    215,  28, 191,  41, 126,  64, \n    112,  80,   1,   0,   0,   0, \n    212,  16,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n     56,  16,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n    252,  11,   0,   0,  81,   0, \n      5,   0, 255,   2,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   5,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  12,  50,   0,  16,   0, \n      0,   0,   0,   0,   6, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n    194,   0,  16,   0,   0,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0,   6, 132, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  11, \n     66,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,   2,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,  11, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  31,   0, \n      0,   3,  10,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  58, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  42,   0,   2,   0, \n     26,   0,   2,   0,  35,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     41,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  18,   0, \n      0,   1,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,  12, \n    194,   0,  16,   0,   1,   0, \n      0,   0, 166, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0,  42,   0,   0,   9, \n    242,   0,  16,   0,   2,   0, \n      0,   0, 102,   5,   2,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      1,   0,   0,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 139,   0,   0,   8, \n    130,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     27,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     10,   0,   2,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  19, 194,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0, 166,   6,   2,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 140,   0,   0,  11, \n     66,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  25,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     87,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0, 138,   0, \n      0,   9,  18,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  20,  98,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0, 166,  10,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  64,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0, 139,   0,   0,  15, \n     50,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     27,   0,   0,   0,  24,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     18,   0,   0,   1,  85,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  42,   0, \n      0,   9, 242,   0,  16,   0, \n      2,   0,   0,   0,  86,   5, \n      2,   0,   2,  64,   0,   0, \n      5,   0,   0,   0,   1,   0, \n      0,   0,   4,   0,   0,   0, \n      3,   0,   0,   0, 139,   0, \n      0,   8,  66,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  27,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  10,   0,   2,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  20, 114,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0, 214,   6, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     66,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  26,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    138,   0,   0,   9,  18,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     87,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  10,  66,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  26,   0,   2,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  64,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    139,   0,   0,  15, 194,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     27,   0,   0,   0,  24,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      4,   0,   0,   0,  86,   5, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  21,   0,   0,   1, \n     30,   0,   0,   9,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  26, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  32,   0,   0,  10, \n    114,   0,  16,   0,   2,   0, \n      0,   0, 166,  10,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      2,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,   2,   0,   0,   0, \n    150,   5,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,  31,   0, \n      4,   3,  10,   0,  16,   0, \n      2,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      2,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  21,   0, \n      0,   1, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     32,   0,   0,   0,  18,   0, \n      0,   1,  54,   0,   0,   5, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0,  21,   0, \n      0,   1,  30,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  21,   0,   0,   1, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  62,   0,   0,   1, \n     83,  84,  65,  84, 148,   0, \n      0,   0,  93,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  26,   0, \n      0,   0,  17,   0,   0,   0, \n      5,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_128bpb_scaled_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 5\ndcl_thread_group 4, 32, 1\nand r0.x, CB0[0][0].x, l(2)\nishl r1.x, vThreadID.x, l(1)\nmov r1.y, vThreadID.y\nuge r0.yz, r1.xxyx, CB0[0][1].xxyx\nor r0.y, r0.z, r0.y\nif_nz r0.y\n  ret \nendif \nubfe r0.yzw, l(0, 2, 3, 3), l(0, 2, 4, 7), CB0[0][0].xxxx\nishl r1.z, r1.x, l(4)\nimad r1.w, vThreadID.z, CB0[0][1].y, vThreadID.y\nimad r1.z, r1.w, CB0[0][2].x, r1.z\niadd r1.z, r1.z, CB0[0][1].w\nushr r1.xy, r1.xyxx, l(1, 1, 0, 0)\nudiv r2.xy, null, r1.xyxx, r0.zwzz\nimad r1.xy, -r0.zwzz, r2.xyxx, r1.xyxx\nishl r1.w, r2.x, l(1)\nimad r1.x, r1.x, r0.w, r1.y\nbfi r1.y, l(1), l(5), vThreadID.y, l(0)\nbfi r1.x, l(26), l(6), r1.x, r1.y\nif_nz r0.x\n  ushr r2.zw, CB0[0][0].zzzw, l(0, 0, 5, 4)\n  ishr r0.x, vThreadID.z, l(2)\n  ibfe r3.xyzw, l(28, 27, 31, 29), l(3, 4, 0, 2), r2.yxyy\n  imad r1.y, r0.x, r2.w, r3.x\n  imad r1.y, r1.y, r2.z, r3.y\n  bfi r2.z, l(2), l(5), vThreadID.z, l(0)\n  bfi r2.w, l(2), l(3), r3.z, l(0)\n  iadd r2.z, r2.z, r2.w\n  bfi r2.z, l(3), l(0), r1.w, r2.z\n  bfi r1.y, l(25), l(7), r1.y, r2.z\n  xor r0.x, r0.x, r3.w\n  ibfe r2.z, l(29), l(2), r2.x\n  and r2.z, r2.z, l(3)\n  bfi r3.xy, l(1, 1, 0, 0), l(1, 11, 0, 0), r0.xxxx, l(0, 0, 0, 0)\n  xor r0.x, r2.z, r3.x\n  ishl r0.x, r0.x, l(6)\n  iadd r0.x, r3.y, r0.x\n  ibfe r2.zw, l(0, 0, 27, 24), l(0, 0, 1, 4), r1.yyyy\n  bfi r0.x, l(3), l(8), r2.z, r0.x\n  bfi r0.x, l(20), l(12), r2.w, r0.x\nelse \n  ushr r1.y, CB0[0][0].z, l(5)\n  ibfe r3.xyzw, l(27, 27, 31, 28), l(4, 4, 0, 3), r2.yxyy\n  imad r1.y, r3.x, r1.y, r3.y\n  bfi r2.zw, l(0, 0, 3, 1), l(0, 0, 3, 11), r3.zzzw, l(0, 0, 0, 0)\n  bfi r1.w, l(3), l(0), r1.w, r2.z\n  bfi r1.y, l(26), l(6), r1.y, r1.w\n  ibfe r2.xy, l(29, 29, 0, 0), l(2, 2, 0, 0), r2.xyxx\n  and r1.w, r2.x, l(3)\n  bfi r2.x, l(1), l(1), r2.y, l(0)\n  xor r1.w, r1.w, r2.x\n  ishl r1.w, r1.w, l(6)\n  iadd r1.w, r2.w, r1.w\n  ibfe r2.xy, l(27, 24, 0, 0), l(1, 4, 0, 0), r1.yyyy\n  bfi r1.y, l(3), l(8), r2.x, r1.w\n  bfi r0.x, l(20), l(12), r2.y, r1.y\nendif \nimul null, r0.z, r0.w, r0.z\nimad r0.x, r0.x, r0.z, r1.x\niadd r0.x, r0.x, CB0[0][0].y\nld_raw r2.xyzw, r0.x, T0[0].xyzw\nieq r0.yzw, r0.yyyy, l(0, 1, 2, 3)\nor r0.yz, r0.zzwz, r0.yyzy\nif_nz r0.y\n  ishl r3.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r2.xyzw, r3.xyzw, r4.xyzw\nendif \nif_nz r0.z\n  ushr r3.xyzw, r2.xyzw, l(16, 16, 16, 16)\n  bfi r2.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r2.xyzw, r3.xyzw\nendif \nstore_raw U0[0].xyzw, r1.z, r2.xyzw\niadd r0.w, r1.z, l(16)\niadd r0.x, r0.x, l(16)\nld_raw r2.xyzw, r0.x, T0[0].xyzw\nif_nz r0.y\n  ishl r3.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r2.xyzw, r3.xyzw, r4.xyzw\nendif \nif_nz r0.z\n  ushr r3.xyzw, r2.xyzw, l(16, 16, 16, 16)\n  bfi r2.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r2.xyzw, r3.xyzw\nendif \nstore_raw U0[0].xyzw, r0.w, r2.xyzw\nret \n// Approximately 92 instruction slots used\n#endif\n\nconst BYTE texture_load_128bpb_scaled_cs[] =\n{\n     68,  88,  66,  67,   2, 231, \n     11, 163, 194,  55, 125, 162, \n    152,  23,  13,  31, 249,   7, \n     19, 167,   1,   0,   0,   0, \n    148,  17,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n    248,  16,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n    188,  12,   0,   0,  81,   0, \n      5,   0,  47,   3,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   5,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n     98,   0,  16,   0,   0,   0, \n      0,   0,   6,   1,  16,   0, \n      1,   0,   0,   0,   6, 129, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  17, \n    226,   0,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   7,   0,   0,   0, \n      6, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  35,   0,   0,   9, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,   2,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,  11, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   9,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  78,   0,   0,   8, \n     50,   0,  16,   0,   2,   0, \n      0,   0,   0, 208,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0, 230,  10,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,  10,  50,   0,  16,   0, \n      1,   0,   0,   0, 230,  10, \n     16, 128,  65,   0,   0,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  41,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  10,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  26,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  26,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     85,   0,   0,  12, 194,   0, \n     16,   0,   2,   0,   0,   0, \n    166, 142,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   5,   0, \n      0,   0,   4,   0,   0,   0, \n     42,   0,   0,   6,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,   2,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n    139,   0,   0,  15, 242,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,  28,   0, \n      0,   0,  27,   0,   0,   0, \n     31,   0,   0,   0,  29,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,  22,   5, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   3,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n    140,   0,   0,  10,  66,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  42,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11, 130,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  11,  66,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  25,   0, \n      0,   0,   1,  64,   0,   0, \n      7,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  87,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n    139,   0,   0,   9,  66,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,  29,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n      1,   0,   0,   7,  66,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0, 140,   0, \n      0,  20,  50,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   6,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      3,   0,   0,   0,  41,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n    139,   0,   0,  15, 194,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     27,   0,   0,   0,  24,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      4,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  18,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  18,   0, \n      0,   1,  85,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  42, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0, 139,   0,   0,  15, \n    242,   0,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n     27,   0,   0,   0,  27,   0, \n      0,   0,  31,   0,   0,   0, \n     28,   0,   0,   0,   2,  64, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n     22,   5,  16,   0,   2,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0, 140,   0,   0,  20, \n    194,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,  11,   0,   0,   0, \n    166,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11, 130,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  26,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0, 139,   0,   0,  15, \n     50,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     29,   0,   0,   0,  29,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   2,   0, \n      0,   0,   1,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n    140,   0,   0,  11,  18,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     41,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  30,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0, 139,   0,   0,  15, \n     50,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     27,   0,   0,   0,  24,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     21,   0,   0,   1,  38,   0, \n      0,   8,   0, 208,   0,   0, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  26, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  32,   0,   0,  10, \n    226,   0,  16,   0,   0,   0, \n      0,   0,  86,   5,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   7,  98,   0, \n     16,   0,   0,   0,   0,   0, \n    166,  11,  16,   0,   0,   0, \n      0,   0,  86,   6,  16,   0, \n      0,   0,   0,   0,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  21,   0, \n      0,   1, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  30,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  21,   0,   0,   1, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  62,   0,   0,   1, \n     83,  84,  65,  84, 148,   0, \n      0,   0,  92,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  27,   0, \n      0,   0,  21,   0,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_16bpb_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 5\ndcl_thread_group 4, 32, 1\nand r0.xy, CB0[0][0].xxxx, l(1, 2, 0, 0)\nishl r1.x, vThreadID.x, l(4)\nmov r1.y, vThreadID.y\nuge r0.zw, r1.xxxy, CB0[0][1].xxxy\nor r0.z, r0.w, r0.z\nif_nz r0.z\n  ret \nendif \nubfe r0.z, l(2), l(2), CB0[0][0].x\nishl r0.w, r1.x, l(1)\nimad r1.y, vThreadID.z, CB0[0][1].y, vThreadID.y\nimad r0.w, r1.y, CB0[0][2].x, r0.w\niadd r0.w, r0.w, CB0[0][1].w\nif_z r0.x\n  imad r1.y, CB0[0][0].w, vThreadID.z, vThreadID.y\n  imad r1.y, CB0[0][0].z, r1.y, r1.x\n  ishl r1.y, r1.y, l(1)\nelse \n  if_nz r0.y\n    ushr r1.zw, CB0[0][0].zzzw, l(0, 0, 5, 4)\n    ishr r2.xyzw, vThreadID.zyyy, l(2, 4, 1, 3)\n    imad r0.y, r2.x, r1.w, r2.y\n    ibfe r1.w, l(27), l(1), vThreadID.x\n    imad r0.y, r0.y, r1.z, r1.w\n    bfi r1.zw, l(0, 0, 2, 1), l(0, 0, 5, 4), vThreadID.zzzy, l(0, 0, 0, 0)\n    bfi r2.y, l(2), l(3), r2.z, l(0)\n    iadd r1.z, r1.z, r2.y\n    bfi r0.y, l(25), l(7), r0.y, r1.z\n    xor r1.z, r2.x, r2.w\n    ishr r2.x, r1.x, l(3)\n    and r2.x, r2.x, l(2)\n    bfi r2.yz, l(0, 1, 1, 0), l(0, 1, 11, 0), r1.zzzz, l(0, 0, 0, 0)\n    xor r1.z, r2.y, r2.x\n    ishl r1.z, r1.z, l(6)\n    iadd r1.z, r1.z, r1.w\n    iadd r1.z, r2.z, r1.z\n    ibfe r2.xyz, l(28, 27, 24, 0), l(3, 4, 7, 0), r0.yyyy\n    bfi r0.y, l(1), l(5), r2.x, r1.z\n    bfi r0.y, l(3), l(8), r2.y, r0.y\n    bfi r1.y, l(20), l(12), r2.z, r0.y\n  else \n    ushr r0.y, CB0[0][0].z, l(5)\n    ishr r2.xyzw, vThreadID.yyyy, l(5, 1, 4, 3)\n    ibfe r1.z, l(27), l(1), vThreadID.x\n    imad r0.y, r2.x, r0.y, r1.z\n    bfi r2.xyz, l(3, 1, 1, 0), l(3, 1, 11, 0), r2.ywzy, l(0, 0, 0, 0)\n    bfi r0.y, l(26), l(6), r0.y, r2.x\n    ishr r1.x, r1.x, l(3)\n    and r1.x, r1.x, l(2)\n    xor r1.x, r2.y, r1.x\n    bfi r1.z, l(1), l(4), vThreadID.y, l(0)\n    ishl r1.x, r1.x, l(6)\n    iadd r1.x, r1.x, r1.z\n    iadd r1.x, r2.z, r1.x\n    ibfe r2.xyz, l(28, 27, 24, 0), l(3, 4, 7, 0), r0.yyyy\n    bfi r0.y, l(1), l(5), r2.x, r1.x\n    bfi r0.y, l(3), l(8), r2.y, r0.y\n    bfi r1.y, l(20), l(12), r2.z, r0.y\n  endif \nendif \niadd r0.y, r1.y, CB0[0][0].y\nld_raw r1.xyzw, r0.y, T0[0].xyzw\nieq r0.z, r0.z, l(1)\nif_nz r0.z\n  ishl r2.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r2.xyzw, r2.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r3.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r1.xyzw, r2.xyzw, r3.xyzw\nendif \nstore_raw U0[0].xyzw, r0.w, r1.xyzw\niadd r1.x, r0.w, l(16)\nif_nz r0.x\n  mov r0.x, l(64)\nelse \n  mov r0.x, l(16)\nendif \niadd r0.x, r0.x, r0.y\nld_raw r2.xyzw, r0.x, T0[0].xyzw\nif_nz r0.z\n  ishl r3.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r2.xyzw, r3.xyzw, r4.xyzw\nendif \nstore_raw U0[0].xyzw, r1.x, r2.xyzw\nret \n// Approximately 88 instruction slots used\n#endif\n\nconst BYTE texture_load_16bpb_cs[] =\n{\n     68,  88,  66,  67, 101,  42, \n    179, 197, 177, 205, 107, 197, \n    190,  13, 119, 152,  72,   9, \n    158, 102,   1,   0,   0,   0, \n      4,  16,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n    104,  15,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n     44,  11,   0,   0,  81,   0, \n      5,   0, 203,   2,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   5,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  12,  50,   0,  16,   0, \n      0,   0,   0,   0,   6, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n    194,   0,  16,   0,   0,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0,   6, 132, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  11, \n     66,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,   2,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,  11, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  31,   0, \n      0,   3,  10,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  58, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  42,   0,   2,   0, \n     26,   0,   2,   0,  35,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     41,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  18,   0, \n      0,   1,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,  12, \n    194,   0,  16,   0,   1,   0, \n      0,   0, 166, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0,  42,   0,   0,   9, \n    242,   0,  16,   0,   2,   0, \n      0,   0, 102,   5,   2,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      1,   0,   0,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 139,   0,   0,   8, \n    130,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     27,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     10,   0,   2,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  19, 194,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0, 166,   6,   2,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     25,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  87,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,   0,   7, \n     18,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   7,  18,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  20,  98,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0, 166,  10,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  30,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 139,   0, \n      0,  15, 114,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  28,   0,   0,   0, \n     27,   0,   0,   0,  24,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   4,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  86,   5,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  18,   0, \n      0,   1,  85,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  42,   0,   0,   9, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  86,   5,   2,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   1,   0,   0,   0, \n      4,   0,   0,   0,   3,   0, \n      0,   0, 139,   0,   0,   8, \n     66,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     27,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     10,   0,   2,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  20, 114,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0, 214,   6,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  26,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  87,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  10, \n     66,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     26,   0,   2,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     41,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    139,   0,   0,  15, 114,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  28,   0, \n      0,   0,  27,   0,   0,   0, \n     24,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   4,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  21,   0, \n      0,   1,  30,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  32,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  31,   0,   4,   3, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  21,   0, \n      0,   1, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     64,   0,   0,   0,  18,   0, \n      0,   1,  54,   0,   0,   5, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0,  21,   0, \n      0,   1,  30,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  21,   0, \n      0,   1, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  62,   0, \n      0,   1,  83,  84,  65,  84, \n    148,   0,   0,   0,  88,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   0,  16,   0, \n      0,   0,   5,   0,   0,   0, \n      6,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_16bpb_scaled_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 5\ndcl_thread_group 4, 32, 1\nand r0.x, CB0[0][0].x, l(2)\nishl r1.x, vThreadID.x, l(4)\nmov r1.y, vThreadID.y\nuge r0.yz, r1.xxyx, CB0[0][1].xxyx\nor r0.y, r0.z, r0.y\nif_nz r0.y\n  ret \nendif \nubfe r0.yzw, l(0, 2, 3, 3), l(0, 2, 4, 7), CB0[0][0].xxxx\nishl r1.z, r1.x, l(1)\nimad r1.w, vThreadID.z, CB0[0][1].y, vThreadID.y\nimad r1.z, r1.w, CB0[0][2].x, r1.z\niadd r1.z, r1.z, CB0[0][1].w\nushr r1.xy, r1.xyxx, l(4, 2, 0, 0)\nudiv r2.xyzw, null, r1.yxyy, r0.wzww\nimad r1.xy, -r0.zwzz, r2.ywyy, r1.xyxx\nishl r3.xy, r2.wyww, l(2, 4, 0, 0)\nimad r1.x, r1.x, r0.w, r1.y\nbfi r1.y, l(2), l(5), vThreadID.y, l(0)\nbfi r1.x, l(25), l(7), r1.x, r1.y\nif_nz r0.x\n  ushr r1.yw, CB0[0][0].zzzw, l(0, 5, 0, 4)\n  ishr r0.x, vThreadID.z, l(2)\n  ibfe r4.xyz, l(28, 27, 29, 0), l(2, 1, 1, 0), r2.wyww\n  imad r1.w, r0.x, r1.w, r4.x\n  imad r1.y, r1.w, r1.y, r4.y\n  bfi r1.w, l(2), l(5), vThreadID.z, l(0)\n  ishr r3.zw, r3.xxxy, l(0, 0, 1, 3)\n  bfi r3.z, l(2), l(3), r3.z, l(0)\n  iadd r1.w, r1.w, r3.z\n  bfi r1.y, l(25), l(7), r1.y, r1.w\n  xor r0.x, r0.x, r4.z\n  and r1.w, r3.w, l(2)\n  bfi r3.zw, l(0, 0, 1, 1), l(0, 0, 1, 11), r0.xxxx, l(0, 0, 0, 0)\n  xor r0.x, r1.w, r3.z\n  ishl r0.x, r0.x, l(6)\n  iadd r0.x, r3.w, r0.x\n  ibfe r1.yw, l(0, 27, 0, 24), l(0, 4, 0, 7), r1.yyyy\n  bfi r0.x, l(3), l(8), r1.y, r0.x\n  bfi r0.x, l(20), l(12), r1.w, r0.x\nelse \n  ushr r1.y, CB0[0][0].z, l(5)\n  ibfe r2.xyzw, l(27, 27, 28, 29), l(3, 1, 2, 1), r2.xyzw\n  imad r1.y, r2.x, r1.y, r2.y\n  ishr r2.xy, r3.xyxx, l(1, 3, 0, 0)\n  bfi r1.w, l(3), l(3), r2.x, l(0)\n  bfi r1.y, l(26), l(6), r1.y, r1.w\n  and r1.w, r2.y, l(2)\n  bfi r2.xy, l(1, 1, 0, 0), l(1, 11, 0, 0), r2.wzww, l(0, 0, 0, 0)\n  xor r1.w, r1.w, r2.x\n  ishl r1.w, r1.w, l(6)\n  iadd r1.w, r2.y, r1.w\n  ibfe r2.xy, l(27, 24, 0, 0), l(4, 7, 0, 0), r1.yyyy\n  bfi r1.y, l(3), l(8), r2.x, r1.w\n  bfi r0.x, l(20), l(12), r2.y, r1.y\nendif \nimul null, r0.z, r0.w, r0.z\nimad r0.x, r0.x, r0.z, r1.x\niadd r0.x, r0.x, CB0[0][0].y\nld_raw r2.xyzw, r0.x, T0[0].xyzw\nieq r0.y, r0.y, l(1)\nif_nz r0.y\n  ishl r3.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r2.xyzw, r3.xyzw, r4.xyzw\nendif \nstore_raw U0[0].xyzw, r1.z, r2.xyzw\niadd r0.z, r1.z, l(16)\niadd r0.x, r0.x, l(16)\nld_raw r2.xyzw, r0.x, T0[0].xyzw\nif_nz r0.y\n  ishl r3.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r2.xyzw, r3.xyzw, r4.xyzw\nendif \nstore_raw U0[0].xyzw, r0.z, r2.xyzw\nret \n// Approximately 81 instruction slots used\n#endif\n\nconst BYTE texture_load_16bpb_scaled_cs[] =\n{\n     68,  88,  66,  67, 136, 224, \n     56, 130,  25,  68, 100, 106, \n    119, 226, 220, 186, 163,  37, \n     86,  30,   1,   0,   0,   0, \n     24,  16,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n    124,  15,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n     64,  11,   0,   0,  81,   0, \n      5,   0, 208,   2,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   5,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n     98,   0,  16,   0,   0,   0, \n      0,   0,   6,   1,  16,   0, \n      1,   0,   0,   0,   6, 129, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  17, \n    226,   0,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   7,   0,   0,   0, \n      6, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  35,   0,   0,   9, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,   2,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,  11, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   9,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  78,   0,   0,   8, \n    242,   0,  16,   0,   2,   0, \n      0,   0,   0, 208,   0,   0, \n     22,   5,  16,   0,   1,   0, \n      0,   0, 182,  15,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,  10,  50,   0,  16,   0, \n      1,   0,   0,   0, 230,  10, \n     16, 128,  65,   0,   0,   0, \n      0,   0,   0,   0, 214,   5, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  41,   0,   0,  10, \n     50,   0,  16,   0,   3,   0, \n      0,   0, 118,  15,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  10,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  26,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  25,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     85,   0,   0,  12, 162,   0, \n     16,   0,   1,   0,   0,   0, \n    166, 142,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n     42,   0,   0,   6,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,   2,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n    139,   0,   0,  15, 114,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,  28,   0, \n      0,   0,  27,   0,   0,   0, \n     29,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0, 118,  15, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,   9, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n    140,   0,   0,  10, 130,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  42,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  42,   0, \n      0,  10, 194,   0,  16,   0, \n      3,   0,   0,   0,   6,   4, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   3,   0, \n      0,   0, 140,   0,   0,  11, \n     66,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     25,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  87,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   4,   0, \n      0,   0,   1,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n    140,   0,   0,  20, 194,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     11,   0,   0,   0,   6,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n     41,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0, 139,   0,   0,  15, \n    162,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  27,   0, \n      0,   0,   0,   0,   0,   0, \n     24,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,   7,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     18,   0,   0,   1,  85,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0, 139,   0, \n      0,  15, 242,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  27,   0,   0,   0, \n     27,   0,   0,   0,  28,   0, \n      0,   0,  29,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n      0,  10,  50,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n    130,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  26,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n      1,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  20,  50,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 182,  15,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  30,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n    139,   0,   0,  15,  50,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  27,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  21,   0, \n      0,   1,  38,   0,   0,   8, \n      0, 208,   0,   0,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     32,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     21,   0,   0,   1, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     21,   0,   0,   1, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     62,   0,   0,   1,  83,  84, \n     65,  84, 148,   0,   0,   0, \n     81,   0,   0,   0,   5,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  29,   0,   0,   0, \n     18,   0,   0,   0,   3,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_32bpb_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 5\ndcl_thread_group 4, 32, 1\nand r0.xy, CB0[0][0].xxxx, l(1, 2, 0, 0)\nishl r1.x, vThreadID.x, l(3)\nmov r1.y, vThreadID.y\nuge r0.zw, r1.xxxy, CB0[0][1].xxxy\nor r0.z, r0.w, r0.z\nif_nz r0.z\n  ret \nendif \nubfe r0.z, l(2), l(2), CB0[0][0].x\nishl r0.w, r1.x, l(2)\nimad r1.y, vThreadID.z, CB0[0][1].y, vThreadID.y\nimad r0.w, r1.y, CB0[0][2].x, r0.w\niadd r0.w, r0.w, CB0[0][1].w\nif_z r0.x\n  imad r1.y, CB0[0][0].w, vThreadID.z, vThreadID.y\n  imad r1.y, CB0[0][0].z, r1.y, r1.x\n  ishl r1.y, r1.y, l(2)\nelse \n  if_nz r0.y\n    ushr r1.zw, CB0[0][0].zzzw, l(0, 0, 5, 4)\n    ishr r2.xyzw, vThreadID.zyyy, l(2, 4, 1, 3)\n    imad r0.y, r2.x, r1.w, r2.y\n    ibfe r1.w, l(27), l(2), vThreadID.x\n    imad r0.y, r0.y, r1.z, r1.w\n    bfi r1.zw, l(0, 0, 2, 1), l(0, 0, 5, 4), vThreadID.zzzy, l(0, 0, 0, 0)\n    bfi r2.y, l(2), l(3), r2.z, l(0)\n    iadd r1.z, r1.z, r2.y\n    bfi r0.y, l(25), l(7), r0.y, r1.z\n    xor r1.z, r2.x, r2.w\n    ubfe r2.x, l(2), l(3), r1.x\n    bfi r2.yz, l(0, 1, 1, 0), l(0, 1, 11, 0), r1.zzzz, l(0, 0, 0, 0)\n    xor r1.z, r2.y, r2.x\n    imad r1.z, r1.z, l(64), r1.w\n    iadd r1.z, r2.z, r1.z\n    ibfe r2.xy, l(27, 24, 0, 0), l(3, 6, 0, 0), r0.yyyy\n    bfi r0.y, l(3), l(8), r2.x, r1.z\n    bfi r1.y, l(20), l(12), r2.y, r0.y\n  else \n    ushr r0.y, CB0[0][0].z, l(5)\n    ishr r2.xyzw, vThreadID.yyyy, l(5, 1, 4, 3)\n    ibfe r1.z, l(27), l(2), vThreadID.x\n    imad r0.y, r2.x, r0.y, r1.z\n    bfi r2.xyz, l(3, 1, 1, 0), l(3, 1, 11, 0), r2.ywzy, l(0, 0, 0, 0)\n    bfi r0.y, l(26), l(6), r0.y, r2.x\n    ubfe r1.x, l(2), l(3), r1.x\n    xor r1.x, r2.y, r1.x\n    bfi r1.z, l(1), l(4), vThreadID.y, l(0)\n    imad r1.x, r1.x, l(64), r1.z\n    iadd r1.x, r2.z, r1.x\n    ibfe r1.zw, l(0, 0, 27, 24), l(0, 0, 3, 6), r0.yyyy\n    bfi r0.y, l(3), l(8), r1.z, r1.x\n    bfi r1.y, l(20), l(12), r1.w, r0.y\n  endif \nendif \niadd r0.y, r1.y, CB0[0][0].y\nld_raw r1.xyzw, r0.y, T0[0].xyzw\nieq r2.xyz, r0.zzzz, l(1, 2, 3, 0)\nor r2.xy, r2.yzyy, r2.xyxx\nif_nz r2.x\n  ishl r3.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r1.xyzw, r3.xyzw, r4.xyzw\nendif \nif_nz r2.y\n  ushr r3.xyzw, r1.xyzw, l(16, 16, 16, 16)\n  bfi r1.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r1.xyzw, r3.xyzw\nendif \nstore_raw U0[0].xyzw, r0.w, r1.xyzw\niadd r0.z, r0.w, l(16)\nif_nz r0.x\n  mov r0.x, l(32)\nelse \n  mov r0.x, l(16)\nendif \niadd r0.x, r0.x, r0.y\nld_raw r1.xyzw, r0.x, T0[0].xyzw\nif_nz r2.x\n  ishl r3.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r1.xyzw, r3.xyzw, r4.xyzw\nendif \nif_nz r2.y\n  ushr r2.xyzw, r1.xyzw, l(16, 16, 16, 16)\n  bfi r1.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r1.xyzw, r2.xyzw\nendif \nstore_raw U0[0].xyzw, r0.z, r1.xyzw\nret \n// Approximately 91 instruction slots used\n#endif\n\nconst BYTE texture_load_32bpb_cs[] =\n{\n     68,  88,  66,  67, 129, 182, \n     94,  78, 140, 122,  14, 252, \n     88,  36, 210,  84, 246, 168, \n     56, 249,   1,   0,   0,   0, \n    124,  16,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n    224,  15,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n    164,  11,   0,   0,  81,   0, \n      5,   0, 233,   2,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   5,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  12,  50,   0,  16,   0, \n      0,   0,   0,   0,   6, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n    194,   0,  16,   0,   0,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0,   6, 132, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  11, \n     66,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,   2,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,  11, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  31,   0, \n      0,   3,  10,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  58, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  42,   0,   2,   0, \n     26,   0,   2,   0,  35,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     41,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  18,   0, \n      0,   1,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,  12, \n    194,   0,  16,   0,   1,   0, \n      0,   0, 166, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0,  42,   0,   0,   9, \n    242,   0,  16,   0,   2,   0, \n      0,   0, 102,   5,   2,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      1,   0,   0,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 139,   0,   0,   8, \n    130,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     27,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10,   0,   2,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  19, 194,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0, 166,   6,   2,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     25,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  87,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0, 138,   0,   0,   9, \n     18,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  20, \n     98,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  11,   0, \n      0,   0,   0,   0,   0,   0, \n    166,  10,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  87,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  64,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    139,   0,   0,  15,  50,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  27,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  18,   0, \n      0,   1,  85,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  42,   0,   0,   9, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  86,   5,   2,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   1,   0,   0,   0, \n      4,   0,   0,   0,   3,   0, \n      0,   0, 139,   0,   0,   8, \n     66,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     27,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10,   0,   2,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  20, 114,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0, 214,   6,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  26,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0, 138,   0,   0,   9, \n     18,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  87,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  10,  66,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  26,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  64,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 139,   0,   0,  15, \n    194,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  27,   0,   0,   0, \n     24,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  21,   0, \n      0,   1,  30,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  32,   0, \n      0,  10, 114,   0,  16,   0, \n      2,   0,   0,   0, 166,  10, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   2,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   2,   0, \n      0,   0, 150,   5,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,  85,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     21,   0,   0,   1, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0,  31,   0, \n      4,   3,  10,   0,  16,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  32,   0,   0,   0, \n     18,   0,   0,   1,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n     21,   0,   0,   1,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  31,   0, \n      4,   3,  10,   0,  16,   0, \n      2,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      2,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  21,   0, \n      0,   1, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  62,   0, \n      0,   1,  83,  84,  65,  84, \n    148,   0,   0,   0,  91,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     26,   0,   0,   0,  17,   0, \n      0,   0,   5,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_32bpb_scaled_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 5\ndcl_thread_group 4, 32, 1\nand r0.x, CB0[0][0].x, l(2)\nishl r1.x, vThreadID.x, l(3)\nmov r1.y, vThreadID.y\nuge r0.yz, r1.xxyx, CB0[0][1].xxyx\nor r0.y, r0.z, r0.y\nif_nz r0.y\n  ret \nendif \nubfe r0.yzw, l(0, 2, 3, 3), l(0, 2, 4, 7), CB0[0][0].xxxx\nishl r1.z, r1.x, l(2)\nimad r1.w, vThreadID.z, CB0[0][1].y, vThreadID.y\nimad r1.z, r1.w, CB0[0][2].x, r1.z\niadd r1.z, r1.z, CB0[0][1].w\nushr r1.yw, r1.xxxy, l(0, 4, 0, 1)\nudiv r2.xyzw, null, r1.wyww, r0.wzww\nimad r1.yw, -r0.zzzw, r2.yyyw, r1.yyyw\nishl r3.x, r2.y, l(4)\nimad r1.y, r1.y, r0.w, r1.w\nbfi r1.w, l(1), l(6), vThreadID.y, l(0)\nbfi r1.y, l(25), l(7), r1.y, r1.w\nbfi r1.x, l(4), l(2), r1.x, l(0)\niadd r1.x, r1.y, r1.x\nif_nz r0.x\n  ushr r1.yw, CB0[0][0].zzzw, l(0, 5, 0, 4)\n  ishr r0.x, vThreadID.z, l(2)\n  ibfe r4.xyzw, l(28, 27, 31, 29), l(3, 1, 0, 2), r2.wyww\n  imad r1.w, r0.x, r1.w, r4.x\n  imad r1.y, r1.w, r1.y, r4.y\n  bfi r1.w, l(2), l(5), vThreadID.z, l(0)\n  bfi r3.y, l(2), l(3), r4.z, l(0)\n  iadd r1.w, r1.w, r3.y\n  bfi r1.y, l(25), l(7), r1.y, r1.w\n  xor r0.x, r0.x, r4.w\n  ishr r1.w, r3.x, l(3)\n  and r1.w, r1.w, l(2)\n  bfi r3.yz, l(0, 1, 1, 0), l(0, 1, 11, 0), r0.xxxx, l(0, 0, 0, 0)\n  xor r0.x, r1.w, r3.y\n  ishl r0.x, r0.x, l(6)\n  iadd r0.x, r3.z, r0.x\n  ibfe r1.yw, l(0, 27, 0, 24), l(0, 3, 0, 6), r1.yyyy\n  bfi r0.x, l(3), l(8), r1.y, r0.x\n  bfi r0.x, l(20), l(12), r1.w, r0.x\nelse \n  ushr r1.y, CB0[0][0].z, l(5)\n  ibfe r4.xyzw, l(27, 27, 31, 28), l(4, 1, 0, 3), r2.xyzw\n  imad r1.y, r4.x, r1.y, r4.y\n  bfi r2.xy, l(3, 1, 0, 0), l(3, 11, 0, 0), r4.zwzz, l(0, 0, 0, 0)\n  bfi r1.y, l(26), l(6), r1.y, r2.x\n  ishr r1.w, r3.x, l(3)\n  and r1.w, r1.w, l(2)\n  ibfe r2.x, l(29), l(2), r2.w\n  bfi r2.x, l(1), l(1), r2.x, l(0)\n  xor r1.w, r1.w, r2.x\n  ishl r1.w, r1.w, l(6)\n  iadd r1.w, r2.y, r1.w\n  ibfe r2.xy, l(27, 24, 0, 0), l(3, 6, 0, 0), r1.yyyy\n  bfi r1.y, l(3), l(8), r2.x, r1.w\n  bfi r0.x, l(20), l(12), r2.y, r1.y\nendif \nimul null, r0.z, r0.w, r0.z\nimad r0.x, r0.x, r0.z, r1.x\niadd r0.x, r0.x, CB0[0][0].y\nld_raw r2.xyzw, r0.x, T0[0].xyzw\nieq r0.yzw, r0.yyyy, l(0, 1, 2, 3)\nor r0.yz, r0.zzwz, r0.yyzy\nif_nz r0.y\n  ishl r3.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r2.xyzw, r3.xyzw, r4.xyzw\nendif \nif_nz r0.z\n  ushr r3.xyzw, r2.xyzw, l(16, 16, 16, 16)\n  bfi r2.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r2.xyzw, r3.xyzw\nendif \nstore_raw U0[0].xyzw, r1.z, r2.xyzw\niadd r0.w, r1.z, l(16)\niadd r0.x, r0.x, l(16)\nld_raw r2.xyzw, r0.x, T0[0].xyzw\nif_nz r0.y\n  ishl r3.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r2.xyzw, r3.xyzw, r4.xyzw\nendif \nif_nz r0.z\n  ushr r3.xyzw, r2.xyzw, l(16, 16, 16, 16)\n  bfi r2.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r2.xyzw, r3.xyzw\nendif \nstore_raw U0[0].xyzw, r0.w, r2.xyzw\nret \n// Approximately 93 instruction slots used\n#endif\n\nconst BYTE texture_load_32bpb_scaled_cs[] =\n{\n     68,  88,  66,  67, 157, 175, \n     18, 167, 139, 199, 193,  93, \n     18,  64,  58,  81, 160, 232, \n    221, 117,   1,   0,   0,   0, \n    128,  17,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n    228,  16,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n    168,  12,   0,   0,  81,   0, \n      5,   0,  42,   3,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   5,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n     98,   0,  16,   0,   0,   0, \n      0,   0,   6,   1,  16,   0, \n      1,   0,   0,   0,   6, 129, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  17, \n    226,   0,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   7,   0,   0,   0, \n      6, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,  35,   0,   0,   9, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,   2,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,  11, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   9,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  85,   0, \n      0,  10, 162,   0,  16,   0, \n      1,   0,   0,   0,   6,   4, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  78,   0,   0,   8, \n    242,   0,  16,   0,   2,   0, \n      0,   0,   0, 208,   0,   0, \n    118,  15,  16,   0,   1,   0, \n      0,   0, 182,  15,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,  10, 162,   0,  16,   0, \n      1,   0,   0,   0, 166,  14, \n     16, 128,  65,   0,   0,   0, \n      0,   0,   0,   0,  86,  13, \n     16,   0,   2,   0,   0,   0, \n     86,  13,  16,   0,   1,   0, \n      0,   0,  41,   0,   0,   7, \n     18,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  10, 130,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  26,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  25,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  18,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     85,   0,   0,  12, 162,   0, \n     16,   0,   1,   0,   0,   0, \n    166, 142,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n     42,   0,   0,   6,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,   2,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n    139,   0,   0,  15, 242,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,  28,   0, \n      0,   0,  27,   0,   0,   0, \n     31,   0,   0,   0,  29,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0, 118,  15, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,   9, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n    140,   0,   0,  10, 130,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  42,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      4,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  25,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     87,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,  42,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n    140,   0,   0,  20,  98,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0,   6,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n     41,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0, 139,   0,   0,  15, \n    162,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  27,   0, \n      0,   0,   0,   0,   0,   0, \n     24,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   6,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     18,   0,   0,   1,  85,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0, 139,   0, \n      0,  15, 242,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,  27,   0,   0,   0, \n     27,   0,   0,   0,  31,   0, \n      0,   0,  28,   0,   0,   0, \n      2,  64,   0,   0,   4,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      4,   0,   0,   0, 140,   0, \n      0,  20,  50,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 230,  10,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  26,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0, 139,   0, \n      0,   9,  18,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,  29,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  30,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n    139,   0,   0,  15,  50,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  27,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  21,   0, \n      0,   1,  38,   0,   0,   8, \n      0, 208,   0,   0,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     32,   0,   0,  10, 226,   0, \n     16,   0,   0,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   2,   0,   0,   0, \n      3,   0,   0,   0,  60,   0, \n      0,   7,  98,   0,  16,   0, \n      0,   0,   0,   0, 166,  11, \n     16,   0,   0,   0,   0,   0, \n     86,   6,  16,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  21,   0,   0,   1, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  30,   0,   0,   7, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n     30,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,  85,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     21,   0,   0,   1, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     62,   0,   0,   1,  83,  84, \n     65,  84, 148,   0,   0,   0, \n     93,   0,   0,   0,   5,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   0, \n     21,   0,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_64bpb_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 5\ndcl_thread_group 4, 32, 1\nand r0.xy, CB0[0][0].xxxx, l(1, 2, 0, 0)\nishl r1.x, vThreadID.x, l(2)\nmov r1.y, vThreadID.y\nuge r0.zw, r1.xxxy, CB0[0][1].xxxy\nor r0.z, r0.w, r0.z\nif_nz r0.z\n  ret \nendif \nubfe r0.z, l(2), l(2), CB0[0][0].x\nishl r0.w, r1.x, l(3)\nimad r1.y, vThreadID.z, CB0[0][1].y, vThreadID.y\nimad r0.w, r1.y, CB0[0][2].x, r0.w\niadd r0.w, r0.w, CB0[0][1].w\nif_z r0.x\n  imad r1.y, CB0[0][0].w, vThreadID.z, vThreadID.y\n  imad r1.y, CB0[0][0].z, r1.y, r1.x\n  ishl r1.y, r1.y, l(3)\nelse \n  if_nz r0.y\n    ushr r1.zw, CB0[0][0].zzzw, l(0, 0, 5, 4)\n    ishr r2.xyzw, vThreadID.zyyy, l(2, 4, 1, 3)\n    imad r0.y, r2.x, r1.w, r2.y\n    ibfe r1.w, l(27), l(3), vThreadID.x\n    imad r0.y, r0.y, r1.z, r1.w\n    bfi r1.zw, l(0, 0, 2, 1), l(0, 0, 5, 4), vThreadID.zzzy, l(0, 0, 0, 0)\n    bfi r2.y, l(2), l(3), r2.z, l(0)\n    iadd r1.z, r1.z, r2.y\n    bfi r1.z, l(3), l(0), r1.x, r1.z\n    bfi r0.y, l(25), l(7), r0.y, r1.z\n    xor r1.z, r2.x, r2.w\n    ubfe r2.x, l(2), l(3), r1.x\n    bfi r2.yz, l(0, 1, 1, 0), l(0, 1, 11, 0), r1.zzzz, l(0, 0, 0, 0)\n    xor r1.z, r2.y, r2.x\n    imad r1.z, r1.z, l(64), r1.w\n    iadd r1.z, r2.z, r1.z\n    ibfe r2.xy, l(27, 24, 0, 0), l(2, 5, 0, 0), r0.yyyy\n    bfi r0.y, l(3), l(8), r2.x, r1.z\n    bfi r1.y, l(20), l(12), r2.y, r0.y\n  else \n    ushr r0.y, CB0[0][0].z, l(5)\n    ishr r2.xyzw, vThreadID.yyyy, l(5, 1, 4, 3)\n    ibfe r1.z, l(27), l(3), vThreadID.x\n    imad r0.y, r2.x, r0.y, r1.z\n    bfi r2.xyz, l(3, 1, 1, 0), l(3, 1, 11, 0), r2.ywzy, l(0, 0, 0, 0)\n    bfi r1.z, l(3), l(0), r1.x, r2.x\n    bfi r0.y, l(26), l(6), r0.y, r1.z\n    ubfe r1.x, l(2), l(3), r1.x\n    xor r1.x, r2.y, r1.x\n    bfi r1.z, l(1), l(4), vThreadID.y, l(0)\n    imad r1.x, r1.x, l(64), r1.z\n    iadd r1.x, r2.z, r1.x\n    ibfe r1.zw, l(0, 0, 27, 24), l(0, 0, 2, 5), r0.yyyy\n    bfi r0.y, l(3), l(8), r1.z, r1.x\n    bfi r1.y, l(20), l(12), r1.w, r0.y\n  endif \nendif \niadd r0.y, r1.y, CB0[0][0].y\nld_raw r1.xyzw, r0.y, T0[0].xyzw\nieq r2.xyz, r0.zzzz, l(1, 2, 3, 0)\nor r2.xy, r2.yzyy, r2.xyxx\nif_nz r2.x\n  ishl r3.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r1.xyzw, r3.xyzw, r4.xyzw\nendif \nif_nz r2.y\n  ushr r3.xyzw, r1.xyzw, l(16, 16, 16, 16)\n  bfi r1.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r1.xyzw, r3.xyzw\nendif \nstore_raw U0[0].xyzw, r0.w, r1.xyzw\niadd r0.z, r0.w, l(16)\nif_nz r0.x\n  mov r0.x, l(32)\nelse \n  mov r0.x, l(16)\nendif \niadd r0.x, r0.x, r0.y\nld_raw r1.xyzw, r0.x, T0[0].xyzw\nif_nz r2.x\n  ishl r3.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r1.xyzw, r3.xyzw, r4.xyzw\nendif \nif_nz r2.y\n  ushr r2.xyzw, r1.xyzw, l(16, 16, 16, 16)\n  bfi r1.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r1.xyzw, r2.xyzw\nendif \nstore_raw U0[0].xyzw, r0.z, r1.xyzw\nret \n// Approximately 93 instruction slots used\n#endif\n\nconst BYTE texture_load_64bpb_cs[] =\n{\n     68,  88,  66,  67, 236,  30, \n    100,  94,  15,  89,   5, 195, \n    242, 211, 190,  39, 250, 137, \n    159, 114,   1,   0,   0,   0, \n    212,  16,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n     56,  16,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n    252,  11,   0,   0,  81,   0, \n      5,   0, 255,   2,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   5,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  12,  50,   0,  16,   0, \n      0,   0,   0,   0,   6, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n    194,   0,  16,   0,   0,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0,   6, 132, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  11, \n     66,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,   2,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,  11, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  31,   0, \n      0,   3,  10,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  58, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  42,   0,   2,   0, \n     26,   0,   2,   0,  35,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     41,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  18,   0, \n      0,   1,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,  12, \n    194,   0,  16,   0,   1,   0, \n      0,   0, 166, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0,  42,   0,   0,   9, \n    242,   0,  16,   0,   2,   0, \n      0,   0, 102,   5,   2,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      1,   0,   0,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 139,   0,   0,   8, \n    130,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     27,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     10,   0,   2,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  19, 194,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0, 166,   6,   2,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 140,   0,   0,  11, \n     66,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  25,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     87,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0, 138,   0, \n      0,   9,  18,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  20,  98,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0, 166,  10,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  64,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0, 139,   0,   0,  15, \n     50,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     27,   0,   0,   0,  24,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     18,   0,   0,   1,  85,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  42,   0, \n      0,   9, 242,   0,  16,   0, \n      2,   0,   0,   0,  86,   5, \n      2,   0,   2,  64,   0,   0, \n      5,   0,   0,   0,   1,   0, \n      0,   0,   4,   0,   0,   0, \n      3,   0,   0,   0, 139,   0, \n      0,   8,  66,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  27,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  10,   0,   2,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  20, 114,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0, 214,   6, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     66,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  26,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    138,   0,   0,   9,  18,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     87,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  10,  66,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  26,   0,   2,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  64,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    139,   0,   0,  15, 194,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     27,   0,   0,   0,  24,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      5,   0,   0,   0,  86,   5, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  21,   0,   0,   1, \n     30,   0,   0,   9,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  26, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  32,   0,   0,  10, \n    114,   0,  16,   0,   2,   0, \n      0,   0, 166,  10,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      2,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,   2,   0,   0,   0, \n    150,   5,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,  31,   0, \n      4,   3,  10,   0,  16,   0, \n      2,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      2,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  21,   0, \n      0,   1, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     32,   0,   0,   0,  18,   0, \n      0,   1,  54,   0,   0,   5, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0,  21,   0, \n      0,   1,  30,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  21,   0,   0,   1, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  62,   0,   0,   1, \n     83,  84,  65,  84, 148,   0, \n      0,   0,  93,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  26,   0, \n      0,   0,  17,   0,   0,   0, \n      5,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_64bpb_scaled_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 5\ndcl_thread_group 4, 32, 1\nand r0.x, CB0[0][0].x, l(2)\nishl r1.x, vThreadID.x, l(2)\nmov r1.y, vThreadID.y\nuge r0.yz, r1.xxyx, CB0[0][1].xxyx\nor r0.y, r0.z, r0.y\nif_nz r0.y\n  ret \nendif \nubfe r0.yzw, l(0, 2, 3, 3), l(0, 2, 4, 7), CB0[0][0].xxxx\nishl r1.z, r1.x, l(3)\nimad r1.w, vThreadID.z, CB0[0][1].y, vThreadID.y\nimad r1.z, r1.w, CB0[0][2].x, r1.z\niadd r1.z, r1.z, CB0[0][1].w\nushr r1.xy, r1.xyxx, l(2, 1, 0, 0)\nudiv r2.xy, null, r1.xyxx, r0.zwzz\nimad r1.xy, -r0.zwzz, r2.xyxx, r1.xyxx\nishl r1.w, r2.x, l(2)\nimad r1.x, r1.x, r0.w, r1.y\nbfi r1.y, l(1), l(5), vThreadID.y, l(0)\nbfi r1.x, l(26), l(6), r1.x, r1.y\nif_nz r0.x\n  ushr r2.zw, CB0[0][0].zzzw, l(0, 0, 5, 4)\n  ishr r0.x, vThreadID.z, l(2)\n  ibfe r3.xyzw, l(28, 27, 31, 29), l(3, 3, 0, 2), r2.yxyy\n  imad r1.y, r0.x, r2.w, r3.x\n  imad r1.y, r1.y, r2.z, r3.y\n  bfi r2.z, l(2), l(5), vThreadID.z, l(0)\n  bfi r2.w, l(2), l(3), r3.z, l(0)\n  iadd r2.z, r2.z, r2.w\n  bfi r2.z, l(3), l(0), r1.w, r2.z\n  bfi r1.y, l(25), l(7), r1.y, r2.z\n  xor r0.x, r0.x, r3.w\n  ibfe r2.z, l(29), l(1), r2.x\n  and r2.z, r2.z, l(3)\n  bfi r3.xy, l(1, 1, 0, 0), l(1, 11, 0, 0), r0.xxxx, l(0, 0, 0, 0)\n  xor r0.x, r2.z, r3.x\n  ishl r0.x, r0.x, l(6)\n  iadd r0.x, r3.y, r0.x\n  ibfe r2.zw, l(0, 0, 27, 24), l(0, 0, 2, 5), r1.yyyy\n  bfi r0.x, l(3), l(8), r2.z, r0.x\n  bfi r0.x, l(20), l(12), r2.w, r0.x\nelse \n  ushr r1.y, CB0[0][0].z, l(5)\n  ibfe r3.xyzw, l(27, 27, 31, 28), l(4, 3, 0, 3), r2.yxyy\n  imad r1.y, r3.x, r1.y, r3.y\n  bfi r2.zw, l(0, 0, 3, 1), l(0, 0, 3, 11), r3.zzzw, l(0, 0, 0, 0)\n  bfi r1.w, l(3), l(0), r1.w, r2.z\n  bfi r1.y, l(26), l(6), r1.y, r1.w\n  ibfe r2.xy, l(29, 29, 0, 0), l(1, 2, 0, 0), r2.xyxx\n  and r1.w, r2.x, l(3)\n  bfi r2.x, l(1), l(1), r2.y, l(0)\n  xor r1.w, r1.w, r2.x\n  ishl r1.w, r1.w, l(6)\n  iadd r1.w, r2.w, r1.w\n  ibfe r2.xy, l(27, 24, 0, 0), l(2, 5, 0, 0), r1.yyyy\n  bfi r1.y, l(3), l(8), r2.x, r1.w\n  bfi r0.x, l(20), l(12), r2.y, r1.y\nendif \nimul null, r0.z, r0.w, r0.z\nimad r0.x, r0.x, r0.z, r1.x\niadd r0.x, r0.x, CB0[0][0].y\nld_raw r2.xyzw, r0.x, T0[0].xyzw\nieq r0.yzw, r0.yyyy, l(0, 1, 2, 3)\nor r0.yz, r0.zzwz, r0.yyzy\nif_nz r0.y\n  ishl r3.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r2.xyzw, r3.xyzw, r4.xyzw\nendif \nif_nz r0.z\n  ushr r3.xyzw, r2.xyzw, l(16, 16, 16, 16)\n  bfi r2.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r2.xyzw, r3.xyzw\nendif \nstore_raw U0[0].xyzw, r1.z, r2.xyzw\niadd r0.w, r1.z, l(16)\niadd r0.x, r0.x, l(16)\nld_raw r2.xyzw, r0.x, T0[0].xyzw\nif_nz r0.y\n  ishl r3.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r2.xyzw, r3.xyzw, r4.xyzw\nendif \nif_nz r0.z\n  ushr r3.xyzw, r2.xyzw, l(16, 16, 16, 16)\n  bfi r2.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r2.xyzw, r3.xyzw\nendif \nstore_raw U0[0].xyzw, r0.w, r2.xyzw\nret \n// Approximately 92 instruction slots used\n#endif\n\nconst BYTE texture_load_64bpb_scaled_cs[] =\n{\n     68,  88,  66,  67,  20,  46, \n    192,   3, 229, 244, 176, 212, \n     45, 110, 187, 157,  53, 194, \n     13, 240,   1,   0,   0,   0, \n    148,  17,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n    248,  16,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n    188,  12,   0,   0,  81,   0, \n      5,   0,  47,   3,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   5,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n     98,   0,  16,   0,   0,   0, \n      0,   0,   6,   1,  16,   0, \n      1,   0,   0,   0,   6, 129, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  17, \n    226,   0,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   7,   0,   0,   0, \n      6, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,   2,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,  11, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   9,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  78,   0,   0,   8, \n     50,   0,  16,   0,   2,   0, \n      0,   0,   0, 208,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0, 230,  10,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,  10,  50,   0,  16,   0, \n      1,   0,   0,   0, 230,  10, \n     16, 128,  65,   0,   0,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  41,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  10,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  26,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  26,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     85,   0,   0,  12, 194,   0, \n     16,   0,   2,   0,   0,   0, \n    166, 142,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   5,   0, \n      0,   0,   4,   0,   0,   0, \n     42,   0,   0,   6,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,   2,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n    139,   0,   0,  15, 242,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,  28,   0, \n      0,   0,  27,   0,   0,   0, \n     31,   0,   0,   0,  29,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,  22,   5, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   3,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n    140,   0,   0,  10,  66,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  42,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11, 130,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  11,  66,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  25,   0, \n      0,   0,   1,  64,   0,   0, \n      7,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  87,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n    139,   0,   0,   9,  66,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,  29,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n      1,   0,   0,   7,  66,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0, 140,   0, \n      0,  20,  50,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   6,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      3,   0,   0,   0,  41,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n    139,   0,   0,  15, 194,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     27,   0,   0,   0,  24,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      5,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  18,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  18,   0, \n      0,   1,  85,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  42, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0, 139,   0,   0,  15, \n    242,   0,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n     27,   0,   0,   0,  27,   0, \n      0,   0,  31,   0,   0,   0, \n     28,   0,   0,   0,   2,  64, \n      0,   0,   4,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n     22,   5,  16,   0,   2,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0, 140,   0,   0,  20, \n    194,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,  11,   0,   0,   0, \n    166,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11, 130,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  26,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0, 139,   0,   0,  15, \n     50,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     29,   0,   0,   0,  29,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   2,   0, \n      0,   0,   1,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n    140,   0,   0,  11,  18,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     41,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  30,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0, 139,   0,   0,  15, \n     50,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     27,   0,   0,   0,  24,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     21,   0,   0,   1,  38,   0, \n      0,   8,   0, 208,   0,   0, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  26, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  32,   0,   0,  10, \n    226,   0,  16,   0,   0,   0, \n      0,   0,  86,   5,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   7,  98,   0, \n     16,   0,   0,   0,   0,   0, \n    166,  11,  16,   0,   0,   0, \n      0,   0,  86,   6,  16,   0, \n      0,   0,   0,   0,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  21,   0, \n      0,   1, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  30,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  21,   0,   0,   1, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  62,   0,   0,   1, \n     83,  84,  65,  84, 148,   0, \n      0,   0,  92,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  27,   0, \n      0,   0,  21,   0,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_8bpb_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 3\ndcl_thread_group 4, 32, 1\nand r0.xy, CB0[0][0].xxxx, l(1, 2, 0, 0)\nishl r1.x, vThreadID.x, l(4)\nmov r1.y, vThreadID.y\nuge r0.zw, r1.xxxy, CB0[0][1].xxxy\nor r0.z, r0.w, r0.z\nif_nz r0.z\n  ret \nendif \nimad r0.z, vThreadID.z, CB0[0][1].y, vThreadID.y\nimad r0.z, r0.z, CB0[0][2].x, r1.x\niadd r0.z, r0.z, CB0[0][1].w\nif_z r0.x\n  imad r0.w, CB0[0][0].w, vThreadID.z, vThreadID.y\n  imad r0.w, CB0[0][0].z, r0.w, r1.x\nelse \n  if_nz r0.y\n    ushr r1.yz, CB0[0][0].zzwz, l(0, 5, 4, 0)\n    ishr r2.xyzw, vThreadID.zyyy, l(2, 4, 1, 3)\n    imad r0.y, r2.x, r1.z, r2.y\n    ibfe r1.z, l(27), l(1), vThreadID.x\n    imad r0.y, r0.y, r1.y, r1.z\n    bfi r1.yz, l(0, 2, 1, 0), l(0, 5, 4, 0), vThreadID.zzyz, l(0, 0, 0, 0)\n    bfi r1.w, l(2), l(3), r2.z, l(0)\n    iadd r1.y, r1.y, r1.w\n    bfi r1.y, l(25), l(7), r0.y, r1.y\n    xor r1.w, r2.x, r2.w\n    ishr r2.x, r1.x, l(3)\n    and r2.x, r2.x, l(2)\n    bfi r2.yz, l(0, 1, 1, 0), l(0, 1, 11, 0), r1.wwww, l(0, 0, 0, 0)\n    xor r1.w, r2.y, r2.x\n    ishl r1.w, r1.w, l(6)\n    iadd r1.z, r1.w, r1.z\n    iadd r1.z, r2.z, r1.z\n    bfi r1.z, l(4), l(0), r1.y, r1.z\n    ishr r1.yw, r1.yyyy, l(0, 4, 0, 5)\n    bfi r1.y, l(1), l(5), r1.y, r1.z\n    bfi r1.y, l(3), l(8), r1.w, r1.y\n    ibfe r0.y, l(24), l(1), r0.y\n    bfi r0.w, l(20), l(12), r0.y, r1.y\n  else \n    ushr r0.y, CB0[0][0].z, l(5)\n    ishr r2.xyzw, vThreadID.yyyy, l(5, 1, 4, 3)\n    ibfe r1.y, l(27), l(1), vThreadID.x\n    imad r0.y, r2.x, r0.y, r1.y\n    bfi r1.yzw, l(0, 3, 1, 1), l(0, 3, 1, 11), r2.yywz, l(0, 0, 0, 0)\n    bfi r1.y, l(26), l(6), r0.y, r1.y\n    ishr r1.x, r1.x, l(3)\n    and r1.x, r1.x, l(2)\n    xor r1.x, r1.z, r1.x\n    bfi r1.z, l(1), l(4), vThreadID.y, l(0)\n    ishl r1.x, r1.x, l(6)\n    iadd r1.x, r1.x, r1.z\n    iadd r1.x, r1.w, r1.x\n    bfi r1.x, l(4), l(0), r1.y, r1.x\n    ishr r1.yz, r1.yyyy, l(0, 4, 5, 0)\n    bfi r1.x, l(1), l(5), r1.y, r1.x\n    bfi r1.x, l(3), l(8), r1.z, r1.x\n    ibfe r0.y, l(24), l(2), r0.y\n    bfi r0.w, l(20), l(12), r0.y, r1.x\n  endif \nendif \niadd r0.y, r0.w, CB0[0][0].y\nld_raw r1.xy, r0.y, T0[0].xyxx\nif_nz r0.x\n  mov r0.x, l(64)\nelse \n  mov r0.x, l(8)\nendif \niadd r0.x, r0.x, r0.y\nld_raw r1.zw, r0.x, T0[0].xxxy\nstore_raw U0[0].xyzw, r0.z, r1.xyzw\nret \n// Approximately 72 instruction slots used\n#endif\n\nconst BYTE texture_load_8bpb_cs[] =\n{\n     68,  88,  66,  67,  27,  72, \n     78,  51, 157, 157, 250, 164, \n    157,  96,  29, 106, 221, 189, \n    201, 144,   1,   0,   0,   0, \n     40,  14,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n    140,  13,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n     80,   9,   0,   0,  81,   0, \n      5,   0,  84,   2,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   3,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  12,  50,   0,  16,   0, \n      0,   0,   0,   0,   6, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n    194,   0,  16,   0,   0,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0,   6, 132, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1,  35,   0,   0,   9, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,   2,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,  11, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   9,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  31,   0, \n      0,   3,  10,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,  58, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  42,   0,   2,   0, \n     26,   0,   2,   0,  35,   0, \n      0,  11, 130,   0,  16,   0, \n      0,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     18,   0,   0,   1,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  12,  98,   0,  16,   0, \n      1,   0,   0,   0, 166, 139, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   5,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,  42,   0, \n      0,   9, 242,   0,  16,   0, \n      2,   0,   0,   0, 102,   5, \n      2,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   1,   0,   0,   0, \n      3,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0, 139,   0, \n      0,   8,  66,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  27,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  10,   0,   2,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  19,  98,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   5,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0, 166,   9, \n      2,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11, 130,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  25,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     87,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n      0,   7,  18,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   7, \n     18,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n    140,   0,   0,  20,  98,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0, 246,  15, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     41,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  66,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,   0,  10, \n    162,   0,  16,   0,   1,   0, \n      0,   0,  86,   5,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,   5,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0, 139,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  24,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11, 130,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     18,   0,   0,   1,  85,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  42,   0, \n      0,   9, 242,   0,  16,   0, \n      2,   0,   0,   0,  86,   5, \n      2,   0,   2,  64,   0,   0, \n      5,   0,   0,   0,   1,   0, \n      0,   0,   4,   0,   0,   0, \n      3,   0,   0,   0, 139,   0, \n      0,   8,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  27,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  10,   0,   2,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  20, 226,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n     11,   0,   0,   0,  86,  11, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     26,   0,   0,   0,   1,  64, \n      0,   0,   6,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     87,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  10,  66,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  26,   0,   2,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   6,   0,   0,   0, \n     30,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n      0,  10,  98,   0,  16,   0, \n      1,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   5,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   8,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    139,   0,   0,   9,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  24,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11, 130,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  20,   0, \n      0,   0,   1,  64,   0,   0, \n     12,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  21,   0,   0,   1, \n     21,   0,   0,   1,  30,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8,  50,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     70, 112,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  64,   0, \n      0,   0,  18,   0,   0,   1, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   8,   0, \n      0,   0,  21,   0,   0,   1, \n     30,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8, 194,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      6, 116,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  62,   0,   0,   1, \n     83,  84,  65,  84, 148,   0, \n      0,   0,  72,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  24,   0, \n      0,   0,  10,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_8bpb_scaled_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 5\ndcl_thread_group 4, 32, 1\nand r0.x, CB0[0][0].x, l(2)\nishl r1.x, vThreadID.x, l(4)\nmov r1.y, vThreadID.y\nuge r0.yz, r1.xxyx, CB0[0][1].xxyx\nor r0.y, r0.z, r0.y\nif_nz r0.y\n  ret \nendif \nubfe r0.yz, l(0, 3, 3, 0), l(0, 4, 7, 0), CB0[0][0].xxxx\nimad r0.w, vThreadID.z, CB0[0][1].y, vThreadID.y\nimad r0.w, r0.w, CB0[0][2].x, r1.x\niadd r0.w, r0.w, CB0[0][1].w\nushr r1.xy, r1.xyxx, l(4, 3, 0, 0)\nudiv r2.xyzw, null, r1.yxyy, r0.zyzz\nimad r1.xy, -r0.yzyy, r2.ywyy, r1.xyxx\nishl r1.zw, r2.wwwy, l(0, 0, 3, 4)\nimad r1.x, r1.x, r0.z, r1.y\nbfi r1.y, l(3), l(4), vThreadID.y, l(0)\nbfi r1.x, l(25), l(7), r1.x, r1.y\nif_nz r0.x\n  ushr r3.xy, CB0[0][0].zwzz, l(5, 4, 0, 0)\n  ishr r0.x, vThreadID.z, l(2)\n  ibfe r4.xyz, l(28, 27, 29, 0), l(1, 1, 0, 0), r2.wyww\n  imad r1.y, r0.x, r3.y, r4.x\n  imad r1.y, r1.y, r3.x, r4.y\n  bfi r3.x, l(2), l(5), vThreadID.z, l(0)\n  bfi r3.x, l(25), l(7), r1.y, r3.x\n  xor r0.x, r0.x, r4.z\n  ishr r3.y, r1.w, l(3)\n  and r3.y, r3.y, l(2)\n  bfi r3.zw, l(0, 0, 1, 1), l(0, 0, 1, 11), r0.xxxx, l(0, 0, 0, 0)\n  xor r0.x, r3.z, r3.y\n  ishl r0.x, r0.x, l(6)\n  iadd r0.x, r3.w, r0.x\n  ishr r3.x, r3.x, l(5)\n  bfi r0.x, l(3), l(8), r3.x, r0.x\n  ibfe r1.y, l(24), l(1), r1.y\n  bfi r0.x, l(20), l(12), r1.y, r0.x\nelse \n  ushr r1.y, CB0[0][0].z, l(5)\n  ibfe r2.xyzw, l(27, 27, 28, 29), l(2, 1, 1, 0), r2.xyzw\n  imad r1.y, r2.x, r1.y, r2.y\n  ishr r1.zw, r1.zzzw, l(0, 0, 1, 3)\n  bfi r1.z, l(3), l(3), r1.z, l(0)\n  bfi r1.z, l(26), l(6), r1.y, r1.z\n  and r1.w, r1.w, l(2)\n  bfi r2.xy, l(1, 1, 0, 0), l(1, 11, 0, 0), r2.wzww, l(0, 0, 0, 0)\n  xor r1.w, r1.w, r2.x\n  ishl r1.w, r1.w, l(6)\n  iadd r1.w, r2.y, r1.w\n  ishr r1.z, r1.z, l(5)\n  bfi r1.z, l(3), l(8), r1.z, r1.w\n  ibfe r1.y, l(24), l(2), r1.y\n  bfi r0.x, l(20), l(12), r1.y, r1.z\nendif \nimul null, r0.y, r0.z, r0.y\nimad r0.x, r0.x, r0.y, r1.x\niadd r0.x, r0.x, CB0[0][0].y\nld_raw r1.xyzw, r0.x, T0[0].xyzw\nstore_raw U0[0].xyzw, r0.w, r1.xyzw\nret \n// Approximately 61 instruction slots used\n#endif\n\nconst BYTE texture_load_8bpb_scaled_cs[] =\n{\n     68,  88,  66,  67, 142,  40, \n    135,  14,  29,  88,  87, 236, \n    199, 226, 229,  63,  32, 123, \n    175, 180,   1,   0,   0,   0, \n    132,  13,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n    232,  12,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n    172,   8,   0,   0,  81,   0, \n      5,   0,  43,   2,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   5,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n     98,   0,  16,   0,   0,   0, \n      0,   0,   6,   1,  16,   0, \n      1,   0,   0,   0,   6, 129, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  17, \n     98,   0,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n      6, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n      2,   0,  26, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     26,   0,   2,   0,  35,   0, \n      0,  11, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   9, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  58, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     85,   0,   0,  10,  50,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  78,   0, \n      0,   8, 242,   0,  16,   0, \n      2,   0,   0,   0,   0, 208, \n      0,   0,  22,   5,  16,   0, \n      1,   0,   0,   0, 102,  10, \n     16,   0,   0,   0,   0,   0, \n     35,   0,   0,  10,  50,   0, \n     16,   0,   1,   0,   0,   0, \n    150,   5,  16, 128,  65,   0, \n      0,   0,   0,   0,   0,   0, \n    214,   5,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,  41,   0, \n      0,  10, 194,   0,  16,   0, \n      1,   0,   0,   0, 246,   7, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   4,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  10, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     26,   0,   2,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  18,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  25,   0, \n      0,   0,   1,  64,   0,   0, \n      7,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,  12, \n     50,   0,  16,   0,   3,   0, \n      0,   0, 230, 138,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  42,   0,   0,   6, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,   2,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0, 139,   0,   0,  15, \n    114,   0,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n     28,   0,   0,   0,  27,   0, \n      0,   0,  29,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    118,  15,  16,   0,   2,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   4,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   3,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0, 140,   0,   0,  10, \n     18,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   5,   0,   0,   0, \n     42,   0,   2,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  18,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,  25,   0, \n      0,   0,   1,  64,   0,   0, \n      7,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   3,   0, \n      0,   0,  87,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   4,   0,   0,   0, \n     42,   0,   0,   7,  34,   0, \n     16,   0,   3,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   7,  34,   0,  16,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0, 140,   0,   0,  20, \n    194,   0,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n      6,   0,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  87,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,  41,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   6,   0,   0,   0, \n     30,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n      0,   7,  18,   0,  16,   0, \n      3,   0,   0,   0,  10,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     10,   0,  16,   0,   3,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0, 139,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  24,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     18,   0,   0,   1,  85,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0, 139,   0, \n      0,  15, 242,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  27,   0,   0,   0, \n     27,   0,   0,   0,  28,   0, \n      0,   0,  29,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n      0,  10, 194,   0,  16,   0, \n      1,   0,   0,   0, 166,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   3,   0, \n      0,   0, 140,   0,   0,  11, \n     66,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  66,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  26,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  20,  50,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 182,  15,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  30,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0, 140,   0, \n      0,  11,  66,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   8,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n    139,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  24,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  18,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  20,   0, \n      0,   0,   1,  64,   0,   0, \n     12,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  21,   0,   0,   1, \n     38,   0,   0,   8,   0, 208, \n      0,   0,  34,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   9, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     62,   0,   0,   1,  83,  84, \n     65,  84, 148,   0,   0,   0, \n     61,   0,   0,   0,   5,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  22,   0,   0,   0, \n     12,   0,   0,   0,   3,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_bgrg8_rgb8_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 6\ndcl_thread_group 4, 32, 1\nand r0.xy, CB0[0][0].xxxx, l(1, 2, 0, 0)\nishl r1.x, vThreadID.x, l(3)\nmov r1.y, vThreadID.y\nuge r0.zw, r1.xxxy, CB0[0][1].xxxy\nor r0.z, r0.w, r0.z\nif_nz r0.z\n  ret \nendif \nubfe r0.z, l(2), l(2), CB0[0][0].x\nishl r0.w, r1.x, l(3)\nimad r1.y, vThreadID.z, CB0[0][1].y, vThreadID.y\nimad r0.w, r1.y, CB0[0][2].x, r0.w\niadd r0.w, r0.w, CB0[0][1].w\nif_z r0.x\n  imad r1.y, CB0[0][0].w, vThreadID.z, vThreadID.y\n  imad r1.y, CB0[0][0].z, r1.y, r1.x\n  ishl r1.y, r1.y, l(2)\nelse \n  if_nz r0.y\n    ushr r1.zw, CB0[0][0].zzzw, l(0, 0, 5, 4)\n    ishr r2.xyzw, vThreadID.zyyy, l(2, 4, 1, 3)\n    imad r0.y, r2.x, r1.w, r2.y\n    ibfe r1.w, l(27), l(2), vThreadID.x\n    imad r0.y, r0.y, r1.z, r1.w\n    bfi r1.zw, l(0, 0, 2, 1), l(0, 0, 5, 4), vThreadID.zzzy, l(0, 0, 0, 0)\n    bfi r2.y, l(2), l(3), r2.z, l(0)\n    iadd r1.z, r1.z, r2.y\n    bfi r0.y, l(25), l(7), r0.y, r1.z\n    xor r1.z, r2.x, r2.w\n    ubfe r2.x, l(2), l(3), r1.x\n    bfi r2.yz, l(0, 1, 1, 0), l(0, 1, 11, 0), r1.zzzz, l(0, 0, 0, 0)\n    xor r1.z, r2.y, r2.x\n    imad r1.z, r1.z, l(64), r1.w\n    iadd r1.z, r2.z, r1.z\n    ibfe r2.xy, l(27, 24, 0, 0), l(3, 6, 0, 0), r0.yyyy\n    bfi r0.y, l(3), l(8), r2.x, r1.z\n    bfi r1.y, l(20), l(12), r2.y, r0.y\n  else \n    ushr r0.y, CB0[0][0].z, l(5)\n    ishr r2.xyzw, vThreadID.yyyy, l(5, 1, 4, 3)\n    ibfe r1.z, l(27), l(2), vThreadID.x\n    imad r0.y, r2.x, r0.y, r1.z\n    bfi r2.xyz, l(3, 1, 1, 0), l(3, 1, 11, 0), r2.ywzy, l(0, 0, 0, 0)\n    bfi r0.y, l(26), l(6), r0.y, r2.x\n    ubfe r1.x, l(2), l(3), r1.x\n    xor r1.x, r2.y, r1.x\n    bfi r1.z, l(1), l(4), vThreadID.y, l(0)\n    imad r1.x, r1.x, l(64), r1.z\n    iadd r1.x, r2.z, r1.x\n    ibfe r1.zw, l(0, 0, 27, 24), l(0, 0, 3, 6), r0.yyyy\n    bfi r0.y, l(3), l(8), r1.z, r1.x\n    bfi r1.y, l(20), l(12), r1.w, r0.y\n  endif \nendif \niadd r0.y, r1.y, CB0[0][0].y\nld_raw r1.xyzw, r0.y, T0[0].xyzw\nieq r2.xyz, r0.zzzz, l(1, 2, 3, 0)\nor r2.xy, r2.yzyy, r2.xyxx\nif_nz r2.x\n  ishl r3.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r1.xyzw, r3.xyzw, r4.xyzw\nendif \nif_nz r2.y\n  ushr r3.xyzw, r1.xyzw, l(16, 16, 16, 16)\n  bfi r1.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r1.xyzw, r3.xyzw\nendif \nushr r2.zw, r1.xxxy, l(0, 0, 16, 16)\nbfi r3.xyzw, l(8, 8, 8, 8), l(16, 16, 16, 16), r1.xxyy, l(0, 0, 0, 0)\nimul null, r3.xyzw, r3.xyzw, l(257, 257, 257, 257)\nbfi r3.xyzw, l(8, 8, 8, 8), l(0, 0, 0, 0), r2.zzww, r3.xyzw\nand r4.xz, r1.xxyx, l(0x0000ff00, 0, 0x0000ff00, 0)\nand r4.yw, r2.zzzw, l(0, 0x0000ff00, 0, 0x0000ff00)\niadd r3.xyzw, r3.xyzw, r4.xyzw\nushr r1.xy, r1.zwzz, l(16, 16, 0, 0)\nbfi r4.xyzw, l(8, 8, 8, 8), l(16, 16, 16, 16), r1.zzww, l(0, 0, 0, 0)\nimul null, r4.xyzw, r4.xyzw, l(257, 257, 257, 257)\nbfi r4.xyzw, l(8, 8, 8, 8), l(0, 0, 0, 0), r1.xxyy, r4.xyzw\nand r5.xyzw, r1.zxwy, l(0x0000ff00, 0x0000ff00, 0x0000ff00, 0x0000ff00)\niadd r1.xyzw, r4.xyzw, r5.xyzw\nstore_raw U0[0].xyzw, r0.w, r3.xyzw\niadd r3.xyz, r0.wwww, l(16, 32, 48, 0)\nstore_raw U0[0].xyzw, r3.x, r1.xyzw\nif_nz r0.x\n  mov r0.x, l(32)\nelse \n  mov r0.x, l(16)\nendif \niadd r0.x, r0.x, r0.y\nld_raw r1.xyzw, r0.x, T0[0].xyzw\nif_nz r2.x\n  ishl r4.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r5.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r5.xyzw, r5.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r1.xyzw, r4.xyzw, r5.xyzw\nendif \nif_nz r2.y\n  ushr r2.xyzw, r1.xyzw, l(16, 16, 16, 16)\n  bfi r1.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r1.xyzw, r2.xyzw\nendif \nushr r0.xy, r1.xyxx, l(16, 16, 0, 0)\nbfi r2.xyzw, l(8, 8, 8, 8), l(16, 16, 16, 16), r1.xxyy, l(0, 0, 0, 0)\nimul null, r2.xyzw, r2.xyzw, l(257, 257, 257, 257)\nbfi r2.xyzw, l(8, 8, 8, 8), l(0, 0, 0, 0), r0.xxyy, r2.xyzw\nand r4.xz, r1.xxyx, l(0x0000ff00, 0, 0x0000ff00, 0)\nand r4.yw, r0.xxxy, l(0, 0x0000ff00, 0, 0x0000ff00)\niadd r2.xyzw, r2.xyzw, r4.xyzw\nushr r0.xy, r1.zwzz, l(16, 16, 0, 0)\nbfi r4.xyzw, l(8, 8, 8, 8), l(16, 16, 16, 16), r1.zzww, l(0, 0, 0, 0)\nimul null, r4.xyzw, r4.xyzw, l(257, 257, 257, 257)\nbfi r4.xyzw, l(8, 8, 8, 8), l(0, 0, 0, 0), r0.xxyy, r4.xyzw\nand r1.xz, r1.zzwz, l(0x0000ff00, 0, 0x0000ff00, 0)\nand r1.yw, r0.xxxy, l(0, 0x0000ff00, 0, 0x0000ff00)\niadd r1.xyzw, r1.xyzw, r4.xyzw\nstore_raw U0[0].xyzw, r3.y, r2.xyzw\nstore_raw U0[0].xyzw, r3.z, r1.xyzw\nret \n// Approximately 120 instruction slots used\n#endif\n\nconst BYTE texture_load_bgrg8_rgb8_cs[] =\n{\n     68,  88,  66,  67,  45, 210, \n    168,  26, 251,  89, 206, 204, \n    233, 215, 214,  44, 190, 156, \n    111, 103,   1,   0,   0,   0, \n    240,  21,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n     84,  21,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n     24,  17,   0,   0,  81,   0, \n      5,   0,  70,   4,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   6,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  12,  50,   0,  16,   0, \n      0,   0,   0,   0,   6, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n    194,   0,  16,   0,   0,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0,   6, 132, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  11, \n     66,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,   2,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,  11, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  31,   0, \n      0,   3,  10,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  58, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  42,   0,   2,   0, \n     26,   0,   2,   0,  35,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     41,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  18,   0, \n      0,   1,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,  12, \n    194,   0,  16,   0,   1,   0, \n      0,   0, 166, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0,  42,   0,   0,   9, \n    242,   0,  16,   0,   2,   0, \n      0,   0, 102,   5,   2,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      1,   0,   0,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 139,   0,   0,   8, \n    130,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     27,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10,   0,   2,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  19, 194,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0, 166,   6,   2,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     25,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  87,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0, 138,   0,   0,   9, \n     18,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  20, \n     98,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  11,   0, \n      0,   0,   0,   0,   0,   0, \n    166,  10,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  87,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  64,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    139,   0,   0,  15,  50,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  27,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  18,   0, \n      0,   1,  85,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  42,   0,   0,   9, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  86,   5,   2,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   1,   0,   0,   0, \n      4,   0,   0,   0,   3,   0, \n      0,   0, 139,   0,   0,   8, \n     66,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     27,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10,   0,   2,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  20, 114,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0, 214,   6,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  26,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0, 138,   0,   0,   9, \n     18,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  87,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  10,  66,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  26,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  64,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 139,   0,   0,  15, \n    194,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  27,   0,   0,   0, \n     24,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  21,   0, \n      0,   1,  30,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  32,   0, \n      0,  10, 114,   0,  16,   0, \n      2,   0,   0,   0, 166,  10, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   2,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   2,   0, \n      0,   0, 150,   5,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,  85,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     21,   0,   0,   1,  85,   0, \n      0,  10, 194,   0,  16,   0, \n      2,   0,   0,   0,   6,   4, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 140,   0,   0,  20, \n    242,   0,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      6,   5,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  38,   0, \n      0,  11,   0, 208,   0,   0, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   1,   1,   0,   0, \n      1,   1,   0,   0,   1,   1, \n      0,   0,   1,   1,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 166,  15, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   1,   0,   0,  10, \n     82,   0,  16,   0,   4,   0, \n      0,   0,   6,   1,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0, 255,   0,   0, \n      0,   0,   0,   0,   0, 255, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 162,   0, \n     16,   0,   4,   0,   0,   0, \n    166,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0, 255, \n      0,   0,   0,   0,   0,   0, \n      0, 255,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   1,   0, \n      0,   0, 230,  10,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  20, 242,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 166,  15, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  38,   0,   0,  11, \n      0, 208,   0,   0, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   1,   0,   0,   1,   1, \n      0,   0,   1,   1,   0,   0, \n      1,   1,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   6,   5,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     38,   7,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0,   0,   0, 255, \n      0,   0,   0, 255,   0,   0, \n      0, 255,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n      3,   0,   0,   0, 246,  15, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  32,   0,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  31,   0, \n      4,   3,  10,   0,  16,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  32,   0,   0,   0, \n     18,   0,   0,   1,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n     21,   0,   0,   1,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  31,   0, \n      4,   3,  10,   0,  16,   0, \n      2,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      2,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  21,   0, \n      0,   1,  85,   0,   0,  10, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  20, 242,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   6,   5, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  38,   0,   0,  11, \n      0, 208,   0,   0, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   1,   0,   0,   1,   1, \n      0,   0,   1,   1,   0,   0, \n      1,   1,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   6,   5,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      1,   0,   0,  10,  82,   0, \n     16,   0,   4,   0,   0,   0, \n      6,   1,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0,   0,   0,   0, \n      0,   0,   0, 255,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 162,   0,  16,   0, \n      4,   0,   0,   0,   6,   4, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0, 255,   0,   0, \n      0,   0,   0,   0,   0, 255, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     85,   0,   0,  10,  50,   0, \n     16,   0,   0,   0,   0,   0, \n    230,  10,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 166,  15,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     38,   0,   0,  11,   0, 208, \n      0,   0, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   1,   1, \n      0,   0,   1,   1,   0,   0, \n      1,   1,   0,   0,   1,   1, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      6,   5,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   1,   0, \n      0,  10,  82,   0,  16,   0, \n      1,   0,   0,   0, 166,  11, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0,   0,   0,   0,   0,   0, \n      0, 255,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    162,   0,  16,   0,   1,   0, \n      0,   0,   6,   4,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0, 255,   0,   0,   0,   0, \n      0,   0,   0, 255,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  62,   0,   0,   1, \n     83,  84,  65,  84, 148,   0, \n      0,   0, 120,   0,   0,   0, \n      6,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  34,   0, \n      0,   0,  28,   0,   0,   0, \n      5,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_bgrg8_rgbg8_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 5\ndcl_thread_group 4, 32, 1\nand r0.xy, CB0[0][0].xxxx, l(1, 2, 0, 0)\nishl r1.x, vThreadID.x, l(3)\nmov r1.y, vThreadID.y\nuge r0.zw, r1.xxxy, CB0[0][1].xxxy\nor r0.z, r0.w, r0.z\nif_nz r0.z\n  ret \nendif \nubfe r0.z, l(2), l(2), CB0[0][0].x\nishl r0.w, r1.x, l(2)\nimad r1.y, vThreadID.z, CB0[0][1].y, vThreadID.y\nimad r0.w, r1.y, CB0[0][2].x, r0.w\niadd r0.w, r0.w, CB0[0][1].w\nif_z r0.x\n  imad r1.y, CB0[0][0].w, vThreadID.z, vThreadID.y\n  imad r1.y, CB0[0][0].z, r1.y, r1.x\n  ishl r1.y, r1.y, l(2)\nelse \n  if_nz r0.y\n    ushr r1.zw, CB0[0][0].zzzw, l(0, 0, 5, 4)\n    ishr r2.xyzw, vThreadID.zyyy, l(2, 4, 1, 3)\n    imad r0.y, r2.x, r1.w, r2.y\n    ibfe r1.w, l(27), l(2), vThreadID.x\n    imad r0.y, r0.y, r1.z, r1.w\n    bfi r1.zw, l(0, 0, 2, 1), l(0, 0, 5, 4), vThreadID.zzzy, l(0, 0, 0, 0)\n    bfi r2.y, l(2), l(3), r2.z, l(0)\n    iadd r1.z, r1.z, r2.y\n    bfi r0.y, l(25), l(7), r0.y, r1.z\n    xor r1.z, r2.x, r2.w\n    ubfe r2.x, l(2), l(3), r1.x\n    bfi r2.yz, l(0, 1, 1, 0), l(0, 1, 11, 0), r1.zzzz, l(0, 0, 0, 0)\n    xor r1.z, r2.y, r2.x\n    imad r1.z, r1.z, l(64), r1.w\n    iadd r1.z, r2.z, r1.z\n    ibfe r2.xy, l(27, 24, 0, 0), l(3, 6, 0, 0), r0.yyyy\n    bfi r0.y, l(3), l(8), r2.x, r1.z\n    bfi r1.y, l(20), l(12), r2.y, r0.y\n  else \n    ushr r0.y, CB0[0][0].z, l(5)\n    ishr r2.xyzw, vThreadID.yyyy, l(5, 1, 4, 3)\n    ibfe r1.z, l(27), l(2), vThreadID.x\n    imad r0.y, r2.x, r0.y, r1.z\n    bfi r2.xyz, l(3, 1, 1, 0), l(3, 1, 11, 0), r2.ywzy, l(0, 0, 0, 0)\n    bfi r0.y, l(26), l(6), r0.y, r2.x\n    ubfe r1.x, l(2), l(3), r1.x\n    xor r1.x, r2.y, r1.x\n    bfi r1.z, l(1), l(4), vThreadID.y, l(0)\n    imad r1.x, r1.x, l(64), r1.z\n    iadd r1.x, r2.z, r1.x\n    ibfe r1.zw, l(0, 0, 27, 24), l(0, 0, 3, 6), r0.yyyy\n    bfi r0.y, l(3), l(8), r1.z, r1.x\n    bfi r1.y, l(20), l(12), r1.w, r0.y\n  endif \nendif \niadd r0.y, r1.y, CB0[0][0].y\nld_raw r1.xyzw, r0.y, T0[0].xyzw\nieq r2.xyz, r0.zzzz, l(1, 2, 3, 0)\nor r2.xy, r2.yzyy, r2.xyxx\nif_nz r2.x\n  ishl r3.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r1.xyzw, r3.xyzw, r4.xyzw\nendif \nif_nz r2.y\n  ushr r3.xyzw, r1.xyzw, l(16, 16, 16, 16)\n  bfi r1.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r1.xyzw, r3.xyzw\nendif \nand r3.xyzw, r1.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\nbfi r3.xyzw, l(8, 8, 8, 8), l(16, 16, 16, 16), r1.xyzw, r3.xyzw\nubfe r1.xyzw, l(8, 8, 8, 8), l(16, 16, 16, 16), r1.xyzw\niadd r1.xyzw, r3.xyzw, r1.xyzw\nstore_raw U0[0].xyzw, r0.w, r1.xyzw\niadd r0.z, r0.w, l(16)\nif_nz r0.x\n  mov r0.x, l(32)\nelse \n  mov r0.x, l(16)\nendif \niadd r0.x, r0.x, r0.y\nld_raw r1.xyzw, r0.x, T0[0].xyzw\nif_nz r2.x\n  ishl r3.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r1.xyzw, r3.xyzw, r4.xyzw\nendif \nif_nz r2.y\n  ushr r2.xyzw, r1.xyzw, l(16, 16, 16, 16)\n  bfi r1.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r1.xyzw, r2.xyzw\nendif \nand r2.xyzw, r1.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\nbfi r2.xyzw, l(8, 8, 8, 8), l(16, 16, 16, 16), r1.xyzw, r2.xyzw\nubfe r1.xyzw, l(8, 8, 8, 8), l(16, 16, 16, 16), r1.xyzw\niadd r1.xyzw, r2.xyzw, r1.xyzw\nstore_raw U0[0].xyzw, r0.z, r1.xyzw\nret \n// Approximately 99 instruction slots used\n#endif\n\nconst BYTE texture_load_bgrg8_rgbg8_cs[] =\n{\n     68,  88,  66,  67,  12,  53, \n     79, 131,  84,  91, 168,  53, \n    227, 223,  54, 236,  12, 202, \n    185, 224,   1,   0,   0,   0, \n      4,  18,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n    104,  17,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n     44,  13,   0,   0,  81,   0, \n      5,   0,  75,   3,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   5,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  12,  50,   0,  16,   0, \n      0,   0,   0,   0,   6, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n    194,   0,  16,   0,   0,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0,   6, 132, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  11, \n     66,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,   2,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,  11, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  31,   0, \n      0,   3,  10,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  58, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  42,   0,   2,   0, \n     26,   0,   2,   0,  35,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     41,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  18,   0, \n      0,   1,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,  12, \n    194,   0,  16,   0,   1,   0, \n      0,   0, 166, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0,  42,   0,   0,   9, \n    242,   0,  16,   0,   2,   0, \n      0,   0, 102,   5,   2,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      1,   0,   0,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 139,   0,   0,   8, \n    130,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     27,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10,   0,   2,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  19, 194,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0, 166,   6,   2,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     25,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  87,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0, 138,   0,   0,   9, \n     18,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  20, \n     98,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  11,   0, \n      0,   0,   0,   0,   0,   0, \n    166,  10,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  87,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  64,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    139,   0,   0,  15,  50,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  27,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  18,   0, \n      0,   1,  85,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  42,   0,   0,   9, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  86,   5,   2,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   1,   0,   0,   0, \n      4,   0,   0,   0,   3,   0, \n      0,   0, 139,   0,   0,   8, \n     66,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     27,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10,   0,   2,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  20, 114,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0, 214,   6,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  26,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0, 138,   0,   0,   9, \n     18,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  87,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  10,  66,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  26,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  64,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 139,   0,   0,  15, \n    194,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  27,   0,   0,   0, \n     24,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  21,   0, \n      0,   1,  30,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  32,   0, \n      0,  10, 114,   0,  16,   0, \n      2,   0,   0,   0, 166,  10, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   2,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   2,   0, \n      0,   0, 150,   5,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,  85,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     21,   0,   0,   1,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255, 140,   0,   0,  17, \n    242,   0,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     32,   0,   0,   0,  18,   0, \n      0,   1,  54,   0,   0,   5, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0,  21,   0, \n      0,   1,  30,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  21,   0,   0,   1, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     62,   0,   0,   1,  83,  84, \n     65,  84, 148,   0,   0,   0, \n     99,   0,   0,   0,   5,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  28,   0,   0,   0, \n     19,   0,   0,   0,   5,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_ctx1_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 8\ndcl_thread_group 4, 32, 1\nand r0.xy, CB0[0][0].xxxx, l(1, 2, 0, 0)\nishl r1.x, vThreadID.x, l(2)\nmov r1.y, vThreadID.y\nuge r0.zw, r1.xxxy, CB0[0][1].xxxy\nor r0.z, r0.w, r0.z\nif_nz r0.z\n  ret \nendif \nubfe r0.z, l(2), l(2), CB0[0][0].x\nishl r1.yz, r1.xxyx, l(0, 2, 2, 0)\nishl r0.w, r1.y, l(1)\nimad r1.y, vThreadID.z, CB0[0][2].y, r1.z\nimad r0.w, r1.y, CB0[0][2].x, r0.w\niadd r0.w, r0.w, CB0[0][1].w\nif_z r0.x\n  imad r1.y, CB0[0][0].w, vThreadID.z, vThreadID.y\n  imad r1.y, CB0[0][0].z, r1.y, r1.x\n  ishl r1.y, r1.y, l(3)\nelse \n  if_nz r0.y\n    ushr r1.zw, CB0[0][0].zzzw, l(0, 0, 5, 4)\n    ishr r2.xyzw, vThreadID.zyyy, l(2, 4, 1, 3)\n    imad r0.y, r2.x, r1.w, r2.y\n    ibfe r1.w, l(27), l(3), vThreadID.x\n    imad r0.y, r0.y, r1.z, r1.w\n    bfi r1.zw, l(0, 0, 2, 1), l(0, 0, 5, 4), vThreadID.zzzy, l(0, 0, 0, 0)\n    bfi r2.y, l(2), l(3), r2.z, l(0)\n    iadd r1.z, r1.z, r2.y\n    bfi r1.z, l(3), l(0), r1.x, r1.z\n    bfi r0.y, l(25), l(7), r0.y, r1.z\n    xor r1.z, r2.x, r2.w\n    ubfe r2.x, l(2), l(3), r1.x\n    bfi r2.yz, l(0, 1, 1, 0), l(0, 1, 11, 0), r1.zzzz, l(0, 0, 0, 0)\n    xor r1.z, r2.y, r2.x\n    imad r1.z, r1.z, l(64), r1.w\n    iadd r1.z, r2.z, r1.z\n    ibfe r2.xy, l(27, 24, 0, 0), l(2, 5, 0, 0), r0.yyyy\n    bfi r0.y, l(3), l(8), r2.x, r1.z\n    bfi r1.y, l(20), l(12), r2.y, r0.y\n  else \n    ushr r0.y, CB0[0][0].z, l(5)\n    ishr r2.xyzw, vThreadID.yyyy, l(5, 1, 4, 3)\n    ibfe r1.z, l(27), l(3), vThreadID.x\n    imad r0.y, r2.x, r0.y, r1.z\n    bfi r2.xyz, l(3, 1, 1, 0), l(3, 1, 11, 0), r2.ywzy, l(0, 0, 0, 0)\n    bfi r1.z, l(3), l(0), r1.x, r2.x\n    bfi r0.y, l(26), l(6), r0.y, r1.z\n    ubfe r1.x, l(2), l(3), r1.x\n    xor r1.x, r2.y, r1.x\n    bfi r1.z, l(1), l(4), vThreadID.y, l(0)\n    imad r1.x, r1.x, l(64), r1.z\n    iadd r1.x, r2.z, r1.x\n    ibfe r1.zw, l(0, 0, 27, 24), l(0, 0, 2, 5), r0.yyyy\n    bfi r0.y, l(3), l(8), r1.z, r1.x\n    bfi r1.y, l(20), l(12), r1.w, r0.y\n  endif \nendif \niadd r0.y, r1.y, CB0[0][0].y\nld_raw r1.xyzw, r0.y, T0[0].xzyw\nieq r2.xyz, r0.zzzz, l(1, 2, 3, 0)\nor r2.xy, r2.yzyy, r2.xyxx\nif_nz r2.x\n  ishl r3.xyzw, r1.xzyw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r1.xzyw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r1.xyzw, r3.xzyw, r4.xzyw\nendif \nif_nz r2.y\n  ushr r3.xyzw, r1.xzyw, l(16, 16, 16, 16)\n  bfi r1.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r1.xyzw, r3.xzyw\nendif \nubfe r2.zw, l(0, 0, 8, 8), l(0, 0, 8, 8), r1.xxxy\nbfi r3.xy, l(8, 8, 0, 0), l(16, 16, 0, 0), r1.xyxx, l(0, 0, 0, 0)\niadd r2.zw, r2.zzzw, r3.xxxy\nushr r3.xy, r1.xyxx, l(24, 24, 0, 0)\nand r1.xy, r1.xyxx, l(0x00ff0000, 0x00ff0000, 0, 0)\niadd r1.xy, r1.xyxx, r3.xyxx\nishl r3.xy, r1.zwzz, l(1, 1, 0, 0)\nand r3.xy, r3.xyxx, l(0xaaaaaaaa, 0xaaaaaaaa, 0, 0)\nushr r1.zw, r1.zzzw, l(0, 0, 1, 1)\nand r1.zw, r1.zzzw, l(0, 0, 0x55555555, 0x55555555)\niadd r1.zw, r1.zzzw, r3.xxxy\nushr r3.xy, r1.zwzz, l(1, 1, 0, 0)\nand r3.xy, r3.xyxx, l(0x55555555, 0x55555555, 0, 0)\nxor r1.zw, r1.zzzw, r3.xxxy\nnot r3.xy, r1.wzww\nushr r4.yzw, r3.yyyy, l(0, 4, 2, 6)\nmov r4.x, r3.y\nand r4.xyzw, r4.xyzw, l(3, 3, 3, 3)\nushr r5.yzw, r1.zzzz, l(0, 4, 2, 6)\nmov r5.x, r1.z\nand r5.xyzw, r5.xyzw, l(3, 3, 3, 3)\nimul null, r5.xyzw, r1.xxxx, r5.xyzw\nimad r4.xyzw, r4.xyzw, r2.zzzz, r5.xyzw\nand r5.xyzw, r4.xyzw, l(2047, 2047, 2047, 2047)\nudiv r5.xyzw, null, r5.xyzw, l(3, 3, 3, 3)\nushr r4.xyzw, r4.xyzw, l(16, 16, 16, 16)\nudiv r4.xyzw, null, r4.xyzw, l(3, 3, 3, 3)\nishl r4.xyzw, r4.xyzw, l(8, 8, 24, 24)\nor r4.xy, r4.xyxx, r5.xyxx\nishl r5.xy, r5.zwzz, l(16, 16, 0, 0)\nor r4.xy, r4.xyxx, r5.xyxx\nor r4.xy, r4.zwzz, r4.xyxx\nushr r3.yzw, r3.xxxx, l(0, 4, 2, 6)\nand r3.xyzw, r3.xyzw, l(3, 3, 3, 3)\nushr r5.yzw, r1.wwww, l(0, 4, 2, 6)\nmov r5.x, r1.w\nand r5.xyzw, r5.xyzw, l(3, 3, 3, 3)\nimul null, r5.xyzw, r1.yyyy, r5.xyzw\nimad r3.xyzw, r3.xyzw, r2.wwww, r5.xyzw\nand r5.xyzw, r3.xyzw, l(2047, 2047, 2047, 2047)\nudiv r5.xyzw, null, r5.xyzw, l(3, 3, 3, 3)\nushr r3.xyzw, r3.xyzw, l(16, 16, 16, 16)\nudiv r3.xyzw, null, r3.xyzw, l(3, 3, 3, 3)\nishl r3.xyzw, r3.xyzw, l(8, 8, 24, 24)\nor r3.xy, r3.xyxx, r5.xyxx\nishl r5.xy, r5.zwzz, l(16, 16, 0, 0)\nor r3.xy, r3.xyxx, r5.xyxx\nor r4.zw, r3.zzzw, r3.xxxy\nstore_raw U0[0].xyzw, r0.w, r4.xyzw\nimad r0.z, vThreadID.y, l(4), l(1)\nult r0.z, r0.z, CB0[0][2].y\nif_nz r0.z\n  iadd r3.x, r0.w, CB0[0][2].x\n  ushr r4.xy, r1.wzww, l(8, 8, 0, 0)\n  not r5.xy, r4.xyxx\n  ushr r6.yzw, r5.yyyy, l(0, 4, 2, 6)\n  mov r6.x, r5.y\n  and r6.xyzw, r6.xyzw, l(3, 3, 3, 3)\n  ushr r7.yzw, r4.yyyy, l(0, 4, 2, 6)\n  mov r7.x, r4.y\n  and r7.xyzw, r7.xyzw, l(3, 3, 3, 3)\n  imul null, r7.xyzw, r1.xxxx, r7.xyzw\n  imad r6.xyzw, r6.xyzw, r2.zzzz, r7.xyzw\n  and r7.xyzw, r6.xyzw, l(2047, 2047, 2047, 2047)\n  udiv r7.xyzw, null, r7.xyzw, l(3, 3, 3, 3)\n  ushr r6.xyzw, r6.xyzw, l(16, 16, 16, 16)\n  udiv r6.xyzw, null, r6.xyzw, l(3, 3, 3, 3)\n  ishl r6.xyzw, r6.xyzw, l(8, 8, 24, 24)\n  or r3.yz, r6.xxyx, r7.xxyx\n  ishl r6.xy, r7.zwzz, l(16, 16, 0, 0)\n  or r3.yz, r3.yyzy, r6.xxyx\n  or r6.xy, r6.zwzz, r3.yzyy\n  ushr r5.yzw, r5.xxxx, l(0, 4, 2, 6)\n  and r5.xyzw, r5.xyzw, l(3, 3, 3, 3)\n  ushr r4.yzw, r4.xxxx, l(0, 4, 2, 6)\n  and r4.xyzw, r4.xyzw, l(3, 3, 3, 3)\n  imul null, r4.xyzw, r1.yyyy, r4.xyzw\n  imad r4.xyzw, r5.xyzw, r2.wwww, r4.xyzw\n  and r5.xyzw, r4.xyzw, l(2047, 2047, 2047, 2047)\n  udiv r5.xyzw, null, r5.xyzw, l(3, 3, 3, 3)\n  ushr r4.xyzw, r4.xyzw, l(16, 16, 16, 16)\n  udiv r4.xyzw, null, r4.xyzw, l(3, 3, 3, 3)\n  ishl r4.xyzw, r4.xyzw, l(8, 8, 24, 24)\n  or r3.yz, r4.xxyx, r5.xxyx\n  ishl r4.xy, r5.zwzz, l(16, 16, 0, 0)\n  or r3.yz, r3.yyzy, r4.xxyx\n  or r6.zw, r4.zzzw, r3.yyyz\n  store_raw U0[0].xyzw, r3.x, r6.xyzw\n  imad r3.x, vThreadID.y, l(4), l(2)\n  ult r3.x, r3.x, CB0[0][2].y\n  if_nz r3.x\n    ishl r3.x, CB0[0][2].x, l(1)\n    iadd r3.x, r0.w, r3.x\n    ushr r4.xy, r1.wzww, l(16, 16, 0, 0)\n    not r5.xy, r4.xyxx\n    ushr r6.yzw, r5.yyyy, l(0, 4, 2, 6)\n    mov r6.x, r5.y\n    and r6.xyzw, r6.xyzw, l(3, 3, 3, 3)\n    ushr r7.yzw, r4.yyyy, l(0, 4, 2, 6)\n    mov r7.x, r4.y\n    and r7.xyzw, r7.xyzw, l(3, 3, 3, 3)\n    imul null, r7.xyzw, r1.xxxx, r7.xyzw\n    imad r6.xyzw, r6.xyzw, r2.zzzz, r7.xyzw\n    and r7.xyzw, r6.xyzw, l(2047, 2047, 2047, 2047)\n    udiv r7.xyzw, null, r7.xyzw, l(3, 3, 3, 3)\n    ushr r6.xyzw, r6.xyzw, l(16, 16, 16, 16)\n    udiv r6.xyzw, null, r6.xyzw, l(3, 3, 3, 3)\n    ishl r6.xyzw, r6.xyzw, l(8, 8, 24, 24)\n    or r3.yz, r6.xxyx, r7.xxyx\n    ishl r6.xy, r7.zwzz, l(16, 16, 0, 0)\n    or r3.yz, r3.yyzy, r6.xxyx\n    or r6.xy, r6.zwzz, r3.yzyy\n    ushr r5.yzw, r5.xxxx, l(0, 4, 2, 6)\n    and r5.xyzw, r5.xyzw, l(3, 3, 3, 3)\n    ushr r4.yzw, r4.xxxx, l(0, 4, 2, 6)\n    and r4.xyzw, r4.xyzw, l(3, 3, 3, 3)\n    imul null, r4.xyzw, r1.yyyy, r4.xyzw\n    imad r4.xyzw, r5.xyzw, r2.wwww, r4.xyzw\n    and r5.xyzw, r4.xyzw, l(2047, 2047, 2047, 2047)\n    udiv r5.xyzw, null, r5.xyzw, l(3, 3, 3, 3)\n    ushr r4.xyzw, r4.xyzw, l(16, 16, 16, 16)\n    udiv r4.xyzw, null, r4.xyzw, l(3, 3, 3, 3)\n    ishl r4.xyzw, r4.xyzw, l(8, 8, 24, 24)\n    or r3.yz, r4.xxyx, r5.xxyx\n    ishl r4.xy, r5.zwzz, l(16, 16, 0, 0)\n    or r3.yz, r3.yyzy, r4.xxyx\n    or r6.zw, r4.zzzw, r3.yyyz\n    store_raw U0[0].xyzw, r3.x, r6.xyzw\n    imad r3.x, vThreadID.y, l(4), l(3)\n    ult r3.x, r3.x, CB0[0][2].y\n    if_nz r3.x\n      imad r3.x, l(3), CB0[0][2].x, r0.w\n      ushr r4.xy, r1.wzww, l(24, 24, 0, 0)\n      not r5.xy, r4.xyxx\n      ushr r6.yzw, r5.yyyy, l(0, 4, 2, 6)\n      mov r6.x, r5.y\n      and r6.xyzw, r6.xyzw, l(3, 3, 3, 3)\n      ushr r7.yzw, r4.yyyy, l(0, 4, 2, 6)\n      mov r7.x, r4.y\n      and r7.xyzw, r7.xyzw, l(3, 3, 3, 3)\n      imul null, r7.xyzw, r1.xxxx, r7.xyzw\n      imad r6.xyzw, r6.xyzw, r2.zzzz, r7.xyzw\n      and r7.xyzw, r6.xyzw, l(2047, 2047, 2047, 2047)\n      udiv r7.xyzw, null, r7.xyzw, l(3, 3, 3, 3)\n      ushr r6.xyzw, r6.xyzw, l(16, 16, 16, 16)\n      udiv r6.xyzw, null, r6.xyzw, l(3, 3, 3, 3)\n      ishl r6.xyzw, r6.xyzw, l(8, 8, 24, 24)\n      or r1.xz, r6.xxyx, r7.xxyx\n      ishl r3.yz, r7.zzwz, l(0, 16, 16, 0)\n      or r1.xz, r1.xxzx, r3.yyzy\n      or r6.xy, r6.zwzz, r1.xzxx\n      ushr r5.yzw, r5.xxxx, l(0, 4, 2, 6)\n      and r5.xyzw, r5.xyzw, l(3, 3, 3, 3)\n      ushr r4.yzw, r4.xxxx, l(0, 4, 2, 6)\n      and r4.xyzw, r4.xyzw, l(3, 3, 3, 3)\n      imul null, r1.xyzw, r1.yyyy, r4.xyzw\n      imad r1.xyzw, r5.xyzw, r2.wwww, r1.xyzw\n      and r4.xyzw, r1.xyzw, l(2047, 2047, 2047, 2047)\n      udiv r4.xyzw, null, r4.xyzw, l(3, 3, 3, 3)\n      ushr r1.xyzw, r1.xyzw, l(16, 16, 16, 16)\n      udiv r1.xyzw, null, r1.xyzw, l(3, 3, 3, 3)\n      ishl r1.xyzw, r1.xyzw, l(8, 8, 24, 24)\n      or r1.xy, r1.xyxx, r4.xyxx\n      ishl r2.zw, r4.zzzw, l(0, 0, 16, 16)\n      or r1.xy, r1.xyxx, r2.zwzz\n      or r6.zw, r1.zzzw, r1.xxxy\n      store_raw U0[0].xyzw, r3.x, r6.xyzw\n    endif \n  endif \nendif \niadd r0.w, r0.w, l(16)\nif_nz r0.x\n  mov r0.x, l(32)\nelse \n  mov r0.x, l(16)\nendif \niadd r0.x, r0.x, r0.y\nld_raw r1.xyzw, r0.x, T0[0].xzyw\nif_nz r2.x\n  ishl r3.xyzw, r1.xzyw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r1.xzyw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r1.xyzw, r3.xzyw, r4.xzyw\nendif \nif_nz r2.y\n  ushr r2.xyzw, r1.xzyw, l(16, 16, 16, 16)\n  bfi r1.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r1.xyzw, r2.xzyw\nendif \nubfe r0.xy, l(8, 8, 0, 0), l(8, 8, 0, 0), r1.xyxx\nbfi r2.xy, l(8, 8, 0, 0), l(16, 16, 0, 0), r1.xyxx, l(0, 0, 0, 0)\niadd r0.xy, r0.xyxx, r2.xyxx\nushr r2.xy, r1.xyxx, l(24, 24, 0, 0)\nand r1.xy, r1.xyxx, l(0x00ff0000, 0x00ff0000, 0, 0)\niadd r1.xy, r1.xyxx, r2.xyxx\nishl r2.xy, r1.zwzz, l(1, 1, 0, 0)\nand r2.xy, r2.xyxx, l(0xaaaaaaaa, 0xaaaaaaaa, 0, 0)\nushr r1.zw, r1.zzzw, l(0, 0, 1, 1)\nand r1.zw, r1.zzzw, l(0, 0, 0x55555555, 0x55555555)\niadd r1.zw, r1.zzzw, r2.xxxy\nushr r2.xy, r1.zwzz, l(1, 1, 0, 0)\nand r2.xy, r2.xyxx, l(0x55555555, 0x55555555, 0, 0)\nxor r1.zw, r1.zzzw, r2.xxxy\nnot r2.xy, r1.wzww\nushr r3.yzw, r2.yyyy, l(0, 4, 2, 6)\nmov r3.x, r2.y\nand r3.xyzw, r3.xyzw, l(3, 3, 3, 3)\nushr r4.yzw, r1.zzzz, l(0, 4, 2, 6)\nmov r4.x, r1.z\nand r4.xyzw, r4.xyzw, l(3, 3, 3, 3)\nimul null, r4.xyzw, r1.xxxx, r4.xyzw\nimad r3.xyzw, r3.xyzw, r0.xxxx, r4.xyzw\nand r4.xyzw, r3.xyzw, l(2047, 2047, 2047, 2047)\nudiv r4.xyzw, null, r4.xyzw, l(3, 3, 3, 3)\nushr r3.xyzw, r3.xyzw, l(16, 16, 16, 16)\nudiv r3.xyzw, null, r3.xyzw, l(3, 3, 3, 3)\nishl r3.xyzw, r3.xyzw, l(8, 8, 24, 24)\nor r3.xy, r3.xyxx, r4.xyxx\nishl r4.xy, r4.zwzz, l(16, 16, 0, 0)\nor r3.xy, r3.xyxx, r4.xyxx\nor r3.xy, r3.zwzz, r3.xyxx\nushr r2.yzw, r2.xxxx, l(0, 4, 2, 6)\nand r2.xyzw, r2.xyzw, l(3, 3, 3, 3)\nushr r4.yzw, r1.wwww, l(0, 4, 2, 6)\nmov r4.x, r1.w\nand r4.xyzw, r4.xyzw, l(3, 3, 3, 3)\nimul null, r4.xyzw, r1.yyyy, r4.xyzw\nimad r2.xyzw, r2.xyzw, r0.yyyy, r4.xyzw\nand r4.xyzw, r2.xyzw, l(2047, 2047, 2047, 2047)\nudiv r4.xyzw, null, r4.xyzw, l(3, 3, 3, 3)\nushr r2.xyzw, r2.xyzw, l(16, 16, 16, 16)\nudiv r2.xyzw, null, r2.xyzw, l(3, 3, 3, 3)\nishl r2.xyzw, r2.xyzw, l(8, 8, 24, 24)\nor r2.xy, r2.xyxx, r4.xyxx\nishl r4.xy, r4.zwzz, l(16, 16, 0, 0)\nor r2.xy, r2.xyxx, r4.xyxx\nor r3.zw, r2.zzzw, r2.xxxy\nstore_raw U0[0].xyzw, r0.w, r3.xyzw\nif_nz r0.z\n  iadd r0.z, r0.w, CB0[0][2].x\n  ushr r2.xy, r1.wzww, l(8, 8, 0, 0)\n  not r3.xy, r2.xyxx\n  ushr r4.yzw, r3.yyyy, l(0, 4, 2, 6)\n  mov r4.x, r3.y\n  and r4.xyzw, r4.xyzw, l(3, 3, 3, 3)\n  ushr r5.yzw, r2.yyyy, l(0, 4, 2, 6)\n  mov r5.x, r2.y\n  and r5.xyzw, r5.xyzw, l(3, 3, 3, 3)\n  imul null, r5.xyzw, r1.xxxx, r5.xyzw\n  imad r4.xyzw, r4.xyzw, r0.xxxx, r5.xyzw\n  and r5.xyzw, r4.xyzw, l(2047, 2047, 2047, 2047)\n  udiv r5.xyzw, null, r5.xyzw, l(3, 3, 3, 3)\n  ushr r4.xyzw, r4.xyzw, l(16, 16, 16, 16)\n  udiv r4.xyzw, null, r4.xyzw, l(3, 3, 3, 3)\n  ishl r4.xyzw, r4.xyzw, l(8, 8, 24, 24)\n  or r4.xy, r4.xyxx, r5.xyxx\n  ishl r5.xy, r5.zwzz, l(16, 16, 0, 0)\n  or r4.xy, r4.xyxx, r5.xyxx\n  or r4.xy, r4.zwzz, r4.xyxx\n  ushr r3.yzw, r3.xxxx, l(0, 4, 2, 6)\n  and r3.xyzw, r3.xyzw, l(3, 3, 3, 3)\n  ushr r2.yzw, r2.xxxx, l(0, 4, 2, 6)\n  and r2.xyzw, r2.xyzw, l(3, 3, 3, 3)\n  imul null, r2.xyzw, r1.yyyy, r2.xyzw\n  imad r2.xyzw, r3.xyzw, r0.yyyy, r2.xyzw\n  and r3.xyzw, r2.xyzw, l(2047, 2047, 2047, 2047)\n  udiv r3.xyzw, null, r3.xyzw, l(3, 3, 3, 3)\n  ushr r2.xyzw, r2.xyzw, l(16, 16, 16, 16)\n  udiv r2.xyzw, null, r2.xyzw, l(3, 3, 3, 3)\n  ishl r2.xyzw, r2.xyzw, l(8, 8, 24, 24)\n  or r2.xy, r2.xyxx, r3.xyxx\n  ishl r3.xy, r3.zwzz, l(16, 16, 0, 0)\n  or r2.xy, r2.xyxx, r3.xyxx\n  or r4.zw, r2.zzzw, r2.xxxy\n  store_raw U0[0].xyzw, r0.z, r4.xyzw\n  imad r0.z, vThreadID.y, l(4), l(2)\n  ult r0.z, r0.z, CB0[0][2].y\n  if_nz r0.z\n    ishl r0.z, CB0[0][2].x, l(1)\n    iadd r0.z, r0.z, r0.w\n    ushr r2.xy, r1.wzww, l(16, 16, 0, 0)\n    not r3.xy, r2.xyxx\n    ushr r4.yzw, r3.yyyy, l(0, 4, 2, 6)\n    mov r4.x, r3.y\n    and r4.xyzw, r4.xyzw, l(3, 3, 3, 3)\n    ushr r5.yzw, r2.yyyy, l(0, 4, 2, 6)\n    mov r5.x, r2.y\n    and r5.xyzw, r5.xyzw, l(3, 3, 3, 3)\n    imul null, r5.xyzw, r1.xxxx, r5.xyzw\n    imad r4.xyzw, r4.xyzw, r0.xxxx, r5.xyzw\n    and r5.xyzw, r4.xyzw, l(2047, 2047, 2047, 2047)\n    udiv r5.xyzw, null, r5.xyzw, l(3, 3, 3, 3)\n    ushr r4.xyzw, r4.xyzw, l(16, 16, 16, 16)\n    udiv r4.xyzw, null, r4.xyzw, l(3, 3, 3, 3)\n    ishl r4.xyzw, r4.xyzw, l(8, 8, 24, 24)\n    or r4.xy, r4.xyxx, r5.xyxx\n    ishl r5.xy, r5.zwzz, l(16, 16, 0, 0)\n    or r4.xy, r4.xyxx, r5.xyxx\n    or r4.xy, r4.zwzz, r4.xyxx\n    ushr r3.yzw, r3.xxxx, l(0, 4, 2, 6)\n    and r3.xyzw, r3.xyzw, l(3, 3, 3, 3)\n    ushr r2.yzw, r2.xxxx, l(0, 4, 2, 6)\n    and r2.xyzw, r2.xyzw, l(3, 3, 3, 3)\n    imul null, r2.xyzw, r1.yyyy, r2.xyzw\n    imad r2.xyzw, r3.xyzw, r0.yyyy, r2.xyzw\n    and r3.xyzw, r2.xyzw, l(2047, 2047, 2047, 2047)\n    udiv r3.xyzw, null, r3.xyzw, l(3, 3, 3, 3)\n    ushr r2.xyzw, r2.xyzw, l(16, 16, 16, 16)\n    udiv r2.xyzw, null, r2.xyzw, l(3, 3, 3, 3)\n    ishl r2.xyzw, r2.xyzw, l(8, 8, 24, 24)\n    or r2.xy, r2.xyxx, r3.xyxx\n    ishl r3.xy, r3.zwzz, l(16, 16, 0, 0)\n    or r2.xy, r2.xyxx, r3.xyxx\n    or r4.zw, r2.zzzw, r2.xxxy\n    store_raw U0[0].xyzw, r0.z, r4.xyzw\n    imad r0.z, vThreadID.y, l(4), l(3)\n    ult r0.z, r0.z, CB0[0][2].y\n    if_nz r0.z\n      imad r0.z, l(3), CB0[0][2].x, r0.w\n      ushr r2.xy, r1.wzww, l(24, 24, 0, 0)\n      not r3.xy, r2.xyxx\n      ushr r4.yzw, r3.yyyy, l(0, 4, 2, 6)\n      mov r4.x, r3.y\n      and r4.xyzw, r4.xyzw, l(3, 3, 3, 3)\n      ushr r5.yzw, r2.yyyy, l(0, 4, 2, 6)\n      mov r5.x, r2.y\n      and r5.xyzw, r5.xyzw, l(3, 3, 3, 3)\n      imul null, r5.xyzw, r1.xxxx, r5.xyzw\n      imad r4.xyzw, r4.xyzw, r0.xxxx, r5.xyzw\n      and r5.xyzw, r4.xyzw, l(2047, 2047, 2047, 2047)\n      udiv r5.xyzw, null, r5.xyzw, l(3, 3, 3, 3)\n      ushr r4.xyzw, r4.xyzw, l(16, 16, 16, 16)\n      udiv r4.xyzw, null, r4.xyzw, l(3, 3, 3, 3)\n      ishl r4.xyzw, r4.xyzw, l(8, 8, 24, 24)\n      or r0.xw, r4.xxxy, r5.xxxy\n      ishl r1.xz, r5.zzwz, l(16, 0, 16, 0)\n      or r0.xw, r0.xxxw, r1.xxxz\n      or r4.xy, r4.zwzz, r0.xwxx\n      ushr r3.yzw, r3.xxxx, l(0, 4, 2, 6)\n      and r3.xyzw, r3.xyzw, l(3, 3, 3, 3)\n      ushr r2.yzw, r2.xxxx, l(0, 4, 2, 6)\n      and r2.xyzw, r2.xyzw, l(3, 3, 3, 3)\n      imul null, r1.xyzw, r1.yyyy, r2.xyzw\n      imad r1.xyzw, r3.xyzw, r0.yyyy, r1.xyzw\n      and r2.xyzw, r1.xyzw, l(2047, 2047, 2047, 2047)\n      udiv r2.xyzw, null, r2.xyzw, l(3, 3, 3, 3)\n      ushr r1.xyzw, r1.xyzw, l(16, 16, 16, 16)\n      udiv r1.xyzw, null, r1.xyzw, l(3, 3, 3, 3)\n      ishl r1.xyzw, r1.xyzw, l(8, 8, 24, 24)\n      or r0.xy, r1.xyxx, r2.xyxx\n      ishl r1.xy, r2.zwzz, l(16, 16, 0, 0)\n      or r0.xy, r0.xyxx, r1.xyxx\n      or r4.zw, r1.zzzw, r0.xxxy\n      store_raw U0[0].xyzw, r0.z, r4.xyzw\n    endif \n  endif \nendif \nret \n// Approximately 430 instruction slots used\n#endif\n\nconst BYTE texture_load_ctx1_cs[] =\n{\n     68,  88,  66,  67,  62, 246, \n     87, 243, 122, 165, 143, 147, \n    255,  27,  67, 146, 117, 175, \n     17, 191,   1,   0,   0,   0, \n      4,  63,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n    104,  62,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n     44,  58,   0,   0,  81,   0, \n      5,   0, 139,  14,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   8,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  12,  50,   0,  16,   0, \n      0,   0,   0,   0,   6, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n    194,   0,  16,   0,   0,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0,   6, 132, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  11, \n     66,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10,  98,   0,  16,   0, \n      1,   0,   0,   0,   6,   1, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,   7, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     35,   0,   0,  10,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,   2,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  35,   0, \n      0,  11, 130,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     30,   0,   0,   9, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  58, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     31,   0,   0,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  42,   0, \n      2,   0,  26,   0,   2,   0, \n     35,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     42, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  41,   0,   0,   7, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     18,   0,   0,   1,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  12, 194,   0,  16,   0, \n      1,   0,   0,   0, 166, 142, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   5,   0,   0,   0, \n      4,   0,   0,   0,  42,   0, \n      0,   9, 242,   0,  16,   0, \n      2,   0,   0,   0, 102,   5, \n      2,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   1,   0,   0,   0, \n      3,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0, 139,   0, \n      0,   8, 130,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  27,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  10,   0,   2,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  19, 194,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   5,   0,   0,   0, \n      4,   0,   0,   0, 166,   6, \n      2,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  11,  66,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  25,   0, \n      0,   0,   1,  64,   0,   0, \n      7,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  87,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n    138,   0,   0,   9,  18,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  20,  98,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0, 166,  10, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,   9,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     64,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 139,   0, \n      0,  15,  50,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  27,   0,   0,   0, \n     24,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  86,   5,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   8,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  20,   0, \n      0,   0,   1,  64,   0,   0, \n     12,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  18,   0,   0,   1, \n     85,   0,   0,   9,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     42, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   5,   0,   0,   0, \n     42,   0,   0,   9, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     86,   5,   2,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n      1,   0,   0,   0,   4,   0, \n      0,   0,   3,   0,   0,   0, \n    139,   0,   0,   8,  66,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  27,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  10,   0, \n      2,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  20, \n    114,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,  11,   0, \n      0,   0,   0,   0,   0,   0, \n    214,   6,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  66,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  26,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0, 138,   0,   0,   9, \n     18,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  87,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  10,  66,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  26,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  64,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 139,   0,   0,  15, \n    194,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  27,   0,   0,   0, \n     24,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   5,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  21,   0, \n      0,   1,  30,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0, 134, 125, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  32,   0, \n      0,  10, 114,   0,  16,   0, \n      2,   0,   0,   0, 166,  10, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   2,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   2,   0, \n      0,   0, 150,   5,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n    134,  13,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,  85,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0, 134,  13,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      1,   0,   0,   0, 134,  13, \n     16,   0,   3,   0,   0,   0, \n    134,  13,  16,   0,   4,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n    134,  13,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0, 134,  13, \n     16,   0,   3,   0,   0,   0, \n     21,   0,   0,   1, 138,   0, \n      0,  15, 194,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  20,  50,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 194,   0, \n     16,   0,   2,   0,   0,   0, \n    166,  14,  16,   0,   2,   0, \n      0,   0,   6,   4,  16,   0, \n      3,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      3,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  24,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      3,   0,   0,   0,  41,   0, \n      0,  10,  50,   0,  16,   0, \n      3,   0,   0,   0, 230,  10, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n     50,   0,  16,   0,   3,   0, \n      0,   0,  70,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0, 170, 170, 170, 170, \n    170, 170, 170, 170,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     85,   0,   0,  10, 194,   0, \n     16,   0,   1,   0,   0,   0, \n    166,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  10, 194,   0,  16,   0, \n      1,   0,   0,   0, 166,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     85,  85,  85,  85,  85,  85, \n     85,  85,  30,   0,   0,   7, \n    194,   0,  16,   0,   1,   0, \n      0,   0, 166,  14,  16,   0, \n      1,   0,   0,   0,   6,   4, \n     16,   0,   3,   0,   0,   0, \n     85,   0,   0,  10,  50,   0, \n     16,   0,   3,   0,   0,   0, \n    230,  10,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10,  50,   0,  16,   0, \n      3,   0,   0,   0,  70,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,  85,  85, \n     85,  85,  85,  85,  85,  85, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n    194,   0,  16,   0,   1,   0, \n      0,   0, 166,  14,  16,   0, \n      1,   0,   0,   0,   6,   4, \n     16,   0,   3,   0,   0,   0, \n     59,   0,   0,   5,  50,   0, \n     16,   0,   3,   0,   0,   0, \n    182,  15,  16,   0,   1,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,   4,   0, \n      0,   0,  86,   5,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0,   6,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   4,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   5,   0,   0,   0, \n    166,  10,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n      6,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      5,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n    242,   0,  16,   0,   5,   0, \n      0,   0,   6,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     35,   0,   0,   9, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0, 166,  10,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   7,   0,   0, 255,   7, \n      0,   0, 255,   7,   0,   0, \n    255,   7,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n      5,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n      4,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,  24,   0,   0,   0, \n     24,   0,   0,   0,  60,   0, \n      0,   7,  50,   0,  16,   0, \n      4,   0,   0,   0,  70,   0, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   5,   0, \n      0,   0,  41,   0,   0,  10, \n     50,   0,  16,   0,   5,   0, \n      0,   0, 230,  10,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   4,   0, \n      0,   0,  70,   0,  16,   0, \n      5,   0,   0,   0,  60,   0, \n      0,   7,  50,   0,  16,   0, \n      4,   0,   0,   0, 230,  10, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   4,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,   3,   0, \n      0,   0,   6,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      5,   0,   0,   0, 246,  15, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0,   6,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   5,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  35,   0, \n      0,   9, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n    246,  15,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0, 255,   7, \n      0,   0, 255,   7,   0,   0, \n    255,   7,   0,   0, 255,   7, \n      0,   0,  78,   0,   0,  11, \n    242,   0,  16,   0,   5,   0, \n      0,   0,   0, 208,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  78,   0,   0,  11, \n    242,   0,  16,   0,   3,   0, \n      0,   0,   0, 208,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n     24,   0,   0,   0,  24,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   3,   0, \n      0,   0,  70,   0,  16,   0, \n      3,   0,   0,   0,  70,   0, \n     16,   0,   5,   0,   0,   0, \n     41,   0,   0,  10,  50,   0, \n     16,   0,   5,   0,   0,   0, \n    230,  10,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  60,   0, \n      0,   7,  50,   0,  16,   0, \n      3,   0,   0,   0,  70,   0, \n     16,   0,   3,   0,   0,   0, \n     70,   0,  16,   0,   5,   0, \n      0,   0,  60,   0,   0,   7, \n    194,   0,  16,   0,   4,   0, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,   6,   4, \n     16,   0,   3,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  35,   0,   0,   8, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,   2,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  79,   0, \n      0,   9,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   9,  18,   0,  16,   0, \n      3,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      4,   0,   0,   0, 182,  15, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  59,   0,   0,   5, \n     50,   0,  16,   0,   5,   0, \n      0,   0,  70,   0,  16,   0, \n      4,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      6,   0,   0,   0,  86,   5, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0,   6,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   6,   0, \n      0,   0,  26,   0,  16,   0, \n      5,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,   7,   0, \n      0,   0,  86,   5,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0,   6,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0, 242,   0,  16,   0, \n      7,   0,   0,   0,   6,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  35,   0,   0,   9, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0, 166,  10, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0, 255,   7,   0,   0, \n    255,   7,   0,   0, 255,   7, \n      0,   0, 255,   7,   0,   0, \n     78,   0,   0,  11, 242,   0, \n     16,   0,   7,   0,   0,   0, \n      0, 208,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     78,   0,   0,  11, 242,   0, \n     16,   0,   6,   0,   0,   0, \n      0, 208,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,  24,   0, \n      0,   0,  24,   0,   0,   0, \n     60,   0,   0,   7,  98,   0, \n     16,   0,   3,   0,   0,   0, \n      6,   1,  16,   0,   6,   0, \n      0,   0,   6,   1,  16,   0, \n      7,   0,   0,   0,  41,   0, \n      0,  10,  50,   0,  16,   0, \n      6,   0,   0,   0, 230,  10, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     98,   0,  16,   0,   3,   0, \n      0,   0,  86,   6,  16,   0, \n      3,   0,   0,   0,   6,   1, \n     16,   0,   6,   0,   0,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,   6,   0,   0,   0, \n    230,  10,  16,   0,   6,   0, \n      0,   0, 150,   5,  16,   0, \n      3,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      5,   0,   0,   0,   6,   0, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0,   6,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   4,   0,   0,   0, \n      6,   0,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  35,   0, \n      0,   9, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n    246,  15,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0, 255,   7, \n      0,   0, 255,   7,   0,   0, \n    255,   7,   0,   0, 255,   7, \n      0,   0,  78,   0,   0,  11, \n    242,   0,  16,   0,   5,   0, \n      0,   0,   0, 208,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  78,   0,   0,  11, \n    242,   0,  16,   0,   4,   0, \n      0,   0,   0, 208,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n     24,   0,   0,   0,  24,   0, \n      0,   0,  60,   0,   0,   7, \n     98,   0,  16,   0,   3,   0, \n      0,   0,   6,   1,  16,   0, \n      4,   0,   0,   0,   6,   1, \n     16,   0,   5,   0,   0,   0, \n     41,   0,   0,  10,  50,   0, \n     16,   0,   4,   0,   0,   0, \n    230,  10,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  60,   0, \n      0,   7,  98,   0,  16,   0, \n      3,   0,   0,   0,  86,   6, \n     16,   0,   3,   0,   0,   0, \n      6,   1,  16,   0,   4,   0, \n      0,   0,  60,   0,   0,   7, \n    194,   0,  16,   0,   6,   0, \n      0,   0, 166,  14,  16,   0, \n      4,   0,   0,   0,  86,   9, \n     16,   0,   3,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  35,   0,   0,   8, \n     18,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,   2,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  79,   0, \n      0,   9,  18,   0,  16,   0, \n      3,   0,   0,   0,  10,   0, \n     16,   0,   3,   0,   0,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,  31,   0, \n      4,   3,  10,   0,  16,   0, \n      3,   0,   0,   0,  41,   0, \n      0,   9,  18,   0,  16,   0, \n      3,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      3,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   3,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   4,   0, \n      0,   0, 182,  15,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     59,   0,   0,   5,  50,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   0,  16,   0,   4,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,   6,   0, \n      0,   0,  86,   5,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0,   6,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   6,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   7,   0,   0,   0, \n     86,   5,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n      6,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      7,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n    242,   0,  16,   0,   7,   0, \n      0,   0,   6,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n     35,   0,   0,   9, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0, 166,  10,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   7,   0,   0, 255,   7, \n      0,   0, 255,   7,   0,   0, \n    255,   7,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n      7,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n      6,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,  24,   0,   0,   0, \n     24,   0,   0,   0,  60,   0, \n      0,   7,  98,   0,  16,   0, \n      3,   0,   0,   0,   6,   1, \n     16,   0,   6,   0,   0,   0, \n      6,   1,  16,   0,   7,   0, \n      0,   0,  41,   0,   0,  10, \n     50,   0,  16,   0,   6,   0, \n      0,   0, 230,  10,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  98,   0, \n     16,   0,   3,   0,   0,   0, \n     86,   6,  16,   0,   3,   0, \n      0,   0,   6,   1,  16,   0, \n      6,   0,   0,   0,  60,   0, \n      0,   7,  50,   0,  16,   0, \n      6,   0,   0,   0, 230,  10, \n     16,   0,   6,   0,   0,   0, \n    150,   5,  16,   0,   3,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,   5,   0, \n      0,   0,   6,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      4,   0,   0,   0,   6,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0,   6,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0, 242,   0,  16,   0, \n      4,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  35,   0,   0,   9, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0, 246,  15, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0, 255,   7,   0,   0, \n    255,   7,   0,   0, 255,   7, \n      0,   0, 255,   7,   0,   0, \n     78,   0,   0,  11, 242,   0, \n     16,   0,   5,   0,   0,   0, \n      0, 208,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     78,   0,   0,  11, 242,   0, \n     16,   0,   4,   0,   0,   0, \n      0, 208,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,  24,   0, \n      0,   0,  24,   0,   0,   0, \n     60,   0,   0,   7,  98,   0, \n     16,   0,   3,   0,   0,   0, \n      6,   1,  16,   0,   4,   0, \n      0,   0,   6,   1,  16,   0, \n      5,   0,   0,   0,  41,   0, \n      0,  10,  50,   0,  16,   0, \n      4,   0,   0,   0, 230,  10, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     98,   0,  16,   0,   3,   0, \n      0,   0,  86,   6,  16,   0, \n      3,   0,   0,   0,   6,   1, \n     16,   0,   4,   0,   0,   0, \n     60,   0,   0,   7, 194,   0, \n     16,   0,   6,   0,   0,   0, \n    166,  14,  16,   0,   4,   0, \n      0,   0,  86,   9,  16,   0, \n      3,   0,   0,   0, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     35,   0,   0,   8,  18,   0, \n     16,   0,   3,   0,   0,   0, \n     26,   0,   2,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  79,   0,   0,   9, \n     18,   0,  16,   0,   3,   0, \n      0,   0,  10,   0,  16,   0, \n      3,   0,   0,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   3,   0, \n      0,   0,  35,   0,   0,  11, \n     18,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      4,   0,   0,   0, 182,  15, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  24,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  59,   0,   0,   5, \n     50,   0,  16,   0,   5,   0, \n      0,   0,  70,   0,  16,   0, \n      4,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      6,   0,   0,   0,  86,   5, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0,   6,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   6,   0, \n      0,   0,  26,   0,  16,   0, \n      5,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,   7,   0, \n      0,   0,  86,   5,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0,   6,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0, 242,   0,  16,   0, \n      7,   0,   0,   0,   6,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  35,   0,   0,   9, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0, 166,  10, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0, 255,   7,   0,   0, \n    255,   7,   0,   0, 255,   7, \n      0,   0, 255,   7,   0,   0, \n     78,   0,   0,  11, 242,   0, \n     16,   0,   7,   0,   0,   0, \n      0, 208,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     78,   0,   0,  11, 242,   0, \n     16,   0,   6,   0,   0,   0, \n      0, 208,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,  24,   0, \n      0,   0,  24,   0,   0,   0, \n     60,   0,   0,   7,  82,   0, \n     16,   0,   1,   0,   0,   0, \n      6,   1,  16,   0,   6,   0, \n      0,   0,   6,   1,  16,   0, \n      7,   0,   0,   0,  41,   0, \n      0,  10,  98,   0,  16,   0, \n      3,   0,   0,   0, 166,  11, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     82,   0,  16,   0,   1,   0, \n      0,   0,   6,   2,  16,   0, \n      1,   0,   0,   0,  86,   6, \n     16,   0,   3,   0,   0,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,   6,   0,   0,   0, \n    230,  10,  16,   0,   6,   0, \n      0,   0, 134,   0,  16,   0, \n      1,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      5,   0,   0,   0,   6,   0, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0,   6,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   4,   0,   0,   0, \n      6,   0,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  35,   0, \n      0,   9, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n    246,  15,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0, 255,   7, \n      0,   0, 255,   7,   0,   0, \n    255,   7,   0,   0, 255,   7, \n      0,   0,  78,   0,   0,  11, \n    242,   0,  16,   0,   4,   0, \n      0,   0,   0, 208,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  78,   0,   0,  11, \n    242,   0,  16,   0,   1,   0, \n      0,   0,   0, 208,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n     24,   0,   0,   0,  24,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   4,   0,   0,   0, \n     41,   0,   0,  10, 194,   0, \n     16,   0,   2,   0,   0,   0, \n    166,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  60,   0, \n      0,   7,  50,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n    230,  10,  16,   0,   2,   0, \n      0,   0,  60,   0,   0,   7, \n    194,   0,  16,   0,   6,   0, \n      0,   0, 166,  14,  16,   0, \n      1,   0,   0,   0,   6,   4, \n     16,   0,   1,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  21,   0,   0,   1, \n     21,   0,   0,   1,  21,   0, \n      0,   1,  30,   0,   0,   7, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  32,   0, \n      0,   0,  18,   0,   0,   1, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0,  21,   0,   0,   1, \n     30,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n    134, 125,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n    134,  13,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,  85,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0, 134,  13,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      1,   0,   0,   0, 134,  13, \n     16,   0,   3,   0,   0,   0, \n    134,  13,  16,   0,   4,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n    134,  13,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0, 134,  13, \n     16,   0,   2,   0,   0,   0, \n     21,   0,   0,   1, 138,   0, \n      0,  15,  50,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  20,  50,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  24,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,  41,   0, \n      0,  10,  50,   0,  16,   0, \n      2,   0,   0,   0, 230,  10, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n     50,   0,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0, 170, 170, 170, 170, \n    170, 170, 170, 170,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     85,   0,   0,  10, 194,   0, \n     16,   0,   1,   0,   0,   0, \n    166,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  10, 194,   0,  16,   0, \n      1,   0,   0,   0, 166,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     85,  85,  85,  85,  85,  85, \n     85,  85,  30,   0,   0,   7, \n    194,   0,  16,   0,   1,   0, \n      0,   0, 166,  14,  16,   0, \n      1,   0,   0,   0,   6,   4, \n     16,   0,   2,   0,   0,   0, \n     85,   0,   0,  10,  50,   0, \n     16,   0,   2,   0,   0,   0, \n    230,  10,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10,  50,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  85,  85, \n     85,  85,  85,  85,  85,  85, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n    194,   0,  16,   0,   1,   0, \n      0,   0, 166,  14,  16,   0, \n      1,   0,   0,   0,   6,   4, \n     16,   0,   2,   0,   0,   0, \n     59,   0,   0,   5,  50,   0, \n     16,   0,   2,   0,   0,   0, \n    182,  15,  16,   0,   1,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,   3,   0, \n      0,   0,  86,   5,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0,   6,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   3,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   4,   0,   0,   0, \n    166,  10,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n      6,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      4,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n    242,   0,  16,   0,   4,   0, \n      0,   0,   6,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     35,   0,   0,   9, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   6,   0,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   7,   0,   0, 255,   7, \n      0,   0, 255,   7,   0,   0, \n    255,   7,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n      4,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n      3,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,  24,   0,   0,   0, \n     24,   0,   0,   0,  60,   0, \n      0,   7,  50,   0,  16,   0, \n      3,   0,   0,   0,  70,   0, \n     16,   0,   3,   0,   0,   0, \n     70,   0,  16,   0,   4,   0, \n      0,   0,  41,   0,   0,  10, \n     50,   0,  16,   0,   4,   0, \n      0,   0, 230,  10,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,   3,   0,   0,   0, \n     70,   0,  16,   0,   3,   0, \n      0,   0,  70,   0,  16,   0, \n      4,   0,   0,   0,  60,   0, \n      0,   7,  50,   0,  16,   0, \n      3,   0,   0,   0, 230,  10, \n     16,   0,   3,   0,   0,   0, \n     70,   0,  16,   0,   3,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,   2,   0, \n      0,   0,   6,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      4,   0,   0,   0, 246,  15, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0,   6,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   4,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  35,   0, \n      0,   9, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0, 255,   7, \n      0,   0, 255,   7,   0,   0, \n    255,   7,   0,   0, 255,   7, \n      0,   0,  78,   0,   0,  11, \n    242,   0,  16,   0,   4,   0, \n      0,   0,   0, 208,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  78,   0,   0,  11, \n    242,   0,  16,   0,   2,   0, \n      0,   0,   0, 208,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n     24,   0,   0,   0,  24,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   4,   0,   0,   0, \n     41,   0,   0,  10,  50,   0, \n     16,   0,   4,   0,   0,   0, \n    230,  10,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  60,   0, \n      0,   7,  50,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,   4,   0, \n      0,   0,  60,   0,   0,   7, \n    194,   0,  16,   0,   3,   0, \n      0,   0, 166,  14,  16,   0, \n      2,   0,   0,   0,   6,   4, \n     16,   0,   2,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  31,   0,   4,   3, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  30,   0,   0,   9, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   2,   0, \n      0,   0, 182,  15,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     59,   0,   0,   5,  50,   0, \n     16,   0,   3,   0,   0,   0, \n     70,   0,  16,   0,   2,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,   4,   0, \n      0,   0,  86,   5,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0,   6,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   4,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   5,   0,   0,   0, \n     86,   5,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n      6,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      5,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n    242,   0,  16,   0,   5,   0, \n      0,   0,   6,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     35,   0,   0,   9, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   6,   0,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   7,   0,   0, 255,   7, \n      0,   0, 255,   7,   0,   0, \n    255,   7,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n      5,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n      4,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,  24,   0,   0,   0, \n     24,   0,   0,   0,  60,   0, \n      0,   7,  50,   0,  16,   0, \n      4,   0,   0,   0,  70,   0, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   5,   0, \n      0,   0,  41,   0,   0,  10, \n     50,   0,  16,   0,   5,   0, \n      0,   0, 230,  10,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   4,   0, \n      0,   0,  70,   0,  16,   0, \n      5,   0,   0,   0,  60,   0, \n      0,   7,  50,   0,  16,   0, \n      4,   0,   0,   0, 230,  10, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   4,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,   3,   0, \n      0,   0,   6,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      2,   0,   0,   0,   6,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0,   6,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0, 242,   0,  16,   0, \n      2,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  35,   0,   0,   9, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  86,   5, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0, 255,   7,   0,   0, \n    255,   7,   0,   0, 255,   7, \n      0,   0, 255,   7,   0,   0, \n     78,   0,   0,  11, 242,   0, \n     16,   0,   3,   0,   0,   0, \n      0, 208,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     78,   0,   0,  11, 242,   0, \n     16,   0,   2,   0,   0,   0, \n      0, 208,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,  24,   0, \n      0,   0,  24,   0,   0,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      3,   0,   0,   0,  41,   0, \n      0,  10,  50,   0,  16,   0, \n      3,   0,   0,   0, 230,  10, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   3,   0,   0,   0, \n     60,   0,   0,   7, 194,   0, \n     16,   0,   4,   0,   0,   0, \n    166,  14,  16,   0,   2,   0, \n      0,   0,   6,   4,  16,   0, \n      2,   0,   0,   0, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     35,   0,   0,   8,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,   2,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,  79,   0,   0,   9, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  31,   0,   4,   3, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  41,   0,   0,   9, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  10, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     85,   0,   0,  10,  50,   0, \n     16,   0,   2,   0,   0,   0, \n    182,  15,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  59,   0, \n      0,   5,  50,   0,  16,   0, \n      3,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   4,   0,   0,   0, \n     86,   5,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n      6,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      4,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      5,   0,   0,   0,  86,   5, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0,   6,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   5,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 242,   0, \n     16,   0,   5,   0,   0,   0, \n      6,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  35,   0, \n      0,   9, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      6,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0, 255,   7, \n      0,   0, 255,   7,   0,   0, \n    255,   7,   0,   0, 255,   7, \n      0,   0,  78,   0,   0,  11, \n    242,   0,  16,   0,   5,   0, \n      0,   0,   0, 208,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  78,   0,   0,  11, \n    242,   0,  16,   0,   4,   0, \n      0,   0,   0, 208,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n     24,   0,   0,   0,  24,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   4,   0, \n      0,   0,  70,   0,  16,   0, \n      4,   0,   0,   0,  70,   0, \n     16,   0,   5,   0,   0,   0, \n     41,   0,   0,  10,  50,   0, \n     16,   0,   5,   0,   0,   0, \n    230,  10,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  60,   0, \n      0,   7,  50,   0,  16,   0, \n      4,   0,   0,   0,  70,   0, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   5,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   4,   0, \n      0,   0, 230,  10,  16,   0, \n      4,   0,   0,   0,  70,   0, \n     16,   0,   4,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   3,   0,   0,   0, \n      6,   0,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,   2,   0, \n      0,   0,   6,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  86,   5,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,   9, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  86,   5,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   7,   0,   0, 255,   7, \n      0,   0, 255,   7,   0,   0, \n    255,   7,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n      3,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n      2,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,  24,   0,   0,   0, \n     24,   0,   0,   0,  60,   0, \n      0,   7,  50,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,   3,   0, \n      0,   0,  41,   0,   0,  10, \n     50,   0,  16,   0,   3,   0, \n      0,   0, 230,  10,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      3,   0,   0,   0,  60,   0, \n      0,   7, 194,   0,  16,   0, \n      4,   0,   0,   0, 166,  14, \n     16,   0,   2,   0,   0,   0, \n      6,   4,  16,   0,   2,   0, \n      0,   0, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  35,   0, \n      0,   8,  66,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n      2,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     79,   0,   0,   9,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  26, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     35,   0,   0,  11,  66,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  10, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   2,   0, \n      0,   0, 182,  15,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  24,   0,   0,   0, \n     24,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     59,   0,   0,   5,  50,   0, \n     16,   0,   3,   0,   0,   0, \n     70,   0,  16,   0,   2,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,   4,   0, \n      0,   0,  86,   5,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0,   6,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   4,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   5,   0,   0,   0, \n     86,   5,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n      6,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      5,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n    242,   0,  16,   0,   5,   0, \n      0,   0,   6,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     35,   0,   0,   9, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   6,   0,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   7,   0,   0, 255,   7, \n      0,   0, 255,   7,   0,   0, \n    255,   7,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n      5,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n      4,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,  24,   0,   0,   0, \n     24,   0,   0,   0,  60,   0, \n      0,   7, 146,   0,  16,   0, \n      0,   0,   0,   0,   6,   4, \n     16,   0,   4,   0,   0,   0, \n      6,   4,  16,   0,   5,   0, \n      0,   0,  41,   0,   0,  10, \n     82,   0,  16,   0,   1,   0, \n      0,   0, 166,  11,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7, 146,   0, \n     16,   0,   0,   0,   0,   0, \n      6,  12,  16,   0,   0,   0, \n      0,   0,   6,   8,  16,   0, \n      1,   0,   0,   0,  60,   0, \n      0,   7,  50,   0,  16,   0, \n      4,   0,   0,   0, 230,  10, \n     16,   0,   4,   0,   0,   0, \n    198,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,   3,   0, \n      0,   0,   6,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      2,   0,   0,   0,   6,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0,   6,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0, 242,   0,  16,   0, \n      1,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  35,   0,   0,   9, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  86,   5, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0, 255,   7,   0,   0, \n    255,   7,   0,   0, 255,   7, \n      0,   0, 255,   7,   0,   0, \n     78,   0,   0,  11, 242,   0, \n     16,   0,   2,   0,   0,   0, \n      0, 208,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     78,   0,   0,  11, 242,   0, \n     16,   0,   1,   0,   0,   0, \n      0, 208,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,  24,   0, \n      0,   0,  24,   0,   0,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,  41,   0, \n      0,  10,  50,   0,  16,   0, \n      1,   0,   0,   0, 230,  10, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n     60,   0,   0,   7, 194,   0, \n     16,   0,   4,   0,   0,   0, \n    166,  14,  16,   0,   1,   0, \n      0,   0,   6,   4,  16,   0, \n      0,   0,   0,   0, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     21,   0,   0,   1,  21,   0, \n      0,   1,  21,   0,   0,   1, \n     62,   0,   0,   1,  83,  84, \n     65,  84, 148,   0,   0,   0, \n    174,   1,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0, 112,   0,   0,   0, \n    228,   0,   0,   0,   5,   0, \n      0,   0,  14,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_depth_float_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 7\ndcl_thread_group 4, 32, 1\nand r0.xy, CB0[0][0].xxxx, l(1, 2, 0, 0)\nishl r1.x, vThreadID.x, l(3)\nmov r1.y, vThreadID.y\nuge r0.zw, r1.xxxy, CB0[0][1].xxxy\nor r0.z, r0.w, r0.z\nif_nz r0.z\n  ret \nendif \nubfe r0.z, l(2), l(2), CB0[0][0].x\nishl r0.w, r1.x, l(2)\nimad r1.y, vThreadID.z, CB0[0][1].y, vThreadID.y\nimad r0.w, r1.y, CB0[0][2].x, r0.w\niadd r0.w, r0.w, CB0[0][1].w\nif_z r0.x\n  imad r1.y, CB0[0][0].w, vThreadID.z, vThreadID.y\n  imad r1.y, CB0[0][0].z, r1.y, r1.x\n  ishl r1.y, r1.y, l(2)\nelse \n  if_nz r0.y\n    ushr r1.zw, CB0[0][0].zzzw, l(0, 0, 5, 4)\n    ishr r2.xyzw, vThreadID.zyyy, l(2, 4, 1, 3)\n    imad r0.y, r2.x, r1.w, r2.y\n    ibfe r1.w, l(27), l(2), vThreadID.x\n    imad r0.y, r0.y, r1.z, r1.w\n    bfi r1.zw, l(0, 0, 2, 1), l(0, 0, 5, 4), vThreadID.zzzy, l(0, 0, 0, 0)\n    bfi r2.y, l(2), l(3), r2.z, l(0)\n    iadd r1.z, r1.z, r2.y\n    bfi r0.y, l(25), l(7), r0.y, r1.z\n    xor r1.z, r2.x, r2.w\n    ubfe r2.x, l(2), l(3), r1.x\n    bfi r2.yz, l(0, 1, 1, 0), l(0, 1, 11, 0), r1.zzzz, l(0, 0, 0, 0)\n    xor r1.z, r2.y, r2.x\n    imad r1.z, r1.z, l(64), r1.w\n    iadd r1.z, r2.z, r1.z\n    ibfe r2.xy, l(27, 24, 0, 0), l(3, 6, 0, 0), r0.yyyy\n    bfi r0.y, l(3), l(8), r2.x, r1.z\n    bfi r1.y, l(20), l(12), r2.y, r0.y\n  else \n    ushr r0.y, CB0[0][0].z, l(5)\n    ishr r2.xyzw, vThreadID.yyyy, l(5, 1, 4, 3)\n    ibfe r1.z, l(27), l(2), vThreadID.x\n    imad r0.y, r2.x, r0.y, r1.z\n    bfi r2.xyz, l(3, 1, 1, 0), l(3, 1, 11, 0), r2.ywzy, l(0, 0, 0, 0)\n    bfi r0.y, l(26), l(6), r0.y, r2.x\n    ubfe r1.x, l(2), l(3), r1.x\n    xor r1.x, r2.y, r1.x\n    bfi r1.z, l(1), l(4), vThreadID.y, l(0)\n    imad r1.x, r1.x, l(64), r1.z\n    iadd r1.x, r2.z, r1.x\n    ibfe r1.zw, l(0, 0, 27, 24), l(0, 0, 3, 6), r0.yyyy\n    bfi r0.y, l(3), l(8), r1.z, r1.x\n    bfi r1.y, l(20), l(12), r1.w, r0.y\n  endif \nendif \niadd r0.y, r1.y, CB0[0][0].y\nld_raw r1.xyzw, r0.y, T0[0].xyzw\nieq r2.xyz, r0.zzzz, l(1, 2, 3, 0)\nor r2.xy, r2.yzyy, r2.xyxx\nif_nz r2.x\n  ishl r3.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r1.xyzw, r3.xyzw, r4.xyzw\nendif \nif_nz r2.y\n  ushr r3.xyzw, r1.xyzw, l(16, 16, 16, 16)\n  bfi r1.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r1.xyzw, r3.xyzw\nendif \nushr r3.xyzw, r1.xyzw, l(8, 8, 8, 8)\nubfe r1.xyzw, l(20, 20, 20, 20), l(8, 8, 8, 8), r1.xyzw\nushr r4.xyzw, r3.xyzw, l(20, 20, 20, 20)\nfirstbit_hi r5.xyzw, r1.xyzw\niadd r5.xyzw, r5.xyzw, l(-11, -11, -11, -11)\nmovc r5.xyzw, r1.xyzw, r5.xyzw, l(21,21,21,21)\niadd r6.xyzw, -r5.xyzw, l(1, 1, 1, 1)\nmovc r6.xyzw, r4.xyzw, r4.xyzw, r6.xyzw\nishl r5.xyzw, r1.xyzw, r5.xyzw\nand r5.xyzw, r5.xyzw, l(0x000fffff, 0x000fffff, 0x000fffff, 0x000fffff)\nmovc r1.xyzw, r4.xyzw, r1.xyzw, r5.xyzw\nishl r4.xyzw, r6.xyzw, l(23, 23, 23, 23)\niadd r4.xyzw, r4.xyzw, l(0x38000000, 0x38000000, 0x38000000, 0x38000000)\nishl r1.xyzw, r1.xyzw, l(3, 3, 3, 3)\niadd r1.xyzw, r4.xyzw, r1.xyzw\nmovc r1.xyzw, r3.xyzw, r1.xyzw, l(0,0,0,0)\nstore_raw U0[0].xyzw, r0.w, r1.xyzw\niadd r0.z, r0.w, l(16)\nif_nz r0.x\n  mov r0.x, l(32)\nelse \n  mov r0.x, l(16)\nendif \niadd r0.x, r0.x, r0.y\nld_raw r1.xyzw, r0.x, T0[0].xyzw\nif_nz r2.x\n  ishl r3.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r1.xyzw, r3.xyzw, r4.xyzw\nendif \nif_nz r2.y\n  ushr r2.xyzw, r1.xyzw, l(16, 16, 16, 16)\n  bfi r1.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r1.xyzw, r2.xyzw\nendif \nushr r2.xyzw, r1.xyzw, l(8, 8, 8, 8)\nubfe r1.xyzw, l(20, 20, 20, 20), l(8, 8, 8, 8), r1.xyzw\nushr r3.xyzw, r2.xyzw, l(20, 20, 20, 20)\nfirstbit_hi r4.xyzw, r1.xyzw\niadd r4.xyzw, r4.xyzw, l(-11, -11, -11, -11)\nmovc r4.xyzw, r1.xyzw, r4.xyzw, l(21,21,21,21)\niadd r5.xyzw, -r4.xyzw, l(1, 1, 1, 1)\nmovc r5.xyzw, r3.xyzw, r3.xyzw, r5.xyzw\nishl r4.xyzw, r1.xyzw, r4.xyzw\nand r4.xyzw, r4.xyzw, l(0x000fffff, 0x000fffff, 0x000fffff, 0x000fffff)\nmovc r1.xyzw, r3.xyzw, r1.xyzw, r4.xyzw\nishl r3.xyzw, r5.xyzw, l(23, 23, 23, 23)\niadd r3.xyzw, r3.xyzw, l(0x38000000, 0x38000000, 0x38000000, 0x38000000)\nishl r1.xyzw, r1.xyzw, l(3, 3, 3, 3)\niadd r1.xyzw, r3.xyzw, r1.xyzw\nmovc r1.xyzw, r2.xyzw, r1.xyzw, l(0,0,0,0)\nstore_raw U0[0].xyzw, r0.z, r1.xyzw\nret \n// Approximately 123 instruction slots used\n#endif\n\nconst BYTE texture_load_depth_float_cs[] =\n{\n     68,  88,  66,  67, 197,  22, \n    157, 201,  83,  88,  31, 216, \n    152, 181, 212,  30, 206, 155, \n     49, 178,   1,   0,   0,   0, \n    100,  21,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n    200,  20,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n    140,  16,   0,   0,  81,   0, \n      5,   0,  35,   4,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   7,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  12,  50,   0,  16,   0, \n      0,   0,   0,   0,   6, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n    194,   0,  16,   0,   0,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0,   6, 132, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  11, \n     66,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,   2,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,  11, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  31,   0, \n      0,   3,  10,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  58, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  42,   0,   2,   0, \n     26,   0,   2,   0,  35,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     41,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  18,   0, \n      0,   1,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,  12, \n    194,   0,  16,   0,   1,   0, \n      0,   0, 166, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0,  42,   0,   0,   9, \n    242,   0,  16,   0,   2,   0, \n      0,   0, 102,   5,   2,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      1,   0,   0,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 139,   0,   0,   8, \n    130,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     27,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10,   0,   2,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  19, 194,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0, 166,   6,   2,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     25,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  87,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0, 138,   0,   0,   9, \n     18,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  20, \n     98,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  11,   0, \n      0,   0,   0,   0,   0,   0, \n    166,  10,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  87,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  64,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    139,   0,   0,  15,  50,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  27,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  18,   0, \n      0,   1,  85,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  42,   0,   0,   9, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  86,   5,   2,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   1,   0,   0,   0, \n      4,   0,   0,   0,   3,   0, \n      0,   0, 139,   0,   0,   8, \n     66,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     27,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10,   0,   2,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  20, 114,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0, 214,   6,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  26,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0, 138,   0,   0,   9, \n     18,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  87,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  10,  66,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  26,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  64,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 139,   0,   0,  15, \n    194,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  27,   0,   0,   0, \n     24,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  21,   0, \n      0,   1,  30,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  32,   0, \n      0,  10, 114,   0,  16,   0, \n      2,   0,   0,   0, 166,  10, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   2,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   2,   0, \n      0,   0, 150,   5,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,  85,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     21,   0,   0,   1,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n    135,   0,   0,   5, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0, 245, 255, 255, 255, \n    245, 255, 255, 255, 245, 255, \n    255, 255, 245, 255, 255, 255, \n     55,   0,   0,  12, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,  21,   0,   0,   0, \n     21,   0,   0,   0,  21,   0, \n      0,   0,  21,   0,   0,   0, \n     30,   0,   0,  11, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16, 128,  65,   0, \n      0,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  55,   0,   0,   9, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  41,   0,   0,   7, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n    255, 255,  15,   0, 255, 255, \n     15,   0, 255, 255,  15,   0, \n    255, 255,  15,   0,  55,   0, \n      0,   9, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  30,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  56, \n      0,   0,   0,  56,   0,   0, \n      0,  56,   0,   0,   0,  56, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  55,   0,   0,  12, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     32,   0,   0,   0,  18,   0, \n      0,   1,  54,   0,   0,   5, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0,  21,   0, \n      0,   1,  30,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  21,   0,   0,   1, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0, 135,   0,   0,   5, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0, 245, 255, \n    255, 255, 245, 255, 255, 255, \n    245, 255, 255, 255, 245, 255, \n    255, 255,  55,   0,   0,  12, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,  21,   0, \n      0,   0,  21,   0,   0,   0, \n     21,   0,   0,   0,  21,   0, \n      0,   0,  30,   0,   0,  11, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16, 128, \n     65,   0,   0,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,  55,   0, \n      0,   9, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  41,   0, \n      0,   7, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0, 255, 255,  15,   0, \n    255, 255,  15,   0, 255, 255, \n     15,   0, 255, 255,  15,   0, \n     55,   0,   0,   9, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  30,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  56,   0,   0,   0,  56, \n      0,   0,   0,  56,   0,   0, \n      0,  56,  41,   0,   0,  10, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  55,   0, \n      0,  12, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     62,   0,   0,   1,  83,  84, \n     65,  84, 148,   0,   0,   0, \n    123,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  40,   0,   0,   0, \n     23,   0,   0,   0,   5,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_depth_float_scaled_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 7\ndcl_thread_group 4, 32, 1\nand r0.x, CB0[0][0].x, l(2)\nishl r1.x, vThreadID.x, l(3)\nmov r1.y, vThreadID.y\nuge r0.yz, r1.xxyx, CB0[0][1].xxyx\nor r0.y, r0.z, r0.y\nif_nz r0.y\n  ret \nendif \nubfe r0.yzw, l(0, 2, 3, 3), l(0, 2, 4, 7), CB0[0][0].xxxx\nishl r1.z, r1.x, l(2)\nimad r1.w, vThreadID.z, CB0[0][1].y, vThreadID.y\nimad r1.z, r1.w, CB0[0][2].x, r1.z\niadd r1.z, r1.z, CB0[0][1].w\nushr r1.yw, r1.xxxy, l(0, 4, 0, 1)\nudiv r2.xyzw, null, r1.wyww, r0.wzww\nimad r1.yw, -r0.zzzw, r2.yyyw, r1.yyyw\nishl r3.x, r2.y, l(4)\nimad r1.y, r1.y, r0.w, r1.w\nbfi r1.w, l(1), l(6), vThreadID.y, l(0)\nbfi r1.y, l(25), l(7), r1.y, r1.w\nbfi r1.x, l(4), l(2), r1.x, l(0)\niadd r1.x, r1.y, r1.x\nif_nz r0.x\n  ushr r1.yw, CB0[0][0].zzzw, l(0, 5, 0, 4)\n  ishr r0.x, vThreadID.z, l(2)\n  ibfe r4.xyzw, l(28, 27, 31, 29), l(3, 1, 0, 2), r2.wyww\n  imad r1.w, r0.x, r1.w, r4.x\n  imad r1.y, r1.w, r1.y, r4.y\n  bfi r1.w, l(2), l(5), vThreadID.z, l(0)\n  bfi r3.y, l(2), l(3), r4.z, l(0)\n  iadd r1.w, r1.w, r3.y\n  bfi r1.y, l(25), l(7), r1.y, r1.w\n  xor r0.x, r0.x, r4.w\n  ishr r1.w, r3.x, l(3)\n  and r1.w, r1.w, l(2)\n  bfi r3.yz, l(0, 1, 1, 0), l(0, 1, 11, 0), r0.xxxx, l(0, 0, 0, 0)\n  xor r0.x, r1.w, r3.y\n  ishl r0.x, r0.x, l(6)\n  iadd r0.x, r3.z, r0.x\n  ibfe r1.yw, l(0, 27, 0, 24), l(0, 3, 0, 6), r1.yyyy\n  bfi r0.x, l(3), l(8), r1.y, r0.x\n  bfi r0.x, l(20), l(12), r1.w, r0.x\nelse \n  ushr r1.y, CB0[0][0].z, l(5)\n  ibfe r4.xyzw, l(27, 27, 31, 28), l(4, 1, 0, 3), r2.xyzw\n  imad r1.y, r4.x, r1.y, r4.y\n  bfi r2.xy, l(3, 1, 0, 0), l(3, 11, 0, 0), r4.zwzz, l(0, 0, 0, 0)\n  bfi r1.y, l(26), l(6), r1.y, r2.x\n  ishr r1.w, r3.x, l(3)\n  and r1.w, r1.w, l(2)\n  ibfe r2.x, l(29), l(2), r2.w\n  bfi r2.x, l(1), l(1), r2.x, l(0)\n  xor r1.w, r1.w, r2.x\n  ishl r1.w, r1.w, l(6)\n  iadd r1.w, r2.y, r1.w\n  ibfe r2.xy, l(27, 24, 0, 0), l(3, 6, 0, 0), r1.yyyy\n  bfi r1.y, l(3), l(8), r2.x, r1.w\n  bfi r0.x, l(20), l(12), r2.y, r1.y\nendif \nimul null, r0.z, r0.w, r0.z\nimad r0.x, r0.x, r0.z, r1.x\niadd r0.x, r0.x, CB0[0][0].y\nld_raw r2.xyzw, r0.x, T0[0].xyzw\nieq r0.yzw, r0.yyyy, l(0, 1, 2, 3)\nor r0.yz, r0.zzwz, r0.yyzy\nif_nz r0.y\n  ishl r3.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r2.xyzw, r3.xyzw, r4.xyzw\nendif \nif_nz r0.z\n  ushr r3.xyzw, r2.xyzw, l(16, 16, 16, 16)\n  bfi r2.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r2.xyzw, r3.xyzw\nendif \nushr r3.xyzw, r2.xyzw, l(8, 8, 8, 8)\nubfe r2.xyzw, l(20, 20, 20, 20), l(8, 8, 8, 8), r2.xyzw\nushr r4.xyzw, r3.xyzw, l(20, 20, 20, 20)\nfirstbit_hi r5.xyzw, r2.xyzw\niadd r5.xyzw, r5.xyzw, l(-11, -11, -11, -11)\nmovc r5.xyzw, r2.xyzw, r5.xyzw, l(21,21,21,21)\niadd r6.xyzw, -r5.xyzw, l(1, 1, 1, 1)\nmovc r6.xyzw, r4.xyzw, r4.xyzw, r6.xyzw\nishl r5.xyzw, r2.xyzw, r5.xyzw\nand r5.xyzw, r5.xyzw, l(0x000fffff, 0x000fffff, 0x000fffff, 0x000fffff)\nmovc r2.xyzw, r4.xyzw, r2.xyzw, r5.xyzw\nishl r4.xyzw, r6.xyzw, l(23, 23, 23, 23)\niadd r4.xyzw, r4.xyzw, l(0x38000000, 0x38000000, 0x38000000, 0x38000000)\nishl r2.xyzw, r2.xyzw, l(3, 3, 3, 3)\niadd r2.xyzw, r4.xyzw, r2.xyzw\nmovc r2.xyzw, r3.xyzw, r2.xyzw, l(0,0,0,0)\nstore_raw U0[0].xyzw, r1.z, r2.xyzw\niadd r0.w, r1.z, l(16)\niadd r0.x, r0.x, l(16)\nld_raw r2.xyzw, r0.x, T0[0].xyzw\nif_nz r0.y\n  ishl r3.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r2.xyzw, r3.xyzw, r4.xyzw\nendif \nif_nz r0.z\n  ushr r3.xyzw, r2.xyzw, l(16, 16, 16, 16)\n  bfi r2.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r2.xyzw, r3.xyzw\nendif \nushr r3.xyzw, r2.xyzw, l(8, 8, 8, 8)\nubfe r2.xyzw, l(20, 20, 20, 20), l(8, 8, 8, 8), r2.xyzw\nushr r4.xyzw, r3.xyzw, l(20, 20, 20, 20)\nfirstbit_hi r5.xyzw, r2.xyzw\niadd r5.xyzw, r5.xyzw, l(-11, -11, -11, -11)\nmovc r5.xyzw, r2.xyzw, r5.xyzw, l(21,21,21,21)\niadd r6.xyzw, -r5.xyzw, l(1, 1, 1, 1)\nmovc r6.xyzw, r4.xyzw, r4.xyzw, r6.xyzw\nishl r5.xyzw, r2.xyzw, r5.xyzw\nand r5.xyzw, r5.xyzw, l(0x000fffff, 0x000fffff, 0x000fffff, 0x000fffff)\nmovc r2.xyzw, r4.xyzw, r2.xyzw, r5.xyzw\nishl r4.xyzw, r6.xyzw, l(23, 23, 23, 23)\niadd r4.xyzw, r4.xyzw, l(0x38000000, 0x38000000, 0x38000000, 0x38000000)\nishl r2.xyzw, r2.xyzw, l(3, 3, 3, 3)\niadd r2.xyzw, r4.xyzw, r2.xyzw\nmovc r2.xyzw, r3.xyzw, r2.xyzw, l(0,0,0,0)\nstore_raw U0[0].xyzw, r0.w, r2.xyzw\nret \n// Approximately 125 instruction slots used\n#endif\n\nconst BYTE texture_load_depth_float_scaled_cs[] =\n{\n     68,  88,  66,  67, 194, 105, \n      0, 172,  84, 186, 113, 253, \n    176,  26,  63,  36, 199, 200, \n    254,  39,   1,   0,   0,   0, \n    104,  22,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n    204,  21,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n    144,  17,   0,   0,  81,   0, \n      5,   0, 100,   4,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   7,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n     98,   0,  16,   0,   0,   0, \n      0,   0,   6,   1,  16,   0, \n      1,   0,   0,   0,   6, 129, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  17, \n    226,   0,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   7,   0,   0,   0, \n      6, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,  35,   0,   0,   9, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,   2,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,  11, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   9,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  85,   0, \n      0,  10, 162,   0,  16,   0, \n      1,   0,   0,   0,   6,   4, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  78,   0,   0,   8, \n    242,   0,  16,   0,   2,   0, \n      0,   0,   0, 208,   0,   0, \n    118,  15,  16,   0,   1,   0, \n      0,   0, 182,  15,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,  10, 162,   0,  16,   0, \n      1,   0,   0,   0, 166,  14, \n     16, 128,  65,   0,   0,   0, \n      0,   0,   0,   0,  86,  13, \n     16,   0,   2,   0,   0,   0, \n     86,  13,  16,   0,   1,   0, \n      0,   0,  41,   0,   0,   7, \n     18,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  10, 130,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  26,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  25,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  18,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     85,   0,   0,  12, 162,   0, \n     16,   0,   1,   0,   0,   0, \n    166, 142,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n     42,   0,   0,   6,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,   2,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n    139,   0,   0,  15, 242,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,  28,   0, \n      0,   0,  27,   0,   0,   0, \n     31,   0,   0,   0,  29,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0, 118,  15, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,   9, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n    140,   0,   0,  10, 130,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  42,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      4,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  25,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     87,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,  42,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n    140,   0,   0,  20,  98,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0,   6,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n     41,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0, 139,   0,   0,  15, \n    162,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  27,   0, \n      0,   0,   0,   0,   0,   0, \n     24,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   6,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     18,   0,   0,   1,  85,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0, 139,   0, \n      0,  15, 242,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,  27,   0,   0,   0, \n     27,   0,   0,   0,  31,   0, \n      0,   0,  28,   0,   0,   0, \n      2,  64,   0,   0,   4,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      4,   0,   0,   0, 140,   0, \n      0,  20,  50,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 230,  10,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  26,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0, 139,   0, \n      0,   9,  18,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,  29,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  30,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n    139,   0,   0,  15,  50,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  27,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  21,   0, \n      0,   1,  38,   0,   0,   8, \n      0, 208,   0,   0,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     32,   0,   0,  10, 226,   0, \n     16,   0,   0,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   2,   0,   0,   0, \n      3,   0,   0,   0,  60,   0, \n      0,   7,  98,   0,  16,   0, \n      0,   0,   0,   0, 166,  11, \n     16,   0,   0,   0,   0,   0, \n     86,   6,  16,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  21,   0,   0,   1, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0, 135,   0,   0,   5, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  30,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0, 245, 255, \n    255, 255, 245, 255, 255, 255, \n    245, 255, 255, 255, 245, 255, \n    255, 255,  55,   0,   0,  12, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,  21,   0, \n      0,   0,  21,   0,   0,   0, \n     21,   0,   0,   0,  21,   0, \n      0,   0,  30,   0,   0,  11, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16, 128, \n     65,   0,   0,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,  55,   0, \n      0,   9, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  41,   0, \n      0,   7, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0, 255, 255,  15,   0, \n    255, 255,  15,   0, 255, 255, \n     15,   0, 255, 255,  15,   0, \n     55,   0,   0,   9, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  30,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  56,   0,   0,   0,  56, \n      0,   0,   0,  56,   0,   0, \n      0,  56,  41,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  55,   0, \n      0,  12, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     30,   0,   0,   7, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  21,   0, \n      0,   1,  85,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0, 135,   0, \n      0,   5, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     30,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n    245, 255, 255, 255, 245, 255, \n    255, 255, 245, 255, 255, 255, \n    245, 255, 255, 255,  55,   0, \n      0,  12, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n     21,   0,   0,   0,  21,   0, \n      0,   0,  21,   0,   0,   0, \n     21,   0,   0,   0,  30,   0, \n      0,  11, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16, 128,  65,   0,   0,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n     55,   0,   0,   9, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     41,   0,   0,   7, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0, 255, 255, \n     15,   0, 255, 255,  15,   0, \n    255, 255,  15,   0, 255, 255, \n     15,   0,  55,   0,   0,   9, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     30,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,  56,   0,   0, \n      0,  56,   0,   0,   0,  56, \n      0,   0,   0,  56,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     55,   0,   0,  12, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  62,   0,   0,   1, \n     83,  84,  65,  84, 148,   0, \n      0,   0, 125,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  44,   0, \n      0,   0,  27,   0,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_depth_unorm_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 5\ndcl_thread_group 4, 32, 1\nand r0.xy, CB0[0][0].xxxx, l(1, 2, 0, 0)\nishl r1.x, vThreadID.x, l(3)\nmov r1.y, vThreadID.y\nuge r0.zw, r1.xxxy, CB0[0][1].xxxy\nor r0.z, r0.w, r0.z\nif_nz r0.z\n  ret \nendif \nubfe r0.z, l(2), l(2), CB0[0][0].x\nishl r0.w, r1.x, l(2)\nimad r1.y, vThreadID.z, CB0[0][1].y, vThreadID.y\nimad r0.w, r1.y, CB0[0][2].x, r0.w\niadd r0.w, r0.w, CB0[0][1].w\nif_z r0.x\n  imad r1.y, CB0[0][0].w, vThreadID.z, vThreadID.y\n  imad r1.y, CB0[0][0].z, r1.y, r1.x\n  ishl r1.y, r1.y, l(2)\nelse \n  if_nz r0.y\n    ushr r1.zw, CB0[0][0].zzzw, l(0, 0, 5, 4)\n    ishr r2.xyzw, vThreadID.zyyy, l(2, 4, 1, 3)\n    imad r0.y, r2.x, r1.w, r2.y\n    ibfe r1.w, l(27), l(2), vThreadID.x\n    imad r0.y, r0.y, r1.z, r1.w\n    bfi r1.zw, l(0, 0, 2, 1), l(0, 0, 5, 4), vThreadID.zzzy, l(0, 0, 0, 0)\n    bfi r2.y, l(2), l(3), r2.z, l(0)\n    iadd r1.z, r1.z, r2.y\n    bfi r0.y, l(25), l(7), r0.y, r1.z\n    xor r1.z, r2.x, r2.w\n    ubfe r2.x, l(2), l(3), r1.x\n    bfi r2.yz, l(0, 1, 1, 0), l(0, 1, 11, 0), r1.zzzz, l(0, 0, 0, 0)\n    xor r1.z, r2.y, r2.x\n    imad r1.z, r1.z, l(64), r1.w\n    iadd r1.z, r2.z, r1.z\n    ibfe r2.xy, l(27, 24, 0, 0), l(3, 6, 0, 0), r0.yyyy\n    bfi r0.y, l(3), l(8), r2.x, r1.z\n    bfi r1.y, l(20), l(12), r2.y, r0.y\n  else \n    ushr r0.y, CB0[0][0].z, l(5)\n    ishr r2.xyzw, vThreadID.yyyy, l(5, 1, 4, 3)\n    ibfe r1.z, l(27), l(2), vThreadID.x\n    imad r0.y, r2.x, r0.y, r1.z\n    bfi r2.xyz, l(3, 1, 1, 0), l(3, 1, 11, 0), r2.ywzy, l(0, 0, 0, 0)\n    bfi r0.y, l(26), l(6), r0.y, r2.x\n    ubfe r1.x, l(2), l(3), r1.x\n    xor r1.x, r2.y, r1.x\n    bfi r1.z, l(1), l(4), vThreadID.y, l(0)\n    imad r1.x, r1.x, l(64), r1.z\n    iadd r1.x, r2.z, r1.x\n    ibfe r1.zw, l(0, 0, 27, 24), l(0, 0, 3, 6), r0.yyyy\n    bfi r0.y, l(3), l(8), r1.z, r1.x\n    bfi r1.y, l(20), l(12), r1.w, r0.y\n  endif \nendif \niadd r0.y, r1.y, CB0[0][0].y\nld_raw r1.xyzw, r0.y, T0[0].xyzw\nieq r2.xyz, r0.zzzz, l(1, 2, 3, 0)\nor r2.xy, r2.yzyy, r2.xyxx\nif_nz r2.x\n  ishl r3.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r1.xyzw, r3.xyzw, r4.xyzw\nendif \nif_nz r2.y\n  ushr r3.xyzw, r1.xyzw, l(16, 16, 16, 16)\n  bfi r1.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r1.xyzw, r3.xyzw\nendif \nushr r1.xyzw, r1.xyzw, l(8, 8, 8, 8)\nushr r3.xyzw, r1.xyzw, l(23, 23, 23, 23)\niadd r1.xyzw, r1.xyzw, r3.xyzw\nutof r1.xyzw, r1.xyzw\nmul r1.xyzw, r1.xyzw, l(0.000000, 0.000000, 0.000000, 0.000000)\nstore_raw U0[0].xyzw, r0.w, r1.xyzw\niadd r0.z, r0.w, l(16)\nif_nz r0.x\n  mov r0.x, l(32)\nelse \n  mov r0.x, l(16)\nendif \niadd r0.x, r0.x, r0.y\nld_raw r1.xyzw, r0.x, T0[0].xyzw\nif_nz r2.x\n  ishl r3.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r1.xyzw, r3.xyzw, r4.xyzw\nendif \nif_nz r2.y\n  ushr r2.xyzw, r1.xyzw, l(16, 16, 16, 16)\n  bfi r1.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r1.xyzw, r2.xyzw\nendif \nushr r1.xyzw, r1.xyzw, l(8, 8, 8, 8)\nushr r2.xyzw, r1.xyzw, l(23, 23, 23, 23)\niadd r1.xyzw, r1.xyzw, r2.xyzw\nutof r1.xyzw, r1.xyzw\nmul r1.xyzw, r1.xyzw, l(0.000000, 0.000000, 0.000000, 0.000000)\nstore_raw U0[0].xyzw, r0.z, r1.xyzw\nret \n// Approximately 101 instruction slots used\n#endif\n\nconst BYTE texture_load_depth_unorm_cs[] =\n{\n     68,  88,  66,  67, 190,  74, \n    151, 168,  49, 194, 209,  71, \n    193, 129,   0, 205, 252,  94, \n    187,  40,   1,   0,   0,   0, \n    204,  17,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n     48,  17,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n    244,  12,   0,   0,  81,   0, \n      5,   0,  61,   3,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   5,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  12,  50,   0,  16,   0, \n      0,   0,   0,   0,   6, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n    194,   0,  16,   0,   0,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0,   6, 132, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  11, \n     66,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,   2,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,  11, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  31,   0, \n      0,   3,  10,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  58, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  42,   0,   2,   0, \n     26,   0,   2,   0,  35,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     41,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  18,   0, \n      0,   1,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,  12, \n    194,   0,  16,   0,   1,   0, \n      0,   0, 166, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0,  42,   0,   0,   9, \n    242,   0,  16,   0,   2,   0, \n      0,   0, 102,   5,   2,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      1,   0,   0,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 139,   0,   0,   8, \n    130,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     27,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10,   0,   2,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  19, 194,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0, 166,   6,   2,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     25,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  87,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0, 138,   0,   0,   9, \n     18,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  20, \n     98,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  11,   0, \n      0,   0,   0,   0,   0,   0, \n    166,  10,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  87,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  64,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    139,   0,   0,  15,  50,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  27,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  18,   0, \n      0,   1,  85,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  42,   0,   0,   9, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  86,   5,   2,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   1,   0,   0,   0, \n      4,   0,   0,   0,   3,   0, \n      0,   0, 139,   0,   0,   8, \n     66,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     27,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10,   0,   2,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  20, 114,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0, 214,   6,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  26,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0, 138,   0,   0,   9, \n     18,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  87,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  10,  66,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  26,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  64,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 139,   0,   0,  15, \n    194,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  27,   0,   0,   0, \n     24,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  21,   0, \n      0,   1,  30,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  32,   0, \n      0,  10, 114,   0,  16,   0, \n      2,   0,   0,   0, 166,  10, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   2,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   2,   0, \n      0,   0, 150,   5,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,  85,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     21,   0,   0,   1,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128,  51,   0,   0, \n    128,  51,   0,   0, 128,  51, \n      0,   0, 128,  51, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0,  31,   0, \n      4,   3,  10,   0,  16,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  32,   0,   0,   0, \n     18,   0,   0,   1,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n     21,   0,   0,   1,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  31,   0, \n      4,   3,  10,   0,  16,   0, \n      2,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      2,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  21,   0, \n      0,   1,  85,   0,   0,  10, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128,  51,   0,   0, 128,  51, \n      0,   0, 128,  51,   0,   0, \n    128,  51, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  62,   0, \n      0,   1,  83,  84,  65,  84, \n    148,   0,   0,   0, 101,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   2,   0,   0,   0, \n     28,   0,   0,   0,  21,   0, \n      0,   0,   5,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_depth_unorm_scaled_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 5\ndcl_thread_group 4, 32, 1\nand r0.x, CB0[0][0].x, l(2)\nishl r1.x, vThreadID.x, l(3)\nmov r1.y, vThreadID.y\nuge r0.yz, r1.xxyx, CB0[0][1].xxyx\nor r0.y, r0.z, r0.y\nif_nz r0.y\n  ret \nendif \nubfe r0.yzw, l(0, 2, 3, 3), l(0, 2, 4, 7), CB0[0][0].xxxx\nishl r1.z, r1.x, l(2)\nimad r1.w, vThreadID.z, CB0[0][1].y, vThreadID.y\nimad r1.z, r1.w, CB0[0][2].x, r1.z\niadd r1.z, r1.z, CB0[0][1].w\nushr r1.yw, r1.xxxy, l(0, 4, 0, 1)\nudiv r2.xyzw, null, r1.wyww, r0.wzww\nimad r1.yw, -r0.zzzw, r2.yyyw, r1.yyyw\nishl r3.x, r2.y, l(4)\nimad r1.y, r1.y, r0.w, r1.w\nbfi r1.w, l(1), l(6), vThreadID.y, l(0)\nbfi r1.y, l(25), l(7), r1.y, r1.w\nbfi r1.x, l(4), l(2), r1.x, l(0)\niadd r1.x, r1.y, r1.x\nif_nz r0.x\n  ushr r1.yw, CB0[0][0].zzzw, l(0, 5, 0, 4)\n  ishr r0.x, vThreadID.z, l(2)\n  ibfe r4.xyzw, l(28, 27, 31, 29), l(3, 1, 0, 2), r2.wyww\n  imad r1.w, r0.x, r1.w, r4.x\n  imad r1.y, r1.w, r1.y, r4.y\n  bfi r1.w, l(2), l(5), vThreadID.z, l(0)\n  bfi r3.y, l(2), l(3), r4.z, l(0)\n  iadd r1.w, r1.w, r3.y\n  bfi r1.y, l(25), l(7), r1.y, r1.w\n  xor r0.x, r0.x, r4.w\n  ishr r1.w, r3.x, l(3)\n  and r1.w, r1.w, l(2)\n  bfi r3.yz, l(0, 1, 1, 0), l(0, 1, 11, 0), r0.xxxx, l(0, 0, 0, 0)\n  xor r0.x, r1.w, r3.y\n  ishl r0.x, r0.x, l(6)\n  iadd r0.x, r3.z, r0.x\n  ibfe r1.yw, l(0, 27, 0, 24), l(0, 3, 0, 6), r1.yyyy\n  bfi r0.x, l(3), l(8), r1.y, r0.x\n  bfi r0.x, l(20), l(12), r1.w, r0.x\nelse \n  ushr r1.y, CB0[0][0].z, l(5)\n  ibfe r4.xyzw, l(27, 27, 31, 28), l(4, 1, 0, 3), r2.xyzw\n  imad r1.y, r4.x, r1.y, r4.y\n  bfi r2.xy, l(3, 1, 0, 0), l(3, 11, 0, 0), r4.zwzz, l(0, 0, 0, 0)\n  bfi r1.y, l(26), l(6), r1.y, r2.x\n  ishr r1.w, r3.x, l(3)\n  and r1.w, r1.w, l(2)\n  ibfe r2.x, l(29), l(2), r2.w\n  bfi r2.x, l(1), l(1), r2.x, l(0)\n  xor r1.w, r1.w, r2.x\n  ishl r1.w, r1.w, l(6)\n  iadd r1.w, r2.y, r1.w\n  ibfe r2.xy, l(27, 24, 0, 0), l(3, 6, 0, 0), r1.yyyy\n  bfi r1.y, l(3), l(8), r2.x, r1.w\n  bfi r0.x, l(20), l(12), r2.y, r1.y\nendif \nimul null, r0.z, r0.w, r0.z\nimad r0.x, r0.x, r0.z, r1.x\niadd r0.x, r0.x, CB0[0][0].y\nld_raw r2.xyzw, r0.x, T0[0].xyzw\nieq r0.yzw, r0.yyyy, l(0, 1, 2, 3)\nor r0.yz, r0.zzwz, r0.yyzy\nif_nz r0.y\n  ishl r3.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r2.xyzw, r3.xyzw, r4.xyzw\nendif \nif_nz r0.z\n  ushr r3.xyzw, r2.xyzw, l(16, 16, 16, 16)\n  bfi r2.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r2.xyzw, r3.xyzw\nendif \nushr r2.xyzw, r2.xyzw, l(8, 8, 8, 8)\nushr r3.xyzw, r2.xyzw, l(23, 23, 23, 23)\niadd r2.xyzw, r2.xyzw, r3.xyzw\nutof r2.xyzw, r2.xyzw\nmul r2.xyzw, r2.xyzw, l(0.000000, 0.000000, 0.000000, 0.000000)\nstore_raw U0[0].xyzw, r1.z, r2.xyzw\niadd r0.w, r1.z, l(16)\niadd r0.x, r0.x, l(16)\nld_raw r2.xyzw, r0.x, T0[0].xyzw\nif_nz r0.y\n  ishl r3.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r2.xyzw, r3.xyzw, r4.xyzw\nendif \nif_nz r0.z\n  ushr r3.xyzw, r2.xyzw, l(16, 16, 16, 16)\n  bfi r2.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r2.xyzw, r3.xyzw\nendif \nushr r2.xyzw, r2.xyzw, l(8, 8, 8, 8)\nushr r3.xyzw, r2.xyzw, l(23, 23, 23, 23)\niadd r2.xyzw, r2.xyzw, r3.xyzw\nutof r2.xyzw, r2.xyzw\nmul r2.xyzw, r2.xyzw, l(0.000000, 0.000000, 0.000000, 0.000000)\nstore_raw U0[0].xyzw, r0.w, r2.xyzw\nret \n// Approximately 103 instruction slots used\n#endif\n\nconst BYTE texture_load_depth_unorm_scaled_cs[] =\n{\n     68,  88,  66,  67,   2, 164, \n     61, 167,  27, 102,  24, 237, \n    157, 184,  41,  97,  42, 113, \n    109, 142,   1,   0,   0,   0, \n    208,  18,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n     52,  18,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n    248,  13,   0,   0,  81,   0, \n      5,   0, 126,   3,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   5,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n     98,   0,  16,   0,   0,   0, \n      0,   0,   6,   1,  16,   0, \n      1,   0,   0,   0,   6, 129, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  17, \n    226,   0,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   7,   0,   0,   0, \n      6, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,  35,   0,   0,   9, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,   2,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,  11, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   9,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  85,   0, \n      0,  10, 162,   0,  16,   0, \n      1,   0,   0,   0,   6,   4, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  78,   0,   0,   8, \n    242,   0,  16,   0,   2,   0, \n      0,   0,   0, 208,   0,   0, \n    118,  15,  16,   0,   1,   0, \n      0,   0, 182,  15,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,  10, 162,   0,  16,   0, \n      1,   0,   0,   0, 166,  14, \n     16, 128,  65,   0,   0,   0, \n      0,   0,   0,   0,  86,  13, \n     16,   0,   2,   0,   0,   0, \n     86,  13,  16,   0,   1,   0, \n      0,   0,  41,   0,   0,   7, \n     18,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  10, 130,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  26,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  25,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  18,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     85,   0,   0,  12, 162,   0, \n     16,   0,   1,   0,   0,   0, \n    166, 142,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n     42,   0,   0,   6,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,   2,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n    139,   0,   0,  15, 242,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,  28,   0, \n      0,   0,  27,   0,   0,   0, \n     31,   0,   0,   0,  29,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0, 118,  15, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,   9, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n    140,   0,   0,  10, 130,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  42,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      4,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  25,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     87,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,  42,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n    140,   0,   0,  20,  98,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0,   6,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n     41,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0, 139,   0,   0,  15, \n    162,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  27,   0, \n      0,   0,   0,   0,   0,   0, \n     24,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   6,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     18,   0,   0,   1,  85,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0, 139,   0, \n      0,  15, 242,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,  27,   0,   0,   0, \n     27,   0,   0,   0,  31,   0, \n      0,   0,  28,   0,   0,   0, \n      2,  64,   0,   0,   4,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      4,   0,   0,   0, 140,   0, \n      0,  20,  50,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 230,  10,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  26,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0, 139,   0, \n      0,   9,  18,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,  29,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  30,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n    139,   0,   0,  15,  50,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  27,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  21,   0, \n      0,   1,  38,   0,   0,   8, \n      0, 208,   0,   0,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     32,   0,   0,  10, 226,   0, \n     16,   0,   0,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   2,   0,   0,   0, \n      3,   0,   0,   0,  60,   0, \n      0,   7,  98,   0,  16,   0, \n      0,   0,   0,   0, 166,  11, \n     16,   0,   0,   0,   0,   0, \n     86,   6,  16,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  21,   0,   0,   1, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128,  51, \n      0,   0, 128,  51,   0,   0, \n    128,  51,   0,   0, 128,  51, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  30,   0,   0,   7, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n     30,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,  85,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     21,   0,   0,   1,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  23,   0,   0,   0, \n     23,   0,   0,   0,  23,   0, \n      0,   0,  23,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128,  51,   0,   0, \n    128,  51,   0,   0, 128,  51, \n      0,   0, 128,  51, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     62,   0,   0,   1,  83,  84, \n     65,  84, 148,   0,   0,   0, \n    103,   0,   0,   0,   5,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,  32,   0,   0,   0, \n     25,   0,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_dxn_rg8_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 19\ndcl_thread_group 4, 32, 1\nand r0.xy, CB0[0][0].xxxx, l(1, 2, 0, 0)\nishl r1.x, vThreadID.x, l(1)\nmov r1.y, vThreadID.y\nuge r0.zw, r1.xxxy, CB0[0][1].xxxy\nor r0.z, r0.w, r0.z\nif_nz r0.z\n  ret \nendif \nubfe r0.z, l(2), l(2), CB0[0][0].x\nishl r1.yz, r1.xxyx, l(0, 2, 2, 0)\nishl r0.w, r1.y, l(1)\nimad r1.y, vThreadID.z, CB0[0][2].y, r1.z\nimad r0.w, r1.y, CB0[0][2].x, r0.w\niadd r0.w, r0.w, CB0[0][1].w\nif_z r0.x\n  imad r1.y, CB0[0][0].w, vThreadID.z, vThreadID.y\n  imad r1.y, CB0[0][0].z, r1.y, r1.x\n  ishl r1.y, r1.y, l(4)\nelse \n  if_nz r0.y\n    ushr r1.zw, CB0[0][0].zzzw, l(0, 0, 5, 4)\n    ishr r2.xyzw, vThreadID.zyyy, l(2, 4, 1, 3)\n    imad r0.y, r2.x, r1.w, r2.y\n    ibfe r1.w, l(27), l(4), vThreadID.x\n    imad r0.y, r0.y, r1.z, r1.w\n    bfi r1.zw, l(0, 0, 2, 1), l(0, 0, 5, 4), vThreadID.zzzy, l(0, 0, 0, 0)\n    bfi r2.y, l(2), l(3), r2.z, l(0)\n    iadd r1.z, r1.z, r2.y\n    bfi r1.z, l(3), l(0), r1.x, r1.z\n    bfi r0.y, l(25), l(7), r0.y, r1.z\n    xor r1.z, r2.x, r2.w\n    ubfe r2.x, l(2), l(3), r1.x\n    bfi r2.yz, l(0, 1, 1, 0), l(0, 1, 11, 0), r1.zzzz, l(0, 0, 0, 0)\n    xor r1.z, r2.y, r2.x\n    imad r1.z, r1.z, l(64), r1.w\n    iadd r1.z, r2.z, r1.z\n    ibfe r2.xy, l(27, 24, 0, 0), l(1, 4, 0, 0), r0.yyyy\n    bfi r0.y, l(3), l(8), r2.x, r1.z\n    bfi r1.y, l(20), l(12), r2.y, r0.y\n  else \n    ushr r0.y, CB0[0][0].z, l(5)\n    ishr r2.xyzw, vThreadID.yyyy, l(5, 1, 4, 3)\n    ibfe r1.z, l(27), l(4), vThreadID.x\n    imad r0.y, r2.x, r0.y, r1.z\n    bfi r2.xyz, l(3, 1, 1, 0), l(3, 1, 11, 0), r2.ywzy, l(0, 0, 0, 0)\n    bfi r1.z, l(3), l(0), r1.x, r2.x\n    bfi r0.y, l(26), l(6), r0.y, r1.z\n    ubfe r1.x, l(2), l(3), r1.x\n    xor r1.x, r2.y, r1.x\n    bfi r1.z, l(1), l(4), vThreadID.y, l(0)\n    imad r1.x, r1.x, l(64), r1.z\n    iadd r1.x, r2.z, r1.x\n    ibfe r1.zw, l(0, 0, 27, 24), l(0, 0, 1, 4), r0.yyyy\n    bfi r0.y, l(3), l(8), r1.z, r1.x\n    bfi r1.y, l(20), l(12), r1.w, r0.y\n  endif \nendif \niadd r0.y, r1.y, CB0[0][0].y\nld_raw r1.xyzw, r0.y, T0[0].ywxz\nieq r2.xyz, r0.zzzz, l(1, 2, 3, 0)\nor r2.xy, r2.yzyy, r2.xyxx\nif_nz r2.x\n  ishl r3.xyzw, r1.zxwy, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r1.zxwy, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r1.xyzw, r3.ywxz, r4.ywxz\nendif \nif_nz r2.y\n  ushr r3.xyzw, r1.zxwy, l(16, 16, 16, 16)\n  bfi r1.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r1.xyzw, r3.ywxz\n  mov r3.xy, r1.zwzz\nelse \n  mov r3.xy, r1.zwzz\nendif \nif_nz r0.x\n  mov r0.x, l(32)\nelse \n  mov r0.x, l(16)\nendif \niadd r0.x, r0.x, r0.y\nld_raw r4.xyzw, r0.x, T0[0].ywxz\nif_nz r2.x\n  ishl r5.xyzw, r4.zxwy, l(8, 8, 8, 8)\n  and r5.xyzw, r5.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r6.xyzw, r4.zxwy, l(8, 8, 8, 8)\n  and r6.xyzw, r6.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r4.xyzw, r5.ywxz, r6.ywxz\nendif \nif_nz r2.y\n  ushr r2.xyzw, r4.zxwy, l(16, 16, 16, 16)\n  bfi r4.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r4.xyzw, r2.ywxz\n  mov r1.zw, r4.xxxy\nelse \n  mov r1.zw, r4.xxxy\nendif \nushr r3.zw, r3.xxxy, l(0, 0, 8, 8)\nand r2.xyzw, r3.xzyw, l(255, 255, 255, 255)\nushr r4.xy, r4.zwzz, l(8, 8, 0, 0)\nand r5.xyzw, r4.zxwy, l(255, 255, 255, 255)\nmov r4.xy, r3.xyxx\nushr r3.xyzw, r4.xyzw, l(16, 16, 16, 16)\nbfi r4.xyzw, l(8, 8, 8, 8), l(16, 16, 16, 16), r1.xyzw, l(0, 0, 0, 0)\niadd r3.xyzw, r3.xyzw, r4.xyzw\nuge r0.xy, r2.ywyy, r2.xzxx\nushr r4.xyzw, r3.xxyy, l(1, 2, 1, 2)\nand r6.xy, r3.xyxx, r4.xzxx\nand r6.xy, r6.xyxx, l(0x00492492, 0x00492492, 0, 0)\nishl r6.zw, r6.xxxy, l(0, 0, 1, 1)\nushr r7.xy, r6.xyxx, l(1, 1, 0, 0)\niadd r6.xy, r6.xyxx, r6.zwzz\niadd r6.xy, r6.xyxx, r7.xyxx\nand r7.xyzw, r3.xyzw, l(0x00249249, 0x00249249, 0x00249249, 0x00249249)\niadd r8.xyzw, r7.xyzw, l(0x00db6db6, 0x00db6db6, 0x00db6db6, 0x00db6db6)\nand r6.zw, r6.xxxy, r8.xxxy\nor r8.xy, r3.xyxx, r4.xzxx\nand r9.xyzw, r4.xyzw, l(0x00249249, 0x00249249, 0x00249249, 0x00249249)\nor r4.xy, r4.ywyy, r8.xyxx\nand r4.xy, r4.xyxx, l(0x00249249, 0x00249249, 0, 0)\nxor r4.xy, r4.xyxx, l(0x00249249, 0x00249249, 0, 0)\nnot r9.xyzw, r9.xyzw\nand r10.xyzw, r7.xxyy, r9.xxzz\nand r9.xyzw, r9.yyww, r10.xyzw\nor r3.xy, r3.xyxx, r4.xyxx\niadd r3.xy, r3.xyxx, l(0xffdb6db7, 0xffdb6db7, 0, 0)\nor r3.xy, r9.xwxx, r3.xyxx\nishl r4.xyzw, r9.xyzw, l(2, 1, 2, 1)\nor r7.xy, r3.xyxx, r4.xzxx\nnot r6.xy, r6.xyxx\nand r6.xy, r6.xyxx, r7.xyxx\nor r6.xy, r6.zwzz, r6.xyxx\niadd r4.xy, r4.ywyy, r4.xzxx\nor r3.xy, r3.xyxx, r4.xyxx\nmovc r4.xy, r0.xyxx, r6.xyxx, r3.xyxx\nuge r3.xy, r5.ywyy, r5.xzxx\nushr r6.xyzw, r3.zzww, l(1, 2, 1, 2)\nand r7.xy, r3.zwzz, r6.xzxx\nand r7.xy, r7.xyxx, l(0x00492492, 0x00492492, 0, 0)\nishl r8.xy, r7.xyxx, l(1, 1, 0, 0)\nushr r9.xy, r7.xyxx, l(1, 1, 0, 0)\niadd r7.xy, r7.xyxx, r8.xyxx\niadd r7.xy, r7.xyxx, r9.xyxx\nand r8.xy, r7.xyxx, r8.zwzz\nor r8.zw, r3.zzzw, r6.xxxz\nand r9.xyzw, r6.xyzw, l(0x00249249, 0x00249249, 0x00249249, 0x00249249)\nor r6.xy, r6.ywyy, r8.zwzz\nand r6.xy, r6.xyxx, l(0x00249249, 0x00249249, 0, 0)\nxor r6.xy, r6.xyxx, l(0x00249249, 0x00249249, 0, 0)\nnot r9.xyzw, r9.xyzw\nand r10.xyzw, r7.zzww, r9.xxzz\nand r9.xyzw, r9.yyww, r10.xyzw\nor r3.zw, r3.zzzw, r6.xxxy\niadd r3.zw, r3.zzzw, l(0, 0, 0xffdb6db7, 0xffdb6db7)\nor r3.zw, r9.yyyw, r3.zzzw\nishl r6.xyzw, r9.xyzw, l(2, 1, 2, 1)\nor r7.zw, r3.zzzw, r6.xxxz\nnot r7.xy, r7.xyxx\nand r7.xy, r7.xyxx, r7.zwzz\nor r7.xy, r8.xyxx, r7.xyxx\niadd r6.xy, r6.ywyy, r6.xzxx\nor r3.zw, r3.zzzw, r6.xxxy\nmovc r4.zw, r3.xxxy, r7.xxxy, r3.zzzw\nushr r3.zw, r4.xxxy, l(0, 0, 1, 1)\nand r3.zw, r4.xxxy, r3.zzzw\nand r3.zw, r3.zzzw, l(0, 0, 1170, 1170)\nishl r6.xy, r3.zwzz, l(1, 1, 0, 0)\nushr r6.zw, r3.zzzw, l(0, 0, 1, 1)\niadd r3.zw, r3.zzzw, r6.xxxy\niadd r3.zw, r3.zzzw, r6.zzzw\nnot r6.xyzw, r3.zzzw\nand r7.xyzw, r4.xxxy, r6.zzzw\niadd r8.xyzw, -r7.zzzw, l(2925, 2925, 2925, 2925)\nand r6.xyzw, r6.xyzw, r8.xyzw\nand r8.xy, r6.zwzz, l(7, 7, 0, 0)\nand r8.zw, r7.zzzw, l(0, 0, 7, 7)\nimul null, r8.zw, r2.yyyw, r8.zzzw\nimad r8.xy, r2.xzxx, r8.xyxx, r8.zwzz\nudiv r8.xy, null, r8.xyxx, l(5, 5, 0, 0)\nubfe r9.xyzw, l(3, 3, 3, 3), l(3, 6, 9, 3), r6.xyzw\nubfe r10.xyzw, l(3, 3, 3, 3), l(3, 6, 9, 3), r7.xyzw\nimul null, r10.xyzw, r2.yyyw, r10.xyzw\nimad r9.xyzw, r2.xxxz, r9.xyzw, r10.xyzw\nudiv r9.xyzw, null, r9.xyzw, l(5, 5, 5, 5)\nimad r8.xy, r9.xwxx, l(0x00010000, 0x00010000, 0, 0), r8.xyxx\nimad r8.z, r9.z, l(0x00010000), r9.y\nand r3.zw, r3.zzzw, r4.xxxy\nishl r9.xyzw, r3.zzww, l(13, 7, 13, 7)\nand r9.xyzw, r9.xyzw, l(0x00010000, 0x00010000, 0x00010000, 0x00010000)\nbfi r10.xy, l(1, 1, 0, 0), l(0, 0, 0, 0), r3.zwzz, r9.xzxx\nubfe r3.zw, l(0, 0, 1, 1), l(0, 0, 6, 6), r3.zzzw\niadd r10.zw, r9.yyyw, r3.zzzw\nimad r3.zw, r10.xxxz, l(0, 0, 255, 255), r8.xxxz\nnot r9.xyzw, r4.xxxy\nand r6.xy, r9.zwzz, l(7, 7, 0, 0)\nand r11.xyzw, r4.xyzw, l(7, 7, 7, 7)\nimul null, r7.xy, r2.ywyy, r11.xyxx\nimad r6.xy, r2.xzxx, r6.xyxx, r7.xyxx\nudiv r6.xy, null, r6.xyxx, l(7, 7, 0, 0)\nubfe r12.xyzw, l(3, 3, 3, 3), l(3, 6, 9, 3), r9.xyzw\nubfe r13.xyzw, l(3, 3, 3, 3), l(3, 6, 9, 3), r4.xxxy\nimul null, r13.xyzw, r2.yyyw, r13.xyzw\nimad r12.xyzw, r2.xxxz, r12.xyzw, r13.xyzw\nudiv r12.xyzw, null, r12.xyzw, l(7, 7, 7, 7)\nimad r13.xy, r12.xwxx, l(0x00010000, 0x00010000, 0, 0), r6.xyxx\nimad r13.z, r12.z, l(0x00010000), r12.y\nmovc r3.zw, r0.xxxx, r3.zzzw, r13.xxxz\nubfe r6.xy, l(3, 3, 0, 0), l(6, 9, 0, 0), r6.wwww\nubfe r6.zw, l(0, 0, 3, 3), l(0, 0, 6, 9), r7.wwww\nimul null, r6.zw, r2.wwww, r6.zzzw\nimad r6.xy, r2.zzzz, r6.xyxx, r6.zwzz\nudiv r6.xy, null, r6.xyxx, l(5, 5, 0, 0)\nimad r8.w, r6.y, l(0x00010000), r6.x\nimad r6.xy, r10.ywyy, l(255, 255, 0, 0), r8.ywyy\nubfe r6.zw, l(0, 0, 3, 3), l(0, 0, 6, 9), r9.wwww\nubfe r7.xyzw, l(3, 3, 3, 3), l(6, 9, 6, 9), r4.yyww\nimul null, r7.xy, r2.wwww, r7.xyxx\nimad r6.zw, r2.zzzz, r6.zzzw, r7.xxxy\nudiv r6.zw, null, r6.zzzw, l(0, 0, 7, 7)\nimad r13.w, r6.w, l(0x00010000), r6.z\nmovc r6.xy, r0.yyyy, r6.xyxx, r13.ywyy\nishl r6.xy, r6.xyxx, l(8, 8, 0, 0)\nor r6.xy, r3.zwzz, r6.xyxx\nushr r3.zw, r4.zzzw, l(0, 0, 1, 1)\nand r3.zw, r4.zzzw, r3.zzzw\nand r3.zw, r3.zzzw, l(0, 0, 1170, 1170)\nishl r7.xy, r3.zwzz, l(1, 1, 0, 0)\nushr r8.xy, r3.zwzz, l(1, 1, 0, 0)\niadd r3.zw, r3.zzzw, r7.xxxy\niadd r3.zw, r3.zzzw, r8.xxxy\nnot r8.xyzw, r3.zzzw\nand r9.xyzw, r4.zzzw, r8.zzzw\niadd r10.xyzw, -r9.zzzw, l(2925, 2925, 2925, 2925)\nand r8.xyzw, r8.xyzw, r10.xyzw\nand r7.xy, r8.zwzz, l(7, 7, 0, 0)\nand r10.xy, r9.zwzz, l(7, 7, 0, 0)\nimul null, r10.xy, r5.ywyy, r10.xyxx\nimad r7.xy, r5.xzxx, r7.xyxx, r10.xyxx\nudiv r7.xy, null, r7.xyxx, l(5, 5, 0, 0)\nubfe r10.xyzw, l(3, 3, 3, 3), l(3, 6, 9, 3), r8.xyzw\nubfe r12.xyzw, l(3, 3, 3, 3), l(3, 6, 9, 3), r9.xyzw\nimul null, r12.xyzw, r5.yyyw, r12.xyzw\nimad r10.xyzw, r5.xxxz, r10.xyzw, r12.xyzw\nudiv r10.xyzw, null, r10.xyzw, l(5, 5, 5, 5)\nimad r12.xy, r10.xwxx, l(0x00010000, 0x00010000, 0, 0), r7.xyxx\nimad r12.z, r10.z, l(0x00010000), r10.y\nand r3.zw, r3.zzzw, r4.zzzw\nishl r10.xyzw, r3.zzww, l(13, 7, 13, 7)\nand r10.xyzw, r10.xyzw, l(0x00010000, 0x00010000, 0x00010000, 0x00010000)\nbfi r13.xy, l(1, 1, 0, 0), l(0, 0, 0, 0), r3.zwzz, r10.xzxx\nubfe r3.zw, l(0, 0, 1, 1), l(0, 0, 6, 6), r3.zzzw\niadd r13.zw, r10.yyyw, r3.zzzw\nimad r3.zw, r13.xxxz, l(0, 0, 255, 255), r12.xxxz\nnot r10.xyzw, r4.zzzw\nand r7.xy, r10.zwzz, l(7, 7, 0, 0)\nimul null, r8.xy, r5.ywyy, r11.zwzz\nimad r7.xy, r5.xzxx, r7.xyxx, r8.xyxx\nudiv r7.xy, null, r7.xyxx, l(7, 7, 0, 0)\nubfe r11.xyzw, l(3, 3, 3, 3), l(3, 6, 9, 3), r10.xyzw\nubfe r14.xyzw, l(3, 3, 3, 3), l(3, 6, 9, 3), r4.zzzw\nimul null, r14.xyzw, r5.yyyw, r14.xyzw\nimad r11.xyzw, r5.xxxz, r11.xyzw, r14.xyzw\nudiv r11.xyzw, null, r11.xyzw, l(7, 7, 7, 7)\nimad r14.xy, r11.xwxx, l(0x00010000, 0x00010000, 0, 0), r7.xyxx\nimad r14.z, r11.z, l(0x00010000), r11.y\nmovc r3.zw, r3.xxxx, r3.zzzw, r14.xxxz\nubfe r7.xy, l(3, 3, 0, 0), l(6, 9, 0, 0), r8.wwww\nubfe r8.xy, l(3, 3, 0, 0), l(6, 9, 0, 0), r9.wwww\nimul null, r8.xy, r5.wwww, r8.xyxx\nimad r7.xy, r5.zzzz, r7.xyxx, r8.xyxx\nudiv r7.xy, null, r7.xyxx, l(5, 5, 0, 0)\nimad r12.w, r7.y, l(0x00010000), r7.x\nimad r7.xy, r13.ywyy, l(255, 255, 0, 0), r12.ywyy\nubfe r8.xy, l(3, 3, 0, 0), l(6, 9, 0, 0), r10.wwww\nimul null, r7.zw, r5.wwww, r7.zzzw\nimad r7.zw, r5.zzzz, r8.xxxy, r7.zzzw\nudiv r7.zw, null, r7.zzzw, l(0, 0, 7, 7)\nimad r14.w, r7.w, l(0x00010000), r7.z\nmovc r7.xy, r3.yyyy, r7.xyxx, r14.ywyy\nishl r7.xy, r7.xyxx, l(8, 8, 0, 0)\nor r6.zw, r3.zzzw, r7.xxxy\nstore_raw U0[0].xyzw, r0.w, r6.xyzw\nimad r0.z, vThreadID.y, l(4), l(1)\nult r3.z, r0.z, CB0[0][2].y\nif_nz r3.z\n  iadd r0.w, r0.w, CB0[0][2].x\n  ushr r6.xyzw, r4.xyzw, l(12, 12, 12, 12)\n  ushr r7.xyzw, r6.xyzw, l(1, 1, 1, 1)\n  and r7.xyzw, r6.xyzw, r7.xyzw\n  and r7.xyzw, r7.xyzw, l(1170, 1170, 1170, 1170)\n  ishl r8.xyzw, r7.xyzw, l(1, 1, 1, 1)\n  ushr r9.xyzw, r7.xyzw, l(1, 1, 1, 1)\n  iadd r7.xyzw, r7.xyzw, r8.xyzw\n  iadd r7.xyzw, r7.xyzw, r9.xyzw\n  not r8.xyzw, r7.xyzw\n  and r9.xyzw, r6.xyzw, r8.xyzw\n  iadd r10.xyzw, -r9.xyzw, l(2925, 2925, 2925, 2925)\n  and r8.xyzw, r8.xyzw, r10.xyzw\n  and r10.xyzw, r8.xyzw, l(7, 7, 7, 7)\n  and r11.xyzw, r9.xyzw, l(7, 7, 7, 7)\n  imul null, r3.zw, r2.yyyw, r11.xxxy\n  imad r3.zw, r2.xxxz, r10.xxxy, r3.zzzw\n  udiv r3.zw, null, r3.zzzw, l(0, 0, 5, 5)\n  ubfe r12.xyzw, l(3, 3, 3, 3), l(3, 6, 9, 3), r8.xxxy\n  ubfe r13.xyzw, l(3, 3, 3, 3), l(3, 6, 9, 3), r9.xxxy\n  imul null, r13.xyzw, r2.yyyw, r13.xyzw\n  imad r12.xyzw, r2.xxxz, r12.xyzw, r13.xyzw\n  udiv r12.xyzw, null, r12.xyzw, l(5, 5, 5, 5)\n  imad r13.xy, r12.xwxx, l(0x00010000, 0x00010000, 0, 0), r3.zwzz\n  imad r13.z, r12.z, l(0x00010000), r12.y\n  and r7.xyzw, r6.xyzw, r7.xyzw\n  ishl r12.xyzw, r7.xxyy, l(13, 7, 13, 7)\n  and r12.xyzw, r12.xyzw, l(0x00010000, 0x00010000, 0x00010000, 0x00010000)\n  bfi r14.xy, l(1, 1, 0, 0), l(0, 0, 0, 0), r7.xyxx, r12.xzxx\n  ubfe r15.xyzw, l(1, 1, 1, 1), l(6, 6, 6, 6), r7.xyzw\n  iadd r14.zw, r12.yyyw, r15.xxxy\n  imad r3.zw, r14.xxxz, l(0, 0, 255, 255), r13.xxxz\n  not r6.xyzw, r6.xyzw\n  and r12.xyzw, r6.xyzw, l(7, 7, 7, 7)\n  ubfe r16.xyzw, l(3, 3, 3, 3), l(12, 15, 18, 21), r4.xxxx\n  imul null, r16.xyzw, r2.yyyy, r16.xyzw\n  imad r4.x, r2.x, r12.x, r16.x\n  udiv r4.x, null, r4.x, l(7)\n  ubfe r17.xyzw, l(3, 3, 3, 3), l(3, 6, 9, 3), r6.xxxy\n  imad r16.xyz, r2.xxxx, r17.xyzx, r16.yzwy\n  udiv r16.xyz, null, r16.xyzx, l(7, 7, 7, 0)\n  imad r7.x, r16.x, l(0x00010000), r4.x\n  imad r7.y, r16.z, l(0x00010000), r16.y\n  movc r3.zw, r0.xxxx, r3.zzzw, r7.xxxy\n  ubfe r16.xyzw, l(3, 3, 3, 3), l(6, 9, 3, 6), r8.yyzz\n  ubfe r18.xyzw, l(3, 3, 3, 3), l(6, 9, 3, 6), r9.yyzz\n  imul null, r7.xy, r2.wwww, r18.xyxx\n  imad r7.xy, r2.zzzz, r16.xyxx, r7.xyxx\n  udiv r7.xy, null, r7.xyxx, l(5, 5, 0, 0)\n  imad r13.w, r7.y, l(0x00010000), r7.x\n  imad r7.xy, r14.ywyy, l(255, 255, 0, 0), r13.ywyy\n  ubfe r13.xyzw, l(3, 3, 3, 3), l(12, 15, 18, 21), r4.yyyy\n  imul null, r13.xyzw, r2.wwww, r13.xyzw\n  imad r4.x, r2.z, r12.y, r13.x\n  imad r4.y, r2.z, r17.w, r13.y\n  udiv r4.xy, null, r4.xyxx, l(7, 7, 0, 0)\n  imad r4.x, r4.y, l(0x00010000), r4.x\n  ubfe r14.xyzw, l(3, 3, 3, 3), l(6, 9, 3, 6), r6.yyzz\n  imad r6.xy, r2.zzzz, r14.xyxx, r13.zwzz\n  udiv r6.xy, null, r6.xyxx, l(7, 7, 0, 0)\n  imad r4.y, r6.y, l(0x00010000), r6.x\n  movc r4.xy, r0.yyyy, r7.xyxx, r4.xyxx\n  ishl r4.xy, r4.xyxx, l(8, 8, 0, 0)\n  or r13.xy, r3.zwzz, r4.xyxx\n  imul null, r3.zw, r5.yyyw, r11.zzzw\n  imad r3.zw, r5.xxxz, r10.zzzw, r3.zzzw\n  udiv r3.zw, null, r3.zzzw, l(0, 0, 5, 5)\n  imul null, r4.xy, r5.yyyy, r18.zwzz\n  imad r4.xy, r5.xxxx, r16.zwzz, r4.xyxx\n  udiv r4.xy, null, r4.xyxx, l(5, 5, 0, 0)\n  imad r10.z, r4.x, l(0x00010000), r3.z\n  ubfe r8.xyzw, l(3, 3, 3, 3), l(9, 3, 6, 9), r8.zwww\n  ubfe r9.xyzw, l(3, 3, 3, 3), l(9, 3, 6, 9), r9.zwww\n  imul null, r9.xyzw, r5.ywww, r9.xyzw\n  imad r8.xyzw, r5.xzzz, r8.xyzw, r9.xyzw\n  udiv r8.xyzw, null, r8.xyzw, l(5, 5, 5, 5)\n  imad r10.w, r8.x, l(0x00010000), r4.y\n  ishl r9.xyzw, r7.zzww, l(13, 7, 13, 7)\n  and r9.xyzw, r9.xyzw, l(0x00010000, 0x00010000, 0x00010000, 0x00010000)\n  bfi r7.xy, l(1, 1, 0, 0), l(0, 0, 0, 0), r7.zwzz, r9.xzxx\n  iadd r7.zw, r9.yyyw, r15.zzzw\n  imad r4.xy, r7.xzxx, l(255, 255, 0, 0), r10.zwzz\n  ubfe r9.xyzw, l(3, 3, 3, 3), l(12, 15, 18, 21), r4.zzzz\n  imul null, r9.xyzw, r5.yyyy, r9.xyzw\n  imad r3.z, r5.x, r12.z, r9.x\n  udiv r3.z, null, r3.z, l(7)\n  imad r6.xy, r5.xxxx, r14.zwzz, r9.yzyy\n  udiv r6.xy, null, r6.xyxx, l(7, 7, 0, 0)\n  imad r10.z, r6.x, l(0x00010000), r3.z\n  ubfe r11.xyzw, l(3, 3, 3, 3), l(9, 3, 6, 9), r6.zwww\n  imad r3.z, r5.x, r11.x, r9.w\n  udiv r3.z, null, r3.z, l(7)\n  imad r10.w, r3.z, l(0x00010000), r6.y\n  movc r4.xy, r3.xxxx, r4.xyxx, r10.zwzz\n  imad r3.z, r8.y, l(0x00010000), r3.w\n  imad r3.w, r8.w, l(0x00010000), r8.z\n  imad r3.zw, r7.yyyw, l(0, 0, 255, 255), r3.zzzw\n  ubfe r6.xyzw, l(3, 3, 3, 3), l(12, 15, 18, 21), r4.wwww\n  imul null, r6.xyzw, r5.wwww, r6.xyzw\n  imad r4.z, r5.z, r12.w, r6.x\n  udiv r4.z, null, r4.z, l(7)\n  imad r6.xyz, r5.zzzz, r11.yzwy, r6.yzwy\n  udiv r6.xyz, null, r6.xyzx, l(7, 7, 7, 0)\n  imad r4.z, r6.x, l(0x00010000), r4.z\n  imad r4.w, r6.z, l(0x00010000), r6.y\n  movc r3.zw, r3.yyyy, r3.zzzw, r4.zzzw\n  ishl r3.zw, r3.zzzw, l(0, 0, 8, 8)\n  or r13.zw, r3.zzzw, r4.xxxy\n  store_raw U0[0].xyzw, r0.w, r13.xyzw\n  iadd r0.z, r0.z, l(1)\n  ult r3.z, r0.z, CB0[0][2].y\n  if_nz r3.z\n    iadd r0.w, r0.w, CB0[0][2].x\n    ushr r1.xyzw, r1.xyzw, l(8, 8, 8, 8)\n    ushr r4.xyzw, r1.xxyy, l(1, 2, 1, 2)\n    and r3.zw, r1.xxxy, r4.xxxz\n    and r3.zw, r3.zzzw, l(0, 0, 0x00492492, 0x00492492)\n    ishl r6.xy, r3.zwzz, l(1, 1, 0, 0)\n    ushr r6.zw, r3.zzzw, l(0, 0, 1, 1)\n    iadd r3.zw, r3.zzzw, r6.xxxy\n    iadd r3.zw, r3.zzzw, r6.zzzw\n    and r6.xyzw, r1.xyzw, l(0x00249249, 0x00249249, 0x00249249, 0x00249249)\n    iadd r7.xyzw, r6.xyzw, l(0x00db6db6, 0x00db6db6, 0x00db6db6, 0x00db6db6)\n    and r7.xy, r3.zwzz, r7.xyxx\n    or r8.xy, r1.xyxx, r4.xzxx\n    and r9.xyzw, r4.xyzw, l(0x00249249, 0x00249249, 0x00249249, 0x00249249)\n    or r4.xy, r4.ywyy, r8.xyxx\n    and r4.xy, r4.xyxx, l(0x00249249, 0x00249249, 0, 0)\n    xor r4.xy, r4.xyxx, l(0x00249249, 0x00249249, 0, 0)\n    not r8.xyzw, r9.xyzw\n    and r9.xyzw, r6.xxyy, r8.xxzz\n    and r8.xyzw, r8.yyww, r9.xyzw\n    or r1.xy, r1.xyxx, r4.xyxx\n    iadd r1.xy, r1.xyxx, l(0xffdb6db7, 0xffdb6db7, 0, 0)\n    or r1.xy, r8.xwxx, r1.xyxx\n    ishl r4.xyzw, r8.xyzw, l(2, 1, 2, 1)\n    or r6.xy, r1.xyxx, r4.xzxx\n    not r3.zw, r3.zzzw\n    and r3.zw, r3.zzzw, r6.xxxy\n    or r3.zw, r7.xxxy, r3.zzzw\n    iadd r4.xy, r4.ywyy, r4.xzxx\n    or r1.xy, r1.xyxx, r4.xyxx\n    movc r4.xy, r0.xyxx, r3.zwzz, r1.xyxx\n    ushr r8.xyzw, r1.zzww, l(1, 2, 1, 2)\n    and r1.xy, r1.zwzz, r8.xzxx\n    and r1.xy, r1.xyxx, l(0x00492492, 0x00492492, 0, 0)\n    ishl r3.zw, r1.xxxy, l(0, 0, 1, 1)\n    ushr r6.xy, r1.xyxx, l(1, 1, 0, 0)\n    iadd r1.xy, r1.xyxx, r3.zwzz\n    iadd r1.xy, r1.xyxx, r6.xyxx\n    and r3.zw, r1.xxxy, r7.zzzw\n    or r6.xy, r1.zwzz, r8.xzxx\n    and r7.xyzw, r8.xyzw, l(0x00249249, 0x00249249, 0x00249249, 0x00249249)\n    or r6.xy, r8.ywyy, r6.xyxx\n    and r6.xy, r6.xyxx, l(0x00249249, 0x00249249, 0, 0)\n    xor r6.xy, r6.xyxx, l(0x00249249, 0x00249249, 0, 0)\n    not r7.xyzw, r7.xyzw\n    and r8.xyzw, r6.zzww, r7.xxzz\n    and r7.xyzw, r7.yyww, r8.xyzw\n    or r1.zw, r1.zzzw, r6.xxxy\n    iadd r1.zw, r1.zzzw, l(0, 0, 0xffdb6db7, 0xffdb6db7)\n    or r1.zw, r7.yyyw, r1.zzzw\n    ishl r6.xyzw, r7.xyzw, l(2, 1, 2, 1)\n    or r7.xy, r1.zwzz, r6.xzxx\n    not r1.xy, r1.xyxx\n    and r1.xy, r1.xyxx, r7.xyxx\n    or r1.xy, r3.zwzz, r1.xyxx\n    iadd r3.zw, r6.yyyw, r6.xxxz\n    or r1.zw, r1.zzzw, r3.zzzw\n    movc r4.zw, r3.xxxy, r1.xxxy, r1.zzzw\n    ushr r1.xy, r4.xyxx, l(1, 1, 0, 0)\n    and r1.xy, r4.xyxx, r1.xyxx\n    and r1.xy, r1.xyxx, l(1170, 1170, 0, 0)\n    ishl r1.zw, r1.xxxy, l(0, 0, 1, 1)\n    ushr r3.zw, r1.xxxy, l(0, 0, 1, 1)\n    iadd r1.xy, r1.xyxx, r1.zwzz\n    iadd r1.xy, r1.xyxx, r3.zwzz\n    not r6.xyzw, r1.xxxy\n    and r7.xyzw, r4.xxxy, r6.zzzw\n    iadd r8.xyzw, -r7.zzzw, l(2925, 2925, 2925, 2925)\n    and r6.xyzw, r6.xyzw, r8.xyzw\n    and r1.zw, r6.zzzw, l(0, 0, 7, 7)\n    and r3.zw, r7.zzzw, l(0, 0, 7, 7)\n    imul null, r3.zw, r2.yyyw, r3.zzzw\n    imad r1.zw, r2.xxxz, r1.zzzw, r3.zzzw\n    udiv r1.zw, null, r1.zzzw, l(0, 0, 5, 5)\n    ubfe r8.xyzw, l(3, 3, 3, 3), l(3, 6, 9, 3), r6.xyzw\n    ubfe r9.xyzw, l(3, 3, 3, 3), l(3, 6, 9, 3), r7.xyzw\n    imul null, r9.xyzw, r2.yyyw, r9.xyzw\n    imad r8.xyzw, r2.xxxz, r8.xyzw, r9.xyzw\n    udiv r8.xyzw, null, r8.xyzw, l(5, 5, 5, 5)\n    imad r9.xy, r8.xwxx, l(0x00010000, 0x00010000, 0, 0), r1.zwzz\n    imad r9.z, r8.z, l(0x00010000), r8.y\n    and r1.xy, r1.xyxx, r4.xyxx\n    ishl r8.xyzw, r1.xxyy, l(13, 7, 13, 7)\n    and r8.xyzw, r8.xyzw, l(0x00010000, 0x00010000, 0x00010000, 0x00010000)\n    bfi r10.xy, l(1, 1, 0, 0), l(0, 0, 0, 0), r1.xyxx, r8.xzxx\n    ubfe r1.xy, l(1, 1, 0, 0), l(6, 6, 0, 0), r1.xyxx\n    iadd r10.zw, r8.yyyw, r1.xxxy\n    imad r1.xy, r10.xzxx, l(255, 255, 0, 0), r9.xzxx\n    not r8.xyzw, r4.xxxy\n    and r1.zw, r8.zzzw, l(0, 0, 7, 7)\n    and r11.xyzw, r4.xyzw, l(7, 7, 7, 7)\n    imul null, r3.zw, r2.yyyw, r11.xxxy\n    imad r1.zw, r2.xxxz, r1.zzzw, r3.zzzw\n    udiv r1.zw, null, r1.zzzw, l(0, 0, 7, 7)\n    ubfe r12.xyzw, l(3, 3, 3, 3), l(3, 6, 9, 3), r8.xyzw\n    ubfe r13.xyzw, l(3, 3, 3, 3), l(3, 6, 9, 3), r4.xxxy\n    imul null, r13.xyzw, r2.yyyw, r13.xyzw\n    imad r12.xyzw, r2.xxxz, r12.xyzw, r13.xyzw\n    udiv r12.xyzw, null, r12.xyzw, l(7, 7, 7, 7)\n    imad r13.xy, r12.xwxx, l(0x00010000, 0x00010000, 0, 0), r1.zwzz\n    imad r13.z, r12.z, l(0x00010000), r12.y\n    ubfe r1.zw, l(0, 0, 3, 3), l(0, 0, 6, 9), r6.wwww\n    ubfe r3.zw, l(0, 0, 3, 3), l(0, 0, 6, 9), r7.wwww\n    imul null, r3.zw, r2.wwww, r3.zzzw\n    imad r1.zw, r2.zzzz, r1.zzzw, r3.zzzw\n    udiv r1.zw, null, r1.zzzw, l(0, 0, 5, 5)\n    imad r9.w, r1.w, l(0x00010000), r1.z\n    imad r1.zw, r10.yyyw, l(0, 0, 255, 255), r9.yyyw\n    ubfe r3.zw, l(0, 0, 3, 3), l(0, 0, 6, 9), r8.wwww\n    ubfe r6.xyzw, l(3, 3, 3, 3), l(6, 9, 6, 9), r4.yyww\n    imul null, r6.xy, r2.wwww, r6.xyxx\n    imad r3.zw, r2.zzzz, r3.zzzw, r6.xxxy\n    udiv r3.zw, null, r3.zzzw, l(0, 0, 7, 7)\n    imad r13.w, r3.w, l(0x00010000), r3.z\n    movc r1.xyzw, r0.xxyy, r1.xyzw, r13.xzyw\n    ishl r1.zw, r1.zzzw, l(0, 0, 8, 8)\n    or r1.xy, r1.zwzz, r1.xyxx\n    ushr r3.zw, r4.zzzw, l(0, 0, 1, 1)\n    and r3.zw, r4.zzzw, r3.zzzw\n    and r3.zw, r3.zzzw, l(0, 0, 1170, 1170)\n    ishl r6.xy, r3.zwzz, l(1, 1, 0, 0)\n    ushr r7.xy, r3.zwzz, l(1, 1, 0, 0)\n    iadd r3.zw, r3.zzzw, r6.xxxy\n    iadd r3.zw, r3.zzzw, r7.xxxy\n    not r7.xyzw, r3.zzzw\n    and r8.xyzw, r4.zzzw, r7.zzzw\n    iadd r9.xyzw, -r8.zzzw, l(2925, 2925, 2925, 2925)\n    and r7.xyzw, r7.xyzw, r9.xyzw\n    and r6.xy, r7.zwzz, l(7, 7, 0, 0)\n    and r9.xy, r8.zwzz, l(7, 7, 0, 0)\n    imul null, r9.xy, r5.ywyy, r9.xyxx\n    imad r6.xy, r5.xzxx, r6.xyxx, r9.xyxx\n    udiv r6.xy, null, r6.xyxx, l(5, 5, 0, 0)\n    ubfe r9.xyzw, l(3, 3, 3, 3), l(3, 6, 9, 3), r7.xyzw\n    ubfe r10.xyzw, l(3, 3, 3, 3), l(3, 6, 9, 3), r8.xyzw\n    imul null, r10.xyzw, r5.yyyw, r10.xyzw\n    imad r9.xyzw, r5.xxxz, r9.xyzw, r10.xyzw\n    udiv r9.xyzw, null, r9.xyzw, l(5, 5, 5, 5)\n    imad r10.xy, r9.xwxx, l(0x00010000, 0x00010000, 0, 0), r6.xyxx\n    imad r10.z, r9.z, l(0x00010000), r9.y\n    and r3.zw, r3.zzzw, r4.zzzw\n    ishl r9.xyzw, r3.zzww, l(13, 7, 13, 7)\n    and r9.xyzw, r9.xyzw, l(0x00010000, 0x00010000, 0x00010000, 0x00010000)\n    bfi r12.xy, l(1, 1, 0, 0), l(0, 0, 0, 0), r3.zwzz, r9.xzxx\n    ubfe r3.zw, l(0, 0, 1, 1), l(0, 0, 6, 6), r3.zzzw\n    iadd r12.zw, r9.yyyw, r3.zzzw\n    imad r3.zw, r12.xxxz, l(0, 0, 255, 255), r10.xxxz\n    not r9.xyzw, r4.zzzw\n    and r6.xy, r9.zwzz, l(7, 7, 0, 0)\n    imul null, r7.xy, r5.ywyy, r11.zwzz\n    imad r6.xy, r5.xzxx, r6.xyxx, r7.xyxx\n    udiv r6.xy, null, r6.xyxx, l(7, 7, 0, 0)\n    ubfe r11.xyzw, l(3, 3, 3, 3), l(3, 6, 9, 3), r9.xyzw\n    ubfe r13.xyzw, l(3, 3, 3, 3), l(3, 6, 9, 3), r4.zzzw\n    imul null, r13.xyzw, r5.yyyw, r13.xyzw\n    imad r11.xyzw, r5.xxxz, r11.xyzw, r13.xyzw\n    udiv r11.xyzw, null, r11.xyzw, l(7, 7, 7, 7)\n    imad r13.xy, r11.xwxx, l(0x00010000, 0x00010000, 0, 0), r6.xyxx\n    imad r13.z, r11.z, l(0x00010000), r11.y\n    movc r3.zw, r3.xxxx, r3.zzzw, r13.xxxz\n    ubfe r6.xy, l(3, 3, 0, 0), l(6, 9, 0, 0), r7.wwww\n    ubfe r7.xy, l(3, 3, 0, 0), l(6, 9, 0, 0), r8.wwww\n    imul null, r7.xy, r5.wwww, r7.xyxx\n    imad r6.xy, r5.zzzz, r6.xyxx, r7.xyxx\n    udiv r6.xy, null, r6.xyxx, l(5, 5, 0, 0)\n    imad r10.w, r6.y, l(0x00010000), r6.x\n    imad r6.xy, r12.ywyy, l(255, 255, 0, 0), r10.ywyy\n    ubfe r7.xy, l(3, 3, 0, 0), l(6, 9, 0, 0), r9.wwww\n    imul null, r6.zw, r5.wwww, r6.zzzw\n    imad r6.zw, r5.zzzz, r7.xxxy, r6.zzzw\n    udiv r6.zw, null, r6.zzzw, l(0, 0, 7, 7)\n    imad r13.w, r6.w, l(0x00010000), r6.z\n    movc r6.xy, r3.yyyy, r6.xyxx, r13.ywyy\n    ishl r6.xy, r6.xyxx, l(8, 8, 0, 0)\n    or r1.zw, r3.zzzw, r6.xxxy\n    store_raw U0[0].xyzw, r0.w, r1.xyzw\n    or r0.z, r0.z, l(3)\n    ult r0.z, r0.z, CB0[0][2].y\n    if_nz r0.z\n      iadd r0.z, r0.w, CB0[0][2].x\n      ushr r1.xyzw, r4.xyzw, l(12, 12, 12, 12)\n      ushr r6.xyzw, r1.xyzw, l(1, 1, 1, 1)\n      and r6.xyzw, r1.xyzw, r6.xyzw\n      and r6.xyzw, r6.xyzw, l(1170, 1170, 1170, 1170)\n      ishl r7.xyzw, r6.xyzw, l(1, 1, 1, 1)\n      ushr r8.xyzw, r6.xyzw, l(1, 1, 1, 1)\n      iadd r6.xyzw, r6.xyzw, r7.xyzw\n      iadd r6.xyzw, r6.xyzw, r8.xyzw\n      not r7.xyzw, r6.xyzw\n      and r8.xyzw, r1.xyzw, r7.xyzw\n      iadd r9.xyzw, -r8.xyzw, l(2925, 2925, 2925, 2925)\n      and r7.xyzw, r7.xyzw, r9.xyzw\n      and r9.xyzw, r7.xyzw, l(7, 7, 7, 7)\n      and r10.xyzw, r8.xyzw, l(7, 7, 7, 7)\n      imul null, r3.zw, r2.yyyw, r10.xxxy\n      imad r3.zw, r2.xxxz, r9.xxxy, r3.zzzw\n      udiv r3.zw, null, r3.zzzw, l(0, 0, 5, 5)\n      ubfe r11.xyzw, l(3, 3, 3, 3), l(3, 6, 9, 3), r7.xxxy\n      ubfe r12.xyzw, l(3, 3, 3, 3), l(3, 6, 9, 3), r8.xxxy\n      imul null, r12.xyzw, r2.yyyw, r12.xyzw\n      imad r11.xyzw, r2.xxxz, r11.xyzw, r12.xyzw\n      udiv r11.xyzw, null, r11.xyzw, l(5, 5, 5, 5)\n      imad r12.xy, r11.xwxx, l(0x00010000, 0x00010000, 0, 0), r3.zwzz\n      imad r12.z, r11.z, l(0x00010000), r11.y\n      and r6.xyzw, r1.xyzw, r6.xyzw\n      ishl r11.xyzw, r6.xxyy, l(13, 7, 13, 7)\n      and r11.xyzw, r11.xyzw, l(0x00010000, 0x00010000, 0x00010000, 0x00010000)\n      bfi r13.xy, l(1, 1, 0, 0), l(0, 0, 0, 0), r6.xyxx, r11.xzxx\n      ubfe r14.xyzw, l(1, 1, 1, 1), l(6, 6, 6, 6), r6.xyzw\n      iadd r13.zw, r11.yyyw, r14.xxxy\n      imad r3.zw, r13.xxxz, l(0, 0, 255, 255), r12.xxxz\n      not r1.xyzw, r1.xyzw\n      and r11.xyzw, r1.xyzw, l(7, 7, 7, 7)\n      ubfe r15.xyzw, l(3, 3, 3, 3), l(12, 15, 18, 21), r4.xxxx\n      imul null, r15.xyzw, r2.yyyy, r15.xyzw\n      imad r0.w, r2.x, r11.x, r15.x\n      udiv r0.w, null, r0.w, l(7)\n      ubfe r16.xyzw, l(3, 3, 3, 3), l(3, 6, 9, 3), r1.xxxy\n      imad r15.xyz, r2.xxxx, r16.xyzx, r15.yzwy\n      udiv r15.xyz, null, r15.xyzx, l(7, 7, 7, 0)\n      imad r2.x, r15.x, l(0x00010000), r0.w\n      imad r2.y, r15.z, l(0x00010000), r15.y\n      movc r0.xw, r0.xxxx, r3.zzzw, r2.xxxy\n      ubfe r15.xyzw, l(3, 3, 3, 3), l(6, 9, 3, 6), r7.yyzz\n      ubfe r17.xyzw, l(3, 3, 3, 3), l(6, 9, 3, 6), r8.yyzz\n      imul null, r2.xy, r2.wwww, r17.xyxx\n      imad r2.xy, r2.zzzz, r15.xyxx, r2.xyxx\n      udiv r2.xy, null, r2.xyxx, l(5, 5, 0, 0)\n      imad r12.w, r2.y, l(0x00010000), r2.x\n      imad r2.xy, r13.ywyy, l(255, 255, 0, 0), r12.ywyy\n      ubfe r12.xyzw, l(3, 3, 3, 3), l(12, 15, 18, 21), r4.yyyy\n      imul null, r12.xyzw, r2.wwww, r12.xyzw\n      imad r1.x, r2.z, r11.y, r12.x\n      udiv r1.x, null, r1.x, l(7)\n      imad r2.w, r2.z, r16.w, r12.y\n      udiv r2.w, null, r2.w, l(7)\n      imad r4.x, r2.w, l(0x00010000), r1.x\n      ubfe r13.xyzw, l(3, 3, 3, 3), l(6, 9, 3, 6), r1.yyzz\n      imad r1.xy, r2.zzzz, r13.xyxx, r12.zwzz\n      udiv r1.xy, null, r1.xyxx, l(7, 7, 0, 0)\n      imad r4.y, r1.y, l(0x00010000), r1.x\n      movc r1.xy, r0.yyyy, r2.xyxx, r4.xyxx\n      ishl r1.xy, r1.xyxx, l(8, 8, 0, 0)\n      or r2.xy, r0.xwxx, r1.xyxx\n      imul null, r0.xy, r5.ywyy, r10.zwzz\n      imad r0.xy, r5.xzxx, r9.zwzz, r0.xyxx\n      udiv r0.xy, null, r0.xyxx, l(5, 5, 0, 0)\n      imul null, r1.xy, r5.yyyy, r17.zwzz\n      imad r1.xy, r5.xxxx, r15.zwzz, r1.xyxx\n      udiv r1.xy, null, r1.xyxx, l(5, 5, 0, 0)\n      imad r3.z, r1.x, l(0x00010000), r0.x\n      ubfe r7.xyzw, l(3, 3, 3, 3), l(9, 3, 6, 9), r7.zwww\n      ubfe r8.xyzw, l(3, 3, 3, 3), l(9, 3, 6, 9), r8.zwww\n      imul null, r8.xyzw, r5.ywww, r8.xyzw\n      imad r7.xyzw, r5.xzzz, r7.xyzw, r8.xyzw\n      udiv r7.xyzw, null, r7.xyzw, l(5, 5, 5, 5)\n      imad r3.w, r7.x, l(0x00010000), r1.y\n      ishl r8.xyzw, r6.zzww, l(13, 7, 13, 7)\n      and r8.xyzw, r8.xyzw, l(0x00010000, 0x00010000, 0x00010000, 0x00010000)\n      bfi r6.xy, l(1, 1, 0, 0), l(0, 0, 0, 0), r6.zwzz, r8.xzxx\n      iadd r6.zw, r8.yyyw, r14.zzzw\n      imad r0.xw, r6.xxxz, l(255, 0, 0, 255), r3.zzzw\n      ubfe r8.xyzw, l(3, 3, 3, 3), l(12, 15, 18, 21), r4.zzzz\n      imul null, r8.xyzw, r5.yyyy, r8.xyzw\n      imad r1.x, r5.x, r11.z, r8.x\n      udiv r1.x, null, r1.x, l(7)\n      imad r3.zw, r5.xxxx, r13.zzzw, r8.yyyz\n      udiv r3.zw, null, r3.zzzw, l(0, 0, 7, 7)\n      imad r9.z, r3.z, l(0x00010000), r1.x\n      ubfe r1.xyzw, l(3, 3, 3, 3), l(9, 3, 6, 9), r1.zwww\n      imad r1.x, r5.x, r1.x, r8.w\n      udiv r1.x, null, r1.x, l(7)\n      imad r9.w, r1.x, l(0x00010000), r3.w\n      movc r0.xw, r3.xxxx, r0.xxxw, r9.zzzw\n      imad r3.z, r7.y, l(0x00010000), r0.y\n      imad r3.w, r7.w, l(0x00010000), r7.z\n      imad r3.xz, r6.yywy, l(255, 0, 255, 0), r3.zzwz\n      ubfe r4.xyzw, l(3, 3, 3, 3), l(12, 15, 18, 21), r4.wwww\n      imul null, r4.xyzw, r4.xyzw, r5.wwww\n      imad r0.y, r5.z, r11.w, r4.x\n      udiv r0.y, null, r0.y, l(7)\n      imad r1.xyz, r5.zzzz, r1.yzwy, r4.yzwy\n      udiv r1.xyz, null, r1.xyzx, l(7, 7, 7, 0)\n      imad r4.z, r1.x, l(0x00010000), r0.y\n      imad r4.w, r1.z, l(0x00010000), r1.y\n      movc r1.xy, r3.yyyy, r3.xzxx, r4.zwzz\n      ishl r1.xy, r1.xyxx, l(8, 8, 0, 0)\n      or r2.zw, r0.xxxw, r1.xxxy\n      store_raw U0[0].xyzw, r0.z, r2.xyzw\n    endif \n  endif \nendif \nret \n// Approximately 689 instruction slots used\n#endif\n\nconst BYTE texture_load_dxn_rg8_cs[] =\n{\n     68,  88,  66,  67, 128,  39, \n    206, 183, 141,  68, 175, 235, \n     49,  95,  46, 181,  25,  47, \n    141, 103,   1,   0,   0,   0, \n     76, 105,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n    176, 104,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n    116, 100,   0,   0,  81,   0, \n      5,   0,  29,  25,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,  19,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  12,  50,   0,  16,   0, \n      0,   0,   0,   0,   6, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n    194,   0,  16,   0,   0,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0,   6, 132, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  11, \n     66,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10,  98,   0,  16,   0, \n      1,   0,   0,   0,   6,   1, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,   7, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     35,   0,   0,  10,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,   2,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  35,   0, \n      0,  11, 130,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     30,   0,   0,   9, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  58, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     31,   0,   0,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  42,   0, \n      2,   0,  26,   0,   2,   0, \n     35,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     42, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  41,   0,   0,   7, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     18,   0,   0,   1,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  12, 194,   0,  16,   0, \n      1,   0,   0,   0, 166, 142, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   5,   0,   0,   0, \n      4,   0,   0,   0,  42,   0, \n      0,   9, 242,   0,  16,   0, \n      2,   0,   0,   0, 102,   5, \n      2,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   1,   0,   0,   0, \n      3,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0, 139,   0, \n      0,   8, 130,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  27,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  10,   0,   2,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  19, 194,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   5,   0,   0,   0, \n      4,   0,   0,   0, 166,   6, \n      2,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  11,  66,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  25,   0, \n      0,   0,   1,  64,   0,   0, \n      7,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  87,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n    138,   0,   0,   9,  18,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  20,  98,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0, 166,  10, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,   9,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     64,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 139,   0, \n      0,  15,  50,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  27,   0,   0,   0, \n     24,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  86,   5,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   8,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  20,   0, \n      0,   0,   1,  64,   0,   0, \n     12,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  18,   0,   0,   1, \n     85,   0,   0,   9,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     42, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   5,   0,   0,   0, \n     42,   0,   0,   9, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     86,   5,   2,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n      1,   0,   0,   0,   4,   0, \n      0,   0,   3,   0,   0,   0, \n    139,   0,   0,   8,  66,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  27,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  10,   0, \n      2,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  20, \n    114,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,  11,   0, \n      0,   0,   0,   0,   0,   0, \n    214,   6,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  66,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  26,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0, 138,   0,   0,   9, \n     18,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  87,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  10,  66,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  26,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  64,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 139,   0,   0,  15, \n    194,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  27,   0,   0,   0, \n     24,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   4,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  21,   0, \n      0,   1,  30,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0, 214, 120, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  32,   0, \n      0,  10, 114,   0,  16,   0, \n      2,   0,   0,   0, 166,  10, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   2,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   2,   0, \n      0,   0, 150,   5,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     38,   7,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,  85,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  38,   7,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      1,   0,   0,   0, 214,   8, \n     16,   0,   3,   0,   0,   0, \n    214,   8,  16,   0,   4,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     38,   7,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0, 214,   8, \n     16,   0,   3,   0,   0,   0, \n     54,   0,   0,   5,  50,   0, \n     16,   0,   3,   0,   0,   0, \n    230,  10,  16,   0,   1,   0, \n      0,   0,  18,   0,   0,   1, \n     54,   0,   0,   5,  50,   0, \n     16,   0,   3,   0,   0,   0, \n    230,  10,  16,   0,   1,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  32,   0, \n      0,   0,  18,   0,   0,   1, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0,  21,   0,   0,   1, \n     30,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      4,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n    214, 120,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     38,   7,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,  85,   0,   0,  10, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  38,   7,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      4,   0,   0,   0, 214,   8, \n     16,   0,   5,   0,   0,   0, \n    214,   8,  16,   0,   6,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     38,   7,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0, 214,   8, \n     16,   0,   2,   0,   0,   0, \n     54,   0,   0,   5, 194,   0, \n     16,   0,   1,   0,   0,   0, \n      6,   4,  16,   0,   4,   0, \n      0,   0,  18,   0,   0,   1, \n     54,   0,   0,   5, 194,   0, \n     16,   0,   1,   0,   0,   0, \n      6,   4,  16,   0,   4,   0, \n      0,   0,  21,   0,   0,   1, \n     85,   0,   0,  10, 194,   0, \n     16,   0,   3,   0,   0,   0, \n      6,   4,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0, 134,  13, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   4,   0, \n      0,   0, 230,  10,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     38,   7,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0,  54,   0, \n      0,   5,  50,   0,  16,   0, \n      4,   0,   0,   0,  70,   0, \n     16,   0,   3,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  80,   0, \n      0,   7,  50,   0,  16,   0, \n      0,   0,   0,   0, 214,   5, \n     16,   0,   2,   0,   0,   0, \n    134,   0,  16,   0,   2,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,   6,   5,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   0,   2,   0,   0,   0, \n      1,   0,   0,   7,  50,   0, \n     16,   0,   6,   0,   0,   0, \n     70,   0,  16,   0,   3,   0, \n      0,   0, 134,   0,  16,   0, \n      4,   0,   0,   0,   1,   0, \n      0,  10,  50,   0,  16,   0, \n      6,   0,   0,   0,  70,   0, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0, 146,  36, \n     73,   0, 146,  36,  73,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    194,   0,  16,   0,   6,   0, \n      0,   0,   6,   4,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n     85,   0,   0,  10,  50,   0, \n     16,   0,   7,   0,   0,   0, \n     70,   0,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  50,   0,  16,   0, \n      6,   0,   0,   0,  70,   0, \n     16,   0,   6,   0,   0,   0, \n    230,  10,  16,   0,   6,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   6,   0, \n      0,   0,  70,   0,  16,   0, \n      6,   0,   0,   0,  70,   0, \n     16,   0,   7,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n     73, 146,  36,   0,  73, 146, \n     36,   0,  73, 146,  36,   0, \n     73, 146,  36,   0,  30,   0, \n      0,  10, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0, 182, 109, \n    219,   0, 182, 109, 219,   0, \n    182, 109, 219,   0, 182, 109, \n    219,   0,   1,   0,   0,   7, \n    194,   0,  16,   0,   6,   0, \n      0,   0,   6,   4,  16,   0, \n      6,   0,   0,   0,   6,   4, \n     16,   0,   8,   0,   0,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,   8,   0,   0,   0, \n     70,   0,  16,   0,   3,   0, \n      0,   0, 134,   0,  16,   0, \n      4,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,  73, 146, \n     36,   0,  73, 146,  36,   0, \n     73, 146,  36,   0,  73, 146, \n     36,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   4,   0, \n      0,   0, 214,   5,  16,   0, \n      4,   0,   0,   0,  70,   0, \n     16,   0,   8,   0,   0,   0, \n      1,   0,   0,  10,  50,   0, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n     73, 146,  36,   0,  73, 146, \n     36,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  87,   0, \n      0,  10,  50,   0,  16,   0, \n      4,   0,   0,   0,  70,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,  73, 146, \n     36,   0,  73, 146,  36,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  59,   0,   0,   5, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,   1,   0, \n      0,   7, 242,   0,  16,   0, \n     10,   0,   0,   0,   6,   5, \n     16,   0,   7,   0,   0,   0, \n      6,  10,  16,   0,   9,   0, \n      0,   0,   1,   0,   0,   7, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  86,  15,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,   3,   0,   0,   0, \n     70,   0,  16,   0,   3,   0, \n      0,   0,  70,   0,  16,   0, \n      4,   0,   0,   0,  30,   0, \n      0,  10,  50,   0,  16,   0, \n      3,   0,   0,   0,  70,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0, 183, 109, \n    219, 255, 183, 109, 219, 255, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   3,   0, \n      0,   0, 198,   0,  16,   0, \n      9,   0,   0,   0,  70,   0, \n     16,   0,   3,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   0,   2,   0,   0,   0, \n      1,   0,   0,   0,  60,   0, \n      0,   7,  50,   0,  16,   0, \n      7,   0,   0,   0,  70,   0, \n     16,   0,   3,   0,   0,   0, \n    134,   0,  16,   0,   4,   0, \n      0,   0,  59,   0,   0,   5, \n     50,   0,  16,   0,   6,   0, \n      0,   0,  70,   0,  16,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   7,  50,   0,  16,   0, \n      6,   0,   0,   0,  70,   0, \n     16,   0,   6,   0,   0,   0, \n     70,   0,  16,   0,   7,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   6,   0, \n      0,   0, 230,  10,  16,   0, \n      6,   0,   0,   0,  70,   0, \n     16,   0,   6,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,   4,   0,   0,   0, \n    214,   5,  16,   0,   4,   0, \n      0,   0, 134,   0,  16,   0, \n      4,   0,   0,   0,  60,   0, \n      0,   7,  50,   0,  16,   0, \n      3,   0,   0,   0,  70,   0, \n     16,   0,   3,   0,   0,   0, \n     70,   0,  16,   0,   4,   0, \n      0,   0,  55,   0,   0,   9, \n     50,   0,  16,   0,   4,   0, \n      0,   0,  70,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   6,   0,   0,   0, \n     70,   0,  16,   0,   3,   0, \n      0,   0,  80,   0,   0,   7, \n     50,   0,  16,   0,   3,   0, \n      0,   0, 214,   5,  16,   0, \n      5,   0,   0,   0, 134,   0, \n     16,   0,   5,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   6,   0,   0,   0, \n    166,  15,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   7,  50,   0,  16,   0, \n      7,   0,   0,   0, 230,  10, \n     16,   0,   3,   0,   0,   0, \n    134,   0,  16,   0,   6,   0, \n      0,   0,   1,   0,   0,  10, \n     50,   0,  16,   0,   7,   0, \n      0,   0,  70,   0,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0, 146,  36,  73,   0, \n    146,  36,  73,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     41,   0,   0,  10,  50,   0, \n     16,   0,   8,   0,   0,   0, \n     70,   0,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      9,   0,   0,   0,  70,   0, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   7,   0, \n      0,   0,  70,   0,  16,   0, \n      7,   0,   0,   0,  70,   0, \n     16,   0,   8,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,   7,   0,   0,   0, \n     70,   0,  16,   0,   7,   0, \n      0,   0,  70,   0,  16,   0, \n      9,   0,   0,   0,   1,   0, \n      0,   7,  50,   0,  16,   0, \n      8,   0,   0,   0,  70,   0, \n     16,   0,   7,   0,   0,   0, \n    230,  10,  16,   0,   8,   0, \n      0,   0,  60,   0,   0,   7, \n    194,   0,  16,   0,   8,   0, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,   6,   8, \n     16,   0,   6,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n     73, 146,  36,   0,  73, 146, \n     36,   0,  73, 146,  36,   0, \n     73, 146,  36,   0,  60,   0, \n      0,   7,  50,   0,  16,   0, \n      6,   0,   0,   0, 214,   5, \n     16,   0,   6,   0,   0,   0, \n    230,  10,  16,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n     50,   0,  16,   0,   6,   0, \n      0,   0,  70,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,  73, 146,  36,   0, \n     73, 146,  36,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,  10,  50,   0, \n     16,   0,   6,   0,   0,   0, \n     70,   0,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n     73, 146,  36,   0,  73, 146, \n     36,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  59,   0, \n      0,   5, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n      1,   0,   0,   7, 242,   0, \n     16,   0,  10,   0,   0,   0, \n    166,  15,  16,   0,   7,   0, \n      0,   0,   6,  10,  16,   0, \n      9,   0,   0,   0,   1,   0, \n      0,   7, 242,   0,  16,   0, \n      9,   0,   0,   0,  86,  15, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  60,   0,   0,   7, \n    194,   0,  16,   0,   3,   0, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,   6,   4, \n     16,   0,   6,   0,   0,   0, \n     30,   0,   0,  10, 194,   0, \n     16,   0,   3,   0,   0,   0, \n    166,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 183, 109, 219, 255, \n    183, 109, 219, 255,  60,   0, \n      0,   7, 194,   0,  16,   0, \n      3,   0,   0,   0,  86,  13, \n     16,   0,   9,   0,   0,   0, \n    166,  14,  16,   0,   3,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n     60,   0,   0,   7, 194,   0, \n     16,   0,   7,   0,   0,   0, \n    166,  14,  16,   0,   3,   0, \n      0,   0,   6,   8,  16,   0, \n      6,   0,   0,   0,  59,   0, \n      0,   5,  50,   0,  16,   0, \n      7,   0,   0,   0,  70,   0, \n     16,   0,   7,   0,   0,   0, \n      1,   0,   0,   7,  50,   0, \n     16,   0,   7,   0,   0,   0, \n     70,   0,  16,   0,   7,   0, \n      0,   0, 230,  10,  16,   0, \n      7,   0,   0,   0,  60,   0, \n      0,   7,  50,   0,  16,   0, \n      7,   0,   0,   0,  70,   0, \n     16,   0,   8,   0,   0,   0, \n     70,   0,  16,   0,   7,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   6,   0, \n      0,   0, 214,   5,  16,   0, \n      6,   0,   0,   0, 134,   0, \n     16,   0,   6,   0,   0,   0, \n     60,   0,   0,   7, 194,   0, \n     16,   0,   3,   0,   0,   0, \n    166,  14,  16,   0,   3,   0, \n      0,   0,   6,   4,  16,   0, \n      6,   0,   0,   0,  55,   0, \n      0,   9, 194,   0,  16,   0, \n      4,   0,   0,   0,   6,   4, \n     16,   0,   3,   0,   0,   0, \n      6,   4,  16,   0,   7,   0, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,  85,   0, \n      0,  10, 194,   0,  16,   0, \n      3,   0,   0,   0,   6,   4, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   7, \n    194,   0,  16,   0,   3,   0, \n      0,   0,   6,   4,  16,   0, \n      4,   0,   0,   0, 166,  14, \n     16,   0,   3,   0,   0,   0, \n      1,   0,   0,  10, 194,   0, \n     16,   0,   3,   0,   0,   0, \n    166,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 146,   4,   0,   0, \n    146,   4,   0,   0,  41,   0, \n      0,  10,  50,   0,  16,   0, \n      6,   0,   0,   0, 230,  10, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n    194,   0,  16,   0,   6,   0, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n     30,   0,   0,   7, 194,   0, \n     16,   0,   3,   0,   0,   0, \n    166,  14,  16,   0,   3,   0, \n      0,   0,   6,   4,  16,   0, \n      6,   0,   0,   0,  30,   0, \n      0,   7, 194,   0,  16,   0, \n      3,   0,   0,   0, 166,  14, \n     16,   0,   3,   0,   0,   0, \n    166,  14,  16,   0,   6,   0, \n      0,   0,  59,   0,   0,   5, \n    242,   0,  16,   0,   6,   0, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   7, 242,   0,  16,   0, \n      7,   0,   0,   0,   6,   4, \n     16,   0,   4,   0,   0,   0, \n    166,  14,  16,   0,   6,   0, \n      0,   0,  30,   0,   0,  11, \n    242,   0,  16,   0,   8,   0, \n      0,   0, 166,  14,  16, 128, \n     65,   0,   0,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n    109,  11,   0,   0, 109,  11, \n      0,   0, 109,  11,   0,   0, \n    109,  11,   0,   0,   1,   0, \n      0,   7, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n     50,   0,  16,   0,   8,   0, \n      0,   0, 230,  10,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 194,   0, \n     16,   0,   8,   0,   0,   0, \n    166,  14,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n    194,   0,  16,   0,   8,   0, \n      0,   0,  86,  13,  16,   0, \n      2,   0,   0,   0, 166,  14, \n     16,   0,   8,   0,   0,   0, \n     35,   0,   0,   9,  50,   0, \n     16,   0,   8,   0,   0,   0, \n    134,   0,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      8,   0,   0,   0, 230,  10, \n     16,   0,   8,   0,   0,   0, \n     78,   0,   0,  11,  50,   0, \n     16,   0,   8,   0,   0,   0, \n      0, 208,   0,   0,  70,   0, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      6,   0,   0,   0,   9,   0, \n      0,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      6,   0,   0,   0,   9,   0, \n      0,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     86,  13,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  35,   0, \n      0,   9, 242,   0,  16,   0, \n      9,   0,   0,   0,   6,   8, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n      9,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n     35,   0,   0,  12,  50,   0, \n     16,   0,   8,   0,   0,   0, \n    198,   0,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   8,   0,   0,   0, \n     35,   0,   0,   9,  66,   0, \n     16,   0,   8,   0,   0,   0, \n     42,   0,  16,   0,   9,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   1,   0,  26,   0, \n     16,   0,   9,   0,   0,   0, \n      1,   0,   0,   7, 194,   0, \n     16,   0,   3,   0,   0,   0, \n    166,  14,  16,   0,   3,   0, \n      0,   0,   6,   4,  16,   0, \n      4,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      9,   0,   0,   0, 166,  15, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,  13,   0, \n      0,   0,   7,   0,   0,   0, \n     13,   0,   0,   0,   7,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n    140,   0,   0,  17,  50,   0, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 230,  10, \n     16,   0,   3,   0,   0,   0, \n    134,   0,  16,   0,   9,   0, \n      0,   0, 138,   0,   0,  15, \n    194,   0,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   6,   0, \n      0,   0,   6,   0,   0,   0, \n    166,  14,  16,   0,   3,   0, \n      0,   0,  30,   0,   0,   7, \n    194,   0,  16,   0,  10,   0, \n      0,   0,  86,  13,  16,   0, \n      9,   0,   0,   0, 166,  14, \n     16,   0,   3,   0,   0,   0, \n     35,   0,   0,  12, 194,   0, \n     16,   0,   3,   0,   0,   0, \n      6,   8,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0,   6,   8, \n     16,   0,   8,   0,   0,   0, \n     59,   0,   0,   5, 242,   0, \n     16,   0,   9,   0,   0,   0, \n      6,   4,  16,   0,   4,   0, \n      0,   0,   1,   0,   0,  10, \n     50,   0,  16,   0,   6,   0, \n      0,   0, 230,  10,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n     50,   0,  16,   0,   7,   0, \n      0,   0, 214,   5,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,  11,   0,   0,   0, \n     35,   0,   0,   9,  50,   0, \n     16,   0,   6,   0,   0,   0, \n    134,   0,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      6,   0,   0,   0,  70,   0, \n     16,   0,   7,   0,   0,   0, \n     78,   0,   0,  11,  50,   0, \n     16,   0,   6,   0,   0,   0, \n      0, 208,   0,   0,  70,   0, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      6,   0,   0,   0,   9,   0, \n      0,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      6,   0,   0,   0,   9,   0, \n      0,   0,   3,   0,   0,   0, \n      6,   4,  16,   0,   4,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     86,  13,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  35,   0, \n      0,   9, 242,   0,  16,   0, \n     12,   0,   0,   0,   6,   8, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n     12,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n     35,   0,   0,  12,  50,   0, \n     16,   0,  13,   0,   0,   0, \n    198,   0,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   6,   0,   0,   0, \n     35,   0,   0,   9,  66,   0, \n     16,   0,  13,   0,   0,   0, \n     42,   0,  16,   0,  12,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   1,   0,  26,   0, \n     16,   0,  12,   0,   0,   0, \n     55,   0,   0,   9, 194,   0, \n     16,   0,   3,   0,   0,   0, \n      6,   0,  16,   0,   0,   0, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,   6,   8, \n     16,   0,  13,   0,   0,   0, \n    138,   0,   0,  15,  50,   0, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      6,   0,   0,   0,   9,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 246,  15, \n     16,   0,   6,   0,   0,   0, \n    138,   0,   0,  15, 194,   0, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   6,   0,   0,   0, \n      9,   0,   0,   0, 246,  15, \n     16,   0,   7,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0, 194,   0,  16,   0, \n      6,   0,   0,   0, 246,  15, \n     16,   0,   2,   0,   0,   0, \n    166,  14,  16,   0,   6,   0, \n      0,   0,  35,   0,   0,   9, \n     50,   0,  16,   0,   6,   0, \n      0,   0, 166,  10,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   6,   0,   0,   0, \n    230,  10,  16,   0,   6,   0, \n      0,   0,  78,   0,   0,  11, \n     50,   0,  16,   0,   6,   0, \n      0,   0,   0, 208,   0,   0, \n     70,   0,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9, 130,   0,  16,   0, \n      8,   0,   0,   0,  26,   0, \n     16,   0,   6,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      1,   0,  10,   0,  16,   0, \n      6,   0,   0,   0,  35,   0, \n      0,  12,  50,   0,  16,   0, \n      6,   0,   0,   0, 214,   5, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 214,   5,  16,   0, \n      8,   0,   0,   0, 138,   0, \n      0,  15, 194,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      6,   0,   0,   0,   9,   0, \n      0,   0, 246,  15,  16,   0, \n      9,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   6,   0, \n      0,   0,   9,   0,   0,   0, \n      6,   0,   0,   0,   9,   0, \n      0,   0,  86,  15,  16,   0, \n      4,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n     50,   0,  16,   0,   7,   0, \n      0,   0, 246,  15,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   7,   0,   0,   0, \n     35,   0,   0,   9, 194,   0, \n     16,   0,   6,   0,   0,   0, \n    166,  10,  16,   0,   2,   0, \n      0,   0, 166,  14,  16,   0, \n      6,   0,   0,   0,   6,   4, \n     16,   0,   7,   0,   0,   0, \n     78,   0,   0,  11, 194,   0, \n     16,   0,   6,   0,   0,   0, \n      0, 208,   0,   0, 166,  14, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,  35,   0,   0,   9, \n    130,   0,  16,   0,  13,   0, \n      0,   0,  58,   0,  16,   0, \n      6,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   1,   0, \n     42,   0,  16,   0,   6,   0, \n      0,   0,  55,   0,   0,   9, \n     50,   0,  16,   0,   6,   0, \n      0,   0,  86,   5,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   6,   0,   0,   0, \n    214,   5,  16,   0,  13,   0, \n      0,   0,  41,   0,   0,  10, \n     50,   0,  16,   0,   6,   0, \n      0,   0,  70,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,   6,   0,   0,   0, \n    230,  10,  16,   0,   3,   0, \n      0,   0,  70,   0,  16,   0, \n      6,   0,   0,   0,  85,   0, \n      0,  10, 194,   0,  16,   0, \n      3,   0,   0,   0, 166,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   7, \n    194,   0,  16,   0,   3,   0, \n      0,   0, 166,  14,  16,   0, \n      4,   0,   0,   0, 166,  14, \n     16,   0,   3,   0,   0,   0, \n      1,   0,   0,  10, 194,   0, \n     16,   0,   3,   0,   0,   0, \n    166,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 146,   4,   0,   0, \n    146,   4,   0,   0,  41,   0, \n      0,  10,  50,   0,  16,   0, \n      7,   0,   0,   0, 230,  10, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   8,   0, \n      0,   0, 230,  10,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 194,   0, \n     16,   0,   3,   0,   0,   0, \n    166,  14,  16,   0,   3,   0, \n      0,   0,   6,   4,  16,   0, \n      7,   0,   0,   0,  30,   0, \n      0,   7, 194,   0,  16,   0, \n      3,   0,   0,   0, 166,  14, \n     16,   0,   3,   0,   0,   0, \n      6,   4,  16,   0,   8,   0, \n      0,   0,  59,   0,   0,   5, \n    242,   0,  16,   0,   8,   0, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   7, 242,   0,  16,   0, \n      9,   0,   0,   0, 166,  14, \n     16,   0,   4,   0,   0,   0, \n    166,  14,  16,   0,   8,   0, \n      0,   0,  30,   0,   0,  11, \n    242,   0,  16,   0,  10,   0, \n      0,   0, 166,  14,  16, 128, \n     65,   0,   0,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n    109,  11,   0,   0, 109,  11, \n      0,   0, 109,  11,   0,   0, \n    109,  11,   0,   0,   1,   0, \n      0,   7, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   1,   0,   0,  10, \n     50,   0,  16,   0,   7,   0, \n      0,   0, 230,  10,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10,  50,   0, \n     16,   0,  10,   0,   0,   0, \n    230,  10,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n     50,   0,  16,   0,  10,   0, \n      0,   0, 214,   5,  16,   0, \n      5,   0,   0,   0,  70,   0, \n     16,   0,  10,   0,   0,   0, \n     35,   0,   0,   9,  50,   0, \n     16,   0,   7,   0,   0,   0, \n    134,   0,  16,   0,   5,   0, \n      0,   0,  70,   0,  16,   0, \n      7,   0,   0,   0,  70,   0, \n     16,   0,  10,   0,   0,   0, \n     78,   0,   0,  11,  50,   0, \n     16,   0,   7,   0,   0,   0, \n      0, 208,   0,   0,  70,   0, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      6,   0,   0,   0,   9,   0, \n      0,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      6,   0,   0,   0,   9,   0, \n      0,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     86,  13,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,  35,   0, \n      0,   9, 242,   0,  16,   0, \n     10,   0,   0,   0,   6,   8, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n     10,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n     35,   0,   0,  12,  50,   0, \n     16,   0,  12,   0,   0,   0, \n    198,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   7,   0,   0,   0, \n     35,   0,   0,   9,  66,   0, \n     16,   0,  12,   0,   0,   0, \n     42,   0,  16,   0,  10,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   1,   0,  26,   0, \n     16,   0,  10,   0,   0,   0, \n      1,   0,   0,   7, 194,   0, \n     16,   0,   3,   0,   0,   0, \n    166,  14,  16,   0,   3,   0, \n      0,   0, 166,  14,  16,   0, \n      4,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0, 166,  15, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,  13,   0, \n      0,   0,   7,   0,   0,   0, \n     13,   0,   0,   0,   7,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n    140,   0,   0,  17,  50,   0, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 230,  10, \n     16,   0,   3,   0,   0,   0, \n    134,   0,  16,   0,  10,   0, \n      0,   0, 138,   0,   0,  15, \n    194,   0,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   6,   0, \n      0,   0,   6,   0,   0,   0, \n    166,  14,  16,   0,   3,   0, \n      0,   0,  30,   0,   0,   7, \n    194,   0,  16,   0,  13,   0, \n      0,   0,  86,  13,  16,   0, \n     10,   0,   0,   0, 166,  14, \n     16,   0,   3,   0,   0,   0, \n     35,   0,   0,  12, 194,   0, \n     16,   0,   3,   0,   0,   0, \n      6,   8,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0,   6,   8, \n     16,   0,  12,   0,   0,   0, \n     59,   0,   0,   5, 242,   0, \n     16,   0,  10,   0,   0,   0, \n    166,  14,  16,   0,   4,   0, \n      0,   0,   1,   0,   0,  10, \n     50,   0,  16,   0,   7,   0, \n      0,   0, 230,  10,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0,  50,   0,  16,   0, \n      8,   0,   0,   0, 214,   5, \n     16,   0,   5,   0,   0,   0, \n    230,  10,  16,   0,  11,   0, \n      0,   0,  35,   0,   0,   9, \n     50,   0,  16,   0,   7,   0, \n      0,   0, 134,   0,  16,   0, \n      5,   0,   0,   0,  70,   0, \n     16,   0,   7,   0,   0,   0, \n     70,   0,  16,   0,   8,   0, \n      0,   0,  78,   0,   0,  11, \n     50,   0,  16,   0,   7,   0, \n      0,   0,   0, 208,   0,   0, \n     70,   0,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n      9,   0,   0,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n      9,   0,   0,   0,   3,   0, \n      0,   0, 166,  14,  16,   0, \n      4,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n    242,   0,  16,   0,  14,   0, \n      0,   0,  86,  13,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,  14,   0,   0,   0, \n     35,   0,   0,   9, 242,   0, \n     16,   0,  11,   0,   0,   0, \n      6,   8,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  14,   0,   0,   0, \n     78,   0,   0,  11, 242,   0, \n     16,   0,  11,   0,   0,   0, \n      0, 208,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,  35,   0,   0,  12, \n     50,   0,  16,   0,  14,   0, \n      0,   0, 198,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   7,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,  14,   0, \n      0,   0,  42,   0,  16,   0, \n     11,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   1,   0, \n     26,   0,  16,   0,  11,   0, \n      0,   0,  55,   0,   0,   9, \n    194,   0,  16,   0,   3,   0, \n      0,   0,   6,   0,  16,   0, \n      3,   0,   0,   0, 166,  14, \n     16,   0,   3,   0,   0,   0, \n      6,   8,  16,   0,  14,   0, \n      0,   0, 138,   0,   0,  15, \n     50,   0,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   6,   0,   0,   0, \n      9,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    246,  15,  16,   0,   8,   0, \n      0,   0, 138,   0,   0,  15, \n     50,   0,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   6,   0,   0,   0, \n      9,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    246,  15,  16,   0,   9,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0,  50,   0, \n     16,   0,   8,   0,   0,   0, \n    246,  15,  16,   0,   5,   0, \n      0,   0,  70,   0,  16,   0, \n      8,   0,   0,   0,  35,   0, \n      0,   9,  50,   0,  16,   0, \n      7,   0,   0,   0, 166,  10, \n     16,   0,   5,   0,   0,   0, \n     70,   0,  16,   0,   7,   0, \n      0,   0,  70,   0,  16,   0, \n      8,   0,   0,   0,  78,   0, \n      0,  11,  50,   0,  16,   0, \n      7,   0,   0,   0,   0, 208, \n      0,   0,  70,   0,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     35,   0,   0,   9, 130,   0, \n     16,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,   7,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   1,   0,  10,   0, \n     16,   0,   7,   0,   0,   0, \n     35,   0,   0,  12,  50,   0, \n     16,   0,   7,   0,   0,   0, \n    214,   5,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 214,   5, \n     16,   0,  12,   0,   0,   0, \n    138,   0,   0,  15,  50,   0, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      6,   0,   0,   0,   9,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 246,  15, \n     16,   0,  10,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0, 194,   0,  16,   0, \n      7,   0,   0,   0, 246,  15, \n     16,   0,   5,   0,   0,   0, \n    166,  14,  16,   0,   7,   0, \n      0,   0,  35,   0,   0,   9, \n    194,   0,  16,   0,   7,   0, \n      0,   0, 166,  10,  16,   0, \n      5,   0,   0,   0,   6,   4, \n     16,   0,   8,   0,   0,   0, \n    166,  14,  16,   0,   7,   0, \n      0,   0,  78,   0,   0,  11, \n    194,   0,  16,   0,   7,   0, \n      0,   0,   0, 208,   0,   0, \n    166,  14,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,  35,   0, \n      0,   9, 130,   0,  16,   0, \n     14,   0,   0,   0,  58,   0, \n     16,   0,   7,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      1,   0,  42,   0,  16,   0, \n      7,   0,   0,   0,  55,   0, \n      0,   9,  50,   0,  16,   0, \n      7,   0,   0,   0,  86,   5, \n     16,   0,   3,   0,   0,   0, \n     70,   0,  16,   0,   7,   0, \n      0,   0, 214,   5,  16,   0, \n     14,   0,   0,   0,  41,   0, \n      0,  10,  50,   0,  16,   0, \n      7,   0,   0,   0,  70,   0, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n    194,   0,  16,   0,   6,   0, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,   6,   4, \n     16,   0,   7,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  35,   0,   0,   8, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,   2,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  79,   0, \n      0,   9,  66,   0,  16,   0, \n      3,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      3,   0,   0,   0,  30,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,  12,   0, \n      0,   0,  12,   0,   0,   0, \n     12,   0,   0,   0,  12,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   7, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0, 146,   4, \n      0,   0, 146,   4,   0,   0, \n    146,   4,   0,   0, 146,   4, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n     59,   0,   0,   5, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,   1,   0,   0,   7, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n     30,   0,   0,  11, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16, 128,  65,   0, \n      0,   0,   9,   0,   0,   0, \n      2,  64,   0,   0, 109,  11, \n      0,   0, 109,  11,   0,   0, \n    109,  11,   0,   0, 109,  11, \n      0,   0,   1,   0,   0,   7, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 194,   0, \n     16,   0,   3,   0,   0,   0, \n     86,  13,  16,   0,   2,   0, \n      0,   0,   6,   4,  16,   0, \n     11,   0,   0,   0,  35,   0, \n      0,   9, 194,   0,  16,   0, \n      3,   0,   0,   0,   6,   8, \n     16,   0,   2,   0,   0,   0, \n      6,   4,  16,   0,  10,   0, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,  78,   0, \n      0,  11, 194,   0,  16,   0, \n      3,   0,   0,   0,   0, 208, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,   9,   0,   0,   0, \n      3,   0,   0,   0,   6,   4, \n     16,   0,   8,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,   9,   0,   0,   0, \n      3,   0,   0,   0,   6,   4, \n     16,   0,   9,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0, 242,   0,  16,   0, \n     13,   0,   0,   0,  86,  13, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  35,   0,   0,   9, \n    242,   0,  16,   0,  12,   0, \n      0,   0,   6,   8,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  78,   0,   0,  11, \n    242,   0,  16,   0,  12,   0, \n      0,   0,   0, 208,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,  35,   0, \n      0,  12,  50,   0,  16,   0, \n     13,   0,   0,   0, 198,   0, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 230,  10,  16,   0, \n      3,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n     13,   0,   0,   0,  42,   0, \n     16,   0,  12,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      1,   0,  26,   0,  16,   0, \n     12,   0,   0,   0,   1,   0, \n      0,   7, 242,   0,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,  12,   0, \n      0,   0,   6,   5,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,  13,   0,   0,   0, \n      7,   0,   0,   0,  13,   0, \n      0,   0,   7,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0, 140,   0, \n      0,  17,  50,   0,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      7,   0,   0,   0, 134,   0, \n     16,   0,  12,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      6,   0,   0,   0,   6,   0, \n      0,   0,   6,   0,   0,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n     30,   0,   0,   7, 194,   0, \n     16,   0,  14,   0,   0,   0, \n     86,  13,  16,   0,  12,   0, \n      0,   0,   6,   4,  16,   0, \n     15,   0,   0,   0,  35,   0, \n      0,  12, 194,   0,  16,   0, \n      3,   0,   0,   0,   6,   8, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0,   6,   8,  16,   0, \n     13,   0,   0,   0,  59,   0, \n      0,   5, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,  12,   0, \n      0,   0,  15,   0,   0,   0, \n     18,   0,   0,   0,  21,   0, \n      0,   0,   6,   0,  16,   0, \n      4,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n    242,   0,  16,   0,  16,   0, \n      0,   0,  86,   5,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,  16,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   4,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n     12,   0,   0,   0,  10,   0, \n     16,   0,  16,   0,   0,   0, \n     78,   0,   0,   8,  18,   0, \n     16,   0,   4,   0,   0,   0, \n      0, 208,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,  17,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      6,   0,   0,   0,   9,   0, \n      0,   0,   3,   0,   0,   0, \n      6,   4,  16,   0,   6,   0, \n      0,   0,  35,   0,   0,   9, \n    114,   0,  16,   0,  16,   0, \n      0,   0,   6,   0,  16,   0, \n      2,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n    150,   7,  16,   0,  16,   0, \n      0,   0,  78,   0,   0,  11, \n    114,   0,  16,   0,  16,   0, \n      0,   0,   0, 208,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      7,   0,   0,   0,  10,   0, \n     16,   0,  16,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      1,   0,  10,   0,  16,   0, \n      4,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      7,   0,   0,   0,  42,   0, \n     16,   0,  16,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      1,   0,  26,   0,  16,   0, \n     16,   0,   0,   0,  55,   0, \n      0,   9, 194,   0,  16,   0, \n      3,   0,   0,   0,   6,   0, \n     16,   0,   0,   0,   0,   0, \n    166,  14,  16,   0,   3,   0, \n      0,   0,   6,   4,  16,   0, \n      7,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   6,   0, \n      0,   0,   9,   0,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,  86,  10,  16,   0, \n      8,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n     18,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   6,   0, \n      0,   0,   9,   0,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,  86,  10,  16,   0, \n      9,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n     50,   0,  16,   0,   7,   0, \n      0,   0, 246,  15,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,  18,   0,   0,   0, \n     35,   0,   0,   9,  50,   0, \n     16,   0,   7,   0,   0,   0, \n    166,  10,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n     16,   0,   0,   0,  70,   0, \n     16,   0,   7,   0,   0,   0, \n     78,   0,   0,  11,  50,   0, \n     16,   0,   7,   0,   0,   0, \n      0, 208,   0,   0,  70,   0, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  35,   0,   0,   9, \n    130,   0,  16,   0,  13,   0, \n      0,   0,  26,   0,  16,   0, \n      7,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   1,   0, \n     10,   0,  16,   0,   7,   0, \n      0,   0,  35,   0,   0,  12, \n     50,   0,  16,   0,   7,   0, \n      0,   0, 214,   5,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    214,   5,  16,   0,  13,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,  12,   0,   0,   0, \n     15,   0,   0,   0,  18,   0, \n      0,   0,  21,   0,   0,   0, \n     86,   5,  16,   0,   4,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 242,   0, \n     16,   0,  13,   0,   0,   0, \n    246,  15,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      4,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,  12,   0, \n      0,   0,  10,   0,  16,   0, \n     13,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      4,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,  17,   0, \n      0,   0,  26,   0,  16,   0, \n     13,   0,   0,   0,  78,   0, \n      0,  11,  50,   0,  16,   0, \n      4,   0,   0,   0,   0, 208, \n      0,   0,  70,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   4,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   1,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      6,   0,   0,   0,   9,   0, \n      0,   0,   3,   0,   0,   0, \n      6,   0,   0,   0,  86,  10, \n     16,   0,   6,   0,   0,   0, \n     35,   0,   0,   9,  50,   0, \n     16,   0,   6,   0,   0,   0, \n    166,  10,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n     14,   0,   0,   0, 230,  10, \n     16,   0,  13,   0,   0,   0, \n     78,   0,   0,  11,  50,   0, \n     16,   0,   6,   0,   0,   0, \n      0, 208,   0,   0,  70,   0, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   4,   0, \n      0,   0,  26,   0,  16,   0, \n      6,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   1,   0, \n     10,   0,  16,   0,   6,   0, \n      0,   0,  55,   0,   0,   9, \n     50,   0,  16,   0,   4,   0, \n      0,   0,  86,   5,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   7,   0,   0,   0, \n     70,   0,  16,   0,   4,   0, \n      0,   0,  41,   0,   0,  10, \n     50,   0,  16,   0,   4,   0, \n      0,   0,  70,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,  13,   0,   0,   0, \n    230,  10,  16,   0,   3,   0, \n      0,   0,  70,   0,  16,   0, \n      4,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n    194,   0,  16,   0,   3,   0, \n      0,   0,  86,  13,  16,   0, \n      5,   0,   0,   0, 166,  14, \n     16,   0,  11,   0,   0,   0, \n     35,   0,   0,   9, 194,   0, \n     16,   0,   3,   0,   0,   0, \n      6,   8,  16,   0,   5,   0, \n      0,   0, 166,  14,  16,   0, \n     10,   0,   0,   0, 166,  14, \n     16,   0,   3,   0,   0,   0, \n     78,   0,   0,  11, 194,   0, \n     16,   0,   3,   0,   0,   0, \n      0, 208,   0,   0, 166,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0,  50,   0, \n     16,   0,   4,   0,   0,   0, \n     86,   5,  16,   0,   5,   0, \n      0,   0, 230,  10,  16,   0, \n     18,   0,   0,   0,  35,   0, \n      0,   9,  50,   0,  16,   0, \n      4,   0,   0,   0,   6,   0, \n     16,   0,   5,   0,   0,   0, \n    230,  10,  16,   0,  16,   0, \n      0,   0,  70,   0,  16,   0, \n      4,   0,   0,   0,  78,   0, \n      0,  11,  50,   0,  16,   0, \n      4,   0,   0,   0,   0, 208, \n      0,   0,  70,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     35,   0,   0,   9,  66,   0, \n     16,   0,  10,   0,   0,   0, \n     10,   0,  16,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   1,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      9,   0,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n      9,   0,   0,   0, 230,  15, \n     16,   0,   8,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      9,   0,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n      9,   0,   0,   0, 230,  15, \n     16,   0,   9,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0, 242,   0,  16,   0, \n      9,   0,   0,   0, 214,  15, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,  35,   0,   0,   9, \n    242,   0,  16,   0,   8,   0, \n      0,   0, 134,  10,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,  78,   0,   0,  11, \n    242,   0,  16,   0,   8,   0, \n      0,   0,   0, 208,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,  35,   0, \n      0,   9, 130,   0,  16,   0, \n     10,   0,   0,   0,  10,   0, \n     16,   0,   8,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      1,   0,  26,   0,  16,   0, \n      4,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      9,   0,   0,   0, 166,  15, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,  13,   0, \n      0,   0,   7,   0,   0,   0, \n     13,   0,   0,   0,   7,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n    140,   0,   0,  17,  50,   0, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 230,  10, \n     16,   0,   7,   0,   0,   0, \n    134,   0,  16,   0,   9,   0, \n      0,   0,  30,   0,   0,   7, \n    194,   0,  16,   0,   7,   0, \n      0,   0,  86,  13,  16,   0, \n      9,   0,   0,   0, 166,  14, \n     16,   0,  15,   0,   0,   0, \n     35,   0,   0,  12,  50,   0, \n     16,   0,   4,   0,   0,   0, \n    134,   0,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 230,  10, \n     16,   0,  10,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n     12,   0,   0,   0,  15,   0, \n      0,   0,  18,   0,   0,   0, \n     21,   0,   0,   0, 166,  10, \n     16,   0,   4,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0, 242,   0,  16,   0, \n      9,   0,   0,   0,  86,   5, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   3,   0, \n      0,   0,  10,   0,  16,   0, \n      5,   0,   0,   0,  42,   0, \n     16,   0,  12,   0,   0,   0, \n     10,   0,  16,   0,   9,   0, \n      0,   0,  78,   0,   0,   8, \n     66,   0,  16,   0,   3,   0, \n      0,   0,   0, 208,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      7,   0,   0,   0,  35,   0, \n      0,   9,  50,   0,  16,   0, \n      6,   0,   0,   0,   6,   0, \n     16,   0,   5,   0,   0,   0, \n    230,  10,  16,   0,  14,   0, \n      0,   0, 150,   5,  16,   0, \n      9,   0,   0,   0,  78,   0, \n      0,  11,  50,   0,  16,   0, \n      6,   0,   0,   0,   0, 208, \n      0,   0,  70,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     35,   0,   0,   9,  66,   0, \n     16,   0,  10,   0,   0,   0, \n     10,   0,  16,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   1,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      9,   0,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n      9,   0,   0,   0, 230,  15, \n     16,   0,   6,   0,   0,   0, \n     35,   0,   0,   9,  66,   0, \n     16,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   5,   0, \n      0,   0,  10,   0,  16,   0, \n     11,   0,   0,   0,  58,   0, \n     16,   0,   9,   0,   0,   0, \n     78,   0,   0,   8,  66,   0, \n     16,   0,   3,   0,   0,   0, \n      0, 208,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  35,   0,   0,   9, \n    130,   0,  16,   0,  10,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   1,   0, \n     26,   0,  16,   0,   6,   0, \n      0,   0,  55,   0,   0,   9, \n     50,   0,  16,   0,   4,   0, \n      0,   0,   6,   0,  16,   0, \n      3,   0,   0,   0,  70,   0, \n     16,   0,   4,   0,   0,   0, \n    230,  10,  16,   0,  10,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      8,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   1,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n    130,   0,  16,   0,   3,   0, \n      0,   0,  58,   0,  16,   0, \n      8,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   1,   0, \n     42,   0,  16,   0,   8,   0, \n      0,   0,  35,   0,   0,  12, \n    194,   0,  16,   0,   3,   0, \n      0,   0,  86,  13,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    166,  14,  16,   0,   3,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,  12,   0,   0,   0, \n     15,   0,   0,   0,  18,   0, \n      0,   0,  21,   0,   0,   0, \n    246,  15,  16,   0,   4,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 242,   0, \n     16,   0,   6,   0,   0,   0, \n    246,  15,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n      4,   0,   0,   0,  42,   0, \n     16,   0,   5,   0,   0,   0, \n     58,   0,  16,   0,  12,   0, \n      0,   0,  10,   0,  16,   0, \n      6,   0,   0,   0,  78,   0, \n      0,   8,  66,   0,  16,   0, \n      4,   0,   0,   0,   0, 208, \n      0,   0,  42,   0,  16,   0, \n      4,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     35,   0,   0,   9, 114,   0, \n     16,   0,   6,   0,   0,   0, \n    166,  10,  16,   0,   5,   0, \n      0,   0, 150,   7,  16,   0, \n     11,   0,   0,   0, 150,   7, \n     16,   0,   6,   0,   0,   0, \n     78,   0,   0,  11, 114,   0, \n     16,   0,   6,   0,   0,   0, \n      0, 208,   0,   0,  70,   2, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   4,   0, \n      0,   0,  10,   0,  16,   0, \n      6,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   1,   0, \n     42,   0,  16,   0,   4,   0, \n      0,   0,  35,   0,   0,   9, \n    130,   0,  16,   0,   4,   0, \n      0,   0,  42,   0,  16,   0, \n      6,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   1,   0, \n     26,   0,  16,   0,   6,   0, \n      0,   0,  55,   0,   0,   9, \n    194,   0,  16,   0,   3,   0, \n      0,   0,  86,   5,  16,   0, \n      3,   0,   0,   0, 166,  14, \n     16,   0,   3,   0,   0,   0, \n    166,  14,  16,   0,   4,   0, \n      0,   0,  41,   0,   0,  10, \n    194,   0,  16,   0,   3,   0, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n     60,   0,   0,   7, 194,   0, \n     16,   0,  13,   0,   0,   0, \n    166,  14,  16,   0,   3,   0, \n      0,   0,   6,   4,  16,   0, \n      4,   0,   0,   0, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  79,   0, \n      0,   9,  66,   0,  16,   0, \n      3,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      3,   0,   0,   0,  30,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,   6,   5,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   0,   2,   0,   0,   0, \n      1,   0,   0,   7, 194,   0, \n     16,   0,   3,   0,   0,   0, \n      6,   4,  16,   0,   1,   0, \n      0,   0,   6,   8,  16,   0, \n      4,   0,   0,   0,   1,   0, \n      0,  10, 194,   0,  16,   0, \n      3,   0,   0,   0, 166,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    146,  36,  73,   0, 146,  36, \n     73,   0,  41,   0,   0,  10, \n     50,   0,  16,   0,   6,   0, \n      0,   0, 230,  10,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     85,   0,   0,  10, 194,   0, \n     16,   0,   6,   0,   0,   0, \n    166,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7, 194,   0,  16,   0, \n      3,   0,   0,   0, 166,  14, \n     16,   0,   3,   0,   0,   0, \n      6,   4,  16,   0,   6,   0, \n      0,   0,  30,   0,   0,   7, \n    194,   0,  16,   0,   3,   0, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0, 166,  14, \n     16,   0,   6,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     73, 146,  36,   0,  73, 146, \n     36,   0,  73, 146,  36,   0, \n     73, 146,  36,   0,  30,   0, \n      0,  10, 242,   0,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0, 182, 109, \n    219,   0, 182, 109, 219,   0, \n    182, 109, 219,   0, 182, 109, \n    219,   0,   1,   0,   0,   7, \n     50,   0,  16,   0,   7,   0, \n      0,   0, 230,  10,  16,   0, \n      3,   0,   0,   0,  70,   0, \n     16,   0,   7,   0,   0,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,   8,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0, 134,   0,  16,   0, \n      4,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,  73, 146, \n     36,   0,  73, 146,  36,   0, \n     73, 146,  36,   0,  73, 146, \n     36,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   4,   0, \n      0,   0, 214,   5,  16,   0, \n      4,   0,   0,   0,  70,   0, \n     16,   0,   8,   0,   0,   0, \n      1,   0,   0,  10,  50,   0, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n     73, 146,  36,   0,  73, 146, \n     36,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  87,   0, \n      0,  10,  50,   0,  16,   0, \n      4,   0,   0,   0,  70,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,  73, 146, \n     36,   0,  73, 146,  36,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  59,   0,   0,   5, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,   1,   0, \n      0,   7, 242,   0,  16,   0, \n      9,   0,   0,   0,   6,   5, \n     16,   0,   6,   0,   0,   0, \n      6,  10,  16,   0,   8,   0, \n      0,   0,   1,   0,   0,   7, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  86,  15,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      4,   0,   0,   0,  30,   0, \n      0,  10,  50,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0, 183, 109, \n    219, 255, 183, 109, 219, 255, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   1,   0, \n      0,   0, 198,   0,  16,   0, \n      8,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   0,   2,   0,   0,   0, \n      1,   0,   0,   0,  60,   0, \n      0,   7,  50,   0,  16,   0, \n      6,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n    134,   0,  16,   0,   4,   0, \n      0,   0,  59,   0,   0,   5, \n    194,   0,  16,   0,   3,   0, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   7, 194,   0,  16,   0, \n      3,   0,   0,   0, 166,  14, \n     16,   0,   3,   0,   0,   0, \n      6,   4,  16,   0,   6,   0, \n      0,   0,  60,   0,   0,   7, \n    194,   0,  16,   0,   3,   0, \n      0,   0,   6,   4,  16,   0, \n      7,   0,   0,   0, 166,  14, \n     16,   0,   3,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,   4,   0,   0,   0, \n    214,   5,  16,   0,   4,   0, \n      0,   0, 134,   0,  16,   0, \n      4,   0,   0,   0,  60,   0, \n      0,   7,  50,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   4,   0, \n      0,   0,  55,   0,   0,   9, \n     50,   0,  16,   0,   4,   0, \n      0,   0,  70,   0,  16,   0, \n      0,   0,   0,   0, 230,  10, \n     16,   0,   3,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   8,   0, \n      0,   0, 166,  15,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   0,   2,   0,   0,   0, \n      1,   0,   0,   7,  50,   0, \n     16,   0,   1,   0,   0,   0, \n    230,  10,  16,   0,   1,   0, \n      0,   0, 134,   0,  16,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10,  50,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0, 146,  36, \n     73,   0, 146,  36,  73,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    194,   0,  16,   0,   3,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n     85,   0,   0,  10,  50,   0, \n     16,   0,   6,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  50,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n    230,  10,  16,   0,   3,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   6,   0,   0,   0, \n      1,   0,   0,   7, 194,   0, \n     16,   0,   3,   0,   0,   0, \n      6,   4,  16,   0,   1,   0, \n      0,   0, 166,  14,  16,   0, \n      7,   0,   0,   0,  60,   0, \n      0,   7,  50,   0,  16,   0, \n      6,   0,   0,   0, 230,  10, \n     16,   0,   1,   0,   0,   0, \n    134,   0,  16,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,  73, 146,  36,   0, \n     73, 146,  36,   0,  73, 146, \n     36,   0,  73, 146,  36,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,   6,   0,   0,   0, \n    214,   5,  16,   0,   8,   0, \n      0,   0,  70,   0,  16,   0, \n      6,   0,   0,   0,   1,   0, \n      0,  10,  50,   0,  16,   0, \n      6,   0,   0,   0,  70,   0, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,  73, 146, \n     36,   0,  73, 146,  36,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,  10, \n     50,   0,  16,   0,   6,   0, \n      0,   0,  70,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,  73, 146,  36,   0, \n     73, 146,  36,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     59,   0,   0,   5, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,   1,   0,   0,   7, \n    242,   0,  16,   0,   8,   0, \n      0,   0, 166,  15,  16,   0, \n      6,   0,   0,   0,   6,  10, \n     16,   0,   7,   0,   0,   0, \n      1,   0,   0,   7, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     86,  15,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,  60,   0, \n      0,   7, 194,   0,  16,   0, \n      1,   0,   0,   0, 166,  14, \n     16,   0,   1,   0,   0,   0, \n      6,   4,  16,   0,   6,   0, \n      0,   0,  30,   0,   0,  10, \n    194,   0,  16,   0,   1,   0, \n      0,   0, 166,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 183, 109, \n    219, 255, 183, 109, 219, 255, \n     60,   0,   0,   7, 194,   0, \n     16,   0,   1,   0,   0,   0, \n     86,  13,  16,   0,   7,   0, \n      0,   0, 166,  14,  16,   0, \n      1,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   7,   0, \n      0,   0, 230,  10,  16,   0, \n      1,   0,   0,   0, 134,   0, \n     16,   0,   6,   0,   0,   0, \n     59,   0,   0,   5,  50,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,   1,   0,   0,   7, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   7,   0,   0,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,   1,   0,   0,   0, \n    230,  10,  16,   0,   3,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7, 194,   0,  16,   0, \n      3,   0,   0,   0,  86,  13, \n     16,   0,   6,   0,   0,   0, \n      6,   8,  16,   0,   6,   0, \n      0,   0,  60,   0,   0,   7, \n    194,   0,  16,   0,   1,   0, \n      0,   0, 166,  14,  16,   0, \n      1,   0,   0,   0, 166,  14, \n     16,   0,   3,   0,   0,   0, \n     55,   0,   0,   9, 194,   0, \n     16,   0,   4,   0,   0,   0, \n      6,   4,  16,   0,   3,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0, 166,  14, \n     16,   0,   1,   0,   0,   0, \n     85,   0,   0,  10,  50,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   7,  50,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,   1,   0,   0,  10, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0, 146,   4,   0,   0, \n    146,   4,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     41,   0,   0,  10, 194,   0, \n     16,   0,   1,   0,   0,   0, \n      6,   4,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,  85,   0, \n      0,  10, 194,   0,  16,   0, \n      3,   0,   0,   0,   6,   4, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0, 230,  10, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0, 230,  10,  16,   0, \n      3,   0,   0,   0,  59,   0, \n      0,   5, 242,   0,  16,   0, \n      6,   0,   0,   0,   6,   4, \n     16,   0,   1,   0,   0,   0, \n      1,   0,   0,   7, 242,   0, \n     16,   0,   7,   0,   0,   0, \n      6,   4,  16,   0,   4,   0, \n      0,   0, 166,  14,  16,   0, \n      6,   0,   0,   0,  30,   0, \n      0,  11, 242,   0,  16,   0, \n      8,   0,   0,   0, 166,  14, \n     16, 128,  65,   0,   0,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0, 109,  11,   0,   0, \n    109,  11,   0,   0, 109,  11, \n      0,   0, 109,  11,   0,   0, \n      1,   0,   0,   7, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 194,   0,  16,   0, \n      1,   0,   0,   0, 166,  14, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   1,   0,   0,  10, \n    194,   0,  16,   0,   3,   0, \n      0,   0, 166,  14,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0, 194,   0,  16,   0, \n      3,   0,   0,   0,  86,  13, \n     16,   0,   2,   0,   0,   0, \n    166,  14,  16,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n    194,   0,  16,   0,   1,   0, \n      0,   0,   6,   8,  16,   0, \n      2,   0,   0,   0, 166,  14, \n     16,   0,   1,   0,   0,   0, \n    166,  14,  16,   0,   3,   0, \n      0,   0,  78,   0,   0,  11, \n    194,   0,  16,   0,   1,   0, \n      0,   0,   0, 208,   0,   0, \n    166,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n      9,   0,   0,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n      9,   0,   0,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  86,  13,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n     35,   0,   0,   9, 242,   0, \n     16,   0,   8,   0,   0,   0, \n      6,   8,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n     78,   0,   0,  11, 242,   0, \n     16,   0,   8,   0,   0,   0, \n      0, 208,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,  35,   0,   0,  12, \n     50,   0,  16,   0,   9,   0, \n      0,   0, 198,   0,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    230,  10,  16,   0,   1,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   9,   0, \n      0,   0,  42,   0,  16,   0, \n      8,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   1,   0, \n     26,   0,  16,   0,   8,   0, \n      0,   0,   1,   0,   0,   7, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   4,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   8,   0,   0,   0, \n      6,   5,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     13,   0,   0,   0,   7,   0, \n      0,   0,  13,   0,   0,   0, \n      7,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0, 140,   0,   0,  17, \n     50,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0, 134,   0,  16,   0, \n      8,   0,   0,   0, 138,   0, \n      0,  15,  50,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   6,   0, \n      0,   0,   6,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7, 194,   0,  16,   0, \n     10,   0,   0,   0,  86,  13, \n     16,   0,   8,   0,   0,   0, \n      6,   4,  16,   0,   1,   0, \n      0,   0,  35,   0,   0,  12, \n     50,   0,  16,   0,   1,   0, \n      0,   0, 134,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    134,   0,  16,   0,   9,   0, \n      0,   0,  59,   0,   0,   5, \n    242,   0,  16,   0,   8,   0, \n      0,   0,   6,   4,  16,   0, \n      4,   0,   0,   0,   1,   0, \n      0,  10, 194,   0,  16,   0, \n      1,   0,   0,   0, 166,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0, 194,   0,  16,   0, \n      3,   0,   0,   0,  86,  13, \n     16,   0,   2,   0,   0,   0, \n      6,   4,  16,   0,  11,   0, \n      0,   0,  35,   0,   0,   9, \n    194,   0,  16,   0,   1,   0, \n      0,   0,   6,   8,  16,   0, \n      2,   0,   0,   0, 166,  14, \n     16,   0,   1,   0,   0,   0, \n    166,  14,  16,   0,   3,   0, \n      0,   0,  78,   0,   0,  11, \n    194,   0,  16,   0,   1,   0, \n      0,   0,   0, 208,   0,   0, \n    166,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n      9,   0,   0,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n      9,   0,   0,   0,   3,   0, \n      0,   0,   6,   4,  16,   0, \n      4,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  86,  13,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n     35,   0,   0,   9, 242,   0, \n     16,   0,  12,   0,   0,   0, \n      6,   8,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n     78,   0,   0,  11, 242,   0, \n     16,   0,  12,   0,   0,   0, \n      0, 208,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,  35,   0,   0,  12, \n     50,   0,  16,   0,  13,   0, \n      0,   0, 198,   0,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    230,  10,  16,   0,   1,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,  13,   0, \n      0,   0,  42,   0,  16,   0, \n     12,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   1,   0, \n     26,   0,  16,   0,  12,   0, \n      0,   0, 138,   0,   0,  15, \n    194,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   6,   0, \n      0,   0,   9,   0,   0,   0, \n    246,  15,  16,   0,   6,   0, \n      0,   0, 138,   0,   0,  15, \n    194,   0,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   6,   0, \n      0,   0,   9,   0,   0,   0, \n    246,  15,  16,   0,   7,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 194,   0, \n     16,   0,   3,   0,   0,   0, \n    246,  15,  16,   0,   2,   0, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,  35,   0, \n      0,   9, 194,   0,  16,   0, \n      1,   0,   0,   0, 166,  10, \n     16,   0,   2,   0,   0,   0, \n    166,  14,  16,   0,   1,   0, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,  78,   0, \n      0,  11, 194,   0,  16,   0, \n      1,   0,   0,   0,   0, 208, \n      0,   0, 166,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n     35,   0,   0,   9, 130,   0, \n     16,   0,   9,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   1,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     35,   0,   0,  12, 194,   0, \n     16,   0,   1,   0,   0,   0, \n     86,  13,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0,  86,  13, \n     16,   0,   9,   0,   0,   0, \n    138,   0,   0,  15, 194,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   6,   0,   0,   0, \n      9,   0,   0,   0, 246,  15, \n     16,   0,   8,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      6,   0,   0,   0,   9,   0, \n      0,   0,   6,   0,   0,   0, \n      9,   0,   0,   0,  86,  15, \n     16,   0,   4,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0,  50,   0,  16,   0, \n      6,   0,   0,   0, 246,  15, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,   6,   0, \n      0,   0,  35,   0,   0,   9, \n    194,   0,  16,   0,   3,   0, \n      0,   0, 166,  10,  16,   0, \n      2,   0,   0,   0, 166,  14, \n     16,   0,   3,   0,   0,   0, \n      6,   4,  16,   0,   6,   0, \n      0,   0,  78,   0,   0,  11, \n    194,   0,  16,   0,   3,   0, \n      0,   0,   0, 208,   0,   0, \n    166,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,  35,   0, \n      0,   9, 130,   0,  16,   0, \n     13,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      1,   0,  42,   0,  16,   0, \n      3,   0,   0,   0,  55,   0, \n      0,   9, 242,   0,  16,   0, \n      1,   0,   0,   0,   6,   5, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0, 134,  13,  16,   0, \n     13,   0,   0,   0,  41,   0, \n      0,  10, 194,   0,  16,   0, \n      1,   0,   0,   0, 166,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   1,   0, \n      0,   0, 230,  10,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n     85,   0,   0,  10, 194,   0, \n     16,   0,   3,   0,   0,   0, \n    166,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   7, 194,   0,  16,   0, \n      3,   0,   0,   0, 166,  14, \n     16,   0,   4,   0,   0,   0, \n    166,  14,  16,   0,   3,   0, \n      0,   0,   1,   0,   0,  10, \n    194,   0,  16,   0,   3,   0, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 146,   4, \n      0,   0, 146,   4,   0,   0, \n     41,   0,   0,  10,  50,   0, \n     16,   0,   6,   0,   0,   0, \n    230,  10,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      7,   0,   0,   0, 230,  10, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    194,   0,  16,   0,   3,   0, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,   6,   4, \n     16,   0,   6,   0,   0,   0, \n     30,   0,   0,   7, 194,   0, \n     16,   0,   3,   0,   0,   0, \n    166,  14,  16,   0,   3,   0, \n      0,   0,   6,   4,  16,   0, \n      7,   0,   0,   0,  59,   0, \n      0,   5, 242,   0,  16,   0, \n      7,   0,   0,   0, 166,  14, \n     16,   0,   3,   0,   0,   0, \n      1,   0,   0,   7, 242,   0, \n     16,   0,   8,   0,   0,   0, \n    166,  14,  16,   0,   4,   0, \n      0,   0, 166,  14,  16,   0, \n      7,   0,   0,   0,  30,   0, \n      0,  11, 242,   0,  16,   0, \n      9,   0,   0,   0, 166,  14, \n     16, 128,  65,   0,   0,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0, 109,  11,   0,   0, \n    109,  11,   0,   0, 109,  11, \n      0,   0, 109,  11,   0,   0, \n      1,   0,   0,   7, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,   1,   0, \n      0,  10,  50,   0,  16,   0, \n      6,   0,   0,   0, 230,  10, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n     50,   0,  16,   0,   9,   0, \n      0,   0, 230,  10,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0,  50,   0,  16,   0, \n      9,   0,   0,   0, 214,   5, \n     16,   0,   5,   0,   0,   0, \n     70,   0,  16,   0,   9,   0, \n      0,   0,  35,   0,   0,   9, \n     50,   0,  16,   0,   6,   0, \n      0,   0, 134,   0,  16,   0, \n      5,   0,   0,   0,  70,   0, \n     16,   0,   6,   0,   0,   0, \n     70,   0,  16,   0,   9,   0, \n      0,   0,  78,   0,   0,  11, \n     50,   0,  16,   0,   6,   0, \n      0,   0,   0, 208,   0,   0, \n     70,   0,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n      9,   0,   0,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n      9,   0,   0,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  86,  13,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     35,   0,   0,   9, 242,   0, \n     16,   0,   9,   0,   0,   0, \n      6,   8,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     78,   0,   0,  11, 242,   0, \n     16,   0,   9,   0,   0,   0, \n      0, 208,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,  35,   0,   0,  12, \n     50,   0,  16,   0,  10,   0, \n      0,   0, 198,   0,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   6,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,  10,   0, \n      0,   0,  42,   0,  16,   0, \n      9,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   1,   0, \n     26,   0,  16,   0,   9,   0, \n      0,   0,   1,   0,   0,   7, \n    194,   0,  16,   0,   3,   0, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0, 166,  14, \n     16,   0,   4,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   9,   0,   0,   0, \n    166,  15,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n     13,   0,   0,   0,   7,   0, \n      0,   0,  13,   0,   0,   0, \n      7,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0, 140,   0,   0,  17, \n     50,   0,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    230,  10,  16,   0,   3,   0, \n      0,   0, 134,   0,  16,   0, \n      9,   0,   0,   0, 138,   0, \n      0,  15, 194,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      6,   0,   0,   0,   6,   0, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,  30,   0, \n      0,   7, 194,   0,  16,   0, \n     12,   0,   0,   0,  86,  13, \n     16,   0,   9,   0,   0,   0, \n    166,  14,  16,   0,   3,   0, \n      0,   0,  35,   0,   0,  12, \n    194,   0,  16,   0,   3,   0, \n      0,   0,   6,   8,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n      6,   8,  16,   0,  10,   0, \n      0,   0,  59,   0,   0,   5, \n    242,   0,  16,   0,   9,   0, \n      0,   0, 166,  14,  16,   0, \n      4,   0,   0,   0,   1,   0, \n      0,  10,  50,   0,  16,   0, \n      6,   0,   0,   0, 230,  10, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0,  50,   0, \n     16,   0,   7,   0,   0,   0, \n    214,   5,  16,   0,   5,   0, \n      0,   0, 230,  10,  16,   0, \n     11,   0,   0,   0,  35,   0, \n      0,   9,  50,   0,  16,   0, \n      6,   0,   0,   0, 134,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   0,  16,   0,   6,   0, \n      0,   0,  70,   0,  16,   0, \n      7,   0,   0,   0,  78,   0, \n      0,  11,  50,   0,  16,   0, \n      6,   0,   0,   0,   0, 208, \n      0,   0,  70,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,   9,   0,   0,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,   9,   0,   0,   0, \n      3,   0,   0,   0, 166,  14, \n     16,   0,   4,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0, 242,   0,  16,   0, \n     13,   0,   0,   0,  86,  13, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  35,   0,   0,   9, \n    242,   0,  16,   0,  11,   0, \n      0,   0,   6,   8,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  78,   0,   0,  11, \n    242,   0,  16,   0,  11,   0, \n      0,   0,   0, 208,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,  35,   0, \n      0,  12,  50,   0,  16,   0, \n     13,   0,   0,   0, 198,   0, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      6,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n     13,   0,   0,   0,  42,   0, \n     16,   0,  11,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      1,   0,  26,   0,  16,   0, \n     11,   0,   0,   0,  55,   0, \n      0,   9, 194,   0,  16,   0, \n      3,   0,   0,   0,   6,   0, \n     16,   0,   3,   0,   0,   0, \n    166,  14,  16,   0,   3,   0, \n      0,   0,   6,   8,  16,   0, \n     13,   0,   0,   0, 138,   0, \n      0,  15,  50,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   6,   0, \n      0,   0,   9,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 246,  15,  16,   0, \n      7,   0,   0,   0, 138,   0, \n      0,  15,  50,   0,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   6,   0, \n      0,   0,   9,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 246,  15,  16,   0, \n      8,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n     50,   0,  16,   0,   7,   0, \n      0,   0, 246,  15,  16,   0, \n      5,   0,   0,   0,  70,   0, \n     16,   0,   7,   0,   0,   0, \n     35,   0,   0,   9,  50,   0, \n     16,   0,   6,   0,   0,   0, \n    166,  10,  16,   0,   5,   0, \n      0,   0,  70,   0,  16,   0, \n      6,   0,   0,   0,  70,   0, \n     16,   0,   7,   0,   0,   0, \n     78,   0,   0,  11,  50,   0, \n     16,   0,   6,   0,   0,   0, \n      0, 208,   0,   0,  70,   0, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  35,   0,   0,   9, \n    130,   0,  16,   0,  10,   0, \n      0,   0,  26,   0,  16,   0, \n      6,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   1,   0, \n     10,   0,  16,   0,   6,   0, \n      0,   0,  35,   0,   0,  12, \n     50,   0,  16,   0,   6,   0, \n      0,   0, 214,   5,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    214,   5,  16,   0,  10,   0, \n      0,   0, 138,   0,   0,  15, \n     50,   0,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   6,   0,   0,   0, \n      9,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    246,  15,  16,   0,   9,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 194,   0, \n     16,   0,   6,   0,   0,   0, \n    246,  15,  16,   0,   5,   0, \n      0,   0, 166,  14,  16,   0, \n      6,   0,   0,   0,  35,   0, \n      0,   9, 194,   0,  16,   0, \n      6,   0,   0,   0, 166,  10, \n     16,   0,   5,   0,   0,   0, \n      6,   4,  16,   0,   7,   0, \n      0,   0, 166,  14,  16,   0, \n      6,   0,   0,   0,  78,   0, \n      0,  11, 194,   0,  16,   0, \n      6,   0,   0,   0,   0, 208, \n      0,   0, 166,  14,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n     35,   0,   0,   9, 130,   0, \n     16,   0,  13,   0,   0,   0, \n     58,   0,  16,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   1,   0,  42,   0, \n     16,   0,   6,   0,   0,   0, \n     55,   0,   0,   9,  50,   0, \n     16,   0,   6,   0,   0,   0, \n     86,   5,  16,   0,   3,   0, \n      0,   0,  70,   0,  16,   0, \n      6,   0,   0,   0, 214,   5, \n     16,   0,  13,   0,   0,   0, \n     41,   0,   0,  10,  50,   0, \n     16,   0,   6,   0,   0,   0, \n     70,   0,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  60,   0, \n      0,   7, 194,   0,  16,   0, \n      1,   0,   0,   0, 166,  14, \n     16,   0,   3,   0,   0,   0, \n      6,   4,  16,   0,   6,   0, \n      0,   0, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  60,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  79,   0,   0,   9, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  31,   0,   4,   3, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  30,   0,   0,   9, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,  12,   0,   0,   0, \n     12,   0,   0,   0,  12,   0, \n      0,   0,  12,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   7, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0, 146,   4,   0,   0, \n    146,   4,   0,   0, 146,   4, \n      0,   0, 146,   4,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,  59,   0, \n      0,   5, 242,   0,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n      1,   0,   0,   7, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,  30,   0, \n      0,  11, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16, 128,  65,   0,   0,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0, 109,  11,   0,   0, \n    109,  11,   0,   0, 109,  11, \n      0,   0, 109,  11,   0,   0, \n      1,   0,   0,   7, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0, 194,   0,  16,   0, \n      3,   0,   0,   0,  86,  13, \n     16,   0,   2,   0,   0,   0, \n      6,   4,  16,   0,  10,   0, \n      0,   0,  35,   0,   0,   9, \n    194,   0,  16,   0,   3,   0, \n      0,   0,   6,   8,  16,   0, \n      2,   0,   0,   0,   6,   4, \n     16,   0,   9,   0,   0,   0, \n    166,  14,  16,   0,   3,   0, \n      0,   0,  78,   0,   0,  11, \n    194,   0,  16,   0,   3,   0, \n      0,   0,   0, 208,   0,   0, \n    166,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n      9,   0,   0,   0,   3,   0, \n      0,   0,   6,   4,  16,   0, \n      7,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n      9,   0,   0,   0,   3,   0, \n      0,   0,   6,   4,  16,   0, \n      8,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  86,  13,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n     35,   0,   0,   9, 242,   0, \n     16,   0,  11,   0,   0,   0, \n      6,   8,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n     78,   0,   0,  11, 242,   0, \n     16,   0,  11,   0,   0,   0, \n      0, 208,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,  35,   0,   0,  12, \n     50,   0,  16,   0,  12,   0, \n      0,   0, 198,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    230,  10,  16,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,  12,   0, \n      0,   0,  42,   0,  16,   0, \n     11,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   1,   0, \n     26,   0,  16,   0,  11,   0, \n      0,   0,   1,   0,   0,   7, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n      6,   5,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n     13,   0,   0,   0,   7,   0, \n      0,   0,  13,   0,   0,   0, \n      7,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0, 140,   0,   0,  17, \n     50,   0,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   6,   0, \n      0,   0, 134,   0,  16,   0, \n     11,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   6,   0, \n      0,   0,   6,   0,   0,   0, \n      6,   0,   0,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  30,   0, \n      0,   7, 194,   0,  16,   0, \n     13,   0,   0,   0,  86,  13, \n     16,   0,  11,   0,   0,   0, \n      6,   4,  16,   0,  14,   0, \n      0,   0,  35,   0,   0,  12, \n    194,   0,  16,   0,   3,   0, \n      0,   0,   6,   8,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n      6,   8,  16,   0,  12,   0, \n      0,   0,  59,   0,   0,   5, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,  12,   0,   0,   0, \n     15,   0,   0,   0,  18,   0, \n      0,   0,  21,   0,   0,   0, \n      6,   0,  16,   0,   4,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 242,   0, \n     16,   0,  15,   0,   0,   0, \n     86,   5,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n     15,   0,   0,   0,  35,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,  11,   0, \n      0,   0,  10,   0,  16,   0, \n     15,   0,   0,   0,  78,   0, \n      0,   8, 130,   0,  16,   0, \n      0,   0,   0,   0,   0, 208, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,   9,   0,   0,   0, \n      3,   0,   0,   0,   6,   4, \n     16,   0,   1,   0,   0,   0, \n     35,   0,   0,   9, 114,   0, \n     16,   0,  15,   0,   0,   0, \n      6,   0,  16,   0,   2,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0, 150,   7, \n     16,   0,  15,   0,   0,   0, \n     78,   0,   0,  11, 114,   0, \n     16,   0,  15,   0,   0,   0, \n      0, 208,   0,   0,  70,   2, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n     15,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   1,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n     15,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   1,   0, \n     26,   0,  16,   0,  15,   0, \n      0,   0,  55,   0,   0,   9, \n    146,   0,  16,   0,   0,   0, \n      0,   0,   6,   0,  16,   0, \n      0,   0,   0,   0, 166,  14, \n     16,   0,   3,   0,   0,   0, \n      6,   4,  16,   0,   2,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,  15,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   6,   0,   0,   0, \n      9,   0,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n     86,  10,  16,   0,   7,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,  17,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   6,   0,   0,   0, \n      9,   0,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n     86,  10,  16,   0,   8,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0,  50,   0, \n     16,   0,   2,   0,   0,   0, \n    246,  15,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n     17,   0,   0,   0,  35,   0, \n      0,   9,  50,   0,  16,   0, \n      2,   0,   0,   0, 166,  10, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,  15,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,  78,   0, \n      0,  11,  50,   0,  16,   0, \n      2,   0,   0,   0,   0, 208, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     35,   0,   0,   9, 130,   0, \n     16,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   1,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,  12,  50,   0, \n     16,   0,   2,   0,   0,   0, \n    214,   5,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 214,   5, \n     16,   0,  12,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n     12,   0,   0,   0,  15,   0, \n      0,   0,  18,   0,   0,   0, \n     21,   0,   0,   0,  86,   5, \n     16,   0,   4,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0, 242,   0,  16,   0, \n     12,   0,   0,   0, 246,  15, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,  11,   0,   0,   0, \n     10,   0,  16,   0,  12,   0, \n      0,   0,  78,   0,   0,   8, \n     18,   0,  16,   0,   1,   0, \n      0,   0,   0, 208,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      7,   0,   0,   0,  35,   0, \n      0,   9, 130,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,  16,   0, \n      0,   0,  26,   0,  16,   0, \n     12,   0,   0,   0,  78,   0, \n      0,   8, 130,   0,  16,   0, \n      2,   0,   0,   0,   0, 208, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   4,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   1,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      6,   0,   0,   0,   9,   0, \n      0,   0,   3,   0,   0,   0, \n      6,   0,   0,   0,  86,  10, \n     16,   0,   1,   0,   0,   0, \n     35,   0,   0,   9,  50,   0, \n     16,   0,   1,   0,   0,   0, \n    166,  10,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n     13,   0,   0,   0, 230,  10, \n     16,   0,  12,   0,   0,   0, \n     78,   0,   0,  11,  50,   0, \n     16,   0,   1,   0,   0,   0, \n      0, 208,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   4,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   1,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  55,   0,   0,   9, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  86,   5,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,   4,   0, \n      0,   0,  41,   0,   0,  10, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,   2,   0,   0,   0, \n    198,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n     50,   0,  16,   0,   0,   0, \n      0,   0, 214,   5,  16,   0, \n      5,   0,   0,   0, 230,  10, \n     16,   0,  10,   0,   0,   0, \n     35,   0,   0,   9,  50,   0, \n     16,   0,   0,   0,   0,   0, \n    134,   0,  16,   0,   5,   0, \n      0,   0, 230,  10,  16,   0, \n      9,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n     78,   0,   0,  11,  50,   0, \n     16,   0,   0,   0,   0,   0, \n      0, 208,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0,  50,   0, \n     16,   0,   1,   0,   0,   0, \n     86,   5,  16,   0,   5,   0, \n      0,   0, 230,  10,  16,   0, \n     17,   0,   0,   0,  35,   0, \n      0,   9,  50,   0,  16,   0, \n      1,   0,   0,   0,   6,   0, \n     16,   0,   5,   0,   0,   0, \n    230,  10,  16,   0,  15,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,  78,   0, \n      0,  11,  50,   0,  16,   0, \n      1,   0,   0,   0,   0, 208, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     35,   0,   0,   9,  66,   0, \n     16,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   1,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      9,   0,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n      9,   0,   0,   0, 230,  15, \n     16,   0,   7,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      9,   0,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n      9,   0,   0,   0, 230,  15, \n     16,   0,   8,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0, 242,   0,  16,   0, \n      8,   0,   0,   0, 214,  15, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,  35,   0,   0,   9, \n    242,   0,  16,   0,   7,   0, \n      0,   0, 134,  10,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,  78,   0,   0,  11, \n    242,   0,  16,   0,   7,   0, \n      0,   0,   0, 208,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,  35,   0, \n      0,   9, 130,   0,  16,   0, \n      3,   0,   0,   0,  10,   0, \n     16,   0,   7,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      1,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      8,   0,   0,   0, 166,  15, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,  13,   0, \n      0,   0,   7,   0,   0,   0, \n     13,   0,   0,   0,   7,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n    140,   0,   0,  17,  50,   0, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 230,  10, \n     16,   0,   6,   0,   0,   0, \n    134,   0,  16,   0,   8,   0, \n      0,   0,  30,   0,   0,   7, \n    194,   0,  16,   0,   6,   0, \n      0,   0,  86,  13,  16,   0, \n      8,   0,   0,   0, 166,  14, \n     16,   0,  14,   0,   0,   0, \n     35,   0,   0,  12, 146,   0, \n     16,   0,   0,   0,   0,   0, \n      6,   8,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    255,   0,   0,   0, 166,  14, \n     16,   0,   3,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n     12,   0,   0,   0,  15,   0, \n      0,   0,  18,   0,   0,   0, \n     21,   0,   0,   0, 166,  10, \n     16,   0,   4,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0, 242,   0,  16,   0, \n      8,   0,   0,   0,  86,   5, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      5,   0,   0,   0,  42,   0, \n     16,   0,  11,   0,   0,   0, \n     10,   0,  16,   0,   8,   0, \n      0,   0,  78,   0,   0,   8, \n     18,   0,  16,   0,   1,   0, \n      0,   0,   0, 208,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      7,   0,   0,   0,  35,   0, \n      0,   9, 194,   0,  16,   0, \n      3,   0,   0,   0,   6,   0, \n     16,   0,   5,   0,   0,   0, \n    166,  14,  16,   0,  13,   0, \n      0,   0,  86,   9,  16,   0, \n      8,   0,   0,   0,  78,   0, \n      0,  11, 194,   0,  16,   0, \n      3,   0,   0,   0,   0, 208, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n     35,   0,   0,   9,  66,   0, \n     16,   0,   9,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   1,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      9,   0,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n      9,   0,   0,   0, 230,  15, \n     16,   0,   1,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   5,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   8,   0,   0,   0, \n     78,   0,   0,   8,  18,   0, \n     16,   0,   1,   0,   0,   0, \n      0, 208,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  35,   0,   0,   9, \n    130,   0,  16,   0,   9,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   1,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,  55,   0,   0,   9, \n    146,   0,  16,   0,   0,   0, \n      0,   0,   6,   0,  16,   0, \n      3,   0,   0,   0,   6,  12, \n     16,   0,   0,   0,   0,   0, \n    166,  14,  16,   0,   9,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      7,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   1,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  35,   0,   0,   9, \n    130,   0,  16,   0,   3,   0, \n      0,   0,  58,   0,  16,   0, \n      7,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   1,   0, \n     42,   0,  16,   0,   7,   0, \n      0,   0,  35,   0,   0,  12, \n     82,   0,  16,   0,   3,   0, \n      0,   0,  86,   7,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0, 255,   0,   0,   0, \n      0,   0,   0,   0, 255,   0, \n      0,   0,   0,   0,   0,   0, \n    166,  11,  16,   0,   3,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,  12,   0,   0,   0, \n     15,   0,   0,   0,  18,   0, \n      0,   0,  21,   0,   0,   0, \n    246,  15,  16,   0,   4,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0, 246,  15,  16,   0, \n      5,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   5,   0,   0,   0, \n     58,   0,  16,   0,  11,   0, \n      0,   0,  10,   0,  16,   0, \n      4,   0,   0,   0,  78,   0, \n      0,   8,  34,   0,  16,   0, \n      0,   0,   0,   0,   0, 208, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     35,   0,   0,   9, 114,   0, \n     16,   0,   1,   0,   0,   0, \n    166,  10,  16,   0,   5,   0, \n      0,   0, 150,   7,  16,   0, \n      1,   0,   0,   0, 150,   7, \n     16,   0,   4,   0,   0,   0, \n     78,   0,   0,  11, 114,   0, \n     16,   0,   1,   0,   0,   0, \n      0, 208,   0,   0,  70,   2, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   4,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   1,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  35,   0,   0,   9, \n    130,   0,  16,   0,   4,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   1,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  55,   0,   0,   9, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  86,   5,  16,   0, \n      3,   0,   0,   0, 134,   0, \n     16,   0,   3,   0,   0,   0, \n    230,  10,  16,   0,   4,   0, \n      0,   0,  41,   0,   0,  10, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7, 194,   0, \n     16,   0,   2,   0,   0,   0, \n      6,  12,  16,   0,   0,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     21,   0,   0,   1,  21,   0, \n      0,   1,  21,   0,   0,   1, \n     62,   0,   0,   1,  83,  84, \n     65,  84, 148,   0,   0,   0, \n    177,   2,   0,   0,  19,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  20,   1,   0,   0, \n      2,   1,   0,   0,   7,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  19,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_dxt1_rgba8_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 16\ndcl_thread_group 4, 32, 1\nand r0.xy, CB0[0][0].xxxx, l(1, 2, 0, 0)\nishl r1.x, vThreadID.x, l(2)\nmov r1.y, vThreadID.y\nuge r0.zw, r1.xxxy, CB0[0][1].xxxy\nor r0.z, r0.w, r0.z\nif_nz r0.z\n  ret \nendif \nubfe r0.z, l(2), l(2), CB0[0][0].x\nishl r1.yz, r1.xxyx, l(0, 2, 2, 0)\nishl r0.w, r1.y, l(2)\nimad r1.y, vThreadID.z, CB0[0][2].y, r1.z\nimad r0.w, r1.y, CB0[0][2].x, r0.w\niadd r0.w, r0.w, CB0[0][1].w\nif_z r0.x\n  imad r1.y, CB0[0][0].w, vThreadID.z, vThreadID.y\n  imad r1.y, CB0[0][0].z, r1.y, r1.x\n  ishl r1.y, r1.y, l(3)\nelse \n  if_nz r0.y\n    ushr r1.zw, CB0[0][0].zzzw, l(0, 0, 5, 4)\n    ishr r2.xyzw, vThreadID.zyyy, l(2, 4, 1, 3)\n    imad r0.y, r2.x, r1.w, r2.y\n    ibfe r1.w, l(27), l(3), vThreadID.x\n    imad r0.y, r0.y, r1.z, r1.w\n    bfi r1.zw, l(0, 0, 2, 1), l(0, 0, 5, 4), vThreadID.zzzy, l(0, 0, 0, 0)\n    bfi r2.y, l(2), l(3), r2.z, l(0)\n    iadd r1.z, r1.z, r2.y\n    bfi r1.z, l(3), l(0), r1.x, r1.z\n    bfi r0.y, l(25), l(7), r0.y, r1.z\n    xor r1.z, r2.x, r2.w\n    ubfe r2.x, l(2), l(3), r1.x\n    bfi r2.yz, l(0, 1, 1, 0), l(0, 1, 11, 0), r1.zzzz, l(0, 0, 0, 0)\n    xor r1.z, r2.y, r2.x\n    imad r1.z, r1.z, l(64), r1.w\n    iadd r1.z, r2.z, r1.z\n    ibfe r2.xy, l(27, 24, 0, 0), l(2, 5, 0, 0), r0.yyyy\n    bfi r0.y, l(3), l(8), r2.x, r1.z\n    bfi r1.y, l(20), l(12), r2.y, r0.y\n  else \n    ushr r0.y, CB0[0][0].z, l(5)\n    ishr r2.xyzw, vThreadID.yyyy, l(5, 1, 4, 3)\n    ibfe r1.z, l(27), l(3), vThreadID.x\n    imad r0.y, r2.x, r0.y, r1.z\n    bfi r2.xyz, l(3, 1, 1, 0), l(3, 1, 11, 0), r2.ywzy, l(0, 0, 0, 0)\n    bfi r1.z, l(3), l(0), r1.x, r2.x\n    bfi r0.y, l(26), l(6), r0.y, r1.z\n    ubfe r1.x, l(2), l(3), r1.x\n    xor r1.x, r2.y, r1.x\n    bfi r1.z, l(1), l(4), vThreadID.y, l(0)\n    imad r1.x, r1.x, l(64), r1.z\n    iadd r1.x, r2.z, r1.x\n    ibfe r1.zw, l(0, 0, 27, 24), l(0, 0, 2, 5), r0.yyyy\n    bfi r0.y, l(3), l(8), r1.z, r1.x\n    bfi r1.y, l(20), l(12), r1.w, r0.y\n  endif \nendif \niadd r0.y, r1.y, CB0[0][0].y\nld_raw r1.xyzw, r0.y, T0[0].xyzw\nieq r2.xyz, r0.zzzz, l(1, 2, 3, 0)\nor r2.xy, r2.yzyy, r2.xyxx\nif_nz r2.x\n  ishl r3.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r1.xyzw, r3.xyzw, r4.xyzw\nendif \nif_nz r2.y\n  ushr r3.xyzw, r1.xyzw, l(16, 16, 16, 16)\n  bfi r1.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r1.xyzw, r3.xyzw\n  mov r3.xy, r1.ywyy\nelse \n  mov r3.xy, r1.ywyy\nendif \nif_nz r0.x\n  mov r0.x, l(32)\nelse \n  mov r0.x, l(16)\nendif \niadd r0.x, r0.x, r0.y\nld_raw r4.xyzw, r0.x, T0[0].xyzw\nif_nz r2.x\n  ishl r5.xyzw, r4.xyzw, l(8, 8, 8, 8)\n  and r5.xyzw, r5.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r6.xyzw, r4.xyzw, l(8, 8, 8, 8)\n  and r6.xyzw, r6.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r4.xyzw, r5.xyzw, r6.xyzw\nendif \nif_nz r2.y\n  ushr r2.xyzw, r4.xyzw, l(16, 16, 16, 16)\n  bfi r4.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r4.xyzw, r2.xyzw\n  mov r3.zw, r4.yyyw\nelse \n  mov r3.zw, r4.yyyw\nendif \nishl r2.xyz, r1.xxxx, l(3, 7, 12, 0)\nushr r5.xyz, r1.xxxx, l(13, 4, 9, 0)\nmov r2.w, r5.x\nand r0.xy, r2.xwxx, l(248, 248, 0, 0)\nmov r5.xw, r2.zzzy\nand r1.xy, r5.wzww, l(0x0003f000, 0x0003f000, 0, 0)\niadd r0.xy, r0.xyxx, r1.xyxx\nand r1.xy, r5.xyxx, l(0x0f800000, 0x0f800000, 0, 0)\niadd r0.xy, r0.xyxx, r1.xyxx\nushr r1.xy, r0.xyxx, l(5, 5, 0, 0)\nand r1.xy, r1.xyxx, l(0x00700007, 0x00700007, 0, 0)\niadd r0.xy, r0.xyxx, r1.xyxx\nushr r1.xy, r0.xyxx, l(6, 6, 0, 0)\nand r1.xy, r1.xyxx, l(3072, 3072, 0, 0)\niadd r0.xy, r0.xyxx, r1.xyxx\nishl r2.xyz, r1.zzzz, l(3, 7, 12, 0)\nushr r1.xyz, r1.zzzz, l(13, 4, 9, 0)\nmov r2.w, r1.x\nand r2.xw, r2.xxxw, l(248, 0, 0, 248)\nmov r1.xw, r2.zzzy\nand r1.zw, r1.wwwz, l(0, 0, 0x0003f000, 0x0003f000)\niadd r1.zw, r1.zzzw, r2.xxxw\nand r1.xy, r1.xyxx, l(0x0f800000, 0x0f800000, 0, 0)\niadd r1.xy, r1.xyxx, r1.zwzz\nushr r1.zw, r1.xxxy, l(0, 0, 5, 5)\nand r1.zw, r1.zzzw, l(0, 0, 0x00700007, 0x00700007)\niadd r1.xy, r1.zwzz, r1.xyxx\nushr r1.zw, r1.xxxy, l(0, 0, 6, 6)\nand r1.zw, r1.zzzw, l(0, 0, 3072, 3072)\niadd r1.xy, r1.wzww, r1.yxyy\nishl r2.xyz, r4.xxxx, l(3, 7, 12, 0)\nushr r5.xyz, r4.xxxx, l(13, 4, 9, 0)\nmov r2.w, r5.x\nand r2.xw, r2.xxxw, l(248, 0, 0, 248)\nmov r5.xw, r2.zzzy\nand r4.xy, r5.wzww, l(0x0003f000, 0x0003f000, 0, 0)\niadd r2.xy, r2.xwxx, r4.xyxx\nand r2.zw, r5.xxxy, l(0, 0, 0x0f800000, 0x0f800000)\niadd r2.xy, r2.zwzz, r2.xyxx\nushr r2.zw, r2.xxxy, l(0, 0, 5, 5)\nand r2.zw, r2.zzzw, l(0, 0, 0x00700007, 0x00700007)\niadd r2.xy, r2.zwzz, r2.xyxx\nushr r2.zw, r2.xxxy, l(0, 0, 6, 6)\nand r2.zw, r2.zzzw, l(0, 0, 3072, 3072)\niadd r2.xy, r2.zwzz, r2.xyxx\nishl r5.xyz, r4.zzzz, l(3, 7, 12, 0)\nushr r4.xyz, r4.zzzz, l(13, 4, 9, 0)\nmov r5.w, r4.x\nand r2.zw, r5.xxxw, l(0, 0, 248, 248)\nmov r4.xw, r5.zzzy\nand r4.zw, r4.wwwz, l(0, 0, 0x0003f000, 0x0003f000)\niadd r2.zw, r2.zzzw, r4.zzzw\nand r4.xy, r4.xyxx, l(0x0f800000, 0x0f800000, 0, 0)\niadd r2.zw, r2.zzzw, r4.xxxy\nushr r4.xy, r2.zwzz, l(5, 5, 0, 0)\nand r4.xy, r4.xyxx, l(0x00700007, 0x00700007, 0, 0)\niadd r2.zw, r2.zzzw, r4.xxxy\nushr r4.xy, r2.zwzz, l(6, 6, 0, 0)\nand r4.xy, r4.xyxx, l(3072, 3072, 0, 0)\niadd r2.zw, r2.zzzw, r4.xxxy\nmov r4.x, r0.y\nmov r4.y, r1.x\nmov r4.zw, r2.yyyw\nmov r1.x, r0.x\nmov r1.zw, r2.xxxz\nuge r5.xyzw, r4.xyzw, r1.xyzw\nnot r6.xyzw, r3.xyzw\nishl r7.xyzw, r6.xyzw, l(1, 1, 1, 1)\nand r7.xyzw, r7.xyzw, l(0xaaaaaaaa, 0xaaaaaaaa, 0xaaaaaaaa, 0xaaaaaaaa)\nxor r6.xyzw, r6.xyzw, r7.xyzw\nishl r7.xyzw, r3.xyzw, l(1, 1, 1, 1)\nand r7.xyzw, r7.xyzw, l(0xaaaaaaaa, 0xaaaaaaaa, 0xaaaaaaaa, 0xaaaaaaaa)\nushr r3.xyzw, r3.xyzw, l(1, 1, 1, 1)\nand r3.xyzw, r3.xyzw, l(0x55555555, 0x55555555, 0x55555555, 0x55555555)\niadd r3.xyzw, r3.xyzw, r7.xyzw\nushr r7.xyzw, r3.xyzw, l(1, 1, 1, 1)\nand r7.xyzw, r7.xyzw, l(0x55555555, 0x55555555, 0x55555555, 0x55555555)\nxor r3.xyzw, r3.xyzw, r7.xyzw\nmovc r3.xyzw, r5.xyzw, r6.xyzw, r3.xyzw\nushr r6.xyzw, r3.xxxx, l(2, 4, 6, 1)\nmov r7.x, r3.x\nmov r7.yzw, r6.xxyz\nand r8.xyzw, r7.xyzw, l(1, 1, 1, 1)\nubfe r9.xyzw, l(1, 1, 1, 1), l(1, 3, 5, 7), r7.xxxx\nimul null, r9.xyzw, r0.yyyy, r9.xyzw\nimad r8.xyzw, r8.xyzw, r1.xxxx, r9.xyzw\nand r9.x, r6.w, r7.x\nand r10.x, r9.x, l(0x55555555)\nushr r9.yzw, r10.xxxx, l(0, 2, 4, 6)\nand r11.xyzw, r9.xyzw, l(1, 1, 1, 1)\nor r6.x, r6.w, r7.x\nubfe r11.xyzw, l(9, 9, 9, 9), r11.xyzw, r8.xyzw\nishl r11.xyzw, r11.xyzw, l(16, 16, 16, 16)\nmov r10.yzw, r9.yyzw\nbfi r9.xyzw, l(1, 1, 1, 1), l(0, 0, 0, 0), r10.xyzw, l(10, 10, 10, 10)\nubfe r9.xyzw, l(9, 9, 9, 9), r9.xyzw, r8.xyzw\nishl r9.xyzw, r9.xyzw, l(8, 8, 8, 8)\niadd r9.xyzw, r9.xyzw, r11.xyzw\nbfi r10.xyzw, l(2, 2, 2, 2), l(0, 0, 0, 0), r10.xyzw, l(20, 20, 20, 20)\nushr r8.xyzw, r8.xyzw, r10.xyzw\niadd r8.xyzw, r8.xyzw, r9.xyzw\nushr r6.yzw, r6.xxxx, l(0, 2, 4, 6)\nand r6.xyzw, r6.xyzw, l(1, 1, 1, 1)\nimad r6.xyzw, r6.xyzw, l(0xff000000, 0xff000000, 0xff000000, 0xff000000), r8.xyzw\nnot r8.xyzw, r3.wxyz\nushr r9.yzw, r8.yyyy, l(0, 2, 4, 6)\nmov r9.x, r8.y\nand r9.xyzw, r9.xyzw, l(3, 3, 3, 3)\nand r10.xyzw, r7.xyzw, l(3, 3, 3, 3)\nimul null, r10.xyzw, r0.yyyy, r10.xyzw\nimad r9.xyzw, r9.xyzw, r1.xxxx, r10.xyzw\nand r10.xyzw, r9.xyzw, l(1023, 1023, 1023, 1023)\nudiv r10.xyzw, null, r10.xyzw, l(3, 3, 3, 3)\nishl r10.xyzw, r10.xyzw, l(16, 16, 16, 16)\nubfe r11.xyzw, l(10, 10, 10, 10), l(10, 10, 10, 10), r9.xyzw\nudiv r11.xyzw, null, r11.xyzw, l(3, 3, 3, 3)\nbfi r10.xyzw, l(8, 8, 8, 8), l(8, 8, 8, 8), r11.xyzw, r10.xyzw\nushr r9.xyzw, r9.xyzw, l(20, 20, 20, 20)\nudiv r9.xyzw, null, r9.xyzw, l(3, 3, 3, 3)\nor r9.xyzw, r9.xyzw, r10.xyzw\nor r9.xyzw, r9.xyzw, l(0xff000000, 0xff000000, 0xff000000, 0xff000000)\nmovc r6.xyzw, r5.xxxx, r6.xyzw, r9.xyzw\nstore_raw U0[0].xyzw, r0.w, r6.xyzw\niadd r4.xzw, r0.wwww, l(16, 0, 32, 48)\nushr r6.xyzw, r3.yyyy, l(2, 4, 6, 1)\nmov r9.x, r3.y\nmov r9.yzw, r6.xxyz\nand r10.xyzw, r9.xyzw, l(1, 1, 1, 1)\nubfe r11.xyzw, l(1, 1, 1, 1), l(1, 3, 5, 7), r3.yyyy\nimul null, r11.xyzw, r4.yyyy, r11.xyzw\nimad r10.xyzw, r10.xyzw, r1.yyyy, r11.xyzw\nand r11.x, r3.y, r6.w\nand r12.x, r11.x, l(0x55555555)\nushr r11.yzw, r12.xxxx, l(0, 2, 4, 6)\nand r13.xyzw, r11.xyzw, l(1, 1, 1, 1)\nor r6.x, r3.y, r6.w\nubfe r13.xyzw, l(9, 9, 9, 9), r13.xyzw, r10.xyzw\nishl r13.xyzw, r13.xyzw, l(16, 16, 16, 16)\nmov r12.yzw, r11.yyzw\nbfi r11.xyzw, l(1, 1, 1, 1), l(0, 0, 0, 0), r12.xyzw, l(10, 10, 10, 10)\nubfe r11.xyzw, l(9, 9, 9, 9), r11.xyzw, r10.xyzw\nishl r11.xyzw, r11.xyzw, l(8, 8, 8, 8)\niadd r11.xyzw, r11.xyzw, r13.xyzw\nbfi r12.xyzw, l(2, 2, 2, 2), l(0, 0, 0, 0), r12.xyzw, l(20, 20, 20, 20)\nushr r10.xyzw, r10.xyzw, r12.xyzw\niadd r10.xyzw, r10.xyzw, r11.xyzw\nushr r6.yzw, r6.xxxx, l(0, 2, 4, 6)\nand r6.xyzw, r6.xyzw, l(1, 1, 1, 1)\nimad r6.xyzw, r6.xyzw, l(0xff000000, 0xff000000, 0xff000000, 0xff000000), r10.xyzw\nushr r10.yzw, r8.zzzz, l(0, 2, 4, 6)\nmov r10.x, r8.z\nand r10.xyzw, r10.xyzw, l(3, 3, 3, 3)\nand r9.xyzw, r9.xyzw, l(3, 3, 3, 3)\nimul null, r9.xyzw, r4.yyyy, r9.xyzw\nimad r9.xyzw, r10.xyzw, r1.yyyy, r9.xyzw\nand r10.xyzw, r9.xyzw, l(1023, 1023, 1023, 1023)\nudiv r10.xyzw, null, r10.xyzw, l(3, 3, 3, 3)\nishl r10.xyzw, r10.xyzw, l(16, 16, 16, 16)\nubfe r11.xyzw, l(10, 10, 10, 10), l(10, 10, 10, 10), r9.xyzw\nudiv r11.xyzw, null, r11.xyzw, l(3, 3, 3, 3)\nbfi r10.xyzw, l(8, 8, 8, 8), l(8, 8, 8, 8), r11.xyzw, r10.xyzw\nushr r9.xyzw, r9.xyzw, l(20, 20, 20, 20)\nudiv r9.xyzw, null, r9.xyzw, l(3, 3, 3, 3)\nor r9.xyzw, r9.xyzw, r10.xyzw\nor r9.xyzw, r9.xyzw, l(0xff000000, 0xff000000, 0xff000000, 0xff000000)\nmovc r6.xyzw, r5.yyyy, r6.xyzw, r9.xyzw\nstore_raw U0[0].xyzw, r4.x, r6.xyzw\nushr r6.xyzw, r3.zzzz, l(2, 4, 6, 1)\nmov r9.x, r3.z\nmov r9.yzw, r6.xxyz\nand r10.xyzw, r9.xyzw, l(1, 1, 1, 1)\nubfe r11.xyzw, l(1, 1, 1, 1), l(1, 3, 5, 7), r3.zzzz\nimul null, r11.xyzw, r2.yyyy, r11.xyzw\nimad r10.xyzw, r10.xyzw, r2.xxxx, r11.xyzw\nand r11.x, r3.z, r6.w\nand r12.x, r11.x, l(0x55555555)\nushr r11.yzw, r12.xxxx, l(0, 2, 4, 6)\nand r13.xyzw, r11.xyzw, l(1, 1, 1, 1)\nor r6.x, r3.z, r6.w\nubfe r13.xyzw, l(9, 9, 9, 9), r13.xyzw, r10.xyzw\nishl r13.xyzw, r13.xyzw, l(16, 16, 16, 16)\nmov r12.yzw, r11.yyzw\nbfi r11.xyzw, l(1, 1, 1, 1), l(0, 0, 0, 0), r12.xyzw, l(10, 10, 10, 10)\nubfe r11.xyzw, l(9, 9, 9, 9), r11.xyzw, r10.xyzw\nishl r11.xyzw, r11.xyzw, l(8, 8, 8, 8)\niadd r11.xyzw, r11.xyzw, r13.xyzw\nbfi r12.xyzw, l(2, 2, 2, 2), l(0, 0, 0, 0), r12.xyzw, l(20, 20, 20, 20)\nushr r10.xyzw, r10.xyzw, r12.xyzw\niadd r10.xyzw, r10.xyzw, r11.xyzw\nushr r6.yzw, r6.xxxx, l(0, 2, 4, 6)\nand r6.xyzw, r6.xyzw, l(1, 1, 1, 1)\nimad r6.xyzw, r6.xyzw, l(0xff000000, 0xff000000, 0xff000000, 0xff000000), r10.xyzw\nushr r10.yzw, r8.wwww, l(0, 2, 4, 6)\nmov r10.x, r8.w\nand r10.xyzw, r10.xyzw, l(3, 3, 3, 3)\nand r9.xyzw, r9.xyzw, l(3, 3, 3, 3)\nimul null, r9.xyzw, r2.yyyy, r9.xyzw\nimad r9.xyzw, r10.xyzw, r2.xxxx, r9.xyzw\nand r10.xyzw, r9.xyzw, l(1023, 1023, 1023, 1023)\nudiv r10.xyzw, null, r10.xyzw, l(3, 3, 3, 3)\nishl r10.xyzw, r10.xyzw, l(16, 16, 16, 16)\nubfe r11.xyzw, l(10, 10, 10, 10), l(10, 10, 10, 10), r9.xyzw\nudiv r11.xyzw, null, r11.xyzw, l(3, 3, 3, 3)\nbfi r10.xyzw, l(8, 8, 8, 8), l(8, 8, 8, 8), r11.xyzw, r10.xyzw\nushr r9.xyzw, r9.xyzw, l(20, 20, 20, 20)\nudiv r9.xyzw, null, r9.xyzw, l(3, 3, 3, 3)\nor r9.xyzw, r9.xyzw, r10.xyzw\nor r9.xyzw, r9.xyzw, l(0xff000000, 0xff000000, 0xff000000, 0xff000000)\nmovc r6.xyzw, r5.zzzz, r6.xyzw, r9.xyzw\nstore_raw U0[0].xyzw, r4.z, r6.xyzw\nushr r6.xyzw, r3.wwww, l(2, 4, 6, 1)\nmov r9.x, r3.w\nmov r9.yzw, r6.xxyz\nand r10.xyzw, r9.xyzw, l(1, 1, 1, 1)\nubfe r11.xyzw, l(1, 1, 1, 1), l(1, 3, 5, 7), r3.wwww\nimul null, r11.xyzw, r2.wwww, r11.xyzw\nimad r10.xyzw, r10.xyzw, r2.zzzz, r11.xyzw\nand r11.x, r3.w, r6.w\nand r12.x, r11.x, l(0x55555555)\nushr r11.yzw, r12.xxxx, l(0, 2, 4, 6)\nand r13.xyzw, r11.xyzw, l(1, 1, 1, 1)\nor r6.x, r3.w, r6.w\nubfe r13.xyzw, l(9, 9, 9, 9), r13.xyzw, r10.xyzw\nishl r13.xyzw, r13.xyzw, l(16, 16, 16, 16)\nmov r12.yzw, r11.yyzw\nbfi r11.xyzw, l(1, 1, 1, 1), l(0, 0, 0, 0), r12.xyzw, l(10, 10, 10, 10)\nubfe r11.xyzw, l(9, 9, 9, 9), r11.xyzw, r10.xyzw\nishl r11.xyzw, r11.xyzw, l(8, 8, 8, 8)\niadd r11.xyzw, r11.xyzw, r13.xyzw\nbfi r12.xyzw, l(2, 2, 2, 2), l(0, 0, 0, 0), r12.xyzw, l(20, 20, 20, 20)\nushr r10.xyzw, r10.xyzw, r12.xyzw\niadd r10.xyzw, r10.xyzw, r11.xyzw\nushr r6.yzw, r6.xxxx, l(0, 2, 4, 6)\nand r6.xyzw, r6.xyzw, l(1, 1, 1, 1)\nimad r6.xyzw, r6.xyzw, l(0xff000000, 0xff000000, 0xff000000, 0xff000000), r10.xyzw\nushr r8.yzw, r8.xxxx, l(0, 2, 4, 6)\nand r8.xyzw, r8.xyzw, l(3, 3, 3, 3)\nand r9.xyzw, r9.xyzw, l(3, 3, 3, 3)\nimul null, r9.xyzw, r2.wwww, r9.xyzw\nimad r8.xyzw, r8.xyzw, r2.zzzz, r9.xyzw\nand r9.xyzw, r8.xyzw, l(1023, 1023, 1023, 1023)\nudiv r9.xyzw, null, r9.xyzw, l(3, 3, 3, 3)\nishl r9.xyzw, r9.xyzw, l(16, 16, 16, 16)\nubfe r10.xyzw, l(10, 10, 10, 10), l(10, 10, 10, 10), r8.xyzw\nudiv r10.xyzw, null, r10.xyzw, l(3, 3, 3, 3)\nbfi r9.xyzw, l(8, 8, 8, 8), l(8, 8, 8, 8), r10.xyzw, r9.xyzw\nushr r8.xyzw, r8.xyzw, l(20, 20, 20, 20)\nudiv r8.xyzw, null, r8.xyzw, l(3, 3, 3, 3)\nor r8.xyzw, r8.xyzw, r9.xyzw\nor r8.xyzw, r8.xyzw, l(0xff000000, 0xff000000, 0xff000000, 0xff000000)\nmovc r6.xyzw, r5.wwww, r6.xyzw, r8.xyzw\nstore_raw U0[0].xyzw, r4.w, r6.xyzw\nimad r0.x, vThreadID.y, l(4), l(1)\nult r0.x, r0.x, CB0[0][2].y\nif_nz r0.x\n  iadd r0.w, r0.w, CB0[0][2].x\n  ushr r6.xyzw, r3.xyzw, l(8, 8, 8, 8)\n  ushr r8.xyzw, r6.xxxx, l(2, 4, 6, 1)\n  mov r9.x, r6.x\n  mov r9.yzw, r8.xxyz\n  and r10.xyzw, r9.xyzw, l(1, 1, 1, 1)\n  ubfe r11.xyzw, l(1, 1, 1, 1), l(9, 11, 13, 15), r7.xxxx\n  imul null, r11.xyzw, r0.yyyy, r11.xyzw\n  imad r10.xyzw, r10.xyzw, r1.xxxx, r11.xyzw\n  and r11.x, r8.w, r9.x\n  and r12.x, r11.x, l(0x00555555)\n  ushr r11.yzw, r12.xxxx, l(0, 2, 4, 6)\n  and r13.xyzw, r11.xyzw, l(1, 1, 1, 1)\n  or r8.x, r8.w, r9.x\n  ubfe r13.xyzw, l(9, 9, 9, 9), r13.xyzw, r10.xyzw\n  ishl r13.xyzw, r13.xyzw, l(16, 16, 16, 16)\n  mov r12.yzw, r11.yyzw\n  bfi r11.xyzw, l(1, 1, 1, 1), l(0, 0, 0, 0), r12.xyzw, l(10, 10, 10, 10)\n  ubfe r11.xyzw, l(9, 9, 9, 9), r11.xyzw, r10.xyzw\n  ishl r11.xyzw, r11.xyzw, l(8, 8, 8, 8)\n  iadd r11.xyzw, r11.xyzw, r13.xyzw\n  bfi r12.xyzw, l(2, 2, 2, 2), l(0, 0, 0, 0), r12.xyzw, l(20, 20, 20, 20)\n  ushr r10.xyzw, r10.xyzw, r12.xyzw\n  iadd r10.xyzw, r10.xyzw, r11.xyzw\n  ushr r8.yzw, r8.xxxx, l(0, 2, 4, 6)\n  and r8.xyzw, r8.xyzw, l(1, 1, 1, 1)\n  imad r8.xyzw, r8.xyzw, l(0xff000000, 0xff000000, 0xff000000, 0xff000000), r10.xyzw\n  not r10.xyzw, r6.wxyz\n  ushr r11.yzw, r10.yyyy, l(0, 2, 4, 6)\n  mov r11.x, r10.y\n  and r11.xyzw, r11.xyzw, l(3, 3, 3, 3)\n  and r12.xyzw, r9.xyzw, l(3, 3, 3, 3)\n  imul null, r12.xyzw, r0.yyyy, r12.xyzw\n  imad r11.xyzw, r11.xyzw, r1.xxxx, r12.xyzw\n  and r12.xyzw, r11.xyzw, l(1023, 1023, 1023, 1023)\n  udiv r12.xyzw, null, r12.xyzw, l(3, 3, 3, 3)\n  ishl r12.xyzw, r12.xyzw, l(16, 16, 16, 16)\n  ubfe r13.xyzw, l(10, 10, 10, 10), l(10, 10, 10, 10), r11.xyzw\n  udiv r13.xyzw, null, r13.xyzw, l(3, 3, 3, 3)\n  bfi r12.xyzw, l(8, 8, 8, 8), l(8, 8, 8, 8), r13.xyzw, r12.xyzw\n  ushr r11.xyzw, r11.xyzw, l(20, 20, 20, 20)\n  udiv r11.xyzw, null, r11.xyzw, l(3, 3, 3, 3)\n  or r11.xyzw, r11.xyzw, r12.xyzw\n  or r11.xyzw, r11.xyzw, l(0xff000000, 0xff000000, 0xff000000, 0xff000000)\n  movc r8.xyzw, r5.xxxx, r8.xyzw, r11.xyzw\n  store_raw U0[0].xyzw, r0.w, r8.xyzw\n  iadd r4.xzw, r0.wwww, l(16, 0, 32, 48)\n  ushr r8.xyzw, r6.yyyy, l(2, 4, 6, 1)\n  mov r11.x, r6.y\n  mov r11.yzw, r8.xxyz\n  and r12.xyzw, r11.xyzw, l(1, 1, 1, 1)\n  ubfe r13.xyzw, l(1, 1, 1, 1), l(9, 11, 13, 15), r3.yyyy\n  imul null, r13.xyzw, r4.yyyy, r13.xyzw\n  imad r12.xyzw, r12.xyzw, r1.yyyy, r13.xyzw\n  and r13.x, r6.y, r8.w\n  and r14.x, r13.x, l(0x00555555)\n  ushr r13.yzw, r14.xxxx, l(0, 2, 4, 6)\n  and r15.xyzw, r13.xyzw, l(1, 1, 1, 1)\n  or r8.x, r6.y, r8.w\n  ubfe r15.xyzw, l(9, 9, 9, 9), r15.xyzw, r12.xyzw\n  ishl r15.xyzw, r15.xyzw, l(16, 16, 16, 16)\n  mov r14.yzw, r13.yyzw\n  bfi r13.xyzw, l(1, 1, 1, 1), l(0, 0, 0, 0), r14.xyzw, l(10, 10, 10, 10)\n  ubfe r13.xyzw, l(9, 9, 9, 9), r13.xyzw, r12.xyzw\n  ishl r13.xyzw, r13.xyzw, l(8, 8, 8, 8)\n  iadd r13.xyzw, r13.xyzw, r15.xyzw\n  bfi r14.xyzw, l(2, 2, 2, 2), l(0, 0, 0, 0), r14.xyzw, l(20, 20, 20, 20)\n  ushr r12.xyzw, r12.xyzw, r14.xyzw\n  iadd r12.xyzw, r12.xyzw, r13.xyzw\n  ushr r8.yzw, r8.xxxx, l(0, 2, 4, 6)\n  and r8.xyzw, r8.xyzw, l(1, 1, 1, 1)\n  imad r8.xyzw, r8.xyzw, l(0xff000000, 0xff000000, 0xff000000, 0xff000000), r12.xyzw\n  ushr r12.yzw, r10.zzzz, l(0, 2, 4, 6)\n  mov r12.x, r10.z\n  and r12.xyzw, r12.xyzw, l(3, 3, 3, 3)\n  and r11.xyzw, r11.xyzw, l(3, 3, 3, 3)\n  imul null, r11.xyzw, r4.yyyy, r11.xyzw\n  imad r11.xyzw, r12.xyzw, r1.yyyy, r11.xyzw\n  and r12.xyzw, r11.xyzw, l(1023, 1023, 1023, 1023)\n  udiv r12.xyzw, null, r12.xyzw, l(3, 3, 3, 3)\n  ishl r12.xyzw, r12.xyzw, l(16, 16, 16, 16)\n  ubfe r13.xyzw, l(10, 10, 10, 10), l(10, 10, 10, 10), r11.xyzw\n  udiv r13.xyzw, null, r13.xyzw, l(3, 3, 3, 3)\n  bfi r12.xyzw, l(8, 8, 8, 8), l(8, 8, 8, 8), r13.xyzw, r12.xyzw\n  ushr r11.xyzw, r11.xyzw, l(20, 20, 20, 20)\n  udiv r11.xyzw, null, r11.xyzw, l(3, 3, 3, 3)\n  or r11.xyzw, r11.xyzw, r12.xyzw\n  or r11.xyzw, r11.xyzw, l(0xff000000, 0xff000000, 0xff000000, 0xff000000)\n  movc r8.xyzw, r5.yyyy, r8.xyzw, r11.xyzw\n  store_raw U0[0].xyzw, r4.x, r8.xyzw\n  ushr r8.xyzw, r6.zzzz, l(2, 4, 6, 1)\n  mov r11.x, r6.z\n  mov r11.yzw, r8.xxyz\n  and r12.xyzw, r11.xyzw, l(1, 1, 1, 1)\n  ubfe r13.xyzw, l(1, 1, 1, 1), l(9, 11, 13, 15), r3.zzzz\n  imul null, r13.xyzw, r2.yyyy, r13.xyzw\n  imad r12.xyzw, r12.xyzw, r2.xxxx, r13.xyzw\n  and r13.x, r6.z, r8.w\n  and r14.x, r13.x, l(0x00555555)\n  ushr r13.yzw, r14.xxxx, l(0, 2, 4, 6)\n  and r15.xyzw, r13.xyzw, l(1, 1, 1, 1)\n  or r8.x, r6.z, r8.w\n  ubfe r15.xyzw, l(9, 9, 9, 9), r15.xyzw, r12.xyzw\n  ishl r15.xyzw, r15.xyzw, l(16, 16, 16, 16)\n  mov r14.yzw, r13.yyzw\n  bfi r13.xyzw, l(1, 1, 1, 1), l(0, 0, 0, 0), r14.xyzw, l(10, 10, 10, 10)\n  ubfe r13.xyzw, l(9, 9, 9, 9), r13.xyzw, r12.xyzw\n  ishl r13.xyzw, r13.xyzw, l(8, 8, 8, 8)\n  iadd r13.xyzw, r13.xyzw, r15.xyzw\n  bfi r14.xyzw, l(2, 2, 2, 2), l(0, 0, 0, 0), r14.xyzw, l(20, 20, 20, 20)\n  ushr r12.xyzw, r12.xyzw, r14.xyzw\n  iadd r12.xyzw, r12.xyzw, r13.xyzw\n  ushr r8.yzw, r8.xxxx, l(0, 2, 4, 6)\n  and r8.xyzw, r8.xyzw, l(1, 1, 1, 1)\n  imad r8.xyzw, r8.xyzw, l(0xff000000, 0xff000000, 0xff000000, 0xff000000), r12.xyzw\n  ushr r12.yzw, r10.wwww, l(0, 2, 4, 6)\n  mov r12.x, r10.w\n  and r12.xyzw, r12.xyzw, l(3, 3, 3, 3)\n  and r11.xyzw, r11.xyzw, l(3, 3, 3, 3)\n  imul null, r11.xyzw, r2.yyyy, r11.xyzw\n  imad r11.xyzw, r12.xyzw, r2.xxxx, r11.xyzw\n  and r12.xyzw, r11.xyzw, l(1023, 1023, 1023, 1023)\n  udiv r12.xyzw, null, r12.xyzw, l(3, 3, 3, 3)\n  ishl r12.xyzw, r12.xyzw, l(16, 16, 16, 16)\n  ubfe r13.xyzw, l(10, 10, 10, 10), l(10, 10, 10, 10), r11.xyzw\n  udiv r13.xyzw, null, r13.xyzw, l(3, 3, 3, 3)\n  bfi r12.xyzw, l(8, 8, 8, 8), l(8, 8, 8, 8), r13.xyzw, r12.xyzw\n  ushr r11.xyzw, r11.xyzw, l(20, 20, 20, 20)\n  udiv r11.xyzw, null, r11.xyzw, l(3, 3, 3, 3)\n  or r11.xyzw, r11.xyzw, r12.xyzw\n  or r11.xyzw, r11.xyzw, l(0xff000000, 0xff000000, 0xff000000, 0xff000000)\n  movc r8.xyzw, r5.zzzz, r8.xyzw, r11.xyzw\n  store_raw U0[0].xyzw, r4.z, r8.xyzw\n  ushr r8.xyzw, r6.wwww, l(2, 4, 6, 1)\n  mov r11.x, r6.w\n  mov r11.yzw, r8.xxyz\n  and r12.xyzw, r11.xyzw, l(1, 1, 1, 1)\n  ubfe r13.xyzw, l(1, 1, 1, 1), l(9, 11, 13, 15), r3.wwww\n  imul null, r13.xyzw, r2.wwww, r13.xyzw\n  imad r12.xyzw, r12.xyzw, r2.zzzz, r13.xyzw\n  and r13.x, r6.w, r8.w\n  and r14.x, r13.x, l(0x00555555)\n  ushr r13.yzw, r14.xxxx, l(0, 2, 4, 6)\n  and r15.xyzw, r13.xyzw, l(1, 1, 1, 1)\n  or r8.x, r6.w, r8.w\n  ubfe r15.xyzw, l(9, 9, 9, 9), r15.xyzw, r12.xyzw\n  ishl r15.xyzw, r15.xyzw, l(16, 16, 16, 16)\n  mov r14.yzw, r13.yyzw\n  bfi r13.xyzw, l(1, 1, 1, 1), l(0, 0, 0, 0), r14.xyzw, l(10, 10, 10, 10)\n  ubfe r13.xyzw, l(9, 9, 9, 9), r13.xyzw, r12.xyzw\n  ishl r13.xyzw, r13.xyzw, l(8, 8, 8, 8)\n  iadd r13.xyzw, r13.xyzw, r15.xyzw\n  bfi r14.xyzw, l(2, 2, 2, 2), l(0, 0, 0, 0), r14.xyzw, l(20, 20, 20, 20)\n  ushr r12.xyzw, r12.xyzw, r14.xyzw\n  iadd r12.xyzw, r12.xyzw, r13.xyzw\n  ushr r8.yzw, r8.xxxx, l(0, 2, 4, 6)\n  and r8.xyzw, r8.xyzw, l(1, 1, 1, 1)\n  imad r8.xyzw, r8.xyzw, l(0xff000000, 0xff000000, 0xff000000, 0xff000000), r12.xyzw\n  ushr r10.yzw, r10.xxxx, l(0, 2, 4, 6)\n  and r10.xyzw, r10.xyzw, l(3, 3, 3, 3)\n  and r11.xyzw, r11.xyzw, l(3, 3, 3, 3)\n  imul null, r11.xyzw, r2.wwww, r11.xyzw\n  imad r10.xyzw, r10.xyzw, r2.zzzz, r11.xyzw\n  and r11.xyzw, r10.xyzw, l(1023, 1023, 1023, 1023)\n  udiv r11.xyzw, null, r11.xyzw, l(3, 3, 3, 3)\n  ishl r11.xyzw, r11.xyzw, l(16, 16, 16, 16)\n  ubfe r12.xyzw, l(10, 10, 10, 10), l(10, 10, 10, 10), r10.xyzw\n  udiv r12.xyzw, null, r12.xyzw, l(3, 3, 3, 3)\n  bfi r11.xyzw, l(8, 8, 8, 8), l(8, 8, 8, 8), r12.xyzw, r11.xyzw\n  ushr r10.xyzw, r10.xyzw, l(20, 20, 20, 20)\n  udiv r10.xyzw, null, r10.xyzw, l(3, 3, 3, 3)\n  or r10.xyzw, r10.xyzw, r11.xyzw\n  or r10.xyzw, r10.xyzw, l(0xff000000, 0xff000000, 0xff000000, 0xff000000)\n  movc r8.xyzw, r5.wwww, r8.xyzw, r10.xyzw\n  store_raw U0[0].xyzw, r4.w, r8.xyzw\n  imad r0.x, vThreadID.y, l(4), l(2)\n  ult r0.x, r0.x, CB0[0][2].y\n  not r0.z, r0.x\n  if_nz r0.x\n    iadd r0.w, r0.w, CB0[0][2].x\n    ushr r3.xyzw, r6.xyzw, l(8, 8, 8, 8)\n  else \n    mov r3.x, r9.x\n    mov r3.yzw, r6.yyzw\n  endif \n  if_z r0.z\n    ushr r6.xyzw, r3.xxxx, l(2, 4, 6, 1)\n    mov r8.x, r3.x\n    mov r8.yzw, r6.xxyz\n    and r9.xyzw, r8.xyzw, l(1, 1, 1, 1)\n    ubfe r10.xyzw, l(1, 1, 1, 1), l(1, 3, 5, 7), r3.xxxx\n    imul null, r10.xyzw, r0.yyyy, r10.xyzw\n    imad r9.xyzw, r9.xyzw, r1.xxxx, r10.xyzw\n    and r10.x, r3.x, r6.w\n    and r11.x, r10.x, l(0x00555555)\n    ushr r10.yzw, r11.xxxx, l(0, 2, 4, 6)\n    and r12.xyzw, r10.xyzw, l(1, 1, 1, 1)\n    or r6.x, r3.x, r6.w\n    ubfe r12.xyzw, l(9, 9, 9, 9), r12.xyzw, r9.xyzw\n    ishl r12.xyzw, r12.xyzw, l(16, 16, 16, 16)\n    mov r11.yzw, r10.yyzw\n    bfi r10.xyzw, l(1, 1, 1, 1), l(0, 0, 0, 0), r11.xyzw, l(10, 10, 10, 10)\n    ubfe r10.xyzw, l(9, 9, 9, 9), r10.xyzw, r9.xyzw\n    ishl r10.xyzw, r10.xyzw, l(8, 8, 8, 8)\n    iadd r10.xyzw, r10.xyzw, r12.xyzw\n    bfi r11.xyzw, l(2, 2, 2, 2), l(0, 0, 0, 0), r11.xyzw, l(20, 20, 20, 20)\n    ushr r9.xyzw, r9.xyzw, r11.xyzw\n    iadd r9.xyzw, r9.xyzw, r10.xyzw\n    ushr r6.yzw, r6.xxxx, l(0, 2, 4, 6)\n    and r6.xyzw, r6.xyzw, l(1, 1, 1, 1)\n    imad r6.xyzw, r6.xyzw, l(0xff000000, 0xff000000, 0xff000000, 0xff000000), r9.xyzw\n    not r9.x, r3.x\n    ushr r9.yzw, r9.xxxx, l(0, 2, 4, 6)\n    and r9.xyzw, r9.xyzw, l(3, 3, 3, 3)\n    and r8.xyzw, r8.xyzw, l(3, 3, 3, 3)\n    imul null, r8.xyzw, r0.yyyy, r8.xyzw\n    imad r8.xyzw, r9.xyzw, r1.xxxx, r8.xyzw\n    and r9.xyzw, r8.xyzw, l(1023, 1023, 1023, 1023)\n    udiv r9.xyzw, null, r9.xyzw, l(3, 3, 3, 3)\n    ishl r9.xyzw, r9.xyzw, l(16, 16, 16, 16)\n    ubfe r10.xyzw, l(10, 10, 10, 10), l(10, 10, 10, 10), r8.xyzw\n    udiv r10.xyzw, null, r10.xyzw, l(3, 3, 3, 3)\n    bfi r9.xyzw, l(8, 8, 8, 8), l(8, 8, 8, 8), r10.xyzw, r9.xyzw\n    ushr r8.xyzw, r8.xyzw, l(20, 20, 20, 20)\n    udiv r8.xyzw, null, r8.xyzw, l(3, 3, 3, 3)\n    or r8.xyzw, r8.xyzw, r9.xyzw\n    or r8.xyzw, r8.xyzw, l(0xff000000, 0xff000000, 0xff000000, 0xff000000)\n    movc r6.xyzw, r5.xxxx, r6.xyzw, r8.xyzw\n    store_raw U0[0].xyzw, r0.w, r6.xyzw\n    iadd r4.xzw, r0.wwww, l(16, 0, 32, 48)\n    ushr r6.xyzw, r3.yyyy, l(2, 4, 6, 1)\n    mov r8.x, r3.y\n    mov r8.yzw, r6.xxyz\n    and r9.xyzw, r8.xyzw, l(1, 1, 1, 1)\n    ubfe r10.xyzw, l(1, 1, 1, 1), l(1, 3, 5, 7), r3.yyyy\n    imul null, r10.xyzw, r4.yyyy, r10.xyzw\n    imad r9.xyzw, r9.xyzw, r1.yyyy, r10.xyzw\n    and r10.x, r3.y, r6.w\n    and r11.x, r10.x, l(0x00555555)\n    ushr r10.yzw, r11.xxxx, l(0, 2, 4, 6)\n    and r12.xyzw, r10.xyzw, l(1, 1, 1, 1)\n    or r6.x, r3.y, r6.w\n    ubfe r12.xyzw, l(9, 9, 9, 9), r12.xyzw, r9.xyzw\n    ishl r12.xyzw, r12.xyzw, l(16, 16, 16, 16)\n    mov r11.yzw, r10.yyzw\n    bfi r10.xyzw, l(1, 1, 1, 1), l(0, 0, 0, 0), r11.xyzw, l(10, 10, 10, 10)\n    ubfe r10.xyzw, l(9, 9, 9, 9), r10.xyzw, r9.xyzw\n    ishl r10.xyzw, r10.xyzw, l(8, 8, 8, 8)\n    iadd r10.xyzw, r10.xyzw, r12.xyzw\n    bfi r11.xyzw, l(2, 2, 2, 2), l(0, 0, 0, 0), r11.xyzw, l(20, 20, 20, 20)\n    ushr r9.xyzw, r9.xyzw, r11.xyzw\n    iadd r9.xyzw, r9.xyzw, r10.xyzw\n    ushr r6.yzw, r6.xxxx, l(0, 2, 4, 6)\n    and r6.xyzw, r6.xyzw, l(1, 1, 1, 1)\n    imad r6.xyzw, r6.xyzw, l(0xff000000, 0xff000000, 0xff000000, 0xff000000), r9.xyzw\n    not r9.x, r3.y\n    ushr r9.yzw, r9.xxxx, l(0, 2, 4, 6)\n    and r9.xyzw, r9.xyzw, l(3, 3, 3, 3)\n    and r8.xyzw, r8.xyzw, l(3, 3, 3, 3)\n    imul null, r8.xyzw, r4.yyyy, r8.xyzw\n    imad r8.xyzw, r9.xyzw, r1.yyyy, r8.xyzw\n    and r9.xyzw, r8.xyzw, l(1023, 1023, 1023, 1023)\n    udiv r9.xyzw, null, r9.xyzw, l(3, 3, 3, 3)\n    ishl r9.xyzw, r9.xyzw, l(16, 16, 16, 16)\n    ubfe r10.xyzw, l(10, 10, 10, 10), l(10, 10, 10, 10), r8.xyzw\n    udiv r10.xyzw, null, r10.xyzw, l(3, 3, 3, 3)\n    bfi r9.xyzw, l(8, 8, 8, 8), l(8, 8, 8, 8), r10.xyzw, r9.xyzw\n    ushr r8.xyzw, r8.xyzw, l(20, 20, 20, 20)\n    udiv r8.xyzw, null, r8.xyzw, l(3, 3, 3, 3)\n    or r8.xyzw, r8.xyzw, r9.xyzw\n    or r8.xyzw, r8.xyzw, l(0xff000000, 0xff000000, 0xff000000, 0xff000000)\n    movc r6.xyzw, r5.yyyy, r6.xyzw, r8.xyzw\n    store_raw U0[0].xyzw, r4.x, r6.xyzw\n    ushr r6.xyzw, r3.zzzz, l(2, 4, 6, 1)\n    mov r8.x, r3.z\n    mov r8.yzw, r6.xxyz\n    and r9.xyzw, r8.xyzw, l(1, 1, 1, 1)\n    ubfe r10.xyzw, l(1, 1, 1, 1), l(1, 3, 5, 7), r3.zzzz\n    imul null, r10.xyzw, r2.yyyy, r10.xyzw\n    imad r9.xyzw, r9.xyzw, r2.xxxx, r10.xyzw\n    and r10.x, r3.z, r6.w\n    and r11.x, r10.x, l(0x00555555)\n    ushr r10.yzw, r11.xxxx, l(0, 2, 4, 6)\n    and r12.xyzw, r10.xyzw, l(1, 1, 1, 1)\n    or r6.x, r3.z, r6.w\n    ubfe r12.xyzw, l(9, 9, 9, 9), r12.xyzw, r9.xyzw\n    ishl r12.xyzw, r12.xyzw, l(16, 16, 16, 16)\n    mov r11.yzw, r10.yyzw\n    bfi r10.xyzw, l(1, 1, 1, 1), l(0, 0, 0, 0), r11.xyzw, l(10, 10, 10, 10)\n    ubfe r10.xyzw, l(9, 9, 9, 9), r10.xyzw, r9.xyzw\n    ishl r10.xyzw, r10.xyzw, l(8, 8, 8, 8)\n    iadd r10.xyzw, r10.xyzw, r12.xyzw\n    bfi r11.xyzw, l(2, 2, 2, 2), l(0, 0, 0, 0), r11.xyzw, l(20, 20, 20, 20)\n    ushr r9.xyzw, r9.xyzw, r11.xyzw\n    iadd r9.xyzw, r9.xyzw, r10.xyzw\n    ushr r6.yzw, r6.xxxx, l(0, 2, 4, 6)\n    and r6.xyzw, r6.xyzw, l(1, 1, 1, 1)\n    imad r6.xyzw, r6.xyzw, l(0xff000000, 0xff000000, 0xff000000, 0xff000000), r9.xyzw\n    not r9.x, r3.z\n    ushr r9.yzw, r9.xxxx, l(0, 2, 4, 6)\n    and r9.xyzw, r9.xyzw, l(3, 3, 3, 3)\n    and r8.xyzw, r8.xyzw, l(3, 3, 3, 3)\n    imul null, r8.xyzw, r2.yyyy, r8.xyzw\n    imad r8.xyzw, r9.xyzw, r2.xxxx, r8.xyzw\n    and r9.xyzw, r8.xyzw, l(1023, 1023, 1023, 1023)\n    udiv r9.xyzw, null, r9.xyzw, l(3, 3, 3, 3)\n    ishl r9.xyzw, r9.xyzw, l(16, 16, 16, 16)\n    ubfe r10.xyzw, l(10, 10, 10, 10), l(10, 10, 10, 10), r8.xyzw\n    udiv r10.xyzw, null, r10.xyzw, l(3, 3, 3, 3)\n    bfi r9.xyzw, l(8, 8, 8, 8), l(8, 8, 8, 8), r10.xyzw, r9.xyzw\n    ushr r8.xyzw, r8.xyzw, l(20, 20, 20, 20)\n    udiv r8.xyzw, null, r8.xyzw, l(3, 3, 3, 3)\n    or r8.xyzw, r8.xyzw, r9.xyzw\n    or r8.xyzw, r8.xyzw, l(0xff000000, 0xff000000, 0xff000000, 0xff000000)\n    movc r6.xyzw, r5.zzzz, r6.xyzw, r8.xyzw\n    store_raw U0[0].xyzw, r4.z, r6.xyzw\n    ushr r6.xyzw, r3.wwww, l(2, 4, 6, 1)\n    mov r8.x, r3.w\n    mov r8.yzw, r6.xxyz\n    and r9.xyzw, r8.xyzw, l(1, 1, 1, 1)\n    ubfe r10.xyzw, l(1, 1, 1, 1), l(1, 3, 5, 7), r3.wwww\n    imul null, r10.xyzw, r2.wwww, r10.xyzw\n    imad r9.xyzw, r9.xyzw, r2.zzzz, r10.xyzw\n    and r10.x, r3.w, r6.w\n    and r11.x, r10.x, l(0x00555555)\n    ushr r10.yzw, r11.xxxx, l(0, 2, 4, 6)\n    and r12.xyzw, r10.xyzw, l(1, 1, 1, 1)\n    or r6.x, r3.w, r6.w\n    ubfe r12.xyzw, l(9, 9, 9, 9), r12.xyzw, r9.xyzw\n    ishl r12.xyzw, r12.xyzw, l(16, 16, 16, 16)\n    mov r11.yzw, r10.yyzw\n    bfi r10.xyzw, l(1, 1, 1, 1), l(0, 0, 0, 0), r11.xyzw, l(10, 10, 10, 10)\n    ubfe r10.xyzw, l(9, 9, 9, 9), r10.xyzw, r9.xyzw\n    ishl r10.xyzw, r10.xyzw, l(8, 8, 8, 8)\n    iadd r10.xyzw, r10.xyzw, r12.xyzw\n    bfi r11.xyzw, l(2, 2, 2, 2), l(0, 0, 0, 0), r11.xyzw, l(20, 20, 20, 20)\n    ushr r9.xyzw, r9.xyzw, r11.xyzw\n    iadd r9.xyzw, r9.xyzw, r10.xyzw\n    ushr r6.yzw, r6.xxxx, l(0, 2, 4, 6)\n    and r6.xyzw, r6.xyzw, l(1, 1, 1, 1)\n    imad r6.xyzw, r6.xyzw, l(0xff000000, 0xff000000, 0xff000000, 0xff000000), r9.xyzw\n    not r9.x, r3.w\n    ushr r9.yzw, r9.xxxx, l(0, 2, 4, 6)\n    and r9.xyzw, r9.xyzw, l(3, 3, 3, 3)\n    and r8.xyzw, r8.xyzw, l(3, 3, 3, 3)\n    imul null, r8.xyzw, r2.wwww, r8.xyzw\n    imad r8.xyzw, r9.xyzw, r2.zzzz, r8.xyzw\n    and r9.xyzw, r8.xyzw, l(1023, 1023, 1023, 1023)\n    udiv r9.xyzw, null, r9.xyzw, l(3, 3, 3, 3)\n    ishl r9.xyzw, r9.xyzw, l(16, 16, 16, 16)\n    ubfe r10.xyzw, l(10, 10, 10, 10), l(10, 10, 10, 10), r8.xyzw\n    udiv r10.xyzw, null, r10.xyzw, l(3, 3, 3, 3)\n    bfi r9.xyzw, l(8, 8, 8, 8), l(8, 8, 8, 8), r10.xyzw, r9.xyzw\n    ushr r8.xyzw, r8.xyzw, l(20, 20, 20, 20)\n    udiv r8.xyzw, null, r8.xyzw, l(3, 3, 3, 3)\n    or r8.xyzw, r8.xyzw, r9.xyzw\n    or r8.xyzw, r8.xyzw, l(0xff000000, 0xff000000, 0xff000000, 0xff000000)\n    movc r6.xyzw, r5.wwww, r6.xyzw, r8.xyzw\n    store_raw U0[0].xyzw, r4.w, r6.xyzw\n  endif \nelse \n  mov r3.x, r7.x\n  mov r0.z, l(-1)\nendif \nif_z r0.z\n  imad r0.x, vThreadID.y, l(4), l(3)\n  ult r0.x, r0.x, CB0[0][2].y\n  if_nz r0.x\n    iadd r0.x, r0.w, CB0[0][2].x\n    ushr r6.xyzw, r3.wxyz, l(8, 8, 8, 8)\n    ushr r7.xyzw, r6.yyyy, l(2, 4, 6, 1)\n    mov r8.x, r6.y\n    mov r8.yzw, r7.xxyz\n    and r9.xyzw, r8.xyzw, l(1, 1, 1, 1)\n    ubfe r10.xyzw, l(1, 1, 1, 1), l(9, 11, 13, 15), r3.xxxx\n    imul null, r10.xyzw, r0.yyyy, r10.xyzw\n    imad r9.xyzw, r9.xyzw, r1.xxxx, r10.xyzw\n    and r10.x, r7.w, r8.x\n    and r11.x, r10.x, l(0x00555555)\n    ushr r10.yzw, r11.xxxx, l(0, 2, 4, 6)\n    and r12.xyzw, r10.xyzw, l(1, 1, 1, 1)\n    or r7.x, r7.w, r8.x\n    ubfe r12.xyzw, l(9, 9, 9, 9), r12.xyzw, r9.xyzw\n    ishl r12.xyzw, r12.xyzw, l(16, 16, 16, 16)\n    mov r11.yzw, r10.yyzw\n    bfi r10.xyzw, l(1, 1, 1, 1), l(0, 0, 0, 0), r11.xyzw, l(10, 10, 10, 10)\n    ubfe r10.xyzw, l(9, 9, 9, 9), r10.xyzw, r9.xyzw\n    ishl r10.xyzw, r10.xyzw, l(8, 8, 8, 8)\n    iadd r10.xyzw, r10.xyzw, r12.xyzw\n    bfi r11.xyzw, l(2, 2, 2, 2), l(0, 0, 0, 0), r11.xyzw, l(20, 20, 20, 20)\n    ushr r9.xyzw, r9.xyzw, r11.xyzw\n    iadd r9.xyzw, r9.xyzw, r10.xyzw\n    ushr r7.yzw, r7.xxxx, l(0, 2, 4, 6)\n    and r7.xyzw, r7.xyzw, l(1, 1, 1, 1)\n    imad r7.xyzw, r7.xyzw, l(0xff000000, 0xff000000, 0xff000000, 0xff000000), r9.xyzw\n    not r9.xyzw, r6.xyzw\n    ushr r10.yzw, r9.yyyy, l(0, 2, 4, 6)\n    mov r10.x, r9.y\n    and r10.xyzw, r10.xyzw, l(3, 3, 3, 3)\n    and r8.xyzw, r8.xyzw, l(3, 3, 3, 3)\n    imul null, r8.xyzw, r0.yyyy, r8.xyzw\n    imad r8.xyzw, r10.xyzw, r1.xxxx, r8.xyzw\n    and r10.xyzw, r8.xyzw, l(1023, 1023, 1023, 1023)\n    udiv r10.xyzw, null, r10.xyzw, l(3, 3, 3, 3)\n    ishl r10.xyzw, r10.xyzw, l(16, 16, 16, 16)\n    ubfe r11.xyzw, l(10, 10, 10, 10), l(10, 10, 10, 10), r8.xyzw\n    udiv r11.xyzw, null, r11.xyzw, l(3, 3, 3, 3)\n    bfi r10.xyzw, l(8, 8, 8, 8), l(8, 8, 8, 8), r11.xyzw, r10.xyzw\n    ushr r8.xyzw, r8.xyzw, l(20, 20, 20, 20)\n    udiv r8.xyzw, null, r8.xyzw, l(3, 3, 3, 3)\n    or r8.xyzw, r8.xyzw, r10.xyzw\n    or r8.xyzw, r8.xyzw, l(0xff000000, 0xff000000, 0xff000000, 0xff000000)\n    movc r7.xyzw, r5.xxxx, r7.xyzw, r8.xyzw\n    store_raw U0[0].xyzw, r0.x, r7.xyzw\n    iadd r0.yzw, r0.xxxx, l(0, 16, 32, 48)\n    ushr r7.xyzw, r6.zzzz, l(2, 4, 6, 1)\n    mov r8.x, r6.z\n    mov r8.yzw, r7.xxyz\n    and r10.xyzw, r8.xyzw, l(1, 1, 1, 1)\n    ubfe r11.xyzw, l(1, 1, 1, 1), l(9, 11, 13, 15), r3.yyyy\n    imul null, r11.xyzw, r4.yyyy, r11.xyzw\n    imad r10.xyzw, r10.xyzw, r1.yyyy, r11.xyzw\n    and r11.x, r6.z, r7.w\n    and r12.x, r11.x, l(0x00555555)\n    ushr r11.yzw, r12.xxxx, l(0, 2, 4, 6)\n    and r13.xyzw, r11.xyzw, l(1, 1, 1, 1)\n    or r7.x, r6.z, r7.w\n    ubfe r13.xyzw, l(9, 9, 9, 9), r13.xyzw, r10.xyzw\n    ishl r13.xyzw, r13.xyzw, l(16, 16, 16, 16)\n    mov r12.yzw, r11.yyzw\n    bfi r11.xyzw, l(1, 1, 1, 1), l(0, 0, 0, 0), r12.xyzw, l(10, 10, 10, 10)\n    ubfe r11.xyzw, l(9, 9, 9, 9), r11.xyzw, r10.xyzw\n    ishl r11.xyzw, r11.xyzw, l(8, 8, 8, 8)\n    iadd r11.xyzw, r11.xyzw, r13.xyzw\n    bfi r12.xyzw, l(2, 2, 2, 2), l(0, 0, 0, 0), r12.xyzw, l(20, 20, 20, 20)\n    ushr r10.xyzw, r10.xyzw, r12.xyzw\n    iadd r10.xyzw, r10.xyzw, r11.xyzw\n    ushr r7.yzw, r7.xxxx, l(0, 2, 4, 6)\n    and r7.xyzw, r7.xyzw, l(1, 1, 1, 1)\n    imad r7.xyzw, r7.xyzw, l(0xff000000, 0xff000000, 0xff000000, 0xff000000), r10.xyzw\n    ushr r10.yzw, r9.zzzz, l(0, 2, 4, 6)\n    mov r10.x, r9.z\n    and r10.xyzw, r10.xyzw, l(3, 3, 3, 3)\n    and r8.xyzw, r8.xyzw, l(3, 3, 3, 3)\n    imul null, r4.xyzw, r4.yyyy, r8.xyzw\n    imad r1.xyzw, r10.xyzw, r1.yyyy, r4.xyzw\n    and r4.xyzw, r1.xyzw, l(1023, 1023, 1023, 1023)\n    udiv r4.xyzw, null, r4.xyzw, l(3, 3, 3, 3)\n    ishl r4.xyzw, r4.xyzw, l(16, 16, 16, 16)\n    ubfe r8.xyzw, l(10, 10, 10, 10), l(10, 10, 10, 10), r1.xyzw\n    udiv r8.xyzw, null, r8.xyzw, l(3, 3, 3, 3)\n    bfi r4.xyzw, l(8, 8, 8, 8), l(8, 8, 8, 8), r8.xyzw, r4.xyzw\n    ushr r1.xyzw, r1.xyzw, l(20, 20, 20, 20)\n    udiv r1.xyzw, null, r1.xyzw, l(3, 3, 3, 3)\n    or r1.xyzw, r1.xyzw, r4.xyzw\n    or r1.xyzw, r1.xyzw, l(0xff000000, 0xff000000, 0xff000000, 0xff000000)\n    movc r1.xyzw, r5.yyyy, r7.xyzw, r1.xyzw\n    store_raw U0[0].xyzw, r0.y, r1.xyzw\n    ushr r1.xyzw, r6.wwww, l(2, 4, 6, 1)\n    mov r4.x, r6.w\n    mov r4.yzw, r1.xxyz\n    and r7.xyzw, r4.xyzw, l(1, 1, 1, 1)\n    ubfe r8.xyzw, l(1, 1, 1, 1), l(9, 11, 13, 15), r3.zzzz\n    imul null, r8.xyzw, r2.yyyy, r8.xyzw\n    imad r7.xyzw, r7.xyzw, r2.xxxx, r8.xyzw\n    and r8.x, r6.w, r1.w\n    and r10.x, r8.x, l(0x00555555)\n    ushr r8.yzw, r10.xxxx, l(0, 2, 4, 6)\n    and r11.xyzw, r8.xyzw, l(1, 1, 1, 1)\n    or r1.x, r1.w, r6.w\n    ubfe r11.xyzw, l(9, 9, 9, 9), r11.xyzw, r7.xyzw\n    ishl r11.xyzw, r11.xyzw, l(16, 16, 16, 16)\n    mov r10.yzw, r8.yyzw\n    bfi r8.xyzw, l(1, 1, 1, 1), l(0, 0, 0, 0), r10.xyzw, l(10, 10, 10, 10)\n    ubfe r8.xyzw, l(9, 9, 9, 9), r8.xyzw, r7.xyzw\n    ishl r8.xyzw, r8.xyzw, l(8, 8, 8, 8)\n    iadd r8.xyzw, r8.xyzw, r11.xyzw\n    bfi r10.xyzw, l(2, 2, 2, 2), l(0, 0, 0, 0), r10.xyzw, l(20, 20, 20, 20)\n    ushr r7.xyzw, r7.xyzw, r10.xyzw\n    iadd r7.xyzw, r7.xyzw, r8.xyzw\n    ushr r1.yzw, r1.xxxx, l(0, 2, 4, 6)\n    and r1.xyzw, r1.xyzw, l(1, 1, 1, 1)\n    imad r1.xyzw, r1.xyzw, l(0xff000000, 0xff000000, 0xff000000, 0xff000000), r7.xyzw\n    ushr r7.yzw, r9.wwww, l(0, 2, 4, 6)\n    mov r7.x, r9.w\n    and r7.xyzw, r7.xyzw, l(3, 3, 3, 3)\n    and r4.xyzw, r4.xyzw, l(3, 3, 3, 3)\n    imul null, r4.xyzw, r2.yyyy, r4.xyzw\n    imad r4.xyzw, r7.xyzw, r2.xxxx, r4.xyzw\n    and r7.xyzw, r4.xyzw, l(1023, 1023, 1023, 1023)\n    udiv r7.xyzw, null, r7.xyzw, l(3, 3, 3, 3)\n    ishl r7.xyzw, r7.xyzw, l(16, 16, 16, 16)\n    ubfe r8.xyzw, l(10, 10, 10, 10), l(10, 10, 10, 10), r4.xyzw\n    udiv r8.xyzw, null, r8.xyzw, l(3, 3, 3, 3)\n    bfi r7.xyzw, l(8, 8, 8, 8), l(8, 8, 8, 8), r8.xyzw, r7.xyzw\n    ushr r4.xyzw, r4.xyzw, l(20, 20, 20, 20)\n    udiv r4.xyzw, null, r4.xyzw, l(3, 3, 3, 3)\n    or r4.xyzw, r4.xyzw, r7.xyzw\n    or r4.xyzw, r4.xyzw, l(0xff000000, 0xff000000, 0xff000000, 0xff000000)\n    movc r1.xyzw, r5.zzzz, r1.xyzw, r4.xyzw\n    store_raw U0[0].xyzw, r0.z, r1.xyzw\n    ushr r1.xyzw, r6.xxxx, l(2, 4, 6, 1)\n    mov r6.yzw, r1.xxyz\n    and r4.xyzw, r6.xyzw, l(1, 1, 1, 1)\n    ubfe r3.xyzw, l(1, 1, 1, 1), l(9, 11, 13, 15), r3.wwww\n    imul null, r3.xyzw, r2.wwww, r3.xyzw\n    imad r3.xyzw, r4.xyzw, r2.zzzz, r3.xyzw\n    and r4.x, r6.x, r1.w\n    and r7.x, r4.x, l(0x00555555)\n    ushr r4.yzw, r7.xxxx, l(0, 2, 4, 6)\n    and r8.xyzw, r4.xyzw, l(1, 1, 1, 1)\n    or r1.x, r1.w, r6.x\n    ubfe r8.xyzw, l(9, 9, 9, 9), r8.xyzw, r3.xyzw\n    ishl r8.xyzw, r8.xyzw, l(16, 16, 16, 16)\n    mov r7.yzw, r4.yyzw\n    bfi r4.xyzw, l(1, 1, 1, 1), l(0, 0, 0, 0), r7.xyzw, l(10, 10, 10, 10)\n    ubfe r4.xyzw, l(9, 9, 9, 9), r4.xyzw, r3.xyzw\n    ishl r4.xyzw, r4.xyzw, l(8, 8, 8, 8)\n    iadd r4.xyzw, r4.xyzw, r8.xyzw\n    bfi r7.xyzw, l(2, 2, 2, 2), l(0, 0, 0, 0), r7.xyzw, l(20, 20, 20, 20)\n    ushr r3.xyzw, r3.xyzw, r7.xyzw\n    iadd r3.xyzw, r3.xyzw, r4.xyzw\n    ushr r1.yzw, r1.xxxx, l(0, 2, 4, 6)\n    and r1.xyzw, r1.xyzw, l(1, 1, 1, 1)\n    imad r1.xyzw, r1.xyzw, l(0xff000000, 0xff000000, 0xff000000, 0xff000000), r3.xyzw\n    ushr r9.yzw, r9.xxxx, l(0, 2, 4, 6)\n    and r3.xyzw, r9.xyzw, l(3, 3, 3, 3)\n    and r4.xyzw, r6.xyzw, l(3, 3, 3, 3)\n    imul null, r4.xyzw, r2.wwww, r4.xyzw\n    imad r2.xyzw, r3.xyzw, r2.zzzz, r4.xyzw\n    and r3.xyzw, r2.xyzw, l(1023, 1023, 1023, 1023)\n    udiv r3.xyzw, null, r3.xyzw, l(3, 3, 3, 3)\n    ishl r3.xyzw, r3.xyzw, l(16, 16, 16, 16)\n    ubfe r4.xyzw, l(10, 10, 10, 10), l(10, 10, 10, 10), r2.xyzw\n    udiv r4.xyzw, null, r4.xyzw, l(3, 3, 3, 3)\n    bfi r3.xyzw, l(8, 8, 8, 8), l(8, 8, 8, 8), r4.xyzw, r3.xyzw\n    ushr r2.xyzw, r2.xyzw, l(20, 20, 20, 20)\n    udiv r2.xyzw, null, r2.xyzw, l(3, 3, 3, 3)\n    or r2.xyzw, r2.xyzw, r3.xyzw\n    or r2.xyzw, r2.xyzw, l(0xff000000, 0xff000000, 0xff000000, 0xff000000)\n    movc r1.xyzw, r5.wwww, r1.xyzw, r2.xyzw\n    store_raw U0[0].xyzw, r0.w, r1.xyzw\n  endif \nendif \nret \n// Approximately 896 instruction slots used\n#endif\n\nconst BYTE texture_load_dxt1_rgba8_cs[] =\n{\n     68,  88,  66,  67,  14,  49, \n     42,  98,  28, 249,  85, 148, \n    254, 248,  77,  41, 218, 170, \n    149, 191,   1,   0,   0,   0, \n    192, 136,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n     36, 136,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n    232, 131,   0,   0,  81,   0, \n      5,   0, 250,  32,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,  16,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  12,  50,   0,  16,   0, \n      0,   0,   0,   0,   6, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n    194,   0,  16,   0,   0,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0,   6, 132, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  11, \n     66,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10,  98,   0,  16,   0, \n      1,   0,   0,   0,   6,   1, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,   7, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     35,   0,   0,  10,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,   2,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  35,   0, \n      0,  11, 130,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     30,   0,   0,   9, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  58, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     31,   0,   0,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  42,   0, \n      2,   0,  26,   0,   2,   0, \n     35,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     42, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  41,   0,   0,   7, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     18,   0,   0,   1,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  12, 194,   0,  16,   0, \n      1,   0,   0,   0, 166, 142, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   5,   0,   0,   0, \n      4,   0,   0,   0,  42,   0, \n      0,   9, 242,   0,  16,   0, \n      2,   0,   0,   0, 102,   5, \n      2,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   1,   0,   0,   0, \n      3,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0, 139,   0, \n      0,   8, 130,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  27,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  10,   0,   2,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  19, 194,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   5,   0,   0,   0, \n      4,   0,   0,   0, 166,   6, \n      2,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  11,  66,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  25,   0, \n      0,   0,   1,  64,   0,   0, \n      7,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  87,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n    138,   0,   0,   9,  18,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  20,  98,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0, 166,  10, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,   9,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     64,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 139,   0, \n      0,  15,  50,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  27,   0,   0,   0, \n     24,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  86,   5,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   8,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  20,   0, \n      0,   0,   1,  64,   0,   0, \n     12,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  18,   0,   0,   1, \n     85,   0,   0,   9,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     42, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   5,   0,   0,   0, \n     42,   0,   0,   9, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     86,   5,   2,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n      1,   0,   0,   0,   4,   0, \n      0,   0,   3,   0,   0,   0, \n    139,   0,   0,   8,  66,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  27,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  10,   0, \n      2,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  20, \n    114,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,  11,   0, \n      0,   0,   0,   0,   0,   0, \n    214,   6,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  66,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  26,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0, 138,   0,   0,   9, \n     18,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  87,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  10,  66,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  26,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  64,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 139,   0,   0,  15, \n    194,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  27,   0,   0,   0, \n     24,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   5,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  21,   0, \n      0,   1,  30,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  32,   0, \n      0,  10, 114,   0,  16,   0, \n      2,   0,   0,   0, 166,  10, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   2,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   2,   0, \n      0,   0, 150,   5,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,  85,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     54,   0,   0,   5,  50,   0, \n     16,   0,   3,   0,   0,   0, \n    214,   5,  16,   0,   1,   0, \n      0,   0,  18,   0,   0,   1, \n     54,   0,   0,   5,  50,   0, \n     16,   0,   3,   0,   0,   0, \n    214,   5,  16,   0,   1,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  32,   0, \n      0,   0,  18,   0,   0,   1, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0,  21,   0,   0,   1, \n     30,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      4,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,  85,   0,   0,  10, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     54,   0,   0,   5, 194,   0, \n     16,   0,   3,   0,   0,   0, \n     86,  13,  16,   0,   4,   0, \n      0,   0,  18,   0,   0,   1, \n     54,   0,   0,   5, 194,   0, \n     16,   0,   3,   0,   0,   0, \n     86,  13,  16,   0,   4,   0, \n      0,   0,  21,   0,   0,   1, \n     41,   0,   0,  10, 114,   0, \n     16,   0,   2,   0,   0,   0, \n      6,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   7,   0, \n      0,   0,  12,   0,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10, 114,   0,  16,   0, \n      5,   0,   0,   0,   6,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  13,   0, \n      0,   0,   4,   0,   0,   0, \n      9,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n    130,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      5,   0,   0,   0,   1,   0, \n      0,  10,  50,   0,  16,   0, \n      0,   0,   0,   0, 198,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0, 248,   0, \n      0,   0, 248,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n    146,   0,  16,   0,   5,   0, \n      0,   0, 166,   6,  16,   0, \n      2,   0,   0,   0,   1,   0, \n      0,  10,  50,   0,  16,   0, \n      1,   0,   0,   0, 182,  15, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0, 240, \n      3,   0,   0, 240,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n      1,   0,   0,  10,  50,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128,  15,   0,   0, \n    128,  15,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  50,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10,  50,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0, 112,   0,   7,   0, \n    112,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  50,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   6,   0,   0,   0, \n      6,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10,  50,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,  12,   0,   0,   0,  12, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  50,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,   2,   0, \n      0,   0, 166,  10,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      7,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n     85,   0,   0,  10, 114,   0, \n     16,   0,   1,   0,   0,   0, \n    166,  10,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     13,   0,   0,   0,   4,   0, \n      0,   0,   9,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5, 130,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,   0,   0,  10, 146,   0, \n     16,   0,   2,   0,   0,   0, \n      6,  12,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n    248,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    248,   0,   0,   0,  54,   0, \n      0,   5, 146,   0,  16,   0, \n      1,   0,   0,   0, 166,   6, \n     16,   0,   2,   0,   0,   0, \n      1,   0,   0,  10, 194,   0, \n     16,   0,   1,   0,   0,   0, \n    246,  11,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0, 240,   3,   0, \n      0, 240,   3,   0,  30,   0, \n      0,   7, 194,   0,  16,   0, \n      1,   0,   0,   0, 166,  14, \n     16,   0,   1,   0,   0,   0, \n      6,  12,  16,   0,   2,   0, \n      0,   0,   1,   0,   0,  10, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128,  15, \n      0,   0, 128,  15,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0, 230,  10,  16,   0, \n      1,   0,   0,   0,  85,   0, \n      0,  10, 194,   0,  16,   0, \n      1,   0,   0,   0,   6,   4, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,   1,   0,   0,  10, \n    194,   0,  16,   0,   1,   0, \n      0,   0, 166,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   7,   0, \n    112,   0,   7,   0, 112,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,   1,   0,   0,   0, \n    230,  10,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,  85,   0, \n      0,  10, 194,   0,  16,   0, \n      1,   0,   0,   0,   6,   4, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      6,   0,   0,   0,   6,   0, \n      0,   0,   1,   0,   0,  10, \n    194,   0,  16,   0,   1,   0, \n      0,   0, 166,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,  12, \n      0,   0,   0,  12,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,   1,   0,   0,   0, \n    182,  15,  16,   0,   1,   0, \n      0,   0,  22,   5,  16,   0, \n      1,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n      2,   0,   0,   0,   6,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   7,   0,   0,   0, \n     12,   0,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n    114,   0,  16,   0,   5,   0, \n      0,   0,   6,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,  13,   0,   0,   0, \n      4,   0,   0,   0,   9,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   5,   0, \n      0,   0,   1,   0,   0,  10, \n    146,   0,  16,   0,   2,   0, \n      0,   0,   6,  12,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0, 248,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 248,   0,   0,   0, \n     54,   0,   0,   5, 146,   0, \n     16,   0,   5,   0,   0,   0, \n    166,   6,  16,   0,   2,   0, \n      0,   0,   1,   0,   0,  10, \n     50,   0,  16,   0,   4,   0, \n      0,   0, 182,  15,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   0, 240,   3,   0, \n      0, 240,   3,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,   2,   0,   0,   0, \n    198,   0,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      4,   0,   0,   0,   1,   0, \n      0,  10, 194,   0,  16,   0, \n      2,   0,   0,   0,   6,   4, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 128,  15,   0,   0, \n    128,  15,  30,   0,   0,   7, \n     50,   0,  16,   0,   2,   0, \n      0,   0, 230,  10,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     85,   0,   0,  10, 194,   0, \n     16,   0,   2,   0,   0,   0, \n      6,   4,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,   1,   0, \n      0,  10, 194,   0,  16,   0, \n      2,   0,   0,   0, 166,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      7,   0, 112,   0,   7,   0, \n    112,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   2,   0, \n      0,   0, 230,  10,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     85,   0,   0,  10, 194,   0, \n     16,   0,   2,   0,   0,   0, \n      6,   4,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   6,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,  10, 194,   0,  16,   0, \n      2,   0,   0,   0, 166,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,  12,   0,   0,   0,  12, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   2,   0, \n      0,   0, 230,  10,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,   5,   0,   0,   0, \n    166,  10,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   7,   0, \n      0,   0,  12,   0,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10, 114,   0,  16,   0, \n      4,   0,   0,   0, 166,  10, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,  13,   0, \n      0,   0,   4,   0,   0,   0, \n      9,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n    130,   0,  16,   0,   5,   0, \n      0,   0,  10,   0,  16,   0, \n      4,   0,   0,   0,   1,   0, \n      0,  10, 194,   0,  16,   0, \n      2,   0,   0,   0,   6,  12, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    248,   0,   0,   0, 248,   0, \n      0,   0,  54,   0,   0,   5, \n    146,   0,  16,   0,   4,   0, \n      0,   0, 166,   6,  16,   0, \n      5,   0,   0,   0,   1,   0, \n      0,  10, 194,   0,  16,   0, \n      4,   0,   0,   0, 246,  11, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0, 240,   3,   0,   0, 240, \n      3,   0,  30,   0,   0,   7, \n    194,   0,  16,   0,   2,   0, \n      0,   0, 166,  14,  16,   0, \n      2,   0,   0,   0, 166,  14, \n     16,   0,   4,   0,   0,   0, \n      1,   0,   0,  10,  50,   0, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128,  15,   0,   0, \n    128,  15,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 194,   0,  16,   0, \n      2,   0,   0,   0, 166,  14, \n     16,   0,   2,   0,   0,   0, \n      6,   4,  16,   0,   4,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   4,   0, \n      0,   0, 230,  10,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10,  50,   0, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0, 112,   0,   7,   0, \n    112,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 194,   0,  16,   0, \n      2,   0,   0,   0, 166,  14, \n     16,   0,   2,   0,   0,   0, \n      6,   4,  16,   0,   4,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   4,   0, \n      0,   0, 230,  10,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   6,   0,   0,   0, \n      6,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10,  50,   0, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,  12,   0,   0,   0,  12, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 194,   0,  16,   0, \n      2,   0,   0,   0, 166,  14, \n     16,   0,   2,   0,   0,   0, \n      6,   4,  16,   0,   4,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   4,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  34,   0,  16,   0, \n      4,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     54,   0,   0,   5, 194,   0, \n     16,   0,   4,   0,   0,   0, \n     86,  13,  16,   0,   2,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5, 194,   0,  16,   0, \n      1,   0,   0,   0,   6,   8, \n     16,   0,   2,   0,   0,   0, \n     80,   0,   0,   7, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  59,   0, \n      0,   5, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0, 170, 170, \n    170, 170, 170, 170, 170, 170, \n    170, 170, 170, 170, 170, 170, \n    170, 170,  87,   0,   0,   7, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0, 170, 170, \n    170, 170, 170, 170, 170, 170, \n    170, 170, 170, 170, 170, 170, \n    170, 170,  85,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n     85,  85,  85,  85,  85,  85, \n     85,  85,  85,  85,  85,  85, \n     85,  85,  85,  85,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n     85,  85,  85,  85,  85,  85, \n     85,  85,  85,  85,  85,  85, \n     85,  85,  85,  85,  87,   0, \n      0,   7, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  55,   0,   0,   9, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   6,   0, \n      0,   0,   6,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n      4,   0,   0,   0,   6,   0, \n      0,   0,   1,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   7,   0,   0,   0, \n     10,   0,  16,   0,   3,   0, \n      0,   0,  54,   0,   0,   5, \n    226,   0,  16,   0,   7,   0, \n      0,   0,   6,   9,  16,   0, \n      6,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      3,   0,   0,   0,   5,   0, \n      0,   0,   7,   0,   0,   0, \n      6,   0,  16,   0,   7,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,  35,   0, \n      0,   9, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      6,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,   1,   0, \n      0,   7,  18,   0,  16,   0, \n      9,   0,   0,   0,  58,   0, \n     16,   0,   6,   0,   0,   0, \n     10,   0,  16,   0,   7,   0, \n      0,   0,   1,   0,   0,   7, \n     18,   0,  16,   0,  10,   0, \n      0,   0,  10,   0,  16,   0, \n      9,   0,   0,   0,   1,  64, \n      0,   0,  85,  85,  85,  85, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   9,   0,   0,   0, \n      6,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     18,   0,  16,   0,   6,   0, \n      0,   0,  58,   0,  16,   0, \n      6,   0,   0,   0,  10,   0, \n     16,   0,   7,   0,   0,   0, \n    138,   0,   0,  12, 242,   0, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   9,   0, \n      0,   0,   9,   0,   0,   0, \n      9,   0,   0,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  54,   0, \n      0,   5, 226,   0,  16,   0, \n     10,   0,   0,   0,  86,  14, \n     16,   0,   9,   0,   0,   0, \n    140,   0,   0,  20, 242,   0, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0, 138,   0,   0,  12, \n    242,   0,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n      9,   0,   0,   0,   9,   0, \n      0,   0,   9,   0,   0,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     85,   0,   0,   7, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,   6,   0, \n      0,   0,   6,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,  35,   0, \n      0,  12, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0, 255,   0,   0,   0, 255, \n      0,   0,   0, 255,   0,   0, \n      0, 255,  70,  14,  16,   0, \n      8,   0,   0,   0,  59,   0, \n      0,   5, 242,   0,  16,   0, \n      8,   0,   0,   0,  54,   9, \n     16,   0,   3,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   9,   0,   0,   0, \n     86,   5,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      6,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      9,   0,   0,   0,  26,   0, \n     16,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  35,   0, \n      0,   9, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n      6,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,  78,   0,   0,  11, \n    242,   0,  16,   0,  10,   0, \n      0,   0,   0, 208,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,  78,   0,   0,  11, \n    242,   0,  16,   0,  11,   0, \n      0,   0,   0, 208,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n      9,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   7, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  60,   0, \n      0,  10, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0, 255,   0,   0,   0, 255, \n      0,   0,   0, 255,   0,   0, \n      0, 255,  55,   0,   0,   9, \n    242,   0,  16,   0,   6,   0, \n      0,   0,   6,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  30,   0, \n      0,  10, 210,   0,  16,   0, \n      4,   0,   0,   0, 246,  15, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     32,   0,   0,   0,  48,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  86,   5,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n      4,   0,   0,   0,   6,   0, \n      0,   0,   1,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   9,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,  54,   0,   0,   5, \n    226,   0,  16,   0,   9,   0, \n      0,   0,   6,   9,  16,   0, \n      6,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      3,   0,   0,   0,   5,   0, \n      0,   0,   7,   0,   0,   0, \n     86,   5,  16,   0,   3,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     86,   5,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  35,   0, \n      0,   9, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,   1,   0, \n      0,   7,  18,   0,  16,   0, \n     11,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n     58,   0,  16,   0,   6,   0, \n      0,   0,   1,   0,   0,   7, \n     18,   0,  16,   0,  12,   0, \n      0,   0,  10,   0,  16,   0, \n     11,   0,   0,   0,   1,  64, \n      0,   0,  85,  85,  85,  85, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  11,   0,   0,   0, \n      6,   0,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     18,   0,  16,   0,   6,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,  58,   0, \n     16,   0,   6,   0,   0,   0, \n    138,   0,   0,  12, 242,   0, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   9,   0, \n      0,   0,   9,   0,   0,   0, \n      9,   0,   0,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  54,   0, \n      0,   5, 226,   0,  16,   0, \n     12,   0,   0,   0,  86,  14, \n     16,   0,  11,   0,   0,   0, \n    140,   0,   0,  20, 242,   0, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0, 138,   0,   0,  12, \n    242,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      9,   0,   0,   0,   9,   0, \n      0,   0,   9,   0,   0,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     85,   0,   0,   7, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,   6,   0, \n      0,   0,   6,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,  35,   0, \n      0,  12, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0, 255,   0,   0,   0, 255, \n      0,   0,   0, 255,   0,   0, \n      0, 255,  70,  14,  16,   0, \n     10,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     10,   0,   0,   0, 166,  10, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      4,   0,   0,   0,   6,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  10,   0, \n      0,   0,  42,   0,  16,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0, 242,   0,  16,   0, \n      9,   0,   0,   0,  86,   5, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,  35,   0,   0,   9, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n     78,   0,   0,  11, 242,   0, \n     16,   0,  10,   0,   0,   0, \n      0, 208,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n     78,   0,   0,  11, 242,   0, \n     16,   0,  11,   0,   0,   0, \n      0, 208,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  78,   0,   0,  11, \n    242,   0,  16,   0,   9,   0, \n      0,   0,   0, 208,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  60,   0, \n      0,   7, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  60,   0,   0,  10, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0, 255, \n      0,   0,   0, 255,   0,   0, \n      0, 255,   0,   0,   0, 255, \n     55,   0,   0,   9, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     86,   5,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   6,   0, \n      0,   0, 166,  10,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n      4,   0,   0,   0,   6,   0, \n      0,   0,   1,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   9,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0,  54,   0,   0,   5, \n    226,   0,  16,   0,   9,   0, \n      0,   0,   6,   9,  16,   0, \n      6,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      3,   0,   0,   0,   5,   0, \n      0,   0,   7,   0,   0,   0, \n    166,  10,  16,   0,   3,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     86,   5,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  35,   0, \n      0,   9, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      6,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,   1,   0, \n      0,   7,  18,   0,  16,   0, \n     11,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n     58,   0,  16,   0,   6,   0, \n      0,   0,   1,   0,   0,   7, \n     18,   0,  16,   0,  12,   0, \n      0,   0,  10,   0,  16,   0, \n     11,   0,   0,   0,   1,  64, \n      0,   0,  85,  85,  85,  85, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  11,   0,   0,   0, \n      6,   0,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     18,   0,  16,   0,   6,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0,  58,   0, \n     16,   0,   6,   0,   0,   0, \n    138,   0,   0,  12, 242,   0, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   9,   0, \n      0,   0,   9,   0,   0,   0, \n      9,   0,   0,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  54,   0, \n      0,   5, 226,   0,  16,   0, \n     12,   0,   0,   0,  86,  14, \n     16,   0,  11,   0,   0,   0, \n    140,   0,   0,  20, 242,   0, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0, 138,   0,   0,  12, \n    242,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      9,   0,   0,   0,   9,   0, \n      0,   0,   9,   0,   0,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     85,   0,   0,   7, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,   6,   0, \n      0,   0,   6,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,  35,   0, \n      0,  12, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0, 255,   0,   0,   0, 255, \n      0,   0,   0, 255,   0,   0, \n      0, 255,  70,  14,  16,   0, \n     10,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     10,   0,   0,   0, 246,  15, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      4,   0,   0,   0,   6,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  10,   0, \n      0,   0,  58,   0,  16,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0, 242,   0,  16,   0, \n      9,   0,   0,   0,  86,   5, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,  35,   0,   0,   9, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   6,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n     78,   0,   0,  11, 242,   0, \n     16,   0,  10,   0,   0,   0, \n      0, 208,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n     78,   0,   0,  11, 242,   0, \n     16,   0,  11,   0,   0,   0, \n      0, 208,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  78,   0,   0,  11, \n    242,   0,  16,   0,   9,   0, \n      0,   0,   0, 208,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  60,   0, \n      0,   7, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  60,   0,   0,  10, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0, 255, \n      0,   0,   0, 255,   0,   0, \n      0, 255,   0,   0,   0, 255, \n     55,   0,   0,   9, 242,   0, \n     16,   0,   6,   0,   0,   0, \n    166,  10,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   6,   0, \n      0,   0, 246,  15,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n      4,   0,   0,   0,   6,   0, \n      0,   0,   1,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   9,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,  54,   0,   0,   5, \n    226,   0,  16,   0,   9,   0, \n      0,   0,   6,   9,  16,   0, \n      6,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      3,   0,   0,   0,   5,   0, \n      0,   0,   7,   0,   0,   0, \n    246,  15,  16,   0,   3,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 242,   0, \n     16,   0,  11,   0,   0,   0, \n    246,  15,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  35,   0, \n      0,   9, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n    166,  10,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,   1,   0, \n      0,   7,  18,   0,  16,   0, \n     11,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n     58,   0,  16,   0,   6,   0, \n      0,   0,   1,   0,   0,   7, \n     18,   0,  16,   0,  12,   0, \n      0,   0,  10,   0,  16,   0, \n     11,   0,   0,   0,   1,  64, \n      0,   0,  85,  85,  85,  85, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  11,   0,   0,   0, \n      6,   0,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     18,   0,  16,   0,   6,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,  58,   0, \n     16,   0,   6,   0,   0,   0, \n    138,   0,   0,  12, 242,   0, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   9,   0, \n      0,   0,   9,   0,   0,   0, \n      9,   0,   0,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  54,   0, \n      0,   5, 226,   0,  16,   0, \n     12,   0,   0,   0,  86,  14, \n     16,   0,  11,   0,   0,   0, \n    140,   0,   0,  20, 242,   0, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0, 138,   0,   0,  12, \n    242,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      9,   0,   0,   0,   9,   0, \n      0,   0,   9,   0,   0,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     85,   0,   0,   7, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,   6,   0, \n      0,   0,   6,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,  35,   0, \n      0,  12, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0, 255,   0,   0,   0, 255, \n      0,   0,   0, 255,   0,   0, \n      0, 255,  70,  14,  16,   0, \n     10,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      8,   0,   0,   0,   6,   0, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      4,   0,   0,   0,   6,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n    242,   0,  16,   0,   9,   0, \n      0,   0, 246,  15,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n     35,   0,   0,   9, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0, 166,  10,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n      9,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n     10,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     78,   0,   0,  11, 242,   0, \n     16,   0,   8,   0,   0,   0, \n      0, 208,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  60,   0,   0,   7, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n     60,   0,   0,  10, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0, 255,   0,   0, \n      0, 255,   0,   0,   0, 255, \n      0,   0,   0, 255,  55,   0, \n      0,   9, 242,   0,  16,   0, \n      6,   0,   0,   0, 246,  15, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     35,   0,   0,   8,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,   2,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  79,   0,   0,   9, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  30,   0,   0,   9, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   8,   0,   0,   0, \n      6,   0,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      9,   0,   0,   0,  10,   0, \n     16,   0,   6,   0,   0,   0, \n     54,   0,   0,   5, 226,   0, \n     16,   0,   9,   0,   0,   0, \n      6,   9,  16,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      9,   0,   0,   0,  11,   0, \n      0,   0,  13,   0,   0,   0, \n     15,   0,   0,   0,   6,   0, \n     16,   0,   7,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0, 242,   0,  16,   0, \n     11,   0,   0,   0,  86,   5, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,  35,   0,   0,   9, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   6,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   1,   0,   0,   7, \n     18,   0,  16,   0,  11,   0, \n      0,   0,  58,   0,  16,   0, \n      8,   0,   0,   0,  10,   0, \n     16,   0,   9,   0,   0,   0, \n      1,   0,   0,   7,  18,   0, \n     16,   0,  12,   0,   0,   0, \n     10,   0,  16,   0,  11,   0, \n      0,   0,   1,  64,   0,   0, \n     85,  85,  85,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     11,   0,   0,   0,   6,   0, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      4,   0,   0,   0,   6,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n     60,   0,   0,   7,  18,   0, \n     16,   0,   8,   0,   0,   0, \n     58,   0,  16,   0,   8,   0, \n      0,   0,  10,   0,  16,   0, \n      9,   0,   0,   0, 138,   0, \n      0,  12, 242,   0,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   9,   0,   0,   0, \n      9,   0,   0,   0,   9,   0, \n      0,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  54,   0,   0,   5, \n    226,   0,  16,   0,  12,   0, \n      0,   0,  86,  14,  16,   0, \n     11,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n    138,   0,   0,  12, 242,   0, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   9,   0, \n      0,   0,   9,   0,   0,   0, \n      9,   0,   0,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0, 140,   0,   0,  20, \n    242,   0,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  85,   0, \n      0,   7, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   8,   0,   0,   0, \n      6,   0,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  35,   0,   0,  12, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0, 255, \n      0,   0,   0, 255,   0,   0, \n      0, 255,   0,   0,   0, 255, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  59,   0,   0,   5, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  54,   9,  16,   0, \n      6,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     11,   0,   0,   0,  86,   5, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      4,   0,   0,   0,   6,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  11,   0, \n      0,   0,  26,   0,  16,   0, \n     10,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0, 242,   0,  16,   0, \n     12,   0,   0,   0,  86,   5, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,  35,   0,   0,   9, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,   6,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n     78,   0,   0,  11, 242,   0, \n     16,   0,  12,   0,   0,   0, \n      0, 208,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     78,   0,   0,  11, 242,   0, \n     16,   0,  13,   0,   0,   0, \n      0, 208,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  78,   0,   0,  11, \n    242,   0,  16,   0,  11,   0, \n      0,   0,   0, 208,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  60,   0, \n      0,   7, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,  60,   0,   0,  10, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0, 255, \n      0,   0,   0, 255,   0,   0, \n      0, 255,   0,   0,   0, 255, \n     55,   0,   0,   9, 242,   0, \n     16,   0,   8,   0,   0,   0, \n      6,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,  30,   0,   0,  10, \n    210,   0,  16,   0,   4,   0, \n      0,   0, 246,  15,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  32,   0, \n      0,   0,  48,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     86,   5,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     11,   0,   0,   0,  26,   0, \n     16,   0,   6,   0,   0,   0, \n     54,   0,   0,   5, 226,   0, \n     16,   0,  11,   0,   0,   0, \n      6,   9,  16,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      9,   0,   0,   0,  11,   0, \n      0,   0,  13,   0,   0,   0, \n     15,   0,   0,   0,  86,   5, \n     16,   0,   3,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0, 242,   0,  16,   0, \n     13,   0,   0,   0,  86,   5, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  35,   0,   0,   9, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   1,   0,   0,   7, \n     18,   0,  16,   0,  13,   0, \n      0,   0,  26,   0,  16,   0, \n      6,   0,   0,   0,  58,   0, \n     16,   0,   8,   0,   0,   0, \n      1,   0,   0,   7,  18,   0, \n     16,   0,  14,   0,   0,   0, \n     10,   0,  16,   0,  13,   0, \n      0,   0,   1,  64,   0,   0, \n     85,  85,  85,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     13,   0,   0,   0,   6,   0, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      4,   0,   0,   0,   6,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n     60,   0,   0,   7,  18,   0, \n     16,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,   6,   0, \n      0,   0,  58,   0,  16,   0, \n      8,   0,   0,   0, 138,   0, \n      0,  12, 242,   0,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   9,   0,   0,   0, \n      9,   0,   0,   0,   9,   0, \n      0,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  54,   0,   0,   5, \n    226,   0,  16,   0,  14,   0, \n      0,   0,  86,  14,  16,   0, \n     13,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n    138,   0,   0,  12, 242,   0, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   9,   0, \n      0,   0,   9,   0,   0,   0, \n      9,   0,   0,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0, 140,   0,   0,  20, \n    242,   0,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  85,   0, \n      0,   7, 242,   0,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  14,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   8,   0,   0,   0, \n      6,   0,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  35,   0,   0,  12, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0, 255, \n      0,   0,   0, 255,   0,   0, \n      0, 255,   0,   0,   0, 255, \n     70,  14,  16,   0,  12,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,  12,   0, \n      0,   0, 166,  10,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   6,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  12,   0,   0,   0, \n     42,   0,  16,   0,  10,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  86,   5,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     35,   0,   0,   9, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,  86,   5,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n     12,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n     13,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     78,   0,   0,  11, 242,   0, \n     16,   0,  11,   0,   0,   0, \n      0, 208,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  60,   0,   0,   7, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n     60,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0, 255,   0,   0, \n      0, 255,   0,   0,   0, 255, \n      0,   0,   0, 255,  55,   0, \n      0,   9, 242,   0,  16,   0, \n      8,   0,   0,   0,  86,   5, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   8,   0,   0,   0, \n    166,  10,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     11,   0,   0,   0,  42,   0, \n     16,   0,   6,   0,   0,   0, \n     54,   0,   0,   5, 226,   0, \n     16,   0,  11,   0,   0,   0, \n      6,   9,  16,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      9,   0,   0,   0,  11,   0, \n      0,   0,  13,   0,   0,   0, \n     15,   0,   0,   0, 166,  10, \n     16,   0,   3,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0, 242,   0,  16,   0, \n     13,   0,   0,   0,  86,   5, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  35,   0,   0,   9, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,   6,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   1,   0,   0,   7, \n     18,   0,  16,   0,  13,   0, \n      0,   0,  42,   0,  16,   0, \n      6,   0,   0,   0,  58,   0, \n     16,   0,   8,   0,   0,   0, \n      1,   0,   0,   7,  18,   0, \n     16,   0,  14,   0,   0,   0, \n     10,   0,  16,   0,  13,   0, \n      0,   0,   1,  64,   0,   0, \n     85,  85,  85,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     13,   0,   0,   0,   6,   0, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      4,   0,   0,   0,   6,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n     60,   0,   0,   7,  18,   0, \n     16,   0,   8,   0,   0,   0, \n     42,   0,  16,   0,   6,   0, \n      0,   0,  58,   0,  16,   0, \n      8,   0,   0,   0, 138,   0, \n      0,  12, 242,   0,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   9,   0,   0,   0, \n      9,   0,   0,   0,   9,   0, \n      0,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  54,   0,   0,   5, \n    226,   0,  16,   0,  14,   0, \n      0,   0,  86,  14,  16,   0, \n     13,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n    138,   0,   0,  12, 242,   0, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   9,   0, \n      0,   0,   9,   0,   0,   0, \n      9,   0,   0,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0, 140,   0,   0,  20, \n    242,   0,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  85,   0, \n      0,   7, 242,   0,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  14,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   8,   0,   0,   0, \n      6,   0,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  35,   0,   0,  12, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0, 255, \n      0,   0,   0, 255,   0,   0, \n      0, 255,   0,   0,   0, 255, \n     70,  14,  16,   0,  12,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,  12,   0, \n      0,   0, 246,  15,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   6,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  12,   0,   0,   0, \n     58,   0,  16,   0,  10,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  86,   5,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     35,   0,   0,   9, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,   6,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n     12,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n     13,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     78,   0,   0,  11, 242,   0, \n     16,   0,  11,   0,   0,   0, \n      0, 208,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  60,   0,   0,   7, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n     60,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0, 255,   0,   0, \n      0, 255,   0,   0,   0, 255, \n      0,   0,   0, 255,  55,   0, \n      0,   9, 242,   0,  16,   0, \n      8,   0,   0,   0, 166,  10, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   8,   0,   0,   0, \n    246,  15,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     11,   0,   0,   0,  58,   0, \n     16,   0,   6,   0,   0,   0, \n     54,   0,   0,   5, 226,   0, \n     16,   0,  11,   0,   0,   0, \n      6,   9,  16,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      9,   0,   0,   0,  11,   0, \n      0,   0,  13,   0,   0,   0, \n     15,   0,   0,   0, 246,  15, \n     16,   0,   3,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0, 242,   0,  16,   0, \n     13,   0,   0,   0, 246,  15, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  35,   0,   0,   9, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0, 166,  10, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   1,   0,   0,   7, \n     18,   0,  16,   0,  13,   0, \n      0,   0,  58,   0,  16,   0, \n      6,   0,   0,   0,  58,   0, \n     16,   0,   8,   0,   0,   0, \n      1,   0,   0,   7,  18,   0, \n     16,   0,  14,   0,   0,   0, \n     10,   0,  16,   0,  13,   0, \n      0,   0,   1,  64,   0,   0, \n     85,  85,  85,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     13,   0,   0,   0,   6,   0, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      4,   0,   0,   0,   6,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n     60,   0,   0,   7,  18,   0, \n     16,   0,   8,   0,   0,   0, \n     58,   0,  16,   0,   6,   0, \n      0,   0,  58,   0,  16,   0, \n      8,   0,   0,   0, 138,   0, \n      0,  12, 242,   0,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   9,   0,   0,   0, \n      9,   0,   0,   0,   9,   0, \n      0,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,  14, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  54,   0,   0,   5, \n    226,   0,  16,   0,  14,   0, \n      0,   0,  86,  14,  16,   0, \n     13,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n    138,   0,   0,  12, 242,   0, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   9,   0, \n      0,   0,   9,   0,   0,   0, \n      9,   0,   0,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  15,   0, \n      0,   0, 140,   0,   0,  20, \n    242,   0,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  85,   0, \n      0,   7, 242,   0,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  14,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   8,   0,   0,   0, \n      6,   0,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  35,   0,   0,  12, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0, 255, \n      0,   0,   0, 255,   0,   0, \n      0, 255,   0,   0,   0, 255, \n     70,  14,  16,   0,  12,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,  10,   0, \n      0,   0,   6,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 242,   0, \n     16,   0,  11,   0,   0,   0, \n    246,  15,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  35,   0, \n      0,   9, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n    166,  10,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,  78,   0,   0,  11, \n    242,   0,  16,   0,  11,   0, \n      0,   0,   0, 208,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  78,   0,   0,  11, \n    242,   0,  16,   0,  12,   0, \n      0,   0,   0, 208,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n     10,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   7, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  60,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0, 255,   0,   0,   0, 255, \n      0,   0,   0, 255,   0,   0, \n      0, 255,  55,   0,   0,   9, \n    242,   0,  16,   0,   8,   0, \n      0,   0, 246,  15,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,  35,   0, \n      0,   8,  18,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n      2,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     79,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  26, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n     59,   0,   0,   5,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  30,   0,   0,   9, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n     18,   0,   0,   1,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      3,   0,   0,   0,  10,   0, \n     16,   0,   9,   0,   0,   0, \n     54,   0,   0,   5, 226,   0, \n     16,   0,   3,   0,   0,   0, \n     86,  14,  16,   0,   6,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   0,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   6,   0,   0,   0, \n      6,   0,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      8,   0,   0,   0,  10,   0, \n     16,   0,   3,   0,   0,   0, \n     54,   0,   0,   5, 226,   0, \n     16,   0,   8,   0,   0,   0, \n      6,   9,  16,   0,   6,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   3,   0, \n      0,   0,   5,   0,   0,   0, \n      7,   0,   0,   0,   6,   0, \n     16,   0,   3,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0, 242,   0,  16,   0, \n     10,   0,   0,   0,  86,   5, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  35,   0,   0,   9, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,   6,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   1,   0,   0,   7, \n     18,   0,  16,   0,  10,   0, \n      0,   0,  10,   0,  16,   0, \n      3,   0,   0,   0,  58,   0, \n     16,   0,   6,   0,   0,   0, \n      1,   0,   0,   7,  18,   0, \n     16,   0,  11,   0,   0,   0, \n     10,   0,  16,   0,  10,   0, \n      0,   0,   1,  64,   0,   0, \n     85,  85,  85,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     10,   0,   0,   0,   6,   0, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      4,   0,   0,   0,   6,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n     60,   0,   0,   7,  18,   0, \n     16,   0,   6,   0,   0,   0, \n     10,   0,  16,   0,   3,   0, \n      0,   0,  58,   0,  16,   0, \n      6,   0,   0,   0, 138,   0, \n      0,  12, 242,   0,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   9,   0,   0,   0, \n      9,   0,   0,   0,   9,   0, \n      0,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  54,   0,   0,   5, \n    226,   0,  16,   0,  11,   0, \n      0,   0,  86,  14,  16,   0, \n     10,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n    138,   0,   0,  12, 242,   0, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   9,   0, \n      0,   0,   9,   0,   0,   0, \n      9,   0,   0,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0, 140,   0,   0,  20, \n    242,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  85,   0, \n      0,   7, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   6,   0,   0,   0, \n      6,   0,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  35,   0,   0,  12, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0, 255, \n      0,   0,   0, 255,   0,   0, \n      0, 255,   0,   0,   0, 255, \n     70,  14,  16,   0,   9,   0, \n      0,   0,  59,   0,   0,   5, \n     18,   0,  16,   0,   9,   0, \n      0,   0,  10,   0,  16,   0, \n      3,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      9,   0,   0,   0,   6,   0, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      4,   0,   0,   0,   6,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  86,   5,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n     35,   0,   0,   9, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,   6,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n      9,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n     10,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     78,   0,   0,  11, 242,   0, \n     16,   0,   8,   0,   0,   0, \n      0, 208,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  60,   0,   0,   7, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n     60,   0,   0,  10, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0, 255,   0,   0, \n      0, 255,   0,   0,   0, 255, \n      0,   0,   0, 255,  55,   0, \n      0,   9, 242,   0,  16,   0, \n      6,   0,   0,   0,   6,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     30,   0,   0,  10, 210,   0, \n     16,   0,   4,   0,   0,   0, \n    246,  15,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  32,   0,   0,   0, \n     48,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      6,   0,   0,   0,  86,   5, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   8,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,  54,   0, \n      0,   5, 226,   0,  16,   0, \n      8,   0,   0,   0,   6,   9, \n     16,   0,   6,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   3,   0,   0,   0, \n      5,   0,   0,   0,   7,   0, \n      0,   0,  86,   5,  16,   0, \n      3,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  86,   5,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     35,   0,   0,   9, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,  86,   5,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      1,   0,   0,   7,  18,   0, \n     16,   0,  10,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,  58,   0,  16,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   7,  18,   0,  16,   0, \n     11,   0,   0,   0,  10,   0, \n     16,   0,  10,   0,   0,   0, \n      1,  64,   0,   0,  85,  85, \n     85,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,  10,   0, \n      0,   0,   6,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,  60,   0, \n      0,   7,  18,   0,  16,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n     58,   0,  16,   0,   6,   0, \n      0,   0, 138,   0,   0,  12, \n    242,   0,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      9,   0,   0,   0,   9,   0, \n      0,   0,   9,   0,   0,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     54,   0,   0,   5, 226,   0, \n     16,   0,  11,   0,   0,   0, \n     86,  14,  16,   0,  10,   0, \n      0,   0, 140,   0,   0,  20, \n    242,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0, 138,   0, \n      0,  12, 242,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   9,   0,   0,   0, \n      9,   0,   0,   0,   9,   0, \n      0,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n    140,   0,   0,  20, 242,   0, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  85,   0,   0,   7, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      6,   0,   0,   0,   6,   0, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      4,   0,   0,   0,   6,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n     35,   0,   0,  12, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0, 255,   0,   0, \n      0, 255,   0,   0,   0, 255, \n      0,   0,   0, 255,  70,  14, \n     16,   0,   9,   0,   0,   0, \n     59,   0,   0,   5,  18,   0, \n     16,   0,   9,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,   9,   0, \n      0,   0,   6,   0,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     86,   5,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,  35,   0, \n      0,   9, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,  78,   0,   0,  11, \n    242,   0,  16,   0,   9,   0, \n      0,   0,   0, 208,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,  78,   0,   0,  11, \n    242,   0,  16,   0,  10,   0, \n      0,   0,   0, 208,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n      8,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   7, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,  60,   0, \n      0,  10, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0, 255,   0,   0,   0, 255, \n      0,   0,   0, 255,   0,   0, \n      0, 255,  55,   0,   0,   9, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  86,   5,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      6,   0,   0,   0, 166,  10, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   8,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0,  54,   0, \n      0,   5, 226,   0,  16,   0, \n      8,   0,   0,   0,   6,   9, \n     16,   0,   6,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   3,   0,   0,   0, \n      5,   0,   0,   0,   7,   0, \n      0,   0, 166,  10,  16,   0, \n      3,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  86,   5,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     35,   0,   0,   9, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,   6,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      1,   0,   0,   7,  18,   0, \n     16,   0,  10,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0,  58,   0,  16,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   7,  18,   0,  16,   0, \n     11,   0,   0,   0,  10,   0, \n     16,   0,  10,   0,   0,   0, \n      1,  64,   0,   0,  85,  85, \n     85,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,  10,   0, \n      0,   0,   6,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,  60,   0, \n      0,   7,  18,   0,  16,   0, \n      6,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n     58,   0,  16,   0,   6,   0, \n      0,   0, 138,   0,   0,  12, \n    242,   0,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      9,   0,   0,   0,   9,   0, \n      0,   0,   9,   0,   0,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     54,   0,   0,   5, 226,   0, \n     16,   0,  11,   0,   0,   0, \n     86,  14,  16,   0,  10,   0, \n      0,   0, 140,   0,   0,  20, \n    242,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0, 138,   0, \n      0,  12, 242,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   9,   0,   0,   0, \n      9,   0,   0,   0,   9,   0, \n      0,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n    140,   0,   0,  20, 242,   0, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  85,   0,   0,   7, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      6,   0,   0,   0,   6,   0, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      4,   0,   0,   0,   6,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n     35,   0,   0,  12, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0, 255,   0,   0, \n      0, 255,   0,   0,   0, 255, \n      0,   0,   0, 255,  70,  14, \n     16,   0,   9,   0,   0,   0, \n     59,   0,   0,   5,  18,   0, \n     16,   0,   9,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,   9,   0, \n      0,   0,   6,   0,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     86,   5,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,  35,   0, \n      0,   9, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n      6,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,  78,   0,   0,  11, \n    242,   0,  16,   0,   9,   0, \n      0,   0,   0, 208,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,  78,   0,   0,  11, \n    242,   0,  16,   0,  10,   0, \n      0,   0,   0, 208,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n      8,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   7, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,  60,   0, \n      0,  10, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0, 255,   0,   0,   0, 255, \n      0,   0,   0, 255,   0,   0, \n      0, 255,  55,   0,   0,   9, \n    242,   0,  16,   0,   6,   0, \n      0,   0, 166,  10,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      6,   0,   0,   0, 246,  15, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   8,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,  54,   0, \n      0,   5, 226,   0,  16,   0, \n      8,   0,   0,   0,   6,   9, \n     16,   0,   6,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   3,   0,   0,   0, \n      5,   0,   0,   0,   7,   0, \n      0,   0, 246,  15,  16,   0, \n      3,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n    242,   0,  16,   0,  10,   0, \n      0,   0, 246,  15,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     35,   0,   0,   9, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0, 166,  10,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      1,   0,   0,   7,  18,   0, \n     16,   0,  10,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,  58,   0,  16,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   7,  18,   0,  16,   0, \n     11,   0,   0,   0,  10,   0, \n     16,   0,  10,   0,   0,   0, \n      1,  64,   0,   0,  85,  85, \n     85,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,  10,   0, \n      0,   0,   6,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,  60,   0, \n      0,   7,  18,   0,  16,   0, \n      6,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n     58,   0,  16,   0,   6,   0, \n      0,   0, 138,   0,   0,  12, \n    242,   0,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      9,   0,   0,   0,   9,   0, \n      0,   0,   9,   0,   0,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     54,   0,   0,   5, 226,   0, \n     16,   0,  11,   0,   0,   0, \n     86,  14,  16,   0,  10,   0, \n      0,   0, 140,   0,   0,  20, \n    242,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0, 138,   0, \n      0,  12, 242,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   9,   0,   0,   0, \n      9,   0,   0,   0,   9,   0, \n      0,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n    140,   0,   0,  20, 242,   0, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  85,   0,   0,   7, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      6,   0,   0,   0,   6,   0, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      4,   0,   0,   0,   6,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n     35,   0,   0,  12, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0, 255,   0,   0, \n      0, 255,   0,   0,   0, 255, \n      0,   0,   0, 255,  70,  14, \n     16,   0,   9,   0,   0,   0, \n     59,   0,   0,   5,  18,   0, \n     16,   0,   9,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,   9,   0, \n      0,   0,   6,   0,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 242,   0, \n     16,   0,   8,   0,   0,   0, \n    246,  15,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,  35,   0, \n      0,   9, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n    166,  10,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,  78,   0,   0,  11, \n    242,   0,  16,   0,   9,   0, \n      0,   0,   0, 208,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,  78,   0,   0,  11, \n    242,   0,  16,   0,  10,   0, \n      0,   0,   0, 208,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n      8,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   7, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,  60,   0, \n      0,  10, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0, 255,   0,   0,   0, 255, \n      0,   0,   0, 255,   0,   0, \n      0, 255,  55,   0,   0,   9, \n    242,   0,  16,   0,   6,   0, \n      0,   0, 246,  15,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  21,   0, \n      0,   1,  18,   0,   0,   1, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   7,   0, \n      0,   0,  54,   0,   0,   5, \n     66,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n    255, 255, 255, 255,  21,   0, \n      0,   1,  31,   0,   0,   3, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  35,   0,   0,   8, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,   2,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  79,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,  31,   0, \n      4,   3,  10,   0,  16,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      6,   0,   0,   0,  54,   9, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  86,   5,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n      4,   0,   0,   0,   6,   0, \n      0,   0,   1,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,   6,   0, \n      0,   0,  54,   0,   0,   5, \n    226,   0,  16,   0,   8,   0, \n      0,   0,   6,   9,  16,   0, \n      7,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   9,   0,   0,   0, \n     11,   0,   0,   0,  13,   0, \n      0,   0,  15,   0,   0,   0, \n      6,   0,  16,   0,   3,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  35,   0, \n      0,   9, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n      6,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   1,   0, \n      0,   7,  18,   0,  16,   0, \n     10,   0,   0,   0,  58,   0, \n     16,   0,   7,   0,   0,   0, \n     10,   0,  16,   0,   8,   0, \n      0,   0,   1,   0,   0,   7, \n     18,   0,  16,   0,  11,   0, \n      0,   0,  10,   0,  16,   0, \n     10,   0,   0,   0,   1,  64, \n      0,   0,  85,  85,  85,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  10,   0,   0,   0, \n      6,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     18,   0,  16,   0,   7,   0, \n      0,   0,  58,   0,  16,   0, \n      7,   0,   0,   0,  10,   0, \n     16,   0,   8,   0,   0,   0, \n    138,   0,   0,  12, 242,   0, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   9,   0, \n      0,   0,   9,   0,   0,   0, \n      9,   0,   0,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  54,   0, \n      0,   5, 226,   0,  16,   0, \n     11,   0,   0,   0,  86,  14, \n     16,   0,  10,   0,   0,   0, \n    140,   0,   0,  20, 242,   0, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0, 138,   0,   0,  12, \n    242,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      9,   0,   0,   0,   9,   0, \n      0,   0,   9,   0,   0,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     85,   0,   0,   7, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,   7,   0, \n      0,   0,   6,   0,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,  35,   0, \n      0,  12, 242,   0,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0, 255,   0,   0,   0, 255, \n      0,   0,   0, 255,   0,   0, \n      0, 255,  70,  14,  16,   0, \n      9,   0,   0,   0,  59,   0, \n      0,   5, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  10,   0,   0,   0, \n     86,   5,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      6,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     10,   0,   0,   0,  26,   0, \n     16,   0,   9,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,  35,   0, \n      0,   9, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      6,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,  78,   0,   0,  11, \n    242,   0,  16,   0,  10,   0, \n      0,   0,   0, 208,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,  78,   0,   0,  11, \n    242,   0,  16,   0,  11,   0, \n      0,   0,   0, 208,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n      8,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   7, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  60,   0, \n      0,  10, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0, 255,   0,   0,   0, 255, \n      0,   0,   0, 255,   0,   0, \n      0, 255,  55,   0,   0,   9, \n    242,   0,  16,   0,   7,   0, \n      0,   0,   6,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,  30,   0, \n      0,  10, 226,   0,  16,   0, \n      0,   0,   0,   0,   6,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     32,   0,   0,   0,  48,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   7,   0, \n      0,   0, 166,  10,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n      4,   0,   0,   0,   6,   0, \n      0,   0,   1,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   8,   0,   0,   0, \n     42,   0,  16,   0,   6,   0, \n      0,   0,  54,   0,   0,   5, \n    226,   0,  16,   0,   8,   0, \n      0,   0,   6,   9,  16,   0, \n      7,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   9,   0,   0,   0, \n     11,   0,   0,   0,  13,   0, \n      0,   0,  15,   0,   0,   0, \n     86,   5,  16,   0,   3,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     86,   5,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  35,   0, \n      0,   9, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,   1,   0, \n      0,   7,  18,   0,  16,   0, \n     11,   0,   0,   0,  42,   0, \n     16,   0,   6,   0,   0,   0, \n     58,   0,  16,   0,   7,   0, \n      0,   0,   1,   0,   0,   7, \n     18,   0,  16,   0,  12,   0, \n      0,   0,  10,   0,  16,   0, \n     11,   0,   0,   0,   1,  64, \n      0,   0,  85,  85,  85,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,  11,   0,   0,   0, \n      6,   0,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     18,   0,  16,   0,   7,   0, \n      0,   0,  42,   0,  16,   0, \n      6,   0,   0,   0,  58,   0, \n     16,   0,   7,   0,   0,   0, \n    138,   0,   0,  12, 242,   0, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   9,   0, \n      0,   0,   9,   0,   0,   0, \n      9,   0,   0,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  54,   0, \n      0,   5, 226,   0,  16,   0, \n     12,   0,   0,   0,  86,  14, \n     16,   0,  11,   0,   0,   0, \n    140,   0,   0,  20, 242,   0, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0, 138,   0,   0,  12, \n    242,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      9,   0,   0,   0,   9,   0, \n      0,   0,   9,   0,   0,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     85,   0,   0,   7, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,   7,   0, \n      0,   0,   6,   0,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,  35,   0, \n      0,  12, 242,   0,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0, 255,   0,   0,   0, 255, \n      0,   0,   0, 255,   0,   0, \n      0, 255,  70,  14,  16,   0, \n     10,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n     10,   0,   0,   0, 166,  10, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      4,   0,   0,   0,   6,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  10,   0, \n      0,   0,  42,   0,  16,   0, \n      9,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0, 242,   0,  16,   0, \n      4,   0,   0,   0,  86,   5, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,  35,   0,   0,   9, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n     78,   0,   0,  11, 242,   0, \n     16,   0,   4,   0,   0,   0, \n      0, 208,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     78,   0,   0,  11, 242,   0, \n     16,   0,   8,   0,   0,   0, \n      0, 208,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  78,   0,   0,  11, \n    242,   0,  16,   0,   1,   0, \n      0,   0,   0, 208,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  60,   0, \n      0,   7, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  60,   0,   0,  10, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0, 255, \n      0,   0,   0, 255,   0,   0, \n      0, 255,   0,   0,   0, 255, \n     55,   0,   0,   9, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     86,   5,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   1,   0, \n      0,   0, 246,  15,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n      4,   0,   0,   0,   6,   0, \n      0,   0,   1,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   4,   0,   0,   0, \n     58,   0,  16,   0,   6,   0, \n      0,   0,  54,   0,   0,   5, \n    226,   0,  16,   0,   4,   0, \n      0,   0,   6,   9,  16,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   9,   0,   0,   0, \n     11,   0,   0,   0,  13,   0, \n      0,   0,  15,   0,   0,   0, \n    166,  10,  16,   0,   3,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     86,   5,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,  35,   0, \n      0,   9, 242,   0,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n      6,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   1,   0, \n      0,   7,  18,   0,  16,   0, \n      8,   0,   0,   0,  58,   0, \n     16,   0,   6,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,   1,   0,   0,   7, \n     18,   0,  16,   0,  10,   0, \n      0,   0,  10,   0,  16,   0, \n      8,   0,   0,   0,   1,  64, \n      0,   0,  85,  85,  85,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   8,   0,   0,   0, \n      6,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   6,   0,   0,   0, \n    138,   0,   0,  12, 242,   0, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   9,   0, \n      0,   0,   9,   0,   0,   0, \n      9,   0,   0,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  54,   0, \n      0,   5, 226,   0,  16,   0, \n     10,   0,   0,   0,  86,  14, \n     16,   0,   8,   0,   0,   0, \n    140,   0,   0,  20, 242,   0, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0, 138,   0,   0,  12, \n    242,   0,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      9,   0,   0,   0,   9,   0, \n      0,   0,   9,   0,   0,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     85,   0,   0,   7, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,   1,   0, \n      0,   0,   6,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,  35,   0, \n      0,  12, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0, 255,   0,   0,   0, 255, \n      0,   0,   0, 255,   0,   0, \n      0, 255,  70,  14,  16,   0, \n      7,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      7,   0,   0,   0, 246,  15, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      4,   0,   0,   0,   6,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   7,   0, \n      0,   0,  58,   0,  16,   0, \n      9,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0, 242,   0,  16,   0, \n      4,   0,   0,   0,  86,   5, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  35,   0,   0,   9, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,   6,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n     78,   0,   0,  11, 242,   0, \n     16,   0,   7,   0,   0,   0, \n      0, 208,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     78,   0,   0,  11, 242,   0, \n     16,   0,   8,   0,   0,   0, \n      0, 208,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  78,   0,   0,  11, \n    242,   0,  16,   0,   4,   0, \n      0,   0,   0, 208,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  60,   0, \n      0,   7, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  60,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0, 255, \n      0,   0,   0, 255,   0,   0, \n      0, 255,   0,   0,   0, 255, \n     55,   0,   0,   9, 242,   0, \n     16,   0,   1,   0,   0,   0, \n    166,  10,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   1,   0, \n      0,   0,   6,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n      4,   0,   0,   0,   6,   0, \n      0,   0,   1,   0,   0,   0, \n     54,   0,   0,   5, 226,   0, \n     16,   0,   6,   0,   0,   0, \n      6,   9,  16,   0,   1,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      9,   0,   0,   0,  11,   0, \n      0,   0,  13,   0,   0,   0, \n     15,   0,   0,   0, 246,  15, \n     16,   0,   3,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0, 242,   0,  16,   0, \n      3,   0,   0,   0, 246,  15, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0, 166,  10, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   1,   0,   0,   7, \n     18,   0,  16,   0,   4,   0, \n      0,   0,  10,   0,  16,   0, \n      6,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n      1,   0,   0,   7,  18,   0, \n     16,   0,   7,   0,   0,   0, \n     10,   0,  16,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n     85,  85,  85,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      4,   0,   0,   0,   6,   0, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      4,   0,   0,   0,   6,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n     60,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      6,   0,   0,   0, 138,   0, \n      0,  12, 242,   0,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   9,   0,   0,   0, \n      9,   0,   0,   0,   9,   0, \n      0,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  54,   0,   0,   5, \n    226,   0,  16,   0,   7,   0, \n      0,   0,  86,  14,  16,   0, \n      4,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n    138,   0,   0,  12, 242,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   9,   0, \n      0,   0,   9,   0,   0,   0, \n      9,   0,   0,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0, 140,   0,   0,  20, \n    242,   0,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  85,   0, \n      0,   7, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   1,   0,   0,   0, \n      6,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  35,   0,   0,  12, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0, 255, \n      0,   0,   0, 255,   0,   0, \n      0, 255,   0,   0,   0, 255, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,   9,   0, \n      0,   0,   6,   0,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 242,   0, \n     16,   0,   4,   0,   0,   0, \n    246,  15,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  35,   0, \n      0,   9, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n    166,  10,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,  78,   0,   0,  11, \n    242,   0,  16,   0,   3,   0, \n      0,   0,   0, 208,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  78,   0,   0,  11, \n    242,   0,  16,   0,   4,   0, \n      0,   0,   0, 208,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n      2,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   7, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  60,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0, 255,   0,   0,   0, 255, \n      0,   0,   0, 255,   0,   0, \n      0, 255,  55,   0,   0,   9, \n    242,   0,  16,   0,   1,   0, \n      0,   0, 246,  15,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  21,   0, \n      0,   1,  21,   0,   0,   1, \n     62,   0,   0,   1,  83,  84, \n     65,  84, 148,   0,   0,   0, \n    128,   3,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0, 219,   0,   0,   0, \n    137,   1,   0,   0,   9,   0, \n      0,   0,  13,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  80,   0, \n      0,   0,  17,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_dxt3_rgba8_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 8\ndcl_thread_group 4, 32, 1\nand r0.xy, CB0[0][0].xxxx, l(1, 2, 0, 0)\nishl r1.x, vThreadID.x, l(1)\nmov r1.y, vThreadID.y\nuge r0.zw, r1.xxxy, CB0[0][1].xxxy\nor r0.z, r0.w, r0.z\nif_nz r0.z\n  ret \nendif \nubfe r0.z, l(2), l(2), CB0[0][0].x\nishl r1.yz, r1.xxyx, l(0, 2, 2, 0)\nishl r0.w, r1.y, l(2)\nimad r1.y, vThreadID.z, CB0[0][2].y, r1.z\nimad r0.w, r1.y, CB0[0][2].x, r0.w\niadd r0.w, r0.w, CB0[0][1].w\nif_z r0.x\n  imad r1.y, CB0[0][0].w, vThreadID.z, vThreadID.y\n  imad r1.y, CB0[0][0].z, r1.y, r1.x\n  ishl r1.y, r1.y, l(4)\nelse \n  if_nz r0.y\n    ushr r1.zw, CB0[0][0].zzzw, l(0, 0, 5, 4)\n    ishr r2.xyzw, vThreadID.zyyy, l(2, 4, 1, 3)\n    imad r0.y, r2.x, r1.w, r2.y\n    ibfe r1.w, l(27), l(4), vThreadID.x\n    imad r0.y, r0.y, r1.z, r1.w\n    bfi r1.zw, l(0, 0, 2, 1), l(0, 0, 5, 4), vThreadID.zzzy, l(0, 0, 0, 0)\n    bfi r2.y, l(2), l(3), r2.z, l(0)\n    iadd r1.z, r1.z, r2.y\n    bfi r1.z, l(3), l(0), r1.x, r1.z\n    bfi r0.y, l(25), l(7), r0.y, r1.z\n    xor r1.z, r2.x, r2.w\n    ubfe r2.x, l(2), l(3), r1.x\n    bfi r2.yz, l(0, 1, 1, 0), l(0, 1, 11, 0), r1.zzzz, l(0, 0, 0, 0)\n    xor r1.z, r2.y, r2.x\n    imad r1.z, r1.z, l(64), r1.w\n    iadd r1.z, r2.z, r1.z\n    ibfe r2.xy, l(27, 24, 0, 0), l(1, 4, 0, 0), r0.yyyy\n    bfi r0.y, l(3), l(8), r2.x, r1.z\n    bfi r1.y, l(20), l(12), r2.y, r0.y\n  else \n    ushr r0.y, CB0[0][0].z, l(5)\n    ishr r2.xyzw, vThreadID.yyyy, l(5, 1, 4, 3)\n    ibfe r1.z, l(27), l(4), vThreadID.x\n    imad r0.y, r2.x, r0.y, r1.z\n    bfi r2.xyz, l(3, 1, 1, 0), l(3, 1, 11, 0), r2.ywzy, l(0, 0, 0, 0)\n    bfi r1.z, l(3), l(0), r1.x, r2.x\n    bfi r0.y, l(26), l(6), r0.y, r1.z\n    ubfe r1.x, l(2), l(3), r1.x\n    xor r1.x, r2.y, r1.x\n    bfi r1.z, l(1), l(4), vThreadID.y, l(0)\n    imad r1.x, r1.x, l(64), r1.z\n    iadd r1.x, r2.z, r1.x\n    ibfe r1.zw, l(0, 0, 27, 24), l(0, 0, 1, 4), r0.yyyy\n    bfi r0.y, l(3), l(8), r1.z, r1.x\n    bfi r1.y, l(20), l(12), r1.w, r0.y\n  endif \nendif \niadd r0.y, r1.y, CB0[0][0].y\nld_raw r1.xyzw, r0.y, T0[0].yxzw\nieq r2.xyz, r0.zzzz, l(1, 2, 3, 0)\nor r2.xy, r2.yzyy, r2.xyxx\nif_nz r2.x\n  ishl r3.xyzw, r1.yxzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r1.yxzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r1.xyzw, r3.yxzw, r4.yxzw\nendif \nif_nz r2.y\n  ushr r3.xyzw, r1.yxzw, l(16, 16, 16, 16)\n  bfi r1.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r1.xyzw, r3.yxzw\n  mov r3.x, r1.y\nelse \n  mov r3.x, r1.y\nendif \nishl r4.xyz, r1.zzzz, l(3, 7, 12, 0)\nushr r5.xyz, r1.zzzz, l(13, 4, 9, 0)\nmov r4.w, r5.x\nand r2.zw, r4.xxxw, l(0, 0, 248, 248)\nmov r5.xw, r4.zzzy\nand r4.xy, r5.wzww, l(0x0003f000, 0x0003f000, 0, 0)\niadd r2.zw, r2.zzzw, r4.xxxy\nand r4.xy, r5.xyxx, l(0x0f800000, 0x0f800000, 0, 0)\niadd r2.zw, r2.zzzw, r4.xxxy\nushr r4.xy, r2.zwzz, l(5, 5, 0, 0)\nand r4.xy, r4.xyxx, l(0x00700007, 0x00700007, 0, 0)\niadd r2.zw, r2.zzzw, r4.xxxy\nushr r4.xy, r2.zwzz, l(6, 6, 0, 0)\nand r4.xy, r4.xyxx, l(3072, 3072, 0, 0)\niadd r2.zw, r2.zzzw, r4.xxxy\nishl r0.z, r1.w, l(1)\nand r0.z, r0.z, l(0xaaaaaaaa)\nushr r4.x, r1.w, l(1)\nand r4.x, r4.x, l(0x55555555)\niadd r0.z, r0.z, r4.x\nushr r4.x, r0.z, l(1)\nand r4.x, r4.x, l(0x55555555)\nxor r4.x, r0.z, r4.x\nnot r5.x, r4.x\nushr r5.yzw, r5.xxxx, l(0, 2, 4, 6)\nand r5.xyzw, r5.xyzw, l(3, 3, 3, 3)\nushr r4.yzw, r4.xxxx, l(0, 2, 4, 6)\nand r6.xyzw, r4.xyzw, l(3, 3, 3, 3)\nimul null, r6.xyzw, r2.wwww, r6.xyzw\nimad r5.xyzw, r5.xyzw, r2.zzzz, r6.xyzw\nand r6.xyzw, r5.xyzw, l(1023, 1023, 1023, 1023)\nudiv r6.xyzw, null, r6.xyzw, l(3, 3, 3, 3)\nishl r6.xyzw, r6.xyzw, l(16, 16, 16, 16)\nubfe r7.xyzw, l(10, 10, 10, 10), l(10, 10, 10, 10), r5.xyzw\nudiv r7.xyzw, null, r7.xyzw, l(3, 3, 3, 3)\nbfi r6.xyzw, l(8, 8, 8, 8), l(8, 8, 8, 8), r7.xyzw, r6.xyzw\nushr r5.xyzw, r5.xyzw, l(20, 20, 20, 20)\nudiv r5.xyzw, null, r5.xyzw, l(3, 3, 3, 3)\nor r5.xyzw, r5.xyzw, r6.xyzw\nushr r3.yzw, r3.xxxx, l(0, 4, 8, 12)\nand r6.xyzw, r3.xyzw, l(15, 15, 15, 15)\nimad r5.xyzw, r6.xyzw, l(0x11000000, 0x11000000, 0x11000000, 0x11000000), r5.xyzw\nstore_raw U0[0].xyzw, r0.w, r5.xyzw\nimad r0.z, vThreadID.y, l(4), l(1)\nult r0.z, r0.z, CB0[0][2].y\nif_nz r0.z\n  iadd r3.y, r0.w, CB0[0][2].x\n  ushr r5.x, r4.x, l(8)\n  not r6.x, r5.x\n  ushr r6.yzw, r6.xxxx, l(0, 2, 4, 6)\n  and r6.xyzw, r6.xyzw, l(3, 3, 3, 3)\n  ushr r5.yzw, r5.xxxx, l(0, 2, 4, 6)\n  and r5.xyzw, r5.xyzw, l(3, 3, 3, 3)\n  imul null, r5.xyzw, r2.wwww, r5.xyzw\n  imad r5.xyzw, r6.xyzw, r2.zzzz, r5.xyzw\n  and r6.xyzw, r5.xyzw, l(1023, 1023, 1023, 1023)\n  udiv r6.xyzw, null, r6.xyzw, l(3, 3, 3, 3)\n  ishl r6.xyzw, r6.xyzw, l(16, 16, 16, 16)\n  ubfe r7.xyzw, l(10, 10, 10, 10), l(10, 10, 10, 10), r5.xyzw\n  udiv r7.xyzw, null, r7.xyzw, l(3, 3, 3, 3)\n  bfi r6.xyzw, l(8, 8, 8, 8), l(8, 8, 8, 8), r7.xyzw, r6.xyzw\n  ushr r5.xyzw, r5.xyzw, l(20, 20, 20, 20)\n  udiv r5.xyzw, null, r5.xyzw, l(3, 3, 3, 3)\n  or r5.xyzw, r5.xyzw, r6.xyzw\n  ubfe r6.xyzw, l(4, 4, 4, 4), l(16, 20, 24, 28), r3.xxxx\n  imad r5.xyzw, r6.xyzw, l(0x11000000, 0x11000000, 0x11000000, 0x11000000), r5.xyzw\n  store_raw U0[0].xyzw, r3.y, r5.xyzw\n  imad r3.x, vThreadID.y, l(4), l(2)\n  ult r3.x, r3.x, CB0[0][2].y\n  if_nz r3.x\n    ishl r3.x, CB0[0][2].x, l(1)\n    iadd r3.x, r0.w, r3.x\n    ushr r5.x, r4.x, l(16)\n    not r6.x, r5.x\n    ushr r6.yzw, r6.xxxx, l(0, 2, 4, 6)\n    and r6.xyzw, r6.xyzw, l(3, 3, 3, 3)\n    ushr r5.yzw, r5.xxxx, l(0, 2, 4, 6)\n    and r5.xyzw, r5.xyzw, l(3, 3, 3, 3)\n    imul null, r5.xyzw, r2.wwww, r5.xyzw\n    imad r5.xyzw, r6.xyzw, r2.zzzz, r5.xyzw\n    and r6.xyzw, r5.xyzw, l(1023, 1023, 1023, 1023)\n    udiv r6.xyzw, null, r6.xyzw, l(3, 3, 3, 3)\n    ishl r6.xyzw, r6.xyzw, l(16, 16, 16, 16)\n    ubfe r7.xyzw, l(10, 10, 10, 10), l(10, 10, 10, 10), r5.xyzw\n    udiv r7.xyzw, null, r7.xyzw, l(3, 3, 3, 3)\n    bfi r6.xyzw, l(8, 8, 8, 8), l(8, 8, 8, 8), r7.xyzw, r6.xyzw\n    ushr r5.xyzw, r5.xyzw, l(20, 20, 20, 20)\n    udiv r5.xyzw, null, r5.xyzw, l(3, 3, 3, 3)\n    or r5.xyzw, r5.xyzw, r6.xyzw\n    ushr r1.yzw, r1.xxxx, l(0, 4, 8, 12)\n    and r6.xyzw, r1.xyzw, l(15, 15, 15, 15)\n    imad r5.xyzw, r6.xyzw, l(0x11000000, 0x11000000, 0x11000000, 0x11000000), r5.xyzw\n    store_raw U0[0].xyzw, r3.x, r5.xyzw\n    imad r1.y, vThreadID.y, l(4), l(3)\n    ult r1.y, r1.y, CB0[0][2].y\n    if_nz r1.y\n      imad r1.y, l(3), CB0[0][2].x, r0.w\n      ushr r3.x, r4.x, l(24)\n      not r4.x, r3.x\n      ushr r4.yzw, r4.xxxx, l(0, 2, 4, 6)\n      and r4.xyzw, r4.xyzw, l(3, 3, 3, 3)\n      ushr r3.yzw, r3.xxxx, l(0, 2, 4, 6)\n      and r3.xyzw, r3.xyzw, l(3, 3, 3, 3)\n      imul null, r3.xyzw, r2.wwww, r3.xyzw\n      imad r3.xyzw, r4.xyzw, r2.zzzz, r3.xyzw\n      and r4.xyzw, r3.xyzw, l(1023, 1023, 1023, 1023)\n      udiv r4.xyzw, null, r4.xyzw, l(3, 3, 3, 3)\n      ishl r4.xyzw, r4.xyzw, l(16, 16, 16, 16)\n      ubfe r5.xyzw, l(10, 10, 10, 10), l(10, 10, 10, 10), r3.xyzw\n      udiv r5.xyzw, null, r5.xyzw, l(3, 3, 3, 3)\n      bfi r4.xyzw, l(8, 8, 8, 8), l(8, 8, 8, 8), r5.xyzw, r4.xyzw\n      ushr r3.xyzw, r3.xyzw, l(20, 20, 20, 20)\n      udiv r3.xyzw, null, r3.xyzw, l(3, 3, 3, 3)\n      or r3.xyzw, r3.xyzw, r4.xyzw\n      ubfe r4.xyzw, l(4, 4, 4, 4), l(16, 20, 24, 28), r1.xxxx\n      imad r3.xyzw, r4.xyzw, l(0x11000000, 0x11000000, 0x11000000, 0x11000000), r3.xyzw\n      store_raw U0[0].xyzw, r1.y, r3.xyzw\n    endif \n  endif \nendif \niadd r0.w, r0.w, l(16)\nif_nz r0.x\n  mov r0.x, l(32)\nelse \n  mov r0.x, l(16)\nendif \niadd r0.x, r0.x, r0.y\nld_raw r1.xyzw, r0.x, T0[0].yxzw\nif_nz r2.x\n  ishl r3.xyzw, r1.yxzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r1.yxzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r1.xyzw, r3.yxzw, r4.yxzw\nendif \nif_nz r2.y\n  ushr r2.xyzw, r1.yxzw, l(16, 16, 16, 16)\n  bfi r1.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r1.xyzw, r2.yxzw\n  mov r2.x, r1.y\nelse \n  mov r2.x, r1.y\nendif \nishl r3.xyz, r1.zzzz, l(3, 7, 12, 0)\nushr r4.xyz, r1.zzzz, l(13, 4, 9, 0)\nmov r3.w, r4.x\nand r0.xy, r3.xwxx, l(248, 248, 0, 0)\nmov r4.xw, r3.zzzy\nand r3.xy, r4.wzww, l(0x0003f000, 0x0003f000, 0, 0)\niadd r0.xy, r0.xyxx, r3.xyxx\nand r3.xy, r4.xyxx, l(0x0f800000, 0x0f800000, 0, 0)\niadd r0.xy, r0.xyxx, r3.xyxx\nushr r3.xy, r0.xyxx, l(5, 5, 0, 0)\nand r3.xy, r3.xyxx, l(0x00700007, 0x00700007, 0, 0)\niadd r0.xy, r0.xyxx, r3.xyxx\nushr r3.xy, r0.xyxx, l(6, 6, 0, 0)\nand r3.xy, r3.xyxx, l(3072, 3072, 0, 0)\niadd r0.xy, r0.xyxx, r3.xyxx\nishl r3.x, r1.w, l(1)\nushr r3.y, r1.w, l(1)\nand r3.xy, r3.xyxx, l(0xaaaaaaaa, 0x55555555, 0, 0)\niadd r3.x, r3.y, r3.x\nushr r3.y, r3.x, l(1)\nand r3.y, r3.y, l(0x55555555)\nxor r3.x, r3.y, r3.x\nnot r4.x, r3.x\nushr r4.yzw, r4.xxxx, l(0, 2, 4, 6)\nand r4.xyzw, r4.xyzw, l(3, 3, 3, 3)\nushr r3.yzw, r3.xxxx, l(0, 2, 4, 6)\nand r5.xyzw, r3.xyzw, l(3, 3, 3, 3)\nimul null, r5.xyzw, r0.yyyy, r5.xyzw\nimad r4.xyzw, r4.xyzw, r0.xxxx, r5.xyzw\nand r5.xyzw, r4.xyzw, l(1023, 1023, 1023, 1023)\nudiv r5.xyzw, null, r5.xyzw, l(3, 3, 3, 3)\nishl r5.xyzw, r5.xyzw, l(16, 16, 16, 16)\nubfe r6.xyzw, l(10, 10, 10, 10), l(10, 10, 10, 10), r4.xyzw\nudiv r6.xyzw, null, r6.xyzw, l(3, 3, 3, 3)\nbfi r5.xyzw, l(8, 8, 8, 8), l(8, 8, 8, 8), r6.xyzw, r5.xyzw\nushr r4.xyzw, r4.xyzw, l(20, 20, 20, 20)\nudiv r4.xyzw, null, r4.xyzw, l(3, 3, 3, 3)\nor r4.xyzw, r4.xyzw, r5.xyzw\nushr r2.yzw, r2.xxxx, l(0, 4, 8, 12)\nand r5.xyzw, r2.xyzw, l(15, 15, 15, 15)\nimad r4.xyzw, r5.xyzw, l(0x11000000, 0x11000000, 0x11000000, 0x11000000), r4.xyzw\nstore_raw U0[0].xyzw, r0.w, r4.xyzw\nif_nz r0.z\n  iadd r0.z, r0.w, CB0[0][2].x\n  ushr r4.x, r3.x, l(8)\n  not r5.x, r4.x\n  ushr r5.yzw, r5.xxxx, l(0, 2, 4, 6)\n  and r5.xyzw, r5.xyzw, l(3, 3, 3, 3)\n  ushr r4.yzw, r4.xxxx, l(0, 2, 4, 6)\n  and r4.xyzw, r4.xyzw, l(3, 3, 3, 3)\n  imul null, r4.xyzw, r0.yyyy, r4.xyzw\n  imad r4.xyzw, r5.xyzw, r0.xxxx, r4.xyzw\n  and r5.xyzw, r4.xyzw, l(1023, 1023, 1023, 1023)\n  udiv r5.xyzw, null, r5.xyzw, l(3, 3, 3, 3)\n  ishl r5.xyzw, r5.xyzw, l(16, 16, 16, 16)\n  ubfe r6.xyzw, l(10, 10, 10, 10), l(10, 10, 10, 10), r4.xyzw\n  udiv r6.xyzw, null, r6.xyzw, l(3, 3, 3, 3)\n  bfi r5.xyzw, l(8, 8, 8, 8), l(8, 8, 8, 8), r6.xyzw, r5.xyzw\n  ushr r4.xyzw, r4.xyzw, l(20, 20, 20, 20)\n  udiv r4.xyzw, null, r4.xyzw, l(3, 3, 3, 3)\n  or r4.xyzw, r4.xyzw, r5.xyzw\n  ubfe r2.xyzw, l(4, 4, 4, 4), l(16, 20, 24, 28), r2.xxxx\n  imad r2.xyzw, r2.xyzw, l(0x11000000, 0x11000000, 0x11000000, 0x11000000), r4.xyzw\n  store_raw U0[0].xyzw, r0.z, r2.xyzw\n  imad r0.z, vThreadID.y, l(4), l(2)\n  ult r0.z, r0.z, CB0[0][2].y\n  if_nz r0.z\n    ishl r0.z, CB0[0][2].x, l(1)\n    iadd r0.z, r0.z, r0.w\n    ushr r2.x, r3.x, l(16)\n    not r4.x, r2.x\n    ushr r4.yzw, r4.xxxx, l(0, 2, 4, 6)\n    and r4.xyzw, r4.xyzw, l(3, 3, 3, 3)\n    ushr r2.yzw, r2.xxxx, l(0, 2, 4, 6)\n    and r2.xyzw, r2.xyzw, l(3, 3, 3, 3)\n    imul null, r2.xyzw, r0.yyyy, r2.xyzw\n    imad r2.xyzw, r4.xyzw, r0.xxxx, r2.xyzw\n    and r4.xyzw, r2.xyzw, l(1023, 1023, 1023, 1023)\n    udiv r4.xyzw, null, r4.xyzw, l(3, 3, 3, 3)\n    ishl r4.xyzw, r4.xyzw, l(16, 16, 16, 16)\n    ubfe r5.xyzw, l(10, 10, 10, 10), l(10, 10, 10, 10), r2.xyzw\n    udiv r5.xyzw, null, r5.xyzw, l(3, 3, 3, 3)\n    bfi r4.xyzw, l(8, 8, 8, 8), l(8, 8, 8, 8), r5.xyzw, r4.xyzw\n    ushr r2.xyzw, r2.xyzw, l(20, 20, 20, 20)\n    udiv r2.xyzw, null, r2.xyzw, l(3, 3, 3, 3)\n    or r2.xyzw, r2.xyzw, r4.xyzw\n    ushr r1.yzw, r1.xxxx, l(0, 4, 8, 12)\n    and r4.xyzw, r1.xyzw, l(15, 15, 15, 15)\n    imad r2.xyzw, r4.xyzw, l(0x11000000, 0x11000000, 0x11000000, 0x11000000), r2.xyzw\n    store_raw U0[0].xyzw, r0.z, r2.xyzw\n    imad r0.z, vThreadID.y, l(4), l(3)\n    ult r0.z, r0.z, CB0[0][2].y\n    if_nz r0.z\n      imad r0.z, l(3), CB0[0][2].x, r0.w\n      ushr r2.x, r3.x, l(24)\n      not r3.x, r2.x\n      ushr r3.yzw, r3.xxxx, l(0, 2, 4, 6)\n      and r3.xyzw, r3.xyzw, l(3, 3, 3, 3)\n      ushr r2.yzw, r2.xxxx, l(0, 2, 4, 6)\n      and r2.xyzw, r2.xyzw, l(3, 3, 3, 3)\n      imul null, r2.xyzw, r0.yyyy, r2.xyzw\n      imad r2.xyzw, r3.xyzw, r0.xxxx, r2.xyzw\n      and r3.xyzw, r2.xyzw, l(1023, 1023, 1023, 1023)\n      udiv r3.xyzw, null, r3.xyzw, l(3, 3, 3, 3)\n      ishl r3.xyzw, r3.xyzw, l(16, 16, 16, 16)\n      ubfe r4.xyzw, l(10, 10, 10, 10), l(10, 10, 10, 10), r2.xyzw\n      udiv r4.xyzw, null, r4.xyzw, l(3, 3, 3, 3)\n      bfi r3.xyzw, l(8, 8, 8, 8), l(8, 8, 8, 8), r4.xyzw, r3.xyzw\n      ushr r2.xyzw, r2.xyzw, l(20, 20, 20, 20)\n      udiv r2.xyzw, null, r2.xyzw, l(3, 3, 3, 3)\n      or r2.xyzw, r2.xyzw, r3.xyzw\n      ubfe r1.xyzw, l(4, 4, 4, 4), l(16, 20, 24, 28), r1.xxxx\n      imad r1.xyzw, r1.xyzw, l(0x11000000, 0x11000000, 0x11000000, 0x11000000), r2.xyzw\n      store_raw U0[0].xyzw, r0.z, r1.xyzw\n    endif \n  endif \nendif \nret \n// Approximately 335 instruction slots used\n#endif\n\nconst BYTE texture_load_dxt3_rgba8_cs[] =\n{\n     68,  88,  66,  67,  70,  86, \n    117, 109, 192, 176,  26, 190, \n    189,  61, 117, 151,  81, 202, \n     79, 221,   1,   0,   0,   0, \n    116,  51,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n    216,  50,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n    156,  46,   0,   0,  81,   0, \n      5,   0, 167,  11,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   8,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  12,  50,   0,  16,   0, \n      0,   0,   0,   0,   6, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n    194,   0,  16,   0,   0,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0,   6, 132, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  11, \n     66,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10,  98,   0,  16,   0, \n      1,   0,   0,   0,   6,   1, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,   7, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     35,   0,   0,  10,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,   2,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  35,   0, \n      0,  11, 130,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     30,   0,   0,   9, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  58, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     31,   0,   0,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  42,   0, \n      2,   0,  26,   0,   2,   0, \n     35,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     42, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  41,   0,   0,   7, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     18,   0,   0,   1,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  12, 194,   0,  16,   0, \n      1,   0,   0,   0, 166, 142, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   5,   0,   0,   0, \n      4,   0,   0,   0,  42,   0, \n      0,   9, 242,   0,  16,   0, \n      2,   0,   0,   0, 102,   5, \n      2,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   1,   0,   0,   0, \n      3,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0, 139,   0, \n      0,   8, 130,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  27,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  10,   0,   2,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  19, 194,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   5,   0,   0,   0, \n      4,   0,   0,   0, 166,   6, \n      2,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  11,  66,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  25,   0, \n      0,   0,   1,  64,   0,   0, \n      7,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  87,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n    138,   0,   0,   9,  18,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  20,  98,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0, 166,  10, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,   9,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     64,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 139,   0, \n      0,  15,  50,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  27,   0,   0,   0, \n     24,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  86,   5,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   8,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  20,   0, \n      0,   0,   1,  64,   0,   0, \n     12,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  18,   0,   0,   1, \n     85,   0,   0,   9,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     42, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   5,   0,   0,   0, \n     42,   0,   0,   9, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     86,   5,   2,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n      1,   0,   0,   0,   4,   0, \n      0,   0,   3,   0,   0,   0, \n    139,   0,   0,   8,  66,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  27,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  10,   0, \n      2,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  20, \n    114,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,  11,   0, \n      0,   0,   0,   0,   0,   0, \n    214,   6,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  66,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  26,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0, 138,   0,   0,   9, \n     18,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  87,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  10,  66,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  26,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  64,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 139,   0,   0,  15, \n    194,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  27,   0,   0,   0, \n     24,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   4,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  21,   0, \n      0,   1,  30,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  22, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  32,   0, \n      0,  10, 114,   0,  16,   0, \n      2,   0,   0,   0, 166,  10, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   2,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   2,   0, \n      0,   0, 150,   5,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     22,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,  85,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  22,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      1,   0,   0,   0,  22,  14, \n     16,   0,   3,   0,   0,   0, \n     22,  14,  16,   0,   4,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     22,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  22,  14, \n     16,   0,   3,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   3,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  18,   0,   0,   1, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   3,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  21,   0,   0,   1, \n     41,   0,   0,  10, 114,   0, \n     16,   0,   4,   0,   0,   0, \n    166,  10,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   7,   0, \n      0,   0,  12,   0,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10, 114,   0,  16,   0, \n      5,   0,   0,   0, 166,  10, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  13,   0, \n      0,   0,   4,   0,   0,   0, \n      9,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n    130,   0,  16,   0,   4,   0, \n      0,   0,  10,   0,  16,   0, \n      5,   0,   0,   0,   1,   0, \n      0,  10, 194,   0,  16,   0, \n      2,   0,   0,   0,   6,  12, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    248,   0,   0,   0, 248,   0, \n      0,   0,  54,   0,   0,   5, \n    146,   0,  16,   0,   5,   0, \n      0,   0, 166,   6,  16,   0, \n      4,   0,   0,   0,   1,   0, \n      0,  10,  50,   0,  16,   0, \n      4,   0,   0,   0, 182,  15, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0, 240, \n      3,   0,   0, 240,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    194,   0,  16,   0,   2,   0, \n      0,   0, 166,  14,  16,   0, \n      2,   0,   0,   0,   6,   4, \n     16,   0,   4,   0,   0,   0, \n      1,   0,   0,  10,  50,   0, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128,  15,   0,   0, \n    128,  15,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 194,   0,  16,   0, \n      2,   0,   0,   0, 166,  14, \n     16,   0,   2,   0,   0,   0, \n      6,   4,  16,   0,   4,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   4,   0, \n      0,   0, 230,  10,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10,  50,   0, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0, 112,   0,   7,   0, \n    112,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 194,   0,  16,   0, \n      2,   0,   0,   0, 166,  14, \n     16,   0,   2,   0,   0,   0, \n      6,   4,  16,   0,   4,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   4,   0, \n      0,   0, 230,  10,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   6,   0,   0,   0, \n      6,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10,  50,   0, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,  12,   0,   0,   0,  12, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 194,   0,  16,   0, \n      2,   0,   0,   0, 166,  14, \n     16,   0,   2,   0,   0,   0, \n      6,   4,  16,   0,   4,   0, \n      0,   0,  41,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n    170, 170, 170, 170,  85,   0, \n      0,   7,  18,   0,  16,   0, \n      4,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   7, \n     18,   0,  16,   0,   4,   0, \n      0,   0,  10,   0,  16,   0, \n      4,   0,   0,   0,   1,  64, \n      0,   0,  85,  85,  85,  85, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      4,   0,   0,   0,  85,   0, \n      0,   7,  18,   0,  16,   0, \n      4,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   7, \n     18,   0,  16,   0,   4,   0, \n      0,   0,  10,   0,  16,   0, \n      4,   0,   0,   0,   1,  64, \n      0,   0,  85,  85,  85,  85, \n     87,   0,   0,   7,  18,   0, \n     16,   0,   4,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      4,   0,   0,   0,  59,   0, \n      0,   5,  18,   0,  16,   0, \n      5,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   5,   0,   0,   0, \n      6,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,   4,   0, \n      0,   0,   6,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n    242,   0,  16,   0,   6,   0, \n      0,   0, 246,  15,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     35,   0,   0,   9, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0, 166,  10,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n      6,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n      7,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     78,   0,   0,  11, 242,   0, \n     16,   0,   5,   0,   0,   0, \n      0, 208,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  60,   0,   0,   7, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   3,   0,   0,   0, \n      6,   0,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   4,   0, \n      0,   0,   8,   0,   0,   0, \n     12,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,  15,   0, \n      0,   0,  15,   0,   0,   0, \n     15,   0,   0,   0,  15,   0, \n      0,   0,  35,   0,   0,  12, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  17, \n      0,   0,   0,  17,   0,   0, \n      0,  17,   0,   0,   0,  17, \n     70,  14,  16,   0,   5,   0, \n      0,   0, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  35,   0, \n      0,   8,  66,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n      2,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     79,   0,   0,   9,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  26, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     30,   0,   0,   9,  34,   0, \n     16,   0,   3,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  10, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n     85,   0,   0,   7,  18,   0, \n     16,   0,   5,   0,   0,   0, \n     10,   0,  16,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  59,   0, \n      0,   5,  18,   0,  16,   0, \n      6,   0,   0,   0,  10,   0, \n     16,   0,   5,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   6,   0,   0,   0, \n      6,   0,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,   5,   0, \n      0,   0,   6,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n    242,   0,  16,   0,   5,   0, \n      0,   0, 246,  15,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     35,   0,   0,   9, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0, 166,  10,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n      6,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n      7,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     78,   0,   0,  11, 242,   0, \n     16,   0,   5,   0,   0,   0, \n      0, 208,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  60,   0,   0,   7, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   4,   0, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  20,   0, \n      0,   0,  24,   0,   0,   0, \n     28,   0,   0,   0,   6,   0, \n     16,   0,   3,   0,   0,   0, \n     35,   0,   0,  12, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,  17,   0,   0, \n      0,  17,   0,   0,   0,  17, \n      0,   0,   0,  17,  70,  14, \n     16,   0,   5,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  35,   0,   0,   8, \n     18,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,   2,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  79,   0, \n      0,   9,  18,   0,  16,   0, \n      3,   0,   0,   0,  10,   0, \n     16,   0,   3,   0,   0,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,  31,   0, \n      4,   3,  10,   0,  16,   0, \n      3,   0,   0,   0,  41,   0, \n      0,   9,  18,   0,  16,   0, \n      3,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      3,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   3,   0, \n      0,   0,  85,   0,   0,   7, \n     18,   0,  16,   0,   5,   0, \n      0,   0,  10,   0,  16,   0, \n      4,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n     59,   0,   0,   5,  18,   0, \n     16,   0,   6,   0,   0,   0, \n     10,   0,  16,   0,   5,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,   6,   0, \n      0,   0,   6,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      5,   0,   0,   0,   6,   0, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      4,   0,   0,   0,   6,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0, 242,   0,  16,   0, \n      5,   0,   0,   0, 246,  15, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  35,   0,   0,   9, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0, 166,  10, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n     78,   0,   0,  11, 242,   0, \n     16,   0,   6,   0,   0,   0, \n      0, 208,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     78,   0,   0,  11, 242,   0, \n     16,   0,   7,   0,   0,   0, \n      0, 208,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  78,   0,   0,  11, \n    242,   0,  16,   0,   5,   0, \n      0,   0,   0, 208,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  60,   0, \n      0,   7, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,   1,   0, \n      0,   0,   6,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   8,   0, \n      0,   0,  12,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     15,   0,   0,   0,  15,   0, \n      0,   0,  15,   0,   0,   0, \n     15,   0,   0,   0,  35,   0, \n      0,  12, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  17,   0,   0,   0,  17, \n      0,   0,   0,  17,   0,   0, \n      0,  17,  70,  14,  16,   0, \n      5,   0,   0,   0, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     35,   0,   0,   8,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,   2,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  79,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  31,   0,   4,   3, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  35,   0,   0,  11, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  85,   0, \n      0,   7,  18,   0,  16,   0, \n      3,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n      1,  64,   0,   0,  24,   0, \n      0,   0,  59,   0,   0,   5, \n     18,   0,  16,   0,   4,   0, \n      0,   0,  10,   0,  16,   0, \n      3,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      4,   0,   0,   0,   6,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      4,   0,   0,   0,   6,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   3,   0,   0,   0, \n      6,   0,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 242,   0, \n     16,   0,   3,   0,   0,   0, \n    246,  15,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  35,   0, \n      0,   9, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n    166,  10,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,  78,   0,   0,  11, \n    242,   0,  16,   0,   4,   0, \n      0,   0,   0, 208,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  78,   0,   0,  11, \n    242,   0,  16,   0,   5,   0, \n      0,   0,   0, 208,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n      3,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   7, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   4,   0, \n      0,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  20,   0,   0,   0, \n     24,   0,   0,   0,  28,   0, \n      0,   0,   6,   0,  16,   0, \n      1,   0,   0,   0,  35,   0, \n      0,  12, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  17,   0,   0,   0,  17, \n      0,   0,   0,  17,   0,   0, \n      0,  17,  70,  14,  16,   0, \n      3,   0,   0,   0, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     21,   0,   0,   1,  21,   0, \n      0,   1,  21,   0,   0,   1, \n     30,   0,   0,   7, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0,  31,   0, \n      4,   3,  10,   0,  16,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  32,   0,   0,   0, \n     18,   0,   0,   1,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n     21,   0,   0,   1,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  22, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  31,   0, \n      4,   3,  10,   0,  16,   0, \n      2,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  22,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     22,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  22,  14,  16,   0, \n      3,   0,   0,   0,  22,  14, \n     16,   0,   4,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      2,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  22,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  22,  14,  16,   0, \n      2,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     18,   0,   0,   1,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     21,   0,   0,   1,  41,   0, \n      0,  10, 114,   0,  16,   0, \n      3,   0,   0,   0, 166,  10, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   7,   0,   0,   0, \n     12,   0,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n    114,   0,  16,   0,   4,   0, \n      0,   0, 166,  10,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  13,   0,   0,   0, \n      4,   0,   0,   0,   9,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5, 130,   0, \n     16,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   4,   0, \n      0,   0,   1,   0,   0,  10, \n     50,   0,  16,   0,   0,   0, \n      0,   0, 198,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0, 248,   0,   0,   0, \n    248,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5, 146,   0, \n     16,   0,   4,   0,   0,   0, \n    166,   6,  16,   0,   3,   0, \n      0,   0,   1,   0,   0,  10, \n     50,   0,  16,   0,   3,   0, \n      0,   0, 182,  15,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0, 240,   3,   0, \n      0, 240,   3,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      3,   0,   0,   0,   1,   0, \n      0,  10,  50,   0,  16,   0, \n      3,   0,   0,   0,  70,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128,  15,   0,   0, 128,  15, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   3,   0,   0,   0, \n     85,   0,   0,  10,  50,   0, \n     16,   0,   3,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10,  50,   0,  16,   0, \n      3,   0,   0,   0,  70,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n    112,   0,   7,   0, 112,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   3,   0,   0,   0, \n     85,   0,   0,  10,  50,   0, \n     16,   0,   3,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      6,   0,   0,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10,  50,   0,  16,   0, \n      3,   0,   0,   0,  70,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,  12, \n      0,   0,   0,  12,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   3,   0,   0,   0, \n     41,   0,   0,   7,  18,   0, \n     16,   0,   3,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  85,   0, \n      0,   7,  34,   0,  16,   0, \n      3,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,  10, \n     50,   0,  16,   0,   3,   0, \n      0,   0,  70,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0, 170, 170, 170, 170, \n     85,  85,  85,  85,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  18,   0, \n     16,   0,   3,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,  10,   0,  16,   0, \n      3,   0,   0,   0,  85,   0, \n      0,   7,  34,   0,  16,   0, \n      3,   0,   0,   0,  10,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   7, \n     34,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,  85,  85,  85,  85, \n     87,   0,   0,   7,  18,   0, \n     16,   0,   3,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,  10,   0,  16,   0, \n      3,   0,   0,   0,  59,   0, \n      0,   5,  18,   0,  16,   0, \n      4,   0,   0,   0,  10,   0, \n     16,   0,   3,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   4,   0,   0,   0, \n      6,   0,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,   3,   0, \n      0,   0,   6,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  86,   5,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     35,   0,   0,   9, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   6,   0,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n      5,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n      6,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     78,   0,   0,  11, 242,   0, \n     16,   0,   4,   0,   0,   0, \n      0, 208,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  60,   0,   0,   7, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   2,   0,   0,   0, \n      6,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   4,   0, \n      0,   0,   8,   0,   0,   0, \n     12,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  15,   0, \n      0,   0,  15,   0,   0,   0, \n     15,   0,   0,   0,  15,   0, \n      0,   0,  35,   0,   0,  12, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  17, \n      0,   0,   0,  17,   0,   0, \n      0,  17,   0,   0,   0,  17, \n     70,  14,  16,   0,   4,   0, \n      0,   0, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   9,  66,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,  85,   0, \n      0,   7,  18,   0,  16,   0, \n      4,   0,   0,   0,  10,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   8,   0, \n      0,   0,  59,   0,   0,   5, \n     18,   0,  16,   0,   5,   0, \n      0,   0,  10,   0,  16,   0, \n      4,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      5,   0,   0,   0,   6,   0, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      4,   0,   0,   0,   6,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   4,   0,   0,   0, \n      6,   0,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  35,   0, \n      0,   9, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      6,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,  78,   0,   0,  11, \n    242,   0,  16,   0,   5,   0, \n      0,   0,   0, 208,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  78,   0,   0,  11, \n    242,   0,  16,   0,   6,   0, \n      0,   0,   0, 208,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n      4,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   7, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   4,   0, \n      0,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  20,   0,   0,   0, \n     24,   0,   0,   0,  28,   0, \n      0,   0,   6,   0,  16,   0, \n      2,   0,   0,   0,  35,   0, \n      0,  12, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  17,   0,   0,   0,  17, \n      0,   0,   0,  17,   0,   0, \n      0,  17,  70,  14,  16,   0, \n      4,   0,   0,   0, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,   8,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,   2,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,  79,   0,   0,   9, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  31,   0,   4,   3, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  41,   0,   0,   9, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  10, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     85,   0,   0,   7,  18,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0,  59,   0, \n      0,   5,  18,   0,  16,   0, \n      4,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   4,   0,   0,   0, \n      6,   0,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,   2,   0, \n      0,   0,   6,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  86,   5,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,   9, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   6,   0,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n      4,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n      5,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     78,   0,   0,  11, 242,   0, \n     16,   0,   2,   0,   0,   0, \n      0, 208,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  60,   0,   0,   7, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   1,   0,   0,   0, \n      6,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   4,   0, \n      0,   0,   8,   0,   0,   0, \n     12,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  15,   0, \n      0,   0,  15,   0,   0,   0, \n     15,   0,   0,   0,  15,   0, \n      0,   0,  35,   0,   0,  12, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  17, \n      0,   0,   0,  17,   0,   0, \n      0,  17,   0,   0,   0,  17, \n     70,  14,  16,   0,   2,   0, \n      0,   0, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  35,   0, \n      0,   8,  66,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n      2,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     79,   0,   0,   9,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  26, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     35,   0,   0,  11,  66,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  10, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,   7, \n     18,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,  24,   0,   0,   0, \n     59,   0,   0,   5,  18,   0, \n     16,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,   3,   0, \n      0,   0,   6,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      2,   0,   0,   0,   6,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      4,   0,   0,   0,   6,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0, 242,   0,  16,   0, \n      2,   0,   0,   0,  86,   5, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  35,   0,   0,   9, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   6,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n     78,   0,   0,  11, 242,   0, \n     16,   0,   3,   0,   0,   0, \n      0, 208,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     78,   0,   0,  11, 242,   0, \n     16,   0,   4,   0,   0,   0, \n      0, 208,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  78,   0,   0,  11, \n    242,   0,  16,   0,   2,   0, \n      0,   0,   0, 208,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  60,   0, \n      0,   7, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,   4,   0, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     20,   0,   0,   0,  24,   0, \n      0,   0,  28,   0,   0,   0, \n      6,   0,  16,   0,   1,   0, \n      0,   0,  35,   0,   0,  12, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,  17, \n      0,   0,   0,  17,   0,   0, \n      0,  17,   0,   0,   0,  17, \n     70,  14,  16,   0,   2,   0, \n      0,   0, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  21,   0, \n      0,   1,  21,   0,   0,   1, \n     21,   0,   0,   1,  62,   0, \n      0,   1,  83,  84,  65,  84, \n    148,   0,   0,   0,  79,   1, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     86,   0,   0,   0, 151,   0, \n      0,   0,   7,   0,   0,   0, \n     14,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_dxt3a_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 7\ndcl_thread_group 4, 32, 1\nand r0.xy, CB0[0][0].xxxx, l(1, 2, 0, 0)\nishl r1.x, vThreadID.x, l(2)\nmov r1.y, vThreadID.y\nuge r0.zw, r1.xxxy, CB0[0][1].xxxy\nor r0.z, r0.w, r0.z\nif_nz r0.z\n  ret \nendif \nubfe r0.z, l(2), l(2), CB0[0][0].x\nishl r1.yz, r1.xxyx, l(0, 2, 2, 0)\nimad r0.w, vThreadID.z, CB0[0][2].y, r1.z\nimad r0.w, r0.w, CB0[0][2].x, r1.y\niadd r0.w, r0.w, CB0[0][1].w\nif_z r0.x\n  imad r1.y, CB0[0][0].w, vThreadID.z, vThreadID.y\n  imad r1.y, CB0[0][0].z, r1.y, r1.x\n  ishl r1.y, r1.y, l(3)\nelse \n  if_nz r0.y\n    ushr r1.zw, CB0[0][0].zzzw, l(0, 0, 5, 4)\n    ishr r2.xyzw, vThreadID.zyyy, l(2, 4, 1, 3)\n    imad r0.y, r2.x, r1.w, r2.y\n    ibfe r1.w, l(27), l(3), vThreadID.x\n    imad r0.y, r0.y, r1.z, r1.w\n    bfi r1.zw, l(0, 0, 2, 1), l(0, 0, 5, 4), vThreadID.zzzy, l(0, 0, 0, 0)\n    bfi r2.y, l(2), l(3), r2.z, l(0)\n    iadd r1.z, r1.z, r2.y\n    bfi r1.z, l(3), l(0), r1.x, r1.z\n    bfi r0.y, l(25), l(7), r0.y, r1.z\n    xor r1.z, r2.x, r2.w\n    ubfe r2.x, l(2), l(3), r1.x\n    bfi r2.yz, l(0, 1, 1, 0), l(0, 1, 11, 0), r1.zzzz, l(0, 0, 0, 0)\n    xor r1.z, r2.y, r2.x\n    imad r1.z, r1.z, l(64), r1.w\n    iadd r1.z, r2.z, r1.z\n    ibfe r2.xy, l(27, 24, 0, 0), l(2, 5, 0, 0), r0.yyyy\n    bfi r0.y, l(3), l(8), r2.x, r1.z\n    bfi r1.y, l(20), l(12), r2.y, r0.y\n  else \n    ushr r0.y, CB0[0][0].z, l(5)\n    ishr r2.xyzw, vThreadID.yyyy, l(5, 1, 4, 3)\n    ibfe r1.z, l(27), l(3), vThreadID.x\n    imad r0.y, r2.x, r0.y, r1.z\n    bfi r2.xyz, l(3, 1, 1, 0), l(3, 1, 11, 0), r2.ywzy, l(0, 0, 0, 0)\n    bfi r1.z, l(3), l(0), r1.x, r2.x\n    bfi r0.y, l(26), l(6), r0.y, r1.z\n    ubfe r1.x, l(2), l(3), r1.x\n    xor r1.x, r2.y, r1.x\n    bfi r1.z, l(1), l(4), vThreadID.y, l(0)\n    imad r1.x, r1.x, l(64), r1.z\n    iadd r1.x, r2.z, r1.x\n    ibfe r1.zw, l(0, 0, 27, 24), l(0, 0, 2, 5), r0.yyyy\n    bfi r0.y, l(3), l(8), r1.z, r1.x\n    bfi r1.y, l(20), l(12), r1.w, r0.y\n  endif \nendif \niadd r0.y, r1.y, CB0[0][0].y\nld_raw r1.xyzw, r0.y, T0[0].ywxz\nieq r2.xyz, r0.zzzz, l(1, 2, 3, 0)\nor r2.xy, r2.yzyy, r2.xyxx\nif_nz r2.x\n  ishl r3.xyzw, r1.zxwy, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r1.zxwy, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r1.xyzw, r3.ywxz, r4.ywxz\nendif \nif_nz r2.y\n  ushr r3.xyzw, r1.zxwy, l(16, 16, 16, 16)\n  bfi r1.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r1.xyzw, r3.ywxz\n  mov r3.xy, r1.zwzz\nelse \n  mov r3.xy, r1.zwzz\nendif \nif_nz r0.x\n  mov r0.x, l(32)\nelse \n  mov r0.x, l(16)\nendif \niadd r0.x, r0.x, r0.y\nld_raw r4.xyzw, r0.x, T0[0].xyzw\nif_nz r2.x\n  ishl r5.xyzw, r4.xyzw, l(8, 8, 8, 8)\n  and r5.xyzw, r5.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r6.xyzw, r4.xyzw, l(8, 8, 8, 8)\n  and r6.xyzw, r6.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r4.xyzw, r5.xyzw, r6.xyzw\nendif \nif_nz r2.y\n  ushr r2.xyzw, r4.xyzw, l(16, 16, 16, 16)\n  bfi r2.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r4.xyzw, r2.xyzw\n  mov r3.zw, r2.xxxz\n  mov r1.zw, r2.yyyw\nelse \n  mov r3.zw, r4.xxxz\n  mov r1.zw, r4.yyyw\nendif \nbfi r2.xyzw, l(8, 8, 8, 8), l(4, 4, 4, 4), r3.xyzw, l(0, 0, 0, 0)\nbfi r2.xyzw, l(4, 4, 4, 4), l(0, 0, 0, 0), r3.xyzw, r2.xyzw\nishl r4.xyzw, r3.xyzw, l(8, 8, 8, 8)\nand r4.xyzw, r4.xyzw, l(0x000ff000, 0x000ff000, 0x000ff000, 0x000ff000)\niadd r2.xyzw, r2.xyzw, r4.xyzw\nishl r4.xyzw, r3.xyzw, l(12, 12, 12, 12)\nand r4.xyzw, r4.xyzw, l(0x0ff00000, 0x0ff00000, 0x0ff00000, 0x0ff00000)\niadd r2.xyzw, r2.xyzw, r4.xyzw\nishl r4.xyzw, r3.xyzw, l(16, 16, 16, 16)\nbfi r2.xyzw, l(28, 28, 28, 28), l(0, 0, 0, 0), r2.xyzw, r4.xyzw\nstore_raw U0[0].xyzw, r0.w, r2.xyzw\nimad r0.x, vThreadID.y, l(4), l(1)\nult r0.y, r0.x, CB0[0][2].y\nif_nz r0.y\n  iadd r0.y, r0.w, CB0[0][2].x\n  ushr r2.xyzw, r3.xyzw, l(16, 16, 16, 16)\n  bfi r4.xyzw, l(8, 8, 8, 8), l(4, 4, 4, 4), r2.xyzw, l(0, 0, 0, 0)\n  bfi r4.xyzw, l(4, 4, 4, 4), l(0, 0, 0, 0), r2.xyzw, r4.xyzw\n  ishl r5.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r5.xyzw, r5.xyzw, l(0x000ff000, 0x000ff000, 0x000ff000, 0x000ff000)\n  iadd r4.xyzw, r4.xyzw, r5.xyzw\n  ishl r2.xyzw, r2.xyzw, l(12, 12, 12, 12)\n  bfi r2.xyzw, l(20, 20, 20, 20), l(0, 0, 0, 0), r4.xyzw, r2.xyzw\n  bfi r2.xyzw, l(28, 28, 28, 28), l(0, 0, 0, 0), r2.xyzw, r3.xyzw\n  store_raw U0[0].xyzw, r0.y, r2.xyzw\n  iadd r0.x, r0.x, l(1)\n  ult r0.z, r0.x, CB0[0][2].y\n  if_nz r0.z\n    iadd r0.y, r0.y, CB0[0][2].x\n    bfi r2.xyzw, l(8, 8, 8, 8), l(4, 4, 4, 4), r1.xyzw, l(0, 0, 0, 0)\n    bfi r2.xyzw, l(4, 4, 4, 4), l(0, 0, 0, 0), r1.xyzw, r2.xyzw\n    ishl r3.xyzw, r1.xyzw, l(8, 8, 8, 8)\n    and r3.xyzw, r3.xyzw, l(0x000ff000, 0x000ff000, 0x000ff000, 0x000ff000)\n    iadd r2.xyzw, r2.xyzw, r3.xyzw\n    ishl r3.xyzw, r1.xyzw, l(12, 12, 12, 12)\n    and r3.xyzw, r3.xyzw, l(0x0ff00000, 0x0ff00000, 0x0ff00000, 0x0ff00000)\n    iadd r2.xyzw, r2.xyzw, r3.xyzw\n    ishl r3.xyzw, r1.xyzw, l(16, 16, 16, 16)\n    bfi r2.xyzw, l(28, 28, 28, 28), l(0, 0, 0, 0), r2.xyzw, r3.xyzw\n    store_raw U0[0].xyzw, r0.y, r2.xyzw\n    or r0.x, r0.x, l(3)\n    ult r0.x, r0.x, CB0[0][2].y\n    if_nz r0.x\n      iadd r0.x, r0.y, CB0[0][2].x\n      ushr r2.xyzw, r1.xyzw, l(16, 16, 16, 16)\n      bfi r3.xyzw, l(8, 8, 8, 8), l(4, 4, 4, 4), r2.xyzw, l(0, 0, 0, 0)\n      bfi r3.xyzw, l(4, 4, 4, 4), l(0, 0, 0, 0), r2.xyzw, r3.xyzw\n      ishl r4.xyzw, r2.xyzw, l(8, 8, 8, 8)\n      and r4.xyzw, r4.xyzw, l(0x000ff000, 0x000ff000, 0x000ff000, 0x000ff000)\n      iadd r3.xyzw, r3.xyzw, r4.xyzw\n      ishl r2.xyzw, r2.xyzw, l(12, 12, 12, 12)\n      bfi r2.xyzw, l(20, 20, 20, 20), l(0, 0, 0, 0), r3.xyzw, r2.xyzw\n      bfi r1.xyzw, l(28, 28, 28, 28), l(0, 0, 0, 0), r2.xyzw, r1.xyzw\n      store_raw U0[0].xyzw, r0.x, r1.xyzw\n    endif \n  endif \nendif \nret \n// Approximately 155 instruction slots used\n#endif\n\nconst BYTE texture_load_dxt3a_cs[] =\n{\n     68,  88,  66,  67, 183,  61, \n     37,  88, 240,  47, 113,  35, \n     26,  30, 127, 204, 250, 161, \n    138, 192,   1,   0,   0,   0, \n     72,  26,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n    172,  25,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n    112,  21,   0,   0,  81,   0, \n      5,   0,  92,   5,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   7,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  12,  50,   0,  16,   0, \n      0,   0,   0,   0,   6, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n    194,   0,  16,   0,   0,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0,   6, 132, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  11, \n     66,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10,  98,   0,  16,   0, \n      1,   0,   0,   0,   6,   1, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,  35,   0,   0,  10, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,   2,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     35,   0,   0,  11, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  10, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   9, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  58, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  31,   0,   0,   3, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  58, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     42,   0,   2,   0,  26,   0, \n      2,   0,  35,   0,   0,  11, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  42, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  41,   0, \n      0,   7,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  18,   0,   0,   1, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     85,   0,   0,  12, 194,   0, \n     16,   0,   1,   0,   0,   0, \n    166, 142,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   5,   0, \n      0,   0,   4,   0,   0,   0, \n     42,   0,   0,   9, 242,   0, \n     16,   0,   2,   0,   0,   0, \n    102,   5,   2,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n      4,   0,   0,   0,   1,   0, \n      0,   0,   3,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n    139,   0,   0,   8, 130,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  27,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  10,   0, \n      2,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  19, \n    194,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   5,   0, \n      0,   0,   4,   0,   0,   0, \n    166,   6,   2,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n    140,   0,   0,  11,  66,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     25,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  87,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0, 138,   0,   0,   9, \n     18,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  20, \n     98,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  11,   0, \n      0,   0,   0,   0,   0,   0, \n    166,  10,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  87,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  64,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    139,   0,   0,  15,  50,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  27,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   5,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  18,   0, \n      0,   1,  85,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  42,   0,   0,   9, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  86,   5,   2,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   1,   0,   0,   0, \n      4,   0,   0,   0,   3,   0, \n      0,   0, 139,   0,   0,   8, \n     66,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     27,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     10,   0,   2,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  20, 114,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0, 214,   6,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  66,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     26,   0,   0,   0,   1,  64, \n      0,   0,   6,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 138,   0, \n      0,   9,  18,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  87,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  10, \n     66,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     26,   0,   2,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     64,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0, 139,   0, \n      0,  15, 194,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  27,   0, \n      0,   0,  24,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   5,   0, \n      0,   0,  86,   5,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   8,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  20,   0, \n      0,   0,   1,  64,   0,   0, \n     12,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     21,   0,   0,   1,  30,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n    214, 120,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     32,   0,   0,  10, 114,   0, \n     16,   0,   2,   0,   0,   0, \n    166,  10,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,  60,   0, \n      0,   7,  50,   0,  16,   0, \n      2,   0,   0,   0, 150,   5, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,   2,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  38,   7,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  38,   7, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   1,   0,   0,   0, \n    214,   8,  16,   0,   3,   0, \n      0,   0, 214,   8,  16,   0, \n      4,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  38,   7,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n    214,   8,  16,   0,   3,   0, \n      0,   0,  54,   0,   0,   5, \n     50,   0,  16,   0,   3,   0, \n      0,   0, 230,  10,  16,   0, \n      1,   0,   0,   0,  18,   0, \n      0,   1,  54,   0,   0,   5, \n     50,   0,  16,   0,   3,   0, \n      0,   0, 230,  10,  16,   0, \n      1,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     32,   0,   0,   0,  18,   0, \n      0,   1,  54,   0,   0,   5, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0,  21,   0, \n      0,   1,  30,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  54,   0,   0,   5, \n    194,   0,  16,   0,   3,   0, \n      0,   0,   6,   8,  16,   0, \n      2,   0,   0,   0,  54,   0, \n      0,   5, 194,   0,  16,   0, \n      1,   0,   0,   0,  86,  13, \n     16,   0,   2,   0,   0,   0, \n     18,   0,   0,   1,  54,   0, \n      0,   5, 194,   0,  16,   0, \n      3,   0,   0,   0,   6,   8, \n     16,   0,   4,   0,   0,   0, \n     54,   0,   0,   5, 194,   0, \n     16,   0,   1,   0,   0,   0, \n     86,  13,  16,   0,   4,   0, \n      0,   0,  21,   0,   0,   1, \n    140,   0,   0,  20, 242,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,   4,   0, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,   4,   0, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0, 240,  15,   0, \n      0, 240,  15,   0,   0, 240, \n     15,   0,   0, 240,  15,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,  12,   0, \n      0,   0,  12,   0,   0,   0, \n     12,   0,   0,   0,  12,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 240,  15, \n      0,   0, 240,  15,   0,   0, \n    240,  15,   0,   0, 240,  15, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     28,   0,   0,   0,  28,   0, \n      0,   0,  28,   0,   0,   0, \n     28,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,   8,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,   2,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  79,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  30,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    140,   0,   0,  20, 242,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,   4,   0, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,   4,   0, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   0, 240,  15,   0, \n      0, 240,  15,   0,   0, 240, \n     15,   0,   0, 240,  15,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  12,   0, \n      0,   0,  12,   0,   0,   0, \n     12,   0,   0,   0,  12,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  28,   0,   0,   0, \n     28,   0,   0,   0,  28,   0, \n      0,   0,  28,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     79,   0,   0,   9,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  26, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     30,   0,   0,   9,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  10, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n    140,   0,   0,  20, 242,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,   4,   0, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,   4,   0, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0, 240,  15,   0, \n      0, 240,  15,   0,   0, 240, \n     15,   0,   0, 240,  15,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  12,   0, \n      0,   0,  12,   0,   0,   0, \n     12,   0,   0,   0,  12,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 240,  15, \n      0,   0, 240,  15,   0,   0, \n    240,  15,   0,   0, 240,  15, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     28,   0,   0,   0,  28,   0, \n      0,   0,  28,   0,   0,   0, \n     28,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     60,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  79,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,  31,   0, \n      4,   3,  10,   0,  16,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 140,   0,   0,  20, \n    242,   0,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   4,   0, \n      0,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   4,   0, \n      0,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0, 240, \n     15,   0,   0, 240,  15,   0, \n      0, 240,  15,   0,   0, 240, \n     15,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     12,   0,   0,   0,  12,   0, \n      0,   0,  12,   0,   0,   0, \n     12,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  28,   0, \n      0,   0,  28,   0,   0,   0, \n     28,   0,   0,   0,  28,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  21,   0, \n      0,   1,  21,   0,   0,   1, \n     21,   0,   0,   1,  62,   0, \n      0,   1,  83,  84,  65,  84, \n    148,   0,   0,   0, 155,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     46,   0,   0,   0,  29,   0, \n      0,   0,   7,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   9,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   4,   0, \n      0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_dxt3aas1111_argb4_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 10\ndcl_thread_group 4, 32, 1\nand r0.xy, CB0[0][0].xxxx, l(1, 2, 0, 0)\nishl r1.x, vThreadID.x, l(2)\nmov r1.y, vThreadID.y\nuge r0.zw, r1.xxxy, CB0[0][1].xxxy\nor r0.z, r0.w, r0.z\nif_nz r0.z\n  ret \nendif \nubfe r0.z, l(2), l(2), CB0[0][0].x\nishl r1.yz, r1.xxyx, l(0, 2, 2, 0)\nishl r0.w, r1.y, l(1)\nimad r1.y, vThreadID.z, CB0[0][2].y, r1.z\nimad r0.w, r1.y, CB0[0][2].x, r0.w\niadd r0.w, r0.w, CB0[0][1].w\nif_z r0.x\n  imad r1.y, CB0[0][0].w, vThreadID.z, vThreadID.y\n  imad r1.y, CB0[0][0].z, r1.y, r1.x\n  ishl r1.y, r1.y, l(3)\nelse \n  if_nz r0.y\n    ushr r1.zw, CB0[0][0].zzzw, l(0, 0, 5, 4)\n    ishr r2.xyzw, vThreadID.zyyy, l(2, 4, 1, 3)\n    imad r0.y, r2.x, r1.w, r2.y\n    ibfe r1.w, l(27), l(3), vThreadID.x\n    imad r0.y, r0.y, r1.z, r1.w\n    bfi r1.zw, l(0, 0, 2, 1), l(0, 0, 5, 4), vThreadID.zzzy, l(0, 0, 0, 0)\n    bfi r2.y, l(2), l(3), r2.z, l(0)\n    iadd r1.z, r1.z, r2.y\n    bfi r1.z, l(3), l(0), r1.x, r1.z\n    bfi r0.y, l(25), l(7), r0.y, r1.z\n    xor r1.z, r2.x, r2.w\n    ubfe r2.x, l(2), l(3), r1.x\n    bfi r2.yz, l(0, 1, 1, 0), l(0, 1, 11, 0), r1.zzzz, l(0, 0, 0, 0)\n    xor r1.z, r2.y, r2.x\n    imad r1.z, r1.z, l(64), r1.w\n    iadd r1.z, r2.z, r1.z\n    ibfe r2.xy, l(27, 24, 0, 0), l(2, 5, 0, 0), r0.yyyy\n    bfi r0.y, l(3), l(8), r2.x, r1.z\n    bfi r1.y, l(20), l(12), r2.y, r0.y\n  else \n    ushr r0.y, CB0[0][0].z, l(5)\n    ishr r2.xyzw, vThreadID.yyyy, l(5, 1, 4, 3)\n    ibfe r1.z, l(27), l(3), vThreadID.x\n    imad r0.y, r2.x, r0.y, r1.z\n    bfi r2.xyz, l(3, 1, 1, 0), l(3, 1, 11, 0), r2.ywzy, l(0, 0, 0, 0)\n    bfi r1.z, l(3), l(0), r1.x, r2.x\n    bfi r0.y, l(26), l(6), r0.y, r1.z\n    ubfe r1.x, l(2), l(3), r1.x\n    xor r1.x, r2.y, r1.x\n    bfi r1.z, l(1), l(4), vThreadID.y, l(0)\n    imad r1.x, r1.x, l(64), r1.z\n    iadd r1.x, r2.z, r1.x\n    ibfe r1.zw, l(0, 0, 27, 24), l(0, 0, 2, 5), r0.yyyy\n    bfi r0.y, l(3), l(8), r1.z, r1.x\n    bfi r1.y, l(20), l(12), r1.w, r0.y\n  endif \nendif \niadd r0.y, r1.y, CB0[0][0].y\nld_raw r1.xyzw, r0.y, T0[0].ywxz\nieq r2.xyz, r0.zzzz, l(1, 2, 3, 0)\nor r2.xy, r2.yzyy, r2.xyxx\nif_nz r2.x\n  ishl r3.xyzw, r1.zxwy, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r1.zxwy, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r1.xyzw, r3.ywxz, r4.ywxz\nendif \nif_nz r2.y\n  ushr r3.xyzw, r1.zxwy, l(16, 16, 16, 16)\n  bfi r1.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r1.xyzw, r3.ywxz\n  mov r3.xy, r1.zwzz\nelse \n  mov r3.xy, r1.zwzz\nendif \nif_nz r0.x\n  mov r0.x, l(32)\nelse \n  mov r0.x, l(16)\nendif \niadd r0.x, r0.x, r0.y\nld_raw r4.xyzw, r0.x, T0[0].xzyw\nif_nz r2.x\n  ishl r5.xyzw, r4.xzyw, l(8, 8, 8, 8)\n  and r5.xyzw, r5.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r6.xyzw, r4.xzyw, l(8, 8, 8, 8)\n  and r6.xyzw, r6.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r4.xyzw, r5.xzyw, r6.xzyw\nendif \nif_nz r2.y\n  ushr r2.xyzw, r4.xzyw, l(16, 16, 16, 16)\n  bfi r4.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r4.xyzw, r2.xzyw\n  mov r2.zw, r4.xxxy\nelse \n  mov r2.zw, r4.xxxy\nendif \nushr r5.xyzw, r3.xxyy, l(3, 11, 3, 11)\nbfi r5.xyzw, l(1, 1, 1, 1), l(4, 4, 4, 4), r5.xyzw, l(0, 0, 0, 0)\nushr r6.xyzw, r3.xxyy, l(7, 15, 7, 15)\nbfi r6.xyzw, l(1, 1, 1, 1), l(20, 20, 20, 20), r6.xyzw, l(0, 0, 0, 0)\niadd r5.xyzw, r5.xyzw, r6.xyzw\nushr r6.xyzw, r3.xxyy, l(2, 10, 2, 10)\nbfi r5.xyzw, l(1, 1, 1, 1), l(8, 8, 8, 8), r6.xyzw, r5.xyzw\nushr r6.xyzw, r3.xxyy, l(6, 14, 6, 14)\nbfi r6.xyzw, l(1, 1, 1, 1), l(24, 24, 24, 24), r6.xyzw, l(0, 0, 0, 0)\niadd r5.xyzw, r5.xyzw, r6.xyzw\nushr r6.xyzw, r3.xxyy, l(1, 9, 1, 9)\nbfi r5.xyzw, l(1, 1, 1, 1), l(12, 12, 12, 12), r6.xyzw, r5.xyzw\nushr r6.xyzw, r3.xxyy, l(5, 13, 5, 13)\nbfi r7.xyzw, l(1, 1, 1, 1), l(28, 28, 28, 28), r6.xyzw, l(0, 0, 0, 0)\niadd r7.xyzw, r5.xyzw, r7.xyzw\nushr r3.zw, r3.xxxy, l(0, 0, 8, 8)\nbfi r7.xyzw, l(1, 1, 1, 1), l(0, 0, 0, 0), r3.xzyw, r7.xyzw\nushr r8.xyzw, r3.xxyy, l(4, 12, 4, 12)\nbfi r7.xyzw, l(1, 1, 1, 1), l(16, 16, 16, 16), r8.xyzw, r7.xyzw\nbfi r6.xyzw, l(1, 1, 1, 1), l(29, 29, 29, 29), r6.xyzw, l(0, 0, 0, 0)\nimad r5.xyzw, r5.xyzw, l(2, 2, 2, 2), r6.xyzw\nbfi r5.xyzw, l(1, 1, 1, 1), l(1, 1, 1, 1), r3.xzyw, r5.xyzw\nbfi r5.xyzw, l(1, 1, 1, 1), l(17, 17, 17, 17), r8.xyzw, r5.xyzw\niadd r5.xyzw, r5.xyzw, r7.xyzw\nishl r6.xyzw, r5.xyzw, l(2, 2, 2, 2)\niadd r5.xyzw, r5.xyzw, r6.xyzw\nstore_raw U0[0].xyzw, r0.w, r5.xyzw\niadd r0.x, r0.w, l(16)\nushr r5.xyzw, r2.zzww, l(3, 11, 3, 11)\nbfi r5.xyzw, l(1, 1, 1, 1), l(4, 4, 4, 4), r5.xyzw, l(0, 0, 0, 0)\nushr r6.xyzw, r2.zzww, l(7, 15, 7, 15)\nbfi r6.xyzw, l(1, 1, 1, 1), l(20, 20, 20, 20), r6.xyzw, l(0, 0, 0, 0)\niadd r5.xyzw, r5.xyzw, r6.xyzw\nushr r6.xyzw, r2.zzww, l(2, 10, 2, 10)\nbfi r5.xyzw, l(1, 1, 1, 1), l(8, 8, 8, 8), r6.xyzw, r5.xyzw\nushr r6.xyzw, r2.zzww, l(6, 14, 6, 14)\nbfi r6.xyzw, l(1, 1, 1, 1), l(24, 24, 24, 24), r6.xyzw, l(0, 0, 0, 0)\niadd r5.xyzw, r5.xyzw, r6.xyzw\nushr r6.xyzw, r2.zzww, l(1, 9, 1, 9)\nbfi r5.xyzw, l(1, 1, 1, 1), l(12, 12, 12, 12), r6.xyzw, r5.xyzw\nushr r6.xyzw, r2.zzww, l(5, 13, 5, 13)\nbfi r7.xyzw, l(1, 1, 1, 1), l(28, 28, 28, 28), r6.xyzw, l(0, 0, 0, 0)\niadd r7.xyzw, r5.xyzw, r7.xyzw\nushr r2.xy, r2.zwzz, l(8, 8, 0, 0)\nbfi r7.xyzw, l(1, 1, 1, 1), l(0, 0, 0, 0), r2.zxwy, r7.xyzw\nushr r8.xyzw, r2.zzww, l(4, 12, 4, 12)\nbfi r7.xyzw, l(1, 1, 1, 1), l(16, 16, 16, 16), r8.xyzw, r7.xyzw\nbfi r6.xyzw, l(1, 1, 1, 1), l(29, 29, 29, 29), r6.xyzw, l(0, 0, 0, 0)\nimad r5.xyzw, r5.xyzw, l(2, 2, 2, 2), r6.xyzw\nbfi r5.xyzw, l(1, 1, 1, 1), l(1, 1, 1, 1), r2.zxwy, r5.xyzw\nbfi r5.xyzw, l(1, 1, 1, 1), l(17, 17, 17, 17), r8.xyzw, r5.xyzw\niadd r5.xyzw, r5.xyzw, r7.xyzw\nishl r6.xyzw, r5.xyzw, l(2, 2, 2, 2)\niadd r5.xyzw, r5.xyzw, r6.xyzw\nstore_raw U0[0].xyzw, r0.x, r5.xyzw\nimad r0.x, vThreadID.y, l(4), l(1)\nult r0.y, r0.x, CB0[0][2].y\nif_nz r0.y\n  iadd r0.y, r0.w, CB0[0][2].x\n  mov r2.xy, r3.xyxx\n  ushr r2.xyzw, r2.xyzw, l(16, 16, 16, 16)\n  ushr r3.xyzw, r2.xxyy, l(3, 11, 3, 11)\n  bfi r3.xyzw, l(1, 1, 1, 1), l(4, 4, 4, 4), r3.xyzw, l(0, 0, 0, 0)\n  ushr r5.xyzw, r2.xxyy, l(7, 15, 7, 15)\n  bfi r5.xyzw, l(1, 12, 1, 12), l(20, 20, 20, 20), r5.xyzw, l(0, 0, 0, 0)\n  iadd r3.xyzw, r3.xyzw, r5.xyzw\n  ushr r5.xyzw, r2.xxyy, l(2, 10, 2, 10)\n  bfi r3.xyzw, l(1, 1, 1, 1), l(8, 8, 8, 8), r5.xyzw, r3.xyzw\n  ushr r5.xyzw, r2.xxyy, l(6, 14, 6, 14)\n  bfi r5.xyzw, l(1, 1, 1, 1), l(24, 24, 24, 24), r5.xyzw, l(0, 0, 0, 0)\n  iadd r3.xyzw, r3.xyzw, r5.xyzw\n  ushr r5.xyzw, r2.xxyy, l(1, 9, 1, 9)\n  bfi r3.xyzw, l(1, 1, 1, 1), l(12, 12, 12, 12), r5.xyzw, r3.xyzw\n  ushr r5.xyzw, r2.xxyy, l(5, 13, 5, 13)\n  bfi r6.xyzw, l(1, 1, 1, 1), l(28, 28, 28, 28), r5.xyzw, l(0, 0, 0, 0)\n  iadd r6.xyzw, r3.xyzw, r6.xyzw\n  ushr r7.xyzw, r2.xzyw, l(8, 8, 8, 8)\n  mov r8.xz, r2.xxyx\n  mov r8.yw, r7.xxxz\n  bfi r6.xyzw, l(1, 1, 1, 1), l(0, 0, 0, 0), r8.xyzw, r6.xyzw\n  ushr r9.xyzw, r2.xxyy, l(4, 12, 4, 12)\n  bfi r6.xyzw, l(1, 1, 1, 1), l(16, 16, 16, 16), r9.xyzw, r6.xyzw\n  bfi r5.xyzw, l(1, 1, 1, 1), l(29, 29, 29, 29), r5.xyzw, l(0, 0, 0, 0)\n  imad r3.xyzw, r3.xyzw, l(2, 2, 2, 2), r5.xyzw\n  bfi r3.xyzw, l(1, 1, 1, 1), l(1, 1, 1, 1), r8.xyzw, r3.xyzw\n  bfi r3.xyzw, l(1, 1, 1, 1), l(17, 17, 17, 17), r9.xyzw, r3.xyzw\n  iadd r3.xyzw, r3.xyzw, r6.xyzw\n  ishl r5.xyzw, r3.xyzw, l(2, 2, 2, 2)\n  iadd r3.xyzw, r3.xyzw, r5.xyzw\n  store_raw U0[0].xyzw, r0.y, r3.xyzw\n  iadd r0.z, r0.y, l(16)\n  ushr r3.xyzw, r2.zzww, l(3, 11, 3, 11)\n  bfi r3.xyzw, l(1, 1, 1, 1), l(4, 4, 4, 4), r3.xyzw, l(0, 0, 0, 0)\n  ushr r5.xyzw, r2.zzww, l(7, 15, 7, 15)\n  bfi r5.xyzw, l(1, 12, 1, 12), l(20, 20, 20, 20), r5.xyzw, l(0, 0, 0, 0)\n  iadd r3.xyzw, r3.xyzw, r5.xyzw\n  ushr r5.xyzw, r2.zzww, l(2, 10, 2, 10)\n  bfi r3.xyzw, l(1, 1, 1, 1), l(8, 8, 8, 8), r5.xyzw, r3.xyzw\n  ushr r5.xyzw, r2.zzww, l(6, 14, 6, 14)\n  bfi r5.xyzw, l(1, 1, 1, 1), l(24, 24, 24, 24), r5.xyzw, l(0, 0, 0, 0)\n  iadd r3.xyzw, r3.xyzw, r5.xyzw\n  ushr r5.xyzw, r2.zzww, l(1, 9, 1, 9)\n  bfi r3.xyzw, l(1, 1, 1, 1), l(12, 12, 12, 12), r5.xyzw, r3.xyzw\n  ushr r5.xyzw, r2.zzww, l(5, 13, 5, 13)\n  bfi r6.xyzw, l(1, 1, 1, 1), l(28, 28, 28, 28), r5.xyzw, l(0, 0, 0, 0)\n  iadd r6.xyzw, r3.xyzw, r6.xyzw\n  mov r7.xz, r2.zzwz\n  bfi r6.xyzw, l(1, 1, 1, 1), l(0, 0, 0, 0), r7.xyzw, r6.xyzw\n  ushr r2.xyzw, r2.zzww, l(4, 12, 4, 12)\n  bfi r6.xyzw, l(1, 1, 1, 1), l(16, 16, 16, 16), r2.xyzw, r6.xyzw\n  bfi r5.xyzw, l(1, 1, 1, 1), l(29, 29, 29, 29), r5.xyzw, l(0, 0, 0, 0)\n  imad r3.xyzw, r3.xyzw, l(2, 2, 2, 2), r5.xyzw\n  bfi r3.xyzw, l(1, 1, 1, 1), l(1, 1, 1, 1), r7.xyzw, r3.xyzw\n  bfi r2.xyzw, l(1, 1, 1, 1), l(17, 17, 17, 17), r2.xyzw, r3.xyzw\n  iadd r2.xyzw, r2.xyzw, r6.xyzw\n  ishl r3.xyzw, r2.xyzw, l(2, 2, 2, 2)\n  iadd r2.xyzw, r2.xyzw, r3.xyzw\n  store_raw U0[0].xyzw, r0.z, r2.xyzw\n  iadd r0.x, r0.x, l(1)\n  ult r0.z, r0.x, CB0[0][2].y\n  if_nz r0.z\n    iadd r0.y, r0.y, CB0[0][2].x\n    ushr r2.xyzw, r1.xxyy, l(3, 11, 3, 11)\n    bfi r2.xyzw, l(1, 1, 1, 1), l(4, 4, 4, 4), r2.xyzw, l(0, 0, 0, 0)\n    ushr r3.xyzw, r1.xxyy, l(7, 15, 7, 15)\n    bfi r3.xyzw, l(1, 1, 1, 1), l(20, 20, 20, 20), r3.xyzw, l(0, 0, 0, 0)\n    iadd r2.xyzw, r2.xyzw, r3.xyzw\n    ushr r3.xyzw, r1.xxyy, l(2, 10, 2, 10)\n    bfi r2.xyzw, l(1, 1, 1, 1), l(8, 8, 8, 8), r3.xyzw, r2.xyzw\n    ushr r3.xyzw, r1.xxyy, l(6, 14, 6, 14)\n    bfi r3.xyzw, l(1, 1, 1, 1), l(24, 24, 24, 24), r3.xyzw, l(0, 0, 0, 0)\n    iadd r2.xyzw, r2.xyzw, r3.xyzw\n    ushr r3.xyzw, r1.xxyy, l(1, 9, 1, 9)\n    bfi r2.xyzw, l(1, 1, 1, 1), l(12, 12, 12, 12), r3.xyzw, r2.xyzw\n    ushr r3.xyzw, r1.xxyy, l(5, 13, 5, 13)\n    bfi r5.xyzw, l(1, 1, 1, 1), l(28, 28, 28, 28), r3.xyzw, l(0, 0, 0, 0)\n    iadd r5.xyzw, r2.xyzw, r5.xyzw\n    ushr r1.zw, r1.xxxy, l(0, 0, 8, 8)\n    bfi r5.xyzw, l(1, 1, 1, 1), l(0, 0, 0, 0), r1.xzyw, r5.xyzw\n    ushr r6.xyzw, r1.xxyy, l(4, 12, 4, 12)\n    bfi r5.xyzw, l(1, 1, 1, 1), l(16, 16, 16, 16), r6.xyzw, r5.xyzw\n    bfi r3.xyzw, l(1, 1, 1, 1), l(29, 29, 29, 29), r3.xyzw, l(0, 0, 0, 0)\n    imad r2.xyzw, r2.xyzw, l(2, 2, 2, 2), r3.xyzw\n    bfi r2.xyzw, l(1, 1, 1, 1), l(1, 1, 1, 1), r1.xzyw, r2.xyzw\n    bfi r2.xyzw, l(1, 1, 1, 1), l(17, 17, 17, 17), r6.xyzw, r2.xyzw\n    iadd r2.xyzw, r2.xyzw, r5.xyzw\n    ishl r3.xyzw, r2.xyzw, l(2, 2, 2, 2)\n    iadd r2.xyzw, r2.xyzw, r3.xyzw\n    store_raw U0[0].xyzw, r0.y, r2.xyzw\n    iadd r0.z, r0.y, l(16)\n    ushr r2.xyzw, r4.zzww, l(3, 11, 3, 11)\n    bfi r2.xyzw, l(1, 1, 1, 1), l(4, 4, 4, 4), r2.xyzw, l(0, 0, 0, 0)\n    ushr r3.xyzw, r4.zzww, l(7, 15, 7, 15)\n    bfi r3.xyzw, l(1, 1, 1, 1), l(20, 20, 20, 20), r3.xyzw, l(0, 0, 0, 0)\n    iadd r2.xyzw, r2.xyzw, r3.xyzw\n    ushr r3.xyzw, r4.zzww, l(2, 10, 2, 10)\n    bfi r2.xyzw, l(1, 1, 1, 1), l(8, 8, 8, 8), r3.xyzw, r2.xyzw\n    ushr r3.xyzw, r4.zzww, l(6, 14, 6, 14)\n    bfi r3.xyzw, l(1, 1, 1, 1), l(24, 24, 24, 24), r3.xyzw, l(0, 0, 0, 0)\n    iadd r2.xyzw, r2.xyzw, r3.xyzw\n    ushr r3.xyzw, r4.zzww, l(1, 9, 1, 9)\n    bfi r2.xyzw, l(1, 1, 1, 1), l(12, 12, 12, 12), r3.xyzw, r2.xyzw\n    ushr r3.xyzw, r4.zzww, l(5, 13, 5, 13)\n    bfi r5.xyzw, l(1, 1, 1, 1), l(28, 28, 28, 28), r3.xyzw, l(0, 0, 0, 0)\n    iadd r5.xyzw, r2.xyzw, r5.xyzw\n    ushr r4.xy, r4.zwzz, l(8, 8, 0, 0)\n    bfi r5.xyzw, l(1, 1, 1, 1), l(0, 0, 0, 0), r4.zxwy, r5.xyzw\n    ushr r6.xyzw, r4.zzww, l(4, 12, 4, 12)\n    bfi r5.xyzw, l(1, 1, 1, 1), l(16, 16, 16, 16), r6.xyzw, r5.xyzw\n    bfi r3.xyzw, l(1, 1, 1, 1), l(29, 29, 29, 29), r3.xyzw, l(0, 0, 0, 0)\n    imad r2.xyzw, r2.xyzw, l(2, 2, 2, 2), r3.xyzw\n    bfi r2.xyzw, l(1, 1, 1, 1), l(1, 1, 1, 1), r4.zxwy, r2.xyzw\n    bfi r2.xyzw, l(1, 1, 1, 1), l(17, 17, 17, 17), r6.xyzw, r2.xyzw\n    iadd r2.xyzw, r2.xyzw, r5.xyzw\n    ishl r3.xyzw, r2.xyzw, l(2, 2, 2, 2)\n    iadd r2.xyzw, r2.xyzw, r3.xyzw\n    store_raw U0[0].xyzw, r0.z, r2.xyzw\n    or r0.x, r0.x, l(3)\n    ult r0.x, r0.x, CB0[0][2].y\n    if_nz r0.x\n      iadd r0.x, r0.y, CB0[0][2].x\n      mov r4.xy, r1.xyxx\n      ushr r1.xyzw, r4.xyzw, l(16, 16, 16, 16)\n      ushr r2.xyzw, r1.xxyy, l(3, 11, 3, 11)\n      bfi r2.xyzw, l(1, 1, 1, 1), l(4, 4, 4, 4), r2.xyzw, l(0, 0, 0, 0)\n      ushr r3.xyzw, r1.xxyy, l(7, 15, 7, 15)\n      bfi r3.xyzw, l(1, 12, 1, 12), l(20, 20, 20, 20), r3.xyzw, l(0, 0, 0, 0)\n      iadd r2.xyzw, r2.xyzw, r3.xyzw\n      ushr r3.xyzw, r1.xxyy, l(2, 10, 2, 10)\n      bfi r2.xyzw, l(1, 1, 1, 1), l(8, 8, 8, 8), r3.xyzw, r2.xyzw\n      ushr r3.xyzw, r1.xxyy, l(6, 14, 6, 14)\n      bfi r3.xyzw, l(1, 1, 1, 1), l(24, 24, 24, 24), r3.xyzw, l(0, 0, 0, 0)\n      iadd r2.xyzw, r2.xyzw, r3.xyzw\n      ushr r3.xyzw, r1.xxyy, l(1, 9, 1, 9)\n      bfi r2.xyzw, l(1, 1, 1, 1), l(12, 12, 12, 12), r3.xyzw, r2.xyzw\n      ushr r3.xyzw, r1.xxyy, l(5, 13, 5, 13)\n      bfi r4.xyzw, l(1, 1, 1, 1), l(28, 28, 28, 28), r3.xyzw, l(0, 0, 0, 0)\n      iadd r4.xyzw, r2.xyzw, r4.xyzw\n      ushr r5.xyzw, r1.xzyw, l(8, 8, 8, 8)\n      mov r6.xz, r1.xxyx\n      mov r6.yw, r5.xxxz\n      bfi r4.xyzw, l(1, 1, 1, 1), l(0, 0, 0, 0), r6.xyzw, r4.xyzw\n      ushr r7.xyzw, r1.xxyy, l(4, 12, 4, 12)\n      bfi r4.xyzw, l(1, 1, 1, 1), l(16, 16, 16, 16), r7.xyzw, r4.xyzw\n      bfi r3.xyzw, l(1, 1, 1, 1), l(29, 29, 29, 29), r3.xyzw, l(0, 0, 0, 0)\n      imad r2.xyzw, r2.xyzw, l(2, 2, 2, 2), r3.xyzw\n      bfi r2.xyzw, l(1, 1, 1, 1), l(1, 1, 1, 1), r6.xyzw, r2.xyzw\n      bfi r2.xyzw, l(1, 1, 1, 1), l(17, 17, 17, 17), r7.xyzw, r2.xyzw\n      iadd r2.xyzw, r2.xyzw, r4.xyzw\n      ishl r3.xyzw, r2.xyzw, l(2, 2, 2, 2)\n      iadd r2.xyzw, r2.xyzw, r3.xyzw\n      store_raw U0[0].xyzw, r0.x, r2.xyzw\n      iadd r0.y, r0.x, l(16)\n      ushr r2.xyzw, r1.zzww, l(3, 11, 3, 11)\n      bfi r2.xyzw, l(1, 1, 1, 1), l(4, 4, 4, 4), r2.xyzw, l(0, 0, 0, 0)\n      ushr r3.xyzw, r1.zzww, l(7, 15, 7, 15)\n      bfi r3.xyzw, l(1, 12, 1, 12), l(20, 20, 20, 20), r3.xyzw, l(0, 0, 0, 0)\n      iadd r2.xyzw, r2.xyzw, r3.xyzw\n      ushr r3.xyzw, r1.zzww, l(2, 10, 2, 10)\n      bfi r2.xyzw, l(1, 1, 1, 1), l(8, 8, 8, 8), r3.xyzw, r2.xyzw\n      ushr r3.xyzw, r1.zzww, l(6, 14, 6, 14)\n      bfi r3.xyzw, l(1, 1, 1, 1), l(24, 24, 24, 24), r3.xyzw, l(0, 0, 0, 0)\n      iadd r2.xyzw, r2.xyzw, r3.xyzw\n      ushr r3.xyzw, r1.zzww, l(1, 9, 1, 9)\n      bfi r2.xyzw, l(1, 1, 1, 1), l(12, 12, 12, 12), r3.xyzw, r2.xyzw\n      ushr r3.xyzw, r1.zzww, l(5, 13, 5, 13)\n      bfi r4.xyzw, l(1, 1, 1, 1), l(28, 28, 28, 28), r3.xyzw, l(0, 0, 0, 0)\n      iadd r4.xyzw, r2.xyzw, r4.xyzw\n      mov r5.xz, r1.zzwz\n      bfi r4.xyzw, l(1, 1, 1, 1), l(0, 0, 0, 0), r5.xyzw, r4.xyzw\n      ushr r1.xyzw, r1.zzww, l(4, 12, 4, 12)\n      bfi r4.xyzw, l(1, 1, 1, 1), l(16, 16, 16, 16), r1.xyzw, r4.xyzw\n      bfi r3.xyzw, l(1, 1, 1, 1), l(29, 29, 29, 29), r3.xyzw, l(0, 0, 0, 0)\n      imad r2.xyzw, r2.xyzw, l(2, 2, 2, 2), r3.xyzw\n      bfi r2.xyzw, l(1, 1, 1, 1), l(1, 1, 1, 1), r5.xyzw, r2.xyzw\n      bfi r1.xyzw, l(1, 1, 1, 1), l(17, 17, 17, 17), r1.xyzw, r2.xyzw\n      iadd r1.xyzw, r1.xyzw, r4.xyzw\n      ishl r2.xyzw, r1.xyzw, l(2, 2, 2, 2)\n      iadd r1.xyzw, r1.xyzw, r2.xyzw\n      store_raw U0[0].xyzw, r0.y, r1.xyzw\n    endif \n  endif \nendif \nret \n// Approximately 340 instruction slots used\n#endif\n\nconst BYTE texture_load_dxt3aas1111_argb4_cs[] =\n{\n     68,  88,  66,  67,  27, 104, \n     49, 142, 200, 110, 129, 241, \n    223,  49,  80, 135, 127, 161, \n    101,  75,   1,   0,   0,   0, \n    204,  62,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n     48,  62,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n    244,  57,   0,   0,  81,   0, \n      5,   0, 125,  14,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,  10,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  12,  50,   0,  16,   0, \n      0,   0,   0,   0,   6, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n    194,   0,  16,   0,   0,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0,   6, 132, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  11, \n     66,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10,  98,   0,  16,   0, \n      1,   0,   0,   0,   6,   1, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,   7, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     35,   0,   0,  10,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,   2,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  35,   0, \n      0,  11, 130,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     30,   0,   0,   9, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  58, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     31,   0,   0,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  42,   0, \n      2,   0,  26,   0,   2,   0, \n     35,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     42, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  41,   0,   0,   7, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     18,   0,   0,   1,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  12, 194,   0,  16,   0, \n      1,   0,   0,   0, 166, 142, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   5,   0,   0,   0, \n      4,   0,   0,   0,  42,   0, \n      0,   9, 242,   0,  16,   0, \n      2,   0,   0,   0, 102,   5, \n      2,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   1,   0,   0,   0, \n      3,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0, 139,   0, \n      0,   8, 130,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  27,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  10,   0,   2,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  19, 194,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   5,   0,   0,   0, \n      4,   0,   0,   0, 166,   6, \n      2,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  11,  66,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  25,   0, \n      0,   0,   1,  64,   0,   0, \n      7,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  87,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n    138,   0,   0,   9,  18,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  20,  98,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0, 166,  10, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,   9,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     64,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 139,   0, \n      0,  15,  50,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  27,   0,   0,   0, \n     24,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  86,   5,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   8,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  20,   0, \n      0,   0,   1,  64,   0,   0, \n     12,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  18,   0,   0,   1, \n     85,   0,   0,   9,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     42, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   5,   0,   0,   0, \n     42,   0,   0,   9, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     86,   5,   2,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n      1,   0,   0,   0,   4,   0, \n      0,   0,   3,   0,   0,   0, \n    139,   0,   0,   8,  66,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  27,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  10,   0, \n      2,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  20, \n    114,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,  11,   0, \n      0,   0,   0,   0,   0,   0, \n    214,   6,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  66,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  26,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0, 138,   0,   0,   9, \n     18,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  87,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  10,  66,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  26,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  64,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 139,   0,   0,  15, \n    194,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  27,   0,   0,   0, \n     24,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   5,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  21,   0, \n      0,   1,  30,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0, 214, 120, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  32,   0, \n      0,  10, 114,   0,  16,   0, \n      2,   0,   0,   0, 166,  10, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   2,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   2,   0, \n      0,   0, 150,   5,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     38,   7,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,  85,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  38,   7,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      1,   0,   0,   0, 214,   8, \n     16,   0,   3,   0,   0,   0, \n    214,   8,  16,   0,   4,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     38,   7,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0, 214,   8, \n     16,   0,   3,   0,   0,   0, \n     54,   0,   0,   5,  50,   0, \n     16,   0,   3,   0,   0,   0, \n    230,  10,  16,   0,   1,   0, \n      0,   0,  18,   0,   0,   1, \n     54,   0,   0,   5,  50,   0, \n     16,   0,   3,   0,   0,   0, \n    230,  10,  16,   0,   1,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  32,   0, \n      0,   0,  18,   0,   0,   1, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0,  21,   0,   0,   1, \n     30,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      4,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n    134, 125,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n    134,  13,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,  85,   0,   0,  10, \n    242,   0,  16,   0,   6,   0, \n      0,   0, 134,  13,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      4,   0,   0,   0, 134,  13, \n     16,   0,   5,   0,   0,   0, \n    134,  13,  16,   0,   6,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n    134,  13,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0, 134,  13, \n     16,   0,   2,   0,   0,   0, \n     54,   0,   0,   5, 194,   0, \n     16,   0,   2,   0,   0,   0, \n      6,   4,  16,   0,   4,   0, \n      0,   0,  18,   0,   0,   1, \n     54,   0,   0,   5, 194,   0, \n     16,   0,   2,   0,   0,   0, \n      6,   4,  16,   0,   4,   0, \n      0,   0,  21,   0,   0,   1, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n      6,   5,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,  11,   0, \n      0,   0,   3,   0,   0,   0, \n     11,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   4,   0, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   6,   0,   0,   0, \n      6,   5,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,  15,   0, \n      0,   0,   7,   0,   0,   0, \n     15,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      6,   0,   0,   0,   6,   5, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,  10,   0,   0,   0, \n      2,   0,   0,   0,  10,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      6,   0,   0,   0,   6,   5, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   6,   0, \n      0,   0,  14,   0,   0,   0, \n      6,   0,   0,   0,  14,   0, \n      0,   0, 140,   0,   0,  20, \n    242,   0,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  24,   0,   0,   0, \n     24,   0,   0,   0,  24,   0, \n      0,   0,  24,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   6,   0, \n      0,   0,   6,   5,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      9,   0,   0,   0,   1,   0, \n      0,   0,   9,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     12,   0,   0,   0,  12,   0, \n      0,   0,  12,   0,   0,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   6,   0, \n      0,   0,   6,   5,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n     13,   0,   0,   0,   5,   0, \n      0,   0,  13,   0,   0,   0, \n    140,   0,   0,  20, 242,   0, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     28,   0,   0,   0,  28,   0, \n      0,   0,  28,   0,   0,   0, \n     28,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n     85,   0,   0,  10, 194,   0, \n     16,   0,   3,   0,   0,   0, \n      6,   4,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 134,  13,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   8,   0,   0,   0, \n      6,   5,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n     12,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n    140,   0,   0,  20, 242,   0, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     29,   0,   0,   0,  29,   0, \n      0,   0,  29,   0,   0,   0, \n     29,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  35,   0,   0,  12, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n    134,  13,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  17,   0, \n      0,   0,  17,   0,   0,   0, \n     17,   0,   0,   0,  17,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n    166,  15,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,  11,   0, \n      0,   0,   3,   0,   0,   0, \n     11,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   4,   0, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   6,   0,   0,   0, \n    166,  15,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,  15,   0, \n      0,   0,   7,   0,   0,   0, \n     15,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      6,   0,   0,   0, 166,  15, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,  10,   0,   0,   0, \n      2,   0,   0,   0,  10,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      6,   0,   0,   0, 166,  15, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   6,   0, \n      0,   0,  14,   0,   0,   0, \n      6,   0,   0,   0,  14,   0, \n      0,   0, 140,   0,   0,  20, \n    242,   0,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  24,   0,   0,   0, \n     24,   0,   0,   0,  24,   0, \n      0,   0,  24,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   6,   0, \n      0,   0, 166,  15,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      9,   0,   0,   0,   1,   0, \n      0,   0,   9,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     12,   0,   0,   0,  12,   0, \n      0,   0,  12,   0,   0,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   6,   0, \n      0,   0, 166,  15,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n     13,   0,   0,   0,   5,   0, \n      0,   0,  13,   0,   0,   0, \n    140,   0,   0,  20, 242,   0, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     28,   0,   0,   0,  28,   0, \n      0,   0,  28,   0,   0,   0, \n     28,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n     85,   0,   0,  10,  50,   0, \n     16,   0,   2,   0,   0,   0, \n    230,  10,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  38,   7,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   8,   0,   0,   0, \n    166,  15,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n     12,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n    140,   0,   0,  20, 242,   0, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     29,   0,   0,   0,  29,   0, \n      0,   0,  29,   0,   0,   0, \n     29,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  35,   0,   0,  12, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n     38,   7,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  17,   0, \n      0,   0,  17,   0,   0,   0, \n     17,   0,   0,   0,  17,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  35,   0,   0,   8, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,   2,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  79,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,  54,   0, \n      0,   5,  50,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   3,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,   6,   5, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,  11,   0,   0,   0, \n      3,   0,   0,   0,  11,   0, \n      0,   0, 140,   0,   0,  20, \n    242,   0,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   4,   0, \n      0,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,   6,   5, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,  15,   0,   0,   0, \n      7,   0,   0,   0,  15,   0, \n      0,   0, 140,   0,   0,  20, \n    242,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,  12,   0, \n      0,   0,   1,   0,   0,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0,   6,   5,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n     10,   0,   0,   0,   2,   0, \n      0,   0,  10,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0,   6,   5,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   6,   0,   0,   0, \n     14,   0,   0,   0,   6,   0, \n      0,   0,  14,   0,   0,   0, \n    140,   0,   0,  20, 242,   0, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     24,   0,   0,   0,  24,   0, \n      0,   0,  24,   0,   0,   0, \n     24,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n      6,   5,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   9,   0, \n      0,   0,   1,   0,   0,   0, \n      9,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  12,   0, \n      0,   0,  12,   0,   0,   0, \n     12,   0,   0,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n      6,   5,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      5,   0,   0,   0,  13,   0, \n      0,   0,   5,   0,   0,   0, \n     13,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  28,   0, \n      0,   0,  28,   0,   0,   0, \n     28,   0,   0,   0,  28,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      7,   0,   0,   0, 134,  13, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,  54,   0,   0,   5, \n     82,   0,  16,   0,   8,   0, \n      0,   0,   6,   1,  16,   0, \n      2,   0,   0,   0,  54,   0, \n      0,   5, 162,   0,  16,   0, \n      8,   0,   0,   0,   6,   8, \n     16,   0,   7,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   9,   0, \n      0,   0,   6,   5,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   4,   0,   0,   0, \n     12,   0,   0,   0,   4,   0, \n      0,   0,  12,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0, 140,   0,   0,  20, \n    242,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  29,   0,   0,   0, \n     29,   0,   0,   0,  29,   0, \n      0,   0,  29,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  35,   0, \n      0,  12, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     17,   0,   0,   0,  17,   0, \n      0,   0,  17,   0,   0,   0, \n     17,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0, 166,  15,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n     11,   0,   0,   0,   3,   0, \n      0,   0,  11,   0,   0,   0, \n    140,   0,   0,  20, 242,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,   4,   0, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0, 166,  15,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n     15,   0,   0,   0,   7,   0, \n      0,   0,  15,   0,   0,   0, \n    140,   0,   0,  20, 242,   0, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,  12,   0,   0,   0, \n      1,   0,   0,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n    166,  15,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,  10,   0, \n      0,   0,   2,   0,   0,   0, \n     10,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n    166,  15,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      6,   0,   0,   0,  14,   0, \n      0,   0,   6,   0,   0,   0, \n     14,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  24,   0, \n      0,   0,  24,   0,   0,   0, \n     24,   0,   0,   0,  24,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0, 166,  15, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   9,   0,   0,   0, \n      1,   0,   0,   0,   9,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  12,   0,   0,   0, \n     12,   0,   0,   0,  12,   0, \n      0,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0, 166,  15, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,  13,   0,   0,   0, \n      5,   0,   0,   0,  13,   0, \n      0,   0, 140,   0,   0,  20, \n    242,   0,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  28,   0,   0,   0, \n     28,   0,   0,   0,  28,   0, \n      0,   0,  28,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  54,   0,   0,   5, \n     82,   0,  16,   0,   7,   0, \n      0,   0, 166,  11,  16,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n    166,  15,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n     12,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n    140,   0,   0,  20, 242,   0, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     29,   0,   0,   0,  29,   0, \n      0,   0,  29,   0,   0,   0, \n     29,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  35,   0,   0,  12, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  17,   0, \n      0,   0,  17,   0,   0,   0, \n     17,   0,   0,   0,  17,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     79,   0,   0,   9,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  26, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     30,   0,   0,   9,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  10, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n      6,   5,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,  11,   0, \n      0,   0,   3,   0,   0,   0, \n     11,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   4,   0, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n      6,   5,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,  15,   0, \n      0,   0,   7,   0,   0,   0, \n     15,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,   6,   5, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,  10,   0,   0,   0, \n      2,   0,   0,   0,  10,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,   6,   5, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   6,   0, \n      0,   0,  14,   0,   0,   0, \n      6,   0,   0,   0,  14,   0, \n      0,   0, 140,   0,   0,  20, \n    242,   0,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  24,   0,   0,   0, \n     24,   0,   0,   0,  24,   0, \n      0,   0,  24,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,   6,   5,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      9,   0,   0,   0,   1,   0, \n      0,   0,   9,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     12,   0,   0,   0,  12,   0, \n      0,   0,  12,   0,   0,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,   6,   5,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n     13,   0,   0,   0,   5,   0, \n      0,   0,  13,   0,   0,   0, \n    140,   0,   0,  20, 242,   0, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     28,   0,   0,   0,  28,   0, \n      0,   0,  28,   0,   0,   0, \n     28,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     85,   0,   0,  10, 194,   0, \n     16,   0,   1,   0,   0,   0, \n      6,   4,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 134,  13,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   6,   0,   0,   0, \n      6,   5,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n     12,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n    140,   0,   0,  20, 242,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     29,   0,   0,   0,  29,   0, \n      0,   0,  29,   0,   0,   0, \n     29,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  35,   0,   0,  12, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n    134,  13,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  17,   0, \n      0,   0,  17,   0,   0,   0, \n     17,   0,   0,   0,  17,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  30,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n    166,  15,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,  11,   0, \n      0,   0,   3,   0,   0,   0, \n     11,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   4,   0, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n    166,  15,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,  15,   0, \n      0,   0,   7,   0,   0,   0, \n     15,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0, 166,  15, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,  10,   0,   0,   0, \n      2,   0,   0,   0,  10,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0, 166,  15, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   6,   0, \n      0,   0,  14,   0,   0,   0, \n      6,   0,   0,   0,  14,   0, \n      0,   0, 140,   0,   0,  20, \n    242,   0,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  24,   0,   0,   0, \n     24,   0,   0,   0,  24,   0, \n      0,   0,  24,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0, 166,  15,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      9,   0,   0,   0,   1,   0, \n      0,   0,   9,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     12,   0,   0,   0,  12,   0, \n      0,   0,  12,   0,   0,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0, 166,  15,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n     13,   0,   0,   0,   5,   0, \n      0,   0,  13,   0,   0,   0, \n    140,   0,   0,  20, 242,   0, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     28,   0,   0,   0,  28,   0, \n      0,   0,  28,   0,   0,   0, \n     28,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     85,   0,   0,  10,  50,   0, \n     16,   0,   4,   0,   0,   0, \n    230,  10,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  38,   7,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   6,   0,   0,   0, \n    166,  15,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n     12,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n    140,   0,   0,  20, 242,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     29,   0,   0,   0,  29,   0, \n      0,   0,  29,   0,   0,   0, \n     29,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  35,   0,   0,  12, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n     38,   7,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  17,   0, \n      0,   0,  17,   0,   0,   0, \n     17,   0,   0,   0,  17,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  60,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     79,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  26, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     30,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  10, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n     54,   0,   0,   5,  50,   0, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n      6,   5,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,  11,   0, \n      0,   0,   3,   0,   0,   0, \n     11,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   4,   0, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n      6,   5,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,  15,   0, \n      0,   0,   7,   0,   0,   0, \n     15,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n     12,   0,   0,   0,   1,   0, \n      0,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,   6,   5, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,  10,   0,   0,   0, \n      2,   0,   0,   0,  10,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,   6,   5, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   6,   0, \n      0,   0,  14,   0,   0,   0, \n      6,   0,   0,   0,  14,   0, \n      0,   0, 140,   0,   0,  20, \n    242,   0,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  24,   0,   0,   0, \n     24,   0,   0,   0,  24,   0, \n      0,   0,  24,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,   6,   5,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      9,   0,   0,   0,   1,   0, \n      0,   0,   9,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     12,   0,   0,   0,  12,   0, \n      0,   0,  12,   0,   0,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,   6,   5,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n     13,   0,   0,   0,   5,   0, \n      0,   0,  13,   0,   0,   0, \n    140,   0,   0,  20, 242,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     28,   0,   0,   0,  28,   0, \n      0,   0,  28,   0,   0,   0, \n     28,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n    134,  13,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,  54,   0, \n      0,   5,  82,   0,  16,   0, \n      6,   0,   0,   0,   6,   1, \n     16,   0,   1,   0,   0,   0, \n     54,   0,   0,   5, 162,   0, \n     16,   0,   6,   0,   0,   0, \n      6,   8,  16,   0,   5,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      7,   0,   0,   0,   6,   5, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   4,   0, \n      0,   0,  12,   0,   0,   0, \n      4,   0,   0,   0,  12,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  29,   0, \n      0,   0,  29,   0,   0,   0, \n     29,   0,   0,   0,  29,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     35,   0,   0,  12, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  17,   0,   0,   0, \n     17,   0,   0,   0,  17,   0, \n      0,   0,  17,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     30,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0, 166,  15, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,  11,   0,   0,   0, \n      3,   0,   0,   0,  11,   0, \n      0,   0, 140,   0,   0,  20, \n    242,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   4,   0, \n      0,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0, 166,  15, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,  15,   0,   0,   0, \n      7,   0,   0,   0,  15,   0, \n      0,   0, 140,   0,   0,  20, \n    242,   0,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,  12,   0, \n      0,   0,   1,   0,   0,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0, 166,  15,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n     10,   0,   0,   0,   2,   0, \n      0,   0,  10,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0, 166,  15,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   6,   0,   0,   0, \n     14,   0,   0,   0,   6,   0, \n      0,   0,  14,   0,   0,   0, \n    140,   0,   0,  20, 242,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     24,   0,   0,   0,  24,   0, \n      0,   0,  24,   0,   0,   0, \n     24,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n    166,  15,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   9,   0, \n      0,   0,   1,   0,   0,   0, \n      9,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  12,   0, \n      0,   0,  12,   0,   0,   0, \n     12,   0,   0,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n    166,  15,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      5,   0,   0,   0,  13,   0, \n      0,   0,   5,   0,   0,   0, \n     13,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  28,   0, \n      0,   0,  28,   0,   0,   0, \n     28,   0,   0,   0,  28,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  54,   0, \n      0,   5,  82,   0,  16,   0, \n      5,   0,   0,   0, 166,  11, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   1,   0, \n      0,   0, 166,  15,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   4,   0,   0,   0, \n     12,   0,   0,   0,   4,   0, \n      0,   0,  12,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0, 140,   0,   0,  20, \n    242,   0,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  29,   0,   0,   0, \n     29,   0,   0,   0,  29,   0, \n      0,   0,  29,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  35,   0, \n      0,  12, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     17,   0,   0,   0,  17,   0, \n      0,   0,  17,   0,   0,   0, \n     17,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  21,   0, \n      0,   1,  21,   0,   0,   1, \n     21,   0,   0,   1,  62,   0, \n      0,   1,  83,  84,  65,  84, \n    148,   0,   0,   0,  84,   1, \n      0,   0,  10,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     91,   0,   0,   0,  85,   0, \n      0,   0,   7,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  15,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_dxt3aas1111_bgra4_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 9\ndcl_thread_group 4, 32, 1\nand r0.xy, CB0[0][0].xxxx, l(1, 2, 0, 0)\nishl r1.x, vThreadID.x, l(2)\nmov r1.y, vThreadID.y\nuge r0.zw, r1.xxxy, CB0[0][1].xxxy\nor r0.z, r0.w, r0.z\nif_nz r0.z\n  ret \nendif \nubfe r0.z, l(2), l(2), CB0[0][0].x\nishl r1.yz, r1.xxyx, l(0, 2, 2, 0)\nishl r0.w, r1.y, l(1)\nimad r1.y, vThreadID.z, CB0[0][2].y, r1.z\nimad r0.w, r1.y, CB0[0][2].x, r0.w\niadd r0.w, r0.w, CB0[0][1].w\nif_z r0.x\n  imad r1.y, CB0[0][0].w, vThreadID.z, vThreadID.y\n  imad r1.y, CB0[0][0].z, r1.y, r1.x\n  ishl r1.y, r1.y, l(3)\nelse \n  if_nz r0.y\n    ushr r1.zw, CB0[0][0].zzzw, l(0, 0, 5, 4)\n    ishr r2.xyzw, vThreadID.zyyy, l(2, 4, 1, 3)\n    imad r0.y, r2.x, r1.w, r2.y\n    ibfe r1.w, l(27), l(3), vThreadID.x\n    imad r0.y, r0.y, r1.z, r1.w\n    bfi r1.zw, l(0, 0, 2, 1), l(0, 0, 5, 4), vThreadID.zzzy, l(0, 0, 0, 0)\n    bfi r2.y, l(2), l(3), r2.z, l(0)\n    iadd r1.z, r1.z, r2.y\n    bfi r1.z, l(3), l(0), r1.x, r1.z\n    bfi r0.y, l(25), l(7), r0.y, r1.z\n    xor r1.z, r2.x, r2.w\n    ubfe r2.x, l(2), l(3), r1.x\n    bfi r2.yz, l(0, 1, 1, 0), l(0, 1, 11, 0), r1.zzzz, l(0, 0, 0, 0)\n    xor r1.z, r2.y, r2.x\n    imad r1.z, r1.z, l(64), r1.w\n    iadd r1.z, r2.z, r1.z\n    ibfe r2.xy, l(27, 24, 0, 0), l(2, 5, 0, 0), r0.yyyy\n    bfi r0.y, l(3), l(8), r2.x, r1.z\n    bfi r1.y, l(20), l(12), r2.y, r0.y\n  else \n    ushr r0.y, CB0[0][0].z, l(5)\n    ishr r2.xyzw, vThreadID.yyyy, l(5, 1, 4, 3)\n    ibfe r1.z, l(27), l(3), vThreadID.x\n    imad r0.y, r2.x, r0.y, r1.z\n    bfi r2.xyz, l(3, 1, 1, 0), l(3, 1, 11, 0), r2.ywzy, l(0, 0, 0, 0)\n    bfi r1.z, l(3), l(0), r1.x, r2.x\n    bfi r0.y, l(26), l(6), r0.y, r1.z\n    ubfe r1.x, l(2), l(3), r1.x\n    xor r1.x, r2.y, r1.x\n    bfi r1.z, l(1), l(4), vThreadID.y, l(0)\n    imad r1.x, r1.x, l(64), r1.z\n    iadd r1.x, r2.z, r1.x\n    ibfe r1.zw, l(0, 0, 27, 24), l(0, 0, 2, 5), r0.yyyy\n    bfi r0.y, l(3), l(8), r1.z, r1.x\n    bfi r1.y, l(20), l(12), r1.w, r0.y\n  endif \nendif \niadd r0.y, r1.y, CB0[0][0].y\nld_raw r1.xyzw, r0.y, T0[0].ywxz\nieq r2.xyz, r0.zzzz, l(1, 2, 3, 0)\nor r2.xy, r2.yzyy, r2.xyxx\nif_nz r2.x\n  ishl r3.xyzw, r1.zxwy, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r1.zxwy, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r1.xyzw, r3.ywxz, r4.ywxz\nendif \nif_nz r2.y\n  ushr r3.xyzw, r1.zxwy, l(16, 16, 16, 16)\n  bfi r1.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r1.xyzw, r3.ywxz\n  mov r3.xy, r1.zwzz\nelse \n  mov r3.xy, r1.zwzz\nendif \nif_nz r0.x\n  mov r0.x, l(32)\nelse \n  mov r0.x, l(16)\nendif \niadd r0.x, r0.x, r0.y\nld_raw r4.xyzw, r0.x, T0[0].xzyw\nif_nz r2.x\n  ishl r5.xyzw, r4.xzyw, l(8, 8, 8, 8)\n  and r5.xyzw, r5.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r6.xyzw, r4.xzyw, l(8, 8, 8, 8)\n  and r6.xyzw, r6.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r4.xyzw, r5.xzyw, r6.xzyw\nendif \nif_nz r2.y\n  ushr r2.xyzw, r4.xzyw, l(16, 16, 16, 16)\n  bfi r4.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r4.xyzw, r2.xzyw\n  mov r2.zw, r4.xxxy\nelse \n  mov r2.zw, r4.xxxy\nendif \nushr r5.xyzw, r3.xxyy, l(3, 11, 3, 11)\nbfi r5.xyzw, l(1, 1, 1, 1), l(8, 8, 8, 8), r5.xyzw, l(0, 0, 0, 0)\nushr r6.xyzw, r3.xxyy, l(7, 15, 7, 15)\nbfi r6.xyzw, l(1, 1, 1, 1), l(24, 24, 24, 24), r6.xyzw, l(0, 0, 0, 0)\niadd r5.xyzw, r5.xyzw, r6.xyzw\nushr r6.xyzw, r3.xxyy, l(2, 10, 2, 10)\nbfi r6.xyzw, l(1, 1, 1, 1), l(4, 4, 4, 4), r6.xyzw, l(0, 0, 0, 0)\niadd r5.xyzw, r5.xyzw, r6.xyzw\nushr r6.xyzw, r3.xxyy, l(6, 14, 6, 14)\nbfi r5.xyzw, l(1, 1, 1, 1), l(20, 20, 20, 20), r6.xyzw, r5.xyzw\nubfe r6.xyzw, l(1, 1, 1, 1), l(1, 9, 1, 9), r3.xxyy\niadd r5.xyzw, r5.xyzw, r6.xyzw\nushr r6.xyzw, r3.xxyy, l(5, 13, 5, 13)\nbfi r5.xyzw, l(1, 1, 1, 1), l(16, 16, 16, 16), r6.xyzw, r5.xyzw\nushr r3.zw, r3.xxxy, l(0, 0, 8, 8)\nbfi r5.xyzw, l(1, 1, 1, 1), l(12, 12, 12, 12), r3.xzyw, r5.xyzw\nushr r6.xyzw, r3.xxyy, l(4, 12, 4, 12)\nbfi r7.xyzw, l(1, 1, 1, 1), l(28, 28, 28, 28), r6.xyzw, l(0, 0, 0, 0)\niadd r7.xyzw, r5.xyzw, r7.xyzw\nbfi r6.xyzw, l(1, 1, 1, 1), l(29, 29, 29, 29), r6.xyzw, l(0, 0, 0, 0)\nimad r5.xyzw, r5.xyzw, l(2, 2, 2, 2), r6.xyzw\niadd r5.xyzw, r5.xyzw, r7.xyzw\nishl r6.xyzw, r5.xyzw, l(2, 2, 2, 2)\niadd r5.xyzw, r5.xyzw, r6.xyzw\nstore_raw U0[0].xyzw, r0.w, r5.xyzw\niadd r0.x, r0.w, l(16)\nushr r5.xyzw, r2.zzww, l(3, 11, 3, 11)\nbfi r5.xyzw, l(1, 1, 1, 1), l(8, 8, 8, 8), r5.xyzw, l(0, 0, 0, 0)\nushr r6.xyzw, r2.zzww, l(7, 15, 7, 15)\nbfi r6.xyzw, l(1, 1, 1, 1), l(24, 24, 24, 24), r6.xyzw, l(0, 0, 0, 0)\niadd r5.xyzw, r5.xyzw, r6.xyzw\nushr r6.xyzw, r2.zzww, l(2, 10, 2, 10)\nbfi r6.xyzw, l(1, 1, 1, 1), l(4, 4, 4, 4), r6.xyzw, l(0, 0, 0, 0)\niadd r5.xyzw, r5.xyzw, r6.xyzw\nushr r6.xyzw, r2.zzww, l(6, 14, 6, 14)\nbfi r5.xyzw, l(1, 1, 1, 1), l(20, 20, 20, 20), r6.xyzw, r5.xyzw\nubfe r6.xyzw, l(1, 1, 1, 1), l(1, 9, 1, 9), r2.zzww\niadd r5.xyzw, r5.xyzw, r6.xyzw\nushr r6.xyzw, r2.zzww, l(5, 13, 5, 13)\nbfi r5.xyzw, l(1, 1, 1, 1), l(16, 16, 16, 16), r6.xyzw, r5.xyzw\nushr r2.xy, r2.zwzz, l(8, 8, 0, 0)\nbfi r5.xyzw, l(1, 1, 1, 1), l(12, 12, 12, 12), r2.zxwy, r5.xyzw\nushr r6.xyzw, r2.zzww, l(4, 12, 4, 12)\nbfi r7.xyzw, l(1, 1, 1, 1), l(28, 28, 28, 28), r6.xyzw, l(0, 0, 0, 0)\niadd r7.xyzw, r5.xyzw, r7.xyzw\nbfi r6.xyzw, l(1, 1, 1, 1), l(29, 29, 29, 29), r6.xyzw, l(0, 0, 0, 0)\nimad r5.xyzw, r5.xyzw, l(2, 2, 2, 2), r6.xyzw\niadd r5.xyzw, r5.xyzw, r7.xyzw\nishl r6.xyzw, r5.xyzw, l(2, 2, 2, 2)\niadd r5.xyzw, r5.xyzw, r6.xyzw\nstore_raw U0[0].xyzw, r0.x, r5.xyzw\nimad r0.x, vThreadID.y, l(4), l(1)\nult r0.y, r0.x, CB0[0][2].y\nif_nz r0.y\n  iadd r0.y, r0.w, CB0[0][2].x\n  mov r2.xy, r3.xyxx\n  ushr r5.xyzw, r2.xyzw, l(16, 16, 16, 16)\n  ushr r6.xyzw, r5.xxyy, l(3, 11, 3, 11)\n  bfi r6.xyzw, l(1, 1, 1, 1), l(8, 8, 8, 8), r6.xyzw, l(0, 0, 0, 0)\n  ushr r7.xyzw, r5.xxyy, l(7, 15, 7, 15)\n  bfi r7.xyzw, l(1, 8, 1, 8), l(24, 24, 24, 24), r7.xyzw, l(0, 0, 0, 0)\n  iadd r6.xyzw, r6.xyzw, r7.xyzw\n  ushr r7.xyzw, r5.xxyy, l(2, 10, 2, 10)\n  bfi r7.xyzw, l(1, 1, 1, 1), l(4, 4, 4, 4), r7.xyzw, l(0, 0, 0, 0)\n  iadd r6.xyzw, r6.xyzw, r7.xyzw\n  ushr r7.xyzw, r5.xxyy, l(6, 14, 6, 14)\n  bfi r6.xyzw, l(1, 1, 1, 1), l(20, 20, 20, 20), r7.xyzw, r6.xyzw\n  ubfe r3.xyzw, l(1, 1, 1, 1), l(17, 25, 17, 25), r3.xxyy\n  iadd r3.xyzw, r6.xyzw, r3.xyzw\n  ushr r6.xyzw, r5.xxyy, l(5, 13, 5, 13)\n  bfi r3.xyzw, l(1, 1, 1, 1), l(16, 16, 16, 16), r6.xyzw, r3.xyzw\n  ushr r6.xyzw, r5.xzyw, l(8, 8, 8, 8)\n  mov r7.xz, r5.xxyx\n  mov r7.yw, r6.xxxz\n  bfi r3.xyzw, l(1, 1, 1, 1), l(12, 12, 12, 12), r7.xyzw, r3.xyzw\n  ushr r7.xyzw, r5.xxyy, l(4, 12, 4, 12)\n  bfi r8.xyzw, l(1, 1, 1, 1), l(28, 28, 28, 28), r7.xyzw, l(0, 0, 0, 0)\n  iadd r8.xyzw, r3.xyzw, r8.xyzw\n  bfi r7.xyzw, l(1, 1, 1, 1), l(29, 29, 29, 29), r7.xyzw, l(0, 0, 0, 0)\n  imad r3.xyzw, r3.xyzw, l(2, 2, 2, 2), r7.xyzw\n  iadd r3.xyzw, r3.xyzw, r8.xyzw\n  ishl r7.xyzw, r3.xyzw, l(2, 2, 2, 2)\n  iadd r3.xyzw, r3.xyzw, r7.xyzw\n  store_raw U0[0].xyzw, r0.y, r3.xyzw\n  iadd r0.z, r0.y, l(16)\n  ushr r3.xyzw, r5.zzww, l(3, 11, 3, 11)\n  bfi r3.xyzw, l(1, 1, 1, 1), l(8, 8, 8, 8), r3.xyzw, l(0, 0, 0, 0)\n  ushr r7.xyzw, r5.zzww, l(7, 15, 7, 15)\n  bfi r7.xyzw, l(1, 8, 1, 8), l(24, 24, 24, 24), r7.xyzw, l(0, 0, 0, 0)\n  iadd r3.xyzw, r3.xyzw, r7.xyzw\n  ushr r7.xyzw, r5.zzww, l(2, 10, 2, 10)\n  bfi r7.xyzw, l(1, 1, 1, 1), l(4, 4, 4, 4), r7.xyzw, l(0, 0, 0, 0)\n  iadd r3.xyzw, r3.xyzw, r7.xyzw\n  ushr r7.xyzw, r5.zzww, l(6, 14, 6, 14)\n  bfi r3.xyzw, l(1, 1, 1, 1), l(20, 20, 20, 20), r7.xyzw, r3.xyzw\n  ubfe r2.xyzw, l(1, 1, 1, 1), l(17, 25, 17, 25), r2.zzww\n  iadd r2.xyzw, r3.xyzw, r2.xyzw\n  ushr r3.xyzw, r5.zzww, l(5, 13, 5, 13)\n  bfi r2.xyzw, l(1, 1, 1, 1), l(16, 16, 16, 16), r3.xyzw, r2.xyzw\n  mov r6.xz, r5.zzwz\n  bfi r2.xyzw, l(1, 1, 1, 1), l(12, 12, 12, 12), r6.xyzw, r2.xyzw\n  ushr r3.xyzw, r5.zzww, l(4, 12, 4, 12)\n  bfi r5.xyzw, l(1, 1, 1, 1), l(28, 28, 28, 28), r3.xyzw, l(0, 0, 0, 0)\n  iadd r5.xyzw, r2.xyzw, r5.xyzw\n  bfi r3.xyzw, l(1, 1, 1, 1), l(29, 29, 29, 29), r3.xyzw, l(0, 0, 0, 0)\n  imad r2.xyzw, r2.xyzw, l(2, 2, 2, 2), r3.xyzw\n  iadd r2.xyzw, r2.xyzw, r5.xyzw\n  ishl r3.xyzw, r2.xyzw, l(2, 2, 2, 2)\n  iadd r2.xyzw, r2.xyzw, r3.xyzw\n  store_raw U0[0].xyzw, r0.z, r2.xyzw\n  iadd r0.x, r0.x, l(1)\n  ult r0.z, r0.x, CB0[0][2].y\n  if_nz r0.z\n    iadd r0.y, r0.y, CB0[0][2].x\n    ushr r2.xyzw, r1.xxyy, l(3, 11, 3, 11)\n    bfi r2.xyzw, l(1, 1, 1, 1), l(8, 8, 8, 8), r2.xyzw, l(0, 0, 0, 0)\n    ushr r3.xyzw, r1.xxyy, l(7, 15, 7, 15)\n    bfi r3.xyzw, l(1, 1, 1, 1), l(24, 24, 24, 24), r3.xyzw, l(0, 0, 0, 0)\n    iadd r2.xyzw, r2.xyzw, r3.xyzw\n    ushr r3.xyzw, r1.xxyy, l(2, 10, 2, 10)\n    bfi r3.xyzw, l(1, 1, 1, 1), l(4, 4, 4, 4), r3.xyzw, l(0, 0, 0, 0)\n    iadd r2.xyzw, r2.xyzw, r3.xyzw\n    ushr r3.xyzw, r1.xxyy, l(6, 14, 6, 14)\n    bfi r2.xyzw, l(1, 1, 1, 1), l(20, 20, 20, 20), r3.xyzw, r2.xyzw\n    ubfe r3.xyzw, l(1, 1, 1, 1), l(1, 9, 1, 9), r1.xxyy\n    iadd r2.xyzw, r2.xyzw, r3.xyzw\n    ushr r3.xyzw, r1.xxyy, l(5, 13, 5, 13)\n    bfi r2.xyzw, l(1, 1, 1, 1), l(16, 16, 16, 16), r3.xyzw, r2.xyzw\n    ushr r1.zw, r1.xxxy, l(0, 0, 8, 8)\n    bfi r2.xyzw, l(1, 1, 1, 1), l(12, 12, 12, 12), r1.xzyw, r2.xyzw\n    ushr r3.xyzw, r1.xxyy, l(4, 12, 4, 12)\n    bfi r5.xyzw, l(1, 1, 1, 1), l(28, 28, 28, 28), r3.xyzw, l(0, 0, 0, 0)\n    iadd r5.xyzw, r2.xyzw, r5.xyzw\n    bfi r3.xyzw, l(1, 1, 1, 1), l(29, 29, 29, 29), r3.xyzw, l(0, 0, 0, 0)\n    imad r2.xyzw, r2.xyzw, l(2, 2, 2, 2), r3.xyzw\n    iadd r2.xyzw, r2.xyzw, r5.xyzw\n    ishl r3.xyzw, r2.xyzw, l(2, 2, 2, 2)\n    iadd r2.xyzw, r2.xyzw, r3.xyzw\n    store_raw U0[0].xyzw, r0.y, r2.xyzw\n    iadd r0.z, r0.y, l(16)\n    ushr r2.xyzw, r4.zzww, l(3, 11, 3, 11)\n    bfi r2.xyzw, l(1, 1, 1, 1), l(8, 8, 8, 8), r2.xyzw, l(0, 0, 0, 0)\n    ushr r3.xyzw, r4.zzww, l(7, 15, 7, 15)\n    bfi r3.xyzw, l(1, 1, 1, 1), l(24, 24, 24, 24), r3.xyzw, l(0, 0, 0, 0)\n    iadd r2.xyzw, r2.xyzw, r3.xyzw\n    ushr r3.xyzw, r4.zzww, l(2, 10, 2, 10)\n    bfi r3.xyzw, l(1, 1, 1, 1), l(4, 4, 4, 4), r3.xyzw, l(0, 0, 0, 0)\n    iadd r2.xyzw, r2.xyzw, r3.xyzw\n    ushr r3.xyzw, r4.zzww, l(6, 14, 6, 14)\n    bfi r2.xyzw, l(1, 1, 1, 1), l(20, 20, 20, 20), r3.xyzw, r2.xyzw\n    ubfe r3.xyzw, l(1, 1, 1, 1), l(1, 9, 1, 9), r4.zzww\n    iadd r2.xyzw, r2.xyzw, r3.xyzw\n    ushr r3.xyzw, r4.zzww, l(5, 13, 5, 13)\n    bfi r2.xyzw, l(1, 1, 1, 1), l(16, 16, 16, 16), r3.xyzw, r2.xyzw\n    ushr r4.xy, r4.zwzz, l(8, 8, 0, 0)\n    bfi r2.xyzw, l(1, 1, 1, 1), l(12, 12, 12, 12), r4.zxwy, r2.xyzw\n    ushr r3.xyzw, r4.zzww, l(4, 12, 4, 12)\n    bfi r5.xyzw, l(1, 1, 1, 1), l(28, 28, 28, 28), r3.xyzw, l(0, 0, 0, 0)\n    iadd r5.xyzw, r2.xyzw, r5.xyzw\n    bfi r3.xyzw, l(1, 1, 1, 1), l(29, 29, 29, 29), r3.xyzw, l(0, 0, 0, 0)\n    imad r2.xyzw, r2.xyzw, l(2, 2, 2, 2), r3.xyzw\n    iadd r2.xyzw, r2.xyzw, r5.xyzw\n    ishl r3.xyzw, r2.xyzw, l(2, 2, 2, 2)\n    iadd r2.xyzw, r2.xyzw, r3.xyzw\n    store_raw U0[0].xyzw, r0.z, r2.xyzw\n    or r0.x, r0.x, l(3)\n    ult r0.x, r0.x, CB0[0][2].y\n    if_nz r0.x\n      iadd r0.x, r0.y, CB0[0][2].x\n      mov r4.xy, r1.xyxx\n      ushr r2.xyzw, r4.xyzw, l(16, 16, 16, 16)\n      ushr r3.xyzw, r2.xxyy, l(3, 11, 3, 11)\n      bfi r3.xyzw, l(1, 1, 1, 1), l(8, 8, 8, 8), r3.xyzw, l(0, 0, 0, 0)\n      ushr r5.xyzw, r2.xxyy, l(7, 15, 7, 15)\n      bfi r5.xyzw, l(1, 8, 1, 8), l(24, 24, 24, 24), r5.xyzw, l(0, 0, 0, 0)\n      iadd r3.xyzw, r3.xyzw, r5.xyzw\n      ushr r5.xyzw, r2.xxyy, l(2, 10, 2, 10)\n      bfi r5.xyzw, l(1, 1, 1, 1), l(4, 4, 4, 4), r5.xyzw, l(0, 0, 0, 0)\n      iadd r3.xyzw, r3.xyzw, r5.xyzw\n      ushr r5.xyzw, r2.xxyy, l(6, 14, 6, 14)\n      bfi r3.xyzw, l(1, 1, 1, 1), l(20, 20, 20, 20), r5.xyzw, r3.xyzw\n      ubfe r1.xyzw, l(1, 1, 1, 1), l(17, 25, 17, 25), r1.xxyy\n      iadd r1.xyzw, r3.xyzw, r1.xyzw\n      ushr r3.xyzw, r2.xxyy, l(5, 13, 5, 13)\n      bfi r1.xyzw, l(1, 1, 1, 1), l(16, 16, 16, 16), r3.xyzw, r1.xyzw\n      ushr r3.xyzw, r2.xzyw, l(8, 8, 8, 8)\n      mov r5.xz, r2.xxyx\n      mov r5.yw, r3.xxxz\n      bfi r1.xyzw, l(1, 1, 1, 1), l(12, 12, 12, 12), r5.xyzw, r1.xyzw\n      ushr r5.xyzw, r2.xxyy, l(4, 12, 4, 12)\n      bfi r6.xyzw, l(1, 1, 1, 1), l(28, 28, 28, 28), r5.xyzw, l(0, 0, 0, 0)\n      iadd r6.xyzw, r1.xyzw, r6.xyzw\n      bfi r5.xyzw, l(1, 1, 1, 1), l(29, 29, 29, 29), r5.xyzw, l(0, 0, 0, 0)\n      imad r1.xyzw, r1.xyzw, l(2, 2, 2, 2), r5.xyzw\n      iadd r1.xyzw, r1.xyzw, r6.xyzw\n      ishl r5.xyzw, r1.xyzw, l(2, 2, 2, 2)\n      iadd r1.xyzw, r1.xyzw, r5.xyzw\n      store_raw U0[0].xyzw, r0.x, r1.xyzw\n      iadd r0.y, r0.x, l(16)\n      ushr r1.xyzw, r2.zzww, l(3, 11, 3, 11)\n      bfi r1.xyzw, l(1, 1, 1, 1), l(8, 8, 8, 8), r1.xyzw, l(0, 0, 0, 0)\n      ushr r5.xyzw, r2.zzww, l(7, 15, 7, 15)\n      bfi r5.xyzw, l(1, 8, 1, 8), l(24, 24, 24, 24), r5.xyzw, l(0, 0, 0, 0)\n      iadd r1.xyzw, r1.xyzw, r5.xyzw\n      ushr r5.xyzw, r2.zzww, l(2, 10, 2, 10)\n      bfi r5.xyzw, l(1, 1, 1, 1), l(4, 4, 4, 4), r5.xyzw, l(0, 0, 0, 0)\n      iadd r1.xyzw, r1.xyzw, r5.xyzw\n      ushr r5.xyzw, r2.zzww, l(6, 14, 6, 14)\n      bfi r1.xyzw, l(1, 1, 1, 1), l(20, 20, 20, 20), r5.xyzw, r1.xyzw\n      ubfe r4.xyzw, l(1, 1, 1, 1), l(17, 25, 17, 25), r4.zzww\n      iadd r1.xyzw, r1.xyzw, r4.xyzw\n      ushr r4.xyzw, r2.zzww, l(5, 13, 5, 13)\n      bfi r1.xyzw, l(1, 1, 1, 1), l(16, 16, 16, 16), r4.xyzw, r1.xyzw\n      mov r3.xz, r2.zzwz\n      bfi r1.xyzw, l(1, 1, 1, 1), l(12, 12, 12, 12), r3.xyzw, r1.xyzw\n      ushr r2.xyzw, r2.zzww, l(4, 12, 4, 12)\n      bfi r3.xyzw, l(1, 1, 1, 1), l(28, 28, 28, 28), r2.xyzw, l(0, 0, 0, 0)\n      iadd r3.xyzw, r1.xyzw, r3.xyzw\n      bfi r2.xyzw, l(1, 1, 1, 1), l(29, 29, 29, 29), r2.xyzw, l(0, 0, 0, 0)\n      imad r1.xyzw, r1.xyzw, l(2, 2, 2, 2), r2.xyzw\n      iadd r1.xyzw, r1.xyzw, r3.xyzw\n      ishl r2.xyzw, r1.xyzw, l(2, 2, 2, 2)\n      iadd r1.xyzw, r1.xyzw, r2.xyzw\n      store_raw U0[0].xyzw, r0.y, r1.xyzw\n    endif \n  endif \nendif \nret \n// Approximately 324 instruction slots used\n#endif\n\nconst BYTE texture_load_dxt3aas1111_bgra4_cs[] =\n{\n     68,  88,  66,  67, 206, 193, \n     85, 185, 157,   5, 165, 216, \n     65,  91,  88,  10,  18, 147, \n    255, 179,   1,   0,   0,   0, \n    236,  57,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n     80,  57,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n     20,  53,   0,   0,  81,   0, \n      5,   0,  69,  13,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   9,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  12,  50,   0,  16,   0, \n      0,   0,   0,   0,   6, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n    194,   0,  16,   0,   0,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0,   6, 132, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  11, \n     66,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10,  98,   0,  16,   0, \n      1,   0,   0,   0,   6,   1, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,   7, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     35,   0,   0,  10,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,   2,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  35,   0, \n      0,  11, 130,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     30,   0,   0,   9, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  58, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     31,   0,   0,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  42,   0, \n      2,   0,  26,   0,   2,   0, \n     35,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     42, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  41,   0,   0,   7, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     18,   0,   0,   1,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  12, 194,   0,  16,   0, \n      1,   0,   0,   0, 166, 142, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   5,   0,   0,   0, \n      4,   0,   0,   0,  42,   0, \n      0,   9, 242,   0,  16,   0, \n      2,   0,   0,   0, 102,   5, \n      2,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   1,   0,   0,   0, \n      3,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0, 139,   0, \n      0,   8, 130,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  27,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  10,   0,   2,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  19, 194,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   5,   0,   0,   0, \n      4,   0,   0,   0, 166,   6, \n      2,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  11,  66,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  25,   0, \n      0,   0,   1,  64,   0,   0, \n      7,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  87,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n    138,   0,   0,   9,  18,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  20,  98,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0, 166,  10, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,   9,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     64,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 139,   0, \n      0,  15,  50,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  27,   0,   0,   0, \n     24,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  86,   5,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   8,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  20,   0, \n      0,   0,   1,  64,   0,   0, \n     12,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  18,   0,   0,   1, \n     85,   0,   0,   9,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     42, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   5,   0,   0,   0, \n     42,   0,   0,   9, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     86,   5,   2,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n      1,   0,   0,   0,   4,   0, \n      0,   0,   3,   0,   0,   0, \n    139,   0,   0,   8,  66,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  27,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  10,   0, \n      2,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  20, \n    114,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,  11,   0, \n      0,   0,   0,   0,   0,   0, \n    214,   6,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  66,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  26,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0, 138,   0,   0,   9, \n     18,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  87,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  10,  66,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  26,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  64,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 139,   0,   0,  15, \n    194,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  27,   0,   0,   0, \n     24,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   5,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  21,   0, \n      0,   1,  30,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0, 214, 120, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  32,   0, \n      0,  10, 114,   0,  16,   0, \n      2,   0,   0,   0, 166,  10, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   2,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   2,   0, \n      0,   0, 150,   5,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     38,   7,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,  85,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  38,   7,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      1,   0,   0,   0, 214,   8, \n     16,   0,   3,   0,   0,   0, \n    214,   8,  16,   0,   4,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     38,   7,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0, 214,   8, \n     16,   0,   3,   0,   0,   0, \n     54,   0,   0,   5,  50,   0, \n     16,   0,   3,   0,   0,   0, \n    230,  10,  16,   0,   1,   0, \n      0,   0,  18,   0,   0,   1, \n     54,   0,   0,   5,  50,   0, \n     16,   0,   3,   0,   0,   0, \n    230,  10,  16,   0,   1,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  32,   0, \n      0,   0,  18,   0,   0,   1, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0,  21,   0,   0,   1, \n     30,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      4,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n    134, 125,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n    134,  13,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,  85,   0,   0,  10, \n    242,   0,  16,   0,   6,   0, \n      0,   0, 134,  13,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      4,   0,   0,   0, 134,  13, \n     16,   0,   5,   0,   0,   0, \n    134,  13,  16,   0,   6,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n    134,  13,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0, 134,  13, \n     16,   0,   2,   0,   0,   0, \n     54,   0,   0,   5, 194,   0, \n     16,   0,   2,   0,   0,   0, \n      6,   4,  16,   0,   4,   0, \n      0,   0,  18,   0,   0,   1, \n     54,   0,   0,   5, 194,   0, \n     16,   0,   2,   0,   0,   0, \n      6,   4,  16,   0,   4,   0, \n      0,   0,  21,   0,   0,   1, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n      6,   5,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,  11,   0, \n      0,   0,   3,   0,   0,   0, \n     11,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   6,   0,   0,   0, \n      6,   5,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,  15,   0, \n      0,   0,   7,   0,   0,   0, \n     15,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  24,   0, \n      0,   0,  24,   0,   0,   0, \n     24,   0,   0,   0,  24,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      6,   0,   0,   0,   6,   5, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,  10,   0,   0,   0, \n      2,   0,   0,   0,  10,   0, \n      0,   0, 140,   0,   0,  20, \n    242,   0,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   4,   0, \n      0,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   6,   0, \n      0,   0,   6,   5,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   6,   0,   0,   0, \n     14,   0,   0,   0,   6,   0, \n      0,   0,  14,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      9,   0,   0,   0,   1,   0, \n      0,   0,   9,   0,   0,   0, \n      6,   5,  16,   0,   3,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   6,   0,   0,   0, \n      6,   5,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      5,   0,   0,   0,  13,   0, \n      0,   0,   5,   0,   0,   0, \n     13,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     85,   0,   0,  10, 194,   0, \n     16,   0,   3,   0,   0,   0, \n      6,   4,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  12,   0, \n      0,   0,  12,   0,   0,   0, \n     12,   0,   0,   0,  12,   0, \n      0,   0, 134,  13,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   6,   0,   0,   0, \n      6,   5,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n     12,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  28,   0, \n      0,   0,  28,   0,   0,   0, \n     28,   0,   0,   0,  28,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  29,   0, \n      0,   0,  29,   0,   0,   0, \n     29,   0,   0,   0,  29,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     35,   0,   0,  12, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n    166,  15,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,  11,   0, \n      0,   0,   3,   0,   0,   0, \n     11,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   6,   0,   0,   0, \n    166,  15,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,  15,   0, \n      0,   0,   7,   0,   0,   0, \n     15,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  24,   0, \n      0,   0,  24,   0,   0,   0, \n     24,   0,   0,   0,  24,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      6,   0,   0,   0, 166,  15, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,  10,   0,   0,   0, \n      2,   0,   0,   0,  10,   0, \n      0,   0, 140,   0,   0,  20, \n    242,   0,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   4,   0, \n      0,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   6,   0, \n      0,   0, 166,  15,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   6,   0,   0,   0, \n     14,   0,   0,   0,   6,   0, \n      0,   0,  14,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      9,   0,   0,   0,   1,   0, \n      0,   0,   9,   0,   0,   0, \n    166,  15,  16,   0,   2,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   6,   0,   0,   0, \n    166,  15,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      5,   0,   0,   0,  13,   0, \n      0,   0,   5,   0,   0,   0, \n     13,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     85,   0,   0,  10,  50,   0, \n     16,   0,   2,   0,   0,   0, \n    230,  10,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  12,   0, \n      0,   0,  12,   0,   0,   0, \n     12,   0,   0,   0,  12,   0, \n      0,   0,  38,   7,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   6,   0,   0,   0, \n    166,  15,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n     12,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  28,   0, \n      0,   0,  28,   0,   0,   0, \n     28,   0,   0,   0,  28,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  29,   0, \n      0,   0,  29,   0,   0,   0, \n     29,   0,   0,   0,  29,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     35,   0,   0,  12, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  35,   0,   0,   8, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,   2,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  79,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,  54,   0, \n      0,   5,  50,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   3,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      6,   0,   0,   0,   6,   5, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,  11,   0,   0,   0, \n      3,   0,   0,   0,  11,   0, \n      0,   0, 140,   0,   0,  20, \n    242,   0,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      7,   0,   0,   0,   6,   5, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,  15,   0,   0,   0, \n      7,   0,   0,   0,  15,   0, \n      0,   0, 140,   0,   0,  20, \n    242,   0,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,  24,   0,   0,   0, \n     24,   0,   0,   0,  24,   0, \n      0,   0,  24,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   7,   0, \n      0,   0,   6,   5,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n     10,   0,   0,   0,   2,   0, \n      0,   0,  10,   0,   0,   0, \n    140,   0,   0,  20, 242,   0, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,   4,   0, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   7,   0,   0,   0, \n      6,   5,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      6,   0,   0,   0,  14,   0, \n      0,   0,   6,   0,   0,   0, \n     14,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     17,   0,   0,   0,  25,   0, \n      0,   0,  17,   0,   0,   0, \n     25,   0,   0,   0,   6,   5, \n     16,   0,   3,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      6,   0,   0,   0,   6,   5, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,  13,   0,   0,   0, \n      5,   0,   0,   0,  13,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      6,   0,   0,   0, 134,  13, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,  54,   0,   0,   5, \n     82,   0,  16,   0,   7,   0, \n      0,   0,   6,   1,  16,   0, \n      5,   0,   0,   0,  54,   0, \n      0,   5, 162,   0,  16,   0, \n      7,   0,   0,   0,   6,   8, \n     16,   0,   6,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     12,   0,   0,   0,  12,   0, \n      0,   0,  12,   0,   0,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   7,   0, \n      0,   0,   6,   5,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   4,   0,   0,   0, \n     12,   0,   0,   0,   4,   0, \n      0,   0,  12,   0,   0,   0, \n    140,   0,   0,  20, 242,   0, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     28,   0,   0,   0,  28,   0, \n      0,   0,  28,   0,   0,   0, \n     28,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n    140,   0,   0,  20, 242,   0, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     29,   0,   0,   0,  29,   0, \n      0,   0,  29,   0,   0,   0, \n     29,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  35,   0,   0,  12, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0, 166,  15,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n     11,   0,   0,   0,   3,   0, \n      0,   0,  11,   0,   0,   0, \n    140,   0,   0,  20, 242,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   7,   0, \n      0,   0, 166,  15,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n     15,   0,   0,   0,   7,   0, \n      0,   0,  15,   0,   0,   0, \n    140,   0,   0,  20, 242,   0, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n     24,   0,   0,   0,  24,   0, \n      0,   0,  24,   0,   0,   0, \n     24,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   7,   0,   0,   0, \n    166,  15,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,  10,   0, \n      0,   0,   2,   0,   0,   0, \n     10,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   4,   0, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      7,   0,   0,   0, 166,  15, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   6,   0, \n      0,   0,  14,   0,   0,   0, \n      6,   0,   0,   0,  14,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  17,   0, \n      0,   0,  25,   0,   0,   0, \n     17,   0,   0,   0,  25,   0, \n      0,   0, 166,  15,  16,   0, \n      2,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0, 166,  15,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n     13,   0,   0,   0,   5,   0, \n      0,   0,  13,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  54,   0,   0,   5, \n     82,   0,  16,   0,   6,   0, \n      0,   0, 166,  11,  16,   0, \n      5,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  12,   0, \n      0,   0,  12,   0,   0,   0, \n     12,   0,   0,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n    166,  15,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n     12,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  28,   0, \n      0,   0,  28,   0,   0,   0, \n     28,   0,   0,   0,  28,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  29,   0, \n      0,   0,  29,   0,   0,   0, \n     29,   0,   0,   0,  29,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     35,   0,   0,  12, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     79,   0,   0,   9,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  26, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     30,   0,   0,   9,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  10, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n      6,   5,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,  11,   0, \n      0,   0,   3,   0,   0,   0, \n     11,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n      6,   5,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,  15,   0, \n      0,   0,   7,   0,   0,   0, \n     15,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  24,   0, \n      0,   0,  24,   0,   0,   0, \n     24,   0,   0,   0,  24,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,   6,   5, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,  10,   0,   0,   0, \n      2,   0,   0,   0,  10,   0, \n      0,   0, 140,   0,   0,  20, \n    242,   0,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   4,   0, \n      0,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,   6,   5,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   6,   0,   0,   0, \n     14,   0,   0,   0,   6,   0, \n      0,   0,  14,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      9,   0,   0,   0,   1,   0, \n      0,   0,   9,   0,   0,   0, \n      6,   5,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n      6,   5,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      5,   0,   0,   0,  13,   0, \n      0,   0,   5,   0,   0,   0, \n     13,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     85,   0,   0,  10, 194,   0, \n     16,   0,   1,   0,   0,   0, \n      6,   4,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  12,   0, \n      0,   0,  12,   0,   0,   0, \n     12,   0,   0,   0,  12,   0, \n      0,   0, 134,  13,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n      6,   5,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n     12,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  28,   0, \n      0,   0,  28,   0,   0,   0, \n     28,   0,   0,   0,  28,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  29,   0, \n      0,   0,  29,   0,   0,   0, \n     29,   0,   0,   0,  29,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     35,   0,   0,  12, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  30,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n    166,  15,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,  11,   0, \n      0,   0,   3,   0,   0,   0, \n     11,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n    166,  15,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,  15,   0, \n      0,   0,   7,   0,   0,   0, \n     15,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  24,   0, \n      0,   0,  24,   0,   0,   0, \n     24,   0,   0,   0,  24,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0, 166,  15, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,  10,   0,   0,   0, \n      2,   0,   0,   0,  10,   0, \n      0,   0, 140,   0,   0,  20, \n    242,   0,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   4,   0, \n      0,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0, 166,  15,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   6,   0,   0,   0, \n     14,   0,   0,   0,   6,   0, \n      0,   0,  14,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      9,   0,   0,   0,   1,   0, \n      0,   0,   9,   0,   0,   0, \n    166,  15,  16,   0,   4,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n    166,  15,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      5,   0,   0,   0,  13,   0, \n      0,   0,   5,   0,   0,   0, \n     13,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     85,   0,   0,  10,  50,   0, \n     16,   0,   4,   0,   0,   0, \n    230,  10,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  12,   0, \n      0,   0,  12,   0,   0,   0, \n     12,   0,   0,   0,  12,   0, \n      0,   0,  38,   7,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n    166,  15,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n     12,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  28,   0, \n      0,   0,  28,   0,   0,   0, \n     28,   0,   0,   0,  28,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  29,   0, \n      0,   0,  29,   0,   0,   0, \n     29,   0,   0,   0,  29,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     35,   0,   0,  12, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  60,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     79,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  26, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     30,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  10, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n     54,   0,   0,   5,  50,   0, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n      6,   5,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,  11,   0, \n      0,   0,   3,   0,   0,   0, \n     11,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n      6,   5,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,  15,   0, \n      0,   0,   7,   0,   0,   0, \n     15,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,  24,   0, \n      0,   0,  24,   0,   0,   0, \n     24,   0,   0,   0,  24,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,   6,   5, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,  10,   0,   0,   0, \n      2,   0,   0,   0,  10,   0, \n      0,   0, 140,   0,   0,  20, \n    242,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   4,   0, \n      0,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0,   6,   5,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   6,   0,   0,   0, \n     14,   0,   0,   0,   6,   0, \n      0,   0,  14,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  17,   0,   0,   0, \n     25,   0,   0,   0,  17,   0, \n      0,   0,  25,   0,   0,   0, \n      6,   5,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n      6,   5,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      5,   0,   0,   0,  13,   0, \n      0,   0,   5,   0,   0,   0, \n     13,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n    134,  13,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,  54,   0, \n      0,   5,  82,   0,  16,   0, \n      5,   0,   0,   0,   6,   1, \n     16,   0,   2,   0,   0,   0, \n     54,   0,   0,   5, 162,   0, \n     16,   0,   5,   0,   0,   0, \n      6,   8,  16,   0,   3,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  12,   0,   0,   0, \n     12,   0,   0,   0,  12,   0, \n      0,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,   6,   5, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   4,   0, \n      0,   0,  12,   0,   0,   0, \n      4,   0,   0,   0,  12,   0, \n      0,   0, 140,   0,   0,  20, \n    242,   0,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  28,   0,   0,   0, \n     28,   0,   0,   0,  28,   0, \n      0,   0,  28,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0, 140,   0,   0,  20, \n    242,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  29,   0,   0,   0, \n     29,   0,   0,   0,  29,   0, \n      0,   0,  29,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  35,   0, \n      0,  12, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      1,   0,   0,   0, 166,  15, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,  11,   0,   0,   0, \n      3,   0,   0,   0,  11,   0, \n      0,   0, 140,   0,   0,  20, \n    242,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0, 166,  15, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,  15,   0,   0,   0, \n      7,   0,   0,   0,  15,   0, \n      0,   0, 140,   0,   0,  20, \n    242,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,  24,   0,   0,   0, \n     24,   0,   0,   0,  24,   0, \n      0,   0,  24,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0, 166,  15,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n     10,   0,   0,   0,   2,   0, \n      0,   0,  10,   0,   0,   0, \n    140,   0,   0,  20, 242,   0, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,   4,   0, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n    166,  15,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      6,   0,   0,   0,  14,   0, \n      0,   0,   6,   0,   0,   0, \n     14,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     17,   0,   0,   0,  25,   0, \n      0,   0,  17,   0,   0,   0, \n     25,   0,   0,   0, 166,  15, \n     16,   0,   4,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0, 166,  15, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,  13,   0,   0,   0, \n      5,   0,   0,   0,  13,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  54,   0, \n      0,   5,  82,   0,  16,   0, \n      3,   0,   0,   0, 166,  11, \n     16,   0,   2,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     12,   0,   0,   0,  12,   0, \n      0,   0,  12,   0,   0,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0, 166,  15,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   4,   0,   0,   0, \n     12,   0,   0,   0,   4,   0, \n      0,   0,  12,   0,   0,   0, \n    140,   0,   0,  20, 242,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     28,   0,   0,   0,  28,   0, \n      0,   0,  28,   0,   0,   0, \n     28,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n    140,   0,   0,  20, 242,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     29,   0,   0,   0,  29,   0, \n      0,   0,  29,   0,   0,   0, \n     29,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  35,   0,   0,  12, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  21,   0, \n      0,   1,  21,   0,   0,   1, \n     21,   0,   0,   1,  62,   0, \n      0,   1,  83,  84,  65,  84, \n    148,   0,   0,   0,  68,   1, \n      0,   0,   9,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     99,   0,   0,   0,  77,   0, \n      0,   0,   7,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  15,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_dxt5_rgba8_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 8\ndcl_thread_group 4, 32, 1\nand r0.xy, CB0[0][0].xxxx, l(1, 2, 0, 0)\nishl r1.x, vThreadID.x, l(1)\nmov r1.y, vThreadID.y\nuge r0.zw, r1.xxxy, CB0[0][1].xxxy\nor r0.z, r0.w, r0.z\nif_nz r0.z\n  ret \nendif \nubfe r0.z, l(2), l(2), CB0[0][0].x\nishl r1.yz, r1.xxyx, l(0, 2, 2, 0)\nishl r0.w, r1.y, l(2)\nimad r1.y, vThreadID.z, CB0[0][2].y, r1.z\nimad r0.w, r1.y, CB0[0][2].x, r0.w\niadd r0.w, r0.w, CB0[0][1].w\nif_z r0.x\n  imad r1.y, CB0[0][0].w, vThreadID.z, vThreadID.y\n  imad r1.y, CB0[0][0].z, r1.y, r1.x\n  ishl r1.y, r1.y, l(4)\nelse \n  if_nz r0.y\n    ushr r1.zw, CB0[0][0].zzzw, l(0, 0, 5, 4)\n    ishr r2.xyzw, vThreadID.zyyy, l(2, 4, 1, 3)\n    imad r0.y, r2.x, r1.w, r2.y\n    ibfe r1.w, l(27), l(4), vThreadID.x\n    imad r0.y, r0.y, r1.z, r1.w\n    bfi r1.zw, l(0, 0, 2, 1), l(0, 0, 5, 4), vThreadID.zzzy, l(0, 0, 0, 0)\n    bfi r2.y, l(2), l(3), r2.z, l(0)\n    iadd r1.z, r1.z, r2.y\n    bfi r1.z, l(3), l(0), r1.x, r1.z\n    bfi r0.y, l(25), l(7), r0.y, r1.z\n    xor r1.z, r2.x, r2.w\n    ubfe r2.x, l(2), l(3), r1.x\n    bfi r2.yz, l(0, 1, 1, 0), l(0, 1, 11, 0), r1.zzzz, l(0, 0, 0, 0)\n    xor r1.z, r2.y, r2.x\n    imad r1.z, r1.z, l(64), r1.w\n    iadd r1.z, r2.z, r1.z\n    ibfe r2.xy, l(27, 24, 0, 0), l(1, 4, 0, 0), r0.yyyy\n    bfi r0.y, l(3), l(8), r2.x, r1.z\n    bfi r1.y, l(20), l(12), r2.y, r0.y\n  else \n    ushr r0.y, CB0[0][0].z, l(5)\n    ishr r2.xyzw, vThreadID.yyyy, l(5, 1, 4, 3)\n    ibfe r1.z, l(27), l(4), vThreadID.x\n    imad r0.y, r2.x, r0.y, r1.z\n    bfi r2.xyz, l(3, 1, 1, 0), l(3, 1, 11, 0), r2.ywzy, l(0, 0, 0, 0)\n    bfi r1.z, l(3), l(0), r1.x, r2.x\n    bfi r0.y, l(26), l(6), r0.y, r1.z\n    ubfe r1.x, l(2), l(3), r1.x\n    xor r1.x, r2.y, r1.x\n    bfi r1.z, l(1), l(4), vThreadID.y, l(0)\n    imad r1.x, r1.x, l(64), r1.z\n    iadd r1.x, r2.z, r1.x\n    ibfe r1.zw, l(0, 0, 27, 24), l(0, 0, 1, 4), r0.yyyy\n    bfi r0.y, l(3), l(8), r1.z, r1.x\n    bfi r1.y, l(20), l(12), r1.w, r0.y\n  endif \nendif \niadd r0.y, r1.y, CB0[0][0].y\nld_raw r1.xyzw, r0.y, T0[0].yxzw\nieq r2.xyz, r0.zzzz, l(1, 2, 3, 0)\nor r2.xy, r2.yzyy, r2.xyxx\nif_nz r2.x\n  ishl r3.xyzw, r1.yxzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r1.yxzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r1.xyzw, r3.yxzw, r4.yxzw\nendif \nif_nz r2.y\n  ushr r3.xyzw, r1.yxzw, l(16, 16, 16, 16)\n  bfi r1.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r1.xyzw, r3.yxzw\n  mov r3.xy, r1.ywyy\nelse \n  mov r3.xy, r1.ywyy\nendif \nishl r4.xyz, r1.zzzz, l(3, 7, 12, 0)\nushr r5.xyz, r1.zzzz, l(13, 4, 9, 0)\nmov r4.w, r5.x\nand r1.yz, r4.xxwx, l(0, 248, 248, 0)\nmov r5.xw, r4.zzzy\nand r2.zw, r5.wwwz, l(0, 0, 0x0003f000, 0x0003f000)\niadd r1.yz, r1.yyzy, r2.zzwz\nand r2.zw, r5.xxxy, l(0, 0, 0x0f800000, 0x0f800000)\niadd r1.yz, r1.yyzy, r2.zzwz\nushr r2.zw, r1.yyyz, l(0, 0, 5, 5)\nand r2.zw, r2.zzzw, l(0, 0, 0x00700007, 0x00700007)\niadd r1.yz, r1.yyzy, r2.zzwz\nushr r2.zw, r1.yyyz, l(0, 0, 6, 6)\nand r2.zw, r2.zzzw, l(0, 0, 3072, 3072)\niadd r1.yz, r1.yyzy, r2.zzwz\nishl r0.z, r3.y, l(1)\nand r0.z, r0.z, l(0xaaaaaaaa)\nushr r4.xyz, r3.yxxy, l(1, 8, 16, 0)\nand r1.w, r4.x, l(0x55555555)\niadd r0.z, r0.z, r1.w\nushr r1.w, r0.z, l(1)\nand r1.w, r1.w, l(0x55555555)\nxor r5.x, r0.z, r1.w\nmov r3.z, r4.y\nand r2.zw, r3.xxxz, l(0, 0, 255, 255)\nbfi r0.z, l(8), l(16), r1.x, l(0)\niadd r0.z, r0.z, r4.z\nuge r1.w, r2.w, r2.z\nushr r3.xy, r0.zzzz, l(1, 2, 0, 0)\nand r3.z, r0.z, r3.x\nand r3.z, r3.z, l(0x00492492)\nishl r3.w, r3.z, l(1)\nushr r4.x, r3.z, l(1)\niadd r3.z, r3.z, r3.w\niadd r3.z, r3.z, r4.x\nand r3.w, r0.z, l(0x00249249)\niadd r4.x, r3.w, l(0x00db6db6)\nand r4.x, r3.z, r4.x\nor r4.y, r0.z, r3.x\nand r4.zw, r3.xxxy, l(0, 0, 0x00249249, 0x00249249)\nor r3.x, r3.y, r4.y\nand r3.x, r3.x, l(0x00249249)\nxor r3.x, r3.x, l(0x00249249)\nnot r4.yz, r4.zzwz\nand r3.y, r3.w, r4.y\nand r3.y, r4.z, r3.y\nor r0.z, r0.z, r3.x\niadd r0.z, r0.z, l(0xffdb6db7)\nor r0.z, r3.y, r0.z\nishl r3.xy, r3.yyyy, l(2, 1, 0, 0)\nor r3.w, r0.z, r3.x\nnot r3.z, r3.z\nand r3.z, r3.z, r3.w\nor r3.z, r4.x, r3.z\niadd r3.x, r3.y, r3.x\nor r0.z, r0.z, r3.x\nmovc r0.z, r1.w, r3.z, r0.z\nnot r3.x, r5.x\nushr r3.yzw, r3.xxxx, l(0, 2, 4, 6)\nand r3.xyzw, r3.xyzw, l(3, 3, 3, 3)\nushr r5.yzw, r5.xxxx, l(0, 2, 4, 6)\nand r4.xyzw, r5.xyzw, l(3, 3, 3, 3)\nimul null, r4.xyzw, r1.zzzz, r4.xyzw\nimad r3.xyzw, r3.xyzw, r1.yyyy, r4.xyzw\nand r4.xyzw, r3.xyzw, l(1023, 1023, 1023, 1023)\nudiv r4.xyzw, null, r4.xyzw, l(3, 3, 3, 3)\nishl r4.xyzw, r4.xyzw, l(16, 16, 16, 16)\nubfe r6.xyzw, l(10, 10, 10, 10), l(10, 10, 10, 10), r3.xyzw\nudiv r6.xyzw, null, r6.xyzw, l(3, 3, 3, 3)\nbfi r4.xyzw, l(8, 8, 8, 8), l(8, 8, 8, 8), r6.xyzw, r4.xyzw\nushr r3.xyzw, r3.xyzw, l(20, 20, 20, 20)\nudiv r3.xyzw, null, r3.xyzw, l(3, 3, 3, 3)\nor r3.xyzw, r3.xyzw, r4.xyzw\nushr r4.x, r0.z, l(1)\nand r4.x, r0.z, r4.x\nand r4.x, r4.x, l(1170)\nishl r4.y, r4.x, l(1)\nushr r4.z, r4.x, l(1)\niadd r4.x, r4.x, r4.y\niadd r4.x, r4.x, r4.z\nnot r4.y, r4.x\nand r4.xz, r0.zzzz, r4.xxyx\niadd r4.w, -r4.z, l(2925)\nand r4.y, r4.y, r4.w\nand r4.w, r4.y, l(7)\nand r5.y, r4.z, l(7)\nimul null, r5.y, r2.w, r5.y\nimad r4.w, r2.z, r4.w, r5.y\nudiv r4.w, null, r4.w, l(5)\nubfe r5.yzw, l(0, 3, 3, 3), l(0, 3, 6, 9), r4.yyyy\nubfe r6.xyz, l(3, 3, 3, 0), l(3, 6, 9, 0), r4.zzzz\nimul null, r6.xyz, r2.wwww, r6.xyzx\nimad r5.yzw, r2.zzzz, r5.yyzw, r6.xxyz\nudiv r5.yzw, null, r5.yyzw, l(0, 5, 5, 5)\nishl r5.yzw, r5.yyzw, l(0, 8, 16, 24)\nor r4.y, r4.w, r5.y\nor r4.y, r5.z, r4.y\nor r4.y, r5.w, r4.y\nishl r5.yzw, r4.xxxx, l(0, 5, 10, 15)\nand r5.yzw, r5.yyzw, l(0, 256, 0x00010000, 0x01000000)\nbfi r4.x, l(1), l(0), r4.x, r5.y\niadd r4.x, r5.z, r4.x\niadd r4.x, r5.w, r4.x\nimad r4.x, r4.x, l(255), r4.y\nnot r4.y, r0.z\nand r4.z, r4.y, l(7)\nand r4.w, r0.z, l(7)\nimul null, r4.w, r2.w, r4.w\nimad r4.z, r2.z, r4.z, r4.w\nudiv r4.z, null, r4.z, l(7)\nubfe r5.yzw, l(0, 3, 3, 3), l(0, 3, 6, 9), r4.yyyy\nubfe r6.xyz, l(3, 3, 3, 0), l(3, 6, 9, 0), r0.zzzz\nimul null, r6.xyz, r2.wwww, r6.xyzx\nimad r5.yzw, r2.zzzz, r5.yyzw, r6.xxyz\nudiv r5.yzw, null, r5.yyzw, l(0, 7, 7, 7)\nishl r5.yzw, r5.yyzw, l(0, 8, 16, 24)\nor r4.y, r4.z, r5.y\nor r4.y, r5.z, r4.y\nor r4.y, r5.w, r4.y\nmovc r4.w, r1.w, r4.x, r4.y\nishl r4.xyz, r4.wwww, l(24, 16, 8, 0)\nand r4.xyzw, r4.xyzw, l(0xff000000, 0xff000000, 0xff000000, 0xff000000)\nor r3.xyzw, r3.xyzw, r4.xyzw\nstore_raw U0[0].xyzw, r0.w, r3.xyzw\nimad r3.x, vThreadID.y, l(4), l(1)\nult r3.x, r3.x, CB0[0][2].y\nif_nz r3.x\n  iadd r3.y, r0.w, CB0[0][2].x\n  ushr r4.x, r5.x, l(8)\n  not r6.x, r4.x\n  ushr r6.yzw, r6.xxxx, l(0, 2, 4, 6)\n  and r6.xyzw, r6.xyzw, l(3, 3, 3, 3)\n  ushr r4.yzw, r4.xxxx, l(0, 2, 4, 6)\n  and r4.xyzw, r4.xyzw, l(3, 3, 3, 3)\n  imul null, r4.xyzw, r1.zzzz, r4.xyzw\n  imad r4.xyzw, r6.xyzw, r1.yyyy, r4.xyzw\n  and r6.xyzw, r4.xyzw, l(1023, 1023, 1023, 1023)\n  udiv r6.xyzw, null, r6.xyzw, l(3, 3, 3, 3)\n  ishl r6.xyzw, r6.xyzw, l(16, 16, 16, 16)\n  ubfe r7.xyzw, l(10, 10, 10, 10), l(10, 10, 10, 10), r4.xyzw\n  udiv r7.xyzw, null, r7.xyzw, l(3, 3, 3, 3)\n  bfi r6.xyzw, l(8, 8, 8, 8), l(8, 8, 8, 8), r7.xyzw, r6.xyzw\n  ushr r4.xyzw, r4.xyzw, l(20, 20, 20, 20)\n  udiv r4.xyzw, null, r4.xyzw, l(3, 3, 3, 3)\n  or r4.xyzw, r4.xyzw, r6.xyzw\n  ushr r3.z, r0.z, l(12)\n  ushr r3.w, r3.z, l(1)\n  and r3.w, r3.z, r3.w\n  and r3.w, r3.w, l(1170)\n  ishl r5.y, r3.w, l(1)\n  ushr r5.z, r3.w, l(1)\n  iadd r3.w, r3.w, r5.y\n  iadd r3.w, r3.w, r5.z\n  not r5.y, r3.w\n  and r5.z, r3.z, r5.y\n  iadd r5.w, -r5.z, l(2925)\n  and r5.y, r5.y, r5.w\n  and r5.w, r5.y, l(7)\n  and r6.x, r5.z, l(7)\n  imul null, r6.x, r2.w, r6.x\n  imad r5.w, r2.z, r5.w, r6.x\n  udiv r5.w, null, r5.w, l(5)\n  ubfe r6.xyz, l(3, 3, 3, 0), l(3, 6, 9, 0), r5.yyyy\n  ubfe r7.xyz, l(3, 3, 3, 0), l(3, 6, 9, 0), r5.zzzz\n  imul null, r7.xyz, r2.wwww, r7.xyzx\n  imad r6.xyz, r2.zzzz, r6.xyzx, r7.xyzx\n  udiv r6.xyz, null, r6.xyzx, l(5, 5, 5, 0)\n  ishl r6.xyz, r6.xyzx, l(8, 16, 24, 0)\n  or r5.y, r5.w, r6.x\n  or r5.y, r6.y, r5.y\n  or r5.y, r6.z, r5.y\n  and r3.w, r3.w, r3.z\n  ishl r6.xyz, r3.wwww, l(5, 10, 15, 0)\n  and r6.xyz, r6.xyzx, l(256, 0x00010000, 0x01000000, 0)\n  bfi r3.w, l(1), l(0), r3.w, r6.x\n  iadd r3.w, r6.y, r3.w\n  iadd r3.w, r6.z, r3.w\n  imad r3.w, r3.w, l(255), r5.y\n  not r3.z, r3.z\n  and r5.y, r3.z, l(7)\n  ubfe r6.xyzw, l(3, 3, 3, 3), l(12, 15, 18, 21), r0.zzzz\n  imul null, r6.xyzw, r2.wwww, r6.xyzw\n  imad r0.z, r2.z, r5.y, r6.x\n  udiv r0.z, null, r0.z, l(7)\n  ubfe r5.yzw, l(0, 3, 3, 3), l(0, 3, 6, 9), r3.zzzz\n  imad r5.yzw, r2.zzzz, r5.yyzw, r6.yyzw\n  udiv r5.yzw, null, r5.yyzw, l(0, 7, 7, 7)\n  ishl r5.yzw, r5.yyzw, l(0, 8, 16, 24)\n  or r0.z, r0.z, r5.y\n  or r0.z, r5.z, r0.z\n  or r0.z, r5.w, r0.z\n  movc r6.w, r1.w, r3.w, r0.z\n  ishl r6.xyz, r6.wwww, l(24, 16, 8, 0)\n  and r6.xyzw, r6.xyzw, l(0xff000000, 0xff000000, 0xff000000, 0xff000000)\n  or r4.xyzw, r4.xyzw, r6.xyzw\n  store_raw U0[0].xyzw, r3.y, r4.xyzw\n  imad r0.z, vThreadID.y, l(4), l(2)\n  ult r0.z, r0.z, CB0[0][2].y\n  if_nz r0.z\n    ushr r0.z, r1.x, l(8)\n    ushr r3.yz, r0.zzzz, l(0, 1, 2, 0)\n    and r1.x, r0.z, r3.y\n    and r1.x, r1.x, l(0x00492492)\n    ishl r3.w, r1.x, l(1)\n    ushr r4.x, r1.x, l(1)\n    iadd r1.x, r1.x, r3.w\n    iadd r1.x, r1.x, r4.x\n    and r3.w, r0.z, l(0x00249249)\n    iadd r4.x, r3.w, l(0x00db6db6)\n    and r4.x, r1.x, r4.x\n    or r4.y, r0.z, r3.y\n    and r4.zw, r3.yyyz, l(0, 0, 0x00249249, 0x00249249)\n    or r3.y, r3.z, r4.y\n    and r3.y, r3.y, l(0x00249249)\n    xor r3.y, r3.y, l(0x00249249)\n    not r4.yz, r4.zzwz\n    and r3.z, r3.w, r4.y\n    and r3.z, r4.z, r3.z\n    or r0.z, r0.z, r3.y\n    iadd r0.z, r0.z, l(0xffdb6db7)\n    or r0.z, r3.z, r0.z\n    ishl r3.yz, r3.zzzz, l(0, 2, 1, 0)\n    or r3.w, r0.z, r3.y\n    not r1.x, r1.x\n    and r1.x, r1.x, r3.w\n    or r1.x, r4.x, r1.x\n    iadd r3.y, r3.z, r3.y\n    or r0.z, r0.z, r3.y\n    movc r0.z, r1.w, r1.x, r0.z\n    ishl r1.x, CB0[0][2].x, l(1)\n    iadd r1.x, r0.w, r1.x\n    ushr r4.x, r5.x, l(16)\n    not r6.x, r4.x\n    ushr r6.yzw, r6.xxxx, l(0, 2, 4, 6)\n    and r6.xyzw, r6.xyzw, l(3, 3, 3, 3)\n    ushr r4.yzw, r4.xxxx, l(0, 2, 4, 6)\n    and r4.xyzw, r4.xyzw, l(3, 3, 3, 3)\n    imul null, r4.xyzw, r1.zzzz, r4.xyzw\n    imad r4.xyzw, r6.xyzw, r1.yyyy, r4.xyzw\n    and r6.xyzw, r4.xyzw, l(1023, 1023, 1023, 1023)\n    udiv r6.xyzw, null, r6.xyzw, l(3, 3, 3, 3)\n    ishl r6.xyzw, r6.xyzw, l(16, 16, 16, 16)\n    ubfe r7.xyzw, l(10, 10, 10, 10), l(10, 10, 10, 10), r4.xyzw\n    udiv r7.xyzw, null, r7.xyzw, l(3, 3, 3, 3)\n    bfi r6.xyzw, l(8, 8, 8, 8), l(8, 8, 8, 8), r7.xyzw, r6.xyzw\n    ushr r4.xyzw, r4.xyzw, l(20, 20, 20, 20)\n    udiv r4.xyzw, null, r4.xyzw, l(3, 3, 3, 3)\n    or r4.xyzw, r4.xyzw, r6.xyzw\n    ushr r3.y, r0.z, l(1)\n    and r3.y, r0.z, r3.y\n    and r3.y, r3.y, l(1170)\n    ishl r3.z, r3.y, l(1)\n    ushr r3.w, r3.y, l(1)\n    iadd r3.y, r3.y, r3.z\n    iadd r3.y, r3.y, r3.w\n    not r3.z, r3.y\n    and r3.yw, r0.zzzz, r3.yyyz\n    iadd r5.y, -r3.w, l(2925)\n    and r3.z, r3.z, r5.y\n    and r5.yz, r3.zzwz, l(0, 7, 7, 0)\n    imul null, r5.z, r2.w, r5.z\n    imad r5.y, r2.z, r5.y, r5.z\n    udiv r5.y, null, r5.y, l(5)\n    ubfe r6.xyz, l(3, 3, 3, 0), l(3, 6, 9, 0), r3.zzzz\n    ubfe r7.xyz, l(3, 3, 3, 0), l(3, 6, 9, 0), r3.wwww\n    imul null, r7.xyz, r2.wwww, r7.xyzx\n    imad r6.xyz, r2.zzzz, r6.xyzx, r7.xyzx\n    udiv r6.xyz, null, r6.xyzx, l(5, 5, 5, 0)\n    ishl r6.xyz, r6.xyzx, l(8, 16, 24, 0)\n    or r3.z, r5.y, r6.x\n    or r3.z, r6.y, r3.z\n    or r3.z, r6.z, r3.z\n    ishl r5.yzw, r3.yyyy, l(0, 5, 10, 15)\n    and r5.yzw, r5.yyzw, l(0, 256, 0x00010000, 0x01000000)\n    bfi r3.y, l(1), l(0), r3.y, r5.y\n    iadd r3.y, r5.z, r3.y\n    iadd r3.y, r5.w, r3.y\n    imad r3.y, r3.y, l(255), r3.z\n    not r3.z, r0.z\n    and r3.w, r3.z, l(7)\n    and r5.y, r0.z, l(7)\n    imul null, r5.y, r2.w, r5.y\n    imad r3.w, r2.z, r3.w, r5.y\n    udiv r3.w, null, r3.w, l(7)\n    ubfe r5.yzw, l(0, 3, 3, 3), l(0, 3, 6, 9), r3.zzzz\n    ubfe r6.xyz, l(3, 3, 3, 0), l(3, 6, 9, 0), r0.zzzz\n    imul null, r6.xyz, r2.wwww, r6.xyzx\n    imad r5.yzw, r2.zzzz, r5.yyzw, r6.xxyz\n    udiv r5.yzw, null, r5.yyzw, l(0, 7, 7, 7)\n    ishl r5.yzw, r5.yyzw, l(0, 8, 16, 24)\n    or r3.z, r3.w, r5.y\n    or r3.z, r5.z, r3.z\n    or r3.z, r5.w, r3.z\n    movc r6.w, r1.w, r3.y, r3.z\n    ishl r6.xyz, r6.wwww, l(24, 16, 8, 0)\n    and r6.xyzw, r6.xyzw, l(0xff000000, 0xff000000, 0xff000000, 0xff000000)\n    or r4.xyzw, r4.xyzw, r6.xyzw\n    store_raw U0[0].xyzw, r1.x, r4.xyzw\n    imad r1.x, vThreadID.y, l(4), l(3)\n    ult r1.x, r1.x, CB0[0][2].y\n    if_nz r1.x\n      imad r1.x, l(3), CB0[0][2].x, r0.w\n      ushr r4.x, r5.x, l(24)\n      not r5.x, r4.x\n      ushr r5.yzw, r5.xxxx, l(0, 2, 4, 6)\n      and r5.xyzw, r5.xyzw, l(3, 3, 3, 3)\n      ushr r4.yzw, r4.xxxx, l(0, 2, 4, 6)\n      and r4.xyzw, r4.xyzw, l(3, 3, 3, 3)\n      imul null, r4.xyzw, r1.zzzz, r4.xyzw\n      imad r4.xyzw, r5.xyzw, r1.yyyy, r4.xyzw\n      and r5.xyzw, r4.xyzw, l(1023, 1023, 1023, 1023)\n      udiv r5.xyzw, null, r5.xyzw, l(3, 3, 3, 3)\n      ishl r5.xyzw, r5.xyzw, l(16, 16, 16, 16)\n      ubfe r6.xyzw, l(10, 10, 10, 10), l(10, 10, 10, 10), r4.xyzw\n      udiv r6.xyzw, null, r6.xyzw, l(3, 3, 3, 3)\n      bfi r5.xyzw, l(8, 8, 8, 8), l(8, 8, 8, 8), r6.xyzw, r5.xyzw\n      ushr r4.xyzw, r4.xyzw, l(20, 20, 20, 20)\n      udiv r4.xyzw, null, r4.xyzw, l(3, 3, 3, 3)\n      or r4.xyzw, r4.xyzw, r5.xyzw\n      ushr r1.y, r0.z, l(12)\n      ushr r1.z, r1.y, l(1)\n      and r1.z, r1.y, r1.z\n      and r1.z, r1.z, l(1170)\n      ishl r3.y, r1.z, l(1)\n      ushr r3.z, r1.z, l(1)\n      iadd r1.z, r1.z, r3.y\n      iadd r1.z, r1.z, r3.z\n      not r3.y, r1.z\n      and r3.z, r1.y, r3.y\n      iadd r3.w, -r3.z, l(2925)\n      and r3.y, r3.y, r3.w\n      and r3.w, r3.y, l(7)\n      and r5.x, r3.z, l(7)\n      imul null, r5.x, r2.w, r5.x\n      imad r3.w, r2.z, r3.w, r5.x\n      udiv r3.w, null, r3.w, l(5)\n      ubfe r5.xyz, l(3, 3, 3, 0), l(3, 6, 9, 0), r3.yyyy\n      ubfe r6.xyz, l(3, 3, 3, 0), l(3, 6, 9, 0), r3.zzzz\n      imul null, r6.xyz, r2.wwww, r6.xyzx\n      imad r5.xyz, r2.zzzz, r5.xyzx, r6.xyzx\n      udiv r5.xyz, null, r5.xyzx, l(5, 5, 5, 0)\n      ishl r5.xyz, r5.xyzx, l(8, 16, 24, 0)\n      or r3.y, r3.w, r5.x\n      or r3.y, r5.y, r3.y\n      or r3.y, r5.z, r3.y\n      and r1.z, r1.z, r1.y\n      ishl r5.xyz, r1.zzzz, l(5, 10, 15, 0)\n      and r5.xyz, r5.xyzx, l(256, 0x00010000, 0x01000000, 0)\n      bfi r1.z, l(1), l(0), r1.z, r5.x\n      iadd r1.z, r5.y, r1.z\n      iadd r1.z, r5.z, r1.z\n      imad r1.z, r1.z, l(255), r3.y\n      not r1.y, r1.y\n      and r3.y, r1.y, l(7)\n      ubfe r5.xyzw, l(3, 3, 3, 3), l(12, 15, 18, 21), r0.zzzz\n      imul null, r5.xyzw, r2.wwww, r5.xyzw\n      imad r0.z, r2.z, r3.y, r5.x\n      udiv r0.z, null, r0.z, l(7)\n      ubfe r3.yzw, l(0, 3, 3, 3), l(0, 3, 6, 9), r1.yyyy\n      imad r3.yzw, r2.zzzz, r3.yyzw, r5.yyzw\n      udiv r3.yzw, null, r3.yyzw, l(0, 7, 7, 7)\n      ishl r3.yzw, r3.yyzw, l(0, 8, 16, 24)\n      or r0.z, r0.z, r3.y\n      or r0.z, r3.z, r0.z\n      or r0.z, r3.w, r0.z\n      movc r5.w, r1.w, r1.z, r0.z\n      ishl r5.xyz, r5.wwww, l(24, 16, 8, 0)\n      and r5.xyzw, r5.xyzw, l(0xff000000, 0xff000000, 0xff000000, 0xff000000)\n      or r4.xyzw, r4.xyzw, r5.xyzw\n      store_raw U0[0].xyzw, r1.x, r4.xyzw\n    endif \n  endif \nendif \niadd r0.z, r0.w, l(16)\nif_nz r0.x\n  mov r0.x, l(32)\nelse \n  mov r0.x, l(16)\nendif \niadd r0.x, r0.x, r0.y\nld_raw r1.xyzw, r0.x, T0[0].yxzw\nif_nz r2.x\n  ishl r4.xyzw, r1.yxzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r5.xyzw, r1.yxzw, l(8, 8, 8, 8)\n  and r5.xyzw, r5.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r1.xyzw, r4.yxzw, r5.yxzw\nendif \nif_nz r2.y\n  ushr r2.xyzw, r1.yxzw, l(16, 16, 16, 16)\n  bfi r1.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r1.xyzw, r2.yxzw\n  mov r2.xy, r1.ywyy\nelse \n  mov r2.xy, r1.ywyy\nendif \nishl r4.xyz, r1.zzzz, l(3, 7, 12, 0)\nushr r5.xyz, r1.zzzz, l(13, 4, 9, 0)\nmov r4.w, r5.x\nand r0.xy, r4.xwxx, l(248, 248, 0, 0)\nmov r5.xw, r4.zzzy\nand r1.yz, r5.wwzw, l(0, 0x0003f000, 0x0003f000, 0)\niadd r0.xy, r0.xyxx, r1.yzyy\nand r1.yz, r5.xxyx, l(0, 0x0f800000, 0x0f800000, 0)\niadd r0.xy, r0.xyxx, r1.yzyy\nushr r1.yz, r0.xxyx, l(0, 5, 5, 0)\nand r1.yz, r1.yyzy, l(0, 0x00700007, 0x00700007, 0)\niadd r0.xy, r0.xyxx, r1.yzyy\nushr r1.yz, r0.xxyx, l(0, 6, 6, 0)\nand r1.yz, r1.yyzy, l(0, 3072, 3072, 0)\niadd r0.xy, r0.xyxx, r1.yzyy\nishl r0.w, r2.y, l(1)\nand r0.w, r0.w, l(0xaaaaaaaa)\nushr r1.yzw, r2.yyxx, l(0, 1, 8, 16)\nand r1.y, r1.y, l(0x55555555)\niadd r0.w, r0.w, r1.y\nushr r1.y, r0.w, l(1)\nand r1.y, r1.y, l(0x55555555)\nxor r4.x, r0.w, r1.y\nmov r2.z, r1.z\nand r1.yz, r2.xxzx, l(0, 255, 255, 0)\nbfi r0.w, l(8), l(16), r1.x, l(0)\niadd r0.w, r0.w, r1.w\nuge r1.w, r1.z, r1.y\nushr r2.xy, r0.wwww, l(1, 2, 0, 0)\nand r2.z, r0.w, r2.x\nand r2.z, r2.z, l(0x00492492)\nishl r2.w, r2.z, l(1)\nushr r3.y, r2.z, l(1)\niadd r2.z, r2.z, r2.w\niadd r2.z, r2.z, r3.y\nand r2.w, r0.w, l(0x00249249)\niadd r3.y, r2.w, l(0x00db6db6)\nand r3.y, r2.z, r3.y\nor r3.z, r0.w, r2.x\nand r5.xy, r2.xyxx, l(0x00249249, 0x00249249, 0, 0)\nor r2.x, r2.y, r3.z\nand r2.x, r2.x, l(0x00249249)\nxor r2.x, r2.x, l(0x00249249)\nnot r3.zw, r5.xxxy\nand r2.y, r2.w, r3.z\nand r2.y, r3.w, r2.y\nor r0.w, r0.w, r2.x\niadd r0.w, r0.w, l(0xffdb6db7)\nor r0.w, r2.y, r0.w\nishl r2.xy, r2.yyyy, l(2, 1, 0, 0)\nor r2.w, r0.w, r2.x\nnot r2.z, r2.z\nand r2.z, r2.z, r2.w\nor r2.z, r3.y, r2.z\niadd r2.x, r2.y, r2.x\nor r0.w, r0.w, r2.x\nmovc r0.w, r1.w, r2.z, r0.w\nnot r2.x, r4.x\nushr r2.yzw, r2.xxxx, l(0, 2, 4, 6)\nand r2.xyzw, r2.xyzw, l(3, 3, 3, 3)\nushr r4.yzw, r4.xxxx, l(0, 2, 4, 6)\nand r5.xyzw, r4.xyzw, l(3, 3, 3, 3)\nimul null, r5.xyzw, r0.yyyy, r5.xyzw\nimad r2.xyzw, r2.xyzw, r0.xxxx, r5.xyzw\nand r5.xyzw, r2.xyzw, l(1023, 1023, 1023, 1023)\nudiv r5.xyzw, null, r5.xyzw, l(3, 3, 3, 3)\nishl r5.xyzw, r5.xyzw, l(16, 16, 16, 16)\nubfe r6.xyzw, l(10, 10, 10, 10), l(10, 10, 10, 10), r2.xyzw\nudiv r6.xyzw, null, r6.xyzw, l(3, 3, 3, 3)\nbfi r5.xyzw, l(8, 8, 8, 8), l(8, 8, 8, 8), r6.xyzw, r5.xyzw\nushr r2.xyzw, r2.xyzw, l(20, 20, 20, 20)\nudiv r2.xyzw, null, r2.xyzw, l(3, 3, 3, 3)\nor r2.xyzw, r2.xyzw, r5.xyzw\nushr r3.y, r0.w, l(1)\nand r3.y, r0.w, r3.y\nand r3.y, r3.y, l(1170)\nishl r3.z, r3.y, l(1)\nushr r3.w, r3.y, l(1)\niadd r3.y, r3.y, r3.z\niadd r3.y, r3.y, r3.w\nnot r3.z, r3.y\nand r3.yw, r0.wwww, r3.yyyz\niadd r4.y, -r3.w, l(2925)\nand r3.z, r3.z, r4.y\nand r4.yz, r3.zzwz, l(0, 7, 7, 0)\nimul null, r4.z, r1.z, r4.z\nimad r4.y, r1.y, r4.y, r4.z\nudiv r4.y, null, r4.y, l(5)\nubfe r5.xyz, l(3, 3, 3, 0), l(3, 6, 9, 0), r3.zzzz\nubfe r6.xyz, l(3, 3, 3, 0), l(3, 6, 9, 0), r3.wwww\nimul null, r6.xyz, r1.zzzz, r6.xyzx\nimad r5.xyz, r1.yyyy, r5.xyzx, r6.xyzx\nudiv r5.xyz, null, r5.xyzx, l(5, 5, 5, 0)\nishl r5.xyz, r5.xyzx, l(8, 16, 24, 0)\nor r3.z, r4.y, r5.x\nor r3.z, r5.y, r3.z\nor r3.z, r5.z, r3.z\nishl r4.yzw, r3.yyyy, l(0, 5, 10, 15)\nand r4.yzw, r4.yyzw, l(0, 256, 0x00010000, 0x01000000)\nbfi r3.y, l(1), l(0), r3.y, r4.y\niadd r3.y, r4.z, r3.y\niadd r3.y, r4.w, r3.y\nimad r3.y, r3.y, l(255), r3.z\nnot r3.z, r0.w\nand r3.w, r3.z, l(7)\nand r4.y, r0.w, l(7)\nimul null, r4.y, r1.z, r4.y\nimad r3.w, r1.y, r3.w, r4.y\nudiv r3.w, null, r3.w, l(7)\nubfe r4.yzw, l(0, 3, 3, 3), l(0, 3, 6, 9), r3.zzzz\nubfe r5.xyz, l(3, 3, 3, 0), l(3, 6, 9, 0), r0.wwww\nimul null, r5.xyz, r1.zzzz, r5.xyzx\nimad r4.yzw, r1.yyyy, r4.yyzw, r5.xxyz\nudiv r4.yzw, null, r4.yyzw, l(0, 7, 7, 7)\nishl r4.yzw, r4.yyzw, l(0, 8, 16, 24)\nor r3.z, r3.w, r4.y\nor r3.z, r4.z, r3.z\nor r3.z, r4.w, r3.z\nmovc r5.w, r1.w, r3.y, r3.z\nishl r5.xyz, r5.wwww, l(24, 16, 8, 0)\nand r5.xyzw, r5.xyzw, l(0xff000000, 0xff000000, 0xff000000, 0xff000000)\nor r2.xyzw, r2.xyzw, r5.xyzw\nstore_raw U0[0].xyzw, r0.z, r2.xyzw\nif_nz r3.x\n  iadd r2.x, r0.z, CB0[0][2].x\n  ushr r3.x, r4.x, l(8)\n  not r5.x, r3.x\n  ushr r5.yzw, r5.xxxx, l(0, 2, 4, 6)\n  and r5.xyzw, r5.xyzw, l(3, 3, 3, 3)\n  ushr r3.yzw, r3.xxxx, l(0, 2, 4, 6)\n  and r3.xyzw, r3.xyzw, l(3, 3, 3, 3)\n  imul null, r3.xyzw, r0.yyyy, r3.xyzw\n  imad r3.xyzw, r5.xyzw, r0.xxxx, r3.xyzw\n  and r5.xyzw, r3.xyzw, l(1023, 1023, 1023, 1023)\n  udiv r5.xyzw, null, r5.xyzw, l(3, 3, 3, 3)\n  ishl r5.xyzw, r5.xyzw, l(16, 16, 16, 16)\n  ubfe r6.xyzw, l(10, 10, 10, 10), l(10, 10, 10, 10), r3.xyzw\n  udiv r6.xyzw, null, r6.xyzw, l(3, 3, 3, 3)\n  bfi r5.xyzw, l(8, 8, 8, 8), l(8, 8, 8, 8), r6.xyzw, r5.xyzw\n  ushr r3.xyzw, r3.xyzw, l(20, 20, 20, 20)\n  udiv r3.xyzw, null, r3.xyzw, l(3, 3, 3, 3)\n  or r3.xyzw, r3.xyzw, r5.xyzw\n  ushr r2.y, r0.w, l(12)\n  ushr r2.z, r2.y, l(1)\n  and r2.z, r2.y, r2.z\n  and r2.z, r2.z, l(1170)\n  ishl r2.w, r2.z, l(1)\n  ushr r4.y, r2.z, l(1)\n  iadd r2.z, r2.z, r2.w\n  iadd r2.z, r2.z, r4.y\n  not r2.w, r2.z\n  and r4.y, r2.w, r2.y\n  iadd r4.z, -r4.y, l(2925)\n  and r2.w, r2.w, r4.z\n  and r4.z, r2.w, l(7)\n  and r4.w, r4.y, l(7)\n  imul null, r4.w, r1.z, r4.w\n  imad r4.z, r1.y, r4.z, r4.w\n  udiv r4.z, null, r4.z, l(5)\n  ubfe r5.xyz, l(3, 3, 3, 0), l(3, 6, 9, 0), r2.wwww\n  ubfe r6.xyz, l(3, 3, 3, 0), l(3, 6, 9, 0), r4.yyyy\n  imul null, r6.xyz, r1.zzzz, r6.xyzx\n  imad r5.xyz, r1.yyyy, r5.xyzx, r6.xyzx\n  udiv r5.xyz, null, r5.xyzx, l(5, 5, 5, 0)\n  ishl r5.xyz, r5.xyzx, l(8, 16, 24, 0)\n  or r2.w, r4.z, r5.x\n  or r2.w, r5.y, r2.w\n  or r2.w, r5.z, r2.w\n  and r2.z, r2.z, r2.y\n  ishl r4.yzw, r2.zzzz, l(0, 5, 10, 15)\n  and r4.yzw, r4.yyzw, l(0, 256, 0x00010000, 0x01000000)\n  bfi r2.z, l(1), l(0), r2.z, r4.y\n  iadd r2.z, r4.z, r2.z\n  iadd r2.z, r4.w, r2.z\n  imad r2.z, r2.z, l(255), r2.w\n  not r2.y, r2.y\n  and r2.w, r2.y, l(7)\n  ubfe r5.xyzw, l(3, 3, 3, 3), l(12, 15, 18, 21), r0.wwww\n  imul null, r5.xyzw, r1.zzzz, r5.xyzw\n  imad r0.w, r1.y, r2.w, r5.x\n  udiv r0.w, null, r0.w, l(7)\n  ubfe r4.yzw, l(0, 3, 3, 3), l(0, 3, 6, 9), r2.yyyy\n  imad r4.yzw, r1.yyyy, r4.yyzw, r5.yyzw\n  udiv r4.yzw, null, r4.yyzw, l(0, 7, 7, 7)\n  ishl r4.yzw, r4.yyzw, l(0, 8, 16, 24)\n  or r0.w, r0.w, r4.y\n  or r0.w, r4.z, r0.w\n  or r0.w, r4.w, r0.w\n  movc r5.w, r1.w, r2.z, r0.w\n  ishl r5.xyz, r5.wwww, l(24, 16, 8, 0)\n  and r5.xyzw, r5.xyzw, l(0xff000000, 0xff000000, 0xff000000, 0xff000000)\n  or r3.xyzw, r3.xyzw, r5.xyzw\n  store_raw U0[0].xyzw, r2.x, r3.xyzw\n  imad r0.w, vThreadID.y, l(4), l(2)\n  ult r0.w, r0.w, CB0[0][2].y\n  if_nz r0.w\n    ushr r0.w, r1.x, l(8)\n    ushr r2.xy, r0.wwww, l(1, 2, 0, 0)\n    and r1.x, r0.w, r2.x\n    and r1.x, r1.x, l(0x00492492)\n    ishl r2.z, r1.x, l(1)\n    ushr r2.w, r1.x, l(1)\n    iadd r1.x, r1.x, r2.z\n    iadd r1.x, r1.x, r2.w\n    and r2.z, r0.w, l(0x00249249)\n    iadd r2.w, r2.z, l(0x00db6db6)\n    and r2.w, r1.x, r2.w\n    or r3.x, r0.w, r2.x\n    and r3.yz, r2.xxyx, l(0, 0x00249249, 0x00249249, 0)\n    or r2.x, r2.y, r3.x\n    and r2.x, r2.x, l(0x00249249)\n    xor r2.x, r2.x, l(0x00249249)\n    not r3.xy, r3.yzyy\n    and r2.y, r2.z, r3.x\n    and r2.y, r3.y, r2.y\n    or r0.w, r0.w, r2.x\n    iadd r0.w, r0.w, l(0xffdb6db7)\n    or r0.w, r2.y, r0.w\n    ishl r2.xy, r2.yyyy, l(2, 1, 0, 0)\n    or r2.z, r0.w, r2.x\n    not r1.x, r1.x\n    and r1.x, r1.x, r2.z\n    or r1.x, r2.w, r1.x\n    iadd r2.x, r2.y, r2.x\n    or r0.w, r0.w, r2.x\n    movc r0.w, r1.w, r1.x, r0.w\n    ishl r1.x, CB0[0][2].x, l(1)\n    iadd r1.x, r0.z, r1.x\n    ushr r2.x, r4.x, l(16)\n    not r3.x, r2.x\n    ushr r3.yzw, r3.xxxx, l(0, 2, 4, 6)\n    and r3.xyzw, r3.xyzw, l(3, 3, 3, 3)\n    ushr r2.yzw, r2.xxxx, l(0, 2, 4, 6)\n    and r2.xyzw, r2.xyzw, l(3, 3, 3, 3)\n    imul null, r2.xyzw, r0.yyyy, r2.xyzw\n    imad r2.xyzw, r3.xyzw, r0.xxxx, r2.xyzw\n    and r3.xyzw, r2.xyzw, l(1023, 1023, 1023, 1023)\n    udiv r3.xyzw, null, r3.xyzw, l(3, 3, 3, 3)\n    ishl r3.xyzw, r3.xyzw, l(16, 16, 16, 16)\n    ubfe r5.xyzw, l(10, 10, 10, 10), l(10, 10, 10, 10), r2.xyzw\n    udiv r5.xyzw, null, r5.xyzw, l(3, 3, 3, 3)\n    bfi r3.xyzw, l(8, 8, 8, 8), l(8, 8, 8, 8), r5.xyzw, r3.xyzw\n    ushr r2.xyzw, r2.xyzw, l(20, 20, 20, 20)\n    udiv r2.xyzw, null, r2.xyzw, l(3, 3, 3, 3)\n    or r2.xyzw, r2.xyzw, r3.xyzw\n    ushr r3.x, r0.w, l(1)\n    and r3.x, r0.w, r3.x\n    and r3.x, r3.x, l(1170)\n    ishl r3.y, r3.x, l(1)\n    ushr r3.z, r3.x, l(1)\n    iadd r3.x, r3.x, r3.y\n    iadd r3.x, r3.x, r3.z\n    not r3.y, r3.x\n    and r3.xz, r0.wwww, r3.xxyx\n    iadd r3.w, -r3.z, l(2925)\n    and r3.y, r3.y, r3.w\n    and r3.w, r3.y, l(7)\n    and r4.y, r3.z, l(7)\n    imul null, r4.y, r1.z, r4.y\n    imad r3.w, r1.y, r3.w, r4.y\n    udiv r3.w, null, r3.w, l(5)\n    ubfe r4.yzw, l(0, 3, 3, 3), l(0, 3, 6, 9), r3.yyyy\n    ubfe r5.xyz, l(3, 3, 3, 0), l(3, 6, 9, 0), r3.zzzz\n    imul null, r5.xyz, r1.zzzz, r5.xyzx\n    imad r4.yzw, r1.yyyy, r4.yyzw, r5.xxyz\n    udiv r4.yzw, null, r4.yyzw, l(0, 5, 5, 5)\n    ishl r4.yzw, r4.yyzw, l(0, 8, 16, 24)\n    or r3.y, r3.w, r4.y\n    or r3.y, r4.z, r3.y\n    or r3.y, r4.w, r3.y\n    ishl r4.yzw, r3.xxxx, l(0, 5, 10, 15)\n    and r4.yzw, r4.yyzw, l(0, 256, 0x00010000, 0x01000000)\n    bfi r3.x, l(1), l(0), r3.x, r4.y\n    iadd r3.x, r4.z, r3.x\n    iadd r3.x, r4.w, r3.x\n    imad r3.x, r3.x, l(255), r3.y\n    not r3.y, r0.w\n    and r3.z, r3.y, l(7)\n    and r3.w, r0.w, l(7)\n    imul null, r3.w, r1.z, r3.w\n    imad r3.z, r1.y, r3.z, r3.w\n    udiv r3.z, null, r3.z, l(7)\n    ubfe r4.yzw, l(0, 3, 3, 3), l(0, 3, 6, 9), r3.yyyy\n    ubfe r5.xyz, l(3, 3, 3, 0), l(3, 6, 9, 0), r0.wwww\n    imul null, r5.xyz, r1.zzzz, r5.xyzx\n    imad r4.yzw, r1.yyyy, r4.yyzw, r5.xxyz\n    udiv r4.yzw, null, r4.yyzw, l(0, 7, 7, 7)\n    ishl r4.yzw, r4.yyzw, l(0, 8, 16, 24)\n    or r3.y, r3.z, r4.y\n    or r3.y, r4.z, r3.y\n    or r3.y, r4.w, r3.y\n    movc r3.w, r1.w, r3.x, r3.y\n    ishl r3.xyz, r3.wwww, l(24, 16, 8, 0)\n    and r3.xyzw, r3.xyzw, l(0xff000000, 0xff000000, 0xff000000, 0xff000000)\n    or r2.xyzw, r2.xyzw, r3.xyzw\n    store_raw U0[0].xyzw, r1.x, r2.xyzw\n    imad r1.x, vThreadID.y, l(4), l(3)\n    ult r1.x, r1.x, CB0[0][2].y\n    if_nz r1.x\n      imad r0.z, l(3), CB0[0][2].x, r0.z\n      ushr r2.x, r4.x, l(24)\n      not r3.x, r2.x\n      ushr r3.yzw, r3.xxxx, l(0, 2, 4, 6)\n      and r3.xyzw, r3.xyzw, l(3, 3, 3, 3)\n      ushr r2.yzw, r2.xxxx, l(0, 2, 4, 6)\n      and r2.xyzw, r2.xyzw, l(3, 3, 3, 3)\n      imul null, r2.xyzw, r0.yyyy, r2.xyzw\n      imad r2.xyzw, r3.xyzw, r0.xxxx, r2.xyzw\n      and r3.xyzw, r2.xyzw, l(1023, 1023, 1023, 1023)\n      udiv r3.xyzw, null, r3.xyzw, l(3, 3, 3, 3)\n      ishl r3.xyzw, r3.xyzw, l(16, 16, 16, 16)\n      ubfe r4.xyzw, l(10, 10, 10, 10), l(10, 10, 10, 10), r2.xyzw\n      udiv r4.xyzw, null, r4.xyzw, l(3, 3, 3, 3)\n      bfi r3.xyzw, l(8, 8, 8, 8), l(8, 8, 8, 8), r4.xyzw, r3.xyzw\n      ushr r2.xyzw, r2.xyzw, l(20, 20, 20, 20)\n      udiv r2.xyzw, null, r2.xyzw, l(3, 3, 3, 3)\n      or r2.xyzw, r2.xyzw, r3.xyzw\n      ushr r0.x, r0.w, l(12)\n      ushr r0.y, r0.x, l(1)\n      and r0.y, r0.x, r0.y\n      and r0.y, r0.y, l(1170)\n      ishl r1.x, r0.y, l(1)\n      ushr r3.x, r0.y, l(1)\n      iadd r0.y, r0.y, r1.x\n      iadd r0.y, r0.y, r3.x\n      not r1.x, r0.y\n      and r3.x, r0.x, r1.x\n      iadd r3.y, -r3.x, l(2925)\n      and r1.x, r1.x, r3.y\n      and r3.y, r1.x, l(7)\n      and r3.z, r3.x, l(7)\n      imul null, r3.z, r1.z, r3.z\n      imad r3.y, r1.y, r3.y, r3.z\n      ubfe r4.xyz, l(3, 3, 3, 0), l(3, 6, 9, 0), r1.xxxx\n      ubfe r3.xzw, l(3, 0, 3, 3), l(3, 0, 6, 9), r3.xxxx\n      imul null, r3.xzw, r1.zzzz, r3.xxzw\n      imad r3.xzw, r1.yyyy, r4.xxyz, r3.xxzw\n      udiv r3.xyzw, null, r3.xyzw, l(5, 5, 5, 5)\n      ishl r3.xzw, r3.xxzw, l(8, 0, 16, 24)\n      or r1.x, r3.x, r3.y\n      or r1.x, r3.z, r1.x\n      or r1.x, r3.w, r1.x\n      and r0.y, r0.y, r0.x\n      ishl r3.xyz, r0.yyyy, l(5, 10, 15, 0)\n      and r3.xyz, r3.xyzx, l(256, 0x00010000, 0x01000000, 0)\n      bfi r0.y, l(1), l(0), r0.y, r3.x\n      iadd r0.y, r3.y, r0.y\n      iadd r0.y, r3.z, r0.y\n      imad r0.y, r0.y, l(255), r1.x\n      not r0.x, r0.x\n      and r1.x, r0.x, l(7)\n      ubfe r3.xyzw, l(3, 3, 3, 3), l(12, 15, 18, 21), r0.wwww\n      imul null, r3.xyzw, r1.zzzz, r3.xyzw\n      imad r0.w, r1.y, r1.x, r3.x\n      udiv r0.w, null, r0.w, l(7)\n      ubfe r4.xyz, l(3, 3, 3, 0), l(3, 6, 9, 0), r0.xxxx\n      imad r1.xyz, r1.yyyy, r4.xyzx, r3.yzwy\n      udiv r1.xyz, null, r1.xyzx, l(7, 7, 7, 0)\n      ishl r1.xyz, r1.xyzx, l(8, 16, 24, 0)\n      or r0.x, r0.w, r1.x\n      or r0.x, r1.y, r0.x\n      or r0.x, r1.z, r0.x\n      movc r1.w, r1.w, r0.y, r0.x\n      ishl r1.xyz, r1.wwww, l(24, 16, 8, 0)\n      and r1.xyzw, r1.xyzw, l(0xff000000, 0xff000000, 0xff000000, 0xff000000)\n      or r1.xyzw, r1.xyzw, r2.xyzw\n      store_raw U0[0].xyzw, r0.z, r1.xyzw\n    endif \n  endif \nendif \nret \n// Approximately 841 instruction slots used\n#endif\n\nconst BYTE texture_load_dxt5_rgba8_cs[] =\n{\n     68,  88,  66,  67, 159, 177, \n     60,  88, 207, 221,  67, 153, \n      5, 217,  88, 191, 193,  26, \n    123, 209,   1,   0,   0,   0, \n    148, 115,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n    248, 114,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n    188, 110,   0,   0,  81,   0, \n      5,   0, 175,  27,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   8,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  12,  50,   0,  16,   0, \n      0,   0,   0,   0,   6, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n    194,   0,  16,   0,   0,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0,   6, 132, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  11, \n     66,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10,  98,   0,  16,   0, \n      1,   0,   0,   0,   6,   1, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,   7, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     35,   0,   0,  10,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,   2,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  35,   0, \n      0,  11, 130,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     30,   0,   0,   9, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  58, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     31,   0,   0,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  42,   0, \n      2,   0,  26,   0,   2,   0, \n     35,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     42, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  41,   0,   0,   7, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     18,   0,   0,   1,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  12, 194,   0,  16,   0, \n      1,   0,   0,   0, 166, 142, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   5,   0,   0,   0, \n      4,   0,   0,   0,  42,   0, \n      0,   9, 242,   0,  16,   0, \n      2,   0,   0,   0, 102,   5, \n      2,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   1,   0,   0,   0, \n      3,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0, 139,   0, \n      0,   8, 130,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  27,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  10,   0,   2,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  19, 194,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   5,   0,   0,   0, \n      4,   0,   0,   0, 166,   6, \n      2,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  11,  66,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  25,   0, \n      0,   0,   1,  64,   0,   0, \n      7,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  87,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n    138,   0,   0,   9,  18,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  20,  98,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0, 166,  10, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,   9,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     64,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 139,   0, \n      0,  15,  50,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  27,   0,   0,   0, \n     24,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  86,   5,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   8,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  20,   0, \n      0,   0,   1,  64,   0,   0, \n     12,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  18,   0,   0,   1, \n     85,   0,   0,   9,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     42, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   5,   0,   0,   0, \n     42,   0,   0,   9, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     86,   5,   2,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n      1,   0,   0,   0,   4,   0, \n      0,   0,   3,   0,   0,   0, \n    139,   0,   0,   8,  66,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  27,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  10,   0, \n      2,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  20, \n    114,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,  11,   0, \n      0,   0,   0,   0,   0,   0, \n    214,   6,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  66,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  26,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0, 138,   0,   0,   9, \n     18,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  87,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  10,  66,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  26,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  64,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 139,   0,   0,  15, \n    194,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  27,   0,   0,   0, \n     24,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   4,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  21,   0, \n      0,   1,  30,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  22, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  32,   0, \n      0,  10, 114,   0,  16,   0, \n      2,   0,   0,   0, 166,  10, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   2,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   2,   0, \n      0,   0, 150,   5,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     22,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,  85,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  22,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      1,   0,   0,   0,  22,  14, \n     16,   0,   3,   0,   0,   0, \n     22,  14,  16,   0,   4,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     22,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  22,  14, \n     16,   0,   3,   0,   0,   0, \n     54,   0,   0,   5,  50,   0, \n     16,   0,   3,   0,   0,   0, \n    214,   5,  16,   0,   1,   0, \n      0,   0,  18,   0,   0,   1, \n     54,   0,   0,   5,  50,   0, \n     16,   0,   3,   0,   0,   0, \n    214,   5,  16,   0,   1,   0, \n      0,   0,  21,   0,   0,   1, \n     41,   0,   0,  10, 114,   0, \n     16,   0,   4,   0,   0,   0, \n    166,  10,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   7,   0, \n      0,   0,  12,   0,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10, 114,   0,  16,   0, \n      5,   0,   0,   0, 166,  10, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  13,   0, \n      0,   0,   4,   0,   0,   0, \n      9,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n    130,   0,  16,   0,   4,   0, \n      0,   0,  10,   0,  16,   0, \n      5,   0,   0,   0,   1,   0, \n      0,  10,  98,   0,  16,   0, \n      1,   0,   0,   0,   6,   3, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0, 248,   0,   0,   0, \n    248,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n    146,   0,  16,   0,   5,   0, \n      0,   0, 166,   6,  16,   0, \n      4,   0,   0,   0,   1,   0, \n      0,  10, 194,   0,  16,   0, \n      2,   0,   0,   0, 246,  11, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0, 240,   3,   0,   0, 240, \n      3,   0,  30,   0,   0,   7, \n     98,   0,  16,   0,   1,   0, \n      0,   0,  86,   6,  16,   0, \n      1,   0,   0,   0, 166,  11, \n     16,   0,   2,   0,   0,   0, \n      1,   0,   0,  10, 194,   0, \n     16,   0,   2,   0,   0,   0, \n      6,   4,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 128,  15, \n      0,   0, 128,  15,  30,   0, \n      0,   7,  98,   0,  16,   0, \n      1,   0,   0,   0,  86,   6, \n     16,   0,   1,   0,   0,   0, \n    166,  11,  16,   0,   2,   0, \n      0,   0,  85,   0,   0,  10, \n    194,   0,  16,   0,   2,   0, \n      0,   0,  86,   9,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n      1,   0,   0,  10, 194,   0, \n     16,   0,   2,   0,   0,   0, \n    166,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   7,   0, 112,   0, \n      7,   0, 112,   0,  30,   0, \n      0,   7,  98,   0,  16,   0, \n      1,   0,   0,   0,  86,   6, \n     16,   0,   1,   0,   0,   0, \n    166,  11,  16,   0,   2,   0, \n      0,   0,  85,   0,   0,  10, \n    194,   0,  16,   0,   2,   0, \n      0,   0,  86,   9,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   6,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,  10, 194,   0, \n     16,   0,   2,   0,   0,   0, \n    166,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,  12,   0,   0, \n      0,  12,   0,   0,  30,   0, \n      0,   7,  98,   0,  16,   0, \n      1,   0,   0,   0,  86,   6, \n     16,   0,   1,   0,   0,   0, \n    166,  11,  16,   0,   2,   0, \n      0,   0,  41,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n    170, 170, 170, 170,  85,   0, \n      0,  10, 114,   0,  16,   0, \n      4,   0,   0,   0,  22,   4, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   8,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      4,   0,   0,   0,   1,  64, \n      0,   0,  85,  85,  85,  85, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  85,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  85,  85,  85,  85, \n     87,   0,   0,   7,  18,   0, \n     16,   0,   5,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  54,   0, \n      0,   5,  66,   0,  16,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n      1,   0,   0,  10, 194,   0, \n     16,   0,   2,   0,   0,   0, \n      6,   8,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 140,   0, \n      0,  11,  66,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      4,   0,   0,   0,  80,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   3,   0, \n      0,   0, 166,  10,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   7,  66,   0, \n     16,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   7,  66,   0,  16,   0, \n      3,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0, 146,  36, \n     73,   0,  41,   0,   0,   7, \n    130,   0,  16,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     85,   0,   0,   7,  18,   0, \n     16,   0,   4,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      3,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,  30,   0,   0,   7, \n     66,   0,  16,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n      1,   0,   0,   7, 130,   0, \n     16,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     73, 146,  36,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      4,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0, 182, 109, \n    219,   0,   1,   0,   0,   7, \n     18,   0,  16,   0,   4,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     60,   0,   0,   7,  34,   0, \n     16,   0,   4,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      3,   0,   0,   0,   1,   0, \n      0,  10, 194,   0,  16,   0, \n      4,   0,   0,   0,   6,   4, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     73, 146,  36,   0,  73, 146, \n     36,   0,  60,   0,   0,   7, \n     18,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n      1,   0,   0,   7,  18,   0, \n     16,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n     73, 146,  36,   0,  87,   0, \n      0,   7,  18,   0,  16,   0, \n      3,   0,   0,   0,  10,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,  73, 146, \n     36,   0,  59,   0,   0,   5, \n     98,   0,  16,   0,   4,   0, \n      0,   0, 166,  11,  16,   0, \n      4,   0,   0,   0,   1,   0, \n      0,   7,  34,   0,  16,   0, \n      3,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0,   1,   0,   0,   7, \n     34,   0,  16,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      4,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n     60,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      3,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0, 183, 109, \n    219, 255,  60,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     41,   0,   0,  10,  50,   0, \n     16,   0,   3,   0,   0,   0, \n     86,   5,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  60,   0, \n      0,   7, 130,   0,  16,   0, \n      3,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   3,   0, \n      0,   0,  59,   0,   0,   5, \n     66,   0,  16,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   7,  66,   0,  16,   0, \n      3,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,  60,   0,   0,   7, \n     66,   0,  16,   0,   3,   0, \n      0,   0,  10,   0,  16,   0, \n      4,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n     30,   0,   0,   7,  18,   0, \n     16,   0,   3,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,  10,   0,  16,   0, \n      3,   0,   0,   0,  60,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   3,   0, \n      0,   0,  55,   0,   0,   9, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  59,   0,   0,   5, \n     18,   0,  16,   0,   3,   0, \n      0,   0,  10,   0,  16,   0, \n      5,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      3,   0,   0,   0,   6,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      4,   0,   0,   0,   6,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   5,   0,   0,   0, \n      6,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 242,   0, \n     16,   0,   4,   0,   0,   0, \n    166,  10,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  35,   0, \n      0,   9, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,  78,   0,   0,  11, \n    242,   0,  16,   0,   4,   0, \n      0,   0,   0, 208,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  78,   0,   0,  11, \n    242,   0,  16,   0,   6,   0, \n      0,   0,   0, 208,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n      3,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   7, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  85,   0, \n      0,   7,  18,   0,  16,   0, \n      4,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   7, \n     18,   0,  16,   0,   4,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n      1,   0,   0,   7,  18,   0, \n     16,   0,   4,   0,   0,   0, \n     10,   0,  16,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n    146,   4,   0,   0,  41,   0, \n      0,   7,  34,   0,  16,   0, \n      4,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  85,   0,   0,   7, \n     66,   0,  16,   0,   4,   0, \n      0,   0,  10,   0,  16,   0, \n      4,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     30,   0,   0,   7,  18,   0, \n     16,   0,   4,   0,   0,   0, \n     10,   0,  16,   0,   4,   0, \n      0,   0,  26,   0,  16,   0, \n      4,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      4,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     42,   0,  16,   0,   4,   0, \n      0,   0,  59,   0,   0,   5, \n     34,   0,  16,   0,   4,   0, \n      0,   0,  10,   0,  16,   0, \n      4,   0,   0,   0,   1,   0, \n      0,   7,  82,   0,  16,   0, \n      4,   0,   0,   0, 166,  10, \n     16,   0,   0,   0,   0,   0, \n      6,   1,  16,   0,   4,   0, \n      0,   0,  30,   0,   0,   8, \n    130,   0,  16,   0,   4,   0, \n      0,   0,  42,   0,  16, 128, \n     65,   0,   0,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n    109,  11,   0,   0,   1,   0, \n      0,   7,  34,   0,  16,   0, \n      4,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n     58,   0,  16,   0,   4,   0, \n      0,   0,   1,   0,   0,   7, \n    130,   0,  16,   0,   4,   0, \n      0,   0,  26,   0,  16,   0, \n      4,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n      1,   0,   0,   7,  34,   0, \n     16,   0,   5,   0,   0,   0, \n     42,   0,  16,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n      7,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n     34,   0,  16,   0,   5,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   5,   0,   0,   0, \n     35,   0,   0,   9, 130,   0, \n     16,   0,   4,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,  26,   0, \n     16,   0,   5,   0,   0,   0, \n     78,   0,   0,   8, 130,   0, \n     16,   0,   4,   0,   0,   0, \n      0, 208,   0,   0,  58,   0, \n     16,   0,   4,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0, 138,   0,   0,  15, \n    226,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,   9,   0,   0,   0, \n     86,   5,  16,   0,   4,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      6,   0,   0,   0,   9,   0, \n      0,   0,   0,   0,   0,   0, \n    166,  10,  16,   0,   4,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 114,   0, \n     16,   0,   6,   0,   0,   0, \n    246,  15,  16,   0,   2,   0, \n      0,   0,  70,   2,  16,   0, \n      6,   0,   0,   0,  35,   0, \n      0,   9, 226,   0,  16,   0, \n      5,   0,   0,   0, 166,  10, \n     16,   0,   2,   0,   0,   0, \n     86,  14,  16,   0,   5,   0, \n      0,   0,   6,   9,  16,   0, \n      6,   0,   0,   0,  78,   0, \n      0,  11, 226,   0,  16,   0, \n      5,   0,   0,   0,   0, 208, \n      0,   0,  86,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n     41,   0,   0,  10, 226,   0, \n     16,   0,   5,   0,   0,   0, \n     86,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  16,   0,   0,   0, \n     24,   0,   0,   0,  60,   0, \n      0,   7,  34,   0,  16,   0, \n      4,   0,   0,   0,  58,   0, \n     16,   0,   4,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0,  60,   0,   0,   7, \n     34,   0,  16,   0,   4,   0, \n      0,   0,  42,   0,  16,   0, \n      5,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n     60,   0,   0,   7,  34,   0, \n     16,   0,   4,   0,   0,   0, \n     58,   0,  16,   0,   5,   0, \n      0,   0,  26,   0,  16,   0, \n      4,   0,   0,   0,  41,   0, \n      0,  10, 226,   0,  16,   0, \n      5,   0,   0,   0,   6,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   5,   0,   0,   0, \n     10,   0,   0,   0,  15,   0, \n      0,   0,   1,   0,   0,  10, \n    226,   0,  16,   0,   5,   0, \n      0,   0,  86,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   1,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   1, \n    140,   0,   0,  11,  18,   0, \n     16,   0,   4,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   4,   0, \n      0,   0,  42,   0,  16,   0, \n      5,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     30,   0,   0,   7,  18,   0, \n     16,   0,   4,   0,   0,   0, \n     58,   0,  16,   0,   5,   0, \n      0,   0,  10,   0,  16,   0, \n      4,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      4,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n      1,  64,   0,   0, 255,   0, \n      0,   0,  26,   0,  16,   0, \n      4,   0,   0,   0,  59,   0, \n      0,   5,  34,   0,  16,   0, \n      4,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n      1,   0,   0,   7,  66,   0, \n     16,   0,   4,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n      7,   0,   0,   0,   1,   0, \n      0,   7, 130,   0,  16,   0, \n      4,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 130,   0, \n     16,   0,   4,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n      4,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   4,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,  78,   0, \n      0,   8,  66,   0,  16,   0, \n      4,   0,   0,   0,   0, 208, \n      0,   0,  42,   0,  16,   0, \n      4,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n    138,   0,   0,  15, 226,   0, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n      9,   0,   0,   0,  86,   5, \n     16,   0,   4,   0,   0,   0, \n    138,   0,   0,  15, 114,   0, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,   9,   0,   0,   0, \n      0,   0,   0,   0, 166,  10, \n     16,   0,   0,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0, 114,   0,  16,   0, \n      6,   0,   0,   0, 246,  15, \n     16,   0,   2,   0,   0,   0, \n     70,   2,  16,   0,   6,   0, \n      0,   0,  35,   0,   0,   9, \n    226,   0,  16,   0,   5,   0, \n      0,   0, 166,  10,  16,   0, \n      2,   0,   0,   0,  86,  14, \n     16,   0,   5,   0,   0,   0, \n      6,   9,  16,   0,   6,   0, \n      0,   0,  78,   0,   0,  11, \n    226,   0,  16,   0,   5,   0, \n      0,   0,   0, 208,   0,   0, \n     86,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,  41,   0, \n      0,  10, 226,   0,  16,   0, \n      5,   0,   0,   0,  86,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n     16,   0,   0,   0,  24,   0, \n      0,   0,  60,   0,   0,   7, \n     34,   0,  16,   0,   4,   0, \n      0,   0,  42,   0,  16,   0, \n      4,   0,   0,   0,  26,   0, \n     16,   0,   5,   0,   0,   0, \n     60,   0,   0,   7,  34,   0, \n     16,   0,   4,   0,   0,   0, \n     42,   0,  16,   0,   5,   0, \n      0,   0,  26,   0,  16,   0, \n      4,   0,   0,   0,  60,   0, \n      0,   7,  34,   0,  16,   0, \n      4,   0,   0,   0,  58,   0, \n     16,   0,   5,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0,  55,   0,   0,   9, \n    130,   0,  16,   0,   4,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,   4,   0, \n      0,   0, 246,  15,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,  24,   0,   0,   0, \n     16,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0, 255,   0,   0, \n      0, 255,   0,   0,   0, 255, \n      0,   0,   0, 255,  60,   0, \n      0,   7, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  35,   0, \n      0,   8,  18,   0,  16,   0, \n      3,   0,   0,   0,  26,   0, \n      2,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     79,   0,   0,   9,  18,   0, \n     16,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   3,   0, \n      0,   0,  26, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   3,   0,   0,   0, \n     30,   0,   0,   9,  34,   0, \n     16,   0,   3,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  10, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n     85,   0,   0,   7,  18,   0, \n     16,   0,   4,   0,   0,   0, \n     10,   0,  16,   0,   5,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  59,   0, \n      0,   5,  18,   0,  16,   0, \n      6,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   6,   0,   0,   0, \n      6,   0,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,   4,   0, \n      0,   0,   6,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n    242,   0,  16,   0,   4,   0, \n      0,   0, 166,  10,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     35,   0,   0,   9, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  86,   5,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n      6,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n      7,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     78,   0,   0,  11, 242,   0, \n     16,   0,   4,   0,   0,   0, \n      0, 208,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  60,   0,   0,   7, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     85,   0,   0,   7,  66,   0, \n     16,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     12,   0,   0,   0,  85,   0, \n      0,   7, 130,   0,  16,   0, \n      3,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   7, \n    130,   0,  16,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n      1,   0,   0,   7, 130,   0, \n     16,   0,   3,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n    146,   4,   0,   0,  41,   0, \n      0,   7,  34,   0,  16,   0, \n      5,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  85,   0,   0,   7, \n     66,   0,  16,   0,   5,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     30,   0,   0,   7, 130,   0, \n     16,   0,   3,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      5,   0,   0,   0,  30,   0, \n      0,   7, 130,   0,  16,   0, \n      3,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   5,   0, \n      0,   0,  59,   0,   0,   5, \n     34,   0,  16,   0,   5,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   7,  66,   0,  16,   0, \n      5,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0,  30,   0,   0,   8, \n    130,   0,  16,   0,   5,   0, \n      0,   0,  42,   0,  16, 128, \n     65,   0,   0,   0,   5,   0, \n      0,   0,   1,  64,   0,   0, \n    109,  11,   0,   0,   1,   0, \n      0,   7,  34,   0,  16,   0, \n      5,   0,   0,   0,  26,   0, \n     16,   0,   5,   0,   0,   0, \n     58,   0,  16,   0,   5,   0, \n      0,   0,   1,   0,   0,   7, \n    130,   0,  16,   0,   5,   0, \n      0,   0,  26,   0,  16,   0, \n      5,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n      1,   0,   0,   7,  18,   0, \n     16,   0,   6,   0,   0,   0, \n     42,   0,  16,   0,   5,   0, \n      0,   0,   1,  64,   0,   0, \n      7,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n     18,   0,  16,   0,   6,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   6,   0,   0,   0, \n     35,   0,   0,   9, 130,   0, \n     16,   0,   5,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      5,   0,   0,   0,  10,   0, \n     16,   0,   6,   0,   0,   0, \n     78,   0,   0,   8, 130,   0, \n     16,   0,   5,   0,   0,   0, \n      0, 208,   0,   0,  58,   0, \n     16,   0,   5,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      6,   0,   0,   0,   9,   0, \n      0,   0,   0,   0,   0,   0, \n     86,   5,  16,   0,   5,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      6,   0,   0,   0,   9,   0, \n      0,   0,   0,   0,   0,   0, \n    166,  10,  16,   0,   5,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 114,   0, \n     16,   0,   7,   0,   0,   0, \n    246,  15,  16,   0,   2,   0, \n      0,   0,  70,   2,  16,   0, \n      7,   0,   0,   0,  35,   0, \n      0,   9, 114,   0,  16,   0, \n      6,   0,   0,   0, 166,  10, \n     16,   0,   2,   0,   0,   0, \n     70,   2,  16,   0,   6,   0, \n      0,   0,  70,   2,  16,   0, \n      7,   0,   0,   0,  78,   0, \n      0,  11, 114,   0,  16,   0, \n      6,   0,   0,   0,   0, 208, \n      0,   0,  70,   2,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,   0,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,   6,   0,   0,   0, \n     70,   2,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,  60,   0, \n      0,   7,  34,   0,  16,   0, \n      5,   0,   0,   0,  58,   0, \n     16,   0,   5,   0,   0,   0, \n     10,   0,  16,   0,   6,   0, \n      0,   0,  60,   0,   0,   7, \n     34,   0,  16,   0,   5,   0, \n      0,   0,  26,   0,  16,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   5,   0,   0,   0, \n     60,   0,   0,   7,  34,   0, \n     16,   0,   5,   0,   0,   0, \n     42,   0,  16,   0,   6,   0, \n      0,   0,  26,   0,  16,   0, \n      5,   0,   0,   0,   1,   0, \n      0,   7, 130,   0,  16,   0, \n      3,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,   6,   0, \n      0,   0, 246,  15,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n     10,   0,   0,   0,  15,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,   6,   0,   0,   0, \n     70,   2,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   1, \n      0,   0,   0,   0, 140,   0, \n      0,  11, 130,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,  10,   0, \n     16,   0,   6,   0,   0,   0, \n     30,   0,   0,   7, 130,   0, \n     16,   0,   3,   0,   0,   0, \n     26,   0,  16,   0,   6,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,  30,   0, \n      0,   7, 130,   0,  16,   0, \n      3,   0,   0,   0,  42,   0, \n     16,   0,   6,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n    130,   0,  16,   0,   3,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0, 255,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0,  59,   0,   0,   5, \n     66,   0,  16,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   7,  34,   0,  16,   0, \n      5,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,  12,   0,   0,   0, \n     15,   0,   0,   0,  18,   0, \n      0,   0,  21,   0,   0,   0, \n    166,  10,  16,   0,   0,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 242,   0, \n     16,   0,   6,   0,   0,   0, \n    246,  15,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0,  10,   0,  16,   0, \n      6,   0,   0,   0,  78,   0, \n      0,   8,  66,   0,  16,   0, \n      0,   0,   0,   0,   0, 208, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n    138,   0,   0,  15, 226,   0, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n      9,   0,   0,   0, 166,  10, \n     16,   0,   3,   0,   0,   0, \n     35,   0,   0,   9, 226,   0, \n     16,   0,   5,   0,   0,   0, \n    166,  10,  16,   0,   2,   0, \n      0,   0,  86,  14,  16,   0, \n      5,   0,   0,   0,  86,  14, \n     16,   0,   6,   0,   0,   0, \n     78,   0,   0,  11, 226,   0, \n     16,   0,   5,   0,   0,   0, \n      0, 208,   0,   0,  86,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,  41,   0,   0,  10, \n    226,   0,  16,   0,   5,   0, \n      0,   0,  86,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n     60,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      5,   0,   0,   0,  60,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   5,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      5,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 130,   0, \n     16,   0,   6,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,   6,   0,   0,   0, \n    246,  15,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n     24,   0,   0,   0,  16,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0, 255,   0,   0,   0, 255, \n      0,   0,   0, 255,   0,   0, \n      0, 255,  60,   0,   0,   7, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  35,   0,   0,   8, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,   2,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  79,   0, \n      0,   9,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      0,   0,   0,   0,  85,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   8,   0, \n      0,   0,  85,   0,   0,  10, \n     98,   0,  16,   0,   3,   0, \n      0,   0, 166,  10,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0, 146,  36, \n     73,   0,  41,   0,   0,   7, \n    130,   0,  16,   0,   3,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     85,   0,   0,   7,  18,   0, \n     16,   0,   4,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n      1,   0,   0,   7, 130,   0, \n     16,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     73, 146,  36,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      4,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0, 182, 109, \n    219,   0,   1,   0,   0,   7, \n     18,   0,  16,   0,   4,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     60,   0,   0,   7,  34,   0, \n     16,   0,   4,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,   1,   0, \n      0,  10, 194,   0,  16,   0, \n      4,   0,   0,   0,  86,   9, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     73, 146,  36,   0,  73, 146, \n     36,   0,  60,   0,   0,   7, \n     34,   0,  16,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n      1,   0,   0,   7,  34,   0, \n     16,   0,   3,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n     73, 146,  36,   0,  87,   0, \n      0,   7,  34,   0,  16,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,  73, 146, \n     36,   0,  59,   0,   0,   5, \n     98,   0,  16,   0,   4,   0, \n      0,   0, 166,  11,  16,   0, \n      4,   0,   0,   0,   1,   0, \n      0,   7,  66,   0,  16,   0, \n      3,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0,   1,   0,   0,   7, \n     66,   0,  16,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      4,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n     60,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0, 183, 109, \n    219, 255,  60,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     41,   0,   0,  10,  98,   0, \n     16,   0,   3,   0,   0,   0, \n    166,  10,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  60,   0, \n      0,   7, 130,   0,  16,   0, \n      3,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,  59,   0,   0,   5, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,  60,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      4,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7,  34,   0, \n     16,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,  60,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,  55,   0,   0,   9, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  41,   0,   0,   9, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  10, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     85,   0,   0,   7,  18,   0, \n     16,   0,   4,   0,   0,   0, \n     10,   0,  16,   0,   5,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0,  59,   0, \n      0,   5,  18,   0,  16,   0, \n      6,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   6,   0,   0,   0, \n      6,   0,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,   4,   0, \n      0,   0,   6,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n    242,   0,  16,   0,   4,   0, \n      0,   0, 166,  10,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     35,   0,   0,   9, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  86,   5,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n      6,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n      7,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     78,   0,   0,  11, 242,   0, \n     16,   0,   4,   0,   0,   0, \n      0, 208,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  60,   0,   0,   7, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     85,   0,   0,   7,  34,   0, \n     16,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   7,  34,   0,  16,   0, \n      3,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,   1,   0,   0,   7, \n     34,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0, 146,   4,   0,   0, \n     41,   0,   0,   7,  66,   0, \n     16,   0,   3,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  85,   0, \n      0,   7, 130,   0,  16,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     34,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n     30,   0,   0,   7,  34,   0, \n     16,   0,   3,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,  59,   0, \n      0,   5,  66,   0,  16,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n      1,   0,   0,   7, 162,   0, \n     16,   0,   3,   0,   0,   0, \n    166,  10,  16,   0,   0,   0, \n      0,   0,  86,   9,  16,   0, \n      3,   0,   0,   0,  30,   0, \n      0,   8,  34,   0,  16,   0, \n      5,   0,   0,   0,  58,   0, \n     16, 128,  65,   0,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0, 109,  11,   0,   0, \n      1,   0,   0,   7,  66,   0, \n     16,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      5,   0,   0,   0,   1,   0, \n      0,  10,  98,   0,  16,   0, \n      5,   0,   0,   0, 166,  11, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0,  66,   0, \n     16,   0,   5,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      5,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      5,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0,  42,   0,  16,   0, \n      5,   0,   0,   0,  78,   0, \n      0,   8,  34,   0,  16,   0, \n      5,   0,   0,   0,   0, 208, \n      0,   0,  26,   0,  16,   0, \n      5,   0,   0,   0,   1,  64, \n      0,   0,   5,   0,   0,   0, \n    138,   0,   0,  15, 114,   0, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,   9,   0,   0,   0, \n      0,   0,   0,   0, 166,  10, \n     16,   0,   3,   0,   0,   0, \n    138,   0,   0,  15, 114,   0, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,   9,   0,   0,   0, \n      0,   0,   0,   0, 246,  15, \n     16,   0,   3,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0, 114,   0,  16,   0, \n      7,   0,   0,   0, 246,  15, \n     16,   0,   2,   0,   0,   0, \n     70,   2,  16,   0,   7,   0, \n      0,   0,  35,   0,   0,   9, \n    114,   0,  16,   0,   6,   0, \n      0,   0, 166,  10,  16,   0, \n      2,   0,   0,   0,  70,   2, \n     16,   0,   6,   0,   0,   0, \n     70,   2,  16,   0,   7,   0, \n      0,   0,  78,   0,   0,  11, \n    114,   0,  16,   0,   6,   0, \n      0,   0,   0, 208,   0,   0, \n     70,   2,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n      6,   0,   0,   0,  70,   2, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,  16,   0,   0,   0, \n     24,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     66,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      5,   0,   0,   0,  10,   0, \n     16,   0,   6,   0,   0,   0, \n     60,   0,   0,   7,  66,   0, \n     16,   0,   3,   0,   0,   0, \n     26,   0,  16,   0,   6,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0,  60,   0, \n      0,   7,  66,   0,  16,   0, \n      3,   0,   0,   0,  42,   0, \n     16,   0,   6,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0,  41,   0,   0,  10, \n    226,   0,  16,   0,   5,   0, \n      0,   0,  86,   5,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,  10,   0, \n      0,   0,  15,   0,   0,   0, \n      1,   0,   0,  10, 226,   0, \n     16,   0,   5,   0,   0,   0, \n     86,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   1, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   1, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   5,   0,   0,   0, \n     30,   0,   0,   7,  34,   0, \n     16,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   5,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,  30,   0, \n      0,   7,  34,   0,  16,   0, \n      3,   0,   0,   0,  58,   0, \n     16,   0,   5,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0, 255,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0,  59,   0,   0,   5, \n     66,   0,  16,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   7, 130,   0,  16,   0, \n      3,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0,   1,   0,   0,   7, \n     34,   0,  16,   0,   5,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0,  34,   0,  16,   0, \n      5,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0,  35,   0,   0,   9, \n    130,   0,  16,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0,  78,   0,   0,   8, \n    130,   0,  16,   0,   3,   0, \n      0,   0,   0, 208,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      7,   0,   0,   0, 138,   0, \n      0,  15, 226,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      6,   0,   0,   0,   9,   0, \n      0,   0, 166,  10,  16,   0, \n      3,   0,   0,   0, 138,   0, \n      0,  15, 114,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n      9,   0,   0,   0,   0,   0, \n      0,   0, 166,  10,  16,   0, \n      0,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n    114,   0,  16,   0,   6,   0, \n      0,   0, 246,  15,  16,   0, \n      2,   0,   0,   0,  70,   2, \n     16,   0,   6,   0,   0,   0, \n     35,   0,   0,   9, 226,   0, \n     16,   0,   5,   0,   0,   0, \n    166,  10,  16,   0,   2,   0, \n      0,   0,  86,  14,  16,   0, \n      5,   0,   0,   0,   6,   9, \n     16,   0,   6,   0,   0,   0, \n     78,   0,   0,  11, 226,   0, \n     16,   0,   5,   0,   0,   0, \n      0, 208,   0,   0,  86,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,  41,   0,   0,  10, \n    226,   0,  16,   0,   5,   0, \n      0,   0,  86,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n     60,   0,   0,   7,  66,   0, \n     16,   0,   3,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      5,   0,   0,   0,  60,   0, \n      0,   7,  66,   0,  16,   0, \n      3,   0,   0,   0,  42,   0, \n     16,   0,   5,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0,  60,   0,   0,   7, \n     66,   0,  16,   0,   3,   0, \n      0,   0,  58,   0,  16,   0, \n      5,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n     55,   0,   0,   9, 130,   0, \n     16,   0,   6,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,   6,   0,   0,   0, \n    246,  15,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n     24,   0,   0,   0,  16,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0, 255,   0,   0,   0, 255, \n      0,   0,   0, 255,   0,   0, \n      0, 255,  60,   0,   0,   7, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  35,   0,   0,   8, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,   2,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  79,   0, \n      0,   9,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,  31,   0, \n      4,   3,  10,   0,  16,   0, \n      1,   0,   0,   0,  35,   0, \n      0,  11,  18,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     85,   0,   0,   7,  18,   0, \n     16,   0,   4,   0,   0,   0, \n     10,   0,  16,   0,   5,   0, \n      0,   0,   1,  64,   0,   0, \n     24,   0,   0,   0,  59,   0, \n      0,   5,  18,   0,  16,   0, \n      5,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   5,   0,   0,   0, \n      6,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,   4,   0, \n      0,   0,   6,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n    242,   0,  16,   0,   4,   0, \n      0,   0, 166,  10,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     35,   0,   0,   9, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  86,   5,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n      5,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n      6,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     78,   0,   0,  11, 242,   0, \n     16,   0,   4,   0,   0,   0, \n      0, 208,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  60,   0,   0,   7, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     85,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     12,   0,   0,   0,  85,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n    146,   4,   0,   0,  41,   0, \n      0,   7,  34,   0,  16,   0, \n      3,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  85,   0,   0,   7, \n     66,   0,  16,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0,  59,   0,   0,   5, \n     34,   0,  16,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   7,  66,   0,  16,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,  30,   0,   0,   8, \n    130,   0,  16,   0,   3,   0, \n      0,   0,  42,   0,  16, 128, \n     65,   0,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n    109,  11,   0,   0,   1,   0, \n      0,   7,  34,   0,  16,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,   1,   0,   0,   7, \n    130,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n      1,   0,   0,   7,  18,   0, \n     16,   0,   5,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      7,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n     18,   0,  16,   0,   5,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   5,   0,   0,   0, \n     35,   0,   0,   9, 130,   0, \n     16,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,  10,   0, \n     16,   0,   5,   0,   0,   0, \n     78,   0,   0,   8, 130,   0, \n     16,   0,   3,   0,   0,   0, \n      0, 208,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      6,   0,   0,   0,   9,   0, \n      0,   0,   0,   0,   0,   0, \n     86,   5,  16,   0,   3,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      6,   0,   0,   0,   9,   0, \n      0,   0,   0,   0,   0,   0, \n    166,  10,  16,   0,   3,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 114,   0, \n     16,   0,   6,   0,   0,   0, \n    246,  15,  16,   0,   2,   0, \n      0,   0,  70,   2,  16,   0, \n      6,   0,   0,   0,  35,   0, \n      0,   9, 114,   0,  16,   0, \n      5,   0,   0,   0, 166,  10, \n     16,   0,   2,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,  70,   2,  16,   0, \n      6,   0,   0,   0,  78,   0, \n      0,  11, 114,   0,  16,   0, \n      5,   0,   0,   0,   0, 208, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,   0,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,  60,   0, \n      0,   7,  34,   0,  16,   0, \n      3,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   5,   0, \n      0,   0,  60,   0,   0,   7, \n     34,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      5,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n     60,   0,   0,   7,  34,   0, \n     16,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   5,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,   5,   0, \n      0,   0, 166,  10,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n     10,   0,   0,   0,  15,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 114,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   1, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  66,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   5,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   5,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0, 255,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,  59,   0,   0,   5, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   7,  34,   0,  16,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,  12,   0,   0,   0, \n     15,   0,   0,   0,  18,   0, \n      0,   0,  21,   0,   0,   0, \n    166,  10,  16,   0,   0,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 242,   0, \n     16,   0,   5,   0,   0,   0, \n    246,  15,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,  10,   0,  16,   0, \n      5,   0,   0,   0,  78,   0, \n      0,   8,  66,   0,  16,   0, \n      0,   0,   0,   0,   0, 208, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n    138,   0,   0,  15, 226,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n      9,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n     35,   0,   0,   9, 226,   0, \n     16,   0,   3,   0,   0,   0, \n    166,  10,  16,   0,   2,   0, \n      0,   0,  86,  14,  16,   0, \n      3,   0,   0,   0,  86,  14, \n     16,   0,   5,   0,   0,   0, \n     78,   0,   0,  11, 226,   0, \n     16,   0,   3,   0,   0,   0, \n      0, 208,   0,   0,  86,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,  41,   0,   0,  10, \n    226,   0,  16,   0,   3,   0, \n      0,   0,  86,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n     60,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,  60,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 130,   0, \n     16,   0,   5,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,   5,   0,   0,   0, \n    246,  15,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n     24,   0,   0,   0,  16,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0, 255,   0,   0,   0, 255, \n      0,   0,   0, 255,   0,   0, \n      0, 255,  60,   0,   0,   7, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  21,   0,   0,   1, \n     21,   0,   0,   1,  21,   0, \n      0,   1,  30,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  32,   0, \n      0,   0,  18,   0,   0,   1, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0,  21,   0,   0,   1, \n     30,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     22, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     22,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,  85,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  22,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      1,   0,   0,   0,  22,  14, \n     16,   0,   4,   0,   0,   0, \n     22,  14,  16,   0,   5,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     22,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  22,  14, \n     16,   0,   2,   0,   0,   0, \n     54,   0,   0,   5,  50,   0, \n     16,   0,   2,   0,   0,   0, \n    214,   5,  16,   0,   1,   0, \n      0,   0,  18,   0,   0,   1, \n     54,   0,   0,   5,  50,   0, \n     16,   0,   2,   0,   0,   0, \n    214,   5,  16,   0,   1,   0, \n      0,   0,  21,   0,   0,   1, \n     41,   0,   0,  10, 114,   0, \n     16,   0,   4,   0,   0,   0, \n    166,  10,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   7,   0, \n      0,   0,  12,   0,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10, 114,   0,  16,   0, \n      5,   0,   0,   0, 166,  10, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  13,   0, \n      0,   0,   4,   0,   0,   0, \n      9,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n    130,   0,  16,   0,   4,   0, \n      0,   0,  10,   0,  16,   0, \n      5,   0,   0,   0,   1,   0, \n      0,  10,  50,   0,  16,   0, \n      0,   0,   0,   0, 198,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0, 248,   0, \n      0,   0, 248,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n    146,   0,  16,   0,   5,   0, \n      0,   0, 166,   6,  16,   0, \n      4,   0,   0,   0,   1,   0, \n      0,  10,  98,   0,  16,   0, \n      1,   0,   0,   0, 246,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0, 240,   3,   0, \n      0, 240,   3,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      0,   0,   0,   0, 150,   5, \n     16,   0,   1,   0,   0,   0, \n      1,   0,   0,  10,  98,   0, \n     16,   0,   1,   0,   0,   0, \n      6,   1,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    128,  15,   0,   0, 128,  15, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  50,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n    150,   5,  16,   0,   1,   0, \n      0,   0,  85,   0,   0,  10, \n     98,   0,  16,   0,   1,   0, \n      0,   0,   6,   1,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10,  98,   0, \n     16,   0,   1,   0,   0,   0, \n     86,   6,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   7,   0, \n    112,   0,   7,   0, 112,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  50,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n    150,   5,  16,   0,   1,   0, \n      0,   0,  85,   0,   0,  10, \n     98,   0,  16,   0,   1,   0, \n      0,   0,   6,   1,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      6,   0,   0,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10,  98,   0, \n     16,   0,   1,   0,   0,   0, \n     86,   6,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,  12, \n      0,   0,   0,  12,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  50,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n    150,   5,  16,   0,   1,   0, \n      0,   0,  41,   0,   0,   7, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   7, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n    170, 170, 170, 170,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      1,   0,   0,   0,  86,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,   1,   0,   0,   7, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  85,  85,  85,  85, \n     30,   0,   0,   7, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  85,   0, \n      0,   7,  34,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   7, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  85,  85,  85,  85, \n     87,   0,   0,   7,  18,   0, \n     16,   0,   4,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  54,   0, \n      0,   5,  66,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,   0,   0,  10,  98,   0, \n     16,   0,   1,   0,   0,   0, \n      6,   2,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11, 130,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  80,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   2,   0, \n      0,   0, 246,  15,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   7,  66,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   7,  66,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0, 146,  36, \n     73,   0,  41,   0,   0,   7, \n    130,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     85,   0,   0,   7,  34,   0, \n     16,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  30,   0,   0,   7, \n     66,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n      1,   0,   0,   7, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     73, 146,  36,   0,  30,   0, \n      0,   7,  34,   0,  16,   0, \n      3,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0, 182, 109, \n    219,   0,   1,   0,   0,   7, \n     34,   0,  16,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n     60,   0,   0,   7,  66,   0, \n     16,   0,   3,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,   1,   0, \n      0,  10,  50,   0,  16,   0, \n      5,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  73, 146, \n     36,   0,  73, 146,  36,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     18,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n      1,   0,   0,   7,  18,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n     73, 146,  36,   0,  87,   0, \n      0,   7,  18,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,  73, 146, \n     36,   0,  59,   0,   0,   5, \n    194,   0,  16,   0,   3,   0, \n      0,   0,   6,   4,  16,   0, \n      5,   0,   0,   0,   1,   0, \n      0,   7,  34,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0,   1,   0,   0,   7, \n     34,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     60,   0,   0,   7, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  30,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0, 183, 109, \n    219, 255,  60,   0,   0,   7, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     41,   0,   0,  10,  50,   0, \n     16,   0,   2,   0,   0,   0, \n     86,   5,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  60,   0, \n      0,   7, 130,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  59,   0,   0,   5, \n     66,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   7,  66,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  60,   0,   0,   7, \n     66,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     30,   0,   0,   7,  18,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  60,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  55,   0,   0,   9, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  59,   0,   0,   5, \n     18,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      4,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      2,   0,   0,   0,   6,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      4,   0,   0,   0,   6,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   4,   0,   0,   0, \n      6,   0,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  35,   0, \n      0,   9, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      6,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,  78,   0,   0,  11, \n    242,   0,  16,   0,   5,   0, \n      0,   0,   0, 208,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  78,   0,   0,  11, \n    242,   0,  16,   0,   6,   0, \n      0,   0,   0, 208,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n      2,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   7, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  85,   0, \n      0,   7,  34,   0,  16,   0, \n      3,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   7, \n     34,   0,  16,   0,   3,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n      1,   0,   0,   7,  34,   0, \n     16,   0,   3,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n    146,   4,   0,   0,  41,   0, \n      0,   7,  66,   0,  16,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  85,   0,   0,   7, \n    130,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     30,   0,   0,   7,  34,   0, \n     16,   0,   3,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0,  30,   0, \n      0,   7,  34,   0,  16,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,  59,   0,   0,   5, \n     66,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   7, 162,   0,  16,   0, \n      3,   0,   0,   0, 246,  15, \n     16,   0,   0,   0,   0,   0, \n     86,   9,  16,   0,   3,   0, \n      0,   0,  30,   0,   0,   8, \n     34,   0,  16,   0,   4,   0, \n      0,   0,  58,   0,  16, 128, \n     65,   0,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n    109,  11,   0,   0,   1,   0, \n      0,   7,  66,   0,  16,   0, \n      3,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0,   1,   0,   0,  10, \n     98,   0,  16,   0,   4,   0, \n      0,   0, 166,  11,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0,  66,   0,  16,   0, \n      4,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   4,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   4,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n     42,   0,  16,   0,   4,   0, \n      0,   0,  78,   0,   0,   8, \n     34,   0,  16,   0,   4,   0, \n      0,   0,   0, 208,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0, 138,   0, \n      0,  15, 114,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n      9,   0,   0,   0,   0,   0, \n      0,   0, 166,  10,  16,   0, \n      3,   0,   0,   0, 138,   0, \n      0,  15, 114,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n      9,   0,   0,   0,   0,   0, \n      0,   0, 246,  15,  16,   0, \n      3,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n    114,   0,  16,   0,   6,   0, \n      0,   0, 166,  10,  16,   0, \n      1,   0,   0,   0,  70,   2, \n     16,   0,   6,   0,   0,   0, \n     35,   0,   0,   9, 114,   0, \n     16,   0,   5,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0,  70,   2, \n     16,   0,   6,   0,   0,   0, \n     78,   0,   0,  11, 114,   0, \n     16,   0,   5,   0,   0,   0, \n      0, 208,   0,   0,  70,   2, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,   5,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n     16,   0,   0,   0,  24,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  66,   0, \n     16,   0,   3,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0,  10,   0,  16,   0, \n      5,   0,   0,   0,  60,   0, \n      0,   7,  66,   0,  16,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   5,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0,  60,   0,   0,   7, \n     66,   0,  16,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      5,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n     41,   0,   0,  10, 226,   0, \n     16,   0,   4,   0,   0,   0, \n     86,   5,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   5,   0, \n      0,   0,  10,   0,   0,   0, \n     15,   0,   0,   0,   1,   0, \n      0,  10, 226,   0,  16,   0, \n      4,   0,   0,   0,  86,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   1,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   1, 140,   0,   0,  11, \n     34,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      4,   0,   0,   0,  30,   0, \n      0,   7,  34,   0,  16,   0, \n      3,   0,   0,   0,  42,   0, \n     16,   0,   4,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,  30,   0,   0,   7, \n     34,   0,  16,   0,   3,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   3,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n    255,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n     59,   0,   0,   5,  66,   0, \n     16,   0,   3,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,   1,   0,   0,   7, \n    130,   0,  16,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n      1,   0,   0,   7,  34,   0, \n     16,   0,   4,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      7,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n     34,   0,  16,   0,   4,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n     35,   0,   0,   9, 130,   0, \n     16,   0,   3,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n     78,   0,   0,   8, 130,   0, \n     16,   0,   3,   0,   0,   0, \n      0, 208,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0, 138,   0,   0,  15, \n    226,   0,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,   9,   0,   0,   0, \n    166,  10,  16,   0,   3,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      6,   0,   0,   0,   9,   0, \n      0,   0,   0,   0,   0,   0, \n    246,  15,  16,   0,   0,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 114,   0, \n     16,   0,   5,   0,   0,   0, \n    166,  10,  16,   0,   1,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0,  35,   0, \n      0,   9, 226,   0,  16,   0, \n      4,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n     86,  14,  16,   0,   4,   0, \n      0,   0,   6,   9,  16,   0, \n      5,   0,   0,   0,  78,   0, \n      0,  11, 226,   0,  16,   0, \n      4,   0,   0,   0,   0, 208, \n      0,   0,  86,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n     41,   0,   0,  10, 226,   0, \n     16,   0,   4,   0,   0,   0, \n     86,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  16,   0,   0,   0, \n     24,   0,   0,   0,  60,   0, \n      0,   7,  66,   0,  16,   0, \n      3,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0,  60,   0,   0,   7, \n     66,   0,  16,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      4,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n     60,   0,   0,   7,  66,   0, \n     16,   0,   3,   0,   0,   0, \n     58,   0,  16,   0,   4,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0,  55,   0, \n      0,   9, 130,   0,  16,   0, \n      5,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n      5,   0,   0,   0, 246,  15, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,  24,   0, \n      0,   0,  16,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0, 255, \n      0,   0,   0, 255,   0,   0, \n      0, 255,   0,   0,   0, 255, \n     60,   0,   0,   7, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   3,   0,   0,   0, \n     30,   0,   0,   9,  18,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  10, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n     85,   0,   0,   7,  18,   0, \n     16,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  59,   0, \n      0,   5,  18,   0,  16,   0, \n      5,   0,   0,   0,  10,   0, \n     16,   0,   3,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   5,   0,   0,   0, \n      6,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,   3,   0, \n      0,   0,   6,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  86,   5,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     35,   0,   0,   9, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   6,   0,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n      5,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n      6,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     78,   0,   0,  11, 242,   0, \n     16,   0,   3,   0,   0,   0, \n      0, 208,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  60,   0,   0,   7, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     85,   0,   0,   7,  34,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     12,   0,   0,   0,  85,   0, \n      0,   7,  66,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   7, \n     66,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n      1,   0,   0,   7,  66,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n    146,   4,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  85,   0,   0,   7, \n     34,   0,  16,   0,   4,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0,  59,   0,   0,   5, \n    130,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   7,  34,   0,  16,   0, \n      4,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  30,   0,   0,   8, \n     66,   0,  16,   0,   4,   0, \n      0,   0,  26,   0,  16, 128, \n     65,   0,   0,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n    109,  11,   0,   0,   1,   0, \n      0,   7, 130,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   4,   0, \n      0,   0,   1,   0,   0,   7, \n     66,   0,  16,   0,   4,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n      1,   0,   0,   7, 130,   0, \n     16,   0,   4,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n      7,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n    130,   0,  16,   0,   4,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   4,   0,   0,   0, \n     35,   0,   0,   9,  66,   0, \n     16,   0,   4,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      4,   0,   0,   0,  58,   0, \n     16,   0,   4,   0,   0,   0, \n     78,   0,   0,   8,  66,   0, \n     16,   0,   4,   0,   0,   0, \n      0, 208,   0,   0,  42,   0, \n     16,   0,   4,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      6,   0,   0,   0,   9,   0, \n      0,   0,   0,   0,   0,   0, \n    246,  15,  16,   0,   2,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      6,   0,   0,   0,   9,   0, \n      0,   0,   0,   0,   0,   0, \n     86,   5,  16,   0,   4,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 114,   0, \n     16,   0,   6,   0,   0,   0, \n    166,  10,  16,   0,   1,   0, \n      0,   0,  70,   2,  16,   0, \n      6,   0,   0,   0,  35,   0, \n      0,   9, 114,   0,  16,   0, \n      5,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,  70,   2,  16,   0, \n      6,   0,   0,   0,  78,   0, \n      0,  11, 114,   0,  16,   0, \n      5,   0,   0,   0,   0, 208, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,   0,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,  60,   0, \n      0,   7, 130,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   4,   0,   0,   0, \n     10,   0,  16,   0,   5,   0, \n      0,   0,  60,   0,   0,   7, \n    130,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      5,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n     60,   0,   0,   7, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   5,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   7,  66,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  41,   0,   0,  10, \n    226,   0,  16,   0,   4,   0, \n      0,   0, 166,  10,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,  10,   0, \n      0,   0,  15,   0,   0,   0, \n      1,   0,   0,  10, 226,   0, \n     16,   0,   4,   0,   0,   0, \n     86,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   1, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   1, 140,   0, \n      0,  11,  66,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   4,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   4,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0, 255,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  59,   0,   0,   5, \n     34,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   7, 130,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,  12,   0,   0,   0, \n     15,   0,   0,   0,  18,   0, \n      0,   0,  21,   0,   0,   0, \n    246,  15,  16,   0,   0,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 242,   0, \n     16,   0,   5,   0,   0,   0, \n    166,  10,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  35,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      5,   0,   0,   0,  78,   0, \n      0,   8, 130,   0,  16,   0, \n      0,   0,   0,   0,   0, 208, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n    138,   0,   0,  15, 226,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n      9,   0,   0,   0,  86,   5, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,   9, 226,   0, \n     16,   0,   4,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0,  86,  14,  16,   0, \n      4,   0,   0,   0,  86,  14, \n     16,   0,   5,   0,   0,   0, \n     78,   0,   0,  11, 226,   0, \n     16,   0,   4,   0,   0,   0, \n      0, 208,   0,   0,  86,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,  41,   0,   0,  10, \n    226,   0,  16,   0,   4,   0, \n      0,   0,  86,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n     60,   0,   0,   7, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      4,   0,   0,   0,  60,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   4,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 130,   0, \n     16,   0,   5,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,   5,   0,   0,   0, \n    246,  15,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n     24,   0,   0,   0,  16,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0, 255,   0,   0,   0, 255, \n      0,   0,   0, 255,   0,   0, \n      0, 255,  60,   0,   0,   7, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  35,   0,   0,   8, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,   2,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  79,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,  31,   0, \n      4,   3,  58,   0,  16,   0, \n      0,   0,   0,   0,  85,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   8,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   2,   0, \n      0,   0, 246,  15,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0, 146,  36, \n     73,   0,  41,   0,   0,   7, \n     66,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     85,   0,   0,   7, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n      1,   0,   0,   7,  66,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     73, 146,  36,   0,  30,   0, \n      0,   7, 130,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0, 182, 109, \n    219,   0,   1,   0,   0,   7, \n    130,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n     60,   0,   0,   7,  18,   0, \n     16,   0,   3,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,   1,   0, \n      0,  10,  98,   0,  16,   0, \n      3,   0,   0,   0,   6,   1, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  73, 146,  36,   0, \n     73, 146,  36,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     18,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   3,   0,   0,   0, \n      1,   0,   0,   7,  18,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n     73, 146,  36,   0,  87,   0, \n      0,   7,  18,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,  73, 146, \n     36,   0,  59,   0,   0,   5, \n     50,   0,  16,   0,   3,   0, \n      0,   0, 150,   5,  16,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   7,  34,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   3,   0, \n      0,   0,   1,   0,   0,   7, \n     34,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     60,   0,   0,   7, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  30,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0, 183, 109, \n    219, 255,  60,   0,   0,   7, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     41,   0,   0,  10,  50,   0, \n     16,   0,   2,   0,   0,   0, \n     86,   5,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  60,   0, \n      0,   7,  66,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  59,   0,   0,   5, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  60,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7,  18,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  60,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  55,   0,   0,   9, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  41,   0,   0,   9, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  10, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     85,   0,   0,   7,  18,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0,  59,   0, \n      0,   5,  18,   0,  16,   0, \n      3,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   3,   0,   0,   0, \n      6,   0,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  85,   0,   0,  10, \n    226,   0,  16,   0,   2,   0, \n      0,   0,   6,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  86,   5,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,   9, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   6,   0,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n      3,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n      5,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     78,   0,   0,  11, 242,   0, \n     16,   0,   2,   0,   0,   0, \n      0, 208,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  60,   0,   0,   7, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     85,   0,   0,   7,  18,   0, \n     16,   0,   3,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   7,  18,   0,  16,   0, \n      3,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   3,   0, \n      0,   0,   1,   0,   0,   7, \n     18,   0,  16,   0,   3,   0, \n      0,   0,  10,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0, 146,   4,   0,   0, \n     41,   0,   0,   7,  34,   0, \n     16,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  85,   0, \n      0,   7,  66,   0,  16,   0, \n      3,   0,   0,   0,  10,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   3,   0, \n      0,   0,  10,   0,  16,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n     30,   0,   0,   7,  18,   0, \n     16,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0,  59,   0, \n      0,   5,  34,   0,  16,   0, \n      3,   0,   0,   0,  10,   0, \n     16,   0,   3,   0,   0,   0, \n      1,   0,   0,   7,  82,   0, \n     16,   0,   3,   0,   0,   0, \n    246,  15,  16,   0,   0,   0, \n      0,   0,   6,   1,  16,   0, \n      3,   0,   0,   0,  30,   0, \n      0,   8, 130,   0,  16,   0, \n      3,   0,   0,   0,  42,   0, \n     16, 128,  65,   0,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0, 109,  11,   0,   0, \n      1,   0,   0,   7,  34,   0, \n     16,   0,   3,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   7, 130,   0,  16,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0,   1,   0,   0,   7, \n     34,   0,  16,   0,   4,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0,  34,   0,  16,   0, \n      4,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0,  35,   0,   0,   9, \n    130,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0,  78,   0,   0,   8, \n    130,   0,  16,   0,   3,   0, \n      0,   0,   0, 208,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0, 138,   0, \n      0,  15, 226,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      6,   0,   0,   0,   9,   0, \n      0,   0,  86,   5,  16,   0, \n      3,   0,   0,   0, 138,   0, \n      0,  15, 114,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n      9,   0,   0,   0,   0,   0, \n      0,   0, 166,  10,  16,   0, \n      3,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n    114,   0,  16,   0,   5,   0, \n      0,   0, 166,  10,  16,   0, \n      1,   0,   0,   0,  70,   2, \n     16,   0,   5,   0,   0,   0, \n     35,   0,   0,   9, 226,   0, \n     16,   0,   4,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0,  86,  14,  16,   0, \n      4,   0,   0,   0,   6,   9, \n     16,   0,   5,   0,   0,   0, \n     78,   0,   0,  11, 226,   0, \n     16,   0,   4,   0,   0,   0, \n      0, 208,   0,   0,  86,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,  41,   0,   0,  10, \n    226,   0,  16,   0,   4,   0, \n      0,   0,  86,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n     60,   0,   0,   7,  34,   0, \n     16,   0,   3,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      4,   0,   0,   0,  60,   0, \n      0,   7,  34,   0,  16,   0, \n      3,   0,   0,   0,  42,   0, \n     16,   0,   4,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,  60,   0,   0,   7, \n     34,   0,  16,   0,   3,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n     41,   0,   0,  10, 226,   0, \n     16,   0,   4,   0,   0,   0, \n      6,   0,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   5,   0, \n      0,   0,  10,   0,   0,   0, \n     15,   0,   0,   0,   1,   0, \n      0,  10, 226,   0,  16,   0, \n      4,   0,   0,   0,  86,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   1,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   1, 140,   0,   0,  11, \n     18,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      4,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      3,   0,   0,   0,  42,   0, \n     16,   0,   4,   0,   0,   0, \n     10,   0,  16,   0,   3,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   3,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,  10,   0, \n     16,   0,   3,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n    255,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n     59,   0,   0,   5,  34,   0, \n     16,   0,   3,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,   1,   0,   0,   7, \n     66,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n      1,   0,   0,   7, 130,   0, \n     16,   0,   3,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      7,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n    130,   0,  16,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n     35,   0,   0,   9,  66,   0, \n     16,   0,   3,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n     78,   0,   0,   8,  66,   0, \n     16,   0,   3,   0,   0,   0, \n      0, 208,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0, 138,   0,   0,  15, \n    226,   0,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,   9,   0,   0,   0, \n     86,   5,  16,   0,   3,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      6,   0,   0,   0,   9,   0, \n      0,   0,   0,   0,   0,   0, \n    246,  15,  16,   0,   0,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 114,   0, \n     16,   0,   5,   0,   0,   0, \n    166,  10,  16,   0,   1,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0,  35,   0, \n      0,   9, 226,   0,  16,   0, \n      4,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n     86,  14,  16,   0,   4,   0, \n      0,   0,   6,   9,  16,   0, \n      5,   0,   0,   0,  78,   0, \n      0,  11, 226,   0,  16,   0, \n      4,   0,   0,   0,   0, 208, \n      0,   0,  86,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n     41,   0,   0,  10, 226,   0, \n     16,   0,   4,   0,   0,   0, \n     86,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  16,   0,   0,   0, \n     24,   0,   0,   0,  60,   0, \n      0,   7,  34,   0,  16,   0, \n      3,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0,  60,   0,   0,   7, \n     34,   0,  16,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      4,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n     60,   0,   0,   7,  34,   0, \n     16,   0,   3,   0,   0,   0, \n     58,   0,  16,   0,   4,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,  55,   0, \n      0,   9, 130,   0,  16,   0, \n      3,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n      3,   0,   0,   0, 246,  15, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,  24,   0, \n      0,   0,  16,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0, 255, \n      0,   0,   0, 255,   0,   0, \n      0, 255,   0,   0,   0, 255, \n     60,   0,   0,   7, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,   8,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,   2,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  79,   0,   0,   9, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  35,   0,   0,  11, \n     66,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  85,   0, \n      0,   7,  18,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n      1,  64,   0,   0,  24,   0, \n      0,   0,  59,   0,   0,   5, \n     18,   0,  16,   0,   3,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  85,   0, \n      0,  10, 226,   0,  16,   0, \n      3,   0,   0,   0,   6,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      4,   0,   0,   0,   6,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     85,   0,   0,  10, 226,   0, \n     16,   0,   2,   0,   0,   0, \n      6,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  35,   0, \n      0,   9, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      6,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,  78,   0,   0,  11, \n    242,   0,  16,   0,   3,   0, \n      0,   0,   0, 208,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  78,   0,   0,  11, \n    242,   0,  16,   0,   4,   0, \n      0,   0,   0, 208,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n      2,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   7, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  85,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  85,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   7,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0, 146,   4, \n      0,   0,  41,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     85,   0,   0,   7,  18,   0, \n     16,   0,   3,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   3,   0,   0,   0, \n     59,   0,   0,   5,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   1,   0,   0,   7, \n     18,   0,  16,   0,   3,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   8,  34,   0, \n     16,   0,   3,   0,   0,   0, \n     10,   0,  16, 128,  65,   0, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0, 109,  11, \n      0,   0,   1,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n      1,   0,   0,   7,  34,   0, \n     16,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      7,   0,   0,   0,   1,   0, \n      0,   7,  66,   0,  16,   0, \n      3,   0,   0,   0,  10,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0,  66,   0, \n     16,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0, 138,   0, \n      0,  15, 114,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n      9,   0,   0,   0,   0,   0, \n      0,   0,   6,   0,  16,   0, \n      1,   0,   0,   0, 138,   0, \n      0,  15, 210,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      6,   0,   0,   0,   9,   0, \n      0,   0,   6,   0,  16,   0, \n      3,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n    210,   0,  16,   0,   3,   0, \n      0,   0, 166,  10,  16,   0, \n      1,   0,   0,   0,   6,  14, \n     16,   0,   3,   0,   0,   0, \n     35,   0,   0,   9, 210,   0, \n     16,   0,   3,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0,   6,   9,  16,   0, \n      4,   0,   0,   0,   6,  14, \n     16,   0,   3,   0,   0,   0, \n     78,   0,   0,  11, 242,   0, \n     16,   0,   3,   0,   0,   0, \n      0, 208,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,  41,   0,   0,  10, \n    210,   0,  16,   0,   3,   0, \n      0,   0,   6,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n     60,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,  60,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n      3,   0,   0,   0,  86,   5, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,  10,   0,   0,   0, \n     15,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    114,   0,  16,   0,   3,   0, \n      0,   0,  70,   2,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   1,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   1,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   3,   0, \n      0,   0,  30,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0, 255,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  59,   0, \n      0,   5,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      7,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,  12,   0, \n      0,   0,  15,   0,   0,   0, \n     18,   0,   0,   0,  21,   0, \n      0,   0, 246,  15,  16,   0, \n      0,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n    242,   0,  16,   0,   3,   0, \n      0,   0, 166,  10,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     35,   0,   0,   9, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   3,   0,   0,   0, \n     78,   0,   0,   8, 130,   0, \n     16,   0,   0,   0,   0,   0, \n      0, 208,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0, 138,   0,   0,  15, \n    114,   0,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      6,   0,   0,   0,   9,   0, \n      0,   0,   0,   0,   0,   0, \n      6,   0,  16,   0,   0,   0, \n      0,   0,  35,   0,   0,   9, \n    114,   0,  16,   0,   1,   0, \n      0,   0,  86,   5,  16,   0, \n      1,   0,   0,   0,  70,   2, \n     16,   0,   4,   0,   0,   0, \n    150,   7,  16,   0,   3,   0, \n      0,   0,  78,   0,   0,  11, \n    114,   0,  16,   0,   1,   0, \n      0,   0,   0, 208,   0,   0, \n     70,   2,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 114,   0,  16,   0, \n      1,   0,   0,   0,  70,   2, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,  16,   0,   0,   0, \n     24,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     60,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  60,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  55,   0,   0,   9, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,   1,   0, \n      0,   0, 246,  15,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  24,   0,   0,   0, \n     16,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0, 255,   0,   0, \n      0, 255,   0,   0,   0, 255, \n      0,   0,   0, 255,  60,   0, \n      0,   7, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  21,   0, \n      0,   1,  21,   0,   0,   1, \n     21,   0,   0,   1,  62,   0, \n      0,   1,  83,  84,  65,  84, \n    148,   0,   0,   0,  73,   3, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   1,   0,   0, 179,   1, \n      0,   0,   7,   0,   0,   0, \n     14,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  13,   0,   0,   0, \n     12,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_dxt5a_r8_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 19\ndcl_thread_group 4, 32, 1\nand r0.xy, CB0[0][0].xxxx, l(1, 2, 0, 0)\nishl r1.x, vThreadID.x, l(2)\nmov r1.y, vThreadID.y\nuge r0.zw, r1.xxxy, CB0[0][1].xxxy\nor r0.z, r0.w, r0.z\nif_nz r0.z\n  ret \nendif \nubfe r0.z, l(2), l(2), CB0[0][0].x\nishl r1.yz, r1.xxyx, l(0, 2, 2, 0)\nimad r0.w, vThreadID.z, CB0[0][2].y, r1.z\nimad r0.w, r0.w, CB0[0][2].x, r1.y\niadd r0.w, r0.w, CB0[0][1].w\nif_z r0.x\n  imad r1.y, CB0[0][0].w, vThreadID.z, vThreadID.y\n  imad r1.y, CB0[0][0].z, r1.y, r1.x\n  ishl r1.y, r1.y, l(3)\nelse \n  if_nz r0.y\n    ushr r1.zw, CB0[0][0].zzzw, l(0, 0, 5, 4)\n    ishr r2.xyzw, vThreadID.zyyy, l(2, 4, 1, 3)\n    imad r0.y, r2.x, r1.w, r2.y\n    ibfe r1.w, l(27), l(3), vThreadID.x\n    imad r0.y, r0.y, r1.z, r1.w\n    bfi r1.zw, l(0, 0, 2, 1), l(0, 0, 5, 4), vThreadID.zzzy, l(0, 0, 0, 0)\n    bfi r2.y, l(2), l(3), r2.z, l(0)\n    iadd r1.z, r1.z, r2.y\n    bfi r1.z, l(3), l(0), r1.x, r1.z\n    bfi r0.y, l(25), l(7), r0.y, r1.z\n    xor r1.z, r2.x, r2.w\n    ubfe r2.x, l(2), l(3), r1.x\n    bfi r2.yz, l(0, 1, 1, 0), l(0, 1, 11, 0), r1.zzzz, l(0, 0, 0, 0)\n    xor r1.z, r2.y, r2.x\n    imad r1.z, r1.z, l(64), r1.w\n    iadd r1.z, r2.z, r1.z\n    ibfe r2.xy, l(27, 24, 0, 0), l(2, 5, 0, 0), r0.yyyy\n    bfi r0.y, l(3), l(8), r2.x, r1.z\n    bfi r1.y, l(20), l(12), r2.y, r0.y\n  else \n    ushr r0.y, CB0[0][0].z, l(5)\n    ishr r2.xyzw, vThreadID.yyyy, l(5, 1, 4, 3)\n    ibfe r1.z, l(27), l(3), vThreadID.x\n    imad r0.y, r2.x, r0.y, r1.z\n    bfi r2.xyz, l(3, 1, 1, 0), l(3, 1, 11, 0), r2.ywzy, l(0, 0, 0, 0)\n    bfi r1.z, l(3), l(0), r1.x, r2.x\n    bfi r0.y, l(26), l(6), r0.y, r1.z\n    ubfe r1.x, l(2), l(3), r1.x\n    xor r1.x, r2.y, r1.x\n    bfi r1.z, l(1), l(4), vThreadID.y, l(0)\n    imad r1.x, r1.x, l(64), r1.z\n    iadd r1.x, r2.z, r1.x\n    ibfe r1.zw, l(0, 0, 27, 24), l(0, 0, 2, 5), r0.yyyy\n    bfi r0.y, l(3), l(8), r1.z, r1.x\n    bfi r1.y, l(20), l(12), r1.w, r0.y\n  endif \nendif \niadd r0.y, r1.y, CB0[0][0].y\nld_raw r1.xyzw, r0.y, T0[0].ywxz\nieq r2.xyz, r0.zzzz, l(1, 2, 3, 0)\nor r2.xy, r2.yzyy, r2.xyxx\nif_nz r2.x\n  ishl r3.xyzw, r1.zxwy, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r1.zxwy, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r1.xyzw, r3.ywxz, r4.ywxz\nendif \nif_nz r2.y\n  ushr r3.xyzw, r1.zxwy, l(16, 16, 16, 16)\n  bfi r1.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r1.xyzw, r3.ywxz\n  mov r3.xy, r1.zwzz\nelse \n  mov r3.xy, r1.zwzz\nendif \nif_nz r0.x\n  mov r0.x, l(32)\nelse \n  mov r0.x, l(16)\nendif \niadd r0.x, r0.x, r0.y\nld_raw r4.xyzw, r0.x, T0[0].ywxz\nif_nz r2.x\n  ishl r5.xyzw, r4.zxwy, l(8, 8, 8, 8)\n  and r5.xyzw, r5.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r6.xyzw, r4.zxwy, l(8, 8, 8, 8)\n  and r6.xyzw, r6.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r4.xyzw, r5.ywxz, r6.ywxz\nendif \nif_nz r2.y\n  ushr r2.xyzw, r4.zxwy, l(16, 16, 16, 16)\n  bfi r4.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r4.xyzw, r2.ywxz\n  mov r1.zw, r4.xxxy\nelse \n  mov r1.zw, r4.xxxy\nendif \nushr r3.zw, r3.xxxy, l(0, 0, 8, 8)\nand r2.xyzw, r3.xzyw, l(255, 255, 255, 255)\nushr r4.xy, r4.zwzz, l(8, 8, 0, 0)\nand r5.xyzw, r4.zxwy, l(255, 255, 255, 255)\nmov r4.xy, r3.xyxx\nushr r3.xyzw, r4.xyzw, l(16, 16, 16, 16)\nbfi r4.xyzw, l(8, 8, 8, 8), l(16, 16, 16, 16), r1.xyzw, l(0, 0, 0, 0)\niadd r3.xyzw, r3.xyzw, r4.xyzw\nuge r0.xy, r2.ywyy, r2.xzxx\nushr r4.xyzw, r3.xxyy, l(1, 2, 1, 2)\nand r6.xy, r3.xyxx, r4.xzxx\nand r6.xy, r6.xyxx, l(0x00492492, 0x00492492, 0, 0)\nishl r6.zw, r6.xxxy, l(0, 0, 1, 1)\nushr r7.xy, r6.xyxx, l(1, 1, 0, 0)\niadd r6.xy, r6.xyxx, r6.zwzz\niadd r6.xy, r6.xyxx, r7.xyxx\nand r7.xyzw, r3.xyzw, l(0x00249249, 0x00249249, 0x00249249, 0x00249249)\niadd r8.xyzw, r7.xyzw, l(0x00db6db6, 0x00db6db6, 0x00db6db6, 0x00db6db6)\nand r6.zw, r6.xxxy, r8.xxxy\nor r8.xy, r3.xyxx, r4.xzxx\nand r9.xyzw, r4.xyzw, l(0x00249249, 0x00249249, 0x00249249, 0x00249249)\nor r4.xy, r4.ywyy, r8.xyxx\nand r4.xy, r4.xyxx, l(0x00249249, 0x00249249, 0, 0)\nxor r4.xy, r4.xyxx, l(0x00249249, 0x00249249, 0, 0)\nnot r9.xyzw, r9.xyzw\nand r10.xyzw, r7.xxyy, r9.xxzz\nand r9.xyzw, r9.yyww, r10.xyzw\nor r3.xy, r3.xyxx, r4.xyxx\niadd r3.xy, r3.xyxx, l(0xffdb6db7, 0xffdb6db7, 0, 0)\nor r3.xy, r9.xwxx, r3.xyxx\nishl r4.xyzw, r9.xyzw, l(2, 1, 2, 1)\nor r7.xy, r3.xyxx, r4.xzxx\nnot r6.xy, r6.xyxx\nand r6.xy, r6.xyxx, r7.xyxx\nor r6.xy, r6.zwzz, r6.xyxx\niadd r4.xy, r4.ywyy, r4.xzxx\nor r3.xy, r3.xyxx, r4.xyxx\nmovc r4.xy, r0.xyxx, r6.xyxx, r3.xyxx\nuge r3.xy, r5.ywyy, r5.xzxx\nushr r6.xyzw, r3.zzww, l(1, 2, 1, 2)\nand r7.xy, r3.zwzz, r6.xzxx\nand r7.xy, r7.xyxx, l(0x00492492, 0x00492492, 0, 0)\nishl r8.xy, r7.xyxx, l(1, 1, 0, 0)\nushr r9.xy, r7.xyxx, l(1, 1, 0, 0)\niadd r7.xy, r7.xyxx, r8.xyxx\niadd r7.xy, r7.xyxx, r9.xyxx\nand r8.xy, r7.xyxx, r8.zwzz\nor r8.zw, r3.zzzw, r6.xxxz\nand r9.xyzw, r6.xyzw, l(0x00249249, 0x00249249, 0x00249249, 0x00249249)\nor r6.xy, r6.ywyy, r8.zwzz\nand r6.xy, r6.xyxx, l(0x00249249, 0x00249249, 0, 0)\nxor r6.xy, r6.xyxx, l(0x00249249, 0x00249249, 0, 0)\nnot r9.xyzw, r9.xyzw\nand r10.xyzw, r7.zzww, r9.xxzz\nand r9.xyzw, r9.yyww, r10.xyzw\nor r3.zw, r3.zzzw, r6.xxxy\niadd r3.zw, r3.zzzw, l(0, 0, 0xffdb6db7, 0xffdb6db7)\nor r3.zw, r9.yyyw, r3.zzzw\nishl r6.xyzw, r9.xyzw, l(2, 1, 2, 1)\nor r7.zw, r3.zzzw, r6.xxxz\nnot r7.xy, r7.xyxx\nand r7.xy, r7.xyxx, r7.zwzz\nor r7.xy, r8.xyxx, r7.xyxx\niadd r6.xy, r6.ywyy, r6.xzxx\nor r3.zw, r3.zzzw, r6.xxxy\nmovc r4.zw, r3.xxxy, r7.xxxy, r3.zzzw\nushr r6.xyzw, r4.xyzw, l(1, 1, 1, 1)\nand r6.xyzw, r4.xyzw, r6.xyzw\nand r6.xyzw, r6.xyzw, l(1170, 1170, 1170, 1170)\nishl r7.xyzw, r6.xyzw, l(1, 1, 1, 1)\nushr r8.xyzw, r6.xyzw, l(1, 1, 1, 1)\niadd r6.xyzw, r6.xyzw, r7.xyzw\niadd r6.xyzw, r6.xyzw, r8.xyzw\nnot r7.xyzw, r6.xxxy\nand r8.xyzw, r4.xxxy, r7.zzzw\niadd r9.xyzw, -r8.zzzw, l(2925, 2925, 2925, 2925)\nand r7.xyzw, r7.xyzw, r9.xyzw\nand r3.zw, r7.zzzw, l(0, 0, 7, 7)\nand r9.xy, r8.zwzz, l(7, 7, 0, 0)\nimul null, r9.xy, r2.ywyy, r9.xyxx\nimad r3.zw, r2.xxxz, r3.zzzw, r9.xxxy\nudiv r3.zw, null, r3.zzzw, l(0, 0, 5, 5)\nubfe r9.xyzw, l(3, 3, 3, 3), l(3, 6, 9, 3), r7.xyzw\nubfe r10.xyzw, l(3, 3, 3, 3), l(3, 6, 9, 3), r8.xyzw\nimul null, r10.xyzw, r2.yyyw, r10.xyzw\nimad r9.xyzw, r2.xxxz, r9.xyzw, r10.xyzw\nudiv r9.xyzw, null, r9.xyzw, l(5, 5, 5, 5)\nishl r9.xyzw, r9.xyzw, l(8, 16, 24, 8)\nor r3.zw, r3.zzzw, r9.xxxw\nor r0.z, r9.y, r3.z\nor r0.z, r9.z, r0.z\nand r9.xyzw, r4.xyzw, r6.xyzw\nishl r10.xyzw, r9.xxxy, l(5, 10, 15, 5)\nand r10.xyzw, r10.xyzw, l(256, 0x00010000, 0x01000000, 256)\nbfi r6.xy, l(1, 1, 0, 0), l(0, 0, 0, 0), r9.xyxx, r10.xwxx\niadd r3.z, r10.y, r6.x\niadd r3.z, r10.z, r3.z\nimad r0.z, r3.z, l(255), r0.z\nnot r10.xyzw, r4.xxxy\nand r7.xy, r10.zwzz, l(7, 7, 0, 0)\nand r11.xyzw, r4.xyzw, l(7, 7, 7, 7)\nimul null, r8.xy, r2.ywyy, r11.xyxx\nimad r7.xy, r2.xzxx, r7.xyxx, r8.xyxx\nudiv r7.xy, null, r7.xyxx, l(7, 7, 0, 0)\nubfe r12.xyzw, l(3, 3, 3, 3), l(3, 6, 9, 3), r10.xyzw\nubfe r13.xyzw, l(3, 3, 3, 3), l(3, 6, 9, 3), r4.xxxy\nimul null, r13.xyzw, r2.yyyw, r13.xyzw\nimad r12.xyzw, r2.xxxz, r12.xyzw, r13.xyzw\nudiv r12.xyzw, null, r12.xyzw, l(7, 7, 7, 7)\nishl r12.xyzw, r12.xyzw, l(8, 16, 24, 8)\nor r7.xy, r7.xyxx, r12.xwxx\nor r3.z, r12.y, r7.x\nor r3.z, r12.z, r3.z\nmovc r12.x, r0.x, r0.z, r3.z\nubfe r7.xz, l(3, 0, 3, 0), l(6, 0, 9, 0), r7.wwww\nubfe r8.xy, l(3, 3, 0, 0), l(6, 9, 0, 0), r8.wwww\nimul null, r8.xy, r2.wwww, r8.xyxx\nimad r7.xz, r2.zzzz, r7.xxzx, r8.xxyx\nudiv r7.xz, null, r7.xxzx, l(5, 0, 5, 0)\nishl r7.xz, r7.xxzx, l(16, 0, 24, 0)\nor r0.z, r3.w, r7.x\nor r0.z, r7.z, r0.z\nishl r8.xyzw, r9.yyww, l(10, 15, 10, 15)\nand r8.xyzw, r8.xyzw, l(0x00010000, 0x01000000, 0x00010000, 0x01000000)\niadd r3.z, r6.y, r8.x\niadd r3.z, r8.y, r3.z\nimad r0.z, r3.z, l(255), r0.z\nubfe r3.zw, l(0, 0, 3, 3), l(0, 0, 6, 9), r10.wwww\nubfe r10.xyzw, l(3, 3, 3, 3), l(6, 9, 6, 9), r4.yyww\nimul null, r6.xy, r2.wwww, r10.xyxx\nimad r3.zw, r2.zzzz, r3.zzzw, r6.xxxy\nudiv r3.zw, null, r3.zzzw, l(0, 0, 7, 7)\nishl r3.zw, r3.zzzw, l(0, 0, 16, 24)\nor r3.z, r3.z, r7.y\nor r3.z, r3.w, r3.z\nmovc r12.y, r0.y, r0.z, r3.z\nnot r6.xyzw, r6.zzzw\nand r7.xyzw, r4.zzzw, r6.zzzw\niadd r13.xyzw, -r7.zzzw, l(2925, 2925, 2925, 2925)\nand r6.xyzw, r6.xyzw, r13.xyzw\nand r3.zw, r6.zzzw, l(0, 0, 7, 7)\nand r8.xy, r7.zwzz, l(7, 7, 0, 0)\nimul null, r8.xy, r5.ywyy, r8.xyxx\nimad r3.zw, r5.xxxz, r3.zzzw, r8.xxxy\nudiv r3.zw, null, r3.zzzw, l(0, 0, 5, 5)\nubfe r13.xyzw, l(3, 3, 3, 3), l(3, 6, 9, 3), r6.xyzw\nubfe r14.xyzw, l(3, 3, 3, 3), l(3, 6, 9, 3), r7.xyzw\nimul null, r14.xyzw, r5.yyyw, r14.xyzw\nimad r13.xyzw, r5.xxxz, r13.xyzw, r14.xyzw\nudiv r13.xyzw, null, r13.xyzw, l(5, 5, 5, 5)\nishl r13.xyzw, r13.xyzw, l(8, 16, 24, 8)\nor r3.zw, r3.zzzw, r13.xxxw\nor r0.z, r13.y, r3.z\nor r0.z, r13.z, r0.z\nishl r13.xyzw, r9.zzzw, l(5, 10, 15, 5)\nand r13.xyzw, r13.xyzw, l(256, 0x00010000, 0x01000000, 256)\nbfi r6.xy, l(1, 1, 0, 0), l(0, 0, 0, 0), r9.zwzz, r13.xwxx\niadd r3.z, r13.y, r6.x\niadd r3.z, r13.z, r3.z\nimad r0.z, r3.z, l(255), r0.z\nnot r9.xyzw, r4.zzzw\nand r6.xz, r9.zzwz, l(7, 0, 7, 0)\nimul null, r7.xy, r5.ywyy, r11.zwzz\nimad r6.xz, r5.xxzx, r6.xxzx, r7.xxyx\nudiv r6.xz, null, r6.xxzx, l(7, 0, 7, 0)\nubfe r11.xyzw, l(3, 3, 3, 3), l(3, 6, 9, 3), r9.xyzw\nubfe r13.xyzw, l(3, 3, 3, 3), l(3, 6, 9, 3), r4.zzzw\nimul null, r13.xyzw, r5.yyyw, r13.xyzw\nimad r11.xyzw, r5.xxxz, r11.xyzw, r13.xyzw\nudiv r11.xyzw, null, r11.xyzw, l(7, 7, 7, 7)\nishl r11.xyzw, r11.xyzw, l(8, 16, 24, 8)\nor r6.xz, r6.xxzx, r11.xxwx\nor r3.z, r11.y, r6.x\nor r3.z, r11.z, r3.z\nmovc r12.z, r3.x, r0.z, r3.z\nubfe r6.xw, l(3, 0, 0, 3), l(6, 0, 0, 9), r6.wwww\nubfe r7.xy, l(3, 3, 0, 0), l(6, 9, 0, 0), r7.wwww\nimul null, r7.xy, r5.wwww, r7.xyxx\nimad r6.xw, r5.zzzz, r6.xxxw, r7.xxxy\nudiv r6.xw, null, r6.xxxw, l(5, 0, 0, 5)\nishl r6.xw, r6.xxxw, l(16, 0, 0, 24)\nor r0.z, r3.w, r6.x\nor r0.z, r6.w, r0.z\niadd r3.z, r8.z, r6.y\niadd r3.z, r8.w, r3.z\nimad r0.z, r3.z, l(255), r0.z\nubfe r3.zw, l(0, 0, 3, 3), l(0, 0, 6, 9), r9.wwww\nimul null, r6.xy, r5.wwww, r10.zwzz\nimad r3.zw, r5.zzzz, r3.zzzw, r6.xxxy\nudiv r3.zw, null, r3.zzzw, l(0, 0, 7, 7)\nishl r3.zw, r3.zzzw, l(0, 0, 16, 24)\nor r3.z, r3.z, r6.z\nor r3.z, r3.w, r3.z\nmovc r12.w, r3.y, r0.z, r3.z\nstore_raw U0[0].xyzw, r0.w, r12.xyzw\nimad r0.z, vThreadID.y, l(4), l(1)\nult r3.z, r0.z, CB0[0][2].y\nif_nz r3.z\n  iadd r0.w, r0.w, CB0[0][2].x\n  ushr r6.xyzw, r4.xyzw, l(12, 12, 12, 12)\n  ushr r7.xyzw, r6.xyzw, l(1, 1, 1, 1)\n  and r7.xyzw, r6.xyzw, r7.xyzw\n  and r7.xyzw, r7.xyzw, l(1170, 1170, 1170, 1170)\n  ishl r8.xyzw, r7.xyzw, l(1, 1, 1, 1)\n  ushr r9.xyzw, r7.xyzw, l(1, 1, 1, 1)\n  iadd r7.xyzw, r7.xyzw, r8.xyzw\n  iadd r7.xyzw, r7.xyzw, r9.xyzw\n  not r8.xyzw, r7.xyzw\n  and r9.xyzw, r6.xyzw, r8.xyzw\n  iadd r10.xyzw, -r9.xyzw, l(2925, 2925, 2925, 2925)\n  and r8.xyzw, r8.xyzw, r10.xyzw\n  and r10.xyzw, r8.xyzw, l(7, 7, 7, 7)\n  and r11.xyzw, r9.xyzw, l(7, 7, 7, 7)\n  imul null, r3.zw, r2.yyyw, r11.xxxy\n  imad r3.zw, r2.xxxz, r10.xxxy, r3.zzzw\n  udiv r3.zw, null, r3.zzzw, l(0, 0, 5, 5)\n  ubfe r12.xyzw, l(3, 3, 3, 3), l(3, 6, 9, 3), r8.xxxy\n  ubfe r13.xyzw, l(3, 3, 3, 3), l(3, 6, 9, 3), r9.xxxy\n  imul null, r13.xyzw, r2.yyyw, r13.xyzw\n  imad r12.xyzw, r2.xxxz, r12.xyzw, r13.xyzw\n  udiv r12.xyzw, null, r12.xyzw, l(5, 5, 5, 5)\n  ishl r12.xyzw, r12.xyzw, l(8, 16, 24, 8)\n  or r3.zw, r3.zzzw, r12.xxxw\n  or r3.z, r12.y, r3.z\n  or r3.z, r12.z, r3.z\n  and r7.xyzw, r6.xyzw, r7.xyzw\n  ishl r12.xyzw, r7.xxxy, l(5, 10, 15, 5)\n  and r12.xyzw, r12.xyzw, l(256, 0x00010000, 0x01000000, 256)\n  bfi r10.xy, l(1, 1, 0, 0), l(0, 0, 0, 0), r7.xyxx, r12.xwxx\n  iadd r7.x, r12.y, r10.x\n  iadd r7.x, r12.z, r7.x\n  imad r3.z, r7.x, l(255), r3.z\n  not r6.xyzw, r6.xyzw\n  and r12.xyzw, r6.xyzw, l(7, 7, 7, 7)\n  ubfe r13.xyzw, l(3, 3, 3, 3), l(12, 15, 18, 21), r4.xxxx\n  imul null, r13.xyzw, r2.yyyy, r13.xyzw\n  imad r4.x, r2.x, r12.x, r13.x\n  udiv r4.x, null, r4.x, l(7)\n  ubfe r14.xyzw, l(3, 3, 3, 3), l(3, 6, 9, 3), r6.xxxy\n  imad r13.xyz, r2.xxxx, r14.xyzx, r13.yzwy\n  udiv r13.xyz, null, r13.xyzx, l(7, 7, 7, 0)\n  ishl r13.xyz, r13.xyzx, l(8, 16, 24, 0)\n  or r4.x, r4.x, r13.x\n  or r4.x, r13.y, r4.x\n  or r4.x, r13.z, r4.x\n  movc r13.x, r0.x, r3.z, r4.x\n  ubfe r15.xyzw, l(3, 3, 3, 3), l(6, 9, 3, 6), r8.yyzz\n  ubfe r16.xyzw, l(3, 3, 3, 3), l(6, 9, 3, 6), r9.yyzz\n  imul null, r8.xy, r2.wwww, r16.xyxx\n  imad r8.xy, r2.zzzz, r15.xyxx, r8.xyxx\n  udiv r8.xy, null, r8.xyxx, l(5, 5, 0, 0)\n  ishl r8.xy, r8.xyxx, l(16, 24, 0, 0)\n  or r3.z, r3.w, r8.x\n  or r3.z, r8.y, r3.z\n  ishl r17.xyzw, r7.yyzz, l(10, 15, 5, 10)\n  and r17.xyzw, r17.xyzw, l(0x00010000, 0x01000000, 256, 0x00010000)\n  iadd r3.w, r10.y, r17.x\n  iadd r3.w, r17.y, r3.w\n  imad r3.z, r3.w, l(255), r3.z\n  ubfe r18.xyzw, l(3, 3, 3, 3), l(12, 15, 18, 21), r4.yyyy\n  imul null, r18.xyzw, r2.wwww, r18.xyzw\n  imad r3.w, r2.z, r12.y, r18.x\n  udiv r3.w, null, r3.w, l(7)\n  imad r4.x, r2.z, r14.w, r18.y\n  udiv r4.x, null, r4.x, l(7)\n  ishl r4.x, r4.x, l(8)\n  or r3.w, r3.w, r4.x\n  ubfe r14.xyzw, l(3, 3, 3, 3), l(6, 9, 3, 6), r6.yyzz\n  imad r4.xy, r2.zzzz, r14.xyxx, r18.zwzz\n  udiv r4.xy, null, r4.xyxx, l(7, 7, 0, 0)\n  ishl r4.xy, r4.xyxx, l(16, 24, 0, 0)\n  or r3.w, r3.w, r4.x\n  or r3.w, r4.y, r3.w\n  movc r13.y, r0.y, r3.z, r3.w\n  imul null, r3.zw, r5.yyyw, r11.zzzw\n  imad r3.zw, r5.xxxz, r10.zzzw, r3.zzzw\n  udiv r3.zw, null, r3.zzzw, l(0, 0, 5, 5)\n  imul null, r4.xy, r5.yyyy, r16.zwzz\n  imad r4.xy, r5.xxxx, r15.zwzz, r4.xyxx\n  udiv r4.xy, null, r4.xyxx, l(5, 5, 0, 0)\n  ishl r4.xy, r4.xyxx, l(8, 16, 0, 0)\n  or r3.z, r3.z, r4.x\n  or r3.z, r4.y, r3.z\n  ubfe r8.xyzw, l(3, 3, 3, 3), l(9, 3, 6, 9), r8.zwww\n  ubfe r9.xyzw, l(3, 3, 3, 3), l(9, 3, 6, 9), r9.zwww\n  imul null, r9.xyzw, r5.ywww, r9.xyzw\n  imad r8.xyzw, r5.xzzz, r8.xyzw, r9.xyzw\n  udiv r8.xyzw, null, r8.xyzw, l(5, 5, 5, 5)\n  ishl r8.xyzw, r8.xyzw, l(24, 8, 16, 24)\n  or r3.z, r3.z, r8.x\n  bfi r4.x, l(1), l(0), r7.z, r17.z\n  iadd r4.x, r17.w, r4.x\n  ishl r9.xyzw, r7.zwww, l(15, 5, 10, 15)\n  and r9.xyzw, r9.xyzw, l(0x01000000, 256, 0x00010000, 0x01000000)\n  iadd r4.x, r4.x, r9.x\n  imad r3.z, r4.x, l(255), r3.z\n  ubfe r10.xyzw, l(3, 3, 3, 3), l(12, 15, 18, 21), r4.zzzz\n  imul null, r10.xyzw, r5.yyyy, r10.xyzw\n  imad r4.x, r5.x, r12.z, r10.x\n  imad r4.yz, r5.xxxx, r14.zzwz, r10.yyzy\n  udiv r4.xyz, null, r4.xyzx, l(7, 7, 7, 0)\n  ishl r4.yz, r4.yyzy, l(0, 8, 16, 0)\n  or r4.x, r4.y, r4.x\n  or r4.x, r4.z, r4.x\n  ubfe r6.xyzw, l(3, 3, 3, 3), l(9, 3, 6, 9), r6.zwww\n  imad r4.y, r5.x, r6.x, r10.w\n  udiv r4.y, null, r4.y, l(7)\n  ishl r4.y, r4.y, l(24)\n  or r4.x, r4.y, r4.x\n  movc r13.z, r3.x, r3.z, r4.x\n  or r3.z, r3.w, r8.y\n  or r3.z, r8.z, r3.z\n  or r3.z, r8.w, r3.z\n  bfi r3.w, l(1), l(0), r7.w, r9.y\n  iadd r3.w, r9.z, r3.w\n  iadd r3.w, r9.w, r3.w\n  imad r3.z, r3.w, l(255), r3.z\n  ubfe r4.xyzw, l(3, 3, 3, 3), l(12, 15, 18, 21), r4.wwww\n  imul null, r4.xyzw, r4.xyzw, r5.wwww\n  imad r3.w, r5.z, r12.w, r4.x\n  udiv r3.w, null, r3.w, l(7)\n  imad r4.xyz, r5.zzzz, r6.yzwy, r4.yzwy\n  udiv r4.xyz, null, r4.xyzx, l(7, 7, 7, 0)\n  ishl r4.xyz, r4.xyzx, l(8, 16, 24, 0)\n  or r3.w, r3.w, r4.x\n  or r3.w, r4.y, r3.w\n  or r3.w, r4.z, r3.w\n  movc r13.w, r3.y, r3.z, r3.w\n  store_raw U0[0].xyzw, r0.w, r13.xyzw\n  iadd r0.z, r0.z, l(1)\n  ult r3.z, r0.z, CB0[0][2].y\n  if_nz r3.z\n    iadd r0.w, r0.w, CB0[0][2].x\n    ushr r1.xyzw, r1.xyzw, l(8, 8, 8, 8)\n    ushr r4.xyzw, r1.xxyy, l(1, 2, 1, 2)\n    and r3.zw, r1.xxxy, r4.xxxz\n    and r3.zw, r3.zzzw, l(0, 0, 0x00492492, 0x00492492)\n    ishl r6.xy, r3.zwzz, l(1, 1, 0, 0)\n    ushr r6.zw, r3.zzzw, l(0, 0, 1, 1)\n    iadd r3.zw, r3.zzzw, r6.xxxy\n    iadd r3.zw, r3.zzzw, r6.zzzw\n    and r6.xyzw, r1.xyzw, l(0x00249249, 0x00249249, 0x00249249, 0x00249249)\n    iadd r7.xyzw, r6.xyzw, l(0x00db6db6, 0x00db6db6, 0x00db6db6, 0x00db6db6)\n    and r7.xy, r3.zwzz, r7.xyxx\n    or r8.xy, r1.xyxx, r4.xzxx\n    and r9.xyzw, r4.xyzw, l(0x00249249, 0x00249249, 0x00249249, 0x00249249)\n    or r4.xy, r4.ywyy, r8.xyxx\n    and r4.xy, r4.xyxx, l(0x00249249, 0x00249249, 0, 0)\n    xor r4.xy, r4.xyxx, l(0x00249249, 0x00249249, 0, 0)\n    not r8.xyzw, r9.xyzw\n    and r9.xyzw, r6.xxyy, r8.xxzz\n    and r8.xyzw, r8.yyww, r9.xyzw\n    or r1.xy, r1.xyxx, r4.xyxx\n    iadd r1.xy, r1.xyxx, l(0xffdb6db7, 0xffdb6db7, 0, 0)\n    or r1.xy, r8.xwxx, r1.xyxx\n    ishl r4.xyzw, r8.xyzw, l(2, 1, 2, 1)\n    or r6.xy, r1.xyxx, r4.xzxx\n    not r3.zw, r3.zzzw\n    and r3.zw, r3.zzzw, r6.xxxy\n    or r3.zw, r7.xxxy, r3.zzzw\n    iadd r4.xy, r4.ywyy, r4.xzxx\n    or r1.xy, r1.xyxx, r4.xyxx\n    movc r4.xy, r0.xyxx, r3.zwzz, r1.xyxx\n    ushr r8.xyzw, r1.zzww, l(1, 2, 1, 2)\n    and r1.xy, r1.zwzz, r8.xzxx\n    and r1.xy, r1.xyxx, l(0x00492492, 0x00492492, 0, 0)\n    ishl r3.zw, r1.xxxy, l(0, 0, 1, 1)\n    ushr r6.xy, r1.xyxx, l(1, 1, 0, 0)\n    iadd r1.xy, r1.xyxx, r3.zwzz\n    iadd r1.xy, r1.xyxx, r6.xyxx\n    and r3.zw, r1.xxxy, r7.zzzw\n    or r6.xy, r1.zwzz, r8.xzxx\n    and r7.xyzw, r8.xyzw, l(0x00249249, 0x00249249, 0x00249249, 0x00249249)\n    or r6.xy, r8.ywyy, r6.xyxx\n    and r6.xy, r6.xyxx, l(0x00249249, 0x00249249, 0, 0)\n    xor r6.xy, r6.xyxx, l(0x00249249, 0x00249249, 0, 0)\n    not r7.xyzw, r7.xyzw\n    and r8.xyzw, r6.zzww, r7.xxzz\n    and r7.xyzw, r7.yyww, r8.xyzw\n    or r1.zw, r1.zzzw, r6.xxxy\n    iadd r1.zw, r1.zzzw, l(0, 0, 0xffdb6db7, 0xffdb6db7)\n    or r1.zw, r7.yyyw, r1.zzzw\n    ishl r6.xyzw, r7.xyzw, l(2, 1, 2, 1)\n    or r7.xy, r1.zwzz, r6.xzxx\n    not r1.xy, r1.xyxx\n    and r1.xy, r1.xyxx, r7.xyxx\n    or r1.xy, r3.zwzz, r1.xyxx\n    iadd r3.zw, r6.yyyw, r6.xxxz\n    or r1.zw, r1.zzzw, r3.zzzw\n    movc r4.zw, r3.xxxy, r1.xxxy, r1.zzzw\n    ushr r1.xyzw, r4.xyzw, l(1, 1, 1, 1)\n    and r1.xyzw, r4.xyzw, r1.xyzw\n    and r1.xyzw, r1.xyzw, l(1170, 1170, 1170, 1170)\n    ishl r6.xyzw, r1.xyzw, l(1, 1, 1, 1)\n    ushr r7.xyzw, r1.xyzw, l(1, 1, 1, 1)\n    iadd r1.xyzw, r1.xyzw, r6.xyzw\n    iadd r1.xyzw, r1.xyzw, r7.xyzw\n    not r6.xyzw, r1.xxxy\n    and r7.xyzw, r4.xxxy, r6.zzzw\n    iadd r8.xyzw, -r7.zzzw, l(2925, 2925, 2925, 2925)\n    and r6.xyzw, r6.xyzw, r8.xyzw\n    and r3.zw, r6.zzzw, l(0, 0, 7, 7)\n    and r8.xy, r7.zwzz, l(7, 7, 0, 0)\n    imul null, r8.xy, r2.ywyy, r8.xyxx\n    imad r3.zw, r2.xxxz, r3.zzzw, r8.xxxy\n    udiv r3.zw, null, r3.zzzw, l(0, 0, 5, 5)\n    ubfe r8.xyzw, l(3, 3, 3, 3), l(3, 6, 9, 3), r6.xyzw\n    ubfe r9.xyzw, l(3, 3, 3, 3), l(3, 6, 9, 3), r7.xyzw\n    imul null, r9.xyzw, r2.yyyw, r9.xyzw\n    imad r8.xyzw, r2.xxxz, r8.xyzw, r9.xyzw\n    udiv r8.xyzw, null, r8.xyzw, l(5, 5, 5, 5)\n    ishl r8.xyzw, r8.xyzw, l(8, 16, 24, 8)\n    or r3.zw, r3.zzzw, r8.xxxw\n    or r3.z, r8.y, r3.z\n    or r3.z, r8.z, r3.z\n    and r8.xyzw, r1.xyzw, r4.xyzw\n    ishl r9.xyzw, r8.xxxy, l(5, 10, 15, 5)\n    and r9.xyzw, r9.xyzw, l(256, 0x00010000, 0x01000000, 256)\n    bfi r1.xy, l(1, 1, 0, 0), l(0, 0, 0, 0), r8.xyxx, r9.xwxx\n    iadd r1.x, r9.y, r1.x\n    iadd r1.x, r9.z, r1.x\n    imad r1.x, r1.x, l(255), r3.z\n    not r9.xyzw, r4.xxxy\n    and r6.xy, r9.zwzz, l(7, 7, 0, 0)\n    and r10.xyzw, r4.xyzw, l(7, 7, 7, 7)\n    imul null, r7.xy, r2.ywyy, r10.xyxx\n    imad r6.xy, r2.xzxx, r6.xyxx, r7.xyxx\n    udiv r6.xy, null, r6.xyxx, l(7, 7, 0, 0)\n    ubfe r11.xyzw, l(3, 3, 3, 3), l(3, 6, 9, 3), r9.xyzw\n    ubfe r12.xyzw, l(3, 3, 3, 3), l(3, 6, 9, 3), r4.xxxy\n    imul null, r12.xyzw, r2.yyyw, r12.xyzw\n    imad r11.xyzw, r2.xxxz, r11.xyzw, r12.xyzw\n    udiv r11.xyzw, null, r11.xyzw, l(7, 7, 7, 7)\n    ishl r11.xyzw, r11.xyzw, l(8, 16, 24, 8)\n    or r6.xy, r6.xyxx, r11.xwxx\n    or r3.z, r11.y, r6.x\n    or r3.z, r11.z, r3.z\n    movc r11.x, r0.x, r1.x, r3.z\n    ubfe r6.xz, l(3, 0, 3, 0), l(6, 0, 9, 0), r6.wwww\n    ubfe r7.xy, l(3, 3, 0, 0), l(6, 9, 0, 0), r7.wwww\n    imul null, r7.xy, r2.wwww, r7.xyxx\n    imad r6.xz, r2.zzzz, r6.xxzx, r7.xxyx\n    udiv r6.xz, null, r6.xxzx, l(5, 0, 5, 0)\n    ishl r6.xz, r6.xxzx, l(16, 0, 24, 0)\n    or r1.x, r3.w, r6.x\n    or r1.x, r6.z, r1.x\n    ishl r7.xyzw, r8.yyww, l(10, 15, 10, 15)\n    and r7.xyzw, r7.xyzw, l(0x00010000, 0x01000000, 0x00010000, 0x01000000)\n    iadd r1.y, r1.y, r7.x\n    iadd r1.y, r7.y, r1.y\n    imad r1.x, r1.y, l(255), r1.x\n    ubfe r3.zw, l(0, 0, 3, 3), l(0, 0, 6, 9), r9.wwww\n    ubfe r9.xyzw, l(3, 3, 3, 3), l(6, 9, 6, 9), r4.yyww\n    imul null, r6.xz, r2.wwww, r9.xxyx\n    imad r3.zw, r2.zzzz, r3.zzzw, r6.xxxz\n    udiv r3.zw, null, r3.zzzw, l(0, 0, 7, 7)\n    ishl r3.zw, r3.zzzw, l(0, 0, 16, 24)\n    or r1.y, r3.z, r6.y\n    or r1.y, r3.w, r1.y\n    movc r11.y, r0.y, r1.x, r1.y\n    not r1.xyzw, r1.zzzw\n    and r6.xyzw, r1.zzzw, r4.zzzw\n    iadd r12.xyzw, -r6.zzzw, l(2925, 2925, 2925, 2925)\n    and r1.xyzw, r1.xyzw, r12.xyzw\n    and r3.zw, r1.zzzw, l(0, 0, 7, 7)\n    and r7.xy, r6.zwzz, l(7, 7, 0, 0)\n    imul null, r7.xy, r5.ywyy, r7.xyxx\n    imad r3.zw, r5.xxxz, r3.zzzw, r7.xxxy\n    udiv r3.zw, null, r3.zzzw, l(0, 0, 5, 5)\n    ubfe r12.xyzw, l(3, 3, 3, 3), l(3, 6, 9, 3), r1.xyzw\n    ubfe r13.xyzw, l(3, 3, 3, 3), l(3, 6, 9, 3), r6.xyzw\n    imul null, r13.xyzw, r5.yyyw, r13.xyzw\n    imad r12.xyzw, r5.xxxz, r12.xyzw, r13.xyzw\n    udiv r12.xyzw, null, r12.xyzw, l(5, 5, 5, 5)\n    ishl r12.xyzw, r12.xyzw, l(8, 16, 24, 8)\n    or r1.xy, r3.zwzz, r12.xwxx\n    or r1.x, r12.y, r1.x\n    or r1.x, r12.z, r1.x\n    ishl r12.xyzw, r8.zzzw, l(5, 10, 15, 5)\n    and r12.xyzw, r12.xyzw, l(256, 0x00010000, 0x01000000, 256)\n    bfi r3.zw, l(0, 0, 1, 1), l(0, 0, 0, 0), r8.zzzw, r12.xxxw\n    iadd r1.z, r12.y, r3.z\n    iadd r1.z, r12.z, r1.z\n    imad r1.x, r1.z, l(255), r1.x\n    not r8.xyzw, r4.zzzw\n    and r6.xy, r8.zwzz, l(7, 7, 0, 0)\n    imul null, r7.xy, r5.ywyy, r10.zwzz\n    imad r6.xy, r5.xzxx, r6.xyxx, r7.xyxx\n    udiv r6.xy, null, r6.xyxx, l(7, 7, 0, 0)\n    ubfe r10.xyzw, l(3, 3, 3, 3), l(3, 6, 9, 3), r8.xyzw\n    ubfe r12.xyzw, l(3, 3, 3, 3), l(3, 6, 9, 3), r4.zzzw\n    imul null, r12.xyzw, r5.yyyw, r12.xyzw\n    imad r10.xyzw, r5.xxxz, r10.xyzw, r12.xyzw\n    udiv r10.xyzw, null, r10.xyzw, l(7, 7, 7, 7)\n    ishl r10.xyzw, r10.xyzw, l(8, 16, 24, 8)\n    or r6.xy, r6.xyxx, r10.xwxx\n    or r1.z, r10.y, r6.x\n    or r1.z, r10.z, r1.z\n    movc r11.z, r3.x, r1.x, r1.z\n    ubfe r1.xz, l(3, 0, 3, 0), l(6, 0, 9, 0), r1.wwww\n    ubfe r6.xz, l(3, 0, 3, 0), l(6, 0, 9, 0), r6.wwww\n    imul null, r6.xz, r5.wwww, r6.xxzx\n    imad r1.xz, r5.zzzz, r1.xxzx, r6.xxzx\n    udiv r1.xz, null, r1.xxzx, l(5, 0, 5, 0)\n    ishl r1.xz, r1.xxzx, l(16, 0, 24, 0)\n    or r1.x, r1.x, r1.y\n    or r1.x, r1.z, r1.x\n    iadd r1.y, r7.z, r3.w\n    iadd r1.y, r7.w, r1.y\n    imad r1.x, r1.y, l(255), r1.x\n    ubfe r1.yz, l(0, 3, 3, 0), l(0, 6, 9, 0), r8.wwww\n    imul null, r3.zw, r5.wwww, r9.zzzw\n    imad r1.yz, r5.zzzz, r1.yyzy, r3.zzwz\n    udiv r1.yz, null, r1.yyzy, l(0, 7, 7, 0)\n    ishl r1.yz, r1.yyzy, l(0, 16, 24, 0)\n    or r1.y, r1.y, r6.y\n    or r1.y, r1.z, r1.y\n    movc r11.w, r3.y, r1.x, r1.y\n    store_raw U0[0].xyzw, r0.w, r11.xyzw\n    or r0.z, r0.z, l(3)\n    ult r0.z, r0.z, CB0[0][2].y\n    if_nz r0.z\n      iadd r0.z, r0.w, CB0[0][2].x\n      ushr r1.xyzw, r4.xyzw, l(12, 12, 12, 12)\n      ushr r6.xyzw, r1.xyzw, l(1, 1, 1, 1)\n      and r6.xyzw, r1.xyzw, r6.xyzw\n      and r6.xyzw, r6.xyzw, l(1170, 1170, 1170, 1170)\n      ishl r7.xyzw, r6.xyzw, l(1, 1, 1, 1)\n      ushr r8.xyzw, r6.xyzw, l(1, 1, 1, 1)\n      iadd r6.xyzw, r6.xyzw, r7.xyzw\n      iadd r6.xyzw, r6.xyzw, r8.xyzw\n      not r7.xyzw, r6.xyzw\n      and r8.xyzw, r1.xyzw, r7.xyzw\n      iadd r9.xyzw, -r8.xyzw, l(2925, 2925, 2925, 2925)\n      and r7.xyzw, r7.xyzw, r9.xyzw\n      and r9.xyzw, r7.xyzw, l(7, 7, 7, 7)\n      and r10.xyzw, r8.xyzw, l(7, 7, 7, 7)\n      imul null, r3.zw, r2.yyyw, r10.xxxy\n      imad r3.zw, r2.xxxz, r9.xxxy, r3.zzzw\n      udiv r3.zw, null, r3.zzzw, l(0, 0, 5, 5)\n      ubfe r11.xyzw, l(3, 3, 3, 3), l(3, 6, 9, 3), r7.xxxy\n      ubfe r12.xyzw, l(3, 3, 3, 3), l(3, 6, 9, 3), r8.xxxy\n      imul null, r12.xyzw, r2.yyyw, r12.xyzw\n      imad r11.xyzw, r2.xxxz, r11.xyzw, r12.xyzw\n      udiv r11.xyzw, null, r11.xyzw, l(5, 5, 5, 5)\n      ishl r11.xyzw, r11.xyzw, l(8, 16, 24, 8)\n      or r3.zw, r3.zzzw, r11.xxxw\n      or r0.w, r11.y, r3.z\n      or r0.w, r11.z, r0.w\n      and r6.xyzw, r1.xyzw, r6.xyzw\n      ishl r11.xyzw, r6.xxxy, l(5, 10, 15, 5)\n      and r11.xyzw, r11.xyzw, l(256, 0x00010000, 0x01000000, 256)\n      bfi r9.xy, l(1, 1, 0, 0), l(0, 0, 0, 0), r6.xyxx, r11.xwxx\n      iadd r3.z, r11.y, r9.x\n      iadd r3.z, r11.z, r3.z\n      imad r0.w, r3.z, l(255), r0.w\n      not r1.xyzw, r1.xyzw\n      and r11.xyzw, r1.xyzw, l(7, 7, 7, 7)\n      ubfe r12.xyzw, l(3, 3, 3, 3), l(12, 15, 18, 21), r4.xxxx\n      imul null, r12.xyzw, r2.yyyy, r12.xyzw\n      imad r2.y, r2.x, r11.x, r12.x\n      udiv r2.y, null, r2.y, l(7)\n      ubfe r13.xyzw, l(3, 3, 3, 3), l(3, 6, 9, 3), r1.xxxy\n      imad r12.xyz, r2.xxxx, r13.xyzx, r12.yzwy\n      udiv r12.xyz, null, r12.xyzx, l(7, 7, 7, 0)\n      ishl r12.xyz, r12.xyzx, l(8, 16, 24, 0)\n      or r1.x, r2.y, r12.x\n      or r1.x, r12.y, r1.x\n      or r1.x, r12.z, r1.x\n      movc r12.x, r0.x, r0.w, r1.x\n      ubfe r14.xyzw, l(3, 3, 3, 3), l(6, 9, 3, 6), r7.yyzz\n      ubfe r15.xyzw, l(3, 3, 3, 3), l(6, 9, 3, 6), r8.yyzz\n      imul null, r0.xw, r2.wwww, r15.xxxy\n      imad r0.xw, r2.zzzz, r14.xxxy, r0.xxxw\n      udiv r0.xw, null, r0.xxxw, l(5, 0, 0, 5)\n      ishl r0.xw, r0.xxxw, l(16, 0, 0, 24)\n      or r0.x, r0.x, r3.w\n      or r0.x, r0.w, r0.x\n      ishl r16.xyzw, r6.yyzz, l(10, 15, 5, 10)\n      and r16.xyzw, r16.xyzw, l(0x00010000, 0x01000000, 256, 0x00010000)\n      iadd r0.w, r9.y, r16.x\n      iadd r0.w, r16.y, r0.w\n      imad r0.x, r0.w, l(255), r0.x\n      ubfe r17.xyzw, l(3, 3, 3, 3), l(12, 15, 18, 21), r4.yyyy\n      imul null, r17.xyzw, r2.wwww, r17.xyzw\n      imad r0.w, r2.z, r11.y, r17.x\n      udiv r0.w, null, r0.w, l(7)\n      imad r1.x, r2.z, r13.w, r17.y\n      udiv r1.x, null, r1.x, l(7)\n      ishl r1.x, r1.x, l(8)\n      or r0.w, r0.w, r1.x\n      ubfe r13.xyzw, l(3, 3, 3, 3), l(6, 9, 3, 6), r1.yyzz\n      imad r1.xy, r2.zzzz, r13.xyxx, r17.zwzz\n      udiv r1.xy, null, r1.xyxx, l(7, 7, 0, 0)\n      ishl r1.xy, r1.xyxx, l(16, 24, 0, 0)\n      or r0.w, r0.w, r1.x\n      or r0.w, r1.y, r0.w\n      movc r12.y, r0.y, r0.x, r0.w\n      imul null, r0.xy, r5.ywyy, r10.zwzz\n      imad r0.xy, r5.xzxx, r9.zwzz, r0.xyxx\n      udiv r0.xy, null, r0.xyxx, l(5, 5, 0, 0)\n      imul null, r1.xy, r5.yyyy, r15.zwzz\n      imad r1.xy, r5.xxxx, r14.zwzz, r1.xyxx\n      udiv r1.xy, null, r1.xyxx, l(5, 5, 0, 0)\n      ishl r1.xy, r1.xyxx, l(8, 16, 0, 0)\n      or r0.x, r0.x, r1.x\n      or r0.x, r1.y, r0.x\n      ubfe r2.xyzw, l(3, 3, 3, 3), l(9, 3, 6, 9), r7.zwww\n      ubfe r7.xyzw, l(3, 3, 3, 3), l(9, 3, 6, 9), r8.zwww\n      imul null, r7.xyzw, r5.ywww, r7.xyzw\n      imad r2.xyzw, r5.xzzz, r2.xyzw, r7.xyzw\n      udiv r2.xyzw, null, r2.xyzw, l(5, 5, 5, 5)\n      ishl r2.xyzw, r2.xyzw, l(24, 8, 16, 24)\n      or r0.x, r0.x, r2.x\n      bfi r0.w, l(1), l(0), r6.z, r16.z\n      iadd r0.w, r16.w, r0.w\n      ishl r7.xyzw, r6.zwww, l(15, 5, 10, 15)\n      and r7.xyzw, r7.xyzw, l(0x01000000, 256, 0x00010000, 0x01000000)\n      iadd r0.w, r0.w, r7.x\n      imad r0.x, r0.w, l(255), r0.x\n      ubfe r8.xyzw, l(3, 3, 3, 3), l(12, 15, 18, 21), r4.zzzz\n      imul null, r8.xyzw, r5.yyyy, r8.xyzw\n      imad r0.w, r5.x, r11.z, r8.x\n      udiv r0.w, null, r0.w, l(7)\n      imad r1.xy, r5.xxxx, r13.zwzz, r8.yzyy\n      udiv r1.xy, null, r1.xyxx, l(7, 7, 0, 0)\n      ishl r1.xy, r1.xyxx, l(8, 16, 0, 0)\n      or r0.w, r0.w, r1.x\n      or r0.w, r1.y, r0.w\n      ubfe r1.xyzw, l(3, 3, 3, 3), l(9, 3, 6, 9), r1.zwww\n      imad r1.x, r5.x, r1.x, r8.w\n      udiv r1.x, null, r1.x, l(7)\n      ishl r1.x, r1.x, l(24)\n      or r0.w, r0.w, r1.x\n      movc r12.z, r3.x, r0.x, r0.w\n      or r0.x, r0.y, r2.y\n      or r0.x, r2.z, r0.x\n      or r0.x, r2.w, r0.x\n      bfi r0.y, l(1), l(0), r6.w, r7.y\n      iadd r0.y, r7.z, r0.y\n      iadd r0.y, r7.w, r0.y\n      imad r0.x, r0.y, l(255), r0.x\n      ubfe r2.xyzw, l(3, 3, 3, 3), l(12, 15, 18, 21), r4.wwww\n      imul null, r2.xyzw, r2.xyzw, r5.wwww\n      imad r0.y, r5.z, r11.w, r2.x\n      udiv r0.y, null, r0.y, l(7)\n      imad r1.xyz, r5.zzzz, r1.yzwy, r2.yzwy\n      udiv r1.xyz, null, r1.xyzx, l(7, 7, 7, 0)\n      ishl r1.xyz, r1.xyzx, l(8, 16, 24, 0)\n      or r0.y, r0.y, r1.x\n      or r0.y, r1.y, r0.y\n      or r0.y, r1.z, r0.y\n      movc r12.w, r3.y, r0.x, r0.y\n      store_raw U0[0].xyzw, r0.z, r12.xyzw\n    endif \n  endif \nendif \nret \n// Approximately 753 instruction slots used\n#endif\n\nconst BYTE texture_load_dxt5a_r8_cs[] =\n{\n     68,  88,  66,  67,  87,  88, \n    254,   2, 121,  63, 135,  97, \n    194, 159, 126, 172,  85, 181, \n     41, 210,   1,   0,   0,   0, \n    176, 109,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n     20, 109,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n    216, 104,   0,   0,  81,   0, \n      5,   0,  54,  26,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,  19,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  12,  50,   0,  16,   0, \n      0,   0,   0,   0,   6, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n    194,   0,  16,   0,   0,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0,   6, 132, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  11, \n     66,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10,  98,   0,  16,   0, \n      1,   0,   0,   0,   6,   1, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,  35,   0,   0,  10, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,   2,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     35,   0,   0,  11, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  10, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   9, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  58, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  31,   0,   0,   3, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  58, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     42,   0,   2,   0,  26,   0, \n      2,   0,  35,   0,   0,  11, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  42, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  41,   0, \n      0,   7,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  18,   0,   0,   1, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     85,   0,   0,  12, 194,   0, \n     16,   0,   1,   0,   0,   0, \n    166, 142,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   5,   0, \n      0,   0,   4,   0,   0,   0, \n     42,   0,   0,   9, 242,   0, \n     16,   0,   2,   0,   0,   0, \n    102,   5,   2,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n      4,   0,   0,   0,   1,   0, \n      0,   0,   3,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n    139,   0,   0,   8, 130,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  27,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  10,   0, \n      2,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  19, \n    194,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   5,   0, \n      0,   0,   4,   0,   0,   0, \n    166,   6,   2,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n    140,   0,   0,  11,  66,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     25,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  87,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0, 138,   0,   0,   9, \n     18,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  20, \n     98,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  11,   0, \n      0,   0,   0,   0,   0,   0, \n    166,  10,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  87,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  64,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    139,   0,   0,  15,  50,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  27,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   5,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  18,   0, \n      0,   1,  85,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  42,   0,   0,   9, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  86,   5,   2,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   1,   0,   0,   0, \n      4,   0,   0,   0,   3,   0, \n      0,   0, 139,   0,   0,   8, \n     66,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     27,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     10,   0,   2,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  20, 114,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0, 214,   6,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  66,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     26,   0,   0,   0,   1,  64, \n      0,   0,   6,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 138,   0, \n      0,   9,  18,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  87,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  10, \n     66,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     26,   0,   2,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     64,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0, 139,   0, \n      0,  15, 194,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  27,   0, \n      0,   0,  24,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   5,   0, \n      0,   0,  86,   5,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   8,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  20,   0, \n      0,   0,   1,  64,   0,   0, \n     12,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n     21,   0,   0,   1,  30,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n    214, 120,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     32,   0,   0,  10, 114,   0, \n     16,   0,   2,   0,   0,   0, \n    166,  10,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,  60,   0, \n      0,   7,  50,   0,  16,   0, \n      2,   0,   0,   0, 150,   5, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,   2,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  38,   7,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  38,   7, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   1,   0,   0,   0, \n    214,   8,  16,   0,   3,   0, \n      0,   0, 214,   8,  16,   0, \n      4,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  38,   7,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n    214,   8,  16,   0,   3,   0, \n      0,   0,  54,   0,   0,   5, \n     50,   0,  16,   0,   3,   0, \n      0,   0, 230,  10,  16,   0, \n      1,   0,   0,   0,  18,   0, \n      0,   1,  54,   0,   0,   5, \n     50,   0,  16,   0,   3,   0, \n      0,   0, 230,  10,  16,   0, \n      1,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     32,   0,   0,   0,  18,   0, \n      0,   1,  54,   0,   0,   5, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0,  21,   0, \n      0,   1,  30,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0, 214, 120,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  38,   7,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      6,   0,   0,   0,  38,   7, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   4,   0,   0,   0, \n    214,   8,  16,   0,   5,   0, \n      0,   0, 214,   8,  16,   0, \n      6,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  38,   7,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n    214,   8,  16,   0,   2,   0, \n      0,   0,  54,   0,   0,   5, \n    194,   0,  16,   0,   1,   0, \n      0,   0,   6,   4,  16,   0, \n      4,   0,   0,   0,  18,   0, \n      0,   1,  54,   0,   0,   5, \n    194,   0,  16,   0,   1,   0, \n      0,   0,   6,   4,  16,   0, \n      4,   0,   0,   0,  21,   0, \n      0,   1,  85,   0,   0,  10, \n    194,   0,  16,   0,   3,   0, \n      0,   0,   6,   4,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n    134,  13,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      4,   0,   0,   0, 230,  10, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  38,   7,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n     54,   0,   0,   5,  50,   0, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   3,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    140,   0,   0,  20, 242,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     80,   0,   0,   7,  50,   0, \n     16,   0,   0,   0,   0,   0, \n    214,   5,  16,   0,   2,   0, \n      0,   0, 134,   0,  16,   0, \n      2,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,   6,   5, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   2,   0,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   7, \n     50,   0,  16,   0,   6,   0, \n      0,   0,  70,   0,  16,   0, \n      3,   0,   0,   0, 134,   0, \n     16,   0,   4,   0,   0,   0, \n      1,   0,   0,  10,  50,   0, \n     16,   0,   6,   0,   0,   0, \n     70,   0,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n    146,  36,  73,   0, 146,  36, \n     73,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 194,   0,  16,   0, \n      6,   0,   0,   0,   6,   4, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   7,   0, \n      0,   0,  70,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,   6,   0,   0,   0, \n     70,   0,  16,   0,   6,   0, \n      0,   0, 230,  10,  16,   0, \n      6,   0,   0,   0,  30,   0, \n      0,   7,  50,   0,  16,   0, \n      6,   0,   0,   0,  70,   0, \n     16,   0,   6,   0,   0,   0, \n     70,   0,  16,   0,   7,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,  73, 146,  36,   0, \n     73, 146,  36,   0,  73, 146, \n     36,   0,  73, 146,  36,   0, \n     30,   0,   0,  10, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n    182, 109, 219,   0, 182, 109, \n    219,   0, 182, 109, 219,   0, \n    182, 109, 219,   0,   1,   0, \n      0,   7, 194,   0,  16,   0, \n      6,   0,   0,   0,   6,   4, \n     16,   0,   6,   0,   0,   0, \n      6,   4,  16,   0,   8,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   8,   0, \n      0,   0,  70,   0,  16,   0, \n      3,   0,   0,   0, 134,   0, \n     16,   0,   4,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n     73, 146,  36,   0,  73, 146, \n     36,   0,  73, 146,  36,   0, \n     73, 146,  36,   0,  60,   0, \n      0,   7,  50,   0,  16,   0, \n      4,   0,   0,   0, 214,   5, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n     50,   0,  16,   0,   4,   0, \n      0,   0,  70,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,  73, 146,  36,   0, \n     73, 146,  36,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,  10,  50,   0, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n     73, 146,  36,   0,  73, 146, \n     36,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  59,   0, \n      0,   5, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n      1,   0,   0,   7, 242,   0, \n     16,   0,  10,   0,   0,   0, \n      6,   5,  16,   0,   7,   0, \n      0,   0,   6,  10,  16,   0, \n      9,   0,   0,   0,   1,   0, \n      0,   7, 242,   0,  16,   0, \n      9,   0,   0,   0,  86,  15, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   3,   0, \n      0,   0,  70,   0,  16,   0, \n      3,   0,   0,   0,  70,   0, \n     16,   0,   4,   0,   0,   0, \n     30,   0,   0,  10,  50,   0, \n     16,   0,   3,   0,   0,   0, \n     70,   0,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n    183, 109, 219, 255, 183, 109, \n    219, 255,   0,   0,   0,   0, \n      0,   0,   0,   0,  60,   0, \n      0,   7,  50,   0,  16,   0, \n      3,   0,   0,   0, 198,   0, \n     16,   0,   9,   0,   0,   0, \n     70,   0,  16,   0,   3,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,   7,   0,   0,   0, \n     70,   0,  16,   0,   3,   0, \n      0,   0, 134,   0,  16,   0, \n      4,   0,   0,   0,  59,   0, \n      0,   5,  50,   0,  16,   0, \n      6,   0,   0,   0,  70,   0, \n     16,   0,   6,   0,   0,   0, \n      1,   0,   0,   7,  50,   0, \n     16,   0,   6,   0,   0,   0, \n     70,   0,  16,   0,   6,   0, \n      0,   0,  70,   0,  16,   0, \n      7,   0,   0,   0,  60,   0, \n      0,   7,  50,   0,  16,   0, \n      6,   0,   0,   0, 230,  10, \n     16,   0,   6,   0,   0,   0, \n     70,   0,  16,   0,   6,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   4,   0, \n      0,   0, 214,   5,  16,   0, \n      4,   0,   0,   0, 134,   0, \n     16,   0,   4,   0,   0,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,   3,   0,   0,   0, \n     70,   0,  16,   0,   3,   0, \n      0,   0,  70,   0,  16,   0, \n      4,   0,   0,   0,  55,   0, \n      0,   9,  50,   0,  16,   0, \n      4,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   6,   0, \n      0,   0,  70,   0,  16,   0, \n      3,   0,   0,   0,  80,   0, \n      0,   7,  50,   0,  16,   0, \n      3,   0,   0,   0, 214,   5, \n     16,   0,   5,   0,   0,   0, \n    134,   0,  16,   0,   5,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   6,   0, \n      0,   0, 166,  15,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   0,   2,   0,   0,   0, \n      1,   0,   0,   7,  50,   0, \n     16,   0,   7,   0,   0,   0, \n    230,  10,  16,   0,   3,   0, \n      0,   0, 134,   0,  16,   0, \n      6,   0,   0,   0,   1,   0, \n      0,  10,  50,   0,  16,   0, \n      7,   0,   0,   0,  70,   0, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0, 146,  36, \n     73,   0, 146,  36,  73,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n     50,   0,  16,   0,   8,   0, \n      0,   0,  70,   0,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     85,   0,   0,  10,  50,   0, \n     16,   0,   9,   0,   0,   0, \n     70,   0,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  50,   0,  16,   0, \n      7,   0,   0,   0,  70,   0, \n     16,   0,   7,   0,   0,   0, \n     70,   0,  16,   0,   8,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   7,   0, \n      0,   0,  70,   0,  16,   0, \n      7,   0,   0,   0,  70,   0, \n     16,   0,   9,   0,   0,   0, \n      1,   0,   0,   7,  50,   0, \n     16,   0,   8,   0,   0,   0, \n     70,   0,  16,   0,   7,   0, \n      0,   0, 230,  10,  16,   0, \n      8,   0,   0,   0,  60,   0, \n      0,   7, 194,   0,  16,   0, \n      8,   0,   0,   0, 166,  14, \n     16,   0,   3,   0,   0,   0, \n      6,   8,  16,   0,   6,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,  73, 146,  36,   0, \n     73, 146,  36,   0,  73, 146, \n     36,   0,  73, 146,  36,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,   6,   0,   0,   0, \n    214,   5,  16,   0,   6,   0, \n      0,   0, 230,  10,  16,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10,  50,   0,  16,   0, \n      6,   0,   0,   0,  70,   0, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,  73, 146, \n     36,   0,  73, 146,  36,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,  10, \n     50,   0,  16,   0,   6,   0, \n      0,   0,  70,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,  73, 146,  36,   0, \n     73, 146,  36,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     59,   0,   0,   5, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,   1,   0,   0,   7, \n    242,   0,  16,   0,  10,   0, \n      0,   0, 166,  15,  16,   0, \n      7,   0,   0,   0,   6,  10, \n     16,   0,   9,   0,   0,   0, \n      1,   0,   0,   7, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     86,  15,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  60,   0, \n      0,   7, 194,   0,  16,   0, \n      3,   0,   0,   0, 166,  14, \n     16,   0,   3,   0,   0,   0, \n      6,   4,  16,   0,   6,   0, \n      0,   0,  30,   0,   0,  10, \n    194,   0,  16,   0,   3,   0, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 183, 109, \n    219, 255, 183, 109, 219, 255, \n     60,   0,   0,   7, 194,   0, \n     16,   0,   3,   0,   0,   0, \n     86,  13,  16,   0,   9,   0, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n    194,   0,  16,   0,   7,   0, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,   6,   8, \n     16,   0,   6,   0,   0,   0, \n     59,   0,   0,   5,  50,   0, \n     16,   0,   7,   0,   0,   0, \n     70,   0,  16,   0,   7,   0, \n      0,   0,   1,   0,   0,   7, \n     50,   0,  16,   0,   7,   0, \n      0,   0,  70,   0,  16,   0, \n      7,   0,   0,   0, 230,  10, \n     16,   0,   7,   0,   0,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,   7,   0,   0,   0, \n     70,   0,  16,   0,   8,   0, \n      0,   0,  70,   0,  16,   0, \n      7,   0,   0,   0,  30,   0, \n      0,   7,  50,   0,  16,   0, \n      6,   0,   0,   0, 214,   5, \n     16,   0,   6,   0,   0,   0, \n    134,   0,  16,   0,   6,   0, \n      0,   0,  60,   0,   0,   7, \n    194,   0,  16,   0,   3,   0, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,   6,   4, \n     16,   0,   6,   0,   0,   0, \n     55,   0,   0,   9, 194,   0, \n     16,   0,   4,   0,   0,   0, \n      6,   4,  16,   0,   3,   0, \n      0,   0,   6,   4,  16,   0, \n      7,   0,   0,   0, 166,  14, \n     16,   0,   3,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   7, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0, 146,   4,   0,   0, \n    146,   4,   0,   0, 146,   4, \n      0,   0, 146,   4,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,  59,   0, \n      0,   5, 242,   0,  16,   0, \n      7,   0,   0,   0,   6,   4, \n     16,   0,   6,   0,   0,   0, \n      1,   0,   0,   7, 242,   0, \n     16,   0,   8,   0,   0,   0, \n      6,   4,  16,   0,   4,   0, \n      0,   0, 166,  14,  16,   0, \n      7,   0,   0,   0,  30,   0, \n      0,  11, 242,   0,  16,   0, \n      9,   0,   0,   0, 166,  14, \n     16, 128,  65,   0,   0,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0, 109,  11,   0,   0, \n    109,  11,   0,   0, 109,  11, \n      0,   0, 109,  11,   0,   0, \n      1,   0,   0,   7, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,   1,   0, \n      0,  10, 194,   0,  16,   0, \n      3,   0,   0,   0, 166,  14, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   1,   0,   0,  10, \n     50,   0,  16,   0,   9,   0, \n      0,   0, 230,  10,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0,  50,   0,  16,   0, \n      9,   0,   0,   0, 214,   5, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,   9,   0, \n      0,   0,  35,   0,   0,   9, \n    194,   0,  16,   0,   3,   0, \n      0,   0,   6,   8,  16,   0, \n      2,   0,   0,   0, 166,  14, \n     16,   0,   3,   0,   0,   0, \n      6,   4,  16,   0,   9,   0, \n      0,   0,  78,   0,   0,  11, \n    194,   0,  16,   0,   3,   0, \n      0,   0,   0, 208,   0,   0, \n    166,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n      9,   0,   0,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n      9,   0,   0,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  86,  13,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     35,   0,   0,   9, 242,   0, \n     16,   0,   9,   0,   0,   0, \n      6,   8,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     78,   0,   0,  11, 242,   0, \n     16,   0,   9,   0,   0,   0, \n      0, 208,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n     16,   0,   0,   0,  24,   0, \n      0,   0,   8,   0,   0,   0, \n     60,   0,   0,   7, 194,   0, \n     16,   0,   3,   0,   0,   0, \n    166,  14,  16,   0,   3,   0, \n      0,   0,   6,  12,  16,   0, \n      9,   0,   0,   0,  60,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   9,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0,  60,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      9,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n      1,   0,   0,   7, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,   6,   4, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,  10,   0,   0,   0, \n     15,   0,   0,   0,   5,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   0,   1,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   1,   0,   1,   0,   0, \n    140,   0,   0,  17,  50,   0, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   9,   0,   0,   0, \n    198,   0,  16,   0,  10,   0, \n      0,   0,  30,   0,   0,   7, \n     66,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n     10,   0,   0,   0,  10,   0, \n     16,   0,   6,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,  10,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0, 255,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  59,   0, \n      0,   5, 242,   0,  16,   0, \n     10,   0,   0,   0,   6,   4, \n     16,   0,   4,   0,   0,   0, \n      1,   0,   0,  10,  50,   0, \n     16,   0,   7,   0,   0,   0, \n    230,  10,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0,  50,   0, \n     16,   0,   8,   0,   0,   0, \n    214,   5,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n     11,   0,   0,   0,  35,   0, \n      0,   9,  50,   0,  16,   0, \n      7,   0,   0,   0, 134,   0, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,   7,   0, \n      0,   0,  70,   0,  16,   0, \n      8,   0,   0,   0,  78,   0, \n      0,  11,  50,   0,  16,   0, \n      7,   0,   0,   0,   0, 208, \n      0,   0,  70,   0,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,   9,   0,   0,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,   9,   0,   0,   0, \n      3,   0,   0,   0,   6,   4, \n     16,   0,   4,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0, 242,   0,  16,   0, \n     13,   0,   0,   0,  86,  13, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  35,   0,   0,   9, \n    242,   0,  16,   0,  12,   0, \n      0,   0,   6,   8,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  78,   0,   0,  11, \n    242,   0,  16,   0,  12,   0, \n      0,   0,   0, 208,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,  16,   0,   0,   0, \n     24,   0,   0,   0,   8,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   7,   0, \n      0,   0,  70,   0,  16,   0, \n      7,   0,   0,   0, 198,   0, \n     16,   0,  12,   0,   0,   0, \n     60,   0,   0,   7,  66,   0, \n     16,   0,   3,   0,   0,   0, \n     26,   0,  16,   0,  12,   0, \n      0,   0,  10,   0,  16,   0, \n      7,   0,   0,   0,  60,   0, \n      0,   7,  66,   0,  16,   0, \n      3,   0,   0,   0,  42,   0, \n     16,   0,  12,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0,  55,   0,   0,   9, \n     18,   0,  16,   0,  12,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0, 138,   0,   0,  15, \n     82,   0,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   6,   0,   0,   0, \n      0,   0,   0,   0,   9,   0, \n      0,   0,   0,   0,   0,   0, \n    246,  15,  16,   0,   7,   0, \n      0,   0, 138,   0,   0,  15, \n     50,   0,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   6,   0,   0,   0, \n      9,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    246,  15,  16,   0,   8,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0,  50,   0, \n     16,   0,   8,   0,   0,   0, \n    246,  15,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      8,   0,   0,   0,  35,   0, \n      0,   9,  82,   0,  16,   0, \n      7,   0,   0,   0, 166,  10, \n     16,   0,   2,   0,   0,   0, \n      6,   2,  16,   0,   7,   0, \n      0,   0,   6,   1,  16,   0, \n      8,   0,   0,   0,  78,   0, \n      0,  11,  82,   0,  16,   0, \n      7,   0,   0,   0,   0, 208, \n      0,   0,   6,   2,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,   5,   0, \n      0,   0,   0,   0,   0,   0, \n     41,   0,   0,  10,  82,   0, \n     16,   0,   7,   0,   0,   0, \n      6,   2,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,  60,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   7,   0, \n      0,   0,  60,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      7,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     86,  15,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  15,   0, \n      0,   0,  10,   0,   0,   0, \n     15,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   1, \n      0,   0,   1,   0,   0,   0, \n      0,   1,  30,   0,   0,   7, \n     66,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      6,   0,   0,   0,  10,   0, \n     16,   0,   8,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   3,   0,   0,   0, \n     26,   0,  16,   0,   8,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0, 255,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 194,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      6,   0,   0,   0,   9,   0, \n      0,   0, 246,  15,  16,   0, \n     10,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   6,   0, \n      0,   0,   9,   0,   0,   0, \n      6,   0,   0,   0,   9,   0, \n      0,   0,  86,  15,  16,   0, \n      4,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n     50,   0,  16,   0,   6,   0, \n      0,   0, 246,  15,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,  10,   0,   0,   0, \n     35,   0,   0,   9, 194,   0, \n     16,   0,   3,   0,   0,   0, \n    166,  10,  16,   0,   2,   0, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,   6,   4, \n     16,   0,   6,   0,   0,   0, \n     78,   0,   0,  11, 194,   0, \n     16,   0,   3,   0,   0,   0, \n      0, 208,   0,   0, 166,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,  41,   0,   0,  10, \n    194,   0,  16,   0,   3,   0, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n     60,   0,   0,   7,  66,   0, \n     16,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      7,   0,   0,   0,  60,   0, \n      0,   7,  66,   0,  16,   0, \n      3,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0,  55,   0,   0,   9, \n     34,   0,  16,   0,  12,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0,  59,   0,   0,   5, \n    242,   0,  16,   0,   6,   0, \n      0,   0, 166,  14,  16,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   7, 242,   0,  16,   0, \n      7,   0,   0,   0, 166,  14, \n     16,   0,   4,   0,   0,   0, \n    166,  14,  16,   0,   6,   0, \n      0,   0,  30,   0,   0,  11, \n    242,   0,  16,   0,  13,   0, \n      0,   0, 166,  14,  16, 128, \n     65,   0,   0,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n    109,  11,   0,   0, 109,  11, \n      0,   0, 109,  11,   0,   0, \n    109,  11,   0,   0,   1,   0, \n      0,   7, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   1,   0,   0,  10, \n    194,   0,  16,   0,   3,   0, \n      0,   0, 166,  14,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      1,   0,   0,  10,  50,   0, \n     16,   0,   8,   0,   0,   0, \n    230,  10,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n     50,   0,  16,   0,   8,   0, \n      0,   0, 214,   5,  16,   0, \n      5,   0,   0,   0,  70,   0, \n     16,   0,   8,   0,   0,   0, \n     35,   0,   0,   9, 194,   0, \n     16,   0,   3,   0,   0,   0, \n      6,   8,  16,   0,   5,   0, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,   6,   4, \n     16,   0,   8,   0,   0,   0, \n     78,   0,   0,  11, 194,   0, \n     16,   0,   3,   0,   0,   0, \n      0, 208,   0,   0, 166,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      6,   0,   0,   0,   9,   0, \n      0,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,  14,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      6,   0,   0,   0,   9,   0, \n      0,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 242,   0, \n     16,   0,  14,   0,   0,   0, \n     86,  13,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n     14,   0,   0,   0,  35,   0, \n      0,   9, 242,   0,  16,   0, \n     13,   0,   0,   0,   6,   8, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     14,   0,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n     13,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n      8,   0,   0,   0,  60,   0, \n      0,   7, 194,   0,  16,   0, \n      3,   0,   0,   0, 166,  14, \n     16,   0,   3,   0,   0,   0, \n      6,  12,  16,   0,  13,   0, \n      0,   0,  60,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n     13,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n     60,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,  13,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n     13,   0,   0,   0, 166,  14, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,  10,   0,   0,   0, \n     15,   0,   0,   0,   5,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   0,   1,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   1,   0,   1,   0,   0, \n    140,   0,   0,  17,  50,   0, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 230,  10, \n     16,   0,   9,   0,   0,   0, \n    198,   0,  16,   0,  13,   0, \n      0,   0,  30,   0,   0,   7, \n     66,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n     13,   0,   0,   0,  10,   0, \n     16,   0,   6,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,  13,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0, 255,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  59,   0, \n      0,   5, 242,   0,  16,   0, \n      9,   0,   0,   0, 166,  14, \n     16,   0,   4,   0,   0,   0, \n      1,   0,   0,  10,  82,   0, \n     16,   0,   6,   0,   0,   0, \n    166,  11,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n     50,   0,  16,   0,   7,   0, \n      0,   0, 214,   5,  16,   0, \n      5,   0,   0,   0, 230,  10, \n     16,   0,  11,   0,   0,   0, \n     35,   0,   0,   9,  82,   0, \n     16,   0,   6,   0,   0,   0, \n      6,   2,  16,   0,   5,   0, \n      0,   0,   6,   2,  16,   0, \n      6,   0,   0,   0,   6,   1, \n     16,   0,   7,   0,   0,   0, \n     78,   0,   0,  11,  82,   0, \n     16,   0,   6,   0,   0,   0, \n      0, 208,   0,   0,   6,   2, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      6,   0,   0,   0,   9,   0, \n      0,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      6,   0,   0,   0,   9,   0, \n      0,   0,   3,   0,   0,   0, \n    166,  14,  16,   0,   4,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     86,  13,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  35,   0, \n      0,   9, 242,   0,  16,   0, \n     11,   0,   0,   0,   6,   8, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n     11,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n      8,   0,   0,   0,  60,   0, \n      0,   7,  82,   0,  16,   0, \n      6,   0,   0,   0,   6,   2, \n     16,   0,   6,   0,   0,   0, \n      6,   3,  16,   0,  11,   0, \n      0,   0,  60,   0,   0,   7, \n     66,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n     11,   0,   0,   0,  10,   0, \n     16,   0,   6,   0,   0,   0, \n     60,   0,   0,   7,  66,   0, \n     16,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,  11,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0,  55,   0, \n      0,   9,  66,   0,  16,   0, \n     12,   0,   0,   0,  10,   0, \n     16,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0, 138,   0, \n      0,  15, 146,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   9,   0, \n      0,   0, 246,  15,  16,   0, \n      6,   0,   0,   0, 138,   0, \n      0,  15,  50,   0,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   6,   0, \n      0,   0,   9,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 246,  15,  16,   0, \n      7,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n     50,   0,  16,   0,   7,   0, \n      0,   0, 246,  15,  16,   0, \n      5,   0,   0,   0,  70,   0, \n     16,   0,   7,   0,   0,   0, \n     35,   0,   0,   9, 146,   0, \n     16,   0,   6,   0,   0,   0, \n    166,  10,  16,   0,   5,   0, \n      0,   0,   6,  12,  16,   0, \n      6,   0,   0,   0,   6,   4, \n     16,   0,   7,   0,   0,   0, \n     78,   0,   0,  11, 146,   0, \n     16,   0,   6,   0,   0,   0, \n      0, 208,   0,   0,   6,  12, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   5,   0, \n      0,   0,  41,   0,   0,  10, \n    146,   0,  16,   0,   6,   0, \n      0,   0,   6,  12,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  24,   0,   0,   0, \n     60,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,  10,   0,  16,   0, \n      6,   0,   0,   0,  60,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   6,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     66,   0,  16,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      8,   0,   0,   0,  26,   0, \n     16,   0,   6,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   3,   0,   0,   0, \n     58,   0,  16,   0,   8,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0, 255,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 194,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      6,   0,   0,   0,   9,   0, \n      0,   0, 246,  15,  16,   0, \n      9,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n     50,   0,  16,   0,   6,   0, \n      0,   0, 246,  15,  16,   0, \n      5,   0,   0,   0, 230,  10, \n     16,   0,  10,   0,   0,   0, \n     35,   0,   0,   9, 194,   0, \n     16,   0,   3,   0,   0,   0, \n    166,  10,  16,   0,   5,   0, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,   6,   4, \n     16,   0,   6,   0,   0,   0, \n     78,   0,   0,  11, 194,   0, \n     16,   0,   3,   0,   0,   0, \n      0, 208,   0,   0, 166,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,  41,   0,   0,  10, \n    194,   0,  16,   0,   3,   0, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n     60,   0,   0,   7,  66,   0, \n     16,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      6,   0,   0,   0,  60,   0, \n      0,   7,  66,   0,  16,   0, \n      3,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0,  55,   0,   0,   9, \n    130,   0,  16,   0,  12,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,  35,   0, \n      0,   8,  66,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n      2,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     79,   0,   0,   9,  66,   0, \n     16,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  26, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   3,   0,   0,   0, \n     30,   0,   0,   9, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  10, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n     12,   0,   0,   0,  12,   0, \n      0,   0,  12,   0,   0,   0, \n     12,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   7, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n    146,   4,   0,   0, 146,   4, \n      0,   0, 146,   4,   0,   0, \n    146,   4,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,  59,   0,   0,   5, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,   1,   0, \n      0,   7, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,  30,   0,   0,  11, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16, 128, \n     65,   0,   0,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n    109,  11,   0,   0, 109,  11, \n      0,   0, 109,  11,   0,   0, \n    109,  11,   0,   0,   1,   0, \n      0,   7, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,  10,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n    194,   0,  16,   0,   3,   0, \n      0,   0,  86,  13,  16,   0, \n      2,   0,   0,   0,   6,   4, \n     16,   0,  11,   0,   0,   0, \n     35,   0,   0,   9, 194,   0, \n     16,   0,   3,   0,   0,   0, \n      6,   8,  16,   0,   2,   0, \n      0,   0,   6,   4,  16,   0, \n     10,   0,   0,   0, 166,  14, \n     16,   0,   3,   0,   0,   0, \n     78,   0,   0,  11, 194,   0, \n     16,   0,   3,   0,   0,   0, \n      0, 208,   0,   0, 166,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      6,   0,   0,   0,   9,   0, \n      0,   0,   3,   0,   0,   0, \n      6,   4,  16,   0,   8,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      6,   0,   0,   0,   9,   0, \n      0,   0,   3,   0,   0,   0, \n      6,   4,  16,   0,   9,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     86,  13,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  35,   0, \n      0,   9, 242,   0,  16,   0, \n     12,   0,   0,   0,   6,   8, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n     12,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n      8,   0,   0,   0,  60,   0, \n      0,   7, 194,   0,  16,   0, \n      3,   0,   0,   0, 166,  14, \n     16,   0,   3,   0,   0,   0, \n      6,  12,  16,   0,  12,   0, \n      0,   0,  60,   0,   0,   7, \n     66,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n     12,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n     60,   0,   0,   7,  66,   0, \n     16,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,  12,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   7, 242,   0,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,  12,   0, \n      0,   0,   6,   4,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n     10,   0,   0,   0,  15,   0, \n      0,   0,   5,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   1, \n      0,   1,   0,   0, 140,   0, \n      0,  17,  50,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      7,   0,   0,   0, 198,   0, \n     16,   0,  12,   0,   0,   0, \n     30,   0,   0,   7,  18,   0, \n     16,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,  12,   0, \n      0,   0,  10,   0,  16,   0, \n     10,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      7,   0,   0,   0,  42,   0, \n     16,   0,  12,   0,   0,   0, \n     10,   0,  16,   0,   7,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   3,   0, \n      0,   0,  10,   0,  16,   0, \n      7,   0,   0,   0,   1,  64, \n      0,   0, 255,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0,  59,   0,   0,   5, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,  12,   0,   0,   0, \n     15,   0,   0,   0,  18,   0, \n      0,   0,  21,   0,   0,   0, \n      6,   0,  16,   0,   4,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 242,   0, \n     16,   0,  13,   0,   0,   0, \n     86,   5,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n     13,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      4,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,  12,   0, \n      0,   0,  10,   0,  16,   0, \n     13,   0,   0,   0,  78,   0, \n      0,   8,  18,   0,  16,   0, \n      4,   0,   0,   0,   0, 208, \n      0,   0,  10,   0,  16,   0, \n      4,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,  14,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,   9,   0,   0,   0, \n      3,   0,   0,   0,   6,   4, \n     16,   0,   6,   0,   0,   0, \n     35,   0,   0,   9, 114,   0, \n     16,   0,  13,   0,   0,   0, \n      6,   0,  16,   0,   2,   0, \n      0,   0,  70,   2,  16,   0, \n     14,   0,   0,   0, 150,   7, \n     16,   0,  13,   0,   0,   0, \n     78,   0,   0,  11, 114,   0, \n     16,   0,  13,   0,   0,   0, \n      0, 208,   0,   0,  70,   2, \n     16,   0,  13,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n     16,   0,   0,   0,  24,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  18,   0, \n     16,   0,   4,   0,   0,   0, \n     10,   0,  16,   0,   4,   0, \n      0,   0,  10,   0,  16,   0, \n     13,   0,   0,   0,  60,   0, \n      0,   7,  18,   0,  16,   0, \n      4,   0,   0,   0,  26,   0, \n     16,   0,  13,   0,   0,   0, \n     10,   0,  16,   0,   4,   0, \n      0,   0,  60,   0,   0,   7, \n     18,   0,  16,   0,   4,   0, \n      0,   0,  42,   0,  16,   0, \n     13,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     55,   0,   0,   9,  18,   0, \n     16,   0,  13,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,  15,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      6,   0,   0,   0,   9,   0, \n      0,   0,   3,   0,   0,   0, \n      6,   0,   0,   0,  86,  10, \n     16,   0,   8,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      6,   0,   0,   0,   9,   0, \n      0,   0,   3,   0,   0,   0, \n      6,   0,   0,   0,  86,  10, \n     16,   0,   9,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0,  50,   0,  16,   0, \n      8,   0,   0,   0, 246,  15, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,  16,   0, \n      0,   0,  35,   0,   0,   9, \n     50,   0,  16,   0,   8,   0, \n      0,   0, 166,  10,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,  15,   0,   0,   0, \n     70,   0,  16,   0,   8,   0, \n      0,   0,  78,   0,   0,  11, \n     50,   0,  16,   0,   8,   0, \n      0,   0,   0, 208,   0,   0, \n     70,   0,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10,  50,   0,  16,   0, \n      8,   0,   0,   0,  70,   0, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     66,   0,  16,   0,   3,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,  10,   0, \n     16,   0,   8,   0,   0,   0, \n     60,   0,   0,   7,  66,   0, \n     16,   0,   3,   0,   0,   0, \n     26,   0,  16,   0,   8,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n     17,   0,   0,   0,  86,  10, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  15,   0,   0,   0, \n      5,   0,   0,   0,  10,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  17,   0, \n      0,   0,  70,  14,  16,   0, \n     17,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   1,   0,   1, \n      0,   0,   0,   0,   1,   0, \n     30,   0,   0,   7, 130,   0, \n     16,   0,   3,   0,   0,   0, \n     26,   0,  16,   0,  10,   0, \n      0,   0,  10,   0,  16,   0, \n     17,   0,   0,   0,  30,   0, \n      0,   7, 130,   0,  16,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,  17,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   3,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0, 255,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,  18,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,  12,   0,   0,   0, \n     15,   0,   0,   0,  18,   0, \n      0,   0,  21,   0,   0,   0, \n     86,   5,  16,   0,   4,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 242,   0, \n     16,   0,  18,   0,   0,   0, \n    246,  15,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n     18,   0,   0,   0,  35,   0, \n      0,   9, 130,   0,  16,   0, \n      3,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,  12,   0, \n      0,   0,  10,   0,  16,   0, \n     18,   0,   0,   0,  78,   0, \n      0,   8, 130,   0,  16,   0, \n      3,   0,   0,   0,   0, 208, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   4,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n     14,   0,   0,   0,  26,   0, \n     16,   0,  18,   0,   0,   0, \n     78,   0,   0,   8,  18,   0, \n     16,   0,   4,   0,   0,   0, \n      0, 208,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  41,   0,   0,   7, \n     18,   0,  16,   0,   4,   0, \n      0,   0,  10,   0,  16,   0, \n      4,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     60,   0,   0,   7, 130,   0, \n     16,   0,   3,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,  10,   0,  16,   0, \n      4,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   6,   0, \n      0,   0,   9,   0,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,  86,  10,  16,   0, \n      6,   0,   0,   0,  35,   0, \n      0,   9,  50,   0,  16,   0, \n      4,   0,   0,   0, 166,  10, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,  14,   0, \n      0,   0, 230,  10,  16,   0, \n     18,   0,   0,   0,  78,   0, \n      0,  11,  50,   0,  16,   0, \n      4,   0,   0,   0,   0, 208, \n      0,   0,  70,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     41,   0,   0,  10,  50,   0, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  24,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  60,   0, \n      0,   7, 130,   0,  16,   0, \n      3,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   4,   0, \n      0,   0,  60,   0,   0,   7, \n    130,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      4,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n     55,   0,   0,   9,  34,   0, \n     16,   0,  13,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0, 194,   0,  16,   0, \n      3,   0,   0,   0,  86,  13, \n     16,   0,   5,   0,   0,   0, \n    166,  14,  16,   0,  11,   0, \n      0,   0,  35,   0,   0,   9, \n    194,   0,  16,   0,   3,   0, \n      0,   0,   6,   8,  16,   0, \n      5,   0,   0,   0, 166,  14, \n     16,   0,  10,   0,   0,   0, \n    166,  14,  16,   0,   3,   0, \n      0,   0,  78,   0,   0,  11, \n    194,   0,  16,   0,   3,   0, \n      0,   0,   0, 208,   0,   0, \n    166,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n     50,   0,  16,   0,   4,   0, \n      0,   0,  86,   5,  16,   0, \n      5,   0,   0,   0, 230,  10, \n     16,   0,  16,   0,   0,   0, \n     35,   0,   0,   9,  50,   0, \n     16,   0,   4,   0,   0,   0, \n      6,   0,  16,   0,   5,   0, \n      0,   0, 230,  10,  16,   0, \n     15,   0,   0,   0,  70,   0, \n     16,   0,   4,   0,   0,   0, \n     78,   0,   0,  11,  50,   0, \n     16,   0,   4,   0,   0,   0, \n      0, 208,   0,   0,  70,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n     50,   0,  16,   0,   4,   0, \n      0,   0,  70,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  66,   0, \n     16,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0,  10,   0,  16,   0, \n      4,   0,   0,   0,  60,   0, \n      0,   7,  66,   0,  16,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   9,   0,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,   9,   0,   0,   0, \n    230,  15,  16,   0,   8,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   9,   0,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,   9,   0,   0,   0, \n    230,  15,  16,   0,   9,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 242,   0, \n     16,   0,   9,   0,   0,   0, \n    214,  15,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,  35,   0, \n      0,   9, 242,   0,  16,   0, \n      8,   0,   0,   0, 134,  10, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n      8,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n     24,   0,   0,   0,   8,   0, \n      0,   0,  16,   0,   0,   0, \n     24,   0,   0,   0,  60,   0, \n      0,   7,  66,   0,  16,   0, \n      3,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   8,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   7,   0, \n      0,   0,  42,   0,  16,   0, \n     17,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      4,   0,   0,   0,  58,   0, \n     16,   0,  17,   0,   0,   0, \n     10,   0,  16,   0,   4,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   9,   0, \n      0,   0, 230,  15,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,  15,   0,   0,   0, \n      5,   0,   0,   0,  10,   0, \n      0,   0,  15,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   1,   0,   1, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   1,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      4,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     10,   0,  16,   0,   9,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   3,   0, \n      0,   0,  10,   0,  16,   0, \n      4,   0,   0,   0,   1,  64, \n      0,   0, 255,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,  12,   0,   0,   0, \n     15,   0,   0,   0,  18,   0, \n      0,   0,  21,   0,   0,   0, \n    166,  10,  16,   0,   4,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     86,   5,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      4,   0,   0,   0,  10,   0, \n     16,   0,   5,   0,   0,   0, \n     42,   0,  16,   0,  12,   0, \n      0,   0,  10,   0,  16,   0, \n     10,   0,   0,   0,  35,   0, \n      0,   9,  98,   0,  16,   0, \n      4,   0,   0,   0,   6,   0, \n     16,   0,   5,   0,   0,   0, \n    166,  11,  16,   0,  14,   0, \n      0,   0,  86,   6,  16,   0, \n     10,   0,   0,   0,  78,   0, \n      0,  11, 114,   0,  16,   0, \n      4,   0,   0,   0,   0, 208, \n      0,   0,  70,   2,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     41,   0,   0,  10,  98,   0, \n     16,   0,   4,   0,   0,   0, \n     86,   6,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  60,   0, \n      0,   7,  18,   0,  16,   0, \n      4,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n     10,   0,  16,   0,   4,   0, \n      0,   0,  60,   0,   0,   7, \n     18,   0,  16,   0,   4,   0, \n      0,   0,  42,   0,  16,   0, \n      4,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      9,   0,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n      9,   0,   0,   0, 230,  15, \n     16,   0,   6,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   4,   0,   0,   0, \n     10,   0,  16,   0,   5,   0, \n      0,   0,  10,   0,  16,   0, \n      6,   0,   0,   0,  58,   0, \n     16,   0,  10,   0,   0,   0, \n     78,   0,   0,   8,  34,   0, \n     16,   0,   4,   0,   0,   0, \n      0, 208,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  41,   0,   0,   7, \n     34,   0,  16,   0,   4,   0, \n      0,   0,  26,   0,  16,   0, \n      4,   0,   0,   0,   1,  64, \n      0,   0,  24,   0,   0,   0, \n     60,   0,   0,   7,  18,   0, \n     16,   0,   4,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0,  10,   0,  16,   0, \n      4,   0,   0,   0,  55,   0, \n      0,   9,  66,   0,  16,   0, \n     13,   0,   0,   0,  10,   0, \n     16,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0,  10,   0,  16,   0, \n      4,   0,   0,   0,  60,   0, \n      0,   7,  66,   0,  16,   0, \n      3,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n     26,   0,  16,   0,   8,   0, \n      0,   0,  60,   0,   0,   7, \n     66,   0,  16,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      8,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n     60,   0,   0,   7,  66,   0, \n     16,   0,   3,   0,   0,   0, \n     58,   0,  16,   0,   8,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0, 140,   0, \n      0,  11, 130,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      7,   0,   0,   0,  26,   0, \n     16,   0,   9,   0,   0,   0, \n     30,   0,   0,   7, 130,   0, \n     16,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   9,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,  30,   0, \n      0,   7, 130,   0,  16,   0, \n      3,   0,   0,   0,  58,   0, \n     16,   0,   9,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   3,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0, 255,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,  12,   0,   0,   0, \n     15,   0,   0,   0,  18,   0, \n      0,   0,  21,   0,   0,   0, \n    246,  15,  16,   0,   4,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0, 246,  15,  16,   0, \n      5,   0,   0,   0,  35,   0, \n      0,   9, 130,   0,  16,   0, \n      3,   0,   0,   0,  42,   0, \n     16,   0,   5,   0,   0,   0, \n     58,   0,  16,   0,  12,   0, \n      0,   0,  10,   0,  16,   0, \n      4,   0,   0,   0,  78,   0, \n      0,   8, 130,   0,  16,   0, \n      3,   0,   0,   0,   0, 208, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     35,   0,   0,   9, 114,   0, \n     16,   0,   4,   0,   0,   0, \n    166,  10,  16,   0,   5,   0, \n      0,   0, 150,   7,  16,   0, \n      6,   0,   0,   0, 150,   7, \n     16,   0,   4,   0,   0,   0, \n     78,   0,   0,  11, 114,   0, \n     16,   0,   4,   0,   0,   0, \n      0, 208,   0,   0,  70,   2, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,   4,   0, \n      0,   0,  70,   2,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n     16,   0,   0,   0,  24,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7, 130,   0, \n     16,   0,   3,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,  10,   0,  16,   0, \n      4,   0,   0,   0,  60,   0, \n      0,   7, 130,   0,  16,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,  60,   0,   0,   7, \n    130,   0,  16,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      4,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n     55,   0,   0,   9, 130,   0, \n     16,   0,  13,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,  13,   0, \n      0,   0,  30,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     79,   0,   0,   9,  66,   0, \n     16,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  26, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   3,   0,   0,   0, \n     30,   0,   0,   9, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  10, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,   6,   5, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   2,   0,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   7, \n    194,   0,  16,   0,   3,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0,   6,   8, \n     16,   0,   4,   0,   0,   0, \n      1,   0,   0,  10, 194,   0, \n     16,   0,   3,   0,   0,   0, \n    166,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 146,  36,  73,   0, \n    146,  36,  73,   0,  41,   0, \n      0,  10,  50,   0,  16,   0, \n      6,   0,   0,   0, 230,  10, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n    194,   0,  16,   0,   6,   0, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n     30,   0,   0,   7, 194,   0, \n     16,   0,   3,   0,   0,   0, \n    166,  14,  16,   0,   3,   0, \n      0,   0,   6,   4,  16,   0, \n      6,   0,   0,   0,  30,   0, \n      0,   7, 194,   0,  16,   0, \n      3,   0,   0,   0, 166,  14, \n     16,   0,   3,   0,   0,   0, \n    166,  14,  16,   0,   6,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  73, 146,  36,   0, \n     73, 146,  36,   0,  73, 146, \n     36,   0,  73, 146,  36,   0, \n     30,   0,   0,  10, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n    182, 109, 219,   0, 182, 109, \n    219,   0, 182, 109, 219,   0, \n    182, 109, 219,   0,   1,   0, \n      0,   7,  50,   0,  16,   0, \n      7,   0,   0,   0, 230,  10, \n     16,   0,   3,   0,   0,   0, \n     70,   0,  16,   0,   7,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   8,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0, 134,   0, \n     16,   0,   4,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n     73, 146,  36,   0,  73, 146, \n     36,   0,  73, 146,  36,   0, \n     73, 146,  36,   0,  60,   0, \n      0,   7,  50,   0,  16,   0, \n      4,   0,   0,   0, 214,   5, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n     50,   0,  16,   0,   4,   0, \n      0,   0,  70,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,  73, 146,  36,   0, \n     73, 146,  36,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,  10,  50,   0, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n     73, 146,  36,   0,  73, 146, \n     36,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  59,   0, \n      0,   5, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n      1,   0,   0,   7, 242,   0, \n     16,   0,   9,   0,   0,   0, \n      6,   5,  16,   0,   6,   0, \n      0,   0,   6,  10,  16,   0, \n      8,   0,   0,   0,   1,   0, \n      0,   7, 242,   0,  16,   0, \n      8,   0,   0,   0,  86,  15, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   4,   0,   0,   0, \n     30,   0,   0,  10,  50,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n    183, 109, 219, 255, 183, 109, \n    219, 255,   0,   0,   0,   0, \n      0,   0,   0,   0,  60,   0, \n      0,   7,  50,   0,  16,   0, \n      1,   0,   0,   0, 198,   0, \n     16,   0,   8,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,   6,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0, 134,   0,  16,   0, \n      4,   0,   0,   0,  59,   0, \n      0,   5, 194,   0,  16,   0, \n      3,   0,   0,   0, 166,  14, \n     16,   0,   3,   0,   0,   0, \n      1,   0,   0,   7, 194,   0, \n     16,   0,   3,   0,   0,   0, \n    166,  14,  16,   0,   3,   0, \n      0,   0,   6,   4,  16,   0, \n      6,   0,   0,   0,  60,   0, \n      0,   7, 194,   0,  16,   0, \n      3,   0,   0,   0,   6,   4, \n     16,   0,   7,   0,   0,   0, \n    166,  14,  16,   0,   3,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   4,   0, \n      0,   0, 214,   5,  16,   0, \n      4,   0,   0,   0, 134,   0, \n     16,   0,   4,   0,   0,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      4,   0,   0,   0,  55,   0, \n      0,   9,  50,   0,  16,   0, \n      4,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n    230,  10,  16,   0,   3,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      8,   0,   0,   0, 166,  15, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   2,   0,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   7, \n     50,   0,  16,   0,   1,   0, \n      0,   0, 230,  10,  16,   0, \n      1,   0,   0,   0, 134,   0, \n     16,   0,   8,   0,   0,   0, \n      1,   0,   0,  10,  50,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n    146,  36,  73,   0, 146,  36, \n     73,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 194,   0,  16,   0, \n      3,   0,   0,   0,   6,   4, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   6,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0, 230,  10,  16,   0, \n      3,   0,   0,   0,  30,   0, \n      0,   7,  50,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   6,   0, \n      0,   0,   1,   0,   0,   7, \n    194,   0,  16,   0,   3,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0, 166,  14, \n     16,   0,   7,   0,   0,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,   6,   0,   0,   0, \n    230,  10,  16,   0,   1,   0, \n      0,   0, 134,   0,  16,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,  73, 146, \n     36,   0,  73, 146,  36,   0, \n     73, 146,  36,   0,  73, 146, \n     36,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   6,   0, \n      0,   0, 214,   5,  16,   0, \n      8,   0,   0,   0,  70,   0, \n     16,   0,   6,   0,   0,   0, \n      1,   0,   0,  10,  50,   0, \n     16,   0,   6,   0,   0,   0, \n     70,   0,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n     73, 146,  36,   0,  73, 146, \n     36,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  87,   0, \n      0,  10,  50,   0,  16,   0, \n      6,   0,   0,   0,  70,   0, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,  73, 146, \n     36,   0,  73, 146,  36,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  59,   0,   0,   5, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,   1,   0, \n      0,   7, 242,   0,  16,   0, \n      8,   0,   0,   0, 166,  15, \n     16,   0,   6,   0,   0,   0, \n      6,  10,  16,   0,   7,   0, \n      0,   0,   1,   0,   0,   7, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  86,  15,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n     60,   0,   0,   7, 194,   0, \n     16,   0,   1,   0,   0,   0, \n    166,  14,  16,   0,   1,   0, \n      0,   0,   6,   4,  16,   0, \n      6,   0,   0,   0,  30,   0, \n      0,  10, 194,   0,  16,   0, \n      1,   0,   0,   0, 166,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    183, 109, 219, 255, 183, 109, \n    219, 255,  60,   0,   0,   7, \n    194,   0,  16,   0,   1,   0, \n      0,   0,  86,  13,  16,   0, \n      7,   0,   0,   0, 166,  14, \n     16,   0,   1,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   0,   2,   0,   0,   0, \n      1,   0,   0,   0,  60,   0, \n      0,   7,  50,   0,  16,   0, \n      7,   0,   0,   0, 230,  10, \n     16,   0,   1,   0,   0,   0, \n    134,   0,  16,   0,   6,   0, \n      0,   0,  59,   0,   0,   5, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   7,  50,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   7,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   1,   0, \n      0,   0, 230,  10,  16,   0, \n      3,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7, 194,   0, \n     16,   0,   3,   0,   0,   0, \n     86,  13,  16,   0,   6,   0, \n      0,   0,   6,   8,  16,   0, \n      6,   0,   0,   0,  60,   0, \n      0,   7, 194,   0,  16,   0, \n      1,   0,   0,   0, 166,  14, \n     16,   0,   1,   0,   0,   0, \n    166,  14,  16,   0,   3,   0, \n      0,   0,  55,   0,   0,   9, \n    194,   0,  16,   0,   4,   0, \n      0,   0,   6,   4,  16,   0, \n      3,   0,   0,   0,   6,   4, \n     16,   0,   1,   0,   0,   0, \n    166,  14,  16,   0,   1,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   7, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0, 146,   4, \n      0,   0, 146,   4,   0,   0, \n    146,   4,   0,   0, 146,   4, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n     59,   0,   0,   5, 242,   0, \n     16,   0,   6,   0,   0,   0, \n      6,   4,  16,   0,   1,   0, \n      0,   0,   1,   0,   0,   7, \n    242,   0,  16,   0,   7,   0, \n      0,   0,   6,   4,  16,   0, \n      4,   0,   0,   0, 166,  14, \n     16,   0,   6,   0,   0,   0, \n     30,   0,   0,  11, 242,   0, \n     16,   0,   8,   0,   0,   0, \n    166,  14,  16, 128,  65,   0, \n      0,   0,   7,   0,   0,   0, \n      2,  64,   0,   0, 109,  11, \n      0,   0, 109,  11,   0,   0, \n    109,  11,   0,   0, 109,  11, \n      0,   0,   1,   0,   0,   7, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 194,   0, \n     16,   0,   3,   0,   0,   0, \n    166,  14,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   1,   0, \n      0,  10,  50,   0,  16,   0, \n      8,   0,   0,   0, 230,  10, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0,  50,   0, \n     16,   0,   8,   0,   0,   0, \n    214,   5,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      8,   0,   0,   0,  35,   0, \n      0,   9, 194,   0,  16,   0, \n      3,   0,   0,   0,   6,   8, \n     16,   0,   2,   0,   0,   0, \n    166,  14,  16,   0,   3,   0, \n      0,   0,   6,   4,  16,   0, \n      8,   0,   0,   0,  78,   0, \n      0,  11, 194,   0,  16,   0, \n      3,   0,   0,   0,   0, 208, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,   9,   0,   0,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,   9,   0,   0,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0, 242,   0,  16,   0, \n      9,   0,   0,   0,  86,  13, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,  35,   0,   0,   9, \n    242,   0,  16,   0,   8,   0, \n      0,   0,   6,   8,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0,  78,   0,   0,  11, \n    242,   0,  16,   0,   8,   0, \n      0,   0,   0, 208,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      8,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,  16,   0,   0,   0, \n     24,   0,   0,   0,   8,   0, \n      0,   0,  60,   0,   0,   7, \n    194,   0,  16,   0,   3,   0, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,   6,  12, \n     16,   0,   8,   0,   0,   0, \n     60,   0,   0,   7,  66,   0, \n     16,   0,   3,   0,   0,   0, \n     26,   0,  16,   0,   8,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0,  60,   0, \n      0,   7,  66,   0,  16,   0, \n      3,   0,   0,   0,  42,   0, \n     16,   0,   8,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0,   1,   0,   0,   7, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   9,   0,   0,   0, \n      6,   4,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      5,   0,   0,   0,  10,   0, \n      0,   0,  15,   0,   0,   0, \n      5,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      9,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   1,   0,   1, \n      0,   0, 140,   0,   0,  17, \n     50,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   8,   0, \n      0,   0, 198,   0,  16,   0, \n      9,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   9,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      9,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n    255,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n     59,   0,   0,   5, 242,   0, \n     16,   0,   9,   0,   0,   0, \n      6,   4,  16,   0,   4,   0, \n      0,   0,   1,   0,   0,  10, \n     50,   0,  16,   0,   6,   0, \n      0,   0, 230,  10,  16,   0, \n      9,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  10,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n     50,   0,  16,   0,   7,   0, \n      0,   0, 214,   5,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,  10,   0,   0,   0, \n     35,   0,   0,   9,  50,   0, \n     16,   0,   6,   0,   0,   0, \n    134,   0,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      6,   0,   0,   0,  70,   0, \n     16,   0,   7,   0,   0,   0, \n     78,   0,   0,  11,  50,   0, \n     16,   0,   6,   0,   0,   0, \n      0, 208,   0,   0,  70,   0, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      6,   0,   0,   0,   9,   0, \n      0,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   9,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      6,   0,   0,   0,   9,   0, \n      0,   0,   3,   0,   0,   0, \n      6,   4,  16,   0,   4,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 242,   0, \n     16,   0,  12,   0,   0,   0, \n     86,  13,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,  35,   0, \n      0,   9, 242,   0,  16,   0, \n     11,   0,   0,   0,   6,   8, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,  78,   0, \n      0,  11, 242,   0,  16,   0, \n     11,   0,   0,   0,   0, 208, \n      0,   0,  70,  14,  16,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n      8,   0,   0,   0,  60,   0, \n      0,   7,  50,   0,  16,   0, \n      6,   0,   0,   0,  70,   0, \n     16,   0,   6,   0,   0,   0, \n    198,   0,  16,   0,  11,   0, \n      0,   0,  60,   0,   0,   7, \n     66,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n     11,   0,   0,   0,  10,   0, \n     16,   0,   6,   0,   0,   0, \n     60,   0,   0,   7,  66,   0, \n     16,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,  11,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0,  55,   0, \n      0,   9,  18,   0,  16,   0, \n     11,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0, 138,   0, \n      0,  15,  82,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      9,   0,   0,   0,   0,   0, \n      0,   0, 246,  15,  16,   0, \n      6,   0,   0,   0, 138,   0, \n      0,  15,  50,   0,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   6,   0, \n      0,   0,   9,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 246,  15,  16,   0, \n      7,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n     50,   0,  16,   0,   7,   0, \n      0,   0, 246,  15,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   7,   0,   0,   0, \n     35,   0,   0,   9,  82,   0, \n     16,   0,   6,   0,   0,   0, \n    166,  10,  16,   0,   2,   0, \n      0,   0,   6,   2,  16,   0, \n      6,   0,   0,   0,   6,   1, \n     16,   0,   7,   0,   0,   0, \n     78,   0,   0,  11,  82,   0, \n     16,   0,   6,   0,   0,   0, \n      0, 208,   0,   0,   6,   2, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n     82,   0,  16,   0,   6,   0, \n      0,   0,   6,   2,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,  24,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,  10,   0,  16,   0, \n      6,   0,   0,   0,  60,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   6,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  86,  15,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     15,   0,   0,   0,  10,   0, \n      0,   0,  15,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   1,   0,   0,   1,   0, \n      0,   0,   0,   1,  30,   0, \n      0,   7,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   7,   0, \n      0,   0,  30,   0,   0,   7, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      7,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n    255,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    138,   0,   0,  15, 194,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   6,   0,   0,   0, \n      9,   0,   0,   0, 246,  15, \n     16,   0,   9,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      6,   0,   0,   0,   9,   0, \n      0,   0,   6,   0,   0,   0, \n      9,   0,   0,   0,  86,  15, \n     16,   0,   4,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0,  82,   0,  16,   0, \n      6,   0,   0,   0, 246,  15, \n     16,   0,   2,   0,   0,   0, \n      6,   1,  16,   0,   9,   0, \n      0,   0,  35,   0,   0,   9, \n    194,   0,  16,   0,   3,   0, \n      0,   0, 166,  10,  16,   0, \n      2,   0,   0,   0, 166,  14, \n     16,   0,   3,   0,   0,   0, \n      6,   8,  16,   0,   6,   0, \n      0,   0,  78,   0,   0,  11, \n    194,   0,  16,   0,   3,   0, \n      0,   0,   0, 208,   0,   0, \n    166,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,  41,   0, \n      0,  10, 194,   0,  16,   0, \n      3,   0,   0,   0, 166,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,  24,   0, \n      0,   0,  60,   0,   0,   7, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   6,   0,   0,   0, \n     60,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  55,   0, \n      0,   9,  34,   0,  16,   0, \n     11,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  59,   0, \n      0,   5, 242,   0,  16,   0, \n      1,   0,   0,   0, 166,  14, \n     16,   0,   1,   0,   0,   0, \n      1,   0,   0,   7, 242,   0, \n     16,   0,   6,   0,   0,   0, \n    166,  14,  16,   0,   1,   0, \n      0,   0, 166,  14,  16,   0, \n      4,   0,   0,   0,  30,   0, \n      0,  11, 242,   0,  16,   0, \n     12,   0,   0,   0, 166,  14, \n     16, 128,  65,   0,   0,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0, 109,  11,   0,   0, \n    109,  11,   0,   0, 109,  11, \n      0,   0, 109,  11,   0,   0, \n      1,   0,   0,   7, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,   1,   0, \n      0,  10, 194,   0,  16,   0, \n      3,   0,   0,   0, 166,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   1,   0,   0,  10, \n     50,   0,  16,   0,   7,   0, \n      0,   0, 230,  10,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0,  50,   0,  16,   0, \n      7,   0,   0,   0, 214,   5, \n     16,   0,   5,   0,   0,   0, \n     70,   0,  16,   0,   7,   0, \n      0,   0,  35,   0,   0,   9, \n    194,   0,  16,   0,   3,   0, \n      0,   0,   6,   8,  16,   0, \n      5,   0,   0,   0, 166,  14, \n     16,   0,   3,   0,   0,   0, \n      6,   4,  16,   0,   7,   0, \n      0,   0,  78,   0,   0,  11, \n    194,   0,  16,   0,   3,   0, \n      0,   0,   0, 208,   0,   0, \n    166,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n      9,   0,   0,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n      9,   0,   0,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n    242,   0,  16,   0,  13,   0, \n      0,   0,  86,  13,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n     35,   0,   0,   9, 242,   0, \n     16,   0,  12,   0,   0,   0, \n      6,   8,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,  13,   0,   0,   0, \n     78,   0,   0,  11, 242,   0, \n     16,   0,  12,   0,   0,   0, \n      0, 208,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  70,  14,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n     16,   0,   0,   0,  24,   0, \n      0,   0,   8,   0,   0,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,   1,   0,   0,   0, \n    230,  10,  16,   0,   3,   0, \n      0,   0, 198,   0,  16,   0, \n     12,   0,   0,   0,  60,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,  12,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n     12,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,  12,   0,   0,   0, \n    166,  14,  16,   0,   8,   0, \n      0,   0,   2,  64,   0,   0, \n      5,   0,   0,   0,  10,   0, \n      0,   0,  15,   0,   0,   0, \n      5,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   1,   0,   1, \n      0,   0, 140,   0,   0,  17, \n    194,   0,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    166,  14,  16,   0,   8,   0, \n      0,   0,   6,  12,  16,   0, \n     12,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,  12,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0,  30,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n     12,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n    255,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     59,   0,   0,   5, 242,   0, \n     16,   0,   8,   0,   0,   0, \n    166,  14,  16,   0,   4,   0, \n      0,   0,   1,   0,   0,  10, \n     50,   0,  16,   0,   6,   0, \n      0,   0, 230,  10,  16,   0, \n      8,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0,  50,   0,  16,   0, \n      7,   0,   0,   0, 214,   5, \n     16,   0,   5,   0,   0,   0, \n    230,  10,  16,   0,  10,   0, \n      0,   0,  35,   0,   0,   9, \n     50,   0,  16,   0,   6,   0, \n      0,   0, 134,   0,  16,   0, \n      5,   0,   0,   0,  70,   0, \n     16,   0,   6,   0,   0,   0, \n     70,   0,  16,   0,   7,   0, \n      0,   0,  78,   0,   0,  11, \n     50,   0,  16,   0,   6,   0, \n      0,   0,   0, 208,   0,   0, \n     70,   0,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n      9,   0,   0,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n      9,   0,   0,   0,   3,   0, \n      0,   0, 166,  14,  16,   0, \n      4,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n    242,   0,  16,   0,  12,   0, \n      0,   0,  86,  13,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n     35,   0,   0,   9, 242,   0, \n     16,   0,  10,   0,   0,   0, \n      6,   8,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  12,   0,   0,   0, \n     78,   0,   0,  11, 242,   0, \n     16,   0,  10,   0,   0,   0, \n      0, 208,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,  10,   0, \n      0,   0,  70,  14,  16,   0, \n     10,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n     16,   0,   0,   0,  24,   0, \n      0,   0,   8,   0,   0,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,   6,   0,   0,   0, \n     70,   0,  16,   0,   6,   0, \n      0,   0, 198,   0,  16,   0, \n     10,   0,   0,   0,  60,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,  10,   0,   0,   0, \n     10,   0,  16,   0,   6,   0, \n      0,   0,  60,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n     10,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     55,   0,   0,   9,  66,   0, \n     16,   0,  11,   0,   0,   0, \n     10,   0,  16,   0,   3,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    138,   0,   0,  15,  82,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      6,   0,   0,   0,   0,   0, \n      0,   0,   9,   0,   0,   0, \n      0,   0,   0,   0, 246,  15, \n     16,   0,   1,   0,   0,   0, \n    138,   0,   0,  15,  82,   0, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      6,   0,   0,   0,   0,   0, \n      0,   0,   9,   0,   0,   0, \n      0,   0,   0,   0, 246,  15, \n     16,   0,   6,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0,  82,   0,  16,   0, \n      6,   0,   0,   0, 246,  15, \n     16,   0,   5,   0,   0,   0, \n      6,   2,  16,   0,   6,   0, \n      0,   0,  35,   0,   0,   9, \n     82,   0,  16,   0,   1,   0, \n      0,   0, 166,  10,  16,   0, \n      5,   0,   0,   0,   6,   2, \n     16,   0,   1,   0,   0,   0, \n      6,   2,  16,   0,   6,   0, \n      0,   0,  78,   0,   0,  11, \n     82,   0,  16,   0,   1,   0, \n      0,   0,   0, 208,   0,   0, \n      6,   2,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10,  82,   0,  16,   0, \n      1,   0,   0,   0,   6,   2, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n     24,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     60,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  34,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   7,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,  30,   0,   0,   7, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      7,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n    255,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    138,   0,   0,  15,  98,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   6,   0, \n      0,   0,   9,   0,   0,   0, \n      0,   0,   0,   0, 246,  15, \n     16,   0,   8,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0, 194,   0,  16,   0, \n      3,   0,   0,   0, 246,  15, \n     16,   0,   5,   0,   0,   0, \n    166,  14,  16,   0,   9,   0, \n      0,   0,  35,   0,   0,   9, \n     98,   0,  16,   0,   1,   0, \n      0,   0, 166,  10,  16,   0, \n      5,   0,   0,   0,  86,   6, \n     16,   0,   1,   0,   0,   0, \n    166,  11,  16,   0,   3,   0, \n      0,   0,  78,   0,   0,  11, \n     98,   0,  16,   0,   1,   0, \n      0,   0,   0, 208,   0,   0, \n     86,   6,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10,  98,   0,  16,   0, \n      1,   0,   0,   0,  86,   6, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     24,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   6,   0,   0,   0, \n     60,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  55,   0, \n      0,   9, 130,   0,  16,   0, \n     11,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     60,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  79,   0, \n      0,   9,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   9,  66,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,  12,   0, \n      0,   0,  12,   0,   0,   0, \n     12,   0,   0,   0,  12,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   7, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n      2,  64,   0,   0, 146,   4, \n      0,   0, 146,   4,   0,   0, \n    146,   4,   0,   0, 146,   4, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   8,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      6,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n     59,   0,   0,   5, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,   1,   0,   0,   7, \n    242,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n     30,   0,   0,  11, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16, 128,  65,   0, \n      0,   0,   8,   0,   0,   0, \n      2,  64,   0,   0, 109,  11, \n      0,   0, 109,  11,   0,   0, \n    109,  11,   0,   0, 109,  11, \n      0,   0,   1,   0,   0,   7, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  70,  14,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,   9,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   9,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 194,   0, \n     16,   0,   3,   0,   0,   0, \n     86,  13,  16,   0,   2,   0, \n      0,   0,   6,   4,  16,   0, \n     10,   0,   0,   0,  35,   0, \n      0,   9, 194,   0,  16,   0, \n      3,   0,   0,   0,   6,   8, \n     16,   0,   2,   0,   0,   0, \n      6,   4,  16,   0,   9,   0, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,  78,   0, \n      0,  11, 194,   0,  16,   0, \n      3,   0,   0,   0,   0, 208, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,   9,   0,   0,   0, \n      3,   0,   0,   0,   6,   4, \n     16,   0,   7,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,   9,   0,   0,   0, \n      3,   0,   0,   0,   6,   4, \n     16,   0,   8,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0, 242,   0,  16,   0, \n     12,   0,   0,   0,  86,  13, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,  35,   0,   0,   9, \n    242,   0,  16,   0,  11,   0, \n      0,   0,   6,   8,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,  78,   0,   0,  11, \n    242,   0,  16,   0,  11,   0, \n      0,   0,   0, 208,   0,   0, \n     70,  14,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,  16,   0,   0,   0, \n     24,   0,   0,   0,   8,   0, \n      0,   0,  60,   0,   0,   7, \n    194,   0,  16,   0,   3,   0, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,   6,  12, \n     16,   0,  11,   0,   0,   0, \n     60,   0,   0,   7, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,  11,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0,  60,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,  11,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,   1,   0,   0,   7, \n    242,   0,  16,   0,   6,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,  11,   0,   0,   0, \n      6,   4,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      5,   0,   0,   0,  10,   0, \n      0,   0,  15,   0,   0,   0, \n      5,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   1,   0,   1, \n      0,   0, 140,   0,   0,  17, \n     50,   0,  16,   0,   9,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   6,   0, \n      0,   0, 198,   0,  16,   0, \n     11,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,  11,   0,   0,   0, \n     10,   0,  16,   0,   9,   0, \n      0,   0,  30,   0,   0,   7, \n     66,   0,  16,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n     11,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n     35,   0,   0,   9, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n    255,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     59,   0,   0,   5, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,  11,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,  12,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n     12,   0,   0,   0,  15,   0, \n      0,   0,  18,   0,   0,   0, \n     21,   0,   0,   0,   6,   0, \n     16,   0,   4,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0, 242,   0,  16,   0, \n     12,   0,   0,   0,  86,   5, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,  11,   0,   0,   0, \n     10,   0,  16,   0,  12,   0, \n      0,   0,  78,   0,   0,   8, \n     34,   0,  16,   0,   2,   0, \n      0,   0,   0, 208,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      7,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n     13,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n      9,   0,   0,   0,   3,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0,  35,   0, \n      0,   9, 114,   0,  16,   0, \n     12,   0,   0,   0,   6,   0, \n     16,   0,   2,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0, 150,   7,  16,   0, \n     12,   0,   0,   0,  78,   0, \n      0,  11, 114,   0,  16,   0, \n     12,   0,   0,   0,   0, 208, \n      0,   0,  70,   2,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n     41,   0,   0,  10, 114,   0, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,  60,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,  12,   0, \n      0,   0,  60,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n     12,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     60,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,  12,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  55,   0, \n      0,   9,  18,   0,  16,   0, \n     12,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n     14,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   6,   0, \n      0,   0,   9,   0,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,  86,  10,  16,   0, \n      7,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n     15,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   6,   0, \n      0,   0,   9,   0,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,  86,  10,  16,   0, \n      8,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n    146,   0,  16,   0,   0,   0, \n      0,   0, 246,  15,  16,   0, \n      2,   0,   0,   0,   6,   4, \n     16,   0,  15,   0,   0,   0, \n     35,   0,   0,   9, 146,   0, \n     16,   0,   0,   0,   0,   0, \n    166,  10,  16,   0,   2,   0, \n      0,   0,   6,   4,  16,   0, \n     14,   0,   0,   0,   6,  12, \n     16,   0,   0,   0,   0,   0, \n     78,   0,   0,  11, 146,   0, \n     16,   0,   0,   0,   0,   0, \n      0, 208,   0,   0,   6,  12, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   5,   0, \n      0,   0,  41,   0,   0,  10, \n    146,   0,  16,   0,   0,   0, \n      0,   0,   6,  12,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  24,   0,   0,   0, \n     60,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,  60,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,  16,   0, \n      0,   0,  86,  10,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     15,   0,   0,   0,   5,   0, \n      0,   0,  10,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,  16,   0,   0,   0, \n     70,  14,  16,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   1,   0,   1,   0,   0, \n      0,   0,   1,   0,  30,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   9,   0,   0,   0, \n     10,   0,  16,   0,  16,   0, \n      0,   0,  30,   0,   0,   7, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n     16,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n    255,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,  17,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n     12,   0,   0,   0,  15,   0, \n      0,   0,  18,   0,   0,   0, \n     21,   0,   0,   0,  86,   5, \n     16,   0,   4,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0, 242,   0,  16,   0, \n     17,   0,   0,   0, 246,  15, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,  17,   0, \n      0,   0,  35,   0,   0,   9, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,  11,   0,   0,   0, \n     10,   0,  16,   0,  17,   0, \n      0,   0,  78,   0,   0,   8, \n    130,   0,  16,   0,   0,   0, \n      0,   0,   0, 208,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      7,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,  13,   0, \n      0,   0,  26,   0,  16,   0, \n     17,   0,   0,   0,  78,   0, \n      0,   8,  18,   0,  16,   0, \n      1,   0,   0,   0,   0, 208, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     41,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  60,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   6,   0,   0,   0, \n      9,   0,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n     86,  10,  16,   0,   1,   0, \n      0,   0,  35,   0,   0,   9, \n     50,   0,  16,   0,   1,   0, \n      0,   0, 166,  10,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,  13,   0,   0,   0, \n    230,  10,  16,   0,  17,   0, \n      0,   0,  78,   0,   0,  11, \n     50,   0,  16,   0,   1,   0, \n      0,   0,   0, 208,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      7,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10,  50,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     60,   0,   0,   7, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9,  34,   0,  16,   0, \n     12,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  38,   0, \n      0,   8,   0, 208,   0,   0, \n     50,   0,  16,   0,   0,   0, \n      0,   0, 214,   5,  16,   0, \n      5,   0,   0,   0, 230,  10, \n     16,   0,  10,   0,   0,   0, \n     35,   0,   0,   9,  50,   0, \n     16,   0,   0,   0,   0,   0, \n    134,   0,  16,   0,   5,   0, \n      0,   0, 230,  10,  16,   0, \n      9,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n     78,   0,   0,  11,  50,   0, \n     16,   0,   0,   0,   0,   0, \n      0, 208,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0,  50,   0, \n     16,   0,   1,   0,   0,   0, \n     86,   5,  16,   0,   5,   0, \n      0,   0, 230,  10,  16,   0, \n     15,   0,   0,   0,  35,   0, \n      0,   9,  50,   0,  16,   0, \n      1,   0,   0,   0,   6,   0, \n     16,   0,   5,   0,   0,   0, \n    230,  10,  16,   0,  14,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,  78,   0, \n      0,  11,  50,   0,  16,   0, \n      1,   0,   0,   0,   0, 208, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     41,   0,   0,  10,  50,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  60,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      9,   0,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n      9,   0,   0,   0, 230,  15, \n     16,   0,   7,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      9,   0,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n      9,   0,   0,   0, 230,  15, \n     16,   0,   8,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0, 242,   0,  16,   0, \n      7,   0,   0,   0, 214,  15, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  35,   0,   0,   9, \n    242,   0,  16,   0,   2,   0, \n      0,   0, 134,  10,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  78,   0,   0,  11, \n    242,   0,  16,   0,   2,   0, \n      0,   0,   0, 208,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  24,   0, \n      0,   0,   8,   0,   0,   0, \n     16,   0,   0,   0,  24,   0, \n      0,   0,  60,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n    140,   0,   0,  11, 130,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   6,   0,   0,   0, \n     42,   0,  16,   0,  16,   0, \n      0,   0,  30,   0,   0,   7, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n     16,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   7,   0,   0,   0, \n    230,  15,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n     15,   0,   0,   0,   5,   0, \n      0,   0,  10,   0,   0,   0, \n     15,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      7,   0,   0,   0,  70,  14, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   1,   0,   1,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   1,  30,   0,   0,   7, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   7,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n    255,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n     12,   0,   0,   0,  15,   0, \n      0,   0,  18,   0,   0,   0, \n     21,   0,   0,   0, 166,  10, \n     16,   0,   4,   0,   0,   0, \n     38,   0,   0,   8,   0, 208, \n      0,   0, 242,   0,  16,   0, \n      8,   0,   0,   0,  86,   5, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   8,   0, \n      0,   0,  35,   0,   0,   9, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      5,   0,   0,   0,  42,   0, \n     16,   0,  11,   0,   0,   0, \n     10,   0,  16,   0,   8,   0, \n      0,   0,  78,   0,   0,   8, \n    130,   0,  16,   0,   0,   0, \n      0,   0,   0, 208,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      7,   0,   0,   0,  35,   0, \n      0,   9,  50,   0,  16,   0, \n      1,   0,   0,   0,   6,   0, \n     16,   0,   5,   0,   0,   0, \n    230,  10,  16,   0,  13,   0, \n      0,   0, 150,   5,  16,   0, \n      8,   0,   0,   0,  78,   0, \n      0,  11,  50,   0,  16,   0, \n      1,   0,   0,   0,   0, 208, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     41,   0,   0,  10,  50,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  60,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      9,   0,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n      9,   0,   0,   0, 230,  15, \n     16,   0,   1,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   5,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   8,   0,   0,   0, \n     78,   0,   0,   8,  18,   0, \n     16,   0,   1,   0,   0,   0, \n      0, 208,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  41,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  24,   0,   0,   0, \n     60,   0,   0,   7, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  55,   0, \n      0,   9,  66,   0,  16,   0, \n     12,   0,   0,   0,  10,   0, \n     16,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  60,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  60,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   7,   0,   0,   0, \n     30,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   7,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  34,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0, 255,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,  12,   0,   0,   0, \n     15,   0,   0,   0,  18,   0, \n      0,   0,  21,   0,   0,   0, \n    246,  15,  16,   0,   4,   0, \n      0,   0,  38,   0,   0,   8, \n      0, 208,   0,   0, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0, 246,  15,  16,   0, \n      5,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   5,   0,   0,   0, \n     58,   0,  16,   0,  11,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  78,   0, \n      0,   8,  34,   0,  16,   0, \n      0,   0,   0,   0,   0, 208, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     35,   0,   0,   9, 114,   0, \n     16,   0,   1,   0,   0,   0, \n    166,  10,  16,   0,   5,   0, \n      0,   0, 150,   7,  16,   0, \n      1,   0,   0,   0, 150,   7, \n     16,   0,   2,   0,   0,   0, \n     78,   0,   0,  11, 114,   0, \n     16,   0,   1,   0,   0,   0, \n      0, 208,   0,   0,  70,   2, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   7,   0, \n      0,   0,   7,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    114,   0,  16,   0,   1,   0, \n      0,   0,  70,   2,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n     16,   0,   0,   0,  24,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  60,   0, \n      0,   7,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     55,   0,   0,   9, 130,   0, \n     16,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,  21,   0,   0,   1, \n     21,   0,   0,   1,  21,   0, \n      0,   1,  62,   0,   0,   1, \n     83,  84,  65,  84, 148,   0, \n      0,   0, 241,   2,   0,   0, \n     19,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  15,   1, \n      0,   0,  74,   1,   0,   0, \n      7,   0,   0,   0,  11,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  20,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_gbgr8_grgb8_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 5\ndcl_thread_group 4, 32, 1\nand r0.xy, CB0[0][0].xxxx, l(1, 2, 0, 0)\nishl r1.x, vThreadID.x, l(3)\nmov r1.y, vThreadID.y\nuge r0.zw, r1.xxxy, CB0[0][1].xxxy\nor r0.z, r0.w, r0.z\nif_nz r0.z\n  ret \nendif \nubfe r0.z, l(2), l(2), CB0[0][0].x\nishl r0.w, r1.x, l(2)\nimad r1.y, vThreadID.z, CB0[0][1].y, vThreadID.y\nimad r0.w, r1.y, CB0[0][2].x, r0.w\niadd r0.w, r0.w, CB0[0][1].w\nif_z r0.x\n  imad r1.y, CB0[0][0].w, vThreadID.z, vThreadID.y\n  imad r1.y, CB0[0][0].z, r1.y, r1.x\n  ishl r1.y, r1.y, l(2)\nelse \n  if_nz r0.y\n    ushr r1.zw, CB0[0][0].zzzw, l(0, 0, 5, 4)\n    ishr r2.xyzw, vThreadID.zyyy, l(2, 4, 1, 3)\n    imad r0.y, r2.x, r1.w, r2.y\n    ibfe r1.w, l(27), l(2), vThreadID.x\n    imad r0.y, r0.y, r1.z, r1.w\n    bfi r1.zw, l(0, 0, 2, 1), l(0, 0, 5, 4), vThreadID.zzzy, l(0, 0, 0, 0)\n    bfi r2.y, l(2), l(3), r2.z, l(0)\n    iadd r1.z, r1.z, r2.y\n    bfi r0.y, l(25), l(7), r0.y, r1.z\n    xor r1.z, r2.x, r2.w\n    ubfe r2.x, l(2), l(3), r1.x\n    bfi r2.yz, l(0, 1, 1, 0), l(0, 1, 11, 0), r1.zzzz, l(0, 0, 0, 0)\n    xor r1.z, r2.y, r2.x\n    imad r1.z, r1.z, l(64), r1.w\n    iadd r1.z, r2.z, r1.z\n    ibfe r2.xy, l(27, 24, 0, 0), l(3, 6, 0, 0), r0.yyyy\n    bfi r0.y, l(3), l(8), r2.x, r1.z\n    bfi r1.y, l(20), l(12), r2.y, r0.y\n  else \n    ushr r0.y, CB0[0][0].z, l(5)\n    ishr r2.xyzw, vThreadID.yyyy, l(5, 1, 4, 3)\n    ibfe r1.z, l(27), l(2), vThreadID.x\n    imad r0.y, r2.x, r0.y, r1.z\n    bfi r2.xyz, l(3, 1, 1, 0), l(3, 1, 11, 0), r2.ywzy, l(0, 0, 0, 0)\n    bfi r0.y, l(26), l(6), r0.y, r2.x\n    ubfe r1.x, l(2), l(3), r1.x\n    xor r1.x, r2.y, r1.x\n    bfi r1.z, l(1), l(4), vThreadID.y, l(0)\n    imad r1.x, r1.x, l(64), r1.z\n    iadd r1.x, r2.z, r1.x\n    ibfe r1.zw, l(0, 0, 27, 24), l(0, 0, 3, 6), r0.yyyy\n    bfi r0.y, l(3), l(8), r1.z, r1.x\n    bfi r1.y, l(20), l(12), r1.w, r0.y\n  endif \nendif \niadd r0.y, r1.y, CB0[0][0].y\nld_raw r1.xyzw, r0.y, T0[0].xyzw\nieq r2.xyz, r0.zzzz, l(1, 2, 3, 0)\nor r2.xy, r2.yzyy, r2.xyxx\nif_nz r2.x\n  ishl r3.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r1.xyzw, r3.xyzw, r4.xyzw\nendif \nif_nz r2.y\n  ushr r3.xyzw, r1.xyzw, l(16, 16, 16, 16)\n  bfi r1.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r1.xyzw, r3.xyzw\nendif \nand r3.xyzw, r1.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\nishl r4.xyzw, r1.xyzw, l(16, 16, 16, 16)\nbfi r3.xyzw, l(24, 24, 24, 24), l(0, 0, 0, 0), r3.xyzw, r4.xyzw\nushr r1.xyzw, r1.xyzw, l(16, 16, 16, 16)\nand r1.xyzw, r1.xyzw, l(0x0000ff00, 0x0000ff00, 0x0000ff00, 0x0000ff00)\niadd r1.xyzw, r1.xyzw, r3.xyzw\nstore_raw U0[0].xyzw, r0.w, r1.xyzw\niadd r0.z, r0.w, l(16)\nif_nz r0.x\n  mov r0.x, l(32)\nelse \n  mov r0.x, l(16)\nendif \niadd r0.x, r0.x, r0.y\nld_raw r1.xyzw, r0.x, T0[0].xyzw\nif_nz r2.x\n  ishl r3.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r1.xyzw, r3.xyzw, r4.xyzw\nendif \nif_nz r2.y\n  ushr r2.xyzw, r1.xyzw, l(16, 16, 16, 16)\n  bfi r1.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r1.xyzw, r2.xyzw\nendif \nand r2.xyzw, r1.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\nishl r3.xyzw, r1.xyzw, l(16, 16, 16, 16)\nbfi r2.xyzw, l(24, 24, 24, 24), l(0, 0, 0, 0), r2.xyzw, r3.xyzw\nushr r1.xyzw, r1.xyzw, l(16, 16, 16, 16)\nand r1.xyzw, r1.xyzw, l(0x0000ff00, 0x0000ff00, 0x0000ff00, 0x0000ff00)\niadd r1.xyzw, r1.xyzw, r2.xyzw\nstore_raw U0[0].xyzw, r0.z, r1.xyzw\nret \n// Approximately 103 instruction slots used\n#endif\n\nconst BYTE texture_load_gbgr8_grgb8_cs[] =\n{\n     68,  88,  66,  67,   3, 188, \n    145,  82,  20, 216,   0,  97, \n    222, 203, 125, 117,  70,  38, \n    191, 213,   1,   0,   0,   0, \n    124,  18,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n    224,  17,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n    164,  13,   0,   0,  81,   0, \n      5,   0, 105,   3,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   5,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  12,  50,   0,  16,   0, \n      0,   0,   0,   0,   6, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n    194,   0,  16,   0,   0,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0,   6, 132, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  11, \n     66,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,   2,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,  11, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  31,   0, \n      0,   3,  10,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  58, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  42,   0,   2,   0, \n     26,   0,   2,   0,  35,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     41,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  18,   0, \n      0,   1,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,  12, \n    194,   0,  16,   0,   1,   0, \n      0,   0, 166, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0,  42,   0,   0,   9, \n    242,   0,  16,   0,   2,   0, \n      0,   0, 102,   5,   2,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      1,   0,   0,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 139,   0,   0,   8, \n    130,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     27,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10,   0,   2,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  19, 194,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0, 166,   6,   2,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     25,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  87,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0, 138,   0,   0,   9, \n     18,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  20, \n     98,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  11,   0, \n      0,   0,   0,   0,   0,   0, \n    166,  10,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  87,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  64,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    139,   0,   0,  15,  50,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  27,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  18,   0, \n      0,   1,  85,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  42,   0,   0,   9, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  86,   5,   2,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   1,   0,   0,   0, \n      4,   0,   0,   0,   3,   0, \n      0,   0, 139,   0,   0,   8, \n     66,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     27,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10,   0,   2,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  20, 114,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0, 214,   6,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  26,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0, 138,   0,   0,   9, \n     18,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  87,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  10,  66,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  26,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  64,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 139,   0,   0,  15, \n    194,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  27,   0,   0,   0, \n     24,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  21,   0, \n      0,   1,  30,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  32,   0, \n      0,  10, 114,   0,  16,   0, \n      2,   0,   0,   0, 166,  10, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   2,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   2,   0, \n      0,   0, 150,   5,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,  85,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     21,   0,   0,   1,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,  24,   0, \n      0,   0,  24,   0,   0,   0, \n     24,   0,   0,   0,  24,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0,   0,   0, 255, \n      0,   0,   0, 255,   0,   0, \n      0, 255,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     32,   0,   0,   0,  18,   0, \n      0,   1,  54,   0,   0,   5, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0,  21,   0, \n      0,   1,  30,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  21,   0,   0,   1, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     24,   0,   0,   0,  24,   0, \n      0,   0,  24,   0,   0,   0, \n     24,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0, 255,   0,   0, \n      0, 255,   0,   0,   0, 255, \n      0,   0,   0, 255,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     62,   0,   0,   1,  83,  84, \n     65,  84, 148,   0,   0,   0, \n    103,   0,   0,   0,   5,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   0, \n     23,   0,   0,   0,   5,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_gbgr8_rgb8_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 6\ndcl_thread_group 4, 32, 1\nand r0.xy, CB0[0][0].xxxx, l(1, 2, 0, 0)\nishl r1.x, vThreadID.x, l(3)\nmov r1.y, vThreadID.y\nuge r0.zw, r1.xxxy, CB0[0][1].xxxy\nor r0.z, r0.w, r0.z\nif_nz r0.z\n  ret \nendif \nubfe r0.z, l(2), l(2), CB0[0][0].x\nishl r0.w, r1.x, l(3)\nimad r1.y, vThreadID.z, CB0[0][1].y, vThreadID.y\nimad r0.w, r1.y, CB0[0][2].x, r0.w\niadd r0.w, r0.w, CB0[0][1].w\nif_z r0.x\n  imad r1.y, CB0[0][0].w, vThreadID.z, vThreadID.y\n  imad r1.y, CB0[0][0].z, r1.y, r1.x\n  ishl r1.y, r1.y, l(2)\nelse \n  if_nz r0.y\n    ushr r1.zw, CB0[0][0].zzzw, l(0, 0, 5, 4)\n    ishr r2.xyzw, vThreadID.zyyy, l(2, 4, 1, 3)\n    imad r0.y, r2.x, r1.w, r2.y\n    ibfe r1.w, l(27), l(2), vThreadID.x\n    imad r0.y, r0.y, r1.z, r1.w\n    bfi r1.zw, l(0, 0, 2, 1), l(0, 0, 5, 4), vThreadID.zzzy, l(0, 0, 0, 0)\n    bfi r2.y, l(2), l(3), r2.z, l(0)\n    iadd r1.z, r1.z, r2.y\n    bfi r0.y, l(25), l(7), r0.y, r1.z\n    xor r1.z, r2.x, r2.w\n    ubfe r2.x, l(2), l(3), r1.x\n    bfi r2.yz, l(0, 1, 1, 0), l(0, 1, 11, 0), r1.zzzz, l(0, 0, 0, 0)\n    xor r1.z, r2.y, r2.x\n    imad r1.z, r1.z, l(64), r1.w\n    iadd r1.z, r2.z, r1.z\n    ibfe r2.xy, l(27, 24, 0, 0), l(3, 6, 0, 0), r0.yyyy\n    bfi r0.y, l(3), l(8), r2.x, r1.z\n    bfi r1.y, l(20), l(12), r2.y, r0.y\n  else \n    ushr r0.y, CB0[0][0].z, l(5)\n    ishr r2.xyzw, vThreadID.yyyy, l(5, 1, 4, 3)\n    ibfe r1.z, l(27), l(2), vThreadID.x\n    imad r0.y, r2.x, r0.y, r1.z\n    bfi r2.xyz, l(3, 1, 1, 0), l(3, 1, 11, 0), r2.ywzy, l(0, 0, 0, 0)\n    bfi r0.y, l(26), l(6), r0.y, r2.x\n    ubfe r1.x, l(2), l(3), r1.x\n    xor r1.x, r2.y, r1.x\n    bfi r1.z, l(1), l(4), vThreadID.y, l(0)\n    imad r1.x, r1.x, l(64), r1.z\n    iadd r1.x, r2.z, r1.x\n    ibfe r1.zw, l(0, 0, 27, 24), l(0, 0, 3, 6), r0.yyyy\n    bfi r0.y, l(3), l(8), r1.z, r1.x\n    bfi r1.y, l(20), l(12), r1.w, r0.y\n  endif \nendif \niadd r0.y, r1.y, CB0[0][0].y\nld_raw r1.xyzw, r0.y, T0[0].xyzw\nieq r2.xyz, r0.zzzz, l(1, 2, 3, 0)\nor r2.xy, r2.yzyy, r2.xyxx\nif_nz r2.x\n  ishl r3.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r1.xyzw, r3.xyzw, r4.xyzw\nendif \nif_nz r2.y\n  ushr r3.xyzw, r1.xyzw, l(16, 16, 16, 16)\n  bfi r1.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r1.xyzw, r3.xyzw\nendif \nushr r3.xyzw, r1.xyxy, l(24, 24, 8, 8)\nishl r4.xyzw, r1.xxyy, l(8, 8, 8, 8)\nand r4.xyzw, r4.xyzw, l(0x00ff0000, 0x00ff0000, 0x00ff0000, 0x00ff0000)\nimad r4.xyzw, r4.xyzw, l(257, 257, 257, 257), r3.xxyy\nbfi r5.xz, l(8, 0, 8, 0), l(8, 0, 8, 0), r1.xxyx, l(0, 0, 0, 0)\nand r5.yw, r3.zzzw, l(0, 0x0000ff00, 0, 0x0000ff00)\niadd r3.xyzw, r4.xyzw, r5.xyzw\nushr r4.xyzw, r1.zwzw, l(24, 24, 8, 8)\nishl r5.xyzw, r1.zzww, l(8, 8, 8, 8)\nand r5.xyzw, r5.xyzw, l(0x00ff0000, 0x00ff0000, 0x00ff0000, 0x00ff0000)\nimad r5.xyzw, r5.xyzw, l(257, 257, 257, 257), r4.xxyy\nbfi r1.xz, l(8, 0, 8, 0), l(8, 0, 8, 0), r1.zzwz, l(0, 0, 0, 0)\nand r1.yw, r4.zzzw, l(0, 0x0000ff00, 0, 0x0000ff00)\niadd r1.xyzw, r1.xyzw, r5.xyzw\nstore_raw U0[0].xyzw, r0.w, r3.xyzw\niadd r3.xyz, r0.wwww, l(16, 32, 48, 0)\nstore_raw U0[0].xyzw, r3.x, r1.xyzw\nif_nz r0.x\n  mov r0.x, l(32)\nelse \n  mov r0.x, l(16)\nendif \niadd r0.x, r0.x, r0.y\nld_raw r1.xyzw, r0.x, T0[0].xyzw\nif_nz r2.x\n  ishl r4.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r5.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r5.xyzw, r5.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r1.xyzw, r4.xyzw, r5.xyzw\nendif \nif_nz r2.y\n  ushr r2.xyzw, r1.xyzw, l(16, 16, 16, 16)\n  bfi r1.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r1.xyzw, r2.xyzw\nendif \nushr r2.xyzw, r1.xyxy, l(24, 24, 8, 8)\nishl r4.xyzw, r1.xxyy, l(8, 8, 8, 8)\nand r4.xyzw, r4.xyzw, l(0x00ff0000, 0x00ff0000, 0x00ff0000, 0x00ff0000)\nimad r4.xyzw, r4.xyzw, l(257, 257, 257, 257), r2.xxyy\nbfi r5.xz, l(8, 0, 8, 0), l(8, 0, 8, 0), r1.xxyx, l(0, 0, 0, 0)\nand r5.yw, r2.zzzw, l(0, 0x0000ff00, 0, 0x0000ff00)\niadd r2.xyzw, r4.xyzw, r5.xyzw\nushr r4.xyzw, r1.zwzw, l(24, 24, 8, 8)\nishl r5.xyzw, r1.zzww, l(8, 8, 8, 8)\nand r5.xyzw, r5.xyzw, l(0x00ff0000, 0x00ff0000, 0x00ff0000, 0x00ff0000)\nimad r5.xyzw, r5.xyzw, l(257, 257, 257, 257), r4.xxyy\nbfi r1.xz, l(8, 0, 8, 0), l(8, 0, 8, 0), r1.zzwz, l(0, 0, 0, 0)\nand r1.yw, r4.zzzw, l(0, 0x0000ff00, 0, 0x0000ff00)\niadd r1.xyzw, r1.xyzw, r5.xyzw\nstore_raw U0[0].xyzw, r3.y, r2.xyzw\nstore_raw U0[0].xyzw, r3.z, r1.xyzw\nret \n// Approximately 121 instruction slots used\n#endif\n\nconst BYTE texture_load_gbgr8_rgb8_cs[] =\n{\n     68,  88,  66,  67,  27, 173, \n    243, 173, 127,  11, 245, 237, \n    116,  28, 136, 198, 137,  13, \n    166,  85,   1,   0,   0,   0, \n    184,  21,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n     28,  21,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n    224,  16,   0,   0,  81,   0, \n      5,   0,  56,   4,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   6,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  12,  50,   0,  16,   0, \n      0,   0,   0,   0,   6, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n    194,   0,  16,   0,   0,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0,   6, 132, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  11, \n     66,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,   2,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,  11, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  31,   0, \n      0,   3,  10,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  58, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  42,   0,   2,   0, \n     26,   0,   2,   0,  35,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     41,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  18,   0, \n      0,   1,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,  12, \n    194,   0,  16,   0,   1,   0, \n      0,   0, 166, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0,  42,   0,   0,   9, \n    242,   0,  16,   0,   2,   0, \n      0,   0, 102,   5,   2,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      1,   0,   0,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 139,   0,   0,   8, \n    130,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     27,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10,   0,   2,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  19, 194,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0, 166,   6,   2,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     25,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  87,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0, 138,   0,   0,   9, \n     18,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  20, \n     98,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  11,   0, \n      0,   0,   0,   0,   0,   0, \n    166,  10,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  87,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  64,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    139,   0,   0,  15,  50,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  27,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  18,   0, \n      0,   1,  85,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  42,   0,   0,   9, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  86,   5,   2,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   1,   0,   0,   0, \n      4,   0,   0,   0,   3,   0, \n      0,   0, 139,   0,   0,   8, \n     66,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     27,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10,   0,   2,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  20, 114,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0, 214,   6,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  26,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0, 138,   0,   0,   9, \n     18,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  87,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  10,  66,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  26,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  64,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 139,   0,   0,  15, \n    194,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  27,   0,   0,   0, \n     24,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  21,   0, \n      0,   1,  30,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  32,   0, \n      0,  10, 114,   0,  16,   0, \n      2,   0,   0,   0, 166,  10, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   2,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   2,   0, \n      0,   0, 150,   5,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,  85,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     21,   0,   0,   1,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,   4, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  24,   0, \n      0,   0,  24,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,   6,   5,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,  35,   0, \n      0,  12, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   1,   1, \n      0,   0,   1,   1,   0,   0, \n      1,   1,   0,   0,   1,   1, \n      0,   0,   6,   5,  16,   0, \n      3,   0,   0,   0, 140,   0, \n      0,  20,  82,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,   6,   1,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 162,   0, \n     16,   0,   5,   0,   0,   0, \n    166,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0, 255, \n      0,   0,   0,   0,   0,   0, \n      0, 255,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0, 230,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  24,   0,   0,   0, \n     24,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n    166,  15,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,  35,   0,   0,  12, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   1,   1,   0,   0, \n      1,   1,   0,   0,   1,   1, \n      0,   0,   1,   1,   0,   0, \n      6,   5,  16,   0,   4,   0, \n      0,   0, 140,   0,   0,  20, \n     82,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n    166,  11,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 162,   0,  16,   0, \n      1,   0,   0,   0, 166,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0, 255,   0,   0, \n      0,   0,   0,   0,   0, 255, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,   3,   0, \n      0,   0, 246,  15,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     32,   0,   0,   0,  48,   0, \n      0,   0,   0,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     32,   0,   0,   0,  18,   0, \n      0,   1,  54,   0,   0,   5, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0,  21,   0, \n      0,   1,  30,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  21,   0,   0,   1, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,   4,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     24,   0,   0,   0,  24,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,   6,   5, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n     35,   0,   0,  12, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   1,   0,   0,   1,   1, \n      0,   0,   1,   1,   0,   0, \n      1,   1,   0,   0,   6,   5, \n     16,   0,   2,   0,   0,   0, \n    140,   0,   0,  20,  82,   0, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,   6,   1, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    162,   0,  16,   0,   5,   0, \n      0,   0, 166,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0, 255,   0,   0,   0,   0, \n      0,   0,   0, 255,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0, 230,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  24,   0, \n      0,   0,  24,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0, 166,  15,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 255,   0,   0,   0, \n    255,   0,   0,   0, 255,   0, \n      0,   0, 255,   0,  35,   0, \n      0,  12, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   1,   1, \n      0,   0,   1,   1,   0,   0, \n      1,   1,   0,   0,   1,   1, \n      0,   0,   6,   5,  16,   0, \n      4,   0,   0,   0, 140,   0, \n      0,  20,  82,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0, 166,  11,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10, 162,   0, \n     16,   0,   1,   0,   0,   0, \n    166,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0, 255, \n      0,   0,   0,   0,   0,   0, \n      0, 255,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     62,   0,   0,   1,  83,  84, \n     65,  84, 148,   0,   0,   0, \n    121,   0,   0,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  38,   0,   0,   0, \n     29,   0,   0,   0,   5,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_r10g11b11_rgba16_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 6\ndcl_thread_group 4, 32, 1\nand r0.xy, CB0[0][0].xxxx, l(1, 2, 0, 0)\nishl r1.x, vThreadID.x, l(3)\nmov r1.y, vThreadID.y\nuge r0.zw, r1.xxxy, CB0[0][1].xxxy\nor r0.z, r0.w, r0.z\nif_nz r0.z\n  ret \nendif \nubfe r0.z, l(2), l(2), CB0[0][0].x\nishl r0.w, r1.x, l(3)\nimad r1.y, vThreadID.z, CB0[0][1].y, vThreadID.y\nimad r0.w, r1.y, CB0[0][2].x, r0.w\niadd r0.w, r0.w, CB0[0][1].w\nif_z r0.x\n  imad r1.y, CB0[0][0].w, vThreadID.z, vThreadID.y\n  imad r1.y, CB0[0][0].z, r1.y, r1.x\n  ishl r1.y, r1.y, l(2)\nelse \n  if_nz r0.y\n    ushr r1.zw, CB0[0][0].zzzw, l(0, 0, 5, 4)\n    ishr r2.xyzw, vThreadID.zyyy, l(2, 4, 1, 3)\n    imad r0.y, r2.x, r1.w, r2.y\n    ibfe r1.w, l(27), l(2), vThreadID.x\n    imad r0.y, r0.y, r1.z, r1.w\n    bfi r1.zw, l(0, 0, 2, 1), l(0, 0, 5, 4), vThreadID.zzzy, l(0, 0, 0, 0)\n    bfi r2.y, l(2), l(3), r2.z, l(0)\n    iadd r1.z, r1.z, r2.y\n    bfi r0.y, l(25), l(7), r0.y, r1.z\n    xor r1.z, r2.x, r2.w\n    ubfe r2.x, l(2), l(3), r1.x\n    bfi r2.yz, l(0, 1, 1, 0), l(0, 1, 11, 0), r1.zzzz, l(0, 0, 0, 0)\n    xor r1.z, r2.y, r2.x\n    imad r1.z, r1.z, l(64), r1.w\n    iadd r1.z, r2.z, r1.z\n    ibfe r2.xy, l(27, 24, 0, 0), l(3, 6, 0, 0), r0.yyyy\n    bfi r0.y, l(3), l(8), r2.x, r1.z\n    bfi r1.y, l(20), l(12), r2.y, r0.y\n  else \n    ushr r0.y, CB0[0][0].z, l(5)\n    ishr r2.xyzw, vThreadID.yyyy, l(5, 1, 4, 3)\n    ibfe r1.z, l(27), l(2), vThreadID.x\n    imad r0.y, r2.x, r0.y, r1.z\n    bfi r2.xyz, l(3, 1, 1, 0), l(3, 1, 11, 0), r2.ywzy, l(0, 0, 0, 0)\n    bfi r0.y, l(26), l(6), r0.y, r2.x\n    ubfe r1.x, l(2), l(3), r1.x\n    xor r1.x, r2.y, r1.x\n    bfi r1.z, l(1), l(4), vThreadID.y, l(0)\n    imad r1.x, r1.x, l(64), r1.z\n    iadd r1.x, r2.z, r1.x\n    ibfe r1.zw, l(0, 0, 27, 24), l(0, 0, 3, 6), r0.yyyy\n    bfi r0.y, l(3), l(8), r1.z, r1.x\n    bfi r1.y, l(20), l(12), r1.w, r0.y\n  endif \nendif \niadd r0.y, r1.y, CB0[0][0].y\nld_raw r1.xyzw, r0.y, T0[0].zwxy\nieq r2.xyz, r0.zzzz, l(1, 2, 3, 0)\nor r2.xy, r2.yzyy, r2.xyxx\nif_nz r2.x\n  ishl r3.xyzw, r1.zwxy, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r1.zwxy, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r1.xyzw, r3.zwxy, r4.zwxy\nendif \nif_nz r2.y\n  ushr r3.xyzw, r1.zwxy, l(16, 16, 16, 16)\n  bfi r1.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r1.xyzw, r3.zwxy\n  mov r3.xy, r1.zwzz\nelse \n  mov r3.xy, r1.zwzz\nendif \nushr r3.zw, r3.xxxy, l(0, 0, 21, 21)\nbfi r4.xyzw, l(10, 27, 10, 27), l(6, 5, 6, 5), r3.xzyw, l(0, 0, 0, 0)\nubfe r5.xyzw, l(6, 5, 6, 5), l(4, 27, 4, 27), r3.xxyy\niadd r4.xyzw, r4.xyzw, r5.xyzw\nishl r2.zw, r3.xxxy, l(0, 0, 11, 11)\nand r3.xy, r3.xyxx, l(0x001f0000, 0x001f0000, 0, 0)\nbfi r2.zw, l(0, 0, 21, 21), l(0, 0, 0, 0), r3.xxxy, r2.zzzw\niadd r3.xz, r2.zzwz, r4.xxzx\niadd r3.yw, r4.yyyw, l(0, 0xffff0000, 0, 0xffff0000)\nushr r1.zw, r1.xxxy, l(0, 0, 21, 21)\nbfi r4.xyzw, l(10, 27, 10, 27), l(6, 5, 6, 5), r1.xzyw, l(0, 0, 0, 0)\nubfe r5.xyzw, l(6, 5, 6, 5), l(4, 27, 4, 27), r1.xxyy\niadd r4.xyzw, r4.xyzw, r5.xyzw\nishl r1.zw, r1.xxxy, l(0, 0, 11, 11)\nand r1.xy, r1.xyxx, l(0x001f0000, 0x001f0000, 0, 0)\nbfi r1.xy, l(21, 21, 0, 0), l(0, 0, 0, 0), r1.xyxx, r1.zwzz\niadd r1.xz, r1.xxyx, r4.xxzx\niadd r1.yw, r4.yyyw, l(0, 0xffff0000, 0, 0xffff0000)\nstore_raw U0[0].xyzw, r0.w, r3.xyzw\niadd r3.xyz, r0.wwww, l(16, 32, 48, 0)\nstore_raw U0[0].xyzw, r3.x, r1.xyzw\nif_nz r0.x\n  mov r0.x, l(32)\nelse \n  mov r0.x, l(16)\nendif \niadd r0.x, r0.x, r0.y\nld_raw r1.xyzw, r0.x, T0[0].zwxy\nif_nz r2.x\n  ishl r4.xyzw, r1.zwxy, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r5.xyzw, r1.zwxy, l(8, 8, 8, 8)\n  and r5.xyzw, r5.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r1.xyzw, r4.zwxy, r5.zwxy\nendif \nif_nz r2.y\n  ushr r2.xyzw, r1.zwxy, l(16, 16, 16, 16)\n  bfi r1.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r1.xyzw, r2.zwxy\n  mov r2.xy, r1.zwzz\nelse \n  mov r2.xy, r1.zwzz\nendif \nushr r2.zw, r2.xxxy, l(0, 0, 21, 21)\nbfi r4.xyzw, l(10, 27, 10, 27), l(6, 5, 6, 5), r2.xzyw, l(0, 0, 0, 0)\nubfe r5.xyzw, l(6, 5, 6, 5), l(4, 27, 4, 27), r2.xxyy\niadd r4.xyzw, r4.xyzw, r5.xyzw\nishl r0.xy, r2.xyxx, l(11, 11, 0, 0)\nand r2.xy, r2.xyxx, l(0x001f0000, 0x001f0000, 0, 0)\nbfi r0.xy, l(21, 21, 0, 0), l(0, 0, 0, 0), r2.xyxx, r0.xyxx\niadd r2.xz, r0.xxyx, r4.xxzx\niadd r2.yw, r4.yyyw, l(0, 0xffff0000, 0, 0xffff0000)\nushr r1.zw, r1.xxxy, l(0, 0, 21, 21)\nbfi r4.xyzw, l(10, 27, 10, 27), l(6, 5, 6, 5), r1.xzyw, l(0, 0, 0, 0)\nubfe r5.xyzw, l(6, 5, 6, 5), l(4, 27, 4, 27), r1.xxyy\niadd r4.xyzw, r4.xyzw, r5.xyzw\nishl r0.xy, r1.xyxx, l(11, 11, 0, 0)\nand r1.xy, r1.xyxx, l(0x001f0000, 0x001f0000, 0, 0)\nbfi r0.xy, l(21, 21, 0, 0), l(0, 0, 0, 0), r1.xyxx, r0.xyxx\niadd r1.xz, r0.xxyx, r4.xxzx\niadd r1.yw, r4.yyyw, l(0, 0xffff0000, 0, 0xffff0000)\nstore_raw U0[0].xyzw, r3.y, r2.xyzw\nstore_raw U0[0].xyzw, r3.z, r1.xyzw\nret \n// Approximately 135 instruction slots used\n#endif\n\nconst BYTE texture_load_r10g11b11_rgba16_cs[] =\n{\n     68,  88,  66,  67,  90,  61, \n     31,  28, 255,  46, 208,  86, \n    117,  57,  17, 180, 121,   2, \n     29, 196,   1,   0,   0,   0, \n    192,  23,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n     36,  23,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n    232,  18,   0,   0,  81,   0, \n      5,   0, 186,   4,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   6,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  12,  50,   0,  16,   0, \n      0,   0,   0,   0,   6, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n    194,   0,  16,   0,   0,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0,   6, 132, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  11, \n     66,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,   2,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,  11, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  31,   0, \n      0,   3,  10,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  58, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  42,   0,   2,   0, \n     26,   0,   2,   0,  35,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     41,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  18,   0, \n      0,   1,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,  12, \n    194,   0,  16,   0,   1,   0, \n      0,   0, 166, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0,  42,   0,   0,   9, \n    242,   0,  16,   0,   2,   0, \n      0,   0, 102,   5,   2,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      1,   0,   0,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 139,   0,   0,   8, \n    130,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     27,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10,   0,   2,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  19, 194,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0, 166,   6,   2,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     25,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  87,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0, 138,   0,   0,   9, \n     18,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  20, \n     98,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  11,   0, \n      0,   0,   0,   0,   0,   0, \n    166,  10,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  87,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  64,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    139,   0,   0,  15,  50,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  27,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  18,   0, \n      0,   1,  85,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  42,   0,   0,   9, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  86,   5,   2,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   1,   0,   0,   0, \n      4,   0,   0,   0,   3,   0, \n      0,   0, 139,   0,   0,   8, \n     66,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     27,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10,   0,   2,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  20, 114,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0, 214,   6,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  26,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0, 138,   0,   0,   9, \n     18,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  87,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  10,  66,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  26,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  64,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 139,   0,   0,  15, \n    194,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  27,   0,   0,   0, \n     24,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  21,   0, \n      0,   1,  30,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0, 230, 116, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  32,   0, \n      0,  10, 114,   0,  16,   0, \n      2,   0,   0,   0, 166,  10, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   2,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   2,   0, \n      0,   0, 150,   5,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n    230,   4,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,  85,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0, 230,   4,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      1,   0,   0,   0, 230,   4, \n     16,   0,   3,   0,   0,   0, \n    230,   4,  16,   0,   4,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n    230,   4,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0, 230,   4, \n     16,   0,   3,   0,   0,   0, \n     54,   0,   0,   5,  50,   0, \n     16,   0,   3,   0,   0,   0, \n    230,  10,  16,   0,   1,   0, \n      0,   0,  18,   0,   0,   1, \n     54,   0,   0,   5,  50,   0, \n     16,   0,   3,   0,   0,   0, \n    230,  10,  16,   0,   1,   0, \n      0,   0,  21,   0,   0,   1, \n     85,   0,   0,  10, 194,   0, \n     16,   0,   3,   0,   0,   0, \n      6,   4,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   0, \n     21,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     27,   0,   0,   0,  10,   0, \n      0,   0,  27,   0,   0,   0, \n      2,  64,   0,   0,   6,   0, \n      0,   0,   5,   0,   0,   0, \n      6,   0,   0,   0,   5,   0, \n      0,   0, 134,  13,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   6,   0, \n      0,   0,   5,   0,   0,   0, \n      6,   0,   0,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,  27,   0, \n      0,   0,   4,   0,   0,   0, \n     27,   0,   0,   0,   6,   5, \n     16,   0,   3,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  41,   0, \n      0,  10, 194,   0,  16,   0, \n      2,   0,   0,   0,   6,   4, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     11,   0,   0,   0,  11,   0, \n      0,   0,   1,   0,   0,  10, \n     50,   0,  16,   0,   3,   0, \n      0,   0,  70,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,  31,   0, \n      0,   0,  31,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  17, 194,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     21,   0,   0,   0,  21,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   6,   4, \n     16,   0,   3,   0,   0,   0, \n    166,  14,  16,   0,   2,   0, \n      0,   0,  30,   0,   0,   7, \n     82,   0,  16,   0,   3,   0, \n      0,   0, 166,  11,  16,   0, \n      2,   0,   0,   0,   6,   2, \n     16,   0,   4,   0,   0,   0, \n     30,   0,   0,  10, 162,   0, \n     16,   0,   3,   0,   0,   0, \n     86,  13,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    255, 255,   0,   0,   0,   0, \n      0,   0, 255, 255,  85,   0, \n      0,  10, 194,   0,  16,   0, \n      1,   0,   0,   0,   6,   4, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     21,   0,   0,   0,  21,   0, \n      0,   0, 140,   0,   0,  20, \n    242,   0,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  27,   0, \n      0,   0,  10,   0,   0,   0, \n     27,   0,   0,   0,   2,  64, \n      0,   0,   6,   0,   0,   0, \n      5,   0,   0,   0,   6,   0, \n      0,   0,   5,   0,   0,   0, \n    134,  13,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   6,   0,   0,   0, \n      5,   0,   0,   0,   6,   0, \n      0,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   4,   0, \n      0,   0,  27,   0,   0,   0, \n      4,   0,   0,   0,  27,   0, \n      0,   0,   6,   5,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  41,   0,   0,  10, \n    194,   0,  16,   0,   1,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  11,   0, \n      0,   0,  11,   0,   0,   0, \n      1,   0,   0,  10,  50,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,  31,   0,   0,   0, \n     31,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  17,  50,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  21,   0,   0,   0, \n     21,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0, 230,  10, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7,  82,   0, \n     16,   0,   1,   0,   0,   0, \n      6,   1,  16,   0,   1,   0, \n      0,   0,   6,   2,  16,   0, \n      4,   0,   0,   0,  30,   0, \n      0,  10, 162,   0,  16,   0, \n      1,   0,   0,   0,  86,  13, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0, 255, 255, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  30,   0, \n      0,  10, 114,   0,  16,   0, \n      3,   0,   0,   0, 246,  15, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  32,   0,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  31,   0, \n      4,   3,  10,   0,  16,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  32,   0,   0,   0, \n     18,   0,   0,   1,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n     21,   0,   0,   1,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0, 230, 116, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  31,   0, \n      4,   3,  10,   0,  16,   0, \n      2,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0, 230,   4, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n    230,   4,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   1,   0, \n      0,   0, 230,   4,  16,   0, \n      4,   0,   0,   0, 230,   4, \n     16,   0,   5,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      2,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0, 230,   4, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0, 230,   4,  16,   0, \n      2,   0,   0,   0,  54,   0, \n      0,   5,  50,   0,  16,   0, \n      2,   0,   0,   0, 230,  10, \n     16,   0,   1,   0,   0,   0, \n     18,   0,   0,   1,  54,   0, \n      0,   5,  50,   0,  16,   0, \n      2,   0,   0,   0, 230,  10, \n     16,   0,   1,   0,   0,   0, \n     21,   0,   0,   1,  85,   0, \n      0,  10, 194,   0,  16,   0, \n      2,   0,   0,   0,   6,   4, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     21,   0,   0,   0,  21,   0, \n      0,   0, 140,   0,   0,  20, \n    242,   0,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  27,   0, \n      0,   0,  10,   0,   0,   0, \n     27,   0,   0,   0,   2,  64, \n      0,   0,   6,   0,   0,   0, \n      5,   0,   0,   0,   6,   0, \n      0,   0,   5,   0,   0,   0, \n    134,  13,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   6,   0,   0,   0, \n      5,   0,   0,   0,   6,   0, \n      0,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   4,   0, \n      0,   0,  27,   0,   0,   0, \n      4,   0,   0,   0,  27,   0, \n      0,   0,   6,   5,  16,   0, \n      2,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  41,   0,   0,  10, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  11,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10,  50,   0, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,  31,   0,   0,   0, \n     31,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  17,  50,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,  21,   0,   0,   0, \n     21,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  82,   0, \n     16,   0,   2,   0,   0,   0, \n      6,   1,  16,   0,   0,   0, \n      0,   0,   6,   2,  16,   0, \n      4,   0,   0,   0,  30,   0, \n      0,  10, 162,   0,  16,   0, \n      2,   0,   0,   0,  86,  13, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0, 255, 255, \n      0,   0,   0,   0,   0,   0, \n    255, 255,  85,   0,   0,  10, \n    194,   0,  16,   0,   1,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   0,  21,   0,   0,   0, \n    140,   0,   0,  20, 242,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  27,   0,   0,   0, \n     10,   0,   0,   0,  27,   0, \n      0,   0,   2,  64,   0,   0, \n      6,   0,   0,   0,   5,   0, \n      0,   0,   6,   0,   0,   0, \n      5,   0,   0,   0, 134,  13, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      6,   0,   0,   0,   5,   0, \n      0,   0,   6,   0,   0,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   4,   0,   0,   0, \n     27,   0,   0,   0,   4,   0, \n      0,   0,  27,   0,   0,   0, \n      6,   5,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     41,   0,   0,  10,  50,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     11,   0,   0,   0,  11,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10,  50,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n     31,   0,   0,   0,  31,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  17, \n     50,   0,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n     21,   0,   0,   0,  21,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  82,   0,  16,   0, \n      1,   0,   0,   0,   6,   1, \n     16,   0,   0,   0,   0,   0, \n      6,   2,  16,   0,   4,   0, \n      0,   0,  30,   0,   0,  10, \n    162,   0,  16,   0,   1,   0, \n      0,   0,  86,  13,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 255, 255,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  62,   0, \n      0,   1,  83,  84,  65,  84, \n    148,   0,   0,   0, 135,   0, \n      0,   0,   6,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     42,   0,   0,   0,  25,   0, \n      0,   0,   7,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   4,   0, \n      0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_r10g11b11_rgba16_scaled_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 6\ndcl_thread_group 4, 32, 1\nand r0.x, CB0[0][0].x, l(2)\nishl r1.x, vThreadID.x, l(3)\nmov r1.y, vThreadID.y\nuge r0.yz, r1.xxyx, CB0[0][1].xxyx\nor r0.y, r0.z, r0.y\nif_nz r0.y\n  ret \nendif \nubfe r0.yzw, l(0, 2, 3, 3), l(0, 2, 4, 7), CB0[0][0].xxxx\nishl r1.z, r1.x, l(3)\nimad r1.w, vThreadID.z, CB0[0][1].y, vThreadID.y\nimad r1.z, r1.w, CB0[0][2].x, r1.z\niadd r1.z, r1.z, CB0[0][1].w\nushr r1.yw, r1.xxxy, l(0, 4, 0, 1)\nudiv r2.xyzw, null, r1.wyww, r0.wzww\nimad r1.yw, -r0.zzzw, r2.yyyw, r1.yyyw\nishl r3.x, r2.y, l(4)\nimad r1.y, r1.y, r0.w, r1.w\nbfi r1.w, l(1), l(6), vThreadID.y, l(0)\nbfi r1.y, l(25), l(7), r1.y, r1.w\nbfi r1.x, l(4), l(2), r1.x, l(0)\niadd r1.x, r1.y, r1.x\nif_nz r0.x\n  ushr r1.yw, CB0[0][0].zzzw, l(0, 5, 0, 4)\n  ishr r0.x, vThreadID.z, l(2)\n  ibfe r4.xyzw, l(28, 27, 31, 29), l(3, 1, 0, 2), r2.wyww\n  imad r1.w, r0.x, r1.w, r4.x\n  imad r1.y, r1.w, r1.y, r4.y\n  bfi r1.w, l(2), l(5), vThreadID.z, l(0)\n  bfi r3.y, l(2), l(3), r4.z, l(0)\n  iadd r1.w, r1.w, r3.y\n  bfi r1.y, l(25), l(7), r1.y, r1.w\n  xor r0.x, r0.x, r4.w\n  ishr r1.w, r3.x, l(3)\n  and r1.w, r1.w, l(2)\n  bfi r3.yz, l(0, 1, 1, 0), l(0, 1, 11, 0), r0.xxxx, l(0, 0, 0, 0)\n  xor r0.x, r1.w, r3.y\n  ishl r0.x, r0.x, l(6)\n  iadd r0.x, r3.z, r0.x\n  ibfe r1.yw, l(0, 27, 0, 24), l(0, 3, 0, 6), r1.yyyy\n  bfi r0.x, l(3), l(8), r1.y, r0.x\n  bfi r0.x, l(20), l(12), r1.w, r0.x\nelse \n  ushr r1.y, CB0[0][0].z, l(5)\n  ibfe r4.xyzw, l(27, 27, 31, 28), l(4, 1, 0, 3), r2.xyzw\n  imad r1.y, r4.x, r1.y, r4.y\n  bfi r2.xy, l(3, 1, 0, 0), l(3, 11, 0, 0), r4.zwzz, l(0, 0, 0, 0)\n  bfi r1.y, l(26), l(6), r1.y, r2.x\n  ishr r1.w, r3.x, l(3)\n  and r1.w, r1.w, l(2)\n  ibfe r2.x, l(29), l(2), r2.w\n  bfi r2.x, l(1), l(1), r2.x, l(0)\n  xor r1.w, r1.w, r2.x\n  ishl r1.w, r1.w, l(6)\n  iadd r1.w, r2.y, r1.w\n  ibfe r2.xy, l(27, 24, 0, 0), l(3, 6, 0, 0), r1.yyyy\n  bfi r1.y, l(3), l(8), r2.x, r1.w\n  bfi r0.x, l(20), l(12), r2.y, r1.y\nendif \nimul null, r0.z, r0.w, r0.z\nimad r0.x, r0.x, r0.z, r1.x\niadd r0.x, r0.x, CB0[0][0].y\nld_raw r2.xyzw, r0.x, T0[0].zwxy\nieq r0.yzw, r0.yyyy, l(0, 1, 2, 3)\nor r0.yz, r0.zzwz, r0.yyzy\nif_nz r0.y\n  ishl r3.xyzw, r2.zwxy, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r2.zwxy, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r2.xyzw, r3.zwxy, r4.zwxy\nendif \nif_nz r0.z\n  ushr r3.xyzw, r2.zwxy, l(16, 16, 16, 16)\n  bfi r2.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r2.xyzw, r3.zwxy\n  mov r3.xy, r2.zwzz\nelse \n  mov r3.xy, r2.zwzz\nendif \nushr r3.zw, r3.xxxy, l(0, 0, 21, 21)\nbfi r4.xyzw, l(10, 27, 10, 27), l(6, 5, 6, 5), r3.xzyw, l(0, 0, 0, 0)\nubfe r5.xyzw, l(6, 5, 6, 5), l(4, 27, 4, 27), r3.xxyy\niadd r4.xyzw, r4.xyzw, r5.xyzw\nishl r1.xy, r3.xyxx, l(11, 11, 0, 0)\nand r3.xy, r3.xyxx, l(0x001f0000, 0x001f0000, 0, 0)\nbfi r1.xy, l(21, 21, 0, 0), l(0, 0, 0, 0), r3.xyxx, r1.xyxx\niadd r3.xz, r1.xxyx, r4.xxzx\niadd r3.yw, r4.yyyw, l(0, 0xffff0000, 0, 0xffff0000)\nushr r2.zw, r2.xxxy, l(0, 0, 21, 21)\nbfi r4.xyzw, l(10, 27, 10, 27), l(6, 5, 6, 5), r2.xzyw, l(0, 0, 0, 0)\nubfe r5.xyzw, l(6, 5, 6, 5), l(4, 27, 4, 27), r2.xxyy\niadd r4.xyzw, r4.xyzw, r5.xyzw\nishl r1.xy, r2.xyxx, l(11, 11, 0, 0)\nand r2.xy, r2.xyxx, l(0x001f0000, 0x001f0000, 0, 0)\nbfi r1.xy, l(21, 21, 0, 0), l(0, 0, 0, 0), r2.xyxx, r1.xyxx\niadd r2.xz, r1.xxyx, r4.xxzx\niadd r2.yw, r4.yyyw, l(0, 0xffff0000, 0, 0xffff0000)\nstore_raw U0[0].xyzw, r1.z, r3.xyzw\niadd r1.xyw, r1.zzzz, l(16, 32, 0, 48)\nstore_raw U0[0].xyzw, r1.x, r2.xyzw\niadd r0.x, r0.x, l(16)\nld_raw r2.xyzw, r0.x, T0[0].zwxy\nif_nz r0.y\n  ishl r3.xyzw, r2.zwxy, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r2.zwxy, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r2.xyzw, r3.zwxy, r4.zwxy\nendif \nif_nz r0.z\n  ushr r0.xyzw, r2.zwxy, l(16, 16, 16, 16)\n  bfi r2.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r2.xyzw, r0.zwxy\n  mov r0.xy, r2.zwzz\nelse \n  mov r0.xy, r2.zwzz\nendif \nushr r0.zw, r0.xxxy, l(0, 0, 21, 21)\nbfi r3.xyzw, l(10, 27, 10, 27), l(6, 5, 6, 5), r0.xzyw, l(0, 0, 0, 0)\nubfe r4.xyzw, l(6, 5, 6, 5), l(4, 27, 4, 27), r0.xxyy\niadd r3.xyzw, r3.xyzw, r4.xyzw\nishl r0.zw, r0.xxxy, l(0, 0, 11, 11)\nand r0.xy, r0.xyxx, l(0x001f0000, 0x001f0000, 0, 0)\nbfi r0.xy, l(21, 21, 0, 0), l(0, 0, 0, 0), r0.xyxx, r0.zwzz\niadd r0.xz, r0.xxyx, r3.xxzx\niadd r0.yw, r3.yyyw, l(0, 0xffff0000, 0, 0xffff0000)\nushr r2.zw, r2.xxxy, l(0, 0, 21, 21)\nbfi r3.xyzw, l(10, 27, 10, 27), l(6, 5, 6, 5), r2.xzyw, l(0, 0, 0, 0)\nubfe r4.xyzw, l(6, 5, 6, 5), l(4, 27, 4, 27), r2.xxyy\niadd r3.xyzw, r3.xyzw, r4.xyzw\nishl r2.zw, r2.xxxy, l(0, 0, 11, 11)\nand r2.xy, r2.xyxx, l(0x001f0000, 0x001f0000, 0, 0)\nbfi r2.xy, l(21, 21, 0, 0), l(0, 0, 0, 0), r2.xyxx, r2.zwzz\niadd r2.xz, r2.xxyx, r3.xxzx\niadd r2.yw, r3.yyyw, l(0, 0xffff0000, 0, 0xffff0000)\nstore_raw U0[0].xyzw, r1.y, r0.xyzw\nstore_raw U0[0].xyzw, r1.w, r2.xyzw\nret \n// Approximately 137 instruction slots used\n#endif\n\nconst BYTE texture_load_r10g11b11_rgba16_scaled_cs[] =\n{\n     68,  88,  66,  67, 244, 229, \n    185,   5,  30, 212, 219, 165, \n     62, 152, 120,  10,  93, 144, \n     55,  93,   1,   0,   0,   0, \n    196,  24,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n     40,  24,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n    236,  19,   0,   0,  81,   0, \n      5,   0, 251,   4,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   6,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n     98,   0,  16,   0,   0,   0, \n      0,   0,   6,   1,  16,   0, \n      1,   0,   0,   0,   6, 129, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  17, \n    226,   0,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   7,   0,   0,   0, \n      6, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,   2,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,  11, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   9,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  85,   0, \n      0,  10, 162,   0,  16,   0, \n      1,   0,   0,   0,   6,   4, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  78,   0,   0,   8, \n    242,   0,  16,   0,   2,   0, \n      0,   0,   0, 208,   0,   0, \n    118,  15,  16,   0,   1,   0, \n      0,   0, 182,  15,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,  10, 162,   0,  16,   0, \n      1,   0,   0,   0, 166,  14, \n     16, 128,  65,   0,   0,   0, \n      0,   0,   0,   0,  86,  13, \n     16,   0,   2,   0,   0,   0, \n     86,  13,  16,   0,   1,   0, \n      0,   0,  41,   0,   0,   7, \n     18,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  10, 130,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  26,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  25,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  18,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     85,   0,   0,  12, 162,   0, \n     16,   0,   1,   0,   0,   0, \n    166, 142,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n     42,   0,   0,   6,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,   2,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n    139,   0,   0,  15, 242,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,  28,   0, \n      0,   0,  27,   0,   0,   0, \n     31,   0,   0,   0,  29,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0, 118,  15, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,   9, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n    140,   0,   0,  10, 130,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  42,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      4,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  25,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     87,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,  42,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n    140,   0,   0,  20,  98,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0,   6,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n     41,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0, 139,   0,   0,  15, \n    162,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  27,   0, \n      0,   0,   0,   0,   0,   0, \n     24,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   6,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     18,   0,   0,   1,  85,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0, 139,   0, \n      0,  15, 242,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,  27,   0,   0,   0, \n     27,   0,   0,   0,  31,   0, \n      0,   0,  28,   0,   0,   0, \n      2,  64,   0,   0,   4,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      4,   0,   0,   0, 140,   0, \n      0,  20,  50,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 230,  10,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  26,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0, 139,   0, \n      0,   9,  18,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,  29,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  30,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n    139,   0,   0,  15,  50,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  27,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  21,   0, \n      0,   1,  38,   0,   0,   8, \n      0, 208,   0,   0,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n    230, 116,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     32,   0,   0,  10, 226,   0, \n     16,   0,   0,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   2,   0,   0,   0, \n      3,   0,   0,   0,  60,   0, \n      0,   7,  98,   0,  16,   0, \n      0,   0,   0,   0, 166,  11, \n     16,   0,   0,   0,   0,   0, \n     86,   6,  16,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0, 230,   4,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0, 230,   4, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   2,   0,   0,   0, \n    230,   4,  16,   0,   3,   0, \n      0,   0, 230,   4,  16,   0, \n      4,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0, 230,   4,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n    230,   4,  16,   0,   3,   0, \n      0,   0,  54,   0,   0,   5, \n     50,   0,  16,   0,   3,   0, \n      0,   0, 230,  10,  16,   0, \n      2,   0,   0,   0,  18,   0, \n      0,   1,  54,   0,   0,   5, \n     50,   0,  16,   0,   3,   0, \n      0,   0, 230,  10,  16,   0, \n      2,   0,   0,   0,  21,   0, \n      0,   1,  85,   0,   0,  10, \n    194,   0,  16,   0,   3,   0, \n      0,   0,   6,   4,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   0,  21,   0,   0,   0, \n    140,   0,   0,  20, 242,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  27,   0,   0,   0, \n     10,   0,   0,   0,  27,   0, \n      0,   0,   2,  64,   0,   0, \n      6,   0,   0,   0,   5,   0, \n      0,   0,   6,   0,   0,   0, \n      5,   0,   0,   0, 134,  13, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      6,   0,   0,   0,   5,   0, \n      0,   0,   6,   0,   0,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   4,   0,   0,   0, \n     27,   0,   0,   0,   4,   0, \n      0,   0,  27,   0,   0,   0, \n      6,   5,  16,   0,   3,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     41,   0,   0,  10,  50,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n     11,   0,   0,   0,  11,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10,  50,   0,  16,   0, \n      3,   0,   0,   0,  70,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n     31,   0,   0,   0,  31,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  17, \n     50,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     21,   0,   0,   0,  21,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   3,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  82,   0,  16,   0, \n      3,   0,   0,   0,   6,   1, \n     16,   0,   1,   0,   0,   0, \n      6,   2,  16,   0,   4,   0, \n      0,   0,  30,   0,   0,  10, \n    162,   0,  16,   0,   3,   0, \n      0,   0,  86,  13,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 255, 255,   0,   0, \n      0,   0,   0,   0, 255, 255, \n     85,   0,   0,  10, 194,   0, \n     16,   0,   2,   0,   0,   0, \n      6,   4,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   0, \n     21,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     27,   0,   0,   0,  10,   0, \n      0,   0,  27,   0,   0,   0, \n      2,  64,   0,   0,   6,   0, \n      0,   0,   5,   0,   0,   0, \n      6,   0,   0,   0,   5,   0, \n      0,   0, 134,  13,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   6,   0, \n      0,   0,   5,   0,   0,   0, \n      6,   0,   0,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,  27,   0, \n      0,   0,   4,   0,   0,   0, \n     27,   0,   0,   0,   6,   5, \n     16,   0,   2,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  41,   0, \n      0,  10,  50,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  11,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n     50,   0,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,  31,   0, \n      0,   0,  31,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  17,  50,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  21,   0, \n      0,   0,  21,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     82,   0,  16,   0,   2,   0, \n      0,   0,   6,   1,  16,   0, \n      1,   0,   0,   0,   6,   2, \n     16,   0,   4,   0,   0,   0, \n     30,   0,   0,  10, 162,   0, \n     16,   0,   2,   0,   0,   0, \n     86,  13,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    255, 255,   0,   0,   0,   0, \n      0,   0, 255, 255, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     30,   0,   0,  10, 178,   0, \n     16,   0,   1,   0,   0,   0, \n    166,  10,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  32,   0, \n      0,   0,   0,   0,   0,   0, \n     48,   0,   0,   0, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     30,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n    230, 116,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n    230,   4,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,  85,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0, 230,   4,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      2,   0,   0,   0, 230,   4, \n     16,   0,   3,   0,   0,   0, \n    230,   4,  16,   0,   4,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   0,   0,   0,   0, \n    230,   4,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0, 230,   4, \n     16,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  50,   0, \n     16,   0,   0,   0,   0,   0, \n    230,  10,  16,   0,   2,   0, \n      0,   0,  18,   0,   0,   1, \n     54,   0,   0,   5,  50,   0, \n     16,   0,   0,   0,   0,   0, \n    230,  10,  16,   0,   2,   0, \n      0,   0,  21,   0,   0,   1, \n     85,   0,   0,  10, 194,   0, \n     16,   0,   0,   0,   0,   0, \n      6,   4,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   0, \n     21,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     27,   0,   0,   0,  10,   0, \n      0,   0,  27,   0,   0,   0, \n      2,  64,   0,   0,   6,   0, \n      0,   0,   5,   0,   0,   0, \n      6,   0,   0,   0,   5,   0, \n      0,   0, 134,  13,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   6,   0, \n      0,   0,   5,   0,   0,   0, \n      6,   0,   0,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,  27,   0, \n      0,   0,   4,   0,   0,   0, \n     27,   0,   0,   0,   6,   5, \n     16,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  41,   0, \n      0,  10, 194,   0,  16,   0, \n      0,   0,   0,   0,   6,   4, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     11,   0,   0,   0,  11,   0, \n      0,   0,   1,   0,   0,  10, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,  31,   0, \n      0,   0,  31,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  17,  50,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,  21,   0, \n      0,   0,  21,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n    230,  10,  16,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     82,   0,  16,   0,   0,   0, \n      0,   0,   6,   1,  16,   0, \n      0,   0,   0,   0,   6,   2, \n     16,   0,   3,   0,   0,   0, \n     30,   0,   0,  10, 162,   0, \n     16,   0,   0,   0,   0,   0, \n     86,  13,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    255, 255,   0,   0,   0,   0, \n      0,   0, 255, 255,  85,   0, \n      0,  10, 194,   0,  16,   0, \n      2,   0,   0,   0,   6,   4, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     21,   0,   0,   0,  21,   0, \n      0,   0, 140,   0,   0,  20, \n    242,   0,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  27,   0, \n      0,   0,  10,   0,   0,   0, \n     27,   0,   0,   0,   2,  64, \n      0,   0,   6,   0,   0,   0, \n      5,   0,   0,   0,   6,   0, \n      0,   0,   5,   0,   0,   0, \n    134,  13,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   6,   0,   0,   0, \n      5,   0,   0,   0,   6,   0, \n      0,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   4,   0, \n      0,   0,  27,   0,   0,   0, \n      4,   0,   0,   0,  27,   0, \n      0,   0,   6,   5,  16,   0, \n      2,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  41,   0,   0,  10, \n    194,   0,  16,   0,   2,   0, \n      0,   0,   6,   4,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  11,   0, \n      0,   0,  11,   0,   0,   0, \n      1,   0,   0,  10,  50,   0, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,  31,   0,   0,   0, \n     31,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  17,  50,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  21,   0,   0,   0, \n     21,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0, 230,  10, \n     16,   0,   2,   0,   0,   0, \n     30,   0,   0,   7,  82,   0, \n     16,   0,   2,   0,   0,   0, \n      6,   1,  16,   0,   2,   0, \n      0,   0,   6,   2,  16,   0, \n      3,   0,   0,   0,  30,   0, \n      0,  10, 162,   0,  16,   0, \n      2,   0,   0,   0,  86,  13, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0, 255, 255, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      0,   0,   0,   0, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     62,   0,   0,   1,  83,  84, \n     65,  84, 148,   0,   0,   0, \n    137,   0,   0,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  46,   0,   0,   0, \n     29,   0,   0,   0,   5,   0, \n      0,   0,   6,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   5,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_r10g11b11_rgba16_snorm_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 6\ndcl_thread_group 4, 32, 1\nand r0.xy, CB0[0][0].xxxx, l(1, 2, 0, 0)\nishl r1.x, vThreadID.x, l(3)\nmov r1.y, vThreadID.y\nuge r0.zw, r1.xxxy, CB0[0][1].xxxy\nor r0.z, r0.w, r0.z\nif_nz r0.z\n  ret \nendif \nubfe r0.z, l(2), l(2), CB0[0][0].x\nishl r0.w, r1.x, l(3)\nimad r1.y, vThreadID.z, CB0[0][1].y, vThreadID.y\nimad r0.w, r1.y, CB0[0][2].x, r0.w\niadd r0.w, r0.w, CB0[0][1].w\nif_z r0.x\n  imad r1.y, CB0[0][0].w, vThreadID.z, vThreadID.y\n  imad r1.y, CB0[0][0].z, r1.y, r1.x\n  ishl r1.y, r1.y, l(2)\nelse \n  if_nz r0.y\n    ushr r1.zw, CB0[0][0].zzzw, l(0, 0, 5, 4)\n    ishr r2.xyzw, vThreadID.zyyy, l(2, 4, 1, 3)\n    imad r0.y, r2.x, r1.w, r2.y\n    ibfe r1.w, l(27), l(2), vThreadID.x\n    imad r0.y, r0.y, r1.z, r1.w\n    bfi r1.zw, l(0, 0, 2, 1), l(0, 0, 5, 4), vThreadID.zzzy, l(0, 0, 0, 0)\n    bfi r2.y, l(2), l(3), r2.z, l(0)\n    iadd r1.z, r1.z, r2.y\n    bfi r0.y, l(25), l(7), r0.y, r1.z\n    xor r1.z, r2.x, r2.w\n    ubfe r2.x, l(2), l(3), r1.x\n    bfi r2.yz, l(0, 1, 1, 0), l(0, 1, 11, 0), r1.zzzz, l(0, 0, 0, 0)\n    xor r1.z, r2.y, r2.x\n    imad r1.z, r1.z, l(64), r1.w\n    iadd r1.z, r2.z, r1.z\n    ibfe r2.xy, l(27, 24, 0, 0), l(3, 6, 0, 0), r0.yyyy\n    bfi r0.y, l(3), l(8), r2.x, r1.z\n    bfi r1.y, l(20), l(12), r2.y, r0.y\n  else \n    ushr r0.y, CB0[0][0].z, l(5)\n    ishr r2.xyzw, vThreadID.yyyy, l(5, 1, 4, 3)\n    ibfe r1.z, l(27), l(2), vThreadID.x\n    imad r0.y, r2.x, r0.y, r1.z\n    bfi r2.xyz, l(3, 1, 1, 0), l(3, 1, 11, 0), r2.ywzy, l(0, 0, 0, 0)\n    bfi r0.y, l(26), l(6), r0.y, r2.x\n    ubfe r1.x, l(2), l(3), r1.x\n    xor r1.x, r2.y, r1.x\n    bfi r1.z, l(1), l(4), vThreadID.y, l(0)\n    imad r1.x, r1.x, l(64), r1.z\n    iadd r1.x, r2.z, r1.x\n    ibfe r1.zw, l(0, 0, 27, 24), l(0, 0, 3, 6), r0.yyyy\n    bfi r0.y, l(3), l(8), r1.z, r1.x\n    bfi r1.y, l(20), l(12), r1.w, r0.y\n  endif \nendif \niadd r0.y, r1.y, CB0[0][0].y\nld_raw r1.xyzw, r0.y, T0[0].xyzw\nieq r2.xyz, r0.zzzz, l(1, 2, 3, 0)\nor r2.xy, r2.yzyy, r2.xyxx\nif_nz r2.x\n  ishl r3.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r1.xyzw, r3.xyzw, r4.xyzw\nendif \nif_nz r2.y\n  ushr r3.xyzw, r1.xyzw, l(16, 16, 16, 16)\n  bfi r1.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r1.xyzw, r3.xyzw\nendif \nand r2.zw, r1.xxxy, l(0, 0, 1023, 1023)\nubfe r3.xyzw, l(1, 1, 11, 11), l(9, 9, 10, 10), r1.xyxy\nieq r4.xy, r2.zwzz, l(512, 512, 0, 0)\nmovc r2.zw, r4.xxxy, l(0,0,513,513), r2.zzzw\nmovc r4.xyzw, r3.xyxy, l(1023,1023,0x0000ffff,0x0000ffff), l(0,0,0,0)\nxor r2.zw, r2.zzzw, r4.xxxy\niadd r2.zw, r3.xxxy, r2.zzzw\nishl r4.xy, r2.zwzz, l(6, 6, 0, 0)\nushr r2.zw, r2.zzzw, l(0, 0, 3, 3)\nor r2.zw, r2.zzzw, r4.xxxy\nxor r2.zw, r4.zzzw, r2.zzzw\niadd r2.zw, r3.xxxy, r2.zzzw\nubfe r3.xy, l(1, 1, 0, 0), l(20, 20, 0, 0), r1.xyxx\nieq r4.xy, r3.zwzz, l(1024, 1024, 0, 0)\nmovc r3.zw, r4.xxxy, l(0,0,1025,1025), r3.zzzw\nmovc r4.xyzw, r3.xyxy, l(2047,2047,0x0000ffff,0x0000ffff), l(0,0,0,0)\nxor r3.zw, r3.zzzw, r4.xxxy\niadd r3.zw, r3.xxxy, r3.zzzw\nishl r4.xy, r3.zwzz, l(5, 5, 0, 0)\nushr r3.zw, r3.zzzw, l(0, 0, 5, 5)\nor r3.zw, r3.zzzw, r4.xxxy\nxor r3.zw, r4.zzzw, r3.zzzw\niadd r3.xy, r3.xyxx, r3.zwzz\nishl r3.xy, r3.xyxx, l(16, 16, 0, 0)\nor r3.xz, r2.zzwz, r3.xxyx\nushr r1.xy, r1.xyxx, l(21, 21, 0, 0)\nushr r2.zw, r1.xxxy, l(0, 0, 10, 10)\nieq r4.xy, r1.xyxx, l(1024, 1024, 0, 0)\nmovc r1.xy, r4.xyxx, l(1025,1025,0,0), r1.xyxx\nmovc r4.xyzw, r2.zwzw, l(2047,2047,0x0000ffff,0x0000ffff), l(0,0,0,0)\nxor r1.xy, r1.xyxx, r4.xyxx\niadd r1.xy, r2.zwzz, r1.xyxx\nishl r4.xy, r1.xyxx, l(5, 5, 0, 0)\nushr r1.xy, r1.xyxx, l(5, 5, 0, 0)\nor r1.xy, r1.xyxx, r4.xyxx\nxor r1.xy, r4.zwzz, r1.xyxx\niadd r1.xy, r2.zwzz, r1.xyxx\nor r3.yw, r1.xxxy, l(0, 0x7fff0000, 0, 0x7fff0000)\nand r1.xy, r1.zwzz, l(1023, 1023, 0, 0)\nubfe r4.xyzw, l(1, 1, 11, 11), l(9, 9, 10, 10), r1.zwzw\nieq r2.zw, r1.xxxy, l(0, 0, 512, 512)\nmovc r1.xy, r2.zwzz, l(513,513,0,0), r1.xyxx\nmovc r5.xyzw, r4.xyxy, l(1023,1023,0x0000ffff,0x0000ffff), l(0,0,0,0)\nxor r1.xy, r1.xyxx, r5.xyxx\niadd r1.xy, r4.xyxx, r1.xyxx\nishl r2.zw, r1.xxxy, l(0, 0, 6, 6)\nushr r1.xy, r1.xyxx, l(3, 3, 0, 0)\nor r1.xy, r1.xyxx, r2.zwzz\nxor r1.xy, r5.zwzz, r1.xyxx\niadd r1.xy, r4.xyxx, r1.xyxx\nubfe r2.zw, l(0, 0, 1, 1), l(0, 0, 20, 20), r1.zzzw\nieq r4.xy, r4.zwzz, l(1024, 1024, 0, 0)\nmovc r4.xy, r4.xyxx, l(1025,1025,0,0), r4.zwzz\nmovc r5.xyzw, r2.zwzw, l(2047,2047,0x0000ffff,0x0000ffff), l(0,0,0,0)\nxor r4.xy, r4.xyxx, r5.xyxx\niadd r4.xy, r2.zwzz, r4.xyxx\nishl r4.zw, r4.xxxy, l(0, 0, 5, 5)\nushr r4.xy, r4.xyxx, l(5, 5, 0, 0)\nor r4.xy, r4.xyxx, r4.zwzz\nxor r4.xy, r5.zwzz, r4.xyxx\niadd r2.zw, r2.zzzw, r4.xxxy\nishl r2.zw, r2.zzzw, l(0, 0, 16, 16)\nor r4.xz, r1.xxyx, r2.zzwz\nushr r1.xy, r1.zwzz, l(21, 21, 0, 0)\nushr r1.zw, r1.xxxy, l(0, 0, 10, 10)\nieq r2.zw, r1.xxxy, l(0, 0, 1024, 1024)\nmovc r1.xy, r2.zwzz, l(1025,1025,0,0), r1.xyxx\nmovc r5.xyzw, r1.zwzw, l(2047,2047,0x0000ffff,0x0000ffff), l(0,0,0,0)\nxor r1.xy, r1.xyxx, r5.xyxx\niadd r1.xy, r1.zwzz, r1.xyxx\nishl r2.zw, r1.xxxy, l(0, 0, 5, 5)\nushr r1.xy, r1.xyxx, l(5, 5, 0, 0)\nor r1.xy, r1.xyxx, r2.zwzz\nxor r1.xy, r5.zwzz, r1.xyxx\niadd r1.xy, r1.zwzz, r1.xyxx\nor r4.yw, r1.xxxy, l(0, 0x7fff0000, 0, 0x7fff0000)\nstore_raw U0[0].xyzw, r0.w, r3.xyzw\niadd r1.xyz, r0.wwww, l(16, 32, 48, 0)\nstore_raw U0[0].xyzw, r1.x, r4.xyzw\nif_nz r0.x\n  mov r0.x, l(32)\nelse \n  mov r0.x, l(16)\nendif \niadd r0.x, r0.x, r0.y\nld_raw r3.xyzw, r0.x, T0[0].xyzw\nif_nz r2.x\n  ishl r4.xyzw, r3.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r5.xyzw, r3.xyzw, l(8, 8, 8, 8)\n  and r5.xyzw, r5.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r3.xyzw, r4.xyzw, r5.xyzw\nendif \nif_nz r2.y\n  ushr r2.xyzw, r3.xyzw, l(16, 16, 16, 16)\n  bfi r3.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r3.xyzw, r2.xyzw\nendif \nand r0.xy, r3.xyxx, l(1023, 1023, 0, 0)\nubfe r2.xyzw, l(1, 1, 11, 11), l(9, 9, 10, 10), r3.xyxy\nieq r1.xw, r0.xxxy, l(512, 0, 0, 512)\nmovc r0.xy, r1.xwxx, l(513,513,0,0), r0.xyxx\nmovc r4.xyzw, r2.xyxy, l(1023,1023,0x0000ffff,0x0000ffff), l(0,0,0,0)\nxor r0.xy, r0.xyxx, r4.xyxx\niadd r0.xy, r2.xyxx, r0.xyxx\nishl r1.xw, r0.xxxy, l(6, 0, 0, 6)\nushr r0.xy, r0.xyxx, l(3, 3, 0, 0)\nor r0.xy, r0.xyxx, r1.xwxx\nxor r0.xy, r4.zwzz, r0.xyxx\niadd r0.xy, r2.xyxx, r0.xyxx\nubfe r1.xw, l(1, 0, 0, 1), l(20, 0, 0, 20), r3.xxxy\nieq r2.xy, r2.zwzz, l(1024, 1024, 0, 0)\nmovc r2.xy, r2.xyxx, l(1025,1025,0,0), r2.zwzz\nmovc r4.xyzw, r1.xwxw, l(2047,2047,0x0000ffff,0x0000ffff), l(0,0,0,0)\nxor r2.xy, r2.xyxx, r4.xyxx\niadd r2.xy, r1.xwxx, r2.xyxx\nishl r2.zw, r2.xxxy, l(0, 0, 5, 5)\nushr r2.xy, r2.xyxx, l(5, 5, 0, 0)\nor r2.xy, r2.xyxx, r2.zwzz\nxor r2.xy, r4.zwzz, r2.xyxx\niadd r1.xw, r1.xxxw, r2.xxxy\nishl r1.xw, r1.xxxw, l(16, 0, 0, 16)\nor r2.xz, r0.xxyx, r1.xxwx\nushr r0.xy, r3.xyxx, l(21, 21, 0, 0)\nushr r1.xw, r0.xxxy, l(10, 0, 0, 10)\nieq r3.xy, r0.xyxx, l(1024, 1024, 0, 0)\nmovc r0.xy, r3.xyxx, l(1025,1025,0,0), r0.xyxx\nmovc r4.xyzw, r1.xwxw, l(2047,2047,0x0000ffff,0x0000ffff), l(0,0,0,0)\nxor r0.xy, r0.xyxx, r4.xyxx\niadd r0.xy, r1.xwxx, r0.xyxx\nishl r3.xy, r0.xyxx, l(5, 5, 0, 0)\nushr r0.xy, r0.xyxx, l(5, 5, 0, 0)\nor r0.xy, r0.xyxx, r3.xyxx\nxor r0.xy, r4.zwzz, r0.xyxx\niadd r0.xy, r1.xwxx, r0.xyxx\nor r2.yw, r0.xxxy, l(0, 0x7fff0000, 0, 0x7fff0000)\nand r0.xy, r3.zwzz, l(1023, 1023, 0, 0)\nubfe r4.xyzw, l(1, 1, 11, 11), l(9, 9, 10, 10), r3.zwzw\nieq r1.xw, r0.xxxy, l(512, 0, 0, 512)\nmovc r0.xy, r1.xwxx, l(513,513,0,0), r0.xyxx\nmovc r5.xyzw, r4.xyxy, l(1023,1023,0x0000ffff,0x0000ffff), l(0,0,0,0)\nxor r0.xy, r0.xyxx, r5.xyxx\niadd r0.xy, r4.xyxx, r0.xyxx\nishl r1.xw, r0.xxxy, l(6, 0, 0, 6)\nushr r0.xy, r0.xyxx, l(3, 3, 0, 0)\nor r0.xy, r0.xyxx, r1.xwxx\nxor r0.xy, r5.zwzz, r0.xyxx\niadd r0.xy, r4.xyxx, r0.xyxx\nubfe r1.xw, l(1, 0, 0, 1), l(20, 0, 0, 20), r3.zzzw\nieq r3.xy, r4.zwzz, l(1024, 1024, 0, 0)\nmovc r3.xy, r3.xyxx, l(1025,1025,0,0), r4.zwzz\nmovc r4.xyzw, r1.xwxw, l(2047,2047,0x0000ffff,0x0000ffff), l(0,0,0,0)\nxor r3.xy, r3.xyxx, r4.xyxx\niadd r3.xy, r1.xwxx, r3.xyxx\nishl r4.xy, r3.xyxx, l(5, 5, 0, 0)\nushr r3.xy, r3.xyxx, l(5, 5, 0, 0)\nor r3.xy, r3.xyxx, r4.xyxx\nxor r3.xy, r4.zwzz, r3.xyxx\niadd r1.xw, r1.xxxw, r3.xxxy\nishl r1.xw, r1.xxxw, l(16, 0, 0, 16)\nor r4.xz, r0.xxyx, r1.xxwx\nushr r0.xy, r3.zwzz, l(21, 21, 0, 0)\nushr r1.xw, r0.xxxy, l(10, 0, 0, 10)\nieq r3.xy, r0.xyxx, l(1024, 1024, 0, 0)\nmovc r0.xy, r3.xyxx, l(1025,1025,0,0), r0.xyxx\nmovc r3.xyzw, r1.xwxw, l(2047,2047,0x0000ffff,0x0000ffff), l(0,0,0,0)\nxor r0.xy, r0.xyxx, r3.xyxx\niadd r0.xy, r1.xwxx, r0.xyxx\nishl r3.xy, r0.xyxx, l(5, 5, 0, 0)\nushr r0.xy, r0.xyxx, l(5, 5, 0, 0)\nor r0.xy, r0.xyxx, r3.xyxx\nxor r0.xy, r3.zwzz, r0.xyxx\niadd r0.xy, r1.xwxx, r0.xyxx\nor r4.yw, r0.xxxy, l(0, 0x7fff0000, 0, 0x7fff0000)\nstore_raw U0[0].xyzw, r1.y, r2.xyzw\nstore_raw U0[0].xyzw, r1.z, r4.xyzw\nret \n// Approximately 245 instruction slots used\n#endif\n\nconst BYTE texture_load_r10g11b11_rgba16_snorm_cs[] =\n{\n     68,  88,  66,  67,   5,  64, \n      4, 197,  85, 144, 213,  77, \n    170, 245, 212,  33, 212,  13, \n     45, 162,   1,   0,   0,   0, \n    120,  39,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n    220,  38,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n    160,  34,   0,   0,  81,   0, \n      5,   0, 168,   8,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   6,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  12,  50,   0,  16,   0, \n      0,   0,   0,   0,   6, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n    194,   0,  16,   0,   0,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0,   6, 132, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  11, \n     66,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,   2,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,  11, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  31,   0, \n      0,   3,  10,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  58, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  42,   0,   2,   0, \n     26,   0,   2,   0,  35,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     41,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  18,   0, \n      0,   1,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,  12, \n    194,   0,  16,   0,   1,   0, \n      0,   0, 166, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0,  42,   0,   0,   9, \n    242,   0,  16,   0,   2,   0, \n      0,   0, 102,   5,   2,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      1,   0,   0,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 139,   0,   0,   8, \n    130,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     27,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10,   0,   2,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  19, 194,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0, 166,   6,   2,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     25,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  87,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0, 138,   0,   0,   9, \n     18,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  20, \n     98,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  11,   0, \n      0,   0,   0,   0,   0,   0, \n    166,  10,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  87,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  64,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    139,   0,   0,  15,  50,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  27,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  18,   0, \n      0,   1,  85,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  42,   0,   0,   9, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  86,   5,   2,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   1,   0,   0,   0, \n      4,   0,   0,   0,   3,   0, \n      0,   0, 139,   0,   0,   8, \n     66,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     27,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10,   0,   2,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  20, 114,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0, 214,   6,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  26,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0, 138,   0,   0,   9, \n     18,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  87,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  10,  66,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  26,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  64,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 139,   0,   0,  15, \n    194,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  27,   0,   0,   0, \n     24,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  21,   0, \n      0,   1,  30,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  32,   0, \n      0,  10, 114,   0,  16,   0, \n      2,   0,   0,   0, 166,  10, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   2,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   2,   0, \n      0,   0, 150,   5,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,  85,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     21,   0,   0,   1,   1,   0, \n      0,  10, 194,   0,  16,   0, \n      2,   0,   0,   0,   6,   4, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   9,   0,   0,   0, \n      9,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     70,   4,  16,   0,   1,   0, \n      0,   0,  32,   0,   0,  10, \n     50,   0,  16,   0,   4,   0, \n      0,   0, 230,  10,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   2,   0,   0, \n      0,   2,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,  12, 194,   0, \n     16,   0,   2,   0,   0,   0, \n      6,   4,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   2,   0,   0, \n      1,   2,   0,   0, 166,  14, \n     16,   0,   2,   0,   0,   0, \n     55,   0,   0,  15, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,   4,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255, 255,   0,   0, \n    255, 255,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7, 194,   0, \n     16,   0,   2,   0,   0,   0, \n    166,  14,  16,   0,   2,   0, \n      0,   0,   6,   4,  16,   0, \n      4,   0,   0,   0,  30,   0, \n      0,   7, 194,   0,  16,   0, \n      2,   0,   0,   0,   6,   4, \n     16,   0,   3,   0,   0,   0, \n    166,  14,  16,   0,   2,   0, \n      0,   0,  41,   0,   0,  10, \n     50,   0,  16,   0,   4,   0, \n      0,   0, 230,  10,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   6,   0,   0,   0, \n      6,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     85,   0,   0,  10, 194,   0, \n     16,   0,   2,   0,   0,   0, \n    166,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,  60,   0, \n      0,   7, 194,   0,  16,   0, \n      2,   0,   0,   0, 166,  14, \n     16,   0,   2,   0,   0,   0, \n      6,   4,  16,   0,   4,   0, \n      0,   0,  87,   0,   0,   7, \n    194,   0,  16,   0,   2,   0, \n      0,   0, 166,  14,  16,   0, \n      4,   0,   0,   0, 166,  14, \n     16,   0,   2,   0,   0,   0, \n     30,   0,   0,   7, 194,   0, \n     16,   0,   2,   0,   0,   0, \n      6,   4,  16,   0,   3,   0, \n      0,   0, 166,  14,  16,   0, \n      2,   0,   0,   0, 138,   0, \n      0,  15,  50,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,  20,   0, \n      0,   0,  20,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,  32,   0, \n      0,  10,  50,   0,  16,   0, \n      4,   0,   0,   0, 230,  10, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   4, \n      0,   0,   0,   4,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,  12, \n    194,   0,  16,   0,   3,   0, \n      0,   0,   6,   4,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   4, \n      0,   0,   1,   4,   0,   0, \n    166,  14,  16,   0,   3,   0, \n      0,   0,  55,   0,   0,  15, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,   4,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0, 255,   7,   0,   0, \n    255,   7,   0,   0, 255, 255, \n      0,   0, 255, 255,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n    194,   0,  16,   0,   3,   0, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,   6,   4, \n     16,   0,   4,   0,   0,   0, \n     30,   0,   0,   7, 194,   0, \n     16,   0,   3,   0,   0,   0, \n      6,   4,  16,   0,   3,   0, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,  41,   0, \n      0,  10,  50,   0,  16,   0, \n      4,   0,   0,   0, 230,  10, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n    194,   0,  16,   0,   3,   0, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n     60,   0,   0,   7, 194,   0, \n     16,   0,   3,   0,   0,   0, \n    166,  14,  16,   0,   3,   0, \n      0,   0,   6,   4,  16,   0, \n      4,   0,   0,   0,  87,   0, \n      0,   7, 194,   0,  16,   0, \n      3,   0,   0,   0, 166,  14, \n     16,   0,   4,   0,   0,   0, \n    166,  14,  16,   0,   3,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   3,   0, \n      0,   0,  70,   0,  16,   0, \n      3,   0,   0,   0, 230,  10, \n     16,   0,   3,   0,   0,   0, \n     41,   0,   0,  10,  50,   0, \n     16,   0,   3,   0,   0,   0, \n     70,   0,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  60,   0, \n      0,   7,  82,   0,  16,   0, \n      3,   0,   0,   0, 166,  11, \n     16,   0,   2,   0,   0,   0, \n      6,   1,  16,   0,   3,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  21,   0,   0,   0, \n     21,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     85,   0,   0,  10, 194,   0, \n     16,   0,   2,   0,   0,   0, \n      6,   4,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  32,   0, \n      0,  10,  50,   0,  16,   0, \n      4,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   4, \n      0,   0,   0,   4,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,  12, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   1,   4,   0,   0, \n      1,   4,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  55,   0,   0,  15, \n    242,   0,  16,   0,   4,   0, \n      0,   0, 230,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0, 255,   7,   0,   0, \n    255,   7,   0,   0, 255, 255, \n      0,   0, 255, 255,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   4,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,   1,   0,   0,   0, \n    230,  10,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,  41,   0, \n      0,  10,  50,   0,  16,   0, \n      4,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      4,   0,   0,   0,  87,   0, \n      0,   7,  50,   0,  16,   0, \n      1,   0,   0,   0, 230,  10, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   1,   0, \n      0,   0, 230,  10,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n     60,   0,   0,  10, 162,   0, \n     16,   0,   3,   0,   0,   0, \n      6,   4,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    255, 127,   0,   0,   0,   0, \n      0,   0, 255, 127,   1,   0, \n      0,  10,  50,   0,  16,   0, \n      1,   0,   0,   0, 230,  10, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   9,   0,   0,   0, \n      9,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n    230,  14,  16,   0,   1,   0, \n      0,   0,  32,   0,   0,  10, \n    194,   0,  16,   0,   2,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   2, \n      0,   0,   0,   2,   0,   0, \n     55,   0,   0,  12,  50,   0, \n     16,   0,   1,   0,   0,   0, \n    230,  10,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   2,   0,   0,   1,   2, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n     55,   0,   0,  15, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   4,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255, 255,   0,   0, \n    255, 255,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7,  50,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      5,   0,   0,   0,  30,   0, \n      0,   7,  50,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  41,   0,   0,  10, \n    194,   0,  16,   0,   2,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   6,   0, \n      0,   0,   6,   0,   0,   0, \n     85,   0,   0,  10,  50,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  60,   0, \n      0,   7,  50,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n    230,  10,  16,   0,   2,   0, \n      0,   0,  87,   0,   0,   7, \n     50,   0,  16,   0,   1,   0, \n      0,   0, 230,  10,  16,   0, \n      5,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   4,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0, 138,   0, \n      0,  15, 194,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0, 166,  14,  16,   0, \n      1,   0,   0,   0,  32,   0, \n      0,  10,  50,   0,  16,   0, \n      4,   0,   0,   0, 230,  10, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   4, \n      0,   0,   0,   4,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,  12, \n     50,   0,  16,   0,   4,   0, \n      0,   0,  70,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   1,   4,   0,   0, \n      1,   4,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    230,  10,  16,   0,   4,   0, \n      0,   0,  55,   0,   0,  15, \n    242,   0,  16,   0,   5,   0, \n      0,   0, 230,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0, 255,   7,   0,   0, \n    255,   7,   0,   0, 255, 255, \n      0,   0, 255, 255,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     50,   0,  16,   0,   4,   0, \n      0,   0,  70,   0,  16,   0, \n      4,   0,   0,   0,  70,   0, \n     16,   0,   5,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,   4,   0,   0,   0, \n    230,  10,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      4,   0,   0,   0,  41,   0, \n      0,  10, 194,   0,  16,   0, \n      4,   0,   0,   0,   6,   4, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   4,   0, \n      0,   0,  70,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   4,   0, \n      0,   0, 230,  10,  16,   0, \n      4,   0,   0,   0,  87,   0, \n      0,   7,  50,   0,  16,   0, \n      4,   0,   0,   0, 230,  10, \n     16,   0,   5,   0,   0,   0, \n     70,   0,  16,   0,   4,   0, \n      0,   0,  30,   0,   0,   7, \n    194,   0,  16,   0,   2,   0, \n      0,   0, 166,  14,  16,   0, \n      2,   0,   0,   0,   6,   4, \n     16,   0,   4,   0,   0,   0, \n     41,   0,   0,  10, 194,   0, \n     16,   0,   2,   0,   0,   0, \n    166,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  60,   0, \n      0,   7,  82,   0,  16,   0, \n      4,   0,   0,   0,   6,   1, \n     16,   0,   1,   0,   0,   0, \n    166,  11,  16,   0,   2,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   1,   0, \n      0,   0, 230,  10,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  21,   0,   0,   0, \n     21,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     85,   0,   0,  10, 194,   0, \n     16,   0,   1,   0,   0,   0, \n      6,   4,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  32,   0, \n      0,  10, 194,   0,  16,   0, \n      2,   0,   0,   0,   6,   4, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   4,   0,   0,   0,   4, \n      0,   0,  55,   0,   0,  12, \n     50,   0,  16,   0,   1,   0, \n      0,   0, 230,  10,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   1,   4,   0,   0, \n      1,   4,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  55,   0,   0,  15, \n    242,   0,  16,   0,   5,   0, \n      0,   0, 230,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0, 255,   7,   0,   0, \n    255,   7,   0,   0, 255, 255, \n      0,   0, 255, 255,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   5,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,   1,   0,   0,   0, \n    230,  10,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,  41,   0, \n      0,  10, 194,   0,  16,   0, \n      2,   0,   0,   0,   6,   4, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0, 230,  10,  16,   0, \n      2,   0,   0,   0,  87,   0, \n      0,   7,  50,   0,  16,   0, \n      1,   0,   0,   0, 230,  10, \n     16,   0,   5,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   1,   0, \n      0,   0, 230,  10,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n     60,   0,   0,  10, 162,   0, \n     16,   0,   4,   0,   0,   0, \n      6,   4,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    255, 127,   0,   0,   0,   0, \n      0,   0, 255, 127, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,   1,   0,   0,   0, \n    246,  15,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  32,   0, \n      0,   0,  48,   0,   0,   0, \n      0,   0,   0,   0, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  32,   0, \n      0,   0,  18,   0,   0,   1, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0,  21,   0,   0,   1, \n     30,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      3,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,  85,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     21,   0,   0,   1,   1,   0, \n      0,  10,  50,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   9,   0,   0,   0, \n      9,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     70,   4,  16,   0,   3,   0, \n      0,   0,  32,   0,   0,  10, \n    146,   0,  16,   0,   1,   0, \n      0,   0,   6,   4,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   2,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   2,   0,   0, \n     55,   0,   0,  12,  50,   0, \n     16,   0,   0,   0,   0,   0, \n    198,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   2,   0,   0,   1,   2, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n     55,   0,   0,  15, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,   4,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255, 255,   0,   0, \n    255, 255,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7,  50,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      4,   0,   0,   0,  30,   0, \n      0,   7,  50,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    146,   0,  16,   0,   1,   0, \n      0,   0,   6,   4,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   6,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   6,   0,   0,   0, \n     85,   0,   0,  10,  50,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  60,   0, \n      0,   7,  50,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n    198,   0,  16,   0,   1,   0, \n      0,   0,  87,   0,   0,   7, \n     50,   0,  16,   0,   0,   0, \n      0,   0, 230,  10,  16,   0, \n      4,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 146,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  20,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  20,   0, \n      0,   0,   6,   4,  16,   0, \n      3,   0,   0,   0,  32,   0, \n      0,  10,  50,   0,  16,   0, \n      2,   0,   0,   0, 230,  10, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   4, \n      0,   0,   0,   4,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,  12, \n     50,   0,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   1,   4,   0,   0, \n      1,   4,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    230,  10,  16,   0,   2,   0, \n      0,   0,  55,   0,   0,  15, \n    242,   0,  16,   0,   4,   0, \n      0,   0, 198,  12,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0, 255,   7,   0,   0, \n    255,   7,   0,   0, 255, 255, \n      0,   0, 255, 255,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     50,   0,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   4,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,   2,   0,   0,   0, \n    198,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,  41,   0, \n      0,  10, 194,   0,  16,   0, \n      2,   0,   0,   0,   6,   4, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,   2,   0, \n      0,   0, 230,  10,  16,   0, \n      2,   0,   0,   0,  87,   0, \n      0,   7,  50,   0,  16,   0, \n      2,   0,   0,   0, 230,  10, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   2,   0, \n      0,   0,  30,   0,   0,   7, \n    146,   0,  16,   0,   1,   0, \n      0,   0,   6,  12,  16,   0, \n      1,   0,   0,   0,   6,   4, \n     16,   0,   2,   0,   0,   0, \n     41,   0,   0,  10, 146,   0, \n     16,   0,   1,   0,   0,   0, \n      6,  12,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,  60,   0, \n      0,   7,  82,   0,  16,   0, \n      2,   0,   0,   0,   6,   1, \n     16,   0,   0,   0,   0,   0, \n      6,   3,  16,   0,   1,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,  21,   0,   0,   0, \n     21,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     85,   0,   0,  10, 146,   0, \n     16,   0,   1,   0,   0,   0, \n      6,   4,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     10,   0,   0,   0,  32,   0, \n      0,  10,  50,   0,  16,   0, \n      3,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   4, \n      0,   0,   0,   4,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,  12, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   1,   4,   0,   0, \n      1,   4,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0,  55,   0,   0,  15, \n    242,   0,  16,   0,   4,   0, \n      0,   0, 198,  12,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0, 255,   7,   0,   0, \n    255,   7,   0,   0, 255, 255, \n      0,   0, 255, 255,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   4,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,   0,   0,   0,   0, \n    198,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10,  50,   0,  16,   0, \n      3,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      3,   0,   0,   0,  87,   0, \n      0,   7,  50,   0,  16,   0, \n      0,   0,   0,   0, 230,  10, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   0,   0, \n      0,   0, 198,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n     60,   0,   0,  10, 162,   0, \n     16,   0,   2,   0,   0,   0, \n      6,   4,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    255, 127,   0,   0,   0,   0, \n      0,   0, 255, 127,   1,   0, \n      0,  10,  50,   0,  16,   0, \n      0,   0,   0,   0, 230,  10, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,   9,   0,   0,   0, \n      9,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n    230,  14,  16,   0,   3,   0, \n      0,   0,  32,   0,   0,  10, \n    146,   0,  16,   0,   1,   0, \n      0,   0,   6,   4,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   2,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   2,   0,   0, \n     55,   0,   0,  12,  50,   0, \n     16,   0,   0,   0,   0,   0, \n    198,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   2,   0,   0,   1,   2, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n     55,   0,   0,  15, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   4,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0, 255, 255,   0,   0, \n    255, 255,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7,  50,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      5,   0,   0,   0,  30,   0, \n      0,   7,  50,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    146,   0,  16,   0,   1,   0, \n      0,   0,   6,   4,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   6,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   6,   0,   0,   0, \n     85,   0,   0,  10,  50,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  60,   0, \n      0,   7,  50,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n    198,   0,  16,   0,   1,   0, \n      0,   0,  87,   0,   0,   7, \n     50,   0,  16,   0,   0,   0, \n      0,   0, 230,  10,  16,   0, \n      5,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   4,   0, \n      0,   0,  70,   0,  16,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 146,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  20,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  20,   0, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,  32,   0, \n      0,  10,  50,   0,  16,   0, \n      3,   0,   0,   0, 230,  10, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   4, \n      0,   0,   0,   4,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,  12, \n     50,   0,  16,   0,   3,   0, \n      0,   0,  70,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   1,   4,   0,   0, \n      1,   4,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    230,  10,  16,   0,   4,   0, \n      0,   0,  55,   0,   0,  15, \n    242,   0,  16,   0,   4,   0, \n      0,   0, 198,  12,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0, 255,   7,   0,   0, \n    255,   7,   0,   0, 255, 255, \n      0,   0, 255, 255,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     50,   0,  16,   0,   3,   0, \n      0,   0,  70,   0,  16,   0, \n      3,   0,   0,   0,  70,   0, \n     16,   0,   4,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,   3,   0,   0,   0, \n    198,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      3,   0,   0,   0,  41,   0, \n      0,  10,  50,   0,  16,   0, \n      4,   0,   0,   0,  70,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   3,   0, \n      0,   0,  70,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,   3,   0,   0,   0, \n     70,   0,  16,   0,   3,   0, \n      0,   0,  70,   0,  16,   0, \n      4,   0,   0,   0,  87,   0, \n      0,   7,  50,   0,  16,   0, \n      3,   0,   0,   0, 230,  10, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   3,   0, \n      0,   0,  30,   0,   0,   7, \n    146,   0,  16,   0,   1,   0, \n      0,   0,   6,  12,  16,   0, \n      1,   0,   0,   0,   6,   4, \n     16,   0,   3,   0,   0,   0, \n     41,   0,   0,  10, 146,   0, \n     16,   0,   1,   0,   0,   0, \n      6,  12,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,  60,   0, \n      0,   7,  82,   0,  16,   0, \n      4,   0,   0,   0,   6,   1, \n     16,   0,   0,   0,   0,   0, \n      6,   3,  16,   0,   1,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   0,   0, \n      0,   0, 230,  10,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,  21,   0,   0,   0, \n     21,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     85,   0,   0,  10, 146,   0, \n     16,   0,   1,   0,   0,   0, \n      6,   4,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     10,   0,   0,   0,  32,   0, \n      0,  10,  50,   0,  16,   0, \n      3,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   4, \n      0,   0,   0,   4,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,  12, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   1,   4,   0,   0, \n      1,   4,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0,  55,   0,   0,  15, \n    242,   0,  16,   0,   3,   0, \n      0,   0, 198,  12,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0, 255,   7,   0,   0, \n    255,   7,   0,   0, 255, 255, \n      0,   0, 255, 255,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   3,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,   0,   0,   0,   0, \n    198,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10,  50,   0,  16,   0, \n      3,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      3,   0,   0,   0,  87,   0, \n      0,   7,  50,   0,  16,   0, \n      0,   0,   0,   0, 230,  10, \n     16,   0,   3,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   0,   0, \n      0,   0, 198,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n     60,   0,   0,  10, 162,   0, \n     16,   0,   4,   0,   0,   0, \n      6,   4,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    255, 127,   0,   0,   0,   0, \n      0,   0, 255, 127, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  62,   0,   0,   1, \n     83,  84,  65,  84, 148,   0, \n      0,   0, 245,   0,   0,   0, \n      6,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  78,   0, \n      0,   0,  85,   0,   0,   0, \n      5,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,  24,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_r10g11b11_rgba16_snorm_scaled_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 6\ndcl_thread_group 4, 32, 1\nand r0.x, CB0[0][0].x, l(2)\nishl r1.x, vThreadID.x, l(3)\nmov r1.y, vThreadID.y\nuge r0.yz, r1.xxyx, CB0[0][1].xxyx\nor r0.y, r0.z, r0.y\nif_nz r0.y\n  ret \nendif \nubfe r0.yzw, l(0, 2, 3, 3), l(0, 2, 4, 7), CB0[0][0].xxxx\nishl r1.z, r1.x, l(3)\nimad r1.w, vThreadID.z, CB0[0][1].y, vThreadID.y\nimad r1.z, r1.w, CB0[0][2].x, r1.z\niadd r1.z, r1.z, CB0[0][1].w\nushr r1.yw, r1.xxxy, l(0, 4, 0, 1)\nudiv r2.xyzw, null, r1.wyww, r0.wzww\nimad r1.yw, -r0.zzzw, r2.yyyw, r1.yyyw\nishl r3.x, r2.y, l(4)\nimad r1.y, r1.y, r0.w, r1.w\nbfi r1.w, l(1), l(6), vThreadID.y, l(0)\nbfi r1.y, l(25), l(7), r1.y, r1.w\nbfi r1.x, l(4), l(2), r1.x, l(0)\niadd r1.x, r1.y, r1.x\nif_nz r0.x\n  ushr r1.yw, CB0[0][0].zzzw, l(0, 5, 0, 4)\n  ishr r0.x, vThreadID.z, l(2)\n  ibfe r4.xyzw, l(28, 27, 31, 29), l(3, 1, 0, 2), r2.wyww\n  imad r1.w, r0.x, r1.w, r4.x\n  imad r1.y, r1.w, r1.y, r4.y\n  bfi r1.w, l(2), l(5), vThreadID.z, l(0)\n  bfi r3.y, l(2), l(3), r4.z, l(0)\n  iadd r1.w, r1.w, r3.y\n  bfi r1.y, l(25), l(7), r1.y, r1.w\n  xor r0.x, r0.x, r4.w\n  ishr r1.w, r3.x, l(3)\n  and r1.w, r1.w, l(2)\n  bfi r3.yz, l(0, 1, 1, 0), l(0, 1, 11, 0), r0.xxxx, l(0, 0, 0, 0)\n  xor r0.x, r1.w, r3.y\n  ishl r0.x, r0.x, l(6)\n  iadd r0.x, r3.z, r0.x\n  ibfe r1.yw, l(0, 27, 0, 24), l(0, 3, 0, 6), r1.yyyy\n  bfi r0.x, l(3), l(8), r1.y, r0.x\n  bfi r0.x, l(20), l(12), r1.w, r0.x\nelse \n  ushr r1.y, CB0[0][0].z, l(5)\n  ibfe r4.xyzw, l(27, 27, 31, 28), l(4, 1, 0, 3), r2.xyzw\n  imad r1.y, r4.x, r1.y, r4.y\n  bfi r2.xy, l(3, 1, 0, 0), l(3, 11, 0, 0), r4.zwzz, l(0, 0, 0, 0)\n  bfi r1.y, l(26), l(6), r1.y, r2.x\n  ishr r1.w, r3.x, l(3)\n  and r1.w, r1.w, l(2)\n  ibfe r2.x, l(29), l(2), r2.w\n  bfi r2.x, l(1), l(1), r2.x, l(0)\n  xor r1.w, r1.w, r2.x\n  ishl r1.w, r1.w, l(6)\n  iadd r1.w, r2.y, r1.w\n  ibfe r2.xy, l(27, 24, 0, 0), l(3, 6, 0, 0), r1.yyyy\n  bfi r1.y, l(3), l(8), r2.x, r1.w\n  bfi r0.x, l(20), l(12), r2.y, r1.y\nendif \nimul null, r0.z, r0.w, r0.z\nimad r0.x, r0.x, r0.z, r1.x\niadd r0.x, r0.x, CB0[0][0].y\nld_raw r2.xyzw, r0.x, T0[0].xyzw\nieq r0.yzw, r0.yyyy, l(0, 1, 2, 3)\nor r0.yz, r0.zzwz, r0.yyzy\nif_nz r0.y\n  ishl r3.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r2.xyzw, r3.xyzw, r4.xyzw\nendif \nif_nz r0.z\n  ushr r3.xyzw, r2.xyzw, l(16, 16, 16, 16)\n  bfi r2.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r2.xyzw, r3.xyzw\nendif \nand r1.xy, r2.xyxx, l(1023, 1023, 0, 0)\nubfe r3.xyzw, l(1, 1, 11, 11), l(9, 9, 10, 10), r2.xyxy\nieq r4.xy, r1.xyxx, l(512, 512, 0, 0)\nmovc r1.xy, r4.xyxx, l(513,513,0,0), r1.xyxx\nmovc r4.xyzw, r3.xyxy, l(1023,1023,0x0000ffff,0x0000ffff), l(0,0,0,0)\nxor r1.xy, r1.xyxx, r4.xyxx\niadd r1.xy, r3.xyxx, r1.xyxx\nishl r4.xy, r1.xyxx, l(6, 6, 0, 0)\nushr r1.xy, r1.xyxx, l(3, 3, 0, 0)\nor r1.xy, r1.xyxx, r4.xyxx\nxor r1.xy, r4.zwzz, r1.xyxx\niadd r1.xy, r3.xyxx, r1.xyxx\nubfe r3.xy, l(1, 1, 0, 0), l(20, 20, 0, 0), r2.xyxx\nieq r4.xy, r3.zwzz, l(1024, 1024, 0, 0)\nmovc r3.zw, r4.xxxy, l(0,0,1025,1025), r3.zzzw\nmovc r4.xyzw, r3.xyxy, l(2047,2047,0x0000ffff,0x0000ffff), l(0,0,0,0)\nxor r3.zw, r3.zzzw, r4.xxxy\niadd r3.zw, r3.xxxy, r3.zzzw\nishl r4.xy, r3.zwzz, l(5, 5, 0, 0)\nushr r3.zw, r3.zzzw, l(0, 0, 5, 5)\nor r3.zw, r3.zzzw, r4.xxxy\nxor r3.zw, r4.zzzw, r3.zzzw\niadd r3.xy, r3.xyxx, r3.zwzz\nishl r3.xy, r3.xyxx, l(16, 16, 0, 0)\nor r3.xz, r1.xxyx, r3.xxyx\nushr r1.xy, r2.xyxx, l(21, 21, 0, 0)\nushr r2.xy, r1.xyxx, l(10, 10, 0, 0)\nieq r4.xy, r1.xyxx, l(1024, 1024, 0, 0)\nmovc r1.xy, r4.xyxx, l(1025,1025,0,0), r1.xyxx\nmovc r4.xyzw, r2.xyxy, l(2047,2047,0x0000ffff,0x0000ffff), l(0,0,0,0)\nxor r1.xy, r1.xyxx, r4.xyxx\niadd r1.xy, r2.xyxx, r1.xyxx\nishl r4.xy, r1.xyxx, l(5, 5, 0, 0)\nushr r1.xy, r1.xyxx, l(5, 5, 0, 0)\nor r1.xy, r1.xyxx, r4.xyxx\nxor r1.xy, r4.zwzz, r1.xyxx\niadd r1.xy, r2.xyxx, r1.xyxx\nor r3.yw, r1.xxxy, l(0, 0x7fff0000, 0, 0x7fff0000)\nand r1.xy, r2.zwzz, l(1023, 1023, 0, 0)\nubfe r4.xyzw, l(1, 1, 11, 11), l(9, 9, 10, 10), r2.zwzw\nieq r2.xy, r1.xyxx, l(512, 512, 0, 0)\nmovc r1.xy, r2.xyxx, l(513,513,0,0), r1.xyxx\nmovc r5.xyzw, r4.xyxy, l(1023,1023,0x0000ffff,0x0000ffff), l(0,0,0,0)\nxor r1.xy, r1.xyxx, r5.xyxx\niadd r1.xy, r4.xyxx, r1.xyxx\nishl r2.xy, r1.xyxx, l(6, 6, 0, 0)\nushr r1.xy, r1.xyxx, l(3, 3, 0, 0)\nor r1.xy, r1.xyxx, r2.xyxx\nxor r1.xy, r5.zwzz, r1.xyxx\niadd r1.xy, r4.xyxx, r1.xyxx\nubfe r2.xy, l(1, 1, 0, 0), l(20, 20, 0, 0), r2.zwzz\nieq r4.xy, r4.zwzz, l(1024, 1024, 0, 0)\nmovc r4.xy, r4.xyxx, l(1025,1025,0,0), r4.zwzz\nmovc r5.xyzw, r2.xyxy, l(2047,2047,0x0000ffff,0x0000ffff), l(0,0,0,0)\nxor r4.xy, r4.xyxx, r5.xyxx\niadd r4.xy, r2.xyxx, r4.xyxx\nishl r4.zw, r4.xxxy, l(0, 0, 5, 5)\nushr r4.xy, r4.xyxx, l(5, 5, 0, 0)\nor r4.xy, r4.xyxx, r4.zwzz\nxor r4.xy, r5.zwzz, r4.xyxx\niadd r2.xy, r2.xyxx, r4.xyxx\nishl r2.xy, r2.xyxx, l(16, 16, 0, 0)\nor r4.xz, r1.xxyx, r2.xxyx\nushr r1.xy, r2.zwzz, l(21, 21, 0, 0)\nushr r2.xy, r1.xyxx, l(10, 10, 0, 0)\nieq r2.zw, r1.xxxy, l(0, 0, 1024, 1024)\nmovc r1.xy, r2.zwzz, l(1025,1025,0,0), r1.xyxx\nmovc r5.xyzw, r2.xyxy, l(2047,2047,0x0000ffff,0x0000ffff), l(0,0,0,0)\nxor r1.xy, r1.xyxx, r5.xyxx\niadd r1.xy, r2.xyxx, r1.xyxx\nishl r2.zw, r1.xxxy, l(0, 0, 5, 5)\nushr r1.xy, r1.xyxx, l(5, 5, 0, 0)\nor r1.xy, r1.xyxx, r2.zwzz\nxor r1.xy, r5.zwzz, r1.xyxx\niadd r1.xy, r2.xyxx, r1.xyxx\nor r4.yw, r1.xxxy, l(0, 0x7fff0000, 0, 0x7fff0000)\nstore_raw U0[0].xyzw, r1.z, r3.xyzw\niadd r1.xyw, r1.zzzz, l(16, 32, 0, 48)\nstore_raw U0[0].xyzw, r1.x, r4.xyzw\niadd r0.x, r0.x, l(16)\nld_raw r2.xyzw, r0.x, T0[0].xyzw\nif_nz r0.y\n  ishl r3.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r2.xyzw, r3.xyzw, r4.xyzw\nendif \nif_nz r0.z\n  ushr r0.xyzw, r2.xyzw, l(16, 16, 16, 16)\n  bfi r2.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r2.xyzw, r0.xyzw\nendif \nand r0.xy, r2.xyxx, l(1023, 1023, 0, 0)\nubfe r3.xyzw, l(1, 1, 11, 11), l(9, 9, 10, 10), r2.xyxy\nieq r0.zw, r0.xxxy, l(0, 0, 512, 512)\nmovc r0.xy, r0.zwzz, l(513,513,0,0), r0.xyxx\nmovc r4.xyzw, r3.xyxy, l(1023,1023,0x0000ffff,0x0000ffff), l(0,0,0,0)\nxor r0.xy, r0.xyxx, r4.xyxx\niadd r0.xy, r3.xyxx, r0.xyxx\nishl r0.zw, r0.xxxy, l(0, 0, 6, 6)\nushr r0.xy, r0.xyxx, l(3, 3, 0, 0)\nor r0.xy, r0.xyxx, r0.zwzz\nxor r0.xy, r4.zwzz, r0.xyxx\niadd r0.xy, r3.xyxx, r0.xyxx\nubfe r0.zw, l(0, 0, 1, 1), l(0, 0, 20, 20), r2.xxxy\nieq r3.xy, r3.zwzz, l(1024, 1024, 0, 0)\nmovc r3.xy, r3.xyxx, l(1025,1025,0,0), r3.zwzz\nmovc r4.xyzw, r0.zwzw, l(2047,2047,0x0000ffff,0x0000ffff), l(0,0,0,0)\nxor r3.xy, r3.xyxx, r4.xyxx\niadd r3.xy, r0.zwzz, r3.xyxx\nishl r3.zw, r3.xxxy, l(0, 0, 5, 5)\nushr r3.xy, r3.xyxx, l(5, 5, 0, 0)\nor r3.xy, r3.xyxx, r3.zwzz\nxor r3.xy, r4.zwzz, r3.xyxx\niadd r0.zw, r0.zzzw, r3.xxxy\nishl r0.zw, r0.zzzw, l(0, 0, 16, 16)\nor r0.xz, r0.zzwz, r0.xxyx\nushr r2.xy, r2.xyxx, l(21, 21, 0, 0)\nushr r3.xy, r2.xyxx, l(10, 10, 0, 0)\nieq r3.zw, r2.xxxy, l(0, 0, 1024, 1024)\nmovc r2.xy, r3.zwzz, l(1025,1025,0,0), r2.xyxx\nmovc r4.xyzw, r3.xyxy, l(2047,2047,0x0000ffff,0x0000ffff), l(0,0,0,0)\nxor r2.xy, r2.xyxx, r4.xyxx\niadd r2.xy, r3.xyxx, r2.xyxx\nishl r3.zw, r2.xxxy, l(0, 0, 5, 5)\nushr r2.xy, r2.xyxx, l(5, 5, 0, 0)\nor r2.xy, r2.xyxx, r3.zwzz\nxor r2.xy, r4.zwzz, r2.xyxx\niadd r2.xy, r3.xyxx, r2.xyxx\nor r0.yw, r2.xxxy, l(0, 0x7fff0000, 0, 0x7fff0000)\nand r2.xy, r2.zwzz, l(1023, 1023, 0, 0)\nubfe r3.xyzw, l(1, 1, 11, 11), l(9, 9, 10, 10), r2.zwzw\nieq r4.xy, r2.xyxx, l(512, 512, 0, 0)\nmovc r2.xy, r4.xyxx, l(513,513,0,0), r2.xyxx\nmovc r4.xyzw, r3.xyxy, l(1023,1023,0x0000ffff,0x0000ffff), l(0,0,0,0)\nxor r2.xy, r2.xyxx, r4.xyxx\niadd r2.xy, r3.xyxx, r2.xyxx\nishl r4.xy, r2.xyxx, l(6, 6, 0, 0)\nushr r2.xy, r2.xyxx, l(3, 3, 0, 0)\nor r2.xy, r2.xyxx, r4.xyxx\nxor r2.xy, r4.zwzz, r2.xyxx\niadd r2.xy, r3.xyxx, r2.xyxx\nubfe r3.xy, l(1, 1, 0, 0), l(20, 20, 0, 0), r2.zwzz\nieq r4.xy, r3.zwzz, l(1024, 1024, 0, 0)\nmovc r3.zw, r4.xxxy, l(0,0,1025,1025), r3.zzzw\nmovc r4.xyzw, r3.xyxy, l(2047,2047,0x0000ffff,0x0000ffff), l(0,0,0,0)\nxor r3.zw, r3.zzzw, r4.xxxy\niadd r3.zw, r3.xxxy, r3.zzzw\nishl r4.xy, r3.zwzz, l(5, 5, 0, 0)\nushr r3.zw, r3.zzzw, l(0, 0, 5, 5)\nor r3.zw, r3.zzzw, r4.xxxy\nxor r3.zw, r4.zzzw, r3.zzzw\niadd r3.xy, r3.xyxx, r3.zwzz\nishl r3.xy, r3.xyxx, l(16, 16, 0, 0)\nor r3.xz, r2.xxyx, r3.xxyx\nushr r2.xy, r2.zwzz, l(21, 21, 0, 0)\nushr r2.zw, r2.xxxy, l(0, 0, 10, 10)\nieq r4.xy, r2.xyxx, l(1024, 1024, 0, 0)\nmovc r2.xy, r4.xyxx, l(1025,1025,0,0), r2.xyxx\nmovc r4.xyzw, r2.zwzw, l(2047,2047,0x0000ffff,0x0000ffff), l(0,0,0,0)\nxor r2.xy, r2.xyxx, r4.xyxx\niadd r2.xy, r2.zwzz, r2.xyxx\nishl r4.xy, r2.xyxx, l(5, 5, 0, 0)\nushr r2.xy, r2.xyxx, l(5, 5, 0, 0)\nor r2.xy, r2.xyxx, r4.xyxx\nxor r2.xy, r4.zwzz, r2.xyxx\niadd r2.xy, r2.zwzz, r2.xyxx\nor r3.yw, r2.xxxy, l(0, 0x7fff0000, 0, 0x7fff0000)\nstore_raw U0[0].xyzw, r1.y, r0.xyzw\nstore_raw U0[0].xyzw, r1.w, r3.xyzw\nret \n// Approximately 247 instruction slots used\n#endif\n\nconst BYTE texture_load_r10g11b11_rgba16_snorm_scaled_cs[] =\n{\n     68,  88,  66,  67, 135, 176, \n    100, 228, 105, 180,  13,   0, \n     26,  67,  46, 124,  86, 240, \n     49, 222,   1,   0,   0,   0, \n    124,  40,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n    224,  39,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n    164,  35,   0,   0,  81,   0, \n      5,   0, 233,   8,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   6,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n     98,   0,  16,   0,   0,   0, \n      0,   0,   6,   1,  16,   0, \n      1,   0,   0,   0,   6, 129, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  17, \n    226,   0,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   7,   0,   0,   0, \n      6, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,   2,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,  11, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   9,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  85,   0, \n      0,  10, 162,   0,  16,   0, \n      1,   0,   0,   0,   6,   4, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  78,   0,   0,   8, \n    242,   0,  16,   0,   2,   0, \n      0,   0,   0, 208,   0,   0, \n    118,  15,  16,   0,   1,   0, \n      0,   0, 182,  15,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,  10, 162,   0,  16,   0, \n      1,   0,   0,   0, 166,  14, \n     16, 128,  65,   0,   0,   0, \n      0,   0,   0,   0,  86,  13, \n     16,   0,   2,   0,   0,   0, \n     86,  13,  16,   0,   1,   0, \n      0,   0,  41,   0,   0,   7, \n     18,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  10, 130,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  26,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  25,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  18,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     85,   0,   0,  12, 162,   0, \n     16,   0,   1,   0,   0,   0, \n    166, 142,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n     42,   0,   0,   6,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,   2,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n    139,   0,   0,  15, 242,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,  28,   0, \n      0,   0,  27,   0,   0,   0, \n     31,   0,   0,   0,  29,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0, 118,  15, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,   9, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n    140,   0,   0,  10, 130,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  42,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      4,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  25,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     87,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,  42,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n    140,   0,   0,  20,  98,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0,   6,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n     41,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0, 139,   0,   0,  15, \n    162,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  27,   0, \n      0,   0,   0,   0,   0,   0, \n     24,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   6,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     18,   0,   0,   1,  85,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0, 139,   0, \n      0,  15, 242,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,  27,   0,   0,   0, \n     27,   0,   0,   0,  31,   0, \n      0,   0,  28,   0,   0,   0, \n      2,  64,   0,   0,   4,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      4,   0,   0,   0, 140,   0, \n      0,  20,  50,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 230,  10,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  26,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0, 139,   0, \n      0,   9,  18,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,  29,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  30,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n    139,   0,   0,  15,  50,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  27,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  21,   0, \n      0,   1,  38,   0,   0,   8, \n      0, 208,   0,   0,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     32,   0,   0,  10, 226,   0, \n     16,   0,   0,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   2,   0,   0,   0, \n      3,   0,   0,   0,  60,   0, \n      0,   7,  98,   0,  16,   0, \n      0,   0,   0,   0, 166,  11, \n     16,   0,   0,   0,   0,   0, \n     86,   6,  16,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  21,   0,   0,   1, \n      1,   0,   0,  10,  50,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,  11,   0, \n      0,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   9,   0, \n      0,   0,   9,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  70,   4,  16,   0, \n      2,   0,   0,   0,  32,   0, \n      0,  10,  50,   0,  16,   0, \n      4,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   2, \n      0,   0,   0,   2,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,  12, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   1,   2,   0,   0, \n      1,   2,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  55,   0,   0,  15, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,   4,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255, 255, \n      0,   0, 255, 255,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   4,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   3,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,  41,   0, \n      0,  10,  50,   0,  16,   0, \n      4,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   6,   0, \n      0,   0,   6,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      4,   0,   0,   0,  87,   0, \n      0,   7,  50,   0,  16,   0, \n      1,   0,   0,   0, 230,  10, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      3,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n    138,   0,   0,  15,  50,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     32,   0,   0,  10,  50,   0, \n     16,   0,   4,   0,   0,   0, \n    230,  10,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   4,   0,   0,   0,   4, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,  12, 194,   0,  16,   0, \n      3,   0,   0,   0,   6,   4, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   4,   0,   0,   1,   4, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,  55,   0, \n      0,  15, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,   4, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0, 255,   7, \n      0,   0, 255,   7,   0,   0, \n    255, 255,   0,   0, 255, 255, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  87,   0, \n      0,   7, 194,   0,  16,   0, \n      3,   0,   0,   0, 166,  14, \n     16,   0,   3,   0,   0,   0, \n      6,   4,  16,   0,   4,   0, \n      0,   0,  30,   0,   0,   7, \n    194,   0,  16,   0,   3,   0, \n      0,   0,   6,   4,  16,   0, \n      3,   0,   0,   0, 166,  14, \n     16,   0,   3,   0,   0,   0, \n     41,   0,   0,  10,  50,   0, \n     16,   0,   4,   0,   0,   0, \n    230,  10,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10, 194,   0,  16,   0, \n      3,   0,   0,   0, 166,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,  60,   0,   0,   7, \n    194,   0,  16,   0,   3,   0, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,   6,   4, \n     16,   0,   4,   0,   0,   0, \n     87,   0,   0,   7, 194,   0, \n     16,   0,   3,   0,   0,   0, \n    166,  14,  16,   0,   4,   0, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,  30,   0, \n      0,   7,  50,   0,  16,   0, \n      3,   0,   0,   0,  70,   0, \n     16,   0,   3,   0,   0,   0, \n    230,  10,  16,   0,   3,   0, \n      0,   0,  41,   0,   0,  10, \n     50,   0,  16,   0,   3,   0, \n      0,   0,  70,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  82,   0, \n     16,   0,   3,   0,   0,   0, \n      6,   1,  16,   0,   1,   0, \n      0,   0,   6,   1,  16,   0, \n      3,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  21,   0, \n      0,   0,  21,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     32,   0,   0,  10,  50,   0, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   4,   0,   0,   0,   4, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,  12,  50,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   1,   4, \n      0,   0,   1,   4,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,  55,   0, \n      0,  15, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,   4, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0, 255,   7, \n      0,   0, 255,   7,   0,   0, \n    255, 255,   0,   0, 255, 255, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  87,   0, \n      0,   7,  50,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   4,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n     41,   0,   0,  10,  50,   0, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   4,   0,   0,   0, \n     87,   0,   0,   7,  50,   0, \n     16,   0,   1,   0,   0,   0, \n    230,  10,  16,   0,   4,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  50,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  60,   0,   0,  10, \n    162,   0,  16,   0,   3,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 255, 127,   0,   0, \n      0,   0,   0,   0, 255, 127, \n      1,   0,   0,  10,  50,   0, \n     16,   0,   1,   0,   0,   0, \n    230,  10,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,  11,   0, \n      0,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   9,   0, \n      0,   0,   9,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0, 230,  14,  16,   0, \n      2,   0,   0,   0,  32,   0, \n      0,  10,  50,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   2, \n      0,   0,   0,   2,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,  12, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   1,   2,   0,   0, \n      1,   2,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  55,   0,   0,  15, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,   4,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255, 255, \n      0,   0, 255, 255,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   5,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   4,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,  41,   0, \n      0,  10,  50,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   6,   0, \n      0,   0,   6,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,  87,   0, \n      0,   7,  50,   0,  16,   0, \n      1,   0,   0,   0, 230,  10, \n     16,   0,   5,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      4,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n    138,   0,   0,  15,  50,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 230,  10, \n     16,   0,   2,   0,   0,   0, \n     32,   0,   0,  10,  50,   0, \n     16,   0,   4,   0,   0,   0, \n    230,  10,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   4,   0,   0,   0,   4, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,  12,  50,   0,  16,   0, \n      4,   0,   0,   0,  70,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   1,   4, \n      0,   0,   1,   4,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 230,  10,  16,   0, \n      4,   0,   0,   0,  55,   0, \n      0,  15, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,   4, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0, 255,   7, \n      0,   0, 255,   7,   0,   0, \n    255, 255,   0,   0, 255, 255, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  87,   0, \n      0,   7,  50,   0,  16,   0, \n      4,   0,   0,   0,  70,   0, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   5,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   4,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   4,   0,   0,   0, \n     41,   0,   0,  10, 194,   0, \n     16,   0,   4,   0,   0,   0, \n      6,   4,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      4,   0,   0,   0,  70,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   4,   0, \n      0,   0,  70,   0,  16,   0, \n      4,   0,   0,   0, 230,  10, \n     16,   0,   4,   0,   0,   0, \n     87,   0,   0,   7,  50,   0, \n     16,   0,   4,   0,   0,   0, \n    230,  10,  16,   0,   5,   0, \n      0,   0,  70,   0,  16,   0, \n      4,   0,   0,   0,  30,   0, \n      0,   7,  50,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,   4,   0, \n      0,   0,  41,   0,   0,  10, \n     50,   0,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  82,   0, \n     16,   0,   4,   0,   0,   0, \n      6,   1,  16,   0,   1,   0, \n      0,   0,   6,   1,  16,   0, \n      2,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      1,   0,   0,   0, 230,  10, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  21,   0, \n      0,   0,  21,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     32,   0,   0,  10, 194,   0, \n     16,   0,   2,   0,   0,   0, \n      6,   4,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   4,   0,   0, \n      0,   4,   0,   0,  55,   0, \n      0,  12,  50,   0,  16,   0, \n      1,   0,   0,   0, 230,  10, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   1,   4, \n      0,   0,   1,   4,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,  55,   0, \n      0,  15, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,   4, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0, 255,   7, \n      0,   0, 255,   7,   0,   0, \n    255, 255,   0,   0, 255, 255, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  87,   0, \n      0,   7,  50,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   5,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n     41,   0,   0,  10, 194,   0, \n     16,   0,   2,   0,   0,   0, \n      6,   4,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0, 230,  10, \n     16,   0,   2,   0,   0,   0, \n     87,   0,   0,   7,  50,   0, \n     16,   0,   1,   0,   0,   0, \n    230,  10,  16,   0,   5,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  50,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  60,   0,   0,  10, \n    162,   0,  16,   0,   4,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 255, 127,   0,   0, \n      0,   0,   0,   0, 255, 127, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  30,   0,   0,  10, \n    178,   0,  16,   0,   1,   0, \n      0,   0, 166,  10,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     32,   0,   0,   0,   0,   0, \n      0,   0,  48,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n      1,   0,   0,  10,  50,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,  11,   0, \n      0,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   9,   0, \n      0,   0,   9,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  70,   4,  16,   0, \n      2,   0,   0,   0,  32,   0, \n      0,  10, 194,   0,  16,   0, \n      0,   0,   0,   0,   6,   4, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   2,   0,   0,   0,   2, \n      0,   0,  55,   0,   0,  12, \n     50,   0,  16,   0,   0,   0, \n      0,   0, 230,  10,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   1,   2,   0,   0, \n      1,   2,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0,  55,   0,   0,  15, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,   4,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255, 255, \n      0,   0, 255, 255,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   4,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   3,   0, \n      0,   0,  70,   0,  16,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 194,   0,  16,   0, \n      0,   0,   0,   0,   6,   4, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      6,   0,   0,   0,   6,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0, 230,  10,  16,   0, \n      0,   0,   0,   0,  87,   0, \n      0,   7,  50,   0,  16,   0, \n      0,   0,   0,   0, 230,  10, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      3,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n    138,   0,   0,  15, 194,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  20,   0,   0,   0, \n     20,   0,   0,   0,   6,   4, \n     16,   0,   2,   0,   0,   0, \n     32,   0,   0,  10,  50,   0, \n     16,   0,   3,   0,   0,   0, \n    230,  10,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   4,   0,   0,   0,   4, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,  12,  50,   0,  16,   0, \n      3,   0,   0,   0,  70,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   1,   4, \n      0,   0,   1,   4,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 230,  10,  16,   0, \n      3,   0,   0,   0,  55,   0, \n      0,  15, 242,   0,  16,   0, \n      4,   0,   0,   0, 230,  14, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0, 255,   7, \n      0,   0, 255,   7,   0,   0, \n    255, 255,   0,   0, 255, 255, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  87,   0, \n      0,   7,  50,   0,  16,   0, \n      3,   0,   0,   0,  70,   0, \n     16,   0,   3,   0,   0,   0, \n     70,   0,  16,   0,   4,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   3,   0, \n      0,   0, 230,  10,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   3,   0,   0,   0, \n     41,   0,   0,  10, 194,   0, \n     16,   0,   3,   0,   0,   0, \n      6,   4,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      3,   0,   0,   0,  70,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   3,   0, \n      0,   0,  70,   0,  16,   0, \n      3,   0,   0,   0, 230,  10, \n     16,   0,   3,   0,   0,   0, \n     87,   0,   0,   7,  50,   0, \n     16,   0,   3,   0,   0,   0, \n    230,  10,  16,   0,   4,   0, \n      0,   0,  70,   0,  16,   0, \n      3,   0,   0,   0,  30,   0, \n      0,   7, 194,   0,  16,   0, \n      0,   0,   0,   0, 166,  14, \n     16,   0,   0,   0,   0,   0, \n      6,   4,  16,   0,   3,   0, \n      0,   0,  41,   0,   0,  10, \n    194,   0,  16,   0,   0,   0, \n      0,   0, 166,  14,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     60,   0,   0,   7,  82,   0, \n     16,   0,   0,   0,   0,   0, \n    166,  11,  16,   0,   0,   0, \n      0,   0,   6,   1,  16,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  21,   0, \n      0,   0,  21,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   3,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     32,   0,   0,  10, 194,   0, \n     16,   0,   3,   0,   0,   0, \n      6,   4,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   4,   0,   0, \n      0,   4,   0,   0,  55,   0, \n      0,  12,  50,   0,  16,   0, \n      2,   0,   0,   0, 230,  10, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   1,   4, \n      0,   0,   1,   4,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,  55,   0, \n      0,  15, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,   4, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0, 255,   7, \n      0,   0, 255,   7,   0,   0, \n    255, 255,   0,   0, 255, 255, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  87,   0, \n      0,   7,  50,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,   4,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      3,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     41,   0,   0,  10, 194,   0, \n     16,   0,   3,   0,   0,   0, \n      6,   4,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0, 230,  10, \n     16,   0,   3,   0,   0,   0, \n     87,   0,   0,   7,  50,   0, \n     16,   0,   2,   0,   0,   0, \n    230,  10,  16,   0,   4,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,  30,   0, \n      0,   7,  50,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   3,   0,   0,   0, \n     70,   0,  16,   0,   2,   0, \n      0,   0,  60,   0,   0,  10, \n    162,   0,  16,   0,   0,   0, \n      0,   0,   6,   4,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 255, 127,   0,   0, \n      0,   0,   0,   0, 255, 127, \n      1,   0,   0,  10,  50,   0, \n     16,   0,   2,   0,   0,   0, \n    230,  10,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   3,   0,   0, 255,   3, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,  11,   0, \n      0,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,   9,   0, \n      0,   0,   9,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0, 230,  14,  16,   0, \n      2,   0,   0,   0,  32,   0, \n      0,  10,  50,   0,  16,   0, \n      4,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   2, \n      0,   0,   0,   2,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,  12, \n     50,   0,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   1,   2,   0,   0, \n      1,   2,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   2,   0, \n      0,   0,  55,   0,   0,  15, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,   4,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255, 255, \n      0,   0, 255, 255,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     50,   0,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   4,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,   3,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,  41,   0, \n      0,  10,  50,   0,  16,   0, \n      4,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   6,   0, \n      0,   0,   6,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      4,   0,   0,   0,  87,   0, \n      0,   7,  50,   0,  16,   0, \n      2,   0,   0,   0, 230,  10, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   2,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      3,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n    138,   0,   0,  15,  50,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n     20,   0,   0,   0,  20,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 230,  10, \n     16,   0,   2,   0,   0,   0, \n     32,   0,   0,  10,  50,   0, \n     16,   0,   4,   0,   0,   0, \n    230,  10,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   4,   0,   0,   0,   4, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,  12, 194,   0,  16,   0, \n      3,   0,   0,   0,   6,   4, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   4,   0,   0,   1,   4, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,  55,   0, \n      0,  15, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,   4, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0, 255,   7, \n      0,   0, 255,   7,   0,   0, \n    255, 255,   0,   0, 255, 255, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  87,   0, \n      0,   7, 194,   0,  16,   0, \n      3,   0,   0,   0, 166,  14, \n     16,   0,   3,   0,   0,   0, \n      6,   4,  16,   0,   4,   0, \n      0,   0,  30,   0,   0,   7, \n    194,   0,  16,   0,   3,   0, \n      0,   0,   6,   4,  16,   0, \n      3,   0,   0,   0, 166,  14, \n     16,   0,   3,   0,   0,   0, \n     41,   0,   0,  10,  50,   0, \n     16,   0,   4,   0,   0,   0, \n    230,  10,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10, 194,   0,  16,   0, \n      3,   0,   0,   0, 166,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,  60,   0,   0,   7, \n    194,   0,  16,   0,   3,   0, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,   6,   4, \n     16,   0,   4,   0,   0,   0, \n     87,   0,   0,   7, 194,   0, \n     16,   0,   3,   0,   0,   0, \n    166,  14,  16,   0,   4,   0, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,  30,   0, \n      0,   7,  50,   0,  16,   0, \n      3,   0,   0,   0,  70,   0, \n     16,   0,   3,   0,   0,   0, \n    230,  10,  16,   0,   3,   0, \n      0,   0,  41,   0,   0,  10, \n     50,   0,  16,   0,   3,   0, \n      0,   0,  70,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  82,   0, \n     16,   0,   3,   0,   0,   0, \n      6,   1,  16,   0,   2,   0, \n      0,   0,   6,   1,  16,   0, \n      3,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      2,   0,   0,   0, 230,  10, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  21,   0, \n      0,   0,  21,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n    194,   0,  16,   0,   2,   0, \n      0,   0,   6,   4,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     32,   0,   0,  10,  50,   0, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   4,   0,   0,   0,   4, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,  12,  50,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   1,   4, \n      0,   0,   1,   4,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,  55,   0, \n      0,  15, 242,   0,  16,   0, \n      4,   0,   0,   0, 230,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0, 255,   7, \n      0,   0, 255,   7,   0,   0, \n    255, 255,   0,   0, 255, 255, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  87,   0, \n      0,   7,  50,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,   4,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   2,   0, \n      0,   0, 230,  10,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     41,   0,   0,  10,  50,   0, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   4,   0,   0,   0, \n     87,   0,   0,   7,  50,   0, \n     16,   0,   2,   0,   0,   0, \n    230,  10,  16,   0,   4,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,  30,   0, \n      0,   7,  50,   0,  16,   0, \n      2,   0,   0,   0, 230,  10, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,   2,   0, \n      0,   0,  60,   0,   0,  10, \n    162,   0,  16,   0,   3,   0, \n      0,   0,   6,   4,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 255, 127,   0,   0, \n      0,   0,   0,   0, 255, 127, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   0,   0, \n      0,   0, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  62,   0, \n      0,   1,  83,  84,  65,  84, \n    148,   0,   0,   0, 247,   0, \n      0,   0,   6,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     82,   0,   0,   0,  89,   0, \n      0,   0,   3,   0,   0,   0, \n      6,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     24,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   4,   0, \n      0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_r11g11b10_rgba16_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 7\ndcl_thread_group 4, 32, 1\nand r0.xy, CB0[0][0].xxxx, l(1, 2, 0, 0)\nishl r1.x, vThreadID.x, l(3)\nmov r1.y, vThreadID.y\nuge r0.zw, r1.xxxy, CB0[0][1].xxxy\nor r0.z, r0.w, r0.z\nif_nz r0.z\n  ret \nendif \nubfe r0.z, l(2), l(2), CB0[0][0].x\nishl r0.w, r1.x, l(3)\nimad r1.y, vThreadID.z, CB0[0][1].y, vThreadID.y\nimad r0.w, r1.y, CB0[0][2].x, r0.w\niadd r0.w, r0.w, CB0[0][1].w\nif_z r0.x\n  imad r1.y, CB0[0][0].w, vThreadID.z, vThreadID.y\n  imad r1.y, CB0[0][0].z, r1.y, r1.x\n  ishl r1.y, r1.y, l(2)\nelse \n  if_nz r0.y\n    ushr r1.zw, CB0[0][0].zzzw, l(0, 0, 5, 4)\n    ishr r2.xyzw, vThreadID.zyyy, l(2, 4, 1, 3)\n    imad r0.y, r2.x, r1.w, r2.y\n    ibfe r1.w, l(27), l(2), vThreadID.x\n    imad r0.y, r0.y, r1.z, r1.w\n    bfi r1.zw, l(0, 0, 2, 1), l(0, 0, 5, 4), vThreadID.zzzy, l(0, 0, 0, 0)\n    bfi r2.y, l(2), l(3), r2.z, l(0)\n    iadd r1.z, r1.z, r2.y\n    bfi r0.y, l(25), l(7), r0.y, r1.z\n    xor r1.z, r2.x, r2.w\n    ubfe r2.x, l(2), l(3), r1.x\n    bfi r2.yz, l(0, 1, 1, 0), l(0, 1, 11, 0), r1.zzzz, l(0, 0, 0, 0)\n    xor r1.z, r2.y, r2.x\n    imad r1.z, r1.z, l(64), r1.w\n    iadd r1.z, r2.z, r1.z\n    ibfe r2.xy, l(27, 24, 0, 0), l(3, 6, 0, 0), r0.yyyy\n    bfi r0.y, l(3), l(8), r2.x, r1.z\n    bfi r1.y, l(20), l(12), r2.y, r0.y\n  else \n    ushr r0.y, CB0[0][0].z, l(5)\n    ishr r2.xyzw, vThreadID.yyyy, l(5, 1, 4, 3)\n    ibfe r1.z, l(27), l(2), vThreadID.x\n    imad r0.y, r2.x, r0.y, r1.z\n    bfi r2.xyz, l(3, 1, 1, 0), l(3, 1, 11, 0), r2.ywzy, l(0, 0, 0, 0)\n    bfi r0.y, l(26), l(6), r0.y, r2.x\n    ubfe r1.x, l(2), l(3), r1.x\n    xor r1.x, r2.y, r1.x\n    bfi r1.z, l(1), l(4), vThreadID.y, l(0)\n    imad r1.x, r1.x, l(64), r1.z\n    iadd r1.x, r2.z, r1.x\n    ibfe r1.zw, l(0, 0, 27, 24), l(0, 0, 3, 6), r0.yyyy\n    bfi r0.y, l(3), l(8), r1.z, r1.x\n    bfi r1.y, l(20), l(12), r1.w, r0.y\n  endif \nendif \niadd r0.y, r1.y, CB0[0][0].y\nld_raw r1.xyzw, r0.y, T0[0].zwxy\nieq r2.xyz, r0.zzzz, l(1, 2, 3, 0)\nor r2.xy, r2.yzyy, r2.xyxx\nif_nz r2.x\n  ishl r3.xyzw, r1.zwxy, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r1.zwxy, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r1.xyzw, r3.zwxy, r4.zwxy\nendif \nif_nz r2.y\n  ushr r3.xyzw, r1.zwxy, l(16, 16, 16, 16)\n  bfi r1.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r1.xyzw, r3.zwxy\n  mov r3.xy, r1.zwzz\nelse \n  mov r3.xy, r1.zwzz\nendif \nushr r4.xyzw, r3.xyxy, l(22, 22, 1, 1)\nmov r3.zw, r4.xxxy\nbfi r5.xyzw, l(11, 26, 11, 26), l(5, 6, 5, 6), r3.xzyw, l(0, 0, 0, 0)\nubfe r6.xyzw, l(5, 6, 5, 6), l(6, 26, 6, 26), r3.xxyy\niadd r5.xyzw, r5.xyzw, r6.xyzw\nishl r2.zw, r3.xxxy, l(0, 0, 10, 10)\nand r3.xy, r4.zwzz, l(0x001f0000, 0x001f0000, 0, 0)\nbfi r2.zw, l(0, 0, 21, 21), l(0, 0, 0, 0), r3.xxxy, r2.zzzw\niadd r3.xz, r2.zzwz, r5.xxzx\niadd r3.yw, r5.yyyw, l(0, 0xffff0000, 0, 0xffff0000)\nushr r4.xyzw, r1.xyxy, l(22, 22, 1, 1)\nmov r1.zw, r4.xxxy\nbfi r5.xyzw, l(11, 26, 11, 26), l(5, 6, 5, 6), r1.xzyw, l(0, 0, 0, 0)\nubfe r6.xyzw, l(5, 6, 5, 6), l(6, 26, 6, 26), r1.xxyy\niadd r5.xyzw, r5.xyzw, r6.xyzw\nishl r1.xy, r1.xyxx, l(10, 10, 0, 0)\nand r1.zw, r4.zzzw, l(0, 0, 0x001f0000, 0x001f0000)\nbfi r1.xy, l(21, 21, 0, 0), l(0, 0, 0, 0), r1.zwzz, r1.xyxx\niadd r1.xz, r1.xxyx, r5.xxzx\niadd r1.yw, r5.yyyw, l(0, 0xffff0000, 0, 0xffff0000)\nstore_raw U0[0].xyzw, r0.w, r3.xyzw\niadd r3.xyz, r0.wwww, l(16, 32, 48, 0)\nstore_raw U0[0].xyzw, r3.x, r1.xyzw\nif_nz r0.x\n  mov r0.x, l(32)\nelse \n  mov r0.x, l(16)\nendif \niadd r0.x, r0.x, r0.y\nld_raw r1.xyzw, r0.x, T0[0].zwxy\nif_nz r2.x\n  ishl r4.xyzw, r1.zwxy, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r5.xyzw, r1.zwxy, l(8, 8, 8, 8)\n  and r5.xyzw, r5.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r1.xyzw, r4.zwxy, r5.zwxy\nendif \nif_nz r2.y\n  ushr r2.xyzw, r1.zwxy, l(16, 16, 16, 16)\n  bfi r1.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r1.xyzw, r2.zwxy\n  mov r2.xy, r1.zwzz\nelse \n  mov r2.xy, r1.zwzz\nendif \nushr r4.xyzw, r2.xyxy, l(22, 22, 1, 1)\nmov r2.zw, r4.xxxy\nbfi r5.xyzw, l(11, 26, 11, 26), l(5, 6, 5, 6), r2.xzyw, l(0, 0, 0, 0)\nubfe r6.xyzw, l(5, 6, 5, 6), l(6, 26, 6, 26), r2.xxyy\niadd r5.xyzw, r5.xyzw, r6.xyzw\nishl r0.xy, r2.xyxx, l(10, 10, 0, 0)\nand r2.xy, r4.zwzz, l(0x001f0000, 0x001f0000, 0, 0)\nbfi r0.xy, l(21, 21, 0, 0), l(0, 0, 0, 0), r2.xyxx, r0.xyxx\niadd r2.xz, r0.xxyx, r5.xxzx\niadd r2.yw, r5.yyyw, l(0, 0xffff0000, 0, 0xffff0000)\nushr r4.xyzw, r1.xyxy, l(22, 22, 1, 1)\nmov r1.zw, r4.xxxy\nbfi r5.xyzw, l(11, 26, 11, 26), l(5, 6, 5, 6), r1.xzyw, l(0, 0, 0, 0)\nubfe r6.xyzw, l(5, 6, 5, 6), l(6, 26, 6, 26), r1.xxyy\niadd r5.xyzw, r5.xyzw, r6.xyzw\nishl r0.xy, r1.xyxx, l(10, 10, 0, 0)\nand r1.xy, r4.zwzz, l(0x001f0000, 0x001f0000, 0, 0)\nbfi r0.xy, l(21, 21, 0, 0), l(0, 0, 0, 0), r1.xyxx, r0.xyxx\niadd r1.xz, r0.xxyx, r5.xxzx\niadd r1.yw, r5.yyyw, l(0, 0xffff0000, 0, 0xffff0000)\nstore_raw U0[0].xyzw, r3.y, r2.xyzw\nstore_raw U0[0].xyzw, r3.z, r1.xyzw\nret \n// Approximately 139 instruction slots used\n#endif\n\nconst BYTE texture_load_r11g11b10_rgba16_cs[] =\n{\n     68,  88,  66,  67,  97,  54, \n    248, 220, 239,  68, 239,  88, \n    232, 186,  39, 239, 216,   0, \n    166, 231,   1,   0,   0,   0, \n     16,  24,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n    116,  23,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n     56,  19,   0,   0,  81,   0, \n      5,   0, 206,   4,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   7,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  12,  50,   0,  16,   0, \n      0,   0,   0,   0,   6, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n    194,   0,  16,   0,   0,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0,   6, 132, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  11, \n     66,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,   2,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,  11, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  31,   0, \n      0,   3,  10,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  58, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  42,   0,   2,   0, \n     26,   0,   2,   0,  35,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     41,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  18,   0, \n      0,   1,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,  12, \n    194,   0,  16,   0,   1,   0, \n      0,   0, 166, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0,  42,   0,   0,   9, \n    242,   0,  16,   0,   2,   0, \n      0,   0, 102,   5,   2,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      1,   0,   0,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 139,   0,   0,   8, \n    130,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     27,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10,   0,   2,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  19, 194,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0, 166,   6,   2,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     25,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  87,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0, 138,   0,   0,   9, \n     18,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  20, \n     98,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  11,   0, \n      0,   0,   0,   0,   0,   0, \n    166,  10,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  87,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  64,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    139,   0,   0,  15,  50,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  27,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  18,   0, \n      0,   1,  85,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  42,   0,   0,   9, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  86,   5,   2,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   1,   0,   0,   0, \n      4,   0,   0,   0,   3,   0, \n      0,   0, 139,   0,   0,   8, \n     66,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     27,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10,   0,   2,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  20, 114,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0, 214,   6,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  26,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0, 138,   0,   0,   9, \n     18,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  87,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  10,  66,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  26,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  64,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 139,   0,   0,  15, \n    194,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  27,   0,   0,   0, \n     24,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  21,   0, \n      0,   1,  30,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0, 230, 116, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  32,   0, \n      0,  10, 114,   0,  16,   0, \n      2,   0,   0,   0, 166,  10, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   2,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   2,   0, \n      0,   0, 150,   5,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n    230,   4,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,  85,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0, 230,   4,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      1,   0,   0,   0, 230,   4, \n     16,   0,   3,   0,   0,   0, \n    230,   4,  16,   0,   4,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n    230,   4,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0, 230,   4, \n     16,   0,   3,   0,   0,   0, \n     54,   0,   0,   5,  50,   0, \n     16,   0,   3,   0,   0,   0, \n    230,  10,  16,   0,   1,   0, \n      0,   0,  18,   0,   0,   1, \n     54,   0,   0,   5,  50,   0, \n     16,   0,   3,   0,   0,   0, \n    230,  10,  16,   0,   1,   0, \n      0,   0,  21,   0,   0,   1, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,   4,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n     22,   0,   0,   0,  22,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,  54,   0, \n      0,   5, 194,   0,  16,   0, \n      3,   0,   0,   0,   6,   4, \n     16,   0,   4,   0,   0,   0, \n    140,   0,   0,  20, 242,   0, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,  11,   0, \n      0,   0,  26,   0,   0,   0, \n     11,   0,   0,   0,  26,   0, \n      0,   0,   2,  64,   0,   0, \n      5,   0,   0,   0,   6,   0, \n      0,   0,   5,   0,   0,   0, \n      6,   0,   0,   0, 134,  13, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      5,   0,   0,   0,   6,   0, \n      0,   0,   5,   0,   0,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   6,   0,   0,   0, \n     26,   0,   0,   0,   6,   0, \n      0,   0,  26,   0,   0,   0, \n      6,   5,  16,   0,   3,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     41,   0,   0,  10, 194,   0, \n     16,   0,   2,   0,   0,   0, \n      6,   4,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,   1,   0, \n      0,  10,  50,   0,  16,   0, \n      3,   0,   0,   0, 230,  10, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n     31,   0,   0,   0,  31,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  17, \n    194,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   0, \n     21,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      6,   4,  16,   0,   3,   0, \n      0,   0, 166,  14,  16,   0, \n      2,   0,   0,   0,  30,   0, \n      0,   7,  82,   0,  16,   0, \n      3,   0,   0,   0, 166,  11, \n     16,   0,   2,   0,   0,   0, \n      6,   2,  16,   0,   5,   0, \n      0,   0,  30,   0,   0,  10, \n    162,   0,  16,   0,   3,   0, \n      0,   0,  86,  13,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 255, 255,   0,   0, \n      0,   0,   0,   0, 255, 255, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,   4,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     22,   0,   0,   0,  22,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,  54,   0, \n      0,   5, 194,   0,  16,   0, \n      1,   0,   0,   0,   6,   4, \n     16,   0,   4,   0,   0,   0, \n    140,   0,   0,  20, 242,   0, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,  11,   0, \n      0,   0,  26,   0,   0,   0, \n     11,   0,   0,   0,  26,   0, \n      0,   0,   2,  64,   0,   0, \n      5,   0,   0,   0,   6,   0, \n      0,   0,   5,   0,   0,   0, \n      6,   0,   0,   0, 134,  13, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      5,   0,   0,   0,   6,   0, \n      0,   0,   5,   0,   0,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   6,   0,   0,   0, \n     26,   0,   0,   0,   6,   0, \n      0,   0,  26,   0,   0,   0, \n      6,   5,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   6,   0,   0,   0, \n     41,   0,   0,  10,  50,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10, 194,   0,  16,   0, \n      1,   0,   0,   0, 166,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  31,   0,   0,   0, \n     31,   0, 140,   0,   0,  17, \n     50,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     21,   0,   0,   0,  21,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    230,  10,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  82,   0,  16,   0, \n      1,   0,   0,   0,   6,   1, \n     16,   0,   1,   0,   0,   0, \n      6,   2,  16,   0,   5,   0, \n      0,   0,  30,   0,   0,  10, \n    162,   0,  16,   0,   1,   0, \n      0,   0,  86,  13,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 255, 255,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  30,   0,   0,  10, \n    114,   0,  16,   0,   3,   0, \n      0,   0, 246,  15,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     32,   0,   0,   0,  48,   0, \n      0,   0,   0,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     32,   0,   0,   0,  18,   0, \n      0,   1,  54,   0,   0,   5, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0,  21,   0, \n      0,   1,  30,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0, 230, 116,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0, 230,   4,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0, 230,   4, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,   2,  64, \n      0,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   1,   0,   0,   0, \n    230,   4,  16,   0,   4,   0, \n      0,   0, 230,   4,  16,   0, \n      5,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0, 230,   4,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n    230,   4,  16,   0,   2,   0, \n      0,   0,  54,   0,   0,   5, \n     50,   0,  16,   0,   2,   0, \n      0,   0, 230,  10,  16,   0, \n      1,   0,   0,   0,  18,   0, \n      0,   1,  54,   0,   0,   5, \n     50,   0,  16,   0,   2,   0, \n      0,   0, 230,  10,  16,   0, \n      1,   0,   0,   0,  21,   0, \n      0,   1,  85,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,   4,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  22,   0,   0,   0, \n     22,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n     54,   0,   0,   5, 194,   0, \n     16,   0,   2,   0,   0,   0, \n      6,   4,  16,   0,   4,   0, \n      0,   0, 140,   0,   0,  20, \n    242,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n     11,   0,   0,   0,  26,   0, \n      0,   0,  11,   0,   0,   0, \n     26,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n      6,   0,   0,   0,   5,   0, \n      0,   0,   6,   0,   0,   0, \n    134,  13,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n      6,   0,   0,   0,   5,   0, \n      0,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   6,   0, \n      0,   0,  26,   0,   0,   0, \n      6,   0,   0,   0,  26,   0, \n      0,   0,   6,   5,  16,   0, \n      2,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  41,   0,   0,  10, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10,  50,   0, \n     16,   0,   2,   0,   0,   0, \n    230,  10,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,  31,   0,   0,   0, \n     31,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  17,  50,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,  21,   0,   0,   0, \n     21,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  82,   0, \n     16,   0,   2,   0,   0,   0, \n      6,   1,  16,   0,   0,   0, \n      0,   0,   6,   2,  16,   0, \n      5,   0,   0,   0,  30,   0, \n      0,  10, 162,   0,  16,   0, \n      2,   0,   0,   0,  86,  13, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0, 255, 255, \n      0,   0,   0,   0,   0,   0, \n    255, 255,  85,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,   4,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  22,   0,   0,   0, \n     22,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n     54,   0,   0,   5, 194,   0, \n     16,   0,   1,   0,   0,   0, \n      6,   4,  16,   0,   4,   0, \n      0,   0, 140,   0,   0,  20, \n    242,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n     11,   0,   0,   0,  26,   0, \n      0,   0,  11,   0,   0,   0, \n     26,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n      6,   0,   0,   0,   5,   0, \n      0,   0,   6,   0,   0,   0, \n    134,  13,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n      6,   0,   0,   0,   5,   0, \n      0,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   6,   0, \n      0,   0,  26,   0,   0,   0, \n      6,   0,   0,   0,  26,   0, \n      0,   0,   6,   5,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  41,   0,   0,  10, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10,  50,   0, \n     16,   0,   1,   0,   0,   0, \n    230,  10,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,  31,   0,   0,   0, \n     31,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  17,  50,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,  21,   0,   0,   0, \n     21,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  82,   0, \n     16,   0,   1,   0,   0,   0, \n      6,   1,  16,   0,   0,   0, \n      0,   0,   6,   2,  16,   0, \n      5,   0,   0,   0,  30,   0, \n      0,  10, 162,   0,  16,   0, \n      1,   0,   0,   0,  86,  13, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0, 255, 255, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     62,   0,   0,   1,  83,  84, \n     65,  84, 148,   0,   0,   0, \n    139,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  42,   0,   0,   0, \n     25,   0,   0,   0,   7,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  11,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_r11g11b10_rgba16_scaled_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 7\ndcl_thread_group 4, 32, 1\nand r0.x, CB0[0][0].x, l(2)\nishl r1.x, vThreadID.x, l(3)\nmov r1.y, vThreadID.y\nuge r0.yz, r1.xxyx, CB0[0][1].xxyx\nor r0.y, r0.z, r0.y\nif_nz r0.y\n  ret \nendif \nubfe r0.yzw, l(0, 2, 3, 3), l(0, 2, 4, 7), CB0[0][0].xxxx\nishl r1.z, r1.x, l(3)\nimad r1.w, vThreadID.z, CB0[0][1].y, vThreadID.y\nimad r1.z, r1.w, CB0[0][2].x, r1.z\niadd r1.z, r1.z, CB0[0][1].w\nushr r1.yw, r1.xxxy, l(0, 4, 0, 1)\nudiv r2.xyzw, null, r1.wyww, r0.wzww\nimad r1.yw, -r0.zzzw, r2.yyyw, r1.yyyw\nishl r3.x, r2.y, l(4)\nimad r1.y, r1.y, r0.w, r1.w\nbfi r1.w, l(1), l(6), vThreadID.y, l(0)\nbfi r1.y, l(25), l(7), r1.y, r1.w\nbfi r1.x, l(4), l(2), r1.x, l(0)\niadd r1.x, r1.y, r1.x\nif_nz r0.x\n  ushr r1.yw, CB0[0][0].zzzw, l(0, 5, 0, 4)\n  ishr r0.x, vThreadID.z, l(2)\n  ibfe r4.xyzw, l(28, 27, 31, 29), l(3, 1, 0, 2), r2.wyww\n  imad r1.w, r0.x, r1.w, r4.x\n  imad r1.y, r1.w, r1.y, r4.y\n  bfi r1.w, l(2), l(5), vThreadID.z, l(0)\n  bfi r3.y, l(2), l(3), r4.z, l(0)\n  iadd r1.w, r1.w, r3.y\n  bfi r1.y, l(25), l(7), r1.y, r1.w\n  xor r0.x, r0.x, r4.w\n  ishr r1.w, r3.x, l(3)\n  and r1.w, r1.w, l(2)\n  bfi r3.yz, l(0, 1, 1, 0), l(0, 1, 11, 0), r0.xxxx, l(0, 0, 0, 0)\n  xor r0.x, r1.w, r3.y\n  ishl r0.x, r0.x, l(6)\n  iadd r0.x, r3.z, r0.x\n  ibfe r1.yw, l(0, 27, 0, 24), l(0, 3, 0, 6), r1.yyyy\n  bfi r0.x, l(3), l(8), r1.y, r0.x\n  bfi r0.x, l(20), l(12), r1.w, r0.x\nelse \n  ushr r1.y, CB0[0][0].z, l(5)\n  ibfe r4.xyzw, l(27, 27, 31, 28), l(4, 1, 0, 3), r2.xyzw\n  imad r1.y, r4.x, r1.y, r4.y\n  bfi r2.xy, l(3, 1, 0, 0), l(3, 11, 0, 0), r4.zwzz, l(0, 0, 0, 0)\n  bfi r1.y, l(26), l(6), r1.y, r2.x\n  ishr r1.w, r3.x, l(3)\n  and r1.w, r1.w, l(2)\n  ibfe r2.x, l(29), l(2), r2.w\n  bfi r2.x, l(1), l(1), r2.x, l(0)\n  xor r1.w, r1.w, r2.x\n  ishl r1.w, r1.w, l(6)\n  iadd r1.w, r2.y, r1.w\n  ibfe r2.xy, l(27, 24, 0, 0), l(3, 6, 0, 0), r1.yyyy\n  bfi r1.y, l(3), l(8), r2.x, r1.w\n  bfi r0.x, l(20), l(12), r2.y, r1.y\nendif \nimul null, r0.z, r0.w, r0.z\nimad r0.x, r0.x, r0.z, r1.x\niadd r0.x, r0.x, CB0[0][0].y\nld_raw r2.xyzw, r0.x, T0[0].zwxy\nieq r0.yzw, r0.yyyy, l(0, 1, 2, 3)\nor r0.yz, r0.zzwz, r0.yyzy\nif_nz r0.y\n  ishl r3.xyzw, r2.zwxy, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r2.zwxy, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r2.xyzw, r3.zwxy, r4.zwxy\nendif \nif_nz r0.z\n  ushr r3.xyzw, r2.zwxy, l(16, 16, 16, 16)\n  bfi r2.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r2.xyzw, r3.zwxy\n  mov r3.xy, r2.zwzz\nelse \n  mov r3.xy, r2.zwzz\nendif \nushr r4.xyzw, r3.xyxy, l(22, 22, 1, 1)\nmov r3.zw, r4.xxxy\nbfi r5.xyzw, l(11, 26, 11, 26), l(5, 6, 5, 6), r3.xzyw, l(0, 0, 0, 0)\nubfe r6.xyzw, l(5, 6, 5, 6), l(6, 26, 6, 26), r3.xxyy\niadd r5.xyzw, r5.xyzw, r6.xyzw\nishl r1.xy, r3.xyxx, l(10, 10, 0, 0)\nand r3.xy, r4.zwzz, l(0x001f0000, 0x001f0000, 0, 0)\nbfi r1.xy, l(21, 21, 0, 0), l(0, 0, 0, 0), r3.xyxx, r1.xyxx\niadd r3.xz, r1.xxyx, r5.xxzx\niadd r3.yw, r5.yyyw, l(0, 0xffff0000, 0, 0xffff0000)\nushr r4.xyzw, r2.xyxy, l(22, 22, 1, 1)\nmov r2.zw, r4.xxxy\nbfi r5.xyzw, l(11, 26, 11, 26), l(5, 6, 5, 6), r2.xzyw, l(0, 0, 0, 0)\nubfe r6.xyzw, l(5, 6, 5, 6), l(6, 26, 6, 26), r2.xxyy\niadd r5.xyzw, r5.xyzw, r6.xyzw\nishl r1.xy, r2.xyxx, l(10, 10, 0, 0)\nand r2.xy, r4.zwzz, l(0x001f0000, 0x001f0000, 0, 0)\nbfi r1.xy, l(21, 21, 0, 0), l(0, 0, 0, 0), r2.xyxx, r1.xyxx\niadd r2.xz, r1.xxyx, r5.xxzx\niadd r2.yw, r5.yyyw, l(0, 0xffff0000, 0, 0xffff0000)\nstore_raw U0[0].xyzw, r1.z, r3.xyzw\niadd r1.xyw, r1.zzzz, l(16, 32, 0, 48)\nstore_raw U0[0].xyzw, r1.x, r2.xyzw\niadd r0.x, r0.x, l(16)\nld_raw r2.xyzw, r0.x, T0[0].zwxy\nif_nz r0.y\n  ishl r3.xyzw, r2.zwxy, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r2.zwxy, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r2.xyzw, r3.zwxy, r4.zwxy\nendif \nif_nz r0.z\n  ushr r0.xyzw, r2.zwxy, l(16, 16, 16, 16)\n  bfi r2.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r2.xyzw, r0.zwxy\n  mov r0.xy, r2.zwzz\nelse \n  mov r0.xy, r2.zwzz\nendif \nushr r3.xyzw, r0.xyxy, l(22, 22, 1, 1)\nmov r0.zw, r3.xxxy\nbfi r4.xyzw, l(11, 26, 11, 26), l(5, 6, 5, 6), r0.xzyw, l(0, 0, 0, 0)\nubfe r5.xyzw, l(5, 6, 5, 6), l(6, 26, 6, 26), r0.xxyy\niadd r4.xyzw, r4.xyzw, r5.xyzw\nishl r0.xy, r0.xyxx, l(10, 10, 0, 0)\nand r0.zw, r3.zzzw, l(0, 0, 0x001f0000, 0x001f0000)\nbfi r0.xy, l(21, 21, 0, 0), l(0, 0, 0, 0), r0.zwzz, r0.xyxx\niadd r0.xz, r0.xxyx, r4.xxzx\niadd r0.yw, r4.yyyw, l(0, 0xffff0000, 0, 0xffff0000)\nushr r3.xyzw, r2.xyxy, l(22, 22, 1, 1)\nmov r2.zw, r3.xxxy\nbfi r4.xyzw, l(11, 26, 11, 26), l(5, 6, 5, 6), r2.xzyw, l(0, 0, 0, 0)\nubfe r5.xyzw, l(5, 6, 5, 6), l(6, 26, 6, 26), r2.xxyy\niadd r4.xyzw, r4.xyzw, r5.xyzw\nishl r2.xy, r2.xyxx, l(10, 10, 0, 0)\nand r2.zw, r3.zzzw, l(0, 0, 0x001f0000, 0x001f0000)\nbfi r2.xy, l(21, 21, 0, 0), l(0, 0, 0, 0), r2.zwzz, r2.xyxx\niadd r2.xz, r2.xxyx, r4.xxzx\niadd r2.yw, r4.yyyw, l(0, 0xffff0000, 0, 0xffff0000)\nstore_raw U0[0].xyzw, r1.y, r0.xyzw\nstore_raw U0[0].xyzw, r1.w, r2.xyzw\nret \n// Approximately 141 instruction slots used\n#endif\n\nconst BYTE texture_load_r11g11b10_rgba16_scaled_cs[] =\n{\n     68,  88,  66,  67,  31, 232, \n    177, 141, 201,  65,  32, 146, \n    125, 246,  43, 191, 239, 106, \n    205, 234,   1,   0,   0,   0, \n     20,  25,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n    120,  24,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n     60,  20,   0,   0,  81,   0, \n      5,   0,  15,   5,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   7,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n     98,   0,  16,   0,   0,   0, \n      0,   0,   6,   1,  16,   0, \n      1,   0,   0,   0,   6, 129, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  17, \n    226,   0,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   7,   0,   0,   0, \n      6, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,   2,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,  11, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   9,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  85,   0, \n      0,  10, 162,   0,  16,   0, \n      1,   0,   0,   0,   6,   4, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  78,   0,   0,   8, \n    242,   0,  16,   0,   2,   0, \n      0,   0,   0, 208,   0,   0, \n    118,  15,  16,   0,   1,   0, \n      0,   0, 182,  15,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,  10, 162,   0,  16,   0, \n      1,   0,   0,   0, 166,  14, \n     16, 128,  65,   0,   0,   0, \n      0,   0,   0,   0,  86,  13, \n     16,   0,   2,   0,   0,   0, \n     86,  13,  16,   0,   1,   0, \n      0,   0,  41,   0,   0,   7, \n     18,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  10, 130,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  26,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  25,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  18,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     85,   0,   0,  12, 162,   0, \n     16,   0,   1,   0,   0,   0, \n    166, 142,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n     42,   0,   0,   6,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,   2,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n    139,   0,   0,  15, 242,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,  28,   0, \n      0,   0,  27,   0,   0,   0, \n     31,   0,   0,   0,  29,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0, 118,  15, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,   9, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n    140,   0,   0,  10, 130,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  42,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      4,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  25,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     87,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,  42,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n    140,   0,   0,  20,  98,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0,   6,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n     41,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0, 139,   0,   0,  15, \n    162,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  27,   0, \n      0,   0,   0,   0,   0,   0, \n     24,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   6,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     18,   0,   0,   1,  85,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0, 139,   0, \n      0,  15, 242,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,  27,   0,   0,   0, \n     27,   0,   0,   0,  31,   0, \n      0,   0,  28,   0,   0,   0, \n      2,  64,   0,   0,   4,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      4,   0,   0,   0, 140,   0, \n      0,  20,  50,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 230,  10,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  26,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0, 139,   0, \n      0,   9,  18,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,  29,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  30,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n    139,   0,   0,  15,  50,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  27,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  21,   0, \n      0,   1,  38,   0,   0,   8, \n      0, 208,   0,   0,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n    230, 116,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     32,   0,   0,  10, 226,   0, \n     16,   0,   0,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   2,   0,   0,   0, \n      3,   0,   0,   0,  60,   0, \n      0,   7,  98,   0,  16,   0, \n      0,   0,   0,   0, 166,  11, \n     16,   0,   0,   0,   0,   0, \n     86,   6,  16,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0, 230,   4,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0, 230,   4, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   2,   0,   0,   0, \n    230,   4,  16,   0,   3,   0, \n      0,   0, 230,   4,  16,   0, \n      4,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0, 230,   4,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n    230,   4,  16,   0,   3,   0, \n      0,   0,  54,   0,   0,   5, \n     50,   0,  16,   0,   3,   0, \n      0,   0, 230,  10,  16,   0, \n      2,   0,   0,   0,  18,   0, \n      0,   1,  54,   0,   0,   5, \n     50,   0,  16,   0,   3,   0, \n      0,   0, 230,  10,  16,   0, \n      2,   0,   0,   0,  21,   0, \n      0,   1,  85,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,   4,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,  22,   0,   0,   0, \n     22,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n     54,   0,   0,   5, 194,   0, \n     16,   0,   3,   0,   0,   0, \n      6,   4,  16,   0,   4,   0, \n      0,   0, 140,   0,   0,  20, \n    242,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n     11,   0,   0,   0,  26,   0, \n      0,   0,  11,   0,   0,   0, \n     26,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n      6,   0,   0,   0,   5,   0, \n      0,   0,   6,   0,   0,   0, \n    134,  13,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n      6,   0,   0,   0,   5,   0, \n      0,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   6,   0, \n      0,   0,  26,   0,   0,   0, \n      6,   0,   0,   0,  26,   0, \n      0,   0,   6,   5,  16,   0, \n      3,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  41,   0,   0,  10, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10,  50,   0, \n     16,   0,   3,   0,   0,   0, \n    230,  10,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,  31,   0,   0,   0, \n     31,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  17,  50,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  21,   0,   0,   0, \n     21,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      3,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7,  82,   0, \n     16,   0,   3,   0,   0,   0, \n      6,   1,  16,   0,   1,   0, \n      0,   0,   6,   2,  16,   0, \n      5,   0,   0,   0,  30,   0, \n      0,  10, 162,   0,  16,   0, \n      3,   0,   0,   0,  86,  13, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0, 255, 255, \n      0,   0,   0,   0,   0,   0, \n    255, 255,  85,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,   4,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  22,   0,   0,   0, \n     22,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n     54,   0,   0,   5, 194,   0, \n     16,   0,   2,   0,   0,   0, \n      6,   4,  16,   0,   4,   0, \n      0,   0, 140,   0,   0,  20, \n    242,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n     11,   0,   0,   0,  26,   0, \n      0,   0,  11,   0,   0,   0, \n     26,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n      6,   0,   0,   0,   5,   0, \n      0,   0,   6,   0,   0,   0, \n    134,  13,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n      6,   0,   0,   0,   5,   0, \n      0,   0,   6,   0,   0,   0, \n      2,  64,   0,   0,   6,   0, \n      0,   0,  26,   0,   0,   0, \n      6,   0,   0,   0,  26,   0, \n      0,   0,   6,   5,  16,   0, \n      2,   0,   0,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  41,   0,   0,  10, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,  10,  50,   0, \n     16,   0,   2,   0,   0,   0, \n    230,  10,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,  31,   0,   0,   0, \n     31,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  17,  50,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  21,   0,   0,   0, \n     21,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7,  82,   0, \n     16,   0,   2,   0,   0,   0, \n      6,   1,  16,   0,   1,   0, \n      0,   0,   6,   2,  16,   0, \n      5,   0,   0,   0,  30,   0, \n      0,  10, 162,   0,  16,   0, \n      2,   0,   0,   0,  86,  13, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0, 255, 255, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  30,   0, \n      0,  10, 178,   0,  16,   0, \n      1,   0,   0,   0, 166,  10, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  32,   0,   0,   0, \n      0,   0,   0,   0,  48,   0, \n      0,   0, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0, 230, 116, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0, 230,   4, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n    230,   4,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   2,   0, \n      0,   0, 230,   4,  16,   0, \n      3,   0,   0,   0, 230,   4, \n     16,   0,   4,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      0,   0,   0,   0, 230,   4, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0, 230,   4,  16,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  50,   0,  16,   0, \n      0,   0,   0,   0, 230,  10, \n     16,   0,   2,   0,   0,   0, \n     18,   0,   0,   1,  54,   0, \n      0,   5,  50,   0,  16,   0, \n      0,   0,   0,   0, 230,  10, \n     16,   0,   2,   0,   0,   0, \n     21,   0,   0,   1,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,   4, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,  22,   0, \n      0,   0,  22,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  54,   0,   0,   5, \n    194,   0,  16,   0,   0,   0, \n      0,   0,   6,   4,  16,   0, \n      3,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,  11,   0,   0,   0, \n     26,   0,   0,   0,  11,   0, \n      0,   0,  26,   0,   0,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   6,   0,   0,   0, \n      5,   0,   0,   0,   6,   0, \n      0,   0, 134,  13,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   6,   0,   0,   0, \n      5,   0,   0,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      6,   0,   0,   0,  26,   0, \n      0,   0,   6,   0,   0,   0, \n     26,   0,   0,   0,   6,   5, \n     16,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  41,   0, \n      0,  10,  50,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    194,   0,  16,   0,   0,   0, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     31,   0,   0,   0,  31,   0, \n    140,   0,   0,  17,  50,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,  21,   0, \n      0,   0,  21,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 230,  10, \n     16,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     82,   0,  16,   0,   0,   0, \n      0,   0,   6,   1,  16,   0, \n      0,   0,   0,   0,   6,   2, \n     16,   0,   4,   0,   0,   0, \n     30,   0,   0,  10, 162,   0, \n     16,   0,   0,   0,   0,   0, \n     86,  13,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    255, 255,   0,   0,   0,   0, \n      0,   0, 255, 255,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,   4, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  22,   0, \n      0,   0,  22,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  54,   0,   0,   5, \n    194,   0,  16,   0,   2,   0, \n      0,   0,   6,   4,  16,   0, \n      3,   0,   0,   0, 140,   0, \n      0,  20, 242,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,  11,   0,   0,   0, \n     26,   0,   0,   0,  11,   0, \n      0,   0,  26,   0,   0,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   6,   0,   0,   0, \n      5,   0,   0,   0,   6,   0, \n      0,   0, 134,  13,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    138,   0,   0,  15, 242,   0, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   6,   0,   0,   0, \n      5,   0,   0,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      6,   0,   0,   0,  26,   0, \n      0,   0,   6,   0,   0,   0, \n     26,   0,   0,   0,   6,   5, \n     16,   0,   2,   0,   0,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      5,   0,   0,   0,  41,   0, \n      0,  10,  50,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,  10, \n    194,   0,  16,   0,   2,   0, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     31,   0,   0,   0,  31,   0, \n    140,   0,   0,  17,  50,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  21,   0, \n      0,   0,  21,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 230,  10, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,   2,   0, \n      0,   0,  30,   0,   0,   7, \n     82,   0,  16,   0,   2,   0, \n      0,   0,   6,   1,  16,   0, \n      2,   0,   0,   0,   6,   2, \n     16,   0,   4,   0,   0,   0, \n     30,   0,   0,  10, 162,   0, \n     16,   0,   2,   0,   0,   0, \n     86,  13,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    255, 255,   0,   0,   0,   0, \n      0,   0, 255, 255, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   0,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  62,   0,   0,   1, \n     83,  84,  65,  84, 148,   0, \n      0,   0, 141,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  46,   0, \n      0,   0,  29,   0,   0,   0, \n      5,   0,   0,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      9,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_r11g11b10_rgba16_snorm_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 6\ndcl_thread_group 4, 32, 1\nand r0.xy, CB0[0][0].xxxx, l(1, 2, 0, 0)\nishl r1.x, vThreadID.x, l(3)\nmov r1.y, vThreadID.y\nuge r0.zw, r1.xxxy, CB0[0][1].xxxy\nor r0.z, r0.w, r0.z\nif_nz r0.z\n  ret \nendif \nubfe r0.z, l(2), l(2), CB0[0][0].x\nishl r0.w, r1.x, l(3)\nimad r1.y, vThreadID.z, CB0[0][1].y, vThreadID.y\nimad r0.w, r1.y, CB0[0][2].x, r0.w\niadd r0.w, r0.w, CB0[0][1].w\nif_z r0.x\n  imad r1.y, CB0[0][0].w, vThreadID.z, vThreadID.y\n  imad r1.y, CB0[0][0].z, r1.y, r1.x\n  ishl r1.y, r1.y, l(2)\nelse \n  if_nz r0.y\n    ushr r1.zw, CB0[0][0].zzzw, l(0, 0, 5, 4)\n    ishr r2.xyzw, vThreadID.zyyy, l(2, 4, 1, 3)\n    imad r0.y, r2.x, r1.w, r2.y\n    ibfe r1.w, l(27), l(2), vThreadID.x\n    imad r0.y, r0.y, r1.z, r1.w\n    bfi r1.zw, l(0, 0, 2, 1), l(0, 0, 5, 4), vThreadID.zzzy, l(0, 0, 0, 0)\n    bfi r2.y, l(2), l(3), r2.z, l(0)\n    iadd r1.z, r1.z, r2.y\n    bfi r0.y, l(25), l(7), r0.y, r1.z\n    xor r1.z, r2.x, r2.w\n    ubfe r2.x, l(2), l(3), r1.x\n    bfi r2.yz, l(0, 1, 1, 0), l(0, 1, 11, 0), r1.zzzz, l(0, 0, 0, 0)\n    xor r1.z, r2.y, r2.x\n    imad r1.z, r1.z, l(64), r1.w\n    iadd r1.z, r2.z, r1.z\n    ibfe r2.xy, l(27, 24, 0, 0), l(3, 6, 0, 0), r0.yyyy\n    bfi r0.y, l(3), l(8), r2.x, r1.z\n    bfi r1.y, l(20), l(12), r2.y, r0.y\n  else \n    ushr r0.y, CB0[0][0].z, l(5)\n    ishr r2.xyzw, vThreadID.yyyy, l(5, 1, 4, 3)\n    ibfe r1.z, l(27), l(2), vThreadID.x\n    imad r0.y, r2.x, r0.y, r1.z\n    bfi r2.xyz, l(3, 1, 1, 0), l(3, 1, 11, 0), r2.ywzy, l(0, 0, 0, 0)\n    bfi r0.y, l(26), l(6), r0.y, r2.x\n    ubfe r1.x, l(2), l(3), r1.x\n    xor r1.x, r2.y, r1.x\n    bfi r1.z, l(1), l(4), vThreadID.y, l(0)\n    imad r1.x, r1.x, l(64), r1.z\n    iadd r1.x, r2.z, r1.x\n    ibfe r1.zw, l(0, 0, 27, 24), l(0, 0, 3, 6), r0.yyyy\n    bfi r0.y, l(3), l(8), r1.z, r1.x\n    bfi r1.y, l(20), l(12), r1.w, r0.y\n  endif \nendif \niadd r0.y, r1.y, CB0[0][0].y\nld_raw r1.xyzw, r0.y, T0[0].xyzw\nieq r2.xyz, r0.zzzz, l(1, 2, 3, 0)\nor r2.xy, r2.yzyy, r2.xyxx\nif_nz r2.x\n  ishl r3.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r1.xyzw, r3.xyzw, r4.xyzw\nendif \nif_nz r2.y\n  ushr r3.xyzw, r1.xyzw, l(16, 16, 16, 16)\n  bfi r1.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r1.xyzw, r3.xyzw\nendif \nand r2.zw, r1.xxxy, l(0, 0, 2047, 2047)\nubfe r3.xyzw, l(1, 1, 11, 11), l(10, 10, 11, 11), r1.xyxy\nieq r4.xy, r2.zwzz, l(1024, 1024, 0, 0)\nmovc r2.zw, r4.xxxy, l(0,0,1025,1025), r2.zzzw\nmovc r4.xyzw, r3.xyxy, l(2047,2047,0x0000ffff,0x0000ffff), l(0,0,0,0)\nxor r2.zw, r2.zzzw, r4.xxxy\niadd r2.zw, r3.xxxy, r2.zzzw\nishl r4.xy, r2.zwzz, l(5, 5, 0, 0)\nushr r2.zw, r2.zzzw, l(0, 0, 5, 5)\nor r2.zw, r2.zzzw, r4.xxxy\nxor r2.zw, r4.zzzw, r2.zzzw\niadd r2.zw, r3.xxxy, r2.zzzw\nubfe r3.xy, l(1, 1, 0, 0), l(21, 21, 0, 0), r1.xyxx\nieq r4.xy, r3.zwzz, l(1024, 1024, 0, 0)\nmovc r3.zw, r4.xxxy, l(0,0,1025,1025), r3.zzzw\nmovc r4.xyzw, r3.xyxy, l(2047,2047,0x0000ffff,0x0000ffff), l(0,0,0,0)\nxor r3.zw, r3.zzzw, r4.xxxy\niadd r3.zw, r3.xxxy, r3.zzzw\nishl r4.xy, r3.zwzz, l(5, 5, 0, 0)\nushr r3.zw, r3.zzzw, l(0, 0, 5, 5)\nor r3.zw, r3.zzzw, r4.xxxy\nxor r3.zw, r4.zzzw, r3.zzzw\niadd r3.xy, r3.xyxx, r3.zwzz\nishl r3.xy, r3.xyxx, l(16, 16, 0, 0)\nor r3.xz, r2.zzwz, r3.xxyx\nushr r1.xy, r1.xyxx, l(22, 22, 0, 0)\nushr r2.zw, r1.xxxy, l(0, 0, 9, 9)\nieq r4.xy, r1.xyxx, l(512, 512, 0, 0)\nmovc r1.xy, r4.xyxx, l(513,513,0,0), r1.xyxx\nmovc r4.xyzw, r2.zwzw, l(1023,1023,0x0000ffff,0x0000ffff), l(0,0,0,0)\nxor r1.xy, r1.xyxx, r4.xyxx\niadd r1.xy, r2.zwzz, r1.xyxx\nishl r4.xy, r1.xyxx, l(6, 6, 0, 0)\nushr r1.xy, r1.xyxx, l(3, 3, 0, 0)\nor r1.xy, r1.xyxx, r4.xyxx\nxor r1.xy, r4.zwzz, r1.xyxx\niadd r1.xy, r2.zwzz, r1.xyxx\nor r3.yw, r1.xxxy, l(0, 0x7fff0000, 0, 0x7fff0000)\nand r1.xy, r1.zwzz, l(2047, 2047, 0, 0)\nubfe r4.xyzw, l(1, 1, 11, 11), l(10, 10, 11, 11), r1.zwzw\nieq r2.zw, r1.xxxy, l(0, 0, 1024, 1024)\nmovc r1.xy, r2.zwzz, l(1025,1025,0,0), r1.xyxx\nmovc r5.xyzw, r4.xyxy, l(2047,2047,0x0000ffff,0x0000ffff), l(0,0,0,0)\nxor r1.xy, r1.xyxx, r5.xyxx\niadd r1.xy, r4.xyxx, r1.xyxx\nishl r2.zw, r1.xxxy, l(0, 0, 5, 5)\nushr r1.xy, r1.xyxx, l(5, 5, 0, 0)\nor r1.xy, r1.xyxx, r2.zwzz\nxor r1.xy, r5.zwzz, r1.xyxx\niadd r1.xy, r4.xyxx, r1.xyxx\nubfe r2.zw, l(0, 0, 1, 1), l(0, 0, 21, 21), r1.zzzw\nieq r4.xy, r4.zwzz, l(1024, 1024, 0, 0)\nmovc r4.xy, r4.xyxx, l(1025,1025,0,0), r4.zwzz\nmovc r5.xyzw, r2.zwzw, l(2047,2047,0x0000ffff,0x0000ffff), l(0,0,0,0)\nxor r4.xy, r4.xyxx, r5.xyxx\niadd r4.xy, r2.zwzz, r4.xyxx\nishl r4.zw, r4.xxxy, l(0, 0, 5, 5)\nushr r4.xy, r4.xyxx, l(5, 5, 0, 0)\nor r4.xy, r4.xyxx, r4.zwzz\nxor r4.xy, r5.zwzz, r4.xyxx\niadd r2.zw, r2.zzzw, r4.xxxy\nishl r2.zw, r2.zzzw, l(0, 0, 16, 16)\nor r4.xz, r1.xxyx, r2.zzwz\nushr r1.xy, r1.zwzz, l(22, 22, 0, 0)\nushr r1.zw, r1.xxxy, l(0, 0, 9, 9)\nieq r2.zw, r1.xxxy, l(0, 0, 512, 512)\nmovc r1.xy, r2.zwzz, l(513,513,0,0), r1.xyxx\nmovc r5.xyzw, r1.zwzw, l(1023,1023,0x0000ffff,0x0000ffff), l(0,0,0,0)\nxor r1.xy, r1.xyxx, r5.xyxx\niadd r1.xy, r1.zwzz, r1.xyxx\nishl r2.zw, r1.xxxy, l(0, 0, 6, 6)\nushr r1.xy, r1.xyxx, l(3, 3, 0, 0)\nor r1.xy, r1.xyxx, r2.zwzz\nxor r1.xy, r5.zwzz, r1.xyxx\niadd r1.xy, r1.zwzz, r1.xyxx\nor r4.yw, r1.xxxy, l(0, 0x7fff0000, 0, 0x7fff0000)\nstore_raw U0[0].xyzw, r0.w, r3.xyzw\niadd r1.xyz, r0.wwww, l(16, 32, 48, 0)\nstore_raw U0[0].xyzw, r1.x, r4.xyzw\nif_nz r0.x\n  mov r0.x, l(32)\nelse \n  mov r0.x, l(16)\nendif \niadd r0.x, r0.x, r0.y\nld_raw r3.xyzw, r0.x, T0[0].xyzw\nif_nz r2.x\n  ishl r4.xyzw, r3.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r5.xyzw, r3.xyzw, l(8, 8, 8, 8)\n  and r5.xyzw, r5.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r3.xyzw, r4.xyzw, r5.xyzw\nendif \nif_nz r2.y\n  ushr r2.xyzw, r3.xyzw, l(16, 16, 16, 16)\n  bfi r3.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r3.xyzw, r2.xyzw\nendif \nand r0.xy, r3.xyxx, l(2047, 2047, 0, 0)\nubfe r2.xyzw, l(1, 1, 11, 11), l(10, 10, 11, 11), r3.xyxy\nieq r1.xw, r0.xxxy, l(1024, 0, 0, 1024)\nmovc r0.xy, r1.xwxx, l(1025,1025,0,0), r0.xyxx\nmovc r4.xyzw, r2.xyxy, l(2047,2047,0x0000ffff,0x0000ffff), l(0,0,0,0)\nxor r0.xy, r0.xyxx, r4.xyxx\niadd r0.xy, r2.xyxx, r0.xyxx\nishl r1.xw, r0.xxxy, l(5, 0, 0, 5)\nushr r0.xy, r0.xyxx, l(5, 5, 0, 0)\nor r0.xy, r0.xyxx, r1.xwxx\nxor r0.xy, r4.zwzz, r0.xyxx\niadd r0.xy, r2.xyxx, r0.xyxx\nubfe r1.xw, l(1, 0, 0, 1), l(21, 0, 0, 21), r3.xxxy\nieq r2.xy, r2.zwzz, l(1024, 1024, 0, 0)\nmovc r2.xy, r2.xyxx, l(1025,1025,0,0), r2.zwzz\nmovc r4.xyzw, r1.xwxw, l(2047,2047,0x0000ffff,0x0000ffff), l(0,0,0,0)\nxor r2.xy, r2.xyxx, r4.xyxx\niadd r2.xy, r1.xwxx, r2.xyxx\nishl r2.zw, r2.xxxy, l(0, 0, 5, 5)\nushr r2.xy, r2.xyxx, l(5, 5, 0, 0)\nor r2.xy, r2.xyxx, r2.zwzz\nxor r2.xy, r4.zwzz, r2.xyxx\niadd r1.xw, r1.xxxw, r2.xxxy\nishl r1.xw, r1.xxxw, l(16, 0, 0, 16)\nor r2.xz, r0.xxyx, r1.xxwx\nushr r0.xy, r3.xyxx, l(22, 22, 0, 0)\nushr r1.xw, r0.xxxy, l(9, 0, 0, 9)\nieq r3.xy, r0.xyxx, l(512, 512, 0, 0)\nmovc r0.xy, r3.xyxx, l(513,513,0,0), r0.xyxx\nmovc r4.xyzw, r1.xwxw, l(1023,1023,0x0000ffff,0x0000ffff), l(0,0,0,0)\nxor r0.xy, r0.xyxx, r4.xyxx\niadd r0.xy, r1.xwxx, r0.xyxx\nishl r3.xy, r0.xyxx, l(6, 6, 0, 0)\nushr r0.xy, r0.xyxx, l(3, 3, 0, 0)\nor r0.xy, r0.xyxx, r3.xyxx\nxor r0.xy, r4.zwzz, r0.xyxx\niadd r0.xy, r1.xwxx, r0.xyxx\nor r2.yw, r0.xxxy, l(0, 0x7fff0000, 0, 0x7fff0000)\nand r0.xy, r3.zwzz, l(2047, 2047, 0, 0)\nubfe r4.xyzw, l(1, 1, 11, 11), l(10, 10, 11, 11), r3.zwzw\nieq r1.xw, r0.xxxy, l(1024, 0, 0, 1024)\nmovc r0.xy, r1.xwxx, l(1025,1025,0,0), r0.xyxx\nmovc r5.xyzw, r4.xyxy, l(2047,2047,0x0000ffff,0x0000ffff), l(0,0,0,0)\nxor r0.xy, r0.xyxx, r5.xyxx\niadd r0.xy, r4.xyxx, r0.xyxx\nishl r1.xw, r0.xxxy, l(5, 0, 0, 5)\nushr r0.xy, r0.xyxx, l(5, 5, 0, 0)\nor r0.xy, r0.xyxx, r1.xwxx\nxor r0.xy, r5.zwzz, r0.xyxx\niadd r0.xy, r4.xyxx, r0.xyxx\nubfe r1.xw, l(1, 0, 0, 1), l(21, 0, 0, 21), r3.zzzw\nieq r3.xy, r4.zwzz, l(1024, 1024, 0, 0)\nmovc r3.xy, r3.xyxx, l(1025,1025,0,0), r4.zwzz\nmovc r4.xyzw, r1.xwxw, l(2047,2047,0x0000ffff,0x0000ffff), l(0,0,0,0)\nxor r3.xy, r3.xyxx, r4.xyxx\niadd r3.xy, r1.xwxx, r3.xyxx\nishl r4.xy, r3.xyxx, l(5, 5, 0, 0)\nushr r3.xy, r3.xyxx, l(5, 5, 0, 0)\nor r3.xy, r3.xyxx, r4.xyxx\nxor r3.xy, r4.zwzz, r3.xyxx\niadd r1.xw, r1.xxxw, r3.xxxy\nishl r1.xw, r1.xxxw, l(16, 0, 0, 16)\nor r4.xz, r0.xxyx, r1.xxwx\nushr r0.xy, r3.zwzz, l(22, 22, 0, 0)\nushr r1.xw, r0.xxxy, l(9, 0, 0, 9)\nieq r3.xy, r0.xyxx, l(512, 512, 0, 0)\nmovc r0.xy, r3.xyxx, l(513,513,0,0), r0.xyxx\nmovc r3.xyzw, r1.xwxw, l(1023,1023,0x0000ffff,0x0000ffff), l(0,0,0,0)\nxor r0.xy, r0.xyxx, r3.xyxx\niadd r0.xy, r1.xwxx, r0.xyxx\nishl r3.xy, r0.xyxx, l(6, 6, 0, 0)\nushr r0.xy, r0.xyxx, l(3, 3, 0, 0)\nor r0.xy, r0.xyxx, r3.xyxx\nxor r0.xy, r3.zwzz, r0.xyxx\niadd r0.xy, r1.xwxx, r0.xyxx\nor r4.yw, r0.xxxy, l(0, 0x7fff0000, 0, 0x7fff0000)\nstore_raw U0[0].xyzw, r1.y, r2.xyzw\nstore_raw U0[0].xyzw, r1.z, r4.xyzw\nret \n// Approximately 245 instruction slots used\n#endif\n\nconst BYTE texture_load_r11g11b10_rgba16_snorm_cs[] =\n{\n     68,  88,  66,  67,  55, 137, \n     18,  68,  65,  99, 110, 206, \n     90,  98, 183,  64,  23,  56, \n     95, 136,   1,   0,   0,   0, \n    120,  39,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n    220,  38,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n    160,  34,   0,   0,  81,   0, \n      5,   0, 168,   8,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   6,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  12,  50,   0,  16,   0, \n      0,   0,   0,   0,   6, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n    194,   0,  16,   0,   0,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0,   6, 132, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  11, \n     66,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,   2,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,  11, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  31,   0, \n      0,   3,  10,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  58, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  42,   0,   2,   0, \n     26,   0,   2,   0,  35,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     41,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  18,   0, \n      0,   1,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,  12, \n    194,   0,  16,   0,   1,   0, \n      0,   0, 166, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0,  42,   0,   0,   9, \n    242,   0,  16,   0,   2,   0, \n      0,   0, 102,   5,   2,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      1,   0,   0,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 139,   0,   0,   8, \n    130,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     27,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10,   0,   2,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  19, 194,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0, 166,   6,   2,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     25,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  87,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0, 138,   0,   0,   9, \n     18,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  20, \n     98,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  11,   0, \n      0,   0,   0,   0,   0,   0, \n    166,  10,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  87,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  64,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    139,   0,   0,  15,  50,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  27,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  18,   0, \n      0,   1,  85,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  42,   0,   0,   9, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  86,   5,   2,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   1,   0,   0,   0, \n      4,   0,   0,   0,   3,   0, \n      0,   0, 139,   0,   0,   8, \n     66,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     27,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10,   0,   2,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  20, 114,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0, 214,   6,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  26,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0, 138,   0,   0,   9, \n     18,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  87,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  10,  66,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  26,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  64,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 139,   0,   0,  15, \n    194,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  27,   0,   0,   0, \n     24,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  21,   0, \n      0,   1,  30,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  32,   0, \n      0,  10, 114,   0,  16,   0, \n      2,   0,   0,   0, 166,  10, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   2,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   2,   0, \n      0,   0, 150,   5,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,  85,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     21,   0,   0,   1,   1,   0, \n      0,  10, 194,   0,  16,   0, \n      2,   0,   0,   0,   6,   4, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    255,   7,   0,   0, 255,   7, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  11,   0, \n      0,   0,  11,   0,   0,   0, \n     70,   4,  16,   0,   1,   0, \n      0,   0,  32,   0,   0,  10, \n     50,   0,  16,   0,   4,   0, \n      0,   0, 230,  10,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   4,   0,   0, \n      0,   4,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     55,   0,   0,  12, 194,   0, \n     16,   0,   2,   0,   0,   0, \n      6,   4,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   4,   0,   0, \n      1,   4,   0,   0, 166,  14, \n     16,   0,   2,   0,   0,   0, \n     55,   0,   0,  15, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,   4,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   7,   0,   0, 255,   7, \n      0,   0, 255, 255,   0,   0, \n    255, 255,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7, 194,   0, \n     16,   0,   2,   0,   0,   0, \n    166,  14,  16,   0,   2,   0, \n      0,   0,   6,   4,  16,   0, \n      4,   0,   0,   0,  30,   0, \n      0,   7, 194,   0,  16,   0, \n      2,   0,   0,   0,   6,   4, \n     16,   0,   3,   0,   0,   0, \n    166,  14,  16,   0,   2,   0, \n      0,   0,  41,   0,   0,  10, \n     50,   0,  16,   0,   4,   0, \n      0,   0, 230,  10,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     85,   0,   0,  10, 194,   0, \n     16,   0,   2,   0,   0,   0, \n    166,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,  60,   0, \n      0,   7, 194,   0,  16,   0, \n      2,   0,   0,   0, 166,  14, \n     16,   0,   2,   0,   0,   0, \n      6,   4,  16,   0,   4,   0, \n      0,   0,  87,   0,   0,   7, \n    194,   0,  16,   0,   2,   0, \n      0,   0, 166,  14,  16,   0, \n      4,   0,   0,   0, 166,  14, \n     16,   0,   2,   0,   0,   0, \n     30,   0,   0,   7, 194,   0, \n     16,   0,   2,   0,   0,   0, \n      6,   4,  16,   0,   3,   0, \n      0,   0, 166,  14,  16,   0, \n      2,   0,   0,   0, 138,   0, \n      0,  15,  50,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,  21,   0, \n      0,   0,  21,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,  32,   0, \n      0,  10,  50,   0,  16,   0, \n      4,   0,   0,   0, 230,  10, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   4, \n      0,   0,   0,   4,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,  12, \n    194,   0,  16,   0,   3,   0, \n      0,   0,   6,   4,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   4, \n      0,   0,   1,   4,   0,   0, \n    166,  14,  16,   0,   3,   0, \n      0,   0,  55,   0,   0,  15, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,   4,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0, 255,   7,   0,   0, \n    255,   7,   0,   0, 255, 255, \n      0,   0, 255, 255,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n    194,   0,  16,   0,   3,   0, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,   6,   4, \n     16,   0,   4,   0,   0,   0, \n     30,   0,   0,   7, 194,   0, \n     16,   0,   3,   0,   0,   0, \n      6,   4,  16,   0,   3,   0, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,  41,   0, \n      0,  10,  50,   0,  16,   0, \n      4,   0,   0,   0, 230,  10, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n    194,   0,  16,   0,   3,   0, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n     60,   0,   0,   7, 194,   0, \n     16,   0,   3,   0,   0,   0, \n    166,  14,  16,   0,   3,   0, \n      0,   0,   6,   4,  16,   0, \n      4,   0,   0,   0,  87,   0, \n      0,   7, 194,   0,  16,   0, \n      3,   0,   0,   0, 166,  14, \n     16,   0,   4,   0,   0,   0, \n    166,  14,  16,   0,   3,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   3,   0, \n      0,   0,  70,   0,  16,   0, \n      3,   0,   0,   0, 230,  10, \n     16,   0,   3,   0,   0,   0, \n     41,   0,   0,  10,  50,   0, \n     16,   0,   3,   0,   0,   0, \n     70,   0,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  60,   0, \n      0,   7,  82,   0,  16,   0, \n      3,   0,   0,   0, 166,  11, \n     16,   0,   2,   0,   0,   0, \n      6,   1,  16,   0,   3,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  22,   0,   0,   0, \n     22,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     85,   0,   0,  10, 194,   0, \n     16,   0,   2,   0,   0,   0, \n      6,   4,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   9,   0,   0,   0, \n      9,   0,   0,   0,  32,   0, \n      0,  10,  50,   0,  16,   0, \n      4,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   2, \n      0,   0,   0,   2,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,  12, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   1,   2,   0,   0, \n      1,   2,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  55,   0,   0,  15, \n    242,   0,  16,   0,   4,   0, \n      0,   0, 230,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255, 255, \n      0,   0, 255, 255,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   4,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,   1,   0,   0,   0, \n    230,  10,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,  41,   0, \n      0,  10,  50,   0,  16,   0, \n      4,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   6,   0, \n      0,   0,   6,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      4,   0,   0,   0,  87,   0, \n      0,   7,  50,   0,  16,   0, \n      1,   0,   0,   0, 230,  10, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   1,   0, \n      0,   0, 230,  10,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n     60,   0,   0,  10, 162,   0, \n     16,   0,   3,   0,   0,   0, \n      6,   4,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    255, 127,   0,   0,   0,   0, \n      0,   0, 255, 127,   1,   0, \n      0,  10,  50,   0,  16,   0, \n      1,   0,   0,   0, 230,  10, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0, 255,   7, \n      0,   0, 255,   7,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  11,   0, \n      0,   0,  11,   0,   0,   0, \n    230,  14,  16,   0,   1,   0, \n      0,   0,  32,   0,   0,  10, \n    194,   0,  16,   0,   2,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   4, \n      0,   0,   0,   4,   0,   0, \n     55,   0,   0,  12,  50,   0, \n     16,   0,   1,   0,   0,   0, \n    230,  10,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   4,   0,   0,   1,   4, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n     55,   0,   0,  15, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   4,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   7,   0,   0, 255,   7, \n      0,   0, 255, 255,   0,   0, \n    255, 255,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7,  50,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      5,   0,   0,   0,  30,   0, \n      0,   7,  50,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  41,   0,   0,  10, \n    194,   0,  16,   0,   2,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n     85,   0,   0,  10,  50,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  60,   0, \n      0,   7,  50,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n    230,  10,  16,   0,   2,   0, \n      0,   0,  87,   0,   0,   7, \n     50,   0,  16,   0,   1,   0, \n      0,   0, 230,  10,  16,   0, \n      5,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   4,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0, 138,   0, \n      0,  15, 194,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     21,   0,   0,   0,  21,   0, \n      0,   0, 166,  14,  16,   0, \n      1,   0,   0,   0,  32,   0, \n      0,  10,  50,   0,  16,   0, \n      4,   0,   0,   0, 230,  10, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   4, \n      0,   0,   0,   4,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,  12, \n     50,   0,  16,   0,   4,   0, \n      0,   0,  70,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   1,   4,   0,   0, \n      1,   4,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    230,  10,  16,   0,   4,   0, \n      0,   0,  55,   0,   0,  15, \n    242,   0,  16,   0,   5,   0, \n      0,   0, 230,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0, 255,   7,   0,   0, \n    255,   7,   0,   0, 255, 255, \n      0,   0, 255, 255,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     50,   0,  16,   0,   4,   0, \n      0,   0,  70,   0,  16,   0, \n      4,   0,   0,   0,  70,   0, \n     16,   0,   5,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,   4,   0,   0,   0, \n    230,  10,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      4,   0,   0,   0,  41,   0, \n      0,  10, 194,   0,  16,   0, \n      4,   0,   0,   0,   6,   4, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   4,   0, \n      0,   0,  70,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   4,   0, \n      0,   0, 230,  10,  16,   0, \n      4,   0,   0,   0,  87,   0, \n      0,   7,  50,   0,  16,   0, \n      4,   0,   0,   0, 230,  10, \n     16,   0,   5,   0,   0,   0, \n     70,   0,  16,   0,   4,   0, \n      0,   0,  30,   0,   0,   7, \n    194,   0,  16,   0,   2,   0, \n      0,   0, 166,  14,  16,   0, \n      2,   0,   0,   0,   6,   4, \n     16,   0,   4,   0,   0,   0, \n     41,   0,   0,  10, 194,   0, \n     16,   0,   2,   0,   0,   0, \n    166,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  60,   0, \n      0,   7,  82,   0,  16,   0, \n      4,   0,   0,   0,   6,   1, \n     16,   0,   1,   0,   0,   0, \n    166,  11,  16,   0,   2,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   1,   0, \n      0,   0, 230,  10,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  22,   0,   0,   0, \n     22,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     85,   0,   0,  10, 194,   0, \n     16,   0,   1,   0,   0,   0, \n      6,   4,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   9,   0,   0,   0, \n      9,   0,   0,   0,  32,   0, \n      0,  10, 194,   0,  16,   0, \n      2,   0,   0,   0,   6,   4, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   2,   0,   0,   0,   2, \n      0,   0,  55,   0,   0,  12, \n     50,   0,  16,   0,   1,   0, \n      0,   0, 230,  10,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   1,   2,   0,   0, \n      1,   2,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  55,   0,   0,  15, \n    242,   0,  16,   0,   5,   0, \n      0,   0, 230,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255, 255, \n      0,   0, 255, 255,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   5,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,   1,   0,   0,   0, \n    230,  10,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,  41,   0, \n      0,  10, 194,   0,  16,   0, \n      2,   0,   0,   0,   6,   4, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      6,   0,   0,   0,   6,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0, 230,  10,  16,   0, \n      2,   0,   0,   0,  87,   0, \n      0,   7,  50,   0,  16,   0, \n      1,   0,   0,   0, 230,  10, \n     16,   0,   5,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   1,   0, \n      0,   0, 230,  10,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n     60,   0,   0,  10, 162,   0, \n     16,   0,   4,   0,   0,   0, \n      6,   4,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    255, 127,   0,   0,   0,   0, \n      0,   0, 255, 127, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     30,   0,   0,  10, 114,   0, \n     16,   0,   1,   0,   0,   0, \n    246,  15,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  32,   0, \n      0,   0,  48,   0,   0,   0, \n      0,   0,   0,   0, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  32,   0, \n      0,   0,  18,   0,   0,   1, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0,  21,   0,   0,   1, \n     30,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      3,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,  85,   0,   0,  10, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   5,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     21,   0,   0,   1,   1,   0, \n      0,  10,  50,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0, 255,   7, \n      0,   0, 255,   7,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  11,   0, \n      0,   0,  11,   0,   0,   0, \n     70,   4,  16,   0,   3,   0, \n      0,   0,  32,   0,   0,  10, \n    146,   0,  16,   0,   1,   0, \n      0,   0,   6,   4,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   4,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   4,   0,   0, \n     55,   0,   0,  12,  50,   0, \n     16,   0,   0,   0,   0,   0, \n    198,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   4,   0,   0,   1,   4, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n     55,   0,   0,  15, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,   4,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   7,   0,   0, 255,   7, \n      0,   0, 255, 255,   0,   0, \n    255, 255,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7,  50,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      4,   0,   0,   0,  30,   0, \n      0,   7,  50,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    146,   0,  16,   0,   1,   0, \n      0,   0,   6,   4,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   5,   0,   0,   0, \n     85,   0,   0,  10,  50,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  60,   0, \n      0,   7,  50,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n    198,   0,  16,   0,   1,   0, \n      0,   0,  87,   0,   0,   7, \n     50,   0,  16,   0,   0,   0, \n      0,   0, 230,  10,  16,   0, \n      4,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 146,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  21,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   0,   6,   4,  16,   0, \n      3,   0,   0,   0,  32,   0, \n      0,  10,  50,   0,  16,   0, \n      2,   0,   0,   0, 230,  10, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   4, \n      0,   0,   0,   4,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,  12, \n     50,   0,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   1,   4,   0,   0, \n      1,   4,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    230,  10,  16,   0,   2,   0, \n      0,   0,  55,   0,   0,  15, \n    242,   0,  16,   0,   4,   0, \n      0,   0, 198,  12,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0, 255,   7,   0,   0, \n    255,   7,   0,   0, 255, 255, \n      0,   0, 255, 255,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     50,   0,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   4,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,   2,   0,   0,   0, \n    198,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,  41,   0, \n      0,  10, 194,   0,  16,   0, \n      2,   0,   0,   0,   6,   4, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,   2,   0, \n      0,   0, 230,  10,  16,   0, \n      2,   0,   0,   0,  87,   0, \n      0,   7,  50,   0,  16,   0, \n      2,   0,   0,   0, 230,  10, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   2,   0, \n      0,   0,  30,   0,   0,   7, \n    146,   0,  16,   0,   1,   0, \n      0,   0,   6,  12,  16,   0, \n      1,   0,   0,   0,   6,   4, \n     16,   0,   2,   0,   0,   0, \n     41,   0,   0,  10, 146,   0, \n     16,   0,   1,   0,   0,   0, \n      6,  12,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,  60,   0, \n      0,   7,  82,   0,  16,   0, \n      2,   0,   0,   0,   6,   1, \n     16,   0,   0,   0,   0,   0, \n      6,   3,  16,   0,   1,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,  22,   0,   0,   0, \n     22,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     85,   0,   0,  10, 146,   0, \n     16,   0,   1,   0,   0,   0, \n      6,   4,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      9,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      9,   0,   0,   0,  32,   0, \n      0,  10,  50,   0,  16,   0, \n      3,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   2, \n      0,   0,   0,   2,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,  12, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   1,   2,   0,   0, \n      1,   2,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0,  55,   0,   0,  15, \n    242,   0,  16,   0,   4,   0, \n      0,   0, 198,  12,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255, 255, \n      0,   0, 255, 255,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   4,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,   0,   0,   0,   0, \n    198,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10,  50,   0,  16,   0, \n      3,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   6,   0, \n      0,   0,   6,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      3,   0,   0,   0,  87,   0, \n      0,   7,  50,   0,  16,   0, \n      0,   0,   0,   0, 230,  10, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   0,   0, \n      0,   0, 198,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n     60,   0,   0,  10, 162,   0, \n     16,   0,   2,   0,   0,   0, \n      6,   4,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    255, 127,   0,   0,   0,   0, \n      0,   0, 255, 127,   1,   0, \n      0,  10,  50,   0,  16,   0, \n      0,   0,   0,   0, 230,  10, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0, 255,   7, \n      0,   0, 255,   7,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 138,   0,   0,  15, \n    242,   0,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n     11,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  11,   0, \n      0,   0,  11,   0,   0,   0, \n    230,  14,  16,   0,   3,   0, \n      0,   0,  32,   0,   0,  10, \n    146,   0,  16,   0,   1,   0, \n      0,   0,   6,   4,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   4,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   4,   0,   0, \n     55,   0,   0,  12,  50,   0, \n     16,   0,   0,   0,   0,   0, \n    198,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   4,   0,   0,   1,   4, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n     55,   0,   0,  15, 242,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   4,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   7,   0,   0, 255,   7, \n      0,   0, 255, 255,   0,   0, \n    255, 255,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7,  50,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      5,   0,   0,   0,  30,   0, \n      0,   7,  50,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    146,   0,  16,   0,   1,   0, \n      0,   0,   6,   4,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   5,   0,   0,   0, \n     85,   0,   0,  10,  50,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  60,   0, \n      0,   7,  50,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n    198,   0,  16,   0,   1,   0, \n      0,   0,  87,   0,   0,   7, \n     50,   0,  16,   0,   0,   0, \n      0,   0, 230,  10,  16,   0, \n      5,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   4,   0, \n      0,   0,  70,   0,  16,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 146,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  21,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,  32,   0, \n      0,  10,  50,   0,  16,   0, \n      3,   0,   0,   0, 230,  10, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   4, \n      0,   0,   0,   4,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,  12, \n     50,   0,  16,   0,   3,   0, \n      0,   0,  70,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   1,   4,   0,   0, \n      1,   4,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    230,  10,  16,   0,   4,   0, \n      0,   0,  55,   0,   0,  15, \n    242,   0,  16,   0,   4,   0, \n      0,   0, 198,  12,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0, 255,   7,   0,   0, \n    255,   7,   0,   0, 255, 255, \n      0,   0, 255, 255,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     50,   0,  16,   0,   3,   0, \n      0,   0,  70,   0,  16,   0, \n      3,   0,   0,   0,  70,   0, \n     16,   0,   4,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,   3,   0,   0,   0, \n    198,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      3,   0,   0,   0,  41,   0, \n      0,  10,  50,   0,  16,   0, \n      4,   0,   0,   0,  70,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   3,   0, \n      0,   0,  70,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,   3,   0,   0,   0, \n     70,   0,  16,   0,   3,   0, \n      0,   0,  70,   0,  16,   0, \n      4,   0,   0,   0,  87,   0, \n      0,   7,  50,   0,  16,   0, \n      3,   0,   0,   0, 230,  10, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   3,   0, \n      0,   0,  30,   0,   0,   7, \n    146,   0,  16,   0,   1,   0, \n      0,   0,   6,  12,  16,   0, \n      1,   0,   0,   0,   6,   4, \n     16,   0,   3,   0,   0,   0, \n     41,   0,   0,  10, 146,   0, \n     16,   0,   1,   0,   0,   0, \n      6,  12,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     16,   0,   0,   0,  60,   0, \n      0,   7,  82,   0,  16,   0, \n      4,   0,   0,   0,   6,   1, \n     16,   0,   0,   0,   0,   0, \n      6,   3,  16,   0,   1,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   0,   0, \n      0,   0, 230,  10,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,  22,   0,   0,   0, \n     22,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     85,   0,   0,  10, 146,   0, \n     16,   0,   1,   0,   0,   0, \n      6,   4,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      9,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      9,   0,   0,   0,  32,   0, \n      0,  10,  50,   0,  16,   0, \n      3,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   2, \n      0,   0,   0,   2,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,  12, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   1,   2,   0,   0, \n      1,   2,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0,  55,   0,   0,  15, \n    242,   0,  16,   0,   3,   0, \n      0,   0, 198,  12,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0, 255,   3,   0,   0, \n    255,   3,   0,   0, 255, 255, \n      0,   0, 255, 255,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   3,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,   0,   0,   0,   0, \n    198,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10,  50,   0,  16,   0, \n      3,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   6,   0, \n      0,   0,   6,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      3,   0,   0,   0,  87,   0, \n      0,   7,  50,   0,  16,   0, \n      0,   0,   0,   0, 230,  10, \n     16,   0,   3,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   0,   0, \n      0,   0, 198,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n     60,   0,   0,  10, 162,   0, \n     16,   0,   4,   0,   0,   0, \n      6,   4,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    255, 127,   0,   0,   0,   0, \n      0,   0, 255, 127, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  62,   0,   0,   1, \n     83,  84,  65,  84, 148,   0, \n      0,   0, 245,   0,   0,   0, \n      6,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  78,   0, \n      0,   0,  85,   0,   0,   0, \n      5,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,  24,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_r11g11b10_rgba16_snorm_scaled_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 6\ndcl_thread_group 4, 32, 1\nand r0.x, CB0[0][0].x, l(2)\nishl r1.x, vThreadID.x, l(3)\nmov r1.y, vThreadID.y\nuge r0.yz, r1.xxyx, CB0[0][1].xxyx\nor r0.y, r0.z, r0.y\nif_nz r0.y\n  ret \nendif \nubfe r0.yzw, l(0, 2, 3, 3), l(0, 2, 4, 7), CB0[0][0].xxxx\nishl r1.z, r1.x, l(3)\nimad r1.w, vThreadID.z, CB0[0][1].y, vThreadID.y\nimad r1.z, r1.w, CB0[0][2].x, r1.z\niadd r1.z, r1.z, CB0[0][1].w\nushr r1.yw, r1.xxxy, l(0, 4, 0, 1)\nudiv r2.xyzw, null, r1.wyww, r0.wzww\nimad r1.yw, -r0.zzzw, r2.yyyw, r1.yyyw\nishl r3.x, r2.y, l(4)\nimad r1.y, r1.y, r0.w, r1.w\nbfi r1.w, l(1), l(6), vThreadID.y, l(0)\nbfi r1.y, l(25), l(7), r1.y, r1.w\nbfi r1.x, l(4), l(2), r1.x, l(0)\niadd r1.x, r1.y, r1.x\nif_nz r0.x\n  ushr r1.yw, CB0[0][0].zzzw, l(0, 5, 0, 4)\n  ishr r0.x, vThreadID.z, l(2)\n  ibfe r4.xyzw, l(28, 27, 31, 29), l(3, 1, 0, 2), r2.wyww\n  imad r1.w, r0.x, r1.w, r4.x\n  imad r1.y, r1.w, r1.y, r4.y\n  bfi r1.w, l(2), l(5), vThreadID.z, l(0)\n  bfi r3.y, l(2), l(3), r4.z, l(0)\n  iadd r1.w, r1.w, r3.y\n  bfi r1.y, l(25), l(7), r1.y, r1.w\n  xor r0.x, r0.x, r4.w\n  ishr r1.w, r3.x, l(3)\n  and r1.w, r1.w, l(2)\n  bfi r3.yz, l(0, 1, 1, 0), l(0, 1, 11, 0), r0.xxxx, l(0, 0, 0, 0)\n  xor r0.x, r1.w, r3.y\n  ishl r0.x, r0.x, l(6)\n  iadd r0.x, r3.z, r0.x\n  ibfe r1.yw, l(0, 27, 0, 24), l(0, 3, 0, 6), r1.yyyy\n  bfi r0.x, l(3), l(8), r1.y, r0.x\n  bfi r0.x, l(20), l(12), r1.w, r0.x\nelse \n  ushr r1.y, CB0[0][0].z, l(5)\n  ibfe r4.xyzw, l(27, 27, 31, 28), l(4, 1, 0, 3), r2.xyzw\n  imad r1.y, r4.x, r1.y, r4.y\n  bfi r2.xy, l(3, 1, 0, 0), l(3, 11, 0, 0), r4.zwzz, l(0, 0, 0, 0)\n  bfi r1.y, l(26), l(6), r1.y, r2.x\n  ishr r1.w, r3.x, l(3)\n  and r1.w, r1.w, l(2)\n  ibfe r2.x, l(29), l(2), r2.w\n  bfi r2.x, l(1), l(1), r2.x, l(0)\n  xor r1.w, r1.w, r2.x\n  ishl r1.w, r1.w, l(6)\n  iadd r1.w, r2.y, r1.w\n  ibfe r2.xy, l(27, 24, 0, 0), l(3, 6, 0, 0), r1.yyyy\n  bfi r1.y, l(3), l(8), r2.x, r1.w\n  bfi r0.x, l(20), l(12), r2.y, r1.y\nendif \nimul null, r0.z, r0.w, r0.z\nimad r0.x, r0.x, r0.z, r1.x\niadd r0.x, r0.x, CB0[0][0].y\nld_raw r2.xyzw, r0.x, T0[0].xyzw\nieq r0.yzw, r0.yyyy, l(0, 1, 2, 3)\nor r0.yz, r0.zzwz, r0.yyzy\nif_nz r0.y\n  ishl r3.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r2.xyzw, r3.xyzw, r4.xyzw\nendif \nif_nz r0.z\n  ushr r3.xyzw, r2.xyzw, l(16, 16, 16, 16)\n  bfi r2.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r2.xyzw, r3.xyzw\nendif \nand r1.xy, r2.xyxx, l(2047, 2047, 0, 0)\nubfe r3.xyzw, l(1, 1, 11, 11), l(10, 10, 11, 11), r2.xyxy\nieq r4.xy, r1.xyxx, l(1024, 1024, 0, 0)\nmovc r1.xy, r4.xyxx, l(1025,1025,0,0), r1.xyxx\nmovc r4.xyzw, r3.xyxy, l(2047,2047,0x0000ffff,0x0000ffff), l(0,0,0,0)\nxor r1.xy, r1.xyxx, r4.xyxx\niadd r1.xy, r3.xyxx, r1.xyxx\nishl r4.xy, r1.xyxx, l(5, 5, 0, 0)\nushr r1.xy, r1.xyxx, l(5, 5, 0, 0)\nor r1.xy, r1.xyxx, r4.xyxx\nxor r1.xy, r4.zwzz, r1.xyxx\niadd r1.xy, r3.xyxx, r1.xyxx\nubfe r3.xy, l(1, 1, 0, 0), l(21, 21, 0, 0), r2.xyxx\nieq r4.xy, r3.zwzz, l(1024, 1024, 0, 0)\nmovc r3.zw, r4.xxxy, l(0,0,1025,1025), r3.zzzw\nmovc r4.xyzw, r3.xyxy, l(2047,2047,0x0000ffff,0x0000ffff), l(0,0,0,0)\nxor r3.zw, r3.zzzw, r4.xxxy\niadd r3.zw, r3.xxxy, r3.zzzw\nishl r4.xy, r3.zwzz, l(5, 5, 0, 0)\nushr r3.zw, r3.zzzw, l(0, 0, 5, 5)\nor r3.zw, r3.zzzw, r4.xxxy\nxor r3.zw, r4.zzzw, r3.zzzw\niadd r3.xy, r3.xyxx, r3.zwzz\nishl r3.xy, r3.xyxx, l(16, 16, 0, 0)\nor r3.xz, r1.xxyx, r3.xxyx\nushr r1.xy, r2.xyxx, l(22, 22, 0, 0)\nushr r2.xy, r1.xyxx, l(9, 9, 0, 0)\nieq r4.xy, r1.xyxx, l(512, 512, 0, 0)\nmovc r1.xy, r4.xyxx, l(513,513,0,0), r1.xyxx\nmovc r4.xyzw, r2.xyxy, l(1023,1023,0x0000ffff,0x0000ffff), l(0,0,0,0)\nxor r1.xy, r1.xyxx, r4.xyxx\niadd r1.xy, r2.xyxx, r1.xyxx\nishl r4.xy, r1.xyxx, l(6, 6, 0, 0)\nushr r1.xy, r1.xyxx, l(3, 3, 0, 0)\nor r1.xy, r1.xyxx, r4.xyxx\nxor r1.xy, r4.zwzz, r1.xyxx\niadd r1.xy, r2.xyxx, r1.xyxx\nor r3.yw, r1.xxxy, l(0, 0x7fff0000, 0, 0x7fff0000)\nand r1.xy, r2.zwzz, l(2047, 2047, 0, 0)\nubfe r4.xyzw, l(1, 1, 11, 11), l(10, 10, 11, 11), r2.zwzw\nieq r2.xy, r1.xyxx, l(1024, 1024, 0, 0)\nmovc r1.xy, r2.xyxx, l(1025,1025,0,0), r1.xyxx\nmovc r5.xyzw, r4.xyxy, l(2047,2047,0x0000ffff,0x0000ffff), l(0,0,0,0)\nxor r1.xy, r1.xyxx, r5.xyxx\niadd r1.xy, r4.xyxx, r1.xyxx\nishl r2.xy, r1.xyxx, l(5, 5, 0, 0)\nushr r1.xy, r1.xyxx, l(5, 5, 0, 0)\nor r1.xy, r1.xyxx, r2.xyxx\nxor r1.xy, r5.zwzz, r1.xyxx\niadd r1.xy, r4.xyxx, r1.xyxx\nubfe r2.xy, l(1, 1, 0, 0), l(21, 21, 0, 0), r2.zwzz\nieq r4.xy, r4.zwzz, l(1024, 1024, 0, 0)\nmovc r4.xy, r4.xyxx, l(1025,1025,0,0), r4.zwzz\nmovc r5.xyzw, r2.xyxy, l(2047,2047,0x0000ffff,0x0000ffff), l(0,0,0,0)\nxor r4.xy, r4.xyxx, r5.xyxx\niadd r4.xy, r2.xyxx, r4.xyxx\nishl r4.zw, r4.xxxy, l(0, 0, 5, 5)\nushr r4.xy, r4.xyxx, l(5, 5, 0, 0)\nor r4.xy, r4.xyxx, r4.zwzz\nxor r4.xy, r5.zwzz, r4.xyxx\niadd r2.xy, r2.xyxx, r4.xyxx\nishl r2.xy, r2.xyxx, l(16, 16, 0, 0)\nor r4.xz, r1.xxyx, r2.xxyx\nushr r1.xy, r2.zwzz, l(22, 22, 0, 0)\nushr r2.xy, r1.xyxx, l(9, 9, 0, 0)\nieq r2.zw, r1.xxxy, l(0, 0, 512, 512)\nmovc r1.xy, r2.zwzz, l(513,513,0,0), r1.xyxx\nmovc r5.xyzw, r2.xyxy, l(1023,1023,0x0000ffff,0x0000ffff), l(0,0,0,0)\nxor r1.xy, r1.xyxx, r5.xyxx\niadd r1.xy, r2.xyxx, r1.xyxx\nishl r2.zw, r1.xxxy, l(0, 0, 6, 6)\nushr r1.xy, r1.xyxx, l(3, 3, 0, 0)\nor r1.xy, r1.xyxx, r2.zwzz\nxor r1.xy, r5.zwzz, r1.xyxx\niadd r1.xy, r2.xyxx, r1.xyxx\nor r4.yw, r1.xxxy, l(0, 0x7fff0000, 0, 0x7fff0000)\nstore_raw U0[0].xyzw, r1.z, r3.xyzw\niadd r1.xyw, r1.zzzz, l(16, 32, 0, 48)\nstore_raw U0[0].xyzw, r1.x, r4.xyzw\niadd r0.x, r0.x, l(16)\nld_raw r2.xyzw, r0.x, T0[0].xyzw\nif_nz r0.y\n  ishl r3.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r2.xyzw, r3.xyzw, r4.xyzw\nendif \nif_nz r0.z\n  ushr r0.xyzw, r2.xyzw, l(16, 16, 16, 16)\n  bfi r2.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r2.xyzw, r0.xyzw\nendif \nand r0.xy, r2.xyxx, l(2047, 2047, 0, 0)\nubfe r3.xyzw, l(1, 1, 11, 11), l(10, 10, 11, 11), r2.xyxy\nieq r0.zw, r0.xxxy, l(0, 0, 1024, 1024)\nmovc r0.xy, r0.zwzz, l(1025,1025,0,0), r0.xyxx\nmovc r4.xyzw, r3.xyxy, l(2047,2047,0x0000ffff,0x0000ffff), l(0,0,0,0)\nxor r0.xy, r0.xyxx, r4.xyxx\niadd r0.xy, r3.xyxx, r0.xyxx\nishl r0.zw, r0.xxxy, l(0, 0, 5, 5)\nushr r0.xy, r0.xyxx, l(5, 5, 0, 0)\nor r0.xy, r0.xyxx, r0.zwzz\nxor r0.xy, r4.zwzz, r0.xyxx\niadd r0.xy, r3.xyxx, r0.xyxx\nubfe r0.zw, l(0, 0, 1, 1), l(0, 0, 21, 21), r2.xxxy\nieq r3.xy, r3.zwzz, l(1024, 1024, 0, 0)\nmovc r3.xy, r3.xyxx, l(1025,1025,0,0), r3.zwzz\nmovc r4.xyzw, r0.zwzw, l(2047,2047,0x0000ffff,0x0000ffff), l(0,0,0,0)\nxor r3.xy, r3.xyxx, r4.xyxx\niadd r3.xy, r0.zwzz, r3.xyxx\nishl r3.zw, r3.xxxy, l(0, 0, 5, 5)\nushr r3.xy, r3.xyxx, l(5, 5, 0, 0)\nor r3.xy, r3.xyxx, r3.zwzz\nxor r3.xy, r4.zwzz, r3.xyxx\niadd r0.zw, r0.zzzw, r3.xxxy\nishl r0.zw, r0.zzzw, l(0, 0, 16, 16)\nor r0.xz, r0.zzwz, r0.xxyx\nushr r2.xy, r2.xyxx, l(22, 22, 0, 0)\nushr r3.xy, r2.xyxx, l(9, 9, 0, 0)\nieq r3.zw, r2.xxxy, l(0, 0, 512, 512)\nmovc r2.xy, r3.zwzz, l(513,513,0,0), r2.xyxx\nmovc r4.xyzw, r3.xyxy, l(1023,1023,0x0000ffff,0x0000ffff), l(0,0,0,0)\nxor r2.xy, r2.xyxx, r4.xyxx\niadd r2.xy, r3.xyxx, r2.xyxx\nishl r3.zw, r2.xxxy, l(0, 0, 6, 6)\nushr r2.xy, r2.xyxx, l(3, 3, 0, 0)\nor r2.xy, r2.xyxx, r3.zwzz\nxor r2.xy, r4.zwzz, r2.xyxx\niadd r2.xy, r3.xyxx, r2.xyxx\nor r0.yw, r2.xxxy, l(0, 0x7fff0000, 0, 0x7fff0000)\nand r2.xy, r2.zwzz, l(2047, 2047, 0, 0)\nubfe r3.xyzw, l(1, 1, 11, 11), l(10, 10, 11, 11), r2.zwzw\nieq r4.xy, r2.xyxx, l(1024, 1024, 0, 0)\nmovc r2.xy, r4.xyxx, l(1025,1025,0,0), r2.xyxx\nmovc r4.xyzw, r3.xyxy, l(2047,2047,0x0000ffff,0x0000ffff), l(0,0,0,0)\nxor r2.xy, r2.xyxx, r4.xyxx\niadd r2.xy, r3.xyxx, r2.xyxx\nishl r4.xy, r2.xyxx, l(5, 5, 0, 0)\nushr r2.xy, r2.xyxx, l(5, 5, 0, 0)\nor r2.xy, r2.xyxx, r4.xyxx\nxor r2.xy, r4.zwzz, r2.xyxx\niadd r2.xy, r3.xyxx, r2.xyxx\nubfe r3.xy, l(1, 1, 0, 0), l(21, 21, 0, 0), r2.zwzz\nieq r4.xy, r3.zwzz, l(1024, 1024, 0, 0)\nmovc r3.zw, r4.xxxy, l(0,0,1025,1025), r3.zzzw\nmovc r4.xyzw, r3.xyxy, l(2047,2047,0x0000ffff,0x0000ffff), l(0,0,0,0)\nxor r3.zw, r3.zzzw, r4.xxxy\niadd r3.zw, r3.xxxy, r3.zzzw\nishl r4.xy, r3.zwzz, l(5, 5, 0, 0)\nushr r3.zw, r3.zzzw, l(0, 0, 5, 5)\nor r3.zw, r3.zzzw, r4.xxxy\nxor r3.zw, r4.zzzw, r3.zzzw\niadd r3.xy, r3.xyxx, r3.zwzz\nishl r3.xy, r3.xyxx, l(16, 16, 0, 0)\nor r3.xz, r2.xxyx, r3.xxyx\nushr r2.xy, r2.zwzz, l(22, 22, 0, 0)\nushr r2.zw, r2.xxxy, l(0, 0, 9, 9)\nieq r4.xy, r2.xyxx, l(512, 512, 0, 0)\nmovc r2.xy, r4.xyxx, l(513,513,0,0), r2.xyxx\nmovc r4.xyzw, r2.zwzw, l(1023,1023,0x0000ffff,0x0000ffff), l(0,0,0,0)\nxor r2.xy, r2.xyxx, r4.xyxx\niadd r2.xy, r2.zwzz, r2.xyxx\nishl r4.xy, r2.xyxx, l(6, 6, 0, 0)\nushr r2.xy, r2.xyxx, l(3, 3, 0, 0)\nor r2.xy, r2.xyxx, r4.xyxx\nxor r2.xy, r4.zwzz, r2.xyxx\niadd r2.xy, r2.zwzz, r2.xyxx\nor r3.yw, r2.xxxy, l(0, 0x7fff0000, 0, 0x7fff0000)\nstore_raw U0[0].xyzw, r1.y, r0.xyzw\nstore_raw U0[0].xyzw, r1.w, r3.xyzw\nret \n// Approximately 247 instruction slots used\n#endif\n\nconst BYTE texture_load_r11g11b10_rgba16_snorm_scaled_cs[] =\n{\n     68,  88,  66,  67, 160, 133, \n     40, 145,  94, 119, 228, 125, \n     67, 206, 112, 235, 188, 182, \n    255,  58,   1,   0,   0,   0, \n    124,  40,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n    224,  39,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n    164,  35,   0,   0,  81,   0, \n      5,   0, 233,   8,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   6,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n     98,   0,  16,   0,   0,   0, \n      0,   0,   6,   1,  16,   0, \n      1,   0,   0,   0,   6, 129, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  17, \n    226,   0,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   7,   0,   0,   0, \n      6, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,   2,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,  11, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   9,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  85,   0, \n      0,  10, 162,   0,  16,   0, \n      1,   0,   0,   0,   6,   4, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  78,   0,   0,   8, \n    242,   0,  16,   0,   2,   0, \n      0,   0,   0, 208,   0,   0, \n    118,  15,  16,   0,   1,   0, \n      0,   0, 182,  15,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,  10, 162,   0,  16,   0, \n      1,   0,   0,   0, 166,  14, \n     16, 128,  65,   0,   0,   0, \n      0,   0,   0,   0,  86,  13, \n     16,   0,   2,   0,   0,   0, \n     86,  13,  16,   0,   1,   0, \n      0,   0,  41,   0,   0,   7, \n     18,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  10, 130,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  26,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  25,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  18,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     85,   0,   0,  12, 162,   0, \n     16,   0,   1,   0,   0,   0, \n    166, 142,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n     42,   0,   0,   6,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,   2,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n    139,   0,   0,  15, 242,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,  28,   0, \n      0,   0,  27,   0,   0,   0, \n     31,   0,   0,   0,  29,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0, 118,  15, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,   9, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n    140,   0,   0,  10, 130,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  42,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      4,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  25,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     87,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,  42,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n    140,   0,   0,  20,  98,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0,   6,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n     41,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0, 139,   0,   0,  15, \n    162,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  27,   0, \n      0,   0,   0,   0,   0,   0, \n     24,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   6,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     18,   0,   0,   1,  85,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0, 139,   0, \n      0,  15, 242,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,  27,   0,   0,   0, \n     27,   0,   0,   0,  31,   0, \n      0,   0,  28,   0,   0,   0, \n      2,  64,   0,   0,   4,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      4,   0,   0,   0, 140,   0, \n      0,  20,  50,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 230,  10,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  26,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0, 139,   0, \n      0,   9,  18,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,  29,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  30,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n    139,   0,   0,  15,  50,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  27,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  21,   0, \n      0,   1,  38,   0,   0,   8, \n      0, 208,   0,   0,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     32,   0,   0,  10, 226,   0, \n     16,   0,   0,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   2,   0,   0,   0, \n      3,   0,   0,   0,  60,   0, \n      0,   7,  98,   0,  16,   0, \n      0,   0,   0,   0, 166,  11, \n     16,   0,   0,   0,   0,   0, \n     86,   6,  16,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  21,   0,   0,   1, \n      1,   0,   0,  10,  50,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   7,   0,   0, 255,   7, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,  11,   0, \n      0,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     11,   0,   0,   0,  11,   0, \n      0,   0,  70,   4,  16,   0, \n      2,   0,   0,   0,  32,   0, \n      0,  10,  50,   0,  16,   0, \n      4,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   4, \n      0,   0,   0,   4,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,  12, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   1,   4,   0,   0, \n      1,   4,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  55,   0,   0,  15, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,   4,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0, 255,   7,   0,   0, \n    255,   7,   0,   0, 255, 255, \n      0,   0, 255, 255,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   4,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   3,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,  41,   0, \n      0,  10,  50,   0,  16,   0, \n      4,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      4,   0,   0,   0,  87,   0, \n      0,   7,  50,   0,  16,   0, \n      1,   0,   0,   0, 230,  10, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      3,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n    138,   0,   0,  15,  50,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n     21,   0,   0,   0,  21,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     32,   0,   0,  10,  50,   0, \n     16,   0,   4,   0,   0,   0, \n    230,  10,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   4,   0,   0,   0,   4, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,  12, 194,   0,  16,   0, \n      3,   0,   0,   0,   6,   4, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   4,   0,   0,   1,   4, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,  55,   0, \n      0,  15, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,   4, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0, 255,   7, \n      0,   0, 255,   7,   0,   0, \n    255, 255,   0,   0, 255, 255, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  87,   0, \n      0,   7, 194,   0,  16,   0, \n      3,   0,   0,   0, 166,  14, \n     16,   0,   3,   0,   0,   0, \n      6,   4,  16,   0,   4,   0, \n      0,   0,  30,   0,   0,   7, \n    194,   0,  16,   0,   3,   0, \n      0,   0,   6,   4,  16,   0, \n      3,   0,   0,   0, 166,  14, \n     16,   0,   3,   0,   0,   0, \n     41,   0,   0,  10,  50,   0, \n     16,   0,   4,   0,   0,   0, \n    230,  10,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10, 194,   0,  16,   0, \n      3,   0,   0,   0, 166,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,  60,   0,   0,   7, \n    194,   0,  16,   0,   3,   0, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,   6,   4, \n     16,   0,   4,   0,   0,   0, \n     87,   0,   0,   7, 194,   0, \n     16,   0,   3,   0,   0,   0, \n    166,  14,  16,   0,   4,   0, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,  30,   0, \n      0,   7,  50,   0,  16,   0, \n      3,   0,   0,   0,  70,   0, \n     16,   0,   3,   0,   0,   0, \n    230,  10,  16,   0,   3,   0, \n      0,   0,  41,   0,   0,  10, \n     50,   0,  16,   0,   3,   0, \n      0,   0,  70,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  82,   0, \n     16,   0,   3,   0,   0,   0, \n      6,   1,  16,   0,   1,   0, \n      0,   0,   6,   1,  16,   0, \n      3,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  22,   0, \n      0,   0,  22,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   9,   0,   0,   0, \n      9,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     32,   0,   0,  10,  50,   0, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   2,   0,   0,   0,   2, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,  12,  50,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   1,   2, \n      0,   0,   1,   2,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,  55,   0, \n      0,  15, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,   4, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255, 255,   0,   0, 255, 255, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  87,   0, \n      0,   7,  50,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   4,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n     41,   0,   0,  10,  50,   0, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      6,   0,   0,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   4,   0,   0,   0, \n     87,   0,   0,   7,  50,   0, \n     16,   0,   1,   0,   0,   0, \n    230,  10,  16,   0,   4,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  50,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  60,   0,   0,  10, \n    162,   0,  16,   0,   3,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 255, 127,   0,   0, \n      0,   0,   0,   0, 255, 127, \n      1,   0,   0,  10,  50,   0, \n     16,   0,   1,   0,   0,   0, \n    230,  10,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   7,   0,   0, 255,   7, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,  11,   0, \n      0,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     11,   0,   0,   0,  11,   0, \n      0,   0, 230,  14,  16,   0, \n      2,   0,   0,   0,  32,   0, \n      0,  10,  50,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   4, \n      0,   0,   0,   4,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,  12, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   1,   4,   0,   0, \n      1,   4,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  55,   0,   0,  15, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,   4,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0, 255,   7,   0,   0, \n    255,   7,   0,   0, 255, 255, \n      0,   0, 255, 255,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   5,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   4,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,  41,   0, \n      0,  10,  50,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,  87,   0, \n      0,   7,  50,   0,  16,   0, \n      1,   0,   0,   0, 230,  10, \n     16,   0,   5,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      4,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n    138,   0,   0,  15,  50,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n     21,   0,   0,   0,  21,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 230,  10, \n     16,   0,   2,   0,   0,   0, \n     32,   0,   0,  10,  50,   0, \n     16,   0,   4,   0,   0,   0, \n    230,  10,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   4,   0,   0,   0,   4, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,  12,  50,   0,  16,   0, \n      4,   0,   0,   0,  70,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   1,   4, \n      0,   0,   1,   4,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 230,  10,  16,   0, \n      4,   0,   0,   0,  55,   0, \n      0,  15, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,   4, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0, 255,   7, \n      0,   0, 255,   7,   0,   0, \n    255, 255,   0,   0, 255, 255, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  87,   0, \n      0,   7,  50,   0,  16,   0, \n      4,   0,   0,   0,  70,   0, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   5,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   4,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   4,   0,   0,   0, \n     41,   0,   0,  10, 194,   0, \n     16,   0,   4,   0,   0,   0, \n      6,   4,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      4,   0,   0,   0,  70,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   4,   0, \n      0,   0,  70,   0,  16,   0, \n      4,   0,   0,   0, 230,  10, \n     16,   0,   4,   0,   0,   0, \n     87,   0,   0,   7,  50,   0, \n     16,   0,   4,   0,   0,   0, \n    230,  10,  16,   0,   5,   0, \n      0,   0,  70,   0,  16,   0, \n      4,   0,   0,   0,  30,   0, \n      0,   7,  50,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,   4,   0, \n      0,   0,  41,   0,   0,  10, \n     50,   0,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  82,   0, \n     16,   0,   4,   0,   0,   0, \n      6,   1,  16,   0,   1,   0, \n      0,   0,   6,   1,  16,   0, \n      2,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      1,   0,   0,   0, 230,  10, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  22,   0, \n      0,   0,  22,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   9,   0,   0,   0, \n      9,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     32,   0,   0,  10, 194,   0, \n     16,   0,   2,   0,   0,   0, \n      6,   4,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   2,   0,   0, \n      0,   2,   0,   0,  55,   0, \n      0,  12,  50,   0,  16,   0, \n      1,   0,   0,   0, 230,  10, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   1,   2, \n      0,   0,   1,   2,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,  55,   0, \n      0,  15, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,   4, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255, 255,   0,   0, 255, 255, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  87,   0, \n      0,   7,  50,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   5,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n     41,   0,   0,  10, 194,   0, \n     16,   0,   2,   0,   0,   0, \n      6,   4,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   6,   0,   0,   0, \n      6,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0, 230,  10, \n     16,   0,   2,   0,   0,   0, \n     87,   0,   0,   7,  50,   0, \n     16,   0,   1,   0,   0,   0, \n    230,  10,  16,   0,   5,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  50,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  60,   0,   0,  10, \n    162,   0,  16,   0,   4,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 255, 127,   0,   0, \n      0,   0,   0,   0, 255, 127, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  30,   0,   0,  10, \n    178,   0,  16,   0,   1,   0, \n      0,   0, 166,  10,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     32,   0,   0,   0,   0,   0, \n      0,   0,  48,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   0,   0, \n      0,   0,  21,   0,   0,   1, \n      1,   0,   0,  10,  50,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   7,   0,   0, 255,   7, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,  11,   0, \n      0,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     11,   0,   0,   0,  11,   0, \n      0,   0,  70,   4,  16,   0, \n      2,   0,   0,   0,  32,   0, \n      0,  10, 194,   0,  16,   0, \n      0,   0,   0,   0,   6,   4, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   4,   0,   0,   0,   4, \n      0,   0,  55,   0,   0,  12, \n     50,   0,  16,   0,   0,   0, \n      0,   0, 230,  10,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   1,   4,   0,   0, \n      1,   4,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0,  55,   0,   0,  15, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,   4,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0, 255,   7,   0,   0, \n    255,   7,   0,   0, 255, 255, \n      0,   0, 255, 255,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   4,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   3,   0, \n      0,   0,  70,   0,  16,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 194,   0,  16,   0, \n      0,   0,   0,   0,   6,   4, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0, 230,  10,  16,   0, \n      0,   0,   0,   0,  87,   0, \n      0,   7,  50,   0,  16,   0, \n      0,   0,   0,   0, 230,  10, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      3,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n    138,   0,   0,  15, 194,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  21,   0,   0,   0, \n     21,   0,   0,   0,   6,   4, \n     16,   0,   2,   0,   0,   0, \n     32,   0,   0,  10,  50,   0, \n     16,   0,   3,   0,   0,   0, \n    230,  10,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   4,   0,   0,   0,   4, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,  12,  50,   0,  16,   0, \n      3,   0,   0,   0,  70,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   1,   4, \n      0,   0,   1,   4,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 230,  10,  16,   0, \n      3,   0,   0,   0,  55,   0, \n      0,  15, 242,   0,  16,   0, \n      4,   0,   0,   0, 230,  14, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0, 255,   7, \n      0,   0, 255,   7,   0,   0, \n    255, 255,   0,   0, 255, 255, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  87,   0, \n      0,   7,  50,   0,  16,   0, \n      3,   0,   0,   0,  70,   0, \n     16,   0,   3,   0,   0,   0, \n     70,   0,  16,   0,   4,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   3,   0, \n      0,   0, 230,  10,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   3,   0,   0,   0, \n     41,   0,   0,  10, 194,   0, \n     16,   0,   3,   0,   0,   0, \n      6,   4,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      3,   0,   0,   0,  70,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   3,   0, \n      0,   0,  70,   0,  16,   0, \n      3,   0,   0,   0, 230,  10, \n     16,   0,   3,   0,   0,   0, \n     87,   0,   0,   7,  50,   0, \n     16,   0,   3,   0,   0,   0, \n    230,  10,  16,   0,   4,   0, \n      0,   0,  70,   0,  16,   0, \n      3,   0,   0,   0,  30,   0, \n      0,   7, 194,   0,  16,   0, \n      0,   0,   0,   0, 166,  14, \n     16,   0,   0,   0,   0,   0, \n      6,   4,  16,   0,   3,   0, \n      0,   0,  41,   0,   0,  10, \n    194,   0,  16,   0,   0,   0, \n      0,   0, 166,  14,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     60,   0,   0,   7,  82,   0, \n     16,   0,   0,   0,   0,   0, \n    166,  11,  16,   0,   0,   0, \n      0,   0,   6,   1,  16,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  22,   0, \n      0,   0,  22,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   3,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   9,   0,   0,   0, \n      9,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     32,   0,   0,  10, 194,   0, \n     16,   0,   3,   0,   0,   0, \n      6,   4,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   2,   0,   0, \n      0,   2,   0,   0,  55,   0, \n      0,  12,  50,   0,  16,   0, \n      2,   0,   0,   0, 230,  10, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   1,   2, \n      0,   0,   1,   2,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,  55,   0, \n      0,  15, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,   4, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255, 255,   0,   0, 255, 255, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  87,   0, \n      0,   7,  50,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,   4,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      3,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     41,   0,   0,  10, 194,   0, \n     16,   0,   3,   0,   0,   0, \n      6,   4,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   6,   0,   0,   0, \n      6,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0, 230,  10, \n     16,   0,   3,   0,   0,   0, \n     87,   0,   0,   7,  50,   0, \n     16,   0,   2,   0,   0,   0, \n    230,  10,  16,   0,   4,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,  30,   0, \n      0,   7,  50,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   3,   0,   0,   0, \n     70,   0,  16,   0,   2,   0, \n      0,   0,  60,   0,   0,  10, \n    162,   0,  16,   0,   0,   0, \n      0,   0,   6,   4,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 255, 127,   0,   0, \n      0,   0,   0,   0, 255, 127, \n      1,   0,   0,  10,  50,   0, \n     16,   0,   2,   0,   0,   0, \n    230,  10,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   7,   0,   0, 255,   7, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 138,   0, \n      0,  15, 242,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,  11,   0, \n      0,   0,  11,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     11,   0,   0,   0,  11,   0, \n      0,   0, 230,  14,  16,   0, \n      2,   0,   0,   0,  32,   0, \n      0,  10,  50,   0,  16,   0, \n      4,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   4, \n      0,   0,   0,   4,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  55,   0,   0,  12, \n     50,   0,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   1,   4,   0,   0, \n      1,   4,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   2,   0, \n      0,   0,  55,   0,   0,  15, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,   4,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0, 255,   7,   0,   0, \n    255,   7,   0,   0, 255, 255, \n      0,   0, 255, 255,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     50,   0,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   4,   0,   0,   0, \n     30,   0,   0,   7,  50,   0, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,   3,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,  41,   0, \n      0,  10,  50,   0,  16,   0, \n      4,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n     50,   0,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      4,   0,   0,   0,  87,   0, \n      0,   7,  50,   0,  16,   0, \n      2,   0,   0,   0, 230,  10, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   2,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      3,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n    138,   0,   0,  15,  50,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n     21,   0,   0,   0,  21,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 230,  10, \n     16,   0,   2,   0,   0,   0, \n     32,   0,   0,  10,  50,   0, \n     16,   0,   4,   0,   0,   0, \n    230,  10,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   4,   0,   0,   0,   4, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,  12, 194,   0,  16,   0, \n      3,   0,   0,   0,   6,   4, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   4,   0,   0,   1,   4, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,  55,   0, \n      0,  15, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,   4, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0, 255,   7, \n      0,   0, 255,   7,   0,   0, \n    255, 255,   0,   0, 255, 255, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  87,   0, \n      0,   7, 194,   0,  16,   0, \n      3,   0,   0,   0, 166,  14, \n     16,   0,   3,   0,   0,   0, \n      6,   4,  16,   0,   4,   0, \n      0,   0,  30,   0,   0,   7, \n    194,   0,  16,   0,   3,   0, \n      0,   0,   6,   4,  16,   0, \n      3,   0,   0,   0, 166,  14, \n     16,   0,   3,   0,   0,   0, \n     41,   0,   0,  10,  50,   0, \n     16,   0,   4,   0,   0,   0, \n    230,  10,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10, 194,   0,  16,   0, \n      3,   0,   0,   0, 166,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,  60,   0,   0,   7, \n    194,   0,  16,   0,   3,   0, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,   6,   4, \n     16,   0,   4,   0,   0,   0, \n     87,   0,   0,   7, 194,   0, \n     16,   0,   3,   0,   0,   0, \n    166,  14,  16,   0,   4,   0, \n      0,   0, 166,  14,  16,   0, \n      3,   0,   0,   0,  30,   0, \n      0,   7,  50,   0,  16,   0, \n      3,   0,   0,   0,  70,   0, \n     16,   0,   3,   0,   0,   0, \n    230,  10,  16,   0,   3,   0, \n      0,   0,  41,   0,   0,  10, \n     50,   0,  16,   0,   3,   0, \n      0,   0,  70,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  82,   0, \n     16,   0,   3,   0,   0,   0, \n      6,   1,  16,   0,   2,   0, \n      0,   0,   6,   1,  16,   0, \n      3,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      2,   0,   0,   0, 230,  10, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  22,   0, \n      0,   0,  22,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n    194,   0,  16,   0,   2,   0, \n      0,   0,   6,   4,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   9,   0, \n      0,   0,   9,   0,   0,   0, \n     32,   0,   0,  10,  50,   0, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   2,   0,   0,   0,   2, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  55,   0, \n      0,  12,  50,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   1,   2, \n      0,   0,   1,   2,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,  55,   0, \n      0,  15, 242,   0,  16,   0, \n      4,   0,   0,   0, 230,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0, 255,   3, \n      0,   0, 255,   3,   0,   0, \n    255, 255,   0,   0, 255, 255, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  87,   0, \n      0,   7,  50,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,   4,   0, \n      0,   0,  30,   0,   0,   7, \n     50,   0,  16,   0,   2,   0, \n      0,   0, 230,  10,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     41,   0,   0,  10,  50,   0, \n     16,   0,   4,   0,   0,   0, \n     70,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      6,   0,   0,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   4,   0,   0,   0, \n     87,   0,   0,   7,  50,   0, \n     16,   0,   2,   0,   0,   0, \n    230,  10,  16,   0,   4,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,  30,   0, \n      0,   7,  50,   0,  16,   0, \n      2,   0,   0,   0, 230,  10, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,   2,   0, \n      0,   0,  60,   0,   0,  10, \n    162,   0,  16,   0,   3,   0, \n      0,   0,   6,   4,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 255, 127,   0,   0, \n      0,   0,   0,   0, 255, 127, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   0,   0, \n      0,   0, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  62,   0, \n      0,   1,  83,  84,  65,  84, \n    148,   0,   0,   0, 247,   0, \n      0,   0,   6,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     82,   0,   0,   0,  89,   0, \n      0,   0,   3,   0,   0,   0, \n      6,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     24,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   4,   0, \n      0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_r16_snorm_float_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 5\ndcl_thread_group 4, 32, 1\nand r0.xy, CB0[0][0].xxxx, l(1, 2, 0, 0)\nishl r1.x, vThreadID.x, l(4)\nmov r1.y, vThreadID.y\nuge r0.zw, r1.xxxy, CB0[0][1].xxxy\nor r0.z, r0.w, r0.z\nif_nz r0.z\n  ret \nendif \nubfe r0.z, l(2), l(2), CB0[0][0].x\nishl r0.w, r1.x, l(1)\nimad r1.y, vThreadID.z, CB0[0][1].y, vThreadID.y\nimad r0.w, r1.y, CB0[0][2].x, r0.w\niadd r0.w, r0.w, CB0[0][1].w\nif_z r0.x\n  imad r1.y, CB0[0][0].w, vThreadID.z, vThreadID.y\n  imad r1.y, CB0[0][0].z, r1.y, r1.x\n  ishl r1.y, r1.y, l(1)\nelse \n  if_nz r0.y\n    ushr r1.zw, CB0[0][0].zzzw, l(0, 0, 5, 4)\n    ishr r2.xyzw, vThreadID.zyyy, l(2, 4, 1, 3)\n    imad r0.y, r2.x, r1.w, r2.y\n    ibfe r1.w, l(27), l(1), vThreadID.x\n    imad r0.y, r0.y, r1.z, r1.w\n    bfi r1.zw, l(0, 0, 2, 1), l(0, 0, 5, 4), vThreadID.zzzy, l(0, 0, 0, 0)\n    bfi r2.y, l(2), l(3), r2.z, l(0)\n    iadd r1.z, r1.z, r2.y\n    bfi r0.y, l(25), l(7), r0.y, r1.z\n    xor r1.z, r2.x, r2.w\n    ishr r2.x, r1.x, l(3)\n    and r2.x, r2.x, l(2)\n    bfi r2.yz, l(0, 1, 1, 0), l(0, 1, 11, 0), r1.zzzz, l(0, 0, 0, 0)\n    xor r1.z, r2.y, r2.x\n    ishl r1.z, r1.z, l(6)\n    iadd r1.z, r1.z, r1.w\n    iadd r1.z, r2.z, r1.z\n    ibfe r2.xyz, l(28, 27, 24, 0), l(3, 4, 7, 0), r0.yyyy\n    bfi r0.y, l(1), l(5), r2.x, r1.z\n    bfi r0.y, l(3), l(8), r2.y, r0.y\n    bfi r1.y, l(20), l(12), r2.z, r0.y\n  else \n    ushr r0.y, CB0[0][0].z, l(5)\n    ishr r2.xyzw, vThreadID.yyyy, l(5, 1, 4, 3)\n    ibfe r1.z, l(27), l(1), vThreadID.x\n    imad r0.y, r2.x, r0.y, r1.z\n    bfi r2.xyz, l(3, 1, 1, 0), l(3, 1, 11, 0), r2.ywzy, l(0, 0, 0, 0)\n    bfi r0.y, l(26), l(6), r0.y, r2.x\n    ishr r1.x, r1.x, l(3)\n    and r1.x, r1.x, l(2)\n    xor r1.x, r2.y, r1.x\n    bfi r1.z, l(1), l(4), vThreadID.y, l(0)\n    ishl r1.x, r1.x, l(6)\n    iadd r1.x, r1.x, r1.z\n    iadd r1.x, r2.z, r1.x\n    ibfe r2.xyz, l(28, 27, 24, 0), l(3, 4, 7, 0), r0.yyyy\n    bfi r0.y, l(1), l(5), r2.x, r1.x\n    bfi r0.y, l(3), l(8), r2.y, r0.y\n    bfi r1.y, l(20), l(12), r2.z, r0.y\n  endif \nendif \niadd r0.y, r1.y, CB0[0][0].y\nld_raw r1.xyzw, r0.y, T0[0].xyzw\nieq r0.z, r0.z, l(1)\nif_nz r0.z\n  ishl r2.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r2.xyzw, r2.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r3.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r1.xyzw, r2.xyzw, r3.xyzw\nendif \nibfe r2.xyzw, l(16, 16, 16, 16), l(0, 0, 0, 0), r1.xyzw\nitof r2.xyzw, r2.xyzw\nmul r2.xyzw, r2.xyzw, l(0.000031, 0.000031, 0.000031, 0.000031)\nmax r2.xyzw, r2.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\nishr r1.xyzw, r1.xyzw, l(16, 16, 16, 16)\nitof r1.xyzw, r1.xyzw\nmul r1.xyzw, r1.xyzw, l(0.000031, 0.000031, 0.000031, 0.000031)\nmax r1.xyzw, r1.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\nf32tof16 r2.xyzw, r2.xyzw\nf32tof16 r1.xyzw, r1.xyzw\nimad r1.xyzw, r1.xyzw, l(0x00010000, 0x00010000, 0x00010000, 0x00010000), r2.xyzw\nstore_raw U0[0].xyzw, r0.w, r1.xyzw\niadd r1.x, r0.w, l(16)\nif_nz r0.x\n  mov r0.x, l(64)\nelse \n  mov r0.x, l(16)\nendif \niadd r0.x, r0.x, r0.y\nld_raw r2.xyzw, r0.x, T0[0].xyzw\nif_nz r0.z\n  ishl r3.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r2.xyzw, r3.xyzw, r4.xyzw\nendif \nibfe r3.xyzw, l(16, 16, 16, 16), l(0, 0, 0, 0), r2.xyzw\nitof r3.xyzw, r3.xyzw\nmul r3.xyzw, r3.xyzw, l(0.000031, 0.000031, 0.000031, 0.000031)\nmax r3.xyzw, r3.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\nishr r2.xyzw, r2.xyzw, l(16, 16, 16, 16)\nitof r2.xyzw, r2.xyzw\nmul r2.xyzw, r2.xyzw, l(0.000031, 0.000031, 0.000031, 0.000031)\nmax r2.xyzw, r2.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\nf32tof16 r3.xyzw, r3.xyzw\nf32tof16 r2.xyzw, r2.xyzw\nimad r2.xyzw, r2.xyzw, l(0x00010000, 0x00010000, 0x00010000, 0x00010000), r3.xyzw\nstore_raw U0[0].xyzw, r1.x, r2.xyzw\nret \n// Approximately 110 instruction slots used\n#endif\n\nconst BYTE texture_load_r16_snorm_float_cs[] =\n{\n     68,  88,  66,  67,  38,  10, \n     44, 174,  13, 140, 138, 138, \n     30, 176,  55, 170, 242,  27, \n    198,  47,   1,   0,   0,   0, \n     12,  19,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n    112,  18,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n     52,  14,   0,   0,  81,   0, \n      5,   0, 141,   3,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   5,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  12,  50,   0,  16,   0, \n      0,   0,   0,   0,   6, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n    194,   0,  16,   0,   0,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0,   6, 132, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  11, \n     66,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,   2,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,  11, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  31,   0, \n      0,   3,  10,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  58, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  42,   0,   2,   0, \n     26,   0,   2,   0,  35,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     41,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  18,   0, \n      0,   1,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,  12, \n    194,   0,  16,   0,   1,   0, \n      0,   0, 166, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0,  42,   0,   0,   9, \n    242,   0,  16,   0,   2,   0, \n      0,   0, 102,   5,   2,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      1,   0,   0,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 139,   0,   0,   8, \n    130,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     27,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     10,   0,   2,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  19, 194,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0, 166,   6,   2,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     25,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  87,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,   0,   7, \n     18,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   7,  18,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  20,  98,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0, 166,  10,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  30,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 139,   0, \n      0,  15, 114,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  28,   0,   0,   0, \n     27,   0,   0,   0,  24,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   4,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  86,   5,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  18,   0, \n      0,   1,  85,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  42,   0,   0,   9, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  86,   5,   2,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   1,   0,   0,   0, \n      4,   0,   0,   0,   3,   0, \n      0,   0, 139,   0,   0,   8, \n     66,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     27,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     10,   0,   2,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  20, 114,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0, 214,   6,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  26,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  87,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  10, \n     66,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     26,   0,   2,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     41,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    139,   0,   0,  15, 114,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  28,   0, \n      0,   0,  27,   0,   0,   0, \n     24,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   4,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  21,   0, \n      0,   1,  30,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  32,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  31,   0,   4,   3, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  21,   0, \n      0,   1, 139,   0,   0,  15, \n    242,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n      0,  56,   0,   1,   0,  56, \n      0,   1,   0,  56,   0,   1, \n      0,  56,  52,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n     42,   0,   0,  10, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1,   0,  56,   0,   1, \n      0,  56,   0,   1,   0,  56, \n      0,   1,   0,  56,  52,   0, \n      0,  10, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191, 130,   0,   0,   5, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0, 130,   0, \n      0,   5, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     35,   0,   0,  12, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  64,   0, \n      0,   0,  18,   0,   0,   1, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0,  21,   0,   0,   1, \n     30,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,  85,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  21,   0,   0,   1, \n    139,   0,   0,  15, 242,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   1,   0,  56, \n      0,   1,   0,  56,   0,   1, \n      0,  56,   0,   1,   0,  56, \n     52,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,  42,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n      0,  56,   0,   1,   0,  56, \n      0,   1,   0,  56,   0,   1, \n      0,  56,  52,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n    130,   0,   0,   5, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0, 130,   0,   0,   5, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  35,   0, \n      0,  12, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,  70,  14,  16,   0, \n      3,   0,   0,   0, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     62,   0,   0,   1,  83,  84, \n     65,  84, 148,   0,   0,   0, \n    110,   0,   0,   0,   5,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   8,   0, \n      0,   0,  34,   0,   0,   0, \n     16,   0,   0,   0,   5,   0, \n      0,   0,   6,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_r16_snorm_float_scaled_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 5\ndcl_thread_group 4, 32, 1\nand r0.x, CB0[0][0].x, l(2)\nishl r1.x, vThreadID.x, l(4)\nmov r1.y, vThreadID.y\nuge r0.yz, r1.xxyx, CB0[0][1].xxyx\nor r0.y, r0.z, r0.y\nif_nz r0.y\n  ret \nendif \nubfe r0.yzw, l(0, 2, 3, 3), l(0, 2, 4, 7), CB0[0][0].xxxx\nishl r1.z, r1.x, l(1)\nimad r1.w, vThreadID.z, CB0[0][1].y, vThreadID.y\nimad r1.z, r1.w, CB0[0][2].x, r1.z\niadd r1.z, r1.z, CB0[0][1].w\nushr r1.xy, r1.xyxx, l(4, 2, 0, 0)\nudiv r2.xyzw, null, r1.yxyy, r0.wzww\nimad r1.xy, -r0.zwzz, r2.ywyy, r1.xyxx\nishl r3.xy, r2.wyww, l(2, 4, 0, 0)\nimad r1.x, r1.x, r0.w, r1.y\nbfi r1.y, l(2), l(5), vThreadID.y, l(0)\nbfi r1.x, l(25), l(7), r1.x, r1.y\nif_nz r0.x\n  ushr r1.yw, CB0[0][0].zzzw, l(0, 5, 0, 4)\n  ishr r0.x, vThreadID.z, l(2)\n  ibfe r4.xyz, l(28, 27, 29, 0), l(2, 1, 1, 0), r2.wyww\n  imad r1.w, r0.x, r1.w, r4.x\n  imad r1.y, r1.w, r1.y, r4.y\n  bfi r1.w, l(2), l(5), vThreadID.z, l(0)\n  ishr r3.zw, r3.xxxy, l(0, 0, 1, 3)\n  bfi r3.z, l(2), l(3), r3.z, l(0)\n  iadd r1.w, r1.w, r3.z\n  bfi r1.y, l(25), l(7), r1.y, r1.w\n  xor r0.x, r0.x, r4.z\n  and r1.w, r3.w, l(2)\n  bfi r3.zw, l(0, 0, 1, 1), l(0, 0, 1, 11), r0.xxxx, l(0, 0, 0, 0)\n  xor r0.x, r1.w, r3.z\n  ishl r0.x, r0.x, l(6)\n  iadd r0.x, r3.w, r0.x\n  ibfe r1.yw, l(0, 27, 0, 24), l(0, 4, 0, 7), r1.yyyy\n  bfi r0.x, l(3), l(8), r1.y, r0.x\n  bfi r0.x, l(20), l(12), r1.w, r0.x\nelse \n  ushr r1.y, CB0[0][0].z, l(5)\n  ibfe r2.xyzw, l(27, 27, 28, 29), l(3, 1, 2, 1), r2.xyzw\n  imad r1.y, r2.x, r1.y, r2.y\n  ishr r2.xy, r3.xyxx, l(1, 3, 0, 0)\n  bfi r1.w, l(3), l(3), r2.x, l(0)\n  bfi r1.y, l(26), l(6), r1.y, r1.w\n  and r1.w, r2.y, l(2)\n  bfi r2.xy, l(1, 1, 0, 0), l(1, 11, 0, 0), r2.wzww, l(0, 0, 0, 0)\n  xor r1.w, r1.w, r2.x\n  ishl r1.w, r1.w, l(6)\n  iadd r1.w, r2.y, r1.w\n  ibfe r2.xy, l(27, 24, 0, 0), l(4, 7, 0, 0), r1.yyyy\n  bfi r1.y, l(3), l(8), r2.x, r1.w\n  bfi r0.x, l(20), l(12), r2.y, r1.y\nendif \nimul null, r0.z, r0.w, r0.z\nimad r0.x, r0.x, r0.z, r1.x\niadd r0.x, r0.x, CB0[0][0].y\nld_raw r2.xyzw, r0.x, T0[0].xyzw\nieq r0.y, r0.y, l(1)\nif_nz r0.y\n  ishl r3.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r2.xyzw, r3.xyzw, r4.xyzw\nendif \nibfe r3.xyzw, l(16, 16, 16, 16), l(0, 0, 0, 0), r2.xyzw\nitof r3.xyzw, r3.xyzw\nmul r3.xyzw, r3.xyzw, l(0.000031, 0.000031, 0.000031, 0.000031)\nmax r3.xyzw, r3.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\nishr r2.xyzw, r2.xyzw, l(16, 16, 16, 16)\nitof r2.xyzw, r2.xyzw\nmul r2.xyzw, r2.xyzw, l(0.000031, 0.000031, 0.000031, 0.000031)\nmax r2.xyzw, r2.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\nf32tof16 r3.xyzw, r3.xyzw\nf32tof16 r2.xyzw, r2.xyzw\nimad r2.xyzw, r2.xyzw, l(0x00010000, 0x00010000, 0x00010000, 0x00010000), r3.xyzw\nstore_raw U0[0].xyzw, r1.z, r2.xyzw\niadd r0.z, r1.z, l(16)\niadd r0.x, r0.x, l(16)\nld_raw r2.xyzw, r0.x, T0[0].xyzw\nif_nz r0.y\n  ishl r3.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r2.xyzw, r3.xyzw, r4.xyzw\nendif \nibfe r3.xyzw, l(16, 16, 16, 16), l(0, 0, 0, 0), r2.xyzw\nitof r3.xyzw, r3.xyzw\nmul r3.xyzw, r3.xyzw, l(0.000031, 0.000031, 0.000031, 0.000031)\nmax r3.xyzw, r3.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\nishr r2.xyzw, r2.xyzw, l(16, 16, 16, 16)\nitof r2.xyzw, r2.xyzw\nmul r2.xyzw, r2.xyzw, l(0.000031, 0.000031, 0.000031, 0.000031)\nmax r2.xyzw, r2.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\nf32tof16 r3.xyzw, r3.xyzw\nf32tof16 r2.xyzw, r2.xyzw\nimad r2.xyzw, r2.xyzw, l(0x00010000, 0x00010000, 0x00010000, 0x00010000), r3.xyzw\nstore_raw U0[0].xyzw, r0.z, r2.xyzw\nret \n// Approximately 103 instruction slots used\n#endif\n\nconst BYTE texture_load_r16_snorm_float_scaled_cs[] =\n{\n     68,  88,  66,  67,  23, 172, \n     74, 121,  13,  98, 183,  91, \n    201, 212, 249, 101,  64, 138, \n    164,  26,   1,   0,   0,   0, \n     32,  19,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n    132,  18,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n     72,  14,   0,   0,  81,   0, \n      5,   0, 146,   3,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   5,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n     98,   0,  16,   0,   0,   0, \n      0,   0,   6,   1,  16,   0, \n      1,   0,   0,   0,   6, 129, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  17, \n    226,   0,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   7,   0,   0,   0, \n      6, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  35,   0,   0,   9, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,   2,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,  11, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   9,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  78,   0,   0,   8, \n    242,   0,  16,   0,   2,   0, \n      0,   0,   0, 208,   0,   0, \n     22,   5,  16,   0,   1,   0, \n      0,   0, 182,  15,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,  10,  50,   0,  16,   0, \n      1,   0,   0,   0, 230,  10, \n     16, 128,  65,   0,   0,   0, \n      0,   0,   0,   0, 214,   5, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  41,   0,   0,  10, \n     50,   0,  16,   0,   3,   0, \n      0,   0, 118,  15,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  10,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  26,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  25,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     85,   0,   0,  12, 162,   0, \n     16,   0,   1,   0,   0,   0, \n    166, 142,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n     42,   0,   0,   6,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,   2,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n    139,   0,   0,  15, 114,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,  28,   0, \n      0,   0,  27,   0,   0,   0, \n     29,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0, 118,  15, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,   9, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n    140,   0,   0,  10, 130,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  42,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  42,   0, \n      0,  10, 194,   0,  16,   0, \n      3,   0,   0,   0,   6,   4, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   3,   0, \n      0,   0, 140,   0,   0,  11, \n     66,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     25,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  87,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   4,   0, \n      0,   0,   1,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n    140,   0,   0,  20, 194,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     11,   0,   0,   0,   6,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n     41,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0, 139,   0,   0,  15, \n    162,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  27,   0, \n      0,   0,   0,   0,   0,   0, \n     24,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,   7,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     18,   0,   0,   1,  85,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0, 139,   0, \n      0,  15, 242,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  27,   0,   0,   0, \n     27,   0,   0,   0,  28,   0, \n      0,   0,  29,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n      0,  10,  50,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n    130,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  26,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n      1,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  20,  50,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 182,  15,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  30,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n    139,   0,   0,  15,  50,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  27,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  21,   0, \n      0,   1,  38,   0,   0,   8, \n      0, 208,   0,   0,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     32,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     21,   0,   0,   1, 139,   0, \n      0,  15, 242,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1,   0,  56,   0,   1, \n      0,  56,   0,   1,   0,  56, \n      0,   1,   0,  56,  52,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,  42,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   1,   0,  56, \n      0,   1,   0,  56,   0,   1, \n      0,  56,   0,   1,   0,  56, \n     52,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191, 130,   0, \n      0,   5, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n    130,   0,   0,   5, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  35,   0,   0,  12, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  21,   0, \n      0,   1, 139,   0,   0,  15, \n    242,   0,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n      0,  56,   0,   1,   0,  56, \n      0,   1,   0,  56,   0,   1, \n      0,  56,  52,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n     42,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1,   0,  56,   0,   1, \n      0,  56,   0,   1,   0,  56, \n      0,   1,   0,  56,  52,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191, 130,   0,   0,   5, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0, 130,   0, \n      0,   5, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,  12, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  62,   0,   0,   1, \n     83,  84,  65,  84, 148,   0, \n      0,   0, 103,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      8,   0,   0,   0,  33,   0, \n      0,   0,  18,   0,   0,   0, \n      3,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_r16_unorm_float_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 5\ndcl_thread_group 4, 32, 1\nand r0.xy, CB0[0][0].xxxx, l(1, 2, 0, 0)\nishl r1.x, vThreadID.x, l(4)\nmov r1.y, vThreadID.y\nuge r0.zw, r1.xxxy, CB0[0][1].xxxy\nor r0.z, r0.w, r0.z\nif_nz r0.z\n  ret \nendif \nubfe r0.z, l(2), l(2), CB0[0][0].x\nishl r0.w, r1.x, l(1)\nimad r1.y, vThreadID.z, CB0[0][1].y, vThreadID.y\nimad r0.w, r1.y, CB0[0][2].x, r0.w\niadd r0.w, r0.w, CB0[0][1].w\nif_z r0.x\n  imad r1.y, CB0[0][0].w, vThreadID.z, vThreadID.y\n  imad r1.y, CB0[0][0].z, r1.y, r1.x\n  ishl r1.y, r1.y, l(1)\nelse \n  if_nz r0.y\n    ushr r1.zw, CB0[0][0].zzzw, l(0, 0, 5, 4)\n    ishr r2.xyzw, vThreadID.zyyy, l(2, 4, 1, 3)\n    imad r0.y, r2.x, r1.w, r2.y\n    ibfe r1.w, l(27), l(1), vThreadID.x\n    imad r0.y, r0.y, r1.z, r1.w\n    bfi r1.zw, l(0, 0, 2, 1), l(0, 0, 5, 4), vThreadID.zzzy, l(0, 0, 0, 0)\n    bfi r2.y, l(2), l(3), r2.z, l(0)\n    iadd r1.z, r1.z, r2.y\n    bfi r0.y, l(25), l(7), r0.y, r1.z\n    xor r1.z, r2.x, r2.w\n    ishr r2.x, r1.x, l(3)\n    and r2.x, r2.x, l(2)\n    bfi r2.yz, l(0, 1, 1, 0), l(0, 1, 11, 0), r1.zzzz, l(0, 0, 0, 0)\n    xor r1.z, r2.y, r2.x\n    ishl r1.z, r1.z, l(6)\n    iadd r1.z, r1.z, r1.w\n    iadd r1.z, r2.z, r1.z\n    ibfe r2.xyz, l(28, 27, 24, 0), l(3, 4, 7, 0), r0.yyyy\n    bfi r0.y, l(1), l(5), r2.x, r1.z\n    bfi r0.y, l(3), l(8), r2.y, r0.y\n    bfi r1.y, l(20), l(12), r2.z, r0.y\n  else \n    ushr r0.y, CB0[0][0].z, l(5)\n    ishr r2.xyzw, vThreadID.yyyy, l(5, 1, 4, 3)\n    ibfe r1.z, l(27), l(1), vThreadID.x\n    imad r0.y, r2.x, r0.y, r1.z\n    bfi r2.xyz, l(3, 1, 1, 0), l(3, 1, 11, 0), r2.ywzy, l(0, 0, 0, 0)\n    bfi r0.y, l(26), l(6), r0.y, r2.x\n    ishr r1.x, r1.x, l(3)\n    and r1.x, r1.x, l(2)\n    xor r1.x, r2.y, r1.x\n    bfi r1.z, l(1), l(4), vThreadID.y, l(0)\n    ishl r1.x, r1.x, l(6)\n    iadd r1.x, r1.x, r1.z\n    iadd r1.x, r2.z, r1.x\n    ibfe r2.xyz, l(28, 27, 24, 0), l(3, 4, 7, 0), r0.yyyy\n    bfi r0.y, l(1), l(5), r2.x, r1.x\n    bfi r0.y, l(3), l(8), r2.y, r0.y\n    bfi r1.y, l(20), l(12), r2.z, r0.y\n  endif \nendif \niadd r0.y, r1.y, CB0[0][0].y\nld_raw r1.xyzw, r0.y, T0[0].xyzw\nieq r0.z, r0.z, l(1)\nif_nz r0.z\n  ishl r2.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r2.xyzw, r2.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r3.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r1.xyzw, r2.xyzw, r3.xyzw\nendif \nand r2.xyzw, r1.xyzw, l(0x0000ffff, 0x0000ffff, 0x0000ffff, 0x0000ffff)\nutof r2.xyzw, r2.xyzw\nmul r2.xyzw, r2.xyzw, l(0.000015, 0.000015, 0.000015, 0.000015)\nushr r1.xyzw, r1.xyzw, l(16, 16, 16, 16)\nutof r1.xyzw, r1.xyzw\nmul r1.xyzw, r1.xyzw, l(0.000015, 0.000015, 0.000015, 0.000015)\nf32tof16 r2.xyzw, r2.xyzw\nf32tof16 r1.xyzw, r1.xyzw\nimad r1.xyzw, r1.xyzw, l(0x00010000, 0x00010000, 0x00010000, 0x00010000), r2.xyzw\nstore_raw U0[0].xyzw, r0.w, r1.xyzw\niadd r1.x, r0.w, l(16)\nif_nz r0.x\n  mov r0.x, l(64)\nelse \n  mov r0.x, l(16)\nendif \niadd r0.x, r0.x, r0.y\nld_raw r2.xyzw, r0.x, T0[0].xyzw\nif_nz r0.z\n  ishl r3.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r2.xyzw, r3.xyzw, r4.xyzw\nendif \nand r3.xyzw, r2.xyzw, l(0x0000ffff, 0x0000ffff, 0x0000ffff, 0x0000ffff)\nutof r3.xyzw, r3.xyzw\nmul r3.xyzw, r3.xyzw, l(0.000015, 0.000015, 0.000015, 0.000015)\nushr r2.xyzw, r2.xyzw, l(16, 16, 16, 16)\nutof r2.xyzw, r2.xyzw\nmul r2.xyzw, r2.xyzw, l(0.000015, 0.000015, 0.000015, 0.000015)\nf32tof16 r3.xyzw, r3.xyzw\nf32tof16 r2.xyzw, r2.xyzw\nimad r2.xyzw, r2.xyzw, l(0x00010000, 0x00010000, 0x00010000, 0x00010000), r3.xyzw\nstore_raw U0[0].xyzw, r1.x, r2.xyzw\nret \n// Approximately 106 instruction slots used\n#endif\n\nconst BYTE texture_load_r16_unorm_float_cs[] =\n{\n     68,  88,  66,  67, 160, 211, \n     87, 198,  82, 118, 161, 155, \n    170, 245, 201, 137, 167, 242, \n     44, 222,   1,   0,   0,   0, \n     68,  18,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n    168,  17,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n    108,  13,   0,   0,  81,   0, \n      5,   0,  91,   3,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   5,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  12,  50,   0,  16,   0, \n      0,   0,   0,   0,   6, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n    194,   0,  16,   0,   0,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0,   6, 132, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  11, \n     66,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,   2,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,  11, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  31,   0, \n      0,   3,  10,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  58, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  42,   0,   2,   0, \n     26,   0,   2,   0,  35,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     41,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  18,   0, \n      0,   1,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,  12, \n    194,   0,  16,   0,   1,   0, \n      0,   0, 166, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0,  42,   0,   0,   9, \n    242,   0,  16,   0,   2,   0, \n      0,   0, 102,   5,   2,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      1,   0,   0,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 139,   0,   0,   8, \n    130,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     27,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     10,   0,   2,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  19, 194,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0, 166,   6,   2,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     25,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  87,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,   0,   7, \n     18,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   7,  18,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  20,  98,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0, 166,  10,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  30,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 139,   0, \n      0,  15, 114,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  28,   0,   0,   0, \n     27,   0,   0,   0,  24,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   4,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  86,   5,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  18,   0, \n      0,   1,  85,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  42,   0,   0,   9, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  86,   5,   2,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   1,   0,   0,   0, \n      4,   0,   0,   0,   3,   0, \n      0,   0, 139,   0,   0,   8, \n     66,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     27,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     10,   0,   2,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  20, 114,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0, 214,   6,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  26,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  87,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  10, \n     66,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     26,   0,   2,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     41,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    139,   0,   0,  15, 114,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  28,   0, \n      0,   0,  27,   0,   0,   0, \n     24,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   4,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  21,   0, \n      0,   1,  30,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  32,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  31,   0,   4,   3, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  21,   0, \n      0,   1,   1,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0, 255, 255,   0,   0, \n    255, 255,   0,   0, 255, 255, \n      0,   0, 255, 255,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0, 128,   0, 128,  55, \n    128,   0, 128,  55, 128,   0, \n    128,  55, 128,   0, 128,  55, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n    128,   0, 128,  55, 128,   0, \n    128,  55, 128,   0, 128,  55, \n    128,   0, 128,  55, 130,   0, \n      0,   5, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n    130,   0,   0,   5, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  35,   0,   0,  12, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     64,   0,   0,   0,  18,   0, \n      0,   1,  54,   0,   0,   5, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0,  21,   0, \n      0,   1,  30,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  21,   0, \n      0,   1,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0, 255, 255,   0,   0, \n    255, 255,   0,   0, 255, 255, \n      0,   0, 255, 255,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0, 128,   0, 128,  55, \n    128,   0, 128,  55, 128,   0, \n    128,  55, 128,   0, 128,  55, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n    128,   0, 128,  55, 128,   0, \n    128,  55, 128,   0, 128,  55, \n    128,   0, 128,  55, 130,   0, \n      0,   5, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n    130,   0,   0,   5, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  35,   0,   0,  12, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  62,   0, \n      0,   1,  83,  84,  65,  84, \n    148,   0,   0,   0, 106,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   4,   0,   0,   0, \n     32,   0,   0,   0,  20,   0, \n      0,   0,   5,   0,   0,   0, \n      6,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_r16_unorm_float_scaled_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 5\ndcl_thread_group 4, 32, 1\nand r0.x, CB0[0][0].x, l(2)\nishl r1.x, vThreadID.x, l(4)\nmov r1.y, vThreadID.y\nuge r0.yz, r1.xxyx, CB0[0][1].xxyx\nor r0.y, r0.z, r0.y\nif_nz r0.y\n  ret \nendif \nubfe r0.yzw, l(0, 2, 3, 3), l(0, 2, 4, 7), CB0[0][0].xxxx\nishl r1.z, r1.x, l(1)\nimad r1.w, vThreadID.z, CB0[0][1].y, vThreadID.y\nimad r1.z, r1.w, CB0[0][2].x, r1.z\niadd r1.z, r1.z, CB0[0][1].w\nushr r1.xy, r1.xyxx, l(4, 2, 0, 0)\nudiv r2.xyzw, null, r1.yxyy, r0.wzww\nimad r1.xy, -r0.zwzz, r2.ywyy, r1.xyxx\nishl r3.xy, r2.wyww, l(2, 4, 0, 0)\nimad r1.x, r1.x, r0.w, r1.y\nbfi r1.y, l(2), l(5), vThreadID.y, l(0)\nbfi r1.x, l(25), l(7), r1.x, r1.y\nif_nz r0.x\n  ushr r1.yw, CB0[0][0].zzzw, l(0, 5, 0, 4)\n  ishr r0.x, vThreadID.z, l(2)\n  ibfe r4.xyz, l(28, 27, 29, 0), l(2, 1, 1, 0), r2.wyww\n  imad r1.w, r0.x, r1.w, r4.x\n  imad r1.y, r1.w, r1.y, r4.y\n  bfi r1.w, l(2), l(5), vThreadID.z, l(0)\n  ishr r3.zw, r3.xxxy, l(0, 0, 1, 3)\n  bfi r3.z, l(2), l(3), r3.z, l(0)\n  iadd r1.w, r1.w, r3.z\n  bfi r1.y, l(25), l(7), r1.y, r1.w\n  xor r0.x, r0.x, r4.z\n  and r1.w, r3.w, l(2)\n  bfi r3.zw, l(0, 0, 1, 1), l(0, 0, 1, 11), r0.xxxx, l(0, 0, 0, 0)\n  xor r0.x, r1.w, r3.z\n  ishl r0.x, r0.x, l(6)\n  iadd r0.x, r3.w, r0.x\n  ibfe r1.yw, l(0, 27, 0, 24), l(0, 4, 0, 7), r1.yyyy\n  bfi r0.x, l(3), l(8), r1.y, r0.x\n  bfi r0.x, l(20), l(12), r1.w, r0.x\nelse \n  ushr r1.y, CB0[0][0].z, l(5)\n  ibfe r2.xyzw, l(27, 27, 28, 29), l(3, 1, 2, 1), r2.xyzw\n  imad r1.y, r2.x, r1.y, r2.y\n  ishr r2.xy, r3.xyxx, l(1, 3, 0, 0)\n  bfi r1.w, l(3), l(3), r2.x, l(0)\n  bfi r1.y, l(26), l(6), r1.y, r1.w\n  and r1.w, r2.y, l(2)\n  bfi r2.xy, l(1, 1, 0, 0), l(1, 11, 0, 0), r2.wzww, l(0, 0, 0, 0)\n  xor r1.w, r1.w, r2.x\n  ishl r1.w, r1.w, l(6)\n  iadd r1.w, r2.y, r1.w\n  ibfe r2.xy, l(27, 24, 0, 0), l(4, 7, 0, 0), r1.yyyy\n  bfi r1.y, l(3), l(8), r2.x, r1.w\n  bfi r0.x, l(20), l(12), r2.y, r1.y\nendif \nimul null, r0.z, r0.w, r0.z\nimad r0.x, r0.x, r0.z, r1.x\niadd r0.x, r0.x, CB0[0][0].y\nld_raw r2.xyzw, r0.x, T0[0].xyzw\nieq r0.y, r0.y, l(1)\nif_nz r0.y\n  ishl r3.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r2.xyzw, r3.xyzw, r4.xyzw\nendif \nand r3.xyzw, r2.xyzw, l(0x0000ffff, 0x0000ffff, 0x0000ffff, 0x0000ffff)\nutof r3.xyzw, r3.xyzw\nmul r3.xyzw, r3.xyzw, l(0.000015, 0.000015, 0.000015, 0.000015)\nushr r2.xyzw, r2.xyzw, l(16, 16, 16, 16)\nutof r2.xyzw, r2.xyzw\nmul r2.xyzw, r2.xyzw, l(0.000015, 0.000015, 0.000015, 0.000015)\nf32tof16 r3.xyzw, r3.xyzw\nf32tof16 r2.xyzw, r2.xyzw\nimad r2.xyzw, r2.xyzw, l(0x00010000, 0x00010000, 0x00010000, 0x00010000), r3.xyzw\nstore_raw U0[0].xyzw, r1.z, r2.xyzw\niadd r0.z, r1.z, l(16)\niadd r0.x, r0.x, l(16)\nld_raw r2.xyzw, r0.x, T0[0].xyzw\nif_nz r0.y\n  ishl r3.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r2.xyzw, r3.xyzw, r4.xyzw\nendif \nand r3.xyzw, r2.xyzw, l(0x0000ffff, 0x0000ffff, 0x0000ffff, 0x0000ffff)\nutof r3.xyzw, r3.xyzw\nmul r3.xyzw, r3.xyzw, l(0.000015, 0.000015, 0.000015, 0.000015)\nushr r2.xyzw, r2.xyzw, l(16, 16, 16, 16)\nutof r2.xyzw, r2.xyzw\nmul r2.xyzw, r2.xyzw, l(0.000015, 0.000015, 0.000015, 0.000015)\nf32tof16 r3.xyzw, r3.xyzw\nf32tof16 r2.xyzw, r2.xyzw\nimad r2.xyzw, r2.xyzw, l(0x00010000, 0x00010000, 0x00010000, 0x00010000), r3.xyzw\nstore_raw U0[0].xyzw, r0.z, r2.xyzw\nret \n// Approximately 99 instruction slots used\n#endif\n\nconst BYTE texture_load_r16_unorm_float_scaled_cs[] =\n{\n     68,  88,  66,  67,  53, 214, \n     54, 161, 124, 155,  83, 176, \n    204,  72,  69, 163, 111, 135, \n    234, 234,   1,   0,   0,   0, \n     88,  18,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n    188,  17,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n    128,  13,   0,   0,  81,   0, \n      5,   0,  96,   3,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   5,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n     98,   0,  16,   0,   0,   0, \n      0,   0,   6,   1,  16,   0, \n      1,   0,   0,   0,   6, 129, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  17, \n    226,   0,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   7,   0,   0,   0, \n      6, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  35,   0,   0,   9, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,   2,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,  11, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   9,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  78,   0,   0,   8, \n    242,   0,  16,   0,   2,   0, \n      0,   0,   0, 208,   0,   0, \n     22,   5,  16,   0,   1,   0, \n      0,   0, 182,  15,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,  10,  50,   0,  16,   0, \n      1,   0,   0,   0, 230,  10, \n     16, 128,  65,   0,   0,   0, \n      0,   0,   0,   0, 214,   5, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  41,   0,   0,  10, \n     50,   0,  16,   0,   3,   0, \n      0,   0, 118,  15,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  10,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  26,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  25,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     85,   0,   0,  12, 162,   0, \n     16,   0,   1,   0,   0,   0, \n    166, 142,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n     42,   0,   0,   6,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,   2,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n    139,   0,   0,  15, 114,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,  28,   0, \n      0,   0,  27,   0,   0,   0, \n     29,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0, 118,  15, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,   9, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n    140,   0,   0,  10, 130,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  42,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  42,   0, \n      0,  10, 194,   0,  16,   0, \n      3,   0,   0,   0,   6,   4, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   3,   0, \n      0,   0, 140,   0,   0,  11, \n     66,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     25,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  87,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   4,   0, \n      0,   0,   1,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n    140,   0,   0,  20, 194,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     11,   0,   0,   0,   6,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n     41,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0, 139,   0,   0,  15, \n    162,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  27,   0, \n      0,   0,   0,   0,   0,   0, \n     24,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,   7,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     18,   0,   0,   1,  85,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0, 139,   0, \n      0,  15, 242,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  27,   0,   0,   0, \n     27,   0,   0,   0,  28,   0, \n      0,   0,  29,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n      0,  10,  50,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n    130,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  26,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n      1,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  20,  50,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 182,  15,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  30,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n    139,   0,   0,  15,  50,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  27,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  21,   0, \n      0,   1,  38,   0,   0,   8, \n      0, 208,   0,   0,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     32,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     21,   0,   0,   1,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0, 255, 255, \n      0,   0, 255, 255,   0,   0, \n    255, 255,   0,   0, 255, 255, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0, 128,   0, \n    128,  55, 128,   0, 128,  55, \n    128,   0, 128,  55, 128,   0, \n    128,  55,  85,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0, 128,   0, 128,  55, \n    128,   0, 128,  55, 128,   0, \n    128,  55, 128,   0, 128,  55, \n    130,   0,   0,   5, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0, 130,   0,   0,   5, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  35,   0, \n      0,  12, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,  70,  14,  16,   0, \n      3,   0,   0,   0, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     21,   0,   0,   1,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0, 255, 255, \n      0,   0, 255, 255,   0,   0, \n    255, 255,   0,   0, 255, 255, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0, 128,   0, \n    128,  55, 128,   0, 128,  55, \n    128,   0, 128,  55, 128,   0, \n    128,  55,  85,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0, 128,   0, 128,  55, \n    128,   0, 128,  55, 128,   0, \n    128,  55, 128,   0, 128,  55, \n    130,   0,   0,   5, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0, 130,   0,   0,   5, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  35,   0, \n      0,  12, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,  70,  14,  16,   0, \n      3,   0,   0,   0, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     62,   0,   0,   1,  83,  84, \n     65,  84, 148,   0,   0,   0, \n     99,   0,   0,   0,   5,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   4,   0, \n      0,   0,  31,   0,   0,   0, \n     22,   0,   0,   0,   3,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_r4g4b4a4_a4r4g4b4_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 5\ndcl_thread_group 4, 32, 1\nand r0.xy, CB0[0][0].xxxx, l(1, 2, 0, 0)\nishl r1.x, vThreadID.x, l(4)\nmov r1.y, vThreadID.y\nuge r0.zw, r1.xxxy, CB0[0][1].xxxy\nor r0.z, r0.w, r0.z\nif_nz r0.z\n  ret \nendif \nubfe r0.z, l(2), l(2), CB0[0][0].x\nishl r0.w, r1.x, l(1)\nimad r1.y, vThreadID.z, CB0[0][1].y, vThreadID.y\nimad r0.w, r1.y, CB0[0][2].x, r0.w\niadd r0.w, r0.w, CB0[0][1].w\nif_z r0.x\n  imad r1.y, CB0[0][0].w, vThreadID.z, vThreadID.y\n  imad r1.y, CB0[0][0].z, r1.y, r1.x\n  ishl r1.y, r1.y, l(1)\nelse \n  if_nz r0.y\n    ushr r1.zw, CB0[0][0].zzzw, l(0, 0, 5, 4)\n    ishr r2.xyzw, vThreadID.zyyy, l(2, 4, 1, 3)\n    imad r0.y, r2.x, r1.w, r2.y\n    ibfe r1.w, l(27), l(1), vThreadID.x\n    imad r0.y, r0.y, r1.z, r1.w\n    bfi r1.zw, l(0, 0, 2, 1), l(0, 0, 5, 4), vThreadID.zzzy, l(0, 0, 0, 0)\n    bfi r2.y, l(2), l(3), r2.z, l(0)\n    iadd r1.z, r1.z, r2.y\n    bfi r0.y, l(25), l(7), r0.y, r1.z\n    xor r1.z, r2.x, r2.w\n    ishr r2.x, r1.x, l(3)\n    and r2.x, r2.x, l(2)\n    bfi r2.yz, l(0, 1, 1, 0), l(0, 1, 11, 0), r1.zzzz, l(0, 0, 0, 0)\n    xor r1.z, r2.y, r2.x\n    ishl r1.z, r1.z, l(6)\n    iadd r1.z, r1.z, r1.w\n    iadd r1.z, r2.z, r1.z\n    ibfe r2.xyz, l(28, 27, 24, 0), l(3, 4, 7, 0), r0.yyyy\n    bfi r0.y, l(1), l(5), r2.x, r1.z\n    bfi r0.y, l(3), l(8), r2.y, r0.y\n    bfi r1.y, l(20), l(12), r2.z, r0.y\n  else \n    ushr r0.y, CB0[0][0].z, l(5)\n    ishr r2.xyzw, vThreadID.yyyy, l(5, 1, 4, 3)\n    ibfe r1.z, l(27), l(1), vThreadID.x\n    imad r0.y, r2.x, r0.y, r1.z\n    bfi r2.xyz, l(3, 1, 1, 0), l(3, 1, 11, 0), r2.ywzy, l(0, 0, 0, 0)\n    bfi r0.y, l(26), l(6), r0.y, r2.x\n    ishr r1.x, r1.x, l(3)\n    and r1.x, r1.x, l(2)\n    xor r1.x, r2.y, r1.x\n    bfi r1.z, l(1), l(4), vThreadID.y, l(0)\n    ishl r1.x, r1.x, l(6)\n    iadd r1.x, r1.x, r1.z\n    iadd r1.x, r2.z, r1.x\n    ibfe r2.xyz, l(28, 27, 24, 0), l(3, 4, 7, 0), r0.yyyy\n    bfi r0.y, l(1), l(5), r2.x, r1.x\n    bfi r0.y, l(3), l(8), r2.y, r0.y\n    bfi r1.y, l(20), l(12), r2.z, r0.y\n  endif \nendif \niadd r0.y, r1.y, CB0[0][0].y\nld_raw r1.xyzw, r0.y, T0[0].xyzw\nieq r0.z, r0.z, l(1)\nif_nz r0.z\n  ishl r2.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r2.xyzw, r2.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r3.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r1.xyzw, r2.xyzw, r3.xyzw\nendif \nishl r2.xyzw, r1.xyzw, l(4, 4, 4, 4)\nand r2.xyzw, r2.xyzw, l(0xfff0fff0, 0xfff0fff0, 0xfff0fff0, 0xfff0fff0)\nushr r1.xyzw, r1.xyzw, l(12, 12, 12, 12)\nand r1.xyzw, r1.xyzw, l(0x000f000f, 0x000f000f, 0x000f000f, 0x000f000f)\niadd r1.xyzw, r1.xyzw, r2.xyzw\nstore_raw U0[0].xyzw, r0.w, r1.xyzw\niadd r1.x, r0.w, l(16)\nif_nz r0.x\n  mov r0.x, l(64)\nelse \n  mov r0.x, l(16)\nendif \niadd r0.x, r0.x, r0.y\nld_raw r2.xyzw, r0.x, T0[0].xyzw\nif_nz r0.z\n  ishl r3.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r2.xyzw, r3.xyzw, r4.xyzw\nendif \nishl r3.xyzw, r2.xyzw, l(4, 4, 4, 4)\nand r3.xyzw, r3.xyzw, l(0xfff0fff0, 0xfff0fff0, 0xfff0fff0, 0xfff0fff0)\nushr r2.xyzw, r2.xyzw, l(12, 12, 12, 12)\nand r2.xyzw, r2.xyzw, l(0x000f000f, 0x000f000f, 0x000f000f, 0x000f000f)\niadd r2.xyzw, r2.xyzw, r3.xyzw\nstore_raw U0[0].xyzw, r1.x, r2.xyzw\nret \n// Approximately 98 instruction slots used\n#endif\n\nconst BYTE texture_load_r4g4b4a4_a4r4g4b4_cs[] =\n{\n     68,  88,  66,  67, 203, 225, \n     21, 229, 127, 183,  11, 121, \n     52,  30, 225, 157,  61, 103, \n     11, 208,   1,   0,   0,   0, \n    124,  17,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n    224,  16,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n    164,  12,   0,   0,  81,   0, \n      5,   0,  41,   3,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   5,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  12,  50,   0,  16,   0, \n      0,   0,   0,   0,   6, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n    194,   0,  16,   0,   0,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0,   6, 132, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  11, \n     66,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,   2,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,  11, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  31,   0, \n      0,   3,  10,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  58, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  42,   0,   2,   0, \n     26,   0,   2,   0,  35,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     41,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  18,   0, \n      0,   1,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,  12, \n    194,   0,  16,   0,   1,   0, \n      0,   0, 166, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0,  42,   0,   0,   9, \n    242,   0,  16,   0,   2,   0, \n      0,   0, 102,   5,   2,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      1,   0,   0,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 139,   0,   0,   8, \n    130,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     27,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     10,   0,   2,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  19, 194,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0, 166,   6,   2,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     25,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  87,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,   0,   7, \n     18,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   7,  18,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  20,  98,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0, 166,  10,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  30,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 139,   0, \n      0,  15, 114,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  28,   0,   0,   0, \n     27,   0,   0,   0,  24,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   4,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  86,   5,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  18,   0, \n      0,   1,  85,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  42,   0,   0,   9, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  86,   5,   2,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   1,   0,   0,   0, \n      4,   0,   0,   0,   3,   0, \n      0,   0, 139,   0,   0,   8, \n     66,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     27,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     10,   0,   2,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  20, 114,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0, 214,   6,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  26,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  87,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  10, \n     66,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     26,   0,   2,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     41,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    139,   0,   0,  15, 114,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  28,   0, \n      0,   0,  27,   0,   0,   0, \n     24,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   4,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  21,   0, \n      0,   1,  30,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  32,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  31,   0,   4,   3, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  21,   0, \n      0,   1,  41,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   4,   0, \n      0,   0,   4,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n    240, 255, 240, 255, 240, 255, \n    240, 255, 240, 255, 240, 255, \n    240, 255, 240, 255,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  12,   0, \n      0,   0,  12,   0,   0,   0, \n     12,   0,   0,   0,  12,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  15,   0,  15,   0, \n     15,   0,  15,   0,  15,   0, \n     15,   0,  15,   0,  15,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0,  31,   0, \n      4,   3,  10,   0,  16,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  64,   0,   0,   0, \n     18,   0,   0,   1,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n     21,   0,   0,   1,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     21,   0,   0,   1,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   4,   0, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   4,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0, 240, 255, 240, 255, \n    240, 255, 240, 255, 240, 255, \n    240, 255, 240, 255, 240, 255, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     12,   0,   0,   0,  12,   0, \n      0,   0,  12,   0,   0,   0, \n     12,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  15,   0, \n     15,   0,  15,   0,  15,   0, \n     15,   0,  15,   0,  15,   0, \n     15,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  62,   0,   0,   1, \n     83,  84,  65,  84, 148,   0, \n      0,   0,  98,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  34,   0, \n      0,   0,  22,   0,   0,   0, \n      5,   0,   0,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_r4g4b4a4_a4r4g4b4_scaled_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 5\ndcl_thread_group 4, 32, 1\nand r0.x, CB0[0][0].x, l(2)\nishl r1.x, vThreadID.x, l(4)\nmov r1.y, vThreadID.y\nuge r0.yz, r1.xxyx, CB0[0][1].xxyx\nor r0.y, r0.z, r0.y\nif_nz r0.y\n  ret \nendif \nubfe r0.yzw, l(0, 2, 3, 3), l(0, 2, 4, 7), CB0[0][0].xxxx\nishl r1.z, r1.x, l(1)\nimad r1.w, vThreadID.z, CB0[0][1].y, vThreadID.y\nimad r1.z, r1.w, CB0[0][2].x, r1.z\niadd r1.z, r1.z, CB0[0][1].w\nushr r1.xy, r1.xyxx, l(4, 2, 0, 0)\nudiv r2.xyzw, null, r1.yxyy, r0.wzww\nimad r1.xy, -r0.zwzz, r2.ywyy, r1.xyxx\nishl r3.xy, r2.wyww, l(2, 4, 0, 0)\nimad r1.x, r1.x, r0.w, r1.y\nbfi r1.y, l(2), l(5), vThreadID.y, l(0)\nbfi r1.x, l(25), l(7), r1.x, r1.y\nif_nz r0.x\n  ushr r1.yw, CB0[0][0].zzzw, l(0, 5, 0, 4)\n  ishr r0.x, vThreadID.z, l(2)\n  ibfe r4.xyz, l(28, 27, 29, 0), l(2, 1, 1, 0), r2.wyww\n  imad r1.w, r0.x, r1.w, r4.x\n  imad r1.y, r1.w, r1.y, r4.y\n  bfi r1.w, l(2), l(5), vThreadID.z, l(0)\n  ishr r3.zw, r3.xxxy, l(0, 0, 1, 3)\n  bfi r3.z, l(2), l(3), r3.z, l(0)\n  iadd r1.w, r1.w, r3.z\n  bfi r1.y, l(25), l(7), r1.y, r1.w\n  xor r0.x, r0.x, r4.z\n  and r1.w, r3.w, l(2)\n  bfi r3.zw, l(0, 0, 1, 1), l(0, 0, 1, 11), r0.xxxx, l(0, 0, 0, 0)\n  xor r0.x, r1.w, r3.z\n  ishl r0.x, r0.x, l(6)\n  iadd r0.x, r3.w, r0.x\n  ibfe r1.yw, l(0, 27, 0, 24), l(0, 4, 0, 7), r1.yyyy\n  bfi r0.x, l(3), l(8), r1.y, r0.x\n  bfi r0.x, l(20), l(12), r1.w, r0.x\nelse \n  ushr r1.y, CB0[0][0].z, l(5)\n  ibfe r2.xyzw, l(27, 27, 28, 29), l(3, 1, 2, 1), r2.xyzw\n  imad r1.y, r2.x, r1.y, r2.y\n  ishr r2.xy, r3.xyxx, l(1, 3, 0, 0)\n  bfi r1.w, l(3), l(3), r2.x, l(0)\n  bfi r1.y, l(26), l(6), r1.y, r1.w\n  and r1.w, r2.y, l(2)\n  bfi r2.xy, l(1, 1, 0, 0), l(1, 11, 0, 0), r2.wzww, l(0, 0, 0, 0)\n  xor r1.w, r1.w, r2.x\n  ishl r1.w, r1.w, l(6)\n  iadd r1.w, r2.y, r1.w\n  ibfe r2.xy, l(27, 24, 0, 0), l(4, 7, 0, 0), r1.yyyy\n  bfi r1.y, l(3), l(8), r2.x, r1.w\n  bfi r0.x, l(20), l(12), r2.y, r1.y\nendif \nimul null, r0.z, r0.w, r0.z\nimad r0.x, r0.x, r0.z, r1.x\niadd r0.x, r0.x, CB0[0][0].y\nld_raw r2.xyzw, r0.x, T0[0].xyzw\nieq r0.y, r0.y, l(1)\nif_nz r0.y\n  ishl r3.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r2.xyzw, r3.xyzw, r4.xyzw\nendif \nishl r3.xyzw, r2.xyzw, l(4, 4, 4, 4)\nand r3.xyzw, r3.xyzw, l(0xfff0fff0, 0xfff0fff0, 0xfff0fff0, 0xfff0fff0)\nushr r2.xyzw, r2.xyzw, l(12, 12, 12, 12)\nand r2.xyzw, r2.xyzw, l(0x000f000f, 0x000f000f, 0x000f000f, 0x000f000f)\niadd r2.xyzw, r2.xyzw, r3.xyzw\nstore_raw U0[0].xyzw, r1.z, r2.xyzw\niadd r0.z, r1.z, l(16)\niadd r0.x, r0.x, l(16)\nld_raw r2.xyzw, r0.x, T0[0].xyzw\nif_nz r0.y\n  ishl r3.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r2.xyzw, r3.xyzw, r4.xyzw\nendif \nishl r3.xyzw, r2.xyzw, l(4, 4, 4, 4)\nand r3.xyzw, r3.xyzw, l(0xfff0fff0, 0xfff0fff0, 0xfff0fff0, 0xfff0fff0)\nushr r2.xyzw, r2.xyzw, l(12, 12, 12, 12)\nand r2.xyzw, r2.xyzw, l(0x000f000f, 0x000f000f, 0x000f000f, 0x000f000f)\niadd r2.xyzw, r2.xyzw, r3.xyzw\nstore_raw U0[0].xyzw, r0.z, r2.xyzw\nret \n// Approximately 91 instruction slots used\n#endif\n\nconst BYTE texture_load_r4g4b4a4_a4r4g4b4_scaled_cs[] =\n{\n     68,  88,  66,  67, 117, 236, \n    169, 136,  17,  85, 116,  21, \n    225, 143,   3,  48, 202, 151, \n     17, 147,   1,   0,   0,   0, \n    144,  17,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n    244,  16,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n    184,  12,   0,   0,  81,   0, \n      5,   0,  46,   3,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   5,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n     98,   0,  16,   0,   0,   0, \n      0,   0,   6,   1,  16,   0, \n      1,   0,   0,   0,   6, 129, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  17, \n    226,   0,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   7,   0,   0,   0, \n      6, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  35,   0,   0,   9, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,   2,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,  11, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   9,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  78,   0,   0,   8, \n    242,   0,  16,   0,   2,   0, \n      0,   0,   0, 208,   0,   0, \n     22,   5,  16,   0,   1,   0, \n      0,   0, 182,  15,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,  10,  50,   0,  16,   0, \n      1,   0,   0,   0, 230,  10, \n     16, 128,  65,   0,   0,   0, \n      0,   0,   0,   0, 214,   5, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  41,   0,   0,  10, \n     50,   0,  16,   0,   3,   0, \n      0,   0, 118,  15,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  10,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  26,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  25,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     85,   0,   0,  12, 162,   0, \n     16,   0,   1,   0,   0,   0, \n    166, 142,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n     42,   0,   0,   6,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,   2,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n    139,   0,   0,  15, 114,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,  28,   0, \n      0,   0,  27,   0,   0,   0, \n     29,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0, 118,  15, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,   9, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n    140,   0,   0,  10, 130,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  42,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  42,   0, \n      0,  10, 194,   0,  16,   0, \n      3,   0,   0,   0,   6,   4, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   3,   0, \n      0,   0, 140,   0,   0,  11, \n     66,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     25,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  87,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   4,   0, \n      0,   0,   1,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n    140,   0,   0,  20, 194,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     11,   0,   0,   0,   6,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n     41,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0, 139,   0,   0,  15, \n    162,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  27,   0, \n      0,   0,   0,   0,   0,   0, \n     24,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,   7,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     18,   0,   0,   1,  85,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0, 139,   0, \n      0,  15, 242,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  27,   0,   0,   0, \n     27,   0,   0,   0,  28,   0, \n      0,   0,  29,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n      0,  10,  50,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n    130,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  26,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n      1,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  20,  50,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 182,  15,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  30,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n    139,   0,   0,  15,  50,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  27,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  21,   0, \n      0,   1,  38,   0,   0,   8, \n      0, 208,   0,   0,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     32,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     21,   0,   0,   1,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   4,   0, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   4,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0, 240, 255, 240, 255, \n    240, 255, 240, 255, 240, 255, \n    240, 255, 240, 255, 240, 255, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     12,   0,   0,   0,  12,   0, \n      0,   0,  12,   0,   0,   0, \n     12,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  15,   0, \n     15,   0,  15,   0,  15,   0, \n     15,   0,  15,   0,  15,   0, \n     15,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  30,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n     30,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,  85,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  21,   0,   0,   1, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,   4,   0, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0, 240, 255, \n    240, 255, 240, 255, 240, 255, \n    240, 255, 240, 255, 240, 255, \n    240, 255,  85,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  12,   0,   0,   0, \n     12,   0,   0,   0,  12,   0, \n      0,   0,  12,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     15,   0,  15,   0,  15,   0, \n     15,   0,  15,   0,  15,   0, \n     15,   0,  15,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  62,   0, \n      0,   1,  83,  84,  65,  84, \n    148,   0,   0,   0,  91,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     33,   0,   0,   0,  24,   0, \n      0,   0,   3,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_r4g4b4a4_b4g4r4a4_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 5\ndcl_thread_group 4, 32, 1\nand r0.xy, CB0[0][0].xxxx, l(1, 2, 0, 0)\nishl r1.x, vThreadID.x, l(4)\nmov r1.y, vThreadID.y\nuge r0.zw, r1.xxxy, CB0[0][1].xxxy\nor r0.z, r0.w, r0.z\nif_nz r0.z\n  ret \nendif \nubfe r0.z, l(2), l(2), CB0[0][0].x\nishl r0.w, r1.x, l(1)\nimad r1.y, vThreadID.z, CB0[0][1].y, vThreadID.y\nimad r0.w, r1.y, CB0[0][2].x, r0.w\niadd r0.w, r0.w, CB0[0][1].w\nif_z r0.x\n  imad r1.y, CB0[0][0].w, vThreadID.z, vThreadID.y\n  imad r1.y, CB0[0][0].z, r1.y, r1.x\n  ishl r1.y, r1.y, l(1)\nelse \n  if_nz r0.y\n    ushr r1.zw, CB0[0][0].zzzw, l(0, 0, 5, 4)\n    ishr r2.xyzw, vThreadID.zyyy, l(2, 4, 1, 3)\n    imad r0.y, r2.x, r1.w, r2.y\n    ibfe r1.w, l(27), l(1), vThreadID.x\n    imad r0.y, r0.y, r1.z, r1.w\n    bfi r1.zw, l(0, 0, 2, 1), l(0, 0, 5, 4), vThreadID.zzzy, l(0, 0, 0, 0)\n    bfi r2.y, l(2), l(3), r2.z, l(0)\n    iadd r1.z, r1.z, r2.y\n    bfi r0.y, l(25), l(7), r0.y, r1.z\n    xor r1.z, r2.x, r2.w\n    ishr r2.x, r1.x, l(3)\n    and r2.x, r2.x, l(2)\n    bfi r2.yz, l(0, 1, 1, 0), l(0, 1, 11, 0), r1.zzzz, l(0, 0, 0, 0)\n    xor r1.z, r2.y, r2.x\n    ishl r1.z, r1.z, l(6)\n    iadd r1.z, r1.z, r1.w\n    iadd r1.z, r2.z, r1.z\n    ibfe r2.xyz, l(28, 27, 24, 0), l(3, 4, 7, 0), r0.yyyy\n    bfi r0.y, l(1), l(5), r2.x, r1.z\n    bfi r0.y, l(3), l(8), r2.y, r0.y\n    bfi r1.y, l(20), l(12), r2.z, r0.y\n  else \n    ushr r0.y, CB0[0][0].z, l(5)\n    ishr r2.xyzw, vThreadID.yyyy, l(5, 1, 4, 3)\n    ibfe r1.z, l(27), l(1), vThreadID.x\n    imad r0.y, r2.x, r0.y, r1.z\n    bfi r2.xyz, l(3, 1, 1, 0), l(3, 1, 11, 0), r2.ywzy, l(0, 0, 0, 0)\n    bfi r0.y, l(26), l(6), r0.y, r2.x\n    ishr r1.x, r1.x, l(3)\n    and r1.x, r1.x, l(2)\n    xor r1.x, r2.y, r1.x\n    bfi r1.z, l(1), l(4), vThreadID.y, l(0)\n    ishl r1.x, r1.x, l(6)\n    iadd r1.x, r1.x, r1.z\n    iadd r1.x, r2.z, r1.x\n    ibfe r2.xyz, l(28, 27, 24, 0), l(3, 4, 7, 0), r0.yyyy\n    bfi r0.y, l(1), l(5), r2.x, r1.x\n    bfi r0.y, l(3), l(8), r2.y, r0.y\n    bfi r1.y, l(20), l(12), r2.z, r0.y\n  endif \nendif \niadd r0.y, r1.y, CB0[0][0].y\nld_raw r1.xyzw, r0.y, T0[0].xyzw\nieq r0.z, r0.z, l(1)\nif_nz r0.z\n  ishl r2.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r2.xyzw, r2.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r3.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r1.xyzw, r2.xyzw, r3.xyzw\nendif \nand r2.xyzw, r1.xyzw, l(0xf0f0f0f0, 0xf0f0f0f0, 0xf0f0f0f0, 0xf0f0f0f0)\nishl r3.xyzw, r1.xyzw, l(8, 8, 8, 8)\nand r3.xyzw, r3.xyzw, l(0x0f000f00, 0x0f000f00, 0x0f000f00, 0x0f000f00)\niadd r2.xyzw, r2.xyzw, r3.xyzw\nushr r1.xyzw, r1.xyzw, l(8, 8, 8, 8)\nand r1.xyzw, r1.xyzw, l(0x000f000f, 0x000f000f, 0x000f000f, 0x000f000f)\niadd r1.xyzw, r1.xyzw, r2.xyzw\nstore_raw U0[0].xyzw, r0.w, r1.xyzw\niadd r1.x, r0.w, l(16)\nif_nz r0.x\n  mov r0.x, l(64)\nelse \n  mov r0.x, l(16)\nendif \niadd r0.x, r0.x, r0.y\nld_raw r2.xyzw, r0.x, T0[0].xyzw\nif_nz r0.z\n  ishl r3.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r2.xyzw, r3.xyzw, r4.xyzw\nendif \nand r3.xyzw, r2.xyzw, l(0xf0f0f0f0, 0xf0f0f0f0, 0xf0f0f0f0, 0xf0f0f0f0)\nishl r4.xyzw, r2.xyzw, l(8, 8, 8, 8)\nand r4.xyzw, r4.xyzw, l(0x0f000f00, 0x0f000f00, 0x0f000f00, 0x0f000f00)\niadd r3.xyzw, r3.xyzw, r4.xyzw\nushr r2.xyzw, r2.xyzw, l(8, 8, 8, 8)\nand r2.xyzw, r2.xyzw, l(0x000f000f, 0x000f000f, 0x000f000f, 0x000f000f)\niadd r2.xyzw, r2.xyzw, r3.xyzw\nstore_raw U0[0].xyzw, r1.x, r2.xyzw\nret \n// Approximately 102 instruction slots used\n#endif\n\nconst BYTE texture_load_r4g4b4a4_b4g4r4a4_cs[] =\n{\n     68,  88,  66,  67,  96,  81, \n     29,  39,  79, 203,  23, 129, \n     40, 158,  41, 200, 135, 250, \n    134,  17,   1,   0,   0,   0, \n      4,  18,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n    104,  17,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n     44,  13,   0,   0,  81,   0, \n      5,   0,  75,   3,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   5,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  12,  50,   0,  16,   0, \n      0,   0,   0,   0,   6, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n    194,   0,  16,   0,   0,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0,   6, 132, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  11, \n     66,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,   2,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,  11, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  31,   0, \n      0,   3,  10,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  58, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  42,   0,   2,   0, \n     26,   0,   2,   0,  35,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     41,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  18,   0, \n      0,   1,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,  12, \n    194,   0,  16,   0,   1,   0, \n      0,   0, 166, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0,  42,   0,   0,   9, \n    242,   0,  16,   0,   2,   0, \n      0,   0, 102,   5,   2,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      1,   0,   0,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 139,   0,   0,   8, \n    130,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     27,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     10,   0,   2,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  19, 194,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0, 166,   6,   2,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     25,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  87,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,   0,   7, \n     18,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   7,  18,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  20,  98,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0, 166,  10,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  30,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 139,   0, \n      0,  15, 114,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  28,   0,   0,   0, \n     27,   0,   0,   0,  24,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   4,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  86,   5,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  18,   0, \n      0,   1,  85,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  42,   0,   0,   9, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  86,   5,   2,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   1,   0,   0,   0, \n      4,   0,   0,   0,   3,   0, \n      0,   0, 139,   0,   0,   8, \n     66,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     27,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     10,   0,   2,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  20, 114,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0, 214,   6,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  26,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  87,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  10, \n     66,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     26,   0,   2,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     41,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    139,   0,   0,  15, 114,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  28,   0, \n      0,   0,  27,   0,   0,   0, \n     24,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   4,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  21,   0, \n      0,   1,  30,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  32,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  31,   0,   4,   3, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  21,   0, \n      0,   1,   1,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0, 240, 240, 240, 240, \n    240, 240, 240, 240, 240, 240, \n    240, 240, 240, 240, 240, 240, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,  15, \n      0,  15,   0,  15,   0,  15, \n      0,  15,   0,  15,   0,  15, \n      0,  15,  30,   0,   0,   7, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  15,   0, \n     15,   0,  15,   0,  15,   0, \n     15,   0,  15,   0,  15,   0, \n     15,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  64,   0, \n      0,   0,  18,   0,   0,   1, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0,  21,   0,   0,   1, \n     30,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,  85,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  21,   0,   0,   1, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n    240, 240, 240, 240, 240, 240, \n    240, 240, 240, 240, 240, 240, \n    240, 240, 240, 240,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,  15,   0,  15, \n      0,  15,   0,  15,   0,  15, \n      0,  15,   0,  15,   0,  15, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  15,   0,  15,   0, \n     15,   0,  15,   0,  15,   0, \n     15,   0,  15,   0,  15,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     62,   0,   0,   1,  83,  84, \n     65,  84, 148,   0,   0,   0, \n    102,   0,   0,   0,   5,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  36,   0,   0,   0, \n     24,   0,   0,   0,   5,   0, \n      0,   0,   6,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_r4g4b4a4_b4g4r4a4_scaled_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 5\ndcl_thread_group 4, 32, 1\nand r0.x, CB0[0][0].x, l(2)\nishl r1.x, vThreadID.x, l(4)\nmov r1.y, vThreadID.y\nuge r0.yz, r1.xxyx, CB0[0][1].xxyx\nor r0.y, r0.z, r0.y\nif_nz r0.y\n  ret \nendif \nubfe r0.yzw, l(0, 2, 3, 3), l(0, 2, 4, 7), CB0[0][0].xxxx\nishl r1.z, r1.x, l(1)\nimad r1.w, vThreadID.z, CB0[0][1].y, vThreadID.y\nimad r1.z, r1.w, CB0[0][2].x, r1.z\niadd r1.z, r1.z, CB0[0][1].w\nushr r1.xy, r1.xyxx, l(4, 2, 0, 0)\nudiv r2.xyzw, null, r1.yxyy, r0.wzww\nimad r1.xy, -r0.zwzz, r2.ywyy, r1.xyxx\nishl r3.xy, r2.wyww, l(2, 4, 0, 0)\nimad r1.x, r1.x, r0.w, r1.y\nbfi r1.y, l(2), l(5), vThreadID.y, l(0)\nbfi r1.x, l(25), l(7), r1.x, r1.y\nif_nz r0.x\n  ushr r1.yw, CB0[0][0].zzzw, l(0, 5, 0, 4)\n  ishr r0.x, vThreadID.z, l(2)\n  ibfe r4.xyz, l(28, 27, 29, 0), l(2, 1, 1, 0), r2.wyww\n  imad r1.w, r0.x, r1.w, r4.x\n  imad r1.y, r1.w, r1.y, r4.y\n  bfi r1.w, l(2), l(5), vThreadID.z, l(0)\n  ishr r3.zw, r3.xxxy, l(0, 0, 1, 3)\n  bfi r3.z, l(2), l(3), r3.z, l(0)\n  iadd r1.w, r1.w, r3.z\n  bfi r1.y, l(25), l(7), r1.y, r1.w\n  xor r0.x, r0.x, r4.z\n  and r1.w, r3.w, l(2)\n  bfi r3.zw, l(0, 0, 1, 1), l(0, 0, 1, 11), r0.xxxx, l(0, 0, 0, 0)\n  xor r0.x, r1.w, r3.z\n  ishl r0.x, r0.x, l(6)\n  iadd r0.x, r3.w, r0.x\n  ibfe r1.yw, l(0, 27, 0, 24), l(0, 4, 0, 7), r1.yyyy\n  bfi r0.x, l(3), l(8), r1.y, r0.x\n  bfi r0.x, l(20), l(12), r1.w, r0.x\nelse \n  ushr r1.y, CB0[0][0].z, l(5)\n  ibfe r2.xyzw, l(27, 27, 28, 29), l(3, 1, 2, 1), r2.xyzw\n  imad r1.y, r2.x, r1.y, r2.y\n  ishr r2.xy, r3.xyxx, l(1, 3, 0, 0)\n  bfi r1.w, l(3), l(3), r2.x, l(0)\n  bfi r1.y, l(26), l(6), r1.y, r1.w\n  and r1.w, r2.y, l(2)\n  bfi r2.xy, l(1, 1, 0, 0), l(1, 11, 0, 0), r2.wzww, l(0, 0, 0, 0)\n  xor r1.w, r1.w, r2.x\n  ishl r1.w, r1.w, l(6)\n  iadd r1.w, r2.y, r1.w\n  ibfe r2.xy, l(27, 24, 0, 0), l(4, 7, 0, 0), r1.yyyy\n  bfi r1.y, l(3), l(8), r2.x, r1.w\n  bfi r0.x, l(20), l(12), r2.y, r1.y\nendif \nimul null, r0.z, r0.w, r0.z\nimad r0.x, r0.x, r0.z, r1.x\niadd r0.x, r0.x, CB0[0][0].y\nld_raw r2.xyzw, r0.x, T0[0].xyzw\nieq r0.y, r0.y, l(1)\nif_nz r0.y\n  ishl r3.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r2.xyzw, r3.xyzw, r4.xyzw\nendif \nand r3.xyzw, r2.xyzw, l(0xf0f0f0f0, 0xf0f0f0f0, 0xf0f0f0f0, 0xf0f0f0f0)\nishl r4.xyzw, r2.xyzw, l(8, 8, 8, 8)\nand r4.xyzw, r4.xyzw, l(0x0f000f00, 0x0f000f00, 0x0f000f00, 0x0f000f00)\niadd r3.xyzw, r3.xyzw, r4.xyzw\nushr r2.xyzw, r2.xyzw, l(8, 8, 8, 8)\nand r2.xyzw, r2.xyzw, l(0x000f000f, 0x000f000f, 0x000f000f, 0x000f000f)\niadd r2.xyzw, r2.xyzw, r3.xyzw\nstore_raw U0[0].xyzw, r1.z, r2.xyzw\niadd r0.z, r1.z, l(16)\niadd r0.x, r0.x, l(16)\nld_raw r2.xyzw, r0.x, T0[0].xyzw\nif_nz r0.y\n  ishl r3.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r2.xyzw, r3.xyzw, r4.xyzw\nendif \nand r3.xyzw, r2.xyzw, l(0xf0f0f0f0, 0xf0f0f0f0, 0xf0f0f0f0, 0xf0f0f0f0)\nishl r4.xyzw, r2.xyzw, l(8, 8, 8, 8)\nand r4.xyzw, r4.xyzw, l(0x0f000f00, 0x0f000f00, 0x0f000f00, 0x0f000f00)\niadd r3.xyzw, r3.xyzw, r4.xyzw\nushr r2.xyzw, r2.xyzw, l(8, 8, 8, 8)\nand r2.xyzw, r2.xyzw, l(0x000f000f, 0x000f000f, 0x000f000f, 0x000f000f)\niadd r2.xyzw, r2.xyzw, r3.xyzw\nstore_raw U0[0].xyzw, r0.z, r2.xyzw\nret \n// Approximately 95 instruction slots used\n#endif\n\nconst BYTE texture_load_r4g4b4a4_b4g4r4a4_scaled_cs[] =\n{\n     68,  88,  66,  67,  17, 168, \n    209, 100, 187,  29, 212, 165, \n     34, 192,  98, 116, 200,  62, \n    208, 235,   1,   0,   0,   0, \n     24,  18,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n    124,  17,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n     64,  13,   0,   0,  81,   0, \n      5,   0,  80,   3,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   5,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n     98,   0,  16,   0,   0,   0, \n      0,   0,   6,   1,  16,   0, \n      1,   0,   0,   0,   6, 129, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  17, \n    226,   0,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   7,   0,   0,   0, \n      6, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  35,   0,   0,   9, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,   2,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,  11, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   9,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  78,   0,   0,   8, \n    242,   0,  16,   0,   2,   0, \n      0,   0,   0, 208,   0,   0, \n     22,   5,  16,   0,   1,   0, \n      0,   0, 182,  15,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,  10,  50,   0,  16,   0, \n      1,   0,   0,   0, 230,  10, \n     16, 128,  65,   0,   0,   0, \n      0,   0,   0,   0, 214,   5, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  41,   0,   0,  10, \n     50,   0,  16,   0,   3,   0, \n      0,   0, 118,  15,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  10,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  26,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  25,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     85,   0,   0,  12, 162,   0, \n     16,   0,   1,   0,   0,   0, \n    166, 142,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n     42,   0,   0,   6,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,   2,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n    139,   0,   0,  15, 114,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,  28,   0, \n      0,   0,  27,   0,   0,   0, \n     29,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0, 118,  15, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,   9, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n    140,   0,   0,  10, 130,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  42,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  42,   0, \n      0,  10, 194,   0,  16,   0, \n      3,   0,   0,   0,   6,   4, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   3,   0, \n      0,   0, 140,   0,   0,  11, \n     66,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     25,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  87,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   4,   0, \n      0,   0,   1,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n    140,   0,   0,  20, 194,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     11,   0,   0,   0,   6,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n     41,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0, 139,   0,   0,  15, \n    162,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  27,   0, \n      0,   0,   0,   0,   0,   0, \n     24,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,   7,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     18,   0,   0,   1,  85,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0, 139,   0, \n      0,  15, 242,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  27,   0,   0,   0, \n     27,   0,   0,   0,  28,   0, \n      0,   0,  29,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n      0,  10,  50,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n    130,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  26,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n      1,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  20,  50,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 182,  15,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  30,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n    139,   0,   0,  15,  50,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  27,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  21,   0, \n      0,   1,  38,   0,   0,   8, \n      0, 208,   0,   0,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     32,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     21,   0,   0,   1,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0, 240, 240, \n    240, 240, 240, 240, 240, 240, \n    240, 240, 240, 240, 240, 240, \n    240, 240,  41,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,  15,   0,  15,   0,  15, \n      0,  15,   0,  15,   0,  15, \n      0,  15,   0,  15,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     15,   0,  15,   0,  15,   0, \n     15,   0,  15,   0,  15,   0, \n     15,   0,  15,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  21,   0, \n      0,   1,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0, 240, 240, 240, 240, \n    240, 240, 240, 240, 240, 240, \n    240, 240, 240, 240, 240, 240, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,  15, \n      0,  15,   0,  15,   0,  15, \n      0,  15,   0,  15,   0,  15, \n      0,  15,  30,   0,   0,   7, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  15,   0, \n     15,   0,  15,   0,  15,   0, \n     15,   0,  15,   0,  15,   0, \n     15,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  62,   0,   0,   1, \n     83,  84,  65,  84, 148,   0, \n      0,   0,  95,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   0,  26,   0,   0,   0, \n      3,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_r5g5b5a1_b5g5r5a1_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 5\ndcl_thread_group 4, 32, 1\nand r0.xy, CB0[0][0].xxxx, l(1, 2, 0, 0)\nishl r1.x, vThreadID.x, l(4)\nmov r1.y, vThreadID.y\nuge r0.zw, r1.xxxy, CB0[0][1].xxxy\nor r0.z, r0.w, r0.z\nif_nz r0.z\n  ret \nendif \nubfe r0.z, l(2), l(2), CB0[0][0].x\nishl r0.w, r1.x, l(1)\nimad r1.y, vThreadID.z, CB0[0][1].y, vThreadID.y\nimad r0.w, r1.y, CB0[0][2].x, r0.w\niadd r0.w, r0.w, CB0[0][1].w\nif_z r0.x\n  imad r1.y, CB0[0][0].w, vThreadID.z, vThreadID.y\n  imad r1.y, CB0[0][0].z, r1.y, r1.x\n  ishl r1.y, r1.y, l(1)\nelse \n  if_nz r0.y\n    ushr r1.zw, CB0[0][0].zzzw, l(0, 0, 5, 4)\n    ishr r2.xyzw, vThreadID.zyyy, l(2, 4, 1, 3)\n    imad r0.y, r2.x, r1.w, r2.y\n    ibfe r1.w, l(27), l(1), vThreadID.x\n    imad r0.y, r0.y, r1.z, r1.w\n    bfi r1.zw, l(0, 0, 2, 1), l(0, 0, 5, 4), vThreadID.zzzy, l(0, 0, 0, 0)\n    bfi r2.y, l(2), l(3), r2.z, l(0)\n    iadd r1.z, r1.z, r2.y\n    bfi r0.y, l(25), l(7), r0.y, r1.z\n    xor r1.z, r2.x, r2.w\n    ishr r2.x, r1.x, l(3)\n    and r2.x, r2.x, l(2)\n    bfi r2.yz, l(0, 1, 1, 0), l(0, 1, 11, 0), r1.zzzz, l(0, 0, 0, 0)\n    xor r1.z, r2.y, r2.x\n    ishl r1.z, r1.z, l(6)\n    iadd r1.z, r1.z, r1.w\n    iadd r1.z, r2.z, r1.z\n    ibfe r2.xyz, l(28, 27, 24, 0), l(3, 4, 7, 0), r0.yyyy\n    bfi r0.y, l(1), l(5), r2.x, r1.z\n    bfi r0.y, l(3), l(8), r2.y, r0.y\n    bfi r1.y, l(20), l(12), r2.z, r0.y\n  else \n    ushr r0.y, CB0[0][0].z, l(5)\n    ishr r2.xyzw, vThreadID.yyyy, l(5, 1, 4, 3)\n    ibfe r1.z, l(27), l(1), vThreadID.x\n    imad r0.y, r2.x, r0.y, r1.z\n    bfi r2.xyz, l(3, 1, 1, 0), l(3, 1, 11, 0), r2.ywzy, l(0, 0, 0, 0)\n    bfi r0.y, l(26), l(6), r0.y, r2.x\n    ishr r1.x, r1.x, l(3)\n    and r1.x, r1.x, l(2)\n    xor r1.x, r2.y, r1.x\n    bfi r1.z, l(1), l(4), vThreadID.y, l(0)\n    ishl r1.x, r1.x, l(6)\n    iadd r1.x, r1.x, r1.z\n    iadd r1.x, r2.z, r1.x\n    ibfe r2.xyz, l(28, 27, 24, 0), l(3, 4, 7, 0), r0.yyyy\n    bfi r0.y, l(1), l(5), r2.x, r1.x\n    bfi r0.y, l(3), l(8), r2.y, r0.y\n    bfi r1.y, l(20), l(12), r2.z, r0.y\n  endif \nendif \niadd r0.y, r1.y, CB0[0][0].y\nld_raw r1.xyzw, r0.y, T0[0].xyzw\nieq r0.z, r0.z, l(1)\nif_nz r0.z\n  ishl r2.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r2.xyzw, r2.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r3.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r1.xyzw, r2.xyzw, r3.xyzw\nendif \nand r2.xyzw, r1.xyzw, l(0x83e083e0, 0x83e083e0, 0x83e083e0, 0x83e083e0)\nishl r3.xyzw, r1.xyzw, l(10, 10, 10, 10)\nand r3.xyzw, r3.xyzw, l(0x7c007c00, 0x7c007c00, 0x7c007c00, 0x7c007c00)\niadd r2.xyzw, r2.xyzw, r3.xyzw\nushr r1.xyzw, r1.xyzw, l(10, 10, 10, 10)\nand r1.xyzw, r1.xyzw, l(0x001f001f, 0x001f001f, 0x001f001f, 0x001f001f)\niadd r1.xyzw, r1.xyzw, r2.xyzw\nstore_raw U0[0].xyzw, r0.w, r1.xyzw\niadd r1.x, r0.w, l(16)\nif_nz r0.x\n  mov r0.x, l(64)\nelse \n  mov r0.x, l(16)\nendif \niadd r0.x, r0.x, r0.y\nld_raw r2.xyzw, r0.x, T0[0].xyzw\nif_nz r0.z\n  ishl r3.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r2.xyzw, r3.xyzw, r4.xyzw\nendif \nand r3.xyzw, r2.xyzw, l(0x83e083e0, 0x83e083e0, 0x83e083e0, 0x83e083e0)\nishl r4.xyzw, r2.xyzw, l(10, 10, 10, 10)\nand r4.xyzw, r4.xyzw, l(0x7c007c00, 0x7c007c00, 0x7c007c00, 0x7c007c00)\niadd r3.xyzw, r3.xyzw, r4.xyzw\nushr r2.xyzw, r2.xyzw, l(10, 10, 10, 10)\nand r2.xyzw, r2.xyzw, l(0x001f001f, 0x001f001f, 0x001f001f, 0x001f001f)\niadd r2.xyzw, r2.xyzw, r3.xyzw\nstore_raw U0[0].xyzw, r1.x, r2.xyzw\nret \n// Approximately 102 instruction slots used\n#endif\n\nconst BYTE texture_load_r5g5b5a1_b5g5r5a1_cs[] =\n{\n     68,  88,  66,  67, 102, 197, \n     78,  46, 230, 119, 209,  77, \n    124, 181, 108, 220,  52, 144, \n     70,  66,   1,   0,   0,   0, \n      4,  18,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n    104,  17,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n     44,  13,   0,   0,  81,   0, \n      5,   0,  75,   3,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   5,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  12,  50,   0,  16,   0, \n      0,   0,   0,   0,   6, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n    194,   0,  16,   0,   0,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0,   6, 132, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  11, \n     66,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,   2,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,  11, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  31,   0, \n      0,   3,  10,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  58, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  42,   0,   2,   0, \n     26,   0,   2,   0,  35,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     41,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  18,   0, \n      0,   1,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,  12, \n    194,   0,  16,   0,   1,   0, \n      0,   0, 166, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0,  42,   0,   0,   9, \n    242,   0,  16,   0,   2,   0, \n      0,   0, 102,   5,   2,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      1,   0,   0,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 139,   0,   0,   8, \n    130,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     27,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     10,   0,   2,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  19, 194,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0, 166,   6,   2,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     25,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  87,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,   0,   7, \n     18,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   7,  18,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  20,  98,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0, 166,  10,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  30,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 139,   0, \n      0,  15, 114,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  28,   0,   0,   0, \n     27,   0,   0,   0,  24,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   4,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  86,   5,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  18,   0, \n      0,   1,  85,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  42,   0,   0,   9, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  86,   5,   2,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   1,   0,   0,   0, \n      4,   0,   0,   0,   3,   0, \n      0,   0, 139,   0,   0,   8, \n     66,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     27,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     10,   0,   2,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  20, 114,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0, 214,   6,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  26,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  87,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  10, \n     66,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     26,   0,   2,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     41,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    139,   0,   0,  15, 114,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  28,   0, \n      0,   0,  27,   0,   0,   0, \n     24,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   4,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  21,   0, \n      0,   1,  30,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  32,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  31,   0,   4,   3, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  21,   0, \n      0,   1,   1,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0, 224, 131, 224, 131, \n    224, 131, 224, 131, 224, 131, \n    224, 131, 224, 131, 224, 131, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0, 124, \n      0, 124,   0, 124,   0, 124, \n      0, 124,   0, 124,   0, 124, \n      0, 124,  30,   0,   0,   7, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  31,   0, \n     31,   0,  31,   0,  31,   0, \n     31,   0,  31,   0,  31,   0, \n     31,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  64,   0, \n      0,   0,  18,   0,   0,   1, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0,  21,   0,   0,   1, \n     30,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,  85,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  21,   0,   0,   1, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n    224, 131, 224, 131, 224, 131, \n    224, 131, 224, 131, 224, 131, \n    224, 131, 224, 131,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0, 124,   0, 124, \n      0, 124,   0, 124,   0, 124, \n      0, 124,   0, 124,   0, 124, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  31,   0,  31,   0, \n     31,   0,  31,   0,  31,   0, \n     31,   0,  31,   0,  31,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     62,   0,   0,   1,  83,  84, \n     65,  84, 148,   0,   0,   0, \n    102,   0,   0,   0,   5,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  36,   0,   0,   0, \n     24,   0,   0,   0,   5,   0, \n      0,   0,   6,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_r5g5b5a1_b5g5r5a1_scaled_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 5\ndcl_thread_group 4, 32, 1\nand r0.x, CB0[0][0].x, l(2)\nishl r1.x, vThreadID.x, l(4)\nmov r1.y, vThreadID.y\nuge r0.yz, r1.xxyx, CB0[0][1].xxyx\nor r0.y, r0.z, r0.y\nif_nz r0.y\n  ret \nendif \nubfe r0.yzw, l(0, 2, 3, 3), l(0, 2, 4, 7), CB0[0][0].xxxx\nishl r1.z, r1.x, l(1)\nimad r1.w, vThreadID.z, CB0[0][1].y, vThreadID.y\nimad r1.z, r1.w, CB0[0][2].x, r1.z\niadd r1.z, r1.z, CB0[0][1].w\nushr r1.xy, r1.xyxx, l(4, 2, 0, 0)\nudiv r2.xyzw, null, r1.yxyy, r0.wzww\nimad r1.xy, -r0.zwzz, r2.ywyy, r1.xyxx\nishl r3.xy, r2.wyww, l(2, 4, 0, 0)\nimad r1.x, r1.x, r0.w, r1.y\nbfi r1.y, l(2), l(5), vThreadID.y, l(0)\nbfi r1.x, l(25), l(7), r1.x, r1.y\nif_nz r0.x\n  ushr r1.yw, CB0[0][0].zzzw, l(0, 5, 0, 4)\n  ishr r0.x, vThreadID.z, l(2)\n  ibfe r4.xyz, l(28, 27, 29, 0), l(2, 1, 1, 0), r2.wyww\n  imad r1.w, r0.x, r1.w, r4.x\n  imad r1.y, r1.w, r1.y, r4.y\n  bfi r1.w, l(2), l(5), vThreadID.z, l(0)\n  ishr r3.zw, r3.xxxy, l(0, 0, 1, 3)\n  bfi r3.z, l(2), l(3), r3.z, l(0)\n  iadd r1.w, r1.w, r3.z\n  bfi r1.y, l(25), l(7), r1.y, r1.w\n  xor r0.x, r0.x, r4.z\n  and r1.w, r3.w, l(2)\n  bfi r3.zw, l(0, 0, 1, 1), l(0, 0, 1, 11), r0.xxxx, l(0, 0, 0, 0)\n  xor r0.x, r1.w, r3.z\n  ishl r0.x, r0.x, l(6)\n  iadd r0.x, r3.w, r0.x\n  ibfe r1.yw, l(0, 27, 0, 24), l(0, 4, 0, 7), r1.yyyy\n  bfi r0.x, l(3), l(8), r1.y, r0.x\n  bfi r0.x, l(20), l(12), r1.w, r0.x\nelse \n  ushr r1.y, CB0[0][0].z, l(5)\n  ibfe r2.xyzw, l(27, 27, 28, 29), l(3, 1, 2, 1), r2.xyzw\n  imad r1.y, r2.x, r1.y, r2.y\n  ishr r2.xy, r3.xyxx, l(1, 3, 0, 0)\n  bfi r1.w, l(3), l(3), r2.x, l(0)\n  bfi r1.y, l(26), l(6), r1.y, r1.w\n  and r1.w, r2.y, l(2)\n  bfi r2.xy, l(1, 1, 0, 0), l(1, 11, 0, 0), r2.wzww, l(0, 0, 0, 0)\n  xor r1.w, r1.w, r2.x\n  ishl r1.w, r1.w, l(6)\n  iadd r1.w, r2.y, r1.w\n  ibfe r2.xy, l(27, 24, 0, 0), l(4, 7, 0, 0), r1.yyyy\n  bfi r1.y, l(3), l(8), r2.x, r1.w\n  bfi r0.x, l(20), l(12), r2.y, r1.y\nendif \nimul null, r0.z, r0.w, r0.z\nimad r0.x, r0.x, r0.z, r1.x\niadd r0.x, r0.x, CB0[0][0].y\nld_raw r2.xyzw, r0.x, T0[0].xyzw\nieq r0.y, r0.y, l(1)\nif_nz r0.y\n  ishl r3.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r2.xyzw, r3.xyzw, r4.xyzw\nendif \nand r3.xyzw, r2.xyzw, l(0x83e083e0, 0x83e083e0, 0x83e083e0, 0x83e083e0)\nishl r4.xyzw, r2.xyzw, l(10, 10, 10, 10)\nand r4.xyzw, r4.xyzw, l(0x7c007c00, 0x7c007c00, 0x7c007c00, 0x7c007c00)\niadd r3.xyzw, r3.xyzw, r4.xyzw\nushr r2.xyzw, r2.xyzw, l(10, 10, 10, 10)\nand r2.xyzw, r2.xyzw, l(0x001f001f, 0x001f001f, 0x001f001f, 0x001f001f)\niadd r2.xyzw, r2.xyzw, r3.xyzw\nstore_raw U0[0].xyzw, r1.z, r2.xyzw\niadd r0.z, r1.z, l(16)\niadd r0.x, r0.x, l(16)\nld_raw r2.xyzw, r0.x, T0[0].xyzw\nif_nz r0.y\n  ishl r3.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r2.xyzw, r3.xyzw, r4.xyzw\nendif \nand r3.xyzw, r2.xyzw, l(0x83e083e0, 0x83e083e0, 0x83e083e0, 0x83e083e0)\nishl r4.xyzw, r2.xyzw, l(10, 10, 10, 10)\nand r4.xyzw, r4.xyzw, l(0x7c007c00, 0x7c007c00, 0x7c007c00, 0x7c007c00)\niadd r3.xyzw, r3.xyzw, r4.xyzw\nushr r2.xyzw, r2.xyzw, l(10, 10, 10, 10)\nand r2.xyzw, r2.xyzw, l(0x001f001f, 0x001f001f, 0x001f001f, 0x001f001f)\niadd r2.xyzw, r2.xyzw, r3.xyzw\nstore_raw U0[0].xyzw, r0.z, r2.xyzw\nret \n// Approximately 95 instruction slots used\n#endif\n\nconst BYTE texture_load_r5g5b5a1_b5g5r5a1_scaled_cs[] =\n{\n     68,  88,  66,  67,  11,  23, \n     66, 169,  43, 217,  83, 247, \n      4, 116, 163,  22, 134, 149, \n    106,  10,   1,   0,   0,   0, \n     24,  18,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n    124,  17,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n     64,  13,   0,   0,  81,   0, \n      5,   0,  80,   3,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   5,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n     98,   0,  16,   0,   0,   0, \n      0,   0,   6,   1,  16,   0, \n      1,   0,   0,   0,   6, 129, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  17, \n    226,   0,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   7,   0,   0,   0, \n      6, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  35,   0,   0,   9, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,   2,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,  11, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   9,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  78,   0,   0,   8, \n    242,   0,  16,   0,   2,   0, \n      0,   0,   0, 208,   0,   0, \n     22,   5,  16,   0,   1,   0, \n      0,   0, 182,  15,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,  10,  50,   0,  16,   0, \n      1,   0,   0,   0, 230,  10, \n     16, 128,  65,   0,   0,   0, \n      0,   0,   0,   0, 214,   5, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  41,   0,   0,  10, \n     50,   0,  16,   0,   3,   0, \n      0,   0, 118,  15,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  10,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  26,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  25,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     85,   0,   0,  12, 162,   0, \n     16,   0,   1,   0,   0,   0, \n    166, 142,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n     42,   0,   0,   6,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,   2,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n    139,   0,   0,  15, 114,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,  28,   0, \n      0,   0,  27,   0,   0,   0, \n     29,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0, 118,  15, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,   9, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n    140,   0,   0,  10, 130,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  42,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  42,   0, \n      0,  10, 194,   0,  16,   0, \n      3,   0,   0,   0,   6,   4, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   3,   0, \n      0,   0, 140,   0,   0,  11, \n     66,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     25,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  87,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   4,   0, \n      0,   0,   1,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n    140,   0,   0,  20, 194,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     11,   0,   0,   0,   6,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n     41,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0, 139,   0,   0,  15, \n    162,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  27,   0, \n      0,   0,   0,   0,   0,   0, \n     24,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,   7,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     18,   0,   0,   1,  85,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0, 139,   0, \n      0,  15, 242,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  27,   0,   0,   0, \n     27,   0,   0,   0,  28,   0, \n      0,   0,  29,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n      0,  10,  50,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n    130,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  26,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n      1,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  20,  50,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 182,  15,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  30,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n    139,   0,   0,  15,  50,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  27,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  21,   0, \n      0,   1,  38,   0,   0,   8, \n      0, 208,   0,   0,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     32,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     21,   0,   0,   1,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0, 224, 131, \n    224, 131, 224, 131, 224, 131, \n    224, 131, 224, 131, 224, 131, \n    224, 131,  41,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 124,   0, 124,   0, 124, \n      0, 124,   0, 124,   0, 124, \n      0, 124,   0, 124,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     31,   0,  31,   0,  31,   0, \n     31,   0,  31,   0,  31,   0, \n     31,   0,  31,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  21,   0, \n      0,   1,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0, 224, 131, 224, 131, \n    224, 131, 224, 131, 224, 131, \n    224, 131, 224, 131, 224, 131, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0, 124, \n      0, 124,   0, 124,   0, 124, \n      0, 124,   0, 124,   0, 124, \n      0, 124,  30,   0,   0,   7, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     10,   0,   0,   0,  10,   0, \n      0,   0,  10,   0,   0,   0, \n     10,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  31,   0, \n     31,   0,  31,   0,  31,   0, \n     31,   0,  31,   0,  31,   0, \n     31,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  62,   0,   0,   1, \n     83,  84,  65,  84, 148,   0, \n      0,   0,  95,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   0,  26,   0,   0,   0, \n      3,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_r5g5b6_b5g6r5_swizzle_rbga_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 5\ndcl_thread_group 4, 32, 1\nand r0.xy, CB0[0][0].xxxx, l(1, 2, 0, 0)\nishl r1.x, vThreadID.x, l(4)\nmov r1.y, vThreadID.y\nuge r0.zw, r1.xxxy, CB0[0][1].xxxy\nor r0.z, r0.w, r0.z\nif_nz r0.z\n  ret \nendif \nubfe r0.z, l(2), l(2), CB0[0][0].x\nishl r0.w, r1.x, l(1)\nimad r1.y, vThreadID.z, CB0[0][1].y, vThreadID.y\nimad r0.w, r1.y, CB0[0][2].x, r0.w\niadd r0.w, r0.w, CB0[0][1].w\nif_z r0.x\n  imad r1.y, CB0[0][0].w, vThreadID.z, vThreadID.y\n  imad r1.y, CB0[0][0].z, r1.y, r1.x\n  ishl r1.y, r1.y, l(1)\nelse \n  if_nz r0.y\n    ushr r1.zw, CB0[0][0].zzzw, l(0, 0, 5, 4)\n    ishr r2.xyzw, vThreadID.zyyy, l(2, 4, 1, 3)\n    imad r0.y, r2.x, r1.w, r2.y\n    ibfe r1.w, l(27), l(1), vThreadID.x\n    imad r0.y, r0.y, r1.z, r1.w\n    bfi r1.zw, l(0, 0, 2, 1), l(0, 0, 5, 4), vThreadID.zzzy, l(0, 0, 0, 0)\n    bfi r2.y, l(2), l(3), r2.z, l(0)\n    iadd r1.z, r1.z, r2.y\n    bfi r0.y, l(25), l(7), r0.y, r1.z\n    xor r1.z, r2.x, r2.w\n    ishr r2.x, r1.x, l(3)\n    and r2.x, r2.x, l(2)\n    bfi r2.yz, l(0, 1, 1, 0), l(0, 1, 11, 0), r1.zzzz, l(0, 0, 0, 0)\n    xor r1.z, r2.y, r2.x\n    ishl r1.z, r1.z, l(6)\n    iadd r1.z, r1.z, r1.w\n    iadd r1.z, r2.z, r1.z\n    ibfe r2.xyz, l(28, 27, 24, 0), l(3, 4, 7, 0), r0.yyyy\n    bfi r0.y, l(1), l(5), r2.x, r1.z\n    bfi r0.y, l(3), l(8), r2.y, r0.y\n    bfi r1.y, l(20), l(12), r2.z, r0.y\n  else \n    ushr r0.y, CB0[0][0].z, l(5)\n    ishr r2.xyzw, vThreadID.yyyy, l(5, 1, 4, 3)\n    ibfe r1.z, l(27), l(1), vThreadID.x\n    imad r0.y, r2.x, r0.y, r1.z\n    bfi r2.xyz, l(3, 1, 1, 0), l(3, 1, 11, 0), r2.ywzy, l(0, 0, 0, 0)\n    bfi r0.y, l(26), l(6), r0.y, r2.x\n    ishr r1.x, r1.x, l(3)\n    and r1.x, r1.x, l(2)\n    xor r1.x, r2.y, r1.x\n    bfi r1.z, l(1), l(4), vThreadID.y, l(0)\n    ishl r1.x, r1.x, l(6)\n    iadd r1.x, r1.x, r1.z\n    iadd r1.x, r2.z, r1.x\n    ibfe r2.xyz, l(28, 27, 24, 0), l(3, 4, 7, 0), r0.yyyy\n    bfi r0.y, l(1), l(5), r2.x, r1.x\n    bfi r0.y, l(3), l(8), r2.y, r0.y\n    bfi r1.y, l(20), l(12), r2.z, r0.y\n  endif \nendif \niadd r0.y, r1.y, CB0[0][0].y\nld_raw r1.xyzw, r0.y, T0[0].xyzw\nieq r0.z, r0.z, l(1)\nif_nz r0.z\n  ishl r2.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r2.xyzw, r2.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r3.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r1.xyzw, r2.xyzw, r3.xyzw\nendif \nishl r2.xyzw, r1.xyzw, l(11, 11, 11, 11)\nand r2.xyzw, r2.xyzw, l(0xf800f800, 0xf800f800, 0xf800f800, 0xf800f800)\nushr r1.xyzw, r1.xyzw, l(5, 5, 5, 5)\nand r1.xyzw, r1.xyzw, l(0x07ff07ff, 0x07ff07ff, 0x07ff07ff, 0x07ff07ff)\niadd r1.xyzw, r1.xyzw, r2.xyzw\nstore_raw U0[0].xyzw, r0.w, r1.xyzw\niadd r1.x, r0.w, l(16)\nif_nz r0.x\n  mov r0.x, l(64)\nelse \n  mov r0.x, l(16)\nendif \niadd r0.x, r0.x, r0.y\nld_raw r2.xyzw, r0.x, T0[0].xyzw\nif_nz r0.z\n  ishl r3.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r2.xyzw, r3.xyzw, r4.xyzw\nendif \nishl r3.xyzw, r2.xyzw, l(11, 11, 11, 11)\nand r3.xyzw, r3.xyzw, l(0xf800f800, 0xf800f800, 0xf800f800, 0xf800f800)\nushr r2.xyzw, r2.xyzw, l(5, 5, 5, 5)\nand r2.xyzw, r2.xyzw, l(0x07ff07ff, 0x07ff07ff, 0x07ff07ff, 0x07ff07ff)\niadd r2.xyzw, r2.xyzw, r3.xyzw\nstore_raw U0[0].xyzw, r1.x, r2.xyzw\nret \n// Approximately 98 instruction slots used\n#endif\n\nconst BYTE texture_load_r5g5b6_b5g6r5_swizzle_rbga_cs[] =\n{\n     68,  88,  66,  67,  71, 141, \n     47,  22, 245,  25,  75, 196, \n    232, 113, 212,   9,  57,  15, \n     86,  76,   1,   0,   0,   0, \n    124,  17,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n    224,  16,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n    164,  12,   0,   0,  81,   0, \n      5,   0,  41,   3,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   5,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  12,  50,   0,  16,   0, \n      0,   0,   0,   0,   6, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n    194,   0,  16,   0,   0,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0,   6, 132, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  11, \n     66,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,   2,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,  11, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  31,   0, \n      0,   3,  10,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  58, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  42,   0,   2,   0, \n     26,   0,   2,   0,  35,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     41,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  18,   0, \n      0,   1,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,  12, \n    194,   0,  16,   0,   1,   0, \n      0,   0, 166, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0,  42,   0,   0,   9, \n    242,   0,  16,   0,   2,   0, \n      0,   0, 102,   5,   2,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      1,   0,   0,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 139,   0,   0,   8, \n    130,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     27,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     10,   0,   2,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  19, 194,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0, 166,   6,   2,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     25,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  87,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,   0,   7, \n     18,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   7,  18,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  20,  98,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0, 166,  10,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  30,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 139,   0, \n      0,  15, 114,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  28,   0,   0,   0, \n     27,   0,   0,   0,  24,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   4,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  86,   5,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  18,   0, \n      0,   1,  85,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  42,   0,   0,   9, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  86,   5,   2,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   1,   0,   0,   0, \n      4,   0,   0,   0,   3,   0, \n      0,   0, 139,   0,   0,   8, \n     66,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     27,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     10,   0,   2,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  20, 114,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0, 214,   6,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  26,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  87,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  10, \n     66,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     26,   0,   2,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     41,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    139,   0,   0,  15, 114,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  28,   0, \n      0,   0,  27,   0,   0,   0, \n     24,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   4,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  21,   0, \n      0,   1,  30,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  32,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  31,   0,   4,   3, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  21,   0, \n      0,   1,  41,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  11,   0,   0,   0, \n     11,   0,   0,   0,  11,   0, \n      0,   0,  11,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 248,   0, 248,   0, 248, \n      0, 248,   0, 248,   0, 248, \n      0, 248,   0, 248,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0, 255,   7, 255,   7, \n    255,   7, 255,   7, 255,   7, \n    255,   7, 255,   7, 255,   7, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0,  31,   0, \n      4,   3,  10,   0,  16,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  64,   0,   0,   0, \n     18,   0,   0,   1,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n     21,   0,   0,   1,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     21,   0,   0,   1,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  11,   0, \n      0,   0,  11,   0,   0,   0, \n     11,   0,   0,   0,  11,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0, 248,   0, 248, \n      0, 248,   0, 248,   0, 248, \n      0, 248,   0, 248,   0, 248, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0, 255,   7, \n    255,   7, 255,   7, 255,   7, \n    255,   7, 255,   7, 255,   7, \n    255,   7,  30,   0,   0,   7, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  62,   0,   0,   1, \n     83,  84,  65,  84, 148,   0, \n      0,   0,  98,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  34,   0, \n      0,   0,  22,   0,   0,   0, \n      5,   0,   0,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_r5g5b6_b5g6r5_swizzle_rbga_scaled_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 5\ndcl_thread_group 4, 32, 1\nand r0.x, CB0[0][0].x, l(2)\nishl r1.x, vThreadID.x, l(4)\nmov r1.y, vThreadID.y\nuge r0.yz, r1.xxyx, CB0[0][1].xxyx\nor r0.y, r0.z, r0.y\nif_nz r0.y\n  ret \nendif \nubfe r0.yzw, l(0, 2, 3, 3), l(0, 2, 4, 7), CB0[0][0].xxxx\nishl r1.z, r1.x, l(1)\nimad r1.w, vThreadID.z, CB0[0][1].y, vThreadID.y\nimad r1.z, r1.w, CB0[0][2].x, r1.z\niadd r1.z, r1.z, CB0[0][1].w\nushr r1.xy, r1.xyxx, l(4, 2, 0, 0)\nudiv r2.xyzw, null, r1.yxyy, r0.wzww\nimad r1.xy, -r0.zwzz, r2.ywyy, r1.xyxx\nishl r3.xy, r2.wyww, l(2, 4, 0, 0)\nimad r1.x, r1.x, r0.w, r1.y\nbfi r1.y, l(2), l(5), vThreadID.y, l(0)\nbfi r1.x, l(25), l(7), r1.x, r1.y\nif_nz r0.x\n  ushr r1.yw, CB0[0][0].zzzw, l(0, 5, 0, 4)\n  ishr r0.x, vThreadID.z, l(2)\n  ibfe r4.xyz, l(28, 27, 29, 0), l(2, 1, 1, 0), r2.wyww\n  imad r1.w, r0.x, r1.w, r4.x\n  imad r1.y, r1.w, r1.y, r4.y\n  bfi r1.w, l(2), l(5), vThreadID.z, l(0)\n  ishr r3.zw, r3.xxxy, l(0, 0, 1, 3)\n  bfi r3.z, l(2), l(3), r3.z, l(0)\n  iadd r1.w, r1.w, r3.z\n  bfi r1.y, l(25), l(7), r1.y, r1.w\n  xor r0.x, r0.x, r4.z\n  and r1.w, r3.w, l(2)\n  bfi r3.zw, l(0, 0, 1, 1), l(0, 0, 1, 11), r0.xxxx, l(0, 0, 0, 0)\n  xor r0.x, r1.w, r3.z\n  ishl r0.x, r0.x, l(6)\n  iadd r0.x, r3.w, r0.x\n  ibfe r1.yw, l(0, 27, 0, 24), l(0, 4, 0, 7), r1.yyyy\n  bfi r0.x, l(3), l(8), r1.y, r0.x\n  bfi r0.x, l(20), l(12), r1.w, r0.x\nelse \n  ushr r1.y, CB0[0][0].z, l(5)\n  ibfe r2.xyzw, l(27, 27, 28, 29), l(3, 1, 2, 1), r2.xyzw\n  imad r1.y, r2.x, r1.y, r2.y\n  ishr r2.xy, r3.xyxx, l(1, 3, 0, 0)\n  bfi r1.w, l(3), l(3), r2.x, l(0)\n  bfi r1.y, l(26), l(6), r1.y, r1.w\n  and r1.w, r2.y, l(2)\n  bfi r2.xy, l(1, 1, 0, 0), l(1, 11, 0, 0), r2.wzww, l(0, 0, 0, 0)\n  xor r1.w, r1.w, r2.x\n  ishl r1.w, r1.w, l(6)\n  iadd r1.w, r2.y, r1.w\n  ibfe r2.xy, l(27, 24, 0, 0), l(4, 7, 0, 0), r1.yyyy\n  bfi r1.y, l(3), l(8), r2.x, r1.w\n  bfi r0.x, l(20), l(12), r2.y, r1.y\nendif \nimul null, r0.z, r0.w, r0.z\nimad r0.x, r0.x, r0.z, r1.x\niadd r0.x, r0.x, CB0[0][0].y\nld_raw r2.xyzw, r0.x, T0[0].xyzw\nieq r0.y, r0.y, l(1)\nif_nz r0.y\n  ishl r3.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r2.xyzw, r3.xyzw, r4.xyzw\nendif \nishl r3.xyzw, r2.xyzw, l(11, 11, 11, 11)\nand r3.xyzw, r3.xyzw, l(0xf800f800, 0xf800f800, 0xf800f800, 0xf800f800)\nushr r2.xyzw, r2.xyzw, l(5, 5, 5, 5)\nand r2.xyzw, r2.xyzw, l(0x07ff07ff, 0x07ff07ff, 0x07ff07ff, 0x07ff07ff)\niadd r2.xyzw, r2.xyzw, r3.xyzw\nstore_raw U0[0].xyzw, r1.z, r2.xyzw\niadd r0.z, r1.z, l(16)\niadd r0.x, r0.x, l(16)\nld_raw r2.xyzw, r0.x, T0[0].xyzw\nif_nz r0.y\n  ishl r3.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r2.xyzw, r3.xyzw, r4.xyzw\nendif \nishl r3.xyzw, r2.xyzw, l(11, 11, 11, 11)\nand r3.xyzw, r3.xyzw, l(0xf800f800, 0xf800f800, 0xf800f800, 0xf800f800)\nushr r2.xyzw, r2.xyzw, l(5, 5, 5, 5)\nand r2.xyzw, r2.xyzw, l(0x07ff07ff, 0x07ff07ff, 0x07ff07ff, 0x07ff07ff)\niadd r2.xyzw, r2.xyzw, r3.xyzw\nstore_raw U0[0].xyzw, r0.z, r2.xyzw\nret \n// Approximately 91 instruction slots used\n#endif\n\nconst BYTE texture_load_r5g5b6_b5g6r5_swizzle_rbga_scaled_cs[] =\n{\n     68,  88,  66,  67,  89, 255, \n     23, 217, 100,  19, 219, 139, \n    180, 149, 128, 111, 176,  12, \n    209, 125,   1,   0,   0,   0, \n    144,  17,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n    244,  16,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n    184,  12,   0,   0,  81,   0, \n      5,   0,  46,   3,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   5,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n     98,   0,  16,   0,   0,   0, \n      0,   0,   6,   1,  16,   0, \n      1,   0,   0,   0,   6, 129, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  17, \n    226,   0,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   7,   0,   0,   0, \n      6, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  35,   0,   0,   9, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,   2,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,  11, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   9,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  78,   0,   0,   8, \n    242,   0,  16,   0,   2,   0, \n      0,   0,   0, 208,   0,   0, \n     22,   5,  16,   0,   1,   0, \n      0,   0, 182,  15,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,  10,  50,   0,  16,   0, \n      1,   0,   0,   0, 230,  10, \n     16, 128,  65,   0,   0,   0, \n      0,   0,   0,   0, 214,   5, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  41,   0,   0,  10, \n     50,   0,  16,   0,   3,   0, \n      0,   0, 118,  15,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  10,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  26,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  25,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     85,   0,   0,  12, 162,   0, \n     16,   0,   1,   0,   0,   0, \n    166, 142,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n     42,   0,   0,   6,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,   2,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n    139,   0,   0,  15, 114,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,  28,   0, \n      0,   0,  27,   0,   0,   0, \n     29,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0, 118,  15, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,   9, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n    140,   0,   0,  10, 130,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  42,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  42,   0, \n      0,  10, 194,   0,  16,   0, \n      3,   0,   0,   0,   6,   4, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   3,   0, \n      0,   0, 140,   0,   0,  11, \n     66,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     25,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  87,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   4,   0, \n      0,   0,   1,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n    140,   0,   0,  20, 194,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     11,   0,   0,   0,   6,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n     41,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0, 139,   0,   0,  15, \n    162,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  27,   0, \n      0,   0,   0,   0,   0,   0, \n     24,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,   7,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     18,   0,   0,   1,  85,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0, 139,   0, \n      0,  15, 242,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  27,   0,   0,   0, \n     27,   0,   0,   0,  28,   0, \n      0,   0,  29,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n      0,  10,  50,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n    130,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  26,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n      1,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  20,  50,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 182,  15,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  30,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n    139,   0,   0,  15,  50,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  27,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  21,   0, \n      0,   1,  38,   0,   0,   8, \n      0, 208,   0,   0,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     32,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     21,   0,   0,   1,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  11,   0, \n      0,   0,  11,   0,   0,   0, \n     11,   0,   0,   0,  11,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0, 248,   0, 248, \n      0, 248,   0, 248,   0, 248, \n      0, 248,   0, 248,   0, 248, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0, 255,   7, \n    255,   7, 255,   7, 255,   7, \n    255,   7, 255,   7, 255,   7, \n    255,   7,  30,   0,   0,   7, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  30,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n     30,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,  85,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  21,   0,   0,   1, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     11,   0,   0,   0,  11,   0, \n      0,   0,  11,   0,   0,   0, \n     11,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0, 248, \n      0, 248,   0, 248,   0, 248, \n      0, 248,   0, 248,   0, 248, \n      0, 248,  85,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   5,   0,   0,   0, \n      5,   0,   0,   0,   5,   0, \n      0,   0,   5,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   7, 255,   7, 255,   7, \n    255,   7, 255,   7, 255,   7, \n    255,   7, 255,   7,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  62,   0, \n      0,   1,  83,  84,  65,  84, \n    148,   0,   0,   0,  91,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     33,   0,   0,   0,  24,   0, \n      0,   0,   3,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_r5g6b5_b5g6r5_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 5\ndcl_thread_group 4, 32, 1\nand r0.xy, CB0[0][0].xxxx, l(1, 2, 0, 0)\nishl r1.x, vThreadID.x, l(4)\nmov r1.y, vThreadID.y\nuge r0.zw, r1.xxxy, CB0[0][1].xxxy\nor r0.z, r0.w, r0.z\nif_nz r0.z\n  ret \nendif \nubfe r0.z, l(2), l(2), CB0[0][0].x\nishl r0.w, r1.x, l(1)\nimad r1.y, vThreadID.z, CB0[0][1].y, vThreadID.y\nimad r0.w, r1.y, CB0[0][2].x, r0.w\niadd r0.w, r0.w, CB0[0][1].w\nif_z r0.x\n  imad r1.y, CB0[0][0].w, vThreadID.z, vThreadID.y\n  imad r1.y, CB0[0][0].z, r1.y, r1.x\n  ishl r1.y, r1.y, l(1)\nelse \n  if_nz r0.y\n    ushr r1.zw, CB0[0][0].zzzw, l(0, 0, 5, 4)\n    ishr r2.xyzw, vThreadID.zyyy, l(2, 4, 1, 3)\n    imad r0.y, r2.x, r1.w, r2.y\n    ibfe r1.w, l(27), l(1), vThreadID.x\n    imad r0.y, r0.y, r1.z, r1.w\n    bfi r1.zw, l(0, 0, 2, 1), l(0, 0, 5, 4), vThreadID.zzzy, l(0, 0, 0, 0)\n    bfi r2.y, l(2), l(3), r2.z, l(0)\n    iadd r1.z, r1.z, r2.y\n    bfi r0.y, l(25), l(7), r0.y, r1.z\n    xor r1.z, r2.x, r2.w\n    ishr r2.x, r1.x, l(3)\n    and r2.x, r2.x, l(2)\n    bfi r2.yz, l(0, 1, 1, 0), l(0, 1, 11, 0), r1.zzzz, l(0, 0, 0, 0)\n    xor r1.z, r2.y, r2.x\n    ishl r1.z, r1.z, l(6)\n    iadd r1.z, r1.z, r1.w\n    iadd r1.z, r2.z, r1.z\n    ibfe r2.xyz, l(28, 27, 24, 0), l(3, 4, 7, 0), r0.yyyy\n    bfi r0.y, l(1), l(5), r2.x, r1.z\n    bfi r0.y, l(3), l(8), r2.y, r0.y\n    bfi r1.y, l(20), l(12), r2.z, r0.y\n  else \n    ushr r0.y, CB0[0][0].z, l(5)\n    ishr r2.xyzw, vThreadID.yyyy, l(5, 1, 4, 3)\n    ibfe r1.z, l(27), l(1), vThreadID.x\n    imad r0.y, r2.x, r0.y, r1.z\n    bfi r2.xyz, l(3, 1, 1, 0), l(3, 1, 11, 0), r2.ywzy, l(0, 0, 0, 0)\n    bfi r0.y, l(26), l(6), r0.y, r2.x\n    ishr r1.x, r1.x, l(3)\n    and r1.x, r1.x, l(2)\n    xor r1.x, r2.y, r1.x\n    bfi r1.z, l(1), l(4), vThreadID.y, l(0)\n    ishl r1.x, r1.x, l(6)\n    iadd r1.x, r1.x, r1.z\n    iadd r1.x, r2.z, r1.x\n    ibfe r2.xyz, l(28, 27, 24, 0), l(3, 4, 7, 0), r0.yyyy\n    bfi r0.y, l(1), l(5), r2.x, r1.x\n    bfi r0.y, l(3), l(8), r2.y, r0.y\n    bfi r1.y, l(20), l(12), r2.z, r0.y\n  endif \nendif \niadd r0.y, r1.y, CB0[0][0].y\nld_raw r1.xyzw, r0.y, T0[0].xyzw\nieq r0.z, r0.z, l(1)\nif_nz r0.z\n  ishl r2.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r2.xyzw, r2.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r3.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r1.xyzw, r2.xyzw, r3.xyzw\nendif \nand r2.xyzw, r1.xyzw, l(0x07e007e0, 0x07e007e0, 0x07e007e0, 0x07e007e0)\nishl r3.xyzw, r1.xyzw, l(11, 11, 11, 11)\nand r3.xyzw, r3.xyzw, l(0xf800f800, 0xf800f800, 0xf800f800, 0xf800f800)\niadd r2.xyzw, r2.xyzw, r3.xyzw\nushr r1.xyzw, r1.xyzw, l(11, 11, 11, 11)\nand r1.xyzw, r1.xyzw, l(0x001f001f, 0x001f001f, 0x001f001f, 0x001f001f)\niadd r1.xyzw, r1.xyzw, r2.xyzw\nstore_raw U0[0].xyzw, r0.w, r1.xyzw\niadd r1.x, r0.w, l(16)\nif_nz r0.x\n  mov r0.x, l(64)\nelse \n  mov r0.x, l(16)\nendif \niadd r0.x, r0.x, r0.y\nld_raw r2.xyzw, r0.x, T0[0].xyzw\nif_nz r0.z\n  ishl r3.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r2.xyzw, r3.xyzw, r4.xyzw\nendif \nand r3.xyzw, r2.xyzw, l(0x07e007e0, 0x07e007e0, 0x07e007e0, 0x07e007e0)\nishl r4.xyzw, r2.xyzw, l(11, 11, 11, 11)\nand r4.xyzw, r4.xyzw, l(0xf800f800, 0xf800f800, 0xf800f800, 0xf800f800)\niadd r3.xyzw, r3.xyzw, r4.xyzw\nushr r2.xyzw, r2.xyzw, l(11, 11, 11, 11)\nand r2.xyzw, r2.xyzw, l(0x001f001f, 0x001f001f, 0x001f001f, 0x001f001f)\niadd r2.xyzw, r2.xyzw, r3.xyzw\nstore_raw U0[0].xyzw, r1.x, r2.xyzw\nret \n// Approximately 102 instruction slots used\n#endif\n\nconst BYTE texture_load_r5g6b5_b5g6r5_cs[] =\n{\n     68,  88,  66,  67,  56, 200, \n    213, 210, 219,  68, 112, 232, \n     79, 167, 185, 246, 235, 160, \n    110,  80,   1,   0,   0,   0, \n      4,  18,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n    104,  17,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n     44,  13,   0,   0,  81,   0, \n      5,   0,  75,   3,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   5,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  12,  50,   0,  16,   0, \n      0,   0,   0,   0,   6, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n    194,   0,  16,   0,   0,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0,   6, 132, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  11, \n     66,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,   2,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,  11, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  31,   0, \n      0,   3,  10,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  58, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  42,   0,   2,   0, \n     26,   0,   2,   0,  35,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     41,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  18,   0, \n      0,   1,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,  12, \n    194,   0,  16,   0,   1,   0, \n      0,   0, 166, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0,  42,   0,   0,   9, \n    242,   0,  16,   0,   2,   0, \n      0,   0, 102,   5,   2,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      1,   0,   0,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 139,   0,   0,   8, \n    130,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     27,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     10,   0,   2,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  19, 194,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0, 166,   6,   2,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     25,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  87,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,   0,   7, \n     18,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   7,  18,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  20,  98,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0, 166,  10,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  30,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 139,   0, \n      0,  15, 114,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  28,   0,   0,   0, \n     27,   0,   0,   0,  24,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   4,   0,   0,   0, \n      7,   0,   0,   0,   0,   0, \n      0,   0,  86,   5,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  18,   0, \n      0,   1,  85,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  42,   0,   0,   9, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  86,   5,   2,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   1,   0,   0,   0, \n      4,   0,   0,   0,   3,   0, \n      0,   0, 139,   0,   0,   8, \n     66,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     27,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     10,   0,   2,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  20, 114,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0, 214,   6,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  26,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  87,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  10, \n     66,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     26,   0,   2,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     41,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    139,   0,   0,  15, 114,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  28,   0, \n      0,   0,  27,   0,   0,   0, \n     24,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   4,   0, \n      0,   0,   7,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  21,   0, \n      0,   1,  30,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  32,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  31,   0,   4,   3, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  21,   0, \n      0,   1,   1,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0, 224,   7, 224,   7, \n    224,   7, 224,   7, 224,   7, \n    224,   7, 224,   7, 224,   7, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     11,   0,   0,   0,  11,   0, \n      0,   0,  11,   0,   0,   0, \n     11,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0, 248, \n      0, 248,   0, 248,   0, 248, \n      0, 248,   0, 248,   0, 248, \n      0, 248,  30,   0,   0,   7, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     11,   0,   0,   0,  11,   0, \n      0,   0,  11,   0,   0,   0, \n     11,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  31,   0, \n     31,   0,  31,   0,  31,   0, \n     31,   0,  31,   0,  31,   0, \n     31,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  64,   0, \n      0,   0,  18,   0,   0,   1, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0,  21,   0,   0,   1, \n     30,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,  85,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  21,   0,   0,   1, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n    224,   7, 224,   7, 224,   7, \n    224,   7, 224,   7, 224,   7, \n    224,   7, 224,   7,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  11,   0, \n      0,   0,  11,   0,   0,   0, \n     11,   0,   0,   0,  11,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0, 248,   0, 248, \n      0, 248,   0, 248,   0, 248, \n      0, 248,   0, 248,   0, 248, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  11,   0, \n      0,   0,  11,   0,   0,   0, \n     11,   0,   0,   0,  11,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  31,   0,  31,   0, \n     31,   0,  31,   0,  31,   0, \n     31,   0,  31,   0,  31,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     62,   0,   0,   1,  83,  84, \n     65,  84, 148,   0,   0,   0, \n    102,   0,   0,   0,   5,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,  36,   0,   0,   0, \n     24,   0,   0,   0,   5,   0, \n      0,   0,   6,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_r5g6b5_b5g6r5_scaled_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 5\ndcl_thread_group 4, 32, 1\nand r0.x, CB0[0][0].x, l(2)\nishl r1.x, vThreadID.x, l(4)\nmov r1.y, vThreadID.y\nuge r0.yz, r1.xxyx, CB0[0][1].xxyx\nor r0.y, r0.z, r0.y\nif_nz r0.y\n  ret \nendif \nubfe r0.yzw, l(0, 2, 3, 3), l(0, 2, 4, 7), CB0[0][0].xxxx\nishl r1.z, r1.x, l(1)\nimad r1.w, vThreadID.z, CB0[0][1].y, vThreadID.y\nimad r1.z, r1.w, CB0[0][2].x, r1.z\niadd r1.z, r1.z, CB0[0][1].w\nushr r1.xy, r1.xyxx, l(4, 2, 0, 0)\nudiv r2.xyzw, null, r1.yxyy, r0.wzww\nimad r1.xy, -r0.zwzz, r2.ywyy, r1.xyxx\nishl r3.xy, r2.wyww, l(2, 4, 0, 0)\nimad r1.x, r1.x, r0.w, r1.y\nbfi r1.y, l(2), l(5), vThreadID.y, l(0)\nbfi r1.x, l(25), l(7), r1.x, r1.y\nif_nz r0.x\n  ushr r1.yw, CB0[0][0].zzzw, l(0, 5, 0, 4)\n  ishr r0.x, vThreadID.z, l(2)\n  ibfe r4.xyz, l(28, 27, 29, 0), l(2, 1, 1, 0), r2.wyww\n  imad r1.w, r0.x, r1.w, r4.x\n  imad r1.y, r1.w, r1.y, r4.y\n  bfi r1.w, l(2), l(5), vThreadID.z, l(0)\n  ishr r3.zw, r3.xxxy, l(0, 0, 1, 3)\n  bfi r3.z, l(2), l(3), r3.z, l(0)\n  iadd r1.w, r1.w, r3.z\n  bfi r1.y, l(25), l(7), r1.y, r1.w\n  xor r0.x, r0.x, r4.z\n  and r1.w, r3.w, l(2)\n  bfi r3.zw, l(0, 0, 1, 1), l(0, 0, 1, 11), r0.xxxx, l(0, 0, 0, 0)\n  xor r0.x, r1.w, r3.z\n  ishl r0.x, r0.x, l(6)\n  iadd r0.x, r3.w, r0.x\n  ibfe r1.yw, l(0, 27, 0, 24), l(0, 4, 0, 7), r1.yyyy\n  bfi r0.x, l(3), l(8), r1.y, r0.x\n  bfi r0.x, l(20), l(12), r1.w, r0.x\nelse \n  ushr r1.y, CB0[0][0].z, l(5)\n  ibfe r2.xyzw, l(27, 27, 28, 29), l(3, 1, 2, 1), r2.xyzw\n  imad r1.y, r2.x, r1.y, r2.y\n  ishr r2.xy, r3.xyxx, l(1, 3, 0, 0)\n  bfi r1.w, l(3), l(3), r2.x, l(0)\n  bfi r1.y, l(26), l(6), r1.y, r1.w\n  and r1.w, r2.y, l(2)\n  bfi r2.xy, l(1, 1, 0, 0), l(1, 11, 0, 0), r2.wzww, l(0, 0, 0, 0)\n  xor r1.w, r1.w, r2.x\n  ishl r1.w, r1.w, l(6)\n  iadd r1.w, r2.y, r1.w\n  ibfe r2.xy, l(27, 24, 0, 0), l(4, 7, 0, 0), r1.yyyy\n  bfi r1.y, l(3), l(8), r2.x, r1.w\n  bfi r0.x, l(20), l(12), r2.y, r1.y\nendif \nimul null, r0.z, r0.w, r0.z\nimad r0.x, r0.x, r0.z, r1.x\niadd r0.x, r0.x, CB0[0][0].y\nld_raw r2.xyzw, r0.x, T0[0].xyzw\nieq r0.y, r0.y, l(1)\nif_nz r0.y\n  ishl r3.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r2.xyzw, r3.xyzw, r4.xyzw\nendif \nand r3.xyzw, r2.xyzw, l(0x07e007e0, 0x07e007e0, 0x07e007e0, 0x07e007e0)\nishl r4.xyzw, r2.xyzw, l(11, 11, 11, 11)\nand r4.xyzw, r4.xyzw, l(0xf800f800, 0xf800f800, 0xf800f800, 0xf800f800)\niadd r3.xyzw, r3.xyzw, r4.xyzw\nushr r2.xyzw, r2.xyzw, l(11, 11, 11, 11)\nand r2.xyzw, r2.xyzw, l(0x001f001f, 0x001f001f, 0x001f001f, 0x001f001f)\niadd r2.xyzw, r2.xyzw, r3.xyzw\nstore_raw U0[0].xyzw, r1.z, r2.xyzw\niadd r0.z, r1.z, l(16)\niadd r0.x, r0.x, l(16)\nld_raw r2.xyzw, r0.x, T0[0].xyzw\nif_nz r0.y\n  ishl r3.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r2.xyzw, r3.xyzw, r4.xyzw\nendif \nand r3.xyzw, r2.xyzw, l(0x07e007e0, 0x07e007e0, 0x07e007e0, 0x07e007e0)\nishl r4.xyzw, r2.xyzw, l(11, 11, 11, 11)\nand r4.xyzw, r4.xyzw, l(0xf800f800, 0xf800f800, 0xf800f800, 0xf800f800)\niadd r3.xyzw, r3.xyzw, r4.xyzw\nushr r2.xyzw, r2.xyzw, l(11, 11, 11, 11)\nand r2.xyzw, r2.xyzw, l(0x001f001f, 0x001f001f, 0x001f001f, 0x001f001f)\niadd r2.xyzw, r2.xyzw, r3.xyzw\nstore_raw U0[0].xyzw, r0.z, r2.xyzw\nret \n// Approximately 95 instruction slots used\n#endif\n\nconst BYTE texture_load_r5g6b5_b5g6r5_scaled_cs[] =\n{\n     68,  88,  66,  67, 147, 185, \n    124,  23,  17, 207,  78,  43, \n    182, 170, 178, 251,  33, 166, \n     33,  78,   1,   0,   0,   0, \n     24,  18,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n    124,  17,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n     64,  13,   0,   0,  81,   0, \n      5,   0,  80,   3,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   5,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n     98,   0,  16,   0,   0,   0, \n      0,   0,   6,   1,  16,   0, \n      1,   0,   0,   0,   6, 129, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  17, \n    226,   0,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   7,   0,   0,   0, \n      6, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  35,   0,   0,   9, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,   2,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,  11, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   9,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  78,   0,   0,   8, \n    242,   0,  16,   0,   2,   0, \n      0,   0,   0, 208,   0,   0, \n     22,   5,  16,   0,   1,   0, \n      0,   0, 182,  15,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,  10,  50,   0,  16,   0, \n      1,   0,   0,   0, 230,  10, \n     16, 128,  65,   0,   0,   0, \n      0,   0,   0,   0, 214,   5, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  41,   0,   0,  10, \n     50,   0,  16,   0,   3,   0, \n      0,   0, 118,  15,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  10,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  26,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  25,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     85,   0,   0,  12, 162,   0, \n     16,   0,   1,   0,   0,   0, \n    166, 142,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n     42,   0,   0,   6,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,   2,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n    139,   0,   0,  15, 114,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,  28,   0, \n      0,   0,  27,   0,   0,   0, \n     29,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0, 118,  15, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,   9, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n    140,   0,   0,  10, 130,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  42,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  42,   0, \n      0,  10, 194,   0,  16,   0, \n      3,   0,   0,   0,   6,   4, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   3,   0, \n      0,   0, 140,   0,   0,  11, \n     66,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   3,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     25,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  87,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   4,   0, \n      0,   0,   1,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n    140,   0,   0,  20, 194,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     11,   0,   0,   0,   6,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n     41,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0, 139,   0,   0,  15, \n    162,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  27,   0, \n      0,   0,   0,   0,   0,   0, \n     24,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,   7,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     18,   0,   0,   1,  85,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0, 139,   0, \n      0,  15, 242,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  27,   0,   0,   0, \n     27,   0,   0,   0,  28,   0, \n      0,   0,  29,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n      0,  10,  50,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n    130,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  26,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n      1,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  20,  50,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 182,  15,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  30,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n    139,   0,   0,  15,  50,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  27,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      4,   0,   0,   0,   7,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  21,   0, \n      0,   1,  38,   0,   0,   8, \n      0, 208,   0,   0,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     32,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     21,   0,   0,   1,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0, 224,   7, \n    224,   7, 224,   7, 224,   7, \n    224,   7, 224,   7, 224,   7, \n    224,   7,  41,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  11,   0,   0,   0, \n     11,   0,   0,   0,  11,   0, \n      0,   0,  11,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 248,   0, 248,   0, 248, \n      0, 248,   0, 248,   0, 248, \n      0, 248,   0, 248,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  11,   0,   0,   0, \n     11,   0,   0,   0,  11,   0, \n      0,   0,  11,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     31,   0,  31,   0,  31,   0, \n     31,   0,  31,   0,  31,   0, \n     31,   0,  31,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  21,   0, \n      0,   1,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0, 224,   7, 224,   7, \n    224,   7, 224,   7, 224,   7, \n    224,   7, 224,   7, 224,   7, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     11,   0,   0,   0,  11,   0, \n      0,   0,  11,   0,   0,   0, \n     11,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0, 248, \n      0, 248,   0, 248,   0, 248, \n      0, 248,   0, 248,   0, 248, \n      0, 248,  30,   0,   0,   7, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     11,   0,   0,   0,  11,   0, \n      0,   0,  11,   0,   0,   0, \n     11,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  31,   0, \n     31,   0,  31,   0,  31,   0, \n     31,   0,  31,   0,  31,   0, \n     31,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  62,   0,   0,   1, \n     83,  84,  65,  84, 148,   0, \n      0,   0,  95,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   0,  26,   0,   0,   0, \n      3,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_rg16_snorm_float_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 5\ndcl_thread_group 4, 32, 1\nand r0.xy, CB0[0][0].xxxx, l(1, 2, 0, 0)\nishl r1.x, vThreadID.x, l(3)\nmov r1.y, vThreadID.y\nuge r0.zw, r1.xxxy, CB0[0][1].xxxy\nor r0.z, r0.w, r0.z\nif_nz r0.z\n  ret \nendif \nubfe r0.z, l(2), l(2), CB0[0][0].x\nishl r0.w, r1.x, l(2)\nimad r1.y, vThreadID.z, CB0[0][1].y, vThreadID.y\nimad r0.w, r1.y, CB0[0][2].x, r0.w\niadd r0.w, r0.w, CB0[0][1].w\nif_z r0.x\n  imad r1.y, CB0[0][0].w, vThreadID.z, vThreadID.y\n  imad r1.y, CB0[0][0].z, r1.y, r1.x\n  ishl r1.y, r1.y, l(2)\nelse \n  if_nz r0.y\n    ushr r1.zw, CB0[0][0].zzzw, l(0, 0, 5, 4)\n    ishr r2.xyzw, vThreadID.zyyy, l(2, 4, 1, 3)\n    imad r0.y, r2.x, r1.w, r2.y\n    ibfe r1.w, l(27), l(2), vThreadID.x\n    imad r0.y, r0.y, r1.z, r1.w\n    bfi r1.zw, l(0, 0, 2, 1), l(0, 0, 5, 4), vThreadID.zzzy, l(0, 0, 0, 0)\n    bfi r2.y, l(2), l(3), r2.z, l(0)\n    iadd r1.z, r1.z, r2.y\n    bfi r0.y, l(25), l(7), r0.y, r1.z\n    xor r1.z, r2.x, r2.w\n    ubfe r2.x, l(2), l(3), r1.x\n    bfi r2.yz, l(0, 1, 1, 0), l(0, 1, 11, 0), r1.zzzz, l(0, 0, 0, 0)\n    xor r1.z, r2.y, r2.x\n    imad r1.z, r1.z, l(64), r1.w\n    iadd r1.z, r2.z, r1.z\n    ibfe r2.xy, l(27, 24, 0, 0), l(3, 6, 0, 0), r0.yyyy\n    bfi r0.y, l(3), l(8), r2.x, r1.z\n    bfi r1.y, l(20), l(12), r2.y, r0.y\n  else \n    ushr r0.y, CB0[0][0].z, l(5)\n    ishr r2.xyzw, vThreadID.yyyy, l(5, 1, 4, 3)\n    ibfe r1.z, l(27), l(2), vThreadID.x\n    imad r0.y, r2.x, r0.y, r1.z\n    bfi r2.xyz, l(3, 1, 1, 0), l(3, 1, 11, 0), r2.ywzy, l(0, 0, 0, 0)\n    bfi r0.y, l(26), l(6), r0.y, r2.x\n    ubfe r1.x, l(2), l(3), r1.x\n    xor r1.x, r2.y, r1.x\n    bfi r1.z, l(1), l(4), vThreadID.y, l(0)\n    imad r1.x, r1.x, l(64), r1.z\n    iadd r1.x, r2.z, r1.x\n    ibfe r1.zw, l(0, 0, 27, 24), l(0, 0, 3, 6), r0.yyyy\n    bfi r0.y, l(3), l(8), r1.z, r1.x\n    bfi r1.y, l(20), l(12), r1.w, r0.y\n  endif \nendif \niadd r0.y, r1.y, CB0[0][0].y\nld_raw r1.xyzw, r0.y, T0[0].xyzw\nieq r2.xyz, r0.zzzz, l(1, 2, 3, 0)\nor r2.xy, r2.yzyy, r2.xyxx\nif_nz r2.x\n  ishl r3.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r1.xyzw, r3.xyzw, r4.xyzw\nendif \nif_nz r2.y\n  ushr r3.xyzw, r1.xyzw, l(16, 16, 16, 16)\n  bfi r1.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r1.xyzw, r3.xyzw\nendif \nibfe r3.xyzw, l(16, 16, 16, 16), l(0, 0, 0, 0), r1.xyzw\nitof r3.xyzw, r3.xyzw\nmul r3.xyzw, r3.xyzw, l(0.000031, 0.000031, 0.000031, 0.000031)\nmax r3.xyzw, r3.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\nishr r1.xyzw, r1.xyzw, l(16, 16, 16, 16)\nitof r1.xyzw, r1.xyzw\nmul r1.xyzw, r1.xyzw, l(0.000031, 0.000031, 0.000031, 0.000031)\nmax r1.xyzw, r1.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\nf32tof16 r3.xyzw, r3.xyzw\nf32tof16 r1.xyzw, r1.xyzw\nimad r1.xyzw, r1.xyzw, l(0x00010000, 0x00010000, 0x00010000, 0x00010000), r3.xyzw\nstore_raw U0[0].xyzw, r0.w, r1.xyzw\niadd r0.z, r0.w, l(16)\nif_nz r0.x\n  mov r0.x, l(32)\nelse \n  mov r0.x, l(16)\nendif \niadd r0.x, r0.x, r0.y\nld_raw r1.xyzw, r0.x, T0[0].xyzw\nif_nz r2.x\n  ishl r3.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r1.xyzw, r3.xyzw, r4.xyzw\nendif \nif_nz r2.y\n  ushr r2.xyzw, r1.xyzw, l(16, 16, 16, 16)\n  bfi r1.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r1.xyzw, r2.xyzw\nendif \nibfe r2.xyzw, l(16, 16, 16, 16), l(0, 0, 0, 0), r1.xyzw\nitof r2.xyzw, r2.xyzw\nmul r2.xyzw, r2.xyzw, l(0.000031, 0.000031, 0.000031, 0.000031)\nmax r2.xyzw, r2.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\nishr r1.xyzw, r1.xyzw, l(16, 16, 16, 16)\nitof r1.xyzw, r1.xyzw\nmul r1.xyzw, r1.xyzw, l(0.000031, 0.000031, 0.000031, 0.000031)\nmax r1.xyzw, r1.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\nf32tof16 r2.xyzw, r2.xyzw\nf32tof16 r1.xyzw, r1.xyzw\nimad r1.xyzw, r1.xyzw, l(0x00010000, 0x00010000, 0x00010000, 0x00010000), r2.xyzw\nstore_raw U0[0].xyzw, r0.z, r1.xyzw\nret \n// Approximately 113 instruction slots used\n#endif\n\nconst BYTE texture_load_rg16_snorm_float_cs[] =\n{\n     68,  88,  66,  67, 225,  26, \n    164,  65,   2, 255, 140, 244, \n    213, 131, 205,  10, 242, 162, \n    198, 172,   1,   0,   0,   0, \n    132,  19,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n    232,  18,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n    172,  14,   0,   0,  81,   0, \n      5,   0, 171,   3,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   5,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  12,  50,   0,  16,   0, \n      0,   0,   0,   0,   6, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n    194,   0,  16,   0,   0,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0,   6, 132, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  11, \n     66,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,   2,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,  11, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  31,   0, \n      0,   3,  10,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  58, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  42,   0,   2,   0, \n     26,   0,   2,   0,  35,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     41,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  18,   0, \n      0,   1,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,  12, \n    194,   0,  16,   0,   1,   0, \n      0,   0, 166, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0,  42,   0,   0,   9, \n    242,   0,  16,   0,   2,   0, \n      0,   0, 102,   5,   2,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      1,   0,   0,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 139,   0,   0,   8, \n    130,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     27,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10,   0,   2,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  19, 194,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0, 166,   6,   2,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     25,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  87,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0, 138,   0,   0,   9, \n     18,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  20, \n     98,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  11,   0, \n      0,   0,   0,   0,   0,   0, \n    166,  10,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  87,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  64,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    139,   0,   0,  15,  50,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  27,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  18,   0, \n      0,   1,  85,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  42,   0,   0,   9, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  86,   5,   2,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   1,   0,   0,   0, \n      4,   0,   0,   0,   3,   0, \n      0,   0, 139,   0,   0,   8, \n     66,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     27,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10,   0,   2,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  20, 114,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0, 214,   6,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  26,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0, 138,   0,   0,   9, \n     18,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  87,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  10,  66,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  26,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  64,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 139,   0,   0,  15, \n    194,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  27,   0,   0,   0, \n     24,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  21,   0, \n      0,   1,  30,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  32,   0, \n      0,  10, 114,   0,  16,   0, \n      2,   0,   0,   0, 166,  10, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   2,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   2,   0, \n      0,   0, 150,   5,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,  85,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     21,   0,   0,   1, 139,   0, \n      0,  15, 242,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1,   0,  56,   0,   1, \n      0,  56,   0,   1,   0,  56, \n      0,   1,   0,  56,  52,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,  42,   0,   0,  10, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   1,   0,  56, \n      0,   1,   0,  56,   0,   1, \n      0,  56,   0,   1,   0,  56, \n     52,   0,   0,  10, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191, 130,   0, \n      0,   5, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n    130,   0,   0,   5, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  35,   0,   0,  12, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     32,   0,   0,   0,  18,   0, \n      0,   1,  54,   0,   0,   5, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0,  21,   0, \n      0,   1,  30,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  21,   0,   0,   1, \n    139,   0,   0,  15, 242,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   1,   0,  56, \n      0,   1,   0,  56,   0,   1, \n      0,  56,   0,   1,   0,  56, \n     52,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,  42,   0, \n      0,  10, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n      0,  56,   0,   1,   0,  56, \n      0,   1,   0,  56,   0,   1, \n      0,  56,  52,   0,   0,  10, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n    130,   0,   0,   5, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0, 130,   0,   0,   5, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  35,   0, \n      0,  12, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,  70,  14,  16,   0, \n      2,   0,   0,   0, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     62,   0,   0,   1,  83,  84, \n     65,  84, 148,   0,   0,   0, \n    113,   0,   0,   0,   5,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   8,   0, \n      0,   0,  30,   0,   0,   0, \n     17,   0,   0,   0,   5,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_rg16_snorm_float_scaled_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 5\ndcl_thread_group 4, 32, 1\nand r0.x, CB0[0][0].x, l(2)\nishl r1.x, vThreadID.x, l(3)\nmov r1.y, vThreadID.y\nuge r0.yz, r1.xxyx, CB0[0][1].xxyx\nor r0.y, r0.z, r0.y\nif_nz r0.y\n  ret \nendif \nubfe r0.yzw, l(0, 2, 3, 3), l(0, 2, 4, 7), CB0[0][0].xxxx\nishl r1.z, r1.x, l(2)\nimad r1.w, vThreadID.z, CB0[0][1].y, vThreadID.y\nimad r1.z, r1.w, CB0[0][2].x, r1.z\niadd r1.z, r1.z, CB0[0][1].w\nushr r1.yw, r1.xxxy, l(0, 4, 0, 1)\nudiv r2.xyzw, null, r1.wyww, r0.wzww\nimad r1.yw, -r0.zzzw, r2.yyyw, r1.yyyw\nishl r3.x, r2.y, l(4)\nimad r1.y, r1.y, r0.w, r1.w\nbfi r1.w, l(1), l(6), vThreadID.y, l(0)\nbfi r1.y, l(25), l(7), r1.y, r1.w\nbfi r1.x, l(4), l(2), r1.x, l(0)\niadd r1.x, r1.y, r1.x\nif_nz r0.x\n  ushr r1.yw, CB0[0][0].zzzw, l(0, 5, 0, 4)\n  ishr r0.x, vThreadID.z, l(2)\n  ibfe r4.xyzw, l(28, 27, 31, 29), l(3, 1, 0, 2), r2.wyww\n  imad r1.w, r0.x, r1.w, r4.x\n  imad r1.y, r1.w, r1.y, r4.y\n  bfi r1.w, l(2), l(5), vThreadID.z, l(0)\n  bfi r3.y, l(2), l(3), r4.z, l(0)\n  iadd r1.w, r1.w, r3.y\n  bfi r1.y, l(25), l(7), r1.y, r1.w\n  xor r0.x, r0.x, r4.w\n  ishr r1.w, r3.x, l(3)\n  and r1.w, r1.w, l(2)\n  bfi r3.yz, l(0, 1, 1, 0), l(0, 1, 11, 0), r0.xxxx, l(0, 0, 0, 0)\n  xor r0.x, r1.w, r3.y\n  ishl r0.x, r0.x, l(6)\n  iadd r0.x, r3.z, r0.x\n  ibfe r1.yw, l(0, 27, 0, 24), l(0, 3, 0, 6), r1.yyyy\n  bfi r0.x, l(3), l(8), r1.y, r0.x\n  bfi r0.x, l(20), l(12), r1.w, r0.x\nelse \n  ushr r1.y, CB0[0][0].z, l(5)\n  ibfe r4.xyzw, l(27, 27, 31, 28), l(4, 1, 0, 3), r2.xyzw\n  imad r1.y, r4.x, r1.y, r4.y\n  bfi r2.xy, l(3, 1, 0, 0), l(3, 11, 0, 0), r4.zwzz, l(0, 0, 0, 0)\n  bfi r1.y, l(26), l(6), r1.y, r2.x\n  ishr r1.w, r3.x, l(3)\n  and r1.w, r1.w, l(2)\n  ibfe r2.x, l(29), l(2), r2.w\n  bfi r2.x, l(1), l(1), r2.x, l(0)\n  xor r1.w, r1.w, r2.x\n  ishl r1.w, r1.w, l(6)\n  iadd r1.w, r2.y, r1.w\n  ibfe r2.xy, l(27, 24, 0, 0), l(3, 6, 0, 0), r1.yyyy\n  bfi r1.y, l(3), l(8), r2.x, r1.w\n  bfi r0.x, l(20), l(12), r2.y, r1.y\nendif \nimul null, r0.z, r0.w, r0.z\nimad r0.x, r0.x, r0.z, r1.x\niadd r0.x, r0.x, CB0[0][0].y\nld_raw r2.xyzw, r0.x, T0[0].xyzw\nieq r0.yzw, r0.yyyy, l(0, 1, 2, 3)\nor r0.yz, r0.zzwz, r0.yyzy\nif_nz r0.y\n  ishl r3.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r2.xyzw, r3.xyzw, r4.xyzw\nendif \nif_nz r0.z\n  ushr r3.xyzw, r2.xyzw, l(16, 16, 16, 16)\n  bfi r2.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r2.xyzw, r3.xyzw\nendif \nibfe r3.xyzw, l(16, 16, 16, 16), l(0, 0, 0, 0), r2.xyzw\nitof r3.xyzw, r3.xyzw\nmul r3.xyzw, r3.xyzw, l(0.000031, 0.000031, 0.000031, 0.000031)\nmax r3.xyzw, r3.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\nishr r2.xyzw, r2.xyzw, l(16, 16, 16, 16)\nitof r2.xyzw, r2.xyzw\nmul r2.xyzw, r2.xyzw, l(0.000031, 0.000031, 0.000031, 0.000031)\nmax r2.xyzw, r2.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\nf32tof16 r3.xyzw, r3.xyzw\nf32tof16 r2.xyzw, r2.xyzw\nimad r2.xyzw, r2.xyzw, l(0x00010000, 0x00010000, 0x00010000, 0x00010000), r3.xyzw\nstore_raw U0[0].xyzw, r1.z, r2.xyzw\niadd r0.w, r1.z, l(16)\niadd r0.x, r0.x, l(16)\nld_raw r2.xyzw, r0.x, T0[0].xyzw\nif_nz r0.y\n  ishl r3.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r2.xyzw, r3.xyzw, r4.xyzw\nendif \nif_nz r0.z\n  ushr r3.xyzw, r2.xyzw, l(16, 16, 16, 16)\n  bfi r2.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r2.xyzw, r3.xyzw\nendif \nibfe r3.xyzw, l(16, 16, 16, 16), l(0, 0, 0, 0), r2.xyzw\nitof r3.xyzw, r3.xyzw\nmul r3.xyzw, r3.xyzw, l(0.000031, 0.000031, 0.000031, 0.000031)\nmax r3.xyzw, r3.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\nishr r2.xyzw, r2.xyzw, l(16, 16, 16, 16)\nitof r2.xyzw, r2.xyzw\nmul r2.xyzw, r2.xyzw, l(0.000031, 0.000031, 0.000031, 0.000031)\nmax r2.xyzw, r2.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\nf32tof16 r3.xyzw, r3.xyzw\nf32tof16 r2.xyzw, r2.xyzw\nimad r2.xyzw, r2.xyzw, l(0x00010000, 0x00010000, 0x00010000, 0x00010000), r3.xyzw\nstore_raw U0[0].xyzw, r0.w, r2.xyzw\nret \n// Approximately 115 instruction slots used\n#endif\n\nconst BYTE texture_load_rg16_snorm_float_scaled_cs[] =\n{\n     68,  88,  66,  67, 188, 142, \n    161,  73, 207,  67,  58, 113, \n     43,   1, 174, 188, 101, 194, \n     18,  34,   1,   0,   0,   0, \n    136,  20,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n    236,  19,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n    176,  15,   0,   0,  81,   0, \n      5,   0, 236,   3,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   5,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n     98,   0,  16,   0,   0,   0, \n      0,   0,   6,   1,  16,   0, \n      1,   0,   0,   0,   6, 129, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  17, \n    226,   0,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   7,   0,   0,   0, \n      6, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,  35,   0,   0,   9, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,   2,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,  11, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   9,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  85,   0, \n      0,  10, 162,   0,  16,   0, \n      1,   0,   0,   0,   6,   4, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  78,   0,   0,   8, \n    242,   0,  16,   0,   2,   0, \n      0,   0,   0, 208,   0,   0, \n    118,  15,  16,   0,   1,   0, \n      0,   0, 182,  15,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,  10, 162,   0,  16,   0, \n      1,   0,   0,   0, 166,  14, \n     16, 128,  65,   0,   0,   0, \n      0,   0,   0,   0,  86,  13, \n     16,   0,   2,   0,   0,   0, \n     86,  13,  16,   0,   1,   0, \n      0,   0,  41,   0,   0,   7, \n     18,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  10, 130,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  26,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  25,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  18,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     85,   0,   0,  12, 162,   0, \n     16,   0,   1,   0,   0,   0, \n    166, 142,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n     42,   0,   0,   6,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,   2,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n    139,   0,   0,  15, 242,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,  28,   0, \n      0,   0,  27,   0,   0,   0, \n     31,   0,   0,   0,  29,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0, 118,  15, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,   9, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n    140,   0,   0,  10, 130,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  42,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      4,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  25,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     87,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,  42,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n    140,   0,   0,  20,  98,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0,   6,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n     41,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0, 139,   0,   0,  15, \n    162,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  27,   0, \n      0,   0,   0,   0,   0,   0, \n     24,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   6,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     18,   0,   0,   1,  85,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0, 139,   0, \n      0,  15, 242,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,  27,   0,   0,   0, \n     27,   0,   0,   0,  31,   0, \n      0,   0,  28,   0,   0,   0, \n      2,  64,   0,   0,   4,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      4,   0,   0,   0, 140,   0, \n      0,  20,  50,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 230,  10,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  26,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0, 139,   0, \n      0,   9,  18,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,  29,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  30,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n    139,   0,   0,  15,  50,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  27,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  21,   0, \n      0,   1,  38,   0,   0,   8, \n      0, 208,   0,   0,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     32,   0,   0,  10, 226,   0, \n     16,   0,   0,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   2,   0,   0,   0, \n      3,   0,   0,   0,  60,   0, \n      0,   7,  98,   0,  16,   0, \n      0,   0,   0,   0, 166,  11, \n     16,   0,   0,   0,   0,   0, \n     86,   6,  16,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  21,   0,   0,   1, \n    139,   0,   0,  15, 242,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   1,   0,  56, \n      0,   1,   0,  56,   0,   1, \n      0,  56,   0,   1,   0,  56, \n     52,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,  42,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n      0,  56,   0,   1,   0,  56, \n      0,   1,   0,  56,   0,   1, \n      0,  56,  52,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n    130,   0,   0,   5, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0, 130,   0,   0,   5, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  35,   0, \n      0,  12, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,  70,  14,  16,   0, \n      3,   0,   0,   0, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     30,   0,   0,   7, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  21,   0, \n      0,   1, 139,   0,   0,  15, \n    242,   0,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n      0,  56,   0,   1,   0,  56, \n      0,   1,   0,  56,   0,   1, \n      0,  56,  52,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n     42,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1,   0,  56,   0,   1, \n      0,  56,   0,   1,   0,  56, \n      0,   1,   0,  56,  52,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191, 130,   0,   0,   5, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0, 130,   0, \n      0,   5, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,  12, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  62,   0,   0,   1, \n     83,  84,  65,  84, 148,   0, \n      0,   0, 115,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      8,   0,   0,   0,  34,   0, \n      0,   0,  21,   0,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_rg16_unorm_float_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 5\ndcl_thread_group 4, 32, 1\nand r0.xy, CB0[0][0].xxxx, l(1, 2, 0, 0)\nishl r1.x, vThreadID.x, l(3)\nmov r1.y, vThreadID.y\nuge r0.zw, r1.xxxy, CB0[0][1].xxxy\nor r0.z, r0.w, r0.z\nif_nz r0.z\n  ret \nendif \nubfe r0.z, l(2), l(2), CB0[0][0].x\nishl r0.w, r1.x, l(2)\nimad r1.y, vThreadID.z, CB0[0][1].y, vThreadID.y\nimad r0.w, r1.y, CB0[0][2].x, r0.w\niadd r0.w, r0.w, CB0[0][1].w\nif_z r0.x\n  imad r1.y, CB0[0][0].w, vThreadID.z, vThreadID.y\n  imad r1.y, CB0[0][0].z, r1.y, r1.x\n  ishl r1.y, r1.y, l(2)\nelse \n  if_nz r0.y\n    ushr r1.zw, CB0[0][0].zzzw, l(0, 0, 5, 4)\n    ishr r2.xyzw, vThreadID.zyyy, l(2, 4, 1, 3)\n    imad r0.y, r2.x, r1.w, r2.y\n    ibfe r1.w, l(27), l(2), vThreadID.x\n    imad r0.y, r0.y, r1.z, r1.w\n    bfi r1.zw, l(0, 0, 2, 1), l(0, 0, 5, 4), vThreadID.zzzy, l(0, 0, 0, 0)\n    bfi r2.y, l(2), l(3), r2.z, l(0)\n    iadd r1.z, r1.z, r2.y\n    bfi r0.y, l(25), l(7), r0.y, r1.z\n    xor r1.z, r2.x, r2.w\n    ubfe r2.x, l(2), l(3), r1.x\n    bfi r2.yz, l(0, 1, 1, 0), l(0, 1, 11, 0), r1.zzzz, l(0, 0, 0, 0)\n    xor r1.z, r2.y, r2.x\n    imad r1.z, r1.z, l(64), r1.w\n    iadd r1.z, r2.z, r1.z\n    ibfe r2.xy, l(27, 24, 0, 0), l(3, 6, 0, 0), r0.yyyy\n    bfi r0.y, l(3), l(8), r2.x, r1.z\n    bfi r1.y, l(20), l(12), r2.y, r0.y\n  else \n    ushr r0.y, CB0[0][0].z, l(5)\n    ishr r2.xyzw, vThreadID.yyyy, l(5, 1, 4, 3)\n    ibfe r1.z, l(27), l(2), vThreadID.x\n    imad r0.y, r2.x, r0.y, r1.z\n    bfi r2.xyz, l(3, 1, 1, 0), l(3, 1, 11, 0), r2.ywzy, l(0, 0, 0, 0)\n    bfi r0.y, l(26), l(6), r0.y, r2.x\n    ubfe r1.x, l(2), l(3), r1.x\n    xor r1.x, r2.y, r1.x\n    bfi r1.z, l(1), l(4), vThreadID.y, l(0)\n    imad r1.x, r1.x, l(64), r1.z\n    iadd r1.x, r2.z, r1.x\n    ibfe r1.zw, l(0, 0, 27, 24), l(0, 0, 3, 6), r0.yyyy\n    bfi r0.y, l(3), l(8), r1.z, r1.x\n    bfi r1.y, l(20), l(12), r1.w, r0.y\n  endif \nendif \niadd r0.y, r1.y, CB0[0][0].y\nld_raw r1.xyzw, r0.y, T0[0].xyzw\nieq r2.xyz, r0.zzzz, l(1, 2, 3, 0)\nor r2.xy, r2.yzyy, r2.xyxx\nif_nz r2.x\n  ishl r3.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r1.xyzw, r3.xyzw, r4.xyzw\nendif \nif_nz r2.y\n  ushr r3.xyzw, r1.xyzw, l(16, 16, 16, 16)\n  bfi r1.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r1.xyzw, r3.xyzw\nendif \nand r3.xyzw, r1.xyzw, l(0x0000ffff, 0x0000ffff, 0x0000ffff, 0x0000ffff)\nutof r3.xyzw, r3.xyzw\nmul r3.xyzw, r3.xyzw, l(0.000015, 0.000015, 0.000015, 0.000015)\nushr r1.xyzw, r1.xyzw, l(16, 16, 16, 16)\nutof r1.xyzw, r1.xyzw\nmul r1.xyzw, r1.xyzw, l(0.000015, 0.000015, 0.000015, 0.000015)\nf32tof16 r3.xyzw, r3.xyzw\nf32tof16 r1.xyzw, r1.xyzw\nimad r1.xyzw, r1.xyzw, l(0x00010000, 0x00010000, 0x00010000, 0x00010000), r3.xyzw\nstore_raw U0[0].xyzw, r0.w, r1.xyzw\niadd r0.z, r0.w, l(16)\nif_nz r0.x\n  mov r0.x, l(32)\nelse \n  mov r0.x, l(16)\nendif \niadd r0.x, r0.x, r0.y\nld_raw r1.xyzw, r0.x, T0[0].xyzw\nif_nz r2.x\n  ishl r3.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r1.xyzw, r3.xyzw, r4.xyzw\nendif \nif_nz r2.y\n  ushr r2.xyzw, r1.xyzw, l(16, 16, 16, 16)\n  bfi r1.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r1.xyzw, r2.xyzw\nendif \nand r2.xyzw, r1.xyzw, l(0x0000ffff, 0x0000ffff, 0x0000ffff, 0x0000ffff)\nutof r2.xyzw, r2.xyzw\nmul r2.xyzw, r2.xyzw, l(0.000015, 0.000015, 0.000015, 0.000015)\nushr r1.xyzw, r1.xyzw, l(16, 16, 16, 16)\nutof r1.xyzw, r1.xyzw\nmul r1.xyzw, r1.xyzw, l(0.000015, 0.000015, 0.000015, 0.000015)\nf32tof16 r2.xyzw, r2.xyzw\nf32tof16 r1.xyzw, r1.xyzw\nimad r1.xyzw, r1.xyzw, l(0x00010000, 0x00010000, 0x00010000, 0x00010000), r2.xyzw\nstore_raw U0[0].xyzw, r0.z, r1.xyzw\nret \n// Approximately 109 instruction slots used\n#endif\n\nconst BYTE texture_load_rg16_unorm_float_cs[] =\n{\n     68,  88,  66,  67,   3, 159, \n    134, 157,  17, 248, 167,  59, \n     78, 168, 249, 176, 189, 232, \n    146, 234,   1,   0,   0,   0, \n    188,  18,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n     32,  18,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n    228,  13,   0,   0,  81,   0, \n      5,   0, 121,   3,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   5,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  12,  50,   0,  16,   0, \n      0,   0,   0,   0,   6, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n    194,   0,  16,   0,   0,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0,   6, 132, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  11, \n     66,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,   2,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,  11, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  31,   0, \n      0,   3,  10,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  58, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  42,   0,   2,   0, \n     26,   0,   2,   0,  35,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     41,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  18,   0, \n      0,   1,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,  12, \n    194,   0,  16,   0,   1,   0, \n      0,   0, 166, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0,  42,   0,   0,   9, \n    242,   0,  16,   0,   2,   0, \n      0,   0, 102,   5,   2,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      1,   0,   0,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 139,   0,   0,   8, \n    130,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     27,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10,   0,   2,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  19, 194,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0, 166,   6,   2,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     25,   0,   0,   0,   1,  64, \n      0,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  87,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0, 138,   0,   0,   9, \n     18,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  20, \n     98,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  11,   0, \n      0,   0,   0,   0,   0,   0, \n    166,  10,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  87,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  35,   0,   0,   9, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  64,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    139,   0,   0,  15,  50,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  27,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  18,   0, \n      0,   1,  85,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0,  42,   0,   0,   9, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  86,   5,   2,   0, \n      2,  64,   0,   0,   5,   0, \n      0,   0,   1,   0,   0,   0, \n      4,   0,   0,   0,   3,   0, \n      0,   0, 139,   0,   0,   8, \n     66,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     27,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10,   0,   2,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  20, 114,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0, 214,   6,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  26,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0, 138,   0,   0,   9, \n     18,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  87,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  10,  66,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  26,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  64,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 139,   0,   0,  15, \n    194,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  27,   0,   0,   0, \n     24,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     21,   0,   0,   1,  21,   0, \n      0,   1,  30,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  32,   0, \n      0,  10, 114,   0,  16,   0, \n      2,   0,   0,   0, 166,  10, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   2,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,  60,   0,   0,   7, \n     50,   0,  16,   0,   2,   0, \n      0,   0, 150,   5,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,  85,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     21,   0,   0,   1,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0, 255, 255, \n      0,   0, 255, 255,   0,   0, \n    255, 255,   0,   0, 255, 255, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0, 128,   0, \n    128,  55, 128,   0, 128,  55, \n    128,   0, 128,  55, 128,   0, \n    128,  55,  85,   0,   0,  10, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0, 128,   0, 128,  55, \n    128,   0, 128,  55, 128,   0, \n    128,  55, 128,   0, 128,  55, \n    130,   0,   0,   5, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0, 130,   0,   0,   5, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  35,   0, \n      0,  12, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,  70,  14,  16,   0, \n      3,   0,   0,   0, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0,  31,   0, \n      4,   3,  10,   0,  16,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  32,   0,   0,   0, \n     18,   0,   0,   1,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n     21,   0,   0,   1,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0, 165,   0,   0,   8, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  31,   0, \n      4,   3,  10,   0,  16,   0, \n      2,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      2,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  21,   0, \n      0,   1,   1,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0, 255, 255,   0,   0, \n    255, 255,   0,   0, 255, 255, \n      0,   0, 255, 255,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0, 128,   0, 128,  55, \n    128,   0, 128,  55, 128,   0, \n    128,  55, 128,   0, 128,  55, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n    128,   0, 128,  55, 128,   0, \n    128,  55, 128,   0, 128,  55, \n    128,   0, 128,  55, 130,   0, \n      0,   5, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n    130,   0,   0,   5, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  35,   0,   0,  12, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  62,   0, \n      0,   1,  83,  84,  65,  84, \n    148,   0,   0,   0, 109,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   4,   0,   0,   0, \n     28,   0,   0,   0,  21,   0, \n      0,   0,   5,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_rg16_unorm_float_scaled_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 5\ndcl_thread_group 4, 32, 1\nand r0.x, CB0[0][0].x, l(2)\nishl r1.x, vThreadID.x, l(3)\nmov r1.y, vThreadID.y\nuge r0.yz, r1.xxyx, CB0[0][1].xxyx\nor r0.y, r0.z, r0.y\nif_nz r0.y\n  ret \nendif \nubfe r0.yzw, l(0, 2, 3, 3), l(0, 2, 4, 7), CB0[0][0].xxxx\nishl r1.z, r1.x, l(2)\nimad r1.w, vThreadID.z, CB0[0][1].y, vThreadID.y\nimad r1.z, r1.w, CB0[0][2].x, r1.z\niadd r1.z, r1.z, CB0[0][1].w\nushr r1.yw, r1.xxxy, l(0, 4, 0, 1)\nudiv r2.xyzw, null, r1.wyww, r0.wzww\nimad r1.yw, -r0.zzzw, r2.yyyw, r1.yyyw\nishl r3.x, r2.y, l(4)\nimad r1.y, r1.y, r0.w, r1.w\nbfi r1.w, l(1), l(6), vThreadID.y, l(0)\nbfi r1.y, l(25), l(7), r1.y, r1.w\nbfi r1.x, l(4), l(2), r1.x, l(0)\niadd r1.x, r1.y, r1.x\nif_nz r0.x\n  ushr r1.yw, CB0[0][0].zzzw, l(0, 5, 0, 4)\n  ishr r0.x, vThreadID.z, l(2)\n  ibfe r4.xyzw, l(28, 27, 31, 29), l(3, 1, 0, 2), r2.wyww\n  imad r1.w, r0.x, r1.w, r4.x\n  imad r1.y, r1.w, r1.y, r4.y\n  bfi r1.w, l(2), l(5), vThreadID.z, l(0)\n  bfi r3.y, l(2), l(3), r4.z, l(0)\n  iadd r1.w, r1.w, r3.y\n  bfi r1.y, l(25), l(7), r1.y, r1.w\n  xor r0.x, r0.x, r4.w\n  ishr r1.w, r3.x, l(3)\n  and r1.w, r1.w, l(2)\n  bfi r3.yz, l(0, 1, 1, 0), l(0, 1, 11, 0), r0.xxxx, l(0, 0, 0, 0)\n  xor r0.x, r1.w, r3.y\n  ishl r0.x, r0.x, l(6)\n  iadd r0.x, r3.z, r0.x\n  ibfe r1.yw, l(0, 27, 0, 24), l(0, 3, 0, 6), r1.yyyy\n  bfi r0.x, l(3), l(8), r1.y, r0.x\n  bfi r0.x, l(20), l(12), r1.w, r0.x\nelse \n  ushr r1.y, CB0[0][0].z, l(5)\n  ibfe r4.xyzw, l(27, 27, 31, 28), l(4, 1, 0, 3), r2.xyzw\n  imad r1.y, r4.x, r1.y, r4.y\n  bfi r2.xy, l(3, 1, 0, 0), l(3, 11, 0, 0), r4.zwzz, l(0, 0, 0, 0)\n  bfi r1.y, l(26), l(6), r1.y, r2.x\n  ishr r1.w, r3.x, l(3)\n  and r1.w, r1.w, l(2)\n  ibfe r2.x, l(29), l(2), r2.w\n  bfi r2.x, l(1), l(1), r2.x, l(0)\n  xor r1.w, r1.w, r2.x\n  ishl r1.w, r1.w, l(6)\n  iadd r1.w, r2.y, r1.w\n  ibfe r2.xy, l(27, 24, 0, 0), l(3, 6, 0, 0), r1.yyyy\n  bfi r1.y, l(3), l(8), r2.x, r1.w\n  bfi r0.x, l(20), l(12), r2.y, r1.y\nendif \nimul null, r0.z, r0.w, r0.z\nimad r0.x, r0.x, r0.z, r1.x\niadd r0.x, r0.x, CB0[0][0].y\nld_raw r2.xyzw, r0.x, T0[0].xyzw\nieq r0.yzw, r0.yyyy, l(0, 1, 2, 3)\nor r0.yz, r0.zzwz, r0.yyzy\nif_nz r0.y\n  ishl r3.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r2.xyzw, r3.xyzw, r4.xyzw\nendif \nif_nz r0.z\n  ushr r3.xyzw, r2.xyzw, l(16, 16, 16, 16)\n  bfi r2.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r2.xyzw, r3.xyzw\nendif \nand r3.xyzw, r2.xyzw, l(0x0000ffff, 0x0000ffff, 0x0000ffff, 0x0000ffff)\nutof r3.xyzw, r3.xyzw\nmul r3.xyzw, r3.xyzw, l(0.000015, 0.000015, 0.000015, 0.000015)\nushr r2.xyzw, r2.xyzw, l(16, 16, 16, 16)\nutof r2.xyzw, r2.xyzw\nmul r2.xyzw, r2.xyzw, l(0.000015, 0.000015, 0.000015, 0.000015)\nf32tof16 r3.xyzw, r3.xyzw\nf32tof16 r2.xyzw, r2.xyzw\nimad r2.xyzw, r2.xyzw, l(0x00010000, 0x00010000, 0x00010000, 0x00010000), r3.xyzw\nstore_raw U0[0].xyzw, r1.z, r2.xyzw\niadd r0.w, r1.z, l(16)\niadd r0.x, r0.x, l(16)\nld_raw r2.xyzw, r0.x, T0[0].xyzw\nif_nz r0.y\n  ishl r3.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r2.xyzw, r3.xyzw, r4.xyzw\nendif \nif_nz r0.z\n  ushr r3.xyzw, r2.xyzw, l(16, 16, 16, 16)\n  bfi r2.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r2.xyzw, r3.xyzw\nendif \nand r3.xyzw, r2.xyzw, l(0x0000ffff, 0x0000ffff, 0x0000ffff, 0x0000ffff)\nutof r3.xyzw, r3.xyzw\nmul r3.xyzw, r3.xyzw, l(0.000015, 0.000015, 0.000015, 0.000015)\nushr r2.xyzw, r2.xyzw, l(16, 16, 16, 16)\nutof r2.xyzw, r2.xyzw\nmul r2.xyzw, r2.xyzw, l(0.000015, 0.000015, 0.000015, 0.000015)\nf32tof16 r3.xyzw, r3.xyzw\nf32tof16 r2.xyzw, r2.xyzw\nimad r2.xyzw, r2.xyzw, l(0x00010000, 0x00010000, 0x00010000, 0x00010000), r3.xyzw\nstore_raw U0[0].xyzw, r0.w, r2.xyzw\nret \n// Approximately 111 instruction slots used\n#endif\n\nconst BYTE texture_load_rg16_unorm_float_scaled_cs[] =\n{\n     68,  88,  66,  67,  55, 234, \n      5, 122,  53, 211, 125, 144, \n    200, 123,  21,  46, 212, 237, \n    121,   0,   1,   0,   0,   0, \n    192,  19,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n     36,  19,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n    232,  14,   0,   0,  81,   0, \n      5,   0, 186,   3,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   5,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n     98,   0,  16,   0,   0,   0, \n      0,   0,   6,   1,  16,   0, \n      1,   0,   0,   0,   6, 129, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  17, \n    226,   0,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   7,   0,   0,   0, \n      6, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,  35,   0,   0,   9, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,   2,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,  11, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   9,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  85,   0, \n      0,  10, 162,   0,  16,   0, \n      1,   0,   0,   0,   6,   4, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  78,   0,   0,   8, \n    242,   0,  16,   0,   2,   0, \n      0,   0,   0, 208,   0,   0, \n    118,  15,  16,   0,   1,   0, \n      0,   0, 182,  15,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,  10, 162,   0,  16,   0, \n      1,   0,   0,   0, 166,  14, \n     16, 128,  65,   0,   0,   0, \n      0,   0,   0,   0,  86,  13, \n     16,   0,   2,   0,   0,   0, \n     86,  13,  16,   0,   1,   0, \n      0,   0,  41,   0,   0,   7, \n     18,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  10, 130,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  26,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  25,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  18,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     85,   0,   0,  12, 162,   0, \n     16,   0,   1,   0,   0,   0, \n    166, 142,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n     42,   0,   0,   6,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,   2,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n    139,   0,   0,  15, 242,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,  28,   0, \n      0,   0,  27,   0,   0,   0, \n     31,   0,   0,   0,  29,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0, 118,  15, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,   9, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n    140,   0,   0,  10, 130,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  42,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      4,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  25,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     87,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,  42,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n    140,   0,   0,  20,  98,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0,   6,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n     41,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  30,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0, 139,   0,   0,  15, \n    162,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,  27,   0, \n      0,   0,   0,   0,   0,   0, \n     24,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   6,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     18,   0,   0,   1,  85,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0, 139,   0, \n      0,  15, 242,   0,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,  27,   0,   0,   0, \n     27,   0,   0,   0,  31,   0, \n      0,   0,  28,   0,   0,   0, \n      2,  64,   0,   0,   4,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      4,   0,   0,   0, 140,   0, \n      0,  20,  50,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 230,  10,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  26,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0, 139,   0, \n      0,   9,  18,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,  29,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  30,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n    139,   0,   0,  15,  50,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  27,   0, \n      0,   0,  24,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  21,   0, \n      0,   1,  38,   0,   0,   8, \n      0, 208,   0,   0,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     32,   0,   0,  10, 226,   0, \n     16,   0,   0,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   2,   0,   0,   0, \n      3,   0,   0,   0,  60,   0, \n      0,   7,  98,   0,  16,   0, \n      0,   0,   0,   0, 166,  11, \n     16,   0,   0,   0,   0,   0, \n     86,   6,  16,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  21,   0,   0,   1, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n    255, 255,   0,   0, 255, 255, \n      0,   0, 255, 255,   0,   0, \n    255, 255,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n    128,   0, 128,  55, 128,   0, \n    128,  55, 128,   0, 128,  55, \n    128,   0, 128,  55,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0, 128,   0, \n    128,  55, 128,   0, 128,  55, \n    128,   0, 128,  55, 128,   0, \n    128,  55, 130,   0,   0,   5, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0, 130,   0, \n      0,   5, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,  12, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  30,   0,   0,   7, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n     30,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,  85,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     21,   0,   0,   1,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0, 255, 255, \n      0,   0, 255, 255,   0,   0, \n    255, 255,   0,   0, 255, 255, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0, 128,   0, \n    128,  55, 128,   0, 128,  55, \n    128,   0, 128,  55, 128,   0, \n    128,  55,  85,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0, 128,   0, 128,  55, \n    128,   0, 128,  55, 128,   0, \n    128,  55, 128,   0, 128,  55, \n    130,   0,   0,   5, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0, 130,   0,   0,   5, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  35,   0, \n      0,  12, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,  70,  14,  16,   0, \n      3,   0,   0,   0, 166,   0, \n      0,   8, 242, 224,  33,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     62,   0,   0,   1,  83,  84, \n     65,  84, 148,   0,   0,   0, \n    111,   0,   0,   0,   5,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   4,   0, \n      0,   0,  32,   0,   0,   0, \n     25,   0,   0,   0,   3,   0, \n      0,   0,   6,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_rgba16_snorm_float_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 5\ndcl_thread_group 4, 32, 1\nand r0.xy, CB0[0][0].xxxx, l(1, 2, 0, 0)\nishl r1.x, vThreadID.x, l(2)\nmov r1.y, vThreadID.y\nuge r0.zw, r1.xxxy, CB0[0][1].xxxy\nor r0.z, r0.w, r0.z\nif_nz r0.z\n  ret \nendif \nubfe r0.z, l(2), l(2), CB0[0][0].x\nishl r0.w, r1.x, l(3)\nimad r1.y, vThreadID.z, CB0[0][1].y, vThreadID.y\nimad r0.w, r1.y, CB0[0][2].x, r0.w\niadd r0.w, r0.w, CB0[0][1].w\nif_z r0.x\n  imad r1.y, CB0[0][0].w, vThreadID.z, vThreadID.y\n  imad r1.y, CB0[0][0].z, r1.y, r1.x\n  ishl r1.y, r1.y, l(3)\nelse \n  if_nz r0.y\n    ushr r1.zw, CB0[0][0].zzzw, l(0, 0, 5, 4)\n    ishr r2.xyzw, vThreadID.zyyy, l(2, 4, 1, 3)\n    imad r0.y, r2.x, r1.w, r2.y\n    ibfe r1.w, l(27), l(3), vThreadID.x\n    imad r0.y, r0.y, r1.z, r1.w\n    bfi r1.zw, l(0, 0, 2, 1), l(0, 0, 5, 4), vThreadID.zzzy, l(0, 0, 0, 0)\n    bfi r2.y, l(2), l(3), r2.z, l(0)\n    iadd r1.z, r1.z, r2.y\n    bfi r1.z, l(3), l(0), r1.x, r1.z\n    bfi r0.y, l(25), l(7), r0.y, r1.z\n    xor r1.z, r2.x, r2.w\n    ubfe r2.x, l(2), l(3), r1.x\n    bfi r2.yz, l(0, 1, 1, 0), l(0, 1, 11, 0), r1.zzzz, l(0, 0, 0, 0)\n    xor r1.z, r2.y, r2.x\n    imad r1.z, r1.z, l(64), r1.w\n    iadd r1.z, r2.z, r1.z\n    ibfe r2.xy, l(27, 24, 0, 0), l(2, 5, 0, 0), r0.yyyy\n    bfi r0.y, l(3), l(8), r2.x, r1.z\n    bfi r1.y, l(20), l(12), r2.y, r0.y\n  else \n    ushr r0.y, CB0[0][0].z, l(5)\n    ishr r2.xyzw, vThreadID.yyyy, l(5, 1, 4, 3)\n    ibfe r1.z, l(27), l(3), vThreadID.x\n    imad r0.y, r2.x, r0.y, r1.z\n    bfi r2.xyz, l(3, 1, 1, 0), l(3, 1, 11, 0), r2.ywzy, l(0, 0, 0, 0)\n    bfi r1.z, l(3), l(0), r1.x, r2.x\n    bfi r0.y, l(26), l(6), r0.y, r1.z\n    ubfe r1.x, l(2), l(3), r1.x\n    xor r1.x, r2.y, r1.x\n    bfi r1.z, l(1), l(4), vThreadID.y, l(0)\n    imad r1.x, r1.x, l(64), r1.z\n    iadd r1.x, r2.z, r1.x\n    ibfe r1.zw, l(0, 0, 27, 24), l(0, 0, 2, 5), r0.yyyy\n    bfi r0.y, l(3), l(8), r1.z, r1.x\n    bfi r1.y, l(20), l(12), r1.w, r0.y\n  endif \nendif \niadd r0.y, r1.y, CB0[0][0].y\nld_raw r1.xyzw, r0.y, T0[0].xyzw\nieq r2.xyz, r0.zzzz, l(1, 2, 3, 0)\nor r2.xy, r2.yzyy, r2.xyxx\nif_nz r2.x\n  ishl r3.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r1.xyzw, r3.xyzw, r4.xyzw\nendif \nif_nz r2.y\n  ushr r3.xyzw, r1.xyzw, l(16, 16, 16, 16)\n  bfi r1.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r1.xyzw, r3.xyzw\nendif \nibfe r3.xyzw, l(16, 16, 16, 16), l(0, 0, 0, 0), r1.xyzw\nitof r3.xyzw, r3.xyzw\nmul r3.xyzw, r3.xyzw, l(0.000031, 0.000031, 0.000031, 0.000031)\nmax r3.xyzw, r3.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\nishr r1.xyzw, r1.xyzw, l(16, 16, 16, 16)\nitof r1.xyzw, r1.xyzw\nmul r1.xyzw, r1.xyzw, l(0.000031, 0.000031, 0.000031, 0.000031)\nmax r1.xyzw, r1.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\nf32tof16 r3.xyzw, r3.xyzw\nf32tof16 r1.xyzw, r1.xyzw\nimad r1.xyzw, r1.xyzw, l(0x00010000, 0x00010000, 0x00010000, 0x00010000), r3.xyzw\nstore_raw U0[0].xyzw, r0.w, r1.xyzw\niadd r0.z, r0.w, l(16)\nif_nz r0.x\n  mov r0.x, l(32)\nelse \n  mov r0.x, l(16)\nendif \niadd r0.x, r0.x, r0.y\nld_raw r1.xyzw, r0.x, T0[0].xyzw\nif_nz r2.x\n  ishl r3.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r1.xyzw, r3.xyzw, r4.xyzw\nendif \nif_nz r2.y\n  ushr r2.xyzw, r1.xyzw, l(16, 16, 16, 16)\n  bfi r1.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r1.xyzw, r2.xyzw\nendif \nibfe r2.xyzw, l(16, 16, 16, 16), l(0, 0, 0, 0), r1.xyzw\nitof r2.xyzw, r2.xyzw\nmul r2.xyzw, r2.xyzw, l(0.000031, 0.000031, 0.000031, 0.000031)\nmax r2.xyzw, r2.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\nishr r1.xyzw, r1.xyzw, l(16, 16, 16, 16)\nitof r1.xyzw, r1.xyzw\nmul r1.xyzw, r1.xyzw, l(0.000031, 0.000031, 0.000031, 0.000031)\nmax r1.xyzw, r1.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\nf32tof16 r2.xyzw, r2.xyzw\nf32tof16 r1.xyzw, r1.xyzw\nimad r1.xyzw, r1.xyzw, l(0x00010000, 0x00010000, 0x00010000, 0x00010000), r2.xyzw\nstore_raw U0[0].xyzw, r0.z, r1.xyzw\nret \n// Approximately 115 instruction slots used\n#endif\n\nconst BYTE texture_load_rgba16_snorm_float_cs[] =\n{\n     68,  88,  66,  67, 196, 122, \n    177, 250, 114, 116,  21,  61, \n    239,  61,  57,  94, 239, 179, \n    202,  46,   1,   0,   0,   0, \n    220,  19,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n     64,  19,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n      4,  15,   0,   0,  81,   0, \n      5,   0, 193,   3,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   5,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  12,  50,   0,  16,   0, \n      0,   0,   0,   0,   6, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n    194,   0,  16,   0,   0,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0,   6, 132, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  11, \n     66,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,   2,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,  11, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  31,   0, \n      0,   3,  10,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  58, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  42,   0,   2,   0, \n     26,   0,   2,   0,  35,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     41,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  18,   0, \n      0,   1,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,  12, \n    194,   0,  16,   0,   1,   0, \n      0,   0, 166, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0,  42,   0,   0,   9, \n    242,   0,  16,   0,   2,   0, \n      0,   0, 102,   5,   2,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      1,   0,   0,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 139,   0,   0,   8, \n    130,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     27,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     10,   0,   2,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  19, 194,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0, 166,   6,   2,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 140,   0,   0,  11, \n     66,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  25,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     87,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0, 138,   0, \n      0,   9,  18,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  20,  98,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0, 166,  10,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  64,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0, 139,   0,   0,  15, \n     50,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     27,   0,   0,   0,  24,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     18,   0,   0,   1,  85,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  42,   0, \n      0,   9, 242,   0,  16,   0, \n      2,   0,   0,   0,  86,   5, \n      2,   0,   2,  64,   0,   0, \n      5,   0,   0,   0,   1,   0, \n      0,   0,   4,   0,   0,   0, \n      3,   0,   0,   0, 139,   0, \n      0,   8,  66,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  27,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  10,   0,   2,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  20, 114,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0, 214,   6, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     66,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  26,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    138,   0,   0,   9,  18,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     87,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  10,  66,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  26,   0,   2,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  64,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    139,   0,   0,  15, 194,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     27,   0,   0,   0,  24,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      5,   0,   0,   0,  86,   5, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  21,   0,   0,   1, \n     30,   0,   0,   9,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  26, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  32,   0,   0,  10, \n    114,   0,  16,   0,   2,   0, \n      0,   0, 166,  10,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      2,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,   2,   0,   0,   0, \n    150,   5,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,  31,   0, \n      4,   3,  10,   0,  16,   0, \n      2,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      2,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  21,   0, \n      0,   1, 139,   0,   0,  15, \n    242,   0,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n      0,  56,   0,   1,   0,  56, \n      0,   1,   0,  56,   0,   1, \n      0,  56,  52,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n     42,   0,   0,  10, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1,   0,  56,   0,   1, \n      0,  56,   0,   1,   0,  56, \n      0,   1,   0,  56,  52,   0, \n      0,  10, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191, 130,   0,   0,   5, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0, 130,   0, \n      0,   5, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     35,   0,   0,  12, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  32,   0, \n      0,   0,  18,   0,   0,   1, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0,  21,   0,   0,   1, \n     30,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,  85,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     21,   0,   0,   1, 139,   0, \n      0,  15, 242,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1,   0,  56,   0,   1, \n      0,  56,   0,   1,   0,  56, \n      0,   1,   0,  56,  52,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,  42,   0,   0,  10, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   1,   0,  56, \n      0,   1,   0,  56,   0,   1, \n      0,  56,   0,   1,   0,  56, \n     52,   0,   0,  10, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191, 130,   0, \n      0,   5, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n    130,   0,   0,   5, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  35,   0,   0,  12, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  62,   0, \n      0,   1,  83,  84,  65,  84, \n    148,   0,   0,   0, 115,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   8,   0,   0,   0, \n     30,   0,   0,   0,  17,   0, \n      0,   0,   5,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_rgba16_snorm_float_scaled_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 5\ndcl_thread_group 4, 32, 1\nand r0.x, CB0[0][0].x, l(2)\nishl r1.x, vThreadID.x, l(2)\nmov r1.y, vThreadID.y\nuge r0.yz, r1.xxyx, CB0[0][1].xxyx\nor r0.y, r0.z, r0.y\nif_nz r0.y\n  ret \nendif \nubfe r0.yzw, l(0, 2, 3, 3), l(0, 2, 4, 7), CB0[0][0].xxxx\nishl r1.z, r1.x, l(3)\nimad r1.w, vThreadID.z, CB0[0][1].y, vThreadID.y\nimad r1.z, r1.w, CB0[0][2].x, r1.z\niadd r1.z, r1.z, CB0[0][1].w\nushr r1.xy, r1.xyxx, l(2, 1, 0, 0)\nudiv r2.xy, null, r1.xyxx, r0.zwzz\nimad r1.xy, -r0.zwzz, r2.xyxx, r1.xyxx\nishl r1.w, r2.x, l(2)\nimad r1.x, r1.x, r0.w, r1.y\nbfi r1.y, l(1), l(5), vThreadID.y, l(0)\nbfi r1.x, l(26), l(6), r1.x, r1.y\nif_nz r0.x\n  ushr r2.zw, CB0[0][0].zzzw, l(0, 0, 5, 4)\n  ishr r0.x, vThreadID.z, l(2)\n  ibfe r3.xyzw, l(28, 27, 31, 29), l(3, 3, 0, 2), r2.yxyy\n  imad r1.y, r0.x, r2.w, r3.x\n  imad r1.y, r1.y, r2.z, r3.y\n  bfi r2.z, l(2), l(5), vThreadID.z, l(0)\n  bfi r2.w, l(2), l(3), r3.z, l(0)\n  iadd r2.z, r2.z, r2.w\n  bfi r2.z, l(3), l(0), r1.w, r2.z\n  bfi r1.y, l(25), l(7), r1.y, r2.z\n  xor r0.x, r0.x, r3.w\n  ibfe r2.z, l(29), l(1), r2.x\n  and r2.z, r2.z, l(3)\n  bfi r3.xy, l(1, 1, 0, 0), l(1, 11, 0, 0), r0.xxxx, l(0, 0, 0, 0)\n  xor r0.x, r2.z, r3.x\n  ishl r0.x, r0.x, l(6)\n  iadd r0.x, r3.y, r0.x\n  ibfe r2.zw, l(0, 0, 27, 24), l(0, 0, 2, 5), r1.yyyy\n  bfi r0.x, l(3), l(8), r2.z, r0.x\n  bfi r0.x, l(20), l(12), r2.w, r0.x\nelse \n  ushr r1.y, CB0[0][0].z, l(5)\n  ibfe r3.xyzw, l(27, 27, 31, 28), l(4, 3, 0, 3), r2.yxyy\n  imad r1.y, r3.x, r1.y, r3.y\n  bfi r2.zw, l(0, 0, 3, 1), l(0, 0, 3, 11), r3.zzzw, l(0, 0, 0, 0)\n  bfi r1.w, l(3), l(0), r1.w, r2.z\n  bfi r1.y, l(26), l(6), r1.y, r1.w\n  ibfe r2.xy, l(29, 29, 0, 0), l(1, 2, 0, 0), r2.xyxx\n  and r1.w, r2.x, l(3)\n  bfi r2.x, l(1), l(1), r2.y, l(0)\n  xor r1.w, r1.w, r2.x\n  ishl r1.w, r1.w, l(6)\n  iadd r1.w, r2.w, r1.w\n  ibfe r2.xy, l(27, 24, 0, 0), l(2, 5, 0, 0), r1.yyyy\n  bfi r1.y, l(3), l(8), r2.x, r1.w\n  bfi r0.x, l(20), l(12), r2.y, r1.y\nendif \nimul null, r0.z, r0.w, r0.z\nimad r0.x, r0.x, r0.z, r1.x\niadd r0.x, r0.x, CB0[0][0].y\nld_raw r2.xyzw, r0.x, T0[0].xyzw\nieq r0.yzw, r0.yyyy, l(0, 1, 2, 3)\nor r0.yz, r0.zzwz, r0.yyzy\nif_nz r0.y\n  ishl r3.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r2.xyzw, r3.xyzw, r4.xyzw\nendif \nif_nz r0.z\n  ushr r3.xyzw, r2.xyzw, l(16, 16, 16, 16)\n  bfi r2.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r2.xyzw, r3.xyzw\nendif \nibfe r3.xyzw, l(16, 16, 16, 16), l(0, 0, 0, 0), r2.xyzw\nitof r3.xyzw, r3.xyzw\nmul r3.xyzw, r3.xyzw, l(0.000031, 0.000031, 0.000031, 0.000031)\nmax r3.xyzw, r3.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\nishr r2.xyzw, r2.xyzw, l(16, 16, 16, 16)\nitof r2.xyzw, r2.xyzw\nmul r2.xyzw, r2.xyzw, l(0.000031, 0.000031, 0.000031, 0.000031)\nmax r2.xyzw, r2.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\nf32tof16 r3.xyzw, r3.xyzw\nf32tof16 r2.xyzw, r2.xyzw\nimad r2.xyzw, r2.xyzw, l(0x00010000, 0x00010000, 0x00010000, 0x00010000), r3.xyzw\nstore_raw U0[0].xyzw, r1.z, r2.xyzw\niadd r0.w, r1.z, l(16)\niadd r0.x, r0.x, l(16)\nld_raw r2.xyzw, r0.x, T0[0].xyzw\nif_nz r0.y\n  ishl r3.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r2.xyzw, r3.xyzw, r4.xyzw\nendif \nif_nz r0.z\n  ushr r3.xyzw, r2.xyzw, l(16, 16, 16, 16)\n  bfi r2.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r2.xyzw, r3.xyzw\nendif \nibfe r3.xyzw, l(16, 16, 16, 16), l(0, 0, 0, 0), r2.xyzw\nitof r3.xyzw, r3.xyzw\nmul r3.xyzw, r3.xyzw, l(0.000031, 0.000031, 0.000031, 0.000031)\nmax r3.xyzw, r3.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\nishr r2.xyzw, r2.xyzw, l(16, 16, 16, 16)\nitof r2.xyzw, r2.xyzw\nmul r2.xyzw, r2.xyzw, l(0.000031, 0.000031, 0.000031, 0.000031)\nmax r2.xyzw, r2.xyzw, l(-1.000000, -1.000000, -1.000000, -1.000000)\nf32tof16 r3.xyzw, r3.xyzw\nf32tof16 r2.xyzw, r2.xyzw\nimad r2.xyzw, r2.xyzw, l(0x00010000, 0x00010000, 0x00010000, 0x00010000), r3.xyzw\nstore_raw U0[0].xyzw, r0.w, r2.xyzw\nret \n// Approximately 114 instruction slots used\n#endif\n\nconst BYTE texture_load_rgba16_snorm_float_scaled_cs[] =\n{\n     68,  88,  66,  67, 184, 209, \n    227,  49, 193,  16, 206, 121, \n    152,  71,  94, 201,  28, 125, \n    140, 136,   1,   0,   0,   0, \n    156,  20,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n      0,  20,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n    196,  15,   0,   0,  81,   0, \n      5,   0, 241,   3,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   5,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n     98,   0,  16,   0,   0,   0, \n      0,   0,   6,   1,  16,   0, \n      1,   0,   0,   0,   6, 129, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  17, \n    226,   0,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   7,   0,   0,   0, \n      6, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,   2,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,  11, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   9,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  78,   0,   0,   8, \n     50,   0,  16,   0,   2,   0, \n      0,   0,   0, 208,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0, 230,  10,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,  10,  50,   0,  16,   0, \n      1,   0,   0,   0, 230,  10, \n     16, 128,  65,   0,   0,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  41,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  10,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  26,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  26,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     85,   0,   0,  12, 194,   0, \n     16,   0,   2,   0,   0,   0, \n    166, 142,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   5,   0, \n      0,   0,   4,   0,   0,   0, \n     42,   0,   0,   6,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,   2,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n    139,   0,   0,  15, 242,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,  28,   0, \n      0,   0,  27,   0,   0,   0, \n     31,   0,   0,   0,  29,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,  22,   5, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   3,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n    140,   0,   0,  10,  66,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  42,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11, 130,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  11,  66,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  25,   0, \n      0,   0,   1,  64,   0,   0, \n      7,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  87,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n    139,   0,   0,   9,  66,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,  29,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n      1,   0,   0,   7,  66,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0, 140,   0, \n      0,  20,  50,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   6,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      3,   0,   0,   0,  41,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n    139,   0,   0,  15, 194,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     27,   0,   0,   0,  24,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      5,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  18,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  18,   0, \n      0,   1,  85,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  42, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0, 139,   0,   0,  15, \n    242,   0,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n     27,   0,   0,   0,  27,   0, \n      0,   0,  31,   0,   0,   0, \n     28,   0,   0,   0,   2,  64, \n      0,   0,   4,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n     22,   5,  16,   0,   2,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0, 140,   0,   0,  20, \n    194,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,  11,   0,   0,   0, \n    166,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11, 130,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  26,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0, 139,   0,   0,  15, \n     50,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     29,   0,   0,   0,  29,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   2,   0, \n      0,   0,   1,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n    140,   0,   0,  11,  18,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     41,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  30,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0, 139,   0,   0,  15, \n     50,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     27,   0,   0,   0,  24,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     21,   0,   0,   1,  38,   0, \n      0,   8,   0, 208,   0,   0, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  26, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  32,   0,   0,  10, \n    226,   0,  16,   0,   0,   0, \n      0,   0,  86,   5,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   7,  98,   0, \n     16,   0,   0,   0,   0,   0, \n    166,  11,  16,   0,   0,   0, \n      0,   0,  86,   6,  16,   0, \n      0,   0,   0,   0,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  21,   0, \n      0,   1, 139,   0,   0,  15, \n    242,   0,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  43,   0,   0,   5, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   1, \n      0,  56,   0,   1,   0,  56, \n      0,   1,   0,  56,   0,   1, \n      0,  56,  52,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n     42,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1,   0,  56,   0,   1, \n      0,  56,   0,   1,   0,  56, \n      0,   1,   0,  56,  52,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191, 130,   0,   0,   5, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0, 130,   0, \n      0,   5, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,  12, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  30,   0,   0,   7, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n     30,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0, 165,   0, \n      0,   8, 242,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     41,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,  85,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0,  30,   0, \n      0,   7, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   4,   0, \n      0,   0,  21,   0,   0,   1, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0, 140,   0, \n      0,  17, 242,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     21,   0,   0,   1, 139,   0, \n      0,  15, 242,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  43,   0, \n      0,   5, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   1,   0,  56,   0,   1, \n      0,  56,   0,   1,   0,  56, \n      0,   1,   0,  56,  52,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128, 191,  42,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     43,   0,   0,   5, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   1,   0,  56, \n      0,   1,   0,  56,   0,   1, \n      0,  56,   0,   1,   0,  56, \n     52,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128, 191,   0,   0, 128, 191, \n      0,   0, 128, 191, 130,   0, \n      0,   5, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n    130,   0,   0,   5, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  35,   0,   0,  12, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  62,   0, \n      0,   1,  83,  84,  65,  84, \n    148,   0,   0,   0, 114,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   8,   0,   0,   0, \n     31,   0,   0,   0,  21,   0, \n      0,   0,   3,   0,   0,   0, \n      6,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   4,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_rgba16_unorm_float_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 5\ndcl_thread_group 4, 32, 1\nand r0.xy, CB0[0][0].xxxx, l(1, 2, 0, 0)\nishl r1.x, vThreadID.x, l(2)\nmov r1.y, vThreadID.y\nuge r0.zw, r1.xxxy, CB0[0][1].xxxy\nor r0.z, r0.w, r0.z\nif_nz r0.z\n  ret \nendif \nubfe r0.z, l(2), l(2), CB0[0][0].x\nishl r0.w, r1.x, l(3)\nimad r1.y, vThreadID.z, CB0[0][1].y, vThreadID.y\nimad r0.w, r1.y, CB0[0][2].x, r0.w\niadd r0.w, r0.w, CB0[0][1].w\nif_z r0.x\n  imad r1.y, CB0[0][0].w, vThreadID.z, vThreadID.y\n  imad r1.y, CB0[0][0].z, r1.y, r1.x\n  ishl r1.y, r1.y, l(3)\nelse \n  if_nz r0.y\n    ushr r1.zw, CB0[0][0].zzzw, l(0, 0, 5, 4)\n    ishr r2.xyzw, vThreadID.zyyy, l(2, 4, 1, 3)\n    imad r0.y, r2.x, r1.w, r2.y\n    ibfe r1.w, l(27), l(3), vThreadID.x\n    imad r0.y, r0.y, r1.z, r1.w\n    bfi r1.zw, l(0, 0, 2, 1), l(0, 0, 5, 4), vThreadID.zzzy, l(0, 0, 0, 0)\n    bfi r2.y, l(2), l(3), r2.z, l(0)\n    iadd r1.z, r1.z, r2.y\n    bfi r1.z, l(3), l(0), r1.x, r1.z\n    bfi r0.y, l(25), l(7), r0.y, r1.z\n    xor r1.z, r2.x, r2.w\n    ubfe r2.x, l(2), l(3), r1.x\n    bfi r2.yz, l(0, 1, 1, 0), l(0, 1, 11, 0), r1.zzzz, l(0, 0, 0, 0)\n    xor r1.z, r2.y, r2.x\n    imad r1.z, r1.z, l(64), r1.w\n    iadd r1.z, r2.z, r1.z\n    ibfe r2.xy, l(27, 24, 0, 0), l(2, 5, 0, 0), r0.yyyy\n    bfi r0.y, l(3), l(8), r2.x, r1.z\n    bfi r1.y, l(20), l(12), r2.y, r0.y\n  else \n    ushr r0.y, CB0[0][0].z, l(5)\n    ishr r2.xyzw, vThreadID.yyyy, l(5, 1, 4, 3)\n    ibfe r1.z, l(27), l(3), vThreadID.x\n    imad r0.y, r2.x, r0.y, r1.z\n    bfi r2.xyz, l(3, 1, 1, 0), l(3, 1, 11, 0), r2.ywzy, l(0, 0, 0, 0)\n    bfi r1.z, l(3), l(0), r1.x, r2.x\n    bfi r0.y, l(26), l(6), r0.y, r1.z\n    ubfe r1.x, l(2), l(3), r1.x\n    xor r1.x, r2.y, r1.x\n    bfi r1.z, l(1), l(4), vThreadID.y, l(0)\n    imad r1.x, r1.x, l(64), r1.z\n    iadd r1.x, r2.z, r1.x\n    ibfe r1.zw, l(0, 0, 27, 24), l(0, 0, 2, 5), r0.yyyy\n    bfi r0.y, l(3), l(8), r1.z, r1.x\n    bfi r1.y, l(20), l(12), r1.w, r0.y\n  endif \nendif \niadd r0.y, r1.y, CB0[0][0].y\nld_raw r1.xyzw, r0.y, T0[0].xyzw\nieq r2.xyz, r0.zzzz, l(1, 2, 3, 0)\nor r2.xy, r2.yzyy, r2.xyxx\nif_nz r2.x\n  ishl r3.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r1.xyzw, r3.xyzw, r4.xyzw\nendif \nif_nz r2.y\n  ushr r3.xyzw, r1.xyzw, l(16, 16, 16, 16)\n  bfi r1.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r1.xyzw, r3.xyzw\nendif \nand r3.xyzw, r1.xyzw, l(0x0000ffff, 0x0000ffff, 0x0000ffff, 0x0000ffff)\nutof r3.xyzw, r3.xyzw\nmul r3.xyzw, r3.xyzw, l(0.000015, 0.000015, 0.000015, 0.000015)\nushr r1.xyzw, r1.xyzw, l(16, 16, 16, 16)\nutof r1.xyzw, r1.xyzw\nmul r1.xyzw, r1.xyzw, l(0.000015, 0.000015, 0.000015, 0.000015)\nf32tof16 r3.xyzw, r3.xyzw\nf32tof16 r1.xyzw, r1.xyzw\nimad r1.xyzw, r1.xyzw, l(0x00010000, 0x00010000, 0x00010000, 0x00010000), r3.xyzw\nstore_raw U0[0].xyzw, r0.w, r1.xyzw\niadd r0.z, r0.w, l(16)\nif_nz r0.x\n  mov r0.x, l(32)\nelse \n  mov r0.x, l(16)\nendif \niadd r0.x, r0.x, r0.y\nld_raw r1.xyzw, r0.x, T0[0].xyzw\nif_nz r2.x\n  ishl r3.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r1.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r1.xyzw, r3.xyzw, r4.xyzw\nendif \nif_nz r2.y\n  ushr r2.xyzw, r1.xyzw, l(16, 16, 16, 16)\n  bfi r1.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r1.xyzw, r2.xyzw\nendif \nand r2.xyzw, r1.xyzw, l(0x0000ffff, 0x0000ffff, 0x0000ffff, 0x0000ffff)\nutof r2.xyzw, r2.xyzw\nmul r2.xyzw, r2.xyzw, l(0.000015, 0.000015, 0.000015, 0.000015)\nushr r1.xyzw, r1.xyzw, l(16, 16, 16, 16)\nutof r1.xyzw, r1.xyzw\nmul r1.xyzw, r1.xyzw, l(0.000015, 0.000015, 0.000015, 0.000015)\nf32tof16 r2.xyzw, r2.xyzw\nf32tof16 r1.xyzw, r1.xyzw\nimad r1.xyzw, r1.xyzw, l(0x00010000, 0x00010000, 0x00010000, 0x00010000), r2.xyzw\nstore_raw U0[0].xyzw, r0.z, r1.xyzw\nret \n// Approximately 111 instruction slots used\n#endif\n\nconst BYTE texture_load_rgba16_unorm_float_cs[] =\n{\n     68,  88,  66,  67, 244,  99, \n     99, 227, 197, 215,  52,  22, \n     10,  22, 217, 180, 137, 132, \n    188, 192,   1,   0,   0,   0, \n     20,  19,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n    120,  18,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n     60,  14,   0,   0,  81,   0, \n      5,   0, 143,   3,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   5,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,  12,  50,   0,  16,   0, \n      0,   0,   0,   0,   6, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n    194,   0,  16,   0,   0,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0,   6, 132, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  11, \n     66,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     10, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,   2,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,  11, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  31,   0, \n      0,   3,  10,   0,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      1,   0,   0,   0,  58, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  42,   0,   2,   0, \n     26,   0,   2,   0,  35,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     41,   0,   0,   7,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  18,   0, \n      0,   1,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,  12, \n    194,   0,  16,   0,   1,   0, \n      0,   0, 166, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0,  42,   0,   0,   9, \n    242,   0,  16,   0,   2,   0, \n      0,   0, 102,   5,   2,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   4,   0,   0,   0, \n      1,   0,   0,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 139,   0,   0,   8, \n    130,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     27,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     10,   0,   2,   0,  35,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  19, 194,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0, 166,   6,   2,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0, 140,   0,   0,  11, \n     66,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  25,   0,   0,   0, \n      1,  64,   0,   0,   7,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     87,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0, 138,   0, \n      0,   9,  18,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  20,  98,   0,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   0, 166,  10,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,  35,   0, \n      0,   9,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  64,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0, 139,   0,   0,  15, \n     50,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     27,   0,   0,   0,  24,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     18,   0,   0,   1,  85,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  42, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  42,   0, \n      0,   9, 242,   0,  16,   0, \n      2,   0,   0,   0,  86,   5, \n      2,   0,   2,  64,   0,   0, \n      5,   0,   0,   0,   1,   0, \n      0,   0,   4,   0,   0,   0, \n      3,   0,   0,   0, 139,   0, \n      0,   8,  66,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  27,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  10,   0,   2,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  20, 114,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   3,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0, 214,   6, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     66,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  26,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n    138,   0,   0,   9,  18,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     87,   0,   0,   7,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  10,  66,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  26,   0,   2,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  35,   0,   0,   9, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  64,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n    139,   0,   0,  15, 194,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     27,   0,   0,   0,  24,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      5,   0,   0,   0,  86,   5, \n     16,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  21,   0, \n      0,   1,  21,   0,   0,   1, \n     30,   0,   0,   9,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  26, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  32,   0,   0,  10, \n    114,   0,  16,   0,   2,   0, \n      0,   0, 166,  10,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      2,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n     60,   0,   0,   7,  50,   0, \n     16,   0,   2,   0,   0,   0, \n    150,   5,  16,   0,   2,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,  31,   0, \n      4,   3,  10,   0,  16,   0, \n      2,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      2,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  21,   0, \n      0,   1,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0, 255, 255,   0,   0, \n    255, 255,   0,   0, 255, 255, \n      0,   0, 255, 255,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0, 128,   0, 128,  55, \n    128,   0, 128,  55, 128,   0, \n    128,  55, 128,   0, 128,  55, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n    128,   0, 128,  55, 128,   0, \n    128,  55, 128,   0, 128,  55, \n    128,   0, 128,  55, 130,   0, \n      0,   5, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n    130,   0,   0,   5, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  35,   0,   0,  12, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     32,   0,   0,   0,  18,   0, \n      0,   1,  54,   0,   0,   5, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     16,   0,   0,   0,  21,   0, \n      0,   1,  30,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  21,   0,   0,   1, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n    255, 255,   0,   0, 255, 255, \n      0,   0, 255, 255,   0,   0, \n    255, 255,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n    128,   0, 128,  55, 128,   0, \n    128,  55, 128,   0, 128,  55, \n    128,   0, 128,  55,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0, 128,   0, \n    128,  55, 128,   0, 128,  55, \n    128,   0, 128,  55, 128,   0, \n    128,  55, 130,   0,   0,   5, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0, 130,   0, \n      0,   5, 242,   0,  16,   0, \n      1,   0,   0,   0,  70,  14, \n     16,   0,   1,   0,   0,   0, \n     35,   0,   0,  12, 242,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  62,   0,   0,   1, \n     83,  84,  65,  84, 148,   0, \n      0,   0, 111,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      4,   0,   0,   0,  28,   0, \n      0,   0,  21,   0,   0,   0, \n      5,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/d3d12_5_1/texture_load_rgba16_unorm_float_scaled_cs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   uint xe_texture_load_is_tiled_3d_endian_scale;// Offset:    0 Size:     4\n//   uint xe_texture_load_guest_offset; // Offset:    4 Size:     4\n//   uint xe_texture_load_guest_pitch_aligned;// Offset:    8 Size:     4\n//   uint xe_texture_load_guest_z_stride_block_rows_aligned;// Offset:   12 Size:     4\n//   uint3 xe_texture_load_size_blocks; // Offset:   16 Size:    12\n//   uint xe_texture_load_host_offset;  // Offset:   28 Size:     4\n//   uint xe_texture_load_host_pitch;   // Offset:   32 Size:     4\n//   uint xe_texture_load_height_texels;// Offset:   36 Size:     4 [unused]\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_texture_load_source            texture    byte         r/o      T0             t0      1 \n// xe_texture_load_dest                  UAV    byte         r/w      U0             u0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Input\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// no Output\ncs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][3], immediateIndexed, space=0\ndcl_resource_raw T0[0:0], space=0\ndcl_uav_raw U0[0:0], space=0\ndcl_input vThreadID.xyz\ndcl_temps 5\ndcl_thread_group 4, 32, 1\nand r0.x, CB0[0][0].x, l(2)\nishl r1.x, vThreadID.x, l(2)\nmov r1.y, vThreadID.y\nuge r0.yz, r1.xxyx, CB0[0][1].xxyx\nor r0.y, r0.z, r0.y\nif_nz r0.y\n  ret \nendif \nubfe r0.yzw, l(0, 2, 3, 3), l(0, 2, 4, 7), CB0[0][0].xxxx\nishl r1.z, r1.x, l(3)\nimad r1.w, vThreadID.z, CB0[0][1].y, vThreadID.y\nimad r1.z, r1.w, CB0[0][2].x, r1.z\niadd r1.z, r1.z, CB0[0][1].w\nushr r1.xy, r1.xyxx, l(2, 1, 0, 0)\nudiv r2.xy, null, r1.xyxx, r0.zwzz\nimad r1.xy, -r0.zwzz, r2.xyxx, r1.xyxx\nishl r1.w, r2.x, l(2)\nimad r1.x, r1.x, r0.w, r1.y\nbfi r1.y, l(1), l(5), vThreadID.y, l(0)\nbfi r1.x, l(26), l(6), r1.x, r1.y\nif_nz r0.x\n  ushr r2.zw, CB0[0][0].zzzw, l(0, 0, 5, 4)\n  ishr r0.x, vThreadID.z, l(2)\n  ibfe r3.xyzw, l(28, 27, 31, 29), l(3, 3, 0, 2), r2.yxyy\n  imad r1.y, r0.x, r2.w, r3.x\n  imad r1.y, r1.y, r2.z, r3.y\n  bfi r2.z, l(2), l(5), vThreadID.z, l(0)\n  bfi r2.w, l(2), l(3), r3.z, l(0)\n  iadd r2.z, r2.z, r2.w\n  bfi r2.z, l(3), l(0), r1.w, r2.z\n  bfi r1.y, l(25), l(7), r1.y, r2.z\n  xor r0.x, r0.x, r3.w\n  ibfe r2.z, l(29), l(1), r2.x\n  and r2.z, r2.z, l(3)\n  bfi r3.xy, l(1, 1, 0, 0), l(1, 11, 0, 0), r0.xxxx, l(0, 0, 0, 0)\n  xor r0.x, r2.z, r3.x\n  ishl r0.x, r0.x, l(6)\n  iadd r0.x, r3.y, r0.x\n  ibfe r2.zw, l(0, 0, 27, 24), l(0, 0, 2, 5), r1.yyyy\n  bfi r0.x, l(3), l(8), r2.z, r0.x\n  bfi r0.x, l(20), l(12), r2.w, r0.x\nelse \n  ushr r1.y, CB0[0][0].z, l(5)\n  ibfe r3.xyzw, l(27, 27, 31, 28), l(4, 3, 0, 3), r2.yxyy\n  imad r1.y, r3.x, r1.y, r3.y\n  bfi r2.zw, l(0, 0, 3, 1), l(0, 0, 3, 11), r3.zzzw, l(0, 0, 0, 0)\n  bfi r1.w, l(3), l(0), r1.w, r2.z\n  bfi r1.y, l(26), l(6), r1.y, r1.w\n  ibfe r2.xy, l(29, 29, 0, 0), l(1, 2, 0, 0), r2.xyxx\n  and r1.w, r2.x, l(3)\n  bfi r2.x, l(1), l(1), r2.y, l(0)\n  xor r1.w, r1.w, r2.x\n  ishl r1.w, r1.w, l(6)\n  iadd r1.w, r2.w, r1.w\n  ibfe r2.xy, l(27, 24, 0, 0), l(2, 5, 0, 0), r1.yyyy\n  bfi r1.y, l(3), l(8), r2.x, r1.w\n  bfi r0.x, l(20), l(12), r2.y, r1.y\nendif \nimul null, r0.z, r0.w, r0.z\nimad r0.x, r0.x, r0.z, r1.x\niadd r0.x, r0.x, CB0[0][0].y\nld_raw r2.xyzw, r0.x, T0[0].xyzw\nieq r0.yzw, r0.yyyy, l(0, 1, 2, 3)\nor r0.yz, r0.zzwz, r0.yyzy\nif_nz r0.y\n  ishl r3.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r2.xyzw, r3.xyzw, r4.xyzw\nendif \nif_nz r0.z\n  ushr r3.xyzw, r2.xyzw, l(16, 16, 16, 16)\n  bfi r2.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r2.xyzw, r3.xyzw\nendif \nand r3.xyzw, r2.xyzw, l(0x0000ffff, 0x0000ffff, 0x0000ffff, 0x0000ffff)\nutof r3.xyzw, r3.xyzw\nmul r3.xyzw, r3.xyzw, l(0.000015, 0.000015, 0.000015, 0.000015)\nushr r2.xyzw, r2.xyzw, l(16, 16, 16, 16)\nutof r2.xyzw, r2.xyzw\nmul r2.xyzw, r2.xyzw, l(0.000015, 0.000015, 0.000015, 0.000015)\nf32tof16 r3.xyzw, r3.xyzw\nf32tof16 r2.xyzw, r2.xyzw\nimad r2.xyzw, r2.xyzw, l(0x00010000, 0x00010000, 0x00010000, 0x00010000), r3.xyzw\nstore_raw U0[0].xyzw, r1.z, r2.xyzw\niadd r0.w, r1.z, l(16)\niadd r0.x, r0.x, l(16)\nld_raw r2.xyzw, r0.x, T0[0].xyzw\nif_nz r0.y\n  ishl r3.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r3.xyzw, r3.xyzw, l(0xff00ff00, 0xff00ff00, 0xff00ff00, 0xff00ff00)\n  ushr r4.xyzw, r2.xyzw, l(8, 8, 8, 8)\n  and r4.xyzw, r4.xyzw, l(0x00ff00ff, 0x00ff00ff, 0x00ff00ff, 0x00ff00ff)\n  iadd r2.xyzw, r3.xyzw, r4.xyzw\nendif \nif_nz r0.z\n  ushr r3.xyzw, r2.xyzw, l(16, 16, 16, 16)\n  bfi r2.xyzw, l(16, 16, 16, 16), l(16, 16, 16, 16), r2.xyzw, r3.xyzw\nendif \nand r3.xyzw, r2.xyzw, l(0x0000ffff, 0x0000ffff, 0x0000ffff, 0x0000ffff)\nutof r3.xyzw, r3.xyzw\nmul r3.xyzw, r3.xyzw, l(0.000015, 0.000015, 0.000015, 0.000015)\nushr r2.xyzw, r2.xyzw, l(16, 16, 16, 16)\nutof r2.xyzw, r2.xyzw\nmul r2.xyzw, r2.xyzw, l(0.000015, 0.000015, 0.000015, 0.000015)\nf32tof16 r3.xyzw, r3.xyzw\nf32tof16 r2.xyzw, r2.xyzw\nimad r2.xyzw, r2.xyzw, l(0x00010000, 0x00010000, 0x00010000, 0x00010000), r3.xyzw\nstore_raw U0[0].xyzw, r0.w, r2.xyzw\nret \n// Approximately 110 instruction slots used\n#endif\n\nconst BYTE texture_load_rgba16_unorm_float_scaled_cs[] =\n{\n     68,  88,  66,  67, 241, 205, \n    132, 196, 190, 232,  10,  24, \n    231, 118, 170,  86, 221,  99, \n    185, 208,   1,   0,   0,   0, \n    212,  19,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     20,   4,   0,   0,  36,   4, \n      0,   0,  52,   4,   0,   0, \n     56,  19,   0,   0,  82,  68, \n     69,  70, 216,   3,   0,   0, \n      1,   0,   0,   0, 240,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n     83,  67,   0,   5,   0,   0, \n    173,   3,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   7,   0, \n      0,   0,   6,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203,   0, \n      0,   0,   8,   0,   0,   0, \n      6,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 108, \n    111,  97, 100,  95, 115, 111, \n    117, 114,  99, 101,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 100, 101, 115, \n    116,   0, 112, 117, 115, 104, \n     95,  99, 111, 110, 115, 116, \n    115,  95, 120, 101,   0, 171, \n    224,   0,   0,   0,   8,   0, \n      0,   0,   8,   1,   0,   0, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     72,   2,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 156,   2, \n      0,   0,   4,   0,   0,   0, \n      4,   0,   0,   0,   2,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 185,   2,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    221,   2,   0,   0,  12,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  16,   0,   0,   0, \n     12,   0,   0,   0,   2,   0, \n      0,   0,  52,   3,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  88,   3,   0,   0, \n     28,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   2,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    116,   3,   0,   0,  32,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 120,   2, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 143,   3, \n      0,   0,  36,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0, 120,   2,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    105, 115,  95, 116, 105, 108, \n    101, 100,  95,  51, 100,  95, \n    101, 110, 100, 105,  97, 110, \n     95, 115,  99,  97, 108, 101, \n      0, 100, 119, 111, 114, 100, \n      0, 171,   0,   0,  19,   0, \n      1,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 113,   2, \n      0,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    103, 117, 101, 115, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 112, \n    105, 116,  99, 104,  95,  97, \n    108, 105, 103, 110, 101, 100, \n      0, 120, 101,  95, 116, 101, \n    120, 116, 117, 114, 101,  95, \n    108, 111,  97, 100,  95, 103, \n    117, 101, 115, 116,  95, 122, \n     95, 115, 116, 114, 105, 100, \n    101,  95,  98, 108, 111,  99, \n    107,  95, 114, 111, 119, 115, \n     95,  97, 108, 105, 103, 110, \n    101, 100,   0, 120, 101,  95, \n    116, 101, 120, 116, 117, 114, \n    101,  95, 108, 111,  97, 100, \n     95, 115, 105, 122, 101,  95, \n     98, 108, 111,  99, 107, 115, \n      0, 117, 105, 110, 116,  51, \n      0, 171, 171, 171,   1,   0, \n     19,   0,   1,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     43,   3,   0,   0, 120, 101, \n     95, 116, 101, 120, 116, 117, \n    114, 101,  95, 108, 111,  97, \n    100,  95, 104, 111, 115, 116, \n     95, 111, 102, 102, 115, 101, \n    116,   0, 120, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n     95, 108, 111,  97, 100,  95, \n    104, 111, 115, 116,  95, 112, \n    105, 116,  99, 104,   0, 120, \n    101,  95, 116, 101, 120, 116, \n    117, 114, 101,  95, 108, 111, \n     97, 100,  95, 104, 101, 105, \n    103, 104, 116,  95, 116, 101, \n    120, 101, 108, 115,   0,  77, \n    105,  99, 114, 111, 115, 111, \n    102, 116,  32,  40,  82,  41, \n     32,  72,  76,  83,  76,  32, \n     83, 104,  97, 100, 101, 114, \n     32,  67, 111, 109, 112, 105, \n    108, 101, 114,  32,  49,  48, \n     46,  49,   0, 171, 171, 171, \n     73,  83,  71,  78,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,  79,  83, \n     71,  78,   8,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,  83,  72,  69,  88, \n    252,  14,   0,   0,  81,   0, \n      5,   0, 191,   3,   0,   0, \n    106,   8,   0,   1,  89,   0, \n      0,   7,  70, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0, 161,   0,   0,   6, \n     70, 126,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157,   0,   0,   6, \n     70, 238,  49,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  95,   0,   0,   2, \n    114,   0,   2,   0, 104,   0, \n      0,   2,   5,   0,   0,   0, \n    155,   0,   0,   4,   4,   0, \n      0,   0,  32,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  41,   0, \n      0,   6,  18,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n      2,   0,   1,  64,   0,   0, \n      2,   0,   0,   0,  54,   0, \n      0,   4,  34,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  80,   0,   0,   9, \n     98,   0,  16,   0,   0,   0, \n      0,   0,   6,   1,  16,   0, \n      1,   0,   0,   0,   6, 129, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  60,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     31,   0,   4,   3,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     62,   0,   0,   1,  21,   0, \n      0,   1, 138,   0,   0,  17, \n    226,   0,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   3,   0,   0,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   4,   0, \n      0,   0,   7,   0,   0,   0, \n      6, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  41,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  35,   0,   0,   9, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,   2,   0, \n     26, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  26,   0, \n      2,   0,  35,   0,   0,  11, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   9,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     58, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,  85,   0, \n      0,  10,  50,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  78,   0,   0,   8, \n     50,   0,  16,   0,   2,   0, \n      0,   0,   0, 208,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0, 230,  10,  16,   0, \n      0,   0,   0,   0,  35,   0, \n      0,  10,  50,   0,  16,   0, \n      1,   0,   0,   0, 230,  10, \n     16, 128,  65,   0,   0,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  41,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  10,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  26,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,  26,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     31,   0,   4,   3,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     85,   0,   0,  12, 194,   0, \n     16,   0,   2,   0,   0,   0, \n    166, 142,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   5,   0, \n      0,   0,   4,   0,   0,   0, \n     42,   0,   0,   6,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,   2,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n    139,   0,   0,  15, 242,   0, \n     16,   0,   3,   0,   0,   0, \n      2,  64,   0,   0,  28,   0, \n      0,   0,  27,   0,   0,   0, \n     31,   0,   0,   0,  29,   0, \n      0,   0,   2,  64,   0,   0, \n      3,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,  22,   5, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,  10,   0, \n     16,   0,   3,   0,   0,   0, \n     35,   0,   0,   9,  34,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n    140,   0,   0,  10,  66,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      5,   0,   0,   0,  42,   0, \n      2,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11, 130,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0, 140,   0, \n      0,  11,  66,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  25,   0, \n      0,   0,   1,  64,   0,   0, \n      7,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  87,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n    139,   0,   0,   9,  66,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,  29,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n      1,   0,   0,   7,  66,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0, 140,   0, \n      0,  20,  50,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,  11,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   6,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     87,   0,   0,   7,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      3,   0,   0,   0,  41,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   6,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n    139,   0,   0,  15, 194,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     27,   0,   0,   0,  24,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      5,   0,   0,   0,  86,   5, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  18,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n      8,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     20,   0,   0,   0,   1,  64, \n      0,   0,  12,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  18,   0, \n      0,   1,  85,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  42, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   5,   0, \n      0,   0, 139,   0,   0,  15, \n    242,   0,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n     27,   0,   0,   0,  27,   0, \n      0,   0,  31,   0,   0,   0, \n     28,   0,   0,   0,   2,  64, \n      0,   0,   4,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n     22,   5,  16,   0,   2,   0, \n      0,   0,  35,   0,   0,   9, \n     34,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0, 140,   0,   0,  20, \n    194,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,  11,   0,   0,   0, \n    166,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11, 130,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   2,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  26,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0, 139,   0,   0,  15, \n     50,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     29,   0,   0,   0,  29,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   1,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   2,   0, \n      0,   0,   1,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  10,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   3,   0,   0,   0, \n    140,   0,   0,  11,  18,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  87,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   2,   0,   0,   0, \n     41,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      6,   0,   0,   0,  30,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0, 139,   0,   0,  15, \n     50,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     27,   0,   0,   0,  24,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   2,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     86,   5,  16,   0,   1,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      3,   0,   0,   0,   1,  64, \n      0,   0,   8,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  20,   0,   0,   0, \n      1,  64,   0,   0,  12,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     21,   0,   0,   1,  38,   0, \n      0,   8,   0, 208,   0,   0, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     35,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   1,   0,   0,   0, \n     30,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  26, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  32,   0,   0,  10, \n    226,   0,  16,   0,   0,   0, \n      0,   0,  86,   5,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   7,  98,   0, \n     16,   0,   0,   0,   0,   0, \n    166,  11,  16,   0,   0,   0, \n      0,   0,  86,   6,  16,   0, \n      0,   0,   0,   0,  31,   0, \n      4,   3,  26,   0,  16,   0, \n      0,   0,   0,   0,  41,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   4,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   1,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0,  30,   0,   0,   7, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     21,   0,   0,   1,  31,   0, \n      4,   3,  42,   0,  16,   0, \n      0,   0,   0,   0,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0, 140,   0,   0,  17, \n    242,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,  21,   0, \n      0,   1,   1,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0, 255, 255,   0,   0, \n    255, 255,   0,   0, 255, 255, \n      0,   0, 255, 255,   0,   0, \n     86,   0,   0,   5, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  56,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0, 128,   0, 128,  55, \n    128,   0, 128,  55, 128,   0, \n    128,  55, 128,   0, 128,  55, \n     85,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n    128,   0, 128,  55, 128,   0, \n    128,  55, 128,   0, 128,  55, \n    128,   0, 128,  55, 130,   0, \n      0,   5, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n    130,   0,   0,   5, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  35,   0,   0,  12, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0, 166,   0,   0,   8, \n    242, 224,  33,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  30,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,  16,   0, \n      0,   0,  30,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,  16,   0,   0,   0, \n    165,   0,   0,   8, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  31,   0,   4,   3, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  41,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,   0, 255, \n      0, 255,   0, 255,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   1,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,   2,  64, \n      0,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n    255,   0, 255,   0, 255,   0, \n     30,   0,   0,   7, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  21,   0, \n      0,   1,  31,   0,   4,   3, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,  10, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,   2,  64, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n    140,   0,   0,  17, 242,   0, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,   2,  64,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  21,   0,   0,   1, \n      1,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n    255, 255,   0,   0, 255, 255, \n      0,   0, 255, 255,   0,   0, \n    255, 255,   0,   0,  86,   0, \n      0,   5, 242,   0,  16,   0, \n      3,   0,   0,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n     56,   0,   0,  10, 242,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,   2,  64,   0,   0, \n    128,   0, 128,  55, 128,   0, \n    128,  55, 128,   0, 128,  55, \n    128,   0, 128,  55,  85,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,  16,   0, \n      0,   0,  16,   0,   0,   0, \n     16,   0,   0,   0,  16,   0, \n      0,   0,  86,   0,   0,   5, \n    242,   0,  16,   0,   2,   0, \n      0,   0,  70,  14,  16,   0, \n      2,   0,   0,   0,  56,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0, 128,   0, \n    128,  55, 128,   0, 128,  55, \n    128,   0, 128,  55, 128,   0, \n    128,  55, 130,   0,   0,   5, \n    242,   0,  16,   0,   3,   0, \n      0,   0,  70,  14,  16,   0, \n      3,   0,   0,   0, 130,   0, \n      0,   5, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     35,   0,   0,  12, 242,   0, \n     16,   0,   2,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,  70,  14, \n     16,   0,   3,   0,   0,   0, \n    166,   0,   0,   8, 242, 224, \n     33,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     70,  14,  16,   0,   2,   0, \n      0,   0,  62,   0,   0,   1, \n     83,  84,  65,  84, 148,   0, \n      0,   0, 110,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      4,   0,   0,   0,  29,   0, \n      0,   0,  25,   0,   0,   0, \n      3,   0,   0,   0,   6,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/apply_gamma_pwl_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 24005\n; Schema: 0\n               OpCapability Shader\n               OpCapability SampledBuffer\n               OpCapability StorageImageExtendedFormats\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 16 8 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_apply_gamma_size\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %xe_apply_gamma_source \"xe_apply_gamma_source\"\n               OpName %xe_apply_gamma_ramp \"xe_apply_gamma_ramp\"\n               OpName %xe_apply_gamma_dest \"xe_apply_gamma_dest\"\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpDecorate %xe_apply_gamma_source Binding 0\n               OpDecorate %xe_apply_gamma_source DescriptorSet 1\n               OpDecorate %xe_apply_gamma_ramp Binding 0\n               OpDecorate %xe_apply_gamma_ramp DescriptorSet 0\n               OpDecorate %xe_apply_gamma_dest NonReadable\n               OpDecorate %xe_apply_gamma_dest Binding 0\n               OpDecorate %xe_apply_gamma_dest DescriptorSet 2\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n      %float = OpTypeFloat 32\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n    %float_0 = OpConstant %float 0\n    %float_1 = OpConstant %float 1\n     %uint_0 = OpConstant %uint 0\n     %uint_7 = OpConstant %uint 7\n     %uint_1 = OpConstant %uint 1\n%float_0_125 = OpConstant %float 0.125\n%float_1_52737048en05 = OpConstant %float 1.52737048e-05\n     %v3uint = OpTypeVector %uint 3\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n%push_const_block_xe = OpTypeStruct %v2uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n        %int = OpTypeInt 32 1\n      %int_0 = OpConstant %int 0\n%_ptr_PushConstant_v2uint = OpTypePointer PushConstant %v2uint\n       %bool = OpTypeBool\n     %v2bool = OpTypeVector %bool 2\n        %150 = OpTypeImage %float 2D 0 0 0 1 Unknown\n%_ptr_UniformConstant_150 = OpTypePointer UniformConstant %150\n%xe_apply_gamma_source = OpVariable %_ptr_UniformConstant_150 UniformConstant\n      %v2int = OpTypeVector %int 2\n    %v4float = OpTypeVector %float 4\n    %v3float = OpTypeVector %float 3\n %float_1023 = OpConstant %float 1023\n  %float_0_5 = OpConstant %float 0.5\n        %152 = OpTypeImage %uint Buffer 0 0 0 1 Unknown\n%_ptr_UniformConstant_152 = OpTypePointer UniformConstant %152\n%xe_apply_gamma_ramp = OpVariable %_ptr_UniformConstant_152 UniformConstant\n     %uint_3 = OpConstant %uint 3\n     %v4uint = OpTypeVector %uint 4\n     %uint_2 = OpConstant %uint 2\n        %166 = OpTypeImage %float 2D 0 0 0 2 Rgb10A2\n%_ptr_UniformConstant_166 = OpTypePointer UniformConstant %166\n%xe_apply_gamma_dest = OpVariable %_ptr_UniformConstant_166 UniformConstant\n    %uint_16 = OpConstant %uint 16\n     %uint_8 = OpConstant %uint 8\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_16 %uint_8 %uint_1\n        %939 = OpConstantComposite %v3float %float_0_5 %float_0_5 %float_0_5\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %21573 None\n               OpSwitch %uint_0 %12914\n      %12914 = OpLabel\n      %13761 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21717 = OpVectorShuffle %v2uint %13761 %13761 0 1\n       %7760 = OpAccessChain %_ptr_PushConstant_v2uint %push_consts_xe %int_0\n      %13378 = OpLoad %v2uint %7760\n      %23437 = OpUGreaterThanEqual %v2bool %21717 %13378\n      %23076 = OpAny %bool %23437\n               OpSelectionMerge %18302 DontFlatten\n               OpBranchConditional %23076 %21992 %18302\n      %21992 = OpLabel\n               OpBranch %21573\n      %18302 = OpLabel\n      %24004 = OpLoad %150 %xe_apply_gamma_source\n      %10533 = OpBitcast %v2int %21717\n       %6680 = OpImageFetch %v4float %24004 %10533 Lod %int_0\n      %16242 = OpVectorShuffle %v3float %6680 %6680 0 1 2\n      %13907 = OpVectorTimesScalar %v3float %16242 %float_1023\n      %16889 = OpFAdd %v3float %13907 %939\n      %11099 = OpConvertFToU %v3uint %16889\n      %19954 = OpLoad %152 %xe_apply_gamma_ramp\n      %23099 = OpCompositeExtract %uint %11099 0\n      %17722 = OpShiftRightLogical %uint %23099 %uint_3\n      %15968 = OpIMul %uint %17722 %uint_3\n      %18268 = OpBitcast %int %15968\n      %14598 = OpImageFetch %v4uint %19954 %18268\n       %6376 = OpCompositeExtract %uint %14598 0\n      %17705 = OpConvertUToF %float %6376\n      %12314 = OpBitwiseAnd %uint %23099 %uint_7\n      %14345 = OpCompositeExtract %uint %14598 1\n      %16230 = OpIMul %uint %12314 %14345\n      %17759 = OpConvertUToF %float %16230\n      %22854 = OpFMul %float %17759 %float_0_125\n      %11948 = OpFAdd %float %17705 %22854\n       %6845 = OpFMul %float %11948 %float_1_52737048en05\n       %6923 = OpExtInst %float %1 FClamp %6845 %float_0 %float_1\n      %14371 = OpLoad %152 %xe_apply_gamma_ramp\n      %12884 = OpCompositeExtract %uint %11099 1\n      %17798 = OpShiftRightLogical %uint %12884 %uint_3\n      %15827 = OpIMul %uint %17798 %uint_3\n      %18887 = OpIAdd %uint %15827 %uint_1\n      %14460 = OpBitcast %int %18887\n      %17829 = OpImageFetch %v4uint %14371 %14460\n       %6377 = OpCompositeExtract %uint %17829 0\n      %17706 = OpConvertUToF %float %6377\n      %12315 = OpBitwiseAnd %uint %12884 %uint_7\n      %14346 = OpCompositeExtract %uint %17829 1\n      %16231 = OpIMul %uint %12315 %14346\n      %17760 = OpConvertUToF %float %16231\n      %22855 = OpFMul %float %17760 %float_0_125\n      %11949 = OpFAdd %float %17706 %22855\n       %6846 = OpFMul %float %11949 %float_1_52737048en05\n       %6924 = OpExtInst %float %1 FClamp %6846 %float_0 %float_1\n      %14372 = OpLoad %152 %xe_apply_gamma_ramp\n      %12885 = OpCompositeExtract %uint %11099 2\n      %17799 = OpShiftRightLogical %uint %12885 %uint_3\n      %15828 = OpIMul %uint %17799 %uint_3\n      %18888 = OpIAdd %uint %15828 %uint_2\n      %14461 = OpBitcast %int %18888\n      %17830 = OpImageFetch %v4uint %14372 %14461\n       %6378 = OpCompositeExtract %uint %17830 0\n      %17707 = OpConvertUToF %float %6378\n      %12316 = OpBitwiseAnd %uint %12885 %uint_7\n      %14347 = OpCompositeExtract %uint %17830 1\n      %16232 = OpIMul %uint %12316 %14347\n      %17761 = OpConvertUToF %float %16232\n      %22856 = OpFMul %float %17761 %float_0_125\n      %11950 = OpFAdd %float %17707 %22856\n       %7206 = OpFMul %float %11950 %float_1_52737048en05\n      %22327 = OpExtInst %float %1 FClamp %7206 %float_0 %float_1\n       %6470 = OpCompositeConstruct %v4float %6923 %6924 %22327 %float_1\n      %12275 = OpLoad %166 %xe_apply_gamma_dest\n               OpImageWrite %12275 %10533 %6470\n               OpBranch %21573\n      %21573 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t apply_gamma_pwl_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00005DC5, 0x00000000, 0x00020011,\n    0x00000001, 0x00020011, 0x0000002E, 0x00020011, 0x00000031, 0x0006000B,\n    0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E, 0x00000000, 0x0003000E,\n    0x00000000, 0x00000001, 0x0006000F, 0x00000005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00000F48, 0x00060010, 0x0000161F, 0x00000011, 0x00000010,\n    0x00000008, 0x00000001, 0x00030003, 0x00000002, 0x000001CC, 0x00090004,\n    0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F, 0x5F776F6C, 0x72747461,\n    0x74756269, 0x00007365, 0x000B0004, 0x455F4C47, 0x735F5458, 0x6C706D61,\n    0x656C7265, 0x745F7373, 0x75747865, 0x665F6572, 0x74636E75, 0x736E6F69,\n    0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F, 0x70635F45, 0x74735F70,\n    0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365, 0x00006576, 0x00080004,\n    0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63, 0x69645F65, 0x74636572,\n    0x00657669, 0x00040005, 0x0000161F, 0x6E69616D, 0x00000000, 0x00080005,\n    0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F, 0x496E6F69,\n    0x00000044, 0x00070005, 0x000003E1, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x00080006, 0x000003E1, 0x00000000, 0x615F6578,\n    0x796C7070, 0x6D61675F, 0x735F616D, 0x00657A69, 0x00060005, 0x00000CE9,\n    0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578, 0x00080005, 0x0000167F,\n    0x615F6578, 0x796C7070, 0x6D61675F, 0x735F616D, 0x6372756F, 0x00000065,\n    0x00070005, 0x00001739, 0x615F6578, 0x796C7070, 0x6D61675F, 0x725F616D,\n    0x00706D61, 0x00070005, 0x00000CBA, 0x615F6578, 0x796C7070, 0x6D61675F,\n    0x645F616D, 0x00747365, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C,\n    0x00030047, 0x000003E1, 0x00000002, 0x00050048, 0x000003E1, 0x00000000,\n    0x00000023, 0x00000000, 0x00040047, 0x0000167F, 0x00000021, 0x00000000,\n    0x00040047, 0x0000167F, 0x00000022, 0x00000001, 0x00040047, 0x00001739,\n    0x00000021, 0x00000000, 0x00040047, 0x00001739, 0x00000022, 0x00000000,\n    0x00030047, 0x00000CBA, 0x00000019, 0x00040047, 0x00000CBA, 0x00000021,\n    0x00000000, 0x00040047, 0x00000CBA, 0x00000022, 0x00000002, 0x00040047,\n    0x00000B0F, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00030016, 0x0000000D, 0x00000020, 0x00040015,\n    0x0000000B, 0x00000020, 0x00000000, 0x00040017, 0x00000011, 0x0000000B,\n    0x00000002, 0x0004002B, 0x0000000D, 0x00000A0C, 0x00000000, 0x0004002B,\n    0x0000000D, 0x0000008A, 0x3F800000, 0x0004002B, 0x0000000B, 0x00000A0A,\n    0x00000000, 0x0004002B, 0x0000000B, 0x00000A1F, 0x00000007, 0x0004002B,\n    0x0000000B, 0x00000A0D, 0x00000001, 0x0004002B, 0x0000000D, 0x000001E0,\n    0x3E000000, 0x0004002B, 0x0000000D, 0x000009AA, 0x37802008, 0x00040017,\n    0x00000014, 0x0000000B, 0x00000003, 0x00040020, 0x00000291, 0x00000001,\n    0x00000014, 0x0004003B, 0x00000291, 0x00000F48, 0x00000001, 0x0003001E,\n    0x000003E1, 0x00000011, 0x00040020, 0x0000065E, 0x00000009, 0x000003E1,\n    0x0004003B, 0x0000065E, 0x00000CE9, 0x00000009, 0x00040015, 0x0000000C,\n    0x00000020, 0x00000001, 0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000,\n    0x00040020, 0x0000028E, 0x00000009, 0x00000011, 0x00020014, 0x00000009,\n    0x00040017, 0x0000000F, 0x00000009, 0x00000002, 0x00090019, 0x00000096,\n    0x0000000D, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000001,\n    0x00000000, 0x00040020, 0x00000313, 0x00000000, 0x00000096, 0x0004003B,\n    0x00000313, 0x0000167F, 0x00000000, 0x00040017, 0x00000012, 0x0000000C,\n    0x00000002, 0x00040017, 0x0000001D, 0x0000000D, 0x00000004, 0x00040017,\n    0x00000018, 0x0000000D, 0x00000003, 0x0004002B, 0x0000000D, 0x00000409,\n    0x447FC000, 0x0004002B, 0x0000000D, 0x000000FC, 0x3F000000, 0x00090019,\n    0x00000098, 0x0000000B, 0x00000005, 0x00000000, 0x00000000, 0x00000000,\n    0x00000001, 0x00000000, 0x00040020, 0x00000315, 0x00000000, 0x00000098,\n    0x0004003B, 0x00000315, 0x00001739, 0x00000000, 0x0004002B, 0x0000000B,\n    0x00000A13, 0x00000003, 0x00040017, 0x00000017, 0x0000000B, 0x00000004,\n    0x0004002B, 0x0000000B, 0x00000A10, 0x00000002, 0x00090019, 0x000000A6,\n    0x0000000D, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000002,\n    0x0000000B, 0x00040020, 0x00000323, 0x00000000, 0x000000A6, 0x0004003B,\n    0x00000323, 0x00000CBA, 0x00000000, 0x0004002B, 0x0000000B, 0x00000A3A,\n    0x00000010, 0x0004002B, 0x0000000B, 0x00000A22, 0x00000008, 0x0006002C,\n    0x00000014, 0x00000B0F, 0x00000A3A, 0x00000A22, 0x00000A0D, 0x0006002C,\n    0x00000018, 0x000003AB, 0x000000FC, 0x000000FC, 0x000000FC, 0x00050036,\n    0x00000008, 0x0000161F, 0x00000000, 0x00000502, 0x000200F8, 0x00003B06,\n    0x000300F7, 0x00005445, 0x00000000, 0x000300FB, 0x00000A0A, 0x00003272,\n    0x000200F8, 0x00003272, 0x0004003D, 0x00000014, 0x000035C1, 0x00000F48,\n    0x0007004F, 0x00000011, 0x000054D5, 0x000035C1, 0x000035C1, 0x00000000,\n    0x00000001, 0x00050041, 0x0000028E, 0x00001E50, 0x00000CE9, 0x00000A0B,\n    0x0004003D, 0x00000011, 0x00003442, 0x00001E50, 0x000500AE, 0x0000000F,\n    0x00005B8D, 0x000054D5, 0x00003442, 0x0004009A, 0x00000009, 0x00005A24,\n    0x00005B8D, 0x000300F7, 0x0000477E, 0x00000002, 0x000400FA, 0x00005A24,\n    0x000055E8, 0x0000477E, 0x000200F8, 0x000055E8, 0x000200F9, 0x00005445,\n    0x000200F8, 0x0000477E, 0x0004003D, 0x00000096, 0x00005DC4, 0x0000167F,\n    0x0004007C, 0x00000012, 0x00002925, 0x000054D5, 0x0007005F, 0x0000001D,\n    0x00001A18, 0x00005DC4, 0x00002925, 0x00000002, 0x00000A0B, 0x0008004F,\n    0x00000018, 0x00003F72, 0x00001A18, 0x00001A18, 0x00000000, 0x00000001,\n    0x00000002, 0x0005008E, 0x00000018, 0x00003653, 0x00003F72, 0x00000409,\n    0x00050081, 0x00000018, 0x000041F9, 0x00003653, 0x000003AB, 0x0004006D,\n    0x00000014, 0x00002B5B, 0x000041F9, 0x0004003D, 0x00000098, 0x00004DF2,\n    0x00001739, 0x00050051, 0x0000000B, 0x00005A3B, 0x00002B5B, 0x00000000,\n    0x000500C2, 0x0000000B, 0x0000453A, 0x00005A3B, 0x00000A13, 0x00050084,\n    0x0000000B, 0x00003E60, 0x0000453A, 0x00000A13, 0x0004007C, 0x0000000C,\n    0x0000475C, 0x00003E60, 0x0005005F, 0x00000017, 0x00003906, 0x00004DF2,\n    0x0000475C, 0x00050051, 0x0000000B, 0x000018E8, 0x00003906, 0x00000000,\n    0x00040070, 0x0000000D, 0x00004529, 0x000018E8, 0x000500C7, 0x0000000B,\n    0x0000301A, 0x00005A3B, 0x00000A1F, 0x00050051, 0x0000000B, 0x00003809,\n    0x00003906, 0x00000001, 0x00050084, 0x0000000B, 0x00003F66, 0x0000301A,\n    0x00003809, 0x00040070, 0x0000000D, 0x0000455F, 0x00003F66, 0x00050085,\n    0x0000000D, 0x00005946, 0x0000455F, 0x000001E0, 0x00050081, 0x0000000D,\n    0x00002EAC, 0x00004529, 0x00005946, 0x00050085, 0x0000000D, 0x00001ABD,\n    0x00002EAC, 0x000009AA, 0x0008000C, 0x0000000D, 0x00001B0B, 0x00000001,\n    0x0000002B, 0x00001ABD, 0x00000A0C, 0x0000008A, 0x0004003D, 0x00000098,\n    0x00003823, 0x00001739, 0x00050051, 0x0000000B, 0x00003254, 0x00002B5B,\n    0x00000001, 0x000500C2, 0x0000000B, 0x00004586, 0x00003254, 0x00000A13,\n    0x00050084, 0x0000000B, 0x00003DD3, 0x00004586, 0x00000A13, 0x00050080,\n    0x0000000B, 0x000049C7, 0x00003DD3, 0x00000A0D, 0x0004007C, 0x0000000C,\n    0x0000387C, 0x000049C7, 0x0005005F, 0x00000017, 0x000045A5, 0x00003823,\n    0x0000387C, 0x00050051, 0x0000000B, 0x000018E9, 0x000045A5, 0x00000000,\n    0x00040070, 0x0000000D, 0x0000452A, 0x000018E9, 0x000500C7, 0x0000000B,\n    0x0000301B, 0x00003254, 0x00000A1F, 0x00050051, 0x0000000B, 0x0000380A,\n    0x000045A5, 0x00000001, 0x00050084, 0x0000000B, 0x00003F67, 0x0000301B,\n    0x0000380A, 0x00040070, 0x0000000D, 0x00004560, 0x00003F67, 0x00050085,\n    0x0000000D, 0x00005947, 0x00004560, 0x000001E0, 0x00050081, 0x0000000D,\n    0x00002EAD, 0x0000452A, 0x00005947, 0x00050085, 0x0000000D, 0x00001ABE,\n    0x00002EAD, 0x000009AA, 0x0008000C, 0x0000000D, 0x00001B0C, 0x00000001,\n    0x0000002B, 0x00001ABE, 0x00000A0C, 0x0000008A, 0x0004003D, 0x00000098,\n    0x00003824, 0x00001739, 0x00050051, 0x0000000B, 0x00003255, 0x00002B5B,\n    0x00000002, 0x000500C2, 0x0000000B, 0x00004587, 0x00003255, 0x00000A13,\n    0x00050084, 0x0000000B, 0x00003DD4, 0x00004587, 0x00000A13, 0x00050080,\n    0x0000000B, 0x000049C8, 0x00003DD4, 0x00000A10, 0x0004007C, 0x0000000C,\n    0x0000387D, 0x000049C8, 0x0005005F, 0x00000017, 0x000045A6, 0x00003824,\n    0x0000387D, 0x00050051, 0x0000000B, 0x000018EA, 0x000045A6, 0x00000000,\n    0x00040070, 0x0000000D, 0x0000452B, 0x000018EA, 0x000500C7, 0x0000000B,\n    0x0000301C, 0x00003255, 0x00000A1F, 0x00050051, 0x0000000B, 0x0000380B,\n    0x000045A6, 0x00000001, 0x00050084, 0x0000000B, 0x00003F68, 0x0000301C,\n    0x0000380B, 0x00040070, 0x0000000D, 0x00004561, 0x00003F68, 0x00050085,\n    0x0000000D, 0x00005948, 0x00004561, 0x000001E0, 0x00050081, 0x0000000D,\n    0x00002EAE, 0x0000452B, 0x00005948, 0x00050085, 0x0000000D, 0x00001C26,\n    0x00002EAE, 0x000009AA, 0x0008000C, 0x0000000D, 0x00005737, 0x00000001,\n    0x0000002B, 0x00001C26, 0x00000A0C, 0x0000008A, 0x00070050, 0x0000001D,\n    0x00001946, 0x00001B0B, 0x00001B0C, 0x00005737, 0x0000008A, 0x0004003D,\n    0x000000A6, 0x00002FF3, 0x00000CBA, 0x00040063, 0x00002FF3, 0x00002925,\n    0x00001946, 0x000200F9, 0x00005445, 0x000200F8, 0x00005445, 0x000100FD,\n    0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/apply_gamma_pwl_fxaa_luma_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 24255\n; Schema: 0\n               OpCapability Shader\n               OpCapability SampledBuffer\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 16 8 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_apply_gamma_size\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %xe_apply_gamma_source \"xe_apply_gamma_source\"\n               OpName %xe_apply_gamma_ramp \"xe_apply_gamma_ramp\"\n               OpName %xe_apply_gamma_dest \"xe_apply_gamma_dest\"\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpDecorate %xe_apply_gamma_source Binding 0\n               OpDecorate %xe_apply_gamma_source DescriptorSet 1\n               OpDecorate %xe_apply_gamma_ramp Binding 0\n               OpDecorate %xe_apply_gamma_ramp DescriptorSet 0\n               OpDecorate %xe_apply_gamma_dest NonReadable\n               OpDecorate %xe_apply_gamma_dest Binding 0\n               OpDecorate %xe_apply_gamma_dest DescriptorSet 2\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n      %float = OpTypeFloat 32\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n    %float_0 = OpConstant %float 0\n    %float_1 = OpConstant %float 1\n     %uint_0 = OpConstant %uint 0\n     %uint_7 = OpConstant %uint 7\n     %uint_1 = OpConstant %uint 1\n%float_0_125 = OpConstant %float 0.125\n%float_1_52737048en05 = OpConstant %float 1.52737048e-05\n     %v3uint = OpTypeVector %uint 3\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n%push_const_block_xe = OpTypeStruct %v2uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n        %int = OpTypeInt 32 1\n      %int_0 = OpConstant %int 0\n%_ptr_PushConstant_v2uint = OpTypePointer PushConstant %v2uint\n       %bool = OpTypeBool\n     %v2bool = OpTypeVector %bool 2\n        %150 = OpTypeImage %float 2D 0 0 0 1 Unknown\n%_ptr_UniformConstant_150 = OpTypePointer UniformConstant %150\n%xe_apply_gamma_source = OpVariable %_ptr_UniformConstant_150 UniformConstant\n      %v2int = OpTypeVector %int 2\n    %v4float = OpTypeVector %float 4\n    %v3float = OpTypeVector %float 3\n %float_1023 = OpConstant %float 1023\n  %float_0_5 = OpConstant %float 0.5\n        %152 = OpTypeImage %uint Buffer 0 0 0 1 Unknown\n%_ptr_UniformConstant_152 = OpTypePointer UniformConstant %152\n%xe_apply_gamma_ramp = OpVariable %_ptr_UniformConstant_152 UniformConstant\n     %uint_3 = OpConstant %uint 3\n     %v4uint = OpTypeVector %uint 4\n     %uint_2 = OpConstant %uint 2\n%float_0_298999995 = OpConstant %float 0.298999995\n%float_0_587000012 = OpConstant %float 0.587000012\n%float_0_114 = OpConstant %float 0.114\n       %1268 = OpConstantComposite %v3float %float_0_298999995 %float_0_587000012 %float_0_114\n        %166 = OpTypeImage %float 2D 0 0 0 2 Rgba16f\n%_ptr_UniformConstant_166 = OpTypePointer UniformConstant %166\n%xe_apply_gamma_dest = OpVariable %_ptr_UniformConstant_166 UniformConstant\n    %uint_16 = OpConstant %uint 16\n     %uint_8 = OpConstant %uint 8\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_16 %uint_8 %uint_1\n        %939 = OpConstantComposite %v3float %float_0_5 %float_0_5 %float_0_5\n          %2 = OpUndef %v4float\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %21573 None\n               OpSwitch %uint_0 %12914\n      %12914 = OpLabel\n      %13761 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21717 = OpVectorShuffle %v2uint %13761 %13761 0 1\n       %7760 = OpAccessChain %_ptr_PushConstant_v2uint %push_consts_xe %int_0\n      %13378 = OpLoad %v2uint %7760\n      %23437 = OpUGreaterThanEqual %v2bool %21717 %13378\n      %23076 = OpAny %bool %23437\n               OpSelectionMerge %18302 DontFlatten\n               OpBranchConditional %23076 %21992 %18302\n      %21992 = OpLabel\n               OpBranch %21573\n      %18302 = OpLabel\n      %24004 = OpLoad %150 %xe_apply_gamma_source\n      %10533 = OpBitcast %v2int %21717\n       %6680 = OpImageFetch %v4float %24004 %10533 Lod %int_0\n      %16242 = OpVectorShuffle %v3float %6680 %6680 0 1 2\n      %13907 = OpVectorTimesScalar %v3float %16242 %float_1023\n      %16889 = OpFAdd %v3float %13907 %939\n      %11099 = OpConvertFToU %v3uint %16889\n      %19954 = OpLoad %152 %xe_apply_gamma_ramp\n      %23099 = OpCompositeExtract %uint %11099 0\n      %17722 = OpShiftRightLogical %uint %23099 %uint_3\n      %15968 = OpIMul %uint %17722 %uint_3\n      %18268 = OpBitcast %int %15968\n      %14598 = OpImageFetch %v4uint %19954 %18268\n       %6376 = OpCompositeExtract %uint %14598 0\n      %17705 = OpConvertUToF %float %6376\n      %12314 = OpBitwiseAnd %uint %23099 %uint_7\n      %14345 = OpCompositeExtract %uint %14598 1\n      %16230 = OpIMul %uint %12314 %14345\n      %17759 = OpConvertUToF %float %16230\n      %22854 = OpFMul %float %17759 %float_0_125\n      %11948 = OpFAdd %float %17705 %22854\n       %7244 = OpFMul %float %11948 %float_1_52737048en05\n      %21981 = OpExtInst %float %1 FClamp %7244 %float_0 %float_1\n       %8813 = OpCompositeInsert %v4float %21981 %2 0\n      %13846 = OpLoad %152 %xe_apply_gamma_ramp\n      %17466 = OpCompositeExtract %uint %11099 1\n      %17798 = OpShiftRightLogical %uint %17466 %uint_3\n      %15827 = OpIMul %uint %17798 %uint_3\n      %18887 = OpIAdd %uint %15827 %uint_1\n      %14460 = OpBitcast %int %18887\n      %17829 = OpImageFetch %v4uint %13846 %14460\n       %6377 = OpCompositeExtract %uint %17829 0\n      %17706 = OpConvertUToF %float %6377\n      %12315 = OpBitwiseAnd %uint %17466 %uint_7\n      %14346 = OpCompositeExtract %uint %17829 1\n      %16231 = OpIMul %uint %12315 %14346\n      %17760 = OpConvertUToF %float %16231\n      %22855 = OpFMul %float %17760 %float_0_125\n      %11949 = OpFAdd %float %17706 %22855\n       %7245 = OpFMul %float %11949 %float_1_52737048en05\n      %21982 = OpExtInst %float %1 FClamp %7245 %float_0 %float_1\n       %8814 = OpCompositeInsert %v4float %21982 %8813 1\n      %13847 = OpLoad %152 %xe_apply_gamma_ramp\n      %17467 = OpCompositeExtract %uint %11099 2\n      %17799 = OpShiftRightLogical %uint %17467 %uint_3\n      %15828 = OpIMul %uint %17799 %uint_3\n      %18888 = OpIAdd %uint %15828 %uint_2\n      %14461 = OpBitcast %int %18888\n      %17830 = OpImageFetch %v4uint %13847 %14461\n       %6378 = OpCompositeExtract %uint %17830 0\n      %17707 = OpConvertUToF %float %6378\n      %12316 = OpBitwiseAnd %uint %17467 %uint_7\n      %14347 = OpCompositeExtract %uint %17830 1\n      %16232 = OpIMul %uint %12316 %14347\n      %17761 = OpConvertUToF %float %16232\n      %22856 = OpFMul %float %17761 %float_0_125\n      %11950 = OpFAdd %float %17707 %22856\n       %7246 = OpFMul %float %11950 %float_1_52737048en05\n      %22323 = OpExtInst %float %1 FClamp %7246 %float_0 %float_1\n       %6972 = OpCompositeInsert %v4float %22323 %8814 2\n      %24254 = OpVectorShuffle %v3float %6972 %6972 0 1 2\n       %9657 = OpDot %float %24254 %1268\n      %18930 = OpCompositeConstruct %v4float %21981 %21982 %22323 %9657\n      %12273 = OpLoad %166 %xe_apply_gamma_dest\n               OpImageWrite %12273 %10533 %18930\n               OpBranch %21573\n      %21573 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t apply_gamma_pwl_fxaa_luma_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00005EBF, 0x00000000, 0x00020011,\n    0x00000001, 0x00020011, 0x0000002E, 0x0006000B, 0x00000001, 0x4C534C47,\n    0x6474732E, 0x3035342E, 0x00000000, 0x0003000E, 0x00000000, 0x00000001,\n    0x0006000F, 0x00000005, 0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48,\n    0x00060010, 0x0000161F, 0x00000011, 0x00000010, 0x00000008, 0x00000001,\n    0x00030003, 0x00000002, 0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458,\n    0x72746E6F, 0x665F6C6F, 0x5F776F6C, 0x72747461, 0x74756269, 0x00007365,\n    0x000B0004, 0x455F4C47, 0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373,\n    0x75747865, 0x665F6572, 0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004,\n    0x475F4C47, 0x4C474F4F, 0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C,\n    0x7269645F, 0x69746365, 0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F,\n    0x6E695F45, 0x64756C63, 0x69645F65, 0x74636572, 0x00657669, 0x00040005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00080005, 0x00000F48, 0x475F6C67,\n    0x61626F6C, 0x766E496C, 0x7461636F, 0x496E6F69, 0x00000044, 0x00070005,\n    0x000003E1, 0x68737570, 0x6E6F635F, 0x625F7473, 0x6B636F6C, 0x0065785F,\n    0x00080006, 0x000003E1, 0x00000000, 0x615F6578, 0x796C7070, 0x6D61675F,\n    0x735F616D, 0x00657A69, 0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F,\n    0x5F737473, 0x00006578, 0x00080005, 0x0000167F, 0x615F6578, 0x796C7070,\n    0x6D61675F, 0x735F616D, 0x6372756F, 0x00000065, 0x00070005, 0x00001739,\n    0x615F6578, 0x796C7070, 0x6D61675F, 0x725F616D, 0x00706D61, 0x00070005,\n    0x00000CBA, 0x615F6578, 0x796C7070, 0x6D61675F, 0x645F616D, 0x00747365,\n    0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00030047, 0x000003E1,\n    0x00000002, 0x00050048, 0x000003E1, 0x00000000, 0x00000023, 0x00000000,\n    0x00040047, 0x0000167F, 0x00000021, 0x00000000, 0x00040047, 0x0000167F,\n    0x00000022, 0x00000001, 0x00040047, 0x00001739, 0x00000021, 0x00000000,\n    0x00040047, 0x00001739, 0x00000022, 0x00000000, 0x00030047, 0x00000CBA,\n    0x00000019, 0x00040047, 0x00000CBA, 0x00000021, 0x00000000, 0x00040047,\n    0x00000CBA, 0x00000022, 0x00000002, 0x00040047, 0x00000B0F, 0x0000000B,\n    0x00000019, 0x00020013, 0x00000008, 0x00030021, 0x00000502, 0x00000008,\n    0x00030016, 0x0000000D, 0x00000020, 0x00040015, 0x0000000B, 0x00000020,\n    0x00000000, 0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x0004002B,\n    0x0000000D, 0x00000A0C, 0x00000000, 0x0004002B, 0x0000000D, 0x0000008A,\n    0x3F800000, 0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000, 0x0004002B,\n    0x0000000B, 0x00000A1F, 0x00000007, 0x0004002B, 0x0000000B, 0x00000A0D,\n    0x00000001, 0x0004002B, 0x0000000D, 0x000001E0, 0x3E000000, 0x0004002B,\n    0x0000000D, 0x000009AA, 0x37802008, 0x00040017, 0x00000014, 0x0000000B,\n    0x00000003, 0x00040020, 0x00000291, 0x00000001, 0x00000014, 0x0004003B,\n    0x00000291, 0x00000F48, 0x00000001, 0x0003001E, 0x000003E1, 0x00000011,\n    0x00040020, 0x0000065E, 0x00000009, 0x000003E1, 0x0004003B, 0x0000065E,\n    0x00000CE9, 0x00000009, 0x00040015, 0x0000000C, 0x00000020, 0x00000001,\n    0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000, 0x00040020, 0x0000028E,\n    0x00000009, 0x00000011, 0x00020014, 0x00000009, 0x00040017, 0x0000000F,\n    0x00000009, 0x00000002, 0x00090019, 0x00000096, 0x0000000D, 0x00000001,\n    0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x00040020,\n    0x00000313, 0x00000000, 0x00000096, 0x0004003B, 0x00000313, 0x0000167F,\n    0x00000000, 0x00040017, 0x00000012, 0x0000000C, 0x00000002, 0x00040017,\n    0x0000001D, 0x0000000D, 0x00000004, 0x00040017, 0x00000018, 0x0000000D,\n    0x00000003, 0x0004002B, 0x0000000D, 0x00000409, 0x447FC000, 0x0004002B,\n    0x0000000D, 0x000000FC, 0x3F000000, 0x00090019, 0x00000098, 0x0000000B,\n    0x00000005, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000,\n    0x00040020, 0x00000315, 0x00000000, 0x00000098, 0x0004003B, 0x00000315,\n    0x00001739, 0x00000000, 0x0004002B, 0x0000000B, 0x00000A13, 0x00000003,\n    0x00040017, 0x00000017, 0x0000000B, 0x00000004, 0x0004002B, 0x0000000B,\n    0x00000A10, 0x00000002, 0x0004002B, 0x0000000D, 0x00000351, 0x3E991687,\n    0x0004002B, 0x0000000D, 0x00000458, 0x3F1645A2, 0x0004002B, 0x0000000D,\n    0x000001DC, 0x3DE978D5, 0x0006002C, 0x00000018, 0x000004F4, 0x00000351,\n    0x00000458, 0x000001DC, 0x00090019, 0x000000A6, 0x0000000D, 0x00000001,\n    0x00000000, 0x00000000, 0x00000000, 0x00000002, 0x00000002, 0x00040020,\n    0x00000323, 0x00000000, 0x000000A6, 0x0004003B, 0x00000323, 0x00000CBA,\n    0x00000000, 0x0004002B, 0x0000000B, 0x00000A3A, 0x00000010, 0x0004002B,\n    0x0000000B, 0x00000A22, 0x00000008, 0x0006002C, 0x00000014, 0x00000B0F,\n    0x00000A3A, 0x00000A22, 0x00000A0D, 0x0006002C, 0x00000018, 0x000003AB,\n    0x000000FC, 0x000000FC, 0x000000FC, 0x00030001, 0x0000001D, 0x00000002,\n    0x00050036, 0x00000008, 0x0000161F, 0x00000000, 0x00000502, 0x000200F8,\n    0x00003B06, 0x000300F7, 0x00005445, 0x00000000, 0x000300FB, 0x00000A0A,\n    0x00003272, 0x000200F8, 0x00003272, 0x0004003D, 0x00000014, 0x000035C1,\n    0x00000F48, 0x0007004F, 0x00000011, 0x000054D5, 0x000035C1, 0x000035C1,\n    0x00000000, 0x00000001, 0x00050041, 0x0000028E, 0x00001E50, 0x00000CE9,\n    0x00000A0B, 0x0004003D, 0x00000011, 0x00003442, 0x00001E50, 0x000500AE,\n    0x0000000F, 0x00005B8D, 0x000054D5, 0x00003442, 0x0004009A, 0x00000009,\n    0x00005A24, 0x00005B8D, 0x000300F7, 0x0000477E, 0x00000002, 0x000400FA,\n    0x00005A24, 0x000055E8, 0x0000477E, 0x000200F8, 0x000055E8, 0x000200F9,\n    0x00005445, 0x000200F8, 0x0000477E, 0x0004003D, 0x00000096, 0x00005DC4,\n    0x0000167F, 0x0004007C, 0x00000012, 0x00002925, 0x000054D5, 0x0007005F,\n    0x0000001D, 0x00001A18, 0x00005DC4, 0x00002925, 0x00000002, 0x00000A0B,\n    0x0008004F, 0x00000018, 0x00003F72, 0x00001A18, 0x00001A18, 0x00000000,\n    0x00000001, 0x00000002, 0x0005008E, 0x00000018, 0x00003653, 0x00003F72,\n    0x00000409, 0x00050081, 0x00000018, 0x000041F9, 0x00003653, 0x000003AB,\n    0x0004006D, 0x00000014, 0x00002B5B, 0x000041F9, 0x0004003D, 0x00000098,\n    0x00004DF2, 0x00001739, 0x00050051, 0x0000000B, 0x00005A3B, 0x00002B5B,\n    0x00000000, 0x000500C2, 0x0000000B, 0x0000453A, 0x00005A3B, 0x00000A13,\n    0x00050084, 0x0000000B, 0x00003E60, 0x0000453A, 0x00000A13, 0x0004007C,\n    0x0000000C, 0x0000475C, 0x00003E60, 0x0005005F, 0x00000017, 0x00003906,\n    0x00004DF2, 0x0000475C, 0x00050051, 0x0000000B, 0x000018E8, 0x00003906,\n    0x00000000, 0x00040070, 0x0000000D, 0x00004529, 0x000018E8, 0x000500C7,\n    0x0000000B, 0x0000301A, 0x00005A3B, 0x00000A1F, 0x00050051, 0x0000000B,\n    0x00003809, 0x00003906, 0x00000001, 0x00050084, 0x0000000B, 0x00003F66,\n    0x0000301A, 0x00003809, 0x00040070, 0x0000000D, 0x0000455F, 0x00003F66,\n    0x00050085, 0x0000000D, 0x00005946, 0x0000455F, 0x000001E0, 0x00050081,\n    0x0000000D, 0x00002EAC, 0x00004529, 0x00005946, 0x00050085, 0x0000000D,\n    0x00001C4C, 0x00002EAC, 0x000009AA, 0x0008000C, 0x0000000D, 0x000055DD,\n    0x00000001, 0x0000002B, 0x00001C4C, 0x00000A0C, 0x0000008A, 0x00060052,\n    0x0000001D, 0x0000226D, 0x000055DD, 0x00000002, 0x00000000, 0x0004003D,\n    0x00000098, 0x00003616, 0x00001739, 0x00050051, 0x0000000B, 0x0000443A,\n    0x00002B5B, 0x00000001, 0x000500C2, 0x0000000B, 0x00004586, 0x0000443A,\n    0x00000A13, 0x00050084, 0x0000000B, 0x00003DD3, 0x00004586, 0x00000A13,\n    0x00050080, 0x0000000B, 0x000049C7, 0x00003DD3, 0x00000A0D, 0x0004007C,\n    0x0000000C, 0x0000387C, 0x000049C7, 0x0005005F, 0x00000017, 0x000045A5,\n    0x00003616, 0x0000387C, 0x00050051, 0x0000000B, 0x000018E9, 0x000045A5,\n    0x00000000, 0x00040070, 0x0000000D, 0x0000452A, 0x000018E9, 0x000500C7,\n    0x0000000B, 0x0000301B, 0x0000443A, 0x00000A1F, 0x00050051, 0x0000000B,\n    0x0000380A, 0x000045A5, 0x00000001, 0x00050084, 0x0000000B, 0x00003F67,\n    0x0000301B, 0x0000380A, 0x00040070, 0x0000000D, 0x00004560, 0x00003F67,\n    0x00050085, 0x0000000D, 0x00005947, 0x00004560, 0x000001E0, 0x00050081,\n    0x0000000D, 0x00002EAD, 0x0000452A, 0x00005947, 0x00050085, 0x0000000D,\n    0x00001C4D, 0x00002EAD, 0x000009AA, 0x0008000C, 0x0000000D, 0x000055DE,\n    0x00000001, 0x0000002B, 0x00001C4D, 0x00000A0C, 0x0000008A, 0x00060052,\n    0x0000001D, 0x0000226E, 0x000055DE, 0x0000226D, 0x00000001, 0x0004003D,\n    0x00000098, 0x00003617, 0x00001739, 0x00050051, 0x0000000B, 0x0000443B,\n    0x00002B5B, 0x00000002, 0x000500C2, 0x0000000B, 0x00004587, 0x0000443B,\n    0x00000A13, 0x00050084, 0x0000000B, 0x00003DD4, 0x00004587, 0x00000A13,\n    0x00050080, 0x0000000B, 0x000049C8, 0x00003DD4, 0x00000A10, 0x0004007C,\n    0x0000000C, 0x0000387D, 0x000049C8, 0x0005005F, 0x00000017, 0x000045A6,\n    0x00003617, 0x0000387D, 0x00050051, 0x0000000B, 0x000018EA, 0x000045A6,\n    0x00000000, 0x00040070, 0x0000000D, 0x0000452B, 0x000018EA, 0x000500C7,\n    0x0000000B, 0x0000301C, 0x0000443B, 0x00000A1F, 0x00050051, 0x0000000B,\n    0x0000380B, 0x000045A6, 0x00000001, 0x00050084, 0x0000000B, 0x00003F68,\n    0x0000301C, 0x0000380B, 0x00040070, 0x0000000D, 0x00004561, 0x00003F68,\n    0x00050085, 0x0000000D, 0x00005948, 0x00004561, 0x000001E0, 0x00050081,\n    0x0000000D, 0x00002EAE, 0x0000452B, 0x00005948, 0x00050085, 0x0000000D,\n    0x00001C4E, 0x00002EAE, 0x000009AA, 0x0008000C, 0x0000000D, 0x00005733,\n    0x00000001, 0x0000002B, 0x00001C4E, 0x00000A0C, 0x0000008A, 0x00060052,\n    0x0000001D, 0x00001B3C, 0x00005733, 0x0000226E, 0x00000002, 0x0008004F,\n    0x00000018, 0x00005EBE, 0x00001B3C, 0x00001B3C, 0x00000000, 0x00000001,\n    0x00000002, 0x00050094, 0x0000000D, 0x000025B9, 0x00005EBE, 0x000004F4,\n    0x00070050, 0x0000001D, 0x000049F2, 0x000055DD, 0x000055DE, 0x00005733,\n    0x000025B9, 0x0004003D, 0x000000A6, 0x00002FF1, 0x00000CBA, 0x00040063,\n    0x00002FF1, 0x00002925, 0x000049F2, 0x000200F9, 0x00005445, 0x000200F8,\n    0x00005445, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/apply_gamma_pwl_fxaa_luma_ps.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 24950\n; Schema: 0\n               OpCapability Shader\n               OpCapability SampledBuffer\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint Fragment %main \"main\" %gl_FragCoord %xe_apply_gamma_dest\n               OpExecutionMode %main OriginUpperLeft\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %gl_FragCoord \"gl_FragCoord\"\n               OpName %xe_apply_gamma_source \"xe_apply_gamma_source\"\n               OpName %xe_apply_gamma_ramp \"xe_apply_gamma_ramp\"\n               OpName %xe_apply_gamma_dest \"xe_apply_gamma_dest\"\n               OpDecorate %gl_FragCoord BuiltIn FragCoord\n               OpDecorate %xe_apply_gamma_source Binding 0\n               OpDecorate %xe_apply_gamma_source DescriptorSet 1\n               OpDecorate %xe_apply_gamma_ramp Binding 0\n               OpDecorate %xe_apply_gamma_ramp DescriptorSet 0\n               OpDecorate %xe_apply_gamma_dest Location 0\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n      %float = OpTypeFloat 32\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n    %float_0 = OpConstant %float 0\n    %float_1 = OpConstant %float 1\n     %uint_7 = OpConstant %uint 7\n     %uint_1 = OpConstant %uint 1\n%float_0_125 = OpConstant %float 0.125\n%float_1_52737048en05 = OpConstant %float 1.52737048e-05\n    %v4float = OpTypeVector %float 4\n%_ptr_Input_v4float = OpTypePointer Input %v4float\n%gl_FragCoord = OpVariable %_ptr_Input_v4float Input\n    %v2float = OpTypeVector %float 2\n     %v3uint = OpTypeVector %uint 3\n        %150 = OpTypeImage %float 2D 0 0 0 1 Unknown\n%_ptr_UniformConstant_150 = OpTypePointer UniformConstant %150\n%xe_apply_gamma_source = OpVariable %_ptr_UniformConstant_150 UniformConstant\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %int_0 = OpConstant %int 0\n    %v3float = OpTypeVector %float 3\n %float_1023 = OpConstant %float 1023\n  %float_0_5 = OpConstant %float 0.5\n        %152 = OpTypeImage %uint Buffer 0 0 0 1 Unknown\n%_ptr_UniformConstant_152 = OpTypePointer UniformConstant %152\n%xe_apply_gamma_ramp = OpVariable %_ptr_UniformConstant_152 UniformConstant\n     %uint_3 = OpConstant %uint 3\n     %v4uint = OpTypeVector %uint 4\n     %uint_2 = OpConstant %uint 2\n%float_0_298999995 = OpConstant %float 0.298999995\n%float_0_587000012 = OpConstant %float 0.587000012\n%float_0_114 = OpConstant %float 0.114\n       %1268 = OpConstantComposite %v3float %float_0_298999995 %float_0_587000012 %float_0_114\n%_ptr_Output_v4float = OpTypePointer Output %v4float\n%xe_apply_gamma_dest = OpVariable %_ptr_Output_v4float Output\n        %939 = OpConstantComposite %v3float %float_0_5 %float_0_5 %float_0_5\n          %2 = OpUndef %v4float\n       %main = OpFunction %void None %1282\n      %24949 = OpLabel\n      %18552 = OpLoad %v4float %gl_FragCoord\n      %14105 = OpVectorShuffle %v2float %18552 %18552 0 1\n       %8667 = OpConvertFToU %v2uint %14105\n      %21665 = OpLoad %150 %xe_apply_gamma_source\n      %11127 = OpBitcast %v2int %8667\n       %6680 = OpImageFetch %v4float %21665 %11127 Lod %int_0\n      %16242 = OpVectorShuffle %v3float %6680 %6680 0 1 2\n      %13907 = OpVectorTimesScalar %v3float %16242 %float_1023\n      %16889 = OpFAdd %v3float %13907 %939\n      %11099 = OpConvertFToU %v3uint %16889\n      %19954 = OpLoad %152 %xe_apply_gamma_ramp\n      %23099 = OpCompositeExtract %uint %11099 0\n      %17722 = OpShiftRightLogical %uint %23099 %uint_3\n      %15968 = OpIMul %uint %17722 %uint_3\n      %18268 = OpBitcast %int %15968\n      %14598 = OpImageFetch %v4uint %19954 %18268\n       %6376 = OpCompositeExtract %uint %14598 0\n      %17705 = OpConvertUToF %float %6376\n      %12314 = OpBitwiseAnd %uint %23099 %uint_7\n      %14345 = OpCompositeExtract %uint %14598 1\n      %16230 = OpIMul %uint %12314 %14345\n      %17759 = OpConvertUToF %float %16230\n      %22854 = OpFMul %float %17759 %float_0_125\n      %11948 = OpFAdd %float %17705 %22854\n       %7244 = OpFMul %float %11948 %float_1_52737048en05\n      %21981 = OpExtInst %float %1 FClamp %7244 %float_0 %float_1\n       %8813 = OpCompositeInsert %v4float %21981 %2 0\n      %13846 = OpLoad %152 %xe_apply_gamma_ramp\n      %17466 = OpCompositeExtract %uint %11099 1\n      %17798 = OpShiftRightLogical %uint %17466 %uint_3\n      %15827 = OpIMul %uint %17798 %uint_3\n      %18887 = OpIAdd %uint %15827 %uint_1\n      %14460 = OpBitcast %int %18887\n      %17829 = OpImageFetch %v4uint %13846 %14460\n       %6377 = OpCompositeExtract %uint %17829 0\n      %17706 = OpConvertUToF %float %6377\n      %12315 = OpBitwiseAnd %uint %17466 %uint_7\n      %14346 = OpCompositeExtract %uint %17829 1\n      %16231 = OpIMul %uint %12315 %14346\n      %17760 = OpConvertUToF %float %16231\n      %22855 = OpFMul %float %17760 %float_0_125\n      %11949 = OpFAdd %float %17706 %22855\n       %7245 = OpFMul %float %11949 %float_1_52737048en05\n      %21982 = OpExtInst %float %1 FClamp %7245 %float_0 %float_1\n       %8814 = OpCompositeInsert %v4float %21982 %8813 1\n      %13847 = OpLoad %152 %xe_apply_gamma_ramp\n      %17467 = OpCompositeExtract %uint %11099 2\n      %17799 = OpShiftRightLogical %uint %17467 %uint_3\n      %15828 = OpIMul %uint %17799 %uint_3\n      %18888 = OpIAdd %uint %15828 %uint_2\n      %14461 = OpBitcast %int %18888\n      %17830 = OpImageFetch %v4uint %13847 %14461\n       %6378 = OpCompositeExtract %uint %17830 0\n      %17707 = OpConvertUToF %float %6378\n      %12316 = OpBitwiseAnd %uint %17467 %uint_7\n      %14347 = OpCompositeExtract %uint %17830 1\n      %16232 = OpIMul %uint %12316 %14347\n      %17761 = OpConvertUToF %float %16232\n      %22856 = OpFMul %float %17761 %float_0_125\n      %11950 = OpFAdd %float %17707 %22856\n       %7246 = OpFMul %float %11950 %float_1_52737048en05\n      %22323 = OpExtInst %float %1 FClamp %7246 %float_0 %float_1\n       %6972 = OpCompositeInsert %v4float %22323 %8814 2\n      %24254 = OpVectorShuffle %v3float %6972 %6972 0 1 2\n       %9676 = OpDot %float %24254 %1268\n      %21683 = OpCompositeConstruct %v4float %21981 %21982 %22323 %9676\n               OpStore %xe_apply_gamma_dest %21683\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t apply_gamma_pwl_fxaa_luma_ps[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006176, 0x00000000, 0x00020011,\n    0x00000001, 0x00020011, 0x0000002E, 0x0006000B, 0x00000001, 0x4C534C47,\n    0x6474732E, 0x3035342E, 0x00000000, 0x0003000E, 0x00000000, 0x00000001,\n    0x0007000F, 0x00000004, 0x0000161F, 0x6E69616D, 0x00000000, 0x00000C93,\n    0x00000CBA, 0x00030010, 0x0000161F, 0x00000007, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00060005, 0x00000C93, 0x465F6C67, 0x43676172, 0x64726F6F,\n    0x00000000, 0x00080005, 0x0000167F, 0x615F6578, 0x796C7070, 0x6D61675F,\n    0x735F616D, 0x6372756F, 0x00000065, 0x00070005, 0x00001739, 0x615F6578,\n    0x796C7070, 0x6D61675F, 0x725F616D, 0x00706D61, 0x00070005, 0x00000CBA,\n    0x615F6578, 0x796C7070, 0x6D61675F, 0x645F616D, 0x00747365, 0x00040047,\n    0x00000C93, 0x0000000B, 0x0000000F, 0x00040047, 0x0000167F, 0x00000021,\n    0x00000000, 0x00040047, 0x0000167F, 0x00000022, 0x00000001, 0x00040047,\n    0x00001739, 0x00000021, 0x00000000, 0x00040047, 0x00001739, 0x00000022,\n    0x00000000, 0x00040047, 0x00000CBA, 0x0000001E, 0x00000000, 0x00020013,\n    0x00000008, 0x00030021, 0x00000502, 0x00000008, 0x00030016, 0x0000000D,\n    0x00000020, 0x00040015, 0x0000000B, 0x00000020, 0x00000000, 0x00040017,\n    0x00000011, 0x0000000B, 0x00000002, 0x0004002B, 0x0000000D, 0x00000A0C,\n    0x00000000, 0x0004002B, 0x0000000D, 0x0000008A, 0x3F800000, 0x0004002B,\n    0x0000000B, 0x00000A1F, 0x00000007, 0x0004002B, 0x0000000B, 0x00000A0D,\n    0x00000001, 0x0004002B, 0x0000000D, 0x000001E0, 0x3E000000, 0x0004002B,\n    0x0000000D, 0x000009AA, 0x37802008, 0x00040017, 0x0000001D, 0x0000000D,\n    0x00000004, 0x00040020, 0x0000029A, 0x00000001, 0x0000001D, 0x0004003B,\n    0x0000029A, 0x00000C93, 0x00000001, 0x00040017, 0x00000013, 0x0000000D,\n    0x00000002, 0x00040017, 0x00000014, 0x0000000B, 0x00000003, 0x00090019,\n    0x00000096, 0x0000000D, 0x00000001, 0x00000000, 0x00000000, 0x00000000,\n    0x00000001, 0x00000000, 0x00040020, 0x00000313, 0x00000000, 0x00000096,\n    0x0004003B, 0x00000313, 0x0000167F, 0x00000000, 0x00040015, 0x0000000C,\n    0x00000020, 0x00000001, 0x00040017, 0x00000012, 0x0000000C, 0x00000002,\n    0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000, 0x00040017, 0x00000018,\n    0x0000000D, 0x00000003, 0x0004002B, 0x0000000D, 0x00000409, 0x447FC000,\n    0x0004002B, 0x0000000D, 0x000000FC, 0x3F000000, 0x00090019, 0x00000098,\n    0x0000000B, 0x00000005, 0x00000000, 0x00000000, 0x00000000, 0x00000001,\n    0x00000000, 0x00040020, 0x00000315, 0x00000000, 0x00000098, 0x0004003B,\n    0x00000315, 0x00001739, 0x00000000, 0x0004002B, 0x0000000B, 0x00000A13,\n    0x00000003, 0x00040017, 0x00000017, 0x0000000B, 0x00000004, 0x0004002B,\n    0x0000000B, 0x00000A10, 0x00000002, 0x0004002B, 0x0000000D, 0x00000351,\n    0x3E991687, 0x0004002B, 0x0000000D, 0x00000458, 0x3F1645A2, 0x0004002B,\n    0x0000000D, 0x000001DC, 0x3DE978D5, 0x0006002C, 0x00000018, 0x000004F4,\n    0x00000351, 0x00000458, 0x000001DC, 0x00040020, 0x0000029B, 0x00000003,\n    0x0000001D, 0x0004003B, 0x0000029B, 0x00000CBA, 0x00000003, 0x0006002C,\n    0x00000018, 0x000003AB, 0x000000FC, 0x000000FC, 0x000000FC, 0x00030001,\n    0x0000001D, 0x00000002, 0x00050036, 0x00000008, 0x0000161F, 0x00000000,\n    0x00000502, 0x000200F8, 0x00006175, 0x0004003D, 0x0000001D, 0x00004878,\n    0x00000C93, 0x0007004F, 0x00000013, 0x00003719, 0x00004878, 0x00004878,\n    0x00000000, 0x00000001, 0x0004006D, 0x00000011, 0x000021DB, 0x00003719,\n    0x0004003D, 0x00000096, 0x000054A1, 0x0000167F, 0x0004007C, 0x00000012,\n    0x00002B77, 0x000021DB, 0x0007005F, 0x0000001D, 0x00001A18, 0x000054A1,\n    0x00002B77, 0x00000002, 0x00000A0B, 0x0008004F, 0x00000018, 0x00003F72,\n    0x00001A18, 0x00001A18, 0x00000000, 0x00000001, 0x00000002, 0x0005008E,\n    0x00000018, 0x00003653, 0x00003F72, 0x00000409, 0x00050081, 0x00000018,\n    0x000041F9, 0x00003653, 0x000003AB, 0x0004006D, 0x00000014, 0x00002B5B,\n    0x000041F9, 0x0004003D, 0x00000098, 0x00004DF2, 0x00001739, 0x00050051,\n    0x0000000B, 0x00005A3B, 0x00002B5B, 0x00000000, 0x000500C2, 0x0000000B,\n    0x0000453A, 0x00005A3B, 0x00000A13, 0x00050084, 0x0000000B, 0x00003E60,\n    0x0000453A, 0x00000A13, 0x0004007C, 0x0000000C, 0x0000475C, 0x00003E60,\n    0x0005005F, 0x00000017, 0x00003906, 0x00004DF2, 0x0000475C, 0x00050051,\n    0x0000000B, 0x000018E8, 0x00003906, 0x00000000, 0x00040070, 0x0000000D,\n    0x00004529, 0x000018E8, 0x000500C7, 0x0000000B, 0x0000301A, 0x00005A3B,\n    0x00000A1F, 0x00050051, 0x0000000B, 0x00003809, 0x00003906, 0x00000001,\n    0x00050084, 0x0000000B, 0x00003F66, 0x0000301A, 0x00003809, 0x00040070,\n    0x0000000D, 0x0000455F, 0x00003F66, 0x00050085, 0x0000000D, 0x00005946,\n    0x0000455F, 0x000001E0, 0x00050081, 0x0000000D, 0x00002EAC, 0x00004529,\n    0x00005946, 0x00050085, 0x0000000D, 0x00001C4C, 0x00002EAC, 0x000009AA,\n    0x0008000C, 0x0000000D, 0x000055DD, 0x00000001, 0x0000002B, 0x00001C4C,\n    0x00000A0C, 0x0000008A, 0x00060052, 0x0000001D, 0x0000226D, 0x000055DD,\n    0x00000002, 0x00000000, 0x0004003D, 0x00000098, 0x00003616, 0x00001739,\n    0x00050051, 0x0000000B, 0x0000443A, 0x00002B5B, 0x00000001, 0x000500C2,\n    0x0000000B, 0x00004586, 0x0000443A, 0x00000A13, 0x00050084, 0x0000000B,\n    0x00003DD3, 0x00004586, 0x00000A13, 0x00050080, 0x0000000B, 0x000049C7,\n    0x00003DD3, 0x00000A0D, 0x0004007C, 0x0000000C, 0x0000387C, 0x000049C7,\n    0x0005005F, 0x00000017, 0x000045A5, 0x00003616, 0x0000387C, 0x00050051,\n    0x0000000B, 0x000018E9, 0x000045A5, 0x00000000, 0x00040070, 0x0000000D,\n    0x0000452A, 0x000018E9, 0x000500C7, 0x0000000B, 0x0000301B, 0x0000443A,\n    0x00000A1F, 0x00050051, 0x0000000B, 0x0000380A, 0x000045A5, 0x00000001,\n    0x00050084, 0x0000000B, 0x00003F67, 0x0000301B, 0x0000380A, 0x00040070,\n    0x0000000D, 0x00004560, 0x00003F67, 0x00050085, 0x0000000D, 0x00005947,\n    0x00004560, 0x000001E0, 0x00050081, 0x0000000D, 0x00002EAD, 0x0000452A,\n    0x00005947, 0x00050085, 0x0000000D, 0x00001C4D, 0x00002EAD, 0x000009AA,\n    0x0008000C, 0x0000000D, 0x000055DE, 0x00000001, 0x0000002B, 0x00001C4D,\n    0x00000A0C, 0x0000008A, 0x00060052, 0x0000001D, 0x0000226E, 0x000055DE,\n    0x0000226D, 0x00000001, 0x0004003D, 0x00000098, 0x00003617, 0x00001739,\n    0x00050051, 0x0000000B, 0x0000443B, 0x00002B5B, 0x00000002, 0x000500C2,\n    0x0000000B, 0x00004587, 0x0000443B, 0x00000A13, 0x00050084, 0x0000000B,\n    0x00003DD4, 0x00004587, 0x00000A13, 0x00050080, 0x0000000B, 0x000049C8,\n    0x00003DD4, 0x00000A10, 0x0004007C, 0x0000000C, 0x0000387D, 0x000049C8,\n    0x0005005F, 0x00000017, 0x000045A6, 0x00003617, 0x0000387D, 0x00050051,\n    0x0000000B, 0x000018EA, 0x000045A6, 0x00000000, 0x00040070, 0x0000000D,\n    0x0000452B, 0x000018EA, 0x000500C7, 0x0000000B, 0x0000301C, 0x0000443B,\n    0x00000A1F, 0x00050051, 0x0000000B, 0x0000380B, 0x000045A6, 0x00000001,\n    0x00050084, 0x0000000B, 0x00003F68, 0x0000301C, 0x0000380B, 0x00040070,\n    0x0000000D, 0x00004561, 0x00003F68, 0x00050085, 0x0000000D, 0x00005948,\n    0x00004561, 0x000001E0, 0x00050081, 0x0000000D, 0x00002EAE, 0x0000452B,\n    0x00005948, 0x00050085, 0x0000000D, 0x00001C4E, 0x00002EAE, 0x000009AA,\n    0x0008000C, 0x0000000D, 0x00005733, 0x00000001, 0x0000002B, 0x00001C4E,\n    0x00000A0C, 0x0000008A, 0x00060052, 0x0000001D, 0x00001B3C, 0x00005733,\n    0x0000226E, 0x00000002, 0x0008004F, 0x00000018, 0x00005EBE, 0x00001B3C,\n    0x00001B3C, 0x00000000, 0x00000001, 0x00000002, 0x00050094, 0x0000000D,\n    0x000025CC, 0x00005EBE, 0x000004F4, 0x00070050, 0x0000001D, 0x000054B3,\n    0x000055DD, 0x000055DE, 0x00005733, 0x000025CC, 0x0003003E, 0x00000CBA,\n    0x000054B3, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/apply_gamma_pwl_ps.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 24950\n; Schema: 0\n               OpCapability Shader\n               OpCapability SampledBuffer\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint Fragment %main \"main\" %gl_FragCoord %xe_apply_gamma_dest\n               OpExecutionMode %main OriginUpperLeft\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %gl_FragCoord \"gl_FragCoord\"\n               OpName %xe_apply_gamma_source \"xe_apply_gamma_source\"\n               OpName %xe_apply_gamma_ramp \"xe_apply_gamma_ramp\"\n               OpName %xe_apply_gamma_dest \"xe_apply_gamma_dest\"\n               OpDecorate %gl_FragCoord BuiltIn FragCoord\n               OpDecorate %xe_apply_gamma_source Binding 0\n               OpDecorate %xe_apply_gamma_source DescriptorSet 1\n               OpDecorate %xe_apply_gamma_ramp Binding 0\n               OpDecorate %xe_apply_gamma_ramp DescriptorSet 0\n               OpDecorate %xe_apply_gamma_dest Location 0\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n      %float = OpTypeFloat 32\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n    %float_0 = OpConstant %float 0\n    %float_1 = OpConstant %float 1\n     %uint_7 = OpConstant %uint 7\n     %uint_1 = OpConstant %uint 1\n%float_0_125 = OpConstant %float 0.125\n%float_1_52737048en05 = OpConstant %float 1.52737048e-05\n    %v4float = OpTypeVector %float 4\n%_ptr_Input_v4float = OpTypePointer Input %v4float\n%gl_FragCoord = OpVariable %_ptr_Input_v4float Input\n    %v2float = OpTypeVector %float 2\n     %v3uint = OpTypeVector %uint 3\n        %150 = OpTypeImage %float 2D 0 0 0 1 Unknown\n%_ptr_UniformConstant_150 = OpTypePointer UniformConstant %150\n%xe_apply_gamma_source = OpVariable %_ptr_UniformConstant_150 UniformConstant\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %int_0 = OpConstant %int 0\n    %v3float = OpTypeVector %float 3\n %float_1023 = OpConstant %float 1023\n  %float_0_5 = OpConstant %float 0.5\n        %152 = OpTypeImage %uint Buffer 0 0 0 1 Unknown\n%_ptr_UniformConstant_152 = OpTypePointer UniformConstant %152\n%xe_apply_gamma_ramp = OpVariable %_ptr_UniformConstant_152 UniformConstant\n     %uint_3 = OpConstant %uint 3\n     %v4uint = OpTypeVector %uint 4\n     %uint_2 = OpConstant %uint 2\n%_ptr_Output_v4float = OpTypePointer Output %v4float\n%xe_apply_gamma_dest = OpVariable %_ptr_Output_v4float Output\n        %939 = OpConstantComposite %v3float %float_0_5 %float_0_5 %float_0_5\n       %main = OpFunction %void None %1282\n      %24949 = OpLabel\n      %18552 = OpLoad %v4float %gl_FragCoord\n      %14105 = OpVectorShuffle %v2float %18552 %18552 0 1\n       %8667 = OpConvertFToU %v2uint %14105\n      %21665 = OpLoad %150 %xe_apply_gamma_source\n      %11127 = OpBitcast %v2int %8667\n       %6680 = OpImageFetch %v4float %21665 %11127 Lod %int_0\n      %16242 = OpVectorShuffle %v3float %6680 %6680 0 1 2\n      %13907 = OpVectorTimesScalar %v3float %16242 %float_1023\n      %16889 = OpFAdd %v3float %13907 %939\n      %11099 = OpConvertFToU %v3uint %16889\n      %19954 = OpLoad %152 %xe_apply_gamma_ramp\n      %23099 = OpCompositeExtract %uint %11099 0\n      %17722 = OpShiftRightLogical %uint %23099 %uint_3\n      %15968 = OpIMul %uint %17722 %uint_3\n      %18268 = OpBitcast %int %15968\n      %14598 = OpImageFetch %v4uint %19954 %18268\n       %6376 = OpCompositeExtract %uint %14598 0\n      %17705 = OpConvertUToF %float %6376\n      %12314 = OpBitwiseAnd %uint %23099 %uint_7\n      %14345 = OpCompositeExtract %uint %14598 1\n      %16230 = OpIMul %uint %12314 %14345\n      %17759 = OpConvertUToF %float %16230\n      %22854 = OpFMul %float %17759 %float_0_125\n      %11948 = OpFAdd %float %17705 %22854\n       %6845 = OpFMul %float %11948 %float_1_52737048en05\n       %6923 = OpExtInst %float %1 FClamp %6845 %float_0 %float_1\n      %14371 = OpLoad %152 %xe_apply_gamma_ramp\n      %12884 = OpCompositeExtract %uint %11099 1\n      %17798 = OpShiftRightLogical %uint %12884 %uint_3\n      %15827 = OpIMul %uint %17798 %uint_3\n      %18887 = OpIAdd %uint %15827 %uint_1\n      %14460 = OpBitcast %int %18887\n      %17829 = OpImageFetch %v4uint %14371 %14460\n       %6377 = OpCompositeExtract %uint %17829 0\n      %17706 = OpConvertUToF %float %6377\n      %12315 = OpBitwiseAnd %uint %12884 %uint_7\n      %14346 = OpCompositeExtract %uint %17829 1\n      %16231 = OpIMul %uint %12315 %14346\n      %17760 = OpConvertUToF %float %16231\n      %22855 = OpFMul %float %17760 %float_0_125\n      %11949 = OpFAdd %float %17706 %22855\n       %6846 = OpFMul %float %11949 %float_1_52737048en05\n       %6924 = OpExtInst %float %1 FClamp %6846 %float_0 %float_1\n      %14372 = OpLoad %152 %xe_apply_gamma_ramp\n      %12885 = OpCompositeExtract %uint %11099 2\n      %17799 = OpShiftRightLogical %uint %12885 %uint_3\n      %15828 = OpIMul %uint %17799 %uint_3\n      %18888 = OpIAdd %uint %15828 %uint_2\n      %14461 = OpBitcast %int %18888\n      %17830 = OpImageFetch %v4uint %14372 %14461\n       %6378 = OpCompositeExtract %uint %17830 0\n      %17707 = OpConvertUToF %float %6378\n      %12316 = OpBitwiseAnd %uint %12885 %uint_7\n      %14347 = OpCompositeExtract %uint %17830 1\n      %16232 = OpIMul %uint %12316 %14347\n      %17761 = OpConvertUToF %float %16232\n      %22856 = OpFMul %float %17761 %float_0_125\n      %11950 = OpFAdd %float %17707 %22856\n       %7206 = OpFMul %float %11950 %float_1_52737048en05\n      %22346 = OpExtInst %float %1 FClamp %7206 %float_0 %float_1\n       %9223 = OpCompositeConstruct %v4float %6923 %6924 %22346 %float_1\n               OpStore %xe_apply_gamma_dest %9223\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t apply_gamma_pwl_ps[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006176, 0x00000000, 0x00020011,\n    0x00000001, 0x00020011, 0x0000002E, 0x0006000B, 0x00000001, 0x4C534C47,\n    0x6474732E, 0x3035342E, 0x00000000, 0x0003000E, 0x00000000, 0x00000001,\n    0x0007000F, 0x00000004, 0x0000161F, 0x6E69616D, 0x00000000, 0x00000C93,\n    0x00000CBA, 0x00030010, 0x0000161F, 0x00000007, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00060005, 0x00000C93, 0x465F6C67, 0x43676172, 0x64726F6F,\n    0x00000000, 0x00080005, 0x0000167F, 0x615F6578, 0x796C7070, 0x6D61675F,\n    0x735F616D, 0x6372756F, 0x00000065, 0x00070005, 0x00001739, 0x615F6578,\n    0x796C7070, 0x6D61675F, 0x725F616D, 0x00706D61, 0x00070005, 0x00000CBA,\n    0x615F6578, 0x796C7070, 0x6D61675F, 0x645F616D, 0x00747365, 0x00040047,\n    0x00000C93, 0x0000000B, 0x0000000F, 0x00040047, 0x0000167F, 0x00000021,\n    0x00000000, 0x00040047, 0x0000167F, 0x00000022, 0x00000001, 0x00040047,\n    0x00001739, 0x00000021, 0x00000000, 0x00040047, 0x00001739, 0x00000022,\n    0x00000000, 0x00040047, 0x00000CBA, 0x0000001E, 0x00000000, 0x00020013,\n    0x00000008, 0x00030021, 0x00000502, 0x00000008, 0x00030016, 0x0000000D,\n    0x00000020, 0x00040015, 0x0000000B, 0x00000020, 0x00000000, 0x00040017,\n    0x00000011, 0x0000000B, 0x00000002, 0x0004002B, 0x0000000D, 0x00000A0C,\n    0x00000000, 0x0004002B, 0x0000000D, 0x0000008A, 0x3F800000, 0x0004002B,\n    0x0000000B, 0x00000A1F, 0x00000007, 0x0004002B, 0x0000000B, 0x00000A0D,\n    0x00000001, 0x0004002B, 0x0000000D, 0x000001E0, 0x3E000000, 0x0004002B,\n    0x0000000D, 0x000009AA, 0x37802008, 0x00040017, 0x0000001D, 0x0000000D,\n    0x00000004, 0x00040020, 0x0000029A, 0x00000001, 0x0000001D, 0x0004003B,\n    0x0000029A, 0x00000C93, 0x00000001, 0x00040017, 0x00000013, 0x0000000D,\n    0x00000002, 0x00040017, 0x00000014, 0x0000000B, 0x00000003, 0x00090019,\n    0x00000096, 0x0000000D, 0x00000001, 0x00000000, 0x00000000, 0x00000000,\n    0x00000001, 0x00000000, 0x00040020, 0x00000313, 0x00000000, 0x00000096,\n    0x0004003B, 0x00000313, 0x0000167F, 0x00000000, 0x00040015, 0x0000000C,\n    0x00000020, 0x00000001, 0x00040017, 0x00000012, 0x0000000C, 0x00000002,\n    0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000, 0x00040017, 0x00000018,\n    0x0000000D, 0x00000003, 0x0004002B, 0x0000000D, 0x00000409, 0x447FC000,\n    0x0004002B, 0x0000000D, 0x000000FC, 0x3F000000, 0x00090019, 0x00000098,\n    0x0000000B, 0x00000005, 0x00000000, 0x00000000, 0x00000000, 0x00000001,\n    0x00000000, 0x00040020, 0x00000315, 0x00000000, 0x00000098, 0x0004003B,\n    0x00000315, 0x00001739, 0x00000000, 0x0004002B, 0x0000000B, 0x00000A13,\n    0x00000003, 0x00040017, 0x00000017, 0x0000000B, 0x00000004, 0x0004002B,\n    0x0000000B, 0x00000A10, 0x00000002, 0x00040020, 0x0000029B, 0x00000003,\n    0x0000001D, 0x0004003B, 0x0000029B, 0x00000CBA, 0x00000003, 0x0006002C,\n    0x00000018, 0x000003AB, 0x000000FC, 0x000000FC, 0x000000FC, 0x00050036,\n    0x00000008, 0x0000161F, 0x00000000, 0x00000502, 0x000200F8, 0x00006175,\n    0x0004003D, 0x0000001D, 0x00004878, 0x00000C93, 0x0007004F, 0x00000013,\n    0x00003719, 0x00004878, 0x00004878, 0x00000000, 0x00000001, 0x0004006D,\n    0x00000011, 0x000021DB, 0x00003719, 0x0004003D, 0x00000096, 0x000054A1,\n    0x0000167F, 0x0004007C, 0x00000012, 0x00002B77, 0x000021DB, 0x0007005F,\n    0x0000001D, 0x00001A18, 0x000054A1, 0x00002B77, 0x00000002, 0x00000A0B,\n    0x0008004F, 0x00000018, 0x00003F72, 0x00001A18, 0x00001A18, 0x00000000,\n    0x00000001, 0x00000002, 0x0005008E, 0x00000018, 0x00003653, 0x00003F72,\n    0x00000409, 0x00050081, 0x00000018, 0x000041F9, 0x00003653, 0x000003AB,\n    0x0004006D, 0x00000014, 0x00002B5B, 0x000041F9, 0x0004003D, 0x00000098,\n    0x00004DF2, 0x00001739, 0x00050051, 0x0000000B, 0x00005A3B, 0x00002B5B,\n    0x00000000, 0x000500C2, 0x0000000B, 0x0000453A, 0x00005A3B, 0x00000A13,\n    0x00050084, 0x0000000B, 0x00003E60, 0x0000453A, 0x00000A13, 0x0004007C,\n    0x0000000C, 0x0000475C, 0x00003E60, 0x0005005F, 0x00000017, 0x00003906,\n    0x00004DF2, 0x0000475C, 0x00050051, 0x0000000B, 0x000018E8, 0x00003906,\n    0x00000000, 0x00040070, 0x0000000D, 0x00004529, 0x000018E8, 0x000500C7,\n    0x0000000B, 0x0000301A, 0x00005A3B, 0x00000A1F, 0x00050051, 0x0000000B,\n    0x00003809, 0x00003906, 0x00000001, 0x00050084, 0x0000000B, 0x00003F66,\n    0x0000301A, 0x00003809, 0x00040070, 0x0000000D, 0x0000455F, 0x00003F66,\n    0x00050085, 0x0000000D, 0x00005946, 0x0000455F, 0x000001E0, 0x00050081,\n    0x0000000D, 0x00002EAC, 0x00004529, 0x00005946, 0x00050085, 0x0000000D,\n    0x00001ABD, 0x00002EAC, 0x000009AA, 0x0008000C, 0x0000000D, 0x00001B0B,\n    0x00000001, 0x0000002B, 0x00001ABD, 0x00000A0C, 0x0000008A, 0x0004003D,\n    0x00000098, 0x00003823, 0x00001739, 0x00050051, 0x0000000B, 0x00003254,\n    0x00002B5B, 0x00000001, 0x000500C2, 0x0000000B, 0x00004586, 0x00003254,\n    0x00000A13, 0x00050084, 0x0000000B, 0x00003DD3, 0x00004586, 0x00000A13,\n    0x00050080, 0x0000000B, 0x000049C7, 0x00003DD3, 0x00000A0D, 0x0004007C,\n    0x0000000C, 0x0000387C, 0x000049C7, 0x0005005F, 0x00000017, 0x000045A5,\n    0x00003823, 0x0000387C, 0x00050051, 0x0000000B, 0x000018E9, 0x000045A5,\n    0x00000000, 0x00040070, 0x0000000D, 0x0000452A, 0x000018E9, 0x000500C7,\n    0x0000000B, 0x0000301B, 0x00003254, 0x00000A1F, 0x00050051, 0x0000000B,\n    0x0000380A, 0x000045A5, 0x00000001, 0x00050084, 0x0000000B, 0x00003F67,\n    0x0000301B, 0x0000380A, 0x00040070, 0x0000000D, 0x00004560, 0x00003F67,\n    0x00050085, 0x0000000D, 0x00005947, 0x00004560, 0x000001E0, 0x00050081,\n    0x0000000D, 0x00002EAD, 0x0000452A, 0x00005947, 0x00050085, 0x0000000D,\n    0x00001ABE, 0x00002EAD, 0x000009AA, 0x0008000C, 0x0000000D, 0x00001B0C,\n    0x00000001, 0x0000002B, 0x00001ABE, 0x00000A0C, 0x0000008A, 0x0004003D,\n    0x00000098, 0x00003824, 0x00001739, 0x00050051, 0x0000000B, 0x00003255,\n    0x00002B5B, 0x00000002, 0x000500C2, 0x0000000B, 0x00004587, 0x00003255,\n    0x00000A13, 0x00050084, 0x0000000B, 0x00003DD4, 0x00004587, 0x00000A13,\n    0x00050080, 0x0000000B, 0x000049C8, 0x00003DD4, 0x00000A10, 0x0004007C,\n    0x0000000C, 0x0000387D, 0x000049C8, 0x0005005F, 0x00000017, 0x000045A6,\n    0x00003824, 0x0000387D, 0x00050051, 0x0000000B, 0x000018EA, 0x000045A6,\n    0x00000000, 0x00040070, 0x0000000D, 0x0000452B, 0x000018EA, 0x000500C7,\n    0x0000000B, 0x0000301C, 0x00003255, 0x00000A1F, 0x00050051, 0x0000000B,\n    0x0000380B, 0x000045A6, 0x00000001, 0x00050084, 0x0000000B, 0x00003F68,\n    0x0000301C, 0x0000380B, 0x00040070, 0x0000000D, 0x00004561, 0x00003F68,\n    0x00050085, 0x0000000D, 0x00005948, 0x00004561, 0x000001E0, 0x00050081,\n    0x0000000D, 0x00002EAE, 0x0000452B, 0x00005948, 0x00050085, 0x0000000D,\n    0x00001C26, 0x00002EAE, 0x000009AA, 0x0008000C, 0x0000000D, 0x0000574A,\n    0x00000001, 0x0000002B, 0x00001C26, 0x00000A0C, 0x0000008A, 0x00070050,\n    0x0000001D, 0x00002407, 0x00001B0B, 0x00001B0C, 0x0000574A, 0x0000008A,\n    0x0003003E, 0x00000CBA, 0x00002407, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/apply_gamma_table_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 24689\n; Schema: 0\n               OpCapability Shader\n               OpCapability SampledBuffer\n               OpCapability StorageImageExtendedFormats\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 16 8 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_apply_gamma_size\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %xe_apply_gamma_source \"xe_apply_gamma_source\"\n               OpName %xe_apply_gamma_ramp \"xe_apply_gamma_ramp\"\n               OpName %xe_apply_gamma_dest \"xe_apply_gamma_dest\"\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpDecorate %xe_apply_gamma_source Binding 0\n               OpDecorate %xe_apply_gamma_source DescriptorSet 1\n               OpDecorate %xe_apply_gamma_ramp Binding 0\n               OpDecorate %xe_apply_gamma_ramp DescriptorSet 0\n               OpDecorate %xe_apply_gamma_dest NonReadable\n               OpDecorate %xe_apply_gamma_dest Binding 0\n               OpDecorate %xe_apply_gamma_dest DescriptorSet 2\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n     %v3uint = OpTypeVector %uint 3\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n%push_const_block_xe = OpTypeStruct %v2uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n        %int = OpTypeInt 32 1\n      %int_0 = OpConstant %int 0\n%_ptr_PushConstant_v2uint = OpTypePointer PushConstant %v2uint\n       %bool = OpTypeBool\n     %v2bool = OpTypeVector %bool 2\n      %float = OpTypeFloat 32\n        %150 = OpTypeImage %float 2D 0 0 0 1 Unknown\n%_ptr_UniformConstant_150 = OpTypePointer UniformConstant %150\n%xe_apply_gamma_source = OpVariable %_ptr_UniformConstant_150 UniformConstant\n      %v2int = OpTypeVector %int 2\n    %v4float = OpTypeVector %float 4\n    %v3float = OpTypeVector %float 3\n  %float_255 = OpConstant %float 255\n  %float_0_5 = OpConstant %float 0.5\n        %154 = OpTypeImage %float Buffer 0 0 0 1 Unknown\n%_ptr_UniformConstant_154 = OpTypePointer UniformConstant %154\n%xe_apply_gamma_ramp = OpVariable %_ptr_UniformConstant_154 UniformConstant\n     %uint_0 = OpConstant %uint 0\n     %uint_1 = OpConstant %uint 1\n    %float_1 = OpConstant %float 1\n        %166 = OpTypeImage %float 2D 0 0 0 2 Rgb10A2\n%_ptr_UniformConstant_166 = OpTypePointer UniformConstant %166\n%xe_apply_gamma_dest = OpVariable %_ptr_UniformConstant_166 UniformConstant\n    %uint_16 = OpConstant %uint 16\n     %uint_8 = OpConstant %uint 8\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_16 %uint_8 %uint_1\n        %939 = OpConstantComposite %v3float %float_0_5 %float_0_5 %float_0_5\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %21573 None\n               OpSwitch %uint_0 %12914\n      %12914 = OpLabel\n      %13761 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21717 = OpVectorShuffle %v2uint %13761 %13761 0 1\n       %7760 = OpAccessChain %_ptr_PushConstant_v2uint %push_consts_xe %int_0\n      %13378 = OpLoad %v2uint %7760\n      %23437 = OpUGreaterThanEqual %v2bool %21717 %13378\n      %23076 = OpAny %bool %23437\n               OpSelectionMerge %18302 DontFlatten\n               OpBranchConditional %23076 %21992 %18302\n      %21992 = OpLabel\n               OpBranch %21573\n      %18302 = OpLabel\n      %24004 = OpLoad %150 %xe_apply_gamma_source\n      %10533 = OpBitcast %v2int %21717\n       %6680 = OpImageFetch %v4float %24004 %10533 Lod %int_0\n      %16242 = OpVectorShuffle %v3float %6680 %6680 0 1 2\n      %13907 = OpVectorTimesScalar %v3float %16242 %float_255\n      %16889 = OpFAdd %v3float %13907 %939\n      %11099 = OpConvertFToU %v3uint %16889\n      %18624 = OpLoad %154 %xe_apply_gamma_ramp\n      %15435 = OpCompositeExtract %uint %11099 0\n      %24686 = OpBitcast %int %15435\n       %8011 = OpImageFetch %v4float %18624 %24686\n      %12957 = OpCompositeExtract %float %8011 2\n      %18146 = OpLoad %154 %xe_apply_gamma_ramp\n      %12224 = OpCompositeExtract %uint %11099 1\n      %24687 = OpBitcast %int %12224\n       %8012 = OpImageFetch %v4float %18146 %24687\n      %12958 = OpCompositeExtract %float %8012 1\n      %18147 = OpLoad %154 %xe_apply_gamma_ramp\n      %12225 = OpCompositeExtract %uint %11099 2\n      %24688 = OpBitcast %int %12225\n       %8372 = OpImageFetch %v4float %18147 %24688\n       %9290 = OpCompositeExtract %float %8372 0\n      %18032 = OpCompositeConstruct %v4float %12957 %12958 %9290 %float_1\n      %19279 = OpLoad %166 %xe_apply_gamma_dest\n               OpImageWrite %19279 %10533 %18032\n               OpBranch %21573\n      %21573 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t apply_gamma_table_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006071, 0x00000000, 0x00020011,\n    0x00000001, 0x00020011, 0x0000002E, 0x00020011, 0x00000031, 0x0006000B,\n    0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E, 0x00000000, 0x0003000E,\n    0x00000000, 0x00000001, 0x0006000F, 0x00000005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00000F48, 0x00060010, 0x0000161F, 0x00000011, 0x00000010,\n    0x00000008, 0x00000001, 0x00030003, 0x00000002, 0x000001CC, 0x00090004,\n    0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F, 0x5F776F6C, 0x72747461,\n    0x74756269, 0x00007365, 0x000B0004, 0x455F4C47, 0x735F5458, 0x6C706D61,\n    0x656C7265, 0x745F7373, 0x75747865, 0x665F6572, 0x74636E75, 0x736E6F69,\n    0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F, 0x70635F45, 0x74735F70,\n    0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365, 0x00006576, 0x00080004,\n    0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63, 0x69645F65, 0x74636572,\n    0x00657669, 0x00040005, 0x0000161F, 0x6E69616D, 0x00000000, 0x00080005,\n    0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F, 0x496E6F69,\n    0x00000044, 0x00070005, 0x000003E1, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x00080006, 0x000003E1, 0x00000000, 0x615F6578,\n    0x796C7070, 0x6D61675F, 0x735F616D, 0x00657A69, 0x00060005, 0x00000CE9,\n    0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578, 0x00080005, 0x0000167F,\n    0x615F6578, 0x796C7070, 0x6D61675F, 0x735F616D, 0x6372756F, 0x00000065,\n    0x00070005, 0x00001739, 0x615F6578, 0x796C7070, 0x6D61675F, 0x725F616D,\n    0x00706D61, 0x00070005, 0x00000CBA, 0x615F6578, 0x796C7070, 0x6D61675F,\n    0x645F616D, 0x00747365, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C,\n    0x00030047, 0x000003E1, 0x00000002, 0x00050048, 0x000003E1, 0x00000000,\n    0x00000023, 0x00000000, 0x00040047, 0x0000167F, 0x00000021, 0x00000000,\n    0x00040047, 0x0000167F, 0x00000022, 0x00000001, 0x00040047, 0x00001739,\n    0x00000021, 0x00000000, 0x00040047, 0x00001739, 0x00000022, 0x00000000,\n    0x00030047, 0x00000CBA, 0x00000019, 0x00040047, 0x00000CBA, 0x00000021,\n    0x00000000, 0x00040047, 0x00000CBA, 0x00000022, 0x00000002, 0x00040047,\n    0x00000B0F, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x00040020, 0x00000291, 0x00000001, 0x00000014,\n    0x0004003B, 0x00000291, 0x00000F48, 0x00000001, 0x0003001E, 0x000003E1,\n    0x00000011, 0x00040020, 0x0000065E, 0x00000009, 0x000003E1, 0x0004003B,\n    0x0000065E, 0x00000CE9, 0x00000009, 0x00040015, 0x0000000C, 0x00000020,\n    0x00000001, 0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000, 0x00040020,\n    0x0000028E, 0x00000009, 0x00000011, 0x00020014, 0x00000009, 0x00040017,\n    0x0000000F, 0x00000009, 0x00000002, 0x00030016, 0x0000000D, 0x00000020,\n    0x00090019, 0x00000096, 0x0000000D, 0x00000001, 0x00000000, 0x00000000,\n    0x00000000, 0x00000001, 0x00000000, 0x00040020, 0x00000313, 0x00000000,\n    0x00000096, 0x0004003B, 0x00000313, 0x0000167F, 0x00000000, 0x00040017,\n    0x00000012, 0x0000000C, 0x00000002, 0x00040017, 0x0000001D, 0x0000000D,\n    0x00000004, 0x00040017, 0x00000018, 0x0000000D, 0x00000003, 0x0004002B,\n    0x0000000D, 0x00000540, 0x437F0000, 0x0004002B, 0x0000000D, 0x000000FC,\n    0x3F000000, 0x00090019, 0x0000009A, 0x0000000D, 0x00000005, 0x00000000,\n    0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x00040020, 0x00000317,\n    0x00000000, 0x0000009A, 0x0004003B, 0x00000317, 0x00001739, 0x00000000,\n    0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000, 0x0004002B, 0x0000000B,\n    0x00000A0D, 0x00000001, 0x0004002B, 0x0000000D, 0x0000008A, 0x3F800000,\n    0x00090019, 0x000000A6, 0x0000000D, 0x00000001, 0x00000000, 0x00000000,\n    0x00000000, 0x00000002, 0x0000000B, 0x00040020, 0x00000323, 0x00000000,\n    0x000000A6, 0x0004003B, 0x00000323, 0x00000CBA, 0x00000000, 0x0004002B,\n    0x0000000B, 0x00000A3A, 0x00000010, 0x0004002B, 0x0000000B, 0x00000A22,\n    0x00000008, 0x0006002C, 0x00000014, 0x00000B0F, 0x00000A3A, 0x00000A22,\n    0x00000A0D, 0x0006002C, 0x00000018, 0x000003AB, 0x000000FC, 0x000000FC,\n    0x000000FC, 0x00050036, 0x00000008, 0x0000161F, 0x00000000, 0x00000502,\n    0x000200F8, 0x00003B06, 0x000300F7, 0x00005445, 0x00000000, 0x000300FB,\n    0x00000A0A, 0x00003272, 0x000200F8, 0x00003272, 0x0004003D, 0x00000014,\n    0x000035C1, 0x00000F48, 0x0007004F, 0x00000011, 0x000054D5, 0x000035C1,\n    0x000035C1, 0x00000000, 0x00000001, 0x00050041, 0x0000028E, 0x00001E50,\n    0x00000CE9, 0x00000A0B, 0x0004003D, 0x00000011, 0x00003442, 0x00001E50,\n    0x000500AE, 0x0000000F, 0x00005B8D, 0x000054D5, 0x00003442, 0x0004009A,\n    0x00000009, 0x00005A24, 0x00005B8D, 0x000300F7, 0x0000477E, 0x00000002,\n    0x000400FA, 0x00005A24, 0x000055E8, 0x0000477E, 0x000200F8, 0x000055E8,\n    0x000200F9, 0x00005445, 0x000200F8, 0x0000477E, 0x0004003D, 0x00000096,\n    0x00005DC4, 0x0000167F, 0x0004007C, 0x00000012, 0x00002925, 0x000054D5,\n    0x0007005F, 0x0000001D, 0x00001A18, 0x00005DC4, 0x00002925, 0x00000002,\n    0x00000A0B, 0x0008004F, 0x00000018, 0x00003F72, 0x00001A18, 0x00001A18,\n    0x00000000, 0x00000001, 0x00000002, 0x0005008E, 0x00000018, 0x00003653,\n    0x00003F72, 0x00000540, 0x00050081, 0x00000018, 0x000041F9, 0x00003653,\n    0x000003AB, 0x0004006D, 0x00000014, 0x00002B5B, 0x000041F9, 0x0004003D,\n    0x0000009A, 0x000048C0, 0x00001739, 0x00050051, 0x0000000B, 0x00003C4B,\n    0x00002B5B, 0x00000000, 0x0004007C, 0x0000000C, 0x0000606E, 0x00003C4B,\n    0x0005005F, 0x0000001D, 0x00001F4B, 0x000048C0, 0x0000606E, 0x00050051,\n    0x0000000D, 0x0000329D, 0x00001F4B, 0x00000002, 0x0004003D, 0x0000009A,\n    0x000046E2, 0x00001739, 0x00050051, 0x0000000B, 0x00002FC0, 0x00002B5B,\n    0x00000001, 0x0004007C, 0x0000000C, 0x0000606F, 0x00002FC0, 0x0005005F,\n    0x0000001D, 0x00001F4C, 0x000046E2, 0x0000606F, 0x00050051, 0x0000000D,\n    0x0000329E, 0x00001F4C, 0x00000001, 0x0004003D, 0x0000009A, 0x000046E3,\n    0x00001739, 0x00050051, 0x0000000B, 0x00002FC1, 0x00002B5B, 0x00000002,\n    0x0004007C, 0x0000000C, 0x00006070, 0x00002FC1, 0x0005005F, 0x0000001D,\n    0x000020B4, 0x000046E3, 0x00006070, 0x00050051, 0x0000000D, 0x0000244A,\n    0x000020B4, 0x00000000, 0x00070050, 0x0000001D, 0x00004670, 0x0000329D,\n    0x0000329E, 0x0000244A, 0x0000008A, 0x0004003D, 0x000000A6, 0x00004B4F,\n    0x00000CBA, 0x00040063, 0x00004B4F, 0x00002925, 0x00004670, 0x000200F9,\n    0x00005445, 0x000200F8, 0x00005445, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/apply_gamma_table_fxaa_luma_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 24802\n; Schema: 0\n               OpCapability Shader\n               OpCapability SampledBuffer\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 16 8 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_apply_gamma_size\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %xe_apply_gamma_source \"xe_apply_gamma_source\"\n               OpName %xe_apply_gamma_ramp \"xe_apply_gamma_ramp\"\n               OpName %xe_apply_gamma_dest \"xe_apply_gamma_dest\"\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpDecorate %xe_apply_gamma_source Binding 0\n               OpDecorate %xe_apply_gamma_source DescriptorSet 1\n               OpDecorate %xe_apply_gamma_ramp Binding 0\n               OpDecorate %xe_apply_gamma_ramp DescriptorSet 0\n               OpDecorate %xe_apply_gamma_dest NonReadable\n               OpDecorate %xe_apply_gamma_dest Binding 0\n               OpDecorate %xe_apply_gamma_dest DescriptorSet 2\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n     %v3uint = OpTypeVector %uint 3\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n%push_const_block_xe = OpTypeStruct %v2uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n        %int = OpTypeInt 32 1\n      %int_0 = OpConstant %int 0\n%_ptr_PushConstant_v2uint = OpTypePointer PushConstant %v2uint\n       %bool = OpTypeBool\n     %v2bool = OpTypeVector %bool 2\n      %float = OpTypeFloat 32\n        %150 = OpTypeImage %float 2D 0 0 0 1 Unknown\n%_ptr_UniformConstant_150 = OpTypePointer UniformConstant %150\n%xe_apply_gamma_source = OpVariable %_ptr_UniformConstant_150 UniformConstant\n      %v2int = OpTypeVector %int 2\n    %v4float = OpTypeVector %float 4\n    %v3float = OpTypeVector %float 3\n  %float_255 = OpConstant %float 255\n  %float_0_5 = OpConstant %float 0.5\n        %154 = OpTypeImage %float Buffer 0 0 0 1 Unknown\n%_ptr_UniformConstant_154 = OpTypePointer UniformConstant %154\n%xe_apply_gamma_ramp = OpVariable %_ptr_UniformConstant_154 UniformConstant\n     %uint_0 = OpConstant %uint 0\n     %uint_1 = OpConstant %uint 1\n%float_0_298999995 = OpConstant %float 0.298999995\n%float_0_587000012 = OpConstant %float 0.587000012\n%float_0_114 = OpConstant %float 0.114\n       %1268 = OpConstantComposite %v3float %float_0_298999995 %float_0_587000012 %float_0_114\n        %166 = OpTypeImage %float 2D 0 0 0 2 Rgba16f\n%_ptr_UniformConstant_166 = OpTypePointer UniformConstant %166\n%xe_apply_gamma_dest = OpVariable %_ptr_UniformConstant_166 UniformConstant\n    %uint_16 = OpConstant %uint 16\n     %uint_8 = OpConstant %uint 8\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_16 %uint_8 %uint_1\n        %939 = OpConstantComposite %v3float %float_0_5 %float_0_5 %float_0_5\n          %2 = OpUndef %v4float\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %21573 None\n               OpSwitch %uint_0 %12914\n      %12914 = OpLabel\n      %13761 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21717 = OpVectorShuffle %v2uint %13761 %13761 0 1\n       %7760 = OpAccessChain %_ptr_PushConstant_v2uint %push_consts_xe %int_0\n      %13378 = OpLoad %v2uint %7760\n      %23437 = OpUGreaterThanEqual %v2bool %21717 %13378\n      %23076 = OpAny %bool %23437\n               OpSelectionMerge %18302 DontFlatten\n               OpBranchConditional %23076 %21992 %18302\n      %21992 = OpLabel\n               OpBranch %21573\n      %18302 = OpLabel\n      %24004 = OpLoad %150 %xe_apply_gamma_source\n      %10533 = OpBitcast %v2int %21717\n       %6680 = OpImageFetch %v4float %24004 %10533 Lod %int_0\n      %16242 = OpVectorShuffle %v3float %6680 %6680 0 1 2\n      %13907 = OpVectorTimesScalar %v3float %16242 %float_255\n      %16889 = OpFAdd %v3float %13907 %939\n      %11099 = OpConvertFToU %v3uint %16889\n      %18624 = OpLoad %154 %xe_apply_gamma_ramp\n      %15435 = OpCompositeExtract %uint %11099 0\n      %24686 = OpBitcast %int %15435\n       %8410 = OpImageFetch %v4float %18624 %24686\n       %8944 = OpCompositeExtract %float %8410 2\n      %20375 = OpCompositeInsert %v4float %8944 %2 0\n      %19520 = OpLoad %154 %xe_apply_gamma_ramp\n       %9802 = OpCompositeExtract %uint %11099 1\n      %24687 = OpBitcast %int %9802\n       %8411 = OpImageFetch %v4float %19520 %24687\n       %8945 = OpCompositeExtract %float %8411 1\n      %20376 = OpCompositeInsert %v4float %8945 %20375 1\n      %19521 = OpLoad %154 %xe_apply_gamma_ramp\n       %9803 = OpCompositeExtract %uint %11099 2\n      %24688 = OpBitcast %int %9803\n       %8412 = OpImageFetch %v4float %19521 %24688\n       %9286 = OpCompositeExtract %float %8412 0\n      %18534 = OpCompositeInsert %v4float %9286 %20376 2\n      %24801 = OpVectorShuffle %v3float %18534 %18534 0 1 2\n       %9657 = OpDot %float %24801 %1268\n      %18930 = OpCompositeConstruct %v4float %8944 %8945 %9286 %9657\n      %12273 = OpLoad %166 %xe_apply_gamma_dest\n               OpImageWrite %12273 %10533 %18930\n               OpBranch %21573\n      %21573 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t apply_gamma_table_fxaa_luma_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x000060E2, 0x00000000, 0x00020011,\n    0x00000001, 0x00020011, 0x0000002E, 0x0006000B, 0x00000001, 0x4C534C47,\n    0x6474732E, 0x3035342E, 0x00000000, 0x0003000E, 0x00000000, 0x00000001,\n    0x0006000F, 0x00000005, 0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48,\n    0x00060010, 0x0000161F, 0x00000011, 0x00000010, 0x00000008, 0x00000001,\n    0x00030003, 0x00000002, 0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458,\n    0x72746E6F, 0x665F6C6F, 0x5F776F6C, 0x72747461, 0x74756269, 0x00007365,\n    0x000B0004, 0x455F4C47, 0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373,\n    0x75747865, 0x665F6572, 0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004,\n    0x475F4C47, 0x4C474F4F, 0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C,\n    0x7269645F, 0x69746365, 0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F,\n    0x6E695F45, 0x64756C63, 0x69645F65, 0x74636572, 0x00657669, 0x00040005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00080005, 0x00000F48, 0x475F6C67,\n    0x61626F6C, 0x766E496C, 0x7461636F, 0x496E6F69, 0x00000044, 0x00070005,\n    0x000003E1, 0x68737570, 0x6E6F635F, 0x625F7473, 0x6B636F6C, 0x0065785F,\n    0x00080006, 0x000003E1, 0x00000000, 0x615F6578, 0x796C7070, 0x6D61675F,\n    0x735F616D, 0x00657A69, 0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F,\n    0x5F737473, 0x00006578, 0x00080005, 0x0000167F, 0x615F6578, 0x796C7070,\n    0x6D61675F, 0x735F616D, 0x6372756F, 0x00000065, 0x00070005, 0x00001739,\n    0x615F6578, 0x796C7070, 0x6D61675F, 0x725F616D, 0x00706D61, 0x00070005,\n    0x00000CBA, 0x615F6578, 0x796C7070, 0x6D61675F, 0x645F616D, 0x00747365,\n    0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00030047, 0x000003E1,\n    0x00000002, 0x00050048, 0x000003E1, 0x00000000, 0x00000023, 0x00000000,\n    0x00040047, 0x0000167F, 0x00000021, 0x00000000, 0x00040047, 0x0000167F,\n    0x00000022, 0x00000001, 0x00040047, 0x00001739, 0x00000021, 0x00000000,\n    0x00040047, 0x00001739, 0x00000022, 0x00000000, 0x00030047, 0x00000CBA,\n    0x00000019, 0x00040047, 0x00000CBA, 0x00000021, 0x00000000, 0x00040047,\n    0x00000CBA, 0x00000022, 0x00000002, 0x00040047, 0x00000B0F, 0x0000000B,\n    0x00000019, 0x00020013, 0x00000008, 0x00030021, 0x00000502, 0x00000008,\n    0x00040015, 0x0000000B, 0x00000020, 0x00000000, 0x00040017, 0x00000011,\n    0x0000000B, 0x00000002, 0x00040017, 0x00000014, 0x0000000B, 0x00000003,\n    0x00040020, 0x00000291, 0x00000001, 0x00000014, 0x0004003B, 0x00000291,\n    0x00000F48, 0x00000001, 0x0003001E, 0x000003E1, 0x00000011, 0x00040020,\n    0x0000065E, 0x00000009, 0x000003E1, 0x0004003B, 0x0000065E, 0x00000CE9,\n    0x00000009, 0x00040015, 0x0000000C, 0x00000020, 0x00000001, 0x0004002B,\n    0x0000000C, 0x00000A0B, 0x00000000, 0x00040020, 0x0000028E, 0x00000009,\n    0x00000011, 0x00020014, 0x00000009, 0x00040017, 0x0000000F, 0x00000009,\n    0x00000002, 0x00030016, 0x0000000D, 0x00000020, 0x00090019, 0x00000096,\n    0x0000000D, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000001,\n    0x00000000, 0x00040020, 0x00000313, 0x00000000, 0x00000096, 0x0004003B,\n    0x00000313, 0x0000167F, 0x00000000, 0x00040017, 0x00000012, 0x0000000C,\n    0x00000002, 0x00040017, 0x0000001D, 0x0000000D, 0x00000004, 0x00040017,\n    0x00000018, 0x0000000D, 0x00000003, 0x0004002B, 0x0000000D, 0x00000540,\n    0x437F0000, 0x0004002B, 0x0000000D, 0x000000FC, 0x3F000000, 0x00090019,\n    0x0000009A, 0x0000000D, 0x00000005, 0x00000000, 0x00000000, 0x00000000,\n    0x00000001, 0x00000000, 0x00040020, 0x00000317, 0x00000000, 0x0000009A,\n    0x0004003B, 0x00000317, 0x00001739, 0x00000000, 0x0004002B, 0x0000000B,\n    0x00000A0A, 0x00000000, 0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001,\n    0x0004002B, 0x0000000D, 0x00000351, 0x3E991687, 0x0004002B, 0x0000000D,\n    0x00000458, 0x3F1645A2, 0x0004002B, 0x0000000D, 0x000001DC, 0x3DE978D5,\n    0x0006002C, 0x00000018, 0x000004F4, 0x00000351, 0x00000458, 0x000001DC,\n    0x00090019, 0x000000A6, 0x0000000D, 0x00000001, 0x00000000, 0x00000000,\n    0x00000000, 0x00000002, 0x00000002, 0x00040020, 0x00000323, 0x00000000,\n    0x000000A6, 0x0004003B, 0x00000323, 0x00000CBA, 0x00000000, 0x0004002B,\n    0x0000000B, 0x00000A3A, 0x00000010, 0x0004002B, 0x0000000B, 0x00000A22,\n    0x00000008, 0x0006002C, 0x00000014, 0x00000B0F, 0x00000A3A, 0x00000A22,\n    0x00000A0D, 0x0006002C, 0x00000018, 0x000003AB, 0x000000FC, 0x000000FC,\n    0x000000FC, 0x00030001, 0x0000001D, 0x00000002, 0x00050036, 0x00000008,\n    0x0000161F, 0x00000000, 0x00000502, 0x000200F8, 0x00003B06, 0x000300F7,\n    0x00005445, 0x00000000, 0x000300FB, 0x00000A0A, 0x00003272, 0x000200F8,\n    0x00003272, 0x0004003D, 0x00000014, 0x000035C1, 0x00000F48, 0x0007004F,\n    0x00000011, 0x000054D5, 0x000035C1, 0x000035C1, 0x00000000, 0x00000001,\n    0x00050041, 0x0000028E, 0x00001E50, 0x00000CE9, 0x00000A0B, 0x0004003D,\n    0x00000011, 0x00003442, 0x00001E50, 0x000500AE, 0x0000000F, 0x00005B8D,\n    0x000054D5, 0x00003442, 0x0004009A, 0x00000009, 0x00005A24, 0x00005B8D,\n    0x000300F7, 0x0000477E, 0x00000002, 0x000400FA, 0x00005A24, 0x000055E8,\n    0x0000477E, 0x000200F8, 0x000055E8, 0x000200F9, 0x00005445, 0x000200F8,\n    0x0000477E, 0x0004003D, 0x00000096, 0x00005DC4, 0x0000167F, 0x0004007C,\n    0x00000012, 0x00002925, 0x000054D5, 0x0007005F, 0x0000001D, 0x00001A18,\n    0x00005DC4, 0x00002925, 0x00000002, 0x00000A0B, 0x0008004F, 0x00000018,\n    0x00003F72, 0x00001A18, 0x00001A18, 0x00000000, 0x00000001, 0x00000002,\n    0x0005008E, 0x00000018, 0x00003653, 0x00003F72, 0x00000540, 0x00050081,\n    0x00000018, 0x000041F9, 0x00003653, 0x000003AB, 0x0004006D, 0x00000014,\n    0x00002B5B, 0x000041F9, 0x0004003D, 0x0000009A, 0x000048C0, 0x00001739,\n    0x00050051, 0x0000000B, 0x00003C4B, 0x00002B5B, 0x00000000, 0x0004007C,\n    0x0000000C, 0x0000606E, 0x00003C4B, 0x0005005F, 0x0000001D, 0x000020DA,\n    0x000048C0, 0x0000606E, 0x00050051, 0x0000000D, 0x000022F0, 0x000020DA,\n    0x00000002, 0x00060052, 0x0000001D, 0x00004F97, 0x000022F0, 0x00000002,\n    0x00000000, 0x0004003D, 0x0000009A, 0x00004C40, 0x00001739, 0x00050051,\n    0x0000000B, 0x0000264A, 0x00002B5B, 0x00000001, 0x0004007C, 0x0000000C,\n    0x0000606F, 0x0000264A, 0x0005005F, 0x0000001D, 0x000020DB, 0x00004C40,\n    0x0000606F, 0x00050051, 0x0000000D, 0x000022F1, 0x000020DB, 0x00000001,\n    0x00060052, 0x0000001D, 0x00004F98, 0x000022F1, 0x00004F97, 0x00000001,\n    0x0004003D, 0x0000009A, 0x00004C41, 0x00001739, 0x00050051, 0x0000000B,\n    0x0000264B, 0x00002B5B, 0x00000002, 0x0004007C, 0x0000000C, 0x00006070,\n    0x0000264B, 0x0005005F, 0x0000001D, 0x000020DC, 0x00004C41, 0x00006070,\n    0x00050051, 0x0000000D, 0x00002446, 0x000020DC, 0x00000000, 0x00060052,\n    0x0000001D, 0x00004866, 0x00002446, 0x00004F98, 0x00000002, 0x0008004F,\n    0x00000018, 0x000060E1, 0x00004866, 0x00004866, 0x00000000, 0x00000001,\n    0x00000002, 0x00050094, 0x0000000D, 0x000025B9, 0x000060E1, 0x000004F4,\n    0x00070050, 0x0000001D, 0x000049F2, 0x000022F0, 0x000022F1, 0x00002446,\n    0x000025B9, 0x0004003D, 0x000000A6, 0x00002FF1, 0x00000CBA, 0x00040063,\n    0x00002FF1, 0x00002925, 0x000049F2, 0x000200F9, 0x00005445, 0x000200F8,\n    0x00005445, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/apply_gamma_table_fxaa_luma_ps.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 24950\n; Schema: 0\n               OpCapability Shader\n               OpCapability SampledBuffer\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint Fragment %main \"main\" %gl_FragCoord %xe_apply_gamma_dest\n               OpExecutionMode %main OriginUpperLeft\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %gl_FragCoord \"gl_FragCoord\"\n               OpName %xe_apply_gamma_source \"xe_apply_gamma_source\"\n               OpName %xe_apply_gamma_ramp \"xe_apply_gamma_ramp\"\n               OpName %xe_apply_gamma_dest \"xe_apply_gamma_dest\"\n               OpDecorate %gl_FragCoord BuiltIn FragCoord\n               OpDecorate %xe_apply_gamma_source Binding 0\n               OpDecorate %xe_apply_gamma_source DescriptorSet 1\n               OpDecorate %xe_apply_gamma_ramp Binding 0\n               OpDecorate %xe_apply_gamma_ramp DescriptorSet 0\n               OpDecorate %xe_apply_gamma_dest Location 0\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n      %float = OpTypeFloat 32\n    %v4float = OpTypeVector %float 4\n%_ptr_Input_v4float = OpTypePointer Input %v4float\n%gl_FragCoord = OpVariable %_ptr_Input_v4float Input\n    %v2float = OpTypeVector %float 2\n     %v3uint = OpTypeVector %uint 3\n        %150 = OpTypeImage %float 2D 0 0 0 1 Unknown\n%_ptr_UniformConstant_150 = OpTypePointer UniformConstant %150\n%xe_apply_gamma_source = OpVariable %_ptr_UniformConstant_150 UniformConstant\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %int_0 = OpConstant %int 0\n    %v3float = OpTypeVector %float 3\n  %float_255 = OpConstant %float 255\n  %float_0_5 = OpConstant %float 0.5\n        %154 = OpTypeImage %float Buffer 0 0 0 1 Unknown\n%_ptr_UniformConstant_154 = OpTypePointer UniformConstant %154\n%xe_apply_gamma_ramp = OpVariable %_ptr_UniformConstant_154 UniformConstant\n%float_0_298999995 = OpConstant %float 0.298999995\n%float_0_587000012 = OpConstant %float 0.587000012\n%float_0_114 = OpConstant %float 0.114\n       %1268 = OpConstantComposite %v3float %float_0_298999995 %float_0_587000012 %float_0_114\n%_ptr_Output_v4float = OpTypePointer Output %v4float\n%xe_apply_gamma_dest = OpVariable %_ptr_Output_v4float Output\n        %939 = OpConstantComposite %v3float %float_0_5 %float_0_5 %float_0_5\n          %2 = OpUndef %v4float\n       %main = OpFunction %void None %1282\n      %24949 = OpLabel\n      %18552 = OpLoad %v4float %gl_FragCoord\n      %14105 = OpVectorShuffle %v2float %18552 %18552 0 1\n       %8667 = OpConvertFToU %v2uint %14105\n      %21665 = OpLoad %150 %xe_apply_gamma_source\n      %11127 = OpBitcast %v2int %8667\n       %6680 = OpImageFetch %v4float %21665 %11127 Lod %int_0\n      %16242 = OpVectorShuffle %v3float %6680 %6680 0 1 2\n      %13907 = OpVectorTimesScalar %v3float %16242 %float_255\n      %16889 = OpFAdd %v3float %13907 %939\n      %11099 = OpConvertFToU %v3uint %16889\n      %18624 = OpLoad %154 %xe_apply_gamma_ramp\n      %15435 = OpCompositeExtract %uint %11099 0\n      %24686 = OpBitcast %int %15435\n       %8410 = OpImageFetch %v4float %18624 %24686\n       %8944 = OpCompositeExtract %float %8410 2\n      %20375 = OpCompositeInsert %v4float %8944 %2 0\n      %19520 = OpLoad %154 %xe_apply_gamma_ramp\n       %9802 = OpCompositeExtract %uint %11099 1\n      %24687 = OpBitcast %int %9802\n       %8411 = OpImageFetch %v4float %19520 %24687\n       %8945 = OpCompositeExtract %float %8411 1\n      %20376 = OpCompositeInsert %v4float %8945 %20375 1\n      %19521 = OpLoad %154 %xe_apply_gamma_ramp\n       %9803 = OpCompositeExtract %uint %11099 2\n      %24688 = OpBitcast %int %9803\n       %8412 = OpImageFetch %v4float %19521 %24688\n       %9286 = OpCompositeExtract %float %8412 0\n      %18534 = OpCompositeInsert %v4float %9286 %20376 2\n      %24801 = OpVectorShuffle %v3float %18534 %18534 0 1 2\n       %9676 = OpDot %float %24801 %1268\n      %21683 = OpCompositeConstruct %v4float %8944 %8945 %9286 %9676\n               OpStore %xe_apply_gamma_dest %21683\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t apply_gamma_table_fxaa_luma_ps[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006176, 0x00000000, 0x00020011,\n    0x00000001, 0x00020011, 0x0000002E, 0x0006000B, 0x00000001, 0x4C534C47,\n    0x6474732E, 0x3035342E, 0x00000000, 0x0003000E, 0x00000000, 0x00000001,\n    0x0007000F, 0x00000004, 0x0000161F, 0x6E69616D, 0x00000000, 0x00000C93,\n    0x00000CBA, 0x00030010, 0x0000161F, 0x00000007, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00060005, 0x00000C93, 0x465F6C67, 0x43676172, 0x64726F6F,\n    0x00000000, 0x00080005, 0x0000167F, 0x615F6578, 0x796C7070, 0x6D61675F,\n    0x735F616D, 0x6372756F, 0x00000065, 0x00070005, 0x00001739, 0x615F6578,\n    0x796C7070, 0x6D61675F, 0x725F616D, 0x00706D61, 0x00070005, 0x00000CBA,\n    0x615F6578, 0x796C7070, 0x6D61675F, 0x645F616D, 0x00747365, 0x00040047,\n    0x00000C93, 0x0000000B, 0x0000000F, 0x00040047, 0x0000167F, 0x00000021,\n    0x00000000, 0x00040047, 0x0000167F, 0x00000022, 0x00000001, 0x00040047,\n    0x00001739, 0x00000021, 0x00000000, 0x00040047, 0x00001739, 0x00000022,\n    0x00000000, 0x00040047, 0x00000CBA, 0x0000001E, 0x00000000, 0x00020013,\n    0x00000008, 0x00030021, 0x00000502, 0x00000008, 0x00040015, 0x0000000B,\n    0x00000020, 0x00000000, 0x00040017, 0x00000011, 0x0000000B, 0x00000002,\n    0x00030016, 0x0000000D, 0x00000020, 0x00040017, 0x0000001D, 0x0000000D,\n    0x00000004, 0x00040020, 0x0000029A, 0x00000001, 0x0000001D, 0x0004003B,\n    0x0000029A, 0x00000C93, 0x00000001, 0x00040017, 0x00000013, 0x0000000D,\n    0x00000002, 0x00040017, 0x00000014, 0x0000000B, 0x00000003, 0x00090019,\n    0x00000096, 0x0000000D, 0x00000001, 0x00000000, 0x00000000, 0x00000000,\n    0x00000001, 0x00000000, 0x00040020, 0x00000313, 0x00000000, 0x00000096,\n    0x0004003B, 0x00000313, 0x0000167F, 0x00000000, 0x00040015, 0x0000000C,\n    0x00000020, 0x00000001, 0x00040017, 0x00000012, 0x0000000C, 0x00000002,\n    0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000, 0x00040017, 0x00000018,\n    0x0000000D, 0x00000003, 0x0004002B, 0x0000000D, 0x00000540, 0x437F0000,\n    0x0004002B, 0x0000000D, 0x000000FC, 0x3F000000, 0x00090019, 0x0000009A,\n    0x0000000D, 0x00000005, 0x00000000, 0x00000000, 0x00000000, 0x00000001,\n    0x00000000, 0x00040020, 0x00000317, 0x00000000, 0x0000009A, 0x0004003B,\n    0x00000317, 0x00001739, 0x00000000, 0x0004002B, 0x0000000D, 0x00000351,\n    0x3E991687, 0x0004002B, 0x0000000D, 0x00000458, 0x3F1645A2, 0x0004002B,\n    0x0000000D, 0x000001DC, 0x3DE978D5, 0x0006002C, 0x00000018, 0x000004F4,\n    0x00000351, 0x00000458, 0x000001DC, 0x00040020, 0x0000029B, 0x00000003,\n    0x0000001D, 0x0004003B, 0x0000029B, 0x00000CBA, 0x00000003, 0x0006002C,\n    0x00000018, 0x000003AB, 0x000000FC, 0x000000FC, 0x000000FC, 0x00030001,\n    0x0000001D, 0x00000002, 0x00050036, 0x00000008, 0x0000161F, 0x00000000,\n    0x00000502, 0x000200F8, 0x00006175, 0x0004003D, 0x0000001D, 0x00004878,\n    0x00000C93, 0x0007004F, 0x00000013, 0x00003719, 0x00004878, 0x00004878,\n    0x00000000, 0x00000001, 0x0004006D, 0x00000011, 0x000021DB, 0x00003719,\n    0x0004003D, 0x00000096, 0x000054A1, 0x0000167F, 0x0004007C, 0x00000012,\n    0x00002B77, 0x000021DB, 0x0007005F, 0x0000001D, 0x00001A18, 0x000054A1,\n    0x00002B77, 0x00000002, 0x00000A0B, 0x0008004F, 0x00000018, 0x00003F72,\n    0x00001A18, 0x00001A18, 0x00000000, 0x00000001, 0x00000002, 0x0005008E,\n    0x00000018, 0x00003653, 0x00003F72, 0x00000540, 0x00050081, 0x00000018,\n    0x000041F9, 0x00003653, 0x000003AB, 0x0004006D, 0x00000014, 0x00002B5B,\n    0x000041F9, 0x0004003D, 0x0000009A, 0x000048C0, 0x00001739, 0x00050051,\n    0x0000000B, 0x00003C4B, 0x00002B5B, 0x00000000, 0x0004007C, 0x0000000C,\n    0x0000606E, 0x00003C4B, 0x0005005F, 0x0000001D, 0x000020DA, 0x000048C0,\n    0x0000606E, 0x00050051, 0x0000000D, 0x000022F0, 0x000020DA, 0x00000002,\n    0x00060052, 0x0000001D, 0x00004F97, 0x000022F0, 0x00000002, 0x00000000,\n    0x0004003D, 0x0000009A, 0x00004C40, 0x00001739, 0x00050051, 0x0000000B,\n    0x0000264A, 0x00002B5B, 0x00000001, 0x0004007C, 0x0000000C, 0x0000606F,\n    0x0000264A, 0x0005005F, 0x0000001D, 0x000020DB, 0x00004C40, 0x0000606F,\n    0x00050051, 0x0000000D, 0x000022F1, 0x000020DB, 0x00000001, 0x00060052,\n    0x0000001D, 0x00004F98, 0x000022F1, 0x00004F97, 0x00000001, 0x0004003D,\n    0x0000009A, 0x00004C41, 0x00001739, 0x00050051, 0x0000000B, 0x0000264B,\n    0x00002B5B, 0x00000002, 0x0004007C, 0x0000000C, 0x00006070, 0x0000264B,\n    0x0005005F, 0x0000001D, 0x000020DC, 0x00004C41, 0x00006070, 0x00050051,\n    0x0000000D, 0x00002446, 0x000020DC, 0x00000000, 0x00060052, 0x0000001D,\n    0x00004866, 0x00002446, 0x00004F98, 0x00000002, 0x0008004F, 0x00000018,\n    0x000060E1, 0x00004866, 0x00004866, 0x00000000, 0x00000001, 0x00000002,\n    0x00050094, 0x0000000D, 0x000025CC, 0x000060E1, 0x000004F4, 0x00070050,\n    0x0000001D, 0x000054B3, 0x000022F0, 0x000022F1, 0x00002446, 0x000025CC,\n    0x0003003E, 0x00000CBA, 0x000054B3, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/apply_gamma_table_ps.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 24950\n; Schema: 0\n               OpCapability Shader\n               OpCapability SampledBuffer\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint Fragment %main \"main\" %gl_FragCoord %xe_apply_gamma_dest\n               OpExecutionMode %main OriginUpperLeft\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %gl_FragCoord \"gl_FragCoord\"\n               OpName %xe_apply_gamma_source \"xe_apply_gamma_source\"\n               OpName %xe_apply_gamma_ramp \"xe_apply_gamma_ramp\"\n               OpName %xe_apply_gamma_dest \"xe_apply_gamma_dest\"\n               OpDecorate %gl_FragCoord BuiltIn FragCoord\n               OpDecorate %xe_apply_gamma_source Binding 0\n               OpDecorate %xe_apply_gamma_source DescriptorSet 1\n               OpDecorate %xe_apply_gamma_ramp Binding 0\n               OpDecorate %xe_apply_gamma_ramp DescriptorSet 0\n               OpDecorate %xe_apply_gamma_dest Location 0\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n      %float = OpTypeFloat 32\n    %v4float = OpTypeVector %float 4\n%_ptr_Input_v4float = OpTypePointer Input %v4float\n%gl_FragCoord = OpVariable %_ptr_Input_v4float Input\n    %v2float = OpTypeVector %float 2\n     %v3uint = OpTypeVector %uint 3\n        %150 = OpTypeImage %float 2D 0 0 0 1 Unknown\n%_ptr_UniformConstant_150 = OpTypePointer UniformConstant %150\n%xe_apply_gamma_source = OpVariable %_ptr_UniformConstant_150 UniformConstant\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %int_0 = OpConstant %int 0\n    %v3float = OpTypeVector %float 3\n  %float_255 = OpConstant %float 255\n  %float_0_5 = OpConstant %float 0.5\n        %154 = OpTypeImage %float Buffer 0 0 0 1 Unknown\n%_ptr_UniformConstant_154 = OpTypePointer UniformConstant %154\n%xe_apply_gamma_ramp = OpVariable %_ptr_UniformConstant_154 UniformConstant\n    %float_1 = OpConstant %float 1\n%_ptr_Output_v4float = OpTypePointer Output %v4float\n%xe_apply_gamma_dest = OpVariable %_ptr_Output_v4float Output\n        %939 = OpConstantComposite %v3float %float_0_5 %float_0_5 %float_0_5\n       %main = OpFunction %void None %1282\n      %24949 = OpLabel\n      %18552 = OpLoad %v4float %gl_FragCoord\n      %14105 = OpVectorShuffle %v2float %18552 %18552 0 1\n       %8667 = OpConvertFToU %v2uint %14105\n      %21665 = OpLoad %150 %xe_apply_gamma_source\n      %11127 = OpBitcast %v2int %8667\n       %6680 = OpImageFetch %v4float %21665 %11127 Lod %int_0\n      %16242 = OpVectorShuffle %v3float %6680 %6680 0 1 2\n      %13907 = OpVectorTimesScalar %v3float %16242 %float_255\n      %16889 = OpFAdd %v3float %13907 %939\n      %11099 = OpConvertFToU %v3uint %16889\n      %18624 = OpLoad %154 %xe_apply_gamma_ramp\n      %15435 = OpCompositeExtract %uint %11099 0\n      %24686 = OpBitcast %int %15435\n       %8011 = OpImageFetch %v4float %18624 %24686\n      %12957 = OpCompositeExtract %float %8011 2\n      %18146 = OpLoad %154 %xe_apply_gamma_ramp\n      %12224 = OpCompositeExtract %uint %11099 1\n      %24687 = OpBitcast %int %12224\n       %8012 = OpImageFetch %v4float %18146 %24687\n      %12958 = OpCompositeExtract %float %8012 1\n      %18147 = OpLoad %154 %xe_apply_gamma_ramp\n      %12225 = OpCompositeExtract %uint %11099 2\n      %24688 = OpBitcast %int %12225\n       %8372 = OpImageFetch %v4float %18147 %24688\n       %9309 = OpCompositeExtract %float %8372 0\n      %20785 = OpCompositeConstruct %v4float %12957 %12958 %9309 %float_1\n               OpStore %xe_apply_gamma_dest %20785\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t apply_gamma_table_ps[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006176, 0x00000000, 0x00020011,\n    0x00000001, 0x00020011, 0x0000002E, 0x0006000B, 0x00000001, 0x4C534C47,\n    0x6474732E, 0x3035342E, 0x00000000, 0x0003000E, 0x00000000, 0x00000001,\n    0x0007000F, 0x00000004, 0x0000161F, 0x6E69616D, 0x00000000, 0x00000C93,\n    0x00000CBA, 0x00030010, 0x0000161F, 0x00000007, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00060005, 0x00000C93, 0x465F6C67, 0x43676172, 0x64726F6F,\n    0x00000000, 0x00080005, 0x0000167F, 0x615F6578, 0x796C7070, 0x6D61675F,\n    0x735F616D, 0x6372756F, 0x00000065, 0x00070005, 0x00001739, 0x615F6578,\n    0x796C7070, 0x6D61675F, 0x725F616D, 0x00706D61, 0x00070005, 0x00000CBA,\n    0x615F6578, 0x796C7070, 0x6D61675F, 0x645F616D, 0x00747365, 0x00040047,\n    0x00000C93, 0x0000000B, 0x0000000F, 0x00040047, 0x0000167F, 0x00000021,\n    0x00000000, 0x00040047, 0x0000167F, 0x00000022, 0x00000001, 0x00040047,\n    0x00001739, 0x00000021, 0x00000000, 0x00040047, 0x00001739, 0x00000022,\n    0x00000000, 0x00040047, 0x00000CBA, 0x0000001E, 0x00000000, 0x00020013,\n    0x00000008, 0x00030021, 0x00000502, 0x00000008, 0x00040015, 0x0000000B,\n    0x00000020, 0x00000000, 0x00040017, 0x00000011, 0x0000000B, 0x00000002,\n    0x00030016, 0x0000000D, 0x00000020, 0x00040017, 0x0000001D, 0x0000000D,\n    0x00000004, 0x00040020, 0x0000029A, 0x00000001, 0x0000001D, 0x0004003B,\n    0x0000029A, 0x00000C93, 0x00000001, 0x00040017, 0x00000013, 0x0000000D,\n    0x00000002, 0x00040017, 0x00000014, 0x0000000B, 0x00000003, 0x00090019,\n    0x00000096, 0x0000000D, 0x00000001, 0x00000000, 0x00000000, 0x00000000,\n    0x00000001, 0x00000000, 0x00040020, 0x00000313, 0x00000000, 0x00000096,\n    0x0004003B, 0x00000313, 0x0000167F, 0x00000000, 0x00040015, 0x0000000C,\n    0x00000020, 0x00000001, 0x00040017, 0x00000012, 0x0000000C, 0x00000002,\n    0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000, 0x00040017, 0x00000018,\n    0x0000000D, 0x00000003, 0x0004002B, 0x0000000D, 0x00000540, 0x437F0000,\n    0x0004002B, 0x0000000D, 0x000000FC, 0x3F000000, 0x00090019, 0x0000009A,\n    0x0000000D, 0x00000005, 0x00000000, 0x00000000, 0x00000000, 0x00000001,\n    0x00000000, 0x00040020, 0x00000317, 0x00000000, 0x0000009A, 0x0004003B,\n    0x00000317, 0x00001739, 0x00000000, 0x0004002B, 0x0000000D, 0x0000008A,\n    0x3F800000, 0x00040020, 0x0000029B, 0x00000003, 0x0000001D, 0x0004003B,\n    0x0000029B, 0x00000CBA, 0x00000003, 0x0006002C, 0x00000018, 0x000003AB,\n    0x000000FC, 0x000000FC, 0x000000FC, 0x00050036, 0x00000008, 0x0000161F,\n    0x00000000, 0x00000502, 0x000200F8, 0x00006175, 0x0004003D, 0x0000001D,\n    0x00004878, 0x00000C93, 0x0007004F, 0x00000013, 0x00003719, 0x00004878,\n    0x00004878, 0x00000000, 0x00000001, 0x0004006D, 0x00000011, 0x000021DB,\n    0x00003719, 0x0004003D, 0x00000096, 0x000054A1, 0x0000167F, 0x0004007C,\n    0x00000012, 0x00002B77, 0x000021DB, 0x0007005F, 0x0000001D, 0x00001A18,\n    0x000054A1, 0x00002B77, 0x00000002, 0x00000A0B, 0x0008004F, 0x00000018,\n    0x00003F72, 0x00001A18, 0x00001A18, 0x00000000, 0x00000001, 0x00000002,\n    0x0005008E, 0x00000018, 0x00003653, 0x00003F72, 0x00000540, 0x00050081,\n    0x00000018, 0x000041F9, 0x00003653, 0x000003AB, 0x0004006D, 0x00000014,\n    0x00002B5B, 0x000041F9, 0x0004003D, 0x0000009A, 0x000048C0, 0x00001739,\n    0x00050051, 0x0000000B, 0x00003C4B, 0x00002B5B, 0x00000000, 0x0004007C,\n    0x0000000C, 0x0000606E, 0x00003C4B, 0x0005005F, 0x0000001D, 0x00001F4B,\n    0x000048C0, 0x0000606E, 0x00050051, 0x0000000D, 0x0000329D, 0x00001F4B,\n    0x00000002, 0x0004003D, 0x0000009A, 0x000046E2, 0x00001739, 0x00050051,\n    0x0000000B, 0x00002FC0, 0x00002B5B, 0x00000001, 0x0004007C, 0x0000000C,\n    0x0000606F, 0x00002FC0, 0x0005005F, 0x0000001D, 0x00001F4C, 0x000046E2,\n    0x0000606F, 0x00050051, 0x0000000D, 0x0000329E, 0x00001F4C, 0x00000001,\n    0x0004003D, 0x0000009A, 0x000046E3, 0x00001739, 0x00050051, 0x0000000B,\n    0x00002FC1, 0x00002B5B, 0x00000002, 0x0004007C, 0x0000000C, 0x00006070,\n    0x00002FC1, 0x0005005F, 0x0000001D, 0x000020B4, 0x000046E3, 0x00006070,\n    0x00050051, 0x0000000D, 0x0000245D, 0x000020B4, 0x00000000, 0x00070050,\n    0x0000001D, 0x00005131, 0x0000329D, 0x0000329E, 0x0000245D, 0x0000008A,\n    0x0003003E, 0x00000CBA, 0x00005131, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/fullscreen_cw_vs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 22213\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint Vertex %main \"main\" %_ %gl_VertexIndex\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %gl_PerVertex \"gl_PerVertex\"\n               OpMemberName %gl_PerVertex 0 \"gl_Position\"\n               OpMemberName %gl_PerVertex 1 \"gl_PointSize\"\n               OpMemberName %gl_PerVertex 2 \"gl_ClipDistance\"\n               OpMemberName %gl_PerVertex 3 \"gl_CullDistance\"\n               OpName %_ \"\"\n               OpName %gl_VertexIndex \"gl_VertexIndex\"\n               OpDecorate %gl_PerVertex Block\n               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position\n               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize\n               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance\n               OpMemberDecorate %gl_PerVertex 3 BuiltIn CullDistance\n               OpDecorate %gl_VertexIndex BuiltIn VertexIndex\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n      %float = OpTypeFloat 32\n    %v4float = OpTypeVector %float 4\n     %uint_1 = OpConstant %uint 1\n%_arr_float_uint_1 = OpTypeArray %float %uint_1\n%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1 %_arr_float_uint_1\n%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex\n          %_ = OpVariable %_ptr_Output_gl_PerVertex Output\n        %int = OpTypeInt 32 1\n      %int_0 = OpConstant %int 0\n%_ptr_Input_int = OpTypePointer Input %int\n%gl_VertexIndex = OpVariable %_ptr_Input_int Input\n     %uint_0 = OpConstant %uint 0\n       %1819 = OpConstantComposite %v2uint %uint_0 %uint_1\n    %v2float = OpTypeVector %float 2\n    %float_4 = OpConstant %float 4\n       %2183 = OpConstantComposite %v2float %float_4 %float_4\n   %float_n1 = OpConstant %float -1\n         %73 = OpConstantComposite %v2float %float_n1 %float_n1\n    %float_0 = OpConstant %float 0\n    %float_1 = OpConstant %float 1\n%_ptr_Output_v4float = OpTypePointer Output %v4float\n       %1828 = OpConstantComposite %v2uint %uint_1 %uint_1\n       %main = OpFunction %void None %1282\n       %6733 = OpLabel\n      %10216 = OpLoad %int %gl_VertexIndex\n      %15313 = OpBitcast %uint %10216\n      %15408 = OpCompositeConstruct %v2uint %15313 %15313\n      %14991 = OpShiftRightLogical %v2uint %15408 %1819\n      %18859 = OpBitwiseAnd %v2uint %14991 %1828\n      %16455 = OpConvertUToF %v2float %18859\n       %8403 = OpFMul %v2float %16455 %2183\n      %22212 = OpFAdd %v2float %8403 %73\n      %10599 = OpCompositeExtract %float %22212 0\n      %13956 = OpCompositeExtract %float %22212 1\n      %18260 = OpCompositeConstruct %v4float %10599 %13956 %float_0 %float_1\n      %12055 = OpAccessChain %_ptr_Output_v4float %_ %int_0\n               OpStore %12055 %18260\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t fullscreen_cw_vs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x000056C5, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0007000F, 0x00000000,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00001342, 0x00001029, 0x00030003,\n    0x00000002, 0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F,\n    0x665F6C6F, 0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004,\n    0x455F4C47, 0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865,\n    0x665F6572, 0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47,\n    0x4C474F4F, 0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F,\n    0x69746365, 0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45,\n    0x64756C63, 0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F,\n    0x6E69616D, 0x00000000, 0x00060005, 0x00000176, 0x505F6C67, 0x65567265,\n    0x78657472, 0x00000000, 0x00060006, 0x00000176, 0x00000000, 0x505F6C67,\n    0x7469736F, 0x006E6F69, 0x00070006, 0x00000176, 0x00000001, 0x505F6C67,\n    0x746E696F, 0x657A6953, 0x00000000, 0x00070006, 0x00000176, 0x00000002,\n    0x435F6C67, 0x4470696C, 0x61747369, 0x0065636E, 0x00070006, 0x00000176,\n    0x00000003, 0x435F6C67, 0x446C6C75, 0x61747369, 0x0065636E, 0x00030005,\n    0x00001342, 0x00000000, 0x00060005, 0x00001029, 0x565F6C67, 0x65747265,\n    0x646E4978, 0x00007865, 0x00030047, 0x00000176, 0x00000002, 0x00050048,\n    0x00000176, 0x00000000, 0x0000000B, 0x00000000, 0x00050048, 0x00000176,\n    0x00000001, 0x0000000B, 0x00000001, 0x00050048, 0x00000176, 0x00000002,\n    0x0000000B, 0x00000003, 0x00050048, 0x00000176, 0x00000003, 0x0000000B,\n    0x00000004, 0x00040047, 0x00001029, 0x0000000B, 0x0000002A, 0x00020013,\n    0x00000008, 0x00030021, 0x00000502, 0x00000008, 0x00040015, 0x0000000B,\n    0x00000020, 0x00000000, 0x00040017, 0x00000011, 0x0000000B, 0x00000002,\n    0x00030016, 0x0000000D, 0x00000020, 0x00040017, 0x0000001D, 0x0000000D,\n    0x00000004, 0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001, 0x0004001C,\n    0x0000025C, 0x0000000D, 0x00000A0D, 0x0006001E, 0x00000176, 0x0000001D,\n    0x0000000D, 0x0000025C, 0x0000025C, 0x00040020, 0x000003F3, 0x00000003,\n    0x00000176, 0x0004003B, 0x000003F3, 0x00001342, 0x00000003, 0x00040015,\n    0x0000000C, 0x00000020, 0x00000001, 0x0004002B, 0x0000000C, 0x00000A0B,\n    0x00000000, 0x00040020, 0x00000289, 0x00000001, 0x0000000C, 0x0004003B,\n    0x00000289, 0x00001029, 0x00000001, 0x0004002B, 0x0000000B, 0x00000A0A,\n    0x00000000, 0x0005002C, 0x00000011, 0x0000071B, 0x00000A0A, 0x00000A0D,\n    0x00040017, 0x00000013, 0x0000000D, 0x00000002, 0x0004002B, 0x0000000D,\n    0x00000B69, 0x40800000, 0x0005002C, 0x00000013, 0x00000887, 0x00000B69,\n    0x00000B69, 0x0004002B, 0x0000000D, 0x00000341, 0xBF800000, 0x0005002C,\n    0x00000013, 0x00000049, 0x00000341, 0x00000341, 0x0004002B, 0x0000000D,\n    0x00000A0C, 0x00000000, 0x0004002B, 0x0000000D, 0x0000008A, 0x3F800000,\n    0x00040020, 0x0000029A, 0x00000003, 0x0000001D, 0x0005002C, 0x00000011,\n    0x00000724, 0x00000A0D, 0x00000A0D, 0x00050036, 0x00000008, 0x0000161F,\n    0x00000000, 0x00000502, 0x000200F8, 0x00001A4D, 0x0004003D, 0x0000000C,\n    0x000027E8, 0x00001029, 0x0004007C, 0x0000000B, 0x00003BD1, 0x000027E8,\n    0x00050050, 0x00000011, 0x00003C30, 0x00003BD1, 0x00003BD1, 0x000500C2,\n    0x00000011, 0x00003A8F, 0x00003C30, 0x0000071B, 0x000500C7, 0x00000011,\n    0x000049AB, 0x00003A8F, 0x00000724, 0x00040070, 0x00000013, 0x00004047,\n    0x000049AB, 0x00050085, 0x00000013, 0x000020D3, 0x00004047, 0x00000887,\n    0x00050081, 0x00000013, 0x000056C4, 0x000020D3, 0x00000049, 0x00050051,\n    0x0000000D, 0x00002967, 0x000056C4, 0x00000000, 0x00050051, 0x0000000D,\n    0x00003684, 0x000056C4, 0x00000001, 0x00070050, 0x0000001D, 0x00004754,\n    0x00002967, 0x00003684, 0x00000A0C, 0x0000008A, 0x00050041, 0x0000029A,\n    0x00002F17, 0x00001342, 0x00000A0B, 0x0003003E, 0x00002F17, 0x00004754,\n    0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/host_depth_store_1xmsaa_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 24936\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 8 8 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_host_depth_store_rectangle\"\n               OpMemberName %push_const_block_xe 1 \"xe_host_depth_store_render_target\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_host_depth_store_dest_xe_block \"xe_host_depth_store_dest_xe_block\"\n               OpMemberName %xe_host_depth_store_dest_xe_block 0 \"data\"\n               OpName %xe_host_depth_store_dest \"xe_host_depth_store_dest\"\n               OpName %xe_host_depth_store_source \"xe_host_depth_store_source\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_host_depth_store_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_host_depth_store_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_host_depth_store_dest_xe_block 0 Offset 0\n               OpDecorate %xe_host_depth_store_dest NonReadable\n               OpDecorate %xe_host_depth_store_dest Binding 0\n               OpDecorate %xe_host_depth_store_dest DescriptorSet 0\n               OpDecorate %xe_host_depth_store_source Binding 0\n               OpDecorate %xe_host_depth_store_source DescriptorSet 1\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n       %bool = OpTypeBool\n     %uint_1 = OpConstant %uint 1\n     %uint_0 = OpConstant %uint 0\n    %uint_80 = OpConstant %uint 80\n    %uint_16 = OpConstant %uint 16\n       %2719 = OpConstantComposite %v2uint %uint_80 %uint_16\n        %int = OpTypeInt 32 1\n      %int_2 = OpConstant %int 2\n    %uint_10 = OpConstant %uint 10\n       %1927 = OpConstantComposite %v2uint %uint_0 %uint_10\n  %uint_1023 = OpConstant %uint 1023\n     %uint_3 = OpConstant %uint 3\n    %uint_20 = OpConstant %uint 20\n    %uint_13 = OpConstant %uint 13\n       %2053 = OpConstantComposite %v2uint %uint_10 %uint_13\n     %uint_7 = OpConstant %uint 7\n%push_const_block_xe = OpTypeStruct %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n      %int_0 = OpConstant %int 0\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n      %int_1 = OpConstant %int 1\n     %v3uint = OpTypeVector %uint 3\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n%_ptr_Input_uint = OpTypePointer Input %uint\n      %v2int = OpTypeVector %int 2\n       %1834 = OpConstantComposite %v2uint %uint_3 %uint_0\n     %v4uint = OpTypeVector %uint 4\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_host_depth_store_dest_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_host_depth_store_dest_xe_block = OpTypePointer Uniform %xe_host_depth_store_dest_xe_block\n%xe_host_depth_store_dest = OpVariable %_ptr_Uniform_xe_host_depth_store_dest_xe_block Uniform\n      %int_4 = OpConstant %int 4\n      %float = OpTypeFloat 32\n        %150 = OpTypeImage %float 2D 0 0 0 1 Unknown\n%_ptr_UniformConstant_150 = OpTypePointer UniformConstant %150\n%xe_host_depth_store_source = OpVariable %_ptr_UniformConstant_150 UniformConstant\n    %v4float = OpTypeVector %float 4\n       %1824 = OpConstantComposite %v2int %int_1 %int_0\n       %1833 = OpConstantComposite %v2int %int_2 %int_0\n      %int_3 = OpConstant %int 3\n       %1842 = OpConstantComposite %v2int %int_3 %int_0\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n       %1851 = OpConstantComposite %v2int %int_4 %int_0\n      %int_5 = OpConstant %int 5\n       %1860 = OpConstantComposite %v2int %int_5 %int_0\n      %int_6 = OpConstant %int 6\n       %1869 = OpConstantComposite %v2int %int_6 %int_0\n      %int_7 = OpConstant %int 7\n       %1878 = OpConstantComposite %v2int %int_7 %int_0\n     %uint_8 = OpConstant %uint 8\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_8 %uint_8 %uint_1\n       %1954 = OpConstantComposite %v2uint %uint_7 %uint_7\n       %2213 = OpConstantComposite %v2uint %uint_1023 %uint_1023\n       %1870 = OpConstantComposite %v2uint %uint_3 %uint_3\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %22245 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %15627 = OpLoad %uint %22245\n      %20439 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %22340 = OpLoad %uint %20439\n      %10293 = OpCompositeConstruct %v2uint %22340 %22340\n      %24330 = OpShiftRightLogical %v2uint %10293 %2053\n       %6551 = OpBitwiseAnd %v2uint %24330 %1954\n      %21183 = OpAccessChain %_ptr_Input_uint %gl_GlobalInvocationID %uint_0\n      %23612 = OpLoad %uint %21183\n      %21170 = OpShiftRightLogical %uint %15627 %uint_20\n      %15922 = OpBitwiseAnd %uint %21170 %uint_1023\n       %8846 = OpIAdd %uint %15922 %uint_1\n      %11841 = OpCompositeExtract %uint %6551 0\n      %17907 = OpIMul %uint %8846 %11841\n       %7287 = OpUGreaterThanEqual %bool %23612 %17907\n               OpSelectionMerge %16345 DontFlatten\n               OpBranchConditional %7287 %21992 %16345\n      %21992 = OpLabel\n               OpBranch %19578\n      %16345 = OpLabel\n      %10771 = OpCompositeConstruct %v2uint %15627 %15627\n      %13581 = OpShiftRightLogical %v2uint %10771 %1927\n      %23379 = OpBitwiseAnd %v2uint %13581 %2213\n      %13680 = OpShiftLeftLogical %v2uint %23379 %1870\n      %24677 = OpIMul %v2uint %13680 %6551\n       %7005 = OpLoad %v3uint %gl_GlobalInvocationID\n      %22399 = OpVectorShuffle %v2uint %7005 %7005 0 1\n      %21597 = OpShiftLeftLogical %v2uint %22399 %1834\n       %9038 = OpIAdd %v2uint %24677 %21597\n      %24559 = OpBitcast %v2int %9038\n       %8121 = OpBitcast %v2uint %24559\n      %24935 = OpBitwiseAnd %uint %22340 %uint_1023\n      %11893 = OpIMul %v2uint %2719 %6551\n      %16817 = OpUDiv %v2uint %8121 %11893\n       %9129 = OpCompositeExtract %uint %16817 1\n      %11046 = OpIMul %uint %9129 %24935\n      %24741 = OpCompositeExtract %uint %16817 0\n      %20806 = OpIAdd %uint %11046 %24741\n      %13527 = OpIMul %v2uint %16817 %11893\n      %20715 = OpISub %v2uint %8121 %13527\n       %7303 = OpCompositeExtract %uint %11893 0\n      %22882 = OpCompositeExtract %uint %11893 1\n      %13170 = OpIMul %uint %7303 %22882\n      %15520 = OpIMul %uint %20806 %13170\n      %16084 = OpCompositeExtract %uint %20715 1\n      %15890 = OpIMul %uint %16084 %7303\n      %24665 = OpCompositeExtract %uint %20715 0\n      %22752 = OpIAdd %uint %15890 %24665\n      %17957 = OpIAdd %uint %15520 %22752\n      %14103 = OpShiftLeftLogical %uint %17957 %int_2\n      %16641 = OpShiftRightLogical %uint %14103 %int_4\n      %17099 = OpLoad %150 %xe_host_depth_store_source\n      %16549 = OpImageFetch %v4float %17099 %24559 Lod %int_0\n      %24082 = OpCompositeExtract %float %16549 0\n       %9464 = OpLoad %150 %xe_host_depth_store_source\n      %13324 = OpIAdd %v2int %24559 %1824\n      %16413 = OpImageFetch %v4float %9464 %13324 Lod %int_0\n      %10619 = OpCompositeExtract %float %16413 0\n       %9465 = OpLoad %150 %xe_host_depth_store_source\n      %13325 = OpIAdd %v2int %24559 %1833\n      %16414 = OpImageFetch %v4float %9465 %13325 Lod %int_0\n      %10620 = OpCompositeExtract %float %16414 0\n       %9466 = OpLoad %150 %xe_host_depth_store_source\n      %13326 = OpIAdd %v2int %24559 %1842\n      %16774 = OpImageFetch %v4float %9466 %13326 Lod %int_0\n       %7256 = OpCompositeExtract %float %16774 0\n       %6487 = OpCompositeConstruct %v4float %24082 %10619 %10620 %7256\n      %20366 = OpBitcast %v4uint %6487\n      %12860 = OpAccessChain %_ptr_Uniform_v4uint %xe_host_depth_store_dest %int_0 %16641\n               OpStore %12860 %20366\n       %8192 = OpIAdd %uint %14103 %uint_16\n       %8599 = OpShiftRightLogical %uint %8192 %int_4\n      %21084 = OpLoad %150 %xe_host_depth_store_source\n      %11132 = OpIAdd %v2int %24559 %1851\n      %16415 = OpImageFetch %v4float %21084 %11132 Lod %int_0\n      %10621 = OpCompositeExtract %float %16415 0\n       %9467 = OpLoad %150 %xe_host_depth_store_source\n      %13327 = OpIAdd %v2int %24559 %1860\n      %16416 = OpImageFetch %v4float %9467 %13327 Lod %int_0\n      %10622 = OpCompositeExtract %float %16416 0\n       %9468 = OpLoad %150 %xe_host_depth_store_source\n      %13328 = OpIAdd %v2int %24559 %1869\n      %16417 = OpImageFetch %v4float %9468 %13328 Lod %int_0\n      %10623 = OpCompositeExtract %float %16417 0\n       %9469 = OpLoad %150 %xe_host_depth_store_source\n      %13329 = OpIAdd %v2int %24559 %1878\n      %16775 = OpImageFetch %v4float %9469 %13329 Lod %int_0\n       %7257 = OpCompositeExtract %float %16775 0\n       %6488 = OpCompositeConstruct %v4float %10621 %10622 %10623 %7257\n      %20367 = OpBitcast %v4uint %6488\n      %15159 = OpAccessChain %_ptr_Uniform_v4uint %xe_host_depth_store_dest %int_0 %8599\n               OpStore %15159 %20367\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t host_depth_store_1xmsaa_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006168, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000008, 0x00000008, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x000003DE, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000B0006, 0x000003DE, 0x00000000, 0x685F6578,\n    0x5F74736F, 0x74706564, 0x74735F68, 0x5F65726F, 0x74636572, 0x6C676E61,\n    0x00000065, 0x000C0006, 0x000003DE, 0x00000001, 0x685F6578, 0x5F74736F,\n    0x74706564, 0x74735F68, 0x5F65726F, 0x646E6572, 0x745F7265, 0x65677261,\n    0x00000074, 0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473,\n    0x00006578, 0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C,\n    0x7461636F, 0x496E6F69, 0x00000044, 0x000B0005, 0x000007B4, 0x685F6578,\n    0x5F74736F, 0x74706564, 0x74735F68, 0x5F65726F, 0x74736564, 0x5F65785F,\n    0x636F6C62, 0x0000006B, 0x00050006, 0x000007B4, 0x00000000, 0x61746164,\n    0x00000000, 0x00090005, 0x000012B6, 0x685F6578, 0x5F74736F, 0x74706564,\n    0x74735F68, 0x5F65726F, 0x74736564, 0x00000000, 0x00090005, 0x00000E7D,\n    0x685F6578, 0x5F74736F, 0x74706564, 0x74735F68, 0x5F65726F, 0x72756F73,\n    0x00006563, 0x00030047, 0x000003DE, 0x00000002, 0x00050048, 0x000003DE,\n    0x00000000, 0x00000023, 0x00000000, 0x00050048, 0x000003DE, 0x00000001,\n    0x00000023, 0x00000004, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C,\n    0x00040047, 0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4,\n    0x00000003, 0x00040048, 0x000007B4, 0x00000000, 0x00000019, 0x00050048,\n    0x000007B4, 0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x000012B6,\n    0x00000019, 0x00040047, 0x000012B6, 0x00000021, 0x00000000, 0x00040047,\n    0x000012B6, 0x00000022, 0x00000000, 0x00040047, 0x00000E7D, 0x00000021,\n    0x00000000, 0x00040047, 0x00000E7D, 0x00000022, 0x00000001, 0x00040047,\n    0x00000AC7, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00020014, 0x00000009,\n    0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B,\n    0x00000A0A, 0x00000000, 0x0004002B, 0x0000000B, 0x00000AFA, 0x00000050,\n    0x0004002B, 0x0000000B, 0x00000A3A, 0x00000010, 0x0005002C, 0x00000011,\n    0x00000A9F, 0x00000AFA, 0x00000A3A, 0x00040015, 0x0000000C, 0x00000020,\n    0x00000001, 0x0004002B, 0x0000000C, 0x00000A11, 0x00000002, 0x0004002B,\n    0x0000000B, 0x00000A28, 0x0000000A, 0x0005002C, 0x00000011, 0x00000787,\n    0x00000A0A, 0x00000A28, 0x0004002B, 0x0000000B, 0x00000A44, 0x000003FF,\n    0x0004002B, 0x0000000B, 0x00000A13, 0x00000003, 0x0004002B, 0x0000000B,\n    0x00000A46, 0x00000014, 0x0004002B, 0x0000000B, 0x00000A31, 0x0000000D,\n    0x0005002C, 0x00000011, 0x00000805, 0x00000A28, 0x00000A31, 0x0004002B,\n    0x0000000B, 0x00000A1F, 0x00000007, 0x0004001E, 0x000003DE, 0x0000000B,\n    0x0000000B, 0x00040020, 0x0000065B, 0x00000009, 0x000003DE, 0x0004003B,\n    0x0000065B, 0x00000CE9, 0x00000009, 0x0004002B, 0x0000000C, 0x00000A0B,\n    0x00000000, 0x00040020, 0x00000288, 0x00000009, 0x0000000B, 0x0004002B,\n    0x0000000C, 0x00000A0E, 0x00000001, 0x00040017, 0x00000014, 0x0000000B,\n    0x00000003, 0x00040020, 0x00000291, 0x00000001, 0x00000014, 0x0004003B,\n    0x00000291, 0x00000F48, 0x00000001, 0x00040020, 0x00000289, 0x00000001,\n    0x0000000B, 0x00040017, 0x00000012, 0x0000000C, 0x00000002, 0x0005002C,\n    0x00000011, 0x0000072A, 0x00000A13, 0x00000A0A, 0x00040017, 0x00000017,\n    0x0000000B, 0x00000004, 0x0003001D, 0x000007DC, 0x00000017, 0x0003001E,\n    0x000007B4, 0x000007DC, 0x00040020, 0x00000A32, 0x00000002, 0x000007B4,\n    0x0004003B, 0x00000A32, 0x000012B6, 0x00000002, 0x0004002B, 0x0000000C,\n    0x00000A17, 0x00000004, 0x00030016, 0x0000000D, 0x00000020, 0x00090019,\n    0x00000096, 0x0000000D, 0x00000001, 0x00000000, 0x00000000, 0x00000000,\n    0x00000001, 0x00000000, 0x00040020, 0x00000313, 0x00000000, 0x00000096,\n    0x0004003B, 0x00000313, 0x00000E7D, 0x00000000, 0x00040017, 0x0000001D,\n    0x0000000D, 0x00000004, 0x0005002C, 0x00000012, 0x00000720, 0x00000A0E,\n    0x00000A0B, 0x0005002C, 0x00000012, 0x00000729, 0x00000A11, 0x00000A0B,\n    0x0004002B, 0x0000000C, 0x00000A14, 0x00000003, 0x0005002C, 0x00000012,\n    0x00000732, 0x00000A14, 0x00000A0B, 0x00040020, 0x00000294, 0x00000002,\n    0x00000017, 0x0005002C, 0x00000012, 0x0000073B, 0x00000A17, 0x00000A0B,\n    0x0004002B, 0x0000000C, 0x00000A1A, 0x00000005, 0x0005002C, 0x00000012,\n    0x00000744, 0x00000A1A, 0x00000A0B, 0x0004002B, 0x0000000C, 0x00000A1D,\n    0x00000006, 0x0005002C, 0x00000012, 0x0000074D, 0x00000A1D, 0x00000A0B,\n    0x0004002B, 0x0000000C, 0x00000A20, 0x00000007, 0x0005002C, 0x00000012,\n    0x00000756, 0x00000A20, 0x00000A0B, 0x0004002B, 0x0000000B, 0x00000A22,\n    0x00000008, 0x0006002C, 0x00000014, 0x00000AC7, 0x00000A22, 0x00000A22,\n    0x00000A0D, 0x0005002C, 0x00000011, 0x000007A2, 0x00000A1F, 0x00000A1F,\n    0x0005002C, 0x00000011, 0x000008A5, 0x00000A44, 0x00000A44, 0x0005002C,\n    0x00000011, 0x0000074E, 0x00000A13, 0x00000A13, 0x00050036, 0x00000008,\n    0x0000161F, 0x00000000, 0x00000502, 0x000200F8, 0x00003B06, 0x000300F7,\n    0x00004C7A, 0x00000000, 0x000300FB, 0x00000A0A, 0x00002E68, 0x000200F8,\n    0x00002E68, 0x00050041, 0x00000288, 0x000056E5, 0x00000CE9, 0x00000A0B,\n    0x0004003D, 0x0000000B, 0x00003D0B, 0x000056E5, 0x00050041, 0x00000288,\n    0x00004FD7, 0x00000CE9, 0x00000A0E, 0x0004003D, 0x0000000B, 0x00005744,\n    0x00004FD7, 0x00050050, 0x00000011, 0x00002835, 0x00005744, 0x00005744,\n    0x000500C2, 0x00000011, 0x00005F0A, 0x00002835, 0x00000805, 0x000500C7,\n    0x00000011, 0x00001997, 0x00005F0A, 0x000007A2, 0x00050041, 0x00000289,\n    0x000052BF, 0x00000F48, 0x00000A0A, 0x0004003D, 0x0000000B, 0x00005C3C,\n    0x000052BF, 0x000500C2, 0x0000000B, 0x000052B2, 0x00003D0B, 0x00000A46,\n    0x000500C7, 0x0000000B, 0x00003E32, 0x000052B2, 0x00000A44, 0x00050080,\n    0x0000000B, 0x0000228E, 0x00003E32, 0x00000A0D, 0x00050051, 0x0000000B,\n    0x00002E41, 0x00001997, 0x00000000, 0x00050084, 0x0000000B, 0x000045F3,\n    0x0000228E, 0x00002E41, 0x000500AE, 0x00000009, 0x00001C77, 0x00005C3C,\n    0x000045F3, 0x000300F7, 0x00003FD9, 0x00000002, 0x000400FA, 0x00001C77,\n    0x000055E8, 0x00003FD9, 0x000200F8, 0x000055E8, 0x000200F9, 0x00004C7A,\n    0x000200F8, 0x00003FD9, 0x00050050, 0x00000011, 0x00002A13, 0x00003D0B,\n    0x00003D0B, 0x000500C2, 0x00000011, 0x0000350D, 0x00002A13, 0x00000787,\n    0x000500C7, 0x00000011, 0x00005B53, 0x0000350D, 0x000008A5, 0x000500C4,\n    0x00000011, 0x00003570, 0x00005B53, 0x0000074E, 0x00050084, 0x00000011,\n    0x00006065, 0x00003570, 0x00001997, 0x0004003D, 0x00000014, 0x00001B5D,\n    0x00000F48, 0x0007004F, 0x00000011, 0x0000577F, 0x00001B5D, 0x00001B5D,\n    0x00000000, 0x00000001, 0x000500C4, 0x00000011, 0x0000545D, 0x0000577F,\n    0x0000072A, 0x00050080, 0x00000011, 0x0000234E, 0x00006065, 0x0000545D,\n    0x0004007C, 0x00000012, 0x00005FEF, 0x0000234E, 0x0004007C, 0x00000011,\n    0x00001FB9, 0x00005FEF, 0x000500C7, 0x0000000B, 0x00006167, 0x00005744,\n    0x00000A44, 0x00050084, 0x00000011, 0x00002E75, 0x00000A9F, 0x00001997,\n    0x00050086, 0x00000011, 0x000041B1, 0x00001FB9, 0x00002E75, 0x00050051,\n    0x0000000B, 0x000023A9, 0x000041B1, 0x00000001, 0x00050084, 0x0000000B,\n    0x00002B26, 0x000023A9, 0x00006167, 0x00050051, 0x0000000B, 0x000060A5,\n    0x000041B1, 0x00000000, 0x00050080, 0x0000000B, 0x00005146, 0x00002B26,\n    0x000060A5, 0x00050084, 0x00000011, 0x000034D7, 0x000041B1, 0x00002E75,\n    0x00050082, 0x00000011, 0x000050EB, 0x00001FB9, 0x000034D7, 0x00050051,\n    0x0000000B, 0x00001C87, 0x00002E75, 0x00000000, 0x00050051, 0x0000000B,\n    0x00005962, 0x00002E75, 0x00000001, 0x00050084, 0x0000000B, 0x00003372,\n    0x00001C87, 0x00005962, 0x00050084, 0x0000000B, 0x00003CA0, 0x00005146,\n    0x00003372, 0x00050051, 0x0000000B, 0x00003ED4, 0x000050EB, 0x00000001,\n    0x00050084, 0x0000000B, 0x00003E12, 0x00003ED4, 0x00001C87, 0x00050051,\n    0x0000000B, 0x00006059, 0x000050EB, 0x00000000, 0x00050080, 0x0000000B,\n    0x000058E0, 0x00003E12, 0x00006059, 0x00050080, 0x0000000B, 0x00004625,\n    0x00003CA0, 0x000058E0, 0x000500C4, 0x0000000B, 0x00003717, 0x00004625,\n    0x00000A11, 0x000500C2, 0x0000000B, 0x00004101, 0x00003717, 0x00000A17,\n    0x0004003D, 0x00000096, 0x000042CB, 0x00000E7D, 0x0007005F, 0x0000001D,\n    0x000040A5, 0x000042CB, 0x00005FEF, 0x00000002, 0x00000A0B, 0x00050051,\n    0x0000000D, 0x00005E12, 0x000040A5, 0x00000000, 0x0004003D, 0x00000096,\n    0x000024F8, 0x00000E7D, 0x00050080, 0x00000012, 0x0000340C, 0x00005FEF,\n    0x00000720, 0x0007005F, 0x0000001D, 0x0000401D, 0x000024F8, 0x0000340C,\n    0x00000002, 0x00000A0B, 0x00050051, 0x0000000D, 0x0000297B, 0x0000401D,\n    0x00000000, 0x0004003D, 0x00000096, 0x000024F9, 0x00000E7D, 0x00050080,\n    0x00000012, 0x0000340D, 0x00005FEF, 0x00000729, 0x0007005F, 0x0000001D,\n    0x0000401E, 0x000024F9, 0x0000340D, 0x00000002, 0x00000A0B, 0x00050051,\n    0x0000000D, 0x0000297C, 0x0000401E, 0x00000000, 0x0004003D, 0x00000096,\n    0x000024FA, 0x00000E7D, 0x00050080, 0x00000012, 0x0000340E, 0x00005FEF,\n    0x00000732, 0x0007005F, 0x0000001D, 0x00004186, 0x000024FA, 0x0000340E,\n    0x00000002, 0x00000A0B, 0x00050051, 0x0000000D, 0x00001C58, 0x00004186,\n    0x00000000, 0x00070050, 0x0000001D, 0x00001957, 0x00005E12, 0x0000297B,\n    0x0000297C, 0x00001C58, 0x0004007C, 0x00000017, 0x00004F8E, 0x00001957,\n    0x00060041, 0x00000294, 0x0000323C, 0x000012B6, 0x00000A0B, 0x00004101,\n    0x0003003E, 0x0000323C, 0x00004F8E, 0x00050080, 0x0000000B, 0x00002000,\n    0x00003717, 0x00000A3A, 0x000500C2, 0x0000000B, 0x00002197, 0x00002000,\n    0x00000A17, 0x0004003D, 0x00000096, 0x0000525C, 0x00000E7D, 0x00050080,\n    0x00000012, 0x00002B7C, 0x00005FEF, 0x0000073B, 0x0007005F, 0x0000001D,\n    0x0000401F, 0x0000525C, 0x00002B7C, 0x00000002, 0x00000A0B, 0x00050051,\n    0x0000000D, 0x0000297D, 0x0000401F, 0x00000000, 0x0004003D, 0x00000096,\n    0x000024FB, 0x00000E7D, 0x00050080, 0x00000012, 0x0000340F, 0x00005FEF,\n    0x00000744, 0x0007005F, 0x0000001D, 0x00004020, 0x000024FB, 0x0000340F,\n    0x00000002, 0x00000A0B, 0x00050051, 0x0000000D, 0x0000297E, 0x00004020,\n    0x00000000, 0x0004003D, 0x00000096, 0x000024FC, 0x00000E7D, 0x00050080,\n    0x00000012, 0x00003410, 0x00005FEF, 0x0000074D, 0x0007005F, 0x0000001D,\n    0x00004021, 0x000024FC, 0x00003410, 0x00000002, 0x00000A0B, 0x00050051,\n    0x0000000D, 0x0000297F, 0x00004021, 0x00000000, 0x0004003D, 0x00000096,\n    0x000024FD, 0x00000E7D, 0x00050080, 0x00000012, 0x00003411, 0x00005FEF,\n    0x00000756, 0x0007005F, 0x0000001D, 0x00004187, 0x000024FD, 0x00003411,\n    0x00000002, 0x00000A0B, 0x00050051, 0x0000000D, 0x00001C59, 0x00004187,\n    0x00000000, 0x00070050, 0x0000001D, 0x00001958, 0x0000297D, 0x0000297E,\n    0x0000297F, 0x00001C59, 0x0004007C, 0x00000017, 0x00004F8F, 0x00001958,\n    0x00060041, 0x00000294, 0x00003B37, 0x000012B6, 0x00000A0B, 0x00002197,\n    0x0003003E, 0x00003B37, 0x00004F8F, 0x000200F9, 0x00004C7A, 0x000200F8,\n    0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/host_depth_store_2xmsaa_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 24898\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 8 8 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_host_depth_store_rectangle\"\n               OpMemberName %push_const_block_xe 1 \"xe_host_depth_store_render_target\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_host_depth_store_dest_xe_block \"xe_host_depth_store_dest_xe_block\"\n               OpMemberName %xe_host_depth_store_dest_xe_block 0 \"data\"\n               OpName %xe_host_depth_store_dest \"xe_host_depth_store_dest\"\n               OpName %xe_host_depth_store_source \"xe_host_depth_store_source\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_host_depth_store_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_host_depth_store_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_host_depth_store_dest_xe_block 0 Offset 0\n               OpDecorate %xe_host_depth_store_dest NonReadable\n               OpDecorate %xe_host_depth_store_dest Binding 0\n               OpDecorate %xe_host_depth_store_dest DescriptorSet 0\n               OpDecorate %xe_host_depth_store_source Binding 0\n               OpDecorate %xe_host_depth_store_source DescriptorSet 1\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n       %bool = OpTypeBool\n     %uint_1 = OpConstant %uint 1\n     %uint_0 = OpConstant %uint 0\n       %1828 = OpConstantComposite %v2uint %uint_1 %uint_1\n       %1816 = OpConstantComposite %v2uint %uint_1 %uint_0\n    %uint_80 = OpConstant %uint 80\n    %uint_16 = OpConstant %uint 16\n       %2719 = OpConstantComposite %v2uint %uint_80 %uint_16\n        %int = OpTypeInt 32 1\n      %int_2 = OpConstant %int 2\n    %uint_10 = OpConstant %uint 10\n       %1927 = OpConstantComposite %v2uint %uint_0 %uint_10\n  %uint_1023 = OpConstant %uint 1023\n     %uint_3 = OpConstant %uint 3\n    %uint_20 = OpConstant %uint 20\n    %uint_13 = OpConstant %uint 13\n       %2053 = OpConstantComposite %v2uint %uint_10 %uint_13\n     %uint_7 = OpConstant %uint 7\n%push_const_block_xe = OpTypeStruct %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n      %int_0 = OpConstant %int 0\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n      %int_1 = OpConstant %int 1\n     %v3uint = OpTypeVector %uint 3\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n%_ptr_Input_uint = OpTypePointer Input %uint\n      %v2int = OpTypeVector %int 2\n      %int_3 = OpConstant %int 3\n     %v4uint = OpTypeVector %uint 4\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_host_depth_store_dest_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_host_depth_store_dest_xe_block = OpTypePointer Uniform %xe_host_depth_store_dest_xe_block\n%xe_host_depth_store_dest = OpVariable %_ptr_Uniform_xe_host_depth_store_dest_xe_block Uniform\n      %int_4 = OpConstant %int 4\n      %float = OpTypeFloat 32\n        %182 = OpTypeImage %float 2D 0 0 1 1 Unknown\n%_ptr_UniformConstant_182 = OpTypePointer UniformConstant %182\n%xe_host_depth_store_source = OpVariable %_ptr_UniformConstant_182 UniformConstant\n    %v4float = OpTypeVector %float 4\n       %1824 = OpConstantComposite %v2int %int_1 %int_0\n       %1833 = OpConstantComposite %v2int %int_2 %int_0\n       %1842 = OpConstantComposite %v2int %int_3 %int_0\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n       %1851 = OpConstantComposite %v2int %int_4 %int_0\n      %int_5 = OpConstant %int 5\n       %1860 = OpConstantComposite %v2int %int_5 %int_0\n      %int_6 = OpConstant %int 6\n       %1869 = OpConstantComposite %v2int %int_6 %int_0\n      %int_7 = OpConstant %int 7\n       %1878 = OpConstantComposite %v2int %int_7 %int_0\n     %uint_8 = OpConstant %uint 8\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_8 %uint_8 %uint_1\n       %1954 = OpConstantComposite %v2uint %uint_7 %uint_7\n       %2213 = OpConstantComposite %v2uint %uint_1023 %uint_1023\n       %1870 = OpConstantComposite %v2uint %uint_3 %uint_3\n       %1819 = OpConstantComposite %v2uint %uint_0 %uint_1\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %22245 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %15627 = OpLoad %uint %22245\n      %20439 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %22340 = OpLoad %uint %20439\n      %10293 = OpCompositeConstruct %v2uint %22340 %22340\n      %24330 = OpShiftRightLogical %v2uint %10293 %2053\n       %6551 = OpBitwiseAnd %v2uint %24330 %1954\n      %21183 = OpAccessChain %_ptr_Input_uint %gl_GlobalInvocationID %uint_0\n      %23612 = OpLoad %uint %21183\n      %21170 = OpShiftRightLogical %uint %15627 %uint_20\n      %15922 = OpBitwiseAnd %uint %21170 %uint_1023\n       %8846 = OpIAdd %uint %15922 %uint_1\n      %11841 = OpCompositeExtract %uint %6551 0\n      %17907 = OpIMul %uint %8846 %11841\n       %7287 = OpUGreaterThanEqual %bool %23612 %17907\n               OpSelectionMerge %16345 DontFlatten\n               OpBranchConditional %7287 %21992 %16345\n      %21992 = OpLabel\n               OpBranch %19578\n      %16345 = OpLabel\n      %10771 = OpCompositeConstruct %v2uint %15627 %15627\n      %13581 = OpShiftRightLogical %v2uint %10771 %1927\n      %23379 = OpBitwiseAnd %v2uint %13581 %2213\n      %16245 = OpShiftLeftLogical %v2uint %23379 %1870\n      %20127 = OpIMul %v2uint %16245 %6551\n      %19539 = OpShiftLeftLogical %uint %23612 %uint_3\n      %17126 = OpAccessChain %_ptr_Input_uint %gl_GlobalInvocationID %uint_1\n      %22160 = OpLoad %uint %17126\n      %22686 = OpShiftRightLogical %uint %22160 %uint_1\n       %6471 = OpCompositeConstruct %v2uint %19539 %22686\n       %9483 = OpIAdd %v2uint %20127 %6471\n      %13160 = OpBitcast %v2int %9483\n      %11709 = OpBitwiseAnd %uint %22160 %uint_1\n      %11164 = OpBitcast %v2uint %13160\n      %24897 = OpBitwiseAnd %uint %22340 %uint_1023\n      %13947 = OpShiftLeftLogical %v2uint %11164 %1819\n      %10422 = OpCompositeConstruct %v2uint %11709 %11709\n       %9093 = OpShiftRightLogical %v2uint %10422 %1816\n      %16072 = OpBitwiseAnd %v2uint %9093 %1828\n      %19132 = OpIAdd %v2uint %13947 %16072\n      %11447 = OpIMul %v2uint %2719 %6551\n       %7983 = OpUDiv %v2uint %19132 %11447\n       %9129 = OpCompositeExtract %uint %7983 1\n      %11046 = OpIMul %uint %9129 %24897\n      %24741 = OpCompositeExtract %uint %7983 0\n      %20806 = OpIAdd %uint %11046 %24741\n      %13527 = OpIMul %v2uint %7983 %11447\n      %20715 = OpISub %v2uint %19132 %13527\n       %7303 = OpCompositeExtract %uint %11447 0\n      %22882 = OpCompositeExtract %uint %11447 1\n      %13170 = OpIMul %uint %7303 %22882\n      %15520 = OpIMul %uint %20806 %13170\n      %16084 = OpCompositeExtract %uint %20715 1\n      %15890 = OpIMul %uint %16084 %7303\n      %24665 = OpCompositeExtract %uint %20715 0\n      %22752 = OpIAdd %uint %15890 %24665\n      %17957 = OpIAdd %uint %15520 %22752\n      %16725 = OpShiftLeftLogical %uint %17957 %int_2\n      %13282 = OpShiftRightLogical %uint %22340 %uint_16\n       %7817 = OpBitwiseAnd %uint %13282 %uint_1\n      %11491 = OpINotEqual %bool %7817 %uint_0\n               OpSelectionMerge %10656 None\n               OpBranchConditional %11491 %22983 %14914\n      %14914 = OpLabel\n      %24444 = OpINotEqual %bool %11709 %uint_0\n      %20803 = OpSelect %int %24444 %int_3 %int_0\n               OpBranch %10656\n      %22983 = OpLabel\n       %7795 = OpINotEqual %bool %11709 %uint_0\n      %20804 = OpSelect %int %7795 %int_0 %int_1\n               OpBranch %10656\n      %10656 = OpLabel\n      %16502 = OpPhi %int %20804 %22983 %20803 %14914\n       %9922 = OpShiftRightLogical %uint %16725 %int_4\n      %21104 = OpLoad %182 %xe_host_depth_store_source\n      %16549 = OpImageFetch %v4float %21104 %13160 Sample %16502\n      %24082 = OpCompositeExtract %float %16549 0\n       %9464 = OpLoad %182 %xe_host_depth_store_source\n      %13324 = OpIAdd %v2int %13160 %1824\n      %16413 = OpImageFetch %v4float %9464 %13324 Sample %16502\n      %10619 = OpCompositeExtract %float %16413 0\n       %9465 = OpLoad %182 %xe_host_depth_store_source\n      %13325 = OpIAdd %v2int %13160 %1833\n      %16414 = OpImageFetch %v4float %9465 %13325 Sample %16502\n      %10620 = OpCompositeExtract %float %16414 0\n       %9466 = OpLoad %182 %xe_host_depth_store_source\n      %13326 = OpIAdd %v2int %13160 %1842\n      %16774 = OpImageFetch %v4float %9466 %13326 Sample %16502\n       %7256 = OpCompositeExtract %float %16774 0\n       %6487 = OpCompositeConstruct %v4float %24082 %10619 %10620 %7256\n      %20366 = OpBitcast %v4uint %6487\n      %12860 = OpAccessChain %_ptr_Uniform_v4uint %xe_host_depth_store_dest %int_0 %9922\n               OpStore %12860 %20366\n       %8192 = OpIAdd %uint %16725 %uint_16\n       %8599 = OpShiftRightLogical %uint %8192 %int_4\n      %21084 = OpLoad %182 %xe_host_depth_store_source\n      %11132 = OpIAdd %v2int %13160 %1851\n      %16415 = OpImageFetch %v4float %21084 %11132 Sample %16502\n      %10621 = OpCompositeExtract %float %16415 0\n       %9467 = OpLoad %182 %xe_host_depth_store_source\n      %13327 = OpIAdd %v2int %13160 %1860\n      %16416 = OpImageFetch %v4float %9467 %13327 Sample %16502\n      %10622 = OpCompositeExtract %float %16416 0\n       %9468 = OpLoad %182 %xe_host_depth_store_source\n      %13328 = OpIAdd %v2int %13160 %1869\n      %16417 = OpImageFetch %v4float %9468 %13328 Sample %16502\n      %10623 = OpCompositeExtract %float %16417 0\n       %9469 = OpLoad %182 %xe_host_depth_store_source\n      %13329 = OpIAdd %v2int %13160 %1878\n      %16775 = OpImageFetch %v4float %9469 %13329 Sample %16502\n       %7257 = OpCompositeExtract %float %16775 0\n       %6488 = OpCompositeConstruct %v4float %10621 %10622 %10623 %7257\n      %20367 = OpBitcast %v4uint %6488\n      %15159 = OpAccessChain %_ptr_Uniform_v4uint %xe_host_depth_store_dest %int_0 %8599\n               OpStore %15159 %20367\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t host_depth_store_2xmsaa_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006142, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000008, 0x00000008, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x000003DE, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000B0006, 0x000003DE, 0x00000000, 0x685F6578,\n    0x5F74736F, 0x74706564, 0x74735F68, 0x5F65726F, 0x74636572, 0x6C676E61,\n    0x00000065, 0x000C0006, 0x000003DE, 0x00000001, 0x685F6578, 0x5F74736F,\n    0x74706564, 0x74735F68, 0x5F65726F, 0x646E6572, 0x745F7265, 0x65677261,\n    0x00000074, 0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473,\n    0x00006578, 0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C,\n    0x7461636F, 0x496E6F69, 0x00000044, 0x000B0005, 0x000007B4, 0x685F6578,\n    0x5F74736F, 0x74706564, 0x74735F68, 0x5F65726F, 0x74736564, 0x5F65785F,\n    0x636F6C62, 0x0000006B, 0x00050006, 0x000007B4, 0x00000000, 0x61746164,\n    0x00000000, 0x00090005, 0x000012B6, 0x685F6578, 0x5F74736F, 0x74706564,\n    0x74735F68, 0x5F65726F, 0x74736564, 0x00000000, 0x00090005, 0x00000E7D,\n    0x685F6578, 0x5F74736F, 0x74706564, 0x74735F68, 0x5F65726F, 0x72756F73,\n    0x00006563, 0x00030047, 0x000003DE, 0x00000002, 0x00050048, 0x000003DE,\n    0x00000000, 0x00000023, 0x00000000, 0x00050048, 0x000003DE, 0x00000001,\n    0x00000023, 0x00000004, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C,\n    0x00040047, 0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4,\n    0x00000003, 0x00040048, 0x000007B4, 0x00000000, 0x00000019, 0x00050048,\n    0x000007B4, 0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x000012B6,\n    0x00000019, 0x00040047, 0x000012B6, 0x00000021, 0x00000000, 0x00040047,\n    0x000012B6, 0x00000022, 0x00000000, 0x00040047, 0x00000E7D, 0x00000021,\n    0x00000000, 0x00040047, 0x00000E7D, 0x00000022, 0x00000001, 0x00040047,\n    0x00000AC7, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00020014, 0x00000009,\n    0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B,\n    0x00000A0A, 0x00000000, 0x0005002C, 0x00000011, 0x00000724, 0x00000A0D,\n    0x00000A0D, 0x0005002C, 0x00000011, 0x00000718, 0x00000A0D, 0x00000A0A,\n    0x0004002B, 0x0000000B, 0x00000AFA, 0x00000050, 0x0004002B, 0x0000000B,\n    0x00000A3A, 0x00000010, 0x0005002C, 0x00000011, 0x00000A9F, 0x00000AFA,\n    0x00000A3A, 0x00040015, 0x0000000C, 0x00000020, 0x00000001, 0x0004002B,\n    0x0000000C, 0x00000A11, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A28,\n    0x0000000A, 0x0005002C, 0x00000011, 0x00000787, 0x00000A0A, 0x00000A28,\n    0x0004002B, 0x0000000B, 0x00000A44, 0x000003FF, 0x0004002B, 0x0000000B,\n    0x00000A13, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A46, 0x00000014,\n    0x0004002B, 0x0000000B, 0x00000A31, 0x0000000D, 0x0005002C, 0x00000011,\n    0x00000805, 0x00000A28, 0x00000A31, 0x0004002B, 0x0000000B, 0x00000A1F,\n    0x00000007, 0x0004001E, 0x000003DE, 0x0000000B, 0x0000000B, 0x00040020,\n    0x0000065B, 0x00000009, 0x000003DE, 0x0004003B, 0x0000065B, 0x00000CE9,\n    0x00000009, 0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000, 0x00040020,\n    0x00000288, 0x00000009, 0x0000000B, 0x0004002B, 0x0000000C, 0x00000A0E,\n    0x00000001, 0x00040017, 0x00000014, 0x0000000B, 0x00000003, 0x00040020,\n    0x00000291, 0x00000001, 0x00000014, 0x0004003B, 0x00000291, 0x00000F48,\n    0x00000001, 0x00040020, 0x00000289, 0x00000001, 0x0000000B, 0x00040017,\n    0x00000012, 0x0000000C, 0x00000002, 0x0004002B, 0x0000000C, 0x00000A14,\n    0x00000003, 0x00040017, 0x00000017, 0x0000000B, 0x00000004, 0x0003001D,\n    0x000007DC, 0x00000017, 0x0003001E, 0x000007B4, 0x000007DC, 0x00040020,\n    0x00000A32, 0x00000002, 0x000007B4, 0x0004003B, 0x00000A32, 0x000012B6,\n    0x00000002, 0x0004002B, 0x0000000C, 0x00000A17, 0x00000004, 0x00030016,\n    0x0000000D, 0x00000020, 0x00090019, 0x000000B6, 0x0000000D, 0x00000001,\n    0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000000, 0x00040020,\n    0x00000333, 0x00000000, 0x000000B6, 0x0004003B, 0x00000333, 0x00000E7D,\n    0x00000000, 0x00040017, 0x0000001D, 0x0000000D, 0x00000004, 0x0005002C,\n    0x00000012, 0x00000720, 0x00000A0E, 0x00000A0B, 0x0005002C, 0x00000012,\n    0x00000729, 0x00000A11, 0x00000A0B, 0x0005002C, 0x00000012, 0x00000732,\n    0x00000A14, 0x00000A0B, 0x00040020, 0x00000294, 0x00000002, 0x00000017,\n    0x0005002C, 0x00000012, 0x0000073B, 0x00000A17, 0x00000A0B, 0x0004002B,\n    0x0000000C, 0x00000A1A, 0x00000005, 0x0005002C, 0x00000012, 0x00000744,\n    0x00000A1A, 0x00000A0B, 0x0004002B, 0x0000000C, 0x00000A1D, 0x00000006,\n    0x0005002C, 0x00000012, 0x0000074D, 0x00000A1D, 0x00000A0B, 0x0004002B,\n    0x0000000C, 0x00000A20, 0x00000007, 0x0005002C, 0x00000012, 0x00000756,\n    0x00000A20, 0x00000A0B, 0x0004002B, 0x0000000B, 0x00000A22, 0x00000008,\n    0x0006002C, 0x00000014, 0x00000AC7, 0x00000A22, 0x00000A22, 0x00000A0D,\n    0x0005002C, 0x00000011, 0x000007A2, 0x00000A1F, 0x00000A1F, 0x0005002C,\n    0x00000011, 0x000008A5, 0x00000A44, 0x00000A44, 0x0005002C, 0x00000011,\n    0x0000074E, 0x00000A13, 0x00000A13, 0x0005002C, 0x00000011, 0x0000071B,\n    0x00000A0A, 0x00000A0D, 0x00050036, 0x00000008, 0x0000161F, 0x00000000,\n    0x00000502, 0x000200F8, 0x00003B06, 0x000300F7, 0x00004C7A, 0x00000000,\n    0x000300FB, 0x00000A0A, 0x00002E68, 0x000200F8, 0x00002E68, 0x00050041,\n    0x00000288, 0x000056E5, 0x00000CE9, 0x00000A0B, 0x0004003D, 0x0000000B,\n    0x00003D0B, 0x000056E5, 0x00050041, 0x00000288, 0x00004FD7, 0x00000CE9,\n    0x00000A0E, 0x0004003D, 0x0000000B, 0x00005744, 0x00004FD7, 0x00050050,\n    0x00000011, 0x00002835, 0x00005744, 0x00005744, 0x000500C2, 0x00000011,\n    0x00005F0A, 0x00002835, 0x00000805, 0x000500C7, 0x00000011, 0x00001997,\n    0x00005F0A, 0x000007A2, 0x00050041, 0x00000289, 0x000052BF, 0x00000F48,\n    0x00000A0A, 0x0004003D, 0x0000000B, 0x00005C3C, 0x000052BF, 0x000500C2,\n    0x0000000B, 0x000052B2, 0x00003D0B, 0x00000A46, 0x000500C7, 0x0000000B,\n    0x00003E32, 0x000052B2, 0x00000A44, 0x00050080, 0x0000000B, 0x0000228E,\n    0x00003E32, 0x00000A0D, 0x00050051, 0x0000000B, 0x00002E41, 0x00001997,\n    0x00000000, 0x00050084, 0x0000000B, 0x000045F3, 0x0000228E, 0x00002E41,\n    0x000500AE, 0x00000009, 0x00001C77, 0x00005C3C, 0x000045F3, 0x000300F7,\n    0x00003FD9, 0x00000002, 0x000400FA, 0x00001C77, 0x000055E8, 0x00003FD9,\n    0x000200F8, 0x000055E8, 0x000200F9, 0x00004C7A, 0x000200F8, 0x00003FD9,\n    0x00050050, 0x00000011, 0x00002A13, 0x00003D0B, 0x00003D0B, 0x000500C2,\n    0x00000011, 0x0000350D, 0x00002A13, 0x00000787, 0x000500C7, 0x00000011,\n    0x00005B53, 0x0000350D, 0x000008A5, 0x000500C4, 0x00000011, 0x00003F75,\n    0x00005B53, 0x0000074E, 0x00050084, 0x00000011, 0x00004E9F, 0x00003F75,\n    0x00001997, 0x000500C4, 0x0000000B, 0x00004C53, 0x00005C3C, 0x00000A13,\n    0x00050041, 0x00000289, 0x000042E6, 0x00000F48, 0x00000A0D, 0x0004003D,\n    0x0000000B, 0x00005690, 0x000042E6, 0x000500C2, 0x0000000B, 0x0000589E,\n    0x00005690, 0x00000A0D, 0x00050050, 0x00000011, 0x00001947, 0x00004C53,\n    0x0000589E, 0x00050080, 0x00000011, 0x0000250B, 0x00004E9F, 0x00001947,\n    0x0004007C, 0x00000012, 0x00003368, 0x0000250B, 0x000500C7, 0x0000000B,\n    0x00002DBD, 0x00005690, 0x00000A0D, 0x0004007C, 0x00000011, 0x00002B9C,\n    0x00003368, 0x000500C7, 0x0000000B, 0x00006141, 0x00005744, 0x00000A44,\n    0x000500C4, 0x00000011, 0x0000367B, 0x00002B9C, 0x0000071B, 0x00050050,\n    0x00000011, 0x000028B6, 0x00002DBD, 0x00002DBD, 0x000500C2, 0x00000011,\n    0x00002385, 0x000028B6, 0x00000718, 0x000500C7, 0x00000011, 0x00003EC8,\n    0x00002385, 0x00000724, 0x00050080, 0x00000011, 0x00004ABC, 0x0000367B,\n    0x00003EC8, 0x00050084, 0x00000011, 0x00002CB7, 0x00000A9F, 0x00001997,\n    0x00050086, 0x00000011, 0x00001F2F, 0x00004ABC, 0x00002CB7, 0x00050051,\n    0x0000000B, 0x000023A9, 0x00001F2F, 0x00000001, 0x00050084, 0x0000000B,\n    0x00002B26, 0x000023A9, 0x00006141, 0x00050051, 0x0000000B, 0x000060A5,\n    0x00001F2F, 0x00000000, 0x00050080, 0x0000000B, 0x00005146, 0x00002B26,\n    0x000060A5, 0x00050084, 0x00000011, 0x000034D7, 0x00001F2F, 0x00002CB7,\n    0x00050082, 0x00000011, 0x000050EB, 0x00004ABC, 0x000034D7, 0x00050051,\n    0x0000000B, 0x00001C87, 0x00002CB7, 0x00000000, 0x00050051, 0x0000000B,\n    0x00005962, 0x00002CB7, 0x00000001, 0x00050084, 0x0000000B, 0x00003372,\n    0x00001C87, 0x00005962, 0x00050084, 0x0000000B, 0x00003CA0, 0x00005146,\n    0x00003372, 0x00050051, 0x0000000B, 0x00003ED4, 0x000050EB, 0x00000001,\n    0x00050084, 0x0000000B, 0x00003E12, 0x00003ED4, 0x00001C87, 0x00050051,\n    0x0000000B, 0x00006059, 0x000050EB, 0x00000000, 0x00050080, 0x0000000B,\n    0x000058E0, 0x00003E12, 0x00006059, 0x00050080, 0x0000000B, 0x00004625,\n    0x00003CA0, 0x000058E0, 0x000500C4, 0x0000000B, 0x00004155, 0x00004625,\n    0x00000A11, 0x000500C2, 0x0000000B, 0x000033E2, 0x00005744, 0x00000A3A,\n    0x000500C7, 0x0000000B, 0x00001E89, 0x000033E2, 0x00000A0D, 0x000500AB,\n    0x00000009, 0x00002CE3, 0x00001E89, 0x00000A0A, 0x000300F7, 0x000029A0,\n    0x00000000, 0x000400FA, 0x00002CE3, 0x000059C7, 0x00003A42, 0x000200F8,\n    0x00003A42, 0x000500AB, 0x00000009, 0x00005F7C, 0x00002DBD, 0x00000A0A,\n    0x000600A9, 0x0000000C, 0x00005143, 0x00005F7C, 0x00000A14, 0x00000A0B,\n    0x000200F9, 0x000029A0, 0x000200F8, 0x000059C7, 0x000500AB, 0x00000009,\n    0x00001E73, 0x00002DBD, 0x00000A0A, 0x000600A9, 0x0000000C, 0x00005144,\n    0x00001E73, 0x00000A0B, 0x00000A0E, 0x000200F9, 0x000029A0, 0x000200F8,\n    0x000029A0, 0x000700F5, 0x0000000C, 0x00004076, 0x00005144, 0x000059C7,\n    0x00005143, 0x00003A42, 0x000500C2, 0x0000000B, 0x000026C2, 0x00004155,\n    0x00000A17, 0x0004003D, 0x000000B6, 0x00005270, 0x00000E7D, 0x0007005F,\n    0x0000001D, 0x000040A5, 0x00005270, 0x00003368, 0x00000040, 0x00004076,\n    0x00050051, 0x0000000D, 0x00005E12, 0x000040A5, 0x00000000, 0x0004003D,\n    0x000000B6, 0x000024F8, 0x00000E7D, 0x00050080, 0x00000012, 0x0000340C,\n    0x00003368, 0x00000720, 0x0007005F, 0x0000001D, 0x0000401D, 0x000024F8,\n    0x0000340C, 0x00000040, 0x00004076, 0x00050051, 0x0000000D, 0x0000297B,\n    0x0000401D, 0x00000000, 0x0004003D, 0x000000B6, 0x000024F9, 0x00000E7D,\n    0x00050080, 0x00000012, 0x0000340D, 0x00003368, 0x00000729, 0x0007005F,\n    0x0000001D, 0x0000401E, 0x000024F9, 0x0000340D, 0x00000040, 0x00004076,\n    0x00050051, 0x0000000D, 0x0000297C, 0x0000401E, 0x00000000, 0x0004003D,\n    0x000000B6, 0x000024FA, 0x00000E7D, 0x00050080, 0x00000012, 0x0000340E,\n    0x00003368, 0x00000732, 0x0007005F, 0x0000001D, 0x00004186, 0x000024FA,\n    0x0000340E, 0x00000040, 0x00004076, 0x00050051, 0x0000000D, 0x00001C58,\n    0x00004186, 0x00000000, 0x00070050, 0x0000001D, 0x00001957, 0x00005E12,\n    0x0000297B, 0x0000297C, 0x00001C58, 0x0004007C, 0x00000017, 0x00004F8E,\n    0x00001957, 0x00060041, 0x00000294, 0x0000323C, 0x000012B6, 0x00000A0B,\n    0x000026C2, 0x0003003E, 0x0000323C, 0x00004F8E, 0x00050080, 0x0000000B,\n    0x00002000, 0x00004155, 0x00000A3A, 0x000500C2, 0x0000000B, 0x00002197,\n    0x00002000, 0x00000A17, 0x0004003D, 0x000000B6, 0x0000525C, 0x00000E7D,\n    0x00050080, 0x00000012, 0x00002B7C, 0x00003368, 0x0000073B, 0x0007005F,\n    0x0000001D, 0x0000401F, 0x0000525C, 0x00002B7C, 0x00000040, 0x00004076,\n    0x00050051, 0x0000000D, 0x0000297D, 0x0000401F, 0x00000000, 0x0004003D,\n    0x000000B6, 0x000024FB, 0x00000E7D, 0x00050080, 0x00000012, 0x0000340F,\n    0x00003368, 0x00000744, 0x0007005F, 0x0000001D, 0x00004020, 0x000024FB,\n    0x0000340F, 0x00000040, 0x00004076, 0x00050051, 0x0000000D, 0x0000297E,\n    0x00004020, 0x00000000, 0x0004003D, 0x000000B6, 0x000024FC, 0x00000E7D,\n    0x00050080, 0x00000012, 0x00003410, 0x00003368, 0x0000074D, 0x0007005F,\n    0x0000001D, 0x00004021, 0x000024FC, 0x00003410, 0x00000040, 0x00004076,\n    0x00050051, 0x0000000D, 0x0000297F, 0x00004021, 0x00000000, 0x0004003D,\n    0x000000B6, 0x000024FD, 0x00000E7D, 0x00050080, 0x00000012, 0x00003411,\n    0x00003368, 0x00000756, 0x0007005F, 0x0000001D, 0x00004187, 0x000024FD,\n    0x00003411, 0x00000040, 0x00004076, 0x00050051, 0x0000000D, 0x00001C59,\n    0x00004187, 0x00000000, 0x00070050, 0x0000001D, 0x00001958, 0x0000297D,\n    0x0000297E, 0x0000297F, 0x00001C59, 0x0004007C, 0x00000017, 0x00004F8F,\n    0x00001958, 0x00060041, 0x00000294, 0x00003B37, 0x000012B6, 0x00000A0B,\n    0x00002197, 0x0003003E, 0x00003B37, 0x00004F8F, 0x000200F9, 0x00004C7A,\n    0x000200F8, 0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/host_depth_store_4xmsaa_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 24742\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 8 8 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_host_depth_store_rectangle\"\n               OpMemberName %push_const_block_xe 1 \"xe_host_depth_store_render_target\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_host_depth_store_dest_xe_block \"xe_host_depth_store_dest_xe_block\"\n               OpMemberName %xe_host_depth_store_dest_xe_block 0 \"data\"\n               OpName %xe_host_depth_store_dest \"xe_host_depth_store_dest\"\n               OpName %xe_host_depth_store_source \"xe_host_depth_store_source\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_host_depth_store_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_host_depth_store_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_host_depth_store_dest_xe_block 0 Offset 0\n               OpDecorate %xe_host_depth_store_dest NonReadable\n               OpDecorate %xe_host_depth_store_dest Binding 0\n               OpDecorate %xe_host_depth_store_dest DescriptorSet 0\n               OpDecorate %xe_host_depth_store_source Binding 0\n               OpDecorate %xe_host_depth_store_source DescriptorSet 1\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n       %bool = OpTypeBool\n     %uint_2 = OpConstant %uint 2\n     %uint_1 = OpConstant %uint 1\n     %uint_0 = OpConstant %uint 0\n       %1828 = OpConstantComposite %v2uint %uint_1 %uint_1\n    %uint_80 = OpConstant %uint 80\n    %uint_16 = OpConstant %uint 16\n       %2719 = OpConstantComposite %v2uint %uint_80 %uint_16\n        %int = OpTypeInt 32 1\n      %int_2 = OpConstant %int 2\n    %uint_10 = OpConstant %uint 10\n       %1927 = OpConstantComposite %v2uint %uint_0 %uint_10\n  %uint_1023 = OpConstant %uint 1023\n     %uint_3 = OpConstant %uint 3\n    %uint_20 = OpConstant %uint 20\n    %uint_13 = OpConstant %uint 13\n       %2053 = OpConstantComposite %v2uint %uint_10 %uint_13\n     %uint_7 = OpConstant %uint 7\n%push_const_block_xe = OpTypeStruct %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n      %int_0 = OpConstant %int 0\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n      %int_1 = OpConstant %int 1\n     %v3uint = OpTypeVector %uint 3\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n%_ptr_Input_uint = OpTypePointer Input %uint\n      %v2int = OpTypeVector %int 2\n     %v4uint = OpTypeVector %uint 4\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_host_depth_store_dest_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_host_depth_store_dest_xe_block = OpTypePointer Uniform %xe_host_depth_store_dest_xe_block\n%xe_host_depth_store_dest = OpVariable %_ptr_Uniform_xe_host_depth_store_dest_xe_block Uniform\n      %int_4 = OpConstant %int 4\n      %float = OpTypeFloat 32\n        %182 = OpTypeImage %float 2D 0 0 1 1 Unknown\n%_ptr_UniformConstant_182 = OpTypePointer UniformConstant %182\n%xe_host_depth_store_source = OpVariable %_ptr_UniformConstant_182 UniformConstant\n    %v4float = OpTypeVector %float 4\n       %1824 = OpConstantComposite %v2int %int_1 %int_0\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n       %1833 = OpConstantComposite %v2int %int_2 %int_0\n      %int_3 = OpConstant %int 3\n       %1842 = OpConstantComposite %v2int %int_3 %int_0\n     %uint_8 = OpConstant %uint 8\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_8 %uint_8 %uint_1\n       %1954 = OpConstantComposite %v2uint %uint_7 %uint_7\n       %2213 = OpConstantComposite %v2uint %uint_1023 %uint_1023\n       %1870 = OpConstantComposite %v2uint %uint_3 %uint_3\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %22245 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %15627 = OpLoad %uint %22245\n      %20439 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %22340 = OpLoad %uint %20439\n      %10293 = OpCompositeConstruct %v2uint %22340 %22340\n      %24330 = OpShiftRightLogical %v2uint %10293 %2053\n       %6551 = OpBitwiseAnd %v2uint %24330 %1954\n      %21183 = OpAccessChain %_ptr_Input_uint %gl_GlobalInvocationID %uint_0\n      %23517 = OpLoad %uint %21183\n      %23384 = OpShiftRightLogical %uint %23517 %uint_1\n       %7355 = OpShiftRightLogical %uint %15627 %uint_20\n      %16946 = OpBitwiseAnd %uint %7355 %uint_1023\n       %8846 = OpIAdd %uint %16946 %uint_1\n      %11841 = OpCompositeExtract %uint %6551 0\n      %17907 = OpIMul %uint %8846 %11841\n       %7287 = OpUGreaterThanEqual %bool %23384 %17907\n               OpSelectionMerge %16345 DontFlatten\n               OpBranchConditional %7287 %21992 %16345\n      %21992 = OpLabel\n               OpBranch %19578\n      %16345 = OpLabel\n      %10771 = OpCompositeConstruct %v2uint %15627 %15627\n      %13581 = OpShiftRightLogical %v2uint %10771 %1927\n      %23379 = OpBitwiseAnd %v2uint %13581 %2213\n      %16245 = OpShiftLeftLogical %v2uint %23379 %1870\n      %20127 = OpIMul %v2uint %16245 %6551\n      %19539 = OpShiftLeftLogical %uint %23517 %uint_2\n      %17126 = OpAccessChain %_ptr_Input_uint %gl_GlobalInvocationID %uint_1\n      %22160 = OpLoad %uint %17126\n      %22686 = OpShiftRightLogical %uint %22160 %uint_1\n       %6471 = OpCompositeConstruct %v2uint %19539 %22686\n       %8058 = OpIAdd %v2uint %20127 %6471\n       %8432 = OpBitcast %v2int %8058\n       %7291 = OpBitcast %v2uint %8432\n      %22610 = OpShiftLeftLogical %v2uint %7291 %1828\n       %8742 = OpLoad %v3uint %gl_GlobalInvocationID\n      %16994 = OpVectorShuffle %v2uint %8742 %8742 0 1\n      %24648 = OpBitwiseAnd %v2uint %16994 %1828\n      %14895 = OpBitwiseOr %v2uint %22610 %24648\n      %10861 = OpBitwiseAnd %uint %22340 %uint_1023\n      %22341 = OpIMul %v2uint %2719 %6551\n      %16817 = OpUDiv %v2uint %14895 %22341\n       %9129 = OpCompositeExtract %uint %16817 1\n      %11046 = OpIMul %uint %9129 %10861\n      %24741 = OpCompositeExtract %uint %16817 0\n      %20806 = OpIAdd %uint %11046 %24741\n      %13527 = OpIMul %v2uint %16817 %22341\n      %20715 = OpISub %v2uint %14895 %13527\n       %7303 = OpCompositeExtract %uint %22341 0\n      %22882 = OpCompositeExtract %uint %22341 1\n      %13170 = OpIMul %uint %7303 %22882\n      %15520 = OpIMul %uint %20806 %13170\n      %16084 = OpCompositeExtract %uint %20715 1\n      %15890 = OpIMul %uint %16084 %7303\n      %24665 = OpCompositeExtract %uint %20715 0\n      %22752 = OpIAdd %uint %15890 %24665\n      %18052 = OpIAdd %uint %15520 %22752\n      %15803 = OpShiftLeftLogical %uint %18052 %int_2\n      %10085 = OpBitwiseAnd %uint %22160 %uint_1\n      %11493 = OpShiftLeftLogical %uint %10085 %uint_1\n      %23602 = OpBitcast %int %11493\n      %16193 = OpIAdd %int %23602 %int_1\n      %12776 = OpShiftRightLogical %uint %15803 %int_4\n       %7456 = OpLoad %182 %xe_host_depth_store_source\n      %16549 = OpImageFetch %v4float %7456 %8432 Sample %23602\n      %23455 = OpCompositeExtract %float %16549 0\n      %14907 = OpLoad %182 %xe_host_depth_store_source\n      %18741 = OpImageFetch %v4float %14907 %8432 Sample %16193\n      %24082 = OpCompositeExtract %float %18741 0\n       %9464 = OpLoad %182 %xe_host_depth_store_source\n      %13324 = OpIAdd %v2int %8432 %1824\n      %16413 = OpImageFetch %v4float %9464 %13324 Sample %23602\n       %9992 = OpCompositeExtract %float %16413 0\n      %14908 = OpLoad %182 %xe_host_depth_store_source\n      %19102 = OpImageFetch %v4float %14908 %13324 Sample %16193\n      %20719 = OpCompositeExtract %float %19102 0\n       %6487 = OpCompositeConstruct %v4float %23455 %24082 %9992 %20719\n      %20366 = OpBitcast %v4uint %6487\n      %12860 = OpAccessChain %_ptr_Uniform_v4uint %xe_host_depth_store_dest %int_0 %12776\n               OpStore %12860 %20366\n       %8192 = OpIAdd %uint %15803 %uint_16\n       %8599 = OpShiftRightLogical %uint %8192 %int_4\n      %21084 = OpLoad %182 %xe_host_depth_store_source\n      %11132 = OpIAdd %v2int %8432 %1833\n      %16414 = OpImageFetch %v4float %21084 %11132 Sample %23602\n       %9993 = OpCompositeExtract %float %16414 0\n      %14909 = OpLoad %182 %xe_host_depth_store_source\n      %18742 = OpImageFetch %v4float %14909 %11132 Sample %16193\n      %24083 = OpCompositeExtract %float %18742 0\n       %9465 = OpLoad %182 %xe_host_depth_store_source\n      %13325 = OpIAdd %v2int %8432 %1842\n      %16415 = OpImageFetch %v4float %9465 %13325 Sample %23602\n       %9994 = OpCompositeExtract %float %16415 0\n      %14910 = OpLoad %182 %xe_host_depth_store_source\n      %19103 = OpImageFetch %v4float %14910 %13325 Sample %16193\n      %20720 = OpCompositeExtract %float %19103 0\n       %6488 = OpCompositeConstruct %v4float %9993 %24083 %9994 %20720\n      %20367 = OpBitcast %v4uint %6488\n      %15159 = OpAccessChain %_ptr_Uniform_v4uint %xe_host_depth_store_dest %int_0 %8599\n               OpStore %15159 %20367\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t host_depth_store_4xmsaa_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x000060A6, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000008, 0x00000008, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x000003DE, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000B0006, 0x000003DE, 0x00000000, 0x685F6578,\n    0x5F74736F, 0x74706564, 0x74735F68, 0x5F65726F, 0x74636572, 0x6C676E61,\n    0x00000065, 0x000C0006, 0x000003DE, 0x00000001, 0x685F6578, 0x5F74736F,\n    0x74706564, 0x74735F68, 0x5F65726F, 0x646E6572, 0x745F7265, 0x65677261,\n    0x00000074, 0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473,\n    0x00006578, 0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C,\n    0x7461636F, 0x496E6F69, 0x00000044, 0x000B0005, 0x000007B4, 0x685F6578,\n    0x5F74736F, 0x74706564, 0x74735F68, 0x5F65726F, 0x74736564, 0x5F65785F,\n    0x636F6C62, 0x0000006B, 0x00050006, 0x000007B4, 0x00000000, 0x61746164,\n    0x00000000, 0x00090005, 0x000012B6, 0x685F6578, 0x5F74736F, 0x74706564,\n    0x74735F68, 0x5F65726F, 0x74736564, 0x00000000, 0x00090005, 0x00000E7D,\n    0x685F6578, 0x5F74736F, 0x74706564, 0x74735F68, 0x5F65726F, 0x72756F73,\n    0x00006563, 0x00030047, 0x000003DE, 0x00000002, 0x00050048, 0x000003DE,\n    0x00000000, 0x00000023, 0x00000000, 0x00050048, 0x000003DE, 0x00000001,\n    0x00000023, 0x00000004, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C,\n    0x00040047, 0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4,\n    0x00000003, 0x00040048, 0x000007B4, 0x00000000, 0x00000019, 0x00050048,\n    0x000007B4, 0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x000012B6,\n    0x00000019, 0x00040047, 0x000012B6, 0x00000021, 0x00000000, 0x00040047,\n    0x000012B6, 0x00000022, 0x00000000, 0x00040047, 0x00000E7D, 0x00000021,\n    0x00000000, 0x00040047, 0x00000E7D, 0x00000022, 0x00000001, 0x00040047,\n    0x00000AC7, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00020014, 0x00000009,\n    0x0004002B, 0x0000000B, 0x00000A10, 0x00000002, 0x0004002B, 0x0000000B,\n    0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000,\n    0x0005002C, 0x00000011, 0x00000724, 0x00000A0D, 0x00000A0D, 0x0004002B,\n    0x0000000B, 0x00000AFA, 0x00000050, 0x0004002B, 0x0000000B, 0x00000A3A,\n    0x00000010, 0x0005002C, 0x00000011, 0x00000A9F, 0x00000AFA, 0x00000A3A,\n    0x00040015, 0x0000000C, 0x00000020, 0x00000001, 0x0004002B, 0x0000000C,\n    0x00000A11, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A28, 0x0000000A,\n    0x0005002C, 0x00000011, 0x00000787, 0x00000A0A, 0x00000A28, 0x0004002B,\n    0x0000000B, 0x00000A44, 0x000003FF, 0x0004002B, 0x0000000B, 0x00000A13,\n    0x00000003, 0x0004002B, 0x0000000B, 0x00000A46, 0x00000014, 0x0004002B,\n    0x0000000B, 0x00000A31, 0x0000000D, 0x0005002C, 0x00000011, 0x00000805,\n    0x00000A28, 0x00000A31, 0x0004002B, 0x0000000B, 0x00000A1F, 0x00000007,\n    0x0004001E, 0x000003DE, 0x0000000B, 0x0000000B, 0x00040020, 0x0000065B,\n    0x00000009, 0x000003DE, 0x0004003B, 0x0000065B, 0x00000CE9, 0x00000009,\n    0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000, 0x00040020, 0x00000288,\n    0x00000009, 0x0000000B, 0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001,\n    0x00040017, 0x00000014, 0x0000000B, 0x00000003, 0x00040020, 0x00000291,\n    0x00000001, 0x00000014, 0x0004003B, 0x00000291, 0x00000F48, 0x00000001,\n    0x00040020, 0x00000289, 0x00000001, 0x0000000B, 0x00040017, 0x00000012,\n    0x0000000C, 0x00000002, 0x00040017, 0x00000017, 0x0000000B, 0x00000004,\n    0x0003001D, 0x000007DC, 0x00000017, 0x0003001E, 0x000007B4, 0x000007DC,\n    0x00040020, 0x00000A32, 0x00000002, 0x000007B4, 0x0004003B, 0x00000A32,\n    0x000012B6, 0x00000002, 0x0004002B, 0x0000000C, 0x00000A17, 0x00000004,\n    0x00030016, 0x0000000D, 0x00000020, 0x00090019, 0x000000B6, 0x0000000D,\n    0x00000001, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000000,\n    0x00040020, 0x00000333, 0x00000000, 0x000000B6, 0x0004003B, 0x00000333,\n    0x00000E7D, 0x00000000, 0x00040017, 0x0000001D, 0x0000000D, 0x00000004,\n    0x0005002C, 0x00000012, 0x00000720, 0x00000A0E, 0x00000A0B, 0x00040020,\n    0x00000294, 0x00000002, 0x00000017, 0x0005002C, 0x00000012, 0x00000729,\n    0x00000A11, 0x00000A0B, 0x0004002B, 0x0000000C, 0x00000A14, 0x00000003,\n    0x0005002C, 0x00000012, 0x00000732, 0x00000A14, 0x00000A0B, 0x0004002B,\n    0x0000000B, 0x00000A22, 0x00000008, 0x0006002C, 0x00000014, 0x00000AC7,\n    0x00000A22, 0x00000A22, 0x00000A0D, 0x0005002C, 0x00000011, 0x000007A2,\n    0x00000A1F, 0x00000A1F, 0x0005002C, 0x00000011, 0x000008A5, 0x00000A44,\n    0x00000A44, 0x0005002C, 0x00000011, 0x0000074E, 0x00000A13, 0x00000A13,\n    0x00050036, 0x00000008, 0x0000161F, 0x00000000, 0x00000502, 0x000200F8,\n    0x00003B06, 0x000300F7, 0x00004C7A, 0x00000000, 0x000300FB, 0x00000A0A,\n    0x00002E68, 0x000200F8, 0x00002E68, 0x00050041, 0x00000288, 0x000056E5,\n    0x00000CE9, 0x00000A0B, 0x0004003D, 0x0000000B, 0x00003D0B, 0x000056E5,\n    0x00050041, 0x00000288, 0x00004FD7, 0x00000CE9, 0x00000A0E, 0x0004003D,\n    0x0000000B, 0x00005744, 0x00004FD7, 0x00050050, 0x00000011, 0x00002835,\n    0x00005744, 0x00005744, 0x000500C2, 0x00000011, 0x00005F0A, 0x00002835,\n    0x00000805, 0x000500C7, 0x00000011, 0x00001997, 0x00005F0A, 0x000007A2,\n    0x00050041, 0x00000289, 0x000052BF, 0x00000F48, 0x00000A0A, 0x0004003D,\n    0x0000000B, 0x00005BDD, 0x000052BF, 0x000500C2, 0x0000000B, 0x00005B58,\n    0x00005BDD, 0x00000A0D, 0x000500C2, 0x0000000B, 0x00001CBB, 0x00003D0B,\n    0x00000A46, 0x000500C7, 0x0000000B, 0x00004232, 0x00001CBB, 0x00000A44,\n    0x00050080, 0x0000000B, 0x0000228E, 0x00004232, 0x00000A0D, 0x00050051,\n    0x0000000B, 0x00002E41, 0x00001997, 0x00000000, 0x00050084, 0x0000000B,\n    0x000045F3, 0x0000228E, 0x00002E41, 0x000500AE, 0x00000009, 0x00001C77,\n    0x00005B58, 0x000045F3, 0x000300F7, 0x00003FD9, 0x00000002, 0x000400FA,\n    0x00001C77, 0x000055E8, 0x00003FD9, 0x000200F8, 0x000055E8, 0x000200F9,\n    0x00004C7A, 0x000200F8, 0x00003FD9, 0x00050050, 0x00000011, 0x00002A13,\n    0x00003D0B, 0x00003D0B, 0x000500C2, 0x00000011, 0x0000350D, 0x00002A13,\n    0x00000787, 0x000500C7, 0x00000011, 0x00005B53, 0x0000350D, 0x000008A5,\n    0x000500C4, 0x00000011, 0x00003F75, 0x00005B53, 0x0000074E, 0x00050084,\n    0x00000011, 0x00004E9F, 0x00003F75, 0x00001997, 0x000500C4, 0x0000000B,\n    0x00004C53, 0x00005BDD, 0x00000A10, 0x00050041, 0x00000289, 0x000042E6,\n    0x00000F48, 0x00000A0D, 0x0004003D, 0x0000000B, 0x00005690, 0x000042E6,\n    0x000500C2, 0x0000000B, 0x0000589E, 0x00005690, 0x00000A0D, 0x00050050,\n    0x00000011, 0x00001947, 0x00004C53, 0x0000589E, 0x00050080, 0x00000011,\n    0x00001F7A, 0x00004E9F, 0x00001947, 0x0004007C, 0x00000012, 0x000020F0,\n    0x00001F7A, 0x0004007C, 0x00000011, 0x00001C7B, 0x000020F0, 0x000500C4,\n    0x00000011, 0x00005852, 0x00001C7B, 0x00000724, 0x0004003D, 0x00000014,\n    0x00002226, 0x00000F48, 0x0007004F, 0x00000011, 0x00004262, 0x00002226,\n    0x00002226, 0x00000000, 0x00000001, 0x000500C7, 0x00000011, 0x00006048,\n    0x00004262, 0x00000724, 0x000500C5, 0x00000011, 0x00003A2F, 0x00005852,\n    0x00006048, 0x000500C7, 0x0000000B, 0x00002A6D, 0x00005744, 0x00000A44,\n    0x00050084, 0x00000011, 0x00005745, 0x00000A9F, 0x00001997, 0x00050086,\n    0x00000011, 0x000041B1, 0x00003A2F, 0x00005745, 0x00050051, 0x0000000B,\n    0x000023A9, 0x000041B1, 0x00000001, 0x00050084, 0x0000000B, 0x00002B26,\n    0x000023A9, 0x00002A6D, 0x00050051, 0x0000000B, 0x000060A5, 0x000041B1,\n    0x00000000, 0x00050080, 0x0000000B, 0x00005146, 0x00002B26, 0x000060A5,\n    0x00050084, 0x00000011, 0x000034D7, 0x000041B1, 0x00005745, 0x00050082,\n    0x00000011, 0x000050EB, 0x00003A2F, 0x000034D7, 0x00050051, 0x0000000B,\n    0x00001C87, 0x00005745, 0x00000000, 0x00050051, 0x0000000B, 0x00005962,\n    0x00005745, 0x00000001, 0x00050084, 0x0000000B, 0x00003372, 0x00001C87,\n    0x00005962, 0x00050084, 0x0000000B, 0x00003CA0, 0x00005146, 0x00003372,\n    0x00050051, 0x0000000B, 0x00003ED4, 0x000050EB, 0x00000001, 0x00050084,\n    0x0000000B, 0x00003E12, 0x00003ED4, 0x00001C87, 0x00050051, 0x0000000B,\n    0x00006059, 0x000050EB, 0x00000000, 0x00050080, 0x0000000B, 0x000058E0,\n    0x00003E12, 0x00006059, 0x00050080, 0x0000000B, 0x00004684, 0x00003CA0,\n    0x000058E0, 0x000500C4, 0x0000000B, 0x00003DBB, 0x00004684, 0x00000A11,\n    0x000500C7, 0x0000000B, 0x00002765, 0x00005690, 0x00000A0D, 0x000500C4,\n    0x0000000B, 0x00002CE5, 0x00002765, 0x00000A0D, 0x0004007C, 0x0000000C,\n    0x00005C32, 0x00002CE5, 0x00050080, 0x0000000C, 0x00003F41, 0x00005C32,\n    0x00000A0E, 0x000500C2, 0x0000000B, 0x000031E8, 0x00003DBB, 0x00000A17,\n    0x0004003D, 0x000000B6, 0x00001D20, 0x00000E7D, 0x0007005F, 0x0000001D,\n    0x000040A5, 0x00001D20, 0x000020F0, 0x00000040, 0x00005C32, 0x00050051,\n    0x0000000D, 0x00005B9F, 0x000040A5, 0x00000000, 0x0004003D, 0x000000B6,\n    0x00003A3B, 0x00000E7D, 0x0007005F, 0x0000001D, 0x00004935, 0x00003A3B,\n    0x000020F0, 0x00000040, 0x00003F41, 0x00050051, 0x0000000D, 0x00005E12,\n    0x00004935, 0x00000000, 0x0004003D, 0x000000B6, 0x000024F8, 0x00000E7D,\n    0x00050080, 0x00000012, 0x0000340C, 0x000020F0, 0x00000720, 0x0007005F,\n    0x0000001D, 0x0000401D, 0x000024F8, 0x0000340C, 0x00000040, 0x00005C32,\n    0x00050051, 0x0000000D, 0x00002708, 0x0000401D, 0x00000000, 0x0004003D,\n    0x000000B6, 0x00003A3C, 0x00000E7D, 0x0007005F, 0x0000001D, 0x00004A9E,\n    0x00003A3C, 0x0000340C, 0x00000040, 0x00003F41, 0x00050051, 0x0000000D,\n    0x000050EF, 0x00004A9E, 0x00000000, 0x00070050, 0x0000001D, 0x00001957,\n    0x00005B9F, 0x00005E12, 0x00002708, 0x000050EF, 0x0004007C, 0x00000017,\n    0x00004F8E, 0x00001957, 0x00060041, 0x00000294, 0x0000323C, 0x000012B6,\n    0x00000A0B, 0x000031E8, 0x0003003E, 0x0000323C, 0x00004F8E, 0x00050080,\n    0x0000000B, 0x00002000, 0x00003DBB, 0x00000A3A, 0x000500C2, 0x0000000B,\n    0x00002197, 0x00002000, 0x00000A17, 0x0004003D, 0x000000B6, 0x0000525C,\n    0x00000E7D, 0x00050080, 0x00000012, 0x00002B7C, 0x000020F0, 0x00000729,\n    0x0007005F, 0x0000001D, 0x0000401E, 0x0000525C, 0x00002B7C, 0x00000040,\n    0x00005C32, 0x00050051, 0x0000000D, 0x00002709, 0x0000401E, 0x00000000,\n    0x0004003D, 0x000000B6, 0x00003A3D, 0x00000E7D, 0x0007005F, 0x0000001D,\n    0x00004936, 0x00003A3D, 0x00002B7C, 0x00000040, 0x00003F41, 0x00050051,\n    0x0000000D, 0x00005E13, 0x00004936, 0x00000000, 0x0004003D, 0x000000B6,\n    0x000024F9, 0x00000E7D, 0x00050080, 0x00000012, 0x0000340D, 0x000020F0,\n    0x00000732, 0x0007005F, 0x0000001D, 0x0000401F, 0x000024F9, 0x0000340D,\n    0x00000040, 0x00005C32, 0x00050051, 0x0000000D, 0x0000270A, 0x0000401F,\n    0x00000000, 0x0004003D, 0x000000B6, 0x00003A3E, 0x00000E7D, 0x0007005F,\n    0x0000001D, 0x00004A9F, 0x00003A3E, 0x0000340D, 0x00000040, 0x00003F41,\n    0x00050051, 0x0000000D, 0x000050F0, 0x00004A9F, 0x00000000, 0x00070050,\n    0x0000001D, 0x00001958, 0x00002709, 0x00005E13, 0x0000270A, 0x000050F0,\n    0x0004007C, 0x00000017, 0x00004F8F, 0x00001958, 0x00060041, 0x00000294,\n    0x00003B37, 0x000012B6, 0x00000A0B, 0x00002197, 0x0003003E, 0x00003B37,\n    0x00004F8F, 0x000200F9, 0x00004C7A, 0x000200F8, 0x00004C7A, 0x000100FD,\n    0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/passthrough_position_xy_vs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 24988\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint Vertex %main \"main\" %_ %xe_in_position\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %gl_PerVertex \"gl_PerVertex\"\n               OpMemberName %gl_PerVertex 0 \"gl_Position\"\n               OpMemberName %gl_PerVertex 1 \"gl_PointSize\"\n               OpMemberName %gl_PerVertex 2 \"gl_ClipDistance\"\n               OpMemberName %gl_PerVertex 3 \"gl_CullDistance\"\n               OpName %_ \"\"\n               OpName %xe_in_position \"xe_in_position\"\n               OpDecorate %gl_PerVertex Block\n               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position\n               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize\n               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance\n               OpMemberDecorate %gl_PerVertex 3 BuiltIn CullDistance\n               OpDecorate %xe_in_position Location 0\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n      %float = OpTypeFloat 32\n    %v4float = OpTypeVector %float 4\n       %uint = OpTypeInt 32 0\n     %uint_1 = OpConstant %uint 1\n%_arr_float_uint_1 = OpTypeArray %float %uint_1\n%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1 %_arr_float_uint_1\n%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex\n          %_ = OpVariable %_ptr_Output_gl_PerVertex Output\n        %int = OpTypeInt 32 1\n      %int_0 = OpConstant %int 0\n    %v2float = OpTypeVector %float 2\n%_ptr_Input_v2float = OpTypePointer Input %v2float\n%xe_in_position = OpVariable %_ptr_Input_v2float Input\n    %float_0 = OpConstant %float 0\n    %float_1 = OpConstant %float 1\n%_ptr_Output_v4float = OpTypePointer Output %v4float\n       %main = OpFunction %void None %1282\n      %24987 = OpLabel\n      %17674 = OpLoad %v2float %xe_in_position\n      %21995 = OpCompositeExtract %float %17674 0\n      %23384 = OpCompositeExtract %float %17674 1\n      %18260 = OpCompositeConstruct %v4float %21995 %23384 %float_0 %float_1\n      %12055 = OpAccessChain %_ptr_Output_v4float %_ %int_0\n               OpStore %12055 %18260\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t passthrough_position_xy_vs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x0000619C, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0007000F, 0x00000000,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00001342, 0x00001562, 0x00030003,\n    0x00000002, 0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F,\n    0x665F6C6F, 0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004,\n    0x455F4C47, 0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865,\n    0x665F6572, 0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47,\n    0x4C474F4F, 0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F,\n    0x69746365, 0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45,\n    0x64756C63, 0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F,\n    0x6E69616D, 0x00000000, 0x00060005, 0x00000B77, 0x505F6C67, 0x65567265,\n    0x78657472, 0x00000000, 0x00060006, 0x00000B77, 0x00000000, 0x505F6C67,\n    0x7469736F, 0x006E6F69, 0x00070006, 0x00000B77, 0x00000001, 0x505F6C67,\n    0x746E696F, 0x657A6953, 0x00000000, 0x00070006, 0x00000B77, 0x00000002,\n    0x435F6C67, 0x4470696C, 0x61747369, 0x0065636E, 0x00070006, 0x00000B77,\n    0x00000003, 0x435F6C67, 0x446C6C75, 0x61747369, 0x0065636E, 0x00030005,\n    0x00001342, 0x00000000, 0x00060005, 0x00001562, 0x695F6578, 0x6F705F6E,\n    0x69746973, 0x00006E6F, 0x00030047, 0x00000B77, 0x00000002, 0x00050048,\n    0x00000B77, 0x00000000, 0x0000000B, 0x00000000, 0x00050048, 0x00000B77,\n    0x00000001, 0x0000000B, 0x00000001, 0x00050048, 0x00000B77, 0x00000002,\n    0x0000000B, 0x00000003, 0x00050048, 0x00000B77, 0x00000003, 0x0000000B,\n    0x00000004, 0x00040047, 0x00001562, 0x0000001E, 0x00000000, 0x00020013,\n    0x00000008, 0x00030021, 0x00000502, 0x00000008, 0x00030016, 0x0000000D,\n    0x00000020, 0x00040017, 0x0000001D, 0x0000000D, 0x00000004, 0x00040015,\n    0x0000000B, 0x00000020, 0x00000000, 0x0004002B, 0x0000000B, 0x00000A0D,\n    0x00000001, 0x0004001C, 0x0000022A, 0x0000000D, 0x00000A0D, 0x0006001E,\n    0x00000B77, 0x0000001D, 0x0000000D, 0x0000022A, 0x0000022A, 0x00040020,\n    0x00000231, 0x00000003, 0x00000B77, 0x0004003B, 0x00000231, 0x00001342,\n    0x00000003, 0x00040015, 0x0000000C, 0x00000020, 0x00000001, 0x0004002B,\n    0x0000000C, 0x00000A0B, 0x00000000, 0x00040017, 0x00000013, 0x0000000D,\n    0x00000002, 0x00040020, 0x00000290, 0x00000001, 0x00000013, 0x0004003B,\n    0x00000290, 0x00001562, 0x00000001, 0x0004002B, 0x0000000D, 0x00000A0C,\n    0x00000000, 0x0004002B, 0x0000000D, 0x0000008A, 0x3F800000, 0x00040020,\n    0x0000029A, 0x00000003, 0x0000001D, 0x00050036, 0x00000008, 0x0000161F,\n    0x00000000, 0x00000502, 0x000200F8, 0x0000619B, 0x0004003D, 0x00000013,\n    0x0000450A, 0x00001562, 0x00050051, 0x0000000D, 0x000055EB, 0x0000450A,\n    0x00000000, 0x00050051, 0x0000000D, 0x00005B58, 0x0000450A, 0x00000001,\n    0x00070050, 0x0000001D, 0x00004754, 0x000055EB, 0x00005B58, 0x00000A0C,\n    0x0000008A, 0x00050041, 0x0000029A, 0x00002F17, 0x00001342, 0x00000A0B,\n    0x0003003E, 0x00002F17, 0x00004754, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/resolve_clear_32bpp_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25080\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 8 8 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_resolve_clear_value\"\n               OpMemberName %push_const_block_xe 1 \"xe_resolve_edram_info\"\n               OpMemberName %push_const_block_xe 2 \"xe_resolve_coordinate_info\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_resolve_edram_xe_block \"xe_resolve_edram_xe_block\"\n               OpMemberName %xe_resolve_edram_xe_block 0 \"data\"\n               OpName %xe_resolve_edram \"xe_resolve_edram\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 8\n               OpMemberDecorate %push_const_block_xe 2 Offset 12\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_resolve_edram_xe_block BufferBlock\n               OpMemberDecorate %xe_resolve_edram_xe_block 0 NonReadable\n               OpMemberDecorate %xe_resolve_edram_xe_block 0 Offset 0\n               OpDecorate %xe_resolve_edram NonReadable\n               OpDecorate %xe_resolve_edram Binding 0\n               OpDecorate %xe_resolve_edram DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n       %bool = OpTypeBool\n     %uint_2 = OpConstant %uint 2\n     %uint_1 = OpConstant %uint 1\n       %1837 = OpConstantComposite %v2uint %uint_2 %uint_1\n     %v2bool = OpTypeVector %bool 2\n     %uint_0 = OpConstant %uint 0\n       %1807 = OpConstantComposite %v2uint %uint_0 %uint_0\n       %1828 = OpConstantComposite %v2uint %uint_1 %uint_1\n    %uint_80 = OpConstant %uint 80\n    %uint_16 = OpConstant %uint 16\n       %2719 = OpConstantComposite %v2uint %uint_80 %uint_16\n        %int = OpTypeInt 32 1\n      %int_2 = OpConstant %int 2\n%push_const_block_xe = OpTypeStruct %v2uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n      %int_1 = OpConstant %int 1\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n      %int_0 = OpConstant %int 0\n  %uint_1023 = OpConstant %uint 1023\n    %uint_10 = OpConstant %uint 10\n     %uint_3 = OpConstant %uint 3\n  %uint_4096 = OpConstant %uint 4096\n    %uint_13 = OpConstant %uint 13\n  %uint_2047 = OpConstant %uint 2047\n      %int_4 = OpConstant %int 4\n    %uint_15 = OpConstant %uint 15\n     %uint_4 = OpConstant %uint 4\n       %1855 = OpConstantComposite %v2uint %uint_0 %uint_4\n     %uint_5 = OpConstant %uint 5\n%_ptr_PushConstant_v2uint = OpTypePointer PushConstant %v2uint\n     %v3uint = OpTypeVector %uint 3\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n%_ptr_Input_uint = OpTypePointer Input %uint\n       %1834 = OpConstantComposite %v2uint %uint_3 %uint_0\n     %v4uint = OpTypeVector %uint 4\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_resolve_edram_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_resolve_edram_xe_block = OpTypePointer Uniform %xe_resolve_edram_xe_block\n%xe_resolve_edram = OpVariable %_ptr_Uniform_xe_resolve_edram_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n     %uint_8 = OpConstant %uint 8\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_8 %uint_8 %uint_1\n       %1954 = OpConstantComposite %v2uint %uint_15 %uint_1\n       %1870 = OpConstantComposite %v2uint %uint_3 %uint_3\n    %uint_40 = OpConstant %uint 40\n     %int_40 = OpConstant %int 40\n    %int_n40 = OpConstant %int -40\n  %uint_1280 = OpConstant %uint 1280\n%uint_2621440 = OpConstant %uint 2621440\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %22245 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %15627 = OpLoad %uint %22245\n      %22700 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %20824 = OpLoad %uint %22700\n      %20561 = OpBitwiseAnd %uint %15627 %uint_1023\n      %20073 = OpShiftRightLogical %uint %15627 %uint_10\n       %7177 = OpBitwiseAnd %uint %20073 %uint_3\n      %23023 = OpBitwiseAnd %uint %15627 %uint_4096\n      %20495 = OpINotEqual %bool %23023 %uint_0\n       %8141 = OpShiftRightLogical %uint %15627 %uint_13\n      %24990 = OpBitwiseAnd %uint %8141 %uint_2047\n       %8871 = OpCompositeConstruct %v2uint %20824 %20824\n       %9576 = OpShiftRightLogical %v2uint %8871 %1855\n      %23379 = OpBitwiseAnd %v2uint %9576 %1954\n      %16207 = OpShiftLeftLogical %v2uint %23379 %1870\n      %23019 = OpIMul %v2uint %16207 %1828\n      %12819 = OpShiftRightLogical %uint %20824 %uint_5\n      %16204 = OpBitwiseAnd %uint %12819 %uint_2047\n      %19017 = OpAccessChain %_ptr_PushConstant_v2uint %push_consts_xe %int_0\n      %23788 = OpLoad %v2uint %19017\n      %13183 = OpCompositeConstruct %v2uint %7177 %7177\n      %21741 = OpUGreaterThanEqual %v2bool %13183 %1837\n      %22612 = OpSelect %v2uint %21741 %1828 %1807\n      %23890 = OpAccessChain %_ptr_Input_uint %gl_GlobalInvocationID %uint_0\n      %19209 = OpLoad %uint %23890\n      %20350 = OpCompositeExtract %uint %22612 0\n      %15478 = OpShiftLeftLogical %uint %16204 %20350\n      %15379 = OpUGreaterThanEqual %bool %19209 %15478\n               OpSelectionMerge %17447 DontFlatten\n               OpBranchConditional %15379 %21992 %17447\n      %21992 = OpLabel\n               OpBranch %19578\n      %17447 = OpLabel\n      %14637 = OpLoad %v3uint %gl_GlobalInvocationID\n      %20690 = OpVectorShuffle %v2uint %14637 %14637 0 1\n       %9909 = OpShiftLeftLogical %v2uint %20690 %1834\n      %23542 = OpShiftLeftLogical %v2uint %23019 %22612\n       %7525 = OpIAdd %v2uint %9909 %23542\n      %25079 = OpUDiv %v2uint %7525 %2719\n      %12360 = OpCompositeExtract %uint %25079 1\n      %11046 = OpIMul %uint %12360 %20561\n      %24665 = OpCompositeExtract %uint %25079 0\n      %21536 = OpIAdd %uint %11046 %24665\n       %8742 = OpIAdd %uint %24990 %21536\n       %6459 = OpIMul %v2uint %25079 %2719\n      %14279 = OpISub %v2uint %7525 %6459\n               OpSelectionMerge %19725 None\n               OpBranchConditional %20495 %10558 %19725\n      %10558 = OpLabel\n      %11791 = OpCompositeExtract %uint %14279 0\n      %24981 = OpBitcast %int %11791\n       %7841 = OpUGreaterThanEqual %bool %11791 %uint_40\n      %22568 = OpSelect %int %7841 %int_n40 %int_40\n      %11768 = OpIAdd %int %24981 %22568\n       %8071 = OpBitcast %uint %11768\n      %21574 = OpCompositeInsert %v2uint %8071 %14279 0\n               OpBranch %19725\n      %19725 = OpLabel\n       %8537 = OpPhi %v2uint %14279 %17447 %21574 %10558\n       %6671 = OpIMul %uint %8742 %uint_1280\n      %13892 = OpCompositeExtract %uint %8537 1\n      %15890 = OpIMul %uint %13892 %uint_80\n      %24666 = OpCompositeExtract %uint %8537 0\n      %21631 = OpIAdd %uint %15890 %24666\n       %9131 = OpIAdd %uint %6671 %21631\n      %10282 = OpUMod %uint %9131 %uint_2621440\n      %18361 = OpShiftLeftLogical %uint %10282 %int_2\n      %16987 = OpShiftRightLogical %uint %18361 %int_4\n       %7951 = OpVectorShuffle %v4uint %23788 %23788 0 0 0 0\n       %7737 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_edram %int_0 %16987\n               OpStore %7737 %7951\n       %8268 = OpIAdd %uint %18361 %uint_16\n       %6653 = OpShiftRightLogical %uint %8268 %int_4\n      %21727 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_edram %int_0 %6653\n               OpStore %21727 %7951\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t resolve_clear_32bpp_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x000061F8, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000008, 0x00000008, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x000003F6, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x00090006, 0x000003F6, 0x00000000, 0x725F6578,\n    0x6C6F7365, 0x635F6576, 0x7261656C, 0x6C61765F, 0x00006575, 0x00090006,\n    0x000003F6, 0x00000001, 0x725F6578, 0x6C6F7365, 0x655F6576, 0x6D617264,\n    0x666E695F, 0x0000006F, 0x000A0006, 0x000003F6, 0x00000002, 0x725F6578,\n    0x6C6F7365, 0x635F6576, 0x64726F6F, 0x74616E69, 0x6E695F65, 0x00006F66,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x00090005, 0x000007B4, 0x725F6578, 0x6C6F7365,\n    0x655F6576, 0x6D617264, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00070005, 0x00000CC7,\n    0x725F6578, 0x6C6F7365, 0x655F6576, 0x6D617264, 0x00000000, 0x00030047,\n    0x000003F6, 0x00000002, 0x00050048, 0x000003F6, 0x00000000, 0x00000023,\n    0x00000000, 0x00050048, 0x000003F6, 0x00000001, 0x00000023, 0x00000008,\n    0x00050048, 0x000003F6, 0x00000002, 0x00000023, 0x0000000C, 0x00040047,\n    0x00000F48, 0x0000000B, 0x0000001C, 0x00040047, 0x000007DC, 0x00000006,\n    0x00000010, 0x00030047, 0x000007B4, 0x00000003, 0x00040048, 0x000007B4,\n    0x00000000, 0x00000019, 0x00050048, 0x000007B4, 0x00000000, 0x00000023,\n    0x00000000, 0x00030047, 0x00000CC7, 0x00000019, 0x00040047, 0x00000CC7,\n    0x00000021, 0x00000000, 0x00040047, 0x00000CC7, 0x00000022, 0x00000000,\n    0x00040047, 0x00000AC7, 0x0000000B, 0x00000019, 0x00020013, 0x00000008,\n    0x00030021, 0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020,\n    0x00000000, 0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00020014,\n    0x00000009, 0x0004002B, 0x0000000B, 0x00000A10, 0x00000002, 0x0004002B,\n    0x0000000B, 0x00000A0D, 0x00000001, 0x0005002C, 0x00000011, 0x0000072D,\n    0x00000A10, 0x00000A0D, 0x00040017, 0x0000000F, 0x00000009, 0x00000002,\n    0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000, 0x0005002C, 0x00000011,\n    0x0000070F, 0x00000A0A, 0x00000A0A, 0x0005002C, 0x00000011, 0x00000724,\n    0x00000A0D, 0x00000A0D, 0x0004002B, 0x0000000B, 0x00000AFA, 0x00000050,\n    0x0004002B, 0x0000000B, 0x00000A3A, 0x00000010, 0x0005002C, 0x00000011,\n    0x00000A9F, 0x00000AFA, 0x00000A3A, 0x00040015, 0x0000000C, 0x00000020,\n    0x00000001, 0x0004002B, 0x0000000C, 0x00000A11, 0x00000002, 0x0005001E,\n    0x000003F6, 0x00000011, 0x0000000B, 0x0000000B, 0x00040020, 0x00000673,\n    0x00000009, 0x000003F6, 0x0004003B, 0x00000673, 0x00000CE9, 0x00000009,\n    0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001, 0x00040020, 0x00000288,\n    0x00000009, 0x0000000B, 0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000,\n    0x0004002B, 0x0000000B, 0x00000A44, 0x000003FF, 0x0004002B, 0x0000000B,\n    0x00000A28, 0x0000000A, 0x0004002B, 0x0000000B, 0x00000A13, 0x00000003,\n    0x0004002B, 0x0000000B, 0x00000AFE, 0x00001000, 0x0004002B, 0x0000000B,\n    0x00000A31, 0x0000000D, 0x0004002B, 0x0000000B, 0x00000A81, 0x000007FF,\n    0x0004002B, 0x0000000C, 0x00000A17, 0x00000004, 0x0004002B, 0x0000000B,\n    0x00000A37, 0x0000000F, 0x0004002B, 0x0000000B, 0x00000A16, 0x00000004,\n    0x0005002C, 0x00000011, 0x0000073F, 0x00000A0A, 0x00000A16, 0x0004002B,\n    0x0000000B, 0x00000A19, 0x00000005, 0x00040020, 0x0000028E, 0x00000009,\n    0x00000011, 0x00040017, 0x00000014, 0x0000000B, 0x00000003, 0x00040020,\n    0x00000291, 0x00000001, 0x00000014, 0x0004003B, 0x00000291, 0x00000F48,\n    0x00000001, 0x00040020, 0x00000289, 0x00000001, 0x0000000B, 0x0005002C,\n    0x00000011, 0x0000072A, 0x00000A13, 0x00000A0A, 0x00040017, 0x00000017,\n    0x0000000B, 0x00000004, 0x0003001D, 0x000007DC, 0x00000017, 0x0003001E,\n    0x000007B4, 0x000007DC, 0x00040020, 0x00000A32, 0x00000002, 0x000007B4,\n    0x0004003B, 0x00000A32, 0x00000CC7, 0x00000002, 0x00040020, 0x00000294,\n    0x00000002, 0x00000017, 0x0004002B, 0x0000000B, 0x00000A22, 0x00000008,\n    0x0006002C, 0x00000014, 0x00000AC7, 0x00000A22, 0x00000A22, 0x00000A0D,\n    0x0005002C, 0x00000011, 0x000007A2, 0x00000A37, 0x00000A0D, 0x0005002C,\n    0x00000011, 0x0000074E, 0x00000A13, 0x00000A13, 0x0004002B, 0x0000000B,\n    0x00000A82, 0x00000028, 0x0004002B, 0x0000000C, 0x00000A83, 0x00000028,\n    0x0004002B, 0x0000000C, 0x00000993, 0xFFFFFFD8, 0x0004002B, 0x0000000B,\n    0x00000184, 0x00000500, 0x0004002B, 0x0000000B, 0x0000086E, 0x00280000,\n    0x00050036, 0x00000008, 0x0000161F, 0x00000000, 0x00000502, 0x000200F8,\n    0x00003B06, 0x000300F7, 0x00004C7A, 0x00000000, 0x000300FB, 0x00000A0A,\n    0x00002E68, 0x000200F8, 0x00002E68, 0x00050041, 0x00000288, 0x000056E5,\n    0x00000CE9, 0x00000A0E, 0x0004003D, 0x0000000B, 0x00003D0B, 0x000056E5,\n    0x00050041, 0x00000288, 0x000058AC, 0x00000CE9, 0x00000A11, 0x0004003D,\n    0x0000000B, 0x00005158, 0x000058AC, 0x000500C7, 0x0000000B, 0x00005051,\n    0x00003D0B, 0x00000A44, 0x000500C2, 0x0000000B, 0x00004E69, 0x00003D0B,\n    0x00000A28, 0x000500C7, 0x0000000B, 0x00001C09, 0x00004E69, 0x00000A13,\n    0x000500C7, 0x0000000B, 0x000059EF, 0x00003D0B, 0x00000AFE, 0x000500AB,\n    0x00000009, 0x0000500F, 0x000059EF, 0x00000A0A, 0x000500C2, 0x0000000B,\n    0x00001FCD, 0x00003D0B, 0x00000A31, 0x000500C7, 0x0000000B, 0x0000619E,\n    0x00001FCD, 0x00000A81, 0x00050050, 0x00000011, 0x000022A7, 0x00005158,\n    0x00005158, 0x000500C2, 0x00000011, 0x00002568, 0x000022A7, 0x0000073F,\n    0x000500C7, 0x00000011, 0x00005B53, 0x00002568, 0x000007A2, 0x000500C4,\n    0x00000011, 0x00003F4F, 0x00005B53, 0x0000074E, 0x00050084, 0x00000011,\n    0x000059EB, 0x00003F4F, 0x00000724, 0x000500C2, 0x0000000B, 0x00003213,\n    0x00005158, 0x00000A19, 0x000500C7, 0x0000000B, 0x00003F4C, 0x00003213,\n    0x00000A81, 0x00050041, 0x0000028E, 0x00004A49, 0x00000CE9, 0x00000A0B,\n    0x0004003D, 0x00000011, 0x00005CEC, 0x00004A49, 0x00050050, 0x00000011,\n    0x0000337F, 0x00001C09, 0x00001C09, 0x000500AE, 0x0000000F, 0x000054ED,\n    0x0000337F, 0x0000072D, 0x000600A9, 0x00000011, 0x00005854, 0x000054ED,\n    0x00000724, 0x0000070F, 0x00050041, 0x00000289, 0x00005D52, 0x00000F48,\n    0x00000A0A, 0x0004003D, 0x0000000B, 0x00004B09, 0x00005D52, 0x00050051,\n    0x0000000B, 0x00004F7E, 0x00005854, 0x00000000, 0x000500C4, 0x0000000B,\n    0x00003C76, 0x00003F4C, 0x00004F7E, 0x000500AE, 0x00000009, 0x00003C13,\n    0x00004B09, 0x00003C76, 0x000300F7, 0x00004427, 0x00000002, 0x000400FA,\n    0x00003C13, 0x000055E8, 0x00004427, 0x000200F8, 0x000055E8, 0x000200F9,\n    0x00004C7A, 0x000200F8, 0x00004427, 0x0004003D, 0x00000014, 0x0000392D,\n    0x00000F48, 0x0007004F, 0x00000011, 0x000050D2, 0x0000392D, 0x0000392D,\n    0x00000000, 0x00000001, 0x000500C4, 0x00000011, 0x000026B5, 0x000050D2,\n    0x0000072A, 0x000500C4, 0x00000011, 0x00005BF6, 0x000059EB, 0x00005854,\n    0x00050080, 0x00000011, 0x00001D65, 0x000026B5, 0x00005BF6, 0x00050086,\n    0x00000011, 0x000061F7, 0x00001D65, 0x00000A9F, 0x00050051, 0x0000000B,\n    0x00003048, 0x000061F7, 0x00000001, 0x00050084, 0x0000000B, 0x00002B26,\n    0x00003048, 0x00005051, 0x00050051, 0x0000000B, 0x00006059, 0x000061F7,\n    0x00000000, 0x00050080, 0x0000000B, 0x00005420, 0x00002B26, 0x00006059,\n    0x00050080, 0x0000000B, 0x00002226, 0x0000619E, 0x00005420, 0x00050084,\n    0x00000011, 0x0000193B, 0x000061F7, 0x00000A9F, 0x00050082, 0x00000011,\n    0x000037C7, 0x00001D65, 0x0000193B, 0x000300F7, 0x00004D0D, 0x00000000,\n    0x000400FA, 0x0000500F, 0x0000293E, 0x00004D0D, 0x000200F8, 0x0000293E,\n    0x00050051, 0x0000000B, 0x00002E0F, 0x000037C7, 0x00000000, 0x0004007C,\n    0x0000000C, 0x00006195, 0x00002E0F, 0x000500AE, 0x00000009, 0x00001EA1,\n    0x00002E0F, 0x00000A82, 0x000600A9, 0x0000000C, 0x00005828, 0x00001EA1,\n    0x00000993, 0x00000A83, 0x00050080, 0x0000000C, 0x00002DF8, 0x00006195,\n    0x00005828, 0x0004007C, 0x0000000B, 0x00001F87, 0x00002DF8, 0x00060052,\n    0x00000011, 0x00005446, 0x00001F87, 0x000037C7, 0x00000000, 0x000200F9,\n    0x00004D0D, 0x000200F8, 0x00004D0D, 0x000700F5, 0x00000011, 0x00002159,\n    0x000037C7, 0x00004427, 0x00005446, 0x0000293E, 0x00050084, 0x0000000B,\n    0x00001A0F, 0x00002226, 0x00000184, 0x00050051, 0x0000000B, 0x00003644,\n    0x00002159, 0x00000001, 0x00050084, 0x0000000B, 0x00003E12, 0x00003644,\n    0x00000AFA, 0x00050051, 0x0000000B, 0x0000605A, 0x00002159, 0x00000000,\n    0x00050080, 0x0000000B, 0x0000547F, 0x00003E12, 0x0000605A, 0x00050080,\n    0x0000000B, 0x000023AB, 0x00001A0F, 0x0000547F, 0x00050089, 0x0000000B,\n    0x0000282A, 0x000023AB, 0x0000086E, 0x000500C4, 0x0000000B, 0x000047B9,\n    0x0000282A, 0x00000A11, 0x000500C2, 0x0000000B, 0x0000425B, 0x000047B9,\n    0x00000A17, 0x0009004F, 0x00000017, 0x00001F0F, 0x00005CEC, 0x00005CEC,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00060041, 0x00000294,\n    0x00001E39, 0x00000CC7, 0x00000A0B, 0x0000425B, 0x0003003E, 0x00001E39,\n    0x00001F0F, 0x00050080, 0x0000000B, 0x0000204C, 0x000047B9, 0x00000A3A,\n    0x000500C2, 0x0000000B, 0x000019FD, 0x0000204C, 0x00000A17, 0x00060041,\n    0x00000294, 0x000054DF, 0x00000CC7, 0x00000A0B, 0x000019FD, 0x0003003E,\n    0x000054DF, 0x00001F0F, 0x000200F9, 0x00004C7A, 0x000200F8, 0x00004C7A,\n    0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/resolve_clear_32bpp_scaled_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 24999\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 8 8 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_resolve_clear_value\"\n               OpMemberName %push_const_block_xe 1 \"xe_resolve_edram_info\"\n               OpMemberName %push_const_block_xe 2 \"xe_resolve_coordinate_info\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_resolve_edram_xe_block \"xe_resolve_edram_xe_block\"\n               OpMemberName %xe_resolve_edram_xe_block 0 \"data\"\n               OpName %xe_resolve_edram \"xe_resolve_edram\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 8\n               OpMemberDecorate %push_const_block_xe 2 Offset 12\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_resolve_edram_xe_block BufferBlock\n               OpMemberDecorate %xe_resolve_edram_xe_block 0 NonReadable\n               OpMemberDecorate %xe_resolve_edram_xe_block 0 Offset 0\n               OpDecorate %xe_resolve_edram NonReadable\n               OpDecorate %xe_resolve_edram Binding 0\n               OpDecorate %xe_resolve_edram DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n       %bool = OpTypeBool\n     %uint_2 = OpConstant %uint 2\n     %uint_1 = OpConstant %uint 1\n       %1837 = OpConstantComposite %v2uint %uint_2 %uint_1\n     %v2bool = OpTypeVector %bool 2\n     %uint_0 = OpConstant %uint 0\n       %1807 = OpConstantComposite %v2uint %uint_0 %uint_0\n       %1828 = OpConstantComposite %v2uint %uint_1 %uint_1\n    %uint_80 = OpConstant %uint 80\n    %uint_16 = OpConstant %uint 16\n       %2719 = OpConstantComposite %v2uint %uint_80 %uint_16\n        %int = OpTypeInt 32 1\n  %uint_2048 = OpConstant %uint 2048\n      %int_2 = OpConstant %int 2\n%push_const_block_xe = OpTypeStruct %v2uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n      %int_1 = OpConstant %int 1\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n      %int_0 = OpConstant %int 0\n  %uint_1023 = OpConstant %uint 1023\n    %uint_10 = OpConstant %uint 10\n     %uint_3 = OpConstant %uint 3\n  %uint_4096 = OpConstant %uint 4096\n    %uint_13 = OpConstant %uint 13\n  %uint_2047 = OpConstant %uint 2047\n      %int_4 = OpConstant %int 4\n    %uint_15 = OpConstant %uint 15\n    %uint_19 = OpConstant %uint 19\n       %2179 = OpConstantComposite %v2uint %uint_16 %uint_19\n     %uint_7 = OpConstant %uint 7\n     %uint_4 = OpConstant %uint 4\n       %1855 = OpConstantComposite %v2uint %uint_0 %uint_4\n     %uint_5 = OpConstant %uint 5\n%_ptr_PushConstant_v2uint = OpTypePointer PushConstant %v2uint\n     %v3uint = OpTypeVector %uint 3\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n%_ptr_Input_uint = OpTypePointer Input %uint\n       %1834 = OpConstantComposite %v2uint %uint_3 %uint_0\n     %v4uint = OpTypeVector %uint 4\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_resolve_edram_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_resolve_edram_xe_block = OpTypePointer Uniform %xe_resolve_edram_xe_block\n%xe_resolve_edram = OpVariable %_ptr_Uniform_xe_resolve_edram_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n     %uint_8 = OpConstant %uint 8\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_8 %uint_8 %uint_1\n       %1954 = OpConstantComposite %v2uint %uint_7 %uint_7\n       %1955 = OpConstantComposite %v2uint %uint_15 %uint_1\n       %1870 = OpConstantComposite %v2uint %uint_3 %uint_3\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %22245 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %15627 = OpLoad %uint %22245\n      %22700 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %20824 = OpLoad %uint %22700\n      %20561 = OpBitwiseAnd %uint %15627 %uint_1023\n      %20073 = OpShiftRightLogical %uint %15627 %uint_10\n       %7177 = OpBitwiseAnd %uint %20073 %uint_3\n      %23023 = OpBitwiseAnd %uint %15627 %uint_4096\n      %20495 = OpINotEqual %bool %23023 %uint_0\n       %8141 = OpShiftRightLogical %uint %15627 %uint_13\n      %24990 = OpBitwiseAnd %uint %8141 %uint_2047\n       %8871 = OpCompositeConstruct %v2uint %20824 %20824\n       %9538 = OpShiftRightLogical %v2uint %8871 %2179\n      %24998 = OpBitwiseAnd %v2uint %9538 %1954\n      %21040 = OpShiftRightLogical %v2uint %8871 %1855\n       %6955 = OpBitwiseAnd %v2uint %21040 %1955\n      %16207 = OpShiftLeftLogical %v2uint %6955 %1870\n      %23019 = OpIMul %v2uint %16207 %24998\n      %13123 = OpShiftRightLogical %uint %20824 %uint_5\n      %14785 = OpBitwiseAnd %uint %13123 %uint_2047\n       %8858 = OpCompositeExtract %uint %24998 0\n      %22993 = OpIMul %uint %14785 %8858\n      %20321 = OpAccessChain %_ptr_PushConstant_v2uint %push_consts_xe %int_0\n      %18180 = OpLoad %v2uint %20321\n      %13183 = OpCompositeConstruct %v2uint %7177 %7177\n      %21741 = OpUGreaterThanEqual %v2bool %13183 %1837\n      %22612 = OpSelect %v2uint %21741 %1828 %1807\n      %23890 = OpAccessChain %_ptr_Input_uint %gl_GlobalInvocationID %uint_0\n      %19209 = OpLoad %uint %23890\n      %20350 = OpCompositeExtract %uint %22612 0\n      %15478 = OpShiftLeftLogical %uint %22993 %20350\n      %15379 = OpUGreaterThanEqual %bool %19209 %15478\n               OpSelectionMerge %17447 DontFlatten\n               OpBranchConditional %15379 %21992 %17447\n      %21992 = OpLabel\n               OpBranch %19578\n      %17447 = OpLabel\n      %14637 = OpLoad %v3uint %gl_GlobalInvocationID\n      %20690 = OpVectorShuffle %v2uint %14637 %14637 0 1\n       %9909 = OpShiftLeftLogical %v2uint %20690 %1834\n      %23504 = OpShiftLeftLogical %v2uint %23019 %22612\n       %8878 = OpIAdd %v2uint %9909 %23504\n      %12256 = OpIMul %v2uint %2719 %24998\n       %7983 = OpUDiv %v2uint %8878 %12256\n       %9129 = OpCompositeExtract %uint %7983 1\n      %11046 = OpIMul %uint %9129 %20561\n      %24665 = OpCompositeExtract %uint %7983 0\n      %21536 = OpIAdd %uint %11046 %24665\n       %8742 = OpIAdd %uint %24990 %21536\n       %6459 = OpIMul %v2uint %7983 %12256\n      %14279 = OpISub %v2uint %8878 %6459\n               OpSelectionMerge %18756 None\n               OpBranchConditional %20495 %11888 %18756\n      %11888 = OpLabel\n      %16985 = OpCompositeExtract %uint %12256 0\n      %13307 = OpShiftRightLogical %uint %16985 %uint_1\n      %22207 = OpCompositeExtract %uint %14279 0\n      %15197 = OpBitcast %int %22207\n      %15736 = OpUGreaterThanEqual %bool %22207 %13307\n               OpSelectionMerge %22850 None\n               OpBranchConditional %15736 %23061 %24565\n      %24565 = OpLabel\n      %20693 = OpBitcast %int %13307\n               OpBranch %22850\n      %23061 = OpLabel\n      %18885 = OpBitcast %int %13307\n      %17199 = OpSNegate %int %18885\n               OpBranch %22850\n      %22850 = OpLabel\n      %10046 = OpPhi %int %17199 %23061 %20693 %24565\n      %11983 = OpIAdd %int %15197 %10046\n      %17709 = OpBitcast %uint %11983\n      %21574 = OpCompositeInsert %v2uint %17709 %14279 0\n               OpBranch %18756\n      %18756 = OpLabel\n      %17360 = OpPhi %v2uint %14279 %17447 %21574 %22850\n      %24023 = OpCompositeExtract %uint %12256 0\n      %22303 = OpCompositeExtract %uint %12256 1\n      %13170 = OpIMul %uint %24023 %22303\n      %15520 = OpIMul %uint %8742 %13170\n      %16084 = OpCompositeExtract %uint %17360 1\n      %15890 = OpIMul %uint %16084 %24023\n      %24666 = OpCompositeExtract %uint %17360 0\n      %21537 = OpIAdd %uint %15890 %24666\n       %8875 = OpIAdd %uint %15520 %21537\n      %23350 = OpIMul %uint %13170 %uint_2048\n      %21900 = OpUMod %uint %8875 %23350\n      %21587 = OpShiftLeftLogical %uint %21900 %int_2\n      %16987 = OpShiftRightLogical %uint %21587 %int_4\n       %7951 = OpVectorShuffle %v4uint %18180 %18180 0 0 0 0\n       %7737 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_edram %int_0 %16987\n               OpStore %7737 %7951\n       %8268 = OpIAdd %uint %21587 %uint_16\n       %6653 = OpShiftRightLogical %uint %8268 %int_4\n      %21727 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_edram %int_0 %6653\n               OpStore %21727 %7951\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t resolve_clear_32bpp_scaled_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x000061A7, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000008, 0x00000008, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x000003F6, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x00090006, 0x000003F6, 0x00000000, 0x725F6578,\n    0x6C6F7365, 0x635F6576, 0x7261656C, 0x6C61765F, 0x00006575, 0x00090006,\n    0x000003F6, 0x00000001, 0x725F6578, 0x6C6F7365, 0x655F6576, 0x6D617264,\n    0x666E695F, 0x0000006F, 0x000A0006, 0x000003F6, 0x00000002, 0x725F6578,\n    0x6C6F7365, 0x635F6576, 0x64726F6F, 0x74616E69, 0x6E695F65, 0x00006F66,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x00090005, 0x000007B4, 0x725F6578, 0x6C6F7365,\n    0x655F6576, 0x6D617264, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00070005, 0x00000CC7,\n    0x725F6578, 0x6C6F7365, 0x655F6576, 0x6D617264, 0x00000000, 0x00030047,\n    0x000003F6, 0x00000002, 0x00050048, 0x000003F6, 0x00000000, 0x00000023,\n    0x00000000, 0x00050048, 0x000003F6, 0x00000001, 0x00000023, 0x00000008,\n    0x00050048, 0x000003F6, 0x00000002, 0x00000023, 0x0000000C, 0x00040047,\n    0x00000F48, 0x0000000B, 0x0000001C, 0x00040047, 0x000007DC, 0x00000006,\n    0x00000010, 0x00030047, 0x000007B4, 0x00000003, 0x00040048, 0x000007B4,\n    0x00000000, 0x00000019, 0x00050048, 0x000007B4, 0x00000000, 0x00000023,\n    0x00000000, 0x00030047, 0x00000CC7, 0x00000019, 0x00040047, 0x00000CC7,\n    0x00000021, 0x00000000, 0x00040047, 0x00000CC7, 0x00000022, 0x00000000,\n    0x00040047, 0x00000AC7, 0x0000000B, 0x00000019, 0x00020013, 0x00000008,\n    0x00030021, 0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020,\n    0x00000000, 0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00020014,\n    0x00000009, 0x0004002B, 0x0000000B, 0x00000A10, 0x00000002, 0x0004002B,\n    0x0000000B, 0x00000A0D, 0x00000001, 0x0005002C, 0x00000011, 0x0000072D,\n    0x00000A10, 0x00000A0D, 0x00040017, 0x0000000F, 0x00000009, 0x00000002,\n    0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000, 0x0005002C, 0x00000011,\n    0x0000070F, 0x00000A0A, 0x00000A0A, 0x0005002C, 0x00000011, 0x00000724,\n    0x00000A0D, 0x00000A0D, 0x0004002B, 0x0000000B, 0x00000AFA, 0x00000050,\n    0x0004002B, 0x0000000B, 0x00000A3A, 0x00000010, 0x0005002C, 0x00000011,\n    0x00000A9F, 0x00000AFA, 0x00000A3A, 0x00040015, 0x0000000C, 0x00000020,\n    0x00000001, 0x0004002B, 0x0000000B, 0x00000A84, 0x00000800, 0x0004002B,\n    0x0000000C, 0x00000A11, 0x00000002, 0x0005001E, 0x000003F6, 0x00000011,\n    0x0000000B, 0x0000000B, 0x00040020, 0x00000673, 0x00000009, 0x000003F6,\n    0x0004003B, 0x00000673, 0x00000CE9, 0x00000009, 0x0004002B, 0x0000000C,\n    0x00000A0E, 0x00000001, 0x00040020, 0x00000288, 0x00000009, 0x0000000B,\n    0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000, 0x0004002B, 0x0000000B,\n    0x00000A44, 0x000003FF, 0x0004002B, 0x0000000B, 0x00000A28, 0x0000000A,\n    0x0004002B, 0x0000000B, 0x00000A13, 0x00000003, 0x0004002B, 0x0000000B,\n    0x00000AFE, 0x00001000, 0x0004002B, 0x0000000B, 0x00000A31, 0x0000000D,\n    0x0004002B, 0x0000000B, 0x00000A81, 0x000007FF, 0x0004002B, 0x0000000C,\n    0x00000A17, 0x00000004, 0x0004002B, 0x0000000B, 0x00000A37, 0x0000000F,\n    0x0004002B, 0x0000000B, 0x00000A43, 0x00000013, 0x0005002C, 0x00000011,\n    0x00000883, 0x00000A3A, 0x00000A43, 0x0004002B, 0x0000000B, 0x00000A1F,\n    0x00000007, 0x0004002B, 0x0000000B, 0x00000A16, 0x00000004, 0x0005002C,\n    0x00000011, 0x0000073F, 0x00000A0A, 0x00000A16, 0x0004002B, 0x0000000B,\n    0x00000A19, 0x00000005, 0x00040020, 0x0000028E, 0x00000009, 0x00000011,\n    0x00040017, 0x00000014, 0x0000000B, 0x00000003, 0x00040020, 0x00000291,\n    0x00000001, 0x00000014, 0x0004003B, 0x00000291, 0x00000F48, 0x00000001,\n    0x00040020, 0x00000289, 0x00000001, 0x0000000B, 0x0005002C, 0x00000011,\n    0x0000072A, 0x00000A13, 0x00000A0A, 0x00040017, 0x00000017, 0x0000000B,\n    0x00000004, 0x0003001D, 0x000007DC, 0x00000017, 0x0003001E, 0x000007B4,\n    0x000007DC, 0x00040020, 0x00000A32, 0x00000002, 0x000007B4, 0x0004003B,\n    0x00000A32, 0x00000CC7, 0x00000002, 0x00040020, 0x00000294, 0x00000002,\n    0x00000017, 0x0004002B, 0x0000000B, 0x00000A22, 0x00000008, 0x0006002C,\n    0x00000014, 0x00000AC7, 0x00000A22, 0x00000A22, 0x00000A0D, 0x0005002C,\n    0x00000011, 0x000007A2, 0x00000A1F, 0x00000A1F, 0x0005002C, 0x00000011,\n    0x000007A3, 0x00000A37, 0x00000A0D, 0x0005002C, 0x00000011, 0x0000074E,\n    0x00000A13, 0x00000A13, 0x00050036, 0x00000008, 0x0000161F, 0x00000000,\n    0x00000502, 0x000200F8, 0x00003B06, 0x000300F7, 0x00004C7A, 0x00000000,\n    0x000300FB, 0x00000A0A, 0x00002E68, 0x000200F8, 0x00002E68, 0x00050041,\n    0x00000288, 0x000056E5, 0x00000CE9, 0x00000A0E, 0x0004003D, 0x0000000B,\n    0x00003D0B, 0x000056E5, 0x00050041, 0x00000288, 0x000058AC, 0x00000CE9,\n    0x00000A11, 0x0004003D, 0x0000000B, 0x00005158, 0x000058AC, 0x000500C7,\n    0x0000000B, 0x00005051, 0x00003D0B, 0x00000A44, 0x000500C2, 0x0000000B,\n    0x00004E69, 0x00003D0B, 0x00000A28, 0x000500C7, 0x0000000B, 0x00001C09,\n    0x00004E69, 0x00000A13, 0x000500C7, 0x0000000B, 0x000059EF, 0x00003D0B,\n    0x00000AFE, 0x000500AB, 0x00000009, 0x0000500F, 0x000059EF, 0x00000A0A,\n    0x000500C2, 0x0000000B, 0x00001FCD, 0x00003D0B, 0x00000A31, 0x000500C7,\n    0x0000000B, 0x0000619E, 0x00001FCD, 0x00000A81, 0x00050050, 0x00000011,\n    0x000022A7, 0x00005158, 0x00005158, 0x000500C2, 0x00000011, 0x00002542,\n    0x000022A7, 0x00000883, 0x000500C7, 0x00000011, 0x000061A6, 0x00002542,\n    0x000007A2, 0x000500C2, 0x00000011, 0x00005230, 0x000022A7, 0x0000073F,\n    0x000500C7, 0x00000011, 0x00001B2B, 0x00005230, 0x000007A3, 0x000500C4,\n    0x00000011, 0x00003F4F, 0x00001B2B, 0x0000074E, 0x00050084, 0x00000011,\n    0x000059EB, 0x00003F4F, 0x000061A6, 0x000500C2, 0x0000000B, 0x00003343,\n    0x00005158, 0x00000A19, 0x000500C7, 0x0000000B, 0x000039C1, 0x00003343,\n    0x00000A81, 0x00050051, 0x0000000B, 0x0000229A, 0x000061A6, 0x00000000,\n    0x00050084, 0x0000000B, 0x000059D1, 0x000039C1, 0x0000229A, 0x00050041,\n    0x0000028E, 0x00004F61, 0x00000CE9, 0x00000A0B, 0x0004003D, 0x00000011,\n    0x00004704, 0x00004F61, 0x00050050, 0x00000011, 0x0000337F, 0x00001C09,\n    0x00001C09, 0x000500AE, 0x0000000F, 0x000054ED, 0x0000337F, 0x0000072D,\n    0x000600A9, 0x00000011, 0x00005854, 0x000054ED, 0x00000724, 0x0000070F,\n    0x00050041, 0x00000289, 0x00005D52, 0x00000F48, 0x00000A0A, 0x0004003D,\n    0x0000000B, 0x00004B09, 0x00005D52, 0x00050051, 0x0000000B, 0x00004F7E,\n    0x00005854, 0x00000000, 0x000500C4, 0x0000000B, 0x00003C76, 0x000059D1,\n    0x00004F7E, 0x000500AE, 0x00000009, 0x00003C13, 0x00004B09, 0x00003C76,\n    0x000300F7, 0x00004427, 0x00000002, 0x000400FA, 0x00003C13, 0x000055E8,\n    0x00004427, 0x000200F8, 0x000055E8, 0x000200F9, 0x00004C7A, 0x000200F8,\n    0x00004427, 0x0004003D, 0x00000014, 0x0000392D, 0x00000F48, 0x0007004F,\n    0x00000011, 0x000050D2, 0x0000392D, 0x0000392D, 0x00000000, 0x00000001,\n    0x000500C4, 0x00000011, 0x000026B5, 0x000050D2, 0x0000072A, 0x000500C4,\n    0x00000011, 0x00005BD0, 0x000059EB, 0x00005854, 0x00050080, 0x00000011,\n    0x000022AE, 0x000026B5, 0x00005BD0, 0x00050084, 0x00000011, 0x00002FE0,\n    0x00000A9F, 0x000061A6, 0x00050086, 0x00000011, 0x00001F2F, 0x000022AE,\n    0x00002FE0, 0x00050051, 0x0000000B, 0x000023A9, 0x00001F2F, 0x00000001,\n    0x00050084, 0x0000000B, 0x00002B26, 0x000023A9, 0x00005051, 0x00050051,\n    0x0000000B, 0x00006059, 0x00001F2F, 0x00000000, 0x00050080, 0x0000000B,\n    0x00005420, 0x00002B26, 0x00006059, 0x00050080, 0x0000000B, 0x00002226,\n    0x0000619E, 0x00005420, 0x00050084, 0x00000011, 0x0000193B, 0x00001F2F,\n    0x00002FE0, 0x00050082, 0x00000011, 0x000037C7, 0x000022AE, 0x0000193B,\n    0x000300F7, 0x00004944, 0x00000000, 0x000400FA, 0x0000500F, 0x00002E70,\n    0x00004944, 0x000200F8, 0x00002E70, 0x00050051, 0x0000000B, 0x00004259,\n    0x00002FE0, 0x00000000, 0x000500C2, 0x0000000B, 0x000033FB, 0x00004259,\n    0x00000A0D, 0x00050051, 0x0000000B, 0x000056BF, 0x000037C7, 0x00000000,\n    0x0004007C, 0x0000000C, 0x00003B5D, 0x000056BF, 0x000500AE, 0x00000009,\n    0x00003D78, 0x000056BF, 0x000033FB, 0x000300F7, 0x00005942, 0x00000000,\n    0x000400FA, 0x00003D78, 0x00005A15, 0x00005FF5, 0x000200F8, 0x00005FF5,\n    0x0004007C, 0x0000000C, 0x000050D5, 0x000033FB, 0x000200F9, 0x00005942,\n    0x000200F8, 0x00005A15, 0x0004007C, 0x0000000C, 0x000049C5, 0x000033FB,\n    0x0004007E, 0x0000000C, 0x0000432F, 0x000049C5, 0x000200F9, 0x00005942,\n    0x000200F8, 0x00005942, 0x000700F5, 0x0000000C, 0x0000273E, 0x0000432F,\n    0x00005A15, 0x000050D5, 0x00005FF5, 0x00050080, 0x0000000C, 0x00002ECF,\n    0x00003B5D, 0x0000273E, 0x0004007C, 0x0000000B, 0x0000452D, 0x00002ECF,\n    0x00060052, 0x00000011, 0x00005446, 0x0000452D, 0x000037C7, 0x00000000,\n    0x000200F9, 0x00004944, 0x000200F8, 0x00004944, 0x000700F5, 0x00000011,\n    0x000043D0, 0x000037C7, 0x00004427, 0x00005446, 0x00005942, 0x00050051,\n    0x0000000B, 0x00005DD7, 0x00002FE0, 0x00000000, 0x00050051, 0x0000000B,\n    0x0000571F, 0x00002FE0, 0x00000001, 0x00050084, 0x0000000B, 0x00003372,\n    0x00005DD7, 0x0000571F, 0x00050084, 0x0000000B, 0x00003CA0, 0x00002226,\n    0x00003372, 0x00050051, 0x0000000B, 0x00003ED4, 0x000043D0, 0x00000001,\n    0x00050084, 0x0000000B, 0x00003E12, 0x00003ED4, 0x00005DD7, 0x00050051,\n    0x0000000B, 0x0000605A, 0x000043D0, 0x00000000, 0x00050080, 0x0000000B,\n    0x00005421, 0x00003E12, 0x0000605A, 0x00050080, 0x0000000B, 0x000022AB,\n    0x00003CA0, 0x00005421, 0x00050084, 0x0000000B, 0x00005B36, 0x00003372,\n    0x00000A84, 0x00050089, 0x0000000B, 0x0000558C, 0x000022AB, 0x00005B36,\n    0x000500C4, 0x0000000B, 0x00005453, 0x0000558C, 0x00000A11, 0x000500C2,\n    0x0000000B, 0x0000425B, 0x00005453, 0x00000A17, 0x0009004F, 0x00000017,\n    0x00001F0F, 0x00004704, 0x00004704, 0x00000000, 0x00000000, 0x00000000,\n    0x00000000, 0x00060041, 0x00000294, 0x00001E39, 0x00000CC7, 0x00000A0B,\n    0x0000425B, 0x0003003E, 0x00001E39, 0x00001F0F, 0x00050080, 0x0000000B,\n    0x0000204C, 0x00005453, 0x00000A3A, 0x000500C2, 0x0000000B, 0x000019FD,\n    0x0000204C, 0x00000A17, 0x00060041, 0x00000294, 0x000054DF, 0x00000CC7,\n    0x00000A0B, 0x000019FD, 0x0003003E, 0x000054DF, 0x00001F0F, 0x000200F9,\n    0x00004C7A, 0x000200F8, 0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/resolve_clear_64bpp_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25080\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 8 8 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_resolve_clear_value\"\n               OpMemberName %push_const_block_xe 1 \"xe_resolve_edram_info\"\n               OpMemberName %push_const_block_xe 2 \"xe_resolve_coordinate_info\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_resolve_edram_xe_block \"xe_resolve_edram_xe_block\"\n               OpMemberName %xe_resolve_edram_xe_block 0 \"data\"\n               OpName %xe_resolve_edram \"xe_resolve_edram\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 8\n               OpMemberDecorate %push_const_block_xe 2 Offset 12\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_resolve_edram_xe_block BufferBlock\n               OpMemberDecorate %xe_resolve_edram_xe_block 0 NonReadable\n               OpMemberDecorate %xe_resolve_edram_xe_block 0 Offset 0\n               OpDecorate %xe_resolve_edram NonReadable\n               OpDecorate %xe_resolve_edram Binding 0\n               OpDecorate %xe_resolve_edram DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n       %bool = OpTypeBool\n     %uint_2 = OpConstant %uint 2\n     %uint_1 = OpConstant %uint 1\n       %1837 = OpConstantComposite %v2uint %uint_2 %uint_1\n     %v2bool = OpTypeVector %bool 2\n     %uint_0 = OpConstant %uint 0\n       %1807 = OpConstantComposite %v2uint %uint_0 %uint_0\n       %1828 = OpConstantComposite %v2uint %uint_1 %uint_1\n    %uint_16 = OpConstant %uint 16\n        %int = OpTypeInt 32 1\n      %int_2 = OpConstant %int 2\n%push_const_block_xe = OpTypeStruct %v2uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n      %int_1 = OpConstant %int 1\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n      %int_0 = OpConstant %int 0\n  %uint_1023 = OpConstant %uint 1023\n    %uint_10 = OpConstant %uint 10\n     %uint_3 = OpConstant %uint 3\n    %uint_13 = OpConstant %uint 13\n  %uint_2047 = OpConstant %uint 2047\n      %int_4 = OpConstant %int 4\n    %uint_15 = OpConstant %uint 15\n     %uint_4 = OpConstant %uint 4\n       %1855 = OpConstantComposite %v2uint %uint_0 %uint_4\n     %uint_5 = OpConstant %uint 5\n%_ptr_PushConstant_v2uint = OpTypePointer PushConstant %v2uint\n     %v3uint = OpTypeVector %uint 3\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n%_ptr_Input_uint = OpTypePointer Input %uint\n       %1834 = OpConstantComposite %v2uint %uint_3 %uint_0\n     %v4uint = OpTypeVector %uint 4\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_resolve_edram_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_resolve_edram_xe_block = OpTypePointer Uniform %xe_resolve_edram_xe_block\n%xe_resolve_edram = OpVariable %_ptr_Uniform_xe_resolve_edram_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n     %uint_8 = OpConstant %uint 8\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_8 %uint_8 %uint_1\n       %1954 = OpConstantComposite %v2uint %uint_15 %uint_1\n       %1870 = OpConstantComposite %v2uint %uint_3 %uint_3\n    %uint_40 = OpConstant %uint 40\n       %2359 = OpConstantComposite %v2uint %uint_40 %uint_16\n  %uint_1280 = OpConstant %uint 1280\n%uint_2621440 = OpConstant %uint 2621440\n    %uint_32 = OpConstant %uint 32\n    %uint_48 = OpConstant %uint 48\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %22245 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %15627 = OpLoad %uint %22245\n      %22700 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %20824 = OpLoad %uint %22700\n      %20561 = OpBitwiseAnd %uint %15627 %uint_1023\n      %19978 = OpShiftRightLogical %uint %15627 %uint_10\n       %8574 = OpBitwiseAnd %uint %19978 %uint_3\n      %18836 = OpShiftRightLogical %uint %15627 %uint_13\n       %9130 = OpBitwiseAnd %uint %18836 %uint_2047\n       %8871 = OpCompositeConstruct %v2uint %20824 %20824\n       %9576 = OpShiftRightLogical %v2uint %8871 %1855\n      %23379 = OpBitwiseAnd %v2uint %9576 %1954\n      %16207 = OpShiftLeftLogical %v2uint %23379 %1870\n      %23019 = OpIMul %v2uint %16207 %1828\n      %12819 = OpShiftRightLogical %uint %20824 %uint_5\n      %16204 = OpBitwiseAnd %uint %12819 %uint_2047\n      %19017 = OpAccessChain %_ptr_PushConstant_v2uint %push_consts_xe %int_0\n      %23788 = OpLoad %v2uint %19017\n      %13183 = OpCompositeConstruct %v2uint %8574 %8574\n      %21741 = OpUGreaterThanEqual %v2bool %13183 %1837\n      %22612 = OpSelect %v2uint %21741 %1828 %1807\n      %23890 = OpAccessChain %_ptr_Input_uint %gl_GlobalInvocationID %uint_0\n      %19209 = OpLoad %uint %23890\n      %20350 = OpCompositeExtract %uint %22612 0\n      %15478 = OpShiftLeftLogical %uint %16204 %20350\n      %15379 = OpUGreaterThanEqual %bool %19209 %15478\n               OpSelectionMerge %17447 DontFlatten\n               OpBranchConditional %15379 %21992 %17447\n      %21992 = OpLabel\n               OpBranch %19578\n      %17447 = OpLabel\n      %14637 = OpLoad %v3uint %gl_GlobalInvocationID\n      %20690 = OpVectorShuffle %v2uint %14637 %14637 0 1\n       %9909 = OpShiftLeftLogical %v2uint %20690 %1834\n      %23542 = OpShiftLeftLogical %v2uint %23019 %22612\n       %7525 = OpIAdd %v2uint %9909 %23542\n      %25079 = OpUDiv %v2uint %7525 %2359\n      %12360 = OpCompositeExtract %uint %25079 1\n      %11046 = OpIMul %uint %12360 %20561\n      %24665 = OpCompositeExtract %uint %25079 0\n      %21536 = OpIAdd %uint %11046 %24665\n       %8742 = OpIAdd %uint %9130 %21536\n      %23345 = OpIMul %v2uint %25079 %2359\n      %11892 = OpISub %v2uint %7525 %23345\n       %9022 = OpIMul %uint %8742 %uint_1280\n      %14471 = OpCompositeExtract %uint %11892 1\n      %15890 = OpIMul %uint %14471 %uint_40\n       %6886 = OpCompositeExtract %uint %11892 0\n       %9696 = OpIAdd %uint %15890 %6886\n      %18116 = OpShiftLeftLogical %uint %9696 %uint_1\n      %18619 = OpIAdd %uint %9022 %18116\n      %19925 = OpUMod %uint %18619 %uint_2621440\n      %18361 = OpShiftLeftLogical %uint %19925 %int_2\n      %16987 = OpShiftRightLogical %uint %18361 %int_4\n       %7951 = OpVectorShuffle %v4uint %23788 %23788 0 1 0 1\n       %7737 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_edram %int_0 %16987\n               OpStore %7737 %7951\n       %8268 = OpIAdd %uint %18361 %uint_16\n       %6653 = OpShiftRightLogical %uint %8268 %int_4\n      %19428 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_edram %int_0 %6653\n               OpStore %19428 %7951\n       %8269 = OpIAdd %uint %18361 %uint_32\n       %6654 = OpShiftRightLogical %uint %8269 %int_4\n      %19429 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_edram %int_0 %6654\n               OpStore %19429 %7951\n       %8270 = OpIAdd %uint %18361 %uint_48\n       %6655 = OpShiftRightLogical %uint %8270 %int_4\n      %21727 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_edram %int_0 %6655\n               OpStore %21727 %7951\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t resolve_clear_64bpp_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x000061F8, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000008, 0x00000008, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x000003F6, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x00090006, 0x000003F6, 0x00000000, 0x725F6578,\n    0x6C6F7365, 0x635F6576, 0x7261656C, 0x6C61765F, 0x00006575, 0x00090006,\n    0x000003F6, 0x00000001, 0x725F6578, 0x6C6F7365, 0x655F6576, 0x6D617264,\n    0x666E695F, 0x0000006F, 0x000A0006, 0x000003F6, 0x00000002, 0x725F6578,\n    0x6C6F7365, 0x635F6576, 0x64726F6F, 0x74616E69, 0x6E695F65, 0x00006F66,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x00090005, 0x000007B4, 0x725F6578, 0x6C6F7365,\n    0x655F6576, 0x6D617264, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00070005, 0x00000CC7,\n    0x725F6578, 0x6C6F7365, 0x655F6576, 0x6D617264, 0x00000000, 0x00030047,\n    0x000003F6, 0x00000002, 0x00050048, 0x000003F6, 0x00000000, 0x00000023,\n    0x00000000, 0x00050048, 0x000003F6, 0x00000001, 0x00000023, 0x00000008,\n    0x00050048, 0x000003F6, 0x00000002, 0x00000023, 0x0000000C, 0x00040047,\n    0x00000F48, 0x0000000B, 0x0000001C, 0x00040047, 0x000007DC, 0x00000006,\n    0x00000010, 0x00030047, 0x000007B4, 0x00000003, 0x00040048, 0x000007B4,\n    0x00000000, 0x00000019, 0x00050048, 0x000007B4, 0x00000000, 0x00000023,\n    0x00000000, 0x00030047, 0x00000CC7, 0x00000019, 0x00040047, 0x00000CC7,\n    0x00000021, 0x00000000, 0x00040047, 0x00000CC7, 0x00000022, 0x00000000,\n    0x00040047, 0x00000AC7, 0x0000000B, 0x00000019, 0x00020013, 0x00000008,\n    0x00030021, 0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020,\n    0x00000000, 0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00020014,\n    0x00000009, 0x0004002B, 0x0000000B, 0x00000A10, 0x00000002, 0x0004002B,\n    0x0000000B, 0x00000A0D, 0x00000001, 0x0005002C, 0x00000011, 0x0000072D,\n    0x00000A10, 0x00000A0D, 0x00040017, 0x0000000F, 0x00000009, 0x00000002,\n    0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000, 0x0005002C, 0x00000011,\n    0x0000070F, 0x00000A0A, 0x00000A0A, 0x0005002C, 0x00000011, 0x00000724,\n    0x00000A0D, 0x00000A0D, 0x0004002B, 0x0000000B, 0x00000A3A, 0x00000010,\n    0x00040015, 0x0000000C, 0x00000020, 0x00000001, 0x0004002B, 0x0000000C,\n    0x00000A11, 0x00000002, 0x0005001E, 0x000003F6, 0x00000011, 0x0000000B,\n    0x0000000B, 0x00040020, 0x00000673, 0x00000009, 0x000003F6, 0x0004003B,\n    0x00000673, 0x00000CE9, 0x00000009, 0x0004002B, 0x0000000C, 0x00000A0E,\n    0x00000001, 0x00040020, 0x00000288, 0x00000009, 0x0000000B, 0x0004002B,\n    0x0000000C, 0x00000A0B, 0x00000000, 0x0004002B, 0x0000000B, 0x00000A44,\n    0x000003FF, 0x0004002B, 0x0000000B, 0x00000A28, 0x0000000A, 0x0004002B,\n    0x0000000B, 0x00000A13, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A31,\n    0x0000000D, 0x0004002B, 0x0000000B, 0x00000A81, 0x000007FF, 0x0004002B,\n    0x0000000C, 0x00000A17, 0x00000004, 0x0004002B, 0x0000000B, 0x00000A37,\n    0x0000000F, 0x0004002B, 0x0000000B, 0x00000A16, 0x00000004, 0x0005002C,\n    0x00000011, 0x0000073F, 0x00000A0A, 0x00000A16, 0x0004002B, 0x0000000B,\n    0x00000A19, 0x00000005, 0x00040020, 0x0000028E, 0x00000009, 0x00000011,\n    0x00040017, 0x00000014, 0x0000000B, 0x00000003, 0x00040020, 0x00000291,\n    0x00000001, 0x00000014, 0x0004003B, 0x00000291, 0x00000F48, 0x00000001,\n    0x00040020, 0x00000289, 0x00000001, 0x0000000B, 0x0005002C, 0x00000011,\n    0x0000072A, 0x00000A13, 0x00000A0A, 0x00040017, 0x00000017, 0x0000000B,\n    0x00000004, 0x0003001D, 0x000007DC, 0x00000017, 0x0003001E, 0x000007B4,\n    0x000007DC, 0x00040020, 0x00000A32, 0x00000002, 0x000007B4, 0x0004003B,\n    0x00000A32, 0x00000CC7, 0x00000002, 0x00040020, 0x00000294, 0x00000002,\n    0x00000017, 0x0004002B, 0x0000000B, 0x00000A22, 0x00000008, 0x0006002C,\n    0x00000014, 0x00000AC7, 0x00000A22, 0x00000A22, 0x00000A0D, 0x0005002C,\n    0x00000011, 0x000007A2, 0x00000A37, 0x00000A0D, 0x0005002C, 0x00000011,\n    0x0000074E, 0x00000A13, 0x00000A13, 0x0004002B, 0x0000000B, 0x00000A82,\n    0x00000028, 0x0005002C, 0x00000011, 0x00000937, 0x00000A82, 0x00000A3A,\n    0x0004002B, 0x0000000B, 0x00000184, 0x00000500, 0x0004002B, 0x0000000B,\n    0x0000086E, 0x00280000, 0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020,\n    0x0004002B, 0x0000000B, 0x00000A9A, 0x00000030, 0x00050036, 0x00000008,\n    0x0000161F, 0x00000000, 0x00000502, 0x000200F8, 0x00003B06, 0x000300F7,\n    0x00004C7A, 0x00000000, 0x000300FB, 0x00000A0A, 0x00002E68, 0x000200F8,\n    0x00002E68, 0x00050041, 0x00000288, 0x000056E5, 0x00000CE9, 0x00000A0E,\n    0x0004003D, 0x0000000B, 0x00003D0B, 0x000056E5, 0x00050041, 0x00000288,\n    0x000058AC, 0x00000CE9, 0x00000A11, 0x0004003D, 0x0000000B, 0x00005158,\n    0x000058AC, 0x000500C7, 0x0000000B, 0x00005051, 0x00003D0B, 0x00000A44,\n    0x000500C2, 0x0000000B, 0x00004E0A, 0x00003D0B, 0x00000A28, 0x000500C7,\n    0x0000000B, 0x0000217E, 0x00004E0A, 0x00000A13, 0x000500C2, 0x0000000B,\n    0x00004994, 0x00003D0B, 0x00000A31, 0x000500C7, 0x0000000B, 0x000023AA,\n    0x00004994, 0x00000A81, 0x00050050, 0x00000011, 0x000022A7, 0x00005158,\n    0x00005158, 0x000500C2, 0x00000011, 0x00002568, 0x000022A7, 0x0000073F,\n    0x000500C7, 0x00000011, 0x00005B53, 0x00002568, 0x000007A2, 0x000500C4,\n    0x00000011, 0x00003F4F, 0x00005B53, 0x0000074E, 0x00050084, 0x00000011,\n    0x000059EB, 0x00003F4F, 0x00000724, 0x000500C2, 0x0000000B, 0x00003213,\n    0x00005158, 0x00000A19, 0x000500C7, 0x0000000B, 0x00003F4C, 0x00003213,\n    0x00000A81, 0x00050041, 0x0000028E, 0x00004A49, 0x00000CE9, 0x00000A0B,\n    0x0004003D, 0x00000011, 0x00005CEC, 0x00004A49, 0x00050050, 0x00000011,\n    0x0000337F, 0x0000217E, 0x0000217E, 0x000500AE, 0x0000000F, 0x000054ED,\n    0x0000337F, 0x0000072D, 0x000600A9, 0x00000011, 0x00005854, 0x000054ED,\n    0x00000724, 0x0000070F, 0x00050041, 0x00000289, 0x00005D52, 0x00000F48,\n    0x00000A0A, 0x0004003D, 0x0000000B, 0x00004B09, 0x00005D52, 0x00050051,\n    0x0000000B, 0x00004F7E, 0x00005854, 0x00000000, 0x000500C4, 0x0000000B,\n    0x00003C76, 0x00003F4C, 0x00004F7E, 0x000500AE, 0x00000009, 0x00003C13,\n    0x00004B09, 0x00003C76, 0x000300F7, 0x00004427, 0x00000002, 0x000400FA,\n    0x00003C13, 0x000055E8, 0x00004427, 0x000200F8, 0x000055E8, 0x000200F9,\n    0x00004C7A, 0x000200F8, 0x00004427, 0x0004003D, 0x00000014, 0x0000392D,\n    0x00000F48, 0x0007004F, 0x00000011, 0x000050D2, 0x0000392D, 0x0000392D,\n    0x00000000, 0x00000001, 0x000500C4, 0x00000011, 0x000026B5, 0x000050D2,\n    0x0000072A, 0x000500C4, 0x00000011, 0x00005BF6, 0x000059EB, 0x00005854,\n    0x00050080, 0x00000011, 0x00001D65, 0x000026B5, 0x00005BF6, 0x00050086,\n    0x00000011, 0x000061F7, 0x00001D65, 0x00000937, 0x00050051, 0x0000000B,\n    0x00003048, 0x000061F7, 0x00000001, 0x00050084, 0x0000000B, 0x00002B26,\n    0x00003048, 0x00005051, 0x00050051, 0x0000000B, 0x00006059, 0x000061F7,\n    0x00000000, 0x00050080, 0x0000000B, 0x00005420, 0x00002B26, 0x00006059,\n    0x00050080, 0x0000000B, 0x00002226, 0x000023AA, 0x00005420, 0x00050084,\n    0x00000011, 0x00005B31, 0x000061F7, 0x00000937, 0x00050082, 0x00000011,\n    0x00002E74, 0x00001D65, 0x00005B31, 0x00050084, 0x0000000B, 0x0000233E,\n    0x00002226, 0x00000184, 0x00050051, 0x0000000B, 0x00003887, 0x00002E74,\n    0x00000001, 0x00050084, 0x0000000B, 0x00003E12, 0x00003887, 0x00000A82,\n    0x00050051, 0x0000000B, 0x00001AE6, 0x00002E74, 0x00000000, 0x00050080,\n    0x0000000B, 0x000025E0, 0x00003E12, 0x00001AE6, 0x000500C4, 0x0000000B,\n    0x000046C4, 0x000025E0, 0x00000A0D, 0x00050080, 0x0000000B, 0x000048BB,\n    0x0000233E, 0x000046C4, 0x00050089, 0x0000000B, 0x00004DD5, 0x000048BB,\n    0x0000086E, 0x000500C4, 0x0000000B, 0x000047B9, 0x00004DD5, 0x00000A11,\n    0x000500C2, 0x0000000B, 0x0000425B, 0x000047B9, 0x00000A17, 0x0009004F,\n    0x00000017, 0x00001F0F, 0x00005CEC, 0x00005CEC, 0x00000000, 0x00000001,\n    0x00000000, 0x00000001, 0x00060041, 0x00000294, 0x00001E39, 0x00000CC7,\n    0x00000A0B, 0x0000425B, 0x0003003E, 0x00001E39, 0x00001F0F, 0x00050080,\n    0x0000000B, 0x0000204C, 0x000047B9, 0x00000A3A, 0x000500C2, 0x0000000B,\n    0x000019FD, 0x0000204C, 0x00000A17, 0x00060041, 0x00000294, 0x00004BE4,\n    0x00000CC7, 0x00000A0B, 0x000019FD, 0x0003003E, 0x00004BE4, 0x00001F0F,\n    0x00050080, 0x0000000B, 0x0000204D, 0x000047B9, 0x00000A6A, 0x000500C2,\n    0x0000000B, 0x000019FE, 0x0000204D, 0x00000A17, 0x00060041, 0x00000294,\n    0x00004BE5, 0x00000CC7, 0x00000A0B, 0x000019FE, 0x0003003E, 0x00004BE5,\n    0x00001F0F, 0x00050080, 0x0000000B, 0x0000204E, 0x000047B9, 0x00000A9A,\n    0x000500C2, 0x0000000B, 0x000019FF, 0x0000204E, 0x00000A17, 0x00060041,\n    0x00000294, 0x000054DF, 0x00000CC7, 0x00000A0B, 0x000019FF, 0x0003003E,\n    0x000054DF, 0x00001F0F, 0x000200F9, 0x00004C7A, 0x000200F8, 0x00004C7A,\n    0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/resolve_clear_64bpp_scaled_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 24999\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 8 8 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_resolve_clear_value\"\n               OpMemberName %push_const_block_xe 1 \"xe_resolve_edram_info\"\n               OpMemberName %push_const_block_xe 2 \"xe_resolve_coordinate_info\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_resolve_edram_xe_block \"xe_resolve_edram_xe_block\"\n               OpMemberName %xe_resolve_edram_xe_block 0 \"data\"\n               OpName %xe_resolve_edram \"xe_resolve_edram\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 8\n               OpMemberDecorate %push_const_block_xe 2 Offset 12\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_resolve_edram_xe_block BufferBlock\n               OpMemberDecorate %xe_resolve_edram_xe_block 0 NonReadable\n               OpMemberDecorate %xe_resolve_edram_xe_block 0 Offset 0\n               OpDecorate %xe_resolve_edram NonReadable\n               OpDecorate %xe_resolve_edram Binding 0\n               OpDecorate %xe_resolve_edram DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n       %bool = OpTypeBool\n     %uint_2 = OpConstant %uint 2\n     %uint_1 = OpConstant %uint 1\n       %1837 = OpConstantComposite %v2uint %uint_2 %uint_1\n     %v2bool = OpTypeVector %bool 2\n     %uint_0 = OpConstant %uint 0\n       %1807 = OpConstantComposite %v2uint %uint_0 %uint_0\n       %1828 = OpConstantComposite %v2uint %uint_1 %uint_1\n       %1816 = OpConstantComposite %v2uint %uint_1 %uint_0\n    %uint_80 = OpConstant %uint 80\n    %uint_16 = OpConstant %uint 16\n       %2719 = OpConstantComposite %v2uint %uint_80 %uint_16\n        %int = OpTypeInt 32 1\n  %uint_2048 = OpConstant %uint 2048\n      %int_2 = OpConstant %int 2\n%push_const_block_xe = OpTypeStruct %v2uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n      %int_1 = OpConstant %int 1\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n      %int_0 = OpConstant %int 0\n  %uint_1023 = OpConstant %uint 1023\n    %uint_10 = OpConstant %uint 10\n     %uint_3 = OpConstant %uint 3\n    %uint_13 = OpConstant %uint 13\n  %uint_2047 = OpConstant %uint 2047\n      %int_4 = OpConstant %int 4\n    %uint_15 = OpConstant %uint 15\n    %uint_19 = OpConstant %uint 19\n       %2179 = OpConstantComposite %v2uint %uint_16 %uint_19\n     %uint_7 = OpConstant %uint 7\n     %uint_4 = OpConstant %uint 4\n       %1855 = OpConstantComposite %v2uint %uint_0 %uint_4\n     %uint_5 = OpConstant %uint 5\n%_ptr_PushConstant_v2uint = OpTypePointer PushConstant %v2uint\n     %v3uint = OpTypeVector %uint 3\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n%_ptr_Input_uint = OpTypePointer Input %uint\n       %1834 = OpConstantComposite %v2uint %uint_3 %uint_0\n     %v4uint = OpTypeVector %uint 4\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_resolve_edram_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_resolve_edram_xe_block = OpTypePointer Uniform %xe_resolve_edram_xe_block\n%xe_resolve_edram = OpVariable %_ptr_Uniform_xe_resolve_edram_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n     %uint_8 = OpConstant %uint 8\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_8 %uint_8 %uint_1\n       %1954 = OpConstantComposite %v2uint %uint_7 %uint_7\n       %1955 = OpConstantComposite %v2uint %uint_15 %uint_1\n       %1870 = OpConstantComposite %v2uint %uint_3 %uint_3\n    %uint_32 = OpConstant %uint 32\n    %uint_48 = OpConstant %uint 48\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %22245 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %15627 = OpLoad %uint %22245\n      %22700 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %20824 = OpLoad %uint %22700\n      %20561 = OpBitwiseAnd %uint %15627 %uint_1023\n      %19978 = OpShiftRightLogical %uint %15627 %uint_10\n       %8574 = OpBitwiseAnd %uint %19978 %uint_3\n      %18836 = OpShiftRightLogical %uint %15627 %uint_13\n       %9130 = OpBitwiseAnd %uint %18836 %uint_2047\n       %8871 = OpCompositeConstruct %v2uint %20824 %20824\n       %9538 = OpShiftRightLogical %v2uint %8871 %2179\n      %24998 = OpBitwiseAnd %v2uint %9538 %1954\n      %21040 = OpShiftRightLogical %v2uint %8871 %1855\n       %6955 = OpBitwiseAnd %v2uint %21040 %1955\n      %16207 = OpShiftLeftLogical %v2uint %6955 %1870\n      %23019 = OpIMul %v2uint %16207 %24998\n      %13123 = OpShiftRightLogical %uint %20824 %uint_5\n      %14785 = OpBitwiseAnd %uint %13123 %uint_2047\n       %8858 = OpCompositeExtract %uint %24998 0\n      %22993 = OpIMul %uint %14785 %8858\n      %20321 = OpAccessChain %_ptr_PushConstant_v2uint %push_consts_xe %int_0\n      %18180 = OpLoad %v2uint %20321\n      %13183 = OpCompositeConstruct %v2uint %8574 %8574\n      %21741 = OpUGreaterThanEqual %v2bool %13183 %1837\n      %22612 = OpSelect %v2uint %21741 %1828 %1807\n      %23890 = OpAccessChain %_ptr_Input_uint %gl_GlobalInvocationID %uint_0\n      %19209 = OpLoad %uint %23890\n      %20350 = OpCompositeExtract %uint %22612 0\n      %15478 = OpShiftLeftLogical %uint %22993 %20350\n      %15379 = OpUGreaterThanEqual %bool %19209 %15478\n               OpSelectionMerge %17447 DontFlatten\n               OpBranchConditional %15379 %21992 %17447\n      %21992 = OpLabel\n               OpBranch %19578\n      %17447 = OpLabel\n      %14637 = OpLoad %v3uint %gl_GlobalInvocationID\n      %20690 = OpVectorShuffle %v2uint %14637 %14637 0 1\n       %9909 = OpShiftLeftLogical %v2uint %20690 %1834\n      %23504 = OpShiftLeftLogical %v2uint %23019 %22612\n      %10018 = OpIAdd %v2uint %9909 %23504\n      %21954 = OpIMul %v2uint %2719 %24998\n      %14725 = OpShiftRightLogical %v2uint %21954 %1816\n      %19799 = OpUDiv %v2uint %10018 %14725\n      %20390 = OpCompositeExtract %uint %19799 1\n      %11046 = OpIMul %uint %20390 %20561\n      %24665 = OpCompositeExtract %uint %19799 0\n      %21536 = OpIAdd %uint %11046 %24665\n       %8742 = OpIAdd %uint %9130 %21536\n      %22376 = OpIMul %v2uint %19799 %14725\n      %20715 = OpISub %v2uint %10018 %22376\n       %7303 = OpCompositeExtract %uint %21954 0\n      %22882 = OpCompositeExtract %uint %21954 1\n      %13170 = OpIMul %uint %7303 %22882\n      %14551 = OpIMul %uint %8742 %13170\n       %6805 = OpCompositeExtract %uint %20715 1\n      %23526 = OpCompositeExtract %uint %14725 0\n      %22886 = OpIMul %uint %6805 %23526\n       %6886 = OpCompositeExtract %uint %20715 0\n       %9696 = OpIAdd %uint %22886 %6886\n      %18021 = OpShiftLeftLogical %uint %9696 %uint_1\n      %18363 = OpIAdd %uint %14551 %18021\n      %13922 = OpIMul %uint %13170 %uint_2048\n      %21900 = OpUMod %uint %18363 %13922\n      %21587 = OpShiftLeftLogical %uint %21900 %int_2\n      %16987 = OpShiftRightLogical %uint %21587 %int_4\n       %7951 = OpVectorShuffle %v4uint %18180 %18180 0 1 0 1\n       %7737 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_edram %int_0 %16987\n               OpStore %7737 %7951\n       %8268 = OpIAdd %uint %21587 %uint_16\n       %6653 = OpShiftRightLogical %uint %8268 %int_4\n      %19428 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_edram %int_0 %6653\n               OpStore %19428 %7951\n       %8269 = OpIAdd %uint %21587 %uint_32\n       %6654 = OpShiftRightLogical %uint %8269 %int_4\n      %19429 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_edram %int_0 %6654\n               OpStore %19429 %7951\n       %8270 = OpIAdd %uint %21587 %uint_48\n       %6655 = OpShiftRightLogical %uint %8270 %int_4\n      %21727 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_edram %int_0 %6655\n               OpStore %21727 %7951\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t resolve_clear_64bpp_scaled_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x000061A7, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000008, 0x00000008, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x000003F6, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x00090006, 0x000003F6, 0x00000000, 0x725F6578,\n    0x6C6F7365, 0x635F6576, 0x7261656C, 0x6C61765F, 0x00006575, 0x00090006,\n    0x000003F6, 0x00000001, 0x725F6578, 0x6C6F7365, 0x655F6576, 0x6D617264,\n    0x666E695F, 0x0000006F, 0x000A0006, 0x000003F6, 0x00000002, 0x725F6578,\n    0x6C6F7365, 0x635F6576, 0x64726F6F, 0x74616E69, 0x6E695F65, 0x00006F66,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x00090005, 0x000007B4, 0x725F6578, 0x6C6F7365,\n    0x655F6576, 0x6D617264, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00070005, 0x00000CC7,\n    0x725F6578, 0x6C6F7365, 0x655F6576, 0x6D617264, 0x00000000, 0x00030047,\n    0x000003F6, 0x00000002, 0x00050048, 0x000003F6, 0x00000000, 0x00000023,\n    0x00000000, 0x00050048, 0x000003F6, 0x00000001, 0x00000023, 0x00000008,\n    0x00050048, 0x000003F6, 0x00000002, 0x00000023, 0x0000000C, 0x00040047,\n    0x00000F48, 0x0000000B, 0x0000001C, 0x00040047, 0x000007DC, 0x00000006,\n    0x00000010, 0x00030047, 0x000007B4, 0x00000003, 0x00040048, 0x000007B4,\n    0x00000000, 0x00000019, 0x00050048, 0x000007B4, 0x00000000, 0x00000023,\n    0x00000000, 0x00030047, 0x00000CC7, 0x00000019, 0x00040047, 0x00000CC7,\n    0x00000021, 0x00000000, 0x00040047, 0x00000CC7, 0x00000022, 0x00000000,\n    0x00040047, 0x00000AC7, 0x0000000B, 0x00000019, 0x00020013, 0x00000008,\n    0x00030021, 0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020,\n    0x00000000, 0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00020014,\n    0x00000009, 0x0004002B, 0x0000000B, 0x00000A10, 0x00000002, 0x0004002B,\n    0x0000000B, 0x00000A0D, 0x00000001, 0x0005002C, 0x00000011, 0x0000072D,\n    0x00000A10, 0x00000A0D, 0x00040017, 0x0000000F, 0x00000009, 0x00000002,\n    0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000, 0x0005002C, 0x00000011,\n    0x0000070F, 0x00000A0A, 0x00000A0A, 0x0005002C, 0x00000011, 0x00000724,\n    0x00000A0D, 0x00000A0D, 0x0005002C, 0x00000011, 0x00000718, 0x00000A0D,\n    0x00000A0A, 0x0004002B, 0x0000000B, 0x00000AFA, 0x00000050, 0x0004002B,\n    0x0000000B, 0x00000A3A, 0x00000010, 0x0005002C, 0x00000011, 0x00000A9F,\n    0x00000AFA, 0x00000A3A, 0x00040015, 0x0000000C, 0x00000020, 0x00000001,\n    0x0004002B, 0x0000000B, 0x00000A84, 0x00000800, 0x0004002B, 0x0000000C,\n    0x00000A11, 0x00000002, 0x0005001E, 0x000003F6, 0x00000011, 0x0000000B,\n    0x0000000B, 0x00040020, 0x00000673, 0x00000009, 0x000003F6, 0x0004003B,\n    0x00000673, 0x00000CE9, 0x00000009, 0x0004002B, 0x0000000C, 0x00000A0E,\n    0x00000001, 0x00040020, 0x00000288, 0x00000009, 0x0000000B, 0x0004002B,\n    0x0000000C, 0x00000A0B, 0x00000000, 0x0004002B, 0x0000000B, 0x00000A44,\n    0x000003FF, 0x0004002B, 0x0000000B, 0x00000A28, 0x0000000A, 0x0004002B,\n    0x0000000B, 0x00000A13, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A31,\n    0x0000000D, 0x0004002B, 0x0000000B, 0x00000A81, 0x000007FF, 0x0004002B,\n    0x0000000C, 0x00000A17, 0x00000004, 0x0004002B, 0x0000000B, 0x00000A37,\n    0x0000000F, 0x0004002B, 0x0000000B, 0x00000A43, 0x00000013, 0x0005002C,\n    0x00000011, 0x00000883, 0x00000A3A, 0x00000A43, 0x0004002B, 0x0000000B,\n    0x00000A1F, 0x00000007, 0x0004002B, 0x0000000B, 0x00000A16, 0x00000004,\n    0x0005002C, 0x00000011, 0x0000073F, 0x00000A0A, 0x00000A16, 0x0004002B,\n    0x0000000B, 0x00000A19, 0x00000005, 0x00040020, 0x0000028E, 0x00000009,\n    0x00000011, 0x00040017, 0x00000014, 0x0000000B, 0x00000003, 0x00040020,\n    0x00000291, 0x00000001, 0x00000014, 0x0004003B, 0x00000291, 0x00000F48,\n    0x00000001, 0x00040020, 0x00000289, 0x00000001, 0x0000000B, 0x0005002C,\n    0x00000011, 0x0000072A, 0x00000A13, 0x00000A0A, 0x00040017, 0x00000017,\n    0x0000000B, 0x00000004, 0x0003001D, 0x000007DC, 0x00000017, 0x0003001E,\n    0x000007B4, 0x000007DC, 0x00040020, 0x00000A32, 0x00000002, 0x000007B4,\n    0x0004003B, 0x00000A32, 0x00000CC7, 0x00000002, 0x00040020, 0x00000294,\n    0x00000002, 0x00000017, 0x0004002B, 0x0000000B, 0x00000A22, 0x00000008,\n    0x0006002C, 0x00000014, 0x00000AC7, 0x00000A22, 0x00000A22, 0x00000A0D,\n    0x0005002C, 0x00000011, 0x000007A2, 0x00000A1F, 0x00000A1F, 0x0005002C,\n    0x00000011, 0x000007A3, 0x00000A37, 0x00000A0D, 0x0005002C, 0x00000011,\n    0x0000074E, 0x00000A13, 0x00000A13, 0x0004002B, 0x0000000B, 0x00000A6A,\n    0x00000020, 0x0004002B, 0x0000000B, 0x00000A9A, 0x00000030, 0x00050036,\n    0x00000008, 0x0000161F, 0x00000000, 0x00000502, 0x000200F8, 0x00003B06,\n    0x000300F7, 0x00004C7A, 0x00000000, 0x000300FB, 0x00000A0A, 0x00002E68,\n    0x000200F8, 0x00002E68, 0x00050041, 0x00000288, 0x000056E5, 0x00000CE9,\n    0x00000A0E, 0x0004003D, 0x0000000B, 0x00003D0B, 0x000056E5, 0x00050041,\n    0x00000288, 0x000058AC, 0x00000CE9, 0x00000A11, 0x0004003D, 0x0000000B,\n    0x00005158, 0x000058AC, 0x000500C7, 0x0000000B, 0x00005051, 0x00003D0B,\n    0x00000A44, 0x000500C2, 0x0000000B, 0x00004E0A, 0x00003D0B, 0x00000A28,\n    0x000500C7, 0x0000000B, 0x0000217E, 0x00004E0A, 0x00000A13, 0x000500C2,\n    0x0000000B, 0x00004994, 0x00003D0B, 0x00000A31, 0x000500C7, 0x0000000B,\n    0x000023AA, 0x00004994, 0x00000A81, 0x00050050, 0x00000011, 0x000022A7,\n    0x00005158, 0x00005158, 0x000500C2, 0x00000011, 0x00002542, 0x000022A7,\n    0x00000883, 0x000500C7, 0x00000011, 0x000061A6, 0x00002542, 0x000007A2,\n    0x000500C2, 0x00000011, 0x00005230, 0x000022A7, 0x0000073F, 0x000500C7,\n    0x00000011, 0x00001B2B, 0x00005230, 0x000007A3, 0x000500C4, 0x00000011,\n    0x00003F4F, 0x00001B2B, 0x0000074E, 0x00050084, 0x00000011, 0x000059EB,\n    0x00003F4F, 0x000061A6, 0x000500C2, 0x0000000B, 0x00003343, 0x00005158,\n    0x00000A19, 0x000500C7, 0x0000000B, 0x000039C1, 0x00003343, 0x00000A81,\n    0x00050051, 0x0000000B, 0x0000229A, 0x000061A6, 0x00000000, 0x00050084,\n    0x0000000B, 0x000059D1, 0x000039C1, 0x0000229A, 0x00050041, 0x0000028E,\n    0x00004F61, 0x00000CE9, 0x00000A0B, 0x0004003D, 0x00000011, 0x00004704,\n    0x00004F61, 0x00050050, 0x00000011, 0x0000337F, 0x0000217E, 0x0000217E,\n    0x000500AE, 0x0000000F, 0x000054ED, 0x0000337F, 0x0000072D, 0x000600A9,\n    0x00000011, 0x00005854, 0x000054ED, 0x00000724, 0x0000070F, 0x00050041,\n    0x00000289, 0x00005D52, 0x00000F48, 0x00000A0A, 0x0004003D, 0x0000000B,\n    0x00004B09, 0x00005D52, 0x00050051, 0x0000000B, 0x00004F7E, 0x00005854,\n    0x00000000, 0x000500C4, 0x0000000B, 0x00003C76, 0x000059D1, 0x00004F7E,\n    0x000500AE, 0x00000009, 0x00003C13, 0x00004B09, 0x00003C76, 0x000300F7,\n    0x00004427, 0x00000002, 0x000400FA, 0x00003C13, 0x000055E8, 0x00004427,\n    0x000200F8, 0x000055E8, 0x000200F9, 0x00004C7A, 0x000200F8, 0x00004427,\n    0x0004003D, 0x00000014, 0x0000392D, 0x00000F48, 0x0007004F, 0x00000011,\n    0x000050D2, 0x0000392D, 0x0000392D, 0x00000000, 0x00000001, 0x000500C4,\n    0x00000011, 0x000026B5, 0x000050D2, 0x0000072A, 0x000500C4, 0x00000011,\n    0x00005BD0, 0x000059EB, 0x00005854, 0x00050080, 0x00000011, 0x00002722,\n    0x000026B5, 0x00005BD0, 0x00050084, 0x00000011, 0x000055C2, 0x00000A9F,\n    0x000061A6, 0x000500C2, 0x00000011, 0x00003985, 0x000055C2, 0x00000718,\n    0x00050086, 0x00000011, 0x00004D57, 0x00002722, 0x00003985, 0x00050051,\n    0x0000000B, 0x00004FA6, 0x00004D57, 0x00000001, 0x00050084, 0x0000000B,\n    0x00002B26, 0x00004FA6, 0x00005051, 0x00050051, 0x0000000B, 0x00006059,\n    0x00004D57, 0x00000000, 0x00050080, 0x0000000B, 0x00005420, 0x00002B26,\n    0x00006059, 0x00050080, 0x0000000B, 0x00002226, 0x000023AA, 0x00005420,\n    0x00050084, 0x00000011, 0x00005768, 0x00004D57, 0x00003985, 0x00050082,\n    0x00000011, 0x000050EB, 0x00002722, 0x00005768, 0x00050051, 0x0000000B,\n    0x00001C87, 0x000055C2, 0x00000000, 0x00050051, 0x0000000B, 0x00005962,\n    0x000055C2, 0x00000001, 0x00050084, 0x0000000B, 0x00003372, 0x00001C87,\n    0x00005962, 0x00050084, 0x0000000B, 0x000038D7, 0x00002226, 0x00003372,\n    0x00050051, 0x0000000B, 0x00001A95, 0x000050EB, 0x00000001, 0x00050051,\n    0x0000000B, 0x00005BE6, 0x00003985, 0x00000000, 0x00050084, 0x0000000B,\n    0x00005966, 0x00001A95, 0x00005BE6, 0x00050051, 0x0000000B, 0x00001AE6,\n    0x000050EB, 0x00000000, 0x00050080, 0x0000000B, 0x000025E0, 0x00005966,\n    0x00001AE6, 0x000500C4, 0x0000000B, 0x00004665, 0x000025E0, 0x00000A0D,\n    0x00050080, 0x0000000B, 0x000047BB, 0x000038D7, 0x00004665, 0x00050084,\n    0x0000000B, 0x00003662, 0x00003372, 0x00000A84, 0x00050089, 0x0000000B,\n    0x0000558C, 0x000047BB, 0x00003662, 0x000500C4, 0x0000000B, 0x00005453,\n    0x0000558C, 0x00000A11, 0x000500C2, 0x0000000B, 0x0000425B, 0x00005453,\n    0x00000A17, 0x0009004F, 0x00000017, 0x00001F0F, 0x00004704, 0x00004704,\n    0x00000000, 0x00000001, 0x00000000, 0x00000001, 0x00060041, 0x00000294,\n    0x00001E39, 0x00000CC7, 0x00000A0B, 0x0000425B, 0x0003003E, 0x00001E39,\n    0x00001F0F, 0x00050080, 0x0000000B, 0x0000204C, 0x00005453, 0x00000A3A,\n    0x000500C2, 0x0000000B, 0x000019FD, 0x0000204C, 0x00000A17, 0x00060041,\n    0x00000294, 0x00004BE4, 0x00000CC7, 0x00000A0B, 0x000019FD, 0x0003003E,\n    0x00004BE4, 0x00001F0F, 0x00050080, 0x0000000B, 0x0000204D, 0x00005453,\n    0x00000A6A, 0x000500C2, 0x0000000B, 0x000019FE, 0x0000204D, 0x00000A17,\n    0x00060041, 0x00000294, 0x00004BE5, 0x00000CC7, 0x00000A0B, 0x000019FE,\n    0x0003003E, 0x00004BE5, 0x00001F0F, 0x00050080, 0x0000000B, 0x0000204E,\n    0x00005453, 0x00000A9A, 0x000500C2, 0x0000000B, 0x000019FF, 0x0000204E,\n    0x00000A17, 0x00060041, 0x00000294, 0x000054DF, 0x00000CC7, 0x00000A0B,\n    0x000019FF, 0x0003003E, 0x000054DF, 0x00001F0F, 0x000200F9, 0x00004C7A,\n    0x000200F8, 0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/resolve_fast_32bpp_1x2xmsaa_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25204\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 8 8 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_resolve_edram_info\"\n               OpMemberName %push_const_block_xe 1 \"xe_resolve_coordinate_info\"\n               OpMemberName %push_const_block_xe 2 \"xe_resolve_dest_info\"\n               OpMemberName %push_const_block_xe 3 \"xe_resolve_dest_coordinate_info\"\n               OpMemberName %push_const_block_xe 4 \"xe_resolve_dest_base\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_resolve_edram_xe_block \"xe_resolve_edram_xe_block\"\n               OpMemberName %xe_resolve_edram_xe_block 0 \"data\"\n               OpName %xe_resolve_edram \"xe_resolve_edram\"\n               OpName %xe_resolve_dest_xe_block \"xe_resolve_dest_xe_block\"\n               OpMemberName %xe_resolve_dest_xe_block 0 \"data\"\n               OpName %xe_resolve_dest \"xe_resolve_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_resolve_edram_xe_block BufferBlock\n               OpMemberDecorate %xe_resolve_edram_xe_block 0 NonWritable\n               OpMemberDecorate %xe_resolve_edram_xe_block 0 Offset 0\n               OpDecorate %xe_resolve_edram NonWritable\n               OpDecorate %xe_resolve_edram Binding 0\n               OpDecorate %xe_resolve_edram DescriptorSet 0\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_resolve_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_resolve_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_resolve_dest_xe_block 0 Offset 0\n               OpDecorate %xe_resolve_dest NonReadable\n               OpDecorate %xe_resolve_dest Binding 0\n               OpDecorate %xe_resolve_dest DescriptorSet 1\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n     %v4uint = OpTypeVector %uint 4\n       %bool = OpTypeBool\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n     %uint_1 = OpConstant %uint 1\n     %uint_2 = OpConstant %uint 2\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n     %uint_3 = OpConstant %uint 3\n    %uint_16 = OpConstant %uint 16\n       %1837 = OpConstantComposite %v2uint %uint_2 %uint_1\n     %v2bool = OpTypeVector %bool 2\n     %uint_0 = OpConstant %uint 0\n       %1807 = OpConstantComposite %v2uint %uint_0 %uint_0\n       %1828 = OpConstantComposite %v2uint %uint_1 %uint_1\n       %1816 = OpConstantComposite %v2uint %uint_1 %uint_0\n    %uint_80 = OpConstant %uint 80\n       %2719 = OpConstantComposite %v2uint %uint_80 %uint_16\n      %int_2 = OpConstant %int 2\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n      %int_3 = OpConstant %int 3\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n  %uint_1023 = OpConstant %uint 1023\n    %uint_10 = OpConstant %uint 10\n  %uint_4096 = OpConstant %uint 4096\n    %uint_13 = OpConstant %uint 13\n  %uint_2047 = OpConstant %uint 2047\n    %uint_24 = OpConstant %uint 24\n    %uint_15 = OpConstant %uint 15\n    %uint_28 = OpConstant %uint 28\n     %uint_4 = OpConstant %uint 4\n       %1855 = OpConstantComposite %v2uint %uint_0 %uint_4\n     %uint_5 = OpConstant %uint 5\n     %uint_7 = OpConstant %uint 7\n%uint_16777216 = OpConstant %uint 16777216\n    %uint_20 = OpConstant %uint 20\n       %2275 = OpConstantComposite %v2uint %uint_20 %uint_24\n     %v3uint = OpTypeVector %uint 3\n   %uint_255 = OpConstant %uint 255\n%uint_3222273024 = OpConstant %uint 3222273024\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n%_ptr_Input_uint = OpTypePointer Input %uint\n       %1834 = OpConstantComposite %v2uint %uint_3 %uint_0\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_resolve_edram_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_resolve_edram_xe_block = OpTypePointer Uniform %xe_resolve_edram_xe_block\n%xe_resolve_edram = OpVariable %_ptr_Uniform_xe_resolve_edram_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_resolve_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_resolve_dest_xe_block = OpTypePointer Uniform %xe_resolve_dest_xe_block\n%xe_resolve_dest = OpVariable %_ptr_Uniform_xe_resolve_dest_xe_block Uniform\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_8 %uint_8 %uint_1\n       %1954 = OpConstantComposite %v2uint %uint_15 %uint_1\n       %1870 = OpConstantComposite %v2uint %uint_3 %uint_3\n       %2122 = OpConstantComposite %v2uint %uint_15 %uint_15\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n       %1611 = OpConstantComposite %v4uint %uint_255 %uint_255 %uint_255 %uint_255\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n       %2352 = OpConstantComposite %v4uint %uint_3222273024 %uint_3222273024 %uint_3222273024 %uint_3222273024\n        %929 = OpConstantComposite %v4uint %uint_1023 %uint_1023 %uint_1023 %uint_1023\n        %965 = OpConstantComposite %v4uint %uint_20 %uint_20 %uint_20 %uint_20\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n    %uint_40 = OpConstant %uint 40\n     %int_40 = OpConstant %int 40\n    %int_n40 = OpConstant %int -40\n  %uint_1280 = OpConstant %uint 1280\n%uint_2621440 = OpConstant %uint 2621440\n      %false = OpConstantFalse %bool\n    %uint_32 = OpConstant %uint 32\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %22245 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %15627 = OpLoad %uint %22245\n      %22700 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %20824 = OpLoad %uint %22700\n      %20561 = OpBitwiseAnd %uint %15627 %uint_1023\n      %20073 = OpShiftRightLogical %uint %15627 %uint_10\n       %7177 = OpBitwiseAnd %uint %20073 %uint_3\n      %23023 = OpBitwiseAnd %uint %15627 %uint_4096\n      %20495 = OpINotEqual %bool %23023 %uint_0\n      %10307 = OpShiftRightLogical %uint %15627 %uint_13\n      %24434 = OpBitwiseAnd %uint %10307 %uint_2047\n      %18836 = OpShiftRightLogical %uint %15627 %uint_24\n       %9130 = OpBitwiseAnd %uint %18836 %uint_15\n       %8871 = OpCompositeConstruct %v2uint %20824 %20824\n       %9576 = OpShiftRightLogical %v2uint %8871 %1855\n      %23379 = OpBitwiseAnd %v2uint %9576 %1954\n      %16207 = OpShiftLeftLogical %v2uint %23379 %1870\n      %23019 = OpIMul %v2uint %16207 %1828\n      %12819 = OpShiftRightLogical %uint %20824 %uint_5\n      %16204 = OpBitwiseAnd %uint %12819 %uint_2047\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %24236 = OpLoad %uint %18732\n      %22701 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %20919 = OpLoad %uint %22701\n      %19164 = OpBitwiseAnd %uint %24236 %uint_7\n      %21999 = OpBitwiseAnd %uint %24236 %uint_8\n      %20496 = OpINotEqual %bool %21999 %uint_0\n      %10402 = OpShiftRightLogical %uint %24236 %uint_4\n      %23037 = OpBitwiseAnd %uint %10402 %uint_7\n      %23118 = OpBitwiseAnd %uint %24236 %uint_16777216\n      %19535 = OpINotEqual %bool %23118 %uint_0\n       %8444 = OpBitwiseAnd %uint %20919 %uint_1023\n      %12176 = OpShiftRightLogical %uint %20919 %uint_10\n      %25038 = OpBitwiseAnd %uint %12176 %uint_1023\n      %25203 = OpShiftLeftLogical %uint %25038 %int_1\n      %10422 = OpCompositeConstruct %v2uint %20919 %20919\n      %10385 = OpShiftRightLogical %v2uint %10422 %2275\n      %23380 = OpBitwiseAnd %v2uint %10385 %2122\n      %16208 = OpShiftLeftLogical %v2uint %23380 %1870\n      %23020 = OpIMul %v2uint %16208 %1828\n      %12820 = OpShiftRightLogical %uint %20919 %uint_28\n      %16205 = OpBitwiseAnd %uint %12820 %uint_7\n      %18733 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_4\n      %24237 = OpLoad %uint %18733\n      %22225 = OpAccessChain %_ptr_Input_uint %gl_GlobalInvocationID %uint_0\n       %7085 = OpLoad %uint %22225\n       %7405 = OpUGreaterThanEqual %bool %7085 %16204\n               OpSelectionMerge %17447 DontFlatten\n               OpBranchConditional %7405 %21992 %17447\n      %21992 = OpLabel\n               OpBranch %19578\n      %17447 = OpLabel\n      %14637 = OpLoad %v3uint %gl_GlobalInvocationID\n      %18505 = OpVectorShuffle %v2uint %14637 %14637 0 1\n       %9840 = OpShiftLeftLogical %v2uint %18505 %1834\n      %24498 = OpCompositeExtract %uint %9840 0\n       %7150 = OpCompositeExtract %uint %9840 1\n      %24446 = OpExtInst %uint %1 UMax %7150 %uint_0\n      %20975 = OpCompositeConstruct %v2uint %24498 %24446\n      %21036 = OpIAdd %v2uint %20975 %23019\n      %16075 = OpULessThanEqual %bool %16205 %uint_3\n               OpSelectionMerge %23776 None\n               OpBranchConditional %16075 %10990 %15087\n      %15087 = OpLabel\n      %13566 = OpIEqual %bool %16205 %uint_5\n       %8438 = OpSelect %uint %13566 %uint_2 %uint_0\n               OpBranch %23776\n      %10990 = OpLabel\n               OpBranch %23776\n      %23776 = OpLabel\n      %19300 = OpPhi %uint %16205 %10990 %8438 %15087\n      %16830 = OpCompositeConstruct %v2uint %7177 %7177\n      %11801 = OpUGreaterThanEqual %v2bool %16830 %1837\n      %19381 = OpSelect %v2uint %11801 %1828 %1807\n      %10986 = OpShiftLeftLogical %v2uint %21036 %19381\n      %24669 = OpCompositeConstruct %v2uint %19300 %19300\n       %9093 = OpShiftRightLogical %v2uint %24669 %1816\n      %16110 = OpBitwiseAnd %v2uint %9093 %1828\n      %17779 = OpIAdd %v2uint %10986 %16110\n      %24270 = OpUDiv %v2uint %17779 %2719\n      %12360 = OpCompositeExtract %uint %24270 1\n      %11046 = OpIMul %uint %12360 %20561\n      %24665 = OpCompositeExtract %uint %24270 0\n      %21536 = OpIAdd %uint %11046 %24665\n       %8742 = OpIAdd %uint %24434 %21536\n       %6459 = OpIMul %v2uint %24270 %2719\n      %14279 = OpISub %v2uint %17779 %6459\n               OpSelectionMerge %19725 None\n               OpBranchConditional %20495 %10558 %19725\n      %10558 = OpLabel\n      %11791 = OpCompositeExtract %uint %14279 0\n      %24981 = OpBitcast %int %11791\n       %7841 = OpUGreaterThanEqual %bool %11791 %uint_40\n      %22568 = OpSelect %int %7841 %int_n40 %int_40\n      %11768 = OpIAdd %int %24981 %22568\n       %8071 = OpBitcast %uint %11768\n      %21574 = OpCompositeInsert %v2uint %8071 %14279 0\n               OpBranch %19725\n      %19725 = OpLabel\n       %8537 = OpPhi %v2uint %14279 %23776 %21574 %10558\n       %6671 = OpIMul %uint %8742 %uint_1280\n      %13892 = OpCompositeExtract %uint %8537 1\n      %15890 = OpIMul %uint %13892 %uint_80\n      %24666 = OpCompositeExtract %uint %8537 0\n      %21631 = OpIAdd %uint %15890 %24666\n       %9131 = OpIAdd %uint %6671 %21631\n      %10282 = OpUMod %uint %9131 %uint_2621440\n      %18095 = OpShiftLeftLogical %uint %10282 %int_2\n      %19333 = OpShiftRightLogical %uint %18095 %int_4\n      %10173 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_edram %int_0 %19333\n      %15060 = OpLoad %v4uint %10173\n       %8517 = OpIAdd %uint %18095 %uint_16\n      %21670 = OpShiftRightLogical %uint %8517 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_edram %int_0 %21670\n       %7319 = OpLoad %v4uint %20399\n      %15472 = OpIEqual %bool %24498 %uint_0\n      %15603 = OpSelect %bool %15472 %false %15472\n               OpSelectionMerge %21910 DontFlatten\n               OpBranchConditional %15603 %9760 %21910\n       %9760 = OpLabel\n      %20482 = OpCompositeExtract %uint %15060 1\n      %14335 = OpCompositeInsert %v4uint %20482 %15060 0\n               OpBranch %21910\n      %21910 = OpLabel\n      %10924 = OpPhi %v4uint %15060 %19725 %14335 %9760\n               OpSelectionMerge %21263 DontFlatten\n               OpBranchConditional %19535 %22395 %21263\n      %22395 = OpLabel\n               OpSelectionMerge %14836 None\n               OpSwitch %9130 %14836 0 %21920 1 %21920 2 %10391 3 %10391 10 %10391 12 %10391\n      %10391 = OpLabel\n      %15273 = OpBitwiseAnd %v4uint %10924 %2352\n      %23564 = OpBitwiseAnd %v4uint %10924 %929\n      %24837 = OpShiftLeftLogical %v4uint %23564 %965\n      %18005 = OpBitwiseOr %v4uint %15273 %24837\n      %23170 = OpShiftRightLogical %v4uint %10924 %965\n       %6442 = OpBitwiseAnd %v4uint %23170 %929\n      %15589 = OpBitwiseOr %v4uint %18005 %6442\n      %19519 = OpBitwiseAnd %v4uint %7319 %2352\n      %17946 = OpBitwiseAnd %v4uint %7319 %929\n      %24838 = OpShiftLeftLogical %v4uint %17946 %965\n      %18006 = OpBitwiseOr %v4uint %19519 %24838\n      %23171 = OpShiftRightLogical %v4uint %7319 %965\n       %7392 = OpBitwiseAnd %v4uint %23171 %929\n       %7870 = OpBitwiseOr %v4uint %18006 %7392\n               OpBranch %14836\n      %21920 = OpLabel\n      %20117 = OpBitwiseAnd %v4uint %10924 %1838\n      %23565 = OpBitwiseAnd %v4uint %10924 %1611\n      %24839 = OpShiftLeftLogical %v4uint %23565 %749\n      %18007 = OpBitwiseOr %v4uint %20117 %24839\n      %23172 = OpShiftRightLogical %v4uint %10924 %749\n       %6443 = OpBitwiseAnd %v4uint %23172 %1611\n      %15590 = OpBitwiseOr %v4uint %18007 %6443\n      %19520 = OpBitwiseAnd %v4uint %7319 %1838\n      %17947 = OpBitwiseAnd %v4uint %7319 %1611\n      %24840 = OpShiftLeftLogical %v4uint %17947 %749\n      %18008 = OpBitwiseOr %v4uint %19520 %24840\n      %23173 = OpShiftRightLogical %v4uint %7319 %749\n       %7393 = OpBitwiseAnd %v4uint %23173 %1611\n       %7871 = OpBitwiseOr %v4uint %18008 %7393\n               OpBranch %14836\n      %14836 = OpLabel\n      %11251 = OpPhi %v4uint %7319 %22395 %7871 %21920 %7870 %10391\n      %13709 = OpPhi %v4uint %10924 %22395 %15590 %21920 %15589 %10391\n               OpBranch %21263\n      %21263 = OpLabel\n       %8952 = OpPhi %v4uint %7319 %21910 %11251 %14836\n      %22009 = OpPhi %v4uint %10924 %21910 %13709 %14836\n       %7320 = OpIAdd %v2uint %9840 %23020\n               OpSelectionMerge %21237 DontFlatten\n               OpBranchConditional %20496 %10574 %21373\n      %21373 = OpLabel\n      %10608 = OpBitcast %v2int %7320\n      %17907 = OpCompositeExtract %int %10608 1\n      %19904 = OpShiftRightArithmetic %int %17907 %int_5\n      %22400 = OpBitcast %int %8444\n       %7938 = OpIMul %int %19904 %22400\n      %25154 = OpCompositeExtract %int %10608 0\n      %20423 = OpShiftRightArithmetic %int %25154 %int_5\n      %18864 = OpIAdd %int %7938 %20423\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %17907 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25154 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17334 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17334 %uint_2\n      %12766 = OpShiftRightArithmetic %int %17907 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25154 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %17907 %int_3\n      %20574 = OpBitwiseAnd %int %10425 %int_1\n      %21533 = OpShiftLeftLogical %int %20574 %int_1\n       %8890 = OpBitwiseXor %int %20766 %21533\n      %20598 = OpBitwiseAnd %int %17907 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6551\n       %7168 = OpShiftLeftLogical %int %21575 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24163 %int_15\n      %15473 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24163 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15473 %21630\n      %14958 = OpShiftRightArithmetic %int %24163 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21632 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21632\n      %15496 = OpShiftRightArithmetic %int %24163 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %21237\n      %10574 = OpLabel\n      %19866 = OpCompositeExtract %uint %7320 0\n      %11267 = OpCompositeExtract %uint %7320 1\n       %8414 = OpCompositeConstruct %v3uint %19866 %11267 %23037\n      %20125 = OpBitcast %v3int %8414\n      %11255 = OpCompositeExtract %int %20125 2\n      %19905 = OpShiftRightArithmetic %int %11255 %int_2\n      %22401 = OpBitcast %int %25203\n       %7939 = OpIMul %int %19905 %22401\n      %25155 = OpCompositeExtract %int %20125 1\n      %19055 = OpShiftRightArithmetic %int %25155 %int_4\n      %11052 = OpIAdd %int %7939 %19055\n      %16898 = OpBitcast %int %8444\n      %14944 = OpIMul %int %11052 %16898\n      %25156 = OpCompositeExtract %int %20125 0\n      %20424 = OpShiftRightArithmetic %int %25156 %int_5\n      %18940 = OpIAdd %int %14944 %20424\n       %8797 = OpShiftLeftLogical %int %18940 %int_7\n      %11434 = OpBitwiseAnd %int %11255 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %25155 %int_1\n      %21364 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21364 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %25156 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17335 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17335 %uint_2\n      %13015 = OpShiftRightArithmetic %int %25155 %int_3\n       %9929 = OpBitwiseXor %int %13015 %19905\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %25156 %int_3\n      %20575 = OpBitwiseAnd %int %9616 %int_3\n      %21534 = OpShiftLeftLogical %int %16793 %int_1\n       %8891 = OpBitwiseXor %int %20575 %21534\n      %20599 = OpBitwiseAnd %int %25155 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6552\n       %7169 = OpShiftLeftLogical %int %16793 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24144 %int_15\n      %15474 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24144 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21633 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15474 %21633\n      %14959 = OpShiftRightArithmetic %int %24144 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21634 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21634\n      %15497 = OpShiftRightArithmetic %int %24144 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %21237\n      %21237 = OpLabel\n      %11376 = OpPhi %uint %16870 %10574 %16869 %21373\n      %20616 = OpIAdd %uint %11376 %24237\n      %18675 = OpShiftRightLogical %uint %20616 %int_4\n      %12010 = OpIEqual %bool %19164 %uint_1\n      %22390 = OpIEqual %bool %19164 %uint_2\n      %22150 = OpLogicalOr %bool %12010 %22390\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %22009 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %22009 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22649 = OpPhi %v4uint %22009 %21237 %16376 %10583\n      %19638 = OpIEqual %bool %19164 %uint_3\n      %15139 = OpLogicalOr %bool %22390 %19638\n               OpSelectionMerge %11416 None\n               OpBranchConditional %15139 %11064 %11416\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22649 %749\n      %15335 = OpShiftRightLogical %v4uint %22649 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %11416\n      %11416 = OpLabel\n      %19767 = OpPhi %v4uint %22649 %13411 %10728 %11064\n      %24825 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_dest %int_0 %18675\n               OpStore %24825 %19767\n      %11726 = OpIAdd %uint %20616 %uint_32\n      %16881 = OpShiftRightLogical %uint %11726 %int_4\n               OpSelectionMerge %14874 None\n               OpBranchConditional %22150 %10584 %14874\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %8952 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %8952 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %14874\n      %14874 = OpLabel\n      %10925 = OpPhi %v4uint %8952 %11416 %16377 %10584\n               OpSelectionMerge %11417 None\n               OpBranchConditional %15139 %11065 %11417\n      %11065 = OpLabel\n      %24088 = OpShiftLeftLogical %v4uint %10925 %749\n      %15336 = OpShiftRightLogical %v4uint %10925 %749\n      %10729 = OpBitwiseOr %v4uint %24088 %15336\n               OpBranch %11417\n      %11417 = OpLabel\n      %19768 = OpPhi %v4uint %10925 %14874 %10729 %11065\n       %8053 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_dest %int_0 %16881\n               OpStore %8053 %19768\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t resolve_fast_32bpp_1x2xmsaa_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006274, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000008, 0x00000008, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x0000040B, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x00090006, 0x0000040B, 0x00000000, 0x725F6578,\n    0x6C6F7365, 0x655F6576, 0x6D617264, 0x666E695F, 0x0000006F, 0x000A0006,\n    0x0000040B, 0x00000001, 0x725F6578, 0x6C6F7365, 0x635F6576, 0x64726F6F,\n    0x74616E69, 0x6E695F65, 0x00006F66, 0x00090006, 0x0000040B, 0x00000002,\n    0x725F6578, 0x6C6F7365, 0x645F6576, 0x5F747365, 0x6F666E69, 0x00000000,\n    0x000B0006, 0x0000040B, 0x00000003, 0x725F6578, 0x6C6F7365, 0x645F6576,\n    0x5F747365, 0x726F6F63, 0x616E6964, 0x695F6574, 0x006F666E, 0x00090006,\n    0x0000040B, 0x00000004, 0x725F6578, 0x6C6F7365, 0x645F6576, 0x5F747365,\n    0x65736162, 0x00000000, 0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F,\n    0x5F737473, 0x00006578, 0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C,\n    0x766E496C, 0x7461636F, 0x496E6F69, 0x00000044, 0x00090005, 0x000007B4,\n    0x725F6578, 0x6C6F7365, 0x655F6576, 0x6D617264, 0x5F65785F, 0x636F6C62,\n    0x0000006B, 0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000,\n    0x00070005, 0x00000CC7, 0x725F6578, 0x6C6F7365, 0x655F6576, 0x6D617264,\n    0x00000000, 0x00090005, 0x000007B5, 0x725F6578, 0x6C6F7365, 0x645F6576,\n    0x5F747365, 0x625F6578, 0x6B636F6C, 0x00000000, 0x00050006, 0x000007B5,\n    0x00000000, 0x61746164, 0x00000000, 0x00060005, 0x00001592, 0x725F6578,\n    0x6C6F7365, 0x645F6576, 0x00747365, 0x00030047, 0x0000040B, 0x00000002,\n    0x00050048, 0x0000040B, 0x00000000, 0x00000023, 0x00000000, 0x00050048,\n    0x0000040B, 0x00000001, 0x00000023, 0x00000004, 0x00050048, 0x0000040B,\n    0x00000002, 0x00000023, 0x00000008, 0x00050048, 0x0000040B, 0x00000003,\n    0x00000023, 0x0000000C, 0x00050048, 0x0000040B, 0x00000004, 0x00000023,\n    0x00000010, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x00000CC7, 0x00000018,\n    0x00040047, 0x00000CC7, 0x00000021, 0x00000000, 0x00040047, 0x00000CC7,\n    0x00000022, 0x00000000, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x00001592, 0x00000019, 0x00040047, 0x00001592, 0x00000021,\n    0x00000000, 0x00040047, 0x00001592, 0x00000022, 0x00000001, 0x00040047,\n    0x00000AC7, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000017,\n    0x0000000B, 0x00000004, 0x00020014, 0x00000009, 0x00040015, 0x0000000C,\n    0x00000020, 0x00000001, 0x00040017, 0x00000012, 0x0000000C, 0x00000002,\n    0x00040017, 0x00000016, 0x0000000C, 0x00000003, 0x0004002B, 0x0000000B,\n    0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B, 0x00000A10, 0x00000002,\n    0x0004002B, 0x0000000B, 0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B,\n    0x00000A22, 0x00000008, 0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00,\n    0x0004002B, 0x0000000B, 0x00000A13, 0x00000003, 0x0004002B, 0x0000000B,\n    0x00000A3A, 0x00000010, 0x0005002C, 0x00000011, 0x0000072D, 0x00000A10,\n    0x00000A0D, 0x00040017, 0x0000000F, 0x00000009, 0x00000002, 0x0004002B,\n    0x0000000B, 0x00000A0A, 0x00000000, 0x0005002C, 0x00000011, 0x0000070F,\n    0x00000A0A, 0x00000A0A, 0x0005002C, 0x00000011, 0x00000724, 0x00000A0D,\n    0x00000A0D, 0x0005002C, 0x00000011, 0x00000718, 0x00000A0D, 0x00000A0A,\n    0x0004002B, 0x0000000B, 0x00000AFA, 0x00000050, 0x0005002C, 0x00000011,\n    0x00000A9F, 0x00000AFA, 0x00000A3A, 0x0004002B, 0x0000000C, 0x00000A11,\n    0x00000002, 0x0004002B, 0x0000000C, 0x00000A17, 0x00000004, 0x0004002B,\n    0x0000000C, 0x00000A1D, 0x00000006, 0x0004002B, 0x0000000C, 0x00000A2C,\n    0x0000000B, 0x0004002B, 0x0000000C, 0x00000A38, 0x0000000F, 0x0004002B,\n    0x0000000C, 0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C, 0x00000A1A,\n    0x00000005, 0x0004002B, 0x0000000C, 0x00000A20, 0x00000007, 0x0004002B,\n    0x0000000C, 0x00000A23, 0x00000008, 0x0004002B, 0x0000000C, 0x00000A2F,\n    0x0000000C, 0x0004002B, 0x0000000C, 0x00000A14, 0x00000003, 0x0004002B,\n    0x0000000C, 0x00000A0B, 0x00000000, 0x0007001E, 0x0000040B, 0x0000000B,\n    0x0000000B, 0x0000000B, 0x0000000B, 0x0000000B, 0x00040020, 0x00000688,\n    0x00000009, 0x0000040B, 0x0004003B, 0x00000688, 0x00000CE9, 0x00000009,\n    0x00040020, 0x00000288, 0x00000009, 0x0000000B, 0x0004002B, 0x0000000B,\n    0x00000A44, 0x000003FF, 0x0004002B, 0x0000000B, 0x00000A28, 0x0000000A,\n    0x0004002B, 0x0000000B, 0x00000AFE, 0x00001000, 0x0004002B, 0x0000000B,\n    0x00000A31, 0x0000000D, 0x0004002B, 0x0000000B, 0x00000A81, 0x000007FF,\n    0x0004002B, 0x0000000B, 0x00000A52, 0x00000018, 0x0004002B, 0x0000000B,\n    0x00000A37, 0x0000000F, 0x0004002B, 0x0000000B, 0x00000A5E, 0x0000001C,\n    0x0004002B, 0x0000000B, 0x00000A16, 0x00000004, 0x0005002C, 0x00000011,\n    0x0000073F, 0x00000A0A, 0x00000A16, 0x0004002B, 0x0000000B, 0x00000A19,\n    0x00000005, 0x0004002B, 0x0000000B, 0x00000A1F, 0x00000007, 0x0004002B,\n    0x0000000B, 0x00000926, 0x01000000, 0x0004002B, 0x0000000B, 0x00000A46,\n    0x00000014, 0x0005002C, 0x00000011, 0x000008E3, 0x00000A46, 0x00000A52,\n    0x00040017, 0x00000014, 0x0000000B, 0x00000003, 0x0004002B, 0x0000000B,\n    0x00000144, 0x000000FF, 0x0004002B, 0x0000000B, 0x00000B54, 0xC00FFC00,\n    0x00040020, 0x00000291, 0x00000001, 0x00000014, 0x0004003B, 0x00000291,\n    0x00000F48, 0x00000001, 0x00040020, 0x00000289, 0x00000001, 0x0000000B,\n    0x0005002C, 0x00000011, 0x0000072A, 0x00000A13, 0x00000A0A, 0x0003001D,\n    0x000007DC, 0x00000017, 0x0003001E, 0x000007B4, 0x000007DC, 0x00040020,\n    0x00000A32, 0x00000002, 0x000007B4, 0x0004003B, 0x00000A32, 0x00000CC7,\n    0x00000002, 0x00040020, 0x00000294, 0x00000002, 0x00000017, 0x0003001D,\n    0x000007DD, 0x00000017, 0x0003001E, 0x000007B5, 0x000007DD, 0x00040020,\n    0x00000A33, 0x00000002, 0x000007B5, 0x0004003B, 0x00000A33, 0x00001592,\n    0x00000002, 0x0006002C, 0x00000014, 0x00000AC7, 0x00000A22, 0x00000A22,\n    0x00000A0D, 0x0005002C, 0x00000011, 0x000007A2, 0x00000A37, 0x00000A0D,\n    0x0005002C, 0x00000011, 0x0000074E, 0x00000A13, 0x00000A13, 0x0005002C,\n    0x00000011, 0x0000084A, 0x00000A37, 0x00000A37, 0x0007002C, 0x00000017,\n    0x0000072E, 0x000005FD, 0x000005FD, 0x000005FD, 0x000005FD, 0x0007002C,\n    0x00000017, 0x0000064B, 0x00000144, 0x00000144, 0x00000144, 0x00000144,\n    0x0007002C, 0x00000017, 0x000002ED, 0x00000A3A, 0x00000A3A, 0x00000A3A,\n    0x00000A3A, 0x0007002C, 0x00000017, 0x00000930, 0x00000B54, 0x00000B54,\n    0x00000B54, 0x00000B54, 0x0007002C, 0x00000017, 0x000003A1, 0x00000A44,\n    0x00000A44, 0x00000A44, 0x00000A44, 0x0007002C, 0x00000017, 0x000003C5,\n    0x00000A46, 0x00000A46, 0x00000A46, 0x00000A46, 0x0007002C, 0x00000017,\n    0x000009CE, 0x000008A6, 0x000008A6, 0x000008A6, 0x000008A6, 0x0007002C,\n    0x00000017, 0x0000013D, 0x00000A22, 0x00000A22, 0x00000A22, 0x00000A22,\n    0x0004002B, 0x0000000B, 0x00000A82, 0x00000028, 0x0004002B, 0x0000000C,\n    0x00000A83, 0x00000028, 0x0004002B, 0x0000000C, 0x00000993, 0xFFFFFFD8,\n    0x0004002B, 0x0000000B, 0x00000184, 0x00000500, 0x0004002B, 0x0000000B,\n    0x0000086E, 0x00280000, 0x0003002A, 0x00000009, 0x00000787, 0x0004002B,\n    0x0000000B, 0x00000A6A, 0x00000020, 0x00050036, 0x00000008, 0x0000161F,\n    0x00000000, 0x00000502, 0x000200F8, 0x00003B06, 0x000300F7, 0x00004C7A,\n    0x00000000, 0x000300FB, 0x00000A0A, 0x00002E68, 0x000200F8, 0x00002E68,\n    0x00050041, 0x00000288, 0x000056E5, 0x00000CE9, 0x00000A0B, 0x0004003D,\n    0x0000000B, 0x00003D0B, 0x000056E5, 0x00050041, 0x00000288, 0x000058AC,\n    0x00000CE9, 0x00000A0E, 0x0004003D, 0x0000000B, 0x00005158, 0x000058AC,\n    0x000500C7, 0x0000000B, 0x00005051, 0x00003D0B, 0x00000A44, 0x000500C2,\n    0x0000000B, 0x00004E69, 0x00003D0B, 0x00000A28, 0x000500C7, 0x0000000B,\n    0x00001C09, 0x00004E69, 0x00000A13, 0x000500C7, 0x0000000B, 0x000059EF,\n    0x00003D0B, 0x00000AFE, 0x000500AB, 0x00000009, 0x0000500F, 0x000059EF,\n    0x00000A0A, 0x000500C2, 0x0000000B, 0x00002843, 0x00003D0B, 0x00000A31,\n    0x000500C7, 0x0000000B, 0x00005F72, 0x00002843, 0x00000A81, 0x000500C2,\n    0x0000000B, 0x00004994, 0x00003D0B, 0x00000A52, 0x000500C7, 0x0000000B,\n    0x000023AA, 0x00004994, 0x00000A37, 0x00050050, 0x00000011, 0x000022A7,\n    0x00005158, 0x00005158, 0x000500C2, 0x00000011, 0x00002568, 0x000022A7,\n    0x0000073F, 0x000500C7, 0x00000011, 0x00005B53, 0x00002568, 0x000007A2,\n    0x000500C4, 0x00000011, 0x00003F4F, 0x00005B53, 0x0000074E, 0x00050084,\n    0x00000011, 0x000059EB, 0x00003F4F, 0x00000724, 0x000500C2, 0x0000000B,\n    0x00003213, 0x00005158, 0x00000A19, 0x000500C7, 0x0000000B, 0x00003F4C,\n    0x00003213, 0x00000A81, 0x00050041, 0x00000288, 0x0000492C, 0x00000CE9,\n    0x00000A11, 0x0004003D, 0x0000000B, 0x00005EAC, 0x0000492C, 0x00050041,\n    0x00000288, 0x000058AD, 0x00000CE9, 0x00000A14, 0x0004003D, 0x0000000B,\n    0x000051B7, 0x000058AD, 0x000500C7, 0x0000000B, 0x00004ADC, 0x00005EAC,\n    0x00000A1F, 0x000500C7, 0x0000000B, 0x000055EF, 0x00005EAC, 0x00000A22,\n    0x000500AB, 0x00000009, 0x00005010, 0x000055EF, 0x00000A0A, 0x000500C2,\n    0x0000000B, 0x000028A2, 0x00005EAC, 0x00000A16, 0x000500C7, 0x0000000B,\n    0x000059FD, 0x000028A2, 0x00000A1F, 0x000500C7, 0x0000000B, 0x00005A4E,\n    0x00005EAC, 0x00000926, 0x000500AB, 0x00000009, 0x00004C4F, 0x00005A4E,\n    0x00000A0A, 0x000500C7, 0x0000000B, 0x000020FC, 0x000051B7, 0x00000A44,\n    0x000500C2, 0x0000000B, 0x00002F90, 0x000051B7, 0x00000A28, 0x000500C7,\n    0x0000000B, 0x000061CE, 0x00002F90, 0x00000A44, 0x000500C4, 0x0000000B,\n    0x00006273, 0x000061CE, 0x00000A0E, 0x00050050, 0x00000011, 0x000028B6,\n    0x000051B7, 0x000051B7, 0x000500C2, 0x00000011, 0x00002891, 0x000028B6,\n    0x000008E3, 0x000500C7, 0x00000011, 0x00005B54, 0x00002891, 0x0000084A,\n    0x000500C4, 0x00000011, 0x00003F50, 0x00005B54, 0x0000074E, 0x00050084,\n    0x00000011, 0x000059EC, 0x00003F50, 0x00000724, 0x000500C2, 0x0000000B,\n    0x00003214, 0x000051B7, 0x00000A5E, 0x000500C7, 0x0000000B, 0x00003F4D,\n    0x00003214, 0x00000A1F, 0x00050041, 0x00000288, 0x0000492D, 0x00000CE9,\n    0x00000A17, 0x0004003D, 0x0000000B, 0x00005EAD, 0x0000492D, 0x00050041,\n    0x00000289, 0x000056D1, 0x00000F48, 0x00000A0A, 0x0004003D, 0x0000000B,\n    0x00001BAD, 0x000056D1, 0x000500AE, 0x00000009, 0x00001CED, 0x00001BAD,\n    0x00003F4C, 0x000300F7, 0x00004427, 0x00000002, 0x000400FA, 0x00001CED,\n    0x000055E8, 0x00004427, 0x000200F8, 0x000055E8, 0x000200F9, 0x00004C7A,\n    0x000200F8, 0x00004427, 0x0004003D, 0x00000014, 0x0000392D, 0x00000F48,\n    0x0007004F, 0x00000011, 0x00004849, 0x0000392D, 0x0000392D, 0x00000000,\n    0x00000001, 0x000500C4, 0x00000011, 0x00002670, 0x00004849, 0x0000072A,\n    0x00050051, 0x0000000B, 0x00005FB2, 0x00002670, 0x00000000, 0x00050051,\n    0x0000000B, 0x00001BEE, 0x00002670, 0x00000001, 0x0007000C, 0x0000000B,\n    0x00005F7E, 0x00000001, 0x00000029, 0x00001BEE, 0x00000A0A, 0x00050050,\n    0x00000011, 0x000051EF, 0x00005FB2, 0x00005F7E, 0x00050080, 0x00000011,\n    0x0000522C, 0x000051EF, 0x000059EB, 0x000500B2, 0x00000009, 0x00003ECB,\n    0x00003F4D, 0x00000A13, 0x000300F7, 0x00005CE0, 0x00000000, 0x000400FA,\n    0x00003ECB, 0x00002AEE, 0x00003AEF, 0x000200F8, 0x00003AEF, 0x000500AA,\n    0x00000009, 0x000034FE, 0x00003F4D, 0x00000A19, 0x000600A9, 0x0000000B,\n    0x000020F6, 0x000034FE, 0x00000A10, 0x00000A0A, 0x000200F9, 0x00005CE0,\n    0x000200F8, 0x00002AEE, 0x000200F9, 0x00005CE0, 0x000200F8, 0x00005CE0,\n    0x000700F5, 0x0000000B, 0x00004B64, 0x00003F4D, 0x00002AEE, 0x000020F6,\n    0x00003AEF, 0x00050050, 0x00000011, 0x000041BE, 0x00001C09, 0x00001C09,\n    0x000500AE, 0x0000000F, 0x00002E19, 0x000041BE, 0x0000072D, 0x000600A9,\n    0x00000011, 0x00004BB5, 0x00002E19, 0x00000724, 0x0000070F, 0x000500C4,\n    0x00000011, 0x00002AEA, 0x0000522C, 0x00004BB5, 0x00050050, 0x00000011,\n    0x0000605D, 0x00004B64, 0x00004B64, 0x000500C2, 0x00000011, 0x00002385,\n    0x0000605D, 0x00000718, 0x000500C7, 0x00000011, 0x00003EEE, 0x00002385,\n    0x00000724, 0x00050080, 0x00000011, 0x00004573, 0x00002AEA, 0x00003EEE,\n    0x00050086, 0x00000011, 0x00005ECE, 0x00004573, 0x00000A9F, 0x00050051,\n    0x0000000B, 0x00003048, 0x00005ECE, 0x00000001, 0x00050084, 0x0000000B,\n    0x00002B26, 0x00003048, 0x00005051, 0x00050051, 0x0000000B, 0x00006059,\n    0x00005ECE, 0x00000000, 0x00050080, 0x0000000B, 0x00005420, 0x00002B26,\n    0x00006059, 0x00050080, 0x0000000B, 0x00002226, 0x00005F72, 0x00005420,\n    0x00050084, 0x00000011, 0x0000193B, 0x00005ECE, 0x00000A9F, 0x00050082,\n    0x00000011, 0x000037C7, 0x00004573, 0x0000193B, 0x000300F7, 0x00004D0D,\n    0x00000000, 0x000400FA, 0x0000500F, 0x0000293E, 0x00004D0D, 0x000200F8,\n    0x0000293E, 0x00050051, 0x0000000B, 0x00002E0F, 0x000037C7, 0x00000000,\n    0x0004007C, 0x0000000C, 0x00006195, 0x00002E0F, 0x000500AE, 0x00000009,\n    0x00001EA1, 0x00002E0F, 0x00000A82, 0x000600A9, 0x0000000C, 0x00005828,\n    0x00001EA1, 0x00000993, 0x00000A83, 0x00050080, 0x0000000C, 0x00002DF8,\n    0x00006195, 0x00005828, 0x0004007C, 0x0000000B, 0x00001F87, 0x00002DF8,\n    0x00060052, 0x00000011, 0x00005446, 0x00001F87, 0x000037C7, 0x00000000,\n    0x000200F9, 0x00004D0D, 0x000200F8, 0x00004D0D, 0x000700F5, 0x00000011,\n    0x00002159, 0x000037C7, 0x00005CE0, 0x00005446, 0x0000293E, 0x00050084,\n    0x0000000B, 0x00001A0F, 0x00002226, 0x00000184, 0x00050051, 0x0000000B,\n    0x00003644, 0x00002159, 0x00000001, 0x00050084, 0x0000000B, 0x00003E12,\n    0x00003644, 0x00000AFA, 0x00050051, 0x0000000B, 0x0000605A, 0x00002159,\n    0x00000000, 0x00050080, 0x0000000B, 0x0000547F, 0x00003E12, 0x0000605A,\n    0x00050080, 0x0000000B, 0x000023AB, 0x00001A0F, 0x0000547F, 0x00050089,\n    0x0000000B, 0x0000282A, 0x000023AB, 0x0000086E, 0x000500C4, 0x0000000B,\n    0x000046AF, 0x0000282A, 0x00000A11, 0x000500C2, 0x0000000B, 0x00004B85,\n    0x000046AF, 0x00000A17, 0x00060041, 0x00000294, 0x000027BD, 0x00000CC7,\n    0x00000A0B, 0x00004B85, 0x0004003D, 0x00000017, 0x00003AD4, 0x000027BD,\n    0x00050080, 0x0000000B, 0x00002145, 0x000046AF, 0x00000A3A, 0x000500C2,\n    0x0000000B, 0x000054A6, 0x00002145, 0x00000A17, 0x00060041, 0x00000294,\n    0x00004FAF, 0x00000CC7, 0x00000A0B, 0x000054A6, 0x0004003D, 0x00000017,\n    0x00001C97, 0x00004FAF, 0x000500AA, 0x00000009, 0x00003C70, 0x00005FB2,\n    0x00000A0A, 0x000600A9, 0x00000009, 0x00003CF3, 0x00003C70, 0x00000787,\n    0x00003C70, 0x000300F7, 0x00005596, 0x00000002, 0x000400FA, 0x00003CF3,\n    0x00002620, 0x00005596, 0x000200F8, 0x00002620, 0x00050051, 0x0000000B,\n    0x00005002, 0x00003AD4, 0x00000001, 0x00060052, 0x00000017, 0x000037FF,\n    0x00005002, 0x00003AD4, 0x00000000, 0x000200F9, 0x00005596, 0x000200F8,\n    0x00005596, 0x000700F5, 0x00000017, 0x00002AAC, 0x00003AD4, 0x00004D0D,\n    0x000037FF, 0x00002620, 0x000300F7, 0x0000530F, 0x00000002, 0x000400FA,\n    0x00004C4F, 0x0000577B, 0x0000530F, 0x000200F8, 0x0000577B, 0x000300F7,\n    0x000039F4, 0x00000000, 0x000F00FB, 0x000023AA, 0x000039F4, 0x00000000,\n    0x000055A0, 0x00000001, 0x000055A0, 0x00000002, 0x00002897, 0x00000003,\n    0x00002897, 0x0000000A, 0x00002897, 0x0000000C, 0x00002897, 0x000200F8,\n    0x00002897, 0x000500C7, 0x00000017, 0x00003BA9, 0x00002AAC, 0x00000930,\n    0x000500C7, 0x00000017, 0x00005C0C, 0x00002AAC, 0x000003A1, 0x000500C4,\n    0x00000017, 0x00006105, 0x00005C0C, 0x000003C5, 0x000500C5, 0x00000017,\n    0x00004655, 0x00003BA9, 0x00006105, 0x000500C2, 0x00000017, 0x00005A82,\n    0x00002AAC, 0x000003C5, 0x000500C7, 0x00000017, 0x0000192A, 0x00005A82,\n    0x000003A1, 0x000500C5, 0x00000017, 0x00003CE5, 0x00004655, 0x0000192A,\n    0x000500C7, 0x00000017, 0x00004C3F, 0x00001C97, 0x00000930, 0x000500C7,\n    0x00000017, 0x0000461A, 0x00001C97, 0x000003A1, 0x000500C4, 0x00000017,\n    0x00006106, 0x0000461A, 0x000003C5, 0x000500C5, 0x00000017, 0x00004656,\n    0x00004C3F, 0x00006106, 0x000500C2, 0x00000017, 0x00005A83, 0x00001C97,\n    0x000003C5, 0x000500C7, 0x00000017, 0x00001CE0, 0x00005A83, 0x000003A1,\n    0x000500C5, 0x00000017, 0x00001EBE, 0x00004656, 0x00001CE0, 0x000200F9,\n    0x000039F4, 0x000200F8, 0x000055A0, 0x000500C7, 0x00000017, 0x00004E95,\n    0x00002AAC, 0x0000072E, 0x000500C7, 0x00000017, 0x00005C0D, 0x00002AAC,\n    0x0000064B, 0x000500C4, 0x00000017, 0x00006107, 0x00005C0D, 0x000002ED,\n    0x000500C5, 0x00000017, 0x00004657, 0x00004E95, 0x00006107, 0x000500C2,\n    0x00000017, 0x00005A84, 0x00002AAC, 0x000002ED, 0x000500C7, 0x00000017,\n    0x0000192B, 0x00005A84, 0x0000064B, 0x000500C5, 0x00000017, 0x00003CE6,\n    0x00004657, 0x0000192B, 0x000500C7, 0x00000017, 0x00004C40, 0x00001C97,\n    0x0000072E, 0x000500C7, 0x00000017, 0x0000461B, 0x00001C97, 0x0000064B,\n    0x000500C4, 0x00000017, 0x00006108, 0x0000461B, 0x000002ED, 0x000500C5,\n    0x00000017, 0x00004658, 0x00004C40, 0x00006108, 0x000500C2, 0x00000017,\n    0x00005A85, 0x00001C97, 0x000002ED, 0x000500C7, 0x00000017, 0x00001CE1,\n    0x00005A85, 0x0000064B, 0x000500C5, 0x00000017, 0x00001EBF, 0x00004658,\n    0x00001CE1, 0x000200F9, 0x000039F4, 0x000200F8, 0x000039F4, 0x000900F5,\n    0x00000017, 0x00002BF3, 0x00001C97, 0x0000577B, 0x00001EBF, 0x000055A0,\n    0x00001EBE, 0x00002897, 0x000900F5, 0x00000017, 0x0000358D, 0x00002AAC,\n    0x0000577B, 0x00003CE6, 0x000055A0, 0x00003CE5, 0x00002897, 0x000200F9,\n    0x0000530F, 0x000200F8, 0x0000530F, 0x000700F5, 0x00000017, 0x000022F8,\n    0x00001C97, 0x00005596, 0x00002BF3, 0x000039F4, 0x000700F5, 0x00000017,\n    0x000055F9, 0x00002AAC, 0x00005596, 0x0000358D, 0x000039F4, 0x00050080,\n    0x00000011, 0x00001C98, 0x00002670, 0x000059EC, 0x000300F7, 0x000052F5,\n    0x00000002, 0x000400FA, 0x00005010, 0x0000294E, 0x0000537D, 0x000200F8,\n    0x0000537D, 0x0004007C, 0x00000012, 0x00002970, 0x00001C98, 0x00050051,\n    0x0000000C, 0x000045F3, 0x00002970, 0x00000001, 0x000500C3, 0x0000000C,\n    0x00004DC0, 0x000045F3, 0x00000A1A, 0x0004007C, 0x0000000C, 0x00005780,\n    0x000020FC, 0x00050084, 0x0000000C, 0x00001F02, 0x00004DC0, 0x00005780,\n    0x00050051, 0x0000000C, 0x00006242, 0x00002970, 0x00000000, 0x000500C3,\n    0x0000000C, 0x00004FC7, 0x00006242, 0x00000A1A, 0x00050080, 0x0000000C,\n    0x000049B0, 0x00001F02, 0x00004FC7, 0x000500C4, 0x0000000C, 0x0000254A,\n    0x000049B0, 0x00000A1D, 0x000500C3, 0x0000000C, 0x0000603B, 0x000045F3,\n    0x00000A0E, 0x000500C7, 0x0000000C, 0x0000539A, 0x0000603B, 0x00000A20,\n    0x000500C4, 0x0000000C, 0x0000534A, 0x0000539A, 0x00000A14, 0x000500C7,\n    0x0000000C, 0x00004EA5, 0x00006242, 0x00000A20, 0x000500C5, 0x0000000C,\n    0x00002B1A, 0x0000534A, 0x00004EA5, 0x000500C5, 0x0000000C, 0x000043B6,\n    0x0000254A, 0x00002B1A, 0x000500C4, 0x0000000C, 0x00005E63, 0x000043B6,\n    0x00000A10, 0x000500C3, 0x0000000C, 0x000031DE, 0x000045F3, 0x00000A17,\n    0x000500C7, 0x0000000C, 0x00005447, 0x000031DE, 0x00000A0E, 0x000500C3,\n    0x0000000C, 0x000028A6, 0x00006242, 0x00000A14, 0x000500C7, 0x0000000C,\n    0x0000511E, 0x000028A6, 0x00000A14, 0x000500C3, 0x0000000C, 0x000028B9,\n    0x000045F3, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000505E, 0x000028B9,\n    0x00000A0E, 0x000500C4, 0x0000000C, 0x0000541D, 0x0000505E, 0x00000A0E,\n    0x000500C6, 0x0000000C, 0x000022BA, 0x0000511E, 0x0000541D, 0x000500C7,\n    0x0000000C, 0x00005076, 0x000045F3, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x00005228, 0x00005076, 0x00000A17, 0x000500C4, 0x0000000C, 0x00001997,\n    0x000022BA, 0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FE, 0x00005228,\n    0x00001997, 0x000500C4, 0x0000000C, 0x00001C00, 0x00005447, 0x00000A2C,\n    0x000500C5, 0x0000000C, 0x00003C81, 0x000047FE, 0x00001C00, 0x000500C7,\n    0x0000000C, 0x000050AF, 0x00005E63, 0x00000A38, 0x000500C5, 0x0000000C,\n    0x00003C71, 0x00003C81, 0x000050AF, 0x000500C3, 0x0000000C, 0x00003745,\n    0x00005E63, 0x00000A17, 0x000500C7, 0x0000000C, 0x000018B8, 0x00003745,\n    0x00000A0E, 0x000500C4, 0x0000000C, 0x0000547E, 0x000018B8, 0x00000A1A,\n    0x000500C5, 0x0000000C, 0x000045A8, 0x00003C71, 0x0000547E, 0x000500C3,\n    0x0000000C, 0x00003A6E, 0x00005E63, 0x00000A1A, 0x000500C7, 0x0000000C,\n    0x000018B9, 0x00003A6E, 0x00000A20, 0x000500C4, 0x0000000C, 0x00005480,\n    0x000018B9, 0x00000A23, 0x000500C5, 0x0000000C, 0x0000456F, 0x000045A8,\n    0x00005480, 0x000500C3, 0x0000000C, 0x00003C88, 0x00005E63, 0x00000A23,\n    0x000500C4, 0x0000000C, 0x00002824, 0x00003C88, 0x00000A2F, 0x000500C5,\n    0x0000000C, 0x00003B79, 0x0000456F, 0x00002824, 0x0004007C, 0x0000000B,\n    0x000041E5, 0x00003B79, 0x000200F9, 0x000052F5, 0x000200F8, 0x0000294E,\n    0x00050051, 0x0000000B, 0x00004D9A, 0x00001C98, 0x00000000, 0x00050051,\n    0x0000000B, 0x00002C03, 0x00001C98, 0x00000001, 0x00060050, 0x00000014,\n    0x000020DE, 0x00004D9A, 0x00002C03, 0x000059FD, 0x0004007C, 0x00000016,\n    0x00004E9D, 0x000020DE, 0x00050051, 0x0000000C, 0x00002BF7, 0x00004E9D,\n    0x00000002, 0x000500C3, 0x0000000C, 0x00004DC1, 0x00002BF7, 0x00000A11,\n    0x0004007C, 0x0000000C, 0x00005781, 0x00006273, 0x00050084, 0x0000000C,\n    0x00001F03, 0x00004DC1, 0x00005781, 0x00050051, 0x0000000C, 0x00006243,\n    0x00004E9D, 0x00000001, 0x000500C3, 0x0000000C, 0x00004A6F, 0x00006243,\n    0x00000A17, 0x00050080, 0x0000000C, 0x00002B2C, 0x00001F03, 0x00004A6F,\n    0x0004007C, 0x0000000C, 0x00004202, 0x000020FC, 0x00050084, 0x0000000C,\n    0x00003A60, 0x00002B2C, 0x00004202, 0x00050051, 0x0000000C, 0x00006244,\n    0x00004E9D, 0x00000000, 0x000500C3, 0x0000000C, 0x00004FC8, 0x00006244,\n    0x00000A1A, 0x00050080, 0x0000000C, 0x000049FC, 0x00003A60, 0x00004FC8,\n    0x000500C4, 0x0000000C, 0x0000225D, 0x000049FC, 0x00000A20, 0x000500C7,\n    0x0000000C, 0x00002CAA, 0x00002BF7, 0x00000A14, 0x000500C4, 0x0000000C,\n    0x00004CAE, 0x00002CAA, 0x00000A1A, 0x000500C3, 0x0000000C, 0x0000383E,\n    0x00006243, 0x00000A0E, 0x000500C7, 0x0000000C, 0x00005374, 0x0000383E,\n    0x00000A14, 0x000500C4, 0x0000000C, 0x000054CA, 0x00005374, 0x00000A14,\n    0x000500C5, 0x0000000C, 0x000042CE, 0x00004CAE, 0x000054CA, 0x000500C7,\n    0x0000000C, 0x000050D5, 0x00006244, 0x00000A20, 0x000500C5, 0x0000000C,\n    0x00003ADD, 0x000042CE, 0x000050D5, 0x000500C5, 0x0000000C, 0x000043B7,\n    0x0000225D, 0x00003ADD, 0x000500C4, 0x0000000C, 0x00005E50, 0x000043B7,\n    0x00000A10, 0x000500C3, 0x0000000C, 0x000032D7, 0x00006243, 0x00000A14,\n    0x000500C6, 0x0000000C, 0x000026C9, 0x000032D7, 0x00004DC1, 0x000500C7,\n    0x0000000C, 0x00004199, 0x000026C9, 0x00000A0E, 0x000500C3, 0x0000000C,\n    0x00002590, 0x00006244, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000505F,\n    0x00002590, 0x00000A14, 0x000500C4, 0x0000000C, 0x0000541E, 0x00004199,\n    0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BB, 0x0000505F, 0x0000541E,\n    0x000500C7, 0x0000000C, 0x00005077, 0x00006243, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x00005229, 0x00005077, 0x00000A17, 0x000500C4, 0x0000000C,\n    0x00001998, 0x000022BB, 0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FF,\n    0x00005229, 0x00001998, 0x000500C4, 0x0000000C, 0x00001C01, 0x00004199,\n    0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C82, 0x000047FF, 0x00001C01,\n    0x000500C7, 0x0000000C, 0x000050B0, 0x00005E50, 0x00000A38, 0x000500C5,\n    0x0000000C, 0x00003C72, 0x00003C82, 0x000050B0, 0x000500C3, 0x0000000C,\n    0x00003746, 0x00005E50, 0x00000A17, 0x000500C7, 0x0000000C, 0x000018BA,\n    0x00003746, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005481, 0x000018BA,\n    0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A9, 0x00003C72, 0x00005481,\n    0x000500C3, 0x0000000C, 0x00003A6F, 0x00005E50, 0x00000A1A, 0x000500C7,\n    0x0000000C, 0x000018BB, 0x00003A6F, 0x00000A20, 0x000500C4, 0x0000000C,\n    0x00005482, 0x000018BB, 0x00000A23, 0x000500C5, 0x0000000C, 0x00004570,\n    0x000045A9, 0x00005482, 0x000500C3, 0x0000000C, 0x00003C89, 0x00005E50,\n    0x00000A23, 0x000500C4, 0x0000000C, 0x00002825, 0x00003C89, 0x00000A2F,\n    0x000500C5, 0x0000000C, 0x00003B7A, 0x00004570, 0x00002825, 0x0004007C,\n    0x0000000B, 0x000041E6, 0x00003B7A, 0x000200F9, 0x000052F5, 0x000200F8,\n    0x000052F5, 0x000700F5, 0x0000000B, 0x00002C70, 0x000041E6, 0x0000294E,\n    0x000041E5, 0x0000537D, 0x00050080, 0x0000000B, 0x00005088, 0x00002C70,\n    0x00005EAD, 0x000500C2, 0x0000000B, 0x000048F3, 0x00005088, 0x00000A17,\n    0x000500AA, 0x00000009, 0x00002EEA, 0x00004ADC, 0x00000A0D, 0x000500AA,\n    0x00000009, 0x00005776, 0x00004ADC, 0x00000A10, 0x000500A6, 0x00000009,\n    0x00005686, 0x00002EEA, 0x00005776, 0x000300F7, 0x00003463, 0x00000000,\n    0x000400FA, 0x00005686, 0x00002957, 0x00003463, 0x000200F8, 0x00002957,\n    0x000500C7, 0x00000017, 0x0000475F, 0x000055F9, 0x000009CE, 0x000500C4,\n    0x00000017, 0x000024D1, 0x0000475F, 0x0000013D, 0x000500C7, 0x00000017,\n    0x000050AC, 0x000055F9, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448D,\n    0x000050AC, 0x0000013D, 0x000500C5, 0x00000017, 0x00003FF8, 0x000024D1,\n    0x0000448D, 0x000200F9, 0x00003463, 0x000200F8, 0x00003463, 0x000700F5,\n    0x00000017, 0x00005879, 0x000055F9, 0x000052F5, 0x00003FF8, 0x00002957,\n    0x000500AA, 0x00000009, 0x00004CB6, 0x00004ADC, 0x00000A13, 0x000500A6,\n    0x00000009, 0x00003B23, 0x00005776, 0x00004CB6, 0x000300F7, 0x00002C98,\n    0x00000000, 0x000400FA, 0x00003B23, 0x00002B38, 0x00002C98, 0x000200F8,\n    0x00002B38, 0x000500C4, 0x00000017, 0x00005E17, 0x00005879, 0x000002ED,\n    0x000500C2, 0x00000017, 0x00003BE7, 0x00005879, 0x000002ED, 0x000500C5,\n    0x00000017, 0x000029E8, 0x00005E17, 0x00003BE7, 0x000200F9, 0x00002C98,\n    0x000200F8, 0x00002C98, 0x000700F5, 0x00000017, 0x00004D37, 0x00005879,\n    0x00003463, 0x000029E8, 0x00002B38, 0x00060041, 0x00000294, 0x000060F9,\n    0x00001592, 0x00000A0B, 0x000048F3, 0x0003003E, 0x000060F9, 0x00004D37,\n    0x00050080, 0x0000000B, 0x00002DCE, 0x00005088, 0x00000A6A, 0x000500C2,\n    0x0000000B, 0x000041F1, 0x00002DCE, 0x00000A17, 0x000300F7, 0x00003A1A,\n    0x00000000, 0x000400FA, 0x00005686, 0x00002958, 0x00003A1A, 0x000200F8,\n    0x00002958, 0x000500C7, 0x00000017, 0x00004760, 0x000022F8, 0x000009CE,\n    0x000500C4, 0x00000017, 0x000024D2, 0x00004760, 0x0000013D, 0x000500C7,\n    0x00000017, 0x000050AD, 0x000022F8, 0x0000072E, 0x000500C2, 0x00000017,\n    0x0000448E, 0x000050AD, 0x0000013D, 0x000500C5, 0x00000017, 0x00003FF9,\n    0x000024D2, 0x0000448E, 0x000200F9, 0x00003A1A, 0x000200F8, 0x00003A1A,\n    0x000700F5, 0x00000017, 0x00002AAD, 0x000022F8, 0x00002C98, 0x00003FF9,\n    0x00002958, 0x000300F7, 0x00002C99, 0x00000000, 0x000400FA, 0x00003B23,\n    0x00002B39, 0x00002C99, 0x000200F8, 0x00002B39, 0x000500C4, 0x00000017,\n    0x00005E18, 0x00002AAD, 0x000002ED, 0x000500C2, 0x00000017, 0x00003BE8,\n    0x00002AAD, 0x000002ED, 0x000500C5, 0x00000017, 0x000029E9, 0x00005E18,\n    0x00003BE8, 0x000200F9, 0x00002C99, 0x000200F8, 0x00002C99, 0x000700F5,\n    0x00000017, 0x00004D38, 0x00002AAD, 0x00003A1A, 0x000029E9, 0x00002B39,\n    0x00060041, 0x00000294, 0x00001F75, 0x00001592, 0x00000A0B, 0x000041F1,\n    0x0003003E, 0x00001F75, 0x00004D38, 0x000200F9, 0x00004C7A, 0x000200F8,\n    0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/resolve_fast_32bpp_1x2xmsaa_scaled_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25204\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 8 8 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_resolve_edram_info\"\n               OpMemberName %push_const_block_xe 1 \"xe_resolve_coordinate_info\"\n               OpMemberName %push_const_block_xe 2 \"xe_resolve_dest_info\"\n               OpMemberName %push_const_block_xe 3 \"xe_resolve_dest_coordinate_info\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_resolve_edram_xe_block \"xe_resolve_edram_xe_block\"\n               OpMemberName %xe_resolve_edram_xe_block 0 \"data\"\n               OpName %xe_resolve_edram \"xe_resolve_edram\"\n               OpName %xe_resolve_dest_xe_block \"xe_resolve_dest_xe_block\"\n               OpMemberName %xe_resolve_dest_xe_block 0 \"data\"\n               OpName %xe_resolve_dest \"xe_resolve_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_resolve_edram_xe_block BufferBlock\n               OpMemberDecorate %xe_resolve_edram_xe_block 0 NonWritable\n               OpMemberDecorate %xe_resolve_edram_xe_block 0 Offset 0\n               OpDecorate %xe_resolve_edram NonWritable\n               OpDecorate %xe_resolve_edram Binding 0\n               OpDecorate %xe_resolve_edram DescriptorSet 0\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_resolve_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_resolve_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_resolve_dest_xe_block 0 Offset 0\n               OpDecorate %xe_resolve_dest NonReadable\n               OpDecorate %xe_resolve_dest Binding 0\n               OpDecorate %xe_resolve_dest DescriptorSet 1\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n     %v4uint = OpTypeVector %uint 4\n       %bool = OpTypeBool\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n     %uint_1 = OpConstant %uint 1\n     %uint_2 = OpConstant %uint 2\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n     %uint_3 = OpConstant %uint 3\n    %uint_16 = OpConstant %uint 16\n       %1837 = OpConstantComposite %v2uint %uint_2 %uint_1\n     %v2bool = OpTypeVector %bool 2\n     %uint_0 = OpConstant %uint 0\n       %1807 = OpConstantComposite %v2uint %uint_0 %uint_0\n       %1828 = OpConstantComposite %v2uint %uint_1 %uint_1\n       %1816 = OpConstantComposite %v2uint %uint_1 %uint_0\n    %uint_80 = OpConstant %uint 80\n       %2719 = OpConstantComposite %v2uint %uint_80 %uint_16\n  %uint_2048 = OpConstant %uint 2048\n      %int_2 = OpConstant %int 2\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n      %int_3 = OpConstant %int 3\n     %uint_5 = OpConstant %uint 5\n     %uint_4 = OpConstant %uint 4\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n  %uint_1023 = OpConstant %uint 1023\n    %uint_10 = OpConstant %uint 10\n  %uint_4096 = OpConstant %uint 4096\n    %uint_13 = OpConstant %uint 13\n  %uint_2047 = OpConstant %uint 2047\n    %uint_24 = OpConstant %uint 24\n    %uint_15 = OpConstant %uint 15\n    %uint_28 = OpConstant %uint 28\n    %uint_19 = OpConstant %uint 19\n       %2179 = OpConstantComposite %v2uint %uint_16 %uint_19\n     %uint_7 = OpConstant %uint 7\n%uint_536870912 = OpConstant %uint 536870912\n       %1855 = OpConstantComposite %v2uint %uint_0 %uint_4\n       %1856 = OpConstantComposite %v2uint %uint_4 %uint_1\n%uint_16777216 = OpConstant %uint 16777216\n    %uint_20 = OpConstant %uint 20\n       %2275 = OpConstantComposite %v2uint %uint_20 %uint_24\n     %v3uint = OpTypeVector %uint 3\n   %uint_255 = OpConstant %uint 255\n%uint_3222273024 = OpConstant %uint 3222273024\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n%_ptr_Input_uint = OpTypePointer Input %uint\n       %1834 = OpConstantComposite %v2uint %uint_3 %uint_0\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_resolve_edram_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_resolve_edram_xe_block = OpTypePointer Uniform %xe_resolve_edram_xe_block\n%xe_resolve_edram = OpVariable %_ptr_Uniform_xe_resolve_edram_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_resolve_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_resolve_dest_xe_block = OpTypePointer Uniform %xe_resolve_dest_xe_block\n%xe_resolve_dest = OpVariable %_ptr_Uniform_xe_resolve_dest_xe_block Uniform\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_8 %uint_8 %uint_1\n       %1954 = OpConstantComposite %v2uint %uint_7 %uint_7\n       %1955 = OpConstantComposite %v2uint %uint_15 %uint_1\n       %1870 = OpConstantComposite %v2uint %uint_3 %uint_3\n       %2122 = OpConstantComposite %v2uint %uint_15 %uint_15\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n       %1611 = OpConstantComposite %v4uint %uint_255 %uint_255 %uint_255 %uint_255\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n       %2352 = OpConstantComposite %v4uint %uint_3222273024 %uint_3222273024 %uint_3222273024 %uint_3222273024\n        %929 = OpConstantComposite %v4uint %uint_1023 %uint_1023 %uint_1023 %uint_1023\n        %965 = OpConstantComposite %v4uint %uint_20 %uint_20 %uint_20 %uint_20\n     %uint_6 = OpConstant %uint 6\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %22245 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %15627 = OpLoad %uint %22245\n      %22700 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %20824 = OpLoad %uint %22700\n      %20561 = OpBitwiseAnd %uint %15627 %uint_1023\n      %20073 = OpShiftRightLogical %uint %15627 %uint_10\n       %7177 = OpBitwiseAnd %uint %20073 %uint_3\n      %23023 = OpBitwiseAnd %uint %15627 %uint_4096\n      %20495 = OpINotEqual %bool %23023 %uint_0\n      %10307 = OpShiftRightLogical %uint %15627 %uint_13\n      %24434 = OpBitwiseAnd %uint %10307 %uint_2047\n      %18836 = OpShiftRightLogical %uint %15627 %uint_24\n       %9130 = OpBitwiseAnd %uint %18836 %uint_15\n       %8871 = OpCompositeConstruct %v2uint %20824 %20824\n       %9633 = OpShiftRightLogical %v2uint %8871 %2179\n      %23601 = OpBitwiseAnd %v2uint %9633 %1954\n      %24030 = OpBitwiseAnd %uint %15627 %uint_536870912\n      %12295 = OpINotEqual %bool %24030 %uint_0\n               OpSelectionMerge %14676 None\n               OpBranchConditional %12295 %16739 %21992\n      %21992 = OpLabel\n               OpBranch %14676\n      %16739 = OpLabel\n      %15278 = OpShiftRightLogical %v2uint %23601 %1828\n               OpBranch %14676\n      %14676 = OpLabel\n      %19124 = OpPhi %v2uint %15278 %16739 %1807 %21992\n       %7038 = OpShiftRightLogical %v2uint %8871 %1855\n      %11769 = OpBitwiseAnd %v2uint %7038 %1955\n      %16207 = OpShiftLeftLogical %v2uint %11769 %1870\n      %23019 = OpIMul %v2uint %16207 %23601\n      %13123 = OpShiftRightLogical %uint %20824 %uint_5\n      %14785 = OpBitwiseAnd %uint %13123 %uint_2047\n       %8858 = OpCompositeExtract %uint %23601 0\n      %22993 = OpIMul %uint %14785 %8858\n      %20036 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %18628 = OpLoad %uint %20036\n      %22701 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %20919 = OpLoad %uint %22701\n      %19164 = OpBitwiseAnd %uint %18628 %uint_7\n      %21999 = OpBitwiseAnd %uint %18628 %uint_8\n      %20496 = OpINotEqual %bool %21999 %uint_0\n      %10402 = OpShiftRightLogical %uint %18628 %uint_4\n      %23037 = OpBitwiseAnd %uint %10402 %uint_7\n      %23118 = OpBitwiseAnd %uint %18628 %uint_16777216\n      %19535 = OpINotEqual %bool %23118 %uint_0\n       %8444 = OpBitwiseAnd %uint %20919 %uint_1023\n      %12176 = OpShiftRightLogical %uint %20919 %uint_10\n      %25038 = OpBitwiseAnd %uint %12176 %uint_1023\n      %25203 = OpShiftLeftLogical %uint %25038 %int_1\n      %10422 = OpCompositeConstruct %v2uint %20919 %20919\n      %10385 = OpShiftRightLogical %v2uint %10422 %2275\n      %23379 = OpBitwiseAnd %v2uint %10385 %2122\n      %16208 = OpShiftLeftLogical %v2uint %23379 %1870\n      %23020 = OpIMul %v2uint %16208 %23601\n      %12819 = OpShiftRightLogical %uint %20919 %uint_28\n      %16204 = OpBitwiseAnd %uint %12819 %uint_7\n      %20803 = OpAccessChain %_ptr_Input_uint %gl_GlobalInvocationID %uint_0\n       %8913 = OpLoad %uint %20803\n       %7405 = OpUGreaterThanEqual %bool %8913 %22993\n               OpSelectionMerge %17447 DontFlatten\n               OpBranchConditional %7405 %21993 %17447\n      %21993 = OpLabel\n               OpBranch %19578\n      %17447 = OpLabel\n      %14637 = OpLoad %v3uint %gl_GlobalInvocationID\n      %18505 = OpVectorShuffle %v2uint %14637 %14637 0 1\n       %9840 = OpShiftLeftLogical %v2uint %18505 %1834\n       %6697 = OpCompositeExtract %uint %9840 0\n      %18425 = OpCompositeExtract %uint %9840 1\n      %14186 = OpCompositeExtract %uint %19124 1\n      %24446 = OpExtInst %uint %1 UMax %18425 %14186\n      %20975 = OpCompositeConstruct %v2uint %6697 %24446\n      %21036 = OpIAdd %v2uint %20975 %23019\n      %16075 = OpULessThanEqual %bool %16204 %uint_3\n               OpSelectionMerge %23776 None\n               OpBranchConditional %16075 %10990 %15087\n      %15087 = OpLabel\n      %13566 = OpIEqual %bool %16204 %uint_5\n       %8438 = OpSelect %uint %13566 %uint_2 %uint_0\n               OpBranch %23776\n      %10990 = OpLabel\n               OpBranch %23776\n      %23776 = OpLabel\n      %19300 = OpPhi %uint %16204 %10990 %8438 %15087\n      %16830 = OpCompositeConstruct %v2uint %7177 %7177\n      %11801 = OpUGreaterThanEqual %v2bool %16830 %1837\n      %19381 = OpSelect %v2uint %11801 %1828 %1807\n      %10986 = OpShiftLeftLogical %v2uint %21036 %19381\n      %24669 = OpCompositeConstruct %v2uint %19300 %19300\n       %9093 = OpShiftRightLogical %v2uint %24669 %1816\n      %16072 = OpBitwiseAnd %v2uint %9093 %1828\n      %19132 = OpIAdd %v2uint %10986 %16072\n      %11447 = OpIMul %v2uint %2719 %23601\n       %7983 = OpUDiv %v2uint %19132 %11447\n       %9129 = OpCompositeExtract %uint %7983 1\n      %11046 = OpIMul %uint %9129 %20561\n      %24665 = OpCompositeExtract %uint %7983 0\n      %21536 = OpIAdd %uint %11046 %24665\n       %8742 = OpIAdd %uint %24434 %21536\n       %6459 = OpIMul %v2uint %7983 %11447\n      %14279 = OpISub %v2uint %19132 %6459\n               OpSelectionMerge %18756 None\n               OpBranchConditional %20495 %11888 %18756\n      %11888 = OpLabel\n      %16985 = OpCompositeExtract %uint %11447 0\n      %13307 = OpShiftRightLogical %uint %16985 %uint_1\n      %22207 = OpCompositeExtract %uint %14279 0\n      %15197 = OpBitcast %int %22207\n      %15736 = OpUGreaterThanEqual %bool %22207 %13307\n               OpSelectionMerge %22850 None\n               OpBranchConditional %15736 %23061 %24565\n      %24565 = OpLabel\n      %20693 = OpBitcast %int %13307\n               OpBranch %22850\n      %23061 = OpLabel\n      %18885 = OpBitcast %int %13307\n      %17199 = OpSNegate %int %18885\n               OpBranch %22850\n      %22850 = OpLabel\n      %10046 = OpPhi %int %17199 %23061 %20693 %24565\n      %11983 = OpIAdd %int %15197 %10046\n      %17709 = OpBitcast %uint %11983\n      %21574 = OpCompositeInsert %v2uint %17709 %14279 0\n               OpBranch %18756\n      %18756 = OpLabel\n      %17360 = OpPhi %v2uint %14279 %23776 %21574 %22850\n      %24023 = OpCompositeExtract %uint %11447 0\n      %22303 = OpCompositeExtract %uint %11447 1\n      %13170 = OpIMul %uint %24023 %22303\n      %15520 = OpIMul %uint %8742 %13170\n      %16084 = OpCompositeExtract %uint %17360 1\n      %15890 = OpIMul %uint %16084 %24023\n      %24666 = OpCompositeExtract %uint %17360 0\n      %21537 = OpIAdd %uint %15890 %24666\n       %8875 = OpIAdd %uint %15520 %21537\n      %23350 = OpIMul %uint %13170 %uint_2048\n      %21900 = OpUMod %uint %8875 %23350\n      %21321 = OpShiftLeftLogical %uint %21900 %int_2\n      %19333 = OpShiftRightLogical %uint %21321 %int_4\n      %10173 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_edram %int_0 %19333\n      %15060 = OpLoad %v4uint %10173\n       %8517 = OpIAdd %uint %21321 %uint_16\n      %21670 = OpShiftRightLogical %uint %8517 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_edram %int_0 %21670\n       %8801 = OpLoad %v4uint %20399\n      %21106 = OpIEqual %bool %6697 %uint_0\n               OpSelectionMerge %13276 None\n               OpBranchConditional %21106 %11451 %13276\n      %11451 = OpLabel\n      %24156 = OpCompositeExtract %uint %19124 0\n      %22470 = OpINotEqual %bool %24156 %uint_0\n               OpBranch %13276\n      %13276 = OpLabel\n      %10924 = OpPhi %bool %21106 %18756 %22470 %11451\n               OpSelectionMerge %21910 DontFlatten\n               OpBranchConditional %10924 %11508 %21910\n      %11508 = OpLabel\n      %23599 = OpCompositeExtract %uint %19124 0\n      %17346 = OpUGreaterThanEqual %bool %23599 %uint_2\n               OpSelectionMerge %18758 None\n               OpBranchConditional %17346 %15877 %18758\n      %15877 = OpLabel\n      %24532 = OpUGreaterThanEqual %bool %23599 %uint_3\n               OpSelectionMerge %18757 None\n               OpBranchConditional %24532 %9760 %18757\n       %9760 = OpLabel\n      %20482 = OpCompositeExtract %uint %15060 3\n      %14335 = OpCompositeInsert %v4uint %20482 %15060 2\n               OpBranch %18757\n      %18757 = OpLabel\n      %17379 = OpPhi %v4uint %15060 %15877 %14335 %9760\n       %7002 = OpCompositeExtract %uint %17379 2\n      %15144 = OpCompositeInsert %v4uint %7002 %17379 1\n               OpBranch %18758\n      %18758 = OpLabel\n      %17380 = OpPhi %v4uint %15060 %11508 %15144 %18757\n       %7003 = OpCompositeExtract %uint %17380 1\n      %15145 = OpCompositeInsert %v4uint %7003 %17380 0\n               OpBranch %21910\n      %21910 = OpLabel\n      %10925 = OpPhi %v4uint %15060 %13276 %15145 %18758\n               OpSelectionMerge %21263 DontFlatten\n               OpBranchConditional %19535 %22395 %21263\n      %22395 = OpLabel\n               OpSelectionMerge %14836 None\n               OpSwitch %9130 %14836 0 %21920 1 %21920 2 %10391 3 %10391 10 %10391 12 %10391\n      %10391 = OpLabel\n      %15273 = OpBitwiseAnd %v4uint %10925 %2352\n      %23564 = OpBitwiseAnd %v4uint %10925 %929\n      %24837 = OpShiftLeftLogical %v4uint %23564 %965\n      %18005 = OpBitwiseOr %v4uint %15273 %24837\n      %23170 = OpShiftRightLogical %v4uint %10925 %965\n       %6442 = OpBitwiseAnd %v4uint %23170 %929\n      %15589 = OpBitwiseOr %v4uint %18005 %6442\n      %19519 = OpBitwiseAnd %v4uint %8801 %2352\n      %17946 = OpBitwiseAnd %v4uint %8801 %929\n      %24838 = OpShiftLeftLogical %v4uint %17946 %965\n      %18006 = OpBitwiseOr %v4uint %19519 %24838\n      %23171 = OpShiftRightLogical %v4uint %8801 %965\n       %7392 = OpBitwiseAnd %v4uint %23171 %929\n       %7870 = OpBitwiseOr %v4uint %18006 %7392\n               OpBranch %14836\n      %21920 = OpLabel\n      %20117 = OpBitwiseAnd %v4uint %10925 %1838\n      %23565 = OpBitwiseAnd %v4uint %10925 %1611\n      %24839 = OpShiftLeftLogical %v4uint %23565 %749\n      %18007 = OpBitwiseOr %v4uint %20117 %24839\n      %23172 = OpShiftRightLogical %v4uint %10925 %749\n       %6443 = OpBitwiseAnd %v4uint %23172 %1611\n      %15590 = OpBitwiseOr %v4uint %18007 %6443\n      %19520 = OpBitwiseAnd %v4uint %8801 %1838\n      %17947 = OpBitwiseAnd %v4uint %8801 %1611\n      %24840 = OpShiftLeftLogical %v4uint %17947 %749\n      %18008 = OpBitwiseOr %v4uint %19520 %24840\n      %23173 = OpShiftRightLogical %v4uint %8801 %749\n       %7393 = OpBitwiseAnd %v4uint %23173 %1611\n       %7871 = OpBitwiseOr %v4uint %18008 %7393\n               OpBranch %14836\n      %14836 = OpLabel\n      %11251 = OpPhi %v4uint %8801 %22395 %7871 %21920 %7870 %10391\n      %13709 = OpPhi %v4uint %10925 %22395 %15590 %21920 %15589 %10391\n               OpBranch %21263\n      %21263 = OpLabel\n       %8952 = OpPhi %v4uint %8801 %21910 %11251 %14836\n      %21002 = OpPhi %v4uint %10925 %21910 %13709 %14836\n      %14284 = OpIAdd %v2uint %9840 %23020\n      %24181 = OpShiftRightLogical %v2uint %14284 %1856\n       %7712 = OpUDiv %v2uint %24181 %23601\n      %18183 = OpIMul %v2uint %23601 %7712\n      %18273 = OpISub %v2uint %24181 %18183\n      %11232 = OpShiftLeftLogical %v2uint %7712 %1856\n      %13284 = OpCompositeExtract %uint %18273 0\n      %10872 = OpCompositeExtract %uint %23601 1\n      %22886 = OpIMul %uint %13284 %10872\n       %6943 = OpCompositeExtract %uint %18273 1\n      %10469 = OpIAdd %uint %22886 %6943\n      %18851 = OpBitwiseAnd %v2uint %14284 %1955\n      %10581 = OpShiftLeftLogical %uint %10469 %uint_7\n      %20916 = OpCompositeExtract %uint %18851 1\n      %23596 = OpShiftLeftLogical %uint %20916 %uint_6\n      %19814 = OpBitwiseOr %uint %10581 %23596\n      %21476 = OpCompositeExtract %uint %18851 0\n      %11714 = OpShiftLeftLogical %uint %21476 %uint_2\n      %11193 = OpBitwiseOr %uint %19814 %11714\n               OpSelectionMerge %21313 DontFlatten\n               OpBranchConditional %20496 %10574 %21373\n      %21373 = OpLabel\n      %10608 = OpBitcast %v2int %11232\n      %17907 = OpCompositeExtract %int %10608 1\n      %19904 = OpShiftRightArithmetic %int %17907 %int_5\n      %22400 = OpBitcast %int %8444\n       %7938 = OpIMul %int %19904 %22400\n      %25154 = OpCompositeExtract %int %10608 0\n      %20423 = OpShiftRightArithmetic %int %25154 %int_5\n      %18864 = OpIAdd %int %7938 %20423\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %17907 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25154 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17334 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17334 %uint_2\n      %12766 = OpShiftRightArithmetic %int %17907 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25154 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %17907 %int_3\n      %20574 = OpBitwiseAnd %int %10425 %int_1\n      %21533 = OpShiftLeftLogical %int %20574 %int_1\n       %8890 = OpBitwiseXor %int %20766 %21533\n      %20598 = OpBitwiseAnd %int %17907 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6551\n       %7168 = OpShiftLeftLogical %int %21575 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24163 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24163 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24163 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24163 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %21313\n      %10574 = OpLabel\n      %19866 = OpCompositeExtract %uint %11232 0\n      %11267 = OpCompositeExtract %uint %11232 1\n       %8414 = OpCompositeConstruct %v3uint %19866 %11267 %23037\n      %20125 = OpBitcast %v3int %8414\n      %11255 = OpCompositeExtract %int %20125 2\n      %19905 = OpShiftRightArithmetic %int %11255 %int_2\n      %22401 = OpBitcast %int %25203\n       %7939 = OpIMul %int %19905 %22401\n      %25155 = OpCompositeExtract %int %20125 1\n      %19055 = OpShiftRightArithmetic %int %25155 %int_4\n      %11052 = OpIAdd %int %7939 %19055\n      %16898 = OpBitcast %int %8444\n      %14944 = OpIMul %int %11052 %16898\n      %25156 = OpCompositeExtract %int %20125 0\n      %20424 = OpShiftRightArithmetic %int %25156 %int_5\n      %18940 = OpIAdd %int %14944 %20424\n       %8797 = OpShiftLeftLogical %int %18940 %int_7\n      %11434 = OpBitwiseAnd %int %11255 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %25155 %int_1\n      %21364 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21364 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20694 = OpBitwiseAnd %int %25156 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20694\n      %17335 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17335 %uint_2\n      %13015 = OpShiftRightArithmetic %int %25155 %int_3\n       %9929 = OpBitwiseXor %int %13015 %19905\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %25156 %int_3\n      %20575 = OpBitwiseAnd %int %9616 %int_3\n      %21534 = OpShiftLeftLogical %int %16793 %int_1\n       %8891 = OpBitwiseXor %int %20575 %21534\n      %20599 = OpBitwiseAnd %int %25155 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6552\n       %7169 = OpShiftLeftLogical %int %16793 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24144 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24144 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24144 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24144 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %21313\n      %21313 = OpLabel\n       %9506 = OpPhi %uint %16870 %10574 %16869 %21373\n      %16843 = OpIMul %uint %8858 %10872\n      %11993 = OpIMul %uint %9506 %16843\n      %16012 = OpIAdd %uint %11993 %11193\n      %20867 = OpShiftRightLogical %uint %16012 %int_4\n      %12010 = OpIEqual %bool %19164 %uint_1\n      %22390 = OpIEqual %bool %19164 %uint_2\n      %22150 = OpLogicalOr %bool %12010 %22390\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %21002 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %21002 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22649 = OpPhi %v4uint %21002 %21313 %16376 %10583\n      %19638 = OpIEqual %bool %19164 %uint_3\n      %15139 = OpLogicalOr %bool %22390 %19638\n               OpSelectionMerge %11416 None\n               OpBranchConditional %15139 %11064 %11416\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22649 %749\n      %15335 = OpShiftRightLogical %v4uint %22649 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %11416\n      %11416 = OpLabel\n      %19767 = OpPhi %v4uint %22649 %13411 %10728 %11064\n      %24825 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_dest %int_0 %20867\n               OpStore %24825 %19767\n      %11726 = OpIAdd %uint %16012 %uint_16\n      %16881 = OpShiftRightLogical %uint %11726 %int_4\n               OpSelectionMerge %14874 None\n               OpBranchConditional %22150 %10584 %14874\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %8952 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %8952 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %14874\n      %14874 = OpLabel\n      %10926 = OpPhi %v4uint %8952 %11416 %16377 %10584\n               OpSelectionMerge %11417 None\n               OpBranchConditional %15139 %11065 %11417\n      %11065 = OpLabel\n      %24088 = OpShiftLeftLogical %v4uint %10926 %749\n      %15336 = OpShiftRightLogical %v4uint %10926 %749\n      %10729 = OpBitwiseOr %v4uint %24088 %15336\n               OpBranch %11417\n      %11417 = OpLabel\n      %19768 = OpPhi %v4uint %10926 %14874 %10729 %11065\n       %8053 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_dest %int_0 %16881\n               OpStore %8053 %19768\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t resolve_fast_32bpp_1x2xmsaa_scaled_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006274, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000008, 0x00000008, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x000003F9, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x00090006, 0x000003F9, 0x00000000, 0x725F6578,\n    0x6C6F7365, 0x655F6576, 0x6D617264, 0x666E695F, 0x0000006F, 0x000A0006,\n    0x000003F9, 0x00000001, 0x725F6578, 0x6C6F7365, 0x635F6576, 0x64726F6F,\n    0x74616E69, 0x6E695F65, 0x00006F66, 0x00090006, 0x000003F9, 0x00000002,\n    0x725F6578, 0x6C6F7365, 0x645F6576, 0x5F747365, 0x6F666E69, 0x00000000,\n    0x000B0006, 0x000003F9, 0x00000003, 0x725F6578, 0x6C6F7365, 0x645F6576,\n    0x5F747365, 0x726F6F63, 0x616E6964, 0x695F6574, 0x006F666E, 0x00060005,\n    0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578, 0x00080005,\n    0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F, 0x496E6F69,\n    0x00000044, 0x00090005, 0x000007B4, 0x725F6578, 0x6C6F7365, 0x655F6576,\n    0x6D617264, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006, 0x000007B4,\n    0x00000000, 0x61746164, 0x00000000, 0x00070005, 0x00000CC7, 0x725F6578,\n    0x6C6F7365, 0x655F6576, 0x6D617264, 0x00000000, 0x00090005, 0x000007B5,\n    0x725F6578, 0x6C6F7365, 0x645F6576, 0x5F747365, 0x625F6578, 0x6B636F6C,\n    0x00000000, 0x00050006, 0x000007B5, 0x00000000, 0x61746164, 0x00000000,\n    0x00060005, 0x00001592, 0x725F6578, 0x6C6F7365, 0x645F6576, 0x00747365,\n    0x00030047, 0x000003F9, 0x00000002, 0x00050048, 0x000003F9, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x000003F9, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x000003F9, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x000003F9, 0x00000003, 0x00000023, 0x0000000C, 0x00040047,\n    0x00000F48, 0x0000000B, 0x0000001C, 0x00040047, 0x000007DC, 0x00000006,\n    0x00000010, 0x00030047, 0x000007B4, 0x00000003, 0x00040048, 0x000007B4,\n    0x00000000, 0x00000018, 0x00050048, 0x000007B4, 0x00000000, 0x00000023,\n    0x00000000, 0x00030047, 0x00000CC7, 0x00000018, 0x00040047, 0x00000CC7,\n    0x00000021, 0x00000000, 0x00040047, 0x00000CC7, 0x00000022, 0x00000000,\n    0x00040047, 0x000007DD, 0x00000006, 0x00000010, 0x00030047, 0x000007B5,\n    0x00000003, 0x00040048, 0x000007B5, 0x00000000, 0x00000019, 0x00050048,\n    0x000007B5, 0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x00001592,\n    0x00000019, 0x00040047, 0x00001592, 0x00000021, 0x00000000, 0x00040047,\n    0x00001592, 0x00000022, 0x00000001, 0x00040047, 0x00000AC7, 0x0000000B,\n    0x00000019, 0x00020013, 0x00000008, 0x00030021, 0x00000502, 0x00000008,\n    0x00040015, 0x0000000B, 0x00000020, 0x00000000, 0x00040017, 0x00000011,\n    0x0000000B, 0x00000002, 0x00040017, 0x00000017, 0x0000000B, 0x00000004,\n    0x00020014, 0x00000009, 0x00040015, 0x0000000C, 0x00000020, 0x00000001,\n    0x00040017, 0x00000012, 0x0000000C, 0x00000002, 0x00040017, 0x00000016,\n    0x0000000C, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001,\n    0x0004002B, 0x0000000B, 0x00000A10, 0x00000002, 0x0004002B, 0x0000000B,\n    0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B, 0x00000A22, 0x00000008,\n    0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00, 0x0004002B, 0x0000000B,\n    0x00000A13, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A3A, 0x00000010,\n    0x0005002C, 0x00000011, 0x0000072D, 0x00000A10, 0x00000A0D, 0x00040017,\n    0x0000000F, 0x00000009, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A0A,\n    0x00000000, 0x0005002C, 0x00000011, 0x0000070F, 0x00000A0A, 0x00000A0A,\n    0x0005002C, 0x00000011, 0x00000724, 0x00000A0D, 0x00000A0D, 0x0005002C,\n    0x00000011, 0x00000718, 0x00000A0D, 0x00000A0A, 0x0004002B, 0x0000000B,\n    0x00000AFA, 0x00000050, 0x0005002C, 0x00000011, 0x00000A9F, 0x00000AFA,\n    0x00000A3A, 0x0004002B, 0x0000000B, 0x00000A84, 0x00000800, 0x0004002B,\n    0x0000000C, 0x00000A11, 0x00000002, 0x0004002B, 0x0000000C, 0x00000A17,\n    0x00000004, 0x0004002B, 0x0000000C, 0x00000A1D, 0x00000006, 0x0004002B,\n    0x0000000C, 0x00000A2C, 0x0000000B, 0x0004002B, 0x0000000C, 0x00000A38,\n    0x0000000F, 0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001, 0x0004002B,\n    0x0000000C, 0x00000A1A, 0x00000005, 0x0004002B, 0x0000000C, 0x00000A20,\n    0x00000007, 0x0004002B, 0x0000000C, 0x00000A23, 0x00000008, 0x0004002B,\n    0x0000000C, 0x00000A2F, 0x0000000C, 0x0004002B, 0x0000000C, 0x00000A14,\n    0x00000003, 0x0004002B, 0x0000000B, 0x00000A19, 0x00000005, 0x0004002B,\n    0x0000000B, 0x00000A16, 0x00000004, 0x0004002B, 0x0000000C, 0x00000A0B,\n    0x00000000, 0x0006001E, 0x000003F9, 0x0000000B, 0x0000000B, 0x0000000B,\n    0x0000000B, 0x00040020, 0x00000676, 0x00000009, 0x000003F9, 0x0004003B,\n    0x00000676, 0x00000CE9, 0x00000009, 0x00040020, 0x00000288, 0x00000009,\n    0x0000000B, 0x0004002B, 0x0000000B, 0x00000A44, 0x000003FF, 0x0004002B,\n    0x0000000B, 0x00000A28, 0x0000000A, 0x0004002B, 0x0000000B, 0x00000AFE,\n    0x00001000, 0x0004002B, 0x0000000B, 0x00000A31, 0x0000000D, 0x0004002B,\n    0x0000000B, 0x00000A81, 0x000007FF, 0x0004002B, 0x0000000B, 0x00000A52,\n    0x00000018, 0x0004002B, 0x0000000B, 0x00000A37, 0x0000000F, 0x0004002B,\n    0x0000000B, 0x00000A5E, 0x0000001C, 0x0004002B, 0x0000000B, 0x00000A43,\n    0x00000013, 0x0005002C, 0x00000011, 0x00000883, 0x00000A3A, 0x00000A43,\n    0x0004002B, 0x0000000B, 0x00000A1F, 0x00000007, 0x0004002B, 0x0000000B,\n    0x00000510, 0x20000000, 0x0005002C, 0x00000011, 0x0000073F, 0x00000A0A,\n    0x00000A16, 0x0005002C, 0x00000011, 0x00000740, 0x00000A16, 0x00000A0D,\n    0x0004002B, 0x0000000B, 0x00000926, 0x01000000, 0x0004002B, 0x0000000B,\n    0x00000A46, 0x00000014, 0x0005002C, 0x00000011, 0x000008E3, 0x00000A46,\n    0x00000A52, 0x00040017, 0x00000014, 0x0000000B, 0x00000003, 0x0004002B,\n    0x0000000B, 0x00000144, 0x000000FF, 0x0004002B, 0x0000000B, 0x00000B54,\n    0xC00FFC00, 0x00040020, 0x00000291, 0x00000001, 0x00000014, 0x0004003B,\n    0x00000291, 0x00000F48, 0x00000001, 0x00040020, 0x00000289, 0x00000001,\n    0x0000000B, 0x0005002C, 0x00000011, 0x0000072A, 0x00000A13, 0x00000A0A,\n    0x0003001D, 0x000007DC, 0x00000017, 0x0003001E, 0x000007B4, 0x000007DC,\n    0x00040020, 0x00000A32, 0x00000002, 0x000007B4, 0x0004003B, 0x00000A32,\n    0x00000CC7, 0x00000002, 0x00040020, 0x00000294, 0x00000002, 0x00000017,\n    0x0003001D, 0x000007DD, 0x00000017, 0x0003001E, 0x000007B5, 0x000007DD,\n    0x00040020, 0x00000A33, 0x00000002, 0x000007B5, 0x0004003B, 0x00000A33,\n    0x00001592, 0x00000002, 0x0006002C, 0x00000014, 0x00000AC7, 0x00000A22,\n    0x00000A22, 0x00000A0D, 0x0005002C, 0x00000011, 0x000007A2, 0x00000A1F,\n    0x00000A1F, 0x0005002C, 0x00000011, 0x000007A3, 0x00000A37, 0x00000A0D,\n    0x0005002C, 0x00000011, 0x0000074E, 0x00000A13, 0x00000A13, 0x0005002C,\n    0x00000011, 0x0000084A, 0x00000A37, 0x00000A37, 0x0007002C, 0x00000017,\n    0x0000072E, 0x000005FD, 0x000005FD, 0x000005FD, 0x000005FD, 0x0007002C,\n    0x00000017, 0x0000064B, 0x00000144, 0x00000144, 0x00000144, 0x00000144,\n    0x0007002C, 0x00000017, 0x000002ED, 0x00000A3A, 0x00000A3A, 0x00000A3A,\n    0x00000A3A, 0x0007002C, 0x00000017, 0x00000930, 0x00000B54, 0x00000B54,\n    0x00000B54, 0x00000B54, 0x0007002C, 0x00000017, 0x000003A1, 0x00000A44,\n    0x00000A44, 0x00000A44, 0x00000A44, 0x0007002C, 0x00000017, 0x000003C5,\n    0x00000A46, 0x00000A46, 0x00000A46, 0x00000A46, 0x0004002B, 0x0000000B,\n    0x00000A1C, 0x00000006, 0x0007002C, 0x00000017, 0x000009CE, 0x000008A6,\n    0x000008A6, 0x000008A6, 0x000008A6, 0x0007002C, 0x00000017, 0x0000013D,\n    0x00000A22, 0x00000A22, 0x00000A22, 0x00000A22, 0x00050036, 0x00000008,\n    0x0000161F, 0x00000000, 0x00000502, 0x000200F8, 0x00003B06, 0x000300F7,\n    0x00004C7A, 0x00000000, 0x000300FB, 0x00000A0A, 0x00002E68, 0x000200F8,\n    0x00002E68, 0x00050041, 0x00000288, 0x000056E5, 0x00000CE9, 0x00000A0B,\n    0x0004003D, 0x0000000B, 0x00003D0B, 0x000056E5, 0x00050041, 0x00000288,\n    0x000058AC, 0x00000CE9, 0x00000A0E, 0x0004003D, 0x0000000B, 0x00005158,\n    0x000058AC, 0x000500C7, 0x0000000B, 0x00005051, 0x00003D0B, 0x00000A44,\n    0x000500C2, 0x0000000B, 0x00004E69, 0x00003D0B, 0x00000A28, 0x000500C7,\n    0x0000000B, 0x00001C09, 0x00004E69, 0x00000A13, 0x000500C7, 0x0000000B,\n    0x000059EF, 0x00003D0B, 0x00000AFE, 0x000500AB, 0x00000009, 0x0000500F,\n    0x000059EF, 0x00000A0A, 0x000500C2, 0x0000000B, 0x00002843, 0x00003D0B,\n    0x00000A31, 0x000500C7, 0x0000000B, 0x00005F72, 0x00002843, 0x00000A81,\n    0x000500C2, 0x0000000B, 0x00004994, 0x00003D0B, 0x00000A52, 0x000500C7,\n    0x0000000B, 0x000023AA, 0x00004994, 0x00000A37, 0x00050050, 0x00000011,\n    0x000022A7, 0x00005158, 0x00005158, 0x000500C2, 0x00000011, 0x000025A1,\n    0x000022A7, 0x00000883, 0x000500C7, 0x00000011, 0x00005C31, 0x000025A1,\n    0x000007A2, 0x000500C7, 0x0000000B, 0x00005DDE, 0x00003D0B, 0x00000510,\n    0x000500AB, 0x00000009, 0x00003007, 0x00005DDE, 0x00000A0A, 0x000300F7,\n    0x00003954, 0x00000000, 0x000400FA, 0x00003007, 0x00004163, 0x000055E8,\n    0x000200F8, 0x000055E8, 0x000200F9, 0x00003954, 0x000200F8, 0x00004163,\n    0x000500C2, 0x00000011, 0x00003BAE, 0x00005C31, 0x00000724, 0x000200F9,\n    0x00003954, 0x000200F8, 0x00003954, 0x000700F5, 0x00000011, 0x00004AB4,\n    0x00003BAE, 0x00004163, 0x0000070F, 0x000055E8, 0x000500C2, 0x00000011,\n    0x00001B7E, 0x000022A7, 0x0000073F, 0x000500C7, 0x00000011, 0x00002DF9,\n    0x00001B7E, 0x000007A3, 0x000500C4, 0x00000011, 0x00003F4F, 0x00002DF9,\n    0x0000074E, 0x00050084, 0x00000011, 0x000059EB, 0x00003F4F, 0x00005C31,\n    0x000500C2, 0x0000000B, 0x00003343, 0x00005158, 0x00000A19, 0x000500C7,\n    0x0000000B, 0x000039C1, 0x00003343, 0x00000A81, 0x00050051, 0x0000000B,\n    0x0000229A, 0x00005C31, 0x00000000, 0x00050084, 0x0000000B, 0x000059D1,\n    0x000039C1, 0x0000229A, 0x00050041, 0x00000288, 0x00004E44, 0x00000CE9,\n    0x00000A11, 0x0004003D, 0x0000000B, 0x000048C4, 0x00004E44, 0x00050041,\n    0x00000288, 0x000058AD, 0x00000CE9, 0x00000A14, 0x0004003D, 0x0000000B,\n    0x000051B7, 0x000058AD, 0x000500C7, 0x0000000B, 0x00004ADC, 0x000048C4,\n    0x00000A1F, 0x000500C7, 0x0000000B, 0x000055EF, 0x000048C4, 0x00000A22,\n    0x000500AB, 0x00000009, 0x00005010, 0x000055EF, 0x00000A0A, 0x000500C2,\n    0x0000000B, 0x000028A2, 0x000048C4, 0x00000A16, 0x000500C7, 0x0000000B,\n    0x000059FD, 0x000028A2, 0x00000A1F, 0x000500C7, 0x0000000B, 0x00005A4E,\n    0x000048C4, 0x00000926, 0x000500AB, 0x00000009, 0x00004C4F, 0x00005A4E,\n    0x00000A0A, 0x000500C7, 0x0000000B, 0x000020FC, 0x000051B7, 0x00000A44,\n    0x000500C2, 0x0000000B, 0x00002F90, 0x000051B7, 0x00000A28, 0x000500C7,\n    0x0000000B, 0x000061CE, 0x00002F90, 0x00000A44, 0x000500C4, 0x0000000B,\n    0x00006273, 0x000061CE, 0x00000A0E, 0x00050050, 0x00000011, 0x000028B6,\n    0x000051B7, 0x000051B7, 0x000500C2, 0x00000011, 0x00002891, 0x000028B6,\n    0x000008E3, 0x000500C7, 0x00000011, 0x00005B53, 0x00002891, 0x0000084A,\n    0x000500C4, 0x00000011, 0x00003F50, 0x00005B53, 0x0000074E, 0x00050084,\n    0x00000011, 0x000059EC, 0x00003F50, 0x00005C31, 0x000500C2, 0x0000000B,\n    0x00003213, 0x000051B7, 0x00000A5E, 0x000500C7, 0x0000000B, 0x00003F4C,\n    0x00003213, 0x00000A1F, 0x00050041, 0x00000289, 0x00005143, 0x00000F48,\n    0x00000A0A, 0x0004003D, 0x0000000B, 0x000022D1, 0x00005143, 0x000500AE,\n    0x00000009, 0x00001CED, 0x000022D1, 0x000059D1, 0x000300F7, 0x00004427,\n    0x00000002, 0x000400FA, 0x00001CED, 0x000055E9, 0x00004427, 0x000200F8,\n    0x000055E9, 0x000200F9, 0x00004C7A, 0x000200F8, 0x00004427, 0x0004003D,\n    0x00000014, 0x0000392D, 0x00000F48, 0x0007004F, 0x00000011, 0x00004849,\n    0x0000392D, 0x0000392D, 0x00000000, 0x00000001, 0x000500C4, 0x00000011,\n    0x00002670, 0x00004849, 0x0000072A, 0x00050051, 0x0000000B, 0x00001A29,\n    0x00002670, 0x00000000, 0x00050051, 0x0000000B, 0x000047F9, 0x00002670,\n    0x00000001, 0x00050051, 0x0000000B, 0x0000376A, 0x00004AB4, 0x00000001,\n    0x0007000C, 0x0000000B, 0x00005F7E, 0x00000001, 0x00000029, 0x000047F9,\n    0x0000376A, 0x00050050, 0x00000011, 0x000051EF, 0x00001A29, 0x00005F7E,\n    0x00050080, 0x00000011, 0x0000522C, 0x000051EF, 0x000059EB, 0x000500B2,\n    0x00000009, 0x00003ECB, 0x00003F4C, 0x00000A13, 0x000300F7, 0x00005CE0,\n    0x00000000, 0x000400FA, 0x00003ECB, 0x00002AEE, 0x00003AEF, 0x000200F8,\n    0x00003AEF, 0x000500AA, 0x00000009, 0x000034FE, 0x00003F4C, 0x00000A19,\n    0x000600A9, 0x0000000B, 0x000020F6, 0x000034FE, 0x00000A10, 0x00000A0A,\n    0x000200F9, 0x00005CE0, 0x000200F8, 0x00002AEE, 0x000200F9, 0x00005CE0,\n    0x000200F8, 0x00005CE0, 0x000700F5, 0x0000000B, 0x00004B64, 0x00003F4C,\n    0x00002AEE, 0x000020F6, 0x00003AEF, 0x00050050, 0x00000011, 0x000041BE,\n    0x00001C09, 0x00001C09, 0x000500AE, 0x0000000F, 0x00002E19, 0x000041BE,\n    0x0000072D, 0x000600A9, 0x00000011, 0x00004BB5, 0x00002E19, 0x00000724,\n    0x0000070F, 0x000500C4, 0x00000011, 0x00002AEA, 0x0000522C, 0x00004BB5,\n    0x00050050, 0x00000011, 0x0000605D, 0x00004B64, 0x00004B64, 0x000500C2,\n    0x00000011, 0x00002385, 0x0000605D, 0x00000718, 0x000500C7, 0x00000011,\n    0x00003EC8, 0x00002385, 0x00000724, 0x00050080, 0x00000011, 0x00004ABC,\n    0x00002AEA, 0x00003EC8, 0x00050084, 0x00000011, 0x00002CB7, 0x00000A9F,\n    0x00005C31, 0x00050086, 0x00000011, 0x00001F2F, 0x00004ABC, 0x00002CB7,\n    0x00050051, 0x0000000B, 0x000023A9, 0x00001F2F, 0x00000001, 0x00050084,\n    0x0000000B, 0x00002B26, 0x000023A9, 0x00005051, 0x00050051, 0x0000000B,\n    0x00006059, 0x00001F2F, 0x00000000, 0x00050080, 0x0000000B, 0x00005420,\n    0x00002B26, 0x00006059, 0x00050080, 0x0000000B, 0x00002226, 0x00005F72,\n    0x00005420, 0x00050084, 0x00000011, 0x0000193B, 0x00001F2F, 0x00002CB7,\n    0x00050082, 0x00000011, 0x000037C7, 0x00004ABC, 0x0000193B, 0x000300F7,\n    0x00004944, 0x00000000, 0x000400FA, 0x0000500F, 0x00002E70, 0x00004944,\n    0x000200F8, 0x00002E70, 0x00050051, 0x0000000B, 0x00004259, 0x00002CB7,\n    0x00000000, 0x000500C2, 0x0000000B, 0x000033FB, 0x00004259, 0x00000A0D,\n    0x00050051, 0x0000000B, 0x000056BF, 0x000037C7, 0x00000000, 0x0004007C,\n    0x0000000C, 0x00003B5D, 0x000056BF, 0x000500AE, 0x00000009, 0x00003D78,\n    0x000056BF, 0x000033FB, 0x000300F7, 0x00005942, 0x00000000, 0x000400FA,\n    0x00003D78, 0x00005A15, 0x00005FF5, 0x000200F8, 0x00005FF5, 0x0004007C,\n    0x0000000C, 0x000050D5, 0x000033FB, 0x000200F9, 0x00005942, 0x000200F8,\n    0x00005A15, 0x0004007C, 0x0000000C, 0x000049C5, 0x000033FB, 0x0004007E,\n    0x0000000C, 0x0000432F, 0x000049C5, 0x000200F9, 0x00005942, 0x000200F8,\n    0x00005942, 0x000700F5, 0x0000000C, 0x0000273E, 0x0000432F, 0x00005A15,\n    0x000050D5, 0x00005FF5, 0x00050080, 0x0000000C, 0x00002ECF, 0x00003B5D,\n    0x0000273E, 0x0004007C, 0x0000000B, 0x0000452D, 0x00002ECF, 0x00060052,\n    0x00000011, 0x00005446, 0x0000452D, 0x000037C7, 0x00000000, 0x000200F9,\n    0x00004944, 0x000200F8, 0x00004944, 0x000700F5, 0x00000011, 0x000043D0,\n    0x000037C7, 0x00005CE0, 0x00005446, 0x00005942, 0x00050051, 0x0000000B,\n    0x00005DD7, 0x00002CB7, 0x00000000, 0x00050051, 0x0000000B, 0x0000571F,\n    0x00002CB7, 0x00000001, 0x00050084, 0x0000000B, 0x00003372, 0x00005DD7,\n    0x0000571F, 0x00050084, 0x0000000B, 0x00003CA0, 0x00002226, 0x00003372,\n    0x00050051, 0x0000000B, 0x00003ED4, 0x000043D0, 0x00000001, 0x00050084,\n    0x0000000B, 0x00003E12, 0x00003ED4, 0x00005DD7, 0x00050051, 0x0000000B,\n    0x0000605A, 0x000043D0, 0x00000000, 0x00050080, 0x0000000B, 0x00005421,\n    0x00003E12, 0x0000605A, 0x00050080, 0x0000000B, 0x000022AB, 0x00003CA0,\n    0x00005421, 0x00050084, 0x0000000B, 0x00005B36, 0x00003372, 0x00000A84,\n    0x00050089, 0x0000000B, 0x0000558C, 0x000022AB, 0x00005B36, 0x000500C4,\n    0x0000000B, 0x00005349, 0x0000558C, 0x00000A11, 0x000500C2, 0x0000000B,\n    0x00004B85, 0x00005349, 0x00000A17, 0x00060041, 0x00000294, 0x000027BD,\n    0x00000CC7, 0x00000A0B, 0x00004B85, 0x0004003D, 0x00000017, 0x00003AD4,\n    0x000027BD, 0x00050080, 0x0000000B, 0x00002145, 0x00005349, 0x00000A3A,\n    0x000500C2, 0x0000000B, 0x000054A6, 0x00002145, 0x00000A17, 0x00060041,\n    0x00000294, 0x00004FAF, 0x00000CC7, 0x00000A0B, 0x000054A6, 0x0004003D,\n    0x00000017, 0x00002261, 0x00004FAF, 0x000500AA, 0x00000009, 0x00005272,\n    0x00001A29, 0x00000A0A, 0x000300F7, 0x000033DC, 0x00000000, 0x000400FA,\n    0x00005272, 0x00002CBB, 0x000033DC, 0x000200F8, 0x00002CBB, 0x00050051,\n    0x0000000B, 0x00005E5C, 0x00004AB4, 0x00000000, 0x000500AB, 0x00000009,\n    0x000057C6, 0x00005E5C, 0x00000A0A, 0x000200F9, 0x000033DC, 0x000200F8,\n    0x000033DC, 0x000700F5, 0x00000009, 0x00002AAC, 0x00005272, 0x00004944,\n    0x000057C6, 0x00002CBB, 0x000300F7, 0x00005596, 0x00000002, 0x000400FA,\n    0x00002AAC, 0x00002CF4, 0x00005596, 0x000200F8, 0x00002CF4, 0x00050051,\n    0x0000000B, 0x00005C2F, 0x00004AB4, 0x00000000, 0x000500AE, 0x00000009,\n    0x000043C2, 0x00005C2F, 0x00000A10, 0x000300F7, 0x00004946, 0x00000000,\n    0x000400FA, 0x000043C2, 0x00003E05, 0x00004946, 0x000200F8, 0x00003E05,\n    0x000500AE, 0x00000009, 0x00005FD4, 0x00005C2F, 0x00000A13, 0x000300F7,\n    0x00004945, 0x00000000, 0x000400FA, 0x00005FD4, 0x00002620, 0x00004945,\n    0x000200F8, 0x00002620, 0x00050051, 0x0000000B, 0x00005002, 0x00003AD4,\n    0x00000003, 0x00060052, 0x00000017, 0x000037FF, 0x00005002, 0x00003AD4,\n    0x00000002, 0x000200F9, 0x00004945, 0x000200F8, 0x00004945, 0x000700F5,\n    0x00000017, 0x000043E3, 0x00003AD4, 0x00003E05, 0x000037FF, 0x00002620,\n    0x00050051, 0x0000000B, 0x00001B5A, 0x000043E3, 0x00000002, 0x00060052,\n    0x00000017, 0x00003B28, 0x00001B5A, 0x000043E3, 0x00000001, 0x000200F9,\n    0x00004946, 0x000200F8, 0x00004946, 0x000700F5, 0x00000017, 0x000043E4,\n    0x00003AD4, 0x00002CF4, 0x00003B28, 0x00004945, 0x00050051, 0x0000000B,\n    0x00001B5B, 0x000043E4, 0x00000001, 0x00060052, 0x00000017, 0x00003B29,\n    0x00001B5B, 0x000043E4, 0x00000000, 0x000200F9, 0x00005596, 0x000200F8,\n    0x00005596, 0x000700F5, 0x00000017, 0x00002AAD, 0x00003AD4, 0x000033DC,\n    0x00003B29, 0x00004946, 0x000300F7, 0x0000530F, 0x00000002, 0x000400FA,\n    0x00004C4F, 0x0000577B, 0x0000530F, 0x000200F8, 0x0000577B, 0x000300F7,\n    0x000039F4, 0x00000000, 0x000F00FB, 0x000023AA, 0x000039F4, 0x00000000,\n    0x000055A0, 0x00000001, 0x000055A0, 0x00000002, 0x00002897, 0x00000003,\n    0x00002897, 0x0000000A, 0x00002897, 0x0000000C, 0x00002897, 0x000200F8,\n    0x00002897, 0x000500C7, 0x00000017, 0x00003BA9, 0x00002AAD, 0x00000930,\n    0x000500C7, 0x00000017, 0x00005C0C, 0x00002AAD, 0x000003A1, 0x000500C4,\n    0x00000017, 0x00006105, 0x00005C0C, 0x000003C5, 0x000500C5, 0x00000017,\n    0x00004655, 0x00003BA9, 0x00006105, 0x000500C2, 0x00000017, 0x00005A82,\n    0x00002AAD, 0x000003C5, 0x000500C7, 0x00000017, 0x0000192A, 0x00005A82,\n    0x000003A1, 0x000500C5, 0x00000017, 0x00003CE5, 0x00004655, 0x0000192A,\n    0x000500C7, 0x00000017, 0x00004C3F, 0x00002261, 0x00000930, 0x000500C7,\n    0x00000017, 0x0000461A, 0x00002261, 0x000003A1, 0x000500C4, 0x00000017,\n    0x00006106, 0x0000461A, 0x000003C5, 0x000500C5, 0x00000017, 0x00004656,\n    0x00004C3F, 0x00006106, 0x000500C2, 0x00000017, 0x00005A83, 0x00002261,\n    0x000003C5, 0x000500C7, 0x00000017, 0x00001CE0, 0x00005A83, 0x000003A1,\n    0x000500C5, 0x00000017, 0x00001EBE, 0x00004656, 0x00001CE0, 0x000200F9,\n    0x000039F4, 0x000200F8, 0x000055A0, 0x000500C7, 0x00000017, 0x00004E95,\n    0x00002AAD, 0x0000072E, 0x000500C7, 0x00000017, 0x00005C0D, 0x00002AAD,\n    0x0000064B, 0x000500C4, 0x00000017, 0x00006107, 0x00005C0D, 0x000002ED,\n    0x000500C5, 0x00000017, 0x00004657, 0x00004E95, 0x00006107, 0x000500C2,\n    0x00000017, 0x00005A84, 0x00002AAD, 0x000002ED, 0x000500C7, 0x00000017,\n    0x0000192B, 0x00005A84, 0x0000064B, 0x000500C5, 0x00000017, 0x00003CE6,\n    0x00004657, 0x0000192B, 0x000500C7, 0x00000017, 0x00004C40, 0x00002261,\n    0x0000072E, 0x000500C7, 0x00000017, 0x0000461B, 0x00002261, 0x0000064B,\n    0x000500C4, 0x00000017, 0x00006108, 0x0000461B, 0x000002ED, 0x000500C5,\n    0x00000017, 0x00004658, 0x00004C40, 0x00006108, 0x000500C2, 0x00000017,\n    0x00005A85, 0x00002261, 0x000002ED, 0x000500C7, 0x00000017, 0x00001CE1,\n    0x00005A85, 0x0000064B, 0x000500C5, 0x00000017, 0x00001EBF, 0x00004658,\n    0x00001CE1, 0x000200F9, 0x000039F4, 0x000200F8, 0x000039F4, 0x000900F5,\n    0x00000017, 0x00002BF3, 0x00002261, 0x0000577B, 0x00001EBF, 0x000055A0,\n    0x00001EBE, 0x00002897, 0x000900F5, 0x00000017, 0x0000358D, 0x00002AAD,\n    0x0000577B, 0x00003CE6, 0x000055A0, 0x00003CE5, 0x00002897, 0x000200F9,\n    0x0000530F, 0x000200F8, 0x0000530F, 0x000700F5, 0x00000017, 0x000022F8,\n    0x00002261, 0x00005596, 0x00002BF3, 0x000039F4, 0x000700F5, 0x00000017,\n    0x0000520A, 0x00002AAD, 0x00005596, 0x0000358D, 0x000039F4, 0x00050080,\n    0x00000011, 0x000037CC, 0x00002670, 0x000059EC, 0x000500C2, 0x00000011,\n    0x00005E75, 0x000037CC, 0x00000740, 0x00050086, 0x00000011, 0x00001E20,\n    0x00005E75, 0x00005C31, 0x00050084, 0x00000011, 0x00004707, 0x00005C31,\n    0x00001E20, 0x00050082, 0x00000011, 0x00004761, 0x00005E75, 0x00004707,\n    0x000500C4, 0x00000011, 0x00002BE0, 0x00001E20, 0x00000740, 0x00050051,\n    0x0000000B, 0x000033E4, 0x00004761, 0x00000000, 0x00050051, 0x0000000B,\n    0x00002A78, 0x00005C31, 0x00000001, 0x00050084, 0x0000000B, 0x00005966,\n    0x000033E4, 0x00002A78, 0x00050051, 0x0000000B, 0x00001B1F, 0x00004761,\n    0x00000001, 0x00050080, 0x0000000B, 0x000028E5, 0x00005966, 0x00001B1F,\n    0x000500C7, 0x00000011, 0x000049A3, 0x000037CC, 0x000007A3, 0x000500C4,\n    0x0000000B, 0x00002955, 0x000028E5, 0x00000A1F, 0x00050051, 0x0000000B,\n    0x000051B4, 0x000049A3, 0x00000001, 0x000500C4, 0x0000000B, 0x00005C2C,\n    0x000051B4, 0x00000A1C, 0x000500C5, 0x0000000B, 0x00004D66, 0x00002955,\n    0x00005C2C, 0x00050051, 0x0000000B, 0x000053E4, 0x000049A3, 0x00000000,\n    0x000500C4, 0x0000000B, 0x00002DC2, 0x000053E4, 0x00000A10, 0x000500C5,\n    0x0000000B, 0x00002BB9, 0x00004D66, 0x00002DC2, 0x000300F7, 0x00005341,\n    0x00000002, 0x000400FA, 0x00005010, 0x0000294E, 0x0000537D, 0x000200F8,\n    0x0000537D, 0x0004007C, 0x00000012, 0x00002970, 0x00002BE0, 0x00050051,\n    0x0000000C, 0x000045F3, 0x00002970, 0x00000001, 0x000500C3, 0x0000000C,\n    0x00004DC0, 0x000045F3, 0x00000A1A, 0x0004007C, 0x0000000C, 0x00005780,\n    0x000020FC, 0x00050084, 0x0000000C, 0x00001F02, 0x00004DC0, 0x00005780,\n    0x00050051, 0x0000000C, 0x00006242, 0x00002970, 0x00000000, 0x000500C3,\n    0x0000000C, 0x00004FC7, 0x00006242, 0x00000A1A, 0x00050080, 0x0000000C,\n    0x000049B0, 0x00001F02, 0x00004FC7, 0x000500C4, 0x0000000C, 0x0000254A,\n    0x000049B0, 0x00000A1D, 0x000500C3, 0x0000000C, 0x0000603B, 0x000045F3,\n    0x00000A0E, 0x000500C7, 0x0000000C, 0x0000539A, 0x0000603B, 0x00000A20,\n    0x000500C4, 0x0000000C, 0x0000534A, 0x0000539A, 0x00000A14, 0x000500C7,\n    0x0000000C, 0x00004EA5, 0x00006242, 0x00000A20, 0x000500C5, 0x0000000C,\n    0x00002B1A, 0x0000534A, 0x00004EA5, 0x000500C5, 0x0000000C, 0x000043B6,\n    0x0000254A, 0x00002B1A, 0x000500C4, 0x0000000C, 0x00005E63, 0x000043B6,\n    0x00000A10, 0x000500C3, 0x0000000C, 0x000031DE, 0x000045F3, 0x00000A17,\n    0x000500C7, 0x0000000C, 0x00005447, 0x000031DE, 0x00000A0E, 0x000500C3,\n    0x0000000C, 0x000028A6, 0x00006242, 0x00000A14, 0x000500C7, 0x0000000C,\n    0x0000511E, 0x000028A6, 0x00000A14, 0x000500C3, 0x0000000C, 0x000028B9,\n    0x000045F3, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000505E, 0x000028B9,\n    0x00000A0E, 0x000500C4, 0x0000000C, 0x0000541D, 0x0000505E, 0x00000A0E,\n    0x000500C6, 0x0000000C, 0x000022BA, 0x0000511E, 0x0000541D, 0x000500C7,\n    0x0000000C, 0x00005076, 0x000045F3, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x00005228, 0x00005076, 0x00000A17, 0x000500C4, 0x0000000C, 0x00001997,\n    0x000022BA, 0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FE, 0x00005228,\n    0x00001997, 0x000500C4, 0x0000000C, 0x00001C00, 0x00005447, 0x00000A2C,\n    0x000500C5, 0x0000000C, 0x00003C81, 0x000047FE, 0x00001C00, 0x000500C7,\n    0x0000000C, 0x000050AF, 0x00005E63, 0x00000A38, 0x000500C5, 0x0000000C,\n    0x00003C70, 0x00003C81, 0x000050AF, 0x000500C3, 0x0000000C, 0x00003745,\n    0x00005E63, 0x00000A17, 0x000500C7, 0x0000000C, 0x000018B8, 0x00003745,\n    0x00000A0E, 0x000500C4, 0x0000000C, 0x0000547E, 0x000018B8, 0x00000A1A,\n    0x000500C5, 0x0000000C, 0x000045A8, 0x00003C70, 0x0000547E, 0x000500C3,\n    0x0000000C, 0x00003A6E, 0x00005E63, 0x00000A1A, 0x000500C7, 0x0000000C,\n    0x000018B9, 0x00003A6E, 0x00000A20, 0x000500C4, 0x0000000C, 0x0000547F,\n    0x000018B9, 0x00000A23, 0x000500C5, 0x0000000C, 0x0000456F, 0x000045A8,\n    0x0000547F, 0x000500C3, 0x0000000C, 0x00003C88, 0x00005E63, 0x00000A23,\n    0x000500C4, 0x0000000C, 0x00002824, 0x00003C88, 0x00000A2F, 0x000500C5,\n    0x0000000C, 0x00003B79, 0x0000456F, 0x00002824, 0x0004007C, 0x0000000B,\n    0x000041E5, 0x00003B79, 0x000200F9, 0x00005341, 0x000200F8, 0x0000294E,\n    0x00050051, 0x0000000B, 0x00004D9A, 0x00002BE0, 0x00000000, 0x00050051,\n    0x0000000B, 0x00002C03, 0x00002BE0, 0x00000001, 0x00060050, 0x00000014,\n    0x000020DE, 0x00004D9A, 0x00002C03, 0x000059FD, 0x0004007C, 0x00000016,\n    0x00004E9D, 0x000020DE, 0x00050051, 0x0000000C, 0x00002BF7, 0x00004E9D,\n    0x00000002, 0x000500C3, 0x0000000C, 0x00004DC1, 0x00002BF7, 0x00000A11,\n    0x0004007C, 0x0000000C, 0x00005781, 0x00006273, 0x00050084, 0x0000000C,\n    0x00001F03, 0x00004DC1, 0x00005781, 0x00050051, 0x0000000C, 0x00006243,\n    0x00004E9D, 0x00000001, 0x000500C3, 0x0000000C, 0x00004A6F, 0x00006243,\n    0x00000A17, 0x00050080, 0x0000000C, 0x00002B2C, 0x00001F03, 0x00004A6F,\n    0x0004007C, 0x0000000C, 0x00004202, 0x000020FC, 0x00050084, 0x0000000C,\n    0x00003A60, 0x00002B2C, 0x00004202, 0x00050051, 0x0000000C, 0x00006244,\n    0x00004E9D, 0x00000000, 0x000500C3, 0x0000000C, 0x00004FC8, 0x00006244,\n    0x00000A1A, 0x00050080, 0x0000000C, 0x000049FC, 0x00003A60, 0x00004FC8,\n    0x000500C4, 0x0000000C, 0x0000225D, 0x000049FC, 0x00000A20, 0x000500C7,\n    0x0000000C, 0x00002CAA, 0x00002BF7, 0x00000A14, 0x000500C4, 0x0000000C,\n    0x00004CAE, 0x00002CAA, 0x00000A1A, 0x000500C3, 0x0000000C, 0x0000383E,\n    0x00006243, 0x00000A0E, 0x000500C7, 0x0000000C, 0x00005374, 0x0000383E,\n    0x00000A14, 0x000500C4, 0x0000000C, 0x000054CA, 0x00005374, 0x00000A14,\n    0x000500C5, 0x0000000C, 0x000042CE, 0x00004CAE, 0x000054CA, 0x000500C7,\n    0x0000000C, 0x000050D6, 0x00006244, 0x00000A20, 0x000500C5, 0x0000000C,\n    0x00003ADD, 0x000042CE, 0x000050D6, 0x000500C5, 0x0000000C, 0x000043B7,\n    0x0000225D, 0x00003ADD, 0x000500C4, 0x0000000C, 0x00005E50, 0x000043B7,\n    0x00000A10, 0x000500C3, 0x0000000C, 0x000032D7, 0x00006243, 0x00000A14,\n    0x000500C6, 0x0000000C, 0x000026C9, 0x000032D7, 0x00004DC1, 0x000500C7,\n    0x0000000C, 0x00004199, 0x000026C9, 0x00000A0E, 0x000500C3, 0x0000000C,\n    0x00002590, 0x00006244, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000505F,\n    0x00002590, 0x00000A14, 0x000500C4, 0x0000000C, 0x0000541E, 0x00004199,\n    0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BB, 0x0000505F, 0x0000541E,\n    0x000500C7, 0x0000000C, 0x00005077, 0x00006243, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x00005229, 0x00005077, 0x00000A17, 0x000500C4, 0x0000000C,\n    0x00001998, 0x000022BB, 0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FF,\n    0x00005229, 0x00001998, 0x000500C4, 0x0000000C, 0x00001C01, 0x00004199,\n    0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C82, 0x000047FF, 0x00001C01,\n    0x000500C7, 0x0000000C, 0x000050B0, 0x00005E50, 0x00000A38, 0x000500C5,\n    0x0000000C, 0x00003C71, 0x00003C82, 0x000050B0, 0x000500C3, 0x0000000C,\n    0x00003746, 0x00005E50, 0x00000A17, 0x000500C7, 0x0000000C, 0x000018BA,\n    0x00003746, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005480, 0x000018BA,\n    0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A9, 0x00003C71, 0x00005480,\n    0x000500C3, 0x0000000C, 0x00003A6F, 0x00005E50, 0x00000A1A, 0x000500C7,\n    0x0000000C, 0x000018BB, 0x00003A6F, 0x00000A20, 0x000500C4, 0x0000000C,\n    0x00005481, 0x000018BB, 0x00000A23, 0x000500C5, 0x0000000C, 0x00004570,\n    0x000045A9, 0x00005481, 0x000500C3, 0x0000000C, 0x00003C89, 0x00005E50,\n    0x00000A23, 0x000500C4, 0x0000000C, 0x00002825, 0x00003C89, 0x00000A2F,\n    0x000500C5, 0x0000000C, 0x00003B7A, 0x00004570, 0x00002825, 0x0004007C,\n    0x0000000B, 0x000041E6, 0x00003B7A, 0x000200F9, 0x00005341, 0x000200F8,\n    0x00005341, 0x000700F5, 0x0000000B, 0x00002522, 0x000041E6, 0x0000294E,\n    0x000041E5, 0x0000537D, 0x00050084, 0x0000000B, 0x000041CB, 0x0000229A,\n    0x00002A78, 0x00050084, 0x0000000B, 0x00002ED9, 0x00002522, 0x000041CB,\n    0x00050080, 0x0000000B, 0x00003E8C, 0x00002ED9, 0x00002BB9, 0x000500C2,\n    0x0000000B, 0x00005183, 0x00003E8C, 0x00000A17, 0x000500AA, 0x00000009,\n    0x00002EEA, 0x00004ADC, 0x00000A0D, 0x000500AA, 0x00000009, 0x00005776,\n    0x00004ADC, 0x00000A10, 0x000500A6, 0x00000009, 0x00005686, 0x00002EEA,\n    0x00005776, 0x000300F7, 0x00003463, 0x00000000, 0x000400FA, 0x00005686,\n    0x00002957, 0x00003463, 0x000200F8, 0x00002957, 0x000500C7, 0x00000017,\n    0x0000475F, 0x0000520A, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D1,\n    0x0000475F, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AC, 0x0000520A,\n    0x0000072E, 0x000500C2, 0x00000017, 0x0000448D, 0x000050AC, 0x0000013D,\n    0x000500C5, 0x00000017, 0x00003FF8, 0x000024D1, 0x0000448D, 0x000200F9,\n    0x00003463, 0x000200F8, 0x00003463, 0x000700F5, 0x00000017, 0x00005879,\n    0x0000520A, 0x00005341, 0x00003FF8, 0x00002957, 0x000500AA, 0x00000009,\n    0x00004CB6, 0x00004ADC, 0x00000A13, 0x000500A6, 0x00000009, 0x00003B23,\n    0x00005776, 0x00004CB6, 0x000300F7, 0x00002C98, 0x00000000, 0x000400FA,\n    0x00003B23, 0x00002B38, 0x00002C98, 0x000200F8, 0x00002B38, 0x000500C4,\n    0x00000017, 0x00005E17, 0x00005879, 0x000002ED, 0x000500C2, 0x00000017,\n    0x00003BE7, 0x00005879, 0x000002ED, 0x000500C5, 0x00000017, 0x000029E8,\n    0x00005E17, 0x00003BE7, 0x000200F9, 0x00002C98, 0x000200F8, 0x00002C98,\n    0x000700F5, 0x00000017, 0x00004D37, 0x00005879, 0x00003463, 0x000029E8,\n    0x00002B38, 0x00060041, 0x00000294, 0x000060F9, 0x00001592, 0x00000A0B,\n    0x00005183, 0x0003003E, 0x000060F9, 0x00004D37, 0x00050080, 0x0000000B,\n    0x00002DCE, 0x00003E8C, 0x00000A3A, 0x000500C2, 0x0000000B, 0x000041F1,\n    0x00002DCE, 0x00000A17, 0x000300F7, 0x00003A1A, 0x00000000, 0x000400FA,\n    0x00005686, 0x00002958, 0x00003A1A, 0x000200F8, 0x00002958, 0x000500C7,\n    0x00000017, 0x00004760, 0x000022F8, 0x000009CE, 0x000500C4, 0x00000017,\n    0x000024D2, 0x00004760, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AD,\n    0x000022F8, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448E, 0x000050AD,\n    0x0000013D, 0x000500C5, 0x00000017, 0x00003FF9, 0x000024D2, 0x0000448E,\n    0x000200F9, 0x00003A1A, 0x000200F8, 0x00003A1A, 0x000700F5, 0x00000017,\n    0x00002AAE, 0x000022F8, 0x00002C98, 0x00003FF9, 0x00002958, 0x000300F7,\n    0x00002C99, 0x00000000, 0x000400FA, 0x00003B23, 0x00002B39, 0x00002C99,\n    0x000200F8, 0x00002B39, 0x000500C4, 0x00000017, 0x00005E18, 0x00002AAE,\n    0x000002ED, 0x000500C2, 0x00000017, 0x00003BE8, 0x00002AAE, 0x000002ED,\n    0x000500C5, 0x00000017, 0x000029E9, 0x00005E18, 0x00003BE8, 0x000200F9,\n    0x00002C99, 0x000200F8, 0x00002C99, 0x000700F5, 0x00000017, 0x00004D38,\n    0x00002AAE, 0x00003A1A, 0x000029E9, 0x00002B39, 0x00060041, 0x00000294,\n    0x00001F75, 0x00001592, 0x00000A0B, 0x000041F1, 0x0003003E, 0x00001F75,\n    0x00004D38, 0x000200F9, 0x00004C7A, 0x000200F8, 0x00004C7A, 0x000100FD,\n    0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/resolve_fast_32bpp_4xmsaa_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25204\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 8 8 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_resolve_edram_info\"\n               OpMemberName %push_const_block_xe 1 \"xe_resolve_coordinate_info\"\n               OpMemberName %push_const_block_xe 2 \"xe_resolve_dest_info\"\n               OpMemberName %push_const_block_xe 3 \"xe_resolve_dest_coordinate_info\"\n               OpMemberName %push_const_block_xe 4 \"xe_resolve_dest_base\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_resolve_edram_xe_block \"xe_resolve_edram_xe_block\"\n               OpMemberName %xe_resolve_edram_xe_block 0 \"data\"\n               OpName %xe_resolve_edram \"xe_resolve_edram\"\n               OpName %xe_resolve_dest_xe_block \"xe_resolve_dest_xe_block\"\n               OpMemberName %xe_resolve_dest_xe_block 0 \"data\"\n               OpName %xe_resolve_dest \"xe_resolve_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_resolve_edram_xe_block BufferBlock\n               OpMemberDecorate %xe_resolve_edram_xe_block 0 NonWritable\n               OpMemberDecorate %xe_resolve_edram_xe_block 0 Offset 0\n               OpDecorate %xe_resolve_edram NonWritable\n               OpDecorate %xe_resolve_edram Binding 0\n               OpDecorate %xe_resolve_edram DescriptorSet 0\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_resolve_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_resolve_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_resolve_dest_xe_block 0 Offset 0\n               OpDecorate %xe_resolve_dest NonReadable\n               OpDecorate %xe_resolve_dest Binding 0\n               OpDecorate %xe_resolve_dest DescriptorSet 1\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n     %v4uint = OpTypeVector %uint 4\n       %bool = OpTypeBool\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n     %uint_1 = OpConstant %uint 1\n     %uint_2 = OpConstant %uint 2\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n     %uint_3 = OpConstant %uint 3\n    %uint_16 = OpConstant %uint 16\n     %uint_0 = OpConstant %uint 0\n       %1828 = OpConstantComposite %v2uint %uint_1 %uint_1\n       %1816 = OpConstantComposite %v2uint %uint_1 %uint_0\n    %uint_80 = OpConstant %uint 80\n       %2719 = OpConstantComposite %v2uint %uint_80 %uint_16\n      %int_2 = OpConstant %int 2\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n      %int_3 = OpConstant %int 3\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n  %uint_1023 = OpConstant %uint 1023\n    %uint_10 = OpConstant %uint 10\n  %uint_4096 = OpConstant %uint 4096\n    %uint_13 = OpConstant %uint 13\n  %uint_2047 = OpConstant %uint 2047\n    %uint_24 = OpConstant %uint 24\n    %uint_15 = OpConstant %uint 15\n    %uint_28 = OpConstant %uint 28\n     %uint_4 = OpConstant %uint 4\n       %1855 = OpConstantComposite %v2uint %uint_0 %uint_4\n     %uint_5 = OpConstant %uint 5\n     %uint_7 = OpConstant %uint 7\n%uint_16777216 = OpConstant %uint 16777216\n    %uint_20 = OpConstant %uint 20\n       %2275 = OpConstantComposite %v2uint %uint_20 %uint_24\n     %v3uint = OpTypeVector %uint 3\n   %uint_255 = OpConstant %uint 255\n%uint_3222273024 = OpConstant %uint 3222273024\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n%_ptr_Input_uint = OpTypePointer Input %uint\n       %1834 = OpConstantComposite %v2uint %uint_3 %uint_0\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_resolve_edram_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_resolve_edram_xe_block = OpTypePointer Uniform %xe_resolve_edram_xe_block\n%xe_resolve_edram = OpVariable %_ptr_Uniform_xe_resolve_edram_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n    %uint_32 = OpConstant %uint 32\n    %uint_48 = OpConstant %uint 48\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_resolve_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_resolve_dest_xe_block = OpTypePointer Uniform %xe_resolve_dest_xe_block\n%xe_resolve_dest = OpVariable %_ptr_Uniform_xe_resolve_dest_xe_block Uniform\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_8 %uint_8 %uint_1\n       %1954 = OpConstantComposite %v2uint %uint_15 %uint_1\n       %1870 = OpConstantComposite %v2uint %uint_3 %uint_3\n       %2122 = OpConstantComposite %v2uint %uint_15 %uint_15\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n       %1611 = OpConstantComposite %v4uint %uint_255 %uint_255 %uint_255 %uint_255\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n       %2352 = OpConstantComposite %v4uint %uint_3222273024 %uint_3222273024 %uint_3222273024 %uint_3222273024\n        %929 = OpConstantComposite %v4uint %uint_1023 %uint_1023 %uint_1023 %uint_1023\n        %965 = OpConstantComposite %v4uint %uint_20 %uint_20 %uint_20 %uint_20\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n    %uint_40 = OpConstant %uint 40\n     %int_40 = OpConstant %int 40\n    %int_n40 = OpConstant %int -40\n  %uint_1280 = OpConstant %uint 1280\n%uint_2621440 = OpConstant %uint 2621440\n      %false = OpConstantFalse %bool\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %22245 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %15627 = OpLoad %uint %22245\n      %22700 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %20919 = OpLoad %uint %22700\n      %19164 = OpBitwiseAnd %uint %15627 %uint_1023\n      %21999 = OpBitwiseAnd %uint %15627 %uint_4096\n      %20495 = OpINotEqual %bool %21999 %uint_0\n      %10307 = OpShiftRightLogical %uint %15627 %uint_13\n      %24434 = OpBitwiseAnd %uint %10307 %uint_2047\n      %18836 = OpShiftRightLogical %uint %15627 %uint_24\n       %9130 = OpBitwiseAnd %uint %18836 %uint_15\n       %8871 = OpCompositeConstruct %v2uint %20919 %20919\n       %9576 = OpShiftRightLogical %v2uint %8871 %1855\n      %23379 = OpBitwiseAnd %v2uint %9576 %1954\n      %16207 = OpShiftLeftLogical %v2uint %23379 %1870\n      %23019 = OpIMul %v2uint %16207 %1828\n      %12819 = OpShiftRightLogical %uint %20919 %uint_5\n      %16204 = OpBitwiseAnd %uint %12819 %uint_2047\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %24236 = OpLoad %uint %18732\n      %22701 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %20920 = OpLoad %uint %22701\n      %19165 = OpBitwiseAnd %uint %24236 %uint_7\n      %22000 = OpBitwiseAnd %uint %24236 %uint_8\n      %20496 = OpINotEqual %bool %22000 %uint_0\n      %10402 = OpShiftRightLogical %uint %24236 %uint_4\n      %23037 = OpBitwiseAnd %uint %10402 %uint_7\n      %23118 = OpBitwiseAnd %uint %24236 %uint_16777216\n      %19535 = OpINotEqual %bool %23118 %uint_0\n       %8444 = OpBitwiseAnd %uint %20920 %uint_1023\n      %12176 = OpShiftRightLogical %uint %20920 %uint_10\n      %25038 = OpBitwiseAnd %uint %12176 %uint_1023\n      %25203 = OpShiftLeftLogical %uint %25038 %int_1\n      %10422 = OpCompositeConstruct %v2uint %20920 %20920\n      %10385 = OpShiftRightLogical %v2uint %10422 %2275\n      %23380 = OpBitwiseAnd %v2uint %10385 %2122\n      %16208 = OpShiftLeftLogical %v2uint %23380 %1870\n      %23020 = OpIMul %v2uint %16208 %1828\n      %12820 = OpShiftRightLogical %uint %20920 %uint_28\n      %16205 = OpBitwiseAnd %uint %12820 %uint_7\n      %18733 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_4\n      %24237 = OpLoad %uint %18733\n      %22225 = OpAccessChain %_ptr_Input_uint %gl_GlobalInvocationID %uint_0\n       %7085 = OpLoad %uint %22225\n       %7405 = OpUGreaterThanEqual %bool %7085 %16204\n               OpSelectionMerge %17447 DontFlatten\n               OpBranchConditional %7405 %21992 %17447\n      %21992 = OpLabel\n               OpBranch %19578\n      %17447 = OpLabel\n      %14637 = OpLoad %v3uint %gl_GlobalInvocationID\n      %18505 = OpVectorShuffle %v2uint %14637 %14637 0 1\n       %9840 = OpShiftLeftLogical %v2uint %18505 %1834\n      %24498 = OpCompositeExtract %uint %9840 0\n       %7150 = OpCompositeExtract %uint %9840 1\n      %24446 = OpExtInst %uint %1 UMax %7150 %uint_0\n      %20975 = OpCompositeConstruct %v2uint %24498 %24446\n      %21036 = OpIAdd %v2uint %20975 %23019\n      %16075 = OpULessThanEqual %bool %16205 %uint_3\n               OpSelectionMerge %6909 None\n               OpBranchConditional %16075 %10990 %15087\n      %15087 = OpLabel\n      %13566 = OpIEqual %bool %16205 %uint_5\n       %8438 = OpSelect %uint %13566 %uint_2 %uint_0\n               OpBranch %6909\n      %10990 = OpLabel\n               OpBranch %6909\n       %6909 = OpLabel\n      %16517 = OpPhi %uint %16205 %10990 %8438 %15087\n      %11201 = OpShiftLeftLogical %v2uint %21036 %1828\n      %21693 = OpCompositeConstruct %v2uint %16517 %16517\n       %9093 = OpShiftRightLogical %v2uint %21693 %1816\n      %16110 = OpBitwiseAnd %v2uint %9093 %1828\n      %17779 = OpIAdd %v2uint %11201 %16110\n      %24270 = OpUDiv %v2uint %17779 %2719\n      %12360 = OpCompositeExtract %uint %24270 1\n      %11046 = OpIMul %uint %12360 %19164\n      %24665 = OpCompositeExtract %uint %24270 0\n      %21536 = OpIAdd %uint %11046 %24665\n       %8742 = OpIAdd %uint %24434 %21536\n       %6459 = OpIMul %v2uint %24270 %2719\n      %14279 = OpISub %v2uint %17779 %6459\n               OpSelectionMerge %19725 None\n               OpBranchConditional %20495 %10558 %19725\n      %10558 = OpLabel\n      %11791 = OpCompositeExtract %uint %14279 0\n      %24981 = OpBitcast %int %11791\n       %7841 = OpUGreaterThanEqual %bool %11791 %uint_40\n      %22568 = OpSelect %int %7841 %int_n40 %int_40\n      %11768 = OpIAdd %int %24981 %22568\n       %8071 = OpBitcast %uint %11768\n      %21574 = OpCompositeInsert %v2uint %8071 %14279 0\n               OpBranch %19725\n      %19725 = OpLabel\n       %8537 = OpPhi %v2uint %14279 %6909 %21574 %10558\n       %6671 = OpIMul %uint %8742 %uint_1280\n      %13892 = OpCompositeExtract %uint %8537 1\n      %15890 = OpIMul %uint %13892 %uint_80\n      %24666 = OpCompositeExtract %uint %8537 0\n      %21631 = OpIAdd %uint %15890 %24666\n       %9131 = OpIAdd %uint %6671 %21631\n       %9845 = OpUMod %uint %9131 %uint_2621440\n       %6461 = OpShiftLeftLogical %uint %9845 %int_2\n       %8238 = OpINotEqual %bool %16205 %uint_2\n               OpSelectionMerge %13276 None\n               OpBranchConditional %8238 %16434 %13276\n      %16434 = OpLabel\n      %10585 = OpINotEqual %bool %16205 %uint_3\n               OpBranch %13276\n      %13276 = OpLabel\n      %10924 = OpPhi %bool %8238 %19725 %10585 %16434\n               OpSelectionMerge %20259 DontFlatten\n               OpBranchConditional %10924 %6591 %8959\n       %8959 = OpLabel\n      %22064 = OpShiftRightLogical %uint %6461 %int_4\n      %12476 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_edram %int_0 %22064\n      %21044 = OpLoad %v4uint %12476\n      %20300 = OpCompositeExtract %uint %21044 1\n      %17531 = OpCompositeExtract %uint %21044 3\n      %15841 = OpIAdd %uint %6461 %uint_16\n      %24886 = OpShiftRightLogical %uint %15841 %int_4\n      %18708 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_edram %int_0 %24886\n      %21045 = OpLoad %v4uint %18708\n      %19388 = OpCompositeExtract %uint %21045 1\n      %24581 = OpCompositeExtract %uint %21045 3\n       %9869 = OpCompositeConstruct %v4uint %20300 %17531 %19388 %24581\n      %16090 = OpIAdd %uint %6461 %uint_32\n       %8237 = OpShiftRightLogical %uint %16090 %int_4\n      %18709 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_edram %int_0 %8237\n      %21046 = OpLoad %v4uint %18709\n      %20301 = OpCompositeExtract %uint %21046 1\n      %17532 = OpCompositeExtract %uint %21046 3\n      %15842 = OpIAdd %uint %6461 %uint_48\n      %24887 = OpShiftRightLogical %uint %15842 %int_4\n      %18710 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_edram %int_0 %24887\n      %21047 = OpLoad %v4uint %18710\n      %19389 = OpCompositeExtract %uint %21047 1\n       %7809 = OpCompositeExtract %uint %21047 3\n       %9033 = OpCompositeConstruct %v4uint %20301 %17532 %19389 %7809\n               OpBranch %20259\n       %6591 = OpLabel\n      %24486 = OpShiftRightLogical %uint %6461 %int_4\n      %12477 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_edram %int_0 %24486\n      %21048 = OpLoad %v4uint %12477\n      %20302 = OpCompositeExtract %uint %21048 0\n      %17533 = OpCompositeExtract %uint %21048 2\n      %15843 = OpIAdd %uint %6461 %uint_16\n      %24888 = OpShiftRightLogical %uint %15843 %int_4\n      %18711 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_edram %int_0 %24888\n      %21049 = OpLoad %v4uint %18711\n      %19390 = OpCompositeExtract %uint %21049 0\n      %24582 = OpCompositeExtract %uint %21049 2\n       %9870 = OpCompositeConstruct %v4uint %20302 %17533 %19390 %24582\n      %16091 = OpIAdd %uint %6461 %uint_32\n       %8239 = OpShiftRightLogical %uint %16091 %int_4\n      %18712 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_edram %int_0 %8239\n      %21050 = OpLoad %v4uint %18712\n      %20303 = OpCompositeExtract %uint %21050 0\n      %17534 = OpCompositeExtract %uint %21050 2\n      %15844 = OpIAdd %uint %6461 %uint_48\n      %24889 = OpShiftRightLogical %uint %15844 %int_4\n      %18713 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_edram %int_0 %24889\n      %21051 = OpLoad %v4uint %18713\n      %19391 = OpCompositeExtract %uint %21051 0\n       %7810 = OpCompositeExtract %uint %21051 2\n       %9034 = OpCompositeConstruct %v4uint %20303 %17534 %19391 %7810\n               OpBranch %20259\n      %20259 = OpLabel\n       %9750 = OpPhi %v4uint %9034 %6591 %9033 %8959\n      %13261 = OpPhi %v4uint %9870 %6591 %9869 %8959\n      %19928 = OpIEqual %bool %24498 %uint_0\n      %22246 = OpSelect %bool %19928 %false %19928\n               OpSelectionMerge %21910 DontFlatten\n               OpBranchConditional %22246 %9760 %21910\n       %9760 = OpLabel\n      %20482 = OpCompositeExtract %uint %13261 1\n      %14335 = OpCompositeInsert %v4uint %20482 %13261 0\n               OpBranch %21910\n      %21910 = OpLabel\n      %10925 = OpPhi %v4uint %13261 %20259 %14335 %9760\n               OpSelectionMerge %21263 DontFlatten\n               OpBranchConditional %19535 %22395 %21263\n      %22395 = OpLabel\n               OpSelectionMerge %14836 None\n               OpSwitch %9130 %14836 0 %21920 1 %21920 2 %10391 3 %10391 10 %10391 12 %10391\n      %10391 = OpLabel\n      %15273 = OpBitwiseAnd %v4uint %10925 %2352\n      %23564 = OpBitwiseAnd %v4uint %10925 %929\n      %24837 = OpShiftLeftLogical %v4uint %23564 %965\n      %18005 = OpBitwiseOr %v4uint %15273 %24837\n      %23170 = OpShiftRightLogical %v4uint %10925 %965\n       %6442 = OpBitwiseAnd %v4uint %23170 %929\n      %15589 = OpBitwiseOr %v4uint %18005 %6442\n      %19519 = OpBitwiseAnd %v4uint %9750 %2352\n      %17946 = OpBitwiseAnd %v4uint %9750 %929\n      %24838 = OpShiftLeftLogical %v4uint %17946 %965\n      %18006 = OpBitwiseOr %v4uint %19519 %24838\n      %23171 = OpShiftRightLogical %v4uint %9750 %965\n       %7392 = OpBitwiseAnd %v4uint %23171 %929\n       %7870 = OpBitwiseOr %v4uint %18006 %7392\n               OpBranch %14836\n      %21920 = OpLabel\n      %20117 = OpBitwiseAnd %v4uint %10925 %1838\n      %23565 = OpBitwiseAnd %v4uint %10925 %1611\n      %24839 = OpShiftLeftLogical %v4uint %23565 %749\n      %18007 = OpBitwiseOr %v4uint %20117 %24839\n      %23172 = OpShiftRightLogical %v4uint %10925 %749\n       %6443 = OpBitwiseAnd %v4uint %23172 %1611\n      %15590 = OpBitwiseOr %v4uint %18007 %6443\n      %19520 = OpBitwiseAnd %v4uint %9750 %1838\n      %17947 = OpBitwiseAnd %v4uint %9750 %1611\n      %24840 = OpShiftLeftLogical %v4uint %17947 %749\n      %18008 = OpBitwiseOr %v4uint %19520 %24840\n      %23173 = OpShiftRightLogical %v4uint %9750 %749\n       %7393 = OpBitwiseAnd %v4uint %23173 %1611\n       %7871 = OpBitwiseOr %v4uint %18008 %7393\n               OpBranch %14836\n      %14836 = OpLabel\n      %11251 = OpPhi %v4uint %9750 %22395 %7871 %21920 %7870 %10391\n      %13709 = OpPhi %v4uint %10925 %22395 %15590 %21920 %15589 %10391\n               OpBranch %21263\n      %21263 = OpLabel\n       %8952 = OpPhi %v4uint %9750 %21910 %11251 %14836\n      %22009 = OpPhi %v4uint %10925 %21910 %13709 %14836\n       %7319 = OpIAdd %v2uint %9840 %23020\n               OpSelectionMerge %21237 DontFlatten\n               OpBranchConditional %20496 %10574 %21373\n      %21373 = OpLabel\n      %10608 = OpBitcast %v2int %7319\n      %17907 = OpCompositeExtract %int %10608 1\n      %19904 = OpShiftRightArithmetic %int %17907 %int_5\n      %22400 = OpBitcast %int %8444\n       %7938 = OpIMul %int %19904 %22400\n      %25154 = OpCompositeExtract %int %10608 0\n      %20423 = OpShiftRightArithmetic %int %25154 %int_5\n      %18864 = OpIAdd %int %7938 %20423\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %17907 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25154 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17334 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17334 %uint_2\n      %12766 = OpShiftRightArithmetic %int %17907 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25154 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %17907 %int_3\n      %20574 = OpBitwiseAnd %int %10425 %int_1\n      %21533 = OpShiftLeftLogical %int %20574 %int_1\n       %8890 = OpBitwiseXor %int %20766 %21533\n      %20598 = OpBitwiseAnd %int %17907 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6551\n       %7168 = OpShiftLeftLogical %int %21575 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24163 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24163 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24163 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21632 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21632\n      %15496 = OpShiftRightArithmetic %int %24163 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %21237\n      %10574 = OpLabel\n      %19866 = OpCompositeExtract %uint %7319 0\n      %11267 = OpCompositeExtract %uint %7319 1\n       %8414 = OpCompositeConstruct %v3uint %19866 %11267 %23037\n      %20125 = OpBitcast %v3int %8414\n      %11255 = OpCompositeExtract %int %20125 2\n      %19905 = OpShiftRightArithmetic %int %11255 %int_2\n      %22401 = OpBitcast %int %25203\n       %7939 = OpIMul %int %19905 %22401\n      %25155 = OpCompositeExtract %int %20125 1\n      %19055 = OpShiftRightArithmetic %int %25155 %int_4\n      %11052 = OpIAdd %int %7939 %19055\n      %16898 = OpBitcast %int %8444\n      %14944 = OpIMul %int %11052 %16898\n      %25156 = OpCompositeExtract %int %20125 0\n      %20424 = OpShiftRightArithmetic %int %25156 %int_5\n      %18940 = OpIAdd %int %14944 %20424\n       %8797 = OpShiftLeftLogical %int %18940 %int_7\n      %11434 = OpBitwiseAnd %int %11255 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %25155 %int_1\n      %21364 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21364 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %25156 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17335 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17335 %uint_2\n      %13015 = OpShiftRightArithmetic %int %25155 %int_3\n       %9929 = OpBitwiseXor %int %13015 %19905\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %25156 %int_3\n      %20575 = OpBitwiseAnd %int %9616 %int_3\n      %21534 = OpShiftLeftLogical %int %16793 %int_1\n       %8891 = OpBitwiseXor %int %20575 %21534\n      %20599 = OpBitwiseAnd %int %25155 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6552\n       %7169 = OpShiftLeftLogical %int %16793 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24144 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24144 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21633 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21633\n      %14959 = OpShiftRightArithmetic %int %24144 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21634 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21634\n      %15497 = OpShiftRightArithmetic %int %24144 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %21237\n      %21237 = OpLabel\n      %11376 = OpPhi %uint %16870 %10574 %16869 %21373\n      %20616 = OpIAdd %uint %11376 %24237\n      %18675 = OpShiftRightLogical %uint %20616 %int_4\n      %12010 = OpIEqual %bool %19165 %uint_1\n      %22390 = OpIEqual %bool %19165 %uint_2\n      %22150 = OpLogicalOr %bool %12010 %22390\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %22009 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %22009 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22649 = OpPhi %v4uint %22009 %21237 %16376 %10583\n      %19638 = OpIEqual %bool %19165 %uint_3\n      %15139 = OpLogicalOr %bool %22390 %19638\n               OpSelectionMerge %11416 None\n               OpBranchConditional %15139 %11064 %11416\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22649 %749\n      %15335 = OpShiftRightLogical %v4uint %22649 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %11416\n      %11416 = OpLabel\n      %19767 = OpPhi %v4uint %22649 %13411 %10728 %11064\n      %24825 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_dest %int_0 %18675\n               OpStore %24825 %19767\n      %11726 = OpIAdd %uint %20616 %uint_32\n      %16881 = OpShiftRightLogical %uint %11726 %int_4\n               OpSelectionMerge %14874 None\n               OpBranchConditional %22150 %10584 %14874\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %8952 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %8952 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %14874\n      %14874 = OpLabel\n      %10926 = OpPhi %v4uint %8952 %11416 %16377 %10584\n               OpSelectionMerge %11417 None\n               OpBranchConditional %15139 %11065 %11417\n      %11065 = OpLabel\n      %24088 = OpShiftLeftLogical %v4uint %10926 %749\n      %15336 = OpShiftRightLogical %v4uint %10926 %749\n      %10729 = OpBitwiseOr %v4uint %24088 %15336\n               OpBranch %11417\n      %11417 = OpLabel\n      %19768 = OpPhi %v4uint %10926 %14874 %10729 %11065\n       %8053 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_dest %int_0 %16881\n               OpStore %8053 %19768\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t resolve_fast_32bpp_4xmsaa_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006274, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000008, 0x00000008, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x0000040B, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x00090006, 0x0000040B, 0x00000000, 0x725F6578,\n    0x6C6F7365, 0x655F6576, 0x6D617264, 0x666E695F, 0x0000006F, 0x000A0006,\n    0x0000040B, 0x00000001, 0x725F6578, 0x6C6F7365, 0x635F6576, 0x64726F6F,\n    0x74616E69, 0x6E695F65, 0x00006F66, 0x00090006, 0x0000040B, 0x00000002,\n    0x725F6578, 0x6C6F7365, 0x645F6576, 0x5F747365, 0x6F666E69, 0x00000000,\n    0x000B0006, 0x0000040B, 0x00000003, 0x725F6578, 0x6C6F7365, 0x645F6576,\n    0x5F747365, 0x726F6F63, 0x616E6964, 0x695F6574, 0x006F666E, 0x00090006,\n    0x0000040B, 0x00000004, 0x725F6578, 0x6C6F7365, 0x645F6576, 0x5F747365,\n    0x65736162, 0x00000000, 0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F,\n    0x5F737473, 0x00006578, 0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C,\n    0x766E496C, 0x7461636F, 0x496E6F69, 0x00000044, 0x00090005, 0x000007B4,\n    0x725F6578, 0x6C6F7365, 0x655F6576, 0x6D617264, 0x5F65785F, 0x636F6C62,\n    0x0000006B, 0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000,\n    0x00070005, 0x00000CC7, 0x725F6578, 0x6C6F7365, 0x655F6576, 0x6D617264,\n    0x00000000, 0x00090005, 0x000007B5, 0x725F6578, 0x6C6F7365, 0x645F6576,\n    0x5F747365, 0x625F6578, 0x6B636F6C, 0x00000000, 0x00050006, 0x000007B5,\n    0x00000000, 0x61746164, 0x00000000, 0x00060005, 0x00001592, 0x725F6578,\n    0x6C6F7365, 0x645F6576, 0x00747365, 0x00030047, 0x0000040B, 0x00000002,\n    0x00050048, 0x0000040B, 0x00000000, 0x00000023, 0x00000000, 0x00050048,\n    0x0000040B, 0x00000001, 0x00000023, 0x00000004, 0x00050048, 0x0000040B,\n    0x00000002, 0x00000023, 0x00000008, 0x00050048, 0x0000040B, 0x00000003,\n    0x00000023, 0x0000000C, 0x00050048, 0x0000040B, 0x00000004, 0x00000023,\n    0x00000010, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x00000CC7, 0x00000018,\n    0x00040047, 0x00000CC7, 0x00000021, 0x00000000, 0x00040047, 0x00000CC7,\n    0x00000022, 0x00000000, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x00001592, 0x00000019, 0x00040047, 0x00001592, 0x00000021,\n    0x00000000, 0x00040047, 0x00001592, 0x00000022, 0x00000001, 0x00040047,\n    0x00000AC7, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000017,\n    0x0000000B, 0x00000004, 0x00020014, 0x00000009, 0x00040015, 0x0000000C,\n    0x00000020, 0x00000001, 0x00040017, 0x00000012, 0x0000000C, 0x00000002,\n    0x00040017, 0x00000016, 0x0000000C, 0x00000003, 0x0004002B, 0x0000000B,\n    0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B, 0x00000A10, 0x00000002,\n    0x0004002B, 0x0000000B, 0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B,\n    0x00000A22, 0x00000008, 0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00,\n    0x0004002B, 0x0000000B, 0x00000A13, 0x00000003, 0x0004002B, 0x0000000B,\n    0x00000A3A, 0x00000010, 0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000,\n    0x0005002C, 0x00000011, 0x00000724, 0x00000A0D, 0x00000A0D, 0x0005002C,\n    0x00000011, 0x00000718, 0x00000A0D, 0x00000A0A, 0x0004002B, 0x0000000B,\n    0x00000AFA, 0x00000050, 0x0005002C, 0x00000011, 0x00000A9F, 0x00000AFA,\n    0x00000A3A, 0x0004002B, 0x0000000C, 0x00000A11, 0x00000002, 0x0004002B,\n    0x0000000C, 0x00000A17, 0x00000004, 0x0004002B, 0x0000000C, 0x00000A1D,\n    0x00000006, 0x0004002B, 0x0000000C, 0x00000A2C, 0x0000000B, 0x0004002B,\n    0x0000000C, 0x00000A38, 0x0000000F, 0x0004002B, 0x0000000C, 0x00000A0E,\n    0x00000001, 0x0004002B, 0x0000000C, 0x00000A1A, 0x00000005, 0x0004002B,\n    0x0000000C, 0x00000A20, 0x00000007, 0x0004002B, 0x0000000C, 0x00000A23,\n    0x00000008, 0x0004002B, 0x0000000C, 0x00000A2F, 0x0000000C, 0x0004002B,\n    0x0000000C, 0x00000A14, 0x00000003, 0x0004002B, 0x0000000C, 0x00000A0B,\n    0x00000000, 0x0007001E, 0x0000040B, 0x0000000B, 0x0000000B, 0x0000000B,\n    0x0000000B, 0x0000000B, 0x00040020, 0x00000688, 0x00000009, 0x0000040B,\n    0x0004003B, 0x00000688, 0x00000CE9, 0x00000009, 0x00040020, 0x00000288,\n    0x00000009, 0x0000000B, 0x0004002B, 0x0000000B, 0x00000A44, 0x000003FF,\n    0x0004002B, 0x0000000B, 0x00000A28, 0x0000000A, 0x0004002B, 0x0000000B,\n    0x00000AFE, 0x00001000, 0x0004002B, 0x0000000B, 0x00000A31, 0x0000000D,\n    0x0004002B, 0x0000000B, 0x00000A81, 0x000007FF, 0x0004002B, 0x0000000B,\n    0x00000A52, 0x00000018, 0x0004002B, 0x0000000B, 0x00000A37, 0x0000000F,\n    0x0004002B, 0x0000000B, 0x00000A5E, 0x0000001C, 0x0004002B, 0x0000000B,\n    0x00000A16, 0x00000004, 0x0005002C, 0x00000011, 0x0000073F, 0x00000A0A,\n    0x00000A16, 0x0004002B, 0x0000000B, 0x00000A19, 0x00000005, 0x0004002B,\n    0x0000000B, 0x00000A1F, 0x00000007, 0x0004002B, 0x0000000B, 0x00000926,\n    0x01000000, 0x0004002B, 0x0000000B, 0x00000A46, 0x00000014, 0x0005002C,\n    0x00000011, 0x000008E3, 0x00000A46, 0x00000A52, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x0004002B, 0x0000000B, 0x00000144, 0x000000FF,\n    0x0004002B, 0x0000000B, 0x00000B54, 0xC00FFC00, 0x00040020, 0x00000291,\n    0x00000001, 0x00000014, 0x0004003B, 0x00000291, 0x00000F48, 0x00000001,\n    0x00040020, 0x00000289, 0x00000001, 0x0000000B, 0x0005002C, 0x00000011,\n    0x0000072A, 0x00000A13, 0x00000A0A, 0x0003001D, 0x000007DC, 0x00000017,\n    0x0003001E, 0x000007B4, 0x000007DC, 0x00040020, 0x00000A32, 0x00000002,\n    0x000007B4, 0x0004003B, 0x00000A32, 0x00000CC7, 0x00000002, 0x00040020,\n    0x00000294, 0x00000002, 0x00000017, 0x0004002B, 0x0000000B, 0x00000A6A,\n    0x00000020, 0x0004002B, 0x0000000B, 0x00000A9A, 0x00000030, 0x0003001D,\n    0x000007DD, 0x00000017, 0x0003001E, 0x000007B5, 0x000007DD, 0x00040020,\n    0x00000A33, 0x00000002, 0x000007B5, 0x0004003B, 0x00000A33, 0x00001592,\n    0x00000002, 0x0006002C, 0x00000014, 0x00000AC7, 0x00000A22, 0x00000A22,\n    0x00000A0D, 0x0005002C, 0x00000011, 0x000007A2, 0x00000A37, 0x00000A0D,\n    0x0005002C, 0x00000011, 0x0000074E, 0x00000A13, 0x00000A13, 0x0005002C,\n    0x00000011, 0x0000084A, 0x00000A37, 0x00000A37, 0x0007002C, 0x00000017,\n    0x0000072E, 0x000005FD, 0x000005FD, 0x000005FD, 0x000005FD, 0x0007002C,\n    0x00000017, 0x0000064B, 0x00000144, 0x00000144, 0x00000144, 0x00000144,\n    0x0007002C, 0x00000017, 0x000002ED, 0x00000A3A, 0x00000A3A, 0x00000A3A,\n    0x00000A3A, 0x0007002C, 0x00000017, 0x00000930, 0x00000B54, 0x00000B54,\n    0x00000B54, 0x00000B54, 0x0007002C, 0x00000017, 0x000003A1, 0x00000A44,\n    0x00000A44, 0x00000A44, 0x00000A44, 0x0007002C, 0x00000017, 0x000003C5,\n    0x00000A46, 0x00000A46, 0x00000A46, 0x00000A46, 0x0007002C, 0x00000017,\n    0x000009CE, 0x000008A6, 0x000008A6, 0x000008A6, 0x000008A6, 0x0007002C,\n    0x00000017, 0x0000013D, 0x00000A22, 0x00000A22, 0x00000A22, 0x00000A22,\n    0x0004002B, 0x0000000B, 0x00000A82, 0x00000028, 0x0004002B, 0x0000000C,\n    0x00000A83, 0x00000028, 0x0004002B, 0x0000000C, 0x00000993, 0xFFFFFFD8,\n    0x0004002B, 0x0000000B, 0x00000184, 0x00000500, 0x0004002B, 0x0000000B,\n    0x0000086E, 0x00280000, 0x0003002A, 0x00000009, 0x00000787, 0x00050036,\n    0x00000008, 0x0000161F, 0x00000000, 0x00000502, 0x000200F8, 0x00003B06,\n    0x000300F7, 0x00004C7A, 0x00000000, 0x000300FB, 0x00000A0A, 0x00002E68,\n    0x000200F8, 0x00002E68, 0x00050041, 0x00000288, 0x000056E5, 0x00000CE9,\n    0x00000A0B, 0x0004003D, 0x0000000B, 0x00003D0B, 0x000056E5, 0x00050041,\n    0x00000288, 0x000058AC, 0x00000CE9, 0x00000A0E, 0x0004003D, 0x0000000B,\n    0x000051B7, 0x000058AC, 0x000500C7, 0x0000000B, 0x00004ADC, 0x00003D0B,\n    0x00000A44, 0x000500C7, 0x0000000B, 0x000055EF, 0x00003D0B, 0x00000AFE,\n    0x000500AB, 0x00000009, 0x0000500F, 0x000055EF, 0x00000A0A, 0x000500C2,\n    0x0000000B, 0x00002843, 0x00003D0B, 0x00000A31, 0x000500C7, 0x0000000B,\n    0x00005F72, 0x00002843, 0x00000A81, 0x000500C2, 0x0000000B, 0x00004994,\n    0x00003D0B, 0x00000A52, 0x000500C7, 0x0000000B, 0x000023AA, 0x00004994,\n    0x00000A37, 0x00050050, 0x00000011, 0x000022A7, 0x000051B7, 0x000051B7,\n    0x000500C2, 0x00000011, 0x00002568, 0x000022A7, 0x0000073F, 0x000500C7,\n    0x00000011, 0x00005B53, 0x00002568, 0x000007A2, 0x000500C4, 0x00000011,\n    0x00003F4F, 0x00005B53, 0x0000074E, 0x00050084, 0x00000011, 0x000059EB,\n    0x00003F4F, 0x00000724, 0x000500C2, 0x0000000B, 0x00003213, 0x000051B7,\n    0x00000A19, 0x000500C7, 0x0000000B, 0x00003F4C, 0x00003213, 0x00000A81,\n    0x00050041, 0x00000288, 0x0000492C, 0x00000CE9, 0x00000A11, 0x0004003D,\n    0x0000000B, 0x00005EAC, 0x0000492C, 0x00050041, 0x00000288, 0x000058AD,\n    0x00000CE9, 0x00000A14, 0x0004003D, 0x0000000B, 0x000051B8, 0x000058AD,\n    0x000500C7, 0x0000000B, 0x00004ADD, 0x00005EAC, 0x00000A1F, 0x000500C7,\n    0x0000000B, 0x000055F0, 0x00005EAC, 0x00000A22, 0x000500AB, 0x00000009,\n    0x00005010, 0x000055F0, 0x00000A0A, 0x000500C2, 0x0000000B, 0x000028A2,\n    0x00005EAC, 0x00000A16, 0x000500C7, 0x0000000B, 0x000059FD, 0x000028A2,\n    0x00000A1F, 0x000500C7, 0x0000000B, 0x00005A4E, 0x00005EAC, 0x00000926,\n    0x000500AB, 0x00000009, 0x00004C4F, 0x00005A4E, 0x00000A0A, 0x000500C7,\n    0x0000000B, 0x000020FC, 0x000051B8, 0x00000A44, 0x000500C2, 0x0000000B,\n    0x00002F90, 0x000051B8, 0x00000A28, 0x000500C7, 0x0000000B, 0x000061CE,\n    0x00002F90, 0x00000A44, 0x000500C4, 0x0000000B, 0x00006273, 0x000061CE,\n    0x00000A0E, 0x00050050, 0x00000011, 0x000028B6, 0x000051B8, 0x000051B8,\n    0x000500C2, 0x00000011, 0x00002891, 0x000028B6, 0x000008E3, 0x000500C7,\n    0x00000011, 0x00005B54, 0x00002891, 0x0000084A, 0x000500C4, 0x00000011,\n    0x00003F50, 0x00005B54, 0x0000074E, 0x00050084, 0x00000011, 0x000059EC,\n    0x00003F50, 0x00000724, 0x000500C2, 0x0000000B, 0x00003214, 0x000051B8,\n    0x00000A5E, 0x000500C7, 0x0000000B, 0x00003F4D, 0x00003214, 0x00000A1F,\n    0x00050041, 0x00000288, 0x0000492D, 0x00000CE9, 0x00000A17, 0x0004003D,\n    0x0000000B, 0x00005EAD, 0x0000492D, 0x00050041, 0x00000289, 0x000056D1,\n    0x00000F48, 0x00000A0A, 0x0004003D, 0x0000000B, 0x00001BAD, 0x000056D1,\n    0x000500AE, 0x00000009, 0x00001CED, 0x00001BAD, 0x00003F4C, 0x000300F7,\n    0x00004427, 0x00000002, 0x000400FA, 0x00001CED, 0x000055E8, 0x00004427,\n    0x000200F8, 0x000055E8, 0x000200F9, 0x00004C7A, 0x000200F8, 0x00004427,\n    0x0004003D, 0x00000014, 0x0000392D, 0x00000F48, 0x0007004F, 0x00000011,\n    0x00004849, 0x0000392D, 0x0000392D, 0x00000000, 0x00000001, 0x000500C4,\n    0x00000011, 0x00002670, 0x00004849, 0x0000072A, 0x00050051, 0x0000000B,\n    0x00005FB2, 0x00002670, 0x00000000, 0x00050051, 0x0000000B, 0x00001BEE,\n    0x00002670, 0x00000001, 0x0007000C, 0x0000000B, 0x00005F7E, 0x00000001,\n    0x00000029, 0x00001BEE, 0x00000A0A, 0x00050050, 0x00000011, 0x000051EF,\n    0x00005FB2, 0x00005F7E, 0x00050080, 0x00000011, 0x0000522C, 0x000051EF,\n    0x000059EB, 0x000500B2, 0x00000009, 0x00003ECB, 0x00003F4D, 0x00000A13,\n    0x000300F7, 0x00001AFD, 0x00000000, 0x000400FA, 0x00003ECB, 0x00002AEE,\n    0x00003AEF, 0x000200F8, 0x00003AEF, 0x000500AA, 0x00000009, 0x000034FE,\n    0x00003F4D, 0x00000A19, 0x000600A9, 0x0000000B, 0x000020F6, 0x000034FE,\n    0x00000A10, 0x00000A0A, 0x000200F9, 0x00001AFD, 0x000200F8, 0x00002AEE,\n    0x000200F9, 0x00001AFD, 0x000200F8, 0x00001AFD, 0x000700F5, 0x0000000B,\n    0x00004085, 0x00003F4D, 0x00002AEE, 0x000020F6, 0x00003AEF, 0x000500C4,\n    0x00000011, 0x00002BC1, 0x0000522C, 0x00000724, 0x00050050, 0x00000011,\n    0x000054BD, 0x00004085, 0x00004085, 0x000500C2, 0x00000011, 0x00002385,\n    0x000054BD, 0x00000718, 0x000500C7, 0x00000011, 0x00003EEE, 0x00002385,\n    0x00000724, 0x00050080, 0x00000011, 0x00004573, 0x00002BC1, 0x00003EEE,\n    0x00050086, 0x00000011, 0x00005ECE, 0x00004573, 0x00000A9F, 0x00050051,\n    0x0000000B, 0x00003048, 0x00005ECE, 0x00000001, 0x00050084, 0x0000000B,\n    0x00002B26, 0x00003048, 0x00004ADC, 0x00050051, 0x0000000B, 0x00006059,\n    0x00005ECE, 0x00000000, 0x00050080, 0x0000000B, 0x00005420, 0x00002B26,\n    0x00006059, 0x00050080, 0x0000000B, 0x00002226, 0x00005F72, 0x00005420,\n    0x00050084, 0x00000011, 0x0000193B, 0x00005ECE, 0x00000A9F, 0x00050082,\n    0x00000011, 0x000037C7, 0x00004573, 0x0000193B, 0x000300F7, 0x00004D0D,\n    0x00000000, 0x000400FA, 0x0000500F, 0x0000293E, 0x00004D0D, 0x000200F8,\n    0x0000293E, 0x00050051, 0x0000000B, 0x00002E0F, 0x000037C7, 0x00000000,\n    0x0004007C, 0x0000000C, 0x00006195, 0x00002E0F, 0x000500AE, 0x00000009,\n    0x00001EA1, 0x00002E0F, 0x00000A82, 0x000600A9, 0x0000000C, 0x00005828,\n    0x00001EA1, 0x00000993, 0x00000A83, 0x00050080, 0x0000000C, 0x00002DF8,\n    0x00006195, 0x00005828, 0x0004007C, 0x0000000B, 0x00001F87, 0x00002DF8,\n    0x00060052, 0x00000011, 0x00005446, 0x00001F87, 0x000037C7, 0x00000000,\n    0x000200F9, 0x00004D0D, 0x000200F8, 0x00004D0D, 0x000700F5, 0x00000011,\n    0x00002159, 0x000037C7, 0x00001AFD, 0x00005446, 0x0000293E, 0x00050084,\n    0x0000000B, 0x00001A0F, 0x00002226, 0x00000184, 0x00050051, 0x0000000B,\n    0x00003644, 0x00002159, 0x00000001, 0x00050084, 0x0000000B, 0x00003E12,\n    0x00003644, 0x00000AFA, 0x00050051, 0x0000000B, 0x0000605A, 0x00002159,\n    0x00000000, 0x00050080, 0x0000000B, 0x0000547F, 0x00003E12, 0x0000605A,\n    0x00050080, 0x0000000B, 0x000023AB, 0x00001A0F, 0x0000547F, 0x00050089,\n    0x0000000B, 0x00002675, 0x000023AB, 0x0000086E, 0x000500C4, 0x0000000B,\n    0x0000193D, 0x00002675, 0x00000A11, 0x000500AB, 0x00000009, 0x0000202E,\n    0x00003F4D, 0x00000A10, 0x000300F7, 0x000033DC, 0x00000000, 0x000400FA,\n    0x0000202E, 0x00004032, 0x000033DC, 0x000200F8, 0x00004032, 0x000500AB,\n    0x00000009, 0x00002959, 0x00003F4D, 0x00000A13, 0x000200F9, 0x000033DC,\n    0x000200F8, 0x000033DC, 0x000700F5, 0x00000009, 0x00002AAC, 0x0000202E,\n    0x00004D0D, 0x00002959, 0x00004032, 0x000300F7, 0x00004F23, 0x00000002,\n    0x000400FA, 0x00002AAC, 0x000019BF, 0x000022FF, 0x000200F8, 0x000022FF,\n    0x000500C2, 0x0000000B, 0x00005630, 0x0000193D, 0x00000A17, 0x00060041,\n    0x00000294, 0x000030BC, 0x00000CC7, 0x00000A0B, 0x00005630, 0x0004003D,\n    0x00000017, 0x00005234, 0x000030BC, 0x00050051, 0x0000000B, 0x00004F4C,\n    0x00005234, 0x00000001, 0x00050051, 0x0000000B, 0x0000447B, 0x00005234,\n    0x00000003, 0x00050080, 0x0000000B, 0x00003DE1, 0x0000193D, 0x00000A3A,\n    0x000500C2, 0x0000000B, 0x00006136, 0x00003DE1, 0x00000A17, 0x00060041,\n    0x00000294, 0x00004914, 0x00000CC7, 0x00000A0B, 0x00006136, 0x0004003D,\n    0x00000017, 0x00005235, 0x00004914, 0x00050051, 0x0000000B, 0x00004BBC,\n    0x00005235, 0x00000001, 0x00050051, 0x0000000B, 0x00006005, 0x00005235,\n    0x00000003, 0x00070050, 0x00000017, 0x0000268D, 0x00004F4C, 0x0000447B,\n    0x00004BBC, 0x00006005, 0x00050080, 0x0000000B, 0x00003EDA, 0x0000193D,\n    0x00000A6A, 0x000500C2, 0x0000000B, 0x0000202D, 0x00003EDA, 0x00000A17,\n    0x00060041, 0x00000294, 0x00004915, 0x00000CC7, 0x00000A0B, 0x0000202D,\n    0x0004003D, 0x00000017, 0x00005236, 0x00004915, 0x00050051, 0x0000000B,\n    0x00004F4D, 0x00005236, 0x00000001, 0x00050051, 0x0000000B, 0x0000447C,\n    0x00005236, 0x00000003, 0x00050080, 0x0000000B, 0x00003DE2, 0x0000193D,\n    0x00000A9A, 0x000500C2, 0x0000000B, 0x00006137, 0x00003DE2, 0x00000A17,\n    0x00060041, 0x00000294, 0x00004916, 0x00000CC7, 0x00000A0B, 0x00006137,\n    0x0004003D, 0x00000017, 0x00005237, 0x00004916, 0x00050051, 0x0000000B,\n    0x00004BBD, 0x00005237, 0x00000001, 0x00050051, 0x0000000B, 0x00001E81,\n    0x00005237, 0x00000003, 0x00070050, 0x00000017, 0x00002349, 0x00004F4D,\n    0x0000447C, 0x00004BBD, 0x00001E81, 0x000200F9, 0x00004F23, 0x000200F8,\n    0x000019BF, 0x000500C2, 0x0000000B, 0x00005FA6, 0x0000193D, 0x00000A17,\n    0x00060041, 0x00000294, 0x000030BD, 0x00000CC7, 0x00000A0B, 0x00005FA6,\n    0x0004003D, 0x00000017, 0x00005238, 0x000030BD, 0x00050051, 0x0000000B,\n    0x00004F4E, 0x00005238, 0x00000000, 0x00050051, 0x0000000B, 0x0000447D,\n    0x00005238, 0x00000002, 0x00050080, 0x0000000B, 0x00003DE3, 0x0000193D,\n    0x00000A3A, 0x000500C2, 0x0000000B, 0x00006138, 0x00003DE3, 0x00000A17,\n    0x00060041, 0x00000294, 0x00004917, 0x00000CC7, 0x00000A0B, 0x00006138,\n    0x0004003D, 0x00000017, 0x00005239, 0x00004917, 0x00050051, 0x0000000B,\n    0x00004BBE, 0x00005239, 0x00000000, 0x00050051, 0x0000000B, 0x00006006,\n    0x00005239, 0x00000002, 0x00070050, 0x00000017, 0x0000268E, 0x00004F4E,\n    0x0000447D, 0x00004BBE, 0x00006006, 0x00050080, 0x0000000B, 0x00003EDB,\n    0x0000193D, 0x00000A6A, 0x000500C2, 0x0000000B, 0x0000202F, 0x00003EDB,\n    0x00000A17, 0x00060041, 0x00000294, 0x00004918, 0x00000CC7, 0x00000A0B,\n    0x0000202F, 0x0004003D, 0x00000017, 0x0000523A, 0x00004918, 0x00050051,\n    0x0000000B, 0x00004F4F, 0x0000523A, 0x00000000, 0x00050051, 0x0000000B,\n    0x0000447E, 0x0000523A, 0x00000002, 0x00050080, 0x0000000B, 0x00003DE4,\n    0x0000193D, 0x00000A9A, 0x000500C2, 0x0000000B, 0x00006139, 0x00003DE4,\n    0x00000A17, 0x00060041, 0x00000294, 0x00004919, 0x00000CC7, 0x00000A0B,\n    0x00006139, 0x0004003D, 0x00000017, 0x0000523B, 0x00004919, 0x00050051,\n    0x0000000B, 0x00004BBF, 0x0000523B, 0x00000000, 0x00050051, 0x0000000B,\n    0x00001E82, 0x0000523B, 0x00000002, 0x00070050, 0x00000017, 0x0000234A,\n    0x00004F4F, 0x0000447E, 0x00004BBF, 0x00001E82, 0x000200F9, 0x00004F23,\n    0x000200F8, 0x00004F23, 0x000700F5, 0x00000017, 0x00002616, 0x0000234A,\n    0x000019BF, 0x00002349, 0x000022FF, 0x000700F5, 0x00000017, 0x000033CD,\n    0x0000268E, 0x000019BF, 0x0000268D, 0x000022FF, 0x000500AA, 0x00000009,\n    0x00004DD8, 0x00005FB2, 0x00000A0A, 0x000600A9, 0x00000009, 0x000056E6,\n    0x00004DD8, 0x00000787, 0x00004DD8, 0x000300F7, 0x00005596, 0x00000002,\n    0x000400FA, 0x000056E6, 0x00002620, 0x00005596, 0x000200F8, 0x00002620,\n    0x00050051, 0x0000000B, 0x00005002, 0x000033CD, 0x00000001, 0x00060052,\n    0x00000017, 0x000037FF, 0x00005002, 0x000033CD, 0x00000000, 0x000200F9,\n    0x00005596, 0x000200F8, 0x00005596, 0x000700F5, 0x00000017, 0x00002AAD,\n    0x000033CD, 0x00004F23, 0x000037FF, 0x00002620, 0x000300F7, 0x0000530F,\n    0x00000002, 0x000400FA, 0x00004C4F, 0x0000577B, 0x0000530F, 0x000200F8,\n    0x0000577B, 0x000300F7, 0x000039F4, 0x00000000, 0x000F00FB, 0x000023AA,\n    0x000039F4, 0x00000000, 0x000055A0, 0x00000001, 0x000055A0, 0x00000002,\n    0x00002897, 0x00000003, 0x00002897, 0x0000000A, 0x00002897, 0x0000000C,\n    0x00002897, 0x000200F8, 0x00002897, 0x000500C7, 0x00000017, 0x00003BA9,\n    0x00002AAD, 0x00000930, 0x000500C7, 0x00000017, 0x00005C0C, 0x00002AAD,\n    0x000003A1, 0x000500C4, 0x00000017, 0x00006105, 0x00005C0C, 0x000003C5,\n    0x000500C5, 0x00000017, 0x00004655, 0x00003BA9, 0x00006105, 0x000500C2,\n    0x00000017, 0x00005A82, 0x00002AAD, 0x000003C5, 0x000500C7, 0x00000017,\n    0x0000192A, 0x00005A82, 0x000003A1, 0x000500C5, 0x00000017, 0x00003CE5,\n    0x00004655, 0x0000192A, 0x000500C7, 0x00000017, 0x00004C3F, 0x00002616,\n    0x00000930, 0x000500C7, 0x00000017, 0x0000461A, 0x00002616, 0x000003A1,\n    0x000500C4, 0x00000017, 0x00006106, 0x0000461A, 0x000003C5, 0x000500C5,\n    0x00000017, 0x00004656, 0x00004C3F, 0x00006106, 0x000500C2, 0x00000017,\n    0x00005A83, 0x00002616, 0x000003C5, 0x000500C7, 0x00000017, 0x00001CE0,\n    0x00005A83, 0x000003A1, 0x000500C5, 0x00000017, 0x00001EBE, 0x00004656,\n    0x00001CE0, 0x000200F9, 0x000039F4, 0x000200F8, 0x000055A0, 0x000500C7,\n    0x00000017, 0x00004E95, 0x00002AAD, 0x0000072E, 0x000500C7, 0x00000017,\n    0x00005C0D, 0x00002AAD, 0x0000064B, 0x000500C4, 0x00000017, 0x00006107,\n    0x00005C0D, 0x000002ED, 0x000500C5, 0x00000017, 0x00004657, 0x00004E95,\n    0x00006107, 0x000500C2, 0x00000017, 0x00005A84, 0x00002AAD, 0x000002ED,\n    0x000500C7, 0x00000017, 0x0000192B, 0x00005A84, 0x0000064B, 0x000500C5,\n    0x00000017, 0x00003CE6, 0x00004657, 0x0000192B, 0x000500C7, 0x00000017,\n    0x00004C40, 0x00002616, 0x0000072E, 0x000500C7, 0x00000017, 0x0000461B,\n    0x00002616, 0x0000064B, 0x000500C4, 0x00000017, 0x00006108, 0x0000461B,\n    0x000002ED, 0x000500C5, 0x00000017, 0x00004658, 0x00004C40, 0x00006108,\n    0x000500C2, 0x00000017, 0x00005A85, 0x00002616, 0x000002ED, 0x000500C7,\n    0x00000017, 0x00001CE1, 0x00005A85, 0x0000064B, 0x000500C5, 0x00000017,\n    0x00001EBF, 0x00004658, 0x00001CE1, 0x000200F9, 0x000039F4, 0x000200F8,\n    0x000039F4, 0x000900F5, 0x00000017, 0x00002BF3, 0x00002616, 0x0000577B,\n    0x00001EBF, 0x000055A0, 0x00001EBE, 0x00002897, 0x000900F5, 0x00000017,\n    0x0000358D, 0x00002AAD, 0x0000577B, 0x00003CE6, 0x000055A0, 0x00003CE5,\n    0x00002897, 0x000200F9, 0x0000530F, 0x000200F8, 0x0000530F, 0x000700F5,\n    0x00000017, 0x000022F8, 0x00002616, 0x00005596, 0x00002BF3, 0x000039F4,\n    0x000700F5, 0x00000017, 0x000055F9, 0x00002AAD, 0x00005596, 0x0000358D,\n    0x000039F4, 0x00050080, 0x00000011, 0x00001C97, 0x00002670, 0x000059EC,\n    0x000300F7, 0x000052F5, 0x00000002, 0x000400FA, 0x00005010, 0x0000294E,\n    0x0000537D, 0x000200F8, 0x0000537D, 0x0004007C, 0x00000012, 0x00002970,\n    0x00001C97, 0x00050051, 0x0000000C, 0x000045F3, 0x00002970, 0x00000001,\n    0x000500C3, 0x0000000C, 0x00004DC0, 0x000045F3, 0x00000A1A, 0x0004007C,\n    0x0000000C, 0x00005780, 0x000020FC, 0x00050084, 0x0000000C, 0x00001F02,\n    0x00004DC0, 0x00005780, 0x00050051, 0x0000000C, 0x00006242, 0x00002970,\n    0x00000000, 0x000500C3, 0x0000000C, 0x00004FC7, 0x00006242, 0x00000A1A,\n    0x00050080, 0x0000000C, 0x000049B0, 0x00001F02, 0x00004FC7, 0x000500C4,\n    0x0000000C, 0x0000254A, 0x000049B0, 0x00000A1D, 0x000500C3, 0x0000000C,\n    0x0000603B, 0x000045F3, 0x00000A0E, 0x000500C7, 0x0000000C, 0x0000539A,\n    0x0000603B, 0x00000A20, 0x000500C4, 0x0000000C, 0x0000534A, 0x0000539A,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x00004EA5, 0x00006242, 0x00000A20,\n    0x000500C5, 0x0000000C, 0x00002B1A, 0x0000534A, 0x00004EA5, 0x000500C5,\n    0x0000000C, 0x000043B6, 0x0000254A, 0x00002B1A, 0x000500C4, 0x0000000C,\n    0x00005E63, 0x000043B6, 0x00000A10, 0x000500C3, 0x0000000C, 0x000031DE,\n    0x000045F3, 0x00000A17, 0x000500C7, 0x0000000C, 0x00005447, 0x000031DE,\n    0x00000A0E, 0x000500C3, 0x0000000C, 0x000028A6, 0x00006242, 0x00000A14,\n    0x000500C7, 0x0000000C, 0x0000511E, 0x000028A6, 0x00000A14, 0x000500C3,\n    0x0000000C, 0x000028B9, 0x000045F3, 0x00000A14, 0x000500C7, 0x0000000C,\n    0x0000505E, 0x000028B9, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000541D,\n    0x0000505E, 0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BA, 0x0000511E,\n    0x0000541D, 0x000500C7, 0x0000000C, 0x00005076, 0x000045F3, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x00005228, 0x00005076, 0x00000A17, 0x000500C4,\n    0x0000000C, 0x00001997, 0x000022BA, 0x00000A1D, 0x000500C5, 0x0000000C,\n    0x000047FE, 0x00005228, 0x00001997, 0x000500C4, 0x0000000C, 0x00001C00,\n    0x00005447, 0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C81, 0x000047FE,\n    0x00001C00, 0x000500C7, 0x0000000C, 0x000050AF, 0x00005E63, 0x00000A38,\n    0x000500C5, 0x0000000C, 0x00003C70, 0x00003C81, 0x000050AF, 0x000500C3,\n    0x0000000C, 0x00003745, 0x00005E63, 0x00000A17, 0x000500C7, 0x0000000C,\n    0x000018B8, 0x00003745, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000547E,\n    0x000018B8, 0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A8, 0x00003C70,\n    0x0000547E, 0x000500C3, 0x0000000C, 0x00003A6E, 0x00005E63, 0x00000A1A,\n    0x000500C7, 0x0000000C, 0x000018B9, 0x00003A6E, 0x00000A20, 0x000500C4,\n    0x0000000C, 0x00005480, 0x000018B9, 0x00000A23, 0x000500C5, 0x0000000C,\n    0x0000456F, 0x000045A8, 0x00005480, 0x000500C3, 0x0000000C, 0x00003C88,\n    0x00005E63, 0x00000A23, 0x000500C4, 0x0000000C, 0x00002824, 0x00003C88,\n    0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B79, 0x0000456F, 0x00002824,\n    0x0004007C, 0x0000000B, 0x000041E5, 0x00003B79, 0x000200F9, 0x000052F5,\n    0x000200F8, 0x0000294E, 0x00050051, 0x0000000B, 0x00004D9A, 0x00001C97,\n    0x00000000, 0x00050051, 0x0000000B, 0x00002C03, 0x00001C97, 0x00000001,\n    0x00060050, 0x00000014, 0x000020DE, 0x00004D9A, 0x00002C03, 0x000059FD,\n    0x0004007C, 0x00000016, 0x00004E9D, 0x000020DE, 0x00050051, 0x0000000C,\n    0x00002BF7, 0x00004E9D, 0x00000002, 0x000500C3, 0x0000000C, 0x00004DC1,\n    0x00002BF7, 0x00000A11, 0x0004007C, 0x0000000C, 0x00005781, 0x00006273,\n    0x00050084, 0x0000000C, 0x00001F03, 0x00004DC1, 0x00005781, 0x00050051,\n    0x0000000C, 0x00006243, 0x00004E9D, 0x00000001, 0x000500C3, 0x0000000C,\n    0x00004A6F, 0x00006243, 0x00000A17, 0x00050080, 0x0000000C, 0x00002B2C,\n    0x00001F03, 0x00004A6F, 0x0004007C, 0x0000000C, 0x00004202, 0x000020FC,\n    0x00050084, 0x0000000C, 0x00003A60, 0x00002B2C, 0x00004202, 0x00050051,\n    0x0000000C, 0x00006244, 0x00004E9D, 0x00000000, 0x000500C3, 0x0000000C,\n    0x00004FC8, 0x00006244, 0x00000A1A, 0x00050080, 0x0000000C, 0x000049FC,\n    0x00003A60, 0x00004FC8, 0x000500C4, 0x0000000C, 0x0000225D, 0x000049FC,\n    0x00000A20, 0x000500C7, 0x0000000C, 0x00002CAA, 0x00002BF7, 0x00000A14,\n    0x000500C4, 0x0000000C, 0x00004CAE, 0x00002CAA, 0x00000A1A, 0x000500C3,\n    0x0000000C, 0x0000383E, 0x00006243, 0x00000A0E, 0x000500C7, 0x0000000C,\n    0x00005374, 0x0000383E, 0x00000A14, 0x000500C4, 0x0000000C, 0x000054CA,\n    0x00005374, 0x00000A14, 0x000500C5, 0x0000000C, 0x000042CE, 0x00004CAE,\n    0x000054CA, 0x000500C7, 0x0000000C, 0x000050D5, 0x00006244, 0x00000A20,\n    0x000500C5, 0x0000000C, 0x00003ADD, 0x000042CE, 0x000050D5, 0x000500C5,\n    0x0000000C, 0x000043B7, 0x0000225D, 0x00003ADD, 0x000500C4, 0x0000000C,\n    0x00005E50, 0x000043B7, 0x00000A10, 0x000500C3, 0x0000000C, 0x000032D7,\n    0x00006243, 0x00000A14, 0x000500C6, 0x0000000C, 0x000026C9, 0x000032D7,\n    0x00004DC1, 0x000500C7, 0x0000000C, 0x00004199, 0x000026C9, 0x00000A0E,\n    0x000500C3, 0x0000000C, 0x00002590, 0x00006244, 0x00000A14, 0x000500C7,\n    0x0000000C, 0x0000505F, 0x00002590, 0x00000A14, 0x000500C4, 0x0000000C,\n    0x0000541E, 0x00004199, 0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BB,\n    0x0000505F, 0x0000541E, 0x000500C7, 0x0000000C, 0x00005077, 0x00006243,\n    0x00000A0E, 0x000500C4, 0x0000000C, 0x00005229, 0x00005077, 0x00000A17,\n    0x000500C4, 0x0000000C, 0x00001998, 0x000022BB, 0x00000A1D, 0x000500C5,\n    0x0000000C, 0x000047FF, 0x00005229, 0x00001998, 0x000500C4, 0x0000000C,\n    0x00001C01, 0x00004199, 0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C82,\n    0x000047FF, 0x00001C01, 0x000500C7, 0x0000000C, 0x000050B0, 0x00005E50,\n    0x00000A38, 0x000500C5, 0x0000000C, 0x00003C71, 0x00003C82, 0x000050B0,\n    0x000500C3, 0x0000000C, 0x00003746, 0x00005E50, 0x00000A17, 0x000500C7,\n    0x0000000C, 0x000018BA, 0x00003746, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x00005481, 0x000018BA, 0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A9,\n    0x00003C71, 0x00005481, 0x000500C3, 0x0000000C, 0x00003A6F, 0x00005E50,\n    0x00000A1A, 0x000500C7, 0x0000000C, 0x000018BB, 0x00003A6F, 0x00000A20,\n    0x000500C4, 0x0000000C, 0x00005482, 0x000018BB, 0x00000A23, 0x000500C5,\n    0x0000000C, 0x00004570, 0x000045A9, 0x00005482, 0x000500C3, 0x0000000C,\n    0x00003C89, 0x00005E50, 0x00000A23, 0x000500C4, 0x0000000C, 0x00002825,\n    0x00003C89, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B7A, 0x00004570,\n    0x00002825, 0x0004007C, 0x0000000B, 0x000041E6, 0x00003B7A, 0x000200F9,\n    0x000052F5, 0x000200F8, 0x000052F5, 0x000700F5, 0x0000000B, 0x00002C70,\n    0x000041E6, 0x0000294E, 0x000041E5, 0x0000537D, 0x00050080, 0x0000000B,\n    0x00005088, 0x00002C70, 0x00005EAD, 0x000500C2, 0x0000000B, 0x000048F3,\n    0x00005088, 0x00000A17, 0x000500AA, 0x00000009, 0x00002EEA, 0x00004ADD,\n    0x00000A0D, 0x000500AA, 0x00000009, 0x00005776, 0x00004ADD, 0x00000A10,\n    0x000500A6, 0x00000009, 0x00005686, 0x00002EEA, 0x00005776, 0x000300F7,\n    0x00003463, 0x00000000, 0x000400FA, 0x00005686, 0x00002957, 0x00003463,\n    0x000200F8, 0x00002957, 0x000500C7, 0x00000017, 0x0000475F, 0x000055F9,\n    0x000009CE, 0x000500C4, 0x00000017, 0x000024D1, 0x0000475F, 0x0000013D,\n    0x000500C7, 0x00000017, 0x000050AC, 0x000055F9, 0x0000072E, 0x000500C2,\n    0x00000017, 0x0000448D, 0x000050AC, 0x0000013D, 0x000500C5, 0x00000017,\n    0x00003FF8, 0x000024D1, 0x0000448D, 0x000200F9, 0x00003463, 0x000200F8,\n    0x00003463, 0x000700F5, 0x00000017, 0x00005879, 0x000055F9, 0x000052F5,\n    0x00003FF8, 0x00002957, 0x000500AA, 0x00000009, 0x00004CB6, 0x00004ADD,\n    0x00000A13, 0x000500A6, 0x00000009, 0x00003B23, 0x00005776, 0x00004CB6,\n    0x000300F7, 0x00002C98, 0x00000000, 0x000400FA, 0x00003B23, 0x00002B38,\n    0x00002C98, 0x000200F8, 0x00002B38, 0x000500C4, 0x00000017, 0x00005E17,\n    0x00005879, 0x000002ED, 0x000500C2, 0x00000017, 0x00003BE7, 0x00005879,\n    0x000002ED, 0x000500C5, 0x00000017, 0x000029E8, 0x00005E17, 0x00003BE7,\n    0x000200F9, 0x00002C98, 0x000200F8, 0x00002C98, 0x000700F5, 0x00000017,\n    0x00004D37, 0x00005879, 0x00003463, 0x000029E8, 0x00002B38, 0x00060041,\n    0x00000294, 0x000060F9, 0x00001592, 0x00000A0B, 0x000048F3, 0x0003003E,\n    0x000060F9, 0x00004D37, 0x00050080, 0x0000000B, 0x00002DCE, 0x00005088,\n    0x00000A6A, 0x000500C2, 0x0000000B, 0x000041F1, 0x00002DCE, 0x00000A17,\n    0x000300F7, 0x00003A1A, 0x00000000, 0x000400FA, 0x00005686, 0x00002958,\n    0x00003A1A, 0x000200F8, 0x00002958, 0x000500C7, 0x00000017, 0x00004760,\n    0x000022F8, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D2, 0x00004760,\n    0x0000013D, 0x000500C7, 0x00000017, 0x000050AD, 0x000022F8, 0x0000072E,\n    0x000500C2, 0x00000017, 0x0000448E, 0x000050AD, 0x0000013D, 0x000500C5,\n    0x00000017, 0x00003FF9, 0x000024D2, 0x0000448E, 0x000200F9, 0x00003A1A,\n    0x000200F8, 0x00003A1A, 0x000700F5, 0x00000017, 0x00002AAE, 0x000022F8,\n    0x00002C98, 0x00003FF9, 0x00002958, 0x000300F7, 0x00002C99, 0x00000000,\n    0x000400FA, 0x00003B23, 0x00002B39, 0x00002C99, 0x000200F8, 0x00002B39,\n    0x000500C4, 0x00000017, 0x00005E18, 0x00002AAE, 0x000002ED, 0x000500C2,\n    0x00000017, 0x00003BE8, 0x00002AAE, 0x000002ED, 0x000500C5, 0x00000017,\n    0x000029E9, 0x00005E18, 0x00003BE8, 0x000200F9, 0x00002C99, 0x000200F8,\n    0x00002C99, 0x000700F5, 0x00000017, 0x00004D38, 0x00002AAE, 0x00003A1A,\n    0x000029E9, 0x00002B39, 0x00060041, 0x00000294, 0x00001F75, 0x00001592,\n    0x00000A0B, 0x000041F1, 0x0003003E, 0x00001F75, 0x00004D38, 0x000200F9,\n    0x00004C7A, 0x000200F8, 0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/resolve_fast_32bpp_4xmsaa_scaled_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25204\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 8 8 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_resolve_edram_info\"\n               OpMemberName %push_const_block_xe 1 \"xe_resolve_coordinate_info\"\n               OpMemberName %push_const_block_xe 2 \"xe_resolve_dest_info\"\n               OpMemberName %push_const_block_xe 3 \"xe_resolve_dest_coordinate_info\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_resolve_edram_xe_block \"xe_resolve_edram_xe_block\"\n               OpMemberName %xe_resolve_edram_xe_block 0 \"data\"\n               OpName %xe_resolve_edram \"xe_resolve_edram\"\n               OpName %xe_resolve_dest_xe_block \"xe_resolve_dest_xe_block\"\n               OpMemberName %xe_resolve_dest_xe_block 0 \"data\"\n               OpName %xe_resolve_dest \"xe_resolve_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_resolve_edram_xe_block BufferBlock\n               OpMemberDecorate %xe_resolve_edram_xe_block 0 NonWritable\n               OpMemberDecorate %xe_resolve_edram_xe_block 0 Offset 0\n               OpDecorate %xe_resolve_edram NonWritable\n               OpDecorate %xe_resolve_edram Binding 0\n               OpDecorate %xe_resolve_edram DescriptorSet 0\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_resolve_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_resolve_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_resolve_dest_xe_block 0 Offset 0\n               OpDecorate %xe_resolve_dest NonReadable\n               OpDecorate %xe_resolve_dest Binding 0\n               OpDecorate %xe_resolve_dest DescriptorSet 1\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n     %v4uint = OpTypeVector %uint 4\n       %bool = OpTypeBool\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n     %uint_1 = OpConstant %uint 1\n     %uint_2 = OpConstant %uint 2\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n     %uint_3 = OpConstant %uint 3\n    %uint_16 = OpConstant %uint 16\n     %uint_0 = OpConstant %uint 0\n       %1807 = OpConstantComposite %v2uint %uint_0 %uint_0\n       %1828 = OpConstantComposite %v2uint %uint_1 %uint_1\n       %1816 = OpConstantComposite %v2uint %uint_1 %uint_0\n    %uint_80 = OpConstant %uint 80\n       %2719 = OpConstantComposite %v2uint %uint_80 %uint_16\n  %uint_2048 = OpConstant %uint 2048\n      %int_2 = OpConstant %int 2\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n      %int_3 = OpConstant %int 3\n     %uint_5 = OpConstant %uint 5\n     %uint_4 = OpConstant %uint 4\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n  %uint_1023 = OpConstant %uint 1023\n    %uint_10 = OpConstant %uint 10\n  %uint_4096 = OpConstant %uint 4096\n    %uint_13 = OpConstant %uint 13\n  %uint_2047 = OpConstant %uint 2047\n    %uint_24 = OpConstant %uint 24\n    %uint_15 = OpConstant %uint 15\n    %uint_28 = OpConstant %uint 28\n    %uint_19 = OpConstant %uint 19\n       %2179 = OpConstantComposite %v2uint %uint_16 %uint_19\n     %uint_7 = OpConstant %uint 7\n%uint_536870912 = OpConstant %uint 536870912\n       %1855 = OpConstantComposite %v2uint %uint_0 %uint_4\n       %1856 = OpConstantComposite %v2uint %uint_4 %uint_1\n%uint_16777216 = OpConstant %uint 16777216\n    %uint_20 = OpConstant %uint 20\n       %2275 = OpConstantComposite %v2uint %uint_20 %uint_24\n     %v3uint = OpTypeVector %uint 3\n   %uint_255 = OpConstant %uint 255\n%uint_3222273024 = OpConstant %uint 3222273024\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n%_ptr_Input_uint = OpTypePointer Input %uint\n       %1834 = OpConstantComposite %v2uint %uint_3 %uint_0\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_resolve_edram_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_resolve_edram_xe_block = OpTypePointer Uniform %xe_resolve_edram_xe_block\n%xe_resolve_edram = OpVariable %_ptr_Uniform_xe_resolve_edram_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n    %uint_32 = OpConstant %uint 32\n    %uint_48 = OpConstant %uint 48\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_resolve_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_resolve_dest_xe_block = OpTypePointer Uniform %xe_resolve_dest_xe_block\n%xe_resolve_dest = OpVariable %_ptr_Uniform_xe_resolve_dest_xe_block Uniform\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_8 %uint_8 %uint_1\n       %1954 = OpConstantComposite %v2uint %uint_7 %uint_7\n       %1955 = OpConstantComposite %v2uint %uint_15 %uint_1\n       %1870 = OpConstantComposite %v2uint %uint_3 %uint_3\n       %2122 = OpConstantComposite %v2uint %uint_15 %uint_15\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n       %1611 = OpConstantComposite %v4uint %uint_255 %uint_255 %uint_255 %uint_255\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n       %2352 = OpConstantComposite %v4uint %uint_3222273024 %uint_3222273024 %uint_3222273024 %uint_3222273024\n        %929 = OpConstantComposite %v4uint %uint_1023 %uint_1023 %uint_1023 %uint_1023\n        %965 = OpConstantComposite %v4uint %uint_20 %uint_20 %uint_20 %uint_20\n     %uint_6 = OpConstant %uint 6\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %22245 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %15627 = OpLoad %uint %22245\n      %22700 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %20919 = OpLoad %uint %22700\n      %19164 = OpBitwiseAnd %uint %15627 %uint_1023\n      %21999 = OpBitwiseAnd %uint %15627 %uint_4096\n      %20495 = OpINotEqual %bool %21999 %uint_0\n      %10307 = OpShiftRightLogical %uint %15627 %uint_13\n      %24434 = OpBitwiseAnd %uint %10307 %uint_2047\n      %18836 = OpShiftRightLogical %uint %15627 %uint_24\n       %9130 = OpBitwiseAnd %uint %18836 %uint_15\n       %8871 = OpCompositeConstruct %v2uint %20919 %20919\n       %9633 = OpShiftRightLogical %v2uint %8871 %2179\n      %23601 = OpBitwiseAnd %v2uint %9633 %1954\n      %24030 = OpBitwiseAnd %uint %15627 %uint_536870912\n      %12295 = OpINotEqual %bool %24030 %uint_0\n               OpSelectionMerge %14676 None\n               OpBranchConditional %12295 %16739 %21992\n      %21992 = OpLabel\n               OpBranch %14676\n      %16739 = OpLabel\n      %15278 = OpShiftRightLogical %v2uint %23601 %1828\n               OpBranch %14676\n      %14676 = OpLabel\n      %19124 = OpPhi %v2uint %15278 %16739 %1807 %21992\n       %7038 = OpShiftRightLogical %v2uint %8871 %1855\n      %11769 = OpBitwiseAnd %v2uint %7038 %1955\n      %16207 = OpShiftLeftLogical %v2uint %11769 %1870\n      %23019 = OpIMul %v2uint %16207 %23601\n      %13123 = OpShiftRightLogical %uint %20919 %uint_5\n      %14785 = OpBitwiseAnd %uint %13123 %uint_2047\n       %8858 = OpCompositeExtract %uint %23601 0\n      %22993 = OpIMul %uint %14785 %8858\n      %20036 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %18628 = OpLoad %uint %20036\n      %22701 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %20920 = OpLoad %uint %22701\n      %19165 = OpBitwiseAnd %uint %18628 %uint_7\n      %22000 = OpBitwiseAnd %uint %18628 %uint_8\n      %20496 = OpINotEqual %bool %22000 %uint_0\n      %10402 = OpShiftRightLogical %uint %18628 %uint_4\n      %23037 = OpBitwiseAnd %uint %10402 %uint_7\n      %23118 = OpBitwiseAnd %uint %18628 %uint_16777216\n      %19535 = OpINotEqual %bool %23118 %uint_0\n       %8444 = OpBitwiseAnd %uint %20920 %uint_1023\n      %12176 = OpShiftRightLogical %uint %20920 %uint_10\n      %25038 = OpBitwiseAnd %uint %12176 %uint_1023\n      %25203 = OpShiftLeftLogical %uint %25038 %int_1\n      %10422 = OpCompositeConstruct %v2uint %20920 %20920\n      %10385 = OpShiftRightLogical %v2uint %10422 %2275\n      %23379 = OpBitwiseAnd %v2uint %10385 %2122\n      %16208 = OpShiftLeftLogical %v2uint %23379 %1870\n      %23020 = OpIMul %v2uint %16208 %23601\n      %12819 = OpShiftRightLogical %uint %20920 %uint_28\n      %16204 = OpBitwiseAnd %uint %12819 %uint_7\n      %20803 = OpAccessChain %_ptr_Input_uint %gl_GlobalInvocationID %uint_0\n       %8913 = OpLoad %uint %20803\n       %7405 = OpUGreaterThanEqual %bool %8913 %22993\n               OpSelectionMerge %17447 DontFlatten\n               OpBranchConditional %7405 %21993 %17447\n      %21993 = OpLabel\n               OpBranch %19578\n      %17447 = OpLabel\n      %14637 = OpLoad %v3uint %gl_GlobalInvocationID\n      %18505 = OpVectorShuffle %v2uint %14637 %14637 0 1\n       %9840 = OpShiftLeftLogical %v2uint %18505 %1834\n       %6697 = OpCompositeExtract %uint %9840 0\n      %18425 = OpCompositeExtract %uint %9840 1\n      %14186 = OpCompositeExtract %uint %19124 1\n      %24446 = OpExtInst %uint %1 UMax %18425 %14186\n      %20975 = OpCompositeConstruct %v2uint %6697 %24446\n      %21036 = OpIAdd %v2uint %20975 %23019\n      %16075 = OpULessThanEqual %bool %16204 %uint_3\n               OpSelectionMerge %6909 None\n               OpBranchConditional %16075 %10990 %15087\n      %15087 = OpLabel\n      %13566 = OpIEqual %bool %16204 %uint_5\n       %8438 = OpSelect %uint %13566 %uint_2 %uint_0\n               OpBranch %6909\n      %10990 = OpLabel\n               OpBranch %6909\n       %6909 = OpLabel\n      %16517 = OpPhi %uint %16204 %10990 %8438 %15087\n      %11201 = OpShiftLeftLogical %v2uint %21036 %1828\n      %21693 = OpCompositeConstruct %v2uint %16517 %16517\n       %9093 = OpShiftRightLogical %v2uint %21693 %1816\n      %16072 = OpBitwiseAnd %v2uint %9093 %1828\n      %19132 = OpIAdd %v2uint %11201 %16072\n      %11447 = OpIMul %v2uint %2719 %23601\n       %7983 = OpUDiv %v2uint %19132 %11447\n       %9129 = OpCompositeExtract %uint %7983 1\n      %11046 = OpIMul %uint %9129 %19164\n      %24665 = OpCompositeExtract %uint %7983 0\n      %21536 = OpIAdd %uint %11046 %24665\n       %8742 = OpIAdd %uint %24434 %21536\n       %6459 = OpIMul %v2uint %7983 %11447\n      %14279 = OpISub %v2uint %19132 %6459\n               OpSelectionMerge %18756 None\n               OpBranchConditional %20495 %11888 %18756\n      %11888 = OpLabel\n      %16985 = OpCompositeExtract %uint %11447 0\n      %13307 = OpShiftRightLogical %uint %16985 %uint_1\n      %22207 = OpCompositeExtract %uint %14279 0\n      %15197 = OpBitcast %int %22207\n      %15736 = OpUGreaterThanEqual %bool %22207 %13307\n               OpSelectionMerge %22850 None\n               OpBranchConditional %15736 %23061 %24565\n      %24565 = OpLabel\n      %20693 = OpBitcast %int %13307\n               OpBranch %22850\n      %23061 = OpLabel\n      %18885 = OpBitcast %int %13307\n      %17199 = OpSNegate %int %18885\n               OpBranch %22850\n      %22850 = OpLabel\n      %10046 = OpPhi %int %17199 %23061 %20693 %24565\n      %11983 = OpIAdd %int %15197 %10046\n      %17709 = OpBitcast %uint %11983\n      %21574 = OpCompositeInsert %v2uint %17709 %14279 0\n               OpBranch %18756\n      %18756 = OpLabel\n      %17360 = OpPhi %v2uint %14279 %6909 %21574 %22850\n      %24023 = OpCompositeExtract %uint %11447 0\n      %22303 = OpCompositeExtract %uint %11447 1\n      %13170 = OpIMul %uint %24023 %22303\n      %15520 = OpIMul %uint %8742 %13170\n      %16084 = OpCompositeExtract %uint %17360 1\n      %15890 = OpIMul %uint %16084 %24023\n      %24666 = OpCompositeExtract %uint %17360 0\n      %21537 = OpIAdd %uint %15890 %24666\n       %8875 = OpIAdd %uint %15520 %21537\n      %23350 = OpIMul %uint %13170 %uint_2048\n      %21463 = OpUMod %uint %8875 %23350\n       %9687 = OpShiftLeftLogical %uint %21463 %int_2\n       %8238 = OpINotEqual %bool %16204 %uint_2\n               OpSelectionMerge %13276 None\n               OpBranchConditional %8238 %16434 %13276\n      %16434 = OpLabel\n      %10585 = OpINotEqual %bool %16204 %uint_3\n               OpBranch %13276\n      %13276 = OpLabel\n      %10924 = OpPhi %bool %8238 %18756 %10585 %16434\n               OpSelectionMerge %20259 DontFlatten\n               OpBranchConditional %10924 %6591 %8959\n       %8959 = OpLabel\n      %22064 = OpShiftRightLogical %uint %9687 %int_4\n      %12476 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_edram %int_0 %22064\n      %21044 = OpLoad %v4uint %12476\n      %20300 = OpCompositeExtract %uint %21044 1\n      %17531 = OpCompositeExtract %uint %21044 3\n      %15841 = OpIAdd %uint %9687 %uint_16\n      %24886 = OpShiftRightLogical %uint %15841 %int_4\n      %18708 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_edram %int_0 %24886\n      %21045 = OpLoad %v4uint %18708\n      %19388 = OpCompositeExtract %uint %21045 1\n      %24581 = OpCompositeExtract %uint %21045 3\n       %9869 = OpCompositeConstruct %v4uint %20300 %17531 %19388 %24581\n      %16090 = OpIAdd %uint %9687 %uint_32\n       %8237 = OpShiftRightLogical %uint %16090 %int_4\n      %18709 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_edram %int_0 %8237\n      %21046 = OpLoad %v4uint %18709\n      %20301 = OpCompositeExtract %uint %21046 1\n      %17532 = OpCompositeExtract %uint %21046 3\n      %15842 = OpIAdd %uint %9687 %uint_48\n      %24887 = OpShiftRightLogical %uint %15842 %int_4\n      %18710 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_edram %int_0 %24887\n      %21047 = OpLoad %v4uint %18710\n      %19389 = OpCompositeExtract %uint %21047 1\n       %7809 = OpCompositeExtract %uint %21047 3\n       %9033 = OpCompositeConstruct %v4uint %20301 %17532 %19389 %7809\n               OpBranch %20259\n       %6591 = OpLabel\n      %24486 = OpShiftRightLogical %uint %9687 %int_4\n      %12477 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_edram %int_0 %24486\n      %21048 = OpLoad %v4uint %12477\n      %20302 = OpCompositeExtract %uint %21048 0\n      %17533 = OpCompositeExtract %uint %21048 2\n      %15843 = OpIAdd %uint %9687 %uint_16\n      %24888 = OpShiftRightLogical %uint %15843 %int_4\n      %18711 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_edram %int_0 %24888\n      %21049 = OpLoad %v4uint %18711\n      %19390 = OpCompositeExtract %uint %21049 0\n      %24582 = OpCompositeExtract %uint %21049 2\n       %9870 = OpCompositeConstruct %v4uint %20302 %17533 %19390 %24582\n      %16091 = OpIAdd %uint %9687 %uint_32\n       %8239 = OpShiftRightLogical %uint %16091 %int_4\n      %18712 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_edram %int_0 %8239\n      %21050 = OpLoad %v4uint %18712\n      %20303 = OpCompositeExtract %uint %21050 0\n      %17534 = OpCompositeExtract %uint %21050 2\n      %15844 = OpIAdd %uint %9687 %uint_48\n      %24889 = OpShiftRightLogical %uint %15844 %int_4\n      %18713 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_edram %int_0 %24889\n      %21051 = OpLoad %v4uint %18713\n      %19391 = OpCompositeExtract %uint %21051 0\n       %7810 = OpCompositeExtract %uint %21051 2\n       %9034 = OpCompositeConstruct %v4uint %20303 %17534 %19391 %7810\n               OpBranch %20259\n      %20259 = OpLabel\n       %9750 = OpPhi %v4uint %9034 %6591 %9033 %8959\n      %14743 = OpPhi %v4uint %9870 %6591 %9869 %8959\n       %6491 = OpIEqual %bool %6697 %uint_0\n               OpSelectionMerge %13277 None\n               OpBranchConditional %6491 %11451 %13277\n      %11451 = OpLabel\n      %24156 = OpCompositeExtract %uint %19124 0\n      %22470 = OpINotEqual %bool %24156 %uint_0\n               OpBranch %13277\n      %13277 = OpLabel\n      %10925 = OpPhi %bool %6491 %20259 %22470 %11451\n               OpSelectionMerge %21910 DontFlatten\n               OpBranchConditional %10925 %11508 %21910\n      %11508 = OpLabel\n      %23599 = OpCompositeExtract %uint %19124 0\n      %17346 = OpUGreaterThanEqual %bool %23599 %uint_2\n               OpSelectionMerge %18758 None\n               OpBranchConditional %17346 %15877 %18758\n      %15877 = OpLabel\n      %24532 = OpUGreaterThanEqual %bool %23599 %uint_3\n               OpSelectionMerge %18757 None\n               OpBranchConditional %24532 %9760 %18757\n       %9760 = OpLabel\n      %20482 = OpCompositeExtract %uint %14743 3\n      %14335 = OpCompositeInsert %v4uint %20482 %14743 2\n               OpBranch %18757\n      %18757 = OpLabel\n      %17379 = OpPhi %v4uint %14743 %15877 %14335 %9760\n       %7002 = OpCompositeExtract %uint %17379 2\n      %15144 = OpCompositeInsert %v4uint %7002 %17379 1\n               OpBranch %18758\n      %18758 = OpLabel\n      %17380 = OpPhi %v4uint %14743 %11508 %15144 %18757\n       %7003 = OpCompositeExtract %uint %17380 1\n      %15145 = OpCompositeInsert %v4uint %7003 %17380 0\n               OpBranch %21910\n      %21910 = OpLabel\n      %10926 = OpPhi %v4uint %14743 %13277 %15145 %18758\n               OpSelectionMerge %21263 DontFlatten\n               OpBranchConditional %19535 %22395 %21263\n      %22395 = OpLabel\n               OpSelectionMerge %14836 None\n               OpSwitch %9130 %14836 0 %21920 1 %21920 2 %10391 3 %10391 10 %10391 12 %10391\n      %10391 = OpLabel\n      %15273 = OpBitwiseAnd %v4uint %10926 %2352\n      %23564 = OpBitwiseAnd %v4uint %10926 %929\n      %24837 = OpShiftLeftLogical %v4uint %23564 %965\n      %18005 = OpBitwiseOr %v4uint %15273 %24837\n      %23170 = OpShiftRightLogical %v4uint %10926 %965\n       %6442 = OpBitwiseAnd %v4uint %23170 %929\n      %15589 = OpBitwiseOr %v4uint %18005 %6442\n      %19519 = OpBitwiseAnd %v4uint %9750 %2352\n      %17946 = OpBitwiseAnd %v4uint %9750 %929\n      %24838 = OpShiftLeftLogical %v4uint %17946 %965\n      %18006 = OpBitwiseOr %v4uint %19519 %24838\n      %23171 = OpShiftRightLogical %v4uint %9750 %965\n       %7392 = OpBitwiseAnd %v4uint %23171 %929\n       %7870 = OpBitwiseOr %v4uint %18006 %7392\n               OpBranch %14836\n      %21920 = OpLabel\n      %20117 = OpBitwiseAnd %v4uint %10926 %1838\n      %23565 = OpBitwiseAnd %v4uint %10926 %1611\n      %24839 = OpShiftLeftLogical %v4uint %23565 %749\n      %18007 = OpBitwiseOr %v4uint %20117 %24839\n      %23172 = OpShiftRightLogical %v4uint %10926 %749\n       %6443 = OpBitwiseAnd %v4uint %23172 %1611\n      %15590 = OpBitwiseOr %v4uint %18007 %6443\n      %19520 = OpBitwiseAnd %v4uint %9750 %1838\n      %17947 = OpBitwiseAnd %v4uint %9750 %1611\n      %24840 = OpShiftLeftLogical %v4uint %17947 %749\n      %18008 = OpBitwiseOr %v4uint %19520 %24840\n      %23173 = OpShiftRightLogical %v4uint %9750 %749\n       %7393 = OpBitwiseAnd %v4uint %23173 %1611\n       %7871 = OpBitwiseOr %v4uint %18008 %7393\n               OpBranch %14836\n      %14836 = OpLabel\n      %11251 = OpPhi %v4uint %9750 %22395 %7871 %21920 %7870 %10391\n      %13709 = OpPhi %v4uint %10926 %22395 %15590 %21920 %15589 %10391\n               OpBranch %21263\n      %21263 = OpLabel\n       %8952 = OpPhi %v4uint %9750 %21910 %11251 %14836\n      %21002 = OpPhi %v4uint %10926 %21910 %13709 %14836\n      %14284 = OpIAdd %v2uint %9840 %23020\n      %24181 = OpShiftRightLogical %v2uint %14284 %1856\n       %7712 = OpUDiv %v2uint %24181 %23601\n      %18183 = OpIMul %v2uint %23601 %7712\n      %18273 = OpISub %v2uint %24181 %18183\n      %11232 = OpShiftLeftLogical %v2uint %7712 %1856\n      %13284 = OpCompositeExtract %uint %18273 0\n      %10872 = OpCompositeExtract %uint %23601 1\n      %22886 = OpIMul %uint %13284 %10872\n       %6943 = OpCompositeExtract %uint %18273 1\n      %10469 = OpIAdd %uint %22886 %6943\n      %18851 = OpBitwiseAnd %v2uint %14284 %1955\n      %10581 = OpShiftLeftLogical %uint %10469 %uint_7\n      %20916 = OpCompositeExtract %uint %18851 1\n      %23596 = OpShiftLeftLogical %uint %20916 %uint_6\n      %19814 = OpBitwiseOr %uint %10581 %23596\n      %21476 = OpCompositeExtract %uint %18851 0\n      %11714 = OpShiftLeftLogical %uint %21476 %uint_2\n      %11193 = OpBitwiseOr %uint %19814 %11714\n               OpSelectionMerge %21313 DontFlatten\n               OpBranchConditional %20496 %10574 %21373\n      %21373 = OpLabel\n      %10608 = OpBitcast %v2int %11232\n      %17907 = OpCompositeExtract %int %10608 1\n      %19904 = OpShiftRightArithmetic %int %17907 %int_5\n      %22400 = OpBitcast %int %8444\n       %7938 = OpIMul %int %19904 %22400\n      %25154 = OpCompositeExtract %int %10608 0\n      %20423 = OpShiftRightArithmetic %int %25154 %int_5\n      %18864 = OpIAdd %int %7938 %20423\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %17907 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25154 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17334 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17334 %uint_2\n      %12766 = OpShiftRightArithmetic %int %17907 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25154 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %17907 %int_3\n      %20574 = OpBitwiseAnd %int %10425 %int_1\n      %21533 = OpShiftLeftLogical %int %20574 %int_1\n       %8890 = OpBitwiseXor %int %20766 %21533\n      %20598 = OpBitwiseAnd %int %17907 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6551\n       %7168 = OpShiftLeftLogical %int %21575 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24163 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24163 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24163 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24163 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %21313\n      %10574 = OpLabel\n      %19866 = OpCompositeExtract %uint %11232 0\n      %11267 = OpCompositeExtract %uint %11232 1\n       %8414 = OpCompositeConstruct %v3uint %19866 %11267 %23037\n      %20125 = OpBitcast %v3int %8414\n      %11255 = OpCompositeExtract %int %20125 2\n      %19905 = OpShiftRightArithmetic %int %11255 %int_2\n      %22401 = OpBitcast %int %25203\n       %7939 = OpIMul %int %19905 %22401\n      %25155 = OpCompositeExtract %int %20125 1\n      %19055 = OpShiftRightArithmetic %int %25155 %int_4\n      %11052 = OpIAdd %int %7939 %19055\n      %16898 = OpBitcast %int %8444\n      %14944 = OpIMul %int %11052 %16898\n      %25156 = OpCompositeExtract %int %20125 0\n      %20424 = OpShiftRightArithmetic %int %25156 %int_5\n      %18940 = OpIAdd %int %14944 %20424\n       %8797 = OpShiftLeftLogical %int %18940 %int_7\n      %11434 = OpBitwiseAnd %int %11255 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %25155 %int_1\n      %21364 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21364 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20694 = OpBitwiseAnd %int %25156 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20694\n      %17335 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17335 %uint_2\n      %13015 = OpShiftRightArithmetic %int %25155 %int_3\n       %9929 = OpBitwiseXor %int %13015 %19905\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %25156 %int_3\n      %20575 = OpBitwiseAnd %int %9616 %int_3\n      %21534 = OpShiftLeftLogical %int %16793 %int_1\n       %8891 = OpBitwiseXor %int %20575 %21534\n      %20599 = OpBitwiseAnd %int %25155 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6552\n       %7169 = OpShiftLeftLogical %int %16793 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24144 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24144 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24144 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24144 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %21313\n      %21313 = OpLabel\n       %9506 = OpPhi %uint %16870 %10574 %16869 %21373\n      %16843 = OpIMul %uint %8858 %10872\n      %11993 = OpIMul %uint %9506 %16843\n      %16012 = OpIAdd %uint %11993 %11193\n      %20867 = OpShiftRightLogical %uint %16012 %int_4\n      %12010 = OpIEqual %bool %19165 %uint_1\n      %22390 = OpIEqual %bool %19165 %uint_2\n      %22150 = OpLogicalOr %bool %12010 %22390\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %21002 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %21002 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22649 = OpPhi %v4uint %21002 %21313 %16376 %10583\n      %19638 = OpIEqual %bool %19165 %uint_3\n      %15139 = OpLogicalOr %bool %22390 %19638\n               OpSelectionMerge %11416 None\n               OpBranchConditional %15139 %11064 %11416\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22649 %749\n      %15335 = OpShiftRightLogical %v4uint %22649 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %11416\n      %11416 = OpLabel\n      %19767 = OpPhi %v4uint %22649 %13411 %10728 %11064\n      %24825 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_dest %int_0 %20867\n               OpStore %24825 %19767\n      %11726 = OpIAdd %uint %16012 %uint_16\n      %16881 = OpShiftRightLogical %uint %11726 %int_4\n               OpSelectionMerge %14874 None\n               OpBranchConditional %22150 %10584 %14874\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %8952 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %8952 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %14874\n      %14874 = OpLabel\n      %10927 = OpPhi %v4uint %8952 %11416 %16377 %10584\n               OpSelectionMerge %11417 None\n               OpBranchConditional %15139 %11065 %11417\n      %11065 = OpLabel\n      %24088 = OpShiftLeftLogical %v4uint %10927 %749\n      %15336 = OpShiftRightLogical %v4uint %10927 %749\n      %10729 = OpBitwiseOr %v4uint %24088 %15336\n               OpBranch %11417\n      %11417 = OpLabel\n      %19768 = OpPhi %v4uint %10927 %14874 %10729 %11065\n       %8053 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_dest %int_0 %16881\n               OpStore %8053 %19768\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t resolve_fast_32bpp_4xmsaa_scaled_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006274, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000008, 0x00000008, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x000003F9, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x00090006, 0x000003F9, 0x00000000, 0x725F6578,\n    0x6C6F7365, 0x655F6576, 0x6D617264, 0x666E695F, 0x0000006F, 0x000A0006,\n    0x000003F9, 0x00000001, 0x725F6578, 0x6C6F7365, 0x635F6576, 0x64726F6F,\n    0x74616E69, 0x6E695F65, 0x00006F66, 0x00090006, 0x000003F9, 0x00000002,\n    0x725F6578, 0x6C6F7365, 0x645F6576, 0x5F747365, 0x6F666E69, 0x00000000,\n    0x000B0006, 0x000003F9, 0x00000003, 0x725F6578, 0x6C6F7365, 0x645F6576,\n    0x5F747365, 0x726F6F63, 0x616E6964, 0x695F6574, 0x006F666E, 0x00060005,\n    0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578, 0x00080005,\n    0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F, 0x496E6F69,\n    0x00000044, 0x00090005, 0x000007B4, 0x725F6578, 0x6C6F7365, 0x655F6576,\n    0x6D617264, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006, 0x000007B4,\n    0x00000000, 0x61746164, 0x00000000, 0x00070005, 0x00000CC7, 0x725F6578,\n    0x6C6F7365, 0x655F6576, 0x6D617264, 0x00000000, 0x00090005, 0x000007B5,\n    0x725F6578, 0x6C6F7365, 0x645F6576, 0x5F747365, 0x625F6578, 0x6B636F6C,\n    0x00000000, 0x00050006, 0x000007B5, 0x00000000, 0x61746164, 0x00000000,\n    0x00060005, 0x00001592, 0x725F6578, 0x6C6F7365, 0x645F6576, 0x00747365,\n    0x00030047, 0x000003F9, 0x00000002, 0x00050048, 0x000003F9, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x000003F9, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x000003F9, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x000003F9, 0x00000003, 0x00000023, 0x0000000C, 0x00040047,\n    0x00000F48, 0x0000000B, 0x0000001C, 0x00040047, 0x000007DC, 0x00000006,\n    0x00000010, 0x00030047, 0x000007B4, 0x00000003, 0x00040048, 0x000007B4,\n    0x00000000, 0x00000018, 0x00050048, 0x000007B4, 0x00000000, 0x00000023,\n    0x00000000, 0x00030047, 0x00000CC7, 0x00000018, 0x00040047, 0x00000CC7,\n    0x00000021, 0x00000000, 0x00040047, 0x00000CC7, 0x00000022, 0x00000000,\n    0x00040047, 0x000007DD, 0x00000006, 0x00000010, 0x00030047, 0x000007B5,\n    0x00000003, 0x00040048, 0x000007B5, 0x00000000, 0x00000019, 0x00050048,\n    0x000007B5, 0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x00001592,\n    0x00000019, 0x00040047, 0x00001592, 0x00000021, 0x00000000, 0x00040047,\n    0x00001592, 0x00000022, 0x00000001, 0x00040047, 0x00000AC7, 0x0000000B,\n    0x00000019, 0x00020013, 0x00000008, 0x00030021, 0x00000502, 0x00000008,\n    0x00040015, 0x0000000B, 0x00000020, 0x00000000, 0x00040017, 0x00000011,\n    0x0000000B, 0x00000002, 0x00040017, 0x00000017, 0x0000000B, 0x00000004,\n    0x00020014, 0x00000009, 0x00040015, 0x0000000C, 0x00000020, 0x00000001,\n    0x00040017, 0x00000012, 0x0000000C, 0x00000002, 0x00040017, 0x00000016,\n    0x0000000C, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001,\n    0x0004002B, 0x0000000B, 0x00000A10, 0x00000002, 0x0004002B, 0x0000000B,\n    0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B, 0x00000A22, 0x00000008,\n    0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00, 0x0004002B, 0x0000000B,\n    0x00000A13, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A3A, 0x00000010,\n    0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000, 0x0005002C, 0x00000011,\n    0x0000070F, 0x00000A0A, 0x00000A0A, 0x0005002C, 0x00000011, 0x00000724,\n    0x00000A0D, 0x00000A0D, 0x0005002C, 0x00000011, 0x00000718, 0x00000A0D,\n    0x00000A0A, 0x0004002B, 0x0000000B, 0x00000AFA, 0x00000050, 0x0005002C,\n    0x00000011, 0x00000A9F, 0x00000AFA, 0x00000A3A, 0x0004002B, 0x0000000B,\n    0x00000A84, 0x00000800, 0x0004002B, 0x0000000C, 0x00000A11, 0x00000002,\n    0x0004002B, 0x0000000C, 0x00000A17, 0x00000004, 0x0004002B, 0x0000000C,\n    0x00000A1D, 0x00000006, 0x0004002B, 0x0000000C, 0x00000A2C, 0x0000000B,\n    0x0004002B, 0x0000000C, 0x00000A38, 0x0000000F, 0x0004002B, 0x0000000C,\n    0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C, 0x00000A1A, 0x00000005,\n    0x0004002B, 0x0000000C, 0x00000A20, 0x00000007, 0x0004002B, 0x0000000C,\n    0x00000A23, 0x00000008, 0x0004002B, 0x0000000C, 0x00000A2F, 0x0000000C,\n    0x0004002B, 0x0000000C, 0x00000A14, 0x00000003, 0x0004002B, 0x0000000B,\n    0x00000A19, 0x00000005, 0x0004002B, 0x0000000B, 0x00000A16, 0x00000004,\n    0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000, 0x0006001E, 0x000003F9,\n    0x0000000B, 0x0000000B, 0x0000000B, 0x0000000B, 0x00040020, 0x00000676,\n    0x00000009, 0x000003F9, 0x0004003B, 0x00000676, 0x00000CE9, 0x00000009,\n    0x00040020, 0x00000288, 0x00000009, 0x0000000B, 0x0004002B, 0x0000000B,\n    0x00000A44, 0x000003FF, 0x0004002B, 0x0000000B, 0x00000A28, 0x0000000A,\n    0x0004002B, 0x0000000B, 0x00000AFE, 0x00001000, 0x0004002B, 0x0000000B,\n    0x00000A31, 0x0000000D, 0x0004002B, 0x0000000B, 0x00000A81, 0x000007FF,\n    0x0004002B, 0x0000000B, 0x00000A52, 0x00000018, 0x0004002B, 0x0000000B,\n    0x00000A37, 0x0000000F, 0x0004002B, 0x0000000B, 0x00000A5E, 0x0000001C,\n    0x0004002B, 0x0000000B, 0x00000A43, 0x00000013, 0x0005002C, 0x00000011,\n    0x00000883, 0x00000A3A, 0x00000A43, 0x0004002B, 0x0000000B, 0x00000A1F,\n    0x00000007, 0x0004002B, 0x0000000B, 0x00000510, 0x20000000, 0x0005002C,\n    0x00000011, 0x0000073F, 0x00000A0A, 0x00000A16, 0x0005002C, 0x00000011,\n    0x00000740, 0x00000A16, 0x00000A0D, 0x0004002B, 0x0000000B, 0x00000926,\n    0x01000000, 0x0004002B, 0x0000000B, 0x00000A46, 0x00000014, 0x0005002C,\n    0x00000011, 0x000008E3, 0x00000A46, 0x00000A52, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x0004002B, 0x0000000B, 0x00000144, 0x000000FF,\n    0x0004002B, 0x0000000B, 0x00000B54, 0xC00FFC00, 0x00040020, 0x00000291,\n    0x00000001, 0x00000014, 0x0004003B, 0x00000291, 0x00000F48, 0x00000001,\n    0x00040020, 0x00000289, 0x00000001, 0x0000000B, 0x0005002C, 0x00000011,\n    0x0000072A, 0x00000A13, 0x00000A0A, 0x0003001D, 0x000007DC, 0x00000017,\n    0x0003001E, 0x000007B4, 0x000007DC, 0x00040020, 0x00000A32, 0x00000002,\n    0x000007B4, 0x0004003B, 0x00000A32, 0x00000CC7, 0x00000002, 0x00040020,\n    0x00000294, 0x00000002, 0x00000017, 0x0004002B, 0x0000000B, 0x00000A6A,\n    0x00000020, 0x0004002B, 0x0000000B, 0x00000A9A, 0x00000030, 0x0003001D,\n    0x000007DD, 0x00000017, 0x0003001E, 0x000007B5, 0x000007DD, 0x00040020,\n    0x00000A33, 0x00000002, 0x000007B5, 0x0004003B, 0x00000A33, 0x00001592,\n    0x00000002, 0x0006002C, 0x00000014, 0x00000AC7, 0x00000A22, 0x00000A22,\n    0x00000A0D, 0x0005002C, 0x00000011, 0x000007A2, 0x00000A1F, 0x00000A1F,\n    0x0005002C, 0x00000011, 0x000007A3, 0x00000A37, 0x00000A0D, 0x0005002C,\n    0x00000011, 0x0000074E, 0x00000A13, 0x00000A13, 0x0005002C, 0x00000011,\n    0x0000084A, 0x00000A37, 0x00000A37, 0x0007002C, 0x00000017, 0x0000072E,\n    0x000005FD, 0x000005FD, 0x000005FD, 0x000005FD, 0x0007002C, 0x00000017,\n    0x0000064B, 0x00000144, 0x00000144, 0x00000144, 0x00000144, 0x0007002C,\n    0x00000017, 0x000002ED, 0x00000A3A, 0x00000A3A, 0x00000A3A, 0x00000A3A,\n    0x0007002C, 0x00000017, 0x00000930, 0x00000B54, 0x00000B54, 0x00000B54,\n    0x00000B54, 0x0007002C, 0x00000017, 0x000003A1, 0x00000A44, 0x00000A44,\n    0x00000A44, 0x00000A44, 0x0007002C, 0x00000017, 0x000003C5, 0x00000A46,\n    0x00000A46, 0x00000A46, 0x00000A46, 0x0004002B, 0x0000000B, 0x00000A1C,\n    0x00000006, 0x0007002C, 0x00000017, 0x000009CE, 0x000008A6, 0x000008A6,\n    0x000008A6, 0x000008A6, 0x0007002C, 0x00000017, 0x0000013D, 0x00000A22,\n    0x00000A22, 0x00000A22, 0x00000A22, 0x00050036, 0x00000008, 0x0000161F,\n    0x00000000, 0x00000502, 0x000200F8, 0x00003B06, 0x000300F7, 0x00004C7A,\n    0x00000000, 0x000300FB, 0x00000A0A, 0x00002E68, 0x000200F8, 0x00002E68,\n    0x00050041, 0x00000288, 0x000056E5, 0x00000CE9, 0x00000A0B, 0x0004003D,\n    0x0000000B, 0x00003D0B, 0x000056E5, 0x00050041, 0x00000288, 0x000058AC,\n    0x00000CE9, 0x00000A0E, 0x0004003D, 0x0000000B, 0x000051B7, 0x000058AC,\n    0x000500C7, 0x0000000B, 0x00004ADC, 0x00003D0B, 0x00000A44, 0x000500C7,\n    0x0000000B, 0x000055EF, 0x00003D0B, 0x00000AFE, 0x000500AB, 0x00000009,\n    0x0000500F, 0x000055EF, 0x00000A0A, 0x000500C2, 0x0000000B, 0x00002843,\n    0x00003D0B, 0x00000A31, 0x000500C7, 0x0000000B, 0x00005F72, 0x00002843,\n    0x00000A81, 0x000500C2, 0x0000000B, 0x00004994, 0x00003D0B, 0x00000A52,\n    0x000500C7, 0x0000000B, 0x000023AA, 0x00004994, 0x00000A37, 0x00050050,\n    0x00000011, 0x000022A7, 0x000051B7, 0x000051B7, 0x000500C2, 0x00000011,\n    0x000025A1, 0x000022A7, 0x00000883, 0x000500C7, 0x00000011, 0x00005C31,\n    0x000025A1, 0x000007A2, 0x000500C7, 0x0000000B, 0x00005DDE, 0x00003D0B,\n    0x00000510, 0x000500AB, 0x00000009, 0x00003007, 0x00005DDE, 0x00000A0A,\n    0x000300F7, 0x00003954, 0x00000000, 0x000400FA, 0x00003007, 0x00004163,\n    0x000055E8, 0x000200F8, 0x000055E8, 0x000200F9, 0x00003954, 0x000200F8,\n    0x00004163, 0x000500C2, 0x00000011, 0x00003BAE, 0x00005C31, 0x00000724,\n    0x000200F9, 0x00003954, 0x000200F8, 0x00003954, 0x000700F5, 0x00000011,\n    0x00004AB4, 0x00003BAE, 0x00004163, 0x0000070F, 0x000055E8, 0x000500C2,\n    0x00000011, 0x00001B7E, 0x000022A7, 0x0000073F, 0x000500C7, 0x00000011,\n    0x00002DF9, 0x00001B7E, 0x000007A3, 0x000500C4, 0x00000011, 0x00003F4F,\n    0x00002DF9, 0x0000074E, 0x00050084, 0x00000011, 0x000059EB, 0x00003F4F,\n    0x00005C31, 0x000500C2, 0x0000000B, 0x00003343, 0x000051B7, 0x00000A19,\n    0x000500C7, 0x0000000B, 0x000039C1, 0x00003343, 0x00000A81, 0x00050051,\n    0x0000000B, 0x0000229A, 0x00005C31, 0x00000000, 0x00050084, 0x0000000B,\n    0x000059D1, 0x000039C1, 0x0000229A, 0x00050041, 0x00000288, 0x00004E44,\n    0x00000CE9, 0x00000A11, 0x0004003D, 0x0000000B, 0x000048C4, 0x00004E44,\n    0x00050041, 0x00000288, 0x000058AD, 0x00000CE9, 0x00000A14, 0x0004003D,\n    0x0000000B, 0x000051B8, 0x000058AD, 0x000500C7, 0x0000000B, 0x00004ADD,\n    0x000048C4, 0x00000A1F, 0x000500C7, 0x0000000B, 0x000055F0, 0x000048C4,\n    0x00000A22, 0x000500AB, 0x00000009, 0x00005010, 0x000055F0, 0x00000A0A,\n    0x000500C2, 0x0000000B, 0x000028A2, 0x000048C4, 0x00000A16, 0x000500C7,\n    0x0000000B, 0x000059FD, 0x000028A2, 0x00000A1F, 0x000500C7, 0x0000000B,\n    0x00005A4E, 0x000048C4, 0x00000926, 0x000500AB, 0x00000009, 0x00004C4F,\n    0x00005A4E, 0x00000A0A, 0x000500C7, 0x0000000B, 0x000020FC, 0x000051B8,\n    0x00000A44, 0x000500C2, 0x0000000B, 0x00002F90, 0x000051B8, 0x00000A28,\n    0x000500C7, 0x0000000B, 0x000061CE, 0x00002F90, 0x00000A44, 0x000500C4,\n    0x0000000B, 0x00006273, 0x000061CE, 0x00000A0E, 0x00050050, 0x00000011,\n    0x000028B6, 0x000051B8, 0x000051B8, 0x000500C2, 0x00000011, 0x00002891,\n    0x000028B6, 0x000008E3, 0x000500C7, 0x00000011, 0x00005B53, 0x00002891,\n    0x0000084A, 0x000500C4, 0x00000011, 0x00003F50, 0x00005B53, 0x0000074E,\n    0x00050084, 0x00000011, 0x000059EC, 0x00003F50, 0x00005C31, 0x000500C2,\n    0x0000000B, 0x00003213, 0x000051B8, 0x00000A5E, 0x000500C7, 0x0000000B,\n    0x00003F4C, 0x00003213, 0x00000A1F, 0x00050041, 0x00000289, 0x00005143,\n    0x00000F48, 0x00000A0A, 0x0004003D, 0x0000000B, 0x000022D1, 0x00005143,\n    0x000500AE, 0x00000009, 0x00001CED, 0x000022D1, 0x000059D1, 0x000300F7,\n    0x00004427, 0x00000002, 0x000400FA, 0x00001CED, 0x000055E9, 0x00004427,\n    0x000200F8, 0x000055E9, 0x000200F9, 0x00004C7A, 0x000200F8, 0x00004427,\n    0x0004003D, 0x00000014, 0x0000392D, 0x00000F48, 0x0007004F, 0x00000011,\n    0x00004849, 0x0000392D, 0x0000392D, 0x00000000, 0x00000001, 0x000500C4,\n    0x00000011, 0x00002670, 0x00004849, 0x0000072A, 0x00050051, 0x0000000B,\n    0x00001A29, 0x00002670, 0x00000000, 0x00050051, 0x0000000B, 0x000047F9,\n    0x00002670, 0x00000001, 0x00050051, 0x0000000B, 0x0000376A, 0x00004AB4,\n    0x00000001, 0x0007000C, 0x0000000B, 0x00005F7E, 0x00000001, 0x00000029,\n    0x000047F9, 0x0000376A, 0x00050050, 0x00000011, 0x000051EF, 0x00001A29,\n    0x00005F7E, 0x00050080, 0x00000011, 0x0000522C, 0x000051EF, 0x000059EB,\n    0x000500B2, 0x00000009, 0x00003ECB, 0x00003F4C, 0x00000A13, 0x000300F7,\n    0x00001AFD, 0x00000000, 0x000400FA, 0x00003ECB, 0x00002AEE, 0x00003AEF,\n    0x000200F8, 0x00003AEF, 0x000500AA, 0x00000009, 0x000034FE, 0x00003F4C,\n    0x00000A19, 0x000600A9, 0x0000000B, 0x000020F6, 0x000034FE, 0x00000A10,\n    0x00000A0A, 0x000200F9, 0x00001AFD, 0x000200F8, 0x00002AEE, 0x000200F9,\n    0x00001AFD, 0x000200F8, 0x00001AFD, 0x000700F5, 0x0000000B, 0x00004085,\n    0x00003F4C, 0x00002AEE, 0x000020F6, 0x00003AEF, 0x000500C4, 0x00000011,\n    0x00002BC1, 0x0000522C, 0x00000724, 0x00050050, 0x00000011, 0x000054BD,\n    0x00004085, 0x00004085, 0x000500C2, 0x00000011, 0x00002385, 0x000054BD,\n    0x00000718, 0x000500C7, 0x00000011, 0x00003EC8, 0x00002385, 0x00000724,\n    0x00050080, 0x00000011, 0x00004ABC, 0x00002BC1, 0x00003EC8, 0x00050084,\n    0x00000011, 0x00002CB7, 0x00000A9F, 0x00005C31, 0x00050086, 0x00000011,\n    0x00001F2F, 0x00004ABC, 0x00002CB7, 0x00050051, 0x0000000B, 0x000023A9,\n    0x00001F2F, 0x00000001, 0x00050084, 0x0000000B, 0x00002B26, 0x000023A9,\n    0x00004ADC, 0x00050051, 0x0000000B, 0x00006059, 0x00001F2F, 0x00000000,\n    0x00050080, 0x0000000B, 0x00005420, 0x00002B26, 0x00006059, 0x00050080,\n    0x0000000B, 0x00002226, 0x00005F72, 0x00005420, 0x00050084, 0x00000011,\n    0x0000193B, 0x00001F2F, 0x00002CB7, 0x00050082, 0x00000011, 0x000037C7,\n    0x00004ABC, 0x0000193B, 0x000300F7, 0x00004944, 0x00000000, 0x000400FA,\n    0x0000500F, 0x00002E70, 0x00004944, 0x000200F8, 0x00002E70, 0x00050051,\n    0x0000000B, 0x00004259, 0x00002CB7, 0x00000000, 0x000500C2, 0x0000000B,\n    0x000033FB, 0x00004259, 0x00000A0D, 0x00050051, 0x0000000B, 0x000056BF,\n    0x000037C7, 0x00000000, 0x0004007C, 0x0000000C, 0x00003B5D, 0x000056BF,\n    0x000500AE, 0x00000009, 0x00003D78, 0x000056BF, 0x000033FB, 0x000300F7,\n    0x00005942, 0x00000000, 0x000400FA, 0x00003D78, 0x00005A15, 0x00005FF5,\n    0x000200F8, 0x00005FF5, 0x0004007C, 0x0000000C, 0x000050D5, 0x000033FB,\n    0x000200F9, 0x00005942, 0x000200F8, 0x00005A15, 0x0004007C, 0x0000000C,\n    0x000049C5, 0x000033FB, 0x0004007E, 0x0000000C, 0x0000432F, 0x000049C5,\n    0x000200F9, 0x00005942, 0x000200F8, 0x00005942, 0x000700F5, 0x0000000C,\n    0x0000273E, 0x0000432F, 0x00005A15, 0x000050D5, 0x00005FF5, 0x00050080,\n    0x0000000C, 0x00002ECF, 0x00003B5D, 0x0000273E, 0x0004007C, 0x0000000B,\n    0x0000452D, 0x00002ECF, 0x00060052, 0x00000011, 0x00005446, 0x0000452D,\n    0x000037C7, 0x00000000, 0x000200F9, 0x00004944, 0x000200F8, 0x00004944,\n    0x000700F5, 0x00000011, 0x000043D0, 0x000037C7, 0x00001AFD, 0x00005446,\n    0x00005942, 0x00050051, 0x0000000B, 0x00005DD7, 0x00002CB7, 0x00000000,\n    0x00050051, 0x0000000B, 0x0000571F, 0x00002CB7, 0x00000001, 0x00050084,\n    0x0000000B, 0x00003372, 0x00005DD7, 0x0000571F, 0x00050084, 0x0000000B,\n    0x00003CA0, 0x00002226, 0x00003372, 0x00050051, 0x0000000B, 0x00003ED4,\n    0x000043D0, 0x00000001, 0x00050084, 0x0000000B, 0x00003E12, 0x00003ED4,\n    0x00005DD7, 0x00050051, 0x0000000B, 0x0000605A, 0x000043D0, 0x00000000,\n    0x00050080, 0x0000000B, 0x00005421, 0x00003E12, 0x0000605A, 0x00050080,\n    0x0000000B, 0x000022AB, 0x00003CA0, 0x00005421, 0x00050084, 0x0000000B,\n    0x00005B36, 0x00003372, 0x00000A84, 0x00050089, 0x0000000B, 0x000053D7,\n    0x000022AB, 0x00005B36, 0x000500C4, 0x0000000B, 0x000025D7, 0x000053D7,\n    0x00000A11, 0x000500AB, 0x00000009, 0x0000202E, 0x00003F4C, 0x00000A10,\n    0x000300F7, 0x000033DC, 0x00000000, 0x000400FA, 0x0000202E, 0x00004032,\n    0x000033DC, 0x000200F8, 0x00004032, 0x000500AB, 0x00000009, 0x00002959,\n    0x00003F4C, 0x00000A13, 0x000200F9, 0x000033DC, 0x000200F8, 0x000033DC,\n    0x000700F5, 0x00000009, 0x00002AAC, 0x0000202E, 0x00004944, 0x00002959,\n    0x00004032, 0x000300F7, 0x00004F23, 0x00000002, 0x000400FA, 0x00002AAC,\n    0x000019BF, 0x000022FF, 0x000200F8, 0x000022FF, 0x000500C2, 0x0000000B,\n    0x00005630, 0x000025D7, 0x00000A17, 0x00060041, 0x00000294, 0x000030BC,\n    0x00000CC7, 0x00000A0B, 0x00005630, 0x0004003D, 0x00000017, 0x00005234,\n    0x000030BC, 0x00050051, 0x0000000B, 0x00004F4C, 0x00005234, 0x00000001,\n    0x00050051, 0x0000000B, 0x0000447B, 0x00005234, 0x00000003, 0x00050080,\n    0x0000000B, 0x00003DE1, 0x000025D7, 0x00000A3A, 0x000500C2, 0x0000000B,\n    0x00006136, 0x00003DE1, 0x00000A17, 0x00060041, 0x00000294, 0x00004914,\n    0x00000CC7, 0x00000A0B, 0x00006136, 0x0004003D, 0x00000017, 0x00005235,\n    0x00004914, 0x00050051, 0x0000000B, 0x00004BBC, 0x00005235, 0x00000001,\n    0x00050051, 0x0000000B, 0x00006005, 0x00005235, 0x00000003, 0x00070050,\n    0x00000017, 0x0000268D, 0x00004F4C, 0x0000447B, 0x00004BBC, 0x00006005,\n    0x00050080, 0x0000000B, 0x00003EDA, 0x000025D7, 0x00000A6A, 0x000500C2,\n    0x0000000B, 0x0000202D, 0x00003EDA, 0x00000A17, 0x00060041, 0x00000294,\n    0x00004915, 0x00000CC7, 0x00000A0B, 0x0000202D, 0x0004003D, 0x00000017,\n    0x00005236, 0x00004915, 0x00050051, 0x0000000B, 0x00004F4D, 0x00005236,\n    0x00000001, 0x00050051, 0x0000000B, 0x0000447C, 0x00005236, 0x00000003,\n    0x00050080, 0x0000000B, 0x00003DE2, 0x000025D7, 0x00000A9A, 0x000500C2,\n    0x0000000B, 0x00006137, 0x00003DE2, 0x00000A17, 0x00060041, 0x00000294,\n    0x00004916, 0x00000CC7, 0x00000A0B, 0x00006137, 0x0004003D, 0x00000017,\n    0x00005237, 0x00004916, 0x00050051, 0x0000000B, 0x00004BBD, 0x00005237,\n    0x00000001, 0x00050051, 0x0000000B, 0x00001E81, 0x00005237, 0x00000003,\n    0x00070050, 0x00000017, 0x00002349, 0x00004F4D, 0x0000447C, 0x00004BBD,\n    0x00001E81, 0x000200F9, 0x00004F23, 0x000200F8, 0x000019BF, 0x000500C2,\n    0x0000000B, 0x00005FA6, 0x000025D7, 0x00000A17, 0x00060041, 0x00000294,\n    0x000030BD, 0x00000CC7, 0x00000A0B, 0x00005FA6, 0x0004003D, 0x00000017,\n    0x00005238, 0x000030BD, 0x00050051, 0x0000000B, 0x00004F4E, 0x00005238,\n    0x00000000, 0x00050051, 0x0000000B, 0x0000447D, 0x00005238, 0x00000002,\n    0x00050080, 0x0000000B, 0x00003DE3, 0x000025D7, 0x00000A3A, 0x000500C2,\n    0x0000000B, 0x00006138, 0x00003DE3, 0x00000A17, 0x00060041, 0x00000294,\n    0x00004917, 0x00000CC7, 0x00000A0B, 0x00006138, 0x0004003D, 0x00000017,\n    0x00005239, 0x00004917, 0x00050051, 0x0000000B, 0x00004BBE, 0x00005239,\n    0x00000000, 0x00050051, 0x0000000B, 0x00006006, 0x00005239, 0x00000002,\n    0x00070050, 0x00000017, 0x0000268E, 0x00004F4E, 0x0000447D, 0x00004BBE,\n    0x00006006, 0x00050080, 0x0000000B, 0x00003EDB, 0x000025D7, 0x00000A6A,\n    0x000500C2, 0x0000000B, 0x0000202F, 0x00003EDB, 0x00000A17, 0x00060041,\n    0x00000294, 0x00004918, 0x00000CC7, 0x00000A0B, 0x0000202F, 0x0004003D,\n    0x00000017, 0x0000523A, 0x00004918, 0x00050051, 0x0000000B, 0x00004F4F,\n    0x0000523A, 0x00000000, 0x00050051, 0x0000000B, 0x0000447E, 0x0000523A,\n    0x00000002, 0x00050080, 0x0000000B, 0x00003DE4, 0x000025D7, 0x00000A9A,\n    0x000500C2, 0x0000000B, 0x00006139, 0x00003DE4, 0x00000A17, 0x00060041,\n    0x00000294, 0x00004919, 0x00000CC7, 0x00000A0B, 0x00006139, 0x0004003D,\n    0x00000017, 0x0000523B, 0x00004919, 0x00050051, 0x0000000B, 0x00004BBF,\n    0x0000523B, 0x00000000, 0x00050051, 0x0000000B, 0x00001E82, 0x0000523B,\n    0x00000002, 0x00070050, 0x00000017, 0x0000234A, 0x00004F4F, 0x0000447E,\n    0x00004BBF, 0x00001E82, 0x000200F9, 0x00004F23, 0x000200F8, 0x00004F23,\n    0x000700F5, 0x00000017, 0x00002616, 0x0000234A, 0x000019BF, 0x00002349,\n    0x000022FF, 0x000700F5, 0x00000017, 0x00003997, 0x0000268E, 0x000019BF,\n    0x0000268D, 0x000022FF, 0x000500AA, 0x00000009, 0x0000195B, 0x00001A29,\n    0x00000A0A, 0x000300F7, 0x000033DD, 0x00000000, 0x000400FA, 0x0000195B,\n    0x00002CBB, 0x000033DD, 0x000200F8, 0x00002CBB, 0x00050051, 0x0000000B,\n    0x00005E5C, 0x00004AB4, 0x00000000, 0x000500AB, 0x00000009, 0x000057C6,\n    0x00005E5C, 0x00000A0A, 0x000200F9, 0x000033DD, 0x000200F8, 0x000033DD,\n    0x000700F5, 0x00000009, 0x00002AAD, 0x0000195B, 0x00004F23, 0x000057C6,\n    0x00002CBB, 0x000300F7, 0x00005596, 0x00000002, 0x000400FA, 0x00002AAD,\n    0x00002CF4, 0x00005596, 0x000200F8, 0x00002CF4, 0x00050051, 0x0000000B,\n    0x00005C2F, 0x00004AB4, 0x00000000, 0x000500AE, 0x00000009, 0x000043C2,\n    0x00005C2F, 0x00000A10, 0x000300F7, 0x00004946, 0x00000000, 0x000400FA,\n    0x000043C2, 0x00003E05, 0x00004946, 0x000200F8, 0x00003E05, 0x000500AE,\n    0x00000009, 0x00005FD4, 0x00005C2F, 0x00000A13, 0x000300F7, 0x00004945,\n    0x00000000, 0x000400FA, 0x00005FD4, 0x00002620, 0x00004945, 0x000200F8,\n    0x00002620, 0x00050051, 0x0000000B, 0x00005002, 0x00003997, 0x00000003,\n    0x00060052, 0x00000017, 0x000037FF, 0x00005002, 0x00003997, 0x00000002,\n    0x000200F9, 0x00004945, 0x000200F8, 0x00004945, 0x000700F5, 0x00000017,\n    0x000043E3, 0x00003997, 0x00003E05, 0x000037FF, 0x00002620, 0x00050051,\n    0x0000000B, 0x00001B5A, 0x000043E3, 0x00000002, 0x00060052, 0x00000017,\n    0x00003B28, 0x00001B5A, 0x000043E3, 0x00000001, 0x000200F9, 0x00004946,\n    0x000200F8, 0x00004946, 0x000700F5, 0x00000017, 0x000043E4, 0x00003997,\n    0x00002CF4, 0x00003B28, 0x00004945, 0x00050051, 0x0000000B, 0x00001B5B,\n    0x000043E4, 0x00000001, 0x00060052, 0x00000017, 0x00003B29, 0x00001B5B,\n    0x000043E4, 0x00000000, 0x000200F9, 0x00005596, 0x000200F8, 0x00005596,\n    0x000700F5, 0x00000017, 0x00002AAE, 0x00003997, 0x000033DD, 0x00003B29,\n    0x00004946, 0x000300F7, 0x0000530F, 0x00000002, 0x000400FA, 0x00004C4F,\n    0x0000577B, 0x0000530F, 0x000200F8, 0x0000577B, 0x000300F7, 0x000039F4,\n    0x00000000, 0x000F00FB, 0x000023AA, 0x000039F4, 0x00000000, 0x000055A0,\n    0x00000001, 0x000055A0, 0x00000002, 0x00002897, 0x00000003, 0x00002897,\n    0x0000000A, 0x00002897, 0x0000000C, 0x00002897, 0x000200F8, 0x00002897,\n    0x000500C7, 0x00000017, 0x00003BA9, 0x00002AAE, 0x00000930, 0x000500C7,\n    0x00000017, 0x00005C0C, 0x00002AAE, 0x000003A1, 0x000500C4, 0x00000017,\n    0x00006105, 0x00005C0C, 0x000003C5, 0x000500C5, 0x00000017, 0x00004655,\n    0x00003BA9, 0x00006105, 0x000500C2, 0x00000017, 0x00005A82, 0x00002AAE,\n    0x000003C5, 0x000500C7, 0x00000017, 0x0000192A, 0x00005A82, 0x000003A1,\n    0x000500C5, 0x00000017, 0x00003CE5, 0x00004655, 0x0000192A, 0x000500C7,\n    0x00000017, 0x00004C3F, 0x00002616, 0x00000930, 0x000500C7, 0x00000017,\n    0x0000461A, 0x00002616, 0x000003A1, 0x000500C4, 0x00000017, 0x00006106,\n    0x0000461A, 0x000003C5, 0x000500C5, 0x00000017, 0x00004656, 0x00004C3F,\n    0x00006106, 0x000500C2, 0x00000017, 0x00005A83, 0x00002616, 0x000003C5,\n    0x000500C7, 0x00000017, 0x00001CE0, 0x00005A83, 0x000003A1, 0x000500C5,\n    0x00000017, 0x00001EBE, 0x00004656, 0x00001CE0, 0x000200F9, 0x000039F4,\n    0x000200F8, 0x000055A0, 0x000500C7, 0x00000017, 0x00004E95, 0x00002AAE,\n    0x0000072E, 0x000500C7, 0x00000017, 0x00005C0D, 0x00002AAE, 0x0000064B,\n    0x000500C4, 0x00000017, 0x00006107, 0x00005C0D, 0x000002ED, 0x000500C5,\n    0x00000017, 0x00004657, 0x00004E95, 0x00006107, 0x000500C2, 0x00000017,\n    0x00005A84, 0x00002AAE, 0x000002ED, 0x000500C7, 0x00000017, 0x0000192B,\n    0x00005A84, 0x0000064B, 0x000500C5, 0x00000017, 0x00003CE6, 0x00004657,\n    0x0000192B, 0x000500C7, 0x00000017, 0x00004C40, 0x00002616, 0x0000072E,\n    0x000500C7, 0x00000017, 0x0000461B, 0x00002616, 0x0000064B, 0x000500C4,\n    0x00000017, 0x00006108, 0x0000461B, 0x000002ED, 0x000500C5, 0x00000017,\n    0x00004658, 0x00004C40, 0x00006108, 0x000500C2, 0x00000017, 0x00005A85,\n    0x00002616, 0x000002ED, 0x000500C7, 0x00000017, 0x00001CE1, 0x00005A85,\n    0x0000064B, 0x000500C5, 0x00000017, 0x00001EBF, 0x00004658, 0x00001CE1,\n    0x000200F9, 0x000039F4, 0x000200F8, 0x000039F4, 0x000900F5, 0x00000017,\n    0x00002BF3, 0x00002616, 0x0000577B, 0x00001EBF, 0x000055A0, 0x00001EBE,\n    0x00002897, 0x000900F5, 0x00000017, 0x0000358D, 0x00002AAE, 0x0000577B,\n    0x00003CE6, 0x000055A0, 0x00003CE5, 0x00002897, 0x000200F9, 0x0000530F,\n    0x000200F8, 0x0000530F, 0x000700F5, 0x00000017, 0x000022F8, 0x00002616,\n    0x00005596, 0x00002BF3, 0x000039F4, 0x000700F5, 0x00000017, 0x0000520A,\n    0x00002AAE, 0x00005596, 0x0000358D, 0x000039F4, 0x00050080, 0x00000011,\n    0x000037CC, 0x00002670, 0x000059EC, 0x000500C2, 0x00000011, 0x00005E75,\n    0x000037CC, 0x00000740, 0x00050086, 0x00000011, 0x00001E20, 0x00005E75,\n    0x00005C31, 0x00050084, 0x00000011, 0x00004707, 0x00005C31, 0x00001E20,\n    0x00050082, 0x00000011, 0x00004761, 0x00005E75, 0x00004707, 0x000500C4,\n    0x00000011, 0x00002BE0, 0x00001E20, 0x00000740, 0x00050051, 0x0000000B,\n    0x000033E4, 0x00004761, 0x00000000, 0x00050051, 0x0000000B, 0x00002A78,\n    0x00005C31, 0x00000001, 0x00050084, 0x0000000B, 0x00005966, 0x000033E4,\n    0x00002A78, 0x00050051, 0x0000000B, 0x00001B1F, 0x00004761, 0x00000001,\n    0x00050080, 0x0000000B, 0x000028E5, 0x00005966, 0x00001B1F, 0x000500C7,\n    0x00000011, 0x000049A3, 0x000037CC, 0x000007A3, 0x000500C4, 0x0000000B,\n    0x00002955, 0x000028E5, 0x00000A1F, 0x00050051, 0x0000000B, 0x000051B4,\n    0x000049A3, 0x00000001, 0x000500C4, 0x0000000B, 0x00005C2C, 0x000051B4,\n    0x00000A1C, 0x000500C5, 0x0000000B, 0x00004D66, 0x00002955, 0x00005C2C,\n    0x00050051, 0x0000000B, 0x000053E4, 0x000049A3, 0x00000000, 0x000500C4,\n    0x0000000B, 0x00002DC2, 0x000053E4, 0x00000A10, 0x000500C5, 0x0000000B,\n    0x00002BB9, 0x00004D66, 0x00002DC2, 0x000300F7, 0x00005341, 0x00000002,\n    0x000400FA, 0x00005010, 0x0000294E, 0x0000537D, 0x000200F8, 0x0000537D,\n    0x0004007C, 0x00000012, 0x00002970, 0x00002BE0, 0x00050051, 0x0000000C,\n    0x000045F3, 0x00002970, 0x00000001, 0x000500C3, 0x0000000C, 0x00004DC0,\n    0x000045F3, 0x00000A1A, 0x0004007C, 0x0000000C, 0x00005780, 0x000020FC,\n    0x00050084, 0x0000000C, 0x00001F02, 0x00004DC0, 0x00005780, 0x00050051,\n    0x0000000C, 0x00006242, 0x00002970, 0x00000000, 0x000500C3, 0x0000000C,\n    0x00004FC7, 0x00006242, 0x00000A1A, 0x00050080, 0x0000000C, 0x000049B0,\n    0x00001F02, 0x00004FC7, 0x000500C4, 0x0000000C, 0x0000254A, 0x000049B0,\n    0x00000A1D, 0x000500C3, 0x0000000C, 0x0000603B, 0x000045F3, 0x00000A0E,\n    0x000500C7, 0x0000000C, 0x0000539A, 0x0000603B, 0x00000A20, 0x000500C4,\n    0x0000000C, 0x0000534A, 0x0000539A, 0x00000A14, 0x000500C7, 0x0000000C,\n    0x00004EA5, 0x00006242, 0x00000A20, 0x000500C5, 0x0000000C, 0x00002B1A,\n    0x0000534A, 0x00004EA5, 0x000500C5, 0x0000000C, 0x000043B6, 0x0000254A,\n    0x00002B1A, 0x000500C4, 0x0000000C, 0x00005E63, 0x000043B6, 0x00000A10,\n    0x000500C3, 0x0000000C, 0x000031DE, 0x000045F3, 0x00000A17, 0x000500C7,\n    0x0000000C, 0x00005447, 0x000031DE, 0x00000A0E, 0x000500C3, 0x0000000C,\n    0x000028A6, 0x00006242, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000511E,\n    0x000028A6, 0x00000A14, 0x000500C3, 0x0000000C, 0x000028B9, 0x000045F3,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x0000505E, 0x000028B9, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x0000541D, 0x0000505E, 0x00000A0E, 0x000500C6,\n    0x0000000C, 0x000022BA, 0x0000511E, 0x0000541D, 0x000500C7, 0x0000000C,\n    0x00005076, 0x000045F3, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005228,\n    0x00005076, 0x00000A17, 0x000500C4, 0x0000000C, 0x00001997, 0x000022BA,\n    0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FE, 0x00005228, 0x00001997,\n    0x000500C4, 0x0000000C, 0x00001C00, 0x00005447, 0x00000A2C, 0x000500C5,\n    0x0000000C, 0x00003C81, 0x000047FE, 0x00001C00, 0x000500C7, 0x0000000C,\n    0x000050AF, 0x00005E63, 0x00000A38, 0x000500C5, 0x0000000C, 0x00003C70,\n    0x00003C81, 0x000050AF, 0x000500C3, 0x0000000C, 0x00003745, 0x00005E63,\n    0x00000A17, 0x000500C7, 0x0000000C, 0x000018B8, 0x00003745, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x0000547E, 0x000018B8, 0x00000A1A, 0x000500C5,\n    0x0000000C, 0x000045A8, 0x00003C70, 0x0000547E, 0x000500C3, 0x0000000C,\n    0x00003A6E, 0x00005E63, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018B9,\n    0x00003A6E, 0x00000A20, 0x000500C4, 0x0000000C, 0x0000547F, 0x000018B9,\n    0x00000A23, 0x000500C5, 0x0000000C, 0x0000456F, 0x000045A8, 0x0000547F,\n    0x000500C3, 0x0000000C, 0x00003C88, 0x00005E63, 0x00000A23, 0x000500C4,\n    0x0000000C, 0x00002824, 0x00003C88, 0x00000A2F, 0x000500C5, 0x0000000C,\n    0x00003B79, 0x0000456F, 0x00002824, 0x0004007C, 0x0000000B, 0x000041E5,\n    0x00003B79, 0x000200F9, 0x00005341, 0x000200F8, 0x0000294E, 0x00050051,\n    0x0000000B, 0x00004D9A, 0x00002BE0, 0x00000000, 0x00050051, 0x0000000B,\n    0x00002C03, 0x00002BE0, 0x00000001, 0x00060050, 0x00000014, 0x000020DE,\n    0x00004D9A, 0x00002C03, 0x000059FD, 0x0004007C, 0x00000016, 0x00004E9D,\n    0x000020DE, 0x00050051, 0x0000000C, 0x00002BF7, 0x00004E9D, 0x00000002,\n    0x000500C3, 0x0000000C, 0x00004DC1, 0x00002BF7, 0x00000A11, 0x0004007C,\n    0x0000000C, 0x00005781, 0x00006273, 0x00050084, 0x0000000C, 0x00001F03,\n    0x00004DC1, 0x00005781, 0x00050051, 0x0000000C, 0x00006243, 0x00004E9D,\n    0x00000001, 0x000500C3, 0x0000000C, 0x00004A6F, 0x00006243, 0x00000A17,\n    0x00050080, 0x0000000C, 0x00002B2C, 0x00001F03, 0x00004A6F, 0x0004007C,\n    0x0000000C, 0x00004202, 0x000020FC, 0x00050084, 0x0000000C, 0x00003A60,\n    0x00002B2C, 0x00004202, 0x00050051, 0x0000000C, 0x00006244, 0x00004E9D,\n    0x00000000, 0x000500C3, 0x0000000C, 0x00004FC8, 0x00006244, 0x00000A1A,\n    0x00050080, 0x0000000C, 0x000049FC, 0x00003A60, 0x00004FC8, 0x000500C4,\n    0x0000000C, 0x0000225D, 0x000049FC, 0x00000A20, 0x000500C7, 0x0000000C,\n    0x00002CAA, 0x00002BF7, 0x00000A14, 0x000500C4, 0x0000000C, 0x00004CAE,\n    0x00002CAA, 0x00000A1A, 0x000500C3, 0x0000000C, 0x0000383E, 0x00006243,\n    0x00000A0E, 0x000500C7, 0x0000000C, 0x00005374, 0x0000383E, 0x00000A14,\n    0x000500C4, 0x0000000C, 0x000054CA, 0x00005374, 0x00000A14, 0x000500C5,\n    0x0000000C, 0x000042CE, 0x00004CAE, 0x000054CA, 0x000500C7, 0x0000000C,\n    0x000050D6, 0x00006244, 0x00000A20, 0x000500C5, 0x0000000C, 0x00003ADD,\n    0x000042CE, 0x000050D6, 0x000500C5, 0x0000000C, 0x000043B7, 0x0000225D,\n    0x00003ADD, 0x000500C4, 0x0000000C, 0x00005E50, 0x000043B7, 0x00000A10,\n    0x000500C3, 0x0000000C, 0x000032D7, 0x00006243, 0x00000A14, 0x000500C6,\n    0x0000000C, 0x000026C9, 0x000032D7, 0x00004DC1, 0x000500C7, 0x0000000C,\n    0x00004199, 0x000026C9, 0x00000A0E, 0x000500C3, 0x0000000C, 0x00002590,\n    0x00006244, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000505F, 0x00002590,\n    0x00000A14, 0x000500C4, 0x0000000C, 0x0000541E, 0x00004199, 0x00000A0E,\n    0x000500C6, 0x0000000C, 0x000022BB, 0x0000505F, 0x0000541E, 0x000500C7,\n    0x0000000C, 0x00005077, 0x00006243, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x00005229, 0x00005077, 0x00000A17, 0x000500C4, 0x0000000C, 0x00001998,\n    0x000022BB, 0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FF, 0x00005229,\n    0x00001998, 0x000500C4, 0x0000000C, 0x00001C01, 0x00004199, 0x00000A2C,\n    0x000500C5, 0x0000000C, 0x00003C82, 0x000047FF, 0x00001C01, 0x000500C7,\n    0x0000000C, 0x000050B0, 0x00005E50, 0x00000A38, 0x000500C5, 0x0000000C,\n    0x00003C71, 0x00003C82, 0x000050B0, 0x000500C3, 0x0000000C, 0x00003746,\n    0x00005E50, 0x00000A17, 0x000500C7, 0x0000000C, 0x000018BA, 0x00003746,\n    0x00000A0E, 0x000500C4, 0x0000000C, 0x00005480, 0x000018BA, 0x00000A1A,\n    0x000500C5, 0x0000000C, 0x000045A9, 0x00003C71, 0x00005480, 0x000500C3,\n    0x0000000C, 0x00003A6F, 0x00005E50, 0x00000A1A, 0x000500C7, 0x0000000C,\n    0x000018BB, 0x00003A6F, 0x00000A20, 0x000500C4, 0x0000000C, 0x00005481,\n    0x000018BB, 0x00000A23, 0x000500C5, 0x0000000C, 0x00004570, 0x000045A9,\n    0x00005481, 0x000500C3, 0x0000000C, 0x00003C89, 0x00005E50, 0x00000A23,\n    0x000500C4, 0x0000000C, 0x00002825, 0x00003C89, 0x00000A2F, 0x000500C5,\n    0x0000000C, 0x00003B7A, 0x00004570, 0x00002825, 0x0004007C, 0x0000000B,\n    0x000041E6, 0x00003B7A, 0x000200F9, 0x00005341, 0x000200F8, 0x00005341,\n    0x000700F5, 0x0000000B, 0x00002522, 0x000041E6, 0x0000294E, 0x000041E5,\n    0x0000537D, 0x00050084, 0x0000000B, 0x000041CB, 0x0000229A, 0x00002A78,\n    0x00050084, 0x0000000B, 0x00002ED9, 0x00002522, 0x000041CB, 0x00050080,\n    0x0000000B, 0x00003E8C, 0x00002ED9, 0x00002BB9, 0x000500C2, 0x0000000B,\n    0x00005183, 0x00003E8C, 0x00000A17, 0x000500AA, 0x00000009, 0x00002EEA,\n    0x00004ADD, 0x00000A0D, 0x000500AA, 0x00000009, 0x00005776, 0x00004ADD,\n    0x00000A10, 0x000500A6, 0x00000009, 0x00005686, 0x00002EEA, 0x00005776,\n    0x000300F7, 0x00003463, 0x00000000, 0x000400FA, 0x00005686, 0x00002957,\n    0x00003463, 0x000200F8, 0x00002957, 0x000500C7, 0x00000017, 0x0000475F,\n    0x0000520A, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D1, 0x0000475F,\n    0x0000013D, 0x000500C7, 0x00000017, 0x000050AC, 0x0000520A, 0x0000072E,\n    0x000500C2, 0x00000017, 0x0000448D, 0x000050AC, 0x0000013D, 0x000500C5,\n    0x00000017, 0x00003FF8, 0x000024D1, 0x0000448D, 0x000200F9, 0x00003463,\n    0x000200F8, 0x00003463, 0x000700F5, 0x00000017, 0x00005879, 0x0000520A,\n    0x00005341, 0x00003FF8, 0x00002957, 0x000500AA, 0x00000009, 0x00004CB6,\n    0x00004ADD, 0x00000A13, 0x000500A6, 0x00000009, 0x00003B23, 0x00005776,\n    0x00004CB6, 0x000300F7, 0x00002C98, 0x00000000, 0x000400FA, 0x00003B23,\n    0x00002B38, 0x00002C98, 0x000200F8, 0x00002B38, 0x000500C4, 0x00000017,\n    0x00005E17, 0x00005879, 0x000002ED, 0x000500C2, 0x00000017, 0x00003BE7,\n    0x00005879, 0x000002ED, 0x000500C5, 0x00000017, 0x000029E8, 0x00005E17,\n    0x00003BE7, 0x000200F9, 0x00002C98, 0x000200F8, 0x00002C98, 0x000700F5,\n    0x00000017, 0x00004D37, 0x00005879, 0x00003463, 0x000029E8, 0x00002B38,\n    0x00060041, 0x00000294, 0x000060F9, 0x00001592, 0x00000A0B, 0x00005183,\n    0x0003003E, 0x000060F9, 0x00004D37, 0x00050080, 0x0000000B, 0x00002DCE,\n    0x00003E8C, 0x00000A3A, 0x000500C2, 0x0000000B, 0x000041F1, 0x00002DCE,\n    0x00000A17, 0x000300F7, 0x00003A1A, 0x00000000, 0x000400FA, 0x00005686,\n    0x00002958, 0x00003A1A, 0x000200F8, 0x00002958, 0x000500C7, 0x00000017,\n    0x00004760, 0x000022F8, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D2,\n    0x00004760, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AD, 0x000022F8,\n    0x0000072E, 0x000500C2, 0x00000017, 0x0000448E, 0x000050AD, 0x0000013D,\n    0x000500C5, 0x00000017, 0x00003FF9, 0x000024D2, 0x0000448E, 0x000200F9,\n    0x00003A1A, 0x000200F8, 0x00003A1A, 0x000700F5, 0x00000017, 0x00002AAF,\n    0x000022F8, 0x00002C98, 0x00003FF9, 0x00002958, 0x000300F7, 0x00002C99,\n    0x00000000, 0x000400FA, 0x00003B23, 0x00002B39, 0x00002C99, 0x000200F8,\n    0x00002B39, 0x000500C4, 0x00000017, 0x00005E18, 0x00002AAF, 0x000002ED,\n    0x000500C2, 0x00000017, 0x00003BE8, 0x00002AAF, 0x000002ED, 0x000500C5,\n    0x00000017, 0x000029E9, 0x00005E18, 0x00003BE8, 0x000200F9, 0x00002C99,\n    0x000200F8, 0x00002C99, 0x000700F5, 0x00000017, 0x00004D38, 0x00002AAF,\n    0x00003A1A, 0x000029E9, 0x00002B39, 0x00060041, 0x00000294, 0x00001F75,\n    0x00001592, 0x00000A0B, 0x000041F1, 0x0003003E, 0x00001F75, 0x00004D38,\n    0x000200F9, 0x00004C7A, 0x000200F8, 0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/resolve_fast_64bpp_1x2xmsaa_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25271\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 8 8 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_resolve_edram_info\"\n               OpMemberName %push_const_block_xe 1 \"xe_resolve_coordinate_info\"\n               OpMemberName %push_const_block_xe 2 \"xe_resolve_dest_info\"\n               OpMemberName %push_const_block_xe 3 \"xe_resolve_dest_coordinate_info\"\n               OpMemberName %push_const_block_xe 4 \"xe_resolve_dest_base\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_resolve_edram_xe_block \"xe_resolve_edram_xe_block\"\n               OpMemberName %xe_resolve_edram_xe_block 0 \"data\"\n               OpName %xe_resolve_edram \"xe_resolve_edram\"\n               OpName %xe_resolve_dest_xe_block \"xe_resolve_dest_xe_block\"\n               OpMemberName %xe_resolve_dest_xe_block 0 \"data\"\n               OpName %xe_resolve_dest \"xe_resolve_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_resolve_edram_xe_block BufferBlock\n               OpMemberDecorate %xe_resolve_edram_xe_block 0 NonWritable\n               OpMemberDecorate %xe_resolve_edram_xe_block 0 Offset 0\n               OpDecorate %xe_resolve_edram NonWritable\n               OpDecorate %xe_resolve_edram Binding 0\n               OpDecorate %xe_resolve_edram DescriptorSet 0\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_resolve_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_resolve_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_resolve_dest_xe_block 0 Offset 0\n               OpDecorate %xe_resolve_dest NonReadable\n               OpDecorate %xe_resolve_dest Binding 0\n               OpDecorate %xe_resolve_dest DescriptorSet 1\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n     %v4uint = OpTypeVector %uint 4\n       %bool = OpTypeBool\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n     %uint_1 = OpConstant %uint 1\n     %uint_2 = OpConstant %uint 2\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n     %uint_3 = OpConstant %uint 3\n    %uint_16 = OpConstant %uint 16\n     %uint_4 = OpConstant %uint 4\n       %1837 = OpConstantComposite %v2uint %uint_2 %uint_1\n     %v2bool = OpTypeVector %bool 2\n     %uint_0 = OpConstant %uint 0\n       %1807 = OpConstantComposite %v2uint %uint_0 %uint_0\n       %1828 = OpConstantComposite %v2uint %uint_1 %uint_1\n       %1816 = OpConstantComposite %v2uint %uint_1 %uint_0\n      %int_2 = OpConstant %int 2\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n      %int_3 = OpConstant %int 3\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n  %uint_1023 = OpConstant %uint 1023\n    %uint_10 = OpConstant %uint 10\n    %uint_13 = OpConstant %uint 13\n  %uint_2047 = OpConstant %uint 2047\n    %uint_24 = OpConstant %uint 24\n    %uint_15 = OpConstant %uint 15\n    %uint_28 = OpConstant %uint 28\n       %1855 = OpConstantComposite %v2uint %uint_0 %uint_4\n     %uint_5 = OpConstant %uint 5\n     %uint_7 = OpConstant %uint 7\n%uint_16777216 = OpConstant %uint 16777216\n    %uint_20 = OpConstant %uint 20\n       %2275 = OpConstantComposite %v2uint %uint_20 %uint_24\n     %v3uint = OpTypeVector %uint 3\n%uint_4294901760 = OpConstant %uint 4294901760\n %uint_65535 = OpConstant %uint 65535\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %1825 = OpConstantComposite %v2uint %uint_2 %uint_0\n      %false = OpConstantFalse %bool\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_resolve_edram_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_resolve_edram_xe_block = OpTypePointer Uniform %xe_resolve_edram_xe_block\n%xe_resolve_edram = OpVariable %_ptr_Uniform_xe_resolve_edram_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_resolve_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_resolve_dest_xe_block = OpTypePointer Uniform %xe_resolve_dest_xe_block\n%xe_resolve_dest = OpVariable %_ptr_Uniform_xe_resolve_dest_xe_block Uniform\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_8 %uint_8 %uint_1\n       %1954 = OpConstantComposite %v2uint %uint_15 %uint_1\n       %1870 = OpConstantComposite %v2uint %uint_3 %uint_3\n       %2122 = OpConstantComposite %v2uint %uint_15 %uint_15\n       %1877 = OpConstantComposite %v4uint %uint_4294901760 %uint_4294901760 %uint_4294901760 %uint_4294901760\n        %850 = OpConstantComposite %v4uint %uint_65535 %uint_65535 %uint_65535 %uint_65535\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n    %uint_40 = OpConstant %uint 40\n       %2359 = OpConstantComposite %v2uint %uint_40 %uint_16\n  %uint_1280 = OpConstant %uint 1280\n%uint_2621440 = OpConstant %uint 2621440\n    %uint_32 = OpConstant %uint 32\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %22245 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %15627 = OpLoad %uint %22245\n      %22700 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %20824 = OpLoad %uint %22700\n      %20561 = OpBitwiseAnd %uint %15627 %uint_1023\n      %19978 = OpShiftRightLogical %uint %15627 %uint_10\n       %8574 = OpBitwiseAnd %uint %19978 %uint_3\n      %21002 = OpShiftRightLogical %uint %15627 %uint_13\n       %8575 = OpBitwiseAnd %uint %21002 %uint_2047\n      %18836 = OpShiftRightLogical %uint %15627 %uint_24\n       %9130 = OpBitwiseAnd %uint %18836 %uint_15\n       %8871 = OpCompositeConstruct %v2uint %20824 %20824\n       %9576 = OpShiftRightLogical %v2uint %8871 %1855\n      %23379 = OpBitwiseAnd %v2uint %9576 %1954\n      %16207 = OpShiftLeftLogical %v2uint %23379 %1870\n      %23019 = OpIMul %v2uint %16207 %1828\n      %12819 = OpShiftRightLogical %uint %20824 %uint_5\n      %16204 = OpBitwiseAnd %uint %12819 %uint_2047\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %24236 = OpLoad %uint %18732\n      %22701 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %20919 = OpLoad %uint %22701\n      %19164 = OpBitwiseAnd %uint %24236 %uint_7\n      %21999 = OpBitwiseAnd %uint %24236 %uint_8\n      %20495 = OpINotEqual %bool %21999 %uint_0\n      %10402 = OpShiftRightLogical %uint %24236 %uint_4\n      %23037 = OpBitwiseAnd %uint %10402 %uint_7\n      %23118 = OpBitwiseAnd %uint %24236 %uint_16777216\n      %19535 = OpINotEqual %bool %23118 %uint_0\n       %8444 = OpBitwiseAnd %uint %20919 %uint_1023\n      %12176 = OpShiftRightLogical %uint %20919 %uint_10\n      %25038 = OpBitwiseAnd %uint %12176 %uint_1023\n      %25203 = OpShiftLeftLogical %uint %25038 %int_1\n      %10422 = OpCompositeConstruct %v2uint %20919 %20919\n      %10385 = OpShiftRightLogical %v2uint %10422 %2275\n      %23380 = OpBitwiseAnd %v2uint %10385 %2122\n      %16208 = OpShiftLeftLogical %v2uint %23380 %1870\n      %23020 = OpIMul %v2uint %16208 %1828\n      %12820 = OpShiftRightLogical %uint %20919 %uint_28\n      %16205 = OpBitwiseAnd %uint %12820 %uint_7\n      %18656 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_4\n      %25270 = OpLoad %uint %18656\n      %14159 = OpLoad %v3uint %gl_GlobalInvocationID\n      %12672 = OpVectorShuffle %v2uint %14159 %14159 0 1\n      %12025 = OpShiftLeftLogical %v2uint %12672 %1825\n       %7640 = OpCompositeExtract %uint %12025 0\n      %11658 = OpShiftLeftLogical %uint %16204 %uint_3\n      %15379 = OpUGreaterThanEqual %bool %7640 %11658\n               OpSelectionMerge %12755 DontFlatten\n               OpBranchConditional %15379 %21992 %12755\n      %21992 = OpLabel\n               OpBranch %19578\n      %12755 = OpLabel\n       %7340 = OpCompositeExtract %uint %12025 1\n       %7992 = OpExtInst %uint %1 UMax %7340 %uint_0\n      %20975 = OpCompositeConstruct %v2uint %7640 %7992\n      %21036 = OpIAdd %v2uint %20975 %23019\n      %16075 = OpULessThanEqual %bool %16205 %uint_3\n               OpSelectionMerge %23776 None\n               OpBranchConditional %16075 %10990 %15087\n      %15087 = OpLabel\n      %13566 = OpIEqual %bool %16205 %uint_5\n       %8438 = OpSelect %uint %13566 %uint_2 %uint_0\n               OpBranch %23776\n      %10990 = OpLabel\n               OpBranch %23776\n      %23776 = OpLabel\n      %19300 = OpPhi %uint %16205 %10990 %8438 %15087\n      %16830 = OpCompositeConstruct %v2uint %8574 %8574\n      %11801 = OpUGreaterThanEqual %v2bool %16830 %1837\n      %19381 = OpSelect %v2uint %11801 %1828 %1807\n      %10986 = OpShiftLeftLogical %v2uint %21036 %19381\n      %24669 = OpCompositeConstruct %v2uint %19300 %19300\n       %9093 = OpShiftRightLogical %v2uint %24669 %1816\n      %16110 = OpBitwiseAnd %v2uint %9093 %1828\n      %17779 = OpIAdd %v2uint %10986 %16110\n      %24270 = OpUDiv %v2uint %17779 %2359\n      %12360 = OpCompositeExtract %uint %24270 1\n      %11046 = OpIMul %uint %12360 %20561\n      %24665 = OpCompositeExtract %uint %24270 0\n      %21536 = OpIAdd %uint %11046 %24665\n       %8742 = OpIAdd %uint %8575 %21536\n      %23345 = OpIMul %v2uint %24270 %2359\n      %11892 = OpISub %v2uint %17779 %23345\n       %9022 = OpIMul %uint %8742 %uint_1280\n      %14471 = OpCompositeExtract %uint %11892 1\n      %15890 = OpIMul %uint %14471 %uint_40\n       %6886 = OpCompositeExtract %uint %11892 0\n       %9696 = OpIAdd %uint %15890 %6886\n      %18116 = OpShiftLeftLogical %uint %9696 %uint_1\n      %18619 = OpIAdd %uint %9022 %18116\n      %19925 = OpUMod %uint %18619 %uint_2621440\n      %18095 = OpShiftLeftLogical %uint %19925 %int_2\n      %19333 = OpShiftRightLogical %uint %18095 %int_4\n      %10173 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_edram %int_0 %19333\n      %15060 = OpLoad %v4uint %10173\n       %8517 = OpIAdd %uint %18095 %uint_16\n      %21670 = OpShiftRightLogical %uint %8517 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_edram %int_0 %21670\n       %7319 = OpLoad %v4uint %20399\n      %15472 = OpIEqual %bool %7640 %uint_0\n      %15603 = OpSelect %bool %15472 %false %15472\n               OpSelectionMerge %21910 DontFlatten\n               OpBranchConditional %15603 %9760 %21910\n       %9760 = OpLabel\n      %17290 = OpCompositeExtract %uint %15060 2\n      %21174 = OpCompositeInsert %v4uint %17290 %15060 0\n      %23044 = OpCompositeExtract %uint %15060 3\n       %9296 = OpCompositeInsert %v4uint %23044 %21174 1\n               OpBranch %21910\n      %21910 = OpLabel\n      %10924 = OpPhi %v4uint %15060 %23776 %9296 %9760\n               OpSelectionMerge %21263 DontFlatten\n               OpBranchConditional %19535 %15068 %21263\n      %15068 = OpLabel\n      %13701 = OpIEqual %bool %9130 %uint_5\n      %17015 = OpLogicalNot %bool %13701\n               OpSelectionMerge %15698 None\n               OpBranchConditional %17015 %16607 %15698\n      %16607 = OpLabel\n      %18778 = OpIEqual %bool %9130 %uint_7\n               OpBranch %15698\n      %15698 = OpLabel\n      %10925 = OpPhi %bool %13701 %15068 %18778 %16607\n               OpSelectionMerge %14836 DontFlatten\n               OpBranchConditional %10925 %8360 %14836\n       %8360 = OpLabel\n      %19441 = OpBitwiseAnd %v4uint %10924 %1877\n      %20970 = OpVectorShuffle %v4uint %10924 %10924 1 0 3 2\n       %7405 = OpBitwiseAnd %v4uint %20970 %850\n      %13888 = OpBitwiseOr %v4uint %19441 %7405\n      %21265 = OpBitwiseAnd %v4uint %7319 %1877\n      %15352 = OpVectorShuffle %v4uint %7319 %7319 1 0 3 2\n       %8355 = OpBitwiseAnd %v4uint %15352 %850\n       %8449 = OpBitwiseOr %v4uint %21265 %8355\n               OpBranch %14836\n      %14836 = OpLabel\n      %11251 = OpPhi %v4uint %7319 %15698 %8449 %8360\n      %13709 = OpPhi %v4uint %10924 %15698 %13888 %8360\n               OpBranch %21263\n      %21263 = OpLabel\n       %8952 = OpPhi %v4uint %7319 %21910 %11251 %14836\n      %22009 = OpPhi %v4uint %10924 %21910 %13709 %14836\n       %7320 = OpIAdd %v2uint %12025 %23020\n               OpSelectionMerge %21237 DontFlatten\n               OpBranchConditional %20495 %10574 %21373\n      %21373 = OpLabel\n      %10608 = OpBitcast %v2int %7320\n      %17907 = OpCompositeExtract %int %10608 1\n      %19904 = OpShiftRightArithmetic %int %17907 %int_5\n      %22400 = OpBitcast %int %8444\n       %7938 = OpIMul %int %19904 %22400\n      %25154 = OpCompositeExtract %int %10608 0\n      %20423 = OpShiftRightArithmetic %int %25154 %int_5\n      %18864 = OpIAdd %int %7938 %20423\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %17907 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25154 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17334 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17334 %uint_3\n      %12766 = OpShiftRightArithmetic %int %17907 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25154 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %17907 %int_3\n      %20574 = OpBitwiseAnd %int %10425 %int_1\n      %21533 = OpShiftLeftLogical %int %20574 %int_1\n       %8890 = OpBitwiseXor %int %20766 %21533\n      %20598 = OpBitwiseAnd %int %17907 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6551\n       %7168 = OpShiftLeftLogical %int %21575 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24163 %int_15\n      %15473 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24163 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15473 %21630\n      %14958 = OpShiftRightArithmetic %int %24163 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24163 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %21237\n      %10574 = OpLabel\n      %19866 = OpCompositeExtract %uint %7320 0\n      %11267 = OpCompositeExtract %uint %7320 1\n       %8414 = OpCompositeConstruct %v3uint %19866 %11267 %23037\n      %20125 = OpBitcast %v3int %8414\n      %11255 = OpCompositeExtract %int %20125 2\n      %19905 = OpShiftRightArithmetic %int %11255 %int_2\n      %22401 = OpBitcast %int %25203\n       %7939 = OpIMul %int %19905 %22401\n      %25155 = OpCompositeExtract %int %20125 1\n      %19055 = OpShiftRightArithmetic %int %25155 %int_4\n      %11052 = OpIAdd %int %7939 %19055\n      %16898 = OpBitcast %int %8444\n      %14944 = OpIMul %int %11052 %16898\n      %25156 = OpCompositeExtract %int %20125 0\n      %20424 = OpShiftRightArithmetic %int %25156 %int_5\n      %18940 = OpIAdd %int %14944 %20424\n       %8797 = OpShiftLeftLogical %int %18940 %int_7\n      %11434 = OpBitwiseAnd %int %11255 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %25155 %int_1\n      %21364 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21364 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %25156 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17335 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17335 %uint_3\n      %13015 = OpShiftRightArithmetic %int %25155 %int_3\n       %9929 = OpBitwiseXor %int %13015 %19905\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %25156 %int_3\n      %20575 = OpBitwiseAnd %int %9616 %int_3\n      %21534 = OpShiftLeftLogical %int %16793 %int_1\n       %8891 = OpBitwiseXor %int %20575 %21534\n      %20599 = OpBitwiseAnd %int %25155 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6552\n       %7169 = OpShiftLeftLogical %int %16793 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24144 %int_15\n      %15474 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24144 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15474 %21632\n      %14959 = OpShiftRightArithmetic %int %24144 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24144 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %21237\n      %21237 = OpLabel\n      %11376 = OpPhi %uint %16870 %10574 %16869 %21373\n      %20616 = OpIAdd %uint %11376 %25270\n      %20138 = OpShiftRightLogical %uint %20616 %int_4\n      %19356 = OpIEqual %bool %19164 %uint_4\n               OpSelectionMerge %14780 None\n               OpBranchConditional %19356 %13279 %14780\n      %13279 = OpLabel\n       %7958 = OpVectorShuffle %v4uint %22009 %22009 1 0 3 2\n               OpBranch %14780\n      %14780 = OpLabel\n      %22898 = OpPhi %v4uint %22009 %21237 %7958 %13279\n       %6605 = OpSelect %uint %19356 %uint_2 %19164\n      %13412 = OpIEqual %bool %6605 %uint_1\n      %18370 = OpIEqual %bool %6605 %uint_2\n      %22150 = OpLogicalOr %bool %13412 %18370\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %22898 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %22898 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22649 = OpPhi %v4uint %22898 %14780 %16376 %10583\n      %19638 = OpIEqual %bool %6605 %uint_3\n      %15139 = OpLogicalOr %bool %18370 %19638\n               OpSelectionMerge %11416 None\n               OpBranchConditional %15139 %11064 %11416\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22649 %749\n      %15335 = OpShiftRightLogical %v4uint %22649 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %11416\n      %11416 = OpLabel\n      %19767 = OpPhi %v4uint %22649 %13411 %10728 %11064\n      %24825 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_dest %int_0 %20138\n               OpStore %24825 %19767\n      %11726 = OpIAdd %uint %20616 %uint_32\n      %16881 = OpShiftRightLogical %uint %11726 %int_4\n               OpSelectionMerge %16262 None\n               OpBranchConditional %19356 %13280 %16262\n      %13280 = OpLabel\n       %7959 = OpVectorShuffle %v4uint %8952 %8952 1 0 3 2\n               OpBranch %16262\n      %16262 = OpLabel\n      %10926 = OpPhi %v4uint %8952 %11416 %7959 %13280\n               OpSelectionMerge %14874 None\n               OpBranchConditional %22150 %10584 %14874\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %10926 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %10926 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %14874\n      %14874 = OpLabel\n      %10927 = OpPhi %v4uint %10926 %16262 %16377 %10584\n               OpSelectionMerge %11417 None\n               OpBranchConditional %15139 %11065 %11417\n      %11065 = OpLabel\n      %24088 = OpShiftLeftLogical %v4uint %10927 %749\n      %15336 = OpShiftRightLogical %v4uint %10927 %749\n      %10729 = OpBitwiseOr %v4uint %24088 %15336\n               OpBranch %11417\n      %11417 = OpLabel\n      %19768 = OpPhi %v4uint %10927 %14874 %10729 %11065\n       %8053 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_dest %int_0 %16881\n               OpStore %8053 %19768\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t resolve_fast_64bpp_1x2xmsaa_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x000062B7, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000008, 0x00000008, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x0000040B, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x00090006, 0x0000040B, 0x00000000, 0x725F6578,\n    0x6C6F7365, 0x655F6576, 0x6D617264, 0x666E695F, 0x0000006F, 0x000A0006,\n    0x0000040B, 0x00000001, 0x725F6578, 0x6C6F7365, 0x635F6576, 0x64726F6F,\n    0x74616E69, 0x6E695F65, 0x00006F66, 0x00090006, 0x0000040B, 0x00000002,\n    0x725F6578, 0x6C6F7365, 0x645F6576, 0x5F747365, 0x6F666E69, 0x00000000,\n    0x000B0006, 0x0000040B, 0x00000003, 0x725F6578, 0x6C6F7365, 0x645F6576,\n    0x5F747365, 0x726F6F63, 0x616E6964, 0x695F6574, 0x006F666E, 0x00090006,\n    0x0000040B, 0x00000004, 0x725F6578, 0x6C6F7365, 0x645F6576, 0x5F747365,\n    0x65736162, 0x00000000, 0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F,\n    0x5F737473, 0x00006578, 0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C,\n    0x766E496C, 0x7461636F, 0x496E6F69, 0x00000044, 0x00090005, 0x000007B4,\n    0x725F6578, 0x6C6F7365, 0x655F6576, 0x6D617264, 0x5F65785F, 0x636F6C62,\n    0x0000006B, 0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000,\n    0x00070005, 0x00000CC7, 0x725F6578, 0x6C6F7365, 0x655F6576, 0x6D617264,\n    0x00000000, 0x00090005, 0x000007B5, 0x725F6578, 0x6C6F7365, 0x645F6576,\n    0x5F747365, 0x625F6578, 0x6B636F6C, 0x00000000, 0x00050006, 0x000007B5,\n    0x00000000, 0x61746164, 0x00000000, 0x00060005, 0x00001592, 0x725F6578,\n    0x6C6F7365, 0x645F6576, 0x00747365, 0x00030047, 0x0000040B, 0x00000002,\n    0x00050048, 0x0000040B, 0x00000000, 0x00000023, 0x00000000, 0x00050048,\n    0x0000040B, 0x00000001, 0x00000023, 0x00000004, 0x00050048, 0x0000040B,\n    0x00000002, 0x00000023, 0x00000008, 0x00050048, 0x0000040B, 0x00000003,\n    0x00000023, 0x0000000C, 0x00050048, 0x0000040B, 0x00000004, 0x00000023,\n    0x00000010, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x00000CC7, 0x00000018,\n    0x00040047, 0x00000CC7, 0x00000021, 0x00000000, 0x00040047, 0x00000CC7,\n    0x00000022, 0x00000000, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x00001592, 0x00000019, 0x00040047, 0x00001592, 0x00000021,\n    0x00000000, 0x00040047, 0x00001592, 0x00000022, 0x00000001, 0x00040047,\n    0x00000AC7, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000017,\n    0x0000000B, 0x00000004, 0x00020014, 0x00000009, 0x00040015, 0x0000000C,\n    0x00000020, 0x00000001, 0x00040017, 0x00000012, 0x0000000C, 0x00000002,\n    0x00040017, 0x00000016, 0x0000000C, 0x00000003, 0x0004002B, 0x0000000B,\n    0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B, 0x00000A10, 0x00000002,\n    0x0004002B, 0x0000000B, 0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B,\n    0x00000A22, 0x00000008, 0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00,\n    0x0004002B, 0x0000000B, 0x00000A13, 0x00000003, 0x0004002B, 0x0000000B,\n    0x00000A3A, 0x00000010, 0x0004002B, 0x0000000B, 0x00000A16, 0x00000004,\n    0x0005002C, 0x00000011, 0x0000072D, 0x00000A10, 0x00000A0D, 0x00040017,\n    0x0000000F, 0x00000009, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A0A,\n    0x00000000, 0x0005002C, 0x00000011, 0x0000070F, 0x00000A0A, 0x00000A0A,\n    0x0005002C, 0x00000011, 0x00000724, 0x00000A0D, 0x00000A0D, 0x0005002C,\n    0x00000011, 0x00000718, 0x00000A0D, 0x00000A0A, 0x0004002B, 0x0000000C,\n    0x00000A11, 0x00000002, 0x0004002B, 0x0000000C, 0x00000A17, 0x00000004,\n    0x0004002B, 0x0000000C, 0x00000A1D, 0x00000006, 0x0004002B, 0x0000000C,\n    0x00000A2C, 0x0000000B, 0x0004002B, 0x0000000C, 0x00000A38, 0x0000000F,\n    0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C,\n    0x00000A1A, 0x00000005, 0x0004002B, 0x0000000C, 0x00000A20, 0x00000007,\n    0x0004002B, 0x0000000C, 0x00000A23, 0x00000008, 0x0004002B, 0x0000000C,\n    0x00000A2F, 0x0000000C, 0x0004002B, 0x0000000C, 0x00000A14, 0x00000003,\n    0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000, 0x0007001E, 0x0000040B,\n    0x0000000B, 0x0000000B, 0x0000000B, 0x0000000B, 0x0000000B, 0x00040020,\n    0x00000688, 0x00000009, 0x0000040B, 0x0004003B, 0x00000688, 0x00000CE9,\n    0x00000009, 0x00040020, 0x00000288, 0x00000009, 0x0000000B, 0x0004002B,\n    0x0000000B, 0x00000A44, 0x000003FF, 0x0004002B, 0x0000000B, 0x00000A28,\n    0x0000000A, 0x0004002B, 0x0000000B, 0x00000A31, 0x0000000D, 0x0004002B,\n    0x0000000B, 0x00000A81, 0x000007FF, 0x0004002B, 0x0000000B, 0x00000A52,\n    0x00000018, 0x0004002B, 0x0000000B, 0x00000A37, 0x0000000F, 0x0004002B,\n    0x0000000B, 0x00000A5E, 0x0000001C, 0x0005002C, 0x00000011, 0x0000073F,\n    0x00000A0A, 0x00000A16, 0x0004002B, 0x0000000B, 0x00000A19, 0x00000005,\n    0x0004002B, 0x0000000B, 0x00000A1F, 0x00000007, 0x0004002B, 0x0000000B,\n    0x00000926, 0x01000000, 0x0004002B, 0x0000000B, 0x00000A46, 0x00000014,\n    0x0005002C, 0x00000011, 0x000008E3, 0x00000A46, 0x00000A52, 0x00040017,\n    0x00000014, 0x0000000B, 0x00000003, 0x0004002B, 0x0000000B, 0x0000068D,\n    0xFFFF0000, 0x0004002B, 0x0000000B, 0x000001C1, 0x0000FFFF, 0x00040020,\n    0x00000291, 0x00000001, 0x00000014, 0x0004003B, 0x00000291, 0x00000F48,\n    0x00000001, 0x0005002C, 0x00000011, 0x00000721, 0x00000A10, 0x00000A0A,\n    0x0003002A, 0x00000009, 0x00000787, 0x0003001D, 0x000007DC, 0x00000017,\n    0x0003001E, 0x000007B4, 0x000007DC, 0x00040020, 0x00000A32, 0x00000002,\n    0x000007B4, 0x0004003B, 0x00000A32, 0x00000CC7, 0x00000002, 0x00040020,\n    0x00000294, 0x00000002, 0x00000017, 0x0003001D, 0x000007DD, 0x00000017,\n    0x0003001E, 0x000007B5, 0x000007DD, 0x00040020, 0x00000A33, 0x00000002,\n    0x000007B5, 0x0004003B, 0x00000A33, 0x00001592, 0x00000002, 0x0006002C,\n    0x00000014, 0x00000AC7, 0x00000A22, 0x00000A22, 0x00000A0D, 0x0005002C,\n    0x00000011, 0x000007A2, 0x00000A37, 0x00000A0D, 0x0005002C, 0x00000011,\n    0x0000074E, 0x00000A13, 0x00000A13, 0x0005002C, 0x00000011, 0x0000084A,\n    0x00000A37, 0x00000A37, 0x0007002C, 0x00000017, 0x00000755, 0x0000068D,\n    0x0000068D, 0x0000068D, 0x0000068D, 0x0007002C, 0x00000017, 0x00000352,\n    0x000001C1, 0x000001C1, 0x000001C1, 0x000001C1, 0x0007002C, 0x00000017,\n    0x000009CE, 0x000008A6, 0x000008A6, 0x000008A6, 0x000008A6, 0x0007002C,\n    0x00000017, 0x0000013D, 0x00000A22, 0x00000A22, 0x00000A22, 0x00000A22,\n    0x0007002C, 0x00000017, 0x0000072E, 0x000005FD, 0x000005FD, 0x000005FD,\n    0x000005FD, 0x0007002C, 0x00000017, 0x000002ED, 0x00000A3A, 0x00000A3A,\n    0x00000A3A, 0x00000A3A, 0x0004002B, 0x0000000B, 0x00000A82, 0x00000028,\n    0x0005002C, 0x00000011, 0x00000937, 0x00000A82, 0x00000A3A, 0x0004002B,\n    0x0000000B, 0x00000184, 0x00000500, 0x0004002B, 0x0000000B, 0x0000086E,\n    0x00280000, 0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020, 0x00050036,\n    0x00000008, 0x0000161F, 0x00000000, 0x00000502, 0x000200F8, 0x00003B06,\n    0x000300F7, 0x00004C7A, 0x00000000, 0x000300FB, 0x00000A0A, 0x00002E68,\n    0x000200F8, 0x00002E68, 0x00050041, 0x00000288, 0x000056E5, 0x00000CE9,\n    0x00000A0B, 0x0004003D, 0x0000000B, 0x00003D0B, 0x000056E5, 0x00050041,\n    0x00000288, 0x000058AC, 0x00000CE9, 0x00000A0E, 0x0004003D, 0x0000000B,\n    0x00005158, 0x000058AC, 0x000500C7, 0x0000000B, 0x00005051, 0x00003D0B,\n    0x00000A44, 0x000500C2, 0x0000000B, 0x00004E0A, 0x00003D0B, 0x00000A28,\n    0x000500C7, 0x0000000B, 0x0000217E, 0x00004E0A, 0x00000A13, 0x000500C2,\n    0x0000000B, 0x0000520A, 0x00003D0B, 0x00000A31, 0x000500C7, 0x0000000B,\n    0x0000217F, 0x0000520A, 0x00000A81, 0x000500C2, 0x0000000B, 0x00004994,\n    0x00003D0B, 0x00000A52, 0x000500C7, 0x0000000B, 0x000023AA, 0x00004994,\n    0x00000A37, 0x00050050, 0x00000011, 0x000022A7, 0x00005158, 0x00005158,\n    0x000500C2, 0x00000011, 0x00002568, 0x000022A7, 0x0000073F, 0x000500C7,\n    0x00000011, 0x00005B53, 0x00002568, 0x000007A2, 0x000500C4, 0x00000011,\n    0x00003F4F, 0x00005B53, 0x0000074E, 0x00050084, 0x00000011, 0x000059EB,\n    0x00003F4F, 0x00000724, 0x000500C2, 0x0000000B, 0x00003213, 0x00005158,\n    0x00000A19, 0x000500C7, 0x0000000B, 0x00003F4C, 0x00003213, 0x00000A81,\n    0x00050041, 0x00000288, 0x0000492C, 0x00000CE9, 0x00000A11, 0x0004003D,\n    0x0000000B, 0x00005EAC, 0x0000492C, 0x00050041, 0x00000288, 0x000058AD,\n    0x00000CE9, 0x00000A14, 0x0004003D, 0x0000000B, 0x000051B7, 0x000058AD,\n    0x000500C7, 0x0000000B, 0x00004ADC, 0x00005EAC, 0x00000A1F, 0x000500C7,\n    0x0000000B, 0x000055EF, 0x00005EAC, 0x00000A22, 0x000500AB, 0x00000009,\n    0x0000500F, 0x000055EF, 0x00000A0A, 0x000500C2, 0x0000000B, 0x000028A2,\n    0x00005EAC, 0x00000A16, 0x000500C7, 0x0000000B, 0x000059FD, 0x000028A2,\n    0x00000A1F, 0x000500C7, 0x0000000B, 0x00005A4E, 0x00005EAC, 0x00000926,\n    0x000500AB, 0x00000009, 0x00004C4F, 0x00005A4E, 0x00000A0A, 0x000500C7,\n    0x0000000B, 0x000020FC, 0x000051B7, 0x00000A44, 0x000500C2, 0x0000000B,\n    0x00002F90, 0x000051B7, 0x00000A28, 0x000500C7, 0x0000000B, 0x000061CE,\n    0x00002F90, 0x00000A44, 0x000500C4, 0x0000000B, 0x00006273, 0x000061CE,\n    0x00000A0E, 0x00050050, 0x00000011, 0x000028B6, 0x000051B7, 0x000051B7,\n    0x000500C2, 0x00000011, 0x00002891, 0x000028B6, 0x000008E3, 0x000500C7,\n    0x00000011, 0x00005B54, 0x00002891, 0x0000084A, 0x000500C4, 0x00000011,\n    0x00003F50, 0x00005B54, 0x0000074E, 0x00050084, 0x00000011, 0x000059EC,\n    0x00003F50, 0x00000724, 0x000500C2, 0x0000000B, 0x00003214, 0x000051B7,\n    0x00000A5E, 0x000500C7, 0x0000000B, 0x00003F4D, 0x00003214, 0x00000A1F,\n    0x00050041, 0x00000288, 0x000048E0, 0x00000CE9, 0x00000A17, 0x0004003D,\n    0x0000000B, 0x000062B6, 0x000048E0, 0x0004003D, 0x00000014, 0x0000374F,\n    0x00000F48, 0x0007004F, 0x00000011, 0x00003180, 0x0000374F, 0x0000374F,\n    0x00000000, 0x00000001, 0x000500C4, 0x00000011, 0x00002EF9, 0x00003180,\n    0x00000721, 0x00050051, 0x0000000B, 0x00001DD8, 0x00002EF9, 0x00000000,\n    0x000500C4, 0x0000000B, 0x00002D8A, 0x00003F4C, 0x00000A13, 0x000500AE,\n    0x00000009, 0x00003C13, 0x00001DD8, 0x00002D8A, 0x000300F7, 0x000031D3,\n    0x00000002, 0x000400FA, 0x00003C13, 0x000055E8, 0x000031D3, 0x000200F8,\n    0x000055E8, 0x000200F9, 0x00004C7A, 0x000200F8, 0x000031D3, 0x00050051,\n    0x0000000B, 0x00001CAC, 0x00002EF9, 0x00000001, 0x0007000C, 0x0000000B,\n    0x00001F38, 0x00000001, 0x00000029, 0x00001CAC, 0x00000A0A, 0x00050050,\n    0x00000011, 0x000051EF, 0x00001DD8, 0x00001F38, 0x00050080, 0x00000011,\n    0x0000522C, 0x000051EF, 0x000059EB, 0x000500B2, 0x00000009, 0x00003ECB,\n    0x00003F4D, 0x00000A13, 0x000300F7, 0x00005CE0, 0x00000000, 0x000400FA,\n    0x00003ECB, 0x00002AEE, 0x00003AEF, 0x000200F8, 0x00003AEF, 0x000500AA,\n    0x00000009, 0x000034FE, 0x00003F4D, 0x00000A19, 0x000600A9, 0x0000000B,\n    0x000020F6, 0x000034FE, 0x00000A10, 0x00000A0A, 0x000200F9, 0x00005CE0,\n    0x000200F8, 0x00002AEE, 0x000200F9, 0x00005CE0, 0x000200F8, 0x00005CE0,\n    0x000700F5, 0x0000000B, 0x00004B64, 0x00003F4D, 0x00002AEE, 0x000020F6,\n    0x00003AEF, 0x00050050, 0x00000011, 0x000041BE, 0x0000217E, 0x0000217E,\n    0x000500AE, 0x0000000F, 0x00002E19, 0x000041BE, 0x0000072D, 0x000600A9,\n    0x00000011, 0x00004BB5, 0x00002E19, 0x00000724, 0x0000070F, 0x000500C4,\n    0x00000011, 0x00002AEA, 0x0000522C, 0x00004BB5, 0x00050050, 0x00000011,\n    0x0000605D, 0x00004B64, 0x00004B64, 0x000500C2, 0x00000011, 0x00002385,\n    0x0000605D, 0x00000718, 0x000500C7, 0x00000011, 0x00003EEE, 0x00002385,\n    0x00000724, 0x00050080, 0x00000011, 0x00004573, 0x00002AEA, 0x00003EEE,\n    0x00050086, 0x00000011, 0x00005ECE, 0x00004573, 0x00000937, 0x00050051,\n    0x0000000B, 0x00003048, 0x00005ECE, 0x00000001, 0x00050084, 0x0000000B,\n    0x00002B26, 0x00003048, 0x00005051, 0x00050051, 0x0000000B, 0x00006059,\n    0x00005ECE, 0x00000000, 0x00050080, 0x0000000B, 0x00005420, 0x00002B26,\n    0x00006059, 0x00050080, 0x0000000B, 0x00002226, 0x0000217F, 0x00005420,\n    0x00050084, 0x00000011, 0x00005B31, 0x00005ECE, 0x00000937, 0x00050082,\n    0x00000011, 0x00002E74, 0x00004573, 0x00005B31, 0x00050084, 0x0000000B,\n    0x0000233E, 0x00002226, 0x00000184, 0x00050051, 0x0000000B, 0x00003887,\n    0x00002E74, 0x00000001, 0x00050084, 0x0000000B, 0x00003E12, 0x00003887,\n    0x00000A82, 0x00050051, 0x0000000B, 0x00001AE6, 0x00002E74, 0x00000000,\n    0x00050080, 0x0000000B, 0x000025E0, 0x00003E12, 0x00001AE6, 0x000500C4,\n    0x0000000B, 0x000046C4, 0x000025E0, 0x00000A0D, 0x00050080, 0x0000000B,\n    0x000048BB, 0x0000233E, 0x000046C4, 0x00050089, 0x0000000B, 0x00004DD5,\n    0x000048BB, 0x0000086E, 0x000500C4, 0x0000000B, 0x000046AF, 0x00004DD5,\n    0x00000A11, 0x000500C2, 0x0000000B, 0x00004B85, 0x000046AF, 0x00000A17,\n    0x00060041, 0x00000294, 0x000027BD, 0x00000CC7, 0x00000A0B, 0x00004B85,\n    0x0004003D, 0x00000017, 0x00003AD4, 0x000027BD, 0x00050080, 0x0000000B,\n    0x00002145, 0x000046AF, 0x00000A3A, 0x000500C2, 0x0000000B, 0x000054A6,\n    0x00002145, 0x00000A17, 0x00060041, 0x00000294, 0x00004FAF, 0x00000CC7,\n    0x00000A0B, 0x000054A6, 0x0004003D, 0x00000017, 0x00001C97, 0x00004FAF,\n    0x000500AA, 0x00000009, 0x00003C70, 0x00001DD8, 0x00000A0A, 0x000600A9,\n    0x00000009, 0x00003CF3, 0x00003C70, 0x00000787, 0x00003C70, 0x000300F7,\n    0x00005596, 0x00000002, 0x000400FA, 0x00003CF3, 0x00002620, 0x00005596,\n    0x000200F8, 0x00002620, 0x00050051, 0x0000000B, 0x0000438A, 0x00003AD4,\n    0x00000002, 0x00060052, 0x00000017, 0x000052B6, 0x0000438A, 0x00003AD4,\n    0x00000000, 0x00050051, 0x0000000B, 0x00005A04, 0x00003AD4, 0x00000003,\n    0x00060052, 0x00000017, 0x00002450, 0x00005A04, 0x000052B6, 0x00000001,\n    0x000200F9, 0x00005596, 0x000200F8, 0x00005596, 0x000700F5, 0x00000017,\n    0x00002AAC, 0x00003AD4, 0x00005CE0, 0x00002450, 0x00002620, 0x000300F7,\n    0x0000530F, 0x00000002, 0x000400FA, 0x00004C4F, 0x00003ADC, 0x0000530F,\n    0x000200F8, 0x00003ADC, 0x000500AA, 0x00000009, 0x00003585, 0x000023AA,\n    0x00000A19, 0x000400A8, 0x00000009, 0x00004277, 0x00003585, 0x000300F7,\n    0x00003D52, 0x00000000, 0x000400FA, 0x00004277, 0x000040DF, 0x00003D52,\n    0x000200F8, 0x000040DF, 0x000500AA, 0x00000009, 0x0000495A, 0x000023AA,\n    0x00000A1F, 0x000200F9, 0x00003D52, 0x000200F8, 0x00003D52, 0x000700F5,\n    0x00000009, 0x00002AAD, 0x00003585, 0x00003ADC, 0x0000495A, 0x000040DF,\n    0x000300F7, 0x000039F4, 0x00000002, 0x000400FA, 0x00002AAD, 0x000020A8,\n    0x000039F4, 0x000200F8, 0x000020A8, 0x000500C7, 0x00000017, 0x00004BF1,\n    0x00002AAC, 0x00000755, 0x0009004F, 0x00000017, 0x000051EA, 0x00002AAC,\n    0x00002AAC, 0x00000001, 0x00000000, 0x00000003, 0x00000002, 0x000500C7,\n    0x00000017, 0x00001CED, 0x000051EA, 0x00000352, 0x000500C5, 0x00000017,\n    0x00003640, 0x00004BF1, 0x00001CED, 0x000500C7, 0x00000017, 0x00005311,\n    0x00001C97, 0x00000755, 0x0009004F, 0x00000017, 0x00003BF8, 0x00001C97,\n    0x00001C97, 0x00000001, 0x00000000, 0x00000003, 0x00000002, 0x000500C7,\n    0x00000017, 0x000020A3, 0x00003BF8, 0x00000352, 0x000500C5, 0x00000017,\n    0x00002101, 0x00005311, 0x000020A3, 0x000200F9, 0x000039F4, 0x000200F8,\n    0x000039F4, 0x000700F5, 0x00000017, 0x00002BF3, 0x00001C97, 0x00003D52,\n    0x00002101, 0x000020A8, 0x000700F5, 0x00000017, 0x0000358D, 0x00002AAC,\n    0x00003D52, 0x00003640, 0x000020A8, 0x000200F9, 0x0000530F, 0x000200F8,\n    0x0000530F, 0x000700F5, 0x00000017, 0x000022F8, 0x00001C97, 0x00005596,\n    0x00002BF3, 0x000039F4, 0x000700F5, 0x00000017, 0x000055F9, 0x00002AAC,\n    0x00005596, 0x0000358D, 0x000039F4, 0x00050080, 0x00000011, 0x00001C98,\n    0x00002EF9, 0x000059EC, 0x000300F7, 0x000052F5, 0x00000002, 0x000400FA,\n    0x0000500F, 0x0000294E, 0x0000537D, 0x000200F8, 0x0000537D, 0x0004007C,\n    0x00000012, 0x00002970, 0x00001C98, 0x00050051, 0x0000000C, 0x000045F3,\n    0x00002970, 0x00000001, 0x000500C3, 0x0000000C, 0x00004DC0, 0x000045F3,\n    0x00000A1A, 0x0004007C, 0x0000000C, 0x00005780, 0x000020FC, 0x00050084,\n    0x0000000C, 0x00001F02, 0x00004DC0, 0x00005780, 0x00050051, 0x0000000C,\n    0x00006242, 0x00002970, 0x00000000, 0x000500C3, 0x0000000C, 0x00004FC7,\n    0x00006242, 0x00000A1A, 0x00050080, 0x0000000C, 0x000049B0, 0x00001F02,\n    0x00004FC7, 0x000500C4, 0x0000000C, 0x0000254A, 0x000049B0, 0x00000A1D,\n    0x000500C3, 0x0000000C, 0x0000603B, 0x000045F3, 0x00000A0E, 0x000500C7,\n    0x0000000C, 0x0000539A, 0x0000603B, 0x00000A20, 0x000500C4, 0x0000000C,\n    0x0000534A, 0x0000539A, 0x00000A14, 0x000500C7, 0x0000000C, 0x00004EA5,\n    0x00006242, 0x00000A20, 0x000500C5, 0x0000000C, 0x00002B1A, 0x0000534A,\n    0x00004EA5, 0x000500C5, 0x0000000C, 0x000043B6, 0x0000254A, 0x00002B1A,\n    0x000500C4, 0x0000000C, 0x00005E63, 0x000043B6, 0x00000A13, 0x000500C3,\n    0x0000000C, 0x000031DE, 0x000045F3, 0x00000A17, 0x000500C7, 0x0000000C,\n    0x00005447, 0x000031DE, 0x00000A0E, 0x000500C3, 0x0000000C, 0x000028A6,\n    0x00006242, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000511E, 0x000028A6,\n    0x00000A14, 0x000500C3, 0x0000000C, 0x000028B9, 0x000045F3, 0x00000A14,\n    0x000500C7, 0x0000000C, 0x0000505E, 0x000028B9, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x0000541D, 0x0000505E, 0x00000A0E, 0x000500C6, 0x0000000C,\n    0x000022BA, 0x0000511E, 0x0000541D, 0x000500C7, 0x0000000C, 0x00005076,\n    0x000045F3, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005228, 0x00005076,\n    0x00000A17, 0x000500C4, 0x0000000C, 0x00001997, 0x000022BA, 0x00000A1D,\n    0x000500C5, 0x0000000C, 0x000047FE, 0x00005228, 0x00001997, 0x000500C4,\n    0x0000000C, 0x00001C00, 0x00005447, 0x00000A2C, 0x000500C5, 0x0000000C,\n    0x00003C81, 0x000047FE, 0x00001C00, 0x000500C7, 0x0000000C, 0x000050AF,\n    0x00005E63, 0x00000A38, 0x000500C5, 0x0000000C, 0x00003C71, 0x00003C81,\n    0x000050AF, 0x000500C3, 0x0000000C, 0x00003745, 0x00005E63, 0x00000A17,\n    0x000500C7, 0x0000000C, 0x000018B8, 0x00003745, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x0000547E, 0x000018B8, 0x00000A1A, 0x000500C5, 0x0000000C,\n    0x000045A8, 0x00003C71, 0x0000547E, 0x000500C3, 0x0000000C, 0x00003A6E,\n    0x00005E63, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018B9, 0x00003A6E,\n    0x00000A20, 0x000500C4, 0x0000000C, 0x0000547F, 0x000018B9, 0x00000A23,\n    0x000500C5, 0x0000000C, 0x0000456F, 0x000045A8, 0x0000547F, 0x000500C3,\n    0x0000000C, 0x00003C88, 0x00005E63, 0x00000A23, 0x000500C4, 0x0000000C,\n    0x00002824, 0x00003C88, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B79,\n    0x0000456F, 0x00002824, 0x0004007C, 0x0000000B, 0x000041E5, 0x00003B79,\n    0x000200F9, 0x000052F5, 0x000200F8, 0x0000294E, 0x00050051, 0x0000000B,\n    0x00004D9A, 0x00001C98, 0x00000000, 0x00050051, 0x0000000B, 0x00002C03,\n    0x00001C98, 0x00000001, 0x00060050, 0x00000014, 0x000020DE, 0x00004D9A,\n    0x00002C03, 0x000059FD, 0x0004007C, 0x00000016, 0x00004E9D, 0x000020DE,\n    0x00050051, 0x0000000C, 0x00002BF7, 0x00004E9D, 0x00000002, 0x000500C3,\n    0x0000000C, 0x00004DC1, 0x00002BF7, 0x00000A11, 0x0004007C, 0x0000000C,\n    0x00005781, 0x00006273, 0x00050084, 0x0000000C, 0x00001F03, 0x00004DC1,\n    0x00005781, 0x00050051, 0x0000000C, 0x00006243, 0x00004E9D, 0x00000001,\n    0x000500C3, 0x0000000C, 0x00004A6F, 0x00006243, 0x00000A17, 0x00050080,\n    0x0000000C, 0x00002B2C, 0x00001F03, 0x00004A6F, 0x0004007C, 0x0000000C,\n    0x00004202, 0x000020FC, 0x00050084, 0x0000000C, 0x00003A60, 0x00002B2C,\n    0x00004202, 0x00050051, 0x0000000C, 0x00006244, 0x00004E9D, 0x00000000,\n    0x000500C3, 0x0000000C, 0x00004FC8, 0x00006244, 0x00000A1A, 0x00050080,\n    0x0000000C, 0x000049FC, 0x00003A60, 0x00004FC8, 0x000500C4, 0x0000000C,\n    0x0000225D, 0x000049FC, 0x00000A20, 0x000500C7, 0x0000000C, 0x00002CAA,\n    0x00002BF7, 0x00000A14, 0x000500C4, 0x0000000C, 0x00004CAE, 0x00002CAA,\n    0x00000A1A, 0x000500C3, 0x0000000C, 0x0000383E, 0x00006243, 0x00000A0E,\n    0x000500C7, 0x0000000C, 0x00005374, 0x0000383E, 0x00000A14, 0x000500C4,\n    0x0000000C, 0x000054CA, 0x00005374, 0x00000A14, 0x000500C5, 0x0000000C,\n    0x000042CE, 0x00004CAE, 0x000054CA, 0x000500C7, 0x0000000C, 0x000050D5,\n    0x00006244, 0x00000A20, 0x000500C5, 0x0000000C, 0x00003ADD, 0x000042CE,\n    0x000050D5, 0x000500C5, 0x0000000C, 0x000043B7, 0x0000225D, 0x00003ADD,\n    0x000500C4, 0x0000000C, 0x00005E50, 0x000043B7, 0x00000A13, 0x000500C3,\n    0x0000000C, 0x000032D7, 0x00006243, 0x00000A14, 0x000500C6, 0x0000000C,\n    0x000026C9, 0x000032D7, 0x00004DC1, 0x000500C7, 0x0000000C, 0x00004199,\n    0x000026C9, 0x00000A0E, 0x000500C3, 0x0000000C, 0x00002590, 0x00006244,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x0000505F, 0x00002590, 0x00000A14,\n    0x000500C4, 0x0000000C, 0x0000541E, 0x00004199, 0x00000A0E, 0x000500C6,\n    0x0000000C, 0x000022BB, 0x0000505F, 0x0000541E, 0x000500C7, 0x0000000C,\n    0x00005077, 0x00006243, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005229,\n    0x00005077, 0x00000A17, 0x000500C4, 0x0000000C, 0x00001998, 0x000022BB,\n    0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FF, 0x00005229, 0x00001998,\n    0x000500C4, 0x0000000C, 0x00001C01, 0x00004199, 0x00000A2C, 0x000500C5,\n    0x0000000C, 0x00003C82, 0x000047FF, 0x00001C01, 0x000500C7, 0x0000000C,\n    0x000050B0, 0x00005E50, 0x00000A38, 0x000500C5, 0x0000000C, 0x00003C72,\n    0x00003C82, 0x000050B0, 0x000500C3, 0x0000000C, 0x00003746, 0x00005E50,\n    0x00000A17, 0x000500C7, 0x0000000C, 0x000018BA, 0x00003746, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x00005480, 0x000018BA, 0x00000A1A, 0x000500C5,\n    0x0000000C, 0x000045A9, 0x00003C72, 0x00005480, 0x000500C3, 0x0000000C,\n    0x00003A6F, 0x00005E50, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018BB,\n    0x00003A6F, 0x00000A20, 0x000500C4, 0x0000000C, 0x00005481, 0x000018BB,\n    0x00000A23, 0x000500C5, 0x0000000C, 0x00004570, 0x000045A9, 0x00005481,\n    0x000500C3, 0x0000000C, 0x00003C89, 0x00005E50, 0x00000A23, 0x000500C4,\n    0x0000000C, 0x00002825, 0x00003C89, 0x00000A2F, 0x000500C5, 0x0000000C,\n    0x00003B7A, 0x00004570, 0x00002825, 0x0004007C, 0x0000000B, 0x000041E6,\n    0x00003B7A, 0x000200F9, 0x000052F5, 0x000200F8, 0x000052F5, 0x000700F5,\n    0x0000000B, 0x00002C70, 0x000041E6, 0x0000294E, 0x000041E5, 0x0000537D,\n    0x00050080, 0x0000000B, 0x00005088, 0x00002C70, 0x000062B6, 0x000500C2,\n    0x0000000B, 0x00004EAA, 0x00005088, 0x00000A17, 0x000500AA, 0x00000009,\n    0x00004B9C, 0x00004ADC, 0x00000A16, 0x000300F7, 0x000039BC, 0x00000000,\n    0x000400FA, 0x00004B9C, 0x000033DF, 0x000039BC, 0x000200F8, 0x000033DF,\n    0x0009004F, 0x00000017, 0x00001F16, 0x000055F9, 0x000055F9, 0x00000001,\n    0x00000000, 0x00000003, 0x00000002, 0x000200F9, 0x000039BC, 0x000200F8,\n    0x000039BC, 0x000700F5, 0x00000017, 0x00005972, 0x000055F9, 0x000052F5,\n    0x00001F16, 0x000033DF, 0x000600A9, 0x0000000B, 0x000019CD, 0x00004B9C,\n    0x00000A10, 0x00004ADC, 0x000500AA, 0x00000009, 0x00003464, 0x000019CD,\n    0x00000A0D, 0x000500AA, 0x00000009, 0x000047C2, 0x000019CD, 0x00000A10,\n    0x000500A6, 0x00000009, 0x00005686, 0x00003464, 0x000047C2, 0x000300F7,\n    0x00003463, 0x00000000, 0x000400FA, 0x00005686, 0x00002957, 0x00003463,\n    0x000200F8, 0x00002957, 0x000500C7, 0x00000017, 0x0000475F, 0x00005972,\n    0x000009CE, 0x000500C4, 0x00000017, 0x000024D1, 0x0000475F, 0x0000013D,\n    0x000500C7, 0x00000017, 0x000050AC, 0x00005972, 0x0000072E, 0x000500C2,\n    0x00000017, 0x0000448D, 0x000050AC, 0x0000013D, 0x000500C5, 0x00000017,\n    0x00003FF8, 0x000024D1, 0x0000448D, 0x000200F9, 0x00003463, 0x000200F8,\n    0x00003463, 0x000700F5, 0x00000017, 0x00005879, 0x00005972, 0x000039BC,\n    0x00003FF8, 0x00002957, 0x000500AA, 0x00000009, 0x00004CB6, 0x000019CD,\n    0x00000A13, 0x000500A6, 0x00000009, 0x00003B23, 0x000047C2, 0x00004CB6,\n    0x000300F7, 0x00002C98, 0x00000000, 0x000400FA, 0x00003B23, 0x00002B38,\n    0x00002C98, 0x000200F8, 0x00002B38, 0x000500C4, 0x00000017, 0x00005E17,\n    0x00005879, 0x000002ED, 0x000500C2, 0x00000017, 0x00003BE7, 0x00005879,\n    0x000002ED, 0x000500C5, 0x00000017, 0x000029E8, 0x00005E17, 0x00003BE7,\n    0x000200F9, 0x00002C98, 0x000200F8, 0x00002C98, 0x000700F5, 0x00000017,\n    0x00004D37, 0x00005879, 0x00003463, 0x000029E8, 0x00002B38, 0x00060041,\n    0x00000294, 0x000060F9, 0x00001592, 0x00000A0B, 0x00004EAA, 0x0003003E,\n    0x000060F9, 0x00004D37, 0x00050080, 0x0000000B, 0x00002DCE, 0x00005088,\n    0x00000A6A, 0x000500C2, 0x0000000B, 0x000041F1, 0x00002DCE, 0x00000A17,\n    0x000300F7, 0x00003F86, 0x00000000, 0x000400FA, 0x00004B9C, 0x000033E0,\n    0x00003F86, 0x000200F8, 0x000033E0, 0x0009004F, 0x00000017, 0x00001F17,\n    0x000022F8, 0x000022F8, 0x00000001, 0x00000000, 0x00000003, 0x00000002,\n    0x000200F9, 0x00003F86, 0x000200F8, 0x00003F86, 0x000700F5, 0x00000017,\n    0x00002AAE, 0x000022F8, 0x00002C98, 0x00001F17, 0x000033E0, 0x000300F7,\n    0x00003A1A, 0x00000000, 0x000400FA, 0x00005686, 0x00002958, 0x00003A1A,\n    0x000200F8, 0x00002958, 0x000500C7, 0x00000017, 0x00004760, 0x00002AAE,\n    0x000009CE, 0x000500C4, 0x00000017, 0x000024D2, 0x00004760, 0x0000013D,\n    0x000500C7, 0x00000017, 0x000050AD, 0x00002AAE, 0x0000072E, 0x000500C2,\n    0x00000017, 0x0000448E, 0x000050AD, 0x0000013D, 0x000500C5, 0x00000017,\n    0x00003FF9, 0x000024D2, 0x0000448E, 0x000200F9, 0x00003A1A, 0x000200F8,\n    0x00003A1A, 0x000700F5, 0x00000017, 0x00002AAF, 0x00002AAE, 0x00003F86,\n    0x00003FF9, 0x00002958, 0x000300F7, 0x00002C99, 0x00000000, 0x000400FA,\n    0x00003B23, 0x00002B39, 0x00002C99, 0x000200F8, 0x00002B39, 0x000500C4,\n    0x00000017, 0x00005E18, 0x00002AAF, 0x000002ED, 0x000500C2, 0x00000017,\n    0x00003BE8, 0x00002AAF, 0x000002ED, 0x000500C5, 0x00000017, 0x000029E9,\n    0x00005E18, 0x00003BE8, 0x000200F9, 0x00002C99, 0x000200F8, 0x00002C99,\n    0x000700F5, 0x00000017, 0x00004D38, 0x00002AAF, 0x00003A1A, 0x000029E9,\n    0x00002B39, 0x00060041, 0x00000294, 0x00001F75, 0x00001592, 0x00000A0B,\n    0x000041F1, 0x0003003E, 0x00001F75, 0x00004D38, 0x000200F9, 0x00004C7A,\n    0x000200F8, 0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/resolve_fast_64bpp_1x2xmsaa_scaled_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25204\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 8 8 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_resolve_edram_info\"\n               OpMemberName %push_const_block_xe 1 \"xe_resolve_coordinate_info\"\n               OpMemberName %push_const_block_xe 2 \"xe_resolve_dest_info\"\n               OpMemberName %push_const_block_xe 3 \"xe_resolve_dest_coordinate_info\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_resolve_edram_xe_block \"xe_resolve_edram_xe_block\"\n               OpMemberName %xe_resolve_edram_xe_block 0 \"data\"\n               OpName %xe_resolve_edram \"xe_resolve_edram\"\n               OpName %xe_resolve_dest_xe_block \"xe_resolve_dest_xe_block\"\n               OpMemberName %xe_resolve_dest_xe_block 0 \"data\"\n               OpName %xe_resolve_dest \"xe_resolve_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_resolve_edram_xe_block BufferBlock\n               OpMemberDecorate %xe_resolve_edram_xe_block 0 NonWritable\n               OpMemberDecorate %xe_resolve_edram_xe_block 0 Offset 0\n               OpDecorate %xe_resolve_edram NonWritable\n               OpDecorate %xe_resolve_edram Binding 0\n               OpDecorate %xe_resolve_edram DescriptorSet 0\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_resolve_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_resolve_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_resolve_dest_xe_block 0 Offset 0\n               OpDecorate %xe_resolve_dest NonReadable\n               OpDecorate %xe_resolve_dest Binding 0\n               OpDecorate %xe_resolve_dest DescriptorSet 1\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n     %v4uint = OpTypeVector %uint 4\n       %bool = OpTypeBool\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n     %uint_1 = OpConstant %uint 1\n     %uint_2 = OpConstant %uint 2\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n     %uint_3 = OpConstant %uint 3\n    %uint_16 = OpConstant %uint 16\n     %uint_4 = OpConstant %uint 4\n       %1837 = OpConstantComposite %v2uint %uint_2 %uint_1\n     %v2bool = OpTypeVector %bool 2\n     %uint_0 = OpConstant %uint 0\n       %1807 = OpConstantComposite %v2uint %uint_0 %uint_0\n       %1828 = OpConstantComposite %v2uint %uint_1 %uint_1\n       %1816 = OpConstantComposite %v2uint %uint_1 %uint_0\n    %uint_80 = OpConstant %uint 80\n       %2719 = OpConstantComposite %v2uint %uint_80 %uint_16\n  %uint_2048 = OpConstant %uint 2048\n      %int_2 = OpConstant %int 2\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n      %int_3 = OpConstant %int 3\n     %uint_5 = OpConstant %uint 5\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n  %uint_1023 = OpConstant %uint 1023\n    %uint_10 = OpConstant %uint 10\n    %uint_13 = OpConstant %uint 13\n  %uint_2047 = OpConstant %uint 2047\n    %uint_24 = OpConstant %uint 24\n    %uint_15 = OpConstant %uint 15\n    %uint_28 = OpConstant %uint 28\n    %uint_19 = OpConstant %uint 19\n       %2179 = OpConstantComposite %v2uint %uint_16 %uint_19\n     %uint_7 = OpConstant %uint 7\n%uint_536870912 = OpConstant %uint 536870912\n       %1855 = OpConstantComposite %v2uint %uint_0 %uint_4\n%uint_16777216 = OpConstant %uint 16777216\n    %uint_20 = OpConstant %uint 20\n       %2275 = OpConstantComposite %v2uint %uint_20 %uint_24\n     %v3uint = OpTypeVector %uint 3\n%uint_4294901760 = OpConstant %uint 4294901760\n %uint_65535 = OpConstant %uint 65535\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %1825 = OpConstantComposite %v2uint %uint_2 %uint_0\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_resolve_edram_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_resolve_edram_xe_block = OpTypePointer Uniform %xe_resolve_edram_xe_block\n%xe_resolve_edram = OpVariable %_ptr_Uniform_xe_resolve_edram_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_resolve_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_resolve_dest_xe_block = OpTypePointer Uniform %xe_resolve_dest_xe_block\n%xe_resolve_dest = OpVariable %_ptr_Uniform_xe_resolve_dest_xe_block Uniform\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_8 %uint_8 %uint_1\n       %1954 = OpConstantComposite %v2uint %uint_7 %uint_7\n       %1955 = OpConstantComposite %v2uint %uint_15 %uint_1\n       %1870 = OpConstantComposite %v2uint %uint_3 %uint_3\n       %2122 = OpConstantComposite %v2uint %uint_15 %uint_15\n       %1877 = OpConstantComposite %v4uint %uint_4294901760 %uint_4294901760 %uint_4294901760 %uint_4294901760\n        %850 = OpConstantComposite %v4uint %uint_65535 %uint_65535 %uint_65535 %uint_65535\n       %1846 = OpConstantComposite %v2uint %uint_3 %uint_1\n     %uint_6 = OpConstant %uint 6\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %22245 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %15627 = OpLoad %uint %22245\n      %22700 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %20824 = OpLoad %uint %22700\n      %20561 = OpBitwiseAnd %uint %15627 %uint_1023\n      %19978 = OpShiftRightLogical %uint %15627 %uint_10\n       %8574 = OpBitwiseAnd %uint %19978 %uint_3\n      %21002 = OpShiftRightLogical %uint %15627 %uint_13\n       %8575 = OpBitwiseAnd %uint %21002 %uint_2047\n      %18836 = OpShiftRightLogical %uint %15627 %uint_24\n       %9130 = OpBitwiseAnd %uint %18836 %uint_15\n       %8871 = OpCompositeConstruct %v2uint %20824 %20824\n       %9633 = OpShiftRightLogical %v2uint %8871 %2179\n      %23601 = OpBitwiseAnd %v2uint %9633 %1954\n      %24030 = OpBitwiseAnd %uint %15627 %uint_536870912\n      %12295 = OpINotEqual %bool %24030 %uint_0\n               OpSelectionMerge %14676 None\n               OpBranchConditional %12295 %16739 %21992\n      %21992 = OpLabel\n               OpBranch %14676\n      %16739 = OpLabel\n      %15278 = OpShiftRightLogical %v2uint %23601 %1828\n               OpBranch %14676\n      %14676 = OpLabel\n      %19124 = OpPhi %v2uint %15278 %16739 %1807 %21992\n       %7038 = OpShiftRightLogical %v2uint %8871 %1855\n      %11769 = OpBitwiseAnd %v2uint %7038 %1955\n      %16207 = OpShiftLeftLogical %v2uint %11769 %1870\n      %23019 = OpIMul %v2uint %16207 %23601\n      %13123 = OpShiftRightLogical %uint %20824 %uint_5\n      %14785 = OpBitwiseAnd %uint %13123 %uint_2047\n       %8858 = OpCompositeExtract %uint %23601 0\n      %22993 = OpIMul %uint %14785 %8858\n      %20036 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %18628 = OpLoad %uint %20036\n      %22701 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %20919 = OpLoad %uint %22701\n      %19164 = OpBitwiseAnd %uint %18628 %uint_7\n      %21999 = OpBitwiseAnd %uint %18628 %uint_8\n      %20495 = OpINotEqual %bool %21999 %uint_0\n      %10402 = OpShiftRightLogical %uint %18628 %uint_4\n      %23037 = OpBitwiseAnd %uint %10402 %uint_7\n      %23118 = OpBitwiseAnd %uint %18628 %uint_16777216\n      %19535 = OpINotEqual %bool %23118 %uint_0\n       %8444 = OpBitwiseAnd %uint %20919 %uint_1023\n      %12176 = OpShiftRightLogical %uint %20919 %uint_10\n      %25038 = OpBitwiseAnd %uint %12176 %uint_1023\n      %25203 = OpShiftLeftLogical %uint %25038 %int_1\n      %10422 = OpCompositeConstruct %v2uint %20919 %20919\n      %10385 = OpShiftRightLogical %v2uint %10422 %2275\n      %23379 = OpBitwiseAnd %v2uint %10385 %2122\n      %16208 = OpShiftLeftLogical %v2uint %23379 %1870\n      %23020 = OpIMul %v2uint %16208 %23601\n      %12743 = OpShiftRightLogical %uint %20919 %uint_28\n      %17238 = OpBitwiseAnd %uint %12743 %uint_7\n      %12737 = OpLoad %v3uint %gl_GlobalInvocationID\n      %14500 = OpVectorShuffle %v2uint %12737 %12737 0 1\n      %12025 = OpShiftLeftLogical %v2uint %14500 %1825\n       %7640 = OpCompositeExtract %uint %12025 0\n      %11658 = OpShiftLeftLogical %uint %22993 %uint_3\n      %15379 = OpUGreaterThanEqual %bool %7640 %11658\n               OpSelectionMerge %14025 DontFlatten\n               OpBranchConditional %15379 %21993 %14025\n      %21993 = OpLabel\n               OpBranch %19578\n      %14025 = OpLabel\n      %18615 = OpCompositeExtract %uint %12025 1\n      %16803 = OpCompositeExtract %uint %19124 1\n      %24446 = OpExtInst %uint %1 UMax %18615 %16803\n      %20975 = OpCompositeConstruct %v2uint %7640 %24446\n      %21036 = OpIAdd %v2uint %20975 %23019\n      %16075 = OpULessThanEqual %bool %17238 %uint_3\n               OpSelectionMerge %23776 None\n               OpBranchConditional %16075 %10990 %15087\n      %15087 = OpLabel\n      %13566 = OpIEqual %bool %17238 %uint_5\n       %8438 = OpSelect %uint %13566 %uint_2 %uint_0\n               OpBranch %23776\n      %10990 = OpLabel\n               OpBranch %23776\n      %23776 = OpLabel\n      %19300 = OpPhi %uint %17238 %10990 %8438 %15087\n      %16830 = OpCompositeConstruct %v2uint %8574 %8574\n      %11801 = OpUGreaterThanEqual %v2bool %16830 %1837\n      %19381 = OpSelect %v2uint %11801 %1828 %1807\n      %10986 = OpShiftLeftLogical %v2uint %21036 %19381\n      %24669 = OpCompositeConstruct %v2uint %19300 %19300\n       %9093 = OpShiftRightLogical %v2uint %24669 %1816\n      %16072 = OpBitwiseAnd %v2uint %9093 %1828\n      %20272 = OpIAdd %v2uint %10986 %16072\n      %21145 = OpIMul %v2uint %2719 %23601\n      %14725 = OpShiftRightLogical %v2uint %21145 %1816\n      %19799 = OpUDiv %v2uint %20272 %14725\n      %20390 = OpCompositeExtract %uint %19799 1\n      %11046 = OpIMul %uint %20390 %20561\n      %24665 = OpCompositeExtract %uint %19799 0\n      %21536 = OpIAdd %uint %11046 %24665\n       %8742 = OpIAdd %uint %8575 %21536\n      %22376 = OpIMul %v2uint %19799 %14725\n      %20715 = OpISub %v2uint %20272 %22376\n       %7303 = OpCompositeExtract %uint %21145 0\n      %22882 = OpCompositeExtract %uint %21145 1\n      %13170 = OpIMul %uint %7303 %22882\n      %14551 = OpIMul %uint %8742 %13170\n       %6805 = OpCompositeExtract %uint %20715 1\n      %23526 = OpCompositeExtract %uint %14725 0\n      %22886 = OpIMul %uint %6805 %23526\n       %6886 = OpCompositeExtract %uint %20715 0\n       %9696 = OpIAdd %uint %22886 %6886\n      %18021 = OpShiftLeftLogical %uint %9696 %uint_1\n      %18363 = OpIAdd %uint %14551 %18021\n      %13922 = OpIMul %uint %13170 %uint_2048\n      %21900 = OpUMod %uint %18363 %13922\n      %21321 = OpShiftLeftLogical %uint %21900 %int_2\n      %19333 = OpShiftRightLogical %uint %21321 %int_4\n      %10173 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_edram %int_0 %19333\n      %15060 = OpLoad %v4uint %10173\n       %8517 = OpIAdd %uint %21321 %uint_16\n      %21670 = OpShiftRightLogical %uint %8517 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_edram %int_0 %21670\n       %8801 = OpLoad %v4uint %20399\n      %21106 = OpIEqual %bool %7640 %uint_0\n               OpSelectionMerge %13276 None\n               OpBranchConditional %21106 %11451 %13276\n      %11451 = OpLabel\n      %24156 = OpCompositeExtract %uint %19124 0\n      %22470 = OpINotEqual %bool %24156 %uint_0\n               OpBranch %13276\n      %13276 = OpLabel\n      %10924 = OpPhi %bool %21106 %23776 %22470 %11451\n               OpSelectionMerge %21873 DontFlatten\n               OpBranchConditional %10924 %11508 %21873\n      %11508 = OpLabel\n      %23599 = OpCompositeExtract %uint %19124 0\n      %17346 = OpUGreaterThanEqual %bool %23599 %uint_2\n               OpSelectionMerge %21872 None\n               OpBranchConditional %17346 %15877 %21872\n      %15877 = OpLabel\n      %24532 = OpUGreaterThanEqual %bool %23599 %uint_3\n               OpSelectionMerge %18756 None\n               OpBranchConditional %24532 %9760 %18756\n       %9760 = OpLabel\n      %17290 = OpCompositeExtract %uint %8801 2\n      %21174 = OpCompositeInsert %v4uint %17290 %8801 0\n      %23044 = OpCompositeExtract %uint %8801 3\n       %9296 = OpCompositeInsert %v4uint %23044 %21174 1\n               OpBranch %18756\n      %18756 = OpLabel\n      %17379 = OpPhi %v4uint %8801 %15877 %9296 %9760\n      %22881 = OpCompositeExtract %uint %17379 0\n      %21983 = OpCompositeInsert %v4uint %22881 %15060 2\n      %23045 = OpCompositeExtract %uint %17379 1\n       %9297 = OpCompositeInsert %v4uint %23045 %21983 3\n               OpBranch %21872\n      %21872 = OpLabel\n       %8059 = OpPhi %v4uint %8801 %11508 %17379 %18756\n       %7934 = OpPhi %v4uint %15060 %11508 %9297 %18756\n      %23690 = OpCompositeExtract %uint %7934 2\n      %21984 = OpCompositeInsert %v4uint %23690 %7934 0\n      %23046 = OpCompositeExtract %uint %7934 3\n       %9298 = OpCompositeInsert %v4uint %23046 %21984 1\n               OpBranch %21873\n      %21873 = OpLabel\n      %11213 = OpPhi %v4uint %8801 %13276 %8059 %21872\n      %14093 = OpPhi %v4uint %15060 %13276 %9298 %21872\n               OpSelectionMerge %21263 DontFlatten\n               OpBranchConditional %19535 %15068 %21263\n      %15068 = OpLabel\n      %13701 = OpIEqual %bool %9130 %uint_5\n      %17015 = OpLogicalNot %bool %13701\n               OpSelectionMerge %15698 None\n               OpBranchConditional %17015 %16607 %15698\n      %16607 = OpLabel\n      %18778 = OpIEqual %bool %9130 %uint_7\n               OpBranch %15698\n      %15698 = OpLabel\n      %10925 = OpPhi %bool %13701 %15068 %18778 %16607\n               OpSelectionMerge %14836 DontFlatten\n               OpBranchConditional %10925 %8360 %14836\n       %8360 = OpLabel\n      %19441 = OpBitwiseAnd %v4uint %14093 %1877\n      %20970 = OpVectorShuffle %v4uint %14093 %14093 1 0 3 2\n       %7405 = OpBitwiseAnd %v4uint %20970 %850\n      %13888 = OpBitwiseOr %v4uint %19441 %7405\n      %21265 = OpBitwiseAnd %v4uint %11213 %1877\n      %15352 = OpVectorShuffle %v4uint %11213 %11213 1 0 3 2\n       %8355 = OpBitwiseAnd %v4uint %15352 %850\n       %8449 = OpBitwiseOr %v4uint %21265 %8355\n               OpBranch %14836\n      %14836 = OpLabel\n      %11251 = OpPhi %v4uint %11213 %15698 %8449 %8360\n      %13709 = OpPhi %v4uint %14093 %15698 %13888 %8360\n               OpBranch %21263\n      %21263 = OpLabel\n       %8952 = OpPhi %v4uint %11213 %21873 %11251 %14836\n      %21003 = OpPhi %v4uint %14093 %21873 %13709 %14836\n      %14284 = OpIAdd %v2uint %12025 %23020\n      %24181 = OpShiftRightLogical %v2uint %14284 %1837\n       %7712 = OpUDiv %v2uint %24181 %23601\n      %18183 = OpIMul %v2uint %23601 %7712\n      %18273 = OpISub %v2uint %24181 %18183\n      %11232 = OpShiftLeftLogical %v2uint %7712 %1837\n      %13284 = OpCompositeExtract %uint %18273 0\n      %10872 = OpCompositeExtract %uint %23601 1\n      %22887 = OpIMul %uint %13284 %10872\n       %6943 = OpCompositeExtract %uint %18273 1\n      %10469 = OpIAdd %uint %22887 %6943\n      %18851 = OpBitwiseAnd %v2uint %14284 %1846\n      %10581 = OpShiftLeftLogical %uint %10469 %uint_6\n      %20916 = OpCompositeExtract %uint %18851 1\n      %23596 = OpShiftLeftLogical %uint %20916 %uint_5\n      %19814 = OpBitwiseOr %uint %10581 %23596\n      %21476 = OpCompositeExtract %uint %18851 0\n      %11714 = OpShiftLeftLogical %uint %21476 %uint_3\n      %11193 = OpBitwiseOr %uint %19814 %11714\n               OpSelectionMerge %21313 DontFlatten\n               OpBranchConditional %20495 %10574 %21373\n      %21373 = OpLabel\n      %10608 = OpBitcast %v2int %11232\n      %17907 = OpCompositeExtract %int %10608 1\n      %19904 = OpShiftRightArithmetic %int %17907 %int_5\n      %22400 = OpBitcast %int %8444\n       %7938 = OpIMul %int %19904 %22400\n      %25154 = OpCompositeExtract %int %10608 0\n      %20423 = OpShiftRightArithmetic %int %25154 %int_5\n      %18864 = OpIAdd %int %7938 %20423\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %17907 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25154 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17334 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17334 %uint_3\n      %12766 = OpShiftRightArithmetic %int %17907 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25154 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %17907 %int_3\n      %20574 = OpBitwiseAnd %int %10425 %int_1\n      %21533 = OpShiftLeftLogical %int %20574 %int_1\n       %8890 = OpBitwiseXor %int %20766 %21533\n      %20598 = OpBitwiseAnd %int %17907 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6551\n       %7168 = OpShiftLeftLogical %int %21575 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24163 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24163 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24163 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24163 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %21313\n      %10574 = OpLabel\n      %19866 = OpCompositeExtract %uint %11232 0\n      %11267 = OpCompositeExtract %uint %11232 1\n       %8414 = OpCompositeConstruct %v3uint %19866 %11267 %23037\n      %20125 = OpBitcast %v3int %8414\n      %11255 = OpCompositeExtract %int %20125 2\n      %19905 = OpShiftRightArithmetic %int %11255 %int_2\n      %22401 = OpBitcast %int %25203\n       %7939 = OpIMul %int %19905 %22401\n      %25155 = OpCompositeExtract %int %20125 1\n      %19055 = OpShiftRightArithmetic %int %25155 %int_4\n      %11052 = OpIAdd %int %7939 %19055\n      %16898 = OpBitcast %int %8444\n      %14944 = OpIMul %int %11052 %16898\n      %25156 = OpCompositeExtract %int %20125 0\n      %20424 = OpShiftRightArithmetic %int %25156 %int_5\n      %18940 = OpIAdd %int %14944 %20424\n       %8797 = OpShiftLeftLogical %int %18940 %int_7\n      %11434 = OpBitwiseAnd %int %11255 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %25155 %int_1\n      %21364 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21364 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %25156 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17335 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17335 %uint_3\n      %13015 = OpShiftRightArithmetic %int %25155 %int_3\n       %9929 = OpBitwiseXor %int %13015 %19905\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %25156 %int_3\n      %20575 = OpBitwiseAnd %int %9616 %int_3\n      %21534 = OpShiftLeftLogical %int %16793 %int_1\n       %8891 = OpBitwiseXor %int %20575 %21534\n      %20599 = OpBitwiseAnd %int %25155 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6552\n       %7169 = OpShiftLeftLogical %int %16793 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24144 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24144 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24144 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24144 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %21313\n      %21313 = OpLabel\n       %9506 = OpPhi %uint %16870 %10574 %16869 %21373\n      %16843 = OpIMul %uint %8858 %10872\n      %11993 = OpIMul %uint %9506 %16843\n      %16012 = OpIAdd %uint %11993 %11193\n      %22330 = OpShiftRightLogical %uint %16012 %int_4\n      %19356 = OpIEqual %bool %19164 %uint_4\n               OpSelectionMerge %14780 None\n               OpBranchConditional %19356 %13279 %14780\n      %13279 = OpLabel\n       %7958 = OpVectorShuffle %v4uint %21003 %21003 1 0 3 2\n               OpBranch %14780\n      %14780 = OpLabel\n      %22898 = OpPhi %v4uint %21003 %21313 %7958 %13279\n       %6605 = OpSelect %uint %19356 %uint_2 %19164\n      %13412 = OpIEqual %bool %6605 %uint_1\n      %18370 = OpIEqual %bool %6605 %uint_2\n      %22150 = OpLogicalOr %bool %13412 %18370\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %22898 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %22898 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22649 = OpPhi %v4uint %22898 %14780 %16376 %10583\n      %19638 = OpIEqual %bool %6605 %uint_3\n      %15139 = OpLogicalOr %bool %18370 %19638\n               OpSelectionMerge %11416 None\n               OpBranchConditional %15139 %11064 %11416\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22649 %749\n      %15335 = OpShiftRightLogical %v4uint %22649 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %11416\n      %11416 = OpLabel\n      %19767 = OpPhi %v4uint %22649 %13411 %10728 %11064\n      %24825 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_dest %int_0 %22330\n               OpStore %24825 %19767\n      %11726 = OpIAdd %uint %16012 %uint_16\n      %16881 = OpShiftRightLogical %uint %11726 %int_4\n               OpSelectionMerge %16262 None\n               OpBranchConditional %19356 %13280 %16262\n      %13280 = OpLabel\n       %7959 = OpVectorShuffle %v4uint %8952 %8952 1 0 3 2\n               OpBranch %16262\n      %16262 = OpLabel\n      %10926 = OpPhi %v4uint %8952 %11416 %7959 %13280\n               OpSelectionMerge %14874 None\n               OpBranchConditional %22150 %10584 %14874\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %10926 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %10926 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %14874\n      %14874 = OpLabel\n      %10927 = OpPhi %v4uint %10926 %16262 %16377 %10584\n               OpSelectionMerge %11417 None\n               OpBranchConditional %15139 %11065 %11417\n      %11065 = OpLabel\n      %24088 = OpShiftLeftLogical %v4uint %10927 %749\n      %15336 = OpShiftRightLogical %v4uint %10927 %749\n      %10729 = OpBitwiseOr %v4uint %24088 %15336\n               OpBranch %11417\n      %11417 = OpLabel\n      %19768 = OpPhi %v4uint %10927 %14874 %10729 %11065\n       %8053 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_dest %int_0 %16881\n               OpStore %8053 %19768\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t resolve_fast_64bpp_1x2xmsaa_scaled_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006274, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000008, 0x00000008, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x000003F9, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x00090006, 0x000003F9, 0x00000000, 0x725F6578,\n    0x6C6F7365, 0x655F6576, 0x6D617264, 0x666E695F, 0x0000006F, 0x000A0006,\n    0x000003F9, 0x00000001, 0x725F6578, 0x6C6F7365, 0x635F6576, 0x64726F6F,\n    0x74616E69, 0x6E695F65, 0x00006F66, 0x00090006, 0x000003F9, 0x00000002,\n    0x725F6578, 0x6C6F7365, 0x645F6576, 0x5F747365, 0x6F666E69, 0x00000000,\n    0x000B0006, 0x000003F9, 0x00000003, 0x725F6578, 0x6C6F7365, 0x645F6576,\n    0x5F747365, 0x726F6F63, 0x616E6964, 0x695F6574, 0x006F666E, 0x00060005,\n    0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578, 0x00080005,\n    0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F, 0x496E6F69,\n    0x00000044, 0x00090005, 0x000007B4, 0x725F6578, 0x6C6F7365, 0x655F6576,\n    0x6D617264, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006, 0x000007B4,\n    0x00000000, 0x61746164, 0x00000000, 0x00070005, 0x00000CC7, 0x725F6578,\n    0x6C6F7365, 0x655F6576, 0x6D617264, 0x00000000, 0x00090005, 0x000007B5,\n    0x725F6578, 0x6C6F7365, 0x645F6576, 0x5F747365, 0x625F6578, 0x6B636F6C,\n    0x00000000, 0x00050006, 0x000007B5, 0x00000000, 0x61746164, 0x00000000,\n    0x00060005, 0x00001592, 0x725F6578, 0x6C6F7365, 0x645F6576, 0x00747365,\n    0x00030047, 0x000003F9, 0x00000002, 0x00050048, 0x000003F9, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x000003F9, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x000003F9, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x000003F9, 0x00000003, 0x00000023, 0x0000000C, 0x00040047,\n    0x00000F48, 0x0000000B, 0x0000001C, 0x00040047, 0x000007DC, 0x00000006,\n    0x00000010, 0x00030047, 0x000007B4, 0x00000003, 0x00040048, 0x000007B4,\n    0x00000000, 0x00000018, 0x00050048, 0x000007B4, 0x00000000, 0x00000023,\n    0x00000000, 0x00030047, 0x00000CC7, 0x00000018, 0x00040047, 0x00000CC7,\n    0x00000021, 0x00000000, 0x00040047, 0x00000CC7, 0x00000022, 0x00000000,\n    0x00040047, 0x000007DD, 0x00000006, 0x00000010, 0x00030047, 0x000007B5,\n    0x00000003, 0x00040048, 0x000007B5, 0x00000000, 0x00000019, 0x00050048,\n    0x000007B5, 0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x00001592,\n    0x00000019, 0x00040047, 0x00001592, 0x00000021, 0x00000000, 0x00040047,\n    0x00001592, 0x00000022, 0x00000001, 0x00040047, 0x00000AC7, 0x0000000B,\n    0x00000019, 0x00020013, 0x00000008, 0x00030021, 0x00000502, 0x00000008,\n    0x00040015, 0x0000000B, 0x00000020, 0x00000000, 0x00040017, 0x00000011,\n    0x0000000B, 0x00000002, 0x00040017, 0x00000017, 0x0000000B, 0x00000004,\n    0x00020014, 0x00000009, 0x00040015, 0x0000000C, 0x00000020, 0x00000001,\n    0x00040017, 0x00000012, 0x0000000C, 0x00000002, 0x00040017, 0x00000016,\n    0x0000000C, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001,\n    0x0004002B, 0x0000000B, 0x00000A10, 0x00000002, 0x0004002B, 0x0000000B,\n    0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B, 0x00000A22, 0x00000008,\n    0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00, 0x0004002B, 0x0000000B,\n    0x00000A13, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A3A, 0x00000010,\n    0x0004002B, 0x0000000B, 0x00000A16, 0x00000004, 0x0005002C, 0x00000011,\n    0x0000072D, 0x00000A10, 0x00000A0D, 0x00040017, 0x0000000F, 0x00000009,\n    0x00000002, 0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000, 0x0005002C,\n    0x00000011, 0x0000070F, 0x00000A0A, 0x00000A0A, 0x0005002C, 0x00000011,\n    0x00000724, 0x00000A0D, 0x00000A0D, 0x0005002C, 0x00000011, 0x00000718,\n    0x00000A0D, 0x00000A0A, 0x0004002B, 0x0000000B, 0x00000AFA, 0x00000050,\n    0x0005002C, 0x00000011, 0x00000A9F, 0x00000AFA, 0x00000A3A, 0x0004002B,\n    0x0000000B, 0x00000A84, 0x00000800, 0x0004002B, 0x0000000C, 0x00000A11,\n    0x00000002, 0x0004002B, 0x0000000C, 0x00000A17, 0x00000004, 0x0004002B,\n    0x0000000C, 0x00000A1D, 0x00000006, 0x0004002B, 0x0000000C, 0x00000A2C,\n    0x0000000B, 0x0004002B, 0x0000000C, 0x00000A38, 0x0000000F, 0x0004002B,\n    0x0000000C, 0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C, 0x00000A1A,\n    0x00000005, 0x0004002B, 0x0000000C, 0x00000A20, 0x00000007, 0x0004002B,\n    0x0000000C, 0x00000A23, 0x00000008, 0x0004002B, 0x0000000C, 0x00000A2F,\n    0x0000000C, 0x0004002B, 0x0000000C, 0x00000A14, 0x00000003, 0x0004002B,\n    0x0000000B, 0x00000A19, 0x00000005, 0x0004002B, 0x0000000C, 0x00000A0B,\n    0x00000000, 0x0006001E, 0x000003F9, 0x0000000B, 0x0000000B, 0x0000000B,\n    0x0000000B, 0x00040020, 0x00000676, 0x00000009, 0x000003F9, 0x0004003B,\n    0x00000676, 0x00000CE9, 0x00000009, 0x00040020, 0x00000288, 0x00000009,\n    0x0000000B, 0x0004002B, 0x0000000B, 0x00000A44, 0x000003FF, 0x0004002B,\n    0x0000000B, 0x00000A28, 0x0000000A, 0x0004002B, 0x0000000B, 0x00000A31,\n    0x0000000D, 0x0004002B, 0x0000000B, 0x00000A81, 0x000007FF, 0x0004002B,\n    0x0000000B, 0x00000A52, 0x00000018, 0x0004002B, 0x0000000B, 0x00000A37,\n    0x0000000F, 0x0004002B, 0x0000000B, 0x00000A5E, 0x0000001C, 0x0004002B,\n    0x0000000B, 0x00000A43, 0x00000013, 0x0005002C, 0x00000011, 0x00000883,\n    0x00000A3A, 0x00000A43, 0x0004002B, 0x0000000B, 0x00000A1F, 0x00000007,\n    0x0004002B, 0x0000000B, 0x00000510, 0x20000000, 0x0005002C, 0x00000011,\n    0x0000073F, 0x00000A0A, 0x00000A16, 0x0004002B, 0x0000000B, 0x00000926,\n    0x01000000, 0x0004002B, 0x0000000B, 0x00000A46, 0x00000014, 0x0005002C,\n    0x00000011, 0x000008E3, 0x00000A46, 0x00000A52, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x0004002B, 0x0000000B, 0x0000068D, 0xFFFF0000,\n    0x0004002B, 0x0000000B, 0x000001C1, 0x0000FFFF, 0x00040020, 0x00000291,\n    0x00000001, 0x00000014, 0x0004003B, 0x00000291, 0x00000F48, 0x00000001,\n    0x0005002C, 0x00000011, 0x00000721, 0x00000A10, 0x00000A0A, 0x0003001D,\n    0x000007DC, 0x00000017, 0x0003001E, 0x000007B4, 0x000007DC, 0x00040020,\n    0x00000A32, 0x00000002, 0x000007B4, 0x0004003B, 0x00000A32, 0x00000CC7,\n    0x00000002, 0x00040020, 0x00000294, 0x00000002, 0x00000017, 0x0003001D,\n    0x000007DD, 0x00000017, 0x0003001E, 0x000007B5, 0x000007DD, 0x00040020,\n    0x00000A33, 0x00000002, 0x000007B5, 0x0004003B, 0x00000A33, 0x00001592,\n    0x00000002, 0x0006002C, 0x00000014, 0x00000AC7, 0x00000A22, 0x00000A22,\n    0x00000A0D, 0x0005002C, 0x00000011, 0x000007A2, 0x00000A1F, 0x00000A1F,\n    0x0005002C, 0x00000011, 0x000007A3, 0x00000A37, 0x00000A0D, 0x0005002C,\n    0x00000011, 0x0000074E, 0x00000A13, 0x00000A13, 0x0005002C, 0x00000011,\n    0x0000084A, 0x00000A37, 0x00000A37, 0x0007002C, 0x00000017, 0x00000755,\n    0x0000068D, 0x0000068D, 0x0000068D, 0x0000068D, 0x0007002C, 0x00000017,\n    0x00000352, 0x000001C1, 0x000001C1, 0x000001C1, 0x000001C1, 0x0005002C,\n    0x00000011, 0x00000736, 0x00000A13, 0x00000A0D, 0x0004002B, 0x0000000B,\n    0x00000A1C, 0x00000006, 0x0007002C, 0x00000017, 0x000009CE, 0x000008A6,\n    0x000008A6, 0x000008A6, 0x000008A6, 0x0007002C, 0x00000017, 0x0000013D,\n    0x00000A22, 0x00000A22, 0x00000A22, 0x00000A22, 0x0007002C, 0x00000017,\n    0x0000072E, 0x000005FD, 0x000005FD, 0x000005FD, 0x000005FD, 0x0007002C,\n    0x00000017, 0x000002ED, 0x00000A3A, 0x00000A3A, 0x00000A3A, 0x00000A3A,\n    0x00050036, 0x00000008, 0x0000161F, 0x00000000, 0x00000502, 0x000200F8,\n    0x00003B06, 0x000300F7, 0x00004C7A, 0x00000000, 0x000300FB, 0x00000A0A,\n    0x00002E68, 0x000200F8, 0x00002E68, 0x00050041, 0x00000288, 0x000056E5,\n    0x00000CE9, 0x00000A0B, 0x0004003D, 0x0000000B, 0x00003D0B, 0x000056E5,\n    0x00050041, 0x00000288, 0x000058AC, 0x00000CE9, 0x00000A0E, 0x0004003D,\n    0x0000000B, 0x00005158, 0x000058AC, 0x000500C7, 0x0000000B, 0x00005051,\n    0x00003D0B, 0x00000A44, 0x000500C2, 0x0000000B, 0x00004E0A, 0x00003D0B,\n    0x00000A28, 0x000500C7, 0x0000000B, 0x0000217E, 0x00004E0A, 0x00000A13,\n    0x000500C2, 0x0000000B, 0x0000520A, 0x00003D0B, 0x00000A31, 0x000500C7,\n    0x0000000B, 0x0000217F, 0x0000520A, 0x00000A81, 0x000500C2, 0x0000000B,\n    0x00004994, 0x00003D0B, 0x00000A52, 0x000500C7, 0x0000000B, 0x000023AA,\n    0x00004994, 0x00000A37, 0x00050050, 0x00000011, 0x000022A7, 0x00005158,\n    0x00005158, 0x000500C2, 0x00000011, 0x000025A1, 0x000022A7, 0x00000883,\n    0x000500C7, 0x00000011, 0x00005C31, 0x000025A1, 0x000007A2, 0x000500C7,\n    0x0000000B, 0x00005DDE, 0x00003D0B, 0x00000510, 0x000500AB, 0x00000009,\n    0x00003007, 0x00005DDE, 0x00000A0A, 0x000300F7, 0x00003954, 0x00000000,\n    0x000400FA, 0x00003007, 0x00004163, 0x000055E8, 0x000200F8, 0x000055E8,\n    0x000200F9, 0x00003954, 0x000200F8, 0x00004163, 0x000500C2, 0x00000011,\n    0x00003BAE, 0x00005C31, 0x00000724, 0x000200F9, 0x00003954, 0x000200F8,\n    0x00003954, 0x000700F5, 0x00000011, 0x00004AB4, 0x00003BAE, 0x00004163,\n    0x0000070F, 0x000055E8, 0x000500C2, 0x00000011, 0x00001B7E, 0x000022A7,\n    0x0000073F, 0x000500C7, 0x00000011, 0x00002DF9, 0x00001B7E, 0x000007A3,\n    0x000500C4, 0x00000011, 0x00003F4F, 0x00002DF9, 0x0000074E, 0x00050084,\n    0x00000011, 0x000059EB, 0x00003F4F, 0x00005C31, 0x000500C2, 0x0000000B,\n    0x00003343, 0x00005158, 0x00000A19, 0x000500C7, 0x0000000B, 0x000039C1,\n    0x00003343, 0x00000A81, 0x00050051, 0x0000000B, 0x0000229A, 0x00005C31,\n    0x00000000, 0x00050084, 0x0000000B, 0x000059D1, 0x000039C1, 0x0000229A,\n    0x00050041, 0x00000288, 0x00004E44, 0x00000CE9, 0x00000A11, 0x0004003D,\n    0x0000000B, 0x000048C4, 0x00004E44, 0x00050041, 0x00000288, 0x000058AD,\n    0x00000CE9, 0x00000A14, 0x0004003D, 0x0000000B, 0x000051B7, 0x000058AD,\n    0x000500C7, 0x0000000B, 0x00004ADC, 0x000048C4, 0x00000A1F, 0x000500C7,\n    0x0000000B, 0x000055EF, 0x000048C4, 0x00000A22, 0x000500AB, 0x00000009,\n    0x0000500F, 0x000055EF, 0x00000A0A, 0x000500C2, 0x0000000B, 0x000028A2,\n    0x000048C4, 0x00000A16, 0x000500C7, 0x0000000B, 0x000059FD, 0x000028A2,\n    0x00000A1F, 0x000500C7, 0x0000000B, 0x00005A4E, 0x000048C4, 0x00000926,\n    0x000500AB, 0x00000009, 0x00004C4F, 0x00005A4E, 0x00000A0A, 0x000500C7,\n    0x0000000B, 0x000020FC, 0x000051B7, 0x00000A44, 0x000500C2, 0x0000000B,\n    0x00002F90, 0x000051B7, 0x00000A28, 0x000500C7, 0x0000000B, 0x000061CE,\n    0x00002F90, 0x00000A44, 0x000500C4, 0x0000000B, 0x00006273, 0x000061CE,\n    0x00000A0E, 0x00050050, 0x00000011, 0x000028B6, 0x000051B7, 0x000051B7,\n    0x000500C2, 0x00000011, 0x00002891, 0x000028B6, 0x000008E3, 0x000500C7,\n    0x00000011, 0x00005B53, 0x00002891, 0x0000084A, 0x000500C4, 0x00000011,\n    0x00003F50, 0x00005B53, 0x0000074E, 0x00050084, 0x00000011, 0x000059EC,\n    0x00003F50, 0x00005C31, 0x000500C2, 0x0000000B, 0x000031C7, 0x000051B7,\n    0x00000A5E, 0x000500C7, 0x0000000B, 0x00004356, 0x000031C7, 0x00000A1F,\n    0x0004003D, 0x00000014, 0x000031C1, 0x00000F48, 0x0007004F, 0x00000011,\n    0x000038A4, 0x000031C1, 0x000031C1, 0x00000000, 0x00000001, 0x000500C4,\n    0x00000011, 0x00002EF9, 0x000038A4, 0x00000721, 0x00050051, 0x0000000B,\n    0x00001DD8, 0x00002EF9, 0x00000000, 0x000500C4, 0x0000000B, 0x00002D8A,\n    0x000059D1, 0x00000A13, 0x000500AE, 0x00000009, 0x00003C13, 0x00001DD8,\n    0x00002D8A, 0x000300F7, 0x000036C9, 0x00000002, 0x000400FA, 0x00003C13,\n    0x000055E9, 0x000036C9, 0x000200F8, 0x000055E9, 0x000200F9, 0x00004C7A,\n    0x000200F8, 0x000036C9, 0x00050051, 0x0000000B, 0x000048B7, 0x00002EF9,\n    0x00000001, 0x00050051, 0x0000000B, 0x000041A3, 0x00004AB4, 0x00000001,\n    0x0007000C, 0x0000000B, 0x00005F7E, 0x00000001, 0x00000029, 0x000048B7,\n    0x000041A3, 0x00050050, 0x00000011, 0x000051EF, 0x00001DD8, 0x00005F7E,\n    0x00050080, 0x00000011, 0x0000522C, 0x000051EF, 0x000059EB, 0x000500B2,\n    0x00000009, 0x00003ECB, 0x00004356, 0x00000A13, 0x000300F7, 0x00005CE0,\n    0x00000000, 0x000400FA, 0x00003ECB, 0x00002AEE, 0x00003AEF, 0x000200F8,\n    0x00003AEF, 0x000500AA, 0x00000009, 0x000034FE, 0x00004356, 0x00000A19,\n    0x000600A9, 0x0000000B, 0x000020F6, 0x000034FE, 0x00000A10, 0x00000A0A,\n    0x000200F9, 0x00005CE0, 0x000200F8, 0x00002AEE, 0x000200F9, 0x00005CE0,\n    0x000200F8, 0x00005CE0, 0x000700F5, 0x0000000B, 0x00004B64, 0x00004356,\n    0x00002AEE, 0x000020F6, 0x00003AEF, 0x00050050, 0x00000011, 0x000041BE,\n    0x0000217E, 0x0000217E, 0x000500AE, 0x0000000F, 0x00002E19, 0x000041BE,\n    0x0000072D, 0x000600A9, 0x00000011, 0x00004BB5, 0x00002E19, 0x00000724,\n    0x0000070F, 0x000500C4, 0x00000011, 0x00002AEA, 0x0000522C, 0x00004BB5,\n    0x00050050, 0x00000011, 0x0000605D, 0x00004B64, 0x00004B64, 0x000500C2,\n    0x00000011, 0x00002385, 0x0000605D, 0x00000718, 0x000500C7, 0x00000011,\n    0x00003EC8, 0x00002385, 0x00000724, 0x00050080, 0x00000011, 0x00004F30,\n    0x00002AEA, 0x00003EC8, 0x00050084, 0x00000011, 0x00005299, 0x00000A9F,\n    0x00005C31, 0x000500C2, 0x00000011, 0x00003985, 0x00005299, 0x00000718,\n    0x00050086, 0x00000011, 0x00004D57, 0x00004F30, 0x00003985, 0x00050051,\n    0x0000000B, 0x00004FA6, 0x00004D57, 0x00000001, 0x00050084, 0x0000000B,\n    0x00002B26, 0x00004FA6, 0x00005051, 0x00050051, 0x0000000B, 0x00006059,\n    0x00004D57, 0x00000000, 0x00050080, 0x0000000B, 0x00005420, 0x00002B26,\n    0x00006059, 0x00050080, 0x0000000B, 0x00002226, 0x0000217F, 0x00005420,\n    0x00050084, 0x00000011, 0x00005768, 0x00004D57, 0x00003985, 0x00050082,\n    0x00000011, 0x000050EB, 0x00004F30, 0x00005768, 0x00050051, 0x0000000B,\n    0x00001C87, 0x00005299, 0x00000000, 0x00050051, 0x0000000B, 0x00005962,\n    0x00005299, 0x00000001, 0x00050084, 0x0000000B, 0x00003372, 0x00001C87,\n    0x00005962, 0x00050084, 0x0000000B, 0x000038D7, 0x00002226, 0x00003372,\n    0x00050051, 0x0000000B, 0x00001A95, 0x000050EB, 0x00000001, 0x00050051,\n    0x0000000B, 0x00005BE6, 0x00003985, 0x00000000, 0x00050084, 0x0000000B,\n    0x00005966, 0x00001A95, 0x00005BE6, 0x00050051, 0x0000000B, 0x00001AE6,\n    0x000050EB, 0x00000000, 0x00050080, 0x0000000B, 0x000025E0, 0x00005966,\n    0x00001AE6, 0x000500C4, 0x0000000B, 0x00004665, 0x000025E0, 0x00000A0D,\n    0x00050080, 0x0000000B, 0x000047BB, 0x000038D7, 0x00004665, 0x00050084,\n    0x0000000B, 0x00003662, 0x00003372, 0x00000A84, 0x00050089, 0x0000000B,\n    0x0000558C, 0x000047BB, 0x00003662, 0x000500C4, 0x0000000B, 0x00005349,\n    0x0000558C, 0x00000A11, 0x000500C2, 0x0000000B, 0x00004B85, 0x00005349,\n    0x00000A17, 0x00060041, 0x00000294, 0x000027BD, 0x00000CC7, 0x00000A0B,\n    0x00004B85, 0x0004003D, 0x00000017, 0x00003AD4, 0x000027BD, 0x00050080,\n    0x0000000B, 0x00002145, 0x00005349, 0x00000A3A, 0x000500C2, 0x0000000B,\n    0x000054A6, 0x00002145, 0x00000A17, 0x00060041, 0x00000294, 0x00004FAF,\n    0x00000CC7, 0x00000A0B, 0x000054A6, 0x0004003D, 0x00000017, 0x00002261,\n    0x00004FAF, 0x000500AA, 0x00000009, 0x00005272, 0x00001DD8, 0x00000A0A,\n    0x000300F7, 0x000033DC, 0x00000000, 0x000400FA, 0x00005272, 0x00002CBB,\n    0x000033DC, 0x000200F8, 0x00002CBB, 0x00050051, 0x0000000B, 0x00005E5C,\n    0x00004AB4, 0x00000000, 0x000500AB, 0x00000009, 0x000057C6, 0x00005E5C,\n    0x00000A0A, 0x000200F9, 0x000033DC, 0x000200F8, 0x000033DC, 0x000700F5,\n    0x00000009, 0x00002AAC, 0x00005272, 0x00005CE0, 0x000057C6, 0x00002CBB,\n    0x000300F7, 0x00005571, 0x00000002, 0x000400FA, 0x00002AAC, 0x00002CF4,\n    0x00005571, 0x000200F8, 0x00002CF4, 0x00050051, 0x0000000B, 0x00005C2F,\n    0x00004AB4, 0x00000000, 0x000500AE, 0x00000009, 0x000043C2, 0x00005C2F,\n    0x00000A10, 0x000300F7, 0x00005570, 0x00000000, 0x000400FA, 0x000043C2,\n    0x00003E05, 0x00005570, 0x000200F8, 0x00003E05, 0x000500AE, 0x00000009,\n    0x00005FD4, 0x00005C2F, 0x00000A13, 0x000300F7, 0x00004944, 0x00000000,\n    0x000400FA, 0x00005FD4, 0x00002620, 0x00004944, 0x000200F8, 0x00002620,\n    0x00050051, 0x0000000B, 0x0000438A, 0x00002261, 0x00000002, 0x00060052,\n    0x00000017, 0x000052B6, 0x0000438A, 0x00002261, 0x00000000, 0x00050051,\n    0x0000000B, 0x00005A04, 0x00002261, 0x00000003, 0x00060052, 0x00000017,\n    0x00002450, 0x00005A04, 0x000052B6, 0x00000001, 0x000200F9, 0x00004944,\n    0x000200F8, 0x00004944, 0x000700F5, 0x00000017, 0x000043E3, 0x00002261,\n    0x00003E05, 0x00002450, 0x00002620, 0x00050051, 0x0000000B, 0x00005961,\n    0x000043E3, 0x00000000, 0x00060052, 0x00000017, 0x000055DF, 0x00005961,\n    0x00003AD4, 0x00000002, 0x00050051, 0x0000000B, 0x00005A05, 0x000043E3,\n    0x00000001, 0x00060052, 0x00000017, 0x00002451, 0x00005A05, 0x000055DF,\n    0x00000003, 0x000200F9, 0x00005570, 0x000200F8, 0x00005570, 0x000700F5,\n    0x00000017, 0x00001F7B, 0x00002261, 0x00002CF4, 0x000043E3, 0x00004944,\n    0x000700F5, 0x00000017, 0x00001EFE, 0x00003AD4, 0x00002CF4, 0x00002451,\n    0x00004944, 0x00050051, 0x0000000B, 0x00005C8A, 0x00001EFE, 0x00000002,\n    0x00060052, 0x00000017, 0x000055E0, 0x00005C8A, 0x00001EFE, 0x00000000,\n    0x00050051, 0x0000000B, 0x00005A06, 0x00001EFE, 0x00000003, 0x00060052,\n    0x00000017, 0x00002452, 0x00005A06, 0x000055E0, 0x00000001, 0x000200F9,\n    0x00005571, 0x000200F8, 0x00005571, 0x000700F5, 0x00000017, 0x00002BCD,\n    0x00002261, 0x000033DC, 0x00001F7B, 0x00005570, 0x000700F5, 0x00000017,\n    0x0000370D, 0x00003AD4, 0x000033DC, 0x00002452, 0x00005570, 0x000300F7,\n    0x0000530F, 0x00000002, 0x000400FA, 0x00004C4F, 0x00003ADC, 0x0000530F,\n    0x000200F8, 0x00003ADC, 0x000500AA, 0x00000009, 0x00003585, 0x000023AA,\n    0x00000A19, 0x000400A8, 0x00000009, 0x00004277, 0x00003585, 0x000300F7,\n    0x00003D52, 0x00000000, 0x000400FA, 0x00004277, 0x000040DF, 0x00003D52,\n    0x000200F8, 0x000040DF, 0x000500AA, 0x00000009, 0x0000495A, 0x000023AA,\n    0x00000A1F, 0x000200F9, 0x00003D52, 0x000200F8, 0x00003D52, 0x000700F5,\n    0x00000009, 0x00002AAD, 0x00003585, 0x00003ADC, 0x0000495A, 0x000040DF,\n    0x000300F7, 0x000039F4, 0x00000002, 0x000400FA, 0x00002AAD, 0x000020A8,\n    0x000039F4, 0x000200F8, 0x000020A8, 0x000500C7, 0x00000017, 0x00004BF1,\n    0x0000370D, 0x00000755, 0x0009004F, 0x00000017, 0x000051EA, 0x0000370D,\n    0x0000370D, 0x00000001, 0x00000000, 0x00000003, 0x00000002, 0x000500C7,\n    0x00000017, 0x00001CED, 0x000051EA, 0x00000352, 0x000500C5, 0x00000017,\n    0x00003640, 0x00004BF1, 0x00001CED, 0x000500C7, 0x00000017, 0x00005311,\n    0x00002BCD, 0x00000755, 0x0009004F, 0x00000017, 0x00003BF8, 0x00002BCD,\n    0x00002BCD, 0x00000001, 0x00000000, 0x00000003, 0x00000002, 0x000500C7,\n    0x00000017, 0x000020A3, 0x00003BF8, 0x00000352, 0x000500C5, 0x00000017,\n    0x00002101, 0x00005311, 0x000020A3, 0x000200F9, 0x000039F4, 0x000200F8,\n    0x000039F4, 0x000700F5, 0x00000017, 0x00002BF3, 0x00002BCD, 0x00003D52,\n    0x00002101, 0x000020A8, 0x000700F5, 0x00000017, 0x0000358D, 0x0000370D,\n    0x00003D52, 0x00003640, 0x000020A8, 0x000200F9, 0x0000530F, 0x000200F8,\n    0x0000530F, 0x000700F5, 0x00000017, 0x000022F8, 0x00002BCD, 0x00005571,\n    0x00002BF3, 0x000039F4, 0x000700F5, 0x00000017, 0x0000520B, 0x0000370D,\n    0x00005571, 0x0000358D, 0x000039F4, 0x00050080, 0x00000011, 0x000037CC,\n    0x00002EF9, 0x000059EC, 0x000500C2, 0x00000011, 0x00005E75, 0x000037CC,\n    0x0000072D, 0x00050086, 0x00000011, 0x00001E20, 0x00005E75, 0x00005C31,\n    0x00050084, 0x00000011, 0x00004707, 0x00005C31, 0x00001E20, 0x00050082,\n    0x00000011, 0x00004761, 0x00005E75, 0x00004707, 0x000500C4, 0x00000011,\n    0x00002BE0, 0x00001E20, 0x0000072D, 0x00050051, 0x0000000B, 0x000033E4,\n    0x00004761, 0x00000000, 0x00050051, 0x0000000B, 0x00002A78, 0x00005C31,\n    0x00000001, 0x00050084, 0x0000000B, 0x00005967, 0x000033E4, 0x00002A78,\n    0x00050051, 0x0000000B, 0x00001B1F, 0x00004761, 0x00000001, 0x00050080,\n    0x0000000B, 0x000028E5, 0x00005967, 0x00001B1F, 0x000500C7, 0x00000011,\n    0x000049A3, 0x000037CC, 0x00000736, 0x000500C4, 0x0000000B, 0x00002955,\n    0x000028E5, 0x00000A1C, 0x00050051, 0x0000000B, 0x000051B4, 0x000049A3,\n    0x00000001, 0x000500C4, 0x0000000B, 0x00005C2C, 0x000051B4, 0x00000A19,\n    0x000500C5, 0x0000000B, 0x00004D66, 0x00002955, 0x00005C2C, 0x00050051,\n    0x0000000B, 0x000053E4, 0x000049A3, 0x00000000, 0x000500C4, 0x0000000B,\n    0x00002DC2, 0x000053E4, 0x00000A13, 0x000500C5, 0x0000000B, 0x00002BB9,\n    0x00004D66, 0x00002DC2, 0x000300F7, 0x00005341, 0x00000002, 0x000400FA,\n    0x0000500F, 0x0000294E, 0x0000537D, 0x000200F8, 0x0000537D, 0x0004007C,\n    0x00000012, 0x00002970, 0x00002BE0, 0x00050051, 0x0000000C, 0x000045F3,\n    0x00002970, 0x00000001, 0x000500C3, 0x0000000C, 0x00004DC0, 0x000045F3,\n    0x00000A1A, 0x0004007C, 0x0000000C, 0x00005780, 0x000020FC, 0x00050084,\n    0x0000000C, 0x00001F02, 0x00004DC0, 0x00005780, 0x00050051, 0x0000000C,\n    0x00006242, 0x00002970, 0x00000000, 0x000500C3, 0x0000000C, 0x00004FC7,\n    0x00006242, 0x00000A1A, 0x00050080, 0x0000000C, 0x000049B0, 0x00001F02,\n    0x00004FC7, 0x000500C4, 0x0000000C, 0x0000254A, 0x000049B0, 0x00000A1D,\n    0x000500C3, 0x0000000C, 0x0000603B, 0x000045F3, 0x00000A0E, 0x000500C7,\n    0x0000000C, 0x0000539A, 0x0000603B, 0x00000A20, 0x000500C4, 0x0000000C,\n    0x0000534A, 0x0000539A, 0x00000A14, 0x000500C7, 0x0000000C, 0x00004EA5,\n    0x00006242, 0x00000A20, 0x000500C5, 0x0000000C, 0x00002B1A, 0x0000534A,\n    0x00004EA5, 0x000500C5, 0x0000000C, 0x000043B6, 0x0000254A, 0x00002B1A,\n    0x000500C4, 0x0000000C, 0x00005E63, 0x000043B6, 0x00000A13, 0x000500C3,\n    0x0000000C, 0x000031DE, 0x000045F3, 0x00000A17, 0x000500C7, 0x0000000C,\n    0x00005447, 0x000031DE, 0x00000A0E, 0x000500C3, 0x0000000C, 0x000028A6,\n    0x00006242, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000511E, 0x000028A6,\n    0x00000A14, 0x000500C3, 0x0000000C, 0x000028B9, 0x000045F3, 0x00000A14,\n    0x000500C7, 0x0000000C, 0x0000505E, 0x000028B9, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x0000541D, 0x0000505E, 0x00000A0E, 0x000500C6, 0x0000000C,\n    0x000022BA, 0x0000511E, 0x0000541D, 0x000500C7, 0x0000000C, 0x00005076,\n    0x000045F3, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005228, 0x00005076,\n    0x00000A17, 0x000500C4, 0x0000000C, 0x00001997, 0x000022BA, 0x00000A1D,\n    0x000500C5, 0x0000000C, 0x000047FE, 0x00005228, 0x00001997, 0x000500C4,\n    0x0000000C, 0x00001C00, 0x00005447, 0x00000A2C, 0x000500C5, 0x0000000C,\n    0x00003C81, 0x000047FE, 0x00001C00, 0x000500C7, 0x0000000C, 0x000050AF,\n    0x00005E63, 0x00000A38, 0x000500C5, 0x0000000C, 0x00003C70, 0x00003C81,\n    0x000050AF, 0x000500C3, 0x0000000C, 0x00003745, 0x00005E63, 0x00000A17,\n    0x000500C7, 0x0000000C, 0x000018B8, 0x00003745, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x0000547E, 0x000018B8, 0x00000A1A, 0x000500C5, 0x0000000C,\n    0x000045A8, 0x00003C70, 0x0000547E, 0x000500C3, 0x0000000C, 0x00003A6E,\n    0x00005E63, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018B9, 0x00003A6E,\n    0x00000A20, 0x000500C4, 0x0000000C, 0x0000547F, 0x000018B9, 0x00000A23,\n    0x000500C5, 0x0000000C, 0x0000456F, 0x000045A8, 0x0000547F, 0x000500C3,\n    0x0000000C, 0x00003C88, 0x00005E63, 0x00000A23, 0x000500C4, 0x0000000C,\n    0x00002824, 0x00003C88, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B79,\n    0x0000456F, 0x00002824, 0x0004007C, 0x0000000B, 0x000041E5, 0x00003B79,\n    0x000200F9, 0x00005341, 0x000200F8, 0x0000294E, 0x00050051, 0x0000000B,\n    0x00004D9A, 0x00002BE0, 0x00000000, 0x00050051, 0x0000000B, 0x00002C03,\n    0x00002BE0, 0x00000001, 0x00060050, 0x00000014, 0x000020DE, 0x00004D9A,\n    0x00002C03, 0x000059FD, 0x0004007C, 0x00000016, 0x00004E9D, 0x000020DE,\n    0x00050051, 0x0000000C, 0x00002BF7, 0x00004E9D, 0x00000002, 0x000500C3,\n    0x0000000C, 0x00004DC1, 0x00002BF7, 0x00000A11, 0x0004007C, 0x0000000C,\n    0x00005781, 0x00006273, 0x00050084, 0x0000000C, 0x00001F03, 0x00004DC1,\n    0x00005781, 0x00050051, 0x0000000C, 0x00006243, 0x00004E9D, 0x00000001,\n    0x000500C3, 0x0000000C, 0x00004A6F, 0x00006243, 0x00000A17, 0x00050080,\n    0x0000000C, 0x00002B2C, 0x00001F03, 0x00004A6F, 0x0004007C, 0x0000000C,\n    0x00004202, 0x000020FC, 0x00050084, 0x0000000C, 0x00003A60, 0x00002B2C,\n    0x00004202, 0x00050051, 0x0000000C, 0x00006244, 0x00004E9D, 0x00000000,\n    0x000500C3, 0x0000000C, 0x00004FC8, 0x00006244, 0x00000A1A, 0x00050080,\n    0x0000000C, 0x000049FC, 0x00003A60, 0x00004FC8, 0x000500C4, 0x0000000C,\n    0x0000225D, 0x000049FC, 0x00000A20, 0x000500C7, 0x0000000C, 0x00002CAA,\n    0x00002BF7, 0x00000A14, 0x000500C4, 0x0000000C, 0x00004CAE, 0x00002CAA,\n    0x00000A1A, 0x000500C3, 0x0000000C, 0x0000383E, 0x00006243, 0x00000A0E,\n    0x000500C7, 0x0000000C, 0x00005374, 0x0000383E, 0x00000A14, 0x000500C4,\n    0x0000000C, 0x000054CA, 0x00005374, 0x00000A14, 0x000500C5, 0x0000000C,\n    0x000042CE, 0x00004CAE, 0x000054CA, 0x000500C7, 0x0000000C, 0x000050D5,\n    0x00006244, 0x00000A20, 0x000500C5, 0x0000000C, 0x00003ADD, 0x000042CE,\n    0x000050D5, 0x000500C5, 0x0000000C, 0x000043B7, 0x0000225D, 0x00003ADD,\n    0x000500C4, 0x0000000C, 0x00005E50, 0x000043B7, 0x00000A13, 0x000500C3,\n    0x0000000C, 0x000032D7, 0x00006243, 0x00000A14, 0x000500C6, 0x0000000C,\n    0x000026C9, 0x000032D7, 0x00004DC1, 0x000500C7, 0x0000000C, 0x00004199,\n    0x000026C9, 0x00000A0E, 0x000500C3, 0x0000000C, 0x00002590, 0x00006244,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x0000505F, 0x00002590, 0x00000A14,\n    0x000500C4, 0x0000000C, 0x0000541E, 0x00004199, 0x00000A0E, 0x000500C6,\n    0x0000000C, 0x000022BB, 0x0000505F, 0x0000541E, 0x000500C7, 0x0000000C,\n    0x00005077, 0x00006243, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005229,\n    0x00005077, 0x00000A17, 0x000500C4, 0x0000000C, 0x00001998, 0x000022BB,\n    0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FF, 0x00005229, 0x00001998,\n    0x000500C4, 0x0000000C, 0x00001C01, 0x00004199, 0x00000A2C, 0x000500C5,\n    0x0000000C, 0x00003C82, 0x000047FF, 0x00001C01, 0x000500C7, 0x0000000C,\n    0x000050B0, 0x00005E50, 0x00000A38, 0x000500C5, 0x0000000C, 0x00003C71,\n    0x00003C82, 0x000050B0, 0x000500C3, 0x0000000C, 0x00003746, 0x00005E50,\n    0x00000A17, 0x000500C7, 0x0000000C, 0x000018BA, 0x00003746, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x00005480, 0x000018BA, 0x00000A1A, 0x000500C5,\n    0x0000000C, 0x000045A9, 0x00003C71, 0x00005480, 0x000500C3, 0x0000000C,\n    0x00003A6F, 0x00005E50, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018BB,\n    0x00003A6F, 0x00000A20, 0x000500C4, 0x0000000C, 0x00005481, 0x000018BB,\n    0x00000A23, 0x000500C5, 0x0000000C, 0x00004570, 0x000045A9, 0x00005481,\n    0x000500C3, 0x0000000C, 0x00003C89, 0x00005E50, 0x00000A23, 0x000500C4,\n    0x0000000C, 0x00002825, 0x00003C89, 0x00000A2F, 0x000500C5, 0x0000000C,\n    0x00003B7A, 0x00004570, 0x00002825, 0x0004007C, 0x0000000B, 0x000041E6,\n    0x00003B7A, 0x000200F9, 0x00005341, 0x000200F8, 0x00005341, 0x000700F5,\n    0x0000000B, 0x00002522, 0x000041E6, 0x0000294E, 0x000041E5, 0x0000537D,\n    0x00050084, 0x0000000B, 0x000041CB, 0x0000229A, 0x00002A78, 0x00050084,\n    0x0000000B, 0x00002ED9, 0x00002522, 0x000041CB, 0x00050080, 0x0000000B,\n    0x00003E8C, 0x00002ED9, 0x00002BB9, 0x000500C2, 0x0000000B, 0x0000573A,\n    0x00003E8C, 0x00000A17, 0x000500AA, 0x00000009, 0x00004B9C, 0x00004ADC,\n    0x00000A16, 0x000300F7, 0x000039BC, 0x00000000, 0x000400FA, 0x00004B9C,\n    0x000033DF, 0x000039BC, 0x000200F8, 0x000033DF, 0x0009004F, 0x00000017,\n    0x00001F16, 0x0000520B, 0x0000520B, 0x00000001, 0x00000000, 0x00000003,\n    0x00000002, 0x000200F9, 0x000039BC, 0x000200F8, 0x000039BC, 0x000700F5,\n    0x00000017, 0x00005972, 0x0000520B, 0x00005341, 0x00001F16, 0x000033DF,\n    0x000600A9, 0x0000000B, 0x000019CD, 0x00004B9C, 0x00000A10, 0x00004ADC,\n    0x000500AA, 0x00000009, 0x00003464, 0x000019CD, 0x00000A0D, 0x000500AA,\n    0x00000009, 0x000047C2, 0x000019CD, 0x00000A10, 0x000500A6, 0x00000009,\n    0x00005686, 0x00003464, 0x000047C2, 0x000300F7, 0x00003463, 0x00000000,\n    0x000400FA, 0x00005686, 0x00002957, 0x00003463, 0x000200F8, 0x00002957,\n    0x000500C7, 0x00000017, 0x0000475F, 0x00005972, 0x000009CE, 0x000500C4,\n    0x00000017, 0x000024D1, 0x0000475F, 0x0000013D, 0x000500C7, 0x00000017,\n    0x000050AC, 0x00005972, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448D,\n    0x000050AC, 0x0000013D, 0x000500C5, 0x00000017, 0x00003FF8, 0x000024D1,\n    0x0000448D, 0x000200F9, 0x00003463, 0x000200F8, 0x00003463, 0x000700F5,\n    0x00000017, 0x00005879, 0x00005972, 0x000039BC, 0x00003FF8, 0x00002957,\n    0x000500AA, 0x00000009, 0x00004CB6, 0x000019CD, 0x00000A13, 0x000500A6,\n    0x00000009, 0x00003B23, 0x000047C2, 0x00004CB6, 0x000300F7, 0x00002C98,\n    0x00000000, 0x000400FA, 0x00003B23, 0x00002B38, 0x00002C98, 0x000200F8,\n    0x00002B38, 0x000500C4, 0x00000017, 0x00005E17, 0x00005879, 0x000002ED,\n    0x000500C2, 0x00000017, 0x00003BE7, 0x00005879, 0x000002ED, 0x000500C5,\n    0x00000017, 0x000029E8, 0x00005E17, 0x00003BE7, 0x000200F9, 0x00002C98,\n    0x000200F8, 0x00002C98, 0x000700F5, 0x00000017, 0x00004D37, 0x00005879,\n    0x00003463, 0x000029E8, 0x00002B38, 0x00060041, 0x00000294, 0x000060F9,\n    0x00001592, 0x00000A0B, 0x0000573A, 0x0003003E, 0x000060F9, 0x00004D37,\n    0x00050080, 0x0000000B, 0x00002DCE, 0x00003E8C, 0x00000A3A, 0x000500C2,\n    0x0000000B, 0x000041F1, 0x00002DCE, 0x00000A17, 0x000300F7, 0x00003F86,\n    0x00000000, 0x000400FA, 0x00004B9C, 0x000033E0, 0x00003F86, 0x000200F8,\n    0x000033E0, 0x0009004F, 0x00000017, 0x00001F17, 0x000022F8, 0x000022F8,\n    0x00000001, 0x00000000, 0x00000003, 0x00000002, 0x000200F9, 0x00003F86,\n    0x000200F8, 0x00003F86, 0x000700F5, 0x00000017, 0x00002AAE, 0x000022F8,\n    0x00002C98, 0x00001F17, 0x000033E0, 0x000300F7, 0x00003A1A, 0x00000000,\n    0x000400FA, 0x00005686, 0x00002958, 0x00003A1A, 0x000200F8, 0x00002958,\n    0x000500C7, 0x00000017, 0x00004760, 0x00002AAE, 0x000009CE, 0x000500C4,\n    0x00000017, 0x000024D2, 0x00004760, 0x0000013D, 0x000500C7, 0x00000017,\n    0x000050AD, 0x00002AAE, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448E,\n    0x000050AD, 0x0000013D, 0x000500C5, 0x00000017, 0x00003FF9, 0x000024D2,\n    0x0000448E, 0x000200F9, 0x00003A1A, 0x000200F8, 0x00003A1A, 0x000700F5,\n    0x00000017, 0x00002AAF, 0x00002AAE, 0x00003F86, 0x00003FF9, 0x00002958,\n    0x000300F7, 0x00002C99, 0x00000000, 0x000400FA, 0x00003B23, 0x00002B39,\n    0x00002C99, 0x000200F8, 0x00002B39, 0x000500C4, 0x00000017, 0x00005E18,\n    0x00002AAF, 0x000002ED, 0x000500C2, 0x00000017, 0x00003BE8, 0x00002AAF,\n    0x000002ED, 0x000500C5, 0x00000017, 0x000029E9, 0x00005E18, 0x00003BE8,\n    0x000200F9, 0x00002C99, 0x000200F8, 0x00002C99, 0x000700F5, 0x00000017,\n    0x00004D38, 0x00002AAF, 0x00003A1A, 0x000029E9, 0x00002B39, 0x00060041,\n    0x00000294, 0x00001F75, 0x00001592, 0x00000A0B, 0x000041F1, 0x0003003E,\n    0x00001F75, 0x00004D38, 0x000200F9, 0x00004C7A, 0x000200F8, 0x00004C7A,\n    0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/resolve_fast_64bpp_4xmsaa_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25271\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 8 8 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_resolve_edram_info\"\n               OpMemberName %push_const_block_xe 1 \"xe_resolve_coordinate_info\"\n               OpMemberName %push_const_block_xe 2 \"xe_resolve_dest_info\"\n               OpMemberName %push_const_block_xe 3 \"xe_resolve_dest_coordinate_info\"\n               OpMemberName %push_const_block_xe 4 \"xe_resolve_dest_base\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_resolve_edram_xe_block \"xe_resolve_edram_xe_block\"\n               OpMemberName %xe_resolve_edram_xe_block 0 \"data\"\n               OpName %xe_resolve_edram \"xe_resolve_edram\"\n               OpName %xe_resolve_dest_xe_block \"xe_resolve_dest_xe_block\"\n               OpMemberName %xe_resolve_dest_xe_block 0 \"data\"\n               OpName %xe_resolve_dest \"xe_resolve_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v2uint ArrayStride 8\n               OpDecorate %xe_resolve_edram_xe_block BufferBlock\n               OpMemberDecorate %xe_resolve_edram_xe_block 0 NonWritable\n               OpMemberDecorate %xe_resolve_edram_xe_block 0 Offset 0\n               OpDecorate %xe_resolve_edram NonWritable\n               OpDecorate %xe_resolve_edram Binding 0\n               OpDecorate %xe_resolve_edram DescriptorSet 0\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_resolve_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_resolve_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_resolve_dest_xe_block 0 Offset 0\n               OpDecorate %xe_resolve_dest NonReadable\n               OpDecorate %xe_resolve_dest Binding 0\n               OpDecorate %xe_resolve_dest DescriptorSet 1\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n     %v4uint = OpTypeVector %uint 4\n       %bool = OpTypeBool\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n     %uint_1 = OpConstant %uint 1\n     %uint_2 = OpConstant %uint 2\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n     %uint_3 = OpConstant %uint 3\n    %uint_16 = OpConstant %uint 16\n     %uint_4 = OpConstant %uint 4\n     %uint_0 = OpConstant %uint 0\n       %1828 = OpConstantComposite %v2uint %uint_1 %uint_1\n       %1816 = OpConstantComposite %v2uint %uint_1 %uint_0\n      %int_2 = OpConstant %int 2\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n      %int_3 = OpConstant %int 3\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n  %uint_1023 = OpConstant %uint 1023\n    %uint_10 = OpConstant %uint 10\n    %uint_13 = OpConstant %uint 13\n  %uint_2047 = OpConstant %uint 2047\n    %uint_24 = OpConstant %uint 24\n    %uint_15 = OpConstant %uint 15\n    %uint_28 = OpConstant %uint 28\n       %1855 = OpConstantComposite %v2uint %uint_0 %uint_4\n     %uint_5 = OpConstant %uint 5\n     %uint_7 = OpConstant %uint 7\n%uint_16777216 = OpConstant %uint 16777216\n    %uint_20 = OpConstant %uint 20\n       %2275 = OpConstantComposite %v2uint %uint_20 %uint_24\n     %v3uint = OpTypeVector %uint 3\n%uint_4294901760 = OpConstant %uint 4294901760\n %uint_65535 = OpConstant %uint 65535\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %1825 = OpConstantComposite %v2uint %uint_2 %uint_0\n      %false = OpConstantFalse %bool\n%_runtimearr_v2uint = OpTypeRuntimeArray %v2uint\n%xe_resolve_edram_xe_block = OpTypeStruct %_runtimearr_v2uint\n%_ptr_Uniform_xe_resolve_edram_xe_block = OpTypePointer Uniform %xe_resolve_edram_xe_block\n%xe_resolve_edram = OpVariable %_ptr_Uniform_xe_resolve_edram_xe_block Uniform\n%_ptr_Uniform_v2uint = OpTypePointer Uniform %v2uint\n    %uint_32 = OpConstant %uint 32\n    %uint_48 = OpConstant %uint 48\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_resolve_dest_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_resolve_dest_xe_block = OpTypePointer Uniform %xe_resolve_dest_xe_block\n%xe_resolve_dest = OpVariable %_ptr_Uniform_xe_resolve_dest_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_8 %uint_8 %uint_1\n       %1954 = OpConstantComposite %v2uint %uint_15 %uint_1\n       %1870 = OpConstantComposite %v2uint %uint_3 %uint_3\n       %2122 = OpConstantComposite %v2uint %uint_15 %uint_15\n       %1877 = OpConstantComposite %v4uint %uint_4294901760 %uint_4294901760 %uint_4294901760 %uint_4294901760\n        %850 = OpConstantComposite %v4uint %uint_65535 %uint_65535 %uint_65535 %uint_65535\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n    %uint_40 = OpConstant %uint 40\n       %2359 = OpConstantComposite %v2uint %uint_40 %uint_16\n  %uint_1280 = OpConstant %uint 1280\n%uint_2621440 = OpConstant %uint 2621440\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %22245 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %15627 = OpLoad %uint %22245\n      %22700 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %20824 = OpLoad %uint %22700\n      %20561 = OpBitwiseAnd %uint %15627 %uint_1023\n      %19978 = OpShiftRightLogical %uint %15627 %uint_13\n       %8574 = OpBitwiseAnd %uint %19978 %uint_2047\n      %18836 = OpShiftRightLogical %uint %15627 %uint_24\n       %9130 = OpBitwiseAnd %uint %18836 %uint_15\n       %8871 = OpCompositeConstruct %v2uint %20824 %20824\n       %9576 = OpShiftRightLogical %v2uint %8871 %1855\n      %23379 = OpBitwiseAnd %v2uint %9576 %1954\n      %16207 = OpShiftLeftLogical %v2uint %23379 %1870\n      %23019 = OpIMul %v2uint %16207 %1828\n      %12819 = OpShiftRightLogical %uint %20824 %uint_5\n      %16204 = OpBitwiseAnd %uint %12819 %uint_2047\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %24236 = OpLoad %uint %18732\n      %22701 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %20919 = OpLoad %uint %22701\n      %19164 = OpBitwiseAnd %uint %24236 %uint_7\n      %21999 = OpBitwiseAnd %uint %24236 %uint_8\n      %20495 = OpINotEqual %bool %21999 %uint_0\n      %10402 = OpShiftRightLogical %uint %24236 %uint_4\n      %23037 = OpBitwiseAnd %uint %10402 %uint_7\n      %23118 = OpBitwiseAnd %uint %24236 %uint_16777216\n      %19535 = OpINotEqual %bool %23118 %uint_0\n       %8444 = OpBitwiseAnd %uint %20919 %uint_1023\n      %12176 = OpShiftRightLogical %uint %20919 %uint_10\n      %25038 = OpBitwiseAnd %uint %12176 %uint_1023\n      %25203 = OpShiftLeftLogical %uint %25038 %int_1\n      %10422 = OpCompositeConstruct %v2uint %20919 %20919\n      %10385 = OpShiftRightLogical %v2uint %10422 %2275\n      %23380 = OpBitwiseAnd %v2uint %10385 %2122\n      %16208 = OpShiftLeftLogical %v2uint %23380 %1870\n      %23020 = OpIMul %v2uint %16208 %1828\n      %12820 = OpShiftRightLogical %uint %20919 %uint_28\n      %16205 = OpBitwiseAnd %uint %12820 %uint_7\n      %18656 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_4\n      %25270 = OpLoad %uint %18656\n      %14159 = OpLoad %v3uint %gl_GlobalInvocationID\n      %12672 = OpVectorShuffle %v2uint %14159 %14159 0 1\n      %12025 = OpShiftLeftLogical %v2uint %12672 %1825\n       %7640 = OpCompositeExtract %uint %12025 0\n      %11658 = OpShiftLeftLogical %uint %16204 %uint_3\n      %15379 = OpUGreaterThanEqual %bool %7640 %11658\n               OpSelectionMerge %12755 DontFlatten\n               OpBranchConditional %15379 %21992 %12755\n      %21992 = OpLabel\n               OpBranch %19578\n      %12755 = OpLabel\n       %7340 = OpCompositeExtract %uint %12025 1\n       %7992 = OpExtInst %uint %1 UMax %7340 %uint_0\n      %20975 = OpCompositeConstruct %v2uint %7640 %7992\n      %21036 = OpIAdd %v2uint %20975 %23019\n      %16075 = OpULessThanEqual %bool %16205 %uint_3\n               OpSelectionMerge %6909 None\n               OpBranchConditional %16075 %10990 %15087\n      %15087 = OpLabel\n      %13566 = OpIEqual %bool %16205 %uint_5\n       %8438 = OpSelect %uint %13566 %uint_2 %uint_0\n               OpBranch %6909\n      %10990 = OpLabel\n               OpBranch %6909\n       %6909 = OpLabel\n      %16517 = OpPhi %uint %16205 %10990 %8438 %15087\n      %11201 = OpShiftLeftLogical %v2uint %21036 %1828\n      %21693 = OpCompositeConstruct %v2uint %16517 %16517\n       %9093 = OpShiftRightLogical %v2uint %21693 %1816\n      %16110 = OpBitwiseAnd %v2uint %9093 %1828\n      %17779 = OpIAdd %v2uint %11201 %16110\n      %24270 = OpUDiv %v2uint %17779 %2359\n      %12360 = OpCompositeExtract %uint %24270 1\n      %11046 = OpIMul %uint %12360 %20561\n      %24665 = OpCompositeExtract %uint %24270 0\n      %21536 = OpIAdd %uint %11046 %24665\n       %8742 = OpIAdd %uint %8574 %21536\n      %23345 = OpIMul %v2uint %24270 %2359\n      %11892 = OpISub %v2uint %17779 %23345\n       %9022 = OpIMul %uint %8742 %uint_1280\n      %14471 = OpCompositeExtract %uint %11892 1\n      %15890 = OpIMul %uint %14471 %uint_40\n       %6886 = OpCompositeExtract %uint %11892 0\n       %9696 = OpIAdd %uint %15890 %6886\n      %18116 = OpShiftLeftLogical %uint %9696 %uint_1\n      %18619 = OpIAdd %uint %9022 %18116\n      %19925 = OpUMod %uint %18619 %uint_2621440\n      %18095 = OpShiftLeftLogical %uint %19925 %int_2\n      %19333 = OpShiftRightLogical %uint %18095 %int_3\n       %9280 = OpAccessChain %_ptr_Uniform_v2uint %xe_resolve_edram %int_0 %19333\n      %21044 = OpLoad %v2uint %9280\n      %20300 = OpCompositeExtract %uint %21044 0\n      %17531 = OpCompositeExtract %uint %21044 1\n      %15841 = OpIAdd %uint %18095 %uint_16\n      %24886 = OpShiftRightLogical %uint %15841 %int_3\n      %18708 = OpAccessChain %_ptr_Uniform_v2uint %xe_resolve_edram %int_0 %24886\n      %21045 = OpLoad %v2uint %18708\n      %19388 = OpCompositeExtract %uint %21045 0\n      %24581 = OpCompositeExtract %uint %21045 1\n       %9869 = OpCompositeConstruct %v4uint %20300 %17531 %19388 %24581\n      %16090 = OpIAdd %uint %18095 %uint_32\n       %8237 = OpShiftRightLogical %uint %16090 %int_3\n      %18709 = OpAccessChain %_ptr_Uniform_v2uint %xe_resolve_edram %int_0 %8237\n      %21046 = OpLoad %v2uint %18709\n      %20301 = OpCompositeExtract %uint %21046 0\n      %17532 = OpCompositeExtract %uint %21046 1\n      %15842 = OpIAdd %uint %18095 %uint_48\n      %24887 = OpShiftRightLogical %uint %15842 %int_3\n      %18710 = OpAccessChain %_ptr_Uniform_v2uint %xe_resolve_edram %int_0 %24887\n      %21047 = OpLoad %v2uint %18710\n      %19389 = OpCompositeExtract %uint %21047 0\n       %6308 = OpCompositeExtract %uint %21047 1\n      %21199 = OpCompositeConstruct %v4uint %20301 %17532 %19389 %6308\n      %23045 = OpIEqual %bool %7640 %uint_0\n      %21241 = OpSelect %bool %23045 %false %23045\n               OpSelectionMerge %21910 DontFlatten\n               OpBranchConditional %21241 %9587 %21910\n       %9587 = OpLabel\n      %12289 = OpCompositeInsert %v4uint %19388 %9869 0\n      %14086 = OpCompositeInsert %v4uint %24581 %12289 1\n               OpBranch %21910\n      %21910 = OpLabel\n      %10924 = OpPhi %v4uint %9869 %6909 %14086 %9587\n               OpSelectionMerge %21263 DontFlatten\n               OpBranchConditional %19535 %15068 %21263\n      %15068 = OpLabel\n      %13701 = OpIEqual %bool %9130 %uint_5\n      %17015 = OpLogicalNot %bool %13701\n               OpSelectionMerge %15698 None\n               OpBranchConditional %17015 %16607 %15698\n      %16607 = OpLabel\n      %18778 = OpIEqual %bool %9130 %uint_7\n               OpBranch %15698\n      %15698 = OpLabel\n      %10925 = OpPhi %bool %13701 %15068 %18778 %16607\n               OpSelectionMerge %14836 DontFlatten\n               OpBranchConditional %10925 %8360 %14836\n       %8360 = OpLabel\n      %19441 = OpBitwiseAnd %v4uint %10924 %1877\n      %20970 = OpVectorShuffle %v4uint %10924 %10924 1 0 3 2\n       %7405 = OpBitwiseAnd %v4uint %20970 %850\n      %13888 = OpBitwiseOr %v4uint %19441 %7405\n      %21265 = OpBitwiseAnd %v4uint %21199 %1877\n      %15352 = OpVectorShuffle %v4uint %21199 %21199 1 0 3 2\n       %8355 = OpBitwiseAnd %v4uint %15352 %850\n       %8449 = OpBitwiseOr %v4uint %21265 %8355\n               OpBranch %14836\n      %14836 = OpLabel\n      %11251 = OpPhi %v4uint %21199 %15698 %8449 %8360\n      %13709 = OpPhi %v4uint %10924 %15698 %13888 %8360\n               OpBranch %21263\n      %21263 = OpLabel\n       %8952 = OpPhi %v4uint %21199 %21910 %11251 %14836\n      %22009 = OpPhi %v4uint %10924 %21910 %13709 %14836\n       %7319 = OpIAdd %v2uint %12025 %23020\n               OpSelectionMerge %21237 DontFlatten\n               OpBranchConditional %20495 %10574 %21373\n      %21373 = OpLabel\n      %10608 = OpBitcast %v2int %7319\n      %17907 = OpCompositeExtract %int %10608 1\n      %19904 = OpShiftRightArithmetic %int %17907 %int_5\n      %22400 = OpBitcast %int %8444\n       %7938 = OpIMul %int %19904 %22400\n      %25154 = OpCompositeExtract %int %10608 0\n      %20423 = OpShiftRightArithmetic %int %25154 %int_5\n      %18864 = OpIAdd %int %7938 %20423\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %17907 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25154 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17334 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17334 %uint_3\n      %12766 = OpShiftRightArithmetic %int %17907 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25154 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %17907 %int_3\n      %20574 = OpBitwiseAnd %int %10425 %int_1\n      %21533 = OpShiftLeftLogical %int %20574 %int_1\n       %8890 = OpBitwiseXor %int %20766 %21533\n      %20598 = OpBitwiseAnd %int %17907 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6551\n       %7168 = OpShiftLeftLogical %int %21575 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24163 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24163 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24163 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24163 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %21237\n      %10574 = OpLabel\n      %19866 = OpCompositeExtract %uint %7319 0\n      %11267 = OpCompositeExtract %uint %7319 1\n       %8414 = OpCompositeConstruct %v3uint %19866 %11267 %23037\n      %20125 = OpBitcast %v3int %8414\n      %11255 = OpCompositeExtract %int %20125 2\n      %19905 = OpShiftRightArithmetic %int %11255 %int_2\n      %22401 = OpBitcast %int %25203\n       %7939 = OpIMul %int %19905 %22401\n      %25155 = OpCompositeExtract %int %20125 1\n      %19055 = OpShiftRightArithmetic %int %25155 %int_4\n      %11052 = OpIAdd %int %7939 %19055\n      %16898 = OpBitcast %int %8444\n      %14944 = OpIMul %int %11052 %16898\n      %25156 = OpCompositeExtract %int %20125 0\n      %20424 = OpShiftRightArithmetic %int %25156 %int_5\n      %18940 = OpIAdd %int %14944 %20424\n       %8797 = OpShiftLeftLogical %int %18940 %int_7\n      %11434 = OpBitwiseAnd %int %11255 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %25155 %int_1\n      %21364 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21364 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %25156 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17335 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17335 %uint_3\n      %13015 = OpShiftRightArithmetic %int %25155 %int_3\n       %9929 = OpBitwiseXor %int %13015 %19905\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %25156 %int_3\n      %20575 = OpBitwiseAnd %int %9616 %int_3\n      %21534 = OpShiftLeftLogical %int %16793 %int_1\n       %8891 = OpBitwiseXor %int %20575 %21534\n      %20599 = OpBitwiseAnd %int %25155 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6552\n       %7169 = OpShiftLeftLogical %int %16793 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24144 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24144 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24144 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24144 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %21237\n      %21237 = OpLabel\n      %11376 = OpPhi %uint %16870 %10574 %16869 %21373\n      %20616 = OpIAdd %uint %11376 %25270\n      %20138 = OpShiftRightLogical %uint %20616 %int_4\n      %19356 = OpIEqual %bool %19164 %uint_4\n               OpSelectionMerge %14780 None\n               OpBranchConditional %19356 %13279 %14780\n      %13279 = OpLabel\n       %7958 = OpVectorShuffle %v4uint %22009 %22009 1 0 3 2\n               OpBranch %14780\n      %14780 = OpLabel\n      %22898 = OpPhi %v4uint %22009 %21237 %7958 %13279\n       %6605 = OpSelect %uint %19356 %uint_2 %19164\n      %13412 = OpIEqual %bool %6605 %uint_1\n      %18370 = OpIEqual %bool %6605 %uint_2\n      %22150 = OpLogicalOr %bool %13412 %18370\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %22898 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %22898 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22649 = OpPhi %v4uint %22898 %14780 %16376 %10583\n      %19638 = OpIEqual %bool %6605 %uint_3\n      %15139 = OpLogicalOr %bool %18370 %19638\n               OpSelectionMerge %11416 None\n               OpBranchConditional %15139 %11064 %11416\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22649 %749\n      %15335 = OpShiftRightLogical %v4uint %22649 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %11416\n      %11416 = OpLabel\n      %19767 = OpPhi %v4uint %22649 %13411 %10728 %11064\n      %24825 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_dest %int_0 %20138\n               OpStore %24825 %19767\n      %11726 = OpIAdd %uint %20616 %uint_32\n      %16881 = OpShiftRightLogical %uint %11726 %int_4\n               OpSelectionMerge %16262 None\n               OpBranchConditional %19356 %13280 %16262\n      %13280 = OpLabel\n       %7959 = OpVectorShuffle %v4uint %8952 %8952 1 0 3 2\n               OpBranch %16262\n      %16262 = OpLabel\n      %10926 = OpPhi %v4uint %8952 %11416 %7959 %13280\n               OpSelectionMerge %14874 None\n               OpBranchConditional %22150 %10584 %14874\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %10926 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %10926 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %14874\n      %14874 = OpLabel\n      %10927 = OpPhi %v4uint %10926 %16262 %16377 %10584\n               OpSelectionMerge %11417 None\n               OpBranchConditional %15139 %11065 %11417\n      %11065 = OpLabel\n      %24088 = OpShiftLeftLogical %v4uint %10927 %749\n      %15336 = OpShiftRightLogical %v4uint %10927 %749\n      %10729 = OpBitwiseOr %v4uint %24088 %15336\n               OpBranch %11417\n      %11417 = OpLabel\n      %19768 = OpPhi %v4uint %10927 %14874 %10729 %11065\n       %8053 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_dest %int_0 %16881\n               OpStore %8053 %19768\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t resolve_fast_64bpp_4xmsaa_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x000062B7, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000008, 0x00000008, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x0000040B, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x00090006, 0x0000040B, 0x00000000, 0x725F6578,\n    0x6C6F7365, 0x655F6576, 0x6D617264, 0x666E695F, 0x0000006F, 0x000A0006,\n    0x0000040B, 0x00000001, 0x725F6578, 0x6C6F7365, 0x635F6576, 0x64726F6F,\n    0x74616E69, 0x6E695F65, 0x00006F66, 0x00090006, 0x0000040B, 0x00000002,\n    0x725F6578, 0x6C6F7365, 0x645F6576, 0x5F747365, 0x6F666E69, 0x00000000,\n    0x000B0006, 0x0000040B, 0x00000003, 0x725F6578, 0x6C6F7365, 0x645F6576,\n    0x5F747365, 0x726F6F63, 0x616E6964, 0x695F6574, 0x006F666E, 0x00090006,\n    0x0000040B, 0x00000004, 0x725F6578, 0x6C6F7365, 0x645F6576, 0x5F747365,\n    0x65736162, 0x00000000, 0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F,\n    0x5F737473, 0x00006578, 0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C,\n    0x766E496C, 0x7461636F, 0x496E6F69, 0x00000044, 0x00090005, 0x000007A8,\n    0x725F6578, 0x6C6F7365, 0x655F6576, 0x6D617264, 0x5F65785F, 0x636F6C62,\n    0x0000006B, 0x00050006, 0x000007A8, 0x00000000, 0x61746164, 0x00000000,\n    0x00070005, 0x00000CC7, 0x725F6578, 0x6C6F7365, 0x655F6576, 0x6D617264,\n    0x00000000, 0x00090005, 0x000007B4, 0x725F6578, 0x6C6F7365, 0x645F6576,\n    0x5F747365, 0x625F6578, 0x6B636F6C, 0x00000000, 0x00050006, 0x000007B4,\n    0x00000000, 0x61746164, 0x00000000, 0x00060005, 0x00001592, 0x725F6578,\n    0x6C6F7365, 0x645F6576, 0x00747365, 0x00030047, 0x0000040B, 0x00000002,\n    0x00050048, 0x0000040B, 0x00000000, 0x00000023, 0x00000000, 0x00050048,\n    0x0000040B, 0x00000001, 0x00000023, 0x00000004, 0x00050048, 0x0000040B,\n    0x00000002, 0x00000023, 0x00000008, 0x00050048, 0x0000040B, 0x00000003,\n    0x00000023, 0x0000000C, 0x00050048, 0x0000040B, 0x00000004, 0x00000023,\n    0x00000010, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007D6, 0x00000006, 0x00000008, 0x00030047, 0x000007A8, 0x00000003,\n    0x00040048, 0x000007A8, 0x00000000, 0x00000018, 0x00050048, 0x000007A8,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x00000CC7, 0x00000018,\n    0x00040047, 0x00000CC7, 0x00000021, 0x00000000, 0x00040047, 0x00000CC7,\n    0x00000022, 0x00000000, 0x00040047, 0x000007DC, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B4, 0x00000003, 0x00040048, 0x000007B4, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B4, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x00001592, 0x00000019, 0x00040047, 0x00001592, 0x00000021,\n    0x00000000, 0x00040047, 0x00001592, 0x00000022, 0x00000001, 0x00040047,\n    0x00000AC7, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000017,\n    0x0000000B, 0x00000004, 0x00020014, 0x00000009, 0x00040015, 0x0000000C,\n    0x00000020, 0x00000001, 0x00040017, 0x00000012, 0x0000000C, 0x00000002,\n    0x00040017, 0x00000016, 0x0000000C, 0x00000003, 0x0004002B, 0x0000000B,\n    0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B, 0x00000A10, 0x00000002,\n    0x0004002B, 0x0000000B, 0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B,\n    0x00000A22, 0x00000008, 0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00,\n    0x0004002B, 0x0000000B, 0x00000A13, 0x00000003, 0x0004002B, 0x0000000B,\n    0x00000A3A, 0x00000010, 0x0004002B, 0x0000000B, 0x00000A16, 0x00000004,\n    0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000, 0x0005002C, 0x00000011,\n    0x00000724, 0x00000A0D, 0x00000A0D, 0x0005002C, 0x00000011, 0x00000718,\n    0x00000A0D, 0x00000A0A, 0x0004002B, 0x0000000C, 0x00000A11, 0x00000002,\n    0x0004002B, 0x0000000C, 0x00000A17, 0x00000004, 0x0004002B, 0x0000000C,\n    0x00000A1D, 0x00000006, 0x0004002B, 0x0000000C, 0x00000A2C, 0x0000000B,\n    0x0004002B, 0x0000000C, 0x00000A38, 0x0000000F, 0x0004002B, 0x0000000C,\n    0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C, 0x00000A1A, 0x00000005,\n    0x0004002B, 0x0000000C, 0x00000A20, 0x00000007, 0x0004002B, 0x0000000C,\n    0x00000A23, 0x00000008, 0x0004002B, 0x0000000C, 0x00000A2F, 0x0000000C,\n    0x0004002B, 0x0000000C, 0x00000A14, 0x00000003, 0x0004002B, 0x0000000C,\n    0x00000A0B, 0x00000000, 0x0007001E, 0x0000040B, 0x0000000B, 0x0000000B,\n    0x0000000B, 0x0000000B, 0x0000000B, 0x00040020, 0x00000688, 0x00000009,\n    0x0000040B, 0x0004003B, 0x00000688, 0x00000CE9, 0x00000009, 0x00040020,\n    0x00000288, 0x00000009, 0x0000000B, 0x0004002B, 0x0000000B, 0x00000A44,\n    0x000003FF, 0x0004002B, 0x0000000B, 0x00000A28, 0x0000000A, 0x0004002B,\n    0x0000000B, 0x00000A31, 0x0000000D, 0x0004002B, 0x0000000B, 0x00000A81,\n    0x000007FF, 0x0004002B, 0x0000000B, 0x00000A52, 0x00000018, 0x0004002B,\n    0x0000000B, 0x00000A37, 0x0000000F, 0x0004002B, 0x0000000B, 0x00000A5E,\n    0x0000001C, 0x0005002C, 0x00000011, 0x0000073F, 0x00000A0A, 0x00000A16,\n    0x0004002B, 0x0000000B, 0x00000A19, 0x00000005, 0x0004002B, 0x0000000B,\n    0x00000A1F, 0x00000007, 0x0004002B, 0x0000000B, 0x00000926, 0x01000000,\n    0x0004002B, 0x0000000B, 0x00000A46, 0x00000014, 0x0005002C, 0x00000011,\n    0x000008E3, 0x00000A46, 0x00000A52, 0x00040017, 0x00000014, 0x0000000B,\n    0x00000003, 0x0004002B, 0x0000000B, 0x0000068D, 0xFFFF0000, 0x0004002B,\n    0x0000000B, 0x000001C1, 0x0000FFFF, 0x00040020, 0x00000291, 0x00000001,\n    0x00000014, 0x0004003B, 0x00000291, 0x00000F48, 0x00000001, 0x0005002C,\n    0x00000011, 0x00000721, 0x00000A10, 0x00000A0A, 0x0003002A, 0x00000009,\n    0x00000787, 0x0003001D, 0x000007D6, 0x00000011, 0x0003001E, 0x000007A8,\n    0x000007D6, 0x00040020, 0x00000A25, 0x00000002, 0x000007A8, 0x0004003B,\n    0x00000A25, 0x00000CC7, 0x00000002, 0x00040020, 0x0000028E, 0x00000002,\n    0x00000011, 0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020, 0x0004002B,\n    0x0000000B, 0x00000A9A, 0x00000030, 0x0003001D, 0x000007DC, 0x00000017,\n    0x0003001E, 0x000007B4, 0x000007DC, 0x00040020, 0x00000A32, 0x00000002,\n    0x000007B4, 0x0004003B, 0x00000A32, 0x00001592, 0x00000002, 0x00040020,\n    0x00000294, 0x00000002, 0x00000017, 0x0006002C, 0x00000014, 0x00000AC7,\n    0x00000A22, 0x00000A22, 0x00000A0D, 0x0005002C, 0x00000011, 0x000007A2,\n    0x00000A37, 0x00000A0D, 0x0005002C, 0x00000011, 0x0000074E, 0x00000A13,\n    0x00000A13, 0x0005002C, 0x00000011, 0x0000084A, 0x00000A37, 0x00000A37,\n    0x0007002C, 0x00000017, 0x00000755, 0x0000068D, 0x0000068D, 0x0000068D,\n    0x0000068D, 0x0007002C, 0x00000017, 0x00000352, 0x000001C1, 0x000001C1,\n    0x000001C1, 0x000001C1, 0x0007002C, 0x00000017, 0x000009CE, 0x000008A6,\n    0x000008A6, 0x000008A6, 0x000008A6, 0x0007002C, 0x00000017, 0x0000013D,\n    0x00000A22, 0x00000A22, 0x00000A22, 0x00000A22, 0x0007002C, 0x00000017,\n    0x0000072E, 0x000005FD, 0x000005FD, 0x000005FD, 0x000005FD, 0x0007002C,\n    0x00000017, 0x000002ED, 0x00000A3A, 0x00000A3A, 0x00000A3A, 0x00000A3A,\n    0x0004002B, 0x0000000B, 0x00000A82, 0x00000028, 0x0005002C, 0x00000011,\n    0x00000937, 0x00000A82, 0x00000A3A, 0x0004002B, 0x0000000B, 0x00000184,\n    0x00000500, 0x0004002B, 0x0000000B, 0x0000086E, 0x00280000, 0x00050036,\n    0x00000008, 0x0000161F, 0x00000000, 0x00000502, 0x000200F8, 0x00003B06,\n    0x000300F7, 0x00004C7A, 0x00000000, 0x000300FB, 0x00000A0A, 0x00002E68,\n    0x000200F8, 0x00002E68, 0x00050041, 0x00000288, 0x000056E5, 0x00000CE9,\n    0x00000A0B, 0x0004003D, 0x0000000B, 0x00003D0B, 0x000056E5, 0x00050041,\n    0x00000288, 0x000058AC, 0x00000CE9, 0x00000A0E, 0x0004003D, 0x0000000B,\n    0x00005158, 0x000058AC, 0x000500C7, 0x0000000B, 0x00005051, 0x00003D0B,\n    0x00000A44, 0x000500C2, 0x0000000B, 0x00004E0A, 0x00003D0B, 0x00000A31,\n    0x000500C7, 0x0000000B, 0x0000217E, 0x00004E0A, 0x00000A81, 0x000500C2,\n    0x0000000B, 0x00004994, 0x00003D0B, 0x00000A52, 0x000500C7, 0x0000000B,\n    0x000023AA, 0x00004994, 0x00000A37, 0x00050050, 0x00000011, 0x000022A7,\n    0x00005158, 0x00005158, 0x000500C2, 0x00000011, 0x00002568, 0x000022A7,\n    0x0000073F, 0x000500C7, 0x00000011, 0x00005B53, 0x00002568, 0x000007A2,\n    0x000500C4, 0x00000011, 0x00003F4F, 0x00005B53, 0x0000074E, 0x00050084,\n    0x00000011, 0x000059EB, 0x00003F4F, 0x00000724, 0x000500C2, 0x0000000B,\n    0x00003213, 0x00005158, 0x00000A19, 0x000500C7, 0x0000000B, 0x00003F4C,\n    0x00003213, 0x00000A81, 0x00050041, 0x00000288, 0x0000492C, 0x00000CE9,\n    0x00000A11, 0x0004003D, 0x0000000B, 0x00005EAC, 0x0000492C, 0x00050041,\n    0x00000288, 0x000058AD, 0x00000CE9, 0x00000A14, 0x0004003D, 0x0000000B,\n    0x000051B7, 0x000058AD, 0x000500C7, 0x0000000B, 0x00004ADC, 0x00005EAC,\n    0x00000A1F, 0x000500C7, 0x0000000B, 0x000055EF, 0x00005EAC, 0x00000A22,\n    0x000500AB, 0x00000009, 0x0000500F, 0x000055EF, 0x00000A0A, 0x000500C2,\n    0x0000000B, 0x000028A2, 0x00005EAC, 0x00000A16, 0x000500C7, 0x0000000B,\n    0x000059FD, 0x000028A2, 0x00000A1F, 0x000500C7, 0x0000000B, 0x00005A4E,\n    0x00005EAC, 0x00000926, 0x000500AB, 0x00000009, 0x00004C4F, 0x00005A4E,\n    0x00000A0A, 0x000500C7, 0x0000000B, 0x000020FC, 0x000051B7, 0x00000A44,\n    0x000500C2, 0x0000000B, 0x00002F90, 0x000051B7, 0x00000A28, 0x000500C7,\n    0x0000000B, 0x000061CE, 0x00002F90, 0x00000A44, 0x000500C4, 0x0000000B,\n    0x00006273, 0x000061CE, 0x00000A0E, 0x00050050, 0x00000011, 0x000028B6,\n    0x000051B7, 0x000051B7, 0x000500C2, 0x00000011, 0x00002891, 0x000028B6,\n    0x000008E3, 0x000500C7, 0x00000011, 0x00005B54, 0x00002891, 0x0000084A,\n    0x000500C4, 0x00000011, 0x00003F50, 0x00005B54, 0x0000074E, 0x00050084,\n    0x00000011, 0x000059EC, 0x00003F50, 0x00000724, 0x000500C2, 0x0000000B,\n    0x00003214, 0x000051B7, 0x00000A5E, 0x000500C7, 0x0000000B, 0x00003F4D,\n    0x00003214, 0x00000A1F, 0x00050041, 0x00000288, 0x000048E0, 0x00000CE9,\n    0x00000A17, 0x0004003D, 0x0000000B, 0x000062B6, 0x000048E0, 0x0004003D,\n    0x00000014, 0x0000374F, 0x00000F48, 0x0007004F, 0x00000011, 0x00003180,\n    0x0000374F, 0x0000374F, 0x00000000, 0x00000001, 0x000500C4, 0x00000011,\n    0x00002EF9, 0x00003180, 0x00000721, 0x00050051, 0x0000000B, 0x00001DD8,\n    0x00002EF9, 0x00000000, 0x000500C4, 0x0000000B, 0x00002D8A, 0x00003F4C,\n    0x00000A13, 0x000500AE, 0x00000009, 0x00003C13, 0x00001DD8, 0x00002D8A,\n    0x000300F7, 0x000031D3, 0x00000002, 0x000400FA, 0x00003C13, 0x000055E8,\n    0x000031D3, 0x000200F8, 0x000055E8, 0x000200F9, 0x00004C7A, 0x000200F8,\n    0x000031D3, 0x00050051, 0x0000000B, 0x00001CAC, 0x00002EF9, 0x00000001,\n    0x0007000C, 0x0000000B, 0x00001F38, 0x00000001, 0x00000029, 0x00001CAC,\n    0x00000A0A, 0x00050050, 0x00000011, 0x000051EF, 0x00001DD8, 0x00001F38,\n    0x00050080, 0x00000011, 0x0000522C, 0x000051EF, 0x000059EB, 0x000500B2,\n    0x00000009, 0x00003ECB, 0x00003F4D, 0x00000A13, 0x000300F7, 0x00001AFD,\n    0x00000000, 0x000400FA, 0x00003ECB, 0x00002AEE, 0x00003AEF, 0x000200F8,\n    0x00003AEF, 0x000500AA, 0x00000009, 0x000034FE, 0x00003F4D, 0x00000A19,\n    0x000600A9, 0x0000000B, 0x000020F6, 0x000034FE, 0x00000A10, 0x00000A0A,\n    0x000200F9, 0x00001AFD, 0x000200F8, 0x00002AEE, 0x000200F9, 0x00001AFD,\n    0x000200F8, 0x00001AFD, 0x000700F5, 0x0000000B, 0x00004085, 0x00003F4D,\n    0x00002AEE, 0x000020F6, 0x00003AEF, 0x000500C4, 0x00000011, 0x00002BC1,\n    0x0000522C, 0x00000724, 0x00050050, 0x00000011, 0x000054BD, 0x00004085,\n    0x00004085, 0x000500C2, 0x00000011, 0x00002385, 0x000054BD, 0x00000718,\n    0x000500C7, 0x00000011, 0x00003EEE, 0x00002385, 0x00000724, 0x00050080,\n    0x00000011, 0x00004573, 0x00002BC1, 0x00003EEE, 0x00050086, 0x00000011,\n    0x00005ECE, 0x00004573, 0x00000937, 0x00050051, 0x0000000B, 0x00003048,\n    0x00005ECE, 0x00000001, 0x00050084, 0x0000000B, 0x00002B26, 0x00003048,\n    0x00005051, 0x00050051, 0x0000000B, 0x00006059, 0x00005ECE, 0x00000000,\n    0x00050080, 0x0000000B, 0x00005420, 0x00002B26, 0x00006059, 0x00050080,\n    0x0000000B, 0x00002226, 0x0000217E, 0x00005420, 0x00050084, 0x00000011,\n    0x00005B31, 0x00005ECE, 0x00000937, 0x00050082, 0x00000011, 0x00002E74,\n    0x00004573, 0x00005B31, 0x00050084, 0x0000000B, 0x0000233E, 0x00002226,\n    0x00000184, 0x00050051, 0x0000000B, 0x00003887, 0x00002E74, 0x00000001,\n    0x00050084, 0x0000000B, 0x00003E12, 0x00003887, 0x00000A82, 0x00050051,\n    0x0000000B, 0x00001AE6, 0x00002E74, 0x00000000, 0x00050080, 0x0000000B,\n    0x000025E0, 0x00003E12, 0x00001AE6, 0x000500C4, 0x0000000B, 0x000046C4,\n    0x000025E0, 0x00000A0D, 0x00050080, 0x0000000B, 0x000048BB, 0x0000233E,\n    0x000046C4, 0x00050089, 0x0000000B, 0x00004DD5, 0x000048BB, 0x0000086E,\n    0x000500C4, 0x0000000B, 0x000046AF, 0x00004DD5, 0x00000A11, 0x000500C2,\n    0x0000000B, 0x00004B85, 0x000046AF, 0x00000A14, 0x00060041, 0x0000028E,\n    0x00002440, 0x00000CC7, 0x00000A0B, 0x00004B85, 0x0004003D, 0x00000011,\n    0x00005234, 0x00002440, 0x00050051, 0x0000000B, 0x00004F4C, 0x00005234,\n    0x00000000, 0x00050051, 0x0000000B, 0x0000447B, 0x00005234, 0x00000001,\n    0x00050080, 0x0000000B, 0x00003DE1, 0x000046AF, 0x00000A3A, 0x000500C2,\n    0x0000000B, 0x00006136, 0x00003DE1, 0x00000A14, 0x00060041, 0x0000028E,\n    0x00004914, 0x00000CC7, 0x00000A0B, 0x00006136, 0x0004003D, 0x00000011,\n    0x00005235, 0x00004914, 0x00050051, 0x0000000B, 0x00004BBC, 0x00005235,\n    0x00000000, 0x00050051, 0x0000000B, 0x00006005, 0x00005235, 0x00000001,\n    0x00070050, 0x00000017, 0x0000268D, 0x00004F4C, 0x0000447B, 0x00004BBC,\n    0x00006005, 0x00050080, 0x0000000B, 0x00003EDA, 0x000046AF, 0x00000A6A,\n    0x000500C2, 0x0000000B, 0x0000202D, 0x00003EDA, 0x00000A14, 0x00060041,\n    0x0000028E, 0x00004915, 0x00000CC7, 0x00000A0B, 0x0000202D, 0x0004003D,\n    0x00000011, 0x00005236, 0x00004915, 0x00050051, 0x0000000B, 0x00004F4D,\n    0x00005236, 0x00000000, 0x00050051, 0x0000000B, 0x0000447C, 0x00005236,\n    0x00000001, 0x00050080, 0x0000000B, 0x00003DE2, 0x000046AF, 0x00000A9A,\n    0x000500C2, 0x0000000B, 0x00006137, 0x00003DE2, 0x00000A14, 0x00060041,\n    0x0000028E, 0x00004916, 0x00000CC7, 0x00000A0B, 0x00006137, 0x0004003D,\n    0x00000011, 0x00005237, 0x00004916, 0x00050051, 0x0000000B, 0x00004BBD,\n    0x00005237, 0x00000000, 0x00050051, 0x0000000B, 0x000018A4, 0x00005237,\n    0x00000001, 0x00070050, 0x00000017, 0x000052CF, 0x00004F4D, 0x0000447C,\n    0x00004BBD, 0x000018A4, 0x000500AA, 0x00000009, 0x00005A05, 0x00001DD8,\n    0x00000A0A, 0x000600A9, 0x00000009, 0x000052F9, 0x00005A05, 0x00000787,\n    0x00005A05, 0x000300F7, 0x00005596, 0x00000002, 0x000400FA, 0x000052F9,\n    0x00002573, 0x00005596, 0x000200F8, 0x00002573, 0x00060052, 0x00000017,\n    0x00003001, 0x00004BBC, 0x0000268D, 0x00000000, 0x00060052, 0x00000017,\n    0x00003706, 0x00006005, 0x00003001, 0x00000001, 0x000200F9, 0x00005596,\n    0x000200F8, 0x00005596, 0x000700F5, 0x00000017, 0x00002AAC, 0x0000268D,\n    0x00001AFD, 0x00003706, 0x00002573, 0x000300F7, 0x0000530F, 0x00000002,\n    0x000400FA, 0x00004C4F, 0x00003ADC, 0x0000530F, 0x000200F8, 0x00003ADC,\n    0x000500AA, 0x00000009, 0x00003585, 0x000023AA, 0x00000A19, 0x000400A8,\n    0x00000009, 0x00004277, 0x00003585, 0x000300F7, 0x00003D52, 0x00000000,\n    0x000400FA, 0x00004277, 0x000040DF, 0x00003D52, 0x000200F8, 0x000040DF,\n    0x000500AA, 0x00000009, 0x0000495A, 0x000023AA, 0x00000A1F, 0x000200F9,\n    0x00003D52, 0x000200F8, 0x00003D52, 0x000700F5, 0x00000009, 0x00002AAD,\n    0x00003585, 0x00003ADC, 0x0000495A, 0x000040DF, 0x000300F7, 0x000039F4,\n    0x00000002, 0x000400FA, 0x00002AAD, 0x000020A8, 0x000039F4, 0x000200F8,\n    0x000020A8, 0x000500C7, 0x00000017, 0x00004BF1, 0x00002AAC, 0x00000755,\n    0x0009004F, 0x00000017, 0x000051EA, 0x00002AAC, 0x00002AAC, 0x00000001,\n    0x00000000, 0x00000003, 0x00000002, 0x000500C7, 0x00000017, 0x00001CED,\n    0x000051EA, 0x00000352, 0x000500C5, 0x00000017, 0x00003640, 0x00004BF1,\n    0x00001CED, 0x000500C7, 0x00000017, 0x00005311, 0x000052CF, 0x00000755,\n    0x0009004F, 0x00000017, 0x00003BF8, 0x000052CF, 0x000052CF, 0x00000001,\n    0x00000000, 0x00000003, 0x00000002, 0x000500C7, 0x00000017, 0x000020A3,\n    0x00003BF8, 0x00000352, 0x000500C5, 0x00000017, 0x00002101, 0x00005311,\n    0x000020A3, 0x000200F9, 0x000039F4, 0x000200F8, 0x000039F4, 0x000700F5,\n    0x00000017, 0x00002BF3, 0x000052CF, 0x00003D52, 0x00002101, 0x000020A8,\n    0x000700F5, 0x00000017, 0x0000358D, 0x00002AAC, 0x00003D52, 0x00003640,\n    0x000020A8, 0x000200F9, 0x0000530F, 0x000200F8, 0x0000530F, 0x000700F5,\n    0x00000017, 0x000022F8, 0x000052CF, 0x00005596, 0x00002BF3, 0x000039F4,\n    0x000700F5, 0x00000017, 0x000055F9, 0x00002AAC, 0x00005596, 0x0000358D,\n    0x000039F4, 0x00050080, 0x00000011, 0x00001C97, 0x00002EF9, 0x000059EC,\n    0x000300F7, 0x000052F5, 0x00000002, 0x000400FA, 0x0000500F, 0x0000294E,\n    0x0000537D, 0x000200F8, 0x0000537D, 0x0004007C, 0x00000012, 0x00002970,\n    0x00001C97, 0x00050051, 0x0000000C, 0x000045F3, 0x00002970, 0x00000001,\n    0x000500C3, 0x0000000C, 0x00004DC0, 0x000045F3, 0x00000A1A, 0x0004007C,\n    0x0000000C, 0x00005780, 0x000020FC, 0x00050084, 0x0000000C, 0x00001F02,\n    0x00004DC0, 0x00005780, 0x00050051, 0x0000000C, 0x00006242, 0x00002970,\n    0x00000000, 0x000500C3, 0x0000000C, 0x00004FC7, 0x00006242, 0x00000A1A,\n    0x00050080, 0x0000000C, 0x000049B0, 0x00001F02, 0x00004FC7, 0x000500C4,\n    0x0000000C, 0x0000254A, 0x000049B0, 0x00000A1D, 0x000500C3, 0x0000000C,\n    0x0000603B, 0x000045F3, 0x00000A0E, 0x000500C7, 0x0000000C, 0x0000539A,\n    0x0000603B, 0x00000A20, 0x000500C4, 0x0000000C, 0x0000534A, 0x0000539A,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x00004EA5, 0x00006242, 0x00000A20,\n    0x000500C5, 0x0000000C, 0x00002B1A, 0x0000534A, 0x00004EA5, 0x000500C5,\n    0x0000000C, 0x000043B6, 0x0000254A, 0x00002B1A, 0x000500C4, 0x0000000C,\n    0x00005E63, 0x000043B6, 0x00000A13, 0x000500C3, 0x0000000C, 0x000031DE,\n    0x000045F3, 0x00000A17, 0x000500C7, 0x0000000C, 0x00005447, 0x000031DE,\n    0x00000A0E, 0x000500C3, 0x0000000C, 0x000028A6, 0x00006242, 0x00000A14,\n    0x000500C7, 0x0000000C, 0x0000511E, 0x000028A6, 0x00000A14, 0x000500C3,\n    0x0000000C, 0x000028B9, 0x000045F3, 0x00000A14, 0x000500C7, 0x0000000C,\n    0x0000505E, 0x000028B9, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000541D,\n    0x0000505E, 0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BA, 0x0000511E,\n    0x0000541D, 0x000500C7, 0x0000000C, 0x00005076, 0x000045F3, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x00005228, 0x00005076, 0x00000A17, 0x000500C4,\n    0x0000000C, 0x00001997, 0x000022BA, 0x00000A1D, 0x000500C5, 0x0000000C,\n    0x000047FE, 0x00005228, 0x00001997, 0x000500C4, 0x0000000C, 0x00001C00,\n    0x00005447, 0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C81, 0x000047FE,\n    0x00001C00, 0x000500C7, 0x0000000C, 0x000050AF, 0x00005E63, 0x00000A38,\n    0x000500C5, 0x0000000C, 0x00003C70, 0x00003C81, 0x000050AF, 0x000500C3,\n    0x0000000C, 0x00003745, 0x00005E63, 0x00000A17, 0x000500C7, 0x0000000C,\n    0x000018B8, 0x00003745, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000547E,\n    0x000018B8, 0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A8, 0x00003C70,\n    0x0000547E, 0x000500C3, 0x0000000C, 0x00003A6E, 0x00005E63, 0x00000A1A,\n    0x000500C7, 0x0000000C, 0x000018B9, 0x00003A6E, 0x00000A20, 0x000500C4,\n    0x0000000C, 0x0000547F, 0x000018B9, 0x00000A23, 0x000500C5, 0x0000000C,\n    0x0000456F, 0x000045A8, 0x0000547F, 0x000500C3, 0x0000000C, 0x00003C88,\n    0x00005E63, 0x00000A23, 0x000500C4, 0x0000000C, 0x00002824, 0x00003C88,\n    0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B79, 0x0000456F, 0x00002824,\n    0x0004007C, 0x0000000B, 0x000041E5, 0x00003B79, 0x000200F9, 0x000052F5,\n    0x000200F8, 0x0000294E, 0x00050051, 0x0000000B, 0x00004D9A, 0x00001C97,\n    0x00000000, 0x00050051, 0x0000000B, 0x00002C03, 0x00001C97, 0x00000001,\n    0x00060050, 0x00000014, 0x000020DE, 0x00004D9A, 0x00002C03, 0x000059FD,\n    0x0004007C, 0x00000016, 0x00004E9D, 0x000020DE, 0x00050051, 0x0000000C,\n    0x00002BF7, 0x00004E9D, 0x00000002, 0x000500C3, 0x0000000C, 0x00004DC1,\n    0x00002BF7, 0x00000A11, 0x0004007C, 0x0000000C, 0x00005781, 0x00006273,\n    0x00050084, 0x0000000C, 0x00001F03, 0x00004DC1, 0x00005781, 0x00050051,\n    0x0000000C, 0x00006243, 0x00004E9D, 0x00000001, 0x000500C3, 0x0000000C,\n    0x00004A6F, 0x00006243, 0x00000A17, 0x00050080, 0x0000000C, 0x00002B2C,\n    0x00001F03, 0x00004A6F, 0x0004007C, 0x0000000C, 0x00004202, 0x000020FC,\n    0x00050084, 0x0000000C, 0x00003A60, 0x00002B2C, 0x00004202, 0x00050051,\n    0x0000000C, 0x00006244, 0x00004E9D, 0x00000000, 0x000500C3, 0x0000000C,\n    0x00004FC8, 0x00006244, 0x00000A1A, 0x00050080, 0x0000000C, 0x000049FC,\n    0x00003A60, 0x00004FC8, 0x000500C4, 0x0000000C, 0x0000225D, 0x000049FC,\n    0x00000A20, 0x000500C7, 0x0000000C, 0x00002CAA, 0x00002BF7, 0x00000A14,\n    0x000500C4, 0x0000000C, 0x00004CAE, 0x00002CAA, 0x00000A1A, 0x000500C3,\n    0x0000000C, 0x0000383E, 0x00006243, 0x00000A0E, 0x000500C7, 0x0000000C,\n    0x00005374, 0x0000383E, 0x00000A14, 0x000500C4, 0x0000000C, 0x000054CA,\n    0x00005374, 0x00000A14, 0x000500C5, 0x0000000C, 0x000042CE, 0x00004CAE,\n    0x000054CA, 0x000500C7, 0x0000000C, 0x000050D5, 0x00006244, 0x00000A20,\n    0x000500C5, 0x0000000C, 0x00003ADD, 0x000042CE, 0x000050D5, 0x000500C5,\n    0x0000000C, 0x000043B7, 0x0000225D, 0x00003ADD, 0x000500C4, 0x0000000C,\n    0x00005E50, 0x000043B7, 0x00000A13, 0x000500C3, 0x0000000C, 0x000032D7,\n    0x00006243, 0x00000A14, 0x000500C6, 0x0000000C, 0x000026C9, 0x000032D7,\n    0x00004DC1, 0x000500C7, 0x0000000C, 0x00004199, 0x000026C9, 0x00000A0E,\n    0x000500C3, 0x0000000C, 0x00002590, 0x00006244, 0x00000A14, 0x000500C7,\n    0x0000000C, 0x0000505F, 0x00002590, 0x00000A14, 0x000500C4, 0x0000000C,\n    0x0000541E, 0x00004199, 0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BB,\n    0x0000505F, 0x0000541E, 0x000500C7, 0x0000000C, 0x00005077, 0x00006243,\n    0x00000A0E, 0x000500C4, 0x0000000C, 0x00005229, 0x00005077, 0x00000A17,\n    0x000500C4, 0x0000000C, 0x00001998, 0x000022BB, 0x00000A1D, 0x000500C5,\n    0x0000000C, 0x000047FF, 0x00005229, 0x00001998, 0x000500C4, 0x0000000C,\n    0x00001C01, 0x00004199, 0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C82,\n    0x000047FF, 0x00001C01, 0x000500C7, 0x0000000C, 0x000050B0, 0x00005E50,\n    0x00000A38, 0x000500C5, 0x0000000C, 0x00003C71, 0x00003C82, 0x000050B0,\n    0x000500C3, 0x0000000C, 0x00003746, 0x00005E50, 0x00000A17, 0x000500C7,\n    0x0000000C, 0x000018BA, 0x00003746, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x00005480, 0x000018BA, 0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A9,\n    0x00003C71, 0x00005480, 0x000500C3, 0x0000000C, 0x00003A6F, 0x00005E50,\n    0x00000A1A, 0x000500C7, 0x0000000C, 0x000018BB, 0x00003A6F, 0x00000A20,\n    0x000500C4, 0x0000000C, 0x00005481, 0x000018BB, 0x00000A23, 0x000500C5,\n    0x0000000C, 0x00004570, 0x000045A9, 0x00005481, 0x000500C3, 0x0000000C,\n    0x00003C89, 0x00005E50, 0x00000A23, 0x000500C4, 0x0000000C, 0x00002825,\n    0x00003C89, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B7A, 0x00004570,\n    0x00002825, 0x0004007C, 0x0000000B, 0x000041E6, 0x00003B7A, 0x000200F9,\n    0x000052F5, 0x000200F8, 0x000052F5, 0x000700F5, 0x0000000B, 0x00002C70,\n    0x000041E6, 0x0000294E, 0x000041E5, 0x0000537D, 0x00050080, 0x0000000B,\n    0x00005088, 0x00002C70, 0x000062B6, 0x000500C2, 0x0000000B, 0x00004EAA,\n    0x00005088, 0x00000A17, 0x000500AA, 0x00000009, 0x00004B9C, 0x00004ADC,\n    0x00000A16, 0x000300F7, 0x000039BC, 0x00000000, 0x000400FA, 0x00004B9C,\n    0x000033DF, 0x000039BC, 0x000200F8, 0x000033DF, 0x0009004F, 0x00000017,\n    0x00001F16, 0x000055F9, 0x000055F9, 0x00000001, 0x00000000, 0x00000003,\n    0x00000002, 0x000200F9, 0x000039BC, 0x000200F8, 0x000039BC, 0x000700F5,\n    0x00000017, 0x00005972, 0x000055F9, 0x000052F5, 0x00001F16, 0x000033DF,\n    0x000600A9, 0x0000000B, 0x000019CD, 0x00004B9C, 0x00000A10, 0x00004ADC,\n    0x000500AA, 0x00000009, 0x00003464, 0x000019CD, 0x00000A0D, 0x000500AA,\n    0x00000009, 0x000047C2, 0x000019CD, 0x00000A10, 0x000500A6, 0x00000009,\n    0x00005686, 0x00003464, 0x000047C2, 0x000300F7, 0x00003463, 0x00000000,\n    0x000400FA, 0x00005686, 0x00002957, 0x00003463, 0x000200F8, 0x00002957,\n    0x000500C7, 0x00000017, 0x0000475F, 0x00005972, 0x000009CE, 0x000500C4,\n    0x00000017, 0x000024D1, 0x0000475F, 0x0000013D, 0x000500C7, 0x00000017,\n    0x000050AC, 0x00005972, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448D,\n    0x000050AC, 0x0000013D, 0x000500C5, 0x00000017, 0x00003FF8, 0x000024D1,\n    0x0000448D, 0x000200F9, 0x00003463, 0x000200F8, 0x00003463, 0x000700F5,\n    0x00000017, 0x00005879, 0x00005972, 0x000039BC, 0x00003FF8, 0x00002957,\n    0x000500AA, 0x00000009, 0x00004CB6, 0x000019CD, 0x00000A13, 0x000500A6,\n    0x00000009, 0x00003B23, 0x000047C2, 0x00004CB6, 0x000300F7, 0x00002C98,\n    0x00000000, 0x000400FA, 0x00003B23, 0x00002B38, 0x00002C98, 0x000200F8,\n    0x00002B38, 0x000500C4, 0x00000017, 0x00005E17, 0x00005879, 0x000002ED,\n    0x000500C2, 0x00000017, 0x00003BE7, 0x00005879, 0x000002ED, 0x000500C5,\n    0x00000017, 0x000029E8, 0x00005E17, 0x00003BE7, 0x000200F9, 0x00002C98,\n    0x000200F8, 0x00002C98, 0x000700F5, 0x00000017, 0x00004D37, 0x00005879,\n    0x00003463, 0x000029E8, 0x00002B38, 0x00060041, 0x00000294, 0x000060F9,\n    0x00001592, 0x00000A0B, 0x00004EAA, 0x0003003E, 0x000060F9, 0x00004D37,\n    0x00050080, 0x0000000B, 0x00002DCE, 0x00005088, 0x00000A6A, 0x000500C2,\n    0x0000000B, 0x000041F1, 0x00002DCE, 0x00000A17, 0x000300F7, 0x00003F86,\n    0x00000000, 0x000400FA, 0x00004B9C, 0x000033E0, 0x00003F86, 0x000200F8,\n    0x000033E0, 0x0009004F, 0x00000017, 0x00001F17, 0x000022F8, 0x000022F8,\n    0x00000001, 0x00000000, 0x00000003, 0x00000002, 0x000200F9, 0x00003F86,\n    0x000200F8, 0x00003F86, 0x000700F5, 0x00000017, 0x00002AAE, 0x000022F8,\n    0x00002C98, 0x00001F17, 0x000033E0, 0x000300F7, 0x00003A1A, 0x00000000,\n    0x000400FA, 0x00005686, 0x00002958, 0x00003A1A, 0x000200F8, 0x00002958,\n    0x000500C7, 0x00000017, 0x00004760, 0x00002AAE, 0x000009CE, 0x000500C4,\n    0x00000017, 0x000024D2, 0x00004760, 0x0000013D, 0x000500C7, 0x00000017,\n    0x000050AD, 0x00002AAE, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448E,\n    0x000050AD, 0x0000013D, 0x000500C5, 0x00000017, 0x00003FF9, 0x000024D2,\n    0x0000448E, 0x000200F9, 0x00003A1A, 0x000200F8, 0x00003A1A, 0x000700F5,\n    0x00000017, 0x00002AAF, 0x00002AAE, 0x00003F86, 0x00003FF9, 0x00002958,\n    0x000300F7, 0x00002C99, 0x00000000, 0x000400FA, 0x00003B23, 0x00002B39,\n    0x00002C99, 0x000200F8, 0x00002B39, 0x000500C4, 0x00000017, 0x00005E18,\n    0x00002AAF, 0x000002ED, 0x000500C2, 0x00000017, 0x00003BE8, 0x00002AAF,\n    0x000002ED, 0x000500C5, 0x00000017, 0x000029E9, 0x00005E18, 0x00003BE8,\n    0x000200F9, 0x00002C99, 0x000200F8, 0x00002C99, 0x000700F5, 0x00000017,\n    0x00004D38, 0x00002AAF, 0x00003A1A, 0x000029E9, 0x00002B39, 0x00060041,\n    0x00000294, 0x00001F75, 0x00001592, 0x00000A0B, 0x000041F1, 0x0003003E,\n    0x00001F75, 0x00004D38, 0x000200F9, 0x00004C7A, 0x000200F8, 0x00004C7A,\n    0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/resolve_fast_64bpp_4xmsaa_scaled_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25204\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 8 8 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_resolve_edram_info\"\n               OpMemberName %push_const_block_xe 1 \"xe_resolve_coordinate_info\"\n               OpMemberName %push_const_block_xe 2 \"xe_resolve_dest_info\"\n               OpMemberName %push_const_block_xe 3 \"xe_resolve_dest_coordinate_info\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_resolve_edram_xe_block \"xe_resolve_edram_xe_block\"\n               OpMemberName %xe_resolve_edram_xe_block 0 \"data\"\n               OpName %xe_resolve_edram \"xe_resolve_edram\"\n               OpName %xe_resolve_dest_xe_block \"xe_resolve_dest_xe_block\"\n               OpMemberName %xe_resolve_dest_xe_block 0 \"data\"\n               OpName %xe_resolve_dest \"xe_resolve_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v2uint ArrayStride 8\n               OpDecorate %xe_resolve_edram_xe_block BufferBlock\n               OpMemberDecorate %xe_resolve_edram_xe_block 0 NonWritable\n               OpMemberDecorate %xe_resolve_edram_xe_block 0 Offset 0\n               OpDecorate %xe_resolve_edram NonWritable\n               OpDecorate %xe_resolve_edram Binding 0\n               OpDecorate %xe_resolve_edram DescriptorSet 0\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_resolve_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_resolve_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_resolve_dest_xe_block 0 Offset 0\n               OpDecorate %xe_resolve_dest NonReadable\n               OpDecorate %xe_resolve_dest Binding 0\n               OpDecorate %xe_resolve_dest DescriptorSet 1\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n     %v4uint = OpTypeVector %uint 4\n       %bool = OpTypeBool\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n     %uint_1 = OpConstant %uint 1\n     %uint_2 = OpConstant %uint 2\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n     %uint_3 = OpConstant %uint 3\n    %uint_16 = OpConstant %uint 16\n     %uint_4 = OpConstant %uint 4\n       %1837 = OpConstantComposite %v2uint %uint_2 %uint_1\n     %uint_0 = OpConstant %uint 0\n       %1807 = OpConstantComposite %v2uint %uint_0 %uint_0\n       %1828 = OpConstantComposite %v2uint %uint_1 %uint_1\n       %1816 = OpConstantComposite %v2uint %uint_1 %uint_0\n    %uint_80 = OpConstant %uint 80\n       %2719 = OpConstantComposite %v2uint %uint_80 %uint_16\n  %uint_2048 = OpConstant %uint 2048\n      %int_2 = OpConstant %int 2\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n      %int_3 = OpConstant %int 3\n     %uint_5 = OpConstant %uint 5\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n  %uint_1023 = OpConstant %uint 1023\n    %uint_10 = OpConstant %uint 10\n    %uint_13 = OpConstant %uint 13\n  %uint_2047 = OpConstant %uint 2047\n    %uint_24 = OpConstant %uint 24\n    %uint_15 = OpConstant %uint 15\n    %uint_28 = OpConstant %uint 28\n    %uint_19 = OpConstant %uint 19\n       %2179 = OpConstantComposite %v2uint %uint_16 %uint_19\n     %uint_7 = OpConstant %uint 7\n%uint_536870912 = OpConstant %uint 536870912\n       %1855 = OpConstantComposite %v2uint %uint_0 %uint_4\n%uint_16777216 = OpConstant %uint 16777216\n    %uint_20 = OpConstant %uint 20\n       %2275 = OpConstantComposite %v2uint %uint_20 %uint_24\n     %v3uint = OpTypeVector %uint 3\n%uint_4294901760 = OpConstant %uint 4294901760\n %uint_65535 = OpConstant %uint 65535\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %1825 = OpConstantComposite %v2uint %uint_2 %uint_0\n%_runtimearr_v2uint = OpTypeRuntimeArray %v2uint\n%xe_resolve_edram_xe_block = OpTypeStruct %_runtimearr_v2uint\n%_ptr_Uniform_xe_resolve_edram_xe_block = OpTypePointer Uniform %xe_resolve_edram_xe_block\n%xe_resolve_edram = OpVariable %_ptr_Uniform_xe_resolve_edram_xe_block Uniform\n%_ptr_Uniform_v2uint = OpTypePointer Uniform %v2uint\n    %uint_32 = OpConstant %uint 32\n    %uint_48 = OpConstant %uint 48\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_resolve_dest_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_resolve_dest_xe_block = OpTypePointer Uniform %xe_resolve_dest_xe_block\n%xe_resolve_dest = OpVariable %_ptr_Uniform_xe_resolve_dest_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_8 %uint_8 %uint_1\n       %1954 = OpConstantComposite %v2uint %uint_7 %uint_7\n       %1955 = OpConstantComposite %v2uint %uint_15 %uint_1\n       %1870 = OpConstantComposite %v2uint %uint_3 %uint_3\n       %2122 = OpConstantComposite %v2uint %uint_15 %uint_15\n       %1877 = OpConstantComposite %v4uint %uint_4294901760 %uint_4294901760 %uint_4294901760 %uint_4294901760\n        %850 = OpConstantComposite %v4uint %uint_65535 %uint_65535 %uint_65535 %uint_65535\n       %1846 = OpConstantComposite %v2uint %uint_3 %uint_1\n     %uint_6 = OpConstant %uint 6\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %22245 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %15627 = OpLoad %uint %22245\n      %22700 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %20824 = OpLoad %uint %22700\n      %20561 = OpBitwiseAnd %uint %15627 %uint_1023\n      %19978 = OpShiftRightLogical %uint %15627 %uint_13\n       %8574 = OpBitwiseAnd %uint %19978 %uint_2047\n      %18836 = OpShiftRightLogical %uint %15627 %uint_24\n       %9130 = OpBitwiseAnd %uint %18836 %uint_15\n       %8871 = OpCompositeConstruct %v2uint %20824 %20824\n       %9633 = OpShiftRightLogical %v2uint %8871 %2179\n      %23601 = OpBitwiseAnd %v2uint %9633 %1954\n      %24030 = OpBitwiseAnd %uint %15627 %uint_536870912\n      %12295 = OpINotEqual %bool %24030 %uint_0\n               OpSelectionMerge %14676 None\n               OpBranchConditional %12295 %16739 %21992\n      %21992 = OpLabel\n               OpBranch %14676\n      %16739 = OpLabel\n      %15278 = OpShiftRightLogical %v2uint %23601 %1828\n               OpBranch %14676\n      %14676 = OpLabel\n      %19124 = OpPhi %v2uint %15278 %16739 %1807 %21992\n       %7038 = OpShiftRightLogical %v2uint %8871 %1855\n      %11769 = OpBitwiseAnd %v2uint %7038 %1955\n      %16207 = OpShiftLeftLogical %v2uint %11769 %1870\n      %23019 = OpIMul %v2uint %16207 %23601\n      %13123 = OpShiftRightLogical %uint %20824 %uint_5\n      %14785 = OpBitwiseAnd %uint %13123 %uint_2047\n       %8858 = OpCompositeExtract %uint %23601 0\n      %22993 = OpIMul %uint %14785 %8858\n      %20036 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %18628 = OpLoad %uint %20036\n      %22701 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %20919 = OpLoad %uint %22701\n      %19164 = OpBitwiseAnd %uint %18628 %uint_7\n      %21999 = OpBitwiseAnd %uint %18628 %uint_8\n      %20495 = OpINotEqual %bool %21999 %uint_0\n      %10402 = OpShiftRightLogical %uint %18628 %uint_4\n      %23037 = OpBitwiseAnd %uint %10402 %uint_7\n      %23118 = OpBitwiseAnd %uint %18628 %uint_16777216\n      %19535 = OpINotEqual %bool %23118 %uint_0\n       %8444 = OpBitwiseAnd %uint %20919 %uint_1023\n      %12176 = OpShiftRightLogical %uint %20919 %uint_10\n      %25038 = OpBitwiseAnd %uint %12176 %uint_1023\n      %25203 = OpShiftLeftLogical %uint %25038 %int_1\n      %10422 = OpCompositeConstruct %v2uint %20919 %20919\n      %10385 = OpShiftRightLogical %v2uint %10422 %2275\n      %23379 = OpBitwiseAnd %v2uint %10385 %2122\n      %16208 = OpShiftLeftLogical %v2uint %23379 %1870\n      %23020 = OpIMul %v2uint %16208 %23601\n      %12743 = OpShiftRightLogical %uint %20919 %uint_28\n      %17238 = OpBitwiseAnd %uint %12743 %uint_7\n      %12737 = OpLoad %v3uint %gl_GlobalInvocationID\n      %14500 = OpVectorShuffle %v2uint %12737 %12737 0 1\n      %12025 = OpShiftLeftLogical %v2uint %14500 %1825\n       %7640 = OpCompositeExtract %uint %12025 0\n      %11658 = OpShiftLeftLogical %uint %22993 %uint_3\n      %15379 = OpUGreaterThanEqual %bool %7640 %11658\n               OpSelectionMerge %14025 DontFlatten\n               OpBranchConditional %15379 %21993 %14025\n      %21993 = OpLabel\n               OpBranch %19578\n      %14025 = OpLabel\n      %18615 = OpCompositeExtract %uint %12025 1\n      %16803 = OpCompositeExtract %uint %19124 1\n      %24446 = OpExtInst %uint %1 UMax %18615 %16803\n      %20975 = OpCompositeConstruct %v2uint %7640 %24446\n      %21036 = OpIAdd %v2uint %20975 %23019\n      %16075 = OpULessThanEqual %bool %17238 %uint_3\n               OpSelectionMerge %6909 None\n               OpBranchConditional %16075 %10990 %15087\n      %15087 = OpLabel\n      %13566 = OpIEqual %bool %17238 %uint_5\n       %8438 = OpSelect %uint %13566 %uint_2 %uint_0\n               OpBranch %6909\n      %10990 = OpLabel\n               OpBranch %6909\n       %6909 = OpLabel\n      %16517 = OpPhi %uint %17238 %10990 %8438 %15087\n      %11201 = OpShiftLeftLogical %v2uint %21036 %1828\n      %21693 = OpCompositeConstruct %v2uint %16517 %16517\n       %9093 = OpShiftRightLogical %v2uint %21693 %1816\n      %16072 = OpBitwiseAnd %v2uint %9093 %1828\n      %20272 = OpIAdd %v2uint %11201 %16072\n      %21145 = OpIMul %v2uint %2719 %23601\n      %14725 = OpShiftRightLogical %v2uint %21145 %1816\n      %19799 = OpUDiv %v2uint %20272 %14725\n      %20390 = OpCompositeExtract %uint %19799 1\n      %11046 = OpIMul %uint %20390 %20561\n      %24665 = OpCompositeExtract %uint %19799 0\n      %21536 = OpIAdd %uint %11046 %24665\n       %8742 = OpIAdd %uint %8574 %21536\n      %22376 = OpIMul %v2uint %19799 %14725\n      %20715 = OpISub %v2uint %20272 %22376\n       %7303 = OpCompositeExtract %uint %21145 0\n      %22882 = OpCompositeExtract %uint %21145 1\n      %13170 = OpIMul %uint %7303 %22882\n      %14551 = OpIMul %uint %8742 %13170\n       %6805 = OpCompositeExtract %uint %20715 1\n      %23526 = OpCompositeExtract %uint %14725 0\n      %22886 = OpIMul %uint %6805 %23526\n       %6886 = OpCompositeExtract %uint %20715 0\n       %9696 = OpIAdd %uint %22886 %6886\n      %18021 = OpShiftLeftLogical %uint %9696 %uint_1\n      %18363 = OpIAdd %uint %14551 %18021\n      %13922 = OpIMul %uint %13170 %uint_2048\n      %21900 = OpUMod %uint %18363 %13922\n      %21321 = OpShiftLeftLogical %uint %21900 %int_2\n      %19333 = OpShiftRightLogical %uint %21321 %int_3\n       %9280 = OpAccessChain %_ptr_Uniform_v2uint %xe_resolve_edram %int_0 %19333\n      %21044 = OpLoad %v2uint %9280\n      %20300 = OpCompositeExtract %uint %21044 0\n      %17531 = OpCompositeExtract %uint %21044 1\n      %15841 = OpIAdd %uint %21321 %uint_16\n      %24886 = OpShiftRightLogical %uint %15841 %int_3\n      %18708 = OpAccessChain %_ptr_Uniform_v2uint %xe_resolve_edram %int_0 %24886\n      %21045 = OpLoad %v2uint %18708\n      %19388 = OpCompositeExtract %uint %21045 0\n      %24581 = OpCompositeExtract %uint %21045 1\n       %9869 = OpCompositeConstruct %v4uint %20300 %17531 %19388 %24581\n      %16090 = OpIAdd %uint %21321 %uint_32\n       %8237 = OpShiftRightLogical %uint %16090 %int_3\n      %18709 = OpAccessChain %_ptr_Uniform_v2uint %xe_resolve_edram %int_0 %8237\n      %21046 = OpLoad %v2uint %18709\n      %20301 = OpCompositeExtract %uint %21046 0\n      %17532 = OpCompositeExtract %uint %21046 1\n      %15842 = OpIAdd %uint %21321 %uint_48\n      %24887 = OpShiftRightLogical %uint %15842 %int_3\n      %18710 = OpAccessChain %_ptr_Uniform_v2uint %xe_resolve_edram %int_0 %24887\n      %21047 = OpLoad %v2uint %18710\n      %19389 = OpCompositeExtract %uint %21047 0\n       %6308 = OpCompositeExtract %uint %21047 1\n      %22681 = OpCompositeConstruct %v4uint %20301 %17532 %19389 %6308\n       %9608 = OpIEqual %bool %7640 %uint_0\n               OpSelectionMerge %13276 None\n               OpBranchConditional %9608 %11451 %13276\n      %11451 = OpLabel\n      %24156 = OpCompositeExtract %uint %19124 0\n      %22470 = OpINotEqual %bool %24156 %uint_0\n               OpBranch %13276\n      %13276 = OpLabel\n      %10924 = OpPhi %bool %9608 %6909 %22470 %11451\n               OpSelectionMerge %21873 DontFlatten\n               OpBranchConditional %10924 %11508 %21873\n      %11508 = OpLabel\n      %23599 = OpCompositeExtract %uint %19124 0\n      %17346 = OpUGreaterThanEqual %bool %23599 %uint_2\n               OpSelectionMerge %21872 None\n               OpBranchConditional %17346 %15877 %21872\n      %15877 = OpLabel\n      %24532 = OpUGreaterThanEqual %bool %23599 %uint_3\n               OpSelectionMerge %18756 None\n               OpBranchConditional %24532 %9587 %18756\n       %9587 = OpLabel\n      %12289 = OpCompositeInsert %v4uint %19389 %22681 0\n      %14086 = OpCompositeInsert %v4uint %6308 %12289 1\n               OpBranch %18756\n      %18756 = OpLabel\n      %17379 = OpPhi %v4uint %22681 %15877 %14086 %9587\n      %22881 = OpCompositeExtract %uint %17379 0\n      %21983 = OpCompositeInsert %v4uint %22881 %9869 2\n      %23044 = OpCompositeExtract %uint %17379 1\n       %9296 = OpCompositeInsert %v4uint %23044 %21983 3\n               OpBranch %21872\n      %21872 = OpLabel\n       %8059 = OpPhi %v4uint %22681 %11508 %17379 %18756\n       %7934 = OpPhi %v4uint %9869 %11508 %9296 %18756\n      %23690 = OpCompositeExtract %uint %7934 2\n      %21984 = OpCompositeInsert %v4uint %23690 %7934 0\n      %23045 = OpCompositeExtract %uint %7934 3\n       %9297 = OpCompositeInsert %v4uint %23045 %21984 1\n               OpBranch %21873\n      %21873 = OpLabel\n      %11213 = OpPhi %v4uint %22681 %13276 %8059 %21872\n      %14093 = OpPhi %v4uint %9869 %13276 %9297 %21872\n               OpSelectionMerge %21263 DontFlatten\n               OpBranchConditional %19535 %15068 %21263\n      %15068 = OpLabel\n      %13701 = OpIEqual %bool %9130 %uint_5\n      %17015 = OpLogicalNot %bool %13701\n               OpSelectionMerge %15698 None\n               OpBranchConditional %17015 %16607 %15698\n      %16607 = OpLabel\n      %18778 = OpIEqual %bool %9130 %uint_7\n               OpBranch %15698\n      %15698 = OpLabel\n      %10925 = OpPhi %bool %13701 %15068 %18778 %16607\n               OpSelectionMerge %14836 DontFlatten\n               OpBranchConditional %10925 %8360 %14836\n       %8360 = OpLabel\n      %19441 = OpBitwiseAnd %v4uint %14093 %1877\n      %20970 = OpVectorShuffle %v4uint %14093 %14093 1 0 3 2\n       %7405 = OpBitwiseAnd %v4uint %20970 %850\n      %13888 = OpBitwiseOr %v4uint %19441 %7405\n      %21265 = OpBitwiseAnd %v4uint %11213 %1877\n      %15352 = OpVectorShuffle %v4uint %11213 %11213 1 0 3 2\n       %8355 = OpBitwiseAnd %v4uint %15352 %850\n       %8449 = OpBitwiseOr %v4uint %21265 %8355\n               OpBranch %14836\n      %14836 = OpLabel\n      %11251 = OpPhi %v4uint %11213 %15698 %8449 %8360\n      %13709 = OpPhi %v4uint %14093 %15698 %13888 %8360\n               OpBranch %21263\n      %21263 = OpLabel\n       %8952 = OpPhi %v4uint %11213 %21873 %11251 %14836\n      %21002 = OpPhi %v4uint %14093 %21873 %13709 %14836\n      %14284 = OpIAdd %v2uint %12025 %23020\n      %24181 = OpShiftRightLogical %v2uint %14284 %1837\n       %7712 = OpUDiv %v2uint %24181 %23601\n      %18183 = OpIMul %v2uint %23601 %7712\n      %18273 = OpISub %v2uint %24181 %18183\n      %11232 = OpShiftLeftLogical %v2uint %7712 %1837\n      %13284 = OpCompositeExtract %uint %18273 0\n      %10872 = OpCompositeExtract %uint %23601 1\n      %22887 = OpIMul %uint %13284 %10872\n       %6943 = OpCompositeExtract %uint %18273 1\n      %10469 = OpIAdd %uint %22887 %6943\n      %18851 = OpBitwiseAnd %v2uint %14284 %1846\n      %10581 = OpShiftLeftLogical %uint %10469 %uint_6\n      %20916 = OpCompositeExtract %uint %18851 1\n      %23596 = OpShiftLeftLogical %uint %20916 %uint_5\n      %19814 = OpBitwiseOr %uint %10581 %23596\n      %21476 = OpCompositeExtract %uint %18851 0\n      %11714 = OpShiftLeftLogical %uint %21476 %uint_3\n      %11193 = OpBitwiseOr %uint %19814 %11714\n               OpSelectionMerge %21313 DontFlatten\n               OpBranchConditional %20495 %10574 %21373\n      %21373 = OpLabel\n      %10608 = OpBitcast %v2int %11232\n      %17907 = OpCompositeExtract %int %10608 1\n      %19904 = OpShiftRightArithmetic %int %17907 %int_5\n      %22400 = OpBitcast %int %8444\n       %7938 = OpIMul %int %19904 %22400\n      %25154 = OpCompositeExtract %int %10608 0\n      %20423 = OpShiftRightArithmetic %int %25154 %int_5\n      %18864 = OpIAdd %int %7938 %20423\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %17907 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25154 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17334 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17334 %uint_3\n      %12766 = OpShiftRightArithmetic %int %17907 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25154 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %17907 %int_3\n      %20574 = OpBitwiseAnd %int %10425 %int_1\n      %21533 = OpShiftLeftLogical %int %20574 %int_1\n       %8890 = OpBitwiseXor %int %20766 %21533\n      %20598 = OpBitwiseAnd %int %17907 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6551\n       %7168 = OpShiftLeftLogical %int %21575 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24163 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24163 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24163 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24163 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %21313\n      %10574 = OpLabel\n      %19866 = OpCompositeExtract %uint %11232 0\n      %11267 = OpCompositeExtract %uint %11232 1\n       %8414 = OpCompositeConstruct %v3uint %19866 %11267 %23037\n      %20125 = OpBitcast %v3int %8414\n      %11255 = OpCompositeExtract %int %20125 2\n      %19905 = OpShiftRightArithmetic %int %11255 %int_2\n      %22401 = OpBitcast %int %25203\n       %7939 = OpIMul %int %19905 %22401\n      %25155 = OpCompositeExtract %int %20125 1\n      %19055 = OpShiftRightArithmetic %int %25155 %int_4\n      %11052 = OpIAdd %int %7939 %19055\n      %16898 = OpBitcast %int %8444\n      %14944 = OpIMul %int %11052 %16898\n      %25156 = OpCompositeExtract %int %20125 0\n      %20424 = OpShiftRightArithmetic %int %25156 %int_5\n      %18940 = OpIAdd %int %14944 %20424\n       %8797 = OpShiftLeftLogical %int %18940 %int_7\n      %11434 = OpBitwiseAnd %int %11255 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %25155 %int_1\n      %21364 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21364 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %25156 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17335 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17335 %uint_3\n      %13015 = OpShiftRightArithmetic %int %25155 %int_3\n       %9929 = OpBitwiseXor %int %13015 %19905\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %25156 %int_3\n      %20575 = OpBitwiseAnd %int %9616 %int_3\n      %21534 = OpShiftLeftLogical %int %16793 %int_1\n       %8891 = OpBitwiseXor %int %20575 %21534\n      %20599 = OpBitwiseAnd %int %25155 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6552\n       %7169 = OpShiftLeftLogical %int %16793 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24144 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24144 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24144 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24144 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %21313\n      %21313 = OpLabel\n       %9506 = OpPhi %uint %16870 %10574 %16869 %21373\n      %16843 = OpIMul %uint %8858 %10872\n      %11993 = OpIMul %uint %9506 %16843\n      %16012 = OpIAdd %uint %11993 %11193\n      %22330 = OpShiftRightLogical %uint %16012 %int_4\n      %19356 = OpIEqual %bool %19164 %uint_4\n               OpSelectionMerge %14780 None\n               OpBranchConditional %19356 %13279 %14780\n      %13279 = OpLabel\n       %7958 = OpVectorShuffle %v4uint %21002 %21002 1 0 3 2\n               OpBranch %14780\n      %14780 = OpLabel\n      %22898 = OpPhi %v4uint %21002 %21313 %7958 %13279\n       %6605 = OpSelect %uint %19356 %uint_2 %19164\n      %13412 = OpIEqual %bool %6605 %uint_1\n      %18370 = OpIEqual %bool %6605 %uint_2\n      %22150 = OpLogicalOr %bool %13412 %18370\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %22898 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %22898 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22649 = OpPhi %v4uint %22898 %14780 %16376 %10583\n      %19638 = OpIEqual %bool %6605 %uint_3\n      %15139 = OpLogicalOr %bool %18370 %19638\n               OpSelectionMerge %11416 None\n               OpBranchConditional %15139 %11064 %11416\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22649 %749\n      %15335 = OpShiftRightLogical %v4uint %22649 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %11416\n      %11416 = OpLabel\n      %19767 = OpPhi %v4uint %22649 %13411 %10728 %11064\n      %24825 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_dest %int_0 %22330\n               OpStore %24825 %19767\n      %11726 = OpIAdd %uint %16012 %uint_16\n      %16881 = OpShiftRightLogical %uint %11726 %int_4\n               OpSelectionMerge %16262 None\n               OpBranchConditional %19356 %13280 %16262\n      %13280 = OpLabel\n       %7959 = OpVectorShuffle %v4uint %8952 %8952 1 0 3 2\n               OpBranch %16262\n      %16262 = OpLabel\n      %10926 = OpPhi %v4uint %8952 %11416 %7959 %13280\n               OpSelectionMerge %14874 None\n               OpBranchConditional %22150 %10584 %14874\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %10926 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %10926 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %14874\n      %14874 = OpLabel\n      %10927 = OpPhi %v4uint %10926 %16262 %16377 %10584\n               OpSelectionMerge %11417 None\n               OpBranchConditional %15139 %11065 %11417\n      %11065 = OpLabel\n      %24088 = OpShiftLeftLogical %v4uint %10927 %749\n      %15336 = OpShiftRightLogical %v4uint %10927 %749\n      %10729 = OpBitwiseOr %v4uint %24088 %15336\n               OpBranch %11417\n      %11417 = OpLabel\n      %19768 = OpPhi %v4uint %10927 %14874 %10729 %11065\n       %8053 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_dest %int_0 %16881\n               OpStore %8053 %19768\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t resolve_fast_64bpp_4xmsaa_scaled_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006274, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000008, 0x00000008, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x000003F9, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x00090006, 0x000003F9, 0x00000000, 0x725F6578,\n    0x6C6F7365, 0x655F6576, 0x6D617264, 0x666E695F, 0x0000006F, 0x000A0006,\n    0x000003F9, 0x00000001, 0x725F6578, 0x6C6F7365, 0x635F6576, 0x64726F6F,\n    0x74616E69, 0x6E695F65, 0x00006F66, 0x00090006, 0x000003F9, 0x00000002,\n    0x725F6578, 0x6C6F7365, 0x645F6576, 0x5F747365, 0x6F666E69, 0x00000000,\n    0x000B0006, 0x000003F9, 0x00000003, 0x725F6578, 0x6C6F7365, 0x645F6576,\n    0x5F747365, 0x726F6F63, 0x616E6964, 0x695F6574, 0x006F666E, 0x00060005,\n    0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578, 0x00080005,\n    0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F, 0x496E6F69,\n    0x00000044, 0x00090005, 0x000007A8, 0x725F6578, 0x6C6F7365, 0x655F6576,\n    0x6D617264, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006, 0x000007A8,\n    0x00000000, 0x61746164, 0x00000000, 0x00070005, 0x00000CC7, 0x725F6578,\n    0x6C6F7365, 0x655F6576, 0x6D617264, 0x00000000, 0x00090005, 0x000007B4,\n    0x725F6578, 0x6C6F7365, 0x645F6576, 0x5F747365, 0x625F6578, 0x6B636F6C,\n    0x00000000, 0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000,\n    0x00060005, 0x00001592, 0x725F6578, 0x6C6F7365, 0x645F6576, 0x00747365,\n    0x00030047, 0x000003F9, 0x00000002, 0x00050048, 0x000003F9, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x000003F9, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x000003F9, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x000003F9, 0x00000003, 0x00000023, 0x0000000C, 0x00040047,\n    0x00000F48, 0x0000000B, 0x0000001C, 0x00040047, 0x000007D6, 0x00000006,\n    0x00000008, 0x00030047, 0x000007A8, 0x00000003, 0x00040048, 0x000007A8,\n    0x00000000, 0x00000018, 0x00050048, 0x000007A8, 0x00000000, 0x00000023,\n    0x00000000, 0x00030047, 0x00000CC7, 0x00000018, 0x00040047, 0x00000CC7,\n    0x00000021, 0x00000000, 0x00040047, 0x00000CC7, 0x00000022, 0x00000000,\n    0x00040047, 0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4,\n    0x00000003, 0x00040048, 0x000007B4, 0x00000000, 0x00000019, 0x00050048,\n    0x000007B4, 0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x00001592,\n    0x00000019, 0x00040047, 0x00001592, 0x00000021, 0x00000000, 0x00040047,\n    0x00001592, 0x00000022, 0x00000001, 0x00040047, 0x00000AC7, 0x0000000B,\n    0x00000019, 0x00020013, 0x00000008, 0x00030021, 0x00000502, 0x00000008,\n    0x00040015, 0x0000000B, 0x00000020, 0x00000000, 0x00040017, 0x00000011,\n    0x0000000B, 0x00000002, 0x00040017, 0x00000017, 0x0000000B, 0x00000004,\n    0x00020014, 0x00000009, 0x00040015, 0x0000000C, 0x00000020, 0x00000001,\n    0x00040017, 0x00000012, 0x0000000C, 0x00000002, 0x00040017, 0x00000016,\n    0x0000000C, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001,\n    0x0004002B, 0x0000000B, 0x00000A10, 0x00000002, 0x0004002B, 0x0000000B,\n    0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B, 0x00000A22, 0x00000008,\n    0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00, 0x0004002B, 0x0000000B,\n    0x00000A13, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A3A, 0x00000010,\n    0x0004002B, 0x0000000B, 0x00000A16, 0x00000004, 0x0005002C, 0x00000011,\n    0x0000072D, 0x00000A10, 0x00000A0D, 0x0004002B, 0x0000000B, 0x00000A0A,\n    0x00000000, 0x0005002C, 0x00000011, 0x0000070F, 0x00000A0A, 0x00000A0A,\n    0x0005002C, 0x00000011, 0x00000724, 0x00000A0D, 0x00000A0D, 0x0005002C,\n    0x00000011, 0x00000718, 0x00000A0D, 0x00000A0A, 0x0004002B, 0x0000000B,\n    0x00000AFA, 0x00000050, 0x0005002C, 0x00000011, 0x00000A9F, 0x00000AFA,\n    0x00000A3A, 0x0004002B, 0x0000000B, 0x00000A84, 0x00000800, 0x0004002B,\n    0x0000000C, 0x00000A11, 0x00000002, 0x0004002B, 0x0000000C, 0x00000A17,\n    0x00000004, 0x0004002B, 0x0000000C, 0x00000A1D, 0x00000006, 0x0004002B,\n    0x0000000C, 0x00000A2C, 0x0000000B, 0x0004002B, 0x0000000C, 0x00000A38,\n    0x0000000F, 0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001, 0x0004002B,\n    0x0000000C, 0x00000A1A, 0x00000005, 0x0004002B, 0x0000000C, 0x00000A20,\n    0x00000007, 0x0004002B, 0x0000000C, 0x00000A23, 0x00000008, 0x0004002B,\n    0x0000000C, 0x00000A2F, 0x0000000C, 0x0004002B, 0x0000000C, 0x00000A14,\n    0x00000003, 0x0004002B, 0x0000000B, 0x00000A19, 0x00000005, 0x0004002B,\n    0x0000000C, 0x00000A0B, 0x00000000, 0x0006001E, 0x000003F9, 0x0000000B,\n    0x0000000B, 0x0000000B, 0x0000000B, 0x00040020, 0x00000676, 0x00000009,\n    0x000003F9, 0x0004003B, 0x00000676, 0x00000CE9, 0x00000009, 0x00040020,\n    0x00000288, 0x00000009, 0x0000000B, 0x0004002B, 0x0000000B, 0x00000A44,\n    0x000003FF, 0x0004002B, 0x0000000B, 0x00000A28, 0x0000000A, 0x0004002B,\n    0x0000000B, 0x00000A31, 0x0000000D, 0x0004002B, 0x0000000B, 0x00000A81,\n    0x000007FF, 0x0004002B, 0x0000000B, 0x00000A52, 0x00000018, 0x0004002B,\n    0x0000000B, 0x00000A37, 0x0000000F, 0x0004002B, 0x0000000B, 0x00000A5E,\n    0x0000001C, 0x0004002B, 0x0000000B, 0x00000A43, 0x00000013, 0x0005002C,\n    0x00000011, 0x00000883, 0x00000A3A, 0x00000A43, 0x0004002B, 0x0000000B,\n    0x00000A1F, 0x00000007, 0x0004002B, 0x0000000B, 0x00000510, 0x20000000,\n    0x0005002C, 0x00000011, 0x0000073F, 0x00000A0A, 0x00000A16, 0x0004002B,\n    0x0000000B, 0x00000926, 0x01000000, 0x0004002B, 0x0000000B, 0x00000A46,\n    0x00000014, 0x0005002C, 0x00000011, 0x000008E3, 0x00000A46, 0x00000A52,\n    0x00040017, 0x00000014, 0x0000000B, 0x00000003, 0x0004002B, 0x0000000B,\n    0x0000068D, 0xFFFF0000, 0x0004002B, 0x0000000B, 0x000001C1, 0x0000FFFF,\n    0x00040020, 0x00000291, 0x00000001, 0x00000014, 0x0004003B, 0x00000291,\n    0x00000F48, 0x00000001, 0x0005002C, 0x00000011, 0x00000721, 0x00000A10,\n    0x00000A0A, 0x0003001D, 0x000007D6, 0x00000011, 0x0003001E, 0x000007A8,\n    0x000007D6, 0x00040020, 0x00000A25, 0x00000002, 0x000007A8, 0x0004003B,\n    0x00000A25, 0x00000CC7, 0x00000002, 0x00040020, 0x0000028E, 0x00000002,\n    0x00000011, 0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020, 0x0004002B,\n    0x0000000B, 0x00000A9A, 0x00000030, 0x0003001D, 0x000007DC, 0x00000017,\n    0x0003001E, 0x000007B4, 0x000007DC, 0x00040020, 0x00000A32, 0x00000002,\n    0x000007B4, 0x0004003B, 0x00000A32, 0x00001592, 0x00000002, 0x00040020,\n    0x00000294, 0x00000002, 0x00000017, 0x0006002C, 0x00000014, 0x00000AC7,\n    0x00000A22, 0x00000A22, 0x00000A0D, 0x0005002C, 0x00000011, 0x000007A2,\n    0x00000A1F, 0x00000A1F, 0x0005002C, 0x00000011, 0x000007A3, 0x00000A37,\n    0x00000A0D, 0x0005002C, 0x00000011, 0x0000074E, 0x00000A13, 0x00000A13,\n    0x0005002C, 0x00000011, 0x0000084A, 0x00000A37, 0x00000A37, 0x0007002C,\n    0x00000017, 0x00000755, 0x0000068D, 0x0000068D, 0x0000068D, 0x0000068D,\n    0x0007002C, 0x00000017, 0x00000352, 0x000001C1, 0x000001C1, 0x000001C1,\n    0x000001C1, 0x0005002C, 0x00000011, 0x00000736, 0x00000A13, 0x00000A0D,\n    0x0004002B, 0x0000000B, 0x00000A1C, 0x00000006, 0x0007002C, 0x00000017,\n    0x000009CE, 0x000008A6, 0x000008A6, 0x000008A6, 0x000008A6, 0x0007002C,\n    0x00000017, 0x0000013D, 0x00000A22, 0x00000A22, 0x00000A22, 0x00000A22,\n    0x0007002C, 0x00000017, 0x0000072E, 0x000005FD, 0x000005FD, 0x000005FD,\n    0x000005FD, 0x0007002C, 0x00000017, 0x000002ED, 0x00000A3A, 0x00000A3A,\n    0x00000A3A, 0x00000A3A, 0x00050036, 0x00000008, 0x0000161F, 0x00000000,\n    0x00000502, 0x000200F8, 0x00003B06, 0x000300F7, 0x00004C7A, 0x00000000,\n    0x000300FB, 0x00000A0A, 0x00002E68, 0x000200F8, 0x00002E68, 0x00050041,\n    0x00000288, 0x000056E5, 0x00000CE9, 0x00000A0B, 0x0004003D, 0x0000000B,\n    0x00003D0B, 0x000056E5, 0x00050041, 0x00000288, 0x000058AC, 0x00000CE9,\n    0x00000A0E, 0x0004003D, 0x0000000B, 0x00005158, 0x000058AC, 0x000500C7,\n    0x0000000B, 0x00005051, 0x00003D0B, 0x00000A44, 0x000500C2, 0x0000000B,\n    0x00004E0A, 0x00003D0B, 0x00000A31, 0x000500C7, 0x0000000B, 0x0000217E,\n    0x00004E0A, 0x00000A81, 0x000500C2, 0x0000000B, 0x00004994, 0x00003D0B,\n    0x00000A52, 0x000500C7, 0x0000000B, 0x000023AA, 0x00004994, 0x00000A37,\n    0x00050050, 0x00000011, 0x000022A7, 0x00005158, 0x00005158, 0x000500C2,\n    0x00000011, 0x000025A1, 0x000022A7, 0x00000883, 0x000500C7, 0x00000011,\n    0x00005C31, 0x000025A1, 0x000007A2, 0x000500C7, 0x0000000B, 0x00005DDE,\n    0x00003D0B, 0x00000510, 0x000500AB, 0x00000009, 0x00003007, 0x00005DDE,\n    0x00000A0A, 0x000300F7, 0x00003954, 0x00000000, 0x000400FA, 0x00003007,\n    0x00004163, 0x000055E8, 0x000200F8, 0x000055E8, 0x000200F9, 0x00003954,\n    0x000200F8, 0x00004163, 0x000500C2, 0x00000011, 0x00003BAE, 0x00005C31,\n    0x00000724, 0x000200F9, 0x00003954, 0x000200F8, 0x00003954, 0x000700F5,\n    0x00000011, 0x00004AB4, 0x00003BAE, 0x00004163, 0x0000070F, 0x000055E8,\n    0x000500C2, 0x00000011, 0x00001B7E, 0x000022A7, 0x0000073F, 0x000500C7,\n    0x00000011, 0x00002DF9, 0x00001B7E, 0x000007A3, 0x000500C4, 0x00000011,\n    0x00003F4F, 0x00002DF9, 0x0000074E, 0x00050084, 0x00000011, 0x000059EB,\n    0x00003F4F, 0x00005C31, 0x000500C2, 0x0000000B, 0x00003343, 0x00005158,\n    0x00000A19, 0x000500C7, 0x0000000B, 0x000039C1, 0x00003343, 0x00000A81,\n    0x00050051, 0x0000000B, 0x0000229A, 0x00005C31, 0x00000000, 0x00050084,\n    0x0000000B, 0x000059D1, 0x000039C1, 0x0000229A, 0x00050041, 0x00000288,\n    0x00004E44, 0x00000CE9, 0x00000A11, 0x0004003D, 0x0000000B, 0x000048C4,\n    0x00004E44, 0x00050041, 0x00000288, 0x000058AD, 0x00000CE9, 0x00000A14,\n    0x0004003D, 0x0000000B, 0x000051B7, 0x000058AD, 0x000500C7, 0x0000000B,\n    0x00004ADC, 0x000048C4, 0x00000A1F, 0x000500C7, 0x0000000B, 0x000055EF,\n    0x000048C4, 0x00000A22, 0x000500AB, 0x00000009, 0x0000500F, 0x000055EF,\n    0x00000A0A, 0x000500C2, 0x0000000B, 0x000028A2, 0x000048C4, 0x00000A16,\n    0x000500C7, 0x0000000B, 0x000059FD, 0x000028A2, 0x00000A1F, 0x000500C7,\n    0x0000000B, 0x00005A4E, 0x000048C4, 0x00000926, 0x000500AB, 0x00000009,\n    0x00004C4F, 0x00005A4E, 0x00000A0A, 0x000500C7, 0x0000000B, 0x000020FC,\n    0x000051B7, 0x00000A44, 0x000500C2, 0x0000000B, 0x00002F90, 0x000051B7,\n    0x00000A28, 0x000500C7, 0x0000000B, 0x000061CE, 0x00002F90, 0x00000A44,\n    0x000500C4, 0x0000000B, 0x00006273, 0x000061CE, 0x00000A0E, 0x00050050,\n    0x00000011, 0x000028B6, 0x000051B7, 0x000051B7, 0x000500C2, 0x00000011,\n    0x00002891, 0x000028B6, 0x000008E3, 0x000500C7, 0x00000011, 0x00005B53,\n    0x00002891, 0x0000084A, 0x000500C4, 0x00000011, 0x00003F50, 0x00005B53,\n    0x0000074E, 0x00050084, 0x00000011, 0x000059EC, 0x00003F50, 0x00005C31,\n    0x000500C2, 0x0000000B, 0x000031C7, 0x000051B7, 0x00000A5E, 0x000500C7,\n    0x0000000B, 0x00004356, 0x000031C7, 0x00000A1F, 0x0004003D, 0x00000014,\n    0x000031C1, 0x00000F48, 0x0007004F, 0x00000011, 0x000038A4, 0x000031C1,\n    0x000031C1, 0x00000000, 0x00000001, 0x000500C4, 0x00000011, 0x00002EF9,\n    0x000038A4, 0x00000721, 0x00050051, 0x0000000B, 0x00001DD8, 0x00002EF9,\n    0x00000000, 0x000500C4, 0x0000000B, 0x00002D8A, 0x000059D1, 0x00000A13,\n    0x000500AE, 0x00000009, 0x00003C13, 0x00001DD8, 0x00002D8A, 0x000300F7,\n    0x000036C9, 0x00000002, 0x000400FA, 0x00003C13, 0x000055E9, 0x000036C9,\n    0x000200F8, 0x000055E9, 0x000200F9, 0x00004C7A, 0x000200F8, 0x000036C9,\n    0x00050051, 0x0000000B, 0x000048B7, 0x00002EF9, 0x00000001, 0x00050051,\n    0x0000000B, 0x000041A3, 0x00004AB4, 0x00000001, 0x0007000C, 0x0000000B,\n    0x00005F7E, 0x00000001, 0x00000029, 0x000048B7, 0x000041A3, 0x00050050,\n    0x00000011, 0x000051EF, 0x00001DD8, 0x00005F7E, 0x00050080, 0x00000011,\n    0x0000522C, 0x000051EF, 0x000059EB, 0x000500B2, 0x00000009, 0x00003ECB,\n    0x00004356, 0x00000A13, 0x000300F7, 0x00001AFD, 0x00000000, 0x000400FA,\n    0x00003ECB, 0x00002AEE, 0x00003AEF, 0x000200F8, 0x00003AEF, 0x000500AA,\n    0x00000009, 0x000034FE, 0x00004356, 0x00000A19, 0x000600A9, 0x0000000B,\n    0x000020F6, 0x000034FE, 0x00000A10, 0x00000A0A, 0x000200F9, 0x00001AFD,\n    0x000200F8, 0x00002AEE, 0x000200F9, 0x00001AFD, 0x000200F8, 0x00001AFD,\n    0x000700F5, 0x0000000B, 0x00004085, 0x00004356, 0x00002AEE, 0x000020F6,\n    0x00003AEF, 0x000500C4, 0x00000011, 0x00002BC1, 0x0000522C, 0x00000724,\n    0x00050050, 0x00000011, 0x000054BD, 0x00004085, 0x00004085, 0x000500C2,\n    0x00000011, 0x00002385, 0x000054BD, 0x00000718, 0x000500C7, 0x00000011,\n    0x00003EC8, 0x00002385, 0x00000724, 0x00050080, 0x00000011, 0x00004F30,\n    0x00002BC1, 0x00003EC8, 0x00050084, 0x00000011, 0x00005299, 0x00000A9F,\n    0x00005C31, 0x000500C2, 0x00000011, 0x00003985, 0x00005299, 0x00000718,\n    0x00050086, 0x00000011, 0x00004D57, 0x00004F30, 0x00003985, 0x00050051,\n    0x0000000B, 0x00004FA6, 0x00004D57, 0x00000001, 0x00050084, 0x0000000B,\n    0x00002B26, 0x00004FA6, 0x00005051, 0x00050051, 0x0000000B, 0x00006059,\n    0x00004D57, 0x00000000, 0x00050080, 0x0000000B, 0x00005420, 0x00002B26,\n    0x00006059, 0x00050080, 0x0000000B, 0x00002226, 0x0000217E, 0x00005420,\n    0x00050084, 0x00000011, 0x00005768, 0x00004D57, 0x00003985, 0x00050082,\n    0x00000011, 0x000050EB, 0x00004F30, 0x00005768, 0x00050051, 0x0000000B,\n    0x00001C87, 0x00005299, 0x00000000, 0x00050051, 0x0000000B, 0x00005962,\n    0x00005299, 0x00000001, 0x00050084, 0x0000000B, 0x00003372, 0x00001C87,\n    0x00005962, 0x00050084, 0x0000000B, 0x000038D7, 0x00002226, 0x00003372,\n    0x00050051, 0x0000000B, 0x00001A95, 0x000050EB, 0x00000001, 0x00050051,\n    0x0000000B, 0x00005BE6, 0x00003985, 0x00000000, 0x00050084, 0x0000000B,\n    0x00005966, 0x00001A95, 0x00005BE6, 0x00050051, 0x0000000B, 0x00001AE6,\n    0x000050EB, 0x00000000, 0x00050080, 0x0000000B, 0x000025E0, 0x00005966,\n    0x00001AE6, 0x000500C4, 0x0000000B, 0x00004665, 0x000025E0, 0x00000A0D,\n    0x00050080, 0x0000000B, 0x000047BB, 0x000038D7, 0x00004665, 0x00050084,\n    0x0000000B, 0x00003662, 0x00003372, 0x00000A84, 0x00050089, 0x0000000B,\n    0x0000558C, 0x000047BB, 0x00003662, 0x000500C4, 0x0000000B, 0x00005349,\n    0x0000558C, 0x00000A11, 0x000500C2, 0x0000000B, 0x00004B85, 0x00005349,\n    0x00000A14, 0x00060041, 0x0000028E, 0x00002440, 0x00000CC7, 0x00000A0B,\n    0x00004B85, 0x0004003D, 0x00000011, 0x00005234, 0x00002440, 0x00050051,\n    0x0000000B, 0x00004F4C, 0x00005234, 0x00000000, 0x00050051, 0x0000000B,\n    0x0000447B, 0x00005234, 0x00000001, 0x00050080, 0x0000000B, 0x00003DE1,\n    0x00005349, 0x00000A3A, 0x000500C2, 0x0000000B, 0x00006136, 0x00003DE1,\n    0x00000A14, 0x00060041, 0x0000028E, 0x00004914, 0x00000CC7, 0x00000A0B,\n    0x00006136, 0x0004003D, 0x00000011, 0x00005235, 0x00004914, 0x00050051,\n    0x0000000B, 0x00004BBC, 0x00005235, 0x00000000, 0x00050051, 0x0000000B,\n    0x00006005, 0x00005235, 0x00000001, 0x00070050, 0x00000017, 0x0000268D,\n    0x00004F4C, 0x0000447B, 0x00004BBC, 0x00006005, 0x00050080, 0x0000000B,\n    0x00003EDA, 0x00005349, 0x00000A6A, 0x000500C2, 0x0000000B, 0x0000202D,\n    0x00003EDA, 0x00000A14, 0x00060041, 0x0000028E, 0x00004915, 0x00000CC7,\n    0x00000A0B, 0x0000202D, 0x0004003D, 0x00000011, 0x00005236, 0x00004915,\n    0x00050051, 0x0000000B, 0x00004F4D, 0x00005236, 0x00000000, 0x00050051,\n    0x0000000B, 0x0000447C, 0x00005236, 0x00000001, 0x00050080, 0x0000000B,\n    0x00003DE2, 0x00005349, 0x00000A9A, 0x000500C2, 0x0000000B, 0x00006137,\n    0x00003DE2, 0x00000A14, 0x00060041, 0x0000028E, 0x00004916, 0x00000CC7,\n    0x00000A0B, 0x00006137, 0x0004003D, 0x00000011, 0x00005237, 0x00004916,\n    0x00050051, 0x0000000B, 0x00004BBD, 0x00005237, 0x00000000, 0x00050051,\n    0x0000000B, 0x000018A4, 0x00005237, 0x00000001, 0x00070050, 0x00000017,\n    0x00005899, 0x00004F4D, 0x0000447C, 0x00004BBD, 0x000018A4, 0x000500AA,\n    0x00000009, 0x00002588, 0x00001DD8, 0x00000A0A, 0x000300F7, 0x000033DC,\n    0x00000000, 0x000400FA, 0x00002588, 0x00002CBB, 0x000033DC, 0x000200F8,\n    0x00002CBB, 0x00050051, 0x0000000B, 0x00005E5C, 0x00004AB4, 0x00000000,\n    0x000500AB, 0x00000009, 0x000057C6, 0x00005E5C, 0x00000A0A, 0x000200F9,\n    0x000033DC, 0x000200F8, 0x000033DC, 0x000700F5, 0x00000009, 0x00002AAC,\n    0x00002588, 0x00001AFD, 0x000057C6, 0x00002CBB, 0x000300F7, 0x00005571,\n    0x00000002, 0x000400FA, 0x00002AAC, 0x00002CF4, 0x00005571, 0x000200F8,\n    0x00002CF4, 0x00050051, 0x0000000B, 0x00005C2F, 0x00004AB4, 0x00000000,\n    0x000500AE, 0x00000009, 0x000043C2, 0x00005C2F, 0x00000A10, 0x000300F7,\n    0x00005570, 0x00000000, 0x000400FA, 0x000043C2, 0x00003E05, 0x00005570,\n    0x000200F8, 0x00003E05, 0x000500AE, 0x00000009, 0x00005FD4, 0x00005C2F,\n    0x00000A13, 0x000300F7, 0x00004944, 0x00000000, 0x000400FA, 0x00005FD4,\n    0x00002573, 0x00004944, 0x000200F8, 0x00002573, 0x00060052, 0x00000017,\n    0x00003001, 0x00004BBD, 0x00005899, 0x00000000, 0x00060052, 0x00000017,\n    0x00003706, 0x000018A4, 0x00003001, 0x00000001, 0x000200F9, 0x00004944,\n    0x000200F8, 0x00004944, 0x000700F5, 0x00000017, 0x000043E3, 0x00005899,\n    0x00003E05, 0x00003706, 0x00002573, 0x00050051, 0x0000000B, 0x00005961,\n    0x000043E3, 0x00000000, 0x00060052, 0x00000017, 0x000055DF, 0x00005961,\n    0x0000268D, 0x00000002, 0x00050051, 0x0000000B, 0x00005A04, 0x000043E3,\n    0x00000001, 0x00060052, 0x00000017, 0x00002450, 0x00005A04, 0x000055DF,\n    0x00000003, 0x000200F9, 0x00005570, 0x000200F8, 0x00005570, 0x000700F5,\n    0x00000017, 0x00001F7B, 0x00005899, 0x00002CF4, 0x000043E3, 0x00004944,\n    0x000700F5, 0x00000017, 0x00001EFE, 0x0000268D, 0x00002CF4, 0x00002450,\n    0x00004944, 0x00050051, 0x0000000B, 0x00005C8A, 0x00001EFE, 0x00000002,\n    0x00060052, 0x00000017, 0x000055E0, 0x00005C8A, 0x00001EFE, 0x00000000,\n    0x00050051, 0x0000000B, 0x00005A05, 0x00001EFE, 0x00000003, 0x00060052,\n    0x00000017, 0x00002451, 0x00005A05, 0x000055E0, 0x00000001, 0x000200F9,\n    0x00005571, 0x000200F8, 0x00005571, 0x000700F5, 0x00000017, 0x00002BCD,\n    0x00005899, 0x000033DC, 0x00001F7B, 0x00005570, 0x000700F5, 0x00000017,\n    0x0000370D, 0x0000268D, 0x000033DC, 0x00002451, 0x00005570, 0x000300F7,\n    0x0000530F, 0x00000002, 0x000400FA, 0x00004C4F, 0x00003ADC, 0x0000530F,\n    0x000200F8, 0x00003ADC, 0x000500AA, 0x00000009, 0x00003585, 0x000023AA,\n    0x00000A19, 0x000400A8, 0x00000009, 0x00004277, 0x00003585, 0x000300F7,\n    0x00003D52, 0x00000000, 0x000400FA, 0x00004277, 0x000040DF, 0x00003D52,\n    0x000200F8, 0x000040DF, 0x000500AA, 0x00000009, 0x0000495A, 0x000023AA,\n    0x00000A1F, 0x000200F9, 0x00003D52, 0x000200F8, 0x00003D52, 0x000700F5,\n    0x00000009, 0x00002AAD, 0x00003585, 0x00003ADC, 0x0000495A, 0x000040DF,\n    0x000300F7, 0x000039F4, 0x00000002, 0x000400FA, 0x00002AAD, 0x000020A8,\n    0x000039F4, 0x000200F8, 0x000020A8, 0x000500C7, 0x00000017, 0x00004BF1,\n    0x0000370D, 0x00000755, 0x0009004F, 0x00000017, 0x000051EA, 0x0000370D,\n    0x0000370D, 0x00000001, 0x00000000, 0x00000003, 0x00000002, 0x000500C7,\n    0x00000017, 0x00001CED, 0x000051EA, 0x00000352, 0x000500C5, 0x00000017,\n    0x00003640, 0x00004BF1, 0x00001CED, 0x000500C7, 0x00000017, 0x00005311,\n    0x00002BCD, 0x00000755, 0x0009004F, 0x00000017, 0x00003BF8, 0x00002BCD,\n    0x00002BCD, 0x00000001, 0x00000000, 0x00000003, 0x00000002, 0x000500C7,\n    0x00000017, 0x000020A3, 0x00003BF8, 0x00000352, 0x000500C5, 0x00000017,\n    0x00002101, 0x00005311, 0x000020A3, 0x000200F9, 0x000039F4, 0x000200F8,\n    0x000039F4, 0x000700F5, 0x00000017, 0x00002BF3, 0x00002BCD, 0x00003D52,\n    0x00002101, 0x000020A8, 0x000700F5, 0x00000017, 0x0000358D, 0x0000370D,\n    0x00003D52, 0x00003640, 0x000020A8, 0x000200F9, 0x0000530F, 0x000200F8,\n    0x0000530F, 0x000700F5, 0x00000017, 0x000022F8, 0x00002BCD, 0x00005571,\n    0x00002BF3, 0x000039F4, 0x000700F5, 0x00000017, 0x0000520A, 0x0000370D,\n    0x00005571, 0x0000358D, 0x000039F4, 0x00050080, 0x00000011, 0x000037CC,\n    0x00002EF9, 0x000059EC, 0x000500C2, 0x00000011, 0x00005E75, 0x000037CC,\n    0x0000072D, 0x00050086, 0x00000011, 0x00001E20, 0x00005E75, 0x00005C31,\n    0x00050084, 0x00000011, 0x00004707, 0x00005C31, 0x00001E20, 0x00050082,\n    0x00000011, 0x00004761, 0x00005E75, 0x00004707, 0x000500C4, 0x00000011,\n    0x00002BE0, 0x00001E20, 0x0000072D, 0x00050051, 0x0000000B, 0x000033E4,\n    0x00004761, 0x00000000, 0x00050051, 0x0000000B, 0x00002A78, 0x00005C31,\n    0x00000001, 0x00050084, 0x0000000B, 0x00005967, 0x000033E4, 0x00002A78,\n    0x00050051, 0x0000000B, 0x00001B1F, 0x00004761, 0x00000001, 0x00050080,\n    0x0000000B, 0x000028E5, 0x00005967, 0x00001B1F, 0x000500C7, 0x00000011,\n    0x000049A3, 0x000037CC, 0x00000736, 0x000500C4, 0x0000000B, 0x00002955,\n    0x000028E5, 0x00000A1C, 0x00050051, 0x0000000B, 0x000051B4, 0x000049A3,\n    0x00000001, 0x000500C4, 0x0000000B, 0x00005C2C, 0x000051B4, 0x00000A19,\n    0x000500C5, 0x0000000B, 0x00004D66, 0x00002955, 0x00005C2C, 0x00050051,\n    0x0000000B, 0x000053E4, 0x000049A3, 0x00000000, 0x000500C4, 0x0000000B,\n    0x00002DC2, 0x000053E4, 0x00000A13, 0x000500C5, 0x0000000B, 0x00002BB9,\n    0x00004D66, 0x00002DC2, 0x000300F7, 0x00005341, 0x00000002, 0x000400FA,\n    0x0000500F, 0x0000294E, 0x0000537D, 0x000200F8, 0x0000537D, 0x0004007C,\n    0x00000012, 0x00002970, 0x00002BE0, 0x00050051, 0x0000000C, 0x000045F3,\n    0x00002970, 0x00000001, 0x000500C3, 0x0000000C, 0x00004DC0, 0x000045F3,\n    0x00000A1A, 0x0004007C, 0x0000000C, 0x00005780, 0x000020FC, 0x00050084,\n    0x0000000C, 0x00001F02, 0x00004DC0, 0x00005780, 0x00050051, 0x0000000C,\n    0x00006242, 0x00002970, 0x00000000, 0x000500C3, 0x0000000C, 0x00004FC7,\n    0x00006242, 0x00000A1A, 0x00050080, 0x0000000C, 0x000049B0, 0x00001F02,\n    0x00004FC7, 0x000500C4, 0x0000000C, 0x0000254A, 0x000049B0, 0x00000A1D,\n    0x000500C3, 0x0000000C, 0x0000603B, 0x000045F3, 0x00000A0E, 0x000500C7,\n    0x0000000C, 0x0000539A, 0x0000603B, 0x00000A20, 0x000500C4, 0x0000000C,\n    0x0000534A, 0x0000539A, 0x00000A14, 0x000500C7, 0x0000000C, 0x00004EA5,\n    0x00006242, 0x00000A20, 0x000500C5, 0x0000000C, 0x00002B1A, 0x0000534A,\n    0x00004EA5, 0x000500C5, 0x0000000C, 0x000043B6, 0x0000254A, 0x00002B1A,\n    0x000500C4, 0x0000000C, 0x00005E63, 0x000043B6, 0x00000A13, 0x000500C3,\n    0x0000000C, 0x000031DE, 0x000045F3, 0x00000A17, 0x000500C7, 0x0000000C,\n    0x00005447, 0x000031DE, 0x00000A0E, 0x000500C3, 0x0000000C, 0x000028A6,\n    0x00006242, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000511E, 0x000028A6,\n    0x00000A14, 0x000500C3, 0x0000000C, 0x000028B9, 0x000045F3, 0x00000A14,\n    0x000500C7, 0x0000000C, 0x0000505E, 0x000028B9, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x0000541D, 0x0000505E, 0x00000A0E, 0x000500C6, 0x0000000C,\n    0x000022BA, 0x0000511E, 0x0000541D, 0x000500C7, 0x0000000C, 0x00005076,\n    0x000045F3, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005228, 0x00005076,\n    0x00000A17, 0x000500C4, 0x0000000C, 0x00001997, 0x000022BA, 0x00000A1D,\n    0x000500C5, 0x0000000C, 0x000047FE, 0x00005228, 0x00001997, 0x000500C4,\n    0x0000000C, 0x00001C00, 0x00005447, 0x00000A2C, 0x000500C5, 0x0000000C,\n    0x00003C81, 0x000047FE, 0x00001C00, 0x000500C7, 0x0000000C, 0x000050AF,\n    0x00005E63, 0x00000A38, 0x000500C5, 0x0000000C, 0x00003C70, 0x00003C81,\n    0x000050AF, 0x000500C3, 0x0000000C, 0x00003745, 0x00005E63, 0x00000A17,\n    0x000500C7, 0x0000000C, 0x000018B8, 0x00003745, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x0000547E, 0x000018B8, 0x00000A1A, 0x000500C5, 0x0000000C,\n    0x000045A8, 0x00003C70, 0x0000547E, 0x000500C3, 0x0000000C, 0x00003A6E,\n    0x00005E63, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018B9, 0x00003A6E,\n    0x00000A20, 0x000500C4, 0x0000000C, 0x0000547F, 0x000018B9, 0x00000A23,\n    0x000500C5, 0x0000000C, 0x0000456F, 0x000045A8, 0x0000547F, 0x000500C3,\n    0x0000000C, 0x00003C88, 0x00005E63, 0x00000A23, 0x000500C4, 0x0000000C,\n    0x00002824, 0x00003C88, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B79,\n    0x0000456F, 0x00002824, 0x0004007C, 0x0000000B, 0x000041E5, 0x00003B79,\n    0x000200F9, 0x00005341, 0x000200F8, 0x0000294E, 0x00050051, 0x0000000B,\n    0x00004D9A, 0x00002BE0, 0x00000000, 0x00050051, 0x0000000B, 0x00002C03,\n    0x00002BE0, 0x00000001, 0x00060050, 0x00000014, 0x000020DE, 0x00004D9A,\n    0x00002C03, 0x000059FD, 0x0004007C, 0x00000016, 0x00004E9D, 0x000020DE,\n    0x00050051, 0x0000000C, 0x00002BF7, 0x00004E9D, 0x00000002, 0x000500C3,\n    0x0000000C, 0x00004DC1, 0x00002BF7, 0x00000A11, 0x0004007C, 0x0000000C,\n    0x00005781, 0x00006273, 0x00050084, 0x0000000C, 0x00001F03, 0x00004DC1,\n    0x00005781, 0x00050051, 0x0000000C, 0x00006243, 0x00004E9D, 0x00000001,\n    0x000500C3, 0x0000000C, 0x00004A6F, 0x00006243, 0x00000A17, 0x00050080,\n    0x0000000C, 0x00002B2C, 0x00001F03, 0x00004A6F, 0x0004007C, 0x0000000C,\n    0x00004202, 0x000020FC, 0x00050084, 0x0000000C, 0x00003A60, 0x00002B2C,\n    0x00004202, 0x00050051, 0x0000000C, 0x00006244, 0x00004E9D, 0x00000000,\n    0x000500C3, 0x0000000C, 0x00004FC8, 0x00006244, 0x00000A1A, 0x00050080,\n    0x0000000C, 0x000049FC, 0x00003A60, 0x00004FC8, 0x000500C4, 0x0000000C,\n    0x0000225D, 0x000049FC, 0x00000A20, 0x000500C7, 0x0000000C, 0x00002CAA,\n    0x00002BF7, 0x00000A14, 0x000500C4, 0x0000000C, 0x00004CAE, 0x00002CAA,\n    0x00000A1A, 0x000500C3, 0x0000000C, 0x0000383E, 0x00006243, 0x00000A0E,\n    0x000500C7, 0x0000000C, 0x00005374, 0x0000383E, 0x00000A14, 0x000500C4,\n    0x0000000C, 0x000054CA, 0x00005374, 0x00000A14, 0x000500C5, 0x0000000C,\n    0x000042CE, 0x00004CAE, 0x000054CA, 0x000500C7, 0x0000000C, 0x000050D5,\n    0x00006244, 0x00000A20, 0x000500C5, 0x0000000C, 0x00003ADD, 0x000042CE,\n    0x000050D5, 0x000500C5, 0x0000000C, 0x000043B7, 0x0000225D, 0x00003ADD,\n    0x000500C4, 0x0000000C, 0x00005E50, 0x000043B7, 0x00000A13, 0x000500C3,\n    0x0000000C, 0x000032D7, 0x00006243, 0x00000A14, 0x000500C6, 0x0000000C,\n    0x000026C9, 0x000032D7, 0x00004DC1, 0x000500C7, 0x0000000C, 0x00004199,\n    0x000026C9, 0x00000A0E, 0x000500C3, 0x0000000C, 0x00002590, 0x00006244,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x0000505F, 0x00002590, 0x00000A14,\n    0x000500C4, 0x0000000C, 0x0000541E, 0x00004199, 0x00000A0E, 0x000500C6,\n    0x0000000C, 0x000022BB, 0x0000505F, 0x0000541E, 0x000500C7, 0x0000000C,\n    0x00005077, 0x00006243, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005229,\n    0x00005077, 0x00000A17, 0x000500C4, 0x0000000C, 0x00001998, 0x000022BB,\n    0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FF, 0x00005229, 0x00001998,\n    0x000500C4, 0x0000000C, 0x00001C01, 0x00004199, 0x00000A2C, 0x000500C5,\n    0x0000000C, 0x00003C82, 0x000047FF, 0x00001C01, 0x000500C7, 0x0000000C,\n    0x000050B0, 0x00005E50, 0x00000A38, 0x000500C5, 0x0000000C, 0x00003C71,\n    0x00003C82, 0x000050B0, 0x000500C3, 0x0000000C, 0x00003746, 0x00005E50,\n    0x00000A17, 0x000500C7, 0x0000000C, 0x000018BA, 0x00003746, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x00005480, 0x000018BA, 0x00000A1A, 0x000500C5,\n    0x0000000C, 0x000045A9, 0x00003C71, 0x00005480, 0x000500C3, 0x0000000C,\n    0x00003A6F, 0x00005E50, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018BB,\n    0x00003A6F, 0x00000A20, 0x000500C4, 0x0000000C, 0x00005481, 0x000018BB,\n    0x00000A23, 0x000500C5, 0x0000000C, 0x00004570, 0x000045A9, 0x00005481,\n    0x000500C3, 0x0000000C, 0x00003C89, 0x00005E50, 0x00000A23, 0x000500C4,\n    0x0000000C, 0x00002825, 0x00003C89, 0x00000A2F, 0x000500C5, 0x0000000C,\n    0x00003B7A, 0x00004570, 0x00002825, 0x0004007C, 0x0000000B, 0x000041E6,\n    0x00003B7A, 0x000200F9, 0x00005341, 0x000200F8, 0x00005341, 0x000700F5,\n    0x0000000B, 0x00002522, 0x000041E6, 0x0000294E, 0x000041E5, 0x0000537D,\n    0x00050084, 0x0000000B, 0x000041CB, 0x0000229A, 0x00002A78, 0x00050084,\n    0x0000000B, 0x00002ED9, 0x00002522, 0x000041CB, 0x00050080, 0x0000000B,\n    0x00003E8C, 0x00002ED9, 0x00002BB9, 0x000500C2, 0x0000000B, 0x0000573A,\n    0x00003E8C, 0x00000A17, 0x000500AA, 0x00000009, 0x00004B9C, 0x00004ADC,\n    0x00000A16, 0x000300F7, 0x000039BC, 0x00000000, 0x000400FA, 0x00004B9C,\n    0x000033DF, 0x000039BC, 0x000200F8, 0x000033DF, 0x0009004F, 0x00000017,\n    0x00001F16, 0x0000520A, 0x0000520A, 0x00000001, 0x00000000, 0x00000003,\n    0x00000002, 0x000200F9, 0x000039BC, 0x000200F8, 0x000039BC, 0x000700F5,\n    0x00000017, 0x00005972, 0x0000520A, 0x00005341, 0x00001F16, 0x000033DF,\n    0x000600A9, 0x0000000B, 0x000019CD, 0x00004B9C, 0x00000A10, 0x00004ADC,\n    0x000500AA, 0x00000009, 0x00003464, 0x000019CD, 0x00000A0D, 0x000500AA,\n    0x00000009, 0x000047C2, 0x000019CD, 0x00000A10, 0x000500A6, 0x00000009,\n    0x00005686, 0x00003464, 0x000047C2, 0x000300F7, 0x00003463, 0x00000000,\n    0x000400FA, 0x00005686, 0x00002957, 0x00003463, 0x000200F8, 0x00002957,\n    0x000500C7, 0x00000017, 0x0000475F, 0x00005972, 0x000009CE, 0x000500C4,\n    0x00000017, 0x000024D1, 0x0000475F, 0x0000013D, 0x000500C7, 0x00000017,\n    0x000050AC, 0x00005972, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448D,\n    0x000050AC, 0x0000013D, 0x000500C5, 0x00000017, 0x00003FF8, 0x000024D1,\n    0x0000448D, 0x000200F9, 0x00003463, 0x000200F8, 0x00003463, 0x000700F5,\n    0x00000017, 0x00005879, 0x00005972, 0x000039BC, 0x00003FF8, 0x00002957,\n    0x000500AA, 0x00000009, 0x00004CB6, 0x000019CD, 0x00000A13, 0x000500A6,\n    0x00000009, 0x00003B23, 0x000047C2, 0x00004CB6, 0x000300F7, 0x00002C98,\n    0x00000000, 0x000400FA, 0x00003B23, 0x00002B38, 0x00002C98, 0x000200F8,\n    0x00002B38, 0x000500C4, 0x00000017, 0x00005E17, 0x00005879, 0x000002ED,\n    0x000500C2, 0x00000017, 0x00003BE7, 0x00005879, 0x000002ED, 0x000500C5,\n    0x00000017, 0x000029E8, 0x00005E17, 0x00003BE7, 0x000200F9, 0x00002C98,\n    0x000200F8, 0x00002C98, 0x000700F5, 0x00000017, 0x00004D37, 0x00005879,\n    0x00003463, 0x000029E8, 0x00002B38, 0x00060041, 0x00000294, 0x000060F9,\n    0x00001592, 0x00000A0B, 0x0000573A, 0x0003003E, 0x000060F9, 0x00004D37,\n    0x00050080, 0x0000000B, 0x00002DCE, 0x00003E8C, 0x00000A3A, 0x000500C2,\n    0x0000000B, 0x000041F1, 0x00002DCE, 0x00000A17, 0x000300F7, 0x00003F86,\n    0x00000000, 0x000400FA, 0x00004B9C, 0x000033E0, 0x00003F86, 0x000200F8,\n    0x000033E0, 0x0009004F, 0x00000017, 0x00001F17, 0x000022F8, 0x000022F8,\n    0x00000001, 0x00000000, 0x00000003, 0x00000002, 0x000200F9, 0x00003F86,\n    0x000200F8, 0x00003F86, 0x000700F5, 0x00000017, 0x00002AAE, 0x000022F8,\n    0x00002C98, 0x00001F17, 0x000033E0, 0x000300F7, 0x00003A1A, 0x00000000,\n    0x000400FA, 0x00005686, 0x00002958, 0x00003A1A, 0x000200F8, 0x00002958,\n    0x000500C7, 0x00000017, 0x00004760, 0x00002AAE, 0x000009CE, 0x000500C4,\n    0x00000017, 0x000024D2, 0x00004760, 0x0000013D, 0x000500C7, 0x00000017,\n    0x000050AD, 0x00002AAE, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448E,\n    0x000050AD, 0x0000013D, 0x000500C5, 0x00000017, 0x00003FF9, 0x000024D2,\n    0x0000448E, 0x000200F9, 0x00003A1A, 0x000200F8, 0x00003A1A, 0x000700F5,\n    0x00000017, 0x00002AAF, 0x00002AAE, 0x00003F86, 0x00003FF9, 0x00002958,\n    0x000300F7, 0x00002C99, 0x00000000, 0x000400FA, 0x00003B23, 0x00002B39,\n    0x00002C99, 0x000200F8, 0x00002B39, 0x000500C4, 0x00000017, 0x00005E18,\n    0x00002AAF, 0x000002ED, 0x000500C2, 0x00000017, 0x00003BE8, 0x00002AAF,\n    0x000002ED, 0x000500C5, 0x00000017, 0x000029E9, 0x00005E18, 0x00003BE8,\n    0x000200F9, 0x00002C99, 0x000200F8, 0x00002C99, 0x000700F5, 0x00000017,\n    0x00004D38, 0x00002AAF, 0x00003A1A, 0x000029E9, 0x00002B39, 0x00060041,\n    0x00000294, 0x00001F75, 0x00001592, 0x00000A0B, 0x000041F1, 0x0003003E,\n    0x00001F75, 0x00004D38, 0x000200F9, 0x00004C7A, 0x000200F8, 0x00004C7A,\n    0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/resolve_full_128bpp_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25271\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 8 8 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_resolve_edram_info\"\n               OpMemberName %push_const_block_xe 1 \"xe_resolve_coordinate_info\"\n               OpMemberName %push_const_block_xe 2 \"xe_resolve_dest_info\"\n               OpMemberName %push_const_block_xe 3 \"xe_resolve_dest_coordinate_info\"\n               OpMemberName %push_const_block_xe 4 \"xe_resolve_dest_base\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %xe_resolve_edram_xe_block \"xe_resolve_edram_xe_block\"\n               OpMemberName %xe_resolve_edram_xe_block 0 \"data\"\n               OpName %xe_resolve_edram \"xe_resolve_edram\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_resolve_dest_xe_block \"xe_resolve_dest_xe_block\"\n               OpMemberName %xe_resolve_dest_xe_block 0 \"data\"\n               OpName %xe_resolve_dest \"xe_resolve_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpDecorate %_runtimearr_uint ArrayStride 4\n               OpDecorate %xe_resolve_edram_xe_block BufferBlock\n               OpMemberDecorate %xe_resolve_edram_xe_block 0 NonWritable\n               OpMemberDecorate %xe_resolve_edram_xe_block 0 Offset 0\n               OpDecorate %xe_resolve_edram NonWritable\n               OpDecorate %xe_resolve_edram Binding 0\n               OpDecorate %xe_resolve_edram DescriptorSet 0\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_resolve_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_resolve_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_resolve_dest_xe_block 0 Offset 0\n               OpDecorate %xe_resolve_dest NonReadable\n               OpDecorate %xe_resolve_dest Binding 0\n               OpDecorate %xe_resolve_dest DescriptorSet 1\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n     %v3uint = OpTypeVector %uint 3\n     %v4uint = OpTypeVector %uint 4\n      %float = OpTypeFloat 32\n    %v2float = OpTypeVector %float 2\n    %v4float = OpTypeVector %float 4\n       %bool = OpTypeBool\n      %v3int = OpTypeVector %int 3\n     %uint_1 = OpConstant %uint 1\n     %uint_2 = OpConstant %uint 2\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n     %uint_3 = OpConstant %uint 3\n    %uint_16 = OpConstant %uint 16\n     %uint_4 = OpConstant %uint 4\n     %uint_5 = OpConstant %uint 5\n     %uint_0 = OpConstant %uint 0\n    %uint_24 = OpConstant %uint 24\n        %653 = OpConstantComposite %v4uint %uint_0 %uint_8 %uint_16 %uint_24\n   %uint_255 = OpConstant %uint 255\n%float_0_00392156886 = OpConstant %float 0.00392156886\n    %uint_10 = OpConstant %uint 10\n    %uint_20 = OpConstant %uint 20\n    %uint_30 = OpConstant %uint 30\n        %845 = OpConstantComposite %v4uint %uint_0 %uint_10 %uint_20 %uint_30\n  %uint_1023 = OpConstant %uint 1023\n        %635 = OpConstantComposite %v4uint %uint_1023 %uint_1023 %uint_1023 %uint_3\n%float_0_000977517106 = OpConstant %float 0.000977517106\n%float_0_333333343 = OpConstant %float 0.333333343\n       %2798 = OpConstantComposite %v4float %float_0_000977517106 %float_0_000977517106 %float_0_000977517106 %float_0_333333343\n       %2996 = OpConstantComposite %v3uint %uint_0 %uint_10 %uint_20\n   %uint_127 = OpConstant %uint 127\n     %uint_7 = OpConstant %uint 7\n     %v3bool = OpTypeVector %bool 3\n   %uint_124 = OpConstant %uint 124\n    %uint_23 = OpConstant %uint 23\n    %v3float = OpTypeVector %float 3\n   %float_n1 = OpConstant %float -1\n     %int_16 = OpConstant %int 16\n      %int_0 = OpConstant %int 0\n       %1959 = OpConstantComposite %v2int %int_16 %int_0\n%float_0_000976592302 = OpConstant %float 0.000976592302\n      %v4int = OpTypeVector %int 4\n        %290 = OpConstantComposite %v4int %int_16 %int_0 %int_16 %int_0\n       %1837 = OpConstantComposite %v2uint %uint_2 %uint_1\n     %v2bool = OpTypeVector %bool 2\n       %1807 = OpConstantComposite %v2uint %uint_0 %uint_0\n       %1828 = OpConstantComposite %v2uint %uint_1 %uint_1\n       %1816 = OpConstantComposite %v2uint %uint_1 %uint_0\n    %uint_80 = OpConstant %uint 80\n       %2719 = OpConstantComposite %v2uint %uint_80 %uint_16\n      %int_2 = OpConstant %int 2\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n      %int_3 = OpConstant %int 3\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n    %uint_13 = OpConstant %uint 13\n  %uint_2047 = OpConstant %uint 2047\n    %uint_15 = OpConstant %uint 15\n    %uint_28 = OpConstant %uint 28\n       %1855 = OpConstantComposite %v2uint %uint_0 %uint_4\n     %int_10 = OpConstant %int 10\n     %int_26 = OpConstant %int 26\n     %int_23 = OpConstant %int 23\n%uint_16777216 = OpConstant %uint 16777216\n       %2275 = OpConstantComposite %v2uint %uint_20 %uint_24\n    %float_0 = OpConstant %float 0\n%_runtimearr_uint = OpTypeRuntimeArray %uint\n%xe_resolve_edram_xe_block = OpTypeStruct %_runtimearr_uint\n%_ptr_Uniform_xe_resolve_edram_xe_block = OpTypePointer Uniform %xe_resolve_edram_xe_block\n%xe_resolve_edram = OpVariable %_ptr_Uniform_xe_resolve_edram_xe_block Uniform\n%_ptr_Uniform_uint = OpTypePointer Uniform %uint\n   %uint_320 = OpConstant %uint 320\n  %float_0_5 = OpConstant %float 0.5\n     %uint_6 = OpConstant %uint 6\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_resolve_dest_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_resolve_dest_xe_block = OpTypePointer Uniform %xe_resolve_dest_xe_block\n%xe_resolve_dest = OpVariable %_ptr_Uniform_xe_resolve_dest_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_8 %uint_8 %uint_1\n       %1954 = OpConstantComposite %v2uint %uint_15 %uint_1\n       %1870 = OpConstantComposite %v2uint %uint_3 %uint_3\n       %2122 = OpConstantComposite %v2uint %uint_15 %uint_15\n       %1284 = OpConstantComposite %v4float %float_n1 %float_n1 %float_n1 %float_n1\n        %770 = OpConstantComposite %v4int %int_16 %int_16 %int_16 %int_16\n       %1611 = OpConstantComposite %v4uint %uint_255 %uint_255 %uint_255 %uint_255\n        %261 = OpConstantComposite %v3uint %uint_1023 %uint_1023 %uint_1023\n       %1126 = OpConstantComposite %v3uint %uint_127 %uint_127 %uint_127\n       %2828 = OpConstantComposite %v3uint %uint_7 %uint_7 %uint_7\n       %2578 = OpConstantComposite %v3uint %uint_0 %uint_0 %uint_0\n       %1018 = OpConstantComposite %v3uint %uint_124 %uint_124 %uint_124\n        %393 = OpConstantComposite %v3uint %uint_23 %uint_23 %uint_23\n        %141 = OpConstantComposite %v3uint %uint_16 %uint_16 %uint_16\n         %73 = OpConstantComposite %v2float %float_n1 %float_n1\n       %2151 = OpConstantComposite %v2int %int_16 %int_16\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n%int_1065353216 = OpConstant %int 1065353216\n  %uint_1280 = OpConstant %uint 1280\n%uint_2621440 = OpConstant %uint 2621440\n%uint_4294967290 = OpConstant %uint 4294967290\n       %2360 = OpConstantComposite %v3uint %uint_4294967290 %uint_4294967290 %uint_4294967290\n %float_0_25 = OpConstant %float 0.25\n    %uint_32 = OpConstant %uint 32\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %22245 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %15627 = OpLoad %uint %22245\n      %22700 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %20824 = OpLoad %uint %22700\n      %20561 = OpBitwiseAnd %uint %15627 %uint_1023\n      %19978 = OpShiftRightLogical %uint %15627 %uint_10\n       %8574 = OpBitwiseAnd %uint %19978 %uint_3\n      %21002 = OpShiftRightLogical %uint %15627 %uint_13\n       %8575 = OpBitwiseAnd %uint %21002 %uint_2047\n      %21003 = OpShiftRightLogical %uint %15627 %uint_24\n       %8576 = OpBitwiseAnd %uint %21003 %uint_15\n      %18836 = OpShiftRightLogical %uint %15627 %uint_28\n       %9130 = OpBitwiseAnd %uint %18836 %uint_1\n       %8871 = OpCompositeConstruct %v2uint %20824 %20824\n       %9576 = OpShiftRightLogical %v2uint %8871 %1855\n      %23379 = OpBitwiseAnd %v2uint %9576 %1954\n      %16207 = OpShiftLeftLogical %v2uint %23379 %1870\n      %23019 = OpIMul %v2uint %16207 %1828\n      %12819 = OpShiftRightLogical %uint %20824 %uint_5\n      %16204 = OpBitwiseAnd %uint %12819 %uint_2047\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %24236 = OpLoad %uint %18732\n      %22701 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %20919 = OpLoad %uint %22701\n      %19164 = OpBitwiseAnd %uint %24236 %uint_7\n      %21999 = OpBitwiseAnd %uint %24236 %uint_8\n      %20495 = OpINotEqual %bool %21999 %uint_0\n       %8977 = OpShiftRightLogical %uint %24236 %uint_4\n      %17416 = OpBitwiseAnd %uint %8977 %uint_7\n      %22920 = OpBitcast %int %24236\n      %13711 = OpShiftLeftLogical %int %22920 %int_10\n      %20636 = OpShiftRightArithmetic %int %13711 %int_26\n      %18178 = OpShiftLeftLogical %int %20636 %int_23\n       %7462 = OpIAdd %int %18178 %int_1065353216\n      %11052 = OpBitcast %float %7462\n      %22649 = OpBitwiseAnd %uint %24236 %uint_16777216\n       %7475 = OpINotEqual %bool %22649 %uint_0\n       %8444 = OpBitwiseAnd %uint %20919 %uint_1023\n      %12176 = OpShiftRightLogical %uint %20919 %uint_10\n      %25038 = OpBitwiseAnd %uint %12176 %uint_1023\n      %25203 = OpShiftLeftLogical %uint %25038 %int_1\n      %10422 = OpCompositeConstruct %v2uint %20919 %20919\n      %10385 = OpShiftRightLogical %v2uint %10422 %2275\n      %23380 = OpBitwiseAnd %v2uint %10385 %2122\n      %16208 = OpShiftLeftLogical %v2uint %23380 %1870\n      %23020 = OpIMul %v2uint %16208 %1828\n      %12820 = OpShiftRightLogical %uint %20919 %uint_28\n      %16205 = OpBitwiseAnd %uint %12820 %uint_7\n      %18656 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_4\n      %25270 = OpLoad %uint %18656\n      %14159 = OpLoad %v3uint %gl_GlobalInvocationID\n      %12672 = OpVectorShuffle %v2uint %14159 %14159 0 1\n      %12025 = OpShiftLeftLogical %v2uint %12672 %1816\n       %7640 = OpCompositeExtract %uint %12025 0\n      %11658 = OpShiftLeftLogical %uint %16204 %uint_3\n      %15379 = OpUGreaterThanEqual %bool %7640 %11658\n               OpSelectionMerge %20570 DontFlatten\n               OpBranchConditional %15379 %21992 %20570\n      %21992 = OpLabel\n               OpBranch %19578\n      %20570 = OpLabel\n      %15264 = OpExtInst %uint %1 UMax %7640 %uint_0\n       %9142 = OpCompositeExtract %uint %12025 1\n      %16709 = OpExtInst %uint %1 UMax %9142 %uint_0\n      %20975 = OpCompositeConstruct %v2uint %15264 %16709\n      %21036 = OpIAdd %v2uint %20975 %23019\n      %16075 = OpULessThanEqual %bool %16205 %uint_3\n               OpSelectionMerge %23776 None\n               OpBranchConditional %16075 %10990 %15087\n      %15087 = OpLabel\n      %13566 = OpIEqual %bool %16205 %uint_5\n       %8438 = OpSelect %uint %13566 %uint_2 %uint_0\n               OpBranch %23776\n      %10990 = OpLabel\n               OpBranch %23776\n      %23776 = OpLabel\n      %19300 = OpPhi %uint %16205 %10990 %8438 %15087\n      %16830 = OpCompositeConstruct %v2uint %8574 %8574\n      %11801 = OpUGreaterThanEqual %v2bool %16830 %1837\n      %19381 = OpSelect %v2uint %11801 %1828 %1807\n      %10986 = OpShiftLeftLogical %v2uint %21036 %19381\n      %24669 = OpCompositeConstruct %v2uint %19300 %19300\n       %9093 = OpShiftRightLogical %v2uint %24669 %1816\n      %15084 = OpBitwiseAnd %v2uint %9093 %1828\n      %10197 = OpIAdd %v2uint %10986 %15084\n       %8548 = OpCompositeConstruct %v2uint %9130 %uint_0\n       %9802 = OpShiftRightLogical %v2uint %2719 %8548\n      %10146 = OpUDiv %v2uint %10197 %9802\n      %20390 = OpCompositeExtract %uint %10146 1\n      %11046 = OpIMul %uint %20390 %20561\n      %24665 = OpCompositeExtract %uint %10146 0\n      %21536 = OpIAdd %uint %11046 %24665\n       %8742 = OpIAdd %uint %8575 %21536\n      %23345 = OpIMul %v2uint %10146 %9802\n      %11892 = OpISub %v2uint %10197 %23345\n       %8053 = OpIMul %uint %8742 %uint_1280\n      %24263 = OpCompositeExtract %uint %11892 1\n      %23526 = OpCompositeExtract %uint %9802 0\n      %22886 = OpIMul %uint %24263 %23526\n       %6886 = OpCompositeExtract %uint %11892 0\n       %9696 = OpIAdd %uint %22886 %6886\n      %18116 = OpShiftLeftLogical %uint %9696 %9130\n      %18619 = OpIAdd %uint %8053 %18116\n      %19545 = OpUMod %uint %18619 %uint_2621440\n      %23531 = OpShiftLeftLogical %uint %19545 %int_2\n      %13906 = OpUGreaterThanEqual %bool %8574 %uint_2\n      %11277 = OpSelect %uint %13906 %uint_1 %uint_0\n      %20074 = OpIAdd %uint %9130 %11277\n       %6555 = OpShiftLeftLogical %uint %uint_4 %20074\n      %23279 = OpINotEqual %bool %9130 %uint_0\n               OpSelectionMerge %21263 DontFlatten\n               OpBranchConditional %23279 %15205 %16569\n      %16569 = OpLabel\n      %19162 = OpIEqual %bool %6555 %uint_4\n               OpSelectionMerge %20297 DontFlatten\n               OpBranchConditional %19162 %6591 %8959\n       %8959 = OpLabel\n      %22064 = OpShiftRightLogical %uint %23531 %int_2\n      %13369 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22064\n      %15060 = OpLoad %uint %13369\n       %8517 = OpIAdd %uint %23531 %6555\n      %21670 = OpShiftRightLogical %uint %8517 %int_2\n      %18689 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21670\n      %24409 = OpLoad %uint %18689\n      %20780 = OpCompositeConstruct %v2uint %15060 %24409\n               OpBranch %20297\n       %6591 = OpLabel\n      %24486 = OpShiftRightLogical %uint %23531 %int_2\n      %13370 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24486\n      %12609 = OpLoad %uint %13370\n      %11687 = OpIAdd %uint %24486 %uint_1\n      %24558 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11687\n      %16379 = OpLoad %uint %24558\n      %20781 = OpCompositeConstruct %v2uint %12609 %16379\n               OpBranch %20297\n      %20297 = OpLabel\n      %10943 = OpPhi %v2uint %20781 %6591 %20780 %8959\n               OpSelectionMerge %16224 None\n               OpSwitch %8576 %19451 0 %14585 1 %14585 2 %7355 10 %7355 3 %7354 12 %7354 4 %8190 6 %8243\n       %8243 = OpLabel\n      %24406 = OpCompositeExtract %uint %10943 0\n      %24679 = OpExtInst %v2float %1 UnpackHalf2x16 %24406\n      %10082 = OpCompositeExtract %float %24679 0\n      %17478 = OpCompositeExtract %float %24679 1\n      %14604 = OpCompositeConstruct %v4float %10082 %17478 %float_0 %float_0\n      %17274 = OpCompositeExtract %uint %10943 1\n      %18027 = OpExtInst %v2float %1 UnpackHalf2x16 %17274\n      %10083 = OpCompositeExtract %float %18027 0\n      %20670 = OpCompositeExtract %float %18027 1\n       %9033 = OpCompositeConstruct %v4float %10083 %20670 %float_0 %float_0\n               OpBranch %16224\n       %8190 = OpLabel\n      %12427 = OpCompositeExtract %uint %10943 0\n      %22685 = OpBitcast %int %12427\n      %18202 = OpCompositeConstruct %v2int %22685 %22685\n      %18349 = OpShiftLeftLogical %v2int %18202 %1959\n      %13335 = OpShiftRightArithmetic %v2int %18349 %2151\n      %10903 = OpConvertSToF %v2float %13335\n      %18247 = OpVectorTimesScalar %v2float %10903 %float_0_000976592302\n      %24070 = OpExtInst %v2float %1 FMax %73 %18247\n      %24330 = OpCompositeExtract %float %24070 0\n      %15572 = OpCompositeExtract %float %24070 1\n      %16670 = OpCompositeConstruct %v4float %24330 %15572 %float_0 %float_0\n      %19522 = OpCompositeExtract %uint %10943 1\n      %16033 = OpBitcast %int %19522\n      %18203 = OpCompositeConstruct %v2int %16033 %16033\n      %18350 = OpShiftLeftLogical %v2int %18203 %1959\n      %13336 = OpShiftRightArithmetic %v2int %18350 %2151\n      %10904 = OpConvertSToF %v2float %13336\n      %18248 = OpVectorTimesScalar %v2float %10904 %float_0_000976592302\n      %24071 = OpExtInst %v2float %1 FMax %73 %18248\n      %24331 = OpCompositeExtract %float %24071 0\n      %18764 = OpCompositeExtract %float %24071 1\n       %9034 = OpCompositeConstruct %v4float %24331 %18764 %float_0 %float_0\n               OpBranch %16224\n       %7354 = OpLabel\n      %22205 = OpCompositeExtract %uint %10943 0\n      %20234 = OpCompositeConstruct %v3uint %22205 %22205 %22205\n      %11021 = OpShiftRightLogical %v3uint %20234 %2996\n      %24038 = OpBitwiseAnd %v3uint %11021 %261\n      %18588 = OpBitwiseAnd %v3uint %11021 %1126\n      %23440 = OpShiftRightLogical %v3uint %24038 %2828\n      %16585 = OpIEqual %v3bool %23440 %2578\n      %11339 = OpExtInst %v3int %1 FindUMsb %18588\n      %10773 = OpBitcast %v3uint %11339\n       %6266 = OpISub %v3uint %2828 %10773\n       %8720 = OpIAdd %v3uint %10773 %2360\n      %10351 = OpSelect %v3uint %16585 %8720 %23440\n      %23252 = OpShiftLeftLogical %v3uint %18588 %6266\n      %18842 = OpBitwiseAnd %v3uint %23252 %1126\n      %10909 = OpSelect %v3uint %16585 %18842 %18588\n      %24569 = OpIAdd %v3uint %10351 %1018\n      %20351 = OpShiftLeftLogical %v3uint %24569 %393\n      %16294 = OpShiftLeftLogical %v3uint %10909 %141\n      %22396 = OpBitwiseOr %v3uint %20351 %16294\n      %13824 = OpIEqual %v3bool %24038 %2578\n      %16962 = OpSelect %v3uint %13824 %2578 %22396\n      %10703 = OpBitcast %v3float %16962\n      %19364 = OpShiftRightLogical %uint %22205 %uint_30\n      %18446 = OpConvertUToF %float %19364\n      %15903 = OpFMul %float %18446 %float_0_333333343\n      %21442 = OpCompositeExtract %float %10703 0\n      %10837 = OpCompositeExtract %float %10703 1\n       %7833 = OpCompositeExtract %float %10703 2\n      %15834 = OpCompositeConstruct %v4float %21442 %10837 %7833 %15903\n      %10229 = OpCompositeExtract %uint %10943 1\n      %13582 = OpCompositeConstruct %v3uint %10229 %10229 %10229\n      %11022 = OpShiftRightLogical %v3uint %13582 %2996\n      %24039 = OpBitwiseAnd %v3uint %11022 %261\n      %18589 = OpBitwiseAnd %v3uint %11022 %1126\n      %23441 = OpShiftRightLogical %v3uint %24039 %2828\n      %16586 = OpIEqual %v3bool %23441 %2578\n      %11340 = OpExtInst %v3int %1 FindUMsb %18589\n      %10774 = OpBitcast %v3uint %11340\n       %6267 = OpISub %v3uint %2828 %10774\n       %8721 = OpIAdd %v3uint %10774 %2360\n      %10352 = OpSelect %v3uint %16586 %8721 %23441\n      %23253 = OpShiftLeftLogical %v3uint %18589 %6267\n      %18843 = OpBitwiseAnd %v3uint %23253 %1126\n      %10910 = OpSelect %v3uint %16586 %18843 %18589\n      %24570 = OpIAdd %v3uint %10352 %1018\n      %20352 = OpShiftLeftLogical %v3uint %24570 %393\n      %16295 = OpShiftLeftLogical %v3uint %10910 %141\n      %22397 = OpBitwiseOr %v3uint %20352 %16295\n      %13825 = OpIEqual %v3bool %24039 %2578\n      %16963 = OpSelect %v3uint %13825 %2578 %22397\n      %10704 = OpBitcast %v3float %16963\n      %19365 = OpShiftRightLogical %uint %10229 %uint_30\n      %18447 = OpConvertUToF %float %19365\n      %15904 = OpFMul %float %18447 %float_0_333333343\n      %21443 = OpCompositeExtract %float %10704 0\n      %10838 = OpCompositeExtract %float %10704 1\n      %11025 = OpCompositeExtract %float %10704 2\n       %9035 = OpCompositeConstruct %v4float %21443 %10838 %11025 %15904\n               OpBranch %16224\n       %7355 = OpLabel\n      %22206 = OpCompositeExtract %uint %10943 0\n      %20235 = OpCompositeConstruct %v4uint %22206 %22206 %22206 %22206\n       %9368 = OpShiftRightLogical %v4uint %20235 %845\n      %18859 = OpBitwiseAnd %v4uint %9368 %635\n      %15543 = OpConvertUToF %v4float %18859\n      %16688 = OpFMul %v4float %15543 %2798\n      %23762 = OpCompositeExtract %uint %10943 1\n      %20813 = OpCompositeConstruct %v4uint %23762 %23762 %23762 %23762\n       %9369 = OpShiftRightLogical %v4uint %20813 %845\n      %18860 = OpBitwiseAnd %v4uint %9369 %635\n      %18735 = OpConvertUToF %v4float %18860\n       %9887 = OpFMul %v4float %18735 %2798\n               OpBranch %16224\n      %14585 = OpLabel\n      %22207 = OpCompositeExtract %uint %10943 0\n      %20236 = OpCompositeConstruct %v4uint %22207 %22207 %22207 %22207\n       %9370 = OpShiftRightLogical %v4uint %20236 %653\n      %19030 = OpBitwiseAnd %v4uint %9370 %1611\n      %13986 = OpConvertUToF %v4float %19030\n      %19235 = OpVectorTimesScalar %v4float %13986 %float_0_00392156886\n       %8607 = OpCompositeExtract %uint %10943 1\n      %24843 = OpCompositeConstruct %v4uint %8607 %8607 %8607 %8607\n       %9371 = OpShiftRightLogical %v4uint %24843 %653\n      %19031 = OpBitwiseAnd %v4uint %9371 %1611\n      %17178 = OpConvertUToF %v4float %19031\n      %12434 = OpVectorTimesScalar %v4float %17178 %float_0_00392156886\n               OpBranch %16224\n      %19451 = OpLabel\n      %12428 = OpCompositeExtract %uint %10943 0\n      %20462 = OpBitcast %float %12428\n      %17206 = OpCompositeConstruct %v2float %20462 %float_0\n      %11664 = OpVectorShuffle %v4float %17206 %17206 0 1 1 1\n      %22193 = OpCompositeExtract %uint %10943 1\n      %16232 = OpBitcast %float %22193\n      %20398 = OpCompositeConstruct %v2float %16232 %float_0\n      %23098 = OpVectorShuffle %v4float %20398 %20398 0 1 1 1\n               OpBranch %16224\n      %16224 = OpLabel\n      %11251 = OpPhi %v4float %23098 %19451 %12434 %14585 %9887 %7355 %9035 %7354 %9034 %8190 %9033 %8243\n      %13709 = OpPhi %v4float %11664 %19451 %19235 %14585 %16688 %7355 %15834 %7354 %16670 %8190 %14604 %8243\n               OpBranch %21263\n      %15205 = OpLabel\n      %21584 = OpIEqual %bool %6555 %uint_8\n               OpSelectionMerge %20298 DontFlatten\n               OpBranchConditional %21584 %6592 %8960\n       %8960 = OpLabel\n      %22065 = OpShiftRightLogical %uint %23531 %int_2\n      %13371 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22065\n      %12610 = OpLoad %uint %13371\n      %11688 = OpIAdd %uint %22065 %uint_1\n       %6399 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11688\n       %7030 = OpLoad %uint %6399\n       %8518 = OpIAdd %uint %23531 %6555\n      %21671 = OpShiftRightLogical %uint %8518 %int_2\n      %19601 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21671\n      %12611 = OpLoad %uint %19601\n      %11689 = OpIAdd %uint %21671 %uint_1\n      %24559 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11689\n      %16380 = OpLoad %uint %24559\n      %20782 = OpCompositeConstruct %v4uint %12610 %7030 %12611 %16380\n               OpBranch %20298\n       %6592 = OpLabel\n      %24487 = OpShiftRightLogical %uint %23531 %int_2\n      %13372 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24487\n      %12612 = OpLoad %uint %13372\n      %11690 = OpIAdd %uint %24487 %uint_1\n       %6400 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11690\n      %23650 = OpLoad %uint %6400\n      %11691 = OpIAdd %uint %24487 %uint_2\n       %6401 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11691\n      %23651 = OpLoad %uint %6401\n      %11692 = OpIAdd %uint %24487 %uint_3\n      %24560 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11692\n      %16381 = OpLoad %uint %24560\n      %20783 = OpCompositeConstruct %v4uint %12612 %23650 %23651 %16381\n               OpBranch %20298\n      %20298 = OpLabel\n      %10944 = OpPhi %v4uint %20783 %6592 %20782 %8960\n               OpSelectionMerge %20259 None\n               OpSwitch %8576 %20310 5 %8536 7 %8244\n       %8244 = OpLabel\n      %24407 = OpCompositeExtract %uint %10944 0\n      %24680 = OpExtInst %v2float %1 UnpackHalf2x16 %24407\n      %10101 = OpCompositeExtract %float %24680 0\n      %16056 = OpCompositeExtract %float %24680 1\n      %17025 = OpCompositeExtract %uint %10944 1\n      %15605 = OpExtInst %v2float %1 UnpackHalf2x16 %17025\n      %10084 = OpCompositeExtract %float %15605 0\n      %17479 = OpCompositeExtract %float %15605 1\n      %14605 = OpCompositeConstruct %v4float %10101 %16056 %10084 %17479\n      %17275 = OpCompositeExtract %uint %10944 2\n      %18028 = OpExtInst %v2float %1 UnpackHalf2x16 %17275\n      %10102 = OpCompositeExtract %float %18028 0\n      %16057 = OpCompositeExtract %float %18028 1\n      %17026 = OpCompositeExtract %uint %10944 3\n      %15606 = OpExtInst %v2float %1 UnpackHalf2x16 %17026\n      %10085 = OpCompositeExtract %float %15606 0\n      %20671 = OpCompositeExtract %float %15606 1\n       %9036 = OpCompositeConstruct %v4float %10102 %16057 %10085 %20671\n               OpBranch %20259\n       %8536 = OpLabel\n       %9723 = OpVectorShuffle %v2uint %10944 %10944 0 1\n      %23356 = OpBitcast %v2int %9723\n      %24782 = OpVectorShuffle %v4int %23356 %23356 0 0 1 1\n      %18598 = OpShiftLeftLogical %v4int %24782 %290\n      %15757 = OpShiftRightArithmetic %v4int %18598 %770\n      %10905 = OpConvertSToF %v4float %15757\n      %18209 = OpVectorTimesScalar %v4float %10905 %float_0_000976592302\n      %25233 = OpExtInst %v4float %1 FMax %1284 %18209\n      %14187 = OpVectorShuffle %v2uint %10944 %10944 2 3\n       %9407 = OpBitcast %v2int %14187\n      %24783 = OpVectorShuffle %v4int %9407 %9407 0 0 1 1\n      %18599 = OpShiftLeftLogical %v4int %24783 %290\n      %15758 = OpShiftRightArithmetic %v4int %18599 %770\n      %10906 = OpConvertSToF %v4float %15758\n      %21439 = OpVectorTimesScalar %v4float %10906 %float_0_000976592302\n      %17250 = OpExtInst %v4float %1 FMax %1284 %21439\n               OpBranch %20259\n      %20310 = OpLabel\n       %9761 = OpVectorShuffle %v2uint %10944 %10944 0 1\n      %20825 = OpBitcast %v2float %9761\n       %7035 = OpCompositeExtract %float %20825 0\n      %13418 = OpCompositeExtract %float %20825 1\n      %17016 = OpCompositeConstruct %v4float %7035 %13418 %float_0 %float_0\n      %16856 = OpVectorShuffle %v2uint %10944 %10944 2 3\n      %14173 = OpBitcast %v2float %16856\n       %7036 = OpCompositeExtract %float %14173 0\n      %16648 = OpCompositeExtract %float %14173 1\n       %9037 = OpCompositeConstruct %v4float %7036 %16648 %float_0 %float_0\n               OpBranch %20259\n      %20259 = OpLabel\n      %11252 = OpPhi %v4float %9037 %20310 %17250 %8536 %9036 %8244\n      %13710 = OpPhi %v4float %17016 %20310 %25233 %8536 %14605 %8244\n               OpBranch %21263\n      %21263 = OpLabel\n       %9826 = OpPhi %v4float %11252 %20259 %11251 %16224\n      %14051 = OpPhi %v4float %13710 %20259 %13709 %16224\n      %11861 = OpUGreaterThanEqual %bool %16205 %uint_4\n               OpSelectionMerge %21267 DontFlatten\n               OpBranchConditional %11861 %20709 %21267\n      %20709 = OpLabel\n      %25083 = OpFMul %float %11052 %float_0_5\n      %24184 = OpIAdd %uint %23531 %uint_320\n               OpSelectionMerge %21264 DontFlatten\n               OpBranchConditional %23279 %15206 %16570\n      %16570 = OpLabel\n      %19163 = OpIEqual %bool %6555 %uint_4\n               OpSelectionMerge %20299 DontFlatten\n               OpBranchConditional %19163 %6593 %8961\n       %8961 = OpLabel\n      %22066 = OpShiftRightLogical %uint %24184 %int_2\n      %13373 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22066\n      %15061 = OpLoad %uint %13373\n       %8519 = OpIAdd %uint %24184 %6555\n      %21672 = OpShiftRightLogical %uint %8519 %int_2\n      %18690 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21672\n      %24410 = OpLoad %uint %18690\n      %20784 = OpCompositeConstruct %v2uint %15061 %24410\n               OpBranch %20299\n       %6593 = OpLabel\n      %24488 = OpShiftRightLogical %uint %24184 %int_2\n      %13374 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24488\n      %12613 = OpLoad %uint %13374\n      %11693 = OpIAdd %uint %24488 %uint_1\n      %24561 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11693\n      %16382 = OpLoad %uint %24561\n      %20785 = OpCompositeConstruct %v2uint %12613 %16382\n               OpBranch %20299\n      %20299 = OpLabel\n      %10945 = OpPhi %v2uint %20785 %6593 %20784 %8961\n               OpSelectionMerge %16225 None\n               OpSwitch %8576 %19452 0 %14586 1 %14586 2 %7357 10 %7357 3 %7356 12 %7356 4 %8191 6 %8245\n       %8245 = OpLabel\n      %24408 = OpCompositeExtract %uint %10945 0\n      %24681 = OpExtInst %v2float %1 UnpackHalf2x16 %24408\n      %10086 = OpCompositeExtract %float %24681 0\n      %17480 = OpCompositeExtract %float %24681 1\n      %14606 = OpCompositeConstruct %v4float %10086 %17480 %float_0 %float_0\n      %17276 = OpCompositeExtract %uint %10945 1\n      %18029 = OpExtInst %v2float %1 UnpackHalf2x16 %17276\n      %10087 = OpCompositeExtract %float %18029 0\n      %20672 = OpCompositeExtract %float %18029 1\n       %9038 = OpCompositeConstruct %v4float %10087 %20672 %float_0 %float_0\n               OpBranch %16225\n       %8191 = OpLabel\n      %12429 = OpCompositeExtract %uint %10945 0\n      %22686 = OpBitcast %int %12429\n      %18204 = OpCompositeConstruct %v2int %22686 %22686\n      %18351 = OpShiftLeftLogical %v2int %18204 %1959\n      %13337 = OpShiftRightArithmetic %v2int %18351 %2151\n      %10907 = OpConvertSToF %v2float %13337\n      %18249 = OpVectorTimesScalar %v2float %10907 %float_0_000976592302\n      %24072 = OpExtInst %v2float %1 FMax %73 %18249\n      %24332 = OpCompositeExtract %float %24072 0\n      %15573 = OpCompositeExtract %float %24072 1\n      %16671 = OpCompositeConstruct %v4float %24332 %15573 %float_0 %float_0\n      %19523 = OpCompositeExtract %uint %10945 1\n      %16034 = OpBitcast %int %19523\n      %18205 = OpCompositeConstruct %v2int %16034 %16034\n      %18352 = OpShiftLeftLogical %v2int %18205 %1959\n      %13338 = OpShiftRightArithmetic %v2int %18352 %2151\n      %10908 = OpConvertSToF %v2float %13338\n      %18250 = OpVectorTimesScalar %v2float %10908 %float_0_000976592302\n      %24073 = OpExtInst %v2float %1 FMax %73 %18250\n      %24333 = OpCompositeExtract %float %24073 0\n      %18765 = OpCompositeExtract %float %24073 1\n       %9039 = OpCompositeConstruct %v4float %24333 %18765 %float_0 %float_0\n               OpBranch %16225\n       %7356 = OpLabel\n      %22208 = OpCompositeExtract %uint %10945 0\n      %20237 = OpCompositeConstruct %v3uint %22208 %22208 %22208\n      %11023 = OpShiftRightLogical %v3uint %20237 %2996\n      %24040 = OpBitwiseAnd %v3uint %11023 %261\n      %18590 = OpBitwiseAnd %v3uint %11023 %1126\n      %23442 = OpShiftRightLogical %v3uint %24040 %2828\n      %16587 = OpIEqual %v3bool %23442 %2578\n      %11341 = OpExtInst %v3int %1 FindUMsb %18590\n      %10775 = OpBitcast %v3uint %11341\n       %6268 = OpISub %v3uint %2828 %10775\n       %8722 = OpIAdd %v3uint %10775 %2360\n      %10353 = OpSelect %v3uint %16587 %8722 %23442\n      %23254 = OpShiftLeftLogical %v3uint %18590 %6268\n      %18844 = OpBitwiseAnd %v3uint %23254 %1126\n      %10911 = OpSelect %v3uint %16587 %18844 %18590\n      %24571 = OpIAdd %v3uint %10353 %1018\n      %20353 = OpShiftLeftLogical %v3uint %24571 %393\n      %16296 = OpShiftLeftLogical %v3uint %10911 %141\n      %22398 = OpBitwiseOr %v3uint %20353 %16296\n      %13826 = OpIEqual %v3bool %24040 %2578\n      %16964 = OpSelect %v3uint %13826 %2578 %22398\n      %10705 = OpBitcast %v3float %16964\n      %19366 = OpShiftRightLogical %uint %22208 %uint_30\n      %18448 = OpConvertUToF %float %19366\n      %15905 = OpFMul %float %18448 %float_0_333333343\n      %21444 = OpCompositeExtract %float %10705 0\n      %10839 = OpCompositeExtract %float %10705 1\n       %7834 = OpCompositeExtract %float %10705 2\n      %15835 = OpCompositeConstruct %v4float %21444 %10839 %7834 %15905\n      %10230 = OpCompositeExtract %uint %10945 1\n      %13583 = OpCompositeConstruct %v3uint %10230 %10230 %10230\n      %11024 = OpShiftRightLogical %v3uint %13583 %2996\n      %24041 = OpBitwiseAnd %v3uint %11024 %261\n      %18591 = OpBitwiseAnd %v3uint %11024 %1126\n      %23443 = OpShiftRightLogical %v3uint %24041 %2828\n      %16588 = OpIEqual %v3bool %23443 %2578\n      %11342 = OpExtInst %v3int %1 FindUMsb %18591\n      %10776 = OpBitcast %v3uint %11342\n       %6269 = OpISub %v3uint %2828 %10776\n       %8723 = OpIAdd %v3uint %10776 %2360\n      %10354 = OpSelect %v3uint %16588 %8723 %23443\n      %23255 = OpShiftLeftLogical %v3uint %18591 %6269\n      %18845 = OpBitwiseAnd %v3uint %23255 %1126\n      %10912 = OpSelect %v3uint %16588 %18845 %18591\n      %24572 = OpIAdd %v3uint %10354 %1018\n      %20354 = OpShiftLeftLogical %v3uint %24572 %393\n      %16297 = OpShiftLeftLogical %v3uint %10912 %141\n      %22399 = OpBitwiseOr %v3uint %20354 %16297\n      %13827 = OpIEqual %v3bool %24041 %2578\n      %16965 = OpSelect %v3uint %13827 %2578 %22399\n      %10706 = OpBitcast %v3float %16965\n      %19367 = OpShiftRightLogical %uint %10230 %uint_30\n      %18449 = OpConvertUToF %float %19367\n      %15906 = OpFMul %float %18449 %float_0_333333343\n      %21445 = OpCompositeExtract %float %10706 0\n      %10840 = OpCompositeExtract %float %10706 1\n      %11026 = OpCompositeExtract %float %10706 2\n       %9040 = OpCompositeConstruct %v4float %21445 %10840 %11026 %15906\n               OpBranch %16225\n       %7357 = OpLabel\n      %22209 = OpCompositeExtract %uint %10945 0\n      %20238 = OpCompositeConstruct %v4uint %22209 %22209 %22209 %22209\n       %9372 = OpShiftRightLogical %v4uint %20238 %845\n      %18861 = OpBitwiseAnd %v4uint %9372 %635\n      %15544 = OpConvertUToF %v4float %18861\n      %16689 = OpFMul %v4float %15544 %2798\n      %23763 = OpCompositeExtract %uint %10945 1\n      %20814 = OpCompositeConstruct %v4uint %23763 %23763 %23763 %23763\n       %9373 = OpShiftRightLogical %v4uint %20814 %845\n      %18862 = OpBitwiseAnd %v4uint %9373 %635\n      %18736 = OpConvertUToF %v4float %18862\n       %9888 = OpFMul %v4float %18736 %2798\n               OpBranch %16225\n      %14586 = OpLabel\n      %22210 = OpCompositeExtract %uint %10945 0\n      %20239 = OpCompositeConstruct %v4uint %22210 %22210 %22210 %22210\n       %9374 = OpShiftRightLogical %v4uint %20239 %653\n      %19032 = OpBitwiseAnd %v4uint %9374 %1611\n      %13987 = OpConvertUToF %v4float %19032\n      %19236 = OpVectorTimesScalar %v4float %13987 %float_0_00392156886\n       %8608 = OpCompositeExtract %uint %10945 1\n      %24844 = OpCompositeConstruct %v4uint %8608 %8608 %8608 %8608\n       %9375 = OpShiftRightLogical %v4uint %24844 %653\n      %19033 = OpBitwiseAnd %v4uint %9375 %1611\n      %17179 = OpConvertUToF %v4float %19033\n      %12435 = OpVectorTimesScalar %v4float %17179 %float_0_00392156886\n               OpBranch %16225\n      %19452 = OpLabel\n      %12430 = OpCompositeExtract %uint %10945 0\n      %20463 = OpBitcast %float %12430\n      %17207 = OpCompositeConstruct %v2float %20463 %float_0\n      %11665 = OpVectorShuffle %v4float %17207 %17207 0 1 1 1\n      %22194 = OpCompositeExtract %uint %10945 1\n      %16233 = OpBitcast %float %22194\n      %20399 = OpCompositeConstruct %v2float %16233 %float_0\n      %23099 = OpVectorShuffle %v4float %20399 %20399 0 1 1 1\n               OpBranch %16225\n      %16225 = OpLabel\n      %11253 = OpPhi %v4float %23099 %19452 %12435 %14586 %9888 %7357 %9040 %7356 %9039 %8191 %9038 %8245\n      %13712 = OpPhi %v4float %11665 %19452 %19236 %14586 %16689 %7357 %15835 %7356 %16671 %8191 %14606 %8245\n               OpBranch %21264\n      %15206 = OpLabel\n      %21585 = OpIEqual %bool %6555 %uint_8\n               OpSelectionMerge %20300 DontFlatten\n               OpBranchConditional %21585 %6594 %8962\n       %8962 = OpLabel\n      %22067 = OpShiftRightLogical %uint %24184 %int_2\n      %13375 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22067\n      %12614 = OpLoad %uint %13375\n      %11694 = OpIAdd %uint %22067 %uint_1\n       %6402 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11694\n       %7031 = OpLoad %uint %6402\n       %8520 = OpIAdd %uint %24184 %6555\n      %21673 = OpShiftRightLogical %uint %8520 %int_2\n      %19602 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21673\n      %12615 = OpLoad %uint %19602\n      %11695 = OpIAdd %uint %21673 %uint_1\n      %24562 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11695\n      %16383 = OpLoad %uint %24562\n      %20786 = OpCompositeConstruct %v4uint %12614 %7031 %12615 %16383\n               OpBranch %20300\n       %6594 = OpLabel\n      %24489 = OpShiftRightLogical %uint %24184 %int_2\n      %13376 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24489\n      %12616 = OpLoad %uint %13376\n      %11696 = OpIAdd %uint %24489 %uint_1\n       %6403 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11696\n      %23652 = OpLoad %uint %6403\n      %11697 = OpIAdd %uint %24489 %uint_2\n       %6404 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11697\n      %23653 = OpLoad %uint %6404\n      %11698 = OpIAdd %uint %24489 %uint_3\n      %24563 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11698\n      %16384 = OpLoad %uint %24563\n      %20787 = OpCompositeConstruct %v4uint %12616 %23652 %23653 %16384\n               OpBranch %20300\n      %20300 = OpLabel\n      %10946 = OpPhi %v4uint %20787 %6594 %20786 %8962\n               OpSelectionMerge %20260 None\n               OpSwitch %8576 %20311 5 %8537 7 %8246\n       %8246 = OpLabel\n      %24411 = OpCompositeExtract %uint %10946 0\n      %24682 = OpExtInst %v2float %1 UnpackHalf2x16 %24411\n      %10103 = OpCompositeExtract %float %24682 0\n      %16058 = OpCompositeExtract %float %24682 1\n      %17027 = OpCompositeExtract %uint %10946 1\n      %15607 = OpExtInst %v2float %1 UnpackHalf2x16 %17027\n      %10088 = OpCompositeExtract %float %15607 0\n      %17481 = OpCompositeExtract %float %15607 1\n      %14607 = OpCompositeConstruct %v4float %10103 %16058 %10088 %17481\n      %17277 = OpCompositeExtract %uint %10946 2\n      %18030 = OpExtInst %v2float %1 UnpackHalf2x16 %17277\n      %10104 = OpCompositeExtract %float %18030 0\n      %16059 = OpCompositeExtract %float %18030 1\n      %17028 = OpCompositeExtract %uint %10946 3\n      %15608 = OpExtInst %v2float %1 UnpackHalf2x16 %17028\n      %10089 = OpCompositeExtract %float %15608 0\n      %20673 = OpCompositeExtract %float %15608 1\n       %9041 = OpCompositeConstruct %v4float %10104 %16059 %10089 %20673\n               OpBranch %20260\n       %8537 = OpLabel\n       %9724 = OpVectorShuffle %v2uint %10946 %10946 0 1\n      %23357 = OpBitcast %v2int %9724\n      %24784 = OpVectorShuffle %v4int %23357 %23357 0 0 1 1\n      %18600 = OpShiftLeftLogical %v4int %24784 %290\n      %15759 = OpShiftRightArithmetic %v4int %18600 %770\n      %10913 = OpConvertSToF %v4float %15759\n      %18210 = OpVectorTimesScalar %v4float %10913 %float_0_000976592302\n      %25234 = OpExtInst %v4float %1 FMax %1284 %18210\n      %14188 = OpVectorShuffle %v2uint %10946 %10946 2 3\n       %9408 = OpBitcast %v2int %14188\n      %24785 = OpVectorShuffle %v4int %9408 %9408 0 0 1 1\n      %18601 = OpShiftLeftLogical %v4int %24785 %290\n      %15760 = OpShiftRightArithmetic %v4int %18601 %770\n      %10914 = OpConvertSToF %v4float %15760\n      %21440 = OpVectorTimesScalar %v4float %10914 %float_0_000976592302\n      %17251 = OpExtInst %v4float %1 FMax %1284 %21440\n               OpBranch %20260\n      %20311 = OpLabel\n       %9762 = OpVectorShuffle %v2uint %10946 %10946 0 1\n      %20826 = OpBitcast %v2float %9762\n       %7037 = OpCompositeExtract %float %20826 0\n      %13419 = OpCompositeExtract %float %20826 1\n      %17017 = OpCompositeConstruct %v4float %7037 %13419 %float_0 %float_0\n      %16857 = OpVectorShuffle %v2uint %10946 %10946 2 3\n      %14174 = OpBitcast %v2float %16857\n       %7038 = OpCompositeExtract %float %14174 0\n      %16649 = OpCompositeExtract %float %14174 1\n       %9042 = OpCompositeConstruct %v4float %7038 %16649 %float_0 %float_0\n               OpBranch %20260\n      %20260 = OpLabel\n      %11254 = OpPhi %v4float %9042 %20311 %17251 %8537 %9041 %8246\n      %13713 = OpPhi %v4float %17017 %20311 %25234 %8537 %14607 %8246\n               OpBranch %21264\n      %21264 = OpLabel\n       %8971 = OpPhi %v4float %11254 %20260 %11253 %16225\n      %19594 = OpPhi %v4float %13713 %20260 %13712 %16225\n      %18096 = OpFAdd %v4float %14051 %19594\n      %17754 = OpFAdd %v4float %9826 %8971\n      %14461 = OpUGreaterThanEqual %bool %16205 %uint_6\n               OpSelectionMerge %24264 DontFlatten\n               OpBranchConditional %14461 %9905 %24264\n       %9905 = OpLabel\n      %14258 = OpShiftLeftLogical %uint %uint_4 %9130\n      %12090 = OpFMul %float %11052 %float_0_25\n      %20988 = OpIAdd %uint %23531 %14258\n               OpSelectionMerge %21265 DontFlatten\n               OpBranchConditional %23279 %15207 %16571\n      %16571 = OpLabel\n      %19165 = OpIEqual %bool %6555 %uint_4\n               OpSelectionMerge %20301 DontFlatten\n               OpBranchConditional %19165 %6595 %8963\n       %8963 = OpLabel\n      %22068 = OpShiftRightLogical %uint %20988 %int_2\n      %13377 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22068\n      %15062 = OpLoad %uint %13377\n       %8521 = OpIAdd %uint %20988 %6555\n      %21674 = OpShiftRightLogical %uint %8521 %int_2\n      %18691 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21674\n      %24412 = OpLoad %uint %18691\n      %20788 = OpCompositeConstruct %v2uint %15062 %24412\n               OpBranch %20301\n       %6595 = OpLabel\n      %24490 = OpShiftRightLogical %uint %20988 %int_2\n      %13378 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24490\n      %12617 = OpLoad %uint %13378\n      %11699 = OpIAdd %uint %24490 %uint_1\n      %24564 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11699\n      %16385 = OpLoad %uint %24564\n      %20789 = OpCompositeConstruct %v2uint %12617 %16385\n               OpBranch %20301\n      %20301 = OpLabel\n      %10947 = OpPhi %v2uint %20789 %6595 %20788 %8963\n               OpSelectionMerge %16226 None\n               OpSwitch %8576 %19453 0 %14587 1 %14587 2 %7359 10 %7359 3 %7358 12 %7358 4 %8192 6 %8247\n       %8247 = OpLabel\n      %24413 = OpCompositeExtract %uint %10947 0\n      %24683 = OpExtInst %v2float %1 UnpackHalf2x16 %24413\n      %10090 = OpCompositeExtract %float %24683 0\n      %17482 = OpCompositeExtract %float %24683 1\n      %14608 = OpCompositeConstruct %v4float %10090 %17482 %float_0 %float_0\n      %17278 = OpCompositeExtract %uint %10947 1\n      %18031 = OpExtInst %v2float %1 UnpackHalf2x16 %17278\n      %10091 = OpCompositeExtract %float %18031 0\n      %20674 = OpCompositeExtract %float %18031 1\n       %9043 = OpCompositeConstruct %v4float %10091 %20674 %float_0 %float_0\n               OpBranch %16226\n       %8192 = OpLabel\n      %12431 = OpCompositeExtract %uint %10947 0\n      %22687 = OpBitcast %int %12431\n      %18206 = OpCompositeConstruct %v2int %22687 %22687\n      %18353 = OpShiftLeftLogical %v2int %18206 %1959\n      %13339 = OpShiftRightArithmetic %v2int %18353 %2151\n      %10915 = OpConvertSToF %v2float %13339\n      %18251 = OpVectorTimesScalar %v2float %10915 %float_0_000976592302\n      %24074 = OpExtInst %v2float %1 FMax %73 %18251\n      %24334 = OpCompositeExtract %float %24074 0\n      %15574 = OpCompositeExtract %float %24074 1\n      %16672 = OpCompositeConstruct %v4float %24334 %15574 %float_0 %float_0\n      %19524 = OpCompositeExtract %uint %10947 1\n      %16035 = OpBitcast %int %19524\n      %18207 = OpCompositeConstruct %v2int %16035 %16035\n      %18354 = OpShiftLeftLogical %v2int %18207 %1959\n      %13340 = OpShiftRightArithmetic %v2int %18354 %2151\n      %10916 = OpConvertSToF %v2float %13340\n      %18252 = OpVectorTimesScalar %v2float %10916 %float_0_000976592302\n      %24075 = OpExtInst %v2float %1 FMax %73 %18252\n      %24335 = OpCompositeExtract %float %24075 0\n      %18766 = OpCompositeExtract %float %24075 1\n       %9044 = OpCompositeConstruct %v4float %24335 %18766 %float_0 %float_0\n               OpBranch %16226\n       %7358 = OpLabel\n      %22211 = OpCompositeExtract %uint %10947 0\n      %20240 = OpCompositeConstruct %v3uint %22211 %22211 %22211\n      %11027 = OpShiftRightLogical %v3uint %20240 %2996\n      %24042 = OpBitwiseAnd %v3uint %11027 %261\n      %18592 = OpBitwiseAnd %v3uint %11027 %1126\n      %23444 = OpShiftRightLogical %v3uint %24042 %2828\n      %16589 = OpIEqual %v3bool %23444 %2578\n      %11343 = OpExtInst %v3int %1 FindUMsb %18592\n      %10777 = OpBitcast %v3uint %11343\n       %6270 = OpISub %v3uint %2828 %10777\n       %8724 = OpIAdd %v3uint %10777 %2360\n      %10355 = OpSelect %v3uint %16589 %8724 %23444\n      %23256 = OpShiftLeftLogical %v3uint %18592 %6270\n      %18846 = OpBitwiseAnd %v3uint %23256 %1126\n      %10917 = OpSelect %v3uint %16589 %18846 %18592\n      %24573 = OpIAdd %v3uint %10355 %1018\n      %20355 = OpShiftLeftLogical %v3uint %24573 %393\n      %16298 = OpShiftLeftLogical %v3uint %10917 %141\n      %22400 = OpBitwiseOr %v3uint %20355 %16298\n      %13828 = OpIEqual %v3bool %24042 %2578\n      %16966 = OpSelect %v3uint %13828 %2578 %22400\n      %10707 = OpBitcast %v3float %16966\n      %19368 = OpShiftRightLogical %uint %22211 %uint_30\n      %18450 = OpConvertUToF %float %19368\n      %15907 = OpFMul %float %18450 %float_0_333333343\n      %21446 = OpCompositeExtract %float %10707 0\n      %10841 = OpCompositeExtract %float %10707 1\n       %7835 = OpCompositeExtract %float %10707 2\n      %15836 = OpCompositeConstruct %v4float %21446 %10841 %7835 %15907\n      %10231 = OpCompositeExtract %uint %10947 1\n      %13584 = OpCompositeConstruct %v3uint %10231 %10231 %10231\n      %11028 = OpShiftRightLogical %v3uint %13584 %2996\n      %24043 = OpBitwiseAnd %v3uint %11028 %261\n      %18593 = OpBitwiseAnd %v3uint %11028 %1126\n      %23445 = OpShiftRightLogical %v3uint %24043 %2828\n      %16590 = OpIEqual %v3bool %23445 %2578\n      %11344 = OpExtInst %v3int %1 FindUMsb %18593\n      %10778 = OpBitcast %v3uint %11344\n       %6271 = OpISub %v3uint %2828 %10778\n       %8725 = OpIAdd %v3uint %10778 %2360\n      %10356 = OpSelect %v3uint %16590 %8725 %23445\n      %23257 = OpShiftLeftLogical %v3uint %18593 %6271\n      %18847 = OpBitwiseAnd %v3uint %23257 %1126\n      %10918 = OpSelect %v3uint %16590 %18847 %18593\n      %24574 = OpIAdd %v3uint %10356 %1018\n      %20356 = OpShiftLeftLogical %v3uint %24574 %393\n      %16299 = OpShiftLeftLogical %v3uint %10918 %141\n      %22401 = OpBitwiseOr %v3uint %20356 %16299\n      %13829 = OpIEqual %v3bool %24043 %2578\n      %16967 = OpSelect %v3uint %13829 %2578 %22401\n      %10708 = OpBitcast %v3float %16967\n      %19369 = OpShiftRightLogical %uint %10231 %uint_30\n      %18451 = OpConvertUToF %float %19369\n      %15908 = OpFMul %float %18451 %float_0_333333343\n      %21447 = OpCompositeExtract %float %10708 0\n      %10842 = OpCompositeExtract %float %10708 1\n      %11029 = OpCompositeExtract %float %10708 2\n       %9045 = OpCompositeConstruct %v4float %21447 %10842 %11029 %15908\n               OpBranch %16226\n       %7359 = OpLabel\n      %22212 = OpCompositeExtract %uint %10947 0\n      %20241 = OpCompositeConstruct %v4uint %22212 %22212 %22212 %22212\n       %9376 = OpShiftRightLogical %v4uint %20241 %845\n      %18863 = OpBitwiseAnd %v4uint %9376 %635\n      %15545 = OpConvertUToF %v4float %18863\n      %16690 = OpFMul %v4float %15545 %2798\n      %23764 = OpCompositeExtract %uint %10947 1\n      %20815 = OpCompositeConstruct %v4uint %23764 %23764 %23764 %23764\n       %9377 = OpShiftRightLogical %v4uint %20815 %845\n      %18864 = OpBitwiseAnd %v4uint %9377 %635\n      %18737 = OpConvertUToF %v4float %18864\n       %9889 = OpFMul %v4float %18737 %2798\n               OpBranch %16226\n      %14587 = OpLabel\n      %22213 = OpCompositeExtract %uint %10947 0\n      %20242 = OpCompositeConstruct %v4uint %22213 %22213 %22213 %22213\n       %9378 = OpShiftRightLogical %v4uint %20242 %653\n      %19034 = OpBitwiseAnd %v4uint %9378 %1611\n      %13988 = OpConvertUToF %v4float %19034\n      %19237 = OpVectorTimesScalar %v4float %13988 %float_0_00392156886\n       %8609 = OpCompositeExtract %uint %10947 1\n      %24845 = OpCompositeConstruct %v4uint %8609 %8609 %8609 %8609\n       %9379 = OpShiftRightLogical %v4uint %24845 %653\n      %19035 = OpBitwiseAnd %v4uint %9379 %1611\n      %17180 = OpConvertUToF %v4float %19035\n      %12436 = OpVectorTimesScalar %v4float %17180 %float_0_00392156886\n               OpBranch %16226\n      %19453 = OpLabel\n      %12432 = OpCompositeExtract %uint %10947 0\n      %20464 = OpBitcast %float %12432\n      %17208 = OpCompositeConstruct %v2float %20464 %float_0\n      %11666 = OpVectorShuffle %v4float %17208 %17208 0 1 1 1\n      %22195 = OpCompositeExtract %uint %10947 1\n      %16234 = OpBitcast %float %22195\n      %20400 = OpCompositeConstruct %v2float %16234 %float_0\n      %23100 = OpVectorShuffle %v4float %20400 %20400 0 1 1 1\n               OpBranch %16226\n      %16226 = OpLabel\n      %11255 = OpPhi %v4float %23100 %19453 %12436 %14587 %9889 %7359 %9045 %7358 %9044 %8192 %9043 %8247\n      %13714 = OpPhi %v4float %11666 %19453 %19237 %14587 %16690 %7359 %15836 %7358 %16672 %8192 %14608 %8247\n               OpBranch %21265\n      %15207 = OpLabel\n      %21586 = OpIEqual %bool %6555 %uint_8\n               OpSelectionMerge %20302 DontFlatten\n               OpBranchConditional %21586 %6596 %8964\n       %8964 = OpLabel\n      %22069 = OpShiftRightLogical %uint %20988 %int_2\n      %13379 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22069\n      %12618 = OpLoad %uint %13379\n      %11700 = OpIAdd %uint %22069 %uint_1\n       %6405 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11700\n       %7032 = OpLoad %uint %6405\n       %8522 = OpIAdd %uint %20988 %6555\n      %21675 = OpShiftRightLogical %uint %8522 %int_2\n      %19603 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21675\n      %12619 = OpLoad %uint %19603\n      %11701 = OpIAdd %uint %21675 %uint_1\n      %24565 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11701\n      %16386 = OpLoad %uint %24565\n      %20790 = OpCompositeConstruct %v4uint %12618 %7032 %12619 %16386\n               OpBranch %20302\n       %6596 = OpLabel\n      %24491 = OpShiftRightLogical %uint %20988 %int_2\n      %13380 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24491\n      %12620 = OpLoad %uint %13380\n      %11702 = OpIAdd %uint %24491 %uint_1\n       %6406 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11702\n      %23654 = OpLoad %uint %6406\n      %11703 = OpIAdd %uint %24491 %uint_2\n       %6407 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11703\n      %23655 = OpLoad %uint %6407\n      %11704 = OpIAdd %uint %24491 %uint_3\n      %24566 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11704\n      %16387 = OpLoad %uint %24566\n      %20791 = OpCompositeConstruct %v4uint %12620 %23654 %23655 %16387\n               OpBranch %20302\n      %20302 = OpLabel\n      %10948 = OpPhi %v4uint %20791 %6596 %20790 %8964\n               OpSelectionMerge %20261 None\n               OpSwitch %8576 %20312 5 %8538 7 %8248\n       %8248 = OpLabel\n      %24414 = OpCompositeExtract %uint %10948 0\n      %24684 = OpExtInst %v2float %1 UnpackHalf2x16 %24414\n      %10105 = OpCompositeExtract %float %24684 0\n      %16060 = OpCompositeExtract %float %24684 1\n      %17029 = OpCompositeExtract %uint %10948 1\n      %15609 = OpExtInst %v2float %1 UnpackHalf2x16 %17029\n      %10092 = OpCompositeExtract %float %15609 0\n      %17483 = OpCompositeExtract %float %15609 1\n      %14609 = OpCompositeConstruct %v4float %10105 %16060 %10092 %17483\n      %17279 = OpCompositeExtract %uint %10948 2\n      %18032 = OpExtInst %v2float %1 UnpackHalf2x16 %17279\n      %10106 = OpCompositeExtract %float %18032 0\n      %16061 = OpCompositeExtract %float %18032 1\n      %17030 = OpCompositeExtract %uint %10948 3\n      %15610 = OpExtInst %v2float %1 UnpackHalf2x16 %17030\n      %10093 = OpCompositeExtract %float %15610 0\n      %20675 = OpCompositeExtract %float %15610 1\n       %9046 = OpCompositeConstruct %v4float %10106 %16061 %10093 %20675\n               OpBranch %20261\n       %8538 = OpLabel\n       %9725 = OpVectorShuffle %v2uint %10948 %10948 0 1\n      %23358 = OpBitcast %v2int %9725\n      %24786 = OpVectorShuffle %v4int %23358 %23358 0 0 1 1\n      %18602 = OpShiftLeftLogical %v4int %24786 %290\n      %15761 = OpShiftRightArithmetic %v4int %18602 %770\n      %10919 = OpConvertSToF %v4float %15761\n      %18211 = OpVectorTimesScalar %v4float %10919 %float_0_000976592302\n      %25235 = OpExtInst %v4float %1 FMax %1284 %18211\n      %14189 = OpVectorShuffle %v2uint %10948 %10948 2 3\n       %9409 = OpBitcast %v2int %14189\n      %24787 = OpVectorShuffle %v4int %9409 %9409 0 0 1 1\n      %18603 = OpShiftLeftLogical %v4int %24787 %290\n      %15762 = OpShiftRightArithmetic %v4int %18603 %770\n      %10920 = OpConvertSToF %v4float %15762\n      %21441 = OpVectorTimesScalar %v4float %10920 %float_0_000976592302\n      %17252 = OpExtInst %v4float %1 FMax %1284 %21441\n               OpBranch %20261\n      %20312 = OpLabel\n       %9763 = OpVectorShuffle %v2uint %10948 %10948 0 1\n      %20827 = OpBitcast %v2float %9763\n       %7039 = OpCompositeExtract %float %20827 0\n      %13420 = OpCompositeExtract %float %20827 1\n      %17018 = OpCompositeConstruct %v4float %7039 %13420 %float_0 %float_0\n      %16858 = OpVectorShuffle %v2uint %10948 %10948 2 3\n      %14175 = OpBitcast %v2float %16858\n       %7040 = OpCompositeExtract %float %14175 0\n      %16650 = OpCompositeExtract %float %14175 1\n       %9047 = OpCompositeConstruct %v4float %7040 %16650 %float_0 %float_0\n               OpBranch %20261\n      %20261 = OpLabel\n      %11256 = OpPhi %v4float %9047 %20312 %17252 %8538 %9046 %8248\n      %13715 = OpPhi %v4float %17018 %20312 %25235 %8538 %14609 %8248\n               OpBranch %21265\n      %21265 = OpLabel\n       %8972 = OpPhi %v4float %11256 %20261 %11255 %16226\n      %19595 = OpPhi %v4float %13715 %20261 %13714 %16226\n      %17222 = OpFAdd %v4float %18096 %19595\n       %6641 = OpFAdd %v4float %17754 %8972\n      %16376 = OpIAdd %uint %24184 %14258\n               OpSelectionMerge %21266 DontFlatten\n               OpBranchConditional %23279 %15208 %16572\n      %16572 = OpLabel\n      %19166 = OpIEqual %bool %6555 %uint_4\n               OpSelectionMerge %20303 DontFlatten\n               OpBranchConditional %19166 %6597 %8965\n       %8965 = OpLabel\n      %22070 = OpShiftRightLogical %uint %16376 %int_2\n      %13381 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22070\n      %15063 = OpLoad %uint %13381\n       %8523 = OpIAdd %uint %16376 %6555\n      %21676 = OpShiftRightLogical %uint %8523 %int_2\n      %18692 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21676\n      %24415 = OpLoad %uint %18692\n      %20792 = OpCompositeConstruct %v2uint %15063 %24415\n               OpBranch %20303\n       %6597 = OpLabel\n      %24492 = OpShiftRightLogical %uint %16376 %int_2\n      %13382 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24492\n      %12621 = OpLoad %uint %13382\n      %11705 = OpIAdd %uint %24492 %uint_1\n      %24567 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11705\n      %16388 = OpLoad %uint %24567\n      %20793 = OpCompositeConstruct %v2uint %12621 %16388\n               OpBranch %20303\n      %20303 = OpLabel\n      %10949 = OpPhi %v2uint %20793 %6597 %20792 %8965\n               OpSelectionMerge %16227 None\n               OpSwitch %8576 %19454 0 %14588 1 %14588 2 %7361 10 %7361 3 %7360 12 %7360 4 %8193 6 %8249\n       %8249 = OpLabel\n      %24416 = OpCompositeExtract %uint %10949 0\n      %24685 = OpExtInst %v2float %1 UnpackHalf2x16 %24416\n      %10094 = OpCompositeExtract %float %24685 0\n      %17484 = OpCompositeExtract %float %24685 1\n      %14610 = OpCompositeConstruct %v4float %10094 %17484 %float_0 %float_0\n      %17280 = OpCompositeExtract %uint %10949 1\n      %18033 = OpExtInst %v2float %1 UnpackHalf2x16 %17280\n      %10095 = OpCompositeExtract %float %18033 0\n      %20676 = OpCompositeExtract %float %18033 1\n       %9048 = OpCompositeConstruct %v4float %10095 %20676 %float_0 %float_0\n               OpBranch %16227\n       %8193 = OpLabel\n      %12433 = OpCompositeExtract %uint %10949 0\n      %22688 = OpBitcast %int %12433\n      %18208 = OpCompositeConstruct %v2int %22688 %22688\n      %18355 = OpShiftLeftLogical %v2int %18208 %1959\n      %13341 = OpShiftRightArithmetic %v2int %18355 %2151\n      %10921 = OpConvertSToF %v2float %13341\n      %18253 = OpVectorTimesScalar %v2float %10921 %float_0_000976592302\n      %24076 = OpExtInst %v2float %1 FMax %73 %18253\n      %24336 = OpCompositeExtract %float %24076 0\n      %15575 = OpCompositeExtract %float %24076 1\n      %16673 = OpCompositeConstruct %v4float %24336 %15575 %float_0 %float_0\n      %19525 = OpCompositeExtract %uint %10949 1\n      %16036 = OpBitcast %int %19525\n      %18212 = OpCompositeConstruct %v2int %16036 %16036\n      %18356 = OpShiftLeftLogical %v2int %18212 %1959\n      %13342 = OpShiftRightArithmetic %v2int %18356 %2151\n      %10922 = OpConvertSToF %v2float %13342\n      %18254 = OpVectorTimesScalar %v2float %10922 %float_0_000976592302\n      %24077 = OpExtInst %v2float %1 FMax %73 %18254\n      %24337 = OpCompositeExtract %float %24077 0\n      %18767 = OpCompositeExtract %float %24077 1\n       %9049 = OpCompositeConstruct %v4float %24337 %18767 %float_0 %float_0\n               OpBranch %16227\n       %7360 = OpLabel\n      %22214 = OpCompositeExtract %uint %10949 0\n      %20243 = OpCompositeConstruct %v3uint %22214 %22214 %22214\n      %11030 = OpShiftRightLogical %v3uint %20243 %2996\n      %24044 = OpBitwiseAnd %v3uint %11030 %261\n      %18594 = OpBitwiseAnd %v3uint %11030 %1126\n      %23446 = OpShiftRightLogical %v3uint %24044 %2828\n      %16591 = OpIEqual %v3bool %23446 %2578\n      %11345 = OpExtInst %v3int %1 FindUMsb %18594\n      %10779 = OpBitcast %v3uint %11345\n       %6272 = OpISub %v3uint %2828 %10779\n       %8726 = OpIAdd %v3uint %10779 %2360\n      %10357 = OpSelect %v3uint %16591 %8726 %23446\n      %23258 = OpShiftLeftLogical %v3uint %18594 %6272\n      %18848 = OpBitwiseAnd %v3uint %23258 %1126\n      %10923 = OpSelect %v3uint %16591 %18848 %18594\n      %24575 = OpIAdd %v3uint %10357 %1018\n      %20357 = OpShiftLeftLogical %v3uint %24575 %393\n      %16300 = OpShiftLeftLogical %v3uint %10923 %141\n      %22402 = OpBitwiseOr %v3uint %20357 %16300\n      %13830 = OpIEqual %v3bool %24044 %2578\n      %16968 = OpSelect %v3uint %13830 %2578 %22402\n      %10709 = OpBitcast %v3float %16968\n      %19370 = OpShiftRightLogical %uint %22214 %uint_30\n      %18452 = OpConvertUToF %float %19370\n      %15909 = OpFMul %float %18452 %float_0_333333343\n      %21448 = OpCompositeExtract %float %10709 0\n      %10843 = OpCompositeExtract %float %10709 1\n       %7836 = OpCompositeExtract %float %10709 2\n      %15837 = OpCompositeConstruct %v4float %21448 %10843 %7836 %15909\n      %10232 = OpCompositeExtract %uint %10949 1\n      %13585 = OpCompositeConstruct %v3uint %10232 %10232 %10232\n      %11031 = OpShiftRightLogical %v3uint %13585 %2996\n      %24045 = OpBitwiseAnd %v3uint %11031 %261\n      %18595 = OpBitwiseAnd %v3uint %11031 %1126\n      %23447 = OpShiftRightLogical %v3uint %24045 %2828\n      %16592 = OpIEqual %v3bool %23447 %2578\n      %11346 = OpExtInst %v3int %1 FindUMsb %18595\n      %10780 = OpBitcast %v3uint %11346\n       %6273 = OpISub %v3uint %2828 %10780\n       %8727 = OpIAdd %v3uint %10780 %2360\n      %10358 = OpSelect %v3uint %16592 %8727 %23447\n      %23259 = OpShiftLeftLogical %v3uint %18595 %6273\n      %18849 = OpBitwiseAnd %v3uint %23259 %1126\n      %10924 = OpSelect %v3uint %16592 %18849 %18595\n      %24576 = OpIAdd %v3uint %10358 %1018\n      %20358 = OpShiftLeftLogical %v3uint %24576 %393\n      %16301 = OpShiftLeftLogical %v3uint %10924 %141\n      %22403 = OpBitwiseOr %v3uint %20358 %16301\n      %13831 = OpIEqual %v3bool %24045 %2578\n      %16969 = OpSelect %v3uint %13831 %2578 %22403\n      %10710 = OpBitcast %v3float %16969\n      %19371 = OpShiftRightLogical %uint %10232 %uint_30\n      %18453 = OpConvertUToF %float %19371\n      %15910 = OpFMul %float %18453 %float_0_333333343\n      %21449 = OpCompositeExtract %float %10710 0\n      %10844 = OpCompositeExtract %float %10710 1\n      %11032 = OpCompositeExtract %float %10710 2\n       %9050 = OpCompositeConstruct %v4float %21449 %10844 %11032 %15910\n               OpBranch %16227\n       %7361 = OpLabel\n      %22215 = OpCompositeExtract %uint %10949 0\n      %20244 = OpCompositeConstruct %v4uint %22215 %22215 %22215 %22215\n       %9380 = OpShiftRightLogical %v4uint %20244 %845\n      %18865 = OpBitwiseAnd %v4uint %9380 %635\n      %15546 = OpConvertUToF %v4float %18865\n      %16691 = OpFMul %v4float %15546 %2798\n      %23765 = OpCompositeExtract %uint %10949 1\n      %20816 = OpCompositeConstruct %v4uint %23765 %23765 %23765 %23765\n       %9381 = OpShiftRightLogical %v4uint %20816 %845\n      %18866 = OpBitwiseAnd %v4uint %9381 %635\n      %18738 = OpConvertUToF %v4float %18866\n       %9890 = OpFMul %v4float %18738 %2798\n               OpBranch %16227\n      %14588 = OpLabel\n      %22216 = OpCompositeExtract %uint %10949 0\n      %20245 = OpCompositeConstruct %v4uint %22216 %22216 %22216 %22216\n       %9382 = OpShiftRightLogical %v4uint %20245 %653\n      %19036 = OpBitwiseAnd %v4uint %9382 %1611\n      %13989 = OpConvertUToF %v4float %19036\n      %19238 = OpVectorTimesScalar %v4float %13989 %float_0_00392156886\n       %8610 = OpCompositeExtract %uint %10949 1\n      %24846 = OpCompositeConstruct %v4uint %8610 %8610 %8610 %8610\n       %9383 = OpShiftRightLogical %v4uint %24846 %653\n      %19037 = OpBitwiseAnd %v4uint %9383 %1611\n      %17181 = OpConvertUToF %v4float %19037\n      %12437 = OpVectorTimesScalar %v4float %17181 %float_0_00392156886\n               OpBranch %16227\n      %19454 = OpLabel\n      %12438 = OpCompositeExtract %uint %10949 0\n      %20465 = OpBitcast %float %12438\n      %17209 = OpCompositeConstruct %v2float %20465 %float_0\n      %11667 = OpVectorShuffle %v4float %17209 %17209 0 1 1 1\n      %22196 = OpCompositeExtract %uint %10949 1\n      %16235 = OpBitcast %float %22196\n      %20401 = OpCompositeConstruct %v2float %16235 %float_0\n      %23101 = OpVectorShuffle %v4float %20401 %20401 0 1 1 1\n               OpBranch %16227\n      %16227 = OpLabel\n      %11257 = OpPhi %v4float %23101 %19454 %12437 %14588 %9890 %7361 %9050 %7360 %9049 %8193 %9048 %8249\n      %13716 = OpPhi %v4float %11667 %19454 %19238 %14588 %16691 %7361 %15837 %7360 %16673 %8193 %14610 %8249\n               OpBranch %21266\n      %15208 = OpLabel\n      %21587 = OpIEqual %bool %6555 %uint_8\n               OpSelectionMerge %20304 DontFlatten\n               OpBranchConditional %21587 %6598 %8966\n       %8966 = OpLabel\n      %22071 = OpShiftRightLogical %uint %16376 %int_2\n      %13383 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22071\n      %12622 = OpLoad %uint %13383\n      %11706 = OpIAdd %uint %22071 %uint_1\n       %6408 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11706\n       %7033 = OpLoad %uint %6408\n       %8524 = OpIAdd %uint %16376 %6555\n      %21677 = OpShiftRightLogical %uint %8524 %int_2\n      %19604 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21677\n      %12623 = OpLoad %uint %19604\n      %11707 = OpIAdd %uint %21677 %uint_1\n      %24568 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11707\n      %16389 = OpLoad %uint %24568\n      %20794 = OpCompositeConstruct %v4uint %12622 %7033 %12623 %16389\n               OpBranch %20304\n       %6598 = OpLabel\n      %24493 = OpShiftRightLogical %uint %16376 %int_2\n      %13384 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24493\n      %12624 = OpLoad %uint %13384\n      %11708 = OpIAdd %uint %24493 %uint_1\n       %6409 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11708\n      %23656 = OpLoad %uint %6409\n      %11709 = OpIAdd %uint %24493 %uint_2\n       %6410 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11709\n      %23657 = OpLoad %uint %6410\n      %11710 = OpIAdd %uint %24493 %uint_3\n      %24577 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11710\n      %16390 = OpLoad %uint %24577\n      %20795 = OpCompositeConstruct %v4uint %12624 %23656 %23657 %16390\n               OpBranch %20304\n      %20304 = OpLabel\n      %10950 = OpPhi %v4uint %20795 %6598 %20794 %8966\n               OpSelectionMerge %20262 None\n               OpSwitch %8576 %20313 5 %8539 7 %8250\n       %8250 = OpLabel\n      %24417 = OpCompositeExtract %uint %10950 0\n      %24686 = OpExtInst %v2float %1 UnpackHalf2x16 %24417\n      %10107 = OpCompositeExtract %float %24686 0\n      %16062 = OpCompositeExtract %float %24686 1\n      %17031 = OpCompositeExtract %uint %10950 1\n      %15611 = OpExtInst %v2float %1 UnpackHalf2x16 %17031\n      %10096 = OpCompositeExtract %float %15611 0\n      %17485 = OpCompositeExtract %float %15611 1\n      %14611 = OpCompositeConstruct %v4float %10107 %16062 %10096 %17485\n      %17281 = OpCompositeExtract %uint %10950 2\n      %18034 = OpExtInst %v2float %1 UnpackHalf2x16 %17281\n      %10108 = OpCompositeExtract %float %18034 0\n      %16063 = OpCompositeExtract %float %18034 1\n      %17032 = OpCompositeExtract %uint %10950 3\n      %15612 = OpExtInst %v2float %1 UnpackHalf2x16 %17032\n      %10097 = OpCompositeExtract %float %15612 0\n      %20677 = OpCompositeExtract %float %15612 1\n       %9051 = OpCompositeConstruct %v4float %10108 %16063 %10097 %20677\n               OpBranch %20262\n       %8539 = OpLabel\n       %9726 = OpVectorShuffle %v2uint %10950 %10950 0 1\n      %23359 = OpBitcast %v2int %9726\n      %24788 = OpVectorShuffle %v4int %23359 %23359 0 0 1 1\n      %18604 = OpShiftLeftLogical %v4int %24788 %290\n      %15763 = OpShiftRightArithmetic %v4int %18604 %770\n      %10925 = OpConvertSToF %v4float %15763\n      %18213 = OpVectorTimesScalar %v4float %10925 %float_0_000976592302\n      %25236 = OpExtInst %v4float %1 FMax %1284 %18213\n      %14190 = OpVectorShuffle %v2uint %10950 %10950 2 3\n       %9410 = OpBitcast %v2int %14190\n      %24789 = OpVectorShuffle %v4int %9410 %9410 0 0 1 1\n      %18605 = OpShiftLeftLogical %v4int %24789 %290\n      %15764 = OpShiftRightArithmetic %v4int %18605 %770\n      %10926 = OpConvertSToF %v4float %15764\n      %21450 = OpVectorTimesScalar %v4float %10926 %float_0_000976592302\n      %17253 = OpExtInst %v4float %1 FMax %1284 %21450\n               OpBranch %20262\n      %20313 = OpLabel\n       %9764 = OpVectorShuffle %v2uint %10950 %10950 0 1\n      %20828 = OpBitcast %v2float %9764\n       %7041 = OpCompositeExtract %float %20828 0\n      %13421 = OpCompositeExtract %float %20828 1\n      %17019 = OpCompositeConstruct %v4float %7041 %13421 %float_0 %float_0\n      %16859 = OpVectorShuffle %v2uint %10950 %10950 2 3\n      %14176 = OpBitcast %v2float %16859\n       %7042 = OpCompositeExtract %float %14176 0\n      %16651 = OpCompositeExtract %float %14176 1\n       %9052 = OpCompositeConstruct %v4float %7042 %16651 %float_0 %float_0\n               OpBranch %20262\n      %20262 = OpLabel\n      %11258 = OpPhi %v4float %9052 %20313 %17253 %8539 %9051 %8250\n      %13717 = OpPhi %v4float %17019 %20313 %25236 %8539 %14611 %8250\n               OpBranch %21266\n      %21266 = OpLabel\n       %8973 = OpPhi %v4float %11258 %20262 %11257 %16227\n      %19596 = OpPhi %v4float %13717 %20262 %13716 %16227\n      %19521 = OpFAdd %v4float %17222 %19596\n      %23869 = OpFAdd %v4float %6641 %8973\n               OpBranch %24264\n      %24264 = OpLabel\n      %11175 = OpPhi %v4float %17754 %21264 %23869 %21266\n      %14420 = OpPhi %v4float %18096 %21264 %19521 %21266\n      %14518 = OpPhi %float %25083 %21264 %12090 %21266\n               OpBranch %21267\n      %21267 = OpLabel\n      %11176 = OpPhi %v4float %9826 %21263 %11175 %24264\n      %12387 = OpPhi %v4float %14051 %21263 %14420 %24264\n      %11944 = OpPhi %float %11052 %21263 %14518 %24264\n      %25151 = OpVectorTimesScalar %v4float %12387 %11944\n       %9562 = OpVectorTimesScalar %v4float %11176 %11944\n               OpSelectionMerge %16228 DontFlatten\n               OpBranchConditional %7475 %10049 %16228\n      %10049 = OpLabel\n      %18316 = OpVectorShuffle %v4float %25151 %25151 2 1 0 3\n      %20341 = OpVectorShuffle %v4float %9562 %9562 2 1 0 3\n               OpBranch %16228\n      %16228 = OpLabel\n       %8952 = OpPhi %v4float %9562 %21267 %20341 %10049\n      %22009 = OpPhi %v4float %25151 %21267 %18316 %10049\n       %7319 = OpIAdd %v2uint %12025 %23020\n               OpSelectionMerge %21237 DontFlatten\n               OpBranchConditional %20495 %10574 %21373\n      %21373 = OpLabel\n      %10608 = OpBitcast %v2int %7319\n      %17907 = OpCompositeExtract %int %10608 1\n      %19904 = OpShiftRightArithmetic %int %17907 %int_5\n      %22404 = OpBitcast %int %8444\n       %7938 = OpIMul %int %19904 %22404\n      %25154 = OpCompositeExtract %int %10608 0\n      %20423 = OpShiftRightArithmetic %int %25154 %int_5\n      %18867 = OpIAdd %int %7938 %20423\n       %9546 = OpShiftLeftLogical %int %18867 %int_6\n      %24635 = OpShiftRightArithmetic %int %17907 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25154 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17334 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17334 %uint_4\n      %12766 = OpShiftRightArithmetic %int %17907 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25154 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %17907 %int_3\n      %20574 = OpBitwiseAnd %int %10425 %int_1\n      %21533 = OpShiftLeftLogical %int %20574 %int_1\n       %8890 = OpBitwiseXor %int %20766 %21533\n      %20598 = OpBitwiseAnd %int %17907 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6551\n       %7092 = OpShiftLeftLogical %int %21575 %int_11\n      %16219 = OpBitwiseOr %int %18430 %7092\n      %14958 = OpShiftRightArithmetic %int %24163 %int_4\n       %6328 = OpBitwiseAnd %int %14958 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %16219 %21630\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6329 = OpBitwiseAnd %int %14959 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24163 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %21237\n      %10574 = OpLabel\n      %19866 = OpCompositeExtract %uint %7319 0\n      %11267 = OpCompositeExtract %uint %7319 1\n       %8414 = OpCompositeConstruct %v3uint %19866 %11267 %17416\n      %20125 = OpBitcast %v3int %8414\n      %11259 = OpCompositeExtract %int %20125 2\n      %19905 = OpShiftRightArithmetic %int %11259 %int_2\n      %22405 = OpBitcast %int %25203\n       %7939 = OpIMul %int %19905 %22405\n      %25155 = OpCompositeExtract %int %20125 1\n      %19055 = OpShiftRightArithmetic %int %25155 %int_4\n      %11053 = OpIAdd %int %7939 %19055\n      %16898 = OpBitcast %int %8444\n      %14944 = OpIMul %int %11053 %16898\n      %25156 = OpCompositeExtract %int %20125 0\n      %20424 = OpShiftRightArithmetic %int %25156 %int_5\n      %18940 = OpIAdd %int %14944 %20424\n       %8797 = OpShiftLeftLogical %int %18940 %int_7\n      %11434 = OpBitwiseAnd %int %11259 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %25155 %int_1\n      %21364 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21364 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %25156 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17335 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17335 %uint_4\n      %13015 = OpShiftRightArithmetic %int %25155 %int_3\n       %9929 = OpBitwiseXor %int %13015 %19905\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %25156 %int_3\n      %20575 = OpBitwiseAnd %int %9616 %int_3\n      %21534 = OpShiftLeftLogical %int %16793 %int_1\n       %8891 = OpBitwiseXor %int %20575 %21534\n      %20599 = OpBitwiseAnd %int %25155 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6552\n       %7093 = OpShiftLeftLogical %int %16793 %int_11\n      %16220 = OpBitwiseOr %int %18431 %7093\n      %14960 = OpShiftRightArithmetic %int %24144 %int_4\n       %6330 = OpBitwiseAnd %int %14960 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %16220 %21632\n      %14961 = OpShiftRightArithmetic %int %24144 %int_5\n       %6331 = OpBitwiseAnd %int %14961 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24144 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %21237\n      %21237 = OpLabel\n      %11376 = OpPhi %uint %16870 %10574 %16869 %21373\n      %19742 = OpIAdd %uint %11376 %25270\n       %7562 = OpShiftRightLogical %uint %19742 %int_4\n       %9007 = OpBitcast %v4uint %22009\n       %8174 = OpIEqual %bool %19164 %uint_5\n               OpSelectionMerge %14780 None\n               OpBranchConditional %8174 %13279 %14780\n      %13279 = OpLabel\n       %7958 = OpVectorShuffle %v4uint %9007 %9007 3 2 1 0\n               OpBranch %14780\n      %14780 = OpLabel\n      %22898 = OpPhi %v4uint %9007 %21237 %7958 %13279\n       %8068 = OpSelect %uint %8174 %uint_2 %19164\n      %20758 = OpIEqual %bool %8068 %uint_4\n               OpSelectionMerge %14781 None\n               OpBranchConditional %20758 %13280 %14781\n      %13280 = OpLabel\n       %7959 = OpVectorShuffle %v4uint %22898 %22898 1 0 3 2\n               OpBranch %14781\n      %14781 = OpLabel\n      %22899 = OpPhi %v4uint %22898 %14780 %7959 %13280\n       %6605 = OpSelect %uint %20758 %uint_2 %8068\n      %13412 = OpIEqual %bool %6605 %uint_1\n      %18370 = OpIEqual %bool %6605 %uint_2\n      %22150 = OpLogicalOr %bool %13412 %18370\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %22899 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %22899 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16377 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22650 = OpPhi %v4uint %22899 %14781 %16377 %10583\n      %19638 = OpIEqual %bool %6605 %uint_3\n      %15139 = OpLogicalOr %bool %18370 %19638\n               OpSelectionMerge %11416 None\n               OpBranchConditional %15139 %11064 %11416\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22650 %749\n      %15335 = OpShiftRightLogical %v4uint %22650 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %11416\n      %11416 = OpLabel\n      %19767 = OpPhi %v4uint %22650 %13411 %10728 %11064\n      %24825 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_dest %int_0 %7562\n               OpStore %24825 %19767\n       %9389 = OpIAdd %uint %19742 %uint_32\n      %19038 = OpShiftRightLogical %uint %9389 %int_4\n      %14814 = OpBitcast %v4uint %8952\n               OpSelectionMerge %16262 None\n               OpBranchConditional %8174 %13281 %16262\n      %13281 = OpLabel\n       %7960 = OpVectorShuffle %v4uint %14814 %14814 3 2 1 0\n               OpBranch %16262\n      %16262 = OpLabel\n      %10927 = OpPhi %v4uint %14814 %11416 %7960 %13281\n               OpSelectionMerge %16263 None\n               OpBranchConditional %20758 %13282 %16263\n      %13282 = OpLabel\n       %7961 = OpVectorShuffle %v4uint %10927 %10927 1 0 3 2\n               OpBranch %16263\n      %16263 = OpLabel\n      %10928 = OpPhi %v4uint %10927 %16262 %7961 %13282\n               OpSelectionMerge %14874 None\n               OpBranchConditional %22150 %10584 %14874\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %10928 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %10928 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16378 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %14874\n      %14874 = OpLabel\n      %10929 = OpPhi %v4uint %10928 %16263 %16378 %10584\n               OpSelectionMerge %11417 None\n               OpBranchConditional %15139 %11065 %11417\n      %11065 = OpLabel\n      %24088 = OpShiftLeftLogical %v4uint %10929 %749\n      %15336 = OpShiftRightLogical %v4uint %10929 %749\n      %10729 = OpBitwiseOr %v4uint %24088 %15336\n               OpBranch %11417\n      %11417 = OpLabel\n      %19768 = OpPhi %v4uint %10929 %14874 %10729 %11065\n       %8054 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_dest %int_0 %19038\n               OpStore %8054 %19768\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t resolve_full_128bpp_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x000062B7, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000008, 0x00000008, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x0000040B, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x00090006, 0x0000040B, 0x00000000, 0x725F6578,\n    0x6C6F7365, 0x655F6576, 0x6D617264, 0x666E695F, 0x0000006F, 0x000A0006,\n    0x0000040B, 0x00000001, 0x725F6578, 0x6C6F7365, 0x635F6576, 0x64726F6F,\n    0x74616E69, 0x6E695F65, 0x00006F66, 0x00090006, 0x0000040B, 0x00000002,\n    0x725F6578, 0x6C6F7365, 0x645F6576, 0x5F747365, 0x6F666E69, 0x00000000,\n    0x000B0006, 0x0000040B, 0x00000003, 0x725F6578, 0x6C6F7365, 0x645F6576,\n    0x5F747365, 0x726F6F63, 0x616E6964, 0x695F6574, 0x006F666E, 0x00090006,\n    0x0000040B, 0x00000004, 0x725F6578, 0x6C6F7365, 0x645F6576, 0x5F747365,\n    0x65736162, 0x00000000, 0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F,\n    0x5F737473, 0x00006578, 0x00090005, 0x0000079C, 0x725F6578, 0x6C6F7365,\n    0x655F6576, 0x6D617264, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x0000079C, 0x00000000, 0x61746164, 0x00000000, 0x00070005, 0x00000CC7,\n    0x725F6578, 0x6C6F7365, 0x655F6576, 0x6D617264, 0x00000000, 0x00080005,\n    0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F, 0x496E6F69,\n    0x00000044, 0x00090005, 0x000007B4, 0x725F6578, 0x6C6F7365, 0x645F6576,\n    0x5F747365, 0x625F6578, 0x6B636F6C, 0x00000000, 0x00050006, 0x000007B4,\n    0x00000000, 0x61746164, 0x00000000, 0x00060005, 0x00001592, 0x725F6578,\n    0x6C6F7365, 0x645F6576, 0x00747365, 0x00030047, 0x0000040B, 0x00000002,\n    0x00050048, 0x0000040B, 0x00000000, 0x00000023, 0x00000000, 0x00050048,\n    0x0000040B, 0x00000001, 0x00000023, 0x00000004, 0x00050048, 0x0000040B,\n    0x00000002, 0x00000023, 0x00000008, 0x00050048, 0x0000040B, 0x00000003,\n    0x00000023, 0x0000000C, 0x00050048, 0x0000040B, 0x00000004, 0x00000023,\n    0x00000010, 0x00040047, 0x000007D0, 0x00000006, 0x00000004, 0x00030047,\n    0x0000079C, 0x00000003, 0x00040048, 0x0000079C, 0x00000000, 0x00000018,\n    0x00050048, 0x0000079C, 0x00000000, 0x00000023, 0x00000000, 0x00030047,\n    0x00000CC7, 0x00000018, 0x00040047, 0x00000CC7, 0x00000021, 0x00000000,\n    0x00040047, 0x00000CC7, 0x00000022, 0x00000000, 0x00040047, 0x00000F48,\n    0x0000000B, 0x0000001C, 0x00040047, 0x000007DC, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B4, 0x00000003, 0x00040048, 0x000007B4, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B4, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x00001592, 0x00000019, 0x00040047, 0x00001592, 0x00000021,\n    0x00000000, 0x00040047, 0x00001592, 0x00000022, 0x00000001, 0x00040047,\n    0x00000AC7, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000C, 0x00000020, 0x00000001,\n    0x00040017, 0x00000012, 0x0000000C, 0x00000002, 0x00040015, 0x0000000B,\n    0x00000020, 0x00000000, 0x00040017, 0x00000011, 0x0000000B, 0x00000002,\n    0x00040017, 0x00000014, 0x0000000B, 0x00000003, 0x00040017, 0x00000017,\n    0x0000000B, 0x00000004, 0x00030016, 0x0000000D, 0x00000020, 0x00040017,\n    0x00000013, 0x0000000D, 0x00000002, 0x00040017, 0x0000001D, 0x0000000D,\n    0x00000004, 0x00020014, 0x00000009, 0x00040017, 0x00000016, 0x0000000C,\n    0x00000003, 0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001, 0x0004002B,\n    0x0000000B, 0x00000A10, 0x00000002, 0x0004002B, 0x0000000B, 0x000008A6,\n    0x00FF00FF, 0x0004002B, 0x0000000B, 0x00000A22, 0x00000008, 0x0004002B,\n    0x0000000B, 0x000005FD, 0xFF00FF00, 0x0004002B, 0x0000000B, 0x00000A13,\n    0x00000003, 0x0004002B, 0x0000000B, 0x00000A3A, 0x00000010, 0x0004002B,\n    0x0000000B, 0x00000A16, 0x00000004, 0x0004002B, 0x0000000B, 0x00000A19,\n    0x00000005, 0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000, 0x0004002B,\n    0x0000000B, 0x00000A52, 0x00000018, 0x0007002C, 0x00000017, 0x0000028D,\n    0x00000A0A, 0x00000A22, 0x00000A3A, 0x00000A52, 0x0004002B, 0x0000000B,\n    0x00000144, 0x000000FF, 0x0004002B, 0x0000000D, 0x0000017A, 0x3B808081,\n    0x0004002B, 0x0000000B, 0x00000A28, 0x0000000A, 0x0004002B, 0x0000000B,\n    0x00000A46, 0x00000014, 0x0004002B, 0x0000000B, 0x00000A64, 0x0000001E,\n    0x0007002C, 0x00000017, 0x0000034D, 0x00000A0A, 0x00000A28, 0x00000A46,\n    0x00000A64, 0x0004002B, 0x0000000B, 0x00000A44, 0x000003FF, 0x0007002C,\n    0x00000017, 0x0000027B, 0x00000A44, 0x00000A44, 0x00000A44, 0x00000A13,\n    0x0004002B, 0x0000000D, 0x000006FE, 0x3A802008, 0x0004002B, 0x0000000D,\n    0x00000149, 0x3EAAAAAB, 0x0007002C, 0x0000001D, 0x00000AEE, 0x000006FE,\n    0x000006FE, 0x000006FE, 0x00000149, 0x0006002C, 0x00000014, 0x00000BB4,\n    0x00000A0A, 0x00000A28, 0x00000A46, 0x0004002B, 0x0000000B, 0x00000B87,\n    0x0000007F, 0x0004002B, 0x0000000B, 0x00000A1F, 0x00000007, 0x00040017,\n    0x00000010, 0x00000009, 0x00000003, 0x0004002B, 0x0000000B, 0x00000B7E,\n    0x0000007C, 0x0004002B, 0x0000000B, 0x00000A4F, 0x00000017, 0x00040017,\n    0x00000018, 0x0000000D, 0x00000003, 0x0004002B, 0x0000000D, 0x00000341,\n    0xBF800000, 0x0004002B, 0x0000000C, 0x00000A3B, 0x00000010, 0x0004002B,\n    0x0000000C, 0x00000A0B, 0x00000000, 0x0005002C, 0x00000012, 0x000007A7,\n    0x00000A3B, 0x00000A0B, 0x0004002B, 0x0000000D, 0x000007FE, 0x3A800100,\n    0x00040017, 0x0000001A, 0x0000000C, 0x00000004, 0x0007002C, 0x0000001A,\n    0x00000122, 0x00000A3B, 0x00000A0B, 0x00000A3B, 0x00000A0B, 0x0005002C,\n    0x00000011, 0x0000072D, 0x00000A10, 0x00000A0D, 0x00040017, 0x0000000F,\n    0x00000009, 0x00000002, 0x0005002C, 0x00000011, 0x0000070F, 0x00000A0A,\n    0x00000A0A, 0x0005002C, 0x00000011, 0x00000724, 0x00000A0D, 0x00000A0D,\n    0x0005002C, 0x00000011, 0x00000718, 0x00000A0D, 0x00000A0A, 0x0004002B,\n    0x0000000B, 0x00000AFA, 0x00000050, 0x0005002C, 0x00000011, 0x00000A9F,\n    0x00000AFA, 0x00000A3A, 0x0004002B, 0x0000000C, 0x00000A11, 0x00000002,\n    0x0004002B, 0x0000000C, 0x00000A17, 0x00000004, 0x0004002B, 0x0000000C,\n    0x00000A1D, 0x00000006, 0x0004002B, 0x0000000C, 0x00000A2C, 0x0000000B,\n    0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C,\n    0x00000A1A, 0x00000005, 0x0004002B, 0x0000000C, 0x00000A20, 0x00000007,\n    0x0004002B, 0x0000000C, 0x00000A23, 0x00000008, 0x0004002B, 0x0000000C,\n    0x00000A2F, 0x0000000C, 0x0004002B, 0x0000000C, 0x00000A14, 0x00000003,\n    0x0007001E, 0x0000040B, 0x0000000B, 0x0000000B, 0x0000000B, 0x0000000B,\n    0x0000000B, 0x00040020, 0x00000688, 0x00000009, 0x0000040B, 0x0004003B,\n    0x00000688, 0x00000CE9, 0x00000009, 0x00040020, 0x00000288, 0x00000009,\n    0x0000000B, 0x0004002B, 0x0000000B, 0x00000A31, 0x0000000D, 0x0004002B,\n    0x0000000B, 0x00000A81, 0x000007FF, 0x0004002B, 0x0000000B, 0x00000A37,\n    0x0000000F, 0x0004002B, 0x0000000B, 0x00000A5E, 0x0000001C, 0x0005002C,\n    0x00000011, 0x0000073F, 0x00000A0A, 0x00000A16, 0x0004002B, 0x0000000C,\n    0x00000A29, 0x0000000A, 0x0004002B, 0x0000000C, 0x00000A59, 0x0000001A,\n    0x0004002B, 0x0000000C, 0x00000A50, 0x00000017, 0x0004002B, 0x0000000B,\n    0x00000926, 0x01000000, 0x0005002C, 0x00000011, 0x000008E3, 0x00000A46,\n    0x00000A52, 0x0004002B, 0x0000000D, 0x00000A0C, 0x00000000, 0x0003001D,\n    0x000007D0, 0x0000000B, 0x0003001E, 0x0000079C, 0x000007D0, 0x00040020,\n    0x00000A1B, 0x00000002, 0x0000079C, 0x0004003B, 0x00000A1B, 0x00000CC7,\n    0x00000002, 0x00040020, 0x00000289, 0x00000002, 0x0000000B, 0x0004002B,\n    0x0000000B, 0x00000207, 0x00000140, 0x0004002B, 0x0000000D, 0x000000FC,\n    0x3F000000, 0x0004002B, 0x0000000B, 0x00000A1C, 0x00000006, 0x00040020,\n    0x00000291, 0x00000001, 0x00000014, 0x0004003B, 0x00000291, 0x00000F48,\n    0x00000001, 0x0003001D, 0x000007DC, 0x00000017, 0x0003001E, 0x000007B4,\n    0x000007DC, 0x00040020, 0x00000A32, 0x00000002, 0x000007B4, 0x0004003B,\n    0x00000A32, 0x00001592, 0x00000002, 0x00040020, 0x00000294, 0x00000002,\n    0x00000017, 0x0006002C, 0x00000014, 0x00000AC7, 0x00000A22, 0x00000A22,\n    0x00000A0D, 0x0005002C, 0x00000011, 0x000007A2, 0x00000A37, 0x00000A0D,\n    0x0005002C, 0x00000011, 0x0000074E, 0x00000A13, 0x00000A13, 0x0005002C,\n    0x00000011, 0x0000084A, 0x00000A37, 0x00000A37, 0x0007002C, 0x0000001D,\n    0x00000504, 0x00000341, 0x00000341, 0x00000341, 0x00000341, 0x0007002C,\n    0x0000001A, 0x00000302, 0x00000A3B, 0x00000A3B, 0x00000A3B, 0x00000A3B,\n    0x0007002C, 0x00000017, 0x0000064B, 0x00000144, 0x00000144, 0x00000144,\n    0x00000144, 0x0006002C, 0x00000014, 0x00000105, 0x00000A44, 0x00000A44,\n    0x00000A44, 0x0006002C, 0x00000014, 0x00000466, 0x00000B87, 0x00000B87,\n    0x00000B87, 0x0006002C, 0x00000014, 0x00000B0C, 0x00000A1F, 0x00000A1F,\n    0x00000A1F, 0x0006002C, 0x00000014, 0x00000A12, 0x00000A0A, 0x00000A0A,\n    0x00000A0A, 0x0006002C, 0x00000014, 0x000003FA, 0x00000B7E, 0x00000B7E,\n    0x00000B7E, 0x0006002C, 0x00000014, 0x00000189, 0x00000A4F, 0x00000A4F,\n    0x00000A4F, 0x0006002C, 0x00000014, 0x0000008D, 0x00000A3A, 0x00000A3A,\n    0x00000A3A, 0x0005002C, 0x00000013, 0x00000049, 0x00000341, 0x00000341,\n    0x0005002C, 0x00000012, 0x00000867, 0x00000A3B, 0x00000A3B, 0x0007002C,\n    0x00000017, 0x000009CE, 0x000008A6, 0x000008A6, 0x000008A6, 0x000008A6,\n    0x0007002C, 0x00000017, 0x0000013D, 0x00000A22, 0x00000A22, 0x00000A22,\n    0x00000A22, 0x0007002C, 0x00000017, 0x0000072E, 0x000005FD, 0x000005FD,\n    0x000005FD, 0x000005FD, 0x0007002C, 0x00000017, 0x000002ED, 0x00000A3A,\n    0x00000A3A, 0x00000A3A, 0x00000A3A, 0x0004002B, 0x0000000C, 0x00000089,\n    0x3F800000, 0x0004002B, 0x0000000B, 0x00000184, 0x00000500, 0x0004002B,\n    0x0000000B, 0x0000086E, 0x00280000, 0x0004002B, 0x0000000B, 0x000009F8,\n    0xFFFFFFFA, 0x0006002C, 0x00000014, 0x00000938, 0x000009F8, 0x000009F8,\n    0x000009F8, 0x0004002B, 0x0000000D, 0x0000016E, 0x3E800000, 0x0004002B,\n    0x0000000B, 0x00000A6A, 0x00000020, 0x00050036, 0x00000008, 0x0000161F,\n    0x00000000, 0x00000502, 0x000200F8, 0x00003B06, 0x000300F7, 0x00004C7A,\n    0x00000000, 0x000300FB, 0x00000A0A, 0x00002E68, 0x000200F8, 0x00002E68,\n    0x00050041, 0x00000288, 0x000056E5, 0x00000CE9, 0x00000A0B, 0x0004003D,\n    0x0000000B, 0x00003D0B, 0x000056E5, 0x00050041, 0x00000288, 0x000058AC,\n    0x00000CE9, 0x00000A0E, 0x0004003D, 0x0000000B, 0x00005158, 0x000058AC,\n    0x000500C7, 0x0000000B, 0x00005051, 0x00003D0B, 0x00000A44, 0x000500C2,\n    0x0000000B, 0x00004E0A, 0x00003D0B, 0x00000A28, 0x000500C7, 0x0000000B,\n    0x0000217E, 0x00004E0A, 0x00000A13, 0x000500C2, 0x0000000B, 0x0000520A,\n    0x00003D0B, 0x00000A31, 0x000500C7, 0x0000000B, 0x0000217F, 0x0000520A,\n    0x00000A81, 0x000500C2, 0x0000000B, 0x0000520B, 0x00003D0B, 0x00000A52,\n    0x000500C7, 0x0000000B, 0x00002180, 0x0000520B, 0x00000A37, 0x000500C2,\n    0x0000000B, 0x00004994, 0x00003D0B, 0x00000A5E, 0x000500C7, 0x0000000B,\n    0x000023AA, 0x00004994, 0x00000A0D, 0x00050050, 0x00000011, 0x000022A7,\n    0x00005158, 0x00005158, 0x000500C2, 0x00000011, 0x00002568, 0x000022A7,\n    0x0000073F, 0x000500C7, 0x00000011, 0x00005B53, 0x00002568, 0x000007A2,\n    0x000500C4, 0x00000011, 0x00003F4F, 0x00005B53, 0x0000074E, 0x00050084,\n    0x00000011, 0x000059EB, 0x00003F4F, 0x00000724, 0x000500C2, 0x0000000B,\n    0x00003213, 0x00005158, 0x00000A19, 0x000500C7, 0x0000000B, 0x00003F4C,\n    0x00003213, 0x00000A81, 0x00050041, 0x00000288, 0x0000492C, 0x00000CE9,\n    0x00000A11, 0x0004003D, 0x0000000B, 0x00005EAC, 0x0000492C, 0x00050041,\n    0x00000288, 0x000058AD, 0x00000CE9, 0x00000A14, 0x0004003D, 0x0000000B,\n    0x000051B7, 0x000058AD, 0x000500C7, 0x0000000B, 0x00004ADC, 0x00005EAC,\n    0x00000A1F, 0x000500C7, 0x0000000B, 0x000055EF, 0x00005EAC, 0x00000A22,\n    0x000500AB, 0x00000009, 0x0000500F, 0x000055EF, 0x00000A0A, 0x000500C2,\n    0x0000000B, 0x00002311, 0x00005EAC, 0x00000A16, 0x000500C7, 0x0000000B,\n    0x00004408, 0x00002311, 0x00000A1F, 0x0004007C, 0x0000000C, 0x00005988,\n    0x00005EAC, 0x000500C4, 0x0000000C, 0x0000358F, 0x00005988, 0x00000A29,\n    0x000500C3, 0x0000000C, 0x0000509C, 0x0000358F, 0x00000A59, 0x000500C4,\n    0x0000000C, 0x00004702, 0x0000509C, 0x00000A50, 0x00050080, 0x0000000C,\n    0x00001D26, 0x00004702, 0x00000089, 0x0004007C, 0x0000000D, 0x00002B2C,\n    0x00001D26, 0x000500C7, 0x0000000B, 0x00005879, 0x00005EAC, 0x00000926,\n    0x000500AB, 0x00000009, 0x00001D33, 0x00005879, 0x00000A0A, 0x000500C7,\n    0x0000000B, 0x000020FC, 0x000051B7, 0x00000A44, 0x000500C2, 0x0000000B,\n    0x00002F90, 0x000051B7, 0x00000A28, 0x000500C7, 0x0000000B, 0x000061CE,\n    0x00002F90, 0x00000A44, 0x000500C4, 0x0000000B, 0x00006273, 0x000061CE,\n    0x00000A0E, 0x00050050, 0x00000011, 0x000028B6, 0x000051B7, 0x000051B7,\n    0x000500C2, 0x00000011, 0x00002891, 0x000028B6, 0x000008E3, 0x000500C7,\n    0x00000011, 0x00005B54, 0x00002891, 0x0000084A, 0x000500C4, 0x00000011,\n    0x00003F50, 0x00005B54, 0x0000074E, 0x00050084, 0x00000011, 0x000059EC,\n    0x00003F50, 0x00000724, 0x000500C2, 0x0000000B, 0x00003214, 0x000051B7,\n    0x00000A5E, 0x000500C7, 0x0000000B, 0x00003F4D, 0x00003214, 0x00000A1F,\n    0x00050041, 0x00000288, 0x000048E0, 0x00000CE9, 0x00000A17, 0x0004003D,\n    0x0000000B, 0x000062B6, 0x000048E0, 0x0004003D, 0x00000014, 0x0000374F,\n    0x00000F48, 0x0007004F, 0x00000011, 0x00003180, 0x0000374F, 0x0000374F,\n    0x00000000, 0x00000001, 0x000500C4, 0x00000011, 0x00002EF9, 0x00003180,\n    0x00000718, 0x00050051, 0x0000000B, 0x00001DD8, 0x00002EF9, 0x00000000,\n    0x000500C4, 0x0000000B, 0x00002D8A, 0x00003F4C, 0x00000A13, 0x000500AE,\n    0x00000009, 0x00003C13, 0x00001DD8, 0x00002D8A, 0x000300F7, 0x0000505A,\n    0x00000002, 0x000400FA, 0x00003C13, 0x000055E8, 0x0000505A, 0x000200F8,\n    0x000055E8, 0x000200F9, 0x00004C7A, 0x000200F8, 0x0000505A, 0x0007000C,\n    0x0000000B, 0x00003BA0, 0x00000001, 0x00000029, 0x00001DD8, 0x00000A0A,\n    0x00050051, 0x0000000B, 0x000023B6, 0x00002EF9, 0x00000001, 0x0007000C,\n    0x0000000B, 0x00004145, 0x00000001, 0x00000029, 0x000023B6, 0x00000A0A,\n    0x00050050, 0x00000011, 0x000051EF, 0x00003BA0, 0x00004145, 0x00050080,\n    0x00000011, 0x0000522C, 0x000051EF, 0x000059EB, 0x000500B2, 0x00000009,\n    0x00003ECB, 0x00003F4D, 0x00000A13, 0x000300F7, 0x00005CE0, 0x00000000,\n    0x000400FA, 0x00003ECB, 0x00002AEE, 0x00003AEF, 0x000200F8, 0x00003AEF,\n    0x000500AA, 0x00000009, 0x000034FE, 0x00003F4D, 0x00000A19, 0x000600A9,\n    0x0000000B, 0x000020F6, 0x000034FE, 0x00000A10, 0x00000A0A, 0x000200F9,\n    0x00005CE0, 0x000200F8, 0x00002AEE, 0x000200F9, 0x00005CE0, 0x000200F8,\n    0x00005CE0, 0x000700F5, 0x0000000B, 0x00004B64, 0x00003F4D, 0x00002AEE,\n    0x000020F6, 0x00003AEF, 0x00050050, 0x00000011, 0x000041BE, 0x0000217E,\n    0x0000217E, 0x000500AE, 0x0000000F, 0x00002E19, 0x000041BE, 0x0000072D,\n    0x000600A9, 0x00000011, 0x00004BB5, 0x00002E19, 0x00000724, 0x0000070F,\n    0x000500C4, 0x00000011, 0x00002AEA, 0x0000522C, 0x00004BB5, 0x00050050,\n    0x00000011, 0x0000605D, 0x00004B64, 0x00004B64, 0x000500C2, 0x00000011,\n    0x00002385, 0x0000605D, 0x00000718, 0x000500C7, 0x00000011, 0x00003AEC,\n    0x00002385, 0x00000724, 0x00050080, 0x00000011, 0x000027D5, 0x00002AEA,\n    0x00003AEC, 0x00050050, 0x00000011, 0x00002164, 0x000023AA, 0x00000A0A,\n    0x000500C2, 0x00000011, 0x0000264A, 0x00000A9F, 0x00002164, 0x00050086,\n    0x00000011, 0x000027A2, 0x000027D5, 0x0000264A, 0x00050051, 0x0000000B,\n    0x00004FA6, 0x000027A2, 0x00000001, 0x00050084, 0x0000000B, 0x00002B26,\n    0x00004FA6, 0x00005051, 0x00050051, 0x0000000B, 0x00006059, 0x000027A2,\n    0x00000000, 0x00050080, 0x0000000B, 0x00005420, 0x00002B26, 0x00006059,\n    0x00050080, 0x0000000B, 0x00002226, 0x0000217F, 0x00005420, 0x00050084,\n    0x00000011, 0x00005B31, 0x000027A2, 0x0000264A, 0x00050082, 0x00000011,\n    0x00002E74, 0x000027D5, 0x00005B31, 0x00050084, 0x0000000B, 0x00001F75,\n    0x00002226, 0x00000184, 0x00050051, 0x0000000B, 0x00005EC7, 0x00002E74,\n    0x00000001, 0x00050051, 0x0000000B, 0x00005BE6, 0x0000264A, 0x00000000,\n    0x00050084, 0x0000000B, 0x00005966, 0x00005EC7, 0x00005BE6, 0x00050051,\n    0x0000000B, 0x00001AE6, 0x00002E74, 0x00000000, 0x00050080, 0x0000000B,\n    0x000025E0, 0x00005966, 0x00001AE6, 0x000500C4, 0x0000000B, 0x000046C4,\n    0x000025E0, 0x000023AA, 0x00050080, 0x0000000B, 0x000048BB, 0x00001F75,\n    0x000046C4, 0x00050089, 0x0000000B, 0x00004C59, 0x000048BB, 0x0000086E,\n    0x000500C4, 0x0000000B, 0x00005BEB, 0x00004C59, 0x00000A11, 0x000500AE,\n    0x00000009, 0x00003652, 0x0000217E, 0x00000A10, 0x000600A9, 0x0000000B,\n    0x00002C0D, 0x00003652, 0x00000A0D, 0x00000A0A, 0x00050080, 0x0000000B,\n    0x00004E6A, 0x000023AA, 0x00002C0D, 0x000500C4, 0x0000000B, 0x0000199B,\n    0x00000A16, 0x00004E6A, 0x000500AB, 0x00000009, 0x00005AEF, 0x000023AA,\n    0x00000A0A, 0x000300F7, 0x0000530F, 0x00000002, 0x000400FA, 0x00005AEF,\n    0x00003B65, 0x000040B9, 0x000200F8, 0x000040B9, 0x000500AA, 0x00000009,\n    0x00004ADA, 0x0000199B, 0x00000A16, 0x000300F7, 0x00004F49, 0x00000002,\n    0x000400FA, 0x00004ADA, 0x000019BF, 0x000022FF, 0x000200F8, 0x000022FF,\n    0x000500C2, 0x0000000B, 0x00005630, 0x00005BEB, 0x00000A11, 0x00060041,\n    0x00000289, 0x00003439, 0x00000CC7, 0x00000A0B, 0x00005630, 0x0004003D,\n    0x0000000B, 0x00003AD4, 0x00003439, 0x00050080, 0x0000000B, 0x00002145,\n    0x00005BEB, 0x0000199B, 0x000500C2, 0x0000000B, 0x000054A6, 0x00002145,\n    0x00000A11, 0x00060041, 0x00000289, 0x00004901, 0x00000CC7, 0x00000A0B,\n    0x000054A6, 0x0004003D, 0x0000000B, 0x00005F59, 0x00004901, 0x00050050,\n    0x00000011, 0x0000512C, 0x00003AD4, 0x00005F59, 0x000200F9, 0x00004F49,\n    0x000200F8, 0x000019BF, 0x000500C2, 0x0000000B, 0x00005FA6, 0x00005BEB,\n    0x00000A11, 0x00060041, 0x00000289, 0x0000343A, 0x00000CC7, 0x00000A0B,\n    0x00005FA6, 0x0004003D, 0x0000000B, 0x00003141, 0x0000343A, 0x00050080,\n    0x0000000B, 0x00002DA7, 0x00005FA6, 0x00000A0D, 0x00060041, 0x00000289,\n    0x00005FEE, 0x00000CC7, 0x00000A0B, 0x00002DA7, 0x0004003D, 0x0000000B,\n    0x00003FFB, 0x00005FEE, 0x00050050, 0x00000011, 0x0000512D, 0x00003141,\n    0x00003FFB, 0x000200F9, 0x00004F49, 0x000200F8, 0x00004F49, 0x000700F5,\n    0x00000011, 0x00002ABF, 0x0000512D, 0x000019BF, 0x0000512C, 0x000022FF,\n    0x000300F7, 0x00003F60, 0x00000000, 0x001300FB, 0x00002180, 0x00004BFB,\n    0x00000000, 0x000038F9, 0x00000001, 0x000038F9, 0x00000002, 0x00001CBB,\n    0x0000000A, 0x00001CBB, 0x00000003, 0x00001CBA, 0x0000000C, 0x00001CBA,\n    0x00000004, 0x00001FFE, 0x00000006, 0x00002033, 0x000200F8, 0x00002033,\n    0x00050051, 0x0000000B, 0x00005F56, 0x00002ABF, 0x00000000, 0x0006000C,\n    0x00000013, 0x00006067, 0x00000001, 0x0000003E, 0x00005F56, 0x00050051,\n    0x0000000D, 0x00002762, 0x00006067, 0x00000000, 0x00050051, 0x0000000D,\n    0x00004446, 0x00006067, 0x00000001, 0x00070050, 0x0000001D, 0x0000390C,\n    0x00002762, 0x00004446, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B,\n    0x0000437A, 0x00002ABF, 0x00000001, 0x0006000C, 0x00000013, 0x0000466B,\n    0x00000001, 0x0000003E, 0x0000437A, 0x00050051, 0x0000000D, 0x00002763,\n    0x0000466B, 0x00000000, 0x00050051, 0x0000000D, 0x000050BE, 0x0000466B,\n    0x00000001, 0x00070050, 0x0000001D, 0x00002349, 0x00002763, 0x000050BE,\n    0x00000A0C, 0x00000A0C, 0x000200F9, 0x00003F60, 0x000200F8, 0x00001FFE,\n    0x00050051, 0x0000000B, 0x0000308B, 0x00002ABF, 0x00000000, 0x0004007C,\n    0x0000000C, 0x0000589D, 0x0000308B, 0x00050050, 0x00000012, 0x0000471A,\n    0x0000589D, 0x0000589D, 0x000500C4, 0x00000012, 0x000047AD, 0x0000471A,\n    0x000007A7, 0x000500C3, 0x00000012, 0x00003417, 0x000047AD, 0x00000867,\n    0x0004006F, 0x00000013, 0x00002A97, 0x00003417, 0x0005008E, 0x00000013,\n    0x00004747, 0x00002A97, 0x000007FE, 0x0007000C, 0x00000013, 0x00005E06,\n    0x00000001, 0x00000028, 0x00000049, 0x00004747, 0x00050051, 0x0000000D,\n    0x00005F0A, 0x00005E06, 0x00000000, 0x00050051, 0x0000000D, 0x00003CD4,\n    0x00005E06, 0x00000001, 0x00070050, 0x0000001D, 0x0000411E, 0x00005F0A,\n    0x00003CD4, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x00004C42,\n    0x00002ABF, 0x00000001, 0x0004007C, 0x0000000C, 0x00003EA1, 0x00004C42,\n    0x00050050, 0x00000012, 0x0000471B, 0x00003EA1, 0x00003EA1, 0x000500C4,\n    0x00000012, 0x000047AE, 0x0000471B, 0x000007A7, 0x000500C3, 0x00000012,\n    0x00003418, 0x000047AE, 0x00000867, 0x0004006F, 0x00000013, 0x00002A98,\n    0x00003418, 0x0005008E, 0x00000013, 0x00004748, 0x00002A98, 0x000007FE,\n    0x0007000C, 0x00000013, 0x00005E07, 0x00000001, 0x00000028, 0x00000049,\n    0x00004748, 0x00050051, 0x0000000D, 0x00005F0B, 0x00005E07, 0x00000000,\n    0x00050051, 0x0000000D, 0x0000494C, 0x00005E07, 0x00000001, 0x00070050,\n    0x0000001D, 0x0000234A, 0x00005F0B, 0x0000494C, 0x00000A0C, 0x00000A0C,\n    0x000200F9, 0x00003F60, 0x000200F8, 0x00001CBA, 0x00050051, 0x0000000B,\n    0x000056BD, 0x00002ABF, 0x00000000, 0x00060050, 0x00000014, 0x00004F0A,\n    0x000056BD, 0x000056BD, 0x000056BD, 0x000500C2, 0x00000014, 0x00002B0D,\n    0x00004F0A, 0x00000BB4, 0x000500C7, 0x00000014, 0x00005DE6, 0x00002B0D,\n    0x00000105, 0x000500C7, 0x00000014, 0x0000489C, 0x00002B0D, 0x00000466,\n    0x000500C2, 0x00000014, 0x00005B90, 0x00005DE6, 0x00000B0C, 0x000500AA,\n    0x00000010, 0x000040C9, 0x00005B90, 0x00000A12, 0x0006000C, 0x00000016,\n    0x00002C4B, 0x00000001, 0x0000004B, 0x0000489C, 0x0004007C, 0x00000014,\n    0x00002A15, 0x00002C4B, 0x00050082, 0x00000014, 0x0000187A, 0x00000B0C,\n    0x00002A15, 0x00050080, 0x00000014, 0x00002210, 0x00002A15, 0x00000938,\n    0x000600A9, 0x00000014, 0x0000286F, 0x000040C9, 0x00002210, 0x00005B90,\n    0x000500C4, 0x00000014, 0x00005AD4, 0x0000489C, 0x0000187A, 0x000500C7,\n    0x00000014, 0x0000499A, 0x00005AD4, 0x00000466, 0x000600A9, 0x00000014,\n    0x00002A9D, 0x000040C9, 0x0000499A, 0x0000489C, 0x00050080, 0x00000014,\n    0x00005FF9, 0x0000286F, 0x000003FA, 0x000500C4, 0x00000014, 0x00004F7F,\n    0x00005FF9, 0x00000189, 0x000500C4, 0x00000014, 0x00003FA6, 0x00002A9D,\n    0x0000008D, 0x000500C5, 0x00000014, 0x0000577C, 0x00004F7F, 0x00003FA6,\n    0x000500AA, 0x00000010, 0x00003600, 0x00005DE6, 0x00000A12, 0x000600A9,\n    0x00000014, 0x00004242, 0x00003600, 0x00000A12, 0x0000577C, 0x0004007C,\n    0x00000018, 0x000029CF, 0x00004242, 0x000500C2, 0x0000000B, 0x00004BA4,\n    0x000056BD, 0x00000A64, 0x00040070, 0x0000000D, 0x0000480E, 0x00004BA4,\n    0x00050085, 0x0000000D, 0x00003E1F, 0x0000480E, 0x00000149, 0x00050051,\n    0x0000000D, 0x000053C2, 0x000029CF, 0x00000000, 0x00050051, 0x0000000D,\n    0x00002A55, 0x000029CF, 0x00000001, 0x00050051, 0x0000000D, 0x00001E99,\n    0x000029CF, 0x00000002, 0x00070050, 0x0000001D, 0x00003DDA, 0x000053C2,\n    0x00002A55, 0x00001E99, 0x00003E1F, 0x00050051, 0x0000000B, 0x000027F5,\n    0x00002ABF, 0x00000001, 0x00060050, 0x00000014, 0x0000350E, 0x000027F5,\n    0x000027F5, 0x000027F5, 0x000500C2, 0x00000014, 0x00002B0E, 0x0000350E,\n    0x00000BB4, 0x000500C7, 0x00000014, 0x00005DE7, 0x00002B0E, 0x00000105,\n    0x000500C7, 0x00000014, 0x0000489D, 0x00002B0E, 0x00000466, 0x000500C2,\n    0x00000014, 0x00005B91, 0x00005DE7, 0x00000B0C, 0x000500AA, 0x00000010,\n    0x000040CA, 0x00005B91, 0x00000A12, 0x0006000C, 0x00000016, 0x00002C4C,\n    0x00000001, 0x0000004B, 0x0000489D, 0x0004007C, 0x00000014, 0x00002A16,\n    0x00002C4C, 0x00050082, 0x00000014, 0x0000187B, 0x00000B0C, 0x00002A16,\n    0x00050080, 0x00000014, 0x00002211, 0x00002A16, 0x00000938, 0x000600A9,\n    0x00000014, 0x00002870, 0x000040CA, 0x00002211, 0x00005B91, 0x000500C4,\n    0x00000014, 0x00005AD5, 0x0000489D, 0x0000187B, 0x000500C7, 0x00000014,\n    0x0000499B, 0x00005AD5, 0x00000466, 0x000600A9, 0x00000014, 0x00002A9E,\n    0x000040CA, 0x0000499B, 0x0000489D, 0x00050080, 0x00000014, 0x00005FFA,\n    0x00002870, 0x000003FA, 0x000500C4, 0x00000014, 0x00004F80, 0x00005FFA,\n    0x00000189, 0x000500C4, 0x00000014, 0x00003FA7, 0x00002A9E, 0x0000008D,\n    0x000500C5, 0x00000014, 0x0000577D, 0x00004F80, 0x00003FA7, 0x000500AA,\n    0x00000010, 0x00003601, 0x00005DE7, 0x00000A12, 0x000600A9, 0x00000014,\n    0x00004243, 0x00003601, 0x00000A12, 0x0000577D, 0x0004007C, 0x00000018,\n    0x000029D0, 0x00004243, 0x000500C2, 0x0000000B, 0x00004BA5, 0x000027F5,\n    0x00000A64, 0x00040070, 0x0000000D, 0x0000480F, 0x00004BA5, 0x00050085,\n    0x0000000D, 0x00003E20, 0x0000480F, 0x00000149, 0x00050051, 0x0000000D,\n    0x000053C3, 0x000029D0, 0x00000000, 0x00050051, 0x0000000D, 0x00002A56,\n    0x000029D0, 0x00000001, 0x00050051, 0x0000000D, 0x00002B11, 0x000029D0,\n    0x00000002, 0x00070050, 0x0000001D, 0x0000234B, 0x000053C3, 0x00002A56,\n    0x00002B11, 0x00003E20, 0x000200F9, 0x00003F60, 0x000200F8, 0x00001CBB,\n    0x00050051, 0x0000000B, 0x000056BE, 0x00002ABF, 0x00000000, 0x00070050,\n    0x00000017, 0x00004F0B, 0x000056BE, 0x000056BE, 0x000056BE, 0x000056BE,\n    0x000500C2, 0x00000017, 0x00002498, 0x00004F0B, 0x0000034D, 0x000500C7,\n    0x00000017, 0x000049AB, 0x00002498, 0x0000027B, 0x00040070, 0x0000001D,\n    0x00003CB7, 0x000049AB, 0x00050085, 0x0000001D, 0x00004130, 0x00003CB7,\n    0x00000AEE, 0x00050051, 0x0000000B, 0x00005CD2, 0x00002ABF, 0x00000001,\n    0x00070050, 0x00000017, 0x0000514D, 0x00005CD2, 0x00005CD2, 0x00005CD2,\n    0x00005CD2, 0x000500C2, 0x00000017, 0x00002499, 0x0000514D, 0x0000034D,\n    0x000500C7, 0x00000017, 0x000049AC, 0x00002499, 0x0000027B, 0x00040070,\n    0x0000001D, 0x0000492F, 0x000049AC, 0x00050085, 0x0000001D, 0x0000269F,\n    0x0000492F, 0x00000AEE, 0x000200F9, 0x00003F60, 0x000200F8, 0x000038F9,\n    0x00050051, 0x0000000B, 0x000056BF, 0x00002ABF, 0x00000000, 0x00070050,\n    0x00000017, 0x00004F0C, 0x000056BF, 0x000056BF, 0x000056BF, 0x000056BF,\n    0x000500C2, 0x00000017, 0x0000249A, 0x00004F0C, 0x0000028D, 0x000500C7,\n    0x00000017, 0x00004A56, 0x0000249A, 0x0000064B, 0x00040070, 0x0000001D,\n    0x000036A2, 0x00004A56, 0x0005008E, 0x0000001D, 0x00004B23, 0x000036A2,\n    0x0000017A, 0x00050051, 0x0000000B, 0x0000219F, 0x00002ABF, 0x00000001,\n    0x00070050, 0x00000017, 0x0000610B, 0x0000219F, 0x0000219F, 0x0000219F,\n    0x0000219F, 0x000500C2, 0x00000017, 0x0000249B, 0x0000610B, 0x0000028D,\n    0x000500C7, 0x00000017, 0x00004A57, 0x0000249B, 0x0000064B, 0x00040070,\n    0x0000001D, 0x0000431A, 0x00004A57, 0x0005008E, 0x0000001D, 0x00003092,\n    0x0000431A, 0x0000017A, 0x000200F9, 0x00003F60, 0x000200F8, 0x00004BFB,\n    0x00050051, 0x0000000B, 0x0000308C, 0x00002ABF, 0x00000000, 0x0004007C,\n    0x0000000D, 0x00004FEE, 0x0000308C, 0x00050050, 0x00000013, 0x00004336,\n    0x00004FEE, 0x00000A0C, 0x0009004F, 0x0000001D, 0x00002D90, 0x00004336,\n    0x00004336, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00050051,\n    0x0000000B, 0x000056B1, 0x00002ABF, 0x00000001, 0x0004007C, 0x0000000D,\n    0x00003F68, 0x000056B1, 0x00050050, 0x00000013, 0x00004FAE, 0x00003F68,\n    0x00000A0C, 0x0009004F, 0x0000001D, 0x00005A3A, 0x00004FAE, 0x00004FAE,\n    0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x000200F9, 0x00003F60,\n    0x000200F8, 0x00003F60, 0x000F00F5, 0x0000001D, 0x00002BF3, 0x00005A3A,\n    0x00004BFB, 0x00003092, 0x000038F9, 0x0000269F, 0x00001CBB, 0x0000234B,\n    0x00001CBA, 0x0000234A, 0x00001FFE, 0x00002349, 0x00002033, 0x000F00F5,\n    0x0000001D, 0x0000358D, 0x00002D90, 0x00004BFB, 0x00004B23, 0x000038F9,\n    0x00004130, 0x00001CBB, 0x00003DDA, 0x00001CBA, 0x0000411E, 0x00001FFE,\n    0x0000390C, 0x00002033, 0x000200F9, 0x0000530F, 0x000200F8, 0x00003B65,\n    0x000500AA, 0x00000009, 0x00005450, 0x0000199B, 0x00000A22, 0x000300F7,\n    0x00004F4A, 0x00000002, 0x000400FA, 0x00005450, 0x000019C0, 0x00002300,\n    0x000200F8, 0x00002300, 0x000500C2, 0x0000000B, 0x00005631, 0x00005BEB,\n    0x00000A11, 0x00060041, 0x00000289, 0x0000343B, 0x00000CC7, 0x00000A0B,\n    0x00005631, 0x0004003D, 0x0000000B, 0x00003142, 0x0000343B, 0x00050080,\n    0x0000000B, 0x00002DA8, 0x00005631, 0x00000A0D, 0x00060041, 0x00000289,\n    0x000018FF, 0x00000CC7, 0x00000A0B, 0x00002DA8, 0x0004003D, 0x0000000B,\n    0x00001B76, 0x000018FF, 0x00050080, 0x0000000B, 0x00002146, 0x00005BEB,\n    0x0000199B, 0x000500C2, 0x0000000B, 0x000054A7, 0x00002146, 0x00000A11,\n    0x00060041, 0x00000289, 0x00004C91, 0x00000CC7, 0x00000A0B, 0x000054A7,\n    0x0004003D, 0x0000000B, 0x00003143, 0x00004C91, 0x00050080, 0x0000000B,\n    0x00002DA9, 0x000054A7, 0x00000A0D, 0x00060041, 0x00000289, 0x00005FEF,\n    0x00000CC7, 0x00000A0B, 0x00002DA9, 0x0004003D, 0x0000000B, 0x00003FFC,\n    0x00005FEF, 0x00070050, 0x00000017, 0x0000512E, 0x00003142, 0x00001B76,\n    0x00003143, 0x00003FFC, 0x000200F9, 0x00004F4A, 0x000200F8, 0x000019C0,\n    0x000500C2, 0x0000000B, 0x00005FA7, 0x00005BEB, 0x00000A11, 0x00060041,\n    0x00000289, 0x0000343C, 0x00000CC7, 0x00000A0B, 0x00005FA7, 0x0004003D,\n    0x0000000B, 0x00003144, 0x0000343C, 0x00050080, 0x0000000B, 0x00002DAA,\n    0x00005FA7, 0x00000A0D, 0x00060041, 0x00000289, 0x00001900, 0x00000CC7,\n    0x00000A0B, 0x00002DAA, 0x0004003D, 0x0000000B, 0x00005C62, 0x00001900,\n    0x00050080, 0x0000000B, 0x00002DAB, 0x00005FA7, 0x00000A10, 0x00060041,\n    0x00000289, 0x00001901, 0x00000CC7, 0x00000A0B, 0x00002DAB, 0x0004003D,\n    0x0000000B, 0x00005C63, 0x00001901, 0x00050080, 0x0000000B, 0x00002DAC,\n    0x00005FA7, 0x00000A13, 0x00060041, 0x00000289, 0x00005FF0, 0x00000CC7,\n    0x00000A0B, 0x00002DAC, 0x0004003D, 0x0000000B, 0x00003FFD, 0x00005FF0,\n    0x00070050, 0x00000017, 0x0000512F, 0x00003144, 0x00005C62, 0x00005C63,\n    0x00003FFD, 0x000200F9, 0x00004F4A, 0x000200F8, 0x00004F4A, 0x000700F5,\n    0x00000017, 0x00002AC0, 0x0000512F, 0x000019C0, 0x0000512E, 0x00002300,\n    0x000300F7, 0x00004F23, 0x00000000, 0x000700FB, 0x00002180, 0x00004F56,\n    0x00000005, 0x00002158, 0x00000007, 0x00002034, 0x000200F8, 0x00002034,\n    0x00050051, 0x0000000B, 0x00005F57, 0x00002AC0, 0x00000000, 0x0006000C,\n    0x00000013, 0x00006068, 0x00000001, 0x0000003E, 0x00005F57, 0x00050051,\n    0x0000000D, 0x00002775, 0x00006068, 0x00000000, 0x00050051, 0x0000000D,\n    0x00003EB8, 0x00006068, 0x00000001, 0x00050051, 0x0000000B, 0x00004281,\n    0x00002AC0, 0x00000001, 0x0006000C, 0x00000013, 0x00003CF5, 0x00000001,\n    0x0000003E, 0x00004281, 0x00050051, 0x0000000D, 0x00002764, 0x00003CF5,\n    0x00000000, 0x00050051, 0x0000000D, 0x00004447, 0x00003CF5, 0x00000001,\n    0x00070050, 0x0000001D, 0x0000390D, 0x00002775, 0x00003EB8, 0x00002764,\n    0x00004447, 0x00050051, 0x0000000B, 0x0000437B, 0x00002AC0, 0x00000002,\n    0x0006000C, 0x00000013, 0x0000466C, 0x00000001, 0x0000003E, 0x0000437B,\n    0x00050051, 0x0000000D, 0x00002776, 0x0000466C, 0x00000000, 0x00050051,\n    0x0000000D, 0x00003EB9, 0x0000466C, 0x00000001, 0x00050051, 0x0000000B,\n    0x00004282, 0x00002AC0, 0x00000003, 0x0006000C, 0x00000013, 0x00003CF6,\n    0x00000001, 0x0000003E, 0x00004282, 0x00050051, 0x0000000D, 0x00002765,\n    0x00003CF6, 0x00000000, 0x00050051, 0x0000000D, 0x000050BF, 0x00003CF6,\n    0x00000001, 0x00070050, 0x0000001D, 0x0000234C, 0x00002776, 0x00003EB9,\n    0x00002765, 0x000050BF, 0x000200F9, 0x00004F23, 0x000200F8, 0x00002158,\n    0x0007004F, 0x00000011, 0x000025FB, 0x00002AC0, 0x00002AC0, 0x00000000,\n    0x00000001, 0x0004007C, 0x00000012, 0x00005B3C, 0x000025FB, 0x0009004F,\n    0x0000001A, 0x000060CE, 0x00005B3C, 0x00005B3C, 0x00000000, 0x00000000,\n    0x00000001, 0x00000001, 0x000500C4, 0x0000001A, 0x000048A6, 0x000060CE,\n    0x00000122, 0x000500C3, 0x0000001A, 0x00003D8D, 0x000048A6, 0x00000302,\n    0x0004006F, 0x0000001D, 0x00002A99, 0x00003D8D, 0x0005008E, 0x0000001D,\n    0x00004721, 0x00002A99, 0x000007FE, 0x0007000C, 0x0000001D, 0x00006291,\n    0x00000001, 0x00000028, 0x00000504, 0x00004721, 0x0007004F, 0x00000011,\n    0x0000376B, 0x00002AC0, 0x00002AC0, 0x00000002, 0x00000003, 0x0004007C,\n    0x00000012, 0x000024BF, 0x0000376B, 0x0009004F, 0x0000001A, 0x000060CF,\n    0x000024BF, 0x000024BF, 0x00000000, 0x00000000, 0x00000001, 0x00000001,\n    0x000500C4, 0x0000001A, 0x000048A7, 0x000060CF, 0x00000122, 0x000500C3,\n    0x0000001A, 0x00003D8E, 0x000048A7, 0x00000302, 0x0004006F, 0x0000001D,\n    0x00002A9A, 0x00003D8E, 0x0005008E, 0x0000001D, 0x000053BF, 0x00002A9A,\n    0x000007FE, 0x0007000C, 0x0000001D, 0x00004362, 0x00000001, 0x00000028,\n    0x00000504, 0x000053BF, 0x000200F9, 0x00004F23, 0x000200F8, 0x00004F56,\n    0x0007004F, 0x00000011, 0x00002621, 0x00002AC0, 0x00002AC0, 0x00000000,\n    0x00000001, 0x0004007C, 0x00000013, 0x00005159, 0x00002621, 0x00050051,\n    0x0000000D, 0x00001B7B, 0x00005159, 0x00000000, 0x00050051, 0x0000000D,\n    0x0000346A, 0x00005159, 0x00000001, 0x00070050, 0x0000001D, 0x00004278,\n    0x00001B7B, 0x0000346A, 0x00000A0C, 0x00000A0C, 0x0007004F, 0x00000011,\n    0x000041D8, 0x00002AC0, 0x00002AC0, 0x00000002, 0x00000003, 0x0004007C,\n    0x00000013, 0x0000375D, 0x000041D8, 0x00050051, 0x0000000D, 0x00001B7C,\n    0x0000375D, 0x00000000, 0x00050051, 0x0000000D, 0x00004108, 0x0000375D,\n    0x00000001, 0x00070050, 0x0000001D, 0x0000234D, 0x00001B7C, 0x00004108,\n    0x00000A0C, 0x00000A0C, 0x000200F9, 0x00004F23, 0x000200F8, 0x00004F23,\n    0x000900F5, 0x0000001D, 0x00002BF4, 0x0000234D, 0x00004F56, 0x00004362,\n    0x00002158, 0x0000234C, 0x00002034, 0x000900F5, 0x0000001D, 0x0000358E,\n    0x00004278, 0x00004F56, 0x00006291, 0x00002158, 0x0000390D, 0x00002034,\n    0x000200F9, 0x0000530F, 0x000200F8, 0x0000530F, 0x000700F5, 0x0000001D,\n    0x00002662, 0x00002BF4, 0x00004F23, 0x00002BF3, 0x00003F60, 0x000700F5,\n    0x0000001D, 0x000036E3, 0x0000358E, 0x00004F23, 0x0000358D, 0x00003F60,\n    0x000500AE, 0x00000009, 0x00002E55, 0x00003F4D, 0x00000A16, 0x000300F7,\n    0x00005313, 0x00000002, 0x000400FA, 0x00002E55, 0x000050E5, 0x00005313,\n    0x000200F8, 0x000050E5, 0x00050085, 0x0000000D, 0x000061FB, 0x00002B2C,\n    0x000000FC, 0x00050080, 0x0000000B, 0x00005E78, 0x00005BEB, 0x00000207,\n    0x000300F7, 0x00005310, 0x00000002, 0x000400FA, 0x00005AEF, 0x00003B66,\n    0x000040BA, 0x000200F8, 0x000040BA, 0x000500AA, 0x00000009, 0x00004ADB,\n    0x0000199B, 0x00000A16, 0x000300F7, 0x00004F4B, 0x00000002, 0x000400FA,\n    0x00004ADB, 0x000019C1, 0x00002301, 0x000200F8, 0x00002301, 0x000500C2,\n    0x0000000B, 0x00005632, 0x00005E78, 0x00000A11, 0x00060041, 0x00000289,\n    0x0000343D, 0x00000CC7, 0x00000A0B, 0x00005632, 0x0004003D, 0x0000000B,\n    0x00003AD5, 0x0000343D, 0x00050080, 0x0000000B, 0x00002147, 0x00005E78,\n    0x0000199B, 0x000500C2, 0x0000000B, 0x000054A8, 0x00002147, 0x00000A11,\n    0x00060041, 0x00000289, 0x00004902, 0x00000CC7, 0x00000A0B, 0x000054A8,\n    0x0004003D, 0x0000000B, 0x00005F5A, 0x00004902, 0x00050050, 0x00000011,\n    0x00005130, 0x00003AD5, 0x00005F5A, 0x000200F9, 0x00004F4B, 0x000200F8,\n    0x000019C1, 0x000500C2, 0x0000000B, 0x00005FA8, 0x00005E78, 0x00000A11,\n    0x00060041, 0x00000289, 0x0000343E, 0x00000CC7, 0x00000A0B, 0x00005FA8,\n    0x0004003D, 0x0000000B, 0x00003145, 0x0000343E, 0x00050080, 0x0000000B,\n    0x00002DAD, 0x00005FA8, 0x00000A0D, 0x00060041, 0x00000289, 0x00005FF1,\n    0x00000CC7, 0x00000A0B, 0x00002DAD, 0x0004003D, 0x0000000B, 0x00003FFE,\n    0x00005FF1, 0x00050050, 0x00000011, 0x00005131, 0x00003145, 0x00003FFE,\n    0x000200F9, 0x00004F4B, 0x000200F8, 0x00004F4B, 0x000700F5, 0x00000011,\n    0x00002AC1, 0x00005131, 0x000019C1, 0x00005130, 0x00002301, 0x000300F7,\n    0x00003F61, 0x00000000, 0x001300FB, 0x00002180, 0x00004BFC, 0x00000000,\n    0x000038FA, 0x00000001, 0x000038FA, 0x00000002, 0x00001CBD, 0x0000000A,\n    0x00001CBD, 0x00000003, 0x00001CBC, 0x0000000C, 0x00001CBC, 0x00000004,\n    0x00001FFF, 0x00000006, 0x00002035, 0x000200F8, 0x00002035, 0x00050051,\n    0x0000000B, 0x00005F58, 0x00002AC1, 0x00000000, 0x0006000C, 0x00000013,\n    0x00006069, 0x00000001, 0x0000003E, 0x00005F58, 0x00050051, 0x0000000D,\n    0x00002766, 0x00006069, 0x00000000, 0x00050051, 0x0000000D, 0x00004448,\n    0x00006069, 0x00000001, 0x00070050, 0x0000001D, 0x0000390E, 0x00002766,\n    0x00004448, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x0000437C,\n    0x00002AC1, 0x00000001, 0x0006000C, 0x00000013, 0x0000466D, 0x00000001,\n    0x0000003E, 0x0000437C, 0x00050051, 0x0000000D, 0x00002767, 0x0000466D,\n    0x00000000, 0x00050051, 0x0000000D, 0x000050C0, 0x0000466D, 0x00000001,\n    0x00070050, 0x0000001D, 0x0000234E, 0x00002767, 0x000050C0, 0x00000A0C,\n    0x00000A0C, 0x000200F9, 0x00003F61, 0x000200F8, 0x00001FFF, 0x00050051,\n    0x0000000B, 0x0000308D, 0x00002AC1, 0x00000000, 0x0004007C, 0x0000000C,\n    0x0000589E, 0x0000308D, 0x00050050, 0x00000012, 0x0000471C, 0x0000589E,\n    0x0000589E, 0x000500C4, 0x00000012, 0x000047AF, 0x0000471C, 0x000007A7,\n    0x000500C3, 0x00000012, 0x00003419, 0x000047AF, 0x00000867, 0x0004006F,\n    0x00000013, 0x00002A9B, 0x00003419, 0x0005008E, 0x00000013, 0x00004749,\n    0x00002A9B, 0x000007FE, 0x0007000C, 0x00000013, 0x00005E08, 0x00000001,\n    0x00000028, 0x00000049, 0x00004749, 0x00050051, 0x0000000D, 0x00005F0C,\n    0x00005E08, 0x00000000, 0x00050051, 0x0000000D, 0x00003CD5, 0x00005E08,\n    0x00000001, 0x00070050, 0x0000001D, 0x0000411F, 0x00005F0C, 0x00003CD5,\n    0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x00004C43, 0x00002AC1,\n    0x00000001, 0x0004007C, 0x0000000C, 0x00003EA2, 0x00004C43, 0x00050050,\n    0x00000012, 0x0000471D, 0x00003EA2, 0x00003EA2, 0x000500C4, 0x00000012,\n    0x000047B0, 0x0000471D, 0x000007A7, 0x000500C3, 0x00000012, 0x0000341A,\n    0x000047B0, 0x00000867, 0x0004006F, 0x00000013, 0x00002A9C, 0x0000341A,\n    0x0005008E, 0x00000013, 0x0000474A, 0x00002A9C, 0x000007FE, 0x0007000C,\n    0x00000013, 0x00005E09, 0x00000001, 0x00000028, 0x00000049, 0x0000474A,\n    0x00050051, 0x0000000D, 0x00005F0D, 0x00005E09, 0x00000000, 0x00050051,\n    0x0000000D, 0x0000494D, 0x00005E09, 0x00000001, 0x00070050, 0x0000001D,\n    0x0000234F, 0x00005F0D, 0x0000494D, 0x00000A0C, 0x00000A0C, 0x000200F9,\n    0x00003F61, 0x000200F8, 0x00001CBC, 0x00050051, 0x0000000B, 0x000056C0,\n    0x00002AC1, 0x00000000, 0x00060050, 0x00000014, 0x00004F0D, 0x000056C0,\n    0x000056C0, 0x000056C0, 0x000500C2, 0x00000014, 0x00002B0F, 0x00004F0D,\n    0x00000BB4, 0x000500C7, 0x00000014, 0x00005DE8, 0x00002B0F, 0x00000105,\n    0x000500C7, 0x00000014, 0x0000489E, 0x00002B0F, 0x00000466, 0x000500C2,\n    0x00000014, 0x00005B92, 0x00005DE8, 0x00000B0C, 0x000500AA, 0x00000010,\n    0x000040CB, 0x00005B92, 0x00000A12, 0x0006000C, 0x00000016, 0x00002C4D,\n    0x00000001, 0x0000004B, 0x0000489E, 0x0004007C, 0x00000014, 0x00002A17,\n    0x00002C4D, 0x00050082, 0x00000014, 0x0000187C, 0x00000B0C, 0x00002A17,\n    0x00050080, 0x00000014, 0x00002212, 0x00002A17, 0x00000938, 0x000600A9,\n    0x00000014, 0x00002871, 0x000040CB, 0x00002212, 0x00005B92, 0x000500C4,\n    0x00000014, 0x00005AD6, 0x0000489E, 0x0000187C, 0x000500C7, 0x00000014,\n    0x0000499C, 0x00005AD6, 0x00000466, 0x000600A9, 0x00000014, 0x00002A9F,\n    0x000040CB, 0x0000499C, 0x0000489E, 0x00050080, 0x00000014, 0x00005FFB,\n    0x00002871, 0x000003FA, 0x000500C4, 0x00000014, 0x00004F81, 0x00005FFB,\n    0x00000189, 0x000500C4, 0x00000014, 0x00003FA8, 0x00002A9F, 0x0000008D,\n    0x000500C5, 0x00000014, 0x0000577E, 0x00004F81, 0x00003FA8, 0x000500AA,\n    0x00000010, 0x00003602, 0x00005DE8, 0x00000A12, 0x000600A9, 0x00000014,\n    0x00004244, 0x00003602, 0x00000A12, 0x0000577E, 0x0004007C, 0x00000018,\n    0x000029D1, 0x00004244, 0x000500C2, 0x0000000B, 0x00004BA6, 0x000056C0,\n    0x00000A64, 0x00040070, 0x0000000D, 0x00004810, 0x00004BA6, 0x00050085,\n    0x0000000D, 0x00003E21, 0x00004810, 0x00000149, 0x00050051, 0x0000000D,\n    0x000053C4, 0x000029D1, 0x00000000, 0x00050051, 0x0000000D, 0x00002A57,\n    0x000029D1, 0x00000001, 0x00050051, 0x0000000D, 0x00001E9A, 0x000029D1,\n    0x00000002, 0x00070050, 0x0000001D, 0x00003DDB, 0x000053C4, 0x00002A57,\n    0x00001E9A, 0x00003E21, 0x00050051, 0x0000000B, 0x000027F6, 0x00002AC1,\n    0x00000001, 0x00060050, 0x00000014, 0x0000350F, 0x000027F6, 0x000027F6,\n    0x000027F6, 0x000500C2, 0x00000014, 0x00002B10, 0x0000350F, 0x00000BB4,\n    0x000500C7, 0x00000014, 0x00005DE9, 0x00002B10, 0x00000105, 0x000500C7,\n    0x00000014, 0x0000489F, 0x00002B10, 0x00000466, 0x000500C2, 0x00000014,\n    0x00005B93, 0x00005DE9, 0x00000B0C, 0x000500AA, 0x00000010, 0x000040CC,\n    0x00005B93, 0x00000A12, 0x0006000C, 0x00000016, 0x00002C4E, 0x00000001,\n    0x0000004B, 0x0000489F, 0x0004007C, 0x00000014, 0x00002A18, 0x00002C4E,\n    0x00050082, 0x00000014, 0x0000187D, 0x00000B0C, 0x00002A18, 0x00050080,\n    0x00000014, 0x00002213, 0x00002A18, 0x00000938, 0x000600A9, 0x00000014,\n    0x00002872, 0x000040CC, 0x00002213, 0x00005B93, 0x000500C4, 0x00000014,\n    0x00005AD7, 0x0000489F, 0x0000187D, 0x000500C7, 0x00000014, 0x0000499D,\n    0x00005AD7, 0x00000466, 0x000600A9, 0x00000014, 0x00002AA0, 0x000040CC,\n    0x0000499D, 0x0000489F, 0x00050080, 0x00000014, 0x00005FFC, 0x00002872,\n    0x000003FA, 0x000500C4, 0x00000014, 0x00004F82, 0x00005FFC, 0x00000189,\n    0x000500C4, 0x00000014, 0x00003FA9, 0x00002AA0, 0x0000008D, 0x000500C5,\n    0x00000014, 0x0000577F, 0x00004F82, 0x00003FA9, 0x000500AA, 0x00000010,\n    0x00003603, 0x00005DE9, 0x00000A12, 0x000600A9, 0x00000014, 0x00004245,\n    0x00003603, 0x00000A12, 0x0000577F, 0x0004007C, 0x00000018, 0x000029D2,\n    0x00004245, 0x000500C2, 0x0000000B, 0x00004BA7, 0x000027F6, 0x00000A64,\n    0x00040070, 0x0000000D, 0x00004811, 0x00004BA7, 0x00050085, 0x0000000D,\n    0x00003E22, 0x00004811, 0x00000149, 0x00050051, 0x0000000D, 0x000053C5,\n    0x000029D2, 0x00000000, 0x00050051, 0x0000000D, 0x00002A58, 0x000029D2,\n    0x00000001, 0x00050051, 0x0000000D, 0x00002B12, 0x000029D2, 0x00000002,\n    0x00070050, 0x0000001D, 0x00002350, 0x000053C5, 0x00002A58, 0x00002B12,\n    0x00003E22, 0x000200F9, 0x00003F61, 0x000200F8, 0x00001CBD, 0x00050051,\n    0x0000000B, 0x000056C1, 0x00002AC1, 0x00000000, 0x00070050, 0x00000017,\n    0x00004F0E, 0x000056C1, 0x000056C1, 0x000056C1, 0x000056C1, 0x000500C2,\n    0x00000017, 0x0000249C, 0x00004F0E, 0x0000034D, 0x000500C7, 0x00000017,\n    0x000049AD, 0x0000249C, 0x0000027B, 0x00040070, 0x0000001D, 0x00003CB8,\n    0x000049AD, 0x00050085, 0x0000001D, 0x00004131, 0x00003CB8, 0x00000AEE,\n    0x00050051, 0x0000000B, 0x00005CD3, 0x00002AC1, 0x00000001, 0x00070050,\n    0x00000017, 0x0000514E, 0x00005CD3, 0x00005CD3, 0x00005CD3, 0x00005CD3,\n    0x000500C2, 0x00000017, 0x0000249D, 0x0000514E, 0x0000034D, 0x000500C7,\n    0x00000017, 0x000049AE, 0x0000249D, 0x0000027B, 0x00040070, 0x0000001D,\n    0x00004930, 0x000049AE, 0x00050085, 0x0000001D, 0x000026A0, 0x00004930,\n    0x00000AEE, 0x000200F9, 0x00003F61, 0x000200F8, 0x000038FA, 0x00050051,\n    0x0000000B, 0x000056C2, 0x00002AC1, 0x00000000, 0x00070050, 0x00000017,\n    0x00004F0F, 0x000056C2, 0x000056C2, 0x000056C2, 0x000056C2, 0x000500C2,\n    0x00000017, 0x0000249E, 0x00004F0F, 0x0000028D, 0x000500C7, 0x00000017,\n    0x00004A58, 0x0000249E, 0x0000064B, 0x00040070, 0x0000001D, 0x000036A3,\n    0x00004A58, 0x0005008E, 0x0000001D, 0x00004B24, 0x000036A3, 0x0000017A,\n    0x00050051, 0x0000000B, 0x000021A0, 0x00002AC1, 0x00000001, 0x00070050,\n    0x00000017, 0x0000610C, 0x000021A0, 0x000021A0, 0x000021A0, 0x000021A0,\n    0x000500C2, 0x00000017, 0x0000249F, 0x0000610C, 0x0000028D, 0x000500C7,\n    0x00000017, 0x00004A59, 0x0000249F, 0x0000064B, 0x00040070, 0x0000001D,\n    0x0000431B, 0x00004A59, 0x0005008E, 0x0000001D, 0x00003093, 0x0000431B,\n    0x0000017A, 0x000200F9, 0x00003F61, 0x000200F8, 0x00004BFC, 0x00050051,\n    0x0000000B, 0x0000308E, 0x00002AC1, 0x00000000, 0x0004007C, 0x0000000D,\n    0x00004FEF, 0x0000308E, 0x00050050, 0x00000013, 0x00004337, 0x00004FEF,\n    0x00000A0C, 0x0009004F, 0x0000001D, 0x00002D91, 0x00004337, 0x00004337,\n    0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00050051, 0x0000000B,\n    0x000056B2, 0x00002AC1, 0x00000001, 0x0004007C, 0x0000000D, 0x00003F69,\n    0x000056B2, 0x00050050, 0x00000013, 0x00004FAF, 0x00003F69, 0x00000A0C,\n    0x0009004F, 0x0000001D, 0x00005A3B, 0x00004FAF, 0x00004FAF, 0x00000000,\n    0x00000001, 0x00000001, 0x00000001, 0x000200F9, 0x00003F61, 0x000200F8,\n    0x00003F61, 0x000F00F5, 0x0000001D, 0x00002BF5, 0x00005A3B, 0x00004BFC,\n    0x00003093, 0x000038FA, 0x000026A0, 0x00001CBD, 0x00002350, 0x00001CBC,\n    0x0000234F, 0x00001FFF, 0x0000234E, 0x00002035, 0x000F00F5, 0x0000001D,\n    0x00003590, 0x00002D91, 0x00004BFC, 0x00004B24, 0x000038FA, 0x00004131,\n    0x00001CBD, 0x00003DDB, 0x00001CBC, 0x0000411F, 0x00001FFF, 0x0000390E,\n    0x00002035, 0x000200F9, 0x00005310, 0x000200F8, 0x00003B66, 0x000500AA,\n    0x00000009, 0x00005451, 0x0000199B, 0x00000A22, 0x000300F7, 0x00004F4C,\n    0x00000002, 0x000400FA, 0x00005451, 0x000019C2, 0x00002302, 0x000200F8,\n    0x00002302, 0x000500C2, 0x0000000B, 0x00005633, 0x00005E78, 0x00000A11,\n    0x00060041, 0x00000289, 0x0000343F, 0x00000CC7, 0x00000A0B, 0x00005633,\n    0x0004003D, 0x0000000B, 0x00003146, 0x0000343F, 0x00050080, 0x0000000B,\n    0x00002DAE, 0x00005633, 0x00000A0D, 0x00060041, 0x00000289, 0x00001902,\n    0x00000CC7, 0x00000A0B, 0x00002DAE, 0x0004003D, 0x0000000B, 0x00001B77,\n    0x00001902, 0x00050080, 0x0000000B, 0x00002148, 0x00005E78, 0x0000199B,\n    0x000500C2, 0x0000000B, 0x000054A9, 0x00002148, 0x00000A11, 0x00060041,\n    0x00000289, 0x00004C92, 0x00000CC7, 0x00000A0B, 0x000054A9, 0x0004003D,\n    0x0000000B, 0x00003147, 0x00004C92, 0x00050080, 0x0000000B, 0x00002DAF,\n    0x000054A9, 0x00000A0D, 0x00060041, 0x00000289, 0x00005FF2, 0x00000CC7,\n    0x00000A0B, 0x00002DAF, 0x0004003D, 0x0000000B, 0x00003FFF, 0x00005FF2,\n    0x00070050, 0x00000017, 0x00005132, 0x00003146, 0x00001B77, 0x00003147,\n    0x00003FFF, 0x000200F9, 0x00004F4C, 0x000200F8, 0x000019C2, 0x000500C2,\n    0x0000000B, 0x00005FA9, 0x00005E78, 0x00000A11, 0x00060041, 0x00000289,\n    0x00003440, 0x00000CC7, 0x00000A0B, 0x00005FA9, 0x0004003D, 0x0000000B,\n    0x00003148, 0x00003440, 0x00050080, 0x0000000B, 0x00002DB0, 0x00005FA9,\n    0x00000A0D, 0x00060041, 0x00000289, 0x00001903, 0x00000CC7, 0x00000A0B,\n    0x00002DB0, 0x0004003D, 0x0000000B, 0x00005C64, 0x00001903, 0x00050080,\n    0x0000000B, 0x00002DB1, 0x00005FA9, 0x00000A10, 0x00060041, 0x00000289,\n    0x00001904, 0x00000CC7, 0x00000A0B, 0x00002DB1, 0x0004003D, 0x0000000B,\n    0x00005C65, 0x00001904, 0x00050080, 0x0000000B, 0x00002DB2, 0x00005FA9,\n    0x00000A13, 0x00060041, 0x00000289, 0x00005FF3, 0x00000CC7, 0x00000A0B,\n    0x00002DB2, 0x0004003D, 0x0000000B, 0x00004000, 0x00005FF3, 0x00070050,\n    0x00000017, 0x00005133, 0x00003148, 0x00005C64, 0x00005C65, 0x00004000,\n    0x000200F9, 0x00004F4C, 0x000200F8, 0x00004F4C, 0x000700F5, 0x00000017,\n    0x00002AC2, 0x00005133, 0x000019C2, 0x00005132, 0x00002302, 0x000300F7,\n    0x00004F24, 0x00000000, 0x000700FB, 0x00002180, 0x00004F57, 0x00000005,\n    0x00002159, 0x00000007, 0x00002036, 0x000200F8, 0x00002036, 0x00050051,\n    0x0000000B, 0x00005F5B, 0x00002AC2, 0x00000000, 0x0006000C, 0x00000013,\n    0x0000606A, 0x00000001, 0x0000003E, 0x00005F5B, 0x00050051, 0x0000000D,\n    0x00002777, 0x0000606A, 0x00000000, 0x00050051, 0x0000000D, 0x00003EBA,\n    0x0000606A, 0x00000001, 0x00050051, 0x0000000B, 0x00004283, 0x00002AC2,\n    0x00000001, 0x0006000C, 0x00000013, 0x00003CF7, 0x00000001, 0x0000003E,\n    0x00004283, 0x00050051, 0x0000000D, 0x00002768, 0x00003CF7, 0x00000000,\n    0x00050051, 0x0000000D, 0x00004449, 0x00003CF7, 0x00000001, 0x00070050,\n    0x0000001D, 0x0000390F, 0x00002777, 0x00003EBA, 0x00002768, 0x00004449,\n    0x00050051, 0x0000000B, 0x0000437D, 0x00002AC2, 0x00000002, 0x0006000C,\n    0x00000013, 0x0000466E, 0x00000001, 0x0000003E, 0x0000437D, 0x00050051,\n    0x0000000D, 0x00002778, 0x0000466E, 0x00000000, 0x00050051, 0x0000000D,\n    0x00003EBB, 0x0000466E, 0x00000001, 0x00050051, 0x0000000B, 0x00004284,\n    0x00002AC2, 0x00000003, 0x0006000C, 0x00000013, 0x00003CF8, 0x00000001,\n    0x0000003E, 0x00004284, 0x00050051, 0x0000000D, 0x00002769, 0x00003CF8,\n    0x00000000, 0x00050051, 0x0000000D, 0x000050C1, 0x00003CF8, 0x00000001,\n    0x00070050, 0x0000001D, 0x00002351, 0x00002778, 0x00003EBB, 0x00002769,\n    0x000050C1, 0x000200F9, 0x00004F24, 0x000200F8, 0x00002159, 0x0007004F,\n    0x00000011, 0x000025FC, 0x00002AC2, 0x00002AC2, 0x00000000, 0x00000001,\n    0x0004007C, 0x00000012, 0x00005B3D, 0x000025FC, 0x0009004F, 0x0000001A,\n    0x000060D0, 0x00005B3D, 0x00005B3D, 0x00000000, 0x00000000, 0x00000001,\n    0x00000001, 0x000500C4, 0x0000001A, 0x000048A8, 0x000060D0, 0x00000122,\n    0x000500C3, 0x0000001A, 0x00003D8F, 0x000048A8, 0x00000302, 0x0004006F,\n    0x0000001D, 0x00002AA1, 0x00003D8F, 0x0005008E, 0x0000001D, 0x00004722,\n    0x00002AA1, 0x000007FE, 0x0007000C, 0x0000001D, 0x00006292, 0x00000001,\n    0x00000028, 0x00000504, 0x00004722, 0x0007004F, 0x00000011, 0x0000376C,\n    0x00002AC2, 0x00002AC2, 0x00000002, 0x00000003, 0x0004007C, 0x00000012,\n    0x000024C0, 0x0000376C, 0x0009004F, 0x0000001A, 0x000060D1, 0x000024C0,\n    0x000024C0, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x000500C4,\n    0x0000001A, 0x000048A9, 0x000060D1, 0x00000122, 0x000500C3, 0x0000001A,\n    0x00003D90, 0x000048A9, 0x00000302, 0x0004006F, 0x0000001D, 0x00002AA2,\n    0x00003D90, 0x0005008E, 0x0000001D, 0x000053C0, 0x00002AA2, 0x000007FE,\n    0x0007000C, 0x0000001D, 0x00004363, 0x00000001, 0x00000028, 0x00000504,\n    0x000053C0, 0x000200F9, 0x00004F24, 0x000200F8, 0x00004F57, 0x0007004F,\n    0x00000011, 0x00002622, 0x00002AC2, 0x00002AC2, 0x00000000, 0x00000001,\n    0x0004007C, 0x00000013, 0x0000515A, 0x00002622, 0x00050051, 0x0000000D,\n    0x00001B7D, 0x0000515A, 0x00000000, 0x00050051, 0x0000000D, 0x0000346B,\n    0x0000515A, 0x00000001, 0x00070050, 0x0000001D, 0x00004279, 0x00001B7D,\n    0x0000346B, 0x00000A0C, 0x00000A0C, 0x0007004F, 0x00000011, 0x000041D9,\n    0x00002AC2, 0x00002AC2, 0x00000002, 0x00000003, 0x0004007C, 0x00000013,\n    0x0000375E, 0x000041D9, 0x00050051, 0x0000000D, 0x00001B7E, 0x0000375E,\n    0x00000000, 0x00050051, 0x0000000D, 0x00004109, 0x0000375E, 0x00000001,\n    0x00070050, 0x0000001D, 0x00002352, 0x00001B7E, 0x00004109, 0x00000A0C,\n    0x00000A0C, 0x000200F9, 0x00004F24, 0x000200F8, 0x00004F24, 0x000900F5,\n    0x0000001D, 0x00002BF6, 0x00002352, 0x00004F57, 0x00004363, 0x00002159,\n    0x00002351, 0x00002036, 0x000900F5, 0x0000001D, 0x00003591, 0x00004279,\n    0x00004F57, 0x00006292, 0x00002159, 0x0000390F, 0x00002036, 0x000200F9,\n    0x00005310, 0x000200F8, 0x00005310, 0x000700F5, 0x0000001D, 0x0000230B,\n    0x00002BF6, 0x00004F24, 0x00002BF5, 0x00003F61, 0x000700F5, 0x0000001D,\n    0x00004C8A, 0x00003591, 0x00004F24, 0x00003590, 0x00003F61, 0x00050081,\n    0x0000001D, 0x000046B0, 0x000036E3, 0x00004C8A, 0x00050081, 0x0000001D,\n    0x0000455A, 0x00002662, 0x0000230B, 0x000500AE, 0x00000009, 0x0000387D,\n    0x00003F4D, 0x00000A1C, 0x000300F7, 0x00005EC8, 0x00000002, 0x000400FA,\n    0x0000387D, 0x000026B1, 0x00005EC8, 0x000200F8, 0x000026B1, 0x000500C4,\n    0x0000000B, 0x000037B2, 0x00000A16, 0x000023AA, 0x00050085, 0x0000000D,\n    0x00002F3A, 0x00002B2C, 0x0000016E, 0x00050080, 0x0000000B, 0x000051FC,\n    0x00005BEB, 0x000037B2, 0x000300F7, 0x00005311, 0x00000002, 0x000400FA,\n    0x00005AEF, 0x00003B67, 0x000040BB, 0x000200F8, 0x000040BB, 0x000500AA,\n    0x00000009, 0x00004ADD, 0x0000199B, 0x00000A16, 0x000300F7, 0x00004F4D,\n    0x00000002, 0x000400FA, 0x00004ADD, 0x000019C3, 0x00002303, 0x000200F8,\n    0x00002303, 0x000500C2, 0x0000000B, 0x00005634, 0x000051FC, 0x00000A11,\n    0x00060041, 0x00000289, 0x00003441, 0x00000CC7, 0x00000A0B, 0x00005634,\n    0x0004003D, 0x0000000B, 0x00003AD6, 0x00003441, 0x00050080, 0x0000000B,\n    0x00002149, 0x000051FC, 0x0000199B, 0x000500C2, 0x0000000B, 0x000054AA,\n    0x00002149, 0x00000A11, 0x00060041, 0x00000289, 0x00004903, 0x00000CC7,\n    0x00000A0B, 0x000054AA, 0x0004003D, 0x0000000B, 0x00005F5C, 0x00004903,\n    0x00050050, 0x00000011, 0x00005134, 0x00003AD6, 0x00005F5C, 0x000200F9,\n    0x00004F4D, 0x000200F8, 0x000019C3, 0x000500C2, 0x0000000B, 0x00005FAA,\n    0x000051FC, 0x00000A11, 0x00060041, 0x00000289, 0x00003442, 0x00000CC7,\n    0x00000A0B, 0x00005FAA, 0x0004003D, 0x0000000B, 0x00003149, 0x00003442,\n    0x00050080, 0x0000000B, 0x00002DB3, 0x00005FAA, 0x00000A0D, 0x00060041,\n    0x00000289, 0x00005FF4, 0x00000CC7, 0x00000A0B, 0x00002DB3, 0x0004003D,\n    0x0000000B, 0x00004001, 0x00005FF4, 0x00050050, 0x00000011, 0x00005135,\n    0x00003149, 0x00004001, 0x000200F9, 0x00004F4D, 0x000200F8, 0x00004F4D,\n    0x000700F5, 0x00000011, 0x00002AC3, 0x00005135, 0x000019C3, 0x00005134,\n    0x00002303, 0x000300F7, 0x00003F62, 0x00000000, 0x001300FB, 0x00002180,\n    0x00004BFD, 0x00000000, 0x000038FB, 0x00000001, 0x000038FB, 0x00000002,\n    0x00001CBF, 0x0000000A, 0x00001CBF, 0x00000003, 0x00001CBE, 0x0000000C,\n    0x00001CBE, 0x00000004, 0x00002000, 0x00000006, 0x00002037, 0x000200F8,\n    0x00002037, 0x00050051, 0x0000000B, 0x00005F5D, 0x00002AC3, 0x00000000,\n    0x0006000C, 0x00000013, 0x0000606B, 0x00000001, 0x0000003E, 0x00005F5D,\n    0x00050051, 0x0000000D, 0x0000276A, 0x0000606B, 0x00000000, 0x00050051,\n    0x0000000D, 0x0000444A, 0x0000606B, 0x00000001, 0x00070050, 0x0000001D,\n    0x00003910, 0x0000276A, 0x0000444A, 0x00000A0C, 0x00000A0C, 0x00050051,\n    0x0000000B, 0x0000437E, 0x00002AC3, 0x00000001, 0x0006000C, 0x00000013,\n    0x0000466F, 0x00000001, 0x0000003E, 0x0000437E, 0x00050051, 0x0000000D,\n    0x0000276B, 0x0000466F, 0x00000000, 0x00050051, 0x0000000D, 0x000050C2,\n    0x0000466F, 0x00000001, 0x00070050, 0x0000001D, 0x00002353, 0x0000276B,\n    0x000050C2, 0x00000A0C, 0x00000A0C, 0x000200F9, 0x00003F62, 0x000200F8,\n    0x00002000, 0x00050051, 0x0000000B, 0x0000308F, 0x00002AC3, 0x00000000,\n    0x0004007C, 0x0000000C, 0x0000589F, 0x0000308F, 0x00050050, 0x00000012,\n    0x0000471E, 0x0000589F, 0x0000589F, 0x000500C4, 0x00000012, 0x000047B1,\n    0x0000471E, 0x000007A7, 0x000500C3, 0x00000012, 0x0000341B, 0x000047B1,\n    0x00000867, 0x0004006F, 0x00000013, 0x00002AA3, 0x0000341B, 0x0005008E,\n    0x00000013, 0x0000474B, 0x00002AA3, 0x000007FE, 0x0007000C, 0x00000013,\n    0x00005E0A, 0x00000001, 0x00000028, 0x00000049, 0x0000474B, 0x00050051,\n    0x0000000D, 0x00005F0E, 0x00005E0A, 0x00000000, 0x00050051, 0x0000000D,\n    0x00003CD6, 0x00005E0A, 0x00000001, 0x00070050, 0x0000001D, 0x00004120,\n    0x00005F0E, 0x00003CD6, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B,\n    0x00004C44, 0x00002AC3, 0x00000001, 0x0004007C, 0x0000000C, 0x00003EA3,\n    0x00004C44, 0x00050050, 0x00000012, 0x0000471F, 0x00003EA3, 0x00003EA3,\n    0x000500C4, 0x00000012, 0x000047B2, 0x0000471F, 0x000007A7, 0x000500C3,\n    0x00000012, 0x0000341C, 0x000047B2, 0x00000867, 0x0004006F, 0x00000013,\n    0x00002AA4, 0x0000341C, 0x0005008E, 0x00000013, 0x0000474C, 0x00002AA4,\n    0x000007FE, 0x0007000C, 0x00000013, 0x00005E0B, 0x00000001, 0x00000028,\n    0x00000049, 0x0000474C, 0x00050051, 0x0000000D, 0x00005F0F, 0x00005E0B,\n    0x00000000, 0x00050051, 0x0000000D, 0x0000494E, 0x00005E0B, 0x00000001,\n    0x00070050, 0x0000001D, 0x00002354, 0x00005F0F, 0x0000494E, 0x00000A0C,\n    0x00000A0C, 0x000200F9, 0x00003F62, 0x000200F8, 0x00001CBE, 0x00050051,\n    0x0000000B, 0x000056C3, 0x00002AC3, 0x00000000, 0x00060050, 0x00000014,\n    0x00004F10, 0x000056C3, 0x000056C3, 0x000056C3, 0x000500C2, 0x00000014,\n    0x00002B13, 0x00004F10, 0x00000BB4, 0x000500C7, 0x00000014, 0x00005DEA,\n    0x00002B13, 0x00000105, 0x000500C7, 0x00000014, 0x000048A0, 0x00002B13,\n    0x00000466, 0x000500C2, 0x00000014, 0x00005B94, 0x00005DEA, 0x00000B0C,\n    0x000500AA, 0x00000010, 0x000040CD, 0x00005B94, 0x00000A12, 0x0006000C,\n    0x00000016, 0x00002C4F, 0x00000001, 0x0000004B, 0x000048A0, 0x0004007C,\n    0x00000014, 0x00002A19, 0x00002C4F, 0x00050082, 0x00000014, 0x0000187E,\n    0x00000B0C, 0x00002A19, 0x00050080, 0x00000014, 0x00002214, 0x00002A19,\n    0x00000938, 0x000600A9, 0x00000014, 0x00002873, 0x000040CD, 0x00002214,\n    0x00005B94, 0x000500C4, 0x00000014, 0x00005AD8, 0x000048A0, 0x0000187E,\n    0x000500C7, 0x00000014, 0x0000499E, 0x00005AD8, 0x00000466, 0x000600A9,\n    0x00000014, 0x00002AA5, 0x000040CD, 0x0000499E, 0x000048A0, 0x00050080,\n    0x00000014, 0x00005FFD, 0x00002873, 0x000003FA, 0x000500C4, 0x00000014,\n    0x00004F83, 0x00005FFD, 0x00000189, 0x000500C4, 0x00000014, 0x00003FAA,\n    0x00002AA5, 0x0000008D, 0x000500C5, 0x00000014, 0x00005780, 0x00004F83,\n    0x00003FAA, 0x000500AA, 0x00000010, 0x00003604, 0x00005DEA, 0x00000A12,\n    0x000600A9, 0x00000014, 0x00004246, 0x00003604, 0x00000A12, 0x00005780,\n    0x0004007C, 0x00000018, 0x000029D3, 0x00004246, 0x000500C2, 0x0000000B,\n    0x00004BA8, 0x000056C3, 0x00000A64, 0x00040070, 0x0000000D, 0x00004812,\n    0x00004BA8, 0x00050085, 0x0000000D, 0x00003E23, 0x00004812, 0x00000149,\n    0x00050051, 0x0000000D, 0x000053C6, 0x000029D3, 0x00000000, 0x00050051,\n    0x0000000D, 0x00002A59, 0x000029D3, 0x00000001, 0x00050051, 0x0000000D,\n    0x00001E9B, 0x000029D3, 0x00000002, 0x00070050, 0x0000001D, 0x00003DDC,\n    0x000053C6, 0x00002A59, 0x00001E9B, 0x00003E23, 0x00050051, 0x0000000B,\n    0x000027F7, 0x00002AC3, 0x00000001, 0x00060050, 0x00000014, 0x00003510,\n    0x000027F7, 0x000027F7, 0x000027F7, 0x000500C2, 0x00000014, 0x00002B14,\n    0x00003510, 0x00000BB4, 0x000500C7, 0x00000014, 0x00005DEB, 0x00002B14,\n    0x00000105, 0x000500C7, 0x00000014, 0x000048A1, 0x00002B14, 0x00000466,\n    0x000500C2, 0x00000014, 0x00005B95, 0x00005DEB, 0x00000B0C, 0x000500AA,\n    0x00000010, 0x000040CE, 0x00005B95, 0x00000A12, 0x0006000C, 0x00000016,\n    0x00002C50, 0x00000001, 0x0000004B, 0x000048A1, 0x0004007C, 0x00000014,\n    0x00002A1A, 0x00002C50, 0x00050082, 0x00000014, 0x0000187F, 0x00000B0C,\n    0x00002A1A, 0x00050080, 0x00000014, 0x00002215, 0x00002A1A, 0x00000938,\n    0x000600A9, 0x00000014, 0x00002874, 0x000040CE, 0x00002215, 0x00005B95,\n    0x000500C4, 0x00000014, 0x00005AD9, 0x000048A1, 0x0000187F, 0x000500C7,\n    0x00000014, 0x0000499F, 0x00005AD9, 0x00000466, 0x000600A9, 0x00000014,\n    0x00002AA6, 0x000040CE, 0x0000499F, 0x000048A1, 0x00050080, 0x00000014,\n    0x00005FFE, 0x00002874, 0x000003FA, 0x000500C4, 0x00000014, 0x00004F84,\n    0x00005FFE, 0x00000189, 0x000500C4, 0x00000014, 0x00003FAB, 0x00002AA6,\n    0x0000008D, 0x000500C5, 0x00000014, 0x00005781, 0x00004F84, 0x00003FAB,\n    0x000500AA, 0x00000010, 0x00003605, 0x00005DEB, 0x00000A12, 0x000600A9,\n    0x00000014, 0x00004247, 0x00003605, 0x00000A12, 0x00005781, 0x0004007C,\n    0x00000018, 0x000029D4, 0x00004247, 0x000500C2, 0x0000000B, 0x00004BA9,\n    0x000027F7, 0x00000A64, 0x00040070, 0x0000000D, 0x00004813, 0x00004BA9,\n    0x00050085, 0x0000000D, 0x00003E24, 0x00004813, 0x00000149, 0x00050051,\n    0x0000000D, 0x000053C7, 0x000029D4, 0x00000000, 0x00050051, 0x0000000D,\n    0x00002A5A, 0x000029D4, 0x00000001, 0x00050051, 0x0000000D, 0x00002B15,\n    0x000029D4, 0x00000002, 0x00070050, 0x0000001D, 0x00002355, 0x000053C7,\n    0x00002A5A, 0x00002B15, 0x00003E24, 0x000200F9, 0x00003F62, 0x000200F8,\n    0x00001CBF, 0x00050051, 0x0000000B, 0x000056C4, 0x00002AC3, 0x00000000,\n    0x00070050, 0x00000017, 0x00004F11, 0x000056C4, 0x000056C4, 0x000056C4,\n    0x000056C4, 0x000500C2, 0x00000017, 0x000024A0, 0x00004F11, 0x0000034D,\n    0x000500C7, 0x00000017, 0x000049AF, 0x000024A0, 0x0000027B, 0x00040070,\n    0x0000001D, 0x00003CB9, 0x000049AF, 0x00050085, 0x0000001D, 0x00004132,\n    0x00003CB9, 0x00000AEE, 0x00050051, 0x0000000B, 0x00005CD4, 0x00002AC3,\n    0x00000001, 0x00070050, 0x00000017, 0x0000514F, 0x00005CD4, 0x00005CD4,\n    0x00005CD4, 0x00005CD4, 0x000500C2, 0x00000017, 0x000024A1, 0x0000514F,\n    0x0000034D, 0x000500C7, 0x00000017, 0x000049B0, 0x000024A1, 0x0000027B,\n    0x00040070, 0x0000001D, 0x00004931, 0x000049B0, 0x00050085, 0x0000001D,\n    0x000026A1, 0x00004931, 0x00000AEE, 0x000200F9, 0x00003F62, 0x000200F8,\n    0x000038FB, 0x00050051, 0x0000000B, 0x000056C5, 0x00002AC3, 0x00000000,\n    0x00070050, 0x00000017, 0x00004F12, 0x000056C5, 0x000056C5, 0x000056C5,\n    0x000056C5, 0x000500C2, 0x00000017, 0x000024A2, 0x00004F12, 0x0000028D,\n    0x000500C7, 0x00000017, 0x00004A5A, 0x000024A2, 0x0000064B, 0x00040070,\n    0x0000001D, 0x000036A4, 0x00004A5A, 0x0005008E, 0x0000001D, 0x00004B25,\n    0x000036A4, 0x0000017A, 0x00050051, 0x0000000B, 0x000021A1, 0x00002AC3,\n    0x00000001, 0x00070050, 0x00000017, 0x0000610D, 0x000021A1, 0x000021A1,\n    0x000021A1, 0x000021A1, 0x000500C2, 0x00000017, 0x000024A3, 0x0000610D,\n    0x0000028D, 0x000500C7, 0x00000017, 0x00004A5B, 0x000024A3, 0x0000064B,\n    0x00040070, 0x0000001D, 0x0000431C, 0x00004A5B, 0x0005008E, 0x0000001D,\n    0x00003094, 0x0000431C, 0x0000017A, 0x000200F9, 0x00003F62, 0x000200F8,\n    0x00004BFD, 0x00050051, 0x0000000B, 0x00003090, 0x00002AC3, 0x00000000,\n    0x0004007C, 0x0000000D, 0x00004FF0, 0x00003090, 0x00050050, 0x00000013,\n    0x00004338, 0x00004FF0, 0x00000A0C, 0x0009004F, 0x0000001D, 0x00002D92,\n    0x00004338, 0x00004338, 0x00000000, 0x00000001, 0x00000001, 0x00000001,\n    0x00050051, 0x0000000B, 0x000056B3, 0x00002AC3, 0x00000001, 0x0004007C,\n    0x0000000D, 0x00003F6A, 0x000056B3, 0x00050050, 0x00000013, 0x00004FB0,\n    0x00003F6A, 0x00000A0C, 0x0009004F, 0x0000001D, 0x00005A3C, 0x00004FB0,\n    0x00004FB0, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x000200F9,\n    0x00003F62, 0x000200F8, 0x00003F62, 0x000F00F5, 0x0000001D, 0x00002BF7,\n    0x00005A3C, 0x00004BFD, 0x00003094, 0x000038FB, 0x000026A1, 0x00001CBF,\n    0x00002355, 0x00001CBE, 0x00002354, 0x00002000, 0x00002353, 0x00002037,\n    0x000F00F5, 0x0000001D, 0x00003592, 0x00002D92, 0x00004BFD, 0x00004B25,\n    0x000038FB, 0x00004132, 0x00001CBF, 0x00003DDC, 0x00001CBE, 0x00004120,\n    0x00002000, 0x00003910, 0x00002037, 0x000200F9, 0x00005311, 0x000200F8,\n    0x00003B67, 0x000500AA, 0x00000009, 0x00005452, 0x0000199B, 0x00000A22,\n    0x000300F7, 0x00004F4E, 0x00000002, 0x000400FA, 0x00005452, 0x000019C4,\n    0x00002304, 0x000200F8, 0x00002304, 0x000500C2, 0x0000000B, 0x00005635,\n    0x000051FC, 0x00000A11, 0x00060041, 0x00000289, 0x00003443, 0x00000CC7,\n    0x00000A0B, 0x00005635, 0x0004003D, 0x0000000B, 0x0000314A, 0x00003443,\n    0x00050080, 0x0000000B, 0x00002DB4, 0x00005635, 0x00000A0D, 0x00060041,\n    0x00000289, 0x00001905, 0x00000CC7, 0x00000A0B, 0x00002DB4, 0x0004003D,\n    0x0000000B, 0x00001B78, 0x00001905, 0x00050080, 0x0000000B, 0x0000214A,\n    0x000051FC, 0x0000199B, 0x000500C2, 0x0000000B, 0x000054AB, 0x0000214A,\n    0x00000A11, 0x00060041, 0x00000289, 0x00004C93, 0x00000CC7, 0x00000A0B,\n    0x000054AB, 0x0004003D, 0x0000000B, 0x0000314B, 0x00004C93, 0x00050080,\n    0x0000000B, 0x00002DB5, 0x000054AB, 0x00000A0D, 0x00060041, 0x00000289,\n    0x00005FF5, 0x00000CC7, 0x00000A0B, 0x00002DB5, 0x0004003D, 0x0000000B,\n    0x00004002, 0x00005FF5, 0x00070050, 0x00000017, 0x00005136, 0x0000314A,\n    0x00001B78, 0x0000314B, 0x00004002, 0x000200F9, 0x00004F4E, 0x000200F8,\n    0x000019C4, 0x000500C2, 0x0000000B, 0x00005FAB, 0x000051FC, 0x00000A11,\n    0x00060041, 0x00000289, 0x00003444, 0x00000CC7, 0x00000A0B, 0x00005FAB,\n    0x0004003D, 0x0000000B, 0x0000314C, 0x00003444, 0x00050080, 0x0000000B,\n    0x00002DB6, 0x00005FAB, 0x00000A0D, 0x00060041, 0x00000289, 0x00001906,\n    0x00000CC7, 0x00000A0B, 0x00002DB6, 0x0004003D, 0x0000000B, 0x00005C66,\n    0x00001906, 0x00050080, 0x0000000B, 0x00002DB7, 0x00005FAB, 0x00000A10,\n    0x00060041, 0x00000289, 0x00001907, 0x00000CC7, 0x00000A0B, 0x00002DB7,\n    0x0004003D, 0x0000000B, 0x00005C67, 0x00001907, 0x00050080, 0x0000000B,\n    0x00002DB8, 0x00005FAB, 0x00000A13, 0x00060041, 0x00000289, 0x00005FF6,\n    0x00000CC7, 0x00000A0B, 0x00002DB8, 0x0004003D, 0x0000000B, 0x00004003,\n    0x00005FF6, 0x00070050, 0x00000017, 0x00005137, 0x0000314C, 0x00005C66,\n    0x00005C67, 0x00004003, 0x000200F9, 0x00004F4E, 0x000200F8, 0x00004F4E,\n    0x000700F5, 0x00000017, 0x00002AC4, 0x00005137, 0x000019C4, 0x00005136,\n    0x00002304, 0x000300F7, 0x00004F25, 0x00000000, 0x000700FB, 0x00002180,\n    0x00004F58, 0x00000005, 0x0000215A, 0x00000007, 0x00002038, 0x000200F8,\n    0x00002038, 0x00050051, 0x0000000B, 0x00005F5E, 0x00002AC4, 0x00000000,\n    0x0006000C, 0x00000013, 0x0000606C, 0x00000001, 0x0000003E, 0x00005F5E,\n    0x00050051, 0x0000000D, 0x00002779, 0x0000606C, 0x00000000, 0x00050051,\n    0x0000000D, 0x00003EBC, 0x0000606C, 0x00000001, 0x00050051, 0x0000000B,\n    0x00004285, 0x00002AC4, 0x00000001, 0x0006000C, 0x00000013, 0x00003CF9,\n    0x00000001, 0x0000003E, 0x00004285, 0x00050051, 0x0000000D, 0x0000276C,\n    0x00003CF9, 0x00000000, 0x00050051, 0x0000000D, 0x0000444B, 0x00003CF9,\n    0x00000001, 0x00070050, 0x0000001D, 0x00003911, 0x00002779, 0x00003EBC,\n    0x0000276C, 0x0000444B, 0x00050051, 0x0000000B, 0x0000437F, 0x00002AC4,\n    0x00000002, 0x0006000C, 0x00000013, 0x00004670, 0x00000001, 0x0000003E,\n    0x0000437F, 0x00050051, 0x0000000D, 0x0000277A, 0x00004670, 0x00000000,\n    0x00050051, 0x0000000D, 0x00003EBD, 0x00004670, 0x00000001, 0x00050051,\n    0x0000000B, 0x00004286, 0x00002AC4, 0x00000003, 0x0006000C, 0x00000013,\n    0x00003CFA, 0x00000001, 0x0000003E, 0x00004286, 0x00050051, 0x0000000D,\n    0x0000276D, 0x00003CFA, 0x00000000, 0x00050051, 0x0000000D, 0x000050C3,\n    0x00003CFA, 0x00000001, 0x00070050, 0x0000001D, 0x00002356, 0x0000277A,\n    0x00003EBD, 0x0000276D, 0x000050C3, 0x000200F9, 0x00004F25, 0x000200F8,\n    0x0000215A, 0x0007004F, 0x00000011, 0x000025FD, 0x00002AC4, 0x00002AC4,\n    0x00000000, 0x00000001, 0x0004007C, 0x00000012, 0x00005B3E, 0x000025FD,\n    0x0009004F, 0x0000001A, 0x000060D2, 0x00005B3E, 0x00005B3E, 0x00000000,\n    0x00000000, 0x00000001, 0x00000001, 0x000500C4, 0x0000001A, 0x000048AA,\n    0x000060D2, 0x00000122, 0x000500C3, 0x0000001A, 0x00003D91, 0x000048AA,\n    0x00000302, 0x0004006F, 0x0000001D, 0x00002AA7, 0x00003D91, 0x0005008E,\n    0x0000001D, 0x00004723, 0x00002AA7, 0x000007FE, 0x0007000C, 0x0000001D,\n    0x00006293, 0x00000001, 0x00000028, 0x00000504, 0x00004723, 0x0007004F,\n    0x00000011, 0x0000376D, 0x00002AC4, 0x00002AC4, 0x00000002, 0x00000003,\n    0x0004007C, 0x00000012, 0x000024C1, 0x0000376D, 0x0009004F, 0x0000001A,\n    0x000060D3, 0x000024C1, 0x000024C1, 0x00000000, 0x00000000, 0x00000001,\n    0x00000001, 0x000500C4, 0x0000001A, 0x000048AB, 0x000060D3, 0x00000122,\n    0x000500C3, 0x0000001A, 0x00003D92, 0x000048AB, 0x00000302, 0x0004006F,\n    0x0000001D, 0x00002AA8, 0x00003D92, 0x0005008E, 0x0000001D, 0x000053C1,\n    0x00002AA8, 0x000007FE, 0x0007000C, 0x0000001D, 0x00004364, 0x00000001,\n    0x00000028, 0x00000504, 0x000053C1, 0x000200F9, 0x00004F25, 0x000200F8,\n    0x00004F58, 0x0007004F, 0x00000011, 0x00002623, 0x00002AC4, 0x00002AC4,\n    0x00000000, 0x00000001, 0x0004007C, 0x00000013, 0x0000515B, 0x00002623,\n    0x00050051, 0x0000000D, 0x00001B7F, 0x0000515B, 0x00000000, 0x00050051,\n    0x0000000D, 0x0000346C, 0x0000515B, 0x00000001, 0x00070050, 0x0000001D,\n    0x0000427A, 0x00001B7F, 0x0000346C, 0x00000A0C, 0x00000A0C, 0x0007004F,\n    0x00000011, 0x000041DA, 0x00002AC4, 0x00002AC4, 0x00000002, 0x00000003,\n    0x0004007C, 0x00000013, 0x0000375F, 0x000041DA, 0x00050051, 0x0000000D,\n    0x00001B80, 0x0000375F, 0x00000000, 0x00050051, 0x0000000D, 0x0000410A,\n    0x0000375F, 0x00000001, 0x00070050, 0x0000001D, 0x00002357, 0x00001B80,\n    0x0000410A, 0x00000A0C, 0x00000A0C, 0x000200F9, 0x00004F25, 0x000200F8,\n    0x00004F25, 0x000900F5, 0x0000001D, 0x00002BF8, 0x00002357, 0x00004F58,\n    0x00004364, 0x0000215A, 0x00002356, 0x00002038, 0x000900F5, 0x0000001D,\n    0x00003593, 0x0000427A, 0x00004F58, 0x00006293, 0x0000215A, 0x00003911,\n    0x00002038, 0x000200F9, 0x00005311, 0x000200F8, 0x00005311, 0x000700F5,\n    0x0000001D, 0x0000230C, 0x00002BF8, 0x00004F25, 0x00002BF7, 0x00003F62,\n    0x000700F5, 0x0000001D, 0x00004C8B, 0x00003593, 0x00004F25, 0x00003592,\n    0x00003F62, 0x00050081, 0x0000001D, 0x00004346, 0x000046B0, 0x00004C8B,\n    0x00050081, 0x0000001D, 0x000019F1, 0x0000455A, 0x0000230C, 0x00050080,\n    0x0000000B, 0x00003FF8, 0x00005E78, 0x000037B2, 0x000300F7, 0x00005312,\n    0x00000002, 0x000400FA, 0x00005AEF, 0x00003B68, 0x000040BC, 0x000200F8,\n    0x000040BC, 0x000500AA, 0x00000009, 0x00004ADE, 0x0000199B, 0x00000A16,\n    0x000300F7, 0x00004F4F, 0x00000002, 0x000400FA, 0x00004ADE, 0x000019C5,\n    0x00002305, 0x000200F8, 0x00002305, 0x000500C2, 0x0000000B, 0x00005636,\n    0x00003FF8, 0x00000A11, 0x00060041, 0x00000289, 0x00003445, 0x00000CC7,\n    0x00000A0B, 0x00005636, 0x0004003D, 0x0000000B, 0x00003AD7, 0x00003445,\n    0x00050080, 0x0000000B, 0x0000214B, 0x00003FF8, 0x0000199B, 0x000500C2,\n    0x0000000B, 0x000054AC, 0x0000214B, 0x00000A11, 0x00060041, 0x00000289,\n    0x00004904, 0x00000CC7, 0x00000A0B, 0x000054AC, 0x0004003D, 0x0000000B,\n    0x00005F5F, 0x00004904, 0x00050050, 0x00000011, 0x00005138, 0x00003AD7,\n    0x00005F5F, 0x000200F9, 0x00004F4F, 0x000200F8, 0x000019C5, 0x000500C2,\n    0x0000000B, 0x00005FAC, 0x00003FF8, 0x00000A11, 0x00060041, 0x00000289,\n    0x00003446, 0x00000CC7, 0x00000A0B, 0x00005FAC, 0x0004003D, 0x0000000B,\n    0x0000314D, 0x00003446, 0x00050080, 0x0000000B, 0x00002DB9, 0x00005FAC,\n    0x00000A0D, 0x00060041, 0x00000289, 0x00005FF7, 0x00000CC7, 0x00000A0B,\n    0x00002DB9, 0x0004003D, 0x0000000B, 0x00004004, 0x00005FF7, 0x00050050,\n    0x00000011, 0x00005139, 0x0000314D, 0x00004004, 0x000200F9, 0x00004F4F,\n    0x000200F8, 0x00004F4F, 0x000700F5, 0x00000011, 0x00002AC5, 0x00005139,\n    0x000019C5, 0x00005138, 0x00002305, 0x000300F7, 0x00003F63, 0x00000000,\n    0x001300FB, 0x00002180, 0x00004BFE, 0x00000000, 0x000038FC, 0x00000001,\n    0x000038FC, 0x00000002, 0x00001CC1, 0x0000000A, 0x00001CC1, 0x00000003,\n    0x00001CC0, 0x0000000C, 0x00001CC0, 0x00000004, 0x00002001, 0x00000006,\n    0x00002039, 0x000200F8, 0x00002039, 0x00050051, 0x0000000B, 0x00005F60,\n    0x00002AC5, 0x00000000, 0x0006000C, 0x00000013, 0x0000606D, 0x00000001,\n    0x0000003E, 0x00005F60, 0x00050051, 0x0000000D, 0x0000276E, 0x0000606D,\n    0x00000000, 0x00050051, 0x0000000D, 0x0000444C, 0x0000606D, 0x00000001,\n    0x00070050, 0x0000001D, 0x00003912, 0x0000276E, 0x0000444C, 0x00000A0C,\n    0x00000A0C, 0x00050051, 0x0000000B, 0x00004380, 0x00002AC5, 0x00000001,\n    0x0006000C, 0x00000013, 0x00004671, 0x00000001, 0x0000003E, 0x00004380,\n    0x00050051, 0x0000000D, 0x0000276F, 0x00004671, 0x00000000, 0x00050051,\n    0x0000000D, 0x000050C4, 0x00004671, 0x00000001, 0x00070050, 0x0000001D,\n    0x00002358, 0x0000276F, 0x000050C4, 0x00000A0C, 0x00000A0C, 0x000200F9,\n    0x00003F63, 0x000200F8, 0x00002001, 0x00050051, 0x0000000B, 0x00003091,\n    0x00002AC5, 0x00000000, 0x0004007C, 0x0000000C, 0x000058A0, 0x00003091,\n    0x00050050, 0x00000012, 0x00004720, 0x000058A0, 0x000058A0, 0x000500C4,\n    0x00000012, 0x000047B3, 0x00004720, 0x000007A7, 0x000500C3, 0x00000012,\n    0x0000341D, 0x000047B3, 0x00000867, 0x0004006F, 0x00000013, 0x00002AA9,\n    0x0000341D, 0x0005008E, 0x00000013, 0x0000474D, 0x00002AA9, 0x000007FE,\n    0x0007000C, 0x00000013, 0x00005E0C, 0x00000001, 0x00000028, 0x00000049,\n    0x0000474D, 0x00050051, 0x0000000D, 0x00005F10, 0x00005E0C, 0x00000000,\n    0x00050051, 0x0000000D, 0x00003CD7, 0x00005E0C, 0x00000001, 0x00070050,\n    0x0000001D, 0x00004121, 0x00005F10, 0x00003CD7, 0x00000A0C, 0x00000A0C,\n    0x00050051, 0x0000000B, 0x00004C45, 0x00002AC5, 0x00000001, 0x0004007C,\n    0x0000000C, 0x00003EA4, 0x00004C45, 0x00050050, 0x00000012, 0x00004724,\n    0x00003EA4, 0x00003EA4, 0x000500C4, 0x00000012, 0x000047B4, 0x00004724,\n    0x000007A7, 0x000500C3, 0x00000012, 0x0000341E, 0x000047B4, 0x00000867,\n    0x0004006F, 0x00000013, 0x00002AAA, 0x0000341E, 0x0005008E, 0x00000013,\n    0x0000474E, 0x00002AAA, 0x000007FE, 0x0007000C, 0x00000013, 0x00005E0D,\n    0x00000001, 0x00000028, 0x00000049, 0x0000474E, 0x00050051, 0x0000000D,\n    0x00005F11, 0x00005E0D, 0x00000000, 0x00050051, 0x0000000D, 0x0000494F,\n    0x00005E0D, 0x00000001, 0x00070050, 0x0000001D, 0x00002359, 0x00005F11,\n    0x0000494F, 0x00000A0C, 0x00000A0C, 0x000200F9, 0x00003F63, 0x000200F8,\n    0x00001CC0, 0x00050051, 0x0000000B, 0x000056C6, 0x00002AC5, 0x00000000,\n    0x00060050, 0x00000014, 0x00004F13, 0x000056C6, 0x000056C6, 0x000056C6,\n    0x000500C2, 0x00000014, 0x00002B16, 0x00004F13, 0x00000BB4, 0x000500C7,\n    0x00000014, 0x00005DEC, 0x00002B16, 0x00000105, 0x000500C7, 0x00000014,\n    0x000048A2, 0x00002B16, 0x00000466, 0x000500C2, 0x00000014, 0x00005B96,\n    0x00005DEC, 0x00000B0C, 0x000500AA, 0x00000010, 0x000040CF, 0x00005B96,\n    0x00000A12, 0x0006000C, 0x00000016, 0x00002C51, 0x00000001, 0x0000004B,\n    0x000048A2, 0x0004007C, 0x00000014, 0x00002A1B, 0x00002C51, 0x00050082,\n    0x00000014, 0x00001880, 0x00000B0C, 0x00002A1B, 0x00050080, 0x00000014,\n    0x00002216, 0x00002A1B, 0x00000938, 0x000600A9, 0x00000014, 0x00002875,\n    0x000040CF, 0x00002216, 0x00005B96, 0x000500C4, 0x00000014, 0x00005ADA,\n    0x000048A2, 0x00001880, 0x000500C7, 0x00000014, 0x000049A0, 0x00005ADA,\n    0x00000466, 0x000600A9, 0x00000014, 0x00002AAB, 0x000040CF, 0x000049A0,\n    0x000048A2, 0x00050080, 0x00000014, 0x00005FFF, 0x00002875, 0x000003FA,\n    0x000500C4, 0x00000014, 0x00004F85, 0x00005FFF, 0x00000189, 0x000500C4,\n    0x00000014, 0x00003FAC, 0x00002AAB, 0x0000008D, 0x000500C5, 0x00000014,\n    0x00005782, 0x00004F85, 0x00003FAC, 0x000500AA, 0x00000010, 0x00003606,\n    0x00005DEC, 0x00000A12, 0x000600A9, 0x00000014, 0x00004248, 0x00003606,\n    0x00000A12, 0x00005782, 0x0004007C, 0x00000018, 0x000029D5, 0x00004248,\n    0x000500C2, 0x0000000B, 0x00004BAA, 0x000056C6, 0x00000A64, 0x00040070,\n    0x0000000D, 0x00004814, 0x00004BAA, 0x00050085, 0x0000000D, 0x00003E25,\n    0x00004814, 0x00000149, 0x00050051, 0x0000000D, 0x000053C8, 0x000029D5,\n    0x00000000, 0x00050051, 0x0000000D, 0x00002A5B, 0x000029D5, 0x00000001,\n    0x00050051, 0x0000000D, 0x00001E9C, 0x000029D5, 0x00000002, 0x00070050,\n    0x0000001D, 0x00003DDD, 0x000053C8, 0x00002A5B, 0x00001E9C, 0x00003E25,\n    0x00050051, 0x0000000B, 0x000027F8, 0x00002AC5, 0x00000001, 0x00060050,\n    0x00000014, 0x00003511, 0x000027F8, 0x000027F8, 0x000027F8, 0x000500C2,\n    0x00000014, 0x00002B17, 0x00003511, 0x00000BB4, 0x000500C7, 0x00000014,\n    0x00005DED, 0x00002B17, 0x00000105, 0x000500C7, 0x00000014, 0x000048A3,\n    0x00002B17, 0x00000466, 0x000500C2, 0x00000014, 0x00005B97, 0x00005DED,\n    0x00000B0C, 0x000500AA, 0x00000010, 0x000040D0, 0x00005B97, 0x00000A12,\n    0x0006000C, 0x00000016, 0x00002C52, 0x00000001, 0x0000004B, 0x000048A3,\n    0x0004007C, 0x00000014, 0x00002A1C, 0x00002C52, 0x00050082, 0x00000014,\n    0x00001881, 0x00000B0C, 0x00002A1C, 0x00050080, 0x00000014, 0x00002217,\n    0x00002A1C, 0x00000938, 0x000600A9, 0x00000014, 0x00002876, 0x000040D0,\n    0x00002217, 0x00005B97, 0x000500C4, 0x00000014, 0x00005ADB, 0x000048A3,\n    0x00001881, 0x000500C7, 0x00000014, 0x000049A1, 0x00005ADB, 0x00000466,\n    0x000600A9, 0x00000014, 0x00002AAC, 0x000040D0, 0x000049A1, 0x000048A3,\n    0x00050080, 0x00000014, 0x00006000, 0x00002876, 0x000003FA, 0x000500C4,\n    0x00000014, 0x00004F86, 0x00006000, 0x00000189, 0x000500C4, 0x00000014,\n    0x00003FAD, 0x00002AAC, 0x0000008D, 0x000500C5, 0x00000014, 0x00005783,\n    0x00004F86, 0x00003FAD, 0x000500AA, 0x00000010, 0x00003607, 0x00005DED,\n    0x00000A12, 0x000600A9, 0x00000014, 0x00004249, 0x00003607, 0x00000A12,\n    0x00005783, 0x0004007C, 0x00000018, 0x000029D6, 0x00004249, 0x000500C2,\n    0x0000000B, 0x00004BAB, 0x000027F8, 0x00000A64, 0x00040070, 0x0000000D,\n    0x00004815, 0x00004BAB, 0x00050085, 0x0000000D, 0x00003E26, 0x00004815,\n    0x00000149, 0x00050051, 0x0000000D, 0x000053C9, 0x000029D6, 0x00000000,\n    0x00050051, 0x0000000D, 0x00002A5C, 0x000029D6, 0x00000001, 0x00050051,\n    0x0000000D, 0x00002B18, 0x000029D6, 0x00000002, 0x00070050, 0x0000001D,\n    0x0000235A, 0x000053C9, 0x00002A5C, 0x00002B18, 0x00003E26, 0x000200F9,\n    0x00003F63, 0x000200F8, 0x00001CC1, 0x00050051, 0x0000000B, 0x000056C7,\n    0x00002AC5, 0x00000000, 0x00070050, 0x00000017, 0x00004F14, 0x000056C7,\n    0x000056C7, 0x000056C7, 0x000056C7, 0x000500C2, 0x00000017, 0x000024A4,\n    0x00004F14, 0x0000034D, 0x000500C7, 0x00000017, 0x000049B1, 0x000024A4,\n    0x0000027B, 0x00040070, 0x0000001D, 0x00003CBA, 0x000049B1, 0x00050085,\n    0x0000001D, 0x00004133, 0x00003CBA, 0x00000AEE, 0x00050051, 0x0000000B,\n    0x00005CD5, 0x00002AC5, 0x00000001, 0x00070050, 0x00000017, 0x00005150,\n    0x00005CD5, 0x00005CD5, 0x00005CD5, 0x00005CD5, 0x000500C2, 0x00000017,\n    0x000024A5, 0x00005150, 0x0000034D, 0x000500C7, 0x00000017, 0x000049B2,\n    0x000024A5, 0x0000027B, 0x00040070, 0x0000001D, 0x00004932, 0x000049B2,\n    0x00050085, 0x0000001D, 0x000026A2, 0x00004932, 0x00000AEE, 0x000200F9,\n    0x00003F63, 0x000200F8, 0x000038FC, 0x00050051, 0x0000000B, 0x000056C8,\n    0x00002AC5, 0x00000000, 0x00070050, 0x00000017, 0x00004F15, 0x000056C8,\n    0x000056C8, 0x000056C8, 0x000056C8, 0x000500C2, 0x00000017, 0x000024A6,\n    0x00004F15, 0x0000028D, 0x000500C7, 0x00000017, 0x00004A5C, 0x000024A6,\n    0x0000064B, 0x00040070, 0x0000001D, 0x000036A5, 0x00004A5C, 0x0005008E,\n    0x0000001D, 0x00004B26, 0x000036A5, 0x0000017A, 0x00050051, 0x0000000B,\n    0x000021A2, 0x00002AC5, 0x00000001, 0x00070050, 0x00000017, 0x0000610E,\n    0x000021A2, 0x000021A2, 0x000021A2, 0x000021A2, 0x000500C2, 0x00000017,\n    0x000024A7, 0x0000610E, 0x0000028D, 0x000500C7, 0x00000017, 0x00004A5D,\n    0x000024A7, 0x0000064B, 0x00040070, 0x0000001D, 0x0000431D, 0x00004A5D,\n    0x0005008E, 0x0000001D, 0x00003095, 0x0000431D, 0x0000017A, 0x000200F9,\n    0x00003F63, 0x000200F8, 0x00004BFE, 0x00050051, 0x0000000B, 0x00003096,\n    0x00002AC5, 0x00000000, 0x0004007C, 0x0000000D, 0x00004FF1, 0x00003096,\n    0x00050050, 0x00000013, 0x00004339, 0x00004FF1, 0x00000A0C, 0x0009004F,\n    0x0000001D, 0x00002D93, 0x00004339, 0x00004339, 0x00000000, 0x00000001,\n    0x00000001, 0x00000001, 0x00050051, 0x0000000B, 0x000056B4, 0x00002AC5,\n    0x00000001, 0x0004007C, 0x0000000D, 0x00003F6B, 0x000056B4, 0x00050050,\n    0x00000013, 0x00004FB1, 0x00003F6B, 0x00000A0C, 0x0009004F, 0x0000001D,\n    0x00005A3D, 0x00004FB1, 0x00004FB1, 0x00000000, 0x00000001, 0x00000001,\n    0x00000001, 0x000200F9, 0x00003F63, 0x000200F8, 0x00003F63, 0x000F00F5,\n    0x0000001D, 0x00002BF9, 0x00005A3D, 0x00004BFE, 0x00003095, 0x000038FC,\n    0x000026A2, 0x00001CC1, 0x0000235A, 0x00001CC0, 0x00002359, 0x00002001,\n    0x00002358, 0x00002039, 0x000F00F5, 0x0000001D, 0x00003594, 0x00002D93,\n    0x00004BFE, 0x00004B26, 0x000038FC, 0x00004133, 0x00001CC1, 0x00003DDD,\n    0x00001CC0, 0x00004121, 0x00002001, 0x00003912, 0x00002039, 0x000200F9,\n    0x00005312, 0x000200F8, 0x00003B68, 0x000500AA, 0x00000009, 0x00005453,\n    0x0000199B, 0x00000A22, 0x000300F7, 0x00004F50, 0x00000002, 0x000400FA,\n    0x00005453, 0x000019C6, 0x00002306, 0x000200F8, 0x00002306, 0x000500C2,\n    0x0000000B, 0x00005637, 0x00003FF8, 0x00000A11, 0x00060041, 0x00000289,\n    0x00003447, 0x00000CC7, 0x00000A0B, 0x00005637, 0x0004003D, 0x0000000B,\n    0x0000314E, 0x00003447, 0x00050080, 0x0000000B, 0x00002DBA, 0x00005637,\n    0x00000A0D, 0x00060041, 0x00000289, 0x00001908, 0x00000CC7, 0x00000A0B,\n    0x00002DBA, 0x0004003D, 0x0000000B, 0x00001B79, 0x00001908, 0x00050080,\n    0x0000000B, 0x0000214C, 0x00003FF8, 0x0000199B, 0x000500C2, 0x0000000B,\n    0x000054AD, 0x0000214C, 0x00000A11, 0x00060041, 0x00000289, 0x00004C94,\n    0x00000CC7, 0x00000A0B, 0x000054AD, 0x0004003D, 0x0000000B, 0x0000314F,\n    0x00004C94, 0x00050080, 0x0000000B, 0x00002DBB, 0x000054AD, 0x00000A0D,\n    0x00060041, 0x00000289, 0x00005FF8, 0x00000CC7, 0x00000A0B, 0x00002DBB,\n    0x0004003D, 0x0000000B, 0x00004005, 0x00005FF8, 0x00070050, 0x00000017,\n    0x0000513A, 0x0000314E, 0x00001B79, 0x0000314F, 0x00004005, 0x000200F9,\n    0x00004F50, 0x000200F8, 0x000019C6, 0x000500C2, 0x0000000B, 0x00005FAD,\n    0x00003FF8, 0x00000A11, 0x00060041, 0x00000289, 0x00003448, 0x00000CC7,\n    0x00000A0B, 0x00005FAD, 0x0004003D, 0x0000000B, 0x00003150, 0x00003448,\n    0x00050080, 0x0000000B, 0x00002DBC, 0x00005FAD, 0x00000A0D, 0x00060041,\n    0x00000289, 0x00001909, 0x00000CC7, 0x00000A0B, 0x00002DBC, 0x0004003D,\n    0x0000000B, 0x00005C68, 0x00001909, 0x00050080, 0x0000000B, 0x00002DBD,\n    0x00005FAD, 0x00000A10, 0x00060041, 0x00000289, 0x0000190A, 0x00000CC7,\n    0x00000A0B, 0x00002DBD, 0x0004003D, 0x0000000B, 0x00005C69, 0x0000190A,\n    0x00050080, 0x0000000B, 0x00002DBE, 0x00005FAD, 0x00000A13, 0x00060041,\n    0x00000289, 0x00006001, 0x00000CC7, 0x00000A0B, 0x00002DBE, 0x0004003D,\n    0x0000000B, 0x00004006, 0x00006001, 0x00070050, 0x00000017, 0x0000513B,\n    0x00003150, 0x00005C68, 0x00005C69, 0x00004006, 0x000200F9, 0x00004F50,\n    0x000200F8, 0x00004F50, 0x000700F5, 0x00000017, 0x00002AC6, 0x0000513B,\n    0x000019C6, 0x0000513A, 0x00002306, 0x000300F7, 0x00004F26, 0x00000000,\n    0x000700FB, 0x00002180, 0x00004F59, 0x00000005, 0x0000215B, 0x00000007,\n    0x0000203A, 0x000200F8, 0x0000203A, 0x00050051, 0x0000000B, 0x00005F61,\n    0x00002AC6, 0x00000000, 0x0006000C, 0x00000013, 0x0000606E, 0x00000001,\n    0x0000003E, 0x00005F61, 0x00050051, 0x0000000D, 0x0000277B, 0x0000606E,\n    0x00000000, 0x00050051, 0x0000000D, 0x00003EBE, 0x0000606E, 0x00000001,\n    0x00050051, 0x0000000B, 0x00004287, 0x00002AC6, 0x00000001, 0x0006000C,\n    0x00000013, 0x00003CFB, 0x00000001, 0x0000003E, 0x00004287, 0x00050051,\n    0x0000000D, 0x00002770, 0x00003CFB, 0x00000000, 0x00050051, 0x0000000D,\n    0x0000444D, 0x00003CFB, 0x00000001, 0x00070050, 0x0000001D, 0x00003913,\n    0x0000277B, 0x00003EBE, 0x00002770, 0x0000444D, 0x00050051, 0x0000000B,\n    0x00004381, 0x00002AC6, 0x00000002, 0x0006000C, 0x00000013, 0x00004672,\n    0x00000001, 0x0000003E, 0x00004381, 0x00050051, 0x0000000D, 0x0000277C,\n    0x00004672, 0x00000000, 0x00050051, 0x0000000D, 0x00003EBF, 0x00004672,\n    0x00000001, 0x00050051, 0x0000000B, 0x00004288, 0x00002AC6, 0x00000003,\n    0x0006000C, 0x00000013, 0x00003CFC, 0x00000001, 0x0000003E, 0x00004288,\n    0x00050051, 0x0000000D, 0x00002771, 0x00003CFC, 0x00000000, 0x00050051,\n    0x0000000D, 0x000050C5, 0x00003CFC, 0x00000001, 0x00070050, 0x0000001D,\n    0x0000235B, 0x0000277C, 0x00003EBF, 0x00002771, 0x000050C5, 0x000200F9,\n    0x00004F26, 0x000200F8, 0x0000215B, 0x0007004F, 0x00000011, 0x000025FE,\n    0x00002AC6, 0x00002AC6, 0x00000000, 0x00000001, 0x0004007C, 0x00000012,\n    0x00005B3F, 0x000025FE, 0x0009004F, 0x0000001A, 0x000060D4, 0x00005B3F,\n    0x00005B3F, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x000500C4,\n    0x0000001A, 0x000048AC, 0x000060D4, 0x00000122, 0x000500C3, 0x0000001A,\n    0x00003D93, 0x000048AC, 0x00000302, 0x0004006F, 0x0000001D, 0x00002AAD,\n    0x00003D93, 0x0005008E, 0x0000001D, 0x00004725, 0x00002AAD, 0x000007FE,\n    0x0007000C, 0x0000001D, 0x00006294, 0x00000001, 0x00000028, 0x00000504,\n    0x00004725, 0x0007004F, 0x00000011, 0x0000376E, 0x00002AC6, 0x00002AC6,\n    0x00000002, 0x00000003, 0x0004007C, 0x00000012, 0x000024C2, 0x0000376E,\n    0x0009004F, 0x0000001A, 0x000060D5, 0x000024C2, 0x000024C2, 0x00000000,\n    0x00000000, 0x00000001, 0x00000001, 0x000500C4, 0x0000001A, 0x000048AD,\n    0x000060D5, 0x00000122, 0x000500C3, 0x0000001A, 0x00003D94, 0x000048AD,\n    0x00000302, 0x0004006F, 0x0000001D, 0x00002AAE, 0x00003D94, 0x0005008E,\n    0x0000001D, 0x000053CA, 0x00002AAE, 0x000007FE, 0x0007000C, 0x0000001D,\n    0x00004365, 0x00000001, 0x00000028, 0x00000504, 0x000053CA, 0x000200F9,\n    0x00004F26, 0x000200F8, 0x00004F59, 0x0007004F, 0x00000011, 0x00002624,\n    0x00002AC6, 0x00002AC6, 0x00000000, 0x00000001, 0x0004007C, 0x00000013,\n    0x0000515C, 0x00002624, 0x00050051, 0x0000000D, 0x00001B81, 0x0000515C,\n    0x00000000, 0x00050051, 0x0000000D, 0x0000346D, 0x0000515C, 0x00000001,\n    0x00070050, 0x0000001D, 0x0000427B, 0x00001B81, 0x0000346D, 0x00000A0C,\n    0x00000A0C, 0x0007004F, 0x00000011, 0x000041DB, 0x00002AC6, 0x00002AC6,\n    0x00000002, 0x00000003, 0x0004007C, 0x00000013, 0x00003760, 0x000041DB,\n    0x00050051, 0x0000000D, 0x00001B82, 0x00003760, 0x00000000, 0x00050051,\n    0x0000000D, 0x0000410B, 0x00003760, 0x00000001, 0x00070050, 0x0000001D,\n    0x0000235C, 0x00001B82, 0x0000410B, 0x00000A0C, 0x00000A0C, 0x000200F9,\n    0x00004F26, 0x000200F8, 0x00004F26, 0x000900F5, 0x0000001D, 0x00002BFA,\n    0x0000235C, 0x00004F59, 0x00004365, 0x0000215B, 0x0000235B, 0x0000203A,\n    0x000900F5, 0x0000001D, 0x00003595, 0x0000427B, 0x00004F59, 0x00006294,\n    0x0000215B, 0x00003913, 0x0000203A, 0x000200F9, 0x00005312, 0x000200F8,\n    0x00005312, 0x000700F5, 0x0000001D, 0x0000230D, 0x00002BFA, 0x00004F26,\n    0x00002BF9, 0x00003F63, 0x000700F5, 0x0000001D, 0x00004C8C, 0x00003595,\n    0x00004F26, 0x00003594, 0x00003F63, 0x00050081, 0x0000001D, 0x00004C41,\n    0x00004346, 0x00004C8C, 0x00050081, 0x0000001D, 0x00005D3D, 0x000019F1,\n    0x0000230D, 0x000200F9, 0x00005EC8, 0x000200F8, 0x00005EC8, 0x000700F5,\n    0x0000001D, 0x00002BA7, 0x0000455A, 0x00005310, 0x00005D3D, 0x00005312,\n    0x000700F5, 0x0000001D, 0x00003854, 0x000046B0, 0x00005310, 0x00004C41,\n    0x00005312, 0x000700F5, 0x0000000D, 0x000038B6, 0x000061FB, 0x00005310,\n    0x00002F3A, 0x00005312, 0x000200F9, 0x00005313, 0x000200F8, 0x00005313,\n    0x000700F5, 0x0000001D, 0x00002BA8, 0x00002662, 0x0000530F, 0x00002BA7,\n    0x00005EC8, 0x000700F5, 0x0000001D, 0x00003063, 0x000036E3, 0x0000530F,\n    0x00003854, 0x00005EC8, 0x000700F5, 0x0000000D, 0x00002EA8, 0x00002B2C,\n    0x0000530F, 0x000038B6, 0x00005EC8, 0x0005008E, 0x0000001D, 0x0000623F,\n    0x00003063, 0x00002EA8, 0x0005008E, 0x0000001D, 0x0000255A, 0x00002BA8,\n    0x00002EA8, 0x000300F7, 0x00003F64, 0x00000002, 0x000400FA, 0x00001D33,\n    0x00002741, 0x00003F64, 0x000200F8, 0x00002741, 0x0009004F, 0x0000001D,\n    0x0000478C, 0x0000623F, 0x0000623F, 0x00000002, 0x00000001, 0x00000000,\n    0x00000003, 0x0009004F, 0x0000001D, 0x00004F75, 0x0000255A, 0x0000255A,\n    0x00000002, 0x00000001, 0x00000000, 0x00000003, 0x000200F9, 0x00003F64,\n    0x000200F8, 0x00003F64, 0x000700F5, 0x0000001D, 0x000022F8, 0x0000255A,\n    0x00005313, 0x00004F75, 0x00002741, 0x000700F5, 0x0000001D, 0x000055F9,\n    0x0000623F, 0x00005313, 0x0000478C, 0x00002741, 0x00050080, 0x00000011,\n    0x00001C97, 0x00002EF9, 0x000059EC, 0x000300F7, 0x000052F5, 0x00000002,\n    0x000400FA, 0x0000500F, 0x0000294E, 0x0000537D, 0x000200F8, 0x0000537D,\n    0x0004007C, 0x00000012, 0x00002970, 0x00001C97, 0x00050051, 0x0000000C,\n    0x000045F3, 0x00002970, 0x00000001, 0x000500C3, 0x0000000C, 0x00004DC0,\n    0x000045F3, 0x00000A1A, 0x0004007C, 0x0000000C, 0x00005784, 0x000020FC,\n    0x00050084, 0x0000000C, 0x00001F02, 0x00004DC0, 0x00005784, 0x00050051,\n    0x0000000C, 0x00006242, 0x00002970, 0x00000000, 0x000500C3, 0x0000000C,\n    0x00004FC7, 0x00006242, 0x00000A1A, 0x00050080, 0x0000000C, 0x000049B3,\n    0x00001F02, 0x00004FC7, 0x000500C4, 0x0000000C, 0x0000254A, 0x000049B3,\n    0x00000A1D, 0x000500C3, 0x0000000C, 0x0000603B, 0x000045F3, 0x00000A0E,\n    0x000500C7, 0x0000000C, 0x0000539A, 0x0000603B, 0x00000A20, 0x000500C4,\n    0x0000000C, 0x0000534A, 0x0000539A, 0x00000A14, 0x000500C7, 0x0000000C,\n    0x00004EA5, 0x00006242, 0x00000A20, 0x000500C5, 0x0000000C, 0x00002B1A,\n    0x0000534A, 0x00004EA5, 0x000500C5, 0x0000000C, 0x000043B6, 0x0000254A,\n    0x00002B1A, 0x000500C4, 0x0000000C, 0x00005E63, 0x000043B6, 0x00000A16,\n    0x000500C3, 0x0000000C, 0x000031DE, 0x000045F3, 0x00000A17, 0x000500C7,\n    0x0000000C, 0x00005447, 0x000031DE, 0x00000A0E, 0x000500C3, 0x0000000C,\n    0x000028A6, 0x00006242, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000511E,\n    0x000028A6, 0x00000A14, 0x000500C3, 0x0000000C, 0x000028B9, 0x000045F3,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x0000505E, 0x000028B9, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x0000541D, 0x0000505E, 0x00000A0E, 0x000500C6,\n    0x0000000C, 0x000022BA, 0x0000511E, 0x0000541D, 0x000500C7, 0x0000000C,\n    0x00005076, 0x000045F3, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005228,\n    0x00005076, 0x00000A17, 0x000500C4, 0x0000000C, 0x00001997, 0x000022BA,\n    0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FE, 0x00005228, 0x00001997,\n    0x000500C4, 0x0000000C, 0x00001BB4, 0x00005447, 0x00000A2C, 0x000500C5,\n    0x0000000C, 0x00003F5B, 0x000047FE, 0x00001BB4, 0x000500C3, 0x0000000C,\n    0x00003A6E, 0x00005E63, 0x00000A17, 0x000500C7, 0x0000000C, 0x000018B8,\n    0x00003A6E, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000547E, 0x000018B8,\n    0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A8, 0x00003F5B, 0x0000547E,\n    0x000500C3, 0x0000000C, 0x00003A6F, 0x00005E63, 0x00000A1A, 0x000500C7,\n    0x0000000C, 0x000018B9, 0x00003A6F, 0x00000A20, 0x000500C4, 0x0000000C,\n    0x0000547F, 0x000018B9, 0x00000A23, 0x000500C5, 0x0000000C, 0x0000456F,\n    0x000045A8, 0x0000547F, 0x000500C3, 0x0000000C, 0x00003C88, 0x00005E63,\n    0x00000A23, 0x000500C4, 0x0000000C, 0x00002824, 0x00003C88, 0x00000A2F,\n    0x000500C5, 0x0000000C, 0x00003B79, 0x0000456F, 0x00002824, 0x0004007C,\n    0x0000000B, 0x000041E5, 0x00003B79, 0x000200F9, 0x000052F5, 0x000200F8,\n    0x0000294E, 0x00050051, 0x0000000B, 0x00004D9A, 0x00001C97, 0x00000000,\n    0x00050051, 0x0000000B, 0x00002C03, 0x00001C97, 0x00000001, 0x00060050,\n    0x00000014, 0x000020DE, 0x00004D9A, 0x00002C03, 0x00004408, 0x0004007C,\n    0x00000016, 0x00004E9D, 0x000020DE, 0x00050051, 0x0000000C, 0x00002BFB,\n    0x00004E9D, 0x00000002, 0x000500C3, 0x0000000C, 0x00004DC1, 0x00002BFB,\n    0x00000A11, 0x0004007C, 0x0000000C, 0x00005785, 0x00006273, 0x00050084,\n    0x0000000C, 0x00001F03, 0x00004DC1, 0x00005785, 0x00050051, 0x0000000C,\n    0x00006243, 0x00004E9D, 0x00000001, 0x000500C3, 0x0000000C, 0x00004A6F,\n    0x00006243, 0x00000A17, 0x00050080, 0x0000000C, 0x00002B2D, 0x00001F03,\n    0x00004A6F, 0x0004007C, 0x0000000C, 0x00004202, 0x000020FC, 0x00050084,\n    0x0000000C, 0x00003A60, 0x00002B2D, 0x00004202, 0x00050051, 0x0000000C,\n    0x00006244, 0x00004E9D, 0x00000000, 0x000500C3, 0x0000000C, 0x00004FC8,\n    0x00006244, 0x00000A1A, 0x00050080, 0x0000000C, 0x000049FC, 0x00003A60,\n    0x00004FC8, 0x000500C4, 0x0000000C, 0x0000225D, 0x000049FC, 0x00000A20,\n    0x000500C7, 0x0000000C, 0x00002CAA, 0x00002BFB, 0x00000A14, 0x000500C4,\n    0x0000000C, 0x00004CAE, 0x00002CAA, 0x00000A1A, 0x000500C3, 0x0000000C,\n    0x0000383E, 0x00006243, 0x00000A0E, 0x000500C7, 0x0000000C, 0x00005374,\n    0x0000383E, 0x00000A14, 0x000500C4, 0x0000000C, 0x000054CA, 0x00005374,\n    0x00000A14, 0x000500C5, 0x0000000C, 0x000042CE, 0x00004CAE, 0x000054CA,\n    0x000500C7, 0x0000000C, 0x000050D5, 0x00006244, 0x00000A20, 0x000500C5,\n    0x0000000C, 0x00003ADD, 0x000042CE, 0x000050D5, 0x000500C5, 0x0000000C,\n    0x000043B7, 0x0000225D, 0x00003ADD, 0x000500C4, 0x0000000C, 0x00005E50,\n    0x000043B7, 0x00000A16, 0x000500C3, 0x0000000C, 0x000032D7, 0x00006243,\n    0x00000A14, 0x000500C6, 0x0000000C, 0x000026C9, 0x000032D7, 0x00004DC1,\n    0x000500C7, 0x0000000C, 0x00004199, 0x000026C9, 0x00000A0E, 0x000500C3,\n    0x0000000C, 0x00002590, 0x00006244, 0x00000A14, 0x000500C7, 0x0000000C,\n    0x0000505F, 0x00002590, 0x00000A14, 0x000500C4, 0x0000000C, 0x0000541E,\n    0x00004199, 0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BB, 0x0000505F,\n    0x0000541E, 0x000500C7, 0x0000000C, 0x00005077, 0x00006243, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x00005229, 0x00005077, 0x00000A17, 0x000500C4,\n    0x0000000C, 0x00001998, 0x000022BB, 0x00000A1D, 0x000500C5, 0x0000000C,\n    0x000047FF, 0x00005229, 0x00001998, 0x000500C4, 0x0000000C, 0x00001BB5,\n    0x00004199, 0x00000A2C, 0x000500C5, 0x0000000C, 0x00003F5C, 0x000047FF,\n    0x00001BB5, 0x000500C3, 0x0000000C, 0x00003A70, 0x00005E50, 0x00000A17,\n    0x000500C7, 0x0000000C, 0x000018BA, 0x00003A70, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x00005480, 0x000018BA, 0x00000A1A, 0x000500C5, 0x0000000C,\n    0x000045A9, 0x00003F5C, 0x00005480, 0x000500C3, 0x0000000C, 0x00003A71,\n    0x00005E50, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018BB, 0x00003A71,\n    0x00000A20, 0x000500C4, 0x0000000C, 0x00005481, 0x000018BB, 0x00000A23,\n    0x000500C5, 0x0000000C, 0x00004570, 0x000045A9, 0x00005481, 0x000500C3,\n    0x0000000C, 0x00003C89, 0x00005E50, 0x00000A23, 0x000500C4, 0x0000000C,\n    0x00002825, 0x00003C89, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B7A,\n    0x00004570, 0x00002825, 0x0004007C, 0x0000000B, 0x000041E6, 0x00003B7A,\n    0x000200F9, 0x000052F5, 0x000200F8, 0x000052F5, 0x000700F5, 0x0000000B,\n    0x00002C70, 0x000041E6, 0x0000294E, 0x000041E5, 0x0000537D, 0x00050080,\n    0x0000000B, 0x00004D1E, 0x00002C70, 0x000062B6, 0x000500C2, 0x0000000B,\n    0x00001D8A, 0x00004D1E, 0x00000A17, 0x0004007C, 0x00000017, 0x0000232F,\n    0x000055F9, 0x000500AA, 0x00000009, 0x00001FEE, 0x00004ADC, 0x00000A19,\n    0x000300F7, 0x000039BC, 0x00000000, 0x000400FA, 0x00001FEE, 0x000033DF,\n    0x000039BC, 0x000200F8, 0x000033DF, 0x0009004F, 0x00000017, 0x00001F16,\n    0x0000232F, 0x0000232F, 0x00000003, 0x00000002, 0x00000001, 0x00000000,\n    0x000200F9, 0x000039BC, 0x000200F8, 0x000039BC, 0x000700F5, 0x00000017,\n    0x00005972, 0x0000232F, 0x000052F5, 0x00001F16, 0x000033DF, 0x000600A9,\n    0x0000000B, 0x00001F84, 0x00001FEE, 0x00000A10, 0x00004ADC, 0x000500AA,\n    0x00000009, 0x00005116, 0x00001F84, 0x00000A16, 0x000300F7, 0x000039BD,\n    0x00000000, 0x000400FA, 0x00005116, 0x000033E0, 0x000039BD, 0x000200F8,\n    0x000033E0, 0x0009004F, 0x00000017, 0x00001F17, 0x00005972, 0x00005972,\n    0x00000001, 0x00000000, 0x00000003, 0x00000002, 0x000200F9, 0x000039BD,\n    0x000200F8, 0x000039BD, 0x000700F5, 0x00000017, 0x00005973, 0x00005972,\n    0x000039BC, 0x00001F17, 0x000033E0, 0x000600A9, 0x0000000B, 0x000019CD,\n    0x00005116, 0x00000A10, 0x00001F84, 0x000500AA, 0x00000009, 0x00003464,\n    0x000019CD, 0x00000A0D, 0x000500AA, 0x00000009, 0x000047C2, 0x000019CD,\n    0x00000A10, 0x000500A6, 0x00000009, 0x00005686, 0x00003464, 0x000047C2,\n    0x000300F7, 0x00003463, 0x00000000, 0x000400FA, 0x00005686, 0x00002957,\n    0x00003463, 0x000200F8, 0x00002957, 0x000500C7, 0x00000017, 0x0000475F,\n    0x00005973, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D1, 0x0000475F,\n    0x0000013D, 0x000500C7, 0x00000017, 0x000050AC, 0x00005973, 0x0000072E,\n    0x000500C2, 0x00000017, 0x0000448D, 0x000050AC, 0x0000013D, 0x000500C5,\n    0x00000017, 0x00003FF9, 0x000024D1, 0x0000448D, 0x000200F9, 0x00003463,\n    0x000200F8, 0x00003463, 0x000700F5, 0x00000017, 0x0000587A, 0x00005973,\n    0x000039BD, 0x00003FF9, 0x00002957, 0x000500AA, 0x00000009, 0x00004CB6,\n    0x000019CD, 0x00000A13, 0x000500A6, 0x00000009, 0x00003B23, 0x000047C2,\n    0x00004CB6, 0x000300F7, 0x00002C98, 0x00000000, 0x000400FA, 0x00003B23,\n    0x00002B38, 0x00002C98, 0x000200F8, 0x00002B38, 0x000500C4, 0x00000017,\n    0x00005E17, 0x0000587A, 0x000002ED, 0x000500C2, 0x00000017, 0x00003BE7,\n    0x0000587A, 0x000002ED, 0x000500C5, 0x00000017, 0x000029E8, 0x00005E17,\n    0x00003BE7, 0x000200F9, 0x00002C98, 0x000200F8, 0x00002C98, 0x000700F5,\n    0x00000017, 0x00004D37, 0x0000587A, 0x00003463, 0x000029E8, 0x00002B38,\n    0x00060041, 0x00000294, 0x000060F9, 0x00001592, 0x00000A0B, 0x00001D8A,\n    0x0003003E, 0x000060F9, 0x00004D37, 0x00050080, 0x0000000B, 0x000024AD,\n    0x00004D1E, 0x00000A6A, 0x000500C2, 0x0000000B, 0x00004A5E, 0x000024AD,\n    0x00000A17, 0x0004007C, 0x00000017, 0x000039DE, 0x000022F8, 0x000300F7,\n    0x00003F86, 0x00000000, 0x000400FA, 0x00001FEE, 0x000033E1, 0x00003F86,\n    0x000200F8, 0x000033E1, 0x0009004F, 0x00000017, 0x00001F18, 0x000039DE,\n    0x000039DE, 0x00000003, 0x00000002, 0x00000001, 0x00000000, 0x000200F9,\n    0x00003F86, 0x000200F8, 0x00003F86, 0x000700F5, 0x00000017, 0x00002AAF,\n    0x000039DE, 0x00002C98, 0x00001F18, 0x000033E1, 0x000300F7, 0x00003F87,\n    0x00000000, 0x000400FA, 0x00005116, 0x000033E2, 0x00003F87, 0x000200F8,\n    0x000033E2, 0x0009004F, 0x00000017, 0x00001F19, 0x00002AAF, 0x00002AAF,\n    0x00000001, 0x00000000, 0x00000003, 0x00000002, 0x000200F9, 0x00003F87,\n    0x000200F8, 0x00003F87, 0x000700F5, 0x00000017, 0x00002AB0, 0x00002AAF,\n    0x00003F86, 0x00001F19, 0x000033E2, 0x000300F7, 0x00003A1A, 0x00000000,\n    0x000400FA, 0x00005686, 0x00002958, 0x00003A1A, 0x000200F8, 0x00002958,\n    0x000500C7, 0x00000017, 0x00004760, 0x00002AB0, 0x000009CE, 0x000500C4,\n    0x00000017, 0x000024D2, 0x00004760, 0x0000013D, 0x000500C7, 0x00000017,\n    0x000050AD, 0x00002AB0, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448E,\n    0x000050AD, 0x0000013D, 0x000500C5, 0x00000017, 0x00003FFA, 0x000024D2,\n    0x0000448E, 0x000200F9, 0x00003A1A, 0x000200F8, 0x00003A1A, 0x000700F5,\n    0x00000017, 0x00002AB1, 0x00002AB0, 0x00003F87, 0x00003FFA, 0x00002958,\n    0x000300F7, 0x00002C99, 0x00000000, 0x000400FA, 0x00003B23, 0x00002B39,\n    0x00002C99, 0x000200F8, 0x00002B39, 0x000500C4, 0x00000017, 0x00005E18,\n    0x00002AB1, 0x000002ED, 0x000500C2, 0x00000017, 0x00003BE8, 0x00002AB1,\n    0x000002ED, 0x000500C5, 0x00000017, 0x000029E9, 0x00005E18, 0x00003BE8,\n    0x000200F9, 0x00002C99, 0x000200F8, 0x00002C99, 0x000700F5, 0x00000017,\n    0x00004D38, 0x00002AB1, 0x00003A1A, 0x000029E9, 0x00002B39, 0x00060041,\n    0x00000294, 0x00001F76, 0x00001592, 0x00000A0B, 0x00004A5E, 0x0003003E,\n    0x00001F76, 0x00004D38, 0x000200F9, 0x00004C7A, 0x000200F8, 0x00004C7A,\n    0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/resolve_full_128bpp_scaled_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25237\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 8 8 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_resolve_edram_info\"\n               OpMemberName %push_const_block_xe 1 \"xe_resolve_coordinate_info\"\n               OpMemberName %push_const_block_xe 2 \"xe_resolve_dest_info\"\n               OpMemberName %push_const_block_xe 3 \"xe_resolve_dest_coordinate_info\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %xe_resolve_edram_xe_block \"xe_resolve_edram_xe_block\"\n               OpMemberName %xe_resolve_edram_xe_block 0 \"data\"\n               OpName %xe_resolve_edram \"xe_resolve_edram\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_resolve_dest_xe_block \"xe_resolve_dest_xe_block\"\n               OpMemberName %xe_resolve_dest_xe_block 0 \"data\"\n               OpName %xe_resolve_dest \"xe_resolve_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpDecorate %_runtimearr_uint ArrayStride 4\n               OpDecorate %xe_resolve_edram_xe_block BufferBlock\n               OpMemberDecorate %xe_resolve_edram_xe_block 0 NonWritable\n               OpMemberDecorate %xe_resolve_edram_xe_block 0 Offset 0\n               OpDecorate %xe_resolve_edram NonWritable\n               OpDecorate %xe_resolve_edram Binding 0\n               OpDecorate %xe_resolve_edram DescriptorSet 0\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_resolve_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_resolve_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_resolve_dest_xe_block 0 Offset 0\n               OpDecorate %xe_resolve_dest NonReadable\n               OpDecorate %xe_resolve_dest Binding 0\n               OpDecorate %xe_resolve_dest DescriptorSet 1\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n     %v3uint = OpTypeVector %uint 3\n     %v4uint = OpTypeVector %uint 4\n      %float = OpTypeFloat 32\n    %v2float = OpTypeVector %float 2\n    %v4float = OpTypeVector %float 4\n       %bool = OpTypeBool\n      %v3int = OpTypeVector %int 3\n     %uint_1 = OpConstant %uint 1\n     %uint_2 = OpConstant %uint 2\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n     %uint_3 = OpConstant %uint 3\n    %uint_16 = OpConstant %uint 16\n     %uint_4 = OpConstant %uint 4\n     %uint_5 = OpConstant %uint 5\n     %uint_0 = OpConstant %uint 0\n    %uint_24 = OpConstant %uint 24\n        %653 = OpConstantComposite %v4uint %uint_0 %uint_8 %uint_16 %uint_24\n   %uint_255 = OpConstant %uint 255\n%float_0_00392156886 = OpConstant %float 0.00392156886\n    %uint_10 = OpConstant %uint 10\n    %uint_20 = OpConstant %uint 20\n    %uint_30 = OpConstant %uint 30\n        %845 = OpConstantComposite %v4uint %uint_0 %uint_10 %uint_20 %uint_30\n  %uint_1023 = OpConstant %uint 1023\n        %635 = OpConstantComposite %v4uint %uint_1023 %uint_1023 %uint_1023 %uint_3\n%float_0_000977517106 = OpConstant %float 0.000977517106\n%float_0_333333343 = OpConstant %float 0.333333343\n       %2798 = OpConstantComposite %v4float %float_0_000977517106 %float_0_000977517106 %float_0_000977517106 %float_0_333333343\n       %2996 = OpConstantComposite %v3uint %uint_0 %uint_10 %uint_20\n   %uint_127 = OpConstant %uint 127\n     %uint_7 = OpConstant %uint 7\n     %v3bool = OpTypeVector %bool 3\n   %uint_124 = OpConstant %uint 124\n    %uint_23 = OpConstant %uint 23\n    %v3float = OpTypeVector %float 3\n   %float_n1 = OpConstant %float -1\n     %int_16 = OpConstant %int 16\n      %int_0 = OpConstant %int 0\n       %1959 = OpConstantComposite %v2int %int_16 %int_0\n%float_0_000976592302 = OpConstant %float 0.000976592302\n      %v4int = OpTypeVector %int 4\n        %290 = OpConstantComposite %v4int %int_16 %int_0 %int_16 %int_0\n       %1837 = OpConstantComposite %v2uint %uint_2 %uint_1\n     %v2bool = OpTypeVector %bool 2\n       %1807 = OpConstantComposite %v2uint %uint_0 %uint_0\n       %1828 = OpConstantComposite %v2uint %uint_1 %uint_1\n       %1816 = OpConstantComposite %v2uint %uint_1 %uint_0\n    %uint_80 = OpConstant %uint 80\n       %2719 = OpConstantComposite %v2uint %uint_80 %uint_16\n  %uint_2048 = OpConstant %uint 2048\n      %int_2 = OpConstant %int 2\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n      %int_3 = OpConstant %int 3\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n    %uint_13 = OpConstant %uint 13\n  %uint_2047 = OpConstant %uint 2047\n    %uint_15 = OpConstant %uint 15\n    %uint_28 = OpConstant %uint 28\n    %uint_19 = OpConstant %uint 19\n       %2179 = OpConstantComposite %v2uint %uint_16 %uint_19\n%uint_536870912 = OpConstant %uint 536870912\n       %1855 = OpConstantComposite %v2uint %uint_0 %uint_4\n     %int_10 = OpConstant %int 10\n     %int_26 = OpConstant %int 26\n     %int_23 = OpConstant %int 23\n%uint_16777216 = OpConstant %uint 16777216\n       %2275 = OpConstantComposite %v2uint %uint_20 %uint_24\n    %float_0 = OpConstant %float 0\n%_runtimearr_uint = OpTypeRuntimeArray %uint\n%xe_resolve_edram_xe_block = OpTypeStruct %_runtimearr_uint\n%_ptr_Uniform_xe_resolve_edram_xe_block = OpTypePointer Uniform %xe_resolve_edram_xe_block\n%xe_resolve_edram = OpVariable %_ptr_Uniform_xe_resolve_edram_xe_block Uniform\n%_ptr_Uniform_uint = OpTypePointer Uniform %uint\n   %uint_320 = OpConstant %uint 320\n  %float_0_5 = OpConstant %float 0.5\n     %uint_6 = OpConstant %uint 6\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_resolve_dest_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_resolve_dest_xe_block = OpTypePointer Uniform %xe_resolve_dest_xe_block\n%xe_resolve_dest = OpVariable %_ptr_Uniform_xe_resolve_dest_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_8 %uint_8 %uint_1\n       %1954 = OpConstantComposite %v2uint %uint_7 %uint_7\n       %1955 = OpConstantComposite %v2uint %uint_15 %uint_1\n       %1870 = OpConstantComposite %v2uint %uint_3 %uint_3\n       %2122 = OpConstantComposite %v2uint %uint_15 %uint_15\n       %1284 = OpConstantComposite %v4float %float_n1 %float_n1 %float_n1 %float_n1\n        %770 = OpConstantComposite %v4int %int_16 %int_16 %int_16 %int_16\n       %1611 = OpConstantComposite %v4uint %uint_255 %uint_255 %uint_255 %uint_255\n        %261 = OpConstantComposite %v3uint %uint_1023 %uint_1023 %uint_1023\n       %1126 = OpConstantComposite %v3uint %uint_127 %uint_127 %uint_127\n       %2828 = OpConstantComposite %v3uint %uint_7 %uint_7 %uint_7\n       %2578 = OpConstantComposite %v3uint %uint_0 %uint_0 %uint_0\n       %1018 = OpConstantComposite %v3uint %uint_124 %uint_124 %uint_124\n        %393 = OpConstantComposite %v3uint %uint_23 %uint_23 %uint_23\n        %141 = OpConstantComposite %v3uint %uint_16 %uint_16 %uint_16\n         %73 = OpConstantComposite %v2float %float_n1 %float_n1\n       %2151 = OpConstantComposite %v2int %int_16 %int_16\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n%int_1065353216 = OpConstant %int 1065353216\n%uint_4294967290 = OpConstant %uint 4294967290\n       %2360 = OpConstantComposite %v3uint %uint_4294967290 %uint_4294967290 %uint_4294967290\n %float_0_25 = OpConstant %float 0.25\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %22245 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %15627 = OpLoad %uint %22245\n      %22700 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %20824 = OpLoad %uint %22700\n      %20561 = OpBitwiseAnd %uint %15627 %uint_1023\n      %19978 = OpShiftRightLogical %uint %15627 %uint_10\n       %8574 = OpBitwiseAnd %uint %19978 %uint_3\n      %21002 = OpShiftRightLogical %uint %15627 %uint_13\n       %8575 = OpBitwiseAnd %uint %21002 %uint_2047\n      %21003 = OpShiftRightLogical %uint %15627 %uint_24\n       %8576 = OpBitwiseAnd %uint %21003 %uint_15\n      %18836 = OpShiftRightLogical %uint %15627 %uint_28\n       %9130 = OpBitwiseAnd %uint %18836 %uint_1\n       %8871 = OpCompositeConstruct %v2uint %20824 %20824\n       %9633 = OpShiftRightLogical %v2uint %8871 %2179\n      %23601 = OpBitwiseAnd %v2uint %9633 %1954\n      %24030 = OpBitwiseAnd %uint %15627 %uint_536870912\n      %12295 = OpINotEqual %bool %24030 %uint_0\n               OpSelectionMerge %14676 None\n               OpBranchConditional %12295 %16739 %21992\n      %21992 = OpLabel\n               OpBranch %14676\n      %16739 = OpLabel\n      %15278 = OpShiftRightLogical %v2uint %23601 %1828\n               OpBranch %14676\n      %14676 = OpLabel\n      %19124 = OpPhi %v2uint %15278 %16739 %1807 %21992\n       %7038 = OpShiftRightLogical %v2uint %8871 %1855\n      %11769 = OpBitwiseAnd %v2uint %7038 %1955\n      %16207 = OpShiftLeftLogical %v2uint %11769 %1870\n      %23019 = OpIMul %v2uint %16207 %23601\n      %13123 = OpShiftRightLogical %uint %20824 %uint_5\n      %14785 = OpBitwiseAnd %uint %13123 %uint_2047\n       %8858 = OpCompositeExtract %uint %23601 0\n      %22993 = OpIMul %uint %14785 %8858\n      %20036 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %18628 = OpLoad %uint %20036\n      %22701 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %20919 = OpLoad %uint %22701\n      %19164 = OpBitwiseAnd %uint %18628 %uint_7\n      %21999 = OpBitwiseAnd %uint %18628 %uint_8\n      %20495 = OpINotEqual %bool %21999 %uint_0\n       %8977 = OpShiftRightLogical %uint %18628 %uint_4\n      %17416 = OpBitwiseAnd %uint %8977 %uint_7\n      %22920 = OpBitcast %int %18628\n      %13711 = OpShiftLeftLogical %int %22920 %int_10\n      %20636 = OpShiftRightArithmetic %int %13711 %int_26\n      %18178 = OpShiftLeftLogical %int %20636 %int_23\n       %7462 = OpIAdd %int %18178 %int_1065353216\n      %11052 = OpBitcast %float %7462\n      %22649 = OpBitwiseAnd %uint %18628 %uint_16777216\n       %7475 = OpINotEqual %bool %22649 %uint_0\n       %8444 = OpBitwiseAnd %uint %20919 %uint_1023\n      %12176 = OpShiftRightLogical %uint %20919 %uint_10\n      %25038 = OpBitwiseAnd %uint %12176 %uint_1023\n      %25203 = OpShiftLeftLogical %uint %25038 %int_1\n      %10422 = OpCompositeConstruct %v2uint %20919 %20919\n      %10385 = OpShiftRightLogical %v2uint %10422 %2275\n      %23379 = OpBitwiseAnd %v2uint %10385 %2122\n      %16208 = OpShiftLeftLogical %v2uint %23379 %1870\n      %23020 = OpIMul %v2uint %16208 %23601\n      %12743 = OpShiftRightLogical %uint %20919 %uint_28\n      %17238 = OpBitwiseAnd %uint %12743 %uint_7\n      %12737 = OpLoad %v3uint %gl_GlobalInvocationID\n      %14500 = OpVectorShuffle %v2uint %12737 %12737 0 1\n      %12025 = OpShiftLeftLogical %v2uint %14500 %1816\n       %7640 = OpCompositeExtract %uint %12025 0\n      %11658 = OpShiftLeftLogical %uint %22993 %uint_3\n      %15379 = OpUGreaterThanEqual %bool %7640 %11658\n               OpSelectionMerge %12755 DontFlatten\n               OpBranchConditional %15379 %21993 %12755\n      %21993 = OpLabel\n               OpBranch %19578\n      %12755 = OpLabel\n       %7359 = OpCompositeExtract %uint %19124 0\n       %6926 = OpExtInst %uint %1 UMax %7640 %7359\n      %17800 = OpCompositeExtract %uint %12025 1\n       %6449 = OpCompositeExtract %uint %19124 1\n      %24446 = OpExtInst %uint %1 UMax %17800 %6449\n      %20975 = OpCompositeConstruct %v2uint %6926 %24446\n      %21036 = OpIAdd %v2uint %20975 %23019\n      %16075 = OpULessThanEqual %bool %17238 %uint_3\n               OpSelectionMerge %23776 None\n               OpBranchConditional %16075 %10990 %15087\n      %15087 = OpLabel\n      %13566 = OpIEqual %bool %17238 %uint_5\n       %8438 = OpSelect %uint %13566 %uint_2 %uint_0\n               OpBranch %23776\n      %10990 = OpLabel\n               OpBranch %23776\n      %23776 = OpLabel\n      %19300 = OpPhi %uint %17238 %10990 %8438 %15087\n      %16830 = OpCompositeConstruct %v2uint %8574 %8574\n      %11801 = OpUGreaterThanEqual %v2bool %16830 %1837\n      %19381 = OpSelect %v2uint %11801 %1828 %1807\n      %10986 = OpShiftLeftLogical %v2uint %21036 %19381\n      %24669 = OpCompositeConstruct %v2uint %19300 %19300\n       %9093 = OpShiftRightLogical %v2uint %24669 %1816\n      %16072 = OpBitwiseAnd %v2uint %9093 %1828\n      %18106 = OpIAdd %v2uint %10986 %16072\n      %22936 = OpIMul %v2uint %2719 %23601\n      %11332 = OpCompositeConstruct %v2uint %9130 %uint_0\n       %6571 = OpShiftRightLogical %v2uint %22936 %11332\n      %10146 = OpUDiv %v2uint %18106 %6571\n      %20390 = OpCompositeExtract %uint %10146 1\n      %11046 = OpIMul %uint %20390 %20561\n      %24665 = OpCompositeExtract %uint %10146 0\n      %21536 = OpIAdd %uint %11046 %24665\n       %8742 = OpIAdd %uint %8575 %21536\n      %22376 = OpIMul %v2uint %10146 %6571\n      %20715 = OpISub %v2uint %18106 %22376\n       %7303 = OpCompositeExtract %uint %22936 0\n      %22882 = OpCompositeExtract %uint %22936 1\n      %13170 = OpIMul %uint %7303 %22882\n      %14551 = OpIMul %uint %8742 %13170\n       %6805 = OpCompositeExtract %uint %20715 1\n      %23526 = OpCompositeExtract %uint %6571 0\n      %22886 = OpIMul %uint %6805 %23526\n       %6886 = OpCompositeExtract %uint %20715 0\n       %9696 = OpIAdd %uint %22886 %6886\n      %18021 = OpShiftLeftLogical %uint %9696 %9130\n      %18363 = OpIAdd %uint %14551 %18021\n      %13922 = OpIMul %uint %13170 %uint_2048\n      %21520 = OpUMod %uint %18363 %13922\n       %7686 = OpShiftLeftLogical %uint %21520 %int_2\n      %13906 = OpUGreaterThanEqual %bool %8574 %uint_2\n      %11277 = OpSelect %uint %13906 %uint_1 %uint_0\n      %20074 = OpIAdd %uint %9130 %11277\n       %6555 = OpShiftLeftLogical %uint %uint_4 %20074\n      %23279 = OpINotEqual %bool %9130 %uint_0\n               OpSelectionMerge %21263 DontFlatten\n               OpBranchConditional %23279 %15205 %16569\n      %16569 = OpLabel\n      %19162 = OpIEqual %bool %6555 %uint_4\n               OpSelectionMerge %20297 DontFlatten\n               OpBranchConditional %19162 %6591 %8959\n       %8959 = OpLabel\n      %22064 = OpShiftRightLogical %uint %7686 %int_2\n      %13369 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22064\n      %15060 = OpLoad %uint %13369\n       %8517 = OpIAdd %uint %7686 %6555\n      %21670 = OpShiftRightLogical %uint %8517 %int_2\n      %18689 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21670\n      %24409 = OpLoad %uint %18689\n      %20780 = OpCompositeConstruct %v2uint %15060 %24409\n               OpBranch %20297\n       %6591 = OpLabel\n      %24486 = OpShiftRightLogical %uint %7686 %int_2\n      %13370 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24486\n      %12609 = OpLoad %uint %13370\n      %11687 = OpIAdd %uint %24486 %uint_1\n      %24558 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11687\n      %16379 = OpLoad %uint %24558\n      %20781 = OpCompositeConstruct %v2uint %12609 %16379\n               OpBranch %20297\n      %20297 = OpLabel\n      %10943 = OpPhi %v2uint %20781 %6591 %20780 %8959\n               OpSelectionMerge %16224 None\n               OpSwitch %8576 %19451 0 %14585 1 %14585 2 %7355 10 %7355 3 %7354 12 %7354 4 %8190 6 %8243\n       %8243 = OpLabel\n      %24406 = OpCompositeExtract %uint %10943 0\n      %24679 = OpExtInst %v2float %1 UnpackHalf2x16 %24406\n      %10082 = OpCompositeExtract %float %24679 0\n      %17478 = OpCompositeExtract %float %24679 1\n      %14604 = OpCompositeConstruct %v4float %10082 %17478 %float_0 %float_0\n      %17274 = OpCompositeExtract %uint %10943 1\n      %18027 = OpExtInst %v2float %1 UnpackHalf2x16 %17274\n      %10083 = OpCompositeExtract %float %18027 0\n      %20670 = OpCompositeExtract %float %18027 1\n       %9033 = OpCompositeConstruct %v4float %10083 %20670 %float_0 %float_0\n               OpBranch %16224\n       %8190 = OpLabel\n      %12427 = OpCompositeExtract %uint %10943 0\n      %22685 = OpBitcast %int %12427\n      %18202 = OpCompositeConstruct %v2int %22685 %22685\n      %18349 = OpShiftLeftLogical %v2int %18202 %1959\n      %13335 = OpShiftRightArithmetic %v2int %18349 %2151\n      %10903 = OpConvertSToF %v2float %13335\n      %18247 = OpVectorTimesScalar %v2float %10903 %float_0_000976592302\n      %24070 = OpExtInst %v2float %1 FMax %73 %18247\n      %24330 = OpCompositeExtract %float %24070 0\n      %15572 = OpCompositeExtract %float %24070 1\n      %16670 = OpCompositeConstruct %v4float %24330 %15572 %float_0 %float_0\n      %19522 = OpCompositeExtract %uint %10943 1\n      %16033 = OpBitcast %int %19522\n      %18203 = OpCompositeConstruct %v2int %16033 %16033\n      %18350 = OpShiftLeftLogical %v2int %18203 %1959\n      %13336 = OpShiftRightArithmetic %v2int %18350 %2151\n      %10904 = OpConvertSToF %v2float %13336\n      %18248 = OpVectorTimesScalar %v2float %10904 %float_0_000976592302\n      %24071 = OpExtInst %v2float %1 FMax %73 %18248\n      %24331 = OpCompositeExtract %float %24071 0\n      %18764 = OpCompositeExtract %float %24071 1\n       %9034 = OpCompositeConstruct %v4float %24331 %18764 %float_0 %float_0\n               OpBranch %16224\n       %7354 = OpLabel\n      %22205 = OpCompositeExtract %uint %10943 0\n      %20234 = OpCompositeConstruct %v3uint %22205 %22205 %22205\n      %11021 = OpShiftRightLogical %v3uint %20234 %2996\n      %24038 = OpBitwiseAnd %v3uint %11021 %261\n      %18588 = OpBitwiseAnd %v3uint %11021 %1126\n      %23440 = OpShiftRightLogical %v3uint %24038 %2828\n      %16585 = OpIEqual %v3bool %23440 %2578\n      %11339 = OpExtInst %v3int %1 FindUMsb %18588\n      %10773 = OpBitcast %v3uint %11339\n       %6266 = OpISub %v3uint %2828 %10773\n       %8720 = OpIAdd %v3uint %10773 %2360\n      %10351 = OpSelect %v3uint %16585 %8720 %23440\n      %23252 = OpShiftLeftLogical %v3uint %18588 %6266\n      %18842 = OpBitwiseAnd %v3uint %23252 %1126\n      %10909 = OpSelect %v3uint %16585 %18842 %18588\n      %24569 = OpIAdd %v3uint %10351 %1018\n      %20351 = OpShiftLeftLogical %v3uint %24569 %393\n      %16294 = OpShiftLeftLogical %v3uint %10909 %141\n      %22396 = OpBitwiseOr %v3uint %20351 %16294\n      %13824 = OpIEqual %v3bool %24038 %2578\n      %16962 = OpSelect %v3uint %13824 %2578 %22396\n      %10703 = OpBitcast %v3float %16962\n      %19364 = OpShiftRightLogical %uint %22205 %uint_30\n      %18446 = OpConvertUToF %float %19364\n      %15903 = OpFMul %float %18446 %float_0_333333343\n      %21442 = OpCompositeExtract %float %10703 0\n      %10837 = OpCompositeExtract %float %10703 1\n       %7833 = OpCompositeExtract %float %10703 2\n      %15834 = OpCompositeConstruct %v4float %21442 %10837 %7833 %15903\n      %10229 = OpCompositeExtract %uint %10943 1\n      %13582 = OpCompositeConstruct %v3uint %10229 %10229 %10229\n      %11022 = OpShiftRightLogical %v3uint %13582 %2996\n      %24039 = OpBitwiseAnd %v3uint %11022 %261\n      %18589 = OpBitwiseAnd %v3uint %11022 %1126\n      %23441 = OpShiftRightLogical %v3uint %24039 %2828\n      %16586 = OpIEqual %v3bool %23441 %2578\n      %11340 = OpExtInst %v3int %1 FindUMsb %18589\n      %10774 = OpBitcast %v3uint %11340\n       %6267 = OpISub %v3uint %2828 %10774\n       %8721 = OpIAdd %v3uint %10774 %2360\n      %10352 = OpSelect %v3uint %16586 %8721 %23441\n      %23253 = OpShiftLeftLogical %v3uint %18589 %6267\n      %18843 = OpBitwiseAnd %v3uint %23253 %1126\n      %10910 = OpSelect %v3uint %16586 %18843 %18589\n      %24570 = OpIAdd %v3uint %10352 %1018\n      %20352 = OpShiftLeftLogical %v3uint %24570 %393\n      %16295 = OpShiftLeftLogical %v3uint %10910 %141\n      %22397 = OpBitwiseOr %v3uint %20352 %16295\n      %13825 = OpIEqual %v3bool %24039 %2578\n      %16963 = OpSelect %v3uint %13825 %2578 %22397\n      %10704 = OpBitcast %v3float %16963\n      %19365 = OpShiftRightLogical %uint %10229 %uint_30\n      %18447 = OpConvertUToF %float %19365\n      %15904 = OpFMul %float %18447 %float_0_333333343\n      %21443 = OpCompositeExtract %float %10704 0\n      %10838 = OpCompositeExtract %float %10704 1\n      %11025 = OpCompositeExtract %float %10704 2\n       %9035 = OpCompositeConstruct %v4float %21443 %10838 %11025 %15904\n               OpBranch %16224\n       %7355 = OpLabel\n      %22206 = OpCompositeExtract %uint %10943 0\n      %20235 = OpCompositeConstruct %v4uint %22206 %22206 %22206 %22206\n       %9368 = OpShiftRightLogical %v4uint %20235 %845\n      %18859 = OpBitwiseAnd %v4uint %9368 %635\n      %15543 = OpConvertUToF %v4float %18859\n      %16688 = OpFMul %v4float %15543 %2798\n      %23762 = OpCompositeExtract %uint %10943 1\n      %20813 = OpCompositeConstruct %v4uint %23762 %23762 %23762 %23762\n       %9369 = OpShiftRightLogical %v4uint %20813 %845\n      %18860 = OpBitwiseAnd %v4uint %9369 %635\n      %18735 = OpConvertUToF %v4float %18860\n       %9887 = OpFMul %v4float %18735 %2798\n               OpBranch %16224\n      %14585 = OpLabel\n      %22207 = OpCompositeExtract %uint %10943 0\n      %20236 = OpCompositeConstruct %v4uint %22207 %22207 %22207 %22207\n       %9370 = OpShiftRightLogical %v4uint %20236 %653\n      %19030 = OpBitwiseAnd %v4uint %9370 %1611\n      %13986 = OpConvertUToF %v4float %19030\n      %19235 = OpVectorTimesScalar %v4float %13986 %float_0_00392156886\n       %8607 = OpCompositeExtract %uint %10943 1\n      %24843 = OpCompositeConstruct %v4uint %8607 %8607 %8607 %8607\n       %9371 = OpShiftRightLogical %v4uint %24843 %653\n      %19031 = OpBitwiseAnd %v4uint %9371 %1611\n      %17178 = OpConvertUToF %v4float %19031\n      %12434 = OpVectorTimesScalar %v4float %17178 %float_0_00392156886\n               OpBranch %16224\n      %19451 = OpLabel\n      %12428 = OpCompositeExtract %uint %10943 0\n      %20462 = OpBitcast %float %12428\n      %17206 = OpCompositeConstruct %v2float %20462 %float_0\n      %11664 = OpVectorShuffle %v4float %17206 %17206 0 1 1 1\n      %22193 = OpCompositeExtract %uint %10943 1\n      %16232 = OpBitcast %float %22193\n      %20398 = OpCompositeConstruct %v2float %16232 %float_0\n      %23098 = OpVectorShuffle %v4float %20398 %20398 0 1 1 1\n               OpBranch %16224\n      %16224 = OpLabel\n      %11251 = OpPhi %v4float %23098 %19451 %12434 %14585 %9887 %7355 %9035 %7354 %9034 %8190 %9033 %8243\n      %13709 = OpPhi %v4float %11664 %19451 %19235 %14585 %16688 %7355 %15834 %7354 %16670 %8190 %14604 %8243\n               OpBranch %21263\n      %15205 = OpLabel\n      %21584 = OpIEqual %bool %6555 %uint_8\n               OpSelectionMerge %20298 DontFlatten\n               OpBranchConditional %21584 %6592 %8960\n       %8960 = OpLabel\n      %22065 = OpShiftRightLogical %uint %7686 %int_2\n      %13371 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22065\n      %12610 = OpLoad %uint %13371\n      %11688 = OpIAdd %uint %22065 %uint_1\n       %6399 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11688\n       %7030 = OpLoad %uint %6399\n       %8518 = OpIAdd %uint %7686 %6555\n      %21671 = OpShiftRightLogical %uint %8518 %int_2\n      %19601 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21671\n      %12611 = OpLoad %uint %19601\n      %11689 = OpIAdd %uint %21671 %uint_1\n      %24559 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11689\n      %16380 = OpLoad %uint %24559\n      %20782 = OpCompositeConstruct %v4uint %12610 %7030 %12611 %16380\n               OpBranch %20298\n       %6592 = OpLabel\n      %24487 = OpShiftRightLogical %uint %7686 %int_2\n      %13372 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24487\n      %12612 = OpLoad %uint %13372\n      %11690 = OpIAdd %uint %24487 %uint_1\n       %6400 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11690\n      %23650 = OpLoad %uint %6400\n      %11691 = OpIAdd %uint %24487 %uint_2\n       %6401 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11691\n      %23651 = OpLoad %uint %6401\n      %11692 = OpIAdd %uint %24487 %uint_3\n      %24560 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11692\n      %16381 = OpLoad %uint %24560\n      %20783 = OpCompositeConstruct %v4uint %12612 %23650 %23651 %16381\n               OpBranch %20298\n      %20298 = OpLabel\n      %10944 = OpPhi %v4uint %20783 %6592 %20782 %8960\n               OpSelectionMerge %20259 None\n               OpSwitch %8576 %20310 5 %8536 7 %8244\n       %8244 = OpLabel\n      %24407 = OpCompositeExtract %uint %10944 0\n      %24680 = OpExtInst %v2float %1 UnpackHalf2x16 %24407\n      %10101 = OpCompositeExtract %float %24680 0\n      %16056 = OpCompositeExtract %float %24680 1\n      %17025 = OpCompositeExtract %uint %10944 1\n      %15605 = OpExtInst %v2float %1 UnpackHalf2x16 %17025\n      %10084 = OpCompositeExtract %float %15605 0\n      %17479 = OpCompositeExtract %float %15605 1\n      %14605 = OpCompositeConstruct %v4float %10101 %16056 %10084 %17479\n      %17275 = OpCompositeExtract %uint %10944 2\n      %18028 = OpExtInst %v2float %1 UnpackHalf2x16 %17275\n      %10102 = OpCompositeExtract %float %18028 0\n      %16057 = OpCompositeExtract %float %18028 1\n      %17026 = OpCompositeExtract %uint %10944 3\n      %15606 = OpExtInst %v2float %1 UnpackHalf2x16 %17026\n      %10085 = OpCompositeExtract %float %15606 0\n      %20671 = OpCompositeExtract %float %15606 1\n       %9036 = OpCompositeConstruct %v4float %10102 %16057 %10085 %20671\n               OpBranch %20259\n       %8536 = OpLabel\n       %9723 = OpVectorShuffle %v2uint %10944 %10944 0 1\n      %23356 = OpBitcast %v2int %9723\n      %24782 = OpVectorShuffle %v4int %23356 %23356 0 0 1 1\n      %18598 = OpShiftLeftLogical %v4int %24782 %290\n      %15757 = OpShiftRightArithmetic %v4int %18598 %770\n      %10905 = OpConvertSToF %v4float %15757\n      %18209 = OpVectorTimesScalar %v4float %10905 %float_0_000976592302\n      %25233 = OpExtInst %v4float %1 FMax %1284 %18209\n      %14187 = OpVectorShuffle %v2uint %10944 %10944 2 3\n       %9407 = OpBitcast %v2int %14187\n      %24783 = OpVectorShuffle %v4int %9407 %9407 0 0 1 1\n      %18599 = OpShiftLeftLogical %v4int %24783 %290\n      %15758 = OpShiftRightArithmetic %v4int %18599 %770\n      %10906 = OpConvertSToF %v4float %15758\n      %21439 = OpVectorTimesScalar %v4float %10906 %float_0_000976592302\n      %17250 = OpExtInst %v4float %1 FMax %1284 %21439\n               OpBranch %20259\n      %20310 = OpLabel\n       %9761 = OpVectorShuffle %v2uint %10944 %10944 0 1\n      %20825 = OpBitcast %v2float %9761\n       %7035 = OpCompositeExtract %float %20825 0\n      %13418 = OpCompositeExtract %float %20825 1\n      %17016 = OpCompositeConstruct %v4float %7035 %13418 %float_0 %float_0\n      %16856 = OpVectorShuffle %v2uint %10944 %10944 2 3\n      %14173 = OpBitcast %v2float %16856\n       %7036 = OpCompositeExtract %float %14173 0\n      %16648 = OpCompositeExtract %float %14173 1\n       %9037 = OpCompositeConstruct %v4float %7036 %16648 %float_0 %float_0\n               OpBranch %20259\n      %20259 = OpLabel\n      %11252 = OpPhi %v4float %9037 %20310 %17250 %8536 %9036 %8244\n      %13710 = OpPhi %v4float %17016 %20310 %25233 %8536 %14605 %8244\n               OpBranch %21263\n      %21263 = OpLabel\n       %9826 = OpPhi %v4float %11252 %20259 %11251 %16224\n      %14051 = OpPhi %v4float %13710 %20259 %13709 %16224\n      %11861 = OpUGreaterThanEqual %bool %17238 %uint_4\n               OpSelectionMerge %21267 DontFlatten\n               OpBranchConditional %11861 %20977 %21267\n      %20977 = OpLabel\n      %11079 = OpIMul %uint %uint_320 %8858\n      %23069 = OpFMul %float %11052 %float_0_5\n       %8114 = OpIAdd %uint %7686 %11079\n               OpSelectionMerge %21264 DontFlatten\n               OpBranchConditional %23279 %15206 %16570\n      %16570 = OpLabel\n      %19163 = OpIEqual %bool %6555 %uint_4\n               OpSelectionMerge %20299 DontFlatten\n               OpBranchConditional %19163 %6593 %8961\n       %8961 = OpLabel\n      %22066 = OpShiftRightLogical %uint %8114 %int_2\n      %13373 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22066\n      %15061 = OpLoad %uint %13373\n       %8519 = OpIAdd %uint %8114 %6555\n      %21672 = OpShiftRightLogical %uint %8519 %int_2\n      %18690 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21672\n      %24410 = OpLoad %uint %18690\n      %20784 = OpCompositeConstruct %v2uint %15061 %24410\n               OpBranch %20299\n       %6593 = OpLabel\n      %24488 = OpShiftRightLogical %uint %8114 %int_2\n      %13374 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24488\n      %12613 = OpLoad %uint %13374\n      %11693 = OpIAdd %uint %24488 %uint_1\n      %24561 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11693\n      %16382 = OpLoad %uint %24561\n      %20785 = OpCompositeConstruct %v2uint %12613 %16382\n               OpBranch %20299\n      %20299 = OpLabel\n      %10945 = OpPhi %v2uint %20785 %6593 %20784 %8961\n               OpSelectionMerge %16225 None\n               OpSwitch %8576 %19452 0 %14586 1 %14586 2 %7357 10 %7357 3 %7356 12 %7356 4 %8191 6 %8245\n       %8245 = OpLabel\n      %24408 = OpCompositeExtract %uint %10945 0\n      %24681 = OpExtInst %v2float %1 UnpackHalf2x16 %24408\n      %10086 = OpCompositeExtract %float %24681 0\n      %17480 = OpCompositeExtract %float %24681 1\n      %14606 = OpCompositeConstruct %v4float %10086 %17480 %float_0 %float_0\n      %17276 = OpCompositeExtract %uint %10945 1\n      %18029 = OpExtInst %v2float %1 UnpackHalf2x16 %17276\n      %10087 = OpCompositeExtract %float %18029 0\n      %20672 = OpCompositeExtract %float %18029 1\n       %9038 = OpCompositeConstruct %v4float %10087 %20672 %float_0 %float_0\n               OpBranch %16225\n       %8191 = OpLabel\n      %12429 = OpCompositeExtract %uint %10945 0\n      %22686 = OpBitcast %int %12429\n      %18204 = OpCompositeConstruct %v2int %22686 %22686\n      %18351 = OpShiftLeftLogical %v2int %18204 %1959\n      %13337 = OpShiftRightArithmetic %v2int %18351 %2151\n      %10907 = OpConvertSToF %v2float %13337\n      %18249 = OpVectorTimesScalar %v2float %10907 %float_0_000976592302\n      %24072 = OpExtInst %v2float %1 FMax %73 %18249\n      %24332 = OpCompositeExtract %float %24072 0\n      %15573 = OpCompositeExtract %float %24072 1\n      %16671 = OpCompositeConstruct %v4float %24332 %15573 %float_0 %float_0\n      %19523 = OpCompositeExtract %uint %10945 1\n      %16034 = OpBitcast %int %19523\n      %18205 = OpCompositeConstruct %v2int %16034 %16034\n      %18352 = OpShiftLeftLogical %v2int %18205 %1959\n      %13338 = OpShiftRightArithmetic %v2int %18352 %2151\n      %10908 = OpConvertSToF %v2float %13338\n      %18250 = OpVectorTimesScalar %v2float %10908 %float_0_000976592302\n      %24073 = OpExtInst %v2float %1 FMax %73 %18250\n      %24333 = OpCompositeExtract %float %24073 0\n      %18765 = OpCompositeExtract %float %24073 1\n       %9039 = OpCompositeConstruct %v4float %24333 %18765 %float_0 %float_0\n               OpBranch %16225\n       %7356 = OpLabel\n      %22208 = OpCompositeExtract %uint %10945 0\n      %20237 = OpCompositeConstruct %v3uint %22208 %22208 %22208\n      %11023 = OpShiftRightLogical %v3uint %20237 %2996\n      %24040 = OpBitwiseAnd %v3uint %11023 %261\n      %18590 = OpBitwiseAnd %v3uint %11023 %1126\n      %23442 = OpShiftRightLogical %v3uint %24040 %2828\n      %16587 = OpIEqual %v3bool %23442 %2578\n      %11341 = OpExtInst %v3int %1 FindUMsb %18590\n      %10775 = OpBitcast %v3uint %11341\n       %6268 = OpISub %v3uint %2828 %10775\n       %8722 = OpIAdd %v3uint %10775 %2360\n      %10353 = OpSelect %v3uint %16587 %8722 %23442\n      %23254 = OpShiftLeftLogical %v3uint %18590 %6268\n      %18844 = OpBitwiseAnd %v3uint %23254 %1126\n      %10911 = OpSelect %v3uint %16587 %18844 %18590\n      %24571 = OpIAdd %v3uint %10353 %1018\n      %20353 = OpShiftLeftLogical %v3uint %24571 %393\n      %16296 = OpShiftLeftLogical %v3uint %10911 %141\n      %22398 = OpBitwiseOr %v3uint %20353 %16296\n      %13826 = OpIEqual %v3bool %24040 %2578\n      %16964 = OpSelect %v3uint %13826 %2578 %22398\n      %10705 = OpBitcast %v3float %16964\n      %19366 = OpShiftRightLogical %uint %22208 %uint_30\n      %18448 = OpConvertUToF %float %19366\n      %15905 = OpFMul %float %18448 %float_0_333333343\n      %21444 = OpCompositeExtract %float %10705 0\n      %10839 = OpCompositeExtract %float %10705 1\n       %7834 = OpCompositeExtract %float %10705 2\n      %15835 = OpCompositeConstruct %v4float %21444 %10839 %7834 %15905\n      %10230 = OpCompositeExtract %uint %10945 1\n      %13583 = OpCompositeConstruct %v3uint %10230 %10230 %10230\n      %11024 = OpShiftRightLogical %v3uint %13583 %2996\n      %24041 = OpBitwiseAnd %v3uint %11024 %261\n      %18591 = OpBitwiseAnd %v3uint %11024 %1126\n      %23443 = OpShiftRightLogical %v3uint %24041 %2828\n      %16588 = OpIEqual %v3bool %23443 %2578\n      %11342 = OpExtInst %v3int %1 FindUMsb %18591\n      %10776 = OpBitcast %v3uint %11342\n       %6269 = OpISub %v3uint %2828 %10776\n       %8723 = OpIAdd %v3uint %10776 %2360\n      %10354 = OpSelect %v3uint %16588 %8723 %23443\n      %23255 = OpShiftLeftLogical %v3uint %18591 %6269\n      %18845 = OpBitwiseAnd %v3uint %23255 %1126\n      %10912 = OpSelect %v3uint %16588 %18845 %18591\n      %24572 = OpIAdd %v3uint %10354 %1018\n      %20354 = OpShiftLeftLogical %v3uint %24572 %393\n      %16297 = OpShiftLeftLogical %v3uint %10912 %141\n      %22399 = OpBitwiseOr %v3uint %20354 %16297\n      %13827 = OpIEqual %v3bool %24041 %2578\n      %16965 = OpSelect %v3uint %13827 %2578 %22399\n      %10706 = OpBitcast %v3float %16965\n      %19367 = OpShiftRightLogical %uint %10230 %uint_30\n      %18449 = OpConvertUToF %float %19367\n      %15906 = OpFMul %float %18449 %float_0_333333343\n      %21445 = OpCompositeExtract %float %10706 0\n      %10840 = OpCompositeExtract %float %10706 1\n      %11026 = OpCompositeExtract %float %10706 2\n       %9040 = OpCompositeConstruct %v4float %21445 %10840 %11026 %15906\n               OpBranch %16225\n       %7357 = OpLabel\n      %22209 = OpCompositeExtract %uint %10945 0\n      %20238 = OpCompositeConstruct %v4uint %22209 %22209 %22209 %22209\n       %9372 = OpShiftRightLogical %v4uint %20238 %845\n      %18861 = OpBitwiseAnd %v4uint %9372 %635\n      %15544 = OpConvertUToF %v4float %18861\n      %16689 = OpFMul %v4float %15544 %2798\n      %23763 = OpCompositeExtract %uint %10945 1\n      %20814 = OpCompositeConstruct %v4uint %23763 %23763 %23763 %23763\n       %9373 = OpShiftRightLogical %v4uint %20814 %845\n      %18862 = OpBitwiseAnd %v4uint %9373 %635\n      %18736 = OpConvertUToF %v4float %18862\n       %9888 = OpFMul %v4float %18736 %2798\n               OpBranch %16225\n      %14586 = OpLabel\n      %22210 = OpCompositeExtract %uint %10945 0\n      %20239 = OpCompositeConstruct %v4uint %22210 %22210 %22210 %22210\n       %9374 = OpShiftRightLogical %v4uint %20239 %653\n      %19032 = OpBitwiseAnd %v4uint %9374 %1611\n      %13987 = OpConvertUToF %v4float %19032\n      %19236 = OpVectorTimesScalar %v4float %13987 %float_0_00392156886\n       %8608 = OpCompositeExtract %uint %10945 1\n      %24844 = OpCompositeConstruct %v4uint %8608 %8608 %8608 %8608\n       %9375 = OpShiftRightLogical %v4uint %24844 %653\n      %19033 = OpBitwiseAnd %v4uint %9375 %1611\n      %17179 = OpConvertUToF %v4float %19033\n      %12435 = OpVectorTimesScalar %v4float %17179 %float_0_00392156886\n               OpBranch %16225\n      %19452 = OpLabel\n      %12430 = OpCompositeExtract %uint %10945 0\n      %20463 = OpBitcast %float %12430\n      %17207 = OpCompositeConstruct %v2float %20463 %float_0\n      %11665 = OpVectorShuffle %v4float %17207 %17207 0 1 1 1\n      %22194 = OpCompositeExtract %uint %10945 1\n      %16233 = OpBitcast %float %22194\n      %20399 = OpCompositeConstruct %v2float %16233 %float_0\n      %23099 = OpVectorShuffle %v4float %20399 %20399 0 1 1 1\n               OpBranch %16225\n      %16225 = OpLabel\n      %11253 = OpPhi %v4float %23099 %19452 %12435 %14586 %9888 %7357 %9040 %7356 %9039 %8191 %9038 %8245\n      %13712 = OpPhi %v4float %11665 %19452 %19236 %14586 %16689 %7357 %15835 %7356 %16671 %8191 %14606 %8245\n               OpBranch %21264\n      %15206 = OpLabel\n      %21585 = OpIEqual %bool %6555 %uint_8\n               OpSelectionMerge %20300 DontFlatten\n               OpBranchConditional %21585 %6594 %8962\n       %8962 = OpLabel\n      %22067 = OpShiftRightLogical %uint %8114 %int_2\n      %13375 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22067\n      %12614 = OpLoad %uint %13375\n      %11694 = OpIAdd %uint %22067 %uint_1\n       %6402 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11694\n       %7031 = OpLoad %uint %6402\n       %8520 = OpIAdd %uint %8114 %6555\n      %21673 = OpShiftRightLogical %uint %8520 %int_2\n      %19602 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21673\n      %12615 = OpLoad %uint %19602\n      %11695 = OpIAdd %uint %21673 %uint_1\n      %24562 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11695\n      %16383 = OpLoad %uint %24562\n      %20786 = OpCompositeConstruct %v4uint %12614 %7031 %12615 %16383\n               OpBranch %20300\n       %6594 = OpLabel\n      %24489 = OpShiftRightLogical %uint %8114 %int_2\n      %13376 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24489\n      %12616 = OpLoad %uint %13376\n      %11696 = OpIAdd %uint %24489 %uint_1\n       %6403 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11696\n      %23652 = OpLoad %uint %6403\n      %11697 = OpIAdd %uint %24489 %uint_2\n       %6404 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11697\n      %23653 = OpLoad %uint %6404\n      %11698 = OpIAdd %uint %24489 %uint_3\n      %24563 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11698\n      %16384 = OpLoad %uint %24563\n      %20787 = OpCompositeConstruct %v4uint %12616 %23652 %23653 %16384\n               OpBranch %20300\n      %20300 = OpLabel\n      %10946 = OpPhi %v4uint %20787 %6594 %20786 %8962\n               OpSelectionMerge %20260 None\n               OpSwitch %8576 %20311 5 %8537 7 %8246\n       %8246 = OpLabel\n      %24411 = OpCompositeExtract %uint %10946 0\n      %24682 = OpExtInst %v2float %1 UnpackHalf2x16 %24411\n      %10103 = OpCompositeExtract %float %24682 0\n      %16058 = OpCompositeExtract %float %24682 1\n      %17027 = OpCompositeExtract %uint %10946 1\n      %15607 = OpExtInst %v2float %1 UnpackHalf2x16 %17027\n      %10088 = OpCompositeExtract %float %15607 0\n      %17481 = OpCompositeExtract %float %15607 1\n      %14607 = OpCompositeConstruct %v4float %10103 %16058 %10088 %17481\n      %17277 = OpCompositeExtract %uint %10946 2\n      %18030 = OpExtInst %v2float %1 UnpackHalf2x16 %17277\n      %10104 = OpCompositeExtract %float %18030 0\n      %16059 = OpCompositeExtract %float %18030 1\n      %17028 = OpCompositeExtract %uint %10946 3\n      %15608 = OpExtInst %v2float %1 UnpackHalf2x16 %17028\n      %10089 = OpCompositeExtract %float %15608 0\n      %20673 = OpCompositeExtract %float %15608 1\n       %9041 = OpCompositeConstruct %v4float %10104 %16059 %10089 %20673\n               OpBranch %20260\n       %8537 = OpLabel\n       %9724 = OpVectorShuffle %v2uint %10946 %10946 0 1\n      %23357 = OpBitcast %v2int %9724\n      %24784 = OpVectorShuffle %v4int %23357 %23357 0 0 1 1\n      %18600 = OpShiftLeftLogical %v4int %24784 %290\n      %15759 = OpShiftRightArithmetic %v4int %18600 %770\n      %10913 = OpConvertSToF %v4float %15759\n      %18210 = OpVectorTimesScalar %v4float %10913 %float_0_000976592302\n      %25234 = OpExtInst %v4float %1 FMax %1284 %18210\n      %14188 = OpVectorShuffle %v2uint %10946 %10946 2 3\n       %9408 = OpBitcast %v2int %14188\n      %24785 = OpVectorShuffle %v4int %9408 %9408 0 0 1 1\n      %18601 = OpShiftLeftLogical %v4int %24785 %290\n      %15760 = OpShiftRightArithmetic %v4int %18601 %770\n      %10914 = OpConvertSToF %v4float %15760\n      %21440 = OpVectorTimesScalar %v4float %10914 %float_0_000976592302\n      %17251 = OpExtInst %v4float %1 FMax %1284 %21440\n               OpBranch %20260\n      %20311 = OpLabel\n       %9762 = OpVectorShuffle %v2uint %10946 %10946 0 1\n      %20826 = OpBitcast %v2float %9762\n       %7037 = OpCompositeExtract %float %20826 0\n      %13419 = OpCompositeExtract %float %20826 1\n      %17017 = OpCompositeConstruct %v4float %7037 %13419 %float_0 %float_0\n      %16857 = OpVectorShuffle %v2uint %10946 %10946 2 3\n      %14174 = OpBitcast %v2float %16857\n       %7039 = OpCompositeExtract %float %14174 0\n      %16649 = OpCompositeExtract %float %14174 1\n       %9042 = OpCompositeConstruct %v4float %7039 %16649 %float_0 %float_0\n               OpBranch %20260\n      %20260 = OpLabel\n      %11254 = OpPhi %v4float %9042 %20311 %17251 %8537 %9041 %8246\n      %13713 = OpPhi %v4float %17017 %20311 %25234 %8537 %14607 %8246\n               OpBranch %21264\n      %21264 = OpLabel\n       %8971 = OpPhi %v4float %11254 %20260 %11253 %16225\n      %19594 = OpPhi %v4float %13713 %20260 %13712 %16225\n      %18096 = OpFAdd %v4float %14051 %19594\n      %17754 = OpFAdd %v4float %9826 %8971\n      %14461 = OpUGreaterThanEqual %bool %17238 %uint_6\n               OpSelectionMerge %24264 DontFlatten\n               OpBranchConditional %14461 %9905 %24264\n       %9905 = OpLabel\n      %14258 = OpShiftLeftLogical %uint %uint_4 %9130\n      %12090 = OpFMul %float %11052 %float_0_25\n      %20988 = OpIAdd %uint %7686 %14258\n               OpSelectionMerge %21265 DontFlatten\n               OpBranchConditional %23279 %15207 %16571\n      %16571 = OpLabel\n      %19165 = OpIEqual %bool %6555 %uint_4\n               OpSelectionMerge %20301 DontFlatten\n               OpBranchConditional %19165 %6595 %8963\n       %8963 = OpLabel\n      %22068 = OpShiftRightLogical %uint %20988 %int_2\n      %13377 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22068\n      %15062 = OpLoad %uint %13377\n       %8521 = OpIAdd %uint %20988 %6555\n      %21674 = OpShiftRightLogical %uint %8521 %int_2\n      %18691 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21674\n      %24412 = OpLoad %uint %18691\n      %20788 = OpCompositeConstruct %v2uint %15062 %24412\n               OpBranch %20301\n       %6595 = OpLabel\n      %24490 = OpShiftRightLogical %uint %20988 %int_2\n      %13378 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24490\n      %12617 = OpLoad %uint %13378\n      %11699 = OpIAdd %uint %24490 %uint_1\n      %24564 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11699\n      %16385 = OpLoad %uint %24564\n      %20789 = OpCompositeConstruct %v2uint %12617 %16385\n               OpBranch %20301\n      %20301 = OpLabel\n      %10947 = OpPhi %v2uint %20789 %6595 %20788 %8963\n               OpSelectionMerge %16226 None\n               OpSwitch %8576 %19453 0 %14587 1 %14587 2 %7360 10 %7360 3 %7358 12 %7358 4 %8192 6 %8247\n       %8247 = OpLabel\n      %24413 = OpCompositeExtract %uint %10947 0\n      %24683 = OpExtInst %v2float %1 UnpackHalf2x16 %24413\n      %10090 = OpCompositeExtract %float %24683 0\n      %17482 = OpCompositeExtract %float %24683 1\n      %14608 = OpCompositeConstruct %v4float %10090 %17482 %float_0 %float_0\n      %17278 = OpCompositeExtract %uint %10947 1\n      %18031 = OpExtInst %v2float %1 UnpackHalf2x16 %17278\n      %10091 = OpCompositeExtract %float %18031 0\n      %20674 = OpCompositeExtract %float %18031 1\n       %9043 = OpCompositeConstruct %v4float %10091 %20674 %float_0 %float_0\n               OpBranch %16226\n       %8192 = OpLabel\n      %12431 = OpCompositeExtract %uint %10947 0\n      %22687 = OpBitcast %int %12431\n      %18206 = OpCompositeConstruct %v2int %22687 %22687\n      %18353 = OpShiftLeftLogical %v2int %18206 %1959\n      %13339 = OpShiftRightArithmetic %v2int %18353 %2151\n      %10915 = OpConvertSToF %v2float %13339\n      %18251 = OpVectorTimesScalar %v2float %10915 %float_0_000976592302\n      %24074 = OpExtInst %v2float %1 FMax %73 %18251\n      %24334 = OpCompositeExtract %float %24074 0\n      %15574 = OpCompositeExtract %float %24074 1\n      %16672 = OpCompositeConstruct %v4float %24334 %15574 %float_0 %float_0\n      %19524 = OpCompositeExtract %uint %10947 1\n      %16035 = OpBitcast %int %19524\n      %18207 = OpCompositeConstruct %v2int %16035 %16035\n      %18354 = OpShiftLeftLogical %v2int %18207 %1959\n      %13340 = OpShiftRightArithmetic %v2int %18354 %2151\n      %10916 = OpConvertSToF %v2float %13340\n      %18252 = OpVectorTimesScalar %v2float %10916 %float_0_000976592302\n      %24075 = OpExtInst %v2float %1 FMax %73 %18252\n      %24335 = OpCompositeExtract %float %24075 0\n      %18766 = OpCompositeExtract %float %24075 1\n       %9044 = OpCompositeConstruct %v4float %24335 %18766 %float_0 %float_0\n               OpBranch %16226\n       %7358 = OpLabel\n      %22211 = OpCompositeExtract %uint %10947 0\n      %20240 = OpCompositeConstruct %v3uint %22211 %22211 %22211\n      %11027 = OpShiftRightLogical %v3uint %20240 %2996\n      %24042 = OpBitwiseAnd %v3uint %11027 %261\n      %18592 = OpBitwiseAnd %v3uint %11027 %1126\n      %23444 = OpShiftRightLogical %v3uint %24042 %2828\n      %16589 = OpIEqual %v3bool %23444 %2578\n      %11343 = OpExtInst %v3int %1 FindUMsb %18592\n      %10777 = OpBitcast %v3uint %11343\n       %6270 = OpISub %v3uint %2828 %10777\n       %8724 = OpIAdd %v3uint %10777 %2360\n      %10355 = OpSelect %v3uint %16589 %8724 %23444\n      %23256 = OpShiftLeftLogical %v3uint %18592 %6270\n      %18846 = OpBitwiseAnd %v3uint %23256 %1126\n      %10917 = OpSelect %v3uint %16589 %18846 %18592\n      %24573 = OpIAdd %v3uint %10355 %1018\n      %20355 = OpShiftLeftLogical %v3uint %24573 %393\n      %16298 = OpShiftLeftLogical %v3uint %10917 %141\n      %22400 = OpBitwiseOr %v3uint %20355 %16298\n      %13828 = OpIEqual %v3bool %24042 %2578\n      %16966 = OpSelect %v3uint %13828 %2578 %22400\n      %10707 = OpBitcast %v3float %16966\n      %19368 = OpShiftRightLogical %uint %22211 %uint_30\n      %18450 = OpConvertUToF %float %19368\n      %15907 = OpFMul %float %18450 %float_0_333333343\n      %21446 = OpCompositeExtract %float %10707 0\n      %10841 = OpCompositeExtract %float %10707 1\n       %7835 = OpCompositeExtract %float %10707 2\n      %15836 = OpCompositeConstruct %v4float %21446 %10841 %7835 %15907\n      %10231 = OpCompositeExtract %uint %10947 1\n      %13584 = OpCompositeConstruct %v3uint %10231 %10231 %10231\n      %11028 = OpShiftRightLogical %v3uint %13584 %2996\n      %24043 = OpBitwiseAnd %v3uint %11028 %261\n      %18593 = OpBitwiseAnd %v3uint %11028 %1126\n      %23445 = OpShiftRightLogical %v3uint %24043 %2828\n      %16590 = OpIEqual %v3bool %23445 %2578\n      %11344 = OpExtInst %v3int %1 FindUMsb %18593\n      %10778 = OpBitcast %v3uint %11344\n       %6271 = OpISub %v3uint %2828 %10778\n       %8725 = OpIAdd %v3uint %10778 %2360\n      %10356 = OpSelect %v3uint %16590 %8725 %23445\n      %23257 = OpShiftLeftLogical %v3uint %18593 %6271\n      %18847 = OpBitwiseAnd %v3uint %23257 %1126\n      %10918 = OpSelect %v3uint %16590 %18847 %18593\n      %24574 = OpIAdd %v3uint %10356 %1018\n      %20356 = OpShiftLeftLogical %v3uint %24574 %393\n      %16299 = OpShiftLeftLogical %v3uint %10918 %141\n      %22401 = OpBitwiseOr %v3uint %20356 %16299\n      %13829 = OpIEqual %v3bool %24043 %2578\n      %16967 = OpSelect %v3uint %13829 %2578 %22401\n      %10708 = OpBitcast %v3float %16967\n      %19369 = OpShiftRightLogical %uint %10231 %uint_30\n      %18451 = OpConvertUToF %float %19369\n      %15908 = OpFMul %float %18451 %float_0_333333343\n      %21447 = OpCompositeExtract %float %10708 0\n      %10842 = OpCompositeExtract %float %10708 1\n      %11029 = OpCompositeExtract %float %10708 2\n       %9045 = OpCompositeConstruct %v4float %21447 %10842 %11029 %15908\n               OpBranch %16226\n       %7360 = OpLabel\n      %22212 = OpCompositeExtract %uint %10947 0\n      %20241 = OpCompositeConstruct %v4uint %22212 %22212 %22212 %22212\n       %9376 = OpShiftRightLogical %v4uint %20241 %845\n      %18863 = OpBitwiseAnd %v4uint %9376 %635\n      %15545 = OpConvertUToF %v4float %18863\n      %16690 = OpFMul %v4float %15545 %2798\n      %23764 = OpCompositeExtract %uint %10947 1\n      %20815 = OpCompositeConstruct %v4uint %23764 %23764 %23764 %23764\n       %9377 = OpShiftRightLogical %v4uint %20815 %845\n      %18864 = OpBitwiseAnd %v4uint %9377 %635\n      %18737 = OpConvertUToF %v4float %18864\n       %9889 = OpFMul %v4float %18737 %2798\n               OpBranch %16226\n      %14587 = OpLabel\n      %22213 = OpCompositeExtract %uint %10947 0\n      %20242 = OpCompositeConstruct %v4uint %22213 %22213 %22213 %22213\n       %9378 = OpShiftRightLogical %v4uint %20242 %653\n      %19034 = OpBitwiseAnd %v4uint %9378 %1611\n      %13988 = OpConvertUToF %v4float %19034\n      %19237 = OpVectorTimesScalar %v4float %13988 %float_0_00392156886\n       %8609 = OpCompositeExtract %uint %10947 1\n      %24845 = OpCompositeConstruct %v4uint %8609 %8609 %8609 %8609\n       %9379 = OpShiftRightLogical %v4uint %24845 %653\n      %19035 = OpBitwiseAnd %v4uint %9379 %1611\n      %17180 = OpConvertUToF %v4float %19035\n      %12436 = OpVectorTimesScalar %v4float %17180 %float_0_00392156886\n               OpBranch %16226\n      %19453 = OpLabel\n      %12432 = OpCompositeExtract %uint %10947 0\n      %20464 = OpBitcast %float %12432\n      %17208 = OpCompositeConstruct %v2float %20464 %float_0\n      %11666 = OpVectorShuffle %v4float %17208 %17208 0 1 1 1\n      %22195 = OpCompositeExtract %uint %10947 1\n      %16234 = OpBitcast %float %22195\n      %20400 = OpCompositeConstruct %v2float %16234 %float_0\n      %23100 = OpVectorShuffle %v4float %20400 %20400 0 1 1 1\n               OpBranch %16226\n      %16226 = OpLabel\n      %11255 = OpPhi %v4float %23100 %19453 %12436 %14587 %9889 %7360 %9045 %7358 %9044 %8192 %9043 %8247\n      %13714 = OpPhi %v4float %11666 %19453 %19237 %14587 %16690 %7360 %15836 %7358 %16672 %8192 %14608 %8247\n               OpBranch %21265\n      %15207 = OpLabel\n      %21586 = OpIEqual %bool %6555 %uint_8\n               OpSelectionMerge %20302 DontFlatten\n               OpBranchConditional %21586 %6596 %8964\n       %8964 = OpLabel\n      %22069 = OpShiftRightLogical %uint %20988 %int_2\n      %13379 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22069\n      %12618 = OpLoad %uint %13379\n      %11700 = OpIAdd %uint %22069 %uint_1\n       %6405 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11700\n       %7032 = OpLoad %uint %6405\n       %8522 = OpIAdd %uint %20988 %6555\n      %21675 = OpShiftRightLogical %uint %8522 %int_2\n      %19603 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21675\n      %12619 = OpLoad %uint %19603\n      %11701 = OpIAdd %uint %21675 %uint_1\n      %24565 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11701\n      %16386 = OpLoad %uint %24565\n      %20790 = OpCompositeConstruct %v4uint %12618 %7032 %12619 %16386\n               OpBranch %20302\n       %6596 = OpLabel\n      %24491 = OpShiftRightLogical %uint %20988 %int_2\n      %13380 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24491\n      %12620 = OpLoad %uint %13380\n      %11702 = OpIAdd %uint %24491 %uint_1\n       %6406 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11702\n      %23654 = OpLoad %uint %6406\n      %11703 = OpIAdd %uint %24491 %uint_2\n       %6407 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11703\n      %23655 = OpLoad %uint %6407\n      %11704 = OpIAdd %uint %24491 %uint_3\n      %24566 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11704\n      %16387 = OpLoad %uint %24566\n      %20791 = OpCompositeConstruct %v4uint %12620 %23654 %23655 %16387\n               OpBranch %20302\n      %20302 = OpLabel\n      %10948 = OpPhi %v4uint %20791 %6596 %20790 %8964\n               OpSelectionMerge %20261 None\n               OpSwitch %8576 %20312 5 %8538 7 %8248\n       %8248 = OpLabel\n      %24414 = OpCompositeExtract %uint %10948 0\n      %24684 = OpExtInst %v2float %1 UnpackHalf2x16 %24414\n      %10105 = OpCompositeExtract %float %24684 0\n      %16060 = OpCompositeExtract %float %24684 1\n      %17029 = OpCompositeExtract %uint %10948 1\n      %15609 = OpExtInst %v2float %1 UnpackHalf2x16 %17029\n      %10092 = OpCompositeExtract %float %15609 0\n      %17483 = OpCompositeExtract %float %15609 1\n      %14609 = OpCompositeConstruct %v4float %10105 %16060 %10092 %17483\n      %17279 = OpCompositeExtract %uint %10948 2\n      %18032 = OpExtInst %v2float %1 UnpackHalf2x16 %17279\n      %10106 = OpCompositeExtract %float %18032 0\n      %16061 = OpCompositeExtract %float %18032 1\n      %17030 = OpCompositeExtract %uint %10948 3\n      %15610 = OpExtInst %v2float %1 UnpackHalf2x16 %17030\n      %10093 = OpCompositeExtract %float %15610 0\n      %20675 = OpCompositeExtract %float %15610 1\n       %9046 = OpCompositeConstruct %v4float %10106 %16061 %10093 %20675\n               OpBranch %20261\n       %8538 = OpLabel\n       %9725 = OpVectorShuffle %v2uint %10948 %10948 0 1\n      %23358 = OpBitcast %v2int %9725\n      %24786 = OpVectorShuffle %v4int %23358 %23358 0 0 1 1\n      %18602 = OpShiftLeftLogical %v4int %24786 %290\n      %15761 = OpShiftRightArithmetic %v4int %18602 %770\n      %10919 = OpConvertSToF %v4float %15761\n      %18211 = OpVectorTimesScalar %v4float %10919 %float_0_000976592302\n      %25235 = OpExtInst %v4float %1 FMax %1284 %18211\n      %14189 = OpVectorShuffle %v2uint %10948 %10948 2 3\n       %9409 = OpBitcast %v2int %14189\n      %24787 = OpVectorShuffle %v4int %9409 %9409 0 0 1 1\n      %18603 = OpShiftLeftLogical %v4int %24787 %290\n      %15762 = OpShiftRightArithmetic %v4int %18603 %770\n      %10920 = OpConvertSToF %v4float %15762\n      %21441 = OpVectorTimesScalar %v4float %10920 %float_0_000976592302\n      %17252 = OpExtInst %v4float %1 FMax %1284 %21441\n               OpBranch %20261\n      %20312 = OpLabel\n       %9763 = OpVectorShuffle %v2uint %10948 %10948 0 1\n      %20827 = OpBitcast %v2float %9763\n       %7040 = OpCompositeExtract %float %20827 0\n      %13420 = OpCompositeExtract %float %20827 1\n      %17018 = OpCompositeConstruct %v4float %7040 %13420 %float_0 %float_0\n      %16858 = OpVectorShuffle %v2uint %10948 %10948 2 3\n      %14175 = OpBitcast %v2float %16858\n       %7041 = OpCompositeExtract %float %14175 0\n      %16650 = OpCompositeExtract %float %14175 1\n       %9047 = OpCompositeConstruct %v4float %7041 %16650 %float_0 %float_0\n               OpBranch %20261\n      %20261 = OpLabel\n      %11256 = OpPhi %v4float %9047 %20312 %17252 %8538 %9046 %8248\n      %13715 = OpPhi %v4float %17018 %20312 %25235 %8538 %14609 %8248\n               OpBranch %21265\n      %21265 = OpLabel\n       %8972 = OpPhi %v4float %11256 %20261 %11255 %16226\n      %19595 = OpPhi %v4float %13715 %20261 %13714 %16226\n      %17222 = OpFAdd %v4float %18096 %19595\n       %6641 = OpFAdd %v4float %17754 %8972\n      %16376 = OpIAdd %uint %8114 %14258\n               OpSelectionMerge %21266 DontFlatten\n               OpBranchConditional %23279 %15208 %16572\n      %16572 = OpLabel\n      %19166 = OpIEqual %bool %6555 %uint_4\n               OpSelectionMerge %20303 DontFlatten\n               OpBranchConditional %19166 %6597 %8965\n       %8965 = OpLabel\n      %22070 = OpShiftRightLogical %uint %16376 %int_2\n      %13381 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22070\n      %15063 = OpLoad %uint %13381\n       %8523 = OpIAdd %uint %16376 %6555\n      %21676 = OpShiftRightLogical %uint %8523 %int_2\n      %18692 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21676\n      %24415 = OpLoad %uint %18692\n      %20792 = OpCompositeConstruct %v2uint %15063 %24415\n               OpBranch %20303\n       %6597 = OpLabel\n      %24492 = OpShiftRightLogical %uint %16376 %int_2\n      %13382 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24492\n      %12621 = OpLoad %uint %13382\n      %11705 = OpIAdd %uint %24492 %uint_1\n      %24567 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11705\n      %16388 = OpLoad %uint %24567\n      %20793 = OpCompositeConstruct %v2uint %12621 %16388\n               OpBranch %20303\n      %20303 = OpLabel\n      %10949 = OpPhi %v2uint %20793 %6597 %20792 %8965\n               OpSelectionMerge %16227 None\n               OpSwitch %8576 %19454 0 %14588 1 %14588 2 %7362 10 %7362 3 %7361 12 %7361 4 %8193 6 %8249\n       %8249 = OpLabel\n      %24416 = OpCompositeExtract %uint %10949 0\n      %24685 = OpExtInst %v2float %1 UnpackHalf2x16 %24416\n      %10094 = OpCompositeExtract %float %24685 0\n      %17484 = OpCompositeExtract %float %24685 1\n      %14610 = OpCompositeConstruct %v4float %10094 %17484 %float_0 %float_0\n      %17280 = OpCompositeExtract %uint %10949 1\n      %18033 = OpExtInst %v2float %1 UnpackHalf2x16 %17280\n      %10095 = OpCompositeExtract %float %18033 0\n      %20676 = OpCompositeExtract %float %18033 1\n       %9048 = OpCompositeConstruct %v4float %10095 %20676 %float_0 %float_0\n               OpBranch %16227\n       %8193 = OpLabel\n      %12433 = OpCompositeExtract %uint %10949 0\n      %22688 = OpBitcast %int %12433\n      %18208 = OpCompositeConstruct %v2int %22688 %22688\n      %18355 = OpShiftLeftLogical %v2int %18208 %1959\n      %13341 = OpShiftRightArithmetic %v2int %18355 %2151\n      %10921 = OpConvertSToF %v2float %13341\n      %18253 = OpVectorTimesScalar %v2float %10921 %float_0_000976592302\n      %24076 = OpExtInst %v2float %1 FMax %73 %18253\n      %24336 = OpCompositeExtract %float %24076 0\n      %15575 = OpCompositeExtract %float %24076 1\n      %16673 = OpCompositeConstruct %v4float %24336 %15575 %float_0 %float_0\n      %19525 = OpCompositeExtract %uint %10949 1\n      %16036 = OpBitcast %int %19525\n      %18212 = OpCompositeConstruct %v2int %16036 %16036\n      %18356 = OpShiftLeftLogical %v2int %18212 %1959\n      %13342 = OpShiftRightArithmetic %v2int %18356 %2151\n      %10922 = OpConvertSToF %v2float %13342\n      %18254 = OpVectorTimesScalar %v2float %10922 %float_0_000976592302\n      %24077 = OpExtInst %v2float %1 FMax %73 %18254\n      %24337 = OpCompositeExtract %float %24077 0\n      %18767 = OpCompositeExtract %float %24077 1\n       %9049 = OpCompositeConstruct %v4float %24337 %18767 %float_0 %float_0\n               OpBranch %16227\n       %7361 = OpLabel\n      %22214 = OpCompositeExtract %uint %10949 0\n      %20243 = OpCompositeConstruct %v3uint %22214 %22214 %22214\n      %11030 = OpShiftRightLogical %v3uint %20243 %2996\n      %24044 = OpBitwiseAnd %v3uint %11030 %261\n      %18594 = OpBitwiseAnd %v3uint %11030 %1126\n      %23446 = OpShiftRightLogical %v3uint %24044 %2828\n      %16591 = OpIEqual %v3bool %23446 %2578\n      %11345 = OpExtInst %v3int %1 FindUMsb %18594\n      %10779 = OpBitcast %v3uint %11345\n       %6272 = OpISub %v3uint %2828 %10779\n       %8726 = OpIAdd %v3uint %10779 %2360\n      %10357 = OpSelect %v3uint %16591 %8726 %23446\n      %23258 = OpShiftLeftLogical %v3uint %18594 %6272\n      %18848 = OpBitwiseAnd %v3uint %23258 %1126\n      %10923 = OpSelect %v3uint %16591 %18848 %18594\n      %24575 = OpIAdd %v3uint %10357 %1018\n      %20357 = OpShiftLeftLogical %v3uint %24575 %393\n      %16300 = OpShiftLeftLogical %v3uint %10923 %141\n      %22402 = OpBitwiseOr %v3uint %20357 %16300\n      %13830 = OpIEqual %v3bool %24044 %2578\n      %16968 = OpSelect %v3uint %13830 %2578 %22402\n      %10709 = OpBitcast %v3float %16968\n      %19370 = OpShiftRightLogical %uint %22214 %uint_30\n      %18452 = OpConvertUToF %float %19370\n      %15909 = OpFMul %float %18452 %float_0_333333343\n      %21448 = OpCompositeExtract %float %10709 0\n      %10843 = OpCompositeExtract %float %10709 1\n       %7836 = OpCompositeExtract %float %10709 2\n      %15837 = OpCompositeConstruct %v4float %21448 %10843 %7836 %15909\n      %10232 = OpCompositeExtract %uint %10949 1\n      %13585 = OpCompositeConstruct %v3uint %10232 %10232 %10232\n      %11031 = OpShiftRightLogical %v3uint %13585 %2996\n      %24045 = OpBitwiseAnd %v3uint %11031 %261\n      %18595 = OpBitwiseAnd %v3uint %11031 %1126\n      %23447 = OpShiftRightLogical %v3uint %24045 %2828\n      %16592 = OpIEqual %v3bool %23447 %2578\n      %11346 = OpExtInst %v3int %1 FindUMsb %18595\n      %10780 = OpBitcast %v3uint %11346\n       %6273 = OpISub %v3uint %2828 %10780\n       %8727 = OpIAdd %v3uint %10780 %2360\n      %10358 = OpSelect %v3uint %16592 %8727 %23447\n      %23259 = OpShiftLeftLogical %v3uint %18595 %6273\n      %18849 = OpBitwiseAnd %v3uint %23259 %1126\n      %10924 = OpSelect %v3uint %16592 %18849 %18595\n      %24576 = OpIAdd %v3uint %10358 %1018\n      %20358 = OpShiftLeftLogical %v3uint %24576 %393\n      %16301 = OpShiftLeftLogical %v3uint %10924 %141\n      %22403 = OpBitwiseOr %v3uint %20358 %16301\n      %13831 = OpIEqual %v3bool %24045 %2578\n      %16969 = OpSelect %v3uint %13831 %2578 %22403\n      %10710 = OpBitcast %v3float %16969\n      %19371 = OpShiftRightLogical %uint %10232 %uint_30\n      %18453 = OpConvertUToF %float %19371\n      %15910 = OpFMul %float %18453 %float_0_333333343\n      %21449 = OpCompositeExtract %float %10710 0\n      %10844 = OpCompositeExtract %float %10710 1\n      %11032 = OpCompositeExtract %float %10710 2\n       %9050 = OpCompositeConstruct %v4float %21449 %10844 %11032 %15910\n               OpBranch %16227\n       %7362 = OpLabel\n      %22215 = OpCompositeExtract %uint %10949 0\n      %20244 = OpCompositeConstruct %v4uint %22215 %22215 %22215 %22215\n       %9380 = OpShiftRightLogical %v4uint %20244 %845\n      %18865 = OpBitwiseAnd %v4uint %9380 %635\n      %15546 = OpConvertUToF %v4float %18865\n      %16691 = OpFMul %v4float %15546 %2798\n      %23765 = OpCompositeExtract %uint %10949 1\n      %20816 = OpCompositeConstruct %v4uint %23765 %23765 %23765 %23765\n       %9381 = OpShiftRightLogical %v4uint %20816 %845\n      %18866 = OpBitwiseAnd %v4uint %9381 %635\n      %18738 = OpConvertUToF %v4float %18866\n       %9890 = OpFMul %v4float %18738 %2798\n               OpBranch %16227\n      %14588 = OpLabel\n      %22216 = OpCompositeExtract %uint %10949 0\n      %20245 = OpCompositeConstruct %v4uint %22216 %22216 %22216 %22216\n       %9382 = OpShiftRightLogical %v4uint %20245 %653\n      %19036 = OpBitwiseAnd %v4uint %9382 %1611\n      %13989 = OpConvertUToF %v4float %19036\n      %19238 = OpVectorTimesScalar %v4float %13989 %float_0_00392156886\n       %8610 = OpCompositeExtract %uint %10949 1\n      %24846 = OpCompositeConstruct %v4uint %8610 %8610 %8610 %8610\n       %9383 = OpShiftRightLogical %v4uint %24846 %653\n      %19037 = OpBitwiseAnd %v4uint %9383 %1611\n      %17181 = OpConvertUToF %v4float %19037\n      %12437 = OpVectorTimesScalar %v4float %17181 %float_0_00392156886\n               OpBranch %16227\n      %19454 = OpLabel\n      %12438 = OpCompositeExtract %uint %10949 0\n      %20465 = OpBitcast %float %12438\n      %17209 = OpCompositeConstruct %v2float %20465 %float_0\n      %11667 = OpVectorShuffle %v4float %17209 %17209 0 1 1 1\n      %22196 = OpCompositeExtract %uint %10949 1\n      %16235 = OpBitcast %float %22196\n      %20401 = OpCompositeConstruct %v2float %16235 %float_0\n      %23101 = OpVectorShuffle %v4float %20401 %20401 0 1 1 1\n               OpBranch %16227\n      %16227 = OpLabel\n      %11257 = OpPhi %v4float %23101 %19454 %12437 %14588 %9890 %7362 %9050 %7361 %9049 %8193 %9048 %8249\n      %13716 = OpPhi %v4float %11667 %19454 %19238 %14588 %16691 %7362 %15837 %7361 %16673 %8193 %14610 %8249\n               OpBranch %21266\n      %15208 = OpLabel\n      %21587 = OpIEqual %bool %6555 %uint_8\n               OpSelectionMerge %20304 DontFlatten\n               OpBranchConditional %21587 %6598 %8966\n       %8966 = OpLabel\n      %22071 = OpShiftRightLogical %uint %16376 %int_2\n      %13383 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22071\n      %12622 = OpLoad %uint %13383\n      %11706 = OpIAdd %uint %22071 %uint_1\n       %6408 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11706\n       %7033 = OpLoad %uint %6408\n       %8524 = OpIAdd %uint %16376 %6555\n      %21677 = OpShiftRightLogical %uint %8524 %int_2\n      %19604 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21677\n      %12623 = OpLoad %uint %19604\n      %11707 = OpIAdd %uint %21677 %uint_1\n      %24568 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11707\n      %16389 = OpLoad %uint %24568\n      %20794 = OpCompositeConstruct %v4uint %12622 %7033 %12623 %16389\n               OpBranch %20304\n       %6598 = OpLabel\n      %24493 = OpShiftRightLogical %uint %16376 %int_2\n      %13384 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24493\n      %12624 = OpLoad %uint %13384\n      %11708 = OpIAdd %uint %24493 %uint_1\n       %6409 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11708\n      %23656 = OpLoad %uint %6409\n      %11709 = OpIAdd %uint %24493 %uint_2\n       %6410 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11709\n      %23657 = OpLoad %uint %6410\n      %11710 = OpIAdd %uint %24493 %uint_3\n      %24577 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11710\n      %16390 = OpLoad %uint %24577\n      %20795 = OpCompositeConstruct %v4uint %12624 %23656 %23657 %16390\n               OpBranch %20304\n      %20304 = OpLabel\n      %10950 = OpPhi %v4uint %20795 %6598 %20794 %8966\n               OpSelectionMerge %20262 None\n               OpSwitch %8576 %20313 5 %8539 7 %8250\n       %8250 = OpLabel\n      %24417 = OpCompositeExtract %uint %10950 0\n      %24686 = OpExtInst %v2float %1 UnpackHalf2x16 %24417\n      %10107 = OpCompositeExtract %float %24686 0\n      %16062 = OpCompositeExtract %float %24686 1\n      %17031 = OpCompositeExtract %uint %10950 1\n      %15611 = OpExtInst %v2float %1 UnpackHalf2x16 %17031\n      %10096 = OpCompositeExtract %float %15611 0\n      %17485 = OpCompositeExtract %float %15611 1\n      %14611 = OpCompositeConstruct %v4float %10107 %16062 %10096 %17485\n      %17281 = OpCompositeExtract %uint %10950 2\n      %18034 = OpExtInst %v2float %1 UnpackHalf2x16 %17281\n      %10108 = OpCompositeExtract %float %18034 0\n      %16063 = OpCompositeExtract %float %18034 1\n      %17032 = OpCompositeExtract %uint %10950 3\n      %15612 = OpExtInst %v2float %1 UnpackHalf2x16 %17032\n      %10097 = OpCompositeExtract %float %15612 0\n      %20677 = OpCompositeExtract %float %15612 1\n       %9051 = OpCompositeConstruct %v4float %10108 %16063 %10097 %20677\n               OpBranch %20262\n       %8539 = OpLabel\n       %9726 = OpVectorShuffle %v2uint %10950 %10950 0 1\n      %23359 = OpBitcast %v2int %9726\n      %24788 = OpVectorShuffle %v4int %23359 %23359 0 0 1 1\n      %18604 = OpShiftLeftLogical %v4int %24788 %290\n      %15763 = OpShiftRightArithmetic %v4int %18604 %770\n      %10925 = OpConvertSToF %v4float %15763\n      %18213 = OpVectorTimesScalar %v4float %10925 %float_0_000976592302\n      %25236 = OpExtInst %v4float %1 FMax %1284 %18213\n      %14190 = OpVectorShuffle %v2uint %10950 %10950 2 3\n       %9410 = OpBitcast %v2int %14190\n      %24789 = OpVectorShuffle %v4int %9410 %9410 0 0 1 1\n      %18605 = OpShiftLeftLogical %v4int %24789 %290\n      %15764 = OpShiftRightArithmetic %v4int %18605 %770\n      %10926 = OpConvertSToF %v4float %15764\n      %21450 = OpVectorTimesScalar %v4float %10926 %float_0_000976592302\n      %17253 = OpExtInst %v4float %1 FMax %1284 %21450\n               OpBranch %20262\n      %20313 = OpLabel\n       %9764 = OpVectorShuffle %v2uint %10950 %10950 0 1\n      %20828 = OpBitcast %v2float %9764\n       %7042 = OpCompositeExtract %float %20828 0\n      %13421 = OpCompositeExtract %float %20828 1\n      %17019 = OpCompositeConstruct %v4float %7042 %13421 %float_0 %float_0\n      %16859 = OpVectorShuffle %v2uint %10950 %10950 2 3\n      %14176 = OpBitcast %v2float %16859\n       %7043 = OpCompositeExtract %float %14176 0\n      %16651 = OpCompositeExtract %float %14176 1\n       %9052 = OpCompositeConstruct %v4float %7043 %16651 %float_0 %float_0\n               OpBranch %20262\n      %20262 = OpLabel\n      %11258 = OpPhi %v4float %9052 %20313 %17253 %8539 %9051 %8250\n      %13717 = OpPhi %v4float %17019 %20313 %25236 %8539 %14611 %8250\n               OpBranch %21266\n      %21266 = OpLabel\n       %8973 = OpPhi %v4float %11258 %20262 %11257 %16227\n      %19596 = OpPhi %v4float %13717 %20262 %13716 %16227\n      %19521 = OpFAdd %v4float %17222 %19596\n      %23869 = OpFAdd %v4float %6641 %8973\n               OpBranch %24264\n      %24264 = OpLabel\n      %11175 = OpPhi %v4float %17754 %21264 %23869 %21266\n      %14420 = OpPhi %v4float %18096 %21264 %19521 %21266\n      %14518 = OpPhi %float %23069 %21264 %12090 %21266\n               OpBranch %21267\n      %21267 = OpLabel\n      %11176 = OpPhi %v4float %9826 %21263 %11175 %24264\n      %12387 = OpPhi %v4float %14051 %21263 %14420 %24264\n      %11944 = OpPhi %float %11052 %21263 %14518 %24264\n      %25151 = OpVectorTimesScalar %v4float %12387 %11944\n       %9562 = OpVectorTimesScalar %v4float %11176 %11944\n               OpSelectionMerge %16228 DontFlatten\n               OpBranchConditional %7475 %10049 %16228\n      %10049 = OpLabel\n      %18316 = OpVectorShuffle %v4float %25151 %25151 2 1 0 3\n      %20341 = OpVectorShuffle %v4float %9562 %9562 2 1 0 3\n               OpBranch %16228\n      %16228 = OpLabel\n       %9864 = OpPhi %v4float %9562 %21267 %20341 %10049\n      %13705 = OpPhi %v4float %25151 %21267 %18316 %10049\n      %14546 = OpULessThan %bool %7640 %7359\n               OpSelectionMerge %24688 DontFlatten\n               OpBranchConditional %14546 %21994 %24688\n      %21994 = OpLabel\n               OpBranch %24688\n      %24688 = OpLabel\n      %11376 = OpPhi %v4float %9864 %16228 %13705 %21994\n      %19932 = OpIAdd %v2uint %12025 %23020\n      %24181 = OpShiftRightLogical %v2uint %19932 %1828\n       %7712 = OpUDiv %v2uint %24181 %23601\n      %18183 = OpIMul %v2uint %23601 %7712\n      %18273 = OpISub %v2uint %24181 %18183\n      %11232 = OpShiftLeftLogical %v2uint %7712 %1828\n      %13284 = OpCompositeExtract %uint %18273 0\n      %10872 = OpCompositeExtract %uint %23601 1\n      %22887 = OpIMul %uint %13284 %10872\n       %6943 = OpCompositeExtract %uint %18273 1\n      %10469 = OpIAdd %uint %22887 %6943\n      %18851 = OpBitwiseAnd %v2uint %19932 %1828\n      %10581 = OpShiftLeftLogical %uint %10469 %uint_6\n      %20916 = OpCompositeExtract %uint %18851 1\n      %23596 = OpShiftLeftLogical %uint %20916 %uint_5\n      %19814 = OpBitwiseOr %uint %10581 %23596\n      %21476 = OpCompositeExtract %uint %18851 0\n      %11714 = OpShiftLeftLogical %uint %21476 %uint_4\n      %11193 = OpBitwiseOr %uint %19814 %11714\n               OpSelectionMerge %21313 DontFlatten\n               OpBranchConditional %20495 %10574 %21373\n      %21373 = OpLabel\n      %10608 = OpBitcast %v2int %11232\n      %17907 = OpCompositeExtract %int %10608 1\n      %19904 = OpShiftRightArithmetic %int %17907 %int_5\n      %22404 = OpBitcast %int %8444\n       %7938 = OpIMul %int %19904 %22404\n      %25154 = OpCompositeExtract %int %10608 0\n      %20423 = OpShiftRightArithmetic %int %25154 %int_5\n      %18867 = OpIAdd %int %7938 %20423\n       %9546 = OpShiftLeftLogical %int %18867 %int_6\n      %24635 = OpShiftRightArithmetic %int %17907 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25154 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17334 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17334 %uint_4\n      %12766 = OpShiftRightArithmetic %int %17907 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25154 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %17907 %int_3\n      %20574 = OpBitwiseAnd %int %10425 %int_1\n      %21533 = OpShiftLeftLogical %int %20574 %int_1\n       %8890 = OpBitwiseXor %int %20766 %21533\n      %20598 = OpBitwiseAnd %int %17907 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6551\n       %7092 = OpShiftLeftLogical %int %21575 %int_11\n      %16219 = OpBitwiseOr %int %18430 %7092\n      %14958 = OpShiftRightArithmetic %int %24163 %int_4\n       %6328 = OpBitwiseAnd %int %14958 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %16219 %21630\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6329 = OpBitwiseAnd %int %14959 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24163 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %21313\n      %10574 = OpLabel\n      %19866 = OpCompositeExtract %uint %11232 0\n      %11267 = OpCompositeExtract %uint %11232 1\n       %8414 = OpCompositeConstruct %v3uint %19866 %11267 %17416\n      %20125 = OpBitcast %v3int %8414\n      %11259 = OpCompositeExtract %int %20125 2\n      %19905 = OpShiftRightArithmetic %int %11259 %int_2\n      %22405 = OpBitcast %int %25203\n       %7939 = OpIMul %int %19905 %22405\n      %25155 = OpCompositeExtract %int %20125 1\n      %19055 = OpShiftRightArithmetic %int %25155 %int_4\n      %11053 = OpIAdd %int %7939 %19055\n      %16898 = OpBitcast %int %8444\n      %14944 = OpIMul %int %11053 %16898\n      %25156 = OpCompositeExtract %int %20125 0\n      %20424 = OpShiftRightArithmetic %int %25156 %int_5\n      %18940 = OpIAdd %int %14944 %20424\n       %8797 = OpShiftLeftLogical %int %18940 %int_7\n      %11434 = OpBitwiseAnd %int %11259 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %25155 %int_1\n      %21364 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21364 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %25156 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17335 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17335 %uint_4\n      %13015 = OpShiftRightArithmetic %int %25155 %int_3\n       %9929 = OpBitwiseXor %int %13015 %19905\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %25156 %int_3\n      %20575 = OpBitwiseAnd %int %9616 %int_3\n      %21534 = OpShiftLeftLogical %int %16793 %int_1\n       %8891 = OpBitwiseXor %int %20575 %21534\n      %20599 = OpBitwiseAnd %int %25155 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6552\n       %7093 = OpShiftLeftLogical %int %16793 %int_11\n      %16220 = OpBitwiseOr %int %18431 %7093\n      %14960 = OpShiftRightArithmetic %int %24144 %int_4\n       %6330 = OpBitwiseAnd %int %14960 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %16220 %21632\n      %14961 = OpShiftRightArithmetic %int %24144 %int_5\n       %6331 = OpBitwiseAnd %int %14961 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24144 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %21313\n      %21313 = OpLabel\n       %9506 = OpPhi %uint %16870 %10574 %16869 %21373\n      %16843 = OpIMul %uint %8858 %10872\n      %11993 = OpIMul %uint %9506 %16843\n      %15138 = OpIAdd %uint %11993 %11193\n       %9754 = OpShiftRightLogical %uint %15138 %int_4\n       %9007 = OpBitcast %v4uint %13705\n       %8174 = OpIEqual %bool %19164 %uint_5\n               OpSelectionMerge %14780 None\n               OpBranchConditional %8174 %13279 %14780\n      %13279 = OpLabel\n       %7958 = OpVectorShuffle %v4uint %9007 %9007 3 2 1 0\n               OpBranch %14780\n      %14780 = OpLabel\n      %22898 = OpPhi %v4uint %9007 %21313 %7958 %13279\n       %8068 = OpSelect %uint %8174 %uint_2 %19164\n      %20758 = OpIEqual %bool %8068 %uint_4\n               OpSelectionMerge %14781 None\n               OpBranchConditional %20758 %13280 %14781\n      %13280 = OpLabel\n       %7959 = OpVectorShuffle %v4uint %22898 %22898 1 0 3 2\n               OpBranch %14781\n      %14781 = OpLabel\n      %22899 = OpPhi %v4uint %22898 %14780 %7959 %13280\n       %6605 = OpSelect %uint %20758 %uint_2 %8068\n      %13412 = OpIEqual %bool %6605 %uint_1\n      %18370 = OpIEqual %bool %6605 %uint_2\n      %22150 = OpLogicalOr %bool %13412 %18370\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %22899 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %22899 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16377 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22650 = OpPhi %v4uint %22899 %14781 %16377 %10583\n      %19638 = OpIEqual %bool %6605 %uint_3\n      %15139 = OpLogicalOr %bool %18370 %19638\n               OpSelectionMerge %11416 None\n               OpBranchConditional %15139 %11064 %11416\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22650 %749\n      %15335 = OpShiftRightLogical %v4uint %22650 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %11416\n      %11416 = OpLabel\n      %19767 = OpPhi %v4uint %22650 %13411 %10728 %11064\n      %24825 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_dest %int_0 %9754\n               OpStore %24825 %19767\n       %9389 = OpIAdd %uint %15138 %uint_16\n      %19038 = OpShiftRightLogical %uint %9389 %int_4\n      %14814 = OpBitcast %v4uint %11376\n               OpSelectionMerge %16262 None\n               OpBranchConditional %8174 %13281 %16262\n      %13281 = OpLabel\n       %7960 = OpVectorShuffle %v4uint %14814 %14814 3 2 1 0\n               OpBranch %16262\n      %16262 = OpLabel\n      %10927 = OpPhi %v4uint %14814 %11416 %7960 %13281\n               OpSelectionMerge %16263 None\n               OpBranchConditional %20758 %13282 %16263\n      %13282 = OpLabel\n       %7961 = OpVectorShuffle %v4uint %10927 %10927 1 0 3 2\n               OpBranch %16263\n      %16263 = OpLabel\n      %10928 = OpPhi %v4uint %10927 %16262 %7961 %13282\n               OpSelectionMerge %14874 None\n               OpBranchConditional %22150 %10584 %14874\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %10928 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %10928 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16378 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %14874\n      %14874 = OpLabel\n      %10929 = OpPhi %v4uint %10928 %16263 %16378 %10584\n               OpSelectionMerge %11417 None\n               OpBranchConditional %15139 %11065 %11417\n      %11065 = OpLabel\n      %24088 = OpShiftLeftLogical %v4uint %10929 %749\n      %15336 = OpShiftRightLogical %v4uint %10929 %749\n      %10729 = OpBitwiseOr %v4uint %24088 %15336\n               OpBranch %11417\n      %11417 = OpLabel\n      %19768 = OpPhi %v4uint %10929 %14874 %10729 %11065\n       %8053 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_dest %int_0 %19038\n               OpStore %8053 %19768\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t resolve_full_128bpp_scaled_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006295, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000008, 0x00000008, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x000003F9, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x00090006, 0x000003F9, 0x00000000, 0x725F6578,\n    0x6C6F7365, 0x655F6576, 0x6D617264, 0x666E695F, 0x0000006F, 0x000A0006,\n    0x000003F9, 0x00000001, 0x725F6578, 0x6C6F7365, 0x635F6576, 0x64726F6F,\n    0x74616E69, 0x6E695F65, 0x00006F66, 0x00090006, 0x000003F9, 0x00000002,\n    0x725F6578, 0x6C6F7365, 0x645F6576, 0x5F747365, 0x6F666E69, 0x00000000,\n    0x000B0006, 0x000003F9, 0x00000003, 0x725F6578, 0x6C6F7365, 0x645F6576,\n    0x5F747365, 0x726F6F63, 0x616E6964, 0x695F6574, 0x006F666E, 0x00060005,\n    0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578, 0x00090005,\n    0x0000079C, 0x725F6578, 0x6C6F7365, 0x655F6576, 0x6D617264, 0x5F65785F,\n    0x636F6C62, 0x0000006B, 0x00050006, 0x0000079C, 0x00000000, 0x61746164,\n    0x00000000, 0x00070005, 0x00000CC7, 0x725F6578, 0x6C6F7365, 0x655F6576,\n    0x6D617264, 0x00000000, 0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C,\n    0x766E496C, 0x7461636F, 0x496E6F69, 0x00000044, 0x00090005, 0x000007B4,\n    0x725F6578, 0x6C6F7365, 0x645F6576, 0x5F747365, 0x625F6578, 0x6B636F6C,\n    0x00000000, 0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000,\n    0x00060005, 0x00001592, 0x725F6578, 0x6C6F7365, 0x645F6576, 0x00747365,\n    0x00030047, 0x000003F9, 0x00000002, 0x00050048, 0x000003F9, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x000003F9, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x000003F9, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x000003F9, 0x00000003, 0x00000023, 0x0000000C, 0x00040047,\n    0x000007D0, 0x00000006, 0x00000004, 0x00030047, 0x0000079C, 0x00000003,\n    0x00040048, 0x0000079C, 0x00000000, 0x00000018, 0x00050048, 0x0000079C,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x00000CC7, 0x00000018,\n    0x00040047, 0x00000CC7, 0x00000021, 0x00000000, 0x00040047, 0x00000CC7,\n    0x00000022, 0x00000000, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C,\n    0x00040047, 0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4,\n    0x00000003, 0x00040048, 0x000007B4, 0x00000000, 0x00000019, 0x00050048,\n    0x000007B4, 0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x00001592,\n    0x00000019, 0x00040047, 0x00001592, 0x00000021, 0x00000000, 0x00040047,\n    0x00001592, 0x00000022, 0x00000001, 0x00040047, 0x00000AC7, 0x0000000B,\n    0x00000019, 0x00020013, 0x00000008, 0x00030021, 0x00000502, 0x00000008,\n    0x00040015, 0x0000000C, 0x00000020, 0x00000001, 0x00040017, 0x00000012,\n    0x0000000C, 0x00000002, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x00040017, 0x00000017, 0x0000000B, 0x00000004,\n    0x00030016, 0x0000000D, 0x00000020, 0x00040017, 0x00000013, 0x0000000D,\n    0x00000002, 0x00040017, 0x0000001D, 0x0000000D, 0x00000004, 0x00020014,\n    0x00000009, 0x00040017, 0x00000016, 0x0000000C, 0x00000003, 0x0004002B,\n    0x0000000B, 0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B, 0x00000A10,\n    0x00000002, 0x0004002B, 0x0000000B, 0x000008A6, 0x00FF00FF, 0x0004002B,\n    0x0000000B, 0x00000A22, 0x00000008, 0x0004002B, 0x0000000B, 0x000005FD,\n    0xFF00FF00, 0x0004002B, 0x0000000B, 0x00000A13, 0x00000003, 0x0004002B,\n    0x0000000B, 0x00000A3A, 0x00000010, 0x0004002B, 0x0000000B, 0x00000A16,\n    0x00000004, 0x0004002B, 0x0000000B, 0x00000A19, 0x00000005, 0x0004002B,\n    0x0000000B, 0x00000A0A, 0x00000000, 0x0004002B, 0x0000000B, 0x00000A52,\n    0x00000018, 0x0007002C, 0x00000017, 0x0000028D, 0x00000A0A, 0x00000A22,\n    0x00000A3A, 0x00000A52, 0x0004002B, 0x0000000B, 0x00000144, 0x000000FF,\n    0x0004002B, 0x0000000D, 0x0000017A, 0x3B808081, 0x0004002B, 0x0000000B,\n    0x00000A28, 0x0000000A, 0x0004002B, 0x0000000B, 0x00000A46, 0x00000014,\n    0x0004002B, 0x0000000B, 0x00000A64, 0x0000001E, 0x0007002C, 0x00000017,\n    0x0000034D, 0x00000A0A, 0x00000A28, 0x00000A46, 0x00000A64, 0x0004002B,\n    0x0000000B, 0x00000A44, 0x000003FF, 0x0007002C, 0x00000017, 0x0000027B,\n    0x00000A44, 0x00000A44, 0x00000A44, 0x00000A13, 0x0004002B, 0x0000000D,\n    0x000006FE, 0x3A802008, 0x0004002B, 0x0000000D, 0x00000149, 0x3EAAAAAB,\n    0x0007002C, 0x0000001D, 0x00000AEE, 0x000006FE, 0x000006FE, 0x000006FE,\n    0x00000149, 0x0006002C, 0x00000014, 0x00000BB4, 0x00000A0A, 0x00000A28,\n    0x00000A46, 0x0004002B, 0x0000000B, 0x00000B87, 0x0000007F, 0x0004002B,\n    0x0000000B, 0x00000A1F, 0x00000007, 0x00040017, 0x00000010, 0x00000009,\n    0x00000003, 0x0004002B, 0x0000000B, 0x00000B7E, 0x0000007C, 0x0004002B,\n    0x0000000B, 0x00000A4F, 0x00000017, 0x00040017, 0x00000018, 0x0000000D,\n    0x00000003, 0x0004002B, 0x0000000D, 0x00000341, 0xBF800000, 0x0004002B,\n    0x0000000C, 0x00000A3B, 0x00000010, 0x0004002B, 0x0000000C, 0x00000A0B,\n    0x00000000, 0x0005002C, 0x00000012, 0x000007A7, 0x00000A3B, 0x00000A0B,\n    0x0004002B, 0x0000000D, 0x000007FE, 0x3A800100, 0x00040017, 0x0000001A,\n    0x0000000C, 0x00000004, 0x0007002C, 0x0000001A, 0x00000122, 0x00000A3B,\n    0x00000A0B, 0x00000A3B, 0x00000A0B, 0x0005002C, 0x00000011, 0x0000072D,\n    0x00000A10, 0x00000A0D, 0x00040017, 0x0000000F, 0x00000009, 0x00000002,\n    0x0005002C, 0x00000011, 0x0000070F, 0x00000A0A, 0x00000A0A, 0x0005002C,\n    0x00000011, 0x00000724, 0x00000A0D, 0x00000A0D, 0x0005002C, 0x00000011,\n    0x00000718, 0x00000A0D, 0x00000A0A, 0x0004002B, 0x0000000B, 0x00000AFA,\n    0x00000050, 0x0005002C, 0x00000011, 0x00000A9F, 0x00000AFA, 0x00000A3A,\n    0x0004002B, 0x0000000B, 0x00000A84, 0x00000800, 0x0004002B, 0x0000000C,\n    0x00000A11, 0x00000002, 0x0004002B, 0x0000000C, 0x00000A17, 0x00000004,\n    0x0004002B, 0x0000000C, 0x00000A1D, 0x00000006, 0x0004002B, 0x0000000C,\n    0x00000A2C, 0x0000000B, 0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001,\n    0x0004002B, 0x0000000C, 0x00000A1A, 0x00000005, 0x0004002B, 0x0000000C,\n    0x00000A20, 0x00000007, 0x0004002B, 0x0000000C, 0x00000A23, 0x00000008,\n    0x0004002B, 0x0000000C, 0x00000A2F, 0x0000000C, 0x0004002B, 0x0000000C,\n    0x00000A14, 0x00000003, 0x0006001E, 0x000003F9, 0x0000000B, 0x0000000B,\n    0x0000000B, 0x0000000B, 0x00040020, 0x00000676, 0x00000009, 0x000003F9,\n    0x0004003B, 0x00000676, 0x00000CE9, 0x00000009, 0x00040020, 0x00000288,\n    0x00000009, 0x0000000B, 0x0004002B, 0x0000000B, 0x00000A31, 0x0000000D,\n    0x0004002B, 0x0000000B, 0x00000A81, 0x000007FF, 0x0004002B, 0x0000000B,\n    0x00000A37, 0x0000000F, 0x0004002B, 0x0000000B, 0x00000A5E, 0x0000001C,\n    0x0004002B, 0x0000000B, 0x00000A43, 0x00000013, 0x0005002C, 0x00000011,\n    0x00000883, 0x00000A3A, 0x00000A43, 0x0004002B, 0x0000000B, 0x00000510,\n    0x20000000, 0x0005002C, 0x00000011, 0x0000073F, 0x00000A0A, 0x00000A16,\n    0x0004002B, 0x0000000C, 0x00000A29, 0x0000000A, 0x0004002B, 0x0000000C,\n    0x00000A59, 0x0000001A, 0x0004002B, 0x0000000C, 0x00000A50, 0x00000017,\n    0x0004002B, 0x0000000B, 0x00000926, 0x01000000, 0x0005002C, 0x00000011,\n    0x000008E3, 0x00000A46, 0x00000A52, 0x0004002B, 0x0000000D, 0x00000A0C,\n    0x00000000, 0x0003001D, 0x000007D0, 0x0000000B, 0x0003001E, 0x0000079C,\n    0x000007D0, 0x00040020, 0x00000A1B, 0x00000002, 0x0000079C, 0x0004003B,\n    0x00000A1B, 0x00000CC7, 0x00000002, 0x00040020, 0x00000289, 0x00000002,\n    0x0000000B, 0x0004002B, 0x0000000B, 0x00000207, 0x00000140, 0x0004002B,\n    0x0000000D, 0x000000FC, 0x3F000000, 0x0004002B, 0x0000000B, 0x00000A1C,\n    0x00000006, 0x00040020, 0x00000291, 0x00000001, 0x00000014, 0x0004003B,\n    0x00000291, 0x00000F48, 0x00000001, 0x0003001D, 0x000007DC, 0x00000017,\n    0x0003001E, 0x000007B4, 0x000007DC, 0x00040020, 0x00000A32, 0x00000002,\n    0x000007B4, 0x0004003B, 0x00000A32, 0x00001592, 0x00000002, 0x00040020,\n    0x00000294, 0x00000002, 0x00000017, 0x0006002C, 0x00000014, 0x00000AC7,\n    0x00000A22, 0x00000A22, 0x00000A0D, 0x0005002C, 0x00000011, 0x000007A2,\n    0x00000A1F, 0x00000A1F, 0x0005002C, 0x00000011, 0x000007A3, 0x00000A37,\n    0x00000A0D, 0x0005002C, 0x00000011, 0x0000074E, 0x00000A13, 0x00000A13,\n    0x0005002C, 0x00000011, 0x0000084A, 0x00000A37, 0x00000A37, 0x0007002C,\n    0x0000001D, 0x00000504, 0x00000341, 0x00000341, 0x00000341, 0x00000341,\n    0x0007002C, 0x0000001A, 0x00000302, 0x00000A3B, 0x00000A3B, 0x00000A3B,\n    0x00000A3B, 0x0007002C, 0x00000017, 0x0000064B, 0x00000144, 0x00000144,\n    0x00000144, 0x00000144, 0x0006002C, 0x00000014, 0x00000105, 0x00000A44,\n    0x00000A44, 0x00000A44, 0x0006002C, 0x00000014, 0x00000466, 0x00000B87,\n    0x00000B87, 0x00000B87, 0x0006002C, 0x00000014, 0x00000B0C, 0x00000A1F,\n    0x00000A1F, 0x00000A1F, 0x0006002C, 0x00000014, 0x00000A12, 0x00000A0A,\n    0x00000A0A, 0x00000A0A, 0x0006002C, 0x00000014, 0x000003FA, 0x00000B7E,\n    0x00000B7E, 0x00000B7E, 0x0006002C, 0x00000014, 0x00000189, 0x00000A4F,\n    0x00000A4F, 0x00000A4F, 0x0006002C, 0x00000014, 0x0000008D, 0x00000A3A,\n    0x00000A3A, 0x00000A3A, 0x0005002C, 0x00000013, 0x00000049, 0x00000341,\n    0x00000341, 0x0005002C, 0x00000012, 0x00000867, 0x00000A3B, 0x00000A3B,\n    0x0007002C, 0x00000017, 0x000009CE, 0x000008A6, 0x000008A6, 0x000008A6,\n    0x000008A6, 0x0007002C, 0x00000017, 0x0000013D, 0x00000A22, 0x00000A22,\n    0x00000A22, 0x00000A22, 0x0007002C, 0x00000017, 0x0000072E, 0x000005FD,\n    0x000005FD, 0x000005FD, 0x000005FD, 0x0007002C, 0x00000017, 0x000002ED,\n    0x00000A3A, 0x00000A3A, 0x00000A3A, 0x00000A3A, 0x0004002B, 0x0000000C,\n    0x00000089, 0x3F800000, 0x0004002B, 0x0000000B, 0x000009F8, 0xFFFFFFFA,\n    0x0006002C, 0x00000014, 0x00000938, 0x000009F8, 0x000009F8, 0x000009F8,\n    0x0004002B, 0x0000000D, 0x0000016E, 0x3E800000, 0x00050036, 0x00000008,\n    0x0000161F, 0x00000000, 0x00000502, 0x000200F8, 0x00003B06, 0x000300F7,\n    0x00004C7A, 0x00000000, 0x000300FB, 0x00000A0A, 0x00002E68, 0x000200F8,\n    0x00002E68, 0x00050041, 0x00000288, 0x000056E5, 0x00000CE9, 0x00000A0B,\n    0x0004003D, 0x0000000B, 0x00003D0B, 0x000056E5, 0x00050041, 0x00000288,\n    0x000058AC, 0x00000CE9, 0x00000A0E, 0x0004003D, 0x0000000B, 0x00005158,\n    0x000058AC, 0x000500C7, 0x0000000B, 0x00005051, 0x00003D0B, 0x00000A44,\n    0x000500C2, 0x0000000B, 0x00004E0A, 0x00003D0B, 0x00000A28, 0x000500C7,\n    0x0000000B, 0x0000217E, 0x00004E0A, 0x00000A13, 0x000500C2, 0x0000000B,\n    0x0000520A, 0x00003D0B, 0x00000A31, 0x000500C7, 0x0000000B, 0x0000217F,\n    0x0000520A, 0x00000A81, 0x000500C2, 0x0000000B, 0x0000520B, 0x00003D0B,\n    0x00000A52, 0x000500C7, 0x0000000B, 0x00002180, 0x0000520B, 0x00000A37,\n    0x000500C2, 0x0000000B, 0x00004994, 0x00003D0B, 0x00000A5E, 0x000500C7,\n    0x0000000B, 0x000023AA, 0x00004994, 0x00000A0D, 0x00050050, 0x00000011,\n    0x000022A7, 0x00005158, 0x00005158, 0x000500C2, 0x00000011, 0x000025A1,\n    0x000022A7, 0x00000883, 0x000500C7, 0x00000011, 0x00005C31, 0x000025A1,\n    0x000007A2, 0x000500C7, 0x0000000B, 0x00005DDE, 0x00003D0B, 0x00000510,\n    0x000500AB, 0x00000009, 0x00003007, 0x00005DDE, 0x00000A0A, 0x000300F7,\n    0x00003954, 0x00000000, 0x000400FA, 0x00003007, 0x00004163, 0x000055E8,\n    0x000200F8, 0x000055E8, 0x000200F9, 0x00003954, 0x000200F8, 0x00004163,\n    0x000500C2, 0x00000011, 0x00003BAE, 0x00005C31, 0x00000724, 0x000200F9,\n    0x00003954, 0x000200F8, 0x00003954, 0x000700F5, 0x00000011, 0x00004AB4,\n    0x00003BAE, 0x00004163, 0x0000070F, 0x000055E8, 0x000500C2, 0x00000011,\n    0x00001B7E, 0x000022A7, 0x0000073F, 0x000500C7, 0x00000011, 0x00002DF9,\n    0x00001B7E, 0x000007A3, 0x000500C4, 0x00000011, 0x00003F4F, 0x00002DF9,\n    0x0000074E, 0x00050084, 0x00000011, 0x000059EB, 0x00003F4F, 0x00005C31,\n    0x000500C2, 0x0000000B, 0x00003343, 0x00005158, 0x00000A19, 0x000500C7,\n    0x0000000B, 0x000039C1, 0x00003343, 0x00000A81, 0x00050051, 0x0000000B,\n    0x0000229A, 0x00005C31, 0x00000000, 0x00050084, 0x0000000B, 0x000059D1,\n    0x000039C1, 0x0000229A, 0x00050041, 0x00000288, 0x00004E44, 0x00000CE9,\n    0x00000A11, 0x0004003D, 0x0000000B, 0x000048C4, 0x00004E44, 0x00050041,\n    0x00000288, 0x000058AD, 0x00000CE9, 0x00000A14, 0x0004003D, 0x0000000B,\n    0x000051B7, 0x000058AD, 0x000500C7, 0x0000000B, 0x00004ADC, 0x000048C4,\n    0x00000A1F, 0x000500C7, 0x0000000B, 0x000055EF, 0x000048C4, 0x00000A22,\n    0x000500AB, 0x00000009, 0x0000500F, 0x000055EF, 0x00000A0A, 0x000500C2,\n    0x0000000B, 0x00002311, 0x000048C4, 0x00000A16, 0x000500C7, 0x0000000B,\n    0x00004408, 0x00002311, 0x00000A1F, 0x0004007C, 0x0000000C, 0x00005988,\n    0x000048C4, 0x000500C4, 0x0000000C, 0x0000358F, 0x00005988, 0x00000A29,\n    0x000500C3, 0x0000000C, 0x0000509C, 0x0000358F, 0x00000A59, 0x000500C4,\n    0x0000000C, 0x00004702, 0x0000509C, 0x00000A50, 0x00050080, 0x0000000C,\n    0x00001D26, 0x00004702, 0x00000089, 0x0004007C, 0x0000000D, 0x00002B2C,\n    0x00001D26, 0x000500C7, 0x0000000B, 0x00005879, 0x000048C4, 0x00000926,\n    0x000500AB, 0x00000009, 0x00001D33, 0x00005879, 0x00000A0A, 0x000500C7,\n    0x0000000B, 0x000020FC, 0x000051B7, 0x00000A44, 0x000500C2, 0x0000000B,\n    0x00002F90, 0x000051B7, 0x00000A28, 0x000500C7, 0x0000000B, 0x000061CE,\n    0x00002F90, 0x00000A44, 0x000500C4, 0x0000000B, 0x00006273, 0x000061CE,\n    0x00000A0E, 0x00050050, 0x00000011, 0x000028B6, 0x000051B7, 0x000051B7,\n    0x000500C2, 0x00000011, 0x00002891, 0x000028B6, 0x000008E3, 0x000500C7,\n    0x00000011, 0x00005B53, 0x00002891, 0x0000084A, 0x000500C4, 0x00000011,\n    0x00003F50, 0x00005B53, 0x0000074E, 0x00050084, 0x00000011, 0x000059EC,\n    0x00003F50, 0x00005C31, 0x000500C2, 0x0000000B, 0x000031C7, 0x000051B7,\n    0x00000A5E, 0x000500C7, 0x0000000B, 0x00004356, 0x000031C7, 0x00000A1F,\n    0x0004003D, 0x00000014, 0x000031C1, 0x00000F48, 0x0007004F, 0x00000011,\n    0x000038A4, 0x000031C1, 0x000031C1, 0x00000000, 0x00000001, 0x000500C4,\n    0x00000011, 0x00002EF9, 0x000038A4, 0x00000718, 0x00050051, 0x0000000B,\n    0x00001DD8, 0x00002EF9, 0x00000000, 0x000500C4, 0x0000000B, 0x00002D8A,\n    0x000059D1, 0x00000A13, 0x000500AE, 0x00000009, 0x00003C13, 0x00001DD8,\n    0x00002D8A, 0x000300F7, 0x000031D3, 0x00000002, 0x000400FA, 0x00003C13,\n    0x000055E9, 0x000031D3, 0x000200F8, 0x000055E9, 0x000200F9, 0x00004C7A,\n    0x000200F8, 0x000031D3, 0x00050051, 0x0000000B, 0x00001CBF, 0x00004AB4,\n    0x00000000, 0x0007000C, 0x0000000B, 0x00001B0E, 0x00000001, 0x00000029,\n    0x00001DD8, 0x00001CBF, 0x00050051, 0x0000000B, 0x00004588, 0x00002EF9,\n    0x00000001, 0x00050051, 0x0000000B, 0x00001931, 0x00004AB4, 0x00000001,\n    0x0007000C, 0x0000000B, 0x00005F7E, 0x00000001, 0x00000029, 0x00004588,\n    0x00001931, 0x00050050, 0x00000011, 0x000051EF, 0x00001B0E, 0x00005F7E,\n    0x00050080, 0x00000011, 0x0000522C, 0x000051EF, 0x000059EB, 0x000500B2,\n    0x00000009, 0x00003ECB, 0x00004356, 0x00000A13, 0x000300F7, 0x00005CE0,\n    0x00000000, 0x000400FA, 0x00003ECB, 0x00002AEE, 0x00003AEF, 0x000200F8,\n    0x00003AEF, 0x000500AA, 0x00000009, 0x000034FE, 0x00004356, 0x00000A19,\n    0x000600A9, 0x0000000B, 0x000020F6, 0x000034FE, 0x00000A10, 0x00000A0A,\n    0x000200F9, 0x00005CE0, 0x000200F8, 0x00002AEE, 0x000200F9, 0x00005CE0,\n    0x000200F8, 0x00005CE0, 0x000700F5, 0x0000000B, 0x00004B64, 0x00004356,\n    0x00002AEE, 0x000020F6, 0x00003AEF, 0x00050050, 0x00000011, 0x000041BE,\n    0x0000217E, 0x0000217E, 0x000500AE, 0x0000000F, 0x00002E19, 0x000041BE,\n    0x0000072D, 0x000600A9, 0x00000011, 0x00004BB5, 0x00002E19, 0x00000724,\n    0x0000070F, 0x000500C4, 0x00000011, 0x00002AEA, 0x0000522C, 0x00004BB5,\n    0x00050050, 0x00000011, 0x0000605D, 0x00004B64, 0x00004B64, 0x000500C2,\n    0x00000011, 0x00002385, 0x0000605D, 0x00000718, 0x000500C7, 0x00000011,\n    0x00003EC8, 0x00002385, 0x00000724, 0x00050080, 0x00000011, 0x000046BA,\n    0x00002AEA, 0x00003EC8, 0x00050084, 0x00000011, 0x00005998, 0x00000A9F,\n    0x00005C31, 0x00050050, 0x00000011, 0x00002C44, 0x000023AA, 0x00000A0A,\n    0x000500C2, 0x00000011, 0x000019AB, 0x00005998, 0x00002C44, 0x00050086,\n    0x00000011, 0x000027A2, 0x000046BA, 0x000019AB, 0x00050051, 0x0000000B,\n    0x00004FA6, 0x000027A2, 0x00000001, 0x00050084, 0x0000000B, 0x00002B26,\n    0x00004FA6, 0x00005051, 0x00050051, 0x0000000B, 0x00006059, 0x000027A2,\n    0x00000000, 0x00050080, 0x0000000B, 0x00005420, 0x00002B26, 0x00006059,\n    0x00050080, 0x0000000B, 0x00002226, 0x0000217F, 0x00005420, 0x00050084,\n    0x00000011, 0x00005768, 0x000027A2, 0x000019AB, 0x00050082, 0x00000011,\n    0x000050EB, 0x000046BA, 0x00005768, 0x00050051, 0x0000000B, 0x00001C87,\n    0x00005998, 0x00000000, 0x00050051, 0x0000000B, 0x00005962, 0x00005998,\n    0x00000001, 0x00050084, 0x0000000B, 0x00003372, 0x00001C87, 0x00005962,\n    0x00050084, 0x0000000B, 0x000038D7, 0x00002226, 0x00003372, 0x00050051,\n    0x0000000B, 0x00001A95, 0x000050EB, 0x00000001, 0x00050051, 0x0000000B,\n    0x00005BE6, 0x000019AB, 0x00000000, 0x00050084, 0x0000000B, 0x00005966,\n    0x00001A95, 0x00005BE6, 0x00050051, 0x0000000B, 0x00001AE6, 0x000050EB,\n    0x00000000, 0x00050080, 0x0000000B, 0x000025E0, 0x00005966, 0x00001AE6,\n    0x000500C4, 0x0000000B, 0x00004665, 0x000025E0, 0x000023AA, 0x00050080,\n    0x0000000B, 0x000047BB, 0x000038D7, 0x00004665, 0x00050084, 0x0000000B,\n    0x00003662, 0x00003372, 0x00000A84, 0x00050089, 0x0000000B, 0x00005410,\n    0x000047BB, 0x00003662, 0x000500C4, 0x0000000B, 0x00001E06, 0x00005410,\n    0x00000A11, 0x000500AE, 0x00000009, 0x00003652, 0x0000217E, 0x00000A10,\n    0x000600A9, 0x0000000B, 0x00002C0D, 0x00003652, 0x00000A0D, 0x00000A0A,\n    0x00050080, 0x0000000B, 0x00004E6A, 0x000023AA, 0x00002C0D, 0x000500C4,\n    0x0000000B, 0x0000199B, 0x00000A16, 0x00004E6A, 0x000500AB, 0x00000009,\n    0x00005AEF, 0x000023AA, 0x00000A0A, 0x000300F7, 0x0000530F, 0x00000002,\n    0x000400FA, 0x00005AEF, 0x00003B65, 0x000040B9, 0x000200F8, 0x000040B9,\n    0x000500AA, 0x00000009, 0x00004ADA, 0x0000199B, 0x00000A16, 0x000300F7,\n    0x00004F49, 0x00000002, 0x000400FA, 0x00004ADA, 0x000019BF, 0x000022FF,\n    0x000200F8, 0x000022FF, 0x000500C2, 0x0000000B, 0x00005630, 0x00001E06,\n    0x00000A11, 0x00060041, 0x00000289, 0x00003439, 0x00000CC7, 0x00000A0B,\n    0x00005630, 0x0004003D, 0x0000000B, 0x00003AD4, 0x00003439, 0x00050080,\n    0x0000000B, 0x00002145, 0x00001E06, 0x0000199B, 0x000500C2, 0x0000000B,\n    0x000054A6, 0x00002145, 0x00000A11, 0x00060041, 0x00000289, 0x00004901,\n    0x00000CC7, 0x00000A0B, 0x000054A6, 0x0004003D, 0x0000000B, 0x00005F59,\n    0x00004901, 0x00050050, 0x00000011, 0x0000512C, 0x00003AD4, 0x00005F59,\n    0x000200F9, 0x00004F49, 0x000200F8, 0x000019BF, 0x000500C2, 0x0000000B,\n    0x00005FA6, 0x00001E06, 0x00000A11, 0x00060041, 0x00000289, 0x0000343A,\n    0x00000CC7, 0x00000A0B, 0x00005FA6, 0x0004003D, 0x0000000B, 0x00003141,\n    0x0000343A, 0x00050080, 0x0000000B, 0x00002DA7, 0x00005FA6, 0x00000A0D,\n    0x00060041, 0x00000289, 0x00005FEE, 0x00000CC7, 0x00000A0B, 0x00002DA7,\n    0x0004003D, 0x0000000B, 0x00003FFB, 0x00005FEE, 0x00050050, 0x00000011,\n    0x0000512D, 0x00003141, 0x00003FFB, 0x000200F9, 0x00004F49, 0x000200F8,\n    0x00004F49, 0x000700F5, 0x00000011, 0x00002ABF, 0x0000512D, 0x000019BF,\n    0x0000512C, 0x000022FF, 0x000300F7, 0x00003F60, 0x00000000, 0x001300FB,\n    0x00002180, 0x00004BFB, 0x00000000, 0x000038F9, 0x00000001, 0x000038F9,\n    0x00000002, 0x00001CBB, 0x0000000A, 0x00001CBB, 0x00000003, 0x00001CBA,\n    0x0000000C, 0x00001CBA, 0x00000004, 0x00001FFE, 0x00000006, 0x00002033,\n    0x000200F8, 0x00002033, 0x00050051, 0x0000000B, 0x00005F56, 0x00002ABF,\n    0x00000000, 0x0006000C, 0x00000013, 0x00006067, 0x00000001, 0x0000003E,\n    0x00005F56, 0x00050051, 0x0000000D, 0x00002762, 0x00006067, 0x00000000,\n    0x00050051, 0x0000000D, 0x00004446, 0x00006067, 0x00000001, 0x00070050,\n    0x0000001D, 0x0000390C, 0x00002762, 0x00004446, 0x00000A0C, 0x00000A0C,\n    0x00050051, 0x0000000B, 0x0000437A, 0x00002ABF, 0x00000001, 0x0006000C,\n    0x00000013, 0x0000466B, 0x00000001, 0x0000003E, 0x0000437A, 0x00050051,\n    0x0000000D, 0x00002763, 0x0000466B, 0x00000000, 0x00050051, 0x0000000D,\n    0x000050BE, 0x0000466B, 0x00000001, 0x00070050, 0x0000001D, 0x00002349,\n    0x00002763, 0x000050BE, 0x00000A0C, 0x00000A0C, 0x000200F9, 0x00003F60,\n    0x000200F8, 0x00001FFE, 0x00050051, 0x0000000B, 0x0000308B, 0x00002ABF,\n    0x00000000, 0x0004007C, 0x0000000C, 0x0000589D, 0x0000308B, 0x00050050,\n    0x00000012, 0x0000471A, 0x0000589D, 0x0000589D, 0x000500C4, 0x00000012,\n    0x000047AD, 0x0000471A, 0x000007A7, 0x000500C3, 0x00000012, 0x00003417,\n    0x000047AD, 0x00000867, 0x0004006F, 0x00000013, 0x00002A97, 0x00003417,\n    0x0005008E, 0x00000013, 0x00004747, 0x00002A97, 0x000007FE, 0x0007000C,\n    0x00000013, 0x00005E06, 0x00000001, 0x00000028, 0x00000049, 0x00004747,\n    0x00050051, 0x0000000D, 0x00005F0A, 0x00005E06, 0x00000000, 0x00050051,\n    0x0000000D, 0x00003CD4, 0x00005E06, 0x00000001, 0x00070050, 0x0000001D,\n    0x0000411E, 0x00005F0A, 0x00003CD4, 0x00000A0C, 0x00000A0C, 0x00050051,\n    0x0000000B, 0x00004C42, 0x00002ABF, 0x00000001, 0x0004007C, 0x0000000C,\n    0x00003EA1, 0x00004C42, 0x00050050, 0x00000012, 0x0000471B, 0x00003EA1,\n    0x00003EA1, 0x000500C4, 0x00000012, 0x000047AE, 0x0000471B, 0x000007A7,\n    0x000500C3, 0x00000012, 0x00003418, 0x000047AE, 0x00000867, 0x0004006F,\n    0x00000013, 0x00002A98, 0x00003418, 0x0005008E, 0x00000013, 0x00004748,\n    0x00002A98, 0x000007FE, 0x0007000C, 0x00000013, 0x00005E07, 0x00000001,\n    0x00000028, 0x00000049, 0x00004748, 0x00050051, 0x0000000D, 0x00005F0B,\n    0x00005E07, 0x00000000, 0x00050051, 0x0000000D, 0x0000494C, 0x00005E07,\n    0x00000001, 0x00070050, 0x0000001D, 0x0000234A, 0x00005F0B, 0x0000494C,\n    0x00000A0C, 0x00000A0C, 0x000200F9, 0x00003F60, 0x000200F8, 0x00001CBA,\n    0x00050051, 0x0000000B, 0x000056BD, 0x00002ABF, 0x00000000, 0x00060050,\n    0x00000014, 0x00004F0A, 0x000056BD, 0x000056BD, 0x000056BD, 0x000500C2,\n    0x00000014, 0x00002B0D, 0x00004F0A, 0x00000BB4, 0x000500C7, 0x00000014,\n    0x00005DE6, 0x00002B0D, 0x00000105, 0x000500C7, 0x00000014, 0x0000489C,\n    0x00002B0D, 0x00000466, 0x000500C2, 0x00000014, 0x00005B90, 0x00005DE6,\n    0x00000B0C, 0x000500AA, 0x00000010, 0x000040C9, 0x00005B90, 0x00000A12,\n    0x0006000C, 0x00000016, 0x00002C4B, 0x00000001, 0x0000004B, 0x0000489C,\n    0x0004007C, 0x00000014, 0x00002A15, 0x00002C4B, 0x00050082, 0x00000014,\n    0x0000187A, 0x00000B0C, 0x00002A15, 0x00050080, 0x00000014, 0x00002210,\n    0x00002A15, 0x00000938, 0x000600A9, 0x00000014, 0x0000286F, 0x000040C9,\n    0x00002210, 0x00005B90, 0x000500C4, 0x00000014, 0x00005AD4, 0x0000489C,\n    0x0000187A, 0x000500C7, 0x00000014, 0x0000499A, 0x00005AD4, 0x00000466,\n    0x000600A9, 0x00000014, 0x00002A9D, 0x000040C9, 0x0000499A, 0x0000489C,\n    0x00050080, 0x00000014, 0x00005FF9, 0x0000286F, 0x000003FA, 0x000500C4,\n    0x00000014, 0x00004F7F, 0x00005FF9, 0x00000189, 0x000500C4, 0x00000014,\n    0x00003FA6, 0x00002A9D, 0x0000008D, 0x000500C5, 0x00000014, 0x0000577C,\n    0x00004F7F, 0x00003FA6, 0x000500AA, 0x00000010, 0x00003600, 0x00005DE6,\n    0x00000A12, 0x000600A9, 0x00000014, 0x00004242, 0x00003600, 0x00000A12,\n    0x0000577C, 0x0004007C, 0x00000018, 0x000029CF, 0x00004242, 0x000500C2,\n    0x0000000B, 0x00004BA4, 0x000056BD, 0x00000A64, 0x00040070, 0x0000000D,\n    0x0000480E, 0x00004BA4, 0x00050085, 0x0000000D, 0x00003E1F, 0x0000480E,\n    0x00000149, 0x00050051, 0x0000000D, 0x000053C2, 0x000029CF, 0x00000000,\n    0x00050051, 0x0000000D, 0x00002A55, 0x000029CF, 0x00000001, 0x00050051,\n    0x0000000D, 0x00001E99, 0x000029CF, 0x00000002, 0x00070050, 0x0000001D,\n    0x00003DDA, 0x000053C2, 0x00002A55, 0x00001E99, 0x00003E1F, 0x00050051,\n    0x0000000B, 0x000027F5, 0x00002ABF, 0x00000001, 0x00060050, 0x00000014,\n    0x0000350E, 0x000027F5, 0x000027F5, 0x000027F5, 0x000500C2, 0x00000014,\n    0x00002B0E, 0x0000350E, 0x00000BB4, 0x000500C7, 0x00000014, 0x00005DE7,\n    0x00002B0E, 0x00000105, 0x000500C7, 0x00000014, 0x0000489D, 0x00002B0E,\n    0x00000466, 0x000500C2, 0x00000014, 0x00005B91, 0x00005DE7, 0x00000B0C,\n    0x000500AA, 0x00000010, 0x000040CA, 0x00005B91, 0x00000A12, 0x0006000C,\n    0x00000016, 0x00002C4C, 0x00000001, 0x0000004B, 0x0000489D, 0x0004007C,\n    0x00000014, 0x00002A16, 0x00002C4C, 0x00050082, 0x00000014, 0x0000187B,\n    0x00000B0C, 0x00002A16, 0x00050080, 0x00000014, 0x00002211, 0x00002A16,\n    0x00000938, 0x000600A9, 0x00000014, 0x00002870, 0x000040CA, 0x00002211,\n    0x00005B91, 0x000500C4, 0x00000014, 0x00005AD5, 0x0000489D, 0x0000187B,\n    0x000500C7, 0x00000014, 0x0000499B, 0x00005AD5, 0x00000466, 0x000600A9,\n    0x00000014, 0x00002A9E, 0x000040CA, 0x0000499B, 0x0000489D, 0x00050080,\n    0x00000014, 0x00005FFA, 0x00002870, 0x000003FA, 0x000500C4, 0x00000014,\n    0x00004F80, 0x00005FFA, 0x00000189, 0x000500C4, 0x00000014, 0x00003FA7,\n    0x00002A9E, 0x0000008D, 0x000500C5, 0x00000014, 0x0000577D, 0x00004F80,\n    0x00003FA7, 0x000500AA, 0x00000010, 0x00003601, 0x00005DE7, 0x00000A12,\n    0x000600A9, 0x00000014, 0x00004243, 0x00003601, 0x00000A12, 0x0000577D,\n    0x0004007C, 0x00000018, 0x000029D0, 0x00004243, 0x000500C2, 0x0000000B,\n    0x00004BA5, 0x000027F5, 0x00000A64, 0x00040070, 0x0000000D, 0x0000480F,\n    0x00004BA5, 0x00050085, 0x0000000D, 0x00003E20, 0x0000480F, 0x00000149,\n    0x00050051, 0x0000000D, 0x000053C3, 0x000029D0, 0x00000000, 0x00050051,\n    0x0000000D, 0x00002A56, 0x000029D0, 0x00000001, 0x00050051, 0x0000000D,\n    0x00002B11, 0x000029D0, 0x00000002, 0x00070050, 0x0000001D, 0x0000234B,\n    0x000053C3, 0x00002A56, 0x00002B11, 0x00003E20, 0x000200F9, 0x00003F60,\n    0x000200F8, 0x00001CBB, 0x00050051, 0x0000000B, 0x000056BE, 0x00002ABF,\n    0x00000000, 0x00070050, 0x00000017, 0x00004F0B, 0x000056BE, 0x000056BE,\n    0x000056BE, 0x000056BE, 0x000500C2, 0x00000017, 0x00002498, 0x00004F0B,\n    0x0000034D, 0x000500C7, 0x00000017, 0x000049AB, 0x00002498, 0x0000027B,\n    0x00040070, 0x0000001D, 0x00003CB7, 0x000049AB, 0x00050085, 0x0000001D,\n    0x00004130, 0x00003CB7, 0x00000AEE, 0x00050051, 0x0000000B, 0x00005CD2,\n    0x00002ABF, 0x00000001, 0x00070050, 0x00000017, 0x0000514D, 0x00005CD2,\n    0x00005CD2, 0x00005CD2, 0x00005CD2, 0x000500C2, 0x00000017, 0x00002499,\n    0x0000514D, 0x0000034D, 0x000500C7, 0x00000017, 0x000049AC, 0x00002499,\n    0x0000027B, 0x00040070, 0x0000001D, 0x0000492F, 0x000049AC, 0x00050085,\n    0x0000001D, 0x0000269F, 0x0000492F, 0x00000AEE, 0x000200F9, 0x00003F60,\n    0x000200F8, 0x000038F9, 0x00050051, 0x0000000B, 0x000056BF, 0x00002ABF,\n    0x00000000, 0x00070050, 0x00000017, 0x00004F0C, 0x000056BF, 0x000056BF,\n    0x000056BF, 0x000056BF, 0x000500C2, 0x00000017, 0x0000249A, 0x00004F0C,\n    0x0000028D, 0x000500C7, 0x00000017, 0x00004A56, 0x0000249A, 0x0000064B,\n    0x00040070, 0x0000001D, 0x000036A2, 0x00004A56, 0x0005008E, 0x0000001D,\n    0x00004B23, 0x000036A2, 0x0000017A, 0x00050051, 0x0000000B, 0x0000219F,\n    0x00002ABF, 0x00000001, 0x00070050, 0x00000017, 0x0000610B, 0x0000219F,\n    0x0000219F, 0x0000219F, 0x0000219F, 0x000500C2, 0x00000017, 0x0000249B,\n    0x0000610B, 0x0000028D, 0x000500C7, 0x00000017, 0x00004A57, 0x0000249B,\n    0x0000064B, 0x00040070, 0x0000001D, 0x0000431A, 0x00004A57, 0x0005008E,\n    0x0000001D, 0x00003092, 0x0000431A, 0x0000017A, 0x000200F9, 0x00003F60,\n    0x000200F8, 0x00004BFB, 0x00050051, 0x0000000B, 0x0000308C, 0x00002ABF,\n    0x00000000, 0x0004007C, 0x0000000D, 0x00004FEE, 0x0000308C, 0x00050050,\n    0x00000013, 0x00004336, 0x00004FEE, 0x00000A0C, 0x0009004F, 0x0000001D,\n    0x00002D90, 0x00004336, 0x00004336, 0x00000000, 0x00000001, 0x00000001,\n    0x00000001, 0x00050051, 0x0000000B, 0x000056B1, 0x00002ABF, 0x00000001,\n    0x0004007C, 0x0000000D, 0x00003F68, 0x000056B1, 0x00050050, 0x00000013,\n    0x00004FAE, 0x00003F68, 0x00000A0C, 0x0009004F, 0x0000001D, 0x00005A3A,\n    0x00004FAE, 0x00004FAE, 0x00000000, 0x00000001, 0x00000001, 0x00000001,\n    0x000200F9, 0x00003F60, 0x000200F8, 0x00003F60, 0x000F00F5, 0x0000001D,\n    0x00002BF3, 0x00005A3A, 0x00004BFB, 0x00003092, 0x000038F9, 0x0000269F,\n    0x00001CBB, 0x0000234B, 0x00001CBA, 0x0000234A, 0x00001FFE, 0x00002349,\n    0x00002033, 0x000F00F5, 0x0000001D, 0x0000358D, 0x00002D90, 0x00004BFB,\n    0x00004B23, 0x000038F9, 0x00004130, 0x00001CBB, 0x00003DDA, 0x00001CBA,\n    0x0000411E, 0x00001FFE, 0x0000390C, 0x00002033, 0x000200F9, 0x0000530F,\n    0x000200F8, 0x00003B65, 0x000500AA, 0x00000009, 0x00005450, 0x0000199B,\n    0x00000A22, 0x000300F7, 0x00004F4A, 0x00000002, 0x000400FA, 0x00005450,\n    0x000019C0, 0x00002300, 0x000200F8, 0x00002300, 0x000500C2, 0x0000000B,\n    0x00005631, 0x00001E06, 0x00000A11, 0x00060041, 0x00000289, 0x0000343B,\n    0x00000CC7, 0x00000A0B, 0x00005631, 0x0004003D, 0x0000000B, 0x00003142,\n    0x0000343B, 0x00050080, 0x0000000B, 0x00002DA8, 0x00005631, 0x00000A0D,\n    0x00060041, 0x00000289, 0x000018FF, 0x00000CC7, 0x00000A0B, 0x00002DA8,\n    0x0004003D, 0x0000000B, 0x00001B76, 0x000018FF, 0x00050080, 0x0000000B,\n    0x00002146, 0x00001E06, 0x0000199B, 0x000500C2, 0x0000000B, 0x000054A7,\n    0x00002146, 0x00000A11, 0x00060041, 0x00000289, 0x00004C91, 0x00000CC7,\n    0x00000A0B, 0x000054A7, 0x0004003D, 0x0000000B, 0x00003143, 0x00004C91,\n    0x00050080, 0x0000000B, 0x00002DA9, 0x000054A7, 0x00000A0D, 0x00060041,\n    0x00000289, 0x00005FEF, 0x00000CC7, 0x00000A0B, 0x00002DA9, 0x0004003D,\n    0x0000000B, 0x00003FFC, 0x00005FEF, 0x00070050, 0x00000017, 0x0000512E,\n    0x00003142, 0x00001B76, 0x00003143, 0x00003FFC, 0x000200F9, 0x00004F4A,\n    0x000200F8, 0x000019C0, 0x000500C2, 0x0000000B, 0x00005FA7, 0x00001E06,\n    0x00000A11, 0x00060041, 0x00000289, 0x0000343C, 0x00000CC7, 0x00000A0B,\n    0x00005FA7, 0x0004003D, 0x0000000B, 0x00003144, 0x0000343C, 0x00050080,\n    0x0000000B, 0x00002DAA, 0x00005FA7, 0x00000A0D, 0x00060041, 0x00000289,\n    0x00001900, 0x00000CC7, 0x00000A0B, 0x00002DAA, 0x0004003D, 0x0000000B,\n    0x00005C62, 0x00001900, 0x00050080, 0x0000000B, 0x00002DAB, 0x00005FA7,\n    0x00000A10, 0x00060041, 0x00000289, 0x00001901, 0x00000CC7, 0x00000A0B,\n    0x00002DAB, 0x0004003D, 0x0000000B, 0x00005C63, 0x00001901, 0x00050080,\n    0x0000000B, 0x00002DAC, 0x00005FA7, 0x00000A13, 0x00060041, 0x00000289,\n    0x00005FF0, 0x00000CC7, 0x00000A0B, 0x00002DAC, 0x0004003D, 0x0000000B,\n    0x00003FFD, 0x00005FF0, 0x00070050, 0x00000017, 0x0000512F, 0x00003144,\n    0x00005C62, 0x00005C63, 0x00003FFD, 0x000200F9, 0x00004F4A, 0x000200F8,\n    0x00004F4A, 0x000700F5, 0x00000017, 0x00002AC0, 0x0000512F, 0x000019C0,\n    0x0000512E, 0x00002300, 0x000300F7, 0x00004F23, 0x00000000, 0x000700FB,\n    0x00002180, 0x00004F56, 0x00000005, 0x00002158, 0x00000007, 0x00002034,\n    0x000200F8, 0x00002034, 0x00050051, 0x0000000B, 0x00005F57, 0x00002AC0,\n    0x00000000, 0x0006000C, 0x00000013, 0x00006068, 0x00000001, 0x0000003E,\n    0x00005F57, 0x00050051, 0x0000000D, 0x00002775, 0x00006068, 0x00000000,\n    0x00050051, 0x0000000D, 0x00003EB8, 0x00006068, 0x00000001, 0x00050051,\n    0x0000000B, 0x00004281, 0x00002AC0, 0x00000001, 0x0006000C, 0x00000013,\n    0x00003CF5, 0x00000001, 0x0000003E, 0x00004281, 0x00050051, 0x0000000D,\n    0x00002764, 0x00003CF5, 0x00000000, 0x00050051, 0x0000000D, 0x00004447,\n    0x00003CF5, 0x00000001, 0x00070050, 0x0000001D, 0x0000390D, 0x00002775,\n    0x00003EB8, 0x00002764, 0x00004447, 0x00050051, 0x0000000B, 0x0000437B,\n    0x00002AC0, 0x00000002, 0x0006000C, 0x00000013, 0x0000466C, 0x00000001,\n    0x0000003E, 0x0000437B, 0x00050051, 0x0000000D, 0x00002776, 0x0000466C,\n    0x00000000, 0x00050051, 0x0000000D, 0x00003EB9, 0x0000466C, 0x00000001,\n    0x00050051, 0x0000000B, 0x00004282, 0x00002AC0, 0x00000003, 0x0006000C,\n    0x00000013, 0x00003CF6, 0x00000001, 0x0000003E, 0x00004282, 0x00050051,\n    0x0000000D, 0x00002765, 0x00003CF6, 0x00000000, 0x00050051, 0x0000000D,\n    0x000050BF, 0x00003CF6, 0x00000001, 0x00070050, 0x0000001D, 0x0000234C,\n    0x00002776, 0x00003EB9, 0x00002765, 0x000050BF, 0x000200F9, 0x00004F23,\n    0x000200F8, 0x00002158, 0x0007004F, 0x00000011, 0x000025FB, 0x00002AC0,\n    0x00002AC0, 0x00000000, 0x00000001, 0x0004007C, 0x00000012, 0x00005B3C,\n    0x000025FB, 0x0009004F, 0x0000001A, 0x000060CE, 0x00005B3C, 0x00005B3C,\n    0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x000500C4, 0x0000001A,\n    0x000048A6, 0x000060CE, 0x00000122, 0x000500C3, 0x0000001A, 0x00003D8D,\n    0x000048A6, 0x00000302, 0x0004006F, 0x0000001D, 0x00002A99, 0x00003D8D,\n    0x0005008E, 0x0000001D, 0x00004721, 0x00002A99, 0x000007FE, 0x0007000C,\n    0x0000001D, 0x00006291, 0x00000001, 0x00000028, 0x00000504, 0x00004721,\n    0x0007004F, 0x00000011, 0x0000376B, 0x00002AC0, 0x00002AC0, 0x00000002,\n    0x00000003, 0x0004007C, 0x00000012, 0x000024BF, 0x0000376B, 0x0009004F,\n    0x0000001A, 0x000060CF, 0x000024BF, 0x000024BF, 0x00000000, 0x00000000,\n    0x00000001, 0x00000001, 0x000500C4, 0x0000001A, 0x000048A7, 0x000060CF,\n    0x00000122, 0x000500C3, 0x0000001A, 0x00003D8E, 0x000048A7, 0x00000302,\n    0x0004006F, 0x0000001D, 0x00002A9A, 0x00003D8E, 0x0005008E, 0x0000001D,\n    0x000053BF, 0x00002A9A, 0x000007FE, 0x0007000C, 0x0000001D, 0x00004362,\n    0x00000001, 0x00000028, 0x00000504, 0x000053BF, 0x000200F9, 0x00004F23,\n    0x000200F8, 0x00004F56, 0x0007004F, 0x00000011, 0x00002621, 0x00002AC0,\n    0x00002AC0, 0x00000000, 0x00000001, 0x0004007C, 0x00000013, 0x00005159,\n    0x00002621, 0x00050051, 0x0000000D, 0x00001B7B, 0x00005159, 0x00000000,\n    0x00050051, 0x0000000D, 0x0000346A, 0x00005159, 0x00000001, 0x00070050,\n    0x0000001D, 0x00004278, 0x00001B7B, 0x0000346A, 0x00000A0C, 0x00000A0C,\n    0x0007004F, 0x00000011, 0x000041D8, 0x00002AC0, 0x00002AC0, 0x00000002,\n    0x00000003, 0x0004007C, 0x00000013, 0x0000375D, 0x000041D8, 0x00050051,\n    0x0000000D, 0x00001B7C, 0x0000375D, 0x00000000, 0x00050051, 0x0000000D,\n    0x00004108, 0x0000375D, 0x00000001, 0x00070050, 0x0000001D, 0x0000234D,\n    0x00001B7C, 0x00004108, 0x00000A0C, 0x00000A0C, 0x000200F9, 0x00004F23,\n    0x000200F8, 0x00004F23, 0x000900F5, 0x0000001D, 0x00002BF4, 0x0000234D,\n    0x00004F56, 0x00004362, 0x00002158, 0x0000234C, 0x00002034, 0x000900F5,\n    0x0000001D, 0x0000358E, 0x00004278, 0x00004F56, 0x00006291, 0x00002158,\n    0x0000390D, 0x00002034, 0x000200F9, 0x0000530F, 0x000200F8, 0x0000530F,\n    0x000700F5, 0x0000001D, 0x00002662, 0x00002BF4, 0x00004F23, 0x00002BF3,\n    0x00003F60, 0x000700F5, 0x0000001D, 0x000036E3, 0x0000358E, 0x00004F23,\n    0x0000358D, 0x00003F60, 0x000500AE, 0x00000009, 0x00002E55, 0x00004356,\n    0x00000A16, 0x000300F7, 0x00005313, 0x00000002, 0x000400FA, 0x00002E55,\n    0x000051F1, 0x00005313, 0x000200F8, 0x000051F1, 0x00050084, 0x0000000B,\n    0x00002B47, 0x00000207, 0x0000229A, 0x00050085, 0x0000000D, 0x00005A1D,\n    0x00002B2C, 0x000000FC, 0x00050080, 0x0000000B, 0x00001FB2, 0x00001E06,\n    0x00002B47, 0x000300F7, 0x00005310, 0x00000002, 0x000400FA, 0x00005AEF,\n    0x00003B66, 0x000040BA, 0x000200F8, 0x000040BA, 0x000500AA, 0x00000009,\n    0x00004ADB, 0x0000199B, 0x00000A16, 0x000300F7, 0x00004F4B, 0x00000002,\n    0x000400FA, 0x00004ADB, 0x000019C1, 0x00002301, 0x000200F8, 0x00002301,\n    0x000500C2, 0x0000000B, 0x00005632, 0x00001FB2, 0x00000A11, 0x00060041,\n    0x00000289, 0x0000343D, 0x00000CC7, 0x00000A0B, 0x00005632, 0x0004003D,\n    0x0000000B, 0x00003AD5, 0x0000343D, 0x00050080, 0x0000000B, 0x00002147,\n    0x00001FB2, 0x0000199B, 0x000500C2, 0x0000000B, 0x000054A8, 0x00002147,\n    0x00000A11, 0x00060041, 0x00000289, 0x00004902, 0x00000CC7, 0x00000A0B,\n    0x000054A8, 0x0004003D, 0x0000000B, 0x00005F5A, 0x00004902, 0x00050050,\n    0x00000011, 0x00005130, 0x00003AD5, 0x00005F5A, 0x000200F9, 0x00004F4B,\n    0x000200F8, 0x000019C1, 0x000500C2, 0x0000000B, 0x00005FA8, 0x00001FB2,\n    0x00000A11, 0x00060041, 0x00000289, 0x0000343E, 0x00000CC7, 0x00000A0B,\n    0x00005FA8, 0x0004003D, 0x0000000B, 0x00003145, 0x0000343E, 0x00050080,\n    0x0000000B, 0x00002DAD, 0x00005FA8, 0x00000A0D, 0x00060041, 0x00000289,\n    0x00005FF1, 0x00000CC7, 0x00000A0B, 0x00002DAD, 0x0004003D, 0x0000000B,\n    0x00003FFE, 0x00005FF1, 0x00050050, 0x00000011, 0x00005131, 0x00003145,\n    0x00003FFE, 0x000200F9, 0x00004F4B, 0x000200F8, 0x00004F4B, 0x000700F5,\n    0x00000011, 0x00002AC1, 0x00005131, 0x000019C1, 0x00005130, 0x00002301,\n    0x000300F7, 0x00003F61, 0x00000000, 0x001300FB, 0x00002180, 0x00004BFC,\n    0x00000000, 0x000038FA, 0x00000001, 0x000038FA, 0x00000002, 0x00001CBD,\n    0x0000000A, 0x00001CBD, 0x00000003, 0x00001CBC, 0x0000000C, 0x00001CBC,\n    0x00000004, 0x00001FFF, 0x00000006, 0x00002035, 0x000200F8, 0x00002035,\n    0x00050051, 0x0000000B, 0x00005F58, 0x00002AC1, 0x00000000, 0x0006000C,\n    0x00000013, 0x00006069, 0x00000001, 0x0000003E, 0x00005F58, 0x00050051,\n    0x0000000D, 0x00002766, 0x00006069, 0x00000000, 0x00050051, 0x0000000D,\n    0x00004448, 0x00006069, 0x00000001, 0x00070050, 0x0000001D, 0x0000390E,\n    0x00002766, 0x00004448, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B,\n    0x0000437C, 0x00002AC1, 0x00000001, 0x0006000C, 0x00000013, 0x0000466D,\n    0x00000001, 0x0000003E, 0x0000437C, 0x00050051, 0x0000000D, 0x00002767,\n    0x0000466D, 0x00000000, 0x00050051, 0x0000000D, 0x000050C0, 0x0000466D,\n    0x00000001, 0x00070050, 0x0000001D, 0x0000234E, 0x00002767, 0x000050C0,\n    0x00000A0C, 0x00000A0C, 0x000200F9, 0x00003F61, 0x000200F8, 0x00001FFF,\n    0x00050051, 0x0000000B, 0x0000308D, 0x00002AC1, 0x00000000, 0x0004007C,\n    0x0000000C, 0x0000589E, 0x0000308D, 0x00050050, 0x00000012, 0x0000471C,\n    0x0000589E, 0x0000589E, 0x000500C4, 0x00000012, 0x000047AF, 0x0000471C,\n    0x000007A7, 0x000500C3, 0x00000012, 0x00003419, 0x000047AF, 0x00000867,\n    0x0004006F, 0x00000013, 0x00002A9B, 0x00003419, 0x0005008E, 0x00000013,\n    0x00004749, 0x00002A9B, 0x000007FE, 0x0007000C, 0x00000013, 0x00005E08,\n    0x00000001, 0x00000028, 0x00000049, 0x00004749, 0x00050051, 0x0000000D,\n    0x00005F0C, 0x00005E08, 0x00000000, 0x00050051, 0x0000000D, 0x00003CD5,\n    0x00005E08, 0x00000001, 0x00070050, 0x0000001D, 0x0000411F, 0x00005F0C,\n    0x00003CD5, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x00004C43,\n    0x00002AC1, 0x00000001, 0x0004007C, 0x0000000C, 0x00003EA2, 0x00004C43,\n    0x00050050, 0x00000012, 0x0000471D, 0x00003EA2, 0x00003EA2, 0x000500C4,\n    0x00000012, 0x000047B0, 0x0000471D, 0x000007A7, 0x000500C3, 0x00000012,\n    0x0000341A, 0x000047B0, 0x00000867, 0x0004006F, 0x00000013, 0x00002A9C,\n    0x0000341A, 0x0005008E, 0x00000013, 0x0000474A, 0x00002A9C, 0x000007FE,\n    0x0007000C, 0x00000013, 0x00005E09, 0x00000001, 0x00000028, 0x00000049,\n    0x0000474A, 0x00050051, 0x0000000D, 0x00005F0D, 0x00005E09, 0x00000000,\n    0x00050051, 0x0000000D, 0x0000494D, 0x00005E09, 0x00000001, 0x00070050,\n    0x0000001D, 0x0000234F, 0x00005F0D, 0x0000494D, 0x00000A0C, 0x00000A0C,\n    0x000200F9, 0x00003F61, 0x000200F8, 0x00001CBC, 0x00050051, 0x0000000B,\n    0x000056C0, 0x00002AC1, 0x00000000, 0x00060050, 0x00000014, 0x00004F0D,\n    0x000056C0, 0x000056C0, 0x000056C0, 0x000500C2, 0x00000014, 0x00002B0F,\n    0x00004F0D, 0x00000BB4, 0x000500C7, 0x00000014, 0x00005DE8, 0x00002B0F,\n    0x00000105, 0x000500C7, 0x00000014, 0x0000489E, 0x00002B0F, 0x00000466,\n    0x000500C2, 0x00000014, 0x00005B92, 0x00005DE8, 0x00000B0C, 0x000500AA,\n    0x00000010, 0x000040CB, 0x00005B92, 0x00000A12, 0x0006000C, 0x00000016,\n    0x00002C4D, 0x00000001, 0x0000004B, 0x0000489E, 0x0004007C, 0x00000014,\n    0x00002A17, 0x00002C4D, 0x00050082, 0x00000014, 0x0000187C, 0x00000B0C,\n    0x00002A17, 0x00050080, 0x00000014, 0x00002212, 0x00002A17, 0x00000938,\n    0x000600A9, 0x00000014, 0x00002871, 0x000040CB, 0x00002212, 0x00005B92,\n    0x000500C4, 0x00000014, 0x00005AD6, 0x0000489E, 0x0000187C, 0x000500C7,\n    0x00000014, 0x0000499C, 0x00005AD6, 0x00000466, 0x000600A9, 0x00000014,\n    0x00002A9F, 0x000040CB, 0x0000499C, 0x0000489E, 0x00050080, 0x00000014,\n    0x00005FFB, 0x00002871, 0x000003FA, 0x000500C4, 0x00000014, 0x00004F81,\n    0x00005FFB, 0x00000189, 0x000500C4, 0x00000014, 0x00003FA8, 0x00002A9F,\n    0x0000008D, 0x000500C5, 0x00000014, 0x0000577E, 0x00004F81, 0x00003FA8,\n    0x000500AA, 0x00000010, 0x00003602, 0x00005DE8, 0x00000A12, 0x000600A9,\n    0x00000014, 0x00004244, 0x00003602, 0x00000A12, 0x0000577E, 0x0004007C,\n    0x00000018, 0x000029D1, 0x00004244, 0x000500C2, 0x0000000B, 0x00004BA6,\n    0x000056C0, 0x00000A64, 0x00040070, 0x0000000D, 0x00004810, 0x00004BA6,\n    0x00050085, 0x0000000D, 0x00003E21, 0x00004810, 0x00000149, 0x00050051,\n    0x0000000D, 0x000053C4, 0x000029D1, 0x00000000, 0x00050051, 0x0000000D,\n    0x00002A57, 0x000029D1, 0x00000001, 0x00050051, 0x0000000D, 0x00001E9A,\n    0x000029D1, 0x00000002, 0x00070050, 0x0000001D, 0x00003DDB, 0x000053C4,\n    0x00002A57, 0x00001E9A, 0x00003E21, 0x00050051, 0x0000000B, 0x000027F6,\n    0x00002AC1, 0x00000001, 0x00060050, 0x00000014, 0x0000350F, 0x000027F6,\n    0x000027F6, 0x000027F6, 0x000500C2, 0x00000014, 0x00002B10, 0x0000350F,\n    0x00000BB4, 0x000500C7, 0x00000014, 0x00005DE9, 0x00002B10, 0x00000105,\n    0x000500C7, 0x00000014, 0x0000489F, 0x00002B10, 0x00000466, 0x000500C2,\n    0x00000014, 0x00005B93, 0x00005DE9, 0x00000B0C, 0x000500AA, 0x00000010,\n    0x000040CC, 0x00005B93, 0x00000A12, 0x0006000C, 0x00000016, 0x00002C4E,\n    0x00000001, 0x0000004B, 0x0000489F, 0x0004007C, 0x00000014, 0x00002A18,\n    0x00002C4E, 0x00050082, 0x00000014, 0x0000187D, 0x00000B0C, 0x00002A18,\n    0x00050080, 0x00000014, 0x00002213, 0x00002A18, 0x00000938, 0x000600A9,\n    0x00000014, 0x00002872, 0x000040CC, 0x00002213, 0x00005B93, 0x000500C4,\n    0x00000014, 0x00005AD7, 0x0000489F, 0x0000187D, 0x000500C7, 0x00000014,\n    0x0000499D, 0x00005AD7, 0x00000466, 0x000600A9, 0x00000014, 0x00002AA0,\n    0x000040CC, 0x0000499D, 0x0000489F, 0x00050080, 0x00000014, 0x00005FFC,\n    0x00002872, 0x000003FA, 0x000500C4, 0x00000014, 0x00004F82, 0x00005FFC,\n    0x00000189, 0x000500C4, 0x00000014, 0x00003FA9, 0x00002AA0, 0x0000008D,\n    0x000500C5, 0x00000014, 0x0000577F, 0x00004F82, 0x00003FA9, 0x000500AA,\n    0x00000010, 0x00003603, 0x00005DE9, 0x00000A12, 0x000600A9, 0x00000014,\n    0x00004245, 0x00003603, 0x00000A12, 0x0000577F, 0x0004007C, 0x00000018,\n    0x000029D2, 0x00004245, 0x000500C2, 0x0000000B, 0x00004BA7, 0x000027F6,\n    0x00000A64, 0x00040070, 0x0000000D, 0x00004811, 0x00004BA7, 0x00050085,\n    0x0000000D, 0x00003E22, 0x00004811, 0x00000149, 0x00050051, 0x0000000D,\n    0x000053C5, 0x000029D2, 0x00000000, 0x00050051, 0x0000000D, 0x00002A58,\n    0x000029D2, 0x00000001, 0x00050051, 0x0000000D, 0x00002B12, 0x000029D2,\n    0x00000002, 0x00070050, 0x0000001D, 0x00002350, 0x000053C5, 0x00002A58,\n    0x00002B12, 0x00003E22, 0x000200F9, 0x00003F61, 0x000200F8, 0x00001CBD,\n    0x00050051, 0x0000000B, 0x000056C1, 0x00002AC1, 0x00000000, 0x00070050,\n    0x00000017, 0x00004F0E, 0x000056C1, 0x000056C1, 0x000056C1, 0x000056C1,\n    0x000500C2, 0x00000017, 0x0000249C, 0x00004F0E, 0x0000034D, 0x000500C7,\n    0x00000017, 0x000049AD, 0x0000249C, 0x0000027B, 0x00040070, 0x0000001D,\n    0x00003CB8, 0x000049AD, 0x00050085, 0x0000001D, 0x00004131, 0x00003CB8,\n    0x00000AEE, 0x00050051, 0x0000000B, 0x00005CD3, 0x00002AC1, 0x00000001,\n    0x00070050, 0x00000017, 0x0000514E, 0x00005CD3, 0x00005CD3, 0x00005CD3,\n    0x00005CD3, 0x000500C2, 0x00000017, 0x0000249D, 0x0000514E, 0x0000034D,\n    0x000500C7, 0x00000017, 0x000049AE, 0x0000249D, 0x0000027B, 0x00040070,\n    0x0000001D, 0x00004930, 0x000049AE, 0x00050085, 0x0000001D, 0x000026A0,\n    0x00004930, 0x00000AEE, 0x000200F9, 0x00003F61, 0x000200F8, 0x000038FA,\n    0x00050051, 0x0000000B, 0x000056C2, 0x00002AC1, 0x00000000, 0x00070050,\n    0x00000017, 0x00004F0F, 0x000056C2, 0x000056C2, 0x000056C2, 0x000056C2,\n    0x000500C2, 0x00000017, 0x0000249E, 0x00004F0F, 0x0000028D, 0x000500C7,\n    0x00000017, 0x00004A58, 0x0000249E, 0x0000064B, 0x00040070, 0x0000001D,\n    0x000036A3, 0x00004A58, 0x0005008E, 0x0000001D, 0x00004B24, 0x000036A3,\n    0x0000017A, 0x00050051, 0x0000000B, 0x000021A0, 0x00002AC1, 0x00000001,\n    0x00070050, 0x00000017, 0x0000610C, 0x000021A0, 0x000021A0, 0x000021A0,\n    0x000021A0, 0x000500C2, 0x00000017, 0x0000249F, 0x0000610C, 0x0000028D,\n    0x000500C7, 0x00000017, 0x00004A59, 0x0000249F, 0x0000064B, 0x00040070,\n    0x0000001D, 0x0000431B, 0x00004A59, 0x0005008E, 0x0000001D, 0x00003093,\n    0x0000431B, 0x0000017A, 0x000200F9, 0x00003F61, 0x000200F8, 0x00004BFC,\n    0x00050051, 0x0000000B, 0x0000308E, 0x00002AC1, 0x00000000, 0x0004007C,\n    0x0000000D, 0x00004FEF, 0x0000308E, 0x00050050, 0x00000013, 0x00004337,\n    0x00004FEF, 0x00000A0C, 0x0009004F, 0x0000001D, 0x00002D91, 0x00004337,\n    0x00004337, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00050051,\n    0x0000000B, 0x000056B2, 0x00002AC1, 0x00000001, 0x0004007C, 0x0000000D,\n    0x00003F69, 0x000056B2, 0x00050050, 0x00000013, 0x00004FAF, 0x00003F69,\n    0x00000A0C, 0x0009004F, 0x0000001D, 0x00005A3B, 0x00004FAF, 0x00004FAF,\n    0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x000200F9, 0x00003F61,\n    0x000200F8, 0x00003F61, 0x000F00F5, 0x0000001D, 0x00002BF5, 0x00005A3B,\n    0x00004BFC, 0x00003093, 0x000038FA, 0x000026A0, 0x00001CBD, 0x00002350,\n    0x00001CBC, 0x0000234F, 0x00001FFF, 0x0000234E, 0x00002035, 0x000F00F5,\n    0x0000001D, 0x00003590, 0x00002D91, 0x00004BFC, 0x00004B24, 0x000038FA,\n    0x00004131, 0x00001CBD, 0x00003DDB, 0x00001CBC, 0x0000411F, 0x00001FFF,\n    0x0000390E, 0x00002035, 0x000200F9, 0x00005310, 0x000200F8, 0x00003B66,\n    0x000500AA, 0x00000009, 0x00005451, 0x0000199B, 0x00000A22, 0x000300F7,\n    0x00004F4C, 0x00000002, 0x000400FA, 0x00005451, 0x000019C2, 0x00002302,\n    0x000200F8, 0x00002302, 0x000500C2, 0x0000000B, 0x00005633, 0x00001FB2,\n    0x00000A11, 0x00060041, 0x00000289, 0x0000343F, 0x00000CC7, 0x00000A0B,\n    0x00005633, 0x0004003D, 0x0000000B, 0x00003146, 0x0000343F, 0x00050080,\n    0x0000000B, 0x00002DAE, 0x00005633, 0x00000A0D, 0x00060041, 0x00000289,\n    0x00001902, 0x00000CC7, 0x00000A0B, 0x00002DAE, 0x0004003D, 0x0000000B,\n    0x00001B77, 0x00001902, 0x00050080, 0x0000000B, 0x00002148, 0x00001FB2,\n    0x0000199B, 0x000500C2, 0x0000000B, 0x000054A9, 0x00002148, 0x00000A11,\n    0x00060041, 0x00000289, 0x00004C92, 0x00000CC7, 0x00000A0B, 0x000054A9,\n    0x0004003D, 0x0000000B, 0x00003147, 0x00004C92, 0x00050080, 0x0000000B,\n    0x00002DAF, 0x000054A9, 0x00000A0D, 0x00060041, 0x00000289, 0x00005FF2,\n    0x00000CC7, 0x00000A0B, 0x00002DAF, 0x0004003D, 0x0000000B, 0x00003FFF,\n    0x00005FF2, 0x00070050, 0x00000017, 0x00005132, 0x00003146, 0x00001B77,\n    0x00003147, 0x00003FFF, 0x000200F9, 0x00004F4C, 0x000200F8, 0x000019C2,\n    0x000500C2, 0x0000000B, 0x00005FA9, 0x00001FB2, 0x00000A11, 0x00060041,\n    0x00000289, 0x00003440, 0x00000CC7, 0x00000A0B, 0x00005FA9, 0x0004003D,\n    0x0000000B, 0x00003148, 0x00003440, 0x00050080, 0x0000000B, 0x00002DB0,\n    0x00005FA9, 0x00000A0D, 0x00060041, 0x00000289, 0x00001903, 0x00000CC7,\n    0x00000A0B, 0x00002DB0, 0x0004003D, 0x0000000B, 0x00005C64, 0x00001903,\n    0x00050080, 0x0000000B, 0x00002DB1, 0x00005FA9, 0x00000A10, 0x00060041,\n    0x00000289, 0x00001904, 0x00000CC7, 0x00000A0B, 0x00002DB1, 0x0004003D,\n    0x0000000B, 0x00005C65, 0x00001904, 0x00050080, 0x0000000B, 0x00002DB2,\n    0x00005FA9, 0x00000A13, 0x00060041, 0x00000289, 0x00005FF3, 0x00000CC7,\n    0x00000A0B, 0x00002DB2, 0x0004003D, 0x0000000B, 0x00004000, 0x00005FF3,\n    0x00070050, 0x00000017, 0x00005133, 0x00003148, 0x00005C64, 0x00005C65,\n    0x00004000, 0x000200F9, 0x00004F4C, 0x000200F8, 0x00004F4C, 0x000700F5,\n    0x00000017, 0x00002AC2, 0x00005133, 0x000019C2, 0x00005132, 0x00002302,\n    0x000300F7, 0x00004F24, 0x00000000, 0x000700FB, 0x00002180, 0x00004F57,\n    0x00000005, 0x00002159, 0x00000007, 0x00002036, 0x000200F8, 0x00002036,\n    0x00050051, 0x0000000B, 0x00005F5B, 0x00002AC2, 0x00000000, 0x0006000C,\n    0x00000013, 0x0000606A, 0x00000001, 0x0000003E, 0x00005F5B, 0x00050051,\n    0x0000000D, 0x00002777, 0x0000606A, 0x00000000, 0x00050051, 0x0000000D,\n    0x00003EBA, 0x0000606A, 0x00000001, 0x00050051, 0x0000000B, 0x00004283,\n    0x00002AC2, 0x00000001, 0x0006000C, 0x00000013, 0x00003CF7, 0x00000001,\n    0x0000003E, 0x00004283, 0x00050051, 0x0000000D, 0x00002768, 0x00003CF7,\n    0x00000000, 0x00050051, 0x0000000D, 0x00004449, 0x00003CF7, 0x00000001,\n    0x00070050, 0x0000001D, 0x0000390F, 0x00002777, 0x00003EBA, 0x00002768,\n    0x00004449, 0x00050051, 0x0000000B, 0x0000437D, 0x00002AC2, 0x00000002,\n    0x0006000C, 0x00000013, 0x0000466E, 0x00000001, 0x0000003E, 0x0000437D,\n    0x00050051, 0x0000000D, 0x00002778, 0x0000466E, 0x00000000, 0x00050051,\n    0x0000000D, 0x00003EBB, 0x0000466E, 0x00000001, 0x00050051, 0x0000000B,\n    0x00004284, 0x00002AC2, 0x00000003, 0x0006000C, 0x00000013, 0x00003CF8,\n    0x00000001, 0x0000003E, 0x00004284, 0x00050051, 0x0000000D, 0x00002769,\n    0x00003CF8, 0x00000000, 0x00050051, 0x0000000D, 0x000050C1, 0x00003CF8,\n    0x00000001, 0x00070050, 0x0000001D, 0x00002351, 0x00002778, 0x00003EBB,\n    0x00002769, 0x000050C1, 0x000200F9, 0x00004F24, 0x000200F8, 0x00002159,\n    0x0007004F, 0x00000011, 0x000025FC, 0x00002AC2, 0x00002AC2, 0x00000000,\n    0x00000001, 0x0004007C, 0x00000012, 0x00005B3D, 0x000025FC, 0x0009004F,\n    0x0000001A, 0x000060D0, 0x00005B3D, 0x00005B3D, 0x00000000, 0x00000000,\n    0x00000001, 0x00000001, 0x000500C4, 0x0000001A, 0x000048A8, 0x000060D0,\n    0x00000122, 0x000500C3, 0x0000001A, 0x00003D8F, 0x000048A8, 0x00000302,\n    0x0004006F, 0x0000001D, 0x00002AA1, 0x00003D8F, 0x0005008E, 0x0000001D,\n    0x00004722, 0x00002AA1, 0x000007FE, 0x0007000C, 0x0000001D, 0x00006292,\n    0x00000001, 0x00000028, 0x00000504, 0x00004722, 0x0007004F, 0x00000011,\n    0x0000376C, 0x00002AC2, 0x00002AC2, 0x00000002, 0x00000003, 0x0004007C,\n    0x00000012, 0x000024C0, 0x0000376C, 0x0009004F, 0x0000001A, 0x000060D1,\n    0x000024C0, 0x000024C0, 0x00000000, 0x00000000, 0x00000001, 0x00000001,\n    0x000500C4, 0x0000001A, 0x000048A9, 0x000060D1, 0x00000122, 0x000500C3,\n    0x0000001A, 0x00003D90, 0x000048A9, 0x00000302, 0x0004006F, 0x0000001D,\n    0x00002AA2, 0x00003D90, 0x0005008E, 0x0000001D, 0x000053C0, 0x00002AA2,\n    0x000007FE, 0x0007000C, 0x0000001D, 0x00004363, 0x00000001, 0x00000028,\n    0x00000504, 0x000053C0, 0x000200F9, 0x00004F24, 0x000200F8, 0x00004F57,\n    0x0007004F, 0x00000011, 0x00002622, 0x00002AC2, 0x00002AC2, 0x00000000,\n    0x00000001, 0x0004007C, 0x00000013, 0x0000515A, 0x00002622, 0x00050051,\n    0x0000000D, 0x00001B7D, 0x0000515A, 0x00000000, 0x00050051, 0x0000000D,\n    0x0000346B, 0x0000515A, 0x00000001, 0x00070050, 0x0000001D, 0x00004279,\n    0x00001B7D, 0x0000346B, 0x00000A0C, 0x00000A0C, 0x0007004F, 0x00000011,\n    0x000041D9, 0x00002AC2, 0x00002AC2, 0x00000002, 0x00000003, 0x0004007C,\n    0x00000013, 0x0000375E, 0x000041D9, 0x00050051, 0x0000000D, 0x00001B7F,\n    0x0000375E, 0x00000000, 0x00050051, 0x0000000D, 0x00004109, 0x0000375E,\n    0x00000001, 0x00070050, 0x0000001D, 0x00002352, 0x00001B7F, 0x00004109,\n    0x00000A0C, 0x00000A0C, 0x000200F9, 0x00004F24, 0x000200F8, 0x00004F24,\n    0x000900F5, 0x0000001D, 0x00002BF6, 0x00002352, 0x00004F57, 0x00004363,\n    0x00002159, 0x00002351, 0x00002036, 0x000900F5, 0x0000001D, 0x00003591,\n    0x00004279, 0x00004F57, 0x00006292, 0x00002159, 0x0000390F, 0x00002036,\n    0x000200F9, 0x00005310, 0x000200F8, 0x00005310, 0x000700F5, 0x0000001D,\n    0x0000230B, 0x00002BF6, 0x00004F24, 0x00002BF5, 0x00003F61, 0x000700F5,\n    0x0000001D, 0x00004C8A, 0x00003591, 0x00004F24, 0x00003590, 0x00003F61,\n    0x00050081, 0x0000001D, 0x000046B0, 0x000036E3, 0x00004C8A, 0x00050081,\n    0x0000001D, 0x0000455A, 0x00002662, 0x0000230B, 0x000500AE, 0x00000009,\n    0x0000387D, 0x00004356, 0x00000A1C, 0x000300F7, 0x00005EC8, 0x00000002,\n    0x000400FA, 0x0000387D, 0x000026B1, 0x00005EC8, 0x000200F8, 0x000026B1,\n    0x000500C4, 0x0000000B, 0x000037B2, 0x00000A16, 0x000023AA, 0x00050085,\n    0x0000000D, 0x00002F3A, 0x00002B2C, 0x0000016E, 0x00050080, 0x0000000B,\n    0x000051FC, 0x00001E06, 0x000037B2, 0x000300F7, 0x00005311, 0x00000002,\n    0x000400FA, 0x00005AEF, 0x00003B67, 0x000040BB, 0x000200F8, 0x000040BB,\n    0x000500AA, 0x00000009, 0x00004ADD, 0x0000199B, 0x00000A16, 0x000300F7,\n    0x00004F4D, 0x00000002, 0x000400FA, 0x00004ADD, 0x000019C3, 0x00002303,\n    0x000200F8, 0x00002303, 0x000500C2, 0x0000000B, 0x00005634, 0x000051FC,\n    0x00000A11, 0x00060041, 0x00000289, 0x00003441, 0x00000CC7, 0x00000A0B,\n    0x00005634, 0x0004003D, 0x0000000B, 0x00003AD6, 0x00003441, 0x00050080,\n    0x0000000B, 0x00002149, 0x000051FC, 0x0000199B, 0x000500C2, 0x0000000B,\n    0x000054AA, 0x00002149, 0x00000A11, 0x00060041, 0x00000289, 0x00004903,\n    0x00000CC7, 0x00000A0B, 0x000054AA, 0x0004003D, 0x0000000B, 0x00005F5C,\n    0x00004903, 0x00050050, 0x00000011, 0x00005134, 0x00003AD6, 0x00005F5C,\n    0x000200F9, 0x00004F4D, 0x000200F8, 0x000019C3, 0x000500C2, 0x0000000B,\n    0x00005FAA, 0x000051FC, 0x00000A11, 0x00060041, 0x00000289, 0x00003442,\n    0x00000CC7, 0x00000A0B, 0x00005FAA, 0x0004003D, 0x0000000B, 0x00003149,\n    0x00003442, 0x00050080, 0x0000000B, 0x00002DB3, 0x00005FAA, 0x00000A0D,\n    0x00060041, 0x00000289, 0x00005FF4, 0x00000CC7, 0x00000A0B, 0x00002DB3,\n    0x0004003D, 0x0000000B, 0x00004001, 0x00005FF4, 0x00050050, 0x00000011,\n    0x00005135, 0x00003149, 0x00004001, 0x000200F9, 0x00004F4D, 0x000200F8,\n    0x00004F4D, 0x000700F5, 0x00000011, 0x00002AC3, 0x00005135, 0x000019C3,\n    0x00005134, 0x00002303, 0x000300F7, 0x00003F62, 0x00000000, 0x001300FB,\n    0x00002180, 0x00004BFD, 0x00000000, 0x000038FB, 0x00000001, 0x000038FB,\n    0x00000002, 0x00001CC0, 0x0000000A, 0x00001CC0, 0x00000003, 0x00001CBE,\n    0x0000000C, 0x00001CBE, 0x00000004, 0x00002000, 0x00000006, 0x00002037,\n    0x000200F8, 0x00002037, 0x00050051, 0x0000000B, 0x00005F5D, 0x00002AC3,\n    0x00000000, 0x0006000C, 0x00000013, 0x0000606B, 0x00000001, 0x0000003E,\n    0x00005F5D, 0x00050051, 0x0000000D, 0x0000276A, 0x0000606B, 0x00000000,\n    0x00050051, 0x0000000D, 0x0000444A, 0x0000606B, 0x00000001, 0x00070050,\n    0x0000001D, 0x00003910, 0x0000276A, 0x0000444A, 0x00000A0C, 0x00000A0C,\n    0x00050051, 0x0000000B, 0x0000437E, 0x00002AC3, 0x00000001, 0x0006000C,\n    0x00000013, 0x0000466F, 0x00000001, 0x0000003E, 0x0000437E, 0x00050051,\n    0x0000000D, 0x0000276B, 0x0000466F, 0x00000000, 0x00050051, 0x0000000D,\n    0x000050C2, 0x0000466F, 0x00000001, 0x00070050, 0x0000001D, 0x00002353,\n    0x0000276B, 0x000050C2, 0x00000A0C, 0x00000A0C, 0x000200F9, 0x00003F62,\n    0x000200F8, 0x00002000, 0x00050051, 0x0000000B, 0x0000308F, 0x00002AC3,\n    0x00000000, 0x0004007C, 0x0000000C, 0x0000589F, 0x0000308F, 0x00050050,\n    0x00000012, 0x0000471E, 0x0000589F, 0x0000589F, 0x000500C4, 0x00000012,\n    0x000047B1, 0x0000471E, 0x000007A7, 0x000500C3, 0x00000012, 0x0000341B,\n    0x000047B1, 0x00000867, 0x0004006F, 0x00000013, 0x00002AA3, 0x0000341B,\n    0x0005008E, 0x00000013, 0x0000474B, 0x00002AA3, 0x000007FE, 0x0007000C,\n    0x00000013, 0x00005E0A, 0x00000001, 0x00000028, 0x00000049, 0x0000474B,\n    0x00050051, 0x0000000D, 0x00005F0E, 0x00005E0A, 0x00000000, 0x00050051,\n    0x0000000D, 0x00003CD6, 0x00005E0A, 0x00000001, 0x00070050, 0x0000001D,\n    0x00004120, 0x00005F0E, 0x00003CD6, 0x00000A0C, 0x00000A0C, 0x00050051,\n    0x0000000B, 0x00004C44, 0x00002AC3, 0x00000001, 0x0004007C, 0x0000000C,\n    0x00003EA3, 0x00004C44, 0x00050050, 0x00000012, 0x0000471F, 0x00003EA3,\n    0x00003EA3, 0x000500C4, 0x00000012, 0x000047B2, 0x0000471F, 0x000007A7,\n    0x000500C3, 0x00000012, 0x0000341C, 0x000047B2, 0x00000867, 0x0004006F,\n    0x00000013, 0x00002AA4, 0x0000341C, 0x0005008E, 0x00000013, 0x0000474C,\n    0x00002AA4, 0x000007FE, 0x0007000C, 0x00000013, 0x00005E0B, 0x00000001,\n    0x00000028, 0x00000049, 0x0000474C, 0x00050051, 0x0000000D, 0x00005F0F,\n    0x00005E0B, 0x00000000, 0x00050051, 0x0000000D, 0x0000494E, 0x00005E0B,\n    0x00000001, 0x00070050, 0x0000001D, 0x00002354, 0x00005F0F, 0x0000494E,\n    0x00000A0C, 0x00000A0C, 0x000200F9, 0x00003F62, 0x000200F8, 0x00001CBE,\n    0x00050051, 0x0000000B, 0x000056C3, 0x00002AC3, 0x00000000, 0x00060050,\n    0x00000014, 0x00004F10, 0x000056C3, 0x000056C3, 0x000056C3, 0x000500C2,\n    0x00000014, 0x00002B13, 0x00004F10, 0x00000BB4, 0x000500C7, 0x00000014,\n    0x00005DEA, 0x00002B13, 0x00000105, 0x000500C7, 0x00000014, 0x000048A0,\n    0x00002B13, 0x00000466, 0x000500C2, 0x00000014, 0x00005B94, 0x00005DEA,\n    0x00000B0C, 0x000500AA, 0x00000010, 0x000040CD, 0x00005B94, 0x00000A12,\n    0x0006000C, 0x00000016, 0x00002C4F, 0x00000001, 0x0000004B, 0x000048A0,\n    0x0004007C, 0x00000014, 0x00002A19, 0x00002C4F, 0x00050082, 0x00000014,\n    0x0000187E, 0x00000B0C, 0x00002A19, 0x00050080, 0x00000014, 0x00002214,\n    0x00002A19, 0x00000938, 0x000600A9, 0x00000014, 0x00002873, 0x000040CD,\n    0x00002214, 0x00005B94, 0x000500C4, 0x00000014, 0x00005AD8, 0x000048A0,\n    0x0000187E, 0x000500C7, 0x00000014, 0x0000499E, 0x00005AD8, 0x00000466,\n    0x000600A9, 0x00000014, 0x00002AA5, 0x000040CD, 0x0000499E, 0x000048A0,\n    0x00050080, 0x00000014, 0x00005FFD, 0x00002873, 0x000003FA, 0x000500C4,\n    0x00000014, 0x00004F83, 0x00005FFD, 0x00000189, 0x000500C4, 0x00000014,\n    0x00003FAA, 0x00002AA5, 0x0000008D, 0x000500C5, 0x00000014, 0x00005780,\n    0x00004F83, 0x00003FAA, 0x000500AA, 0x00000010, 0x00003604, 0x00005DEA,\n    0x00000A12, 0x000600A9, 0x00000014, 0x00004246, 0x00003604, 0x00000A12,\n    0x00005780, 0x0004007C, 0x00000018, 0x000029D3, 0x00004246, 0x000500C2,\n    0x0000000B, 0x00004BA8, 0x000056C3, 0x00000A64, 0x00040070, 0x0000000D,\n    0x00004812, 0x00004BA8, 0x00050085, 0x0000000D, 0x00003E23, 0x00004812,\n    0x00000149, 0x00050051, 0x0000000D, 0x000053C6, 0x000029D3, 0x00000000,\n    0x00050051, 0x0000000D, 0x00002A59, 0x000029D3, 0x00000001, 0x00050051,\n    0x0000000D, 0x00001E9B, 0x000029D3, 0x00000002, 0x00070050, 0x0000001D,\n    0x00003DDC, 0x000053C6, 0x00002A59, 0x00001E9B, 0x00003E23, 0x00050051,\n    0x0000000B, 0x000027F7, 0x00002AC3, 0x00000001, 0x00060050, 0x00000014,\n    0x00003510, 0x000027F7, 0x000027F7, 0x000027F7, 0x000500C2, 0x00000014,\n    0x00002B14, 0x00003510, 0x00000BB4, 0x000500C7, 0x00000014, 0x00005DEB,\n    0x00002B14, 0x00000105, 0x000500C7, 0x00000014, 0x000048A1, 0x00002B14,\n    0x00000466, 0x000500C2, 0x00000014, 0x00005B95, 0x00005DEB, 0x00000B0C,\n    0x000500AA, 0x00000010, 0x000040CE, 0x00005B95, 0x00000A12, 0x0006000C,\n    0x00000016, 0x00002C50, 0x00000001, 0x0000004B, 0x000048A1, 0x0004007C,\n    0x00000014, 0x00002A1A, 0x00002C50, 0x00050082, 0x00000014, 0x0000187F,\n    0x00000B0C, 0x00002A1A, 0x00050080, 0x00000014, 0x00002215, 0x00002A1A,\n    0x00000938, 0x000600A9, 0x00000014, 0x00002874, 0x000040CE, 0x00002215,\n    0x00005B95, 0x000500C4, 0x00000014, 0x00005AD9, 0x000048A1, 0x0000187F,\n    0x000500C7, 0x00000014, 0x0000499F, 0x00005AD9, 0x00000466, 0x000600A9,\n    0x00000014, 0x00002AA6, 0x000040CE, 0x0000499F, 0x000048A1, 0x00050080,\n    0x00000014, 0x00005FFE, 0x00002874, 0x000003FA, 0x000500C4, 0x00000014,\n    0x00004F84, 0x00005FFE, 0x00000189, 0x000500C4, 0x00000014, 0x00003FAB,\n    0x00002AA6, 0x0000008D, 0x000500C5, 0x00000014, 0x00005781, 0x00004F84,\n    0x00003FAB, 0x000500AA, 0x00000010, 0x00003605, 0x00005DEB, 0x00000A12,\n    0x000600A9, 0x00000014, 0x00004247, 0x00003605, 0x00000A12, 0x00005781,\n    0x0004007C, 0x00000018, 0x000029D4, 0x00004247, 0x000500C2, 0x0000000B,\n    0x00004BA9, 0x000027F7, 0x00000A64, 0x00040070, 0x0000000D, 0x00004813,\n    0x00004BA9, 0x00050085, 0x0000000D, 0x00003E24, 0x00004813, 0x00000149,\n    0x00050051, 0x0000000D, 0x000053C7, 0x000029D4, 0x00000000, 0x00050051,\n    0x0000000D, 0x00002A5A, 0x000029D4, 0x00000001, 0x00050051, 0x0000000D,\n    0x00002B15, 0x000029D4, 0x00000002, 0x00070050, 0x0000001D, 0x00002355,\n    0x000053C7, 0x00002A5A, 0x00002B15, 0x00003E24, 0x000200F9, 0x00003F62,\n    0x000200F8, 0x00001CC0, 0x00050051, 0x0000000B, 0x000056C4, 0x00002AC3,\n    0x00000000, 0x00070050, 0x00000017, 0x00004F11, 0x000056C4, 0x000056C4,\n    0x000056C4, 0x000056C4, 0x000500C2, 0x00000017, 0x000024A0, 0x00004F11,\n    0x0000034D, 0x000500C7, 0x00000017, 0x000049AF, 0x000024A0, 0x0000027B,\n    0x00040070, 0x0000001D, 0x00003CB9, 0x000049AF, 0x00050085, 0x0000001D,\n    0x00004132, 0x00003CB9, 0x00000AEE, 0x00050051, 0x0000000B, 0x00005CD4,\n    0x00002AC3, 0x00000001, 0x00070050, 0x00000017, 0x0000514F, 0x00005CD4,\n    0x00005CD4, 0x00005CD4, 0x00005CD4, 0x000500C2, 0x00000017, 0x000024A1,\n    0x0000514F, 0x0000034D, 0x000500C7, 0x00000017, 0x000049B0, 0x000024A1,\n    0x0000027B, 0x00040070, 0x0000001D, 0x00004931, 0x000049B0, 0x00050085,\n    0x0000001D, 0x000026A1, 0x00004931, 0x00000AEE, 0x000200F9, 0x00003F62,\n    0x000200F8, 0x000038FB, 0x00050051, 0x0000000B, 0x000056C5, 0x00002AC3,\n    0x00000000, 0x00070050, 0x00000017, 0x00004F12, 0x000056C5, 0x000056C5,\n    0x000056C5, 0x000056C5, 0x000500C2, 0x00000017, 0x000024A2, 0x00004F12,\n    0x0000028D, 0x000500C7, 0x00000017, 0x00004A5A, 0x000024A2, 0x0000064B,\n    0x00040070, 0x0000001D, 0x000036A4, 0x00004A5A, 0x0005008E, 0x0000001D,\n    0x00004B25, 0x000036A4, 0x0000017A, 0x00050051, 0x0000000B, 0x000021A1,\n    0x00002AC3, 0x00000001, 0x00070050, 0x00000017, 0x0000610D, 0x000021A1,\n    0x000021A1, 0x000021A1, 0x000021A1, 0x000500C2, 0x00000017, 0x000024A3,\n    0x0000610D, 0x0000028D, 0x000500C7, 0x00000017, 0x00004A5B, 0x000024A3,\n    0x0000064B, 0x00040070, 0x0000001D, 0x0000431C, 0x00004A5B, 0x0005008E,\n    0x0000001D, 0x00003094, 0x0000431C, 0x0000017A, 0x000200F9, 0x00003F62,\n    0x000200F8, 0x00004BFD, 0x00050051, 0x0000000B, 0x00003090, 0x00002AC3,\n    0x00000000, 0x0004007C, 0x0000000D, 0x00004FF0, 0x00003090, 0x00050050,\n    0x00000013, 0x00004338, 0x00004FF0, 0x00000A0C, 0x0009004F, 0x0000001D,\n    0x00002D92, 0x00004338, 0x00004338, 0x00000000, 0x00000001, 0x00000001,\n    0x00000001, 0x00050051, 0x0000000B, 0x000056B3, 0x00002AC3, 0x00000001,\n    0x0004007C, 0x0000000D, 0x00003F6A, 0x000056B3, 0x00050050, 0x00000013,\n    0x00004FB0, 0x00003F6A, 0x00000A0C, 0x0009004F, 0x0000001D, 0x00005A3C,\n    0x00004FB0, 0x00004FB0, 0x00000000, 0x00000001, 0x00000001, 0x00000001,\n    0x000200F9, 0x00003F62, 0x000200F8, 0x00003F62, 0x000F00F5, 0x0000001D,\n    0x00002BF7, 0x00005A3C, 0x00004BFD, 0x00003094, 0x000038FB, 0x000026A1,\n    0x00001CC0, 0x00002355, 0x00001CBE, 0x00002354, 0x00002000, 0x00002353,\n    0x00002037, 0x000F00F5, 0x0000001D, 0x00003592, 0x00002D92, 0x00004BFD,\n    0x00004B25, 0x000038FB, 0x00004132, 0x00001CC0, 0x00003DDC, 0x00001CBE,\n    0x00004120, 0x00002000, 0x00003910, 0x00002037, 0x000200F9, 0x00005311,\n    0x000200F8, 0x00003B67, 0x000500AA, 0x00000009, 0x00005452, 0x0000199B,\n    0x00000A22, 0x000300F7, 0x00004F4E, 0x00000002, 0x000400FA, 0x00005452,\n    0x000019C4, 0x00002304, 0x000200F8, 0x00002304, 0x000500C2, 0x0000000B,\n    0x00005635, 0x000051FC, 0x00000A11, 0x00060041, 0x00000289, 0x00003443,\n    0x00000CC7, 0x00000A0B, 0x00005635, 0x0004003D, 0x0000000B, 0x0000314A,\n    0x00003443, 0x00050080, 0x0000000B, 0x00002DB4, 0x00005635, 0x00000A0D,\n    0x00060041, 0x00000289, 0x00001905, 0x00000CC7, 0x00000A0B, 0x00002DB4,\n    0x0004003D, 0x0000000B, 0x00001B78, 0x00001905, 0x00050080, 0x0000000B,\n    0x0000214A, 0x000051FC, 0x0000199B, 0x000500C2, 0x0000000B, 0x000054AB,\n    0x0000214A, 0x00000A11, 0x00060041, 0x00000289, 0x00004C93, 0x00000CC7,\n    0x00000A0B, 0x000054AB, 0x0004003D, 0x0000000B, 0x0000314B, 0x00004C93,\n    0x00050080, 0x0000000B, 0x00002DB5, 0x000054AB, 0x00000A0D, 0x00060041,\n    0x00000289, 0x00005FF5, 0x00000CC7, 0x00000A0B, 0x00002DB5, 0x0004003D,\n    0x0000000B, 0x00004002, 0x00005FF5, 0x00070050, 0x00000017, 0x00005136,\n    0x0000314A, 0x00001B78, 0x0000314B, 0x00004002, 0x000200F9, 0x00004F4E,\n    0x000200F8, 0x000019C4, 0x000500C2, 0x0000000B, 0x00005FAB, 0x000051FC,\n    0x00000A11, 0x00060041, 0x00000289, 0x00003444, 0x00000CC7, 0x00000A0B,\n    0x00005FAB, 0x0004003D, 0x0000000B, 0x0000314C, 0x00003444, 0x00050080,\n    0x0000000B, 0x00002DB6, 0x00005FAB, 0x00000A0D, 0x00060041, 0x00000289,\n    0x00001906, 0x00000CC7, 0x00000A0B, 0x00002DB6, 0x0004003D, 0x0000000B,\n    0x00005C66, 0x00001906, 0x00050080, 0x0000000B, 0x00002DB7, 0x00005FAB,\n    0x00000A10, 0x00060041, 0x00000289, 0x00001907, 0x00000CC7, 0x00000A0B,\n    0x00002DB7, 0x0004003D, 0x0000000B, 0x00005C67, 0x00001907, 0x00050080,\n    0x0000000B, 0x00002DB8, 0x00005FAB, 0x00000A13, 0x00060041, 0x00000289,\n    0x00005FF6, 0x00000CC7, 0x00000A0B, 0x00002DB8, 0x0004003D, 0x0000000B,\n    0x00004003, 0x00005FF6, 0x00070050, 0x00000017, 0x00005137, 0x0000314C,\n    0x00005C66, 0x00005C67, 0x00004003, 0x000200F9, 0x00004F4E, 0x000200F8,\n    0x00004F4E, 0x000700F5, 0x00000017, 0x00002AC4, 0x00005137, 0x000019C4,\n    0x00005136, 0x00002304, 0x000300F7, 0x00004F25, 0x00000000, 0x000700FB,\n    0x00002180, 0x00004F58, 0x00000005, 0x0000215A, 0x00000007, 0x00002038,\n    0x000200F8, 0x00002038, 0x00050051, 0x0000000B, 0x00005F5E, 0x00002AC4,\n    0x00000000, 0x0006000C, 0x00000013, 0x0000606C, 0x00000001, 0x0000003E,\n    0x00005F5E, 0x00050051, 0x0000000D, 0x00002779, 0x0000606C, 0x00000000,\n    0x00050051, 0x0000000D, 0x00003EBC, 0x0000606C, 0x00000001, 0x00050051,\n    0x0000000B, 0x00004285, 0x00002AC4, 0x00000001, 0x0006000C, 0x00000013,\n    0x00003CF9, 0x00000001, 0x0000003E, 0x00004285, 0x00050051, 0x0000000D,\n    0x0000276C, 0x00003CF9, 0x00000000, 0x00050051, 0x0000000D, 0x0000444B,\n    0x00003CF9, 0x00000001, 0x00070050, 0x0000001D, 0x00003911, 0x00002779,\n    0x00003EBC, 0x0000276C, 0x0000444B, 0x00050051, 0x0000000B, 0x0000437F,\n    0x00002AC4, 0x00000002, 0x0006000C, 0x00000013, 0x00004670, 0x00000001,\n    0x0000003E, 0x0000437F, 0x00050051, 0x0000000D, 0x0000277A, 0x00004670,\n    0x00000000, 0x00050051, 0x0000000D, 0x00003EBD, 0x00004670, 0x00000001,\n    0x00050051, 0x0000000B, 0x00004286, 0x00002AC4, 0x00000003, 0x0006000C,\n    0x00000013, 0x00003CFA, 0x00000001, 0x0000003E, 0x00004286, 0x00050051,\n    0x0000000D, 0x0000276D, 0x00003CFA, 0x00000000, 0x00050051, 0x0000000D,\n    0x000050C3, 0x00003CFA, 0x00000001, 0x00070050, 0x0000001D, 0x00002356,\n    0x0000277A, 0x00003EBD, 0x0000276D, 0x000050C3, 0x000200F9, 0x00004F25,\n    0x000200F8, 0x0000215A, 0x0007004F, 0x00000011, 0x000025FD, 0x00002AC4,\n    0x00002AC4, 0x00000000, 0x00000001, 0x0004007C, 0x00000012, 0x00005B3E,\n    0x000025FD, 0x0009004F, 0x0000001A, 0x000060D2, 0x00005B3E, 0x00005B3E,\n    0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x000500C4, 0x0000001A,\n    0x000048AA, 0x000060D2, 0x00000122, 0x000500C3, 0x0000001A, 0x00003D91,\n    0x000048AA, 0x00000302, 0x0004006F, 0x0000001D, 0x00002AA7, 0x00003D91,\n    0x0005008E, 0x0000001D, 0x00004723, 0x00002AA7, 0x000007FE, 0x0007000C,\n    0x0000001D, 0x00006293, 0x00000001, 0x00000028, 0x00000504, 0x00004723,\n    0x0007004F, 0x00000011, 0x0000376D, 0x00002AC4, 0x00002AC4, 0x00000002,\n    0x00000003, 0x0004007C, 0x00000012, 0x000024C1, 0x0000376D, 0x0009004F,\n    0x0000001A, 0x000060D3, 0x000024C1, 0x000024C1, 0x00000000, 0x00000000,\n    0x00000001, 0x00000001, 0x000500C4, 0x0000001A, 0x000048AB, 0x000060D3,\n    0x00000122, 0x000500C3, 0x0000001A, 0x00003D92, 0x000048AB, 0x00000302,\n    0x0004006F, 0x0000001D, 0x00002AA8, 0x00003D92, 0x0005008E, 0x0000001D,\n    0x000053C1, 0x00002AA8, 0x000007FE, 0x0007000C, 0x0000001D, 0x00004364,\n    0x00000001, 0x00000028, 0x00000504, 0x000053C1, 0x000200F9, 0x00004F25,\n    0x000200F8, 0x00004F58, 0x0007004F, 0x00000011, 0x00002623, 0x00002AC4,\n    0x00002AC4, 0x00000000, 0x00000001, 0x0004007C, 0x00000013, 0x0000515B,\n    0x00002623, 0x00050051, 0x0000000D, 0x00001B80, 0x0000515B, 0x00000000,\n    0x00050051, 0x0000000D, 0x0000346C, 0x0000515B, 0x00000001, 0x00070050,\n    0x0000001D, 0x0000427A, 0x00001B80, 0x0000346C, 0x00000A0C, 0x00000A0C,\n    0x0007004F, 0x00000011, 0x000041DA, 0x00002AC4, 0x00002AC4, 0x00000002,\n    0x00000003, 0x0004007C, 0x00000013, 0x0000375F, 0x000041DA, 0x00050051,\n    0x0000000D, 0x00001B81, 0x0000375F, 0x00000000, 0x00050051, 0x0000000D,\n    0x0000410A, 0x0000375F, 0x00000001, 0x00070050, 0x0000001D, 0x00002357,\n    0x00001B81, 0x0000410A, 0x00000A0C, 0x00000A0C, 0x000200F9, 0x00004F25,\n    0x000200F8, 0x00004F25, 0x000900F5, 0x0000001D, 0x00002BF8, 0x00002357,\n    0x00004F58, 0x00004364, 0x0000215A, 0x00002356, 0x00002038, 0x000900F5,\n    0x0000001D, 0x00003593, 0x0000427A, 0x00004F58, 0x00006293, 0x0000215A,\n    0x00003911, 0x00002038, 0x000200F9, 0x00005311, 0x000200F8, 0x00005311,\n    0x000700F5, 0x0000001D, 0x0000230C, 0x00002BF8, 0x00004F25, 0x00002BF7,\n    0x00003F62, 0x000700F5, 0x0000001D, 0x00004C8B, 0x00003593, 0x00004F25,\n    0x00003592, 0x00003F62, 0x00050081, 0x0000001D, 0x00004346, 0x000046B0,\n    0x00004C8B, 0x00050081, 0x0000001D, 0x000019F1, 0x0000455A, 0x0000230C,\n    0x00050080, 0x0000000B, 0x00003FF8, 0x00001FB2, 0x000037B2, 0x000300F7,\n    0x00005312, 0x00000002, 0x000400FA, 0x00005AEF, 0x00003B68, 0x000040BC,\n    0x000200F8, 0x000040BC, 0x000500AA, 0x00000009, 0x00004ADE, 0x0000199B,\n    0x00000A16, 0x000300F7, 0x00004F4F, 0x00000002, 0x000400FA, 0x00004ADE,\n    0x000019C5, 0x00002305, 0x000200F8, 0x00002305, 0x000500C2, 0x0000000B,\n    0x00005636, 0x00003FF8, 0x00000A11, 0x00060041, 0x00000289, 0x00003445,\n    0x00000CC7, 0x00000A0B, 0x00005636, 0x0004003D, 0x0000000B, 0x00003AD7,\n    0x00003445, 0x00050080, 0x0000000B, 0x0000214B, 0x00003FF8, 0x0000199B,\n    0x000500C2, 0x0000000B, 0x000054AC, 0x0000214B, 0x00000A11, 0x00060041,\n    0x00000289, 0x00004904, 0x00000CC7, 0x00000A0B, 0x000054AC, 0x0004003D,\n    0x0000000B, 0x00005F5F, 0x00004904, 0x00050050, 0x00000011, 0x00005138,\n    0x00003AD7, 0x00005F5F, 0x000200F9, 0x00004F4F, 0x000200F8, 0x000019C5,\n    0x000500C2, 0x0000000B, 0x00005FAC, 0x00003FF8, 0x00000A11, 0x00060041,\n    0x00000289, 0x00003446, 0x00000CC7, 0x00000A0B, 0x00005FAC, 0x0004003D,\n    0x0000000B, 0x0000314D, 0x00003446, 0x00050080, 0x0000000B, 0x00002DB9,\n    0x00005FAC, 0x00000A0D, 0x00060041, 0x00000289, 0x00005FF7, 0x00000CC7,\n    0x00000A0B, 0x00002DB9, 0x0004003D, 0x0000000B, 0x00004004, 0x00005FF7,\n    0x00050050, 0x00000011, 0x00005139, 0x0000314D, 0x00004004, 0x000200F9,\n    0x00004F4F, 0x000200F8, 0x00004F4F, 0x000700F5, 0x00000011, 0x00002AC5,\n    0x00005139, 0x000019C5, 0x00005138, 0x00002305, 0x000300F7, 0x00003F63,\n    0x00000000, 0x001300FB, 0x00002180, 0x00004BFE, 0x00000000, 0x000038FC,\n    0x00000001, 0x000038FC, 0x00000002, 0x00001CC2, 0x0000000A, 0x00001CC2,\n    0x00000003, 0x00001CC1, 0x0000000C, 0x00001CC1, 0x00000004, 0x00002001,\n    0x00000006, 0x00002039, 0x000200F8, 0x00002039, 0x00050051, 0x0000000B,\n    0x00005F60, 0x00002AC5, 0x00000000, 0x0006000C, 0x00000013, 0x0000606D,\n    0x00000001, 0x0000003E, 0x00005F60, 0x00050051, 0x0000000D, 0x0000276E,\n    0x0000606D, 0x00000000, 0x00050051, 0x0000000D, 0x0000444C, 0x0000606D,\n    0x00000001, 0x00070050, 0x0000001D, 0x00003912, 0x0000276E, 0x0000444C,\n    0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x00004380, 0x00002AC5,\n    0x00000001, 0x0006000C, 0x00000013, 0x00004671, 0x00000001, 0x0000003E,\n    0x00004380, 0x00050051, 0x0000000D, 0x0000276F, 0x00004671, 0x00000000,\n    0x00050051, 0x0000000D, 0x000050C4, 0x00004671, 0x00000001, 0x00070050,\n    0x0000001D, 0x00002358, 0x0000276F, 0x000050C4, 0x00000A0C, 0x00000A0C,\n    0x000200F9, 0x00003F63, 0x000200F8, 0x00002001, 0x00050051, 0x0000000B,\n    0x00003091, 0x00002AC5, 0x00000000, 0x0004007C, 0x0000000C, 0x000058A0,\n    0x00003091, 0x00050050, 0x00000012, 0x00004720, 0x000058A0, 0x000058A0,\n    0x000500C4, 0x00000012, 0x000047B3, 0x00004720, 0x000007A7, 0x000500C3,\n    0x00000012, 0x0000341D, 0x000047B3, 0x00000867, 0x0004006F, 0x00000013,\n    0x00002AA9, 0x0000341D, 0x0005008E, 0x00000013, 0x0000474D, 0x00002AA9,\n    0x000007FE, 0x0007000C, 0x00000013, 0x00005E0C, 0x00000001, 0x00000028,\n    0x00000049, 0x0000474D, 0x00050051, 0x0000000D, 0x00005F10, 0x00005E0C,\n    0x00000000, 0x00050051, 0x0000000D, 0x00003CD7, 0x00005E0C, 0x00000001,\n    0x00070050, 0x0000001D, 0x00004121, 0x00005F10, 0x00003CD7, 0x00000A0C,\n    0x00000A0C, 0x00050051, 0x0000000B, 0x00004C45, 0x00002AC5, 0x00000001,\n    0x0004007C, 0x0000000C, 0x00003EA4, 0x00004C45, 0x00050050, 0x00000012,\n    0x00004724, 0x00003EA4, 0x00003EA4, 0x000500C4, 0x00000012, 0x000047B4,\n    0x00004724, 0x000007A7, 0x000500C3, 0x00000012, 0x0000341E, 0x000047B4,\n    0x00000867, 0x0004006F, 0x00000013, 0x00002AAA, 0x0000341E, 0x0005008E,\n    0x00000013, 0x0000474E, 0x00002AAA, 0x000007FE, 0x0007000C, 0x00000013,\n    0x00005E0D, 0x00000001, 0x00000028, 0x00000049, 0x0000474E, 0x00050051,\n    0x0000000D, 0x00005F11, 0x00005E0D, 0x00000000, 0x00050051, 0x0000000D,\n    0x0000494F, 0x00005E0D, 0x00000001, 0x00070050, 0x0000001D, 0x00002359,\n    0x00005F11, 0x0000494F, 0x00000A0C, 0x00000A0C, 0x000200F9, 0x00003F63,\n    0x000200F8, 0x00001CC1, 0x00050051, 0x0000000B, 0x000056C6, 0x00002AC5,\n    0x00000000, 0x00060050, 0x00000014, 0x00004F13, 0x000056C6, 0x000056C6,\n    0x000056C6, 0x000500C2, 0x00000014, 0x00002B16, 0x00004F13, 0x00000BB4,\n    0x000500C7, 0x00000014, 0x00005DEC, 0x00002B16, 0x00000105, 0x000500C7,\n    0x00000014, 0x000048A2, 0x00002B16, 0x00000466, 0x000500C2, 0x00000014,\n    0x00005B96, 0x00005DEC, 0x00000B0C, 0x000500AA, 0x00000010, 0x000040CF,\n    0x00005B96, 0x00000A12, 0x0006000C, 0x00000016, 0x00002C51, 0x00000001,\n    0x0000004B, 0x000048A2, 0x0004007C, 0x00000014, 0x00002A1B, 0x00002C51,\n    0x00050082, 0x00000014, 0x00001880, 0x00000B0C, 0x00002A1B, 0x00050080,\n    0x00000014, 0x00002216, 0x00002A1B, 0x00000938, 0x000600A9, 0x00000014,\n    0x00002875, 0x000040CF, 0x00002216, 0x00005B96, 0x000500C4, 0x00000014,\n    0x00005ADA, 0x000048A2, 0x00001880, 0x000500C7, 0x00000014, 0x000049A0,\n    0x00005ADA, 0x00000466, 0x000600A9, 0x00000014, 0x00002AAB, 0x000040CF,\n    0x000049A0, 0x000048A2, 0x00050080, 0x00000014, 0x00005FFF, 0x00002875,\n    0x000003FA, 0x000500C4, 0x00000014, 0x00004F85, 0x00005FFF, 0x00000189,\n    0x000500C4, 0x00000014, 0x00003FAC, 0x00002AAB, 0x0000008D, 0x000500C5,\n    0x00000014, 0x00005782, 0x00004F85, 0x00003FAC, 0x000500AA, 0x00000010,\n    0x00003606, 0x00005DEC, 0x00000A12, 0x000600A9, 0x00000014, 0x00004248,\n    0x00003606, 0x00000A12, 0x00005782, 0x0004007C, 0x00000018, 0x000029D5,\n    0x00004248, 0x000500C2, 0x0000000B, 0x00004BAA, 0x000056C6, 0x00000A64,\n    0x00040070, 0x0000000D, 0x00004814, 0x00004BAA, 0x00050085, 0x0000000D,\n    0x00003E25, 0x00004814, 0x00000149, 0x00050051, 0x0000000D, 0x000053C8,\n    0x000029D5, 0x00000000, 0x00050051, 0x0000000D, 0x00002A5B, 0x000029D5,\n    0x00000001, 0x00050051, 0x0000000D, 0x00001E9C, 0x000029D5, 0x00000002,\n    0x00070050, 0x0000001D, 0x00003DDD, 0x000053C8, 0x00002A5B, 0x00001E9C,\n    0x00003E25, 0x00050051, 0x0000000B, 0x000027F8, 0x00002AC5, 0x00000001,\n    0x00060050, 0x00000014, 0x00003511, 0x000027F8, 0x000027F8, 0x000027F8,\n    0x000500C2, 0x00000014, 0x00002B17, 0x00003511, 0x00000BB4, 0x000500C7,\n    0x00000014, 0x00005DED, 0x00002B17, 0x00000105, 0x000500C7, 0x00000014,\n    0x000048A3, 0x00002B17, 0x00000466, 0x000500C2, 0x00000014, 0x00005B97,\n    0x00005DED, 0x00000B0C, 0x000500AA, 0x00000010, 0x000040D0, 0x00005B97,\n    0x00000A12, 0x0006000C, 0x00000016, 0x00002C52, 0x00000001, 0x0000004B,\n    0x000048A3, 0x0004007C, 0x00000014, 0x00002A1C, 0x00002C52, 0x00050082,\n    0x00000014, 0x00001881, 0x00000B0C, 0x00002A1C, 0x00050080, 0x00000014,\n    0x00002217, 0x00002A1C, 0x00000938, 0x000600A9, 0x00000014, 0x00002876,\n    0x000040D0, 0x00002217, 0x00005B97, 0x000500C4, 0x00000014, 0x00005ADB,\n    0x000048A3, 0x00001881, 0x000500C7, 0x00000014, 0x000049A1, 0x00005ADB,\n    0x00000466, 0x000600A9, 0x00000014, 0x00002AAC, 0x000040D0, 0x000049A1,\n    0x000048A3, 0x00050080, 0x00000014, 0x00006000, 0x00002876, 0x000003FA,\n    0x000500C4, 0x00000014, 0x00004F86, 0x00006000, 0x00000189, 0x000500C4,\n    0x00000014, 0x00003FAD, 0x00002AAC, 0x0000008D, 0x000500C5, 0x00000014,\n    0x00005783, 0x00004F86, 0x00003FAD, 0x000500AA, 0x00000010, 0x00003607,\n    0x00005DED, 0x00000A12, 0x000600A9, 0x00000014, 0x00004249, 0x00003607,\n    0x00000A12, 0x00005783, 0x0004007C, 0x00000018, 0x000029D6, 0x00004249,\n    0x000500C2, 0x0000000B, 0x00004BAB, 0x000027F8, 0x00000A64, 0x00040070,\n    0x0000000D, 0x00004815, 0x00004BAB, 0x00050085, 0x0000000D, 0x00003E26,\n    0x00004815, 0x00000149, 0x00050051, 0x0000000D, 0x000053C9, 0x000029D6,\n    0x00000000, 0x00050051, 0x0000000D, 0x00002A5C, 0x000029D6, 0x00000001,\n    0x00050051, 0x0000000D, 0x00002B18, 0x000029D6, 0x00000002, 0x00070050,\n    0x0000001D, 0x0000235A, 0x000053C9, 0x00002A5C, 0x00002B18, 0x00003E26,\n    0x000200F9, 0x00003F63, 0x000200F8, 0x00001CC2, 0x00050051, 0x0000000B,\n    0x000056C7, 0x00002AC5, 0x00000000, 0x00070050, 0x00000017, 0x00004F14,\n    0x000056C7, 0x000056C7, 0x000056C7, 0x000056C7, 0x000500C2, 0x00000017,\n    0x000024A4, 0x00004F14, 0x0000034D, 0x000500C7, 0x00000017, 0x000049B1,\n    0x000024A4, 0x0000027B, 0x00040070, 0x0000001D, 0x00003CBA, 0x000049B1,\n    0x00050085, 0x0000001D, 0x00004133, 0x00003CBA, 0x00000AEE, 0x00050051,\n    0x0000000B, 0x00005CD5, 0x00002AC5, 0x00000001, 0x00070050, 0x00000017,\n    0x00005150, 0x00005CD5, 0x00005CD5, 0x00005CD5, 0x00005CD5, 0x000500C2,\n    0x00000017, 0x000024A5, 0x00005150, 0x0000034D, 0x000500C7, 0x00000017,\n    0x000049B2, 0x000024A5, 0x0000027B, 0x00040070, 0x0000001D, 0x00004932,\n    0x000049B2, 0x00050085, 0x0000001D, 0x000026A2, 0x00004932, 0x00000AEE,\n    0x000200F9, 0x00003F63, 0x000200F8, 0x000038FC, 0x00050051, 0x0000000B,\n    0x000056C8, 0x00002AC5, 0x00000000, 0x00070050, 0x00000017, 0x00004F15,\n    0x000056C8, 0x000056C8, 0x000056C8, 0x000056C8, 0x000500C2, 0x00000017,\n    0x000024A6, 0x00004F15, 0x0000028D, 0x000500C7, 0x00000017, 0x00004A5C,\n    0x000024A6, 0x0000064B, 0x00040070, 0x0000001D, 0x000036A5, 0x00004A5C,\n    0x0005008E, 0x0000001D, 0x00004B26, 0x000036A5, 0x0000017A, 0x00050051,\n    0x0000000B, 0x000021A2, 0x00002AC5, 0x00000001, 0x00070050, 0x00000017,\n    0x0000610E, 0x000021A2, 0x000021A2, 0x000021A2, 0x000021A2, 0x000500C2,\n    0x00000017, 0x000024A7, 0x0000610E, 0x0000028D, 0x000500C7, 0x00000017,\n    0x00004A5D, 0x000024A7, 0x0000064B, 0x00040070, 0x0000001D, 0x0000431D,\n    0x00004A5D, 0x0005008E, 0x0000001D, 0x00003095, 0x0000431D, 0x0000017A,\n    0x000200F9, 0x00003F63, 0x000200F8, 0x00004BFE, 0x00050051, 0x0000000B,\n    0x00003096, 0x00002AC5, 0x00000000, 0x0004007C, 0x0000000D, 0x00004FF1,\n    0x00003096, 0x00050050, 0x00000013, 0x00004339, 0x00004FF1, 0x00000A0C,\n    0x0009004F, 0x0000001D, 0x00002D93, 0x00004339, 0x00004339, 0x00000000,\n    0x00000001, 0x00000001, 0x00000001, 0x00050051, 0x0000000B, 0x000056B4,\n    0x00002AC5, 0x00000001, 0x0004007C, 0x0000000D, 0x00003F6B, 0x000056B4,\n    0x00050050, 0x00000013, 0x00004FB1, 0x00003F6B, 0x00000A0C, 0x0009004F,\n    0x0000001D, 0x00005A3D, 0x00004FB1, 0x00004FB1, 0x00000000, 0x00000001,\n    0x00000001, 0x00000001, 0x000200F9, 0x00003F63, 0x000200F8, 0x00003F63,\n    0x000F00F5, 0x0000001D, 0x00002BF9, 0x00005A3D, 0x00004BFE, 0x00003095,\n    0x000038FC, 0x000026A2, 0x00001CC2, 0x0000235A, 0x00001CC1, 0x00002359,\n    0x00002001, 0x00002358, 0x00002039, 0x000F00F5, 0x0000001D, 0x00003594,\n    0x00002D93, 0x00004BFE, 0x00004B26, 0x000038FC, 0x00004133, 0x00001CC2,\n    0x00003DDD, 0x00001CC1, 0x00004121, 0x00002001, 0x00003912, 0x00002039,\n    0x000200F9, 0x00005312, 0x000200F8, 0x00003B68, 0x000500AA, 0x00000009,\n    0x00005453, 0x0000199B, 0x00000A22, 0x000300F7, 0x00004F50, 0x00000002,\n    0x000400FA, 0x00005453, 0x000019C6, 0x00002306, 0x000200F8, 0x00002306,\n    0x000500C2, 0x0000000B, 0x00005637, 0x00003FF8, 0x00000A11, 0x00060041,\n    0x00000289, 0x00003447, 0x00000CC7, 0x00000A0B, 0x00005637, 0x0004003D,\n    0x0000000B, 0x0000314E, 0x00003447, 0x00050080, 0x0000000B, 0x00002DBA,\n    0x00005637, 0x00000A0D, 0x00060041, 0x00000289, 0x00001908, 0x00000CC7,\n    0x00000A0B, 0x00002DBA, 0x0004003D, 0x0000000B, 0x00001B79, 0x00001908,\n    0x00050080, 0x0000000B, 0x0000214C, 0x00003FF8, 0x0000199B, 0x000500C2,\n    0x0000000B, 0x000054AD, 0x0000214C, 0x00000A11, 0x00060041, 0x00000289,\n    0x00004C94, 0x00000CC7, 0x00000A0B, 0x000054AD, 0x0004003D, 0x0000000B,\n    0x0000314F, 0x00004C94, 0x00050080, 0x0000000B, 0x00002DBB, 0x000054AD,\n    0x00000A0D, 0x00060041, 0x00000289, 0x00005FF8, 0x00000CC7, 0x00000A0B,\n    0x00002DBB, 0x0004003D, 0x0000000B, 0x00004005, 0x00005FF8, 0x00070050,\n    0x00000017, 0x0000513A, 0x0000314E, 0x00001B79, 0x0000314F, 0x00004005,\n    0x000200F9, 0x00004F50, 0x000200F8, 0x000019C6, 0x000500C2, 0x0000000B,\n    0x00005FAD, 0x00003FF8, 0x00000A11, 0x00060041, 0x00000289, 0x00003448,\n    0x00000CC7, 0x00000A0B, 0x00005FAD, 0x0004003D, 0x0000000B, 0x00003150,\n    0x00003448, 0x00050080, 0x0000000B, 0x00002DBC, 0x00005FAD, 0x00000A0D,\n    0x00060041, 0x00000289, 0x00001909, 0x00000CC7, 0x00000A0B, 0x00002DBC,\n    0x0004003D, 0x0000000B, 0x00005C68, 0x00001909, 0x00050080, 0x0000000B,\n    0x00002DBD, 0x00005FAD, 0x00000A10, 0x00060041, 0x00000289, 0x0000190A,\n    0x00000CC7, 0x00000A0B, 0x00002DBD, 0x0004003D, 0x0000000B, 0x00005C69,\n    0x0000190A, 0x00050080, 0x0000000B, 0x00002DBE, 0x00005FAD, 0x00000A13,\n    0x00060041, 0x00000289, 0x00006001, 0x00000CC7, 0x00000A0B, 0x00002DBE,\n    0x0004003D, 0x0000000B, 0x00004006, 0x00006001, 0x00070050, 0x00000017,\n    0x0000513B, 0x00003150, 0x00005C68, 0x00005C69, 0x00004006, 0x000200F9,\n    0x00004F50, 0x000200F8, 0x00004F50, 0x000700F5, 0x00000017, 0x00002AC6,\n    0x0000513B, 0x000019C6, 0x0000513A, 0x00002306, 0x000300F7, 0x00004F26,\n    0x00000000, 0x000700FB, 0x00002180, 0x00004F59, 0x00000005, 0x0000215B,\n    0x00000007, 0x0000203A, 0x000200F8, 0x0000203A, 0x00050051, 0x0000000B,\n    0x00005F61, 0x00002AC6, 0x00000000, 0x0006000C, 0x00000013, 0x0000606E,\n    0x00000001, 0x0000003E, 0x00005F61, 0x00050051, 0x0000000D, 0x0000277B,\n    0x0000606E, 0x00000000, 0x00050051, 0x0000000D, 0x00003EBE, 0x0000606E,\n    0x00000001, 0x00050051, 0x0000000B, 0x00004287, 0x00002AC6, 0x00000001,\n    0x0006000C, 0x00000013, 0x00003CFB, 0x00000001, 0x0000003E, 0x00004287,\n    0x00050051, 0x0000000D, 0x00002770, 0x00003CFB, 0x00000000, 0x00050051,\n    0x0000000D, 0x0000444D, 0x00003CFB, 0x00000001, 0x00070050, 0x0000001D,\n    0x00003913, 0x0000277B, 0x00003EBE, 0x00002770, 0x0000444D, 0x00050051,\n    0x0000000B, 0x00004381, 0x00002AC6, 0x00000002, 0x0006000C, 0x00000013,\n    0x00004672, 0x00000001, 0x0000003E, 0x00004381, 0x00050051, 0x0000000D,\n    0x0000277C, 0x00004672, 0x00000000, 0x00050051, 0x0000000D, 0x00003EBF,\n    0x00004672, 0x00000001, 0x00050051, 0x0000000B, 0x00004288, 0x00002AC6,\n    0x00000003, 0x0006000C, 0x00000013, 0x00003CFC, 0x00000001, 0x0000003E,\n    0x00004288, 0x00050051, 0x0000000D, 0x00002771, 0x00003CFC, 0x00000000,\n    0x00050051, 0x0000000D, 0x000050C5, 0x00003CFC, 0x00000001, 0x00070050,\n    0x0000001D, 0x0000235B, 0x0000277C, 0x00003EBF, 0x00002771, 0x000050C5,\n    0x000200F9, 0x00004F26, 0x000200F8, 0x0000215B, 0x0007004F, 0x00000011,\n    0x000025FE, 0x00002AC6, 0x00002AC6, 0x00000000, 0x00000001, 0x0004007C,\n    0x00000012, 0x00005B3F, 0x000025FE, 0x0009004F, 0x0000001A, 0x000060D4,\n    0x00005B3F, 0x00005B3F, 0x00000000, 0x00000000, 0x00000001, 0x00000001,\n    0x000500C4, 0x0000001A, 0x000048AC, 0x000060D4, 0x00000122, 0x000500C3,\n    0x0000001A, 0x00003D93, 0x000048AC, 0x00000302, 0x0004006F, 0x0000001D,\n    0x00002AAD, 0x00003D93, 0x0005008E, 0x0000001D, 0x00004725, 0x00002AAD,\n    0x000007FE, 0x0007000C, 0x0000001D, 0x00006294, 0x00000001, 0x00000028,\n    0x00000504, 0x00004725, 0x0007004F, 0x00000011, 0x0000376E, 0x00002AC6,\n    0x00002AC6, 0x00000002, 0x00000003, 0x0004007C, 0x00000012, 0x000024C2,\n    0x0000376E, 0x0009004F, 0x0000001A, 0x000060D5, 0x000024C2, 0x000024C2,\n    0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x000500C4, 0x0000001A,\n    0x000048AD, 0x000060D5, 0x00000122, 0x000500C3, 0x0000001A, 0x00003D94,\n    0x000048AD, 0x00000302, 0x0004006F, 0x0000001D, 0x00002AAE, 0x00003D94,\n    0x0005008E, 0x0000001D, 0x000053CA, 0x00002AAE, 0x000007FE, 0x0007000C,\n    0x0000001D, 0x00004365, 0x00000001, 0x00000028, 0x00000504, 0x000053CA,\n    0x000200F9, 0x00004F26, 0x000200F8, 0x00004F59, 0x0007004F, 0x00000011,\n    0x00002624, 0x00002AC6, 0x00002AC6, 0x00000000, 0x00000001, 0x0004007C,\n    0x00000013, 0x0000515C, 0x00002624, 0x00050051, 0x0000000D, 0x00001B82,\n    0x0000515C, 0x00000000, 0x00050051, 0x0000000D, 0x0000346D, 0x0000515C,\n    0x00000001, 0x00070050, 0x0000001D, 0x0000427B, 0x00001B82, 0x0000346D,\n    0x00000A0C, 0x00000A0C, 0x0007004F, 0x00000011, 0x000041DB, 0x00002AC6,\n    0x00002AC6, 0x00000002, 0x00000003, 0x0004007C, 0x00000013, 0x00003760,\n    0x000041DB, 0x00050051, 0x0000000D, 0x00001B83, 0x00003760, 0x00000000,\n    0x00050051, 0x0000000D, 0x0000410B, 0x00003760, 0x00000001, 0x00070050,\n    0x0000001D, 0x0000235C, 0x00001B83, 0x0000410B, 0x00000A0C, 0x00000A0C,\n    0x000200F9, 0x00004F26, 0x000200F8, 0x00004F26, 0x000900F5, 0x0000001D,\n    0x00002BFA, 0x0000235C, 0x00004F59, 0x00004365, 0x0000215B, 0x0000235B,\n    0x0000203A, 0x000900F5, 0x0000001D, 0x00003595, 0x0000427B, 0x00004F59,\n    0x00006294, 0x0000215B, 0x00003913, 0x0000203A, 0x000200F9, 0x00005312,\n    0x000200F8, 0x00005312, 0x000700F5, 0x0000001D, 0x0000230D, 0x00002BFA,\n    0x00004F26, 0x00002BF9, 0x00003F63, 0x000700F5, 0x0000001D, 0x00004C8C,\n    0x00003595, 0x00004F26, 0x00003594, 0x00003F63, 0x00050081, 0x0000001D,\n    0x00004C41, 0x00004346, 0x00004C8C, 0x00050081, 0x0000001D, 0x00005D3D,\n    0x000019F1, 0x0000230D, 0x000200F9, 0x00005EC8, 0x000200F8, 0x00005EC8,\n    0x000700F5, 0x0000001D, 0x00002BA7, 0x0000455A, 0x00005310, 0x00005D3D,\n    0x00005312, 0x000700F5, 0x0000001D, 0x00003854, 0x000046B0, 0x00005310,\n    0x00004C41, 0x00005312, 0x000700F5, 0x0000000D, 0x000038B6, 0x00005A1D,\n    0x00005310, 0x00002F3A, 0x00005312, 0x000200F9, 0x00005313, 0x000200F8,\n    0x00005313, 0x000700F5, 0x0000001D, 0x00002BA8, 0x00002662, 0x0000530F,\n    0x00002BA7, 0x00005EC8, 0x000700F5, 0x0000001D, 0x00003063, 0x000036E3,\n    0x0000530F, 0x00003854, 0x00005EC8, 0x000700F5, 0x0000000D, 0x00002EA8,\n    0x00002B2C, 0x0000530F, 0x000038B6, 0x00005EC8, 0x0005008E, 0x0000001D,\n    0x0000623F, 0x00003063, 0x00002EA8, 0x0005008E, 0x0000001D, 0x0000255A,\n    0x00002BA8, 0x00002EA8, 0x000300F7, 0x00003F64, 0x00000002, 0x000400FA,\n    0x00001D33, 0x00002741, 0x00003F64, 0x000200F8, 0x00002741, 0x0009004F,\n    0x0000001D, 0x0000478C, 0x0000623F, 0x0000623F, 0x00000002, 0x00000001,\n    0x00000000, 0x00000003, 0x0009004F, 0x0000001D, 0x00004F75, 0x0000255A,\n    0x0000255A, 0x00000002, 0x00000001, 0x00000000, 0x00000003, 0x000200F9,\n    0x00003F64, 0x000200F8, 0x00003F64, 0x000700F5, 0x0000001D, 0x00002688,\n    0x0000255A, 0x00005313, 0x00004F75, 0x00002741, 0x000700F5, 0x0000001D,\n    0x00003589, 0x0000623F, 0x00005313, 0x0000478C, 0x00002741, 0x000500B0,\n    0x00000009, 0x000038D2, 0x00001DD8, 0x00001CBF, 0x000300F7, 0x00006070,\n    0x00000002, 0x000400FA, 0x000038D2, 0x000055EA, 0x00006070, 0x000200F8,\n    0x000055EA, 0x000200F9, 0x00006070, 0x000200F8, 0x00006070, 0x000700F5,\n    0x0000001D, 0x00002C70, 0x00002688, 0x00003F64, 0x00003589, 0x000055EA,\n    0x00050080, 0x00000011, 0x00004DDC, 0x00002EF9, 0x000059EC, 0x000500C2,\n    0x00000011, 0x00005E75, 0x00004DDC, 0x00000724, 0x00050086, 0x00000011,\n    0x00001E20, 0x00005E75, 0x00005C31, 0x00050084, 0x00000011, 0x00004707,\n    0x00005C31, 0x00001E20, 0x00050082, 0x00000011, 0x00004761, 0x00005E75,\n    0x00004707, 0x000500C4, 0x00000011, 0x00002BE0, 0x00001E20, 0x00000724,\n    0x00050051, 0x0000000B, 0x000033E4, 0x00004761, 0x00000000, 0x00050051,\n    0x0000000B, 0x00002A78, 0x00005C31, 0x00000001, 0x00050084, 0x0000000B,\n    0x00005967, 0x000033E4, 0x00002A78, 0x00050051, 0x0000000B, 0x00001B1F,\n    0x00004761, 0x00000001, 0x00050080, 0x0000000B, 0x000028E5, 0x00005967,\n    0x00001B1F, 0x000500C7, 0x00000011, 0x000049A3, 0x00004DDC, 0x00000724,\n    0x000500C4, 0x0000000B, 0x00002955, 0x000028E5, 0x00000A1C, 0x00050051,\n    0x0000000B, 0x000051B4, 0x000049A3, 0x00000001, 0x000500C4, 0x0000000B,\n    0x00005C2C, 0x000051B4, 0x00000A19, 0x000500C5, 0x0000000B, 0x00004D66,\n    0x00002955, 0x00005C2C, 0x00050051, 0x0000000B, 0x000053E4, 0x000049A3,\n    0x00000000, 0x000500C4, 0x0000000B, 0x00002DC2, 0x000053E4, 0x00000A16,\n    0x000500C5, 0x0000000B, 0x00002BB9, 0x00004D66, 0x00002DC2, 0x000300F7,\n    0x00005341, 0x00000002, 0x000400FA, 0x0000500F, 0x0000294E, 0x0000537D,\n    0x000200F8, 0x0000537D, 0x0004007C, 0x00000012, 0x00002970, 0x00002BE0,\n    0x00050051, 0x0000000C, 0x000045F3, 0x00002970, 0x00000001, 0x000500C3,\n    0x0000000C, 0x00004DC0, 0x000045F3, 0x00000A1A, 0x0004007C, 0x0000000C,\n    0x00005784, 0x000020FC, 0x00050084, 0x0000000C, 0x00001F02, 0x00004DC0,\n    0x00005784, 0x00050051, 0x0000000C, 0x00006242, 0x00002970, 0x00000000,\n    0x000500C3, 0x0000000C, 0x00004FC7, 0x00006242, 0x00000A1A, 0x00050080,\n    0x0000000C, 0x000049B3, 0x00001F02, 0x00004FC7, 0x000500C4, 0x0000000C,\n    0x0000254A, 0x000049B3, 0x00000A1D, 0x000500C3, 0x0000000C, 0x0000603B,\n    0x000045F3, 0x00000A0E, 0x000500C7, 0x0000000C, 0x0000539A, 0x0000603B,\n    0x00000A20, 0x000500C4, 0x0000000C, 0x0000534A, 0x0000539A, 0x00000A14,\n    0x000500C7, 0x0000000C, 0x00004EA5, 0x00006242, 0x00000A20, 0x000500C5,\n    0x0000000C, 0x00002B1A, 0x0000534A, 0x00004EA5, 0x000500C5, 0x0000000C,\n    0x000043B6, 0x0000254A, 0x00002B1A, 0x000500C4, 0x0000000C, 0x00005E63,\n    0x000043B6, 0x00000A16, 0x000500C3, 0x0000000C, 0x000031DE, 0x000045F3,\n    0x00000A17, 0x000500C7, 0x0000000C, 0x00005447, 0x000031DE, 0x00000A0E,\n    0x000500C3, 0x0000000C, 0x000028A6, 0x00006242, 0x00000A14, 0x000500C7,\n    0x0000000C, 0x0000511E, 0x000028A6, 0x00000A14, 0x000500C3, 0x0000000C,\n    0x000028B9, 0x000045F3, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000505E,\n    0x000028B9, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000541D, 0x0000505E,\n    0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BA, 0x0000511E, 0x0000541D,\n    0x000500C7, 0x0000000C, 0x00005076, 0x000045F3, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x00005228, 0x00005076, 0x00000A17, 0x000500C4, 0x0000000C,\n    0x00001997, 0x000022BA, 0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FE,\n    0x00005228, 0x00001997, 0x000500C4, 0x0000000C, 0x00001BB4, 0x00005447,\n    0x00000A2C, 0x000500C5, 0x0000000C, 0x00003F5B, 0x000047FE, 0x00001BB4,\n    0x000500C3, 0x0000000C, 0x00003A6E, 0x00005E63, 0x00000A17, 0x000500C7,\n    0x0000000C, 0x000018B8, 0x00003A6E, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x0000547E, 0x000018B8, 0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A8,\n    0x00003F5B, 0x0000547E, 0x000500C3, 0x0000000C, 0x00003A6F, 0x00005E63,\n    0x00000A1A, 0x000500C7, 0x0000000C, 0x000018B9, 0x00003A6F, 0x00000A20,\n    0x000500C4, 0x0000000C, 0x0000547F, 0x000018B9, 0x00000A23, 0x000500C5,\n    0x0000000C, 0x0000456F, 0x000045A8, 0x0000547F, 0x000500C3, 0x0000000C,\n    0x00003C88, 0x00005E63, 0x00000A23, 0x000500C4, 0x0000000C, 0x00002824,\n    0x00003C88, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B79, 0x0000456F,\n    0x00002824, 0x0004007C, 0x0000000B, 0x000041E5, 0x00003B79, 0x000200F9,\n    0x00005341, 0x000200F8, 0x0000294E, 0x00050051, 0x0000000B, 0x00004D9A,\n    0x00002BE0, 0x00000000, 0x00050051, 0x0000000B, 0x00002C03, 0x00002BE0,\n    0x00000001, 0x00060050, 0x00000014, 0x000020DE, 0x00004D9A, 0x00002C03,\n    0x00004408, 0x0004007C, 0x00000016, 0x00004E9D, 0x000020DE, 0x00050051,\n    0x0000000C, 0x00002BFB, 0x00004E9D, 0x00000002, 0x000500C3, 0x0000000C,\n    0x00004DC1, 0x00002BFB, 0x00000A11, 0x0004007C, 0x0000000C, 0x00005785,\n    0x00006273, 0x00050084, 0x0000000C, 0x00001F03, 0x00004DC1, 0x00005785,\n    0x00050051, 0x0000000C, 0x00006243, 0x00004E9D, 0x00000001, 0x000500C3,\n    0x0000000C, 0x00004A6F, 0x00006243, 0x00000A17, 0x00050080, 0x0000000C,\n    0x00002B2D, 0x00001F03, 0x00004A6F, 0x0004007C, 0x0000000C, 0x00004202,\n    0x000020FC, 0x00050084, 0x0000000C, 0x00003A60, 0x00002B2D, 0x00004202,\n    0x00050051, 0x0000000C, 0x00006244, 0x00004E9D, 0x00000000, 0x000500C3,\n    0x0000000C, 0x00004FC8, 0x00006244, 0x00000A1A, 0x00050080, 0x0000000C,\n    0x000049FC, 0x00003A60, 0x00004FC8, 0x000500C4, 0x0000000C, 0x0000225D,\n    0x000049FC, 0x00000A20, 0x000500C7, 0x0000000C, 0x00002CAA, 0x00002BFB,\n    0x00000A14, 0x000500C4, 0x0000000C, 0x00004CAE, 0x00002CAA, 0x00000A1A,\n    0x000500C3, 0x0000000C, 0x0000383E, 0x00006243, 0x00000A0E, 0x000500C7,\n    0x0000000C, 0x00005374, 0x0000383E, 0x00000A14, 0x000500C4, 0x0000000C,\n    0x000054CA, 0x00005374, 0x00000A14, 0x000500C5, 0x0000000C, 0x000042CE,\n    0x00004CAE, 0x000054CA, 0x000500C7, 0x0000000C, 0x000050D5, 0x00006244,\n    0x00000A20, 0x000500C5, 0x0000000C, 0x00003ADD, 0x000042CE, 0x000050D5,\n    0x000500C5, 0x0000000C, 0x000043B7, 0x0000225D, 0x00003ADD, 0x000500C4,\n    0x0000000C, 0x00005E50, 0x000043B7, 0x00000A16, 0x000500C3, 0x0000000C,\n    0x000032D7, 0x00006243, 0x00000A14, 0x000500C6, 0x0000000C, 0x000026C9,\n    0x000032D7, 0x00004DC1, 0x000500C7, 0x0000000C, 0x00004199, 0x000026C9,\n    0x00000A0E, 0x000500C3, 0x0000000C, 0x00002590, 0x00006244, 0x00000A14,\n    0x000500C7, 0x0000000C, 0x0000505F, 0x00002590, 0x00000A14, 0x000500C4,\n    0x0000000C, 0x0000541E, 0x00004199, 0x00000A0E, 0x000500C6, 0x0000000C,\n    0x000022BB, 0x0000505F, 0x0000541E, 0x000500C7, 0x0000000C, 0x00005077,\n    0x00006243, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005229, 0x00005077,\n    0x00000A17, 0x000500C4, 0x0000000C, 0x00001998, 0x000022BB, 0x00000A1D,\n    0x000500C5, 0x0000000C, 0x000047FF, 0x00005229, 0x00001998, 0x000500C4,\n    0x0000000C, 0x00001BB5, 0x00004199, 0x00000A2C, 0x000500C5, 0x0000000C,\n    0x00003F5C, 0x000047FF, 0x00001BB5, 0x000500C3, 0x0000000C, 0x00003A70,\n    0x00005E50, 0x00000A17, 0x000500C7, 0x0000000C, 0x000018BA, 0x00003A70,\n    0x00000A0E, 0x000500C4, 0x0000000C, 0x00005480, 0x000018BA, 0x00000A1A,\n    0x000500C5, 0x0000000C, 0x000045A9, 0x00003F5C, 0x00005480, 0x000500C3,\n    0x0000000C, 0x00003A71, 0x00005E50, 0x00000A1A, 0x000500C7, 0x0000000C,\n    0x000018BB, 0x00003A71, 0x00000A20, 0x000500C4, 0x0000000C, 0x00005481,\n    0x000018BB, 0x00000A23, 0x000500C5, 0x0000000C, 0x00004570, 0x000045A9,\n    0x00005481, 0x000500C3, 0x0000000C, 0x00003C89, 0x00005E50, 0x00000A23,\n    0x000500C4, 0x0000000C, 0x00002825, 0x00003C89, 0x00000A2F, 0x000500C5,\n    0x0000000C, 0x00003B7A, 0x00004570, 0x00002825, 0x0004007C, 0x0000000B,\n    0x000041E6, 0x00003B7A, 0x000200F9, 0x00005341, 0x000200F8, 0x00005341,\n    0x000700F5, 0x0000000B, 0x00002522, 0x000041E6, 0x0000294E, 0x000041E5,\n    0x0000537D, 0x00050084, 0x0000000B, 0x000041CB, 0x0000229A, 0x00002A78,\n    0x00050084, 0x0000000B, 0x00002ED9, 0x00002522, 0x000041CB, 0x00050080,\n    0x0000000B, 0x00003B22, 0x00002ED9, 0x00002BB9, 0x000500C2, 0x0000000B,\n    0x0000261A, 0x00003B22, 0x00000A17, 0x0004007C, 0x00000017, 0x0000232F,\n    0x00003589, 0x000500AA, 0x00000009, 0x00001FEE, 0x00004ADC, 0x00000A19,\n    0x000300F7, 0x000039BC, 0x00000000, 0x000400FA, 0x00001FEE, 0x000033DF,\n    0x000039BC, 0x000200F8, 0x000033DF, 0x0009004F, 0x00000017, 0x00001F16,\n    0x0000232F, 0x0000232F, 0x00000003, 0x00000002, 0x00000001, 0x00000000,\n    0x000200F9, 0x000039BC, 0x000200F8, 0x000039BC, 0x000700F5, 0x00000017,\n    0x00005972, 0x0000232F, 0x00005341, 0x00001F16, 0x000033DF, 0x000600A9,\n    0x0000000B, 0x00001F84, 0x00001FEE, 0x00000A10, 0x00004ADC, 0x000500AA,\n    0x00000009, 0x00005116, 0x00001F84, 0x00000A16, 0x000300F7, 0x000039BD,\n    0x00000000, 0x000400FA, 0x00005116, 0x000033E0, 0x000039BD, 0x000200F8,\n    0x000033E0, 0x0009004F, 0x00000017, 0x00001F17, 0x00005972, 0x00005972,\n    0x00000001, 0x00000000, 0x00000003, 0x00000002, 0x000200F9, 0x000039BD,\n    0x000200F8, 0x000039BD, 0x000700F5, 0x00000017, 0x00005973, 0x00005972,\n    0x000039BC, 0x00001F17, 0x000033E0, 0x000600A9, 0x0000000B, 0x000019CD,\n    0x00005116, 0x00000A10, 0x00001F84, 0x000500AA, 0x00000009, 0x00003464,\n    0x000019CD, 0x00000A0D, 0x000500AA, 0x00000009, 0x000047C2, 0x000019CD,\n    0x00000A10, 0x000500A6, 0x00000009, 0x00005686, 0x00003464, 0x000047C2,\n    0x000300F7, 0x00003463, 0x00000000, 0x000400FA, 0x00005686, 0x00002957,\n    0x00003463, 0x000200F8, 0x00002957, 0x000500C7, 0x00000017, 0x0000475F,\n    0x00005973, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D1, 0x0000475F,\n    0x0000013D, 0x000500C7, 0x00000017, 0x000050AC, 0x00005973, 0x0000072E,\n    0x000500C2, 0x00000017, 0x0000448D, 0x000050AC, 0x0000013D, 0x000500C5,\n    0x00000017, 0x00003FF9, 0x000024D1, 0x0000448D, 0x000200F9, 0x00003463,\n    0x000200F8, 0x00003463, 0x000700F5, 0x00000017, 0x0000587A, 0x00005973,\n    0x000039BD, 0x00003FF9, 0x00002957, 0x000500AA, 0x00000009, 0x00004CB6,\n    0x000019CD, 0x00000A13, 0x000500A6, 0x00000009, 0x00003B23, 0x000047C2,\n    0x00004CB6, 0x000300F7, 0x00002C98, 0x00000000, 0x000400FA, 0x00003B23,\n    0x00002B38, 0x00002C98, 0x000200F8, 0x00002B38, 0x000500C4, 0x00000017,\n    0x00005E17, 0x0000587A, 0x000002ED, 0x000500C2, 0x00000017, 0x00003BE7,\n    0x0000587A, 0x000002ED, 0x000500C5, 0x00000017, 0x000029E8, 0x00005E17,\n    0x00003BE7, 0x000200F9, 0x00002C98, 0x000200F8, 0x00002C98, 0x000700F5,\n    0x00000017, 0x00004D37, 0x0000587A, 0x00003463, 0x000029E8, 0x00002B38,\n    0x00060041, 0x00000294, 0x000060F9, 0x00001592, 0x00000A0B, 0x0000261A,\n    0x0003003E, 0x000060F9, 0x00004D37, 0x00050080, 0x0000000B, 0x000024AD,\n    0x00003B22, 0x00000A3A, 0x000500C2, 0x0000000B, 0x00004A5E, 0x000024AD,\n    0x00000A17, 0x0004007C, 0x00000017, 0x000039DE, 0x00002C70, 0x000300F7,\n    0x00003F86, 0x00000000, 0x000400FA, 0x00001FEE, 0x000033E1, 0x00003F86,\n    0x000200F8, 0x000033E1, 0x0009004F, 0x00000017, 0x00001F18, 0x000039DE,\n    0x000039DE, 0x00000003, 0x00000002, 0x00000001, 0x00000000, 0x000200F9,\n    0x00003F86, 0x000200F8, 0x00003F86, 0x000700F5, 0x00000017, 0x00002AAF,\n    0x000039DE, 0x00002C98, 0x00001F18, 0x000033E1, 0x000300F7, 0x00003F87,\n    0x00000000, 0x000400FA, 0x00005116, 0x000033E2, 0x00003F87, 0x000200F8,\n    0x000033E2, 0x0009004F, 0x00000017, 0x00001F19, 0x00002AAF, 0x00002AAF,\n    0x00000001, 0x00000000, 0x00000003, 0x00000002, 0x000200F9, 0x00003F87,\n    0x000200F8, 0x00003F87, 0x000700F5, 0x00000017, 0x00002AB0, 0x00002AAF,\n    0x00003F86, 0x00001F19, 0x000033E2, 0x000300F7, 0x00003A1A, 0x00000000,\n    0x000400FA, 0x00005686, 0x00002958, 0x00003A1A, 0x000200F8, 0x00002958,\n    0x000500C7, 0x00000017, 0x00004760, 0x00002AB0, 0x000009CE, 0x000500C4,\n    0x00000017, 0x000024D2, 0x00004760, 0x0000013D, 0x000500C7, 0x00000017,\n    0x000050AD, 0x00002AB0, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448E,\n    0x000050AD, 0x0000013D, 0x000500C5, 0x00000017, 0x00003FFA, 0x000024D2,\n    0x0000448E, 0x000200F9, 0x00003A1A, 0x000200F8, 0x00003A1A, 0x000700F5,\n    0x00000017, 0x00002AB1, 0x00002AB0, 0x00003F87, 0x00003FFA, 0x00002958,\n    0x000300F7, 0x00002C99, 0x00000000, 0x000400FA, 0x00003B23, 0x00002B39,\n    0x00002C99, 0x000200F8, 0x00002B39, 0x000500C4, 0x00000017, 0x00005E18,\n    0x00002AB1, 0x000002ED, 0x000500C2, 0x00000017, 0x00003BE8, 0x00002AB1,\n    0x000002ED, 0x000500C5, 0x00000017, 0x000029E9, 0x00005E18, 0x00003BE8,\n    0x000200F9, 0x00002C99, 0x000200F8, 0x00002C99, 0x000700F5, 0x00000017,\n    0x00004D38, 0x00002AB1, 0x00003A1A, 0x000029E9, 0x00002B39, 0x00060041,\n    0x00000294, 0x00001F75, 0x00001592, 0x00000A0B, 0x00004A5E, 0x0003003E,\n    0x00001F75, 0x00004D38, 0x000200F9, 0x00004C7A, 0x000200F8, 0x00004C7A,\n    0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/resolve_full_16bpp_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25271\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 8 8 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_resolve_edram_info\"\n               OpMemberName %push_const_block_xe 1 \"xe_resolve_coordinate_info\"\n               OpMemberName %push_const_block_xe 2 \"xe_resolve_dest_info\"\n               OpMemberName %push_const_block_xe 3 \"xe_resolve_dest_coordinate_info\"\n               OpMemberName %push_const_block_xe 4 \"xe_resolve_dest_base\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %xe_resolve_edram_xe_block \"xe_resolve_edram_xe_block\"\n               OpMemberName %xe_resolve_edram_xe_block 0 \"data\"\n               OpName %xe_resolve_edram \"xe_resolve_edram\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_resolve_dest_xe_block \"xe_resolve_dest_xe_block\"\n               OpMemberName %xe_resolve_dest_xe_block 0 \"data\"\n               OpName %xe_resolve_dest \"xe_resolve_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpDecorate %_runtimearr_uint ArrayStride 4\n               OpDecorate %xe_resolve_edram_xe_block BufferBlock\n               OpMemberDecorate %xe_resolve_edram_xe_block 0 NonWritable\n               OpMemberDecorate %xe_resolve_edram_xe_block 0 Offset 0\n               OpDecorate %xe_resolve_edram NonWritable\n               OpDecorate %xe_resolve_edram Binding 0\n               OpDecorate %xe_resolve_edram DescriptorSet 0\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v2uint ArrayStride 8\n               OpDecorate %xe_resolve_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_resolve_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_resolve_dest_xe_block 0 Offset 0\n               OpDecorate %xe_resolve_dest NonReadable\n               OpDecorate %xe_resolve_dest Binding 0\n               OpDecorate %xe_resolve_dest DescriptorSet 1\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n     %v3uint = OpTypeVector %uint 3\n     %v4uint = OpTypeVector %uint 4\n      %float = OpTypeFloat 32\n    %v2float = OpTypeVector %float 2\n    %v3float = OpTypeVector %float 3\n    %v4float = OpTypeVector %float 4\n       %bool = OpTypeBool\n      %v3int = OpTypeVector %int 3\n    %float_0 = OpConstant %float 0\n    %float_1 = OpConstant %float 1\n     %uint_1 = OpConstant %uint 1\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n   %float_31 = OpConstant %float 31\n       %2057 = OpConstantComposite %v4float %float_31 %float_31 %float_31 %float_1\n  %float_0_5 = OpConstant %float 0.5\n     %uint_0 = OpConstant %uint 0\n      %int_5 = OpConstant %int 5\n     %uint_2 = OpConstant %uint 2\n     %int_10 = OpConstant %int 10\n     %uint_3 = OpConstant %uint 3\n     %int_15 = OpConstant %int 15\n   %float_63 = OpConstant %float 63\n        %511 = OpConstantComposite %v3float %float_31 %float_63 %float_31\n     %int_11 = OpConstant %int 11\n        %958 = OpConstantComposite %v3float %float_31 %float_31 %float_63\n  %float_255 = OpConstant %float 255\n      %int_8 = OpConstant %int 8\n     %int_16 = OpConstant %int 16\n     %int_24 = OpConstant %int 24\n   %float_15 = OpConstant %float 15\n      %int_4 = OpConstant %int 4\n     %int_12 = OpConstant %int 12\n%float_65535 = OpConstant %float 65535\n    %uint_16 = OpConstant %uint 16\n    %uint_24 = OpConstant %uint 24\n        %653 = OpConstantComposite %v4uint %uint_0 %uint_8 %uint_16 %uint_24\n   %uint_255 = OpConstant %uint 255\n%float_0_00392156886 = OpConstant %float 0.00392156886\n    %uint_10 = OpConstant %uint 10\n    %uint_20 = OpConstant %uint 20\n    %uint_30 = OpConstant %uint 30\n        %845 = OpConstantComposite %v4uint %uint_0 %uint_10 %uint_20 %uint_30\n  %uint_1023 = OpConstant %uint 1023\n        %635 = OpConstantComposite %v4uint %uint_1023 %uint_1023 %uint_1023 %uint_3\n%float_0_000977517106 = OpConstant %float 0.000977517106\n%float_0_333333343 = OpConstant %float 0.333333343\n       %2798 = OpConstantComposite %v4float %float_0_000977517106 %float_0_000977517106 %float_0_000977517106 %float_0_333333343\n       %2996 = OpConstantComposite %v3uint %uint_0 %uint_10 %uint_20\n   %uint_127 = OpConstant %uint 127\n     %uint_7 = OpConstant %uint 7\n     %v3bool = OpTypeVector %bool 3\n   %uint_124 = OpConstant %uint 124\n    %uint_23 = OpConstant %uint 23\n   %float_n1 = OpConstant %float -1\n      %int_0 = OpConstant %int 0\n       %1959 = OpConstantComposite %v2int %int_16 %int_0\n%float_0_000976592302 = OpConstant %float 0.000976592302\n      %v4int = OpTypeVector %int 4\n        %290 = OpConstantComposite %v4int %int_16 %int_0 %int_16 %int_0\n       %1837 = OpConstantComposite %v2uint %uint_2 %uint_1\n     %v2bool = OpTypeVector %bool 2\n       %1807 = OpConstantComposite %v2uint %uint_0 %uint_0\n       %1828 = OpConstantComposite %v2uint %uint_1 %uint_1\n       %1816 = OpConstantComposite %v2uint %uint_1 %uint_0\n    %uint_80 = OpConstant %uint 80\n       %2719 = OpConstantComposite %v2uint %uint_80 %uint_16\n      %int_2 = OpConstant %int 2\n      %int_6 = OpConstant %int 6\n      %int_1 = OpConstant %int 1\n      %int_7 = OpConstant %int 7\n      %int_3 = OpConstant %int 3\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n    %uint_13 = OpConstant %uint 13\n  %uint_2047 = OpConstant %uint 2047\n    %uint_15 = OpConstant %uint 15\n    %uint_28 = OpConstant %uint 28\n     %uint_4 = OpConstant %uint 4\n       %1855 = OpConstantComposite %v2uint %uint_0 %uint_4\n     %uint_5 = OpConstant %uint 5\n    %uint_63 = OpConstant %uint 63\n     %int_26 = OpConstant %int 26\n     %int_23 = OpConstant %int 23\n%uint_16777216 = OpConstant %uint 16777216\n       %2275 = OpConstantComposite %v2uint %uint_20 %uint_24\n      %false = OpConstantFalse %bool\n%_runtimearr_uint = OpTypeRuntimeArray %uint\n%xe_resolve_edram_xe_block = OpTypeStruct %_runtimearr_uint\n%_ptr_Uniform_xe_resolve_edram_xe_block = OpTypePointer Uniform %xe_resolve_edram_xe_block\n%xe_resolve_edram = OpVariable %_ptr_Uniform_xe_resolve_edram_xe_block Uniform\n%_ptr_Uniform_uint = OpTypePointer Uniform %uint\n   %uint_320 = OpConstant %uint 320\n     %uint_6 = OpConstant %uint 6\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %1825 = OpConstantComposite %v2uint %uint_2 %uint_0\n%uint_4294901760 = OpConstant %uint 4294901760\n%_runtimearr_v2uint = OpTypeRuntimeArray %v2uint\n%xe_resolve_dest_xe_block = OpTypeStruct %_runtimearr_v2uint\n%_ptr_Uniform_xe_resolve_dest_xe_block = OpTypePointer Uniform %xe_resolve_dest_xe_block\n%xe_resolve_dest = OpVariable %_ptr_Uniform_xe_resolve_dest_xe_block Uniform\n%_ptr_Uniform_v2uint = OpTypePointer Uniform %v2uint\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_8 %uint_8 %uint_1\n       %1954 = OpConstantComposite %v2uint %uint_15 %uint_1\n       %1870 = OpConstantComposite %v2uint %uint_3 %uint_3\n       %2122 = OpConstantComposite %v2uint %uint_15 %uint_15\n       %1284 = OpConstantComposite %v4float %float_n1 %float_n1 %float_n1 %float_n1\n        %770 = OpConstantComposite %v4int %int_16 %int_16 %int_16 %int_16\n       %1611 = OpConstantComposite %v4uint %uint_255 %uint_255 %uint_255 %uint_255\n        %261 = OpConstantComposite %v3uint %uint_1023 %uint_1023 %uint_1023\n       %1126 = OpConstantComposite %v3uint %uint_127 %uint_127 %uint_127\n       %2828 = OpConstantComposite %v3uint %uint_7 %uint_7 %uint_7\n       %2578 = OpConstantComposite %v3uint %uint_0 %uint_0 %uint_0\n       %1018 = OpConstantComposite %v3uint %uint_124 %uint_124 %uint_124\n        %393 = OpConstantComposite %v3uint %uint_23 %uint_23 %uint_23\n        %141 = OpConstantComposite %v3uint %uint_16 %uint_16 %uint_16\n         %73 = OpConstantComposite %v2float %float_n1 %float_n1\n       %2151 = OpConstantComposite %v2int %int_16 %int_16\n       %2938 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0\n       %1285 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1\n        %325 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_0_5\n       %2605 = OpConstantComposite %v3float %float_0 %float_0 %float_0\n       %2584 = OpConstantComposite %v3float %float_1 %float_1 %float_1\n        %939 = OpConstantComposite %v3float %float_0_5 %float_0_5 %float_0_5\n       %2326 = OpConstantComposite %v2uint %uint_16711935 %uint_16711935\n       %1975 = OpConstantComposite %v2uint %uint_8 %uint_8\n       %2888 = OpConstantComposite %v2uint %uint_4278255360 %uint_4278255360\n%int_1065353216 = OpConstant %int 1065353216\n  %uint_1280 = OpConstant %uint 1280\n%uint_2621440 = OpConstant %uint 2621440\n%uint_4294967290 = OpConstant %uint 4294967290\n       %2360 = OpConstantComposite %v3uint %uint_4294967290 %uint_4294967290 %uint_4294967290\n   %uint_336 = OpConstant %uint 336\n %float_0_25 = OpConstant %float 0.25\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %22245 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %15627 = OpLoad %uint %22245\n      %22700 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %20824 = OpLoad %uint %22700\n      %20561 = OpBitwiseAnd %uint %15627 %uint_1023\n      %19978 = OpShiftRightLogical %uint %15627 %uint_10\n       %8574 = OpBitwiseAnd %uint %19978 %uint_3\n      %21002 = OpShiftRightLogical %uint %15627 %uint_13\n       %8575 = OpBitwiseAnd %uint %21002 %uint_2047\n      %21003 = OpShiftRightLogical %uint %15627 %uint_24\n       %8576 = OpBitwiseAnd %uint %21003 %uint_15\n      %18836 = OpShiftRightLogical %uint %15627 %uint_28\n       %9130 = OpBitwiseAnd %uint %18836 %uint_1\n       %8871 = OpCompositeConstruct %v2uint %20824 %20824\n       %9576 = OpShiftRightLogical %v2uint %8871 %1855\n      %23379 = OpBitwiseAnd %v2uint %9576 %1954\n      %16207 = OpShiftLeftLogical %v2uint %23379 %1870\n      %23019 = OpIMul %v2uint %16207 %1828\n      %12819 = OpShiftRightLogical %uint %20824 %uint_5\n      %16204 = OpBitwiseAnd %uint %12819 %uint_2047\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %24236 = OpLoad %uint %18732\n      %22701 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %20919 = OpLoad %uint %22701\n      %19164 = OpBitwiseAnd %uint %24236 %uint_7\n      %21999 = OpBitwiseAnd %uint %24236 %uint_8\n      %20495 = OpINotEqual %bool %21999 %uint_0\n      %10307 = OpShiftRightLogical %uint %24236 %uint_4\n      %24434 = OpBitwiseAnd %uint %10307 %uint_7\n      %19672 = OpShiftRightLogical %uint %24236 %uint_7\n      %20627 = OpBitwiseAnd %uint %19672 %uint_63\n      %22920 = OpBitcast %int %24236\n      %13711 = OpShiftLeftLogical %int %22920 %int_10\n      %20636 = OpShiftRightArithmetic %int %13711 %int_26\n      %18178 = OpShiftLeftLogical %int %20636 %int_23\n       %7462 = OpIAdd %int %18178 %int_1065353216\n      %11052 = OpBitcast %float %7462\n      %22649 = OpBitwiseAnd %uint %24236 %uint_16777216\n       %7475 = OpINotEqual %bool %22649 %uint_0\n       %8444 = OpBitwiseAnd %uint %20919 %uint_1023\n      %12176 = OpShiftRightLogical %uint %20919 %uint_10\n      %25038 = OpBitwiseAnd %uint %12176 %uint_1023\n      %25203 = OpShiftLeftLogical %uint %25038 %int_1\n      %10422 = OpCompositeConstruct %v2uint %20919 %20919\n      %10385 = OpShiftRightLogical %v2uint %10422 %2275\n      %23380 = OpBitwiseAnd %v2uint %10385 %2122\n      %16208 = OpShiftLeftLogical %v2uint %23380 %1870\n      %23020 = OpIMul %v2uint %16208 %1828\n      %12820 = OpShiftRightLogical %uint %20919 %uint_28\n      %16205 = OpBitwiseAnd %uint %12820 %uint_7\n      %18656 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_4\n      %25270 = OpLoad %uint %18656\n      %14159 = OpLoad %v3uint %gl_GlobalInvocationID\n      %12672 = OpVectorShuffle %v2uint %14159 %14159 0 1\n      %12025 = OpShiftLeftLogical %v2uint %12672 %1825\n       %7640 = OpCompositeExtract %uint %12025 0\n      %11658 = OpShiftLeftLogical %uint %16204 %uint_3\n      %15379 = OpUGreaterThanEqual %bool %7640 %11658\n               OpSelectionMerge %12755 DontFlatten\n               OpBranchConditional %15379 %21992 %12755\n      %21992 = OpLabel\n               OpBranch %19578\n      %12755 = OpLabel\n       %7340 = OpCompositeExtract %uint %12025 1\n       %7992 = OpExtInst %uint %1 UMax %7340 %uint_0\n      %20975 = OpCompositeConstruct %v2uint %7640 %7992\n      %21036 = OpIAdd %v2uint %20975 %23019\n      %16075 = OpULessThanEqual %bool %16205 %uint_3\n               OpSelectionMerge %23776 None\n               OpBranchConditional %16075 %10990 %15087\n      %15087 = OpLabel\n      %13566 = OpIEqual %bool %16205 %uint_5\n       %8438 = OpSelect %uint %13566 %uint_2 %uint_0\n               OpBranch %23776\n      %10990 = OpLabel\n               OpBranch %23776\n      %23776 = OpLabel\n      %19300 = OpPhi %uint %16205 %10990 %8438 %15087\n      %16830 = OpCompositeConstruct %v2uint %8574 %8574\n      %11801 = OpUGreaterThanEqual %v2bool %16830 %1837\n      %19381 = OpSelect %v2uint %11801 %1828 %1807\n      %10986 = OpShiftLeftLogical %v2uint %21036 %19381\n      %24669 = OpCompositeConstruct %v2uint %19300 %19300\n       %9093 = OpShiftRightLogical %v2uint %24669 %1816\n      %15084 = OpBitwiseAnd %v2uint %9093 %1828\n      %10197 = OpIAdd %v2uint %10986 %15084\n       %8548 = OpCompositeConstruct %v2uint %9130 %uint_0\n       %9802 = OpShiftRightLogical %v2uint %2719 %8548\n      %10146 = OpUDiv %v2uint %10197 %9802\n      %20390 = OpCompositeExtract %uint %10146 1\n      %11046 = OpIMul %uint %20390 %20561\n      %24665 = OpCompositeExtract %uint %10146 0\n      %21536 = OpIAdd %uint %11046 %24665\n       %8742 = OpIAdd %uint %8575 %21536\n      %23345 = OpIMul %v2uint %10146 %9802\n      %11892 = OpISub %v2uint %10197 %23345\n       %8053 = OpIMul %uint %8742 %uint_1280\n      %24263 = OpCompositeExtract %uint %11892 1\n      %23526 = OpCompositeExtract %uint %9802 0\n      %22886 = OpIMul %uint %24263 %23526\n       %6886 = OpCompositeExtract %uint %11892 0\n       %9696 = OpIAdd %uint %22886 %6886\n      %18116 = OpShiftLeftLogical %uint %9696 %9130\n      %18619 = OpIAdd %uint %8053 %18116\n      %19545 = OpUMod %uint %18619 %uint_2621440\n      %23531 = OpShiftLeftLogical %uint %19545 %int_2\n      %13906 = OpUGreaterThanEqual %bool %8574 %uint_2\n      %11277 = OpSelect %uint %13906 %uint_1 %uint_0\n      %20074 = OpIAdd %uint %9130 %11277\n       %6555 = OpShiftLeftLogical %uint %uint_4 %20074\n      %23279 = OpINotEqual %bool %9130 %uint_0\n               OpSelectionMerge %21263 DontFlatten\n               OpBranchConditional %23279 %15205 %16569\n      %16569 = OpLabel\n      %19162 = OpIEqual %bool %6555 %uint_4\n               OpSelectionMerge %20297 DontFlatten\n               OpBranchConditional %19162 %6591 %8959\n       %8959 = OpLabel\n      %22064 = OpShiftRightLogical %uint %23531 %int_2\n      %13369 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22064\n      %15060 = OpLoad %uint %13369\n       %8517 = OpIAdd %uint %23531 %6555\n      %21670 = OpShiftRightLogical %uint %8517 %int_2\n      %19677 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21670\n      %13114 = OpLoad %uint %19677\n       %8685 = OpIMul %uint %uint_2 %6555\n      %24254 = OpIAdd %uint %23531 %8685\n      %17890 = OpShiftRightLogical %uint %24254 %int_2\n      %19678 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17890\n      %13115 = OpLoad %uint %19678\n       %8686 = OpIMul %uint %uint_3 %6555\n      %24255 = OpIAdd %uint %23531 %8686\n      %17891 = OpShiftRightLogical %uint %24255 %int_2\n      %18689 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17891\n      %24409 = OpLoad %uint %18689\n      %20780 = OpCompositeConstruct %v4uint %15060 %13114 %13115 %24409\n               OpBranch %20297\n       %6591 = OpLabel\n      %24486 = OpShiftRightLogical %uint %23531 %int_2\n      %13370 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24486\n      %12609 = OpLoad %uint %13370\n      %11687 = OpIAdd %uint %24486 %uint_1\n       %6399 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11687\n      %23650 = OpLoad %uint %6399\n      %11688 = OpIAdd %uint %24486 %uint_2\n       %6400 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11688\n      %23651 = OpLoad %uint %6400\n      %11689 = OpIAdd %uint %24486 %uint_3\n      %24558 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11689\n      %16379 = OpLoad %uint %24558\n      %20781 = OpCompositeConstruct %v4uint %12609 %23650 %23651 %16379\n               OpBranch %20297\n      %20297 = OpLabel\n      %10943 = OpPhi %v4uint %20781 %6591 %20780 %8959\n               OpSelectionMerge %16224 None\n               OpSwitch %8576 %19451 0 %14585 1 %14585 2 %7355 10 %7355 3 %7354 12 %7354 4 %8190 6 %8243\n       %8243 = OpLabel\n      %24406 = OpCompositeExtract %uint %10943 0\n      %24679 = OpExtInst %v2float %1 UnpackHalf2x16 %24406\n      %10082 = OpCompositeExtract %float %24679 0\n      %17478 = OpCompositeExtract %float %24679 1\n      %14604 = OpCompositeConstruct %v4float %10082 %17478 %float_0 %float_0\n      %17274 = OpCompositeExtract %uint %10943 1\n      %18027 = OpExtInst %v2float %1 UnpackHalf2x16 %17274\n      %10083 = OpCompositeExtract %float %18027 0\n      %17479 = OpCompositeExtract %float %18027 1\n      %14605 = OpCompositeConstruct %v4float %10083 %17479 %float_0 %float_0\n      %17275 = OpCompositeExtract %uint %10943 2\n      %18028 = OpExtInst %v2float %1 UnpackHalf2x16 %17275\n      %10084 = OpCompositeExtract %float %18028 0\n      %17480 = OpCompositeExtract %float %18028 1\n      %14606 = OpCompositeConstruct %v4float %10084 %17480 %float_0 %float_0\n      %17276 = OpCompositeExtract %uint %10943 3\n      %18029 = OpExtInst %v2float %1 UnpackHalf2x16 %17276\n      %10085 = OpCompositeExtract %float %18029 0\n      %20670 = OpCompositeExtract %float %18029 1\n       %9033 = OpCompositeConstruct %v4float %10085 %20670 %float_0 %float_0\n               OpBranch %16224\n       %8190 = OpLabel\n      %12427 = OpCompositeExtract %uint %10943 0\n      %22685 = OpBitcast %int %12427\n      %18202 = OpCompositeConstruct %v2int %22685 %22685\n      %18349 = OpShiftLeftLogical %v2int %18202 %1959\n      %13335 = OpShiftRightArithmetic %v2int %18349 %2151\n      %10903 = OpConvertSToF %v2float %13335\n      %18247 = OpVectorTimesScalar %v2float %10903 %float_0_000976592302\n      %24070 = OpExtInst %v2float %1 FMax %73 %18247\n      %24330 = OpCompositeExtract %float %24070 0\n      %15572 = OpCompositeExtract %float %24070 1\n      %16670 = OpCompositeConstruct %v4float %24330 %15572 %float_0 %float_0\n      %19522 = OpCompositeExtract %uint %10943 1\n      %16033 = OpBitcast %int %19522\n      %18203 = OpCompositeConstruct %v2int %16033 %16033\n      %18350 = OpShiftLeftLogical %v2int %18203 %1959\n      %13336 = OpShiftRightArithmetic %v2int %18350 %2151\n      %10904 = OpConvertSToF %v2float %13336\n      %18248 = OpVectorTimesScalar %v2float %10904 %float_0_000976592302\n      %24071 = OpExtInst %v2float %1 FMax %73 %18248\n      %24331 = OpCompositeExtract %float %24071 0\n      %15573 = OpCompositeExtract %float %24071 1\n      %16671 = OpCompositeConstruct %v4float %24331 %15573 %float_0 %float_0\n      %19523 = OpCompositeExtract %uint %10943 2\n      %16034 = OpBitcast %int %19523\n      %18204 = OpCompositeConstruct %v2int %16034 %16034\n      %18351 = OpShiftLeftLogical %v2int %18204 %1959\n      %13337 = OpShiftRightArithmetic %v2int %18351 %2151\n      %10905 = OpConvertSToF %v2float %13337\n      %18249 = OpVectorTimesScalar %v2float %10905 %float_0_000976592302\n      %24072 = OpExtInst %v2float %1 FMax %73 %18249\n      %24332 = OpCompositeExtract %float %24072 0\n      %15574 = OpCompositeExtract %float %24072 1\n      %16672 = OpCompositeConstruct %v4float %24332 %15574 %float_0 %float_0\n      %19524 = OpCompositeExtract %uint %10943 3\n      %16035 = OpBitcast %int %19524\n      %18205 = OpCompositeConstruct %v2int %16035 %16035\n      %18352 = OpShiftLeftLogical %v2int %18205 %1959\n      %13338 = OpShiftRightArithmetic %v2int %18352 %2151\n      %10906 = OpConvertSToF %v2float %13338\n      %18250 = OpVectorTimesScalar %v2float %10906 %float_0_000976592302\n      %24073 = OpExtInst %v2float %1 FMax %73 %18250\n      %24333 = OpCompositeExtract %float %24073 0\n      %18764 = OpCompositeExtract %float %24073 1\n       %9034 = OpCompositeConstruct %v4float %24333 %18764 %float_0 %float_0\n               OpBranch %16224\n       %7354 = OpLabel\n      %22205 = OpCompositeExtract %uint %10943 0\n      %20234 = OpCompositeConstruct %v3uint %22205 %22205 %22205\n      %11021 = OpShiftRightLogical %v3uint %20234 %2996\n      %24038 = OpBitwiseAnd %v3uint %11021 %261\n      %18588 = OpBitwiseAnd %v3uint %11021 %1126\n      %23440 = OpShiftRightLogical %v3uint %24038 %2828\n      %16585 = OpIEqual %v3bool %23440 %2578\n      %11339 = OpExtInst %v3int %1 FindUMsb %18588\n      %10773 = OpBitcast %v3uint %11339\n       %6266 = OpISub %v3uint %2828 %10773\n       %8720 = OpIAdd %v3uint %10773 %2360\n      %10351 = OpSelect %v3uint %16585 %8720 %23440\n      %23252 = OpShiftLeftLogical %v3uint %18588 %6266\n      %18842 = OpBitwiseAnd %v3uint %23252 %1126\n      %10909 = OpSelect %v3uint %16585 %18842 %18588\n      %24569 = OpIAdd %v3uint %10351 %1018\n      %20351 = OpShiftLeftLogical %v3uint %24569 %393\n      %16294 = OpShiftLeftLogical %v3uint %10909 %141\n      %22396 = OpBitwiseOr %v3uint %20351 %16294\n      %13824 = OpIEqual %v3bool %24038 %2578\n      %16962 = OpSelect %v3uint %13824 %2578 %22396\n      %10703 = OpBitcast %v3float %16962\n      %19364 = OpShiftRightLogical %uint %22205 %uint_30\n      %18446 = OpConvertUToF %float %19364\n      %15903 = OpFMul %float %18446 %float_0_333333343\n      %21442 = OpCompositeExtract %float %10703 0\n      %10837 = OpCompositeExtract %float %10703 1\n       %7833 = OpCompositeExtract %float %10703 2\n      %15834 = OpCompositeConstruct %v4float %21442 %10837 %7833 %15903\n      %10229 = OpCompositeExtract %uint %10943 1\n      %13582 = OpCompositeConstruct %v3uint %10229 %10229 %10229\n      %11022 = OpShiftRightLogical %v3uint %13582 %2996\n      %24039 = OpBitwiseAnd %v3uint %11022 %261\n      %18589 = OpBitwiseAnd %v3uint %11022 %1126\n      %23441 = OpShiftRightLogical %v3uint %24039 %2828\n      %16586 = OpIEqual %v3bool %23441 %2578\n      %11340 = OpExtInst %v3int %1 FindUMsb %18589\n      %10774 = OpBitcast %v3uint %11340\n       %6267 = OpISub %v3uint %2828 %10774\n       %8721 = OpIAdd %v3uint %10774 %2360\n      %10352 = OpSelect %v3uint %16586 %8721 %23441\n      %23253 = OpShiftLeftLogical %v3uint %18589 %6267\n      %18843 = OpBitwiseAnd %v3uint %23253 %1126\n      %10910 = OpSelect %v3uint %16586 %18843 %18589\n      %24570 = OpIAdd %v3uint %10352 %1018\n      %20352 = OpShiftLeftLogical %v3uint %24570 %393\n      %16295 = OpShiftLeftLogical %v3uint %10910 %141\n      %22397 = OpBitwiseOr %v3uint %20352 %16295\n      %13825 = OpIEqual %v3bool %24039 %2578\n      %16963 = OpSelect %v3uint %13825 %2578 %22397\n      %10704 = OpBitcast %v3float %16963\n      %19365 = OpShiftRightLogical %uint %10229 %uint_30\n      %18447 = OpConvertUToF %float %19365\n      %15904 = OpFMul %float %18447 %float_0_333333343\n      %21443 = OpCompositeExtract %float %10704 0\n      %10838 = OpCompositeExtract %float %10704 1\n       %7834 = OpCompositeExtract %float %10704 2\n      %15835 = OpCompositeConstruct %v4float %21443 %10838 %7834 %15904\n      %10230 = OpCompositeExtract %uint %10943 2\n      %13583 = OpCompositeConstruct %v3uint %10230 %10230 %10230\n      %11023 = OpShiftRightLogical %v3uint %13583 %2996\n      %24040 = OpBitwiseAnd %v3uint %11023 %261\n      %18590 = OpBitwiseAnd %v3uint %11023 %1126\n      %23442 = OpShiftRightLogical %v3uint %24040 %2828\n      %16587 = OpIEqual %v3bool %23442 %2578\n      %11341 = OpExtInst %v3int %1 FindUMsb %18590\n      %10775 = OpBitcast %v3uint %11341\n       %6268 = OpISub %v3uint %2828 %10775\n       %8722 = OpIAdd %v3uint %10775 %2360\n      %10353 = OpSelect %v3uint %16587 %8722 %23442\n      %23254 = OpShiftLeftLogical %v3uint %18590 %6268\n      %18844 = OpBitwiseAnd %v3uint %23254 %1126\n      %10911 = OpSelect %v3uint %16587 %18844 %18590\n      %24571 = OpIAdd %v3uint %10353 %1018\n      %20353 = OpShiftLeftLogical %v3uint %24571 %393\n      %16296 = OpShiftLeftLogical %v3uint %10911 %141\n      %22398 = OpBitwiseOr %v3uint %20353 %16296\n      %13826 = OpIEqual %v3bool %24040 %2578\n      %16964 = OpSelect %v3uint %13826 %2578 %22398\n      %10705 = OpBitcast %v3float %16964\n      %19366 = OpShiftRightLogical %uint %10230 %uint_30\n      %18448 = OpConvertUToF %float %19366\n      %15905 = OpFMul %float %18448 %float_0_333333343\n      %21444 = OpCompositeExtract %float %10705 0\n      %10839 = OpCompositeExtract %float %10705 1\n       %7835 = OpCompositeExtract %float %10705 2\n      %15836 = OpCompositeConstruct %v4float %21444 %10839 %7835 %15905\n      %10231 = OpCompositeExtract %uint %10943 3\n      %13584 = OpCompositeConstruct %v3uint %10231 %10231 %10231\n      %11024 = OpShiftRightLogical %v3uint %13584 %2996\n      %24041 = OpBitwiseAnd %v3uint %11024 %261\n      %18591 = OpBitwiseAnd %v3uint %11024 %1126\n      %23443 = OpShiftRightLogical %v3uint %24041 %2828\n      %16588 = OpIEqual %v3bool %23443 %2578\n      %11342 = OpExtInst %v3int %1 FindUMsb %18591\n      %10776 = OpBitcast %v3uint %11342\n       %6269 = OpISub %v3uint %2828 %10776\n       %8723 = OpIAdd %v3uint %10776 %2360\n      %10354 = OpSelect %v3uint %16588 %8723 %23443\n      %23255 = OpShiftLeftLogical %v3uint %18591 %6269\n      %18845 = OpBitwiseAnd %v3uint %23255 %1126\n      %10912 = OpSelect %v3uint %16588 %18845 %18591\n      %24572 = OpIAdd %v3uint %10354 %1018\n      %20354 = OpShiftLeftLogical %v3uint %24572 %393\n      %16297 = OpShiftLeftLogical %v3uint %10912 %141\n      %22399 = OpBitwiseOr %v3uint %20354 %16297\n      %13827 = OpIEqual %v3bool %24041 %2578\n      %16965 = OpSelect %v3uint %13827 %2578 %22399\n      %10706 = OpBitcast %v3float %16965\n      %19367 = OpShiftRightLogical %uint %10231 %uint_30\n      %18449 = OpConvertUToF %float %19367\n      %15906 = OpFMul %float %18449 %float_0_333333343\n      %21445 = OpCompositeExtract %float %10706 0\n      %10840 = OpCompositeExtract %float %10706 1\n      %11025 = OpCompositeExtract %float %10706 2\n       %9035 = OpCompositeConstruct %v4float %21445 %10840 %11025 %15906\n               OpBranch %16224\n       %7355 = OpLabel\n      %22206 = OpCompositeExtract %uint %10943 0\n      %20235 = OpCompositeConstruct %v4uint %22206 %22206 %22206 %22206\n       %9368 = OpShiftRightLogical %v4uint %20235 %845\n      %18859 = OpBitwiseAnd %v4uint %9368 %635\n      %15543 = OpConvertUToF %v4float %18859\n      %16688 = OpFMul %v4float %15543 %2798\n      %23762 = OpCompositeExtract %uint %10943 1\n      %20813 = OpCompositeConstruct %v4uint %23762 %23762 %23762 %23762\n       %9369 = OpShiftRightLogical %v4uint %20813 %845\n      %18860 = OpBitwiseAnd %v4uint %9369 %635\n      %15544 = OpConvertUToF %v4float %18860\n      %16689 = OpFMul %v4float %15544 %2798\n      %23763 = OpCompositeExtract %uint %10943 2\n      %20814 = OpCompositeConstruct %v4uint %23763 %23763 %23763 %23763\n       %9370 = OpShiftRightLogical %v4uint %20814 %845\n      %18861 = OpBitwiseAnd %v4uint %9370 %635\n      %15545 = OpConvertUToF %v4float %18861\n      %16690 = OpFMul %v4float %15545 %2798\n      %23764 = OpCompositeExtract %uint %10943 3\n      %20815 = OpCompositeConstruct %v4uint %23764 %23764 %23764 %23764\n       %9371 = OpShiftRightLogical %v4uint %20815 %845\n      %18862 = OpBitwiseAnd %v4uint %9371 %635\n      %18735 = OpConvertUToF %v4float %18862\n       %9887 = OpFMul %v4float %18735 %2798\n               OpBranch %16224\n      %14585 = OpLabel\n      %22207 = OpCompositeExtract %uint %10943 0\n      %20236 = OpCompositeConstruct %v4uint %22207 %22207 %22207 %22207\n       %9372 = OpShiftRightLogical %v4uint %20236 %653\n      %19030 = OpBitwiseAnd %v4uint %9372 %1611\n      %13986 = OpConvertUToF %v4float %19030\n      %19235 = OpVectorTimesScalar %v4float %13986 %float_0_00392156886\n       %8607 = OpCompositeExtract %uint %10943 1\n      %24843 = OpCompositeConstruct %v4uint %8607 %8607 %8607 %8607\n       %9373 = OpShiftRightLogical %v4uint %24843 %653\n      %19031 = OpBitwiseAnd %v4uint %9373 %1611\n      %13987 = OpConvertUToF %v4float %19031\n      %19236 = OpVectorTimesScalar %v4float %13987 %float_0_00392156886\n       %8608 = OpCompositeExtract %uint %10943 2\n      %24844 = OpCompositeConstruct %v4uint %8608 %8608 %8608 %8608\n       %9374 = OpShiftRightLogical %v4uint %24844 %653\n      %19032 = OpBitwiseAnd %v4uint %9374 %1611\n      %13988 = OpConvertUToF %v4float %19032\n      %19237 = OpVectorTimesScalar %v4float %13988 %float_0_00392156886\n       %8609 = OpCompositeExtract %uint %10943 3\n      %24845 = OpCompositeConstruct %v4uint %8609 %8609 %8609 %8609\n       %9375 = OpShiftRightLogical %v4uint %24845 %653\n      %19033 = OpBitwiseAnd %v4uint %9375 %1611\n      %17178 = OpConvertUToF %v4float %19033\n      %12434 = OpVectorTimesScalar %v4float %17178 %float_0_00392156886\n               OpBranch %16224\n      %19451 = OpLabel\n      %12428 = OpCompositeExtract %uint %10943 0\n      %20462 = OpBitcast %float %12428\n      %17206 = OpCompositeConstruct %v2float %20462 %float_0\n      %11664 = OpVectorShuffle %v4float %17206 %17206 0 1 1 1\n      %22193 = OpCompositeExtract %uint %10943 1\n      %16232 = OpBitcast %float %22193\n      %17207 = OpCompositeConstruct %v2float %16232 %float_0\n      %11665 = OpVectorShuffle %v4float %17207 %17207 0 1 1 1\n      %22194 = OpCompositeExtract %uint %10943 2\n      %16233 = OpBitcast %float %22194\n      %17208 = OpCompositeConstruct %v2float %16233 %float_0\n      %11666 = OpVectorShuffle %v4float %17208 %17208 0 1 1 1\n      %22195 = OpCompositeExtract %uint %10943 3\n      %16234 = OpBitcast %float %22195\n      %20398 = OpCompositeConstruct %v2float %16234 %float_0\n      %23098 = OpVectorShuffle %v4float %20398 %20398 0 1 1 1\n               OpBranch %16224\n      %16224 = OpLabel\n      %11175 = OpPhi %v4float %23098 %19451 %12434 %14585 %9887 %7355 %9035 %7354 %9034 %8190 %9033 %8243\n      %14344 = OpPhi %v4float %11666 %19451 %19237 %14585 %16690 %7355 %15836 %7354 %16672 %8190 %14606 %8243\n      %15229 = OpPhi %v4float %11665 %19451 %19236 %14585 %16689 %7355 %15835 %7354 %16671 %8190 %14605 %8243\n      %14518 = OpPhi %v4float %11664 %19451 %19235 %14585 %16688 %7355 %15834 %7354 %16670 %8190 %14604 %8243\n               OpBranch %21263\n      %15205 = OpLabel\n      %21584 = OpIEqual %bool %6555 %uint_8\n               OpSelectionMerge %20259 DontFlatten\n               OpBranchConditional %21584 %6592 %8960\n       %8960 = OpLabel\n      %22065 = OpShiftRightLogical %uint %23531 %int_2\n      %13371 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22065\n      %12610 = OpLoad %uint %13371\n      %11690 = OpIAdd %uint %22065 %uint_1\n       %6401 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11690\n       %7030 = OpLoad %uint %6401\n       %8518 = OpIAdd %uint %23531 %6555\n      %21671 = OpShiftRightLogical %uint %8518 %int_2\n      %19601 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21671\n      %12611 = OpLoad %uint %19601\n      %11691 = OpIAdd %uint %21671 %uint_1\n      %24559 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11691\n      %14156 = OpLoad %uint %24559\n      %19670 = OpCompositeConstruct %v4uint %12610 %7030 %12611 %14156\n      %19499 = OpIMul %uint %uint_2 %6555\n      %10821 = OpIAdd %uint %23531 %19499\n      %17892 = OpShiftRightLogical %uint %10821 %int_2\n      %19602 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17892\n      %12612 = OpLoad %uint %19602\n      %11692 = OpIAdd %uint %17892 %uint_1\n       %6475 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11692\n      %24155 = OpLoad %uint %6475\n       %8687 = OpIMul %uint %uint_3 %6555\n      %24256 = OpIAdd %uint %23531 %8687\n      %17893 = OpShiftRightLogical %uint %24256 %int_2\n      %19603 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17893\n      %12613 = OpLoad %uint %19603\n      %11693 = OpIAdd %uint %17893 %uint_1\n      %24560 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11693\n      %16380 = OpLoad %uint %24560\n      %20782 = OpCompositeConstruct %v4uint %12612 %24155 %12613 %16380\n               OpBranch %20259\n       %6592 = OpLabel\n      %24487 = OpShiftRightLogical %uint %23531 %int_2\n      %13372 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24487\n      %12614 = OpLoad %uint %13372\n      %11694 = OpIAdd %uint %24487 %uint_1\n       %6402 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11694\n      %23652 = OpLoad %uint %6402\n      %11695 = OpIAdd %uint %24487 %uint_2\n       %6403 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11695\n      %23653 = OpLoad %uint %6403\n      %11696 = OpIAdd %uint %24487 %uint_3\n      %24561 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11696\n      %14080 = OpLoad %uint %24561\n      %21616 = OpCompositeConstruct %v4uint %12614 %23652 %23653 %14080\n      %19331 = OpIAdd %uint %23531 %uint_16\n       %8237 = OpShiftRightLogical %uint %19331 %int_2\n      %19604 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %8237\n      %12615 = OpLoad %uint %19604\n      %11697 = OpIAdd %uint %8237 %uint_1\n       %6404 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11697\n      %23654 = OpLoad %uint %6404\n      %11698 = OpIAdd %uint %8237 %uint_2\n       %6405 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11698\n      %23655 = OpLoad %uint %6405\n      %11699 = OpIAdd %uint %8237 %uint_3\n      %24562 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11699\n      %16381 = OpLoad %uint %24562\n      %20783 = OpCompositeConstruct %v4uint %12615 %23654 %23655 %16381\n               OpBranch %20259\n      %20259 = OpLabel\n      %11213 = OpPhi %v4uint %20783 %6592 %20782 %8960\n      %14112 = OpPhi %v4uint %21616 %6592 %19670 %8960\n               OpSelectionMerge %20260 None\n               OpSwitch %8576 %20310 5 %8536 7 %8244\n       %8244 = OpLabel\n      %24407 = OpCompositeExtract %uint %14112 0\n      %24680 = OpExtInst %v2float %1 UnpackHalf2x16 %24407\n      %10101 = OpCompositeExtract %float %24680 0\n      %16056 = OpCompositeExtract %float %24680 1\n      %17025 = OpCompositeExtract %uint %14112 1\n      %15605 = OpExtInst %v2float %1 UnpackHalf2x16 %17025\n      %10086 = OpCompositeExtract %float %15605 0\n      %17481 = OpCompositeExtract %float %15605 1\n      %14607 = OpCompositeConstruct %v4float %10101 %16056 %10086 %17481\n      %17277 = OpCompositeExtract %uint %14112 2\n      %18030 = OpExtInst %v2float %1 UnpackHalf2x16 %17277\n      %10102 = OpCompositeExtract %float %18030 0\n      %16057 = OpCompositeExtract %float %18030 1\n      %17026 = OpCompositeExtract %uint %14112 3\n      %15606 = OpExtInst %v2float %1 UnpackHalf2x16 %17026\n      %10087 = OpCompositeExtract %float %15606 0\n      %17482 = OpCompositeExtract %float %15606 1\n      %14608 = OpCompositeConstruct %v4float %10102 %16057 %10087 %17482\n      %17278 = OpCompositeExtract %uint %11213 0\n      %18031 = OpExtInst %v2float %1 UnpackHalf2x16 %17278\n      %10103 = OpCompositeExtract %float %18031 0\n      %16058 = OpCompositeExtract %float %18031 1\n      %17027 = OpCompositeExtract %uint %11213 1\n      %15607 = OpExtInst %v2float %1 UnpackHalf2x16 %17027\n      %10088 = OpCompositeExtract %float %15607 0\n      %17483 = OpCompositeExtract %float %15607 1\n      %14609 = OpCompositeConstruct %v4float %10103 %16058 %10088 %17483\n      %17279 = OpCompositeExtract %uint %11213 2\n      %18032 = OpExtInst %v2float %1 UnpackHalf2x16 %17279\n      %10104 = OpCompositeExtract %float %18032 0\n      %16059 = OpCompositeExtract %float %18032 1\n      %17028 = OpCompositeExtract %uint %11213 3\n      %15608 = OpExtInst %v2float %1 UnpackHalf2x16 %17028\n      %10089 = OpCompositeExtract %float %15608 0\n      %20671 = OpCompositeExtract %float %15608 1\n       %9036 = OpCompositeConstruct %v4float %10104 %16059 %10089 %20671\n               OpBranch %20260\n       %8536 = OpLabel\n       %9723 = OpVectorShuffle %v2uint %14112 %14112 0 1\n      %23356 = OpBitcast %v2int %9723\n      %24782 = OpVectorShuffle %v4int %23356 %23356 0 0 1 1\n      %18598 = OpShiftLeftLogical %v4int %24782 %290\n      %15757 = OpShiftRightArithmetic %v4int %18598 %770\n      %10907 = OpConvertSToF %v4float %15757\n      %18209 = OpVectorTimesScalar %v4float %10907 %float_0_000976592302\n      %25233 = OpExtInst %v4float %1 FMax %1284 %18209\n      %14187 = OpVectorShuffle %v2uint %14112 %14112 2 3\n       %9407 = OpBitcast %v2int %14187\n      %24783 = OpVectorShuffle %v4int %9407 %9407 0 0 1 1\n      %18599 = OpShiftLeftLogical %v4int %24783 %290\n      %15758 = OpShiftRightArithmetic %v4int %18599 %770\n      %10908 = OpConvertSToF %v4float %15758\n      %18210 = OpVectorTimesScalar %v4float %10908 %float_0_000976592302\n      %25234 = OpExtInst %v4float %1 FMax %1284 %18210\n      %14188 = OpVectorShuffle %v2uint %11213 %11213 0 1\n       %9408 = OpBitcast %v2int %14188\n      %24784 = OpVectorShuffle %v4int %9408 %9408 0 0 1 1\n      %18600 = OpShiftLeftLogical %v4int %24784 %290\n      %15759 = OpShiftRightArithmetic %v4int %18600 %770\n      %10913 = OpConvertSToF %v4float %15759\n      %18211 = OpVectorTimesScalar %v4float %10913 %float_0_000976592302\n      %25235 = OpExtInst %v4float %1 FMax %1284 %18211\n      %14189 = OpVectorShuffle %v2uint %11213 %11213 2 3\n       %9409 = OpBitcast %v2int %14189\n      %24785 = OpVectorShuffle %v4int %9409 %9409 0 0 1 1\n      %18601 = OpShiftLeftLogical %v4int %24785 %290\n      %15760 = OpShiftRightArithmetic %v4int %18601 %770\n      %10914 = OpConvertSToF %v4float %15760\n      %21439 = OpVectorTimesScalar %v4float %10914 %float_0_000976592302\n      %17250 = OpExtInst %v4float %1 FMax %1284 %21439\n               OpBranch %20260\n      %20310 = OpLabel\n       %9761 = OpVectorShuffle %v2uint %14112 %14112 0 1\n      %20825 = OpBitcast %v2float %9761\n       %7035 = OpCompositeExtract %float %20825 0\n      %13418 = OpCompositeExtract %float %20825 1\n      %17016 = OpCompositeConstruct %v4float %7035 %13418 %float_0 %float_0\n      %16856 = OpVectorShuffle %v2uint %14112 %14112 2 3\n      %14173 = OpBitcast %v2float %16856\n       %7036 = OpCompositeExtract %float %14173 0\n      %13419 = OpCompositeExtract %float %14173 1\n      %17017 = OpCompositeConstruct %v4float %7036 %13419 %float_0 %float_0\n      %16857 = OpVectorShuffle %v2uint %11213 %11213 0 1\n      %14174 = OpBitcast %v2float %16857\n       %7037 = OpCompositeExtract %float %14174 0\n      %13420 = OpCompositeExtract %float %14174 1\n      %17018 = OpCompositeConstruct %v4float %7037 %13420 %float_0 %float_0\n      %16858 = OpVectorShuffle %v2uint %11213 %11213 2 3\n      %14175 = OpBitcast %v2float %16858\n       %7038 = OpCompositeExtract %float %14175 0\n      %16648 = OpCompositeExtract %float %14175 1\n       %9037 = OpCompositeConstruct %v4float %7038 %16648 %float_0 %float_0\n               OpBranch %20260\n      %20260 = OpLabel\n      %11176 = OpPhi %v4float %9037 %20310 %17250 %8536 %9036 %8244\n      %14345 = OpPhi %v4float %17018 %20310 %25235 %8536 %14609 %8244\n      %15230 = OpPhi %v4float %17017 %20310 %25234 %8536 %14608 %8244\n      %14519 = OpPhi %v4float %17016 %20310 %25233 %8536 %14607 %8244\n               OpBranch %21263\n      %21263 = OpLabel\n      %11177 = OpPhi %v4float %11176 %20260 %11175 %16224\n      %14346 = OpPhi %v4float %14345 %20260 %14344 %16224\n      %13804 = OpPhi %v4float %15230 %20260 %15229 %16224\n       %8403 = OpPhi %v4float %14519 %20260 %14518 %16224\n      %11861 = OpUGreaterThanEqual %bool %16205 %uint_4\n               OpSelectionMerge %21267 DontFlatten\n               OpBranchConditional %11861 %20709 %21267\n      %20709 = OpLabel\n      %25083 = OpFMul %float %11052 %float_0_5\n      %24184 = OpIAdd %uint %23531 %uint_320\n               OpSelectionMerge %21264 DontFlatten\n               OpBranchConditional %23279 %15206 %16570\n      %16570 = OpLabel\n      %19163 = OpIEqual %bool %6555 %uint_4\n               OpSelectionMerge %20298 DontFlatten\n               OpBranchConditional %19163 %6593 %8961\n       %8961 = OpLabel\n      %22066 = OpShiftRightLogical %uint %24184 %int_2\n      %13373 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22066\n      %15061 = OpLoad %uint %13373\n       %8519 = OpIAdd %uint %24184 %6555\n      %21672 = OpShiftRightLogical %uint %8519 %int_2\n      %19679 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21672\n      %13116 = OpLoad %uint %19679\n       %8688 = OpIMul %uint %uint_2 %6555\n      %24257 = OpIAdd %uint %24184 %8688\n      %17894 = OpShiftRightLogical %uint %24257 %int_2\n      %19680 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17894\n      %13117 = OpLoad %uint %19680\n       %8689 = OpIMul %uint %uint_3 %6555\n      %24258 = OpIAdd %uint %24184 %8689\n      %17895 = OpShiftRightLogical %uint %24258 %int_2\n      %18690 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17895\n      %24410 = OpLoad %uint %18690\n      %20784 = OpCompositeConstruct %v4uint %15061 %13116 %13117 %24410\n               OpBranch %20298\n       %6593 = OpLabel\n      %24488 = OpShiftRightLogical %uint %24184 %int_2\n      %13374 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24488\n      %12616 = OpLoad %uint %13374\n      %11700 = OpIAdd %uint %24488 %uint_1\n       %6406 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11700\n      %23656 = OpLoad %uint %6406\n      %11701 = OpIAdd %uint %24488 %uint_2\n       %6407 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11701\n      %23657 = OpLoad %uint %6407\n      %11702 = OpIAdd %uint %24488 %uint_3\n      %24563 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11702\n      %16382 = OpLoad %uint %24563\n      %20785 = OpCompositeConstruct %v4uint %12616 %23656 %23657 %16382\n               OpBranch %20298\n      %20298 = OpLabel\n      %10944 = OpPhi %v4uint %20785 %6593 %20784 %8961\n               OpSelectionMerge %16225 None\n               OpSwitch %8576 %19452 0 %14586 1 %14586 2 %7357 10 %7357 3 %7356 12 %7356 4 %8191 6 %8245\n       %8245 = OpLabel\n      %24408 = OpCompositeExtract %uint %10944 0\n      %24681 = OpExtInst %v2float %1 UnpackHalf2x16 %24408\n      %10090 = OpCompositeExtract %float %24681 0\n      %17484 = OpCompositeExtract %float %24681 1\n      %14610 = OpCompositeConstruct %v4float %10090 %17484 %float_0 %float_0\n      %17280 = OpCompositeExtract %uint %10944 1\n      %18033 = OpExtInst %v2float %1 UnpackHalf2x16 %17280\n      %10091 = OpCompositeExtract %float %18033 0\n      %17485 = OpCompositeExtract %float %18033 1\n      %14611 = OpCompositeConstruct %v4float %10091 %17485 %float_0 %float_0\n      %17281 = OpCompositeExtract %uint %10944 2\n      %18034 = OpExtInst %v2float %1 UnpackHalf2x16 %17281\n      %10092 = OpCompositeExtract %float %18034 0\n      %17486 = OpCompositeExtract %float %18034 1\n      %14612 = OpCompositeConstruct %v4float %10092 %17486 %float_0 %float_0\n      %17282 = OpCompositeExtract %uint %10944 3\n      %18035 = OpExtInst %v2float %1 UnpackHalf2x16 %17282\n      %10093 = OpCompositeExtract %float %18035 0\n      %20672 = OpCompositeExtract %float %18035 1\n       %9038 = OpCompositeConstruct %v4float %10093 %20672 %float_0 %float_0\n               OpBranch %16225\n       %8191 = OpLabel\n      %12429 = OpCompositeExtract %uint %10944 0\n      %22686 = OpBitcast %int %12429\n      %18206 = OpCompositeConstruct %v2int %22686 %22686\n      %18353 = OpShiftLeftLogical %v2int %18206 %1959\n      %13339 = OpShiftRightArithmetic %v2int %18353 %2151\n      %10915 = OpConvertSToF %v2float %13339\n      %18251 = OpVectorTimesScalar %v2float %10915 %float_0_000976592302\n      %24074 = OpExtInst %v2float %1 FMax %73 %18251\n      %24334 = OpCompositeExtract %float %24074 0\n      %15575 = OpCompositeExtract %float %24074 1\n      %16673 = OpCompositeConstruct %v4float %24334 %15575 %float_0 %float_0\n      %19525 = OpCompositeExtract %uint %10944 1\n      %16036 = OpBitcast %int %19525\n      %18207 = OpCompositeConstruct %v2int %16036 %16036\n      %18354 = OpShiftLeftLogical %v2int %18207 %1959\n      %13340 = OpShiftRightArithmetic %v2int %18354 %2151\n      %10916 = OpConvertSToF %v2float %13340\n      %18252 = OpVectorTimesScalar %v2float %10916 %float_0_000976592302\n      %24075 = OpExtInst %v2float %1 FMax %73 %18252\n      %24335 = OpCompositeExtract %float %24075 0\n      %15576 = OpCompositeExtract %float %24075 1\n      %16674 = OpCompositeConstruct %v4float %24335 %15576 %float_0 %float_0\n      %19526 = OpCompositeExtract %uint %10944 2\n      %16037 = OpBitcast %int %19526\n      %18208 = OpCompositeConstruct %v2int %16037 %16037\n      %18355 = OpShiftLeftLogical %v2int %18208 %1959\n      %13341 = OpShiftRightArithmetic %v2int %18355 %2151\n      %10917 = OpConvertSToF %v2float %13341\n      %18253 = OpVectorTimesScalar %v2float %10917 %float_0_000976592302\n      %24076 = OpExtInst %v2float %1 FMax %73 %18253\n      %24336 = OpCompositeExtract %float %24076 0\n      %15577 = OpCompositeExtract %float %24076 1\n      %16675 = OpCompositeConstruct %v4float %24336 %15577 %float_0 %float_0\n      %19527 = OpCompositeExtract %uint %10944 3\n      %16038 = OpBitcast %int %19527\n      %18212 = OpCompositeConstruct %v2int %16038 %16038\n      %18356 = OpShiftLeftLogical %v2int %18212 %1959\n      %13342 = OpShiftRightArithmetic %v2int %18356 %2151\n      %10918 = OpConvertSToF %v2float %13342\n      %18254 = OpVectorTimesScalar %v2float %10918 %float_0_000976592302\n      %24077 = OpExtInst %v2float %1 FMax %73 %18254\n      %24337 = OpCompositeExtract %float %24077 0\n      %18765 = OpCompositeExtract %float %24077 1\n       %9039 = OpCompositeConstruct %v4float %24337 %18765 %float_0 %float_0\n               OpBranch %16225\n       %7356 = OpLabel\n      %22208 = OpCompositeExtract %uint %10944 0\n      %20237 = OpCompositeConstruct %v3uint %22208 %22208 %22208\n      %11026 = OpShiftRightLogical %v3uint %20237 %2996\n      %24042 = OpBitwiseAnd %v3uint %11026 %261\n      %18592 = OpBitwiseAnd %v3uint %11026 %1126\n      %23444 = OpShiftRightLogical %v3uint %24042 %2828\n      %16589 = OpIEqual %v3bool %23444 %2578\n      %11343 = OpExtInst %v3int %1 FindUMsb %18592\n      %10777 = OpBitcast %v3uint %11343\n       %6270 = OpISub %v3uint %2828 %10777\n       %8724 = OpIAdd %v3uint %10777 %2360\n      %10355 = OpSelect %v3uint %16589 %8724 %23444\n      %23256 = OpShiftLeftLogical %v3uint %18592 %6270\n      %18846 = OpBitwiseAnd %v3uint %23256 %1126\n      %10919 = OpSelect %v3uint %16589 %18846 %18592\n      %24573 = OpIAdd %v3uint %10355 %1018\n      %20355 = OpShiftLeftLogical %v3uint %24573 %393\n      %16298 = OpShiftLeftLogical %v3uint %10919 %141\n      %22400 = OpBitwiseOr %v3uint %20355 %16298\n      %13828 = OpIEqual %v3bool %24042 %2578\n      %16966 = OpSelect %v3uint %13828 %2578 %22400\n      %10707 = OpBitcast %v3float %16966\n      %19368 = OpShiftRightLogical %uint %22208 %uint_30\n      %18450 = OpConvertUToF %float %19368\n      %15907 = OpFMul %float %18450 %float_0_333333343\n      %21446 = OpCompositeExtract %float %10707 0\n      %10841 = OpCompositeExtract %float %10707 1\n       %7836 = OpCompositeExtract %float %10707 2\n      %15837 = OpCompositeConstruct %v4float %21446 %10841 %7836 %15907\n      %10232 = OpCompositeExtract %uint %10944 1\n      %13585 = OpCompositeConstruct %v3uint %10232 %10232 %10232\n      %11027 = OpShiftRightLogical %v3uint %13585 %2996\n      %24043 = OpBitwiseAnd %v3uint %11027 %261\n      %18593 = OpBitwiseAnd %v3uint %11027 %1126\n      %23445 = OpShiftRightLogical %v3uint %24043 %2828\n      %16590 = OpIEqual %v3bool %23445 %2578\n      %11344 = OpExtInst %v3int %1 FindUMsb %18593\n      %10778 = OpBitcast %v3uint %11344\n       %6271 = OpISub %v3uint %2828 %10778\n       %8725 = OpIAdd %v3uint %10778 %2360\n      %10356 = OpSelect %v3uint %16590 %8725 %23445\n      %23257 = OpShiftLeftLogical %v3uint %18593 %6271\n      %18847 = OpBitwiseAnd %v3uint %23257 %1126\n      %10920 = OpSelect %v3uint %16590 %18847 %18593\n      %24574 = OpIAdd %v3uint %10356 %1018\n      %20356 = OpShiftLeftLogical %v3uint %24574 %393\n      %16299 = OpShiftLeftLogical %v3uint %10920 %141\n      %22401 = OpBitwiseOr %v3uint %20356 %16299\n      %13829 = OpIEqual %v3bool %24043 %2578\n      %16967 = OpSelect %v3uint %13829 %2578 %22401\n      %10708 = OpBitcast %v3float %16967\n      %19369 = OpShiftRightLogical %uint %10232 %uint_30\n      %18451 = OpConvertUToF %float %19369\n      %15908 = OpFMul %float %18451 %float_0_333333343\n      %21447 = OpCompositeExtract %float %10708 0\n      %10842 = OpCompositeExtract %float %10708 1\n       %7837 = OpCompositeExtract %float %10708 2\n      %15838 = OpCompositeConstruct %v4float %21447 %10842 %7837 %15908\n      %10233 = OpCompositeExtract %uint %10944 2\n      %13586 = OpCompositeConstruct %v3uint %10233 %10233 %10233\n      %11028 = OpShiftRightLogical %v3uint %13586 %2996\n      %24044 = OpBitwiseAnd %v3uint %11028 %261\n      %18594 = OpBitwiseAnd %v3uint %11028 %1126\n      %23446 = OpShiftRightLogical %v3uint %24044 %2828\n      %16591 = OpIEqual %v3bool %23446 %2578\n      %11345 = OpExtInst %v3int %1 FindUMsb %18594\n      %10779 = OpBitcast %v3uint %11345\n       %6272 = OpISub %v3uint %2828 %10779\n       %8726 = OpIAdd %v3uint %10779 %2360\n      %10357 = OpSelect %v3uint %16591 %8726 %23446\n      %23258 = OpShiftLeftLogical %v3uint %18594 %6272\n      %18848 = OpBitwiseAnd %v3uint %23258 %1126\n      %10921 = OpSelect %v3uint %16591 %18848 %18594\n      %24575 = OpIAdd %v3uint %10357 %1018\n      %20357 = OpShiftLeftLogical %v3uint %24575 %393\n      %16300 = OpShiftLeftLogical %v3uint %10921 %141\n      %22402 = OpBitwiseOr %v3uint %20357 %16300\n      %13830 = OpIEqual %v3bool %24044 %2578\n      %16968 = OpSelect %v3uint %13830 %2578 %22402\n      %10709 = OpBitcast %v3float %16968\n      %19370 = OpShiftRightLogical %uint %10233 %uint_30\n      %18452 = OpConvertUToF %float %19370\n      %15909 = OpFMul %float %18452 %float_0_333333343\n      %21448 = OpCompositeExtract %float %10709 0\n      %10843 = OpCompositeExtract %float %10709 1\n       %7838 = OpCompositeExtract %float %10709 2\n      %15839 = OpCompositeConstruct %v4float %21448 %10843 %7838 %15909\n      %10234 = OpCompositeExtract %uint %10944 3\n      %13587 = OpCompositeConstruct %v3uint %10234 %10234 %10234\n      %11029 = OpShiftRightLogical %v3uint %13587 %2996\n      %24045 = OpBitwiseAnd %v3uint %11029 %261\n      %18595 = OpBitwiseAnd %v3uint %11029 %1126\n      %23447 = OpShiftRightLogical %v3uint %24045 %2828\n      %16592 = OpIEqual %v3bool %23447 %2578\n      %11346 = OpExtInst %v3int %1 FindUMsb %18595\n      %10780 = OpBitcast %v3uint %11346\n       %6273 = OpISub %v3uint %2828 %10780\n       %8727 = OpIAdd %v3uint %10780 %2360\n      %10358 = OpSelect %v3uint %16592 %8727 %23447\n      %23259 = OpShiftLeftLogical %v3uint %18595 %6273\n      %18849 = OpBitwiseAnd %v3uint %23259 %1126\n      %10922 = OpSelect %v3uint %16592 %18849 %18595\n      %24576 = OpIAdd %v3uint %10358 %1018\n      %20358 = OpShiftLeftLogical %v3uint %24576 %393\n      %16301 = OpShiftLeftLogical %v3uint %10922 %141\n      %22403 = OpBitwiseOr %v3uint %20358 %16301\n      %13831 = OpIEqual %v3bool %24045 %2578\n      %16969 = OpSelect %v3uint %13831 %2578 %22403\n      %10710 = OpBitcast %v3float %16969\n      %19371 = OpShiftRightLogical %uint %10234 %uint_30\n      %18453 = OpConvertUToF %float %19371\n      %15910 = OpFMul %float %18453 %float_0_333333343\n      %21449 = OpCompositeExtract %float %10710 0\n      %10844 = OpCompositeExtract %float %10710 1\n      %11030 = OpCompositeExtract %float %10710 2\n       %9040 = OpCompositeConstruct %v4float %21449 %10844 %11030 %15910\n               OpBranch %16225\n       %7357 = OpLabel\n      %22209 = OpCompositeExtract %uint %10944 0\n      %20238 = OpCompositeConstruct %v4uint %22209 %22209 %22209 %22209\n       %9376 = OpShiftRightLogical %v4uint %20238 %845\n      %18863 = OpBitwiseAnd %v4uint %9376 %635\n      %15546 = OpConvertUToF %v4float %18863\n      %16691 = OpFMul %v4float %15546 %2798\n      %23765 = OpCompositeExtract %uint %10944 1\n      %20816 = OpCompositeConstruct %v4uint %23765 %23765 %23765 %23765\n       %9377 = OpShiftRightLogical %v4uint %20816 %845\n      %18864 = OpBitwiseAnd %v4uint %9377 %635\n      %15547 = OpConvertUToF %v4float %18864\n      %16692 = OpFMul %v4float %15547 %2798\n      %23766 = OpCompositeExtract %uint %10944 2\n      %20817 = OpCompositeConstruct %v4uint %23766 %23766 %23766 %23766\n       %9378 = OpShiftRightLogical %v4uint %20817 %845\n      %18865 = OpBitwiseAnd %v4uint %9378 %635\n      %15548 = OpConvertUToF %v4float %18865\n      %16693 = OpFMul %v4float %15548 %2798\n      %23767 = OpCompositeExtract %uint %10944 3\n      %20818 = OpCompositeConstruct %v4uint %23767 %23767 %23767 %23767\n       %9379 = OpShiftRightLogical %v4uint %20818 %845\n      %18866 = OpBitwiseAnd %v4uint %9379 %635\n      %18736 = OpConvertUToF %v4float %18866\n       %9888 = OpFMul %v4float %18736 %2798\n               OpBranch %16225\n      %14586 = OpLabel\n      %22210 = OpCompositeExtract %uint %10944 0\n      %20239 = OpCompositeConstruct %v4uint %22210 %22210 %22210 %22210\n       %9380 = OpShiftRightLogical %v4uint %20239 %653\n      %19034 = OpBitwiseAnd %v4uint %9380 %1611\n      %13989 = OpConvertUToF %v4float %19034\n      %19238 = OpVectorTimesScalar %v4float %13989 %float_0_00392156886\n       %8610 = OpCompositeExtract %uint %10944 1\n      %24846 = OpCompositeConstruct %v4uint %8610 %8610 %8610 %8610\n       %9381 = OpShiftRightLogical %v4uint %24846 %653\n      %19035 = OpBitwiseAnd %v4uint %9381 %1611\n      %13990 = OpConvertUToF %v4float %19035\n      %19239 = OpVectorTimesScalar %v4float %13990 %float_0_00392156886\n       %8611 = OpCompositeExtract %uint %10944 2\n      %24847 = OpCompositeConstruct %v4uint %8611 %8611 %8611 %8611\n       %9382 = OpShiftRightLogical %v4uint %24847 %653\n      %19036 = OpBitwiseAnd %v4uint %9382 %1611\n      %13991 = OpConvertUToF %v4float %19036\n      %19240 = OpVectorTimesScalar %v4float %13991 %float_0_00392156886\n       %8612 = OpCompositeExtract %uint %10944 3\n      %24848 = OpCompositeConstruct %v4uint %8612 %8612 %8612 %8612\n       %9383 = OpShiftRightLogical %v4uint %24848 %653\n      %19037 = OpBitwiseAnd %v4uint %9383 %1611\n      %17179 = OpConvertUToF %v4float %19037\n      %12435 = OpVectorTimesScalar %v4float %17179 %float_0_00392156886\n               OpBranch %16225\n      %19452 = OpLabel\n      %12430 = OpCompositeExtract %uint %10944 0\n      %20463 = OpBitcast %float %12430\n      %17209 = OpCompositeConstruct %v2float %20463 %float_0\n      %11667 = OpVectorShuffle %v4float %17209 %17209 0 1 1 1\n      %22196 = OpCompositeExtract %uint %10944 1\n      %16235 = OpBitcast %float %22196\n      %17210 = OpCompositeConstruct %v2float %16235 %float_0\n      %11668 = OpVectorShuffle %v4float %17210 %17210 0 1 1 1\n      %22197 = OpCompositeExtract %uint %10944 2\n      %16236 = OpBitcast %float %22197\n      %17211 = OpCompositeConstruct %v2float %16236 %float_0\n      %11669 = OpVectorShuffle %v4float %17211 %17211 0 1 1 1\n      %22198 = OpCompositeExtract %uint %10944 3\n      %16237 = OpBitcast %float %22198\n      %20399 = OpCompositeConstruct %v2float %16237 %float_0\n      %23099 = OpVectorShuffle %v4float %20399 %20399 0 1 1 1\n               OpBranch %16225\n      %16225 = OpLabel\n      %11178 = OpPhi %v4float %23099 %19452 %12435 %14586 %9888 %7357 %9040 %7356 %9039 %8191 %9038 %8245\n      %14347 = OpPhi %v4float %11669 %19452 %19240 %14586 %16693 %7357 %15839 %7356 %16675 %8191 %14612 %8245\n      %15231 = OpPhi %v4float %11668 %19452 %19239 %14586 %16692 %7357 %15838 %7356 %16674 %8191 %14611 %8245\n      %14520 = OpPhi %v4float %11667 %19452 %19238 %14586 %16691 %7357 %15837 %7356 %16673 %8191 %14610 %8245\n               OpBranch %21264\n      %15206 = OpLabel\n      %21585 = OpIEqual %bool %6555 %uint_8\n               OpSelectionMerge %20261 DontFlatten\n               OpBranchConditional %21585 %6594 %8962\n       %8962 = OpLabel\n      %22067 = OpShiftRightLogical %uint %24184 %int_2\n      %13375 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22067\n      %12617 = OpLoad %uint %13375\n      %11703 = OpIAdd %uint %22067 %uint_1\n       %6408 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11703\n       %7031 = OpLoad %uint %6408\n       %8520 = OpIAdd %uint %24184 %6555\n      %21673 = OpShiftRightLogical %uint %8520 %int_2\n      %19605 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21673\n      %12618 = OpLoad %uint %19605\n      %11704 = OpIAdd %uint %21673 %uint_1\n      %24564 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11704\n      %14157 = OpLoad %uint %24564\n      %19671 = OpCompositeConstruct %v4uint %12617 %7031 %12618 %14157\n      %19500 = OpIMul %uint %uint_2 %6555\n      %10822 = OpIAdd %uint %24184 %19500\n      %17896 = OpShiftRightLogical %uint %10822 %int_2\n      %19606 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17896\n      %12619 = OpLoad %uint %19606\n      %11705 = OpIAdd %uint %17896 %uint_1\n       %6476 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11705\n      %24156 = OpLoad %uint %6476\n       %8690 = OpIMul %uint %uint_3 %6555\n      %24259 = OpIAdd %uint %24184 %8690\n      %17897 = OpShiftRightLogical %uint %24259 %int_2\n      %19607 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17897\n      %12620 = OpLoad %uint %19607\n      %11706 = OpIAdd %uint %17897 %uint_1\n      %24565 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11706\n      %16383 = OpLoad %uint %24565\n      %20786 = OpCompositeConstruct %v4uint %12619 %24156 %12620 %16383\n               OpBranch %20261\n       %6594 = OpLabel\n      %24489 = OpShiftRightLogical %uint %24184 %int_2\n      %13376 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24489\n      %12621 = OpLoad %uint %13376\n      %11707 = OpIAdd %uint %24489 %uint_1\n       %6409 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11707\n      %23658 = OpLoad %uint %6409\n      %11708 = OpIAdd %uint %24489 %uint_2\n       %6410 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11708\n      %23659 = OpLoad %uint %6410\n      %11709 = OpIAdd %uint %24489 %uint_3\n      %24566 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11709\n      %14081 = OpLoad %uint %24566\n      %21617 = OpCompositeConstruct %v4uint %12621 %23658 %23659 %14081\n      %19332 = OpIAdd %uint %23531 %uint_336\n       %8238 = OpShiftRightLogical %uint %19332 %int_2\n      %19608 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %8238\n      %12622 = OpLoad %uint %19608\n      %11710 = OpIAdd %uint %8238 %uint_1\n       %6411 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11710\n      %23660 = OpLoad %uint %6411\n      %11711 = OpIAdd %uint %8238 %uint_2\n       %6412 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11711\n      %23661 = OpLoad %uint %6412\n      %11712 = OpIAdd %uint %8238 %uint_3\n      %24567 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11712\n      %16384 = OpLoad %uint %24567\n      %20787 = OpCompositeConstruct %v4uint %12622 %23660 %23661 %16384\n               OpBranch %20261\n      %20261 = OpLabel\n      %11214 = OpPhi %v4uint %20787 %6594 %20786 %8962\n      %14113 = OpPhi %v4uint %21617 %6594 %19671 %8962\n               OpSelectionMerge %20262 None\n               OpSwitch %8576 %20311 5 %8537 7 %8246\n       %8246 = OpLabel\n      %24411 = OpCompositeExtract %uint %14113 0\n      %24682 = OpExtInst %v2float %1 UnpackHalf2x16 %24411\n      %10105 = OpCompositeExtract %float %24682 0\n      %16060 = OpCompositeExtract %float %24682 1\n      %17029 = OpCompositeExtract %uint %14113 1\n      %15609 = OpExtInst %v2float %1 UnpackHalf2x16 %17029\n      %10094 = OpCompositeExtract %float %15609 0\n      %17487 = OpCompositeExtract %float %15609 1\n      %14613 = OpCompositeConstruct %v4float %10105 %16060 %10094 %17487\n      %17283 = OpCompositeExtract %uint %14113 2\n      %18036 = OpExtInst %v2float %1 UnpackHalf2x16 %17283\n      %10106 = OpCompositeExtract %float %18036 0\n      %16061 = OpCompositeExtract %float %18036 1\n      %17030 = OpCompositeExtract %uint %14113 3\n      %15610 = OpExtInst %v2float %1 UnpackHalf2x16 %17030\n      %10095 = OpCompositeExtract %float %15610 0\n      %17488 = OpCompositeExtract %float %15610 1\n      %14614 = OpCompositeConstruct %v4float %10106 %16061 %10095 %17488\n      %17284 = OpCompositeExtract %uint %11214 0\n      %18037 = OpExtInst %v2float %1 UnpackHalf2x16 %17284\n      %10107 = OpCompositeExtract %float %18037 0\n      %16062 = OpCompositeExtract %float %18037 1\n      %17031 = OpCompositeExtract %uint %11214 1\n      %15611 = OpExtInst %v2float %1 UnpackHalf2x16 %17031\n      %10096 = OpCompositeExtract %float %15611 0\n      %17489 = OpCompositeExtract %float %15611 1\n      %14615 = OpCompositeConstruct %v4float %10107 %16062 %10096 %17489\n      %17285 = OpCompositeExtract %uint %11214 2\n      %18038 = OpExtInst %v2float %1 UnpackHalf2x16 %17285\n      %10108 = OpCompositeExtract %float %18038 0\n      %16063 = OpCompositeExtract %float %18038 1\n      %17032 = OpCompositeExtract %uint %11214 3\n      %15612 = OpExtInst %v2float %1 UnpackHalf2x16 %17032\n      %10097 = OpCompositeExtract %float %15612 0\n      %20673 = OpCompositeExtract %float %15612 1\n       %9041 = OpCompositeConstruct %v4float %10108 %16063 %10097 %20673\n               OpBranch %20262\n       %8537 = OpLabel\n       %9724 = OpVectorShuffle %v2uint %14113 %14113 0 1\n      %23357 = OpBitcast %v2int %9724\n      %24786 = OpVectorShuffle %v4int %23357 %23357 0 0 1 1\n      %18602 = OpShiftLeftLogical %v4int %24786 %290\n      %15761 = OpShiftRightArithmetic %v4int %18602 %770\n      %10923 = OpConvertSToF %v4float %15761\n      %18213 = OpVectorTimesScalar %v4float %10923 %float_0_000976592302\n      %25236 = OpExtInst %v4float %1 FMax %1284 %18213\n      %14190 = OpVectorShuffle %v2uint %14113 %14113 2 3\n       %9410 = OpBitcast %v2int %14190\n      %24787 = OpVectorShuffle %v4int %9410 %9410 0 0 1 1\n      %18603 = OpShiftLeftLogical %v4int %24787 %290\n      %15762 = OpShiftRightArithmetic %v4int %18603 %770\n      %10924 = OpConvertSToF %v4float %15762\n      %18214 = OpVectorTimesScalar %v4float %10924 %float_0_000976592302\n      %25237 = OpExtInst %v4float %1 FMax %1284 %18214\n      %14191 = OpVectorShuffle %v2uint %11214 %11214 0 1\n       %9411 = OpBitcast %v2int %14191\n      %24788 = OpVectorShuffle %v4int %9411 %9411 0 0 1 1\n      %18604 = OpShiftLeftLogical %v4int %24788 %290\n      %15763 = OpShiftRightArithmetic %v4int %18604 %770\n      %10925 = OpConvertSToF %v4float %15763\n      %18215 = OpVectorTimesScalar %v4float %10925 %float_0_000976592302\n      %25238 = OpExtInst %v4float %1 FMax %1284 %18215\n      %14192 = OpVectorShuffle %v2uint %11214 %11214 2 3\n       %9412 = OpBitcast %v2int %14192\n      %24789 = OpVectorShuffle %v4int %9412 %9412 0 0 1 1\n      %18605 = OpShiftLeftLogical %v4int %24789 %290\n      %15764 = OpShiftRightArithmetic %v4int %18605 %770\n      %10926 = OpConvertSToF %v4float %15764\n      %21440 = OpVectorTimesScalar %v4float %10926 %float_0_000976592302\n      %17251 = OpExtInst %v4float %1 FMax %1284 %21440\n               OpBranch %20262\n      %20311 = OpLabel\n       %9762 = OpVectorShuffle %v2uint %14113 %14113 0 1\n      %20826 = OpBitcast %v2float %9762\n       %7039 = OpCompositeExtract %float %20826 0\n      %13421 = OpCompositeExtract %float %20826 1\n      %17019 = OpCompositeConstruct %v4float %7039 %13421 %float_0 %float_0\n      %16859 = OpVectorShuffle %v2uint %14113 %14113 2 3\n      %14176 = OpBitcast %v2float %16859\n       %7040 = OpCompositeExtract %float %14176 0\n      %13422 = OpCompositeExtract %float %14176 1\n      %17020 = OpCompositeConstruct %v4float %7040 %13422 %float_0 %float_0\n      %16860 = OpVectorShuffle %v2uint %11214 %11214 0 1\n      %14177 = OpBitcast %v2float %16860\n       %7041 = OpCompositeExtract %float %14177 0\n      %13423 = OpCompositeExtract %float %14177 1\n      %17021 = OpCompositeConstruct %v4float %7041 %13423 %float_0 %float_0\n      %16861 = OpVectorShuffle %v2uint %11214 %11214 2 3\n      %14178 = OpBitcast %v2float %16861\n       %7042 = OpCompositeExtract %float %14178 0\n      %16649 = OpCompositeExtract %float %14178 1\n       %9042 = OpCompositeConstruct %v4float %7042 %16649 %float_0 %float_0\n               OpBranch %20262\n      %20262 = OpLabel\n      %11179 = OpPhi %v4float %9042 %20311 %17251 %8537 %9041 %8246\n      %14348 = OpPhi %v4float %17021 %20311 %25238 %8537 %14615 %8246\n      %15232 = OpPhi %v4float %17020 %20311 %25237 %8537 %14614 %8246\n      %14521 = OpPhi %v4float %17019 %20311 %25236 %8537 %14613 %8246\n               OpBranch %21264\n      %21264 = OpLabel\n      %11180 = OpPhi %v4float %11179 %20262 %11178 %16225\n      %14349 = OpPhi %v4float %14348 %20262 %14347 %16225\n      %12949 = OpPhi %v4float %15232 %20262 %15231 %16225\n      %13946 = OpPhi %v4float %14521 %20262 %14520 %16225\n      %17241 = OpFAdd %v4float %8403 %13946\n      %23297 = OpFAdd %v4float %13804 %12949\n       %8082 = OpFAdd %v4float %14346 %14349\n      %20755 = OpFAdd %v4float %11177 %11180\n      %14461 = OpUGreaterThanEqual %bool %16205 %uint_6\n               OpSelectionMerge %24267 DontFlatten\n               OpBranchConditional %14461 %9905 %24267\n       %9905 = OpLabel\n      %14258 = OpShiftLeftLogical %uint %uint_4 %9130\n      %12090 = OpFMul %float %11052 %float_0_25\n      %20988 = OpIAdd %uint %23531 %14258\n               OpSelectionMerge %21265 DontFlatten\n               OpBranchConditional %23279 %15207 %16571\n      %16571 = OpLabel\n      %19165 = OpIEqual %bool %6555 %uint_4\n               OpSelectionMerge %20299 DontFlatten\n               OpBranchConditional %19165 %6595 %8963\n       %8963 = OpLabel\n      %22068 = OpShiftRightLogical %uint %20988 %int_2\n      %13377 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22068\n      %15062 = OpLoad %uint %13377\n       %8521 = OpIAdd %uint %20988 %6555\n      %21674 = OpShiftRightLogical %uint %8521 %int_2\n      %19681 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21674\n      %13118 = OpLoad %uint %19681\n       %8691 = OpIMul %uint %uint_2 %6555\n      %24260 = OpIAdd %uint %20988 %8691\n      %17898 = OpShiftRightLogical %uint %24260 %int_2\n      %19682 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17898\n      %13119 = OpLoad %uint %19682\n       %8692 = OpIMul %uint %uint_3 %6555\n      %24261 = OpIAdd %uint %20988 %8692\n      %17899 = OpShiftRightLogical %uint %24261 %int_2\n      %18691 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17899\n      %24412 = OpLoad %uint %18691\n      %20788 = OpCompositeConstruct %v4uint %15062 %13118 %13119 %24412\n               OpBranch %20299\n       %6595 = OpLabel\n      %24490 = OpShiftRightLogical %uint %20988 %int_2\n      %13378 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24490\n      %12623 = OpLoad %uint %13378\n      %11713 = OpIAdd %uint %24490 %uint_1\n       %6413 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11713\n      %23662 = OpLoad %uint %6413\n      %11714 = OpIAdd %uint %24490 %uint_2\n       %6414 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11714\n      %23663 = OpLoad %uint %6414\n      %11715 = OpIAdd %uint %24490 %uint_3\n      %24568 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11715\n      %16385 = OpLoad %uint %24568\n      %20789 = OpCompositeConstruct %v4uint %12623 %23662 %23663 %16385\n               OpBranch %20299\n      %20299 = OpLabel\n      %10945 = OpPhi %v4uint %20789 %6595 %20788 %8963\n               OpSelectionMerge %16226 None\n               OpSwitch %8576 %19453 0 %14587 1 %14587 2 %7359 10 %7359 3 %7358 12 %7358 4 %8192 6 %8247\n       %8247 = OpLabel\n      %24413 = OpCompositeExtract %uint %10945 0\n      %24683 = OpExtInst %v2float %1 UnpackHalf2x16 %24413\n      %10098 = OpCompositeExtract %float %24683 0\n      %17490 = OpCompositeExtract %float %24683 1\n      %14616 = OpCompositeConstruct %v4float %10098 %17490 %float_0 %float_0\n      %17286 = OpCompositeExtract %uint %10945 1\n      %18039 = OpExtInst %v2float %1 UnpackHalf2x16 %17286\n      %10099 = OpCompositeExtract %float %18039 0\n      %17491 = OpCompositeExtract %float %18039 1\n      %14617 = OpCompositeConstruct %v4float %10099 %17491 %float_0 %float_0\n      %17287 = OpCompositeExtract %uint %10945 2\n      %18040 = OpExtInst %v2float %1 UnpackHalf2x16 %17287\n      %10100 = OpCompositeExtract %float %18040 0\n      %17492 = OpCompositeExtract %float %18040 1\n      %14618 = OpCompositeConstruct %v4float %10100 %17492 %float_0 %float_0\n      %17288 = OpCompositeExtract %uint %10945 3\n      %18041 = OpExtInst %v2float %1 UnpackHalf2x16 %17288\n      %10109 = OpCompositeExtract %float %18041 0\n      %20674 = OpCompositeExtract %float %18041 1\n       %9043 = OpCompositeConstruct %v4float %10109 %20674 %float_0 %float_0\n               OpBranch %16226\n       %8192 = OpLabel\n      %12431 = OpCompositeExtract %uint %10945 0\n      %22687 = OpBitcast %int %12431\n      %18216 = OpCompositeConstruct %v2int %22687 %22687\n      %18357 = OpShiftLeftLogical %v2int %18216 %1959\n      %13343 = OpShiftRightArithmetic %v2int %18357 %2151\n      %10927 = OpConvertSToF %v2float %13343\n      %18255 = OpVectorTimesScalar %v2float %10927 %float_0_000976592302\n      %24078 = OpExtInst %v2float %1 FMax %73 %18255\n      %24338 = OpCompositeExtract %float %24078 0\n      %15578 = OpCompositeExtract %float %24078 1\n      %16676 = OpCompositeConstruct %v4float %24338 %15578 %float_0 %float_0\n      %19528 = OpCompositeExtract %uint %10945 1\n      %16039 = OpBitcast %int %19528\n      %18217 = OpCompositeConstruct %v2int %16039 %16039\n      %18358 = OpShiftLeftLogical %v2int %18217 %1959\n      %13344 = OpShiftRightArithmetic %v2int %18358 %2151\n      %10928 = OpConvertSToF %v2float %13344\n      %18256 = OpVectorTimesScalar %v2float %10928 %float_0_000976592302\n      %24079 = OpExtInst %v2float %1 FMax %73 %18256\n      %24339 = OpCompositeExtract %float %24079 0\n      %15579 = OpCompositeExtract %float %24079 1\n      %16677 = OpCompositeConstruct %v4float %24339 %15579 %float_0 %float_0\n      %19529 = OpCompositeExtract %uint %10945 2\n      %16040 = OpBitcast %int %19529\n      %18218 = OpCompositeConstruct %v2int %16040 %16040\n      %18359 = OpShiftLeftLogical %v2int %18218 %1959\n      %13345 = OpShiftRightArithmetic %v2int %18359 %2151\n      %10929 = OpConvertSToF %v2float %13345\n      %18257 = OpVectorTimesScalar %v2float %10929 %float_0_000976592302\n      %24080 = OpExtInst %v2float %1 FMax %73 %18257\n      %24340 = OpCompositeExtract %float %24080 0\n      %15580 = OpCompositeExtract %float %24080 1\n      %16678 = OpCompositeConstruct %v4float %24340 %15580 %float_0 %float_0\n      %19530 = OpCompositeExtract %uint %10945 3\n      %16041 = OpBitcast %int %19530\n      %18219 = OpCompositeConstruct %v2int %16041 %16041\n      %18360 = OpShiftLeftLogical %v2int %18219 %1959\n      %13346 = OpShiftRightArithmetic %v2int %18360 %2151\n      %10930 = OpConvertSToF %v2float %13346\n      %18258 = OpVectorTimesScalar %v2float %10930 %float_0_000976592302\n      %24081 = OpExtInst %v2float %1 FMax %73 %18258\n      %24341 = OpCompositeExtract %float %24081 0\n      %18766 = OpCompositeExtract %float %24081 1\n       %9044 = OpCompositeConstruct %v4float %24341 %18766 %float_0 %float_0\n               OpBranch %16226\n       %7358 = OpLabel\n      %22211 = OpCompositeExtract %uint %10945 0\n      %20240 = OpCompositeConstruct %v3uint %22211 %22211 %22211\n      %11031 = OpShiftRightLogical %v3uint %20240 %2996\n      %24046 = OpBitwiseAnd %v3uint %11031 %261\n      %18596 = OpBitwiseAnd %v3uint %11031 %1126\n      %23448 = OpShiftRightLogical %v3uint %24046 %2828\n      %16593 = OpIEqual %v3bool %23448 %2578\n      %11347 = OpExtInst %v3int %1 FindUMsb %18596\n      %10781 = OpBitcast %v3uint %11347\n       %6274 = OpISub %v3uint %2828 %10781\n       %8728 = OpIAdd %v3uint %10781 %2360\n      %10359 = OpSelect %v3uint %16593 %8728 %23448\n      %23260 = OpShiftLeftLogical %v3uint %18596 %6274\n      %18850 = OpBitwiseAnd %v3uint %23260 %1126\n      %10931 = OpSelect %v3uint %16593 %18850 %18596\n      %24577 = OpIAdd %v3uint %10359 %1018\n      %20359 = OpShiftLeftLogical %v3uint %24577 %393\n      %16302 = OpShiftLeftLogical %v3uint %10931 %141\n      %22404 = OpBitwiseOr %v3uint %20359 %16302\n      %13832 = OpIEqual %v3bool %24046 %2578\n      %16970 = OpSelect %v3uint %13832 %2578 %22404\n      %10711 = OpBitcast %v3float %16970\n      %19372 = OpShiftRightLogical %uint %22211 %uint_30\n      %18454 = OpConvertUToF %float %19372\n      %15911 = OpFMul %float %18454 %float_0_333333343\n      %21450 = OpCompositeExtract %float %10711 0\n      %10845 = OpCompositeExtract %float %10711 1\n       %7839 = OpCompositeExtract %float %10711 2\n      %15840 = OpCompositeConstruct %v4float %21450 %10845 %7839 %15911\n      %10235 = OpCompositeExtract %uint %10945 1\n      %13588 = OpCompositeConstruct %v3uint %10235 %10235 %10235\n      %11032 = OpShiftRightLogical %v3uint %13588 %2996\n      %24047 = OpBitwiseAnd %v3uint %11032 %261\n      %18597 = OpBitwiseAnd %v3uint %11032 %1126\n      %23449 = OpShiftRightLogical %v3uint %24047 %2828\n      %16594 = OpIEqual %v3bool %23449 %2578\n      %11348 = OpExtInst %v3int %1 FindUMsb %18597\n      %10782 = OpBitcast %v3uint %11348\n       %6275 = OpISub %v3uint %2828 %10782\n       %8729 = OpIAdd %v3uint %10782 %2360\n      %10360 = OpSelect %v3uint %16594 %8729 %23449\n      %23261 = OpShiftLeftLogical %v3uint %18597 %6275\n      %18851 = OpBitwiseAnd %v3uint %23261 %1126\n      %10932 = OpSelect %v3uint %16594 %18851 %18597\n      %24578 = OpIAdd %v3uint %10360 %1018\n      %20360 = OpShiftLeftLogical %v3uint %24578 %393\n      %16303 = OpShiftLeftLogical %v3uint %10932 %141\n      %22405 = OpBitwiseOr %v3uint %20360 %16303\n      %13833 = OpIEqual %v3bool %24047 %2578\n      %16971 = OpSelect %v3uint %13833 %2578 %22405\n      %10712 = OpBitcast %v3float %16971\n      %19373 = OpShiftRightLogical %uint %10235 %uint_30\n      %18455 = OpConvertUToF %float %19373\n      %15912 = OpFMul %float %18455 %float_0_333333343\n      %21451 = OpCompositeExtract %float %10712 0\n      %10846 = OpCompositeExtract %float %10712 1\n       %7840 = OpCompositeExtract %float %10712 2\n      %15841 = OpCompositeConstruct %v4float %21451 %10846 %7840 %15912\n      %10236 = OpCompositeExtract %uint %10945 2\n      %13589 = OpCompositeConstruct %v3uint %10236 %10236 %10236\n      %11033 = OpShiftRightLogical %v3uint %13589 %2996\n      %24048 = OpBitwiseAnd %v3uint %11033 %261\n      %18606 = OpBitwiseAnd %v3uint %11033 %1126\n      %23450 = OpShiftRightLogical %v3uint %24048 %2828\n      %16595 = OpIEqual %v3bool %23450 %2578\n      %11349 = OpExtInst %v3int %1 FindUMsb %18606\n      %10783 = OpBitcast %v3uint %11349\n       %6276 = OpISub %v3uint %2828 %10783\n       %8730 = OpIAdd %v3uint %10783 %2360\n      %10361 = OpSelect %v3uint %16595 %8730 %23450\n      %23262 = OpShiftLeftLogical %v3uint %18606 %6276\n      %18852 = OpBitwiseAnd %v3uint %23262 %1126\n      %10933 = OpSelect %v3uint %16595 %18852 %18606\n      %24579 = OpIAdd %v3uint %10361 %1018\n      %20361 = OpShiftLeftLogical %v3uint %24579 %393\n      %16304 = OpShiftLeftLogical %v3uint %10933 %141\n      %22406 = OpBitwiseOr %v3uint %20361 %16304\n      %13834 = OpIEqual %v3bool %24048 %2578\n      %16972 = OpSelect %v3uint %13834 %2578 %22406\n      %10713 = OpBitcast %v3float %16972\n      %19374 = OpShiftRightLogical %uint %10236 %uint_30\n      %18456 = OpConvertUToF %float %19374\n      %15913 = OpFMul %float %18456 %float_0_333333343\n      %21452 = OpCompositeExtract %float %10713 0\n      %10847 = OpCompositeExtract %float %10713 1\n       %7841 = OpCompositeExtract %float %10713 2\n      %15842 = OpCompositeConstruct %v4float %21452 %10847 %7841 %15913\n      %10237 = OpCompositeExtract %uint %10945 3\n      %13590 = OpCompositeConstruct %v3uint %10237 %10237 %10237\n      %11034 = OpShiftRightLogical %v3uint %13590 %2996\n      %24049 = OpBitwiseAnd %v3uint %11034 %261\n      %18607 = OpBitwiseAnd %v3uint %11034 %1126\n      %23451 = OpShiftRightLogical %v3uint %24049 %2828\n      %16596 = OpIEqual %v3bool %23451 %2578\n      %11350 = OpExtInst %v3int %1 FindUMsb %18607\n      %10784 = OpBitcast %v3uint %11350\n       %6277 = OpISub %v3uint %2828 %10784\n       %8731 = OpIAdd %v3uint %10784 %2360\n      %10362 = OpSelect %v3uint %16596 %8731 %23451\n      %23263 = OpShiftLeftLogical %v3uint %18607 %6277\n      %18853 = OpBitwiseAnd %v3uint %23263 %1126\n      %10934 = OpSelect %v3uint %16596 %18853 %18607\n      %24580 = OpIAdd %v3uint %10362 %1018\n      %20362 = OpShiftLeftLogical %v3uint %24580 %393\n      %16305 = OpShiftLeftLogical %v3uint %10934 %141\n      %22407 = OpBitwiseOr %v3uint %20362 %16305\n      %13835 = OpIEqual %v3bool %24049 %2578\n      %16973 = OpSelect %v3uint %13835 %2578 %22407\n      %10714 = OpBitcast %v3float %16973\n      %19375 = OpShiftRightLogical %uint %10237 %uint_30\n      %18457 = OpConvertUToF %float %19375\n      %15914 = OpFMul %float %18457 %float_0_333333343\n      %21453 = OpCompositeExtract %float %10714 0\n      %10848 = OpCompositeExtract %float %10714 1\n      %11035 = OpCompositeExtract %float %10714 2\n       %9045 = OpCompositeConstruct %v4float %21453 %10848 %11035 %15914\n               OpBranch %16226\n       %7359 = OpLabel\n      %22212 = OpCompositeExtract %uint %10945 0\n      %20241 = OpCompositeConstruct %v4uint %22212 %22212 %22212 %22212\n       %9384 = OpShiftRightLogical %v4uint %20241 %845\n      %18867 = OpBitwiseAnd %v4uint %9384 %635\n      %15549 = OpConvertUToF %v4float %18867\n      %16694 = OpFMul %v4float %15549 %2798\n      %23768 = OpCompositeExtract %uint %10945 1\n      %20819 = OpCompositeConstruct %v4uint %23768 %23768 %23768 %23768\n       %9385 = OpShiftRightLogical %v4uint %20819 %845\n      %18868 = OpBitwiseAnd %v4uint %9385 %635\n      %15550 = OpConvertUToF %v4float %18868\n      %16695 = OpFMul %v4float %15550 %2798\n      %23769 = OpCompositeExtract %uint %10945 2\n      %20820 = OpCompositeConstruct %v4uint %23769 %23769 %23769 %23769\n       %9386 = OpShiftRightLogical %v4uint %20820 %845\n      %18869 = OpBitwiseAnd %v4uint %9386 %635\n      %15551 = OpConvertUToF %v4float %18869\n      %16696 = OpFMul %v4float %15551 %2798\n      %23770 = OpCompositeExtract %uint %10945 3\n      %20821 = OpCompositeConstruct %v4uint %23770 %23770 %23770 %23770\n       %9387 = OpShiftRightLogical %v4uint %20821 %845\n      %18870 = OpBitwiseAnd %v4uint %9387 %635\n      %18737 = OpConvertUToF %v4float %18870\n       %9889 = OpFMul %v4float %18737 %2798\n               OpBranch %16226\n      %14587 = OpLabel\n      %22213 = OpCompositeExtract %uint %10945 0\n      %20242 = OpCompositeConstruct %v4uint %22213 %22213 %22213 %22213\n       %9388 = OpShiftRightLogical %v4uint %20242 %653\n      %19038 = OpBitwiseAnd %v4uint %9388 %1611\n      %13992 = OpConvertUToF %v4float %19038\n      %19241 = OpVectorTimesScalar %v4float %13992 %float_0_00392156886\n       %8613 = OpCompositeExtract %uint %10945 1\n      %24849 = OpCompositeConstruct %v4uint %8613 %8613 %8613 %8613\n       %9389 = OpShiftRightLogical %v4uint %24849 %653\n      %19039 = OpBitwiseAnd %v4uint %9389 %1611\n      %13993 = OpConvertUToF %v4float %19039\n      %19242 = OpVectorTimesScalar %v4float %13993 %float_0_00392156886\n       %8614 = OpCompositeExtract %uint %10945 2\n      %24850 = OpCompositeConstruct %v4uint %8614 %8614 %8614 %8614\n       %9390 = OpShiftRightLogical %v4uint %24850 %653\n      %19040 = OpBitwiseAnd %v4uint %9390 %1611\n      %13994 = OpConvertUToF %v4float %19040\n      %19243 = OpVectorTimesScalar %v4float %13994 %float_0_00392156886\n       %8615 = OpCompositeExtract %uint %10945 3\n      %24851 = OpCompositeConstruct %v4uint %8615 %8615 %8615 %8615\n       %9391 = OpShiftRightLogical %v4uint %24851 %653\n      %19041 = OpBitwiseAnd %v4uint %9391 %1611\n      %17180 = OpConvertUToF %v4float %19041\n      %12436 = OpVectorTimesScalar %v4float %17180 %float_0_00392156886\n               OpBranch %16226\n      %19453 = OpLabel\n      %12432 = OpCompositeExtract %uint %10945 0\n      %20464 = OpBitcast %float %12432\n      %17212 = OpCompositeConstruct %v2float %20464 %float_0\n      %11670 = OpVectorShuffle %v4float %17212 %17212 0 1 1 1\n      %22199 = OpCompositeExtract %uint %10945 1\n      %16238 = OpBitcast %float %22199\n      %17213 = OpCompositeConstruct %v2float %16238 %float_0\n      %11671 = OpVectorShuffle %v4float %17213 %17213 0 1 1 1\n      %22200 = OpCompositeExtract %uint %10945 2\n      %16239 = OpBitcast %float %22200\n      %17214 = OpCompositeConstruct %v2float %16239 %float_0\n      %11672 = OpVectorShuffle %v4float %17214 %17214 0 1 1 1\n      %22201 = OpCompositeExtract %uint %10945 3\n      %16240 = OpBitcast %float %22201\n      %20400 = OpCompositeConstruct %v2float %16240 %float_0\n      %23100 = OpVectorShuffle %v4float %20400 %20400 0 1 1 1\n               OpBranch %16226\n      %16226 = OpLabel\n      %11181 = OpPhi %v4float %23100 %19453 %12436 %14587 %9889 %7359 %9045 %7358 %9044 %8192 %9043 %8247\n      %14350 = OpPhi %v4float %11672 %19453 %19243 %14587 %16696 %7359 %15842 %7358 %16678 %8192 %14618 %8247\n      %15233 = OpPhi %v4float %11671 %19453 %19242 %14587 %16695 %7359 %15841 %7358 %16677 %8192 %14617 %8247\n      %14522 = OpPhi %v4float %11670 %19453 %19241 %14587 %16694 %7359 %15840 %7358 %16676 %8192 %14616 %8247\n               OpBranch %21265\n      %15207 = OpLabel\n      %21586 = OpIEqual %bool %6555 %uint_8\n               OpSelectionMerge %20263 DontFlatten\n               OpBranchConditional %21586 %6596 %8964\n       %8964 = OpLabel\n      %22069 = OpShiftRightLogical %uint %20988 %int_2\n      %13379 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22069\n      %12624 = OpLoad %uint %13379\n      %11716 = OpIAdd %uint %22069 %uint_1\n       %6415 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11716\n       %7032 = OpLoad %uint %6415\n       %8522 = OpIAdd %uint %20988 %6555\n      %21675 = OpShiftRightLogical %uint %8522 %int_2\n      %19609 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21675\n      %12625 = OpLoad %uint %19609\n      %11717 = OpIAdd %uint %21675 %uint_1\n      %24581 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11717\n      %14158 = OpLoad %uint %24581\n      %19673 = OpCompositeConstruct %v4uint %12624 %7032 %12625 %14158\n      %19501 = OpIMul %uint %uint_2 %6555\n      %10823 = OpIAdd %uint %20988 %19501\n      %17900 = OpShiftRightLogical %uint %10823 %int_2\n      %19610 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17900\n      %12626 = OpLoad %uint %19610\n      %11718 = OpIAdd %uint %17900 %uint_1\n       %6477 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11718\n      %24157 = OpLoad %uint %6477\n       %8693 = OpIMul %uint %uint_3 %6555\n      %24262 = OpIAdd %uint %20988 %8693\n      %17901 = OpShiftRightLogical %uint %24262 %int_2\n      %19611 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17901\n      %12627 = OpLoad %uint %19611\n      %11719 = OpIAdd %uint %17901 %uint_1\n      %24582 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11719\n      %16386 = OpLoad %uint %24582\n      %20790 = OpCompositeConstruct %v4uint %12626 %24157 %12627 %16386\n               OpBranch %20263\n       %6596 = OpLabel\n      %24491 = OpShiftRightLogical %uint %20988 %int_2\n      %13380 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24491\n      %12628 = OpLoad %uint %13380\n      %11720 = OpIAdd %uint %24491 %uint_1\n       %6416 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11720\n      %23664 = OpLoad %uint %6416\n      %11721 = OpIAdd %uint %24491 %uint_2\n       %6417 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11721\n      %23665 = OpLoad %uint %6417\n      %11722 = OpIAdd %uint %24491 %uint_3\n      %24583 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11722\n      %14082 = OpLoad %uint %24583\n      %21618 = OpCompositeConstruct %v4uint %12628 %23664 %23665 %14082\n      %19333 = OpIAdd %uint %20988 %uint_16\n       %8239 = OpShiftRightLogical %uint %19333 %int_2\n      %19612 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %8239\n      %12629 = OpLoad %uint %19612\n      %11723 = OpIAdd %uint %8239 %uint_1\n       %6418 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11723\n      %23666 = OpLoad %uint %6418\n      %11724 = OpIAdd %uint %8239 %uint_2\n       %6419 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11724\n      %23667 = OpLoad %uint %6419\n      %11725 = OpIAdd %uint %8239 %uint_3\n      %24584 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11725\n      %16387 = OpLoad %uint %24584\n      %20791 = OpCompositeConstruct %v4uint %12629 %23666 %23667 %16387\n               OpBranch %20263\n      %20263 = OpLabel\n      %11215 = OpPhi %v4uint %20791 %6596 %20790 %8964\n      %14114 = OpPhi %v4uint %21618 %6596 %19673 %8964\n               OpSelectionMerge %20264 None\n               OpSwitch %8576 %20312 5 %8538 7 %8248\n       %8248 = OpLabel\n      %24414 = OpCompositeExtract %uint %14114 0\n      %24684 = OpExtInst %v2float %1 UnpackHalf2x16 %24414\n      %10110 = OpCompositeExtract %float %24684 0\n      %16064 = OpCompositeExtract %float %24684 1\n      %17033 = OpCompositeExtract %uint %14114 1\n      %15613 = OpExtInst %v2float %1 UnpackHalf2x16 %17033\n      %10111 = OpCompositeExtract %float %15613 0\n      %17493 = OpCompositeExtract %float %15613 1\n      %14619 = OpCompositeConstruct %v4float %10110 %16064 %10111 %17493\n      %17289 = OpCompositeExtract %uint %14114 2\n      %18042 = OpExtInst %v2float %1 UnpackHalf2x16 %17289\n      %10112 = OpCompositeExtract %float %18042 0\n      %16065 = OpCompositeExtract %float %18042 1\n      %17034 = OpCompositeExtract %uint %14114 3\n      %15614 = OpExtInst %v2float %1 UnpackHalf2x16 %17034\n      %10113 = OpCompositeExtract %float %15614 0\n      %17494 = OpCompositeExtract %float %15614 1\n      %14620 = OpCompositeConstruct %v4float %10112 %16065 %10113 %17494\n      %17290 = OpCompositeExtract %uint %11215 0\n      %18043 = OpExtInst %v2float %1 UnpackHalf2x16 %17290\n      %10114 = OpCompositeExtract %float %18043 0\n      %16066 = OpCompositeExtract %float %18043 1\n      %17035 = OpCompositeExtract %uint %11215 1\n      %15615 = OpExtInst %v2float %1 UnpackHalf2x16 %17035\n      %10115 = OpCompositeExtract %float %15615 0\n      %17495 = OpCompositeExtract %float %15615 1\n      %14621 = OpCompositeConstruct %v4float %10114 %16066 %10115 %17495\n      %17291 = OpCompositeExtract %uint %11215 2\n      %18044 = OpExtInst %v2float %1 UnpackHalf2x16 %17291\n      %10116 = OpCompositeExtract %float %18044 0\n      %16067 = OpCompositeExtract %float %18044 1\n      %17036 = OpCompositeExtract %uint %11215 3\n      %15616 = OpExtInst %v2float %1 UnpackHalf2x16 %17036\n      %10117 = OpCompositeExtract %float %15616 0\n      %20675 = OpCompositeExtract %float %15616 1\n       %9046 = OpCompositeConstruct %v4float %10116 %16067 %10117 %20675\n               OpBranch %20264\n       %8538 = OpLabel\n       %9725 = OpVectorShuffle %v2uint %14114 %14114 0 1\n      %23358 = OpBitcast %v2int %9725\n      %24790 = OpVectorShuffle %v4int %23358 %23358 0 0 1 1\n      %18608 = OpShiftLeftLogical %v4int %24790 %290\n      %15765 = OpShiftRightArithmetic %v4int %18608 %770\n      %10935 = OpConvertSToF %v4float %15765\n      %18220 = OpVectorTimesScalar %v4float %10935 %float_0_000976592302\n      %25239 = OpExtInst %v4float %1 FMax %1284 %18220\n      %14193 = OpVectorShuffle %v2uint %14114 %14114 2 3\n       %9413 = OpBitcast %v2int %14193\n      %24791 = OpVectorShuffle %v4int %9413 %9413 0 0 1 1\n      %18609 = OpShiftLeftLogical %v4int %24791 %290\n      %15766 = OpShiftRightArithmetic %v4int %18609 %770\n      %10936 = OpConvertSToF %v4float %15766\n      %18221 = OpVectorTimesScalar %v4float %10936 %float_0_000976592302\n      %25240 = OpExtInst %v4float %1 FMax %1284 %18221\n      %14194 = OpVectorShuffle %v2uint %11215 %11215 0 1\n       %9414 = OpBitcast %v2int %14194\n      %24792 = OpVectorShuffle %v4int %9414 %9414 0 0 1 1\n      %18610 = OpShiftLeftLogical %v4int %24792 %290\n      %15767 = OpShiftRightArithmetic %v4int %18610 %770\n      %10937 = OpConvertSToF %v4float %15767\n      %18222 = OpVectorTimesScalar %v4float %10937 %float_0_000976592302\n      %25241 = OpExtInst %v4float %1 FMax %1284 %18222\n      %14195 = OpVectorShuffle %v2uint %11215 %11215 2 3\n       %9415 = OpBitcast %v2int %14195\n      %24793 = OpVectorShuffle %v4int %9415 %9415 0 0 1 1\n      %18611 = OpShiftLeftLogical %v4int %24793 %290\n      %15768 = OpShiftRightArithmetic %v4int %18611 %770\n      %10938 = OpConvertSToF %v4float %15768\n      %21441 = OpVectorTimesScalar %v4float %10938 %float_0_000976592302\n      %17252 = OpExtInst %v4float %1 FMax %1284 %21441\n               OpBranch %20264\n      %20312 = OpLabel\n       %9763 = OpVectorShuffle %v2uint %14114 %14114 0 1\n      %20827 = OpBitcast %v2float %9763\n       %7043 = OpCompositeExtract %float %20827 0\n      %13424 = OpCompositeExtract %float %20827 1\n      %17022 = OpCompositeConstruct %v4float %7043 %13424 %float_0 %float_0\n      %16862 = OpVectorShuffle %v2uint %14114 %14114 2 3\n      %14179 = OpBitcast %v2float %16862\n       %7044 = OpCompositeExtract %float %14179 0\n      %13425 = OpCompositeExtract %float %14179 1\n      %17023 = OpCompositeConstruct %v4float %7044 %13425 %float_0 %float_0\n      %16863 = OpVectorShuffle %v2uint %11215 %11215 0 1\n      %14180 = OpBitcast %v2float %16863\n       %7045 = OpCompositeExtract %float %14180 0\n      %13426 = OpCompositeExtract %float %14180 1\n      %17024 = OpCompositeConstruct %v4float %7045 %13426 %float_0 %float_0\n      %16864 = OpVectorShuffle %v2uint %11215 %11215 2 3\n      %14181 = OpBitcast %v2float %16864\n       %7046 = OpCompositeExtract %float %14181 0\n      %16650 = OpCompositeExtract %float %14181 1\n       %9047 = OpCompositeConstruct %v4float %7046 %16650 %float_0 %float_0\n               OpBranch %20264\n      %20264 = OpLabel\n      %11182 = OpPhi %v4float %9047 %20312 %17252 %8538 %9046 %8248\n      %14351 = OpPhi %v4float %17024 %20312 %25241 %8538 %14621 %8248\n      %15234 = OpPhi %v4float %17023 %20312 %25240 %8538 %14620 %8248\n      %14523 = OpPhi %v4float %17022 %20312 %25239 %8538 %14619 %8248\n               OpBranch %21265\n      %21265 = OpLabel\n      %11183 = OpPhi %v4float %11182 %20264 %11181 %16226\n      %14352 = OpPhi %v4float %14351 %20264 %14350 %16226\n      %12950 = OpPhi %v4float %15234 %20264 %15233 %16226\n      %13947 = OpPhi %v4float %14523 %20264 %14522 %16226\n      %17242 = OpFAdd %v4float %17241 %13947\n      %23298 = OpFAdd %v4float %23297 %12950\n       %7208 = OpFAdd %v4float %8082 %14352\n       %9642 = OpFAdd %v4float %20755 %11183\n      %16376 = OpIAdd %uint %24184 %14258\n               OpSelectionMerge %21266 DontFlatten\n               OpBranchConditional %23279 %15208 %16572\n      %16572 = OpLabel\n      %19166 = OpIEqual %bool %6555 %uint_4\n               OpSelectionMerge %20300 DontFlatten\n               OpBranchConditional %19166 %6597 %8965\n       %8965 = OpLabel\n      %22070 = OpShiftRightLogical %uint %16376 %int_2\n      %13381 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22070\n      %15063 = OpLoad %uint %13381\n       %8523 = OpIAdd %uint %16376 %6555\n      %21676 = OpShiftRightLogical %uint %8523 %int_2\n      %19683 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21676\n      %13120 = OpLoad %uint %19683\n       %8694 = OpIMul %uint %uint_2 %6555\n      %24264 = OpIAdd %uint %16376 %8694\n      %17902 = OpShiftRightLogical %uint %24264 %int_2\n      %19684 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17902\n      %13121 = OpLoad %uint %19684\n       %8695 = OpIMul %uint %uint_3 %6555\n      %24265 = OpIAdd %uint %16376 %8695\n      %17903 = OpShiftRightLogical %uint %24265 %int_2\n      %18692 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17903\n      %24415 = OpLoad %uint %18692\n      %20792 = OpCompositeConstruct %v4uint %15063 %13120 %13121 %24415\n               OpBranch %20300\n       %6597 = OpLabel\n      %24492 = OpShiftRightLogical %uint %16376 %int_2\n      %13382 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24492\n      %12630 = OpLoad %uint %13382\n      %11726 = OpIAdd %uint %24492 %uint_1\n       %6420 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11726\n      %23668 = OpLoad %uint %6420\n      %11727 = OpIAdd %uint %24492 %uint_2\n       %6421 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11727\n      %23669 = OpLoad %uint %6421\n      %11728 = OpIAdd %uint %24492 %uint_3\n      %24585 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11728\n      %16388 = OpLoad %uint %24585\n      %20793 = OpCompositeConstruct %v4uint %12630 %23668 %23669 %16388\n               OpBranch %20300\n      %20300 = OpLabel\n      %10946 = OpPhi %v4uint %20793 %6597 %20792 %8965\n               OpSelectionMerge %16227 None\n               OpSwitch %8576 %19454 0 %14588 1 %14588 2 %7361 10 %7361 3 %7360 12 %7360 4 %8193 6 %8249\n       %8249 = OpLabel\n      %24416 = OpCompositeExtract %uint %10946 0\n      %24685 = OpExtInst %v2float %1 UnpackHalf2x16 %24416\n      %10118 = OpCompositeExtract %float %24685 0\n      %17496 = OpCompositeExtract %float %24685 1\n      %14622 = OpCompositeConstruct %v4float %10118 %17496 %float_0 %float_0\n      %17292 = OpCompositeExtract %uint %10946 1\n      %18045 = OpExtInst %v2float %1 UnpackHalf2x16 %17292\n      %10119 = OpCompositeExtract %float %18045 0\n      %17497 = OpCompositeExtract %float %18045 1\n      %14623 = OpCompositeConstruct %v4float %10119 %17497 %float_0 %float_0\n      %17293 = OpCompositeExtract %uint %10946 2\n      %18046 = OpExtInst %v2float %1 UnpackHalf2x16 %17293\n      %10120 = OpCompositeExtract %float %18046 0\n      %17498 = OpCompositeExtract %float %18046 1\n      %14624 = OpCompositeConstruct %v4float %10120 %17498 %float_0 %float_0\n      %17294 = OpCompositeExtract %uint %10946 3\n      %18047 = OpExtInst %v2float %1 UnpackHalf2x16 %17294\n      %10121 = OpCompositeExtract %float %18047 0\n      %20676 = OpCompositeExtract %float %18047 1\n       %9048 = OpCompositeConstruct %v4float %10121 %20676 %float_0 %float_0\n               OpBranch %16227\n       %8193 = OpLabel\n      %12433 = OpCompositeExtract %uint %10946 0\n      %22688 = OpBitcast %int %12433\n      %18223 = OpCompositeConstruct %v2int %22688 %22688\n      %18361 = OpShiftLeftLogical %v2int %18223 %1959\n      %13347 = OpShiftRightArithmetic %v2int %18361 %2151\n      %10939 = OpConvertSToF %v2float %13347\n      %18259 = OpVectorTimesScalar %v2float %10939 %float_0_000976592302\n      %24082 = OpExtInst %v2float %1 FMax %73 %18259\n      %24342 = OpCompositeExtract %float %24082 0\n      %15581 = OpCompositeExtract %float %24082 1\n      %16679 = OpCompositeConstruct %v4float %24342 %15581 %float_0 %float_0\n      %19531 = OpCompositeExtract %uint %10946 1\n      %16042 = OpBitcast %int %19531\n      %18224 = OpCompositeConstruct %v2int %16042 %16042\n      %18362 = OpShiftLeftLogical %v2int %18224 %1959\n      %13348 = OpShiftRightArithmetic %v2int %18362 %2151\n      %10940 = OpConvertSToF %v2float %13348\n      %18260 = OpVectorTimesScalar %v2float %10940 %float_0_000976592302\n      %24083 = OpExtInst %v2float %1 FMax %73 %18260\n      %24343 = OpCompositeExtract %float %24083 0\n      %15582 = OpCompositeExtract %float %24083 1\n      %16680 = OpCompositeConstruct %v4float %24343 %15582 %float_0 %float_0\n      %19532 = OpCompositeExtract %uint %10946 2\n      %16043 = OpBitcast %int %19532\n      %18225 = OpCompositeConstruct %v2int %16043 %16043\n      %18363 = OpShiftLeftLogical %v2int %18225 %1959\n      %13349 = OpShiftRightArithmetic %v2int %18363 %2151\n      %10941 = OpConvertSToF %v2float %13349\n      %18261 = OpVectorTimesScalar %v2float %10941 %float_0_000976592302\n      %24084 = OpExtInst %v2float %1 FMax %73 %18261\n      %24344 = OpCompositeExtract %float %24084 0\n      %15583 = OpCompositeExtract %float %24084 1\n      %16681 = OpCompositeConstruct %v4float %24344 %15583 %float_0 %float_0\n      %19533 = OpCompositeExtract %uint %10946 3\n      %16044 = OpBitcast %int %19533\n      %18226 = OpCompositeConstruct %v2int %16044 %16044\n      %18364 = OpShiftLeftLogical %v2int %18226 %1959\n      %13350 = OpShiftRightArithmetic %v2int %18364 %2151\n      %10942 = OpConvertSToF %v2float %13350\n      %18262 = OpVectorTimesScalar %v2float %10942 %float_0_000976592302\n      %24085 = OpExtInst %v2float %1 FMax %73 %18262\n      %24345 = OpCompositeExtract %float %24085 0\n      %18767 = OpCompositeExtract %float %24085 1\n       %9049 = OpCompositeConstruct %v4float %24345 %18767 %float_0 %float_0\n               OpBranch %16227\n       %7360 = OpLabel\n      %22214 = OpCompositeExtract %uint %10946 0\n      %20243 = OpCompositeConstruct %v3uint %22214 %22214 %22214\n      %11036 = OpShiftRightLogical %v3uint %20243 %2996\n      %24050 = OpBitwiseAnd %v3uint %11036 %261\n      %18612 = OpBitwiseAnd %v3uint %11036 %1126\n      %23452 = OpShiftRightLogical %v3uint %24050 %2828\n      %16597 = OpIEqual %v3bool %23452 %2578\n      %11351 = OpExtInst %v3int %1 FindUMsb %18612\n      %10785 = OpBitcast %v3uint %11351\n       %6278 = OpISub %v3uint %2828 %10785\n       %8732 = OpIAdd %v3uint %10785 %2360\n      %10363 = OpSelect %v3uint %16597 %8732 %23452\n      %23264 = OpShiftLeftLogical %v3uint %18612 %6278\n      %18854 = OpBitwiseAnd %v3uint %23264 %1126\n      %10947 = OpSelect %v3uint %16597 %18854 %18612\n      %24586 = OpIAdd %v3uint %10363 %1018\n      %20363 = OpShiftLeftLogical %v3uint %24586 %393\n      %16306 = OpShiftLeftLogical %v3uint %10947 %141\n      %22408 = OpBitwiseOr %v3uint %20363 %16306\n      %13836 = OpIEqual %v3bool %24050 %2578\n      %16974 = OpSelect %v3uint %13836 %2578 %22408\n      %10715 = OpBitcast %v3float %16974\n      %19376 = OpShiftRightLogical %uint %22214 %uint_30\n      %18458 = OpConvertUToF %float %19376\n      %15915 = OpFMul %float %18458 %float_0_333333343\n      %21454 = OpCompositeExtract %float %10715 0\n      %10849 = OpCompositeExtract %float %10715 1\n       %7842 = OpCompositeExtract %float %10715 2\n      %15843 = OpCompositeConstruct %v4float %21454 %10849 %7842 %15915\n      %10238 = OpCompositeExtract %uint %10946 1\n      %13591 = OpCompositeConstruct %v3uint %10238 %10238 %10238\n      %11037 = OpShiftRightLogical %v3uint %13591 %2996\n      %24051 = OpBitwiseAnd %v3uint %11037 %261\n      %18613 = OpBitwiseAnd %v3uint %11037 %1126\n      %23453 = OpShiftRightLogical %v3uint %24051 %2828\n      %16598 = OpIEqual %v3bool %23453 %2578\n      %11352 = OpExtInst %v3int %1 FindUMsb %18613\n      %10786 = OpBitcast %v3uint %11352\n       %6279 = OpISub %v3uint %2828 %10786\n       %8733 = OpIAdd %v3uint %10786 %2360\n      %10364 = OpSelect %v3uint %16598 %8733 %23453\n      %23265 = OpShiftLeftLogical %v3uint %18613 %6279\n      %18855 = OpBitwiseAnd %v3uint %23265 %1126\n      %10948 = OpSelect %v3uint %16598 %18855 %18613\n      %24587 = OpIAdd %v3uint %10364 %1018\n      %20364 = OpShiftLeftLogical %v3uint %24587 %393\n      %16307 = OpShiftLeftLogical %v3uint %10948 %141\n      %22409 = OpBitwiseOr %v3uint %20364 %16307\n      %13837 = OpIEqual %v3bool %24051 %2578\n      %16975 = OpSelect %v3uint %13837 %2578 %22409\n      %10716 = OpBitcast %v3float %16975\n      %19377 = OpShiftRightLogical %uint %10238 %uint_30\n      %18459 = OpConvertUToF %float %19377\n      %15916 = OpFMul %float %18459 %float_0_333333343\n      %21455 = OpCompositeExtract %float %10716 0\n      %10850 = OpCompositeExtract %float %10716 1\n       %7843 = OpCompositeExtract %float %10716 2\n      %15844 = OpCompositeConstruct %v4float %21455 %10850 %7843 %15916\n      %10239 = OpCompositeExtract %uint %10946 2\n      %13592 = OpCompositeConstruct %v3uint %10239 %10239 %10239\n      %11038 = OpShiftRightLogical %v3uint %13592 %2996\n      %24052 = OpBitwiseAnd %v3uint %11038 %261\n      %18614 = OpBitwiseAnd %v3uint %11038 %1126\n      %23454 = OpShiftRightLogical %v3uint %24052 %2828\n      %16599 = OpIEqual %v3bool %23454 %2578\n      %11353 = OpExtInst %v3int %1 FindUMsb %18614\n      %10787 = OpBitcast %v3uint %11353\n       %6280 = OpISub %v3uint %2828 %10787\n       %8734 = OpIAdd %v3uint %10787 %2360\n      %10365 = OpSelect %v3uint %16599 %8734 %23454\n      %23266 = OpShiftLeftLogical %v3uint %18614 %6280\n      %18856 = OpBitwiseAnd %v3uint %23266 %1126\n      %10949 = OpSelect %v3uint %16599 %18856 %18614\n      %24588 = OpIAdd %v3uint %10365 %1018\n      %20365 = OpShiftLeftLogical %v3uint %24588 %393\n      %16308 = OpShiftLeftLogical %v3uint %10949 %141\n      %22410 = OpBitwiseOr %v3uint %20365 %16308\n      %13838 = OpIEqual %v3bool %24052 %2578\n      %16976 = OpSelect %v3uint %13838 %2578 %22410\n      %10717 = OpBitcast %v3float %16976\n      %19378 = OpShiftRightLogical %uint %10239 %uint_30\n      %18460 = OpConvertUToF %float %19378\n      %15917 = OpFMul %float %18460 %float_0_333333343\n      %21456 = OpCompositeExtract %float %10717 0\n      %10851 = OpCompositeExtract %float %10717 1\n       %7844 = OpCompositeExtract %float %10717 2\n      %15845 = OpCompositeConstruct %v4float %21456 %10851 %7844 %15917\n      %10240 = OpCompositeExtract %uint %10946 3\n      %13593 = OpCompositeConstruct %v3uint %10240 %10240 %10240\n      %11039 = OpShiftRightLogical %v3uint %13593 %2996\n      %24053 = OpBitwiseAnd %v3uint %11039 %261\n      %18615 = OpBitwiseAnd %v3uint %11039 %1126\n      %23455 = OpShiftRightLogical %v3uint %24053 %2828\n      %16600 = OpIEqual %v3bool %23455 %2578\n      %11354 = OpExtInst %v3int %1 FindUMsb %18615\n      %10788 = OpBitcast %v3uint %11354\n       %6281 = OpISub %v3uint %2828 %10788\n       %8735 = OpIAdd %v3uint %10788 %2360\n      %10366 = OpSelect %v3uint %16600 %8735 %23455\n      %23267 = OpShiftLeftLogical %v3uint %18615 %6281\n      %18857 = OpBitwiseAnd %v3uint %23267 %1126\n      %10950 = OpSelect %v3uint %16600 %18857 %18615\n      %24589 = OpIAdd %v3uint %10366 %1018\n      %20366 = OpShiftLeftLogical %v3uint %24589 %393\n      %16309 = OpShiftLeftLogical %v3uint %10950 %141\n      %22411 = OpBitwiseOr %v3uint %20366 %16309\n      %13839 = OpIEqual %v3bool %24053 %2578\n      %16977 = OpSelect %v3uint %13839 %2578 %22411\n      %10718 = OpBitcast %v3float %16977\n      %19379 = OpShiftRightLogical %uint %10240 %uint_30\n      %18461 = OpConvertUToF %float %19379\n      %15918 = OpFMul %float %18461 %float_0_333333343\n      %21457 = OpCompositeExtract %float %10718 0\n      %10852 = OpCompositeExtract %float %10718 1\n      %11040 = OpCompositeExtract %float %10718 2\n       %9050 = OpCompositeConstruct %v4float %21457 %10852 %11040 %15918\n               OpBranch %16227\n       %7361 = OpLabel\n      %22215 = OpCompositeExtract %uint %10946 0\n      %20244 = OpCompositeConstruct %v4uint %22215 %22215 %22215 %22215\n       %9392 = OpShiftRightLogical %v4uint %20244 %845\n      %18871 = OpBitwiseAnd %v4uint %9392 %635\n      %15552 = OpConvertUToF %v4float %18871\n      %16697 = OpFMul %v4float %15552 %2798\n      %23771 = OpCompositeExtract %uint %10946 1\n      %20822 = OpCompositeConstruct %v4uint %23771 %23771 %23771 %23771\n       %9393 = OpShiftRightLogical %v4uint %20822 %845\n      %18872 = OpBitwiseAnd %v4uint %9393 %635\n      %15553 = OpConvertUToF %v4float %18872\n      %16698 = OpFMul %v4float %15553 %2798\n      %23772 = OpCompositeExtract %uint %10946 2\n      %20823 = OpCompositeConstruct %v4uint %23772 %23772 %23772 %23772\n       %9394 = OpShiftRightLogical %v4uint %20823 %845\n      %18873 = OpBitwiseAnd %v4uint %9394 %635\n      %15554 = OpConvertUToF %v4float %18873\n      %16699 = OpFMul %v4float %15554 %2798\n      %23773 = OpCompositeExtract %uint %10946 3\n      %20828 = OpCompositeConstruct %v4uint %23773 %23773 %23773 %23773\n       %9395 = OpShiftRightLogical %v4uint %20828 %845\n      %18874 = OpBitwiseAnd %v4uint %9395 %635\n      %18738 = OpConvertUToF %v4float %18874\n       %9890 = OpFMul %v4float %18738 %2798\n               OpBranch %16227\n      %14588 = OpLabel\n      %22216 = OpCompositeExtract %uint %10946 0\n      %20245 = OpCompositeConstruct %v4uint %22216 %22216 %22216 %22216\n       %9396 = OpShiftRightLogical %v4uint %20245 %653\n      %19042 = OpBitwiseAnd %v4uint %9396 %1611\n      %13995 = OpConvertUToF %v4float %19042\n      %19244 = OpVectorTimesScalar %v4float %13995 %float_0_00392156886\n       %8616 = OpCompositeExtract %uint %10946 1\n      %24852 = OpCompositeConstruct %v4uint %8616 %8616 %8616 %8616\n       %9397 = OpShiftRightLogical %v4uint %24852 %653\n      %19043 = OpBitwiseAnd %v4uint %9397 %1611\n      %13996 = OpConvertUToF %v4float %19043\n      %19245 = OpVectorTimesScalar %v4float %13996 %float_0_00392156886\n       %8617 = OpCompositeExtract %uint %10946 2\n      %24853 = OpCompositeConstruct %v4uint %8617 %8617 %8617 %8617\n       %9398 = OpShiftRightLogical %v4uint %24853 %653\n      %19044 = OpBitwiseAnd %v4uint %9398 %1611\n      %13997 = OpConvertUToF %v4float %19044\n      %19246 = OpVectorTimesScalar %v4float %13997 %float_0_00392156886\n       %8618 = OpCompositeExtract %uint %10946 3\n      %24854 = OpCompositeConstruct %v4uint %8618 %8618 %8618 %8618\n       %9399 = OpShiftRightLogical %v4uint %24854 %653\n      %19045 = OpBitwiseAnd %v4uint %9399 %1611\n      %17181 = OpConvertUToF %v4float %19045\n      %12437 = OpVectorTimesScalar %v4float %17181 %float_0_00392156886\n               OpBranch %16227\n      %19454 = OpLabel\n      %12438 = OpCompositeExtract %uint %10946 0\n      %20465 = OpBitcast %float %12438\n      %17215 = OpCompositeConstruct %v2float %20465 %float_0\n      %11673 = OpVectorShuffle %v4float %17215 %17215 0 1 1 1\n      %22202 = OpCompositeExtract %uint %10946 1\n      %16241 = OpBitcast %float %22202\n      %17216 = OpCompositeConstruct %v2float %16241 %float_0\n      %11674 = OpVectorShuffle %v4float %17216 %17216 0 1 1 1\n      %22203 = OpCompositeExtract %uint %10946 2\n      %16242 = OpBitcast %float %22203\n      %17217 = OpCompositeConstruct %v2float %16242 %float_0\n      %11675 = OpVectorShuffle %v4float %17217 %17217 0 1 1 1\n      %22204 = OpCompositeExtract %uint %10946 3\n      %16243 = OpBitcast %float %22204\n      %20401 = OpCompositeConstruct %v2float %16243 %float_0\n      %23101 = OpVectorShuffle %v4float %20401 %20401 0 1 1 1\n               OpBranch %16227\n      %16227 = OpLabel\n      %11184 = OpPhi %v4float %23101 %19454 %12437 %14588 %9890 %7361 %9050 %7360 %9049 %8193 %9048 %8249\n      %14353 = OpPhi %v4float %11675 %19454 %19246 %14588 %16699 %7361 %15845 %7360 %16681 %8193 %14624 %8249\n      %15235 = OpPhi %v4float %11674 %19454 %19245 %14588 %16698 %7361 %15844 %7360 %16680 %8193 %14623 %8249\n      %14524 = OpPhi %v4float %11673 %19454 %19244 %14588 %16697 %7361 %15843 %7360 %16679 %8193 %14622 %8249\n               OpBranch %21266\n      %15208 = OpLabel\n      %21587 = OpIEqual %bool %6555 %uint_8\n               OpSelectionMerge %20265 DontFlatten\n               OpBranchConditional %21587 %6598 %8966\n       %8966 = OpLabel\n      %22071 = OpShiftRightLogical %uint %16376 %int_2\n      %13383 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22071\n      %12631 = OpLoad %uint %13383\n      %11729 = OpIAdd %uint %22071 %uint_1\n       %6422 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11729\n       %7033 = OpLoad %uint %6422\n       %8524 = OpIAdd %uint %16376 %6555\n      %21677 = OpShiftRightLogical %uint %8524 %int_2\n      %19613 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21677\n      %12632 = OpLoad %uint %19613\n      %11730 = OpIAdd %uint %21677 %uint_1\n      %24590 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11730\n      %14160 = OpLoad %uint %24590\n      %19674 = OpCompositeConstruct %v4uint %12631 %7033 %12632 %14160\n      %19502 = OpIMul %uint %uint_2 %6555\n      %10824 = OpIAdd %uint %16376 %19502\n      %17904 = OpShiftRightLogical %uint %10824 %int_2\n      %19614 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17904\n      %12633 = OpLoad %uint %19614\n      %11731 = OpIAdd %uint %17904 %uint_1\n       %6478 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11731\n      %24158 = OpLoad %uint %6478\n       %8696 = OpIMul %uint %uint_3 %6555\n      %24266 = OpIAdd %uint %16376 %8696\n      %17905 = OpShiftRightLogical %uint %24266 %int_2\n      %19615 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17905\n      %12634 = OpLoad %uint %19615\n      %11732 = OpIAdd %uint %17905 %uint_1\n      %24591 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11732\n      %16389 = OpLoad %uint %24591\n      %20794 = OpCompositeConstruct %v4uint %12633 %24158 %12634 %16389\n               OpBranch %20265\n       %6598 = OpLabel\n      %24493 = OpShiftRightLogical %uint %16376 %int_2\n      %13384 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24493\n      %12635 = OpLoad %uint %13384\n      %11733 = OpIAdd %uint %24493 %uint_1\n       %6423 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11733\n      %23670 = OpLoad %uint %6423\n      %11734 = OpIAdd %uint %24493 %uint_2\n       %6424 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11734\n      %23671 = OpLoad %uint %6424\n      %11735 = OpIAdd %uint %24493 %uint_3\n      %24592 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11735\n      %14083 = OpLoad %uint %24592\n      %21619 = OpCompositeConstruct %v4uint %12635 %23670 %23671 %14083\n      %19334 = OpIAdd %uint %16376 %uint_16\n       %8240 = OpShiftRightLogical %uint %19334 %int_2\n      %19616 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %8240\n      %12636 = OpLoad %uint %19616\n      %11736 = OpIAdd %uint %8240 %uint_1\n       %6425 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11736\n      %23672 = OpLoad %uint %6425\n      %11737 = OpIAdd %uint %8240 %uint_2\n       %6426 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11737\n      %23673 = OpLoad %uint %6426\n      %11738 = OpIAdd %uint %8240 %uint_3\n      %24593 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11738\n      %16390 = OpLoad %uint %24593\n      %20795 = OpCompositeConstruct %v4uint %12636 %23672 %23673 %16390\n               OpBranch %20265\n      %20265 = OpLabel\n      %11216 = OpPhi %v4uint %20795 %6598 %20794 %8966\n      %14115 = OpPhi %v4uint %21619 %6598 %19674 %8966\n               OpSelectionMerge %20266 None\n               OpSwitch %8576 %20313 5 %8539 7 %8250\n       %8250 = OpLabel\n      %24417 = OpCompositeExtract %uint %14115 0\n      %24686 = OpExtInst %v2float %1 UnpackHalf2x16 %24417\n      %10122 = OpCompositeExtract %float %24686 0\n      %16068 = OpCompositeExtract %float %24686 1\n      %17037 = OpCompositeExtract %uint %14115 1\n      %15617 = OpExtInst %v2float %1 UnpackHalf2x16 %17037\n      %10123 = OpCompositeExtract %float %15617 0\n      %17499 = OpCompositeExtract %float %15617 1\n      %14625 = OpCompositeConstruct %v4float %10122 %16068 %10123 %17499\n      %17295 = OpCompositeExtract %uint %14115 2\n      %18048 = OpExtInst %v2float %1 UnpackHalf2x16 %17295\n      %10124 = OpCompositeExtract %float %18048 0\n      %16069 = OpCompositeExtract %float %18048 1\n      %17038 = OpCompositeExtract %uint %14115 3\n      %15618 = OpExtInst %v2float %1 UnpackHalf2x16 %17038\n      %10125 = OpCompositeExtract %float %15618 0\n      %17500 = OpCompositeExtract %float %15618 1\n      %14626 = OpCompositeConstruct %v4float %10124 %16069 %10125 %17500\n      %17296 = OpCompositeExtract %uint %11216 0\n      %18049 = OpExtInst %v2float %1 UnpackHalf2x16 %17296\n      %10126 = OpCompositeExtract %float %18049 0\n      %16070 = OpCompositeExtract %float %18049 1\n      %17039 = OpCompositeExtract %uint %11216 1\n      %15619 = OpExtInst %v2float %1 UnpackHalf2x16 %17039\n      %10127 = OpCompositeExtract %float %15619 0\n      %17501 = OpCompositeExtract %float %15619 1\n      %14627 = OpCompositeConstruct %v4float %10126 %16070 %10127 %17501\n      %17297 = OpCompositeExtract %uint %11216 2\n      %18050 = OpExtInst %v2float %1 UnpackHalf2x16 %17297\n      %10128 = OpCompositeExtract %float %18050 0\n      %16071 = OpCompositeExtract %float %18050 1\n      %17040 = OpCompositeExtract %uint %11216 3\n      %15620 = OpExtInst %v2float %1 UnpackHalf2x16 %17040\n      %10129 = OpCompositeExtract %float %15620 0\n      %20677 = OpCompositeExtract %float %15620 1\n       %9051 = OpCompositeConstruct %v4float %10128 %16071 %10129 %20677\n               OpBranch %20266\n       %8539 = OpLabel\n       %9726 = OpVectorShuffle %v2uint %14115 %14115 0 1\n      %23359 = OpBitcast %v2int %9726\n      %24794 = OpVectorShuffle %v4int %23359 %23359 0 0 1 1\n      %18616 = OpShiftLeftLogical %v4int %24794 %290\n      %15769 = OpShiftRightArithmetic %v4int %18616 %770\n      %10951 = OpConvertSToF %v4float %15769\n      %18227 = OpVectorTimesScalar %v4float %10951 %float_0_000976592302\n      %25242 = OpExtInst %v4float %1 FMax %1284 %18227\n      %14196 = OpVectorShuffle %v2uint %14115 %14115 2 3\n       %9416 = OpBitcast %v2int %14196\n      %24795 = OpVectorShuffle %v4int %9416 %9416 0 0 1 1\n      %18617 = OpShiftLeftLogical %v4int %24795 %290\n      %15770 = OpShiftRightArithmetic %v4int %18617 %770\n      %10952 = OpConvertSToF %v4float %15770\n      %18228 = OpVectorTimesScalar %v4float %10952 %float_0_000976592302\n      %25243 = OpExtInst %v4float %1 FMax %1284 %18228\n      %14197 = OpVectorShuffle %v2uint %11216 %11216 0 1\n       %9417 = OpBitcast %v2int %14197\n      %24796 = OpVectorShuffle %v4int %9417 %9417 0 0 1 1\n      %18618 = OpShiftLeftLogical %v4int %24796 %290\n      %15771 = OpShiftRightArithmetic %v4int %18618 %770\n      %10953 = OpConvertSToF %v4float %15771\n      %18229 = OpVectorTimesScalar %v4float %10953 %float_0_000976592302\n      %25244 = OpExtInst %v4float %1 FMax %1284 %18229\n      %14198 = OpVectorShuffle %v2uint %11216 %11216 2 3\n       %9418 = OpBitcast %v2int %14198\n      %24797 = OpVectorShuffle %v4int %9418 %9418 0 0 1 1\n      %18620 = OpShiftLeftLogical %v4int %24797 %290\n      %15772 = OpShiftRightArithmetic %v4int %18620 %770\n      %10954 = OpConvertSToF %v4float %15772\n      %21458 = OpVectorTimesScalar %v4float %10954 %float_0_000976592302\n      %17253 = OpExtInst %v4float %1 FMax %1284 %21458\n               OpBranch %20266\n      %20313 = OpLabel\n       %9764 = OpVectorShuffle %v2uint %14115 %14115 0 1\n      %20829 = OpBitcast %v2float %9764\n       %7047 = OpCompositeExtract %float %20829 0\n      %13427 = OpCompositeExtract %float %20829 1\n      %17041 = OpCompositeConstruct %v4float %7047 %13427 %float_0 %float_0\n      %16865 = OpVectorShuffle %v2uint %14115 %14115 2 3\n      %14182 = OpBitcast %v2float %16865\n       %7048 = OpCompositeExtract %float %14182 0\n      %13428 = OpCompositeExtract %float %14182 1\n      %17042 = OpCompositeConstruct %v4float %7048 %13428 %float_0 %float_0\n      %16866 = OpVectorShuffle %v2uint %11216 %11216 0 1\n      %14183 = OpBitcast %v2float %16866\n       %7049 = OpCompositeExtract %float %14183 0\n      %13429 = OpCompositeExtract %float %14183 1\n      %17043 = OpCompositeConstruct %v4float %7049 %13429 %float_0 %float_0\n      %16867 = OpVectorShuffle %v2uint %11216 %11216 2 3\n      %14184 = OpBitcast %v2float %16867\n       %7050 = OpCompositeExtract %float %14184 0\n      %16651 = OpCompositeExtract %float %14184 1\n       %9052 = OpCompositeConstruct %v4float %7050 %16651 %float_0 %float_0\n               OpBranch %20266\n      %20266 = OpLabel\n      %11185 = OpPhi %v4float %9052 %20313 %17253 %8539 %9051 %8250\n      %14354 = OpPhi %v4float %17043 %20313 %25244 %8539 %14627 %8250\n      %15236 = OpPhi %v4float %17042 %20313 %25243 %8539 %14626 %8250\n      %14525 = OpPhi %v4float %17041 %20313 %25242 %8539 %14625 %8250\n               OpBranch %21266\n      %21266 = OpLabel\n      %11186 = OpPhi %v4float %11185 %20266 %11184 %16227\n      %14355 = OpPhi %v4float %14354 %20266 %14353 %16227\n      %12951 = OpPhi %v4float %15236 %20266 %15235 %16227\n      %13948 = OpPhi %v4float %14525 %20266 %14524 %16227\n      %17243 = OpFAdd %v4float %17242 %13948\n      %23299 = OpFAdd %v4float %23298 %12951\n       %9507 = OpFAdd %v4float %7208 %14355\n       %7799 = OpFAdd %v4float %9642 %11186\n               OpBranch %24267\n      %24267 = OpLabel\n      %11187 = OpPhi %v4float %20755 %21264 %7799 %21266\n      %14356 = OpPhi %v4float %8082 %21264 %9507 %21266\n      %15153 = OpPhi %v4float %23297 %21264 %23299 %21266\n      %15237 = OpPhi %v4float %17241 %21264 %17243 %21266\n      %14526 = OpPhi %float %25083 %21264 %12090 %21266\n               OpBranch %21267\n      %21267 = OpLabel\n      %11188 = OpPhi %v4float %11177 %21263 %11187 %24267\n      %14357 = OpPhi %v4float %14346 %21263 %14356 %24267\n      %15154 = OpPhi %v4float %13804 %21263 %15153 %24267\n      %13196 = OpPhi %v4float %8403 %21263 %15237 %24267\n      %11944 = OpPhi %float %11052 %21263 %14526 %24267\n      %23156 = OpVectorTimesScalar %v4float %13196 %11944\n       %6604 = OpVectorTimesScalar %v4float %15154 %11944\n      %12399 = OpVectorTimesScalar %v4float %14357 %11944\n      %13362 = OpVectorTimesScalar %v4float %11188 %11944\n               OpSelectionMerge %16228 DontFlatten\n               OpBranchConditional %7475 %10049 %16228\n      %10049 = OpLabel\n      %15086 = OpVectorShuffle %v4float %23156 %23156 2 1 0 3\n      %14855 = OpVectorShuffle %v4float %6604 %6604 2 1 0 3\n       %7398 = OpVectorShuffle %v4float %12399 %12399 2 1 0 3\n      %16111 = OpVectorShuffle %v4float %13362 %13362 2 1 0 3\n               OpBranch %16228\n      %16228 = OpLabel\n      %11189 = OpPhi %v4float %13362 %21267 %16111 %10049\n      %14358 = OpPhi %v4float %12399 %21267 %7398 %10049\n      %15191 = OpPhi %v4float %6604 %21267 %14855 %10049\n      %14921 = OpPhi %v4float %23156 %21267 %15086 %10049\n               OpSelectionMerge %18834 None\n               OpSwitch %20627 %7374 3 %17906 4 %6452 5 %6451 10 %7373 15 %12647 24 %9492\n       %9492 = OpLabel\n      %15041 = OpCompositeExtract %float %14921 0\n      %10277 = OpCompositeExtract %float %15191 0\n       %7641 = OpCompositeExtract %float %14358 0\n       %6565 = OpCompositeExtract %float %11189 0\n       %7479 = OpCompositeConstruct %v4float %15041 %10277 %7641 %6565\n      %14406 = OpExtInst %v4float %1 FClamp %7479 %2938 %1285\n      %13687 = OpVectorTimesScalar %v4float %14406 %float_65535\n      %11840 = OpFAdd %v4float %13687 %325\n       %7947 = OpConvertFToU %v4uint %11840\n       %6361 = OpVectorShuffle %v2uint %7947 %7947 0 2\n      %10064 = OpVectorShuffle %v2uint %7947 %7947 1 3\n      %13638 = OpShiftLeftLogical %v2uint %10064 %2151\n      %15653 = OpBitwiseOr %v2uint %6361 %13638\n               OpBranch %18834\n      %12647 = OpLabel\n       %7311 = OpExtInst %v4float %1 FClamp %14921 %2938 %1285\n      %20339 = OpVectorTimesScalar %v4float %7311 %float_15\n      %11878 = OpFAdd %v4float %20339 %325\n       %7639 = OpConvertFToU %v4uint %11878\n       %8700 = OpCompositeExtract %uint %7639 0\n      %12251 = OpCompositeExtract %uint %7639 1\n      %11561 = OpShiftLeftLogical %uint %12251 %int_4\n      %19814 = OpBitwiseOr %uint %8700 %11561\n      %21476 = OpCompositeExtract %uint %7639 2\n       %8560 = OpShiftLeftLogical %uint %21476 %int_8\n      %19815 = OpBitwiseOr %uint %19814 %8560\n      %21477 = OpCompositeExtract %uint %7639 3\n       %7292 = OpShiftLeftLogical %uint %21477 %int_12\n       %9255 = OpBitwiseOr %uint %19815 %7292\n       %7522 = OpExtInst %v4float %1 FClamp %15191 %2938 %1285\n       %8264 = OpVectorTimesScalar %v4float %7522 %float_15\n      %11879 = OpFAdd %v4float %8264 %325\n       %7642 = OpConvertFToU %v4uint %11879\n       %8701 = OpCompositeExtract %uint %7642 0\n      %12252 = OpCompositeExtract %uint %7642 1\n      %11562 = OpShiftLeftLogical %uint %12252 %int_4\n      %19816 = OpBitwiseOr %uint %8701 %11562\n      %21478 = OpCompositeExtract %uint %7642 2\n       %8561 = OpShiftLeftLogical %uint %21478 %int_8\n      %19817 = OpBitwiseOr %uint %19816 %8561\n      %21479 = OpCompositeExtract %uint %7642 3\n      %10745 = OpShiftLeftLogical %uint %21479 %int_12\n      %19009 = OpBitwiseOr %uint %19817 %10745\n      %22729 = OpShiftLeftLogical %uint %19009 %uint_16\n       %6254 = OpBitwiseOr %uint %9255 %22729\n       %7523 = OpExtInst %v4float %1 FClamp %14358 %2938 %1285\n       %8265 = OpVectorTimesScalar %v4float %7523 %float_15\n      %11881 = OpFAdd %v4float %8265 %325\n       %7643 = OpConvertFToU %v4uint %11881\n       %8702 = OpCompositeExtract %uint %7643 0\n      %12253 = OpCompositeExtract %uint %7643 1\n      %11563 = OpShiftLeftLogical %uint %12253 %int_4\n      %19818 = OpBitwiseOr %uint %8702 %11563\n      %21480 = OpCompositeExtract %uint %7643 2\n       %8562 = OpShiftLeftLogical %uint %21480 %int_8\n      %19819 = OpBitwiseOr %uint %19818 %8562\n      %21481 = OpCompositeExtract %uint %7643 3\n       %7293 = OpShiftLeftLogical %uint %21481 %int_12\n       %9256 = OpBitwiseOr %uint %19819 %7293\n       %7524 = OpExtInst %v4float %1 FClamp %11189 %2938 %1285\n       %8266 = OpVectorTimesScalar %v4float %7524 %float_15\n      %11882 = OpFAdd %v4float %8266 %325\n       %7644 = OpConvertFToU %v4uint %11882\n       %8703 = OpCompositeExtract %uint %7644 0\n      %12254 = OpCompositeExtract %uint %7644 1\n      %11564 = OpShiftLeftLogical %uint %12254 %int_4\n      %19820 = OpBitwiseOr %uint %8703 %11564\n      %21482 = OpCompositeExtract %uint %7644 2\n       %8563 = OpShiftLeftLogical %uint %21482 %int_8\n      %19821 = OpBitwiseOr %uint %19820 %8563\n      %21483 = OpCompositeExtract %uint %7644 3\n      %10746 = OpShiftLeftLogical %uint %21483 %int_12\n      %19010 = OpBitwiseOr %uint %19821 %10746\n      %23978 = OpShiftLeftLogical %uint %19010 %uint_16\n      %17993 = OpBitwiseOr %uint %9256 %23978\n      %21469 = OpCompositeConstruct %v2uint %6254 %17993\n               OpBranch %18834\n       %7373 = OpLabel\n      %19885 = OpCompositeExtract %float %14921 0\n      %10278 = OpCompositeExtract %float %14921 1\n       %7645 = OpCompositeExtract %float %15191 0\n       %6566 = OpCompositeExtract %float %15191 1\n       %7480 = OpCompositeConstruct %v4float %19885 %10278 %7645 %6566\n      %14407 = OpExtInst %v4float %1 FClamp %7480 %2938 %1285\n      %13688 = OpVectorTimesScalar %v4float %14407 %float_255\n      %11883 = OpFAdd %v4float %13688 %325\n       %7646 = OpConvertFToU %v4uint %11883\n       %8704 = OpCompositeExtract %uint %7646 0\n      %12255 = OpCompositeExtract %uint %7646 1\n      %11565 = OpShiftLeftLogical %uint %12255 %int_8\n      %19822 = OpBitwiseOr %uint %8704 %11565\n      %21484 = OpCompositeExtract %uint %7646 2\n       %8564 = OpShiftLeftLogical %uint %21484 %int_16\n      %19823 = OpBitwiseOr %uint %19822 %8564\n      %21485 = OpCompositeExtract %uint %7646 3\n       %8565 = OpShiftLeftLogical %uint %21485 %int_24\n      %17629 = OpBitwiseOr %uint %19823 %8565\n      %20096 = OpCompositeExtract %float %14358 0\n      %23730 = OpCompositeExtract %float %14358 1\n       %7647 = OpCompositeExtract %float %11189 0\n       %6567 = OpCompositeExtract %float %11189 1\n       %7481 = OpCompositeConstruct %v4float %20096 %23730 %7647 %6567\n      %14408 = OpExtInst %v4float %1 FClamp %7481 %2938 %1285\n      %13689 = OpVectorTimesScalar %v4float %14408 %float_255\n      %11884 = OpFAdd %v4float %13689 %325\n       %7648 = OpConvertFToU %v4uint %11884\n       %8705 = OpCompositeExtract %uint %7648 0\n      %12256 = OpCompositeExtract %uint %7648 1\n      %11566 = OpShiftLeftLogical %uint %12256 %int_8\n      %19824 = OpBitwiseOr %uint %8705 %11566\n      %21486 = OpCompositeExtract %uint %7648 2\n       %8566 = OpShiftLeftLogical %uint %21486 %int_16\n      %19825 = OpBitwiseOr %uint %19824 %8566\n      %21487 = OpCompositeExtract %uint %7648 3\n       %8541 = OpShiftLeftLogical %uint %21487 %int_24\n      %20994 = OpBitwiseOr %uint %19825 %8541\n      %21470 = OpCompositeConstruct %v2uint %17629 %20994\n               OpBranch %18834\n       %6451 = OpLabel\n       %8655 = OpVectorShuffle %v3float %14921 %14921 0 1 2\n       %6215 = OpExtInst %v3float %1 FClamp %8655 %2605 %2584\n       %7105 = OpFMul %v3float %6215 %958\n       %7962 = OpFAdd %v3float %7105 %939\n      %10066 = OpConvertFToU %v3uint %7962\n       %8706 = OpCompositeExtract %uint %10066 0\n      %12257 = OpCompositeExtract %uint %10066 1\n      %11567 = OpShiftLeftLogical %uint %12257 %int_5\n      %19826 = OpBitwiseOr %uint %8706 %11567\n      %21488 = OpCompositeExtract %uint %10066 2\n       %8525 = OpShiftLeftLogical %uint %21488 %int_10\n      %16707 = OpBitwiseOr %uint %19826 %8525\n       %8866 = OpVectorShuffle %v3float %15191 %15191 0 1 2\n      %19668 = OpExtInst %v3float %1 FClamp %8866 %2605 %2584\n       %7106 = OpFMul %v3float %19668 %958\n       %7963 = OpFAdd %v3float %7106 %939\n      %10067 = OpConvertFToU %v3uint %7963\n       %8707 = OpCompositeExtract %uint %10067 0\n      %12258 = OpCompositeExtract %uint %10067 1\n      %11568 = OpShiftLeftLogical %uint %12258 %int_5\n      %19827 = OpBitwiseOr %uint %8707 %11568\n      %21489 = OpCompositeExtract %uint %10067 2\n      %10747 = OpShiftLeftLogical %uint %21489 %int_10\n      %19011 = OpBitwiseOr %uint %19827 %10747\n      %23959 = OpShiftLeftLogical %uint %19011 %uint_16\n      %13706 = OpBitwiseOr %uint %16707 %23959\n       %8867 = OpVectorShuffle %v3float %14358 %14358 0 1 2\n      %19669 = OpExtInst %v3float %1 FClamp %8867 %2605 %2584\n       %7107 = OpFMul %v3float %19669 %958\n       %7964 = OpFAdd %v3float %7107 %939\n      %10068 = OpConvertFToU %v3uint %7964\n       %8708 = OpCompositeExtract %uint %10068 0\n      %12259 = OpCompositeExtract %uint %10068 1\n      %11569 = OpShiftLeftLogical %uint %12259 %int_5\n      %19828 = OpBitwiseOr %uint %8708 %11569\n      %21490 = OpCompositeExtract %uint %10068 2\n       %8526 = OpShiftLeftLogical %uint %21490 %int_10\n      %16708 = OpBitwiseOr %uint %19828 %8526\n       %8868 = OpVectorShuffle %v3float %11189 %11189 0 1 2\n      %19675 = OpExtInst %v3float %1 FClamp %8868 %2605 %2584\n       %7108 = OpFMul %v3float %19675 %958\n       %7965 = OpFAdd %v3float %7108 %939\n      %10069 = OpConvertFToU %v3uint %7965\n       %8709 = OpCompositeExtract %uint %10069 0\n      %12260 = OpCompositeExtract %uint %10069 1\n      %11570 = OpShiftLeftLogical %uint %12260 %int_5\n      %19829 = OpBitwiseOr %uint %8709 %11570\n      %21491 = OpCompositeExtract %uint %10069 2\n      %10748 = OpShiftLeftLogical %uint %21491 %int_10\n      %19012 = OpBitwiseOr %uint %19829 %10748\n      %23979 = OpShiftLeftLogical %uint %19012 %uint_16\n      %17994 = OpBitwiseOr %uint %16708 %23979\n      %21471 = OpCompositeConstruct %v2uint %13706 %17994\n               OpBranch %18834\n       %6452 = OpLabel\n       %8656 = OpVectorShuffle %v3float %14921 %14921 0 1 2\n       %6216 = OpExtInst %v3float %1 FClamp %8656 %2605 %2584\n       %7109 = OpFMul %v3float %6216 %511\n       %7966 = OpFAdd %v3float %7109 %939\n      %10070 = OpConvertFToU %v3uint %7966\n       %8710 = OpCompositeExtract %uint %10070 0\n      %12261 = OpCompositeExtract %uint %10070 1\n      %11571 = OpShiftLeftLogical %uint %12261 %int_5\n      %19830 = OpBitwiseOr %uint %8710 %11571\n      %21492 = OpCompositeExtract %uint %10070 2\n       %8527 = OpShiftLeftLogical %uint %21492 %int_11\n      %16709 = OpBitwiseOr %uint %19830 %8527\n       %8869 = OpVectorShuffle %v3float %15191 %15191 0 1 2\n      %19676 = OpExtInst %v3float %1 FClamp %8869 %2605 %2584\n       %7110 = OpFMul %v3float %19676 %511\n       %7967 = OpFAdd %v3float %7110 %939\n      %10071 = OpConvertFToU %v3uint %7967\n       %8711 = OpCompositeExtract %uint %10071 0\n      %12262 = OpCompositeExtract %uint %10071 1\n      %11572 = OpShiftLeftLogical %uint %12262 %int_5\n      %19831 = OpBitwiseOr %uint %8711 %11572\n      %21493 = OpCompositeExtract %uint %10071 2\n      %10749 = OpShiftLeftLogical %uint %21493 %int_11\n      %19013 = OpBitwiseOr %uint %19831 %10749\n      %23960 = OpShiftLeftLogical %uint %19013 %uint_16\n      %13707 = OpBitwiseOr %uint %16709 %23960\n       %8870 = OpVectorShuffle %v3float %14358 %14358 0 1 2\n      %19685 = OpExtInst %v3float %1 FClamp %8870 %2605 %2584\n       %7111 = OpFMul %v3float %19685 %511\n       %7968 = OpFAdd %v3float %7111 %939\n      %10072 = OpConvertFToU %v3uint %7968\n       %8712 = OpCompositeExtract %uint %10072 0\n      %12263 = OpCompositeExtract %uint %10072 1\n      %11573 = OpShiftLeftLogical %uint %12263 %int_5\n      %19832 = OpBitwiseOr %uint %8712 %11573\n      %21494 = OpCompositeExtract %uint %10072 2\n       %8528 = OpShiftLeftLogical %uint %21494 %int_11\n      %16710 = OpBitwiseOr %uint %19832 %8528\n       %8872 = OpVectorShuffle %v3float %11189 %11189 0 1 2\n      %19686 = OpExtInst %v3float %1 FClamp %8872 %2605 %2584\n       %7112 = OpFMul %v3float %19686 %511\n       %7969 = OpFAdd %v3float %7112 %939\n      %10073 = OpConvertFToU %v3uint %7969\n       %8713 = OpCompositeExtract %uint %10073 0\n      %12264 = OpCompositeExtract %uint %10073 1\n      %11574 = OpShiftLeftLogical %uint %12264 %int_5\n      %19833 = OpBitwiseOr %uint %8713 %11574\n      %21495 = OpCompositeExtract %uint %10073 2\n      %10750 = OpShiftLeftLogical %uint %21495 %int_11\n      %19014 = OpBitwiseOr %uint %19833 %10750\n      %23980 = OpShiftLeftLogical %uint %19014 %uint_16\n      %17995 = OpBitwiseOr %uint %16710 %23980\n      %21472 = OpCompositeConstruct %v2uint %13707 %17995\n               OpBranch %18834\n      %17906 = OpLabel\n       %8873 = OpExtInst %v4float %1 FClamp %14921 %2938 %1285\n      %17792 = OpFMul %v4float %8873 %2057\n       %7970 = OpFAdd %v4float %17792 %325\n      %10074 = OpConvertFToU %v4uint %7970\n       %8714 = OpCompositeExtract %uint %10074 0\n      %12265 = OpCompositeExtract %uint %10074 1\n      %11575 = OpShiftLeftLogical %uint %12265 %int_5\n      %19834 = OpBitwiseOr %uint %8714 %11575\n      %21496 = OpCompositeExtract %uint %10074 2\n       %8567 = OpShiftLeftLogical %uint %21496 %int_10\n      %19835 = OpBitwiseOr %uint %19834 %8567\n      %21497 = OpCompositeExtract %uint %10074 3\n       %7294 = OpShiftLeftLogical %uint %21497 %int_15\n       %9084 = OpBitwiseOr %uint %19835 %7294\n       %9079 = OpExtInst %v4float %1 FClamp %15191 %2938 %1285\n      %24798 = OpFMul %v4float %9079 %2057\n       %7971 = OpFAdd %v4float %24798 %325\n      %10075 = OpConvertFToU %v4uint %7971\n       %8715 = OpCompositeExtract %uint %10075 0\n      %12266 = OpCompositeExtract %uint %10075 1\n      %11576 = OpShiftLeftLogical %uint %12266 %int_5\n      %19836 = OpBitwiseOr %uint %8715 %11576\n      %21498 = OpCompositeExtract %uint %10075 2\n       %8568 = OpShiftLeftLogical %uint %21498 %int_10\n      %19837 = OpBitwiseOr %uint %19836 %8568\n      %21499 = OpCompositeExtract %uint %10075 3\n      %10751 = OpShiftLeftLogical %uint %21499 %int_15\n      %19015 = OpBitwiseOr %uint %19837 %10751\n      %22730 = OpShiftLeftLogical %uint %19015 %uint_16\n      %25154 = OpBitwiseOr %uint %9084 %22730\n       %9080 = OpExtInst %v4float %1 FClamp %14358 %2938 %1285\n      %24799 = OpFMul %v4float %9080 %2057\n       %7972 = OpFAdd %v4float %24799 %325\n      %10076 = OpConvertFToU %v4uint %7972\n       %8716 = OpCompositeExtract %uint %10076 0\n      %12267 = OpCompositeExtract %uint %10076 1\n      %11577 = OpShiftLeftLogical %uint %12267 %int_5\n      %19838 = OpBitwiseOr %uint %8716 %11577\n      %21500 = OpCompositeExtract %uint %10076 2\n       %8569 = OpShiftLeftLogical %uint %21500 %int_10\n      %19839 = OpBitwiseOr %uint %19838 %8569\n      %21501 = OpCompositeExtract %uint %10076 3\n       %7295 = OpShiftLeftLogical %uint %21501 %int_15\n       %9085 = OpBitwiseOr %uint %19839 %7295\n       %9081 = OpExtInst %v4float %1 FClamp %11189 %2938 %1285\n      %24800 = OpFMul %v4float %9081 %2057\n       %7973 = OpFAdd %v4float %24800 %325\n      %10077 = OpConvertFToU %v4uint %7973\n       %8717 = OpCompositeExtract %uint %10077 0\n      %12268 = OpCompositeExtract %uint %10077 1\n      %11578 = OpShiftLeftLogical %uint %12268 %int_5\n      %19840 = OpBitwiseOr %uint %8717 %11578\n      %21502 = OpCompositeExtract %uint %10077 2\n       %8570 = OpShiftLeftLogical %uint %21502 %int_10\n      %19841 = OpBitwiseOr %uint %19840 %8570\n      %21503 = OpCompositeExtract %uint %10077 3\n      %10752 = OpShiftLeftLogical %uint %21503 %int_15\n      %19016 = OpBitwiseOr %uint %19841 %10752\n      %23981 = OpShiftLeftLogical %uint %19016 %uint_16\n      %17996 = OpBitwiseOr %uint %9085 %23981\n      %21473 = OpCompositeConstruct %v2uint %25154 %17996\n               OpBranch %18834\n       %7374 = OpLabel\n      %19866 = OpCompositeExtract %float %14921 0\n       %9197 = OpCompositeExtract %float %15191 0\n      %19232 = OpCompositeConstruct %v2float %19866 %9197\n       %8571 = OpExtInst %uint %1 PackHalf2x16 %19232\n      %23487 = OpCompositeExtract %float %14358 0\n      %14759 = OpCompositeExtract %float %11189 0\n      %19213 = OpCompositeConstruct %v2float %23487 %14759\n      %11926 = OpExtInst %uint %1 PackHalf2x16 %19213\n      %24879 = OpCompositeConstruct %v2uint %8571 %11926\n               OpBranch %18834\n      %18834 = OpLabel\n      %22706 = OpPhi %v2uint %24879 %7374 %21473 %17906 %21472 %6452 %21471 %6451 %21470 %7373 %21469 %12647 %15653 %9492\n      %19119 = OpIEqual %bool %7640 %uint_0\n      %22246 = OpSelect %bool %19119 %false %19119\n               OpSelectionMerge %19649 DontFlatten\n               OpBranchConditional %22246 %11888 %19649\n      %11888 = OpLabel\n      %19227 = OpCompositeExtract %uint %22706 0\n      %13351 = OpShiftRightLogical %uint %19227 %uint_16\n       %7220 = OpBitwiseAnd %uint %19227 %uint_4294901760\n      %17709 = OpBitwiseOr %uint %13351 %7220\n      %23346 = OpCompositeInsert %v2uint %17709 %22706 0\n               OpBranch %19649\n      %19649 = OpLabel\n      %12383 = OpPhi %v2uint %22706 %18834 %23346 %11888\n      %12967 = OpIAdd %v2uint %12025 %23020\n               OpSelectionMerge %21237 DontFlatten\n               OpBranchConditional %20495 %10574 %21373\n      %21373 = OpLabel\n      %10608 = OpBitcast %v2int %12967\n      %17907 = OpCompositeExtract %int %10608 1\n      %19904 = OpShiftRightArithmetic %int %17907 %int_5\n      %22412 = OpBitcast %int %8444\n       %7938 = OpIMul %int %19904 %22412\n      %25155 = OpCompositeExtract %int %10608 0\n      %20423 = OpShiftRightArithmetic %int %25155 %int_5\n      %18875 = OpIAdd %int %7938 %20423\n       %9546 = OpShiftLeftLogical %int %18875 %int_6\n      %24635 = OpShiftRightArithmetic %int %17907 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25155 %int_7\n      %11041 = OpBitwiseOr %int %21322 %20133\n      %17334 = OpBitwiseOr %int %9546 %11041\n      %24163 = OpShiftLeftLogical %int %17334 %uint_1\n      %12766 = OpShiftRightArithmetic %int %17907 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25155 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %17907 %int_3\n      %20574 = OpBitwiseAnd %int %10425 %int_1\n      %21533 = OpShiftLeftLogical %int %20574 %int_1\n       %8890 = OpBitwiseXor %int %20766 %21533\n      %20598 = OpBitwiseAnd %int %17907 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6551\n       %7168 = OpShiftLeftLogical %int %21575 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24163 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24163 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24163 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24163 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %21237\n      %10574 = OpLabel\n      %19867 = OpCompositeExtract %uint %12967 0\n      %11267 = OpCompositeExtract %uint %12967 1\n       %8414 = OpCompositeConstruct %v3uint %19867 %11267 %24434\n      %20125 = OpBitcast %v3int %8414\n      %11255 = OpCompositeExtract %int %20125 2\n      %19905 = OpShiftRightArithmetic %int %11255 %int_2\n      %22413 = OpBitcast %int %25203\n       %7939 = OpIMul %int %19905 %22413\n      %25156 = OpCompositeExtract %int %20125 1\n      %19055 = OpShiftRightArithmetic %int %25156 %int_4\n      %11053 = OpIAdd %int %7939 %19055\n      %16898 = OpBitcast %int %8444\n      %14944 = OpIMul %int %11053 %16898\n      %25157 = OpCompositeExtract %int %20125 0\n      %20424 = OpShiftRightArithmetic %int %25157 %int_5\n      %18940 = OpIAdd %int %14944 %20424\n       %8797 = OpShiftLeftLogical %int %18940 %int_7\n      %11434 = OpBitwiseAnd %int %11255 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %25156 %int_1\n      %21364 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21364 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %25157 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17335 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17335 %uint_1\n      %13015 = OpShiftRightArithmetic %int %25156 %int_3\n       %9929 = OpBitwiseXor %int %13015 %19905\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %25157 %int_3\n      %20575 = OpBitwiseAnd %int %9616 %int_3\n      %21534 = OpShiftLeftLogical %int %16793 %int_1\n       %8891 = OpBitwiseXor %int %20575 %21534\n      %20599 = OpBitwiseAnd %int %25156 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6552\n       %7169 = OpShiftLeftLogical %int %16793 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24144 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24144 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24144 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24144 %int_8\n      %10279 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10279\n      %16870 = OpBitcast %uint %15226\n               OpBranch %21237\n      %21237 = OpLabel\n      %11376 = OpPhi %uint %16870 %10574 %16869 %21373\n      %20616 = OpIAdd %uint %11376 %25270\n      %20138 = OpShiftRightLogical %uint %20616 %int_3\n      %19356 = OpIEqual %bool %19164 %uint_1\n               OpSelectionMerge %11416 None\n               OpBranchConditional %19356 %10583 %11416\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v2uint %12383 %2326\n       %9425 = OpShiftLeftLogical %v2uint %18271 %1975\n      %20652 = OpBitwiseAnd %v2uint %12383 %2888\n      %17549 = OpShiftRightLogical %v2uint %20652 %1975\n      %16377 = OpBitwiseOr %v2uint %9425 %17549\n               OpBranch %11416\n      %11416 = OpLabel\n      %19767 = OpPhi %v2uint %12383 %21237 %16377 %10583\n       %8054 = OpAccessChain %_ptr_Uniform_v2uint %xe_resolve_dest %int_0 %20138\n               OpStore %8054 %19767\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t resolve_full_16bpp_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x000062B7, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000008, 0x00000008, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x0000040B, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x00090006, 0x0000040B, 0x00000000, 0x725F6578,\n    0x6C6F7365, 0x655F6576, 0x6D617264, 0x666E695F, 0x0000006F, 0x000A0006,\n    0x0000040B, 0x00000001, 0x725F6578, 0x6C6F7365, 0x635F6576, 0x64726F6F,\n    0x74616E69, 0x6E695F65, 0x00006F66, 0x00090006, 0x0000040B, 0x00000002,\n    0x725F6578, 0x6C6F7365, 0x645F6576, 0x5F747365, 0x6F666E69, 0x00000000,\n    0x000B0006, 0x0000040B, 0x00000003, 0x725F6578, 0x6C6F7365, 0x645F6576,\n    0x5F747365, 0x726F6F63, 0x616E6964, 0x695F6574, 0x006F666E, 0x00090006,\n    0x0000040B, 0x00000004, 0x725F6578, 0x6C6F7365, 0x645F6576, 0x5F747365,\n    0x65736162, 0x00000000, 0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F,\n    0x5F737473, 0x00006578, 0x00090005, 0x0000079C, 0x725F6578, 0x6C6F7365,\n    0x655F6576, 0x6D617264, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x0000079C, 0x00000000, 0x61746164, 0x00000000, 0x00070005, 0x00000CC7,\n    0x725F6578, 0x6C6F7365, 0x655F6576, 0x6D617264, 0x00000000, 0x00080005,\n    0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F, 0x496E6F69,\n    0x00000044, 0x00090005, 0x000007A8, 0x725F6578, 0x6C6F7365, 0x645F6576,\n    0x5F747365, 0x625F6578, 0x6B636F6C, 0x00000000, 0x00050006, 0x000007A8,\n    0x00000000, 0x61746164, 0x00000000, 0x00060005, 0x00001592, 0x725F6578,\n    0x6C6F7365, 0x645F6576, 0x00747365, 0x00030047, 0x0000040B, 0x00000002,\n    0x00050048, 0x0000040B, 0x00000000, 0x00000023, 0x00000000, 0x00050048,\n    0x0000040B, 0x00000001, 0x00000023, 0x00000004, 0x00050048, 0x0000040B,\n    0x00000002, 0x00000023, 0x00000008, 0x00050048, 0x0000040B, 0x00000003,\n    0x00000023, 0x0000000C, 0x00050048, 0x0000040B, 0x00000004, 0x00000023,\n    0x00000010, 0x00040047, 0x000007D0, 0x00000006, 0x00000004, 0x00030047,\n    0x0000079C, 0x00000003, 0x00040048, 0x0000079C, 0x00000000, 0x00000018,\n    0x00050048, 0x0000079C, 0x00000000, 0x00000023, 0x00000000, 0x00030047,\n    0x00000CC7, 0x00000018, 0x00040047, 0x00000CC7, 0x00000021, 0x00000000,\n    0x00040047, 0x00000CC7, 0x00000022, 0x00000000, 0x00040047, 0x00000F48,\n    0x0000000B, 0x0000001C, 0x00040047, 0x000007D6, 0x00000006, 0x00000008,\n    0x00030047, 0x000007A8, 0x00000003, 0x00040048, 0x000007A8, 0x00000000,\n    0x00000019, 0x00050048, 0x000007A8, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x00001592, 0x00000019, 0x00040047, 0x00001592, 0x00000021,\n    0x00000000, 0x00040047, 0x00001592, 0x00000022, 0x00000001, 0x00040047,\n    0x00000AC8, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000C, 0x00000020, 0x00000001,\n    0x00040017, 0x00000012, 0x0000000C, 0x00000002, 0x00040015, 0x0000000B,\n    0x00000020, 0x00000000, 0x00040017, 0x00000011, 0x0000000B, 0x00000002,\n    0x00040017, 0x00000014, 0x0000000B, 0x00000003, 0x00040017, 0x00000017,\n    0x0000000B, 0x00000004, 0x00030016, 0x0000000D, 0x00000020, 0x00040017,\n    0x00000013, 0x0000000D, 0x00000002, 0x00040017, 0x00000018, 0x0000000D,\n    0x00000003, 0x00040017, 0x0000001D, 0x0000000D, 0x00000004, 0x00020014,\n    0x00000009, 0x00040017, 0x00000016, 0x0000000C, 0x00000003, 0x0004002B,\n    0x0000000D, 0x00000A0C, 0x00000000, 0x0004002B, 0x0000000D, 0x0000008A,\n    0x3F800000, 0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001, 0x0004002B,\n    0x0000000B, 0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B, 0x00000A22,\n    0x00000008, 0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00, 0x0004002B,\n    0x0000000D, 0x000005B1, 0x41F80000, 0x0007002C, 0x0000001D, 0x00000809,\n    0x000005B1, 0x000005B1, 0x000005B1, 0x0000008A, 0x0004002B, 0x0000000D,\n    0x000000FC, 0x3F000000, 0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000,\n    0x0004002B, 0x0000000C, 0x00000A1A, 0x00000005, 0x0004002B, 0x0000000B,\n    0x00000A10, 0x00000002, 0x0004002B, 0x0000000C, 0x00000A29, 0x0000000A,\n    0x0004002B, 0x0000000B, 0x00000A13, 0x00000003, 0x0004002B, 0x0000000C,\n    0x00000A38, 0x0000000F, 0x0004002B, 0x0000000D, 0x00000770, 0x427C0000,\n    0x0006002C, 0x00000018, 0x000001FF, 0x000005B1, 0x00000770, 0x000005B1,\n    0x0004002B, 0x0000000C, 0x00000A2C, 0x0000000B, 0x0006002C, 0x00000018,\n    0x000003BE, 0x000005B1, 0x000005B1, 0x00000770, 0x0004002B, 0x0000000D,\n    0x00000540, 0x437F0000, 0x0004002B, 0x0000000C, 0x00000A23, 0x00000008,\n    0x0004002B, 0x0000000C, 0x00000A3B, 0x00000010, 0x0004002B, 0x0000000C,\n    0x00000A53, 0x00000018, 0x0004002B, 0x0000000D, 0x000001C1, 0x41700000,\n    0x0004002B, 0x0000000C, 0x00000A17, 0x00000004, 0x0004002B, 0x0000000C,\n    0x00000A2F, 0x0000000C, 0x0004002B, 0x0000000D, 0x0000022D, 0x477FFF00,\n    0x0004002B, 0x0000000B, 0x00000A3A, 0x00000010, 0x0004002B, 0x0000000B,\n    0x00000A52, 0x00000018, 0x0007002C, 0x00000017, 0x0000028D, 0x00000A0A,\n    0x00000A22, 0x00000A3A, 0x00000A52, 0x0004002B, 0x0000000B, 0x00000144,\n    0x000000FF, 0x0004002B, 0x0000000D, 0x0000017A, 0x3B808081, 0x0004002B,\n    0x0000000B, 0x00000A28, 0x0000000A, 0x0004002B, 0x0000000B, 0x00000A46,\n    0x00000014, 0x0004002B, 0x0000000B, 0x00000A64, 0x0000001E, 0x0007002C,\n    0x00000017, 0x0000034D, 0x00000A0A, 0x00000A28, 0x00000A46, 0x00000A64,\n    0x0004002B, 0x0000000B, 0x00000A44, 0x000003FF, 0x0007002C, 0x00000017,\n    0x0000027B, 0x00000A44, 0x00000A44, 0x00000A44, 0x00000A13, 0x0004002B,\n    0x0000000D, 0x000006FE, 0x3A802008, 0x0004002B, 0x0000000D, 0x00000149,\n    0x3EAAAAAB, 0x0007002C, 0x0000001D, 0x00000AEE, 0x000006FE, 0x000006FE,\n    0x000006FE, 0x00000149, 0x0006002C, 0x00000014, 0x00000BB4, 0x00000A0A,\n    0x00000A28, 0x00000A46, 0x0004002B, 0x0000000B, 0x00000B87, 0x0000007F,\n    0x0004002B, 0x0000000B, 0x00000A1F, 0x00000007, 0x00040017, 0x00000010,\n    0x00000009, 0x00000003, 0x0004002B, 0x0000000B, 0x00000B7E, 0x0000007C,\n    0x0004002B, 0x0000000B, 0x00000A4F, 0x00000017, 0x0004002B, 0x0000000D,\n    0x00000341, 0xBF800000, 0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000,\n    0x0005002C, 0x00000012, 0x000007A7, 0x00000A3B, 0x00000A0B, 0x0004002B,\n    0x0000000D, 0x000007FE, 0x3A800100, 0x00040017, 0x0000001A, 0x0000000C,\n    0x00000004, 0x0007002C, 0x0000001A, 0x00000122, 0x00000A3B, 0x00000A0B,\n    0x00000A3B, 0x00000A0B, 0x0005002C, 0x00000011, 0x0000072D, 0x00000A10,\n    0x00000A0D, 0x00040017, 0x0000000F, 0x00000009, 0x00000002, 0x0005002C,\n    0x00000011, 0x0000070F, 0x00000A0A, 0x00000A0A, 0x0005002C, 0x00000011,\n    0x00000724, 0x00000A0D, 0x00000A0D, 0x0005002C, 0x00000011, 0x00000718,\n    0x00000A0D, 0x00000A0A, 0x0004002B, 0x0000000B, 0x00000AFA, 0x00000050,\n    0x0005002C, 0x00000011, 0x00000A9F, 0x00000AFA, 0x00000A3A, 0x0004002B,\n    0x0000000C, 0x00000A11, 0x00000002, 0x0004002B, 0x0000000C, 0x00000A1D,\n    0x00000006, 0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001, 0x0004002B,\n    0x0000000C, 0x00000A20, 0x00000007, 0x0004002B, 0x0000000C, 0x00000A14,\n    0x00000003, 0x0007001E, 0x0000040B, 0x0000000B, 0x0000000B, 0x0000000B,\n    0x0000000B, 0x0000000B, 0x00040020, 0x00000688, 0x00000009, 0x0000040B,\n    0x0004003B, 0x00000688, 0x00000CE9, 0x00000009, 0x00040020, 0x00000288,\n    0x00000009, 0x0000000B, 0x0004002B, 0x0000000B, 0x00000A31, 0x0000000D,\n    0x0004002B, 0x0000000B, 0x00000A81, 0x000007FF, 0x0004002B, 0x0000000B,\n    0x00000A37, 0x0000000F, 0x0004002B, 0x0000000B, 0x00000A5E, 0x0000001C,\n    0x0004002B, 0x0000000B, 0x00000A16, 0x00000004, 0x0005002C, 0x00000011,\n    0x0000073F, 0x00000A0A, 0x00000A16, 0x0004002B, 0x0000000B, 0x00000A19,\n    0x00000005, 0x0004002B, 0x0000000B, 0x00000AC7, 0x0000003F, 0x0004002B,\n    0x0000000C, 0x00000A59, 0x0000001A, 0x0004002B, 0x0000000C, 0x00000A50,\n    0x00000017, 0x0004002B, 0x0000000B, 0x00000926, 0x01000000, 0x0005002C,\n    0x00000011, 0x000008E3, 0x00000A46, 0x00000A52, 0x0003002A, 0x00000009,\n    0x00000787, 0x0003001D, 0x000007D0, 0x0000000B, 0x0003001E, 0x0000079C,\n    0x000007D0, 0x00040020, 0x00000A1B, 0x00000002, 0x0000079C, 0x0004003B,\n    0x00000A1B, 0x00000CC7, 0x00000002, 0x00040020, 0x00000289, 0x00000002,\n    0x0000000B, 0x0004002B, 0x0000000B, 0x00000207, 0x00000140, 0x0004002B,\n    0x0000000B, 0x00000A1C, 0x00000006, 0x00040020, 0x00000291, 0x00000001,\n    0x00000014, 0x0004003B, 0x00000291, 0x00000F48, 0x00000001, 0x0005002C,\n    0x00000011, 0x00000721, 0x00000A10, 0x00000A0A, 0x0004002B, 0x0000000B,\n    0x0000068D, 0xFFFF0000, 0x0003001D, 0x000007D6, 0x00000011, 0x0003001E,\n    0x000007A8, 0x000007D6, 0x00040020, 0x00000A25, 0x00000002, 0x000007A8,\n    0x0004003B, 0x00000A25, 0x00001592, 0x00000002, 0x00040020, 0x0000028E,\n    0x00000002, 0x00000011, 0x0006002C, 0x00000014, 0x00000AC8, 0x00000A22,\n    0x00000A22, 0x00000A0D, 0x0005002C, 0x00000011, 0x000007A2, 0x00000A37,\n    0x00000A0D, 0x0005002C, 0x00000011, 0x0000074E, 0x00000A13, 0x00000A13,\n    0x0005002C, 0x00000011, 0x0000084A, 0x00000A37, 0x00000A37, 0x0007002C,\n    0x0000001D, 0x00000504, 0x00000341, 0x00000341, 0x00000341, 0x00000341,\n    0x0007002C, 0x0000001A, 0x00000302, 0x00000A3B, 0x00000A3B, 0x00000A3B,\n    0x00000A3B, 0x0007002C, 0x00000017, 0x0000064B, 0x00000144, 0x00000144,\n    0x00000144, 0x00000144, 0x0006002C, 0x00000014, 0x00000105, 0x00000A44,\n    0x00000A44, 0x00000A44, 0x0006002C, 0x00000014, 0x00000466, 0x00000B87,\n    0x00000B87, 0x00000B87, 0x0006002C, 0x00000014, 0x00000B0C, 0x00000A1F,\n    0x00000A1F, 0x00000A1F, 0x0006002C, 0x00000014, 0x00000A12, 0x00000A0A,\n    0x00000A0A, 0x00000A0A, 0x0006002C, 0x00000014, 0x000003FA, 0x00000B7E,\n    0x00000B7E, 0x00000B7E, 0x0006002C, 0x00000014, 0x00000189, 0x00000A4F,\n    0x00000A4F, 0x00000A4F, 0x0006002C, 0x00000014, 0x0000008D, 0x00000A3A,\n    0x00000A3A, 0x00000A3A, 0x0005002C, 0x00000013, 0x00000049, 0x00000341,\n    0x00000341, 0x0005002C, 0x00000012, 0x00000867, 0x00000A3B, 0x00000A3B,\n    0x0007002C, 0x0000001D, 0x00000B7A, 0x00000A0C, 0x00000A0C, 0x00000A0C,\n    0x00000A0C, 0x0007002C, 0x0000001D, 0x00000505, 0x0000008A, 0x0000008A,\n    0x0000008A, 0x0000008A, 0x0007002C, 0x0000001D, 0x00000145, 0x000000FC,\n    0x000000FC, 0x000000FC, 0x000000FC, 0x0006002C, 0x00000018, 0x00000A2D,\n    0x00000A0C, 0x00000A0C, 0x00000A0C, 0x0006002C, 0x00000018, 0x00000A18,\n    0x0000008A, 0x0000008A, 0x0000008A, 0x0006002C, 0x00000018, 0x000003AB,\n    0x000000FC, 0x000000FC, 0x000000FC, 0x0005002C, 0x00000011, 0x00000916,\n    0x000008A6, 0x000008A6, 0x0005002C, 0x00000011, 0x000007B7, 0x00000A22,\n    0x00000A22, 0x0005002C, 0x00000011, 0x00000B48, 0x000005FD, 0x000005FD,\n    0x0004002B, 0x0000000C, 0x00000089, 0x3F800000, 0x0004002B, 0x0000000B,\n    0x00000184, 0x00000500, 0x0004002B, 0x0000000B, 0x0000086E, 0x00280000,\n    0x0004002B, 0x0000000B, 0x000009F8, 0xFFFFFFFA, 0x0006002C, 0x00000014,\n    0x00000938, 0x000009F8, 0x000009F8, 0x000009F8, 0x0004002B, 0x0000000B,\n    0x00000237, 0x00000150, 0x0004002B, 0x0000000D, 0x0000016E, 0x3E800000,\n    0x00050036, 0x00000008, 0x0000161F, 0x00000000, 0x00000502, 0x000200F8,\n    0x00003B06, 0x000300F7, 0x00004C7A, 0x00000000, 0x000300FB, 0x00000A0A,\n    0x00002E68, 0x000200F8, 0x00002E68, 0x00050041, 0x00000288, 0x000056E5,\n    0x00000CE9, 0x00000A0B, 0x0004003D, 0x0000000B, 0x00003D0B, 0x000056E5,\n    0x00050041, 0x00000288, 0x000058AC, 0x00000CE9, 0x00000A0E, 0x0004003D,\n    0x0000000B, 0x00005158, 0x000058AC, 0x000500C7, 0x0000000B, 0x00005051,\n    0x00003D0B, 0x00000A44, 0x000500C2, 0x0000000B, 0x00004E0A, 0x00003D0B,\n    0x00000A28, 0x000500C7, 0x0000000B, 0x0000217E, 0x00004E0A, 0x00000A13,\n    0x000500C2, 0x0000000B, 0x0000520A, 0x00003D0B, 0x00000A31, 0x000500C7,\n    0x0000000B, 0x0000217F, 0x0000520A, 0x00000A81, 0x000500C2, 0x0000000B,\n    0x0000520B, 0x00003D0B, 0x00000A52, 0x000500C7, 0x0000000B, 0x00002180,\n    0x0000520B, 0x00000A37, 0x000500C2, 0x0000000B, 0x00004994, 0x00003D0B,\n    0x00000A5E, 0x000500C7, 0x0000000B, 0x000023AA, 0x00004994, 0x00000A0D,\n    0x00050050, 0x00000011, 0x000022A7, 0x00005158, 0x00005158, 0x000500C2,\n    0x00000011, 0x00002568, 0x000022A7, 0x0000073F, 0x000500C7, 0x00000011,\n    0x00005B53, 0x00002568, 0x000007A2, 0x000500C4, 0x00000011, 0x00003F4F,\n    0x00005B53, 0x0000074E, 0x00050084, 0x00000011, 0x000059EB, 0x00003F4F,\n    0x00000724, 0x000500C2, 0x0000000B, 0x00003213, 0x00005158, 0x00000A19,\n    0x000500C7, 0x0000000B, 0x00003F4C, 0x00003213, 0x00000A81, 0x00050041,\n    0x00000288, 0x0000492C, 0x00000CE9, 0x00000A11, 0x0004003D, 0x0000000B,\n    0x00005EAC, 0x0000492C, 0x00050041, 0x00000288, 0x000058AD, 0x00000CE9,\n    0x00000A14, 0x0004003D, 0x0000000B, 0x000051B7, 0x000058AD, 0x000500C7,\n    0x0000000B, 0x00004ADC, 0x00005EAC, 0x00000A1F, 0x000500C7, 0x0000000B,\n    0x000055EF, 0x00005EAC, 0x00000A22, 0x000500AB, 0x00000009, 0x0000500F,\n    0x000055EF, 0x00000A0A, 0x000500C2, 0x0000000B, 0x00002843, 0x00005EAC,\n    0x00000A16, 0x000500C7, 0x0000000B, 0x00005F72, 0x00002843, 0x00000A1F,\n    0x000500C2, 0x0000000B, 0x00004CD8, 0x00005EAC, 0x00000A1F, 0x000500C7,\n    0x0000000B, 0x00005093, 0x00004CD8, 0x00000AC7, 0x0004007C, 0x0000000C,\n    0x00005988, 0x00005EAC, 0x000500C4, 0x0000000C, 0x0000358F, 0x00005988,\n    0x00000A29, 0x000500C3, 0x0000000C, 0x0000509C, 0x0000358F, 0x00000A59,\n    0x000500C4, 0x0000000C, 0x00004702, 0x0000509C, 0x00000A50, 0x00050080,\n    0x0000000C, 0x00001D26, 0x00004702, 0x00000089, 0x0004007C, 0x0000000D,\n    0x00002B2C, 0x00001D26, 0x000500C7, 0x0000000B, 0x00005879, 0x00005EAC,\n    0x00000926, 0x000500AB, 0x00000009, 0x00001D33, 0x00005879, 0x00000A0A,\n    0x000500C7, 0x0000000B, 0x000020FC, 0x000051B7, 0x00000A44, 0x000500C2,\n    0x0000000B, 0x00002F90, 0x000051B7, 0x00000A28, 0x000500C7, 0x0000000B,\n    0x000061CE, 0x00002F90, 0x00000A44, 0x000500C4, 0x0000000B, 0x00006273,\n    0x000061CE, 0x00000A0E, 0x00050050, 0x00000011, 0x000028B6, 0x000051B7,\n    0x000051B7, 0x000500C2, 0x00000011, 0x00002891, 0x000028B6, 0x000008E3,\n    0x000500C7, 0x00000011, 0x00005B54, 0x00002891, 0x0000084A, 0x000500C4,\n    0x00000011, 0x00003F50, 0x00005B54, 0x0000074E, 0x00050084, 0x00000011,\n    0x000059EC, 0x00003F50, 0x00000724, 0x000500C2, 0x0000000B, 0x00003214,\n    0x000051B7, 0x00000A5E, 0x000500C7, 0x0000000B, 0x00003F4D, 0x00003214,\n    0x00000A1F, 0x00050041, 0x00000288, 0x000048E0, 0x00000CE9, 0x00000A17,\n    0x0004003D, 0x0000000B, 0x000062B6, 0x000048E0, 0x0004003D, 0x00000014,\n    0x0000374F, 0x00000F48, 0x0007004F, 0x00000011, 0x00003180, 0x0000374F,\n    0x0000374F, 0x00000000, 0x00000001, 0x000500C4, 0x00000011, 0x00002EF9,\n    0x00003180, 0x00000721, 0x00050051, 0x0000000B, 0x00001DD8, 0x00002EF9,\n    0x00000000, 0x000500C4, 0x0000000B, 0x00002D8A, 0x00003F4C, 0x00000A13,\n    0x000500AE, 0x00000009, 0x00003C13, 0x00001DD8, 0x00002D8A, 0x000300F7,\n    0x000031D3, 0x00000002, 0x000400FA, 0x00003C13, 0x000055E8, 0x000031D3,\n    0x000200F8, 0x000055E8, 0x000200F9, 0x00004C7A, 0x000200F8, 0x000031D3,\n    0x00050051, 0x0000000B, 0x00001CAC, 0x00002EF9, 0x00000001, 0x0007000C,\n    0x0000000B, 0x00001F38, 0x00000001, 0x00000029, 0x00001CAC, 0x00000A0A,\n    0x00050050, 0x00000011, 0x000051EF, 0x00001DD8, 0x00001F38, 0x00050080,\n    0x00000011, 0x0000522C, 0x000051EF, 0x000059EB, 0x000500B2, 0x00000009,\n    0x00003ECB, 0x00003F4D, 0x00000A13, 0x000300F7, 0x00005CE0, 0x00000000,\n    0x000400FA, 0x00003ECB, 0x00002AEE, 0x00003AEF, 0x000200F8, 0x00003AEF,\n    0x000500AA, 0x00000009, 0x000034FE, 0x00003F4D, 0x00000A19, 0x000600A9,\n    0x0000000B, 0x000020F6, 0x000034FE, 0x00000A10, 0x00000A0A, 0x000200F9,\n    0x00005CE0, 0x000200F8, 0x00002AEE, 0x000200F9, 0x00005CE0, 0x000200F8,\n    0x00005CE0, 0x000700F5, 0x0000000B, 0x00004B64, 0x00003F4D, 0x00002AEE,\n    0x000020F6, 0x00003AEF, 0x00050050, 0x00000011, 0x000041BE, 0x0000217E,\n    0x0000217E, 0x000500AE, 0x0000000F, 0x00002E19, 0x000041BE, 0x0000072D,\n    0x000600A9, 0x00000011, 0x00004BB5, 0x00002E19, 0x00000724, 0x0000070F,\n    0x000500C4, 0x00000011, 0x00002AEA, 0x0000522C, 0x00004BB5, 0x00050050,\n    0x00000011, 0x0000605D, 0x00004B64, 0x00004B64, 0x000500C2, 0x00000011,\n    0x00002385, 0x0000605D, 0x00000718, 0x000500C7, 0x00000011, 0x00003AEC,\n    0x00002385, 0x00000724, 0x00050080, 0x00000011, 0x000027D5, 0x00002AEA,\n    0x00003AEC, 0x00050050, 0x00000011, 0x00002164, 0x000023AA, 0x00000A0A,\n    0x000500C2, 0x00000011, 0x0000264A, 0x00000A9F, 0x00002164, 0x00050086,\n    0x00000011, 0x000027A2, 0x000027D5, 0x0000264A, 0x00050051, 0x0000000B,\n    0x00004FA6, 0x000027A2, 0x00000001, 0x00050084, 0x0000000B, 0x00002B26,\n    0x00004FA6, 0x00005051, 0x00050051, 0x0000000B, 0x00006059, 0x000027A2,\n    0x00000000, 0x00050080, 0x0000000B, 0x00005420, 0x00002B26, 0x00006059,\n    0x00050080, 0x0000000B, 0x00002226, 0x0000217F, 0x00005420, 0x00050084,\n    0x00000011, 0x00005B31, 0x000027A2, 0x0000264A, 0x00050082, 0x00000011,\n    0x00002E74, 0x000027D5, 0x00005B31, 0x00050084, 0x0000000B, 0x00001F75,\n    0x00002226, 0x00000184, 0x00050051, 0x0000000B, 0x00005EC7, 0x00002E74,\n    0x00000001, 0x00050051, 0x0000000B, 0x00005BE6, 0x0000264A, 0x00000000,\n    0x00050084, 0x0000000B, 0x00005966, 0x00005EC7, 0x00005BE6, 0x00050051,\n    0x0000000B, 0x00001AE6, 0x00002E74, 0x00000000, 0x00050080, 0x0000000B,\n    0x000025E0, 0x00005966, 0x00001AE6, 0x000500C4, 0x0000000B, 0x000046C4,\n    0x000025E0, 0x000023AA, 0x00050080, 0x0000000B, 0x000048BB, 0x00001F75,\n    0x000046C4, 0x00050089, 0x0000000B, 0x00004C59, 0x000048BB, 0x0000086E,\n    0x000500C4, 0x0000000B, 0x00005BEB, 0x00004C59, 0x00000A11, 0x000500AE,\n    0x00000009, 0x00003652, 0x0000217E, 0x00000A10, 0x000600A9, 0x0000000B,\n    0x00002C0D, 0x00003652, 0x00000A0D, 0x00000A0A, 0x00050080, 0x0000000B,\n    0x00004E6A, 0x000023AA, 0x00002C0D, 0x000500C4, 0x0000000B, 0x0000199B,\n    0x00000A16, 0x00004E6A, 0x000500AB, 0x00000009, 0x00005AEF, 0x000023AA,\n    0x00000A0A, 0x000300F7, 0x0000530F, 0x00000002, 0x000400FA, 0x00005AEF,\n    0x00003B65, 0x000040B9, 0x000200F8, 0x000040B9, 0x000500AA, 0x00000009,\n    0x00004ADA, 0x0000199B, 0x00000A16, 0x000300F7, 0x00004F49, 0x00000002,\n    0x000400FA, 0x00004ADA, 0x000019BF, 0x000022FF, 0x000200F8, 0x000022FF,\n    0x000500C2, 0x0000000B, 0x00005630, 0x00005BEB, 0x00000A11, 0x00060041,\n    0x00000289, 0x00003439, 0x00000CC7, 0x00000A0B, 0x00005630, 0x0004003D,\n    0x0000000B, 0x00003AD4, 0x00003439, 0x00050080, 0x0000000B, 0x00002145,\n    0x00005BEB, 0x0000199B, 0x000500C2, 0x0000000B, 0x000054A6, 0x00002145,\n    0x00000A11, 0x00060041, 0x00000289, 0x00004CDD, 0x00000CC7, 0x00000A0B,\n    0x000054A6, 0x0004003D, 0x0000000B, 0x0000333A, 0x00004CDD, 0x00050084,\n    0x0000000B, 0x000021ED, 0x00000A10, 0x0000199B, 0x00050080, 0x0000000B,\n    0x00005EBE, 0x00005BEB, 0x000021ED, 0x000500C2, 0x0000000B, 0x000045E2,\n    0x00005EBE, 0x00000A11, 0x00060041, 0x00000289, 0x00004CDE, 0x00000CC7,\n    0x00000A0B, 0x000045E2, 0x0004003D, 0x0000000B, 0x0000333B, 0x00004CDE,\n    0x00050084, 0x0000000B, 0x000021EE, 0x00000A13, 0x0000199B, 0x00050080,\n    0x0000000B, 0x00005EBF, 0x00005BEB, 0x000021EE, 0x000500C2, 0x0000000B,\n    0x000045E3, 0x00005EBF, 0x00000A11, 0x00060041, 0x00000289, 0x00004901,\n    0x00000CC7, 0x00000A0B, 0x000045E3, 0x0004003D, 0x0000000B, 0x00005F59,\n    0x00004901, 0x00070050, 0x00000017, 0x0000512C, 0x00003AD4, 0x0000333A,\n    0x0000333B, 0x00005F59, 0x000200F9, 0x00004F49, 0x000200F8, 0x000019BF,\n    0x000500C2, 0x0000000B, 0x00005FA6, 0x00005BEB, 0x00000A11, 0x00060041,\n    0x00000289, 0x0000343A, 0x00000CC7, 0x00000A0B, 0x00005FA6, 0x0004003D,\n    0x0000000B, 0x00003141, 0x0000343A, 0x00050080, 0x0000000B, 0x00002DA7,\n    0x00005FA6, 0x00000A0D, 0x00060041, 0x00000289, 0x000018FF, 0x00000CC7,\n    0x00000A0B, 0x00002DA7, 0x0004003D, 0x0000000B, 0x00005C62, 0x000018FF,\n    0x00050080, 0x0000000B, 0x00002DA8, 0x00005FA6, 0x00000A10, 0x00060041,\n    0x00000289, 0x00001900, 0x00000CC7, 0x00000A0B, 0x00002DA8, 0x0004003D,\n    0x0000000B, 0x00005C63, 0x00001900, 0x00050080, 0x0000000B, 0x00002DA9,\n    0x00005FA6, 0x00000A13, 0x00060041, 0x00000289, 0x00005FEE, 0x00000CC7,\n    0x00000A0B, 0x00002DA9, 0x0004003D, 0x0000000B, 0x00003FFB, 0x00005FEE,\n    0x00070050, 0x00000017, 0x0000512D, 0x00003141, 0x00005C62, 0x00005C63,\n    0x00003FFB, 0x000200F9, 0x00004F49, 0x000200F8, 0x00004F49, 0x000700F5,\n    0x00000017, 0x00002ABF, 0x0000512D, 0x000019BF, 0x0000512C, 0x000022FF,\n    0x000300F7, 0x00003F60, 0x00000000, 0x001300FB, 0x00002180, 0x00004BFB,\n    0x00000000, 0x000038F9, 0x00000001, 0x000038F9, 0x00000002, 0x00001CBB,\n    0x0000000A, 0x00001CBB, 0x00000003, 0x00001CBA, 0x0000000C, 0x00001CBA,\n    0x00000004, 0x00001FFE, 0x00000006, 0x00002033, 0x000200F8, 0x00002033,\n    0x00050051, 0x0000000B, 0x00005F56, 0x00002ABF, 0x00000000, 0x0006000C,\n    0x00000013, 0x00006067, 0x00000001, 0x0000003E, 0x00005F56, 0x00050051,\n    0x0000000D, 0x00002762, 0x00006067, 0x00000000, 0x00050051, 0x0000000D,\n    0x00004446, 0x00006067, 0x00000001, 0x00070050, 0x0000001D, 0x0000390C,\n    0x00002762, 0x00004446, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B,\n    0x0000437A, 0x00002ABF, 0x00000001, 0x0006000C, 0x00000013, 0x0000466B,\n    0x00000001, 0x0000003E, 0x0000437A, 0x00050051, 0x0000000D, 0x00002763,\n    0x0000466B, 0x00000000, 0x00050051, 0x0000000D, 0x00004447, 0x0000466B,\n    0x00000001, 0x00070050, 0x0000001D, 0x0000390D, 0x00002763, 0x00004447,\n    0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x0000437B, 0x00002ABF,\n    0x00000002, 0x0006000C, 0x00000013, 0x0000466C, 0x00000001, 0x0000003E,\n    0x0000437B, 0x00050051, 0x0000000D, 0x00002764, 0x0000466C, 0x00000000,\n    0x00050051, 0x0000000D, 0x00004448, 0x0000466C, 0x00000001, 0x00070050,\n    0x0000001D, 0x0000390E, 0x00002764, 0x00004448, 0x00000A0C, 0x00000A0C,\n    0x00050051, 0x0000000B, 0x0000437C, 0x00002ABF, 0x00000003, 0x0006000C,\n    0x00000013, 0x0000466D, 0x00000001, 0x0000003E, 0x0000437C, 0x00050051,\n    0x0000000D, 0x00002765, 0x0000466D, 0x00000000, 0x00050051, 0x0000000D,\n    0x000050BE, 0x0000466D, 0x00000001, 0x00070050, 0x0000001D, 0x00002349,\n    0x00002765, 0x000050BE, 0x00000A0C, 0x00000A0C, 0x000200F9, 0x00003F60,\n    0x000200F8, 0x00001FFE, 0x00050051, 0x0000000B, 0x0000308B, 0x00002ABF,\n    0x00000000, 0x0004007C, 0x0000000C, 0x0000589D, 0x0000308B, 0x00050050,\n    0x00000012, 0x0000471A, 0x0000589D, 0x0000589D, 0x000500C4, 0x00000012,\n    0x000047AD, 0x0000471A, 0x000007A7, 0x000500C3, 0x00000012, 0x00003417,\n    0x000047AD, 0x00000867, 0x0004006F, 0x00000013, 0x00002A97, 0x00003417,\n    0x0005008E, 0x00000013, 0x00004747, 0x00002A97, 0x000007FE, 0x0007000C,\n    0x00000013, 0x00005E06, 0x00000001, 0x00000028, 0x00000049, 0x00004747,\n    0x00050051, 0x0000000D, 0x00005F0A, 0x00005E06, 0x00000000, 0x00050051,\n    0x0000000D, 0x00003CD4, 0x00005E06, 0x00000001, 0x00070050, 0x0000001D,\n    0x0000411E, 0x00005F0A, 0x00003CD4, 0x00000A0C, 0x00000A0C, 0x00050051,\n    0x0000000B, 0x00004C42, 0x00002ABF, 0x00000001, 0x0004007C, 0x0000000C,\n    0x00003EA1, 0x00004C42, 0x00050050, 0x00000012, 0x0000471B, 0x00003EA1,\n    0x00003EA1, 0x000500C4, 0x00000012, 0x000047AE, 0x0000471B, 0x000007A7,\n    0x000500C3, 0x00000012, 0x00003418, 0x000047AE, 0x00000867, 0x0004006F,\n    0x00000013, 0x00002A98, 0x00003418, 0x0005008E, 0x00000013, 0x00004748,\n    0x00002A98, 0x000007FE, 0x0007000C, 0x00000013, 0x00005E07, 0x00000001,\n    0x00000028, 0x00000049, 0x00004748, 0x00050051, 0x0000000D, 0x00005F0B,\n    0x00005E07, 0x00000000, 0x00050051, 0x0000000D, 0x00003CD5, 0x00005E07,\n    0x00000001, 0x00070050, 0x0000001D, 0x0000411F, 0x00005F0B, 0x00003CD5,\n    0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x00004C43, 0x00002ABF,\n    0x00000002, 0x0004007C, 0x0000000C, 0x00003EA2, 0x00004C43, 0x00050050,\n    0x00000012, 0x0000471C, 0x00003EA2, 0x00003EA2, 0x000500C4, 0x00000012,\n    0x000047AF, 0x0000471C, 0x000007A7, 0x000500C3, 0x00000012, 0x00003419,\n    0x000047AF, 0x00000867, 0x0004006F, 0x00000013, 0x00002A99, 0x00003419,\n    0x0005008E, 0x00000013, 0x00004749, 0x00002A99, 0x000007FE, 0x0007000C,\n    0x00000013, 0x00005E08, 0x00000001, 0x00000028, 0x00000049, 0x00004749,\n    0x00050051, 0x0000000D, 0x00005F0C, 0x00005E08, 0x00000000, 0x00050051,\n    0x0000000D, 0x00003CD6, 0x00005E08, 0x00000001, 0x00070050, 0x0000001D,\n    0x00004120, 0x00005F0C, 0x00003CD6, 0x00000A0C, 0x00000A0C, 0x00050051,\n    0x0000000B, 0x00004C44, 0x00002ABF, 0x00000003, 0x0004007C, 0x0000000C,\n    0x00003EA3, 0x00004C44, 0x00050050, 0x00000012, 0x0000471D, 0x00003EA3,\n    0x00003EA3, 0x000500C4, 0x00000012, 0x000047B0, 0x0000471D, 0x000007A7,\n    0x000500C3, 0x00000012, 0x0000341A, 0x000047B0, 0x00000867, 0x0004006F,\n    0x00000013, 0x00002A9A, 0x0000341A, 0x0005008E, 0x00000013, 0x0000474A,\n    0x00002A9A, 0x000007FE, 0x0007000C, 0x00000013, 0x00005E09, 0x00000001,\n    0x00000028, 0x00000049, 0x0000474A, 0x00050051, 0x0000000D, 0x00005F0D,\n    0x00005E09, 0x00000000, 0x00050051, 0x0000000D, 0x0000494C, 0x00005E09,\n    0x00000001, 0x00070050, 0x0000001D, 0x0000234A, 0x00005F0D, 0x0000494C,\n    0x00000A0C, 0x00000A0C, 0x000200F9, 0x00003F60, 0x000200F8, 0x00001CBA,\n    0x00050051, 0x0000000B, 0x000056BD, 0x00002ABF, 0x00000000, 0x00060050,\n    0x00000014, 0x00004F0A, 0x000056BD, 0x000056BD, 0x000056BD, 0x000500C2,\n    0x00000014, 0x00002B0D, 0x00004F0A, 0x00000BB4, 0x000500C7, 0x00000014,\n    0x00005DE6, 0x00002B0D, 0x00000105, 0x000500C7, 0x00000014, 0x0000489C,\n    0x00002B0D, 0x00000466, 0x000500C2, 0x00000014, 0x00005B90, 0x00005DE6,\n    0x00000B0C, 0x000500AA, 0x00000010, 0x000040C9, 0x00005B90, 0x00000A12,\n    0x0006000C, 0x00000016, 0x00002C4B, 0x00000001, 0x0000004B, 0x0000489C,\n    0x0004007C, 0x00000014, 0x00002A15, 0x00002C4B, 0x00050082, 0x00000014,\n    0x0000187A, 0x00000B0C, 0x00002A15, 0x00050080, 0x00000014, 0x00002210,\n    0x00002A15, 0x00000938, 0x000600A9, 0x00000014, 0x0000286F, 0x000040C9,\n    0x00002210, 0x00005B90, 0x000500C4, 0x00000014, 0x00005AD4, 0x0000489C,\n    0x0000187A, 0x000500C7, 0x00000014, 0x0000499A, 0x00005AD4, 0x00000466,\n    0x000600A9, 0x00000014, 0x00002A9D, 0x000040C9, 0x0000499A, 0x0000489C,\n    0x00050080, 0x00000014, 0x00005FF9, 0x0000286F, 0x000003FA, 0x000500C4,\n    0x00000014, 0x00004F7F, 0x00005FF9, 0x00000189, 0x000500C4, 0x00000014,\n    0x00003FA6, 0x00002A9D, 0x0000008D, 0x000500C5, 0x00000014, 0x0000577C,\n    0x00004F7F, 0x00003FA6, 0x000500AA, 0x00000010, 0x00003600, 0x00005DE6,\n    0x00000A12, 0x000600A9, 0x00000014, 0x00004242, 0x00003600, 0x00000A12,\n    0x0000577C, 0x0004007C, 0x00000018, 0x000029CF, 0x00004242, 0x000500C2,\n    0x0000000B, 0x00004BA4, 0x000056BD, 0x00000A64, 0x00040070, 0x0000000D,\n    0x0000480E, 0x00004BA4, 0x00050085, 0x0000000D, 0x00003E1F, 0x0000480E,\n    0x00000149, 0x00050051, 0x0000000D, 0x000053C2, 0x000029CF, 0x00000000,\n    0x00050051, 0x0000000D, 0x00002A55, 0x000029CF, 0x00000001, 0x00050051,\n    0x0000000D, 0x00001E99, 0x000029CF, 0x00000002, 0x00070050, 0x0000001D,\n    0x00003DDA, 0x000053C2, 0x00002A55, 0x00001E99, 0x00003E1F, 0x00050051,\n    0x0000000B, 0x000027F5, 0x00002ABF, 0x00000001, 0x00060050, 0x00000014,\n    0x0000350E, 0x000027F5, 0x000027F5, 0x000027F5, 0x000500C2, 0x00000014,\n    0x00002B0E, 0x0000350E, 0x00000BB4, 0x000500C7, 0x00000014, 0x00005DE7,\n    0x00002B0E, 0x00000105, 0x000500C7, 0x00000014, 0x0000489D, 0x00002B0E,\n    0x00000466, 0x000500C2, 0x00000014, 0x00005B91, 0x00005DE7, 0x00000B0C,\n    0x000500AA, 0x00000010, 0x000040CA, 0x00005B91, 0x00000A12, 0x0006000C,\n    0x00000016, 0x00002C4C, 0x00000001, 0x0000004B, 0x0000489D, 0x0004007C,\n    0x00000014, 0x00002A16, 0x00002C4C, 0x00050082, 0x00000014, 0x0000187B,\n    0x00000B0C, 0x00002A16, 0x00050080, 0x00000014, 0x00002211, 0x00002A16,\n    0x00000938, 0x000600A9, 0x00000014, 0x00002870, 0x000040CA, 0x00002211,\n    0x00005B91, 0x000500C4, 0x00000014, 0x00005AD5, 0x0000489D, 0x0000187B,\n    0x000500C7, 0x00000014, 0x0000499B, 0x00005AD5, 0x00000466, 0x000600A9,\n    0x00000014, 0x00002A9E, 0x000040CA, 0x0000499B, 0x0000489D, 0x00050080,\n    0x00000014, 0x00005FFA, 0x00002870, 0x000003FA, 0x000500C4, 0x00000014,\n    0x00004F80, 0x00005FFA, 0x00000189, 0x000500C4, 0x00000014, 0x00003FA7,\n    0x00002A9E, 0x0000008D, 0x000500C5, 0x00000014, 0x0000577D, 0x00004F80,\n    0x00003FA7, 0x000500AA, 0x00000010, 0x00003601, 0x00005DE7, 0x00000A12,\n    0x000600A9, 0x00000014, 0x00004243, 0x00003601, 0x00000A12, 0x0000577D,\n    0x0004007C, 0x00000018, 0x000029D0, 0x00004243, 0x000500C2, 0x0000000B,\n    0x00004BA5, 0x000027F5, 0x00000A64, 0x00040070, 0x0000000D, 0x0000480F,\n    0x00004BA5, 0x00050085, 0x0000000D, 0x00003E20, 0x0000480F, 0x00000149,\n    0x00050051, 0x0000000D, 0x000053C3, 0x000029D0, 0x00000000, 0x00050051,\n    0x0000000D, 0x00002A56, 0x000029D0, 0x00000001, 0x00050051, 0x0000000D,\n    0x00001E9A, 0x000029D0, 0x00000002, 0x00070050, 0x0000001D, 0x00003DDB,\n    0x000053C3, 0x00002A56, 0x00001E9A, 0x00003E20, 0x00050051, 0x0000000B,\n    0x000027F6, 0x00002ABF, 0x00000002, 0x00060050, 0x00000014, 0x0000350F,\n    0x000027F6, 0x000027F6, 0x000027F6, 0x000500C2, 0x00000014, 0x00002B0F,\n    0x0000350F, 0x00000BB4, 0x000500C7, 0x00000014, 0x00005DE8, 0x00002B0F,\n    0x00000105, 0x000500C7, 0x00000014, 0x0000489E, 0x00002B0F, 0x00000466,\n    0x000500C2, 0x00000014, 0x00005B92, 0x00005DE8, 0x00000B0C, 0x000500AA,\n    0x00000010, 0x000040CB, 0x00005B92, 0x00000A12, 0x0006000C, 0x00000016,\n    0x00002C4D, 0x00000001, 0x0000004B, 0x0000489E, 0x0004007C, 0x00000014,\n    0x00002A17, 0x00002C4D, 0x00050082, 0x00000014, 0x0000187C, 0x00000B0C,\n    0x00002A17, 0x00050080, 0x00000014, 0x00002212, 0x00002A17, 0x00000938,\n    0x000600A9, 0x00000014, 0x00002871, 0x000040CB, 0x00002212, 0x00005B92,\n    0x000500C4, 0x00000014, 0x00005AD6, 0x0000489E, 0x0000187C, 0x000500C7,\n    0x00000014, 0x0000499C, 0x00005AD6, 0x00000466, 0x000600A9, 0x00000014,\n    0x00002A9F, 0x000040CB, 0x0000499C, 0x0000489E, 0x00050080, 0x00000014,\n    0x00005FFB, 0x00002871, 0x000003FA, 0x000500C4, 0x00000014, 0x00004F81,\n    0x00005FFB, 0x00000189, 0x000500C4, 0x00000014, 0x00003FA8, 0x00002A9F,\n    0x0000008D, 0x000500C5, 0x00000014, 0x0000577E, 0x00004F81, 0x00003FA8,\n    0x000500AA, 0x00000010, 0x00003602, 0x00005DE8, 0x00000A12, 0x000600A9,\n    0x00000014, 0x00004244, 0x00003602, 0x00000A12, 0x0000577E, 0x0004007C,\n    0x00000018, 0x000029D1, 0x00004244, 0x000500C2, 0x0000000B, 0x00004BA6,\n    0x000027F6, 0x00000A64, 0x00040070, 0x0000000D, 0x00004810, 0x00004BA6,\n    0x00050085, 0x0000000D, 0x00003E21, 0x00004810, 0x00000149, 0x00050051,\n    0x0000000D, 0x000053C4, 0x000029D1, 0x00000000, 0x00050051, 0x0000000D,\n    0x00002A57, 0x000029D1, 0x00000001, 0x00050051, 0x0000000D, 0x00001E9B,\n    0x000029D1, 0x00000002, 0x00070050, 0x0000001D, 0x00003DDC, 0x000053C4,\n    0x00002A57, 0x00001E9B, 0x00003E21, 0x00050051, 0x0000000B, 0x000027F7,\n    0x00002ABF, 0x00000003, 0x00060050, 0x00000014, 0x00003510, 0x000027F7,\n    0x000027F7, 0x000027F7, 0x000500C2, 0x00000014, 0x00002B10, 0x00003510,\n    0x00000BB4, 0x000500C7, 0x00000014, 0x00005DE9, 0x00002B10, 0x00000105,\n    0x000500C7, 0x00000014, 0x0000489F, 0x00002B10, 0x00000466, 0x000500C2,\n    0x00000014, 0x00005B93, 0x00005DE9, 0x00000B0C, 0x000500AA, 0x00000010,\n    0x000040CC, 0x00005B93, 0x00000A12, 0x0006000C, 0x00000016, 0x00002C4E,\n    0x00000001, 0x0000004B, 0x0000489F, 0x0004007C, 0x00000014, 0x00002A18,\n    0x00002C4E, 0x00050082, 0x00000014, 0x0000187D, 0x00000B0C, 0x00002A18,\n    0x00050080, 0x00000014, 0x00002213, 0x00002A18, 0x00000938, 0x000600A9,\n    0x00000014, 0x00002872, 0x000040CC, 0x00002213, 0x00005B93, 0x000500C4,\n    0x00000014, 0x00005AD7, 0x0000489F, 0x0000187D, 0x000500C7, 0x00000014,\n    0x0000499D, 0x00005AD7, 0x00000466, 0x000600A9, 0x00000014, 0x00002AA0,\n    0x000040CC, 0x0000499D, 0x0000489F, 0x00050080, 0x00000014, 0x00005FFC,\n    0x00002872, 0x000003FA, 0x000500C4, 0x00000014, 0x00004F82, 0x00005FFC,\n    0x00000189, 0x000500C4, 0x00000014, 0x00003FA9, 0x00002AA0, 0x0000008D,\n    0x000500C5, 0x00000014, 0x0000577F, 0x00004F82, 0x00003FA9, 0x000500AA,\n    0x00000010, 0x00003603, 0x00005DE9, 0x00000A12, 0x000600A9, 0x00000014,\n    0x00004245, 0x00003603, 0x00000A12, 0x0000577F, 0x0004007C, 0x00000018,\n    0x000029D2, 0x00004245, 0x000500C2, 0x0000000B, 0x00004BA7, 0x000027F7,\n    0x00000A64, 0x00040070, 0x0000000D, 0x00004811, 0x00004BA7, 0x00050085,\n    0x0000000D, 0x00003E22, 0x00004811, 0x00000149, 0x00050051, 0x0000000D,\n    0x000053C5, 0x000029D2, 0x00000000, 0x00050051, 0x0000000D, 0x00002A58,\n    0x000029D2, 0x00000001, 0x00050051, 0x0000000D, 0x00002B11, 0x000029D2,\n    0x00000002, 0x00070050, 0x0000001D, 0x0000234B, 0x000053C5, 0x00002A58,\n    0x00002B11, 0x00003E22, 0x000200F9, 0x00003F60, 0x000200F8, 0x00001CBB,\n    0x00050051, 0x0000000B, 0x000056BE, 0x00002ABF, 0x00000000, 0x00070050,\n    0x00000017, 0x00004F0B, 0x000056BE, 0x000056BE, 0x000056BE, 0x000056BE,\n    0x000500C2, 0x00000017, 0x00002498, 0x00004F0B, 0x0000034D, 0x000500C7,\n    0x00000017, 0x000049AB, 0x00002498, 0x0000027B, 0x00040070, 0x0000001D,\n    0x00003CB7, 0x000049AB, 0x00050085, 0x0000001D, 0x00004130, 0x00003CB7,\n    0x00000AEE, 0x00050051, 0x0000000B, 0x00005CD2, 0x00002ABF, 0x00000001,\n    0x00070050, 0x00000017, 0x0000514D, 0x00005CD2, 0x00005CD2, 0x00005CD2,\n    0x00005CD2, 0x000500C2, 0x00000017, 0x00002499, 0x0000514D, 0x0000034D,\n    0x000500C7, 0x00000017, 0x000049AC, 0x00002499, 0x0000027B, 0x00040070,\n    0x0000001D, 0x00003CB8, 0x000049AC, 0x00050085, 0x0000001D, 0x00004131,\n    0x00003CB8, 0x00000AEE, 0x00050051, 0x0000000B, 0x00005CD3, 0x00002ABF,\n    0x00000002, 0x00070050, 0x00000017, 0x0000514E, 0x00005CD3, 0x00005CD3,\n    0x00005CD3, 0x00005CD3, 0x000500C2, 0x00000017, 0x0000249A, 0x0000514E,\n    0x0000034D, 0x000500C7, 0x00000017, 0x000049AD, 0x0000249A, 0x0000027B,\n    0x00040070, 0x0000001D, 0x00003CB9, 0x000049AD, 0x00050085, 0x0000001D,\n    0x00004132, 0x00003CB9, 0x00000AEE, 0x00050051, 0x0000000B, 0x00005CD4,\n    0x00002ABF, 0x00000003, 0x00070050, 0x00000017, 0x0000514F, 0x00005CD4,\n    0x00005CD4, 0x00005CD4, 0x00005CD4, 0x000500C2, 0x00000017, 0x0000249B,\n    0x0000514F, 0x0000034D, 0x000500C7, 0x00000017, 0x000049AE, 0x0000249B,\n    0x0000027B, 0x00040070, 0x0000001D, 0x0000492F, 0x000049AE, 0x00050085,\n    0x0000001D, 0x0000269F, 0x0000492F, 0x00000AEE, 0x000200F9, 0x00003F60,\n    0x000200F8, 0x000038F9, 0x00050051, 0x0000000B, 0x000056BF, 0x00002ABF,\n    0x00000000, 0x00070050, 0x00000017, 0x00004F0C, 0x000056BF, 0x000056BF,\n    0x000056BF, 0x000056BF, 0x000500C2, 0x00000017, 0x0000249C, 0x00004F0C,\n    0x0000028D, 0x000500C7, 0x00000017, 0x00004A56, 0x0000249C, 0x0000064B,\n    0x00040070, 0x0000001D, 0x000036A2, 0x00004A56, 0x0005008E, 0x0000001D,\n    0x00004B23, 0x000036A2, 0x0000017A, 0x00050051, 0x0000000B, 0x0000219F,\n    0x00002ABF, 0x00000001, 0x00070050, 0x00000017, 0x0000610B, 0x0000219F,\n    0x0000219F, 0x0000219F, 0x0000219F, 0x000500C2, 0x00000017, 0x0000249D,\n    0x0000610B, 0x0000028D, 0x000500C7, 0x00000017, 0x00004A57, 0x0000249D,\n    0x0000064B, 0x00040070, 0x0000001D, 0x000036A3, 0x00004A57, 0x0005008E,\n    0x0000001D, 0x00004B24, 0x000036A3, 0x0000017A, 0x00050051, 0x0000000B,\n    0x000021A0, 0x00002ABF, 0x00000002, 0x00070050, 0x00000017, 0x0000610C,\n    0x000021A0, 0x000021A0, 0x000021A0, 0x000021A0, 0x000500C2, 0x00000017,\n    0x0000249E, 0x0000610C, 0x0000028D, 0x000500C7, 0x00000017, 0x00004A58,\n    0x0000249E, 0x0000064B, 0x00040070, 0x0000001D, 0x000036A4, 0x00004A58,\n    0x0005008E, 0x0000001D, 0x00004B25, 0x000036A4, 0x0000017A, 0x00050051,\n    0x0000000B, 0x000021A1, 0x00002ABF, 0x00000003, 0x00070050, 0x00000017,\n    0x0000610D, 0x000021A1, 0x000021A1, 0x000021A1, 0x000021A1, 0x000500C2,\n    0x00000017, 0x0000249F, 0x0000610D, 0x0000028D, 0x000500C7, 0x00000017,\n    0x00004A59, 0x0000249F, 0x0000064B, 0x00040070, 0x0000001D, 0x0000431A,\n    0x00004A59, 0x0005008E, 0x0000001D, 0x00003092, 0x0000431A, 0x0000017A,\n    0x000200F9, 0x00003F60, 0x000200F8, 0x00004BFB, 0x00050051, 0x0000000B,\n    0x0000308C, 0x00002ABF, 0x00000000, 0x0004007C, 0x0000000D, 0x00004FEE,\n    0x0000308C, 0x00050050, 0x00000013, 0x00004336, 0x00004FEE, 0x00000A0C,\n    0x0009004F, 0x0000001D, 0x00002D90, 0x00004336, 0x00004336, 0x00000000,\n    0x00000001, 0x00000001, 0x00000001, 0x00050051, 0x0000000B, 0x000056B1,\n    0x00002ABF, 0x00000001, 0x0004007C, 0x0000000D, 0x00003F68, 0x000056B1,\n    0x00050050, 0x00000013, 0x00004337, 0x00003F68, 0x00000A0C, 0x0009004F,\n    0x0000001D, 0x00002D91, 0x00004337, 0x00004337, 0x00000000, 0x00000001,\n    0x00000001, 0x00000001, 0x00050051, 0x0000000B, 0x000056B2, 0x00002ABF,\n    0x00000002, 0x0004007C, 0x0000000D, 0x00003F69, 0x000056B2, 0x00050050,\n    0x00000013, 0x00004338, 0x00003F69, 0x00000A0C, 0x0009004F, 0x0000001D,\n    0x00002D92, 0x00004338, 0x00004338, 0x00000000, 0x00000001, 0x00000001,\n    0x00000001, 0x00050051, 0x0000000B, 0x000056B3, 0x00002ABF, 0x00000003,\n    0x0004007C, 0x0000000D, 0x00003F6A, 0x000056B3, 0x00050050, 0x00000013,\n    0x00004FAE, 0x00003F6A, 0x00000A0C, 0x0009004F, 0x0000001D, 0x00005A3A,\n    0x00004FAE, 0x00004FAE, 0x00000000, 0x00000001, 0x00000001, 0x00000001,\n    0x000200F9, 0x00003F60, 0x000200F8, 0x00003F60, 0x000F00F5, 0x0000001D,\n    0x00002BA7, 0x00005A3A, 0x00004BFB, 0x00003092, 0x000038F9, 0x0000269F,\n    0x00001CBB, 0x0000234B, 0x00001CBA, 0x0000234A, 0x00001FFE, 0x00002349,\n    0x00002033, 0x000F00F5, 0x0000001D, 0x00003808, 0x00002D92, 0x00004BFB,\n    0x00004B25, 0x000038F9, 0x00004132, 0x00001CBB, 0x00003DDC, 0x00001CBA,\n    0x00004120, 0x00001FFE, 0x0000390E, 0x00002033, 0x000F00F5, 0x0000001D,\n    0x00003B7D, 0x00002D91, 0x00004BFB, 0x00004B24, 0x000038F9, 0x00004131,\n    0x00001CBB, 0x00003DDB, 0x00001CBA, 0x0000411F, 0x00001FFE, 0x0000390D,\n    0x00002033, 0x000F00F5, 0x0000001D, 0x000038B6, 0x00002D90, 0x00004BFB,\n    0x00004B23, 0x000038F9, 0x00004130, 0x00001CBB, 0x00003DDA, 0x00001CBA,\n    0x0000411E, 0x00001FFE, 0x0000390C, 0x00002033, 0x000200F9, 0x0000530F,\n    0x000200F8, 0x00003B65, 0x000500AA, 0x00000009, 0x00005450, 0x0000199B,\n    0x00000A22, 0x000300F7, 0x00004F23, 0x00000002, 0x000400FA, 0x00005450,\n    0x000019C0, 0x00002300, 0x000200F8, 0x00002300, 0x000500C2, 0x0000000B,\n    0x00005631, 0x00005BEB, 0x00000A11, 0x00060041, 0x00000289, 0x0000343B,\n    0x00000CC7, 0x00000A0B, 0x00005631, 0x0004003D, 0x0000000B, 0x00003142,\n    0x0000343B, 0x00050080, 0x0000000B, 0x00002DAA, 0x00005631, 0x00000A0D,\n    0x00060041, 0x00000289, 0x00001901, 0x00000CC7, 0x00000A0B, 0x00002DAA,\n    0x0004003D, 0x0000000B, 0x00001B76, 0x00001901, 0x00050080, 0x0000000B,\n    0x00002146, 0x00005BEB, 0x0000199B, 0x000500C2, 0x0000000B, 0x000054A7,\n    0x00002146, 0x00000A11, 0x00060041, 0x00000289, 0x00004C91, 0x00000CC7,\n    0x00000A0B, 0x000054A7, 0x0004003D, 0x0000000B, 0x00003143, 0x00004C91,\n    0x00050080, 0x0000000B, 0x00002DAB, 0x000054A7, 0x00000A0D, 0x00060041,\n    0x00000289, 0x00005FEF, 0x00000CC7, 0x00000A0B, 0x00002DAB, 0x0004003D,\n    0x0000000B, 0x0000374C, 0x00005FEF, 0x00070050, 0x00000017, 0x00004CD6,\n    0x00003142, 0x00001B76, 0x00003143, 0x0000374C, 0x00050084, 0x0000000B,\n    0x00004C2B, 0x00000A10, 0x0000199B, 0x00050080, 0x0000000B, 0x00002A45,\n    0x00005BEB, 0x00004C2B, 0x000500C2, 0x0000000B, 0x000045E4, 0x00002A45,\n    0x00000A11, 0x00060041, 0x00000289, 0x00004C92, 0x00000CC7, 0x00000A0B,\n    0x000045E4, 0x0004003D, 0x0000000B, 0x00003144, 0x00004C92, 0x00050080,\n    0x0000000B, 0x00002DAC, 0x000045E4, 0x00000A0D, 0x00060041, 0x00000289,\n    0x0000194B, 0x00000CC7, 0x00000A0B, 0x00002DAC, 0x0004003D, 0x0000000B,\n    0x00005E5B, 0x0000194B, 0x00050084, 0x0000000B, 0x000021EF, 0x00000A13,\n    0x0000199B, 0x00050080, 0x0000000B, 0x00005EC0, 0x00005BEB, 0x000021EF,\n    0x000500C2, 0x0000000B, 0x000045E5, 0x00005EC0, 0x00000A11, 0x00060041,\n    0x00000289, 0x00004C93, 0x00000CC7, 0x00000A0B, 0x000045E5, 0x0004003D,\n    0x0000000B, 0x00003145, 0x00004C93, 0x00050080, 0x0000000B, 0x00002DAD,\n    0x000045E5, 0x00000A0D, 0x00060041, 0x00000289, 0x00005FF0, 0x00000CC7,\n    0x00000A0B, 0x00002DAD, 0x0004003D, 0x0000000B, 0x00003FFC, 0x00005FF0,\n    0x00070050, 0x00000017, 0x0000512E, 0x00003144, 0x00005E5B, 0x00003145,\n    0x00003FFC, 0x000200F9, 0x00004F23, 0x000200F8, 0x000019C0, 0x000500C2,\n    0x0000000B, 0x00005FA7, 0x00005BEB, 0x00000A11, 0x00060041, 0x00000289,\n    0x0000343C, 0x00000CC7, 0x00000A0B, 0x00005FA7, 0x0004003D, 0x0000000B,\n    0x00003146, 0x0000343C, 0x00050080, 0x0000000B, 0x00002DAE, 0x00005FA7,\n    0x00000A0D, 0x00060041, 0x00000289, 0x00001902, 0x00000CC7, 0x00000A0B,\n    0x00002DAE, 0x0004003D, 0x0000000B, 0x00005C64, 0x00001902, 0x00050080,\n    0x0000000B, 0x00002DAF, 0x00005FA7, 0x00000A10, 0x00060041, 0x00000289,\n    0x00001903, 0x00000CC7, 0x00000A0B, 0x00002DAF, 0x0004003D, 0x0000000B,\n    0x00005C65, 0x00001903, 0x00050080, 0x0000000B, 0x00002DB0, 0x00005FA7,\n    0x00000A13, 0x00060041, 0x00000289, 0x00005FF1, 0x00000CC7, 0x00000A0B,\n    0x00002DB0, 0x0004003D, 0x0000000B, 0x00003700, 0x00005FF1, 0x00070050,\n    0x00000017, 0x00005470, 0x00003146, 0x00005C64, 0x00005C65, 0x00003700,\n    0x00050080, 0x0000000B, 0x00004B83, 0x00005BEB, 0x00000A3A, 0x000500C2,\n    0x0000000B, 0x0000202D, 0x00004B83, 0x00000A11, 0x00060041, 0x00000289,\n    0x00004C94, 0x00000CC7, 0x00000A0B, 0x0000202D, 0x0004003D, 0x0000000B,\n    0x00003147, 0x00004C94, 0x00050080, 0x0000000B, 0x00002DB1, 0x0000202D,\n    0x00000A0D, 0x00060041, 0x00000289, 0x00001904, 0x00000CC7, 0x00000A0B,\n    0x00002DB1, 0x0004003D, 0x0000000B, 0x00005C66, 0x00001904, 0x00050080,\n    0x0000000B, 0x00002DB2, 0x0000202D, 0x00000A10, 0x00060041, 0x00000289,\n    0x00001905, 0x00000CC7, 0x00000A0B, 0x00002DB2, 0x0004003D, 0x0000000B,\n    0x00005C67, 0x00001905, 0x00050080, 0x0000000B, 0x00002DB3, 0x0000202D,\n    0x00000A13, 0x00060041, 0x00000289, 0x00005FF2, 0x00000CC7, 0x00000A0B,\n    0x00002DB3, 0x0004003D, 0x0000000B, 0x00003FFD, 0x00005FF2, 0x00070050,\n    0x00000017, 0x0000512F, 0x00003147, 0x00005C66, 0x00005C67, 0x00003FFD,\n    0x000200F9, 0x00004F23, 0x000200F8, 0x00004F23, 0x000700F5, 0x00000017,\n    0x00002BCD, 0x0000512F, 0x000019C0, 0x0000512E, 0x00002300, 0x000700F5,\n    0x00000017, 0x00003720, 0x00005470, 0x000019C0, 0x00004CD6, 0x00002300,\n    0x000300F7, 0x00004F24, 0x00000000, 0x000700FB, 0x00002180, 0x00004F56,\n    0x00000005, 0x00002158, 0x00000007, 0x00002034, 0x000200F8, 0x00002034,\n    0x00050051, 0x0000000B, 0x00005F57, 0x00003720, 0x00000000, 0x0006000C,\n    0x00000013, 0x00006068, 0x00000001, 0x0000003E, 0x00005F57, 0x00050051,\n    0x0000000D, 0x00002775, 0x00006068, 0x00000000, 0x00050051, 0x0000000D,\n    0x00003EB8, 0x00006068, 0x00000001, 0x00050051, 0x0000000B, 0x00004281,\n    0x00003720, 0x00000001, 0x0006000C, 0x00000013, 0x00003CF5, 0x00000001,\n    0x0000003E, 0x00004281, 0x00050051, 0x0000000D, 0x00002766, 0x00003CF5,\n    0x00000000, 0x00050051, 0x0000000D, 0x00004449, 0x00003CF5, 0x00000001,\n    0x00070050, 0x0000001D, 0x0000390F, 0x00002775, 0x00003EB8, 0x00002766,\n    0x00004449, 0x00050051, 0x0000000B, 0x0000437D, 0x00003720, 0x00000002,\n    0x0006000C, 0x00000013, 0x0000466E, 0x00000001, 0x0000003E, 0x0000437D,\n    0x00050051, 0x0000000D, 0x00002776, 0x0000466E, 0x00000000, 0x00050051,\n    0x0000000D, 0x00003EB9, 0x0000466E, 0x00000001, 0x00050051, 0x0000000B,\n    0x00004282, 0x00003720, 0x00000003, 0x0006000C, 0x00000013, 0x00003CF6,\n    0x00000001, 0x0000003E, 0x00004282, 0x00050051, 0x0000000D, 0x00002767,\n    0x00003CF6, 0x00000000, 0x00050051, 0x0000000D, 0x0000444A, 0x00003CF6,\n    0x00000001, 0x00070050, 0x0000001D, 0x00003910, 0x00002776, 0x00003EB9,\n    0x00002767, 0x0000444A, 0x00050051, 0x0000000B, 0x0000437E, 0x00002BCD,\n    0x00000000, 0x0006000C, 0x00000013, 0x0000466F, 0x00000001, 0x0000003E,\n    0x0000437E, 0x00050051, 0x0000000D, 0x00002777, 0x0000466F, 0x00000000,\n    0x00050051, 0x0000000D, 0x00003EBA, 0x0000466F, 0x00000001, 0x00050051,\n    0x0000000B, 0x00004283, 0x00002BCD, 0x00000001, 0x0006000C, 0x00000013,\n    0x00003CF7, 0x00000001, 0x0000003E, 0x00004283, 0x00050051, 0x0000000D,\n    0x00002768, 0x00003CF7, 0x00000000, 0x00050051, 0x0000000D, 0x0000444B,\n    0x00003CF7, 0x00000001, 0x00070050, 0x0000001D, 0x00003911, 0x00002777,\n    0x00003EBA, 0x00002768, 0x0000444B, 0x00050051, 0x0000000B, 0x0000437F,\n    0x00002BCD, 0x00000002, 0x0006000C, 0x00000013, 0x00004670, 0x00000001,\n    0x0000003E, 0x0000437F, 0x00050051, 0x0000000D, 0x00002778, 0x00004670,\n    0x00000000, 0x00050051, 0x0000000D, 0x00003EBB, 0x00004670, 0x00000001,\n    0x00050051, 0x0000000B, 0x00004284, 0x00002BCD, 0x00000003, 0x0006000C,\n    0x00000013, 0x00003CF8, 0x00000001, 0x0000003E, 0x00004284, 0x00050051,\n    0x0000000D, 0x00002769, 0x00003CF8, 0x00000000, 0x00050051, 0x0000000D,\n    0x000050BF, 0x00003CF8, 0x00000001, 0x00070050, 0x0000001D, 0x0000234C,\n    0x00002778, 0x00003EBB, 0x00002769, 0x000050BF, 0x000200F9, 0x00004F24,\n    0x000200F8, 0x00002158, 0x0007004F, 0x00000011, 0x000025FB, 0x00003720,\n    0x00003720, 0x00000000, 0x00000001, 0x0004007C, 0x00000012, 0x00005B3C,\n    0x000025FB, 0x0009004F, 0x0000001A, 0x000060CE, 0x00005B3C, 0x00005B3C,\n    0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x000500C4, 0x0000001A,\n    0x000048A6, 0x000060CE, 0x00000122, 0x000500C3, 0x0000001A, 0x00003D8D,\n    0x000048A6, 0x00000302, 0x0004006F, 0x0000001D, 0x00002A9B, 0x00003D8D,\n    0x0005008E, 0x0000001D, 0x00004721, 0x00002A9B, 0x000007FE, 0x0007000C,\n    0x0000001D, 0x00006291, 0x00000001, 0x00000028, 0x00000504, 0x00004721,\n    0x0007004F, 0x00000011, 0x0000376B, 0x00003720, 0x00003720, 0x00000002,\n    0x00000003, 0x0004007C, 0x00000012, 0x000024BF, 0x0000376B, 0x0009004F,\n    0x0000001A, 0x000060CF, 0x000024BF, 0x000024BF, 0x00000000, 0x00000000,\n    0x00000001, 0x00000001, 0x000500C4, 0x0000001A, 0x000048A7, 0x000060CF,\n    0x00000122, 0x000500C3, 0x0000001A, 0x00003D8E, 0x000048A7, 0x00000302,\n    0x0004006F, 0x0000001D, 0x00002A9C, 0x00003D8E, 0x0005008E, 0x0000001D,\n    0x00004722, 0x00002A9C, 0x000007FE, 0x0007000C, 0x0000001D, 0x00006292,\n    0x00000001, 0x00000028, 0x00000504, 0x00004722, 0x0007004F, 0x00000011,\n    0x0000376C, 0x00002BCD, 0x00002BCD, 0x00000000, 0x00000001, 0x0004007C,\n    0x00000012, 0x000024C0, 0x0000376C, 0x0009004F, 0x0000001A, 0x000060D0,\n    0x000024C0, 0x000024C0, 0x00000000, 0x00000000, 0x00000001, 0x00000001,\n    0x000500C4, 0x0000001A, 0x000048A8, 0x000060D0, 0x00000122, 0x000500C3,\n    0x0000001A, 0x00003D8F, 0x000048A8, 0x00000302, 0x0004006F, 0x0000001D,\n    0x00002AA1, 0x00003D8F, 0x0005008E, 0x0000001D, 0x00004723, 0x00002AA1,\n    0x000007FE, 0x0007000C, 0x0000001D, 0x00006293, 0x00000001, 0x00000028,\n    0x00000504, 0x00004723, 0x0007004F, 0x00000011, 0x0000376D, 0x00002BCD,\n    0x00002BCD, 0x00000002, 0x00000003, 0x0004007C, 0x00000012, 0x000024C1,\n    0x0000376D, 0x0009004F, 0x0000001A, 0x000060D1, 0x000024C1, 0x000024C1,\n    0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x000500C4, 0x0000001A,\n    0x000048A9, 0x000060D1, 0x00000122, 0x000500C3, 0x0000001A, 0x00003D90,\n    0x000048A9, 0x00000302, 0x0004006F, 0x0000001D, 0x00002AA2, 0x00003D90,\n    0x0005008E, 0x0000001D, 0x000053BF, 0x00002AA2, 0x000007FE, 0x0007000C,\n    0x0000001D, 0x00004362, 0x00000001, 0x00000028, 0x00000504, 0x000053BF,\n    0x000200F9, 0x00004F24, 0x000200F8, 0x00004F56, 0x0007004F, 0x00000011,\n    0x00002621, 0x00003720, 0x00003720, 0x00000000, 0x00000001, 0x0004007C,\n    0x00000013, 0x00005159, 0x00002621, 0x00050051, 0x0000000D, 0x00001B7B,\n    0x00005159, 0x00000000, 0x00050051, 0x0000000D, 0x0000346A, 0x00005159,\n    0x00000001, 0x00070050, 0x0000001D, 0x00004278, 0x00001B7B, 0x0000346A,\n    0x00000A0C, 0x00000A0C, 0x0007004F, 0x00000011, 0x000041D8, 0x00003720,\n    0x00003720, 0x00000002, 0x00000003, 0x0004007C, 0x00000013, 0x0000375D,\n    0x000041D8, 0x00050051, 0x0000000D, 0x00001B7C, 0x0000375D, 0x00000000,\n    0x00050051, 0x0000000D, 0x0000346B, 0x0000375D, 0x00000001, 0x00070050,\n    0x0000001D, 0x00004279, 0x00001B7C, 0x0000346B, 0x00000A0C, 0x00000A0C,\n    0x0007004F, 0x00000011, 0x000041D9, 0x00002BCD, 0x00002BCD, 0x00000000,\n    0x00000001, 0x0004007C, 0x00000013, 0x0000375E, 0x000041D9, 0x00050051,\n    0x0000000D, 0x00001B7D, 0x0000375E, 0x00000000, 0x00050051, 0x0000000D,\n    0x0000346C, 0x0000375E, 0x00000001, 0x00070050, 0x0000001D, 0x0000427A,\n    0x00001B7D, 0x0000346C, 0x00000A0C, 0x00000A0C, 0x0007004F, 0x00000011,\n    0x000041DA, 0x00002BCD, 0x00002BCD, 0x00000002, 0x00000003, 0x0004007C,\n    0x00000013, 0x0000375F, 0x000041DA, 0x00050051, 0x0000000D, 0x00001B7E,\n    0x0000375F, 0x00000000, 0x00050051, 0x0000000D, 0x00004108, 0x0000375F,\n    0x00000001, 0x00070050, 0x0000001D, 0x0000234D, 0x00001B7E, 0x00004108,\n    0x00000A0C, 0x00000A0C, 0x000200F9, 0x00004F24, 0x000200F8, 0x00004F24,\n    0x000900F5, 0x0000001D, 0x00002BA8, 0x0000234D, 0x00004F56, 0x00004362,\n    0x00002158, 0x0000234C, 0x00002034, 0x000900F5, 0x0000001D, 0x00003809,\n    0x0000427A, 0x00004F56, 0x00006293, 0x00002158, 0x00003911, 0x00002034,\n    0x000900F5, 0x0000001D, 0x00003B7E, 0x00004279, 0x00004F56, 0x00006292,\n    0x00002158, 0x00003910, 0x00002034, 0x000900F5, 0x0000001D, 0x000038B7,\n    0x00004278, 0x00004F56, 0x00006291, 0x00002158, 0x0000390F, 0x00002034,\n    0x000200F9, 0x0000530F, 0x000200F8, 0x0000530F, 0x000700F5, 0x0000001D,\n    0x00002BA9, 0x00002BA8, 0x00004F24, 0x00002BA7, 0x00003F60, 0x000700F5,\n    0x0000001D, 0x0000380A, 0x00003809, 0x00004F24, 0x00003808, 0x00003F60,\n    0x000700F5, 0x0000001D, 0x000035EC, 0x00003B7E, 0x00004F24, 0x00003B7D,\n    0x00003F60, 0x000700F5, 0x0000001D, 0x000020D3, 0x000038B7, 0x00004F24,\n    0x000038B6, 0x00003F60, 0x000500AE, 0x00000009, 0x00002E55, 0x00003F4D,\n    0x00000A16, 0x000300F7, 0x00005313, 0x00000002, 0x000400FA, 0x00002E55,\n    0x000050E5, 0x00005313, 0x000200F8, 0x000050E5, 0x00050085, 0x0000000D,\n    0x000061FB, 0x00002B2C, 0x000000FC, 0x00050080, 0x0000000B, 0x00005E78,\n    0x00005BEB, 0x00000207, 0x000300F7, 0x00005310, 0x00000002, 0x000400FA,\n    0x00005AEF, 0x00003B66, 0x000040BA, 0x000200F8, 0x000040BA, 0x000500AA,\n    0x00000009, 0x00004ADB, 0x0000199B, 0x00000A16, 0x000300F7, 0x00004F4A,\n    0x00000002, 0x000400FA, 0x00004ADB, 0x000019C1, 0x00002301, 0x000200F8,\n    0x00002301, 0x000500C2, 0x0000000B, 0x00005632, 0x00005E78, 0x00000A11,\n    0x00060041, 0x00000289, 0x0000343D, 0x00000CC7, 0x00000A0B, 0x00005632,\n    0x0004003D, 0x0000000B, 0x00003AD5, 0x0000343D, 0x00050080, 0x0000000B,\n    0x00002147, 0x00005E78, 0x0000199B, 0x000500C2, 0x0000000B, 0x000054A8,\n    0x00002147, 0x00000A11, 0x00060041, 0x00000289, 0x00004CDF, 0x00000CC7,\n    0x00000A0B, 0x000054A8, 0x0004003D, 0x0000000B, 0x0000333C, 0x00004CDF,\n    0x00050084, 0x0000000B, 0x000021F0, 0x00000A10, 0x0000199B, 0x00050080,\n    0x0000000B, 0x00005EC1, 0x00005E78, 0x000021F0, 0x000500C2, 0x0000000B,\n    0x000045E6, 0x00005EC1, 0x00000A11, 0x00060041, 0x00000289, 0x00004CE0,\n    0x00000CC7, 0x00000A0B, 0x000045E6, 0x0004003D, 0x0000000B, 0x0000333D,\n    0x00004CE0, 0x00050084, 0x0000000B, 0x000021F1, 0x00000A13, 0x0000199B,\n    0x00050080, 0x0000000B, 0x00005EC2, 0x00005E78, 0x000021F1, 0x000500C2,\n    0x0000000B, 0x000045E7, 0x00005EC2, 0x00000A11, 0x00060041, 0x00000289,\n    0x00004902, 0x00000CC7, 0x00000A0B, 0x000045E7, 0x0004003D, 0x0000000B,\n    0x00005F5A, 0x00004902, 0x00070050, 0x00000017, 0x00005130, 0x00003AD5,\n    0x0000333C, 0x0000333D, 0x00005F5A, 0x000200F9, 0x00004F4A, 0x000200F8,\n    0x000019C1, 0x000500C2, 0x0000000B, 0x00005FA8, 0x00005E78, 0x00000A11,\n    0x00060041, 0x00000289, 0x0000343E, 0x00000CC7, 0x00000A0B, 0x00005FA8,\n    0x0004003D, 0x0000000B, 0x00003148, 0x0000343E, 0x00050080, 0x0000000B,\n    0x00002DB4, 0x00005FA8, 0x00000A0D, 0x00060041, 0x00000289, 0x00001906,\n    0x00000CC7, 0x00000A0B, 0x00002DB4, 0x0004003D, 0x0000000B, 0x00005C68,\n    0x00001906, 0x00050080, 0x0000000B, 0x00002DB5, 0x00005FA8, 0x00000A10,\n    0x00060041, 0x00000289, 0x00001907, 0x00000CC7, 0x00000A0B, 0x00002DB5,\n    0x0004003D, 0x0000000B, 0x00005C69, 0x00001907, 0x00050080, 0x0000000B,\n    0x00002DB6, 0x00005FA8, 0x00000A13, 0x00060041, 0x00000289, 0x00005FF3,\n    0x00000CC7, 0x00000A0B, 0x00002DB6, 0x0004003D, 0x0000000B, 0x00003FFE,\n    0x00005FF3, 0x00070050, 0x00000017, 0x00005131, 0x00003148, 0x00005C68,\n    0x00005C69, 0x00003FFE, 0x000200F9, 0x00004F4A, 0x000200F8, 0x00004F4A,\n    0x000700F5, 0x00000017, 0x00002AC0, 0x00005131, 0x000019C1, 0x00005130,\n    0x00002301, 0x000300F7, 0x00003F61, 0x00000000, 0x001300FB, 0x00002180,\n    0x00004BFC, 0x00000000, 0x000038FA, 0x00000001, 0x000038FA, 0x00000002,\n    0x00001CBD, 0x0000000A, 0x00001CBD, 0x00000003, 0x00001CBC, 0x0000000C,\n    0x00001CBC, 0x00000004, 0x00001FFF, 0x00000006, 0x00002035, 0x000200F8,\n    0x00002035, 0x00050051, 0x0000000B, 0x00005F58, 0x00002AC0, 0x00000000,\n    0x0006000C, 0x00000013, 0x00006069, 0x00000001, 0x0000003E, 0x00005F58,\n    0x00050051, 0x0000000D, 0x0000276A, 0x00006069, 0x00000000, 0x00050051,\n    0x0000000D, 0x0000444C, 0x00006069, 0x00000001, 0x00070050, 0x0000001D,\n    0x00003912, 0x0000276A, 0x0000444C, 0x00000A0C, 0x00000A0C, 0x00050051,\n    0x0000000B, 0x00004380, 0x00002AC0, 0x00000001, 0x0006000C, 0x00000013,\n    0x00004671, 0x00000001, 0x0000003E, 0x00004380, 0x00050051, 0x0000000D,\n    0x0000276B, 0x00004671, 0x00000000, 0x00050051, 0x0000000D, 0x0000444D,\n    0x00004671, 0x00000001, 0x00070050, 0x0000001D, 0x00003913, 0x0000276B,\n    0x0000444D, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x00004381,\n    0x00002AC0, 0x00000002, 0x0006000C, 0x00000013, 0x00004672, 0x00000001,\n    0x0000003E, 0x00004381, 0x00050051, 0x0000000D, 0x0000276C, 0x00004672,\n    0x00000000, 0x00050051, 0x0000000D, 0x0000444E, 0x00004672, 0x00000001,\n    0x00070050, 0x0000001D, 0x00003914, 0x0000276C, 0x0000444E, 0x00000A0C,\n    0x00000A0C, 0x00050051, 0x0000000B, 0x00004382, 0x00002AC0, 0x00000003,\n    0x0006000C, 0x00000013, 0x00004673, 0x00000001, 0x0000003E, 0x00004382,\n    0x00050051, 0x0000000D, 0x0000276D, 0x00004673, 0x00000000, 0x00050051,\n    0x0000000D, 0x000050C0, 0x00004673, 0x00000001, 0x00070050, 0x0000001D,\n    0x0000234E, 0x0000276D, 0x000050C0, 0x00000A0C, 0x00000A0C, 0x000200F9,\n    0x00003F61, 0x000200F8, 0x00001FFF, 0x00050051, 0x0000000B, 0x0000308D,\n    0x00002AC0, 0x00000000, 0x0004007C, 0x0000000C, 0x0000589E, 0x0000308D,\n    0x00050050, 0x00000012, 0x0000471E, 0x0000589E, 0x0000589E, 0x000500C4,\n    0x00000012, 0x000047B1, 0x0000471E, 0x000007A7, 0x000500C3, 0x00000012,\n    0x0000341B, 0x000047B1, 0x00000867, 0x0004006F, 0x00000013, 0x00002AA3,\n    0x0000341B, 0x0005008E, 0x00000013, 0x0000474B, 0x00002AA3, 0x000007FE,\n    0x0007000C, 0x00000013, 0x00005E0A, 0x00000001, 0x00000028, 0x00000049,\n    0x0000474B, 0x00050051, 0x0000000D, 0x00005F0E, 0x00005E0A, 0x00000000,\n    0x00050051, 0x0000000D, 0x00003CD7, 0x00005E0A, 0x00000001, 0x00070050,\n    0x0000001D, 0x00004121, 0x00005F0E, 0x00003CD7, 0x00000A0C, 0x00000A0C,\n    0x00050051, 0x0000000B, 0x00004C45, 0x00002AC0, 0x00000001, 0x0004007C,\n    0x0000000C, 0x00003EA4, 0x00004C45, 0x00050050, 0x00000012, 0x0000471F,\n    0x00003EA4, 0x00003EA4, 0x000500C4, 0x00000012, 0x000047B2, 0x0000471F,\n    0x000007A7, 0x000500C3, 0x00000012, 0x0000341C, 0x000047B2, 0x00000867,\n    0x0004006F, 0x00000013, 0x00002AA4, 0x0000341C, 0x0005008E, 0x00000013,\n    0x0000474C, 0x00002AA4, 0x000007FE, 0x0007000C, 0x00000013, 0x00005E0B,\n    0x00000001, 0x00000028, 0x00000049, 0x0000474C, 0x00050051, 0x0000000D,\n    0x00005F0F, 0x00005E0B, 0x00000000, 0x00050051, 0x0000000D, 0x00003CD8,\n    0x00005E0B, 0x00000001, 0x00070050, 0x0000001D, 0x00004122, 0x00005F0F,\n    0x00003CD8, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x00004C46,\n    0x00002AC0, 0x00000002, 0x0004007C, 0x0000000C, 0x00003EA5, 0x00004C46,\n    0x00050050, 0x00000012, 0x00004720, 0x00003EA5, 0x00003EA5, 0x000500C4,\n    0x00000012, 0x000047B3, 0x00004720, 0x000007A7, 0x000500C3, 0x00000012,\n    0x0000341D, 0x000047B3, 0x00000867, 0x0004006F, 0x00000013, 0x00002AA5,\n    0x0000341D, 0x0005008E, 0x00000013, 0x0000474D, 0x00002AA5, 0x000007FE,\n    0x0007000C, 0x00000013, 0x00005E0C, 0x00000001, 0x00000028, 0x00000049,\n    0x0000474D, 0x00050051, 0x0000000D, 0x00005F10, 0x00005E0C, 0x00000000,\n    0x00050051, 0x0000000D, 0x00003CD9, 0x00005E0C, 0x00000001, 0x00070050,\n    0x0000001D, 0x00004123, 0x00005F10, 0x00003CD9, 0x00000A0C, 0x00000A0C,\n    0x00050051, 0x0000000B, 0x00004C47, 0x00002AC0, 0x00000003, 0x0004007C,\n    0x0000000C, 0x00003EA6, 0x00004C47, 0x00050050, 0x00000012, 0x00004724,\n    0x00003EA6, 0x00003EA6, 0x000500C4, 0x00000012, 0x000047B4, 0x00004724,\n    0x000007A7, 0x000500C3, 0x00000012, 0x0000341E, 0x000047B4, 0x00000867,\n    0x0004006F, 0x00000013, 0x00002AA6, 0x0000341E, 0x0005008E, 0x00000013,\n    0x0000474E, 0x00002AA6, 0x000007FE, 0x0007000C, 0x00000013, 0x00005E0D,\n    0x00000001, 0x00000028, 0x00000049, 0x0000474E, 0x00050051, 0x0000000D,\n    0x00005F11, 0x00005E0D, 0x00000000, 0x00050051, 0x0000000D, 0x0000494D,\n    0x00005E0D, 0x00000001, 0x00070050, 0x0000001D, 0x0000234F, 0x00005F11,\n    0x0000494D, 0x00000A0C, 0x00000A0C, 0x000200F9, 0x00003F61, 0x000200F8,\n    0x00001CBC, 0x00050051, 0x0000000B, 0x000056C0, 0x00002AC0, 0x00000000,\n    0x00060050, 0x00000014, 0x00004F0D, 0x000056C0, 0x000056C0, 0x000056C0,\n    0x000500C2, 0x00000014, 0x00002B12, 0x00004F0D, 0x00000BB4, 0x000500C7,\n    0x00000014, 0x00005DEA, 0x00002B12, 0x00000105, 0x000500C7, 0x00000014,\n    0x000048A0, 0x00002B12, 0x00000466, 0x000500C2, 0x00000014, 0x00005B94,\n    0x00005DEA, 0x00000B0C, 0x000500AA, 0x00000010, 0x000040CD, 0x00005B94,\n    0x00000A12, 0x0006000C, 0x00000016, 0x00002C4F, 0x00000001, 0x0000004B,\n    0x000048A0, 0x0004007C, 0x00000014, 0x00002A19, 0x00002C4F, 0x00050082,\n    0x00000014, 0x0000187E, 0x00000B0C, 0x00002A19, 0x00050080, 0x00000014,\n    0x00002214, 0x00002A19, 0x00000938, 0x000600A9, 0x00000014, 0x00002873,\n    0x000040CD, 0x00002214, 0x00005B94, 0x000500C4, 0x00000014, 0x00005AD8,\n    0x000048A0, 0x0000187E, 0x000500C7, 0x00000014, 0x0000499E, 0x00005AD8,\n    0x00000466, 0x000600A9, 0x00000014, 0x00002AA7, 0x000040CD, 0x0000499E,\n    0x000048A0, 0x00050080, 0x00000014, 0x00005FFD, 0x00002873, 0x000003FA,\n    0x000500C4, 0x00000014, 0x00004F83, 0x00005FFD, 0x00000189, 0x000500C4,\n    0x00000014, 0x00003FAA, 0x00002AA7, 0x0000008D, 0x000500C5, 0x00000014,\n    0x00005780, 0x00004F83, 0x00003FAA, 0x000500AA, 0x00000010, 0x00003604,\n    0x00005DEA, 0x00000A12, 0x000600A9, 0x00000014, 0x00004246, 0x00003604,\n    0x00000A12, 0x00005780, 0x0004007C, 0x00000018, 0x000029D3, 0x00004246,\n    0x000500C2, 0x0000000B, 0x00004BA8, 0x000056C0, 0x00000A64, 0x00040070,\n    0x0000000D, 0x00004812, 0x00004BA8, 0x00050085, 0x0000000D, 0x00003E23,\n    0x00004812, 0x00000149, 0x00050051, 0x0000000D, 0x000053C6, 0x000029D3,\n    0x00000000, 0x00050051, 0x0000000D, 0x00002A59, 0x000029D3, 0x00000001,\n    0x00050051, 0x0000000D, 0x00001E9C, 0x000029D3, 0x00000002, 0x00070050,\n    0x0000001D, 0x00003DDD, 0x000053C6, 0x00002A59, 0x00001E9C, 0x00003E23,\n    0x00050051, 0x0000000B, 0x000027F8, 0x00002AC0, 0x00000001, 0x00060050,\n    0x00000014, 0x00003511, 0x000027F8, 0x000027F8, 0x000027F8, 0x000500C2,\n    0x00000014, 0x00002B13, 0x00003511, 0x00000BB4, 0x000500C7, 0x00000014,\n    0x00005DEB, 0x00002B13, 0x00000105, 0x000500C7, 0x00000014, 0x000048A1,\n    0x00002B13, 0x00000466, 0x000500C2, 0x00000014, 0x00005B95, 0x00005DEB,\n    0x00000B0C, 0x000500AA, 0x00000010, 0x000040CE, 0x00005B95, 0x00000A12,\n    0x0006000C, 0x00000016, 0x00002C50, 0x00000001, 0x0000004B, 0x000048A1,\n    0x0004007C, 0x00000014, 0x00002A1A, 0x00002C50, 0x00050082, 0x00000014,\n    0x0000187F, 0x00000B0C, 0x00002A1A, 0x00050080, 0x00000014, 0x00002215,\n    0x00002A1A, 0x00000938, 0x000600A9, 0x00000014, 0x00002874, 0x000040CE,\n    0x00002215, 0x00005B95, 0x000500C4, 0x00000014, 0x00005AD9, 0x000048A1,\n    0x0000187F, 0x000500C7, 0x00000014, 0x0000499F, 0x00005AD9, 0x00000466,\n    0x000600A9, 0x00000014, 0x00002AA8, 0x000040CE, 0x0000499F, 0x000048A1,\n    0x00050080, 0x00000014, 0x00005FFE, 0x00002874, 0x000003FA, 0x000500C4,\n    0x00000014, 0x00004F84, 0x00005FFE, 0x00000189, 0x000500C4, 0x00000014,\n    0x00003FAB, 0x00002AA8, 0x0000008D, 0x000500C5, 0x00000014, 0x00005781,\n    0x00004F84, 0x00003FAB, 0x000500AA, 0x00000010, 0x00003605, 0x00005DEB,\n    0x00000A12, 0x000600A9, 0x00000014, 0x00004247, 0x00003605, 0x00000A12,\n    0x00005781, 0x0004007C, 0x00000018, 0x000029D4, 0x00004247, 0x000500C2,\n    0x0000000B, 0x00004BA9, 0x000027F8, 0x00000A64, 0x00040070, 0x0000000D,\n    0x00004813, 0x00004BA9, 0x00050085, 0x0000000D, 0x00003E24, 0x00004813,\n    0x00000149, 0x00050051, 0x0000000D, 0x000053C7, 0x000029D4, 0x00000000,\n    0x00050051, 0x0000000D, 0x00002A5A, 0x000029D4, 0x00000001, 0x00050051,\n    0x0000000D, 0x00001E9D, 0x000029D4, 0x00000002, 0x00070050, 0x0000001D,\n    0x00003DDE, 0x000053C7, 0x00002A5A, 0x00001E9D, 0x00003E24, 0x00050051,\n    0x0000000B, 0x000027F9, 0x00002AC0, 0x00000002, 0x00060050, 0x00000014,\n    0x00003512, 0x000027F9, 0x000027F9, 0x000027F9, 0x000500C2, 0x00000014,\n    0x00002B14, 0x00003512, 0x00000BB4, 0x000500C7, 0x00000014, 0x00005DEC,\n    0x00002B14, 0x00000105, 0x000500C7, 0x00000014, 0x000048A2, 0x00002B14,\n    0x00000466, 0x000500C2, 0x00000014, 0x00005B96, 0x00005DEC, 0x00000B0C,\n    0x000500AA, 0x00000010, 0x000040CF, 0x00005B96, 0x00000A12, 0x0006000C,\n    0x00000016, 0x00002C51, 0x00000001, 0x0000004B, 0x000048A2, 0x0004007C,\n    0x00000014, 0x00002A1B, 0x00002C51, 0x00050082, 0x00000014, 0x00001880,\n    0x00000B0C, 0x00002A1B, 0x00050080, 0x00000014, 0x00002216, 0x00002A1B,\n    0x00000938, 0x000600A9, 0x00000014, 0x00002875, 0x000040CF, 0x00002216,\n    0x00005B96, 0x000500C4, 0x00000014, 0x00005ADA, 0x000048A2, 0x00001880,\n    0x000500C7, 0x00000014, 0x000049A0, 0x00005ADA, 0x00000466, 0x000600A9,\n    0x00000014, 0x00002AA9, 0x000040CF, 0x000049A0, 0x000048A2, 0x00050080,\n    0x00000014, 0x00005FFF, 0x00002875, 0x000003FA, 0x000500C4, 0x00000014,\n    0x00004F85, 0x00005FFF, 0x00000189, 0x000500C4, 0x00000014, 0x00003FAC,\n    0x00002AA9, 0x0000008D, 0x000500C5, 0x00000014, 0x00005782, 0x00004F85,\n    0x00003FAC, 0x000500AA, 0x00000010, 0x00003606, 0x00005DEC, 0x00000A12,\n    0x000600A9, 0x00000014, 0x00004248, 0x00003606, 0x00000A12, 0x00005782,\n    0x0004007C, 0x00000018, 0x000029D5, 0x00004248, 0x000500C2, 0x0000000B,\n    0x00004BAA, 0x000027F9, 0x00000A64, 0x00040070, 0x0000000D, 0x00004814,\n    0x00004BAA, 0x00050085, 0x0000000D, 0x00003E25, 0x00004814, 0x00000149,\n    0x00050051, 0x0000000D, 0x000053C8, 0x000029D5, 0x00000000, 0x00050051,\n    0x0000000D, 0x00002A5B, 0x000029D5, 0x00000001, 0x00050051, 0x0000000D,\n    0x00001E9E, 0x000029D5, 0x00000002, 0x00070050, 0x0000001D, 0x00003DDF,\n    0x000053C8, 0x00002A5B, 0x00001E9E, 0x00003E25, 0x00050051, 0x0000000B,\n    0x000027FA, 0x00002AC0, 0x00000003, 0x00060050, 0x00000014, 0x00003513,\n    0x000027FA, 0x000027FA, 0x000027FA, 0x000500C2, 0x00000014, 0x00002B15,\n    0x00003513, 0x00000BB4, 0x000500C7, 0x00000014, 0x00005DED, 0x00002B15,\n    0x00000105, 0x000500C7, 0x00000014, 0x000048A3, 0x00002B15, 0x00000466,\n    0x000500C2, 0x00000014, 0x00005B97, 0x00005DED, 0x00000B0C, 0x000500AA,\n    0x00000010, 0x000040D0, 0x00005B97, 0x00000A12, 0x0006000C, 0x00000016,\n    0x00002C52, 0x00000001, 0x0000004B, 0x000048A3, 0x0004007C, 0x00000014,\n    0x00002A1C, 0x00002C52, 0x00050082, 0x00000014, 0x00001881, 0x00000B0C,\n    0x00002A1C, 0x00050080, 0x00000014, 0x00002217, 0x00002A1C, 0x00000938,\n    0x000600A9, 0x00000014, 0x00002876, 0x000040D0, 0x00002217, 0x00005B97,\n    0x000500C4, 0x00000014, 0x00005ADB, 0x000048A3, 0x00001881, 0x000500C7,\n    0x00000014, 0x000049A1, 0x00005ADB, 0x00000466, 0x000600A9, 0x00000014,\n    0x00002AAA, 0x000040D0, 0x000049A1, 0x000048A3, 0x00050080, 0x00000014,\n    0x00006000, 0x00002876, 0x000003FA, 0x000500C4, 0x00000014, 0x00004F86,\n    0x00006000, 0x00000189, 0x000500C4, 0x00000014, 0x00003FAD, 0x00002AAA,\n    0x0000008D, 0x000500C5, 0x00000014, 0x00005783, 0x00004F86, 0x00003FAD,\n    0x000500AA, 0x00000010, 0x00003607, 0x00005DED, 0x00000A12, 0x000600A9,\n    0x00000014, 0x00004249, 0x00003607, 0x00000A12, 0x00005783, 0x0004007C,\n    0x00000018, 0x000029D6, 0x00004249, 0x000500C2, 0x0000000B, 0x00004BAB,\n    0x000027FA, 0x00000A64, 0x00040070, 0x0000000D, 0x00004815, 0x00004BAB,\n    0x00050085, 0x0000000D, 0x00003E26, 0x00004815, 0x00000149, 0x00050051,\n    0x0000000D, 0x000053C9, 0x000029D6, 0x00000000, 0x00050051, 0x0000000D,\n    0x00002A5C, 0x000029D6, 0x00000001, 0x00050051, 0x0000000D, 0x00002B16,\n    0x000029D6, 0x00000002, 0x00070050, 0x0000001D, 0x00002350, 0x000053C9,\n    0x00002A5C, 0x00002B16, 0x00003E26, 0x000200F9, 0x00003F61, 0x000200F8,\n    0x00001CBD, 0x00050051, 0x0000000B, 0x000056C1, 0x00002AC0, 0x00000000,\n    0x00070050, 0x00000017, 0x00004F0E, 0x000056C1, 0x000056C1, 0x000056C1,\n    0x000056C1, 0x000500C2, 0x00000017, 0x000024A0, 0x00004F0E, 0x0000034D,\n    0x000500C7, 0x00000017, 0x000049AF, 0x000024A0, 0x0000027B, 0x00040070,\n    0x0000001D, 0x00003CBA, 0x000049AF, 0x00050085, 0x0000001D, 0x00004133,\n    0x00003CBA, 0x00000AEE, 0x00050051, 0x0000000B, 0x00005CD5, 0x00002AC0,\n    0x00000001, 0x00070050, 0x00000017, 0x00005150, 0x00005CD5, 0x00005CD5,\n    0x00005CD5, 0x00005CD5, 0x000500C2, 0x00000017, 0x000024A1, 0x00005150,\n    0x0000034D, 0x000500C7, 0x00000017, 0x000049B0, 0x000024A1, 0x0000027B,\n    0x00040070, 0x0000001D, 0x00003CBB, 0x000049B0, 0x00050085, 0x0000001D,\n    0x00004134, 0x00003CBB, 0x00000AEE, 0x00050051, 0x0000000B, 0x00005CD6,\n    0x00002AC0, 0x00000002, 0x00070050, 0x00000017, 0x00005151, 0x00005CD6,\n    0x00005CD6, 0x00005CD6, 0x00005CD6, 0x000500C2, 0x00000017, 0x000024A2,\n    0x00005151, 0x0000034D, 0x000500C7, 0x00000017, 0x000049B1, 0x000024A2,\n    0x0000027B, 0x00040070, 0x0000001D, 0x00003CBC, 0x000049B1, 0x00050085,\n    0x0000001D, 0x00004135, 0x00003CBC, 0x00000AEE, 0x00050051, 0x0000000B,\n    0x00005CD7, 0x00002AC0, 0x00000003, 0x00070050, 0x00000017, 0x00005152,\n    0x00005CD7, 0x00005CD7, 0x00005CD7, 0x00005CD7, 0x000500C2, 0x00000017,\n    0x000024A3, 0x00005152, 0x0000034D, 0x000500C7, 0x00000017, 0x000049B2,\n    0x000024A3, 0x0000027B, 0x00040070, 0x0000001D, 0x00004930, 0x000049B2,\n    0x00050085, 0x0000001D, 0x000026A0, 0x00004930, 0x00000AEE, 0x000200F9,\n    0x00003F61, 0x000200F8, 0x000038FA, 0x00050051, 0x0000000B, 0x000056C2,\n    0x00002AC0, 0x00000000, 0x00070050, 0x00000017, 0x00004F0F, 0x000056C2,\n    0x000056C2, 0x000056C2, 0x000056C2, 0x000500C2, 0x00000017, 0x000024A4,\n    0x00004F0F, 0x0000028D, 0x000500C7, 0x00000017, 0x00004A5A, 0x000024A4,\n    0x0000064B, 0x00040070, 0x0000001D, 0x000036A5, 0x00004A5A, 0x0005008E,\n    0x0000001D, 0x00004B26, 0x000036A5, 0x0000017A, 0x00050051, 0x0000000B,\n    0x000021A2, 0x00002AC0, 0x00000001, 0x00070050, 0x00000017, 0x0000610E,\n    0x000021A2, 0x000021A2, 0x000021A2, 0x000021A2, 0x000500C2, 0x00000017,\n    0x000024A5, 0x0000610E, 0x0000028D, 0x000500C7, 0x00000017, 0x00004A5B,\n    0x000024A5, 0x0000064B, 0x00040070, 0x0000001D, 0x000036A6, 0x00004A5B,\n    0x0005008E, 0x0000001D, 0x00004B27, 0x000036A6, 0x0000017A, 0x00050051,\n    0x0000000B, 0x000021A3, 0x00002AC0, 0x00000002, 0x00070050, 0x00000017,\n    0x0000610F, 0x000021A3, 0x000021A3, 0x000021A3, 0x000021A3, 0x000500C2,\n    0x00000017, 0x000024A6, 0x0000610F, 0x0000028D, 0x000500C7, 0x00000017,\n    0x00004A5C, 0x000024A6, 0x0000064B, 0x00040070, 0x0000001D, 0x000036A7,\n    0x00004A5C, 0x0005008E, 0x0000001D, 0x00004B28, 0x000036A7, 0x0000017A,\n    0x00050051, 0x0000000B, 0x000021A4, 0x00002AC0, 0x00000003, 0x00070050,\n    0x00000017, 0x00006110, 0x000021A4, 0x000021A4, 0x000021A4, 0x000021A4,\n    0x000500C2, 0x00000017, 0x000024A7, 0x00006110, 0x0000028D, 0x000500C7,\n    0x00000017, 0x00004A5D, 0x000024A7, 0x0000064B, 0x00040070, 0x0000001D,\n    0x0000431B, 0x00004A5D, 0x0005008E, 0x0000001D, 0x00003093, 0x0000431B,\n    0x0000017A, 0x000200F9, 0x00003F61, 0x000200F8, 0x00004BFC, 0x00050051,\n    0x0000000B, 0x0000308E, 0x00002AC0, 0x00000000, 0x0004007C, 0x0000000D,\n    0x00004FEF, 0x0000308E, 0x00050050, 0x00000013, 0x00004339, 0x00004FEF,\n    0x00000A0C, 0x0009004F, 0x0000001D, 0x00002D93, 0x00004339, 0x00004339,\n    0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00050051, 0x0000000B,\n    0x000056B4, 0x00002AC0, 0x00000001, 0x0004007C, 0x0000000D, 0x00003F6B,\n    0x000056B4, 0x00050050, 0x00000013, 0x0000433A, 0x00003F6B, 0x00000A0C,\n    0x0009004F, 0x0000001D, 0x00002D94, 0x0000433A, 0x0000433A, 0x00000000,\n    0x00000001, 0x00000001, 0x00000001, 0x00050051, 0x0000000B, 0x000056B5,\n    0x00002AC0, 0x00000002, 0x0004007C, 0x0000000D, 0x00003F6C, 0x000056B5,\n    0x00050050, 0x00000013, 0x0000433B, 0x00003F6C, 0x00000A0C, 0x0009004F,\n    0x0000001D, 0x00002D95, 0x0000433B, 0x0000433B, 0x00000000, 0x00000001,\n    0x00000001, 0x00000001, 0x00050051, 0x0000000B, 0x000056B6, 0x00002AC0,\n    0x00000003, 0x0004007C, 0x0000000D, 0x00003F6D, 0x000056B6, 0x00050050,\n    0x00000013, 0x00004FAF, 0x00003F6D, 0x00000A0C, 0x0009004F, 0x0000001D,\n    0x00005A3B, 0x00004FAF, 0x00004FAF, 0x00000000, 0x00000001, 0x00000001,\n    0x00000001, 0x000200F9, 0x00003F61, 0x000200F8, 0x00003F61, 0x000F00F5,\n    0x0000001D, 0x00002BAA, 0x00005A3B, 0x00004BFC, 0x00003093, 0x000038FA,\n    0x000026A0, 0x00001CBD, 0x00002350, 0x00001CBC, 0x0000234F, 0x00001FFF,\n    0x0000234E, 0x00002035, 0x000F00F5, 0x0000001D, 0x0000380B, 0x00002D95,\n    0x00004BFC, 0x00004B28, 0x000038FA, 0x00004135, 0x00001CBD, 0x00003DDF,\n    0x00001CBC, 0x00004123, 0x00001FFF, 0x00003914, 0x00002035, 0x000F00F5,\n    0x0000001D, 0x00003B7F, 0x00002D94, 0x00004BFC, 0x00004B27, 0x000038FA,\n    0x00004134, 0x00001CBD, 0x00003DDE, 0x00001CBC, 0x00004122, 0x00001FFF,\n    0x00003913, 0x00002035, 0x000F00F5, 0x0000001D, 0x000038B8, 0x00002D93,\n    0x00004BFC, 0x00004B26, 0x000038FA, 0x00004133, 0x00001CBD, 0x00003DDD,\n    0x00001CBC, 0x00004121, 0x00001FFF, 0x00003912, 0x00002035, 0x000200F9,\n    0x00005310, 0x000200F8, 0x00003B66, 0x000500AA, 0x00000009, 0x00005451,\n    0x0000199B, 0x00000A22, 0x000300F7, 0x00004F25, 0x00000002, 0x000400FA,\n    0x00005451, 0x000019C2, 0x00002302, 0x000200F8, 0x00002302, 0x000500C2,\n    0x0000000B, 0x00005633, 0x00005E78, 0x00000A11, 0x00060041, 0x00000289,\n    0x0000343F, 0x00000CC7, 0x00000A0B, 0x00005633, 0x0004003D, 0x0000000B,\n    0x00003149, 0x0000343F, 0x00050080, 0x0000000B, 0x00002DB7, 0x00005633,\n    0x00000A0D, 0x00060041, 0x00000289, 0x00001908, 0x00000CC7, 0x00000A0B,\n    0x00002DB7, 0x0004003D, 0x0000000B, 0x00001B77, 0x00001908, 0x00050080,\n    0x0000000B, 0x00002148, 0x00005E78, 0x0000199B, 0x000500C2, 0x0000000B,\n    0x000054A9, 0x00002148, 0x00000A11, 0x00060041, 0x00000289, 0x00004C95,\n    0x00000CC7, 0x00000A0B, 0x000054A9, 0x0004003D, 0x0000000B, 0x0000314A,\n    0x00004C95, 0x00050080, 0x0000000B, 0x00002DB8, 0x000054A9, 0x00000A0D,\n    0x00060041, 0x00000289, 0x00005FF4, 0x00000CC7, 0x00000A0B, 0x00002DB8,\n    0x0004003D, 0x0000000B, 0x0000374D, 0x00005FF4, 0x00070050, 0x00000017,\n    0x00004CD7, 0x00003149, 0x00001B77, 0x0000314A, 0x0000374D, 0x00050084,\n    0x0000000B, 0x00004C2C, 0x00000A10, 0x0000199B, 0x00050080, 0x0000000B,\n    0x00002A46, 0x00005E78, 0x00004C2C, 0x000500C2, 0x0000000B, 0x000045E8,\n    0x00002A46, 0x00000A11, 0x00060041, 0x00000289, 0x00004C96, 0x00000CC7,\n    0x00000A0B, 0x000045E8, 0x0004003D, 0x0000000B, 0x0000314B, 0x00004C96,\n    0x00050080, 0x0000000B, 0x00002DB9, 0x000045E8, 0x00000A0D, 0x00060041,\n    0x00000289, 0x0000194C, 0x00000CC7, 0x00000A0B, 0x00002DB9, 0x0004003D,\n    0x0000000B, 0x00005E5C, 0x0000194C, 0x00050084, 0x0000000B, 0x000021F2,\n    0x00000A13, 0x0000199B, 0x00050080, 0x0000000B, 0x00005EC3, 0x00005E78,\n    0x000021F2, 0x000500C2, 0x0000000B, 0x000045E9, 0x00005EC3, 0x00000A11,\n    0x00060041, 0x00000289, 0x00004C97, 0x00000CC7, 0x00000A0B, 0x000045E9,\n    0x0004003D, 0x0000000B, 0x0000314C, 0x00004C97, 0x00050080, 0x0000000B,\n    0x00002DBA, 0x000045E9, 0x00000A0D, 0x00060041, 0x00000289, 0x00005FF5,\n    0x00000CC7, 0x00000A0B, 0x00002DBA, 0x0004003D, 0x0000000B, 0x00003FFF,\n    0x00005FF5, 0x00070050, 0x00000017, 0x00005132, 0x0000314B, 0x00005E5C,\n    0x0000314C, 0x00003FFF, 0x000200F9, 0x00004F25, 0x000200F8, 0x000019C2,\n    0x000500C2, 0x0000000B, 0x00005FA9, 0x00005E78, 0x00000A11, 0x00060041,\n    0x00000289, 0x00003440, 0x00000CC7, 0x00000A0B, 0x00005FA9, 0x0004003D,\n    0x0000000B, 0x0000314D, 0x00003440, 0x00050080, 0x0000000B, 0x00002DBB,\n    0x00005FA9, 0x00000A0D, 0x00060041, 0x00000289, 0x00001909, 0x00000CC7,\n    0x00000A0B, 0x00002DBB, 0x0004003D, 0x0000000B, 0x00005C6A, 0x00001909,\n    0x00050080, 0x0000000B, 0x00002DBC, 0x00005FA9, 0x00000A10, 0x00060041,\n    0x00000289, 0x0000190A, 0x00000CC7, 0x00000A0B, 0x00002DBC, 0x0004003D,\n    0x0000000B, 0x00005C6B, 0x0000190A, 0x00050080, 0x0000000B, 0x00002DBD,\n    0x00005FA9, 0x00000A13, 0x00060041, 0x00000289, 0x00005FF6, 0x00000CC7,\n    0x00000A0B, 0x00002DBD, 0x0004003D, 0x0000000B, 0x00003701, 0x00005FF6,\n    0x00070050, 0x00000017, 0x00005471, 0x0000314D, 0x00005C6A, 0x00005C6B,\n    0x00003701, 0x00050080, 0x0000000B, 0x00004B84, 0x00005BEB, 0x00000237,\n    0x000500C2, 0x0000000B, 0x0000202E, 0x00004B84, 0x00000A11, 0x00060041,\n    0x00000289, 0x00004C98, 0x00000CC7, 0x00000A0B, 0x0000202E, 0x0004003D,\n    0x0000000B, 0x0000314E, 0x00004C98, 0x00050080, 0x0000000B, 0x00002DBE,\n    0x0000202E, 0x00000A0D, 0x00060041, 0x00000289, 0x0000190B, 0x00000CC7,\n    0x00000A0B, 0x00002DBE, 0x0004003D, 0x0000000B, 0x00005C6C, 0x0000190B,\n    0x00050080, 0x0000000B, 0x00002DBF, 0x0000202E, 0x00000A10, 0x00060041,\n    0x00000289, 0x0000190C, 0x00000CC7, 0x00000A0B, 0x00002DBF, 0x0004003D,\n    0x0000000B, 0x00005C6D, 0x0000190C, 0x00050080, 0x0000000B, 0x00002DC0,\n    0x0000202E, 0x00000A13, 0x00060041, 0x00000289, 0x00005FF7, 0x00000CC7,\n    0x00000A0B, 0x00002DC0, 0x0004003D, 0x0000000B, 0x00004000, 0x00005FF7,\n    0x00070050, 0x00000017, 0x00005133, 0x0000314E, 0x00005C6C, 0x00005C6D,\n    0x00004000, 0x000200F9, 0x00004F25, 0x000200F8, 0x00004F25, 0x000700F5,\n    0x00000017, 0x00002BCE, 0x00005133, 0x000019C2, 0x00005132, 0x00002302,\n    0x000700F5, 0x00000017, 0x00003721, 0x00005471, 0x000019C2, 0x00004CD7,\n    0x00002302, 0x000300F7, 0x00004F26, 0x00000000, 0x000700FB, 0x00002180,\n    0x00004F57, 0x00000005, 0x00002159, 0x00000007, 0x00002036, 0x000200F8,\n    0x00002036, 0x00050051, 0x0000000B, 0x00005F5B, 0x00003721, 0x00000000,\n    0x0006000C, 0x00000013, 0x0000606A, 0x00000001, 0x0000003E, 0x00005F5B,\n    0x00050051, 0x0000000D, 0x00002779, 0x0000606A, 0x00000000, 0x00050051,\n    0x0000000D, 0x00003EBC, 0x0000606A, 0x00000001, 0x00050051, 0x0000000B,\n    0x00004285, 0x00003721, 0x00000001, 0x0006000C, 0x00000013, 0x00003CF9,\n    0x00000001, 0x0000003E, 0x00004285, 0x00050051, 0x0000000D, 0x0000276E,\n    0x00003CF9, 0x00000000, 0x00050051, 0x0000000D, 0x0000444F, 0x00003CF9,\n    0x00000001, 0x00070050, 0x0000001D, 0x00003915, 0x00002779, 0x00003EBC,\n    0x0000276E, 0x0000444F, 0x00050051, 0x0000000B, 0x00004383, 0x00003721,\n    0x00000002, 0x0006000C, 0x00000013, 0x00004674, 0x00000001, 0x0000003E,\n    0x00004383, 0x00050051, 0x0000000D, 0x0000277A, 0x00004674, 0x00000000,\n    0x00050051, 0x0000000D, 0x00003EBD, 0x00004674, 0x00000001, 0x00050051,\n    0x0000000B, 0x00004286, 0x00003721, 0x00000003, 0x0006000C, 0x00000013,\n    0x00003CFA, 0x00000001, 0x0000003E, 0x00004286, 0x00050051, 0x0000000D,\n    0x0000276F, 0x00003CFA, 0x00000000, 0x00050051, 0x0000000D, 0x00004450,\n    0x00003CFA, 0x00000001, 0x00070050, 0x0000001D, 0x00003916, 0x0000277A,\n    0x00003EBD, 0x0000276F, 0x00004450, 0x00050051, 0x0000000B, 0x00004384,\n    0x00002BCE, 0x00000000, 0x0006000C, 0x00000013, 0x00004675, 0x00000001,\n    0x0000003E, 0x00004384, 0x00050051, 0x0000000D, 0x0000277B, 0x00004675,\n    0x00000000, 0x00050051, 0x0000000D, 0x00003EBE, 0x00004675, 0x00000001,\n    0x00050051, 0x0000000B, 0x00004287, 0x00002BCE, 0x00000001, 0x0006000C,\n    0x00000013, 0x00003CFB, 0x00000001, 0x0000003E, 0x00004287, 0x00050051,\n    0x0000000D, 0x00002770, 0x00003CFB, 0x00000000, 0x00050051, 0x0000000D,\n    0x00004451, 0x00003CFB, 0x00000001, 0x00070050, 0x0000001D, 0x00003917,\n    0x0000277B, 0x00003EBE, 0x00002770, 0x00004451, 0x00050051, 0x0000000B,\n    0x00004385, 0x00002BCE, 0x00000002, 0x0006000C, 0x00000013, 0x00004676,\n    0x00000001, 0x0000003E, 0x00004385, 0x00050051, 0x0000000D, 0x0000277C,\n    0x00004676, 0x00000000, 0x00050051, 0x0000000D, 0x00003EBF, 0x00004676,\n    0x00000001, 0x00050051, 0x0000000B, 0x00004288, 0x00002BCE, 0x00000003,\n    0x0006000C, 0x00000013, 0x00003CFC, 0x00000001, 0x0000003E, 0x00004288,\n    0x00050051, 0x0000000D, 0x00002771, 0x00003CFC, 0x00000000, 0x00050051,\n    0x0000000D, 0x000050C1, 0x00003CFC, 0x00000001, 0x00070050, 0x0000001D,\n    0x00002351, 0x0000277C, 0x00003EBF, 0x00002771, 0x000050C1, 0x000200F9,\n    0x00004F26, 0x000200F8, 0x00002159, 0x0007004F, 0x00000011, 0x000025FC,\n    0x00003721, 0x00003721, 0x00000000, 0x00000001, 0x0004007C, 0x00000012,\n    0x00005B3D, 0x000025FC, 0x0009004F, 0x0000001A, 0x000060D2, 0x00005B3D,\n    0x00005B3D, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x000500C4,\n    0x0000001A, 0x000048AA, 0x000060D2, 0x00000122, 0x000500C3, 0x0000001A,\n    0x00003D91, 0x000048AA, 0x00000302, 0x0004006F, 0x0000001D, 0x00002AAB,\n    0x00003D91, 0x0005008E, 0x0000001D, 0x00004725, 0x00002AAB, 0x000007FE,\n    0x0007000C, 0x0000001D, 0x00006294, 0x00000001, 0x00000028, 0x00000504,\n    0x00004725, 0x0007004F, 0x00000011, 0x0000376E, 0x00003721, 0x00003721,\n    0x00000002, 0x00000003, 0x0004007C, 0x00000012, 0x000024C2, 0x0000376E,\n    0x0009004F, 0x0000001A, 0x000060D3, 0x000024C2, 0x000024C2, 0x00000000,\n    0x00000000, 0x00000001, 0x00000001, 0x000500C4, 0x0000001A, 0x000048AB,\n    0x000060D3, 0x00000122, 0x000500C3, 0x0000001A, 0x00003D92, 0x000048AB,\n    0x00000302, 0x0004006F, 0x0000001D, 0x00002AAC, 0x00003D92, 0x0005008E,\n    0x0000001D, 0x00004726, 0x00002AAC, 0x000007FE, 0x0007000C, 0x0000001D,\n    0x00006295, 0x00000001, 0x00000028, 0x00000504, 0x00004726, 0x0007004F,\n    0x00000011, 0x0000376F, 0x00002BCE, 0x00002BCE, 0x00000000, 0x00000001,\n    0x0004007C, 0x00000012, 0x000024C3, 0x0000376F, 0x0009004F, 0x0000001A,\n    0x000060D4, 0x000024C3, 0x000024C3, 0x00000000, 0x00000000, 0x00000001,\n    0x00000001, 0x000500C4, 0x0000001A, 0x000048AC, 0x000060D4, 0x00000122,\n    0x000500C3, 0x0000001A, 0x00003D93, 0x000048AC, 0x00000302, 0x0004006F,\n    0x0000001D, 0x00002AAD, 0x00003D93, 0x0005008E, 0x0000001D, 0x00004727,\n    0x00002AAD, 0x000007FE, 0x0007000C, 0x0000001D, 0x00006296, 0x00000001,\n    0x00000028, 0x00000504, 0x00004727, 0x0007004F, 0x00000011, 0x00003770,\n    0x00002BCE, 0x00002BCE, 0x00000002, 0x00000003, 0x0004007C, 0x00000012,\n    0x000024C4, 0x00003770, 0x0009004F, 0x0000001A, 0x000060D5, 0x000024C4,\n    0x000024C4, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x000500C4,\n    0x0000001A, 0x000048AD, 0x000060D5, 0x00000122, 0x000500C3, 0x0000001A,\n    0x00003D94, 0x000048AD, 0x00000302, 0x0004006F, 0x0000001D, 0x00002AAE,\n    0x00003D94, 0x0005008E, 0x0000001D, 0x000053C0, 0x00002AAE, 0x000007FE,\n    0x0007000C, 0x0000001D, 0x00004363, 0x00000001, 0x00000028, 0x00000504,\n    0x000053C0, 0x000200F9, 0x00004F26, 0x000200F8, 0x00004F57, 0x0007004F,\n    0x00000011, 0x00002622, 0x00003721, 0x00003721, 0x00000000, 0x00000001,\n    0x0004007C, 0x00000013, 0x0000515A, 0x00002622, 0x00050051, 0x0000000D,\n    0x00001B7F, 0x0000515A, 0x00000000, 0x00050051, 0x0000000D, 0x0000346D,\n    0x0000515A, 0x00000001, 0x00070050, 0x0000001D, 0x0000427B, 0x00001B7F,\n    0x0000346D, 0x00000A0C, 0x00000A0C, 0x0007004F, 0x00000011, 0x000041DB,\n    0x00003721, 0x00003721, 0x00000002, 0x00000003, 0x0004007C, 0x00000013,\n    0x00003760, 0x000041DB, 0x00050051, 0x0000000D, 0x00001B80, 0x00003760,\n    0x00000000, 0x00050051, 0x0000000D, 0x0000346E, 0x00003760, 0x00000001,\n    0x00070050, 0x0000001D, 0x0000427C, 0x00001B80, 0x0000346E, 0x00000A0C,\n    0x00000A0C, 0x0007004F, 0x00000011, 0x000041DC, 0x00002BCE, 0x00002BCE,\n    0x00000000, 0x00000001, 0x0004007C, 0x00000013, 0x00003761, 0x000041DC,\n    0x00050051, 0x0000000D, 0x00001B81, 0x00003761, 0x00000000, 0x00050051,\n    0x0000000D, 0x0000346F, 0x00003761, 0x00000001, 0x00070050, 0x0000001D,\n    0x0000427D, 0x00001B81, 0x0000346F, 0x00000A0C, 0x00000A0C, 0x0007004F,\n    0x00000011, 0x000041DD, 0x00002BCE, 0x00002BCE, 0x00000002, 0x00000003,\n    0x0004007C, 0x00000013, 0x00003762, 0x000041DD, 0x00050051, 0x0000000D,\n    0x00001B82, 0x00003762, 0x00000000, 0x00050051, 0x0000000D, 0x00004109,\n    0x00003762, 0x00000001, 0x00070050, 0x0000001D, 0x00002352, 0x00001B82,\n    0x00004109, 0x00000A0C, 0x00000A0C, 0x000200F9, 0x00004F26, 0x000200F8,\n    0x00004F26, 0x000900F5, 0x0000001D, 0x00002BAB, 0x00002352, 0x00004F57,\n    0x00004363, 0x00002159, 0x00002351, 0x00002036, 0x000900F5, 0x0000001D,\n    0x0000380C, 0x0000427D, 0x00004F57, 0x00006296, 0x00002159, 0x00003917,\n    0x00002036, 0x000900F5, 0x0000001D, 0x00003B80, 0x0000427C, 0x00004F57,\n    0x00006295, 0x00002159, 0x00003916, 0x00002036, 0x000900F5, 0x0000001D,\n    0x000038B9, 0x0000427B, 0x00004F57, 0x00006294, 0x00002159, 0x00003915,\n    0x00002036, 0x000200F9, 0x00005310, 0x000200F8, 0x00005310, 0x000700F5,\n    0x0000001D, 0x00002BAC, 0x00002BAB, 0x00004F26, 0x00002BAA, 0x00003F61,\n    0x000700F5, 0x0000001D, 0x0000380D, 0x0000380C, 0x00004F26, 0x0000380B,\n    0x00003F61, 0x000700F5, 0x0000001D, 0x00003295, 0x00003B80, 0x00004F26,\n    0x00003B7F, 0x00003F61, 0x000700F5, 0x0000001D, 0x0000367A, 0x000038B9,\n    0x00004F26, 0x000038B8, 0x00003F61, 0x00050081, 0x0000001D, 0x00004359,\n    0x000020D3, 0x0000367A, 0x00050081, 0x0000001D, 0x00005B01, 0x000035EC,\n    0x00003295, 0x00050081, 0x0000001D, 0x00001F92, 0x0000380A, 0x0000380D,\n    0x00050081, 0x0000001D, 0x00005113, 0x00002BA9, 0x00002BAC, 0x000500AE,\n    0x00000009, 0x0000387D, 0x00003F4D, 0x00000A1C, 0x000300F7, 0x00005ECB,\n    0x00000002, 0x000400FA, 0x0000387D, 0x000026B1, 0x00005ECB, 0x000200F8,\n    0x000026B1, 0x000500C4, 0x0000000B, 0x000037B2, 0x00000A16, 0x000023AA,\n    0x00050085, 0x0000000D, 0x00002F3A, 0x00002B2C, 0x0000016E, 0x00050080,\n    0x0000000B, 0x000051FC, 0x00005BEB, 0x000037B2, 0x000300F7, 0x00005311,\n    0x00000002, 0x000400FA, 0x00005AEF, 0x00003B67, 0x000040BB, 0x000200F8,\n    0x000040BB, 0x000500AA, 0x00000009, 0x00004ADD, 0x0000199B, 0x00000A16,\n    0x000300F7, 0x00004F4B, 0x00000002, 0x000400FA, 0x00004ADD, 0x000019C3,\n    0x00002303, 0x000200F8, 0x00002303, 0x000500C2, 0x0000000B, 0x00005634,\n    0x000051FC, 0x00000A11, 0x00060041, 0x00000289, 0x00003441, 0x00000CC7,\n    0x00000A0B, 0x00005634, 0x0004003D, 0x0000000B, 0x00003AD6, 0x00003441,\n    0x00050080, 0x0000000B, 0x00002149, 0x000051FC, 0x0000199B, 0x000500C2,\n    0x0000000B, 0x000054AA, 0x00002149, 0x00000A11, 0x00060041, 0x00000289,\n    0x00004CE1, 0x00000CC7, 0x00000A0B, 0x000054AA, 0x0004003D, 0x0000000B,\n    0x0000333E, 0x00004CE1, 0x00050084, 0x0000000B, 0x000021F3, 0x00000A10,\n    0x0000199B, 0x00050080, 0x0000000B, 0x00005EC4, 0x000051FC, 0x000021F3,\n    0x000500C2, 0x0000000B, 0x000045EA, 0x00005EC4, 0x00000A11, 0x00060041,\n    0x00000289, 0x00004CE2, 0x00000CC7, 0x00000A0B, 0x000045EA, 0x0004003D,\n    0x0000000B, 0x0000333F, 0x00004CE2, 0x00050084, 0x0000000B, 0x000021F4,\n    0x00000A13, 0x0000199B, 0x00050080, 0x0000000B, 0x00005EC5, 0x000051FC,\n    0x000021F4, 0x000500C2, 0x0000000B, 0x000045EB, 0x00005EC5, 0x00000A11,\n    0x00060041, 0x00000289, 0x00004903, 0x00000CC7, 0x00000A0B, 0x000045EB,\n    0x0004003D, 0x0000000B, 0x00005F5C, 0x00004903, 0x00070050, 0x00000017,\n    0x00005134, 0x00003AD6, 0x0000333E, 0x0000333F, 0x00005F5C, 0x000200F9,\n    0x00004F4B, 0x000200F8, 0x000019C3, 0x000500C2, 0x0000000B, 0x00005FAA,\n    0x000051FC, 0x00000A11, 0x00060041, 0x00000289, 0x00003442, 0x00000CC7,\n    0x00000A0B, 0x00005FAA, 0x0004003D, 0x0000000B, 0x0000314F, 0x00003442,\n    0x00050080, 0x0000000B, 0x00002DC1, 0x00005FAA, 0x00000A0D, 0x00060041,\n    0x00000289, 0x0000190D, 0x00000CC7, 0x00000A0B, 0x00002DC1, 0x0004003D,\n    0x0000000B, 0x00005C6E, 0x0000190D, 0x00050080, 0x0000000B, 0x00002DC2,\n    0x00005FAA, 0x00000A10, 0x00060041, 0x00000289, 0x0000190E, 0x00000CC7,\n    0x00000A0B, 0x00002DC2, 0x0004003D, 0x0000000B, 0x00005C6F, 0x0000190E,\n    0x00050080, 0x0000000B, 0x00002DC3, 0x00005FAA, 0x00000A13, 0x00060041,\n    0x00000289, 0x00005FF8, 0x00000CC7, 0x00000A0B, 0x00002DC3, 0x0004003D,\n    0x0000000B, 0x00004001, 0x00005FF8, 0x00070050, 0x00000017, 0x00005135,\n    0x0000314F, 0x00005C6E, 0x00005C6F, 0x00004001, 0x000200F9, 0x00004F4B,\n    0x000200F8, 0x00004F4B, 0x000700F5, 0x00000017, 0x00002AC1, 0x00005135,\n    0x000019C3, 0x00005134, 0x00002303, 0x000300F7, 0x00003F62, 0x00000000,\n    0x001300FB, 0x00002180, 0x00004BFD, 0x00000000, 0x000038FB, 0x00000001,\n    0x000038FB, 0x00000002, 0x00001CBF, 0x0000000A, 0x00001CBF, 0x00000003,\n    0x00001CBE, 0x0000000C, 0x00001CBE, 0x00000004, 0x00002000, 0x00000006,\n    0x00002037, 0x000200F8, 0x00002037, 0x00050051, 0x0000000B, 0x00005F5D,\n    0x00002AC1, 0x00000000, 0x0006000C, 0x00000013, 0x0000606B, 0x00000001,\n    0x0000003E, 0x00005F5D, 0x00050051, 0x0000000D, 0x00002772, 0x0000606B,\n    0x00000000, 0x00050051, 0x0000000D, 0x00004452, 0x0000606B, 0x00000001,\n    0x00070050, 0x0000001D, 0x00003918, 0x00002772, 0x00004452, 0x00000A0C,\n    0x00000A0C, 0x00050051, 0x0000000B, 0x00004386, 0x00002AC1, 0x00000001,\n    0x0006000C, 0x00000013, 0x00004677, 0x00000001, 0x0000003E, 0x00004386,\n    0x00050051, 0x0000000D, 0x00002773, 0x00004677, 0x00000000, 0x00050051,\n    0x0000000D, 0x00004453, 0x00004677, 0x00000001, 0x00070050, 0x0000001D,\n    0x00003919, 0x00002773, 0x00004453, 0x00000A0C, 0x00000A0C, 0x00050051,\n    0x0000000B, 0x00004387, 0x00002AC1, 0x00000002, 0x0006000C, 0x00000013,\n    0x00004678, 0x00000001, 0x0000003E, 0x00004387, 0x00050051, 0x0000000D,\n    0x00002774, 0x00004678, 0x00000000, 0x00050051, 0x0000000D, 0x00004454,\n    0x00004678, 0x00000001, 0x00070050, 0x0000001D, 0x0000391A, 0x00002774,\n    0x00004454, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x00004388,\n    0x00002AC1, 0x00000003, 0x0006000C, 0x00000013, 0x00004679, 0x00000001,\n    0x0000003E, 0x00004388, 0x00050051, 0x0000000D, 0x0000277D, 0x00004679,\n    0x00000000, 0x00050051, 0x0000000D, 0x000050C2, 0x00004679, 0x00000001,\n    0x00070050, 0x0000001D, 0x00002353, 0x0000277D, 0x000050C2, 0x00000A0C,\n    0x00000A0C, 0x000200F9, 0x00003F62, 0x000200F8, 0x00002000, 0x00050051,\n    0x0000000B, 0x0000308F, 0x00002AC1, 0x00000000, 0x0004007C, 0x0000000C,\n    0x0000589F, 0x0000308F, 0x00050050, 0x00000012, 0x00004728, 0x0000589F,\n    0x0000589F, 0x000500C4, 0x00000012, 0x000047B5, 0x00004728, 0x000007A7,\n    0x000500C3, 0x00000012, 0x0000341F, 0x000047B5, 0x00000867, 0x0004006F,\n    0x00000013, 0x00002AAF, 0x0000341F, 0x0005008E, 0x00000013, 0x0000474F,\n    0x00002AAF, 0x000007FE, 0x0007000C, 0x00000013, 0x00005E0E, 0x00000001,\n    0x00000028, 0x00000049, 0x0000474F, 0x00050051, 0x0000000D, 0x00005F12,\n    0x00005E0E, 0x00000000, 0x00050051, 0x0000000D, 0x00003CDA, 0x00005E0E,\n    0x00000001, 0x00070050, 0x0000001D, 0x00004124, 0x00005F12, 0x00003CDA,\n    0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x00004C48, 0x00002AC1,\n    0x00000001, 0x0004007C, 0x0000000C, 0x00003EA7, 0x00004C48, 0x00050050,\n    0x00000012, 0x00004729, 0x00003EA7, 0x00003EA7, 0x000500C4, 0x00000012,\n    0x000047B6, 0x00004729, 0x000007A7, 0x000500C3, 0x00000012, 0x00003420,\n    0x000047B6, 0x00000867, 0x0004006F, 0x00000013, 0x00002AB0, 0x00003420,\n    0x0005008E, 0x00000013, 0x00004750, 0x00002AB0, 0x000007FE, 0x0007000C,\n    0x00000013, 0x00005E0F, 0x00000001, 0x00000028, 0x00000049, 0x00004750,\n    0x00050051, 0x0000000D, 0x00005F13, 0x00005E0F, 0x00000000, 0x00050051,\n    0x0000000D, 0x00003CDB, 0x00005E0F, 0x00000001, 0x00070050, 0x0000001D,\n    0x00004125, 0x00005F13, 0x00003CDB, 0x00000A0C, 0x00000A0C, 0x00050051,\n    0x0000000B, 0x00004C49, 0x00002AC1, 0x00000002, 0x0004007C, 0x0000000C,\n    0x00003EA8, 0x00004C49, 0x00050050, 0x00000012, 0x0000472A, 0x00003EA8,\n    0x00003EA8, 0x000500C4, 0x00000012, 0x000047B7, 0x0000472A, 0x000007A7,\n    0x000500C3, 0x00000012, 0x00003421, 0x000047B7, 0x00000867, 0x0004006F,\n    0x00000013, 0x00002AB1, 0x00003421, 0x0005008E, 0x00000013, 0x00004751,\n    0x00002AB1, 0x000007FE, 0x0007000C, 0x00000013, 0x00005E10, 0x00000001,\n    0x00000028, 0x00000049, 0x00004751, 0x00050051, 0x0000000D, 0x00005F14,\n    0x00005E10, 0x00000000, 0x00050051, 0x0000000D, 0x00003CDC, 0x00005E10,\n    0x00000001, 0x00070050, 0x0000001D, 0x00004126, 0x00005F14, 0x00003CDC,\n    0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x00004C4A, 0x00002AC1,\n    0x00000003, 0x0004007C, 0x0000000C, 0x00003EA9, 0x00004C4A, 0x00050050,\n    0x00000012, 0x0000472B, 0x00003EA9, 0x00003EA9, 0x000500C4, 0x00000012,\n    0x000047B8, 0x0000472B, 0x000007A7, 0x000500C3, 0x00000012, 0x00003422,\n    0x000047B8, 0x00000867, 0x0004006F, 0x00000013, 0x00002AB2, 0x00003422,\n    0x0005008E, 0x00000013, 0x00004752, 0x00002AB2, 0x000007FE, 0x0007000C,\n    0x00000013, 0x00005E11, 0x00000001, 0x00000028, 0x00000049, 0x00004752,\n    0x00050051, 0x0000000D, 0x00005F15, 0x00005E11, 0x00000000, 0x00050051,\n    0x0000000D, 0x0000494E, 0x00005E11, 0x00000001, 0x00070050, 0x0000001D,\n    0x00002354, 0x00005F15, 0x0000494E, 0x00000A0C, 0x00000A0C, 0x000200F9,\n    0x00003F62, 0x000200F8, 0x00001CBE, 0x00050051, 0x0000000B, 0x000056C3,\n    0x00002AC1, 0x00000000, 0x00060050, 0x00000014, 0x00004F10, 0x000056C3,\n    0x000056C3, 0x000056C3, 0x000500C2, 0x00000014, 0x00002B17, 0x00004F10,\n    0x00000BB4, 0x000500C7, 0x00000014, 0x00005DEE, 0x00002B17, 0x00000105,\n    0x000500C7, 0x00000014, 0x000048A4, 0x00002B17, 0x00000466, 0x000500C2,\n    0x00000014, 0x00005B98, 0x00005DEE, 0x00000B0C, 0x000500AA, 0x00000010,\n    0x000040D1, 0x00005B98, 0x00000A12, 0x0006000C, 0x00000016, 0x00002C53,\n    0x00000001, 0x0000004B, 0x000048A4, 0x0004007C, 0x00000014, 0x00002A1D,\n    0x00002C53, 0x00050082, 0x00000014, 0x00001882, 0x00000B0C, 0x00002A1D,\n    0x00050080, 0x00000014, 0x00002218, 0x00002A1D, 0x00000938, 0x000600A9,\n    0x00000014, 0x00002877, 0x000040D1, 0x00002218, 0x00005B98, 0x000500C4,\n    0x00000014, 0x00005ADC, 0x000048A4, 0x00001882, 0x000500C7, 0x00000014,\n    0x000049A2, 0x00005ADC, 0x00000466, 0x000600A9, 0x00000014, 0x00002AB3,\n    0x000040D1, 0x000049A2, 0x000048A4, 0x00050080, 0x00000014, 0x00006001,\n    0x00002877, 0x000003FA, 0x000500C4, 0x00000014, 0x00004F87, 0x00006001,\n    0x00000189, 0x000500C4, 0x00000014, 0x00003FAE, 0x00002AB3, 0x0000008D,\n    0x000500C5, 0x00000014, 0x00005784, 0x00004F87, 0x00003FAE, 0x000500AA,\n    0x00000010, 0x00003608, 0x00005DEE, 0x00000A12, 0x000600A9, 0x00000014,\n    0x0000424A, 0x00003608, 0x00000A12, 0x00005784, 0x0004007C, 0x00000018,\n    0x000029D7, 0x0000424A, 0x000500C2, 0x0000000B, 0x00004BAC, 0x000056C3,\n    0x00000A64, 0x00040070, 0x0000000D, 0x00004816, 0x00004BAC, 0x00050085,\n    0x0000000D, 0x00003E27, 0x00004816, 0x00000149, 0x00050051, 0x0000000D,\n    0x000053CA, 0x000029D7, 0x00000000, 0x00050051, 0x0000000D, 0x00002A5D,\n    0x000029D7, 0x00000001, 0x00050051, 0x0000000D, 0x00001E9F, 0x000029D7,\n    0x00000002, 0x00070050, 0x0000001D, 0x00003DE0, 0x000053CA, 0x00002A5D,\n    0x00001E9F, 0x00003E27, 0x00050051, 0x0000000B, 0x000027FB, 0x00002AC1,\n    0x00000001, 0x00060050, 0x00000014, 0x00003514, 0x000027FB, 0x000027FB,\n    0x000027FB, 0x000500C2, 0x00000014, 0x00002B18, 0x00003514, 0x00000BB4,\n    0x000500C7, 0x00000014, 0x00005DEF, 0x00002B18, 0x00000105, 0x000500C7,\n    0x00000014, 0x000048A5, 0x00002B18, 0x00000466, 0x000500C2, 0x00000014,\n    0x00005B99, 0x00005DEF, 0x00000B0C, 0x000500AA, 0x00000010, 0x000040D2,\n    0x00005B99, 0x00000A12, 0x0006000C, 0x00000016, 0x00002C54, 0x00000001,\n    0x0000004B, 0x000048A5, 0x0004007C, 0x00000014, 0x00002A1E, 0x00002C54,\n    0x00050082, 0x00000014, 0x00001883, 0x00000B0C, 0x00002A1E, 0x00050080,\n    0x00000014, 0x00002219, 0x00002A1E, 0x00000938, 0x000600A9, 0x00000014,\n    0x00002878, 0x000040D2, 0x00002219, 0x00005B99, 0x000500C4, 0x00000014,\n    0x00005ADD, 0x000048A5, 0x00001883, 0x000500C7, 0x00000014, 0x000049A3,\n    0x00005ADD, 0x00000466, 0x000600A9, 0x00000014, 0x00002AB4, 0x000040D2,\n    0x000049A3, 0x000048A5, 0x00050080, 0x00000014, 0x00006002, 0x00002878,\n    0x000003FA, 0x000500C4, 0x00000014, 0x00004F88, 0x00006002, 0x00000189,\n    0x000500C4, 0x00000014, 0x00003FAF, 0x00002AB4, 0x0000008D, 0x000500C5,\n    0x00000014, 0x00005785, 0x00004F88, 0x00003FAF, 0x000500AA, 0x00000010,\n    0x00003609, 0x00005DEF, 0x00000A12, 0x000600A9, 0x00000014, 0x0000424B,\n    0x00003609, 0x00000A12, 0x00005785, 0x0004007C, 0x00000018, 0x000029D8,\n    0x0000424B, 0x000500C2, 0x0000000B, 0x00004BAD, 0x000027FB, 0x00000A64,\n    0x00040070, 0x0000000D, 0x00004817, 0x00004BAD, 0x00050085, 0x0000000D,\n    0x00003E28, 0x00004817, 0x00000149, 0x00050051, 0x0000000D, 0x000053CB,\n    0x000029D8, 0x00000000, 0x00050051, 0x0000000D, 0x00002A5E, 0x000029D8,\n    0x00000001, 0x00050051, 0x0000000D, 0x00001EA0, 0x000029D8, 0x00000002,\n    0x00070050, 0x0000001D, 0x00003DE1, 0x000053CB, 0x00002A5E, 0x00001EA0,\n    0x00003E28, 0x00050051, 0x0000000B, 0x000027FC, 0x00002AC1, 0x00000002,\n    0x00060050, 0x00000014, 0x00003515, 0x000027FC, 0x000027FC, 0x000027FC,\n    0x000500C2, 0x00000014, 0x00002B19, 0x00003515, 0x00000BB4, 0x000500C7,\n    0x00000014, 0x00005DF0, 0x00002B19, 0x00000105, 0x000500C7, 0x00000014,\n    0x000048AE, 0x00002B19, 0x00000466, 0x000500C2, 0x00000014, 0x00005B9A,\n    0x00005DF0, 0x00000B0C, 0x000500AA, 0x00000010, 0x000040D3, 0x00005B9A,\n    0x00000A12, 0x0006000C, 0x00000016, 0x00002C55, 0x00000001, 0x0000004B,\n    0x000048AE, 0x0004007C, 0x00000014, 0x00002A1F, 0x00002C55, 0x00050082,\n    0x00000014, 0x00001884, 0x00000B0C, 0x00002A1F, 0x00050080, 0x00000014,\n    0x0000221A, 0x00002A1F, 0x00000938, 0x000600A9, 0x00000014, 0x00002879,\n    0x000040D3, 0x0000221A, 0x00005B9A, 0x000500C4, 0x00000014, 0x00005ADE,\n    0x000048AE, 0x00001884, 0x000500C7, 0x00000014, 0x000049A4, 0x00005ADE,\n    0x00000466, 0x000600A9, 0x00000014, 0x00002AB5, 0x000040D3, 0x000049A4,\n    0x000048AE, 0x00050080, 0x00000014, 0x00006003, 0x00002879, 0x000003FA,\n    0x000500C4, 0x00000014, 0x00004F89, 0x00006003, 0x00000189, 0x000500C4,\n    0x00000014, 0x00003FB0, 0x00002AB5, 0x0000008D, 0x000500C5, 0x00000014,\n    0x00005786, 0x00004F89, 0x00003FB0, 0x000500AA, 0x00000010, 0x0000360A,\n    0x00005DF0, 0x00000A12, 0x000600A9, 0x00000014, 0x0000424C, 0x0000360A,\n    0x00000A12, 0x00005786, 0x0004007C, 0x00000018, 0x000029D9, 0x0000424C,\n    0x000500C2, 0x0000000B, 0x00004BAE, 0x000027FC, 0x00000A64, 0x00040070,\n    0x0000000D, 0x00004818, 0x00004BAE, 0x00050085, 0x0000000D, 0x00003E29,\n    0x00004818, 0x00000149, 0x00050051, 0x0000000D, 0x000053CC, 0x000029D9,\n    0x00000000, 0x00050051, 0x0000000D, 0x00002A5F, 0x000029D9, 0x00000001,\n    0x00050051, 0x0000000D, 0x00001EA1, 0x000029D9, 0x00000002, 0x00070050,\n    0x0000001D, 0x00003DE2, 0x000053CC, 0x00002A5F, 0x00001EA1, 0x00003E29,\n    0x00050051, 0x0000000B, 0x000027FD, 0x00002AC1, 0x00000003, 0x00060050,\n    0x00000014, 0x00003516, 0x000027FD, 0x000027FD, 0x000027FD, 0x000500C2,\n    0x00000014, 0x00002B1A, 0x00003516, 0x00000BB4, 0x000500C7, 0x00000014,\n    0x00005DF1, 0x00002B1A, 0x00000105, 0x000500C7, 0x00000014, 0x000048AF,\n    0x00002B1A, 0x00000466, 0x000500C2, 0x00000014, 0x00005B9B, 0x00005DF1,\n    0x00000B0C, 0x000500AA, 0x00000010, 0x000040D4, 0x00005B9B, 0x00000A12,\n    0x0006000C, 0x00000016, 0x00002C56, 0x00000001, 0x0000004B, 0x000048AF,\n    0x0004007C, 0x00000014, 0x00002A20, 0x00002C56, 0x00050082, 0x00000014,\n    0x00001885, 0x00000B0C, 0x00002A20, 0x00050080, 0x00000014, 0x0000221B,\n    0x00002A20, 0x00000938, 0x000600A9, 0x00000014, 0x0000287A, 0x000040D4,\n    0x0000221B, 0x00005B9B, 0x000500C4, 0x00000014, 0x00005ADF, 0x000048AF,\n    0x00001885, 0x000500C7, 0x00000014, 0x000049A5, 0x00005ADF, 0x00000466,\n    0x000600A9, 0x00000014, 0x00002AB6, 0x000040D4, 0x000049A5, 0x000048AF,\n    0x00050080, 0x00000014, 0x00006004, 0x0000287A, 0x000003FA, 0x000500C4,\n    0x00000014, 0x00004F8A, 0x00006004, 0x00000189, 0x000500C4, 0x00000014,\n    0x00003FB1, 0x00002AB6, 0x0000008D, 0x000500C5, 0x00000014, 0x00005787,\n    0x00004F8A, 0x00003FB1, 0x000500AA, 0x00000010, 0x0000360B, 0x00005DF1,\n    0x00000A12, 0x000600A9, 0x00000014, 0x0000424D, 0x0000360B, 0x00000A12,\n    0x00005787, 0x0004007C, 0x00000018, 0x000029DA, 0x0000424D, 0x000500C2,\n    0x0000000B, 0x00004BAF, 0x000027FD, 0x00000A64, 0x00040070, 0x0000000D,\n    0x00004819, 0x00004BAF, 0x00050085, 0x0000000D, 0x00003E2A, 0x00004819,\n    0x00000149, 0x00050051, 0x0000000D, 0x000053CD, 0x000029DA, 0x00000000,\n    0x00050051, 0x0000000D, 0x00002A60, 0x000029DA, 0x00000001, 0x00050051,\n    0x0000000D, 0x00002B1B, 0x000029DA, 0x00000002, 0x00070050, 0x0000001D,\n    0x00002355, 0x000053CD, 0x00002A60, 0x00002B1B, 0x00003E2A, 0x000200F9,\n    0x00003F62, 0x000200F8, 0x00001CBF, 0x00050051, 0x0000000B, 0x000056C4,\n    0x00002AC1, 0x00000000, 0x00070050, 0x00000017, 0x00004F11, 0x000056C4,\n    0x000056C4, 0x000056C4, 0x000056C4, 0x000500C2, 0x00000017, 0x000024A8,\n    0x00004F11, 0x0000034D, 0x000500C7, 0x00000017, 0x000049B3, 0x000024A8,\n    0x0000027B, 0x00040070, 0x0000001D, 0x00003CBD, 0x000049B3, 0x00050085,\n    0x0000001D, 0x00004136, 0x00003CBD, 0x00000AEE, 0x00050051, 0x0000000B,\n    0x00005CD8, 0x00002AC1, 0x00000001, 0x00070050, 0x00000017, 0x00005153,\n    0x00005CD8, 0x00005CD8, 0x00005CD8, 0x00005CD8, 0x000500C2, 0x00000017,\n    0x000024A9, 0x00005153, 0x0000034D, 0x000500C7, 0x00000017, 0x000049B4,\n    0x000024A9, 0x0000027B, 0x00040070, 0x0000001D, 0x00003CBE, 0x000049B4,\n    0x00050085, 0x0000001D, 0x00004137, 0x00003CBE, 0x00000AEE, 0x00050051,\n    0x0000000B, 0x00005CD9, 0x00002AC1, 0x00000002, 0x00070050, 0x00000017,\n    0x00005154, 0x00005CD9, 0x00005CD9, 0x00005CD9, 0x00005CD9, 0x000500C2,\n    0x00000017, 0x000024AA, 0x00005154, 0x0000034D, 0x000500C7, 0x00000017,\n    0x000049B5, 0x000024AA, 0x0000027B, 0x00040070, 0x0000001D, 0x00003CBF,\n    0x000049B5, 0x00050085, 0x0000001D, 0x00004138, 0x00003CBF, 0x00000AEE,\n    0x00050051, 0x0000000B, 0x00005CDA, 0x00002AC1, 0x00000003, 0x00070050,\n    0x00000017, 0x00005155, 0x00005CDA, 0x00005CDA, 0x00005CDA, 0x00005CDA,\n    0x000500C2, 0x00000017, 0x000024AB, 0x00005155, 0x0000034D, 0x000500C7,\n    0x00000017, 0x000049B6, 0x000024AB, 0x0000027B, 0x00040070, 0x0000001D,\n    0x00004931, 0x000049B6, 0x00050085, 0x0000001D, 0x000026A1, 0x00004931,\n    0x00000AEE, 0x000200F9, 0x00003F62, 0x000200F8, 0x000038FB, 0x00050051,\n    0x0000000B, 0x000056C5, 0x00002AC1, 0x00000000, 0x00070050, 0x00000017,\n    0x00004F12, 0x000056C5, 0x000056C5, 0x000056C5, 0x000056C5, 0x000500C2,\n    0x00000017, 0x000024AC, 0x00004F12, 0x0000028D, 0x000500C7, 0x00000017,\n    0x00004A5E, 0x000024AC, 0x0000064B, 0x00040070, 0x0000001D, 0x000036A8,\n    0x00004A5E, 0x0005008E, 0x0000001D, 0x00004B29, 0x000036A8, 0x0000017A,\n    0x00050051, 0x0000000B, 0x000021A5, 0x00002AC1, 0x00000001, 0x00070050,\n    0x00000017, 0x00006111, 0x000021A5, 0x000021A5, 0x000021A5, 0x000021A5,\n    0x000500C2, 0x00000017, 0x000024AD, 0x00006111, 0x0000028D, 0x000500C7,\n    0x00000017, 0x00004A5F, 0x000024AD, 0x0000064B, 0x00040070, 0x0000001D,\n    0x000036A9, 0x00004A5F, 0x0005008E, 0x0000001D, 0x00004B2A, 0x000036A9,\n    0x0000017A, 0x00050051, 0x0000000B, 0x000021A6, 0x00002AC1, 0x00000002,\n    0x00070050, 0x00000017, 0x00006112, 0x000021A6, 0x000021A6, 0x000021A6,\n    0x000021A6, 0x000500C2, 0x00000017, 0x000024AE, 0x00006112, 0x0000028D,\n    0x000500C7, 0x00000017, 0x00004A60, 0x000024AE, 0x0000064B, 0x00040070,\n    0x0000001D, 0x000036AA, 0x00004A60, 0x0005008E, 0x0000001D, 0x00004B2B,\n    0x000036AA, 0x0000017A, 0x00050051, 0x0000000B, 0x000021A7, 0x00002AC1,\n    0x00000003, 0x00070050, 0x00000017, 0x00006113, 0x000021A7, 0x000021A7,\n    0x000021A7, 0x000021A7, 0x000500C2, 0x00000017, 0x000024AF, 0x00006113,\n    0x0000028D, 0x000500C7, 0x00000017, 0x00004A61, 0x000024AF, 0x0000064B,\n    0x00040070, 0x0000001D, 0x0000431C, 0x00004A61, 0x0005008E, 0x0000001D,\n    0x00003094, 0x0000431C, 0x0000017A, 0x000200F9, 0x00003F62, 0x000200F8,\n    0x00004BFD, 0x00050051, 0x0000000B, 0x00003090, 0x00002AC1, 0x00000000,\n    0x0004007C, 0x0000000D, 0x00004FF0, 0x00003090, 0x00050050, 0x00000013,\n    0x0000433C, 0x00004FF0, 0x00000A0C, 0x0009004F, 0x0000001D, 0x00002D96,\n    0x0000433C, 0x0000433C, 0x00000000, 0x00000001, 0x00000001, 0x00000001,\n    0x00050051, 0x0000000B, 0x000056B7, 0x00002AC1, 0x00000001, 0x0004007C,\n    0x0000000D, 0x00003F6E, 0x000056B7, 0x00050050, 0x00000013, 0x0000433D,\n    0x00003F6E, 0x00000A0C, 0x0009004F, 0x0000001D, 0x00002D97, 0x0000433D,\n    0x0000433D, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00050051,\n    0x0000000B, 0x000056B8, 0x00002AC1, 0x00000002, 0x0004007C, 0x0000000D,\n    0x00003F6F, 0x000056B8, 0x00050050, 0x00000013, 0x0000433E, 0x00003F6F,\n    0x00000A0C, 0x0009004F, 0x0000001D, 0x00002D98, 0x0000433E, 0x0000433E,\n    0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00050051, 0x0000000B,\n    0x000056B9, 0x00002AC1, 0x00000003, 0x0004007C, 0x0000000D, 0x00003F70,\n    0x000056B9, 0x00050050, 0x00000013, 0x00004FB0, 0x00003F70, 0x00000A0C,\n    0x0009004F, 0x0000001D, 0x00005A3C, 0x00004FB0, 0x00004FB0, 0x00000000,\n    0x00000001, 0x00000001, 0x00000001, 0x000200F9, 0x00003F62, 0x000200F8,\n    0x00003F62, 0x000F00F5, 0x0000001D, 0x00002BAD, 0x00005A3C, 0x00004BFD,\n    0x00003094, 0x000038FB, 0x000026A1, 0x00001CBF, 0x00002355, 0x00001CBE,\n    0x00002354, 0x00002000, 0x00002353, 0x00002037, 0x000F00F5, 0x0000001D,\n    0x0000380E, 0x00002D98, 0x00004BFD, 0x00004B2B, 0x000038FB, 0x00004138,\n    0x00001CBF, 0x00003DE2, 0x00001CBE, 0x00004126, 0x00002000, 0x0000391A,\n    0x00002037, 0x000F00F5, 0x0000001D, 0x00003B81, 0x00002D97, 0x00004BFD,\n    0x00004B2A, 0x000038FB, 0x00004137, 0x00001CBF, 0x00003DE1, 0x00001CBE,\n    0x00004125, 0x00002000, 0x00003919, 0x00002037, 0x000F00F5, 0x0000001D,\n    0x000038BA, 0x00002D96, 0x00004BFD, 0x00004B29, 0x000038FB, 0x00004136,\n    0x00001CBF, 0x00003DE0, 0x00001CBE, 0x00004124, 0x00002000, 0x00003918,\n    0x00002037, 0x000200F9, 0x00005311, 0x000200F8, 0x00003B67, 0x000500AA,\n    0x00000009, 0x00005452, 0x0000199B, 0x00000A22, 0x000300F7, 0x00004F27,\n    0x00000002, 0x000400FA, 0x00005452, 0x000019C4, 0x00002304, 0x000200F8,\n    0x00002304, 0x000500C2, 0x0000000B, 0x00005635, 0x000051FC, 0x00000A11,\n    0x00060041, 0x00000289, 0x00003443, 0x00000CC7, 0x00000A0B, 0x00005635,\n    0x0004003D, 0x0000000B, 0x00003150, 0x00003443, 0x00050080, 0x0000000B,\n    0x00002DC4, 0x00005635, 0x00000A0D, 0x00060041, 0x00000289, 0x0000190F,\n    0x00000CC7, 0x00000A0B, 0x00002DC4, 0x0004003D, 0x0000000B, 0x00001B78,\n    0x0000190F, 0x00050080, 0x0000000B, 0x0000214A, 0x000051FC, 0x0000199B,\n    0x000500C2, 0x0000000B, 0x000054AB, 0x0000214A, 0x00000A11, 0x00060041,\n    0x00000289, 0x00004C99, 0x00000CC7, 0x00000A0B, 0x000054AB, 0x0004003D,\n    0x0000000B, 0x00003151, 0x00004C99, 0x00050080, 0x0000000B, 0x00002DC5,\n    0x000054AB, 0x00000A0D, 0x00060041, 0x00000289, 0x00006005, 0x00000CC7,\n    0x00000A0B, 0x00002DC5, 0x0004003D, 0x0000000B, 0x0000374E, 0x00006005,\n    0x00070050, 0x00000017, 0x00004CD9, 0x00003150, 0x00001B78, 0x00003151,\n    0x0000374E, 0x00050084, 0x0000000B, 0x00004C2D, 0x00000A10, 0x0000199B,\n    0x00050080, 0x0000000B, 0x00002A47, 0x000051FC, 0x00004C2D, 0x000500C2,\n    0x0000000B, 0x000045EC, 0x00002A47, 0x00000A11, 0x00060041, 0x00000289,\n    0x00004C9A, 0x00000CC7, 0x00000A0B, 0x000045EC, 0x0004003D, 0x0000000B,\n    0x00003152, 0x00004C9A, 0x00050080, 0x0000000B, 0x00002DC6, 0x000045EC,\n    0x00000A0D, 0x00060041, 0x00000289, 0x0000194D, 0x00000CC7, 0x00000A0B,\n    0x00002DC6, 0x0004003D, 0x0000000B, 0x00005E5D, 0x0000194D, 0x00050084,\n    0x0000000B, 0x000021F5, 0x00000A13, 0x0000199B, 0x00050080, 0x0000000B,\n    0x00005EC6, 0x000051FC, 0x000021F5, 0x000500C2, 0x0000000B, 0x000045ED,\n    0x00005EC6, 0x00000A11, 0x00060041, 0x00000289, 0x00004C9B, 0x00000CC7,\n    0x00000A0B, 0x000045ED, 0x0004003D, 0x0000000B, 0x00003153, 0x00004C9B,\n    0x00050080, 0x0000000B, 0x00002DC7, 0x000045ED, 0x00000A0D, 0x00060041,\n    0x00000289, 0x00006006, 0x00000CC7, 0x00000A0B, 0x00002DC7, 0x0004003D,\n    0x0000000B, 0x00004002, 0x00006006, 0x00070050, 0x00000017, 0x00005136,\n    0x00003152, 0x00005E5D, 0x00003153, 0x00004002, 0x000200F9, 0x00004F27,\n    0x000200F8, 0x000019C4, 0x000500C2, 0x0000000B, 0x00005FAB, 0x000051FC,\n    0x00000A11, 0x00060041, 0x00000289, 0x00003444, 0x00000CC7, 0x00000A0B,\n    0x00005FAB, 0x0004003D, 0x0000000B, 0x00003154, 0x00003444, 0x00050080,\n    0x0000000B, 0x00002DC8, 0x00005FAB, 0x00000A0D, 0x00060041, 0x00000289,\n    0x00001910, 0x00000CC7, 0x00000A0B, 0x00002DC8, 0x0004003D, 0x0000000B,\n    0x00005C70, 0x00001910, 0x00050080, 0x0000000B, 0x00002DC9, 0x00005FAB,\n    0x00000A10, 0x00060041, 0x00000289, 0x00001911, 0x00000CC7, 0x00000A0B,\n    0x00002DC9, 0x0004003D, 0x0000000B, 0x00005C71, 0x00001911, 0x00050080,\n    0x0000000B, 0x00002DCA, 0x00005FAB, 0x00000A13, 0x00060041, 0x00000289,\n    0x00006007, 0x00000CC7, 0x00000A0B, 0x00002DCA, 0x0004003D, 0x0000000B,\n    0x00003702, 0x00006007, 0x00070050, 0x00000017, 0x00005472, 0x00003154,\n    0x00005C70, 0x00005C71, 0x00003702, 0x00050080, 0x0000000B, 0x00004B85,\n    0x000051FC, 0x00000A3A, 0x000500C2, 0x0000000B, 0x0000202F, 0x00004B85,\n    0x00000A11, 0x00060041, 0x00000289, 0x00004C9C, 0x00000CC7, 0x00000A0B,\n    0x0000202F, 0x0004003D, 0x0000000B, 0x00003155, 0x00004C9C, 0x00050080,\n    0x0000000B, 0x00002DCB, 0x0000202F, 0x00000A0D, 0x00060041, 0x00000289,\n    0x00001912, 0x00000CC7, 0x00000A0B, 0x00002DCB, 0x0004003D, 0x0000000B,\n    0x00005C72, 0x00001912, 0x00050080, 0x0000000B, 0x00002DCC, 0x0000202F,\n    0x00000A10, 0x00060041, 0x00000289, 0x00001913, 0x00000CC7, 0x00000A0B,\n    0x00002DCC, 0x0004003D, 0x0000000B, 0x00005C73, 0x00001913, 0x00050080,\n    0x0000000B, 0x00002DCD, 0x0000202F, 0x00000A13, 0x00060041, 0x00000289,\n    0x00006008, 0x00000CC7, 0x00000A0B, 0x00002DCD, 0x0004003D, 0x0000000B,\n    0x00004003, 0x00006008, 0x00070050, 0x00000017, 0x00005137, 0x00003155,\n    0x00005C72, 0x00005C73, 0x00004003, 0x000200F9, 0x00004F27, 0x000200F8,\n    0x00004F27, 0x000700F5, 0x00000017, 0x00002BCF, 0x00005137, 0x000019C4,\n    0x00005136, 0x00002304, 0x000700F5, 0x00000017, 0x00003722, 0x00005472,\n    0x000019C4, 0x00004CD9, 0x00002304, 0x000300F7, 0x00004F28, 0x00000000,\n    0x000700FB, 0x00002180, 0x00004F58, 0x00000005, 0x0000215A, 0x00000007,\n    0x00002038, 0x000200F8, 0x00002038, 0x00050051, 0x0000000B, 0x00005F5E,\n    0x00003722, 0x00000000, 0x0006000C, 0x00000013, 0x0000606C, 0x00000001,\n    0x0000003E, 0x00005F5E, 0x00050051, 0x0000000D, 0x0000277E, 0x0000606C,\n    0x00000000, 0x00050051, 0x0000000D, 0x00003EC0, 0x0000606C, 0x00000001,\n    0x00050051, 0x0000000B, 0x00004289, 0x00003722, 0x00000001, 0x0006000C,\n    0x00000013, 0x00003CFD, 0x00000001, 0x0000003E, 0x00004289, 0x00050051,\n    0x0000000D, 0x0000277F, 0x00003CFD, 0x00000000, 0x00050051, 0x0000000D,\n    0x00004455, 0x00003CFD, 0x00000001, 0x00070050, 0x0000001D, 0x0000391B,\n    0x0000277E, 0x00003EC0, 0x0000277F, 0x00004455, 0x00050051, 0x0000000B,\n    0x00004389, 0x00003722, 0x00000002, 0x0006000C, 0x00000013, 0x0000467A,\n    0x00000001, 0x0000003E, 0x00004389, 0x00050051, 0x0000000D, 0x00002780,\n    0x0000467A, 0x00000000, 0x00050051, 0x0000000D, 0x00003EC1, 0x0000467A,\n    0x00000001, 0x00050051, 0x0000000B, 0x0000428A, 0x00003722, 0x00000003,\n    0x0006000C, 0x00000013, 0x00003CFE, 0x00000001, 0x0000003E, 0x0000428A,\n    0x00050051, 0x0000000D, 0x00002781, 0x00003CFE, 0x00000000, 0x00050051,\n    0x0000000D, 0x00004456, 0x00003CFE, 0x00000001, 0x00070050, 0x0000001D,\n    0x0000391C, 0x00002780, 0x00003EC1, 0x00002781, 0x00004456, 0x00050051,\n    0x0000000B, 0x0000438A, 0x00002BCF, 0x00000000, 0x0006000C, 0x00000013,\n    0x0000467B, 0x00000001, 0x0000003E, 0x0000438A, 0x00050051, 0x0000000D,\n    0x00002782, 0x0000467B, 0x00000000, 0x00050051, 0x0000000D, 0x00003EC2,\n    0x0000467B, 0x00000001, 0x00050051, 0x0000000B, 0x0000428B, 0x00002BCF,\n    0x00000001, 0x0006000C, 0x00000013, 0x00003CFF, 0x00000001, 0x0000003E,\n    0x0000428B, 0x00050051, 0x0000000D, 0x00002783, 0x00003CFF, 0x00000000,\n    0x00050051, 0x0000000D, 0x00004457, 0x00003CFF, 0x00000001, 0x00070050,\n    0x0000001D, 0x0000391D, 0x00002782, 0x00003EC2, 0x00002783, 0x00004457,\n    0x00050051, 0x0000000B, 0x0000438B, 0x00002BCF, 0x00000002, 0x0006000C,\n    0x00000013, 0x0000467C, 0x00000001, 0x0000003E, 0x0000438B, 0x00050051,\n    0x0000000D, 0x00002784, 0x0000467C, 0x00000000, 0x00050051, 0x0000000D,\n    0x00003EC3, 0x0000467C, 0x00000001, 0x00050051, 0x0000000B, 0x0000428C,\n    0x00002BCF, 0x00000003, 0x0006000C, 0x00000013, 0x00003D00, 0x00000001,\n    0x0000003E, 0x0000428C, 0x00050051, 0x0000000D, 0x00002785, 0x00003D00,\n    0x00000000, 0x00050051, 0x0000000D, 0x000050C3, 0x00003D00, 0x00000001,\n    0x00070050, 0x0000001D, 0x00002356, 0x00002784, 0x00003EC3, 0x00002785,\n    0x000050C3, 0x000200F9, 0x00004F28, 0x000200F8, 0x0000215A, 0x0007004F,\n    0x00000011, 0x000025FD, 0x00003722, 0x00003722, 0x00000000, 0x00000001,\n    0x0004007C, 0x00000012, 0x00005B3E, 0x000025FD, 0x0009004F, 0x0000001A,\n    0x000060D6, 0x00005B3E, 0x00005B3E, 0x00000000, 0x00000000, 0x00000001,\n    0x00000001, 0x000500C4, 0x0000001A, 0x000048B0, 0x000060D6, 0x00000122,\n    0x000500C3, 0x0000001A, 0x00003D95, 0x000048B0, 0x00000302, 0x0004006F,\n    0x0000001D, 0x00002AB7, 0x00003D95, 0x0005008E, 0x0000001D, 0x0000472C,\n    0x00002AB7, 0x000007FE, 0x0007000C, 0x0000001D, 0x00006297, 0x00000001,\n    0x00000028, 0x00000504, 0x0000472C, 0x0007004F, 0x00000011, 0x00003771,\n    0x00003722, 0x00003722, 0x00000002, 0x00000003, 0x0004007C, 0x00000012,\n    0x000024C5, 0x00003771, 0x0009004F, 0x0000001A, 0x000060D7, 0x000024C5,\n    0x000024C5, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x000500C4,\n    0x0000001A, 0x000048B1, 0x000060D7, 0x00000122, 0x000500C3, 0x0000001A,\n    0x00003D96, 0x000048B1, 0x00000302, 0x0004006F, 0x0000001D, 0x00002AB8,\n    0x00003D96, 0x0005008E, 0x0000001D, 0x0000472D, 0x00002AB8, 0x000007FE,\n    0x0007000C, 0x0000001D, 0x00006298, 0x00000001, 0x00000028, 0x00000504,\n    0x0000472D, 0x0007004F, 0x00000011, 0x00003772, 0x00002BCF, 0x00002BCF,\n    0x00000000, 0x00000001, 0x0004007C, 0x00000012, 0x000024C6, 0x00003772,\n    0x0009004F, 0x0000001A, 0x000060D8, 0x000024C6, 0x000024C6, 0x00000000,\n    0x00000000, 0x00000001, 0x00000001, 0x000500C4, 0x0000001A, 0x000048B2,\n    0x000060D8, 0x00000122, 0x000500C3, 0x0000001A, 0x00003D97, 0x000048B2,\n    0x00000302, 0x0004006F, 0x0000001D, 0x00002AB9, 0x00003D97, 0x0005008E,\n    0x0000001D, 0x0000472E, 0x00002AB9, 0x000007FE, 0x0007000C, 0x0000001D,\n    0x00006299, 0x00000001, 0x00000028, 0x00000504, 0x0000472E, 0x0007004F,\n    0x00000011, 0x00003773, 0x00002BCF, 0x00002BCF, 0x00000002, 0x00000003,\n    0x0004007C, 0x00000012, 0x000024C7, 0x00003773, 0x0009004F, 0x0000001A,\n    0x000060D9, 0x000024C7, 0x000024C7, 0x00000000, 0x00000000, 0x00000001,\n    0x00000001, 0x000500C4, 0x0000001A, 0x000048B3, 0x000060D9, 0x00000122,\n    0x000500C3, 0x0000001A, 0x00003D98, 0x000048B3, 0x00000302, 0x0004006F,\n    0x0000001D, 0x00002ABA, 0x00003D98, 0x0005008E, 0x0000001D, 0x000053C1,\n    0x00002ABA, 0x000007FE, 0x0007000C, 0x0000001D, 0x00004364, 0x00000001,\n    0x00000028, 0x00000504, 0x000053C1, 0x000200F9, 0x00004F28, 0x000200F8,\n    0x00004F58, 0x0007004F, 0x00000011, 0x00002623, 0x00003722, 0x00003722,\n    0x00000000, 0x00000001, 0x0004007C, 0x00000013, 0x0000515B, 0x00002623,\n    0x00050051, 0x0000000D, 0x00001B83, 0x0000515B, 0x00000000, 0x00050051,\n    0x0000000D, 0x00003470, 0x0000515B, 0x00000001, 0x00070050, 0x0000001D,\n    0x0000427E, 0x00001B83, 0x00003470, 0x00000A0C, 0x00000A0C, 0x0007004F,\n    0x00000011, 0x000041DE, 0x00003722, 0x00003722, 0x00000002, 0x00000003,\n    0x0004007C, 0x00000013, 0x00003763, 0x000041DE, 0x00050051, 0x0000000D,\n    0x00001B84, 0x00003763, 0x00000000, 0x00050051, 0x0000000D, 0x00003471,\n    0x00003763, 0x00000001, 0x00070050, 0x0000001D, 0x0000427F, 0x00001B84,\n    0x00003471, 0x00000A0C, 0x00000A0C, 0x0007004F, 0x00000011, 0x000041DF,\n    0x00002BCF, 0x00002BCF, 0x00000000, 0x00000001, 0x0004007C, 0x00000013,\n    0x00003764, 0x000041DF, 0x00050051, 0x0000000D, 0x00001B85, 0x00003764,\n    0x00000000, 0x00050051, 0x0000000D, 0x00003472, 0x00003764, 0x00000001,\n    0x00070050, 0x0000001D, 0x00004280, 0x00001B85, 0x00003472, 0x00000A0C,\n    0x00000A0C, 0x0007004F, 0x00000011, 0x000041E0, 0x00002BCF, 0x00002BCF,\n    0x00000002, 0x00000003, 0x0004007C, 0x00000013, 0x00003765, 0x000041E0,\n    0x00050051, 0x0000000D, 0x00001B86, 0x00003765, 0x00000000, 0x00050051,\n    0x0000000D, 0x0000410A, 0x00003765, 0x00000001, 0x00070050, 0x0000001D,\n    0x00002357, 0x00001B86, 0x0000410A, 0x00000A0C, 0x00000A0C, 0x000200F9,\n    0x00004F28, 0x000200F8, 0x00004F28, 0x000900F5, 0x0000001D, 0x00002BAE,\n    0x00002357, 0x00004F58, 0x00004364, 0x0000215A, 0x00002356, 0x00002038,\n    0x000900F5, 0x0000001D, 0x0000380F, 0x00004280, 0x00004F58, 0x00006299,\n    0x0000215A, 0x0000391D, 0x00002038, 0x000900F5, 0x0000001D, 0x00003B82,\n    0x0000427F, 0x00004F58, 0x00006298, 0x0000215A, 0x0000391C, 0x00002038,\n    0x000900F5, 0x0000001D, 0x000038BB, 0x0000427E, 0x00004F58, 0x00006297,\n    0x0000215A, 0x0000391B, 0x00002038, 0x000200F9, 0x00005311, 0x000200F8,\n    0x00005311, 0x000700F5, 0x0000001D, 0x00002BAF, 0x00002BAE, 0x00004F28,\n    0x00002BAD, 0x00003F62, 0x000700F5, 0x0000001D, 0x00003810, 0x0000380F,\n    0x00004F28, 0x0000380E, 0x00003F62, 0x000700F5, 0x0000001D, 0x00003296,\n    0x00003B82, 0x00004F28, 0x00003B81, 0x00003F62, 0x000700F5, 0x0000001D,\n    0x0000367B, 0x000038BB, 0x00004F28, 0x000038BA, 0x00003F62, 0x00050081,\n    0x0000001D, 0x0000435A, 0x00004359, 0x0000367B, 0x00050081, 0x0000001D,\n    0x00005B02, 0x00005B01, 0x00003296, 0x00050081, 0x0000001D, 0x00001C28,\n    0x00001F92, 0x00003810, 0x00050081, 0x0000001D, 0x000025AA, 0x00005113,\n    0x00002BAF, 0x00050080, 0x0000000B, 0x00003FF8, 0x00005E78, 0x000037B2,\n    0x000300F7, 0x00005312, 0x00000002, 0x000400FA, 0x00005AEF, 0x00003B68,\n    0x000040BC, 0x000200F8, 0x000040BC, 0x000500AA, 0x00000009, 0x00004ADE,\n    0x0000199B, 0x00000A16, 0x000300F7, 0x00004F4C, 0x00000002, 0x000400FA,\n    0x00004ADE, 0x000019C5, 0x00002305, 0x000200F8, 0x00002305, 0x000500C2,\n    0x0000000B, 0x00005636, 0x00003FF8, 0x00000A11, 0x00060041, 0x00000289,\n    0x00003445, 0x00000CC7, 0x00000A0B, 0x00005636, 0x0004003D, 0x0000000B,\n    0x00003AD7, 0x00003445, 0x00050080, 0x0000000B, 0x0000214B, 0x00003FF8,\n    0x0000199B, 0x000500C2, 0x0000000B, 0x000054AC, 0x0000214B, 0x00000A11,\n    0x00060041, 0x00000289, 0x00004CE3, 0x00000CC7, 0x00000A0B, 0x000054AC,\n    0x0004003D, 0x0000000B, 0x00003340, 0x00004CE3, 0x00050084, 0x0000000B,\n    0x000021F6, 0x00000A10, 0x0000199B, 0x00050080, 0x0000000B, 0x00005EC8,\n    0x00003FF8, 0x000021F6, 0x000500C2, 0x0000000B, 0x000045EE, 0x00005EC8,\n    0x00000A11, 0x00060041, 0x00000289, 0x00004CE4, 0x00000CC7, 0x00000A0B,\n    0x000045EE, 0x0004003D, 0x0000000B, 0x00003341, 0x00004CE4, 0x00050084,\n    0x0000000B, 0x000021F7, 0x00000A13, 0x0000199B, 0x00050080, 0x0000000B,\n    0x00005EC9, 0x00003FF8, 0x000021F7, 0x000500C2, 0x0000000B, 0x000045EF,\n    0x00005EC9, 0x00000A11, 0x00060041, 0x00000289, 0x00004904, 0x00000CC7,\n    0x00000A0B, 0x000045EF, 0x0004003D, 0x0000000B, 0x00005F5F, 0x00004904,\n    0x00070050, 0x00000017, 0x00005138, 0x00003AD7, 0x00003340, 0x00003341,\n    0x00005F5F, 0x000200F9, 0x00004F4C, 0x000200F8, 0x000019C5, 0x000500C2,\n    0x0000000B, 0x00005FAC, 0x00003FF8, 0x00000A11, 0x00060041, 0x00000289,\n    0x00003446, 0x00000CC7, 0x00000A0B, 0x00005FAC, 0x0004003D, 0x0000000B,\n    0x00003156, 0x00003446, 0x00050080, 0x0000000B, 0x00002DCE, 0x00005FAC,\n    0x00000A0D, 0x00060041, 0x00000289, 0x00001914, 0x00000CC7, 0x00000A0B,\n    0x00002DCE, 0x0004003D, 0x0000000B, 0x00005C74, 0x00001914, 0x00050080,\n    0x0000000B, 0x00002DCF, 0x00005FAC, 0x00000A10, 0x00060041, 0x00000289,\n    0x00001915, 0x00000CC7, 0x00000A0B, 0x00002DCF, 0x0004003D, 0x0000000B,\n    0x00005C75, 0x00001915, 0x00050080, 0x0000000B, 0x00002DD0, 0x00005FAC,\n    0x00000A13, 0x00060041, 0x00000289, 0x00006009, 0x00000CC7, 0x00000A0B,\n    0x00002DD0, 0x0004003D, 0x0000000B, 0x00004004, 0x00006009, 0x00070050,\n    0x00000017, 0x00005139, 0x00003156, 0x00005C74, 0x00005C75, 0x00004004,\n    0x000200F9, 0x00004F4C, 0x000200F8, 0x00004F4C, 0x000700F5, 0x00000017,\n    0x00002AC2, 0x00005139, 0x000019C5, 0x00005138, 0x00002305, 0x000300F7,\n    0x00003F63, 0x00000000, 0x001300FB, 0x00002180, 0x00004BFE, 0x00000000,\n    0x000038FC, 0x00000001, 0x000038FC, 0x00000002, 0x00001CC1, 0x0000000A,\n    0x00001CC1, 0x00000003, 0x00001CC0, 0x0000000C, 0x00001CC0, 0x00000004,\n    0x00002001, 0x00000006, 0x00002039, 0x000200F8, 0x00002039, 0x00050051,\n    0x0000000B, 0x00005F60, 0x00002AC2, 0x00000000, 0x0006000C, 0x00000013,\n    0x0000606D, 0x00000001, 0x0000003E, 0x00005F60, 0x00050051, 0x0000000D,\n    0x00002786, 0x0000606D, 0x00000000, 0x00050051, 0x0000000D, 0x00004458,\n    0x0000606D, 0x00000001, 0x00070050, 0x0000001D, 0x0000391E, 0x00002786,\n    0x00004458, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x0000438C,\n    0x00002AC2, 0x00000001, 0x0006000C, 0x00000013, 0x0000467D, 0x00000001,\n    0x0000003E, 0x0000438C, 0x00050051, 0x0000000D, 0x00002787, 0x0000467D,\n    0x00000000, 0x00050051, 0x0000000D, 0x00004459, 0x0000467D, 0x00000001,\n    0x00070050, 0x0000001D, 0x0000391F, 0x00002787, 0x00004459, 0x00000A0C,\n    0x00000A0C, 0x00050051, 0x0000000B, 0x0000438D, 0x00002AC2, 0x00000002,\n    0x0006000C, 0x00000013, 0x0000467E, 0x00000001, 0x0000003E, 0x0000438D,\n    0x00050051, 0x0000000D, 0x00002788, 0x0000467E, 0x00000000, 0x00050051,\n    0x0000000D, 0x0000445A, 0x0000467E, 0x00000001, 0x00070050, 0x0000001D,\n    0x00003920, 0x00002788, 0x0000445A, 0x00000A0C, 0x00000A0C, 0x00050051,\n    0x0000000B, 0x0000438E, 0x00002AC2, 0x00000003, 0x0006000C, 0x00000013,\n    0x0000467F, 0x00000001, 0x0000003E, 0x0000438E, 0x00050051, 0x0000000D,\n    0x00002789, 0x0000467F, 0x00000000, 0x00050051, 0x0000000D, 0x000050C4,\n    0x0000467F, 0x00000001, 0x00070050, 0x0000001D, 0x00002358, 0x00002789,\n    0x000050C4, 0x00000A0C, 0x00000A0C, 0x000200F9, 0x00003F63, 0x000200F8,\n    0x00002001, 0x00050051, 0x0000000B, 0x00003091, 0x00002AC2, 0x00000000,\n    0x0004007C, 0x0000000C, 0x000058A0, 0x00003091, 0x00050050, 0x00000012,\n    0x0000472F, 0x000058A0, 0x000058A0, 0x000500C4, 0x00000012, 0x000047B9,\n    0x0000472F, 0x000007A7, 0x000500C3, 0x00000012, 0x00003423, 0x000047B9,\n    0x00000867, 0x0004006F, 0x00000013, 0x00002ABB, 0x00003423, 0x0005008E,\n    0x00000013, 0x00004753, 0x00002ABB, 0x000007FE, 0x0007000C, 0x00000013,\n    0x00005E12, 0x00000001, 0x00000028, 0x00000049, 0x00004753, 0x00050051,\n    0x0000000D, 0x00005F16, 0x00005E12, 0x00000000, 0x00050051, 0x0000000D,\n    0x00003CDD, 0x00005E12, 0x00000001, 0x00070050, 0x0000001D, 0x00004127,\n    0x00005F16, 0x00003CDD, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B,\n    0x00004C4B, 0x00002AC2, 0x00000001, 0x0004007C, 0x0000000C, 0x00003EAA,\n    0x00004C4B, 0x00050050, 0x00000012, 0x00004730, 0x00003EAA, 0x00003EAA,\n    0x000500C4, 0x00000012, 0x000047BA, 0x00004730, 0x000007A7, 0x000500C3,\n    0x00000012, 0x00003424, 0x000047BA, 0x00000867, 0x0004006F, 0x00000013,\n    0x00002ABC, 0x00003424, 0x0005008E, 0x00000013, 0x00004754, 0x00002ABC,\n    0x000007FE, 0x0007000C, 0x00000013, 0x00005E13, 0x00000001, 0x00000028,\n    0x00000049, 0x00004754, 0x00050051, 0x0000000D, 0x00005F17, 0x00005E13,\n    0x00000000, 0x00050051, 0x0000000D, 0x00003CDE, 0x00005E13, 0x00000001,\n    0x00070050, 0x0000001D, 0x00004128, 0x00005F17, 0x00003CDE, 0x00000A0C,\n    0x00000A0C, 0x00050051, 0x0000000B, 0x00004C4C, 0x00002AC2, 0x00000002,\n    0x0004007C, 0x0000000C, 0x00003EAB, 0x00004C4C, 0x00050050, 0x00000012,\n    0x00004731, 0x00003EAB, 0x00003EAB, 0x000500C4, 0x00000012, 0x000047BB,\n    0x00004731, 0x000007A7, 0x000500C3, 0x00000012, 0x00003425, 0x000047BB,\n    0x00000867, 0x0004006F, 0x00000013, 0x00002ABD, 0x00003425, 0x0005008E,\n    0x00000013, 0x00004755, 0x00002ABD, 0x000007FE, 0x0007000C, 0x00000013,\n    0x00005E14, 0x00000001, 0x00000028, 0x00000049, 0x00004755, 0x00050051,\n    0x0000000D, 0x00005F18, 0x00005E14, 0x00000000, 0x00050051, 0x0000000D,\n    0x00003CDF, 0x00005E14, 0x00000001, 0x00070050, 0x0000001D, 0x00004129,\n    0x00005F18, 0x00003CDF, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B,\n    0x00004C4D, 0x00002AC2, 0x00000003, 0x0004007C, 0x0000000C, 0x00003EAC,\n    0x00004C4D, 0x00050050, 0x00000012, 0x00004732, 0x00003EAC, 0x00003EAC,\n    0x000500C4, 0x00000012, 0x000047BC, 0x00004732, 0x000007A7, 0x000500C3,\n    0x00000012, 0x00003426, 0x000047BC, 0x00000867, 0x0004006F, 0x00000013,\n    0x00002ABE, 0x00003426, 0x0005008E, 0x00000013, 0x00004756, 0x00002ABE,\n    0x000007FE, 0x0007000C, 0x00000013, 0x00005E15, 0x00000001, 0x00000028,\n    0x00000049, 0x00004756, 0x00050051, 0x0000000D, 0x00005F19, 0x00005E15,\n    0x00000000, 0x00050051, 0x0000000D, 0x0000494F, 0x00005E15, 0x00000001,\n    0x00070050, 0x0000001D, 0x00002359, 0x00005F19, 0x0000494F, 0x00000A0C,\n    0x00000A0C, 0x000200F9, 0x00003F63, 0x000200F8, 0x00001CC0, 0x00050051,\n    0x0000000B, 0x000056C6, 0x00002AC2, 0x00000000, 0x00060050, 0x00000014,\n    0x00004F13, 0x000056C6, 0x000056C6, 0x000056C6, 0x000500C2, 0x00000014,\n    0x00002B1C, 0x00004F13, 0x00000BB4, 0x000500C7, 0x00000014, 0x00005DF2,\n    0x00002B1C, 0x00000105, 0x000500C7, 0x00000014, 0x000048B4, 0x00002B1C,\n    0x00000466, 0x000500C2, 0x00000014, 0x00005B9C, 0x00005DF2, 0x00000B0C,\n    0x000500AA, 0x00000010, 0x000040D5, 0x00005B9C, 0x00000A12, 0x0006000C,\n    0x00000016, 0x00002C57, 0x00000001, 0x0000004B, 0x000048B4, 0x0004007C,\n    0x00000014, 0x00002A21, 0x00002C57, 0x00050082, 0x00000014, 0x00001886,\n    0x00000B0C, 0x00002A21, 0x00050080, 0x00000014, 0x0000221C, 0x00002A21,\n    0x00000938, 0x000600A9, 0x00000014, 0x0000287B, 0x000040D5, 0x0000221C,\n    0x00005B9C, 0x000500C4, 0x00000014, 0x00005AE0, 0x000048B4, 0x00001886,\n    0x000500C7, 0x00000014, 0x000049A6, 0x00005AE0, 0x00000466, 0x000600A9,\n    0x00000014, 0x00002AC3, 0x000040D5, 0x000049A6, 0x000048B4, 0x00050080,\n    0x00000014, 0x0000600A, 0x0000287B, 0x000003FA, 0x000500C4, 0x00000014,\n    0x00004F8B, 0x0000600A, 0x00000189, 0x000500C4, 0x00000014, 0x00003FB2,\n    0x00002AC3, 0x0000008D, 0x000500C5, 0x00000014, 0x00005788, 0x00004F8B,\n    0x00003FB2, 0x000500AA, 0x00000010, 0x0000360C, 0x00005DF2, 0x00000A12,\n    0x000600A9, 0x00000014, 0x0000424E, 0x0000360C, 0x00000A12, 0x00005788,\n    0x0004007C, 0x00000018, 0x000029DB, 0x0000424E, 0x000500C2, 0x0000000B,\n    0x00004BB0, 0x000056C6, 0x00000A64, 0x00040070, 0x0000000D, 0x0000481A,\n    0x00004BB0, 0x00050085, 0x0000000D, 0x00003E2B, 0x0000481A, 0x00000149,\n    0x00050051, 0x0000000D, 0x000053CE, 0x000029DB, 0x00000000, 0x00050051,\n    0x0000000D, 0x00002A61, 0x000029DB, 0x00000001, 0x00050051, 0x0000000D,\n    0x00001EA2, 0x000029DB, 0x00000002, 0x00070050, 0x0000001D, 0x00003DE3,\n    0x000053CE, 0x00002A61, 0x00001EA2, 0x00003E2B, 0x00050051, 0x0000000B,\n    0x000027FE, 0x00002AC2, 0x00000001, 0x00060050, 0x00000014, 0x00003517,\n    0x000027FE, 0x000027FE, 0x000027FE, 0x000500C2, 0x00000014, 0x00002B1D,\n    0x00003517, 0x00000BB4, 0x000500C7, 0x00000014, 0x00005DF3, 0x00002B1D,\n    0x00000105, 0x000500C7, 0x00000014, 0x000048B5, 0x00002B1D, 0x00000466,\n    0x000500C2, 0x00000014, 0x00005B9D, 0x00005DF3, 0x00000B0C, 0x000500AA,\n    0x00000010, 0x000040D6, 0x00005B9D, 0x00000A12, 0x0006000C, 0x00000016,\n    0x00002C58, 0x00000001, 0x0000004B, 0x000048B5, 0x0004007C, 0x00000014,\n    0x00002A22, 0x00002C58, 0x00050082, 0x00000014, 0x00001887, 0x00000B0C,\n    0x00002A22, 0x00050080, 0x00000014, 0x0000221D, 0x00002A22, 0x00000938,\n    0x000600A9, 0x00000014, 0x0000287C, 0x000040D6, 0x0000221D, 0x00005B9D,\n    0x000500C4, 0x00000014, 0x00005AE1, 0x000048B5, 0x00001887, 0x000500C7,\n    0x00000014, 0x000049A7, 0x00005AE1, 0x00000466, 0x000600A9, 0x00000014,\n    0x00002AC4, 0x000040D6, 0x000049A7, 0x000048B5, 0x00050080, 0x00000014,\n    0x0000600B, 0x0000287C, 0x000003FA, 0x000500C4, 0x00000014, 0x00004F8C,\n    0x0000600B, 0x00000189, 0x000500C4, 0x00000014, 0x00003FB3, 0x00002AC4,\n    0x0000008D, 0x000500C5, 0x00000014, 0x00005789, 0x00004F8C, 0x00003FB3,\n    0x000500AA, 0x00000010, 0x0000360D, 0x00005DF3, 0x00000A12, 0x000600A9,\n    0x00000014, 0x0000424F, 0x0000360D, 0x00000A12, 0x00005789, 0x0004007C,\n    0x00000018, 0x000029DC, 0x0000424F, 0x000500C2, 0x0000000B, 0x00004BB1,\n    0x000027FE, 0x00000A64, 0x00040070, 0x0000000D, 0x0000481B, 0x00004BB1,\n    0x00050085, 0x0000000D, 0x00003E2C, 0x0000481B, 0x00000149, 0x00050051,\n    0x0000000D, 0x000053CF, 0x000029DC, 0x00000000, 0x00050051, 0x0000000D,\n    0x00002A62, 0x000029DC, 0x00000001, 0x00050051, 0x0000000D, 0x00001EA3,\n    0x000029DC, 0x00000002, 0x00070050, 0x0000001D, 0x00003DE4, 0x000053CF,\n    0x00002A62, 0x00001EA3, 0x00003E2C, 0x00050051, 0x0000000B, 0x000027FF,\n    0x00002AC2, 0x00000002, 0x00060050, 0x00000014, 0x00003518, 0x000027FF,\n    0x000027FF, 0x000027FF, 0x000500C2, 0x00000014, 0x00002B1E, 0x00003518,\n    0x00000BB4, 0x000500C7, 0x00000014, 0x00005DF4, 0x00002B1E, 0x00000105,\n    0x000500C7, 0x00000014, 0x000048B6, 0x00002B1E, 0x00000466, 0x000500C2,\n    0x00000014, 0x00005B9E, 0x00005DF4, 0x00000B0C, 0x000500AA, 0x00000010,\n    0x000040D7, 0x00005B9E, 0x00000A12, 0x0006000C, 0x00000016, 0x00002C59,\n    0x00000001, 0x0000004B, 0x000048B6, 0x0004007C, 0x00000014, 0x00002A23,\n    0x00002C59, 0x00050082, 0x00000014, 0x00001888, 0x00000B0C, 0x00002A23,\n    0x00050080, 0x00000014, 0x0000221E, 0x00002A23, 0x00000938, 0x000600A9,\n    0x00000014, 0x0000287D, 0x000040D7, 0x0000221E, 0x00005B9E, 0x000500C4,\n    0x00000014, 0x00005AE2, 0x000048B6, 0x00001888, 0x000500C7, 0x00000014,\n    0x000049A8, 0x00005AE2, 0x00000466, 0x000600A9, 0x00000014, 0x00002AC5,\n    0x000040D7, 0x000049A8, 0x000048B6, 0x00050080, 0x00000014, 0x0000600C,\n    0x0000287D, 0x000003FA, 0x000500C4, 0x00000014, 0x00004F8D, 0x0000600C,\n    0x00000189, 0x000500C4, 0x00000014, 0x00003FB4, 0x00002AC5, 0x0000008D,\n    0x000500C5, 0x00000014, 0x0000578A, 0x00004F8D, 0x00003FB4, 0x000500AA,\n    0x00000010, 0x0000360E, 0x00005DF4, 0x00000A12, 0x000600A9, 0x00000014,\n    0x00004250, 0x0000360E, 0x00000A12, 0x0000578A, 0x0004007C, 0x00000018,\n    0x000029DD, 0x00004250, 0x000500C2, 0x0000000B, 0x00004BB2, 0x000027FF,\n    0x00000A64, 0x00040070, 0x0000000D, 0x0000481C, 0x00004BB2, 0x00050085,\n    0x0000000D, 0x00003E2D, 0x0000481C, 0x00000149, 0x00050051, 0x0000000D,\n    0x000053D0, 0x000029DD, 0x00000000, 0x00050051, 0x0000000D, 0x00002A63,\n    0x000029DD, 0x00000001, 0x00050051, 0x0000000D, 0x00001EA4, 0x000029DD,\n    0x00000002, 0x00070050, 0x0000001D, 0x00003DE5, 0x000053D0, 0x00002A63,\n    0x00001EA4, 0x00003E2D, 0x00050051, 0x0000000B, 0x00002800, 0x00002AC2,\n    0x00000003, 0x00060050, 0x00000014, 0x00003519, 0x00002800, 0x00002800,\n    0x00002800, 0x000500C2, 0x00000014, 0x00002B1F, 0x00003519, 0x00000BB4,\n    0x000500C7, 0x00000014, 0x00005DF5, 0x00002B1F, 0x00000105, 0x000500C7,\n    0x00000014, 0x000048B7, 0x00002B1F, 0x00000466, 0x000500C2, 0x00000014,\n    0x00005B9F, 0x00005DF5, 0x00000B0C, 0x000500AA, 0x00000010, 0x000040D8,\n    0x00005B9F, 0x00000A12, 0x0006000C, 0x00000016, 0x00002C5A, 0x00000001,\n    0x0000004B, 0x000048B7, 0x0004007C, 0x00000014, 0x00002A24, 0x00002C5A,\n    0x00050082, 0x00000014, 0x00001889, 0x00000B0C, 0x00002A24, 0x00050080,\n    0x00000014, 0x0000221F, 0x00002A24, 0x00000938, 0x000600A9, 0x00000014,\n    0x0000287E, 0x000040D8, 0x0000221F, 0x00005B9F, 0x000500C4, 0x00000014,\n    0x00005AE3, 0x000048B7, 0x00001889, 0x000500C7, 0x00000014, 0x000049A9,\n    0x00005AE3, 0x00000466, 0x000600A9, 0x00000014, 0x00002AC6, 0x000040D8,\n    0x000049A9, 0x000048B7, 0x00050080, 0x00000014, 0x0000600D, 0x0000287E,\n    0x000003FA, 0x000500C4, 0x00000014, 0x00004F8E, 0x0000600D, 0x00000189,\n    0x000500C4, 0x00000014, 0x00003FB5, 0x00002AC6, 0x0000008D, 0x000500C5,\n    0x00000014, 0x0000578B, 0x00004F8E, 0x00003FB5, 0x000500AA, 0x00000010,\n    0x0000360F, 0x00005DF5, 0x00000A12, 0x000600A9, 0x00000014, 0x00004251,\n    0x0000360F, 0x00000A12, 0x0000578B, 0x0004007C, 0x00000018, 0x000029DE,\n    0x00004251, 0x000500C2, 0x0000000B, 0x00004BB3, 0x00002800, 0x00000A64,\n    0x00040070, 0x0000000D, 0x0000481D, 0x00004BB3, 0x00050085, 0x0000000D,\n    0x00003E2E, 0x0000481D, 0x00000149, 0x00050051, 0x0000000D, 0x000053D1,\n    0x000029DE, 0x00000000, 0x00050051, 0x0000000D, 0x00002A64, 0x000029DE,\n    0x00000001, 0x00050051, 0x0000000D, 0x00002B20, 0x000029DE, 0x00000002,\n    0x00070050, 0x0000001D, 0x0000235A, 0x000053D1, 0x00002A64, 0x00002B20,\n    0x00003E2E, 0x000200F9, 0x00003F63, 0x000200F8, 0x00001CC1, 0x00050051,\n    0x0000000B, 0x000056C7, 0x00002AC2, 0x00000000, 0x00070050, 0x00000017,\n    0x00004F14, 0x000056C7, 0x000056C7, 0x000056C7, 0x000056C7, 0x000500C2,\n    0x00000017, 0x000024B0, 0x00004F14, 0x0000034D, 0x000500C7, 0x00000017,\n    0x000049B7, 0x000024B0, 0x0000027B, 0x00040070, 0x0000001D, 0x00003CC0,\n    0x000049B7, 0x00050085, 0x0000001D, 0x00004139, 0x00003CC0, 0x00000AEE,\n    0x00050051, 0x0000000B, 0x00005CDB, 0x00002AC2, 0x00000001, 0x00070050,\n    0x00000017, 0x00005156, 0x00005CDB, 0x00005CDB, 0x00005CDB, 0x00005CDB,\n    0x000500C2, 0x00000017, 0x000024B1, 0x00005156, 0x0000034D, 0x000500C7,\n    0x00000017, 0x000049B8, 0x000024B1, 0x0000027B, 0x00040070, 0x0000001D,\n    0x00003CC1, 0x000049B8, 0x00050085, 0x0000001D, 0x0000413A, 0x00003CC1,\n    0x00000AEE, 0x00050051, 0x0000000B, 0x00005CDC, 0x00002AC2, 0x00000002,\n    0x00070050, 0x00000017, 0x00005157, 0x00005CDC, 0x00005CDC, 0x00005CDC,\n    0x00005CDC, 0x000500C2, 0x00000017, 0x000024B2, 0x00005157, 0x0000034D,\n    0x000500C7, 0x00000017, 0x000049B9, 0x000024B2, 0x0000027B, 0x00040070,\n    0x0000001D, 0x00003CC2, 0x000049B9, 0x00050085, 0x0000001D, 0x0000413B,\n    0x00003CC2, 0x00000AEE, 0x00050051, 0x0000000B, 0x00005CDD, 0x00002AC2,\n    0x00000003, 0x00070050, 0x00000017, 0x0000515C, 0x00005CDD, 0x00005CDD,\n    0x00005CDD, 0x00005CDD, 0x000500C2, 0x00000017, 0x000024B3, 0x0000515C,\n    0x0000034D, 0x000500C7, 0x00000017, 0x000049BA, 0x000024B3, 0x0000027B,\n    0x00040070, 0x0000001D, 0x00004932, 0x000049BA, 0x00050085, 0x0000001D,\n    0x000026A2, 0x00004932, 0x00000AEE, 0x000200F9, 0x00003F63, 0x000200F8,\n    0x000038FC, 0x00050051, 0x0000000B, 0x000056C8, 0x00002AC2, 0x00000000,\n    0x00070050, 0x00000017, 0x00004F15, 0x000056C8, 0x000056C8, 0x000056C8,\n    0x000056C8, 0x000500C2, 0x00000017, 0x000024B4, 0x00004F15, 0x0000028D,\n    0x000500C7, 0x00000017, 0x00004A62, 0x000024B4, 0x0000064B, 0x00040070,\n    0x0000001D, 0x000036AB, 0x00004A62, 0x0005008E, 0x0000001D, 0x00004B2C,\n    0x000036AB, 0x0000017A, 0x00050051, 0x0000000B, 0x000021A8, 0x00002AC2,\n    0x00000001, 0x00070050, 0x00000017, 0x00006114, 0x000021A8, 0x000021A8,\n    0x000021A8, 0x000021A8, 0x000500C2, 0x00000017, 0x000024B5, 0x00006114,\n    0x0000028D, 0x000500C7, 0x00000017, 0x00004A63, 0x000024B5, 0x0000064B,\n    0x00040070, 0x0000001D, 0x000036AC, 0x00004A63, 0x0005008E, 0x0000001D,\n    0x00004B2D, 0x000036AC, 0x0000017A, 0x00050051, 0x0000000B, 0x000021A9,\n    0x00002AC2, 0x00000002, 0x00070050, 0x00000017, 0x00006115, 0x000021A9,\n    0x000021A9, 0x000021A9, 0x000021A9, 0x000500C2, 0x00000017, 0x000024B6,\n    0x00006115, 0x0000028D, 0x000500C7, 0x00000017, 0x00004A64, 0x000024B6,\n    0x0000064B, 0x00040070, 0x0000001D, 0x000036AD, 0x00004A64, 0x0005008E,\n    0x0000001D, 0x00004B2E, 0x000036AD, 0x0000017A, 0x00050051, 0x0000000B,\n    0x000021AA, 0x00002AC2, 0x00000003, 0x00070050, 0x00000017, 0x00006116,\n    0x000021AA, 0x000021AA, 0x000021AA, 0x000021AA, 0x000500C2, 0x00000017,\n    0x000024B7, 0x00006116, 0x0000028D, 0x000500C7, 0x00000017, 0x00004A65,\n    0x000024B7, 0x0000064B, 0x00040070, 0x0000001D, 0x0000431D, 0x00004A65,\n    0x0005008E, 0x0000001D, 0x00003095, 0x0000431D, 0x0000017A, 0x000200F9,\n    0x00003F63, 0x000200F8, 0x00004BFE, 0x00050051, 0x0000000B, 0x00003096,\n    0x00002AC2, 0x00000000, 0x0004007C, 0x0000000D, 0x00004FF1, 0x00003096,\n    0x00050050, 0x00000013, 0x0000433F, 0x00004FF1, 0x00000A0C, 0x0009004F,\n    0x0000001D, 0x00002D99, 0x0000433F, 0x0000433F, 0x00000000, 0x00000001,\n    0x00000001, 0x00000001, 0x00050051, 0x0000000B, 0x000056BA, 0x00002AC2,\n    0x00000001, 0x0004007C, 0x0000000D, 0x00003F71, 0x000056BA, 0x00050050,\n    0x00000013, 0x00004340, 0x00003F71, 0x00000A0C, 0x0009004F, 0x0000001D,\n    0x00002D9A, 0x00004340, 0x00004340, 0x00000000, 0x00000001, 0x00000001,\n    0x00000001, 0x00050051, 0x0000000B, 0x000056BB, 0x00002AC2, 0x00000002,\n    0x0004007C, 0x0000000D, 0x00003F72, 0x000056BB, 0x00050050, 0x00000013,\n    0x00004341, 0x00003F72, 0x00000A0C, 0x0009004F, 0x0000001D, 0x00002D9B,\n    0x00004341, 0x00004341, 0x00000000, 0x00000001, 0x00000001, 0x00000001,\n    0x00050051, 0x0000000B, 0x000056BC, 0x00002AC2, 0x00000003, 0x0004007C,\n    0x0000000D, 0x00003F73, 0x000056BC, 0x00050050, 0x00000013, 0x00004FB1,\n    0x00003F73, 0x00000A0C, 0x0009004F, 0x0000001D, 0x00005A3D, 0x00004FB1,\n    0x00004FB1, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x000200F9,\n    0x00003F63, 0x000200F8, 0x00003F63, 0x000F00F5, 0x0000001D, 0x00002BB0,\n    0x00005A3D, 0x00004BFE, 0x00003095, 0x000038FC, 0x000026A2, 0x00001CC1,\n    0x0000235A, 0x00001CC0, 0x00002359, 0x00002001, 0x00002358, 0x00002039,\n    0x000F00F5, 0x0000001D, 0x00003811, 0x00002D9B, 0x00004BFE, 0x00004B2E,\n    0x000038FC, 0x0000413B, 0x00001CC1, 0x00003DE5, 0x00001CC0, 0x00004129,\n    0x00002001, 0x00003920, 0x00002039, 0x000F00F5, 0x0000001D, 0x00003B83,\n    0x00002D9A, 0x00004BFE, 0x00004B2D, 0x000038FC, 0x0000413A, 0x00001CC1,\n    0x00003DE4, 0x00001CC0, 0x00004128, 0x00002001, 0x0000391F, 0x00002039,\n    0x000F00F5, 0x0000001D, 0x000038BC, 0x00002D99, 0x00004BFE, 0x00004B2C,\n    0x000038FC, 0x00004139, 0x00001CC1, 0x00003DE3, 0x00001CC0, 0x00004127,\n    0x00002001, 0x0000391E, 0x00002039, 0x000200F9, 0x00005312, 0x000200F8,\n    0x00003B68, 0x000500AA, 0x00000009, 0x00005453, 0x0000199B, 0x00000A22,\n    0x000300F7, 0x00004F29, 0x00000002, 0x000400FA, 0x00005453, 0x000019C6,\n    0x00002306, 0x000200F8, 0x00002306, 0x000500C2, 0x0000000B, 0x00005637,\n    0x00003FF8, 0x00000A11, 0x00060041, 0x00000289, 0x00003447, 0x00000CC7,\n    0x00000A0B, 0x00005637, 0x0004003D, 0x0000000B, 0x00003157, 0x00003447,\n    0x00050080, 0x0000000B, 0x00002DD1, 0x00005637, 0x00000A0D, 0x00060041,\n    0x00000289, 0x00001916, 0x00000CC7, 0x00000A0B, 0x00002DD1, 0x0004003D,\n    0x0000000B, 0x00001B79, 0x00001916, 0x00050080, 0x0000000B, 0x0000214C,\n    0x00003FF8, 0x0000199B, 0x000500C2, 0x0000000B, 0x000054AD, 0x0000214C,\n    0x00000A11, 0x00060041, 0x00000289, 0x00004C9D, 0x00000CC7, 0x00000A0B,\n    0x000054AD, 0x0004003D, 0x0000000B, 0x00003158, 0x00004C9D, 0x00050080,\n    0x0000000B, 0x00002DD2, 0x000054AD, 0x00000A0D, 0x00060041, 0x00000289,\n    0x0000600E, 0x00000CC7, 0x00000A0B, 0x00002DD2, 0x0004003D, 0x0000000B,\n    0x00003750, 0x0000600E, 0x00070050, 0x00000017, 0x00004CDA, 0x00003157,\n    0x00001B79, 0x00003158, 0x00003750, 0x00050084, 0x0000000B, 0x00004C2E,\n    0x00000A10, 0x0000199B, 0x00050080, 0x0000000B, 0x00002A48, 0x00003FF8,\n    0x00004C2E, 0x000500C2, 0x0000000B, 0x000045F0, 0x00002A48, 0x00000A11,\n    0x00060041, 0x00000289, 0x00004C9E, 0x00000CC7, 0x00000A0B, 0x000045F0,\n    0x0004003D, 0x0000000B, 0x00003159, 0x00004C9E, 0x00050080, 0x0000000B,\n    0x00002DD3, 0x000045F0, 0x00000A0D, 0x00060041, 0x00000289, 0x0000194E,\n    0x00000CC7, 0x00000A0B, 0x00002DD3, 0x0004003D, 0x0000000B, 0x00005E5E,\n    0x0000194E, 0x00050084, 0x0000000B, 0x000021F8, 0x00000A13, 0x0000199B,\n    0x00050080, 0x0000000B, 0x00005ECA, 0x00003FF8, 0x000021F8, 0x000500C2,\n    0x0000000B, 0x000045F1, 0x00005ECA, 0x00000A11, 0x00060041, 0x00000289,\n    0x00004C9F, 0x00000CC7, 0x00000A0B, 0x000045F1, 0x0004003D, 0x0000000B,\n    0x0000315A, 0x00004C9F, 0x00050080, 0x0000000B, 0x00002DD4, 0x000045F1,\n    0x00000A0D, 0x00060041, 0x00000289, 0x0000600F, 0x00000CC7, 0x00000A0B,\n    0x00002DD4, 0x0004003D, 0x0000000B, 0x00004005, 0x0000600F, 0x00070050,\n    0x00000017, 0x0000513A, 0x00003159, 0x00005E5E, 0x0000315A, 0x00004005,\n    0x000200F9, 0x00004F29, 0x000200F8, 0x000019C6, 0x000500C2, 0x0000000B,\n    0x00005FAD, 0x00003FF8, 0x00000A11, 0x00060041, 0x00000289, 0x00003448,\n    0x00000CC7, 0x00000A0B, 0x00005FAD, 0x0004003D, 0x0000000B, 0x0000315B,\n    0x00003448, 0x00050080, 0x0000000B, 0x00002DD5, 0x00005FAD, 0x00000A0D,\n    0x00060041, 0x00000289, 0x00001917, 0x00000CC7, 0x00000A0B, 0x00002DD5,\n    0x0004003D, 0x0000000B, 0x00005C76, 0x00001917, 0x00050080, 0x0000000B,\n    0x00002DD6, 0x00005FAD, 0x00000A10, 0x00060041, 0x00000289, 0x00001918,\n    0x00000CC7, 0x00000A0B, 0x00002DD6, 0x0004003D, 0x0000000B, 0x00005C77,\n    0x00001918, 0x00050080, 0x0000000B, 0x00002DD7, 0x00005FAD, 0x00000A13,\n    0x00060041, 0x00000289, 0x00006010, 0x00000CC7, 0x00000A0B, 0x00002DD7,\n    0x0004003D, 0x0000000B, 0x00003703, 0x00006010, 0x00070050, 0x00000017,\n    0x00005473, 0x0000315B, 0x00005C76, 0x00005C77, 0x00003703, 0x00050080,\n    0x0000000B, 0x00004B86, 0x00003FF8, 0x00000A3A, 0x000500C2, 0x0000000B,\n    0x00002030, 0x00004B86, 0x00000A11, 0x00060041, 0x00000289, 0x00004CA0,\n    0x00000CC7, 0x00000A0B, 0x00002030, 0x0004003D, 0x0000000B, 0x0000315C,\n    0x00004CA0, 0x00050080, 0x0000000B, 0x00002DD8, 0x00002030, 0x00000A0D,\n    0x00060041, 0x00000289, 0x00001919, 0x00000CC7, 0x00000A0B, 0x00002DD8,\n    0x0004003D, 0x0000000B, 0x00005C78, 0x00001919, 0x00050080, 0x0000000B,\n    0x00002DD9, 0x00002030, 0x00000A10, 0x00060041, 0x00000289, 0x0000191A,\n    0x00000CC7, 0x00000A0B, 0x00002DD9, 0x0004003D, 0x0000000B, 0x00005C79,\n    0x0000191A, 0x00050080, 0x0000000B, 0x00002DDA, 0x00002030, 0x00000A13,\n    0x00060041, 0x00000289, 0x00006011, 0x00000CC7, 0x00000A0B, 0x00002DDA,\n    0x0004003D, 0x0000000B, 0x00004006, 0x00006011, 0x00070050, 0x00000017,\n    0x0000513B, 0x0000315C, 0x00005C78, 0x00005C79, 0x00004006, 0x000200F9,\n    0x00004F29, 0x000200F8, 0x00004F29, 0x000700F5, 0x00000017, 0x00002BD0,\n    0x0000513B, 0x000019C6, 0x0000513A, 0x00002306, 0x000700F5, 0x00000017,\n    0x00003723, 0x00005473, 0x000019C6, 0x00004CDA, 0x00002306, 0x000300F7,\n    0x00004F2A, 0x00000000, 0x000700FB, 0x00002180, 0x00004F59, 0x00000005,\n    0x0000215B, 0x00000007, 0x0000203A, 0x000200F8, 0x0000203A, 0x00050051,\n    0x0000000B, 0x00005F61, 0x00003723, 0x00000000, 0x0006000C, 0x00000013,\n    0x0000606E, 0x00000001, 0x0000003E, 0x00005F61, 0x00050051, 0x0000000D,\n    0x0000278A, 0x0000606E, 0x00000000, 0x00050051, 0x0000000D, 0x00003EC4,\n    0x0000606E, 0x00000001, 0x00050051, 0x0000000B, 0x0000428D, 0x00003723,\n    0x00000001, 0x0006000C, 0x00000013, 0x00003D01, 0x00000001, 0x0000003E,\n    0x0000428D, 0x00050051, 0x0000000D, 0x0000278B, 0x00003D01, 0x00000000,\n    0x00050051, 0x0000000D, 0x0000445B, 0x00003D01, 0x00000001, 0x00070050,\n    0x0000001D, 0x00003921, 0x0000278A, 0x00003EC4, 0x0000278B, 0x0000445B,\n    0x00050051, 0x0000000B, 0x0000438F, 0x00003723, 0x00000002, 0x0006000C,\n    0x00000013, 0x00004680, 0x00000001, 0x0000003E, 0x0000438F, 0x00050051,\n    0x0000000D, 0x0000278C, 0x00004680, 0x00000000, 0x00050051, 0x0000000D,\n    0x00003EC5, 0x00004680, 0x00000001, 0x00050051, 0x0000000B, 0x0000428E,\n    0x00003723, 0x00000003, 0x0006000C, 0x00000013, 0x00003D02, 0x00000001,\n    0x0000003E, 0x0000428E, 0x00050051, 0x0000000D, 0x0000278D, 0x00003D02,\n    0x00000000, 0x00050051, 0x0000000D, 0x0000445C, 0x00003D02, 0x00000001,\n    0x00070050, 0x0000001D, 0x00003922, 0x0000278C, 0x00003EC5, 0x0000278D,\n    0x0000445C, 0x00050051, 0x0000000B, 0x00004390, 0x00002BD0, 0x00000000,\n    0x0006000C, 0x00000013, 0x00004681, 0x00000001, 0x0000003E, 0x00004390,\n    0x00050051, 0x0000000D, 0x0000278E, 0x00004681, 0x00000000, 0x00050051,\n    0x0000000D, 0x00003EC6, 0x00004681, 0x00000001, 0x00050051, 0x0000000B,\n    0x0000428F, 0x00002BD0, 0x00000001, 0x0006000C, 0x00000013, 0x00003D03,\n    0x00000001, 0x0000003E, 0x0000428F, 0x00050051, 0x0000000D, 0x0000278F,\n    0x00003D03, 0x00000000, 0x00050051, 0x0000000D, 0x0000445D, 0x00003D03,\n    0x00000001, 0x00070050, 0x0000001D, 0x00003923, 0x0000278E, 0x00003EC6,\n    0x0000278F, 0x0000445D, 0x00050051, 0x0000000B, 0x00004391, 0x00002BD0,\n    0x00000002, 0x0006000C, 0x00000013, 0x00004682, 0x00000001, 0x0000003E,\n    0x00004391, 0x00050051, 0x0000000D, 0x00002790, 0x00004682, 0x00000000,\n    0x00050051, 0x0000000D, 0x00003EC7, 0x00004682, 0x00000001, 0x00050051,\n    0x0000000B, 0x00004290, 0x00002BD0, 0x00000003, 0x0006000C, 0x00000013,\n    0x00003D04, 0x00000001, 0x0000003E, 0x00004290, 0x00050051, 0x0000000D,\n    0x00002791, 0x00003D04, 0x00000000, 0x00050051, 0x0000000D, 0x000050C5,\n    0x00003D04, 0x00000001, 0x00070050, 0x0000001D, 0x0000235B, 0x00002790,\n    0x00003EC7, 0x00002791, 0x000050C5, 0x000200F9, 0x00004F2A, 0x000200F8,\n    0x0000215B, 0x0007004F, 0x00000011, 0x000025FE, 0x00003723, 0x00003723,\n    0x00000000, 0x00000001, 0x0004007C, 0x00000012, 0x00005B3F, 0x000025FE,\n    0x0009004F, 0x0000001A, 0x000060DA, 0x00005B3F, 0x00005B3F, 0x00000000,\n    0x00000000, 0x00000001, 0x00000001, 0x000500C4, 0x0000001A, 0x000048B8,\n    0x000060DA, 0x00000122, 0x000500C3, 0x0000001A, 0x00003D99, 0x000048B8,\n    0x00000302, 0x0004006F, 0x0000001D, 0x00002AC7, 0x00003D99, 0x0005008E,\n    0x0000001D, 0x00004733, 0x00002AC7, 0x000007FE, 0x0007000C, 0x0000001D,\n    0x0000629A, 0x00000001, 0x00000028, 0x00000504, 0x00004733, 0x0007004F,\n    0x00000011, 0x00003774, 0x00003723, 0x00003723, 0x00000002, 0x00000003,\n    0x0004007C, 0x00000012, 0x000024C8, 0x00003774, 0x0009004F, 0x0000001A,\n    0x000060DB, 0x000024C8, 0x000024C8, 0x00000000, 0x00000000, 0x00000001,\n    0x00000001, 0x000500C4, 0x0000001A, 0x000048B9, 0x000060DB, 0x00000122,\n    0x000500C3, 0x0000001A, 0x00003D9A, 0x000048B9, 0x00000302, 0x0004006F,\n    0x0000001D, 0x00002AC8, 0x00003D9A, 0x0005008E, 0x0000001D, 0x00004734,\n    0x00002AC8, 0x000007FE, 0x0007000C, 0x0000001D, 0x0000629B, 0x00000001,\n    0x00000028, 0x00000504, 0x00004734, 0x0007004F, 0x00000011, 0x00003775,\n    0x00002BD0, 0x00002BD0, 0x00000000, 0x00000001, 0x0004007C, 0x00000012,\n    0x000024C9, 0x00003775, 0x0009004F, 0x0000001A, 0x000060DC, 0x000024C9,\n    0x000024C9, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x000500C4,\n    0x0000001A, 0x000048BA, 0x000060DC, 0x00000122, 0x000500C3, 0x0000001A,\n    0x00003D9B, 0x000048BA, 0x00000302, 0x0004006F, 0x0000001D, 0x00002AC9,\n    0x00003D9B, 0x0005008E, 0x0000001D, 0x00004735, 0x00002AC9, 0x000007FE,\n    0x0007000C, 0x0000001D, 0x0000629C, 0x00000001, 0x00000028, 0x00000504,\n    0x00004735, 0x0007004F, 0x00000011, 0x00003776, 0x00002BD0, 0x00002BD0,\n    0x00000002, 0x00000003, 0x0004007C, 0x00000012, 0x000024CA, 0x00003776,\n    0x0009004F, 0x0000001A, 0x000060DD, 0x000024CA, 0x000024CA, 0x00000000,\n    0x00000000, 0x00000001, 0x00000001, 0x000500C4, 0x0000001A, 0x000048BC,\n    0x000060DD, 0x00000122, 0x000500C3, 0x0000001A, 0x00003D9C, 0x000048BC,\n    0x00000302, 0x0004006F, 0x0000001D, 0x00002ACA, 0x00003D9C, 0x0005008E,\n    0x0000001D, 0x000053D2, 0x00002ACA, 0x000007FE, 0x0007000C, 0x0000001D,\n    0x00004365, 0x00000001, 0x00000028, 0x00000504, 0x000053D2, 0x000200F9,\n    0x00004F2A, 0x000200F8, 0x00004F59, 0x0007004F, 0x00000011, 0x00002624,\n    0x00003723, 0x00003723, 0x00000000, 0x00000001, 0x0004007C, 0x00000013,\n    0x0000515D, 0x00002624, 0x00050051, 0x0000000D, 0x00001B87, 0x0000515D,\n    0x00000000, 0x00050051, 0x0000000D, 0x00003473, 0x0000515D, 0x00000001,\n    0x00070050, 0x0000001D, 0x00004291, 0x00001B87, 0x00003473, 0x00000A0C,\n    0x00000A0C, 0x0007004F, 0x00000011, 0x000041E1, 0x00003723, 0x00003723,\n    0x00000002, 0x00000003, 0x0004007C, 0x00000013, 0x00003766, 0x000041E1,\n    0x00050051, 0x0000000D, 0x00001B88, 0x00003766, 0x00000000, 0x00050051,\n    0x0000000D, 0x00003474, 0x00003766, 0x00000001, 0x00070050, 0x0000001D,\n    0x00004292, 0x00001B88, 0x00003474, 0x00000A0C, 0x00000A0C, 0x0007004F,\n    0x00000011, 0x000041E2, 0x00002BD0, 0x00002BD0, 0x00000000, 0x00000001,\n    0x0004007C, 0x00000013, 0x00003767, 0x000041E2, 0x00050051, 0x0000000D,\n    0x00001B89, 0x00003767, 0x00000000, 0x00050051, 0x0000000D, 0x00003475,\n    0x00003767, 0x00000001, 0x00070050, 0x0000001D, 0x00004293, 0x00001B89,\n    0x00003475, 0x00000A0C, 0x00000A0C, 0x0007004F, 0x00000011, 0x000041E3,\n    0x00002BD0, 0x00002BD0, 0x00000002, 0x00000003, 0x0004007C, 0x00000013,\n    0x00003768, 0x000041E3, 0x00050051, 0x0000000D, 0x00001B8A, 0x00003768,\n    0x00000000, 0x00050051, 0x0000000D, 0x0000410B, 0x00003768, 0x00000001,\n    0x00070050, 0x0000001D, 0x0000235C, 0x00001B8A, 0x0000410B, 0x00000A0C,\n    0x00000A0C, 0x000200F9, 0x00004F2A, 0x000200F8, 0x00004F2A, 0x000900F5,\n    0x0000001D, 0x00002BB1, 0x0000235C, 0x00004F59, 0x00004365, 0x0000215B,\n    0x0000235B, 0x0000203A, 0x000900F5, 0x0000001D, 0x00003812, 0x00004293,\n    0x00004F59, 0x0000629C, 0x0000215B, 0x00003923, 0x0000203A, 0x000900F5,\n    0x0000001D, 0x00003B84, 0x00004292, 0x00004F59, 0x0000629B, 0x0000215B,\n    0x00003922, 0x0000203A, 0x000900F5, 0x0000001D, 0x000038BD, 0x00004291,\n    0x00004F59, 0x0000629A, 0x0000215B, 0x00003921, 0x0000203A, 0x000200F9,\n    0x00005312, 0x000200F8, 0x00005312, 0x000700F5, 0x0000001D, 0x00002BB2,\n    0x00002BB1, 0x00004F2A, 0x00002BB0, 0x00003F63, 0x000700F5, 0x0000001D,\n    0x00003813, 0x00003812, 0x00004F2A, 0x00003811, 0x00003F63, 0x000700F5,\n    0x0000001D, 0x00003297, 0x00003B84, 0x00004F2A, 0x00003B83, 0x00003F63,\n    0x000700F5, 0x0000001D, 0x0000367C, 0x000038BD, 0x00004F2A, 0x000038BC,\n    0x00003F63, 0x00050081, 0x0000001D, 0x0000435B, 0x0000435A, 0x0000367C,\n    0x00050081, 0x0000001D, 0x00005B03, 0x00005B02, 0x00003297, 0x00050081,\n    0x0000001D, 0x00002523, 0x00001C28, 0x00003813, 0x00050081, 0x0000001D,\n    0x00001E77, 0x000025AA, 0x00002BB2, 0x000200F9, 0x00005ECB, 0x000200F8,\n    0x00005ECB, 0x000700F5, 0x0000001D, 0x00002BB3, 0x00005113, 0x00005310,\n    0x00001E77, 0x00005312, 0x000700F5, 0x0000001D, 0x00003814, 0x00001F92,\n    0x00005310, 0x00002523, 0x00005312, 0x000700F5, 0x0000001D, 0x00003B31,\n    0x00005B01, 0x00005310, 0x00005B03, 0x00005312, 0x000700F5, 0x0000001D,\n    0x00003B85, 0x00004359, 0x00005310, 0x0000435B, 0x00005312, 0x000700F5,\n    0x0000000D, 0x000038BE, 0x000061FB, 0x00005310, 0x00002F3A, 0x00005312,\n    0x000200F9, 0x00005313, 0x000200F8, 0x00005313, 0x000700F5, 0x0000001D,\n    0x00002BB4, 0x00002BA9, 0x0000530F, 0x00002BB3, 0x00005ECB, 0x000700F5,\n    0x0000001D, 0x00003815, 0x0000380A, 0x0000530F, 0x00003814, 0x00005ECB,\n    0x000700F5, 0x0000001D, 0x00003B32, 0x000035EC, 0x0000530F, 0x00003B31,\n    0x00005ECB, 0x000700F5, 0x0000001D, 0x0000338C, 0x000020D3, 0x0000530F,\n    0x00003B85, 0x00005ECB, 0x000700F5, 0x0000000D, 0x00002EA8, 0x00002B2C,\n    0x0000530F, 0x000038BE, 0x00005ECB, 0x0005008E, 0x0000001D, 0x00005A74,\n    0x0000338C, 0x00002EA8, 0x0005008E, 0x0000001D, 0x000019CC, 0x00003B32,\n    0x00002EA8, 0x0005008E, 0x0000001D, 0x0000306F, 0x00003815, 0x00002EA8,\n    0x0005008E, 0x0000001D, 0x00003432, 0x00002BB4, 0x00002EA8, 0x000300F7,\n    0x00003F64, 0x00000002, 0x000400FA, 0x00001D33, 0x00002741, 0x00003F64,\n    0x000200F8, 0x00002741, 0x0009004F, 0x0000001D, 0x00003AEE, 0x00005A74,\n    0x00005A74, 0x00000002, 0x00000001, 0x00000000, 0x00000003, 0x0009004F,\n    0x0000001D, 0x00003A07, 0x000019CC, 0x000019CC, 0x00000002, 0x00000001,\n    0x00000000, 0x00000003, 0x0009004F, 0x0000001D, 0x00001CE6, 0x0000306F,\n    0x0000306F, 0x00000002, 0x00000001, 0x00000000, 0x00000003, 0x0009004F,\n    0x0000001D, 0x00003EEF, 0x00003432, 0x00003432, 0x00000002, 0x00000001,\n    0x00000000, 0x00000003, 0x000200F9, 0x00003F64, 0x000200F8, 0x00003F64,\n    0x000700F5, 0x0000001D, 0x00002BB5, 0x00003432, 0x00005313, 0x00003EEF,\n    0x00002741, 0x000700F5, 0x0000001D, 0x00003816, 0x0000306F, 0x00005313,\n    0x00001CE6, 0x00002741, 0x000700F5, 0x0000001D, 0x00003B57, 0x000019CC,\n    0x00005313, 0x00003A07, 0x00002741, 0x000700F5, 0x0000001D, 0x00003A49,\n    0x00005A74, 0x00005313, 0x00003AEE, 0x00002741, 0x000300F7, 0x00004992,\n    0x00000000, 0x000F00FB, 0x00005093, 0x00001CCE, 0x00000003, 0x000045F2,\n    0x00000004, 0x00001934, 0x00000005, 0x00001933, 0x0000000A, 0x00001CCD,\n    0x0000000F, 0x00003167, 0x00000018, 0x00002514, 0x000200F8, 0x00002514,\n    0x00050051, 0x0000000D, 0x00003AC1, 0x00003A49, 0x00000000, 0x00050051,\n    0x0000000D, 0x00002825, 0x00003B57, 0x00000000, 0x00050051, 0x0000000D,\n    0x00001DD9, 0x00003816, 0x00000000, 0x00050051, 0x0000000D, 0x000019A5,\n    0x00002BB5, 0x00000000, 0x00070050, 0x0000001D, 0x00001D37, 0x00003AC1,\n    0x00002825, 0x00001DD9, 0x000019A5, 0x0008000C, 0x0000001D, 0x00003846,\n    0x00000001, 0x0000002B, 0x00001D37, 0x00000B7A, 0x00000505, 0x0005008E,\n    0x0000001D, 0x00003577, 0x00003846, 0x0000022D, 0x00050081, 0x0000001D,\n    0x00002E40, 0x00003577, 0x00000145, 0x0004006D, 0x00000017, 0x00001F0B,\n    0x00002E40, 0x0007004F, 0x00000011, 0x000018D9, 0x00001F0B, 0x00001F0B,\n    0x00000000, 0x00000002, 0x0007004F, 0x00000011, 0x00002750, 0x00001F0B,\n    0x00001F0B, 0x00000001, 0x00000003, 0x000500C4, 0x00000011, 0x00003546,\n    0x00002750, 0x00000867, 0x000500C5, 0x00000011, 0x00003D25, 0x000018D9,\n    0x00003546, 0x000200F9, 0x00004992, 0x000200F8, 0x00003167, 0x0008000C,\n    0x0000001D, 0x00001C8F, 0x00000001, 0x0000002B, 0x00003A49, 0x00000B7A,\n    0x00000505, 0x0005008E, 0x0000001D, 0x00004F73, 0x00001C8F, 0x000001C1,\n    0x00050081, 0x0000001D, 0x00002E66, 0x00004F73, 0x00000145, 0x0004006D,\n    0x00000017, 0x00001DD7, 0x00002E66, 0x00050051, 0x0000000B, 0x000021FC,\n    0x00001DD7, 0x00000000, 0x00050051, 0x0000000B, 0x00002FDB, 0x00001DD7,\n    0x00000001, 0x000500C4, 0x0000000B, 0x00002D29, 0x00002FDB, 0x00000A17,\n    0x000500C5, 0x0000000B, 0x00004D66, 0x000021FC, 0x00002D29, 0x00050051,\n    0x0000000B, 0x000053E4, 0x00001DD7, 0x00000002, 0x000500C4, 0x0000000B,\n    0x00002170, 0x000053E4, 0x00000A23, 0x000500C5, 0x0000000B, 0x00004D67,\n    0x00004D66, 0x00002170, 0x00050051, 0x0000000B, 0x000053E5, 0x00001DD7,\n    0x00000003, 0x000500C4, 0x0000000B, 0x00001C7C, 0x000053E5, 0x00000A2F,\n    0x000500C5, 0x0000000B, 0x00002427, 0x00004D67, 0x00001C7C, 0x0008000C,\n    0x0000001D, 0x00001D62, 0x00000001, 0x0000002B, 0x00003B57, 0x00000B7A,\n    0x00000505, 0x0005008E, 0x0000001D, 0x00002048, 0x00001D62, 0x000001C1,\n    0x00050081, 0x0000001D, 0x00002E67, 0x00002048, 0x00000145, 0x0004006D,\n    0x00000017, 0x00001DDA, 0x00002E67, 0x00050051, 0x0000000B, 0x000021FD,\n    0x00001DDA, 0x00000000, 0x00050051, 0x0000000B, 0x00002FDC, 0x00001DDA,\n    0x00000001, 0x000500C4, 0x0000000B, 0x00002D2A, 0x00002FDC, 0x00000A17,\n    0x000500C5, 0x0000000B, 0x00004D68, 0x000021FD, 0x00002D2A, 0x00050051,\n    0x0000000B, 0x000053E6, 0x00001DDA, 0x00000002, 0x000500C4, 0x0000000B,\n    0x00002171, 0x000053E6, 0x00000A23, 0x000500C5, 0x0000000B, 0x00004D69,\n    0x00004D68, 0x00002171, 0x00050051, 0x0000000B, 0x000053E7, 0x00001DDA,\n    0x00000003, 0x000500C4, 0x0000000B, 0x000029F9, 0x000053E7, 0x00000A2F,\n    0x000500C5, 0x0000000B, 0x00004A41, 0x00004D69, 0x000029F9, 0x000500C4,\n    0x0000000B, 0x000058C9, 0x00004A41, 0x00000A3A, 0x000500C5, 0x0000000B,\n    0x0000186E, 0x00002427, 0x000058C9, 0x0008000C, 0x0000001D, 0x00001D63,\n    0x00000001, 0x0000002B, 0x00003816, 0x00000B7A, 0x00000505, 0x0005008E,\n    0x0000001D, 0x00002049, 0x00001D63, 0x000001C1, 0x00050081, 0x0000001D,\n    0x00002E69, 0x00002049, 0x00000145, 0x0004006D, 0x00000017, 0x00001DDB,\n    0x00002E69, 0x00050051, 0x0000000B, 0x000021FE, 0x00001DDB, 0x00000000,\n    0x00050051, 0x0000000B, 0x00002FDD, 0x00001DDB, 0x00000001, 0x000500C4,\n    0x0000000B, 0x00002D2B, 0x00002FDD, 0x00000A17, 0x000500C5, 0x0000000B,\n    0x00004D6A, 0x000021FE, 0x00002D2B, 0x00050051, 0x0000000B, 0x000053E8,\n    0x00001DDB, 0x00000002, 0x000500C4, 0x0000000B, 0x00002172, 0x000053E8,\n    0x00000A23, 0x000500C5, 0x0000000B, 0x00004D6B, 0x00004D6A, 0x00002172,\n    0x00050051, 0x0000000B, 0x000053E9, 0x00001DDB, 0x00000003, 0x000500C4,\n    0x0000000B, 0x00001C7D, 0x000053E9, 0x00000A2F, 0x000500C5, 0x0000000B,\n    0x00002428, 0x00004D6B, 0x00001C7D, 0x0008000C, 0x0000001D, 0x00001D64,\n    0x00000001, 0x0000002B, 0x00002BB5, 0x00000B7A, 0x00000505, 0x0005008E,\n    0x0000001D, 0x0000204A, 0x00001D64, 0x000001C1, 0x00050081, 0x0000001D,\n    0x00002E6A, 0x0000204A, 0x00000145, 0x0004006D, 0x00000017, 0x00001DDC,\n    0x00002E6A, 0x00050051, 0x0000000B, 0x000021FF, 0x00001DDC, 0x00000000,\n    0x00050051, 0x0000000B, 0x00002FDE, 0x00001DDC, 0x00000001, 0x000500C4,\n    0x0000000B, 0x00002D2C, 0x00002FDE, 0x00000A17, 0x000500C5, 0x0000000B,\n    0x00004D6C, 0x000021FF, 0x00002D2C, 0x00050051, 0x0000000B, 0x000053EA,\n    0x00001DDC, 0x00000002, 0x000500C4, 0x0000000B, 0x00002173, 0x000053EA,\n    0x00000A23, 0x000500C5, 0x0000000B, 0x00004D6D, 0x00004D6C, 0x00002173,\n    0x00050051, 0x0000000B, 0x000053EB, 0x00001DDC, 0x00000003, 0x000500C4,\n    0x0000000B, 0x000029FA, 0x000053EB, 0x00000A2F, 0x000500C5, 0x0000000B,\n    0x00004A42, 0x00004D6D, 0x000029FA, 0x000500C4, 0x0000000B, 0x00005DAA,\n    0x00004A42, 0x00000A3A, 0x000500C5, 0x0000000B, 0x00004649, 0x00002428,\n    0x00005DAA, 0x00050050, 0x00000011, 0x000053DD, 0x0000186E, 0x00004649,\n    0x000200F9, 0x00004992, 0x000200F8, 0x00001CCD, 0x00050051, 0x0000000D,\n    0x00004DAD, 0x00003A49, 0x00000000, 0x00050051, 0x0000000D, 0x00002826,\n    0x00003A49, 0x00000001, 0x00050051, 0x0000000D, 0x00001DDD, 0x00003B57,\n    0x00000000, 0x00050051, 0x0000000D, 0x000019A6, 0x00003B57, 0x00000001,\n    0x00070050, 0x0000001D, 0x00001D38, 0x00004DAD, 0x00002826, 0x00001DDD,\n    0x000019A6, 0x0008000C, 0x0000001D, 0x00003847, 0x00000001, 0x0000002B,\n    0x00001D38, 0x00000B7A, 0x00000505, 0x0005008E, 0x0000001D, 0x00003578,\n    0x00003847, 0x00000540, 0x00050081, 0x0000001D, 0x00002E6B, 0x00003578,\n    0x00000145, 0x0004006D, 0x00000017, 0x00001DDE, 0x00002E6B, 0x00050051,\n    0x0000000B, 0x00002200, 0x00001DDE, 0x00000000, 0x00050051, 0x0000000B,\n    0x00002FDF, 0x00001DDE, 0x00000001, 0x000500C4, 0x0000000B, 0x00002D2D,\n    0x00002FDF, 0x00000A23, 0x000500C5, 0x0000000B, 0x00004D6E, 0x00002200,\n    0x00002D2D, 0x00050051, 0x0000000B, 0x000053EC, 0x00001DDE, 0x00000002,\n    0x000500C4, 0x0000000B, 0x00002174, 0x000053EC, 0x00000A3B, 0x000500C5,\n    0x0000000B, 0x00004D6F, 0x00004D6E, 0x00002174, 0x00050051, 0x0000000B,\n    0x000053ED, 0x00001DDE, 0x00000003, 0x000500C4, 0x0000000B, 0x00002175,\n    0x000053ED, 0x00000A53, 0x000500C5, 0x0000000B, 0x000044DD, 0x00004D6F,\n    0x00002175, 0x00050051, 0x0000000D, 0x00004E80, 0x00003816, 0x00000000,\n    0x00050051, 0x0000000D, 0x00005CB2, 0x00003816, 0x00000001, 0x00050051,\n    0x0000000D, 0x00001DDF, 0x00002BB5, 0x00000000, 0x00050051, 0x0000000D,\n    0x000019A7, 0x00002BB5, 0x00000001, 0x00070050, 0x0000001D, 0x00001D39,\n    0x00004E80, 0x00005CB2, 0x00001DDF, 0x000019A7, 0x0008000C, 0x0000001D,\n    0x00003848, 0x00000001, 0x0000002B, 0x00001D39, 0x00000B7A, 0x00000505,\n    0x0005008E, 0x0000001D, 0x00003579, 0x00003848, 0x00000540, 0x00050081,\n    0x0000001D, 0x00002E6C, 0x00003579, 0x00000145, 0x0004006D, 0x00000017,\n    0x00001DE0, 0x00002E6C, 0x00050051, 0x0000000B, 0x00002201, 0x00001DE0,\n    0x00000000, 0x00050051, 0x0000000B, 0x00002FE0, 0x00001DE0, 0x00000001,\n    0x000500C4, 0x0000000B, 0x00002D2E, 0x00002FE0, 0x00000A23, 0x000500C5,\n    0x0000000B, 0x00004D70, 0x00002201, 0x00002D2E, 0x00050051, 0x0000000B,\n    0x000053EE, 0x00001DE0, 0x00000002, 0x000500C4, 0x0000000B, 0x00002176,\n    0x000053EE, 0x00000A3B, 0x000500C5, 0x0000000B, 0x00004D71, 0x00004D70,\n    0x00002176, 0x00050051, 0x0000000B, 0x000053EF, 0x00001DE0, 0x00000003,\n    0x000500C4, 0x0000000B, 0x0000215D, 0x000053EF, 0x00000A53, 0x000500C5,\n    0x0000000B, 0x00005202, 0x00004D71, 0x0000215D, 0x00050050, 0x00000011,\n    0x000053DE, 0x000044DD, 0x00005202, 0x000200F9, 0x00004992, 0x000200F8,\n    0x00001933, 0x0008004F, 0x00000018, 0x000021CF, 0x00003A49, 0x00003A49,\n    0x00000000, 0x00000001, 0x00000002, 0x0008000C, 0x00000018, 0x00001847,\n    0x00000001, 0x0000002B, 0x000021CF, 0x00000A2D, 0x00000A18, 0x00050085,\n    0x00000018, 0x00001BC1, 0x00001847, 0x000003BE, 0x00050081, 0x00000018,\n    0x00001F1A, 0x00001BC1, 0x000003AB, 0x0004006D, 0x00000014, 0x00002752,\n    0x00001F1A, 0x00050051, 0x0000000B, 0x00002202, 0x00002752, 0x00000000,\n    0x00050051, 0x0000000B, 0x00002FE1, 0x00002752, 0x00000001, 0x000500C4,\n    0x0000000B, 0x00002D2F, 0x00002FE1, 0x00000A1A, 0x000500C5, 0x0000000B,\n    0x00004D72, 0x00002202, 0x00002D2F, 0x00050051, 0x0000000B, 0x000053F0,\n    0x00002752, 0x00000002, 0x000500C4, 0x0000000B, 0x0000214D, 0x000053F0,\n    0x00000A29, 0x000500C5, 0x0000000B, 0x00004143, 0x00004D72, 0x0000214D,\n    0x0008004F, 0x00000018, 0x000022A2, 0x00003B57, 0x00003B57, 0x00000000,\n    0x00000001, 0x00000002, 0x0008000C, 0x00000018, 0x00004CD4, 0x00000001,\n    0x0000002B, 0x000022A2, 0x00000A2D, 0x00000A18, 0x00050085, 0x00000018,\n    0x00001BC2, 0x00004CD4, 0x000003BE, 0x00050081, 0x00000018, 0x00001F1B,\n    0x00001BC2, 0x000003AB, 0x0004006D, 0x00000014, 0x00002753, 0x00001F1B,\n    0x00050051, 0x0000000B, 0x00002203, 0x00002753, 0x00000000, 0x00050051,\n    0x0000000B, 0x00002FE2, 0x00002753, 0x00000001, 0x000500C4, 0x0000000B,\n    0x00002D30, 0x00002FE2, 0x00000A1A, 0x000500C5, 0x0000000B, 0x00004D73,\n    0x00002203, 0x00002D30, 0x00050051, 0x0000000B, 0x000053F1, 0x00002753,\n    0x00000002, 0x000500C4, 0x0000000B, 0x000029FB, 0x000053F1, 0x00000A29,\n    0x000500C5, 0x0000000B, 0x00004A43, 0x00004D73, 0x000029FB, 0x000500C4,\n    0x0000000B, 0x00005D97, 0x00004A43, 0x00000A3A, 0x000500C5, 0x0000000B,\n    0x0000358A, 0x00004143, 0x00005D97, 0x0008004F, 0x00000018, 0x000022A3,\n    0x00003816, 0x00003816, 0x00000000, 0x00000001, 0x00000002, 0x0008000C,\n    0x00000018, 0x00004CD5, 0x00000001, 0x0000002B, 0x000022A3, 0x00000A2D,\n    0x00000A18, 0x00050085, 0x00000018, 0x00001BC3, 0x00004CD5, 0x000003BE,\n    0x00050081, 0x00000018, 0x00001F1C, 0x00001BC3, 0x000003AB, 0x0004006D,\n    0x00000014, 0x00002754, 0x00001F1C, 0x00050051, 0x0000000B, 0x00002204,\n    0x00002754, 0x00000000, 0x00050051, 0x0000000B, 0x00002FE3, 0x00002754,\n    0x00000001, 0x000500C4, 0x0000000B, 0x00002D31, 0x00002FE3, 0x00000A1A,\n    0x000500C5, 0x0000000B, 0x00004D74, 0x00002204, 0x00002D31, 0x00050051,\n    0x0000000B, 0x000053F2, 0x00002754, 0x00000002, 0x000500C4, 0x0000000B,\n    0x0000214E, 0x000053F2, 0x00000A29, 0x000500C5, 0x0000000B, 0x00004144,\n    0x00004D74, 0x0000214E, 0x0008004F, 0x00000018, 0x000022A4, 0x00002BB5,\n    0x00002BB5, 0x00000000, 0x00000001, 0x00000002, 0x0008000C, 0x00000018,\n    0x00004CDB, 0x00000001, 0x0000002B, 0x000022A4, 0x00000A2D, 0x00000A18,\n    0x00050085, 0x00000018, 0x00001BC4, 0x00004CDB, 0x000003BE, 0x00050081,\n    0x00000018, 0x00001F1D, 0x00001BC4, 0x000003AB, 0x0004006D, 0x00000014,\n    0x00002755, 0x00001F1D, 0x00050051, 0x0000000B, 0x00002205, 0x00002755,\n    0x00000000, 0x00050051, 0x0000000B, 0x00002FE4, 0x00002755, 0x00000001,\n    0x000500C4, 0x0000000B, 0x00002D32, 0x00002FE4, 0x00000A1A, 0x000500C5,\n    0x0000000B, 0x00004D75, 0x00002205, 0x00002D32, 0x00050051, 0x0000000B,\n    0x000053F3, 0x00002755, 0x00000002, 0x000500C4, 0x0000000B, 0x000029FC,\n    0x000053F3, 0x00000A29, 0x000500C5, 0x0000000B, 0x00004A44, 0x00004D75,\n    0x000029FC, 0x000500C4, 0x0000000B, 0x00005DAB, 0x00004A44, 0x00000A3A,\n    0x000500C5, 0x0000000B, 0x0000464A, 0x00004144, 0x00005DAB, 0x00050050,\n    0x00000011, 0x000053DF, 0x0000358A, 0x0000464A, 0x000200F9, 0x00004992,\n    0x000200F8, 0x00001934, 0x0008004F, 0x00000018, 0x000021D0, 0x00003A49,\n    0x00003A49, 0x00000000, 0x00000001, 0x00000002, 0x0008000C, 0x00000018,\n    0x00001848, 0x00000001, 0x0000002B, 0x000021D0, 0x00000A2D, 0x00000A18,\n    0x00050085, 0x00000018, 0x00001BC5, 0x00001848, 0x000001FF, 0x00050081,\n    0x00000018, 0x00001F1E, 0x00001BC5, 0x000003AB, 0x0004006D, 0x00000014,\n    0x00002756, 0x00001F1E, 0x00050051, 0x0000000B, 0x00002206, 0x00002756,\n    0x00000000, 0x00050051, 0x0000000B, 0x00002FE5, 0x00002756, 0x00000001,\n    0x000500C4, 0x0000000B, 0x00002D33, 0x00002FE5, 0x00000A1A, 0x000500C5,\n    0x0000000B, 0x00004D76, 0x00002206, 0x00002D33, 0x00050051, 0x0000000B,\n    0x000053F4, 0x00002756, 0x00000002, 0x000500C4, 0x0000000B, 0x0000214F,\n    0x000053F4, 0x00000A2C, 0x000500C5, 0x0000000B, 0x00004145, 0x00004D76,\n    0x0000214F, 0x0008004F, 0x00000018, 0x000022A5, 0x00003B57, 0x00003B57,\n    0x00000000, 0x00000001, 0x00000002, 0x0008000C, 0x00000018, 0x00004CDC,\n    0x00000001, 0x0000002B, 0x000022A5, 0x00000A2D, 0x00000A18, 0x00050085,\n    0x00000018, 0x00001BC6, 0x00004CDC, 0x000001FF, 0x00050081, 0x00000018,\n    0x00001F1F, 0x00001BC6, 0x000003AB, 0x0004006D, 0x00000014, 0x00002757,\n    0x00001F1F, 0x00050051, 0x0000000B, 0x00002207, 0x00002757, 0x00000000,\n    0x00050051, 0x0000000B, 0x00002FE6, 0x00002757, 0x00000001, 0x000500C4,\n    0x0000000B, 0x00002D34, 0x00002FE6, 0x00000A1A, 0x000500C5, 0x0000000B,\n    0x00004D77, 0x00002207, 0x00002D34, 0x00050051, 0x0000000B, 0x000053F5,\n    0x00002757, 0x00000002, 0x000500C4, 0x0000000B, 0x000029FD, 0x000053F5,\n    0x00000A2C, 0x000500C5, 0x0000000B, 0x00004A45, 0x00004D77, 0x000029FD,\n    0x000500C4, 0x0000000B, 0x00005D98, 0x00004A45, 0x00000A3A, 0x000500C5,\n    0x0000000B, 0x0000358B, 0x00004145, 0x00005D98, 0x0008004F, 0x00000018,\n    0x000022A6, 0x00003816, 0x00003816, 0x00000000, 0x00000001, 0x00000002,\n    0x0008000C, 0x00000018, 0x00004CE5, 0x00000001, 0x0000002B, 0x000022A6,\n    0x00000A2D, 0x00000A18, 0x00050085, 0x00000018, 0x00001BC7, 0x00004CE5,\n    0x000001FF, 0x00050081, 0x00000018, 0x00001F20, 0x00001BC7, 0x000003AB,\n    0x0004006D, 0x00000014, 0x00002758, 0x00001F20, 0x00050051, 0x0000000B,\n    0x00002208, 0x00002758, 0x00000000, 0x00050051, 0x0000000B, 0x00002FE7,\n    0x00002758, 0x00000001, 0x000500C4, 0x0000000B, 0x00002D35, 0x00002FE7,\n    0x00000A1A, 0x000500C5, 0x0000000B, 0x00004D78, 0x00002208, 0x00002D35,\n    0x00050051, 0x0000000B, 0x000053F6, 0x00002758, 0x00000002, 0x000500C4,\n    0x0000000B, 0x00002150, 0x000053F6, 0x00000A2C, 0x000500C5, 0x0000000B,\n    0x00004146, 0x00004D78, 0x00002150, 0x0008004F, 0x00000018, 0x000022A8,\n    0x00002BB5, 0x00002BB5, 0x00000000, 0x00000001, 0x00000002, 0x0008000C,\n    0x00000018, 0x00004CE6, 0x00000001, 0x0000002B, 0x000022A8, 0x00000A2D,\n    0x00000A18, 0x00050085, 0x00000018, 0x00001BC8, 0x00004CE6, 0x000001FF,\n    0x00050081, 0x00000018, 0x00001F21, 0x00001BC8, 0x000003AB, 0x0004006D,\n    0x00000014, 0x00002759, 0x00001F21, 0x00050051, 0x0000000B, 0x00002209,\n    0x00002759, 0x00000000, 0x00050051, 0x0000000B, 0x00002FE8, 0x00002759,\n    0x00000001, 0x000500C4, 0x0000000B, 0x00002D36, 0x00002FE8, 0x00000A1A,\n    0x000500C5, 0x0000000B, 0x00004D79, 0x00002209, 0x00002D36, 0x00050051,\n    0x0000000B, 0x000053F7, 0x00002759, 0x00000002, 0x000500C4, 0x0000000B,\n    0x000029FE, 0x000053F7, 0x00000A2C, 0x000500C5, 0x0000000B, 0x00004A46,\n    0x00004D79, 0x000029FE, 0x000500C4, 0x0000000B, 0x00005DAC, 0x00004A46,\n    0x00000A3A, 0x000500C5, 0x0000000B, 0x0000464B, 0x00004146, 0x00005DAC,\n    0x00050050, 0x00000011, 0x000053E0, 0x0000358B, 0x0000464B, 0x000200F9,\n    0x00004992, 0x000200F8, 0x000045F2, 0x0008000C, 0x0000001D, 0x000022A9,\n    0x00000001, 0x0000002B, 0x00003A49, 0x00000B7A, 0x00000505, 0x00050085,\n    0x0000001D, 0x00004580, 0x000022A9, 0x00000809, 0x00050081, 0x0000001D,\n    0x00001F22, 0x00004580, 0x00000145, 0x0004006D, 0x00000017, 0x0000275A,\n    0x00001F22, 0x00050051, 0x0000000B, 0x0000220A, 0x0000275A, 0x00000000,\n    0x00050051, 0x0000000B, 0x00002FE9, 0x0000275A, 0x00000001, 0x000500C4,\n    0x0000000B, 0x00002D37, 0x00002FE9, 0x00000A1A, 0x000500C5, 0x0000000B,\n    0x00004D7A, 0x0000220A, 0x00002D37, 0x00050051, 0x0000000B, 0x000053F8,\n    0x0000275A, 0x00000002, 0x000500C4, 0x0000000B, 0x00002177, 0x000053F8,\n    0x00000A29, 0x000500C5, 0x0000000B, 0x00004D7B, 0x00004D7A, 0x00002177,\n    0x00050051, 0x0000000B, 0x000053F9, 0x0000275A, 0x00000003, 0x000500C4,\n    0x0000000B, 0x00001C7E, 0x000053F9, 0x00000A38, 0x000500C5, 0x0000000B,\n    0x0000237C, 0x00004D7B, 0x00001C7E, 0x0008000C, 0x0000001D, 0x00002377,\n    0x00000001, 0x0000002B, 0x00003B57, 0x00000B7A, 0x00000505, 0x00050085,\n    0x0000001D, 0x000060DE, 0x00002377, 0x00000809, 0x00050081, 0x0000001D,\n    0x00001F23, 0x000060DE, 0x00000145, 0x0004006D, 0x00000017, 0x0000275B,\n    0x00001F23, 0x00050051, 0x0000000B, 0x0000220B, 0x0000275B, 0x00000000,\n    0x00050051, 0x0000000B, 0x00002FEA, 0x0000275B, 0x00000001, 0x000500C4,\n    0x0000000B, 0x00002D38, 0x00002FEA, 0x00000A1A, 0x000500C5, 0x0000000B,\n    0x00004D7C, 0x0000220B, 0x00002D38, 0x00050051, 0x0000000B, 0x000053FA,\n    0x0000275B, 0x00000002, 0x000500C4, 0x0000000B, 0x00002178, 0x000053FA,\n    0x00000A29, 0x000500C5, 0x0000000B, 0x00004D7D, 0x00004D7C, 0x00002178,\n    0x00050051, 0x0000000B, 0x000053FB, 0x0000275B, 0x00000003, 0x000500C4,\n    0x0000000B, 0x000029FF, 0x000053FB, 0x00000A38, 0x000500C5, 0x0000000B,\n    0x00004A47, 0x00004D7D, 0x000029FF, 0x000500C4, 0x0000000B, 0x000058CA,\n    0x00004A47, 0x00000A3A, 0x000500C5, 0x0000000B, 0x00006242, 0x0000237C,\n    0x000058CA, 0x0008000C, 0x0000001D, 0x00002378, 0x00000001, 0x0000002B,\n    0x00003816, 0x00000B7A, 0x00000505, 0x00050085, 0x0000001D, 0x000060DF,\n    0x00002378, 0x00000809, 0x00050081, 0x0000001D, 0x00001F24, 0x000060DF,\n    0x00000145, 0x0004006D, 0x00000017, 0x0000275C, 0x00001F24, 0x00050051,\n    0x0000000B, 0x0000220C, 0x0000275C, 0x00000000, 0x00050051, 0x0000000B,\n    0x00002FEB, 0x0000275C, 0x00000001, 0x000500C4, 0x0000000B, 0x00002D39,\n    0x00002FEB, 0x00000A1A, 0x000500C5, 0x0000000B, 0x00004D7E, 0x0000220C,\n    0x00002D39, 0x00050051, 0x0000000B, 0x000053FC, 0x0000275C, 0x00000002,\n    0x000500C4, 0x0000000B, 0x00002179, 0x000053FC, 0x00000A29, 0x000500C5,\n    0x0000000B, 0x00004D7F, 0x00004D7E, 0x00002179, 0x00050051, 0x0000000B,\n    0x000053FD, 0x0000275C, 0x00000003, 0x000500C4, 0x0000000B, 0x00001C7F,\n    0x000053FD, 0x00000A38, 0x000500C5, 0x0000000B, 0x0000237D, 0x00004D7F,\n    0x00001C7F, 0x0008000C, 0x0000001D, 0x00002379, 0x00000001, 0x0000002B,\n    0x00002BB5, 0x00000B7A, 0x00000505, 0x00050085, 0x0000001D, 0x000060E0,\n    0x00002379, 0x00000809, 0x00050081, 0x0000001D, 0x00001F25, 0x000060E0,\n    0x00000145, 0x0004006D, 0x00000017, 0x0000275D, 0x00001F25, 0x00050051,\n    0x0000000B, 0x0000220D, 0x0000275D, 0x00000000, 0x00050051, 0x0000000B,\n    0x00002FEC, 0x0000275D, 0x00000001, 0x000500C4, 0x0000000B, 0x00002D3A,\n    0x00002FEC, 0x00000A1A, 0x000500C5, 0x0000000B, 0x00004D80, 0x0000220D,\n    0x00002D3A, 0x00050051, 0x0000000B, 0x000053FE, 0x0000275D, 0x00000002,\n    0x000500C4, 0x0000000B, 0x0000217A, 0x000053FE, 0x00000A29, 0x000500C5,\n    0x0000000B, 0x00004D81, 0x00004D80, 0x0000217A, 0x00050051, 0x0000000B,\n    0x000053FF, 0x0000275D, 0x00000003, 0x000500C4, 0x0000000B, 0x00002A00,\n    0x000053FF, 0x00000A38, 0x000500C5, 0x0000000B, 0x00004A48, 0x00004D81,\n    0x00002A00, 0x000500C4, 0x0000000B, 0x00005DAD, 0x00004A48, 0x00000A3A,\n    0x000500C5, 0x0000000B, 0x0000464C, 0x0000237D, 0x00005DAD, 0x00050050,\n    0x00000011, 0x000053E1, 0x00006242, 0x0000464C, 0x000200F9, 0x00004992,\n    0x000200F8, 0x00001CCE, 0x00050051, 0x0000000D, 0x00004D9A, 0x00003A49,\n    0x00000000, 0x00050051, 0x0000000D, 0x000023ED, 0x00003B57, 0x00000000,\n    0x00050050, 0x00000013, 0x00004B20, 0x00004D9A, 0x000023ED, 0x0006000C,\n    0x0000000B, 0x0000217B, 0x00000001, 0x0000003A, 0x00004B20, 0x00050051,\n    0x0000000D, 0x00005BBF, 0x00003816, 0x00000000, 0x00050051, 0x0000000D,\n    0x000039A7, 0x00002BB5, 0x00000000, 0x00050050, 0x00000013, 0x00004B0D,\n    0x00005BBF, 0x000039A7, 0x0006000C, 0x0000000B, 0x00002E96, 0x00000001,\n    0x0000003A, 0x00004B0D, 0x00050050, 0x00000011, 0x0000612F, 0x0000217B,\n    0x00002E96, 0x000200F9, 0x00004992, 0x000200F8, 0x00004992, 0x001100F5,\n    0x00000011, 0x000058B2, 0x0000612F, 0x00001CCE, 0x000053E1, 0x000045F2,\n    0x000053E0, 0x00001934, 0x000053DF, 0x00001933, 0x000053DE, 0x00001CCD,\n    0x000053DD, 0x00003167, 0x00003D25, 0x00002514, 0x000500AA, 0x00000009,\n    0x00004AAF, 0x00001DD8, 0x00000A0A, 0x000600A9, 0x00000009, 0x000056E6,\n    0x00004AAF, 0x00000787, 0x00004AAF, 0x000300F7, 0x00004CC1, 0x00000002,\n    0x000400FA, 0x000056E6, 0x00002E70, 0x00004CC1, 0x000200F8, 0x00002E70,\n    0x00050051, 0x0000000B, 0x00004B1B, 0x000058B2, 0x00000000, 0x000500C2,\n    0x0000000B, 0x00003427, 0x00004B1B, 0x00000A3A, 0x000500C7, 0x0000000B,\n    0x00001C34, 0x00004B1B, 0x0000068D, 0x000500C5, 0x0000000B, 0x0000452D,\n    0x00003427, 0x00001C34, 0x00060052, 0x00000011, 0x00005B32, 0x0000452D,\n    0x000058B2, 0x00000000, 0x000200F9, 0x00004CC1, 0x000200F8, 0x00004CC1,\n    0x000700F5, 0x00000011, 0x0000305F, 0x000058B2, 0x00004992, 0x00005B32,\n    0x00002E70, 0x00050080, 0x00000011, 0x000032A7, 0x00002EF9, 0x000059EC,\n    0x000300F7, 0x000052F5, 0x00000002, 0x000400FA, 0x0000500F, 0x0000294E,\n    0x0000537D, 0x000200F8, 0x0000537D, 0x0004007C, 0x00000012, 0x00002970,\n    0x000032A7, 0x00050051, 0x0000000C, 0x000045F3, 0x00002970, 0x00000001,\n    0x000500C3, 0x0000000C, 0x00004DC0, 0x000045F3, 0x00000A1A, 0x0004007C,\n    0x0000000C, 0x0000578C, 0x000020FC, 0x00050084, 0x0000000C, 0x00001F02,\n    0x00004DC0, 0x0000578C, 0x00050051, 0x0000000C, 0x00006243, 0x00002970,\n    0x00000000, 0x000500C3, 0x0000000C, 0x00004FC7, 0x00006243, 0x00000A1A,\n    0x00050080, 0x0000000C, 0x000049BB, 0x00001F02, 0x00004FC7, 0x000500C4,\n    0x0000000C, 0x0000254A, 0x000049BB, 0x00000A1D, 0x000500C3, 0x0000000C,\n    0x0000603B, 0x000045F3, 0x00000A0E, 0x000500C7, 0x0000000C, 0x0000539A,\n    0x0000603B, 0x00000A20, 0x000500C4, 0x0000000C, 0x0000534A, 0x0000539A,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x00004EA5, 0x00006243, 0x00000A20,\n    0x000500C5, 0x0000000C, 0x00002B21, 0x0000534A, 0x00004EA5, 0x000500C5,\n    0x0000000C, 0x000043B6, 0x0000254A, 0x00002B21, 0x000500C4, 0x0000000C,\n    0x00005E63, 0x000043B6, 0x00000A0D, 0x000500C3, 0x0000000C, 0x000031DE,\n    0x000045F3, 0x00000A17, 0x000500C7, 0x0000000C, 0x00005447, 0x000031DE,\n    0x00000A0E, 0x000500C3, 0x0000000C, 0x000028A6, 0x00006243, 0x00000A14,\n    0x000500C7, 0x0000000C, 0x0000511E, 0x000028A6, 0x00000A14, 0x000500C3,\n    0x0000000C, 0x000028B9, 0x000045F3, 0x00000A14, 0x000500C7, 0x0000000C,\n    0x0000505E, 0x000028B9, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000541D,\n    0x0000505E, 0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BA, 0x0000511E,\n    0x0000541D, 0x000500C7, 0x0000000C, 0x00005076, 0x000045F3, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x00005228, 0x00005076, 0x00000A17, 0x000500C4,\n    0x0000000C, 0x00001997, 0x000022BA, 0x00000A1D, 0x000500C5, 0x0000000C,\n    0x000047FE, 0x00005228, 0x00001997, 0x000500C4, 0x0000000C, 0x00001C00,\n    0x00005447, 0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C81, 0x000047FE,\n    0x00001C00, 0x000500C7, 0x0000000C, 0x000050AF, 0x00005E63, 0x00000A38,\n    0x000500C5, 0x0000000C, 0x00003C70, 0x00003C81, 0x000050AF, 0x000500C3,\n    0x0000000C, 0x00003745, 0x00005E63, 0x00000A17, 0x000500C7, 0x0000000C,\n    0x000018B8, 0x00003745, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000547E,\n    0x000018B8, 0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A8, 0x00003C70,\n    0x0000547E, 0x000500C3, 0x0000000C, 0x00003A6E, 0x00005E63, 0x00000A1A,\n    0x000500C7, 0x0000000C, 0x000018B9, 0x00003A6E, 0x00000A20, 0x000500C4,\n    0x0000000C, 0x0000547F, 0x000018B9, 0x00000A23, 0x000500C5, 0x0000000C,\n    0x0000456F, 0x000045A8, 0x0000547F, 0x000500C3, 0x0000000C, 0x00003C88,\n    0x00005E63, 0x00000A23, 0x000500C4, 0x0000000C, 0x00002824, 0x00003C88,\n    0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B79, 0x0000456F, 0x00002824,\n    0x0004007C, 0x0000000B, 0x000041E5, 0x00003B79, 0x000200F9, 0x000052F5,\n    0x000200F8, 0x0000294E, 0x00050051, 0x0000000B, 0x00004D9B, 0x000032A7,\n    0x00000000, 0x00050051, 0x0000000B, 0x00002C03, 0x000032A7, 0x00000001,\n    0x00060050, 0x00000014, 0x000020DE, 0x00004D9B, 0x00002C03, 0x00005F72,\n    0x0004007C, 0x00000016, 0x00004E9D, 0x000020DE, 0x00050051, 0x0000000C,\n    0x00002BF7, 0x00004E9D, 0x00000002, 0x000500C3, 0x0000000C, 0x00004DC1,\n    0x00002BF7, 0x00000A11, 0x0004007C, 0x0000000C, 0x0000578D, 0x00006273,\n    0x00050084, 0x0000000C, 0x00001F03, 0x00004DC1, 0x0000578D, 0x00050051,\n    0x0000000C, 0x00006244, 0x00004E9D, 0x00000001, 0x000500C3, 0x0000000C,\n    0x00004A6F, 0x00006244, 0x00000A17, 0x00050080, 0x0000000C, 0x00002B2D,\n    0x00001F03, 0x00004A6F, 0x0004007C, 0x0000000C, 0x00004202, 0x000020FC,\n    0x00050084, 0x0000000C, 0x00003A60, 0x00002B2D, 0x00004202, 0x00050051,\n    0x0000000C, 0x00006245, 0x00004E9D, 0x00000000, 0x000500C3, 0x0000000C,\n    0x00004FC8, 0x00006245, 0x00000A1A, 0x00050080, 0x0000000C, 0x000049FC,\n    0x00003A60, 0x00004FC8, 0x000500C4, 0x0000000C, 0x0000225D, 0x000049FC,\n    0x00000A20, 0x000500C7, 0x0000000C, 0x00002CAA, 0x00002BF7, 0x00000A14,\n    0x000500C4, 0x0000000C, 0x00004CAE, 0x00002CAA, 0x00000A1A, 0x000500C3,\n    0x0000000C, 0x0000383E, 0x00006244, 0x00000A0E, 0x000500C7, 0x0000000C,\n    0x00005374, 0x0000383E, 0x00000A14, 0x000500C4, 0x0000000C, 0x000054CA,\n    0x00005374, 0x00000A14, 0x000500C5, 0x0000000C, 0x000042CE, 0x00004CAE,\n    0x000054CA, 0x000500C7, 0x0000000C, 0x000050D5, 0x00006245, 0x00000A20,\n    0x000500C5, 0x0000000C, 0x00003ADD, 0x000042CE, 0x000050D5, 0x000500C5,\n    0x0000000C, 0x000043B7, 0x0000225D, 0x00003ADD, 0x000500C4, 0x0000000C,\n    0x00005E50, 0x000043B7, 0x00000A0D, 0x000500C3, 0x0000000C, 0x000032D7,\n    0x00006244, 0x00000A14, 0x000500C6, 0x0000000C, 0x000026C9, 0x000032D7,\n    0x00004DC1, 0x000500C7, 0x0000000C, 0x00004199, 0x000026C9, 0x00000A0E,\n    0x000500C3, 0x0000000C, 0x00002590, 0x00006245, 0x00000A14, 0x000500C7,\n    0x0000000C, 0x0000505F, 0x00002590, 0x00000A14, 0x000500C4, 0x0000000C,\n    0x0000541E, 0x00004199, 0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BB,\n    0x0000505F, 0x0000541E, 0x000500C7, 0x0000000C, 0x00005077, 0x00006244,\n    0x00000A0E, 0x000500C4, 0x0000000C, 0x00005229, 0x00005077, 0x00000A17,\n    0x000500C4, 0x0000000C, 0x00001998, 0x000022BB, 0x00000A1D, 0x000500C5,\n    0x0000000C, 0x000047FF, 0x00005229, 0x00001998, 0x000500C4, 0x0000000C,\n    0x00001C01, 0x00004199, 0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C82,\n    0x000047FF, 0x00001C01, 0x000500C7, 0x0000000C, 0x000050B0, 0x00005E50,\n    0x00000A38, 0x000500C5, 0x0000000C, 0x00003C71, 0x00003C82, 0x000050B0,\n    0x000500C3, 0x0000000C, 0x00003746, 0x00005E50, 0x00000A17, 0x000500C7,\n    0x0000000C, 0x000018BA, 0x00003746, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x00005480, 0x000018BA, 0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A9,\n    0x00003C71, 0x00005480, 0x000500C3, 0x0000000C, 0x00003A6F, 0x00005E50,\n    0x00000A1A, 0x000500C7, 0x0000000C, 0x000018BB, 0x00003A6F, 0x00000A20,\n    0x000500C4, 0x0000000C, 0x00005481, 0x000018BB, 0x00000A23, 0x000500C5,\n    0x0000000C, 0x00004570, 0x000045A9, 0x00005481, 0x000500C3, 0x0000000C,\n    0x00003C89, 0x00005E50, 0x00000A23, 0x000500C4, 0x0000000C, 0x00002827,\n    0x00003C89, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B7A, 0x00004570,\n    0x00002827, 0x0004007C, 0x0000000B, 0x000041E6, 0x00003B7A, 0x000200F9,\n    0x000052F5, 0x000200F8, 0x000052F5, 0x000700F5, 0x0000000B, 0x00002C70,\n    0x000041E6, 0x0000294E, 0x000041E5, 0x0000537D, 0x00050080, 0x0000000B,\n    0x00005088, 0x00002C70, 0x000062B6, 0x000500C2, 0x0000000B, 0x00004EAA,\n    0x00005088, 0x00000A14, 0x000500AA, 0x00000009, 0x00004B9C, 0x00004ADC,\n    0x00000A0D, 0x000300F7, 0x00002C98, 0x00000000, 0x000400FA, 0x00004B9C,\n    0x00002957, 0x00002C98, 0x000200F8, 0x00002957, 0x000500C7, 0x00000011,\n    0x0000475F, 0x0000305F, 0x00000916, 0x000500C4, 0x00000011, 0x000024D1,\n    0x0000475F, 0x000007B7, 0x000500C7, 0x00000011, 0x000050AC, 0x0000305F,\n    0x00000B48, 0x000500C2, 0x00000011, 0x0000448D, 0x000050AC, 0x000007B7,\n    0x000500C5, 0x00000011, 0x00003FF9, 0x000024D1, 0x0000448D, 0x000200F9,\n    0x00002C98, 0x000200F8, 0x00002C98, 0x000700F5, 0x00000011, 0x00004D37,\n    0x0000305F, 0x000052F5, 0x00003FF9, 0x00002957, 0x00060041, 0x0000028E,\n    0x00001F76, 0x00001592, 0x00000A0B, 0x00004EAA, 0x0003003E, 0x00001F76,\n    0x00004D37, 0x000200F9, 0x00004C7A, 0x000200F8, 0x00004C7A, 0x000100FD,\n    0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/resolve_full_16bpp_scaled_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25245\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 8 8 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_resolve_edram_info\"\n               OpMemberName %push_const_block_xe 1 \"xe_resolve_coordinate_info\"\n               OpMemberName %push_const_block_xe 2 \"xe_resolve_dest_info\"\n               OpMemberName %push_const_block_xe 3 \"xe_resolve_dest_coordinate_info\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %xe_resolve_edram_xe_block \"xe_resolve_edram_xe_block\"\n               OpMemberName %xe_resolve_edram_xe_block 0 \"data\"\n               OpName %xe_resolve_edram \"xe_resolve_edram\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_resolve_dest_xe_block \"xe_resolve_dest_xe_block\"\n               OpMemberName %xe_resolve_dest_xe_block 0 \"data\"\n               OpName %xe_resolve_dest \"xe_resolve_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpDecorate %_runtimearr_uint ArrayStride 4\n               OpDecorate %xe_resolve_edram_xe_block BufferBlock\n               OpMemberDecorate %xe_resolve_edram_xe_block 0 NonWritable\n               OpMemberDecorate %xe_resolve_edram_xe_block 0 Offset 0\n               OpDecorate %xe_resolve_edram NonWritable\n               OpDecorate %xe_resolve_edram Binding 0\n               OpDecorate %xe_resolve_edram DescriptorSet 0\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v2uint ArrayStride 8\n               OpDecorate %xe_resolve_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_resolve_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_resolve_dest_xe_block 0 Offset 0\n               OpDecorate %xe_resolve_dest NonReadable\n               OpDecorate %xe_resolve_dest Binding 0\n               OpDecorate %xe_resolve_dest DescriptorSet 1\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n     %v3uint = OpTypeVector %uint 3\n     %v4uint = OpTypeVector %uint 4\n      %float = OpTypeFloat 32\n    %v2float = OpTypeVector %float 2\n    %v3float = OpTypeVector %float 3\n    %v4float = OpTypeVector %float 4\n       %bool = OpTypeBool\n      %v3int = OpTypeVector %int 3\n    %float_0 = OpConstant %float 0\n    %float_1 = OpConstant %float 1\n     %uint_1 = OpConstant %uint 1\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n   %float_31 = OpConstant %float 31\n       %2057 = OpConstantComposite %v4float %float_31 %float_31 %float_31 %float_1\n  %float_0_5 = OpConstant %float 0.5\n     %uint_0 = OpConstant %uint 0\n      %int_5 = OpConstant %int 5\n     %uint_2 = OpConstant %uint 2\n     %int_10 = OpConstant %int 10\n     %uint_3 = OpConstant %uint 3\n     %int_15 = OpConstant %int 15\n   %float_63 = OpConstant %float 63\n        %511 = OpConstantComposite %v3float %float_31 %float_63 %float_31\n     %int_11 = OpConstant %int 11\n        %958 = OpConstantComposite %v3float %float_31 %float_31 %float_63\n  %float_255 = OpConstant %float 255\n      %int_8 = OpConstant %int 8\n     %int_16 = OpConstant %int 16\n     %int_24 = OpConstant %int 24\n   %float_15 = OpConstant %float 15\n      %int_4 = OpConstant %int 4\n     %int_12 = OpConstant %int 12\n%float_65535 = OpConstant %float 65535\n    %uint_16 = OpConstant %uint 16\n    %uint_24 = OpConstant %uint 24\n        %653 = OpConstantComposite %v4uint %uint_0 %uint_8 %uint_16 %uint_24\n   %uint_255 = OpConstant %uint 255\n%float_0_00392156886 = OpConstant %float 0.00392156886\n    %uint_10 = OpConstant %uint 10\n    %uint_20 = OpConstant %uint 20\n    %uint_30 = OpConstant %uint 30\n        %845 = OpConstantComposite %v4uint %uint_0 %uint_10 %uint_20 %uint_30\n  %uint_1023 = OpConstant %uint 1023\n        %635 = OpConstantComposite %v4uint %uint_1023 %uint_1023 %uint_1023 %uint_3\n%float_0_000977517106 = OpConstant %float 0.000977517106\n%float_0_333333343 = OpConstant %float 0.333333343\n       %2798 = OpConstantComposite %v4float %float_0_000977517106 %float_0_000977517106 %float_0_000977517106 %float_0_333333343\n       %2996 = OpConstantComposite %v3uint %uint_0 %uint_10 %uint_20\n   %uint_127 = OpConstant %uint 127\n     %uint_7 = OpConstant %uint 7\n     %v3bool = OpTypeVector %bool 3\n   %uint_124 = OpConstant %uint 124\n    %uint_23 = OpConstant %uint 23\n   %float_n1 = OpConstant %float -1\n      %int_0 = OpConstant %int 0\n       %1959 = OpConstantComposite %v2int %int_16 %int_0\n%float_0_000976592302 = OpConstant %float 0.000976592302\n      %v4int = OpTypeVector %int 4\n        %290 = OpConstantComposite %v4int %int_16 %int_0 %int_16 %int_0\n       %1837 = OpConstantComposite %v2uint %uint_2 %uint_1\n     %v2bool = OpTypeVector %bool 2\n       %1807 = OpConstantComposite %v2uint %uint_0 %uint_0\n       %1828 = OpConstantComposite %v2uint %uint_1 %uint_1\n       %1816 = OpConstantComposite %v2uint %uint_1 %uint_0\n    %uint_80 = OpConstant %uint 80\n       %2719 = OpConstantComposite %v2uint %uint_80 %uint_16\n  %uint_2048 = OpConstant %uint 2048\n      %int_2 = OpConstant %int 2\n      %int_6 = OpConstant %int 6\n      %int_1 = OpConstant %int 1\n      %int_7 = OpConstant %int 7\n      %int_3 = OpConstant %int 3\n     %uint_5 = OpConstant %uint 5\n     %uint_4 = OpConstant %uint 4\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n    %uint_13 = OpConstant %uint 13\n  %uint_2047 = OpConstant %uint 2047\n    %uint_15 = OpConstant %uint 15\n    %uint_28 = OpConstant %uint 28\n    %uint_19 = OpConstant %uint 19\n       %2179 = OpConstantComposite %v2uint %uint_16 %uint_19\n%uint_536870912 = OpConstant %uint 536870912\n       %1855 = OpConstantComposite %v2uint %uint_0 %uint_4\n    %uint_63 = OpConstant %uint 63\n     %int_26 = OpConstant %int 26\n     %int_23 = OpConstant %int 23\n%uint_16777216 = OpConstant %uint 16777216\n       %2275 = OpConstantComposite %v2uint %uint_20 %uint_24\n%_runtimearr_uint = OpTypeRuntimeArray %uint\n%xe_resolve_edram_xe_block = OpTypeStruct %_runtimearr_uint\n%_ptr_Uniform_xe_resolve_edram_xe_block = OpTypePointer Uniform %xe_resolve_edram_xe_block\n%xe_resolve_edram = OpVariable %_ptr_Uniform_xe_resolve_edram_xe_block Uniform\n%_ptr_Uniform_uint = OpTypePointer Uniform %uint\n   %uint_320 = OpConstant %uint 320\n     %uint_6 = OpConstant %uint 6\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %1825 = OpConstantComposite %v2uint %uint_2 %uint_0\n%uint_4294901760 = OpConstant %uint 4294901760\n %uint_65535 = OpConstant %uint 65535\n%_runtimearr_v2uint = OpTypeRuntimeArray %v2uint\n%xe_resolve_dest_xe_block = OpTypeStruct %_runtimearr_v2uint\n%_ptr_Uniform_xe_resolve_dest_xe_block = OpTypePointer Uniform %xe_resolve_dest_xe_block\n%xe_resolve_dest = OpVariable %_ptr_Uniform_xe_resolve_dest_xe_block Uniform\n%_ptr_Uniform_v2uint = OpTypePointer Uniform %v2uint\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_8 %uint_8 %uint_1\n       %1954 = OpConstantComposite %v2uint %uint_7 %uint_7\n       %1955 = OpConstantComposite %v2uint %uint_15 %uint_1\n       %1870 = OpConstantComposite %v2uint %uint_3 %uint_3\n       %2122 = OpConstantComposite %v2uint %uint_15 %uint_15\n       %1284 = OpConstantComposite %v4float %float_n1 %float_n1 %float_n1 %float_n1\n        %770 = OpConstantComposite %v4int %int_16 %int_16 %int_16 %int_16\n       %1611 = OpConstantComposite %v4uint %uint_255 %uint_255 %uint_255 %uint_255\n        %261 = OpConstantComposite %v3uint %uint_1023 %uint_1023 %uint_1023\n       %1126 = OpConstantComposite %v3uint %uint_127 %uint_127 %uint_127\n       %2828 = OpConstantComposite %v3uint %uint_7 %uint_7 %uint_7\n       %2578 = OpConstantComposite %v3uint %uint_0 %uint_0 %uint_0\n       %1018 = OpConstantComposite %v3uint %uint_124 %uint_124 %uint_124\n        %393 = OpConstantComposite %v3uint %uint_23 %uint_23 %uint_23\n        %141 = OpConstantComposite %v3uint %uint_16 %uint_16 %uint_16\n         %73 = OpConstantComposite %v2float %float_n1 %float_n1\n       %2151 = OpConstantComposite %v2int %int_16 %int_16\n       %2938 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0\n       %1285 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1\n        %325 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_0_5\n       %2605 = OpConstantComposite %v3float %float_0 %float_0 %float_0\n       %2584 = OpConstantComposite %v3float %float_1 %float_1 %float_1\n        %939 = OpConstantComposite %v3float %float_0_5 %float_0_5 %float_0_5\n       %1867 = OpConstantComposite %v2uint %uint_4 %uint_2\n       %1978 = OpConstantComposite %v2uint %uint_15 %uint_3\n       %2326 = OpConstantComposite %v2uint %uint_16711935 %uint_16711935\n       %1975 = OpConstantComposite %v2uint %uint_8 %uint_8\n       %2888 = OpConstantComposite %v2uint %uint_4278255360 %uint_4278255360\n%int_1065353216 = OpConstant %int 1065353216\n%uint_4294967290 = OpConstant %uint 4294967290\n       %2360 = OpConstantComposite %v3uint %uint_4294967290 %uint_4294967290 %uint_4294967290\n %float_0_25 = OpConstant %float 0.25\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %22245 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %15627 = OpLoad %uint %22245\n      %22700 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %20824 = OpLoad %uint %22700\n      %20561 = OpBitwiseAnd %uint %15627 %uint_1023\n      %19978 = OpShiftRightLogical %uint %15627 %uint_10\n       %8574 = OpBitwiseAnd %uint %19978 %uint_3\n      %21002 = OpShiftRightLogical %uint %15627 %uint_13\n       %8575 = OpBitwiseAnd %uint %21002 %uint_2047\n      %21003 = OpShiftRightLogical %uint %15627 %uint_24\n       %8576 = OpBitwiseAnd %uint %21003 %uint_15\n      %18836 = OpShiftRightLogical %uint %15627 %uint_28\n       %9130 = OpBitwiseAnd %uint %18836 %uint_1\n       %8871 = OpCompositeConstruct %v2uint %20824 %20824\n       %9633 = OpShiftRightLogical %v2uint %8871 %2179\n      %23601 = OpBitwiseAnd %v2uint %9633 %1954\n      %24030 = OpBitwiseAnd %uint %15627 %uint_536870912\n      %12295 = OpINotEqual %bool %24030 %uint_0\n               OpSelectionMerge %14676 None\n               OpBranchConditional %12295 %16739 %21992\n      %21992 = OpLabel\n               OpBranch %14676\n      %16739 = OpLabel\n      %15278 = OpShiftRightLogical %v2uint %23601 %1828\n               OpBranch %14676\n      %14676 = OpLabel\n      %19124 = OpPhi %v2uint %15278 %16739 %1807 %21992\n       %7038 = OpShiftRightLogical %v2uint %8871 %1855\n      %11769 = OpBitwiseAnd %v2uint %7038 %1955\n      %16207 = OpShiftLeftLogical %v2uint %11769 %1870\n      %23019 = OpIMul %v2uint %16207 %23601\n      %13123 = OpShiftRightLogical %uint %20824 %uint_5\n      %14785 = OpBitwiseAnd %uint %13123 %uint_2047\n       %8858 = OpCompositeExtract %uint %23601 0\n      %22993 = OpIMul %uint %14785 %8858\n      %20036 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %18628 = OpLoad %uint %20036\n      %22701 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %20919 = OpLoad %uint %22701\n      %19164 = OpBitwiseAnd %uint %18628 %uint_7\n      %21999 = OpBitwiseAnd %uint %18628 %uint_8\n      %20495 = OpINotEqual %bool %21999 %uint_0\n      %10307 = OpShiftRightLogical %uint %18628 %uint_4\n      %24434 = OpBitwiseAnd %uint %10307 %uint_7\n      %19672 = OpShiftRightLogical %uint %18628 %uint_7\n      %20627 = OpBitwiseAnd %uint %19672 %uint_63\n      %22920 = OpBitcast %int %18628\n      %13711 = OpShiftLeftLogical %int %22920 %int_10\n      %20636 = OpShiftRightArithmetic %int %13711 %int_26\n      %18178 = OpShiftLeftLogical %int %20636 %int_23\n       %7462 = OpIAdd %int %18178 %int_1065353216\n      %11052 = OpBitcast %float %7462\n      %22649 = OpBitwiseAnd %uint %18628 %uint_16777216\n       %7475 = OpINotEqual %bool %22649 %uint_0\n       %8444 = OpBitwiseAnd %uint %20919 %uint_1023\n      %12176 = OpShiftRightLogical %uint %20919 %uint_10\n      %25038 = OpBitwiseAnd %uint %12176 %uint_1023\n      %25203 = OpShiftLeftLogical %uint %25038 %int_1\n      %10422 = OpCompositeConstruct %v2uint %20919 %20919\n      %10385 = OpShiftRightLogical %v2uint %10422 %2275\n      %23379 = OpBitwiseAnd %v2uint %10385 %2122\n      %16208 = OpShiftLeftLogical %v2uint %23379 %1870\n      %23020 = OpIMul %v2uint %16208 %23601\n      %12743 = OpShiftRightLogical %uint %20919 %uint_28\n      %17238 = OpBitwiseAnd %uint %12743 %uint_7\n      %12737 = OpLoad %v3uint %gl_GlobalInvocationID\n      %14500 = OpVectorShuffle %v2uint %12737 %12737 0 1\n      %12025 = OpShiftLeftLogical %v2uint %14500 %1825\n       %7640 = OpCompositeExtract %uint %12025 0\n      %11658 = OpShiftLeftLogical %uint %22993 %uint_3\n      %15379 = OpUGreaterThanEqual %bool %7640 %11658\n               OpSelectionMerge %14025 DontFlatten\n               OpBranchConditional %15379 %21993 %14025\n      %21993 = OpLabel\n               OpBranch %19578\n      %14025 = OpLabel\n      %18615 = OpCompositeExtract %uint %12025 1\n      %16803 = OpCompositeExtract %uint %19124 1\n      %24446 = OpExtInst %uint %1 UMax %18615 %16803\n      %20975 = OpCompositeConstruct %v2uint %7640 %24446\n      %21036 = OpIAdd %v2uint %20975 %23019\n      %16075 = OpULessThanEqual %bool %17238 %uint_3\n               OpSelectionMerge %23776 None\n               OpBranchConditional %16075 %10990 %15087\n      %15087 = OpLabel\n      %13566 = OpIEqual %bool %17238 %uint_5\n       %8438 = OpSelect %uint %13566 %uint_2 %uint_0\n               OpBranch %23776\n      %10990 = OpLabel\n               OpBranch %23776\n      %23776 = OpLabel\n      %19300 = OpPhi %uint %17238 %10990 %8438 %15087\n      %16830 = OpCompositeConstruct %v2uint %8574 %8574\n      %11801 = OpUGreaterThanEqual %v2bool %16830 %1837\n      %19381 = OpSelect %v2uint %11801 %1828 %1807\n      %10986 = OpShiftLeftLogical %v2uint %21036 %19381\n      %24669 = OpCompositeConstruct %v2uint %19300 %19300\n       %9093 = OpShiftRightLogical %v2uint %24669 %1816\n      %16072 = OpBitwiseAnd %v2uint %9093 %1828\n      %18106 = OpIAdd %v2uint %10986 %16072\n      %22936 = OpIMul %v2uint %2719 %23601\n      %11332 = OpCompositeConstruct %v2uint %9130 %uint_0\n       %6571 = OpShiftRightLogical %v2uint %22936 %11332\n      %10146 = OpUDiv %v2uint %18106 %6571\n      %20390 = OpCompositeExtract %uint %10146 1\n      %11046 = OpIMul %uint %20390 %20561\n      %24665 = OpCompositeExtract %uint %10146 0\n      %21536 = OpIAdd %uint %11046 %24665\n       %8742 = OpIAdd %uint %8575 %21536\n      %22376 = OpIMul %v2uint %10146 %6571\n      %20715 = OpISub %v2uint %18106 %22376\n       %7303 = OpCompositeExtract %uint %22936 0\n      %22882 = OpCompositeExtract %uint %22936 1\n      %13170 = OpIMul %uint %7303 %22882\n      %14551 = OpIMul %uint %8742 %13170\n       %6805 = OpCompositeExtract %uint %20715 1\n      %23526 = OpCompositeExtract %uint %6571 0\n      %22886 = OpIMul %uint %6805 %23526\n       %6886 = OpCompositeExtract %uint %20715 0\n       %9696 = OpIAdd %uint %22886 %6886\n      %18021 = OpShiftLeftLogical %uint %9696 %9130\n      %18363 = OpIAdd %uint %14551 %18021\n      %13922 = OpIMul %uint %13170 %uint_2048\n      %21520 = OpUMod %uint %18363 %13922\n       %7686 = OpShiftLeftLogical %uint %21520 %int_2\n      %13906 = OpUGreaterThanEqual %bool %8574 %uint_2\n      %11277 = OpSelect %uint %13906 %uint_1 %uint_0\n      %20074 = OpIAdd %uint %9130 %11277\n       %6555 = OpShiftLeftLogical %uint %uint_4 %20074\n      %23279 = OpINotEqual %bool %9130 %uint_0\n               OpSelectionMerge %21263 DontFlatten\n               OpBranchConditional %23279 %15205 %16569\n      %16569 = OpLabel\n      %19162 = OpIEqual %bool %6555 %uint_4\n               OpSelectionMerge %20297 DontFlatten\n               OpBranchConditional %19162 %6591 %8959\n       %8959 = OpLabel\n      %22064 = OpShiftRightLogical %uint %7686 %int_2\n      %13369 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22064\n      %15060 = OpLoad %uint %13369\n       %8517 = OpIAdd %uint %7686 %6555\n      %21670 = OpShiftRightLogical %uint %8517 %int_2\n      %19677 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21670\n      %13114 = OpLoad %uint %19677\n       %8685 = OpIMul %uint %uint_2 %6555\n      %24254 = OpIAdd %uint %7686 %8685\n      %17890 = OpShiftRightLogical %uint %24254 %int_2\n      %19678 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17890\n      %13115 = OpLoad %uint %19678\n       %8686 = OpIMul %uint %uint_3 %6555\n      %24255 = OpIAdd %uint %7686 %8686\n      %17891 = OpShiftRightLogical %uint %24255 %int_2\n      %18689 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17891\n      %24409 = OpLoad %uint %18689\n      %20780 = OpCompositeConstruct %v4uint %15060 %13114 %13115 %24409\n               OpBranch %20297\n       %6591 = OpLabel\n      %24486 = OpShiftRightLogical %uint %7686 %int_2\n      %13370 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24486\n      %12609 = OpLoad %uint %13370\n      %11687 = OpIAdd %uint %24486 %uint_1\n       %6399 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11687\n      %23650 = OpLoad %uint %6399\n      %11688 = OpIAdd %uint %24486 %uint_2\n       %6400 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11688\n      %23651 = OpLoad %uint %6400\n      %11689 = OpIAdd %uint %24486 %uint_3\n      %24558 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11689\n      %16379 = OpLoad %uint %24558\n      %20781 = OpCompositeConstruct %v4uint %12609 %23650 %23651 %16379\n               OpBranch %20297\n      %20297 = OpLabel\n      %10943 = OpPhi %v4uint %20781 %6591 %20780 %8959\n               OpSelectionMerge %16224 None\n               OpSwitch %8576 %19451 0 %14585 1 %14585 2 %7355 10 %7355 3 %7354 12 %7354 4 %8190 6 %8243\n       %8243 = OpLabel\n      %24406 = OpCompositeExtract %uint %10943 0\n      %24679 = OpExtInst %v2float %1 UnpackHalf2x16 %24406\n      %10082 = OpCompositeExtract %float %24679 0\n      %17478 = OpCompositeExtract %float %24679 1\n      %14604 = OpCompositeConstruct %v4float %10082 %17478 %float_0 %float_0\n      %17274 = OpCompositeExtract %uint %10943 1\n      %18027 = OpExtInst %v2float %1 UnpackHalf2x16 %17274\n      %10083 = OpCompositeExtract %float %18027 0\n      %17479 = OpCompositeExtract %float %18027 1\n      %14605 = OpCompositeConstruct %v4float %10083 %17479 %float_0 %float_0\n      %17275 = OpCompositeExtract %uint %10943 2\n      %18028 = OpExtInst %v2float %1 UnpackHalf2x16 %17275\n      %10084 = OpCompositeExtract %float %18028 0\n      %17480 = OpCompositeExtract %float %18028 1\n      %14606 = OpCompositeConstruct %v4float %10084 %17480 %float_0 %float_0\n      %17276 = OpCompositeExtract %uint %10943 3\n      %18029 = OpExtInst %v2float %1 UnpackHalf2x16 %17276\n      %10085 = OpCompositeExtract %float %18029 0\n      %20670 = OpCompositeExtract %float %18029 1\n       %9033 = OpCompositeConstruct %v4float %10085 %20670 %float_0 %float_0\n               OpBranch %16224\n       %8190 = OpLabel\n      %12427 = OpCompositeExtract %uint %10943 0\n      %22685 = OpBitcast %int %12427\n      %18202 = OpCompositeConstruct %v2int %22685 %22685\n      %18349 = OpShiftLeftLogical %v2int %18202 %1959\n      %13335 = OpShiftRightArithmetic %v2int %18349 %2151\n      %10903 = OpConvertSToF %v2float %13335\n      %18247 = OpVectorTimesScalar %v2float %10903 %float_0_000976592302\n      %24070 = OpExtInst %v2float %1 FMax %73 %18247\n      %24330 = OpCompositeExtract %float %24070 0\n      %15572 = OpCompositeExtract %float %24070 1\n      %16670 = OpCompositeConstruct %v4float %24330 %15572 %float_0 %float_0\n      %19522 = OpCompositeExtract %uint %10943 1\n      %16033 = OpBitcast %int %19522\n      %18203 = OpCompositeConstruct %v2int %16033 %16033\n      %18350 = OpShiftLeftLogical %v2int %18203 %1959\n      %13336 = OpShiftRightArithmetic %v2int %18350 %2151\n      %10904 = OpConvertSToF %v2float %13336\n      %18248 = OpVectorTimesScalar %v2float %10904 %float_0_000976592302\n      %24071 = OpExtInst %v2float %1 FMax %73 %18248\n      %24331 = OpCompositeExtract %float %24071 0\n      %15573 = OpCompositeExtract %float %24071 1\n      %16671 = OpCompositeConstruct %v4float %24331 %15573 %float_0 %float_0\n      %19523 = OpCompositeExtract %uint %10943 2\n      %16034 = OpBitcast %int %19523\n      %18204 = OpCompositeConstruct %v2int %16034 %16034\n      %18351 = OpShiftLeftLogical %v2int %18204 %1959\n      %13337 = OpShiftRightArithmetic %v2int %18351 %2151\n      %10905 = OpConvertSToF %v2float %13337\n      %18249 = OpVectorTimesScalar %v2float %10905 %float_0_000976592302\n      %24072 = OpExtInst %v2float %1 FMax %73 %18249\n      %24332 = OpCompositeExtract %float %24072 0\n      %15574 = OpCompositeExtract %float %24072 1\n      %16672 = OpCompositeConstruct %v4float %24332 %15574 %float_0 %float_0\n      %19524 = OpCompositeExtract %uint %10943 3\n      %16035 = OpBitcast %int %19524\n      %18205 = OpCompositeConstruct %v2int %16035 %16035\n      %18352 = OpShiftLeftLogical %v2int %18205 %1959\n      %13338 = OpShiftRightArithmetic %v2int %18352 %2151\n      %10906 = OpConvertSToF %v2float %13338\n      %18250 = OpVectorTimesScalar %v2float %10906 %float_0_000976592302\n      %24073 = OpExtInst %v2float %1 FMax %73 %18250\n      %24333 = OpCompositeExtract %float %24073 0\n      %18764 = OpCompositeExtract %float %24073 1\n       %9034 = OpCompositeConstruct %v4float %24333 %18764 %float_0 %float_0\n               OpBranch %16224\n       %7354 = OpLabel\n      %22205 = OpCompositeExtract %uint %10943 0\n      %20234 = OpCompositeConstruct %v3uint %22205 %22205 %22205\n      %11021 = OpShiftRightLogical %v3uint %20234 %2996\n      %24038 = OpBitwiseAnd %v3uint %11021 %261\n      %18588 = OpBitwiseAnd %v3uint %11021 %1126\n      %23440 = OpShiftRightLogical %v3uint %24038 %2828\n      %16585 = OpIEqual %v3bool %23440 %2578\n      %11339 = OpExtInst %v3int %1 FindUMsb %18588\n      %10773 = OpBitcast %v3uint %11339\n       %6266 = OpISub %v3uint %2828 %10773\n       %8720 = OpIAdd %v3uint %10773 %2360\n      %10351 = OpSelect %v3uint %16585 %8720 %23440\n      %23252 = OpShiftLeftLogical %v3uint %18588 %6266\n      %18842 = OpBitwiseAnd %v3uint %23252 %1126\n      %10909 = OpSelect %v3uint %16585 %18842 %18588\n      %24569 = OpIAdd %v3uint %10351 %1018\n      %20351 = OpShiftLeftLogical %v3uint %24569 %393\n      %16294 = OpShiftLeftLogical %v3uint %10909 %141\n      %22396 = OpBitwiseOr %v3uint %20351 %16294\n      %13824 = OpIEqual %v3bool %24038 %2578\n      %16962 = OpSelect %v3uint %13824 %2578 %22396\n      %10703 = OpBitcast %v3float %16962\n      %19364 = OpShiftRightLogical %uint %22205 %uint_30\n      %18446 = OpConvertUToF %float %19364\n      %15903 = OpFMul %float %18446 %float_0_333333343\n      %21442 = OpCompositeExtract %float %10703 0\n      %10837 = OpCompositeExtract %float %10703 1\n       %7833 = OpCompositeExtract %float %10703 2\n      %15834 = OpCompositeConstruct %v4float %21442 %10837 %7833 %15903\n      %10229 = OpCompositeExtract %uint %10943 1\n      %13582 = OpCompositeConstruct %v3uint %10229 %10229 %10229\n      %11022 = OpShiftRightLogical %v3uint %13582 %2996\n      %24039 = OpBitwiseAnd %v3uint %11022 %261\n      %18589 = OpBitwiseAnd %v3uint %11022 %1126\n      %23441 = OpShiftRightLogical %v3uint %24039 %2828\n      %16586 = OpIEqual %v3bool %23441 %2578\n      %11340 = OpExtInst %v3int %1 FindUMsb %18589\n      %10774 = OpBitcast %v3uint %11340\n       %6267 = OpISub %v3uint %2828 %10774\n       %8721 = OpIAdd %v3uint %10774 %2360\n      %10352 = OpSelect %v3uint %16586 %8721 %23441\n      %23253 = OpShiftLeftLogical %v3uint %18589 %6267\n      %18843 = OpBitwiseAnd %v3uint %23253 %1126\n      %10910 = OpSelect %v3uint %16586 %18843 %18589\n      %24570 = OpIAdd %v3uint %10352 %1018\n      %20352 = OpShiftLeftLogical %v3uint %24570 %393\n      %16295 = OpShiftLeftLogical %v3uint %10910 %141\n      %22397 = OpBitwiseOr %v3uint %20352 %16295\n      %13825 = OpIEqual %v3bool %24039 %2578\n      %16963 = OpSelect %v3uint %13825 %2578 %22397\n      %10704 = OpBitcast %v3float %16963\n      %19365 = OpShiftRightLogical %uint %10229 %uint_30\n      %18447 = OpConvertUToF %float %19365\n      %15904 = OpFMul %float %18447 %float_0_333333343\n      %21443 = OpCompositeExtract %float %10704 0\n      %10838 = OpCompositeExtract %float %10704 1\n       %7834 = OpCompositeExtract %float %10704 2\n      %15835 = OpCompositeConstruct %v4float %21443 %10838 %7834 %15904\n      %10230 = OpCompositeExtract %uint %10943 2\n      %13583 = OpCompositeConstruct %v3uint %10230 %10230 %10230\n      %11023 = OpShiftRightLogical %v3uint %13583 %2996\n      %24040 = OpBitwiseAnd %v3uint %11023 %261\n      %18590 = OpBitwiseAnd %v3uint %11023 %1126\n      %23442 = OpShiftRightLogical %v3uint %24040 %2828\n      %16587 = OpIEqual %v3bool %23442 %2578\n      %11341 = OpExtInst %v3int %1 FindUMsb %18590\n      %10775 = OpBitcast %v3uint %11341\n       %6268 = OpISub %v3uint %2828 %10775\n       %8722 = OpIAdd %v3uint %10775 %2360\n      %10353 = OpSelect %v3uint %16587 %8722 %23442\n      %23254 = OpShiftLeftLogical %v3uint %18590 %6268\n      %18844 = OpBitwiseAnd %v3uint %23254 %1126\n      %10911 = OpSelect %v3uint %16587 %18844 %18590\n      %24571 = OpIAdd %v3uint %10353 %1018\n      %20353 = OpShiftLeftLogical %v3uint %24571 %393\n      %16296 = OpShiftLeftLogical %v3uint %10911 %141\n      %22398 = OpBitwiseOr %v3uint %20353 %16296\n      %13826 = OpIEqual %v3bool %24040 %2578\n      %16964 = OpSelect %v3uint %13826 %2578 %22398\n      %10705 = OpBitcast %v3float %16964\n      %19366 = OpShiftRightLogical %uint %10230 %uint_30\n      %18448 = OpConvertUToF %float %19366\n      %15905 = OpFMul %float %18448 %float_0_333333343\n      %21444 = OpCompositeExtract %float %10705 0\n      %10839 = OpCompositeExtract %float %10705 1\n       %7835 = OpCompositeExtract %float %10705 2\n      %15836 = OpCompositeConstruct %v4float %21444 %10839 %7835 %15905\n      %10231 = OpCompositeExtract %uint %10943 3\n      %13584 = OpCompositeConstruct %v3uint %10231 %10231 %10231\n      %11024 = OpShiftRightLogical %v3uint %13584 %2996\n      %24041 = OpBitwiseAnd %v3uint %11024 %261\n      %18591 = OpBitwiseAnd %v3uint %11024 %1126\n      %23443 = OpShiftRightLogical %v3uint %24041 %2828\n      %16588 = OpIEqual %v3bool %23443 %2578\n      %11342 = OpExtInst %v3int %1 FindUMsb %18591\n      %10776 = OpBitcast %v3uint %11342\n       %6269 = OpISub %v3uint %2828 %10776\n       %8723 = OpIAdd %v3uint %10776 %2360\n      %10354 = OpSelect %v3uint %16588 %8723 %23443\n      %23255 = OpShiftLeftLogical %v3uint %18591 %6269\n      %18845 = OpBitwiseAnd %v3uint %23255 %1126\n      %10912 = OpSelect %v3uint %16588 %18845 %18591\n      %24572 = OpIAdd %v3uint %10354 %1018\n      %20354 = OpShiftLeftLogical %v3uint %24572 %393\n      %16297 = OpShiftLeftLogical %v3uint %10912 %141\n      %22399 = OpBitwiseOr %v3uint %20354 %16297\n      %13827 = OpIEqual %v3bool %24041 %2578\n      %16965 = OpSelect %v3uint %13827 %2578 %22399\n      %10706 = OpBitcast %v3float %16965\n      %19367 = OpShiftRightLogical %uint %10231 %uint_30\n      %18449 = OpConvertUToF %float %19367\n      %15906 = OpFMul %float %18449 %float_0_333333343\n      %21445 = OpCompositeExtract %float %10706 0\n      %10840 = OpCompositeExtract %float %10706 1\n      %11025 = OpCompositeExtract %float %10706 2\n       %9035 = OpCompositeConstruct %v4float %21445 %10840 %11025 %15906\n               OpBranch %16224\n       %7355 = OpLabel\n      %22206 = OpCompositeExtract %uint %10943 0\n      %20235 = OpCompositeConstruct %v4uint %22206 %22206 %22206 %22206\n       %9368 = OpShiftRightLogical %v4uint %20235 %845\n      %18859 = OpBitwiseAnd %v4uint %9368 %635\n      %15543 = OpConvertUToF %v4float %18859\n      %16688 = OpFMul %v4float %15543 %2798\n      %23762 = OpCompositeExtract %uint %10943 1\n      %20813 = OpCompositeConstruct %v4uint %23762 %23762 %23762 %23762\n       %9369 = OpShiftRightLogical %v4uint %20813 %845\n      %18860 = OpBitwiseAnd %v4uint %9369 %635\n      %15544 = OpConvertUToF %v4float %18860\n      %16689 = OpFMul %v4float %15544 %2798\n      %23763 = OpCompositeExtract %uint %10943 2\n      %20814 = OpCompositeConstruct %v4uint %23763 %23763 %23763 %23763\n       %9370 = OpShiftRightLogical %v4uint %20814 %845\n      %18861 = OpBitwiseAnd %v4uint %9370 %635\n      %15545 = OpConvertUToF %v4float %18861\n      %16690 = OpFMul %v4float %15545 %2798\n      %23764 = OpCompositeExtract %uint %10943 3\n      %20815 = OpCompositeConstruct %v4uint %23764 %23764 %23764 %23764\n       %9371 = OpShiftRightLogical %v4uint %20815 %845\n      %18862 = OpBitwiseAnd %v4uint %9371 %635\n      %18735 = OpConvertUToF %v4float %18862\n       %9887 = OpFMul %v4float %18735 %2798\n               OpBranch %16224\n      %14585 = OpLabel\n      %22207 = OpCompositeExtract %uint %10943 0\n      %20236 = OpCompositeConstruct %v4uint %22207 %22207 %22207 %22207\n       %9372 = OpShiftRightLogical %v4uint %20236 %653\n      %19030 = OpBitwiseAnd %v4uint %9372 %1611\n      %13986 = OpConvertUToF %v4float %19030\n      %19235 = OpVectorTimesScalar %v4float %13986 %float_0_00392156886\n       %8607 = OpCompositeExtract %uint %10943 1\n      %24843 = OpCompositeConstruct %v4uint %8607 %8607 %8607 %8607\n       %9373 = OpShiftRightLogical %v4uint %24843 %653\n      %19031 = OpBitwiseAnd %v4uint %9373 %1611\n      %13987 = OpConvertUToF %v4float %19031\n      %19236 = OpVectorTimesScalar %v4float %13987 %float_0_00392156886\n       %8608 = OpCompositeExtract %uint %10943 2\n      %24844 = OpCompositeConstruct %v4uint %8608 %8608 %8608 %8608\n       %9374 = OpShiftRightLogical %v4uint %24844 %653\n      %19032 = OpBitwiseAnd %v4uint %9374 %1611\n      %13988 = OpConvertUToF %v4float %19032\n      %19237 = OpVectorTimesScalar %v4float %13988 %float_0_00392156886\n       %8609 = OpCompositeExtract %uint %10943 3\n      %24845 = OpCompositeConstruct %v4uint %8609 %8609 %8609 %8609\n       %9375 = OpShiftRightLogical %v4uint %24845 %653\n      %19033 = OpBitwiseAnd %v4uint %9375 %1611\n      %17178 = OpConvertUToF %v4float %19033\n      %12434 = OpVectorTimesScalar %v4float %17178 %float_0_00392156886\n               OpBranch %16224\n      %19451 = OpLabel\n      %12428 = OpCompositeExtract %uint %10943 0\n      %20462 = OpBitcast %float %12428\n      %17206 = OpCompositeConstruct %v2float %20462 %float_0\n      %11664 = OpVectorShuffle %v4float %17206 %17206 0 1 1 1\n      %22193 = OpCompositeExtract %uint %10943 1\n      %16232 = OpBitcast %float %22193\n      %17207 = OpCompositeConstruct %v2float %16232 %float_0\n      %11665 = OpVectorShuffle %v4float %17207 %17207 0 1 1 1\n      %22194 = OpCompositeExtract %uint %10943 2\n      %16233 = OpBitcast %float %22194\n      %17208 = OpCompositeConstruct %v2float %16233 %float_0\n      %11666 = OpVectorShuffle %v4float %17208 %17208 0 1 1 1\n      %22195 = OpCompositeExtract %uint %10943 3\n      %16234 = OpBitcast %float %22195\n      %20398 = OpCompositeConstruct %v2float %16234 %float_0\n      %23098 = OpVectorShuffle %v4float %20398 %20398 0 1 1 1\n               OpBranch %16224\n      %16224 = OpLabel\n      %11175 = OpPhi %v4float %23098 %19451 %12434 %14585 %9887 %7355 %9035 %7354 %9034 %8190 %9033 %8243\n      %14344 = OpPhi %v4float %11666 %19451 %19237 %14585 %16690 %7355 %15836 %7354 %16672 %8190 %14606 %8243\n      %15229 = OpPhi %v4float %11665 %19451 %19236 %14585 %16689 %7355 %15835 %7354 %16671 %8190 %14605 %8243\n      %14518 = OpPhi %v4float %11664 %19451 %19235 %14585 %16688 %7355 %15834 %7354 %16670 %8190 %14604 %8243\n               OpBranch %21263\n      %15205 = OpLabel\n      %21584 = OpIEqual %bool %6555 %uint_8\n               OpSelectionMerge %20259 DontFlatten\n               OpBranchConditional %21584 %6592 %8960\n       %8960 = OpLabel\n      %22065 = OpShiftRightLogical %uint %7686 %int_2\n      %13371 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22065\n      %12610 = OpLoad %uint %13371\n      %11690 = OpIAdd %uint %22065 %uint_1\n       %6401 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11690\n       %7030 = OpLoad %uint %6401\n       %8518 = OpIAdd %uint %7686 %6555\n      %21671 = OpShiftRightLogical %uint %8518 %int_2\n      %19601 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21671\n      %12611 = OpLoad %uint %19601\n      %11691 = OpIAdd %uint %21671 %uint_1\n      %24559 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11691\n      %14156 = OpLoad %uint %24559\n      %19670 = OpCompositeConstruct %v4uint %12610 %7030 %12611 %14156\n      %19499 = OpIMul %uint %uint_2 %6555\n      %10821 = OpIAdd %uint %7686 %19499\n      %17892 = OpShiftRightLogical %uint %10821 %int_2\n      %19602 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17892\n      %12612 = OpLoad %uint %19602\n      %11692 = OpIAdd %uint %17892 %uint_1\n       %6475 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11692\n      %24155 = OpLoad %uint %6475\n       %8687 = OpIMul %uint %uint_3 %6555\n      %24256 = OpIAdd %uint %7686 %8687\n      %17893 = OpShiftRightLogical %uint %24256 %int_2\n      %19603 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17893\n      %12613 = OpLoad %uint %19603\n      %11693 = OpIAdd %uint %17893 %uint_1\n      %24560 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11693\n      %16380 = OpLoad %uint %24560\n      %20782 = OpCompositeConstruct %v4uint %12612 %24155 %12613 %16380\n               OpBranch %20259\n       %6592 = OpLabel\n      %24487 = OpShiftRightLogical %uint %7686 %int_2\n      %13372 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24487\n      %12614 = OpLoad %uint %13372\n      %11694 = OpIAdd %uint %24487 %uint_1\n       %6402 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11694\n      %23652 = OpLoad %uint %6402\n      %11695 = OpIAdd %uint %24487 %uint_2\n       %6403 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11695\n      %23653 = OpLoad %uint %6403\n      %11696 = OpIAdd %uint %24487 %uint_3\n      %24561 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11696\n      %14080 = OpLoad %uint %24561\n      %21616 = OpCompositeConstruct %v4uint %12614 %23652 %23653 %14080\n      %19331 = OpIAdd %uint %7686 %uint_16\n       %8237 = OpShiftRightLogical %uint %19331 %int_2\n      %19604 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %8237\n      %12615 = OpLoad %uint %19604\n      %11697 = OpIAdd %uint %8237 %uint_1\n       %6404 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11697\n      %23654 = OpLoad %uint %6404\n      %11698 = OpIAdd %uint %8237 %uint_2\n       %6405 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11698\n      %23655 = OpLoad %uint %6405\n      %11699 = OpIAdd %uint %8237 %uint_3\n      %24562 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11699\n      %16381 = OpLoad %uint %24562\n      %20783 = OpCompositeConstruct %v4uint %12615 %23654 %23655 %16381\n               OpBranch %20259\n      %20259 = OpLabel\n      %11213 = OpPhi %v4uint %20783 %6592 %20782 %8960\n      %14112 = OpPhi %v4uint %21616 %6592 %19670 %8960\n               OpSelectionMerge %20260 None\n               OpSwitch %8576 %20310 5 %8536 7 %8244\n       %8244 = OpLabel\n      %24407 = OpCompositeExtract %uint %14112 0\n      %24680 = OpExtInst %v2float %1 UnpackHalf2x16 %24407\n      %10101 = OpCompositeExtract %float %24680 0\n      %16056 = OpCompositeExtract %float %24680 1\n      %17025 = OpCompositeExtract %uint %14112 1\n      %15605 = OpExtInst %v2float %1 UnpackHalf2x16 %17025\n      %10086 = OpCompositeExtract %float %15605 0\n      %17481 = OpCompositeExtract %float %15605 1\n      %14607 = OpCompositeConstruct %v4float %10101 %16056 %10086 %17481\n      %17277 = OpCompositeExtract %uint %14112 2\n      %18030 = OpExtInst %v2float %1 UnpackHalf2x16 %17277\n      %10102 = OpCompositeExtract %float %18030 0\n      %16057 = OpCompositeExtract %float %18030 1\n      %17026 = OpCompositeExtract %uint %14112 3\n      %15606 = OpExtInst %v2float %1 UnpackHalf2x16 %17026\n      %10087 = OpCompositeExtract %float %15606 0\n      %17482 = OpCompositeExtract %float %15606 1\n      %14608 = OpCompositeConstruct %v4float %10102 %16057 %10087 %17482\n      %17278 = OpCompositeExtract %uint %11213 0\n      %18031 = OpExtInst %v2float %1 UnpackHalf2x16 %17278\n      %10103 = OpCompositeExtract %float %18031 0\n      %16058 = OpCompositeExtract %float %18031 1\n      %17027 = OpCompositeExtract %uint %11213 1\n      %15607 = OpExtInst %v2float %1 UnpackHalf2x16 %17027\n      %10088 = OpCompositeExtract %float %15607 0\n      %17483 = OpCompositeExtract %float %15607 1\n      %14609 = OpCompositeConstruct %v4float %10103 %16058 %10088 %17483\n      %17279 = OpCompositeExtract %uint %11213 2\n      %18032 = OpExtInst %v2float %1 UnpackHalf2x16 %17279\n      %10104 = OpCompositeExtract %float %18032 0\n      %16059 = OpCompositeExtract %float %18032 1\n      %17028 = OpCompositeExtract %uint %11213 3\n      %15608 = OpExtInst %v2float %1 UnpackHalf2x16 %17028\n      %10089 = OpCompositeExtract %float %15608 0\n      %20671 = OpCompositeExtract %float %15608 1\n       %9036 = OpCompositeConstruct %v4float %10104 %16059 %10089 %20671\n               OpBranch %20260\n       %8536 = OpLabel\n       %9723 = OpVectorShuffle %v2uint %14112 %14112 0 1\n      %23356 = OpBitcast %v2int %9723\n      %24782 = OpVectorShuffle %v4int %23356 %23356 0 0 1 1\n      %18598 = OpShiftLeftLogical %v4int %24782 %290\n      %15757 = OpShiftRightArithmetic %v4int %18598 %770\n      %10907 = OpConvertSToF %v4float %15757\n      %18209 = OpVectorTimesScalar %v4float %10907 %float_0_000976592302\n      %25233 = OpExtInst %v4float %1 FMax %1284 %18209\n      %14187 = OpVectorShuffle %v2uint %14112 %14112 2 3\n       %9407 = OpBitcast %v2int %14187\n      %24783 = OpVectorShuffle %v4int %9407 %9407 0 0 1 1\n      %18599 = OpShiftLeftLogical %v4int %24783 %290\n      %15758 = OpShiftRightArithmetic %v4int %18599 %770\n      %10908 = OpConvertSToF %v4float %15758\n      %18210 = OpVectorTimesScalar %v4float %10908 %float_0_000976592302\n      %25234 = OpExtInst %v4float %1 FMax %1284 %18210\n      %14188 = OpVectorShuffle %v2uint %11213 %11213 0 1\n       %9408 = OpBitcast %v2int %14188\n      %24784 = OpVectorShuffle %v4int %9408 %9408 0 0 1 1\n      %18600 = OpShiftLeftLogical %v4int %24784 %290\n      %15759 = OpShiftRightArithmetic %v4int %18600 %770\n      %10913 = OpConvertSToF %v4float %15759\n      %18211 = OpVectorTimesScalar %v4float %10913 %float_0_000976592302\n      %25235 = OpExtInst %v4float %1 FMax %1284 %18211\n      %14189 = OpVectorShuffle %v2uint %11213 %11213 2 3\n       %9409 = OpBitcast %v2int %14189\n      %24785 = OpVectorShuffle %v4int %9409 %9409 0 0 1 1\n      %18601 = OpShiftLeftLogical %v4int %24785 %290\n      %15760 = OpShiftRightArithmetic %v4int %18601 %770\n      %10914 = OpConvertSToF %v4float %15760\n      %21439 = OpVectorTimesScalar %v4float %10914 %float_0_000976592302\n      %17250 = OpExtInst %v4float %1 FMax %1284 %21439\n               OpBranch %20260\n      %20310 = OpLabel\n       %9761 = OpVectorShuffle %v2uint %14112 %14112 0 1\n      %20825 = OpBitcast %v2float %9761\n       %7035 = OpCompositeExtract %float %20825 0\n      %13418 = OpCompositeExtract %float %20825 1\n      %17016 = OpCompositeConstruct %v4float %7035 %13418 %float_0 %float_0\n      %16856 = OpVectorShuffle %v2uint %14112 %14112 2 3\n      %14173 = OpBitcast %v2float %16856\n       %7036 = OpCompositeExtract %float %14173 0\n      %13419 = OpCompositeExtract %float %14173 1\n      %17017 = OpCompositeConstruct %v4float %7036 %13419 %float_0 %float_0\n      %16857 = OpVectorShuffle %v2uint %11213 %11213 0 1\n      %14174 = OpBitcast %v2float %16857\n       %7037 = OpCompositeExtract %float %14174 0\n      %13420 = OpCompositeExtract %float %14174 1\n      %17018 = OpCompositeConstruct %v4float %7037 %13420 %float_0 %float_0\n      %16858 = OpVectorShuffle %v2uint %11213 %11213 2 3\n      %14175 = OpBitcast %v2float %16858\n       %7039 = OpCompositeExtract %float %14175 0\n      %16648 = OpCompositeExtract %float %14175 1\n       %9037 = OpCompositeConstruct %v4float %7039 %16648 %float_0 %float_0\n               OpBranch %20260\n      %20260 = OpLabel\n      %11176 = OpPhi %v4float %9037 %20310 %17250 %8536 %9036 %8244\n      %14345 = OpPhi %v4float %17018 %20310 %25235 %8536 %14609 %8244\n      %15230 = OpPhi %v4float %17017 %20310 %25234 %8536 %14608 %8244\n      %14519 = OpPhi %v4float %17016 %20310 %25233 %8536 %14607 %8244\n               OpBranch %21263\n      %21263 = OpLabel\n      %11177 = OpPhi %v4float %11176 %20260 %11175 %16224\n      %14346 = OpPhi %v4float %14345 %20260 %14344 %16224\n      %13804 = OpPhi %v4float %15230 %20260 %15229 %16224\n       %8403 = OpPhi %v4float %14519 %20260 %14518 %16224\n      %11861 = OpUGreaterThanEqual %bool %17238 %uint_4\n               OpSelectionMerge %21267 DontFlatten\n               OpBranchConditional %11861 %20977 %21267\n      %20977 = OpLabel\n      %11079 = OpIMul %uint %uint_320 %8858\n      %23069 = OpFMul %float %11052 %float_0_5\n       %8114 = OpIAdd %uint %7686 %11079\n               OpSelectionMerge %21264 DontFlatten\n               OpBranchConditional %23279 %15206 %16570\n      %16570 = OpLabel\n      %19163 = OpIEqual %bool %6555 %uint_4\n               OpSelectionMerge %20298 DontFlatten\n               OpBranchConditional %19163 %6593 %8961\n       %8961 = OpLabel\n      %22066 = OpShiftRightLogical %uint %8114 %int_2\n      %13373 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22066\n      %15061 = OpLoad %uint %13373\n       %8519 = OpIAdd %uint %8114 %6555\n      %21672 = OpShiftRightLogical %uint %8519 %int_2\n      %19679 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21672\n      %13116 = OpLoad %uint %19679\n       %8688 = OpIMul %uint %uint_2 %6555\n      %24257 = OpIAdd %uint %8114 %8688\n      %17894 = OpShiftRightLogical %uint %24257 %int_2\n      %19680 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17894\n      %13117 = OpLoad %uint %19680\n       %8689 = OpIMul %uint %uint_3 %6555\n      %24258 = OpIAdd %uint %8114 %8689\n      %17895 = OpShiftRightLogical %uint %24258 %int_2\n      %18690 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17895\n      %24410 = OpLoad %uint %18690\n      %20784 = OpCompositeConstruct %v4uint %15061 %13116 %13117 %24410\n               OpBranch %20298\n       %6593 = OpLabel\n      %24488 = OpShiftRightLogical %uint %8114 %int_2\n      %13374 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24488\n      %12616 = OpLoad %uint %13374\n      %11700 = OpIAdd %uint %24488 %uint_1\n       %6406 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11700\n      %23656 = OpLoad %uint %6406\n      %11701 = OpIAdd %uint %24488 %uint_2\n       %6407 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11701\n      %23657 = OpLoad %uint %6407\n      %11702 = OpIAdd %uint %24488 %uint_3\n      %24563 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11702\n      %16382 = OpLoad %uint %24563\n      %20785 = OpCompositeConstruct %v4uint %12616 %23656 %23657 %16382\n               OpBranch %20298\n      %20298 = OpLabel\n      %10944 = OpPhi %v4uint %20785 %6593 %20784 %8961\n               OpSelectionMerge %16225 None\n               OpSwitch %8576 %19452 0 %14586 1 %14586 2 %7357 10 %7357 3 %7356 12 %7356 4 %8191 6 %8245\n       %8245 = OpLabel\n      %24408 = OpCompositeExtract %uint %10944 0\n      %24681 = OpExtInst %v2float %1 UnpackHalf2x16 %24408\n      %10090 = OpCompositeExtract %float %24681 0\n      %17484 = OpCompositeExtract %float %24681 1\n      %14610 = OpCompositeConstruct %v4float %10090 %17484 %float_0 %float_0\n      %17280 = OpCompositeExtract %uint %10944 1\n      %18033 = OpExtInst %v2float %1 UnpackHalf2x16 %17280\n      %10091 = OpCompositeExtract %float %18033 0\n      %17485 = OpCompositeExtract %float %18033 1\n      %14611 = OpCompositeConstruct %v4float %10091 %17485 %float_0 %float_0\n      %17281 = OpCompositeExtract %uint %10944 2\n      %18034 = OpExtInst %v2float %1 UnpackHalf2x16 %17281\n      %10092 = OpCompositeExtract %float %18034 0\n      %17486 = OpCompositeExtract %float %18034 1\n      %14612 = OpCompositeConstruct %v4float %10092 %17486 %float_0 %float_0\n      %17282 = OpCompositeExtract %uint %10944 3\n      %18035 = OpExtInst %v2float %1 UnpackHalf2x16 %17282\n      %10093 = OpCompositeExtract %float %18035 0\n      %20672 = OpCompositeExtract %float %18035 1\n       %9038 = OpCompositeConstruct %v4float %10093 %20672 %float_0 %float_0\n               OpBranch %16225\n       %8191 = OpLabel\n      %12429 = OpCompositeExtract %uint %10944 0\n      %22686 = OpBitcast %int %12429\n      %18206 = OpCompositeConstruct %v2int %22686 %22686\n      %18353 = OpShiftLeftLogical %v2int %18206 %1959\n      %13339 = OpShiftRightArithmetic %v2int %18353 %2151\n      %10915 = OpConvertSToF %v2float %13339\n      %18251 = OpVectorTimesScalar %v2float %10915 %float_0_000976592302\n      %24074 = OpExtInst %v2float %1 FMax %73 %18251\n      %24334 = OpCompositeExtract %float %24074 0\n      %15575 = OpCompositeExtract %float %24074 1\n      %16673 = OpCompositeConstruct %v4float %24334 %15575 %float_0 %float_0\n      %19525 = OpCompositeExtract %uint %10944 1\n      %16036 = OpBitcast %int %19525\n      %18207 = OpCompositeConstruct %v2int %16036 %16036\n      %18354 = OpShiftLeftLogical %v2int %18207 %1959\n      %13340 = OpShiftRightArithmetic %v2int %18354 %2151\n      %10916 = OpConvertSToF %v2float %13340\n      %18252 = OpVectorTimesScalar %v2float %10916 %float_0_000976592302\n      %24075 = OpExtInst %v2float %1 FMax %73 %18252\n      %24335 = OpCompositeExtract %float %24075 0\n      %15576 = OpCompositeExtract %float %24075 1\n      %16674 = OpCompositeConstruct %v4float %24335 %15576 %float_0 %float_0\n      %19526 = OpCompositeExtract %uint %10944 2\n      %16037 = OpBitcast %int %19526\n      %18208 = OpCompositeConstruct %v2int %16037 %16037\n      %18355 = OpShiftLeftLogical %v2int %18208 %1959\n      %13341 = OpShiftRightArithmetic %v2int %18355 %2151\n      %10917 = OpConvertSToF %v2float %13341\n      %18253 = OpVectorTimesScalar %v2float %10917 %float_0_000976592302\n      %24076 = OpExtInst %v2float %1 FMax %73 %18253\n      %24336 = OpCompositeExtract %float %24076 0\n      %15577 = OpCompositeExtract %float %24076 1\n      %16675 = OpCompositeConstruct %v4float %24336 %15577 %float_0 %float_0\n      %19527 = OpCompositeExtract %uint %10944 3\n      %16038 = OpBitcast %int %19527\n      %18212 = OpCompositeConstruct %v2int %16038 %16038\n      %18356 = OpShiftLeftLogical %v2int %18212 %1959\n      %13342 = OpShiftRightArithmetic %v2int %18356 %2151\n      %10918 = OpConvertSToF %v2float %13342\n      %18254 = OpVectorTimesScalar %v2float %10918 %float_0_000976592302\n      %24077 = OpExtInst %v2float %1 FMax %73 %18254\n      %24337 = OpCompositeExtract %float %24077 0\n      %18765 = OpCompositeExtract %float %24077 1\n       %9039 = OpCompositeConstruct %v4float %24337 %18765 %float_0 %float_0\n               OpBranch %16225\n       %7356 = OpLabel\n      %22208 = OpCompositeExtract %uint %10944 0\n      %20237 = OpCompositeConstruct %v3uint %22208 %22208 %22208\n      %11026 = OpShiftRightLogical %v3uint %20237 %2996\n      %24042 = OpBitwiseAnd %v3uint %11026 %261\n      %18592 = OpBitwiseAnd %v3uint %11026 %1126\n      %23444 = OpShiftRightLogical %v3uint %24042 %2828\n      %16589 = OpIEqual %v3bool %23444 %2578\n      %11343 = OpExtInst %v3int %1 FindUMsb %18592\n      %10777 = OpBitcast %v3uint %11343\n       %6270 = OpISub %v3uint %2828 %10777\n       %8724 = OpIAdd %v3uint %10777 %2360\n      %10355 = OpSelect %v3uint %16589 %8724 %23444\n      %23256 = OpShiftLeftLogical %v3uint %18592 %6270\n      %18846 = OpBitwiseAnd %v3uint %23256 %1126\n      %10919 = OpSelect %v3uint %16589 %18846 %18592\n      %24573 = OpIAdd %v3uint %10355 %1018\n      %20355 = OpShiftLeftLogical %v3uint %24573 %393\n      %16298 = OpShiftLeftLogical %v3uint %10919 %141\n      %22400 = OpBitwiseOr %v3uint %20355 %16298\n      %13828 = OpIEqual %v3bool %24042 %2578\n      %16966 = OpSelect %v3uint %13828 %2578 %22400\n      %10707 = OpBitcast %v3float %16966\n      %19368 = OpShiftRightLogical %uint %22208 %uint_30\n      %18450 = OpConvertUToF %float %19368\n      %15907 = OpFMul %float %18450 %float_0_333333343\n      %21446 = OpCompositeExtract %float %10707 0\n      %10841 = OpCompositeExtract %float %10707 1\n       %7836 = OpCompositeExtract %float %10707 2\n      %15837 = OpCompositeConstruct %v4float %21446 %10841 %7836 %15907\n      %10232 = OpCompositeExtract %uint %10944 1\n      %13585 = OpCompositeConstruct %v3uint %10232 %10232 %10232\n      %11027 = OpShiftRightLogical %v3uint %13585 %2996\n      %24043 = OpBitwiseAnd %v3uint %11027 %261\n      %18593 = OpBitwiseAnd %v3uint %11027 %1126\n      %23445 = OpShiftRightLogical %v3uint %24043 %2828\n      %16590 = OpIEqual %v3bool %23445 %2578\n      %11344 = OpExtInst %v3int %1 FindUMsb %18593\n      %10778 = OpBitcast %v3uint %11344\n       %6271 = OpISub %v3uint %2828 %10778\n       %8725 = OpIAdd %v3uint %10778 %2360\n      %10356 = OpSelect %v3uint %16590 %8725 %23445\n      %23257 = OpShiftLeftLogical %v3uint %18593 %6271\n      %18847 = OpBitwiseAnd %v3uint %23257 %1126\n      %10920 = OpSelect %v3uint %16590 %18847 %18593\n      %24574 = OpIAdd %v3uint %10356 %1018\n      %20356 = OpShiftLeftLogical %v3uint %24574 %393\n      %16299 = OpShiftLeftLogical %v3uint %10920 %141\n      %22401 = OpBitwiseOr %v3uint %20356 %16299\n      %13829 = OpIEqual %v3bool %24043 %2578\n      %16967 = OpSelect %v3uint %13829 %2578 %22401\n      %10708 = OpBitcast %v3float %16967\n      %19369 = OpShiftRightLogical %uint %10232 %uint_30\n      %18451 = OpConvertUToF %float %19369\n      %15908 = OpFMul %float %18451 %float_0_333333343\n      %21447 = OpCompositeExtract %float %10708 0\n      %10842 = OpCompositeExtract %float %10708 1\n       %7837 = OpCompositeExtract %float %10708 2\n      %15838 = OpCompositeConstruct %v4float %21447 %10842 %7837 %15908\n      %10233 = OpCompositeExtract %uint %10944 2\n      %13586 = OpCompositeConstruct %v3uint %10233 %10233 %10233\n      %11028 = OpShiftRightLogical %v3uint %13586 %2996\n      %24044 = OpBitwiseAnd %v3uint %11028 %261\n      %18594 = OpBitwiseAnd %v3uint %11028 %1126\n      %23446 = OpShiftRightLogical %v3uint %24044 %2828\n      %16591 = OpIEqual %v3bool %23446 %2578\n      %11345 = OpExtInst %v3int %1 FindUMsb %18594\n      %10779 = OpBitcast %v3uint %11345\n       %6272 = OpISub %v3uint %2828 %10779\n       %8726 = OpIAdd %v3uint %10779 %2360\n      %10357 = OpSelect %v3uint %16591 %8726 %23446\n      %23258 = OpShiftLeftLogical %v3uint %18594 %6272\n      %18848 = OpBitwiseAnd %v3uint %23258 %1126\n      %10921 = OpSelect %v3uint %16591 %18848 %18594\n      %24575 = OpIAdd %v3uint %10357 %1018\n      %20357 = OpShiftLeftLogical %v3uint %24575 %393\n      %16300 = OpShiftLeftLogical %v3uint %10921 %141\n      %22402 = OpBitwiseOr %v3uint %20357 %16300\n      %13830 = OpIEqual %v3bool %24044 %2578\n      %16968 = OpSelect %v3uint %13830 %2578 %22402\n      %10709 = OpBitcast %v3float %16968\n      %19370 = OpShiftRightLogical %uint %10233 %uint_30\n      %18452 = OpConvertUToF %float %19370\n      %15909 = OpFMul %float %18452 %float_0_333333343\n      %21448 = OpCompositeExtract %float %10709 0\n      %10843 = OpCompositeExtract %float %10709 1\n       %7838 = OpCompositeExtract %float %10709 2\n      %15839 = OpCompositeConstruct %v4float %21448 %10843 %7838 %15909\n      %10234 = OpCompositeExtract %uint %10944 3\n      %13587 = OpCompositeConstruct %v3uint %10234 %10234 %10234\n      %11029 = OpShiftRightLogical %v3uint %13587 %2996\n      %24045 = OpBitwiseAnd %v3uint %11029 %261\n      %18595 = OpBitwiseAnd %v3uint %11029 %1126\n      %23447 = OpShiftRightLogical %v3uint %24045 %2828\n      %16592 = OpIEqual %v3bool %23447 %2578\n      %11346 = OpExtInst %v3int %1 FindUMsb %18595\n      %10780 = OpBitcast %v3uint %11346\n       %6273 = OpISub %v3uint %2828 %10780\n       %8727 = OpIAdd %v3uint %10780 %2360\n      %10358 = OpSelect %v3uint %16592 %8727 %23447\n      %23259 = OpShiftLeftLogical %v3uint %18595 %6273\n      %18849 = OpBitwiseAnd %v3uint %23259 %1126\n      %10922 = OpSelect %v3uint %16592 %18849 %18595\n      %24576 = OpIAdd %v3uint %10358 %1018\n      %20358 = OpShiftLeftLogical %v3uint %24576 %393\n      %16301 = OpShiftLeftLogical %v3uint %10922 %141\n      %22403 = OpBitwiseOr %v3uint %20358 %16301\n      %13831 = OpIEqual %v3bool %24045 %2578\n      %16969 = OpSelect %v3uint %13831 %2578 %22403\n      %10710 = OpBitcast %v3float %16969\n      %19371 = OpShiftRightLogical %uint %10234 %uint_30\n      %18453 = OpConvertUToF %float %19371\n      %15910 = OpFMul %float %18453 %float_0_333333343\n      %21449 = OpCompositeExtract %float %10710 0\n      %10844 = OpCompositeExtract %float %10710 1\n      %11030 = OpCompositeExtract %float %10710 2\n       %9040 = OpCompositeConstruct %v4float %21449 %10844 %11030 %15910\n               OpBranch %16225\n       %7357 = OpLabel\n      %22209 = OpCompositeExtract %uint %10944 0\n      %20238 = OpCompositeConstruct %v4uint %22209 %22209 %22209 %22209\n       %9376 = OpShiftRightLogical %v4uint %20238 %845\n      %18863 = OpBitwiseAnd %v4uint %9376 %635\n      %15546 = OpConvertUToF %v4float %18863\n      %16691 = OpFMul %v4float %15546 %2798\n      %23765 = OpCompositeExtract %uint %10944 1\n      %20816 = OpCompositeConstruct %v4uint %23765 %23765 %23765 %23765\n       %9377 = OpShiftRightLogical %v4uint %20816 %845\n      %18864 = OpBitwiseAnd %v4uint %9377 %635\n      %15547 = OpConvertUToF %v4float %18864\n      %16692 = OpFMul %v4float %15547 %2798\n      %23766 = OpCompositeExtract %uint %10944 2\n      %20817 = OpCompositeConstruct %v4uint %23766 %23766 %23766 %23766\n       %9378 = OpShiftRightLogical %v4uint %20817 %845\n      %18865 = OpBitwiseAnd %v4uint %9378 %635\n      %15548 = OpConvertUToF %v4float %18865\n      %16693 = OpFMul %v4float %15548 %2798\n      %23767 = OpCompositeExtract %uint %10944 3\n      %20818 = OpCompositeConstruct %v4uint %23767 %23767 %23767 %23767\n       %9379 = OpShiftRightLogical %v4uint %20818 %845\n      %18866 = OpBitwiseAnd %v4uint %9379 %635\n      %18736 = OpConvertUToF %v4float %18866\n       %9888 = OpFMul %v4float %18736 %2798\n               OpBranch %16225\n      %14586 = OpLabel\n      %22210 = OpCompositeExtract %uint %10944 0\n      %20239 = OpCompositeConstruct %v4uint %22210 %22210 %22210 %22210\n       %9380 = OpShiftRightLogical %v4uint %20239 %653\n      %19034 = OpBitwiseAnd %v4uint %9380 %1611\n      %13989 = OpConvertUToF %v4float %19034\n      %19238 = OpVectorTimesScalar %v4float %13989 %float_0_00392156886\n       %8610 = OpCompositeExtract %uint %10944 1\n      %24846 = OpCompositeConstruct %v4uint %8610 %8610 %8610 %8610\n       %9381 = OpShiftRightLogical %v4uint %24846 %653\n      %19035 = OpBitwiseAnd %v4uint %9381 %1611\n      %13990 = OpConvertUToF %v4float %19035\n      %19239 = OpVectorTimesScalar %v4float %13990 %float_0_00392156886\n       %8611 = OpCompositeExtract %uint %10944 2\n      %24847 = OpCompositeConstruct %v4uint %8611 %8611 %8611 %8611\n       %9382 = OpShiftRightLogical %v4uint %24847 %653\n      %19036 = OpBitwiseAnd %v4uint %9382 %1611\n      %13991 = OpConvertUToF %v4float %19036\n      %19240 = OpVectorTimesScalar %v4float %13991 %float_0_00392156886\n       %8612 = OpCompositeExtract %uint %10944 3\n      %24848 = OpCompositeConstruct %v4uint %8612 %8612 %8612 %8612\n       %9383 = OpShiftRightLogical %v4uint %24848 %653\n      %19037 = OpBitwiseAnd %v4uint %9383 %1611\n      %17179 = OpConvertUToF %v4float %19037\n      %12435 = OpVectorTimesScalar %v4float %17179 %float_0_00392156886\n               OpBranch %16225\n      %19452 = OpLabel\n      %12430 = OpCompositeExtract %uint %10944 0\n      %20463 = OpBitcast %float %12430\n      %17209 = OpCompositeConstruct %v2float %20463 %float_0\n      %11667 = OpVectorShuffle %v4float %17209 %17209 0 1 1 1\n      %22196 = OpCompositeExtract %uint %10944 1\n      %16235 = OpBitcast %float %22196\n      %17210 = OpCompositeConstruct %v2float %16235 %float_0\n      %11668 = OpVectorShuffle %v4float %17210 %17210 0 1 1 1\n      %22197 = OpCompositeExtract %uint %10944 2\n      %16236 = OpBitcast %float %22197\n      %17211 = OpCompositeConstruct %v2float %16236 %float_0\n      %11669 = OpVectorShuffle %v4float %17211 %17211 0 1 1 1\n      %22198 = OpCompositeExtract %uint %10944 3\n      %16237 = OpBitcast %float %22198\n      %20399 = OpCompositeConstruct %v2float %16237 %float_0\n      %23099 = OpVectorShuffle %v4float %20399 %20399 0 1 1 1\n               OpBranch %16225\n      %16225 = OpLabel\n      %11178 = OpPhi %v4float %23099 %19452 %12435 %14586 %9888 %7357 %9040 %7356 %9039 %8191 %9038 %8245\n      %14347 = OpPhi %v4float %11669 %19452 %19240 %14586 %16693 %7357 %15839 %7356 %16675 %8191 %14612 %8245\n      %15231 = OpPhi %v4float %11668 %19452 %19239 %14586 %16692 %7357 %15838 %7356 %16674 %8191 %14611 %8245\n      %14520 = OpPhi %v4float %11667 %19452 %19238 %14586 %16691 %7357 %15837 %7356 %16673 %8191 %14610 %8245\n               OpBranch %21264\n      %15206 = OpLabel\n      %21585 = OpIEqual %bool %6555 %uint_8\n               OpSelectionMerge %20261 DontFlatten\n               OpBranchConditional %21585 %6594 %8962\n       %8962 = OpLabel\n      %22067 = OpShiftRightLogical %uint %8114 %int_2\n      %13375 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22067\n      %12617 = OpLoad %uint %13375\n      %11703 = OpIAdd %uint %22067 %uint_1\n       %6408 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11703\n       %7031 = OpLoad %uint %6408\n       %8520 = OpIAdd %uint %8114 %6555\n      %21673 = OpShiftRightLogical %uint %8520 %int_2\n      %19605 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21673\n      %12618 = OpLoad %uint %19605\n      %11704 = OpIAdd %uint %21673 %uint_1\n      %24564 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11704\n      %14157 = OpLoad %uint %24564\n      %19671 = OpCompositeConstruct %v4uint %12617 %7031 %12618 %14157\n      %19500 = OpIMul %uint %uint_2 %6555\n      %10822 = OpIAdd %uint %8114 %19500\n      %17896 = OpShiftRightLogical %uint %10822 %int_2\n      %19606 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17896\n      %12619 = OpLoad %uint %19606\n      %11705 = OpIAdd %uint %17896 %uint_1\n       %6476 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11705\n      %24156 = OpLoad %uint %6476\n       %8690 = OpIMul %uint %uint_3 %6555\n      %24259 = OpIAdd %uint %8114 %8690\n      %17897 = OpShiftRightLogical %uint %24259 %int_2\n      %19607 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17897\n      %12620 = OpLoad %uint %19607\n      %11706 = OpIAdd %uint %17897 %uint_1\n      %24565 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11706\n      %16383 = OpLoad %uint %24565\n      %20786 = OpCompositeConstruct %v4uint %12619 %24156 %12620 %16383\n               OpBranch %20261\n       %6594 = OpLabel\n      %24489 = OpShiftRightLogical %uint %8114 %int_2\n      %13376 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24489\n      %12621 = OpLoad %uint %13376\n      %11707 = OpIAdd %uint %24489 %uint_1\n       %6409 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11707\n      %23658 = OpLoad %uint %6409\n      %11708 = OpIAdd %uint %24489 %uint_2\n       %6410 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11708\n      %23659 = OpLoad %uint %6410\n      %11709 = OpIAdd %uint %24489 %uint_3\n      %24566 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11709\n      %14081 = OpLoad %uint %24566\n      %21617 = OpCompositeConstruct %v4uint %12621 %23658 %23659 %14081\n      %19332 = OpIAdd %uint %8114 %uint_16\n       %8238 = OpShiftRightLogical %uint %19332 %int_2\n      %19608 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %8238\n      %12622 = OpLoad %uint %19608\n      %11710 = OpIAdd %uint %8238 %uint_1\n       %6411 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11710\n      %23660 = OpLoad %uint %6411\n      %11711 = OpIAdd %uint %8238 %uint_2\n       %6412 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11711\n      %23661 = OpLoad %uint %6412\n      %11712 = OpIAdd %uint %8238 %uint_3\n      %24567 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11712\n      %16384 = OpLoad %uint %24567\n      %20787 = OpCompositeConstruct %v4uint %12622 %23660 %23661 %16384\n               OpBranch %20261\n      %20261 = OpLabel\n      %11214 = OpPhi %v4uint %20787 %6594 %20786 %8962\n      %14113 = OpPhi %v4uint %21617 %6594 %19671 %8962\n               OpSelectionMerge %20262 None\n               OpSwitch %8576 %20311 5 %8537 7 %8246\n       %8246 = OpLabel\n      %24411 = OpCompositeExtract %uint %14113 0\n      %24682 = OpExtInst %v2float %1 UnpackHalf2x16 %24411\n      %10105 = OpCompositeExtract %float %24682 0\n      %16060 = OpCompositeExtract %float %24682 1\n      %17029 = OpCompositeExtract %uint %14113 1\n      %15609 = OpExtInst %v2float %1 UnpackHalf2x16 %17029\n      %10094 = OpCompositeExtract %float %15609 0\n      %17487 = OpCompositeExtract %float %15609 1\n      %14613 = OpCompositeConstruct %v4float %10105 %16060 %10094 %17487\n      %17283 = OpCompositeExtract %uint %14113 2\n      %18036 = OpExtInst %v2float %1 UnpackHalf2x16 %17283\n      %10106 = OpCompositeExtract %float %18036 0\n      %16061 = OpCompositeExtract %float %18036 1\n      %17030 = OpCompositeExtract %uint %14113 3\n      %15610 = OpExtInst %v2float %1 UnpackHalf2x16 %17030\n      %10095 = OpCompositeExtract %float %15610 0\n      %17488 = OpCompositeExtract %float %15610 1\n      %14614 = OpCompositeConstruct %v4float %10106 %16061 %10095 %17488\n      %17284 = OpCompositeExtract %uint %11214 0\n      %18037 = OpExtInst %v2float %1 UnpackHalf2x16 %17284\n      %10107 = OpCompositeExtract %float %18037 0\n      %16062 = OpCompositeExtract %float %18037 1\n      %17031 = OpCompositeExtract %uint %11214 1\n      %15611 = OpExtInst %v2float %1 UnpackHalf2x16 %17031\n      %10096 = OpCompositeExtract %float %15611 0\n      %17489 = OpCompositeExtract %float %15611 1\n      %14615 = OpCompositeConstruct %v4float %10107 %16062 %10096 %17489\n      %17285 = OpCompositeExtract %uint %11214 2\n      %18038 = OpExtInst %v2float %1 UnpackHalf2x16 %17285\n      %10108 = OpCompositeExtract %float %18038 0\n      %16063 = OpCompositeExtract %float %18038 1\n      %17032 = OpCompositeExtract %uint %11214 3\n      %15612 = OpExtInst %v2float %1 UnpackHalf2x16 %17032\n      %10097 = OpCompositeExtract %float %15612 0\n      %20673 = OpCompositeExtract %float %15612 1\n       %9041 = OpCompositeConstruct %v4float %10108 %16063 %10097 %20673\n               OpBranch %20262\n       %8537 = OpLabel\n       %9724 = OpVectorShuffle %v2uint %14113 %14113 0 1\n      %23357 = OpBitcast %v2int %9724\n      %24786 = OpVectorShuffle %v4int %23357 %23357 0 0 1 1\n      %18602 = OpShiftLeftLogical %v4int %24786 %290\n      %15761 = OpShiftRightArithmetic %v4int %18602 %770\n      %10923 = OpConvertSToF %v4float %15761\n      %18213 = OpVectorTimesScalar %v4float %10923 %float_0_000976592302\n      %25236 = OpExtInst %v4float %1 FMax %1284 %18213\n      %14190 = OpVectorShuffle %v2uint %14113 %14113 2 3\n       %9410 = OpBitcast %v2int %14190\n      %24787 = OpVectorShuffle %v4int %9410 %9410 0 0 1 1\n      %18603 = OpShiftLeftLogical %v4int %24787 %290\n      %15762 = OpShiftRightArithmetic %v4int %18603 %770\n      %10924 = OpConvertSToF %v4float %15762\n      %18214 = OpVectorTimesScalar %v4float %10924 %float_0_000976592302\n      %25237 = OpExtInst %v4float %1 FMax %1284 %18214\n      %14191 = OpVectorShuffle %v2uint %11214 %11214 0 1\n       %9411 = OpBitcast %v2int %14191\n      %24788 = OpVectorShuffle %v4int %9411 %9411 0 0 1 1\n      %18604 = OpShiftLeftLogical %v4int %24788 %290\n      %15763 = OpShiftRightArithmetic %v4int %18604 %770\n      %10925 = OpConvertSToF %v4float %15763\n      %18215 = OpVectorTimesScalar %v4float %10925 %float_0_000976592302\n      %25238 = OpExtInst %v4float %1 FMax %1284 %18215\n      %14192 = OpVectorShuffle %v2uint %11214 %11214 2 3\n       %9412 = OpBitcast %v2int %14192\n      %24789 = OpVectorShuffle %v4int %9412 %9412 0 0 1 1\n      %18605 = OpShiftLeftLogical %v4int %24789 %290\n      %15764 = OpShiftRightArithmetic %v4int %18605 %770\n      %10926 = OpConvertSToF %v4float %15764\n      %21440 = OpVectorTimesScalar %v4float %10926 %float_0_000976592302\n      %17251 = OpExtInst %v4float %1 FMax %1284 %21440\n               OpBranch %20262\n      %20311 = OpLabel\n       %9762 = OpVectorShuffle %v2uint %14113 %14113 0 1\n      %20826 = OpBitcast %v2float %9762\n       %7040 = OpCompositeExtract %float %20826 0\n      %13421 = OpCompositeExtract %float %20826 1\n      %17019 = OpCompositeConstruct %v4float %7040 %13421 %float_0 %float_0\n      %16859 = OpVectorShuffle %v2uint %14113 %14113 2 3\n      %14176 = OpBitcast %v2float %16859\n       %7041 = OpCompositeExtract %float %14176 0\n      %13422 = OpCompositeExtract %float %14176 1\n      %17020 = OpCompositeConstruct %v4float %7041 %13422 %float_0 %float_0\n      %16860 = OpVectorShuffle %v2uint %11214 %11214 0 1\n      %14177 = OpBitcast %v2float %16860\n       %7042 = OpCompositeExtract %float %14177 0\n      %13423 = OpCompositeExtract %float %14177 1\n      %17021 = OpCompositeConstruct %v4float %7042 %13423 %float_0 %float_0\n      %16861 = OpVectorShuffle %v2uint %11214 %11214 2 3\n      %14178 = OpBitcast %v2float %16861\n       %7043 = OpCompositeExtract %float %14178 0\n      %16649 = OpCompositeExtract %float %14178 1\n       %9042 = OpCompositeConstruct %v4float %7043 %16649 %float_0 %float_0\n               OpBranch %20262\n      %20262 = OpLabel\n      %11179 = OpPhi %v4float %9042 %20311 %17251 %8537 %9041 %8246\n      %14348 = OpPhi %v4float %17021 %20311 %25238 %8537 %14615 %8246\n      %15232 = OpPhi %v4float %17020 %20311 %25237 %8537 %14614 %8246\n      %14521 = OpPhi %v4float %17019 %20311 %25236 %8537 %14613 %8246\n               OpBranch %21264\n      %21264 = OpLabel\n      %11180 = OpPhi %v4float %11179 %20262 %11178 %16225\n      %14349 = OpPhi %v4float %14348 %20262 %14347 %16225\n      %12949 = OpPhi %v4float %15232 %20262 %15231 %16225\n      %13946 = OpPhi %v4float %14521 %20262 %14520 %16225\n      %17241 = OpFAdd %v4float %8403 %13946\n      %23297 = OpFAdd %v4float %13804 %12949\n       %8082 = OpFAdd %v4float %14346 %14349\n      %20755 = OpFAdd %v4float %11177 %11180\n      %14461 = OpUGreaterThanEqual %bool %17238 %uint_6\n               OpSelectionMerge %24266 DontFlatten\n               OpBranchConditional %14461 %9905 %24266\n       %9905 = OpLabel\n      %14258 = OpShiftLeftLogical %uint %uint_4 %9130\n      %12090 = OpFMul %float %11052 %float_0_25\n      %20988 = OpIAdd %uint %7686 %14258\n               OpSelectionMerge %21265 DontFlatten\n               OpBranchConditional %23279 %15207 %16571\n      %16571 = OpLabel\n      %19165 = OpIEqual %bool %6555 %uint_4\n               OpSelectionMerge %20299 DontFlatten\n               OpBranchConditional %19165 %6595 %8963\n       %8963 = OpLabel\n      %22068 = OpShiftRightLogical %uint %20988 %int_2\n      %13377 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22068\n      %15062 = OpLoad %uint %13377\n       %8521 = OpIAdd %uint %20988 %6555\n      %21674 = OpShiftRightLogical %uint %8521 %int_2\n      %19681 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21674\n      %13118 = OpLoad %uint %19681\n       %8691 = OpIMul %uint %uint_2 %6555\n      %24260 = OpIAdd %uint %20988 %8691\n      %17898 = OpShiftRightLogical %uint %24260 %int_2\n      %19682 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17898\n      %13119 = OpLoad %uint %19682\n       %8692 = OpIMul %uint %uint_3 %6555\n      %24261 = OpIAdd %uint %20988 %8692\n      %17899 = OpShiftRightLogical %uint %24261 %int_2\n      %18691 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17899\n      %24412 = OpLoad %uint %18691\n      %20788 = OpCompositeConstruct %v4uint %15062 %13118 %13119 %24412\n               OpBranch %20299\n       %6595 = OpLabel\n      %24490 = OpShiftRightLogical %uint %20988 %int_2\n      %13378 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24490\n      %12623 = OpLoad %uint %13378\n      %11713 = OpIAdd %uint %24490 %uint_1\n       %6413 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11713\n      %23662 = OpLoad %uint %6413\n      %11714 = OpIAdd %uint %24490 %uint_2\n       %6414 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11714\n      %23663 = OpLoad %uint %6414\n      %11715 = OpIAdd %uint %24490 %uint_3\n      %24568 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11715\n      %16385 = OpLoad %uint %24568\n      %20789 = OpCompositeConstruct %v4uint %12623 %23662 %23663 %16385\n               OpBranch %20299\n      %20299 = OpLabel\n      %10945 = OpPhi %v4uint %20789 %6595 %20788 %8963\n               OpSelectionMerge %16226 None\n               OpSwitch %8576 %19453 0 %14587 1 %14587 2 %7359 10 %7359 3 %7358 12 %7358 4 %8192 6 %8247\n       %8247 = OpLabel\n      %24413 = OpCompositeExtract %uint %10945 0\n      %24683 = OpExtInst %v2float %1 UnpackHalf2x16 %24413\n      %10098 = OpCompositeExtract %float %24683 0\n      %17490 = OpCompositeExtract %float %24683 1\n      %14616 = OpCompositeConstruct %v4float %10098 %17490 %float_0 %float_0\n      %17286 = OpCompositeExtract %uint %10945 1\n      %18039 = OpExtInst %v2float %1 UnpackHalf2x16 %17286\n      %10099 = OpCompositeExtract %float %18039 0\n      %17491 = OpCompositeExtract %float %18039 1\n      %14617 = OpCompositeConstruct %v4float %10099 %17491 %float_0 %float_0\n      %17287 = OpCompositeExtract %uint %10945 2\n      %18040 = OpExtInst %v2float %1 UnpackHalf2x16 %17287\n      %10100 = OpCompositeExtract %float %18040 0\n      %17492 = OpCompositeExtract %float %18040 1\n      %14618 = OpCompositeConstruct %v4float %10100 %17492 %float_0 %float_0\n      %17288 = OpCompositeExtract %uint %10945 3\n      %18041 = OpExtInst %v2float %1 UnpackHalf2x16 %17288\n      %10109 = OpCompositeExtract %float %18041 0\n      %20674 = OpCompositeExtract %float %18041 1\n       %9043 = OpCompositeConstruct %v4float %10109 %20674 %float_0 %float_0\n               OpBranch %16226\n       %8192 = OpLabel\n      %12431 = OpCompositeExtract %uint %10945 0\n      %22687 = OpBitcast %int %12431\n      %18216 = OpCompositeConstruct %v2int %22687 %22687\n      %18357 = OpShiftLeftLogical %v2int %18216 %1959\n      %13343 = OpShiftRightArithmetic %v2int %18357 %2151\n      %10927 = OpConvertSToF %v2float %13343\n      %18255 = OpVectorTimesScalar %v2float %10927 %float_0_000976592302\n      %24078 = OpExtInst %v2float %1 FMax %73 %18255\n      %24338 = OpCompositeExtract %float %24078 0\n      %15578 = OpCompositeExtract %float %24078 1\n      %16676 = OpCompositeConstruct %v4float %24338 %15578 %float_0 %float_0\n      %19528 = OpCompositeExtract %uint %10945 1\n      %16039 = OpBitcast %int %19528\n      %18217 = OpCompositeConstruct %v2int %16039 %16039\n      %18358 = OpShiftLeftLogical %v2int %18217 %1959\n      %13344 = OpShiftRightArithmetic %v2int %18358 %2151\n      %10928 = OpConvertSToF %v2float %13344\n      %18256 = OpVectorTimesScalar %v2float %10928 %float_0_000976592302\n      %24079 = OpExtInst %v2float %1 FMax %73 %18256\n      %24339 = OpCompositeExtract %float %24079 0\n      %15579 = OpCompositeExtract %float %24079 1\n      %16677 = OpCompositeConstruct %v4float %24339 %15579 %float_0 %float_0\n      %19529 = OpCompositeExtract %uint %10945 2\n      %16040 = OpBitcast %int %19529\n      %18218 = OpCompositeConstruct %v2int %16040 %16040\n      %18359 = OpShiftLeftLogical %v2int %18218 %1959\n      %13345 = OpShiftRightArithmetic %v2int %18359 %2151\n      %10929 = OpConvertSToF %v2float %13345\n      %18257 = OpVectorTimesScalar %v2float %10929 %float_0_000976592302\n      %24080 = OpExtInst %v2float %1 FMax %73 %18257\n      %24340 = OpCompositeExtract %float %24080 0\n      %15580 = OpCompositeExtract %float %24080 1\n      %16678 = OpCompositeConstruct %v4float %24340 %15580 %float_0 %float_0\n      %19530 = OpCompositeExtract %uint %10945 3\n      %16041 = OpBitcast %int %19530\n      %18219 = OpCompositeConstruct %v2int %16041 %16041\n      %18360 = OpShiftLeftLogical %v2int %18219 %1959\n      %13346 = OpShiftRightArithmetic %v2int %18360 %2151\n      %10930 = OpConvertSToF %v2float %13346\n      %18258 = OpVectorTimesScalar %v2float %10930 %float_0_000976592302\n      %24081 = OpExtInst %v2float %1 FMax %73 %18258\n      %24341 = OpCompositeExtract %float %24081 0\n      %18766 = OpCompositeExtract %float %24081 1\n       %9044 = OpCompositeConstruct %v4float %24341 %18766 %float_0 %float_0\n               OpBranch %16226\n       %7358 = OpLabel\n      %22211 = OpCompositeExtract %uint %10945 0\n      %20240 = OpCompositeConstruct %v3uint %22211 %22211 %22211\n      %11031 = OpShiftRightLogical %v3uint %20240 %2996\n      %24046 = OpBitwiseAnd %v3uint %11031 %261\n      %18596 = OpBitwiseAnd %v3uint %11031 %1126\n      %23448 = OpShiftRightLogical %v3uint %24046 %2828\n      %16593 = OpIEqual %v3bool %23448 %2578\n      %11347 = OpExtInst %v3int %1 FindUMsb %18596\n      %10781 = OpBitcast %v3uint %11347\n       %6274 = OpISub %v3uint %2828 %10781\n       %8728 = OpIAdd %v3uint %10781 %2360\n      %10359 = OpSelect %v3uint %16593 %8728 %23448\n      %23260 = OpShiftLeftLogical %v3uint %18596 %6274\n      %18850 = OpBitwiseAnd %v3uint %23260 %1126\n      %10931 = OpSelect %v3uint %16593 %18850 %18596\n      %24577 = OpIAdd %v3uint %10359 %1018\n      %20359 = OpShiftLeftLogical %v3uint %24577 %393\n      %16302 = OpShiftLeftLogical %v3uint %10931 %141\n      %22404 = OpBitwiseOr %v3uint %20359 %16302\n      %13832 = OpIEqual %v3bool %24046 %2578\n      %16970 = OpSelect %v3uint %13832 %2578 %22404\n      %10711 = OpBitcast %v3float %16970\n      %19372 = OpShiftRightLogical %uint %22211 %uint_30\n      %18454 = OpConvertUToF %float %19372\n      %15911 = OpFMul %float %18454 %float_0_333333343\n      %21450 = OpCompositeExtract %float %10711 0\n      %10845 = OpCompositeExtract %float %10711 1\n       %7839 = OpCompositeExtract %float %10711 2\n      %15840 = OpCompositeConstruct %v4float %21450 %10845 %7839 %15911\n      %10235 = OpCompositeExtract %uint %10945 1\n      %13588 = OpCompositeConstruct %v3uint %10235 %10235 %10235\n      %11032 = OpShiftRightLogical %v3uint %13588 %2996\n      %24047 = OpBitwiseAnd %v3uint %11032 %261\n      %18597 = OpBitwiseAnd %v3uint %11032 %1126\n      %23449 = OpShiftRightLogical %v3uint %24047 %2828\n      %16594 = OpIEqual %v3bool %23449 %2578\n      %11348 = OpExtInst %v3int %1 FindUMsb %18597\n      %10782 = OpBitcast %v3uint %11348\n       %6275 = OpISub %v3uint %2828 %10782\n       %8729 = OpIAdd %v3uint %10782 %2360\n      %10360 = OpSelect %v3uint %16594 %8729 %23449\n      %23261 = OpShiftLeftLogical %v3uint %18597 %6275\n      %18851 = OpBitwiseAnd %v3uint %23261 %1126\n      %10932 = OpSelect %v3uint %16594 %18851 %18597\n      %24578 = OpIAdd %v3uint %10360 %1018\n      %20360 = OpShiftLeftLogical %v3uint %24578 %393\n      %16303 = OpShiftLeftLogical %v3uint %10932 %141\n      %22405 = OpBitwiseOr %v3uint %20360 %16303\n      %13833 = OpIEqual %v3bool %24047 %2578\n      %16971 = OpSelect %v3uint %13833 %2578 %22405\n      %10712 = OpBitcast %v3float %16971\n      %19373 = OpShiftRightLogical %uint %10235 %uint_30\n      %18455 = OpConvertUToF %float %19373\n      %15912 = OpFMul %float %18455 %float_0_333333343\n      %21451 = OpCompositeExtract %float %10712 0\n      %10846 = OpCompositeExtract %float %10712 1\n       %7840 = OpCompositeExtract %float %10712 2\n      %15841 = OpCompositeConstruct %v4float %21451 %10846 %7840 %15912\n      %10236 = OpCompositeExtract %uint %10945 2\n      %13589 = OpCompositeConstruct %v3uint %10236 %10236 %10236\n      %11033 = OpShiftRightLogical %v3uint %13589 %2996\n      %24048 = OpBitwiseAnd %v3uint %11033 %261\n      %18606 = OpBitwiseAnd %v3uint %11033 %1126\n      %23450 = OpShiftRightLogical %v3uint %24048 %2828\n      %16595 = OpIEqual %v3bool %23450 %2578\n      %11349 = OpExtInst %v3int %1 FindUMsb %18606\n      %10783 = OpBitcast %v3uint %11349\n       %6276 = OpISub %v3uint %2828 %10783\n       %8730 = OpIAdd %v3uint %10783 %2360\n      %10361 = OpSelect %v3uint %16595 %8730 %23450\n      %23262 = OpShiftLeftLogical %v3uint %18606 %6276\n      %18852 = OpBitwiseAnd %v3uint %23262 %1126\n      %10933 = OpSelect %v3uint %16595 %18852 %18606\n      %24579 = OpIAdd %v3uint %10361 %1018\n      %20361 = OpShiftLeftLogical %v3uint %24579 %393\n      %16304 = OpShiftLeftLogical %v3uint %10933 %141\n      %22406 = OpBitwiseOr %v3uint %20361 %16304\n      %13834 = OpIEqual %v3bool %24048 %2578\n      %16972 = OpSelect %v3uint %13834 %2578 %22406\n      %10713 = OpBitcast %v3float %16972\n      %19374 = OpShiftRightLogical %uint %10236 %uint_30\n      %18456 = OpConvertUToF %float %19374\n      %15913 = OpFMul %float %18456 %float_0_333333343\n      %21452 = OpCompositeExtract %float %10713 0\n      %10847 = OpCompositeExtract %float %10713 1\n       %7841 = OpCompositeExtract %float %10713 2\n      %15842 = OpCompositeConstruct %v4float %21452 %10847 %7841 %15913\n      %10237 = OpCompositeExtract %uint %10945 3\n      %13590 = OpCompositeConstruct %v3uint %10237 %10237 %10237\n      %11034 = OpShiftRightLogical %v3uint %13590 %2996\n      %24049 = OpBitwiseAnd %v3uint %11034 %261\n      %18607 = OpBitwiseAnd %v3uint %11034 %1126\n      %23451 = OpShiftRightLogical %v3uint %24049 %2828\n      %16596 = OpIEqual %v3bool %23451 %2578\n      %11350 = OpExtInst %v3int %1 FindUMsb %18607\n      %10784 = OpBitcast %v3uint %11350\n       %6277 = OpISub %v3uint %2828 %10784\n       %8731 = OpIAdd %v3uint %10784 %2360\n      %10362 = OpSelect %v3uint %16596 %8731 %23451\n      %23263 = OpShiftLeftLogical %v3uint %18607 %6277\n      %18853 = OpBitwiseAnd %v3uint %23263 %1126\n      %10934 = OpSelect %v3uint %16596 %18853 %18607\n      %24580 = OpIAdd %v3uint %10362 %1018\n      %20362 = OpShiftLeftLogical %v3uint %24580 %393\n      %16305 = OpShiftLeftLogical %v3uint %10934 %141\n      %22407 = OpBitwiseOr %v3uint %20362 %16305\n      %13835 = OpIEqual %v3bool %24049 %2578\n      %16973 = OpSelect %v3uint %13835 %2578 %22407\n      %10714 = OpBitcast %v3float %16973\n      %19375 = OpShiftRightLogical %uint %10237 %uint_30\n      %18457 = OpConvertUToF %float %19375\n      %15914 = OpFMul %float %18457 %float_0_333333343\n      %21453 = OpCompositeExtract %float %10714 0\n      %10848 = OpCompositeExtract %float %10714 1\n      %11035 = OpCompositeExtract %float %10714 2\n       %9045 = OpCompositeConstruct %v4float %21453 %10848 %11035 %15914\n               OpBranch %16226\n       %7359 = OpLabel\n      %22212 = OpCompositeExtract %uint %10945 0\n      %20241 = OpCompositeConstruct %v4uint %22212 %22212 %22212 %22212\n       %9384 = OpShiftRightLogical %v4uint %20241 %845\n      %18867 = OpBitwiseAnd %v4uint %9384 %635\n      %15549 = OpConvertUToF %v4float %18867\n      %16694 = OpFMul %v4float %15549 %2798\n      %23768 = OpCompositeExtract %uint %10945 1\n      %20819 = OpCompositeConstruct %v4uint %23768 %23768 %23768 %23768\n       %9385 = OpShiftRightLogical %v4uint %20819 %845\n      %18868 = OpBitwiseAnd %v4uint %9385 %635\n      %15550 = OpConvertUToF %v4float %18868\n      %16695 = OpFMul %v4float %15550 %2798\n      %23769 = OpCompositeExtract %uint %10945 2\n      %20820 = OpCompositeConstruct %v4uint %23769 %23769 %23769 %23769\n       %9386 = OpShiftRightLogical %v4uint %20820 %845\n      %18869 = OpBitwiseAnd %v4uint %9386 %635\n      %15551 = OpConvertUToF %v4float %18869\n      %16696 = OpFMul %v4float %15551 %2798\n      %23770 = OpCompositeExtract %uint %10945 3\n      %20821 = OpCompositeConstruct %v4uint %23770 %23770 %23770 %23770\n       %9387 = OpShiftRightLogical %v4uint %20821 %845\n      %18870 = OpBitwiseAnd %v4uint %9387 %635\n      %18737 = OpConvertUToF %v4float %18870\n       %9889 = OpFMul %v4float %18737 %2798\n               OpBranch %16226\n      %14587 = OpLabel\n      %22213 = OpCompositeExtract %uint %10945 0\n      %20242 = OpCompositeConstruct %v4uint %22213 %22213 %22213 %22213\n       %9388 = OpShiftRightLogical %v4uint %20242 %653\n      %19038 = OpBitwiseAnd %v4uint %9388 %1611\n      %13992 = OpConvertUToF %v4float %19038\n      %19241 = OpVectorTimesScalar %v4float %13992 %float_0_00392156886\n       %8613 = OpCompositeExtract %uint %10945 1\n      %24849 = OpCompositeConstruct %v4uint %8613 %8613 %8613 %8613\n       %9389 = OpShiftRightLogical %v4uint %24849 %653\n      %19039 = OpBitwiseAnd %v4uint %9389 %1611\n      %13993 = OpConvertUToF %v4float %19039\n      %19242 = OpVectorTimesScalar %v4float %13993 %float_0_00392156886\n       %8614 = OpCompositeExtract %uint %10945 2\n      %24850 = OpCompositeConstruct %v4uint %8614 %8614 %8614 %8614\n       %9390 = OpShiftRightLogical %v4uint %24850 %653\n      %19040 = OpBitwiseAnd %v4uint %9390 %1611\n      %13994 = OpConvertUToF %v4float %19040\n      %19243 = OpVectorTimesScalar %v4float %13994 %float_0_00392156886\n       %8615 = OpCompositeExtract %uint %10945 3\n      %24851 = OpCompositeConstruct %v4uint %8615 %8615 %8615 %8615\n       %9391 = OpShiftRightLogical %v4uint %24851 %653\n      %19041 = OpBitwiseAnd %v4uint %9391 %1611\n      %17180 = OpConvertUToF %v4float %19041\n      %12436 = OpVectorTimesScalar %v4float %17180 %float_0_00392156886\n               OpBranch %16226\n      %19453 = OpLabel\n      %12432 = OpCompositeExtract %uint %10945 0\n      %20464 = OpBitcast %float %12432\n      %17212 = OpCompositeConstruct %v2float %20464 %float_0\n      %11670 = OpVectorShuffle %v4float %17212 %17212 0 1 1 1\n      %22199 = OpCompositeExtract %uint %10945 1\n      %16238 = OpBitcast %float %22199\n      %17213 = OpCompositeConstruct %v2float %16238 %float_0\n      %11671 = OpVectorShuffle %v4float %17213 %17213 0 1 1 1\n      %22200 = OpCompositeExtract %uint %10945 2\n      %16239 = OpBitcast %float %22200\n      %17214 = OpCompositeConstruct %v2float %16239 %float_0\n      %11672 = OpVectorShuffle %v4float %17214 %17214 0 1 1 1\n      %22201 = OpCompositeExtract %uint %10945 3\n      %16240 = OpBitcast %float %22201\n      %20400 = OpCompositeConstruct %v2float %16240 %float_0\n      %23100 = OpVectorShuffle %v4float %20400 %20400 0 1 1 1\n               OpBranch %16226\n      %16226 = OpLabel\n      %11181 = OpPhi %v4float %23100 %19453 %12436 %14587 %9889 %7359 %9045 %7358 %9044 %8192 %9043 %8247\n      %14350 = OpPhi %v4float %11672 %19453 %19243 %14587 %16696 %7359 %15842 %7358 %16678 %8192 %14618 %8247\n      %15233 = OpPhi %v4float %11671 %19453 %19242 %14587 %16695 %7359 %15841 %7358 %16677 %8192 %14617 %8247\n      %14522 = OpPhi %v4float %11670 %19453 %19241 %14587 %16694 %7359 %15840 %7358 %16676 %8192 %14616 %8247\n               OpBranch %21265\n      %15207 = OpLabel\n      %21586 = OpIEqual %bool %6555 %uint_8\n               OpSelectionMerge %20263 DontFlatten\n               OpBranchConditional %21586 %6596 %8964\n       %8964 = OpLabel\n      %22069 = OpShiftRightLogical %uint %20988 %int_2\n      %13379 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22069\n      %12624 = OpLoad %uint %13379\n      %11716 = OpIAdd %uint %22069 %uint_1\n       %6415 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11716\n       %7032 = OpLoad %uint %6415\n       %8522 = OpIAdd %uint %20988 %6555\n      %21675 = OpShiftRightLogical %uint %8522 %int_2\n      %19609 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21675\n      %12625 = OpLoad %uint %19609\n      %11717 = OpIAdd %uint %21675 %uint_1\n      %24581 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11717\n      %14158 = OpLoad %uint %24581\n      %19673 = OpCompositeConstruct %v4uint %12624 %7032 %12625 %14158\n      %19501 = OpIMul %uint %uint_2 %6555\n      %10823 = OpIAdd %uint %20988 %19501\n      %17900 = OpShiftRightLogical %uint %10823 %int_2\n      %19610 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17900\n      %12626 = OpLoad %uint %19610\n      %11718 = OpIAdd %uint %17900 %uint_1\n       %6477 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11718\n      %24157 = OpLoad %uint %6477\n       %8693 = OpIMul %uint %uint_3 %6555\n      %24262 = OpIAdd %uint %20988 %8693\n      %17901 = OpShiftRightLogical %uint %24262 %int_2\n      %19611 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17901\n      %12627 = OpLoad %uint %19611\n      %11719 = OpIAdd %uint %17901 %uint_1\n      %24582 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11719\n      %16386 = OpLoad %uint %24582\n      %20790 = OpCompositeConstruct %v4uint %12626 %24157 %12627 %16386\n               OpBranch %20263\n       %6596 = OpLabel\n      %24491 = OpShiftRightLogical %uint %20988 %int_2\n      %13380 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24491\n      %12628 = OpLoad %uint %13380\n      %11720 = OpIAdd %uint %24491 %uint_1\n       %6416 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11720\n      %23664 = OpLoad %uint %6416\n      %11721 = OpIAdd %uint %24491 %uint_2\n       %6417 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11721\n      %23665 = OpLoad %uint %6417\n      %11722 = OpIAdd %uint %24491 %uint_3\n      %24583 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11722\n      %14082 = OpLoad %uint %24583\n      %21618 = OpCompositeConstruct %v4uint %12628 %23664 %23665 %14082\n      %19333 = OpIAdd %uint %20988 %uint_16\n       %8239 = OpShiftRightLogical %uint %19333 %int_2\n      %19612 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %8239\n      %12629 = OpLoad %uint %19612\n      %11723 = OpIAdd %uint %8239 %uint_1\n       %6418 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11723\n      %23666 = OpLoad %uint %6418\n      %11724 = OpIAdd %uint %8239 %uint_2\n       %6419 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11724\n      %23667 = OpLoad %uint %6419\n      %11725 = OpIAdd %uint %8239 %uint_3\n      %24584 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11725\n      %16387 = OpLoad %uint %24584\n      %20791 = OpCompositeConstruct %v4uint %12629 %23666 %23667 %16387\n               OpBranch %20263\n      %20263 = OpLabel\n      %11215 = OpPhi %v4uint %20791 %6596 %20790 %8964\n      %14114 = OpPhi %v4uint %21618 %6596 %19673 %8964\n               OpSelectionMerge %20264 None\n               OpSwitch %8576 %20312 5 %8538 7 %8248\n       %8248 = OpLabel\n      %24414 = OpCompositeExtract %uint %14114 0\n      %24684 = OpExtInst %v2float %1 UnpackHalf2x16 %24414\n      %10110 = OpCompositeExtract %float %24684 0\n      %16064 = OpCompositeExtract %float %24684 1\n      %17033 = OpCompositeExtract %uint %14114 1\n      %15613 = OpExtInst %v2float %1 UnpackHalf2x16 %17033\n      %10111 = OpCompositeExtract %float %15613 0\n      %17493 = OpCompositeExtract %float %15613 1\n      %14619 = OpCompositeConstruct %v4float %10110 %16064 %10111 %17493\n      %17289 = OpCompositeExtract %uint %14114 2\n      %18042 = OpExtInst %v2float %1 UnpackHalf2x16 %17289\n      %10112 = OpCompositeExtract %float %18042 0\n      %16065 = OpCompositeExtract %float %18042 1\n      %17034 = OpCompositeExtract %uint %14114 3\n      %15614 = OpExtInst %v2float %1 UnpackHalf2x16 %17034\n      %10113 = OpCompositeExtract %float %15614 0\n      %17494 = OpCompositeExtract %float %15614 1\n      %14620 = OpCompositeConstruct %v4float %10112 %16065 %10113 %17494\n      %17290 = OpCompositeExtract %uint %11215 0\n      %18043 = OpExtInst %v2float %1 UnpackHalf2x16 %17290\n      %10114 = OpCompositeExtract %float %18043 0\n      %16066 = OpCompositeExtract %float %18043 1\n      %17035 = OpCompositeExtract %uint %11215 1\n      %15615 = OpExtInst %v2float %1 UnpackHalf2x16 %17035\n      %10115 = OpCompositeExtract %float %15615 0\n      %17495 = OpCompositeExtract %float %15615 1\n      %14621 = OpCompositeConstruct %v4float %10114 %16066 %10115 %17495\n      %17291 = OpCompositeExtract %uint %11215 2\n      %18044 = OpExtInst %v2float %1 UnpackHalf2x16 %17291\n      %10116 = OpCompositeExtract %float %18044 0\n      %16067 = OpCompositeExtract %float %18044 1\n      %17036 = OpCompositeExtract %uint %11215 3\n      %15616 = OpExtInst %v2float %1 UnpackHalf2x16 %17036\n      %10117 = OpCompositeExtract %float %15616 0\n      %20675 = OpCompositeExtract %float %15616 1\n       %9046 = OpCompositeConstruct %v4float %10116 %16067 %10117 %20675\n               OpBranch %20264\n       %8538 = OpLabel\n       %9725 = OpVectorShuffle %v2uint %14114 %14114 0 1\n      %23358 = OpBitcast %v2int %9725\n      %24790 = OpVectorShuffle %v4int %23358 %23358 0 0 1 1\n      %18608 = OpShiftLeftLogical %v4int %24790 %290\n      %15765 = OpShiftRightArithmetic %v4int %18608 %770\n      %10935 = OpConvertSToF %v4float %15765\n      %18220 = OpVectorTimesScalar %v4float %10935 %float_0_000976592302\n      %25239 = OpExtInst %v4float %1 FMax %1284 %18220\n      %14193 = OpVectorShuffle %v2uint %14114 %14114 2 3\n       %9413 = OpBitcast %v2int %14193\n      %24791 = OpVectorShuffle %v4int %9413 %9413 0 0 1 1\n      %18609 = OpShiftLeftLogical %v4int %24791 %290\n      %15766 = OpShiftRightArithmetic %v4int %18609 %770\n      %10936 = OpConvertSToF %v4float %15766\n      %18221 = OpVectorTimesScalar %v4float %10936 %float_0_000976592302\n      %25240 = OpExtInst %v4float %1 FMax %1284 %18221\n      %14194 = OpVectorShuffle %v2uint %11215 %11215 0 1\n       %9414 = OpBitcast %v2int %14194\n      %24792 = OpVectorShuffle %v4int %9414 %9414 0 0 1 1\n      %18610 = OpShiftLeftLogical %v4int %24792 %290\n      %15767 = OpShiftRightArithmetic %v4int %18610 %770\n      %10937 = OpConvertSToF %v4float %15767\n      %18222 = OpVectorTimesScalar %v4float %10937 %float_0_000976592302\n      %25241 = OpExtInst %v4float %1 FMax %1284 %18222\n      %14195 = OpVectorShuffle %v2uint %11215 %11215 2 3\n       %9415 = OpBitcast %v2int %14195\n      %24793 = OpVectorShuffle %v4int %9415 %9415 0 0 1 1\n      %18611 = OpShiftLeftLogical %v4int %24793 %290\n      %15768 = OpShiftRightArithmetic %v4int %18611 %770\n      %10938 = OpConvertSToF %v4float %15768\n      %21441 = OpVectorTimesScalar %v4float %10938 %float_0_000976592302\n      %17252 = OpExtInst %v4float %1 FMax %1284 %21441\n               OpBranch %20264\n      %20312 = OpLabel\n       %9763 = OpVectorShuffle %v2uint %14114 %14114 0 1\n      %20827 = OpBitcast %v2float %9763\n       %7044 = OpCompositeExtract %float %20827 0\n      %13424 = OpCompositeExtract %float %20827 1\n      %17022 = OpCompositeConstruct %v4float %7044 %13424 %float_0 %float_0\n      %16862 = OpVectorShuffle %v2uint %14114 %14114 2 3\n      %14179 = OpBitcast %v2float %16862\n       %7045 = OpCompositeExtract %float %14179 0\n      %13425 = OpCompositeExtract %float %14179 1\n      %17023 = OpCompositeConstruct %v4float %7045 %13425 %float_0 %float_0\n      %16863 = OpVectorShuffle %v2uint %11215 %11215 0 1\n      %14180 = OpBitcast %v2float %16863\n       %7046 = OpCompositeExtract %float %14180 0\n      %13426 = OpCompositeExtract %float %14180 1\n      %17024 = OpCompositeConstruct %v4float %7046 %13426 %float_0 %float_0\n      %16864 = OpVectorShuffle %v2uint %11215 %11215 2 3\n      %14181 = OpBitcast %v2float %16864\n       %7047 = OpCompositeExtract %float %14181 0\n      %16650 = OpCompositeExtract %float %14181 1\n       %9047 = OpCompositeConstruct %v4float %7047 %16650 %float_0 %float_0\n               OpBranch %20264\n      %20264 = OpLabel\n      %11182 = OpPhi %v4float %9047 %20312 %17252 %8538 %9046 %8248\n      %14351 = OpPhi %v4float %17024 %20312 %25241 %8538 %14621 %8248\n      %15234 = OpPhi %v4float %17023 %20312 %25240 %8538 %14620 %8248\n      %14523 = OpPhi %v4float %17022 %20312 %25239 %8538 %14619 %8248\n               OpBranch %21265\n      %21265 = OpLabel\n      %11183 = OpPhi %v4float %11182 %20264 %11181 %16226\n      %14352 = OpPhi %v4float %14351 %20264 %14350 %16226\n      %12950 = OpPhi %v4float %15234 %20264 %15233 %16226\n      %13947 = OpPhi %v4float %14523 %20264 %14522 %16226\n      %17242 = OpFAdd %v4float %17241 %13947\n      %23298 = OpFAdd %v4float %23297 %12950\n       %7208 = OpFAdd %v4float %8082 %14352\n       %9642 = OpFAdd %v4float %20755 %11183\n      %16376 = OpIAdd %uint %8114 %14258\n               OpSelectionMerge %21266 DontFlatten\n               OpBranchConditional %23279 %15208 %16572\n      %16572 = OpLabel\n      %19166 = OpIEqual %bool %6555 %uint_4\n               OpSelectionMerge %20300 DontFlatten\n               OpBranchConditional %19166 %6597 %8965\n       %8965 = OpLabel\n      %22070 = OpShiftRightLogical %uint %16376 %int_2\n      %13381 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22070\n      %15063 = OpLoad %uint %13381\n       %8523 = OpIAdd %uint %16376 %6555\n      %21676 = OpShiftRightLogical %uint %8523 %int_2\n      %19683 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21676\n      %13120 = OpLoad %uint %19683\n       %8694 = OpIMul %uint %uint_2 %6555\n      %24263 = OpIAdd %uint %16376 %8694\n      %17902 = OpShiftRightLogical %uint %24263 %int_2\n      %19684 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17902\n      %13121 = OpLoad %uint %19684\n       %8695 = OpIMul %uint %uint_3 %6555\n      %24264 = OpIAdd %uint %16376 %8695\n      %17903 = OpShiftRightLogical %uint %24264 %int_2\n      %18692 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17903\n      %24415 = OpLoad %uint %18692\n      %20792 = OpCompositeConstruct %v4uint %15063 %13120 %13121 %24415\n               OpBranch %20300\n       %6597 = OpLabel\n      %24492 = OpShiftRightLogical %uint %16376 %int_2\n      %13382 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24492\n      %12630 = OpLoad %uint %13382\n      %11726 = OpIAdd %uint %24492 %uint_1\n       %6420 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11726\n      %23668 = OpLoad %uint %6420\n      %11727 = OpIAdd %uint %24492 %uint_2\n       %6421 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11727\n      %23669 = OpLoad %uint %6421\n      %11728 = OpIAdd %uint %24492 %uint_3\n      %24585 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11728\n      %16388 = OpLoad %uint %24585\n      %20793 = OpCompositeConstruct %v4uint %12630 %23668 %23669 %16388\n               OpBranch %20300\n      %20300 = OpLabel\n      %10946 = OpPhi %v4uint %20793 %6597 %20792 %8965\n               OpSelectionMerge %16227 None\n               OpSwitch %8576 %19454 0 %14588 1 %14588 2 %7361 10 %7361 3 %7360 12 %7360 4 %8193 6 %8249\n       %8249 = OpLabel\n      %24416 = OpCompositeExtract %uint %10946 0\n      %24685 = OpExtInst %v2float %1 UnpackHalf2x16 %24416\n      %10118 = OpCompositeExtract %float %24685 0\n      %17496 = OpCompositeExtract %float %24685 1\n      %14622 = OpCompositeConstruct %v4float %10118 %17496 %float_0 %float_0\n      %17292 = OpCompositeExtract %uint %10946 1\n      %18045 = OpExtInst %v2float %1 UnpackHalf2x16 %17292\n      %10119 = OpCompositeExtract %float %18045 0\n      %17497 = OpCompositeExtract %float %18045 1\n      %14623 = OpCompositeConstruct %v4float %10119 %17497 %float_0 %float_0\n      %17293 = OpCompositeExtract %uint %10946 2\n      %18046 = OpExtInst %v2float %1 UnpackHalf2x16 %17293\n      %10120 = OpCompositeExtract %float %18046 0\n      %17498 = OpCompositeExtract %float %18046 1\n      %14624 = OpCompositeConstruct %v4float %10120 %17498 %float_0 %float_0\n      %17294 = OpCompositeExtract %uint %10946 3\n      %18047 = OpExtInst %v2float %1 UnpackHalf2x16 %17294\n      %10121 = OpCompositeExtract %float %18047 0\n      %20676 = OpCompositeExtract %float %18047 1\n       %9048 = OpCompositeConstruct %v4float %10121 %20676 %float_0 %float_0\n               OpBranch %16227\n       %8193 = OpLabel\n      %12433 = OpCompositeExtract %uint %10946 0\n      %22688 = OpBitcast %int %12433\n      %18223 = OpCompositeConstruct %v2int %22688 %22688\n      %18361 = OpShiftLeftLogical %v2int %18223 %1959\n      %13347 = OpShiftRightArithmetic %v2int %18361 %2151\n      %10939 = OpConvertSToF %v2float %13347\n      %18259 = OpVectorTimesScalar %v2float %10939 %float_0_000976592302\n      %24082 = OpExtInst %v2float %1 FMax %73 %18259\n      %24342 = OpCompositeExtract %float %24082 0\n      %15581 = OpCompositeExtract %float %24082 1\n      %16679 = OpCompositeConstruct %v4float %24342 %15581 %float_0 %float_0\n      %19531 = OpCompositeExtract %uint %10946 1\n      %16042 = OpBitcast %int %19531\n      %18224 = OpCompositeConstruct %v2int %16042 %16042\n      %18362 = OpShiftLeftLogical %v2int %18224 %1959\n      %13348 = OpShiftRightArithmetic %v2int %18362 %2151\n      %10940 = OpConvertSToF %v2float %13348\n      %18260 = OpVectorTimesScalar %v2float %10940 %float_0_000976592302\n      %24083 = OpExtInst %v2float %1 FMax %73 %18260\n      %24343 = OpCompositeExtract %float %24083 0\n      %15582 = OpCompositeExtract %float %24083 1\n      %16680 = OpCompositeConstruct %v4float %24343 %15582 %float_0 %float_0\n      %19532 = OpCompositeExtract %uint %10946 2\n      %16043 = OpBitcast %int %19532\n      %18225 = OpCompositeConstruct %v2int %16043 %16043\n      %18364 = OpShiftLeftLogical %v2int %18225 %1959\n      %13349 = OpShiftRightArithmetic %v2int %18364 %2151\n      %10941 = OpConvertSToF %v2float %13349\n      %18261 = OpVectorTimesScalar %v2float %10941 %float_0_000976592302\n      %24084 = OpExtInst %v2float %1 FMax %73 %18261\n      %24344 = OpCompositeExtract %float %24084 0\n      %15583 = OpCompositeExtract %float %24084 1\n      %16681 = OpCompositeConstruct %v4float %24344 %15583 %float_0 %float_0\n      %19533 = OpCompositeExtract %uint %10946 3\n      %16044 = OpBitcast %int %19533\n      %18226 = OpCompositeConstruct %v2int %16044 %16044\n      %18365 = OpShiftLeftLogical %v2int %18226 %1959\n      %13350 = OpShiftRightArithmetic %v2int %18365 %2151\n      %10942 = OpConvertSToF %v2float %13350\n      %18262 = OpVectorTimesScalar %v2float %10942 %float_0_000976592302\n      %24085 = OpExtInst %v2float %1 FMax %73 %18262\n      %24345 = OpCompositeExtract %float %24085 0\n      %18767 = OpCompositeExtract %float %24085 1\n       %9049 = OpCompositeConstruct %v4float %24345 %18767 %float_0 %float_0\n               OpBranch %16227\n       %7360 = OpLabel\n      %22214 = OpCompositeExtract %uint %10946 0\n      %20243 = OpCompositeConstruct %v3uint %22214 %22214 %22214\n      %11036 = OpShiftRightLogical %v3uint %20243 %2996\n      %24050 = OpBitwiseAnd %v3uint %11036 %261\n      %18612 = OpBitwiseAnd %v3uint %11036 %1126\n      %23452 = OpShiftRightLogical %v3uint %24050 %2828\n      %16597 = OpIEqual %v3bool %23452 %2578\n      %11351 = OpExtInst %v3int %1 FindUMsb %18612\n      %10785 = OpBitcast %v3uint %11351\n       %6278 = OpISub %v3uint %2828 %10785\n       %8732 = OpIAdd %v3uint %10785 %2360\n      %10363 = OpSelect %v3uint %16597 %8732 %23452\n      %23264 = OpShiftLeftLogical %v3uint %18612 %6278\n      %18854 = OpBitwiseAnd %v3uint %23264 %1126\n      %10947 = OpSelect %v3uint %16597 %18854 %18612\n      %24586 = OpIAdd %v3uint %10363 %1018\n      %20363 = OpShiftLeftLogical %v3uint %24586 %393\n      %16306 = OpShiftLeftLogical %v3uint %10947 %141\n      %22408 = OpBitwiseOr %v3uint %20363 %16306\n      %13836 = OpIEqual %v3bool %24050 %2578\n      %16974 = OpSelect %v3uint %13836 %2578 %22408\n      %10715 = OpBitcast %v3float %16974\n      %19376 = OpShiftRightLogical %uint %22214 %uint_30\n      %18458 = OpConvertUToF %float %19376\n      %15915 = OpFMul %float %18458 %float_0_333333343\n      %21454 = OpCompositeExtract %float %10715 0\n      %10849 = OpCompositeExtract %float %10715 1\n       %7842 = OpCompositeExtract %float %10715 2\n      %15843 = OpCompositeConstruct %v4float %21454 %10849 %7842 %15915\n      %10238 = OpCompositeExtract %uint %10946 1\n      %13591 = OpCompositeConstruct %v3uint %10238 %10238 %10238\n      %11037 = OpShiftRightLogical %v3uint %13591 %2996\n      %24051 = OpBitwiseAnd %v3uint %11037 %261\n      %18613 = OpBitwiseAnd %v3uint %11037 %1126\n      %23453 = OpShiftRightLogical %v3uint %24051 %2828\n      %16598 = OpIEqual %v3bool %23453 %2578\n      %11352 = OpExtInst %v3int %1 FindUMsb %18613\n      %10786 = OpBitcast %v3uint %11352\n       %6279 = OpISub %v3uint %2828 %10786\n       %8733 = OpIAdd %v3uint %10786 %2360\n      %10364 = OpSelect %v3uint %16598 %8733 %23453\n      %23265 = OpShiftLeftLogical %v3uint %18613 %6279\n      %18855 = OpBitwiseAnd %v3uint %23265 %1126\n      %10948 = OpSelect %v3uint %16598 %18855 %18613\n      %24587 = OpIAdd %v3uint %10364 %1018\n      %20364 = OpShiftLeftLogical %v3uint %24587 %393\n      %16307 = OpShiftLeftLogical %v3uint %10948 %141\n      %22409 = OpBitwiseOr %v3uint %20364 %16307\n      %13837 = OpIEqual %v3bool %24051 %2578\n      %16975 = OpSelect %v3uint %13837 %2578 %22409\n      %10716 = OpBitcast %v3float %16975\n      %19377 = OpShiftRightLogical %uint %10238 %uint_30\n      %18459 = OpConvertUToF %float %19377\n      %15916 = OpFMul %float %18459 %float_0_333333343\n      %21455 = OpCompositeExtract %float %10716 0\n      %10850 = OpCompositeExtract %float %10716 1\n       %7843 = OpCompositeExtract %float %10716 2\n      %15844 = OpCompositeConstruct %v4float %21455 %10850 %7843 %15916\n      %10239 = OpCompositeExtract %uint %10946 2\n      %13592 = OpCompositeConstruct %v3uint %10239 %10239 %10239\n      %11038 = OpShiftRightLogical %v3uint %13592 %2996\n      %24052 = OpBitwiseAnd %v3uint %11038 %261\n      %18614 = OpBitwiseAnd %v3uint %11038 %1126\n      %23454 = OpShiftRightLogical %v3uint %24052 %2828\n      %16599 = OpIEqual %v3bool %23454 %2578\n      %11353 = OpExtInst %v3int %1 FindUMsb %18614\n      %10787 = OpBitcast %v3uint %11353\n       %6280 = OpISub %v3uint %2828 %10787\n       %8734 = OpIAdd %v3uint %10787 %2360\n      %10365 = OpSelect %v3uint %16599 %8734 %23454\n      %23266 = OpShiftLeftLogical %v3uint %18614 %6280\n      %18856 = OpBitwiseAnd %v3uint %23266 %1126\n      %10949 = OpSelect %v3uint %16599 %18856 %18614\n      %24588 = OpIAdd %v3uint %10365 %1018\n      %20365 = OpShiftLeftLogical %v3uint %24588 %393\n      %16308 = OpShiftLeftLogical %v3uint %10949 %141\n      %22410 = OpBitwiseOr %v3uint %20365 %16308\n      %13838 = OpIEqual %v3bool %24052 %2578\n      %16976 = OpSelect %v3uint %13838 %2578 %22410\n      %10717 = OpBitcast %v3float %16976\n      %19378 = OpShiftRightLogical %uint %10239 %uint_30\n      %18460 = OpConvertUToF %float %19378\n      %15917 = OpFMul %float %18460 %float_0_333333343\n      %21456 = OpCompositeExtract %float %10717 0\n      %10851 = OpCompositeExtract %float %10717 1\n       %7844 = OpCompositeExtract %float %10717 2\n      %15845 = OpCompositeConstruct %v4float %21456 %10851 %7844 %15917\n      %10240 = OpCompositeExtract %uint %10946 3\n      %13593 = OpCompositeConstruct %v3uint %10240 %10240 %10240\n      %11039 = OpShiftRightLogical %v3uint %13593 %2996\n      %24053 = OpBitwiseAnd %v3uint %11039 %261\n      %18616 = OpBitwiseAnd %v3uint %11039 %1126\n      %23455 = OpShiftRightLogical %v3uint %24053 %2828\n      %16600 = OpIEqual %v3bool %23455 %2578\n      %11354 = OpExtInst %v3int %1 FindUMsb %18616\n      %10788 = OpBitcast %v3uint %11354\n       %6281 = OpISub %v3uint %2828 %10788\n       %8735 = OpIAdd %v3uint %10788 %2360\n      %10366 = OpSelect %v3uint %16600 %8735 %23455\n      %23267 = OpShiftLeftLogical %v3uint %18616 %6281\n      %18857 = OpBitwiseAnd %v3uint %23267 %1126\n      %10950 = OpSelect %v3uint %16600 %18857 %18616\n      %24589 = OpIAdd %v3uint %10366 %1018\n      %20366 = OpShiftLeftLogical %v3uint %24589 %393\n      %16309 = OpShiftLeftLogical %v3uint %10950 %141\n      %22411 = OpBitwiseOr %v3uint %20366 %16309\n      %13839 = OpIEqual %v3bool %24053 %2578\n      %16977 = OpSelect %v3uint %13839 %2578 %22411\n      %10718 = OpBitcast %v3float %16977\n      %19379 = OpShiftRightLogical %uint %10240 %uint_30\n      %18461 = OpConvertUToF %float %19379\n      %15918 = OpFMul %float %18461 %float_0_333333343\n      %21457 = OpCompositeExtract %float %10718 0\n      %10852 = OpCompositeExtract %float %10718 1\n      %11040 = OpCompositeExtract %float %10718 2\n       %9050 = OpCompositeConstruct %v4float %21457 %10852 %11040 %15918\n               OpBranch %16227\n       %7361 = OpLabel\n      %22215 = OpCompositeExtract %uint %10946 0\n      %20244 = OpCompositeConstruct %v4uint %22215 %22215 %22215 %22215\n       %9392 = OpShiftRightLogical %v4uint %20244 %845\n      %18871 = OpBitwiseAnd %v4uint %9392 %635\n      %15552 = OpConvertUToF %v4float %18871\n      %16697 = OpFMul %v4float %15552 %2798\n      %23771 = OpCompositeExtract %uint %10946 1\n      %20822 = OpCompositeConstruct %v4uint %23771 %23771 %23771 %23771\n       %9393 = OpShiftRightLogical %v4uint %20822 %845\n      %18872 = OpBitwiseAnd %v4uint %9393 %635\n      %15553 = OpConvertUToF %v4float %18872\n      %16698 = OpFMul %v4float %15553 %2798\n      %23772 = OpCompositeExtract %uint %10946 2\n      %20823 = OpCompositeConstruct %v4uint %23772 %23772 %23772 %23772\n       %9394 = OpShiftRightLogical %v4uint %20823 %845\n      %18873 = OpBitwiseAnd %v4uint %9394 %635\n      %15554 = OpConvertUToF %v4float %18873\n      %16699 = OpFMul %v4float %15554 %2798\n      %23773 = OpCompositeExtract %uint %10946 3\n      %20828 = OpCompositeConstruct %v4uint %23773 %23773 %23773 %23773\n       %9395 = OpShiftRightLogical %v4uint %20828 %845\n      %18874 = OpBitwiseAnd %v4uint %9395 %635\n      %18738 = OpConvertUToF %v4float %18874\n       %9890 = OpFMul %v4float %18738 %2798\n               OpBranch %16227\n      %14588 = OpLabel\n      %22216 = OpCompositeExtract %uint %10946 0\n      %20245 = OpCompositeConstruct %v4uint %22216 %22216 %22216 %22216\n       %9396 = OpShiftRightLogical %v4uint %20245 %653\n      %19042 = OpBitwiseAnd %v4uint %9396 %1611\n      %13995 = OpConvertUToF %v4float %19042\n      %19244 = OpVectorTimesScalar %v4float %13995 %float_0_00392156886\n       %8616 = OpCompositeExtract %uint %10946 1\n      %24852 = OpCompositeConstruct %v4uint %8616 %8616 %8616 %8616\n       %9397 = OpShiftRightLogical %v4uint %24852 %653\n      %19043 = OpBitwiseAnd %v4uint %9397 %1611\n      %13996 = OpConvertUToF %v4float %19043\n      %19245 = OpVectorTimesScalar %v4float %13996 %float_0_00392156886\n       %8617 = OpCompositeExtract %uint %10946 2\n      %24853 = OpCompositeConstruct %v4uint %8617 %8617 %8617 %8617\n       %9398 = OpShiftRightLogical %v4uint %24853 %653\n      %19044 = OpBitwiseAnd %v4uint %9398 %1611\n      %13997 = OpConvertUToF %v4float %19044\n      %19246 = OpVectorTimesScalar %v4float %13997 %float_0_00392156886\n       %8618 = OpCompositeExtract %uint %10946 3\n      %24854 = OpCompositeConstruct %v4uint %8618 %8618 %8618 %8618\n       %9399 = OpShiftRightLogical %v4uint %24854 %653\n      %19045 = OpBitwiseAnd %v4uint %9399 %1611\n      %17181 = OpConvertUToF %v4float %19045\n      %12437 = OpVectorTimesScalar %v4float %17181 %float_0_00392156886\n               OpBranch %16227\n      %19454 = OpLabel\n      %12438 = OpCompositeExtract %uint %10946 0\n      %20465 = OpBitcast %float %12438\n      %17215 = OpCompositeConstruct %v2float %20465 %float_0\n      %11673 = OpVectorShuffle %v4float %17215 %17215 0 1 1 1\n      %22202 = OpCompositeExtract %uint %10946 1\n      %16241 = OpBitcast %float %22202\n      %17216 = OpCompositeConstruct %v2float %16241 %float_0\n      %11674 = OpVectorShuffle %v4float %17216 %17216 0 1 1 1\n      %22203 = OpCompositeExtract %uint %10946 2\n      %16242 = OpBitcast %float %22203\n      %17217 = OpCompositeConstruct %v2float %16242 %float_0\n      %11675 = OpVectorShuffle %v4float %17217 %17217 0 1 1 1\n      %22204 = OpCompositeExtract %uint %10946 3\n      %16243 = OpBitcast %float %22204\n      %20401 = OpCompositeConstruct %v2float %16243 %float_0\n      %23101 = OpVectorShuffle %v4float %20401 %20401 0 1 1 1\n               OpBranch %16227\n      %16227 = OpLabel\n      %11184 = OpPhi %v4float %23101 %19454 %12437 %14588 %9890 %7361 %9050 %7360 %9049 %8193 %9048 %8249\n      %14353 = OpPhi %v4float %11675 %19454 %19246 %14588 %16699 %7361 %15845 %7360 %16681 %8193 %14624 %8249\n      %15235 = OpPhi %v4float %11674 %19454 %19245 %14588 %16698 %7361 %15844 %7360 %16680 %8193 %14623 %8249\n      %14524 = OpPhi %v4float %11673 %19454 %19244 %14588 %16697 %7361 %15843 %7360 %16679 %8193 %14622 %8249\n               OpBranch %21266\n      %15208 = OpLabel\n      %21587 = OpIEqual %bool %6555 %uint_8\n               OpSelectionMerge %20265 DontFlatten\n               OpBranchConditional %21587 %6598 %8966\n       %8966 = OpLabel\n      %22071 = OpShiftRightLogical %uint %16376 %int_2\n      %13383 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22071\n      %12631 = OpLoad %uint %13383\n      %11729 = OpIAdd %uint %22071 %uint_1\n       %6422 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11729\n       %7033 = OpLoad %uint %6422\n       %8524 = OpIAdd %uint %16376 %6555\n      %21677 = OpShiftRightLogical %uint %8524 %int_2\n      %19613 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21677\n      %12632 = OpLoad %uint %19613\n      %11730 = OpIAdd %uint %21677 %uint_1\n      %24590 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11730\n      %14159 = OpLoad %uint %24590\n      %19674 = OpCompositeConstruct %v4uint %12631 %7033 %12632 %14159\n      %19502 = OpIMul %uint %uint_2 %6555\n      %10824 = OpIAdd %uint %16376 %19502\n      %17904 = OpShiftRightLogical %uint %10824 %int_2\n      %19614 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17904\n      %12633 = OpLoad %uint %19614\n      %11731 = OpIAdd %uint %17904 %uint_1\n       %6478 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11731\n      %24158 = OpLoad %uint %6478\n       %8696 = OpIMul %uint %uint_3 %6555\n      %24265 = OpIAdd %uint %16376 %8696\n      %17905 = OpShiftRightLogical %uint %24265 %int_2\n      %19615 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17905\n      %12634 = OpLoad %uint %19615\n      %11732 = OpIAdd %uint %17905 %uint_1\n      %24591 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11732\n      %16389 = OpLoad %uint %24591\n      %20794 = OpCompositeConstruct %v4uint %12633 %24158 %12634 %16389\n               OpBranch %20265\n       %6598 = OpLabel\n      %24493 = OpShiftRightLogical %uint %16376 %int_2\n      %13384 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24493\n      %12635 = OpLoad %uint %13384\n      %11733 = OpIAdd %uint %24493 %uint_1\n       %6423 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11733\n      %23670 = OpLoad %uint %6423\n      %11734 = OpIAdd %uint %24493 %uint_2\n       %6424 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11734\n      %23671 = OpLoad %uint %6424\n      %11735 = OpIAdd %uint %24493 %uint_3\n      %24592 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11735\n      %14083 = OpLoad %uint %24592\n      %21619 = OpCompositeConstruct %v4uint %12635 %23670 %23671 %14083\n      %19334 = OpIAdd %uint %16376 %uint_16\n       %8240 = OpShiftRightLogical %uint %19334 %int_2\n      %19616 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %8240\n      %12636 = OpLoad %uint %19616\n      %11736 = OpIAdd %uint %8240 %uint_1\n       %6425 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11736\n      %23672 = OpLoad %uint %6425\n      %11737 = OpIAdd %uint %8240 %uint_2\n       %6426 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11737\n      %23673 = OpLoad %uint %6426\n      %11738 = OpIAdd %uint %8240 %uint_3\n      %24593 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11738\n      %16390 = OpLoad %uint %24593\n      %20795 = OpCompositeConstruct %v4uint %12636 %23672 %23673 %16390\n               OpBranch %20265\n      %20265 = OpLabel\n      %11216 = OpPhi %v4uint %20795 %6598 %20794 %8966\n      %14115 = OpPhi %v4uint %21619 %6598 %19674 %8966\n               OpSelectionMerge %20266 None\n               OpSwitch %8576 %20313 5 %8539 7 %8250\n       %8250 = OpLabel\n      %24417 = OpCompositeExtract %uint %14115 0\n      %24686 = OpExtInst %v2float %1 UnpackHalf2x16 %24417\n      %10122 = OpCompositeExtract %float %24686 0\n      %16068 = OpCompositeExtract %float %24686 1\n      %17037 = OpCompositeExtract %uint %14115 1\n      %15617 = OpExtInst %v2float %1 UnpackHalf2x16 %17037\n      %10123 = OpCompositeExtract %float %15617 0\n      %17499 = OpCompositeExtract %float %15617 1\n      %14625 = OpCompositeConstruct %v4float %10122 %16068 %10123 %17499\n      %17295 = OpCompositeExtract %uint %14115 2\n      %18048 = OpExtInst %v2float %1 UnpackHalf2x16 %17295\n      %10124 = OpCompositeExtract %float %18048 0\n      %16069 = OpCompositeExtract %float %18048 1\n      %17038 = OpCompositeExtract %uint %14115 3\n      %15618 = OpExtInst %v2float %1 UnpackHalf2x16 %17038\n      %10125 = OpCompositeExtract %float %15618 0\n      %17500 = OpCompositeExtract %float %15618 1\n      %14626 = OpCompositeConstruct %v4float %10124 %16069 %10125 %17500\n      %17296 = OpCompositeExtract %uint %11216 0\n      %18049 = OpExtInst %v2float %1 UnpackHalf2x16 %17296\n      %10126 = OpCompositeExtract %float %18049 0\n      %16070 = OpCompositeExtract %float %18049 1\n      %17039 = OpCompositeExtract %uint %11216 1\n      %15619 = OpExtInst %v2float %1 UnpackHalf2x16 %17039\n      %10127 = OpCompositeExtract %float %15619 0\n      %17501 = OpCompositeExtract %float %15619 1\n      %14627 = OpCompositeConstruct %v4float %10126 %16070 %10127 %17501\n      %17297 = OpCompositeExtract %uint %11216 2\n      %18050 = OpExtInst %v2float %1 UnpackHalf2x16 %17297\n      %10128 = OpCompositeExtract %float %18050 0\n      %16071 = OpCompositeExtract %float %18050 1\n      %17040 = OpCompositeExtract %uint %11216 3\n      %15620 = OpExtInst %v2float %1 UnpackHalf2x16 %17040\n      %10129 = OpCompositeExtract %float %15620 0\n      %20677 = OpCompositeExtract %float %15620 1\n       %9051 = OpCompositeConstruct %v4float %10128 %16071 %10129 %20677\n               OpBranch %20266\n       %8539 = OpLabel\n       %9726 = OpVectorShuffle %v2uint %14115 %14115 0 1\n      %23359 = OpBitcast %v2int %9726\n      %24794 = OpVectorShuffle %v4int %23359 %23359 0 0 1 1\n      %18617 = OpShiftLeftLogical %v4int %24794 %290\n      %15769 = OpShiftRightArithmetic %v4int %18617 %770\n      %10951 = OpConvertSToF %v4float %15769\n      %18227 = OpVectorTimesScalar %v4float %10951 %float_0_000976592302\n      %25242 = OpExtInst %v4float %1 FMax %1284 %18227\n      %14196 = OpVectorShuffle %v2uint %14115 %14115 2 3\n       %9416 = OpBitcast %v2int %14196\n      %24795 = OpVectorShuffle %v4int %9416 %9416 0 0 1 1\n      %18618 = OpShiftLeftLogical %v4int %24795 %290\n      %15770 = OpShiftRightArithmetic %v4int %18618 %770\n      %10952 = OpConvertSToF %v4float %15770\n      %18228 = OpVectorTimesScalar %v4float %10952 %float_0_000976592302\n      %25243 = OpExtInst %v4float %1 FMax %1284 %18228\n      %14197 = OpVectorShuffle %v2uint %11216 %11216 0 1\n       %9417 = OpBitcast %v2int %14197\n      %24796 = OpVectorShuffle %v4int %9417 %9417 0 0 1 1\n      %18619 = OpShiftLeftLogical %v4int %24796 %290\n      %15771 = OpShiftRightArithmetic %v4int %18619 %770\n      %10953 = OpConvertSToF %v4float %15771\n      %18229 = OpVectorTimesScalar %v4float %10953 %float_0_000976592302\n      %25244 = OpExtInst %v4float %1 FMax %1284 %18229\n      %14198 = OpVectorShuffle %v2uint %11216 %11216 2 3\n       %9418 = OpBitcast %v2int %14198\n      %24797 = OpVectorShuffle %v4int %9418 %9418 0 0 1 1\n      %18620 = OpShiftLeftLogical %v4int %24797 %290\n      %15772 = OpShiftRightArithmetic %v4int %18620 %770\n      %10954 = OpConvertSToF %v4float %15772\n      %21458 = OpVectorTimesScalar %v4float %10954 %float_0_000976592302\n      %17253 = OpExtInst %v4float %1 FMax %1284 %21458\n               OpBranch %20266\n      %20313 = OpLabel\n       %9764 = OpVectorShuffle %v2uint %14115 %14115 0 1\n      %20829 = OpBitcast %v2float %9764\n       %7048 = OpCompositeExtract %float %20829 0\n      %13427 = OpCompositeExtract %float %20829 1\n      %17041 = OpCompositeConstruct %v4float %7048 %13427 %float_0 %float_0\n      %16865 = OpVectorShuffle %v2uint %14115 %14115 2 3\n      %14182 = OpBitcast %v2float %16865\n       %7049 = OpCompositeExtract %float %14182 0\n      %13428 = OpCompositeExtract %float %14182 1\n      %17042 = OpCompositeConstruct %v4float %7049 %13428 %float_0 %float_0\n      %16866 = OpVectorShuffle %v2uint %11216 %11216 0 1\n      %14183 = OpBitcast %v2float %16866\n       %7050 = OpCompositeExtract %float %14183 0\n      %13429 = OpCompositeExtract %float %14183 1\n      %17043 = OpCompositeConstruct %v4float %7050 %13429 %float_0 %float_0\n      %16867 = OpVectorShuffle %v2uint %11216 %11216 2 3\n      %14184 = OpBitcast %v2float %16867\n       %7051 = OpCompositeExtract %float %14184 0\n      %16651 = OpCompositeExtract %float %14184 1\n       %9052 = OpCompositeConstruct %v4float %7051 %16651 %float_0 %float_0\n               OpBranch %20266\n      %20266 = OpLabel\n      %11185 = OpPhi %v4float %9052 %20313 %17253 %8539 %9051 %8250\n      %14354 = OpPhi %v4float %17043 %20313 %25244 %8539 %14627 %8250\n      %15236 = OpPhi %v4float %17042 %20313 %25243 %8539 %14626 %8250\n      %14525 = OpPhi %v4float %17041 %20313 %25242 %8539 %14625 %8250\n               OpBranch %21266\n      %21266 = OpLabel\n      %11186 = OpPhi %v4float %11185 %20266 %11184 %16227\n      %14355 = OpPhi %v4float %14354 %20266 %14353 %16227\n      %12951 = OpPhi %v4float %15236 %20266 %15235 %16227\n      %13948 = OpPhi %v4float %14525 %20266 %14524 %16227\n      %17243 = OpFAdd %v4float %17242 %13948\n      %23299 = OpFAdd %v4float %23298 %12951\n       %9507 = OpFAdd %v4float %7208 %14355\n       %7799 = OpFAdd %v4float %9642 %11186\n               OpBranch %24266\n      %24266 = OpLabel\n      %11187 = OpPhi %v4float %20755 %21264 %7799 %21266\n      %14356 = OpPhi %v4float %8082 %21264 %9507 %21266\n      %15153 = OpPhi %v4float %23297 %21264 %23299 %21266\n      %15237 = OpPhi %v4float %17241 %21264 %17243 %21266\n      %14526 = OpPhi %float %23069 %21264 %12090 %21266\n               OpBranch %21267\n      %21267 = OpLabel\n      %11188 = OpPhi %v4float %11177 %21263 %11187 %24266\n      %14357 = OpPhi %v4float %14346 %21263 %14356 %24266\n      %15154 = OpPhi %v4float %13804 %21263 %15153 %24266\n      %13196 = OpPhi %v4float %8403 %21263 %15237 %24266\n      %11944 = OpPhi %float %11052 %21263 %14526 %24266\n      %23156 = OpVectorTimesScalar %v4float %13196 %11944\n       %6604 = OpVectorTimesScalar %v4float %15154 %11944\n      %12399 = OpVectorTimesScalar %v4float %14357 %11944\n      %13362 = OpVectorTimesScalar %v4float %11188 %11944\n               OpSelectionMerge %16228 DontFlatten\n               OpBranchConditional %7475 %10049 %16228\n      %10049 = OpLabel\n      %15086 = OpVectorShuffle %v4float %23156 %23156 2 1 0 3\n      %14855 = OpVectorShuffle %v4float %6604 %6604 2 1 0 3\n       %7398 = OpVectorShuffle %v4float %12399 %12399 2 1 0 3\n      %16111 = OpVectorShuffle %v4float %13362 %13362 2 1 0 3\n               OpBranch %16228\n      %16228 = OpLabel\n      %11189 = OpPhi %v4float %13362 %21267 %16111 %10049\n      %14358 = OpPhi %v4float %12399 %21267 %7398 %10049\n      %15191 = OpPhi %v4float %6604 %21267 %14855 %10049\n      %14921 = OpPhi %v4float %23156 %21267 %15086 %10049\n               OpSelectionMerge %18834 None\n               OpSwitch %20627 %7374 3 %17906 4 %6452 5 %6451 10 %7373 15 %12647 24 %9492\n       %9492 = OpLabel\n      %15041 = OpCompositeExtract %float %14921 0\n      %10277 = OpCompositeExtract %float %15191 0\n       %7641 = OpCompositeExtract %float %14358 0\n       %6565 = OpCompositeExtract %float %11189 0\n       %7479 = OpCompositeConstruct %v4float %15041 %10277 %7641 %6565\n      %14406 = OpExtInst %v4float %1 FClamp %7479 %2938 %1285\n      %13687 = OpVectorTimesScalar %v4float %14406 %float_65535\n      %11840 = OpFAdd %v4float %13687 %325\n       %7947 = OpConvertFToU %v4uint %11840\n       %6361 = OpVectorShuffle %v2uint %7947 %7947 0 2\n      %10064 = OpVectorShuffle %v2uint %7947 %7947 1 3\n      %13638 = OpShiftLeftLogical %v2uint %10064 %2151\n      %15653 = OpBitwiseOr %v2uint %6361 %13638\n               OpBranch %18834\n      %12647 = OpLabel\n       %7311 = OpExtInst %v4float %1 FClamp %14921 %2938 %1285\n      %20339 = OpVectorTimesScalar %v4float %7311 %float_15\n      %11878 = OpFAdd %v4float %20339 %325\n       %7639 = OpConvertFToU %v4uint %11878\n       %8700 = OpCompositeExtract %uint %7639 0\n      %12251 = OpCompositeExtract %uint %7639 1\n      %11561 = OpShiftLeftLogical %uint %12251 %int_4\n      %19814 = OpBitwiseOr %uint %8700 %11561\n      %21476 = OpCompositeExtract %uint %7639 2\n       %8560 = OpShiftLeftLogical %uint %21476 %int_8\n      %19815 = OpBitwiseOr %uint %19814 %8560\n      %21477 = OpCompositeExtract %uint %7639 3\n       %7292 = OpShiftLeftLogical %uint %21477 %int_12\n       %9255 = OpBitwiseOr %uint %19815 %7292\n       %7522 = OpExtInst %v4float %1 FClamp %15191 %2938 %1285\n       %8264 = OpVectorTimesScalar %v4float %7522 %float_15\n      %11879 = OpFAdd %v4float %8264 %325\n       %7642 = OpConvertFToU %v4uint %11879\n       %8701 = OpCompositeExtract %uint %7642 0\n      %12252 = OpCompositeExtract %uint %7642 1\n      %11562 = OpShiftLeftLogical %uint %12252 %int_4\n      %19816 = OpBitwiseOr %uint %8701 %11562\n      %21478 = OpCompositeExtract %uint %7642 2\n       %8561 = OpShiftLeftLogical %uint %21478 %int_8\n      %19817 = OpBitwiseOr %uint %19816 %8561\n      %21479 = OpCompositeExtract %uint %7642 3\n      %10745 = OpShiftLeftLogical %uint %21479 %int_12\n      %19009 = OpBitwiseOr %uint %19817 %10745\n      %22729 = OpShiftLeftLogical %uint %19009 %uint_16\n       %6254 = OpBitwiseOr %uint %9255 %22729\n       %7523 = OpExtInst %v4float %1 FClamp %14358 %2938 %1285\n       %8265 = OpVectorTimesScalar %v4float %7523 %float_15\n      %11881 = OpFAdd %v4float %8265 %325\n       %7643 = OpConvertFToU %v4uint %11881\n       %8702 = OpCompositeExtract %uint %7643 0\n      %12253 = OpCompositeExtract %uint %7643 1\n      %11563 = OpShiftLeftLogical %uint %12253 %int_4\n      %19818 = OpBitwiseOr %uint %8702 %11563\n      %21480 = OpCompositeExtract %uint %7643 2\n       %8562 = OpShiftLeftLogical %uint %21480 %int_8\n      %19819 = OpBitwiseOr %uint %19818 %8562\n      %21481 = OpCompositeExtract %uint %7643 3\n       %7293 = OpShiftLeftLogical %uint %21481 %int_12\n       %9256 = OpBitwiseOr %uint %19819 %7293\n       %7524 = OpExtInst %v4float %1 FClamp %11189 %2938 %1285\n       %8266 = OpVectorTimesScalar %v4float %7524 %float_15\n      %11882 = OpFAdd %v4float %8266 %325\n       %7644 = OpConvertFToU %v4uint %11882\n       %8703 = OpCompositeExtract %uint %7644 0\n      %12254 = OpCompositeExtract %uint %7644 1\n      %11564 = OpShiftLeftLogical %uint %12254 %int_4\n      %19820 = OpBitwiseOr %uint %8703 %11564\n      %21482 = OpCompositeExtract %uint %7644 2\n       %8563 = OpShiftLeftLogical %uint %21482 %int_8\n      %19821 = OpBitwiseOr %uint %19820 %8563\n      %21483 = OpCompositeExtract %uint %7644 3\n      %10746 = OpShiftLeftLogical %uint %21483 %int_12\n      %19010 = OpBitwiseOr %uint %19821 %10746\n      %23978 = OpShiftLeftLogical %uint %19010 %uint_16\n      %17993 = OpBitwiseOr %uint %9256 %23978\n      %21469 = OpCompositeConstruct %v2uint %6254 %17993\n               OpBranch %18834\n       %7373 = OpLabel\n      %19885 = OpCompositeExtract %float %14921 0\n      %10278 = OpCompositeExtract %float %14921 1\n       %7645 = OpCompositeExtract %float %15191 0\n       %6566 = OpCompositeExtract %float %15191 1\n       %7480 = OpCompositeConstruct %v4float %19885 %10278 %7645 %6566\n      %14407 = OpExtInst %v4float %1 FClamp %7480 %2938 %1285\n      %13688 = OpVectorTimesScalar %v4float %14407 %float_255\n      %11883 = OpFAdd %v4float %13688 %325\n       %7646 = OpConvertFToU %v4uint %11883\n       %8704 = OpCompositeExtract %uint %7646 0\n      %12255 = OpCompositeExtract %uint %7646 1\n      %11565 = OpShiftLeftLogical %uint %12255 %int_8\n      %19822 = OpBitwiseOr %uint %8704 %11565\n      %21484 = OpCompositeExtract %uint %7646 2\n       %8564 = OpShiftLeftLogical %uint %21484 %int_16\n      %19823 = OpBitwiseOr %uint %19822 %8564\n      %21485 = OpCompositeExtract %uint %7646 3\n       %8565 = OpShiftLeftLogical %uint %21485 %int_24\n      %17629 = OpBitwiseOr %uint %19823 %8565\n      %20096 = OpCompositeExtract %float %14358 0\n      %23730 = OpCompositeExtract %float %14358 1\n       %7647 = OpCompositeExtract %float %11189 0\n       %6567 = OpCompositeExtract %float %11189 1\n       %7481 = OpCompositeConstruct %v4float %20096 %23730 %7647 %6567\n      %14408 = OpExtInst %v4float %1 FClamp %7481 %2938 %1285\n      %13689 = OpVectorTimesScalar %v4float %14408 %float_255\n      %11884 = OpFAdd %v4float %13689 %325\n       %7648 = OpConvertFToU %v4uint %11884\n       %8705 = OpCompositeExtract %uint %7648 0\n      %12256 = OpCompositeExtract %uint %7648 1\n      %11566 = OpShiftLeftLogical %uint %12256 %int_8\n      %19824 = OpBitwiseOr %uint %8705 %11566\n      %21486 = OpCompositeExtract %uint %7648 2\n       %8566 = OpShiftLeftLogical %uint %21486 %int_16\n      %19825 = OpBitwiseOr %uint %19824 %8566\n      %21487 = OpCompositeExtract %uint %7648 3\n       %8541 = OpShiftLeftLogical %uint %21487 %int_24\n      %20994 = OpBitwiseOr %uint %19825 %8541\n      %21470 = OpCompositeConstruct %v2uint %17629 %20994\n               OpBranch %18834\n       %6451 = OpLabel\n       %8655 = OpVectorShuffle %v3float %14921 %14921 0 1 2\n       %6215 = OpExtInst %v3float %1 FClamp %8655 %2605 %2584\n       %7105 = OpFMul %v3float %6215 %958\n       %7962 = OpFAdd %v3float %7105 %939\n      %10066 = OpConvertFToU %v3uint %7962\n       %8706 = OpCompositeExtract %uint %10066 0\n      %12257 = OpCompositeExtract %uint %10066 1\n      %11567 = OpShiftLeftLogical %uint %12257 %int_5\n      %19826 = OpBitwiseOr %uint %8706 %11567\n      %21488 = OpCompositeExtract %uint %10066 2\n       %8525 = OpShiftLeftLogical %uint %21488 %int_10\n      %16707 = OpBitwiseOr %uint %19826 %8525\n       %8866 = OpVectorShuffle %v3float %15191 %15191 0 1 2\n      %19668 = OpExtInst %v3float %1 FClamp %8866 %2605 %2584\n       %7106 = OpFMul %v3float %19668 %958\n       %7963 = OpFAdd %v3float %7106 %939\n      %10067 = OpConvertFToU %v3uint %7963\n       %8707 = OpCompositeExtract %uint %10067 0\n      %12258 = OpCompositeExtract %uint %10067 1\n      %11568 = OpShiftLeftLogical %uint %12258 %int_5\n      %19827 = OpBitwiseOr %uint %8707 %11568\n      %21489 = OpCompositeExtract %uint %10067 2\n      %10747 = OpShiftLeftLogical %uint %21489 %int_10\n      %19011 = OpBitwiseOr %uint %19827 %10747\n      %23959 = OpShiftLeftLogical %uint %19011 %uint_16\n      %13706 = OpBitwiseOr %uint %16707 %23959\n       %8867 = OpVectorShuffle %v3float %14358 %14358 0 1 2\n      %19669 = OpExtInst %v3float %1 FClamp %8867 %2605 %2584\n       %7107 = OpFMul %v3float %19669 %958\n       %7964 = OpFAdd %v3float %7107 %939\n      %10068 = OpConvertFToU %v3uint %7964\n       %8708 = OpCompositeExtract %uint %10068 0\n      %12259 = OpCompositeExtract %uint %10068 1\n      %11569 = OpShiftLeftLogical %uint %12259 %int_5\n      %19828 = OpBitwiseOr %uint %8708 %11569\n      %21490 = OpCompositeExtract %uint %10068 2\n       %8526 = OpShiftLeftLogical %uint %21490 %int_10\n      %16708 = OpBitwiseOr %uint %19828 %8526\n       %8868 = OpVectorShuffle %v3float %11189 %11189 0 1 2\n      %19675 = OpExtInst %v3float %1 FClamp %8868 %2605 %2584\n       %7108 = OpFMul %v3float %19675 %958\n       %7965 = OpFAdd %v3float %7108 %939\n      %10069 = OpConvertFToU %v3uint %7965\n       %8709 = OpCompositeExtract %uint %10069 0\n      %12260 = OpCompositeExtract %uint %10069 1\n      %11570 = OpShiftLeftLogical %uint %12260 %int_5\n      %19829 = OpBitwiseOr %uint %8709 %11570\n      %21491 = OpCompositeExtract %uint %10069 2\n      %10748 = OpShiftLeftLogical %uint %21491 %int_10\n      %19012 = OpBitwiseOr %uint %19829 %10748\n      %23979 = OpShiftLeftLogical %uint %19012 %uint_16\n      %17994 = OpBitwiseOr %uint %16708 %23979\n      %21471 = OpCompositeConstruct %v2uint %13706 %17994\n               OpBranch %18834\n       %6452 = OpLabel\n       %8656 = OpVectorShuffle %v3float %14921 %14921 0 1 2\n       %6216 = OpExtInst %v3float %1 FClamp %8656 %2605 %2584\n       %7109 = OpFMul %v3float %6216 %511\n       %7966 = OpFAdd %v3float %7109 %939\n      %10070 = OpConvertFToU %v3uint %7966\n       %8710 = OpCompositeExtract %uint %10070 0\n      %12261 = OpCompositeExtract %uint %10070 1\n      %11571 = OpShiftLeftLogical %uint %12261 %int_5\n      %19830 = OpBitwiseOr %uint %8710 %11571\n      %21492 = OpCompositeExtract %uint %10070 2\n       %8527 = OpShiftLeftLogical %uint %21492 %int_11\n      %16709 = OpBitwiseOr %uint %19830 %8527\n       %8869 = OpVectorShuffle %v3float %15191 %15191 0 1 2\n      %19676 = OpExtInst %v3float %1 FClamp %8869 %2605 %2584\n       %7110 = OpFMul %v3float %19676 %511\n       %7967 = OpFAdd %v3float %7110 %939\n      %10071 = OpConvertFToU %v3uint %7967\n       %8711 = OpCompositeExtract %uint %10071 0\n      %12262 = OpCompositeExtract %uint %10071 1\n      %11572 = OpShiftLeftLogical %uint %12262 %int_5\n      %19831 = OpBitwiseOr %uint %8711 %11572\n      %21493 = OpCompositeExtract %uint %10071 2\n      %10749 = OpShiftLeftLogical %uint %21493 %int_11\n      %19013 = OpBitwiseOr %uint %19831 %10749\n      %23960 = OpShiftLeftLogical %uint %19013 %uint_16\n      %13707 = OpBitwiseOr %uint %16709 %23960\n       %8870 = OpVectorShuffle %v3float %14358 %14358 0 1 2\n      %19685 = OpExtInst %v3float %1 FClamp %8870 %2605 %2584\n       %7111 = OpFMul %v3float %19685 %511\n       %7968 = OpFAdd %v3float %7111 %939\n      %10072 = OpConvertFToU %v3uint %7968\n       %8712 = OpCompositeExtract %uint %10072 0\n      %12263 = OpCompositeExtract %uint %10072 1\n      %11573 = OpShiftLeftLogical %uint %12263 %int_5\n      %19832 = OpBitwiseOr %uint %8712 %11573\n      %21494 = OpCompositeExtract %uint %10072 2\n       %8528 = OpShiftLeftLogical %uint %21494 %int_11\n      %16710 = OpBitwiseOr %uint %19832 %8528\n       %8872 = OpVectorShuffle %v3float %11189 %11189 0 1 2\n      %19686 = OpExtInst %v3float %1 FClamp %8872 %2605 %2584\n       %7112 = OpFMul %v3float %19686 %511\n       %7969 = OpFAdd %v3float %7112 %939\n      %10073 = OpConvertFToU %v3uint %7969\n       %8713 = OpCompositeExtract %uint %10073 0\n      %12264 = OpCompositeExtract %uint %10073 1\n      %11574 = OpShiftLeftLogical %uint %12264 %int_5\n      %19833 = OpBitwiseOr %uint %8713 %11574\n      %21495 = OpCompositeExtract %uint %10073 2\n      %10750 = OpShiftLeftLogical %uint %21495 %int_11\n      %19014 = OpBitwiseOr %uint %19833 %10750\n      %23980 = OpShiftLeftLogical %uint %19014 %uint_16\n      %17995 = OpBitwiseOr %uint %16710 %23980\n      %21472 = OpCompositeConstruct %v2uint %13707 %17995\n               OpBranch %18834\n      %17906 = OpLabel\n       %8873 = OpExtInst %v4float %1 FClamp %14921 %2938 %1285\n      %17792 = OpFMul %v4float %8873 %2057\n       %7970 = OpFAdd %v4float %17792 %325\n      %10074 = OpConvertFToU %v4uint %7970\n       %8714 = OpCompositeExtract %uint %10074 0\n      %12265 = OpCompositeExtract %uint %10074 1\n      %11575 = OpShiftLeftLogical %uint %12265 %int_5\n      %19834 = OpBitwiseOr %uint %8714 %11575\n      %21496 = OpCompositeExtract %uint %10074 2\n       %8567 = OpShiftLeftLogical %uint %21496 %int_10\n      %19835 = OpBitwiseOr %uint %19834 %8567\n      %21497 = OpCompositeExtract %uint %10074 3\n       %7294 = OpShiftLeftLogical %uint %21497 %int_15\n       %9084 = OpBitwiseOr %uint %19835 %7294\n       %9079 = OpExtInst %v4float %1 FClamp %15191 %2938 %1285\n      %24798 = OpFMul %v4float %9079 %2057\n       %7971 = OpFAdd %v4float %24798 %325\n      %10075 = OpConvertFToU %v4uint %7971\n       %8715 = OpCompositeExtract %uint %10075 0\n      %12266 = OpCompositeExtract %uint %10075 1\n      %11576 = OpShiftLeftLogical %uint %12266 %int_5\n      %19836 = OpBitwiseOr %uint %8715 %11576\n      %21498 = OpCompositeExtract %uint %10075 2\n       %8568 = OpShiftLeftLogical %uint %21498 %int_10\n      %19837 = OpBitwiseOr %uint %19836 %8568\n      %21499 = OpCompositeExtract %uint %10075 3\n      %10751 = OpShiftLeftLogical %uint %21499 %int_15\n      %19015 = OpBitwiseOr %uint %19837 %10751\n      %22730 = OpShiftLeftLogical %uint %19015 %uint_16\n      %25154 = OpBitwiseOr %uint %9084 %22730\n       %9080 = OpExtInst %v4float %1 FClamp %14358 %2938 %1285\n      %24799 = OpFMul %v4float %9080 %2057\n       %7972 = OpFAdd %v4float %24799 %325\n      %10076 = OpConvertFToU %v4uint %7972\n       %8716 = OpCompositeExtract %uint %10076 0\n      %12267 = OpCompositeExtract %uint %10076 1\n      %11577 = OpShiftLeftLogical %uint %12267 %int_5\n      %19838 = OpBitwiseOr %uint %8716 %11577\n      %21500 = OpCompositeExtract %uint %10076 2\n       %8569 = OpShiftLeftLogical %uint %21500 %int_10\n      %19839 = OpBitwiseOr %uint %19838 %8569\n      %21501 = OpCompositeExtract %uint %10076 3\n       %7295 = OpShiftLeftLogical %uint %21501 %int_15\n       %9085 = OpBitwiseOr %uint %19839 %7295\n       %9081 = OpExtInst %v4float %1 FClamp %11189 %2938 %1285\n      %24800 = OpFMul %v4float %9081 %2057\n       %7973 = OpFAdd %v4float %24800 %325\n      %10077 = OpConvertFToU %v4uint %7973\n       %8717 = OpCompositeExtract %uint %10077 0\n      %12268 = OpCompositeExtract %uint %10077 1\n      %11578 = OpShiftLeftLogical %uint %12268 %int_5\n      %19840 = OpBitwiseOr %uint %8717 %11578\n      %21502 = OpCompositeExtract %uint %10077 2\n       %8570 = OpShiftLeftLogical %uint %21502 %int_10\n      %19841 = OpBitwiseOr %uint %19840 %8570\n      %21503 = OpCompositeExtract %uint %10077 3\n      %10752 = OpShiftLeftLogical %uint %21503 %int_15\n      %19016 = OpBitwiseOr %uint %19841 %10752\n      %23981 = OpShiftLeftLogical %uint %19016 %uint_16\n      %17996 = OpBitwiseOr %uint %9085 %23981\n      %21473 = OpCompositeConstruct %v2uint %25154 %17996\n               OpBranch %18834\n       %7374 = OpLabel\n      %19866 = OpCompositeExtract %float %14921 0\n       %9197 = OpCompositeExtract %float %15191 0\n      %19232 = OpCompositeConstruct %v2float %19866 %9197\n       %8571 = OpExtInst %uint %1 PackHalf2x16 %19232\n      %23487 = OpCompositeExtract %float %14358 0\n      %14759 = OpCompositeExtract %float %11189 0\n      %19213 = OpCompositeConstruct %v2float %23487 %14759\n      %11926 = OpExtInst %uint %1 PackHalf2x16 %19213\n      %24879 = OpCompositeConstruct %v2uint %8571 %11926\n               OpBranch %18834\n      %18834 = OpLabel\n      %24188 = OpPhi %v2uint %24879 %7374 %21473 %17906 %21472 %6452 %21471 %6451 %21470 %7373 %21469 %12647 %15653 %9492\n      %24753 = OpIEqual %bool %7640 %uint_0\n               OpSelectionMerge %13276 None\n               OpBranchConditional %24753 %11451 %13276\n      %11451 = OpLabel\n      %24159 = OpCompositeExtract %uint %19124 0\n      %22470 = OpINotEqual %bool %24159 %uint_0\n               OpBranch %13276\n      %13276 = OpLabel\n      %10955 = OpPhi %bool %24753 %18834 %22470 %11451\n               OpSelectionMerge %19649 DontFlatten\n               OpBranchConditional %10955 %11508 %19649\n      %11508 = OpLabel\n      %23599 = OpCompositeExtract %uint %19124 0\n      %17346 = OpUGreaterThanEqual %bool %23599 %uint_2\n               OpSelectionMerge %18757 None\n               OpBranchConditional %17346 %15877 %18757\n      %15877 = OpLabel\n      %24532 = OpUGreaterThanEqual %bool %23599 %uint_3\n               OpSelectionMerge %18756 None\n               OpBranchConditional %24532 %11888 %18756\n      %11888 = OpLabel\n      %19227 = OpCompositeExtract %uint %24188 1\n      %13351 = OpShiftRightLogical %uint %19227 %uint_16\n       %7220 = OpBitwiseAnd %uint %19227 %uint_4294901760\n      %17709 = OpBitwiseOr %uint %13351 %7220\n      %23345 = OpCompositeInsert %v2uint %17709 %24188 1\n               OpBranch %18756\n      %18756 = OpLabel\n      %19617 = OpPhi %v2uint %24188 %15877 %23345 %11888\n      %21711 = OpCompositeExtract %uint %19617 0\n      %12661 = OpBitwiseAnd %uint %21711 %uint_65535\n      %21557 = OpCompositeExtract %uint %19617 1\n      %10192 = OpShiftLeftLogical %uint %21557 %uint_16\n      %20648 = OpBitwiseOr %uint %12661 %10192\n      %24154 = OpCompositeInsert %v2uint %20648 %19617 0\n               OpBranch %18757\n      %18757 = OpLabel\n      %19507 = OpPhi %v2uint %24188 %11508 %24154 %18756\n      %24818 = OpCompositeExtract %uint %19507 0\n      %14160 = OpShiftRightLogical %uint %24818 %uint_16\n       %7221 = OpBitwiseAnd %uint %24818 %uint_4294901760\n      %17710 = OpBitwiseOr %uint %14160 %7221\n      %23346 = OpCompositeInsert %v2uint %17710 %19507 0\n               OpBranch %19649\n      %19649 = OpLabel\n      %11376 = OpPhi %v2uint %24188 %13276 %23346 %18757\n      %19932 = OpIAdd %v2uint %12025 %23020\n      %24181 = OpShiftRightLogical %v2uint %19932 %1867\n       %7712 = OpUDiv %v2uint %24181 %23601\n      %18183 = OpIMul %v2uint %23601 %7712\n      %18273 = OpISub %v2uint %24181 %18183\n      %11232 = OpShiftLeftLogical %v2uint %7712 %1867\n      %13284 = OpCompositeExtract %uint %18273 0\n      %10872 = OpCompositeExtract %uint %23601 1\n      %22887 = OpIMul %uint %13284 %10872\n       %6943 = OpCompositeExtract %uint %18273 1\n      %10469 = OpIAdd %uint %22887 %6943\n      %18858 = OpBitwiseAnd %v2uint %19932 %1978\n      %10581 = OpShiftLeftLogical %uint %10469 %uint_7\n      %20916 = OpCompositeExtract %uint %18858 1\n      %23596 = OpShiftLeftLogical %uint %20916 %uint_5\n      %19842 = OpBitwiseOr %uint %10581 %23596\n      %21504 = OpCompositeExtract %uint %18858 0\n      %11739 = OpShiftLeftLogical %uint %21504 %uint_1\n      %11193 = OpBitwiseOr %uint %19842 %11739\n               OpSelectionMerge %21313 DontFlatten\n               OpBranchConditional %20495 %10574 %21373\n      %21373 = OpLabel\n      %10608 = OpBitcast %v2int %11232\n      %17907 = OpCompositeExtract %int %10608 1\n      %19904 = OpShiftRightArithmetic %int %17907 %int_5\n      %22412 = OpBitcast %int %8444\n       %7938 = OpIMul %int %19904 %22412\n      %25155 = OpCompositeExtract %int %10608 0\n      %20423 = OpShiftRightArithmetic %int %25155 %int_5\n      %18875 = OpIAdd %int %7938 %20423\n       %9546 = OpShiftLeftLogical %int %18875 %int_6\n      %24635 = OpShiftRightArithmetic %int %17907 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25155 %int_7\n      %11041 = OpBitwiseOr %int %21322 %20133\n      %17334 = OpBitwiseOr %int %9546 %11041\n      %24163 = OpShiftLeftLogical %int %17334 %uint_1\n      %12766 = OpShiftRightArithmetic %int %17907 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25155 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %17907 %int_3\n      %20574 = OpBitwiseAnd %int %10425 %int_1\n      %21533 = OpShiftLeftLogical %int %20574 %int_1\n       %8890 = OpBitwiseXor %int %20766 %21533\n      %20598 = OpBitwiseAnd %int %17907 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6551\n       %7168 = OpShiftLeftLogical %int %21575 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24163 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24163 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24163 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24163 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %21313\n      %10574 = OpLabel\n      %19867 = OpCompositeExtract %uint %11232 0\n      %11267 = OpCompositeExtract %uint %11232 1\n       %8414 = OpCompositeConstruct %v3uint %19867 %11267 %24434\n      %20125 = OpBitcast %v3int %8414\n      %11255 = OpCompositeExtract %int %20125 2\n      %19905 = OpShiftRightArithmetic %int %11255 %int_2\n      %22413 = OpBitcast %int %25203\n       %7939 = OpIMul %int %19905 %22413\n      %25156 = OpCompositeExtract %int %20125 1\n      %19055 = OpShiftRightArithmetic %int %25156 %int_4\n      %11053 = OpIAdd %int %7939 %19055\n      %16898 = OpBitcast %int %8444\n      %14944 = OpIMul %int %11053 %16898\n      %25157 = OpCompositeExtract %int %20125 0\n      %20424 = OpShiftRightArithmetic %int %25157 %int_5\n      %18940 = OpIAdd %int %14944 %20424\n       %8797 = OpShiftLeftLogical %int %18940 %int_7\n      %11434 = OpBitwiseAnd %int %11255 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %25156 %int_1\n      %21364 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21364 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %25157 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17335 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17335 %uint_1\n      %13015 = OpShiftRightArithmetic %int %25156 %int_3\n       %9929 = OpBitwiseXor %int %13015 %19905\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %25157 %int_3\n      %20575 = OpBitwiseAnd %int %9616 %int_3\n      %21534 = OpShiftLeftLogical %int %16793 %int_1\n       %8891 = OpBitwiseXor %int %20575 %21534\n      %20599 = OpBitwiseAnd %int %25156 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6552\n       %7169 = OpShiftLeftLogical %int %16793 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24144 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24144 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24144 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24144 %int_8\n      %10279 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10279\n      %16870 = OpBitcast %uint %15226\n               OpBranch %21313\n      %21313 = OpLabel\n       %9506 = OpPhi %uint %16870 %10574 %16869 %21373\n      %16843 = OpIMul %uint %8858 %10872\n      %11993 = OpIMul %uint %9506 %16843\n      %16012 = OpIAdd %uint %11993 %11193\n      %22330 = OpShiftRightLogical %uint %16012 %int_3\n      %19356 = OpIEqual %bool %19164 %uint_1\n               OpSelectionMerge %11416 None\n               OpBranchConditional %19356 %10583 %11416\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v2uint %11376 %2326\n       %9425 = OpShiftLeftLogical %v2uint %18271 %1975\n      %20652 = OpBitwiseAnd %v2uint %11376 %2888\n      %17549 = OpShiftRightLogical %v2uint %20652 %1975\n      %16377 = OpBitwiseOr %v2uint %9425 %17549\n               OpBranch %11416\n      %11416 = OpLabel\n      %19767 = OpPhi %v2uint %11376 %21313 %16377 %10583\n       %8053 = OpAccessChain %_ptr_Uniform_v2uint %xe_resolve_dest %int_0 %22330\n               OpStore %8053 %19767\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t resolve_full_16bpp_scaled_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x0000629D, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000008, 0x00000008, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x000003F9, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x00090006, 0x000003F9, 0x00000000, 0x725F6578,\n    0x6C6F7365, 0x655F6576, 0x6D617264, 0x666E695F, 0x0000006F, 0x000A0006,\n    0x000003F9, 0x00000001, 0x725F6578, 0x6C6F7365, 0x635F6576, 0x64726F6F,\n    0x74616E69, 0x6E695F65, 0x00006F66, 0x00090006, 0x000003F9, 0x00000002,\n    0x725F6578, 0x6C6F7365, 0x645F6576, 0x5F747365, 0x6F666E69, 0x00000000,\n    0x000B0006, 0x000003F9, 0x00000003, 0x725F6578, 0x6C6F7365, 0x645F6576,\n    0x5F747365, 0x726F6F63, 0x616E6964, 0x695F6574, 0x006F666E, 0x00060005,\n    0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578, 0x00090005,\n    0x0000079C, 0x725F6578, 0x6C6F7365, 0x655F6576, 0x6D617264, 0x5F65785F,\n    0x636F6C62, 0x0000006B, 0x00050006, 0x0000079C, 0x00000000, 0x61746164,\n    0x00000000, 0x00070005, 0x00000CC7, 0x725F6578, 0x6C6F7365, 0x655F6576,\n    0x6D617264, 0x00000000, 0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C,\n    0x766E496C, 0x7461636F, 0x496E6F69, 0x00000044, 0x00090005, 0x000007A8,\n    0x725F6578, 0x6C6F7365, 0x645F6576, 0x5F747365, 0x625F6578, 0x6B636F6C,\n    0x00000000, 0x00050006, 0x000007A8, 0x00000000, 0x61746164, 0x00000000,\n    0x00060005, 0x00001592, 0x725F6578, 0x6C6F7365, 0x645F6576, 0x00747365,\n    0x00030047, 0x000003F9, 0x00000002, 0x00050048, 0x000003F9, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x000003F9, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x000003F9, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x000003F9, 0x00000003, 0x00000023, 0x0000000C, 0x00040047,\n    0x000007D0, 0x00000006, 0x00000004, 0x00030047, 0x0000079C, 0x00000003,\n    0x00040048, 0x0000079C, 0x00000000, 0x00000018, 0x00050048, 0x0000079C,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x00000CC7, 0x00000018,\n    0x00040047, 0x00000CC7, 0x00000021, 0x00000000, 0x00040047, 0x00000CC7,\n    0x00000022, 0x00000000, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C,\n    0x00040047, 0x000007D6, 0x00000006, 0x00000008, 0x00030047, 0x000007A8,\n    0x00000003, 0x00040048, 0x000007A8, 0x00000000, 0x00000019, 0x00050048,\n    0x000007A8, 0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x00001592,\n    0x00000019, 0x00040047, 0x00001592, 0x00000021, 0x00000000, 0x00040047,\n    0x00001592, 0x00000022, 0x00000001, 0x00040047, 0x00000AC8, 0x0000000B,\n    0x00000019, 0x00020013, 0x00000008, 0x00030021, 0x00000502, 0x00000008,\n    0x00040015, 0x0000000C, 0x00000020, 0x00000001, 0x00040017, 0x00000012,\n    0x0000000C, 0x00000002, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x00040017, 0x00000017, 0x0000000B, 0x00000004,\n    0x00030016, 0x0000000D, 0x00000020, 0x00040017, 0x00000013, 0x0000000D,\n    0x00000002, 0x00040017, 0x00000018, 0x0000000D, 0x00000003, 0x00040017,\n    0x0000001D, 0x0000000D, 0x00000004, 0x00020014, 0x00000009, 0x00040017,\n    0x00000016, 0x0000000C, 0x00000003, 0x0004002B, 0x0000000D, 0x00000A0C,\n    0x00000000, 0x0004002B, 0x0000000D, 0x0000008A, 0x3F800000, 0x0004002B,\n    0x0000000B, 0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B, 0x000008A6,\n    0x00FF00FF, 0x0004002B, 0x0000000B, 0x00000A22, 0x00000008, 0x0004002B,\n    0x0000000B, 0x000005FD, 0xFF00FF00, 0x0004002B, 0x0000000D, 0x000005B1,\n    0x41F80000, 0x0007002C, 0x0000001D, 0x00000809, 0x000005B1, 0x000005B1,\n    0x000005B1, 0x0000008A, 0x0004002B, 0x0000000D, 0x000000FC, 0x3F000000,\n    0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000, 0x0004002B, 0x0000000C,\n    0x00000A1A, 0x00000005, 0x0004002B, 0x0000000B, 0x00000A10, 0x00000002,\n    0x0004002B, 0x0000000C, 0x00000A29, 0x0000000A, 0x0004002B, 0x0000000B,\n    0x00000A13, 0x00000003, 0x0004002B, 0x0000000C, 0x00000A38, 0x0000000F,\n    0x0004002B, 0x0000000D, 0x00000770, 0x427C0000, 0x0006002C, 0x00000018,\n    0x000001FF, 0x000005B1, 0x00000770, 0x000005B1, 0x0004002B, 0x0000000C,\n    0x00000A2C, 0x0000000B, 0x0006002C, 0x00000018, 0x000003BE, 0x000005B1,\n    0x000005B1, 0x00000770, 0x0004002B, 0x0000000D, 0x00000540, 0x437F0000,\n    0x0004002B, 0x0000000C, 0x00000A23, 0x00000008, 0x0004002B, 0x0000000C,\n    0x00000A3B, 0x00000010, 0x0004002B, 0x0000000C, 0x00000A53, 0x00000018,\n    0x0004002B, 0x0000000D, 0x000001C1, 0x41700000, 0x0004002B, 0x0000000C,\n    0x00000A17, 0x00000004, 0x0004002B, 0x0000000C, 0x00000A2F, 0x0000000C,\n    0x0004002B, 0x0000000D, 0x0000022D, 0x477FFF00, 0x0004002B, 0x0000000B,\n    0x00000A3A, 0x00000010, 0x0004002B, 0x0000000B, 0x00000A52, 0x00000018,\n    0x0007002C, 0x00000017, 0x0000028D, 0x00000A0A, 0x00000A22, 0x00000A3A,\n    0x00000A52, 0x0004002B, 0x0000000B, 0x00000144, 0x000000FF, 0x0004002B,\n    0x0000000D, 0x0000017A, 0x3B808081, 0x0004002B, 0x0000000B, 0x00000A28,\n    0x0000000A, 0x0004002B, 0x0000000B, 0x00000A46, 0x00000014, 0x0004002B,\n    0x0000000B, 0x00000A64, 0x0000001E, 0x0007002C, 0x00000017, 0x0000034D,\n    0x00000A0A, 0x00000A28, 0x00000A46, 0x00000A64, 0x0004002B, 0x0000000B,\n    0x00000A44, 0x000003FF, 0x0007002C, 0x00000017, 0x0000027B, 0x00000A44,\n    0x00000A44, 0x00000A44, 0x00000A13, 0x0004002B, 0x0000000D, 0x000006FE,\n    0x3A802008, 0x0004002B, 0x0000000D, 0x00000149, 0x3EAAAAAB, 0x0007002C,\n    0x0000001D, 0x00000AEE, 0x000006FE, 0x000006FE, 0x000006FE, 0x00000149,\n    0x0006002C, 0x00000014, 0x00000BB4, 0x00000A0A, 0x00000A28, 0x00000A46,\n    0x0004002B, 0x0000000B, 0x00000B87, 0x0000007F, 0x0004002B, 0x0000000B,\n    0x00000A1F, 0x00000007, 0x00040017, 0x00000010, 0x00000009, 0x00000003,\n    0x0004002B, 0x0000000B, 0x00000B7E, 0x0000007C, 0x0004002B, 0x0000000B,\n    0x00000A4F, 0x00000017, 0x0004002B, 0x0000000D, 0x00000341, 0xBF800000,\n    0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000, 0x0005002C, 0x00000012,\n    0x000007A7, 0x00000A3B, 0x00000A0B, 0x0004002B, 0x0000000D, 0x000007FE,\n    0x3A800100, 0x00040017, 0x0000001A, 0x0000000C, 0x00000004, 0x0007002C,\n    0x0000001A, 0x00000122, 0x00000A3B, 0x00000A0B, 0x00000A3B, 0x00000A0B,\n    0x0005002C, 0x00000011, 0x0000072D, 0x00000A10, 0x00000A0D, 0x00040017,\n    0x0000000F, 0x00000009, 0x00000002, 0x0005002C, 0x00000011, 0x0000070F,\n    0x00000A0A, 0x00000A0A, 0x0005002C, 0x00000011, 0x00000724, 0x00000A0D,\n    0x00000A0D, 0x0005002C, 0x00000011, 0x00000718, 0x00000A0D, 0x00000A0A,\n    0x0004002B, 0x0000000B, 0x00000AFA, 0x00000050, 0x0005002C, 0x00000011,\n    0x00000A9F, 0x00000AFA, 0x00000A3A, 0x0004002B, 0x0000000B, 0x00000A84,\n    0x00000800, 0x0004002B, 0x0000000C, 0x00000A11, 0x00000002, 0x0004002B,\n    0x0000000C, 0x00000A1D, 0x00000006, 0x0004002B, 0x0000000C, 0x00000A0E,\n    0x00000001, 0x0004002B, 0x0000000C, 0x00000A20, 0x00000007, 0x0004002B,\n    0x0000000C, 0x00000A14, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A19,\n    0x00000005, 0x0004002B, 0x0000000B, 0x00000A16, 0x00000004, 0x0006001E,\n    0x000003F9, 0x0000000B, 0x0000000B, 0x0000000B, 0x0000000B, 0x00040020,\n    0x00000676, 0x00000009, 0x000003F9, 0x0004003B, 0x00000676, 0x00000CE9,\n    0x00000009, 0x00040020, 0x00000288, 0x00000009, 0x0000000B, 0x0004002B,\n    0x0000000B, 0x00000A31, 0x0000000D, 0x0004002B, 0x0000000B, 0x00000A81,\n    0x000007FF, 0x0004002B, 0x0000000B, 0x00000A37, 0x0000000F, 0x0004002B,\n    0x0000000B, 0x00000A5E, 0x0000001C, 0x0004002B, 0x0000000B, 0x00000A43,\n    0x00000013, 0x0005002C, 0x00000011, 0x00000883, 0x00000A3A, 0x00000A43,\n    0x0004002B, 0x0000000B, 0x00000510, 0x20000000, 0x0005002C, 0x00000011,\n    0x0000073F, 0x00000A0A, 0x00000A16, 0x0004002B, 0x0000000B, 0x00000AC7,\n    0x0000003F, 0x0004002B, 0x0000000C, 0x00000A59, 0x0000001A, 0x0004002B,\n    0x0000000C, 0x00000A50, 0x00000017, 0x0004002B, 0x0000000B, 0x00000926,\n    0x01000000, 0x0005002C, 0x00000011, 0x000008E3, 0x00000A46, 0x00000A52,\n    0x0003001D, 0x000007D0, 0x0000000B, 0x0003001E, 0x0000079C, 0x000007D0,\n    0x00040020, 0x00000A1B, 0x00000002, 0x0000079C, 0x0004003B, 0x00000A1B,\n    0x00000CC7, 0x00000002, 0x00040020, 0x00000289, 0x00000002, 0x0000000B,\n    0x0004002B, 0x0000000B, 0x00000207, 0x00000140, 0x0004002B, 0x0000000B,\n    0x00000A1C, 0x00000006, 0x00040020, 0x00000291, 0x00000001, 0x00000014,\n    0x0004003B, 0x00000291, 0x00000F48, 0x00000001, 0x0005002C, 0x00000011,\n    0x00000721, 0x00000A10, 0x00000A0A, 0x0004002B, 0x0000000B, 0x0000068D,\n    0xFFFF0000, 0x0004002B, 0x0000000B, 0x000001C2, 0x0000FFFF, 0x0003001D,\n    0x000007D6, 0x00000011, 0x0003001E, 0x000007A8, 0x000007D6, 0x00040020,\n    0x00000A25, 0x00000002, 0x000007A8, 0x0004003B, 0x00000A25, 0x00001592,\n    0x00000002, 0x00040020, 0x0000028E, 0x00000002, 0x00000011, 0x0006002C,\n    0x00000014, 0x00000AC8, 0x00000A22, 0x00000A22, 0x00000A0D, 0x0005002C,\n    0x00000011, 0x000007A2, 0x00000A1F, 0x00000A1F, 0x0005002C, 0x00000011,\n    0x000007A3, 0x00000A37, 0x00000A0D, 0x0005002C, 0x00000011, 0x0000074E,\n    0x00000A13, 0x00000A13, 0x0005002C, 0x00000011, 0x0000084A, 0x00000A37,\n    0x00000A37, 0x0007002C, 0x0000001D, 0x00000504, 0x00000341, 0x00000341,\n    0x00000341, 0x00000341, 0x0007002C, 0x0000001A, 0x00000302, 0x00000A3B,\n    0x00000A3B, 0x00000A3B, 0x00000A3B, 0x0007002C, 0x00000017, 0x0000064B,\n    0x00000144, 0x00000144, 0x00000144, 0x00000144, 0x0006002C, 0x00000014,\n    0x00000105, 0x00000A44, 0x00000A44, 0x00000A44, 0x0006002C, 0x00000014,\n    0x00000466, 0x00000B87, 0x00000B87, 0x00000B87, 0x0006002C, 0x00000014,\n    0x00000B0C, 0x00000A1F, 0x00000A1F, 0x00000A1F, 0x0006002C, 0x00000014,\n    0x00000A12, 0x00000A0A, 0x00000A0A, 0x00000A0A, 0x0006002C, 0x00000014,\n    0x000003FA, 0x00000B7E, 0x00000B7E, 0x00000B7E, 0x0006002C, 0x00000014,\n    0x00000189, 0x00000A4F, 0x00000A4F, 0x00000A4F, 0x0006002C, 0x00000014,\n    0x0000008D, 0x00000A3A, 0x00000A3A, 0x00000A3A, 0x0005002C, 0x00000013,\n    0x00000049, 0x00000341, 0x00000341, 0x0005002C, 0x00000012, 0x00000867,\n    0x00000A3B, 0x00000A3B, 0x0007002C, 0x0000001D, 0x00000B7A, 0x00000A0C,\n    0x00000A0C, 0x00000A0C, 0x00000A0C, 0x0007002C, 0x0000001D, 0x00000505,\n    0x0000008A, 0x0000008A, 0x0000008A, 0x0000008A, 0x0007002C, 0x0000001D,\n    0x00000145, 0x000000FC, 0x000000FC, 0x000000FC, 0x000000FC, 0x0006002C,\n    0x00000018, 0x00000A2D, 0x00000A0C, 0x00000A0C, 0x00000A0C, 0x0006002C,\n    0x00000018, 0x00000A18, 0x0000008A, 0x0000008A, 0x0000008A, 0x0006002C,\n    0x00000018, 0x000003AB, 0x000000FC, 0x000000FC, 0x000000FC, 0x0005002C,\n    0x00000011, 0x0000074B, 0x00000A16, 0x00000A10, 0x0005002C, 0x00000011,\n    0x000007BA, 0x00000A37, 0x00000A13, 0x0005002C, 0x00000011, 0x00000916,\n    0x000008A6, 0x000008A6, 0x0005002C, 0x00000011, 0x000007B7, 0x00000A22,\n    0x00000A22, 0x0005002C, 0x00000011, 0x00000B48, 0x000005FD, 0x000005FD,\n    0x0004002B, 0x0000000C, 0x00000089, 0x3F800000, 0x0004002B, 0x0000000B,\n    0x000009F8, 0xFFFFFFFA, 0x0006002C, 0x00000014, 0x00000938, 0x000009F8,\n    0x000009F8, 0x000009F8, 0x0004002B, 0x0000000D, 0x0000016E, 0x3E800000,\n    0x00050036, 0x00000008, 0x0000161F, 0x00000000, 0x00000502, 0x000200F8,\n    0x00003B06, 0x000300F7, 0x00004C7A, 0x00000000, 0x000300FB, 0x00000A0A,\n    0x00002E68, 0x000200F8, 0x00002E68, 0x00050041, 0x00000288, 0x000056E5,\n    0x00000CE9, 0x00000A0B, 0x0004003D, 0x0000000B, 0x00003D0B, 0x000056E5,\n    0x00050041, 0x00000288, 0x000058AC, 0x00000CE9, 0x00000A0E, 0x0004003D,\n    0x0000000B, 0x00005158, 0x000058AC, 0x000500C7, 0x0000000B, 0x00005051,\n    0x00003D0B, 0x00000A44, 0x000500C2, 0x0000000B, 0x00004E0A, 0x00003D0B,\n    0x00000A28, 0x000500C7, 0x0000000B, 0x0000217E, 0x00004E0A, 0x00000A13,\n    0x000500C2, 0x0000000B, 0x0000520A, 0x00003D0B, 0x00000A31, 0x000500C7,\n    0x0000000B, 0x0000217F, 0x0000520A, 0x00000A81, 0x000500C2, 0x0000000B,\n    0x0000520B, 0x00003D0B, 0x00000A52, 0x000500C7, 0x0000000B, 0x00002180,\n    0x0000520B, 0x00000A37, 0x000500C2, 0x0000000B, 0x00004994, 0x00003D0B,\n    0x00000A5E, 0x000500C7, 0x0000000B, 0x000023AA, 0x00004994, 0x00000A0D,\n    0x00050050, 0x00000011, 0x000022A7, 0x00005158, 0x00005158, 0x000500C2,\n    0x00000011, 0x000025A1, 0x000022A7, 0x00000883, 0x000500C7, 0x00000011,\n    0x00005C31, 0x000025A1, 0x000007A2, 0x000500C7, 0x0000000B, 0x00005DDE,\n    0x00003D0B, 0x00000510, 0x000500AB, 0x00000009, 0x00003007, 0x00005DDE,\n    0x00000A0A, 0x000300F7, 0x00003954, 0x00000000, 0x000400FA, 0x00003007,\n    0x00004163, 0x000055E8, 0x000200F8, 0x000055E8, 0x000200F9, 0x00003954,\n    0x000200F8, 0x00004163, 0x000500C2, 0x00000011, 0x00003BAE, 0x00005C31,\n    0x00000724, 0x000200F9, 0x00003954, 0x000200F8, 0x00003954, 0x000700F5,\n    0x00000011, 0x00004AB4, 0x00003BAE, 0x00004163, 0x0000070F, 0x000055E8,\n    0x000500C2, 0x00000011, 0x00001B7E, 0x000022A7, 0x0000073F, 0x000500C7,\n    0x00000011, 0x00002DF9, 0x00001B7E, 0x000007A3, 0x000500C4, 0x00000011,\n    0x00003F4F, 0x00002DF9, 0x0000074E, 0x00050084, 0x00000011, 0x000059EB,\n    0x00003F4F, 0x00005C31, 0x000500C2, 0x0000000B, 0x00003343, 0x00005158,\n    0x00000A19, 0x000500C7, 0x0000000B, 0x000039C1, 0x00003343, 0x00000A81,\n    0x00050051, 0x0000000B, 0x0000229A, 0x00005C31, 0x00000000, 0x00050084,\n    0x0000000B, 0x000059D1, 0x000039C1, 0x0000229A, 0x00050041, 0x00000288,\n    0x00004E44, 0x00000CE9, 0x00000A11, 0x0004003D, 0x0000000B, 0x000048C4,\n    0x00004E44, 0x00050041, 0x00000288, 0x000058AD, 0x00000CE9, 0x00000A14,\n    0x0004003D, 0x0000000B, 0x000051B7, 0x000058AD, 0x000500C7, 0x0000000B,\n    0x00004ADC, 0x000048C4, 0x00000A1F, 0x000500C7, 0x0000000B, 0x000055EF,\n    0x000048C4, 0x00000A22, 0x000500AB, 0x00000009, 0x0000500F, 0x000055EF,\n    0x00000A0A, 0x000500C2, 0x0000000B, 0x00002843, 0x000048C4, 0x00000A16,\n    0x000500C7, 0x0000000B, 0x00005F72, 0x00002843, 0x00000A1F, 0x000500C2,\n    0x0000000B, 0x00004CD8, 0x000048C4, 0x00000A1F, 0x000500C7, 0x0000000B,\n    0x00005093, 0x00004CD8, 0x00000AC7, 0x0004007C, 0x0000000C, 0x00005988,\n    0x000048C4, 0x000500C4, 0x0000000C, 0x0000358F, 0x00005988, 0x00000A29,\n    0x000500C3, 0x0000000C, 0x0000509C, 0x0000358F, 0x00000A59, 0x000500C4,\n    0x0000000C, 0x00004702, 0x0000509C, 0x00000A50, 0x00050080, 0x0000000C,\n    0x00001D26, 0x00004702, 0x00000089, 0x0004007C, 0x0000000D, 0x00002B2C,\n    0x00001D26, 0x000500C7, 0x0000000B, 0x00005879, 0x000048C4, 0x00000926,\n    0x000500AB, 0x00000009, 0x00001D33, 0x00005879, 0x00000A0A, 0x000500C7,\n    0x0000000B, 0x000020FC, 0x000051B7, 0x00000A44, 0x000500C2, 0x0000000B,\n    0x00002F90, 0x000051B7, 0x00000A28, 0x000500C7, 0x0000000B, 0x000061CE,\n    0x00002F90, 0x00000A44, 0x000500C4, 0x0000000B, 0x00006273, 0x000061CE,\n    0x00000A0E, 0x00050050, 0x00000011, 0x000028B6, 0x000051B7, 0x000051B7,\n    0x000500C2, 0x00000011, 0x00002891, 0x000028B6, 0x000008E3, 0x000500C7,\n    0x00000011, 0x00005B53, 0x00002891, 0x0000084A, 0x000500C4, 0x00000011,\n    0x00003F50, 0x00005B53, 0x0000074E, 0x00050084, 0x00000011, 0x000059EC,\n    0x00003F50, 0x00005C31, 0x000500C2, 0x0000000B, 0x000031C7, 0x000051B7,\n    0x00000A5E, 0x000500C7, 0x0000000B, 0x00004356, 0x000031C7, 0x00000A1F,\n    0x0004003D, 0x00000014, 0x000031C1, 0x00000F48, 0x0007004F, 0x00000011,\n    0x000038A4, 0x000031C1, 0x000031C1, 0x00000000, 0x00000001, 0x000500C4,\n    0x00000011, 0x00002EF9, 0x000038A4, 0x00000721, 0x00050051, 0x0000000B,\n    0x00001DD8, 0x00002EF9, 0x00000000, 0x000500C4, 0x0000000B, 0x00002D8A,\n    0x000059D1, 0x00000A13, 0x000500AE, 0x00000009, 0x00003C13, 0x00001DD8,\n    0x00002D8A, 0x000300F7, 0x000036C9, 0x00000002, 0x000400FA, 0x00003C13,\n    0x000055E9, 0x000036C9, 0x000200F8, 0x000055E9, 0x000200F9, 0x00004C7A,\n    0x000200F8, 0x000036C9, 0x00050051, 0x0000000B, 0x000048B7, 0x00002EF9,\n    0x00000001, 0x00050051, 0x0000000B, 0x000041A3, 0x00004AB4, 0x00000001,\n    0x0007000C, 0x0000000B, 0x00005F7E, 0x00000001, 0x00000029, 0x000048B7,\n    0x000041A3, 0x00050050, 0x00000011, 0x000051EF, 0x00001DD8, 0x00005F7E,\n    0x00050080, 0x00000011, 0x0000522C, 0x000051EF, 0x000059EB, 0x000500B2,\n    0x00000009, 0x00003ECB, 0x00004356, 0x00000A13, 0x000300F7, 0x00005CE0,\n    0x00000000, 0x000400FA, 0x00003ECB, 0x00002AEE, 0x00003AEF, 0x000200F8,\n    0x00003AEF, 0x000500AA, 0x00000009, 0x000034FE, 0x00004356, 0x00000A19,\n    0x000600A9, 0x0000000B, 0x000020F6, 0x000034FE, 0x00000A10, 0x00000A0A,\n    0x000200F9, 0x00005CE0, 0x000200F8, 0x00002AEE, 0x000200F9, 0x00005CE0,\n    0x000200F8, 0x00005CE0, 0x000700F5, 0x0000000B, 0x00004B64, 0x00004356,\n    0x00002AEE, 0x000020F6, 0x00003AEF, 0x00050050, 0x00000011, 0x000041BE,\n    0x0000217E, 0x0000217E, 0x000500AE, 0x0000000F, 0x00002E19, 0x000041BE,\n    0x0000072D, 0x000600A9, 0x00000011, 0x00004BB5, 0x00002E19, 0x00000724,\n    0x0000070F, 0x000500C4, 0x00000011, 0x00002AEA, 0x0000522C, 0x00004BB5,\n    0x00050050, 0x00000011, 0x0000605D, 0x00004B64, 0x00004B64, 0x000500C2,\n    0x00000011, 0x00002385, 0x0000605D, 0x00000718, 0x000500C7, 0x00000011,\n    0x00003EC8, 0x00002385, 0x00000724, 0x00050080, 0x00000011, 0x000046BA,\n    0x00002AEA, 0x00003EC8, 0x00050084, 0x00000011, 0x00005998, 0x00000A9F,\n    0x00005C31, 0x00050050, 0x00000011, 0x00002C44, 0x000023AA, 0x00000A0A,\n    0x000500C2, 0x00000011, 0x000019AB, 0x00005998, 0x00002C44, 0x00050086,\n    0x00000011, 0x000027A2, 0x000046BA, 0x000019AB, 0x00050051, 0x0000000B,\n    0x00004FA6, 0x000027A2, 0x00000001, 0x00050084, 0x0000000B, 0x00002B26,\n    0x00004FA6, 0x00005051, 0x00050051, 0x0000000B, 0x00006059, 0x000027A2,\n    0x00000000, 0x00050080, 0x0000000B, 0x00005420, 0x00002B26, 0x00006059,\n    0x00050080, 0x0000000B, 0x00002226, 0x0000217F, 0x00005420, 0x00050084,\n    0x00000011, 0x00005768, 0x000027A2, 0x000019AB, 0x00050082, 0x00000011,\n    0x000050EB, 0x000046BA, 0x00005768, 0x00050051, 0x0000000B, 0x00001C87,\n    0x00005998, 0x00000000, 0x00050051, 0x0000000B, 0x00005962, 0x00005998,\n    0x00000001, 0x00050084, 0x0000000B, 0x00003372, 0x00001C87, 0x00005962,\n    0x00050084, 0x0000000B, 0x000038D7, 0x00002226, 0x00003372, 0x00050051,\n    0x0000000B, 0x00001A95, 0x000050EB, 0x00000001, 0x00050051, 0x0000000B,\n    0x00005BE6, 0x000019AB, 0x00000000, 0x00050084, 0x0000000B, 0x00005966,\n    0x00001A95, 0x00005BE6, 0x00050051, 0x0000000B, 0x00001AE6, 0x000050EB,\n    0x00000000, 0x00050080, 0x0000000B, 0x000025E0, 0x00005966, 0x00001AE6,\n    0x000500C4, 0x0000000B, 0x00004665, 0x000025E0, 0x000023AA, 0x00050080,\n    0x0000000B, 0x000047BB, 0x000038D7, 0x00004665, 0x00050084, 0x0000000B,\n    0x00003662, 0x00003372, 0x00000A84, 0x00050089, 0x0000000B, 0x00005410,\n    0x000047BB, 0x00003662, 0x000500C4, 0x0000000B, 0x00001E06, 0x00005410,\n    0x00000A11, 0x000500AE, 0x00000009, 0x00003652, 0x0000217E, 0x00000A10,\n    0x000600A9, 0x0000000B, 0x00002C0D, 0x00003652, 0x00000A0D, 0x00000A0A,\n    0x00050080, 0x0000000B, 0x00004E6A, 0x000023AA, 0x00002C0D, 0x000500C4,\n    0x0000000B, 0x0000199B, 0x00000A16, 0x00004E6A, 0x000500AB, 0x00000009,\n    0x00005AEF, 0x000023AA, 0x00000A0A, 0x000300F7, 0x0000530F, 0x00000002,\n    0x000400FA, 0x00005AEF, 0x00003B65, 0x000040B9, 0x000200F8, 0x000040B9,\n    0x000500AA, 0x00000009, 0x00004ADA, 0x0000199B, 0x00000A16, 0x000300F7,\n    0x00004F49, 0x00000002, 0x000400FA, 0x00004ADA, 0x000019BF, 0x000022FF,\n    0x000200F8, 0x000022FF, 0x000500C2, 0x0000000B, 0x00005630, 0x00001E06,\n    0x00000A11, 0x00060041, 0x00000289, 0x00003439, 0x00000CC7, 0x00000A0B,\n    0x00005630, 0x0004003D, 0x0000000B, 0x00003AD4, 0x00003439, 0x00050080,\n    0x0000000B, 0x00002145, 0x00001E06, 0x0000199B, 0x000500C2, 0x0000000B,\n    0x000054A6, 0x00002145, 0x00000A11, 0x00060041, 0x00000289, 0x00004CDD,\n    0x00000CC7, 0x00000A0B, 0x000054A6, 0x0004003D, 0x0000000B, 0x0000333A,\n    0x00004CDD, 0x00050084, 0x0000000B, 0x000021ED, 0x00000A10, 0x0000199B,\n    0x00050080, 0x0000000B, 0x00005EBE, 0x00001E06, 0x000021ED, 0x000500C2,\n    0x0000000B, 0x000045E2, 0x00005EBE, 0x00000A11, 0x00060041, 0x00000289,\n    0x00004CDE, 0x00000CC7, 0x00000A0B, 0x000045E2, 0x0004003D, 0x0000000B,\n    0x0000333B, 0x00004CDE, 0x00050084, 0x0000000B, 0x000021EE, 0x00000A13,\n    0x0000199B, 0x00050080, 0x0000000B, 0x00005EBF, 0x00001E06, 0x000021EE,\n    0x000500C2, 0x0000000B, 0x000045E3, 0x00005EBF, 0x00000A11, 0x00060041,\n    0x00000289, 0x00004901, 0x00000CC7, 0x00000A0B, 0x000045E3, 0x0004003D,\n    0x0000000B, 0x00005F59, 0x00004901, 0x00070050, 0x00000017, 0x0000512C,\n    0x00003AD4, 0x0000333A, 0x0000333B, 0x00005F59, 0x000200F9, 0x00004F49,\n    0x000200F8, 0x000019BF, 0x000500C2, 0x0000000B, 0x00005FA6, 0x00001E06,\n    0x00000A11, 0x00060041, 0x00000289, 0x0000343A, 0x00000CC7, 0x00000A0B,\n    0x00005FA6, 0x0004003D, 0x0000000B, 0x00003141, 0x0000343A, 0x00050080,\n    0x0000000B, 0x00002DA7, 0x00005FA6, 0x00000A0D, 0x00060041, 0x00000289,\n    0x000018FF, 0x00000CC7, 0x00000A0B, 0x00002DA7, 0x0004003D, 0x0000000B,\n    0x00005C62, 0x000018FF, 0x00050080, 0x0000000B, 0x00002DA8, 0x00005FA6,\n    0x00000A10, 0x00060041, 0x00000289, 0x00001900, 0x00000CC7, 0x00000A0B,\n    0x00002DA8, 0x0004003D, 0x0000000B, 0x00005C63, 0x00001900, 0x00050080,\n    0x0000000B, 0x00002DA9, 0x00005FA6, 0x00000A13, 0x00060041, 0x00000289,\n    0x00005FEE, 0x00000CC7, 0x00000A0B, 0x00002DA9, 0x0004003D, 0x0000000B,\n    0x00003FFB, 0x00005FEE, 0x00070050, 0x00000017, 0x0000512D, 0x00003141,\n    0x00005C62, 0x00005C63, 0x00003FFB, 0x000200F9, 0x00004F49, 0x000200F8,\n    0x00004F49, 0x000700F5, 0x00000017, 0x00002ABF, 0x0000512D, 0x000019BF,\n    0x0000512C, 0x000022FF, 0x000300F7, 0x00003F60, 0x00000000, 0x001300FB,\n    0x00002180, 0x00004BFB, 0x00000000, 0x000038F9, 0x00000001, 0x000038F9,\n    0x00000002, 0x00001CBB, 0x0000000A, 0x00001CBB, 0x00000003, 0x00001CBA,\n    0x0000000C, 0x00001CBA, 0x00000004, 0x00001FFE, 0x00000006, 0x00002033,\n    0x000200F8, 0x00002033, 0x00050051, 0x0000000B, 0x00005F56, 0x00002ABF,\n    0x00000000, 0x0006000C, 0x00000013, 0x00006067, 0x00000001, 0x0000003E,\n    0x00005F56, 0x00050051, 0x0000000D, 0x00002762, 0x00006067, 0x00000000,\n    0x00050051, 0x0000000D, 0x00004446, 0x00006067, 0x00000001, 0x00070050,\n    0x0000001D, 0x0000390C, 0x00002762, 0x00004446, 0x00000A0C, 0x00000A0C,\n    0x00050051, 0x0000000B, 0x0000437A, 0x00002ABF, 0x00000001, 0x0006000C,\n    0x00000013, 0x0000466B, 0x00000001, 0x0000003E, 0x0000437A, 0x00050051,\n    0x0000000D, 0x00002763, 0x0000466B, 0x00000000, 0x00050051, 0x0000000D,\n    0x00004447, 0x0000466B, 0x00000001, 0x00070050, 0x0000001D, 0x0000390D,\n    0x00002763, 0x00004447, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B,\n    0x0000437B, 0x00002ABF, 0x00000002, 0x0006000C, 0x00000013, 0x0000466C,\n    0x00000001, 0x0000003E, 0x0000437B, 0x00050051, 0x0000000D, 0x00002764,\n    0x0000466C, 0x00000000, 0x00050051, 0x0000000D, 0x00004448, 0x0000466C,\n    0x00000001, 0x00070050, 0x0000001D, 0x0000390E, 0x00002764, 0x00004448,\n    0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x0000437C, 0x00002ABF,\n    0x00000003, 0x0006000C, 0x00000013, 0x0000466D, 0x00000001, 0x0000003E,\n    0x0000437C, 0x00050051, 0x0000000D, 0x00002765, 0x0000466D, 0x00000000,\n    0x00050051, 0x0000000D, 0x000050BE, 0x0000466D, 0x00000001, 0x00070050,\n    0x0000001D, 0x00002349, 0x00002765, 0x000050BE, 0x00000A0C, 0x00000A0C,\n    0x000200F9, 0x00003F60, 0x000200F8, 0x00001FFE, 0x00050051, 0x0000000B,\n    0x0000308B, 0x00002ABF, 0x00000000, 0x0004007C, 0x0000000C, 0x0000589D,\n    0x0000308B, 0x00050050, 0x00000012, 0x0000471A, 0x0000589D, 0x0000589D,\n    0x000500C4, 0x00000012, 0x000047AD, 0x0000471A, 0x000007A7, 0x000500C3,\n    0x00000012, 0x00003417, 0x000047AD, 0x00000867, 0x0004006F, 0x00000013,\n    0x00002A97, 0x00003417, 0x0005008E, 0x00000013, 0x00004747, 0x00002A97,\n    0x000007FE, 0x0007000C, 0x00000013, 0x00005E06, 0x00000001, 0x00000028,\n    0x00000049, 0x00004747, 0x00050051, 0x0000000D, 0x00005F0A, 0x00005E06,\n    0x00000000, 0x00050051, 0x0000000D, 0x00003CD4, 0x00005E06, 0x00000001,\n    0x00070050, 0x0000001D, 0x0000411E, 0x00005F0A, 0x00003CD4, 0x00000A0C,\n    0x00000A0C, 0x00050051, 0x0000000B, 0x00004C42, 0x00002ABF, 0x00000001,\n    0x0004007C, 0x0000000C, 0x00003EA1, 0x00004C42, 0x00050050, 0x00000012,\n    0x0000471B, 0x00003EA1, 0x00003EA1, 0x000500C4, 0x00000012, 0x000047AE,\n    0x0000471B, 0x000007A7, 0x000500C3, 0x00000012, 0x00003418, 0x000047AE,\n    0x00000867, 0x0004006F, 0x00000013, 0x00002A98, 0x00003418, 0x0005008E,\n    0x00000013, 0x00004748, 0x00002A98, 0x000007FE, 0x0007000C, 0x00000013,\n    0x00005E07, 0x00000001, 0x00000028, 0x00000049, 0x00004748, 0x00050051,\n    0x0000000D, 0x00005F0B, 0x00005E07, 0x00000000, 0x00050051, 0x0000000D,\n    0x00003CD5, 0x00005E07, 0x00000001, 0x00070050, 0x0000001D, 0x0000411F,\n    0x00005F0B, 0x00003CD5, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B,\n    0x00004C43, 0x00002ABF, 0x00000002, 0x0004007C, 0x0000000C, 0x00003EA2,\n    0x00004C43, 0x00050050, 0x00000012, 0x0000471C, 0x00003EA2, 0x00003EA2,\n    0x000500C4, 0x00000012, 0x000047AF, 0x0000471C, 0x000007A7, 0x000500C3,\n    0x00000012, 0x00003419, 0x000047AF, 0x00000867, 0x0004006F, 0x00000013,\n    0x00002A99, 0x00003419, 0x0005008E, 0x00000013, 0x00004749, 0x00002A99,\n    0x000007FE, 0x0007000C, 0x00000013, 0x00005E08, 0x00000001, 0x00000028,\n    0x00000049, 0x00004749, 0x00050051, 0x0000000D, 0x00005F0C, 0x00005E08,\n    0x00000000, 0x00050051, 0x0000000D, 0x00003CD6, 0x00005E08, 0x00000001,\n    0x00070050, 0x0000001D, 0x00004120, 0x00005F0C, 0x00003CD6, 0x00000A0C,\n    0x00000A0C, 0x00050051, 0x0000000B, 0x00004C44, 0x00002ABF, 0x00000003,\n    0x0004007C, 0x0000000C, 0x00003EA3, 0x00004C44, 0x00050050, 0x00000012,\n    0x0000471D, 0x00003EA3, 0x00003EA3, 0x000500C4, 0x00000012, 0x000047B0,\n    0x0000471D, 0x000007A7, 0x000500C3, 0x00000012, 0x0000341A, 0x000047B0,\n    0x00000867, 0x0004006F, 0x00000013, 0x00002A9A, 0x0000341A, 0x0005008E,\n    0x00000013, 0x0000474A, 0x00002A9A, 0x000007FE, 0x0007000C, 0x00000013,\n    0x00005E09, 0x00000001, 0x00000028, 0x00000049, 0x0000474A, 0x00050051,\n    0x0000000D, 0x00005F0D, 0x00005E09, 0x00000000, 0x00050051, 0x0000000D,\n    0x0000494C, 0x00005E09, 0x00000001, 0x00070050, 0x0000001D, 0x0000234A,\n    0x00005F0D, 0x0000494C, 0x00000A0C, 0x00000A0C, 0x000200F9, 0x00003F60,\n    0x000200F8, 0x00001CBA, 0x00050051, 0x0000000B, 0x000056BD, 0x00002ABF,\n    0x00000000, 0x00060050, 0x00000014, 0x00004F0A, 0x000056BD, 0x000056BD,\n    0x000056BD, 0x000500C2, 0x00000014, 0x00002B0D, 0x00004F0A, 0x00000BB4,\n    0x000500C7, 0x00000014, 0x00005DE6, 0x00002B0D, 0x00000105, 0x000500C7,\n    0x00000014, 0x0000489C, 0x00002B0D, 0x00000466, 0x000500C2, 0x00000014,\n    0x00005B90, 0x00005DE6, 0x00000B0C, 0x000500AA, 0x00000010, 0x000040C9,\n    0x00005B90, 0x00000A12, 0x0006000C, 0x00000016, 0x00002C4B, 0x00000001,\n    0x0000004B, 0x0000489C, 0x0004007C, 0x00000014, 0x00002A15, 0x00002C4B,\n    0x00050082, 0x00000014, 0x0000187A, 0x00000B0C, 0x00002A15, 0x00050080,\n    0x00000014, 0x00002210, 0x00002A15, 0x00000938, 0x000600A9, 0x00000014,\n    0x0000286F, 0x000040C9, 0x00002210, 0x00005B90, 0x000500C4, 0x00000014,\n    0x00005AD4, 0x0000489C, 0x0000187A, 0x000500C7, 0x00000014, 0x0000499A,\n    0x00005AD4, 0x00000466, 0x000600A9, 0x00000014, 0x00002A9D, 0x000040C9,\n    0x0000499A, 0x0000489C, 0x00050080, 0x00000014, 0x00005FF9, 0x0000286F,\n    0x000003FA, 0x000500C4, 0x00000014, 0x00004F7F, 0x00005FF9, 0x00000189,\n    0x000500C4, 0x00000014, 0x00003FA6, 0x00002A9D, 0x0000008D, 0x000500C5,\n    0x00000014, 0x0000577C, 0x00004F7F, 0x00003FA6, 0x000500AA, 0x00000010,\n    0x00003600, 0x00005DE6, 0x00000A12, 0x000600A9, 0x00000014, 0x00004242,\n    0x00003600, 0x00000A12, 0x0000577C, 0x0004007C, 0x00000018, 0x000029CF,\n    0x00004242, 0x000500C2, 0x0000000B, 0x00004BA4, 0x000056BD, 0x00000A64,\n    0x00040070, 0x0000000D, 0x0000480E, 0x00004BA4, 0x00050085, 0x0000000D,\n    0x00003E1F, 0x0000480E, 0x00000149, 0x00050051, 0x0000000D, 0x000053C2,\n    0x000029CF, 0x00000000, 0x00050051, 0x0000000D, 0x00002A55, 0x000029CF,\n    0x00000001, 0x00050051, 0x0000000D, 0x00001E99, 0x000029CF, 0x00000002,\n    0x00070050, 0x0000001D, 0x00003DDA, 0x000053C2, 0x00002A55, 0x00001E99,\n    0x00003E1F, 0x00050051, 0x0000000B, 0x000027F5, 0x00002ABF, 0x00000001,\n    0x00060050, 0x00000014, 0x0000350E, 0x000027F5, 0x000027F5, 0x000027F5,\n    0x000500C2, 0x00000014, 0x00002B0E, 0x0000350E, 0x00000BB4, 0x000500C7,\n    0x00000014, 0x00005DE7, 0x00002B0E, 0x00000105, 0x000500C7, 0x00000014,\n    0x0000489D, 0x00002B0E, 0x00000466, 0x000500C2, 0x00000014, 0x00005B91,\n    0x00005DE7, 0x00000B0C, 0x000500AA, 0x00000010, 0x000040CA, 0x00005B91,\n    0x00000A12, 0x0006000C, 0x00000016, 0x00002C4C, 0x00000001, 0x0000004B,\n    0x0000489D, 0x0004007C, 0x00000014, 0x00002A16, 0x00002C4C, 0x00050082,\n    0x00000014, 0x0000187B, 0x00000B0C, 0x00002A16, 0x00050080, 0x00000014,\n    0x00002211, 0x00002A16, 0x00000938, 0x000600A9, 0x00000014, 0x00002870,\n    0x000040CA, 0x00002211, 0x00005B91, 0x000500C4, 0x00000014, 0x00005AD5,\n    0x0000489D, 0x0000187B, 0x000500C7, 0x00000014, 0x0000499B, 0x00005AD5,\n    0x00000466, 0x000600A9, 0x00000014, 0x00002A9E, 0x000040CA, 0x0000499B,\n    0x0000489D, 0x00050080, 0x00000014, 0x00005FFA, 0x00002870, 0x000003FA,\n    0x000500C4, 0x00000014, 0x00004F80, 0x00005FFA, 0x00000189, 0x000500C4,\n    0x00000014, 0x00003FA7, 0x00002A9E, 0x0000008D, 0x000500C5, 0x00000014,\n    0x0000577D, 0x00004F80, 0x00003FA7, 0x000500AA, 0x00000010, 0x00003601,\n    0x00005DE7, 0x00000A12, 0x000600A9, 0x00000014, 0x00004243, 0x00003601,\n    0x00000A12, 0x0000577D, 0x0004007C, 0x00000018, 0x000029D0, 0x00004243,\n    0x000500C2, 0x0000000B, 0x00004BA5, 0x000027F5, 0x00000A64, 0x00040070,\n    0x0000000D, 0x0000480F, 0x00004BA5, 0x00050085, 0x0000000D, 0x00003E20,\n    0x0000480F, 0x00000149, 0x00050051, 0x0000000D, 0x000053C3, 0x000029D0,\n    0x00000000, 0x00050051, 0x0000000D, 0x00002A56, 0x000029D0, 0x00000001,\n    0x00050051, 0x0000000D, 0x00001E9A, 0x000029D0, 0x00000002, 0x00070050,\n    0x0000001D, 0x00003DDB, 0x000053C3, 0x00002A56, 0x00001E9A, 0x00003E20,\n    0x00050051, 0x0000000B, 0x000027F6, 0x00002ABF, 0x00000002, 0x00060050,\n    0x00000014, 0x0000350F, 0x000027F6, 0x000027F6, 0x000027F6, 0x000500C2,\n    0x00000014, 0x00002B0F, 0x0000350F, 0x00000BB4, 0x000500C7, 0x00000014,\n    0x00005DE8, 0x00002B0F, 0x00000105, 0x000500C7, 0x00000014, 0x0000489E,\n    0x00002B0F, 0x00000466, 0x000500C2, 0x00000014, 0x00005B92, 0x00005DE8,\n    0x00000B0C, 0x000500AA, 0x00000010, 0x000040CB, 0x00005B92, 0x00000A12,\n    0x0006000C, 0x00000016, 0x00002C4D, 0x00000001, 0x0000004B, 0x0000489E,\n    0x0004007C, 0x00000014, 0x00002A17, 0x00002C4D, 0x00050082, 0x00000014,\n    0x0000187C, 0x00000B0C, 0x00002A17, 0x00050080, 0x00000014, 0x00002212,\n    0x00002A17, 0x00000938, 0x000600A9, 0x00000014, 0x00002871, 0x000040CB,\n    0x00002212, 0x00005B92, 0x000500C4, 0x00000014, 0x00005AD6, 0x0000489E,\n    0x0000187C, 0x000500C7, 0x00000014, 0x0000499C, 0x00005AD6, 0x00000466,\n    0x000600A9, 0x00000014, 0x00002A9F, 0x000040CB, 0x0000499C, 0x0000489E,\n    0x00050080, 0x00000014, 0x00005FFB, 0x00002871, 0x000003FA, 0x000500C4,\n    0x00000014, 0x00004F81, 0x00005FFB, 0x00000189, 0x000500C4, 0x00000014,\n    0x00003FA8, 0x00002A9F, 0x0000008D, 0x000500C5, 0x00000014, 0x0000577E,\n    0x00004F81, 0x00003FA8, 0x000500AA, 0x00000010, 0x00003602, 0x00005DE8,\n    0x00000A12, 0x000600A9, 0x00000014, 0x00004244, 0x00003602, 0x00000A12,\n    0x0000577E, 0x0004007C, 0x00000018, 0x000029D1, 0x00004244, 0x000500C2,\n    0x0000000B, 0x00004BA6, 0x000027F6, 0x00000A64, 0x00040070, 0x0000000D,\n    0x00004810, 0x00004BA6, 0x00050085, 0x0000000D, 0x00003E21, 0x00004810,\n    0x00000149, 0x00050051, 0x0000000D, 0x000053C4, 0x000029D1, 0x00000000,\n    0x00050051, 0x0000000D, 0x00002A57, 0x000029D1, 0x00000001, 0x00050051,\n    0x0000000D, 0x00001E9B, 0x000029D1, 0x00000002, 0x00070050, 0x0000001D,\n    0x00003DDC, 0x000053C4, 0x00002A57, 0x00001E9B, 0x00003E21, 0x00050051,\n    0x0000000B, 0x000027F7, 0x00002ABF, 0x00000003, 0x00060050, 0x00000014,\n    0x00003510, 0x000027F7, 0x000027F7, 0x000027F7, 0x000500C2, 0x00000014,\n    0x00002B10, 0x00003510, 0x00000BB4, 0x000500C7, 0x00000014, 0x00005DE9,\n    0x00002B10, 0x00000105, 0x000500C7, 0x00000014, 0x0000489F, 0x00002B10,\n    0x00000466, 0x000500C2, 0x00000014, 0x00005B93, 0x00005DE9, 0x00000B0C,\n    0x000500AA, 0x00000010, 0x000040CC, 0x00005B93, 0x00000A12, 0x0006000C,\n    0x00000016, 0x00002C4E, 0x00000001, 0x0000004B, 0x0000489F, 0x0004007C,\n    0x00000014, 0x00002A18, 0x00002C4E, 0x00050082, 0x00000014, 0x0000187D,\n    0x00000B0C, 0x00002A18, 0x00050080, 0x00000014, 0x00002213, 0x00002A18,\n    0x00000938, 0x000600A9, 0x00000014, 0x00002872, 0x000040CC, 0x00002213,\n    0x00005B93, 0x000500C4, 0x00000014, 0x00005AD7, 0x0000489F, 0x0000187D,\n    0x000500C7, 0x00000014, 0x0000499D, 0x00005AD7, 0x00000466, 0x000600A9,\n    0x00000014, 0x00002AA0, 0x000040CC, 0x0000499D, 0x0000489F, 0x00050080,\n    0x00000014, 0x00005FFC, 0x00002872, 0x000003FA, 0x000500C4, 0x00000014,\n    0x00004F82, 0x00005FFC, 0x00000189, 0x000500C4, 0x00000014, 0x00003FA9,\n    0x00002AA0, 0x0000008D, 0x000500C5, 0x00000014, 0x0000577F, 0x00004F82,\n    0x00003FA9, 0x000500AA, 0x00000010, 0x00003603, 0x00005DE9, 0x00000A12,\n    0x000600A9, 0x00000014, 0x00004245, 0x00003603, 0x00000A12, 0x0000577F,\n    0x0004007C, 0x00000018, 0x000029D2, 0x00004245, 0x000500C2, 0x0000000B,\n    0x00004BA7, 0x000027F7, 0x00000A64, 0x00040070, 0x0000000D, 0x00004811,\n    0x00004BA7, 0x00050085, 0x0000000D, 0x00003E22, 0x00004811, 0x00000149,\n    0x00050051, 0x0000000D, 0x000053C5, 0x000029D2, 0x00000000, 0x00050051,\n    0x0000000D, 0x00002A58, 0x000029D2, 0x00000001, 0x00050051, 0x0000000D,\n    0x00002B11, 0x000029D2, 0x00000002, 0x00070050, 0x0000001D, 0x0000234B,\n    0x000053C5, 0x00002A58, 0x00002B11, 0x00003E22, 0x000200F9, 0x00003F60,\n    0x000200F8, 0x00001CBB, 0x00050051, 0x0000000B, 0x000056BE, 0x00002ABF,\n    0x00000000, 0x00070050, 0x00000017, 0x00004F0B, 0x000056BE, 0x000056BE,\n    0x000056BE, 0x000056BE, 0x000500C2, 0x00000017, 0x00002498, 0x00004F0B,\n    0x0000034D, 0x000500C7, 0x00000017, 0x000049AB, 0x00002498, 0x0000027B,\n    0x00040070, 0x0000001D, 0x00003CB7, 0x000049AB, 0x00050085, 0x0000001D,\n    0x00004130, 0x00003CB7, 0x00000AEE, 0x00050051, 0x0000000B, 0x00005CD2,\n    0x00002ABF, 0x00000001, 0x00070050, 0x00000017, 0x0000514D, 0x00005CD2,\n    0x00005CD2, 0x00005CD2, 0x00005CD2, 0x000500C2, 0x00000017, 0x00002499,\n    0x0000514D, 0x0000034D, 0x000500C7, 0x00000017, 0x000049AC, 0x00002499,\n    0x0000027B, 0x00040070, 0x0000001D, 0x00003CB8, 0x000049AC, 0x00050085,\n    0x0000001D, 0x00004131, 0x00003CB8, 0x00000AEE, 0x00050051, 0x0000000B,\n    0x00005CD3, 0x00002ABF, 0x00000002, 0x00070050, 0x00000017, 0x0000514E,\n    0x00005CD3, 0x00005CD3, 0x00005CD3, 0x00005CD3, 0x000500C2, 0x00000017,\n    0x0000249A, 0x0000514E, 0x0000034D, 0x000500C7, 0x00000017, 0x000049AD,\n    0x0000249A, 0x0000027B, 0x00040070, 0x0000001D, 0x00003CB9, 0x000049AD,\n    0x00050085, 0x0000001D, 0x00004132, 0x00003CB9, 0x00000AEE, 0x00050051,\n    0x0000000B, 0x00005CD4, 0x00002ABF, 0x00000003, 0x00070050, 0x00000017,\n    0x0000514F, 0x00005CD4, 0x00005CD4, 0x00005CD4, 0x00005CD4, 0x000500C2,\n    0x00000017, 0x0000249B, 0x0000514F, 0x0000034D, 0x000500C7, 0x00000017,\n    0x000049AE, 0x0000249B, 0x0000027B, 0x00040070, 0x0000001D, 0x0000492F,\n    0x000049AE, 0x00050085, 0x0000001D, 0x0000269F, 0x0000492F, 0x00000AEE,\n    0x000200F9, 0x00003F60, 0x000200F8, 0x000038F9, 0x00050051, 0x0000000B,\n    0x000056BF, 0x00002ABF, 0x00000000, 0x00070050, 0x00000017, 0x00004F0C,\n    0x000056BF, 0x000056BF, 0x000056BF, 0x000056BF, 0x000500C2, 0x00000017,\n    0x0000249C, 0x00004F0C, 0x0000028D, 0x000500C7, 0x00000017, 0x00004A56,\n    0x0000249C, 0x0000064B, 0x00040070, 0x0000001D, 0x000036A2, 0x00004A56,\n    0x0005008E, 0x0000001D, 0x00004B23, 0x000036A2, 0x0000017A, 0x00050051,\n    0x0000000B, 0x0000219F, 0x00002ABF, 0x00000001, 0x00070050, 0x00000017,\n    0x0000610B, 0x0000219F, 0x0000219F, 0x0000219F, 0x0000219F, 0x000500C2,\n    0x00000017, 0x0000249D, 0x0000610B, 0x0000028D, 0x000500C7, 0x00000017,\n    0x00004A57, 0x0000249D, 0x0000064B, 0x00040070, 0x0000001D, 0x000036A3,\n    0x00004A57, 0x0005008E, 0x0000001D, 0x00004B24, 0x000036A3, 0x0000017A,\n    0x00050051, 0x0000000B, 0x000021A0, 0x00002ABF, 0x00000002, 0x00070050,\n    0x00000017, 0x0000610C, 0x000021A0, 0x000021A0, 0x000021A0, 0x000021A0,\n    0x000500C2, 0x00000017, 0x0000249E, 0x0000610C, 0x0000028D, 0x000500C7,\n    0x00000017, 0x00004A58, 0x0000249E, 0x0000064B, 0x00040070, 0x0000001D,\n    0x000036A4, 0x00004A58, 0x0005008E, 0x0000001D, 0x00004B25, 0x000036A4,\n    0x0000017A, 0x00050051, 0x0000000B, 0x000021A1, 0x00002ABF, 0x00000003,\n    0x00070050, 0x00000017, 0x0000610D, 0x000021A1, 0x000021A1, 0x000021A1,\n    0x000021A1, 0x000500C2, 0x00000017, 0x0000249F, 0x0000610D, 0x0000028D,\n    0x000500C7, 0x00000017, 0x00004A59, 0x0000249F, 0x0000064B, 0x00040070,\n    0x0000001D, 0x0000431A, 0x00004A59, 0x0005008E, 0x0000001D, 0x00003092,\n    0x0000431A, 0x0000017A, 0x000200F9, 0x00003F60, 0x000200F8, 0x00004BFB,\n    0x00050051, 0x0000000B, 0x0000308C, 0x00002ABF, 0x00000000, 0x0004007C,\n    0x0000000D, 0x00004FEE, 0x0000308C, 0x00050050, 0x00000013, 0x00004336,\n    0x00004FEE, 0x00000A0C, 0x0009004F, 0x0000001D, 0x00002D90, 0x00004336,\n    0x00004336, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00050051,\n    0x0000000B, 0x000056B1, 0x00002ABF, 0x00000001, 0x0004007C, 0x0000000D,\n    0x00003F68, 0x000056B1, 0x00050050, 0x00000013, 0x00004337, 0x00003F68,\n    0x00000A0C, 0x0009004F, 0x0000001D, 0x00002D91, 0x00004337, 0x00004337,\n    0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00050051, 0x0000000B,\n    0x000056B2, 0x00002ABF, 0x00000002, 0x0004007C, 0x0000000D, 0x00003F69,\n    0x000056B2, 0x00050050, 0x00000013, 0x00004338, 0x00003F69, 0x00000A0C,\n    0x0009004F, 0x0000001D, 0x00002D92, 0x00004338, 0x00004338, 0x00000000,\n    0x00000001, 0x00000001, 0x00000001, 0x00050051, 0x0000000B, 0x000056B3,\n    0x00002ABF, 0x00000003, 0x0004007C, 0x0000000D, 0x00003F6A, 0x000056B3,\n    0x00050050, 0x00000013, 0x00004FAE, 0x00003F6A, 0x00000A0C, 0x0009004F,\n    0x0000001D, 0x00005A3A, 0x00004FAE, 0x00004FAE, 0x00000000, 0x00000001,\n    0x00000001, 0x00000001, 0x000200F9, 0x00003F60, 0x000200F8, 0x00003F60,\n    0x000F00F5, 0x0000001D, 0x00002BA7, 0x00005A3A, 0x00004BFB, 0x00003092,\n    0x000038F9, 0x0000269F, 0x00001CBB, 0x0000234B, 0x00001CBA, 0x0000234A,\n    0x00001FFE, 0x00002349, 0x00002033, 0x000F00F5, 0x0000001D, 0x00003808,\n    0x00002D92, 0x00004BFB, 0x00004B25, 0x000038F9, 0x00004132, 0x00001CBB,\n    0x00003DDC, 0x00001CBA, 0x00004120, 0x00001FFE, 0x0000390E, 0x00002033,\n    0x000F00F5, 0x0000001D, 0x00003B7D, 0x00002D91, 0x00004BFB, 0x00004B24,\n    0x000038F9, 0x00004131, 0x00001CBB, 0x00003DDB, 0x00001CBA, 0x0000411F,\n    0x00001FFE, 0x0000390D, 0x00002033, 0x000F00F5, 0x0000001D, 0x000038B6,\n    0x00002D90, 0x00004BFB, 0x00004B23, 0x000038F9, 0x00004130, 0x00001CBB,\n    0x00003DDA, 0x00001CBA, 0x0000411E, 0x00001FFE, 0x0000390C, 0x00002033,\n    0x000200F9, 0x0000530F, 0x000200F8, 0x00003B65, 0x000500AA, 0x00000009,\n    0x00005450, 0x0000199B, 0x00000A22, 0x000300F7, 0x00004F23, 0x00000002,\n    0x000400FA, 0x00005450, 0x000019C0, 0x00002300, 0x000200F8, 0x00002300,\n    0x000500C2, 0x0000000B, 0x00005631, 0x00001E06, 0x00000A11, 0x00060041,\n    0x00000289, 0x0000343B, 0x00000CC7, 0x00000A0B, 0x00005631, 0x0004003D,\n    0x0000000B, 0x00003142, 0x0000343B, 0x00050080, 0x0000000B, 0x00002DAA,\n    0x00005631, 0x00000A0D, 0x00060041, 0x00000289, 0x00001901, 0x00000CC7,\n    0x00000A0B, 0x00002DAA, 0x0004003D, 0x0000000B, 0x00001B76, 0x00001901,\n    0x00050080, 0x0000000B, 0x00002146, 0x00001E06, 0x0000199B, 0x000500C2,\n    0x0000000B, 0x000054A7, 0x00002146, 0x00000A11, 0x00060041, 0x00000289,\n    0x00004C91, 0x00000CC7, 0x00000A0B, 0x000054A7, 0x0004003D, 0x0000000B,\n    0x00003143, 0x00004C91, 0x00050080, 0x0000000B, 0x00002DAB, 0x000054A7,\n    0x00000A0D, 0x00060041, 0x00000289, 0x00005FEF, 0x00000CC7, 0x00000A0B,\n    0x00002DAB, 0x0004003D, 0x0000000B, 0x0000374C, 0x00005FEF, 0x00070050,\n    0x00000017, 0x00004CD6, 0x00003142, 0x00001B76, 0x00003143, 0x0000374C,\n    0x00050084, 0x0000000B, 0x00004C2B, 0x00000A10, 0x0000199B, 0x00050080,\n    0x0000000B, 0x00002A45, 0x00001E06, 0x00004C2B, 0x000500C2, 0x0000000B,\n    0x000045E4, 0x00002A45, 0x00000A11, 0x00060041, 0x00000289, 0x00004C92,\n    0x00000CC7, 0x00000A0B, 0x000045E4, 0x0004003D, 0x0000000B, 0x00003144,\n    0x00004C92, 0x00050080, 0x0000000B, 0x00002DAC, 0x000045E4, 0x00000A0D,\n    0x00060041, 0x00000289, 0x0000194B, 0x00000CC7, 0x00000A0B, 0x00002DAC,\n    0x0004003D, 0x0000000B, 0x00005E5B, 0x0000194B, 0x00050084, 0x0000000B,\n    0x000021EF, 0x00000A13, 0x0000199B, 0x00050080, 0x0000000B, 0x00005EC0,\n    0x00001E06, 0x000021EF, 0x000500C2, 0x0000000B, 0x000045E5, 0x00005EC0,\n    0x00000A11, 0x00060041, 0x00000289, 0x00004C93, 0x00000CC7, 0x00000A0B,\n    0x000045E5, 0x0004003D, 0x0000000B, 0x00003145, 0x00004C93, 0x00050080,\n    0x0000000B, 0x00002DAD, 0x000045E5, 0x00000A0D, 0x00060041, 0x00000289,\n    0x00005FF0, 0x00000CC7, 0x00000A0B, 0x00002DAD, 0x0004003D, 0x0000000B,\n    0x00003FFC, 0x00005FF0, 0x00070050, 0x00000017, 0x0000512E, 0x00003144,\n    0x00005E5B, 0x00003145, 0x00003FFC, 0x000200F9, 0x00004F23, 0x000200F8,\n    0x000019C0, 0x000500C2, 0x0000000B, 0x00005FA7, 0x00001E06, 0x00000A11,\n    0x00060041, 0x00000289, 0x0000343C, 0x00000CC7, 0x00000A0B, 0x00005FA7,\n    0x0004003D, 0x0000000B, 0x00003146, 0x0000343C, 0x00050080, 0x0000000B,\n    0x00002DAE, 0x00005FA7, 0x00000A0D, 0x00060041, 0x00000289, 0x00001902,\n    0x00000CC7, 0x00000A0B, 0x00002DAE, 0x0004003D, 0x0000000B, 0x00005C64,\n    0x00001902, 0x00050080, 0x0000000B, 0x00002DAF, 0x00005FA7, 0x00000A10,\n    0x00060041, 0x00000289, 0x00001903, 0x00000CC7, 0x00000A0B, 0x00002DAF,\n    0x0004003D, 0x0000000B, 0x00005C65, 0x00001903, 0x00050080, 0x0000000B,\n    0x00002DB0, 0x00005FA7, 0x00000A13, 0x00060041, 0x00000289, 0x00005FF1,\n    0x00000CC7, 0x00000A0B, 0x00002DB0, 0x0004003D, 0x0000000B, 0x00003700,\n    0x00005FF1, 0x00070050, 0x00000017, 0x00005470, 0x00003146, 0x00005C64,\n    0x00005C65, 0x00003700, 0x00050080, 0x0000000B, 0x00004B83, 0x00001E06,\n    0x00000A3A, 0x000500C2, 0x0000000B, 0x0000202D, 0x00004B83, 0x00000A11,\n    0x00060041, 0x00000289, 0x00004C94, 0x00000CC7, 0x00000A0B, 0x0000202D,\n    0x0004003D, 0x0000000B, 0x00003147, 0x00004C94, 0x00050080, 0x0000000B,\n    0x00002DB1, 0x0000202D, 0x00000A0D, 0x00060041, 0x00000289, 0x00001904,\n    0x00000CC7, 0x00000A0B, 0x00002DB1, 0x0004003D, 0x0000000B, 0x00005C66,\n    0x00001904, 0x00050080, 0x0000000B, 0x00002DB2, 0x0000202D, 0x00000A10,\n    0x00060041, 0x00000289, 0x00001905, 0x00000CC7, 0x00000A0B, 0x00002DB2,\n    0x0004003D, 0x0000000B, 0x00005C67, 0x00001905, 0x00050080, 0x0000000B,\n    0x00002DB3, 0x0000202D, 0x00000A13, 0x00060041, 0x00000289, 0x00005FF2,\n    0x00000CC7, 0x00000A0B, 0x00002DB3, 0x0004003D, 0x0000000B, 0x00003FFD,\n    0x00005FF2, 0x00070050, 0x00000017, 0x0000512F, 0x00003147, 0x00005C66,\n    0x00005C67, 0x00003FFD, 0x000200F9, 0x00004F23, 0x000200F8, 0x00004F23,\n    0x000700F5, 0x00000017, 0x00002BCD, 0x0000512F, 0x000019C0, 0x0000512E,\n    0x00002300, 0x000700F5, 0x00000017, 0x00003720, 0x00005470, 0x000019C0,\n    0x00004CD6, 0x00002300, 0x000300F7, 0x00004F24, 0x00000000, 0x000700FB,\n    0x00002180, 0x00004F56, 0x00000005, 0x00002158, 0x00000007, 0x00002034,\n    0x000200F8, 0x00002034, 0x00050051, 0x0000000B, 0x00005F57, 0x00003720,\n    0x00000000, 0x0006000C, 0x00000013, 0x00006068, 0x00000001, 0x0000003E,\n    0x00005F57, 0x00050051, 0x0000000D, 0x00002775, 0x00006068, 0x00000000,\n    0x00050051, 0x0000000D, 0x00003EB8, 0x00006068, 0x00000001, 0x00050051,\n    0x0000000B, 0x00004281, 0x00003720, 0x00000001, 0x0006000C, 0x00000013,\n    0x00003CF5, 0x00000001, 0x0000003E, 0x00004281, 0x00050051, 0x0000000D,\n    0x00002766, 0x00003CF5, 0x00000000, 0x00050051, 0x0000000D, 0x00004449,\n    0x00003CF5, 0x00000001, 0x00070050, 0x0000001D, 0x0000390F, 0x00002775,\n    0x00003EB8, 0x00002766, 0x00004449, 0x00050051, 0x0000000B, 0x0000437D,\n    0x00003720, 0x00000002, 0x0006000C, 0x00000013, 0x0000466E, 0x00000001,\n    0x0000003E, 0x0000437D, 0x00050051, 0x0000000D, 0x00002776, 0x0000466E,\n    0x00000000, 0x00050051, 0x0000000D, 0x00003EB9, 0x0000466E, 0x00000001,\n    0x00050051, 0x0000000B, 0x00004282, 0x00003720, 0x00000003, 0x0006000C,\n    0x00000013, 0x00003CF6, 0x00000001, 0x0000003E, 0x00004282, 0x00050051,\n    0x0000000D, 0x00002767, 0x00003CF6, 0x00000000, 0x00050051, 0x0000000D,\n    0x0000444A, 0x00003CF6, 0x00000001, 0x00070050, 0x0000001D, 0x00003910,\n    0x00002776, 0x00003EB9, 0x00002767, 0x0000444A, 0x00050051, 0x0000000B,\n    0x0000437E, 0x00002BCD, 0x00000000, 0x0006000C, 0x00000013, 0x0000466F,\n    0x00000001, 0x0000003E, 0x0000437E, 0x00050051, 0x0000000D, 0x00002777,\n    0x0000466F, 0x00000000, 0x00050051, 0x0000000D, 0x00003EBA, 0x0000466F,\n    0x00000001, 0x00050051, 0x0000000B, 0x00004283, 0x00002BCD, 0x00000001,\n    0x0006000C, 0x00000013, 0x00003CF7, 0x00000001, 0x0000003E, 0x00004283,\n    0x00050051, 0x0000000D, 0x00002768, 0x00003CF7, 0x00000000, 0x00050051,\n    0x0000000D, 0x0000444B, 0x00003CF7, 0x00000001, 0x00070050, 0x0000001D,\n    0x00003911, 0x00002777, 0x00003EBA, 0x00002768, 0x0000444B, 0x00050051,\n    0x0000000B, 0x0000437F, 0x00002BCD, 0x00000002, 0x0006000C, 0x00000013,\n    0x00004670, 0x00000001, 0x0000003E, 0x0000437F, 0x00050051, 0x0000000D,\n    0x00002778, 0x00004670, 0x00000000, 0x00050051, 0x0000000D, 0x00003EBB,\n    0x00004670, 0x00000001, 0x00050051, 0x0000000B, 0x00004284, 0x00002BCD,\n    0x00000003, 0x0006000C, 0x00000013, 0x00003CF8, 0x00000001, 0x0000003E,\n    0x00004284, 0x00050051, 0x0000000D, 0x00002769, 0x00003CF8, 0x00000000,\n    0x00050051, 0x0000000D, 0x000050BF, 0x00003CF8, 0x00000001, 0x00070050,\n    0x0000001D, 0x0000234C, 0x00002778, 0x00003EBB, 0x00002769, 0x000050BF,\n    0x000200F9, 0x00004F24, 0x000200F8, 0x00002158, 0x0007004F, 0x00000011,\n    0x000025FB, 0x00003720, 0x00003720, 0x00000000, 0x00000001, 0x0004007C,\n    0x00000012, 0x00005B3C, 0x000025FB, 0x0009004F, 0x0000001A, 0x000060CE,\n    0x00005B3C, 0x00005B3C, 0x00000000, 0x00000000, 0x00000001, 0x00000001,\n    0x000500C4, 0x0000001A, 0x000048A6, 0x000060CE, 0x00000122, 0x000500C3,\n    0x0000001A, 0x00003D8D, 0x000048A6, 0x00000302, 0x0004006F, 0x0000001D,\n    0x00002A9B, 0x00003D8D, 0x0005008E, 0x0000001D, 0x00004721, 0x00002A9B,\n    0x000007FE, 0x0007000C, 0x0000001D, 0x00006291, 0x00000001, 0x00000028,\n    0x00000504, 0x00004721, 0x0007004F, 0x00000011, 0x0000376B, 0x00003720,\n    0x00003720, 0x00000002, 0x00000003, 0x0004007C, 0x00000012, 0x000024BF,\n    0x0000376B, 0x0009004F, 0x0000001A, 0x000060CF, 0x000024BF, 0x000024BF,\n    0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x000500C4, 0x0000001A,\n    0x000048A7, 0x000060CF, 0x00000122, 0x000500C3, 0x0000001A, 0x00003D8E,\n    0x000048A7, 0x00000302, 0x0004006F, 0x0000001D, 0x00002A9C, 0x00003D8E,\n    0x0005008E, 0x0000001D, 0x00004722, 0x00002A9C, 0x000007FE, 0x0007000C,\n    0x0000001D, 0x00006292, 0x00000001, 0x00000028, 0x00000504, 0x00004722,\n    0x0007004F, 0x00000011, 0x0000376C, 0x00002BCD, 0x00002BCD, 0x00000000,\n    0x00000001, 0x0004007C, 0x00000012, 0x000024C0, 0x0000376C, 0x0009004F,\n    0x0000001A, 0x000060D0, 0x000024C0, 0x000024C0, 0x00000000, 0x00000000,\n    0x00000001, 0x00000001, 0x000500C4, 0x0000001A, 0x000048A8, 0x000060D0,\n    0x00000122, 0x000500C3, 0x0000001A, 0x00003D8F, 0x000048A8, 0x00000302,\n    0x0004006F, 0x0000001D, 0x00002AA1, 0x00003D8F, 0x0005008E, 0x0000001D,\n    0x00004723, 0x00002AA1, 0x000007FE, 0x0007000C, 0x0000001D, 0x00006293,\n    0x00000001, 0x00000028, 0x00000504, 0x00004723, 0x0007004F, 0x00000011,\n    0x0000376D, 0x00002BCD, 0x00002BCD, 0x00000002, 0x00000003, 0x0004007C,\n    0x00000012, 0x000024C1, 0x0000376D, 0x0009004F, 0x0000001A, 0x000060D1,\n    0x000024C1, 0x000024C1, 0x00000000, 0x00000000, 0x00000001, 0x00000001,\n    0x000500C4, 0x0000001A, 0x000048A9, 0x000060D1, 0x00000122, 0x000500C3,\n    0x0000001A, 0x00003D90, 0x000048A9, 0x00000302, 0x0004006F, 0x0000001D,\n    0x00002AA2, 0x00003D90, 0x0005008E, 0x0000001D, 0x000053BF, 0x00002AA2,\n    0x000007FE, 0x0007000C, 0x0000001D, 0x00004362, 0x00000001, 0x00000028,\n    0x00000504, 0x000053BF, 0x000200F9, 0x00004F24, 0x000200F8, 0x00004F56,\n    0x0007004F, 0x00000011, 0x00002621, 0x00003720, 0x00003720, 0x00000000,\n    0x00000001, 0x0004007C, 0x00000013, 0x00005159, 0x00002621, 0x00050051,\n    0x0000000D, 0x00001B7B, 0x00005159, 0x00000000, 0x00050051, 0x0000000D,\n    0x0000346A, 0x00005159, 0x00000001, 0x00070050, 0x0000001D, 0x00004278,\n    0x00001B7B, 0x0000346A, 0x00000A0C, 0x00000A0C, 0x0007004F, 0x00000011,\n    0x000041D8, 0x00003720, 0x00003720, 0x00000002, 0x00000003, 0x0004007C,\n    0x00000013, 0x0000375D, 0x000041D8, 0x00050051, 0x0000000D, 0x00001B7C,\n    0x0000375D, 0x00000000, 0x00050051, 0x0000000D, 0x0000346B, 0x0000375D,\n    0x00000001, 0x00070050, 0x0000001D, 0x00004279, 0x00001B7C, 0x0000346B,\n    0x00000A0C, 0x00000A0C, 0x0007004F, 0x00000011, 0x000041D9, 0x00002BCD,\n    0x00002BCD, 0x00000000, 0x00000001, 0x0004007C, 0x00000013, 0x0000375E,\n    0x000041D9, 0x00050051, 0x0000000D, 0x00001B7D, 0x0000375E, 0x00000000,\n    0x00050051, 0x0000000D, 0x0000346C, 0x0000375E, 0x00000001, 0x00070050,\n    0x0000001D, 0x0000427A, 0x00001B7D, 0x0000346C, 0x00000A0C, 0x00000A0C,\n    0x0007004F, 0x00000011, 0x000041DA, 0x00002BCD, 0x00002BCD, 0x00000002,\n    0x00000003, 0x0004007C, 0x00000013, 0x0000375F, 0x000041DA, 0x00050051,\n    0x0000000D, 0x00001B7F, 0x0000375F, 0x00000000, 0x00050051, 0x0000000D,\n    0x00004108, 0x0000375F, 0x00000001, 0x00070050, 0x0000001D, 0x0000234D,\n    0x00001B7F, 0x00004108, 0x00000A0C, 0x00000A0C, 0x000200F9, 0x00004F24,\n    0x000200F8, 0x00004F24, 0x000900F5, 0x0000001D, 0x00002BA8, 0x0000234D,\n    0x00004F56, 0x00004362, 0x00002158, 0x0000234C, 0x00002034, 0x000900F5,\n    0x0000001D, 0x00003809, 0x0000427A, 0x00004F56, 0x00006293, 0x00002158,\n    0x00003911, 0x00002034, 0x000900F5, 0x0000001D, 0x00003B7E, 0x00004279,\n    0x00004F56, 0x00006292, 0x00002158, 0x00003910, 0x00002034, 0x000900F5,\n    0x0000001D, 0x000038B7, 0x00004278, 0x00004F56, 0x00006291, 0x00002158,\n    0x0000390F, 0x00002034, 0x000200F9, 0x0000530F, 0x000200F8, 0x0000530F,\n    0x000700F5, 0x0000001D, 0x00002BA9, 0x00002BA8, 0x00004F24, 0x00002BA7,\n    0x00003F60, 0x000700F5, 0x0000001D, 0x0000380A, 0x00003809, 0x00004F24,\n    0x00003808, 0x00003F60, 0x000700F5, 0x0000001D, 0x000035EC, 0x00003B7E,\n    0x00004F24, 0x00003B7D, 0x00003F60, 0x000700F5, 0x0000001D, 0x000020D3,\n    0x000038B7, 0x00004F24, 0x000038B6, 0x00003F60, 0x000500AE, 0x00000009,\n    0x00002E55, 0x00004356, 0x00000A16, 0x000300F7, 0x00005313, 0x00000002,\n    0x000400FA, 0x00002E55, 0x000051F1, 0x00005313, 0x000200F8, 0x000051F1,\n    0x00050084, 0x0000000B, 0x00002B47, 0x00000207, 0x0000229A, 0x00050085,\n    0x0000000D, 0x00005A1D, 0x00002B2C, 0x000000FC, 0x00050080, 0x0000000B,\n    0x00001FB2, 0x00001E06, 0x00002B47, 0x000300F7, 0x00005310, 0x00000002,\n    0x000400FA, 0x00005AEF, 0x00003B66, 0x000040BA, 0x000200F8, 0x000040BA,\n    0x000500AA, 0x00000009, 0x00004ADB, 0x0000199B, 0x00000A16, 0x000300F7,\n    0x00004F4A, 0x00000002, 0x000400FA, 0x00004ADB, 0x000019C1, 0x00002301,\n    0x000200F8, 0x00002301, 0x000500C2, 0x0000000B, 0x00005632, 0x00001FB2,\n    0x00000A11, 0x00060041, 0x00000289, 0x0000343D, 0x00000CC7, 0x00000A0B,\n    0x00005632, 0x0004003D, 0x0000000B, 0x00003AD5, 0x0000343D, 0x00050080,\n    0x0000000B, 0x00002147, 0x00001FB2, 0x0000199B, 0x000500C2, 0x0000000B,\n    0x000054A8, 0x00002147, 0x00000A11, 0x00060041, 0x00000289, 0x00004CDF,\n    0x00000CC7, 0x00000A0B, 0x000054A8, 0x0004003D, 0x0000000B, 0x0000333C,\n    0x00004CDF, 0x00050084, 0x0000000B, 0x000021F0, 0x00000A10, 0x0000199B,\n    0x00050080, 0x0000000B, 0x00005EC1, 0x00001FB2, 0x000021F0, 0x000500C2,\n    0x0000000B, 0x000045E6, 0x00005EC1, 0x00000A11, 0x00060041, 0x00000289,\n    0x00004CE0, 0x00000CC7, 0x00000A0B, 0x000045E6, 0x0004003D, 0x0000000B,\n    0x0000333D, 0x00004CE0, 0x00050084, 0x0000000B, 0x000021F1, 0x00000A13,\n    0x0000199B, 0x00050080, 0x0000000B, 0x00005EC2, 0x00001FB2, 0x000021F1,\n    0x000500C2, 0x0000000B, 0x000045E7, 0x00005EC2, 0x00000A11, 0x00060041,\n    0x00000289, 0x00004902, 0x00000CC7, 0x00000A0B, 0x000045E7, 0x0004003D,\n    0x0000000B, 0x00005F5A, 0x00004902, 0x00070050, 0x00000017, 0x00005130,\n    0x00003AD5, 0x0000333C, 0x0000333D, 0x00005F5A, 0x000200F9, 0x00004F4A,\n    0x000200F8, 0x000019C1, 0x000500C2, 0x0000000B, 0x00005FA8, 0x00001FB2,\n    0x00000A11, 0x00060041, 0x00000289, 0x0000343E, 0x00000CC7, 0x00000A0B,\n    0x00005FA8, 0x0004003D, 0x0000000B, 0x00003148, 0x0000343E, 0x00050080,\n    0x0000000B, 0x00002DB4, 0x00005FA8, 0x00000A0D, 0x00060041, 0x00000289,\n    0x00001906, 0x00000CC7, 0x00000A0B, 0x00002DB4, 0x0004003D, 0x0000000B,\n    0x00005C68, 0x00001906, 0x00050080, 0x0000000B, 0x00002DB5, 0x00005FA8,\n    0x00000A10, 0x00060041, 0x00000289, 0x00001907, 0x00000CC7, 0x00000A0B,\n    0x00002DB5, 0x0004003D, 0x0000000B, 0x00005C69, 0x00001907, 0x00050080,\n    0x0000000B, 0x00002DB6, 0x00005FA8, 0x00000A13, 0x00060041, 0x00000289,\n    0x00005FF3, 0x00000CC7, 0x00000A0B, 0x00002DB6, 0x0004003D, 0x0000000B,\n    0x00003FFE, 0x00005FF3, 0x00070050, 0x00000017, 0x00005131, 0x00003148,\n    0x00005C68, 0x00005C69, 0x00003FFE, 0x000200F9, 0x00004F4A, 0x000200F8,\n    0x00004F4A, 0x000700F5, 0x00000017, 0x00002AC0, 0x00005131, 0x000019C1,\n    0x00005130, 0x00002301, 0x000300F7, 0x00003F61, 0x00000000, 0x001300FB,\n    0x00002180, 0x00004BFC, 0x00000000, 0x000038FA, 0x00000001, 0x000038FA,\n    0x00000002, 0x00001CBD, 0x0000000A, 0x00001CBD, 0x00000003, 0x00001CBC,\n    0x0000000C, 0x00001CBC, 0x00000004, 0x00001FFF, 0x00000006, 0x00002035,\n    0x000200F8, 0x00002035, 0x00050051, 0x0000000B, 0x00005F58, 0x00002AC0,\n    0x00000000, 0x0006000C, 0x00000013, 0x00006069, 0x00000001, 0x0000003E,\n    0x00005F58, 0x00050051, 0x0000000D, 0x0000276A, 0x00006069, 0x00000000,\n    0x00050051, 0x0000000D, 0x0000444C, 0x00006069, 0x00000001, 0x00070050,\n    0x0000001D, 0x00003912, 0x0000276A, 0x0000444C, 0x00000A0C, 0x00000A0C,\n    0x00050051, 0x0000000B, 0x00004380, 0x00002AC0, 0x00000001, 0x0006000C,\n    0x00000013, 0x00004671, 0x00000001, 0x0000003E, 0x00004380, 0x00050051,\n    0x0000000D, 0x0000276B, 0x00004671, 0x00000000, 0x00050051, 0x0000000D,\n    0x0000444D, 0x00004671, 0x00000001, 0x00070050, 0x0000001D, 0x00003913,\n    0x0000276B, 0x0000444D, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B,\n    0x00004381, 0x00002AC0, 0x00000002, 0x0006000C, 0x00000013, 0x00004672,\n    0x00000001, 0x0000003E, 0x00004381, 0x00050051, 0x0000000D, 0x0000276C,\n    0x00004672, 0x00000000, 0x00050051, 0x0000000D, 0x0000444E, 0x00004672,\n    0x00000001, 0x00070050, 0x0000001D, 0x00003914, 0x0000276C, 0x0000444E,\n    0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x00004382, 0x00002AC0,\n    0x00000003, 0x0006000C, 0x00000013, 0x00004673, 0x00000001, 0x0000003E,\n    0x00004382, 0x00050051, 0x0000000D, 0x0000276D, 0x00004673, 0x00000000,\n    0x00050051, 0x0000000D, 0x000050C0, 0x00004673, 0x00000001, 0x00070050,\n    0x0000001D, 0x0000234E, 0x0000276D, 0x000050C0, 0x00000A0C, 0x00000A0C,\n    0x000200F9, 0x00003F61, 0x000200F8, 0x00001FFF, 0x00050051, 0x0000000B,\n    0x0000308D, 0x00002AC0, 0x00000000, 0x0004007C, 0x0000000C, 0x0000589E,\n    0x0000308D, 0x00050050, 0x00000012, 0x0000471E, 0x0000589E, 0x0000589E,\n    0x000500C4, 0x00000012, 0x000047B1, 0x0000471E, 0x000007A7, 0x000500C3,\n    0x00000012, 0x0000341B, 0x000047B1, 0x00000867, 0x0004006F, 0x00000013,\n    0x00002AA3, 0x0000341B, 0x0005008E, 0x00000013, 0x0000474B, 0x00002AA3,\n    0x000007FE, 0x0007000C, 0x00000013, 0x00005E0A, 0x00000001, 0x00000028,\n    0x00000049, 0x0000474B, 0x00050051, 0x0000000D, 0x00005F0E, 0x00005E0A,\n    0x00000000, 0x00050051, 0x0000000D, 0x00003CD7, 0x00005E0A, 0x00000001,\n    0x00070050, 0x0000001D, 0x00004121, 0x00005F0E, 0x00003CD7, 0x00000A0C,\n    0x00000A0C, 0x00050051, 0x0000000B, 0x00004C45, 0x00002AC0, 0x00000001,\n    0x0004007C, 0x0000000C, 0x00003EA4, 0x00004C45, 0x00050050, 0x00000012,\n    0x0000471F, 0x00003EA4, 0x00003EA4, 0x000500C4, 0x00000012, 0x000047B2,\n    0x0000471F, 0x000007A7, 0x000500C3, 0x00000012, 0x0000341C, 0x000047B2,\n    0x00000867, 0x0004006F, 0x00000013, 0x00002AA4, 0x0000341C, 0x0005008E,\n    0x00000013, 0x0000474C, 0x00002AA4, 0x000007FE, 0x0007000C, 0x00000013,\n    0x00005E0B, 0x00000001, 0x00000028, 0x00000049, 0x0000474C, 0x00050051,\n    0x0000000D, 0x00005F0F, 0x00005E0B, 0x00000000, 0x00050051, 0x0000000D,\n    0x00003CD8, 0x00005E0B, 0x00000001, 0x00070050, 0x0000001D, 0x00004122,\n    0x00005F0F, 0x00003CD8, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B,\n    0x00004C46, 0x00002AC0, 0x00000002, 0x0004007C, 0x0000000C, 0x00003EA5,\n    0x00004C46, 0x00050050, 0x00000012, 0x00004720, 0x00003EA5, 0x00003EA5,\n    0x000500C4, 0x00000012, 0x000047B3, 0x00004720, 0x000007A7, 0x000500C3,\n    0x00000012, 0x0000341D, 0x000047B3, 0x00000867, 0x0004006F, 0x00000013,\n    0x00002AA5, 0x0000341D, 0x0005008E, 0x00000013, 0x0000474D, 0x00002AA5,\n    0x000007FE, 0x0007000C, 0x00000013, 0x00005E0C, 0x00000001, 0x00000028,\n    0x00000049, 0x0000474D, 0x00050051, 0x0000000D, 0x00005F10, 0x00005E0C,\n    0x00000000, 0x00050051, 0x0000000D, 0x00003CD9, 0x00005E0C, 0x00000001,\n    0x00070050, 0x0000001D, 0x00004123, 0x00005F10, 0x00003CD9, 0x00000A0C,\n    0x00000A0C, 0x00050051, 0x0000000B, 0x00004C47, 0x00002AC0, 0x00000003,\n    0x0004007C, 0x0000000C, 0x00003EA6, 0x00004C47, 0x00050050, 0x00000012,\n    0x00004724, 0x00003EA6, 0x00003EA6, 0x000500C4, 0x00000012, 0x000047B4,\n    0x00004724, 0x000007A7, 0x000500C3, 0x00000012, 0x0000341E, 0x000047B4,\n    0x00000867, 0x0004006F, 0x00000013, 0x00002AA6, 0x0000341E, 0x0005008E,\n    0x00000013, 0x0000474E, 0x00002AA6, 0x000007FE, 0x0007000C, 0x00000013,\n    0x00005E0D, 0x00000001, 0x00000028, 0x00000049, 0x0000474E, 0x00050051,\n    0x0000000D, 0x00005F11, 0x00005E0D, 0x00000000, 0x00050051, 0x0000000D,\n    0x0000494D, 0x00005E0D, 0x00000001, 0x00070050, 0x0000001D, 0x0000234F,\n    0x00005F11, 0x0000494D, 0x00000A0C, 0x00000A0C, 0x000200F9, 0x00003F61,\n    0x000200F8, 0x00001CBC, 0x00050051, 0x0000000B, 0x000056C0, 0x00002AC0,\n    0x00000000, 0x00060050, 0x00000014, 0x00004F0D, 0x000056C0, 0x000056C0,\n    0x000056C0, 0x000500C2, 0x00000014, 0x00002B12, 0x00004F0D, 0x00000BB4,\n    0x000500C7, 0x00000014, 0x00005DEA, 0x00002B12, 0x00000105, 0x000500C7,\n    0x00000014, 0x000048A0, 0x00002B12, 0x00000466, 0x000500C2, 0x00000014,\n    0x00005B94, 0x00005DEA, 0x00000B0C, 0x000500AA, 0x00000010, 0x000040CD,\n    0x00005B94, 0x00000A12, 0x0006000C, 0x00000016, 0x00002C4F, 0x00000001,\n    0x0000004B, 0x000048A0, 0x0004007C, 0x00000014, 0x00002A19, 0x00002C4F,\n    0x00050082, 0x00000014, 0x0000187E, 0x00000B0C, 0x00002A19, 0x00050080,\n    0x00000014, 0x00002214, 0x00002A19, 0x00000938, 0x000600A9, 0x00000014,\n    0x00002873, 0x000040CD, 0x00002214, 0x00005B94, 0x000500C4, 0x00000014,\n    0x00005AD8, 0x000048A0, 0x0000187E, 0x000500C7, 0x00000014, 0x0000499E,\n    0x00005AD8, 0x00000466, 0x000600A9, 0x00000014, 0x00002AA7, 0x000040CD,\n    0x0000499E, 0x000048A0, 0x00050080, 0x00000014, 0x00005FFD, 0x00002873,\n    0x000003FA, 0x000500C4, 0x00000014, 0x00004F83, 0x00005FFD, 0x00000189,\n    0x000500C4, 0x00000014, 0x00003FAA, 0x00002AA7, 0x0000008D, 0x000500C5,\n    0x00000014, 0x00005780, 0x00004F83, 0x00003FAA, 0x000500AA, 0x00000010,\n    0x00003604, 0x00005DEA, 0x00000A12, 0x000600A9, 0x00000014, 0x00004246,\n    0x00003604, 0x00000A12, 0x00005780, 0x0004007C, 0x00000018, 0x000029D3,\n    0x00004246, 0x000500C2, 0x0000000B, 0x00004BA8, 0x000056C0, 0x00000A64,\n    0x00040070, 0x0000000D, 0x00004812, 0x00004BA8, 0x00050085, 0x0000000D,\n    0x00003E23, 0x00004812, 0x00000149, 0x00050051, 0x0000000D, 0x000053C6,\n    0x000029D3, 0x00000000, 0x00050051, 0x0000000D, 0x00002A59, 0x000029D3,\n    0x00000001, 0x00050051, 0x0000000D, 0x00001E9C, 0x000029D3, 0x00000002,\n    0x00070050, 0x0000001D, 0x00003DDD, 0x000053C6, 0x00002A59, 0x00001E9C,\n    0x00003E23, 0x00050051, 0x0000000B, 0x000027F8, 0x00002AC0, 0x00000001,\n    0x00060050, 0x00000014, 0x00003511, 0x000027F8, 0x000027F8, 0x000027F8,\n    0x000500C2, 0x00000014, 0x00002B13, 0x00003511, 0x00000BB4, 0x000500C7,\n    0x00000014, 0x00005DEB, 0x00002B13, 0x00000105, 0x000500C7, 0x00000014,\n    0x000048A1, 0x00002B13, 0x00000466, 0x000500C2, 0x00000014, 0x00005B95,\n    0x00005DEB, 0x00000B0C, 0x000500AA, 0x00000010, 0x000040CE, 0x00005B95,\n    0x00000A12, 0x0006000C, 0x00000016, 0x00002C50, 0x00000001, 0x0000004B,\n    0x000048A1, 0x0004007C, 0x00000014, 0x00002A1A, 0x00002C50, 0x00050082,\n    0x00000014, 0x0000187F, 0x00000B0C, 0x00002A1A, 0x00050080, 0x00000014,\n    0x00002215, 0x00002A1A, 0x00000938, 0x000600A9, 0x00000014, 0x00002874,\n    0x000040CE, 0x00002215, 0x00005B95, 0x000500C4, 0x00000014, 0x00005AD9,\n    0x000048A1, 0x0000187F, 0x000500C7, 0x00000014, 0x0000499F, 0x00005AD9,\n    0x00000466, 0x000600A9, 0x00000014, 0x00002AA8, 0x000040CE, 0x0000499F,\n    0x000048A1, 0x00050080, 0x00000014, 0x00005FFE, 0x00002874, 0x000003FA,\n    0x000500C4, 0x00000014, 0x00004F84, 0x00005FFE, 0x00000189, 0x000500C4,\n    0x00000014, 0x00003FAB, 0x00002AA8, 0x0000008D, 0x000500C5, 0x00000014,\n    0x00005781, 0x00004F84, 0x00003FAB, 0x000500AA, 0x00000010, 0x00003605,\n    0x00005DEB, 0x00000A12, 0x000600A9, 0x00000014, 0x00004247, 0x00003605,\n    0x00000A12, 0x00005781, 0x0004007C, 0x00000018, 0x000029D4, 0x00004247,\n    0x000500C2, 0x0000000B, 0x00004BA9, 0x000027F8, 0x00000A64, 0x00040070,\n    0x0000000D, 0x00004813, 0x00004BA9, 0x00050085, 0x0000000D, 0x00003E24,\n    0x00004813, 0x00000149, 0x00050051, 0x0000000D, 0x000053C7, 0x000029D4,\n    0x00000000, 0x00050051, 0x0000000D, 0x00002A5A, 0x000029D4, 0x00000001,\n    0x00050051, 0x0000000D, 0x00001E9D, 0x000029D4, 0x00000002, 0x00070050,\n    0x0000001D, 0x00003DDE, 0x000053C7, 0x00002A5A, 0x00001E9D, 0x00003E24,\n    0x00050051, 0x0000000B, 0x000027F9, 0x00002AC0, 0x00000002, 0x00060050,\n    0x00000014, 0x00003512, 0x000027F9, 0x000027F9, 0x000027F9, 0x000500C2,\n    0x00000014, 0x00002B14, 0x00003512, 0x00000BB4, 0x000500C7, 0x00000014,\n    0x00005DEC, 0x00002B14, 0x00000105, 0x000500C7, 0x00000014, 0x000048A2,\n    0x00002B14, 0x00000466, 0x000500C2, 0x00000014, 0x00005B96, 0x00005DEC,\n    0x00000B0C, 0x000500AA, 0x00000010, 0x000040CF, 0x00005B96, 0x00000A12,\n    0x0006000C, 0x00000016, 0x00002C51, 0x00000001, 0x0000004B, 0x000048A2,\n    0x0004007C, 0x00000014, 0x00002A1B, 0x00002C51, 0x00050082, 0x00000014,\n    0x00001880, 0x00000B0C, 0x00002A1B, 0x00050080, 0x00000014, 0x00002216,\n    0x00002A1B, 0x00000938, 0x000600A9, 0x00000014, 0x00002875, 0x000040CF,\n    0x00002216, 0x00005B96, 0x000500C4, 0x00000014, 0x00005ADA, 0x000048A2,\n    0x00001880, 0x000500C7, 0x00000014, 0x000049A0, 0x00005ADA, 0x00000466,\n    0x000600A9, 0x00000014, 0x00002AA9, 0x000040CF, 0x000049A0, 0x000048A2,\n    0x00050080, 0x00000014, 0x00005FFF, 0x00002875, 0x000003FA, 0x000500C4,\n    0x00000014, 0x00004F85, 0x00005FFF, 0x00000189, 0x000500C4, 0x00000014,\n    0x00003FAC, 0x00002AA9, 0x0000008D, 0x000500C5, 0x00000014, 0x00005782,\n    0x00004F85, 0x00003FAC, 0x000500AA, 0x00000010, 0x00003606, 0x00005DEC,\n    0x00000A12, 0x000600A9, 0x00000014, 0x00004248, 0x00003606, 0x00000A12,\n    0x00005782, 0x0004007C, 0x00000018, 0x000029D5, 0x00004248, 0x000500C2,\n    0x0000000B, 0x00004BAA, 0x000027F9, 0x00000A64, 0x00040070, 0x0000000D,\n    0x00004814, 0x00004BAA, 0x00050085, 0x0000000D, 0x00003E25, 0x00004814,\n    0x00000149, 0x00050051, 0x0000000D, 0x000053C8, 0x000029D5, 0x00000000,\n    0x00050051, 0x0000000D, 0x00002A5B, 0x000029D5, 0x00000001, 0x00050051,\n    0x0000000D, 0x00001E9E, 0x000029D5, 0x00000002, 0x00070050, 0x0000001D,\n    0x00003DDF, 0x000053C8, 0x00002A5B, 0x00001E9E, 0x00003E25, 0x00050051,\n    0x0000000B, 0x000027FA, 0x00002AC0, 0x00000003, 0x00060050, 0x00000014,\n    0x00003513, 0x000027FA, 0x000027FA, 0x000027FA, 0x000500C2, 0x00000014,\n    0x00002B15, 0x00003513, 0x00000BB4, 0x000500C7, 0x00000014, 0x00005DED,\n    0x00002B15, 0x00000105, 0x000500C7, 0x00000014, 0x000048A3, 0x00002B15,\n    0x00000466, 0x000500C2, 0x00000014, 0x00005B97, 0x00005DED, 0x00000B0C,\n    0x000500AA, 0x00000010, 0x000040D0, 0x00005B97, 0x00000A12, 0x0006000C,\n    0x00000016, 0x00002C52, 0x00000001, 0x0000004B, 0x000048A3, 0x0004007C,\n    0x00000014, 0x00002A1C, 0x00002C52, 0x00050082, 0x00000014, 0x00001881,\n    0x00000B0C, 0x00002A1C, 0x00050080, 0x00000014, 0x00002217, 0x00002A1C,\n    0x00000938, 0x000600A9, 0x00000014, 0x00002876, 0x000040D0, 0x00002217,\n    0x00005B97, 0x000500C4, 0x00000014, 0x00005ADB, 0x000048A3, 0x00001881,\n    0x000500C7, 0x00000014, 0x000049A1, 0x00005ADB, 0x00000466, 0x000600A9,\n    0x00000014, 0x00002AAA, 0x000040D0, 0x000049A1, 0x000048A3, 0x00050080,\n    0x00000014, 0x00006000, 0x00002876, 0x000003FA, 0x000500C4, 0x00000014,\n    0x00004F86, 0x00006000, 0x00000189, 0x000500C4, 0x00000014, 0x00003FAD,\n    0x00002AAA, 0x0000008D, 0x000500C5, 0x00000014, 0x00005783, 0x00004F86,\n    0x00003FAD, 0x000500AA, 0x00000010, 0x00003607, 0x00005DED, 0x00000A12,\n    0x000600A9, 0x00000014, 0x00004249, 0x00003607, 0x00000A12, 0x00005783,\n    0x0004007C, 0x00000018, 0x000029D6, 0x00004249, 0x000500C2, 0x0000000B,\n    0x00004BAB, 0x000027FA, 0x00000A64, 0x00040070, 0x0000000D, 0x00004815,\n    0x00004BAB, 0x00050085, 0x0000000D, 0x00003E26, 0x00004815, 0x00000149,\n    0x00050051, 0x0000000D, 0x000053C9, 0x000029D6, 0x00000000, 0x00050051,\n    0x0000000D, 0x00002A5C, 0x000029D6, 0x00000001, 0x00050051, 0x0000000D,\n    0x00002B16, 0x000029D6, 0x00000002, 0x00070050, 0x0000001D, 0x00002350,\n    0x000053C9, 0x00002A5C, 0x00002B16, 0x00003E26, 0x000200F9, 0x00003F61,\n    0x000200F8, 0x00001CBD, 0x00050051, 0x0000000B, 0x000056C1, 0x00002AC0,\n    0x00000000, 0x00070050, 0x00000017, 0x00004F0E, 0x000056C1, 0x000056C1,\n    0x000056C1, 0x000056C1, 0x000500C2, 0x00000017, 0x000024A0, 0x00004F0E,\n    0x0000034D, 0x000500C7, 0x00000017, 0x000049AF, 0x000024A0, 0x0000027B,\n    0x00040070, 0x0000001D, 0x00003CBA, 0x000049AF, 0x00050085, 0x0000001D,\n    0x00004133, 0x00003CBA, 0x00000AEE, 0x00050051, 0x0000000B, 0x00005CD5,\n    0x00002AC0, 0x00000001, 0x00070050, 0x00000017, 0x00005150, 0x00005CD5,\n    0x00005CD5, 0x00005CD5, 0x00005CD5, 0x000500C2, 0x00000017, 0x000024A1,\n    0x00005150, 0x0000034D, 0x000500C7, 0x00000017, 0x000049B0, 0x000024A1,\n    0x0000027B, 0x00040070, 0x0000001D, 0x00003CBB, 0x000049B0, 0x00050085,\n    0x0000001D, 0x00004134, 0x00003CBB, 0x00000AEE, 0x00050051, 0x0000000B,\n    0x00005CD6, 0x00002AC0, 0x00000002, 0x00070050, 0x00000017, 0x00005151,\n    0x00005CD6, 0x00005CD6, 0x00005CD6, 0x00005CD6, 0x000500C2, 0x00000017,\n    0x000024A2, 0x00005151, 0x0000034D, 0x000500C7, 0x00000017, 0x000049B1,\n    0x000024A2, 0x0000027B, 0x00040070, 0x0000001D, 0x00003CBC, 0x000049B1,\n    0x00050085, 0x0000001D, 0x00004135, 0x00003CBC, 0x00000AEE, 0x00050051,\n    0x0000000B, 0x00005CD7, 0x00002AC0, 0x00000003, 0x00070050, 0x00000017,\n    0x00005152, 0x00005CD7, 0x00005CD7, 0x00005CD7, 0x00005CD7, 0x000500C2,\n    0x00000017, 0x000024A3, 0x00005152, 0x0000034D, 0x000500C7, 0x00000017,\n    0x000049B2, 0x000024A3, 0x0000027B, 0x00040070, 0x0000001D, 0x00004930,\n    0x000049B2, 0x00050085, 0x0000001D, 0x000026A0, 0x00004930, 0x00000AEE,\n    0x000200F9, 0x00003F61, 0x000200F8, 0x000038FA, 0x00050051, 0x0000000B,\n    0x000056C2, 0x00002AC0, 0x00000000, 0x00070050, 0x00000017, 0x00004F0F,\n    0x000056C2, 0x000056C2, 0x000056C2, 0x000056C2, 0x000500C2, 0x00000017,\n    0x000024A4, 0x00004F0F, 0x0000028D, 0x000500C7, 0x00000017, 0x00004A5A,\n    0x000024A4, 0x0000064B, 0x00040070, 0x0000001D, 0x000036A5, 0x00004A5A,\n    0x0005008E, 0x0000001D, 0x00004B26, 0x000036A5, 0x0000017A, 0x00050051,\n    0x0000000B, 0x000021A2, 0x00002AC0, 0x00000001, 0x00070050, 0x00000017,\n    0x0000610E, 0x000021A2, 0x000021A2, 0x000021A2, 0x000021A2, 0x000500C2,\n    0x00000017, 0x000024A5, 0x0000610E, 0x0000028D, 0x000500C7, 0x00000017,\n    0x00004A5B, 0x000024A5, 0x0000064B, 0x00040070, 0x0000001D, 0x000036A6,\n    0x00004A5B, 0x0005008E, 0x0000001D, 0x00004B27, 0x000036A6, 0x0000017A,\n    0x00050051, 0x0000000B, 0x000021A3, 0x00002AC0, 0x00000002, 0x00070050,\n    0x00000017, 0x0000610F, 0x000021A3, 0x000021A3, 0x000021A3, 0x000021A3,\n    0x000500C2, 0x00000017, 0x000024A6, 0x0000610F, 0x0000028D, 0x000500C7,\n    0x00000017, 0x00004A5C, 0x000024A6, 0x0000064B, 0x00040070, 0x0000001D,\n    0x000036A7, 0x00004A5C, 0x0005008E, 0x0000001D, 0x00004B28, 0x000036A7,\n    0x0000017A, 0x00050051, 0x0000000B, 0x000021A4, 0x00002AC0, 0x00000003,\n    0x00070050, 0x00000017, 0x00006110, 0x000021A4, 0x000021A4, 0x000021A4,\n    0x000021A4, 0x000500C2, 0x00000017, 0x000024A7, 0x00006110, 0x0000028D,\n    0x000500C7, 0x00000017, 0x00004A5D, 0x000024A7, 0x0000064B, 0x00040070,\n    0x0000001D, 0x0000431B, 0x00004A5D, 0x0005008E, 0x0000001D, 0x00003093,\n    0x0000431B, 0x0000017A, 0x000200F9, 0x00003F61, 0x000200F8, 0x00004BFC,\n    0x00050051, 0x0000000B, 0x0000308E, 0x00002AC0, 0x00000000, 0x0004007C,\n    0x0000000D, 0x00004FEF, 0x0000308E, 0x00050050, 0x00000013, 0x00004339,\n    0x00004FEF, 0x00000A0C, 0x0009004F, 0x0000001D, 0x00002D93, 0x00004339,\n    0x00004339, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00050051,\n    0x0000000B, 0x000056B4, 0x00002AC0, 0x00000001, 0x0004007C, 0x0000000D,\n    0x00003F6B, 0x000056B4, 0x00050050, 0x00000013, 0x0000433A, 0x00003F6B,\n    0x00000A0C, 0x0009004F, 0x0000001D, 0x00002D94, 0x0000433A, 0x0000433A,\n    0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00050051, 0x0000000B,\n    0x000056B5, 0x00002AC0, 0x00000002, 0x0004007C, 0x0000000D, 0x00003F6C,\n    0x000056B5, 0x00050050, 0x00000013, 0x0000433B, 0x00003F6C, 0x00000A0C,\n    0x0009004F, 0x0000001D, 0x00002D95, 0x0000433B, 0x0000433B, 0x00000000,\n    0x00000001, 0x00000001, 0x00000001, 0x00050051, 0x0000000B, 0x000056B6,\n    0x00002AC0, 0x00000003, 0x0004007C, 0x0000000D, 0x00003F6D, 0x000056B6,\n    0x00050050, 0x00000013, 0x00004FAF, 0x00003F6D, 0x00000A0C, 0x0009004F,\n    0x0000001D, 0x00005A3B, 0x00004FAF, 0x00004FAF, 0x00000000, 0x00000001,\n    0x00000001, 0x00000001, 0x000200F9, 0x00003F61, 0x000200F8, 0x00003F61,\n    0x000F00F5, 0x0000001D, 0x00002BAA, 0x00005A3B, 0x00004BFC, 0x00003093,\n    0x000038FA, 0x000026A0, 0x00001CBD, 0x00002350, 0x00001CBC, 0x0000234F,\n    0x00001FFF, 0x0000234E, 0x00002035, 0x000F00F5, 0x0000001D, 0x0000380B,\n    0x00002D95, 0x00004BFC, 0x00004B28, 0x000038FA, 0x00004135, 0x00001CBD,\n    0x00003DDF, 0x00001CBC, 0x00004123, 0x00001FFF, 0x00003914, 0x00002035,\n    0x000F00F5, 0x0000001D, 0x00003B7F, 0x00002D94, 0x00004BFC, 0x00004B27,\n    0x000038FA, 0x00004134, 0x00001CBD, 0x00003DDE, 0x00001CBC, 0x00004122,\n    0x00001FFF, 0x00003913, 0x00002035, 0x000F00F5, 0x0000001D, 0x000038B8,\n    0x00002D93, 0x00004BFC, 0x00004B26, 0x000038FA, 0x00004133, 0x00001CBD,\n    0x00003DDD, 0x00001CBC, 0x00004121, 0x00001FFF, 0x00003912, 0x00002035,\n    0x000200F9, 0x00005310, 0x000200F8, 0x00003B66, 0x000500AA, 0x00000009,\n    0x00005451, 0x0000199B, 0x00000A22, 0x000300F7, 0x00004F25, 0x00000002,\n    0x000400FA, 0x00005451, 0x000019C2, 0x00002302, 0x000200F8, 0x00002302,\n    0x000500C2, 0x0000000B, 0x00005633, 0x00001FB2, 0x00000A11, 0x00060041,\n    0x00000289, 0x0000343F, 0x00000CC7, 0x00000A0B, 0x00005633, 0x0004003D,\n    0x0000000B, 0x00003149, 0x0000343F, 0x00050080, 0x0000000B, 0x00002DB7,\n    0x00005633, 0x00000A0D, 0x00060041, 0x00000289, 0x00001908, 0x00000CC7,\n    0x00000A0B, 0x00002DB7, 0x0004003D, 0x0000000B, 0x00001B77, 0x00001908,\n    0x00050080, 0x0000000B, 0x00002148, 0x00001FB2, 0x0000199B, 0x000500C2,\n    0x0000000B, 0x000054A9, 0x00002148, 0x00000A11, 0x00060041, 0x00000289,\n    0x00004C95, 0x00000CC7, 0x00000A0B, 0x000054A9, 0x0004003D, 0x0000000B,\n    0x0000314A, 0x00004C95, 0x00050080, 0x0000000B, 0x00002DB8, 0x000054A9,\n    0x00000A0D, 0x00060041, 0x00000289, 0x00005FF4, 0x00000CC7, 0x00000A0B,\n    0x00002DB8, 0x0004003D, 0x0000000B, 0x0000374D, 0x00005FF4, 0x00070050,\n    0x00000017, 0x00004CD7, 0x00003149, 0x00001B77, 0x0000314A, 0x0000374D,\n    0x00050084, 0x0000000B, 0x00004C2C, 0x00000A10, 0x0000199B, 0x00050080,\n    0x0000000B, 0x00002A46, 0x00001FB2, 0x00004C2C, 0x000500C2, 0x0000000B,\n    0x000045E8, 0x00002A46, 0x00000A11, 0x00060041, 0x00000289, 0x00004C96,\n    0x00000CC7, 0x00000A0B, 0x000045E8, 0x0004003D, 0x0000000B, 0x0000314B,\n    0x00004C96, 0x00050080, 0x0000000B, 0x00002DB9, 0x000045E8, 0x00000A0D,\n    0x00060041, 0x00000289, 0x0000194C, 0x00000CC7, 0x00000A0B, 0x00002DB9,\n    0x0004003D, 0x0000000B, 0x00005E5C, 0x0000194C, 0x00050084, 0x0000000B,\n    0x000021F2, 0x00000A13, 0x0000199B, 0x00050080, 0x0000000B, 0x00005EC3,\n    0x00001FB2, 0x000021F2, 0x000500C2, 0x0000000B, 0x000045E9, 0x00005EC3,\n    0x00000A11, 0x00060041, 0x00000289, 0x00004C97, 0x00000CC7, 0x00000A0B,\n    0x000045E9, 0x0004003D, 0x0000000B, 0x0000314C, 0x00004C97, 0x00050080,\n    0x0000000B, 0x00002DBA, 0x000045E9, 0x00000A0D, 0x00060041, 0x00000289,\n    0x00005FF5, 0x00000CC7, 0x00000A0B, 0x00002DBA, 0x0004003D, 0x0000000B,\n    0x00003FFF, 0x00005FF5, 0x00070050, 0x00000017, 0x00005132, 0x0000314B,\n    0x00005E5C, 0x0000314C, 0x00003FFF, 0x000200F9, 0x00004F25, 0x000200F8,\n    0x000019C2, 0x000500C2, 0x0000000B, 0x00005FA9, 0x00001FB2, 0x00000A11,\n    0x00060041, 0x00000289, 0x00003440, 0x00000CC7, 0x00000A0B, 0x00005FA9,\n    0x0004003D, 0x0000000B, 0x0000314D, 0x00003440, 0x00050080, 0x0000000B,\n    0x00002DBB, 0x00005FA9, 0x00000A0D, 0x00060041, 0x00000289, 0x00001909,\n    0x00000CC7, 0x00000A0B, 0x00002DBB, 0x0004003D, 0x0000000B, 0x00005C6A,\n    0x00001909, 0x00050080, 0x0000000B, 0x00002DBC, 0x00005FA9, 0x00000A10,\n    0x00060041, 0x00000289, 0x0000190A, 0x00000CC7, 0x00000A0B, 0x00002DBC,\n    0x0004003D, 0x0000000B, 0x00005C6B, 0x0000190A, 0x00050080, 0x0000000B,\n    0x00002DBD, 0x00005FA9, 0x00000A13, 0x00060041, 0x00000289, 0x00005FF6,\n    0x00000CC7, 0x00000A0B, 0x00002DBD, 0x0004003D, 0x0000000B, 0x00003701,\n    0x00005FF6, 0x00070050, 0x00000017, 0x00005471, 0x0000314D, 0x00005C6A,\n    0x00005C6B, 0x00003701, 0x00050080, 0x0000000B, 0x00004B84, 0x00001FB2,\n    0x00000A3A, 0x000500C2, 0x0000000B, 0x0000202E, 0x00004B84, 0x00000A11,\n    0x00060041, 0x00000289, 0x00004C98, 0x00000CC7, 0x00000A0B, 0x0000202E,\n    0x0004003D, 0x0000000B, 0x0000314E, 0x00004C98, 0x00050080, 0x0000000B,\n    0x00002DBE, 0x0000202E, 0x00000A0D, 0x00060041, 0x00000289, 0x0000190B,\n    0x00000CC7, 0x00000A0B, 0x00002DBE, 0x0004003D, 0x0000000B, 0x00005C6C,\n    0x0000190B, 0x00050080, 0x0000000B, 0x00002DBF, 0x0000202E, 0x00000A10,\n    0x00060041, 0x00000289, 0x0000190C, 0x00000CC7, 0x00000A0B, 0x00002DBF,\n    0x0004003D, 0x0000000B, 0x00005C6D, 0x0000190C, 0x00050080, 0x0000000B,\n    0x00002DC0, 0x0000202E, 0x00000A13, 0x00060041, 0x00000289, 0x00005FF7,\n    0x00000CC7, 0x00000A0B, 0x00002DC0, 0x0004003D, 0x0000000B, 0x00004000,\n    0x00005FF7, 0x00070050, 0x00000017, 0x00005133, 0x0000314E, 0x00005C6C,\n    0x00005C6D, 0x00004000, 0x000200F9, 0x00004F25, 0x000200F8, 0x00004F25,\n    0x000700F5, 0x00000017, 0x00002BCE, 0x00005133, 0x000019C2, 0x00005132,\n    0x00002302, 0x000700F5, 0x00000017, 0x00003721, 0x00005471, 0x000019C2,\n    0x00004CD7, 0x00002302, 0x000300F7, 0x00004F26, 0x00000000, 0x000700FB,\n    0x00002180, 0x00004F57, 0x00000005, 0x00002159, 0x00000007, 0x00002036,\n    0x000200F8, 0x00002036, 0x00050051, 0x0000000B, 0x00005F5B, 0x00003721,\n    0x00000000, 0x0006000C, 0x00000013, 0x0000606A, 0x00000001, 0x0000003E,\n    0x00005F5B, 0x00050051, 0x0000000D, 0x00002779, 0x0000606A, 0x00000000,\n    0x00050051, 0x0000000D, 0x00003EBC, 0x0000606A, 0x00000001, 0x00050051,\n    0x0000000B, 0x00004285, 0x00003721, 0x00000001, 0x0006000C, 0x00000013,\n    0x00003CF9, 0x00000001, 0x0000003E, 0x00004285, 0x00050051, 0x0000000D,\n    0x0000276E, 0x00003CF9, 0x00000000, 0x00050051, 0x0000000D, 0x0000444F,\n    0x00003CF9, 0x00000001, 0x00070050, 0x0000001D, 0x00003915, 0x00002779,\n    0x00003EBC, 0x0000276E, 0x0000444F, 0x00050051, 0x0000000B, 0x00004383,\n    0x00003721, 0x00000002, 0x0006000C, 0x00000013, 0x00004674, 0x00000001,\n    0x0000003E, 0x00004383, 0x00050051, 0x0000000D, 0x0000277A, 0x00004674,\n    0x00000000, 0x00050051, 0x0000000D, 0x00003EBD, 0x00004674, 0x00000001,\n    0x00050051, 0x0000000B, 0x00004286, 0x00003721, 0x00000003, 0x0006000C,\n    0x00000013, 0x00003CFA, 0x00000001, 0x0000003E, 0x00004286, 0x00050051,\n    0x0000000D, 0x0000276F, 0x00003CFA, 0x00000000, 0x00050051, 0x0000000D,\n    0x00004450, 0x00003CFA, 0x00000001, 0x00070050, 0x0000001D, 0x00003916,\n    0x0000277A, 0x00003EBD, 0x0000276F, 0x00004450, 0x00050051, 0x0000000B,\n    0x00004384, 0x00002BCE, 0x00000000, 0x0006000C, 0x00000013, 0x00004675,\n    0x00000001, 0x0000003E, 0x00004384, 0x00050051, 0x0000000D, 0x0000277B,\n    0x00004675, 0x00000000, 0x00050051, 0x0000000D, 0x00003EBE, 0x00004675,\n    0x00000001, 0x00050051, 0x0000000B, 0x00004287, 0x00002BCE, 0x00000001,\n    0x0006000C, 0x00000013, 0x00003CFB, 0x00000001, 0x0000003E, 0x00004287,\n    0x00050051, 0x0000000D, 0x00002770, 0x00003CFB, 0x00000000, 0x00050051,\n    0x0000000D, 0x00004451, 0x00003CFB, 0x00000001, 0x00070050, 0x0000001D,\n    0x00003917, 0x0000277B, 0x00003EBE, 0x00002770, 0x00004451, 0x00050051,\n    0x0000000B, 0x00004385, 0x00002BCE, 0x00000002, 0x0006000C, 0x00000013,\n    0x00004676, 0x00000001, 0x0000003E, 0x00004385, 0x00050051, 0x0000000D,\n    0x0000277C, 0x00004676, 0x00000000, 0x00050051, 0x0000000D, 0x00003EBF,\n    0x00004676, 0x00000001, 0x00050051, 0x0000000B, 0x00004288, 0x00002BCE,\n    0x00000003, 0x0006000C, 0x00000013, 0x00003CFC, 0x00000001, 0x0000003E,\n    0x00004288, 0x00050051, 0x0000000D, 0x00002771, 0x00003CFC, 0x00000000,\n    0x00050051, 0x0000000D, 0x000050C1, 0x00003CFC, 0x00000001, 0x00070050,\n    0x0000001D, 0x00002351, 0x0000277C, 0x00003EBF, 0x00002771, 0x000050C1,\n    0x000200F9, 0x00004F26, 0x000200F8, 0x00002159, 0x0007004F, 0x00000011,\n    0x000025FC, 0x00003721, 0x00003721, 0x00000000, 0x00000001, 0x0004007C,\n    0x00000012, 0x00005B3D, 0x000025FC, 0x0009004F, 0x0000001A, 0x000060D2,\n    0x00005B3D, 0x00005B3D, 0x00000000, 0x00000000, 0x00000001, 0x00000001,\n    0x000500C4, 0x0000001A, 0x000048AA, 0x000060D2, 0x00000122, 0x000500C3,\n    0x0000001A, 0x00003D91, 0x000048AA, 0x00000302, 0x0004006F, 0x0000001D,\n    0x00002AAB, 0x00003D91, 0x0005008E, 0x0000001D, 0x00004725, 0x00002AAB,\n    0x000007FE, 0x0007000C, 0x0000001D, 0x00006294, 0x00000001, 0x00000028,\n    0x00000504, 0x00004725, 0x0007004F, 0x00000011, 0x0000376E, 0x00003721,\n    0x00003721, 0x00000002, 0x00000003, 0x0004007C, 0x00000012, 0x000024C2,\n    0x0000376E, 0x0009004F, 0x0000001A, 0x000060D3, 0x000024C2, 0x000024C2,\n    0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x000500C4, 0x0000001A,\n    0x000048AB, 0x000060D3, 0x00000122, 0x000500C3, 0x0000001A, 0x00003D92,\n    0x000048AB, 0x00000302, 0x0004006F, 0x0000001D, 0x00002AAC, 0x00003D92,\n    0x0005008E, 0x0000001D, 0x00004726, 0x00002AAC, 0x000007FE, 0x0007000C,\n    0x0000001D, 0x00006295, 0x00000001, 0x00000028, 0x00000504, 0x00004726,\n    0x0007004F, 0x00000011, 0x0000376F, 0x00002BCE, 0x00002BCE, 0x00000000,\n    0x00000001, 0x0004007C, 0x00000012, 0x000024C3, 0x0000376F, 0x0009004F,\n    0x0000001A, 0x000060D4, 0x000024C3, 0x000024C3, 0x00000000, 0x00000000,\n    0x00000001, 0x00000001, 0x000500C4, 0x0000001A, 0x000048AC, 0x000060D4,\n    0x00000122, 0x000500C3, 0x0000001A, 0x00003D93, 0x000048AC, 0x00000302,\n    0x0004006F, 0x0000001D, 0x00002AAD, 0x00003D93, 0x0005008E, 0x0000001D,\n    0x00004727, 0x00002AAD, 0x000007FE, 0x0007000C, 0x0000001D, 0x00006296,\n    0x00000001, 0x00000028, 0x00000504, 0x00004727, 0x0007004F, 0x00000011,\n    0x00003770, 0x00002BCE, 0x00002BCE, 0x00000002, 0x00000003, 0x0004007C,\n    0x00000012, 0x000024C4, 0x00003770, 0x0009004F, 0x0000001A, 0x000060D5,\n    0x000024C4, 0x000024C4, 0x00000000, 0x00000000, 0x00000001, 0x00000001,\n    0x000500C4, 0x0000001A, 0x000048AD, 0x000060D5, 0x00000122, 0x000500C3,\n    0x0000001A, 0x00003D94, 0x000048AD, 0x00000302, 0x0004006F, 0x0000001D,\n    0x00002AAE, 0x00003D94, 0x0005008E, 0x0000001D, 0x000053C0, 0x00002AAE,\n    0x000007FE, 0x0007000C, 0x0000001D, 0x00004363, 0x00000001, 0x00000028,\n    0x00000504, 0x000053C0, 0x000200F9, 0x00004F26, 0x000200F8, 0x00004F57,\n    0x0007004F, 0x00000011, 0x00002622, 0x00003721, 0x00003721, 0x00000000,\n    0x00000001, 0x0004007C, 0x00000013, 0x0000515A, 0x00002622, 0x00050051,\n    0x0000000D, 0x00001B80, 0x0000515A, 0x00000000, 0x00050051, 0x0000000D,\n    0x0000346D, 0x0000515A, 0x00000001, 0x00070050, 0x0000001D, 0x0000427B,\n    0x00001B80, 0x0000346D, 0x00000A0C, 0x00000A0C, 0x0007004F, 0x00000011,\n    0x000041DB, 0x00003721, 0x00003721, 0x00000002, 0x00000003, 0x0004007C,\n    0x00000013, 0x00003760, 0x000041DB, 0x00050051, 0x0000000D, 0x00001B81,\n    0x00003760, 0x00000000, 0x00050051, 0x0000000D, 0x0000346E, 0x00003760,\n    0x00000001, 0x00070050, 0x0000001D, 0x0000427C, 0x00001B81, 0x0000346E,\n    0x00000A0C, 0x00000A0C, 0x0007004F, 0x00000011, 0x000041DC, 0x00002BCE,\n    0x00002BCE, 0x00000000, 0x00000001, 0x0004007C, 0x00000013, 0x00003761,\n    0x000041DC, 0x00050051, 0x0000000D, 0x00001B82, 0x00003761, 0x00000000,\n    0x00050051, 0x0000000D, 0x0000346F, 0x00003761, 0x00000001, 0x00070050,\n    0x0000001D, 0x0000427D, 0x00001B82, 0x0000346F, 0x00000A0C, 0x00000A0C,\n    0x0007004F, 0x00000011, 0x000041DD, 0x00002BCE, 0x00002BCE, 0x00000002,\n    0x00000003, 0x0004007C, 0x00000013, 0x00003762, 0x000041DD, 0x00050051,\n    0x0000000D, 0x00001B83, 0x00003762, 0x00000000, 0x00050051, 0x0000000D,\n    0x00004109, 0x00003762, 0x00000001, 0x00070050, 0x0000001D, 0x00002352,\n    0x00001B83, 0x00004109, 0x00000A0C, 0x00000A0C, 0x000200F9, 0x00004F26,\n    0x000200F8, 0x00004F26, 0x000900F5, 0x0000001D, 0x00002BAB, 0x00002352,\n    0x00004F57, 0x00004363, 0x00002159, 0x00002351, 0x00002036, 0x000900F5,\n    0x0000001D, 0x0000380C, 0x0000427D, 0x00004F57, 0x00006296, 0x00002159,\n    0x00003917, 0x00002036, 0x000900F5, 0x0000001D, 0x00003B80, 0x0000427C,\n    0x00004F57, 0x00006295, 0x00002159, 0x00003916, 0x00002036, 0x000900F5,\n    0x0000001D, 0x000038B9, 0x0000427B, 0x00004F57, 0x00006294, 0x00002159,\n    0x00003915, 0x00002036, 0x000200F9, 0x00005310, 0x000200F8, 0x00005310,\n    0x000700F5, 0x0000001D, 0x00002BAC, 0x00002BAB, 0x00004F26, 0x00002BAA,\n    0x00003F61, 0x000700F5, 0x0000001D, 0x0000380D, 0x0000380C, 0x00004F26,\n    0x0000380B, 0x00003F61, 0x000700F5, 0x0000001D, 0x00003295, 0x00003B80,\n    0x00004F26, 0x00003B7F, 0x00003F61, 0x000700F5, 0x0000001D, 0x0000367A,\n    0x000038B9, 0x00004F26, 0x000038B8, 0x00003F61, 0x00050081, 0x0000001D,\n    0x00004359, 0x000020D3, 0x0000367A, 0x00050081, 0x0000001D, 0x00005B01,\n    0x000035EC, 0x00003295, 0x00050081, 0x0000001D, 0x00001F92, 0x0000380A,\n    0x0000380D, 0x00050081, 0x0000001D, 0x00005113, 0x00002BA9, 0x00002BAC,\n    0x000500AE, 0x00000009, 0x0000387D, 0x00004356, 0x00000A1C, 0x000300F7,\n    0x00005ECA, 0x00000002, 0x000400FA, 0x0000387D, 0x000026B1, 0x00005ECA,\n    0x000200F8, 0x000026B1, 0x000500C4, 0x0000000B, 0x000037B2, 0x00000A16,\n    0x000023AA, 0x00050085, 0x0000000D, 0x00002F3A, 0x00002B2C, 0x0000016E,\n    0x00050080, 0x0000000B, 0x000051FC, 0x00001E06, 0x000037B2, 0x000300F7,\n    0x00005311, 0x00000002, 0x000400FA, 0x00005AEF, 0x00003B67, 0x000040BB,\n    0x000200F8, 0x000040BB, 0x000500AA, 0x00000009, 0x00004ADD, 0x0000199B,\n    0x00000A16, 0x000300F7, 0x00004F4B, 0x00000002, 0x000400FA, 0x00004ADD,\n    0x000019C3, 0x00002303, 0x000200F8, 0x00002303, 0x000500C2, 0x0000000B,\n    0x00005634, 0x000051FC, 0x00000A11, 0x00060041, 0x00000289, 0x00003441,\n    0x00000CC7, 0x00000A0B, 0x00005634, 0x0004003D, 0x0000000B, 0x00003AD6,\n    0x00003441, 0x00050080, 0x0000000B, 0x00002149, 0x000051FC, 0x0000199B,\n    0x000500C2, 0x0000000B, 0x000054AA, 0x00002149, 0x00000A11, 0x00060041,\n    0x00000289, 0x00004CE1, 0x00000CC7, 0x00000A0B, 0x000054AA, 0x0004003D,\n    0x0000000B, 0x0000333E, 0x00004CE1, 0x00050084, 0x0000000B, 0x000021F3,\n    0x00000A10, 0x0000199B, 0x00050080, 0x0000000B, 0x00005EC4, 0x000051FC,\n    0x000021F3, 0x000500C2, 0x0000000B, 0x000045EA, 0x00005EC4, 0x00000A11,\n    0x00060041, 0x00000289, 0x00004CE2, 0x00000CC7, 0x00000A0B, 0x000045EA,\n    0x0004003D, 0x0000000B, 0x0000333F, 0x00004CE2, 0x00050084, 0x0000000B,\n    0x000021F4, 0x00000A13, 0x0000199B, 0x00050080, 0x0000000B, 0x00005EC5,\n    0x000051FC, 0x000021F4, 0x000500C2, 0x0000000B, 0x000045EB, 0x00005EC5,\n    0x00000A11, 0x00060041, 0x00000289, 0x00004903, 0x00000CC7, 0x00000A0B,\n    0x000045EB, 0x0004003D, 0x0000000B, 0x00005F5C, 0x00004903, 0x00070050,\n    0x00000017, 0x00005134, 0x00003AD6, 0x0000333E, 0x0000333F, 0x00005F5C,\n    0x000200F9, 0x00004F4B, 0x000200F8, 0x000019C3, 0x000500C2, 0x0000000B,\n    0x00005FAA, 0x000051FC, 0x00000A11, 0x00060041, 0x00000289, 0x00003442,\n    0x00000CC7, 0x00000A0B, 0x00005FAA, 0x0004003D, 0x0000000B, 0x0000314F,\n    0x00003442, 0x00050080, 0x0000000B, 0x00002DC1, 0x00005FAA, 0x00000A0D,\n    0x00060041, 0x00000289, 0x0000190D, 0x00000CC7, 0x00000A0B, 0x00002DC1,\n    0x0004003D, 0x0000000B, 0x00005C6E, 0x0000190D, 0x00050080, 0x0000000B,\n    0x00002DC2, 0x00005FAA, 0x00000A10, 0x00060041, 0x00000289, 0x0000190E,\n    0x00000CC7, 0x00000A0B, 0x00002DC2, 0x0004003D, 0x0000000B, 0x00005C6F,\n    0x0000190E, 0x00050080, 0x0000000B, 0x00002DC3, 0x00005FAA, 0x00000A13,\n    0x00060041, 0x00000289, 0x00005FF8, 0x00000CC7, 0x00000A0B, 0x00002DC3,\n    0x0004003D, 0x0000000B, 0x00004001, 0x00005FF8, 0x00070050, 0x00000017,\n    0x00005135, 0x0000314F, 0x00005C6E, 0x00005C6F, 0x00004001, 0x000200F9,\n    0x00004F4B, 0x000200F8, 0x00004F4B, 0x000700F5, 0x00000017, 0x00002AC1,\n    0x00005135, 0x000019C3, 0x00005134, 0x00002303, 0x000300F7, 0x00003F62,\n    0x00000000, 0x001300FB, 0x00002180, 0x00004BFD, 0x00000000, 0x000038FB,\n    0x00000001, 0x000038FB, 0x00000002, 0x00001CBF, 0x0000000A, 0x00001CBF,\n    0x00000003, 0x00001CBE, 0x0000000C, 0x00001CBE, 0x00000004, 0x00002000,\n    0x00000006, 0x00002037, 0x000200F8, 0x00002037, 0x00050051, 0x0000000B,\n    0x00005F5D, 0x00002AC1, 0x00000000, 0x0006000C, 0x00000013, 0x0000606B,\n    0x00000001, 0x0000003E, 0x00005F5D, 0x00050051, 0x0000000D, 0x00002772,\n    0x0000606B, 0x00000000, 0x00050051, 0x0000000D, 0x00004452, 0x0000606B,\n    0x00000001, 0x00070050, 0x0000001D, 0x00003918, 0x00002772, 0x00004452,\n    0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x00004386, 0x00002AC1,\n    0x00000001, 0x0006000C, 0x00000013, 0x00004677, 0x00000001, 0x0000003E,\n    0x00004386, 0x00050051, 0x0000000D, 0x00002773, 0x00004677, 0x00000000,\n    0x00050051, 0x0000000D, 0x00004453, 0x00004677, 0x00000001, 0x00070050,\n    0x0000001D, 0x00003919, 0x00002773, 0x00004453, 0x00000A0C, 0x00000A0C,\n    0x00050051, 0x0000000B, 0x00004387, 0x00002AC1, 0x00000002, 0x0006000C,\n    0x00000013, 0x00004678, 0x00000001, 0x0000003E, 0x00004387, 0x00050051,\n    0x0000000D, 0x00002774, 0x00004678, 0x00000000, 0x00050051, 0x0000000D,\n    0x00004454, 0x00004678, 0x00000001, 0x00070050, 0x0000001D, 0x0000391A,\n    0x00002774, 0x00004454, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B,\n    0x00004388, 0x00002AC1, 0x00000003, 0x0006000C, 0x00000013, 0x00004679,\n    0x00000001, 0x0000003E, 0x00004388, 0x00050051, 0x0000000D, 0x0000277D,\n    0x00004679, 0x00000000, 0x00050051, 0x0000000D, 0x000050C2, 0x00004679,\n    0x00000001, 0x00070050, 0x0000001D, 0x00002353, 0x0000277D, 0x000050C2,\n    0x00000A0C, 0x00000A0C, 0x000200F9, 0x00003F62, 0x000200F8, 0x00002000,\n    0x00050051, 0x0000000B, 0x0000308F, 0x00002AC1, 0x00000000, 0x0004007C,\n    0x0000000C, 0x0000589F, 0x0000308F, 0x00050050, 0x00000012, 0x00004728,\n    0x0000589F, 0x0000589F, 0x000500C4, 0x00000012, 0x000047B5, 0x00004728,\n    0x000007A7, 0x000500C3, 0x00000012, 0x0000341F, 0x000047B5, 0x00000867,\n    0x0004006F, 0x00000013, 0x00002AAF, 0x0000341F, 0x0005008E, 0x00000013,\n    0x0000474F, 0x00002AAF, 0x000007FE, 0x0007000C, 0x00000013, 0x00005E0E,\n    0x00000001, 0x00000028, 0x00000049, 0x0000474F, 0x00050051, 0x0000000D,\n    0x00005F12, 0x00005E0E, 0x00000000, 0x00050051, 0x0000000D, 0x00003CDA,\n    0x00005E0E, 0x00000001, 0x00070050, 0x0000001D, 0x00004124, 0x00005F12,\n    0x00003CDA, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x00004C48,\n    0x00002AC1, 0x00000001, 0x0004007C, 0x0000000C, 0x00003EA7, 0x00004C48,\n    0x00050050, 0x00000012, 0x00004729, 0x00003EA7, 0x00003EA7, 0x000500C4,\n    0x00000012, 0x000047B6, 0x00004729, 0x000007A7, 0x000500C3, 0x00000012,\n    0x00003420, 0x000047B6, 0x00000867, 0x0004006F, 0x00000013, 0x00002AB0,\n    0x00003420, 0x0005008E, 0x00000013, 0x00004750, 0x00002AB0, 0x000007FE,\n    0x0007000C, 0x00000013, 0x00005E0F, 0x00000001, 0x00000028, 0x00000049,\n    0x00004750, 0x00050051, 0x0000000D, 0x00005F13, 0x00005E0F, 0x00000000,\n    0x00050051, 0x0000000D, 0x00003CDB, 0x00005E0F, 0x00000001, 0x00070050,\n    0x0000001D, 0x00004125, 0x00005F13, 0x00003CDB, 0x00000A0C, 0x00000A0C,\n    0x00050051, 0x0000000B, 0x00004C49, 0x00002AC1, 0x00000002, 0x0004007C,\n    0x0000000C, 0x00003EA8, 0x00004C49, 0x00050050, 0x00000012, 0x0000472A,\n    0x00003EA8, 0x00003EA8, 0x000500C4, 0x00000012, 0x000047B7, 0x0000472A,\n    0x000007A7, 0x000500C3, 0x00000012, 0x00003421, 0x000047B7, 0x00000867,\n    0x0004006F, 0x00000013, 0x00002AB1, 0x00003421, 0x0005008E, 0x00000013,\n    0x00004751, 0x00002AB1, 0x000007FE, 0x0007000C, 0x00000013, 0x00005E10,\n    0x00000001, 0x00000028, 0x00000049, 0x00004751, 0x00050051, 0x0000000D,\n    0x00005F14, 0x00005E10, 0x00000000, 0x00050051, 0x0000000D, 0x00003CDC,\n    0x00005E10, 0x00000001, 0x00070050, 0x0000001D, 0x00004126, 0x00005F14,\n    0x00003CDC, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x00004C4A,\n    0x00002AC1, 0x00000003, 0x0004007C, 0x0000000C, 0x00003EA9, 0x00004C4A,\n    0x00050050, 0x00000012, 0x0000472B, 0x00003EA9, 0x00003EA9, 0x000500C4,\n    0x00000012, 0x000047B8, 0x0000472B, 0x000007A7, 0x000500C3, 0x00000012,\n    0x00003422, 0x000047B8, 0x00000867, 0x0004006F, 0x00000013, 0x00002AB2,\n    0x00003422, 0x0005008E, 0x00000013, 0x00004752, 0x00002AB2, 0x000007FE,\n    0x0007000C, 0x00000013, 0x00005E11, 0x00000001, 0x00000028, 0x00000049,\n    0x00004752, 0x00050051, 0x0000000D, 0x00005F15, 0x00005E11, 0x00000000,\n    0x00050051, 0x0000000D, 0x0000494E, 0x00005E11, 0x00000001, 0x00070050,\n    0x0000001D, 0x00002354, 0x00005F15, 0x0000494E, 0x00000A0C, 0x00000A0C,\n    0x000200F9, 0x00003F62, 0x000200F8, 0x00001CBE, 0x00050051, 0x0000000B,\n    0x000056C3, 0x00002AC1, 0x00000000, 0x00060050, 0x00000014, 0x00004F10,\n    0x000056C3, 0x000056C3, 0x000056C3, 0x000500C2, 0x00000014, 0x00002B17,\n    0x00004F10, 0x00000BB4, 0x000500C7, 0x00000014, 0x00005DEE, 0x00002B17,\n    0x00000105, 0x000500C7, 0x00000014, 0x000048A4, 0x00002B17, 0x00000466,\n    0x000500C2, 0x00000014, 0x00005B98, 0x00005DEE, 0x00000B0C, 0x000500AA,\n    0x00000010, 0x000040D1, 0x00005B98, 0x00000A12, 0x0006000C, 0x00000016,\n    0x00002C53, 0x00000001, 0x0000004B, 0x000048A4, 0x0004007C, 0x00000014,\n    0x00002A1D, 0x00002C53, 0x00050082, 0x00000014, 0x00001882, 0x00000B0C,\n    0x00002A1D, 0x00050080, 0x00000014, 0x00002218, 0x00002A1D, 0x00000938,\n    0x000600A9, 0x00000014, 0x00002877, 0x000040D1, 0x00002218, 0x00005B98,\n    0x000500C4, 0x00000014, 0x00005ADC, 0x000048A4, 0x00001882, 0x000500C7,\n    0x00000014, 0x000049A2, 0x00005ADC, 0x00000466, 0x000600A9, 0x00000014,\n    0x00002AB3, 0x000040D1, 0x000049A2, 0x000048A4, 0x00050080, 0x00000014,\n    0x00006001, 0x00002877, 0x000003FA, 0x000500C4, 0x00000014, 0x00004F87,\n    0x00006001, 0x00000189, 0x000500C4, 0x00000014, 0x00003FAE, 0x00002AB3,\n    0x0000008D, 0x000500C5, 0x00000014, 0x00005784, 0x00004F87, 0x00003FAE,\n    0x000500AA, 0x00000010, 0x00003608, 0x00005DEE, 0x00000A12, 0x000600A9,\n    0x00000014, 0x0000424A, 0x00003608, 0x00000A12, 0x00005784, 0x0004007C,\n    0x00000018, 0x000029D7, 0x0000424A, 0x000500C2, 0x0000000B, 0x00004BAC,\n    0x000056C3, 0x00000A64, 0x00040070, 0x0000000D, 0x00004816, 0x00004BAC,\n    0x00050085, 0x0000000D, 0x00003E27, 0x00004816, 0x00000149, 0x00050051,\n    0x0000000D, 0x000053CA, 0x000029D7, 0x00000000, 0x00050051, 0x0000000D,\n    0x00002A5D, 0x000029D7, 0x00000001, 0x00050051, 0x0000000D, 0x00001E9F,\n    0x000029D7, 0x00000002, 0x00070050, 0x0000001D, 0x00003DE0, 0x000053CA,\n    0x00002A5D, 0x00001E9F, 0x00003E27, 0x00050051, 0x0000000B, 0x000027FB,\n    0x00002AC1, 0x00000001, 0x00060050, 0x00000014, 0x00003514, 0x000027FB,\n    0x000027FB, 0x000027FB, 0x000500C2, 0x00000014, 0x00002B18, 0x00003514,\n    0x00000BB4, 0x000500C7, 0x00000014, 0x00005DEF, 0x00002B18, 0x00000105,\n    0x000500C7, 0x00000014, 0x000048A5, 0x00002B18, 0x00000466, 0x000500C2,\n    0x00000014, 0x00005B99, 0x00005DEF, 0x00000B0C, 0x000500AA, 0x00000010,\n    0x000040D2, 0x00005B99, 0x00000A12, 0x0006000C, 0x00000016, 0x00002C54,\n    0x00000001, 0x0000004B, 0x000048A5, 0x0004007C, 0x00000014, 0x00002A1E,\n    0x00002C54, 0x00050082, 0x00000014, 0x00001883, 0x00000B0C, 0x00002A1E,\n    0x00050080, 0x00000014, 0x00002219, 0x00002A1E, 0x00000938, 0x000600A9,\n    0x00000014, 0x00002878, 0x000040D2, 0x00002219, 0x00005B99, 0x000500C4,\n    0x00000014, 0x00005ADD, 0x000048A5, 0x00001883, 0x000500C7, 0x00000014,\n    0x000049A3, 0x00005ADD, 0x00000466, 0x000600A9, 0x00000014, 0x00002AB4,\n    0x000040D2, 0x000049A3, 0x000048A5, 0x00050080, 0x00000014, 0x00006002,\n    0x00002878, 0x000003FA, 0x000500C4, 0x00000014, 0x00004F88, 0x00006002,\n    0x00000189, 0x000500C4, 0x00000014, 0x00003FAF, 0x00002AB4, 0x0000008D,\n    0x000500C5, 0x00000014, 0x00005785, 0x00004F88, 0x00003FAF, 0x000500AA,\n    0x00000010, 0x00003609, 0x00005DEF, 0x00000A12, 0x000600A9, 0x00000014,\n    0x0000424B, 0x00003609, 0x00000A12, 0x00005785, 0x0004007C, 0x00000018,\n    0x000029D8, 0x0000424B, 0x000500C2, 0x0000000B, 0x00004BAD, 0x000027FB,\n    0x00000A64, 0x00040070, 0x0000000D, 0x00004817, 0x00004BAD, 0x00050085,\n    0x0000000D, 0x00003E28, 0x00004817, 0x00000149, 0x00050051, 0x0000000D,\n    0x000053CB, 0x000029D8, 0x00000000, 0x00050051, 0x0000000D, 0x00002A5E,\n    0x000029D8, 0x00000001, 0x00050051, 0x0000000D, 0x00001EA0, 0x000029D8,\n    0x00000002, 0x00070050, 0x0000001D, 0x00003DE1, 0x000053CB, 0x00002A5E,\n    0x00001EA0, 0x00003E28, 0x00050051, 0x0000000B, 0x000027FC, 0x00002AC1,\n    0x00000002, 0x00060050, 0x00000014, 0x00003515, 0x000027FC, 0x000027FC,\n    0x000027FC, 0x000500C2, 0x00000014, 0x00002B19, 0x00003515, 0x00000BB4,\n    0x000500C7, 0x00000014, 0x00005DF0, 0x00002B19, 0x00000105, 0x000500C7,\n    0x00000014, 0x000048AE, 0x00002B19, 0x00000466, 0x000500C2, 0x00000014,\n    0x00005B9A, 0x00005DF0, 0x00000B0C, 0x000500AA, 0x00000010, 0x000040D3,\n    0x00005B9A, 0x00000A12, 0x0006000C, 0x00000016, 0x00002C55, 0x00000001,\n    0x0000004B, 0x000048AE, 0x0004007C, 0x00000014, 0x00002A1F, 0x00002C55,\n    0x00050082, 0x00000014, 0x00001884, 0x00000B0C, 0x00002A1F, 0x00050080,\n    0x00000014, 0x0000221A, 0x00002A1F, 0x00000938, 0x000600A9, 0x00000014,\n    0x00002879, 0x000040D3, 0x0000221A, 0x00005B9A, 0x000500C4, 0x00000014,\n    0x00005ADE, 0x000048AE, 0x00001884, 0x000500C7, 0x00000014, 0x000049A4,\n    0x00005ADE, 0x00000466, 0x000600A9, 0x00000014, 0x00002AB5, 0x000040D3,\n    0x000049A4, 0x000048AE, 0x00050080, 0x00000014, 0x00006003, 0x00002879,\n    0x000003FA, 0x000500C4, 0x00000014, 0x00004F89, 0x00006003, 0x00000189,\n    0x000500C4, 0x00000014, 0x00003FB0, 0x00002AB5, 0x0000008D, 0x000500C5,\n    0x00000014, 0x00005786, 0x00004F89, 0x00003FB0, 0x000500AA, 0x00000010,\n    0x0000360A, 0x00005DF0, 0x00000A12, 0x000600A9, 0x00000014, 0x0000424C,\n    0x0000360A, 0x00000A12, 0x00005786, 0x0004007C, 0x00000018, 0x000029D9,\n    0x0000424C, 0x000500C2, 0x0000000B, 0x00004BAE, 0x000027FC, 0x00000A64,\n    0x00040070, 0x0000000D, 0x00004818, 0x00004BAE, 0x00050085, 0x0000000D,\n    0x00003E29, 0x00004818, 0x00000149, 0x00050051, 0x0000000D, 0x000053CC,\n    0x000029D9, 0x00000000, 0x00050051, 0x0000000D, 0x00002A5F, 0x000029D9,\n    0x00000001, 0x00050051, 0x0000000D, 0x00001EA1, 0x000029D9, 0x00000002,\n    0x00070050, 0x0000001D, 0x00003DE2, 0x000053CC, 0x00002A5F, 0x00001EA1,\n    0x00003E29, 0x00050051, 0x0000000B, 0x000027FD, 0x00002AC1, 0x00000003,\n    0x00060050, 0x00000014, 0x00003516, 0x000027FD, 0x000027FD, 0x000027FD,\n    0x000500C2, 0x00000014, 0x00002B1A, 0x00003516, 0x00000BB4, 0x000500C7,\n    0x00000014, 0x00005DF1, 0x00002B1A, 0x00000105, 0x000500C7, 0x00000014,\n    0x000048AF, 0x00002B1A, 0x00000466, 0x000500C2, 0x00000014, 0x00005B9B,\n    0x00005DF1, 0x00000B0C, 0x000500AA, 0x00000010, 0x000040D4, 0x00005B9B,\n    0x00000A12, 0x0006000C, 0x00000016, 0x00002C56, 0x00000001, 0x0000004B,\n    0x000048AF, 0x0004007C, 0x00000014, 0x00002A20, 0x00002C56, 0x00050082,\n    0x00000014, 0x00001885, 0x00000B0C, 0x00002A20, 0x00050080, 0x00000014,\n    0x0000221B, 0x00002A20, 0x00000938, 0x000600A9, 0x00000014, 0x0000287A,\n    0x000040D4, 0x0000221B, 0x00005B9B, 0x000500C4, 0x00000014, 0x00005ADF,\n    0x000048AF, 0x00001885, 0x000500C7, 0x00000014, 0x000049A5, 0x00005ADF,\n    0x00000466, 0x000600A9, 0x00000014, 0x00002AB6, 0x000040D4, 0x000049A5,\n    0x000048AF, 0x00050080, 0x00000014, 0x00006004, 0x0000287A, 0x000003FA,\n    0x000500C4, 0x00000014, 0x00004F8A, 0x00006004, 0x00000189, 0x000500C4,\n    0x00000014, 0x00003FB1, 0x00002AB6, 0x0000008D, 0x000500C5, 0x00000014,\n    0x00005787, 0x00004F8A, 0x00003FB1, 0x000500AA, 0x00000010, 0x0000360B,\n    0x00005DF1, 0x00000A12, 0x000600A9, 0x00000014, 0x0000424D, 0x0000360B,\n    0x00000A12, 0x00005787, 0x0004007C, 0x00000018, 0x000029DA, 0x0000424D,\n    0x000500C2, 0x0000000B, 0x00004BAF, 0x000027FD, 0x00000A64, 0x00040070,\n    0x0000000D, 0x00004819, 0x00004BAF, 0x00050085, 0x0000000D, 0x00003E2A,\n    0x00004819, 0x00000149, 0x00050051, 0x0000000D, 0x000053CD, 0x000029DA,\n    0x00000000, 0x00050051, 0x0000000D, 0x00002A60, 0x000029DA, 0x00000001,\n    0x00050051, 0x0000000D, 0x00002B1B, 0x000029DA, 0x00000002, 0x00070050,\n    0x0000001D, 0x00002355, 0x000053CD, 0x00002A60, 0x00002B1B, 0x00003E2A,\n    0x000200F9, 0x00003F62, 0x000200F8, 0x00001CBF, 0x00050051, 0x0000000B,\n    0x000056C4, 0x00002AC1, 0x00000000, 0x00070050, 0x00000017, 0x00004F11,\n    0x000056C4, 0x000056C4, 0x000056C4, 0x000056C4, 0x000500C2, 0x00000017,\n    0x000024A8, 0x00004F11, 0x0000034D, 0x000500C7, 0x00000017, 0x000049B3,\n    0x000024A8, 0x0000027B, 0x00040070, 0x0000001D, 0x00003CBD, 0x000049B3,\n    0x00050085, 0x0000001D, 0x00004136, 0x00003CBD, 0x00000AEE, 0x00050051,\n    0x0000000B, 0x00005CD8, 0x00002AC1, 0x00000001, 0x00070050, 0x00000017,\n    0x00005153, 0x00005CD8, 0x00005CD8, 0x00005CD8, 0x00005CD8, 0x000500C2,\n    0x00000017, 0x000024A9, 0x00005153, 0x0000034D, 0x000500C7, 0x00000017,\n    0x000049B4, 0x000024A9, 0x0000027B, 0x00040070, 0x0000001D, 0x00003CBE,\n    0x000049B4, 0x00050085, 0x0000001D, 0x00004137, 0x00003CBE, 0x00000AEE,\n    0x00050051, 0x0000000B, 0x00005CD9, 0x00002AC1, 0x00000002, 0x00070050,\n    0x00000017, 0x00005154, 0x00005CD9, 0x00005CD9, 0x00005CD9, 0x00005CD9,\n    0x000500C2, 0x00000017, 0x000024AA, 0x00005154, 0x0000034D, 0x000500C7,\n    0x00000017, 0x000049B5, 0x000024AA, 0x0000027B, 0x00040070, 0x0000001D,\n    0x00003CBF, 0x000049B5, 0x00050085, 0x0000001D, 0x00004138, 0x00003CBF,\n    0x00000AEE, 0x00050051, 0x0000000B, 0x00005CDA, 0x00002AC1, 0x00000003,\n    0x00070050, 0x00000017, 0x00005155, 0x00005CDA, 0x00005CDA, 0x00005CDA,\n    0x00005CDA, 0x000500C2, 0x00000017, 0x000024AB, 0x00005155, 0x0000034D,\n    0x000500C7, 0x00000017, 0x000049B6, 0x000024AB, 0x0000027B, 0x00040070,\n    0x0000001D, 0x00004931, 0x000049B6, 0x00050085, 0x0000001D, 0x000026A1,\n    0x00004931, 0x00000AEE, 0x000200F9, 0x00003F62, 0x000200F8, 0x000038FB,\n    0x00050051, 0x0000000B, 0x000056C5, 0x00002AC1, 0x00000000, 0x00070050,\n    0x00000017, 0x00004F12, 0x000056C5, 0x000056C5, 0x000056C5, 0x000056C5,\n    0x000500C2, 0x00000017, 0x000024AC, 0x00004F12, 0x0000028D, 0x000500C7,\n    0x00000017, 0x00004A5E, 0x000024AC, 0x0000064B, 0x00040070, 0x0000001D,\n    0x000036A8, 0x00004A5E, 0x0005008E, 0x0000001D, 0x00004B29, 0x000036A8,\n    0x0000017A, 0x00050051, 0x0000000B, 0x000021A5, 0x00002AC1, 0x00000001,\n    0x00070050, 0x00000017, 0x00006111, 0x000021A5, 0x000021A5, 0x000021A5,\n    0x000021A5, 0x000500C2, 0x00000017, 0x000024AD, 0x00006111, 0x0000028D,\n    0x000500C7, 0x00000017, 0x00004A5F, 0x000024AD, 0x0000064B, 0x00040070,\n    0x0000001D, 0x000036A9, 0x00004A5F, 0x0005008E, 0x0000001D, 0x00004B2A,\n    0x000036A9, 0x0000017A, 0x00050051, 0x0000000B, 0x000021A6, 0x00002AC1,\n    0x00000002, 0x00070050, 0x00000017, 0x00006112, 0x000021A6, 0x000021A6,\n    0x000021A6, 0x000021A6, 0x000500C2, 0x00000017, 0x000024AE, 0x00006112,\n    0x0000028D, 0x000500C7, 0x00000017, 0x00004A60, 0x000024AE, 0x0000064B,\n    0x00040070, 0x0000001D, 0x000036AA, 0x00004A60, 0x0005008E, 0x0000001D,\n    0x00004B2B, 0x000036AA, 0x0000017A, 0x00050051, 0x0000000B, 0x000021A7,\n    0x00002AC1, 0x00000003, 0x00070050, 0x00000017, 0x00006113, 0x000021A7,\n    0x000021A7, 0x000021A7, 0x000021A7, 0x000500C2, 0x00000017, 0x000024AF,\n    0x00006113, 0x0000028D, 0x000500C7, 0x00000017, 0x00004A61, 0x000024AF,\n    0x0000064B, 0x00040070, 0x0000001D, 0x0000431C, 0x00004A61, 0x0005008E,\n    0x0000001D, 0x00003094, 0x0000431C, 0x0000017A, 0x000200F9, 0x00003F62,\n    0x000200F8, 0x00004BFD, 0x00050051, 0x0000000B, 0x00003090, 0x00002AC1,\n    0x00000000, 0x0004007C, 0x0000000D, 0x00004FF0, 0x00003090, 0x00050050,\n    0x00000013, 0x0000433C, 0x00004FF0, 0x00000A0C, 0x0009004F, 0x0000001D,\n    0x00002D96, 0x0000433C, 0x0000433C, 0x00000000, 0x00000001, 0x00000001,\n    0x00000001, 0x00050051, 0x0000000B, 0x000056B7, 0x00002AC1, 0x00000001,\n    0x0004007C, 0x0000000D, 0x00003F6E, 0x000056B7, 0x00050050, 0x00000013,\n    0x0000433D, 0x00003F6E, 0x00000A0C, 0x0009004F, 0x0000001D, 0x00002D97,\n    0x0000433D, 0x0000433D, 0x00000000, 0x00000001, 0x00000001, 0x00000001,\n    0x00050051, 0x0000000B, 0x000056B8, 0x00002AC1, 0x00000002, 0x0004007C,\n    0x0000000D, 0x00003F6F, 0x000056B8, 0x00050050, 0x00000013, 0x0000433E,\n    0x00003F6F, 0x00000A0C, 0x0009004F, 0x0000001D, 0x00002D98, 0x0000433E,\n    0x0000433E, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00050051,\n    0x0000000B, 0x000056B9, 0x00002AC1, 0x00000003, 0x0004007C, 0x0000000D,\n    0x00003F70, 0x000056B9, 0x00050050, 0x00000013, 0x00004FB0, 0x00003F70,\n    0x00000A0C, 0x0009004F, 0x0000001D, 0x00005A3C, 0x00004FB0, 0x00004FB0,\n    0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x000200F9, 0x00003F62,\n    0x000200F8, 0x00003F62, 0x000F00F5, 0x0000001D, 0x00002BAD, 0x00005A3C,\n    0x00004BFD, 0x00003094, 0x000038FB, 0x000026A1, 0x00001CBF, 0x00002355,\n    0x00001CBE, 0x00002354, 0x00002000, 0x00002353, 0x00002037, 0x000F00F5,\n    0x0000001D, 0x0000380E, 0x00002D98, 0x00004BFD, 0x00004B2B, 0x000038FB,\n    0x00004138, 0x00001CBF, 0x00003DE2, 0x00001CBE, 0x00004126, 0x00002000,\n    0x0000391A, 0x00002037, 0x000F00F5, 0x0000001D, 0x00003B81, 0x00002D97,\n    0x00004BFD, 0x00004B2A, 0x000038FB, 0x00004137, 0x00001CBF, 0x00003DE1,\n    0x00001CBE, 0x00004125, 0x00002000, 0x00003919, 0x00002037, 0x000F00F5,\n    0x0000001D, 0x000038BA, 0x00002D96, 0x00004BFD, 0x00004B29, 0x000038FB,\n    0x00004136, 0x00001CBF, 0x00003DE0, 0x00001CBE, 0x00004124, 0x00002000,\n    0x00003918, 0x00002037, 0x000200F9, 0x00005311, 0x000200F8, 0x00003B67,\n    0x000500AA, 0x00000009, 0x00005452, 0x0000199B, 0x00000A22, 0x000300F7,\n    0x00004F27, 0x00000002, 0x000400FA, 0x00005452, 0x000019C4, 0x00002304,\n    0x000200F8, 0x00002304, 0x000500C2, 0x0000000B, 0x00005635, 0x000051FC,\n    0x00000A11, 0x00060041, 0x00000289, 0x00003443, 0x00000CC7, 0x00000A0B,\n    0x00005635, 0x0004003D, 0x0000000B, 0x00003150, 0x00003443, 0x00050080,\n    0x0000000B, 0x00002DC4, 0x00005635, 0x00000A0D, 0x00060041, 0x00000289,\n    0x0000190F, 0x00000CC7, 0x00000A0B, 0x00002DC4, 0x0004003D, 0x0000000B,\n    0x00001B78, 0x0000190F, 0x00050080, 0x0000000B, 0x0000214A, 0x000051FC,\n    0x0000199B, 0x000500C2, 0x0000000B, 0x000054AB, 0x0000214A, 0x00000A11,\n    0x00060041, 0x00000289, 0x00004C99, 0x00000CC7, 0x00000A0B, 0x000054AB,\n    0x0004003D, 0x0000000B, 0x00003151, 0x00004C99, 0x00050080, 0x0000000B,\n    0x00002DC5, 0x000054AB, 0x00000A0D, 0x00060041, 0x00000289, 0x00006005,\n    0x00000CC7, 0x00000A0B, 0x00002DC5, 0x0004003D, 0x0000000B, 0x0000374E,\n    0x00006005, 0x00070050, 0x00000017, 0x00004CD9, 0x00003150, 0x00001B78,\n    0x00003151, 0x0000374E, 0x00050084, 0x0000000B, 0x00004C2D, 0x00000A10,\n    0x0000199B, 0x00050080, 0x0000000B, 0x00002A47, 0x000051FC, 0x00004C2D,\n    0x000500C2, 0x0000000B, 0x000045EC, 0x00002A47, 0x00000A11, 0x00060041,\n    0x00000289, 0x00004C9A, 0x00000CC7, 0x00000A0B, 0x000045EC, 0x0004003D,\n    0x0000000B, 0x00003152, 0x00004C9A, 0x00050080, 0x0000000B, 0x00002DC6,\n    0x000045EC, 0x00000A0D, 0x00060041, 0x00000289, 0x0000194D, 0x00000CC7,\n    0x00000A0B, 0x00002DC6, 0x0004003D, 0x0000000B, 0x00005E5D, 0x0000194D,\n    0x00050084, 0x0000000B, 0x000021F5, 0x00000A13, 0x0000199B, 0x00050080,\n    0x0000000B, 0x00005EC6, 0x000051FC, 0x000021F5, 0x000500C2, 0x0000000B,\n    0x000045ED, 0x00005EC6, 0x00000A11, 0x00060041, 0x00000289, 0x00004C9B,\n    0x00000CC7, 0x00000A0B, 0x000045ED, 0x0004003D, 0x0000000B, 0x00003153,\n    0x00004C9B, 0x00050080, 0x0000000B, 0x00002DC7, 0x000045ED, 0x00000A0D,\n    0x00060041, 0x00000289, 0x00006006, 0x00000CC7, 0x00000A0B, 0x00002DC7,\n    0x0004003D, 0x0000000B, 0x00004002, 0x00006006, 0x00070050, 0x00000017,\n    0x00005136, 0x00003152, 0x00005E5D, 0x00003153, 0x00004002, 0x000200F9,\n    0x00004F27, 0x000200F8, 0x000019C4, 0x000500C2, 0x0000000B, 0x00005FAB,\n    0x000051FC, 0x00000A11, 0x00060041, 0x00000289, 0x00003444, 0x00000CC7,\n    0x00000A0B, 0x00005FAB, 0x0004003D, 0x0000000B, 0x00003154, 0x00003444,\n    0x00050080, 0x0000000B, 0x00002DC8, 0x00005FAB, 0x00000A0D, 0x00060041,\n    0x00000289, 0x00001910, 0x00000CC7, 0x00000A0B, 0x00002DC8, 0x0004003D,\n    0x0000000B, 0x00005C70, 0x00001910, 0x00050080, 0x0000000B, 0x00002DC9,\n    0x00005FAB, 0x00000A10, 0x00060041, 0x00000289, 0x00001911, 0x00000CC7,\n    0x00000A0B, 0x00002DC9, 0x0004003D, 0x0000000B, 0x00005C71, 0x00001911,\n    0x00050080, 0x0000000B, 0x00002DCA, 0x00005FAB, 0x00000A13, 0x00060041,\n    0x00000289, 0x00006007, 0x00000CC7, 0x00000A0B, 0x00002DCA, 0x0004003D,\n    0x0000000B, 0x00003702, 0x00006007, 0x00070050, 0x00000017, 0x00005472,\n    0x00003154, 0x00005C70, 0x00005C71, 0x00003702, 0x00050080, 0x0000000B,\n    0x00004B85, 0x000051FC, 0x00000A3A, 0x000500C2, 0x0000000B, 0x0000202F,\n    0x00004B85, 0x00000A11, 0x00060041, 0x00000289, 0x00004C9C, 0x00000CC7,\n    0x00000A0B, 0x0000202F, 0x0004003D, 0x0000000B, 0x00003155, 0x00004C9C,\n    0x00050080, 0x0000000B, 0x00002DCB, 0x0000202F, 0x00000A0D, 0x00060041,\n    0x00000289, 0x00001912, 0x00000CC7, 0x00000A0B, 0x00002DCB, 0x0004003D,\n    0x0000000B, 0x00005C72, 0x00001912, 0x00050080, 0x0000000B, 0x00002DCC,\n    0x0000202F, 0x00000A10, 0x00060041, 0x00000289, 0x00001913, 0x00000CC7,\n    0x00000A0B, 0x00002DCC, 0x0004003D, 0x0000000B, 0x00005C73, 0x00001913,\n    0x00050080, 0x0000000B, 0x00002DCD, 0x0000202F, 0x00000A13, 0x00060041,\n    0x00000289, 0x00006008, 0x00000CC7, 0x00000A0B, 0x00002DCD, 0x0004003D,\n    0x0000000B, 0x00004003, 0x00006008, 0x00070050, 0x00000017, 0x00005137,\n    0x00003155, 0x00005C72, 0x00005C73, 0x00004003, 0x000200F9, 0x00004F27,\n    0x000200F8, 0x00004F27, 0x000700F5, 0x00000017, 0x00002BCF, 0x00005137,\n    0x000019C4, 0x00005136, 0x00002304, 0x000700F5, 0x00000017, 0x00003722,\n    0x00005472, 0x000019C4, 0x00004CD9, 0x00002304, 0x000300F7, 0x00004F28,\n    0x00000000, 0x000700FB, 0x00002180, 0x00004F58, 0x00000005, 0x0000215A,\n    0x00000007, 0x00002038, 0x000200F8, 0x00002038, 0x00050051, 0x0000000B,\n    0x00005F5E, 0x00003722, 0x00000000, 0x0006000C, 0x00000013, 0x0000606C,\n    0x00000001, 0x0000003E, 0x00005F5E, 0x00050051, 0x0000000D, 0x0000277E,\n    0x0000606C, 0x00000000, 0x00050051, 0x0000000D, 0x00003EC0, 0x0000606C,\n    0x00000001, 0x00050051, 0x0000000B, 0x00004289, 0x00003722, 0x00000001,\n    0x0006000C, 0x00000013, 0x00003CFD, 0x00000001, 0x0000003E, 0x00004289,\n    0x00050051, 0x0000000D, 0x0000277F, 0x00003CFD, 0x00000000, 0x00050051,\n    0x0000000D, 0x00004455, 0x00003CFD, 0x00000001, 0x00070050, 0x0000001D,\n    0x0000391B, 0x0000277E, 0x00003EC0, 0x0000277F, 0x00004455, 0x00050051,\n    0x0000000B, 0x00004389, 0x00003722, 0x00000002, 0x0006000C, 0x00000013,\n    0x0000467A, 0x00000001, 0x0000003E, 0x00004389, 0x00050051, 0x0000000D,\n    0x00002780, 0x0000467A, 0x00000000, 0x00050051, 0x0000000D, 0x00003EC1,\n    0x0000467A, 0x00000001, 0x00050051, 0x0000000B, 0x0000428A, 0x00003722,\n    0x00000003, 0x0006000C, 0x00000013, 0x00003CFE, 0x00000001, 0x0000003E,\n    0x0000428A, 0x00050051, 0x0000000D, 0x00002781, 0x00003CFE, 0x00000000,\n    0x00050051, 0x0000000D, 0x00004456, 0x00003CFE, 0x00000001, 0x00070050,\n    0x0000001D, 0x0000391C, 0x00002780, 0x00003EC1, 0x00002781, 0x00004456,\n    0x00050051, 0x0000000B, 0x0000438A, 0x00002BCF, 0x00000000, 0x0006000C,\n    0x00000013, 0x0000467B, 0x00000001, 0x0000003E, 0x0000438A, 0x00050051,\n    0x0000000D, 0x00002782, 0x0000467B, 0x00000000, 0x00050051, 0x0000000D,\n    0x00003EC2, 0x0000467B, 0x00000001, 0x00050051, 0x0000000B, 0x0000428B,\n    0x00002BCF, 0x00000001, 0x0006000C, 0x00000013, 0x00003CFF, 0x00000001,\n    0x0000003E, 0x0000428B, 0x00050051, 0x0000000D, 0x00002783, 0x00003CFF,\n    0x00000000, 0x00050051, 0x0000000D, 0x00004457, 0x00003CFF, 0x00000001,\n    0x00070050, 0x0000001D, 0x0000391D, 0x00002782, 0x00003EC2, 0x00002783,\n    0x00004457, 0x00050051, 0x0000000B, 0x0000438B, 0x00002BCF, 0x00000002,\n    0x0006000C, 0x00000013, 0x0000467C, 0x00000001, 0x0000003E, 0x0000438B,\n    0x00050051, 0x0000000D, 0x00002784, 0x0000467C, 0x00000000, 0x00050051,\n    0x0000000D, 0x00003EC3, 0x0000467C, 0x00000001, 0x00050051, 0x0000000B,\n    0x0000428C, 0x00002BCF, 0x00000003, 0x0006000C, 0x00000013, 0x00003D00,\n    0x00000001, 0x0000003E, 0x0000428C, 0x00050051, 0x0000000D, 0x00002785,\n    0x00003D00, 0x00000000, 0x00050051, 0x0000000D, 0x000050C3, 0x00003D00,\n    0x00000001, 0x00070050, 0x0000001D, 0x00002356, 0x00002784, 0x00003EC3,\n    0x00002785, 0x000050C3, 0x000200F9, 0x00004F28, 0x000200F8, 0x0000215A,\n    0x0007004F, 0x00000011, 0x000025FD, 0x00003722, 0x00003722, 0x00000000,\n    0x00000001, 0x0004007C, 0x00000012, 0x00005B3E, 0x000025FD, 0x0009004F,\n    0x0000001A, 0x000060D6, 0x00005B3E, 0x00005B3E, 0x00000000, 0x00000000,\n    0x00000001, 0x00000001, 0x000500C4, 0x0000001A, 0x000048B0, 0x000060D6,\n    0x00000122, 0x000500C3, 0x0000001A, 0x00003D95, 0x000048B0, 0x00000302,\n    0x0004006F, 0x0000001D, 0x00002AB7, 0x00003D95, 0x0005008E, 0x0000001D,\n    0x0000472C, 0x00002AB7, 0x000007FE, 0x0007000C, 0x0000001D, 0x00006297,\n    0x00000001, 0x00000028, 0x00000504, 0x0000472C, 0x0007004F, 0x00000011,\n    0x00003771, 0x00003722, 0x00003722, 0x00000002, 0x00000003, 0x0004007C,\n    0x00000012, 0x000024C5, 0x00003771, 0x0009004F, 0x0000001A, 0x000060D7,\n    0x000024C5, 0x000024C5, 0x00000000, 0x00000000, 0x00000001, 0x00000001,\n    0x000500C4, 0x0000001A, 0x000048B1, 0x000060D7, 0x00000122, 0x000500C3,\n    0x0000001A, 0x00003D96, 0x000048B1, 0x00000302, 0x0004006F, 0x0000001D,\n    0x00002AB8, 0x00003D96, 0x0005008E, 0x0000001D, 0x0000472D, 0x00002AB8,\n    0x000007FE, 0x0007000C, 0x0000001D, 0x00006298, 0x00000001, 0x00000028,\n    0x00000504, 0x0000472D, 0x0007004F, 0x00000011, 0x00003772, 0x00002BCF,\n    0x00002BCF, 0x00000000, 0x00000001, 0x0004007C, 0x00000012, 0x000024C6,\n    0x00003772, 0x0009004F, 0x0000001A, 0x000060D8, 0x000024C6, 0x000024C6,\n    0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x000500C4, 0x0000001A,\n    0x000048B2, 0x000060D8, 0x00000122, 0x000500C3, 0x0000001A, 0x00003D97,\n    0x000048B2, 0x00000302, 0x0004006F, 0x0000001D, 0x00002AB9, 0x00003D97,\n    0x0005008E, 0x0000001D, 0x0000472E, 0x00002AB9, 0x000007FE, 0x0007000C,\n    0x0000001D, 0x00006299, 0x00000001, 0x00000028, 0x00000504, 0x0000472E,\n    0x0007004F, 0x00000011, 0x00003773, 0x00002BCF, 0x00002BCF, 0x00000002,\n    0x00000003, 0x0004007C, 0x00000012, 0x000024C7, 0x00003773, 0x0009004F,\n    0x0000001A, 0x000060D9, 0x000024C7, 0x000024C7, 0x00000000, 0x00000000,\n    0x00000001, 0x00000001, 0x000500C4, 0x0000001A, 0x000048B3, 0x000060D9,\n    0x00000122, 0x000500C3, 0x0000001A, 0x00003D98, 0x000048B3, 0x00000302,\n    0x0004006F, 0x0000001D, 0x00002ABA, 0x00003D98, 0x0005008E, 0x0000001D,\n    0x000053C1, 0x00002ABA, 0x000007FE, 0x0007000C, 0x0000001D, 0x00004364,\n    0x00000001, 0x00000028, 0x00000504, 0x000053C1, 0x000200F9, 0x00004F28,\n    0x000200F8, 0x00004F58, 0x0007004F, 0x00000011, 0x00002623, 0x00003722,\n    0x00003722, 0x00000000, 0x00000001, 0x0004007C, 0x00000013, 0x0000515B,\n    0x00002623, 0x00050051, 0x0000000D, 0x00001B84, 0x0000515B, 0x00000000,\n    0x00050051, 0x0000000D, 0x00003470, 0x0000515B, 0x00000001, 0x00070050,\n    0x0000001D, 0x0000427E, 0x00001B84, 0x00003470, 0x00000A0C, 0x00000A0C,\n    0x0007004F, 0x00000011, 0x000041DE, 0x00003722, 0x00003722, 0x00000002,\n    0x00000003, 0x0004007C, 0x00000013, 0x00003763, 0x000041DE, 0x00050051,\n    0x0000000D, 0x00001B85, 0x00003763, 0x00000000, 0x00050051, 0x0000000D,\n    0x00003471, 0x00003763, 0x00000001, 0x00070050, 0x0000001D, 0x0000427F,\n    0x00001B85, 0x00003471, 0x00000A0C, 0x00000A0C, 0x0007004F, 0x00000011,\n    0x000041DF, 0x00002BCF, 0x00002BCF, 0x00000000, 0x00000001, 0x0004007C,\n    0x00000013, 0x00003764, 0x000041DF, 0x00050051, 0x0000000D, 0x00001B86,\n    0x00003764, 0x00000000, 0x00050051, 0x0000000D, 0x00003472, 0x00003764,\n    0x00000001, 0x00070050, 0x0000001D, 0x00004280, 0x00001B86, 0x00003472,\n    0x00000A0C, 0x00000A0C, 0x0007004F, 0x00000011, 0x000041E0, 0x00002BCF,\n    0x00002BCF, 0x00000002, 0x00000003, 0x0004007C, 0x00000013, 0x00003765,\n    0x000041E0, 0x00050051, 0x0000000D, 0x00001B87, 0x00003765, 0x00000000,\n    0x00050051, 0x0000000D, 0x0000410A, 0x00003765, 0x00000001, 0x00070050,\n    0x0000001D, 0x00002357, 0x00001B87, 0x0000410A, 0x00000A0C, 0x00000A0C,\n    0x000200F9, 0x00004F28, 0x000200F8, 0x00004F28, 0x000900F5, 0x0000001D,\n    0x00002BAE, 0x00002357, 0x00004F58, 0x00004364, 0x0000215A, 0x00002356,\n    0x00002038, 0x000900F5, 0x0000001D, 0x0000380F, 0x00004280, 0x00004F58,\n    0x00006299, 0x0000215A, 0x0000391D, 0x00002038, 0x000900F5, 0x0000001D,\n    0x00003B82, 0x0000427F, 0x00004F58, 0x00006298, 0x0000215A, 0x0000391C,\n    0x00002038, 0x000900F5, 0x0000001D, 0x000038BB, 0x0000427E, 0x00004F58,\n    0x00006297, 0x0000215A, 0x0000391B, 0x00002038, 0x000200F9, 0x00005311,\n    0x000200F8, 0x00005311, 0x000700F5, 0x0000001D, 0x00002BAF, 0x00002BAE,\n    0x00004F28, 0x00002BAD, 0x00003F62, 0x000700F5, 0x0000001D, 0x00003810,\n    0x0000380F, 0x00004F28, 0x0000380E, 0x00003F62, 0x000700F5, 0x0000001D,\n    0x00003296, 0x00003B82, 0x00004F28, 0x00003B81, 0x00003F62, 0x000700F5,\n    0x0000001D, 0x0000367B, 0x000038BB, 0x00004F28, 0x000038BA, 0x00003F62,\n    0x00050081, 0x0000001D, 0x0000435A, 0x00004359, 0x0000367B, 0x00050081,\n    0x0000001D, 0x00005B02, 0x00005B01, 0x00003296, 0x00050081, 0x0000001D,\n    0x00001C28, 0x00001F92, 0x00003810, 0x00050081, 0x0000001D, 0x000025AA,\n    0x00005113, 0x00002BAF, 0x00050080, 0x0000000B, 0x00003FF8, 0x00001FB2,\n    0x000037B2, 0x000300F7, 0x00005312, 0x00000002, 0x000400FA, 0x00005AEF,\n    0x00003B68, 0x000040BC, 0x000200F8, 0x000040BC, 0x000500AA, 0x00000009,\n    0x00004ADE, 0x0000199B, 0x00000A16, 0x000300F7, 0x00004F4C, 0x00000002,\n    0x000400FA, 0x00004ADE, 0x000019C5, 0x00002305, 0x000200F8, 0x00002305,\n    0x000500C2, 0x0000000B, 0x00005636, 0x00003FF8, 0x00000A11, 0x00060041,\n    0x00000289, 0x00003445, 0x00000CC7, 0x00000A0B, 0x00005636, 0x0004003D,\n    0x0000000B, 0x00003AD7, 0x00003445, 0x00050080, 0x0000000B, 0x0000214B,\n    0x00003FF8, 0x0000199B, 0x000500C2, 0x0000000B, 0x000054AC, 0x0000214B,\n    0x00000A11, 0x00060041, 0x00000289, 0x00004CE3, 0x00000CC7, 0x00000A0B,\n    0x000054AC, 0x0004003D, 0x0000000B, 0x00003340, 0x00004CE3, 0x00050084,\n    0x0000000B, 0x000021F6, 0x00000A10, 0x0000199B, 0x00050080, 0x0000000B,\n    0x00005EC7, 0x00003FF8, 0x000021F6, 0x000500C2, 0x0000000B, 0x000045EE,\n    0x00005EC7, 0x00000A11, 0x00060041, 0x00000289, 0x00004CE4, 0x00000CC7,\n    0x00000A0B, 0x000045EE, 0x0004003D, 0x0000000B, 0x00003341, 0x00004CE4,\n    0x00050084, 0x0000000B, 0x000021F7, 0x00000A13, 0x0000199B, 0x00050080,\n    0x0000000B, 0x00005EC8, 0x00003FF8, 0x000021F7, 0x000500C2, 0x0000000B,\n    0x000045EF, 0x00005EC8, 0x00000A11, 0x00060041, 0x00000289, 0x00004904,\n    0x00000CC7, 0x00000A0B, 0x000045EF, 0x0004003D, 0x0000000B, 0x00005F5F,\n    0x00004904, 0x00070050, 0x00000017, 0x00005138, 0x00003AD7, 0x00003340,\n    0x00003341, 0x00005F5F, 0x000200F9, 0x00004F4C, 0x000200F8, 0x000019C5,\n    0x000500C2, 0x0000000B, 0x00005FAC, 0x00003FF8, 0x00000A11, 0x00060041,\n    0x00000289, 0x00003446, 0x00000CC7, 0x00000A0B, 0x00005FAC, 0x0004003D,\n    0x0000000B, 0x00003156, 0x00003446, 0x00050080, 0x0000000B, 0x00002DCE,\n    0x00005FAC, 0x00000A0D, 0x00060041, 0x00000289, 0x00001914, 0x00000CC7,\n    0x00000A0B, 0x00002DCE, 0x0004003D, 0x0000000B, 0x00005C74, 0x00001914,\n    0x00050080, 0x0000000B, 0x00002DCF, 0x00005FAC, 0x00000A10, 0x00060041,\n    0x00000289, 0x00001915, 0x00000CC7, 0x00000A0B, 0x00002DCF, 0x0004003D,\n    0x0000000B, 0x00005C75, 0x00001915, 0x00050080, 0x0000000B, 0x00002DD0,\n    0x00005FAC, 0x00000A13, 0x00060041, 0x00000289, 0x00006009, 0x00000CC7,\n    0x00000A0B, 0x00002DD0, 0x0004003D, 0x0000000B, 0x00004004, 0x00006009,\n    0x00070050, 0x00000017, 0x00005139, 0x00003156, 0x00005C74, 0x00005C75,\n    0x00004004, 0x000200F9, 0x00004F4C, 0x000200F8, 0x00004F4C, 0x000700F5,\n    0x00000017, 0x00002AC2, 0x00005139, 0x000019C5, 0x00005138, 0x00002305,\n    0x000300F7, 0x00003F63, 0x00000000, 0x001300FB, 0x00002180, 0x00004BFE,\n    0x00000000, 0x000038FC, 0x00000001, 0x000038FC, 0x00000002, 0x00001CC1,\n    0x0000000A, 0x00001CC1, 0x00000003, 0x00001CC0, 0x0000000C, 0x00001CC0,\n    0x00000004, 0x00002001, 0x00000006, 0x00002039, 0x000200F8, 0x00002039,\n    0x00050051, 0x0000000B, 0x00005F60, 0x00002AC2, 0x00000000, 0x0006000C,\n    0x00000013, 0x0000606D, 0x00000001, 0x0000003E, 0x00005F60, 0x00050051,\n    0x0000000D, 0x00002786, 0x0000606D, 0x00000000, 0x00050051, 0x0000000D,\n    0x00004458, 0x0000606D, 0x00000001, 0x00070050, 0x0000001D, 0x0000391E,\n    0x00002786, 0x00004458, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B,\n    0x0000438C, 0x00002AC2, 0x00000001, 0x0006000C, 0x00000013, 0x0000467D,\n    0x00000001, 0x0000003E, 0x0000438C, 0x00050051, 0x0000000D, 0x00002787,\n    0x0000467D, 0x00000000, 0x00050051, 0x0000000D, 0x00004459, 0x0000467D,\n    0x00000001, 0x00070050, 0x0000001D, 0x0000391F, 0x00002787, 0x00004459,\n    0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x0000438D, 0x00002AC2,\n    0x00000002, 0x0006000C, 0x00000013, 0x0000467E, 0x00000001, 0x0000003E,\n    0x0000438D, 0x00050051, 0x0000000D, 0x00002788, 0x0000467E, 0x00000000,\n    0x00050051, 0x0000000D, 0x0000445A, 0x0000467E, 0x00000001, 0x00070050,\n    0x0000001D, 0x00003920, 0x00002788, 0x0000445A, 0x00000A0C, 0x00000A0C,\n    0x00050051, 0x0000000B, 0x0000438E, 0x00002AC2, 0x00000003, 0x0006000C,\n    0x00000013, 0x0000467F, 0x00000001, 0x0000003E, 0x0000438E, 0x00050051,\n    0x0000000D, 0x00002789, 0x0000467F, 0x00000000, 0x00050051, 0x0000000D,\n    0x000050C4, 0x0000467F, 0x00000001, 0x00070050, 0x0000001D, 0x00002358,\n    0x00002789, 0x000050C4, 0x00000A0C, 0x00000A0C, 0x000200F9, 0x00003F63,\n    0x000200F8, 0x00002001, 0x00050051, 0x0000000B, 0x00003091, 0x00002AC2,\n    0x00000000, 0x0004007C, 0x0000000C, 0x000058A0, 0x00003091, 0x00050050,\n    0x00000012, 0x0000472F, 0x000058A0, 0x000058A0, 0x000500C4, 0x00000012,\n    0x000047B9, 0x0000472F, 0x000007A7, 0x000500C3, 0x00000012, 0x00003423,\n    0x000047B9, 0x00000867, 0x0004006F, 0x00000013, 0x00002ABB, 0x00003423,\n    0x0005008E, 0x00000013, 0x00004753, 0x00002ABB, 0x000007FE, 0x0007000C,\n    0x00000013, 0x00005E12, 0x00000001, 0x00000028, 0x00000049, 0x00004753,\n    0x00050051, 0x0000000D, 0x00005F16, 0x00005E12, 0x00000000, 0x00050051,\n    0x0000000D, 0x00003CDD, 0x00005E12, 0x00000001, 0x00070050, 0x0000001D,\n    0x00004127, 0x00005F16, 0x00003CDD, 0x00000A0C, 0x00000A0C, 0x00050051,\n    0x0000000B, 0x00004C4B, 0x00002AC2, 0x00000001, 0x0004007C, 0x0000000C,\n    0x00003EAA, 0x00004C4B, 0x00050050, 0x00000012, 0x00004730, 0x00003EAA,\n    0x00003EAA, 0x000500C4, 0x00000012, 0x000047BA, 0x00004730, 0x000007A7,\n    0x000500C3, 0x00000012, 0x00003424, 0x000047BA, 0x00000867, 0x0004006F,\n    0x00000013, 0x00002ABC, 0x00003424, 0x0005008E, 0x00000013, 0x00004754,\n    0x00002ABC, 0x000007FE, 0x0007000C, 0x00000013, 0x00005E13, 0x00000001,\n    0x00000028, 0x00000049, 0x00004754, 0x00050051, 0x0000000D, 0x00005F17,\n    0x00005E13, 0x00000000, 0x00050051, 0x0000000D, 0x00003CDE, 0x00005E13,\n    0x00000001, 0x00070050, 0x0000001D, 0x00004128, 0x00005F17, 0x00003CDE,\n    0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x00004C4C, 0x00002AC2,\n    0x00000002, 0x0004007C, 0x0000000C, 0x00003EAB, 0x00004C4C, 0x00050050,\n    0x00000012, 0x00004731, 0x00003EAB, 0x00003EAB, 0x000500C4, 0x00000012,\n    0x000047BC, 0x00004731, 0x000007A7, 0x000500C3, 0x00000012, 0x00003425,\n    0x000047BC, 0x00000867, 0x0004006F, 0x00000013, 0x00002ABD, 0x00003425,\n    0x0005008E, 0x00000013, 0x00004755, 0x00002ABD, 0x000007FE, 0x0007000C,\n    0x00000013, 0x00005E14, 0x00000001, 0x00000028, 0x00000049, 0x00004755,\n    0x00050051, 0x0000000D, 0x00005F18, 0x00005E14, 0x00000000, 0x00050051,\n    0x0000000D, 0x00003CDF, 0x00005E14, 0x00000001, 0x00070050, 0x0000001D,\n    0x00004129, 0x00005F18, 0x00003CDF, 0x00000A0C, 0x00000A0C, 0x00050051,\n    0x0000000B, 0x00004C4D, 0x00002AC2, 0x00000003, 0x0004007C, 0x0000000C,\n    0x00003EAC, 0x00004C4D, 0x00050050, 0x00000012, 0x00004732, 0x00003EAC,\n    0x00003EAC, 0x000500C4, 0x00000012, 0x000047BD, 0x00004732, 0x000007A7,\n    0x000500C3, 0x00000012, 0x00003426, 0x000047BD, 0x00000867, 0x0004006F,\n    0x00000013, 0x00002ABE, 0x00003426, 0x0005008E, 0x00000013, 0x00004756,\n    0x00002ABE, 0x000007FE, 0x0007000C, 0x00000013, 0x00005E15, 0x00000001,\n    0x00000028, 0x00000049, 0x00004756, 0x00050051, 0x0000000D, 0x00005F19,\n    0x00005E15, 0x00000000, 0x00050051, 0x0000000D, 0x0000494F, 0x00005E15,\n    0x00000001, 0x00070050, 0x0000001D, 0x00002359, 0x00005F19, 0x0000494F,\n    0x00000A0C, 0x00000A0C, 0x000200F9, 0x00003F63, 0x000200F8, 0x00001CC0,\n    0x00050051, 0x0000000B, 0x000056C6, 0x00002AC2, 0x00000000, 0x00060050,\n    0x00000014, 0x00004F13, 0x000056C6, 0x000056C6, 0x000056C6, 0x000500C2,\n    0x00000014, 0x00002B1C, 0x00004F13, 0x00000BB4, 0x000500C7, 0x00000014,\n    0x00005DF2, 0x00002B1C, 0x00000105, 0x000500C7, 0x00000014, 0x000048B4,\n    0x00002B1C, 0x00000466, 0x000500C2, 0x00000014, 0x00005B9C, 0x00005DF2,\n    0x00000B0C, 0x000500AA, 0x00000010, 0x000040D5, 0x00005B9C, 0x00000A12,\n    0x0006000C, 0x00000016, 0x00002C57, 0x00000001, 0x0000004B, 0x000048B4,\n    0x0004007C, 0x00000014, 0x00002A21, 0x00002C57, 0x00050082, 0x00000014,\n    0x00001886, 0x00000B0C, 0x00002A21, 0x00050080, 0x00000014, 0x0000221C,\n    0x00002A21, 0x00000938, 0x000600A9, 0x00000014, 0x0000287B, 0x000040D5,\n    0x0000221C, 0x00005B9C, 0x000500C4, 0x00000014, 0x00005AE0, 0x000048B4,\n    0x00001886, 0x000500C7, 0x00000014, 0x000049A6, 0x00005AE0, 0x00000466,\n    0x000600A9, 0x00000014, 0x00002AC3, 0x000040D5, 0x000049A6, 0x000048B4,\n    0x00050080, 0x00000014, 0x0000600A, 0x0000287B, 0x000003FA, 0x000500C4,\n    0x00000014, 0x00004F8B, 0x0000600A, 0x00000189, 0x000500C4, 0x00000014,\n    0x00003FB2, 0x00002AC3, 0x0000008D, 0x000500C5, 0x00000014, 0x00005788,\n    0x00004F8B, 0x00003FB2, 0x000500AA, 0x00000010, 0x0000360C, 0x00005DF2,\n    0x00000A12, 0x000600A9, 0x00000014, 0x0000424E, 0x0000360C, 0x00000A12,\n    0x00005788, 0x0004007C, 0x00000018, 0x000029DB, 0x0000424E, 0x000500C2,\n    0x0000000B, 0x00004BB0, 0x000056C6, 0x00000A64, 0x00040070, 0x0000000D,\n    0x0000481A, 0x00004BB0, 0x00050085, 0x0000000D, 0x00003E2B, 0x0000481A,\n    0x00000149, 0x00050051, 0x0000000D, 0x000053CE, 0x000029DB, 0x00000000,\n    0x00050051, 0x0000000D, 0x00002A61, 0x000029DB, 0x00000001, 0x00050051,\n    0x0000000D, 0x00001EA2, 0x000029DB, 0x00000002, 0x00070050, 0x0000001D,\n    0x00003DE3, 0x000053CE, 0x00002A61, 0x00001EA2, 0x00003E2B, 0x00050051,\n    0x0000000B, 0x000027FE, 0x00002AC2, 0x00000001, 0x00060050, 0x00000014,\n    0x00003517, 0x000027FE, 0x000027FE, 0x000027FE, 0x000500C2, 0x00000014,\n    0x00002B1D, 0x00003517, 0x00000BB4, 0x000500C7, 0x00000014, 0x00005DF3,\n    0x00002B1D, 0x00000105, 0x000500C7, 0x00000014, 0x000048B5, 0x00002B1D,\n    0x00000466, 0x000500C2, 0x00000014, 0x00005B9D, 0x00005DF3, 0x00000B0C,\n    0x000500AA, 0x00000010, 0x000040D6, 0x00005B9D, 0x00000A12, 0x0006000C,\n    0x00000016, 0x00002C58, 0x00000001, 0x0000004B, 0x000048B5, 0x0004007C,\n    0x00000014, 0x00002A22, 0x00002C58, 0x00050082, 0x00000014, 0x00001887,\n    0x00000B0C, 0x00002A22, 0x00050080, 0x00000014, 0x0000221D, 0x00002A22,\n    0x00000938, 0x000600A9, 0x00000014, 0x0000287C, 0x000040D6, 0x0000221D,\n    0x00005B9D, 0x000500C4, 0x00000014, 0x00005AE1, 0x000048B5, 0x00001887,\n    0x000500C7, 0x00000014, 0x000049A7, 0x00005AE1, 0x00000466, 0x000600A9,\n    0x00000014, 0x00002AC4, 0x000040D6, 0x000049A7, 0x000048B5, 0x00050080,\n    0x00000014, 0x0000600B, 0x0000287C, 0x000003FA, 0x000500C4, 0x00000014,\n    0x00004F8C, 0x0000600B, 0x00000189, 0x000500C4, 0x00000014, 0x00003FB3,\n    0x00002AC4, 0x0000008D, 0x000500C5, 0x00000014, 0x00005789, 0x00004F8C,\n    0x00003FB3, 0x000500AA, 0x00000010, 0x0000360D, 0x00005DF3, 0x00000A12,\n    0x000600A9, 0x00000014, 0x0000424F, 0x0000360D, 0x00000A12, 0x00005789,\n    0x0004007C, 0x00000018, 0x000029DC, 0x0000424F, 0x000500C2, 0x0000000B,\n    0x00004BB1, 0x000027FE, 0x00000A64, 0x00040070, 0x0000000D, 0x0000481B,\n    0x00004BB1, 0x00050085, 0x0000000D, 0x00003E2C, 0x0000481B, 0x00000149,\n    0x00050051, 0x0000000D, 0x000053CF, 0x000029DC, 0x00000000, 0x00050051,\n    0x0000000D, 0x00002A62, 0x000029DC, 0x00000001, 0x00050051, 0x0000000D,\n    0x00001EA3, 0x000029DC, 0x00000002, 0x00070050, 0x0000001D, 0x00003DE4,\n    0x000053CF, 0x00002A62, 0x00001EA3, 0x00003E2C, 0x00050051, 0x0000000B,\n    0x000027FF, 0x00002AC2, 0x00000002, 0x00060050, 0x00000014, 0x00003518,\n    0x000027FF, 0x000027FF, 0x000027FF, 0x000500C2, 0x00000014, 0x00002B1E,\n    0x00003518, 0x00000BB4, 0x000500C7, 0x00000014, 0x00005DF4, 0x00002B1E,\n    0x00000105, 0x000500C7, 0x00000014, 0x000048B6, 0x00002B1E, 0x00000466,\n    0x000500C2, 0x00000014, 0x00005B9E, 0x00005DF4, 0x00000B0C, 0x000500AA,\n    0x00000010, 0x000040D7, 0x00005B9E, 0x00000A12, 0x0006000C, 0x00000016,\n    0x00002C59, 0x00000001, 0x0000004B, 0x000048B6, 0x0004007C, 0x00000014,\n    0x00002A23, 0x00002C59, 0x00050082, 0x00000014, 0x00001888, 0x00000B0C,\n    0x00002A23, 0x00050080, 0x00000014, 0x0000221E, 0x00002A23, 0x00000938,\n    0x000600A9, 0x00000014, 0x0000287D, 0x000040D7, 0x0000221E, 0x00005B9E,\n    0x000500C4, 0x00000014, 0x00005AE2, 0x000048B6, 0x00001888, 0x000500C7,\n    0x00000014, 0x000049A8, 0x00005AE2, 0x00000466, 0x000600A9, 0x00000014,\n    0x00002AC5, 0x000040D7, 0x000049A8, 0x000048B6, 0x00050080, 0x00000014,\n    0x0000600C, 0x0000287D, 0x000003FA, 0x000500C4, 0x00000014, 0x00004F8D,\n    0x0000600C, 0x00000189, 0x000500C4, 0x00000014, 0x00003FB4, 0x00002AC5,\n    0x0000008D, 0x000500C5, 0x00000014, 0x0000578A, 0x00004F8D, 0x00003FB4,\n    0x000500AA, 0x00000010, 0x0000360E, 0x00005DF4, 0x00000A12, 0x000600A9,\n    0x00000014, 0x00004250, 0x0000360E, 0x00000A12, 0x0000578A, 0x0004007C,\n    0x00000018, 0x000029DD, 0x00004250, 0x000500C2, 0x0000000B, 0x00004BB2,\n    0x000027FF, 0x00000A64, 0x00040070, 0x0000000D, 0x0000481C, 0x00004BB2,\n    0x00050085, 0x0000000D, 0x00003E2D, 0x0000481C, 0x00000149, 0x00050051,\n    0x0000000D, 0x000053D0, 0x000029DD, 0x00000000, 0x00050051, 0x0000000D,\n    0x00002A63, 0x000029DD, 0x00000001, 0x00050051, 0x0000000D, 0x00001EA4,\n    0x000029DD, 0x00000002, 0x00070050, 0x0000001D, 0x00003DE5, 0x000053D0,\n    0x00002A63, 0x00001EA4, 0x00003E2D, 0x00050051, 0x0000000B, 0x00002800,\n    0x00002AC2, 0x00000003, 0x00060050, 0x00000014, 0x00003519, 0x00002800,\n    0x00002800, 0x00002800, 0x000500C2, 0x00000014, 0x00002B1F, 0x00003519,\n    0x00000BB4, 0x000500C7, 0x00000014, 0x00005DF5, 0x00002B1F, 0x00000105,\n    0x000500C7, 0x00000014, 0x000048B8, 0x00002B1F, 0x00000466, 0x000500C2,\n    0x00000014, 0x00005B9F, 0x00005DF5, 0x00000B0C, 0x000500AA, 0x00000010,\n    0x000040D8, 0x00005B9F, 0x00000A12, 0x0006000C, 0x00000016, 0x00002C5A,\n    0x00000001, 0x0000004B, 0x000048B8, 0x0004007C, 0x00000014, 0x00002A24,\n    0x00002C5A, 0x00050082, 0x00000014, 0x00001889, 0x00000B0C, 0x00002A24,\n    0x00050080, 0x00000014, 0x0000221F, 0x00002A24, 0x00000938, 0x000600A9,\n    0x00000014, 0x0000287E, 0x000040D8, 0x0000221F, 0x00005B9F, 0x000500C4,\n    0x00000014, 0x00005AE3, 0x000048B8, 0x00001889, 0x000500C7, 0x00000014,\n    0x000049A9, 0x00005AE3, 0x00000466, 0x000600A9, 0x00000014, 0x00002AC6,\n    0x000040D8, 0x000049A9, 0x000048B8, 0x00050080, 0x00000014, 0x0000600D,\n    0x0000287E, 0x000003FA, 0x000500C4, 0x00000014, 0x00004F8E, 0x0000600D,\n    0x00000189, 0x000500C4, 0x00000014, 0x00003FB5, 0x00002AC6, 0x0000008D,\n    0x000500C5, 0x00000014, 0x0000578B, 0x00004F8E, 0x00003FB5, 0x000500AA,\n    0x00000010, 0x0000360F, 0x00005DF5, 0x00000A12, 0x000600A9, 0x00000014,\n    0x00004251, 0x0000360F, 0x00000A12, 0x0000578B, 0x0004007C, 0x00000018,\n    0x000029DE, 0x00004251, 0x000500C2, 0x0000000B, 0x00004BB3, 0x00002800,\n    0x00000A64, 0x00040070, 0x0000000D, 0x0000481D, 0x00004BB3, 0x00050085,\n    0x0000000D, 0x00003E2E, 0x0000481D, 0x00000149, 0x00050051, 0x0000000D,\n    0x000053D1, 0x000029DE, 0x00000000, 0x00050051, 0x0000000D, 0x00002A64,\n    0x000029DE, 0x00000001, 0x00050051, 0x0000000D, 0x00002B20, 0x000029DE,\n    0x00000002, 0x00070050, 0x0000001D, 0x0000235A, 0x000053D1, 0x00002A64,\n    0x00002B20, 0x00003E2E, 0x000200F9, 0x00003F63, 0x000200F8, 0x00001CC1,\n    0x00050051, 0x0000000B, 0x000056C7, 0x00002AC2, 0x00000000, 0x00070050,\n    0x00000017, 0x00004F14, 0x000056C7, 0x000056C7, 0x000056C7, 0x000056C7,\n    0x000500C2, 0x00000017, 0x000024B0, 0x00004F14, 0x0000034D, 0x000500C7,\n    0x00000017, 0x000049B7, 0x000024B0, 0x0000027B, 0x00040070, 0x0000001D,\n    0x00003CC0, 0x000049B7, 0x00050085, 0x0000001D, 0x00004139, 0x00003CC0,\n    0x00000AEE, 0x00050051, 0x0000000B, 0x00005CDB, 0x00002AC2, 0x00000001,\n    0x00070050, 0x00000017, 0x00005156, 0x00005CDB, 0x00005CDB, 0x00005CDB,\n    0x00005CDB, 0x000500C2, 0x00000017, 0x000024B1, 0x00005156, 0x0000034D,\n    0x000500C7, 0x00000017, 0x000049B8, 0x000024B1, 0x0000027B, 0x00040070,\n    0x0000001D, 0x00003CC1, 0x000049B8, 0x00050085, 0x0000001D, 0x0000413A,\n    0x00003CC1, 0x00000AEE, 0x00050051, 0x0000000B, 0x00005CDC, 0x00002AC2,\n    0x00000002, 0x00070050, 0x00000017, 0x00005157, 0x00005CDC, 0x00005CDC,\n    0x00005CDC, 0x00005CDC, 0x000500C2, 0x00000017, 0x000024B2, 0x00005157,\n    0x0000034D, 0x000500C7, 0x00000017, 0x000049B9, 0x000024B2, 0x0000027B,\n    0x00040070, 0x0000001D, 0x00003CC2, 0x000049B9, 0x00050085, 0x0000001D,\n    0x0000413B, 0x00003CC2, 0x00000AEE, 0x00050051, 0x0000000B, 0x00005CDD,\n    0x00002AC2, 0x00000003, 0x00070050, 0x00000017, 0x0000515C, 0x00005CDD,\n    0x00005CDD, 0x00005CDD, 0x00005CDD, 0x000500C2, 0x00000017, 0x000024B3,\n    0x0000515C, 0x0000034D, 0x000500C7, 0x00000017, 0x000049BA, 0x000024B3,\n    0x0000027B, 0x00040070, 0x0000001D, 0x00004932, 0x000049BA, 0x00050085,\n    0x0000001D, 0x000026A2, 0x00004932, 0x00000AEE, 0x000200F9, 0x00003F63,\n    0x000200F8, 0x000038FC, 0x00050051, 0x0000000B, 0x000056C8, 0x00002AC2,\n    0x00000000, 0x00070050, 0x00000017, 0x00004F15, 0x000056C8, 0x000056C8,\n    0x000056C8, 0x000056C8, 0x000500C2, 0x00000017, 0x000024B4, 0x00004F15,\n    0x0000028D, 0x000500C7, 0x00000017, 0x00004A62, 0x000024B4, 0x0000064B,\n    0x00040070, 0x0000001D, 0x000036AB, 0x00004A62, 0x0005008E, 0x0000001D,\n    0x00004B2C, 0x000036AB, 0x0000017A, 0x00050051, 0x0000000B, 0x000021A8,\n    0x00002AC2, 0x00000001, 0x00070050, 0x00000017, 0x00006114, 0x000021A8,\n    0x000021A8, 0x000021A8, 0x000021A8, 0x000500C2, 0x00000017, 0x000024B5,\n    0x00006114, 0x0000028D, 0x000500C7, 0x00000017, 0x00004A63, 0x000024B5,\n    0x0000064B, 0x00040070, 0x0000001D, 0x000036AC, 0x00004A63, 0x0005008E,\n    0x0000001D, 0x00004B2D, 0x000036AC, 0x0000017A, 0x00050051, 0x0000000B,\n    0x000021A9, 0x00002AC2, 0x00000002, 0x00070050, 0x00000017, 0x00006115,\n    0x000021A9, 0x000021A9, 0x000021A9, 0x000021A9, 0x000500C2, 0x00000017,\n    0x000024B6, 0x00006115, 0x0000028D, 0x000500C7, 0x00000017, 0x00004A64,\n    0x000024B6, 0x0000064B, 0x00040070, 0x0000001D, 0x000036AD, 0x00004A64,\n    0x0005008E, 0x0000001D, 0x00004B2E, 0x000036AD, 0x0000017A, 0x00050051,\n    0x0000000B, 0x000021AA, 0x00002AC2, 0x00000003, 0x00070050, 0x00000017,\n    0x00006116, 0x000021AA, 0x000021AA, 0x000021AA, 0x000021AA, 0x000500C2,\n    0x00000017, 0x000024B7, 0x00006116, 0x0000028D, 0x000500C7, 0x00000017,\n    0x00004A65, 0x000024B7, 0x0000064B, 0x00040070, 0x0000001D, 0x0000431D,\n    0x00004A65, 0x0005008E, 0x0000001D, 0x00003095, 0x0000431D, 0x0000017A,\n    0x000200F9, 0x00003F63, 0x000200F8, 0x00004BFE, 0x00050051, 0x0000000B,\n    0x00003096, 0x00002AC2, 0x00000000, 0x0004007C, 0x0000000D, 0x00004FF1,\n    0x00003096, 0x00050050, 0x00000013, 0x0000433F, 0x00004FF1, 0x00000A0C,\n    0x0009004F, 0x0000001D, 0x00002D99, 0x0000433F, 0x0000433F, 0x00000000,\n    0x00000001, 0x00000001, 0x00000001, 0x00050051, 0x0000000B, 0x000056BA,\n    0x00002AC2, 0x00000001, 0x0004007C, 0x0000000D, 0x00003F71, 0x000056BA,\n    0x00050050, 0x00000013, 0x00004340, 0x00003F71, 0x00000A0C, 0x0009004F,\n    0x0000001D, 0x00002D9A, 0x00004340, 0x00004340, 0x00000000, 0x00000001,\n    0x00000001, 0x00000001, 0x00050051, 0x0000000B, 0x000056BB, 0x00002AC2,\n    0x00000002, 0x0004007C, 0x0000000D, 0x00003F72, 0x000056BB, 0x00050050,\n    0x00000013, 0x00004341, 0x00003F72, 0x00000A0C, 0x0009004F, 0x0000001D,\n    0x00002D9B, 0x00004341, 0x00004341, 0x00000000, 0x00000001, 0x00000001,\n    0x00000001, 0x00050051, 0x0000000B, 0x000056BC, 0x00002AC2, 0x00000003,\n    0x0004007C, 0x0000000D, 0x00003F73, 0x000056BC, 0x00050050, 0x00000013,\n    0x00004FB1, 0x00003F73, 0x00000A0C, 0x0009004F, 0x0000001D, 0x00005A3D,\n    0x00004FB1, 0x00004FB1, 0x00000000, 0x00000001, 0x00000001, 0x00000001,\n    0x000200F9, 0x00003F63, 0x000200F8, 0x00003F63, 0x000F00F5, 0x0000001D,\n    0x00002BB0, 0x00005A3D, 0x00004BFE, 0x00003095, 0x000038FC, 0x000026A2,\n    0x00001CC1, 0x0000235A, 0x00001CC0, 0x00002359, 0x00002001, 0x00002358,\n    0x00002039, 0x000F00F5, 0x0000001D, 0x00003811, 0x00002D9B, 0x00004BFE,\n    0x00004B2E, 0x000038FC, 0x0000413B, 0x00001CC1, 0x00003DE5, 0x00001CC0,\n    0x00004129, 0x00002001, 0x00003920, 0x00002039, 0x000F00F5, 0x0000001D,\n    0x00003B83, 0x00002D9A, 0x00004BFE, 0x00004B2D, 0x000038FC, 0x0000413A,\n    0x00001CC1, 0x00003DE4, 0x00001CC0, 0x00004128, 0x00002001, 0x0000391F,\n    0x00002039, 0x000F00F5, 0x0000001D, 0x000038BC, 0x00002D99, 0x00004BFE,\n    0x00004B2C, 0x000038FC, 0x00004139, 0x00001CC1, 0x00003DE3, 0x00001CC0,\n    0x00004127, 0x00002001, 0x0000391E, 0x00002039, 0x000200F9, 0x00005312,\n    0x000200F8, 0x00003B68, 0x000500AA, 0x00000009, 0x00005453, 0x0000199B,\n    0x00000A22, 0x000300F7, 0x00004F29, 0x00000002, 0x000400FA, 0x00005453,\n    0x000019C6, 0x00002306, 0x000200F8, 0x00002306, 0x000500C2, 0x0000000B,\n    0x00005637, 0x00003FF8, 0x00000A11, 0x00060041, 0x00000289, 0x00003447,\n    0x00000CC7, 0x00000A0B, 0x00005637, 0x0004003D, 0x0000000B, 0x00003157,\n    0x00003447, 0x00050080, 0x0000000B, 0x00002DD1, 0x00005637, 0x00000A0D,\n    0x00060041, 0x00000289, 0x00001916, 0x00000CC7, 0x00000A0B, 0x00002DD1,\n    0x0004003D, 0x0000000B, 0x00001B79, 0x00001916, 0x00050080, 0x0000000B,\n    0x0000214C, 0x00003FF8, 0x0000199B, 0x000500C2, 0x0000000B, 0x000054AD,\n    0x0000214C, 0x00000A11, 0x00060041, 0x00000289, 0x00004C9D, 0x00000CC7,\n    0x00000A0B, 0x000054AD, 0x0004003D, 0x0000000B, 0x00003158, 0x00004C9D,\n    0x00050080, 0x0000000B, 0x00002DD2, 0x000054AD, 0x00000A0D, 0x00060041,\n    0x00000289, 0x0000600E, 0x00000CC7, 0x00000A0B, 0x00002DD2, 0x0004003D,\n    0x0000000B, 0x0000374F, 0x0000600E, 0x00070050, 0x00000017, 0x00004CDA,\n    0x00003157, 0x00001B79, 0x00003158, 0x0000374F, 0x00050084, 0x0000000B,\n    0x00004C2E, 0x00000A10, 0x0000199B, 0x00050080, 0x0000000B, 0x00002A48,\n    0x00003FF8, 0x00004C2E, 0x000500C2, 0x0000000B, 0x000045F0, 0x00002A48,\n    0x00000A11, 0x00060041, 0x00000289, 0x00004C9E, 0x00000CC7, 0x00000A0B,\n    0x000045F0, 0x0004003D, 0x0000000B, 0x00003159, 0x00004C9E, 0x00050080,\n    0x0000000B, 0x00002DD3, 0x000045F0, 0x00000A0D, 0x00060041, 0x00000289,\n    0x0000194E, 0x00000CC7, 0x00000A0B, 0x00002DD3, 0x0004003D, 0x0000000B,\n    0x00005E5E, 0x0000194E, 0x00050084, 0x0000000B, 0x000021F8, 0x00000A13,\n    0x0000199B, 0x00050080, 0x0000000B, 0x00005EC9, 0x00003FF8, 0x000021F8,\n    0x000500C2, 0x0000000B, 0x000045F1, 0x00005EC9, 0x00000A11, 0x00060041,\n    0x00000289, 0x00004C9F, 0x00000CC7, 0x00000A0B, 0x000045F1, 0x0004003D,\n    0x0000000B, 0x0000315A, 0x00004C9F, 0x00050080, 0x0000000B, 0x00002DD4,\n    0x000045F1, 0x00000A0D, 0x00060041, 0x00000289, 0x0000600F, 0x00000CC7,\n    0x00000A0B, 0x00002DD4, 0x0004003D, 0x0000000B, 0x00004005, 0x0000600F,\n    0x00070050, 0x00000017, 0x0000513A, 0x00003159, 0x00005E5E, 0x0000315A,\n    0x00004005, 0x000200F9, 0x00004F29, 0x000200F8, 0x000019C6, 0x000500C2,\n    0x0000000B, 0x00005FAD, 0x00003FF8, 0x00000A11, 0x00060041, 0x00000289,\n    0x00003448, 0x00000CC7, 0x00000A0B, 0x00005FAD, 0x0004003D, 0x0000000B,\n    0x0000315B, 0x00003448, 0x00050080, 0x0000000B, 0x00002DD5, 0x00005FAD,\n    0x00000A0D, 0x00060041, 0x00000289, 0x00001917, 0x00000CC7, 0x00000A0B,\n    0x00002DD5, 0x0004003D, 0x0000000B, 0x00005C76, 0x00001917, 0x00050080,\n    0x0000000B, 0x00002DD6, 0x00005FAD, 0x00000A10, 0x00060041, 0x00000289,\n    0x00001918, 0x00000CC7, 0x00000A0B, 0x00002DD6, 0x0004003D, 0x0000000B,\n    0x00005C77, 0x00001918, 0x00050080, 0x0000000B, 0x00002DD7, 0x00005FAD,\n    0x00000A13, 0x00060041, 0x00000289, 0x00006010, 0x00000CC7, 0x00000A0B,\n    0x00002DD7, 0x0004003D, 0x0000000B, 0x00003703, 0x00006010, 0x00070050,\n    0x00000017, 0x00005473, 0x0000315B, 0x00005C76, 0x00005C77, 0x00003703,\n    0x00050080, 0x0000000B, 0x00004B86, 0x00003FF8, 0x00000A3A, 0x000500C2,\n    0x0000000B, 0x00002030, 0x00004B86, 0x00000A11, 0x00060041, 0x00000289,\n    0x00004CA0, 0x00000CC7, 0x00000A0B, 0x00002030, 0x0004003D, 0x0000000B,\n    0x0000315C, 0x00004CA0, 0x00050080, 0x0000000B, 0x00002DD8, 0x00002030,\n    0x00000A0D, 0x00060041, 0x00000289, 0x00001919, 0x00000CC7, 0x00000A0B,\n    0x00002DD8, 0x0004003D, 0x0000000B, 0x00005C78, 0x00001919, 0x00050080,\n    0x0000000B, 0x00002DD9, 0x00002030, 0x00000A10, 0x00060041, 0x00000289,\n    0x0000191A, 0x00000CC7, 0x00000A0B, 0x00002DD9, 0x0004003D, 0x0000000B,\n    0x00005C79, 0x0000191A, 0x00050080, 0x0000000B, 0x00002DDA, 0x00002030,\n    0x00000A13, 0x00060041, 0x00000289, 0x00006011, 0x00000CC7, 0x00000A0B,\n    0x00002DDA, 0x0004003D, 0x0000000B, 0x00004006, 0x00006011, 0x00070050,\n    0x00000017, 0x0000513B, 0x0000315C, 0x00005C78, 0x00005C79, 0x00004006,\n    0x000200F9, 0x00004F29, 0x000200F8, 0x00004F29, 0x000700F5, 0x00000017,\n    0x00002BD0, 0x0000513B, 0x000019C6, 0x0000513A, 0x00002306, 0x000700F5,\n    0x00000017, 0x00003723, 0x00005473, 0x000019C6, 0x00004CDA, 0x00002306,\n    0x000300F7, 0x00004F2A, 0x00000000, 0x000700FB, 0x00002180, 0x00004F59,\n    0x00000005, 0x0000215B, 0x00000007, 0x0000203A, 0x000200F8, 0x0000203A,\n    0x00050051, 0x0000000B, 0x00005F61, 0x00003723, 0x00000000, 0x0006000C,\n    0x00000013, 0x0000606E, 0x00000001, 0x0000003E, 0x00005F61, 0x00050051,\n    0x0000000D, 0x0000278A, 0x0000606E, 0x00000000, 0x00050051, 0x0000000D,\n    0x00003EC4, 0x0000606E, 0x00000001, 0x00050051, 0x0000000B, 0x0000428D,\n    0x00003723, 0x00000001, 0x0006000C, 0x00000013, 0x00003D01, 0x00000001,\n    0x0000003E, 0x0000428D, 0x00050051, 0x0000000D, 0x0000278B, 0x00003D01,\n    0x00000000, 0x00050051, 0x0000000D, 0x0000445B, 0x00003D01, 0x00000001,\n    0x00070050, 0x0000001D, 0x00003921, 0x0000278A, 0x00003EC4, 0x0000278B,\n    0x0000445B, 0x00050051, 0x0000000B, 0x0000438F, 0x00003723, 0x00000002,\n    0x0006000C, 0x00000013, 0x00004680, 0x00000001, 0x0000003E, 0x0000438F,\n    0x00050051, 0x0000000D, 0x0000278C, 0x00004680, 0x00000000, 0x00050051,\n    0x0000000D, 0x00003EC5, 0x00004680, 0x00000001, 0x00050051, 0x0000000B,\n    0x0000428E, 0x00003723, 0x00000003, 0x0006000C, 0x00000013, 0x00003D02,\n    0x00000001, 0x0000003E, 0x0000428E, 0x00050051, 0x0000000D, 0x0000278D,\n    0x00003D02, 0x00000000, 0x00050051, 0x0000000D, 0x0000445C, 0x00003D02,\n    0x00000001, 0x00070050, 0x0000001D, 0x00003922, 0x0000278C, 0x00003EC5,\n    0x0000278D, 0x0000445C, 0x00050051, 0x0000000B, 0x00004390, 0x00002BD0,\n    0x00000000, 0x0006000C, 0x00000013, 0x00004681, 0x00000001, 0x0000003E,\n    0x00004390, 0x00050051, 0x0000000D, 0x0000278E, 0x00004681, 0x00000000,\n    0x00050051, 0x0000000D, 0x00003EC6, 0x00004681, 0x00000001, 0x00050051,\n    0x0000000B, 0x0000428F, 0x00002BD0, 0x00000001, 0x0006000C, 0x00000013,\n    0x00003D03, 0x00000001, 0x0000003E, 0x0000428F, 0x00050051, 0x0000000D,\n    0x0000278F, 0x00003D03, 0x00000000, 0x00050051, 0x0000000D, 0x0000445D,\n    0x00003D03, 0x00000001, 0x00070050, 0x0000001D, 0x00003923, 0x0000278E,\n    0x00003EC6, 0x0000278F, 0x0000445D, 0x00050051, 0x0000000B, 0x00004391,\n    0x00002BD0, 0x00000002, 0x0006000C, 0x00000013, 0x00004682, 0x00000001,\n    0x0000003E, 0x00004391, 0x00050051, 0x0000000D, 0x00002790, 0x00004682,\n    0x00000000, 0x00050051, 0x0000000D, 0x00003EC7, 0x00004682, 0x00000001,\n    0x00050051, 0x0000000B, 0x00004290, 0x00002BD0, 0x00000003, 0x0006000C,\n    0x00000013, 0x00003D04, 0x00000001, 0x0000003E, 0x00004290, 0x00050051,\n    0x0000000D, 0x00002791, 0x00003D04, 0x00000000, 0x00050051, 0x0000000D,\n    0x000050C5, 0x00003D04, 0x00000001, 0x00070050, 0x0000001D, 0x0000235B,\n    0x00002790, 0x00003EC7, 0x00002791, 0x000050C5, 0x000200F9, 0x00004F2A,\n    0x000200F8, 0x0000215B, 0x0007004F, 0x00000011, 0x000025FE, 0x00003723,\n    0x00003723, 0x00000000, 0x00000001, 0x0004007C, 0x00000012, 0x00005B3F,\n    0x000025FE, 0x0009004F, 0x0000001A, 0x000060DA, 0x00005B3F, 0x00005B3F,\n    0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x000500C4, 0x0000001A,\n    0x000048B9, 0x000060DA, 0x00000122, 0x000500C3, 0x0000001A, 0x00003D99,\n    0x000048B9, 0x00000302, 0x0004006F, 0x0000001D, 0x00002AC7, 0x00003D99,\n    0x0005008E, 0x0000001D, 0x00004733, 0x00002AC7, 0x000007FE, 0x0007000C,\n    0x0000001D, 0x0000629A, 0x00000001, 0x00000028, 0x00000504, 0x00004733,\n    0x0007004F, 0x00000011, 0x00003774, 0x00003723, 0x00003723, 0x00000002,\n    0x00000003, 0x0004007C, 0x00000012, 0x000024C8, 0x00003774, 0x0009004F,\n    0x0000001A, 0x000060DB, 0x000024C8, 0x000024C8, 0x00000000, 0x00000000,\n    0x00000001, 0x00000001, 0x000500C4, 0x0000001A, 0x000048BA, 0x000060DB,\n    0x00000122, 0x000500C3, 0x0000001A, 0x00003D9A, 0x000048BA, 0x00000302,\n    0x0004006F, 0x0000001D, 0x00002AC8, 0x00003D9A, 0x0005008E, 0x0000001D,\n    0x00004734, 0x00002AC8, 0x000007FE, 0x0007000C, 0x0000001D, 0x0000629B,\n    0x00000001, 0x00000028, 0x00000504, 0x00004734, 0x0007004F, 0x00000011,\n    0x00003775, 0x00002BD0, 0x00002BD0, 0x00000000, 0x00000001, 0x0004007C,\n    0x00000012, 0x000024C9, 0x00003775, 0x0009004F, 0x0000001A, 0x000060DC,\n    0x000024C9, 0x000024C9, 0x00000000, 0x00000000, 0x00000001, 0x00000001,\n    0x000500C4, 0x0000001A, 0x000048BB, 0x000060DC, 0x00000122, 0x000500C3,\n    0x0000001A, 0x00003D9B, 0x000048BB, 0x00000302, 0x0004006F, 0x0000001D,\n    0x00002AC9, 0x00003D9B, 0x0005008E, 0x0000001D, 0x00004735, 0x00002AC9,\n    0x000007FE, 0x0007000C, 0x0000001D, 0x0000629C, 0x00000001, 0x00000028,\n    0x00000504, 0x00004735, 0x0007004F, 0x00000011, 0x00003776, 0x00002BD0,\n    0x00002BD0, 0x00000002, 0x00000003, 0x0004007C, 0x00000012, 0x000024CA,\n    0x00003776, 0x0009004F, 0x0000001A, 0x000060DD, 0x000024CA, 0x000024CA,\n    0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x000500C4, 0x0000001A,\n    0x000048BC, 0x000060DD, 0x00000122, 0x000500C3, 0x0000001A, 0x00003D9C,\n    0x000048BC, 0x00000302, 0x0004006F, 0x0000001D, 0x00002ACA, 0x00003D9C,\n    0x0005008E, 0x0000001D, 0x000053D2, 0x00002ACA, 0x000007FE, 0x0007000C,\n    0x0000001D, 0x00004365, 0x00000001, 0x00000028, 0x00000504, 0x000053D2,\n    0x000200F9, 0x00004F2A, 0x000200F8, 0x00004F59, 0x0007004F, 0x00000011,\n    0x00002624, 0x00003723, 0x00003723, 0x00000000, 0x00000001, 0x0004007C,\n    0x00000013, 0x0000515D, 0x00002624, 0x00050051, 0x0000000D, 0x00001B88,\n    0x0000515D, 0x00000000, 0x00050051, 0x0000000D, 0x00003473, 0x0000515D,\n    0x00000001, 0x00070050, 0x0000001D, 0x00004291, 0x00001B88, 0x00003473,\n    0x00000A0C, 0x00000A0C, 0x0007004F, 0x00000011, 0x000041E1, 0x00003723,\n    0x00003723, 0x00000002, 0x00000003, 0x0004007C, 0x00000013, 0x00003766,\n    0x000041E1, 0x00050051, 0x0000000D, 0x00001B89, 0x00003766, 0x00000000,\n    0x00050051, 0x0000000D, 0x00003474, 0x00003766, 0x00000001, 0x00070050,\n    0x0000001D, 0x00004292, 0x00001B89, 0x00003474, 0x00000A0C, 0x00000A0C,\n    0x0007004F, 0x00000011, 0x000041E2, 0x00002BD0, 0x00002BD0, 0x00000000,\n    0x00000001, 0x0004007C, 0x00000013, 0x00003767, 0x000041E2, 0x00050051,\n    0x0000000D, 0x00001B8A, 0x00003767, 0x00000000, 0x00050051, 0x0000000D,\n    0x00003475, 0x00003767, 0x00000001, 0x00070050, 0x0000001D, 0x00004293,\n    0x00001B8A, 0x00003475, 0x00000A0C, 0x00000A0C, 0x0007004F, 0x00000011,\n    0x000041E3, 0x00002BD0, 0x00002BD0, 0x00000002, 0x00000003, 0x0004007C,\n    0x00000013, 0x00003768, 0x000041E3, 0x00050051, 0x0000000D, 0x00001B8B,\n    0x00003768, 0x00000000, 0x00050051, 0x0000000D, 0x0000410B, 0x00003768,\n    0x00000001, 0x00070050, 0x0000001D, 0x0000235C, 0x00001B8B, 0x0000410B,\n    0x00000A0C, 0x00000A0C, 0x000200F9, 0x00004F2A, 0x000200F8, 0x00004F2A,\n    0x000900F5, 0x0000001D, 0x00002BB1, 0x0000235C, 0x00004F59, 0x00004365,\n    0x0000215B, 0x0000235B, 0x0000203A, 0x000900F5, 0x0000001D, 0x00003812,\n    0x00004293, 0x00004F59, 0x0000629C, 0x0000215B, 0x00003923, 0x0000203A,\n    0x000900F5, 0x0000001D, 0x00003B84, 0x00004292, 0x00004F59, 0x0000629B,\n    0x0000215B, 0x00003922, 0x0000203A, 0x000900F5, 0x0000001D, 0x000038BD,\n    0x00004291, 0x00004F59, 0x0000629A, 0x0000215B, 0x00003921, 0x0000203A,\n    0x000200F9, 0x00005312, 0x000200F8, 0x00005312, 0x000700F5, 0x0000001D,\n    0x00002BB2, 0x00002BB1, 0x00004F2A, 0x00002BB0, 0x00003F63, 0x000700F5,\n    0x0000001D, 0x00003813, 0x00003812, 0x00004F2A, 0x00003811, 0x00003F63,\n    0x000700F5, 0x0000001D, 0x00003297, 0x00003B84, 0x00004F2A, 0x00003B83,\n    0x00003F63, 0x000700F5, 0x0000001D, 0x0000367C, 0x000038BD, 0x00004F2A,\n    0x000038BC, 0x00003F63, 0x00050081, 0x0000001D, 0x0000435B, 0x0000435A,\n    0x0000367C, 0x00050081, 0x0000001D, 0x00005B03, 0x00005B02, 0x00003297,\n    0x00050081, 0x0000001D, 0x00002523, 0x00001C28, 0x00003813, 0x00050081,\n    0x0000001D, 0x00001E77, 0x000025AA, 0x00002BB2, 0x000200F9, 0x00005ECA,\n    0x000200F8, 0x00005ECA, 0x000700F5, 0x0000001D, 0x00002BB3, 0x00005113,\n    0x00005310, 0x00001E77, 0x00005312, 0x000700F5, 0x0000001D, 0x00003814,\n    0x00001F92, 0x00005310, 0x00002523, 0x00005312, 0x000700F5, 0x0000001D,\n    0x00003B31, 0x00005B01, 0x00005310, 0x00005B03, 0x00005312, 0x000700F5,\n    0x0000001D, 0x00003B85, 0x00004359, 0x00005310, 0x0000435B, 0x00005312,\n    0x000700F5, 0x0000000D, 0x000038BE, 0x00005A1D, 0x00005310, 0x00002F3A,\n    0x00005312, 0x000200F9, 0x00005313, 0x000200F8, 0x00005313, 0x000700F5,\n    0x0000001D, 0x00002BB4, 0x00002BA9, 0x0000530F, 0x00002BB3, 0x00005ECA,\n    0x000700F5, 0x0000001D, 0x00003815, 0x0000380A, 0x0000530F, 0x00003814,\n    0x00005ECA, 0x000700F5, 0x0000001D, 0x00003B32, 0x000035EC, 0x0000530F,\n    0x00003B31, 0x00005ECA, 0x000700F5, 0x0000001D, 0x0000338C, 0x000020D3,\n    0x0000530F, 0x00003B85, 0x00005ECA, 0x000700F5, 0x0000000D, 0x00002EA8,\n    0x00002B2C, 0x0000530F, 0x000038BE, 0x00005ECA, 0x0005008E, 0x0000001D,\n    0x00005A74, 0x0000338C, 0x00002EA8, 0x0005008E, 0x0000001D, 0x000019CC,\n    0x00003B32, 0x00002EA8, 0x0005008E, 0x0000001D, 0x0000306F, 0x00003815,\n    0x00002EA8, 0x0005008E, 0x0000001D, 0x00003432, 0x00002BB4, 0x00002EA8,\n    0x000300F7, 0x00003F64, 0x00000002, 0x000400FA, 0x00001D33, 0x00002741,\n    0x00003F64, 0x000200F8, 0x00002741, 0x0009004F, 0x0000001D, 0x00003AEE,\n    0x00005A74, 0x00005A74, 0x00000002, 0x00000001, 0x00000000, 0x00000003,\n    0x0009004F, 0x0000001D, 0x00003A07, 0x000019CC, 0x000019CC, 0x00000002,\n    0x00000001, 0x00000000, 0x00000003, 0x0009004F, 0x0000001D, 0x00001CE6,\n    0x0000306F, 0x0000306F, 0x00000002, 0x00000001, 0x00000000, 0x00000003,\n    0x0009004F, 0x0000001D, 0x00003EEF, 0x00003432, 0x00003432, 0x00000002,\n    0x00000001, 0x00000000, 0x00000003, 0x000200F9, 0x00003F64, 0x000200F8,\n    0x00003F64, 0x000700F5, 0x0000001D, 0x00002BB5, 0x00003432, 0x00005313,\n    0x00003EEF, 0x00002741, 0x000700F5, 0x0000001D, 0x00003816, 0x0000306F,\n    0x00005313, 0x00001CE6, 0x00002741, 0x000700F5, 0x0000001D, 0x00003B57,\n    0x000019CC, 0x00005313, 0x00003A07, 0x00002741, 0x000700F5, 0x0000001D,\n    0x00003A49, 0x00005A74, 0x00005313, 0x00003AEE, 0x00002741, 0x000300F7,\n    0x00004992, 0x00000000, 0x000F00FB, 0x00005093, 0x00001CCE, 0x00000003,\n    0x000045F2, 0x00000004, 0x00001934, 0x00000005, 0x00001933, 0x0000000A,\n    0x00001CCD, 0x0000000F, 0x00003167, 0x00000018, 0x00002514, 0x000200F8,\n    0x00002514, 0x00050051, 0x0000000D, 0x00003AC1, 0x00003A49, 0x00000000,\n    0x00050051, 0x0000000D, 0x00002825, 0x00003B57, 0x00000000, 0x00050051,\n    0x0000000D, 0x00001DD9, 0x00003816, 0x00000000, 0x00050051, 0x0000000D,\n    0x000019A5, 0x00002BB5, 0x00000000, 0x00070050, 0x0000001D, 0x00001D37,\n    0x00003AC1, 0x00002825, 0x00001DD9, 0x000019A5, 0x0008000C, 0x0000001D,\n    0x00003846, 0x00000001, 0x0000002B, 0x00001D37, 0x00000B7A, 0x00000505,\n    0x0005008E, 0x0000001D, 0x00003577, 0x00003846, 0x0000022D, 0x00050081,\n    0x0000001D, 0x00002E40, 0x00003577, 0x00000145, 0x0004006D, 0x00000017,\n    0x00001F0B, 0x00002E40, 0x0007004F, 0x00000011, 0x000018D9, 0x00001F0B,\n    0x00001F0B, 0x00000000, 0x00000002, 0x0007004F, 0x00000011, 0x00002750,\n    0x00001F0B, 0x00001F0B, 0x00000001, 0x00000003, 0x000500C4, 0x00000011,\n    0x00003546, 0x00002750, 0x00000867, 0x000500C5, 0x00000011, 0x00003D25,\n    0x000018D9, 0x00003546, 0x000200F9, 0x00004992, 0x000200F8, 0x00003167,\n    0x0008000C, 0x0000001D, 0x00001C8F, 0x00000001, 0x0000002B, 0x00003A49,\n    0x00000B7A, 0x00000505, 0x0005008E, 0x0000001D, 0x00004F73, 0x00001C8F,\n    0x000001C1, 0x00050081, 0x0000001D, 0x00002E66, 0x00004F73, 0x00000145,\n    0x0004006D, 0x00000017, 0x00001DD7, 0x00002E66, 0x00050051, 0x0000000B,\n    0x000021FC, 0x00001DD7, 0x00000000, 0x00050051, 0x0000000B, 0x00002FDB,\n    0x00001DD7, 0x00000001, 0x000500C4, 0x0000000B, 0x00002D29, 0x00002FDB,\n    0x00000A17, 0x000500C5, 0x0000000B, 0x00004D66, 0x000021FC, 0x00002D29,\n    0x00050051, 0x0000000B, 0x000053E4, 0x00001DD7, 0x00000002, 0x000500C4,\n    0x0000000B, 0x00002170, 0x000053E4, 0x00000A23, 0x000500C5, 0x0000000B,\n    0x00004D67, 0x00004D66, 0x00002170, 0x00050051, 0x0000000B, 0x000053E5,\n    0x00001DD7, 0x00000003, 0x000500C4, 0x0000000B, 0x00001C7C, 0x000053E5,\n    0x00000A2F, 0x000500C5, 0x0000000B, 0x00002427, 0x00004D67, 0x00001C7C,\n    0x0008000C, 0x0000001D, 0x00001D62, 0x00000001, 0x0000002B, 0x00003B57,\n    0x00000B7A, 0x00000505, 0x0005008E, 0x0000001D, 0x00002048, 0x00001D62,\n    0x000001C1, 0x00050081, 0x0000001D, 0x00002E67, 0x00002048, 0x00000145,\n    0x0004006D, 0x00000017, 0x00001DDA, 0x00002E67, 0x00050051, 0x0000000B,\n    0x000021FD, 0x00001DDA, 0x00000000, 0x00050051, 0x0000000B, 0x00002FDC,\n    0x00001DDA, 0x00000001, 0x000500C4, 0x0000000B, 0x00002D2A, 0x00002FDC,\n    0x00000A17, 0x000500C5, 0x0000000B, 0x00004D68, 0x000021FD, 0x00002D2A,\n    0x00050051, 0x0000000B, 0x000053E6, 0x00001DDA, 0x00000002, 0x000500C4,\n    0x0000000B, 0x00002171, 0x000053E6, 0x00000A23, 0x000500C5, 0x0000000B,\n    0x00004D69, 0x00004D68, 0x00002171, 0x00050051, 0x0000000B, 0x000053E7,\n    0x00001DDA, 0x00000003, 0x000500C4, 0x0000000B, 0x000029F9, 0x000053E7,\n    0x00000A2F, 0x000500C5, 0x0000000B, 0x00004A41, 0x00004D69, 0x000029F9,\n    0x000500C4, 0x0000000B, 0x000058C9, 0x00004A41, 0x00000A3A, 0x000500C5,\n    0x0000000B, 0x0000186E, 0x00002427, 0x000058C9, 0x0008000C, 0x0000001D,\n    0x00001D63, 0x00000001, 0x0000002B, 0x00003816, 0x00000B7A, 0x00000505,\n    0x0005008E, 0x0000001D, 0x00002049, 0x00001D63, 0x000001C1, 0x00050081,\n    0x0000001D, 0x00002E69, 0x00002049, 0x00000145, 0x0004006D, 0x00000017,\n    0x00001DDB, 0x00002E69, 0x00050051, 0x0000000B, 0x000021FE, 0x00001DDB,\n    0x00000000, 0x00050051, 0x0000000B, 0x00002FDD, 0x00001DDB, 0x00000001,\n    0x000500C4, 0x0000000B, 0x00002D2B, 0x00002FDD, 0x00000A17, 0x000500C5,\n    0x0000000B, 0x00004D6A, 0x000021FE, 0x00002D2B, 0x00050051, 0x0000000B,\n    0x000053E8, 0x00001DDB, 0x00000002, 0x000500C4, 0x0000000B, 0x00002172,\n    0x000053E8, 0x00000A23, 0x000500C5, 0x0000000B, 0x00004D6B, 0x00004D6A,\n    0x00002172, 0x00050051, 0x0000000B, 0x000053E9, 0x00001DDB, 0x00000003,\n    0x000500C4, 0x0000000B, 0x00001C7D, 0x000053E9, 0x00000A2F, 0x000500C5,\n    0x0000000B, 0x00002428, 0x00004D6B, 0x00001C7D, 0x0008000C, 0x0000001D,\n    0x00001D64, 0x00000001, 0x0000002B, 0x00002BB5, 0x00000B7A, 0x00000505,\n    0x0005008E, 0x0000001D, 0x0000204A, 0x00001D64, 0x000001C1, 0x00050081,\n    0x0000001D, 0x00002E6A, 0x0000204A, 0x00000145, 0x0004006D, 0x00000017,\n    0x00001DDC, 0x00002E6A, 0x00050051, 0x0000000B, 0x000021FF, 0x00001DDC,\n    0x00000000, 0x00050051, 0x0000000B, 0x00002FDE, 0x00001DDC, 0x00000001,\n    0x000500C4, 0x0000000B, 0x00002D2C, 0x00002FDE, 0x00000A17, 0x000500C5,\n    0x0000000B, 0x00004D6C, 0x000021FF, 0x00002D2C, 0x00050051, 0x0000000B,\n    0x000053EA, 0x00001DDC, 0x00000002, 0x000500C4, 0x0000000B, 0x00002173,\n    0x000053EA, 0x00000A23, 0x000500C5, 0x0000000B, 0x00004D6D, 0x00004D6C,\n    0x00002173, 0x00050051, 0x0000000B, 0x000053EB, 0x00001DDC, 0x00000003,\n    0x000500C4, 0x0000000B, 0x000029FA, 0x000053EB, 0x00000A2F, 0x000500C5,\n    0x0000000B, 0x00004A42, 0x00004D6D, 0x000029FA, 0x000500C4, 0x0000000B,\n    0x00005DAA, 0x00004A42, 0x00000A3A, 0x000500C5, 0x0000000B, 0x00004649,\n    0x00002428, 0x00005DAA, 0x00050050, 0x00000011, 0x000053DD, 0x0000186E,\n    0x00004649, 0x000200F9, 0x00004992, 0x000200F8, 0x00001CCD, 0x00050051,\n    0x0000000D, 0x00004DAD, 0x00003A49, 0x00000000, 0x00050051, 0x0000000D,\n    0x00002826, 0x00003A49, 0x00000001, 0x00050051, 0x0000000D, 0x00001DDD,\n    0x00003B57, 0x00000000, 0x00050051, 0x0000000D, 0x000019A6, 0x00003B57,\n    0x00000001, 0x00070050, 0x0000001D, 0x00001D38, 0x00004DAD, 0x00002826,\n    0x00001DDD, 0x000019A6, 0x0008000C, 0x0000001D, 0x00003847, 0x00000001,\n    0x0000002B, 0x00001D38, 0x00000B7A, 0x00000505, 0x0005008E, 0x0000001D,\n    0x00003578, 0x00003847, 0x00000540, 0x00050081, 0x0000001D, 0x00002E6B,\n    0x00003578, 0x00000145, 0x0004006D, 0x00000017, 0x00001DDE, 0x00002E6B,\n    0x00050051, 0x0000000B, 0x00002200, 0x00001DDE, 0x00000000, 0x00050051,\n    0x0000000B, 0x00002FDF, 0x00001DDE, 0x00000001, 0x000500C4, 0x0000000B,\n    0x00002D2D, 0x00002FDF, 0x00000A23, 0x000500C5, 0x0000000B, 0x00004D6E,\n    0x00002200, 0x00002D2D, 0x00050051, 0x0000000B, 0x000053EC, 0x00001DDE,\n    0x00000002, 0x000500C4, 0x0000000B, 0x00002174, 0x000053EC, 0x00000A3B,\n    0x000500C5, 0x0000000B, 0x00004D6F, 0x00004D6E, 0x00002174, 0x00050051,\n    0x0000000B, 0x000053ED, 0x00001DDE, 0x00000003, 0x000500C4, 0x0000000B,\n    0x00002175, 0x000053ED, 0x00000A53, 0x000500C5, 0x0000000B, 0x000044DD,\n    0x00004D6F, 0x00002175, 0x00050051, 0x0000000D, 0x00004E80, 0x00003816,\n    0x00000000, 0x00050051, 0x0000000D, 0x00005CB2, 0x00003816, 0x00000001,\n    0x00050051, 0x0000000D, 0x00001DDF, 0x00002BB5, 0x00000000, 0x00050051,\n    0x0000000D, 0x000019A7, 0x00002BB5, 0x00000001, 0x00070050, 0x0000001D,\n    0x00001D39, 0x00004E80, 0x00005CB2, 0x00001DDF, 0x000019A7, 0x0008000C,\n    0x0000001D, 0x00003848, 0x00000001, 0x0000002B, 0x00001D39, 0x00000B7A,\n    0x00000505, 0x0005008E, 0x0000001D, 0x00003579, 0x00003848, 0x00000540,\n    0x00050081, 0x0000001D, 0x00002E6C, 0x00003579, 0x00000145, 0x0004006D,\n    0x00000017, 0x00001DE0, 0x00002E6C, 0x00050051, 0x0000000B, 0x00002201,\n    0x00001DE0, 0x00000000, 0x00050051, 0x0000000B, 0x00002FE0, 0x00001DE0,\n    0x00000001, 0x000500C4, 0x0000000B, 0x00002D2E, 0x00002FE0, 0x00000A23,\n    0x000500C5, 0x0000000B, 0x00004D70, 0x00002201, 0x00002D2E, 0x00050051,\n    0x0000000B, 0x000053EE, 0x00001DE0, 0x00000002, 0x000500C4, 0x0000000B,\n    0x00002176, 0x000053EE, 0x00000A3B, 0x000500C5, 0x0000000B, 0x00004D71,\n    0x00004D70, 0x00002176, 0x00050051, 0x0000000B, 0x000053EF, 0x00001DE0,\n    0x00000003, 0x000500C4, 0x0000000B, 0x0000215D, 0x000053EF, 0x00000A53,\n    0x000500C5, 0x0000000B, 0x00005202, 0x00004D71, 0x0000215D, 0x00050050,\n    0x00000011, 0x000053DE, 0x000044DD, 0x00005202, 0x000200F9, 0x00004992,\n    0x000200F8, 0x00001933, 0x0008004F, 0x00000018, 0x000021CF, 0x00003A49,\n    0x00003A49, 0x00000000, 0x00000001, 0x00000002, 0x0008000C, 0x00000018,\n    0x00001847, 0x00000001, 0x0000002B, 0x000021CF, 0x00000A2D, 0x00000A18,\n    0x00050085, 0x00000018, 0x00001BC1, 0x00001847, 0x000003BE, 0x00050081,\n    0x00000018, 0x00001F1A, 0x00001BC1, 0x000003AB, 0x0004006D, 0x00000014,\n    0x00002752, 0x00001F1A, 0x00050051, 0x0000000B, 0x00002202, 0x00002752,\n    0x00000000, 0x00050051, 0x0000000B, 0x00002FE1, 0x00002752, 0x00000001,\n    0x000500C4, 0x0000000B, 0x00002D2F, 0x00002FE1, 0x00000A1A, 0x000500C5,\n    0x0000000B, 0x00004D72, 0x00002202, 0x00002D2F, 0x00050051, 0x0000000B,\n    0x000053F0, 0x00002752, 0x00000002, 0x000500C4, 0x0000000B, 0x0000214D,\n    0x000053F0, 0x00000A29, 0x000500C5, 0x0000000B, 0x00004143, 0x00004D72,\n    0x0000214D, 0x0008004F, 0x00000018, 0x000022A2, 0x00003B57, 0x00003B57,\n    0x00000000, 0x00000001, 0x00000002, 0x0008000C, 0x00000018, 0x00004CD4,\n    0x00000001, 0x0000002B, 0x000022A2, 0x00000A2D, 0x00000A18, 0x00050085,\n    0x00000018, 0x00001BC2, 0x00004CD4, 0x000003BE, 0x00050081, 0x00000018,\n    0x00001F1B, 0x00001BC2, 0x000003AB, 0x0004006D, 0x00000014, 0x00002753,\n    0x00001F1B, 0x00050051, 0x0000000B, 0x00002203, 0x00002753, 0x00000000,\n    0x00050051, 0x0000000B, 0x00002FE2, 0x00002753, 0x00000001, 0x000500C4,\n    0x0000000B, 0x00002D30, 0x00002FE2, 0x00000A1A, 0x000500C5, 0x0000000B,\n    0x00004D73, 0x00002203, 0x00002D30, 0x00050051, 0x0000000B, 0x000053F1,\n    0x00002753, 0x00000002, 0x000500C4, 0x0000000B, 0x000029FB, 0x000053F1,\n    0x00000A29, 0x000500C5, 0x0000000B, 0x00004A43, 0x00004D73, 0x000029FB,\n    0x000500C4, 0x0000000B, 0x00005D97, 0x00004A43, 0x00000A3A, 0x000500C5,\n    0x0000000B, 0x0000358A, 0x00004143, 0x00005D97, 0x0008004F, 0x00000018,\n    0x000022A3, 0x00003816, 0x00003816, 0x00000000, 0x00000001, 0x00000002,\n    0x0008000C, 0x00000018, 0x00004CD5, 0x00000001, 0x0000002B, 0x000022A3,\n    0x00000A2D, 0x00000A18, 0x00050085, 0x00000018, 0x00001BC3, 0x00004CD5,\n    0x000003BE, 0x00050081, 0x00000018, 0x00001F1C, 0x00001BC3, 0x000003AB,\n    0x0004006D, 0x00000014, 0x00002754, 0x00001F1C, 0x00050051, 0x0000000B,\n    0x00002204, 0x00002754, 0x00000000, 0x00050051, 0x0000000B, 0x00002FE3,\n    0x00002754, 0x00000001, 0x000500C4, 0x0000000B, 0x00002D31, 0x00002FE3,\n    0x00000A1A, 0x000500C5, 0x0000000B, 0x00004D74, 0x00002204, 0x00002D31,\n    0x00050051, 0x0000000B, 0x000053F2, 0x00002754, 0x00000002, 0x000500C4,\n    0x0000000B, 0x0000214E, 0x000053F2, 0x00000A29, 0x000500C5, 0x0000000B,\n    0x00004144, 0x00004D74, 0x0000214E, 0x0008004F, 0x00000018, 0x000022A4,\n    0x00002BB5, 0x00002BB5, 0x00000000, 0x00000001, 0x00000002, 0x0008000C,\n    0x00000018, 0x00004CDB, 0x00000001, 0x0000002B, 0x000022A4, 0x00000A2D,\n    0x00000A18, 0x00050085, 0x00000018, 0x00001BC4, 0x00004CDB, 0x000003BE,\n    0x00050081, 0x00000018, 0x00001F1D, 0x00001BC4, 0x000003AB, 0x0004006D,\n    0x00000014, 0x00002755, 0x00001F1D, 0x00050051, 0x0000000B, 0x00002205,\n    0x00002755, 0x00000000, 0x00050051, 0x0000000B, 0x00002FE4, 0x00002755,\n    0x00000001, 0x000500C4, 0x0000000B, 0x00002D32, 0x00002FE4, 0x00000A1A,\n    0x000500C5, 0x0000000B, 0x00004D75, 0x00002205, 0x00002D32, 0x00050051,\n    0x0000000B, 0x000053F3, 0x00002755, 0x00000002, 0x000500C4, 0x0000000B,\n    0x000029FC, 0x000053F3, 0x00000A29, 0x000500C5, 0x0000000B, 0x00004A44,\n    0x00004D75, 0x000029FC, 0x000500C4, 0x0000000B, 0x00005DAB, 0x00004A44,\n    0x00000A3A, 0x000500C5, 0x0000000B, 0x0000464A, 0x00004144, 0x00005DAB,\n    0x00050050, 0x00000011, 0x000053DF, 0x0000358A, 0x0000464A, 0x000200F9,\n    0x00004992, 0x000200F8, 0x00001934, 0x0008004F, 0x00000018, 0x000021D0,\n    0x00003A49, 0x00003A49, 0x00000000, 0x00000001, 0x00000002, 0x0008000C,\n    0x00000018, 0x00001848, 0x00000001, 0x0000002B, 0x000021D0, 0x00000A2D,\n    0x00000A18, 0x00050085, 0x00000018, 0x00001BC5, 0x00001848, 0x000001FF,\n    0x00050081, 0x00000018, 0x00001F1E, 0x00001BC5, 0x000003AB, 0x0004006D,\n    0x00000014, 0x00002756, 0x00001F1E, 0x00050051, 0x0000000B, 0x00002206,\n    0x00002756, 0x00000000, 0x00050051, 0x0000000B, 0x00002FE5, 0x00002756,\n    0x00000001, 0x000500C4, 0x0000000B, 0x00002D33, 0x00002FE5, 0x00000A1A,\n    0x000500C5, 0x0000000B, 0x00004D76, 0x00002206, 0x00002D33, 0x00050051,\n    0x0000000B, 0x000053F4, 0x00002756, 0x00000002, 0x000500C4, 0x0000000B,\n    0x0000214F, 0x000053F4, 0x00000A2C, 0x000500C5, 0x0000000B, 0x00004145,\n    0x00004D76, 0x0000214F, 0x0008004F, 0x00000018, 0x000022A5, 0x00003B57,\n    0x00003B57, 0x00000000, 0x00000001, 0x00000002, 0x0008000C, 0x00000018,\n    0x00004CDC, 0x00000001, 0x0000002B, 0x000022A5, 0x00000A2D, 0x00000A18,\n    0x00050085, 0x00000018, 0x00001BC6, 0x00004CDC, 0x000001FF, 0x00050081,\n    0x00000018, 0x00001F1F, 0x00001BC6, 0x000003AB, 0x0004006D, 0x00000014,\n    0x00002757, 0x00001F1F, 0x00050051, 0x0000000B, 0x00002207, 0x00002757,\n    0x00000000, 0x00050051, 0x0000000B, 0x00002FE6, 0x00002757, 0x00000001,\n    0x000500C4, 0x0000000B, 0x00002D34, 0x00002FE6, 0x00000A1A, 0x000500C5,\n    0x0000000B, 0x00004D77, 0x00002207, 0x00002D34, 0x00050051, 0x0000000B,\n    0x000053F5, 0x00002757, 0x00000002, 0x000500C4, 0x0000000B, 0x000029FD,\n    0x000053F5, 0x00000A2C, 0x000500C5, 0x0000000B, 0x00004A45, 0x00004D77,\n    0x000029FD, 0x000500C4, 0x0000000B, 0x00005D98, 0x00004A45, 0x00000A3A,\n    0x000500C5, 0x0000000B, 0x0000358B, 0x00004145, 0x00005D98, 0x0008004F,\n    0x00000018, 0x000022A6, 0x00003816, 0x00003816, 0x00000000, 0x00000001,\n    0x00000002, 0x0008000C, 0x00000018, 0x00004CE5, 0x00000001, 0x0000002B,\n    0x000022A6, 0x00000A2D, 0x00000A18, 0x00050085, 0x00000018, 0x00001BC7,\n    0x00004CE5, 0x000001FF, 0x00050081, 0x00000018, 0x00001F20, 0x00001BC7,\n    0x000003AB, 0x0004006D, 0x00000014, 0x00002758, 0x00001F20, 0x00050051,\n    0x0000000B, 0x00002208, 0x00002758, 0x00000000, 0x00050051, 0x0000000B,\n    0x00002FE7, 0x00002758, 0x00000001, 0x000500C4, 0x0000000B, 0x00002D35,\n    0x00002FE7, 0x00000A1A, 0x000500C5, 0x0000000B, 0x00004D78, 0x00002208,\n    0x00002D35, 0x00050051, 0x0000000B, 0x000053F6, 0x00002758, 0x00000002,\n    0x000500C4, 0x0000000B, 0x00002150, 0x000053F6, 0x00000A2C, 0x000500C5,\n    0x0000000B, 0x00004146, 0x00004D78, 0x00002150, 0x0008004F, 0x00000018,\n    0x000022A8, 0x00002BB5, 0x00002BB5, 0x00000000, 0x00000001, 0x00000002,\n    0x0008000C, 0x00000018, 0x00004CE6, 0x00000001, 0x0000002B, 0x000022A8,\n    0x00000A2D, 0x00000A18, 0x00050085, 0x00000018, 0x00001BC8, 0x00004CE6,\n    0x000001FF, 0x00050081, 0x00000018, 0x00001F21, 0x00001BC8, 0x000003AB,\n    0x0004006D, 0x00000014, 0x00002759, 0x00001F21, 0x00050051, 0x0000000B,\n    0x00002209, 0x00002759, 0x00000000, 0x00050051, 0x0000000B, 0x00002FE8,\n    0x00002759, 0x00000001, 0x000500C4, 0x0000000B, 0x00002D36, 0x00002FE8,\n    0x00000A1A, 0x000500C5, 0x0000000B, 0x00004D79, 0x00002209, 0x00002D36,\n    0x00050051, 0x0000000B, 0x000053F7, 0x00002759, 0x00000002, 0x000500C4,\n    0x0000000B, 0x000029FE, 0x000053F7, 0x00000A2C, 0x000500C5, 0x0000000B,\n    0x00004A46, 0x00004D79, 0x000029FE, 0x000500C4, 0x0000000B, 0x00005DAC,\n    0x00004A46, 0x00000A3A, 0x000500C5, 0x0000000B, 0x0000464B, 0x00004146,\n    0x00005DAC, 0x00050050, 0x00000011, 0x000053E0, 0x0000358B, 0x0000464B,\n    0x000200F9, 0x00004992, 0x000200F8, 0x000045F2, 0x0008000C, 0x0000001D,\n    0x000022A9, 0x00000001, 0x0000002B, 0x00003A49, 0x00000B7A, 0x00000505,\n    0x00050085, 0x0000001D, 0x00004580, 0x000022A9, 0x00000809, 0x00050081,\n    0x0000001D, 0x00001F22, 0x00004580, 0x00000145, 0x0004006D, 0x00000017,\n    0x0000275A, 0x00001F22, 0x00050051, 0x0000000B, 0x0000220A, 0x0000275A,\n    0x00000000, 0x00050051, 0x0000000B, 0x00002FE9, 0x0000275A, 0x00000001,\n    0x000500C4, 0x0000000B, 0x00002D37, 0x00002FE9, 0x00000A1A, 0x000500C5,\n    0x0000000B, 0x00004D7A, 0x0000220A, 0x00002D37, 0x00050051, 0x0000000B,\n    0x000053F8, 0x0000275A, 0x00000002, 0x000500C4, 0x0000000B, 0x00002177,\n    0x000053F8, 0x00000A29, 0x000500C5, 0x0000000B, 0x00004D7B, 0x00004D7A,\n    0x00002177, 0x00050051, 0x0000000B, 0x000053F9, 0x0000275A, 0x00000003,\n    0x000500C4, 0x0000000B, 0x00001C7E, 0x000053F9, 0x00000A38, 0x000500C5,\n    0x0000000B, 0x0000237C, 0x00004D7B, 0x00001C7E, 0x0008000C, 0x0000001D,\n    0x00002377, 0x00000001, 0x0000002B, 0x00003B57, 0x00000B7A, 0x00000505,\n    0x00050085, 0x0000001D, 0x000060DE, 0x00002377, 0x00000809, 0x00050081,\n    0x0000001D, 0x00001F23, 0x000060DE, 0x00000145, 0x0004006D, 0x00000017,\n    0x0000275B, 0x00001F23, 0x00050051, 0x0000000B, 0x0000220B, 0x0000275B,\n    0x00000000, 0x00050051, 0x0000000B, 0x00002FEA, 0x0000275B, 0x00000001,\n    0x000500C4, 0x0000000B, 0x00002D38, 0x00002FEA, 0x00000A1A, 0x000500C5,\n    0x0000000B, 0x00004D7C, 0x0000220B, 0x00002D38, 0x00050051, 0x0000000B,\n    0x000053FA, 0x0000275B, 0x00000002, 0x000500C4, 0x0000000B, 0x00002178,\n    0x000053FA, 0x00000A29, 0x000500C5, 0x0000000B, 0x00004D7D, 0x00004D7C,\n    0x00002178, 0x00050051, 0x0000000B, 0x000053FB, 0x0000275B, 0x00000003,\n    0x000500C4, 0x0000000B, 0x000029FF, 0x000053FB, 0x00000A38, 0x000500C5,\n    0x0000000B, 0x00004A47, 0x00004D7D, 0x000029FF, 0x000500C4, 0x0000000B,\n    0x000058CA, 0x00004A47, 0x00000A3A, 0x000500C5, 0x0000000B, 0x00006242,\n    0x0000237C, 0x000058CA, 0x0008000C, 0x0000001D, 0x00002378, 0x00000001,\n    0x0000002B, 0x00003816, 0x00000B7A, 0x00000505, 0x00050085, 0x0000001D,\n    0x000060DF, 0x00002378, 0x00000809, 0x00050081, 0x0000001D, 0x00001F24,\n    0x000060DF, 0x00000145, 0x0004006D, 0x00000017, 0x0000275C, 0x00001F24,\n    0x00050051, 0x0000000B, 0x0000220C, 0x0000275C, 0x00000000, 0x00050051,\n    0x0000000B, 0x00002FEB, 0x0000275C, 0x00000001, 0x000500C4, 0x0000000B,\n    0x00002D39, 0x00002FEB, 0x00000A1A, 0x000500C5, 0x0000000B, 0x00004D7E,\n    0x0000220C, 0x00002D39, 0x00050051, 0x0000000B, 0x000053FC, 0x0000275C,\n    0x00000002, 0x000500C4, 0x0000000B, 0x00002179, 0x000053FC, 0x00000A29,\n    0x000500C5, 0x0000000B, 0x00004D7F, 0x00004D7E, 0x00002179, 0x00050051,\n    0x0000000B, 0x000053FD, 0x0000275C, 0x00000003, 0x000500C4, 0x0000000B,\n    0x00001C7F, 0x000053FD, 0x00000A38, 0x000500C5, 0x0000000B, 0x0000237D,\n    0x00004D7F, 0x00001C7F, 0x0008000C, 0x0000001D, 0x00002379, 0x00000001,\n    0x0000002B, 0x00002BB5, 0x00000B7A, 0x00000505, 0x00050085, 0x0000001D,\n    0x000060E0, 0x00002379, 0x00000809, 0x00050081, 0x0000001D, 0x00001F25,\n    0x000060E0, 0x00000145, 0x0004006D, 0x00000017, 0x0000275D, 0x00001F25,\n    0x00050051, 0x0000000B, 0x0000220D, 0x0000275D, 0x00000000, 0x00050051,\n    0x0000000B, 0x00002FEC, 0x0000275D, 0x00000001, 0x000500C4, 0x0000000B,\n    0x00002D3A, 0x00002FEC, 0x00000A1A, 0x000500C5, 0x0000000B, 0x00004D80,\n    0x0000220D, 0x00002D3A, 0x00050051, 0x0000000B, 0x000053FE, 0x0000275D,\n    0x00000002, 0x000500C4, 0x0000000B, 0x0000217A, 0x000053FE, 0x00000A29,\n    0x000500C5, 0x0000000B, 0x00004D81, 0x00004D80, 0x0000217A, 0x00050051,\n    0x0000000B, 0x000053FF, 0x0000275D, 0x00000003, 0x000500C4, 0x0000000B,\n    0x00002A00, 0x000053FF, 0x00000A38, 0x000500C5, 0x0000000B, 0x00004A48,\n    0x00004D81, 0x00002A00, 0x000500C4, 0x0000000B, 0x00005DAD, 0x00004A48,\n    0x00000A3A, 0x000500C5, 0x0000000B, 0x0000464C, 0x0000237D, 0x00005DAD,\n    0x00050050, 0x00000011, 0x000053E1, 0x00006242, 0x0000464C, 0x000200F9,\n    0x00004992, 0x000200F8, 0x00001CCE, 0x00050051, 0x0000000D, 0x00004D9A,\n    0x00003A49, 0x00000000, 0x00050051, 0x0000000D, 0x000023ED, 0x00003B57,\n    0x00000000, 0x00050050, 0x00000013, 0x00004B20, 0x00004D9A, 0x000023ED,\n    0x0006000C, 0x0000000B, 0x0000217B, 0x00000001, 0x0000003A, 0x00004B20,\n    0x00050051, 0x0000000D, 0x00005BBF, 0x00003816, 0x00000000, 0x00050051,\n    0x0000000D, 0x000039A7, 0x00002BB5, 0x00000000, 0x00050050, 0x00000013,\n    0x00004B0D, 0x00005BBF, 0x000039A7, 0x0006000C, 0x0000000B, 0x00002E96,\n    0x00000001, 0x0000003A, 0x00004B0D, 0x00050050, 0x00000011, 0x0000612F,\n    0x0000217B, 0x00002E96, 0x000200F9, 0x00004992, 0x000200F8, 0x00004992,\n    0x001100F5, 0x00000011, 0x00005E7C, 0x0000612F, 0x00001CCE, 0x000053E1,\n    0x000045F2, 0x000053E0, 0x00001934, 0x000053DF, 0x00001933, 0x000053DE,\n    0x00001CCD, 0x000053DD, 0x00003167, 0x00003D25, 0x00002514, 0x000500AA,\n    0x00000009, 0x000060B1, 0x00001DD8, 0x00000A0A, 0x000300F7, 0x000033DC,\n    0x00000000, 0x000400FA, 0x000060B1, 0x00002CBB, 0x000033DC, 0x000200F8,\n    0x00002CBB, 0x00050051, 0x0000000B, 0x00005E5F, 0x00004AB4, 0x00000000,\n    0x000500AB, 0x00000009, 0x000057C6, 0x00005E5F, 0x00000A0A, 0x000200F9,\n    0x000033DC, 0x000200F8, 0x000033DC, 0x000700F5, 0x00000009, 0x00002ACB,\n    0x000060B1, 0x00004992, 0x000057C6, 0x00002CBB, 0x000300F7, 0x00004CC1,\n    0x00000002, 0x000400FA, 0x00002ACB, 0x00002CF4, 0x00004CC1, 0x000200F8,\n    0x00002CF4, 0x00050051, 0x0000000B, 0x00005C2F, 0x00004AB4, 0x00000000,\n    0x000500AE, 0x00000009, 0x000043C2, 0x00005C2F, 0x00000A10, 0x000300F7,\n    0x00004945, 0x00000000, 0x000400FA, 0x000043C2, 0x00003E05, 0x00004945,\n    0x000200F8, 0x00003E05, 0x000500AE, 0x00000009, 0x00005FD4, 0x00005C2F,\n    0x00000A13, 0x000300F7, 0x00004944, 0x00000000, 0x000400FA, 0x00005FD4,\n    0x00002E70, 0x00004944, 0x000200F8, 0x00002E70, 0x00050051, 0x0000000B,\n    0x00004B1B, 0x00005E7C, 0x00000001, 0x000500C2, 0x0000000B, 0x00003427,\n    0x00004B1B, 0x00000A3A, 0x000500C7, 0x0000000B, 0x00001C34, 0x00004B1B,\n    0x0000068D, 0x000500C5, 0x0000000B, 0x0000452D, 0x00003427, 0x00001C34,\n    0x00060052, 0x00000011, 0x00005B31, 0x0000452D, 0x00005E7C, 0x00000001,\n    0x000200F9, 0x00004944, 0x000200F8, 0x00004944, 0x000700F5, 0x00000011,\n    0x00004CA1, 0x00005E7C, 0x00003E05, 0x00005B31, 0x00002E70, 0x00050051,\n    0x0000000B, 0x000054CF, 0x00004CA1, 0x00000000, 0x000500C7, 0x0000000B,\n    0x00003175, 0x000054CF, 0x000001C2, 0x00050051, 0x0000000B, 0x00005435,\n    0x00004CA1, 0x00000001, 0x000500C4, 0x0000000B, 0x000027D0, 0x00005435,\n    0x00000A3A, 0x000500C5, 0x0000000B, 0x000050A8, 0x00003175, 0x000027D0,\n    0x00060052, 0x00000011, 0x00005E5A, 0x000050A8, 0x00004CA1, 0x00000000,\n    0x000200F9, 0x00004945, 0x000200F8, 0x00004945, 0x000700F5, 0x00000011,\n    0x00004C33, 0x00005E7C, 0x00002CF4, 0x00005E5A, 0x00004944, 0x00050051,\n    0x0000000B, 0x000060F2, 0x00004C33, 0x00000000, 0x000500C2, 0x0000000B,\n    0x00003750, 0x000060F2, 0x00000A3A, 0x000500C7, 0x0000000B, 0x00001C35,\n    0x000060F2, 0x0000068D, 0x000500C5, 0x0000000B, 0x0000452E, 0x00003750,\n    0x00001C35, 0x00060052, 0x00000011, 0x00005B32, 0x0000452E, 0x00004C33,\n    0x00000000, 0x000200F9, 0x00004CC1, 0x000200F8, 0x00004CC1, 0x000700F5,\n    0x00000011, 0x00002C70, 0x00005E7C, 0x000033DC, 0x00005B32, 0x00004945,\n    0x00050080, 0x00000011, 0x00004DDC, 0x00002EF9, 0x000059EC, 0x000500C2,\n    0x00000011, 0x00005E75, 0x00004DDC, 0x0000074B, 0x00050086, 0x00000011,\n    0x00001E20, 0x00005E75, 0x00005C31, 0x00050084, 0x00000011, 0x00004707,\n    0x00005C31, 0x00001E20, 0x00050082, 0x00000011, 0x00004761, 0x00005E75,\n    0x00004707, 0x000500C4, 0x00000011, 0x00002BE0, 0x00001E20, 0x0000074B,\n    0x00050051, 0x0000000B, 0x000033E4, 0x00004761, 0x00000000, 0x00050051,\n    0x0000000B, 0x00002A78, 0x00005C31, 0x00000001, 0x00050084, 0x0000000B,\n    0x00005967, 0x000033E4, 0x00002A78, 0x00050051, 0x0000000B, 0x00001B1F,\n    0x00004761, 0x00000001, 0x00050080, 0x0000000B, 0x000028E5, 0x00005967,\n    0x00001B1F, 0x000500C7, 0x00000011, 0x000049AA, 0x00004DDC, 0x000007BA,\n    0x000500C4, 0x0000000B, 0x00002955, 0x000028E5, 0x00000A1F, 0x00050051,\n    0x0000000B, 0x000051B4, 0x000049AA, 0x00000001, 0x000500C4, 0x0000000B,\n    0x00005C2C, 0x000051B4, 0x00000A19, 0x000500C5, 0x0000000B, 0x00004D82,\n    0x00002955, 0x00005C2C, 0x00050051, 0x0000000B, 0x00005400, 0x000049AA,\n    0x00000000, 0x000500C4, 0x0000000B, 0x00002DDB, 0x00005400, 0x00000A0D,\n    0x000500C5, 0x0000000B, 0x00002BB9, 0x00004D82, 0x00002DDB, 0x000300F7,\n    0x00005341, 0x00000002, 0x000400FA, 0x0000500F, 0x0000294E, 0x0000537D,\n    0x000200F8, 0x0000537D, 0x0004007C, 0x00000012, 0x00002970, 0x00002BE0,\n    0x00050051, 0x0000000C, 0x000045F3, 0x00002970, 0x00000001, 0x000500C3,\n    0x0000000C, 0x00004DC0, 0x000045F3, 0x00000A1A, 0x0004007C, 0x0000000C,\n    0x0000578C, 0x000020FC, 0x00050084, 0x0000000C, 0x00001F02, 0x00004DC0,\n    0x0000578C, 0x00050051, 0x0000000C, 0x00006243, 0x00002970, 0x00000000,\n    0x000500C3, 0x0000000C, 0x00004FC7, 0x00006243, 0x00000A1A, 0x00050080,\n    0x0000000C, 0x000049BB, 0x00001F02, 0x00004FC7, 0x000500C4, 0x0000000C,\n    0x0000254A, 0x000049BB, 0x00000A1D, 0x000500C3, 0x0000000C, 0x0000603B,\n    0x000045F3, 0x00000A0E, 0x000500C7, 0x0000000C, 0x0000539A, 0x0000603B,\n    0x00000A20, 0x000500C4, 0x0000000C, 0x0000534A, 0x0000539A, 0x00000A14,\n    0x000500C7, 0x0000000C, 0x00004EA5, 0x00006243, 0x00000A20, 0x000500C5,\n    0x0000000C, 0x00002B21, 0x0000534A, 0x00004EA5, 0x000500C5, 0x0000000C,\n    0x000043B6, 0x0000254A, 0x00002B21, 0x000500C4, 0x0000000C, 0x00005E63,\n    0x000043B6, 0x00000A0D, 0x000500C3, 0x0000000C, 0x000031DE, 0x000045F3,\n    0x00000A17, 0x000500C7, 0x0000000C, 0x00005447, 0x000031DE, 0x00000A0E,\n    0x000500C3, 0x0000000C, 0x000028A6, 0x00006243, 0x00000A14, 0x000500C7,\n    0x0000000C, 0x0000511E, 0x000028A6, 0x00000A14, 0x000500C3, 0x0000000C,\n    0x000028B9, 0x000045F3, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000505E,\n    0x000028B9, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000541D, 0x0000505E,\n    0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BA, 0x0000511E, 0x0000541D,\n    0x000500C7, 0x0000000C, 0x00005076, 0x000045F3, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x00005228, 0x00005076, 0x00000A17, 0x000500C4, 0x0000000C,\n    0x00001997, 0x000022BA, 0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FE,\n    0x00005228, 0x00001997, 0x000500C4, 0x0000000C, 0x00001C00, 0x00005447,\n    0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C81, 0x000047FE, 0x00001C00,\n    0x000500C7, 0x0000000C, 0x000050AF, 0x00005E63, 0x00000A38, 0x000500C5,\n    0x0000000C, 0x00003C70, 0x00003C81, 0x000050AF, 0x000500C3, 0x0000000C,\n    0x00003745, 0x00005E63, 0x00000A17, 0x000500C7, 0x0000000C, 0x000018B8,\n    0x00003745, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000547E, 0x000018B8,\n    0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A8, 0x00003C70, 0x0000547E,\n    0x000500C3, 0x0000000C, 0x00003A6E, 0x00005E63, 0x00000A1A, 0x000500C7,\n    0x0000000C, 0x000018B9, 0x00003A6E, 0x00000A20, 0x000500C4, 0x0000000C,\n    0x0000547F, 0x000018B9, 0x00000A23, 0x000500C5, 0x0000000C, 0x0000456F,\n    0x000045A8, 0x0000547F, 0x000500C3, 0x0000000C, 0x00003C88, 0x00005E63,\n    0x00000A23, 0x000500C4, 0x0000000C, 0x00002824, 0x00003C88, 0x00000A2F,\n    0x000500C5, 0x0000000C, 0x00003B79, 0x0000456F, 0x00002824, 0x0004007C,\n    0x0000000B, 0x000041E5, 0x00003B79, 0x000200F9, 0x00005341, 0x000200F8,\n    0x0000294E, 0x00050051, 0x0000000B, 0x00004D9B, 0x00002BE0, 0x00000000,\n    0x00050051, 0x0000000B, 0x00002C03, 0x00002BE0, 0x00000001, 0x00060050,\n    0x00000014, 0x000020DE, 0x00004D9B, 0x00002C03, 0x00005F72, 0x0004007C,\n    0x00000016, 0x00004E9D, 0x000020DE, 0x00050051, 0x0000000C, 0x00002BF7,\n    0x00004E9D, 0x00000002, 0x000500C3, 0x0000000C, 0x00004DC1, 0x00002BF7,\n    0x00000A11, 0x0004007C, 0x0000000C, 0x0000578D, 0x00006273, 0x00050084,\n    0x0000000C, 0x00001F03, 0x00004DC1, 0x0000578D, 0x00050051, 0x0000000C,\n    0x00006244, 0x00004E9D, 0x00000001, 0x000500C3, 0x0000000C, 0x00004A6F,\n    0x00006244, 0x00000A17, 0x00050080, 0x0000000C, 0x00002B2D, 0x00001F03,\n    0x00004A6F, 0x0004007C, 0x0000000C, 0x00004202, 0x000020FC, 0x00050084,\n    0x0000000C, 0x00003A60, 0x00002B2D, 0x00004202, 0x00050051, 0x0000000C,\n    0x00006245, 0x00004E9D, 0x00000000, 0x000500C3, 0x0000000C, 0x00004FC8,\n    0x00006245, 0x00000A1A, 0x00050080, 0x0000000C, 0x000049FC, 0x00003A60,\n    0x00004FC8, 0x000500C4, 0x0000000C, 0x0000225D, 0x000049FC, 0x00000A20,\n    0x000500C7, 0x0000000C, 0x00002CAA, 0x00002BF7, 0x00000A14, 0x000500C4,\n    0x0000000C, 0x00004CAE, 0x00002CAA, 0x00000A1A, 0x000500C3, 0x0000000C,\n    0x0000383E, 0x00006244, 0x00000A0E, 0x000500C7, 0x0000000C, 0x00005374,\n    0x0000383E, 0x00000A14, 0x000500C4, 0x0000000C, 0x000054CA, 0x00005374,\n    0x00000A14, 0x000500C5, 0x0000000C, 0x000042CE, 0x00004CAE, 0x000054CA,\n    0x000500C7, 0x0000000C, 0x000050D5, 0x00006245, 0x00000A20, 0x000500C5,\n    0x0000000C, 0x00003ADD, 0x000042CE, 0x000050D5, 0x000500C5, 0x0000000C,\n    0x000043B7, 0x0000225D, 0x00003ADD, 0x000500C4, 0x0000000C, 0x00005E50,\n    0x000043B7, 0x00000A0D, 0x000500C3, 0x0000000C, 0x000032D7, 0x00006244,\n    0x00000A14, 0x000500C6, 0x0000000C, 0x000026C9, 0x000032D7, 0x00004DC1,\n    0x000500C7, 0x0000000C, 0x00004199, 0x000026C9, 0x00000A0E, 0x000500C3,\n    0x0000000C, 0x00002590, 0x00006245, 0x00000A14, 0x000500C7, 0x0000000C,\n    0x0000505F, 0x00002590, 0x00000A14, 0x000500C4, 0x0000000C, 0x0000541E,\n    0x00004199, 0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BB, 0x0000505F,\n    0x0000541E, 0x000500C7, 0x0000000C, 0x00005077, 0x00006244, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x00005229, 0x00005077, 0x00000A17, 0x000500C4,\n    0x0000000C, 0x00001998, 0x000022BB, 0x00000A1D, 0x000500C5, 0x0000000C,\n    0x000047FF, 0x00005229, 0x00001998, 0x000500C4, 0x0000000C, 0x00001C01,\n    0x00004199, 0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C82, 0x000047FF,\n    0x00001C01, 0x000500C7, 0x0000000C, 0x000050B0, 0x00005E50, 0x00000A38,\n    0x000500C5, 0x0000000C, 0x00003C71, 0x00003C82, 0x000050B0, 0x000500C3,\n    0x0000000C, 0x00003746, 0x00005E50, 0x00000A17, 0x000500C7, 0x0000000C,\n    0x000018BA, 0x00003746, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005480,\n    0x000018BA, 0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A9, 0x00003C71,\n    0x00005480, 0x000500C3, 0x0000000C, 0x00003A6F, 0x00005E50, 0x00000A1A,\n    0x000500C7, 0x0000000C, 0x000018BB, 0x00003A6F, 0x00000A20, 0x000500C4,\n    0x0000000C, 0x00005481, 0x000018BB, 0x00000A23, 0x000500C5, 0x0000000C,\n    0x00004570, 0x000045A9, 0x00005481, 0x000500C3, 0x0000000C, 0x00003C89,\n    0x00005E50, 0x00000A23, 0x000500C4, 0x0000000C, 0x00002827, 0x00003C89,\n    0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B7A, 0x00004570, 0x00002827,\n    0x0004007C, 0x0000000B, 0x000041E6, 0x00003B7A, 0x000200F9, 0x00005341,\n    0x000200F8, 0x00005341, 0x000700F5, 0x0000000B, 0x00002522, 0x000041E6,\n    0x0000294E, 0x000041E5, 0x0000537D, 0x00050084, 0x0000000B, 0x000041CB,\n    0x0000229A, 0x00002A78, 0x00050084, 0x0000000B, 0x00002ED9, 0x00002522,\n    0x000041CB, 0x00050080, 0x0000000B, 0x00003E8C, 0x00002ED9, 0x00002BB9,\n    0x000500C2, 0x0000000B, 0x0000573A, 0x00003E8C, 0x00000A14, 0x000500AA,\n    0x00000009, 0x00004B9C, 0x00004ADC, 0x00000A0D, 0x000300F7, 0x00002C98,\n    0x00000000, 0x000400FA, 0x00004B9C, 0x00002957, 0x00002C98, 0x000200F8,\n    0x00002957, 0x000500C7, 0x00000011, 0x0000475F, 0x00002C70, 0x00000916,\n    0x000500C4, 0x00000011, 0x000024D1, 0x0000475F, 0x000007B7, 0x000500C7,\n    0x00000011, 0x000050AC, 0x00002C70, 0x00000B48, 0x000500C2, 0x00000011,\n    0x0000448D, 0x000050AC, 0x000007B7, 0x000500C5, 0x00000011, 0x00003FF9,\n    0x000024D1, 0x0000448D, 0x000200F9, 0x00002C98, 0x000200F8, 0x00002C98,\n    0x000700F5, 0x00000011, 0x00004D37, 0x00002C70, 0x00005341, 0x00003FF9,\n    0x00002957, 0x00060041, 0x0000028E, 0x00001F75, 0x00001592, 0x00000A0B,\n    0x0000573A, 0x0003003E, 0x00001F75, 0x00004D37, 0x000200F9, 0x00004C7A,\n    0x000200F8, 0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/resolve_full_32bpp_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25271\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 8 8 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_resolve_edram_info\"\n               OpMemberName %push_const_block_xe 1 \"xe_resolve_coordinate_info\"\n               OpMemberName %push_const_block_xe 2 \"xe_resolve_dest_info\"\n               OpMemberName %push_const_block_xe 3 \"xe_resolve_dest_coordinate_info\"\n               OpMemberName %push_const_block_xe 4 \"xe_resolve_dest_base\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %xe_resolve_edram_xe_block \"xe_resolve_edram_xe_block\"\n               OpMemberName %xe_resolve_edram_xe_block 0 \"data\"\n               OpName %xe_resolve_edram \"xe_resolve_edram\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_resolve_dest_xe_block \"xe_resolve_dest_xe_block\"\n               OpMemberName %xe_resolve_dest_xe_block 0 \"data\"\n               OpName %xe_resolve_dest \"xe_resolve_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpDecorate %_runtimearr_uint ArrayStride 4\n               OpDecorate %xe_resolve_edram_xe_block BufferBlock\n               OpMemberDecorate %xe_resolve_edram_xe_block 0 NonWritable\n               OpMemberDecorate %xe_resolve_edram_xe_block 0 Offset 0\n               OpDecorate %xe_resolve_edram NonWritable\n               OpDecorate %xe_resolve_edram Binding 0\n               OpDecorate %xe_resolve_edram DescriptorSet 0\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_resolve_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_resolve_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_resolve_dest_xe_block 0 Offset 0\n               OpDecorate %xe_resolve_dest NonReadable\n               OpDecorate %xe_resolve_dest Binding 0\n               OpDecorate %xe_resolve_dest DescriptorSet 1\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n     %v3uint = OpTypeVector %uint 3\n     %v4uint = OpTypeVector %uint 4\n      %float = OpTypeFloat 32\n    %v2float = OpTypeVector %float 2\n    %v3float = OpTypeVector %float 3\n    %v4float = OpTypeVector %float 4\n       %bool = OpTypeBool\n      %v3int = OpTypeVector %int 3\n    %float_0 = OpConstant %float 0\n    %float_1 = OpConstant %float 1\n     %uint_1 = OpConstant %uint 1\n     %uint_2 = OpConstant %uint 2\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n     %uint_3 = OpConstant %uint 3\n    %uint_16 = OpConstant %uint 16\n  %float_255 = OpConstant %float 255\n  %float_0_5 = OpConstant %float 0.5\n     %uint_0 = OpConstant %uint 0\n      %int_8 = OpConstant %int 8\n     %int_16 = OpConstant %int 16\n     %int_24 = OpConstant %int 24\n %float_1023 = OpConstant %float 1023\n    %float_3 = OpConstant %float 3\n        %344 = OpConstantComposite %v4float %float_1023 %float_1023 %float_1023 %float_3\n     %int_10 = OpConstant %int 10\n     %int_20 = OpConstant %int 20\n     %int_30 = OpConstant %int 30\n %float_2047 = OpConstant %float 2047\n       %2275 = OpConstantComposite %v3float %float_2047 %float_2047 %float_1023\n     %int_11 = OpConstant %int 11\n     %int_22 = OpConstant %int 22\n         %14 = OpConstantComposite %v3float %float_1023 %float_2047 %float_2047\n     %int_21 = OpConstant %int 21\n%float_65535 = OpConstant %float 65535\n    %uint_24 = OpConstant %uint 24\n        %653 = OpConstantComposite %v4uint %uint_0 %uint_8 %uint_16 %uint_24\n   %uint_255 = OpConstant %uint 255\n%float_0_00392156886 = OpConstant %float 0.00392156886\n    %uint_10 = OpConstant %uint 10\n    %uint_20 = OpConstant %uint 20\n    %uint_30 = OpConstant %uint 30\n        %845 = OpConstantComposite %v4uint %uint_0 %uint_10 %uint_20 %uint_30\n  %uint_1023 = OpConstant %uint 1023\n        %635 = OpConstantComposite %v4uint %uint_1023 %uint_1023 %uint_1023 %uint_3\n%float_0_000977517106 = OpConstant %float 0.000977517106\n%float_0_333333343 = OpConstant %float 0.333333343\n       %2798 = OpConstantComposite %v4float %float_0_000977517106 %float_0_000977517106 %float_0_000977517106 %float_0_333333343\n       %2996 = OpConstantComposite %v3uint %uint_0 %uint_10 %uint_20\n   %uint_127 = OpConstant %uint 127\n     %uint_7 = OpConstant %uint 7\n     %v3bool = OpTypeVector %bool 3\n   %uint_124 = OpConstant %uint 124\n    %uint_23 = OpConstant %uint 23\n   %float_n1 = OpConstant %float -1\n      %int_0 = OpConstant %int 0\n       %1959 = OpConstantComposite %v2int %int_16 %int_0\n%float_0_000976592302 = OpConstant %float 0.000976592302\n      %v4int = OpTypeVector %int 4\n        %290 = OpConstantComposite %v4int %int_16 %int_0 %int_16 %int_0\n       %1837 = OpConstantComposite %v2uint %uint_2 %uint_1\n     %v2bool = OpTypeVector %bool 2\n       %1807 = OpConstantComposite %v2uint %uint_0 %uint_0\n       %1828 = OpConstantComposite %v2uint %uint_1 %uint_1\n       %1816 = OpConstantComposite %v2uint %uint_1 %uint_0\n    %uint_80 = OpConstant %uint 80\n       %2719 = OpConstantComposite %v2uint %uint_80 %uint_16\n      %int_2 = OpConstant %int 2\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n     %int_12 = OpConstant %int 12\n      %int_3 = OpConstant %int 3\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n    %uint_13 = OpConstant %uint 13\n  %uint_2047 = OpConstant %uint 2047\n    %uint_15 = OpConstant %uint 15\n    %uint_28 = OpConstant %uint 28\n     %uint_4 = OpConstant %uint 4\n       %1855 = OpConstantComposite %v2uint %uint_0 %uint_4\n     %uint_5 = OpConstant %uint 5\n    %uint_63 = OpConstant %uint 63\n     %int_26 = OpConstant %int 26\n     %int_23 = OpConstant %int 23\n%uint_16777216 = OpConstant %uint 16777216\n       %2276 = OpConstantComposite %v2uint %uint_20 %uint_24\n      %false = OpConstantFalse %bool\n%_runtimearr_uint = OpTypeRuntimeArray %uint\n%xe_resolve_edram_xe_block = OpTypeStruct %_runtimearr_uint\n%_ptr_Uniform_xe_resolve_edram_xe_block = OpTypePointer Uniform %xe_resolve_edram_xe_block\n%xe_resolve_edram = OpVariable %_ptr_Uniform_xe_resolve_edram_xe_block Uniform\n%_ptr_Uniform_uint = OpTypePointer Uniform %uint\n   %uint_320 = OpConstant %uint 320\n     %uint_6 = OpConstant %uint 6\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %1825 = OpConstantComposite %v2uint %uint_2 %uint_0\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_resolve_dest_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_resolve_dest_xe_block = OpTypePointer Uniform %xe_resolve_dest_xe_block\n%xe_resolve_dest = OpVariable %_ptr_Uniform_xe_resolve_dest_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_8 %uint_8 %uint_1\n       %1954 = OpConstantComposite %v2uint %uint_15 %uint_1\n       %1870 = OpConstantComposite %v2uint %uint_3 %uint_3\n       %2122 = OpConstantComposite %v2uint %uint_15 %uint_15\n       %1284 = OpConstantComposite %v4float %float_n1 %float_n1 %float_n1 %float_n1\n        %770 = OpConstantComposite %v4int %int_16 %int_16 %int_16 %int_16\n       %1611 = OpConstantComposite %v4uint %uint_255 %uint_255 %uint_255 %uint_255\n        %261 = OpConstantComposite %v3uint %uint_1023 %uint_1023 %uint_1023\n       %1126 = OpConstantComposite %v3uint %uint_127 %uint_127 %uint_127\n       %2828 = OpConstantComposite %v3uint %uint_7 %uint_7 %uint_7\n       %2578 = OpConstantComposite %v3uint %uint_0 %uint_0 %uint_0\n       %1018 = OpConstantComposite %v3uint %uint_124 %uint_124 %uint_124\n        %393 = OpConstantComposite %v3uint %uint_23 %uint_23 %uint_23\n        %141 = OpConstantComposite %v3uint %uint_16 %uint_16 %uint_16\n         %73 = OpConstantComposite %v2float %float_n1 %float_n1\n       %2151 = OpConstantComposite %v2int %int_16 %int_16\n       %2938 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0\n       %1285 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1\n        %325 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_0_5\n       %2605 = OpConstantComposite %v3float %float_0 %float_0 %float_0\n       %2584 = OpConstantComposite %v3float %float_1 %float_1 %float_1\n        %939 = OpConstantComposite %v3float %float_0_5 %float_0_5 %float_0_5\n       %1823 = OpConstantComposite %v2float %float_0 %float_0\n        %768 = OpConstantComposite %v2float %float_1 %float_1\n       %1566 = OpConstantComposite %v2float %float_0_5 %float_0_5\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n%int_1065353216 = OpConstant %int 1065353216\n  %uint_1280 = OpConstant %uint 1280\n%uint_2621440 = OpConstant %uint 2621440\n%uint_4294967290 = OpConstant %uint 4294967290\n       %2360 = OpConstantComposite %v3uint %uint_4294967290 %uint_4294967290 %uint_4294967290\n   %uint_336 = OpConstant %uint 336\n %float_0_25 = OpConstant %float 0.25\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %22245 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %15627 = OpLoad %uint %22245\n      %22700 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %20824 = OpLoad %uint %22700\n      %20561 = OpBitwiseAnd %uint %15627 %uint_1023\n      %19978 = OpShiftRightLogical %uint %15627 %uint_10\n       %8574 = OpBitwiseAnd %uint %19978 %uint_3\n      %21002 = OpShiftRightLogical %uint %15627 %uint_13\n       %8575 = OpBitwiseAnd %uint %21002 %uint_2047\n      %21003 = OpShiftRightLogical %uint %15627 %uint_24\n       %8576 = OpBitwiseAnd %uint %21003 %uint_15\n      %18836 = OpShiftRightLogical %uint %15627 %uint_28\n       %9130 = OpBitwiseAnd %uint %18836 %uint_1\n       %8871 = OpCompositeConstruct %v2uint %20824 %20824\n       %9576 = OpShiftRightLogical %v2uint %8871 %1855\n      %23379 = OpBitwiseAnd %v2uint %9576 %1954\n      %16207 = OpShiftLeftLogical %v2uint %23379 %1870\n      %23019 = OpIMul %v2uint %16207 %1828\n      %12819 = OpShiftRightLogical %uint %20824 %uint_5\n      %16204 = OpBitwiseAnd %uint %12819 %uint_2047\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %24236 = OpLoad %uint %18732\n      %22701 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %20919 = OpLoad %uint %22701\n      %19164 = OpBitwiseAnd %uint %24236 %uint_7\n      %21999 = OpBitwiseAnd %uint %24236 %uint_8\n      %20495 = OpINotEqual %bool %21999 %uint_0\n      %10307 = OpShiftRightLogical %uint %24236 %uint_4\n      %24434 = OpBitwiseAnd %uint %10307 %uint_7\n      %19672 = OpShiftRightLogical %uint %24236 %uint_7\n      %20627 = OpBitwiseAnd %uint %19672 %uint_63\n      %22920 = OpBitcast %int %24236\n      %13711 = OpShiftLeftLogical %int %22920 %int_10\n      %20636 = OpShiftRightArithmetic %int %13711 %int_26\n      %18178 = OpShiftLeftLogical %int %20636 %int_23\n       %7462 = OpIAdd %int %18178 %int_1065353216\n      %11052 = OpBitcast %float %7462\n      %22649 = OpBitwiseAnd %uint %24236 %uint_16777216\n       %7475 = OpINotEqual %bool %22649 %uint_0\n       %8444 = OpBitwiseAnd %uint %20919 %uint_1023\n      %12176 = OpShiftRightLogical %uint %20919 %uint_10\n      %25038 = OpBitwiseAnd %uint %12176 %uint_1023\n      %25203 = OpShiftLeftLogical %uint %25038 %int_1\n      %10422 = OpCompositeConstruct %v2uint %20919 %20919\n      %10385 = OpShiftRightLogical %v2uint %10422 %2276\n      %23380 = OpBitwiseAnd %v2uint %10385 %2122\n      %16208 = OpShiftLeftLogical %v2uint %23380 %1870\n      %23020 = OpIMul %v2uint %16208 %1828\n      %12820 = OpShiftRightLogical %uint %20919 %uint_28\n      %16205 = OpBitwiseAnd %uint %12820 %uint_7\n      %18656 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_4\n      %25270 = OpLoad %uint %18656\n      %14159 = OpLoad %v3uint %gl_GlobalInvocationID\n      %12672 = OpVectorShuffle %v2uint %14159 %14159 0 1\n      %12025 = OpShiftLeftLogical %v2uint %12672 %1825\n       %7640 = OpCompositeExtract %uint %12025 0\n      %11658 = OpShiftLeftLogical %uint %16204 %uint_3\n      %15379 = OpUGreaterThanEqual %bool %7640 %11658\n               OpSelectionMerge %12755 DontFlatten\n               OpBranchConditional %15379 %21992 %12755\n      %21992 = OpLabel\n               OpBranch %19578\n      %12755 = OpLabel\n       %7340 = OpCompositeExtract %uint %12025 1\n       %7992 = OpExtInst %uint %1 UMax %7340 %uint_0\n      %20975 = OpCompositeConstruct %v2uint %7640 %7992\n      %21036 = OpIAdd %v2uint %20975 %23019\n      %16075 = OpULessThanEqual %bool %16205 %uint_3\n               OpSelectionMerge %23776 None\n               OpBranchConditional %16075 %10990 %15087\n      %15087 = OpLabel\n      %13566 = OpIEqual %bool %16205 %uint_5\n       %8438 = OpSelect %uint %13566 %uint_2 %uint_0\n               OpBranch %23776\n      %10990 = OpLabel\n               OpBranch %23776\n      %23776 = OpLabel\n      %19300 = OpPhi %uint %16205 %10990 %8438 %15087\n      %16830 = OpCompositeConstruct %v2uint %8574 %8574\n      %11801 = OpUGreaterThanEqual %v2bool %16830 %1837\n      %19381 = OpSelect %v2uint %11801 %1828 %1807\n      %10986 = OpShiftLeftLogical %v2uint %21036 %19381\n      %24669 = OpCompositeConstruct %v2uint %19300 %19300\n       %9093 = OpShiftRightLogical %v2uint %24669 %1816\n      %15084 = OpBitwiseAnd %v2uint %9093 %1828\n      %10197 = OpIAdd %v2uint %10986 %15084\n       %8548 = OpCompositeConstruct %v2uint %9130 %uint_0\n       %9802 = OpShiftRightLogical %v2uint %2719 %8548\n      %10146 = OpUDiv %v2uint %10197 %9802\n      %20390 = OpCompositeExtract %uint %10146 1\n      %11046 = OpIMul %uint %20390 %20561\n      %24665 = OpCompositeExtract %uint %10146 0\n      %21536 = OpIAdd %uint %11046 %24665\n       %8742 = OpIAdd %uint %8575 %21536\n      %23345 = OpIMul %v2uint %10146 %9802\n      %11892 = OpISub %v2uint %10197 %23345\n       %8053 = OpIMul %uint %8742 %uint_1280\n      %24263 = OpCompositeExtract %uint %11892 1\n      %23526 = OpCompositeExtract %uint %9802 0\n      %22886 = OpIMul %uint %24263 %23526\n       %6886 = OpCompositeExtract %uint %11892 0\n       %9696 = OpIAdd %uint %22886 %6886\n      %18116 = OpShiftLeftLogical %uint %9696 %9130\n      %18619 = OpIAdd %uint %8053 %18116\n      %19545 = OpUMod %uint %18619 %uint_2621440\n      %23531 = OpShiftLeftLogical %uint %19545 %int_2\n      %13906 = OpUGreaterThanEqual %bool %8574 %uint_2\n      %11277 = OpSelect %uint %13906 %uint_1 %uint_0\n      %20074 = OpIAdd %uint %9130 %11277\n       %6555 = OpShiftLeftLogical %uint %uint_4 %20074\n      %23279 = OpINotEqual %bool %9130 %uint_0\n               OpSelectionMerge %21263 DontFlatten\n               OpBranchConditional %23279 %15205 %16569\n      %16569 = OpLabel\n      %19162 = OpIEqual %bool %6555 %uint_4\n               OpSelectionMerge %20297 DontFlatten\n               OpBranchConditional %19162 %6591 %8959\n       %8959 = OpLabel\n      %22064 = OpShiftRightLogical %uint %23531 %int_2\n      %13369 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22064\n      %15060 = OpLoad %uint %13369\n       %8517 = OpIAdd %uint %23531 %6555\n      %21670 = OpShiftRightLogical %uint %8517 %int_2\n      %19677 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21670\n      %13114 = OpLoad %uint %19677\n       %8685 = OpIMul %uint %uint_2 %6555\n      %24254 = OpIAdd %uint %23531 %8685\n      %17890 = OpShiftRightLogical %uint %24254 %int_2\n      %19678 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17890\n      %13115 = OpLoad %uint %19678\n       %8686 = OpIMul %uint %uint_3 %6555\n      %24255 = OpIAdd %uint %23531 %8686\n      %17891 = OpShiftRightLogical %uint %24255 %int_2\n      %18689 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17891\n      %24409 = OpLoad %uint %18689\n      %20780 = OpCompositeConstruct %v4uint %15060 %13114 %13115 %24409\n               OpBranch %20297\n       %6591 = OpLabel\n      %24486 = OpShiftRightLogical %uint %23531 %int_2\n      %13370 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24486\n      %12609 = OpLoad %uint %13370\n      %11687 = OpIAdd %uint %24486 %uint_1\n       %6399 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11687\n      %23650 = OpLoad %uint %6399\n      %11688 = OpIAdd %uint %24486 %uint_2\n       %6400 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11688\n      %23651 = OpLoad %uint %6400\n      %11689 = OpIAdd %uint %24486 %uint_3\n      %24558 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11689\n      %16379 = OpLoad %uint %24558\n      %20781 = OpCompositeConstruct %v4uint %12609 %23650 %23651 %16379\n               OpBranch %20297\n      %20297 = OpLabel\n      %10943 = OpPhi %v4uint %20781 %6591 %20780 %8959\n               OpSelectionMerge %16224 None\n               OpSwitch %8576 %19451 0 %14585 1 %14585 2 %7355 10 %7355 3 %7354 12 %7354 4 %8190 6 %8243\n       %8243 = OpLabel\n      %24406 = OpCompositeExtract %uint %10943 0\n      %24679 = OpExtInst %v2float %1 UnpackHalf2x16 %24406\n      %10082 = OpCompositeExtract %float %24679 0\n      %17478 = OpCompositeExtract %float %24679 1\n      %14604 = OpCompositeConstruct %v4float %10082 %17478 %float_0 %float_0\n      %17274 = OpCompositeExtract %uint %10943 1\n      %18027 = OpExtInst %v2float %1 UnpackHalf2x16 %17274\n      %10083 = OpCompositeExtract %float %18027 0\n      %17479 = OpCompositeExtract %float %18027 1\n      %14605 = OpCompositeConstruct %v4float %10083 %17479 %float_0 %float_0\n      %17275 = OpCompositeExtract %uint %10943 2\n      %18028 = OpExtInst %v2float %1 UnpackHalf2x16 %17275\n      %10084 = OpCompositeExtract %float %18028 0\n      %17480 = OpCompositeExtract %float %18028 1\n      %14606 = OpCompositeConstruct %v4float %10084 %17480 %float_0 %float_0\n      %17276 = OpCompositeExtract %uint %10943 3\n      %18029 = OpExtInst %v2float %1 UnpackHalf2x16 %17276\n      %10085 = OpCompositeExtract %float %18029 0\n      %20670 = OpCompositeExtract %float %18029 1\n       %9033 = OpCompositeConstruct %v4float %10085 %20670 %float_0 %float_0\n               OpBranch %16224\n       %8190 = OpLabel\n      %12427 = OpCompositeExtract %uint %10943 0\n      %22685 = OpBitcast %int %12427\n      %18202 = OpCompositeConstruct %v2int %22685 %22685\n      %18349 = OpShiftLeftLogical %v2int %18202 %1959\n      %13335 = OpShiftRightArithmetic %v2int %18349 %2151\n      %10903 = OpConvertSToF %v2float %13335\n      %18247 = OpVectorTimesScalar %v2float %10903 %float_0_000976592302\n      %24070 = OpExtInst %v2float %1 FMax %73 %18247\n      %24330 = OpCompositeExtract %float %24070 0\n      %15572 = OpCompositeExtract %float %24070 1\n      %16670 = OpCompositeConstruct %v4float %24330 %15572 %float_0 %float_0\n      %19522 = OpCompositeExtract %uint %10943 1\n      %16033 = OpBitcast %int %19522\n      %18203 = OpCompositeConstruct %v2int %16033 %16033\n      %18350 = OpShiftLeftLogical %v2int %18203 %1959\n      %13336 = OpShiftRightArithmetic %v2int %18350 %2151\n      %10904 = OpConvertSToF %v2float %13336\n      %18248 = OpVectorTimesScalar %v2float %10904 %float_0_000976592302\n      %24071 = OpExtInst %v2float %1 FMax %73 %18248\n      %24331 = OpCompositeExtract %float %24071 0\n      %15573 = OpCompositeExtract %float %24071 1\n      %16671 = OpCompositeConstruct %v4float %24331 %15573 %float_0 %float_0\n      %19523 = OpCompositeExtract %uint %10943 2\n      %16034 = OpBitcast %int %19523\n      %18204 = OpCompositeConstruct %v2int %16034 %16034\n      %18351 = OpShiftLeftLogical %v2int %18204 %1959\n      %13337 = OpShiftRightArithmetic %v2int %18351 %2151\n      %10905 = OpConvertSToF %v2float %13337\n      %18249 = OpVectorTimesScalar %v2float %10905 %float_0_000976592302\n      %24072 = OpExtInst %v2float %1 FMax %73 %18249\n      %24332 = OpCompositeExtract %float %24072 0\n      %15574 = OpCompositeExtract %float %24072 1\n      %16672 = OpCompositeConstruct %v4float %24332 %15574 %float_0 %float_0\n      %19524 = OpCompositeExtract %uint %10943 3\n      %16035 = OpBitcast %int %19524\n      %18205 = OpCompositeConstruct %v2int %16035 %16035\n      %18352 = OpShiftLeftLogical %v2int %18205 %1959\n      %13338 = OpShiftRightArithmetic %v2int %18352 %2151\n      %10906 = OpConvertSToF %v2float %13338\n      %18250 = OpVectorTimesScalar %v2float %10906 %float_0_000976592302\n      %24073 = OpExtInst %v2float %1 FMax %73 %18250\n      %24333 = OpCompositeExtract %float %24073 0\n      %18764 = OpCompositeExtract %float %24073 1\n       %9034 = OpCompositeConstruct %v4float %24333 %18764 %float_0 %float_0\n               OpBranch %16224\n       %7354 = OpLabel\n      %22205 = OpCompositeExtract %uint %10943 0\n      %20234 = OpCompositeConstruct %v3uint %22205 %22205 %22205\n      %11021 = OpShiftRightLogical %v3uint %20234 %2996\n      %24038 = OpBitwiseAnd %v3uint %11021 %261\n      %18588 = OpBitwiseAnd %v3uint %11021 %1126\n      %23440 = OpShiftRightLogical %v3uint %24038 %2828\n      %16585 = OpIEqual %v3bool %23440 %2578\n      %11339 = OpExtInst %v3int %1 FindUMsb %18588\n      %10773 = OpBitcast %v3uint %11339\n       %6266 = OpISub %v3uint %2828 %10773\n       %8720 = OpIAdd %v3uint %10773 %2360\n      %10351 = OpSelect %v3uint %16585 %8720 %23440\n      %23252 = OpShiftLeftLogical %v3uint %18588 %6266\n      %18842 = OpBitwiseAnd %v3uint %23252 %1126\n      %10909 = OpSelect %v3uint %16585 %18842 %18588\n      %24569 = OpIAdd %v3uint %10351 %1018\n      %20351 = OpShiftLeftLogical %v3uint %24569 %393\n      %16294 = OpShiftLeftLogical %v3uint %10909 %141\n      %22396 = OpBitwiseOr %v3uint %20351 %16294\n      %13824 = OpIEqual %v3bool %24038 %2578\n      %16962 = OpSelect %v3uint %13824 %2578 %22396\n      %10703 = OpBitcast %v3float %16962\n      %19364 = OpShiftRightLogical %uint %22205 %uint_30\n      %18446 = OpConvertUToF %float %19364\n      %15903 = OpFMul %float %18446 %float_0_333333343\n      %21442 = OpCompositeExtract %float %10703 0\n      %10837 = OpCompositeExtract %float %10703 1\n       %7833 = OpCompositeExtract %float %10703 2\n      %15834 = OpCompositeConstruct %v4float %21442 %10837 %7833 %15903\n      %10229 = OpCompositeExtract %uint %10943 1\n      %13582 = OpCompositeConstruct %v3uint %10229 %10229 %10229\n      %11022 = OpShiftRightLogical %v3uint %13582 %2996\n      %24039 = OpBitwiseAnd %v3uint %11022 %261\n      %18589 = OpBitwiseAnd %v3uint %11022 %1126\n      %23441 = OpShiftRightLogical %v3uint %24039 %2828\n      %16586 = OpIEqual %v3bool %23441 %2578\n      %11340 = OpExtInst %v3int %1 FindUMsb %18589\n      %10774 = OpBitcast %v3uint %11340\n       %6267 = OpISub %v3uint %2828 %10774\n       %8721 = OpIAdd %v3uint %10774 %2360\n      %10352 = OpSelect %v3uint %16586 %8721 %23441\n      %23253 = OpShiftLeftLogical %v3uint %18589 %6267\n      %18843 = OpBitwiseAnd %v3uint %23253 %1126\n      %10910 = OpSelect %v3uint %16586 %18843 %18589\n      %24570 = OpIAdd %v3uint %10352 %1018\n      %20352 = OpShiftLeftLogical %v3uint %24570 %393\n      %16295 = OpShiftLeftLogical %v3uint %10910 %141\n      %22397 = OpBitwiseOr %v3uint %20352 %16295\n      %13825 = OpIEqual %v3bool %24039 %2578\n      %16963 = OpSelect %v3uint %13825 %2578 %22397\n      %10704 = OpBitcast %v3float %16963\n      %19365 = OpShiftRightLogical %uint %10229 %uint_30\n      %18447 = OpConvertUToF %float %19365\n      %15904 = OpFMul %float %18447 %float_0_333333343\n      %21443 = OpCompositeExtract %float %10704 0\n      %10838 = OpCompositeExtract %float %10704 1\n       %7834 = OpCompositeExtract %float %10704 2\n      %15835 = OpCompositeConstruct %v4float %21443 %10838 %7834 %15904\n      %10230 = OpCompositeExtract %uint %10943 2\n      %13583 = OpCompositeConstruct %v3uint %10230 %10230 %10230\n      %11023 = OpShiftRightLogical %v3uint %13583 %2996\n      %24040 = OpBitwiseAnd %v3uint %11023 %261\n      %18590 = OpBitwiseAnd %v3uint %11023 %1126\n      %23442 = OpShiftRightLogical %v3uint %24040 %2828\n      %16587 = OpIEqual %v3bool %23442 %2578\n      %11341 = OpExtInst %v3int %1 FindUMsb %18590\n      %10775 = OpBitcast %v3uint %11341\n       %6268 = OpISub %v3uint %2828 %10775\n       %8722 = OpIAdd %v3uint %10775 %2360\n      %10353 = OpSelect %v3uint %16587 %8722 %23442\n      %23254 = OpShiftLeftLogical %v3uint %18590 %6268\n      %18844 = OpBitwiseAnd %v3uint %23254 %1126\n      %10911 = OpSelect %v3uint %16587 %18844 %18590\n      %24571 = OpIAdd %v3uint %10353 %1018\n      %20353 = OpShiftLeftLogical %v3uint %24571 %393\n      %16296 = OpShiftLeftLogical %v3uint %10911 %141\n      %22398 = OpBitwiseOr %v3uint %20353 %16296\n      %13826 = OpIEqual %v3bool %24040 %2578\n      %16964 = OpSelect %v3uint %13826 %2578 %22398\n      %10705 = OpBitcast %v3float %16964\n      %19366 = OpShiftRightLogical %uint %10230 %uint_30\n      %18448 = OpConvertUToF %float %19366\n      %15905 = OpFMul %float %18448 %float_0_333333343\n      %21444 = OpCompositeExtract %float %10705 0\n      %10839 = OpCompositeExtract %float %10705 1\n       %7835 = OpCompositeExtract %float %10705 2\n      %15836 = OpCompositeConstruct %v4float %21444 %10839 %7835 %15905\n      %10231 = OpCompositeExtract %uint %10943 3\n      %13584 = OpCompositeConstruct %v3uint %10231 %10231 %10231\n      %11024 = OpShiftRightLogical %v3uint %13584 %2996\n      %24041 = OpBitwiseAnd %v3uint %11024 %261\n      %18591 = OpBitwiseAnd %v3uint %11024 %1126\n      %23443 = OpShiftRightLogical %v3uint %24041 %2828\n      %16588 = OpIEqual %v3bool %23443 %2578\n      %11342 = OpExtInst %v3int %1 FindUMsb %18591\n      %10776 = OpBitcast %v3uint %11342\n       %6269 = OpISub %v3uint %2828 %10776\n       %8723 = OpIAdd %v3uint %10776 %2360\n      %10354 = OpSelect %v3uint %16588 %8723 %23443\n      %23255 = OpShiftLeftLogical %v3uint %18591 %6269\n      %18845 = OpBitwiseAnd %v3uint %23255 %1126\n      %10912 = OpSelect %v3uint %16588 %18845 %18591\n      %24572 = OpIAdd %v3uint %10354 %1018\n      %20354 = OpShiftLeftLogical %v3uint %24572 %393\n      %16297 = OpShiftLeftLogical %v3uint %10912 %141\n      %22399 = OpBitwiseOr %v3uint %20354 %16297\n      %13827 = OpIEqual %v3bool %24041 %2578\n      %16965 = OpSelect %v3uint %13827 %2578 %22399\n      %10706 = OpBitcast %v3float %16965\n      %19367 = OpShiftRightLogical %uint %10231 %uint_30\n      %18449 = OpConvertUToF %float %19367\n      %15906 = OpFMul %float %18449 %float_0_333333343\n      %21445 = OpCompositeExtract %float %10706 0\n      %10840 = OpCompositeExtract %float %10706 1\n      %11025 = OpCompositeExtract %float %10706 2\n       %9035 = OpCompositeConstruct %v4float %21445 %10840 %11025 %15906\n               OpBranch %16224\n       %7355 = OpLabel\n      %22206 = OpCompositeExtract %uint %10943 0\n      %20235 = OpCompositeConstruct %v4uint %22206 %22206 %22206 %22206\n       %9368 = OpShiftRightLogical %v4uint %20235 %845\n      %18859 = OpBitwiseAnd %v4uint %9368 %635\n      %15543 = OpConvertUToF %v4float %18859\n      %16688 = OpFMul %v4float %15543 %2798\n      %23762 = OpCompositeExtract %uint %10943 1\n      %20813 = OpCompositeConstruct %v4uint %23762 %23762 %23762 %23762\n       %9369 = OpShiftRightLogical %v4uint %20813 %845\n      %18860 = OpBitwiseAnd %v4uint %9369 %635\n      %15544 = OpConvertUToF %v4float %18860\n      %16689 = OpFMul %v4float %15544 %2798\n      %23763 = OpCompositeExtract %uint %10943 2\n      %20814 = OpCompositeConstruct %v4uint %23763 %23763 %23763 %23763\n       %9370 = OpShiftRightLogical %v4uint %20814 %845\n      %18861 = OpBitwiseAnd %v4uint %9370 %635\n      %15545 = OpConvertUToF %v4float %18861\n      %16690 = OpFMul %v4float %15545 %2798\n      %23764 = OpCompositeExtract %uint %10943 3\n      %20815 = OpCompositeConstruct %v4uint %23764 %23764 %23764 %23764\n       %9371 = OpShiftRightLogical %v4uint %20815 %845\n      %18862 = OpBitwiseAnd %v4uint %9371 %635\n      %18735 = OpConvertUToF %v4float %18862\n       %9887 = OpFMul %v4float %18735 %2798\n               OpBranch %16224\n      %14585 = OpLabel\n      %22207 = OpCompositeExtract %uint %10943 0\n      %20236 = OpCompositeConstruct %v4uint %22207 %22207 %22207 %22207\n       %9372 = OpShiftRightLogical %v4uint %20236 %653\n      %19030 = OpBitwiseAnd %v4uint %9372 %1611\n      %13986 = OpConvertUToF %v4float %19030\n      %19235 = OpVectorTimesScalar %v4float %13986 %float_0_00392156886\n       %8607 = OpCompositeExtract %uint %10943 1\n      %24843 = OpCompositeConstruct %v4uint %8607 %8607 %8607 %8607\n       %9373 = OpShiftRightLogical %v4uint %24843 %653\n      %19031 = OpBitwiseAnd %v4uint %9373 %1611\n      %13987 = OpConvertUToF %v4float %19031\n      %19236 = OpVectorTimesScalar %v4float %13987 %float_0_00392156886\n       %8608 = OpCompositeExtract %uint %10943 2\n      %24844 = OpCompositeConstruct %v4uint %8608 %8608 %8608 %8608\n       %9374 = OpShiftRightLogical %v4uint %24844 %653\n      %19032 = OpBitwiseAnd %v4uint %9374 %1611\n      %13988 = OpConvertUToF %v4float %19032\n      %19237 = OpVectorTimesScalar %v4float %13988 %float_0_00392156886\n       %8609 = OpCompositeExtract %uint %10943 3\n      %24845 = OpCompositeConstruct %v4uint %8609 %8609 %8609 %8609\n       %9375 = OpShiftRightLogical %v4uint %24845 %653\n      %19033 = OpBitwiseAnd %v4uint %9375 %1611\n      %17178 = OpConvertUToF %v4float %19033\n      %12434 = OpVectorTimesScalar %v4float %17178 %float_0_00392156886\n               OpBranch %16224\n      %19451 = OpLabel\n      %12428 = OpCompositeExtract %uint %10943 0\n      %20462 = OpBitcast %float %12428\n      %17206 = OpCompositeConstruct %v2float %20462 %float_0\n      %11664 = OpVectorShuffle %v4float %17206 %17206 0 1 1 1\n      %22193 = OpCompositeExtract %uint %10943 1\n      %16232 = OpBitcast %float %22193\n      %17207 = OpCompositeConstruct %v2float %16232 %float_0\n      %11665 = OpVectorShuffle %v4float %17207 %17207 0 1 1 1\n      %22194 = OpCompositeExtract %uint %10943 2\n      %16233 = OpBitcast %float %22194\n      %17208 = OpCompositeConstruct %v2float %16233 %float_0\n      %11666 = OpVectorShuffle %v4float %17208 %17208 0 1 1 1\n      %22195 = OpCompositeExtract %uint %10943 3\n      %16234 = OpBitcast %float %22195\n      %20398 = OpCompositeConstruct %v2float %16234 %float_0\n      %23098 = OpVectorShuffle %v4float %20398 %20398 0 1 1 1\n               OpBranch %16224\n      %16224 = OpLabel\n      %11175 = OpPhi %v4float %23098 %19451 %12434 %14585 %9887 %7355 %9035 %7354 %9034 %8190 %9033 %8243\n      %14344 = OpPhi %v4float %11666 %19451 %19237 %14585 %16690 %7355 %15836 %7354 %16672 %8190 %14606 %8243\n      %15229 = OpPhi %v4float %11665 %19451 %19236 %14585 %16689 %7355 %15835 %7354 %16671 %8190 %14605 %8243\n      %14518 = OpPhi %v4float %11664 %19451 %19235 %14585 %16688 %7355 %15834 %7354 %16670 %8190 %14604 %8243\n               OpBranch %21263\n      %15205 = OpLabel\n      %21584 = OpIEqual %bool %6555 %uint_8\n               OpSelectionMerge %20259 DontFlatten\n               OpBranchConditional %21584 %6592 %8960\n       %8960 = OpLabel\n      %22065 = OpShiftRightLogical %uint %23531 %int_2\n      %13371 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22065\n      %12610 = OpLoad %uint %13371\n      %11690 = OpIAdd %uint %22065 %uint_1\n       %6401 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11690\n       %7030 = OpLoad %uint %6401\n       %8518 = OpIAdd %uint %23531 %6555\n      %21671 = OpShiftRightLogical %uint %8518 %int_2\n      %19601 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21671\n      %12611 = OpLoad %uint %19601\n      %11691 = OpIAdd %uint %21671 %uint_1\n      %24559 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11691\n      %14156 = OpLoad %uint %24559\n      %19670 = OpCompositeConstruct %v4uint %12610 %7030 %12611 %14156\n      %19499 = OpIMul %uint %uint_2 %6555\n      %10821 = OpIAdd %uint %23531 %19499\n      %17892 = OpShiftRightLogical %uint %10821 %int_2\n      %19602 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17892\n      %12612 = OpLoad %uint %19602\n      %11692 = OpIAdd %uint %17892 %uint_1\n       %6475 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11692\n      %24155 = OpLoad %uint %6475\n       %8687 = OpIMul %uint %uint_3 %6555\n      %24256 = OpIAdd %uint %23531 %8687\n      %17893 = OpShiftRightLogical %uint %24256 %int_2\n      %19603 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17893\n      %12613 = OpLoad %uint %19603\n      %11693 = OpIAdd %uint %17893 %uint_1\n      %24560 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11693\n      %16380 = OpLoad %uint %24560\n      %20782 = OpCompositeConstruct %v4uint %12612 %24155 %12613 %16380\n               OpBranch %20259\n       %6592 = OpLabel\n      %24487 = OpShiftRightLogical %uint %23531 %int_2\n      %13372 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24487\n      %12614 = OpLoad %uint %13372\n      %11694 = OpIAdd %uint %24487 %uint_1\n       %6402 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11694\n      %23652 = OpLoad %uint %6402\n      %11695 = OpIAdd %uint %24487 %uint_2\n       %6403 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11695\n      %23653 = OpLoad %uint %6403\n      %11696 = OpIAdd %uint %24487 %uint_3\n      %24561 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11696\n      %14080 = OpLoad %uint %24561\n      %21616 = OpCompositeConstruct %v4uint %12614 %23652 %23653 %14080\n      %19331 = OpIAdd %uint %23531 %uint_16\n       %8237 = OpShiftRightLogical %uint %19331 %int_2\n      %19604 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %8237\n      %12615 = OpLoad %uint %19604\n      %11697 = OpIAdd %uint %8237 %uint_1\n       %6404 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11697\n      %23654 = OpLoad %uint %6404\n      %11698 = OpIAdd %uint %8237 %uint_2\n       %6405 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11698\n      %23655 = OpLoad %uint %6405\n      %11699 = OpIAdd %uint %8237 %uint_3\n      %24562 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11699\n      %16381 = OpLoad %uint %24562\n      %20783 = OpCompositeConstruct %v4uint %12615 %23654 %23655 %16381\n               OpBranch %20259\n      %20259 = OpLabel\n      %11213 = OpPhi %v4uint %20783 %6592 %20782 %8960\n      %14112 = OpPhi %v4uint %21616 %6592 %19670 %8960\n               OpSelectionMerge %20260 None\n               OpSwitch %8576 %20310 5 %8536 7 %8244\n       %8244 = OpLabel\n      %24407 = OpCompositeExtract %uint %14112 0\n      %24680 = OpExtInst %v2float %1 UnpackHalf2x16 %24407\n      %10101 = OpCompositeExtract %float %24680 0\n      %16056 = OpCompositeExtract %float %24680 1\n      %17025 = OpCompositeExtract %uint %14112 1\n      %15605 = OpExtInst %v2float %1 UnpackHalf2x16 %17025\n      %10086 = OpCompositeExtract %float %15605 0\n      %17481 = OpCompositeExtract %float %15605 1\n      %14607 = OpCompositeConstruct %v4float %10101 %16056 %10086 %17481\n      %17277 = OpCompositeExtract %uint %14112 2\n      %18030 = OpExtInst %v2float %1 UnpackHalf2x16 %17277\n      %10102 = OpCompositeExtract %float %18030 0\n      %16057 = OpCompositeExtract %float %18030 1\n      %17026 = OpCompositeExtract %uint %14112 3\n      %15606 = OpExtInst %v2float %1 UnpackHalf2x16 %17026\n      %10087 = OpCompositeExtract %float %15606 0\n      %17482 = OpCompositeExtract %float %15606 1\n      %14608 = OpCompositeConstruct %v4float %10102 %16057 %10087 %17482\n      %17278 = OpCompositeExtract %uint %11213 0\n      %18031 = OpExtInst %v2float %1 UnpackHalf2x16 %17278\n      %10103 = OpCompositeExtract %float %18031 0\n      %16058 = OpCompositeExtract %float %18031 1\n      %17027 = OpCompositeExtract %uint %11213 1\n      %15607 = OpExtInst %v2float %1 UnpackHalf2x16 %17027\n      %10088 = OpCompositeExtract %float %15607 0\n      %17483 = OpCompositeExtract %float %15607 1\n      %14609 = OpCompositeConstruct %v4float %10103 %16058 %10088 %17483\n      %17279 = OpCompositeExtract %uint %11213 2\n      %18032 = OpExtInst %v2float %1 UnpackHalf2x16 %17279\n      %10104 = OpCompositeExtract %float %18032 0\n      %16059 = OpCompositeExtract %float %18032 1\n      %17028 = OpCompositeExtract %uint %11213 3\n      %15608 = OpExtInst %v2float %1 UnpackHalf2x16 %17028\n      %10089 = OpCompositeExtract %float %15608 0\n      %20671 = OpCompositeExtract %float %15608 1\n       %9036 = OpCompositeConstruct %v4float %10104 %16059 %10089 %20671\n               OpBranch %20260\n       %8536 = OpLabel\n       %9723 = OpVectorShuffle %v2uint %14112 %14112 0 1\n      %23356 = OpBitcast %v2int %9723\n      %24782 = OpVectorShuffle %v4int %23356 %23356 0 0 1 1\n      %18598 = OpShiftLeftLogical %v4int %24782 %290\n      %15757 = OpShiftRightArithmetic %v4int %18598 %770\n      %10907 = OpConvertSToF %v4float %15757\n      %18209 = OpVectorTimesScalar %v4float %10907 %float_0_000976592302\n      %25233 = OpExtInst %v4float %1 FMax %1284 %18209\n      %14187 = OpVectorShuffle %v2uint %14112 %14112 2 3\n       %9407 = OpBitcast %v2int %14187\n      %24783 = OpVectorShuffle %v4int %9407 %9407 0 0 1 1\n      %18599 = OpShiftLeftLogical %v4int %24783 %290\n      %15758 = OpShiftRightArithmetic %v4int %18599 %770\n      %10908 = OpConvertSToF %v4float %15758\n      %18210 = OpVectorTimesScalar %v4float %10908 %float_0_000976592302\n      %25234 = OpExtInst %v4float %1 FMax %1284 %18210\n      %14188 = OpVectorShuffle %v2uint %11213 %11213 0 1\n       %9408 = OpBitcast %v2int %14188\n      %24784 = OpVectorShuffle %v4int %9408 %9408 0 0 1 1\n      %18600 = OpShiftLeftLogical %v4int %24784 %290\n      %15759 = OpShiftRightArithmetic %v4int %18600 %770\n      %10913 = OpConvertSToF %v4float %15759\n      %18211 = OpVectorTimesScalar %v4float %10913 %float_0_000976592302\n      %25235 = OpExtInst %v4float %1 FMax %1284 %18211\n      %14189 = OpVectorShuffle %v2uint %11213 %11213 2 3\n       %9409 = OpBitcast %v2int %14189\n      %24785 = OpVectorShuffle %v4int %9409 %9409 0 0 1 1\n      %18601 = OpShiftLeftLogical %v4int %24785 %290\n      %15760 = OpShiftRightArithmetic %v4int %18601 %770\n      %10914 = OpConvertSToF %v4float %15760\n      %21439 = OpVectorTimesScalar %v4float %10914 %float_0_000976592302\n      %17250 = OpExtInst %v4float %1 FMax %1284 %21439\n               OpBranch %20260\n      %20310 = OpLabel\n       %9761 = OpVectorShuffle %v2uint %14112 %14112 0 1\n      %20825 = OpBitcast %v2float %9761\n       %7035 = OpCompositeExtract %float %20825 0\n      %13418 = OpCompositeExtract %float %20825 1\n      %17016 = OpCompositeConstruct %v4float %7035 %13418 %float_0 %float_0\n      %16856 = OpVectorShuffle %v2uint %14112 %14112 2 3\n      %14173 = OpBitcast %v2float %16856\n       %7036 = OpCompositeExtract %float %14173 0\n      %13419 = OpCompositeExtract %float %14173 1\n      %17017 = OpCompositeConstruct %v4float %7036 %13419 %float_0 %float_0\n      %16857 = OpVectorShuffle %v2uint %11213 %11213 0 1\n      %14174 = OpBitcast %v2float %16857\n       %7037 = OpCompositeExtract %float %14174 0\n      %13420 = OpCompositeExtract %float %14174 1\n      %17018 = OpCompositeConstruct %v4float %7037 %13420 %float_0 %float_0\n      %16858 = OpVectorShuffle %v2uint %11213 %11213 2 3\n      %14175 = OpBitcast %v2float %16858\n       %7038 = OpCompositeExtract %float %14175 0\n      %16648 = OpCompositeExtract %float %14175 1\n       %9037 = OpCompositeConstruct %v4float %7038 %16648 %float_0 %float_0\n               OpBranch %20260\n      %20260 = OpLabel\n      %11176 = OpPhi %v4float %9037 %20310 %17250 %8536 %9036 %8244\n      %14345 = OpPhi %v4float %17018 %20310 %25235 %8536 %14609 %8244\n      %15230 = OpPhi %v4float %17017 %20310 %25234 %8536 %14608 %8244\n      %14519 = OpPhi %v4float %17016 %20310 %25233 %8536 %14607 %8244\n               OpBranch %21263\n      %21263 = OpLabel\n      %11177 = OpPhi %v4float %11176 %20260 %11175 %16224\n      %14346 = OpPhi %v4float %14345 %20260 %14344 %16224\n      %13804 = OpPhi %v4float %15230 %20260 %15229 %16224\n       %8403 = OpPhi %v4float %14519 %20260 %14518 %16224\n      %11861 = OpUGreaterThanEqual %bool %16205 %uint_4\n               OpSelectionMerge %21267 DontFlatten\n               OpBranchConditional %11861 %20709 %21267\n      %20709 = OpLabel\n      %25083 = OpFMul %float %11052 %float_0_5\n      %24184 = OpIAdd %uint %23531 %uint_320\n               OpSelectionMerge %21264 DontFlatten\n               OpBranchConditional %23279 %15206 %16570\n      %16570 = OpLabel\n      %19163 = OpIEqual %bool %6555 %uint_4\n               OpSelectionMerge %20298 DontFlatten\n               OpBranchConditional %19163 %6593 %8961\n       %8961 = OpLabel\n      %22066 = OpShiftRightLogical %uint %24184 %int_2\n      %13373 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22066\n      %15061 = OpLoad %uint %13373\n       %8519 = OpIAdd %uint %24184 %6555\n      %21672 = OpShiftRightLogical %uint %8519 %int_2\n      %19679 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21672\n      %13116 = OpLoad %uint %19679\n       %8688 = OpIMul %uint %uint_2 %6555\n      %24257 = OpIAdd %uint %24184 %8688\n      %17894 = OpShiftRightLogical %uint %24257 %int_2\n      %19680 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17894\n      %13117 = OpLoad %uint %19680\n       %8689 = OpIMul %uint %uint_3 %6555\n      %24258 = OpIAdd %uint %24184 %8689\n      %17895 = OpShiftRightLogical %uint %24258 %int_2\n      %18690 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17895\n      %24410 = OpLoad %uint %18690\n      %20784 = OpCompositeConstruct %v4uint %15061 %13116 %13117 %24410\n               OpBranch %20298\n       %6593 = OpLabel\n      %24488 = OpShiftRightLogical %uint %24184 %int_2\n      %13374 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24488\n      %12616 = OpLoad %uint %13374\n      %11700 = OpIAdd %uint %24488 %uint_1\n       %6406 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11700\n      %23656 = OpLoad %uint %6406\n      %11701 = OpIAdd %uint %24488 %uint_2\n       %6407 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11701\n      %23657 = OpLoad %uint %6407\n      %11702 = OpIAdd %uint %24488 %uint_3\n      %24563 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11702\n      %16382 = OpLoad %uint %24563\n      %20785 = OpCompositeConstruct %v4uint %12616 %23656 %23657 %16382\n               OpBranch %20298\n      %20298 = OpLabel\n      %10944 = OpPhi %v4uint %20785 %6593 %20784 %8961\n               OpSelectionMerge %16225 None\n               OpSwitch %8576 %19452 0 %14586 1 %14586 2 %7357 10 %7357 3 %7356 12 %7356 4 %8191 6 %8245\n       %8245 = OpLabel\n      %24408 = OpCompositeExtract %uint %10944 0\n      %24681 = OpExtInst %v2float %1 UnpackHalf2x16 %24408\n      %10090 = OpCompositeExtract %float %24681 0\n      %17484 = OpCompositeExtract %float %24681 1\n      %14610 = OpCompositeConstruct %v4float %10090 %17484 %float_0 %float_0\n      %17280 = OpCompositeExtract %uint %10944 1\n      %18033 = OpExtInst %v2float %1 UnpackHalf2x16 %17280\n      %10091 = OpCompositeExtract %float %18033 0\n      %17485 = OpCompositeExtract %float %18033 1\n      %14611 = OpCompositeConstruct %v4float %10091 %17485 %float_0 %float_0\n      %17281 = OpCompositeExtract %uint %10944 2\n      %18034 = OpExtInst %v2float %1 UnpackHalf2x16 %17281\n      %10092 = OpCompositeExtract %float %18034 0\n      %17486 = OpCompositeExtract %float %18034 1\n      %14612 = OpCompositeConstruct %v4float %10092 %17486 %float_0 %float_0\n      %17282 = OpCompositeExtract %uint %10944 3\n      %18035 = OpExtInst %v2float %1 UnpackHalf2x16 %17282\n      %10093 = OpCompositeExtract %float %18035 0\n      %20672 = OpCompositeExtract %float %18035 1\n       %9038 = OpCompositeConstruct %v4float %10093 %20672 %float_0 %float_0\n               OpBranch %16225\n       %8191 = OpLabel\n      %12429 = OpCompositeExtract %uint %10944 0\n      %22686 = OpBitcast %int %12429\n      %18206 = OpCompositeConstruct %v2int %22686 %22686\n      %18353 = OpShiftLeftLogical %v2int %18206 %1959\n      %13339 = OpShiftRightArithmetic %v2int %18353 %2151\n      %10915 = OpConvertSToF %v2float %13339\n      %18251 = OpVectorTimesScalar %v2float %10915 %float_0_000976592302\n      %24074 = OpExtInst %v2float %1 FMax %73 %18251\n      %24334 = OpCompositeExtract %float %24074 0\n      %15575 = OpCompositeExtract %float %24074 1\n      %16673 = OpCompositeConstruct %v4float %24334 %15575 %float_0 %float_0\n      %19525 = OpCompositeExtract %uint %10944 1\n      %16036 = OpBitcast %int %19525\n      %18207 = OpCompositeConstruct %v2int %16036 %16036\n      %18354 = OpShiftLeftLogical %v2int %18207 %1959\n      %13340 = OpShiftRightArithmetic %v2int %18354 %2151\n      %10916 = OpConvertSToF %v2float %13340\n      %18252 = OpVectorTimesScalar %v2float %10916 %float_0_000976592302\n      %24075 = OpExtInst %v2float %1 FMax %73 %18252\n      %24335 = OpCompositeExtract %float %24075 0\n      %15576 = OpCompositeExtract %float %24075 1\n      %16674 = OpCompositeConstruct %v4float %24335 %15576 %float_0 %float_0\n      %19526 = OpCompositeExtract %uint %10944 2\n      %16037 = OpBitcast %int %19526\n      %18208 = OpCompositeConstruct %v2int %16037 %16037\n      %18355 = OpShiftLeftLogical %v2int %18208 %1959\n      %13341 = OpShiftRightArithmetic %v2int %18355 %2151\n      %10917 = OpConvertSToF %v2float %13341\n      %18253 = OpVectorTimesScalar %v2float %10917 %float_0_000976592302\n      %24076 = OpExtInst %v2float %1 FMax %73 %18253\n      %24336 = OpCompositeExtract %float %24076 0\n      %15577 = OpCompositeExtract %float %24076 1\n      %16675 = OpCompositeConstruct %v4float %24336 %15577 %float_0 %float_0\n      %19527 = OpCompositeExtract %uint %10944 3\n      %16038 = OpBitcast %int %19527\n      %18212 = OpCompositeConstruct %v2int %16038 %16038\n      %18356 = OpShiftLeftLogical %v2int %18212 %1959\n      %13342 = OpShiftRightArithmetic %v2int %18356 %2151\n      %10918 = OpConvertSToF %v2float %13342\n      %18254 = OpVectorTimesScalar %v2float %10918 %float_0_000976592302\n      %24077 = OpExtInst %v2float %1 FMax %73 %18254\n      %24337 = OpCompositeExtract %float %24077 0\n      %18765 = OpCompositeExtract %float %24077 1\n       %9039 = OpCompositeConstruct %v4float %24337 %18765 %float_0 %float_0\n               OpBranch %16225\n       %7356 = OpLabel\n      %22208 = OpCompositeExtract %uint %10944 0\n      %20237 = OpCompositeConstruct %v3uint %22208 %22208 %22208\n      %11026 = OpShiftRightLogical %v3uint %20237 %2996\n      %24042 = OpBitwiseAnd %v3uint %11026 %261\n      %18592 = OpBitwiseAnd %v3uint %11026 %1126\n      %23444 = OpShiftRightLogical %v3uint %24042 %2828\n      %16589 = OpIEqual %v3bool %23444 %2578\n      %11343 = OpExtInst %v3int %1 FindUMsb %18592\n      %10777 = OpBitcast %v3uint %11343\n       %6270 = OpISub %v3uint %2828 %10777\n       %8724 = OpIAdd %v3uint %10777 %2360\n      %10355 = OpSelect %v3uint %16589 %8724 %23444\n      %23256 = OpShiftLeftLogical %v3uint %18592 %6270\n      %18846 = OpBitwiseAnd %v3uint %23256 %1126\n      %10919 = OpSelect %v3uint %16589 %18846 %18592\n      %24573 = OpIAdd %v3uint %10355 %1018\n      %20355 = OpShiftLeftLogical %v3uint %24573 %393\n      %16298 = OpShiftLeftLogical %v3uint %10919 %141\n      %22400 = OpBitwiseOr %v3uint %20355 %16298\n      %13828 = OpIEqual %v3bool %24042 %2578\n      %16966 = OpSelect %v3uint %13828 %2578 %22400\n      %10707 = OpBitcast %v3float %16966\n      %19368 = OpShiftRightLogical %uint %22208 %uint_30\n      %18450 = OpConvertUToF %float %19368\n      %15907 = OpFMul %float %18450 %float_0_333333343\n      %21446 = OpCompositeExtract %float %10707 0\n      %10841 = OpCompositeExtract %float %10707 1\n       %7836 = OpCompositeExtract %float %10707 2\n      %15837 = OpCompositeConstruct %v4float %21446 %10841 %7836 %15907\n      %10232 = OpCompositeExtract %uint %10944 1\n      %13585 = OpCompositeConstruct %v3uint %10232 %10232 %10232\n      %11027 = OpShiftRightLogical %v3uint %13585 %2996\n      %24043 = OpBitwiseAnd %v3uint %11027 %261\n      %18593 = OpBitwiseAnd %v3uint %11027 %1126\n      %23445 = OpShiftRightLogical %v3uint %24043 %2828\n      %16590 = OpIEqual %v3bool %23445 %2578\n      %11344 = OpExtInst %v3int %1 FindUMsb %18593\n      %10778 = OpBitcast %v3uint %11344\n       %6271 = OpISub %v3uint %2828 %10778\n       %8725 = OpIAdd %v3uint %10778 %2360\n      %10356 = OpSelect %v3uint %16590 %8725 %23445\n      %23257 = OpShiftLeftLogical %v3uint %18593 %6271\n      %18847 = OpBitwiseAnd %v3uint %23257 %1126\n      %10920 = OpSelect %v3uint %16590 %18847 %18593\n      %24574 = OpIAdd %v3uint %10356 %1018\n      %20356 = OpShiftLeftLogical %v3uint %24574 %393\n      %16299 = OpShiftLeftLogical %v3uint %10920 %141\n      %22401 = OpBitwiseOr %v3uint %20356 %16299\n      %13829 = OpIEqual %v3bool %24043 %2578\n      %16967 = OpSelect %v3uint %13829 %2578 %22401\n      %10708 = OpBitcast %v3float %16967\n      %19369 = OpShiftRightLogical %uint %10232 %uint_30\n      %18451 = OpConvertUToF %float %19369\n      %15908 = OpFMul %float %18451 %float_0_333333343\n      %21447 = OpCompositeExtract %float %10708 0\n      %10842 = OpCompositeExtract %float %10708 1\n       %7837 = OpCompositeExtract %float %10708 2\n      %15838 = OpCompositeConstruct %v4float %21447 %10842 %7837 %15908\n      %10233 = OpCompositeExtract %uint %10944 2\n      %13586 = OpCompositeConstruct %v3uint %10233 %10233 %10233\n      %11028 = OpShiftRightLogical %v3uint %13586 %2996\n      %24044 = OpBitwiseAnd %v3uint %11028 %261\n      %18594 = OpBitwiseAnd %v3uint %11028 %1126\n      %23446 = OpShiftRightLogical %v3uint %24044 %2828\n      %16591 = OpIEqual %v3bool %23446 %2578\n      %11345 = OpExtInst %v3int %1 FindUMsb %18594\n      %10779 = OpBitcast %v3uint %11345\n       %6272 = OpISub %v3uint %2828 %10779\n       %8726 = OpIAdd %v3uint %10779 %2360\n      %10357 = OpSelect %v3uint %16591 %8726 %23446\n      %23258 = OpShiftLeftLogical %v3uint %18594 %6272\n      %18848 = OpBitwiseAnd %v3uint %23258 %1126\n      %10921 = OpSelect %v3uint %16591 %18848 %18594\n      %24575 = OpIAdd %v3uint %10357 %1018\n      %20357 = OpShiftLeftLogical %v3uint %24575 %393\n      %16300 = OpShiftLeftLogical %v3uint %10921 %141\n      %22402 = OpBitwiseOr %v3uint %20357 %16300\n      %13830 = OpIEqual %v3bool %24044 %2578\n      %16968 = OpSelect %v3uint %13830 %2578 %22402\n      %10709 = OpBitcast %v3float %16968\n      %19370 = OpShiftRightLogical %uint %10233 %uint_30\n      %18452 = OpConvertUToF %float %19370\n      %15909 = OpFMul %float %18452 %float_0_333333343\n      %21448 = OpCompositeExtract %float %10709 0\n      %10843 = OpCompositeExtract %float %10709 1\n       %7838 = OpCompositeExtract %float %10709 2\n      %15839 = OpCompositeConstruct %v4float %21448 %10843 %7838 %15909\n      %10234 = OpCompositeExtract %uint %10944 3\n      %13587 = OpCompositeConstruct %v3uint %10234 %10234 %10234\n      %11029 = OpShiftRightLogical %v3uint %13587 %2996\n      %24045 = OpBitwiseAnd %v3uint %11029 %261\n      %18595 = OpBitwiseAnd %v3uint %11029 %1126\n      %23447 = OpShiftRightLogical %v3uint %24045 %2828\n      %16592 = OpIEqual %v3bool %23447 %2578\n      %11346 = OpExtInst %v3int %1 FindUMsb %18595\n      %10780 = OpBitcast %v3uint %11346\n       %6273 = OpISub %v3uint %2828 %10780\n       %8727 = OpIAdd %v3uint %10780 %2360\n      %10358 = OpSelect %v3uint %16592 %8727 %23447\n      %23259 = OpShiftLeftLogical %v3uint %18595 %6273\n      %18849 = OpBitwiseAnd %v3uint %23259 %1126\n      %10922 = OpSelect %v3uint %16592 %18849 %18595\n      %24576 = OpIAdd %v3uint %10358 %1018\n      %20358 = OpShiftLeftLogical %v3uint %24576 %393\n      %16301 = OpShiftLeftLogical %v3uint %10922 %141\n      %22403 = OpBitwiseOr %v3uint %20358 %16301\n      %13831 = OpIEqual %v3bool %24045 %2578\n      %16969 = OpSelect %v3uint %13831 %2578 %22403\n      %10710 = OpBitcast %v3float %16969\n      %19371 = OpShiftRightLogical %uint %10234 %uint_30\n      %18453 = OpConvertUToF %float %19371\n      %15910 = OpFMul %float %18453 %float_0_333333343\n      %21449 = OpCompositeExtract %float %10710 0\n      %10844 = OpCompositeExtract %float %10710 1\n      %11030 = OpCompositeExtract %float %10710 2\n       %9040 = OpCompositeConstruct %v4float %21449 %10844 %11030 %15910\n               OpBranch %16225\n       %7357 = OpLabel\n      %22209 = OpCompositeExtract %uint %10944 0\n      %20238 = OpCompositeConstruct %v4uint %22209 %22209 %22209 %22209\n       %9376 = OpShiftRightLogical %v4uint %20238 %845\n      %18863 = OpBitwiseAnd %v4uint %9376 %635\n      %15546 = OpConvertUToF %v4float %18863\n      %16691 = OpFMul %v4float %15546 %2798\n      %23765 = OpCompositeExtract %uint %10944 1\n      %20816 = OpCompositeConstruct %v4uint %23765 %23765 %23765 %23765\n       %9377 = OpShiftRightLogical %v4uint %20816 %845\n      %18864 = OpBitwiseAnd %v4uint %9377 %635\n      %15547 = OpConvertUToF %v4float %18864\n      %16692 = OpFMul %v4float %15547 %2798\n      %23766 = OpCompositeExtract %uint %10944 2\n      %20817 = OpCompositeConstruct %v4uint %23766 %23766 %23766 %23766\n       %9378 = OpShiftRightLogical %v4uint %20817 %845\n      %18865 = OpBitwiseAnd %v4uint %9378 %635\n      %15548 = OpConvertUToF %v4float %18865\n      %16693 = OpFMul %v4float %15548 %2798\n      %23767 = OpCompositeExtract %uint %10944 3\n      %20818 = OpCompositeConstruct %v4uint %23767 %23767 %23767 %23767\n       %9379 = OpShiftRightLogical %v4uint %20818 %845\n      %18866 = OpBitwiseAnd %v4uint %9379 %635\n      %18736 = OpConvertUToF %v4float %18866\n       %9888 = OpFMul %v4float %18736 %2798\n               OpBranch %16225\n      %14586 = OpLabel\n      %22210 = OpCompositeExtract %uint %10944 0\n      %20239 = OpCompositeConstruct %v4uint %22210 %22210 %22210 %22210\n       %9380 = OpShiftRightLogical %v4uint %20239 %653\n      %19034 = OpBitwiseAnd %v4uint %9380 %1611\n      %13989 = OpConvertUToF %v4float %19034\n      %19238 = OpVectorTimesScalar %v4float %13989 %float_0_00392156886\n       %8610 = OpCompositeExtract %uint %10944 1\n      %24846 = OpCompositeConstruct %v4uint %8610 %8610 %8610 %8610\n       %9381 = OpShiftRightLogical %v4uint %24846 %653\n      %19035 = OpBitwiseAnd %v4uint %9381 %1611\n      %13990 = OpConvertUToF %v4float %19035\n      %19239 = OpVectorTimesScalar %v4float %13990 %float_0_00392156886\n       %8611 = OpCompositeExtract %uint %10944 2\n      %24847 = OpCompositeConstruct %v4uint %8611 %8611 %8611 %8611\n       %9382 = OpShiftRightLogical %v4uint %24847 %653\n      %19036 = OpBitwiseAnd %v4uint %9382 %1611\n      %13991 = OpConvertUToF %v4float %19036\n      %19240 = OpVectorTimesScalar %v4float %13991 %float_0_00392156886\n       %8612 = OpCompositeExtract %uint %10944 3\n      %24848 = OpCompositeConstruct %v4uint %8612 %8612 %8612 %8612\n       %9383 = OpShiftRightLogical %v4uint %24848 %653\n      %19037 = OpBitwiseAnd %v4uint %9383 %1611\n      %17179 = OpConvertUToF %v4float %19037\n      %12435 = OpVectorTimesScalar %v4float %17179 %float_0_00392156886\n               OpBranch %16225\n      %19452 = OpLabel\n      %12430 = OpCompositeExtract %uint %10944 0\n      %20463 = OpBitcast %float %12430\n      %17209 = OpCompositeConstruct %v2float %20463 %float_0\n      %11667 = OpVectorShuffle %v4float %17209 %17209 0 1 1 1\n      %22196 = OpCompositeExtract %uint %10944 1\n      %16235 = OpBitcast %float %22196\n      %17210 = OpCompositeConstruct %v2float %16235 %float_0\n      %11668 = OpVectorShuffle %v4float %17210 %17210 0 1 1 1\n      %22197 = OpCompositeExtract %uint %10944 2\n      %16236 = OpBitcast %float %22197\n      %17211 = OpCompositeConstruct %v2float %16236 %float_0\n      %11669 = OpVectorShuffle %v4float %17211 %17211 0 1 1 1\n      %22198 = OpCompositeExtract %uint %10944 3\n      %16237 = OpBitcast %float %22198\n      %20399 = OpCompositeConstruct %v2float %16237 %float_0\n      %23099 = OpVectorShuffle %v4float %20399 %20399 0 1 1 1\n               OpBranch %16225\n      %16225 = OpLabel\n      %11178 = OpPhi %v4float %23099 %19452 %12435 %14586 %9888 %7357 %9040 %7356 %9039 %8191 %9038 %8245\n      %14347 = OpPhi %v4float %11669 %19452 %19240 %14586 %16693 %7357 %15839 %7356 %16675 %8191 %14612 %8245\n      %15231 = OpPhi %v4float %11668 %19452 %19239 %14586 %16692 %7357 %15838 %7356 %16674 %8191 %14611 %8245\n      %14520 = OpPhi %v4float %11667 %19452 %19238 %14586 %16691 %7357 %15837 %7356 %16673 %8191 %14610 %8245\n               OpBranch %21264\n      %15206 = OpLabel\n      %21585 = OpIEqual %bool %6555 %uint_8\n               OpSelectionMerge %20261 DontFlatten\n               OpBranchConditional %21585 %6594 %8962\n       %8962 = OpLabel\n      %22067 = OpShiftRightLogical %uint %24184 %int_2\n      %13375 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22067\n      %12617 = OpLoad %uint %13375\n      %11703 = OpIAdd %uint %22067 %uint_1\n       %6408 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11703\n       %7031 = OpLoad %uint %6408\n       %8520 = OpIAdd %uint %24184 %6555\n      %21673 = OpShiftRightLogical %uint %8520 %int_2\n      %19605 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21673\n      %12618 = OpLoad %uint %19605\n      %11704 = OpIAdd %uint %21673 %uint_1\n      %24564 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11704\n      %14157 = OpLoad %uint %24564\n      %19671 = OpCompositeConstruct %v4uint %12617 %7031 %12618 %14157\n      %19500 = OpIMul %uint %uint_2 %6555\n      %10822 = OpIAdd %uint %24184 %19500\n      %17896 = OpShiftRightLogical %uint %10822 %int_2\n      %19606 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17896\n      %12619 = OpLoad %uint %19606\n      %11705 = OpIAdd %uint %17896 %uint_1\n       %6476 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11705\n      %24156 = OpLoad %uint %6476\n       %8690 = OpIMul %uint %uint_3 %6555\n      %24259 = OpIAdd %uint %24184 %8690\n      %17897 = OpShiftRightLogical %uint %24259 %int_2\n      %19607 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17897\n      %12620 = OpLoad %uint %19607\n      %11706 = OpIAdd %uint %17897 %uint_1\n      %24565 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11706\n      %16383 = OpLoad %uint %24565\n      %20786 = OpCompositeConstruct %v4uint %12619 %24156 %12620 %16383\n               OpBranch %20261\n       %6594 = OpLabel\n      %24489 = OpShiftRightLogical %uint %24184 %int_2\n      %13376 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24489\n      %12621 = OpLoad %uint %13376\n      %11707 = OpIAdd %uint %24489 %uint_1\n       %6409 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11707\n      %23658 = OpLoad %uint %6409\n      %11708 = OpIAdd %uint %24489 %uint_2\n       %6410 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11708\n      %23659 = OpLoad %uint %6410\n      %11709 = OpIAdd %uint %24489 %uint_3\n      %24566 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11709\n      %14081 = OpLoad %uint %24566\n      %21617 = OpCompositeConstruct %v4uint %12621 %23658 %23659 %14081\n      %19332 = OpIAdd %uint %23531 %uint_336\n       %8238 = OpShiftRightLogical %uint %19332 %int_2\n      %19608 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %8238\n      %12622 = OpLoad %uint %19608\n      %11710 = OpIAdd %uint %8238 %uint_1\n       %6411 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11710\n      %23660 = OpLoad %uint %6411\n      %11711 = OpIAdd %uint %8238 %uint_2\n       %6412 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11711\n      %23661 = OpLoad %uint %6412\n      %11712 = OpIAdd %uint %8238 %uint_3\n      %24567 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11712\n      %16384 = OpLoad %uint %24567\n      %20787 = OpCompositeConstruct %v4uint %12622 %23660 %23661 %16384\n               OpBranch %20261\n      %20261 = OpLabel\n      %11214 = OpPhi %v4uint %20787 %6594 %20786 %8962\n      %14113 = OpPhi %v4uint %21617 %6594 %19671 %8962\n               OpSelectionMerge %20262 None\n               OpSwitch %8576 %20311 5 %8537 7 %8246\n       %8246 = OpLabel\n      %24411 = OpCompositeExtract %uint %14113 0\n      %24682 = OpExtInst %v2float %1 UnpackHalf2x16 %24411\n      %10105 = OpCompositeExtract %float %24682 0\n      %16060 = OpCompositeExtract %float %24682 1\n      %17029 = OpCompositeExtract %uint %14113 1\n      %15609 = OpExtInst %v2float %1 UnpackHalf2x16 %17029\n      %10094 = OpCompositeExtract %float %15609 0\n      %17487 = OpCompositeExtract %float %15609 1\n      %14613 = OpCompositeConstruct %v4float %10105 %16060 %10094 %17487\n      %17283 = OpCompositeExtract %uint %14113 2\n      %18036 = OpExtInst %v2float %1 UnpackHalf2x16 %17283\n      %10106 = OpCompositeExtract %float %18036 0\n      %16061 = OpCompositeExtract %float %18036 1\n      %17030 = OpCompositeExtract %uint %14113 3\n      %15610 = OpExtInst %v2float %1 UnpackHalf2x16 %17030\n      %10095 = OpCompositeExtract %float %15610 0\n      %17488 = OpCompositeExtract %float %15610 1\n      %14614 = OpCompositeConstruct %v4float %10106 %16061 %10095 %17488\n      %17284 = OpCompositeExtract %uint %11214 0\n      %18037 = OpExtInst %v2float %1 UnpackHalf2x16 %17284\n      %10107 = OpCompositeExtract %float %18037 0\n      %16062 = OpCompositeExtract %float %18037 1\n      %17031 = OpCompositeExtract %uint %11214 1\n      %15611 = OpExtInst %v2float %1 UnpackHalf2x16 %17031\n      %10096 = OpCompositeExtract %float %15611 0\n      %17489 = OpCompositeExtract %float %15611 1\n      %14615 = OpCompositeConstruct %v4float %10107 %16062 %10096 %17489\n      %17285 = OpCompositeExtract %uint %11214 2\n      %18038 = OpExtInst %v2float %1 UnpackHalf2x16 %17285\n      %10108 = OpCompositeExtract %float %18038 0\n      %16063 = OpCompositeExtract %float %18038 1\n      %17032 = OpCompositeExtract %uint %11214 3\n      %15612 = OpExtInst %v2float %1 UnpackHalf2x16 %17032\n      %10097 = OpCompositeExtract %float %15612 0\n      %20673 = OpCompositeExtract %float %15612 1\n       %9041 = OpCompositeConstruct %v4float %10108 %16063 %10097 %20673\n               OpBranch %20262\n       %8537 = OpLabel\n       %9724 = OpVectorShuffle %v2uint %14113 %14113 0 1\n      %23357 = OpBitcast %v2int %9724\n      %24786 = OpVectorShuffle %v4int %23357 %23357 0 0 1 1\n      %18602 = OpShiftLeftLogical %v4int %24786 %290\n      %15761 = OpShiftRightArithmetic %v4int %18602 %770\n      %10923 = OpConvertSToF %v4float %15761\n      %18213 = OpVectorTimesScalar %v4float %10923 %float_0_000976592302\n      %25236 = OpExtInst %v4float %1 FMax %1284 %18213\n      %14190 = OpVectorShuffle %v2uint %14113 %14113 2 3\n       %9410 = OpBitcast %v2int %14190\n      %24787 = OpVectorShuffle %v4int %9410 %9410 0 0 1 1\n      %18603 = OpShiftLeftLogical %v4int %24787 %290\n      %15762 = OpShiftRightArithmetic %v4int %18603 %770\n      %10924 = OpConvertSToF %v4float %15762\n      %18214 = OpVectorTimesScalar %v4float %10924 %float_0_000976592302\n      %25237 = OpExtInst %v4float %1 FMax %1284 %18214\n      %14191 = OpVectorShuffle %v2uint %11214 %11214 0 1\n       %9411 = OpBitcast %v2int %14191\n      %24788 = OpVectorShuffle %v4int %9411 %9411 0 0 1 1\n      %18604 = OpShiftLeftLogical %v4int %24788 %290\n      %15763 = OpShiftRightArithmetic %v4int %18604 %770\n      %10925 = OpConvertSToF %v4float %15763\n      %18215 = OpVectorTimesScalar %v4float %10925 %float_0_000976592302\n      %25238 = OpExtInst %v4float %1 FMax %1284 %18215\n      %14192 = OpVectorShuffle %v2uint %11214 %11214 2 3\n       %9412 = OpBitcast %v2int %14192\n      %24789 = OpVectorShuffle %v4int %9412 %9412 0 0 1 1\n      %18605 = OpShiftLeftLogical %v4int %24789 %290\n      %15764 = OpShiftRightArithmetic %v4int %18605 %770\n      %10926 = OpConvertSToF %v4float %15764\n      %21440 = OpVectorTimesScalar %v4float %10926 %float_0_000976592302\n      %17251 = OpExtInst %v4float %1 FMax %1284 %21440\n               OpBranch %20262\n      %20311 = OpLabel\n       %9762 = OpVectorShuffle %v2uint %14113 %14113 0 1\n      %20826 = OpBitcast %v2float %9762\n       %7039 = OpCompositeExtract %float %20826 0\n      %13421 = OpCompositeExtract %float %20826 1\n      %17019 = OpCompositeConstruct %v4float %7039 %13421 %float_0 %float_0\n      %16859 = OpVectorShuffle %v2uint %14113 %14113 2 3\n      %14176 = OpBitcast %v2float %16859\n       %7040 = OpCompositeExtract %float %14176 0\n      %13422 = OpCompositeExtract %float %14176 1\n      %17020 = OpCompositeConstruct %v4float %7040 %13422 %float_0 %float_0\n      %16860 = OpVectorShuffle %v2uint %11214 %11214 0 1\n      %14177 = OpBitcast %v2float %16860\n       %7041 = OpCompositeExtract %float %14177 0\n      %13423 = OpCompositeExtract %float %14177 1\n      %17021 = OpCompositeConstruct %v4float %7041 %13423 %float_0 %float_0\n      %16861 = OpVectorShuffle %v2uint %11214 %11214 2 3\n      %14178 = OpBitcast %v2float %16861\n       %7042 = OpCompositeExtract %float %14178 0\n      %16649 = OpCompositeExtract %float %14178 1\n       %9042 = OpCompositeConstruct %v4float %7042 %16649 %float_0 %float_0\n               OpBranch %20262\n      %20262 = OpLabel\n      %11179 = OpPhi %v4float %9042 %20311 %17251 %8537 %9041 %8246\n      %14348 = OpPhi %v4float %17021 %20311 %25238 %8537 %14615 %8246\n      %15232 = OpPhi %v4float %17020 %20311 %25237 %8537 %14614 %8246\n      %14521 = OpPhi %v4float %17019 %20311 %25236 %8537 %14613 %8246\n               OpBranch %21264\n      %21264 = OpLabel\n      %11180 = OpPhi %v4float %11179 %20262 %11178 %16225\n      %14349 = OpPhi %v4float %14348 %20262 %14347 %16225\n      %12949 = OpPhi %v4float %15232 %20262 %15231 %16225\n      %13946 = OpPhi %v4float %14521 %20262 %14520 %16225\n      %17241 = OpFAdd %v4float %8403 %13946\n      %23297 = OpFAdd %v4float %13804 %12949\n       %8082 = OpFAdd %v4float %14346 %14349\n      %20755 = OpFAdd %v4float %11177 %11180\n      %14461 = OpUGreaterThanEqual %bool %16205 %uint_6\n               OpSelectionMerge %24267 DontFlatten\n               OpBranchConditional %14461 %9905 %24267\n       %9905 = OpLabel\n      %14258 = OpShiftLeftLogical %uint %uint_4 %9130\n      %12090 = OpFMul %float %11052 %float_0_25\n      %20988 = OpIAdd %uint %23531 %14258\n               OpSelectionMerge %21265 DontFlatten\n               OpBranchConditional %23279 %15207 %16571\n      %16571 = OpLabel\n      %19165 = OpIEqual %bool %6555 %uint_4\n               OpSelectionMerge %20299 DontFlatten\n               OpBranchConditional %19165 %6595 %8963\n       %8963 = OpLabel\n      %22068 = OpShiftRightLogical %uint %20988 %int_2\n      %13377 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22068\n      %15062 = OpLoad %uint %13377\n       %8521 = OpIAdd %uint %20988 %6555\n      %21674 = OpShiftRightLogical %uint %8521 %int_2\n      %19681 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21674\n      %13118 = OpLoad %uint %19681\n       %8691 = OpIMul %uint %uint_2 %6555\n      %24260 = OpIAdd %uint %20988 %8691\n      %17898 = OpShiftRightLogical %uint %24260 %int_2\n      %19682 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17898\n      %13119 = OpLoad %uint %19682\n       %8692 = OpIMul %uint %uint_3 %6555\n      %24261 = OpIAdd %uint %20988 %8692\n      %17899 = OpShiftRightLogical %uint %24261 %int_2\n      %18691 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17899\n      %24412 = OpLoad %uint %18691\n      %20788 = OpCompositeConstruct %v4uint %15062 %13118 %13119 %24412\n               OpBranch %20299\n       %6595 = OpLabel\n      %24490 = OpShiftRightLogical %uint %20988 %int_2\n      %13378 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24490\n      %12623 = OpLoad %uint %13378\n      %11713 = OpIAdd %uint %24490 %uint_1\n       %6413 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11713\n      %23662 = OpLoad %uint %6413\n      %11714 = OpIAdd %uint %24490 %uint_2\n       %6414 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11714\n      %23663 = OpLoad %uint %6414\n      %11715 = OpIAdd %uint %24490 %uint_3\n      %24568 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11715\n      %16385 = OpLoad %uint %24568\n      %20789 = OpCompositeConstruct %v4uint %12623 %23662 %23663 %16385\n               OpBranch %20299\n      %20299 = OpLabel\n      %10945 = OpPhi %v4uint %20789 %6595 %20788 %8963\n               OpSelectionMerge %16226 None\n               OpSwitch %8576 %19453 0 %14587 1 %14587 2 %7359 10 %7359 3 %7358 12 %7358 4 %8192 6 %8247\n       %8247 = OpLabel\n      %24413 = OpCompositeExtract %uint %10945 0\n      %24683 = OpExtInst %v2float %1 UnpackHalf2x16 %24413\n      %10098 = OpCompositeExtract %float %24683 0\n      %17490 = OpCompositeExtract %float %24683 1\n      %14616 = OpCompositeConstruct %v4float %10098 %17490 %float_0 %float_0\n      %17286 = OpCompositeExtract %uint %10945 1\n      %18039 = OpExtInst %v2float %1 UnpackHalf2x16 %17286\n      %10099 = OpCompositeExtract %float %18039 0\n      %17491 = OpCompositeExtract %float %18039 1\n      %14617 = OpCompositeConstruct %v4float %10099 %17491 %float_0 %float_0\n      %17287 = OpCompositeExtract %uint %10945 2\n      %18040 = OpExtInst %v2float %1 UnpackHalf2x16 %17287\n      %10100 = OpCompositeExtract %float %18040 0\n      %17492 = OpCompositeExtract %float %18040 1\n      %14618 = OpCompositeConstruct %v4float %10100 %17492 %float_0 %float_0\n      %17288 = OpCompositeExtract %uint %10945 3\n      %18041 = OpExtInst %v2float %1 UnpackHalf2x16 %17288\n      %10109 = OpCompositeExtract %float %18041 0\n      %20674 = OpCompositeExtract %float %18041 1\n       %9043 = OpCompositeConstruct %v4float %10109 %20674 %float_0 %float_0\n               OpBranch %16226\n       %8192 = OpLabel\n      %12431 = OpCompositeExtract %uint %10945 0\n      %22687 = OpBitcast %int %12431\n      %18216 = OpCompositeConstruct %v2int %22687 %22687\n      %18357 = OpShiftLeftLogical %v2int %18216 %1959\n      %13343 = OpShiftRightArithmetic %v2int %18357 %2151\n      %10927 = OpConvertSToF %v2float %13343\n      %18255 = OpVectorTimesScalar %v2float %10927 %float_0_000976592302\n      %24078 = OpExtInst %v2float %1 FMax %73 %18255\n      %24338 = OpCompositeExtract %float %24078 0\n      %15578 = OpCompositeExtract %float %24078 1\n      %16676 = OpCompositeConstruct %v4float %24338 %15578 %float_0 %float_0\n      %19528 = OpCompositeExtract %uint %10945 1\n      %16039 = OpBitcast %int %19528\n      %18217 = OpCompositeConstruct %v2int %16039 %16039\n      %18358 = OpShiftLeftLogical %v2int %18217 %1959\n      %13344 = OpShiftRightArithmetic %v2int %18358 %2151\n      %10928 = OpConvertSToF %v2float %13344\n      %18256 = OpVectorTimesScalar %v2float %10928 %float_0_000976592302\n      %24079 = OpExtInst %v2float %1 FMax %73 %18256\n      %24339 = OpCompositeExtract %float %24079 0\n      %15579 = OpCompositeExtract %float %24079 1\n      %16677 = OpCompositeConstruct %v4float %24339 %15579 %float_0 %float_0\n      %19529 = OpCompositeExtract %uint %10945 2\n      %16040 = OpBitcast %int %19529\n      %18218 = OpCompositeConstruct %v2int %16040 %16040\n      %18359 = OpShiftLeftLogical %v2int %18218 %1959\n      %13345 = OpShiftRightArithmetic %v2int %18359 %2151\n      %10929 = OpConvertSToF %v2float %13345\n      %18257 = OpVectorTimesScalar %v2float %10929 %float_0_000976592302\n      %24080 = OpExtInst %v2float %1 FMax %73 %18257\n      %24340 = OpCompositeExtract %float %24080 0\n      %15580 = OpCompositeExtract %float %24080 1\n      %16678 = OpCompositeConstruct %v4float %24340 %15580 %float_0 %float_0\n      %19530 = OpCompositeExtract %uint %10945 3\n      %16041 = OpBitcast %int %19530\n      %18219 = OpCompositeConstruct %v2int %16041 %16041\n      %18360 = OpShiftLeftLogical %v2int %18219 %1959\n      %13346 = OpShiftRightArithmetic %v2int %18360 %2151\n      %10930 = OpConvertSToF %v2float %13346\n      %18258 = OpVectorTimesScalar %v2float %10930 %float_0_000976592302\n      %24081 = OpExtInst %v2float %1 FMax %73 %18258\n      %24341 = OpCompositeExtract %float %24081 0\n      %18766 = OpCompositeExtract %float %24081 1\n       %9044 = OpCompositeConstruct %v4float %24341 %18766 %float_0 %float_0\n               OpBranch %16226\n       %7358 = OpLabel\n      %22211 = OpCompositeExtract %uint %10945 0\n      %20240 = OpCompositeConstruct %v3uint %22211 %22211 %22211\n      %11031 = OpShiftRightLogical %v3uint %20240 %2996\n      %24046 = OpBitwiseAnd %v3uint %11031 %261\n      %18596 = OpBitwiseAnd %v3uint %11031 %1126\n      %23448 = OpShiftRightLogical %v3uint %24046 %2828\n      %16593 = OpIEqual %v3bool %23448 %2578\n      %11347 = OpExtInst %v3int %1 FindUMsb %18596\n      %10781 = OpBitcast %v3uint %11347\n       %6274 = OpISub %v3uint %2828 %10781\n       %8728 = OpIAdd %v3uint %10781 %2360\n      %10359 = OpSelect %v3uint %16593 %8728 %23448\n      %23260 = OpShiftLeftLogical %v3uint %18596 %6274\n      %18850 = OpBitwiseAnd %v3uint %23260 %1126\n      %10931 = OpSelect %v3uint %16593 %18850 %18596\n      %24577 = OpIAdd %v3uint %10359 %1018\n      %20359 = OpShiftLeftLogical %v3uint %24577 %393\n      %16302 = OpShiftLeftLogical %v3uint %10931 %141\n      %22404 = OpBitwiseOr %v3uint %20359 %16302\n      %13832 = OpIEqual %v3bool %24046 %2578\n      %16970 = OpSelect %v3uint %13832 %2578 %22404\n      %10711 = OpBitcast %v3float %16970\n      %19372 = OpShiftRightLogical %uint %22211 %uint_30\n      %18454 = OpConvertUToF %float %19372\n      %15911 = OpFMul %float %18454 %float_0_333333343\n      %21450 = OpCompositeExtract %float %10711 0\n      %10845 = OpCompositeExtract %float %10711 1\n       %7839 = OpCompositeExtract %float %10711 2\n      %15840 = OpCompositeConstruct %v4float %21450 %10845 %7839 %15911\n      %10235 = OpCompositeExtract %uint %10945 1\n      %13588 = OpCompositeConstruct %v3uint %10235 %10235 %10235\n      %11032 = OpShiftRightLogical %v3uint %13588 %2996\n      %24047 = OpBitwiseAnd %v3uint %11032 %261\n      %18597 = OpBitwiseAnd %v3uint %11032 %1126\n      %23449 = OpShiftRightLogical %v3uint %24047 %2828\n      %16594 = OpIEqual %v3bool %23449 %2578\n      %11348 = OpExtInst %v3int %1 FindUMsb %18597\n      %10782 = OpBitcast %v3uint %11348\n       %6275 = OpISub %v3uint %2828 %10782\n       %8729 = OpIAdd %v3uint %10782 %2360\n      %10360 = OpSelect %v3uint %16594 %8729 %23449\n      %23261 = OpShiftLeftLogical %v3uint %18597 %6275\n      %18851 = OpBitwiseAnd %v3uint %23261 %1126\n      %10932 = OpSelect %v3uint %16594 %18851 %18597\n      %24578 = OpIAdd %v3uint %10360 %1018\n      %20360 = OpShiftLeftLogical %v3uint %24578 %393\n      %16303 = OpShiftLeftLogical %v3uint %10932 %141\n      %22405 = OpBitwiseOr %v3uint %20360 %16303\n      %13833 = OpIEqual %v3bool %24047 %2578\n      %16971 = OpSelect %v3uint %13833 %2578 %22405\n      %10712 = OpBitcast %v3float %16971\n      %19373 = OpShiftRightLogical %uint %10235 %uint_30\n      %18455 = OpConvertUToF %float %19373\n      %15912 = OpFMul %float %18455 %float_0_333333343\n      %21451 = OpCompositeExtract %float %10712 0\n      %10846 = OpCompositeExtract %float %10712 1\n       %7840 = OpCompositeExtract %float %10712 2\n      %15841 = OpCompositeConstruct %v4float %21451 %10846 %7840 %15912\n      %10236 = OpCompositeExtract %uint %10945 2\n      %13589 = OpCompositeConstruct %v3uint %10236 %10236 %10236\n      %11033 = OpShiftRightLogical %v3uint %13589 %2996\n      %24048 = OpBitwiseAnd %v3uint %11033 %261\n      %18606 = OpBitwiseAnd %v3uint %11033 %1126\n      %23450 = OpShiftRightLogical %v3uint %24048 %2828\n      %16595 = OpIEqual %v3bool %23450 %2578\n      %11349 = OpExtInst %v3int %1 FindUMsb %18606\n      %10783 = OpBitcast %v3uint %11349\n       %6276 = OpISub %v3uint %2828 %10783\n       %8730 = OpIAdd %v3uint %10783 %2360\n      %10361 = OpSelect %v3uint %16595 %8730 %23450\n      %23262 = OpShiftLeftLogical %v3uint %18606 %6276\n      %18852 = OpBitwiseAnd %v3uint %23262 %1126\n      %10933 = OpSelect %v3uint %16595 %18852 %18606\n      %24579 = OpIAdd %v3uint %10361 %1018\n      %20361 = OpShiftLeftLogical %v3uint %24579 %393\n      %16304 = OpShiftLeftLogical %v3uint %10933 %141\n      %22406 = OpBitwiseOr %v3uint %20361 %16304\n      %13834 = OpIEqual %v3bool %24048 %2578\n      %16972 = OpSelect %v3uint %13834 %2578 %22406\n      %10713 = OpBitcast %v3float %16972\n      %19374 = OpShiftRightLogical %uint %10236 %uint_30\n      %18456 = OpConvertUToF %float %19374\n      %15913 = OpFMul %float %18456 %float_0_333333343\n      %21452 = OpCompositeExtract %float %10713 0\n      %10847 = OpCompositeExtract %float %10713 1\n       %7841 = OpCompositeExtract %float %10713 2\n      %15842 = OpCompositeConstruct %v4float %21452 %10847 %7841 %15913\n      %10237 = OpCompositeExtract %uint %10945 3\n      %13590 = OpCompositeConstruct %v3uint %10237 %10237 %10237\n      %11034 = OpShiftRightLogical %v3uint %13590 %2996\n      %24049 = OpBitwiseAnd %v3uint %11034 %261\n      %18607 = OpBitwiseAnd %v3uint %11034 %1126\n      %23451 = OpShiftRightLogical %v3uint %24049 %2828\n      %16596 = OpIEqual %v3bool %23451 %2578\n      %11350 = OpExtInst %v3int %1 FindUMsb %18607\n      %10784 = OpBitcast %v3uint %11350\n       %6277 = OpISub %v3uint %2828 %10784\n       %8731 = OpIAdd %v3uint %10784 %2360\n      %10362 = OpSelect %v3uint %16596 %8731 %23451\n      %23263 = OpShiftLeftLogical %v3uint %18607 %6277\n      %18853 = OpBitwiseAnd %v3uint %23263 %1126\n      %10934 = OpSelect %v3uint %16596 %18853 %18607\n      %24580 = OpIAdd %v3uint %10362 %1018\n      %20362 = OpShiftLeftLogical %v3uint %24580 %393\n      %16305 = OpShiftLeftLogical %v3uint %10934 %141\n      %22407 = OpBitwiseOr %v3uint %20362 %16305\n      %13835 = OpIEqual %v3bool %24049 %2578\n      %16973 = OpSelect %v3uint %13835 %2578 %22407\n      %10714 = OpBitcast %v3float %16973\n      %19375 = OpShiftRightLogical %uint %10237 %uint_30\n      %18457 = OpConvertUToF %float %19375\n      %15914 = OpFMul %float %18457 %float_0_333333343\n      %21453 = OpCompositeExtract %float %10714 0\n      %10848 = OpCompositeExtract %float %10714 1\n      %11035 = OpCompositeExtract %float %10714 2\n       %9045 = OpCompositeConstruct %v4float %21453 %10848 %11035 %15914\n               OpBranch %16226\n       %7359 = OpLabel\n      %22212 = OpCompositeExtract %uint %10945 0\n      %20241 = OpCompositeConstruct %v4uint %22212 %22212 %22212 %22212\n       %9384 = OpShiftRightLogical %v4uint %20241 %845\n      %18867 = OpBitwiseAnd %v4uint %9384 %635\n      %15549 = OpConvertUToF %v4float %18867\n      %16694 = OpFMul %v4float %15549 %2798\n      %23768 = OpCompositeExtract %uint %10945 1\n      %20819 = OpCompositeConstruct %v4uint %23768 %23768 %23768 %23768\n       %9385 = OpShiftRightLogical %v4uint %20819 %845\n      %18868 = OpBitwiseAnd %v4uint %9385 %635\n      %15550 = OpConvertUToF %v4float %18868\n      %16695 = OpFMul %v4float %15550 %2798\n      %23769 = OpCompositeExtract %uint %10945 2\n      %20820 = OpCompositeConstruct %v4uint %23769 %23769 %23769 %23769\n       %9386 = OpShiftRightLogical %v4uint %20820 %845\n      %18869 = OpBitwiseAnd %v4uint %9386 %635\n      %15551 = OpConvertUToF %v4float %18869\n      %16696 = OpFMul %v4float %15551 %2798\n      %23770 = OpCompositeExtract %uint %10945 3\n      %20821 = OpCompositeConstruct %v4uint %23770 %23770 %23770 %23770\n       %9387 = OpShiftRightLogical %v4uint %20821 %845\n      %18870 = OpBitwiseAnd %v4uint %9387 %635\n      %18737 = OpConvertUToF %v4float %18870\n       %9889 = OpFMul %v4float %18737 %2798\n               OpBranch %16226\n      %14587 = OpLabel\n      %22213 = OpCompositeExtract %uint %10945 0\n      %20242 = OpCompositeConstruct %v4uint %22213 %22213 %22213 %22213\n       %9388 = OpShiftRightLogical %v4uint %20242 %653\n      %19038 = OpBitwiseAnd %v4uint %9388 %1611\n      %13992 = OpConvertUToF %v4float %19038\n      %19241 = OpVectorTimesScalar %v4float %13992 %float_0_00392156886\n       %8613 = OpCompositeExtract %uint %10945 1\n      %24849 = OpCompositeConstruct %v4uint %8613 %8613 %8613 %8613\n       %9389 = OpShiftRightLogical %v4uint %24849 %653\n      %19039 = OpBitwiseAnd %v4uint %9389 %1611\n      %13993 = OpConvertUToF %v4float %19039\n      %19242 = OpVectorTimesScalar %v4float %13993 %float_0_00392156886\n       %8614 = OpCompositeExtract %uint %10945 2\n      %24850 = OpCompositeConstruct %v4uint %8614 %8614 %8614 %8614\n       %9390 = OpShiftRightLogical %v4uint %24850 %653\n      %19040 = OpBitwiseAnd %v4uint %9390 %1611\n      %13994 = OpConvertUToF %v4float %19040\n      %19243 = OpVectorTimesScalar %v4float %13994 %float_0_00392156886\n       %8615 = OpCompositeExtract %uint %10945 3\n      %24851 = OpCompositeConstruct %v4uint %8615 %8615 %8615 %8615\n       %9391 = OpShiftRightLogical %v4uint %24851 %653\n      %19041 = OpBitwiseAnd %v4uint %9391 %1611\n      %17180 = OpConvertUToF %v4float %19041\n      %12436 = OpVectorTimesScalar %v4float %17180 %float_0_00392156886\n               OpBranch %16226\n      %19453 = OpLabel\n      %12432 = OpCompositeExtract %uint %10945 0\n      %20464 = OpBitcast %float %12432\n      %17212 = OpCompositeConstruct %v2float %20464 %float_0\n      %11670 = OpVectorShuffle %v4float %17212 %17212 0 1 1 1\n      %22199 = OpCompositeExtract %uint %10945 1\n      %16238 = OpBitcast %float %22199\n      %17213 = OpCompositeConstruct %v2float %16238 %float_0\n      %11671 = OpVectorShuffle %v4float %17213 %17213 0 1 1 1\n      %22200 = OpCompositeExtract %uint %10945 2\n      %16239 = OpBitcast %float %22200\n      %17214 = OpCompositeConstruct %v2float %16239 %float_0\n      %11672 = OpVectorShuffle %v4float %17214 %17214 0 1 1 1\n      %22201 = OpCompositeExtract %uint %10945 3\n      %16240 = OpBitcast %float %22201\n      %20400 = OpCompositeConstruct %v2float %16240 %float_0\n      %23100 = OpVectorShuffle %v4float %20400 %20400 0 1 1 1\n               OpBranch %16226\n      %16226 = OpLabel\n      %11181 = OpPhi %v4float %23100 %19453 %12436 %14587 %9889 %7359 %9045 %7358 %9044 %8192 %9043 %8247\n      %14350 = OpPhi %v4float %11672 %19453 %19243 %14587 %16696 %7359 %15842 %7358 %16678 %8192 %14618 %8247\n      %15233 = OpPhi %v4float %11671 %19453 %19242 %14587 %16695 %7359 %15841 %7358 %16677 %8192 %14617 %8247\n      %14522 = OpPhi %v4float %11670 %19453 %19241 %14587 %16694 %7359 %15840 %7358 %16676 %8192 %14616 %8247\n               OpBranch %21265\n      %15207 = OpLabel\n      %21586 = OpIEqual %bool %6555 %uint_8\n               OpSelectionMerge %20263 DontFlatten\n               OpBranchConditional %21586 %6596 %8964\n       %8964 = OpLabel\n      %22069 = OpShiftRightLogical %uint %20988 %int_2\n      %13379 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22069\n      %12624 = OpLoad %uint %13379\n      %11716 = OpIAdd %uint %22069 %uint_1\n       %6415 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11716\n       %7032 = OpLoad %uint %6415\n       %8522 = OpIAdd %uint %20988 %6555\n      %21675 = OpShiftRightLogical %uint %8522 %int_2\n      %19609 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21675\n      %12625 = OpLoad %uint %19609\n      %11717 = OpIAdd %uint %21675 %uint_1\n      %24581 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11717\n      %14158 = OpLoad %uint %24581\n      %19673 = OpCompositeConstruct %v4uint %12624 %7032 %12625 %14158\n      %19501 = OpIMul %uint %uint_2 %6555\n      %10823 = OpIAdd %uint %20988 %19501\n      %17900 = OpShiftRightLogical %uint %10823 %int_2\n      %19610 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17900\n      %12626 = OpLoad %uint %19610\n      %11718 = OpIAdd %uint %17900 %uint_1\n       %6477 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11718\n      %24157 = OpLoad %uint %6477\n       %8693 = OpIMul %uint %uint_3 %6555\n      %24262 = OpIAdd %uint %20988 %8693\n      %17901 = OpShiftRightLogical %uint %24262 %int_2\n      %19611 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17901\n      %12627 = OpLoad %uint %19611\n      %11719 = OpIAdd %uint %17901 %uint_1\n      %24582 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11719\n      %16386 = OpLoad %uint %24582\n      %20790 = OpCompositeConstruct %v4uint %12626 %24157 %12627 %16386\n               OpBranch %20263\n       %6596 = OpLabel\n      %24491 = OpShiftRightLogical %uint %20988 %int_2\n      %13380 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24491\n      %12628 = OpLoad %uint %13380\n      %11720 = OpIAdd %uint %24491 %uint_1\n       %6416 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11720\n      %23664 = OpLoad %uint %6416\n      %11721 = OpIAdd %uint %24491 %uint_2\n       %6417 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11721\n      %23665 = OpLoad %uint %6417\n      %11722 = OpIAdd %uint %24491 %uint_3\n      %24583 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11722\n      %14082 = OpLoad %uint %24583\n      %21618 = OpCompositeConstruct %v4uint %12628 %23664 %23665 %14082\n      %19333 = OpIAdd %uint %20988 %uint_16\n       %8239 = OpShiftRightLogical %uint %19333 %int_2\n      %19612 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %8239\n      %12629 = OpLoad %uint %19612\n      %11723 = OpIAdd %uint %8239 %uint_1\n       %6418 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11723\n      %23666 = OpLoad %uint %6418\n      %11724 = OpIAdd %uint %8239 %uint_2\n       %6419 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11724\n      %23667 = OpLoad %uint %6419\n      %11725 = OpIAdd %uint %8239 %uint_3\n      %24584 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11725\n      %16387 = OpLoad %uint %24584\n      %20791 = OpCompositeConstruct %v4uint %12629 %23666 %23667 %16387\n               OpBranch %20263\n      %20263 = OpLabel\n      %11215 = OpPhi %v4uint %20791 %6596 %20790 %8964\n      %14114 = OpPhi %v4uint %21618 %6596 %19673 %8964\n               OpSelectionMerge %20264 None\n               OpSwitch %8576 %20312 5 %8538 7 %8248\n       %8248 = OpLabel\n      %24414 = OpCompositeExtract %uint %14114 0\n      %24684 = OpExtInst %v2float %1 UnpackHalf2x16 %24414\n      %10110 = OpCompositeExtract %float %24684 0\n      %16064 = OpCompositeExtract %float %24684 1\n      %17033 = OpCompositeExtract %uint %14114 1\n      %15613 = OpExtInst %v2float %1 UnpackHalf2x16 %17033\n      %10111 = OpCompositeExtract %float %15613 0\n      %17493 = OpCompositeExtract %float %15613 1\n      %14619 = OpCompositeConstruct %v4float %10110 %16064 %10111 %17493\n      %17289 = OpCompositeExtract %uint %14114 2\n      %18042 = OpExtInst %v2float %1 UnpackHalf2x16 %17289\n      %10112 = OpCompositeExtract %float %18042 0\n      %16065 = OpCompositeExtract %float %18042 1\n      %17034 = OpCompositeExtract %uint %14114 3\n      %15614 = OpExtInst %v2float %1 UnpackHalf2x16 %17034\n      %10113 = OpCompositeExtract %float %15614 0\n      %17494 = OpCompositeExtract %float %15614 1\n      %14620 = OpCompositeConstruct %v4float %10112 %16065 %10113 %17494\n      %17290 = OpCompositeExtract %uint %11215 0\n      %18043 = OpExtInst %v2float %1 UnpackHalf2x16 %17290\n      %10114 = OpCompositeExtract %float %18043 0\n      %16066 = OpCompositeExtract %float %18043 1\n      %17035 = OpCompositeExtract %uint %11215 1\n      %15615 = OpExtInst %v2float %1 UnpackHalf2x16 %17035\n      %10115 = OpCompositeExtract %float %15615 0\n      %17495 = OpCompositeExtract %float %15615 1\n      %14621 = OpCompositeConstruct %v4float %10114 %16066 %10115 %17495\n      %17291 = OpCompositeExtract %uint %11215 2\n      %18044 = OpExtInst %v2float %1 UnpackHalf2x16 %17291\n      %10116 = OpCompositeExtract %float %18044 0\n      %16067 = OpCompositeExtract %float %18044 1\n      %17036 = OpCompositeExtract %uint %11215 3\n      %15616 = OpExtInst %v2float %1 UnpackHalf2x16 %17036\n      %10117 = OpCompositeExtract %float %15616 0\n      %20675 = OpCompositeExtract %float %15616 1\n       %9046 = OpCompositeConstruct %v4float %10116 %16067 %10117 %20675\n               OpBranch %20264\n       %8538 = OpLabel\n       %9725 = OpVectorShuffle %v2uint %14114 %14114 0 1\n      %23358 = OpBitcast %v2int %9725\n      %24790 = OpVectorShuffle %v4int %23358 %23358 0 0 1 1\n      %18608 = OpShiftLeftLogical %v4int %24790 %290\n      %15765 = OpShiftRightArithmetic %v4int %18608 %770\n      %10935 = OpConvertSToF %v4float %15765\n      %18220 = OpVectorTimesScalar %v4float %10935 %float_0_000976592302\n      %25239 = OpExtInst %v4float %1 FMax %1284 %18220\n      %14193 = OpVectorShuffle %v2uint %14114 %14114 2 3\n       %9413 = OpBitcast %v2int %14193\n      %24791 = OpVectorShuffle %v4int %9413 %9413 0 0 1 1\n      %18609 = OpShiftLeftLogical %v4int %24791 %290\n      %15766 = OpShiftRightArithmetic %v4int %18609 %770\n      %10936 = OpConvertSToF %v4float %15766\n      %18221 = OpVectorTimesScalar %v4float %10936 %float_0_000976592302\n      %25240 = OpExtInst %v4float %1 FMax %1284 %18221\n      %14194 = OpVectorShuffle %v2uint %11215 %11215 0 1\n       %9414 = OpBitcast %v2int %14194\n      %24792 = OpVectorShuffle %v4int %9414 %9414 0 0 1 1\n      %18610 = OpShiftLeftLogical %v4int %24792 %290\n      %15767 = OpShiftRightArithmetic %v4int %18610 %770\n      %10937 = OpConvertSToF %v4float %15767\n      %18222 = OpVectorTimesScalar %v4float %10937 %float_0_000976592302\n      %25241 = OpExtInst %v4float %1 FMax %1284 %18222\n      %14195 = OpVectorShuffle %v2uint %11215 %11215 2 3\n       %9415 = OpBitcast %v2int %14195\n      %24793 = OpVectorShuffle %v4int %9415 %9415 0 0 1 1\n      %18611 = OpShiftLeftLogical %v4int %24793 %290\n      %15768 = OpShiftRightArithmetic %v4int %18611 %770\n      %10938 = OpConvertSToF %v4float %15768\n      %21441 = OpVectorTimesScalar %v4float %10938 %float_0_000976592302\n      %17252 = OpExtInst %v4float %1 FMax %1284 %21441\n               OpBranch %20264\n      %20312 = OpLabel\n       %9763 = OpVectorShuffle %v2uint %14114 %14114 0 1\n      %20827 = OpBitcast %v2float %9763\n       %7043 = OpCompositeExtract %float %20827 0\n      %13424 = OpCompositeExtract %float %20827 1\n      %17022 = OpCompositeConstruct %v4float %7043 %13424 %float_0 %float_0\n      %16862 = OpVectorShuffle %v2uint %14114 %14114 2 3\n      %14179 = OpBitcast %v2float %16862\n       %7044 = OpCompositeExtract %float %14179 0\n      %13425 = OpCompositeExtract %float %14179 1\n      %17023 = OpCompositeConstruct %v4float %7044 %13425 %float_0 %float_0\n      %16863 = OpVectorShuffle %v2uint %11215 %11215 0 1\n      %14180 = OpBitcast %v2float %16863\n       %7045 = OpCompositeExtract %float %14180 0\n      %13426 = OpCompositeExtract %float %14180 1\n      %17024 = OpCompositeConstruct %v4float %7045 %13426 %float_0 %float_0\n      %16864 = OpVectorShuffle %v2uint %11215 %11215 2 3\n      %14181 = OpBitcast %v2float %16864\n       %7046 = OpCompositeExtract %float %14181 0\n      %16650 = OpCompositeExtract %float %14181 1\n       %9047 = OpCompositeConstruct %v4float %7046 %16650 %float_0 %float_0\n               OpBranch %20264\n      %20264 = OpLabel\n      %11182 = OpPhi %v4float %9047 %20312 %17252 %8538 %9046 %8248\n      %14351 = OpPhi %v4float %17024 %20312 %25241 %8538 %14621 %8248\n      %15234 = OpPhi %v4float %17023 %20312 %25240 %8538 %14620 %8248\n      %14523 = OpPhi %v4float %17022 %20312 %25239 %8538 %14619 %8248\n               OpBranch %21265\n      %21265 = OpLabel\n      %11183 = OpPhi %v4float %11182 %20264 %11181 %16226\n      %14352 = OpPhi %v4float %14351 %20264 %14350 %16226\n      %12950 = OpPhi %v4float %15234 %20264 %15233 %16226\n      %13947 = OpPhi %v4float %14523 %20264 %14522 %16226\n      %17242 = OpFAdd %v4float %17241 %13947\n      %23298 = OpFAdd %v4float %23297 %12950\n       %7208 = OpFAdd %v4float %8082 %14352\n       %9642 = OpFAdd %v4float %20755 %11183\n      %16376 = OpIAdd %uint %24184 %14258\n               OpSelectionMerge %21266 DontFlatten\n               OpBranchConditional %23279 %15208 %16572\n      %16572 = OpLabel\n      %19166 = OpIEqual %bool %6555 %uint_4\n               OpSelectionMerge %20300 DontFlatten\n               OpBranchConditional %19166 %6597 %8965\n       %8965 = OpLabel\n      %22070 = OpShiftRightLogical %uint %16376 %int_2\n      %13381 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22070\n      %15063 = OpLoad %uint %13381\n       %8523 = OpIAdd %uint %16376 %6555\n      %21676 = OpShiftRightLogical %uint %8523 %int_2\n      %19683 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21676\n      %13120 = OpLoad %uint %19683\n       %8694 = OpIMul %uint %uint_2 %6555\n      %24264 = OpIAdd %uint %16376 %8694\n      %17902 = OpShiftRightLogical %uint %24264 %int_2\n      %19684 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17902\n      %13121 = OpLoad %uint %19684\n       %8695 = OpIMul %uint %uint_3 %6555\n      %24265 = OpIAdd %uint %16376 %8695\n      %17903 = OpShiftRightLogical %uint %24265 %int_2\n      %18692 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17903\n      %24415 = OpLoad %uint %18692\n      %20792 = OpCompositeConstruct %v4uint %15063 %13120 %13121 %24415\n               OpBranch %20300\n       %6597 = OpLabel\n      %24492 = OpShiftRightLogical %uint %16376 %int_2\n      %13382 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24492\n      %12630 = OpLoad %uint %13382\n      %11726 = OpIAdd %uint %24492 %uint_1\n       %6420 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11726\n      %23668 = OpLoad %uint %6420\n      %11727 = OpIAdd %uint %24492 %uint_2\n       %6421 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11727\n      %23669 = OpLoad %uint %6421\n      %11728 = OpIAdd %uint %24492 %uint_3\n      %24585 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11728\n      %16388 = OpLoad %uint %24585\n      %20793 = OpCompositeConstruct %v4uint %12630 %23668 %23669 %16388\n               OpBranch %20300\n      %20300 = OpLabel\n      %10946 = OpPhi %v4uint %20793 %6597 %20792 %8965\n               OpSelectionMerge %16227 None\n               OpSwitch %8576 %19454 0 %14588 1 %14588 2 %7361 10 %7361 3 %7360 12 %7360 4 %8193 6 %8249\n       %8249 = OpLabel\n      %24416 = OpCompositeExtract %uint %10946 0\n      %24685 = OpExtInst %v2float %1 UnpackHalf2x16 %24416\n      %10118 = OpCompositeExtract %float %24685 0\n      %17496 = OpCompositeExtract %float %24685 1\n      %14622 = OpCompositeConstruct %v4float %10118 %17496 %float_0 %float_0\n      %17292 = OpCompositeExtract %uint %10946 1\n      %18045 = OpExtInst %v2float %1 UnpackHalf2x16 %17292\n      %10119 = OpCompositeExtract %float %18045 0\n      %17497 = OpCompositeExtract %float %18045 1\n      %14623 = OpCompositeConstruct %v4float %10119 %17497 %float_0 %float_0\n      %17293 = OpCompositeExtract %uint %10946 2\n      %18046 = OpExtInst %v2float %1 UnpackHalf2x16 %17293\n      %10120 = OpCompositeExtract %float %18046 0\n      %17498 = OpCompositeExtract %float %18046 1\n      %14624 = OpCompositeConstruct %v4float %10120 %17498 %float_0 %float_0\n      %17294 = OpCompositeExtract %uint %10946 3\n      %18047 = OpExtInst %v2float %1 UnpackHalf2x16 %17294\n      %10121 = OpCompositeExtract %float %18047 0\n      %20676 = OpCompositeExtract %float %18047 1\n       %9048 = OpCompositeConstruct %v4float %10121 %20676 %float_0 %float_0\n               OpBranch %16227\n       %8193 = OpLabel\n      %12433 = OpCompositeExtract %uint %10946 0\n      %22688 = OpBitcast %int %12433\n      %18223 = OpCompositeConstruct %v2int %22688 %22688\n      %18361 = OpShiftLeftLogical %v2int %18223 %1959\n      %13347 = OpShiftRightArithmetic %v2int %18361 %2151\n      %10939 = OpConvertSToF %v2float %13347\n      %18259 = OpVectorTimesScalar %v2float %10939 %float_0_000976592302\n      %24082 = OpExtInst %v2float %1 FMax %73 %18259\n      %24342 = OpCompositeExtract %float %24082 0\n      %15581 = OpCompositeExtract %float %24082 1\n      %16679 = OpCompositeConstruct %v4float %24342 %15581 %float_0 %float_0\n      %19531 = OpCompositeExtract %uint %10946 1\n      %16042 = OpBitcast %int %19531\n      %18224 = OpCompositeConstruct %v2int %16042 %16042\n      %18362 = OpShiftLeftLogical %v2int %18224 %1959\n      %13348 = OpShiftRightArithmetic %v2int %18362 %2151\n      %10940 = OpConvertSToF %v2float %13348\n      %18260 = OpVectorTimesScalar %v2float %10940 %float_0_000976592302\n      %24083 = OpExtInst %v2float %1 FMax %73 %18260\n      %24343 = OpCompositeExtract %float %24083 0\n      %15582 = OpCompositeExtract %float %24083 1\n      %16680 = OpCompositeConstruct %v4float %24343 %15582 %float_0 %float_0\n      %19532 = OpCompositeExtract %uint %10946 2\n      %16043 = OpBitcast %int %19532\n      %18225 = OpCompositeConstruct %v2int %16043 %16043\n      %18363 = OpShiftLeftLogical %v2int %18225 %1959\n      %13349 = OpShiftRightArithmetic %v2int %18363 %2151\n      %10941 = OpConvertSToF %v2float %13349\n      %18261 = OpVectorTimesScalar %v2float %10941 %float_0_000976592302\n      %24084 = OpExtInst %v2float %1 FMax %73 %18261\n      %24344 = OpCompositeExtract %float %24084 0\n      %15583 = OpCompositeExtract %float %24084 1\n      %16681 = OpCompositeConstruct %v4float %24344 %15583 %float_0 %float_0\n      %19533 = OpCompositeExtract %uint %10946 3\n      %16044 = OpBitcast %int %19533\n      %18226 = OpCompositeConstruct %v2int %16044 %16044\n      %18364 = OpShiftLeftLogical %v2int %18226 %1959\n      %13350 = OpShiftRightArithmetic %v2int %18364 %2151\n      %10942 = OpConvertSToF %v2float %13350\n      %18262 = OpVectorTimesScalar %v2float %10942 %float_0_000976592302\n      %24085 = OpExtInst %v2float %1 FMax %73 %18262\n      %24345 = OpCompositeExtract %float %24085 0\n      %18767 = OpCompositeExtract %float %24085 1\n       %9049 = OpCompositeConstruct %v4float %24345 %18767 %float_0 %float_0\n               OpBranch %16227\n       %7360 = OpLabel\n      %22214 = OpCompositeExtract %uint %10946 0\n      %20243 = OpCompositeConstruct %v3uint %22214 %22214 %22214\n      %11036 = OpShiftRightLogical %v3uint %20243 %2996\n      %24050 = OpBitwiseAnd %v3uint %11036 %261\n      %18612 = OpBitwiseAnd %v3uint %11036 %1126\n      %23452 = OpShiftRightLogical %v3uint %24050 %2828\n      %16597 = OpIEqual %v3bool %23452 %2578\n      %11351 = OpExtInst %v3int %1 FindUMsb %18612\n      %10785 = OpBitcast %v3uint %11351\n       %6278 = OpISub %v3uint %2828 %10785\n       %8732 = OpIAdd %v3uint %10785 %2360\n      %10363 = OpSelect %v3uint %16597 %8732 %23452\n      %23264 = OpShiftLeftLogical %v3uint %18612 %6278\n      %18854 = OpBitwiseAnd %v3uint %23264 %1126\n      %10947 = OpSelect %v3uint %16597 %18854 %18612\n      %24586 = OpIAdd %v3uint %10363 %1018\n      %20363 = OpShiftLeftLogical %v3uint %24586 %393\n      %16306 = OpShiftLeftLogical %v3uint %10947 %141\n      %22408 = OpBitwiseOr %v3uint %20363 %16306\n      %13836 = OpIEqual %v3bool %24050 %2578\n      %16974 = OpSelect %v3uint %13836 %2578 %22408\n      %10715 = OpBitcast %v3float %16974\n      %19376 = OpShiftRightLogical %uint %22214 %uint_30\n      %18458 = OpConvertUToF %float %19376\n      %15915 = OpFMul %float %18458 %float_0_333333343\n      %21454 = OpCompositeExtract %float %10715 0\n      %10849 = OpCompositeExtract %float %10715 1\n       %7842 = OpCompositeExtract %float %10715 2\n      %15843 = OpCompositeConstruct %v4float %21454 %10849 %7842 %15915\n      %10238 = OpCompositeExtract %uint %10946 1\n      %13591 = OpCompositeConstruct %v3uint %10238 %10238 %10238\n      %11037 = OpShiftRightLogical %v3uint %13591 %2996\n      %24051 = OpBitwiseAnd %v3uint %11037 %261\n      %18613 = OpBitwiseAnd %v3uint %11037 %1126\n      %23453 = OpShiftRightLogical %v3uint %24051 %2828\n      %16598 = OpIEqual %v3bool %23453 %2578\n      %11352 = OpExtInst %v3int %1 FindUMsb %18613\n      %10786 = OpBitcast %v3uint %11352\n       %6279 = OpISub %v3uint %2828 %10786\n       %8733 = OpIAdd %v3uint %10786 %2360\n      %10364 = OpSelect %v3uint %16598 %8733 %23453\n      %23265 = OpShiftLeftLogical %v3uint %18613 %6279\n      %18855 = OpBitwiseAnd %v3uint %23265 %1126\n      %10948 = OpSelect %v3uint %16598 %18855 %18613\n      %24587 = OpIAdd %v3uint %10364 %1018\n      %20364 = OpShiftLeftLogical %v3uint %24587 %393\n      %16307 = OpShiftLeftLogical %v3uint %10948 %141\n      %22409 = OpBitwiseOr %v3uint %20364 %16307\n      %13837 = OpIEqual %v3bool %24051 %2578\n      %16975 = OpSelect %v3uint %13837 %2578 %22409\n      %10716 = OpBitcast %v3float %16975\n      %19377 = OpShiftRightLogical %uint %10238 %uint_30\n      %18459 = OpConvertUToF %float %19377\n      %15916 = OpFMul %float %18459 %float_0_333333343\n      %21455 = OpCompositeExtract %float %10716 0\n      %10850 = OpCompositeExtract %float %10716 1\n       %7843 = OpCompositeExtract %float %10716 2\n      %15844 = OpCompositeConstruct %v4float %21455 %10850 %7843 %15916\n      %10239 = OpCompositeExtract %uint %10946 2\n      %13592 = OpCompositeConstruct %v3uint %10239 %10239 %10239\n      %11038 = OpShiftRightLogical %v3uint %13592 %2996\n      %24052 = OpBitwiseAnd %v3uint %11038 %261\n      %18614 = OpBitwiseAnd %v3uint %11038 %1126\n      %23454 = OpShiftRightLogical %v3uint %24052 %2828\n      %16599 = OpIEqual %v3bool %23454 %2578\n      %11353 = OpExtInst %v3int %1 FindUMsb %18614\n      %10787 = OpBitcast %v3uint %11353\n       %6280 = OpISub %v3uint %2828 %10787\n       %8734 = OpIAdd %v3uint %10787 %2360\n      %10365 = OpSelect %v3uint %16599 %8734 %23454\n      %23266 = OpShiftLeftLogical %v3uint %18614 %6280\n      %18856 = OpBitwiseAnd %v3uint %23266 %1126\n      %10949 = OpSelect %v3uint %16599 %18856 %18614\n      %24588 = OpIAdd %v3uint %10365 %1018\n      %20365 = OpShiftLeftLogical %v3uint %24588 %393\n      %16308 = OpShiftLeftLogical %v3uint %10949 %141\n      %22410 = OpBitwiseOr %v3uint %20365 %16308\n      %13838 = OpIEqual %v3bool %24052 %2578\n      %16976 = OpSelect %v3uint %13838 %2578 %22410\n      %10717 = OpBitcast %v3float %16976\n      %19378 = OpShiftRightLogical %uint %10239 %uint_30\n      %18460 = OpConvertUToF %float %19378\n      %15917 = OpFMul %float %18460 %float_0_333333343\n      %21456 = OpCompositeExtract %float %10717 0\n      %10851 = OpCompositeExtract %float %10717 1\n       %7844 = OpCompositeExtract %float %10717 2\n      %15845 = OpCompositeConstruct %v4float %21456 %10851 %7844 %15917\n      %10240 = OpCompositeExtract %uint %10946 3\n      %13593 = OpCompositeConstruct %v3uint %10240 %10240 %10240\n      %11039 = OpShiftRightLogical %v3uint %13593 %2996\n      %24053 = OpBitwiseAnd %v3uint %11039 %261\n      %18615 = OpBitwiseAnd %v3uint %11039 %1126\n      %23455 = OpShiftRightLogical %v3uint %24053 %2828\n      %16600 = OpIEqual %v3bool %23455 %2578\n      %11354 = OpExtInst %v3int %1 FindUMsb %18615\n      %10788 = OpBitcast %v3uint %11354\n       %6281 = OpISub %v3uint %2828 %10788\n       %8735 = OpIAdd %v3uint %10788 %2360\n      %10366 = OpSelect %v3uint %16600 %8735 %23455\n      %23267 = OpShiftLeftLogical %v3uint %18615 %6281\n      %18857 = OpBitwiseAnd %v3uint %23267 %1126\n      %10950 = OpSelect %v3uint %16600 %18857 %18615\n      %24589 = OpIAdd %v3uint %10366 %1018\n      %20366 = OpShiftLeftLogical %v3uint %24589 %393\n      %16309 = OpShiftLeftLogical %v3uint %10950 %141\n      %22411 = OpBitwiseOr %v3uint %20366 %16309\n      %13839 = OpIEqual %v3bool %24053 %2578\n      %16977 = OpSelect %v3uint %13839 %2578 %22411\n      %10718 = OpBitcast %v3float %16977\n      %19379 = OpShiftRightLogical %uint %10240 %uint_30\n      %18461 = OpConvertUToF %float %19379\n      %15918 = OpFMul %float %18461 %float_0_333333343\n      %21457 = OpCompositeExtract %float %10718 0\n      %10852 = OpCompositeExtract %float %10718 1\n      %11040 = OpCompositeExtract %float %10718 2\n       %9050 = OpCompositeConstruct %v4float %21457 %10852 %11040 %15918\n               OpBranch %16227\n       %7361 = OpLabel\n      %22215 = OpCompositeExtract %uint %10946 0\n      %20244 = OpCompositeConstruct %v4uint %22215 %22215 %22215 %22215\n       %9392 = OpShiftRightLogical %v4uint %20244 %845\n      %18871 = OpBitwiseAnd %v4uint %9392 %635\n      %15552 = OpConvertUToF %v4float %18871\n      %16697 = OpFMul %v4float %15552 %2798\n      %23771 = OpCompositeExtract %uint %10946 1\n      %20822 = OpCompositeConstruct %v4uint %23771 %23771 %23771 %23771\n       %9393 = OpShiftRightLogical %v4uint %20822 %845\n      %18872 = OpBitwiseAnd %v4uint %9393 %635\n      %15553 = OpConvertUToF %v4float %18872\n      %16698 = OpFMul %v4float %15553 %2798\n      %23772 = OpCompositeExtract %uint %10946 2\n      %20823 = OpCompositeConstruct %v4uint %23772 %23772 %23772 %23772\n       %9394 = OpShiftRightLogical %v4uint %20823 %845\n      %18873 = OpBitwiseAnd %v4uint %9394 %635\n      %15554 = OpConvertUToF %v4float %18873\n      %16699 = OpFMul %v4float %15554 %2798\n      %23773 = OpCompositeExtract %uint %10946 3\n      %20828 = OpCompositeConstruct %v4uint %23773 %23773 %23773 %23773\n       %9395 = OpShiftRightLogical %v4uint %20828 %845\n      %18874 = OpBitwiseAnd %v4uint %9395 %635\n      %18738 = OpConvertUToF %v4float %18874\n       %9890 = OpFMul %v4float %18738 %2798\n               OpBranch %16227\n      %14588 = OpLabel\n      %22216 = OpCompositeExtract %uint %10946 0\n      %20245 = OpCompositeConstruct %v4uint %22216 %22216 %22216 %22216\n       %9396 = OpShiftRightLogical %v4uint %20245 %653\n      %19042 = OpBitwiseAnd %v4uint %9396 %1611\n      %13995 = OpConvertUToF %v4float %19042\n      %19244 = OpVectorTimesScalar %v4float %13995 %float_0_00392156886\n       %8616 = OpCompositeExtract %uint %10946 1\n      %24852 = OpCompositeConstruct %v4uint %8616 %8616 %8616 %8616\n       %9397 = OpShiftRightLogical %v4uint %24852 %653\n      %19043 = OpBitwiseAnd %v4uint %9397 %1611\n      %13996 = OpConvertUToF %v4float %19043\n      %19245 = OpVectorTimesScalar %v4float %13996 %float_0_00392156886\n       %8617 = OpCompositeExtract %uint %10946 2\n      %24853 = OpCompositeConstruct %v4uint %8617 %8617 %8617 %8617\n       %9398 = OpShiftRightLogical %v4uint %24853 %653\n      %19044 = OpBitwiseAnd %v4uint %9398 %1611\n      %13997 = OpConvertUToF %v4float %19044\n      %19246 = OpVectorTimesScalar %v4float %13997 %float_0_00392156886\n       %8618 = OpCompositeExtract %uint %10946 3\n      %24854 = OpCompositeConstruct %v4uint %8618 %8618 %8618 %8618\n       %9399 = OpShiftRightLogical %v4uint %24854 %653\n      %19045 = OpBitwiseAnd %v4uint %9399 %1611\n      %17181 = OpConvertUToF %v4float %19045\n      %12437 = OpVectorTimesScalar %v4float %17181 %float_0_00392156886\n               OpBranch %16227\n      %19454 = OpLabel\n      %12438 = OpCompositeExtract %uint %10946 0\n      %20465 = OpBitcast %float %12438\n      %17215 = OpCompositeConstruct %v2float %20465 %float_0\n      %11673 = OpVectorShuffle %v4float %17215 %17215 0 1 1 1\n      %22202 = OpCompositeExtract %uint %10946 1\n      %16241 = OpBitcast %float %22202\n      %17216 = OpCompositeConstruct %v2float %16241 %float_0\n      %11674 = OpVectorShuffle %v4float %17216 %17216 0 1 1 1\n      %22203 = OpCompositeExtract %uint %10946 2\n      %16242 = OpBitcast %float %22203\n      %17217 = OpCompositeConstruct %v2float %16242 %float_0\n      %11675 = OpVectorShuffle %v4float %17217 %17217 0 1 1 1\n      %22204 = OpCompositeExtract %uint %10946 3\n      %16243 = OpBitcast %float %22204\n      %20401 = OpCompositeConstruct %v2float %16243 %float_0\n      %23101 = OpVectorShuffle %v4float %20401 %20401 0 1 1 1\n               OpBranch %16227\n      %16227 = OpLabel\n      %11184 = OpPhi %v4float %23101 %19454 %12437 %14588 %9890 %7361 %9050 %7360 %9049 %8193 %9048 %8249\n      %14353 = OpPhi %v4float %11675 %19454 %19246 %14588 %16699 %7361 %15845 %7360 %16681 %8193 %14624 %8249\n      %15235 = OpPhi %v4float %11674 %19454 %19245 %14588 %16698 %7361 %15844 %7360 %16680 %8193 %14623 %8249\n      %14524 = OpPhi %v4float %11673 %19454 %19244 %14588 %16697 %7361 %15843 %7360 %16679 %8193 %14622 %8249\n               OpBranch %21266\n      %15208 = OpLabel\n      %21587 = OpIEqual %bool %6555 %uint_8\n               OpSelectionMerge %20265 DontFlatten\n               OpBranchConditional %21587 %6598 %8966\n       %8966 = OpLabel\n      %22071 = OpShiftRightLogical %uint %16376 %int_2\n      %13383 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22071\n      %12631 = OpLoad %uint %13383\n      %11729 = OpIAdd %uint %22071 %uint_1\n       %6422 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11729\n       %7033 = OpLoad %uint %6422\n       %8524 = OpIAdd %uint %16376 %6555\n      %21677 = OpShiftRightLogical %uint %8524 %int_2\n      %19613 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21677\n      %12632 = OpLoad %uint %19613\n      %11730 = OpIAdd %uint %21677 %uint_1\n      %24590 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11730\n      %14160 = OpLoad %uint %24590\n      %19674 = OpCompositeConstruct %v4uint %12631 %7033 %12632 %14160\n      %19502 = OpIMul %uint %uint_2 %6555\n      %10824 = OpIAdd %uint %16376 %19502\n      %17904 = OpShiftRightLogical %uint %10824 %int_2\n      %19614 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17904\n      %12633 = OpLoad %uint %19614\n      %11731 = OpIAdd %uint %17904 %uint_1\n       %6478 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11731\n      %24158 = OpLoad %uint %6478\n       %8696 = OpIMul %uint %uint_3 %6555\n      %24266 = OpIAdd %uint %16376 %8696\n      %17905 = OpShiftRightLogical %uint %24266 %int_2\n      %19615 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17905\n      %12634 = OpLoad %uint %19615\n      %11732 = OpIAdd %uint %17905 %uint_1\n      %24591 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11732\n      %16389 = OpLoad %uint %24591\n      %20794 = OpCompositeConstruct %v4uint %12633 %24158 %12634 %16389\n               OpBranch %20265\n       %6598 = OpLabel\n      %24493 = OpShiftRightLogical %uint %16376 %int_2\n      %13384 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24493\n      %12635 = OpLoad %uint %13384\n      %11733 = OpIAdd %uint %24493 %uint_1\n       %6423 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11733\n      %23670 = OpLoad %uint %6423\n      %11734 = OpIAdd %uint %24493 %uint_2\n       %6424 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11734\n      %23671 = OpLoad %uint %6424\n      %11735 = OpIAdd %uint %24493 %uint_3\n      %24592 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11735\n      %14083 = OpLoad %uint %24592\n      %21619 = OpCompositeConstruct %v4uint %12635 %23670 %23671 %14083\n      %19334 = OpIAdd %uint %16376 %uint_16\n       %8240 = OpShiftRightLogical %uint %19334 %int_2\n      %19616 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %8240\n      %12636 = OpLoad %uint %19616\n      %11736 = OpIAdd %uint %8240 %uint_1\n       %6425 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11736\n      %23672 = OpLoad %uint %6425\n      %11737 = OpIAdd %uint %8240 %uint_2\n       %6426 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11737\n      %23673 = OpLoad %uint %6426\n      %11738 = OpIAdd %uint %8240 %uint_3\n      %24593 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11738\n      %16390 = OpLoad %uint %24593\n      %20795 = OpCompositeConstruct %v4uint %12636 %23672 %23673 %16390\n               OpBranch %20265\n      %20265 = OpLabel\n      %11216 = OpPhi %v4uint %20795 %6598 %20794 %8966\n      %14115 = OpPhi %v4uint %21619 %6598 %19674 %8966\n               OpSelectionMerge %20266 None\n               OpSwitch %8576 %20313 5 %8539 7 %8250\n       %8250 = OpLabel\n      %24417 = OpCompositeExtract %uint %14115 0\n      %24686 = OpExtInst %v2float %1 UnpackHalf2x16 %24417\n      %10122 = OpCompositeExtract %float %24686 0\n      %16068 = OpCompositeExtract %float %24686 1\n      %17037 = OpCompositeExtract %uint %14115 1\n      %15617 = OpExtInst %v2float %1 UnpackHalf2x16 %17037\n      %10123 = OpCompositeExtract %float %15617 0\n      %17499 = OpCompositeExtract %float %15617 1\n      %14625 = OpCompositeConstruct %v4float %10122 %16068 %10123 %17499\n      %17295 = OpCompositeExtract %uint %14115 2\n      %18048 = OpExtInst %v2float %1 UnpackHalf2x16 %17295\n      %10124 = OpCompositeExtract %float %18048 0\n      %16069 = OpCompositeExtract %float %18048 1\n      %17038 = OpCompositeExtract %uint %14115 3\n      %15618 = OpExtInst %v2float %1 UnpackHalf2x16 %17038\n      %10125 = OpCompositeExtract %float %15618 0\n      %17500 = OpCompositeExtract %float %15618 1\n      %14626 = OpCompositeConstruct %v4float %10124 %16069 %10125 %17500\n      %17296 = OpCompositeExtract %uint %11216 0\n      %18049 = OpExtInst %v2float %1 UnpackHalf2x16 %17296\n      %10126 = OpCompositeExtract %float %18049 0\n      %16070 = OpCompositeExtract %float %18049 1\n      %17039 = OpCompositeExtract %uint %11216 1\n      %15619 = OpExtInst %v2float %1 UnpackHalf2x16 %17039\n      %10127 = OpCompositeExtract %float %15619 0\n      %17501 = OpCompositeExtract %float %15619 1\n      %14627 = OpCompositeConstruct %v4float %10126 %16070 %10127 %17501\n      %17297 = OpCompositeExtract %uint %11216 2\n      %18050 = OpExtInst %v2float %1 UnpackHalf2x16 %17297\n      %10128 = OpCompositeExtract %float %18050 0\n      %16071 = OpCompositeExtract %float %18050 1\n      %17040 = OpCompositeExtract %uint %11216 3\n      %15620 = OpExtInst %v2float %1 UnpackHalf2x16 %17040\n      %10129 = OpCompositeExtract %float %15620 0\n      %20677 = OpCompositeExtract %float %15620 1\n       %9051 = OpCompositeConstruct %v4float %10128 %16071 %10129 %20677\n               OpBranch %20266\n       %8539 = OpLabel\n       %9726 = OpVectorShuffle %v2uint %14115 %14115 0 1\n      %23359 = OpBitcast %v2int %9726\n      %24794 = OpVectorShuffle %v4int %23359 %23359 0 0 1 1\n      %18616 = OpShiftLeftLogical %v4int %24794 %290\n      %15769 = OpShiftRightArithmetic %v4int %18616 %770\n      %10951 = OpConvertSToF %v4float %15769\n      %18227 = OpVectorTimesScalar %v4float %10951 %float_0_000976592302\n      %25242 = OpExtInst %v4float %1 FMax %1284 %18227\n      %14196 = OpVectorShuffle %v2uint %14115 %14115 2 3\n       %9416 = OpBitcast %v2int %14196\n      %24795 = OpVectorShuffle %v4int %9416 %9416 0 0 1 1\n      %18617 = OpShiftLeftLogical %v4int %24795 %290\n      %15770 = OpShiftRightArithmetic %v4int %18617 %770\n      %10952 = OpConvertSToF %v4float %15770\n      %18228 = OpVectorTimesScalar %v4float %10952 %float_0_000976592302\n      %25243 = OpExtInst %v4float %1 FMax %1284 %18228\n      %14197 = OpVectorShuffle %v2uint %11216 %11216 0 1\n       %9417 = OpBitcast %v2int %14197\n      %24796 = OpVectorShuffle %v4int %9417 %9417 0 0 1 1\n      %18618 = OpShiftLeftLogical %v4int %24796 %290\n      %15771 = OpShiftRightArithmetic %v4int %18618 %770\n      %10953 = OpConvertSToF %v4float %15771\n      %18229 = OpVectorTimesScalar %v4float %10953 %float_0_000976592302\n      %25244 = OpExtInst %v4float %1 FMax %1284 %18229\n      %14198 = OpVectorShuffle %v2uint %11216 %11216 2 3\n       %9418 = OpBitcast %v2int %14198\n      %24797 = OpVectorShuffle %v4int %9418 %9418 0 0 1 1\n      %18620 = OpShiftLeftLogical %v4int %24797 %290\n      %15772 = OpShiftRightArithmetic %v4int %18620 %770\n      %10954 = OpConvertSToF %v4float %15772\n      %21458 = OpVectorTimesScalar %v4float %10954 %float_0_000976592302\n      %17253 = OpExtInst %v4float %1 FMax %1284 %21458\n               OpBranch %20266\n      %20313 = OpLabel\n       %9764 = OpVectorShuffle %v2uint %14115 %14115 0 1\n      %20829 = OpBitcast %v2float %9764\n       %7047 = OpCompositeExtract %float %20829 0\n      %13427 = OpCompositeExtract %float %20829 1\n      %17041 = OpCompositeConstruct %v4float %7047 %13427 %float_0 %float_0\n      %16865 = OpVectorShuffle %v2uint %14115 %14115 2 3\n      %14182 = OpBitcast %v2float %16865\n       %7048 = OpCompositeExtract %float %14182 0\n      %13428 = OpCompositeExtract %float %14182 1\n      %17042 = OpCompositeConstruct %v4float %7048 %13428 %float_0 %float_0\n      %16866 = OpVectorShuffle %v2uint %11216 %11216 0 1\n      %14183 = OpBitcast %v2float %16866\n       %7049 = OpCompositeExtract %float %14183 0\n      %13429 = OpCompositeExtract %float %14183 1\n      %17043 = OpCompositeConstruct %v4float %7049 %13429 %float_0 %float_0\n      %16867 = OpVectorShuffle %v2uint %11216 %11216 2 3\n      %14184 = OpBitcast %v2float %16867\n       %7050 = OpCompositeExtract %float %14184 0\n      %16651 = OpCompositeExtract %float %14184 1\n       %9052 = OpCompositeConstruct %v4float %7050 %16651 %float_0 %float_0\n               OpBranch %20266\n      %20266 = OpLabel\n      %11185 = OpPhi %v4float %9052 %20313 %17253 %8539 %9051 %8250\n      %14354 = OpPhi %v4float %17043 %20313 %25244 %8539 %14627 %8250\n      %15236 = OpPhi %v4float %17042 %20313 %25243 %8539 %14626 %8250\n      %14525 = OpPhi %v4float %17041 %20313 %25242 %8539 %14625 %8250\n               OpBranch %21266\n      %21266 = OpLabel\n      %11186 = OpPhi %v4float %11185 %20266 %11184 %16227\n      %14355 = OpPhi %v4float %14354 %20266 %14353 %16227\n      %12951 = OpPhi %v4float %15236 %20266 %15235 %16227\n      %13948 = OpPhi %v4float %14525 %20266 %14524 %16227\n      %17243 = OpFAdd %v4float %17242 %13948\n      %23299 = OpFAdd %v4float %23298 %12951\n       %9507 = OpFAdd %v4float %7208 %14355\n       %7799 = OpFAdd %v4float %9642 %11186\n               OpBranch %24267\n      %24267 = OpLabel\n      %11187 = OpPhi %v4float %20755 %21264 %7799 %21266\n      %14356 = OpPhi %v4float %8082 %21264 %9507 %21266\n      %15153 = OpPhi %v4float %23297 %21264 %23299 %21266\n      %15237 = OpPhi %v4float %17241 %21264 %17243 %21266\n      %14526 = OpPhi %float %25083 %21264 %12090 %21266\n               OpBranch %21267\n      %21267 = OpLabel\n      %11188 = OpPhi %v4float %11177 %21263 %11187 %24267\n      %14357 = OpPhi %v4float %14346 %21263 %14356 %24267\n      %15154 = OpPhi %v4float %13804 %21263 %15153 %24267\n      %13196 = OpPhi %v4float %8403 %21263 %15237 %24267\n      %11944 = OpPhi %float %11052 %21263 %14526 %24267\n      %23156 = OpVectorTimesScalar %v4float %13196 %11944\n       %6604 = OpVectorTimesScalar %v4float %15154 %11944\n      %12399 = OpVectorTimesScalar %v4float %14357 %11944\n      %13362 = OpVectorTimesScalar %v4float %11188 %11944\n               OpSelectionMerge %16228 DontFlatten\n               OpBranchConditional %7475 %10049 %16228\n      %10049 = OpLabel\n      %15086 = OpVectorShuffle %v4float %23156 %23156 2 1 0 3\n      %14855 = OpVectorShuffle %v4float %6604 %6604 2 1 0 3\n       %7398 = OpVectorShuffle %v4float %12399 %12399 2 1 0 3\n      %16111 = OpVectorShuffle %v4float %13362 %13362 2 1 0 3\n               OpBranch %16228\n      %16228 = OpLabel\n      %11189 = OpPhi %v4float %13362 %21267 %16111 %10049\n      %14358 = OpPhi %v4float %12399 %21267 %7398 %10049\n      %15191 = OpPhi %v4float %6604 %21267 %14855 %10049\n      %14921 = OpPhi %v4float %23156 %21267 %15086 %10049\n               OpSelectionMerge %18834 None\n               OpSwitch %20627 %8194 6 %18070 14 %18070 50 %18070 7 %17906 54 %17906 16 %6453 55 %6453 17 %6452 56 %6452 25 %6451 31 %9492\n       %9492 = OpLabel\n      %15022 = OpCompositeExtract %float %14921 0\n       %9197 = OpCompositeExtract %float %14921 1\n      %19232 = OpCompositeConstruct %v2float %15022 %9197\n       %8561 = OpExtInst %uint %1 PackHalf2x16 %19232\n      %23487 = OpCompositeExtract %float %15191 0\n      %14759 = OpCompositeExtract %float %15191 1\n      %19233 = OpCompositeConstruct %v2float %23487 %14759\n       %8562 = OpExtInst %uint %1 PackHalf2x16 %19233\n      %23488 = OpCompositeExtract %float %14358 0\n      %14760 = OpCompositeExtract %float %14358 1\n      %19234 = OpCompositeConstruct %v2float %23488 %14760\n       %8563 = OpExtInst %uint %1 PackHalf2x16 %19234\n      %23489 = OpCompositeExtract %float %11189 0\n      %14761 = OpCompositeExtract %float %11189 1\n      %19213 = OpCompositeConstruct %v2float %23489 %14761\n      %11926 = OpExtInst %uint %1 PackHalf2x16 %19213\n      %24879 = OpCompositeConstruct %v4uint %8561 %8562 %8563 %11926\n               OpBranch %18834\n       %6451 = OpLabel\n       %8826 = OpVectorShuffle %v2float %14921 %14921 0 1\n      %23729 = OpExtInst %v2float %1 FClamp %8826 %1823 %768\n       %9652 = OpVectorTimesScalar %v2float %23729 %float_65535\n      %11878 = OpFAdd %v2float %9652 %1566\n       %7639 = OpConvertFToU %v2uint %11878\n       %8700 = OpCompositeExtract %uint %7639 0\n      %12251 = OpCompositeExtract %uint %7639 1\n      %11523 = OpShiftLeftLogical %uint %12251 %int_16\n      %16707 = OpBitwiseOr %uint %8700 %11523\n       %9053 = OpVectorShuffle %v2float %15191 %15191 0 1\n      %18111 = OpExtInst %v2float %1 FClamp %9053 %1823 %768\n       %9653 = OpVectorTimesScalar %v2float %18111 %float_65535\n      %11879 = OpFAdd %v2float %9653 %1566\n       %7641 = OpConvertFToU %v2uint %11879\n       %8701 = OpCompositeExtract %uint %7641 0\n      %12252 = OpCompositeExtract %uint %7641 1\n      %11524 = OpShiftLeftLogical %uint %12252 %int_16\n      %16708 = OpBitwiseOr %uint %8701 %11524\n       %9054 = OpVectorShuffle %v2float %14358 %14358 0 1\n      %18112 = OpExtInst %v2float %1 FClamp %9054 %1823 %768\n       %9654 = OpVectorTimesScalar %v2float %18112 %float_65535\n      %11881 = OpFAdd %v2float %9654 %1566\n       %7642 = OpConvertFToU %v2uint %11881\n       %8702 = OpCompositeExtract %uint %7642 0\n      %12253 = OpCompositeExtract %uint %7642 1\n      %11525 = OpShiftLeftLogical %uint %12253 %int_16\n      %16709 = OpBitwiseOr %uint %8702 %11525\n       %9055 = OpVectorShuffle %v2float %11189 %11189 0 1\n      %18113 = OpExtInst %v2float %1 FClamp %9055 %1823 %768\n       %9655 = OpVectorTimesScalar %v2float %18113 %float_65535\n      %11882 = OpFAdd %v2float %9655 %1566\n       %7643 = OpConvertFToU %v2uint %11882\n       %8703 = OpCompositeExtract %uint %7643 0\n      %12254 = OpCompositeExtract %uint %7643 1\n      %11542 = OpShiftLeftLogical %uint %12254 %int_16\n      %20994 = OpBitwiseOr %uint %8703 %11542\n      %21469 = OpCompositeConstruct %v4uint %16707 %16708 %16709 %20994\n               OpBranch %18834\n       %6452 = OpLabel\n       %8655 = OpVectorShuffle %v3float %14921 %14921 0 1 2\n       %6215 = OpExtInst %v3float %1 FClamp %8655 %2605 %2584\n       %7105 = OpFMul %v3float %6215 %14\n       %7962 = OpFAdd %v3float %7105 %939\n      %10066 = OpConvertFToU %v3uint %7962\n       %8704 = OpCompositeExtract %uint %10066 0\n      %12255 = OpCompositeExtract %uint %10066 1\n      %11561 = OpShiftLeftLogical %uint %12255 %int_10\n      %19814 = OpBitwiseOr %uint %8704 %11561\n      %21476 = OpCompositeExtract %uint %10066 2\n       %8525 = OpShiftLeftLogical %uint %21476 %int_21\n      %16710 = OpBitwiseOr %uint %19814 %8525\n       %8866 = OpVectorShuffle %v3float %15191 %15191 0 1 2\n      %19668 = OpExtInst %v3float %1 FClamp %8866 %2605 %2584\n       %7106 = OpFMul %v3float %19668 %14\n       %7963 = OpFAdd %v3float %7106 %939\n      %10067 = OpConvertFToU %v3uint %7963\n       %8705 = OpCompositeExtract %uint %10067 0\n      %12256 = OpCompositeExtract %uint %10067 1\n      %11562 = OpShiftLeftLogical %uint %12256 %int_10\n      %19815 = OpBitwiseOr %uint %8705 %11562\n      %21477 = OpCompositeExtract %uint %10067 2\n       %8526 = OpShiftLeftLogical %uint %21477 %int_21\n      %16711 = OpBitwiseOr %uint %19815 %8526\n       %8867 = OpVectorShuffle %v3float %14358 %14358 0 1 2\n      %19669 = OpExtInst %v3float %1 FClamp %8867 %2605 %2584\n       %7107 = OpFMul %v3float %19669 %14\n       %7964 = OpFAdd %v3float %7107 %939\n      %10068 = OpConvertFToU %v3uint %7964\n       %8706 = OpCompositeExtract %uint %10068 0\n      %12257 = OpCompositeExtract %uint %10068 1\n      %11563 = OpShiftLeftLogical %uint %12257 %int_10\n      %19816 = OpBitwiseOr %uint %8706 %11563\n      %21478 = OpCompositeExtract %uint %10068 2\n       %8527 = OpShiftLeftLogical %uint %21478 %int_21\n      %16712 = OpBitwiseOr %uint %19816 %8527\n       %8868 = OpVectorShuffle %v3float %11189 %11189 0 1 2\n      %19675 = OpExtInst %v3float %1 FClamp %8868 %2605 %2584\n       %7108 = OpFMul %v3float %19675 %14\n       %7965 = OpFAdd %v3float %7108 %939\n      %10069 = OpConvertFToU %v3uint %7965\n       %8707 = OpCompositeExtract %uint %10069 0\n      %12258 = OpCompositeExtract %uint %10069 1\n      %11564 = OpShiftLeftLogical %uint %12258 %int_10\n      %19817 = OpBitwiseOr %uint %8707 %11564\n      %21479 = OpCompositeExtract %uint %10069 2\n       %8541 = OpShiftLeftLogical %uint %21479 %int_21\n      %20995 = OpBitwiseOr %uint %19817 %8541\n      %21470 = OpCompositeConstruct %v4uint %16710 %16711 %16712 %20995\n               OpBranch %18834\n       %6453 = OpLabel\n       %8656 = OpVectorShuffle %v3float %14921 %14921 0 1 2\n       %6216 = OpExtInst %v3float %1 FClamp %8656 %2605 %2584\n       %7109 = OpFMul %v3float %6216 %2275\n       %7966 = OpFAdd %v3float %7109 %939\n      %10070 = OpConvertFToU %v3uint %7966\n       %8708 = OpCompositeExtract %uint %10070 0\n      %12259 = OpCompositeExtract %uint %10070 1\n      %11565 = OpShiftLeftLogical %uint %12259 %int_11\n      %19818 = OpBitwiseOr %uint %8708 %11565\n      %21480 = OpCompositeExtract %uint %10070 2\n       %8528 = OpShiftLeftLogical %uint %21480 %int_22\n      %16713 = OpBitwiseOr %uint %19818 %8528\n       %8869 = OpVectorShuffle %v3float %15191 %15191 0 1 2\n      %19676 = OpExtInst %v3float %1 FClamp %8869 %2605 %2584\n       %7110 = OpFMul %v3float %19676 %2275\n       %7967 = OpFAdd %v3float %7110 %939\n      %10071 = OpConvertFToU %v3uint %7967\n       %8709 = OpCompositeExtract %uint %10071 0\n      %12260 = OpCompositeExtract %uint %10071 1\n      %11566 = OpShiftLeftLogical %uint %12260 %int_11\n      %19819 = OpBitwiseOr %uint %8709 %11566\n      %21481 = OpCompositeExtract %uint %10071 2\n       %8529 = OpShiftLeftLogical %uint %21481 %int_22\n      %16714 = OpBitwiseOr %uint %19819 %8529\n       %8870 = OpVectorShuffle %v3float %14358 %14358 0 1 2\n      %19685 = OpExtInst %v3float %1 FClamp %8870 %2605 %2584\n       %7111 = OpFMul %v3float %19685 %2275\n       %7968 = OpFAdd %v3float %7111 %939\n      %10072 = OpConvertFToU %v3uint %7968\n       %8710 = OpCompositeExtract %uint %10072 0\n      %12261 = OpCompositeExtract %uint %10072 1\n      %11567 = OpShiftLeftLogical %uint %12261 %int_11\n      %19820 = OpBitwiseOr %uint %8710 %11567\n      %21482 = OpCompositeExtract %uint %10072 2\n       %8530 = OpShiftLeftLogical %uint %21482 %int_22\n      %16715 = OpBitwiseOr %uint %19820 %8530\n       %8872 = OpVectorShuffle %v3float %11189 %11189 0 1 2\n      %19686 = OpExtInst %v3float %1 FClamp %8872 %2605 %2584\n       %7112 = OpFMul %v3float %19686 %2275\n       %7969 = OpFAdd %v3float %7112 %939\n      %10073 = OpConvertFToU %v3uint %7969\n       %8711 = OpCompositeExtract %uint %10073 0\n      %12262 = OpCompositeExtract %uint %10073 1\n      %11568 = OpShiftLeftLogical %uint %12262 %int_11\n      %19821 = OpBitwiseOr %uint %8711 %11568\n      %21483 = OpCompositeExtract %uint %10073 2\n       %8542 = OpShiftLeftLogical %uint %21483 %int_22\n      %20996 = OpBitwiseOr %uint %19821 %8542\n      %21471 = OpCompositeConstruct %v4uint %16713 %16714 %16715 %20996\n               OpBranch %18834\n      %17906 = OpLabel\n       %8873 = OpExtInst %v4float %1 FClamp %14921 %2938 %1285\n      %17792 = OpFMul %v4float %8873 %344\n       %7970 = OpFAdd %v4float %17792 %325\n      %10074 = OpConvertFToU %v4uint %7970\n       %8712 = OpCompositeExtract %uint %10074 0\n      %12263 = OpCompositeExtract %uint %10074 1\n      %11569 = OpShiftLeftLogical %uint %12263 %int_10\n      %19822 = OpBitwiseOr %uint %8712 %11569\n      %21484 = OpCompositeExtract %uint %10074 2\n       %8560 = OpShiftLeftLogical %uint %21484 %int_20\n      %19823 = OpBitwiseOr %uint %19822 %8560\n      %21485 = OpCompositeExtract %uint %10074 3\n       %7292 = OpShiftLeftLogical %uint %21485 %int_30\n       %9084 = OpBitwiseOr %uint %19823 %7292\n       %9079 = OpExtInst %v4float %1 FClamp %15191 %2938 %1285\n      %24798 = OpFMul %v4float %9079 %344\n       %7971 = OpFAdd %v4float %24798 %325\n      %10075 = OpConvertFToU %v4uint %7971\n       %8713 = OpCompositeExtract %uint %10075 0\n      %12264 = OpCompositeExtract %uint %10075 1\n      %11570 = OpShiftLeftLogical %uint %12264 %int_10\n      %19824 = OpBitwiseOr %uint %8713 %11570\n      %21486 = OpCompositeExtract %uint %10075 2\n       %8564 = OpShiftLeftLogical %uint %21486 %int_20\n      %19825 = OpBitwiseOr %uint %19824 %8564\n      %21487 = OpCompositeExtract %uint %10075 3\n       %7293 = OpShiftLeftLogical %uint %21487 %int_30\n       %9085 = OpBitwiseOr %uint %19825 %7293\n       %9080 = OpExtInst %v4float %1 FClamp %14358 %2938 %1285\n      %24799 = OpFMul %v4float %9080 %344\n       %7972 = OpFAdd %v4float %24799 %325\n      %10076 = OpConvertFToU %v4uint %7972\n       %8714 = OpCompositeExtract %uint %10076 0\n      %12265 = OpCompositeExtract %uint %10076 1\n      %11571 = OpShiftLeftLogical %uint %12265 %int_10\n      %19826 = OpBitwiseOr %uint %8714 %11571\n      %21488 = OpCompositeExtract %uint %10076 2\n       %8565 = OpShiftLeftLogical %uint %21488 %int_20\n      %19827 = OpBitwiseOr %uint %19826 %8565\n      %21489 = OpCompositeExtract %uint %10076 3\n       %7294 = OpShiftLeftLogical %uint %21489 %int_30\n       %9086 = OpBitwiseOr %uint %19827 %7294\n       %9081 = OpExtInst %v4float %1 FClamp %11189 %2938 %1285\n      %24800 = OpFMul %v4float %9081 %344\n       %7973 = OpFAdd %v4float %24800 %325\n      %10077 = OpConvertFToU %v4uint %7973\n       %8715 = OpCompositeExtract %uint %10077 0\n      %12266 = OpCompositeExtract %uint %10077 1\n      %11572 = OpShiftLeftLogical %uint %12266 %int_10\n      %19828 = OpBitwiseOr %uint %8715 %11572\n      %21490 = OpCompositeExtract %uint %10077 2\n       %8566 = OpShiftLeftLogical %uint %21490 %int_20\n      %19829 = OpBitwiseOr %uint %19828 %8566\n      %21491 = OpCompositeExtract %uint %10077 3\n       %8543 = OpShiftLeftLogical %uint %21491 %int_30\n      %20997 = OpBitwiseOr %uint %19829 %8543\n      %21472 = OpCompositeConstruct %v4uint %9084 %9085 %9086 %20997\n               OpBranch %18834\n      %18070 = OpLabel\n       %7311 = OpExtInst %v4float %1 FClamp %14921 %2938 %1285\n      %20339 = OpVectorTimesScalar %v4float %7311 %float_255\n      %11883 = OpFAdd %v4float %20339 %325\n       %7644 = OpConvertFToU %v4uint %11883\n       %8716 = OpCompositeExtract %uint %7644 0\n      %12267 = OpCompositeExtract %uint %7644 1\n      %11573 = OpShiftLeftLogical %uint %12267 %int_8\n      %19830 = OpBitwiseOr %uint %8716 %11573\n      %21492 = OpCompositeExtract %uint %7644 2\n       %8567 = OpShiftLeftLogical %uint %21492 %int_16\n      %19831 = OpBitwiseOr %uint %19830 %8567\n      %21493 = OpCompositeExtract %uint %7644 3\n       %7295 = OpShiftLeftLogical %uint %21493 %int_24\n       %9255 = OpBitwiseOr %uint %19831 %7295\n       %7522 = OpExtInst %v4float %1 FClamp %15191 %2938 %1285\n       %8264 = OpVectorTimesScalar %v4float %7522 %float_255\n      %11884 = OpFAdd %v4float %8264 %325\n       %7645 = OpConvertFToU %v4uint %11884\n       %8717 = OpCompositeExtract %uint %7645 0\n      %12268 = OpCompositeExtract %uint %7645 1\n      %11574 = OpShiftLeftLogical %uint %12268 %int_8\n      %19832 = OpBitwiseOr %uint %8717 %11574\n      %21494 = OpCompositeExtract %uint %7645 2\n       %8568 = OpShiftLeftLogical %uint %21494 %int_16\n      %19833 = OpBitwiseOr %uint %19832 %8568\n      %21495 = OpCompositeExtract %uint %7645 3\n       %7296 = OpShiftLeftLogical %uint %21495 %int_24\n       %9256 = OpBitwiseOr %uint %19833 %7296\n       %7523 = OpExtInst %v4float %1 FClamp %14358 %2938 %1285\n       %8265 = OpVectorTimesScalar %v4float %7523 %float_255\n      %11885 = OpFAdd %v4float %8265 %325\n       %7646 = OpConvertFToU %v4uint %11885\n       %8718 = OpCompositeExtract %uint %7646 0\n      %12269 = OpCompositeExtract %uint %7646 1\n      %11575 = OpShiftLeftLogical %uint %12269 %int_8\n      %19834 = OpBitwiseOr %uint %8718 %11575\n      %21496 = OpCompositeExtract %uint %7646 2\n       %8569 = OpShiftLeftLogical %uint %21496 %int_16\n      %19835 = OpBitwiseOr %uint %19834 %8569\n      %21497 = OpCompositeExtract %uint %7646 3\n       %7297 = OpShiftLeftLogical %uint %21497 %int_24\n       %9257 = OpBitwiseOr %uint %19835 %7297\n       %7524 = OpExtInst %v4float %1 FClamp %11189 %2938 %1285\n       %8266 = OpVectorTimesScalar %v4float %7524 %float_255\n      %11886 = OpFAdd %v4float %8266 %325\n       %7647 = OpConvertFToU %v4uint %11886\n       %8719 = OpCompositeExtract %uint %7647 0\n      %12270 = OpCompositeExtract %uint %7647 1\n      %11576 = OpShiftLeftLogical %uint %12270 %int_8\n      %19836 = OpBitwiseOr %uint %8719 %11576\n      %21498 = OpCompositeExtract %uint %7647 2\n       %8570 = OpShiftLeftLogical %uint %21498 %int_16\n      %19837 = OpBitwiseOr %uint %19836 %8570\n      %21499 = OpCompositeExtract %uint %7647 3\n       %8544 = OpShiftLeftLogical %uint %21499 %int_24\n      %20998 = OpBitwiseOr %uint %19837 %8544\n      %21473 = OpCompositeConstruct %v4uint %9255 %9256 %9257 %20998\n               OpBranch %18834\n       %8194 = OpLabel\n      %12446 = OpCompositeExtract %float %14921 0\n      %21144 = OpBitcast %uint %12446\n      %20301 = OpCompositeExtract %float %15191 0\n      %17693 = OpBitcast %uint %20301\n      %20302 = OpCompositeExtract %float %14358 0\n      %17694 = OpBitcast %uint %20302\n      %20280 = OpCompositeExtract %float %11189 0\n      %20246 = OpBitcast %uint %20280\n      %10040 = OpCompositeConstruct %v4uint %21144 %17693 %17694 %20246\n               OpBranch %18834\n      %18834 = OpLabel\n      %22706 = OpPhi %v4uint %10040 %8194 %21473 %18070 %21472 %17906 %21471 %6453 %21470 %6452 %21469 %6451 %24879 %9492\n      %19119 = OpIEqual %bool %7640 %uint_0\n      %22246 = OpSelect %bool %19119 %false %19119\n               OpSelectionMerge %19649 DontFlatten\n               OpBranchConditional %22246 %9760 %19649\n       %9760 = OpLabel\n      %20482 = OpCompositeExtract %uint %22706 1\n      %14335 = OpCompositeInsert %v4uint %20482 %22706 0\n               OpBranch %19649\n      %19649 = OpLabel\n      %12383 = OpPhi %v4uint %22706 %18834 %14335 %9760\n      %12967 = OpIAdd %v2uint %12025 %23020\n               OpSelectionMerge %21237 DontFlatten\n               OpBranchConditional %20495 %10574 %21373\n      %21373 = OpLabel\n      %10608 = OpBitcast %v2int %12967\n      %17907 = OpCompositeExtract %int %10608 1\n      %19904 = OpShiftRightArithmetic %int %17907 %int_5\n      %22412 = OpBitcast %int %8444\n       %7938 = OpIMul %int %19904 %22412\n      %25154 = OpCompositeExtract %int %10608 0\n      %20423 = OpShiftRightArithmetic %int %25154 %int_5\n      %18875 = OpIAdd %int %7938 %20423\n       %9546 = OpShiftLeftLogical %int %18875 %int_6\n      %24635 = OpShiftRightArithmetic %int %17907 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25154 %int_7\n      %11041 = OpBitwiseOr %int %21322 %20133\n      %17334 = OpBitwiseOr %int %9546 %11041\n      %24163 = OpShiftLeftLogical %int %17334 %uint_2\n      %12766 = OpShiftRightArithmetic %int %17907 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25154 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %17907 %int_3\n      %20574 = OpBitwiseAnd %int %10425 %int_1\n      %21533 = OpShiftLeftLogical %int %20574 %int_1\n       %8890 = OpBitwiseXor %int %20766 %21533\n      %20598 = OpBitwiseAnd %int %17907 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6551\n       %7168 = OpShiftLeftLogical %int %21575 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24163 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24163 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24163 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24163 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %21237\n      %10574 = OpLabel\n      %19866 = OpCompositeExtract %uint %12967 0\n      %11267 = OpCompositeExtract %uint %12967 1\n       %8414 = OpCompositeConstruct %v3uint %19866 %11267 %24434\n      %20125 = OpBitcast %v3int %8414\n      %11255 = OpCompositeExtract %int %20125 2\n      %19905 = OpShiftRightArithmetic %int %11255 %int_2\n      %22413 = OpBitcast %int %25203\n       %7939 = OpIMul %int %19905 %22413\n      %25155 = OpCompositeExtract %int %20125 1\n      %19055 = OpShiftRightArithmetic %int %25155 %int_4\n      %11053 = OpIAdd %int %7939 %19055\n      %16898 = OpBitcast %int %8444\n      %14944 = OpIMul %int %11053 %16898\n      %25156 = OpCompositeExtract %int %20125 0\n      %20424 = OpShiftRightArithmetic %int %25156 %int_5\n      %18940 = OpIAdd %int %14944 %20424\n       %8797 = OpShiftLeftLogical %int %18940 %int_7\n      %11434 = OpBitwiseAnd %int %11255 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %25155 %int_1\n      %21364 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21364 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %25156 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17335 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17335 %uint_2\n      %13015 = OpShiftRightArithmetic %int %25155 %int_3\n       %9929 = OpBitwiseXor %int %13015 %19905\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %25156 %int_3\n      %20575 = OpBitwiseAnd %int %9616 %int_3\n      %21534 = OpShiftLeftLogical %int %16793 %int_1\n       %8891 = OpBitwiseXor %int %20575 %21534\n      %20599 = OpBitwiseAnd %int %25155 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6552\n       %7169 = OpShiftLeftLogical %int %16793 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24144 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24144 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24144 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24144 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %21237\n      %21237 = OpLabel\n      %11376 = OpPhi %uint %16870 %10574 %16869 %21373\n      %20616 = OpIAdd %uint %11376 %25270\n      %18675 = OpShiftRightLogical %uint %20616 %int_4\n      %12010 = OpIEqual %bool %19164 %uint_1\n      %22390 = OpIEqual %bool %19164 %uint_2\n      %22150 = OpLogicalOr %bool %12010 %22390\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %12383 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %12383 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16377 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22650 = OpPhi %v4uint %12383 %21237 %16377 %10583\n      %19638 = OpIEqual %bool %19164 %uint_3\n      %15139 = OpLogicalOr %bool %22390 %19638\n               OpSelectionMerge %11416 None\n               OpBranchConditional %15139 %11064 %11416\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22650 %749\n      %15335 = OpShiftRightLogical %v4uint %22650 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %11416\n      %11416 = OpLabel\n      %19767 = OpPhi %v4uint %22650 %13411 %10728 %11064\n       %8054 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_dest %int_0 %18675\n               OpStore %8054 %19767\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t resolve_full_32bpp_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x000062B7, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000008, 0x00000008, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x0000040B, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x00090006, 0x0000040B, 0x00000000, 0x725F6578,\n    0x6C6F7365, 0x655F6576, 0x6D617264, 0x666E695F, 0x0000006F, 0x000A0006,\n    0x0000040B, 0x00000001, 0x725F6578, 0x6C6F7365, 0x635F6576, 0x64726F6F,\n    0x74616E69, 0x6E695F65, 0x00006F66, 0x00090006, 0x0000040B, 0x00000002,\n    0x725F6578, 0x6C6F7365, 0x645F6576, 0x5F747365, 0x6F666E69, 0x00000000,\n    0x000B0006, 0x0000040B, 0x00000003, 0x725F6578, 0x6C6F7365, 0x645F6576,\n    0x5F747365, 0x726F6F63, 0x616E6964, 0x695F6574, 0x006F666E, 0x00090006,\n    0x0000040B, 0x00000004, 0x725F6578, 0x6C6F7365, 0x645F6576, 0x5F747365,\n    0x65736162, 0x00000000, 0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F,\n    0x5F737473, 0x00006578, 0x00090005, 0x0000079C, 0x725F6578, 0x6C6F7365,\n    0x655F6576, 0x6D617264, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x0000079C, 0x00000000, 0x61746164, 0x00000000, 0x00070005, 0x00000CC7,\n    0x725F6578, 0x6C6F7365, 0x655F6576, 0x6D617264, 0x00000000, 0x00080005,\n    0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F, 0x496E6F69,\n    0x00000044, 0x00090005, 0x000007B4, 0x725F6578, 0x6C6F7365, 0x645F6576,\n    0x5F747365, 0x625F6578, 0x6B636F6C, 0x00000000, 0x00050006, 0x000007B4,\n    0x00000000, 0x61746164, 0x00000000, 0x00060005, 0x00001592, 0x725F6578,\n    0x6C6F7365, 0x645F6576, 0x00747365, 0x00030047, 0x0000040B, 0x00000002,\n    0x00050048, 0x0000040B, 0x00000000, 0x00000023, 0x00000000, 0x00050048,\n    0x0000040B, 0x00000001, 0x00000023, 0x00000004, 0x00050048, 0x0000040B,\n    0x00000002, 0x00000023, 0x00000008, 0x00050048, 0x0000040B, 0x00000003,\n    0x00000023, 0x0000000C, 0x00050048, 0x0000040B, 0x00000004, 0x00000023,\n    0x00000010, 0x00040047, 0x000007D0, 0x00000006, 0x00000004, 0x00030047,\n    0x0000079C, 0x00000003, 0x00040048, 0x0000079C, 0x00000000, 0x00000018,\n    0x00050048, 0x0000079C, 0x00000000, 0x00000023, 0x00000000, 0x00030047,\n    0x00000CC7, 0x00000018, 0x00040047, 0x00000CC7, 0x00000021, 0x00000000,\n    0x00040047, 0x00000CC7, 0x00000022, 0x00000000, 0x00040047, 0x00000F48,\n    0x0000000B, 0x0000001C, 0x00040047, 0x000007DC, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B4, 0x00000003, 0x00040048, 0x000007B4, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B4, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x00001592, 0x00000019, 0x00040047, 0x00001592, 0x00000021,\n    0x00000000, 0x00040047, 0x00001592, 0x00000022, 0x00000001, 0x00040047,\n    0x00000AC8, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000C, 0x00000020, 0x00000001,\n    0x00040017, 0x00000012, 0x0000000C, 0x00000002, 0x00040015, 0x0000000B,\n    0x00000020, 0x00000000, 0x00040017, 0x00000011, 0x0000000B, 0x00000002,\n    0x00040017, 0x00000014, 0x0000000B, 0x00000003, 0x00040017, 0x00000017,\n    0x0000000B, 0x00000004, 0x00030016, 0x0000000D, 0x00000020, 0x00040017,\n    0x00000013, 0x0000000D, 0x00000002, 0x00040017, 0x00000018, 0x0000000D,\n    0x00000003, 0x00040017, 0x0000001D, 0x0000000D, 0x00000004, 0x00020014,\n    0x00000009, 0x00040017, 0x00000016, 0x0000000C, 0x00000003, 0x0004002B,\n    0x0000000D, 0x00000A0C, 0x00000000, 0x0004002B, 0x0000000D, 0x0000008A,\n    0x3F800000, 0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001, 0x0004002B,\n    0x0000000B, 0x00000A10, 0x00000002, 0x0004002B, 0x0000000B, 0x000008A6,\n    0x00FF00FF, 0x0004002B, 0x0000000B, 0x00000A22, 0x00000008, 0x0004002B,\n    0x0000000B, 0x000005FD, 0xFF00FF00, 0x0004002B, 0x0000000B, 0x00000A13,\n    0x00000003, 0x0004002B, 0x0000000B, 0x00000A3A, 0x00000010, 0x0004002B,\n    0x0000000D, 0x00000540, 0x437F0000, 0x0004002B, 0x0000000D, 0x000000FC,\n    0x3F000000, 0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000, 0x0004002B,\n    0x0000000C, 0x00000A23, 0x00000008, 0x0004002B, 0x0000000C, 0x00000A3B,\n    0x00000010, 0x0004002B, 0x0000000C, 0x00000A53, 0x00000018, 0x0004002B,\n    0x0000000D, 0x00000409, 0x447FC000, 0x0004002B, 0x0000000D, 0x00000BA2,\n    0x40400000, 0x0007002C, 0x0000001D, 0x00000158, 0x00000409, 0x00000409,\n    0x00000409, 0x00000BA2, 0x0004002B, 0x0000000C, 0x00000A29, 0x0000000A,\n    0x0004002B, 0x0000000C, 0x00000A47, 0x00000014, 0x0004002B, 0x0000000C,\n    0x00000A65, 0x0000001E, 0x0004002B, 0x0000000D, 0x0000057F, 0x44FFE000,\n    0x0006002C, 0x00000018, 0x000008E3, 0x0000057F, 0x0000057F, 0x00000409,\n    0x0004002B, 0x0000000C, 0x00000A2C, 0x0000000B, 0x0004002B, 0x0000000C,\n    0x00000A4D, 0x00000016, 0x0006002C, 0x00000018, 0x0000000E, 0x00000409,\n    0x0000057F, 0x0000057F, 0x0004002B, 0x0000000C, 0x00000A4A, 0x00000015,\n    0x0004002B, 0x0000000D, 0x0000022D, 0x477FFF00, 0x0004002B, 0x0000000B,\n    0x00000A52, 0x00000018, 0x0007002C, 0x00000017, 0x0000028D, 0x00000A0A,\n    0x00000A22, 0x00000A3A, 0x00000A52, 0x0004002B, 0x0000000B, 0x00000144,\n    0x000000FF, 0x0004002B, 0x0000000D, 0x0000017A, 0x3B808081, 0x0004002B,\n    0x0000000B, 0x00000A28, 0x0000000A, 0x0004002B, 0x0000000B, 0x00000A46,\n    0x00000014, 0x0004002B, 0x0000000B, 0x00000A64, 0x0000001E, 0x0007002C,\n    0x00000017, 0x0000034D, 0x00000A0A, 0x00000A28, 0x00000A46, 0x00000A64,\n    0x0004002B, 0x0000000B, 0x00000A44, 0x000003FF, 0x0007002C, 0x00000017,\n    0x0000027B, 0x00000A44, 0x00000A44, 0x00000A44, 0x00000A13, 0x0004002B,\n    0x0000000D, 0x000006FE, 0x3A802008, 0x0004002B, 0x0000000D, 0x00000149,\n    0x3EAAAAAB, 0x0007002C, 0x0000001D, 0x00000AEE, 0x000006FE, 0x000006FE,\n    0x000006FE, 0x00000149, 0x0006002C, 0x00000014, 0x00000BB4, 0x00000A0A,\n    0x00000A28, 0x00000A46, 0x0004002B, 0x0000000B, 0x00000B87, 0x0000007F,\n    0x0004002B, 0x0000000B, 0x00000A1F, 0x00000007, 0x00040017, 0x00000010,\n    0x00000009, 0x00000003, 0x0004002B, 0x0000000B, 0x00000B7E, 0x0000007C,\n    0x0004002B, 0x0000000B, 0x00000A4F, 0x00000017, 0x0004002B, 0x0000000D,\n    0x00000341, 0xBF800000, 0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000,\n    0x0005002C, 0x00000012, 0x000007A7, 0x00000A3B, 0x00000A0B, 0x0004002B,\n    0x0000000D, 0x000007FE, 0x3A800100, 0x00040017, 0x0000001A, 0x0000000C,\n    0x00000004, 0x0007002C, 0x0000001A, 0x00000122, 0x00000A3B, 0x00000A0B,\n    0x00000A3B, 0x00000A0B, 0x0005002C, 0x00000011, 0x0000072D, 0x00000A10,\n    0x00000A0D, 0x00040017, 0x0000000F, 0x00000009, 0x00000002, 0x0005002C,\n    0x00000011, 0x0000070F, 0x00000A0A, 0x00000A0A, 0x0005002C, 0x00000011,\n    0x00000724, 0x00000A0D, 0x00000A0D, 0x0005002C, 0x00000011, 0x00000718,\n    0x00000A0D, 0x00000A0A, 0x0004002B, 0x0000000B, 0x00000AFA, 0x00000050,\n    0x0005002C, 0x00000011, 0x00000A9F, 0x00000AFA, 0x00000A3A, 0x0004002B,\n    0x0000000C, 0x00000A11, 0x00000002, 0x0004002B, 0x0000000C, 0x00000A17,\n    0x00000004, 0x0004002B, 0x0000000C, 0x00000A1D, 0x00000006, 0x0004002B,\n    0x0000000C, 0x00000A38, 0x0000000F, 0x0004002B, 0x0000000C, 0x00000A0E,\n    0x00000001, 0x0004002B, 0x0000000C, 0x00000A1A, 0x00000005, 0x0004002B,\n    0x0000000C, 0x00000A20, 0x00000007, 0x0004002B, 0x0000000C, 0x00000A2F,\n    0x0000000C, 0x0004002B, 0x0000000C, 0x00000A14, 0x00000003, 0x0007001E,\n    0x0000040B, 0x0000000B, 0x0000000B, 0x0000000B, 0x0000000B, 0x0000000B,\n    0x00040020, 0x00000688, 0x00000009, 0x0000040B, 0x0004003B, 0x00000688,\n    0x00000CE9, 0x00000009, 0x00040020, 0x00000288, 0x00000009, 0x0000000B,\n    0x0004002B, 0x0000000B, 0x00000A31, 0x0000000D, 0x0004002B, 0x0000000B,\n    0x00000A81, 0x000007FF, 0x0004002B, 0x0000000B, 0x00000A37, 0x0000000F,\n    0x0004002B, 0x0000000B, 0x00000A5E, 0x0000001C, 0x0004002B, 0x0000000B,\n    0x00000A16, 0x00000004, 0x0005002C, 0x00000011, 0x0000073F, 0x00000A0A,\n    0x00000A16, 0x0004002B, 0x0000000B, 0x00000A19, 0x00000005, 0x0004002B,\n    0x0000000B, 0x00000AC7, 0x0000003F, 0x0004002B, 0x0000000C, 0x00000A59,\n    0x0000001A, 0x0004002B, 0x0000000C, 0x00000A50, 0x00000017, 0x0004002B,\n    0x0000000B, 0x00000926, 0x01000000, 0x0005002C, 0x00000011, 0x000008E4,\n    0x00000A46, 0x00000A52, 0x0003002A, 0x00000009, 0x00000787, 0x0003001D,\n    0x000007D0, 0x0000000B, 0x0003001E, 0x0000079C, 0x000007D0, 0x00040020,\n    0x00000A1B, 0x00000002, 0x0000079C, 0x0004003B, 0x00000A1B, 0x00000CC7,\n    0x00000002, 0x00040020, 0x00000289, 0x00000002, 0x0000000B, 0x0004002B,\n    0x0000000B, 0x00000207, 0x00000140, 0x0004002B, 0x0000000B, 0x00000A1C,\n    0x00000006, 0x00040020, 0x00000291, 0x00000001, 0x00000014, 0x0004003B,\n    0x00000291, 0x00000F48, 0x00000001, 0x0005002C, 0x00000011, 0x00000721,\n    0x00000A10, 0x00000A0A, 0x0003001D, 0x000007DC, 0x00000017, 0x0003001E,\n    0x000007B4, 0x000007DC, 0x00040020, 0x00000A32, 0x00000002, 0x000007B4,\n    0x0004003B, 0x00000A32, 0x00001592, 0x00000002, 0x00040020, 0x00000294,\n    0x00000002, 0x00000017, 0x0006002C, 0x00000014, 0x00000AC8, 0x00000A22,\n    0x00000A22, 0x00000A0D, 0x0005002C, 0x00000011, 0x000007A2, 0x00000A37,\n    0x00000A0D, 0x0005002C, 0x00000011, 0x0000074E, 0x00000A13, 0x00000A13,\n    0x0005002C, 0x00000011, 0x0000084A, 0x00000A37, 0x00000A37, 0x0007002C,\n    0x0000001D, 0x00000504, 0x00000341, 0x00000341, 0x00000341, 0x00000341,\n    0x0007002C, 0x0000001A, 0x00000302, 0x00000A3B, 0x00000A3B, 0x00000A3B,\n    0x00000A3B, 0x0007002C, 0x00000017, 0x0000064B, 0x00000144, 0x00000144,\n    0x00000144, 0x00000144, 0x0006002C, 0x00000014, 0x00000105, 0x00000A44,\n    0x00000A44, 0x00000A44, 0x0006002C, 0x00000014, 0x00000466, 0x00000B87,\n    0x00000B87, 0x00000B87, 0x0006002C, 0x00000014, 0x00000B0C, 0x00000A1F,\n    0x00000A1F, 0x00000A1F, 0x0006002C, 0x00000014, 0x00000A12, 0x00000A0A,\n    0x00000A0A, 0x00000A0A, 0x0006002C, 0x00000014, 0x000003FA, 0x00000B7E,\n    0x00000B7E, 0x00000B7E, 0x0006002C, 0x00000014, 0x00000189, 0x00000A4F,\n    0x00000A4F, 0x00000A4F, 0x0006002C, 0x00000014, 0x0000008D, 0x00000A3A,\n    0x00000A3A, 0x00000A3A, 0x0005002C, 0x00000013, 0x00000049, 0x00000341,\n    0x00000341, 0x0005002C, 0x00000012, 0x00000867, 0x00000A3B, 0x00000A3B,\n    0x0007002C, 0x0000001D, 0x00000B7A, 0x00000A0C, 0x00000A0C, 0x00000A0C,\n    0x00000A0C, 0x0007002C, 0x0000001D, 0x00000505, 0x0000008A, 0x0000008A,\n    0x0000008A, 0x0000008A, 0x0007002C, 0x0000001D, 0x00000145, 0x000000FC,\n    0x000000FC, 0x000000FC, 0x000000FC, 0x0006002C, 0x00000018, 0x00000A2D,\n    0x00000A0C, 0x00000A0C, 0x00000A0C, 0x0006002C, 0x00000018, 0x00000A18,\n    0x0000008A, 0x0000008A, 0x0000008A, 0x0006002C, 0x00000018, 0x000003AB,\n    0x000000FC, 0x000000FC, 0x000000FC, 0x0005002C, 0x00000013, 0x0000071F,\n    0x00000A0C, 0x00000A0C, 0x0005002C, 0x00000013, 0x00000300, 0x0000008A,\n    0x0000008A, 0x0005002C, 0x00000013, 0x0000061E, 0x000000FC, 0x000000FC,\n    0x0007002C, 0x00000017, 0x000009CE, 0x000008A6, 0x000008A6, 0x000008A6,\n    0x000008A6, 0x0007002C, 0x00000017, 0x0000013D, 0x00000A22, 0x00000A22,\n    0x00000A22, 0x00000A22, 0x0007002C, 0x00000017, 0x0000072E, 0x000005FD,\n    0x000005FD, 0x000005FD, 0x000005FD, 0x0007002C, 0x00000017, 0x000002ED,\n    0x00000A3A, 0x00000A3A, 0x00000A3A, 0x00000A3A, 0x0004002B, 0x0000000C,\n    0x00000089, 0x3F800000, 0x0004002B, 0x0000000B, 0x00000184, 0x00000500,\n    0x0004002B, 0x0000000B, 0x0000086E, 0x00280000, 0x0004002B, 0x0000000B,\n    0x000009F8, 0xFFFFFFFA, 0x0006002C, 0x00000014, 0x00000938, 0x000009F8,\n    0x000009F8, 0x000009F8, 0x0004002B, 0x0000000B, 0x00000237, 0x00000150,\n    0x0004002B, 0x0000000D, 0x0000016E, 0x3E800000, 0x00050036, 0x00000008,\n    0x0000161F, 0x00000000, 0x00000502, 0x000200F8, 0x00003B06, 0x000300F7,\n    0x00004C7A, 0x00000000, 0x000300FB, 0x00000A0A, 0x00002E68, 0x000200F8,\n    0x00002E68, 0x00050041, 0x00000288, 0x000056E5, 0x00000CE9, 0x00000A0B,\n    0x0004003D, 0x0000000B, 0x00003D0B, 0x000056E5, 0x00050041, 0x00000288,\n    0x000058AC, 0x00000CE9, 0x00000A0E, 0x0004003D, 0x0000000B, 0x00005158,\n    0x000058AC, 0x000500C7, 0x0000000B, 0x00005051, 0x00003D0B, 0x00000A44,\n    0x000500C2, 0x0000000B, 0x00004E0A, 0x00003D0B, 0x00000A28, 0x000500C7,\n    0x0000000B, 0x0000217E, 0x00004E0A, 0x00000A13, 0x000500C2, 0x0000000B,\n    0x0000520A, 0x00003D0B, 0x00000A31, 0x000500C7, 0x0000000B, 0x0000217F,\n    0x0000520A, 0x00000A81, 0x000500C2, 0x0000000B, 0x0000520B, 0x00003D0B,\n    0x00000A52, 0x000500C7, 0x0000000B, 0x00002180, 0x0000520B, 0x00000A37,\n    0x000500C2, 0x0000000B, 0x00004994, 0x00003D0B, 0x00000A5E, 0x000500C7,\n    0x0000000B, 0x000023AA, 0x00004994, 0x00000A0D, 0x00050050, 0x00000011,\n    0x000022A7, 0x00005158, 0x00005158, 0x000500C2, 0x00000011, 0x00002568,\n    0x000022A7, 0x0000073F, 0x000500C7, 0x00000011, 0x00005B53, 0x00002568,\n    0x000007A2, 0x000500C4, 0x00000011, 0x00003F4F, 0x00005B53, 0x0000074E,\n    0x00050084, 0x00000011, 0x000059EB, 0x00003F4F, 0x00000724, 0x000500C2,\n    0x0000000B, 0x00003213, 0x00005158, 0x00000A19, 0x000500C7, 0x0000000B,\n    0x00003F4C, 0x00003213, 0x00000A81, 0x00050041, 0x00000288, 0x0000492C,\n    0x00000CE9, 0x00000A11, 0x0004003D, 0x0000000B, 0x00005EAC, 0x0000492C,\n    0x00050041, 0x00000288, 0x000058AD, 0x00000CE9, 0x00000A14, 0x0004003D,\n    0x0000000B, 0x000051B7, 0x000058AD, 0x000500C7, 0x0000000B, 0x00004ADC,\n    0x00005EAC, 0x00000A1F, 0x000500C7, 0x0000000B, 0x000055EF, 0x00005EAC,\n    0x00000A22, 0x000500AB, 0x00000009, 0x0000500F, 0x000055EF, 0x00000A0A,\n    0x000500C2, 0x0000000B, 0x00002843, 0x00005EAC, 0x00000A16, 0x000500C7,\n    0x0000000B, 0x00005F72, 0x00002843, 0x00000A1F, 0x000500C2, 0x0000000B,\n    0x00004CD8, 0x00005EAC, 0x00000A1F, 0x000500C7, 0x0000000B, 0x00005093,\n    0x00004CD8, 0x00000AC7, 0x0004007C, 0x0000000C, 0x00005988, 0x00005EAC,\n    0x000500C4, 0x0000000C, 0x0000358F, 0x00005988, 0x00000A29, 0x000500C3,\n    0x0000000C, 0x0000509C, 0x0000358F, 0x00000A59, 0x000500C4, 0x0000000C,\n    0x00004702, 0x0000509C, 0x00000A50, 0x00050080, 0x0000000C, 0x00001D26,\n    0x00004702, 0x00000089, 0x0004007C, 0x0000000D, 0x00002B2C, 0x00001D26,\n    0x000500C7, 0x0000000B, 0x00005879, 0x00005EAC, 0x00000926, 0x000500AB,\n    0x00000009, 0x00001D33, 0x00005879, 0x00000A0A, 0x000500C7, 0x0000000B,\n    0x000020FC, 0x000051B7, 0x00000A44, 0x000500C2, 0x0000000B, 0x00002F90,\n    0x000051B7, 0x00000A28, 0x000500C7, 0x0000000B, 0x000061CE, 0x00002F90,\n    0x00000A44, 0x000500C4, 0x0000000B, 0x00006273, 0x000061CE, 0x00000A0E,\n    0x00050050, 0x00000011, 0x000028B6, 0x000051B7, 0x000051B7, 0x000500C2,\n    0x00000011, 0x00002891, 0x000028B6, 0x000008E4, 0x000500C7, 0x00000011,\n    0x00005B54, 0x00002891, 0x0000084A, 0x000500C4, 0x00000011, 0x00003F50,\n    0x00005B54, 0x0000074E, 0x00050084, 0x00000011, 0x000059EC, 0x00003F50,\n    0x00000724, 0x000500C2, 0x0000000B, 0x00003214, 0x000051B7, 0x00000A5E,\n    0x000500C7, 0x0000000B, 0x00003F4D, 0x00003214, 0x00000A1F, 0x00050041,\n    0x00000288, 0x000048E0, 0x00000CE9, 0x00000A17, 0x0004003D, 0x0000000B,\n    0x000062B6, 0x000048E0, 0x0004003D, 0x00000014, 0x0000374F, 0x00000F48,\n    0x0007004F, 0x00000011, 0x00003180, 0x0000374F, 0x0000374F, 0x00000000,\n    0x00000001, 0x000500C4, 0x00000011, 0x00002EF9, 0x00003180, 0x00000721,\n    0x00050051, 0x0000000B, 0x00001DD8, 0x00002EF9, 0x00000000, 0x000500C4,\n    0x0000000B, 0x00002D8A, 0x00003F4C, 0x00000A13, 0x000500AE, 0x00000009,\n    0x00003C13, 0x00001DD8, 0x00002D8A, 0x000300F7, 0x000031D3, 0x00000002,\n    0x000400FA, 0x00003C13, 0x000055E8, 0x000031D3, 0x000200F8, 0x000055E8,\n    0x000200F9, 0x00004C7A, 0x000200F8, 0x000031D3, 0x00050051, 0x0000000B,\n    0x00001CAC, 0x00002EF9, 0x00000001, 0x0007000C, 0x0000000B, 0x00001F38,\n    0x00000001, 0x00000029, 0x00001CAC, 0x00000A0A, 0x00050050, 0x00000011,\n    0x000051EF, 0x00001DD8, 0x00001F38, 0x00050080, 0x00000011, 0x0000522C,\n    0x000051EF, 0x000059EB, 0x000500B2, 0x00000009, 0x00003ECB, 0x00003F4D,\n    0x00000A13, 0x000300F7, 0x00005CE0, 0x00000000, 0x000400FA, 0x00003ECB,\n    0x00002AEE, 0x00003AEF, 0x000200F8, 0x00003AEF, 0x000500AA, 0x00000009,\n    0x000034FE, 0x00003F4D, 0x00000A19, 0x000600A9, 0x0000000B, 0x000020F6,\n    0x000034FE, 0x00000A10, 0x00000A0A, 0x000200F9, 0x00005CE0, 0x000200F8,\n    0x00002AEE, 0x000200F9, 0x00005CE0, 0x000200F8, 0x00005CE0, 0x000700F5,\n    0x0000000B, 0x00004B64, 0x00003F4D, 0x00002AEE, 0x000020F6, 0x00003AEF,\n    0x00050050, 0x00000011, 0x000041BE, 0x0000217E, 0x0000217E, 0x000500AE,\n    0x0000000F, 0x00002E19, 0x000041BE, 0x0000072D, 0x000600A9, 0x00000011,\n    0x00004BB5, 0x00002E19, 0x00000724, 0x0000070F, 0x000500C4, 0x00000011,\n    0x00002AEA, 0x0000522C, 0x00004BB5, 0x00050050, 0x00000011, 0x0000605D,\n    0x00004B64, 0x00004B64, 0x000500C2, 0x00000011, 0x00002385, 0x0000605D,\n    0x00000718, 0x000500C7, 0x00000011, 0x00003AEC, 0x00002385, 0x00000724,\n    0x00050080, 0x00000011, 0x000027D5, 0x00002AEA, 0x00003AEC, 0x00050050,\n    0x00000011, 0x00002164, 0x000023AA, 0x00000A0A, 0x000500C2, 0x00000011,\n    0x0000264A, 0x00000A9F, 0x00002164, 0x00050086, 0x00000011, 0x000027A2,\n    0x000027D5, 0x0000264A, 0x00050051, 0x0000000B, 0x00004FA6, 0x000027A2,\n    0x00000001, 0x00050084, 0x0000000B, 0x00002B26, 0x00004FA6, 0x00005051,\n    0x00050051, 0x0000000B, 0x00006059, 0x000027A2, 0x00000000, 0x00050080,\n    0x0000000B, 0x00005420, 0x00002B26, 0x00006059, 0x00050080, 0x0000000B,\n    0x00002226, 0x0000217F, 0x00005420, 0x00050084, 0x00000011, 0x00005B31,\n    0x000027A2, 0x0000264A, 0x00050082, 0x00000011, 0x00002E74, 0x000027D5,\n    0x00005B31, 0x00050084, 0x0000000B, 0x00001F75, 0x00002226, 0x00000184,\n    0x00050051, 0x0000000B, 0x00005EC7, 0x00002E74, 0x00000001, 0x00050051,\n    0x0000000B, 0x00005BE6, 0x0000264A, 0x00000000, 0x00050084, 0x0000000B,\n    0x00005966, 0x00005EC7, 0x00005BE6, 0x00050051, 0x0000000B, 0x00001AE6,\n    0x00002E74, 0x00000000, 0x00050080, 0x0000000B, 0x000025E0, 0x00005966,\n    0x00001AE6, 0x000500C4, 0x0000000B, 0x000046C4, 0x000025E0, 0x000023AA,\n    0x00050080, 0x0000000B, 0x000048BB, 0x00001F75, 0x000046C4, 0x00050089,\n    0x0000000B, 0x00004C59, 0x000048BB, 0x0000086E, 0x000500C4, 0x0000000B,\n    0x00005BEB, 0x00004C59, 0x00000A11, 0x000500AE, 0x00000009, 0x00003652,\n    0x0000217E, 0x00000A10, 0x000600A9, 0x0000000B, 0x00002C0D, 0x00003652,\n    0x00000A0D, 0x00000A0A, 0x00050080, 0x0000000B, 0x00004E6A, 0x000023AA,\n    0x00002C0D, 0x000500C4, 0x0000000B, 0x0000199B, 0x00000A16, 0x00004E6A,\n    0x000500AB, 0x00000009, 0x00005AEF, 0x000023AA, 0x00000A0A, 0x000300F7,\n    0x0000530F, 0x00000002, 0x000400FA, 0x00005AEF, 0x00003B65, 0x000040B9,\n    0x000200F8, 0x000040B9, 0x000500AA, 0x00000009, 0x00004ADA, 0x0000199B,\n    0x00000A16, 0x000300F7, 0x00004F49, 0x00000002, 0x000400FA, 0x00004ADA,\n    0x000019BF, 0x000022FF, 0x000200F8, 0x000022FF, 0x000500C2, 0x0000000B,\n    0x00005630, 0x00005BEB, 0x00000A11, 0x00060041, 0x00000289, 0x00003439,\n    0x00000CC7, 0x00000A0B, 0x00005630, 0x0004003D, 0x0000000B, 0x00003AD4,\n    0x00003439, 0x00050080, 0x0000000B, 0x00002145, 0x00005BEB, 0x0000199B,\n    0x000500C2, 0x0000000B, 0x000054A6, 0x00002145, 0x00000A11, 0x00060041,\n    0x00000289, 0x00004CDD, 0x00000CC7, 0x00000A0B, 0x000054A6, 0x0004003D,\n    0x0000000B, 0x0000333A, 0x00004CDD, 0x00050084, 0x0000000B, 0x000021ED,\n    0x00000A10, 0x0000199B, 0x00050080, 0x0000000B, 0x00005EBE, 0x00005BEB,\n    0x000021ED, 0x000500C2, 0x0000000B, 0x000045E2, 0x00005EBE, 0x00000A11,\n    0x00060041, 0x00000289, 0x00004CDE, 0x00000CC7, 0x00000A0B, 0x000045E2,\n    0x0004003D, 0x0000000B, 0x0000333B, 0x00004CDE, 0x00050084, 0x0000000B,\n    0x000021EE, 0x00000A13, 0x0000199B, 0x00050080, 0x0000000B, 0x00005EBF,\n    0x00005BEB, 0x000021EE, 0x000500C2, 0x0000000B, 0x000045E3, 0x00005EBF,\n    0x00000A11, 0x00060041, 0x00000289, 0x00004901, 0x00000CC7, 0x00000A0B,\n    0x000045E3, 0x0004003D, 0x0000000B, 0x00005F59, 0x00004901, 0x00070050,\n    0x00000017, 0x0000512C, 0x00003AD4, 0x0000333A, 0x0000333B, 0x00005F59,\n    0x000200F9, 0x00004F49, 0x000200F8, 0x000019BF, 0x000500C2, 0x0000000B,\n    0x00005FA6, 0x00005BEB, 0x00000A11, 0x00060041, 0x00000289, 0x0000343A,\n    0x00000CC7, 0x00000A0B, 0x00005FA6, 0x0004003D, 0x0000000B, 0x00003141,\n    0x0000343A, 0x00050080, 0x0000000B, 0x00002DA7, 0x00005FA6, 0x00000A0D,\n    0x00060041, 0x00000289, 0x000018FF, 0x00000CC7, 0x00000A0B, 0x00002DA7,\n    0x0004003D, 0x0000000B, 0x00005C62, 0x000018FF, 0x00050080, 0x0000000B,\n    0x00002DA8, 0x00005FA6, 0x00000A10, 0x00060041, 0x00000289, 0x00001900,\n    0x00000CC7, 0x00000A0B, 0x00002DA8, 0x0004003D, 0x0000000B, 0x00005C63,\n    0x00001900, 0x00050080, 0x0000000B, 0x00002DA9, 0x00005FA6, 0x00000A13,\n    0x00060041, 0x00000289, 0x00005FEE, 0x00000CC7, 0x00000A0B, 0x00002DA9,\n    0x0004003D, 0x0000000B, 0x00003FFB, 0x00005FEE, 0x00070050, 0x00000017,\n    0x0000512D, 0x00003141, 0x00005C62, 0x00005C63, 0x00003FFB, 0x000200F9,\n    0x00004F49, 0x000200F8, 0x00004F49, 0x000700F5, 0x00000017, 0x00002ABF,\n    0x0000512D, 0x000019BF, 0x0000512C, 0x000022FF, 0x000300F7, 0x00003F60,\n    0x00000000, 0x001300FB, 0x00002180, 0x00004BFB, 0x00000000, 0x000038F9,\n    0x00000001, 0x000038F9, 0x00000002, 0x00001CBB, 0x0000000A, 0x00001CBB,\n    0x00000003, 0x00001CBA, 0x0000000C, 0x00001CBA, 0x00000004, 0x00001FFE,\n    0x00000006, 0x00002033, 0x000200F8, 0x00002033, 0x00050051, 0x0000000B,\n    0x00005F56, 0x00002ABF, 0x00000000, 0x0006000C, 0x00000013, 0x00006067,\n    0x00000001, 0x0000003E, 0x00005F56, 0x00050051, 0x0000000D, 0x00002762,\n    0x00006067, 0x00000000, 0x00050051, 0x0000000D, 0x00004446, 0x00006067,\n    0x00000001, 0x00070050, 0x0000001D, 0x0000390C, 0x00002762, 0x00004446,\n    0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x0000437A, 0x00002ABF,\n    0x00000001, 0x0006000C, 0x00000013, 0x0000466B, 0x00000001, 0x0000003E,\n    0x0000437A, 0x00050051, 0x0000000D, 0x00002763, 0x0000466B, 0x00000000,\n    0x00050051, 0x0000000D, 0x00004447, 0x0000466B, 0x00000001, 0x00070050,\n    0x0000001D, 0x0000390D, 0x00002763, 0x00004447, 0x00000A0C, 0x00000A0C,\n    0x00050051, 0x0000000B, 0x0000437B, 0x00002ABF, 0x00000002, 0x0006000C,\n    0x00000013, 0x0000466C, 0x00000001, 0x0000003E, 0x0000437B, 0x00050051,\n    0x0000000D, 0x00002764, 0x0000466C, 0x00000000, 0x00050051, 0x0000000D,\n    0x00004448, 0x0000466C, 0x00000001, 0x00070050, 0x0000001D, 0x0000390E,\n    0x00002764, 0x00004448, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B,\n    0x0000437C, 0x00002ABF, 0x00000003, 0x0006000C, 0x00000013, 0x0000466D,\n    0x00000001, 0x0000003E, 0x0000437C, 0x00050051, 0x0000000D, 0x00002765,\n    0x0000466D, 0x00000000, 0x00050051, 0x0000000D, 0x000050BE, 0x0000466D,\n    0x00000001, 0x00070050, 0x0000001D, 0x00002349, 0x00002765, 0x000050BE,\n    0x00000A0C, 0x00000A0C, 0x000200F9, 0x00003F60, 0x000200F8, 0x00001FFE,\n    0x00050051, 0x0000000B, 0x0000308B, 0x00002ABF, 0x00000000, 0x0004007C,\n    0x0000000C, 0x0000589D, 0x0000308B, 0x00050050, 0x00000012, 0x0000471A,\n    0x0000589D, 0x0000589D, 0x000500C4, 0x00000012, 0x000047AD, 0x0000471A,\n    0x000007A7, 0x000500C3, 0x00000012, 0x00003417, 0x000047AD, 0x00000867,\n    0x0004006F, 0x00000013, 0x00002A97, 0x00003417, 0x0005008E, 0x00000013,\n    0x00004747, 0x00002A97, 0x000007FE, 0x0007000C, 0x00000013, 0x00005E06,\n    0x00000001, 0x00000028, 0x00000049, 0x00004747, 0x00050051, 0x0000000D,\n    0x00005F0A, 0x00005E06, 0x00000000, 0x00050051, 0x0000000D, 0x00003CD4,\n    0x00005E06, 0x00000001, 0x00070050, 0x0000001D, 0x0000411E, 0x00005F0A,\n    0x00003CD4, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x00004C42,\n    0x00002ABF, 0x00000001, 0x0004007C, 0x0000000C, 0x00003EA1, 0x00004C42,\n    0x00050050, 0x00000012, 0x0000471B, 0x00003EA1, 0x00003EA1, 0x000500C4,\n    0x00000012, 0x000047AE, 0x0000471B, 0x000007A7, 0x000500C3, 0x00000012,\n    0x00003418, 0x000047AE, 0x00000867, 0x0004006F, 0x00000013, 0x00002A98,\n    0x00003418, 0x0005008E, 0x00000013, 0x00004748, 0x00002A98, 0x000007FE,\n    0x0007000C, 0x00000013, 0x00005E07, 0x00000001, 0x00000028, 0x00000049,\n    0x00004748, 0x00050051, 0x0000000D, 0x00005F0B, 0x00005E07, 0x00000000,\n    0x00050051, 0x0000000D, 0x00003CD5, 0x00005E07, 0x00000001, 0x00070050,\n    0x0000001D, 0x0000411F, 0x00005F0B, 0x00003CD5, 0x00000A0C, 0x00000A0C,\n    0x00050051, 0x0000000B, 0x00004C43, 0x00002ABF, 0x00000002, 0x0004007C,\n    0x0000000C, 0x00003EA2, 0x00004C43, 0x00050050, 0x00000012, 0x0000471C,\n    0x00003EA2, 0x00003EA2, 0x000500C4, 0x00000012, 0x000047AF, 0x0000471C,\n    0x000007A7, 0x000500C3, 0x00000012, 0x00003419, 0x000047AF, 0x00000867,\n    0x0004006F, 0x00000013, 0x00002A99, 0x00003419, 0x0005008E, 0x00000013,\n    0x00004749, 0x00002A99, 0x000007FE, 0x0007000C, 0x00000013, 0x00005E08,\n    0x00000001, 0x00000028, 0x00000049, 0x00004749, 0x00050051, 0x0000000D,\n    0x00005F0C, 0x00005E08, 0x00000000, 0x00050051, 0x0000000D, 0x00003CD6,\n    0x00005E08, 0x00000001, 0x00070050, 0x0000001D, 0x00004120, 0x00005F0C,\n    0x00003CD6, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x00004C44,\n    0x00002ABF, 0x00000003, 0x0004007C, 0x0000000C, 0x00003EA3, 0x00004C44,\n    0x00050050, 0x00000012, 0x0000471D, 0x00003EA3, 0x00003EA3, 0x000500C4,\n    0x00000012, 0x000047B0, 0x0000471D, 0x000007A7, 0x000500C3, 0x00000012,\n    0x0000341A, 0x000047B0, 0x00000867, 0x0004006F, 0x00000013, 0x00002A9A,\n    0x0000341A, 0x0005008E, 0x00000013, 0x0000474A, 0x00002A9A, 0x000007FE,\n    0x0007000C, 0x00000013, 0x00005E09, 0x00000001, 0x00000028, 0x00000049,\n    0x0000474A, 0x00050051, 0x0000000D, 0x00005F0D, 0x00005E09, 0x00000000,\n    0x00050051, 0x0000000D, 0x0000494C, 0x00005E09, 0x00000001, 0x00070050,\n    0x0000001D, 0x0000234A, 0x00005F0D, 0x0000494C, 0x00000A0C, 0x00000A0C,\n    0x000200F9, 0x00003F60, 0x000200F8, 0x00001CBA, 0x00050051, 0x0000000B,\n    0x000056BD, 0x00002ABF, 0x00000000, 0x00060050, 0x00000014, 0x00004F0A,\n    0x000056BD, 0x000056BD, 0x000056BD, 0x000500C2, 0x00000014, 0x00002B0D,\n    0x00004F0A, 0x00000BB4, 0x000500C7, 0x00000014, 0x00005DE6, 0x00002B0D,\n    0x00000105, 0x000500C7, 0x00000014, 0x0000489C, 0x00002B0D, 0x00000466,\n    0x000500C2, 0x00000014, 0x00005B90, 0x00005DE6, 0x00000B0C, 0x000500AA,\n    0x00000010, 0x000040C9, 0x00005B90, 0x00000A12, 0x0006000C, 0x00000016,\n    0x00002C4B, 0x00000001, 0x0000004B, 0x0000489C, 0x0004007C, 0x00000014,\n    0x00002A15, 0x00002C4B, 0x00050082, 0x00000014, 0x0000187A, 0x00000B0C,\n    0x00002A15, 0x00050080, 0x00000014, 0x00002210, 0x00002A15, 0x00000938,\n    0x000600A9, 0x00000014, 0x0000286F, 0x000040C9, 0x00002210, 0x00005B90,\n    0x000500C4, 0x00000014, 0x00005AD4, 0x0000489C, 0x0000187A, 0x000500C7,\n    0x00000014, 0x0000499A, 0x00005AD4, 0x00000466, 0x000600A9, 0x00000014,\n    0x00002A9D, 0x000040C9, 0x0000499A, 0x0000489C, 0x00050080, 0x00000014,\n    0x00005FF9, 0x0000286F, 0x000003FA, 0x000500C4, 0x00000014, 0x00004F7F,\n    0x00005FF9, 0x00000189, 0x000500C4, 0x00000014, 0x00003FA6, 0x00002A9D,\n    0x0000008D, 0x000500C5, 0x00000014, 0x0000577C, 0x00004F7F, 0x00003FA6,\n    0x000500AA, 0x00000010, 0x00003600, 0x00005DE6, 0x00000A12, 0x000600A9,\n    0x00000014, 0x00004242, 0x00003600, 0x00000A12, 0x0000577C, 0x0004007C,\n    0x00000018, 0x000029CF, 0x00004242, 0x000500C2, 0x0000000B, 0x00004BA4,\n    0x000056BD, 0x00000A64, 0x00040070, 0x0000000D, 0x0000480E, 0x00004BA4,\n    0x00050085, 0x0000000D, 0x00003E1F, 0x0000480E, 0x00000149, 0x00050051,\n    0x0000000D, 0x000053C2, 0x000029CF, 0x00000000, 0x00050051, 0x0000000D,\n    0x00002A55, 0x000029CF, 0x00000001, 0x00050051, 0x0000000D, 0x00001E99,\n    0x000029CF, 0x00000002, 0x00070050, 0x0000001D, 0x00003DDA, 0x000053C2,\n    0x00002A55, 0x00001E99, 0x00003E1F, 0x00050051, 0x0000000B, 0x000027F5,\n    0x00002ABF, 0x00000001, 0x00060050, 0x00000014, 0x0000350E, 0x000027F5,\n    0x000027F5, 0x000027F5, 0x000500C2, 0x00000014, 0x00002B0E, 0x0000350E,\n    0x00000BB4, 0x000500C7, 0x00000014, 0x00005DE7, 0x00002B0E, 0x00000105,\n    0x000500C7, 0x00000014, 0x0000489D, 0x00002B0E, 0x00000466, 0x000500C2,\n    0x00000014, 0x00005B91, 0x00005DE7, 0x00000B0C, 0x000500AA, 0x00000010,\n    0x000040CA, 0x00005B91, 0x00000A12, 0x0006000C, 0x00000016, 0x00002C4C,\n    0x00000001, 0x0000004B, 0x0000489D, 0x0004007C, 0x00000014, 0x00002A16,\n    0x00002C4C, 0x00050082, 0x00000014, 0x0000187B, 0x00000B0C, 0x00002A16,\n    0x00050080, 0x00000014, 0x00002211, 0x00002A16, 0x00000938, 0x000600A9,\n    0x00000014, 0x00002870, 0x000040CA, 0x00002211, 0x00005B91, 0x000500C4,\n    0x00000014, 0x00005AD5, 0x0000489D, 0x0000187B, 0x000500C7, 0x00000014,\n    0x0000499B, 0x00005AD5, 0x00000466, 0x000600A9, 0x00000014, 0x00002A9E,\n    0x000040CA, 0x0000499B, 0x0000489D, 0x00050080, 0x00000014, 0x00005FFA,\n    0x00002870, 0x000003FA, 0x000500C4, 0x00000014, 0x00004F80, 0x00005FFA,\n    0x00000189, 0x000500C4, 0x00000014, 0x00003FA7, 0x00002A9E, 0x0000008D,\n    0x000500C5, 0x00000014, 0x0000577D, 0x00004F80, 0x00003FA7, 0x000500AA,\n    0x00000010, 0x00003601, 0x00005DE7, 0x00000A12, 0x000600A9, 0x00000014,\n    0x00004243, 0x00003601, 0x00000A12, 0x0000577D, 0x0004007C, 0x00000018,\n    0x000029D0, 0x00004243, 0x000500C2, 0x0000000B, 0x00004BA5, 0x000027F5,\n    0x00000A64, 0x00040070, 0x0000000D, 0x0000480F, 0x00004BA5, 0x00050085,\n    0x0000000D, 0x00003E20, 0x0000480F, 0x00000149, 0x00050051, 0x0000000D,\n    0x000053C3, 0x000029D0, 0x00000000, 0x00050051, 0x0000000D, 0x00002A56,\n    0x000029D0, 0x00000001, 0x00050051, 0x0000000D, 0x00001E9A, 0x000029D0,\n    0x00000002, 0x00070050, 0x0000001D, 0x00003DDB, 0x000053C3, 0x00002A56,\n    0x00001E9A, 0x00003E20, 0x00050051, 0x0000000B, 0x000027F6, 0x00002ABF,\n    0x00000002, 0x00060050, 0x00000014, 0x0000350F, 0x000027F6, 0x000027F6,\n    0x000027F6, 0x000500C2, 0x00000014, 0x00002B0F, 0x0000350F, 0x00000BB4,\n    0x000500C7, 0x00000014, 0x00005DE8, 0x00002B0F, 0x00000105, 0x000500C7,\n    0x00000014, 0x0000489E, 0x00002B0F, 0x00000466, 0x000500C2, 0x00000014,\n    0x00005B92, 0x00005DE8, 0x00000B0C, 0x000500AA, 0x00000010, 0x000040CB,\n    0x00005B92, 0x00000A12, 0x0006000C, 0x00000016, 0x00002C4D, 0x00000001,\n    0x0000004B, 0x0000489E, 0x0004007C, 0x00000014, 0x00002A17, 0x00002C4D,\n    0x00050082, 0x00000014, 0x0000187C, 0x00000B0C, 0x00002A17, 0x00050080,\n    0x00000014, 0x00002212, 0x00002A17, 0x00000938, 0x000600A9, 0x00000014,\n    0x00002871, 0x000040CB, 0x00002212, 0x00005B92, 0x000500C4, 0x00000014,\n    0x00005AD6, 0x0000489E, 0x0000187C, 0x000500C7, 0x00000014, 0x0000499C,\n    0x00005AD6, 0x00000466, 0x000600A9, 0x00000014, 0x00002A9F, 0x000040CB,\n    0x0000499C, 0x0000489E, 0x00050080, 0x00000014, 0x00005FFB, 0x00002871,\n    0x000003FA, 0x000500C4, 0x00000014, 0x00004F81, 0x00005FFB, 0x00000189,\n    0x000500C4, 0x00000014, 0x00003FA8, 0x00002A9F, 0x0000008D, 0x000500C5,\n    0x00000014, 0x0000577E, 0x00004F81, 0x00003FA8, 0x000500AA, 0x00000010,\n    0x00003602, 0x00005DE8, 0x00000A12, 0x000600A9, 0x00000014, 0x00004244,\n    0x00003602, 0x00000A12, 0x0000577E, 0x0004007C, 0x00000018, 0x000029D1,\n    0x00004244, 0x000500C2, 0x0000000B, 0x00004BA6, 0x000027F6, 0x00000A64,\n    0x00040070, 0x0000000D, 0x00004810, 0x00004BA6, 0x00050085, 0x0000000D,\n    0x00003E21, 0x00004810, 0x00000149, 0x00050051, 0x0000000D, 0x000053C4,\n    0x000029D1, 0x00000000, 0x00050051, 0x0000000D, 0x00002A57, 0x000029D1,\n    0x00000001, 0x00050051, 0x0000000D, 0x00001E9B, 0x000029D1, 0x00000002,\n    0x00070050, 0x0000001D, 0x00003DDC, 0x000053C4, 0x00002A57, 0x00001E9B,\n    0x00003E21, 0x00050051, 0x0000000B, 0x000027F7, 0x00002ABF, 0x00000003,\n    0x00060050, 0x00000014, 0x00003510, 0x000027F7, 0x000027F7, 0x000027F7,\n    0x000500C2, 0x00000014, 0x00002B10, 0x00003510, 0x00000BB4, 0x000500C7,\n    0x00000014, 0x00005DE9, 0x00002B10, 0x00000105, 0x000500C7, 0x00000014,\n    0x0000489F, 0x00002B10, 0x00000466, 0x000500C2, 0x00000014, 0x00005B93,\n    0x00005DE9, 0x00000B0C, 0x000500AA, 0x00000010, 0x000040CC, 0x00005B93,\n    0x00000A12, 0x0006000C, 0x00000016, 0x00002C4E, 0x00000001, 0x0000004B,\n    0x0000489F, 0x0004007C, 0x00000014, 0x00002A18, 0x00002C4E, 0x00050082,\n    0x00000014, 0x0000187D, 0x00000B0C, 0x00002A18, 0x00050080, 0x00000014,\n    0x00002213, 0x00002A18, 0x00000938, 0x000600A9, 0x00000014, 0x00002872,\n    0x000040CC, 0x00002213, 0x00005B93, 0x000500C4, 0x00000014, 0x00005AD7,\n    0x0000489F, 0x0000187D, 0x000500C7, 0x00000014, 0x0000499D, 0x00005AD7,\n    0x00000466, 0x000600A9, 0x00000014, 0x00002AA0, 0x000040CC, 0x0000499D,\n    0x0000489F, 0x00050080, 0x00000014, 0x00005FFC, 0x00002872, 0x000003FA,\n    0x000500C4, 0x00000014, 0x00004F82, 0x00005FFC, 0x00000189, 0x000500C4,\n    0x00000014, 0x00003FA9, 0x00002AA0, 0x0000008D, 0x000500C5, 0x00000014,\n    0x0000577F, 0x00004F82, 0x00003FA9, 0x000500AA, 0x00000010, 0x00003603,\n    0x00005DE9, 0x00000A12, 0x000600A9, 0x00000014, 0x00004245, 0x00003603,\n    0x00000A12, 0x0000577F, 0x0004007C, 0x00000018, 0x000029D2, 0x00004245,\n    0x000500C2, 0x0000000B, 0x00004BA7, 0x000027F7, 0x00000A64, 0x00040070,\n    0x0000000D, 0x00004811, 0x00004BA7, 0x00050085, 0x0000000D, 0x00003E22,\n    0x00004811, 0x00000149, 0x00050051, 0x0000000D, 0x000053C5, 0x000029D2,\n    0x00000000, 0x00050051, 0x0000000D, 0x00002A58, 0x000029D2, 0x00000001,\n    0x00050051, 0x0000000D, 0x00002B11, 0x000029D2, 0x00000002, 0x00070050,\n    0x0000001D, 0x0000234B, 0x000053C5, 0x00002A58, 0x00002B11, 0x00003E22,\n    0x000200F9, 0x00003F60, 0x000200F8, 0x00001CBB, 0x00050051, 0x0000000B,\n    0x000056BE, 0x00002ABF, 0x00000000, 0x00070050, 0x00000017, 0x00004F0B,\n    0x000056BE, 0x000056BE, 0x000056BE, 0x000056BE, 0x000500C2, 0x00000017,\n    0x00002498, 0x00004F0B, 0x0000034D, 0x000500C7, 0x00000017, 0x000049AB,\n    0x00002498, 0x0000027B, 0x00040070, 0x0000001D, 0x00003CB7, 0x000049AB,\n    0x00050085, 0x0000001D, 0x00004130, 0x00003CB7, 0x00000AEE, 0x00050051,\n    0x0000000B, 0x00005CD2, 0x00002ABF, 0x00000001, 0x00070050, 0x00000017,\n    0x0000514D, 0x00005CD2, 0x00005CD2, 0x00005CD2, 0x00005CD2, 0x000500C2,\n    0x00000017, 0x00002499, 0x0000514D, 0x0000034D, 0x000500C7, 0x00000017,\n    0x000049AC, 0x00002499, 0x0000027B, 0x00040070, 0x0000001D, 0x00003CB8,\n    0x000049AC, 0x00050085, 0x0000001D, 0x00004131, 0x00003CB8, 0x00000AEE,\n    0x00050051, 0x0000000B, 0x00005CD3, 0x00002ABF, 0x00000002, 0x00070050,\n    0x00000017, 0x0000514E, 0x00005CD3, 0x00005CD3, 0x00005CD3, 0x00005CD3,\n    0x000500C2, 0x00000017, 0x0000249A, 0x0000514E, 0x0000034D, 0x000500C7,\n    0x00000017, 0x000049AD, 0x0000249A, 0x0000027B, 0x00040070, 0x0000001D,\n    0x00003CB9, 0x000049AD, 0x00050085, 0x0000001D, 0x00004132, 0x00003CB9,\n    0x00000AEE, 0x00050051, 0x0000000B, 0x00005CD4, 0x00002ABF, 0x00000003,\n    0x00070050, 0x00000017, 0x0000514F, 0x00005CD4, 0x00005CD4, 0x00005CD4,\n    0x00005CD4, 0x000500C2, 0x00000017, 0x0000249B, 0x0000514F, 0x0000034D,\n    0x000500C7, 0x00000017, 0x000049AE, 0x0000249B, 0x0000027B, 0x00040070,\n    0x0000001D, 0x0000492F, 0x000049AE, 0x00050085, 0x0000001D, 0x0000269F,\n    0x0000492F, 0x00000AEE, 0x000200F9, 0x00003F60, 0x000200F8, 0x000038F9,\n    0x00050051, 0x0000000B, 0x000056BF, 0x00002ABF, 0x00000000, 0x00070050,\n    0x00000017, 0x00004F0C, 0x000056BF, 0x000056BF, 0x000056BF, 0x000056BF,\n    0x000500C2, 0x00000017, 0x0000249C, 0x00004F0C, 0x0000028D, 0x000500C7,\n    0x00000017, 0x00004A56, 0x0000249C, 0x0000064B, 0x00040070, 0x0000001D,\n    0x000036A2, 0x00004A56, 0x0005008E, 0x0000001D, 0x00004B23, 0x000036A2,\n    0x0000017A, 0x00050051, 0x0000000B, 0x0000219F, 0x00002ABF, 0x00000001,\n    0x00070050, 0x00000017, 0x0000610B, 0x0000219F, 0x0000219F, 0x0000219F,\n    0x0000219F, 0x000500C2, 0x00000017, 0x0000249D, 0x0000610B, 0x0000028D,\n    0x000500C7, 0x00000017, 0x00004A57, 0x0000249D, 0x0000064B, 0x00040070,\n    0x0000001D, 0x000036A3, 0x00004A57, 0x0005008E, 0x0000001D, 0x00004B24,\n    0x000036A3, 0x0000017A, 0x00050051, 0x0000000B, 0x000021A0, 0x00002ABF,\n    0x00000002, 0x00070050, 0x00000017, 0x0000610C, 0x000021A0, 0x000021A0,\n    0x000021A0, 0x000021A0, 0x000500C2, 0x00000017, 0x0000249E, 0x0000610C,\n    0x0000028D, 0x000500C7, 0x00000017, 0x00004A58, 0x0000249E, 0x0000064B,\n    0x00040070, 0x0000001D, 0x000036A4, 0x00004A58, 0x0005008E, 0x0000001D,\n    0x00004B25, 0x000036A4, 0x0000017A, 0x00050051, 0x0000000B, 0x000021A1,\n    0x00002ABF, 0x00000003, 0x00070050, 0x00000017, 0x0000610D, 0x000021A1,\n    0x000021A1, 0x000021A1, 0x000021A1, 0x000500C2, 0x00000017, 0x0000249F,\n    0x0000610D, 0x0000028D, 0x000500C7, 0x00000017, 0x00004A59, 0x0000249F,\n    0x0000064B, 0x00040070, 0x0000001D, 0x0000431A, 0x00004A59, 0x0005008E,\n    0x0000001D, 0x00003092, 0x0000431A, 0x0000017A, 0x000200F9, 0x00003F60,\n    0x000200F8, 0x00004BFB, 0x00050051, 0x0000000B, 0x0000308C, 0x00002ABF,\n    0x00000000, 0x0004007C, 0x0000000D, 0x00004FEE, 0x0000308C, 0x00050050,\n    0x00000013, 0x00004336, 0x00004FEE, 0x00000A0C, 0x0009004F, 0x0000001D,\n    0x00002D90, 0x00004336, 0x00004336, 0x00000000, 0x00000001, 0x00000001,\n    0x00000001, 0x00050051, 0x0000000B, 0x000056B1, 0x00002ABF, 0x00000001,\n    0x0004007C, 0x0000000D, 0x00003F68, 0x000056B1, 0x00050050, 0x00000013,\n    0x00004337, 0x00003F68, 0x00000A0C, 0x0009004F, 0x0000001D, 0x00002D91,\n    0x00004337, 0x00004337, 0x00000000, 0x00000001, 0x00000001, 0x00000001,\n    0x00050051, 0x0000000B, 0x000056B2, 0x00002ABF, 0x00000002, 0x0004007C,\n    0x0000000D, 0x00003F69, 0x000056B2, 0x00050050, 0x00000013, 0x00004338,\n    0x00003F69, 0x00000A0C, 0x0009004F, 0x0000001D, 0x00002D92, 0x00004338,\n    0x00004338, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00050051,\n    0x0000000B, 0x000056B3, 0x00002ABF, 0x00000003, 0x0004007C, 0x0000000D,\n    0x00003F6A, 0x000056B3, 0x00050050, 0x00000013, 0x00004FAE, 0x00003F6A,\n    0x00000A0C, 0x0009004F, 0x0000001D, 0x00005A3A, 0x00004FAE, 0x00004FAE,\n    0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x000200F9, 0x00003F60,\n    0x000200F8, 0x00003F60, 0x000F00F5, 0x0000001D, 0x00002BA7, 0x00005A3A,\n    0x00004BFB, 0x00003092, 0x000038F9, 0x0000269F, 0x00001CBB, 0x0000234B,\n    0x00001CBA, 0x0000234A, 0x00001FFE, 0x00002349, 0x00002033, 0x000F00F5,\n    0x0000001D, 0x00003808, 0x00002D92, 0x00004BFB, 0x00004B25, 0x000038F9,\n    0x00004132, 0x00001CBB, 0x00003DDC, 0x00001CBA, 0x00004120, 0x00001FFE,\n    0x0000390E, 0x00002033, 0x000F00F5, 0x0000001D, 0x00003B7D, 0x00002D91,\n    0x00004BFB, 0x00004B24, 0x000038F9, 0x00004131, 0x00001CBB, 0x00003DDB,\n    0x00001CBA, 0x0000411F, 0x00001FFE, 0x0000390D, 0x00002033, 0x000F00F5,\n    0x0000001D, 0x000038B6, 0x00002D90, 0x00004BFB, 0x00004B23, 0x000038F9,\n    0x00004130, 0x00001CBB, 0x00003DDA, 0x00001CBA, 0x0000411E, 0x00001FFE,\n    0x0000390C, 0x00002033, 0x000200F9, 0x0000530F, 0x000200F8, 0x00003B65,\n    0x000500AA, 0x00000009, 0x00005450, 0x0000199B, 0x00000A22, 0x000300F7,\n    0x00004F23, 0x00000002, 0x000400FA, 0x00005450, 0x000019C0, 0x00002300,\n    0x000200F8, 0x00002300, 0x000500C2, 0x0000000B, 0x00005631, 0x00005BEB,\n    0x00000A11, 0x00060041, 0x00000289, 0x0000343B, 0x00000CC7, 0x00000A0B,\n    0x00005631, 0x0004003D, 0x0000000B, 0x00003142, 0x0000343B, 0x00050080,\n    0x0000000B, 0x00002DAA, 0x00005631, 0x00000A0D, 0x00060041, 0x00000289,\n    0x00001901, 0x00000CC7, 0x00000A0B, 0x00002DAA, 0x0004003D, 0x0000000B,\n    0x00001B76, 0x00001901, 0x00050080, 0x0000000B, 0x00002146, 0x00005BEB,\n    0x0000199B, 0x000500C2, 0x0000000B, 0x000054A7, 0x00002146, 0x00000A11,\n    0x00060041, 0x00000289, 0x00004C91, 0x00000CC7, 0x00000A0B, 0x000054A7,\n    0x0004003D, 0x0000000B, 0x00003143, 0x00004C91, 0x00050080, 0x0000000B,\n    0x00002DAB, 0x000054A7, 0x00000A0D, 0x00060041, 0x00000289, 0x00005FEF,\n    0x00000CC7, 0x00000A0B, 0x00002DAB, 0x0004003D, 0x0000000B, 0x0000374C,\n    0x00005FEF, 0x00070050, 0x00000017, 0x00004CD6, 0x00003142, 0x00001B76,\n    0x00003143, 0x0000374C, 0x00050084, 0x0000000B, 0x00004C2B, 0x00000A10,\n    0x0000199B, 0x00050080, 0x0000000B, 0x00002A45, 0x00005BEB, 0x00004C2B,\n    0x000500C2, 0x0000000B, 0x000045E4, 0x00002A45, 0x00000A11, 0x00060041,\n    0x00000289, 0x00004C92, 0x00000CC7, 0x00000A0B, 0x000045E4, 0x0004003D,\n    0x0000000B, 0x00003144, 0x00004C92, 0x00050080, 0x0000000B, 0x00002DAC,\n    0x000045E4, 0x00000A0D, 0x00060041, 0x00000289, 0x0000194B, 0x00000CC7,\n    0x00000A0B, 0x00002DAC, 0x0004003D, 0x0000000B, 0x00005E5B, 0x0000194B,\n    0x00050084, 0x0000000B, 0x000021EF, 0x00000A13, 0x0000199B, 0x00050080,\n    0x0000000B, 0x00005EC0, 0x00005BEB, 0x000021EF, 0x000500C2, 0x0000000B,\n    0x000045E5, 0x00005EC0, 0x00000A11, 0x00060041, 0x00000289, 0x00004C93,\n    0x00000CC7, 0x00000A0B, 0x000045E5, 0x0004003D, 0x0000000B, 0x00003145,\n    0x00004C93, 0x00050080, 0x0000000B, 0x00002DAD, 0x000045E5, 0x00000A0D,\n    0x00060041, 0x00000289, 0x00005FF0, 0x00000CC7, 0x00000A0B, 0x00002DAD,\n    0x0004003D, 0x0000000B, 0x00003FFC, 0x00005FF0, 0x00070050, 0x00000017,\n    0x0000512E, 0x00003144, 0x00005E5B, 0x00003145, 0x00003FFC, 0x000200F9,\n    0x00004F23, 0x000200F8, 0x000019C0, 0x000500C2, 0x0000000B, 0x00005FA7,\n    0x00005BEB, 0x00000A11, 0x00060041, 0x00000289, 0x0000343C, 0x00000CC7,\n    0x00000A0B, 0x00005FA7, 0x0004003D, 0x0000000B, 0x00003146, 0x0000343C,\n    0x00050080, 0x0000000B, 0x00002DAE, 0x00005FA7, 0x00000A0D, 0x00060041,\n    0x00000289, 0x00001902, 0x00000CC7, 0x00000A0B, 0x00002DAE, 0x0004003D,\n    0x0000000B, 0x00005C64, 0x00001902, 0x00050080, 0x0000000B, 0x00002DAF,\n    0x00005FA7, 0x00000A10, 0x00060041, 0x00000289, 0x00001903, 0x00000CC7,\n    0x00000A0B, 0x00002DAF, 0x0004003D, 0x0000000B, 0x00005C65, 0x00001903,\n    0x00050080, 0x0000000B, 0x00002DB0, 0x00005FA7, 0x00000A13, 0x00060041,\n    0x00000289, 0x00005FF1, 0x00000CC7, 0x00000A0B, 0x00002DB0, 0x0004003D,\n    0x0000000B, 0x00003700, 0x00005FF1, 0x00070050, 0x00000017, 0x00005470,\n    0x00003146, 0x00005C64, 0x00005C65, 0x00003700, 0x00050080, 0x0000000B,\n    0x00004B83, 0x00005BEB, 0x00000A3A, 0x000500C2, 0x0000000B, 0x0000202D,\n    0x00004B83, 0x00000A11, 0x00060041, 0x00000289, 0x00004C94, 0x00000CC7,\n    0x00000A0B, 0x0000202D, 0x0004003D, 0x0000000B, 0x00003147, 0x00004C94,\n    0x00050080, 0x0000000B, 0x00002DB1, 0x0000202D, 0x00000A0D, 0x00060041,\n    0x00000289, 0x00001904, 0x00000CC7, 0x00000A0B, 0x00002DB1, 0x0004003D,\n    0x0000000B, 0x00005C66, 0x00001904, 0x00050080, 0x0000000B, 0x00002DB2,\n    0x0000202D, 0x00000A10, 0x00060041, 0x00000289, 0x00001905, 0x00000CC7,\n    0x00000A0B, 0x00002DB2, 0x0004003D, 0x0000000B, 0x00005C67, 0x00001905,\n    0x00050080, 0x0000000B, 0x00002DB3, 0x0000202D, 0x00000A13, 0x00060041,\n    0x00000289, 0x00005FF2, 0x00000CC7, 0x00000A0B, 0x00002DB3, 0x0004003D,\n    0x0000000B, 0x00003FFD, 0x00005FF2, 0x00070050, 0x00000017, 0x0000512F,\n    0x00003147, 0x00005C66, 0x00005C67, 0x00003FFD, 0x000200F9, 0x00004F23,\n    0x000200F8, 0x00004F23, 0x000700F5, 0x00000017, 0x00002BCD, 0x0000512F,\n    0x000019C0, 0x0000512E, 0x00002300, 0x000700F5, 0x00000017, 0x00003720,\n    0x00005470, 0x000019C0, 0x00004CD6, 0x00002300, 0x000300F7, 0x00004F24,\n    0x00000000, 0x000700FB, 0x00002180, 0x00004F56, 0x00000005, 0x00002158,\n    0x00000007, 0x00002034, 0x000200F8, 0x00002034, 0x00050051, 0x0000000B,\n    0x00005F57, 0x00003720, 0x00000000, 0x0006000C, 0x00000013, 0x00006068,\n    0x00000001, 0x0000003E, 0x00005F57, 0x00050051, 0x0000000D, 0x00002775,\n    0x00006068, 0x00000000, 0x00050051, 0x0000000D, 0x00003EB8, 0x00006068,\n    0x00000001, 0x00050051, 0x0000000B, 0x00004281, 0x00003720, 0x00000001,\n    0x0006000C, 0x00000013, 0x00003CF5, 0x00000001, 0x0000003E, 0x00004281,\n    0x00050051, 0x0000000D, 0x00002766, 0x00003CF5, 0x00000000, 0x00050051,\n    0x0000000D, 0x00004449, 0x00003CF5, 0x00000001, 0x00070050, 0x0000001D,\n    0x0000390F, 0x00002775, 0x00003EB8, 0x00002766, 0x00004449, 0x00050051,\n    0x0000000B, 0x0000437D, 0x00003720, 0x00000002, 0x0006000C, 0x00000013,\n    0x0000466E, 0x00000001, 0x0000003E, 0x0000437D, 0x00050051, 0x0000000D,\n    0x00002776, 0x0000466E, 0x00000000, 0x00050051, 0x0000000D, 0x00003EB9,\n    0x0000466E, 0x00000001, 0x00050051, 0x0000000B, 0x00004282, 0x00003720,\n    0x00000003, 0x0006000C, 0x00000013, 0x00003CF6, 0x00000001, 0x0000003E,\n    0x00004282, 0x00050051, 0x0000000D, 0x00002767, 0x00003CF6, 0x00000000,\n    0x00050051, 0x0000000D, 0x0000444A, 0x00003CF6, 0x00000001, 0x00070050,\n    0x0000001D, 0x00003910, 0x00002776, 0x00003EB9, 0x00002767, 0x0000444A,\n    0x00050051, 0x0000000B, 0x0000437E, 0x00002BCD, 0x00000000, 0x0006000C,\n    0x00000013, 0x0000466F, 0x00000001, 0x0000003E, 0x0000437E, 0x00050051,\n    0x0000000D, 0x00002777, 0x0000466F, 0x00000000, 0x00050051, 0x0000000D,\n    0x00003EBA, 0x0000466F, 0x00000001, 0x00050051, 0x0000000B, 0x00004283,\n    0x00002BCD, 0x00000001, 0x0006000C, 0x00000013, 0x00003CF7, 0x00000001,\n    0x0000003E, 0x00004283, 0x00050051, 0x0000000D, 0x00002768, 0x00003CF7,\n    0x00000000, 0x00050051, 0x0000000D, 0x0000444B, 0x00003CF7, 0x00000001,\n    0x00070050, 0x0000001D, 0x00003911, 0x00002777, 0x00003EBA, 0x00002768,\n    0x0000444B, 0x00050051, 0x0000000B, 0x0000437F, 0x00002BCD, 0x00000002,\n    0x0006000C, 0x00000013, 0x00004670, 0x00000001, 0x0000003E, 0x0000437F,\n    0x00050051, 0x0000000D, 0x00002778, 0x00004670, 0x00000000, 0x00050051,\n    0x0000000D, 0x00003EBB, 0x00004670, 0x00000001, 0x00050051, 0x0000000B,\n    0x00004284, 0x00002BCD, 0x00000003, 0x0006000C, 0x00000013, 0x00003CF8,\n    0x00000001, 0x0000003E, 0x00004284, 0x00050051, 0x0000000D, 0x00002769,\n    0x00003CF8, 0x00000000, 0x00050051, 0x0000000D, 0x000050BF, 0x00003CF8,\n    0x00000001, 0x00070050, 0x0000001D, 0x0000234C, 0x00002778, 0x00003EBB,\n    0x00002769, 0x000050BF, 0x000200F9, 0x00004F24, 0x000200F8, 0x00002158,\n    0x0007004F, 0x00000011, 0x000025FB, 0x00003720, 0x00003720, 0x00000000,\n    0x00000001, 0x0004007C, 0x00000012, 0x00005B3C, 0x000025FB, 0x0009004F,\n    0x0000001A, 0x000060CE, 0x00005B3C, 0x00005B3C, 0x00000000, 0x00000000,\n    0x00000001, 0x00000001, 0x000500C4, 0x0000001A, 0x000048A6, 0x000060CE,\n    0x00000122, 0x000500C3, 0x0000001A, 0x00003D8D, 0x000048A6, 0x00000302,\n    0x0004006F, 0x0000001D, 0x00002A9B, 0x00003D8D, 0x0005008E, 0x0000001D,\n    0x00004721, 0x00002A9B, 0x000007FE, 0x0007000C, 0x0000001D, 0x00006291,\n    0x00000001, 0x00000028, 0x00000504, 0x00004721, 0x0007004F, 0x00000011,\n    0x0000376B, 0x00003720, 0x00003720, 0x00000002, 0x00000003, 0x0004007C,\n    0x00000012, 0x000024BF, 0x0000376B, 0x0009004F, 0x0000001A, 0x000060CF,\n    0x000024BF, 0x000024BF, 0x00000000, 0x00000000, 0x00000001, 0x00000001,\n    0x000500C4, 0x0000001A, 0x000048A7, 0x000060CF, 0x00000122, 0x000500C3,\n    0x0000001A, 0x00003D8E, 0x000048A7, 0x00000302, 0x0004006F, 0x0000001D,\n    0x00002A9C, 0x00003D8E, 0x0005008E, 0x0000001D, 0x00004722, 0x00002A9C,\n    0x000007FE, 0x0007000C, 0x0000001D, 0x00006292, 0x00000001, 0x00000028,\n    0x00000504, 0x00004722, 0x0007004F, 0x00000011, 0x0000376C, 0x00002BCD,\n    0x00002BCD, 0x00000000, 0x00000001, 0x0004007C, 0x00000012, 0x000024C0,\n    0x0000376C, 0x0009004F, 0x0000001A, 0x000060D0, 0x000024C0, 0x000024C0,\n    0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x000500C4, 0x0000001A,\n    0x000048A8, 0x000060D0, 0x00000122, 0x000500C3, 0x0000001A, 0x00003D8F,\n    0x000048A8, 0x00000302, 0x0004006F, 0x0000001D, 0x00002AA1, 0x00003D8F,\n    0x0005008E, 0x0000001D, 0x00004723, 0x00002AA1, 0x000007FE, 0x0007000C,\n    0x0000001D, 0x00006293, 0x00000001, 0x00000028, 0x00000504, 0x00004723,\n    0x0007004F, 0x00000011, 0x0000376D, 0x00002BCD, 0x00002BCD, 0x00000002,\n    0x00000003, 0x0004007C, 0x00000012, 0x000024C1, 0x0000376D, 0x0009004F,\n    0x0000001A, 0x000060D1, 0x000024C1, 0x000024C1, 0x00000000, 0x00000000,\n    0x00000001, 0x00000001, 0x000500C4, 0x0000001A, 0x000048A9, 0x000060D1,\n    0x00000122, 0x000500C3, 0x0000001A, 0x00003D90, 0x000048A9, 0x00000302,\n    0x0004006F, 0x0000001D, 0x00002AA2, 0x00003D90, 0x0005008E, 0x0000001D,\n    0x000053BF, 0x00002AA2, 0x000007FE, 0x0007000C, 0x0000001D, 0x00004362,\n    0x00000001, 0x00000028, 0x00000504, 0x000053BF, 0x000200F9, 0x00004F24,\n    0x000200F8, 0x00004F56, 0x0007004F, 0x00000011, 0x00002621, 0x00003720,\n    0x00003720, 0x00000000, 0x00000001, 0x0004007C, 0x00000013, 0x00005159,\n    0x00002621, 0x00050051, 0x0000000D, 0x00001B7B, 0x00005159, 0x00000000,\n    0x00050051, 0x0000000D, 0x0000346A, 0x00005159, 0x00000001, 0x00070050,\n    0x0000001D, 0x00004278, 0x00001B7B, 0x0000346A, 0x00000A0C, 0x00000A0C,\n    0x0007004F, 0x00000011, 0x000041D8, 0x00003720, 0x00003720, 0x00000002,\n    0x00000003, 0x0004007C, 0x00000013, 0x0000375D, 0x000041D8, 0x00050051,\n    0x0000000D, 0x00001B7C, 0x0000375D, 0x00000000, 0x00050051, 0x0000000D,\n    0x0000346B, 0x0000375D, 0x00000001, 0x00070050, 0x0000001D, 0x00004279,\n    0x00001B7C, 0x0000346B, 0x00000A0C, 0x00000A0C, 0x0007004F, 0x00000011,\n    0x000041D9, 0x00002BCD, 0x00002BCD, 0x00000000, 0x00000001, 0x0004007C,\n    0x00000013, 0x0000375E, 0x000041D9, 0x00050051, 0x0000000D, 0x00001B7D,\n    0x0000375E, 0x00000000, 0x00050051, 0x0000000D, 0x0000346C, 0x0000375E,\n    0x00000001, 0x00070050, 0x0000001D, 0x0000427A, 0x00001B7D, 0x0000346C,\n    0x00000A0C, 0x00000A0C, 0x0007004F, 0x00000011, 0x000041DA, 0x00002BCD,\n    0x00002BCD, 0x00000002, 0x00000003, 0x0004007C, 0x00000013, 0x0000375F,\n    0x000041DA, 0x00050051, 0x0000000D, 0x00001B7E, 0x0000375F, 0x00000000,\n    0x00050051, 0x0000000D, 0x00004108, 0x0000375F, 0x00000001, 0x00070050,\n    0x0000001D, 0x0000234D, 0x00001B7E, 0x00004108, 0x00000A0C, 0x00000A0C,\n    0x000200F9, 0x00004F24, 0x000200F8, 0x00004F24, 0x000900F5, 0x0000001D,\n    0x00002BA8, 0x0000234D, 0x00004F56, 0x00004362, 0x00002158, 0x0000234C,\n    0x00002034, 0x000900F5, 0x0000001D, 0x00003809, 0x0000427A, 0x00004F56,\n    0x00006293, 0x00002158, 0x00003911, 0x00002034, 0x000900F5, 0x0000001D,\n    0x00003B7E, 0x00004279, 0x00004F56, 0x00006292, 0x00002158, 0x00003910,\n    0x00002034, 0x000900F5, 0x0000001D, 0x000038B7, 0x00004278, 0x00004F56,\n    0x00006291, 0x00002158, 0x0000390F, 0x00002034, 0x000200F9, 0x0000530F,\n    0x000200F8, 0x0000530F, 0x000700F5, 0x0000001D, 0x00002BA9, 0x00002BA8,\n    0x00004F24, 0x00002BA7, 0x00003F60, 0x000700F5, 0x0000001D, 0x0000380A,\n    0x00003809, 0x00004F24, 0x00003808, 0x00003F60, 0x000700F5, 0x0000001D,\n    0x000035EC, 0x00003B7E, 0x00004F24, 0x00003B7D, 0x00003F60, 0x000700F5,\n    0x0000001D, 0x000020D3, 0x000038B7, 0x00004F24, 0x000038B6, 0x00003F60,\n    0x000500AE, 0x00000009, 0x00002E55, 0x00003F4D, 0x00000A16, 0x000300F7,\n    0x00005313, 0x00000002, 0x000400FA, 0x00002E55, 0x000050E5, 0x00005313,\n    0x000200F8, 0x000050E5, 0x00050085, 0x0000000D, 0x000061FB, 0x00002B2C,\n    0x000000FC, 0x00050080, 0x0000000B, 0x00005E78, 0x00005BEB, 0x00000207,\n    0x000300F7, 0x00005310, 0x00000002, 0x000400FA, 0x00005AEF, 0x00003B66,\n    0x000040BA, 0x000200F8, 0x000040BA, 0x000500AA, 0x00000009, 0x00004ADB,\n    0x0000199B, 0x00000A16, 0x000300F7, 0x00004F4A, 0x00000002, 0x000400FA,\n    0x00004ADB, 0x000019C1, 0x00002301, 0x000200F8, 0x00002301, 0x000500C2,\n    0x0000000B, 0x00005632, 0x00005E78, 0x00000A11, 0x00060041, 0x00000289,\n    0x0000343D, 0x00000CC7, 0x00000A0B, 0x00005632, 0x0004003D, 0x0000000B,\n    0x00003AD5, 0x0000343D, 0x00050080, 0x0000000B, 0x00002147, 0x00005E78,\n    0x0000199B, 0x000500C2, 0x0000000B, 0x000054A8, 0x00002147, 0x00000A11,\n    0x00060041, 0x00000289, 0x00004CDF, 0x00000CC7, 0x00000A0B, 0x000054A8,\n    0x0004003D, 0x0000000B, 0x0000333C, 0x00004CDF, 0x00050084, 0x0000000B,\n    0x000021F0, 0x00000A10, 0x0000199B, 0x00050080, 0x0000000B, 0x00005EC1,\n    0x00005E78, 0x000021F0, 0x000500C2, 0x0000000B, 0x000045E6, 0x00005EC1,\n    0x00000A11, 0x00060041, 0x00000289, 0x00004CE0, 0x00000CC7, 0x00000A0B,\n    0x000045E6, 0x0004003D, 0x0000000B, 0x0000333D, 0x00004CE0, 0x00050084,\n    0x0000000B, 0x000021F1, 0x00000A13, 0x0000199B, 0x00050080, 0x0000000B,\n    0x00005EC2, 0x00005E78, 0x000021F1, 0x000500C2, 0x0000000B, 0x000045E7,\n    0x00005EC2, 0x00000A11, 0x00060041, 0x00000289, 0x00004902, 0x00000CC7,\n    0x00000A0B, 0x000045E7, 0x0004003D, 0x0000000B, 0x00005F5A, 0x00004902,\n    0x00070050, 0x00000017, 0x00005130, 0x00003AD5, 0x0000333C, 0x0000333D,\n    0x00005F5A, 0x000200F9, 0x00004F4A, 0x000200F8, 0x000019C1, 0x000500C2,\n    0x0000000B, 0x00005FA8, 0x00005E78, 0x00000A11, 0x00060041, 0x00000289,\n    0x0000343E, 0x00000CC7, 0x00000A0B, 0x00005FA8, 0x0004003D, 0x0000000B,\n    0x00003148, 0x0000343E, 0x00050080, 0x0000000B, 0x00002DB4, 0x00005FA8,\n    0x00000A0D, 0x00060041, 0x00000289, 0x00001906, 0x00000CC7, 0x00000A0B,\n    0x00002DB4, 0x0004003D, 0x0000000B, 0x00005C68, 0x00001906, 0x00050080,\n    0x0000000B, 0x00002DB5, 0x00005FA8, 0x00000A10, 0x00060041, 0x00000289,\n    0x00001907, 0x00000CC7, 0x00000A0B, 0x00002DB5, 0x0004003D, 0x0000000B,\n    0x00005C69, 0x00001907, 0x00050080, 0x0000000B, 0x00002DB6, 0x00005FA8,\n    0x00000A13, 0x00060041, 0x00000289, 0x00005FF3, 0x00000CC7, 0x00000A0B,\n    0x00002DB6, 0x0004003D, 0x0000000B, 0x00003FFE, 0x00005FF3, 0x00070050,\n    0x00000017, 0x00005131, 0x00003148, 0x00005C68, 0x00005C69, 0x00003FFE,\n    0x000200F9, 0x00004F4A, 0x000200F8, 0x00004F4A, 0x000700F5, 0x00000017,\n    0x00002AC0, 0x00005131, 0x000019C1, 0x00005130, 0x00002301, 0x000300F7,\n    0x00003F61, 0x00000000, 0x001300FB, 0x00002180, 0x00004BFC, 0x00000000,\n    0x000038FA, 0x00000001, 0x000038FA, 0x00000002, 0x00001CBD, 0x0000000A,\n    0x00001CBD, 0x00000003, 0x00001CBC, 0x0000000C, 0x00001CBC, 0x00000004,\n    0x00001FFF, 0x00000006, 0x00002035, 0x000200F8, 0x00002035, 0x00050051,\n    0x0000000B, 0x00005F58, 0x00002AC0, 0x00000000, 0x0006000C, 0x00000013,\n    0x00006069, 0x00000001, 0x0000003E, 0x00005F58, 0x00050051, 0x0000000D,\n    0x0000276A, 0x00006069, 0x00000000, 0x00050051, 0x0000000D, 0x0000444C,\n    0x00006069, 0x00000001, 0x00070050, 0x0000001D, 0x00003912, 0x0000276A,\n    0x0000444C, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x00004380,\n    0x00002AC0, 0x00000001, 0x0006000C, 0x00000013, 0x00004671, 0x00000001,\n    0x0000003E, 0x00004380, 0x00050051, 0x0000000D, 0x0000276B, 0x00004671,\n    0x00000000, 0x00050051, 0x0000000D, 0x0000444D, 0x00004671, 0x00000001,\n    0x00070050, 0x0000001D, 0x00003913, 0x0000276B, 0x0000444D, 0x00000A0C,\n    0x00000A0C, 0x00050051, 0x0000000B, 0x00004381, 0x00002AC0, 0x00000002,\n    0x0006000C, 0x00000013, 0x00004672, 0x00000001, 0x0000003E, 0x00004381,\n    0x00050051, 0x0000000D, 0x0000276C, 0x00004672, 0x00000000, 0x00050051,\n    0x0000000D, 0x0000444E, 0x00004672, 0x00000001, 0x00070050, 0x0000001D,\n    0x00003914, 0x0000276C, 0x0000444E, 0x00000A0C, 0x00000A0C, 0x00050051,\n    0x0000000B, 0x00004382, 0x00002AC0, 0x00000003, 0x0006000C, 0x00000013,\n    0x00004673, 0x00000001, 0x0000003E, 0x00004382, 0x00050051, 0x0000000D,\n    0x0000276D, 0x00004673, 0x00000000, 0x00050051, 0x0000000D, 0x000050C0,\n    0x00004673, 0x00000001, 0x00070050, 0x0000001D, 0x0000234E, 0x0000276D,\n    0x000050C0, 0x00000A0C, 0x00000A0C, 0x000200F9, 0x00003F61, 0x000200F8,\n    0x00001FFF, 0x00050051, 0x0000000B, 0x0000308D, 0x00002AC0, 0x00000000,\n    0x0004007C, 0x0000000C, 0x0000589E, 0x0000308D, 0x00050050, 0x00000012,\n    0x0000471E, 0x0000589E, 0x0000589E, 0x000500C4, 0x00000012, 0x000047B1,\n    0x0000471E, 0x000007A7, 0x000500C3, 0x00000012, 0x0000341B, 0x000047B1,\n    0x00000867, 0x0004006F, 0x00000013, 0x00002AA3, 0x0000341B, 0x0005008E,\n    0x00000013, 0x0000474B, 0x00002AA3, 0x000007FE, 0x0007000C, 0x00000013,\n    0x00005E0A, 0x00000001, 0x00000028, 0x00000049, 0x0000474B, 0x00050051,\n    0x0000000D, 0x00005F0E, 0x00005E0A, 0x00000000, 0x00050051, 0x0000000D,\n    0x00003CD7, 0x00005E0A, 0x00000001, 0x00070050, 0x0000001D, 0x00004121,\n    0x00005F0E, 0x00003CD7, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B,\n    0x00004C45, 0x00002AC0, 0x00000001, 0x0004007C, 0x0000000C, 0x00003EA4,\n    0x00004C45, 0x00050050, 0x00000012, 0x0000471F, 0x00003EA4, 0x00003EA4,\n    0x000500C4, 0x00000012, 0x000047B2, 0x0000471F, 0x000007A7, 0x000500C3,\n    0x00000012, 0x0000341C, 0x000047B2, 0x00000867, 0x0004006F, 0x00000013,\n    0x00002AA4, 0x0000341C, 0x0005008E, 0x00000013, 0x0000474C, 0x00002AA4,\n    0x000007FE, 0x0007000C, 0x00000013, 0x00005E0B, 0x00000001, 0x00000028,\n    0x00000049, 0x0000474C, 0x00050051, 0x0000000D, 0x00005F0F, 0x00005E0B,\n    0x00000000, 0x00050051, 0x0000000D, 0x00003CD8, 0x00005E0B, 0x00000001,\n    0x00070050, 0x0000001D, 0x00004122, 0x00005F0F, 0x00003CD8, 0x00000A0C,\n    0x00000A0C, 0x00050051, 0x0000000B, 0x00004C46, 0x00002AC0, 0x00000002,\n    0x0004007C, 0x0000000C, 0x00003EA5, 0x00004C46, 0x00050050, 0x00000012,\n    0x00004720, 0x00003EA5, 0x00003EA5, 0x000500C4, 0x00000012, 0x000047B3,\n    0x00004720, 0x000007A7, 0x000500C3, 0x00000012, 0x0000341D, 0x000047B3,\n    0x00000867, 0x0004006F, 0x00000013, 0x00002AA5, 0x0000341D, 0x0005008E,\n    0x00000013, 0x0000474D, 0x00002AA5, 0x000007FE, 0x0007000C, 0x00000013,\n    0x00005E0C, 0x00000001, 0x00000028, 0x00000049, 0x0000474D, 0x00050051,\n    0x0000000D, 0x00005F10, 0x00005E0C, 0x00000000, 0x00050051, 0x0000000D,\n    0x00003CD9, 0x00005E0C, 0x00000001, 0x00070050, 0x0000001D, 0x00004123,\n    0x00005F10, 0x00003CD9, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B,\n    0x00004C47, 0x00002AC0, 0x00000003, 0x0004007C, 0x0000000C, 0x00003EA6,\n    0x00004C47, 0x00050050, 0x00000012, 0x00004724, 0x00003EA6, 0x00003EA6,\n    0x000500C4, 0x00000012, 0x000047B4, 0x00004724, 0x000007A7, 0x000500C3,\n    0x00000012, 0x0000341E, 0x000047B4, 0x00000867, 0x0004006F, 0x00000013,\n    0x00002AA6, 0x0000341E, 0x0005008E, 0x00000013, 0x0000474E, 0x00002AA6,\n    0x000007FE, 0x0007000C, 0x00000013, 0x00005E0D, 0x00000001, 0x00000028,\n    0x00000049, 0x0000474E, 0x00050051, 0x0000000D, 0x00005F11, 0x00005E0D,\n    0x00000000, 0x00050051, 0x0000000D, 0x0000494D, 0x00005E0D, 0x00000001,\n    0x00070050, 0x0000001D, 0x0000234F, 0x00005F11, 0x0000494D, 0x00000A0C,\n    0x00000A0C, 0x000200F9, 0x00003F61, 0x000200F8, 0x00001CBC, 0x00050051,\n    0x0000000B, 0x000056C0, 0x00002AC0, 0x00000000, 0x00060050, 0x00000014,\n    0x00004F0D, 0x000056C0, 0x000056C0, 0x000056C0, 0x000500C2, 0x00000014,\n    0x00002B12, 0x00004F0D, 0x00000BB4, 0x000500C7, 0x00000014, 0x00005DEA,\n    0x00002B12, 0x00000105, 0x000500C7, 0x00000014, 0x000048A0, 0x00002B12,\n    0x00000466, 0x000500C2, 0x00000014, 0x00005B94, 0x00005DEA, 0x00000B0C,\n    0x000500AA, 0x00000010, 0x000040CD, 0x00005B94, 0x00000A12, 0x0006000C,\n    0x00000016, 0x00002C4F, 0x00000001, 0x0000004B, 0x000048A0, 0x0004007C,\n    0x00000014, 0x00002A19, 0x00002C4F, 0x00050082, 0x00000014, 0x0000187E,\n    0x00000B0C, 0x00002A19, 0x00050080, 0x00000014, 0x00002214, 0x00002A19,\n    0x00000938, 0x000600A9, 0x00000014, 0x00002873, 0x000040CD, 0x00002214,\n    0x00005B94, 0x000500C4, 0x00000014, 0x00005AD8, 0x000048A0, 0x0000187E,\n    0x000500C7, 0x00000014, 0x0000499E, 0x00005AD8, 0x00000466, 0x000600A9,\n    0x00000014, 0x00002AA7, 0x000040CD, 0x0000499E, 0x000048A0, 0x00050080,\n    0x00000014, 0x00005FFD, 0x00002873, 0x000003FA, 0x000500C4, 0x00000014,\n    0x00004F83, 0x00005FFD, 0x00000189, 0x000500C4, 0x00000014, 0x00003FAA,\n    0x00002AA7, 0x0000008D, 0x000500C5, 0x00000014, 0x00005780, 0x00004F83,\n    0x00003FAA, 0x000500AA, 0x00000010, 0x00003604, 0x00005DEA, 0x00000A12,\n    0x000600A9, 0x00000014, 0x00004246, 0x00003604, 0x00000A12, 0x00005780,\n    0x0004007C, 0x00000018, 0x000029D3, 0x00004246, 0x000500C2, 0x0000000B,\n    0x00004BA8, 0x000056C0, 0x00000A64, 0x00040070, 0x0000000D, 0x00004812,\n    0x00004BA8, 0x00050085, 0x0000000D, 0x00003E23, 0x00004812, 0x00000149,\n    0x00050051, 0x0000000D, 0x000053C6, 0x000029D3, 0x00000000, 0x00050051,\n    0x0000000D, 0x00002A59, 0x000029D3, 0x00000001, 0x00050051, 0x0000000D,\n    0x00001E9C, 0x000029D3, 0x00000002, 0x00070050, 0x0000001D, 0x00003DDD,\n    0x000053C6, 0x00002A59, 0x00001E9C, 0x00003E23, 0x00050051, 0x0000000B,\n    0x000027F8, 0x00002AC0, 0x00000001, 0x00060050, 0x00000014, 0x00003511,\n    0x000027F8, 0x000027F8, 0x000027F8, 0x000500C2, 0x00000014, 0x00002B13,\n    0x00003511, 0x00000BB4, 0x000500C7, 0x00000014, 0x00005DEB, 0x00002B13,\n    0x00000105, 0x000500C7, 0x00000014, 0x000048A1, 0x00002B13, 0x00000466,\n    0x000500C2, 0x00000014, 0x00005B95, 0x00005DEB, 0x00000B0C, 0x000500AA,\n    0x00000010, 0x000040CE, 0x00005B95, 0x00000A12, 0x0006000C, 0x00000016,\n    0x00002C50, 0x00000001, 0x0000004B, 0x000048A1, 0x0004007C, 0x00000014,\n    0x00002A1A, 0x00002C50, 0x00050082, 0x00000014, 0x0000187F, 0x00000B0C,\n    0x00002A1A, 0x00050080, 0x00000014, 0x00002215, 0x00002A1A, 0x00000938,\n    0x000600A9, 0x00000014, 0x00002874, 0x000040CE, 0x00002215, 0x00005B95,\n    0x000500C4, 0x00000014, 0x00005AD9, 0x000048A1, 0x0000187F, 0x000500C7,\n    0x00000014, 0x0000499F, 0x00005AD9, 0x00000466, 0x000600A9, 0x00000014,\n    0x00002AA8, 0x000040CE, 0x0000499F, 0x000048A1, 0x00050080, 0x00000014,\n    0x00005FFE, 0x00002874, 0x000003FA, 0x000500C4, 0x00000014, 0x00004F84,\n    0x00005FFE, 0x00000189, 0x000500C4, 0x00000014, 0x00003FAB, 0x00002AA8,\n    0x0000008D, 0x000500C5, 0x00000014, 0x00005781, 0x00004F84, 0x00003FAB,\n    0x000500AA, 0x00000010, 0x00003605, 0x00005DEB, 0x00000A12, 0x000600A9,\n    0x00000014, 0x00004247, 0x00003605, 0x00000A12, 0x00005781, 0x0004007C,\n    0x00000018, 0x000029D4, 0x00004247, 0x000500C2, 0x0000000B, 0x00004BA9,\n    0x000027F8, 0x00000A64, 0x00040070, 0x0000000D, 0x00004813, 0x00004BA9,\n    0x00050085, 0x0000000D, 0x00003E24, 0x00004813, 0x00000149, 0x00050051,\n    0x0000000D, 0x000053C7, 0x000029D4, 0x00000000, 0x00050051, 0x0000000D,\n    0x00002A5A, 0x000029D4, 0x00000001, 0x00050051, 0x0000000D, 0x00001E9D,\n    0x000029D4, 0x00000002, 0x00070050, 0x0000001D, 0x00003DDE, 0x000053C7,\n    0x00002A5A, 0x00001E9D, 0x00003E24, 0x00050051, 0x0000000B, 0x000027F9,\n    0x00002AC0, 0x00000002, 0x00060050, 0x00000014, 0x00003512, 0x000027F9,\n    0x000027F9, 0x000027F9, 0x000500C2, 0x00000014, 0x00002B14, 0x00003512,\n    0x00000BB4, 0x000500C7, 0x00000014, 0x00005DEC, 0x00002B14, 0x00000105,\n    0x000500C7, 0x00000014, 0x000048A2, 0x00002B14, 0x00000466, 0x000500C2,\n    0x00000014, 0x00005B96, 0x00005DEC, 0x00000B0C, 0x000500AA, 0x00000010,\n    0x000040CF, 0x00005B96, 0x00000A12, 0x0006000C, 0x00000016, 0x00002C51,\n    0x00000001, 0x0000004B, 0x000048A2, 0x0004007C, 0x00000014, 0x00002A1B,\n    0x00002C51, 0x00050082, 0x00000014, 0x00001880, 0x00000B0C, 0x00002A1B,\n    0x00050080, 0x00000014, 0x00002216, 0x00002A1B, 0x00000938, 0x000600A9,\n    0x00000014, 0x00002875, 0x000040CF, 0x00002216, 0x00005B96, 0x000500C4,\n    0x00000014, 0x00005ADA, 0x000048A2, 0x00001880, 0x000500C7, 0x00000014,\n    0x000049A0, 0x00005ADA, 0x00000466, 0x000600A9, 0x00000014, 0x00002AA9,\n    0x000040CF, 0x000049A0, 0x000048A2, 0x00050080, 0x00000014, 0x00005FFF,\n    0x00002875, 0x000003FA, 0x000500C4, 0x00000014, 0x00004F85, 0x00005FFF,\n    0x00000189, 0x000500C4, 0x00000014, 0x00003FAC, 0x00002AA9, 0x0000008D,\n    0x000500C5, 0x00000014, 0x00005782, 0x00004F85, 0x00003FAC, 0x000500AA,\n    0x00000010, 0x00003606, 0x00005DEC, 0x00000A12, 0x000600A9, 0x00000014,\n    0x00004248, 0x00003606, 0x00000A12, 0x00005782, 0x0004007C, 0x00000018,\n    0x000029D5, 0x00004248, 0x000500C2, 0x0000000B, 0x00004BAA, 0x000027F9,\n    0x00000A64, 0x00040070, 0x0000000D, 0x00004814, 0x00004BAA, 0x00050085,\n    0x0000000D, 0x00003E25, 0x00004814, 0x00000149, 0x00050051, 0x0000000D,\n    0x000053C8, 0x000029D5, 0x00000000, 0x00050051, 0x0000000D, 0x00002A5B,\n    0x000029D5, 0x00000001, 0x00050051, 0x0000000D, 0x00001E9E, 0x000029D5,\n    0x00000002, 0x00070050, 0x0000001D, 0x00003DDF, 0x000053C8, 0x00002A5B,\n    0x00001E9E, 0x00003E25, 0x00050051, 0x0000000B, 0x000027FA, 0x00002AC0,\n    0x00000003, 0x00060050, 0x00000014, 0x00003513, 0x000027FA, 0x000027FA,\n    0x000027FA, 0x000500C2, 0x00000014, 0x00002B15, 0x00003513, 0x00000BB4,\n    0x000500C7, 0x00000014, 0x00005DED, 0x00002B15, 0x00000105, 0x000500C7,\n    0x00000014, 0x000048A3, 0x00002B15, 0x00000466, 0x000500C2, 0x00000014,\n    0x00005B97, 0x00005DED, 0x00000B0C, 0x000500AA, 0x00000010, 0x000040D0,\n    0x00005B97, 0x00000A12, 0x0006000C, 0x00000016, 0x00002C52, 0x00000001,\n    0x0000004B, 0x000048A3, 0x0004007C, 0x00000014, 0x00002A1C, 0x00002C52,\n    0x00050082, 0x00000014, 0x00001881, 0x00000B0C, 0x00002A1C, 0x00050080,\n    0x00000014, 0x00002217, 0x00002A1C, 0x00000938, 0x000600A9, 0x00000014,\n    0x00002876, 0x000040D0, 0x00002217, 0x00005B97, 0x000500C4, 0x00000014,\n    0x00005ADB, 0x000048A3, 0x00001881, 0x000500C7, 0x00000014, 0x000049A1,\n    0x00005ADB, 0x00000466, 0x000600A9, 0x00000014, 0x00002AAA, 0x000040D0,\n    0x000049A1, 0x000048A3, 0x00050080, 0x00000014, 0x00006000, 0x00002876,\n    0x000003FA, 0x000500C4, 0x00000014, 0x00004F86, 0x00006000, 0x00000189,\n    0x000500C4, 0x00000014, 0x00003FAD, 0x00002AAA, 0x0000008D, 0x000500C5,\n    0x00000014, 0x00005783, 0x00004F86, 0x00003FAD, 0x000500AA, 0x00000010,\n    0x00003607, 0x00005DED, 0x00000A12, 0x000600A9, 0x00000014, 0x00004249,\n    0x00003607, 0x00000A12, 0x00005783, 0x0004007C, 0x00000018, 0x000029D6,\n    0x00004249, 0x000500C2, 0x0000000B, 0x00004BAB, 0x000027FA, 0x00000A64,\n    0x00040070, 0x0000000D, 0x00004815, 0x00004BAB, 0x00050085, 0x0000000D,\n    0x00003E26, 0x00004815, 0x00000149, 0x00050051, 0x0000000D, 0x000053C9,\n    0x000029D6, 0x00000000, 0x00050051, 0x0000000D, 0x00002A5C, 0x000029D6,\n    0x00000001, 0x00050051, 0x0000000D, 0x00002B16, 0x000029D6, 0x00000002,\n    0x00070050, 0x0000001D, 0x00002350, 0x000053C9, 0x00002A5C, 0x00002B16,\n    0x00003E26, 0x000200F9, 0x00003F61, 0x000200F8, 0x00001CBD, 0x00050051,\n    0x0000000B, 0x000056C1, 0x00002AC0, 0x00000000, 0x00070050, 0x00000017,\n    0x00004F0E, 0x000056C1, 0x000056C1, 0x000056C1, 0x000056C1, 0x000500C2,\n    0x00000017, 0x000024A0, 0x00004F0E, 0x0000034D, 0x000500C7, 0x00000017,\n    0x000049AF, 0x000024A0, 0x0000027B, 0x00040070, 0x0000001D, 0x00003CBA,\n    0x000049AF, 0x00050085, 0x0000001D, 0x00004133, 0x00003CBA, 0x00000AEE,\n    0x00050051, 0x0000000B, 0x00005CD5, 0x00002AC0, 0x00000001, 0x00070050,\n    0x00000017, 0x00005150, 0x00005CD5, 0x00005CD5, 0x00005CD5, 0x00005CD5,\n    0x000500C2, 0x00000017, 0x000024A1, 0x00005150, 0x0000034D, 0x000500C7,\n    0x00000017, 0x000049B0, 0x000024A1, 0x0000027B, 0x00040070, 0x0000001D,\n    0x00003CBB, 0x000049B0, 0x00050085, 0x0000001D, 0x00004134, 0x00003CBB,\n    0x00000AEE, 0x00050051, 0x0000000B, 0x00005CD6, 0x00002AC0, 0x00000002,\n    0x00070050, 0x00000017, 0x00005151, 0x00005CD6, 0x00005CD6, 0x00005CD6,\n    0x00005CD6, 0x000500C2, 0x00000017, 0x000024A2, 0x00005151, 0x0000034D,\n    0x000500C7, 0x00000017, 0x000049B1, 0x000024A2, 0x0000027B, 0x00040070,\n    0x0000001D, 0x00003CBC, 0x000049B1, 0x00050085, 0x0000001D, 0x00004135,\n    0x00003CBC, 0x00000AEE, 0x00050051, 0x0000000B, 0x00005CD7, 0x00002AC0,\n    0x00000003, 0x00070050, 0x00000017, 0x00005152, 0x00005CD7, 0x00005CD7,\n    0x00005CD7, 0x00005CD7, 0x000500C2, 0x00000017, 0x000024A3, 0x00005152,\n    0x0000034D, 0x000500C7, 0x00000017, 0x000049B2, 0x000024A3, 0x0000027B,\n    0x00040070, 0x0000001D, 0x00004930, 0x000049B2, 0x00050085, 0x0000001D,\n    0x000026A0, 0x00004930, 0x00000AEE, 0x000200F9, 0x00003F61, 0x000200F8,\n    0x000038FA, 0x00050051, 0x0000000B, 0x000056C2, 0x00002AC0, 0x00000000,\n    0x00070050, 0x00000017, 0x00004F0F, 0x000056C2, 0x000056C2, 0x000056C2,\n    0x000056C2, 0x000500C2, 0x00000017, 0x000024A4, 0x00004F0F, 0x0000028D,\n    0x000500C7, 0x00000017, 0x00004A5A, 0x000024A4, 0x0000064B, 0x00040070,\n    0x0000001D, 0x000036A5, 0x00004A5A, 0x0005008E, 0x0000001D, 0x00004B26,\n    0x000036A5, 0x0000017A, 0x00050051, 0x0000000B, 0x000021A2, 0x00002AC0,\n    0x00000001, 0x00070050, 0x00000017, 0x0000610E, 0x000021A2, 0x000021A2,\n    0x000021A2, 0x000021A2, 0x000500C2, 0x00000017, 0x000024A5, 0x0000610E,\n    0x0000028D, 0x000500C7, 0x00000017, 0x00004A5B, 0x000024A5, 0x0000064B,\n    0x00040070, 0x0000001D, 0x000036A6, 0x00004A5B, 0x0005008E, 0x0000001D,\n    0x00004B27, 0x000036A6, 0x0000017A, 0x00050051, 0x0000000B, 0x000021A3,\n    0x00002AC0, 0x00000002, 0x00070050, 0x00000017, 0x0000610F, 0x000021A3,\n    0x000021A3, 0x000021A3, 0x000021A3, 0x000500C2, 0x00000017, 0x000024A6,\n    0x0000610F, 0x0000028D, 0x000500C7, 0x00000017, 0x00004A5C, 0x000024A6,\n    0x0000064B, 0x00040070, 0x0000001D, 0x000036A7, 0x00004A5C, 0x0005008E,\n    0x0000001D, 0x00004B28, 0x000036A7, 0x0000017A, 0x00050051, 0x0000000B,\n    0x000021A4, 0x00002AC0, 0x00000003, 0x00070050, 0x00000017, 0x00006110,\n    0x000021A4, 0x000021A4, 0x000021A4, 0x000021A4, 0x000500C2, 0x00000017,\n    0x000024A7, 0x00006110, 0x0000028D, 0x000500C7, 0x00000017, 0x00004A5D,\n    0x000024A7, 0x0000064B, 0x00040070, 0x0000001D, 0x0000431B, 0x00004A5D,\n    0x0005008E, 0x0000001D, 0x00003093, 0x0000431B, 0x0000017A, 0x000200F9,\n    0x00003F61, 0x000200F8, 0x00004BFC, 0x00050051, 0x0000000B, 0x0000308E,\n    0x00002AC0, 0x00000000, 0x0004007C, 0x0000000D, 0x00004FEF, 0x0000308E,\n    0x00050050, 0x00000013, 0x00004339, 0x00004FEF, 0x00000A0C, 0x0009004F,\n    0x0000001D, 0x00002D93, 0x00004339, 0x00004339, 0x00000000, 0x00000001,\n    0x00000001, 0x00000001, 0x00050051, 0x0000000B, 0x000056B4, 0x00002AC0,\n    0x00000001, 0x0004007C, 0x0000000D, 0x00003F6B, 0x000056B4, 0x00050050,\n    0x00000013, 0x0000433A, 0x00003F6B, 0x00000A0C, 0x0009004F, 0x0000001D,\n    0x00002D94, 0x0000433A, 0x0000433A, 0x00000000, 0x00000001, 0x00000001,\n    0x00000001, 0x00050051, 0x0000000B, 0x000056B5, 0x00002AC0, 0x00000002,\n    0x0004007C, 0x0000000D, 0x00003F6C, 0x000056B5, 0x00050050, 0x00000013,\n    0x0000433B, 0x00003F6C, 0x00000A0C, 0x0009004F, 0x0000001D, 0x00002D95,\n    0x0000433B, 0x0000433B, 0x00000000, 0x00000001, 0x00000001, 0x00000001,\n    0x00050051, 0x0000000B, 0x000056B6, 0x00002AC0, 0x00000003, 0x0004007C,\n    0x0000000D, 0x00003F6D, 0x000056B6, 0x00050050, 0x00000013, 0x00004FAF,\n    0x00003F6D, 0x00000A0C, 0x0009004F, 0x0000001D, 0x00005A3B, 0x00004FAF,\n    0x00004FAF, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x000200F9,\n    0x00003F61, 0x000200F8, 0x00003F61, 0x000F00F5, 0x0000001D, 0x00002BAA,\n    0x00005A3B, 0x00004BFC, 0x00003093, 0x000038FA, 0x000026A0, 0x00001CBD,\n    0x00002350, 0x00001CBC, 0x0000234F, 0x00001FFF, 0x0000234E, 0x00002035,\n    0x000F00F5, 0x0000001D, 0x0000380B, 0x00002D95, 0x00004BFC, 0x00004B28,\n    0x000038FA, 0x00004135, 0x00001CBD, 0x00003DDF, 0x00001CBC, 0x00004123,\n    0x00001FFF, 0x00003914, 0x00002035, 0x000F00F5, 0x0000001D, 0x00003B7F,\n    0x00002D94, 0x00004BFC, 0x00004B27, 0x000038FA, 0x00004134, 0x00001CBD,\n    0x00003DDE, 0x00001CBC, 0x00004122, 0x00001FFF, 0x00003913, 0x00002035,\n    0x000F00F5, 0x0000001D, 0x000038B8, 0x00002D93, 0x00004BFC, 0x00004B26,\n    0x000038FA, 0x00004133, 0x00001CBD, 0x00003DDD, 0x00001CBC, 0x00004121,\n    0x00001FFF, 0x00003912, 0x00002035, 0x000200F9, 0x00005310, 0x000200F8,\n    0x00003B66, 0x000500AA, 0x00000009, 0x00005451, 0x0000199B, 0x00000A22,\n    0x000300F7, 0x00004F25, 0x00000002, 0x000400FA, 0x00005451, 0x000019C2,\n    0x00002302, 0x000200F8, 0x00002302, 0x000500C2, 0x0000000B, 0x00005633,\n    0x00005E78, 0x00000A11, 0x00060041, 0x00000289, 0x0000343F, 0x00000CC7,\n    0x00000A0B, 0x00005633, 0x0004003D, 0x0000000B, 0x00003149, 0x0000343F,\n    0x00050080, 0x0000000B, 0x00002DB7, 0x00005633, 0x00000A0D, 0x00060041,\n    0x00000289, 0x00001908, 0x00000CC7, 0x00000A0B, 0x00002DB7, 0x0004003D,\n    0x0000000B, 0x00001B77, 0x00001908, 0x00050080, 0x0000000B, 0x00002148,\n    0x00005E78, 0x0000199B, 0x000500C2, 0x0000000B, 0x000054A9, 0x00002148,\n    0x00000A11, 0x00060041, 0x00000289, 0x00004C95, 0x00000CC7, 0x00000A0B,\n    0x000054A9, 0x0004003D, 0x0000000B, 0x0000314A, 0x00004C95, 0x00050080,\n    0x0000000B, 0x00002DB8, 0x000054A9, 0x00000A0D, 0x00060041, 0x00000289,\n    0x00005FF4, 0x00000CC7, 0x00000A0B, 0x00002DB8, 0x0004003D, 0x0000000B,\n    0x0000374D, 0x00005FF4, 0x00070050, 0x00000017, 0x00004CD7, 0x00003149,\n    0x00001B77, 0x0000314A, 0x0000374D, 0x00050084, 0x0000000B, 0x00004C2C,\n    0x00000A10, 0x0000199B, 0x00050080, 0x0000000B, 0x00002A46, 0x00005E78,\n    0x00004C2C, 0x000500C2, 0x0000000B, 0x000045E8, 0x00002A46, 0x00000A11,\n    0x00060041, 0x00000289, 0x00004C96, 0x00000CC7, 0x00000A0B, 0x000045E8,\n    0x0004003D, 0x0000000B, 0x0000314B, 0x00004C96, 0x00050080, 0x0000000B,\n    0x00002DB9, 0x000045E8, 0x00000A0D, 0x00060041, 0x00000289, 0x0000194C,\n    0x00000CC7, 0x00000A0B, 0x00002DB9, 0x0004003D, 0x0000000B, 0x00005E5C,\n    0x0000194C, 0x00050084, 0x0000000B, 0x000021F2, 0x00000A13, 0x0000199B,\n    0x00050080, 0x0000000B, 0x00005EC3, 0x00005E78, 0x000021F2, 0x000500C2,\n    0x0000000B, 0x000045E9, 0x00005EC3, 0x00000A11, 0x00060041, 0x00000289,\n    0x00004C97, 0x00000CC7, 0x00000A0B, 0x000045E9, 0x0004003D, 0x0000000B,\n    0x0000314C, 0x00004C97, 0x00050080, 0x0000000B, 0x00002DBA, 0x000045E9,\n    0x00000A0D, 0x00060041, 0x00000289, 0x00005FF5, 0x00000CC7, 0x00000A0B,\n    0x00002DBA, 0x0004003D, 0x0000000B, 0x00003FFF, 0x00005FF5, 0x00070050,\n    0x00000017, 0x00005132, 0x0000314B, 0x00005E5C, 0x0000314C, 0x00003FFF,\n    0x000200F9, 0x00004F25, 0x000200F8, 0x000019C2, 0x000500C2, 0x0000000B,\n    0x00005FA9, 0x00005E78, 0x00000A11, 0x00060041, 0x00000289, 0x00003440,\n    0x00000CC7, 0x00000A0B, 0x00005FA9, 0x0004003D, 0x0000000B, 0x0000314D,\n    0x00003440, 0x00050080, 0x0000000B, 0x00002DBB, 0x00005FA9, 0x00000A0D,\n    0x00060041, 0x00000289, 0x00001909, 0x00000CC7, 0x00000A0B, 0x00002DBB,\n    0x0004003D, 0x0000000B, 0x00005C6A, 0x00001909, 0x00050080, 0x0000000B,\n    0x00002DBC, 0x00005FA9, 0x00000A10, 0x00060041, 0x00000289, 0x0000190A,\n    0x00000CC7, 0x00000A0B, 0x00002DBC, 0x0004003D, 0x0000000B, 0x00005C6B,\n    0x0000190A, 0x00050080, 0x0000000B, 0x00002DBD, 0x00005FA9, 0x00000A13,\n    0x00060041, 0x00000289, 0x00005FF6, 0x00000CC7, 0x00000A0B, 0x00002DBD,\n    0x0004003D, 0x0000000B, 0x00003701, 0x00005FF6, 0x00070050, 0x00000017,\n    0x00005471, 0x0000314D, 0x00005C6A, 0x00005C6B, 0x00003701, 0x00050080,\n    0x0000000B, 0x00004B84, 0x00005BEB, 0x00000237, 0x000500C2, 0x0000000B,\n    0x0000202E, 0x00004B84, 0x00000A11, 0x00060041, 0x00000289, 0x00004C98,\n    0x00000CC7, 0x00000A0B, 0x0000202E, 0x0004003D, 0x0000000B, 0x0000314E,\n    0x00004C98, 0x00050080, 0x0000000B, 0x00002DBE, 0x0000202E, 0x00000A0D,\n    0x00060041, 0x00000289, 0x0000190B, 0x00000CC7, 0x00000A0B, 0x00002DBE,\n    0x0004003D, 0x0000000B, 0x00005C6C, 0x0000190B, 0x00050080, 0x0000000B,\n    0x00002DBF, 0x0000202E, 0x00000A10, 0x00060041, 0x00000289, 0x0000190C,\n    0x00000CC7, 0x00000A0B, 0x00002DBF, 0x0004003D, 0x0000000B, 0x00005C6D,\n    0x0000190C, 0x00050080, 0x0000000B, 0x00002DC0, 0x0000202E, 0x00000A13,\n    0x00060041, 0x00000289, 0x00005FF7, 0x00000CC7, 0x00000A0B, 0x00002DC0,\n    0x0004003D, 0x0000000B, 0x00004000, 0x00005FF7, 0x00070050, 0x00000017,\n    0x00005133, 0x0000314E, 0x00005C6C, 0x00005C6D, 0x00004000, 0x000200F9,\n    0x00004F25, 0x000200F8, 0x00004F25, 0x000700F5, 0x00000017, 0x00002BCE,\n    0x00005133, 0x000019C2, 0x00005132, 0x00002302, 0x000700F5, 0x00000017,\n    0x00003721, 0x00005471, 0x000019C2, 0x00004CD7, 0x00002302, 0x000300F7,\n    0x00004F26, 0x00000000, 0x000700FB, 0x00002180, 0x00004F57, 0x00000005,\n    0x00002159, 0x00000007, 0x00002036, 0x000200F8, 0x00002036, 0x00050051,\n    0x0000000B, 0x00005F5B, 0x00003721, 0x00000000, 0x0006000C, 0x00000013,\n    0x0000606A, 0x00000001, 0x0000003E, 0x00005F5B, 0x00050051, 0x0000000D,\n    0x00002779, 0x0000606A, 0x00000000, 0x00050051, 0x0000000D, 0x00003EBC,\n    0x0000606A, 0x00000001, 0x00050051, 0x0000000B, 0x00004285, 0x00003721,\n    0x00000001, 0x0006000C, 0x00000013, 0x00003CF9, 0x00000001, 0x0000003E,\n    0x00004285, 0x00050051, 0x0000000D, 0x0000276E, 0x00003CF9, 0x00000000,\n    0x00050051, 0x0000000D, 0x0000444F, 0x00003CF9, 0x00000001, 0x00070050,\n    0x0000001D, 0x00003915, 0x00002779, 0x00003EBC, 0x0000276E, 0x0000444F,\n    0x00050051, 0x0000000B, 0x00004383, 0x00003721, 0x00000002, 0x0006000C,\n    0x00000013, 0x00004674, 0x00000001, 0x0000003E, 0x00004383, 0x00050051,\n    0x0000000D, 0x0000277A, 0x00004674, 0x00000000, 0x00050051, 0x0000000D,\n    0x00003EBD, 0x00004674, 0x00000001, 0x00050051, 0x0000000B, 0x00004286,\n    0x00003721, 0x00000003, 0x0006000C, 0x00000013, 0x00003CFA, 0x00000001,\n    0x0000003E, 0x00004286, 0x00050051, 0x0000000D, 0x0000276F, 0x00003CFA,\n    0x00000000, 0x00050051, 0x0000000D, 0x00004450, 0x00003CFA, 0x00000001,\n    0x00070050, 0x0000001D, 0x00003916, 0x0000277A, 0x00003EBD, 0x0000276F,\n    0x00004450, 0x00050051, 0x0000000B, 0x00004384, 0x00002BCE, 0x00000000,\n    0x0006000C, 0x00000013, 0x00004675, 0x00000001, 0x0000003E, 0x00004384,\n    0x00050051, 0x0000000D, 0x0000277B, 0x00004675, 0x00000000, 0x00050051,\n    0x0000000D, 0x00003EBE, 0x00004675, 0x00000001, 0x00050051, 0x0000000B,\n    0x00004287, 0x00002BCE, 0x00000001, 0x0006000C, 0x00000013, 0x00003CFB,\n    0x00000001, 0x0000003E, 0x00004287, 0x00050051, 0x0000000D, 0x00002770,\n    0x00003CFB, 0x00000000, 0x00050051, 0x0000000D, 0x00004451, 0x00003CFB,\n    0x00000001, 0x00070050, 0x0000001D, 0x00003917, 0x0000277B, 0x00003EBE,\n    0x00002770, 0x00004451, 0x00050051, 0x0000000B, 0x00004385, 0x00002BCE,\n    0x00000002, 0x0006000C, 0x00000013, 0x00004676, 0x00000001, 0x0000003E,\n    0x00004385, 0x00050051, 0x0000000D, 0x0000277C, 0x00004676, 0x00000000,\n    0x00050051, 0x0000000D, 0x00003EBF, 0x00004676, 0x00000001, 0x00050051,\n    0x0000000B, 0x00004288, 0x00002BCE, 0x00000003, 0x0006000C, 0x00000013,\n    0x00003CFC, 0x00000001, 0x0000003E, 0x00004288, 0x00050051, 0x0000000D,\n    0x00002771, 0x00003CFC, 0x00000000, 0x00050051, 0x0000000D, 0x000050C1,\n    0x00003CFC, 0x00000001, 0x00070050, 0x0000001D, 0x00002351, 0x0000277C,\n    0x00003EBF, 0x00002771, 0x000050C1, 0x000200F9, 0x00004F26, 0x000200F8,\n    0x00002159, 0x0007004F, 0x00000011, 0x000025FC, 0x00003721, 0x00003721,\n    0x00000000, 0x00000001, 0x0004007C, 0x00000012, 0x00005B3D, 0x000025FC,\n    0x0009004F, 0x0000001A, 0x000060D2, 0x00005B3D, 0x00005B3D, 0x00000000,\n    0x00000000, 0x00000001, 0x00000001, 0x000500C4, 0x0000001A, 0x000048AA,\n    0x000060D2, 0x00000122, 0x000500C3, 0x0000001A, 0x00003D91, 0x000048AA,\n    0x00000302, 0x0004006F, 0x0000001D, 0x00002AAB, 0x00003D91, 0x0005008E,\n    0x0000001D, 0x00004725, 0x00002AAB, 0x000007FE, 0x0007000C, 0x0000001D,\n    0x00006294, 0x00000001, 0x00000028, 0x00000504, 0x00004725, 0x0007004F,\n    0x00000011, 0x0000376E, 0x00003721, 0x00003721, 0x00000002, 0x00000003,\n    0x0004007C, 0x00000012, 0x000024C2, 0x0000376E, 0x0009004F, 0x0000001A,\n    0x000060D3, 0x000024C2, 0x000024C2, 0x00000000, 0x00000000, 0x00000001,\n    0x00000001, 0x000500C4, 0x0000001A, 0x000048AB, 0x000060D3, 0x00000122,\n    0x000500C3, 0x0000001A, 0x00003D92, 0x000048AB, 0x00000302, 0x0004006F,\n    0x0000001D, 0x00002AAC, 0x00003D92, 0x0005008E, 0x0000001D, 0x00004726,\n    0x00002AAC, 0x000007FE, 0x0007000C, 0x0000001D, 0x00006295, 0x00000001,\n    0x00000028, 0x00000504, 0x00004726, 0x0007004F, 0x00000011, 0x0000376F,\n    0x00002BCE, 0x00002BCE, 0x00000000, 0x00000001, 0x0004007C, 0x00000012,\n    0x000024C3, 0x0000376F, 0x0009004F, 0x0000001A, 0x000060D4, 0x000024C3,\n    0x000024C3, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x000500C4,\n    0x0000001A, 0x000048AC, 0x000060D4, 0x00000122, 0x000500C3, 0x0000001A,\n    0x00003D93, 0x000048AC, 0x00000302, 0x0004006F, 0x0000001D, 0x00002AAD,\n    0x00003D93, 0x0005008E, 0x0000001D, 0x00004727, 0x00002AAD, 0x000007FE,\n    0x0007000C, 0x0000001D, 0x00006296, 0x00000001, 0x00000028, 0x00000504,\n    0x00004727, 0x0007004F, 0x00000011, 0x00003770, 0x00002BCE, 0x00002BCE,\n    0x00000002, 0x00000003, 0x0004007C, 0x00000012, 0x000024C4, 0x00003770,\n    0x0009004F, 0x0000001A, 0x000060D5, 0x000024C4, 0x000024C4, 0x00000000,\n    0x00000000, 0x00000001, 0x00000001, 0x000500C4, 0x0000001A, 0x000048AD,\n    0x000060D5, 0x00000122, 0x000500C3, 0x0000001A, 0x00003D94, 0x000048AD,\n    0x00000302, 0x0004006F, 0x0000001D, 0x00002AAE, 0x00003D94, 0x0005008E,\n    0x0000001D, 0x000053C0, 0x00002AAE, 0x000007FE, 0x0007000C, 0x0000001D,\n    0x00004363, 0x00000001, 0x00000028, 0x00000504, 0x000053C0, 0x000200F9,\n    0x00004F26, 0x000200F8, 0x00004F57, 0x0007004F, 0x00000011, 0x00002622,\n    0x00003721, 0x00003721, 0x00000000, 0x00000001, 0x0004007C, 0x00000013,\n    0x0000515A, 0x00002622, 0x00050051, 0x0000000D, 0x00001B7F, 0x0000515A,\n    0x00000000, 0x00050051, 0x0000000D, 0x0000346D, 0x0000515A, 0x00000001,\n    0x00070050, 0x0000001D, 0x0000427B, 0x00001B7F, 0x0000346D, 0x00000A0C,\n    0x00000A0C, 0x0007004F, 0x00000011, 0x000041DB, 0x00003721, 0x00003721,\n    0x00000002, 0x00000003, 0x0004007C, 0x00000013, 0x00003760, 0x000041DB,\n    0x00050051, 0x0000000D, 0x00001B80, 0x00003760, 0x00000000, 0x00050051,\n    0x0000000D, 0x0000346E, 0x00003760, 0x00000001, 0x00070050, 0x0000001D,\n    0x0000427C, 0x00001B80, 0x0000346E, 0x00000A0C, 0x00000A0C, 0x0007004F,\n    0x00000011, 0x000041DC, 0x00002BCE, 0x00002BCE, 0x00000000, 0x00000001,\n    0x0004007C, 0x00000013, 0x00003761, 0x000041DC, 0x00050051, 0x0000000D,\n    0x00001B81, 0x00003761, 0x00000000, 0x00050051, 0x0000000D, 0x0000346F,\n    0x00003761, 0x00000001, 0x00070050, 0x0000001D, 0x0000427D, 0x00001B81,\n    0x0000346F, 0x00000A0C, 0x00000A0C, 0x0007004F, 0x00000011, 0x000041DD,\n    0x00002BCE, 0x00002BCE, 0x00000002, 0x00000003, 0x0004007C, 0x00000013,\n    0x00003762, 0x000041DD, 0x00050051, 0x0000000D, 0x00001B82, 0x00003762,\n    0x00000000, 0x00050051, 0x0000000D, 0x00004109, 0x00003762, 0x00000001,\n    0x00070050, 0x0000001D, 0x00002352, 0x00001B82, 0x00004109, 0x00000A0C,\n    0x00000A0C, 0x000200F9, 0x00004F26, 0x000200F8, 0x00004F26, 0x000900F5,\n    0x0000001D, 0x00002BAB, 0x00002352, 0x00004F57, 0x00004363, 0x00002159,\n    0x00002351, 0x00002036, 0x000900F5, 0x0000001D, 0x0000380C, 0x0000427D,\n    0x00004F57, 0x00006296, 0x00002159, 0x00003917, 0x00002036, 0x000900F5,\n    0x0000001D, 0x00003B80, 0x0000427C, 0x00004F57, 0x00006295, 0x00002159,\n    0x00003916, 0x00002036, 0x000900F5, 0x0000001D, 0x000038B9, 0x0000427B,\n    0x00004F57, 0x00006294, 0x00002159, 0x00003915, 0x00002036, 0x000200F9,\n    0x00005310, 0x000200F8, 0x00005310, 0x000700F5, 0x0000001D, 0x00002BAC,\n    0x00002BAB, 0x00004F26, 0x00002BAA, 0x00003F61, 0x000700F5, 0x0000001D,\n    0x0000380D, 0x0000380C, 0x00004F26, 0x0000380B, 0x00003F61, 0x000700F5,\n    0x0000001D, 0x00003295, 0x00003B80, 0x00004F26, 0x00003B7F, 0x00003F61,\n    0x000700F5, 0x0000001D, 0x0000367A, 0x000038B9, 0x00004F26, 0x000038B8,\n    0x00003F61, 0x00050081, 0x0000001D, 0x00004359, 0x000020D3, 0x0000367A,\n    0x00050081, 0x0000001D, 0x00005B01, 0x000035EC, 0x00003295, 0x00050081,\n    0x0000001D, 0x00001F92, 0x0000380A, 0x0000380D, 0x00050081, 0x0000001D,\n    0x00005113, 0x00002BA9, 0x00002BAC, 0x000500AE, 0x00000009, 0x0000387D,\n    0x00003F4D, 0x00000A1C, 0x000300F7, 0x00005ECB, 0x00000002, 0x000400FA,\n    0x0000387D, 0x000026B1, 0x00005ECB, 0x000200F8, 0x000026B1, 0x000500C4,\n    0x0000000B, 0x000037B2, 0x00000A16, 0x000023AA, 0x00050085, 0x0000000D,\n    0x00002F3A, 0x00002B2C, 0x0000016E, 0x00050080, 0x0000000B, 0x000051FC,\n    0x00005BEB, 0x000037B2, 0x000300F7, 0x00005311, 0x00000002, 0x000400FA,\n    0x00005AEF, 0x00003B67, 0x000040BB, 0x000200F8, 0x000040BB, 0x000500AA,\n    0x00000009, 0x00004ADD, 0x0000199B, 0x00000A16, 0x000300F7, 0x00004F4B,\n    0x00000002, 0x000400FA, 0x00004ADD, 0x000019C3, 0x00002303, 0x000200F8,\n    0x00002303, 0x000500C2, 0x0000000B, 0x00005634, 0x000051FC, 0x00000A11,\n    0x00060041, 0x00000289, 0x00003441, 0x00000CC7, 0x00000A0B, 0x00005634,\n    0x0004003D, 0x0000000B, 0x00003AD6, 0x00003441, 0x00050080, 0x0000000B,\n    0x00002149, 0x000051FC, 0x0000199B, 0x000500C2, 0x0000000B, 0x000054AA,\n    0x00002149, 0x00000A11, 0x00060041, 0x00000289, 0x00004CE1, 0x00000CC7,\n    0x00000A0B, 0x000054AA, 0x0004003D, 0x0000000B, 0x0000333E, 0x00004CE1,\n    0x00050084, 0x0000000B, 0x000021F3, 0x00000A10, 0x0000199B, 0x00050080,\n    0x0000000B, 0x00005EC4, 0x000051FC, 0x000021F3, 0x000500C2, 0x0000000B,\n    0x000045EA, 0x00005EC4, 0x00000A11, 0x00060041, 0x00000289, 0x00004CE2,\n    0x00000CC7, 0x00000A0B, 0x000045EA, 0x0004003D, 0x0000000B, 0x0000333F,\n    0x00004CE2, 0x00050084, 0x0000000B, 0x000021F4, 0x00000A13, 0x0000199B,\n    0x00050080, 0x0000000B, 0x00005EC5, 0x000051FC, 0x000021F4, 0x000500C2,\n    0x0000000B, 0x000045EB, 0x00005EC5, 0x00000A11, 0x00060041, 0x00000289,\n    0x00004903, 0x00000CC7, 0x00000A0B, 0x000045EB, 0x0004003D, 0x0000000B,\n    0x00005F5C, 0x00004903, 0x00070050, 0x00000017, 0x00005134, 0x00003AD6,\n    0x0000333E, 0x0000333F, 0x00005F5C, 0x000200F9, 0x00004F4B, 0x000200F8,\n    0x000019C3, 0x000500C2, 0x0000000B, 0x00005FAA, 0x000051FC, 0x00000A11,\n    0x00060041, 0x00000289, 0x00003442, 0x00000CC7, 0x00000A0B, 0x00005FAA,\n    0x0004003D, 0x0000000B, 0x0000314F, 0x00003442, 0x00050080, 0x0000000B,\n    0x00002DC1, 0x00005FAA, 0x00000A0D, 0x00060041, 0x00000289, 0x0000190D,\n    0x00000CC7, 0x00000A0B, 0x00002DC1, 0x0004003D, 0x0000000B, 0x00005C6E,\n    0x0000190D, 0x00050080, 0x0000000B, 0x00002DC2, 0x00005FAA, 0x00000A10,\n    0x00060041, 0x00000289, 0x0000190E, 0x00000CC7, 0x00000A0B, 0x00002DC2,\n    0x0004003D, 0x0000000B, 0x00005C6F, 0x0000190E, 0x00050080, 0x0000000B,\n    0x00002DC3, 0x00005FAA, 0x00000A13, 0x00060041, 0x00000289, 0x00005FF8,\n    0x00000CC7, 0x00000A0B, 0x00002DC3, 0x0004003D, 0x0000000B, 0x00004001,\n    0x00005FF8, 0x00070050, 0x00000017, 0x00005135, 0x0000314F, 0x00005C6E,\n    0x00005C6F, 0x00004001, 0x000200F9, 0x00004F4B, 0x000200F8, 0x00004F4B,\n    0x000700F5, 0x00000017, 0x00002AC1, 0x00005135, 0x000019C3, 0x00005134,\n    0x00002303, 0x000300F7, 0x00003F62, 0x00000000, 0x001300FB, 0x00002180,\n    0x00004BFD, 0x00000000, 0x000038FB, 0x00000001, 0x000038FB, 0x00000002,\n    0x00001CBF, 0x0000000A, 0x00001CBF, 0x00000003, 0x00001CBE, 0x0000000C,\n    0x00001CBE, 0x00000004, 0x00002000, 0x00000006, 0x00002037, 0x000200F8,\n    0x00002037, 0x00050051, 0x0000000B, 0x00005F5D, 0x00002AC1, 0x00000000,\n    0x0006000C, 0x00000013, 0x0000606B, 0x00000001, 0x0000003E, 0x00005F5D,\n    0x00050051, 0x0000000D, 0x00002772, 0x0000606B, 0x00000000, 0x00050051,\n    0x0000000D, 0x00004452, 0x0000606B, 0x00000001, 0x00070050, 0x0000001D,\n    0x00003918, 0x00002772, 0x00004452, 0x00000A0C, 0x00000A0C, 0x00050051,\n    0x0000000B, 0x00004386, 0x00002AC1, 0x00000001, 0x0006000C, 0x00000013,\n    0x00004677, 0x00000001, 0x0000003E, 0x00004386, 0x00050051, 0x0000000D,\n    0x00002773, 0x00004677, 0x00000000, 0x00050051, 0x0000000D, 0x00004453,\n    0x00004677, 0x00000001, 0x00070050, 0x0000001D, 0x00003919, 0x00002773,\n    0x00004453, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x00004387,\n    0x00002AC1, 0x00000002, 0x0006000C, 0x00000013, 0x00004678, 0x00000001,\n    0x0000003E, 0x00004387, 0x00050051, 0x0000000D, 0x00002774, 0x00004678,\n    0x00000000, 0x00050051, 0x0000000D, 0x00004454, 0x00004678, 0x00000001,\n    0x00070050, 0x0000001D, 0x0000391A, 0x00002774, 0x00004454, 0x00000A0C,\n    0x00000A0C, 0x00050051, 0x0000000B, 0x00004388, 0x00002AC1, 0x00000003,\n    0x0006000C, 0x00000013, 0x00004679, 0x00000001, 0x0000003E, 0x00004388,\n    0x00050051, 0x0000000D, 0x0000277D, 0x00004679, 0x00000000, 0x00050051,\n    0x0000000D, 0x000050C2, 0x00004679, 0x00000001, 0x00070050, 0x0000001D,\n    0x00002353, 0x0000277D, 0x000050C2, 0x00000A0C, 0x00000A0C, 0x000200F9,\n    0x00003F62, 0x000200F8, 0x00002000, 0x00050051, 0x0000000B, 0x0000308F,\n    0x00002AC1, 0x00000000, 0x0004007C, 0x0000000C, 0x0000589F, 0x0000308F,\n    0x00050050, 0x00000012, 0x00004728, 0x0000589F, 0x0000589F, 0x000500C4,\n    0x00000012, 0x000047B5, 0x00004728, 0x000007A7, 0x000500C3, 0x00000012,\n    0x0000341F, 0x000047B5, 0x00000867, 0x0004006F, 0x00000013, 0x00002AAF,\n    0x0000341F, 0x0005008E, 0x00000013, 0x0000474F, 0x00002AAF, 0x000007FE,\n    0x0007000C, 0x00000013, 0x00005E0E, 0x00000001, 0x00000028, 0x00000049,\n    0x0000474F, 0x00050051, 0x0000000D, 0x00005F12, 0x00005E0E, 0x00000000,\n    0x00050051, 0x0000000D, 0x00003CDA, 0x00005E0E, 0x00000001, 0x00070050,\n    0x0000001D, 0x00004124, 0x00005F12, 0x00003CDA, 0x00000A0C, 0x00000A0C,\n    0x00050051, 0x0000000B, 0x00004C48, 0x00002AC1, 0x00000001, 0x0004007C,\n    0x0000000C, 0x00003EA7, 0x00004C48, 0x00050050, 0x00000012, 0x00004729,\n    0x00003EA7, 0x00003EA7, 0x000500C4, 0x00000012, 0x000047B6, 0x00004729,\n    0x000007A7, 0x000500C3, 0x00000012, 0x00003420, 0x000047B6, 0x00000867,\n    0x0004006F, 0x00000013, 0x00002AB0, 0x00003420, 0x0005008E, 0x00000013,\n    0x00004750, 0x00002AB0, 0x000007FE, 0x0007000C, 0x00000013, 0x00005E0F,\n    0x00000001, 0x00000028, 0x00000049, 0x00004750, 0x00050051, 0x0000000D,\n    0x00005F13, 0x00005E0F, 0x00000000, 0x00050051, 0x0000000D, 0x00003CDB,\n    0x00005E0F, 0x00000001, 0x00070050, 0x0000001D, 0x00004125, 0x00005F13,\n    0x00003CDB, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x00004C49,\n    0x00002AC1, 0x00000002, 0x0004007C, 0x0000000C, 0x00003EA8, 0x00004C49,\n    0x00050050, 0x00000012, 0x0000472A, 0x00003EA8, 0x00003EA8, 0x000500C4,\n    0x00000012, 0x000047B7, 0x0000472A, 0x000007A7, 0x000500C3, 0x00000012,\n    0x00003421, 0x000047B7, 0x00000867, 0x0004006F, 0x00000013, 0x00002AB1,\n    0x00003421, 0x0005008E, 0x00000013, 0x00004751, 0x00002AB1, 0x000007FE,\n    0x0007000C, 0x00000013, 0x00005E10, 0x00000001, 0x00000028, 0x00000049,\n    0x00004751, 0x00050051, 0x0000000D, 0x00005F14, 0x00005E10, 0x00000000,\n    0x00050051, 0x0000000D, 0x00003CDC, 0x00005E10, 0x00000001, 0x00070050,\n    0x0000001D, 0x00004126, 0x00005F14, 0x00003CDC, 0x00000A0C, 0x00000A0C,\n    0x00050051, 0x0000000B, 0x00004C4A, 0x00002AC1, 0x00000003, 0x0004007C,\n    0x0000000C, 0x00003EA9, 0x00004C4A, 0x00050050, 0x00000012, 0x0000472B,\n    0x00003EA9, 0x00003EA9, 0x000500C4, 0x00000012, 0x000047B8, 0x0000472B,\n    0x000007A7, 0x000500C3, 0x00000012, 0x00003422, 0x000047B8, 0x00000867,\n    0x0004006F, 0x00000013, 0x00002AB2, 0x00003422, 0x0005008E, 0x00000013,\n    0x00004752, 0x00002AB2, 0x000007FE, 0x0007000C, 0x00000013, 0x00005E11,\n    0x00000001, 0x00000028, 0x00000049, 0x00004752, 0x00050051, 0x0000000D,\n    0x00005F15, 0x00005E11, 0x00000000, 0x00050051, 0x0000000D, 0x0000494E,\n    0x00005E11, 0x00000001, 0x00070050, 0x0000001D, 0x00002354, 0x00005F15,\n    0x0000494E, 0x00000A0C, 0x00000A0C, 0x000200F9, 0x00003F62, 0x000200F8,\n    0x00001CBE, 0x00050051, 0x0000000B, 0x000056C3, 0x00002AC1, 0x00000000,\n    0x00060050, 0x00000014, 0x00004F10, 0x000056C3, 0x000056C3, 0x000056C3,\n    0x000500C2, 0x00000014, 0x00002B17, 0x00004F10, 0x00000BB4, 0x000500C7,\n    0x00000014, 0x00005DEE, 0x00002B17, 0x00000105, 0x000500C7, 0x00000014,\n    0x000048A4, 0x00002B17, 0x00000466, 0x000500C2, 0x00000014, 0x00005B98,\n    0x00005DEE, 0x00000B0C, 0x000500AA, 0x00000010, 0x000040D1, 0x00005B98,\n    0x00000A12, 0x0006000C, 0x00000016, 0x00002C53, 0x00000001, 0x0000004B,\n    0x000048A4, 0x0004007C, 0x00000014, 0x00002A1D, 0x00002C53, 0x00050082,\n    0x00000014, 0x00001882, 0x00000B0C, 0x00002A1D, 0x00050080, 0x00000014,\n    0x00002218, 0x00002A1D, 0x00000938, 0x000600A9, 0x00000014, 0x00002877,\n    0x000040D1, 0x00002218, 0x00005B98, 0x000500C4, 0x00000014, 0x00005ADC,\n    0x000048A4, 0x00001882, 0x000500C7, 0x00000014, 0x000049A2, 0x00005ADC,\n    0x00000466, 0x000600A9, 0x00000014, 0x00002AB3, 0x000040D1, 0x000049A2,\n    0x000048A4, 0x00050080, 0x00000014, 0x00006001, 0x00002877, 0x000003FA,\n    0x000500C4, 0x00000014, 0x00004F87, 0x00006001, 0x00000189, 0x000500C4,\n    0x00000014, 0x00003FAE, 0x00002AB3, 0x0000008D, 0x000500C5, 0x00000014,\n    0x00005784, 0x00004F87, 0x00003FAE, 0x000500AA, 0x00000010, 0x00003608,\n    0x00005DEE, 0x00000A12, 0x000600A9, 0x00000014, 0x0000424A, 0x00003608,\n    0x00000A12, 0x00005784, 0x0004007C, 0x00000018, 0x000029D7, 0x0000424A,\n    0x000500C2, 0x0000000B, 0x00004BAC, 0x000056C3, 0x00000A64, 0x00040070,\n    0x0000000D, 0x00004816, 0x00004BAC, 0x00050085, 0x0000000D, 0x00003E27,\n    0x00004816, 0x00000149, 0x00050051, 0x0000000D, 0x000053CA, 0x000029D7,\n    0x00000000, 0x00050051, 0x0000000D, 0x00002A5D, 0x000029D7, 0x00000001,\n    0x00050051, 0x0000000D, 0x00001E9F, 0x000029D7, 0x00000002, 0x00070050,\n    0x0000001D, 0x00003DE0, 0x000053CA, 0x00002A5D, 0x00001E9F, 0x00003E27,\n    0x00050051, 0x0000000B, 0x000027FB, 0x00002AC1, 0x00000001, 0x00060050,\n    0x00000014, 0x00003514, 0x000027FB, 0x000027FB, 0x000027FB, 0x000500C2,\n    0x00000014, 0x00002B18, 0x00003514, 0x00000BB4, 0x000500C7, 0x00000014,\n    0x00005DEF, 0x00002B18, 0x00000105, 0x000500C7, 0x00000014, 0x000048A5,\n    0x00002B18, 0x00000466, 0x000500C2, 0x00000014, 0x00005B99, 0x00005DEF,\n    0x00000B0C, 0x000500AA, 0x00000010, 0x000040D2, 0x00005B99, 0x00000A12,\n    0x0006000C, 0x00000016, 0x00002C54, 0x00000001, 0x0000004B, 0x000048A5,\n    0x0004007C, 0x00000014, 0x00002A1E, 0x00002C54, 0x00050082, 0x00000014,\n    0x00001883, 0x00000B0C, 0x00002A1E, 0x00050080, 0x00000014, 0x00002219,\n    0x00002A1E, 0x00000938, 0x000600A9, 0x00000014, 0x00002878, 0x000040D2,\n    0x00002219, 0x00005B99, 0x000500C4, 0x00000014, 0x00005ADD, 0x000048A5,\n    0x00001883, 0x000500C7, 0x00000014, 0x000049A3, 0x00005ADD, 0x00000466,\n    0x000600A9, 0x00000014, 0x00002AB4, 0x000040D2, 0x000049A3, 0x000048A5,\n    0x00050080, 0x00000014, 0x00006002, 0x00002878, 0x000003FA, 0x000500C4,\n    0x00000014, 0x00004F88, 0x00006002, 0x00000189, 0x000500C4, 0x00000014,\n    0x00003FAF, 0x00002AB4, 0x0000008D, 0x000500C5, 0x00000014, 0x00005785,\n    0x00004F88, 0x00003FAF, 0x000500AA, 0x00000010, 0x00003609, 0x00005DEF,\n    0x00000A12, 0x000600A9, 0x00000014, 0x0000424B, 0x00003609, 0x00000A12,\n    0x00005785, 0x0004007C, 0x00000018, 0x000029D8, 0x0000424B, 0x000500C2,\n    0x0000000B, 0x00004BAD, 0x000027FB, 0x00000A64, 0x00040070, 0x0000000D,\n    0x00004817, 0x00004BAD, 0x00050085, 0x0000000D, 0x00003E28, 0x00004817,\n    0x00000149, 0x00050051, 0x0000000D, 0x000053CB, 0x000029D8, 0x00000000,\n    0x00050051, 0x0000000D, 0x00002A5E, 0x000029D8, 0x00000001, 0x00050051,\n    0x0000000D, 0x00001EA0, 0x000029D8, 0x00000002, 0x00070050, 0x0000001D,\n    0x00003DE1, 0x000053CB, 0x00002A5E, 0x00001EA0, 0x00003E28, 0x00050051,\n    0x0000000B, 0x000027FC, 0x00002AC1, 0x00000002, 0x00060050, 0x00000014,\n    0x00003515, 0x000027FC, 0x000027FC, 0x000027FC, 0x000500C2, 0x00000014,\n    0x00002B19, 0x00003515, 0x00000BB4, 0x000500C7, 0x00000014, 0x00005DF0,\n    0x00002B19, 0x00000105, 0x000500C7, 0x00000014, 0x000048AE, 0x00002B19,\n    0x00000466, 0x000500C2, 0x00000014, 0x00005B9A, 0x00005DF0, 0x00000B0C,\n    0x000500AA, 0x00000010, 0x000040D3, 0x00005B9A, 0x00000A12, 0x0006000C,\n    0x00000016, 0x00002C55, 0x00000001, 0x0000004B, 0x000048AE, 0x0004007C,\n    0x00000014, 0x00002A1F, 0x00002C55, 0x00050082, 0x00000014, 0x00001884,\n    0x00000B0C, 0x00002A1F, 0x00050080, 0x00000014, 0x0000221A, 0x00002A1F,\n    0x00000938, 0x000600A9, 0x00000014, 0x00002879, 0x000040D3, 0x0000221A,\n    0x00005B9A, 0x000500C4, 0x00000014, 0x00005ADE, 0x000048AE, 0x00001884,\n    0x000500C7, 0x00000014, 0x000049A4, 0x00005ADE, 0x00000466, 0x000600A9,\n    0x00000014, 0x00002AB5, 0x000040D3, 0x000049A4, 0x000048AE, 0x00050080,\n    0x00000014, 0x00006003, 0x00002879, 0x000003FA, 0x000500C4, 0x00000014,\n    0x00004F89, 0x00006003, 0x00000189, 0x000500C4, 0x00000014, 0x00003FB0,\n    0x00002AB5, 0x0000008D, 0x000500C5, 0x00000014, 0x00005786, 0x00004F89,\n    0x00003FB0, 0x000500AA, 0x00000010, 0x0000360A, 0x00005DF0, 0x00000A12,\n    0x000600A9, 0x00000014, 0x0000424C, 0x0000360A, 0x00000A12, 0x00005786,\n    0x0004007C, 0x00000018, 0x000029D9, 0x0000424C, 0x000500C2, 0x0000000B,\n    0x00004BAE, 0x000027FC, 0x00000A64, 0x00040070, 0x0000000D, 0x00004818,\n    0x00004BAE, 0x00050085, 0x0000000D, 0x00003E29, 0x00004818, 0x00000149,\n    0x00050051, 0x0000000D, 0x000053CC, 0x000029D9, 0x00000000, 0x00050051,\n    0x0000000D, 0x00002A5F, 0x000029D9, 0x00000001, 0x00050051, 0x0000000D,\n    0x00001EA1, 0x000029D9, 0x00000002, 0x00070050, 0x0000001D, 0x00003DE2,\n    0x000053CC, 0x00002A5F, 0x00001EA1, 0x00003E29, 0x00050051, 0x0000000B,\n    0x000027FD, 0x00002AC1, 0x00000003, 0x00060050, 0x00000014, 0x00003516,\n    0x000027FD, 0x000027FD, 0x000027FD, 0x000500C2, 0x00000014, 0x00002B1A,\n    0x00003516, 0x00000BB4, 0x000500C7, 0x00000014, 0x00005DF1, 0x00002B1A,\n    0x00000105, 0x000500C7, 0x00000014, 0x000048AF, 0x00002B1A, 0x00000466,\n    0x000500C2, 0x00000014, 0x00005B9B, 0x00005DF1, 0x00000B0C, 0x000500AA,\n    0x00000010, 0x000040D4, 0x00005B9B, 0x00000A12, 0x0006000C, 0x00000016,\n    0x00002C56, 0x00000001, 0x0000004B, 0x000048AF, 0x0004007C, 0x00000014,\n    0x00002A20, 0x00002C56, 0x00050082, 0x00000014, 0x00001885, 0x00000B0C,\n    0x00002A20, 0x00050080, 0x00000014, 0x0000221B, 0x00002A20, 0x00000938,\n    0x000600A9, 0x00000014, 0x0000287A, 0x000040D4, 0x0000221B, 0x00005B9B,\n    0x000500C4, 0x00000014, 0x00005ADF, 0x000048AF, 0x00001885, 0x000500C7,\n    0x00000014, 0x000049A5, 0x00005ADF, 0x00000466, 0x000600A9, 0x00000014,\n    0x00002AB6, 0x000040D4, 0x000049A5, 0x000048AF, 0x00050080, 0x00000014,\n    0x00006004, 0x0000287A, 0x000003FA, 0x000500C4, 0x00000014, 0x00004F8A,\n    0x00006004, 0x00000189, 0x000500C4, 0x00000014, 0x00003FB1, 0x00002AB6,\n    0x0000008D, 0x000500C5, 0x00000014, 0x00005787, 0x00004F8A, 0x00003FB1,\n    0x000500AA, 0x00000010, 0x0000360B, 0x00005DF1, 0x00000A12, 0x000600A9,\n    0x00000014, 0x0000424D, 0x0000360B, 0x00000A12, 0x00005787, 0x0004007C,\n    0x00000018, 0x000029DA, 0x0000424D, 0x000500C2, 0x0000000B, 0x00004BAF,\n    0x000027FD, 0x00000A64, 0x00040070, 0x0000000D, 0x00004819, 0x00004BAF,\n    0x00050085, 0x0000000D, 0x00003E2A, 0x00004819, 0x00000149, 0x00050051,\n    0x0000000D, 0x000053CD, 0x000029DA, 0x00000000, 0x00050051, 0x0000000D,\n    0x00002A60, 0x000029DA, 0x00000001, 0x00050051, 0x0000000D, 0x00002B1B,\n    0x000029DA, 0x00000002, 0x00070050, 0x0000001D, 0x00002355, 0x000053CD,\n    0x00002A60, 0x00002B1B, 0x00003E2A, 0x000200F9, 0x00003F62, 0x000200F8,\n    0x00001CBF, 0x00050051, 0x0000000B, 0x000056C4, 0x00002AC1, 0x00000000,\n    0x00070050, 0x00000017, 0x00004F11, 0x000056C4, 0x000056C4, 0x000056C4,\n    0x000056C4, 0x000500C2, 0x00000017, 0x000024A8, 0x00004F11, 0x0000034D,\n    0x000500C7, 0x00000017, 0x000049B3, 0x000024A8, 0x0000027B, 0x00040070,\n    0x0000001D, 0x00003CBD, 0x000049B3, 0x00050085, 0x0000001D, 0x00004136,\n    0x00003CBD, 0x00000AEE, 0x00050051, 0x0000000B, 0x00005CD8, 0x00002AC1,\n    0x00000001, 0x00070050, 0x00000017, 0x00005153, 0x00005CD8, 0x00005CD8,\n    0x00005CD8, 0x00005CD8, 0x000500C2, 0x00000017, 0x000024A9, 0x00005153,\n    0x0000034D, 0x000500C7, 0x00000017, 0x000049B4, 0x000024A9, 0x0000027B,\n    0x00040070, 0x0000001D, 0x00003CBE, 0x000049B4, 0x00050085, 0x0000001D,\n    0x00004137, 0x00003CBE, 0x00000AEE, 0x00050051, 0x0000000B, 0x00005CD9,\n    0x00002AC1, 0x00000002, 0x00070050, 0x00000017, 0x00005154, 0x00005CD9,\n    0x00005CD9, 0x00005CD9, 0x00005CD9, 0x000500C2, 0x00000017, 0x000024AA,\n    0x00005154, 0x0000034D, 0x000500C7, 0x00000017, 0x000049B5, 0x000024AA,\n    0x0000027B, 0x00040070, 0x0000001D, 0x00003CBF, 0x000049B5, 0x00050085,\n    0x0000001D, 0x00004138, 0x00003CBF, 0x00000AEE, 0x00050051, 0x0000000B,\n    0x00005CDA, 0x00002AC1, 0x00000003, 0x00070050, 0x00000017, 0x00005155,\n    0x00005CDA, 0x00005CDA, 0x00005CDA, 0x00005CDA, 0x000500C2, 0x00000017,\n    0x000024AB, 0x00005155, 0x0000034D, 0x000500C7, 0x00000017, 0x000049B6,\n    0x000024AB, 0x0000027B, 0x00040070, 0x0000001D, 0x00004931, 0x000049B6,\n    0x00050085, 0x0000001D, 0x000026A1, 0x00004931, 0x00000AEE, 0x000200F9,\n    0x00003F62, 0x000200F8, 0x000038FB, 0x00050051, 0x0000000B, 0x000056C5,\n    0x00002AC1, 0x00000000, 0x00070050, 0x00000017, 0x00004F12, 0x000056C5,\n    0x000056C5, 0x000056C5, 0x000056C5, 0x000500C2, 0x00000017, 0x000024AC,\n    0x00004F12, 0x0000028D, 0x000500C7, 0x00000017, 0x00004A5E, 0x000024AC,\n    0x0000064B, 0x00040070, 0x0000001D, 0x000036A8, 0x00004A5E, 0x0005008E,\n    0x0000001D, 0x00004B29, 0x000036A8, 0x0000017A, 0x00050051, 0x0000000B,\n    0x000021A5, 0x00002AC1, 0x00000001, 0x00070050, 0x00000017, 0x00006111,\n    0x000021A5, 0x000021A5, 0x000021A5, 0x000021A5, 0x000500C2, 0x00000017,\n    0x000024AD, 0x00006111, 0x0000028D, 0x000500C7, 0x00000017, 0x00004A5F,\n    0x000024AD, 0x0000064B, 0x00040070, 0x0000001D, 0x000036A9, 0x00004A5F,\n    0x0005008E, 0x0000001D, 0x00004B2A, 0x000036A9, 0x0000017A, 0x00050051,\n    0x0000000B, 0x000021A6, 0x00002AC1, 0x00000002, 0x00070050, 0x00000017,\n    0x00006112, 0x000021A6, 0x000021A6, 0x000021A6, 0x000021A6, 0x000500C2,\n    0x00000017, 0x000024AE, 0x00006112, 0x0000028D, 0x000500C7, 0x00000017,\n    0x00004A60, 0x000024AE, 0x0000064B, 0x00040070, 0x0000001D, 0x000036AA,\n    0x00004A60, 0x0005008E, 0x0000001D, 0x00004B2B, 0x000036AA, 0x0000017A,\n    0x00050051, 0x0000000B, 0x000021A7, 0x00002AC1, 0x00000003, 0x00070050,\n    0x00000017, 0x00006113, 0x000021A7, 0x000021A7, 0x000021A7, 0x000021A7,\n    0x000500C2, 0x00000017, 0x000024AF, 0x00006113, 0x0000028D, 0x000500C7,\n    0x00000017, 0x00004A61, 0x000024AF, 0x0000064B, 0x00040070, 0x0000001D,\n    0x0000431C, 0x00004A61, 0x0005008E, 0x0000001D, 0x00003094, 0x0000431C,\n    0x0000017A, 0x000200F9, 0x00003F62, 0x000200F8, 0x00004BFD, 0x00050051,\n    0x0000000B, 0x00003090, 0x00002AC1, 0x00000000, 0x0004007C, 0x0000000D,\n    0x00004FF0, 0x00003090, 0x00050050, 0x00000013, 0x0000433C, 0x00004FF0,\n    0x00000A0C, 0x0009004F, 0x0000001D, 0x00002D96, 0x0000433C, 0x0000433C,\n    0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00050051, 0x0000000B,\n    0x000056B7, 0x00002AC1, 0x00000001, 0x0004007C, 0x0000000D, 0x00003F6E,\n    0x000056B7, 0x00050050, 0x00000013, 0x0000433D, 0x00003F6E, 0x00000A0C,\n    0x0009004F, 0x0000001D, 0x00002D97, 0x0000433D, 0x0000433D, 0x00000000,\n    0x00000001, 0x00000001, 0x00000001, 0x00050051, 0x0000000B, 0x000056B8,\n    0x00002AC1, 0x00000002, 0x0004007C, 0x0000000D, 0x00003F6F, 0x000056B8,\n    0x00050050, 0x00000013, 0x0000433E, 0x00003F6F, 0x00000A0C, 0x0009004F,\n    0x0000001D, 0x00002D98, 0x0000433E, 0x0000433E, 0x00000000, 0x00000001,\n    0x00000001, 0x00000001, 0x00050051, 0x0000000B, 0x000056B9, 0x00002AC1,\n    0x00000003, 0x0004007C, 0x0000000D, 0x00003F70, 0x000056B9, 0x00050050,\n    0x00000013, 0x00004FB0, 0x00003F70, 0x00000A0C, 0x0009004F, 0x0000001D,\n    0x00005A3C, 0x00004FB0, 0x00004FB0, 0x00000000, 0x00000001, 0x00000001,\n    0x00000001, 0x000200F9, 0x00003F62, 0x000200F8, 0x00003F62, 0x000F00F5,\n    0x0000001D, 0x00002BAD, 0x00005A3C, 0x00004BFD, 0x00003094, 0x000038FB,\n    0x000026A1, 0x00001CBF, 0x00002355, 0x00001CBE, 0x00002354, 0x00002000,\n    0x00002353, 0x00002037, 0x000F00F5, 0x0000001D, 0x0000380E, 0x00002D98,\n    0x00004BFD, 0x00004B2B, 0x000038FB, 0x00004138, 0x00001CBF, 0x00003DE2,\n    0x00001CBE, 0x00004126, 0x00002000, 0x0000391A, 0x00002037, 0x000F00F5,\n    0x0000001D, 0x00003B81, 0x00002D97, 0x00004BFD, 0x00004B2A, 0x000038FB,\n    0x00004137, 0x00001CBF, 0x00003DE1, 0x00001CBE, 0x00004125, 0x00002000,\n    0x00003919, 0x00002037, 0x000F00F5, 0x0000001D, 0x000038BA, 0x00002D96,\n    0x00004BFD, 0x00004B29, 0x000038FB, 0x00004136, 0x00001CBF, 0x00003DE0,\n    0x00001CBE, 0x00004124, 0x00002000, 0x00003918, 0x00002037, 0x000200F9,\n    0x00005311, 0x000200F8, 0x00003B67, 0x000500AA, 0x00000009, 0x00005452,\n    0x0000199B, 0x00000A22, 0x000300F7, 0x00004F27, 0x00000002, 0x000400FA,\n    0x00005452, 0x000019C4, 0x00002304, 0x000200F8, 0x00002304, 0x000500C2,\n    0x0000000B, 0x00005635, 0x000051FC, 0x00000A11, 0x00060041, 0x00000289,\n    0x00003443, 0x00000CC7, 0x00000A0B, 0x00005635, 0x0004003D, 0x0000000B,\n    0x00003150, 0x00003443, 0x00050080, 0x0000000B, 0x00002DC4, 0x00005635,\n    0x00000A0D, 0x00060041, 0x00000289, 0x0000190F, 0x00000CC7, 0x00000A0B,\n    0x00002DC4, 0x0004003D, 0x0000000B, 0x00001B78, 0x0000190F, 0x00050080,\n    0x0000000B, 0x0000214A, 0x000051FC, 0x0000199B, 0x000500C2, 0x0000000B,\n    0x000054AB, 0x0000214A, 0x00000A11, 0x00060041, 0x00000289, 0x00004C99,\n    0x00000CC7, 0x00000A0B, 0x000054AB, 0x0004003D, 0x0000000B, 0x00003151,\n    0x00004C99, 0x00050080, 0x0000000B, 0x00002DC5, 0x000054AB, 0x00000A0D,\n    0x00060041, 0x00000289, 0x00006005, 0x00000CC7, 0x00000A0B, 0x00002DC5,\n    0x0004003D, 0x0000000B, 0x0000374E, 0x00006005, 0x00070050, 0x00000017,\n    0x00004CD9, 0x00003150, 0x00001B78, 0x00003151, 0x0000374E, 0x00050084,\n    0x0000000B, 0x00004C2D, 0x00000A10, 0x0000199B, 0x00050080, 0x0000000B,\n    0x00002A47, 0x000051FC, 0x00004C2D, 0x000500C2, 0x0000000B, 0x000045EC,\n    0x00002A47, 0x00000A11, 0x00060041, 0x00000289, 0x00004C9A, 0x00000CC7,\n    0x00000A0B, 0x000045EC, 0x0004003D, 0x0000000B, 0x00003152, 0x00004C9A,\n    0x00050080, 0x0000000B, 0x00002DC6, 0x000045EC, 0x00000A0D, 0x00060041,\n    0x00000289, 0x0000194D, 0x00000CC7, 0x00000A0B, 0x00002DC6, 0x0004003D,\n    0x0000000B, 0x00005E5D, 0x0000194D, 0x00050084, 0x0000000B, 0x000021F5,\n    0x00000A13, 0x0000199B, 0x00050080, 0x0000000B, 0x00005EC6, 0x000051FC,\n    0x000021F5, 0x000500C2, 0x0000000B, 0x000045ED, 0x00005EC6, 0x00000A11,\n    0x00060041, 0x00000289, 0x00004C9B, 0x00000CC7, 0x00000A0B, 0x000045ED,\n    0x0004003D, 0x0000000B, 0x00003153, 0x00004C9B, 0x00050080, 0x0000000B,\n    0x00002DC7, 0x000045ED, 0x00000A0D, 0x00060041, 0x00000289, 0x00006006,\n    0x00000CC7, 0x00000A0B, 0x00002DC7, 0x0004003D, 0x0000000B, 0x00004002,\n    0x00006006, 0x00070050, 0x00000017, 0x00005136, 0x00003152, 0x00005E5D,\n    0x00003153, 0x00004002, 0x000200F9, 0x00004F27, 0x000200F8, 0x000019C4,\n    0x000500C2, 0x0000000B, 0x00005FAB, 0x000051FC, 0x00000A11, 0x00060041,\n    0x00000289, 0x00003444, 0x00000CC7, 0x00000A0B, 0x00005FAB, 0x0004003D,\n    0x0000000B, 0x00003154, 0x00003444, 0x00050080, 0x0000000B, 0x00002DC8,\n    0x00005FAB, 0x00000A0D, 0x00060041, 0x00000289, 0x00001910, 0x00000CC7,\n    0x00000A0B, 0x00002DC8, 0x0004003D, 0x0000000B, 0x00005C70, 0x00001910,\n    0x00050080, 0x0000000B, 0x00002DC9, 0x00005FAB, 0x00000A10, 0x00060041,\n    0x00000289, 0x00001911, 0x00000CC7, 0x00000A0B, 0x00002DC9, 0x0004003D,\n    0x0000000B, 0x00005C71, 0x00001911, 0x00050080, 0x0000000B, 0x00002DCA,\n    0x00005FAB, 0x00000A13, 0x00060041, 0x00000289, 0x00006007, 0x00000CC7,\n    0x00000A0B, 0x00002DCA, 0x0004003D, 0x0000000B, 0x00003702, 0x00006007,\n    0x00070050, 0x00000017, 0x00005472, 0x00003154, 0x00005C70, 0x00005C71,\n    0x00003702, 0x00050080, 0x0000000B, 0x00004B85, 0x000051FC, 0x00000A3A,\n    0x000500C2, 0x0000000B, 0x0000202F, 0x00004B85, 0x00000A11, 0x00060041,\n    0x00000289, 0x00004C9C, 0x00000CC7, 0x00000A0B, 0x0000202F, 0x0004003D,\n    0x0000000B, 0x00003155, 0x00004C9C, 0x00050080, 0x0000000B, 0x00002DCB,\n    0x0000202F, 0x00000A0D, 0x00060041, 0x00000289, 0x00001912, 0x00000CC7,\n    0x00000A0B, 0x00002DCB, 0x0004003D, 0x0000000B, 0x00005C72, 0x00001912,\n    0x00050080, 0x0000000B, 0x00002DCC, 0x0000202F, 0x00000A10, 0x00060041,\n    0x00000289, 0x00001913, 0x00000CC7, 0x00000A0B, 0x00002DCC, 0x0004003D,\n    0x0000000B, 0x00005C73, 0x00001913, 0x00050080, 0x0000000B, 0x00002DCD,\n    0x0000202F, 0x00000A13, 0x00060041, 0x00000289, 0x00006008, 0x00000CC7,\n    0x00000A0B, 0x00002DCD, 0x0004003D, 0x0000000B, 0x00004003, 0x00006008,\n    0x00070050, 0x00000017, 0x00005137, 0x00003155, 0x00005C72, 0x00005C73,\n    0x00004003, 0x000200F9, 0x00004F27, 0x000200F8, 0x00004F27, 0x000700F5,\n    0x00000017, 0x00002BCF, 0x00005137, 0x000019C4, 0x00005136, 0x00002304,\n    0x000700F5, 0x00000017, 0x00003722, 0x00005472, 0x000019C4, 0x00004CD9,\n    0x00002304, 0x000300F7, 0x00004F28, 0x00000000, 0x000700FB, 0x00002180,\n    0x00004F58, 0x00000005, 0x0000215A, 0x00000007, 0x00002038, 0x000200F8,\n    0x00002038, 0x00050051, 0x0000000B, 0x00005F5E, 0x00003722, 0x00000000,\n    0x0006000C, 0x00000013, 0x0000606C, 0x00000001, 0x0000003E, 0x00005F5E,\n    0x00050051, 0x0000000D, 0x0000277E, 0x0000606C, 0x00000000, 0x00050051,\n    0x0000000D, 0x00003EC0, 0x0000606C, 0x00000001, 0x00050051, 0x0000000B,\n    0x00004289, 0x00003722, 0x00000001, 0x0006000C, 0x00000013, 0x00003CFD,\n    0x00000001, 0x0000003E, 0x00004289, 0x00050051, 0x0000000D, 0x0000277F,\n    0x00003CFD, 0x00000000, 0x00050051, 0x0000000D, 0x00004455, 0x00003CFD,\n    0x00000001, 0x00070050, 0x0000001D, 0x0000391B, 0x0000277E, 0x00003EC0,\n    0x0000277F, 0x00004455, 0x00050051, 0x0000000B, 0x00004389, 0x00003722,\n    0x00000002, 0x0006000C, 0x00000013, 0x0000467A, 0x00000001, 0x0000003E,\n    0x00004389, 0x00050051, 0x0000000D, 0x00002780, 0x0000467A, 0x00000000,\n    0x00050051, 0x0000000D, 0x00003EC1, 0x0000467A, 0x00000001, 0x00050051,\n    0x0000000B, 0x0000428A, 0x00003722, 0x00000003, 0x0006000C, 0x00000013,\n    0x00003CFE, 0x00000001, 0x0000003E, 0x0000428A, 0x00050051, 0x0000000D,\n    0x00002781, 0x00003CFE, 0x00000000, 0x00050051, 0x0000000D, 0x00004456,\n    0x00003CFE, 0x00000001, 0x00070050, 0x0000001D, 0x0000391C, 0x00002780,\n    0x00003EC1, 0x00002781, 0x00004456, 0x00050051, 0x0000000B, 0x0000438A,\n    0x00002BCF, 0x00000000, 0x0006000C, 0x00000013, 0x0000467B, 0x00000001,\n    0x0000003E, 0x0000438A, 0x00050051, 0x0000000D, 0x00002782, 0x0000467B,\n    0x00000000, 0x00050051, 0x0000000D, 0x00003EC2, 0x0000467B, 0x00000001,\n    0x00050051, 0x0000000B, 0x0000428B, 0x00002BCF, 0x00000001, 0x0006000C,\n    0x00000013, 0x00003CFF, 0x00000001, 0x0000003E, 0x0000428B, 0x00050051,\n    0x0000000D, 0x00002783, 0x00003CFF, 0x00000000, 0x00050051, 0x0000000D,\n    0x00004457, 0x00003CFF, 0x00000001, 0x00070050, 0x0000001D, 0x0000391D,\n    0x00002782, 0x00003EC2, 0x00002783, 0x00004457, 0x00050051, 0x0000000B,\n    0x0000438B, 0x00002BCF, 0x00000002, 0x0006000C, 0x00000013, 0x0000467C,\n    0x00000001, 0x0000003E, 0x0000438B, 0x00050051, 0x0000000D, 0x00002784,\n    0x0000467C, 0x00000000, 0x00050051, 0x0000000D, 0x00003EC3, 0x0000467C,\n    0x00000001, 0x00050051, 0x0000000B, 0x0000428C, 0x00002BCF, 0x00000003,\n    0x0006000C, 0x00000013, 0x00003D00, 0x00000001, 0x0000003E, 0x0000428C,\n    0x00050051, 0x0000000D, 0x00002785, 0x00003D00, 0x00000000, 0x00050051,\n    0x0000000D, 0x000050C3, 0x00003D00, 0x00000001, 0x00070050, 0x0000001D,\n    0x00002356, 0x00002784, 0x00003EC3, 0x00002785, 0x000050C3, 0x000200F9,\n    0x00004F28, 0x000200F8, 0x0000215A, 0x0007004F, 0x00000011, 0x000025FD,\n    0x00003722, 0x00003722, 0x00000000, 0x00000001, 0x0004007C, 0x00000012,\n    0x00005B3E, 0x000025FD, 0x0009004F, 0x0000001A, 0x000060D6, 0x00005B3E,\n    0x00005B3E, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x000500C4,\n    0x0000001A, 0x000048B0, 0x000060D6, 0x00000122, 0x000500C3, 0x0000001A,\n    0x00003D95, 0x000048B0, 0x00000302, 0x0004006F, 0x0000001D, 0x00002AB7,\n    0x00003D95, 0x0005008E, 0x0000001D, 0x0000472C, 0x00002AB7, 0x000007FE,\n    0x0007000C, 0x0000001D, 0x00006297, 0x00000001, 0x00000028, 0x00000504,\n    0x0000472C, 0x0007004F, 0x00000011, 0x00003771, 0x00003722, 0x00003722,\n    0x00000002, 0x00000003, 0x0004007C, 0x00000012, 0x000024C5, 0x00003771,\n    0x0009004F, 0x0000001A, 0x000060D7, 0x000024C5, 0x000024C5, 0x00000000,\n    0x00000000, 0x00000001, 0x00000001, 0x000500C4, 0x0000001A, 0x000048B1,\n    0x000060D7, 0x00000122, 0x000500C3, 0x0000001A, 0x00003D96, 0x000048B1,\n    0x00000302, 0x0004006F, 0x0000001D, 0x00002AB8, 0x00003D96, 0x0005008E,\n    0x0000001D, 0x0000472D, 0x00002AB8, 0x000007FE, 0x0007000C, 0x0000001D,\n    0x00006298, 0x00000001, 0x00000028, 0x00000504, 0x0000472D, 0x0007004F,\n    0x00000011, 0x00003772, 0x00002BCF, 0x00002BCF, 0x00000000, 0x00000001,\n    0x0004007C, 0x00000012, 0x000024C6, 0x00003772, 0x0009004F, 0x0000001A,\n    0x000060D8, 0x000024C6, 0x000024C6, 0x00000000, 0x00000000, 0x00000001,\n    0x00000001, 0x000500C4, 0x0000001A, 0x000048B2, 0x000060D8, 0x00000122,\n    0x000500C3, 0x0000001A, 0x00003D97, 0x000048B2, 0x00000302, 0x0004006F,\n    0x0000001D, 0x00002AB9, 0x00003D97, 0x0005008E, 0x0000001D, 0x0000472E,\n    0x00002AB9, 0x000007FE, 0x0007000C, 0x0000001D, 0x00006299, 0x00000001,\n    0x00000028, 0x00000504, 0x0000472E, 0x0007004F, 0x00000011, 0x00003773,\n    0x00002BCF, 0x00002BCF, 0x00000002, 0x00000003, 0x0004007C, 0x00000012,\n    0x000024C7, 0x00003773, 0x0009004F, 0x0000001A, 0x000060D9, 0x000024C7,\n    0x000024C7, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x000500C4,\n    0x0000001A, 0x000048B3, 0x000060D9, 0x00000122, 0x000500C3, 0x0000001A,\n    0x00003D98, 0x000048B3, 0x00000302, 0x0004006F, 0x0000001D, 0x00002ABA,\n    0x00003D98, 0x0005008E, 0x0000001D, 0x000053C1, 0x00002ABA, 0x000007FE,\n    0x0007000C, 0x0000001D, 0x00004364, 0x00000001, 0x00000028, 0x00000504,\n    0x000053C1, 0x000200F9, 0x00004F28, 0x000200F8, 0x00004F58, 0x0007004F,\n    0x00000011, 0x00002623, 0x00003722, 0x00003722, 0x00000000, 0x00000001,\n    0x0004007C, 0x00000013, 0x0000515B, 0x00002623, 0x00050051, 0x0000000D,\n    0x00001B83, 0x0000515B, 0x00000000, 0x00050051, 0x0000000D, 0x00003470,\n    0x0000515B, 0x00000001, 0x00070050, 0x0000001D, 0x0000427E, 0x00001B83,\n    0x00003470, 0x00000A0C, 0x00000A0C, 0x0007004F, 0x00000011, 0x000041DE,\n    0x00003722, 0x00003722, 0x00000002, 0x00000003, 0x0004007C, 0x00000013,\n    0x00003763, 0x000041DE, 0x00050051, 0x0000000D, 0x00001B84, 0x00003763,\n    0x00000000, 0x00050051, 0x0000000D, 0x00003471, 0x00003763, 0x00000001,\n    0x00070050, 0x0000001D, 0x0000427F, 0x00001B84, 0x00003471, 0x00000A0C,\n    0x00000A0C, 0x0007004F, 0x00000011, 0x000041DF, 0x00002BCF, 0x00002BCF,\n    0x00000000, 0x00000001, 0x0004007C, 0x00000013, 0x00003764, 0x000041DF,\n    0x00050051, 0x0000000D, 0x00001B85, 0x00003764, 0x00000000, 0x00050051,\n    0x0000000D, 0x00003472, 0x00003764, 0x00000001, 0x00070050, 0x0000001D,\n    0x00004280, 0x00001B85, 0x00003472, 0x00000A0C, 0x00000A0C, 0x0007004F,\n    0x00000011, 0x000041E0, 0x00002BCF, 0x00002BCF, 0x00000002, 0x00000003,\n    0x0004007C, 0x00000013, 0x00003765, 0x000041E0, 0x00050051, 0x0000000D,\n    0x00001B86, 0x00003765, 0x00000000, 0x00050051, 0x0000000D, 0x0000410A,\n    0x00003765, 0x00000001, 0x00070050, 0x0000001D, 0x00002357, 0x00001B86,\n    0x0000410A, 0x00000A0C, 0x00000A0C, 0x000200F9, 0x00004F28, 0x000200F8,\n    0x00004F28, 0x000900F5, 0x0000001D, 0x00002BAE, 0x00002357, 0x00004F58,\n    0x00004364, 0x0000215A, 0x00002356, 0x00002038, 0x000900F5, 0x0000001D,\n    0x0000380F, 0x00004280, 0x00004F58, 0x00006299, 0x0000215A, 0x0000391D,\n    0x00002038, 0x000900F5, 0x0000001D, 0x00003B82, 0x0000427F, 0x00004F58,\n    0x00006298, 0x0000215A, 0x0000391C, 0x00002038, 0x000900F5, 0x0000001D,\n    0x000038BB, 0x0000427E, 0x00004F58, 0x00006297, 0x0000215A, 0x0000391B,\n    0x00002038, 0x000200F9, 0x00005311, 0x000200F8, 0x00005311, 0x000700F5,\n    0x0000001D, 0x00002BAF, 0x00002BAE, 0x00004F28, 0x00002BAD, 0x00003F62,\n    0x000700F5, 0x0000001D, 0x00003810, 0x0000380F, 0x00004F28, 0x0000380E,\n    0x00003F62, 0x000700F5, 0x0000001D, 0x00003296, 0x00003B82, 0x00004F28,\n    0x00003B81, 0x00003F62, 0x000700F5, 0x0000001D, 0x0000367B, 0x000038BB,\n    0x00004F28, 0x000038BA, 0x00003F62, 0x00050081, 0x0000001D, 0x0000435A,\n    0x00004359, 0x0000367B, 0x00050081, 0x0000001D, 0x00005B02, 0x00005B01,\n    0x00003296, 0x00050081, 0x0000001D, 0x00001C28, 0x00001F92, 0x00003810,\n    0x00050081, 0x0000001D, 0x000025AA, 0x00005113, 0x00002BAF, 0x00050080,\n    0x0000000B, 0x00003FF8, 0x00005E78, 0x000037B2, 0x000300F7, 0x00005312,\n    0x00000002, 0x000400FA, 0x00005AEF, 0x00003B68, 0x000040BC, 0x000200F8,\n    0x000040BC, 0x000500AA, 0x00000009, 0x00004ADE, 0x0000199B, 0x00000A16,\n    0x000300F7, 0x00004F4C, 0x00000002, 0x000400FA, 0x00004ADE, 0x000019C5,\n    0x00002305, 0x000200F8, 0x00002305, 0x000500C2, 0x0000000B, 0x00005636,\n    0x00003FF8, 0x00000A11, 0x00060041, 0x00000289, 0x00003445, 0x00000CC7,\n    0x00000A0B, 0x00005636, 0x0004003D, 0x0000000B, 0x00003AD7, 0x00003445,\n    0x00050080, 0x0000000B, 0x0000214B, 0x00003FF8, 0x0000199B, 0x000500C2,\n    0x0000000B, 0x000054AC, 0x0000214B, 0x00000A11, 0x00060041, 0x00000289,\n    0x00004CE3, 0x00000CC7, 0x00000A0B, 0x000054AC, 0x0004003D, 0x0000000B,\n    0x00003340, 0x00004CE3, 0x00050084, 0x0000000B, 0x000021F6, 0x00000A10,\n    0x0000199B, 0x00050080, 0x0000000B, 0x00005EC8, 0x00003FF8, 0x000021F6,\n    0x000500C2, 0x0000000B, 0x000045EE, 0x00005EC8, 0x00000A11, 0x00060041,\n    0x00000289, 0x00004CE4, 0x00000CC7, 0x00000A0B, 0x000045EE, 0x0004003D,\n    0x0000000B, 0x00003341, 0x00004CE4, 0x00050084, 0x0000000B, 0x000021F7,\n    0x00000A13, 0x0000199B, 0x00050080, 0x0000000B, 0x00005EC9, 0x00003FF8,\n    0x000021F7, 0x000500C2, 0x0000000B, 0x000045EF, 0x00005EC9, 0x00000A11,\n    0x00060041, 0x00000289, 0x00004904, 0x00000CC7, 0x00000A0B, 0x000045EF,\n    0x0004003D, 0x0000000B, 0x00005F5F, 0x00004904, 0x00070050, 0x00000017,\n    0x00005138, 0x00003AD7, 0x00003340, 0x00003341, 0x00005F5F, 0x000200F9,\n    0x00004F4C, 0x000200F8, 0x000019C5, 0x000500C2, 0x0000000B, 0x00005FAC,\n    0x00003FF8, 0x00000A11, 0x00060041, 0x00000289, 0x00003446, 0x00000CC7,\n    0x00000A0B, 0x00005FAC, 0x0004003D, 0x0000000B, 0x00003156, 0x00003446,\n    0x00050080, 0x0000000B, 0x00002DCE, 0x00005FAC, 0x00000A0D, 0x00060041,\n    0x00000289, 0x00001914, 0x00000CC7, 0x00000A0B, 0x00002DCE, 0x0004003D,\n    0x0000000B, 0x00005C74, 0x00001914, 0x00050080, 0x0000000B, 0x00002DCF,\n    0x00005FAC, 0x00000A10, 0x00060041, 0x00000289, 0x00001915, 0x00000CC7,\n    0x00000A0B, 0x00002DCF, 0x0004003D, 0x0000000B, 0x00005C75, 0x00001915,\n    0x00050080, 0x0000000B, 0x00002DD0, 0x00005FAC, 0x00000A13, 0x00060041,\n    0x00000289, 0x00006009, 0x00000CC7, 0x00000A0B, 0x00002DD0, 0x0004003D,\n    0x0000000B, 0x00004004, 0x00006009, 0x00070050, 0x00000017, 0x00005139,\n    0x00003156, 0x00005C74, 0x00005C75, 0x00004004, 0x000200F9, 0x00004F4C,\n    0x000200F8, 0x00004F4C, 0x000700F5, 0x00000017, 0x00002AC2, 0x00005139,\n    0x000019C5, 0x00005138, 0x00002305, 0x000300F7, 0x00003F63, 0x00000000,\n    0x001300FB, 0x00002180, 0x00004BFE, 0x00000000, 0x000038FC, 0x00000001,\n    0x000038FC, 0x00000002, 0x00001CC1, 0x0000000A, 0x00001CC1, 0x00000003,\n    0x00001CC0, 0x0000000C, 0x00001CC0, 0x00000004, 0x00002001, 0x00000006,\n    0x00002039, 0x000200F8, 0x00002039, 0x00050051, 0x0000000B, 0x00005F60,\n    0x00002AC2, 0x00000000, 0x0006000C, 0x00000013, 0x0000606D, 0x00000001,\n    0x0000003E, 0x00005F60, 0x00050051, 0x0000000D, 0x00002786, 0x0000606D,\n    0x00000000, 0x00050051, 0x0000000D, 0x00004458, 0x0000606D, 0x00000001,\n    0x00070050, 0x0000001D, 0x0000391E, 0x00002786, 0x00004458, 0x00000A0C,\n    0x00000A0C, 0x00050051, 0x0000000B, 0x0000438C, 0x00002AC2, 0x00000001,\n    0x0006000C, 0x00000013, 0x0000467D, 0x00000001, 0x0000003E, 0x0000438C,\n    0x00050051, 0x0000000D, 0x00002787, 0x0000467D, 0x00000000, 0x00050051,\n    0x0000000D, 0x00004459, 0x0000467D, 0x00000001, 0x00070050, 0x0000001D,\n    0x0000391F, 0x00002787, 0x00004459, 0x00000A0C, 0x00000A0C, 0x00050051,\n    0x0000000B, 0x0000438D, 0x00002AC2, 0x00000002, 0x0006000C, 0x00000013,\n    0x0000467E, 0x00000001, 0x0000003E, 0x0000438D, 0x00050051, 0x0000000D,\n    0x00002788, 0x0000467E, 0x00000000, 0x00050051, 0x0000000D, 0x0000445A,\n    0x0000467E, 0x00000001, 0x00070050, 0x0000001D, 0x00003920, 0x00002788,\n    0x0000445A, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x0000438E,\n    0x00002AC2, 0x00000003, 0x0006000C, 0x00000013, 0x0000467F, 0x00000001,\n    0x0000003E, 0x0000438E, 0x00050051, 0x0000000D, 0x00002789, 0x0000467F,\n    0x00000000, 0x00050051, 0x0000000D, 0x000050C4, 0x0000467F, 0x00000001,\n    0x00070050, 0x0000001D, 0x00002358, 0x00002789, 0x000050C4, 0x00000A0C,\n    0x00000A0C, 0x000200F9, 0x00003F63, 0x000200F8, 0x00002001, 0x00050051,\n    0x0000000B, 0x00003091, 0x00002AC2, 0x00000000, 0x0004007C, 0x0000000C,\n    0x000058A0, 0x00003091, 0x00050050, 0x00000012, 0x0000472F, 0x000058A0,\n    0x000058A0, 0x000500C4, 0x00000012, 0x000047B9, 0x0000472F, 0x000007A7,\n    0x000500C3, 0x00000012, 0x00003423, 0x000047B9, 0x00000867, 0x0004006F,\n    0x00000013, 0x00002ABB, 0x00003423, 0x0005008E, 0x00000013, 0x00004753,\n    0x00002ABB, 0x000007FE, 0x0007000C, 0x00000013, 0x00005E12, 0x00000001,\n    0x00000028, 0x00000049, 0x00004753, 0x00050051, 0x0000000D, 0x00005F16,\n    0x00005E12, 0x00000000, 0x00050051, 0x0000000D, 0x00003CDD, 0x00005E12,\n    0x00000001, 0x00070050, 0x0000001D, 0x00004127, 0x00005F16, 0x00003CDD,\n    0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x00004C4B, 0x00002AC2,\n    0x00000001, 0x0004007C, 0x0000000C, 0x00003EAA, 0x00004C4B, 0x00050050,\n    0x00000012, 0x00004730, 0x00003EAA, 0x00003EAA, 0x000500C4, 0x00000012,\n    0x000047BA, 0x00004730, 0x000007A7, 0x000500C3, 0x00000012, 0x00003424,\n    0x000047BA, 0x00000867, 0x0004006F, 0x00000013, 0x00002ABC, 0x00003424,\n    0x0005008E, 0x00000013, 0x00004754, 0x00002ABC, 0x000007FE, 0x0007000C,\n    0x00000013, 0x00005E13, 0x00000001, 0x00000028, 0x00000049, 0x00004754,\n    0x00050051, 0x0000000D, 0x00005F17, 0x00005E13, 0x00000000, 0x00050051,\n    0x0000000D, 0x00003CDE, 0x00005E13, 0x00000001, 0x00070050, 0x0000001D,\n    0x00004128, 0x00005F17, 0x00003CDE, 0x00000A0C, 0x00000A0C, 0x00050051,\n    0x0000000B, 0x00004C4C, 0x00002AC2, 0x00000002, 0x0004007C, 0x0000000C,\n    0x00003EAB, 0x00004C4C, 0x00050050, 0x00000012, 0x00004731, 0x00003EAB,\n    0x00003EAB, 0x000500C4, 0x00000012, 0x000047BB, 0x00004731, 0x000007A7,\n    0x000500C3, 0x00000012, 0x00003425, 0x000047BB, 0x00000867, 0x0004006F,\n    0x00000013, 0x00002ABD, 0x00003425, 0x0005008E, 0x00000013, 0x00004755,\n    0x00002ABD, 0x000007FE, 0x0007000C, 0x00000013, 0x00005E14, 0x00000001,\n    0x00000028, 0x00000049, 0x00004755, 0x00050051, 0x0000000D, 0x00005F18,\n    0x00005E14, 0x00000000, 0x00050051, 0x0000000D, 0x00003CDF, 0x00005E14,\n    0x00000001, 0x00070050, 0x0000001D, 0x00004129, 0x00005F18, 0x00003CDF,\n    0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x00004C4D, 0x00002AC2,\n    0x00000003, 0x0004007C, 0x0000000C, 0x00003EAC, 0x00004C4D, 0x00050050,\n    0x00000012, 0x00004732, 0x00003EAC, 0x00003EAC, 0x000500C4, 0x00000012,\n    0x000047BC, 0x00004732, 0x000007A7, 0x000500C3, 0x00000012, 0x00003426,\n    0x000047BC, 0x00000867, 0x0004006F, 0x00000013, 0x00002ABE, 0x00003426,\n    0x0005008E, 0x00000013, 0x00004756, 0x00002ABE, 0x000007FE, 0x0007000C,\n    0x00000013, 0x00005E15, 0x00000001, 0x00000028, 0x00000049, 0x00004756,\n    0x00050051, 0x0000000D, 0x00005F19, 0x00005E15, 0x00000000, 0x00050051,\n    0x0000000D, 0x0000494F, 0x00005E15, 0x00000001, 0x00070050, 0x0000001D,\n    0x00002359, 0x00005F19, 0x0000494F, 0x00000A0C, 0x00000A0C, 0x000200F9,\n    0x00003F63, 0x000200F8, 0x00001CC0, 0x00050051, 0x0000000B, 0x000056C6,\n    0x00002AC2, 0x00000000, 0x00060050, 0x00000014, 0x00004F13, 0x000056C6,\n    0x000056C6, 0x000056C6, 0x000500C2, 0x00000014, 0x00002B1C, 0x00004F13,\n    0x00000BB4, 0x000500C7, 0x00000014, 0x00005DF2, 0x00002B1C, 0x00000105,\n    0x000500C7, 0x00000014, 0x000048B4, 0x00002B1C, 0x00000466, 0x000500C2,\n    0x00000014, 0x00005B9C, 0x00005DF2, 0x00000B0C, 0x000500AA, 0x00000010,\n    0x000040D5, 0x00005B9C, 0x00000A12, 0x0006000C, 0x00000016, 0x00002C57,\n    0x00000001, 0x0000004B, 0x000048B4, 0x0004007C, 0x00000014, 0x00002A21,\n    0x00002C57, 0x00050082, 0x00000014, 0x00001886, 0x00000B0C, 0x00002A21,\n    0x00050080, 0x00000014, 0x0000221C, 0x00002A21, 0x00000938, 0x000600A9,\n    0x00000014, 0x0000287B, 0x000040D5, 0x0000221C, 0x00005B9C, 0x000500C4,\n    0x00000014, 0x00005AE0, 0x000048B4, 0x00001886, 0x000500C7, 0x00000014,\n    0x000049A6, 0x00005AE0, 0x00000466, 0x000600A9, 0x00000014, 0x00002AC3,\n    0x000040D5, 0x000049A6, 0x000048B4, 0x00050080, 0x00000014, 0x0000600A,\n    0x0000287B, 0x000003FA, 0x000500C4, 0x00000014, 0x00004F8B, 0x0000600A,\n    0x00000189, 0x000500C4, 0x00000014, 0x00003FB2, 0x00002AC3, 0x0000008D,\n    0x000500C5, 0x00000014, 0x00005788, 0x00004F8B, 0x00003FB2, 0x000500AA,\n    0x00000010, 0x0000360C, 0x00005DF2, 0x00000A12, 0x000600A9, 0x00000014,\n    0x0000424E, 0x0000360C, 0x00000A12, 0x00005788, 0x0004007C, 0x00000018,\n    0x000029DB, 0x0000424E, 0x000500C2, 0x0000000B, 0x00004BB0, 0x000056C6,\n    0x00000A64, 0x00040070, 0x0000000D, 0x0000481A, 0x00004BB0, 0x00050085,\n    0x0000000D, 0x00003E2B, 0x0000481A, 0x00000149, 0x00050051, 0x0000000D,\n    0x000053CE, 0x000029DB, 0x00000000, 0x00050051, 0x0000000D, 0x00002A61,\n    0x000029DB, 0x00000001, 0x00050051, 0x0000000D, 0x00001EA2, 0x000029DB,\n    0x00000002, 0x00070050, 0x0000001D, 0x00003DE3, 0x000053CE, 0x00002A61,\n    0x00001EA2, 0x00003E2B, 0x00050051, 0x0000000B, 0x000027FE, 0x00002AC2,\n    0x00000001, 0x00060050, 0x00000014, 0x00003517, 0x000027FE, 0x000027FE,\n    0x000027FE, 0x000500C2, 0x00000014, 0x00002B1D, 0x00003517, 0x00000BB4,\n    0x000500C7, 0x00000014, 0x00005DF3, 0x00002B1D, 0x00000105, 0x000500C7,\n    0x00000014, 0x000048B5, 0x00002B1D, 0x00000466, 0x000500C2, 0x00000014,\n    0x00005B9D, 0x00005DF3, 0x00000B0C, 0x000500AA, 0x00000010, 0x000040D6,\n    0x00005B9D, 0x00000A12, 0x0006000C, 0x00000016, 0x00002C58, 0x00000001,\n    0x0000004B, 0x000048B5, 0x0004007C, 0x00000014, 0x00002A22, 0x00002C58,\n    0x00050082, 0x00000014, 0x00001887, 0x00000B0C, 0x00002A22, 0x00050080,\n    0x00000014, 0x0000221D, 0x00002A22, 0x00000938, 0x000600A9, 0x00000014,\n    0x0000287C, 0x000040D6, 0x0000221D, 0x00005B9D, 0x000500C4, 0x00000014,\n    0x00005AE1, 0x000048B5, 0x00001887, 0x000500C7, 0x00000014, 0x000049A7,\n    0x00005AE1, 0x00000466, 0x000600A9, 0x00000014, 0x00002AC4, 0x000040D6,\n    0x000049A7, 0x000048B5, 0x00050080, 0x00000014, 0x0000600B, 0x0000287C,\n    0x000003FA, 0x000500C4, 0x00000014, 0x00004F8C, 0x0000600B, 0x00000189,\n    0x000500C4, 0x00000014, 0x00003FB3, 0x00002AC4, 0x0000008D, 0x000500C5,\n    0x00000014, 0x00005789, 0x00004F8C, 0x00003FB3, 0x000500AA, 0x00000010,\n    0x0000360D, 0x00005DF3, 0x00000A12, 0x000600A9, 0x00000014, 0x0000424F,\n    0x0000360D, 0x00000A12, 0x00005789, 0x0004007C, 0x00000018, 0x000029DC,\n    0x0000424F, 0x000500C2, 0x0000000B, 0x00004BB1, 0x000027FE, 0x00000A64,\n    0x00040070, 0x0000000D, 0x0000481B, 0x00004BB1, 0x00050085, 0x0000000D,\n    0x00003E2C, 0x0000481B, 0x00000149, 0x00050051, 0x0000000D, 0x000053CF,\n    0x000029DC, 0x00000000, 0x00050051, 0x0000000D, 0x00002A62, 0x000029DC,\n    0x00000001, 0x00050051, 0x0000000D, 0x00001EA3, 0x000029DC, 0x00000002,\n    0x00070050, 0x0000001D, 0x00003DE4, 0x000053CF, 0x00002A62, 0x00001EA3,\n    0x00003E2C, 0x00050051, 0x0000000B, 0x000027FF, 0x00002AC2, 0x00000002,\n    0x00060050, 0x00000014, 0x00003518, 0x000027FF, 0x000027FF, 0x000027FF,\n    0x000500C2, 0x00000014, 0x00002B1E, 0x00003518, 0x00000BB4, 0x000500C7,\n    0x00000014, 0x00005DF4, 0x00002B1E, 0x00000105, 0x000500C7, 0x00000014,\n    0x000048B6, 0x00002B1E, 0x00000466, 0x000500C2, 0x00000014, 0x00005B9E,\n    0x00005DF4, 0x00000B0C, 0x000500AA, 0x00000010, 0x000040D7, 0x00005B9E,\n    0x00000A12, 0x0006000C, 0x00000016, 0x00002C59, 0x00000001, 0x0000004B,\n    0x000048B6, 0x0004007C, 0x00000014, 0x00002A23, 0x00002C59, 0x00050082,\n    0x00000014, 0x00001888, 0x00000B0C, 0x00002A23, 0x00050080, 0x00000014,\n    0x0000221E, 0x00002A23, 0x00000938, 0x000600A9, 0x00000014, 0x0000287D,\n    0x000040D7, 0x0000221E, 0x00005B9E, 0x000500C4, 0x00000014, 0x00005AE2,\n    0x000048B6, 0x00001888, 0x000500C7, 0x00000014, 0x000049A8, 0x00005AE2,\n    0x00000466, 0x000600A9, 0x00000014, 0x00002AC5, 0x000040D7, 0x000049A8,\n    0x000048B6, 0x00050080, 0x00000014, 0x0000600C, 0x0000287D, 0x000003FA,\n    0x000500C4, 0x00000014, 0x00004F8D, 0x0000600C, 0x00000189, 0x000500C4,\n    0x00000014, 0x00003FB4, 0x00002AC5, 0x0000008D, 0x000500C5, 0x00000014,\n    0x0000578A, 0x00004F8D, 0x00003FB4, 0x000500AA, 0x00000010, 0x0000360E,\n    0x00005DF4, 0x00000A12, 0x000600A9, 0x00000014, 0x00004250, 0x0000360E,\n    0x00000A12, 0x0000578A, 0x0004007C, 0x00000018, 0x000029DD, 0x00004250,\n    0x000500C2, 0x0000000B, 0x00004BB2, 0x000027FF, 0x00000A64, 0x00040070,\n    0x0000000D, 0x0000481C, 0x00004BB2, 0x00050085, 0x0000000D, 0x00003E2D,\n    0x0000481C, 0x00000149, 0x00050051, 0x0000000D, 0x000053D0, 0x000029DD,\n    0x00000000, 0x00050051, 0x0000000D, 0x00002A63, 0x000029DD, 0x00000001,\n    0x00050051, 0x0000000D, 0x00001EA4, 0x000029DD, 0x00000002, 0x00070050,\n    0x0000001D, 0x00003DE5, 0x000053D0, 0x00002A63, 0x00001EA4, 0x00003E2D,\n    0x00050051, 0x0000000B, 0x00002800, 0x00002AC2, 0x00000003, 0x00060050,\n    0x00000014, 0x00003519, 0x00002800, 0x00002800, 0x00002800, 0x000500C2,\n    0x00000014, 0x00002B1F, 0x00003519, 0x00000BB4, 0x000500C7, 0x00000014,\n    0x00005DF5, 0x00002B1F, 0x00000105, 0x000500C7, 0x00000014, 0x000048B7,\n    0x00002B1F, 0x00000466, 0x000500C2, 0x00000014, 0x00005B9F, 0x00005DF5,\n    0x00000B0C, 0x000500AA, 0x00000010, 0x000040D8, 0x00005B9F, 0x00000A12,\n    0x0006000C, 0x00000016, 0x00002C5A, 0x00000001, 0x0000004B, 0x000048B7,\n    0x0004007C, 0x00000014, 0x00002A24, 0x00002C5A, 0x00050082, 0x00000014,\n    0x00001889, 0x00000B0C, 0x00002A24, 0x00050080, 0x00000014, 0x0000221F,\n    0x00002A24, 0x00000938, 0x000600A9, 0x00000014, 0x0000287E, 0x000040D8,\n    0x0000221F, 0x00005B9F, 0x000500C4, 0x00000014, 0x00005AE3, 0x000048B7,\n    0x00001889, 0x000500C7, 0x00000014, 0x000049A9, 0x00005AE3, 0x00000466,\n    0x000600A9, 0x00000014, 0x00002AC6, 0x000040D8, 0x000049A9, 0x000048B7,\n    0x00050080, 0x00000014, 0x0000600D, 0x0000287E, 0x000003FA, 0x000500C4,\n    0x00000014, 0x00004F8E, 0x0000600D, 0x00000189, 0x000500C4, 0x00000014,\n    0x00003FB5, 0x00002AC6, 0x0000008D, 0x000500C5, 0x00000014, 0x0000578B,\n    0x00004F8E, 0x00003FB5, 0x000500AA, 0x00000010, 0x0000360F, 0x00005DF5,\n    0x00000A12, 0x000600A9, 0x00000014, 0x00004251, 0x0000360F, 0x00000A12,\n    0x0000578B, 0x0004007C, 0x00000018, 0x000029DE, 0x00004251, 0x000500C2,\n    0x0000000B, 0x00004BB3, 0x00002800, 0x00000A64, 0x00040070, 0x0000000D,\n    0x0000481D, 0x00004BB3, 0x00050085, 0x0000000D, 0x00003E2E, 0x0000481D,\n    0x00000149, 0x00050051, 0x0000000D, 0x000053D1, 0x000029DE, 0x00000000,\n    0x00050051, 0x0000000D, 0x00002A64, 0x000029DE, 0x00000001, 0x00050051,\n    0x0000000D, 0x00002B20, 0x000029DE, 0x00000002, 0x00070050, 0x0000001D,\n    0x0000235A, 0x000053D1, 0x00002A64, 0x00002B20, 0x00003E2E, 0x000200F9,\n    0x00003F63, 0x000200F8, 0x00001CC1, 0x00050051, 0x0000000B, 0x000056C7,\n    0x00002AC2, 0x00000000, 0x00070050, 0x00000017, 0x00004F14, 0x000056C7,\n    0x000056C7, 0x000056C7, 0x000056C7, 0x000500C2, 0x00000017, 0x000024B0,\n    0x00004F14, 0x0000034D, 0x000500C7, 0x00000017, 0x000049B7, 0x000024B0,\n    0x0000027B, 0x00040070, 0x0000001D, 0x00003CC0, 0x000049B7, 0x00050085,\n    0x0000001D, 0x00004139, 0x00003CC0, 0x00000AEE, 0x00050051, 0x0000000B,\n    0x00005CDB, 0x00002AC2, 0x00000001, 0x00070050, 0x00000017, 0x00005156,\n    0x00005CDB, 0x00005CDB, 0x00005CDB, 0x00005CDB, 0x000500C2, 0x00000017,\n    0x000024B1, 0x00005156, 0x0000034D, 0x000500C7, 0x00000017, 0x000049B8,\n    0x000024B1, 0x0000027B, 0x00040070, 0x0000001D, 0x00003CC1, 0x000049B8,\n    0x00050085, 0x0000001D, 0x0000413A, 0x00003CC1, 0x00000AEE, 0x00050051,\n    0x0000000B, 0x00005CDC, 0x00002AC2, 0x00000002, 0x00070050, 0x00000017,\n    0x00005157, 0x00005CDC, 0x00005CDC, 0x00005CDC, 0x00005CDC, 0x000500C2,\n    0x00000017, 0x000024B2, 0x00005157, 0x0000034D, 0x000500C7, 0x00000017,\n    0x000049B9, 0x000024B2, 0x0000027B, 0x00040070, 0x0000001D, 0x00003CC2,\n    0x000049B9, 0x00050085, 0x0000001D, 0x0000413B, 0x00003CC2, 0x00000AEE,\n    0x00050051, 0x0000000B, 0x00005CDD, 0x00002AC2, 0x00000003, 0x00070050,\n    0x00000017, 0x0000515C, 0x00005CDD, 0x00005CDD, 0x00005CDD, 0x00005CDD,\n    0x000500C2, 0x00000017, 0x000024B3, 0x0000515C, 0x0000034D, 0x000500C7,\n    0x00000017, 0x000049BA, 0x000024B3, 0x0000027B, 0x00040070, 0x0000001D,\n    0x00004932, 0x000049BA, 0x00050085, 0x0000001D, 0x000026A2, 0x00004932,\n    0x00000AEE, 0x000200F9, 0x00003F63, 0x000200F8, 0x000038FC, 0x00050051,\n    0x0000000B, 0x000056C8, 0x00002AC2, 0x00000000, 0x00070050, 0x00000017,\n    0x00004F15, 0x000056C8, 0x000056C8, 0x000056C8, 0x000056C8, 0x000500C2,\n    0x00000017, 0x000024B4, 0x00004F15, 0x0000028D, 0x000500C7, 0x00000017,\n    0x00004A62, 0x000024B4, 0x0000064B, 0x00040070, 0x0000001D, 0x000036AB,\n    0x00004A62, 0x0005008E, 0x0000001D, 0x00004B2C, 0x000036AB, 0x0000017A,\n    0x00050051, 0x0000000B, 0x000021A8, 0x00002AC2, 0x00000001, 0x00070050,\n    0x00000017, 0x00006114, 0x000021A8, 0x000021A8, 0x000021A8, 0x000021A8,\n    0x000500C2, 0x00000017, 0x000024B5, 0x00006114, 0x0000028D, 0x000500C7,\n    0x00000017, 0x00004A63, 0x000024B5, 0x0000064B, 0x00040070, 0x0000001D,\n    0x000036AC, 0x00004A63, 0x0005008E, 0x0000001D, 0x00004B2D, 0x000036AC,\n    0x0000017A, 0x00050051, 0x0000000B, 0x000021A9, 0x00002AC2, 0x00000002,\n    0x00070050, 0x00000017, 0x00006115, 0x000021A9, 0x000021A9, 0x000021A9,\n    0x000021A9, 0x000500C2, 0x00000017, 0x000024B6, 0x00006115, 0x0000028D,\n    0x000500C7, 0x00000017, 0x00004A64, 0x000024B6, 0x0000064B, 0x00040070,\n    0x0000001D, 0x000036AD, 0x00004A64, 0x0005008E, 0x0000001D, 0x00004B2E,\n    0x000036AD, 0x0000017A, 0x00050051, 0x0000000B, 0x000021AA, 0x00002AC2,\n    0x00000003, 0x00070050, 0x00000017, 0x00006116, 0x000021AA, 0x000021AA,\n    0x000021AA, 0x000021AA, 0x000500C2, 0x00000017, 0x000024B7, 0x00006116,\n    0x0000028D, 0x000500C7, 0x00000017, 0x00004A65, 0x000024B7, 0x0000064B,\n    0x00040070, 0x0000001D, 0x0000431D, 0x00004A65, 0x0005008E, 0x0000001D,\n    0x00003095, 0x0000431D, 0x0000017A, 0x000200F9, 0x00003F63, 0x000200F8,\n    0x00004BFE, 0x00050051, 0x0000000B, 0x00003096, 0x00002AC2, 0x00000000,\n    0x0004007C, 0x0000000D, 0x00004FF1, 0x00003096, 0x00050050, 0x00000013,\n    0x0000433F, 0x00004FF1, 0x00000A0C, 0x0009004F, 0x0000001D, 0x00002D99,\n    0x0000433F, 0x0000433F, 0x00000000, 0x00000001, 0x00000001, 0x00000001,\n    0x00050051, 0x0000000B, 0x000056BA, 0x00002AC2, 0x00000001, 0x0004007C,\n    0x0000000D, 0x00003F71, 0x000056BA, 0x00050050, 0x00000013, 0x00004340,\n    0x00003F71, 0x00000A0C, 0x0009004F, 0x0000001D, 0x00002D9A, 0x00004340,\n    0x00004340, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00050051,\n    0x0000000B, 0x000056BB, 0x00002AC2, 0x00000002, 0x0004007C, 0x0000000D,\n    0x00003F72, 0x000056BB, 0x00050050, 0x00000013, 0x00004341, 0x00003F72,\n    0x00000A0C, 0x0009004F, 0x0000001D, 0x00002D9B, 0x00004341, 0x00004341,\n    0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00050051, 0x0000000B,\n    0x000056BC, 0x00002AC2, 0x00000003, 0x0004007C, 0x0000000D, 0x00003F73,\n    0x000056BC, 0x00050050, 0x00000013, 0x00004FB1, 0x00003F73, 0x00000A0C,\n    0x0009004F, 0x0000001D, 0x00005A3D, 0x00004FB1, 0x00004FB1, 0x00000000,\n    0x00000001, 0x00000001, 0x00000001, 0x000200F9, 0x00003F63, 0x000200F8,\n    0x00003F63, 0x000F00F5, 0x0000001D, 0x00002BB0, 0x00005A3D, 0x00004BFE,\n    0x00003095, 0x000038FC, 0x000026A2, 0x00001CC1, 0x0000235A, 0x00001CC0,\n    0x00002359, 0x00002001, 0x00002358, 0x00002039, 0x000F00F5, 0x0000001D,\n    0x00003811, 0x00002D9B, 0x00004BFE, 0x00004B2E, 0x000038FC, 0x0000413B,\n    0x00001CC1, 0x00003DE5, 0x00001CC0, 0x00004129, 0x00002001, 0x00003920,\n    0x00002039, 0x000F00F5, 0x0000001D, 0x00003B83, 0x00002D9A, 0x00004BFE,\n    0x00004B2D, 0x000038FC, 0x0000413A, 0x00001CC1, 0x00003DE4, 0x00001CC0,\n    0x00004128, 0x00002001, 0x0000391F, 0x00002039, 0x000F00F5, 0x0000001D,\n    0x000038BC, 0x00002D99, 0x00004BFE, 0x00004B2C, 0x000038FC, 0x00004139,\n    0x00001CC1, 0x00003DE3, 0x00001CC0, 0x00004127, 0x00002001, 0x0000391E,\n    0x00002039, 0x000200F9, 0x00005312, 0x000200F8, 0x00003B68, 0x000500AA,\n    0x00000009, 0x00005453, 0x0000199B, 0x00000A22, 0x000300F7, 0x00004F29,\n    0x00000002, 0x000400FA, 0x00005453, 0x000019C6, 0x00002306, 0x000200F8,\n    0x00002306, 0x000500C2, 0x0000000B, 0x00005637, 0x00003FF8, 0x00000A11,\n    0x00060041, 0x00000289, 0x00003447, 0x00000CC7, 0x00000A0B, 0x00005637,\n    0x0004003D, 0x0000000B, 0x00003157, 0x00003447, 0x00050080, 0x0000000B,\n    0x00002DD1, 0x00005637, 0x00000A0D, 0x00060041, 0x00000289, 0x00001916,\n    0x00000CC7, 0x00000A0B, 0x00002DD1, 0x0004003D, 0x0000000B, 0x00001B79,\n    0x00001916, 0x00050080, 0x0000000B, 0x0000214C, 0x00003FF8, 0x0000199B,\n    0x000500C2, 0x0000000B, 0x000054AD, 0x0000214C, 0x00000A11, 0x00060041,\n    0x00000289, 0x00004C9D, 0x00000CC7, 0x00000A0B, 0x000054AD, 0x0004003D,\n    0x0000000B, 0x00003158, 0x00004C9D, 0x00050080, 0x0000000B, 0x00002DD2,\n    0x000054AD, 0x00000A0D, 0x00060041, 0x00000289, 0x0000600E, 0x00000CC7,\n    0x00000A0B, 0x00002DD2, 0x0004003D, 0x0000000B, 0x00003750, 0x0000600E,\n    0x00070050, 0x00000017, 0x00004CDA, 0x00003157, 0x00001B79, 0x00003158,\n    0x00003750, 0x00050084, 0x0000000B, 0x00004C2E, 0x00000A10, 0x0000199B,\n    0x00050080, 0x0000000B, 0x00002A48, 0x00003FF8, 0x00004C2E, 0x000500C2,\n    0x0000000B, 0x000045F0, 0x00002A48, 0x00000A11, 0x00060041, 0x00000289,\n    0x00004C9E, 0x00000CC7, 0x00000A0B, 0x000045F0, 0x0004003D, 0x0000000B,\n    0x00003159, 0x00004C9E, 0x00050080, 0x0000000B, 0x00002DD3, 0x000045F0,\n    0x00000A0D, 0x00060041, 0x00000289, 0x0000194E, 0x00000CC7, 0x00000A0B,\n    0x00002DD3, 0x0004003D, 0x0000000B, 0x00005E5E, 0x0000194E, 0x00050084,\n    0x0000000B, 0x000021F8, 0x00000A13, 0x0000199B, 0x00050080, 0x0000000B,\n    0x00005ECA, 0x00003FF8, 0x000021F8, 0x000500C2, 0x0000000B, 0x000045F1,\n    0x00005ECA, 0x00000A11, 0x00060041, 0x00000289, 0x00004C9F, 0x00000CC7,\n    0x00000A0B, 0x000045F1, 0x0004003D, 0x0000000B, 0x0000315A, 0x00004C9F,\n    0x00050080, 0x0000000B, 0x00002DD4, 0x000045F1, 0x00000A0D, 0x00060041,\n    0x00000289, 0x0000600F, 0x00000CC7, 0x00000A0B, 0x00002DD4, 0x0004003D,\n    0x0000000B, 0x00004005, 0x0000600F, 0x00070050, 0x00000017, 0x0000513A,\n    0x00003159, 0x00005E5E, 0x0000315A, 0x00004005, 0x000200F9, 0x00004F29,\n    0x000200F8, 0x000019C6, 0x000500C2, 0x0000000B, 0x00005FAD, 0x00003FF8,\n    0x00000A11, 0x00060041, 0x00000289, 0x00003448, 0x00000CC7, 0x00000A0B,\n    0x00005FAD, 0x0004003D, 0x0000000B, 0x0000315B, 0x00003448, 0x00050080,\n    0x0000000B, 0x00002DD5, 0x00005FAD, 0x00000A0D, 0x00060041, 0x00000289,\n    0x00001917, 0x00000CC7, 0x00000A0B, 0x00002DD5, 0x0004003D, 0x0000000B,\n    0x00005C76, 0x00001917, 0x00050080, 0x0000000B, 0x00002DD6, 0x00005FAD,\n    0x00000A10, 0x00060041, 0x00000289, 0x00001918, 0x00000CC7, 0x00000A0B,\n    0x00002DD6, 0x0004003D, 0x0000000B, 0x00005C77, 0x00001918, 0x00050080,\n    0x0000000B, 0x00002DD7, 0x00005FAD, 0x00000A13, 0x00060041, 0x00000289,\n    0x00006010, 0x00000CC7, 0x00000A0B, 0x00002DD7, 0x0004003D, 0x0000000B,\n    0x00003703, 0x00006010, 0x00070050, 0x00000017, 0x00005473, 0x0000315B,\n    0x00005C76, 0x00005C77, 0x00003703, 0x00050080, 0x0000000B, 0x00004B86,\n    0x00003FF8, 0x00000A3A, 0x000500C2, 0x0000000B, 0x00002030, 0x00004B86,\n    0x00000A11, 0x00060041, 0x00000289, 0x00004CA0, 0x00000CC7, 0x00000A0B,\n    0x00002030, 0x0004003D, 0x0000000B, 0x0000315C, 0x00004CA0, 0x00050080,\n    0x0000000B, 0x00002DD8, 0x00002030, 0x00000A0D, 0x00060041, 0x00000289,\n    0x00001919, 0x00000CC7, 0x00000A0B, 0x00002DD8, 0x0004003D, 0x0000000B,\n    0x00005C78, 0x00001919, 0x00050080, 0x0000000B, 0x00002DD9, 0x00002030,\n    0x00000A10, 0x00060041, 0x00000289, 0x0000191A, 0x00000CC7, 0x00000A0B,\n    0x00002DD9, 0x0004003D, 0x0000000B, 0x00005C79, 0x0000191A, 0x00050080,\n    0x0000000B, 0x00002DDA, 0x00002030, 0x00000A13, 0x00060041, 0x00000289,\n    0x00006011, 0x00000CC7, 0x00000A0B, 0x00002DDA, 0x0004003D, 0x0000000B,\n    0x00004006, 0x00006011, 0x00070050, 0x00000017, 0x0000513B, 0x0000315C,\n    0x00005C78, 0x00005C79, 0x00004006, 0x000200F9, 0x00004F29, 0x000200F8,\n    0x00004F29, 0x000700F5, 0x00000017, 0x00002BD0, 0x0000513B, 0x000019C6,\n    0x0000513A, 0x00002306, 0x000700F5, 0x00000017, 0x00003723, 0x00005473,\n    0x000019C6, 0x00004CDA, 0x00002306, 0x000300F7, 0x00004F2A, 0x00000000,\n    0x000700FB, 0x00002180, 0x00004F59, 0x00000005, 0x0000215B, 0x00000007,\n    0x0000203A, 0x000200F8, 0x0000203A, 0x00050051, 0x0000000B, 0x00005F61,\n    0x00003723, 0x00000000, 0x0006000C, 0x00000013, 0x0000606E, 0x00000001,\n    0x0000003E, 0x00005F61, 0x00050051, 0x0000000D, 0x0000278A, 0x0000606E,\n    0x00000000, 0x00050051, 0x0000000D, 0x00003EC4, 0x0000606E, 0x00000001,\n    0x00050051, 0x0000000B, 0x0000428D, 0x00003723, 0x00000001, 0x0006000C,\n    0x00000013, 0x00003D01, 0x00000001, 0x0000003E, 0x0000428D, 0x00050051,\n    0x0000000D, 0x0000278B, 0x00003D01, 0x00000000, 0x00050051, 0x0000000D,\n    0x0000445B, 0x00003D01, 0x00000001, 0x00070050, 0x0000001D, 0x00003921,\n    0x0000278A, 0x00003EC4, 0x0000278B, 0x0000445B, 0x00050051, 0x0000000B,\n    0x0000438F, 0x00003723, 0x00000002, 0x0006000C, 0x00000013, 0x00004680,\n    0x00000001, 0x0000003E, 0x0000438F, 0x00050051, 0x0000000D, 0x0000278C,\n    0x00004680, 0x00000000, 0x00050051, 0x0000000D, 0x00003EC5, 0x00004680,\n    0x00000001, 0x00050051, 0x0000000B, 0x0000428E, 0x00003723, 0x00000003,\n    0x0006000C, 0x00000013, 0x00003D02, 0x00000001, 0x0000003E, 0x0000428E,\n    0x00050051, 0x0000000D, 0x0000278D, 0x00003D02, 0x00000000, 0x00050051,\n    0x0000000D, 0x0000445C, 0x00003D02, 0x00000001, 0x00070050, 0x0000001D,\n    0x00003922, 0x0000278C, 0x00003EC5, 0x0000278D, 0x0000445C, 0x00050051,\n    0x0000000B, 0x00004390, 0x00002BD0, 0x00000000, 0x0006000C, 0x00000013,\n    0x00004681, 0x00000001, 0x0000003E, 0x00004390, 0x00050051, 0x0000000D,\n    0x0000278E, 0x00004681, 0x00000000, 0x00050051, 0x0000000D, 0x00003EC6,\n    0x00004681, 0x00000001, 0x00050051, 0x0000000B, 0x0000428F, 0x00002BD0,\n    0x00000001, 0x0006000C, 0x00000013, 0x00003D03, 0x00000001, 0x0000003E,\n    0x0000428F, 0x00050051, 0x0000000D, 0x0000278F, 0x00003D03, 0x00000000,\n    0x00050051, 0x0000000D, 0x0000445D, 0x00003D03, 0x00000001, 0x00070050,\n    0x0000001D, 0x00003923, 0x0000278E, 0x00003EC6, 0x0000278F, 0x0000445D,\n    0x00050051, 0x0000000B, 0x00004391, 0x00002BD0, 0x00000002, 0x0006000C,\n    0x00000013, 0x00004682, 0x00000001, 0x0000003E, 0x00004391, 0x00050051,\n    0x0000000D, 0x00002790, 0x00004682, 0x00000000, 0x00050051, 0x0000000D,\n    0x00003EC7, 0x00004682, 0x00000001, 0x00050051, 0x0000000B, 0x00004290,\n    0x00002BD0, 0x00000003, 0x0006000C, 0x00000013, 0x00003D04, 0x00000001,\n    0x0000003E, 0x00004290, 0x00050051, 0x0000000D, 0x00002791, 0x00003D04,\n    0x00000000, 0x00050051, 0x0000000D, 0x000050C5, 0x00003D04, 0x00000001,\n    0x00070050, 0x0000001D, 0x0000235B, 0x00002790, 0x00003EC7, 0x00002791,\n    0x000050C5, 0x000200F9, 0x00004F2A, 0x000200F8, 0x0000215B, 0x0007004F,\n    0x00000011, 0x000025FE, 0x00003723, 0x00003723, 0x00000000, 0x00000001,\n    0x0004007C, 0x00000012, 0x00005B3F, 0x000025FE, 0x0009004F, 0x0000001A,\n    0x000060DA, 0x00005B3F, 0x00005B3F, 0x00000000, 0x00000000, 0x00000001,\n    0x00000001, 0x000500C4, 0x0000001A, 0x000048B8, 0x000060DA, 0x00000122,\n    0x000500C3, 0x0000001A, 0x00003D99, 0x000048B8, 0x00000302, 0x0004006F,\n    0x0000001D, 0x00002AC7, 0x00003D99, 0x0005008E, 0x0000001D, 0x00004733,\n    0x00002AC7, 0x000007FE, 0x0007000C, 0x0000001D, 0x0000629A, 0x00000001,\n    0x00000028, 0x00000504, 0x00004733, 0x0007004F, 0x00000011, 0x00003774,\n    0x00003723, 0x00003723, 0x00000002, 0x00000003, 0x0004007C, 0x00000012,\n    0x000024C8, 0x00003774, 0x0009004F, 0x0000001A, 0x000060DB, 0x000024C8,\n    0x000024C8, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x000500C4,\n    0x0000001A, 0x000048B9, 0x000060DB, 0x00000122, 0x000500C3, 0x0000001A,\n    0x00003D9A, 0x000048B9, 0x00000302, 0x0004006F, 0x0000001D, 0x00002AC8,\n    0x00003D9A, 0x0005008E, 0x0000001D, 0x00004734, 0x00002AC8, 0x000007FE,\n    0x0007000C, 0x0000001D, 0x0000629B, 0x00000001, 0x00000028, 0x00000504,\n    0x00004734, 0x0007004F, 0x00000011, 0x00003775, 0x00002BD0, 0x00002BD0,\n    0x00000000, 0x00000001, 0x0004007C, 0x00000012, 0x000024C9, 0x00003775,\n    0x0009004F, 0x0000001A, 0x000060DC, 0x000024C9, 0x000024C9, 0x00000000,\n    0x00000000, 0x00000001, 0x00000001, 0x000500C4, 0x0000001A, 0x000048BA,\n    0x000060DC, 0x00000122, 0x000500C3, 0x0000001A, 0x00003D9B, 0x000048BA,\n    0x00000302, 0x0004006F, 0x0000001D, 0x00002AC9, 0x00003D9B, 0x0005008E,\n    0x0000001D, 0x00004735, 0x00002AC9, 0x000007FE, 0x0007000C, 0x0000001D,\n    0x0000629C, 0x00000001, 0x00000028, 0x00000504, 0x00004735, 0x0007004F,\n    0x00000011, 0x00003776, 0x00002BD0, 0x00002BD0, 0x00000002, 0x00000003,\n    0x0004007C, 0x00000012, 0x000024CA, 0x00003776, 0x0009004F, 0x0000001A,\n    0x000060DD, 0x000024CA, 0x000024CA, 0x00000000, 0x00000000, 0x00000001,\n    0x00000001, 0x000500C4, 0x0000001A, 0x000048BC, 0x000060DD, 0x00000122,\n    0x000500C3, 0x0000001A, 0x00003D9C, 0x000048BC, 0x00000302, 0x0004006F,\n    0x0000001D, 0x00002ACA, 0x00003D9C, 0x0005008E, 0x0000001D, 0x000053D2,\n    0x00002ACA, 0x000007FE, 0x0007000C, 0x0000001D, 0x00004365, 0x00000001,\n    0x00000028, 0x00000504, 0x000053D2, 0x000200F9, 0x00004F2A, 0x000200F8,\n    0x00004F59, 0x0007004F, 0x00000011, 0x00002624, 0x00003723, 0x00003723,\n    0x00000000, 0x00000001, 0x0004007C, 0x00000013, 0x0000515D, 0x00002624,\n    0x00050051, 0x0000000D, 0x00001B87, 0x0000515D, 0x00000000, 0x00050051,\n    0x0000000D, 0x00003473, 0x0000515D, 0x00000001, 0x00070050, 0x0000001D,\n    0x00004291, 0x00001B87, 0x00003473, 0x00000A0C, 0x00000A0C, 0x0007004F,\n    0x00000011, 0x000041E1, 0x00003723, 0x00003723, 0x00000002, 0x00000003,\n    0x0004007C, 0x00000013, 0x00003766, 0x000041E1, 0x00050051, 0x0000000D,\n    0x00001B88, 0x00003766, 0x00000000, 0x00050051, 0x0000000D, 0x00003474,\n    0x00003766, 0x00000001, 0x00070050, 0x0000001D, 0x00004292, 0x00001B88,\n    0x00003474, 0x00000A0C, 0x00000A0C, 0x0007004F, 0x00000011, 0x000041E2,\n    0x00002BD0, 0x00002BD0, 0x00000000, 0x00000001, 0x0004007C, 0x00000013,\n    0x00003767, 0x000041E2, 0x00050051, 0x0000000D, 0x00001B89, 0x00003767,\n    0x00000000, 0x00050051, 0x0000000D, 0x00003475, 0x00003767, 0x00000001,\n    0x00070050, 0x0000001D, 0x00004293, 0x00001B89, 0x00003475, 0x00000A0C,\n    0x00000A0C, 0x0007004F, 0x00000011, 0x000041E3, 0x00002BD0, 0x00002BD0,\n    0x00000002, 0x00000003, 0x0004007C, 0x00000013, 0x00003768, 0x000041E3,\n    0x00050051, 0x0000000D, 0x00001B8A, 0x00003768, 0x00000000, 0x00050051,\n    0x0000000D, 0x0000410B, 0x00003768, 0x00000001, 0x00070050, 0x0000001D,\n    0x0000235C, 0x00001B8A, 0x0000410B, 0x00000A0C, 0x00000A0C, 0x000200F9,\n    0x00004F2A, 0x000200F8, 0x00004F2A, 0x000900F5, 0x0000001D, 0x00002BB1,\n    0x0000235C, 0x00004F59, 0x00004365, 0x0000215B, 0x0000235B, 0x0000203A,\n    0x000900F5, 0x0000001D, 0x00003812, 0x00004293, 0x00004F59, 0x0000629C,\n    0x0000215B, 0x00003923, 0x0000203A, 0x000900F5, 0x0000001D, 0x00003B84,\n    0x00004292, 0x00004F59, 0x0000629B, 0x0000215B, 0x00003922, 0x0000203A,\n    0x000900F5, 0x0000001D, 0x000038BD, 0x00004291, 0x00004F59, 0x0000629A,\n    0x0000215B, 0x00003921, 0x0000203A, 0x000200F9, 0x00005312, 0x000200F8,\n    0x00005312, 0x000700F5, 0x0000001D, 0x00002BB2, 0x00002BB1, 0x00004F2A,\n    0x00002BB0, 0x00003F63, 0x000700F5, 0x0000001D, 0x00003813, 0x00003812,\n    0x00004F2A, 0x00003811, 0x00003F63, 0x000700F5, 0x0000001D, 0x00003297,\n    0x00003B84, 0x00004F2A, 0x00003B83, 0x00003F63, 0x000700F5, 0x0000001D,\n    0x0000367C, 0x000038BD, 0x00004F2A, 0x000038BC, 0x00003F63, 0x00050081,\n    0x0000001D, 0x0000435B, 0x0000435A, 0x0000367C, 0x00050081, 0x0000001D,\n    0x00005B03, 0x00005B02, 0x00003297, 0x00050081, 0x0000001D, 0x00002523,\n    0x00001C28, 0x00003813, 0x00050081, 0x0000001D, 0x00001E77, 0x000025AA,\n    0x00002BB2, 0x000200F9, 0x00005ECB, 0x000200F8, 0x00005ECB, 0x000700F5,\n    0x0000001D, 0x00002BB3, 0x00005113, 0x00005310, 0x00001E77, 0x00005312,\n    0x000700F5, 0x0000001D, 0x00003814, 0x00001F92, 0x00005310, 0x00002523,\n    0x00005312, 0x000700F5, 0x0000001D, 0x00003B31, 0x00005B01, 0x00005310,\n    0x00005B03, 0x00005312, 0x000700F5, 0x0000001D, 0x00003B85, 0x00004359,\n    0x00005310, 0x0000435B, 0x00005312, 0x000700F5, 0x0000000D, 0x000038BE,\n    0x000061FB, 0x00005310, 0x00002F3A, 0x00005312, 0x000200F9, 0x00005313,\n    0x000200F8, 0x00005313, 0x000700F5, 0x0000001D, 0x00002BB4, 0x00002BA9,\n    0x0000530F, 0x00002BB3, 0x00005ECB, 0x000700F5, 0x0000001D, 0x00003815,\n    0x0000380A, 0x0000530F, 0x00003814, 0x00005ECB, 0x000700F5, 0x0000001D,\n    0x00003B32, 0x000035EC, 0x0000530F, 0x00003B31, 0x00005ECB, 0x000700F5,\n    0x0000001D, 0x0000338C, 0x000020D3, 0x0000530F, 0x00003B85, 0x00005ECB,\n    0x000700F5, 0x0000000D, 0x00002EA8, 0x00002B2C, 0x0000530F, 0x000038BE,\n    0x00005ECB, 0x0005008E, 0x0000001D, 0x00005A74, 0x0000338C, 0x00002EA8,\n    0x0005008E, 0x0000001D, 0x000019CC, 0x00003B32, 0x00002EA8, 0x0005008E,\n    0x0000001D, 0x0000306F, 0x00003815, 0x00002EA8, 0x0005008E, 0x0000001D,\n    0x00003432, 0x00002BB4, 0x00002EA8, 0x000300F7, 0x00003F64, 0x00000002,\n    0x000400FA, 0x00001D33, 0x00002741, 0x00003F64, 0x000200F8, 0x00002741,\n    0x0009004F, 0x0000001D, 0x00003AEE, 0x00005A74, 0x00005A74, 0x00000002,\n    0x00000001, 0x00000000, 0x00000003, 0x0009004F, 0x0000001D, 0x00003A07,\n    0x000019CC, 0x000019CC, 0x00000002, 0x00000001, 0x00000000, 0x00000003,\n    0x0009004F, 0x0000001D, 0x00001CE6, 0x0000306F, 0x0000306F, 0x00000002,\n    0x00000001, 0x00000000, 0x00000003, 0x0009004F, 0x0000001D, 0x00003EEF,\n    0x00003432, 0x00003432, 0x00000002, 0x00000001, 0x00000000, 0x00000003,\n    0x000200F9, 0x00003F64, 0x000200F8, 0x00003F64, 0x000700F5, 0x0000001D,\n    0x00002BB5, 0x00003432, 0x00005313, 0x00003EEF, 0x00002741, 0x000700F5,\n    0x0000001D, 0x00003816, 0x0000306F, 0x00005313, 0x00001CE6, 0x00002741,\n    0x000700F5, 0x0000001D, 0x00003B57, 0x000019CC, 0x00005313, 0x00003A07,\n    0x00002741, 0x000700F5, 0x0000001D, 0x00003A49, 0x00005A74, 0x00005313,\n    0x00003AEE, 0x00002741, 0x000300F7, 0x00004992, 0x00000000, 0x001900FB,\n    0x00005093, 0x00002002, 0x00000006, 0x00004696, 0x0000000E, 0x00004696,\n    0x00000032, 0x00004696, 0x00000007, 0x000045F2, 0x00000036, 0x000045F2,\n    0x00000010, 0x00001935, 0x00000037, 0x00001935, 0x00000011, 0x00001934,\n    0x00000038, 0x00001934, 0x00000019, 0x00001933, 0x0000001F, 0x00002514,\n    0x000200F8, 0x00002514, 0x00050051, 0x0000000D, 0x00003AAE, 0x00003A49,\n    0x00000000, 0x00050051, 0x0000000D, 0x000023ED, 0x00003A49, 0x00000001,\n    0x00050050, 0x00000013, 0x00004B20, 0x00003AAE, 0x000023ED, 0x0006000C,\n    0x0000000B, 0x00002171, 0x00000001, 0x0000003A, 0x00004B20, 0x00050051,\n    0x0000000D, 0x00005BBF, 0x00003B57, 0x00000000, 0x00050051, 0x0000000D,\n    0x000039A7, 0x00003B57, 0x00000001, 0x00050050, 0x00000013, 0x00004B21,\n    0x00005BBF, 0x000039A7, 0x0006000C, 0x0000000B, 0x00002172, 0x00000001,\n    0x0000003A, 0x00004B21, 0x00050051, 0x0000000D, 0x00005BC0, 0x00003816,\n    0x00000000, 0x00050051, 0x0000000D, 0x000039A8, 0x00003816, 0x00000001,\n    0x00050050, 0x00000013, 0x00004B22, 0x00005BC0, 0x000039A8, 0x0006000C,\n    0x0000000B, 0x00002173, 0x00000001, 0x0000003A, 0x00004B22, 0x00050051,\n    0x0000000D, 0x00005BC1, 0x00002BB5, 0x00000000, 0x00050051, 0x0000000D,\n    0x000039A9, 0x00002BB5, 0x00000001, 0x00050050, 0x00000013, 0x00004B0D,\n    0x00005BC1, 0x000039A9, 0x0006000C, 0x0000000B, 0x00002E96, 0x00000001,\n    0x0000003A, 0x00004B0D, 0x00070050, 0x00000017, 0x0000612F, 0x00002171,\n    0x00002172, 0x00002173, 0x00002E96, 0x000200F9, 0x00004992, 0x000200F8,\n    0x00001933, 0x0007004F, 0x00000013, 0x0000227A, 0x00003A49, 0x00003A49,\n    0x00000000, 0x00000001, 0x0008000C, 0x00000013, 0x00005CB1, 0x00000001,\n    0x0000002B, 0x0000227A, 0x0000071F, 0x00000300, 0x0005008E, 0x00000013,\n    0x000025B4, 0x00005CB1, 0x0000022D, 0x00050081, 0x00000013, 0x00002E66,\n    0x000025B4, 0x0000061E, 0x0004006D, 0x00000011, 0x00001DD7, 0x00002E66,\n    0x00050051, 0x0000000B, 0x000021FC, 0x00001DD7, 0x00000000, 0x00050051,\n    0x0000000B, 0x00002FDB, 0x00001DD7, 0x00000001, 0x000500C4, 0x0000000B,\n    0x00002D03, 0x00002FDB, 0x00000A3B, 0x000500C5, 0x0000000B, 0x00004143,\n    0x000021FC, 0x00002D03, 0x0007004F, 0x00000013, 0x0000235D, 0x00003B57,\n    0x00003B57, 0x00000000, 0x00000001, 0x0008000C, 0x00000013, 0x000046BF,\n    0x00000001, 0x0000002B, 0x0000235D, 0x0000071F, 0x00000300, 0x0005008E,\n    0x00000013, 0x000025B5, 0x000046BF, 0x0000022D, 0x00050081, 0x00000013,\n    0x00002E67, 0x000025B5, 0x0000061E, 0x0004006D, 0x00000011, 0x00001DD9,\n    0x00002E67, 0x00050051, 0x0000000B, 0x000021FD, 0x00001DD9, 0x00000000,\n    0x00050051, 0x0000000B, 0x00002FDC, 0x00001DD9, 0x00000001, 0x000500C4,\n    0x0000000B, 0x00002D04, 0x00002FDC, 0x00000A3B, 0x000500C5, 0x0000000B,\n    0x00004144, 0x000021FD, 0x00002D04, 0x0007004F, 0x00000013, 0x0000235E,\n    0x00003816, 0x00003816, 0x00000000, 0x00000001, 0x0008000C, 0x00000013,\n    0x000046C0, 0x00000001, 0x0000002B, 0x0000235E, 0x0000071F, 0x00000300,\n    0x0005008E, 0x00000013, 0x000025B6, 0x000046C0, 0x0000022D, 0x00050081,\n    0x00000013, 0x00002E69, 0x000025B6, 0x0000061E, 0x0004006D, 0x00000011,\n    0x00001DDA, 0x00002E69, 0x00050051, 0x0000000B, 0x000021FE, 0x00001DDA,\n    0x00000000, 0x00050051, 0x0000000B, 0x00002FDD, 0x00001DDA, 0x00000001,\n    0x000500C4, 0x0000000B, 0x00002D05, 0x00002FDD, 0x00000A3B, 0x000500C5,\n    0x0000000B, 0x00004145, 0x000021FE, 0x00002D05, 0x0007004F, 0x00000013,\n    0x0000235F, 0x00002BB5, 0x00002BB5, 0x00000000, 0x00000001, 0x0008000C,\n    0x00000013, 0x000046C1, 0x00000001, 0x0000002B, 0x0000235F, 0x0000071F,\n    0x00000300, 0x0005008E, 0x00000013, 0x000025B7, 0x000046C1, 0x0000022D,\n    0x00050081, 0x00000013, 0x00002E6A, 0x000025B7, 0x0000061E, 0x0004006D,\n    0x00000011, 0x00001DDB, 0x00002E6A, 0x00050051, 0x0000000B, 0x000021FF,\n    0x00001DDB, 0x00000000, 0x00050051, 0x0000000B, 0x00002FDE, 0x00001DDB,\n    0x00000001, 0x000500C4, 0x0000000B, 0x00002D16, 0x00002FDE, 0x00000A3B,\n    0x000500C5, 0x0000000B, 0x00005202, 0x000021FF, 0x00002D16, 0x00070050,\n    0x00000017, 0x000053DD, 0x00004143, 0x00004144, 0x00004145, 0x00005202,\n    0x000200F9, 0x00004992, 0x000200F8, 0x00001934, 0x0008004F, 0x00000018,\n    0x000021CF, 0x00003A49, 0x00003A49, 0x00000000, 0x00000001, 0x00000002,\n    0x0008000C, 0x00000018, 0x00001847, 0x00000001, 0x0000002B, 0x000021CF,\n    0x00000A2D, 0x00000A18, 0x00050085, 0x00000018, 0x00001BC1, 0x00001847,\n    0x0000000E, 0x00050081, 0x00000018, 0x00001F1A, 0x00001BC1, 0x000003AB,\n    0x0004006D, 0x00000014, 0x00002752, 0x00001F1A, 0x00050051, 0x0000000B,\n    0x00002200, 0x00002752, 0x00000000, 0x00050051, 0x0000000B, 0x00002FDF,\n    0x00002752, 0x00000001, 0x000500C4, 0x0000000B, 0x00002D29, 0x00002FDF,\n    0x00000A29, 0x000500C5, 0x0000000B, 0x00004D66, 0x00002200, 0x00002D29,\n    0x00050051, 0x0000000B, 0x000053E4, 0x00002752, 0x00000002, 0x000500C4,\n    0x0000000B, 0x0000214D, 0x000053E4, 0x00000A4A, 0x000500C5, 0x0000000B,\n    0x00004146, 0x00004D66, 0x0000214D, 0x0008004F, 0x00000018, 0x000022A2,\n    0x00003B57, 0x00003B57, 0x00000000, 0x00000001, 0x00000002, 0x0008000C,\n    0x00000018, 0x00004CD4, 0x00000001, 0x0000002B, 0x000022A2, 0x00000A2D,\n    0x00000A18, 0x00050085, 0x00000018, 0x00001BC2, 0x00004CD4, 0x0000000E,\n    0x00050081, 0x00000018, 0x00001F1B, 0x00001BC2, 0x000003AB, 0x0004006D,\n    0x00000014, 0x00002753, 0x00001F1B, 0x00050051, 0x0000000B, 0x00002201,\n    0x00002753, 0x00000000, 0x00050051, 0x0000000B, 0x00002FE0, 0x00002753,\n    0x00000001, 0x000500C4, 0x0000000B, 0x00002D2A, 0x00002FE0, 0x00000A29,\n    0x000500C5, 0x0000000B, 0x00004D67, 0x00002201, 0x00002D2A, 0x00050051,\n    0x0000000B, 0x000053E5, 0x00002753, 0x00000002, 0x000500C4, 0x0000000B,\n    0x0000214E, 0x000053E5, 0x00000A4A, 0x000500C5, 0x0000000B, 0x00004147,\n    0x00004D67, 0x0000214E, 0x0008004F, 0x00000018, 0x000022A3, 0x00003816,\n    0x00003816, 0x00000000, 0x00000001, 0x00000002, 0x0008000C, 0x00000018,\n    0x00004CD5, 0x00000001, 0x0000002B, 0x000022A3, 0x00000A2D, 0x00000A18,\n    0x00050085, 0x00000018, 0x00001BC3, 0x00004CD5, 0x0000000E, 0x00050081,\n    0x00000018, 0x00001F1C, 0x00001BC3, 0x000003AB, 0x0004006D, 0x00000014,\n    0x00002754, 0x00001F1C, 0x00050051, 0x0000000B, 0x00002202, 0x00002754,\n    0x00000000, 0x00050051, 0x0000000B, 0x00002FE1, 0x00002754, 0x00000001,\n    0x000500C4, 0x0000000B, 0x00002D2B, 0x00002FE1, 0x00000A29, 0x000500C5,\n    0x0000000B, 0x00004D68, 0x00002202, 0x00002D2B, 0x00050051, 0x0000000B,\n    0x000053E6, 0x00002754, 0x00000002, 0x000500C4, 0x0000000B, 0x0000214F,\n    0x000053E6, 0x00000A4A, 0x000500C5, 0x0000000B, 0x00004148, 0x00004D68,\n    0x0000214F, 0x0008004F, 0x00000018, 0x000022A4, 0x00002BB5, 0x00002BB5,\n    0x00000000, 0x00000001, 0x00000002, 0x0008000C, 0x00000018, 0x00004CDB,\n    0x00000001, 0x0000002B, 0x000022A4, 0x00000A2D, 0x00000A18, 0x00050085,\n    0x00000018, 0x00001BC4, 0x00004CDB, 0x0000000E, 0x00050081, 0x00000018,\n    0x00001F1D, 0x00001BC4, 0x000003AB, 0x0004006D, 0x00000014, 0x00002755,\n    0x00001F1D, 0x00050051, 0x0000000B, 0x00002203, 0x00002755, 0x00000000,\n    0x00050051, 0x0000000B, 0x00002FE2, 0x00002755, 0x00000001, 0x000500C4,\n    0x0000000B, 0x00002D2C, 0x00002FE2, 0x00000A29, 0x000500C5, 0x0000000B,\n    0x00004D69, 0x00002203, 0x00002D2C, 0x00050051, 0x0000000B, 0x000053E7,\n    0x00002755, 0x00000002, 0x000500C4, 0x0000000B, 0x0000215D, 0x000053E7,\n    0x00000A4A, 0x000500C5, 0x0000000B, 0x00005203, 0x00004D69, 0x0000215D,\n    0x00070050, 0x00000017, 0x000053DE, 0x00004146, 0x00004147, 0x00004148,\n    0x00005203, 0x000200F9, 0x00004992, 0x000200F8, 0x00001935, 0x0008004F,\n    0x00000018, 0x000021D0, 0x00003A49, 0x00003A49, 0x00000000, 0x00000001,\n    0x00000002, 0x0008000C, 0x00000018, 0x00001848, 0x00000001, 0x0000002B,\n    0x000021D0, 0x00000A2D, 0x00000A18, 0x00050085, 0x00000018, 0x00001BC5,\n    0x00001848, 0x000008E3, 0x00050081, 0x00000018, 0x00001F1E, 0x00001BC5,\n    0x000003AB, 0x0004006D, 0x00000014, 0x00002756, 0x00001F1E, 0x00050051,\n    0x0000000B, 0x00002204, 0x00002756, 0x00000000, 0x00050051, 0x0000000B,\n    0x00002FE3, 0x00002756, 0x00000001, 0x000500C4, 0x0000000B, 0x00002D2D,\n    0x00002FE3, 0x00000A2C, 0x000500C5, 0x0000000B, 0x00004D6A, 0x00002204,\n    0x00002D2D, 0x00050051, 0x0000000B, 0x000053E8, 0x00002756, 0x00000002,\n    0x000500C4, 0x0000000B, 0x00002150, 0x000053E8, 0x00000A4D, 0x000500C5,\n    0x0000000B, 0x00004149, 0x00004D6A, 0x00002150, 0x0008004F, 0x00000018,\n    0x000022A5, 0x00003B57, 0x00003B57, 0x00000000, 0x00000001, 0x00000002,\n    0x0008000C, 0x00000018, 0x00004CDC, 0x00000001, 0x0000002B, 0x000022A5,\n    0x00000A2D, 0x00000A18, 0x00050085, 0x00000018, 0x00001BC6, 0x00004CDC,\n    0x000008E3, 0x00050081, 0x00000018, 0x00001F1F, 0x00001BC6, 0x000003AB,\n    0x0004006D, 0x00000014, 0x00002757, 0x00001F1F, 0x00050051, 0x0000000B,\n    0x00002205, 0x00002757, 0x00000000, 0x00050051, 0x0000000B, 0x00002FE4,\n    0x00002757, 0x00000001, 0x000500C4, 0x0000000B, 0x00002D2E, 0x00002FE4,\n    0x00000A2C, 0x000500C5, 0x0000000B, 0x00004D6B, 0x00002205, 0x00002D2E,\n    0x00050051, 0x0000000B, 0x000053E9, 0x00002757, 0x00000002, 0x000500C4,\n    0x0000000B, 0x00002151, 0x000053E9, 0x00000A4D, 0x000500C5, 0x0000000B,\n    0x0000414A, 0x00004D6B, 0x00002151, 0x0008004F, 0x00000018, 0x000022A6,\n    0x00003816, 0x00003816, 0x00000000, 0x00000001, 0x00000002, 0x0008000C,\n    0x00000018, 0x00004CE5, 0x00000001, 0x0000002B, 0x000022A6, 0x00000A2D,\n    0x00000A18, 0x00050085, 0x00000018, 0x00001BC7, 0x00004CE5, 0x000008E3,\n    0x00050081, 0x00000018, 0x00001F20, 0x00001BC7, 0x000003AB, 0x0004006D,\n    0x00000014, 0x00002758, 0x00001F20, 0x00050051, 0x0000000B, 0x00002206,\n    0x00002758, 0x00000000, 0x00050051, 0x0000000B, 0x00002FE5, 0x00002758,\n    0x00000001, 0x000500C4, 0x0000000B, 0x00002D2F, 0x00002FE5, 0x00000A2C,\n    0x000500C5, 0x0000000B, 0x00004D6C, 0x00002206, 0x00002D2F, 0x00050051,\n    0x0000000B, 0x000053EA, 0x00002758, 0x00000002, 0x000500C4, 0x0000000B,\n    0x00002152, 0x000053EA, 0x00000A4D, 0x000500C5, 0x0000000B, 0x0000414B,\n    0x00004D6C, 0x00002152, 0x0008004F, 0x00000018, 0x000022A8, 0x00002BB5,\n    0x00002BB5, 0x00000000, 0x00000001, 0x00000002, 0x0008000C, 0x00000018,\n    0x00004CE6, 0x00000001, 0x0000002B, 0x000022A8, 0x00000A2D, 0x00000A18,\n    0x00050085, 0x00000018, 0x00001BC8, 0x00004CE6, 0x000008E3, 0x00050081,\n    0x00000018, 0x00001F21, 0x00001BC8, 0x000003AB, 0x0004006D, 0x00000014,\n    0x00002759, 0x00001F21, 0x00050051, 0x0000000B, 0x00002207, 0x00002759,\n    0x00000000, 0x00050051, 0x0000000B, 0x00002FE6, 0x00002759, 0x00000001,\n    0x000500C4, 0x0000000B, 0x00002D30, 0x00002FE6, 0x00000A2C, 0x000500C5,\n    0x0000000B, 0x00004D6D, 0x00002207, 0x00002D30, 0x00050051, 0x0000000B,\n    0x000053EB, 0x00002759, 0x00000002, 0x000500C4, 0x0000000B, 0x0000215E,\n    0x000053EB, 0x00000A4D, 0x000500C5, 0x0000000B, 0x00005204, 0x00004D6D,\n    0x0000215E, 0x00070050, 0x00000017, 0x000053DF, 0x00004149, 0x0000414A,\n    0x0000414B, 0x00005204, 0x000200F9, 0x00004992, 0x000200F8, 0x000045F2,\n    0x0008000C, 0x0000001D, 0x000022A9, 0x00000001, 0x0000002B, 0x00003A49,\n    0x00000B7A, 0x00000505, 0x00050085, 0x0000001D, 0x00004580, 0x000022A9,\n    0x00000158, 0x00050081, 0x0000001D, 0x00001F22, 0x00004580, 0x00000145,\n    0x0004006D, 0x00000017, 0x0000275A, 0x00001F22, 0x00050051, 0x0000000B,\n    0x00002208, 0x0000275A, 0x00000000, 0x00050051, 0x0000000B, 0x00002FE7,\n    0x0000275A, 0x00000001, 0x000500C4, 0x0000000B, 0x00002D31, 0x00002FE7,\n    0x00000A29, 0x000500C5, 0x0000000B, 0x00004D6E, 0x00002208, 0x00002D31,\n    0x00050051, 0x0000000B, 0x000053EC, 0x0000275A, 0x00000002, 0x000500C4,\n    0x0000000B, 0x00002170, 0x000053EC, 0x00000A47, 0x000500C5, 0x0000000B,\n    0x00004D6F, 0x00004D6E, 0x00002170, 0x00050051, 0x0000000B, 0x000053ED,\n    0x0000275A, 0x00000003, 0x000500C4, 0x0000000B, 0x00001C7C, 0x000053ED,\n    0x00000A65, 0x000500C5, 0x0000000B, 0x0000237C, 0x00004D6F, 0x00001C7C,\n    0x0008000C, 0x0000001D, 0x00002377, 0x00000001, 0x0000002B, 0x00003B57,\n    0x00000B7A, 0x00000505, 0x00050085, 0x0000001D, 0x000060DE, 0x00002377,\n    0x00000158, 0x00050081, 0x0000001D, 0x00001F23, 0x000060DE, 0x00000145,\n    0x0004006D, 0x00000017, 0x0000275B, 0x00001F23, 0x00050051, 0x0000000B,\n    0x00002209, 0x0000275B, 0x00000000, 0x00050051, 0x0000000B, 0x00002FE8,\n    0x0000275B, 0x00000001, 0x000500C4, 0x0000000B, 0x00002D32, 0x00002FE8,\n    0x00000A29, 0x000500C5, 0x0000000B, 0x00004D70, 0x00002209, 0x00002D32,\n    0x00050051, 0x0000000B, 0x000053EE, 0x0000275B, 0x00000002, 0x000500C4,\n    0x0000000B, 0x00002174, 0x000053EE, 0x00000A47, 0x000500C5, 0x0000000B,\n    0x00004D71, 0x00004D70, 0x00002174, 0x00050051, 0x0000000B, 0x000053EF,\n    0x0000275B, 0x00000003, 0x000500C4, 0x0000000B, 0x00001C7D, 0x000053EF,\n    0x00000A65, 0x000500C5, 0x0000000B, 0x0000237D, 0x00004D71, 0x00001C7D,\n    0x0008000C, 0x0000001D, 0x00002378, 0x00000001, 0x0000002B, 0x00003816,\n    0x00000B7A, 0x00000505, 0x00050085, 0x0000001D, 0x000060DF, 0x00002378,\n    0x00000158, 0x00050081, 0x0000001D, 0x00001F24, 0x000060DF, 0x00000145,\n    0x0004006D, 0x00000017, 0x0000275C, 0x00001F24, 0x00050051, 0x0000000B,\n    0x0000220A, 0x0000275C, 0x00000000, 0x00050051, 0x0000000B, 0x00002FE9,\n    0x0000275C, 0x00000001, 0x000500C4, 0x0000000B, 0x00002D33, 0x00002FE9,\n    0x00000A29, 0x000500C5, 0x0000000B, 0x00004D72, 0x0000220A, 0x00002D33,\n    0x00050051, 0x0000000B, 0x000053F0, 0x0000275C, 0x00000002, 0x000500C4,\n    0x0000000B, 0x00002175, 0x000053F0, 0x00000A47, 0x000500C5, 0x0000000B,\n    0x00004D73, 0x00004D72, 0x00002175, 0x00050051, 0x0000000B, 0x000053F1,\n    0x0000275C, 0x00000003, 0x000500C4, 0x0000000B, 0x00001C7E, 0x000053F1,\n    0x00000A65, 0x000500C5, 0x0000000B, 0x0000237E, 0x00004D73, 0x00001C7E,\n    0x0008000C, 0x0000001D, 0x00002379, 0x00000001, 0x0000002B, 0x00002BB5,\n    0x00000B7A, 0x00000505, 0x00050085, 0x0000001D, 0x000060E0, 0x00002379,\n    0x00000158, 0x00050081, 0x0000001D, 0x00001F25, 0x000060E0, 0x00000145,\n    0x0004006D, 0x00000017, 0x0000275D, 0x00001F25, 0x00050051, 0x0000000B,\n    0x0000220B, 0x0000275D, 0x00000000, 0x00050051, 0x0000000B, 0x00002FEA,\n    0x0000275D, 0x00000001, 0x000500C4, 0x0000000B, 0x00002D34, 0x00002FEA,\n    0x00000A29, 0x000500C5, 0x0000000B, 0x00004D74, 0x0000220B, 0x00002D34,\n    0x00050051, 0x0000000B, 0x000053F2, 0x0000275D, 0x00000002, 0x000500C4,\n    0x0000000B, 0x00002176, 0x000053F2, 0x00000A47, 0x000500C5, 0x0000000B,\n    0x00004D75, 0x00004D74, 0x00002176, 0x00050051, 0x0000000B, 0x000053F3,\n    0x0000275D, 0x00000003, 0x000500C4, 0x0000000B, 0x0000215F, 0x000053F3,\n    0x00000A65, 0x000500C5, 0x0000000B, 0x00005205, 0x00004D75, 0x0000215F,\n    0x00070050, 0x00000017, 0x000053E0, 0x0000237C, 0x0000237D, 0x0000237E,\n    0x00005205, 0x000200F9, 0x00004992, 0x000200F8, 0x00004696, 0x0008000C,\n    0x0000001D, 0x00001C8F, 0x00000001, 0x0000002B, 0x00003A49, 0x00000B7A,\n    0x00000505, 0x0005008E, 0x0000001D, 0x00004F73, 0x00001C8F, 0x00000540,\n    0x00050081, 0x0000001D, 0x00002E6B, 0x00004F73, 0x00000145, 0x0004006D,\n    0x00000017, 0x00001DDC, 0x00002E6B, 0x00050051, 0x0000000B, 0x0000220C,\n    0x00001DDC, 0x00000000, 0x00050051, 0x0000000B, 0x00002FEB, 0x00001DDC,\n    0x00000001, 0x000500C4, 0x0000000B, 0x00002D35, 0x00002FEB, 0x00000A23,\n    0x000500C5, 0x0000000B, 0x00004D76, 0x0000220C, 0x00002D35, 0x00050051,\n    0x0000000B, 0x000053F4, 0x00001DDC, 0x00000002, 0x000500C4, 0x0000000B,\n    0x00002177, 0x000053F4, 0x00000A3B, 0x000500C5, 0x0000000B, 0x00004D77,\n    0x00004D76, 0x00002177, 0x00050051, 0x0000000B, 0x000053F5, 0x00001DDC,\n    0x00000003, 0x000500C4, 0x0000000B, 0x00001C7F, 0x000053F5, 0x00000A53,\n    0x000500C5, 0x0000000B, 0x00002427, 0x00004D77, 0x00001C7F, 0x0008000C,\n    0x0000001D, 0x00001D62, 0x00000001, 0x0000002B, 0x00003B57, 0x00000B7A,\n    0x00000505, 0x0005008E, 0x0000001D, 0x00002048, 0x00001D62, 0x00000540,\n    0x00050081, 0x0000001D, 0x00002E6C, 0x00002048, 0x00000145, 0x0004006D,\n    0x00000017, 0x00001DDD, 0x00002E6C, 0x00050051, 0x0000000B, 0x0000220D,\n    0x00001DDD, 0x00000000, 0x00050051, 0x0000000B, 0x00002FEC, 0x00001DDD,\n    0x00000001, 0x000500C4, 0x0000000B, 0x00002D36, 0x00002FEC, 0x00000A23,\n    0x000500C5, 0x0000000B, 0x00004D78, 0x0000220D, 0x00002D36, 0x00050051,\n    0x0000000B, 0x000053F6, 0x00001DDD, 0x00000002, 0x000500C4, 0x0000000B,\n    0x00002178, 0x000053F6, 0x00000A3B, 0x000500C5, 0x0000000B, 0x00004D79,\n    0x00004D78, 0x00002178, 0x00050051, 0x0000000B, 0x000053F7, 0x00001DDD,\n    0x00000003, 0x000500C4, 0x0000000B, 0x00001C80, 0x000053F7, 0x00000A53,\n    0x000500C5, 0x0000000B, 0x00002428, 0x00004D79, 0x00001C80, 0x0008000C,\n    0x0000001D, 0x00001D63, 0x00000001, 0x0000002B, 0x00003816, 0x00000B7A,\n    0x00000505, 0x0005008E, 0x0000001D, 0x00002049, 0x00001D63, 0x00000540,\n    0x00050081, 0x0000001D, 0x00002E6D, 0x00002049, 0x00000145, 0x0004006D,\n    0x00000017, 0x00001DDE, 0x00002E6D, 0x00050051, 0x0000000B, 0x0000220E,\n    0x00001DDE, 0x00000000, 0x00050051, 0x0000000B, 0x00002FED, 0x00001DDE,\n    0x00000001, 0x000500C4, 0x0000000B, 0x00002D37, 0x00002FED, 0x00000A23,\n    0x000500C5, 0x0000000B, 0x00004D7A, 0x0000220E, 0x00002D37, 0x00050051,\n    0x0000000B, 0x000053F8, 0x00001DDE, 0x00000002, 0x000500C4, 0x0000000B,\n    0x00002179, 0x000053F8, 0x00000A3B, 0x000500C5, 0x0000000B, 0x00004D7B,\n    0x00004D7A, 0x00002179, 0x00050051, 0x0000000B, 0x000053F9, 0x00001DDE,\n    0x00000003, 0x000500C4, 0x0000000B, 0x00001C81, 0x000053F9, 0x00000A53,\n    0x000500C5, 0x0000000B, 0x00002429, 0x00004D7B, 0x00001C81, 0x0008000C,\n    0x0000001D, 0x00001D64, 0x00000001, 0x0000002B, 0x00002BB5, 0x00000B7A,\n    0x00000505, 0x0005008E, 0x0000001D, 0x0000204A, 0x00001D64, 0x00000540,\n    0x00050081, 0x0000001D, 0x00002E6E, 0x0000204A, 0x00000145, 0x0004006D,\n    0x00000017, 0x00001DDF, 0x00002E6E, 0x00050051, 0x0000000B, 0x0000220F,\n    0x00001DDF, 0x00000000, 0x00050051, 0x0000000B, 0x00002FEE, 0x00001DDF,\n    0x00000001, 0x000500C4, 0x0000000B, 0x00002D38, 0x00002FEE, 0x00000A23,\n    0x000500C5, 0x0000000B, 0x00004D7C, 0x0000220F, 0x00002D38, 0x00050051,\n    0x0000000B, 0x000053FA, 0x00001DDF, 0x00000002, 0x000500C4, 0x0000000B,\n    0x0000217A, 0x000053FA, 0x00000A3B, 0x000500C5, 0x0000000B, 0x00004D7D,\n    0x00004D7C, 0x0000217A, 0x00050051, 0x0000000B, 0x000053FB, 0x00001DDF,\n    0x00000003, 0x000500C4, 0x0000000B, 0x00002160, 0x000053FB, 0x00000A53,\n    0x000500C5, 0x0000000B, 0x00005206, 0x00004D7D, 0x00002160, 0x00070050,\n    0x00000017, 0x000053E1, 0x00002427, 0x00002428, 0x00002429, 0x00005206,\n    0x000200F9, 0x00004992, 0x000200F8, 0x00002002, 0x00050051, 0x0000000D,\n    0x0000309E, 0x00003A49, 0x00000000, 0x0004007C, 0x0000000B, 0x00005298,\n    0x0000309E, 0x00050051, 0x0000000D, 0x00004F4D, 0x00003B57, 0x00000000,\n    0x0004007C, 0x0000000B, 0x0000451D, 0x00004F4D, 0x00050051, 0x0000000D,\n    0x00004F4E, 0x00003816, 0x00000000, 0x0004007C, 0x0000000B, 0x0000451E,\n    0x00004F4E, 0x00050051, 0x0000000D, 0x00004F38, 0x00002BB5, 0x00000000,\n    0x0004007C, 0x0000000B, 0x00004F16, 0x00004F38, 0x00070050, 0x00000017,\n    0x00002738, 0x00005298, 0x0000451D, 0x0000451E, 0x00004F16, 0x000200F9,\n    0x00004992, 0x000200F8, 0x00004992, 0x001100F5, 0x00000017, 0x000058B2,\n    0x00002738, 0x00002002, 0x000053E1, 0x00004696, 0x000053E0, 0x000045F2,\n    0x000053DF, 0x00001935, 0x000053DE, 0x00001934, 0x000053DD, 0x00001933,\n    0x0000612F, 0x00002514, 0x000500AA, 0x00000009, 0x00004AAF, 0x00001DD8,\n    0x00000A0A, 0x000600A9, 0x00000009, 0x000056E6, 0x00004AAF, 0x00000787,\n    0x00004AAF, 0x000300F7, 0x00004CC1, 0x00000002, 0x000400FA, 0x000056E6,\n    0x00002620, 0x00004CC1, 0x000200F8, 0x00002620, 0x00050051, 0x0000000B,\n    0x00005002, 0x000058B2, 0x00000001, 0x00060052, 0x00000017, 0x000037FF,\n    0x00005002, 0x000058B2, 0x00000000, 0x000200F9, 0x00004CC1, 0x000200F8,\n    0x00004CC1, 0x000700F5, 0x00000017, 0x0000305F, 0x000058B2, 0x00004992,\n    0x000037FF, 0x00002620, 0x00050080, 0x00000011, 0x000032A7, 0x00002EF9,\n    0x000059EC, 0x000300F7, 0x000052F5, 0x00000002, 0x000400FA, 0x0000500F,\n    0x0000294E, 0x0000537D, 0x000200F8, 0x0000537D, 0x0004007C, 0x00000012,\n    0x00002970, 0x000032A7, 0x00050051, 0x0000000C, 0x000045F3, 0x00002970,\n    0x00000001, 0x000500C3, 0x0000000C, 0x00004DC0, 0x000045F3, 0x00000A1A,\n    0x0004007C, 0x0000000C, 0x0000578C, 0x000020FC, 0x00050084, 0x0000000C,\n    0x00001F02, 0x00004DC0, 0x0000578C, 0x00050051, 0x0000000C, 0x00006242,\n    0x00002970, 0x00000000, 0x000500C3, 0x0000000C, 0x00004FC7, 0x00006242,\n    0x00000A1A, 0x00050080, 0x0000000C, 0x000049BB, 0x00001F02, 0x00004FC7,\n    0x000500C4, 0x0000000C, 0x0000254A, 0x000049BB, 0x00000A1D, 0x000500C3,\n    0x0000000C, 0x0000603B, 0x000045F3, 0x00000A0E, 0x000500C7, 0x0000000C,\n    0x0000539A, 0x0000603B, 0x00000A20, 0x000500C4, 0x0000000C, 0x0000534A,\n    0x0000539A, 0x00000A14, 0x000500C7, 0x0000000C, 0x00004EA5, 0x00006242,\n    0x00000A20, 0x000500C5, 0x0000000C, 0x00002B21, 0x0000534A, 0x00004EA5,\n    0x000500C5, 0x0000000C, 0x000043B6, 0x0000254A, 0x00002B21, 0x000500C4,\n    0x0000000C, 0x00005E63, 0x000043B6, 0x00000A10, 0x000500C3, 0x0000000C,\n    0x000031DE, 0x000045F3, 0x00000A17, 0x000500C7, 0x0000000C, 0x00005447,\n    0x000031DE, 0x00000A0E, 0x000500C3, 0x0000000C, 0x000028A6, 0x00006242,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x0000511E, 0x000028A6, 0x00000A14,\n    0x000500C3, 0x0000000C, 0x000028B9, 0x000045F3, 0x00000A14, 0x000500C7,\n    0x0000000C, 0x0000505E, 0x000028B9, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x0000541D, 0x0000505E, 0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BA,\n    0x0000511E, 0x0000541D, 0x000500C7, 0x0000000C, 0x00005076, 0x000045F3,\n    0x00000A0E, 0x000500C4, 0x0000000C, 0x00005228, 0x00005076, 0x00000A17,\n    0x000500C4, 0x0000000C, 0x00001997, 0x000022BA, 0x00000A1D, 0x000500C5,\n    0x0000000C, 0x000047FE, 0x00005228, 0x00001997, 0x000500C4, 0x0000000C,\n    0x00001C00, 0x00005447, 0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C81,\n    0x000047FE, 0x00001C00, 0x000500C7, 0x0000000C, 0x000050AF, 0x00005E63,\n    0x00000A38, 0x000500C5, 0x0000000C, 0x00003C70, 0x00003C81, 0x000050AF,\n    0x000500C3, 0x0000000C, 0x00003745, 0x00005E63, 0x00000A17, 0x000500C7,\n    0x0000000C, 0x000018B8, 0x00003745, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x0000547E, 0x000018B8, 0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A8,\n    0x00003C70, 0x0000547E, 0x000500C3, 0x0000000C, 0x00003A6E, 0x00005E63,\n    0x00000A1A, 0x000500C7, 0x0000000C, 0x000018B9, 0x00003A6E, 0x00000A20,\n    0x000500C4, 0x0000000C, 0x0000547F, 0x000018B9, 0x00000A23, 0x000500C5,\n    0x0000000C, 0x0000456F, 0x000045A8, 0x0000547F, 0x000500C3, 0x0000000C,\n    0x00003C88, 0x00005E63, 0x00000A23, 0x000500C4, 0x0000000C, 0x00002824,\n    0x00003C88, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B79, 0x0000456F,\n    0x00002824, 0x0004007C, 0x0000000B, 0x000041E5, 0x00003B79, 0x000200F9,\n    0x000052F5, 0x000200F8, 0x0000294E, 0x00050051, 0x0000000B, 0x00004D9A,\n    0x000032A7, 0x00000000, 0x00050051, 0x0000000B, 0x00002C03, 0x000032A7,\n    0x00000001, 0x00060050, 0x00000014, 0x000020DE, 0x00004D9A, 0x00002C03,\n    0x00005F72, 0x0004007C, 0x00000016, 0x00004E9D, 0x000020DE, 0x00050051,\n    0x0000000C, 0x00002BF7, 0x00004E9D, 0x00000002, 0x000500C3, 0x0000000C,\n    0x00004DC1, 0x00002BF7, 0x00000A11, 0x0004007C, 0x0000000C, 0x0000578D,\n    0x00006273, 0x00050084, 0x0000000C, 0x00001F03, 0x00004DC1, 0x0000578D,\n    0x00050051, 0x0000000C, 0x00006243, 0x00004E9D, 0x00000001, 0x000500C3,\n    0x0000000C, 0x00004A6F, 0x00006243, 0x00000A17, 0x00050080, 0x0000000C,\n    0x00002B2D, 0x00001F03, 0x00004A6F, 0x0004007C, 0x0000000C, 0x00004202,\n    0x000020FC, 0x00050084, 0x0000000C, 0x00003A60, 0x00002B2D, 0x00004202,\n    0x00050051, 0x0000000C, 0x00006244, 0x00004E9D, 0x00000000, 0x000500C3,\n    0x0000000C, 0x00004FC8, 0x00006244, 0x00000A1A, 0x00050080, 0x0000000C,\n    0x000049FC, 0x00003A60, 0x00004FC8, 0x000500C4, 0x0000000C, 0x0000225D,\n    0x000049FC, 0x00000A20, 0x000500C7, 0x0000000C, 0x00002CAA, 0x00002BF7,\n    0x00000A14, 0x000500C4, 0x0000000C, 0x00004CAE, 0x00002CAA, 0x00000A1A,\n    0x000500C3, 0x0000000C, 0x0000383E, 0x00006243, 0x00000A0E, 0x000500C7,\n    0x0000000C, 0x00005374, 0x0000383E, 0x00000A14, 0x000500C4, 0x0000000C,\n    0x000054CA, 0x00005374, 0x00000A14, 0x000500C5, 0x0000000C, 0x000042CE,\n    0x00004CAE, 0x000054CA, 0x000500C7, 0x0000000C, 0x000050D5, 0x00006244,\n    0x00000A20, 0x000500C5, 0x0000000C, 0x00003ADD, 0x000042CE, 0x000050D5,\n    0x000500C5, 0x0000000C, 0x000043B7, 0x0000225D, 0x00003ADD, 0x000500C4,\n    0x0000000C, 0x00005E50, 0x000043B7, 0x00000A10, 0x000500C3, 0x0000000C,\n    0x000032D7, 0x00006243, 0x00000A14, 0x000500C6, 0x0000000C, 0x000026C9,\n    0x000032D7, 0x00004DC1, 0x000500C7, 0x0000000C, 0x00004199, 0x000026C9,\n    0x00000A0E, 0x000500C3, 0x0000000C, 0x00002590, 0x00006244, 0x00000A14,\n    0x000500C7, 0x0000000C, 0x0000505F, 0x00002590, 0x00000A14, 0x000500C4,\n    0x0000000C, 0x0000541E, 0x00004199, 0x00000A0E, 0x000500C6, 0x0000000C,\n    0x000022BB, 0x0000505F, 0x0000541E, 0x000500C7, 0x0000000C, 0x00005077,\n    0x00006243, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005229, 0x00005077,\n    0x00000A17, 0x000500C4, 0x0000000C, 0x00001998, 0x000022BB, 0x00000A1D,\n    0x000500C5, 0x0000000C, 0x000047FF, 0x00005229, 0x00001998, 0x000500C4,\n    0x0000000C, 0x00001C01, 0x00004199, 0x00000A2C, 0x000500C5, 0x0000000C,\n    0x00003C82, 0x000047FF, 0x00001C01, 0x000500C7, 0x0000000C, 0x000050B0,\n    0x00005E50, 0x00000A38, 0x000500C5, 0x0000000C, 0x00003C71, 0x00003C82,\n    0x000050B0, 0x000500C3, 0x0000000C, 0x00003746, 0x00005E50, 0x00000A17,\n    0x000500C7, 0x0000000C, 0x000018BA, 0x00003746, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x00005480, 0x000018BA, 0x00000A1A, 0x000500C5, 0x0000000C,\n    0x000045A9, 0x00003C71, 0x00005480, 0x000500C3, 0x0000000C, 0x00003A6F,\n    0x00005E50, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018BB, 0x00003A6F,\n    0x00000A20, 0x000500C4, 0x0000000C, 0x00005481, 0x000018BB, 0x00000A23,\n    0x000500C5, 0x0000000C, 0x00004570, 0x000045A9, 0x00005481, 0x000500C3,\n    0x0000000C, 0x00003C89, 0x00005E50, 0x00000A23, 0x000500C4, 0x0000000C,\n    0x00002825, 0x00003C89, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B7A,\n    0x00004570, 0x00002825, 0x0004007C, 0x0000000B, 0x000041E6, 0x00003B7A,\n    0x000200F9, 0x000052F5, 0x000200F8, 0x000052F5, 0x000700F5, 0x0000000B,\n    0x00002C70, 0x000041E6, 0x0000294E, 0x000041E5, 0x0000537D, 0x00050080,\n    0x0000000B, 0x00005088, 0x00002C70, 0x000062B6, 0x000500C2, 0x0000000B,\n    0x000048F3, 0x00005088, 0x00000A17, 0x000500AA, 0x00000009, 0x00002EEA,\n    0x00004ADC, 0x00000A0D, 0x000500AA, 0x00000009, 0x00005776, 0x00004ADC,\n    0x00000A10, 0x000500A6, 0x00000009, 0x00005686, 0x00002EEA, 0x00005776,\n    0x000300F7, 0x00003463, 0x00000000, 0x000400FA, 0x00005686, 0x00002957,\n    0x00003463, 0x000200F8, 0x00002957, 0x000500C7, 0x00000017, 0x0000475F,\n    0x0000305F, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D1, 0x0000475F,\n    0x0000013D, 0x000500C7, 0x00000017, 0x000050AC, 0x0000305F, 0x0000072E,\n    0x000500C2, 0x00000017, 0x0000448D, 0x000050AC, 0x0000013D, 0x000500C5,\n    0x00000017, 0x00003FF9, 0x000024D1, 0x0000448D, 0x000200F9, 0x00003463,\n    0x000200F8, 0x00003463, 0x000700F5, 0x00000017, 0x0000587A, 0x0000305F,\n    0x000052F5, 0x00003FF9, 0x00002957, 0x000500AA, 0x00000009, 0x00004CB6,\n    0x00004ADC, 0x00000A13, 0x000500A6, 0x00000009, 0x00003B23, 0x00005776,\n    0x00004CB6, 0x000300F7, 0x00002C98, 0x00000000, 0x000400FA, 0x00003B23,\n    0x00002B38, 0x00002C98, 0x000200F8, 0x00002B38, 0x000500C4, 0x00000017,\n    0x00005E17, 0x0000587A, 0x000002ED, 0x000500C2, 0x00000017, 0x00003BE7,\n    0x0000587A, 0x000002ED, 0x000500C5, 0x00000017, 0x000029E8, 0x00005E17,\n    0x00003BE7, 0x000200F9, 0x00002C98, 0x000200F8, 0x00002C98, 0x000700F5,\n    0x00000017, 0x00004D37, 0x0000587A, 0x00003463, 0x000029E8, 0x00002B38,\n    0x00060041, 0x00000294, 0x00001F76, 0x00001592, 0x00000A0B, 0x000048F3,\n    0x0003003E, 0x00001F76, 0x00004D37, 0x000200F9, 0x00004C7A, 0x000200F8,\n    0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/resolve_full_32bpp_scaled_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25245\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 8 8 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_resolve_edram_info\"\n               OpMemberName %push_const_block_xe 1 \"xe_resolve_coordinate_info\"\n               OpMemberName %push_const_block_xe 2 \"xe_resolve_dest_info\"\n               OpMemberName %push_const_block_xe 3 \"xe_resolve_dest_coordinate_info\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %xe_resolve_edram_xe_block \"xe_resolve_edram_xe_block\"\n               OpMemberName %xe_resolve_edram_xe_block 0 \"data\"\n               OpName %xe_resolve_edram \"xe_resolve_edram\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_resolve_dest_xe_block \"xe_resolve_dest_xe_block\"\n               OpMemberName %xe_resolve_dest_xe_block 0 \"data\"\n               OpName %xe_resolve_dest \"xe_resolve_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpDecorate %_runtimearr_uint ArrayStride 4\n               OpDecorate %xe_resolve_edram_xe_block BufferBlock\n               OpMemberDecorate %xe_resolve_edram_xe_block 0 NonWritable\n               OpMemberDecorate %xe_resolve_edram_xe_block 0 Offset 0\n               OpDecorate %xe_resolve_edram NonWritable\n               OpDecorate %xe_resolve_edram Binding 0\n               OpDecorate %xe_resolve_edram DescriptorSet 0\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_resolve_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_resolve_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_resolve_dest_xe_block 0 Offset 0\n               OpDecorate %xe_resolve_dest NonReadable\n               OpDecorate %xe_resolve_dest Binding 0\n               OpDecorate %xe_resolve_dest DescriptorSet 1\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n     %v3uint = OpTypeVector %uint 3\n     %v4uint = OpTypeVector %uint 4\n      %float = OpTypeFloat 32\n    %v2float = OpTypeVector %float 2\n    %v3float = OpTypeVector %float 3\n    %v4float = OpTypeVector %float 4\n       %bool = OpTypeBool\n      %v3int = OpTypeVector %int 3\n    %float_0 = OpConstant %float 0\n    %float_1 = OpConstant %float 1\n     %uint_1 = OpConstant %uint 1\n     %uint_2 = OpConstant %uint 2\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n     %uint_3 = OpConstant %uint 3\n    %uint_16 = OpConstant %uint 16\n  %float_255 = OpConstant %float 255\n  %float_0_5 = OpConstant %float 0.5\n     %uint_0 = OpConstant %uint 0\n      %int_8 = OpConstant %int 8\n     %int_16 = OpConstant %int 16\n     %int_24 = OpConstant %int 24\n %float_1023 = OpConstant %float 1023\n    %float_3 = OpConstant %float 3\n        %344 = OpConstantComposite %v4float %float_1023 %float_1023 %float_1023 %float_3\n     %int_10 = OpConstant %int 10\n     %int_20 = OpConstant %int 20\n     %int_30 = OpConstant %int 30\n %float_2047 = OpConstant %float 2047\n       %2275 = OpConstantComposite %v3float %float_2047 %float_2047 %float_1023\n     %int_11 = OpConstant %int 11\n     %int_22 = OpConstant %int 22\n         %14 = OpConstantComposite %v3float %float_1023 %float_2047 %float_2047\n     %int_21 = OpConstant %int 21\n%float_65535 = OpConstant %float 65535\n    %uint_24 = OpConstant %uint 24\n        %653 = OpConstantComposite %v4uint %uint_0 %uint_8 %uint_16 %uint_24\n   %uint_255 = OpConstant %uint 255\n%float_0_00392156886 = OpConstant %float 0.00392156886\n    %uint_10 = OpConstant %uint 10\n    %uint_20 = OpConstant %uint 20\n    %uint_30 = OpConstant %uint 30\n        %845 = OpConstantComposite %v4uint %uint_0 %uint_10 %uint_20 %uint_30\n  %uint_1023 = OpConstant %uint 1023\n        %635 = OpConstantComposite %v4uint %uint_1023 %uint_1023 %uint_1023 %uint_3\n%float_0_000977517106 = OpConstant %float 0.000977517106\n%float_0_333333343 = OpConstant %float 0.333333343\n       %2798 = OpConstantComposite %v4float %float_0_000977517106 %float_0_000977517106 %float_0_000977517106 %float_0_333333343\n       %2996 = OpConstantComposite %v3uint %uint_0 %uint_10 %uint_20\n   %uint_127 = OpConstant %uint 127\n     %uint_7 = OpConstant %uint 7\n     %v3bool = OpTypeVector %bool 3\n   %uint_124 = OpConstant %uint 124\n    %uint_23 = OpConstant %uint 23\n   %float_n1 = OpConstant %float -1\n      %int_0 = OpConstant %int 0\n       %1959 = OpConstantComposite %v2int %int_16 %int_0\n%float_0_000976592302 = OpConstant %float 0.000976592302\n      %v4int = OpTypeVector %int 4\n        %290 = OpConstantComposite %v4int %int_16 %int_0 %int_16 %int_0\n       %1837 = OpConstantComposite %v2uint %uint_2 %uint_1\n     %v2bool = OpTypeVector %bool 2\n       %1807 = OpConstantComposite %v2uint %uint_0 %uint_0\n       %1828 = OpConstantComposite %v2uint %uint_1 %uint_1\n       %1816 = OpConstantComposite %v2uint %uint_1 %uint_0\n    %uint_80 = OpConstant %uint 80\n       %2719 = OpConstantComposite %v2uint %uint_80 %uint_16\n  %uint_2048 = OpConstant %uint 2048\n      %int_2 = OpConstant %int 2\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n     %int_12 = OpConstant %int 12\n      %int_3 = OpConstant %int 3\n     %uint_5 = OpConstant %uint 5\n     %uint_4 = OpConstant %uint 4\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n    %uint_13 = OpConstant %uint 13\n  %uint_2047 = OpConstant %uint 2047\n    %uint_15 = OpConstant %uint 15\n    %uint_28 = OpConstant %uint 28\n    %uint_19 = OpConstant %uint 19\n       %2179 = OpConstantComposite %v2uint %uint_16 %uint_19\n%uint_536870912 = OpConstant %uint 536870912\n       %1855 = OpConstantComposite %v2uint %uint_0 %uint_4\n       %1856 = OpConstantComposite %v2uint %uint_4 %uint_1\n    %uint_63 = OpConstant %uint 63\n     %int_26 = OpConstant %int 26\n     %int_23 = OpConstant %int 23\n%uint_16777216 = OpConstant %uint 16777216\n       %2276 = OpConstantComposite %v2uint %uint_20 %uint_24\n%_runtimearr_uint = OpTypeRuntimeArray %uint\n%xe_resolve_edram_xe_block = OpTypeStruct %_runtimearr_uint\n%_ptr_Uniform_xe_resolve_edram_xe_block = OpTypePointer Uniform %xe_resolve_edram_xe_block\n%xe_resolve_edram = OpVariable %_ptr_Uniform_xe_resolve_edram_xe_block Uniform\n%_ptr_Uniform_uint = OpTypePointer Uniform %uint\n   %uint_320 = OpConstant %uint 320\n     %uint_6 = OpConstant %uint 6\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %1825 = OpConstantComposite %v2uint %uint_2 %uint_0\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_resolve_dest_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_resolve_dest_xe_block = OpTypePointer Uniform %xe_resolve_dest_xe_block\n%xe_resolve_dest = OpVariable %_ptr_Uniform_xe_resolve_dest_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_8 %uint_8 %uint_1\n       %1954 = OpConstantComposite %v2uint %uint_7 %uint_7\n       %1955 = OpConstantComposite %v2uint %uint_15 %uint_1\n       %1870 = OpConstantComposite %v2uint %uint_3 %uint_3\n       %2122 = OpConstantComposite %v2uint %uint_15 %uint_15\n       %1284 = OpConstantComposite %v4float %float_n1 %float_n1 %float_n1 %float_n1\n        %770 = OpConstantComposite %v4int %int_16 %int_16 %int_16 %int_16\n       %1611 = OpConstantComposite %v4uint %uint_255 %uint_255 %uint_255 %uint_255\n        %261 = OpConstantComposite %v3uint %uint_1023 %uint_1023 %uint_1023\n       %1126 = OpConstantComposite %v3uint %uint_127 %uint_127 %uint_127\n       %2828 = OpConstantComposite %v3uint %uint_7 %uint_7 %uint_7\n       %2578 = OpConstantComposite %v3uint %uint_0 %uint_0 %uint_0\n       %1018 = OpConstantComposite %v3uint %uint_124 %uint_124 %uint_124\n        %393 = OpConstantComposite %v3uint %uint_23 %uint_23 %uint_23\n        %141 = OpConstantComposite %v3uint %uint_16 %uint_16 %uint_16\n         %73 = OpConstantComposite %v2float %float_n1 %float_n1\n       %2151 = OpConstantComposite %v2int %int_16 %int_16\n       %2938 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0\n       %1285 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1\n        %325 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_0_5\n       %2605 = OpConstantComposite %v3float %float_0 %float_0 %float_0\n       %2584 = OpConstantComposite %v3float %float_1 %float_1 %float_1\n        %939 = OpConstantComposite %v3float %float_0_5 %float_0_5 %float_0_5\n       %1823 = OpConstantComposite %v2float %float_0 %float_0\n        %768 = OpConstantComposite %v2float %float_1 %float_1\n       %1566 = OpConstantComposite %v2float %float_0_5 %float_0_5\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n%int_1065353216 = OpConstant %int 1065353216\n%uint_4294967290 = OpConstant %uint 4294967290\n       %2360 = OpConstantComposite %v3uint %uint_4294967290 %uint_4294967290 %uint_4294967290\n %float_0_25 = OpConstant %float 0.25\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %22245 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %15627 = OpLoad %uint %22245\n      %22700 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %20824 = OpLoad %uint %22700\n      %20561 = OpBitwiseAnd %uint %15627 %uint_1023\n      %19978 = OpShiftRightLogical %uint %15627 %uint_10\n       %8574 = OpBitwiseAnd %uint %19978 %uint_3\n      %21002 = OpShiftRightLogical %uint %15627 %uint_13\n       %8575 = OpBitwiseAnd %uint %21002 %uint_2047\n      %21003 = OpShiftRightLogical %uint %15627 %uint_24\n       %8576 = OpBitwiseAnd %uint %21003 %uint_15\n      %18836 = OpShiftRightLogical %uint %15627 %uint_28\n       %9130 = OpBitwiseAnd %uint %18836 %uint_1\n       %8871 = OpCompositeConstruct %v2uint %20824 %20824\n       %9633 = OpShiftRightLogical %v2uint %8871 %2179\n      %23601 = OpBitwiseAnd %v2uint %9633 %1954\n      %24030 = OpBitwiseAnd %uint %15627 %uint_536870912\n      %12295 = OpINotEqual %bool %24030 %uint_0\n               OpSelectionMerge %14676 None\n               OpBranchConditional %12295 %16739 %21992\n      %21992 = OpLabel\n               OpBranch %14676\n      %16739 = OpLabel\n      %15278 = OpShiftRightLogical %v2uint %23601 %1828\n               OpBranch %14676\n      %14676 = OpLabel\n      %19124 = OpPhi %v2uint %15278 %16739 %1807 %21992\n       %7038 = OpShiftRightLogical %v2uint %8871 %1855\n      %11769 = OpBitwiseAnd %v2uint %7038 %1955\n      %16207 = OpShiftLeftLogical %v2uint %11769 %1870\n      %23019 = OpIMul %v2uint %16207 %23601\n      %13123 = OpShiftRightLogical %uint %20824 %uint_5\n      %14785 = OpBitwiseAnd %uint %13123 %uint_2047\n       %8858 = OpCompositeExtract %uint %23601 0\n      %22993 = OpIMul %uint %14785 %8858\n      %20036 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %18628 = OpLoad %uint %20036\n      %22701 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %20919 = OpLoad %uint %22701\n      %19164 = OpBitwiseAnd %uint %18628 %uint_7\n      %21999 = OpBitwiseAnd %uint %18628 %uint_8\n      %20495 = OpINotEqual %bool %21999 %uint_0\n      %10307 = OpShiftRightLogical %uint %18628 %uint_4\n      %24434 = OpBitwiseAnd %uint %10307 %uint_7\n      %19672 = OpShiftRightLogical %uint %18628 %uint_7\n      %20627 = OpBitwiseAnd %uint %19672 %uint_63\n      %22920 = OpBitcast %int %18628\n      %13711 = OpShiftLeftLogical %int %22920 %int_10\n      %20636 = OpShiftRightArithmetic %int %13711 %int_26\n      %18178 = OpShiftLeftLogical %int %20636 %int_23\n       %7462 = OpIAdd %int %18178 %int_1065353216\n      %11052 = OpBitcast %float %7462\n      %22649 = OpBitwiseAnd %uint %18628 %uint_16777216\n       %7475 = OpINotEqual %bool %22649 %uint_0\n       %8444 = OpBitwiseAnd %uint %20919 %uint_1023\n      %12176 = OpShiftRightLogical %uint %20919 %uint_10\n      %25038 = OpBitwiseAnd %uint %12176 %uint_1023\n      %25203 = OpShiftLeftLogical %uint %25038 %int_1\n      %10422 = OpCompositeConstruct %v2uint %20919 %20919\n      %10385 = OpShiftRightLogical %v2uint %10422 %2276\n      %23379 = OpBitwiseAnd %v2uint %10385 %2122\n      %16208 = OpShiftLeftLogical %v2uint %23379 %1870\n      %23020 = OpIMul %v2uint %16208 %23601\n      %12743 = OpShiftRightLogical %uint %20919 %uint_28\n      %17238 = OpBitwiseAnd %uint %12743 %uint_7\n      %12737 = OpLoad %v3uint %gl_GlobalInvocationID\n      %14500 = OpVectorShuffle %v2uint %12737 %12737 0 1\n      %12025 = OpShiftLeftLogical %v2uint %14500 %1825\n       %7640 = OpCompositeExtract %uint %12025 0\n      %11658 = OpShiftLeftLogical %uint %22993 %uint_3\n      %15379 = OpUGreaterThanEqual %bool %7640 %11658\n               OpSelectionMerge %14025 DontFlatten\n               OpBranchConditional %15379 %21993 %14025\n      %21993 = OpLabel\n               OpBranch %19578\n      %14025 = OpLabel\n      %18615 = OpCompositeExtract %uint %12025 1\n      %16803 = OpCompositeExtract %uint %19124 1\n      %24446 = OpExtInst %uint %1 UMax %18615 %16803\n      %20975 = OpCompositeConstruct %v2uint %7640 %24446\n      %21036 = OpIAdd %v2uint %20975 %23019\n      %16075 = OpULessThanEqual %bool %17238 %uint_3\n               OpSelectionMerge %23776 None\n               OpBranchConditional %16075 %10990 %15087\n      %15087 = OpLabel\n      %13566 = OpIEqual %bool %17238 %uint_5\n       %8438 = OpSelect %uint %13566 %uint_2 %uint_0\n               OpBranch %23776\n      %10990 = OpLabel\n               OpBranch %23776\n      %23776 = OpLabel\n      %19300 = OpPhi %uint %17238 %10990 %8438 %15087\n      %16830 = OpCompositeConstruct %v2uint %8574 %8574\n      %11801 = OpUGreaterThanEqual %v2bool %16830 %1837\n      %19381 = OpSelect %v2uint %11801 %1828 %1807\n      %10986 = OpShiftLeftLogical %v2uint %21036 %19381\n      %24669 = OpCompositeConstruct %v2uint %19300 %19300\n       %9093 = OpShiftRightLogical %v2uint %24669 %1816\n      %16072 = OpBitwiseAnd %v2uint %9093 %1828\n      %18106 = OpIAdd %v2uint %10986 %16072\n      %22936 = OpIMul %v2uint %2719 %23601\n      %11332 = OpCompositeConstruct %v2uint %9130 %uint_0\n       %6571 = OpShiftRightLogical %v2uint %22936 %11332\n      %10146 = OpUDiv %v2uint %18106 %6571\n      %20390 = OpCompositeExtract %uint %10146 1\n      %11046 = OpIMul %uint %20390 %20561\n      %24665 = OpCompositeExtract %uint %10146 0\n      %21536 = OpIAdd %uint %11046 %24665\n       %8742 = OpIAdd %uint %8575 %21536\n      %22376 = OpIMul %v2uint %10146 %6571\n      %20715 = OpISub %v2uint %18106 %22376\n       %7303 = OpCompositeExtract %uint %22936 0\n      %22882 = OpCompositeExtract %uint %22936 1\n      %13170 = OpIMul %uint %7303 %22882\n      %14551 = OpIMul %uint %8742 %13170\n       %6805 = OpCompositeExtract %uint %20715 1\n      %23526 = OpCompositeExtract %uint %6571 0\n      %22886 = OpIMul %uint %6805 %23526\n       %6886 = OpCompositeExtract %uint %20715 0\n       %9696 = OpIAdd %uint %22886 %6886\n      %18021 = OpShiftLeftLogical %uint %9696 %9130\n      %18363 = OpIAdd %uint %14551 %18021\n      %13922 = OpIMul %uint %13170 %uint_2048\n      %21520 = OpUMod %uint %18363 %13922\n       %7686 = OpShiftLeftLogical %uint %21520 %int_2\n      %13906 = OpUGreaterThanEqual %bool %8574 %uint_2\n      %11277 = OpSelect %uint %13906 %uint_1 %uint_0\n      %20074 = OpIAdd %uint %9130 %11277\n       %6555 = OpShiftLeftLogical %uint %uint_4 %20074\n      %23279 = OpINotEqual %bool %9130 %uint_0\n               OpSelectionMerge %21263 DontFlatten\n               OpBranchConditional %23279 %15205 %16569\n      %16569 = OpLabel\n      %19162 = OpIEqual %bool %6555 %uint_4\n               OpSelectionMerge %20297 DontFlatten\n               OpBranchConditional %19162 %6591 %8959\n       %8959 = OpLabel\n      %22064 = OpShiftRightLogical %uint %7686 %int_2\n      %13369 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22064\n      %15060 = OpLoad %uint %13369\n       %8517 = OpIAdd %uint %7686 %6555\n      %21670 = OpShiftRightLogical %uint %8517 %int_2\n      %19677 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21670\n      %13114 = OpLoad %uint %19677\n       %8685 = OpIMul %uint %uint_2 %6555\n      %24254 = OpIAdd %uint %7686 %8685\n      %17890 = OpShiftRightLogical %uint %24254 %int_2\n      %19678 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17890\n      %13115 = OpLoad %uint %19678\n       %8686 = OpIMul %uint %uint_3 %6555\n      %24255 = OpIAdd %uint %7686 %8686\n      %17891 = OpShiftRightLogical %uint %24255 %int_2\n      %18689 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17891\n      %24409 = OpLoad %uint %18689\n      %20780 = OpCompositeConstruct %v4uint %15060 %13114 %13115 %24409\n               OpBranch %20297\n       %6591 = OpLabel\n      %24486 = OpShiftRightLogical %uint %7686 %int_2\n      %13370 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24486\n      %12609 = OpLoad %uint %13370\n      %11687 = OpIAdd %uint %24486 %uint_1\n       %6399 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11687\n      %23650 = OpLoad %uint %6399\n      %11688 = OpIAdd %uint %24486 %uint_2\n       %6400 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11688\n      %23651 = OpLoad %uint %6400\n      %11689 = OpIAdd %uint %24486 %uint_3\n      %24558 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11689\n      %16379 = OpLoad %uint %24558\n      %20781 = OpCompositeConstruct %v4uint %12609 %23650 %23651 %16379\n               OpBranch %20297\n      %20297 = OpLabel\n      %10943 = OpPhi %v4uint %20781 %6591 %20780 %8959\n               OpSelectionMerge %16224 None\n               OpSwitch %8576 %19451 0 %14585 1 %14585 2 %7355 10 %7355 3 %7354 12 %7354 4 %8190 6 %8243\n       %8243 = OpLabel\n      %24406 = OpCompositeExtract %uint %10943 0\n      %24679 = OpExtInst %v2float %1 UnpackHalf2x16 %24406\n      %10082 = OpCompositeExtract %float %24679 0\n      %17478 = OpCompositeExtract %float %24679 1\n      %14604 = OpCompositeConstruct %v4float %10082 %17478 %float_0 %float_0\n      %17274 = OpCompositeExtract %uint %10943 1\n      %18027 = OpExtInst %v2float %1 UnpackHalf2x16 %17274\n      %10083 = OpCompositeExtract %float %18027 0\n      %17479 = OpCompositeExtract %float %18027 1\n      %14605 = OpCompositeConstruct %v4float %10083 %17479 %float_0 %float_0\n      %17275 = OpCompositeExtract %uint %10943 2\n      %18028 = OpExtInst %v2float %1 UnpackHalf2x16 %17275\n      %10084 = OpCompositeExtract %float %18028 0\n      %17480 = OpCompositeExtract %float %18028 1\n      %14606 = OpCompositeConstruct %v4float %10084 %17480 %float_0 %float_0\n      %17276 = OpCompositeExtract %uint %10943 3\n      %18029 = OpExtInst %v2float %1 UnpackHalf2x16 %17276\n      %10085 = OpCompositeExtract %float %18029 0\n      %20670 = OpCompositeExtract %float %18029 1\n       %9033 = OpCompositeConstruct %v4float %10085 %20670 %float_0 %float_0\n               OpBranch %16224\n       %8190 = OpLabel\n      %12427 = OpCompositeExtract %uint %10943 0\n      %22685 = OpBitcast %int %12427\n      %18202 = OpCompositeConstruct %v2int %22685 %22685\n      %18349 = OpShiftLeftLogical %v2int %18202 %1959\n      %13335 = OpShiftRightArithmetic %v2int %18349 %2151\n      %10903 = OpConvertSToF %v2float %13335\n      %18247 = OpVectorTimesScalar %v2float %10903 %float_0_000976592302\n      %24070 = OpExtInst %v2float %1 FMax %73 %18247\n      %24330 = OpCompositeExtract %float %24070 0\n      %15572 = OpCompositeExtract %float %24070 1\n      %16670 = OpCompositeConstruct %v4float %24330 %15572 %float_0 %float_0\n      %19522 = OpCompositeExtract %uint %10943 1\n      %16033 = OpBitcast %int %19522\n      %18203 = OpCompositeConstruct %v2int %16033 %16033\n      %18350 = OpShiftLeftLogical %v2int %18203 %1959\n      %13336 = OpShiftRightArithmetic %v2int %18350 %2151\n      %10904 = OpConvertSToF %v2float %13336\n      %18248 = OpVectorTimesScalar %v2float %10904 %float_0_000976592302\n      %24071 = OpExtInst %v2float %1 FMax %73 %18248\n      %24331 = OpCompositeExtract %float %24071 0\n      %15573 = OpCompositeExtract %float %24071 1\n      %16671 = OpCompositeConstruct %v4float %24331 %15573 %float_0 %float_0\n      %19523 = OpCompositeExtract %uint %10943 2\n      %16034 = OpBitcast %int %19523\n      %18204 = OpCompositeConstruct %v2int %16034 %16034\n      %18351 = OpShiftLeftLogical %v2int %18204 %1959\n      %13337 = OpShiftRightArithmetic %v2int %18351 %2151\n      %10905 = OpConvertSToF %v2float %13337\n      %18249 = OpVectorTimesScalar %v2float %10905 %float_0_000976592302\n      %24072 = OpExtInst %v2float %1 FMax %73 %18249\n      %24332 = OpCompositeExtract %float %24072 0\n      %15574 = OpCompositeExtract %float %24072 1\n      %16672 = OpCompositeConstruct %v4float %24332 %15574 %float_0 %float_0\n      %19524 = OpCompositeExtract %uint %10943 3\n      %16035 = OpBitcast %int %19524\n      %18205 = OpCompositeConstruct %v2int %16035 %16035\n      %18352 = OpShiftLeftLogical %v2int %18205 %1959\n      %13338 = OpShiftRightArithmetic %v2int %18352 %2151\n      %10906 = OpConvertSToF %v2float %13338\n      %18250 = OpVectorTimesScalar %v2float %10906 %float_0_000976592302\n      %24073 = OpExtInst %v2float %1 FMax %73 %18250\n      %24333 = OpCompositeExtract %float %24073 0\n      %18764 = OpCompositeExtract %float %24073 1\n       %9034 = OpCompositeConstruct %v4float %24333 %18764 %float_0 %float_0\n               OpBranch %16224\n       %7354 = OpLabel\n      %22205 = OpCompositeExtract %uint %10943 0\n      %20234 = OpCompositeConstruct %v3uint %22205 %22205 %22205\n      %11021 = OpShiftRightLogical %v3uint %20234 %2996\n      %24038 = OpBitwiseAnd %v3uint %11021 %261\n      %18588 = OpBitwiseAnd %v3uint %11021 %1126\n      %23440 = OpShiftRightLogical %v3uint %24038 %2828\n      %16585 = OpIEqual %v3bool %23440 %2578\n      %11339 = OpExtInst %v3int %1 FindUMsb %18588\n      %10773 = OpBitcast %v3uint %11339\n       %6266 = OpISub %v3uint %2828 %10773\n       %8720 = OpIAdd %v3uint %10773 %2360\n      %10351 = OpSelect %v3uint %16585 %8720 %23440\n      %23252 = OpShiftLeftLogical %v3uint %18588 %6266\n      %18842 = OpBitwiseAnd %v3uint %23252 %1126\n      %10909 = OpSelect %v3uint %16585 %18842 %18588\n      %24569 = OpIAdd %v3uint %10351 %1018\n      %20351 = OpShiftLeftLogical %v3uint %24569 %393\n      %16294 = OpShiftLeftLogical %v3uint %10909 %141\n      %22396 = OpBitwiseOr %v3uint %20351 %16294\n      %13824 = OpIEqual %v3bool %24038 %2578\n      %16962 = OpSelect %v3uint %13824 %2578 %22396\n      %10703 = OpBitcast %v3float %16962\n      %19364 = OpShiftRightLogical %uint %22205 %uint_30\n      %18446 = OpConvertUToF %float %19364\n      %15903 = OpFMul %float %18446 %float_0_333333343\n      %21442 = OpCompositeExtract %float %10703 0\n      %10837 = OpCompositeExtract %float %10703 1\n       %7833 = OpCompositeExtract %float %10703 2\n      %15834 = OpCompositeConstruct %v4float %21442 %10837 %7833 %15903\n      %10229 = OpCompositeExtract %uint %10943 1\n      %13582 = OpCompositeConstruct %v3uint %10229 %10229 %10229\n      %11022 = OpShiftRightLogical %v3uint %13582 %2996\n      %24039 = OpBitwiseAnd %v3uint %11022 %261\n      %18589 = OpBitwiseAnd %v3uint %11022 %1126\n      %23441 = OpShiftRightLogical %v3uint %24039 %2828\n      %16586 = OpIEqual %v3bool %23441 %2578\n      %11340 = OpExtInst %v3int %1 FindUMsb %18589\n      %10774 = OpBitcast %v3uint %11340\n       %6267 = OpISub %v3uint %2828 %10774\n       %8721 = OpIAdd %v3uint %10774 %2360\n      %10352 = OpSelect %v3uint %16586 %8721 %23441\n      %23253 = OpShiftLeftLogical %v3uint %18589 %6267\n      %18843 = OpBitwiseAnd %v3uint %23253 %1126\n      %10910 = OpSelect %v3uint %16586 %18843 %18589\n      %24570 = OpIAdd %v3uint %10352 %1018\n      %20352 = OpShiftLeftLogical %v3uint %24570 %393\n      %16295 = OpShiftLeftLogical %v3uint %10910 %141\n      %22397 = OpBitwiseOr %v3uint %20352 %16295\n      %13825 = OpIEqual %v3bool %24039 %2578\n      %16963 = OpSelect %v3uint %13825 %2578 %22397\n      %10704 = OpBitcast %v3float %16963\n      %19365 = OpShiftRightLogical %uint %10229 %uint_30\n      %18447 = OpConvertUToF %float %19365\n      %15904 = OpFMul %float %18447 %float_0_333333343\n      %21443 = OpCompositeExtract %float %10704 0\n      %10838 = OpCompositeExtract %float %10704 1\n       %7834 = OpCompositeExtract %float %10704 2\n      %15835 = OpCompositeConstruct %v4float %21443 %10838 %7834 %15904\n      %10230 = OpCompositeExtract %uint %10943 2\n      %13583 = OpCompositeConstruct %v3uint %10230 %10230 %10230\n      %11023 = OpShiftRightLogical %v3uint %13583 %2996\n      %24040 = OpBitwiseAnd %v3uint %11023 %261\n      %18590 = OpBitwiseAnd %v3uint %11023 %1126\n      %23442 = OpShiftRightLogical %v3uint %24040 %2828\n      %16587 = OpIEqual %v3bool %23442 %2578\n      %11341 = OpExtInst %v3int %1 FindUMsb %18590\n      %10775 = OpBitcast %v3uint %11341\n       %6268 = OpISub %v3uint %2828 %10775\n       %8722 = OpIAdd %v3uint %10775 %2360\n      %10353 = OpSelect %v3uint %16587 %8722 %23442\n      %23254 = OpShiftLeftLogical %v3uint %18590 %6268\n      %18844 = OpBitwiseAnd %v3uint %23254 %1126\n      %10911 = OpSelect %v3uint %16587 %18844 %18590\n      %24571 = OpIAdd %v3uint %10353 %1018\n      %20353 = OpShiftLeftLogical %v3uint %24571 %393\n      %16296 = OpShiftLeftLogical %v3uint %10911 %141\n      %22398 = OpBitwiseOr %v3uint %20353 %16296\n      %13826 = OpIEqual %v3bool %24040 %2578\n      %16964 = OpSelect %v3uint %13826 %2578 %22398\n      %10705 = OpBitcast %v3float %16964\n      %19366 = OpShiftRightLogical %uint %10230 %uint_30\n      %18448 = OpConvertUToF %float %19366\n      %15905 = OpFMul %float %18448 %float_0_333333343\n      %21444 = OpCompositeExtract %float %10705 0\n      %10839 = OpCompositeExtract %float %10705 1\n       %7835 = OpCompositeExtract %float %10705 2\n      %15836 = OpCompositeConstruct %v4float %21444 %10839 %7835 %15905\n      %10231 = OpCompositeExtract %uint %10943 3\n      %13584 = OpCompositeConstruct %v3uint %10231 %10231 %10231\n      %11024 = OpShiftRightLogical %v3uint %13584 %2996\n      %24041 = OpBitwiseAnd %v3uint %11024 %261\n      %18591 = OpBitwiseAnd %v3uint %11024 %1126\n      %23443 = OpShiftRightLogical %v3uint %24041 %2828\n      %16588 = OpIEqual %v3bool %23443 %2578\n      %11342 = OpExtInst %v3int %1 FindUMsb %18591\n      %10776 = OpBitcast %v3uint %11342\n       %6269 = OpISub %v3uint %2828 %10776\n       %8723 = OpIAdd %v3uint %10776 %2360\n      %10354 = OpSelect %v3uint %16588 %8723 %23443\n      %23255 = OpShiftLeftLogical %v3uint %18591 %6269\n      %18845 = OpBitwiseAnd %v3uint %23255 %1126\n      %10912 = OpSelect %v3uint %16588 %18845 %18591\n      %24572 = OpIAdd %v3uint %10354 %1018\n      %20354 = OpShiftLeftLogical %v3uint %24572 %393\n      %16297 = OpShiftLeftLogical %v3uint %10912 %141\n      %22399 = OpBitwiseOr %v3uint %20354 %16297\n      %13827 = OpIEqual %v3bool %24041 %2578\n      %16965 = OpSelect %v3uint %13827 %2578 %22399\n      %10706 = OpBitcast %v3float %16965\n      %19367 = OpShiftRightLogical %uint %10231 %uint_30\n      %18449 = OpConvertUToF %float %19367\n      %15906 = OpFMul %float %18449 %float_0_333333343\n      %21445 = OpCompositeExtract %float %10706 0\n      %10840 = OpCompositeExtract %float %10706 1\n      %11025 = OpCompositeExtract %float %10706 2\n       %9035 = OpCompositeConstruct %v4float %21445 %10840 %11025 %15906\n               OpBranch %16224\n       %7355 = OpLabel\n      %22206 = OpCompositeExtract %uint %10943 0\n      %20235 = OpCompositeConstruct %v4uint %22206 %22206 %22206 %22206\n       %9368 = OpShiftRightLogical %v4uint %20235 %845\n      %18859 = OpBitwiseAnd %v4uint %9368 %635\n      %15543 = OpConvertUToF %v4float %18859\n      %16688 = OpFMul %v4float %15543 %2798\n      %23762 = OpCompositeExtract %uint %10943 1\n      %20813 = OpCompositeConstruct %v4uint %23762 %23762 %23762 %23762\n       %9369 = OpShiftRightLogical %v4uint %20813 %845\n      %18860 = OpBitwiseAnd %v4uint %9369 %635\n      %15544 = OpConvertUToF %v4float %18860\n      %16689 = OpFMul %v4float %15544 %2798\n      %23763 = OpCompositeExtract %uint %10943 2\n      %20814 = OpCompositeConstruct %v4uint %23763 %23763 %23763 %23763\n       %9370 = OpShiftRightLogical %v4uint %20814 %845\n      %18861 = OpBitwiseAnd %v4uint %9370 %635\n      %15545 = OpConvertUToF %v4float %18861\n      %16690 = OpFMul %v4float %15545 %2798\n      %23764 = OpCompositeExtract %uint %10943 3\n      %20815 = OpCompositeConstruct %v4uint %23764 %23764 %23764 %23764\n       %9371 = OpShiftRightLogical %v4uint %20815 %845\n      %18862 = OpBitwiseAnd %v4uint %9371 %635\n      %18735 = OpConvertUToF %v4float %18862\n       %9887 = OpFMul %v4float %18735 %2798\n               OpBranch %16224\n      %14585 = OpLabel\n      %22207 = OpCompositeExtract %uint %10943 0\n      %20236 = OpCompositeConstruct %v4uint %22207 %22207 %22207 %22207\n       %9372 = OpShiftRightLogical %v4uint %20236 %653\n      %19030 = OpBitwiseAnd %v4uint %9372 %1611\n      %13986 = OpConvertUToF %v4float %19030\n      %19235 = OpVectorTimesScalar %v4float %13986 %float_0_00392156886\n       %8607 = OpCompositeExtract %uint %10943 1\n      %24843 = OpCompositeConstruct %v4uint %8607 %8607 %8607 %8607\n       %9373 = OpShiftRightLogical %v4uint %24843 %653\n      %19031 = OpBitwiseAnd %v4uint %9373 %1611\n      %13987 = OpConvertUToF %v4float %19031\n      %19236 = OpVectorTimesScalar %v4float %13987 %float_0_00392156886\n       %8608 = OpCompositeExtract %uint %10943 2\n      %24844 = OpCompositeConstruct %v4uint %8608 %8608 %8608 %8608\n       %9374 = OpShiftRightLogical %v4uint %24844 %653\n      %19032 = OpBitwiseAnd %v4uint %9374 %1611\n      %13988 = OpConvertUToF %v4float %19032\n      %19237 = OpVectorTimesScalar %v4float %13988 %float_0_00392156886\n       %8609 = OpCompositeExtract %uint %10943 3\n      %24845 = OpCompositeConstruct %v4uint %8609 %8609 %8609 %8609\n       %9375 = OpShiftRightLogical %v4uint %24845 %653\n      %19033 = OpBitwiseAnd %v4uint %9375 %1611\n      %17178 = OpConvertUToF %v4float %19033\n      %12434 = OpVectorTimesScalar %v4float %17178 %float_0_00392156886\n               OpBranch %16224\n      %19451 = OpLabel\n      %12428 = OpCompositeExtract %uint %10943 0\n      %20462 = OpBitcast %float %12428\n      %17206 = OpCompositeConstruct %v2float %20462 %float_0\n      %11664 = OpVectorShuffle %v4float %17206 %17206 0 1 1 1\n      %22193 = OpCompositeExtract %uint %10943 1\n      %16232 = OpBitcast %float %22193\n      %17207 = OpCompositeConstruct %v2float %16232 %float_0\n      %11665 = OpVectorShuffle %v4float %17207 %17207 0 1 1 1\n      %22194 = OpCompositeExtract %uint %10943 2\n      %16233 = OpBitcast %float %22194\n      %17208 = OpCompositeConstruct %v2float %16233 %float_0\n      %11666 = OpVectorShuffle %v4float %17208 %17208 0 1 1 1\n      %22195 = OpCompositeExtract %uint %10943 3\n      %16234 = OpBitcast %float %22195\n      %20398 = OpCompositeConstruct %v2float %16234 %float_0\n      %23098 = OpVectorShuffle %v4float %20398 %20398 0 1 1 1\n               OpBranch %16224\n      %16224 = OpLabel\n      %11175 = OpPhi %v4float %23098 %19451 %12434 %14585 %9887 %7355 %9035 %7354 %9034 %8190 %9033 %8243\n      %14344 = OpPhi %v4float %11666 %19451 %19237 %14585 %16690 %7355 %15836 %7354 %16672 %8190 %14606 %8243\n      %15229 = OpPhi %v4float %11665 %19451 %19236 %14585 %16689 %7355 %15835 %7354 %16671 %8190 %14605 %8243\n      %14518 = OpPhi %v4float %11664 %19451 %19235 %14585 %16688 %7355 %15834 %7354 %16670 %8190 %14604 %8243\n               OpBranch %21263\n      %15205 = OpLabel\n      %21584 = OpIEqual %bool %6555 %uint_8\n               OpSelectionMerge %20259 DontFlatten\n               OpBranchConditional %21584 %6592 %8960\n       %8960 = OpLabel\n      %22065 = OpShiftRightLogical %uint %7686 %int_2\n      %13371 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22065\n      %12610 = OpLoad %uint %13371\n      %11690 = OpIAdd %uint %22065 %uint_1\n       %6401 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11690\n       %7030 = OpLoad %uint %6401\n       %8518 = OpIAdd %uint %7686 %6555\n      %21671 = OpShiftRightLogical %uint %8518 %int_2\n      %19601 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21671\n      %12611 = OpLoad %uint %19601\n      %11691 = OpIAdd %uint %21671 %uint_1\n      %24559 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11691\n      %14156 = OpLoad %uint %24559\n      %19670 = OpCompositeConstruct %v4uint %12610 %7030 %12611 %14156\n      %19499 = OpIMul %uint %uint_2 %6555\n      %10821 = OpIAdd %uint %7686 %19499\n      %17892 = OpShiftRightLogical %uint %10821 %int_2\n      %19602 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17892\n      %12612 = OpLoad %uint %19602\n      %11692 = OpIAdd %uint %17892 %uint_1\n       %6475 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11692\n      %24155 = OpLoad %uint %6475\n       %8687 = OpIMul %uint %uint_3 %6555\n      %24256 = OpIAdd %uint %7686 %8687\n      %17893 = OpShiftRightLogical %uint %24256 %int_2\n      %19603 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17893\n      %12613 = OpLoad %uint %19603\n      %11693 = OpIAdd %uint %17893 %uint_1\n      %24560 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11693\n      %16380 = OpLoad %uint %24560\n      %20782 = OpCompositeConstruct %v4uint %12612 %24155 %12613 %16380\n               OpBranch %20259\n       %6592 = OpLabel\n      %24487 = OpShiftRightLogical %uint %7686 %int_2\n      %13372 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24487\n      %12614 = OpLoad %uint %13372\n      %11694 = OpIAdd %uint %24487 %uint_1\n       %6402 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11694\n      %23652 = OpLoad %uint %6402\n      %11695 = OpIAdd %uint %24487 %uint_2\n       %6403 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11695\n      %23653 = OpLoad %uint %6403\n      %11696 = OpIAdd %uint %24487 %uint_3\n      %24561 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11696\n      %14080 = OpLoad %uint %24561\n      %21616 = OpCompositeConstruct %v4uint %12614 %23652 %23653 %14080\n      %19331 = OpIAdd %uint %7686 %uint_16\n       %8237 = OpShiftRightLogical %uint %19331 %int_2\n      %19604 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %8237\n      %12615 = OpLoad %uint %19604\n      %11697 = OpIAdd %uint %8237 %uint_1\n       %6404 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11697\n      %23654 = OpLoad %uint %6404\n      %11698 = OpIAdd %uint %8237 %uint_2\n       %6405 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11698\n      %23655 = OpLoad %uint %6405\n      %11699 = OpIAdd %uint %8237 %uint_3\n      %24562 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11699\n      %16381 = OpLoad %uint %24562\n      %20783 = OpCompositeConstruct %v4uint %12615 %23654 %23655 %16381\n               OpBranch %20259\n      %20259 = OpLabel\n      %11213 = OpPhi %v4uint %20783 %6592 %20782 %8960\n      %14112 = OpPhi %v4uint %21616 %6592 %19670 %8960\n               OpSelectionMerge %20260 None\n               OpSwitch %8576 %20310 5 %8536 7 %8244\n       %8244 = OpLabel\n      %24407 = OpCompositeExtract %uint %14112 0\n      %24680 = OpExtInst %v2float %1 UnpackHalf2x16 %24407\n      %10101 = OpCompositeExtract %float %24680 0\n      %16056 = OpCompositeExtract %float %24680 1\n      %17025 = OpCompositeExtract %uint %14112 1\n      %15605 = OpExtInst %v2float %1 UnpackHalf2x16 %17025\n      %10086 = OpCompositeExtract %float %15605 0\n      %17481 = OpCompositeExtract %float %15605 1\n      %14607 = OpCompositeConstruct %v4float %10101 %16056 %10086 %17481\n      %17277 = OpCompositeExtract %uint %14112 2\n      %18030 = OpExtInst %v2float %1 UnpackHalf2x16 %17277\n      %10102 = OpCompositeExtract %float %18030 0\n      %16057 = OpCompositeExtract %float %18030 1\n      %17026 = OpCompositeExtract %uint %14112 3\n      %15606 = OpExtInst %v2float %1 UnpackHalf2x16 %17026\n      %10087 = OpCompositeExtract %float %15606 0\n      %17482 = OpCompositeExtract %float %15606 1\n      %14608 = OpCompositeConstruct %v4float %10102 %16057 %10087 %17482\n      %17278 = OpCompositeExtract %uint %11213 0\n      %18031 = OpExtInst %v2float %1 UnpackHalf2x16 %17278\n      %10103 = OpCompositeExtract %float %18031 0\n      %16058 = OpCompositeExtract %float %18031 1\n      %17027 = OpCompositeExtract %uint %11213 1\n      %15607 = OpExtInst %v2float %1 UnpackHalf2x16 %17027\n      %10088 = OpCompositeExtract %float %15607 0\n      %17483 = OpCompositeExtract %float %15607 1\n      %14609 = OpCompositeConstruct %v4float %10103 %16058 %10088 %17483\n      %17279 = OpCompositeExtract %uint %11213 2\n      %18032 = OpExtInst %v2float %1 UnpackHalf2x16 %17279\n      %10104 = OpCompositeExtract %float %18032 0\n      %16059 = OpCompositeExtract %float %18032 1\n      %17028 = OpCompositeExtract %uint %11213 3\n      %15608 = OpExtInst %v2float %1 UnpackHalf2x16 %17028\n      %10089 = OpCompositeExtract %float %15608 0\n      %20671 = OpCompositeExtract %float %15608 1\n       %9036 = OpCompositeConstruct %v4float %10104 %16059 %10089 %20671\n               OpBranch %20260\n       %8536 = OpLabel\n       %9723 = OpVectorShuffle %v2uint %14112 %14112 0 1\n      %23356 = OpBitcast %v2int %9723\n      %24782 = OpVectorShuffle %v4int %23356 %23356 0 0 1 1\n      %18598 = OpShiftLeftLogical %v4int %24782 %290\n      %15757 = OpShiftRightArithmetic %v4int %18598 %770\n      %10907 = OpConvertSToF %v4float %15757\n      %18209 = OpVectorTimesScalar %v4float %10907 %float_0_000976592302\n      %25233 = OpExtInst %v4float %1 FMax %1284 %18209\n      %14187 = OpVectorShuffle %v2uint %14112 %14112 2 3\n       %9407 = OpBitcast %v2int %14187\n      %24783 = OpVectorShuffle %v4int %9407 %9407 0 0 1 1\n      %18599 = OpShiftLeftLogical %v4int %24783 %290\n      %15758 = OpShiftRightArithmetic %v4int %18599 %770\n      %10908 = OpConvertSToF %v4float %15758\n      %18210 = OpVectorTimesScalar %v4float %10908 %float_0_000976592302\n      %25234 = OpExtInst %v4float %1 FMax %1284 %18210\n      %14188 = OpVectorShuffle %v2uint %11213 %11213 0 1\n       %9408 = OpBitcast %v2int %14188\n      %24784 = OpVectorShuffle %v4int %9408 %9408 0 0 1 1\n      %18600 = OpShiftLeftLogical %v4int %24784 %290\n      %15759 = OpShiftRightArithmetic %v4int %18600 %770\n      %10913 = OpConvertSToF %v4float %15759\n      %18211 = OpVectorTimesScalar %v4float %10913 %float_0_000976592302\n      %25235 = OpExtInst %v4float %1 FMax %1284 %18211\n      %14189 = OpVectorShuffle %v2uint %11213 %11213 2 3\n       %9409 = OpBitcast %v2int %14189\n      %24785 = OpVectorShuffle %v4int %9409 %9409 0 0 1 1\n      %18601 = OpShiftLeftLogical %v4int %24785 %290\n      %15760 = OpShiftRightArithmetic %v4int %18601 %770\n      %10914 = OpConvertSToF %v4float %15760\n      %21439 = OpVectorTimesScalar %v4float %10914 %float_0_000976592302\n      %17250 = OpExtInst %v4float %1 FMax %1284 %21439\n               OpBranch %20260\n      %20310 = OpLabel\n       %9761 = OpVectorShuffle %v2uint %14112 %14112 0 1\n      %20825 = OpBitcast %v2float %9761\n       %7035 = OpCompositeExtract %float %20825 0\n      %13418 = OpCompositeExtract %float %20825 1\n      %17016 = OpCompositeConstruct %v4float %7035 %13418 %float_0 %float_0\n      %16856 = OpVectorShuffle %v2uint %14112 %14112 2 3\n      %14173 = OpBitcast %v2float %16856\n       %7036 = OpCompositeExtract %float %14173 0\n      %13419 = OpCompositeExtract %float %14173 1\n      %17017 = OpCompositeConstruct %v4float %7036 %13419 %float_0 %float_0\n      %16857 = OpVectorShuffle %v2uint %11213 %11213 0 1\n      %14174 = OpBitcast %v2float %16857\n       %7037 = OpCompositeExtract %float %14174 0\n      %13420 = OpCompositeExtract %float %14174 1\n      %17018 = OpCompositeConstruct %v4float %7037 %13420 %float_0 %float_0\n      %16858 = OpVectorShuffle %v2uint %11213 %11213 2 3\n      %14175 = OpBitcast %v2float %16858\n       %7039 = OpCompositeExtract %float %14175 0\n      %16648 = OpCompositeExtract %float %14175 1\n       %9037 = OpCompositeConstruct %v4float %7039 %16648 %float_0 %float_0\n               OpBranch %20260\n      %20260 = OpLabel\n      %11176 = OpPhi %v4float %9037 %20310 %17250 %8536 %9036 %8244\n      %14345 = OpPhi %v4float %17018 %20310 %25235 %8536 %14609 %8244\n      %15230 = OpPhi %v4float %17017 %20310 %25234 %8536 %14608 %8244\n      %14519 = OpPhi %v4float %17016 %20310 %25233 %8536 %14607 %8244\n               OpBranch %21263\n      %21263 = OpLabel\n      %11177 = OpPhi %v4float %11176 %20260 %11175 %16224\n      %14346 = OpPhi %v4float %14345 %20260 %14344 %16224\n      %13804 = OpPhi %v4float %15230 %20260 %15229 %16224\n       %8403 = OpPhi %v4float %14519 %20260 %14518 %16224\n      %11861 = OpUGreaterThanEqual %bool %17238 %uint_4\n               OpSelectionMerge %21267 DontFlatten\n               OpBranchConditional %11861 %20977 %21267\n      %20977 = OpLabel\n      %11079 = OpIMul %uint %uint_320 %8858\n      %23069 = OpFMul %float %11052 %float_0_5\n       %8114 = OpIAdd %uint %7686 %11079\n               OpSelectionMerge %21264 DontFlatten\n               OpBranchConditional %23279 %15206 %16570\n      %16570 = OpLabel\n      %19163 = OpIEqual %bool %6555 %uint_4\n               OpSelectionMerge %20298 DontFlatten\n               OpBranchConditional %19163 %6593 %8961\n       %8961 = OpLabel\n      %22066 = OpShiftRightLogical %uint %8114 %int_2\n      %13373 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22066\n      %15061 = OpLoad %uint %13373\n       %8519 = OpIAdd %uint %8114 %6555\n      %21672 = OpShiftRightLogical %uint %8519 %int_2\n      %19679 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21672\n      %13116 = OpLoad %uint %19679\n       %8688 = OpIMul %uint %uint_2 %6555\n      %24257 = OpIAdd %uint %8114 %8688\n      %17894 = OpShiftRightLogical %uint %24257 %int_2\n      %19680 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17894\n      %13117 = OpLoad %uint %19680\n       %8689 = OpIMul %uint %uint_3 %6555\n      %24258 = OpIAdd %uint %8114 %8689\n      %17895 = OpShiftRightLogical %uint %24258 %int_2\n      %18690 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17895\n      %24410 = OpLoad %uint %18690\n      %20784 = OpCompositeConstruct %v4uint %15061 %13116 %13117 %24410\n               OpBranch %20298\n       %6593 = OpLabel\n      %24488 = OpShiftRightLogical %uint %8114 %int_2\n      %13374 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24488\n      %12616 = OpLoad %uint %13374\n      %11700 = OpIAdd %uint %24488 %uint_1\n       %6406 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11700\n      %23656 = OpLoad %uint %6406\n      %11701 = OpIAdd %uint %24488 %uint_2\n       %6407 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11701\n      %23657 = OpLoad %uint %6407\n      %11702 = OpIAdd %uint %24488 %uint_3\n      %24563 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11702\n      %16382 = OpLoad %uint %24563\n      %20785 = OpCompositeConstruct %v4uint %12616 %23656 %23657 %16382\n               OpBranch %20298\n      %20298 = OpLabel\n      %10944 = OpPhi %v4uint %20785 %6593 %20784 %8961\n               OpSelectionMerge %16225 None\n               OpSwitch %8576 %19452 0 %14586 1 %14586 2 %7357 10 %7357 3 %7356 12 %7356 4 %8191 6 %8245\n       %8245 = OpLabel\n      %24408 = OpCompositeExtract %uint %10944 0\n      %24681 = OpExtInst %v2float %1 UnpackHalf2x16 %24408\n      %10090 = OpCompositeExtract %float %24681 0\n      %17484 = OpCompositeExtract %float %24681 1\n      %14610 = OpCompositeConstruct %v4float %10090 %17484 %float_0 %float_0\n      %17280 = OpCompositeExtract %uint %10944 1\n      %18033 = OpExtInst %v2float %1 UnpackHalf2x16 %17280\n      %10091 = OpCompositeExtract %float %18033 0\n      %17485 = OpCompositeExtract %float %18033 1\n      %14611 = OpCompositeConstruct %v4float %10091 %17485 %float_0 %float_0\n      %17281 = OpCompositeExtract %uint %10944 2\n      %18034 = OpExtInst %v2float %1 UnpackHalf2x16 %17281\n      %10092 = OpCompositeExtract %float %18034 0\n      %17486 = OpCompositeExtract %float %18034 1\n      %14612 = OpCompositeConstruct %v4float %10092 %17486 %float_0 %float_0\n      %17282 = OpCompositeExtract %uint %10944 3\n      %18035 = OpExtInst %v2float %1 UnpackHalf2x16 %17282\n      %10093 = OpCompositeExtract %float %18035 0\n      %20672 = OpCompositeExtract %float %18035 1\n       %9038 = OpCompositeConstruct %v4float %10093 %20672 %float_0 %float_0\n               OpBranch %16225\n       %8191 = OpLabel\n      %12429 = OpCompositeExtract %uint %10944 0\n      %22686 = OpBitcast %int %12429\n      %18206 = OpCompositeConstruct %v2int %22686 %22686\n      %18353 = OpShiftLeftLogical %v2int %18206 %1959\n      %13339 = OpShiftRightArithmetic %v2int %18353 %2151\n      %10915 = OpConvertSToF %v2float %13339\n      %18251 = OpVectorTimesScalar %v2float %10915 %float_0_000976592302\n      %24074 = OpExtInst %v2float %1 FMax %73 %18251\n      %24334 = OpCompositeExtract %float %24074 0\n      %15575 = OpCompositeExtract %float %24074 1\n      %16673 = OpCompositeConstruct %v4float %24334 %15575 %float_0 %float_0\n      %19525 = OpCompositeExtract %uint %10944 1\n      %16036 = OpBitcast %int %19525\n      %18207 = OpCompositeConstruct %v2int %16036 %16036\n      %18354 = OpShiftLeftLogical %v2int %18207 %1959\n      %13340 = OpShiftRightArithmetic %v2int %18354 %2151\n      %10916 = OpConvertSToF %v2float %13340\n      %18252 = OpVectorTimesScalar %v2float %10916 %float_0_000976592302\n      %24075 = OpExtInst %v2float %1 FMax %73 %18252\n      %24335 = OpCompositeExtract %float %24075 0\n      %15576 = OpCompositeExtract %float %24075 1\n      %16674 = OpCompositeConstruct %v4float %24335 %15576 %float_0 %float_0\n      %19526 = OpCompositeExtract %uint %10944 2\n      %16037 = OpBitcast %int %19526\n      %18208 = OpCompositeConstruct %v2int %16037 %16037\n      %18355 = OpShiftLeftLogical %v2int %18208 %1959\n      %13341 = OpShiftRightArithmetic %v2int %18355 %2151\n      %10917 = OpConvertSToF %v2float %13341\n      %18253 = OpVectorTimesScalar %v2float %10917 %float_0_000976592302\n      %24076 = OpExtInst %v2float %1 FMax %73 %18253\n      %24336 = OpCompositeExtract %float %24076 0\n      %15577 = OpCompositeExtract %float %24076 1\n      %16675 = OpCompositeConstruct %v4float %24336 %15577 %float_0 %float_0\n      %19527 = OpCompositeExtract %uint %10944 3\n      %16038 = OpBitcast %int %19527\n      %18212 = OpCompositeConstruct %v2int %16038 %16038\n      %18356 = OpShiftLeftLogical %v2int %18212 %1959\n      %13342 = OpShiftRightArithmetic %v2int %18356 %2151\n      %10918 = OpConvertSToF %v2float %13342\n      %18254 = OpVectorTimesScalar %v2float %10918 %float_0_000976592302\n      %24077 = OpExtInst %v2float %1 FMax %73 %18254\n      %24337 = OpCompositeExtract %float %24077 0\n      %18765 = OpCompositeExtract %float %24077 1\n       %9039 = OpCompositeConstruct %v4float %24337 %18765 %float_0 %float_0\n               OpBranch %16225\n       %7356 = OpLabel\n      %22208 = OpCompositeExtract %uint %10944 0\n      %20237 = OpCompositeConstruct %v3uint %22208 %22208 %22208\n      %11026 = OpShiftRightLogical %v3uint %20237 %2996\n      %24042 = OpBitwiseAnd %v3uint %11026 %261\n      %18592 = OpBitwiseAnd %v3uint %11026 %1126\n      %23444 = OpShiftRightLogical %v3uint %24042 %2828\n      %16589 = OpIEqual %v3bool %23444 %2578\n      %11343 = OpExtInst %v3int %1 FindUMsb %18592\n      %10777 = OpBitcast %v3uint %11343\n       %6270 = OpISub %v3uint %2828 %10777\n       %8724 = OpIAdd %v3uint %10777 %2360\n      %10355 = OpSelect %v3uint %16589 %8724 %23444\n      %23256 = OpShiftLeftLogical %v3uint %18592 %6270\n      %18846 = OpBitwiseAnd %v3uint %23256 %1126\n      %10919 = OpSelect %v3uint %16589 %18846 %18592\n      %24573 = OpIAdd %v3uint %10355 %1018\n      %20355 = OpShiftLeftLogical %v3uint %24573 %393\n      %16298 = OpShiftLeftLogical %v3uint %10919 %141\n      %22400 = OpBitwiseOr %v3uint %20355 %16298\n      %13828 = OpIEqual %v3bool %24042 %2578\n      %16966 = OpSelect %v3uint %13828 %2578 %22400\n      %10707 = OpBitcast %v3float %16966\n      %19368 = OpShiftRightLogical %uint %22208 %uint_30\n      %18450 = OpConvertUToF %float %19368\n      %15907 = OpFMul %float %18450 %float_0_333333343\n      %21446 = OpCompositeExtract %float %10707 0\n      %10841 = OpCompositeExtract %float %10707 1\n       %7836 = OpCompositeExtract %float %10707 2\n      %15837 = OpCompositeConstruct %v4float %21446 %10841 %7836 %15907\n      %10232 = OpCompositeExtract %uint %10944 1\n      %13585 = OpCompositeConstruct %v3uint %10232 %10232 %10232\n      %11027 = OpShiftRightLogical %v3uint %13585 %2996\n      %24043 = OpBitwiseAnd %v3uint %11027 %261\n      %18593 = OpBitwiseAnd %v3uint %11027 %1126\n      %23445 = OpShiftRightLogical %v3uint %24043 %2828\n      %16590 = OpIEqual %v3bool %23445 %2578\n      %11344 = OpExtInst %v3int %1 FindUMsb %18593\n      %10778 = OpBitcast %v3uint %11344\n       %6271 = OpISub %v3uint %2828 %10778\n       %8725 = OpIAdd %v3uint %10778 %2360\n      %10356 = OpSelect %v3uint %16590 %8725 %23445\n      %23257 = OpShiftLeftLogical %v3uint %18593 %6271\n      %18847 = OpBitwiseAnd %v3uint %23257 %1126\n      %10920 = OpSelect %v3uint %16590 %18847 %18593\n      %24574 = OpIAdd %v3uint %10356 %1018\n      %20356 = OpShiftLeftLogical %v3uint %24574 %393\n      %16299 = OpShiftLeftLogical %v3uint %10920 %141\n      %22401 = OpBitwiseOr %v3uint %20356 %16299\n      %13829 = OpIEqual %v3bool %24043 %2578\n      %16967 = OpSelect %v3uint %13829 %2578 %22401\n      %10708 = OpBitcast %v3float %16967\n      %19369 = OpShiftRightLogical %uint %10232 %uint_30\n      %18451 = OpConvertUToF %float %19369\n      %15908 = OpFMul %float %18451 %float_0_333333343\n      %21447 = OpCompositeExtract %float %10708 0\n      %10842 = OpCompositeExtract %float %10708 1\n       %7837 = OpCompositeExtract %float %10708 2\n      %15838 = OpCompositeConstruct %v4float %21447 %10842 %7837 %15908\n      %10233 = OpCompositeExtract %uint %10944 2\n      %13586 = OpCompositeConstruct %v3uint %10233 %10233 %10233\n      %11028 = OpShiftRightLogical %v3uint %13586 %2996\n      %24044 = OpBitwiseAnd %v3uint %11028 %261\n      %18594 = OpBitwiseAnd %v3uint %11028 %1126\n      %23446 = OpShiftRightLogical %v3uint %24044 %2828\n      %16591 = OpIEqual %v3bool %23446 %2578\n      %11345 = OpExtInst %v3int %1 FindUMsb %18594\n      %10779 = OpBitcast %v3uint %11345\n       %6272 = OpISub %v3uint %2828 %10779\n       %8726 = OpIAdd %v3uint %10779 %2360\n      %10357 = OpSelect %v3uint %16591 %8726 %23446\n      %23258 = OpShiftLeftLogical %v3uint %18594 %6272\n      %18848 = OpBitwiseAnd %v3uint %23258 %1126\n      %10921 = OpSelect %v3uint %16591 %18848 %18594\n      %24575 = OpIAdd %v3uint %10357 %1018\n      %20357 = OpShiftLeftLogical %v3uint %24575 %393\n      %16300 = OpShiftLeftLogical %v3uint %10921 %141\n      %22402 = OpBitwiseOr %v3uint %20357 %16300\n      %13830 = OpIEqual %v3bool %24044 %2578\n      %16968 = OpSelect %v3uint %13830 %2578 %22402\n      %10709 = OpBitcast %v3float %16968\n      %19370 = OpShiftRightLogical %uint %10233 %uint_30\n      %18452 = OpConvertUToF %float %19370\n      %15909 = OpFMul %float %18452 %float_0_333333343\n      %21448 = OpCompositeExtract %float %10709 0\n      %10843 = OpCompositeExtract %float %10709 1\n       %7838 = OpCompositeExtract %float %10709 2\n      %15839 = OpCompositeConstruct %v4float %21448 %10843 %7838 %15909\n      %10234 = OpCompositeExtract %uint %10944 3\n      %13587 = OpCompositeConstruct %v3uint %10234 %10234 %10234\n      %11029 = OpShiftRightLogical %v3uint %13587 %2996\n      %24045 = OpBitwiseAnd %v3uint %11029 %261\n      %18595 = OpBitwiseAnd %v3uint %11029 %1126\n      %23447 = OpShiftRightLogical %v3uint %24045 %2828\n      %16592 = OpIEqual %v3bool %23447 %2578\n      %11346 = OpExtInst %v3int %1 FindUMsb %18595\n      %10780 = OpBitcast %v3uint %11346\n       %6273 = OpISub %v3uint %2828 %10780\n       %8727 = OpIAdd %v3uint %10780 %2360\n      %10358 = OpSelect %v3uint %16592 %8727 %23447\n      %23259 = OpShiftLeftLogical %v3uint %18595 %6273\n      %18849 = OpBitwiseAnd %v3uint %23259 %1126\n      %10922 = OpSelect %v3uint %16592 %18849 %18595\n      %24576 = OpIAdd %v3uint %10358 %1018\n      %20358 = OpShiftLeftLogical %v3uint %24576 %393\n      %16301 = OpShiftLeftLogical %v3uint %10922 %141\n      %22403 = OpBitwiseOr %v3uint %20358 %16301\n      %13831 = OpIEqual %v3bool %24045 %2578\n      %16969 = OpSelect %v3uint %13831 %2578 %22403\n      %10710 = OpBitcast %v3float %16969\n      %19371 = OpShiftRightLogical %uint %10234 %uint_30\n      %18453 = OpConvertUToF %float %19371\n      %15910 = OpFMul %float %18453 %float_0_333333343\n      %21449 = OpCompositeExtract %float %10710 0\n      %10844 = OpCompositeExtract %float %10710 1\n      %11030 = OpCompositeExtract %float %10710 2\n       %9040 = OpCompositeConstruct %v4float %21449 %10844 %11030 %15910\n               OpBranch %16225\n       %7357 = OpLabel\n      %22209 = OpCompositeExtract %uint %10944 0\n      %20238 = OpCompositeConstruct %v4uint %22209 %22209 %22209 %22209\n       %9376 = OpShiftRightLogical %v4uint %20238 %845\n      %18863 = OpBitwiseAnd %v4uint %9376 %635\n      %15546 = OpConvertUToF %v4float %18863\n      %16691 = OpFMul %v4float %15546 %2798\n      %23765 = OpCompositeExtract %uint %10944 1\n      %20816 = OpCompositeConstruct %v4uint %23765 %23765 %23765 %23765\n       %9377 = OpShiftRightLogical %v4uint %20816 %845\n      %18864 = OpBitwiseAnd %v4uint %9377 %635\n      %15547 = OpConvertUToF %v4float %18864\n      %16692 = OpFMul %v4float %15547 %2798\n      %23766 = OpCompositeExtract %uint %10944 2\n      %20817 = OpCompositeConstruct %v4uint %23766 %23766 %23766 %23766\n       %9378 = OpShiftRightLogical %v4uint %20817 %845\n      %18865 = OpBitwiseAnd %v4uint %9378 %635\n      %15548 = OpConvertUToF %v4float %18865\n      %16693 = OpFMul %v4float %15548 %2798\n      %23767 = OpCompositeExtract %uint %10944 3\n      %20818 = OpCompositeConstruct %v4uint %23767 %23767 %23767 %23767\n       %9379 = OpShiftRightLogical %v4uint %20818 %845\n      %18866 = OpBitwiseAnd %v4uint %9379 %635\n      %18736 = OpConvertUToF %v4float %18866\n       %9888 = OpFMul %v4float %18736 %2798\n               OpBranch %16225\n      %14586 = OpLabel\n      %22210 = OpCompositeExtract %uint %10944 0\n      %20239 = OpCompositeConstruct %v4uint %22210 %22210 %22210 %22210\n       %9380 = OpShiftRightLogical %v4uint %20239 %653\n      %19034 = OpBitwiseAnd %v4uint %9380 %1611\n      %13989 = OpConvertUToF %v4float %19034\n      %19238 = OpVectorTimesScalar %v4float %13989 %float_0_00392156886\n       %8610 = OpCompositeExtract %uint %10944 1\n      %24846 = OpCompositeConstruct %v4uint %8610 %8610 %8610 %8610\n       %9381 = OpShiftRightLogical %v4uint %24846 %653\n      %19035 = OpBitwiseAnd %v4uint %9381 %1611\n      %13990 = OpConvertUToF %v4float %19035\n      %19239 = OpVectorTimesScalar %v4float %13990 %float_0_00392156886\n       %8611 = OpCompositeExtract %uint %10944 2\n      %24847 = OpCompositeConstruct %v4uint %8611 %8611 %8611 %8611\n       %9382 = OpShiftRightLogical %v4uint %24847 %653\n      %19036 = OpBitwiseAnd %v4uint %9382 %1611\n      %13991 = OpConvertUToF %v4float %19036\n      %19240 = OpVectorTimesScalar %v4float %13991 %float_0_00392156886\n       %8612 = OpCompositeExtract %uint %10944 3\n      %24848 = OpCompositeConstruct %v4uint %8612 %8612 %8612 %8612\n       %9383 = OpShiftRightLogical %v4uint %24848 %653\n      %19037 = OpBitwiseAnd %v4uint %9383 %1611\n      %17179 = OpConvertUToF %v4float %19037\n      %12435 = OpVectorTimesScalar %v4float %17179 %float_0_00392156886\n               OpBranch %16225\n      %19452 = OpLabel\n      %12430 = OpCompositeExtract %uint %10944 0\n      %20463 = OpBitcast %float %12430\n      %17209 = OpCompositeConstruct %v2float %20463 %float_0\n      %11667 = OpVectorShuffle %v4float %17209 %17209 0 1 1 1\n      %22196 = OpCompositeExtract %uint %10944 1\n      %16235 = OpBitcast %float %22196\n      %17210 = OpCompositeConstruct %v2float %16235 %float_0\n      %11668 = OpVectorShuffle %v4float %17210 %17210 0 1 1 1\n      %22197 = OpCompositeExtract %uint %10944 2\n      %16236 = OpBitcast %float %22197\n      %17211 = OpCompositeConstruct %v2float %16236 %float_0\n      %11669 = OpVectorShuffle %v4float %17211 %17211 0 1 1 1\n      %22198 = OpCompositeExtract %uint %10944 3\n      %16237 = OpBitcast %float %22198\n      %20399 = OpCompositeConstruct %v2float %16237 %float_0\n      %23099 = OpVectorShuffle %v4float %20399 %20399 0 1 1 1\n               OpBranch %16225\n      %16225 = OpLabel\n      %11178 = OpPhi %v4float %23099 %19452 %12435 %14586 %9888 %7357 %9040 %7356 %9039 %8191 %9038 %8245\n      %14347 = OpPhi %v4float %11669 %19452 %19240 %14586 %16693 %7357 %15839 %7356 %16675 %8191 %14612 %8245\n      %15231 = OpPhi %v4float %11668 %19452 %19239 %14586 %16692 %7357 %15838 %7356 %16674 %8191 %14611 %8245\n      %14520 = OpPhi %v4float %11667 %19452 %19238 %14586 %16691 %7357 %15837 %7356 %16673 %8191 %14610 %8245\n               OpBranch %21264\n      %15206 = OpLabel\n      %21585 = OpIEqual %bool %6555 %uint_8\n               OpSelectionMerge %20261 DontFlatten\n               OpBranchConditional %21585 %6594 %8962\n       %8962 = OpLabel\n      %22067 = OpShiftRightLogical %uint %8114 %int_2\n      %13375 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22067\n      %12617 = OpLoad %uint %13375\n      %11703 = OpIAdd %uint %22067 %uint_1\n       %6408 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11703\n       %7031 = OpLoad %uint %6408\n       %8520 = OpIAdd %uint %8114 %6555\n      %21673 = OpShiftRightLogical %uint %8520 %int_2\n      %19605 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21673\n      %12618 = OpLoad %uint %19605\n      %11704 = OpIAdd %uint %21673 %uint_1\n      %24564 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11704\n      %14157 = OpLoad %uint %24564\n      %19671 = OpCompositeConstruct %v4uint %12617 %7031 %12618 %14157\n      %19500 = OpIMul %uint %uint_2 %6555\n      %10822 = OpIAdd %uint %8114 %19500\n      %17896 = OpShiftRightLogical %uint %10822 %int_2\n      %19606 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17896\n      %12619 = OpLoad %uint %19606\n      %11705 = OpIAdd %uint %17896 %uint_1\n       %6476 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11705\n      %24156 = OpLoad %uint %6476\n       %8690 = OpIMul %uint %uint_3 %6555\n      %24259 = OpIAdd %uint %8114 %8690\n      %17897 = OpShiftRightLogical %uint %24259 %int_2\n      %19607 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17897\n      %12620 = OpLoad %uint %19607\n      %11706 = OpIAdd %uint %17897 %uint_1\n      %24565 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11706\n      %16383 = OpLoad %uint %24565\n      %20786 = OpCompositeConstruct %v4uint %12619 %24156 %12620 %16383\n               OpBranch %20261\n       %6594 = OpLabel\n      %24489 = OpShiftRightLogical %uint %8114 %int_2\n      %13376 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24489\n      %12621 = OpLoad %uint %13376\n      %11707 = OpIAdd %uint %24489 %uint_1\n       %6409 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11707\n      %23658 = OpLoad %uint %6409\n      %11708 = OpIAdd %uint %24489 %uint_2\n       %6410 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11708\n      %23659 = OpLoad %uint %6410\n      %11709 = OpIAdd %uint %24489 %uint_3\n      %24566 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11709\n      %14081 = OpLoad %uint %24566\n      %21617 = OpCompositeConstruct %v4uint %12621 %23658 %23659 %14081\n      %19332 = OpIAdd %uint %8114 %uint_16\n       %8238 = OpShiftRightLogical %uint %19332 %int_2\n      %19608 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %8238\n      %12622 = OpLoad %uint %19608\n      %11710 = OpIAdd %uint %8238 %uint_1\n       %6411 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11710\n      %23660 = OpLoad %uint %6411\n      %11711 = OpIAdd %uint %8238 %uint_2\n       %6412 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11711\n      %23661 = OpLoad %uint %6412\n      %11712 = OpIAdd %uint %8238 %uint_3\n      %24567 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11712\n      %16384 = OpLoad %uint %24567\n      %20787 = OpCompositeConstruct %v4uint %12622 %23660 %23661 %16384\n               OpBranch %20261\n      %20261 = OpLabel\n      %11214 = OpPhi %v4uint %20787 %6594 %20786 %8962\n      %14113 = OpPhi %v4uint %21617 %6594 %19671 %8962\n               OpSelectionMerge %20262 None\n               OpSwitch %8576 %20311 5 %8537 7 %8246\n       %8246 = OpLabel\n      %24411 = OpCompositeExtract %uint %14113 0\n      %24682 = OpExtInst %v2float %1 UnpackHalf2x16 %24411\n      %10105 = OpCompositeExtract %float %24682 0\n      %16060 = OpCompositeExtract %float %24682 1\n      %17029 = OpCompositeExtract %uint %14113 1\n      %15609 = OpExtInst %v2float %1 UnpackHalf2x16 %17029\n      %10094 = OpCompositeExtract %float %15609 0\n      %17487 = OpCompositeExtract %float %15609 1\n      %14613 = OpCompositeConstruct %v4float %10105 %16060 %10094 %17487\n      %17283 = OpCompositeExtract %uint %14113 2\n      %18036 = OpExtInst %v2float %1 UnpackHalf2x16 %17283\n      %10106 = OpCompositeExtract %float %18036 0\n      %16061 = OpCompositeExtract %float %18036 1\n      %17030 = OpCompositeExtract %uint %14113 3\n      %15610 = OpExtInst %v2float %1 UnpackHalf2x16 %17030\n      %10095 = OpCompositeExtract %float %15610 0\n      %17488 = OpCompositeExtract %float %15610 1\n      %14614 = OpCompositeConstruct %v4float %10106 %16061 %10095 %17488\n      %17284 = OpCompositeExtract %uint %11214 0\n      %18037 = OpExtInst %v2float %1 UnpackHalf2x16 %17284\n      %10107 = OpCompositeExtract %float %18037 0\n      %16062 = OpCompositeExtract %float %18037 1\n      %17031 = OpCompositeExtract %uint %11214 1\n      %15611 = OpExtInst %v2float %1 UnpackHalf2x16 %17031\n      %10096 = OpCompositeExtract %float %15611 0\n      %17489 = OpCompositeExtract %float %15611 1\n      %14615 = OpCompositeConstruct %v4float %10107 %16062 %10096 %17489\n      %17285 = OpCompositeExtract %uint %11214 2\n      %18038 = OpExtInst %v2float %1 UnpackHalf2x16 %17285\n      %10108 = OpCompositeExtract %float %18038 0\n      %16063 = OpCompositeExtract %float %18038 1\n      %17032 = OpCompositeExtract %uint %11214 3\n      %15612 = OpExtInst %v2float %1 UnpackHalf2x16 %17032\n      %10097 = OpCompositeExtract %float %15612 0\n      %20673 = OpCompositeExtract %float %15612 1\n       %9041 = OpCompositeConstruct %v4float %10108 %16063 %10097 %20673\n               OpBranch %20262\n       %8537 = OpLabel\n       %9724 = OpVectorShuffle %v2uint %14113 %14113 0 1\n      %23357 = OpBitcast %v2int %9724\n      %24786 = OpVectorShuffle %v4int %23357 %23357 0 0 1 1\n      %18602 = OpShiftLeftLogical %v4int %24786 %290\n      %15761 = OpShiftRightArithmetic %v4int %18602 %770\n      %10923 = OpConvertSToF %v4float %15761\n      %18213 = OpVectorTimesScalar %v4float %10923 %float_0_000976592302\n      %25236 = OpExtInst %v4float %1 FMax %1284 %18213\n      %14190 = OpVectorShuffle %v2uint %14113 %14113 2 3\n       %9410 = OpBitcast %v2int %14190\n      %24787 = OpVectorShuffle %v4int %9410 %9410 0 0 1 1\n      %18603 = OpShiftLeftLogical %v4int %24787 %290\n      %15762 = OpShiftRightArithmetic %v4int %18603 %770\n      %10924 = OpConvertSToF %v4float %15762\n      %18214 = OpVectorTimesScalar %v4float %10924 %float_0_000976592302\n      %25237 = OpExtInst %v4float %1 FMax %1284 %18214\n      %14191 = OpVectorShuffle %v2uint %11214 %11214 0 1\n       %9411 = OpBitcast %v2int %14191\n      %24788 = OpVectorShuffle %v4int %9411 %9411 0 0 1 1\n      %18604 = OpShiftLeftLogical %v4int %24788 %290\n      %15763 = OpShiftRightArithmetic %v4int %18604 %770\n      %10925 = OpConvertSToF %v4float %15763\n      %18215 = OpVectorTimesScalar %v4float %10925 %float_0_000976592302\n      %25238 = OpExtInst %v4float %1 FMax %1284 %18215\n      %14192 = OpVectorShuffle %v2uint %11214 %11214 2 3\n       %9412 = OpBitcast %v2int %14192\n      %24789 = OpVectorShuffle %v4int %9412 %9412 0 0 1 1\n      %18605 = OpShiftLeftLogical %v4int %24789 %290\n      %15764 = OpShiftRightArithmetic %v4int %18605 %770\n      %10926 = OpConvertSToF %v4float %15764\n      %21440 = OpVectorTimesScalar %v4float %10926 %float_0_000976592302\n      %17251 = OpExtInst %v4float %1 FMax %1284 %21440\n               OpBranch %20262\n      %20311 = OpLabel\n       %9762 = OpVectorShuffle %v2uint %14113 %14113 0 1\n      %20826 = OpBitcast %v2float %9762\n       %7040 = OpCompositeExtract %float %20826 0\n      %13421 = OpCompositeExtract %float %20826 1\n      %17019 = OpCompositeConstruct %v4float %7040 %13421 %float_0 %float_0\n      %16859 = OpVectorShuffle %v2uint %14113 %14113 2 3\n      %14176 = OpBitcast %v2float %16859\n       %7041 = OpCompositeExtract %float %14176 0\n      %13422 = OpCompositeExtract %float %14176 1\n      %17020 = OpCompositeConstruct %v4float %7041 %13422 %float_0 %float_0\n      %16860 = OpVectorShuffle %v2uint %11214 %11214 0 1\n      %14177 = OpBitcast %v2float %16860\n       %7042 = OpCompositeExtract %float %14177 0\n      %13423 = OpCompositeExtract %float %14177 1\n      %17021 = OpCompositeConstruct %v4float %7042 %13423 %float_0 %float_0\n      %16861 = OpVectorShuffle %v2uint %11214 %11214 2 3\n      %14178 = OpBitcast %v2float %16861\n       %7043 = OpCompositeExtract %float %14178 0\n      %16649 = OpCompositeExtract %float %14178 1\n       %9042 = OpCompositeConstruct %v4float %7043 %16649 %float_0 %float_0\n               OpBranch %20262\n      %20262 = OpLabel\n      %11179 = OpPhi %v4float %9042 %20311 %17251 %8537 %9041 %8246\n      %14348 = OpPhi %v4float %17021 %20311 %25238 %8537 %14615 %8246\n      %15232 = OpPhi %v4float %17020 %20311 %25237 %8537 %14614 %8246\n      %14521 = OpPhi %v4float %17019 %20311 %25236 %8537 %14613 %8246\n               OpBranch %21264\n      %21264 = OpLabel\n      %11180 = OpPhi %v4float %11179 %20262 %11178 %16225\n      %14349 = OpPhi %v4float %14348 %20262 %14347 %16225\n      %12949 = OpPhi %v4float %15232 %20262 %15231 %16225\n      %13946 = OpPhi %v4float %14521 %20262 %14520 %16225\n      %17241 = OpFAdd %v4float %8403 %13946\n      %23297 = OpFAdd %v4float %13804 %12949\n       %8082 = OpFAdd %v4float %14346 %14349\n      %20755 = OpFAdd %v4float %11177 %11180\n      %14461 = OpUGreaterThanEqual %bool %17238 %uint_6\n               OpSelectionMerge %24266 DontFlatten\n               OpBranchConditional %14461 %9905 %24266\n       %9905 = OpLabel\n      %14258 = OpShiftLeftLogical %uint %uint_4 %9130\n      %12090 = OpFMul %float %11052 %float_0_25\n      %20988 = OpIAdd %uint %7686 %14258\n               OpSelectionMerge %21265 DontFlatten\n               OpBranchConditional %23279 %15207 %16571\n      %16571 = OpLabel\n      %19165 = OpIEqual %bool %6555 %uint_4\n               OpSelectionMerge %20299 DontFlatten\n               OpBranchConditional %19165 %6595 %8963\n       %8963 = OpLabel\n      %22068 = OpShiftRightLogical %uint %20988 %int_2\n      %13377 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22068\n      %15062 = OpLoad %uint %13377\n       %8521 = OpIAdd %uint %20988 %6555\n      %21674 = OpShiftRightLogical %uint %8521 %int_2\n      %19681 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21674\n      %13118 = OpLoad %uint %19681\n       %8691 = OpIMul %uint %uint_2 %6555\n      %24260 = OpIAdd %uint %20988 %8691\n      %17898 = OpShiftRightLogical %uint %24260 %int_2\n      %19682 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17898\n      %13119 = OpLoad %uint %19682\n       %8692 = OpIMul %uint %uint_3 %6555\n      %24261 = OpIAdd %uint %20988 %8692\n      %17899 = OpShiftRightLogical %uint %24261 %int_2\n      %18691 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17899\n      %24412 = OpLoad %uint %18691\n      %20788 = OpCompositeConstruct %v4uint %15062 %13118 %13119 %24412\n               OpBranch %20299\n       %6595 = OpLabel\n      %24490 = OpShiftRightLogical %uint %20988 %int_2\n      %13378 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24490\n      %12623 = OpLoad %uint %13378\n      %11713 = OpIAdd %uint %24490 %uint_1\n       %6413 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11713\n      %23662 = OpLoad %uint %6413\n      %11714 = OpIAdd %uint %24490 %uint_2\n       %6414 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11714\n      %23663 = OpLoad %uint %6414\n      %11715 = OpIAdd %uint %24490 %uint_3\n      %24568 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11715\n      %16385 = OpLoad %uint %24568\n      %20789 = OpCompositeConstruct %v4uint %12623 %23662 %23663 %16385\n               OpBranch %20299\n      %20299 = OpLabel\n      %10945 = OpPhi %v4uint %20789 %6595 %20788 %8963\n               OpSelectionMerge %16226 None\n               OpSwitch %8576 %19453 0 %14587 1 %14587 2 %7359 10 %7359 3 %7358 12 %7358 4 %8192 6 %8247\n       %8247 = OpLabel\n      %24413 = OpCompositeExtract %uint %10945 0\n      %24683 = OpExtInst %v2float %1 UnpackHalf2x16 %24413\n      %10098 = OpCompositeExtract %float %24683 0\n      %17490 = OpCompositeExtract %float %24683 1\n      %14616 = OpCompositeConstruct %v4float %10098 %17490 %float_0 %float_0\n      %17286 = OpCompositeExtract %uint %10945 1\n      %18039 = OpExtInst %v2float %1 UnpackHalf2x16 %17286\n      %10099 = OpCompositeExtract %float %18039 0\n      %17491 = OpCompositeExtract %float %18039 1\n      %14617 = OpCompositeConstruct %v4float %10099 %17491 %float_0 %float_0\n      %17287 = OpCompositeExtract %uint %10945 2\n      %18040 = OpExtInst %v2float %1 UnpackHalf2x16 %17287\n      %10100 = OpCompositeExtract %float %18040 0\n      %17492 = OpCompositeExtract %float %18040 1\n      %14618 = OpCompositeConstruct %v4float %10100 %17492 %float_0 %float_0\n      %17288 = OpCompositeExtract %uint %10945 3\n      %18041 = OpExtInst %v2float %1 UnpackHalf2x16 %17288\n      %10109 = OpCompositeExtract %float %18041 0\n      %20674 = OpCompositeExtract %float %18041 1\n       %9043 = OpCompositeConstruct %v4float %10109 %20674 %float_0 %float_0\n               OpBranch %16226\n       %8192 = OpLabel\n      %12431 = OpCompositeExtract %uint %10945 0\n      %22687 = OpBitcast %int %12431\n      %18216 = OpCompositeConstruct %v2int %22687 %22687\n      %18357 = OpShiftLeftLogical %v2int %18216 %1959\n      %13343 = OpShiftRightArithmetic %v2int %18357 %2151\n      %10927 = OpConvertSToF %v2float %13343\n      %18255 = OpVectorTimesScalar %v2float %10927 %float_0_000976592302\n      %24078 = OpExtInst %v2float %1 FMax %73 %18255\n      %24338 = OpCompositeExtract %float %24078 0\n      %15578 = OpCompositeExtract %float %24078 1\n      %16676 = OpCompositeConstruct %v4float %24338 %15578 %float_0 %float_0\n      %19528 = OpCompositeExtract %uint %10945 1\n      %16039 = OpBitcast %int %19528\n      %18217 = OpCompositeConstruct %v2int %16039 %16039\n      %18358 = OpShiftLeftLogical %v2int %18217 %1959\n      %13344 = OpShiftRightArithmetic %v2int %18358 %2151\n      %10928 = OpConvertSToF %v2float %13344\n      %18256 = OpVectorTimesScalar %v2float %10928 %float_0_000976592302\n      %24079 = OpExtInst %v2float %1 FMax %73 %18256\n      %24339 = OpCompositeExtract %float %24079 0\n      %15579 = OpCompositeExtract %float %24079 1\n      %16677 = OpCompositeConstruct %v4float %24339 %15579 %float_0 %float_0\n      %19529 = OpCompositeExtract %uint %10945 2\n      %16040 = OpBitcast %int %19529\n      %18218 = OpCompositeConstruct %v2int %16040 %16040\n      %18359 = OpShiftLeftLogical %v2int %18218 %1959\n      %13345 = OpShiftRightArithmetic %v2int %18359 %2151\n      %10929 = OpConvertSToF %v2float %13345\n      %18257 = OpVectorTimesScalar %v2float %10929 %float_0_000976592302\n      %24080 = OpExtInst %v2float %1 FMax %73 %18257\n      %24340 = OpCompositeExtract %float %24080 0\n      %15580 = OpCompositeExtract %float %24080 1\n      %16678 = OpCompositeConstruct %v4float %24340 %15580 %float_0 %float_0\n      %19530 = OpCompositeExtract %uint %10945 3\n      %16041 = OpBitcast %int %19530\n      %18219 = OpCompositeConstruct %v2int %16041 %16041\n      %18360 = OpShiftLeftLogical %v2int %18219 %1959\n      %13346 = OpShiftRightArithmetic %v2int %18360 %2151\n      %10930 = OpConvertSToF %v2float %13346\n      %18258 = OpVectorTimesScalar %v2float %10930 %float_0_000976592302\n      %24081 = OpExtInst %v2float %1 FMax %73 %18258\n      %24341 = OpCompositeExtract %float %24081 0\n      %18766 = OpCompositeExtract %float %24081 1\n       %9044 = OpCompositeConstruct %v4float %24341 %18766 %float_0 %float_0\n               OpBranch %16226\n       %7358 = OpLabel\n      %22211 = OpCompositeExtract %uint %10945 0\n      %20240 = OpCompositeConstruct %v3uint %22211 %22211 %22211\n      %11031 = OpShiftRightLogical %v3uint %20240 %2996\n      %24046 = OpBitwiseAnd %v3uint %11031 %261\n      %18596 = OpBitwiseAnd %v3uint %11031 %1126\n      %23448 = OpShiftRightLogical %v3uint %24046 %2828\n      %16593 = OpIEqual %v3bool %23448 %2578\n      %11347 = OpExtInst %v3int %1 FindUMsb %18596\n      %10781 = OpBitcast %v3uint %11347\n       %6274 = OpISub %v3uint %2828 %10781\n       %8728 = OpIAdd %v3uint %10781 %2360\n      %10359 = OpSelect %v3uint %16593 %8728 %23448\n      %23260 = OpShiftLeftLogical %v3uint %18596 %6274\n      %18850 = OpBitwiseAnd %v3uint %23260 %1126\n      %10931 = OpSelect %v3uint %16593 %18850 %18596\n      %24577 = OpIAdd %v3uint %10359 %1018\n      %20359 = OpShiftLeftLogical %v3uint %24577 %393\n      %16302 = OpShiftLeftLogical %v3uint %10931 %141\n      %22404 = OpBitwiseOr %v3uint %20359 %16302\n      %13832 = OpIEqual %v3bool %24046 %2578\n      %16970 = OpSelect %v3uint %13832 %2578 %22404\n      %10711 = OpBitcast %v3float %16970\n      %19372 = OpShiftRightLogical %uint %22211 %uint_30\n      %18454 = OpConvertUToF %float %19372\n      %15911 = OpFMul %float %18454 %float_0_333333343\n      %21450 = OpCompositeExtract %float %10711 0\n      %10845 = OpCompositeExtract %float %10711 1\n       %7839 = OpCompositeExtract %float %10711 2\n      %15840 = OpCompositeConstruct %v4float %21450 %10845 %7839 %15911\n      %10235 = OpCompositeExtract %uint %10945 1\n      %13588 = OpCompositeConstruct %v3uint %10235 %10235 %10235\n      %11032 = OpShiftRightLogical %v3uint %13588 %2996\n      %24047 = OpBitwiseAnd %v3uint %11032 %261\n      %18597 = OpBitwiseAnd %v3uint %11032 %1126\n      %23449 = OpShiftRightLogical %v3uint %24047 %2828\n      %16594 = OpIEqual %v3bool %23449 %2578\n      %11348 = OpExtInst %v3int %1 FindUMsb %18597\n      %10782 = OpBitcast %v3uint %11348\n       %6275 = OpISub %v3uint %2828 %10782\n       %8729 = OpIAdd %v3uint %10782 %2360\n      %10360 = OpSelect %v3uint %16594 %8729 %23449\n      %23261 = OpShiftLeftLogical %v3uint %18597 %6275\n      %18851 = OpBitwiseAnd %v3uint %23261 %1126\n      %10932 = OpSelect %v3uint %16594 %18851 %18597\n      %24578 = OpIAdd %v3uint %10360 %1018\n      %20360 = OpShiftLeftLogical %v3uint %24578 %393\n      %16303 = OpShiftLeftLogical %v3uint %10932 %141\n      %22405 = OpBitwiseOr %v3uint %20360 %16303\n      %13833 = OpIEqual %v3bool %24047 %2578\n      %16971 = OpSelect %v3uint %13833 %2578 %22405\n      %10712 = OpBitcast %v3float %16971\n      %19373 = OpShiftRightLogical %uint %10235 %uint_30\n      %18455 = OpConvertUToF %float %19373\n      %15912 = OpFMul %float %18455 %float_0_333333343\n      %21451 = OpCompositeExtract %float %10712 0\n      %10846 = OpCompositeExtract %float %10712 1\n       %7840 = OpCompositeExtract %float %10712 2\n      %15841 = OpCompositeConstruct %v4float %21451 %10846 %7840 %15912\n      %10236 = OpCompositeExtract %uint %10945 2\n      %13589 = OpCompositeConstruct %v3uint %10236 %10236 %10236\n      %11033 = OpShiftRightLogical %v3uint %13589 %2996\n      %24048 = OpBitwiseAnd %v3uint %11033 %261\n      %18606 = OpBitwiseAnd %v3uint %11033 %1126\n      %23450 = OpShiftRightLogical %v3uint %24048 %2828\n      %16595 = OpIEqual %v3bool %23450 %2578\n      %11349 = OpExtInst %v3int %1 FindUMsb %18606\n      %10783 = OpBitcast %v3uint %11349\n       %6276 = OpISub %v3uint %2828 %10783\n       %8730 = OpIAdd %v3uint %10783 %2360\n      %10361 = OpSelect %v3uint %16595 %8730 %23450\n      %23262 = OpShiftLeftLogical %v3uint %18606 %6276\n      %18852 = OpBitwiseAnd %v3uint %23262 %1126\n      %10933 = OpSelect %v3uint %16595 %18852 %18606\n      %24579 = OpIAdd %v3uint %10361 %1018\n      %20361 = OpShiftLeftLogical %v3uint %24579 %393\n      %16304 = OpShiftLeftLogical %v3uint %10933 %141\n      %22406 = OpBitwiseOr %v3uint %20361 %16304\n      %13834 = OpIEqual %v3bool %24048 %2578\n      %16972 = OpSelect %v3uint %13834 %2578 %22406\n      %10713 = OpBitcast %v3float %16972\n      %19374 = OpShiftRightLogical %uint %10236 %uint_30\n      %18456 = OpConvertUToF %float %19374\n      %15913 = OpFMul %float %18456 %float_0_333333343\n      %21452 = OpCompositeExtract %float %10713 0\n      %10847 = OpCompositeExtract %float %10713 1\n       %7841 = OpCompositeExtract %float %10713 2\n      %15842 = OpCompositeConstruct %v4float %21452 %10847 %7841 %15913\n      %10237 = OpCompositeExtract %uint %10945 3\n      %13590 = OpCompositeConstruct %v3uint %10237 %10237 %10237\n      %11034 = OpShiftRightLogical %v3uint %13590 %2996\n      %24049 = OpBitwiseAnd %v3uint %11034 %261\n      %18607 = OpBitwiseAnd %v3uint %11034 %1126\n      %23451 = OpShiftRightLogical %v3uint %24049 %2828\n      %16596 = OpIEqual %v3bool %23451 %2578\n      %11350 = OpExtInst %v3int %1 FindUMsb %18607\n      %10784 = OpBitcast %v3uint %11350\n       %6277 = OpISub %v3uint %2828 %10784\n       %8731 = OpIAdd %v3uint %10784 %2360\n      %10362 = OpSelect %v3uint %16596 %8731 %23451\n      %23263 = OpShiftLeftLogical %v3uint %18607 %6277\n      %18853 = OpBitwiseAnd %v3uint %23263 %1126\n      %10934 = OpSelect %v3uint %16596 %18853 %18607\n      %24580 = OpIAdd %v3uint %10362 %1018\n      %20362 = OpShiftLeftLogical %v3uint %24580 %393\n      %16305 = OpShiftLeftLogical %v3uint %10934 %141\n      %22407 = OpBitwiseOr %v3uint %20362 %16305\n      %13835 = OpIEqual %v3bool %24049 %2578\n      %16973 = OpSelect %v3uint %13835 %2578 %22407\n      %10714 = OpBitcast %v3float %16973\n      %19375 = OpShiftRightLogical %uint %10237 %uint_30\n      %18457 = OpConvertUToF %float %19375\n      %15914 = OpFMul %float %18457 %float_0_333333343\n      %21453 = OpCompositeExtract %float %10714 0\n      %10848 = OpCompositeExtract %float %10714 1\n      %11035 = OpCompositeExtract %float %10714 2\n       %9045 = OpCompositeConstruct %v4float %21453 %10848 %11035 %15914\n               OpBranch %16226\n       %7359 = OpLabel\n      %22212 = OpCompositeExtract %uint %10945 0\n      %20241 = OpCompositeConstruct %v4uint %22212 %22212 %22212 %22212\n       %9384 = OpShiftRightLogical %v4uint %20241 %845\n      %18867 = OpBitwiseAnd %v4uint %9384 %635\n      %15549 = OpConvertUToF %v4float %18867\n      %16694 = OpFMul %v4float %15549 %2798\n      %23768 = OpCompositeExtract %uint %10945 1\n      %20819 = OpCompositeConstruct %v4uint %23768 %23768 %23768 %23768\n       %9385 = OpShiftRightLogical %v4uint %20819 %845\n      %18868 = OpBitwiseAnd %v4uint %9385 %635\n      %15550 = OpConvertUToF %v4float %18868\n      %16695 = OpFMul %v4float %15550 %2798\n      %23769 = OpCompositeExtract %uint %10945 2\n      %20820 = OpCompositeConstruct %v4uint %23769 %23769 %23769 %23769\n       %9386 = OpShiftRightLogical %v4uint %20820 %845\n      %18869 = OpBitwiseAnd %v4uint %9386 %635\n      %15551 = OpConvertUToF %v4float %18869\n      %16696 = OpFMul %v4float %15551 %2798\n      %23770 = OpCompositeExtract %uint %10945 3\n      %20821 = OpCompositeConstruct %v4uint %23770 %23770 %23770 %23770\n       %9387 = OpShiftRightLogical %v4uint %20821 %845\n      %18870 = OpBitwiseAnd %v4uint %9387 %635\n      %18737 = OpConvertUToF %v4float %18870\n       %9889 = OpFMul %v4float %18737 %2798\n               OpBranch %16226\n      %14587 = OpLabel\n      %22213 = OpCompositeExtract %uint %10945 0\n      %20242 = OpCompositeConstruct %v4uint %22213 %22213 %22213 %22213\n       %9388 = OpShiftRightLogical %v4uint %20242 %653\n      %19038 = OpBitwiseAnd %v4uint %9388 %1611\n      %13992 = OpConvertUToF %v4float %19038\n      %19241 = OpVectorTimesScalar %v4float %13992 %float_0_00392156886\n       %8613 = OpCompositeExtract %uint %10945 1\n      %24849 = OpCompositeConstruct %v4uint %8613 %8613 %8613 %8613\n       %9389 = OpShiftRightLogical %v4uint %24849 %653\n      %19039 = OpBitwiseAnd %v4uint %9389 %1611\n      %13993 = OpConvertUToF %v4float %19039\n      %19242 = OpVectorTimesScalar %v4float %13993 %float_0_00392156886\n       %8614 = OpCompositeExtract %uint %10945 2\n      %24850 = OpCompositeConstruct %v4uint %8614 %8614 %8614 %8614\n       %9390 = OpShiftRightLogical %v4uint %24850 %653\n      %19040 = OpBitwiseAnd %v4uint %9390 %1611\n      %13994 = OpConvertUToF %v4float %19040\n      %19243 = OpVectorTimesScalar %v4float %13994 %float_0_00392156886\n       %8615 = OpCompositeExtract %uint %10945 3\n      %24851 = OpCompositeConstruct %v4uint %8615 %8615 %8615 %8615\n       %9391 = OpShiftRightLogical %v4uint %24851 %653\n      %19041 = OpBitwiseAnd %v4uint %9391 %1611\n      %17180 = OpConvertUToF %v4float %19041\n      %12436 = OpVectorTimesScalar %v4float %17180 %float_0_00392156886\n               OpBranch %16226\n      %19453 = OpLabel\n      %12432 = OpCompositeExtract %uint %10945 0\n      %20464 = OpBitcast %float %12432\n      %17212 = OpCompositeConstruct %v2float %20464 %float_0\n      %11670 = OpVectorShuffle %v4float %17212 %17212 0 1 1 1\n      %22199 = OpCompositeExtract %uint %10945 1\n      %16238 = OpBitcast %float %22199\n      %17213 = OpCompositeConstruct %v2float %16238 %float_0\n      %11671 = OpVectorShuffle %v4float %17213 %17213 0 1 1 1\n      %22200 = OpCompositeExtract %uint %10945 2\n      %16239 = OpBitcast %float %22200\n      %17214 = OpCompositeConstruct %v2float %16239 %float_0\n      %11672 = OpVectorShuffle %v4float %17214 %17214 0 1 1 1\n      %22201 = OpCompositeExtract %uint %10945 3\n      %16240 = OpBitcast %float %22201\n      %20400 = OpCompositeConstruct %v2float %16240 %float_0\n      %23100 = OpVectorShuffle %v4float %20400 %20400 0 1 1 1\n               OpBranch %16226\n      %16226 = OpLabel\n      %11181 = OpPhi %v4float %23100 %19453 %12436 %14587 %9889 %7359 %9045 %7358 %9044 %8192 %9043 %8247\n      %14350 = OpPhi %v4float %11672 %19453 %19243 %14587 %16696 %7359 %15842 %7358 %16678 %8192 %14618 %8247\n      %15233 = OpPhi %v4float %11671 %19453 %19242 %14587 %16695 %7359 %15841 %7358 %16677 %8192 %14617 %8247\n      %14522 = OpPhi %v4float %11670 %19453 %19241 %14587 %16694 %7359 %15840 %7358 %16676 %8192 %14616 %8247\n               OpBranch %21265\n      %15207 = OpLabel\n      %21586 = OpIEqual %bool %6555 %uint_8\n               OpSelectionMerge %20263 DontFlatten\n               OpBranchConditional %21586 %6596 %8964\n       %8964 = OpLabel\n      %22069 = OpShiftRightLogical %uint %20988 %int_2\n      %13379 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22069\n      %12624 = OpLoad %uint %13379\n      %11716 = OpIAdd %uint %22069 %uint_1\n       %6415 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11716\n       %7032 = OpLoad %uint %6415\n       %8522 = OpIAdd %uint %20988 %6555\n      %21675 = OpShiftRightLogical %uint %8522 %int_2\n      %19609 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21675\n      %12625 = OpLoad %uint %19609\n      %11717 = OpIAdd %uint %21675 %uint_1\n      %24581 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11717\n      %14158 = OpLoad %uint %24581\n      %19673 = OpCompositeConstruct %v4uint %12624 %7032 %12625 %14158\n      %19501 = OpIMul %uint %uint_2 %6555\n      %10823 = OpIAdd %uint %20988 %19501\n      %17900 = OpShiftRightLogical %uint %10823 %int_2\n      %19610 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17900\n      %12626 = OpLoad %uint %19610\n      %11718 = OpIAdd %uint %17900 %uint_1\n       %6477 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11718\n      %24157 = OpLoad %uint %6477\n       %8693 = OpIMul %uint %uint_3 %6555\n      %24262 = OpIAdd %uint %20988 %8693\n      %17901 = OpShiftRightLogical %uint %24262 %int_2\n      %19611 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17901\n      %12627 = OpLoad %uint %19611\n      %11719 = OpIAdd %uint %17901 %uint_1\n      %24582 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11719\n      %16386 = OpLoad %uint %24582\n      %20790 = OpCompositeConstruct %v4uint %12626 %24157 %12627 %16386\n               OpBranch %20263\n       %6596 = OpLabel\n      %24491 = OpShiftRightLogical %uint %20988 %int_2\n      %13380 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24491\n      %12628 = OpLoad %uint %13380\n      %11720 = OpIAdd %uint %24491 %uint_1\n       %6416 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11720\n      %23664 = OpLoad %uint %6416\n      %11721 = OpIAdd %uint %24491 %uint_2\n       %6417 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11721\n      %23665 = OpLoad %uint %6417\n      %11722 = OpIAdd %uint %24491 %uint_3\n      %24583 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11722\n      %14082 = OpLoad %uint %24583\n      %21618 = OpCompositeConstruct %v4uint %12628 %23664 %23665 %14082\n      %19333 = OpIAdd %uint %20988 %uint_16\n       %8239 = OpShiftRightLogical %uint %19333 %int_2\n      %19612 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %8239\n      %12629 = OpLoad %uint %19612\n      %11723 = OpIAdd %uint %8239 %uint_1\n       %6418 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11723\n      %23666 = OpLoad %uint %6418\n      %11724 = OpIAdd %uint %8239 %uint_2\n       %6419 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11724\n      %23667 = OpLoad %uint %6419\n      %11725 = OpIAdd %uint %8239 %uint_3\n      %24584 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11725\n      %16387 = OpLoad %uint %24584\n      %20791 = OpCompositeConstruct %v4uint %12629 %23666 %23667 %16387\n               OpBranch %20263\n      %20263 = OpLabel\n      %11215 = OpPhi %v4uint %20791 %6596 %20790 %8964\n      %14114 = OpPhi %v4uint %21618 %6596 %19673 %8964\n               OpSelectionMerge %20264 None\n               OpSwitch %8576 %20312 5 %8538 7 %8248\n       %8248 = OpLabel\n      %24414 = OpCompositeExtract %uint %14114 0\n      %24684 = OpExtInst %v2float %1 UnpackHalf2x16 %24414\n      %10110 = OpCompositeExtract %float %24684 0\n      %16064 = OpCompositeExtract %float %24684 1\n      %17033 = OpCompositeExtract %uint %14114 1\n      %15613 = OpExtInst %v2float %1 UnpackHalf2x16 %17033\n      %10111 = OpCompositeExtract %float %15613 0\n      %17493 = OpCompositeExtract %float %15613 1\n      %14619 = OpCompositeConstruct %v4float %10110 %16064 %10111 %17493\n      %17289 = OpCompositeExtract %uint %14114 2\n      %18042 = OpExtInst %v2float %1 UnpackHalf2x16 %17289\n      %10112 = OpCompositeExtract %float %18042 0\n      %16065 = OpCompositeExtract %float %18042 1\n      %17034 = OpCompositeExtract %uint %14114 3\n      %15614 = OpExtInst %v2float %1 UnpackHalf2x16 %17034\n      %10113 = OpCompositeExtract %float %15614 0\n      %17494 = OpCompositeExtract %float %15614 1\n      %14620 = OpCompositeConstruct %v4float %10112 %16065 %10113 %17494\n      %17290 = OpCompositeExtract %uint %11215 0\n      %18043 = OpExtInst %v2float %1 UnpackHalf2x16 %17290\n      %10114 = OpCompositeExtract %float %18043 0\n      %16066 = OpCompositeExtract %float %18043 1\n      %17035 = OpCompositeExtract %uint %11215 1\n      %15615 = OpExtInst %v2float %1 UnpackHalf2x16 %17035\n      %10115 = OpCompositeExtract %float %15615 0\n      %17495 = OpCompositeExtract %float %15615 1\n      %14621 = OpCompositeConstruct %v4float %10114 %16066 %10115 %17495\n      %17291 = OpCompositeExtract %uint %11215 2\n      %18044 = OpExtInst %v2float %1 UnpackHalf2x16 %17291\n      %10116 = OpCompositeExtract %float %18044 0\n      %16067 = OpCompositeExtract %float %18044 1\n      %17036 = OpCompositeExtract %uint %11215 3\n      %15616 = OpExtInst %v2float %1 UnpackHalf2x16 %17036\n      %10117 = OpCompositeExtract %float %15616 0\n      %20675 = OpCompositeExtract %float %15616 1\n       %9046 = OpCompositeConstruct %v4float %10116 %16067 %10117 %20675\n               OpBranch %20264\n       %8538 = OpLabel\n       %9725 = OpVectorShuffle %v2uint %14114 %14114 0 1\n      %23358 = OpBitcast %v2int %9725\n      %24790 = OpVectorShuffle %v4int %23358 %23358 0 0 1 1\n      %18608 = OpShiftLeftLogical %v4int %24790 %290\n      %15765 = OpShiftRightArithmetic %v4int %18608 %770\n      %10935 = OpConvertSToF %v4float %15765\n      %18220 = OpVectorTimesScalar %v4float %10935 %float_0_000976592302\n      %25239 = OpExtInst %v4float %1 FMax %1284 %18220\n      %14193 = OpVectorShuffle %v2uint %14114 %14114 2 3\n       %9413 = OpBitcast %v2int %14193\n      %24791 = OpVectorShuffle %v4int %9413 %9413 0 0 1 1\n      %18609 = OpShiftLeftLogical %v4int %24791 %290\n      %15766 = OpShiftRightArithmetic %v4int %18609 %770\n      %10936 = OpConvertSToF %v4float %15766\n      %18221 = OpVectorTimesScalar %v4float %10936 %float_0_000976592302\n      %25240 = OpExtInst %v4float %1 FMax %1284 %18221\n      %14194 = OpVectorShuffle %v2uint %11215 %11215 0 1\n       %9414 = OpBitcast %v2int %14194\n      %24792 = OpVectorShuffle %v4int %9414 %9414 0 0 1 1\n      %18610 = OpShiftLeftLogical %v4int %24792 %290\n      %15767 = OpShiftRightArithmetic %v4int %18610 %770\n      %10937 = OpConvertSToF %v4float %15767\n      %18222 = OpVectorTimesScalar %v4float %10937 %float_0_000976592302\n      %25241 = OpExtInst %v4float %1 FMax %1284 %18222\n      %14195 = OpVectorShuffle %v2uint %11215 %11215 2 3\n       %9415 = OpBitcast %v2int %14195\n      %24793 = OpVectorShuffle %v4int %9415 %9415 0 0 1 1\n      %18611 = OpShiftLeftLogical %v4int %24793 %290\n      %15768 = OpShiftRightArithmetic %v4int %18611 %770\n      %10938 = OpConvertSToF %v4float %15768\n      %21441 = OpVectorTimesScalar %v4float %10938 %float_0_000976592302\n      %17252 = OpExtInst %v4float %1 FMax %1284 %21441\n               OpBranch %20264\n      %20312 = OpLabel\n       %9763 = OpVectorShuffle %v2uint %14114 %14114 0 1\n      %20827 = OpBitcast %v2float %9763\n       %7044 = OpCompositeExtract %float %20827 0\n      %13424 = OpCompositeExtract %float %20827 1\n      %17022 = OpCompositeConstruct %v4float %7044 %13424 %float_0 %float_0\n      %16862 = OpVectorShuffle %v2uint %14114 %14114 2 3\n      %14179 = OpBitcast %v2float %16862\n       %7045 = OpCompositeExtract %float %14179 0\n      %13425 = OpCompositeExtract %float %14179 1\n      %17023 = OpCompositeConstruct %v4float %7045 %13425 %float_0 %float_0\n      %16863 = OpVectorShuffle %v2uint %11215 %11215 0 1\n      %14180 = OpBitcast %v2float %16863\n       %7046 = OpCompositeExtract %float %14180 0\n      %13426 = OpCompositeExtract %float %14180 1\n      %17024 = OpCompositeConstruct %v4float %7046 %13426 %float_0 %float_0\n      %16864 = OpVectorShuffle %v2uint %11215 %11215 2 3\n      %14181 = OpBitcast %v2float %16864\n       %7047 = OpCompositeExtract %float %14181 0\n      %16650 = OpCompositeExtract %float %14181 1\n       %9047 = OpCompositeConstruct %v4float %7047 %16650 %float_0 %float_0\n               OpBranch %20264\n      %20264 = OpLabel\n      %11182 = OpPhi %v4float %9047 %20312 %17252 %8538 %9046 %8248\n      %14351 = OpPhi %v4float %17024 %20312 %25241 %8538 %14621 %8248\n      %15234 = OpPhi %v4float %17023 %20312 %25240 %8538 %14620 %8248\n      %14523 = OpPhi %v4float %17022 %20312 %25239 %8538 %14619 %8248\n               OpBranch %21265\n      %21265 = OpLabel\n      %11183 = OpPhi %v4float %11182 %20264 %11181 %16226\n      %14352 = OpPhi %v4float %14351 %20264 %14350 %16226\n      %12950 = OpPhi %v4float %15234 %20264 %15233 %16226\n      %13947 = OpPhi %v4float %14523 %20264 %14522 %16226\n      %17242 = OpFAdd %v4float %17241 %13947\n      %23298 = OpFAdd %v4float %23297 %12950\n       %7208 = OpFAdd %v4float %8082 %14352\n       %9642 = OpFAdd %v4float %20755 %11183\n      %16376 = OpIAdd %uint %8114 %14258\n               OpSelectionMerge %21266 DontFlatten\n               OpBranchConditional %23279 %15208 %16572\n      %16572 = OpLabel\n      %19166 = OpIEqual %bool %6555 %uint_4\n               OpSelectionMerge %20300 DontFlatten\n               OpBranchConditional %19166 %6597 %8965\n       %8965 = OpLabel\n      %22070 = OpShiftRightLogical %uint %16376 %int_2\n      %13381 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22070\n      %15063 = OpLoad %uint %13381\n       %8523 = OpIAdd %uint %16376 %6555\n      %21676 = OpShiftRightLogical %uint %8523 %int_2\n      %19683 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21676\n      %13120 = OpLoad %uint %19683\n       %8694 = OpIMul %uint %uint_2 %6555\n      %24263 = OpIAdd %uint %16376 %8694\n      %17902 = OpShiftRightLogical %uint %24263 %int_2\n      %19684 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17902\n      %13121 = OpLoad %uint %19684\n       %8695 = OpIMul %uint %uint_3 %6555\n      %24264 = OpIAdd %uint %16376 %8695\n      %17903 = OpShiftRightLogical %uint %24264 %int_2\n      %18692 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17903\n      %24415 = OpLoad %uint %18692\n      %20792 = OpCompositeConstruct %v4uint %15063 %13120 %13121 %24415\n               OpBranch %20300\n       %6597 = OpLabel\n      %24492 = OpShiftRightLogical %uint %16376 %int_2\n      %13382 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24492\n      %12630 = OpLoad %uint %13382\n      %11726 = OpIAdd %uint %24492 %uint_1\n       %6420 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11726\n      %23668 = OpLoad %uint %6420\n      %11727 = OpIAdd %uint %24492 %uint_2\n       %6421 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11727\n      %23669 = OpLoad %uint %6421\n      %11728 = OpIAdd %uint %24492 %uint_3\n      %24585 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11728\n      %16388 = OpLoad %uint %24585\n      %20793 = OpCompositeConstruct %v4uint %12630 %23668 %23669 %16388\n               OpBranch %20300\n      %20300 = OpLabel\n      %10946 = OpPhi %v4uint %20793 %6597 %20792 %8965\n               OpSelectionMerge %16227 None\n               OpSwitch %8576 %19454 0 %14588 1 %14588 2 %7361 10 %7361 3 %7360 12 %7360 4 %8193 6 %8249\n       %8249 = OpLabel\n      %24416 = OpCompositeExtract %uint %10946 0\n      %24685 = OpExtInst %v2float %1 UnpackHalf2x16 %24416\n      %10118 = OpCompositeExtract %float %24685 0\n      %17496 = OpCompositeExtract %float %24685 1\n      %14622 = OpCompositeConstruct %v4float %10118 %17496 %float_0 %float_0\n      %17292 = OpCompositeExtract %uint %10946 1\n      %18045 = OpExtInst %v2float %1 UnpackHalf2x16 %17292\n      %10119 = OpCompositeExtract %float %18045 0\n      %17497 = OpCompositeExtract %float %18045 1\n      %14623 = OpCompositeConstruct %v4float %10119 %17497 %float_0 %float_0\n      %17293 = OpCompositeExtract %uint %10946 2\n      %18046 = OpExtInst %v2float %1 UnpackHalf2x16 %17293\n      %10120 = OpCompositeExtract %float %18046 0\n      %17498 = OpCompositeExtract %float %18046 1\n      %14624 = OpCompositeConstruct %v4float %10120 %17498 %float_0 %float_0\n      %17294 = OpCompositeExtract %uint %10946 3\n      %18047 = OpExtInst %v2float %1 UnpackHalf2x16 %17294\n      %10121 = OpCompositeExtract %float %18047 0\n      %20676 = OpCompositeExtract %float %18047 1\n       %9048 = OpCompositeConstruct %v4float %10121 %20676 %float_0 %float_0\n               OpBranch %16227\n       %8193 = OpLabel\n      %12433 = OpCompositeExtract %uint %10946 0\n      %22688 = OpBitcast %int %12433\n      %18223 = OpCompositeConstruct %v2int %22688 %22688\n      %18361 = OpShiftLeftLogical %v2int %18223 %1959\n      %13347 = OpShiftRightArithmetic %v2int %18361 %2151\n      %10939 = OpConvertSToF %v2float %13347\n      %18259 = OpVectorTimesScalar %v2float %10939 %float_0_000976592302\n      %24082 = OpExtInst %v2float %1 FMax %73 %18259\n      %24342 = OpCompositeExtract %float %24082 0\n      %15581 = OpCompositeExtract %float %24082 1\n      %16679 = OpCompositeConstruct %v4float %24342 %15581 %float_0 %float_0\n      %19531 = OpCompositeExtract %uint %10946 1\n      %16042 = OpBitcast %int %19531\n      %18224 = OpCompositeConstruct %v2int %16042 %16042\n      %18362 = OpShiftLeftLogical %v2int %18224 %1959\n      %13348 = OpShiftRightArithmetic %v2int %18362 %2151\n      %10940 = OpConvertSToF %v2float %13348\n      %18260 = OpVectorTimesScalar %v2float %10940 %float_0_000976592302\n      %24083 = OpExtInst %v2float %1 FMax %73 %18260\n      %24343 = OpCompositeExtract %float %24083 0\n      %15582 = OpCompositeExtract %float %24083 1\n      %16680 = OpCompositeConstruct %v4float %24343 %15582 %float_0 %float_0\n      %19532 = OpCompositeExtract %uint %10946 2\n      %16043 = OpBitcast %int %19532\n      %18225 = OpCompositeConstruct %v2int %16043 %16043\n      %18364 = OpShiftLeftLogical %v2int %18225 %1959\n      %13349 = OpShiftRightArithmetic %v2int %18364 %2151\n      %10941 = OpConvertSToF %v2float %13349\n      %18261 = OpVectorTimesScalar %v2float %10941 %float_0_000976592302\n      %24084 = OpExtInst %v2float %1 FMax %73 %18261\n      %24344 = OpCompositeExtract %float %24084 0\n      %15583 = OpCompositeExtract %float %24084 1\n      %16681 = OpCompositeConstruct %v4float %24344 %15583 %float_0 %float_0\n      %19533 = OpCompositeExtract %uint %10946 3\n      %16044 = OpBitcast %int %19533\n      %18226 = OpCompositeConstruct %v2int %16044 %16044\n      %18365 = OpShiftLeftLogical %v2int %18226 %1959\n      %13350 = OpShiftRightArithmetic %v2int %18365 %2151\n      %10942 = OpConvertSToF %v2float %13350\n      %18262 = OpVectorTimesScalar %v2float %10942 %float_0_000976592302\n      %24085 = OpExtInst %v2float %1 FMax %73 %18262\n      %24345 = OpCompositeExtract %float %24085 0\n      %18767 = OpCompositeExtract %float %24085 1\n       %9049 = OpCompositeConstruct %v4float %24345 %18767 %float_0 %float_0\n               OpBranch %16227\n       %7360 = OpLabel\n      %22214 = OpCompositeExtract %uint %10946 0\n      %20243 = OpCompositeConstruct %v3uint %22214 %22214 %22214\n      %11036 = OpShiftRightLogical %v3uint %20243 %2996\n      %24050 = OpBitwiseAnd %v3uint %11036 %261\n      %18612 = OpBitwiseAnd %v3uint %11036 %1126\n      %23452 = OpShiftRightLogical %v3uint %24050 %2828\n      %16597 = OpIEqual %v3bool %23452 %2578\n      %11351 = OpExtInst %v3int %1 FindUMsb %18612\n      %10785 = OpBitcast %v3uint %11351\n       %6278 = OpISub %v3uint %2828 %10785\n       %8732 = OpIAdd %v3uint %10785 %2360\n      %10363 = OpSelect %v3uint %16597 %8732 %23452\n      %23264 = OpShiftLeftLogical %v3uint %18612 %6278\n      %18854 = OpBitwiseAnd %v3uint %23264 %1126\n      %10947 = OpSelect %v3uint %16597 %18854 %18612\n      %24586 = OpIAdd %v3uint %10363 %1018\n      %20363 = OpShiftLeftLogical %v3uint %24586 %393\n      %16306 = OpShiftLeftLogical %v3uint %10947 %141\n      %22408 = OpBitwiseOr %v3uint %20363 %16306\n      %13836 = OpIEqual %v3bool %24050 %2578\n      %16974 = OpSelect %v3uint %13836 %2578 %22408\n      %10715 = OpBitcast %v3float %16974\n      %19376 = OpShiftRightLogical %uint %22214 %uint_30\n      %18458 = OpConvertUToF %float %19376\n      %15915 = OpFMul %float %18458 %float_0_333333343\n      %21454 = OpCompositeExtract %float %10715 0\n      %10849 = OpCompositeExtract %float %10715 1\n       %7842 = OpCompositeExtract %float %10715 2\n      %15843 = OpCompositeConstruct %v4float %21454 %10849 %7842 %15915\n      %10238 = OpCompositeExtract %uint %10946 1\n      %13591 = OpCompositeConstruct %v3uint %10238 %10238 %10238\n      %11037 = OpShiftRightLogical %v3uint %13591 %2996\n      %24051 = OpBitwiseAnd %v3uint %11037 %261\n      %18613 = OpBitwiseAnd %v3uint %11037 %1126\n      %23453 = OpShiftRightLogical %v3uint %24051 %2828\n      %16598 = OpIEqual %v3bool %23453 %2578\n      %11352 = OpExtInst %v3int %1 FindUMsb %18613\n      %10786 = OpBitcast %v3uint %11352\n       %6279 = OpISub %v3uint %2828 %10786\n       %8733 = OpIAdd %v3uint %10786 %2360\n      %10364 = OpSelect %v3uint %16598 %8733 %23453\n      %23265 = OpShiftLeftLogical %v3uint %18613 %6279\n      %18855 = OpBitwiseAnd %v3uint %23265 %1126\n      %10948 = OpSelect %v3uint %16598 %18855 %18613\n      %24587 = OpIAdd %v3uint %10364 %1018\n      %20364 = OpShiftLeftLogical %v3uint %24587 %393\n      %16307 = OpShiftLeftLogical %v3uint %10948 %141\n      %22409 = OpBitwiseOr %v3uint %20364 %16307\n      %13837 = OpIEqual %v3bool %24051 %2578\n      %16975 = OpSelect %v3uint %13837 %2578 %22409\n      %10716 = OpBitcast %v3float %16975\n      %19377 = OpShiftRightLogical %uint %10238 %uint_30\n      %18459 = OpConvertUToF %float %19377\n      %15916 = OpFMul %float %18459 %float_0_333333343\n      %21455 = OpCompositeExtract %float %10716 0\n      %10850 = OpCompositeExtract %float %10716 1\n       %7843 = OpCompositeExtract %float %10716 2\n      %15844 = OpCompositeConstruct %v4float %21455 %10850 %7843 %15916\n      %10239 = OpCompositeExtract %uint %10946 2\n      %13592 = OpCompositeConstruct %v3uint %10239 %10239 %10239\n      %11038 = OpShiftRightLogical %v3uint %13592 %2996\n      %24052 = OpBitwiseAnd %v3uint %11038 %261\n      %18614 = OpBitwiseAnd %v3uint %11038 %1126\n      %23454 = OpShiftRightLogical %v3uint %24052 %2828\n      %16599 = OpIEqual %v3bool %23454 %2578\n      %11353 = OpExtInst %v3int %1 FindUMsb %18614\n      %10787 = OpBitcast %v3uint %11353\n       %6280 = OpISub %v3uint %2828 %10787\n       %8734 = OpIAdd %v3uint %10787 %2360\n      %10365 = OpSelect %v3uint %16599 %8734 %23454\n      %23266 = OpShiftLeftLogical %v3uint %18614 %6280\n      %18856 = OpBitwiseAnd %v3uint %23266 %1126\n      %10949 = OpSelect %v3uint %16599 %18856 %18614\n      %24588 = OpIAdd %v3uint %10365 %1018\n      %20365 = OpShiftLeftLogical %v3uint %24588 %393\n      %16308 = OpShiftLeftLogical %v3uint %10949 %141\n      %22410 = OpBitwiseOr %v3uint %20365 %16308\n      %13838 = OpIEqual %v3bool %24052 %2578\n      %16976 = OpSelect %v3uint %13838 %2578 %22410\n      %10717 = OpBitcast %v3float %16976\n      %19378 = OpShiftRightLogical %uint %10239 %uint_30\n      %18460 = OpConvertUToF %float %19378\n      %15917 = OpFMul %float %18460 %float_0_333333343\n      %21456 = OpCompositeExtract %float %10717 0\n      %10851 = OpCompositeExtract %float %10717 1\n       %7844 = OpCompositeExtract %float %10717 2\n      %15845 = OpCompositeConstruct %v4float %21456 %10851 %7844 %15917\n      %10240 = OpCompositeExtract %uint %10946 3\n      %13593 = OpCompositeConstruct %v3uint %10240 %10240 %10240\n      %11039 = OpShiftRightLogical %v3uint %13593 %2996\n      %24053 = OpBitwiseAnd %v3uint %11039 %261\n      %18616 = OpBitwiseAnd %v3uint %11039 %1126\n      %23455 = OpShiftRightLogical %v3uint %24053 %2828\n      %16600 = OpIEqual %v3bool %23455 %2578\n      %11354 = OpExtInst %v3int %1 FindUMsb %18616\n      %10788 = OpBitcast %v3uint %11354\n       %6281 = OpISub %v3uint %2828 %10788\n       %8735 = OpIAdd %v3uint %10788 %2360\n      %10366 = OpSelect %v3uint %16600 %8735 %23455\n      %23267 = OpShiftLeftLogical %v3uint %18616 %6281\n      %18857 = OpBitwiseAnd %v3uint %23267 %1126\n      %10950 = OpSelect %v3uint %16600 %18857 %18616\n      %24589 = OpIAdd %v3uint %10366 %1018\n      %20366 = OpShiftLeftLogical %v3uint %24589 %393\n      %16309 = OpShiftLeftLogical %v3uint %10950 %141\n      %22411 = OpBitwiseOr %v3uint %20366 %16309\n      %13839 = OpIEqual %v3bool %24053 %2578\n      %16977 = OpSelect %v3uint %13839 %2578 %22411\n      %10718 = OpBitcast %v3float %16977\n      %19379 = OpShiftRightLogical %uint %10240 %uint_30\n      %18461 = OpConvertUToF %float %19379\n      %15918 = OpFMul %float %18461 %float_0_333333343\n      %21457 = OpCompositeExtract %float %10718 0\n      %10852 = OpCompositeExtract %float %10718 1\n      %11040 = OpCompositeExtract %float %10718 2\n       %9050 = OpCompositeConstruct %v4float %21457 %10852 %11040 %15918\n               OpBranch %16227\n       %7361 = OpLabel\n      %22215 = OpCompositeExtract %uint %10946 0\n      %20244 = OpCompositeConstruct %v4uint %22215 %22215 %22215 %22215\n       %9392 = OpShiftRightLogical %v4uint %20244 %845\n      %18871 = OpBitwiseAnd %v4uint %9392 %635\n      %15552 = OpConvertUToF %v4float %18871\n      %16697 = OpFMul %v4float %15552 %2798\n      %23771 = OpCompositeExtract %uint %10946 1\n      %20822 = OpCompositeConstruct %v4uint %23771 %23771 %23771 %23771\n       %9393 = OpShiftRightLogical %v4uint %20822 %845\n      %18872 = OpBitwiseAnd %v4uint %9393 %635\n      %15553 = OpConvertUToF %v4float %18872\n      %16698 = OpFMul %v4float %15553 %2798\n      %23772 = OpCompositeExtract %uint %10946 2\n      %20823 = OpCompositeConstruct %v4uint %23772 %23772 %23772 %23772\n       %9394 = OpShiftRightLogical %v4uint %20823 %845\n      %18873 = OpBitwiseAnd %v4uint %9394 %635\n      %15554 = OpConvertUToF %v4float %18873\n      %16699 = OpFMul %v4float %15554 %2798\n      %23773 = OpCompositeExtract %uint %10946 3\n      %20828 = OpCompositeConstruct %v4uint %23773 %23773 %23773 %23773\n       %9395 = OpShiftRightLogical %v4uint %20828 %845\n      %18874 = OpBitwiseAnd %v4uint %9395 %635\n      %18738 = OpConvertUToF %v4float %18874\n       %9890 = OpFMul %v4float %18738 %2798\n               OpBranch %16227\n      %14588 = OpLabel\n      %22216 = OpCompositeExtract %uint %10946 0\n      %20245 = OpCompositeConstruct %v4uint %22216 %22216 %22216 %22216\n       %9396 = OpShiftRightLogical %v4uint %20245 %653\n      %19042 = OpBitwiseAnd %v4uint %9396 %1611\n      %13995 = OpConvertUToF %v4float %19042\n      %19244 = OpVectorTimesScalar %v4float %13995 %float_0_00392156886\n       %8616 = OpCompositeExtract %uint %10946 1\n      %24852 = OpCompositeConstruct %v4uint %8616 %8616 %8616 %8616\n       %9397 = OpShiftRightLogical %v4uint %24852 %653\n      %19043 = OpBitwiseAnd %v4uint %9397 %1611\n      %13996 = OpConvertUToF %v4float %19043\n      %19245 = OpVectorTimesScalar %v4float %13996 %float_0_00392156886\n       %8617 = OpCompositeExtract %uint %10946 2\n      %24853 = OpCompositeConstruct %v4uint %8617 %8617 %8617 %8617\n       %9398 = OpShiftRightLogical %v4uint %24853 %653\n      %19044 = OpBitwiseAnd %v4uint %9398 %1611\n      %13997 = OpConvertUToF %v4float %19044\n      %19246 = OpVectorTimesScalar %v4float %13997 %float_0_00392156886\n       %8618 = OpCompositeExtract %uint %10946 3\n      %24854 = OpCompositeConstruct %v4uint %8618 %8618 %8618 %8618\n       %9399 = OpShiftRightLogical %v4uint %24854 %653\n      %19045 = OpBitwiseAnd %v4uint %9399 %1611\n      %17181 = OpConvertUToF %v4float %19045\n      %12437 = OpVectorTimesScalar %v4float %17181 %float_0_00392156886\n               OpBranch %16227\n      %19454 = OpLabel\n      %12438 = OpCompositeExtract %uint %10946 0\n      %20465 = OpBitcast %float %12438\n      %17215 = OpCompositeConstruct %v2float %20465 %float_0\n      %11673 = OpVectorShuffle %v4float %17215 %17215 0 1 1 1\n      %22202 = OpCompositeExtract %uint %10946 1\n      %16241 = OpBitcast %float %22202\n      %17216 = OpCompositeConstruct %v2float %16241 %float_0\n      %11674 = OpVectorShuffle %v4float %17216 %17216 0 1 1 1\n      %22203 = OpCompositeExtract %uint %10946 2\n      %16242 = OpBitcast %float %22203\n      %17217 = OpCompositeConstruct %v2float %16242 %float_0\n      %11675 = OpVectorShuffle %v4float %17217 %17217 0 1 1 1\n      %22204 = OpCompositeExtract %uint %10946 3\n      %16243 = OpBitcast %float %22204\n      %20401 = OpCompositeConstruct %v2float %16243 %float_0\n      %23101 = OpVectorShuffle %v4float %20401 %20401 0 1 1 1\n               OpBranch %16227\n      %16227 = OpLabel\n      %11184 = OpPhi %v4float %23101 %19454 %12437 %14588 %9890 %7361 %9050 %7360 %9049 %8193 %9048 %8249\n      %14353 = OpPhi %v4float %11675 %19454 %19246 %14588 %16699 %7361 %15845 %7360 %16681 %8193 %14624 %8249\n      %15235 = OpPhi %v4float %11674 %19454 %19245 %14588 %16698 %7361 %15844 %7360 %16680 %8193 %14623 %8249\n      %14524 = OpPhi %v4float %11673 %19454 %19244 %14588 %16697 %7361 %15843 %7360 %16679 %8193 %14622 %8249\n               OpBranch %21266\n      %15208 = OpLabel\n      %21587 = OpIEqual %bool %6555 %uint_8\n               OpSelectionMerge %20265 DontFlatten\n               OpBranchConditional %21587 %6598 %8966\n       %8966 = OpLabel\n      %22071 = OpShiftRightLogical %uint %16376 %int_2\n      %13383 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22071\n      %12631 = OpLoad %uint %13383\n      %11729 = OpIAdd %uint %22071 %uint_1\n       %6422 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11729\n       %7033 = OpLoad %uint %6422\n       %8524 = OpIAdd %uint %16376 %6555\n      %21677 = OpShiftRightLogical %uint %8524 %int_2\n      %19613 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21677\n      %12632 = OpLoad %uint %19613\n      %11730 = OpIAdd %uint %21677 %uint_1\n      %24590 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11730\n      %14159 = OpLoad %uint %24590\n      %19674 = OpCompositeConstruct %v4uint %12631 %7033 %12632 %14159\n      %19502 = OpIMul %uint %uint_2 %6555\n      %10824 = OpIAdd %uint %16376 %19502\n      %17904 = OpShiftRightLogical %uint %10824 %int_2\n      %19614 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17904\n      %12633 = OpLoad %uint %19614\n      %11731 = OpIAdd %uint %17904 %uint_1\n       %6478 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11731\n      %24158 = OpLoad %uint %6478\n       %8696 = OpIMul %uint %uint_3 %6555\n      %24265 = OpIAdd %uint %16376 %8696\n      %17905 = OpShiftRightLogical %uint %24265 %int_2\n      %19615 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17905\n      %12634 = OpLoad %uint %19615\n      %11732 = OpIAdd %uint %17905 %uint_1\n      %24591 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11732\n      %16389 = OpLoad %uint %24591\n      %20794 = OpCompositeConstruct %v4uint %12633 %24158 %12634 %16389\n               OpBranch %20265\n       %6598 = OpLabel\n      %24493 = OpShiftRightLogical %uint %16376 %int_2\n      %13384 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24493\n      %12635 = OpLoad %uint %13384\n      %11733 = OpIAdd %uint %24493 %uint_1\n       %6423 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11733\n      %23670 = OpLoad %uint %6423\n      %11734 = OpIAdd %uint %24493 %uint_2\n       %6424 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11734\n      %23671 = OpLoad %uint %6424\n      %11735 = OpIAdd %uint %24493 %uint_3\n      %24592 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11735\n      %14083 = OpLoad %uint %24592\n      %21619 = OpCompositeConstruct %v4uint %12635 %23670 %23671 %14083\n      %19334 = OpIAdd %uint %16376 %uint_16\n       %8240 = OpShiftRightLogical %uint %19334 %int_2\n      %19616 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %8240\n      %12636 = OpLoad %uint %19616\n      %11736 = OpIAdd %uint %8240 %uint_1\n       %6425 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11736\n      %23672 = OpLoad %uint %6425\n      %11737 = OpIAdd %uint %8240 %uint_2\n       %6426 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11737\n      %23673 = OpLoad %uint %6426\n      %11738 = OpIAdd %uint %8240 %uint_3\n      %24593 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11738\n      %16390 = OpLoad %uint %24593\n      %20795 = OpCompositeConstruct %v4uint %12636 %23672 %23673 %16390\n               OpBranch %20265\n      %20265 = OpLabel\n      %11216 = OpPhi %v4uint %20795 %6598 %20794 %8966\n      %14115 = OpPhi %v4uint %21619 %6598 %19674 %8966\n               OpSelectionMerge %20266 None\n               OpSwitch %8576 %20313 5 %8539 7 %8250\n       %8250 = OpLabel\n      %24417 = OpCompositeExtract %uint %14115 0\n      %24686 = OpExtInst %v2float %1 UnpackHalf2x16 %24417\n      %10122 = OpCompositeExtract %float %24686 0\n      %16068 = OpCompositeExtract %float %24686 1\n      %17037 = OpCompositeExtract %uint %14115 1\n      %15617 = OpExtInst %v2float %1 UnpackHalf2x16 %17037\n      %10123 = OpCompositeExtract %float %15617 0\n      %17499 = OpCompositeExtract %float %15617 1\n      %14625 = OpCompositeConstruct %v4float %10122 %16068 %10123 %17499\n      %17295 = OpCompositeExtract %uint %14115 2\n      %18048 = OpExtInst %v2float %1 UnpackHalf2x16 %17295\n      %10124 = OpCompositeExtract %float %18048 0\n      %16069 = OpCompositeExtract %float %18048 1\n      %17038 = OpCompositeExtract %uint %14115 3\n      %15618 = OpExtInst %v2float %1 UnpackHalf2x16 %17038\n      %10125 = OpCompositeExtract %float %15618 0\n      %17500 = OpCompositeExtract %float %15618 1\n      %14626 = OpCompositeConstruct %v4float %10124 %16069 %10125 %17500\n      %17296 = OpCompositeExtract %uint %11216 0\n      %18049 = OpExtInst %v2float %1 UnpackHalf2x16 %17296\n      %10126 = OpCompositeExtract %float %18049 0\n      %16070 = OpCompositeExtract %float %18049 1\n      %17039 = OpCompositeExtract %uint %11216 1\n      %15619 = OpExtInst %v2float %1 UnpackHalf2x16 %17039\n      %10127 = OpCompositeExtract %float %15619 0\n      %17501 = OpCompositeExtract %float %15619 1\n      %14627 = OpCompositeConstruct %v4float %10126 %16070 %10127 %17501\n      %17297 = OpCompositeExtract %uint %11216 2\n      %18050 = OpExtInst %v2float %1 UnpackHalf2x16 %17297\n      %10128 = OpCompositeExtract %float %18050 0\n      %16071 = OpCompositeExtract %float %18050 1\n      %17040 = OpCompositeExtract %uint %11216 3\n      %15620 = OpExtInst %v2float %1 UnpackHalf2x16 %17040\n      %10129 = OpCompositeExtract %float %15620 0\n      %20677 = OpCompositeExtract %float %15620 1\n       %9051 = OpCompositeConstruct %v4float %10128 %16071 %10129 %20677\n               OpBranch %20266\n       %8539 = OpLabel\n       %9726 = OpVectorShuffle %v2uint %14115 %14115 0 1\n      %23359 = OpBitcast %v2int %9726\n      %24794 = OpVectorShuffle %v4int %23359 %23359 0 0 1 1\n      %18617 = OpShiftLeftLogical %v4int %24794 %290\n      %15769 = OpShiftRightArithmetic %v4int %18617 %770\n      %10951 = OpConvertSToF %v4float %15769\n      %18227 = OpVectorTimesScalar %v4float %10951 %float_0_000976592302\n      %25242 = OpExtInst %v4float %1 FMax %1284 %18227\n      %14196 = OpVectorShuffle %v2uint %14115 %14115 2 3\n       %9416 = OpBitcast %v2int %14196\n      %24795 = OpVectorShuffle %v4int %9416 %9416 0 0 1 1\n      %18618 = OpShiftLeftLogical %v4int %24795 %290\n      %15770 = OpShiftRightArithmetic %v4int %18618 %770\n      %10952 = OpConvertSToF %v4float %15770\n      %18228 = OpVectorTimesScalar %v4float %10952 %float_0_000976592302\n      %25243 = OpExtInst %v4float %1 FMax %1284 %18228\n      %14197 = OpVectorShuffle %v2uint %11216 %11216 0 1\n       %9417 = OpBitcast %v2int %14197\n      %24796 = OpVectorShuffle %v4int %9417 %9417 0 0 1 1\n      %18619 = OpShiftLeftLogical %v4int %24796 %290\n      %15771 = OpShiftRightArithmetic %v4int %18619 %770\n      %10953 = OpConvertSToF %v4float %15771\n      %18229 = OpVectorTimesScalar %v4float %10953 %float_0_000976592302\n      %25244 = OpExtInst %v4float %1 FMax %1284 %18229\n      %14198 = OpVectorShuffle %v2uint %11216 %11216 2 3\n       %9418 = OpBitcast %v2int %14198\n      %24797 = OpVectorShuffle %v4int %9418 %9418 0 0 1 1\n      %18620 = OpShiftLeftLogical %v4int %24797 %290\n      %15772 = OpShiftRightArithmetic %v4int %18620 %770\n      %10954 = OpConvertSToF %v4float %15772\n      %21458 = OpVectorTimesScalar %v4float %10954 %float_0_000976592302\n      %17253 = OpExtInst %v4float %1 FMax %1284 %21458\n               OpBranch %20266\n      %20313 = OpLabel\n       %9764 = OpVectorShuffle %v2uint %14115 %14115 0 1\n      %20829 = OpBitcast %v2float %9764\n       %7048 = OpCompositeExtract %float %20829 0\n      %13427 = OpCompositeExtract %float %20829 1\n      %17041 = OpCompositeConstruct %v4float %7048 %13427 %float_0 %float_0\n      %16865 = OpVectorShuffle %v2uint %14115 %14115 2 3\n      %14182 = OpBitcast %v2float %16865\n       %7049 = OpCompositeExtract %float %14182 0\n      %13428 = OpCompositeExtract %float %14182 1\n      %17042 = OpCompositeConstruct %v4float %7049 %13428 %float_0 %float_0\n      %16866 = OpVectorShuffle %v2uint %11216 %11216 0 1\n      %14183 = OpBitcast %v2float %16866\n       %7050 = OpCompositeExtract %float %14183 0\n      %13429 = OpCompositeExtract %float %14183 1\n      %17043 = OpCompositeConstruct %v4float %7050 %13429 %float_0 %float_0\n      %16867 = OpVectorShuffle %v2uint %11216 %11216 2 3\n      %14184 = OpBitcast %v2float %16867\n       %7051 = OpCompositeExtract %float %14184 0\n      %16651 = OpCompositeExtract %float %14184 1\n       %9052 = OpCompositeConstruct %v4float %7051 %16651 %float_0 %float_0\n               OpBranch %20266\n      %20266 = OpLabel\n      %11185 = OpPhi %v4float %9052 %20313 %17253 %8539 %9051 %8250\n      %14354 = OpPhi %v4float %17043 %20313 %25244 %8539 %14627 %8250\n      %15236 = OpPhi %v4float %17042 %20313 %25243 %8539 %14626 %8250\n      %14525 = OpPhi %v4float %17041 %20313 %25242 %8539 %14625 %8250\n               OpBranch %21266\n      %21266 = OpLabel\n      %11186 = OpPhi %v4float %11185 %20266 %11184 %16227\n      %14355 = OpPhi %v4float %14354 %20266 %14353 %16227\n      %12951 = OpPhi %v4float %15236 %20266 %15235 %16227\n      %13948 = OpPhi %v4float %14525 %20266 %14524 %16227\n      %17243 = OpFAdd %v4float %17242 %13948\n      %23299 = OpFAdd %v4float %23298 %12951\n       %9507 = OpFAdd %v4float %7208 %14355\n       %7799 = OpFAdd %v4float %9642 %11186\n               OpBranch %24266\n      %24266 = OpLabel\n      %11187 = OpPhi %v4float %20755 %21264 %7799 %21266\n      %14356 = OpPhi %v4float %8082 %21264 %9507 %21266\n      %15153 = OpPhi %v4float %23297 %21264 %23299 %21266\n      %15237 = OpPhi %v4float %17241 %21264 %17243 %21266\n      %14526 = OpPhi %float %23069 %21264 %12090 %21266\n               OpBranch %21267\n      %21267 = OpLabel\n      %11188 = OpPhi %v4float %11177 %21263 %11187 %24266\n      %14357 = OpPhi %v4float %14346 %21263 %14356 %24266\n      %15154 = OpPhi %v4float %13804 %21263 %15153 %24266\n      %13196 = OpPhi %v4float %8403 %21263 %15237 %24266\n      %11944 = OpPhi %float %11052 %21263 %14526 %24266\n      %23156 = OpVectorTimesScalar %v4float %13196 %11944\n       %6604 = OpVectorTimesScalar %v4float %15154 %11944\n      %12399 = OpVectorTimesScalar %v4float %14357 %11944\n      %13362 = OpVectorTimesScalar %v4float %11188 %11944\n               OpSelectionMerge %16228 DontFlatten\n               OpBranchConditional %7475 %10049 %16228\n      %10049 = OpLabel\n      %15086 = OpVectorShuffle %v4float %23156 %23156 2 1 0 3\n      %14855 = OpVectorShuffle %v4float %6604 %6604 2 1 0 3\n       %7398 = OpVectorShuffle %v4float %12399 %12399 2 1 0 3\n      %16111 = OpVectorShuffle %v4float %13362 %13362 2 1 0 3\n               OpBranch %16228\n      %16228 = OpLabel\n      %11189 = OpPhi %v4float %13362 %21267 %16111 %10049\n      %14358 = OpPhi %v4float %12399 %21267 %7398 %10049\n      %15191 = OpPhi %v4float %6604 %21267 %14855 %10049\n      %14921 = OpPhi %v4float %23156 %21267 %15086 %10049\n               OpSelectionMerge %18834 None\n               OpSwitch %20627 %8194 6 %18070 14 %18070 50 %18070 7 %17906 54 %17906 16 %6453 55 %6453 17 %6452 56 %6452 25 %6451 31 %9492\n       %9492 = OpLabel\n      %15022 = OpCompositeExtract %float %14921 0\n       %9197 = OpCompositeExtract %float %14921 1\n      %19232 = OpCompositeConstruct %v2float %15022 %9197\n       %8561 = OpExtInst %uint %1 PackHalf2x16 %19232\n      %23487 = OpCompositeExtract %float %15191 0\n      %14759 = OpCompositeExtract %float %15191 1\n      %19233 = OpCompositeConstruct %v2float %23487 %14759\n       %8562 = OpExtInst %uint %1 PackHalf2x16 %19233\n      %23488 = OpCompositeExtract %float %14358 0\n      %14760 = OpCompositeExtract %float %14358 1\n      %19234 = OpCompositeConstruct %v2float %23488 %14760\n       %8563 = OpExtInst %uint %1 PackHalf2x16 %19234\n      %23489 = OpCompositeExtract %float %11189 0\n      %14761 = OpCompositeExtract %float %11189 1\n      %19213 = OpCompositeConstruct %v2float %23489 %14761\n      %11926 = OpExtInst %uint %1 PackHalf2x16 %19213\n      %24879 = OpCompositeConstruct %v4uint %8561 %8562 %8563 %11926\n               OpBranch %18834\n       %6451 = OpLabel\n       %8826 = OpVectorShuffle %v2float %14921 %14921 0 1\n      %23729 = OpExtInst %v2float %1 FClamp %8826 %1823 %768\n       %9652 = OpVectorTimesScalar %v2float %23729 %float_65535\n      %11878 = OpFAdd %v2float %9652 %1566\n       %7639 = OpConvertFToU %v2uint %11878\n       %8700 = OpCompositeExtract %uint %7639 0\n      %12251 = OpCompositeExtract %uint %7639 1\n      %11523 = OpShiftLeftLogical %uint %12251 %int_16\n      %16707 = OpBitwiseOr %uint %8700 %11523\n       %9053 = OpVectorShuffle %v2float %15191 %15191 0 1\n      %18111 = OpExtInst %v2float %1 FClamp %9053 %1823 %768\n       %9653 = OpVectorTimesScalar %v2float %18111 %float_65535\n      %11879 = OpFAdd %v2float %9653 %1566\n       %7641 = OpConvertFToU %v2uint %11879\n       %8701 = OpCompositeExtract %uint %7641 0\n      %12252 = OpCompositeExtract %uint %7641 1\n      %11524 = OpShiftLeftLogical %uint %12252 %int_16\n      %16708 = OpBitwiseOr %uint %8701 %11524\n       %9054 = OpVectorShuffle %v2float %14358 %14358 0 1\n      %18112 = OpExtInst %v2float %1 FClamp %9054 %1823 %768\n       %9654 = OpVectorTimesScalar %v2float %18112 %float_65535\n      %11881 = OpFAdd %v2float %9654 %1566\n       %7642 = OpConvertFToU %v2uint %11881\n       %8702 = OpCompositeExtract %uint %7642 0\n      %12253 = OpCompositeExtract %uint %7642 1\n      %11525 = OpShiftLeftLogical %uint %12253 %int_16\n      %16709 = OpBitwiseOr %uint %8702 %11525\n       %9055 = OpVectorShuffle %v2float %11189 %11189 0 1\n      %18113 = OpExtInst %v2float %1 FClamp %9055 %1823 %768\n       %9655 = OpVectorTimesScalar %v2float %18113 %float_65535\n      %11882 = OpFAdd %v2float %9655 %1566\n       %7643 = OpConvertFToU %v2uint %11882\n       %8703 = OpCompositeExtract %uint %7643 0\n      %12254 = OpCompositeExtract %uint %7643 1\n      %11542 = OpShiftLeftLogical %uint %12254 %int_16\n      %20994 = OpBitwiseOr %uint %8703 %11542\n      %21469 = OpCompositeConstruct %v4uint %16707 %16708 %16709 %20994\n               OpBranch %18834\n       %6452 = OpLabel\n       %8655 = OpVectorShuffle %v3float %14921 %14921 0 1 2\n       %6215 = OpExtInst %v3float %1 FClamp %8655 %2605 %2584\n       %7105 = OpFMul %v3float %6215 %14\n       %7962 = OpFAdd %v3float %7105 %939\n      %10066 = OpConvertFToU %v3uint %7962\n       %8704 = OpCompositeExtract %uint %10066 0\n      %12255 = OpCompositeExtract %uint %10066 1\n      %11561 = OpShiftLeftLogical %uint %12255 %int_10\n      %19814 = OpBitwiseOr %uint %8704 %11561\n      %21476 = OpCompositeExtract %uint %10066 2\n       %8525 = OpShiftLeftLogical %uint %21476 %int_21\n      %16710 = OpBitwiseOr %uint %19814 %8525\n       %8866 = OpVectorShuffle %v3float %15191 %15191 0 1 2\n      %19668 = OpExtInst %v3float %1 FClamp %8866 %2605 %2584\n       %7106 = OpFMul %v3float %19668 %14\n       %7963 = OpFAdd %v3float %7106 %939\n      %10067 = OpConvertFToU %v3uint %7963\n       %8705 = OpCompositeExtract %uint %10067 0\n      %12256 = OpCompositeExtract %uint %10067 1\n      %11562 = OpShiftLeftLogical %uint %12256 %int_10\n      %19815 = OpBitwiseOr %uint %8705 %11562\n      %21477 = OpCompositeExtract %uint %10067 2\n       %8526 = OpShiftLeftLogical %uint %21477 %int_21\n      %16711 = OpBitwiseOr %uint %19815 %8526\n       %8867 = OpVectorShuffle %v3float %14358 %14358 0 1 2\n      %19669 = OpExtInst %v3float %1 FClamp %8867 %2605 %2584\n       %7107 = OpFMul %v3float %19669 %14\n       %7964 = OpFAdd %v3float %7107 %939\n      %10068 = OpConvertFToU %v3uint %7964\n       %8706 = OpCompositeExtract %uint %10068 0\n      %12257 = OpCompositeExtract %uint %10068 1\n      %11563 = OpShiftLeftLogical %uint %12257 %int_10\n      %19816 = OpBitwiseOr %uint %8706 %11563\n      %21478 = OpCompositeExtract %uint %10068 2\n       %8527 = OpShiftLeftLogical %uint %21478 %int_21\n      %16712 = OpBitwiseOr %uint %19816 %8527\n       %8868 = OpVectorShuffle %v3float %11189 %11189 0 1 2\n      %19675 = OpExtInst %v3float %1 FClamp %8868 %2605 %2584\n       %7108 = OpFMul %v3float %19675 %14\n       %7965 = OpFAdd %v3float %7108 %939\n      %10069 = OpConvertFToU %v3uint %7965\n       %8707 = OpCompositeExtract %uint %10069 0\n      %12258 = OpCompositeExtract %uint %10069 1\n      %11564 = OpShiftLeftLogical %uint %12258 %int_10\n      %19817 = OpBitwiseOr %uint %8707 %11564\n      %21479 = OpCompositeExtract %uint %10069 2\n       %8541 = OpShiftLeftLogical %uint %21479 %int_21\n      %20995 = OpBitwiseOr %uint %19817 %8541\n      %21470 = OpCompositeConstruct %v4uint %16710 %16711 %16712 %20995\n               OpBranch %18834\n       %6453 = OpLabel\n       %8656 = OpVectorShuffle %v3float %14921 %14921 0 1 2\n       %6216 = OpExtInst %v3float %1 FClamp %8656 %2605 %2584\n       %7109 = OpFMul %v3float %6216 %2275\n       %7966 = OpFAdd %v3float %7109 %939\n      %10070 = OpConvertFToU %v3uint %7966\n       %8708 = OpCompositeExtract %uint %10070 0\n      %12259 = OpCompositeExtract %uint %10070 1\n      %11565 = OpShiftLeftLogical %uint %12259 %int_11\n      %19818 = OpBitwiseOr %uint %8708 %11565\n      %21480 = OpCompositeExtract %uint %10070 2\n       %8528 = OpShiftLeftLogical %uint %21480 %int_22\n      %16713 = OpBitwiseOr %uint %19818 %8528\n       %8869 = OpVectorShuffle %v3float %15191 %15191 0 1 2\n      %19676 = OpExtInst %v3float %1 FClamp %8869 %2605 %2584\n       %7110 = OpFMul %v3float %19676 %2275\n       %7967 = OpFAdd %v3float %7110 %939\n      %10071 = OpConvertFToU %v3uint %7967\n       %8709 = OpCompositeExtract %uint %10071 0\n      %12260 = OpCompositeExtract %uint %10071 1\n      %11566 = OpShiftLeftLogical %uint %12260 %int_11\n      %19819 = OpBitwiseOr %uint %8709 %11566\n      %21481 = OpCompositeExtract %uint %10071 2\n       %8529 = OpShiftLeftLogical %uint %21481 %int_22\n      %16714 = OpBitwiseOr %uint %19819 %8529\n       %8870 = OpVectorShuffle %v3float %14358 %14358 0 1 2\n      %19685 = OpExtInst %v3float %1 FClamp %8870 %2605 %2584\n       %7111 = OpFMul %v3float %19685 %2275\n       %7968 = OpFAdd %v3float %7111 %939\n      %10072 = OpConvertFToU %v3uint %7968\n       %8710 = OpCompositeExtract %uint %10072 0\n      %12261 = OpCompositeExtract %uint %10072 1\n      %11567 = OpShiftLeftLogical %uint %12261 %int_11\n      %19820 = OpBitwiseOr %uint %8710 %11567\n      %21482 = OpCompositeExtract %uint %10072 2\n       %8530 = OpShiftLeftLogical %uint %21482 %int_22\n      %16715 = OpBitwiseOr %uint %19820 %8530\n       %8872 = OpVectorShuffle %v3float %11189 %11189 0 1 2\n      %19686 = OpExtInst %v3float %1 FClamp %8872 %2605 %2584\n       %7112 = OpFMul %v3float %19686 %2275\n       %7969 = OpFAdd %v3float %7112 %939\n      %10073 = OpConvertFToU %v3uint %7969\n       %8711 = OpCompositeExtract %uint %10073 0\n      %12262 = OpCompositeExtract %uint %10073 1\n      %11568 = OpShiftLeftLogical %uint %12262 %int_11\n      %19821 = OpBitwiseOr %uint %8711 %11568\n      %21483 = OpCompositeExtract %uint %10073 2\n       %8542 = OpShiftLeftLogical %uint %21483 %int_22\n      %20996 = OpBitwiseOr %uint %19821 %8542\n      %21471 = OpCompositeConstruct %v4uint %16713 %16714 %16715 %20996\n               OpBranch %18834\n      %17906 = OpLabel\n       %8873 = OpExtInst %v4float %1 FClamp %14921 %2938 %1285\n      %17792 = OpFMul %v4float %8873 %344\n       %7970 = OpFAdd %v4float %17792 %325\n      %10074 = OpConvertFToU %v4uint %7970\n       %8712 = OpCompositeExtract %uint %10074 0\n      %12263 = OpCompositeExtract %uint %10074 1\n      %11569 = OpShiftLeftLogical %uint %12263 %int_10\n      %19822 = OpBitwiseOr %uint %8712 %11569\n      %21484 = OpCompositeExtract %uint %10074 2\n       %8560 = OpShiftLeftLogical %uint %21484 %int_20\n      %19823 = OpBitwiseOr %uint %19822 %8560\n      %21485 = OpCompositeExtract %uint %10074 3\n       %7292 = OpShiftLeftLogical %uint %21485 %int_30\n       %9084 = OpBitwiseOr %uint %19823 %7292\n       %9079 = OpExtInst %v4float %1 FClamp %15191 %2938 %1285\n      %24798 = OpFMul %v4float %9079 %344\n       %7971 = OpFAdd %v4float %24798 %325\n      %10075 = OpConvertFToU %v4uint %7971\n       %8713 = OpCompositeExtract %uint %10075 0\n      %12264 = OpCompositeExtract %uint %10075 1\n      %11570 = OpShiftLeftLogical %uint %12264 %int_10\n      %19824 = OpBitwiseOr %uint %8713 %11570\n      %21486 = OpCompositeExtract %uint %10075 2\n       %8564 = OpShiftLeftLogical %uint %21486 %int_20\n      %19825 = OpBitwiseOr %uint %19824 %8564\n      %21487 = OpCompositeExtract %uint %10075 3\n       %7293 = OpShiftLeftLogical %uint %21487 %int_30\n       %9085 = OpBitwiseOr %uint %19825 %7293\n       %9080 = OpExtInst %v4float %1 FClamp %14358 %2938 %1285\n      %24799 = OpFMul %v4float %9080 %344\n       %7972 = OpFAdd %v4float %24799 %325\n      %10076 = OpConvertFToU %v4uint %7972\n       %8714 = OpCompositeExtract %uint %10076 0\n      %12265 = OpCompositeExtract %uint %10076 1\n      %11571 = OpShiftLeftLogical %uint %12265 %int_10\n      %19826 = OpBitwiseOr %uint %8714 %11571\n      %21488 = OpCompositeExtract %uint %10076 2\n       %8565 = OpShiftLeftLogical %uint %21488 %int_20\n      %19827 = OpBitwiseOr %uint %19826 %8565\n      %21489 = OpCompositeExtract %uint %10076 3\n       %7294 = OpShiftLeftLogical %uint %21489 %int_30\n       %9086 = OpBitwiseOr %uint %19827 %7294\n       %9081 = OpExtInst %v4float %1 FClamp %11189 %2938 %1285\n      %24800 = OpFMul %v4float %9081 %344\n       %7973 = OpFAdd %v4float %24800 %325\n      %10077 = OpConvertFToU %v4uint %7973\n       %8715 = OpCompositeExtract %uint %10077 0\n      %12266 = OpCompositeExtract %uint %10077 1\n      %11572 = OpShiftLeftLogical %uint %12266 %int_10\n      %19828 = OpBitwiseOr %uint %8715 %11572\n      %21490 = OpCompositeExtract %uint %10077 2\n       %8566 = OpShiftLeftLogical %uint %21490 %int_20\n      %19829 = OpBitwiseOr %uint %19828 %8566\n      %21491 = OpCompositeExtract %uint %10077 3\n       %8543 = OpShiftLeftLogical %uint %21491 %int_30\n      %20997 = OpBitwiseOr %uint %19829 %8543\n      %21472 = OpCompositeConstruct %v4uint %9084 %9085 %9086 %20997\n               OpBranch %18834\n      %18070 = OpLabel\n       %7311 = OpExtInst %v4float %1 FClamp %14921 %2938 %1285\n      %20339 = OpVectorTimesScalar %v4float %7311 %float_255\n      %11883 = OpFAdd %v4float %20339 %325\n       %7644 = OpConvertFToU %v4uint %11883\n       %8716 = OpCompositeExtract %uint %7644 0\n      %12267 = OpCompositeExtract %uint %7644 1\n      %11573 = OpShiftLeftLogical %uint %12267 %int_8\n      %19830 = OpBitwiseOr %uint %8716 %11573\n      %21492 = OpCompositeExtract %uint %7644 2\n       %8567 = OpShiftLeftLogical %uint %21492 %int_16\n      %19831 = OpBitwiseOr %uint %19830 %8567\n      %21493 = OpCompositeExtract %uint %7644 3\n       %7295 = OpShiftLeftLogical %uint %21493 %int_24\n       %9255 = OpBitwiseOr %uint %19831 %7295\n       %7522 = OpExtInst %v4float %1 FClamp %15191 %2938 %1285\n       %8264 = OpVectorTimesScalar %v4float %7522 %float_255\n      %11884 = OpFAdd %v4float %8264 %325\n       %7645 = OpConvertFToU %v4uint %11884\n       %8717 = OpCompositeExtract %uint %7645 0\n      %12268 = OpCompositeExtract %uint %7645 1\n      %11574 = OpShiftLeftLogical %uint %12268 %int_8\n      %19832 = OpBitwiseOr %uint %8717 %11574\n      %21494 = OpCompositeExtract %uint %7645 2\n       %8568 = OpShiftLeftLogical %uint %21494 %int_16\n      %19833 = OpBitwiseOr %uint %19832 %8568\n      %21495 = OpCompositeExtract %uint %7645 3\n       %7296 = OpShiftLeftLogical %uint %21495 %int_24\n       %9256 = OpBitwiseOr %uint %19833 %7296\n       %7523 = OpExtInst %v4float %1 FClamp %14358 %2938 %1285\n       %8265 = OpVectorTimesScalar %v4float %7523 %float_255\n      %11885 = OpFAdd %v4float %8265 %325\n       %7646 = OpConvertFToU %v4uint %11885\n       %8718 = OpCompositeExtract %uint %7646 0\n      %12269 = OpCompositeExtract %uint %7646 1\n      %11575 = OpShiftLeftLogical %uint %12269 %int_8\n      %19834 = OpBitwiseOr %uint %8718 %11575\n      %21496 = OpCompositeExtract %uint %7646 2\n       %8569 = OpShiftLeftLogical %uint %21496 %int_16\n      %19835 = OpBitwiseOr %uint %19834 %8569\n      %21497 = OpCompositeExtract %uint %7646 3\n       %7297 = OpShiftLeftLogical %uint %21497 %int_24\n       %9257 = OpBitwiseOr %uint %19835 %7297\n       %7524 = OpExtInst %v4float %1 FClamp %11189 %2938 %1285\n       %8266 = OpVectorTimesScalar %v4float %7524 %float_255\n      %11886 = OpFAdd %v4float %8266 %325\n       %7647 = OpConvertFToU %v4uint %11886\n       %8719 = OpCompositeExtract %uint %7647 0\n      %12270 = OpCompositeExtract %uint %7647 1\n      %11576 = OpShiftLeftLogical %uint %12270 %int_8\n      %19836 = OpBitwiseOr %uint %8719 %11576\n      %21498 = OpCompositeExtract %uint %7647 2\n       %8570 = OpShiftLeftLogical %uint %21498 %int_16\n      %19837 = OpBitwiseOr %uint %19836 %8570\n      %21499 = OpCompositeExtract %uint %7647 3\n       %8544 = OpShiftLeftLogical %uint %21499 %int_24\n      %20998 = OpBitwiseOr %uint %19837 %8544\n      %21473 = OpCompositeConstruct %v4uint %9255 %9256 %9257 %20998\n               OpBranch %18834\n       %8194 = OpLabel\n      %12446 = OpCompositeExtract %float %14921 0\n      %21144 = OpBitcast %uint %12446\n      %20301 = OpCompositeExtract %float %15191 0\n      %17693 = OpBitcast %uint %20301\n      %20302 = OpCompositeExtract %float %14358 0\n      %17694 = OpBitcast %uint %20302\n      %20280 = OpCompositeExtract %float %11189 0\n      %20246 = OpBitcast %uint %20280\n      %10040 = OpCompositeConstruct %v4uint %21144 %17693 %17694 %20246\n               OpBranch %18834\n      %18834 = OpLabel\n      %24188 = OpPhi %v4uint %10040 %8194 %21473 %18070 %21472 %17906 %21471 %6453 %21470 %6452 %21469 %6451 %24879 %9492\n      %24753 = OpIEqual %bool %7640 %uint_0\n               OpSelectionMerge %13276 None\n               OpBranchConditional %24753 %11451 %13276\n      %11451 = OpLabel\n      %24159 = OpCompositeExtract %uint %19124 0\n      %22470 = OpINotEqual %bool %24159 %uint_0\n               OpBranch %13276\n      %13276 = OpLabel\n      %10955 = OpPhi %bool %24753 %18834 %22470 %11451\n               OpSelectionMerge %19649 DontFlatten\n               OpBranchConditional %10955 %11508 %19649\n      %11508 = OpLabel\n      %23599 = OpCompositeExtract %uint %19124 0\n      %17346 = OpUGreaterThanEqual %bool %23599 %uint_2\n               OpSelectionMerge %18757 None\n               OpBranchConditional %17346 %15877 %18757\n      %15877 = OpLabel\n      %24532 = OpUGreaterThanEqual %bool %23599 %uint_3\n               OpSelectionMerge %18756 None\n               OpBranchConditional %24532 %9760 %18756\n       %9760 = OpLabel\n      %20482 = OpCompositeExtract %uint %24188 3\n      %14335 = OpCompositeInsert %v4uint %20482 %24188 2\n               OpBranch %18756\n      %18756 = OpLabel\n      %17379 = OpPhi %v4uint %24188 %15877 %14335 %9760\n       %7002 = OpCompositeExtract %uint %17379 2\n      %15144 = OpCompositeInsert %v4uint %7002 %17379 1\n               OpBranch %18757\n      %18757 = OpLabel\n      %17380 = OpPhi %v4uint %24188 %11508 %15144 %18756\n       %7003 = OpCompositeExtract %uint %17380 1\n      %15145 = OpCompositeInsert %v4uint %7003 %17380 0\n               OpBranch %19649\n      %19649 = OpLabel\n      %11376 = OpPhi %v4uint %24188 %13276 %15145 %18757\n      %19932 = OpIAdd %v2uint %12025 %23020\n      %24181 = OpShiftRightLogical %v2uint %19932 %1856\n       %7712 = OpUDiv %v2uint %24181 %23601\n      %18183 = OpIMul %v2uint %23601 %7712\n      %18273 = OpISub %v2uint %24181 %18183\n      %11232 = OpShiftLeftLogical %v2uint %7712 %1856\n      %13284 = OpCompositeExtract %uint %18273 0\n      %10872 = OpCompositeExtract %uint %23601 1\n      %22887 = OpIMul %uint %13284 %10872\n       %6943 = OpCompositeExtract %uint %18273 1\n      %10469 = OpIAdd %uint %22887 %6943\n      %18858 = OpBitwiseAnd %v2uint %19932 %1955\n      %10581 = OpShiftLeftLogical %uint %10469 %uint_7\n      %20916 = OpCompositeExtract %uint %18858 1\n      %23596 = OpShiftLeftLogical %uint %20916 %uint_6\n      %19838 = OpBitwiseOr %uint %10581 %23596\n      %21500 = OpCompositeExtract %uint %18858 0\n      %11739 = OpShiftLeftLogical %uint %21500 %uint_2\n      %11193 = OpBitwiseOr %uint %19838 %11739\n               OpSelectionMerge %21313 DontFlatten\n               OpBranchConditional %20495 %10574 %21373\n      %21373 = OpLabel\n      %10608 = OpBitcast %v2int %11232\n      %17907 = OpCompositeExtract %int %10608 1\n      %19904 = OpShiftRightArithmetic %int %17907 %int_5\n      %22412 = OpBitcast %int %8444\n       %7938 = OpIMul %int %19904 %22412\n      %25154 = OpCompositeExtract %int %10608 0\n      %20423 = OpShiftRightArithmetic %int %25154 %int_5\n      %18875 = OpIAdd %int %7938 %20423\n       %9546 = OpShiftLeftLogical %int %18875 %int_6\n      %24635 = OpShiftRightArithmetic %int %17907 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25154 %int_7\n      %11041 = OpBitwiseOr %int %21322 %20133\n      %17334 = OpBitwiseOr %int %9546 %11041\n      %24163 = OpShiftLeftLogical %int %17334 %uint_2\n      %12766 = OpShiftRightArithmetic %int %17907 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25154 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %17907 %int_3\n      %20574 = OpBitwiseAnd %int %10425 %int_1\n      %21533 = OpShiftLeftLogical %int %20574 %int_1\n       %8890 = OpBitwiseXor %int %20766 %21533\n      %20598 = OpBitwiseAnd %int %17907 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6551\n       %7168 = OpShiftLeftLogical %int %21575 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24163 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24163 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24163 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24163 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %21313\n      %10574 = OpLabel\n      %19866 = OpCompositeExtract %uint %11232 0\n      %11267 = OpCompositeExtract %uint %11232 1\n       %8414 = OpCompositeConstruct %v3uint %19866 %11267 %24434\n      %20125 = OpBitcast %v3int %8414\n      %11255 = OpCompositeExtract %int %20125 2\n      %19905 = OpShiftRightArithmetic %int %11255 %int_2\n      %22413 = OpBitcast %int %25203\n       %7939 = OpIMul %int %19905 %22413\n      %25155 = OpCompositeExtract %int %20125 1\n      %19055 = OpShiftRightArithmetic %int %25155 %int_4\n      %11053 = OpIAdd %int %7939 %19055\n      %16898 = OpBitcast %int %8444\n      %14944 = OpIMul %int %11053 %16898\n      %25156 = OpCompositeExtract %int %20125 0\n      %20424 = OpShiftRightArithmetic %int %25156 %int_5\n      %18940 = OpIAdd %int %14944 %20424\n       %8797 = OpShiftLeftLogical %int %18940 %int_7\n      %11434 = OpBitwiseAnd %int %11255 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %25155 %int_1\n      %21364 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21364 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %25156 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17335 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17335 %uint_2\n      %13015 = OpShiftRightArithmetic %int %25155 %int_3\n       %9929 = OpBitwiseXor %int %13015 %19905\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %25156 %int_3\n      %20575 = OpBitwiseAnd %int %9616 %int_3\n      %21534 = OpShiftLeftLogical %int %16793 %int_1\n       %8891 = OpBitwiseXor %int %20575 %21534\n      %20599 = OpBitwiseAnd %int %25155 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6552\n       %7169 = OpShiftLeftLogical %int %16793 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24144 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24144 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24144 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24144 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %21313\n      %21313 = OpLabel\n       %9506 = OpPhi %uint %16870 %10574 %16869 %21373\n      %16843 = OpIMul %uint %8858 %10872\n      %11993 = OpIMul %uint %9506 %16843\n      %16012 = OpIAdd %uint %11993 %11193\n      %20867 = OpShiftRightLogical %uint %16012 %int_4\n      %12010 = OpIEqual %bool %19164 %uint_1\n      %22390 = OpIEqual %bool %19164 %uint_2\n      %22150 = OpLogicalOr %bool %12010 %22390\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %11376 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %11376 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16377 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22650 = OpPhi %v4uint %11376 %21313 %16377 %10583\n      %19638 = OpIEqual %bool %19164 %uint_3\n      %15139 = OpLogicalOr %bool %22390 %19638\n               OpSelectionMerge %11416 None\n               OpBranchConditional %15139 %11064 %11416\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22650 %749\n      %15335 = OpShiftRightLogical %v4uint %22650 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %11416\n      %11416 = OpLabel\n      %19767 = OpPhi %v4uint %22650 %13411 %10728 %11064\n       %8053 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_dest %int_0 %20867\n               OpStore %8053 %19767\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t resolve_full_32bpp_scaled_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x0000629D, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000008, 0x00000008, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x000003F9, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x00090006, 0x000003F9, 0x00000000, 0x725F6578,\n    0x6C6F7365, 0x655F6576, 0x6D617264, 0x666E695F, 0x0000006F, 0x000A0006,\n    0x000003F9, 0x00000001, 0x725F6578, 0x6C6F7365, 0x635F6576, 0x64726F6F,\n    0x74616E69, 0x6E695F65, 0x00006F66, 0x00090006, 0x000003F9, 0x00000002,\n    0x725F6578, 0x6C6F7365, 0x645F6576, 0x5F747365, 0x6F666E69, 0x00000000,\n    0x000B0006, 0x000003F9, 0x00000003, 0x725F6578, 0x6C6F7365, 0x645F6576,\n    0x5F747365, 0x726F6F63, 0x616E6964, 0x695F6574, 0x006F666E, 0x00060005,\n    0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578, 0x00090005,\n    0x0000079C, 0x725F6578, 0x6C6F7365, 0x655F6576, 0x6D617264, 0x5F65785F,\n    0x636F6C62, 0x0000006B, 0x00050006, 0x0000079C, 0x00000000, 0x61746164,\n    0x00000000, 0x00070005, 0x00000CC7, 0x725F6578, 0x6C6F7365, 0x655F6576,\n    0x6D617264, 0x00000000, 0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C,\n    0x766E496C, 0x7461636F, 0x496E6F69, 0x00000044, 0x00090005, 0x000007B4,\n    0x725F6578, 0x6C6F7365, 0x645F6576, 0x5F747365, 0x625F6578, 0x6B636F6C,\n    0x00000000, 0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000,\n    0x00060005, 0x00001592, 0x725F6578, 0x6C6F7365, 0x645F6576, 0x00747365,\n    0x00030047, 0x000003F9, 0x00000002, 0x00050048, 0x000003F9, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x000003F9, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x000003F9, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x000003F9, 0x00000003, 0x00000023, 0x0000000C, 0x00040047,\n    0x000007D0, 0x00000006, 0x00000004, 0x00030047, 0x0000079C, 0x00000003,\n    0x00040048, 0x0000079C, 0x00000000, 0x00000018, 0x00050048, 0x0000079C,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x00000CC7, 0x00000018,\n    0x00040047, 0x00000CC7, 0x00000021, 0x00000000, 0x00040047, 0x00000CC7,\n    0x00000022, 0x00000000, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C,\n    0x00040047, 0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4,\n    0x00000003, 0x00040048, 0x000007B4, 0x00000000, 0x00000019, 0x00050048,\n    0x000007B4, 0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x00001592,\n    0x00000019, 0x00040047, 0x00001592, 0x00000021, 0x00000000, 0x00040047,\n    0x00001592, 0x00000022, 0x00000001, 0x00040047, 0x00000AC8, 0x0000000B,\n    0x00000019, 0x00020013, 0x00000008, 0x00030021, 0x00000502, 0x00000008,\n    0x00040015, 0x0000000C, 0x00000020, 0x00000001, 0x00040017, 0x00000012,\n    0x0000000C, 0x00000002, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x00040017, 0x00000017, 0x0000000B, 0x00000004,\n    0x00030016, 0x0000000D, 0x00000020, 0x00040017, 0x00000013, 0x0000000D,\n    0x00000002, 0x00040017, 0x00000018, 0x0000000D, 0x00000003, 0x00040017,\n    0x0000001D, 0x0000000D, 0x00000004, 0x00020014, 0x00000009, 0x00040017,\n    0x00000016, 0x0000000C, 0x00000003, 0x0004002B, 0x0000000D, 0x00000A0C,\n    0x00000000, 0x0004002B, 0x0000000D, 0x0000008A, 0x3F800000, 0x0004002B,\n    0x0000000B, 0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B, 0x00000A10,\n    0x00000002, 0x0004002B, 0x0000000B, 0x000008A6, 0x00FF00FF, 0x0004002B,\n    0x0000000B, 0x00000A22, 0x00000008, 0x0004002B, 0x0000000B, 0x000005FD,\n    0xFF00FF00, 0x0004002B, 0x0000000B, 0x00000A13, 0x00000003, 0x0004002B,\n    0x0000000B, 0x00000A3A, 0x00000010, 0x0004002B, 0x0000000D, 0x00000540,\n    0x437F0000, 0x0004002B, 0x0000000D, 0x000000FC, 0x3F000000, 0x0004002B,\n    0x0000000B, 0x00000A0A, 0x00000000, 0x0004002B, 0x0000000C, 0x00000A23,\n    0x00000008, 0x0004002B, 0x0000000C, 0x00000A3B, 0x00000010, 0x0004002B,\n    0x0000000C, 0x00000A53, 0x00000018, 0x0004002B, 0x0000000D, 0x00000409,\n    0x447FC000, 0x0004002B, 0x0000000D, 0x00000BA2, 0x40400000, 0x0007002C,\n    0x0000001D, 0x00000158, 0x00000409, 0x00000409, 0x00000409, 0x00000BA2,\n    0x0004002B, 0x0000000C, 0x00000A29, 0x0000000A, 0x0004002B, 0x0000000C,\n    0x00000A47, 0x00000014, 0x0004002B, 0x0000000C, 0x00000A65, 0x0000001E,\n    0x0004002B, 0x0000000D, 0x0000057F, 0x44FFE000, 0x0006002C, 0x00000018,\n    0x000008E3, 0x0000057F, 0x0000057F, 0x00000409, 0x0004002B, 0x0000000C,\n    0x00000A2C, 0x0000000B, 0x0004002B, 0x0000000C, 0x00000A4D, 0x00000016,\n    0x0006002C, 0x00000018, 0x0000000E, 0x00000409, 0x0000057F, 0x0000057F,\n    0x0004002B, 0x0000000C, 0x00000A4A, 0x00000015, 0x0004002B, 0x0000000D,\n    0x0000022D, 0x477FFF00, 0x0004002B, 0x0000000B, 0x00000A52, 0x00000018,\n    0x0007002C, 0x00000017, 0x0000028D, 0x00000A0A, 0x00000A22, 0x00000A3A,\n    0x00000A52, 0x0004002B, 0x0000000B, 0x00000144, 0x000000FF, 0x0004002B,\n    0x0000000D, 0x0000017A, 0x3B808081, 0x0004002B, 0x0000000B, 0x00000A28,\n    0x0000000A, 0x0004002B, 0x0000000B, 0x00000A46, 0x00000014, 0x0004002B,\n    0x0000000B, 0x00000A64, 0x0000001E, 0x0007002C, 0x00000017, 0x0000034D,\n    0x00000A0A, 0x00000A28, 0x00000A46, 0x00000A64, 0x0004002B, 0x0000000B,\n    0x00000A44, 0x000003FF, 0x0007002C, 0x00000017, 0x0000027B, 0x00000A44,\n    0x00000A44, 0x00000A44, 0x00000A13, 0x0004002B, 0x0000000D, 0x000006FE,\n    0x3A802008, 0x0004002B, 0x0000000D, 0x00000149, 0x3EAAAAAB, 0x0007002C,\n    0x0000001D, 0x00000AEE, 0x000006FE, 0x000006FE, 0x000006FE, 0x00000149,\n    0x0006002C, 0x00000014, 0x00000BB4, 0x00000A0A, 0x00000A28, 0x00000A46,\n    0x0004002B, 0x0000000B, 0x00000B87, 0x0000007F, 0x0004002B, 0x0000000B,\n    0x00000A1F, 0x00000007, 0x00040017, 0x00000010, 0x00000009, 0x00000003,\n    0x0004002B, 0x0000000B, 0x00000B7E, 0x0000007C, 0x0004002B, 0x0000000B,\n    0x00000A4F, 0x00000017, 0x0004002B, 0x0000000D, 0x00000341, 0xBF800000,\n    0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000, 0x0005002C, 0x00000012,\n    0x000007A7, 0x00000A3B, 0x00000A0B, 0x0004002B, 0x0000000D, 0x000007FE,\n    0x3A800100, 0x00040017, 0x0000001A, 0x0000000C, 0x00000004, 0x0007002C,\n    0x0000001A, 0x00000122, 0x00000A3B, 0x00000A0B, 0x00000A3B, 0x00000A0B,\n    0x0005002C, 0x00000011, 0x0000072D, 0x00000A10, 0x00000A0D, 0x00040017,\n    0x0000000F, 0x00000009, 0x00000002, 0x0005002C, 0x00000011, 0x0000070F,\n    0x00000A0A, 0x00000A0A, 0x0005002C, 0x00000011, 0x00000724, 0x00000A0D,\n    0x00000A0D, 0x0005002C, 0x00000011, 0x00000718, 0x00000A0D, 0x00000A0A,\n    0x0004002B, 0x0000000B, 0x00000AFA, 0x00000050, 0x0005002C, 0x00000011,\n    0x00000A9F, 0x00000AFA, 0x00000A3A, 0x0004002B, 0x0000000B, 0x00000A84,\n    0x00000800, 0x0004002B, 0x0000000C, 0x00000A11, 0x00000002, 0x0004002B,\n    0x0000000C, 0x00000A17, 0x00000004, 0x0004002B, 0x0000000C, 0x00000A1D,\n    0x00000006, 0x0004002B, 0x0000000C, 0x00000A38, 0x0000000F, 0x0004002B,\n    0x0000000C, 0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C, 0x00000A1A,\n    0x00000005, 0x0004002B, 0x0000000C, 0x00000A20, 0x00000007, 0x0004002B,\n    0x0000000C, 0x00000A2F, 0x0000000C, 0x0004002B, 0x0000000C, 0x00000A14,\n    0x00000003, 0x0004002B, 0x0000000B, 0x00000A19, 0x00000005, 0x0004002B,\n    0x0000000B, 0x00000A16, 0x00000004, 0x0006001E, 0x000003F9, 0x0000000B,\n    0x0000000B, 0x0000000B, 0x0000000B, 0x00040020, 0x00000676, 0x00000009,\n    0x000003F9, 0x0004003B, 0x00000676, 0x00000CE9, 0x00000009, 0x00040020,\n    0x00000288, 0x00000009, 0x0000000B, 0x0004002B, 0x0000000B, 0x00000A31,\n    0x0000000D, 0x0004002B, 0x0000000B, 0x00000A81, 0x000007FF, 0x0004002B,\n    0x0000000B, 0x00000A37, 0x0000000F, 0x0004002B, 0x0000000B, 0x00000A5E,\n    0x0000001C, 0x0004002B, 0x0000000B, 0x00000A43, 0x00000013, 0x0005002C,\n    0x00000011, 0x00000883, 0x00000A3A, 0x00000A43, 0x0004002B, 0x0000000B,\n    0x00000510, 0x20000000, 0x0005002C, 0x00000011, 0x0000073F, 0x00000A0A,\n    0x00000A16, 0x0005002C, 0x00000011, 0x00000740, 0x00000A16, 0x00000A0D,\n    0x0004002B, 0x0000000B, 0x00000AC7, 0x0000003F, 0x0004002B, 0x0000000C,\n    0x00000A59, 0x0000001A, 0x0004002B, 0x0000000C, 0x00000A50, 0x00000017,\n    0x0004002B, 0x0000000B, 0x00000926, 0x01000000, 0x0005002C, 0x00000011,\n    0x000008E4, 0x00000A46, 0x00000A52, 0x0003001D, 0x000007D0, 0x0000000B,\n    0x0003001E, 0x0000079C, 0x000007D0, 0x00040020, 0x00000A1B, 0x00000002,\n    0x0000079C, 0x0004003B, 0x00000A1B, 0x00000CC7, 0x00000002, 0x00040020,\n    0x00000289, 0x00000002, 0x0000000B, 0x0004002B, 0x0000000B, 0x00000207,\n    0x00000140, 0x0004002B, 0x0000000B, 0x00000A1C, 0x00000006, 0x00040020,\n    0x00000291, 0x00000001, 0x00000014, 0x0004003B, 0x00000291, 0x00000F48,\n    0x00000001, 0x0005002C, 0x00000011, 0x00000721, 0x00000A10, 0x00000A0A,\n    0x0003001D, 0x000007DC, 0x00000017, 0x0003001E, 0x000007B4, 0x000007DC,\n    0x00040020, 0x00000A32, 0x00000002, 0x000007B4, 0x0004003B, 0x00000A32,\n    0x00001592, 0x00000002, 0x00040020, 0x00000294, 0x00000002, 0x00000017,\n    0x0006002C, 0x00000014, 0x00000AC8, 0x00000A22, 0x00000A22, 0x00000A0D,\n    0x0005002C, 0x00000011, 0x000007A2, 0x00000A1F, 0x00000A1F, 0x0005002C,\n    0x00000011, 0x000007A3, 0x00000A37, 0x00000A0D, 0x0005002C, 0x00000011,\n    0x0000074E, 0x00000A13, 0x00000A13, 0x0005002C, 0x00000011, 0x0000084A,\n    0x00000A37, 0x00000A37, 0x0007002C, 0x0000001D, 0x00000504, 0x00000341,\n    0x00000341, 0x00000341, 0x00000341, 0x0007002C, 0x0000001A, 0x00000302,\n    0x00000A3B, 0x00000A3B, 0x00000A3B, 0x00000A3B, 0x0007002C, 0x00000017,\n    0x0000064B, 0x00000144, 0x00000144, 0x00000144, 0x00000144, 0x0006002C,\n    0x00000014, 0x00000105, 0x00000A44, 0x00000A44, 0x00000A44, 0x0006002C,\n    0x00000014, 0x00000466, 0x00000B87, 0x00000B87, 0x00000B87, 0x0006002C,\n    0x00000014, 0x00000B0C, 0x00000A1F, 0x00000A1F, 0x00000A1F, 0x0006002C,\n    0x00000014, 0x00000A12, 0x00000A0A, 0x00000A0A, 0x00000A0A, 0x0006002C,\n    0x00000014, 0x000003FA, 0x00000B7E, 0x00000B7E, 0x00000B7E, 0x0006002C,\n    0x00000014, 0x00000189, 0x00000A4F, 0x00000A4F, 0x00000A4F, 0x0006002C,\n    0x00000014, 0x0000008D, 0x00000A3A, 0x00000A3A, 0x00000A3A, 0x0005002C,\n    0x00000013, 0x00000049, 0x00000341, 0x00000341, 0x0005002C, 0x00000012,\n    0x00000867, 0x00000A3B, 0x00000A3B, 0x0007002C, 0x0000001D, 0x00000B7A,\n    0x00000A0C, 0x00000A0C, 0x00000A0C, 0x00000A0C, 0x0007002C, 0x0000001D,\n    0x00000505, 0x0000008A, 0x0000008A, 0x0000008A, 0x0000008A, 0x0007002C,\n    0x0000001D, 0x00000145, 0x000000FC, 0x000000FC, 0x000000FC, 0x000000FC,\n    0x0006002C, 0x00000018, 0x00000A2D, 0x00000A0C, 0x00000A0C, 0x00000A0C,\n    0x0006002C, 0x00000018, 0x00000A18, 0x0000008A, 0x0000008A, 0x0000008A,\n    0x0006002C, 0x00000018, 0x000003AB, 0x000000FC, 0x000000FC, 0x000000FC,\n    0x0005002C, 0x00000013, 0x0000071F, 0x00000A0C, 0x00000A0C, 0x0005002C,\n    0x00000013, 0x00000300, 0x0000008A, 0x0000008A, 0x0005002C, 0x00000013,\n    0x0000061E, 0x000000FC, 0x000000FC, 0x0007002C, 0x00000017, 0x000009CE,\n    0x000008A6, 0x000008A6, 0x000008A6, 0x000008A6, 0x0007002C, 0x00000017,\n    0x0000013D, 0x00000A22, 0x00000A22, 0x00000A22, 0x00000A22, 0x0007002C,\n    0x00000017, 0x0000072E, 0x000005FD, 0x000005FD, 0x000005FD, 0x000005FD,\n    0x0007002C, 0x00000017, 0x000002ED, 0x00000A3A, 0x00000A3A, 0x00000A3A,\n    0x00000A3A, 0x0004002B, 0x0000000C, 0x00000089, 0x3F800000, 0x0004002B,\n    0x0000000B, 0x000009F8, 0xFFFFFFFA, 0x0006002C, 0x00000014, 0x00000938,\n    0x000009F8, 0x000009F8, 0x000009F8, 0x0004002B, 0x0000000D, 0x0000016E,\n    0x3E800000, 0x00050036, 0x00000008, 0x0000161F, 0x00000000, 0x00000502,\n    0x000200F8, 0x00003B06, 0x000300F7, 0x00004C7A, 0x00000000, 0x000300FB,\n    0x00000A0A, 0x00002E68, 0x000200F8, 0x00002E68, 0x00050041, 0x00000288,\n    0x000056E5, 0x00000CE9, 0x00000A0B, 0x0004003D, 0x0000000B, 0x00003D0B,\n    0x000056E5, 0x00050041, 0x00000288, 0x000058AC, 0x00000CE9, 0x00000A0E,\n    0x0004003D, 0x0000000B, 0x00005158, 0x000058AC, 0x000500C7, 0x0000000B,\n    0x00005051, 0x00003D0B, 0x00000A44, 0x000500C2, 0x0000000B, 0x00004E0A,\n    0x00003D0B, 0x00000A28, 0x000500C7, 0x0000000B, 0x0000217E, 0x00004E0A,\n    0x00000A13, 0x000500C2, 0x0000000B, 0x0000520A, 0x00003D0B, 0x00000A31,\n    0x000500C7, 0x0000000B, 0x0000217F, 0x0000520A, 0x00000A81, 0x000500C2,\n    0x0000000B, 0x0000520B, 0x00003D0B, 0x00000A52, 0x000500C7, 0x0000000B,\n    0x00002180, 0x0000520B, 0x00000A37, 0x000500C2, 0x0000000B, 0x00004994,\n    0x00003D0B, 0x00000A5E, 0x000500C7, 0x0000000B, 0x000023AA, 0x00004994,\n    0x00000A0D, 0x00050050, 0x00000011, 0x000022A7, 0x00005158, 0x00005158,\n    0x000500C2, 0x00000011, 0x000025A1, 0x000022A7, 0x00000883, 0x000500C7,\n    0x00000011, 0x00005C31, 0x000025A1, 0x000007A2, 0x000500C7, 0x0000000B,\n    0x00005DDE, 0x00003D0B, 0x00000510, 0x000500AB, 0x00000009, 0x00003007,\n    0x00005DDE, 0x00000A0A, 0x000300F7, 0x00003954, 0x00000000, 0x000400FA,\n    0x00003007, 0x00004163, 0x000055E8, 0x000200F8, 0x000055E8, 0x000200F9,\n    0x00003954, 0x000200F8, 0x00004163, 0x000500C2, 0x00000011, 0x00003BAE,\n    0x00005C31, 0x00000724, 0x000200F9, 0x00003954, 0x000200F8, 0x00003954,\n    0x000700F5, 0x00000011, 0x00004AB4, 0x00003BAE, 0x00004163, 0x0000070F,\n    0x000055E8, 0x000500C2, 0x00000011, 0x00001B7E, 0x000022A7, 0x0000073F,\n    0x000500C7, 0x00000011, 0x00002DF9, 0x00001B7E, 0x000007A3, 0x000500C4,\n    0x00000011, 0x00003F4F, 0x00002DF9, 0x0000074E, 0x00050084, 0x00000011,\n    0x000059EB, 0x00003F4F, 0x00005C31, 0x000500C2, 0x0000000B, 0x00003343,\n    0x00005158, 0x00000A19, 0x000500C7, 0x0000000B, 0x000039C1, 0x00003343,\n    0x00000A81, 0x00050051, 0x0000000B, 0x0000229A, 0x00005C31, 0x00000000,\n    0x00050084, 0x0000000B, 0x000059D1, 0x000039C1, 0x0000229A, 0x00050041,\n    0x00000288, 0x00004E44, 0x00000CE9, 0x00000A11, 0x0004003D, 0x0000000B,\n    0x000048C4, 0x00004E44, 0x00050041, 0x00000288, 0x000058AD, 0x00000CE9,\n    0x00000A14, 0x0004003D, 0x0000000B, 0x000051B7, 0x000058AD, 0x000500C7,\n    0x0000000B, 0x00004ADC, 0x000048C4, 0x00000A1F, 0x000500C7, 0x0000000B,\n    0x000055EF, 0x000048C4, 0x00000A22, 0x000500AB, 0x00000009, 0x0000500F,\n    0x000055EF, 0x00000A0A, 0x000500C2, 0x0000000B, 0x00002843, 0x000048C4,\n    0x00000A16, 0x000500C7, 0x0000000B, 0x00005F72, 0x00002843, 0x00000A1F,\n    0x000500C2, 0x0000000B, 0x00004CD8, 0x000048C4, 0x00000A1F, 0x000500C7,\n    0x0000000B, 0x00005093, 0x00004CD8, 0x00000AC7, 0x0004007C, 0x0000000C,\n    0x00005988, 0x000048C4, 0x000500C4, 0x0000000C, 0x0000358F, 0x00005988,\n    0x00000A29, 0x000500C3, 0x0000000C, 0x0000509C, 0x0000358F, 0x00000A59,\n    0x000500C4, 0x0000000C, 0x00004702, 0x0000509C, 0x00000A50, 0x00050080,\n    0x0000000C, 0x00001D26, 0x00004702, 0x00000089, 0x0004007C, 0x0000000D,\n    0x00002B2C, 0x00001D26, 0x000500C7, 0x0000000B, 0x00005879, 0x000048C4,\n    0x00000926, 0x000500AB, 0x00000009, 0x00001D33, 0x00005879, 0x00000A0A,\n    0x000500C7, 0x0000000B, 0x000020FC, 0x000051B7, 0x00000A44, 0x000500C2,\n    0x0000000B, 0x00002F90, 0x000051B7, 0x00000A28, 0x000500C7, 0x0000000B,\n    0x000061CE, 0x00002F90, 0x00000A44, 0x000500C4, 0x0000000B, 0x00006273,\n    0x000061CE, 0x00000A0E, 0x00050050, 0x00000011, 0x000028B6, 0x000051B7,\n    0x000051B7, 0x000500C2, 0x00000011, 0x00002891, 0x000028B6, 0x000008E4,\n    0x000500C7, 0x00000011, 0x00005B53, 0x00002891, 0x0000084A, 0x000500C4,\n    0x00000011, 0x00003F50, 0x00005B53, 0x0000074E, 0x00050084, 0x00000011,\n    0x000059EC, 0x00003F50, 0x00005C31, 0x000500C2, 0x0000000B, 0x000031C7,\n    0x000051B7, 0x00000A5E, 0x000500C7, 0x0000000B, 0x00004356, 0x000031C7,\n    0x00000A1F, 0x0004003D, 0x00000014, 0x000031C1, 0x00000F48, 0x0007004F,\n    0x00000011, 0x000038A4, 0x000031C1, 0x000031C1, 0x00000000, 0x00000001,\n    0x000500C4, 0x00000011, 0x00002EF9, 0x000038A4, 0x00000721, 0x00050051,\n    0x0000000B, 0x00001DD8, 0x00002EF9, 0x00000000, 0x000500C4, 0x0000000B,\n    0x00002D8A, 0x000059D1, 0x00000A13, 0x000500AE, 0x00000009, 0x00003C13,\n    0x00001DD8, 0x00002D8A, 0x000300F7, 0x000036C9, 0x00000002, 0x000400FA,\n    0x00003C13, 0x000055E9, 0x000036C9, 0x000200F8, 0x000055E9, 0x000200F9,\n    0x00004C7A, 0x000200F8, 0x000036C9, 0x00050051, 0x0000000B, 0x000048B7,\n    0x00002EF9, 0x00000001, 0x00050051, 0x0000000B, 0x000041A3, 0x00004AB4,\n    0x00000001, 0x0007000C, 0x0000000B, 0x00005F7E, 0x00000001, 0x00000029,\n    0x000048B7, 0x000041A3, 0x00050050, 0x00000011, 0x000051EF, 0x00001DD8,\n    0x00005F7E, 0x00050080, 0x00000011, 0x0000522C, 0x000051EF, 0x000059EB,\n    0x000500B2, 0x00000009, 0x00003ECB, 0x00004356, 0x00000A13, 0x000300F7,\n    0x00005CE0, 0x00000000, 0x000400FA, 0x00003ECB, 0x00002AEE, 0x00003AEF,\n    0x000200F8, 0x00003AEF, 0x000500AA, 0x00000009, 0x000034FE, 0x00004356,\n    0x00000A19, 0x000600A9, 0x0000000B, 0x000020F6, 0x000034FE, 0x00000A10,\n    0x00000A0A, 0x000200F9, 0x00005CE0, 0x000200F8, 0x00002AEE, 0x000200F9,\n    0x00005CE0, 0x000200F8, 0x00005CE0, 0x000700F5, 0x0000000B, 0x00004B64,\n    0x00004356, 0x00002AEE, 0x000020F6, 0x00003AEF, 0x00050050, 0x00000011,\n    0x000041BE, 0x0000217E, 0x0000217E, 0x000500AE, 0x0000000F, 0x00002E19,\n    0x000041BE, 0x0000072D, 0x000600A9, 0x00000011, 0x00004BB5, 0x00002E19,\n    0x00000724, 0x0000070F, 0x000500C4, 0x00000011, 0x00002AEA, 0x0000522C,\n    0x00004BB5, 0x00050050, 0x00000011, 0x0000605D, 0x00004B64, 0x00004B64,\n    0x000500C2, 0x00000011, 0x00002385, 0x0000605D, 0x00000718, 0x000500C7,\n    0x00000011, 0x00003EC8, 0x00002385, 0x00000724, 0x00050080, 0x00000011,\n    0x000046BA, 0x00002AEA, 0x00003EC8, 0x00050084, 0x00000011, 0x00005998,\n    0x00000A9F, 0x00005C31, 0x00050050, 0x00000011, 0x00002C44, 0x000023AA,\n    0x00000A0A, 0x000500C2, 0x00000011, 0x000019AB, 0x00005998, 0x00002C44,\n    0x00050086, 0x00000011, 0x000027A2, 0x000046BA, 0x000019AB, 0x00050051,\n    0x0000000B, 0x00004FA6, 0x000027A2, 0x00000001, 0x00050084, 0x0000000B,\n    0x00002B26, 0x00004FA6, 0x00005051, 0x00050051, 0x0000000B, 0x00006059,\n    0x000027A2, 0x00000000, 0x00050080, 0x0000000B, 0x00005420, 0x00002B26,\n    0x00006059, 0x00050080, 0x0000000B, 0x00002226, 0x0000217F, 0x00005420,\n    0x00050084, 0x00000011, 0x00005768, 0x000027A2, 0x000019AB, 0x00050082,\n    0x00000011, 0x000050EB, 0x000046BA, 0x00005768, 0x00050051, 0x0000000B,\n    0x00001C87, 0x00005998, 0x00000000, 0x00050051, 0x0000000B, 0x00005962,\n    0x00005998, 0x00000001, 0x00050084, 0x0000000B, 0x00003372, 0x00001C87,\n    0x00005962, 0x00050084, 0x0000000B, 0x000038D7, 0x00002226, 0x00003372,\n    0x00050051, 0x0000000B, 0x00001A95, 0x000050EB, 0x00000001, 0x00050051,\n    0x0000000B, 0x00005BE6, 0x000019AB, 0x00000000, 0x00050084, 0x0000000B,\n    0x00005966, 0x00001A95, 0x00005BE6, 0x00050051, 0x0000000B, 0x00001AE6,\n    0x000050EB, 0x00000000, 0x00050080, 0x0000000B, 0x000025E0, 0x00005966,\n    0x00001AE6, 0x000500C4, 0x0000000B, 0x00004665, 0x000025E0, 0x000023AA,\n    0x00050080, 0x0000000B, 0x000047BB, 0x000038D7, 0x00004665, 0x00050084,\n    0x0000000B, 0x00003662, 0x00003372, 0x00000A84, 0x00050089, 0x0000000B,\n    0x00005410, 0x000047BB, 0x00003662, 0x000500C4, 0x0000000B, 0x00001E06,\n    0x00005410, 0x00000A11, 0x000500AE, 0x00000009, 0x00003652, 0x0000217E,\n    0x00000A10, 0x000600A9, 0x0000000B, 0x00002C0D, 0x00003652, 0x00000A0D,\n    0x00000A0A, 0x00050080, 0x0000000B, 0x00004E6A, 0x000023AA, 0x00002C0D,\n    0x000500C4, 0x0000000B, 0x0000199B, 0x00000A16, 0x00004E6A, 0x000500AB,\n    0x00000009, 0x00005AEF, 0x000023AA, 0x00000A0A, 0x000300F7, 0x0000530F,\n    0x00000002, 0x000400FA, 0x00005AEF, 0x00003B65, 0x000040B9, 0x000200F8,\n    0x000040B9, 0x000500AA, 0x00000009, 0x00004ADA, 0x0000199B, 0x00000A16,\n    0x000300F7, 0x00004F49, 0x00000002, 0x000400FA, 0x00004ADA, 0x000019BF,\n    0x000022FF, 0x000200F8, 0x000022FF, 0x000500C2, 0x0000000B, 0x00005630,\n    0x00001E06, 0x00000A11, 0x00060041, 0x00000289, 0x00003439, 0x00000CC7,\n    0x00000A0B, 0x00005630, 0x0004003D, 0x0000000B, 0x00003AD4, 0x00003439,\n    0x00050080, 0x0000000B, 0x00002145, 0x00001E06, 0x0000199B, 0x000500C2,\n    0x0000000B, 0x000054A6, 0x00002145, 0x00000A11, 0x00060041, 0x00000289,\n    0x00004CDD, 0x00000CC7, 0x00000A0B, 0x000054A6, 0x0004003D, 0x0000000B,\n    0x0000333A, 0x00004CDD, 0x00050084, 0x0000000B, 0x000021ED, 0x00000A10,\n    0x0000199B, 0x00050080, 0x0000000B, 0x00005EBE, 0x00001E06, 0x000021ED,\n    0x000500C2, 0x0000000B, 0x000045E2, 0x00005EBE, 0x00000A11, 0x00060041,\n    0x00000289, 0x00004CDE, 0x00000CC7, 0x00000A0B, 0x000045E2, 0x0004003D,\n    0x0000000B, 0x0000333B, 0x00004CDE, 0x00050084, 0x0000000B, 0x000021EE,\n    0x00000A13, 0x0000199B, 0x00050080, 0x0000000B, 0x00005EBF, 0x00001E06,\n    0x000021EE, 0x000500C2, 0x0000000B, 0x000045E3, 0x00005EBF, 0x00000A11,\n    0x00060041, 0x00000289, 0x00004901, 0x00000CC7, 0x00000A0B, 0x000045E3,\n    0x0004003D, 0x0000000B, 0x00005F59, 0x00004901, 0x00070050, 0x00000017,\n    0x0000512C, 0x00003AD4, 0x0000333A, 0x0000333B, 0x00005F59, 0x000200F9,\n    0x00004F49, 0x000200F8, 0x000019BF, 0x000500C2, 0x0000000B, 0x00005FA6,\n    0x00001E06, 0x00000A11, 0x00060041, 0x00000289, 0x0000343A, 0x00000CC7,\n    0x00000A0B, 0x00005FA6, 0x0004003D, 0x0000000B, 0x00003141, 0x0000343A,\n    0x00050080, 0x0000000B, 0x00002DA7, 0x00005FA6, 0x00000A0D, 0x00060041,\n    0x00000289, 0x000018FF, 0x00000CC7, 0x00000A0B, 0x00002DA7, 0x0004003D,\n    0x0000000B, 0x00005C62, 0x000018FF, 0x00050080, 0x0000000B, 0x00002DA8,\n    0x00005FA6, 0x00000A10, 0x00060041, 0x00000289, 0x00001900, 0x00000CC7,\n    0x00000A0B, 0x00002DA8, 0x0004003D, 0x0000000B, 0x00005C63, 0x00001900,\n    0x00050080, 0x0000000B, 0x00002DA9, 0x00005FA6, 0x00000A13, 0x00060041,\n    0x00000289, 0x00005FEE, 0x00000CC7, 0x00000A0B, 0x00002DA9, 0x0004003D,\n    0x0000000B, 0x00003FFB, 0x00005FEE, 0x00070050, 0x00000017, 0x0000512D,\n    0x00003141, 0x00005C62, 0x00005C63, 0x00003FFB, 0x000200F9, 0x00004F49,\n    0x000200F8, 0x00004F49, 0x000700F5, 0x00000017, 0x00002ABF, 0x0000512D,\n    0x000019BF, 0x0000512C, 0x000022FF, 0x000300F7, 0x00003F60, 0x00000000,\n    0x001300FB, 0x00002180, 0x00004BFB, 0x00000000, 0x000038F9, 0x00000001,\n    0x000038F9, 0x00000002, 0x00001CBB, 0x0000000A, 0x00001CBB, 0x00000003,\n    0x00001CBA, 0x0000000C, 0x00001CBA, 0x00000004, 0x00001FFE, 0x00000006,\n    0x00002033, 0x000200F8, 0x00002033, 0x00050051, 0x0000000B, 0x00005F56,\n    0x00002ABF, 0x00000000, 0x0006000C, 0x00000013, 0x00006067, 0x00000001,\n    0x0000003E, 0x00005F56, 0x00050051, 0x0000000D, 0x00002762, 0x00006067,\n    0x00000000, 0x00050051, 0x0000000D, 0x00004446, 0x00006067, 0x00000001,\n    0x00070050, 0x0000001D, 0x0000390C, 0x00002762, 0x00004446, 0x00000A0C,\n    0x00000A0C, 0x00050051, 0x0000000B, 0x0000437A, 0x00002ABF, 0x00000001,\n    0x0006000C, 0x00000013, 0x0000466B, 0x00000001, 0x0000003E, 0x0000437A,\n    0x00050051, 0x0000000D, 0x00002763, 0x0000466B, 0x00000000, 0x00050051,\n    0x0000000D, 0x00004447, 0x0000466B, 0x00000001, 0x00070050, 0x0000001D,\n    0x0000390D, 0x00002763, 0x00004447, 0x00000A0C, 0x00000A0C, 0x00050051,\n    0x0000000B, 0x0000437B, 0x00002ABF, 0x00000002, 0x0006000C, 0x00000013,\n    0x0000466C, 0x00000001, 0x0000003E, 0x0000437B, 0x00050051, 0x0000000D,\n    0x00002764, 0x0000466C, 0x00000000, 0x00050051, 0x0000000D, 0x00004448,\n    0x0000466C, 0x00000001, 0x00070050, 0x0000001D, 0x0000390E, 0x00002764,\n    0x00004448, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x0000437C,\n    0x00002ABF, 0x00000003, 0x0006000C, 0x00000013, 0x0000466D, 0x00000001,\n    0x0000003E, 0x0000437C, 0x00050051, 0x0000000D, 0x00002765, 0x0000466D,\n    0x00000000, 0x00050051, 0x0000000D, 0x000050BE, 0x0000466D, 0x00000001,\n    0x00070050, 0x0000001D, 0x00002349, 0x00002765, 0x000050BE, 0x00000A0C,\n    0x00000A0C, 0x000200F9, 0x00003F60, 0x000200F8, 0x00001FFE, 0x00050051,\n    0x0000000B, 0x0000308B, 0x00002ABF, 0x00000000, 0x0004007C, 0x0000000C,\n    0x0000589D, 0x0000308B, 0x00050050, 0x00000012, 0x0000471A, 0x0000589D,\n    0x0000589D, 0x000500C4, 0x00000012, 0x000047AD, 0x0000471A, 0x000007A7,\n    0x000500C3, 0x00000012, 0x00003417, 0x000047AD, 0x00000867, 0x0004006F,\n    0x00000013, 0x00002A97, 0x00003417, 0x0005008E, 0x00000013, 0x00004747,\n    0x00002A97, 0x000007FE, 0x0007000C, 0x00000013, 0x00005E06, 0x00000001,\n    0x00000028, 0x00000049, 0x00004747, 0x00050051, 0x0000000D, 0x00005F0A,\n    0x00005E06, 0x00000000, 0x00050051, 0x0000000D, 0x00003CD4, 0x00005E06,\n    0x00000001, 0x00070050, 0x0000001D, 0x0000411E, 0x00005F0A, 0x00003CD4,\n    0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x00004C42, 0x00002ABF,\n    0x00000001, 0x0004007C, 0x0000000C, 0x00003EA1, 0x00004C42, 0x00050050,\n    0x00000012, 0x0000471B, 0x00003EA1, 0x00003EA1, 0x000500C4, 0x00000012,\n    0x000047AE, 0x0000471B, 0x000007A7, 0x000500C3, 0x00000012, 0x00003418,\n    0x000047AE, 0x00000867, 0x0004006F, 0x00000013, 0x00002A98, 0x00003418,\n    0x0005008E, 0x00000013, 0x00004748, 0x00002A98, 0x000007FE, 0x0007000C,\n    0x00000013, 0x00005E07, 0x00000001, 0x00000028, 0x00000049, 0x00004748,\n    0x00050051, 0x0000000D, 0x00005F0B, 0x00005E07, 0x00000000, 0x00050051,\n    0x0000000D, 0x00003CD5, 0x00005E07, 0x00000001, 0x00070050, 0x0000001D,\n    0x0000411F, 0x00005F0B, 0x00003CD5, 0x00000A0C, 0x00000A0C, 0x00050051,\n    0x0000000B, 0x00004C43, 0x00002ABF, 0x00000002, 0x0004007C, 0x0000000C,\n    0x00003EA2, 0x00004C43, 0x00050050, 0x00000012, 0x0000471C, 0x00003EA2,\n    0x00003EA2, 0x000500C4, 0x00000012, 0x000047AF, 0x0000471C, 0x000007A7,\n    0x000500C3, 0x00000012, 0x00003419, 0x000047AF, 0x00000867, 0x0004006F,\n    0x00000013, 0x00002A99, 0x00003419, 0x0005008E, 0x00000013, 0x00004749,\n    0x00002A99, 0x000007FE, 0x0007000C, 0x00000013, 0x00005E08, 0x00000001,\n    0x00000028, 0x00000049, 0x00004749, 0x00050051, 0x0000000D, 0x00005F0C,\n    0x00005E08, 0x00000000, 0x00050051, 0x0000000D, 0x00003CD6, 0x00005E08,\n    0x00000001, 0x00070050, 0x0000001D, 0x00004120, 0x00005F0C, 0x00003CD6,\n    0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x00004C44, 0x00002ABF,\n    0x00000003, 0x0004007C, 0x0000000C, 0x00003EA3, 0x00004C44, 0x00050050,\n    0x00000012, 0x0000471D, 0x00003EA3, 0x00003EA3, 0x000500C4, 0x00000012,\n    0x000047B0, 0x0000471D, 0x000007A7, 0x000500C3, 0x00000012, 0x0000341A,\n    0x000047B0, 0x00000867, 0x0004006F, 0x00000013, 0x00002A9A, 0x0000341A,\n    0x0005008E, 0x00000013, 0x0000474A, 0x00002A9A, 0x000007FE, 0x0007000C,\n    0x00000013, 0x00005E09, 0x00000001, 0x00000028, 0x00000049, 0x0000474A,\n    0x00050051, 0x0000000D, 0x00005F0D, 0x00005E09, 0x00000000, 0x00050051,\n    0x0000000D, 0x0000494C, 0x00005E09, 0x00000001, 0x00070050, 0x0000001D,\n    0x0000234A, 0x00005F0D, 0x0000494C, 0x00000A0C, 0x00000A0C, 0x000200F9,\n    0x00003F60, 0x000200F8, 0x00001CBA, 0x00050051, 0x0000000B, 0x000056BD,\n    0x00002ABF, 0x00000000, 0x00060050, 0x00000014, 0x00004F0A, 0x000056BD,\n    0x000056BD, 0x000056BD, 0x000500C2, 0x00000014, 0x00002B0D, 0x00004F0A,\n    0x00000BB4, 0x000500C7, 0x00000014, 0x00005DE6, 0x00002B0D, 0x00000105,\n    0x000500C7, 0x00000014, 0x0000489C, 0x00002B0D, 0x00000466, 0x000500C2,\n    0x00000014, 0x00005B90, 0x00005DE6, 0x00000B0C, 0x000500AA, 0x00000010,\n    0x000040C9, 0x00005B90, 0x00000A12, 0x0006000C, 0x00000016, 0x00002C4B,\n    0x00000001, 0x0000004B, 0x0000489C, 0x0004007C, 0x00000014, 0x00002A15,\n    0x00002C4B, 0x00050082, 0x00000014, 0x0000187A, 0x00000B0C, 0x00002A15,\n    0x00050080, 0x00000014, 0x00002210, 0x00002A15, 0x00000938, 0x000600A9,\n    0x00000014, 0x0000286F, 0x000040C9, 0x00002210, 0x00005B90, 0x000500C4,\n    0x00000014, 0x00005AD4, 0x0000489C, 0x0000187A, 0x000500C7, 0x00000014,\n    0x0000499A, 0x00005AD4, 0x00000466, 0x000600A9, 0x00000014, 0x00002A9D,\n    0x000040C9, 0x0000499A, 0x0000489C, 0x00050080, 0x00000014, 0x00005FF9,\n    0x0000286F, 0x000003FA, 0x000500C4, 0x00000014, 0x00004F7F, 0x00005FF9,\n    0x00000189, 0x000500C4, 0x00000014, 0x00003FA6, 0x00002A9D, 0x0000008D,\n    0x000500C5, 0x00000014, 0x0000577C, 0x00004F7F, 0x00003FA6, 0x000500AA,\n    0x00000010, 0x00003600, 0x00005DE6, 0x00000A12, 0x000600A9, 0x00000014,\n    0x00004242, 0x00003600, 0x00000A12, 0x0000577C, 0x0004007C, 0x00000018,\n    0x000029CF, 0x00004242, 0x000500C2, 0x0000000B, 0x00004BA4, 0x000056BD,\n    0x00000A64, 0x00040070, 0x0000000D, 0x0000480E, 0x00004BA4, 0x00050085,\n    0x0000000D, 0x00003E1F, 0x0000480E, 0x00000149, 0x00050051, 0x0000000D,\n    0x000053C2, 0x000029CF, 0x00000000, 0x00050051, 0x0000000D, 0x00002A55,\n    0x000029CF, 0x00000001, 0x00050051, 0x0000000D, 0x00001E99, 0x000029CF,\n    0x00000002, 0x00070050, 0x0000001D, 0x00003DDA, 0x000053C2, 0x00002A55,\n    0x00001E99, 0x00003E1F, 0x00050051, 0x0000000B, 0x000027F5, 0x00002ABF,\n    0x00000001, 0x00060050, 0x00000014, 0x0000350E, 0x000027F5, 0x000027F5,\n    0x000027F5, 0x000500C2, 0x00000014, 0x00002B0E, 0x0000350E, 0x00000BB4,\n    0x000500C7, 0x00000014, 0x00005DE7, 0x00002B0E, 0x00000105, 0x000500C7,\n    0x00000014, 0x0000489D, 0x00002B0E, 0x00000466, 0x000500C2, 0x00000014,\n    0x00005B91, 0x00005DE7, 0x00000B0C, 0x000500AA, 0x00000010, 0x000040CA,\n    0x00005B91, 0x00000A12, 0x0006000C, 0x00000016, 0x00002C4C, 0x00000001,\n    0x0000004B, 0x0000489D, 0x0004007C, 0x00000014, 0x00002A16, 0x00002C4C,\n    0x00050082, 0x00000014, 0x0000187B, 0x00000B0C, 0x00002A16, 0x00050080,\n    0x00000014, 0x00002211, 0x00002A16, 0x00000938, 0x000600A9, 0x00000014,\n    0x00002870, 0x000040CA, 0x00002211, 0x00005B91, 0x000500C4, 0x00000014,\n    0x00005AD5, 0x0000489D, 0x0000187B, 0x000500C7, 0x00000014, 0x0000499B,\n    0x00005AD5, 0x00000466, 0x000600A9, 0x00000014, 0x00002A9E, 0x000040CA,\n    0x0000499B, 0x0000489D, 0x00050080, 0x00000014, 0x00005FFA, 0x00002870,\n    0x000003FA, 0x000500C4, 0x00000014, 0x00004F80, 0x00005FFA, 0x00000189,\n    0x000500C4, 0x00000014, 0x00003FA7, 0x00002A9E, 0x0000008D, 0x000500C5,\n    0x00000014, 0x0000577D, 0x00004F80, 0x00003FA7, 0x000500AA, 0x00000010,\n    0x00003601, 0x00005DE7, 0x00000A12, 0x000600A9, 0x00000014, 0x00004243,\n    0x00003601, 0x00000A12, 0x0000577D, 0x0004007C, 0x00000018, 0x000029D0,\n    0x00004243, 0x000500C2, 0x0000000B, 0x00004BA5, 0x000027F5, 0x00000A64,\n    0x00040070, 0x0000000D, 0x0000480F, 0x00004BA5, 0x00050085, 0x0000000D,\n    0x00003E20, 0x0000480F, 0x00000149, 0x00050051, 0x0000000D, 0x000053C3,\n    0x000029D0, 0x00000000, 0x00050051, 0x0000000D, 0x00002A56, 0x000029D0,\n    0x00000001, 0x00050051, 0x0000000D, 0x00001E9A, 0x000029D0, 0x00000002,\n    0x00070050, 0x0000001D, 0x00003DDB, 0x000053C3, 0x00002A56, 0x00001E9A,\n    0x00003E20, 0x00050051, 0x0000000B, 0x000027F6, 0x00002ABF, 0x00000002,\n    0x00060050, 0x00000014, 0x0000350F, 0x000027F6, 0x000027F6, 0x000027F6,\n    0x000500C2, 0x00000014, 0x00002B0F, 0x0000350F, 0x00000BB4, 0x000500C7,\n    0x00000014, 0x00005DE8, 0x00002B0F, 0x00000105, 0x000500C7, 0x00000014,\n    0x0000489E, 0x00002B0F, 0x00000466, 0x000500C2, 0x00000014, 0x00005B92,\n    0x00005DE8, 0x00000B0C, 0x000500AA, 0x00000010, 0x000040CB, 0x00005B92,\n    0x00000A12, 0x0006000C, 0x00000016, 0x00002C4D, 0x00000001, 0x0000004B,\n    0x0000489E, 0x0004007C, 0x00000014, 0x00002A17, 0x00002C4D, 0x00050082,\n    0x00000014, 0x0000187C, 0x00000B0C, 0x00002A17, 0x00050080, 0x00000014,\n    0x00002212, 0x00002A17, 0x00000938, 0x000600A9, 0x00000014, 0x00002871,\n    0x000040CB, 0x00002212, 0x00005B92, 0x000500C4, 0x00000014, 0x00005AD6,\n    0x0000489E, 0x0000187C, 0x000500C7, 0x00000014, 0x0000499C, 0x00005AD6,\n    0x00000466, 0x000600A9, 0x00000014, 0x00002A9F, 0x000040CB, 0x0000499C,\n    0x0000489E, 0x00050080, 0x00000014, 0x00005FFB, 0x00002871, 0x000003FA,\n    0x000500C4, 0x00000014, 0x00004F81, 0x00005FFB, 0x00000189, 0x000500C4,\n    0x00000014, 0x00003FA8, 0x00002A9F, 0x0000008D, 0x000500C5, 0x00000014,\n    0x0000577E, 0x00004F81, 0x00003FA8, 0x000500AA, 0x00000010, 0x00003602,\n    0x00005DE8, 0x00000A12, 0x000600A9, 0x00000014, 0x00004244, 0x00003602,\n    0x00000A12, 0x0000577E, 0x0004007C, 0x00000018, 0x000029D1, 0x00004244,\n    0x000500C2, 0x0000000B, 0x00004BA6, 0x000027F6, 0x00000A64, 0x00040070,\n    0x0000000D, 0x00004810, 0x00004BA6, 0x00050085, 0x0000000D, 0x00003E21,\n    0x00004810, 0x00000149, 0x00050051, 0x0000000D, 0x000053C4, 0x000029D1,\n    0x00000000, 0x00050051, 0x0000000D, 0x00002A57, 0x000029D1, 0x00000001,\n    0x00050051, 0x0000000D, 0x00001E9B, 0x000029D1, 0x00000002, 0x00070050,\n    0x0000001D, 0x00003DDC, 0x000053C4, 0x00002A57, 0x00001E9B, 0x00003E21,\n    0x00050051, 0x0000000B, 0x000027F7, 0x00002ABF, 0x00000003, 0x00060050,\n    0x00000014, 0x00003510, 0x000027F7, 0x000027F7, 0x000027F7, 0x000500C2,\n    0x00000014, 0x00002B10, 0x00003510, 0x00000BB4, 0x000500C7, 0x00000014,\n    0x00005DE9, 0x00002B10, 0x00000105, 0x000500C7, 0x00000014, 0x0000489F,\n    0x00002B10, 0x00000466, 0x000500C2, 0x00000014, 0x00005B93, 0x00005DE9,\n    0x00000B0C, 0x000500AA, 0x00000010, 0x000040CC, 0x00005B93, 0x00000A12,\n    0x0006000C, 0x00000016, 0x00002C4E, 0x00000001, 0x0000004B, 0x0000489F,\n    0x0004007C, 0x00000014, 0x00002A18, 0x00002C4E, 0x00050082, 0x00000014,\n    0x0000187D, 0x00000B0C, 0x00002A18, 0x00050080, 0x00000014, 0x00002213,\n    0x00002A18, 0x00000938, 0x000600A9, 0x00000014, 0x00002872, 0x000040CC,\n    0x00002213, 0x00005B93, 0x000500C4, 0x00000014, 0x00005AD7, 0x0000489F,\n    0x0000187D, 0x000500C7, 0x00000014, 0x0000499D, 0x00005AD7, 0x00000466,\n    0x000600A9, 0x00000014, 0x00002AA0, 0x000040CC, 0x0000499D, 0x0000489F,\n    0x00050080, 0x00000014, 0x00005FFC, 0x00002872, 0x000003FA, 0x000500C4,\n    0x00000014, 0x00004F82, 0x00005FFC, 0x00000189, 0x000500C4, 0x00000014,\n    0x00003FA9, 0x00002AA0, 0x0000008D, 0x000500C5, 0x00000014, 0x0000577F,\n    0x00004F82, 0x00003FA9, 0x000500AA, 0x00000010, 0x00003603, 0x00005DE9,\n    0x00000A12, 0x000600A9, 0x00000014, 0x00004245, 0x00003603, 0x00000A12,\n    0x0000577F, 0x0004007C, 0x00000018, 0x000029D2, 0x00004245, 0x000500C2,\n    0x0000000B, 0x00004BA7, 0x000027F7, 0x00000A64, 0x00040070, 0x0000000D,\n    0x00004811, 0x00004BA7, 0x00050085, 0x0000000D, 0x00003E22, 0x00004811,\n    0x00000149, 0x00050051, 0x0000000D, 0x000053C5, 0x000029D2, 0x00000000,\n    0x00050051, 0x0000000D, 0x00002A58, 0x000029D2, 0x00000001, 0x00050051,\n    0x0000000D, 0x00002B11, 0x000029D2, 0x00000002, 0x00070050, 0x0000001D,\n    0x0000234B, 0x000053C5, 0x00002A58, 0x00002B11, 0x00003E22, 0x000200F9,\n    0x00003F60, 0x000200F8, 0x00001CBB, 0x00050051, 0x0000000B, 0x000056BE,\n    0x00002ABF, 0x00000000, 0x00070050, 0x00000017, 0x00004F0B, 0x000056BE,\n    0x000056BE, 0x000056BE, 0x000056BE, 0x000500C2, 0x00000017, 0x00002498,\n    0x00004F0B, 0x0000034D, 0x000500C7, 0x00000017, 0x000049AB, 0x00002498,\n    0x0000027B, 0x00040070, 0x0000001D, 0x00003CB7, 0x000049AB, 0x00050085,\n    0x0000001D, 0x00004130, 0x00003CB7, 0x00000AEE, 0x00050051, 0x0000000B,\n    0x00005CD2, 0x00002ABF, 0x00000001, 0x00070050, 0x00000017, 0x0000514D,\n    0x00005CD2, 0x00005CD2, 0x00005CD2, 0x00005CD2, 0x000500C2, 0x00000017,\n    0x00002499, 0x0000514D, 0x0000034D, 0x000500C7, 0x00000017, 0x000049AC,\n    0x00002499, 0x0000027B, 0x00040070, 0x0000001D, 0x00003CB8, 0x000049AC,\n    0x00050085, 0x0000001D, 0x00004131, 0x00003CB8, 0x00000AEE, 0x00050051,\n    0x0000000B, 0x00005CD3, 0x00002ABF, 0x00000002, 0x00070050, 0x00000017,\n    0x0000514E, 0x00005CD3, 0x00005CD3, 0x00005CD3, 0x00005CD3, 0x000500C2,\n    0x00000017, 0x0000249A, 0x0000514E, 0x0000034D, 0x000500C7, 0x00000017,\n    0x000049AD, 0x0000249A, 0x0000027B, 0x00040070, 0x0000001D, 0x00003CB9,\n    0x000049AD, 0x00050085, 0x0000001D, 0x00004132, 0x00003CB9, 0x00000AEE,\n    0x00050051, 0x0000000B, 0x00005CD4, 0x00002ABF, 0x00000003, 0x00070050,\n    0x00000017, 0x0000514F, 0x00005CD4, 0x00005CD4, 0x00005CD4, 0x00005CD4,\n    0x000500C2, 0x00000017, 0x0000249B, 0x0000514F, 0x0000034D, 0x000500C7,\n    0x00000017, 0x000049AE, 0x0000249B, 0x0000027B, 0x00040070, 0x0000001D,\n    0x0000492F, 0x000049AE, 0x00050085, 0x0000001D, 0x0000269F, 0x0000492F,\n    0x00000AEE, 0x000200F9, 0x00003F60, 0x000200F8, 0x000038F9, 0x00050051,\n    0x0000000B, 0x000056BF, 0x00002ABF, 0x00000000, 0x00070050, 0x00000017,\n    0x00004F0C, 0x000056BF, 0x000056BF, 0x000056BF, 0x000056BF, 0x000500C2,\n    0x00000017, 0x0000249C, 0x00004F0C, 0x0000028D, 0x000500C7, 0x00000017,\n    0x00004A56, 0x0000249C, 0x0000064B, 0x00040070, 0x0000001D, 0x000036A2,\n    0x00004A56, 0x0005008E, 0x0000001D, 0x00004B23, 0x000036A2, 0x0000017A,\n    0x00050051, 0x0000000B, 0x0000219F, 0x00002ABF, 0x00000001, 0x00070050,\n    0x00000017, 0x0000610B, 0x0000219F, 0x0000219F, 0x0000219F, 0x0000219F,\n    0x000500C2, 0x00000017, 0x0000249D, 0x0000610B, 0x0000028D, 0x000500C7,\n    0x00000017, 0x00004A57, 0x0000249D, 0x0000064B, 0x00040070, 0x0000001D,\n    0x000036A3, 0x00004A57, 0x0005008E, 0x0000001D, 0x00004B24, 0x000036A3,\n    0x0000017A, 0x00050051, 0x0000000B, 0x000021A0, 0x00002ABF, 0x00000002,\n    0x00070050, 0x00000017, 0x0000610C, 0x000021A0, 0x000021A0, 0x000021A0,\n    0x000021A0, 0x000500C2, 0x00000017, 0x0000249E, 0x0000610C, 0x0000028D,\n    0x000500C7, 0x00000017, 0x00004A58, 0x0000249E, 0x0000064B, 0x00040070,\n    0x0000001D, 0x000036A4, 0x00004A58, 0x0005008E, 0x0000001D, 0x00004B25,\n    0x000036A4, 0x0000017A, 0x00050051, 0x0000000B, 0x000021A1, 0x00002ABF,\n    0x00000003, 0x00070050, 0x00000017, 0x0000610D, 0x000021A1, 0x000021A1,\n    0x000021A1, 0x000021A1, 0x000500C2, 0x00000017, 0x0000249F, 0x0000610D,\n    0x0000028D, 0x000500C7, 0x00000017, 0x00004A59, 0x0000249F, 0x0000064B,\n    0x00040070, 0x0000001D, 0x0000431A, 0x00004A59, 0x0005008E, 0x0000001D,\n    0x00003092, 0x0000431A, 0x0000017A, 0x000200F9, 0x00003F60, 0x000200F8,\n    0x00004BFB, 0x00050051, 0x0000000B, 0x0000308C, 0x00002ABF, 0x00000000,\n    0x0004007C, 0x0000000D, 0x00004FEE, 0x0000308C, 0x00050050, 0x00000013,\n    0x00004336, 0x00004FEE, 0x00000A0C, 0x0009004F, 0x0000001D, 0x00002D90,\n    0x00004336, 0x00004336, 0x00000000, 0x00000001, 0x00000001, 0x00000001,\n    0x00050051, 0x0000000B, 0x000056B1, 0x00002ABF, 0x00000001, 0x0004007C,\n    0x0000000D, 0x00003F68, 0x000056B1, 0x00050050, 0x00000013, 0x00004337,\n    0x00003F68, 0x00000A0C, 0x0009004F, 0x0000001D, 0x00002D91, 0x00004337,\n    0x00004337, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00050051,\n    0x0000000B, 0x000056B2, 0x00002ABF, 0x00000002, 0x0004007C, 0x0000000D,\n    0x00003F69, 0x000056B2, 0x00050050, 0x00000013, 0x00004338, 0x00003F69,\n    0x00000A0C, 0x0009004F, 0x0000001D, 0x00002D92, 0x00004338, 0x00004338,\n    0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00050051, 0x0000000B,\n    0x000056B3, 0x00002ABF, 0x00000003, 0x0004007C, 0x0000000D, 0x00003F6A,\n    0x000056B3, 0x00050050, 0x00000013, 0x00004FAE, 0x00003F6A, 0x00000A0C,\n    0x0009004F, 0x0000001D, 0x00005A3A, 0x00004FAE, 0x00004FAE, 0x00000000,\n    0x00000001, 0x00000001, 0x00000001, 0x000200F9, 0x00003F60, 0x000200F8,\n    0x00003F60, 0x000F00F5, 0x0000001D, 0x00002BA7, 0x00005A3A, 0x00004BFB,\n    0x00003092, 0x000038F9, 0x0000269F, 0x00001CBB, 0x0000234B, 0x00001CBA,\n    0x0000234A, 0x00001FFE, 0x00002349, 0x00002033, 0x000F00F5, 0x0000001D,\n    0x00003808, 0x00002D92, 0x00004BFB, 0x00004B25, 0x000038F9, 0x00004132,\n    0x00001CBB, 0x00003DDC, 0x00001CBA, 0x00004120, 0x00001FFE, 0x0000390E,\n    0x00002033, 0x000F00F5, 0x0000001D, 0x00003B7D, 0x00002D91, 0x00004BFB,\n    0x00004B24, 0x000038F9, 0x00004131, 0x00001CBB, 0x00003DDB, 0x00001CBA,\n    0x0000411F, 0x00001FFE, 0x0000390D, 0x00002033, 0x000F00F5, 0x0000001D,\n    0x000038B6, 0x00002D90, 0x00004BFB, 0x00004B23, 0x000038F9, 0x00004130,\n    0x00001CBB, 0x00003DDA, 0x00001CBA, 0x0000411E, 0x00001FFE, 0x0000390C,\n    0x00002033, 0x000200F9, 0x0000530F, 0x000200F8, 0x00003B65, 0x000500AA,\n    0x00000009, 0x00005450, 0x0000199B, 0x00000A22, 0x000300F7, 0x00004F23,\n    0x00000002, 0x000400FA, 0x00005450, 0x000019C0, 0x00002300, 0x000200F8,\n    0x00002300, 0x000500C2, 0x0000000B, 0x00005631, 0x00001E06, 0x00000A11,\n    0x00060041, 0x00000289, 0x0000343B, 0x00000CC7, 0x00000A0B, 0x00005631,\n    0x0004003D, 0x0000000B, 0x00003142, 0x0000343B, 0x00050080, 0x0000000B,\n    0x00002DAA, 0x00005631, 0x00000A0D, 0x00060041, 0x00000289, 0x00001901,\n    0x00000CC7, 0x00000A0B, 0x00002DAA, 0x0004003D, 0x0000000B, 0x00001B76,\n    0x00001901, 0x00050080, 0x0000000B, 0x00002146, 0x00001E06, 0x0000199B,\n    0x000500C2, 0x0000000B, 0x000054A7, 0x00002146, 0x00000A11, 0x00060041,\n    0x00000289, 0x00004C91, 0x00000CC7, 0x00000A0B, 0x000054A7, 0x0004003D,\n    0x0000000B, 0x00003143, 0x00004C91, 0x00050080, 0x0000000B, 0x00002DAB,\n    0x000054A7, 0x00000A0D, 0x00060041, 0x00000289, 0x00005FEF, 0x00000CC7,\n    0x00000A0B, 0x00002DAB, 0x0004003D, 0x0000000B, 0x0000374C, 0x00005FEF,\n    0x00070050, 0x00000017, 0x00004CD6, 0x00003142, 0x00001B76, 0x00003143,\n    0x0000374C, 0x00050084, 0x0000000B, 0x00004C2B, 0x00000A10, 0x0000199B,\n    0x00050080, 0x0000000B, 0x00002A45, 0x00001E06, 0x00004C2B, 0x000500C2,\n    0x0000000B, 0x000045E4, 0x00002A45, 0x00000A11, 0x00060041, 0x00000289,\n    0x00004C92, 0x00000CC7, 0x00000A0B, 0x000045E4, 0x0004003D, 0x0000000B,\n    0x00003144, 0x00004C92, 0x00050080, 0x0000000B, 0x00002DAC, 0x000045E4,\n    0x00000A0D, 0x00060041, 0x00000289, 0x0000194B, 0x00000CC7, 0x00000A0B,\n    0x00002DAC, 0x0004003D, 0x0000000B, 0x00005E5B, 0x0000194B, 0x00050084,\n    0x0000000B, 0x000021EF, 0x00000A13, 0x0000199B, 0x00050080, 0x0000000B,\n    0x00005EC0, 0x00001E06, 0x000021EF, 0x000500C2, 0x0000000B, 0x000045E5,\n    0x00005EC0, 0x00000A11, 0x00060041, 0x00000289, 0x00004C93, 0x00000CC7,\n    0x00000A0B, 0x000045E5, 0x0004003D, 0x0000000B, 0x00003145, 0x00004C93,\n    0x00050080, 0x0000000B, 0x00002DAD, 0x000045E5, 0x00000A0D, 0x00060041,\n    0x00000289, 0x00005FF0, 0x00000CC7, 0x00000A0B, 0x00002DAD, 0x0004003D,\n    0x0000000B, 0x00003FFC, 0x00005FF0, 0x00070050, 0x00000017, 0x0000512E,\n    0x00003144, 0x00005E5B, 0x00003145, 0x00003FFC, 0x000200F9, 0x00004F23,\n    0x000200F8, 0x000019C0, 0x000500C2, 0x0000000B, 0x00005FA7, 0x00001E06,\n    0x00000A11, 0x00060041, 0x00000289, 0x0000343C, 0x00000CC7, 0x00000A0B,\n    0x00005FA7, 0x0004003D, 0x0000000B, 0x00003146, 0x0000343C, 0x00050080,\n    0x0000000B, 0x00002DAE, 0x00005FA7, 0x00000A0D, 0x00060041, 0x00000289,\n    0x00001902, 0x00000CC7, 0x00000A0B, 0x00002DAE, 0x0004003D, 0x0000000B,\n    0x00005C64, 0x00001902, 0x00050080, 0x0000000B, 0x00002DAF, 0x00005FA7,\n    0x00000A10, 0x00060041, 0x00000289, 0x00001903, 0x00000CC7, 0x00000A0B,\n    0x00002DAF, 0x0004003D, 0x0000000B, 0x00005C65, 0x00001903, 0x00050080,\n    0x0000000B, 0x00002DB0, 0x00005FA7, 0x00000A13, 0x00060041, 0x00000289,\n    0x00005FF1, 0x00000CC7, 0x00000A0B, 0x00002DB0, 0x0004003D, 0x0000000B,\n    0x00003700, 0x00005FF1, 0x00070050, 0x00000017, 0x00005470, 0x00003146,\n    0x00005C64, 0x00005C65, 0x00003700, 0x00050080, 0x0000000B, 0x00004B83,\n    0x00001E06, 0x00000A3A, 0x000500C2, 0x0000000B, 0x0000202D, 0x00004B83,\n    0x00000A11, 0x00060041, 0x00000289, 0x00004C94, 0x00000CC7, 0x00000A0B,\n    0x0000202D, 0x0004003D, 0x0000000B, 0x00003147, 0x00004C94, 0x00050080,\n    0x0000000B, 0x00002DB1, 0x0000202D, 0x00000A0D, 0x00060041, 0x00000289,\n    0x00001904, 0x00000CC7, 0x00000A0B, 0x00002DB1, 0x0004003D, 0x0000000B,\n    0x00005C66, 0x00001904, 0x00050080, 0x0000000B, 0x00002DB2, 0x0000202D,\n    0x00000A10, 0x00060041, 0x00000289, 0x00001905, 0x00000CC7, 0x00000A0B,\n    0x00002DB2, 0x0004003D, 0x0000000B, 0x00005C67, 0x00001905, 0x00050080,\n    0x0000000B, 0x00002DB3, 0x0000202D, 0x00000A13, 0x00060041, 0x00000289,\n    0x00005FF2, 0x00000CC7, 0x00000A0B, 0x00002DB3, 0x0004003D, 0x0000000B,\n    0x00003FFD, 0x00005FF2, 0x00070050, 0x00000017, 0x0000512F, 0x00003147,\n    0x00005C66, 0x00005C67, 0x00003FFD, 0x000200F9, 0x00004F23, 0x000200F8,\n    0x00004F23, 0x000700F5, 0x00000017, 0x00002BCD, 0x0000512F, 0x000019C0,\n    0x0000512E, 0x00002300, 0x000700F5, 0x00000017, 0x00003720, 0x00005470,\n    0x000019C0, 0x00004CD6, 0x00002300, 0x000300F7, 0x00004F24, 0x00000000,\n    0x000700FB, 0x00002180, 0x00004F56, 0x00000005, 0x00002158, 0x00000007,\n    0x00002034, 0x000200F8, 0x00002034, 0x00050051, 0x0000000B, 0x00005F57,\n    0x00003720, 0x00000000, 0x0006000C, 0x00000013, 0x00006068, 0x00000001,\n    0x0000003E, 0x00005F57, 0x00050051, 0x0000000D, 0x00002775, 0x00006068,\n    0x00000000, 0x00050051, 0x0000000D, 0x00003EB8, 0x00006068, 0x00000001,\n    0x00050051, 0x0000000B, 0x00004281, 0x00003720, 0x00000001, 0x0006000C,\n    0x00000013, 0x00003CF5, 0x00000001, 0x0000003E, 0x00004281, 0x00050051,\n    0x0000000D, 0x00002766, 0x00003CF5, 0x00000000, 0x00050051, 0x0000000D,\n    0x00004449, 0x00003CF5, 0x00000001, 0x00070050, 0x0000001D, 0x0000390F,\n    0x00002775, 0x00003EB8, 0x00002766, 0x00004449, 0x00050051, 0x0000000B,\n    0x0000437D, 0x00003720, 0x00000002, 0x0006000C, 0x00000013, 0x0000466E,\n    0x00000001, 0x0000003E, 0x0000437D, 0x00050051, 0x0000000D, 0x00002776,\n    0x0000466E, 0x00000000, 0x00050051, 0x0000000D, 0x00003EB9, 0x0000466E,\n    0x00000001, 0x00050051, 0x0000000B, 0x00004282, 0x00003720, 0x00000003,\n    0x0006000C, 0x00000013, 0x00003CF6, 0x00000001, 0x0000003E, 0x00004282,\n    0x00050051, 0x0000000D, 0x00002767, 0x00003CF6, 0x00000000, 0x00050051,\n    0x0000000D, 0x0000444A, 0x00003CF6, 0x00000001, 0x00070050, 0x0000001D,\n    0x00003910, 0x00002776, 0x00003EB9, 0x00002767, 0x0000444A, 0x00050051,\n    0x0000000B, 0x0000437E, 0x00002BCD, 0x00000000, 0x0006000C, 0x00000013,\n    0x0000466F, 0x00000001, 0x0000003E, 0x0000437E, 0x00050051, 0x0000000D,\n    0x00002777, 0x0000466F, 0x00000000, 0x00050051, 0x0000000D, 0x00003EBA,\n    0x0000466F, 0x00000001, 0x00050051, 0x0000000B, 0x00004283, 0x00002BCD,\n    0x00000001, 0x0006000C, 0x00000013, 0x00003CF7, 0x00000001, 0x0000003E,\n    0x00004283, 0x00050051, 0x0000000D, 0x00002768, 0x00003CF7, 0x00000000,\n    0x00050051, 0x0000000D, 0x0000444B, 0x00003CF7, 0x00000001, 0x00070050,\n    0x0000001D, 0x00003911, 0x00002777, 0x00003EBA, 0x00002768, 0x0000444B,\n    0x00050051, 0x0000000B, 0x0000437F, 0x00002BCD, 0x00000002, 0x0006000C,\n    0x00000013, 0x00004670, 0x00000001, 0x0000003E, 0x0000437F, 0x00050051,\n    0x0000000D, 0x00002778, 0x00004670, 0x00000000, 0x00050051, 0x0000000D,\n    0x00003EBB, 0x00004670, 0x00000001, 0x00050051, 0x0000000B, 0x00004284,\n    0x00002BCD, 0x00000003, 0x0006000C, 0x00000013, 0x00003CF8, 0x00000001,\n    0x0000003E, 0x00004284, 0x00050051, 0x0000000D, 0x00002769, 0x00003CF8,\n    0x00000000, 0x00050051, 0x0000000D, 0x000050BF, 0x00003CF8, 0x00000001,\n    0x00070050, 0x0000001D, 0x0000234C, 0x00002778, 0x00003EBB, 0x00002769,\n    0x000050BF, 0x000200F9, 0x00004F24, 0x000200F8, 0x00002158, 0x0007004F,\n    0x00000011, 0x000025FB, 0x00003720, 0x00003720, 0x00000000, 0x00000001,\n    0x0004007C, 0x00000012, 0x00005B3C, 0x000025FB, 0x0009004F, 0x0000001A,\n    0x000060CE, 0x00005B3C, 0x00005B3C, 0x00000000, 0x00000000, 0x00000001,\n    0x00000001, 0x000500C4, 0x0000001A, 0x000048A6, 0x000060CE, 0x00000122,\n    0x000500C3, 0x0000001A, 0x00003D8D, 0x000048A6, 0x00000302, 0x0004006F,\n    0x0000001D, 0x00002A9B, 0x00003D8D, 0x0005008E, 0x0000001D, 0x00004721,\n    0x00002A9B, 0x000007FE, 0x0007000C, 0x0000001D, 0x00006291, 0x00000001,\n    0x00000028, 0x00000504, 0x00004721, 0x0007004F, 0x00000011, 0x0000376B,\n    0x00003720, 0x00003720, 0x00000002, 0x00000003, 0x0004007C, 0x00000012,\n    0x000024BF, 0x0000376B, 0x0009004F, 0x0000001A, 0x000060CF, 0x000024BF,\n    0x000024BF, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x000500C4,\n    0x0000001A, 0x000048A7, 0x000060CF, 0x00000122, 0x000500C3, 0x0000001A,\n    0x00003D8E, 0x000048A7, 0x00000302, 0x0004006F, 0x0000001D, 0x00002A9C,\n    0x00003D8E, 0x0005008E, 0x0000001D, 0x00004722, 0x00002A9C, 0x000007FE,\n    0x0007000C, 0x0000001D, 0x00006292, 0x00000001, 0x00000028, 0x00000504,\n    0x00004722, 0x0007004F, 0x00000011, 0x0000376C, 0x00002BCD, 0x00002BCD,\n    0x00000000, 0x00000001, 0x0004007C, 0x00000012, 0x000024C0, 0x0000376C,\n    0x0009004F, 0x0000001A, 0x000060D0, 0x000024C0, 0x000024C0, 0x00000000,\n    0x00000000, 0x00000001, 0x00000001, 0x000500C4, 0x0000001A, 0x000048A8,\n    0x000060D0, 0x00000122, 0x000500C3, 0x0000001A, 0x00003D8F, 0x000048A8,\n    0x00000302, 0x0004006F, 0x0000001D, 0x00002AA1, 0x00003D8F, 0x0005008E,\n    0x0000001D, 0x00004723, 0x00002AA1, 0x000007FE, 0x0007000C, 0x0000001D,\n    0x00006293, 0x00000001, 0x00000028, 0x00000504, 0x00004723, 0x0007004F,\n    0x00000011, 0x0000376D, 0x00002BCD, 0x00002BCD, 0x00000002, 0x00000003,\n    0x0004007C, 0x00000012, 0x000024C1, 0x0000376D, 0x0009004F, 0x0000001A,\n    0x000060D1, 0x000024C1, 0x000024C1, 0x00000000, 0x00000000, 0x00000001,\n    0x00000001, 0x000500C4, 0x0000001A, 0x000048A9, 0x000060D1, 0x00000122,\n    0x000500C3, 0x0000001A, 0x00003D90, 0x000048A9, 0x00000302, 0x0004006F,\n    0x0000001D, 0x00002AA2, 0x00003D90, 0x0005008E, 0x0000001D, 0x000053BF,\n    0x00002AA2, 0x000007FE, 0x0007000C, 0x0000001D, 0x00004362, 0x00000001,\n    0x00000028, 0x00000504, 0x000053BF, 0x000200F9, 0x00004F24, 0x000200F8,\n    0x00004F56, 0x0007004F, 0x00000011, 0x00002621, 0x00003720, 0x00003720,\n    0x00000000, 0x00000001, 0x0004007C, 0x00000013, 0x00005159, 0x00002621,\n    0x00050051, 0x0000000D, 0x00001B7B, 0x00005159, 0x00000000, 0x00050051,\n    0x0000000D, 0x0000346A, 0x00005159, 0x00000001, 0x00070050, 0x0000001D,\n    0x00004278, 0x00001B7B, 0x0000346A, 0x00000A0C, 0x00000A0C, 0x0007004F,\n    0x00000011, 0x000041D8, 0x00003720, 0x00003720, 0x00000002, 0x00000003,\n    0x0004007C, 0x00000013, 0x0000375D, 0x000041D8, 0x00050051, 0x0000000D,\n    0x00001B7C, 0x0000375D, 0x00000000, 0x00050051, 0x0000000D, 0x0000346B,\n    0x0000375D, 0x00000001, 0x00070050, 0x0000001D, 0x00004279, 0x00001B7C,\n    0x0000346B, 0x00000A0C, 0x00000A0C, 0x0007004F, 0x00000011, 0x000041D9,\n    0x00002BCD, 0x00002BCD, 0x00000000, 0x00000001, 0x0004007C, 0x00000013,\n    0x0000375E, 0x000041D9, 0x00050051, 0x0000000D, 0x00001B7D, 0x0000375E,\n    0x00000000, 0x00050051, 0x0000000D, 0x0000346C, 0x0000375E, 0x00000001,\n    0x00070050, 0x0000001D, 0x0000427A, 0x00001B7D, 0x0000346C, 0x00000A0C,\n    0x00000A0C, 0x0007004F, 0x00000011, 0x000041DA, 0x00002BCD, 0x00002BCD,\n    0x00000002, 0x00000003, 0x0004007C, 0x00000013, 0x0000375F, 0x000041DA,\n    0x00050051, 0x0000000D, 0x00001B7F, 0x0000375F, 0x00000000, 0x00050051,\n    0x0000000D, 0x00004108, 0x0000375F, 0x00000001, 0x00070050, 0x0000001D,\n    0x0000234D, 0x00001B7F, 0x00004108, 0x00000A0C, 0x00000A0C, 0x000200F9,\n    0x00004F24, 0x000200F8, 0x00004F24, 0x000900F5, 0x0000001D, 0x00002BA8,\n    0x0000234D, 0x00004F56, 0x00004362, 0x00002158, 0x0000234C, 0x00002034,\n    0x000900F5, 0x0000001D, 0x00003809, 0x0000427A, 0x00004F56, 0x00006293,\n    0x00002158, 0x00003911, 0x00002034, 0x000900F5, 0x0000001D, 0x00003B7E,\n    0x00004279, 0x00004F56, 0x00006292, 0x00002158, 0x00003910, 0x00002034,\n    0x000900F5, 0x0000001D, 0x000038B7, 0x00004278, 0x00004F56, 0x00006291,\n    0x00002158, 0x0000390F, 0x00002034, 0x000200F9, 0x0000530F, 0x000200F8,\n    0x0000530F, 0x000700F5, 0x0000001D, 0x00002BA9, 0x00002BA8, 0x00004F24,\n    0x00002BA7, 0x00003F60, 0x000700F5, 0x0000001D, 0x0000380A, 0x00003809,\n    0x00004F24, 0x00003808, 0x00003F60, 0x000700F5, 0x0000001D, 0x000035EC,\n    0x00003B7E, 0x00004F24, 0x00003B7D, 0x00003F60, 0x000700F5, 0x0000001D,\n    0x000020D3, 0x000038B7, 0x00004F24, 0x000038B6, 0x00003F60, 0x000500AE,\n    0x00000009, 0x00002E55, 0x00004356, 0x00000A16, 0x000300F7, 0x00005313,\n    0x00000002, 0x000400FA, 0x00002E55, 0x000051F1, 0x00005313, 0x000200F8,\n    0x000051F1, 0x00050084, 0x0000000B, 0x00002B47, 0x00000207, 0x0000229A,\n    0x00050085, 0x0000000D, 0x00005A1D, 0x00002B2C, 0x000000FC, 0x00050080,\n    0x0000000B, 0x00001FB2, 0x00001E06, 0x00002B47, 0x000300F7, 0x00005310,\n    0x00000002, 0x000400FA, 0x00005AEF, 0x00003B66, 0x000040BA, 0x000200F8,\n    0x000040BA, 0x000500AA, 0x00000009, 0x00004ADB, 0x0000199B, 0x00000A16,\n    0x000300F7, 0x00004F4A, 0x00000002, 0x000400FA, 0x00004ADB, 0x000019C1,\n    0x00002301, 0x000200F8, 0x00002301, 0x000500C2, 0x0000000B, 0x00005632,\n    0x00001FB2, 0x00000A11, 0x00060041, 0x00000289, 0x0000343D, 0x00000CC7,\n    0x00000A0B, 0x00005632, 0x0004003D, 0x0000000B, 0x00003AD5, 0x0000343D,\n    0x00050080, 0x0000000B, 0x00002147, 0x00001FB2, 0x0000199B, 0x000500C2,\n    0x0000000B, 0x000054A8, 0x00002147, 0x00000A11, 0x00060041, 0x00000289,\n    0x00004CDF, 0x00000CC7, 0x00000A0B, 0x000054A8, 0x0004003D, 0x0000000B,\n    0x0000333C, 0x00004CDF, 0x00050084, 0x0000000B, 0x000021F0, 0x00000A10,\n    0x0000199B, 0x00050080, 0x0000000B, 0x00005EC1, 0x00001FB2, 0x000021F0,\n    0x000500C2, 0x0000000B, 0x000045E6, 0x00005EC1, 0x00000A11, 0x00060041,\n    0x00000289, 0x00004CE0, 0x00000CC7, 0x00000A0B, 0x000045E6, 0x0004003D,\n    0x0000000B, 0x0000333D, 0x00004CE0, 0x00050084, 0x0000000B, 0x000021F1,\n    0x00000A13, 0x0000199B, 0x00050080, 0x0000000B, 0x00005EC2, 0x00001FB2,\n    0x000021F1, 0x000500C2, 0x0000000B, 0x000045E7, 0x00005EC2, 0x00000A11,\n    0x00060041, 0x00000289, 0x00004902, 0x00000CC7, 0x00000A0B, 0x000045E7,\n    0x0004003D, 0x0000000B, 0x00005F5A, 0x00004902, 0x00070050, 0x00000017,\n    0x00005130, 0x00003AD5, 0x0000333C, 0x0000333D, 0x00005F5A, 0x000200F9,\n    0x00004F4A, 0x000200F8, 0x000019C1, 0x000500C2, 0x0000000B, 0x00005FA8,\n    0x00001FB2, 0x00000A11, 0x00060041, 0x00000289, 0x0000343E, 0x00000CC7,\n    0x00000A0B, 0x00005FA8, 0x0004003D, 0x0000000B, 0x00003148, 0x0000343E,\n    0x00050080, 0x0000000B, 0x00002DB4, 0x00005FA8, 0x00000A0D, 0x00060041,\n    0x00000289, 0x00001906, 0x00000CC7, 0x00000A0B, 0x00002DB4, 0x0004003D,\n    0x0000000B, 0x00005C68, 0x00001906, 0x00050080, 0x0000000B, 0x00002DB5,\n    0x00005FA8, 0x00000A10, 0x00060041, 0x00000289, 0x00001907, 0x00000CC7,\n    0x00000A0B, 0x00002DB5, 0x0004003D, 0x0000000B, 0x00005C69, 0x00001907,\n    0x00050080, 0x0000000B, 0x00002DB6, 0x00005FA8, 0x00000A13, 0x00060041,\n    0x00000289, 0x00005FF3, 0x00000CC7, 0x00000A0B, 0x00002DB6, 0x0004003D,\n    0x0000000B, 0x00003FFE, 0x00005FF3, 0x00070050, 0x00000017, 0x00005131,\n    0x00003148, 0x00005C68, 0x00005C69, 0x00003FFE, 0x000200F9, 0x00004F4A,\n    0x000200F8, 0x00004F4A, 0x000700F5, 0x00000017, 0x00002AC0, 0x00005131,\n    0x000019C1, 0x00005130, 0x00002301, 0x000300F7, 0x00003F61, 0x00000000,\n    0x001300FB, 0x00002180, 0x00004BFC, 0x00000000, 0x000038FA, 0x00000001,\n    0x000038FA, 0x00000002, 0x00001CBD, 0x0000000A, 0x00001CBD, 0x00000003,\n    0x00001CBC, 0x0000000C, 0x00001CBC, 0x00000004, 0x00001FFF, 0x00000006,\n    0x00002035, 0x000200F8, 0x00002035, 0x00050051, 0x0000000B, 0x00005F58,\n    0x00002AC0, 0x00000000, 0x0006000C, 0x00000013, 0x00006069, 0x00000001,\n    0x0000003E, 0x00005F58, 0x00050051, 0x0000000D, 0x0000276A, 0x00006069,\n    0x00000000, 0x00050051, 0x0000000D, 0x0000444C, 0x00006069, 0x00000001,\n    0x00070050, 0x0000001D, 0x00003912, 0x0000276A, 0x0000444C, 0x00000A0C,\n    0x00000A0C, 0x00050051, 0x0000000B, 0x00004380, 0x00002AC0, 0x00000001,\n    0x0006000C, 0x00000013, 0x00004671, 0x00000001, 0x0000003E, 0x00004380,\n    0x00050051, 0x0000000D, 0x0000276B, 0x00004671, 0x00000000, 0x00050051,\n    0x0000000D, 0x0000444D, 0x00004671, 0x00000001, 0x00070050, 0x0000001D,\n    0x00003913, 0x0000276B, 0x0000444D, 0x00000A0C, 0x00000A0C, 0x00050051,\n    0x0000000B, 0x00004381, 0x00002AC0, 0x00000002, 0x0006000C, 0x00000013,\n    0x00004672, 0x00000001, 0x0000003E, 0x00004381, 0x00050051, 0x0000000D,\n    0x0000276C, 0x00004672, 0x00000000, 0x00050051, 0x0000000D, 0x0000444E,\n    0x00004672, 0x00000001, 0x00070050, 0x0000001D, 0x00003914, 0x0000276C,\n    0x0000444E, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x00004382,\n    0x00002AC0, 0x00000003, 0x0006000C, 0x00000013, 0x00004673, 0x00000001,\n    0x0000003E, 0x00004382, 0x00050051, 0x0000000D, 0x0000276D, 0x00004673,\n    0x00000000, 0x00050051, 0x0000000D, 0x000050C0, 0x00004673, 0x00000001,\n    0x00070050, 0x0000001D, 0x0000234E, 0x0000276D, 0x000050C0, 0x00000A0C,\n    0x00000A0C, 0x000200F9, 0x00003F61, 0x000200F8, 0x00001FFF, 0x00050051,\n    0x0000000B, 0x0000308D, 0x00002AC0, 0x00000000, 0x0004007C, 0x0000000C,\n    0x0000589E, 0x0000308D, 0x00050050, 0x00000012, 0x0000471E, 0x0000589E,\n    0x0000589E, 0x000500C4, 0x00000012, 0x000047B1, 0x0000471E, 0x000007A7,\n    0x000500C3, 0x00000012, 0x0000341B, 0x000047B1, 0x00000867, 0x0004006F,\n    0x00000013, 0x00002AA3, 0x0000341B, 0x0005008E, 0x00000013, 0x0000474B,\n    0x00002AA3, 0x000007FE, 0x0007000C, 0x00000013, 0x00005E0A, 0x00000001,\n    0x00000028, 0x00000049, 0x0000474B, 0x00050051, 0x0000000D, 0x00005F0E,\n    0x00005E0A, 0x00000000, 0x00050051, 0x0000000D, 0x00003CD7, 0x00005E0A,\n    0x00000001, 0x00070050, 0x0000001D, 0x00004121, 0x00005F0E, 0x00003CD7,\n    0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x00004C45, 0x00002AC0,\n    0x00000001, 0x0004007C, 0x0000000C, 0x00003EA4, 0x00004C45, 0x00050050,\n    0x00000012, 0x0000471F, 0x00003EA4, 0x00003EA4, 0x000500C4, 0x00000012,\n    0x000047B2, 0x0000471F, 0x000007A7, 0x000500C3, 0x00000012, 0x0000341C,\n    0x000047B2, 0x00000867, 0x0004006F, 0x00000013, 0x00002AA4, 0x0000341C,\n    0x0005008E, 0x00000013, 0x0000474C, 0x00002AA4, 0x000007FE, 0x0007000C,\n    0x00000013, 0x00005E0B, 0x00000001, 0x00000028, 0x00000049, 0x0000474C,\n    0x00050051, 0x0000000D, 0x00005F0F, 0x00005E0B, 0x00000000, 0x00050051,\n    0x0000000D, 0x00003CD8, 0x00005E0B, 0x00000001, 0x00070050, 0x0000001D,\n    0x00004122, 0x00005F0F, 0x00003CD8, 0x00000A0C, 0x00000A0C, 0x00050051,\n    0x0000000B, 0x00004C46, 0x00002AC0, 0x00000002, 0x0004007C, 0x0000000C,\n    0x00003EA5, 0x00004C46, 0x00050050, 0x00000012, 0x00004720, 0x00003EA5,\n    0x00003EA5, 0x000500C4, 0x00000012, 0x000047B3, 0x00004720, 0x000007A7,\n    0x000500C3, 0x00000012, 0x0000341D, 0x000047B3, 0x00000867, 0x0004006F,\n    0x00000013, 0x00002AA5, 0x0000341D, 0x0005008E, 0x00000013, 0x0000474D,\n    0x00002AA5, 0x000007FE, 0x0007000C, 0x00000013, 0x00005E0C, 0x00000001,\n    0x00000028, 0x00000049, 0x0000474D, 0x00050051, 0x0000000D, 0x00005F10,\n    0x00005E0C, 0x00000000, 0x00050051, 0x0000000D, 0x00003CD9, 0x00005E0C,\n    0x00000001, 0x00070050, 0x0000001D, 0x00004123, 0x00005F10, 0x00003CD9,\n    0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x00004C47, 0x00002AC0,\n    0x00000003, 0x0004007C, 0x0000000C, 0x00003EA6, 0x00004C47, 0x00050050,\n    0x00000012, 0x00004724, 0x00003EA6, 0x00003EA6, 0x000500C4, 0x00000012,\n    0x000047B4, 0x00004724, 0x000007A7, 0x000500C3, 0x00000012, 0x0000341E,\n    0x000047B4, 0x00000867, 0x0004006F, 0x00000013, 0x00002AA6, 0x0000341E,\n    0x0005008E, 0x00000013, 0x0000474E, 0x00002AA6, 0x000007FE, 0x0007000C,\n    0x00000013, 0x00005E0D, 0x00000001, 0x00000028, 0x00000049, 0x0000474E,\n    0x00050051, 0x0000000D, 0x00005F11, 0x00005E0D, 0x00000000, 0x00050051,\n    0x0000000D, 0x0000494D, 0x00005E0D, 0x00000001, 0x00070050, 0x0000001D,\n    0x0000234F, 0x00005F11, 0x0000494D, 0x00000A0C, 0x00000A0C, 0x000200F9,\n    0x00003F61, 0x000200F8, 0x00001CBC, 0x00050051, 0x0000000B, 0x000056C0,\n    0x00002AC0, 0x00000000, 0x00060050, 0x00000014, 0x00004F0D, 0x000056C0,\n    0x000056C0, 0x000056C0, 0x000500C2, 0x00000014, 0x00002B12, 0x00004F0D,\n    0x00000BB4, 0x000500C7, 0x00000014, 0x00005DEA, 0x00002B12, 0x00000105,\n    0x000500C7, 0x00000014, 0x000048A0, 0x00002B12, 0x00000466, 0x000500C2,\n    0x00000014, 0x00005B94, 0x00005DEA, 0x00000B0C, 0x000500AA, 0x00000010,\n    0x000040CD, 0x00005B94, 0x00000A12, 0x0006000C, 0x00000016, 0x00002C4F,\n    0x00000001, 0x0000004B, 0x000048A0, 0x0004007C, 0x00000014, 0x00002A19,\n    0x00002C4F, 0x00050082, 0x00000014, 0x0000187E, 0x00000B0C, 0x00002A19,\n    0x00050080, 0x00000014, 0x00002214, 0x00002A19, 0x00000938, 0x000600A9,\n    0x00000014, 0x00002873, 0x000040CD, 0x00002214, 0x00005B94, 0x000500C4,\n    0x00000014, 0x00005AD8, 0x000048A0, 0x0000187E, 0x000500C7, 0x00000014,\n    0x0000499E, 0x00005AD8, 0x00000466, 0x000600A9, 0x00000014, 0x00002AA7,\n    0x000040CD, 0x0000499E, 0x000048A0, 0x00050080, 0x00000014, 0x00005FFD,\n    0x00002873, 0x000003FA, 0x000500C4, 0x00000014, 0x00004F83, 0x00005FFD,\n    0x00000189, 0x000500C4, 0x00000014, 0x00003FAA, 0x00002AA7, 0x0000008D,\n    0x000500C5, 0x00000014, 0x00005780, 0x00004F83, 0x00003FAA, 0x000500AA,\n    0x00000010, 0x00003604, 0x00005DEA, 0x00000A12, 0x000600A9, 0x00000014,\n    0x00004246, 0x00003604, 0x00000A12, 0x00005780, 0x0004007C, 0x00000018,\n    0x000029D3, 0x00004246, 0x000500C2, 0x0000000B, 0x00004BA8, 0x000056C0,\n    0x00000A64, 0x00040070, 0x0000000D, 0x00004812, 0x00004BA8, 0x00050085,\n    0x0000000D, 0x00003E23, 0x00004812, 0x00000149, 0x00050051, 0x0000000D,\n    0x000053C6, 0x000029D3, 0x00000000, 0x00050051, 0x0000000D, 0x00002A59,\n    0x000029D3, 0x00000001, 0x00050051, 0x0000000D, 0x00001E9C, 0x000029D3,\n    0x00000002, 0x00070050, 0x0000001D, 0x00003DDD, 0x000053C6, 0x00002A59,\n    0x00001E9C, 0x00003E23, 0x00050051, 0x0000000B, 0x000027F8, 0x00002AC0,\n    0x00000001, 0x00060050, 0x00000014, 0x00003511, 0x000027F8, 0x000027F8,\n    0x000027F8, 0x000500C2, 0x00000014, 0x00002B13, 0x00003511, 0x00000BB4,\n    0x000500C7, 0x00000014, 0x00005DEB, 0x00002B13, 0x00000105, 0x000500C7,\n    0x00000014, 0x000048A1, 0x00002B13, 0x00000466, 0x000500C2, 0x00000014,\n    0x00005B95, 0x00005DEB, 0x00000B0C, 0x000500AA, 0x00000010, 0x000040CE,\n    0x00005B95, 0x00000A12, 0x0006000C, 0x00000016, 0x00002C50, 0x00000001,\n    0x0000004B, 0x000048A1, 0x0004007C, 0x00000014, 0x00002A1A, 0x00002C50,\n    0x00050082, 0x00000014, 0x0000187F, 0x00000B0C, 0x00002A1A, 0x00050080,\n    0x00000014, 0x00002215, 0x00002A1A, 0x00000938, 0x000600A9, 0x00000014,\n    0x00002874, 0x000040CE, 0x00002215, 0x00005B95, 0x000500C4, 0x00000014,\n    0x00005AD9, 0x000048A1, 0x0000187F, 0x000500C7, 0x00000014, 0x0000499F,\n    0x00005AD9, 0x00000466, 0x000600A9, 0x00000014, 0x00002AA8, 0x000040CE,\n    0x0000499F, 0x000048A1, 0x00050080, 0x00000014, 0x00005FFE, 0x00002874,\n    0x000003FA, 0x000500C4, 0x00000014, 0x00004F84, 0x00005FFE, 0x00000189,\n    0x000500C4, 0x00000014, 0x00003FAB, 0x00002AA8, 0x0000008D, 0x000500C5,\n    0x00000014, 0x00005781, 0x00004F84, 0x00003FAB, 0x000500AA, 0x00000010,\n    0x00003605, 0x00005DEB, 0x00000A12, 0x000600A9, 0x00000014, 0x00004247,\n    0x00003605, 0x00000A12, 0x00005781, 0x0004007C, 0x00000018, 0x000029D4,\n    0x00004247, 0x000500C2, 0x0000000B, 0x00004BA9, 0x000027F8, 0x00000A64,\n    0x00040070, 0x0000000D, 0x00004813, 0x00004BA9, 0x00050085, 0x0000000D,\n    0x00003E24, 0x00004813, 0x00000149, 0x00050051, 0x0000000D, 0x000053C7,\n    0x000029D4, 0x00000000, 0x00050051, 0x0000000D, 0x00002A5A, 0x000029D4,\n    0x00000001, 0x00050051, 0x0000000D, 0x00001E9D, 0x000029D4, 0x00000002,\n    0x00070050, 0x0000001D, 0x00003DDE, 0x000053C7, 0x00002A5A, 0x00001E9D,\n    0x00003E24, 0x00050051, 0x0000000B, 0x000027F9, 0x00002AC0, 0x00000002,\n    0x00060050, 0x00000014, 0x00003512, 0x000027F9, 0x000027F9, 0x000027F9,\n    0x000500C2, 0x00000014, 0x00002B14, 0x00003512, 0x00000BB4, 0x000500C7,\n    0x00000014, 0x00005DEC, 0x00002B14, 0x00000105, 0x000500C7, 0x00000014,\n    0x000048A2, 0x00002B14, 0x00000466, 0x000500C2, 0x00000014, 0x00005B96,\n    0x00005DEC, 0x00000B0C, 0x000500AA, 0x00000010, 0x000040CF, 0x00005B96,\n    0x00000A12, 0x0006000C, 0x00000016, 0x00002C51, 0x00000001, 0x0000004B,\n    0x000048A2, 0x0004007C, 0x00000014, 0x00002A1B, 0x00002C51, 0x00050082,\n    0x00000014, 0x00001880, 0x00000B0C, 0x00002A1B, 0x00050080, 0x00000014,\n    0x00002216, 0x00002A1B, 0x00000938, 0x000600A9, 0x00000014, 0x00002875,\n    0x000040CF, 0x00002216, 0x00005B96, 0x000500C4, 0x00000014, 0x00005ADA,\n    0x000048A2, 0x00001880, 0x000500C7, 0x00000014, 0x000049A0, 0x00005ADA,\n    0x00000466, 0x000600A9, 0x00000014, 0x00002AA9, 0x000040CF, 0x000049A0,\n    0x000048A2, 0x00050080, 0x00000014, 0x00005FFF, 0x00002875, 0x000003FA,\n    0x000500C4, 0x00000014, 0x00004F85, 0x00005FFF, 0x00000189, 0x000500C4,\n    0x00000014, 0x00003FAC, 0x00002AA9, 0x0000008D, 0x000500C5, 0x00000014,\n    0x00005782, 0x00004F85, 0x00003FAC, 0x000500AA, 0x00000010, 0x00003606,\n    0x00005DEC, 0x00000A12, 0x000600A9, 0x00000014, 0x00004248, 0x00003606,\n    0x00000A12, 0x00005782, 0x0004007C, 0x00000018, 0x000029D5, 0x00004248,\n    0x000500C2, 0x0000000B, 0x00004BAA, 0x000027F9, 0x00000A64, 0x00040070,\n    0x0000000D, 0x00004814, 0x00004BAA, 0x00050085, 0x0000000D, 0x00003E25,\n    0x00004814, 0x00000149, 0x00050051, 0x0000000D, 0x000053C8, 0x000029D5,\n    0x00000000, 0x00050051, 0x0000000D, 0x00002A5B, 0x000029D5, 0x00000001,\n    0x00050051, 0x0000000D, 0x00001E9E, 0x000029D5, 0x00000002, 0x00070050,\n    0x0000001D, 0x00003DDF, 0x000053C8, 0x00002A5B, 0x00001E9E, 0x00003E25,\n    0x00050051, 0x0000000B, 0x000027FA, 0x00002AC0, 0x00000003, 0x00060050,\n    0x00000014, 0x00003513, 0x000027FA, 0x000027FA, 0x000027FA, 0x000500C2,\n    0x00000014, 0x00002B15, 0x00003513, 0x00000BB4, 0x000500C7, 0x00000014,\n    0x00005DED, 0x00002B15, 0x00000105, 0x000500C7, 0x00000014, 0x000048A3,\n    0x00002B15, 0x00000466, 0x000500C2, 0x00000014, 0x00005B97, 0x00005DED,\n    0x00000B0C, 0x000500AA, 0x00000010, 0x000040D0, 0x00005B97, 0x00000A12,\n    0x0006000C, 0x00000016, 0x00002C52, 0x00000001, 0x0000004B, 0x000048A3,\n    0x0004007C, 0x00000014, 0x00002A1C, 0x00002C52, 0x00050082, 0x00000014,\n    0x00001881, 0x00000B0C, 0x00002A1C, 0x00050080, 0x00000014, 0x00002217,\n    0x00002A1C, 0x00000938, 0x000600A9, 0x00000014, 0x00002876, 0x000040D0,\n    0x00002217, 0x00005B97, 0x000500C4, 0x00000014, 0x00005ADB, 0x000048A3,\n    0x00001881, 0x000500C7, 0x00000014, 0x000049A1, 0x00005ADB, 0x00000466,\n    0x000600A9, 0x00000014, 0x00002AAA, 0x000040D0, 0x000049A1, 0x000048A3,\n    0x00050080, 0x00000014, 0x00006000, 0x00002876, 0x000003FA, 0x000500C4,\n    0x00000014, 0x00004F86, 0x00006000, 0x00000189, 0x000500C4, 0x00000014,\n    0x00003FAD, 0x00002AAA, 0x0000008D, 0x000500C5, 0x00000014, 0x00005783,\n    0x00004F86, 0x00003FAD, 0x000500AA, 0x00000010, 0x00003607, 0x00005DED,\n    0x00000A12, 0x000600A9, 0x00000014, 0x00004249, 0x00003607, 0x00000A12,\n    0x00005783, 0x0004007C, 0x00000018, 0x000029D6, 0x00004249, 0x000500C2,\n    0x0000000B, 0x00004BAB, 0x000027FA, 0x00000A64, 0x00040070, 0x0000000D,\n    0x00004815, 0x00004BAB, 0x00050085, 0x0000000D, 0x00003E26, 0x00004815,\n    0x00000149, 0x00050051, 0x0000000D, 0x000053C9, 0x000029D6, 0x00000000,\n    0x00050051, 0x0000000D, 0x00002A5C, 0x000029D6, 0x00000001, 0x00050051,\n    0x0000000D, 0x00002B16, 0x000029D6, 0x00000002, 0x00070050, 0x0000001D,\n    0x00002350, 0x000053C9, 0x00002A5C, 0x00002B16, 0x00003E26, 0x000200F9,\n    0x00003F61, 0x000200F8, 0x00001CBD, 0x00050051, 0x0000000B, 0x000056C1,\n    0x00002AC0, 0x00000000, 0x00070050, 0x00000017, 0x00004F0E, 0x000056C1,\n    0x000056C1, 0x000056C1, 0x000056C1, 0x000500C2, 0x00000017, 0x000024A0,\n    0x00004F0E, 0x0000034D, 0x000500C7, 0x00000017, 0x000049AF, 0x000024A0,\n    0x0000027B, 0x00040070, 0x0000001D, 0x00003CBA, 0x000049AF, 0x00050085,\n    0x0000001D, 0x00004133, 0x00003CBA, 0x00000AEE, 0x00050051, 0x0000000B,\n    0x00005CD5, 0x00002AC0, 0x00000001, 0x00070050, 0x00000017, 0x00005150,\n    0x00005CD5, 0x00005CD5, 0x00005CD5, 0x00005CD5, 0x000500C2, 0x00000017,\n    0x000024A1, 0x00005150, 0x0000034D, 0x000500C7, 0x00000017, 0x000049B0,\n    0x000024A1, 0x0000027B, 0x00040070, 0x0000001D, 0x00003CBB, 0x000049B0,\n    0x00050085, 0x0000001D, 0x00004134, 0x00003CBB, 0x00000AEE, 0x00050051,\n    0x0000000B, 0x00005CD6, 0x00002AC0, 0x00000002, 0x00070050, 0x00000017,\n    0x00005151, 0x00005CD6, 0x00005CD6, 0x00005CD6, 0x00005CD6, 0x000500C2,\n    0x00000017, 0x000024A2, 0x00005151, 0x0000034D, 0x000500C7, 0x00000017,\n    0x000049B1, 0x000024A2, 0x0000027B, 0x00040070, 0x0000001D, 0x00003CBC,\n    0x000049B1, 0x00050085, 0x0000001D, 0x00004135, 0x00003CBC, 0x00000AEE,\n    0x00050051, 0x0000000B, 0x00005CD7, 0x00002AC0, 0x00000003, 0x00070050,\n    0x00000017, 0x00005152, 0x00005CD7, 0x00005CD7, 0x00005CD7, 0x00005CD7,\n    0x000500C2, 0x00000017, 0x000024A3, 0x00005152, 0x0000034D, 0x000500C7,\n    0x00000017, 0x000049B2, 0x000024A3, 0x0000027B, 0x00040070, 0x0000001D,\n    0x00004930, 0x000049B2, 0x00050085, 0x0000001D, 0x000026A0, 0x00004930,\n    0x00000AEE, 0x000200F9, 0x00003F61, 0x000200F8, 0x000038FA, 0x00050051,\n    0x0000000B, 0x000056C2, 0x00002AC0, 0x00000000, 0x00070050, 0x00000017,\n    0x00004F0F, 0x000056C2, 0x000056C2, 0x000056C2, 0x000056C2, 0x000500C2,\n    0x00000017, 0x000024A4, 0x00004F0F, 0x0000028D, 0x000500C7, 0x00000017,\n    0x00004A5A, 0x000024A4, 0x0000064B, 0x00040070, 0x0000001D, 0x000036A5,\n    0x00004A5A, 0x0005008E, 0x0000001D, 0x00004B26, 0x000036A5, 0x0000017A,\n    0x00050051, 0x0000000B, 0x000021A2, 0x00002AC0, 0x00000001, 0x00070050,\n    0x00000017, 0x0000610E, 0x000021A2, 0x000021A2, 0x000021A2, 0x000021A2,\n    0x000500C2, 0x00000017, 0x000024A5, 0x0000610E, 0x0000028D, 0x000500C7,\n    0x00000017, 0x00004A5B, 0x000024A5, 0x0000064B, 0x00040070, 0x0000001D,\n    0x000036A6, 0x00004A5B, 0x0005008E, 0x0000001D, 0x00004B27, 0x000036A6,\n    0x0000017A, 0x00050051, 0x0000000B, 0x000021A3, 0x00002AC0, 0x00000002,\n    0x00070050, 0x00000017, 0x0000610F, 0x000021A3, 0x000021A3, 0x000021A3,\n    0x000021A3, 0x000500C2, 0x00000017, 0x000024A6, 0x0000610F, 0x0000028D,\n    0x000500C7, 0x00000017, 0x00004A5C, 0x000024A6, 0x0000064B, 0x00040070,\n    0x0000001D, 0x000036A7, 0x00004A5C, 0x0005008E, 0x0000001D, 0x00004B28,\n    0x000036A7, 0x0000017A, 0x00050051, 0x0000000B, 0x000021A4, 0x00002AC0,\n    0x00000003, 0x00070050, 0x00000017, 0x00006110, 0x000021A4, 0x000021A4,\n    0x000021A4, 0x000021A4, 0x000500C2, 0x00000017, 0x000024A7, 0x00006110,\n    0x0000028D, 0x000500C7, 0x00000017, 0x00004A5D, 0x000024A7, 0x0000064B,\n    0x00040070, 0x0000001D, 0x0000431B, 0x00004A5D, 0x0005008E, 0x0000001D,\n    0x00003093, 0x0000431B, 0x0000017A, 0x000200F9, 0x00003F61, 0x000200F8,\n    0x00004BFC, 0x00050051, 0x0000000B, 0x0000308E, 0x00002AC0, 0x00000000,\n    0x0004007C, 0x0000000D, 0x00004FEF, 0x0000308E, 0x00050050, 0x00000013,\n    0x00004339, 0x00004FEF, 0x00000A0C, 0x0009004F, 0x0000001D, 0x00002D93,\n    0x00004339, 0x00004339, 0x00000000, 0x00000001, 0x00000001, 0x00000001,\n    0x00050051, 0x0000000B, 0x000056B4, 0x00002AC0, 0x00000001, 0x0004007C,\n    0x0000000D, 0x00003F6B, 0x000056B4, 0x00050050, 0x00000013, 0x0000433A,\n    0x00003F6B, 0x00000A0C, 0x0009004F, 0x0000001D, 0x00002D94, 0x0000433A,\n    0x0000433A, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00050051,\n    0x0000000B, 0x000056B5, 0x00002AC0, 0x00000002, 0x0004007C, 0x0000000D,\n    0x00003F6C, 0x000056B5, 0x00050050, 0x00000013, 0x0000433B, 0x00003F6C,\n    0x00000A0C, 0x0009004F, 0x0000001D, 0x00002D95, 0x0000433B, 0x0000433B,\n    0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00050051, 0x0000000B,\n    0x000056B6, 0x00002AC0, 0x00000003, 0x0004007C, 0x0000000D, 0x00003F6D,\n    0x000056B6, 0x00050050, 0x00000013, 0x00004FAF, 0x00003F6D, 0x00000A0C,\n    0x0009004F, 0x0000001D, 0x00005A3B, 0x00004FAF, 0x00004FAF, 0x00000000,\n    0x00000001, 0x00000001, 0x00000001, 0x000200F9, 0x00003F61, 0x000200F8,\n    0x00003F61, 0x000F00F5, 0x0000001D, 0x00002BAA, 0x00005A3B, 0x00004BFC,\n    0x00003093, 0x000038FA, 0x000026A0, 0x00001CBD, 0x00002350, 0x00001CBC,\n    0x0000234F, 0x00001FFF, 0x0000234E, 0x00002035, 0x000F00F5, 0x0000001D,\n    0x0000380B, 0x00002D95, 0x00004BFC, 0x00004B28, 0x000038FA, 0x00004135,\n    0x00001CBD, 0x00003DDF, 0x00001CBC, 0x00004123, 0x00001FFF, 0x00003914,\n    0x00002035, 0x000F00F5, 0x0000001D, 0x00003B7F, 0x00002D94, 0x00004BFC,\n    0x00004B27, 0x000038FA, 0x00004134, 0x00001CBD, 0x00003DDE, 0x00001CBC,\n    0x00004122, 0x00001FFF, 0x00003913, 0x00002035, 0x000F00F5, 0x0000001D,\n    0x000038B8, 0x00002D93, 0x00004BFC, 0x00004B26, 0x000038FA, 0x00004133,\n    0x00001CBD, 0x00003DDD, 0x00001CBC, 0x00004121, 0x00001FFF, 0x00003912,\n    0x00002035, 0x000200F9, 0x00005310, 0x000200F8, 0x00003B66, 0x000500AA,\n    0x00000009, 0x00005451, 0x0000199B, 0x00000A22, 0x000300F7, 0x00004F25,\n    0x00000002, 0x000400FA, 0x00005451, 0x000019C2, 0x00002302, 0x000200F8,\n    0x00002302, 0x000500C2, 0x0000000B, 0x00005633, 0x00001FB2, 0x00000A11,\n    0x00060041, 0x00000289, 0x0000343F, 0x00000CC7, 0x00000A0B, 0x00005633,\n    0x0004003D, 0x0000000B, 0x00003149, 0x0000343F, 0x00050080, 0x0000000B,\n    0x00002DB7, 0x00005633, 0x00000A0D, 0x00060041, 0x00000289, 0x00001908,\n    0x00000CC7, 0x00000A0B, 0x00002DB7, 0x0004003D, 0x0000000B, 0x00001B77,\n    0x00001908, 0x00050080, 0x0000000B, 0x00002148, 0x00001FB2, 0x0000199B,\n    0x000500C2, 0x0000000B, 0x000054A9, 0x00002148, 0x00000A11, 0x00060041,\n    0x00000289, 0x00004C95, 0x00000CC7, 0x00000A0B, 0x000054A9, 0x0004003D,\n    0x0000000B, 0x0000314A, 0x00004C95, 0x00050080, 0x0000000B, 0x00002DB8,\n    0x000054A9, 0x00000A0D, 0x00060041, 0x00000289, 0x00005FF4, 0x00000CC7,\n    0x00000A0B, 0x00002DB8, 0x0004003D, 0x0000000B, 0x0000374D, 0x00005FF4,\n    0x00070050, 0x00000017, 0x00004CD7, 0x00003149, 0x00001B77, 0x0000314A,\n    0x0000374D, 0x00050084, 0x0000000B, 0x00004C2C, 0x00000A10, 0x0000199B,\n    0x00050080, 0x0000000B, 0x00002A46, 0x00001FB2, 0x00004C2C, 0x000500C2,\n    0x0000000B, 0x000045E8, 0x00002A46, 0x00000A11, 0x00060041, 0x00000289,\n    0x00004C96, 0x00000CC7, 0x00000A0B, 0x000045E8, 0x0004003D, 0x0000000B,\n    0x0000314B, 0x00004C96, 0x00050080, 0x0000000B, 0x00002DB9, 0x000045E8,\n    0x00000A0D, 0x00060041, 0x00000289, 0x0000194C, 0x00000CC7, 0x00000A0B,\n    0x00002DB9, 0x0004003D, 0x0000000B, 0x00005E5C, 0x0000194C, 0x00050084,\n    0x0000000B, 0x000021F2, 0x00000A13, 0x0000199B, 0x00050080, 0x0000000B,\n    0x00005EC3, 0x00001FB2, 0x000021F2, 0x000500C2, 0x0000000B, 0x000045E9,\n    0x00005EC3, 0x00000A11, 0x00060041, 0x00000289, 0x00004C97, 0x00000CC7,\n    0x00000A0B, 0x000045E9, 0x0004003D, 0x0000000B, 0x0000314C, 0x00004C97,\n    0x00050080, 0x0000000B, 0x00002DBA, 0x000045E9, 0x00000A0D, 0x00060041,\n    0x00000289, 0x00005FF5, 0x00000CC7, 0x00000A0B, 0x00002DBA, 0x0004003D,\n    0x0000000B, 0x00003FFF, 0x00005FF5, 0x00070050, 0x00000017, 0x00005132,\n    0x0000314B, 0x00005E5C, 0x0000314C, 0x00003FFF, 0x000200F9, 0x00004F25,\n    0x000200F8, 0x000019C2, 0x000500C2, 0x0000000B, 0x00005FA9, 0x00001FB2,\n    0x00000A11, 0x00060041, 0x00000289, 0x00003440, 0x00000CC7, 0x00000A0B,\n    0x00005FA9, 0x0004003D, 0x0000000B, 0x0000314D, 0x00003440, 0x00050080,\n    0x0000000B, 0x00002DBB, 0x00005FA9, 0x00000A0D, 0x00060041, 0x00000289,\n    0x00001909, 0x00000CC7, 0x00000A0B, 0x00002DBB, 0x0004003D, 0x0000000B,\n    0x00005C6A, 0x00001909, 0x00050080, 0x0000000B, 0x00002DBC, 0x00005FA9,\n    0x00000A10, 0x00060041, 0x00000289, 0x0000190A, 0x00000CC7, 0x00000A0B,\n    0x00002DBC, 0x0004003D, 0x0000000B, 0x00005C6B, 0x0000190A, 0x00050080,\n    0x0000000B, 0x00002DBD, 0x00005FA9, 0x00000A13, 0x00060041, 0x00000289,\n    0x00005FF6, 0x00000CC7, 0x00000A0B, 0x00002DBD, 0x0004003D, 0x0000000B,\n    0x00003701, 0x00005FF6, 0x00070050, 0x00000017, 0x00005471, 0x0000314D,\n    0x00005C6A, 0x00005C6B, 0x00003701, 0x00050080, 0x0000000B, 0x00004B84,\n    0x00001FB2, 0x00000A3A, 0x000500C2, 0x0000000B, 0x0000202E, 0x00004B84,\n    0x00000A11, 0x00060041, 0x00000289, 0x00004C98, 0x00000CC7, 0x00000A0B,\n    0x0000202E, 0x0004003D, 0x0000000B, 0x0000314E, 0x00004C98, 0x00050080,\n    0x0000000B, 0x00002DBE, 0x0000202E, 0x00000A0D, 0x00060041, 0x00000289,\n    0x0000190B, 0x00000CC7, 0x00000A0B, 0x00002DBE, 0x0004003D, 0x0000000B,\n    0x00005C6C, 0x0000190B, 0x00050080, 0x0000000B, 0x00002DBF, 0x0000202E,\n    0x00000A10, 0x00060041, 0x00000289, 0x0000190C, 0x00000CC7, 0x00000A0B,\n    0x00002DBF, 0x0004003D, 0x0000000B, 0x00005C6D, 0x0000190C, 0x00050080,\n    0x0000000B, 0x00002DC0, 0x0000202E, 0x00000A13, 0x00060041, 0x00000289,\n    0x00005FF7, 0x00000CC7, 0x00000A0B, 0x00002DC0, 0x0004003D, 0x0000000B,\n    0x00004000, 0x00005FF7, 0x00070050, 0x00000017, 0x00005133, 0x0000314E,\n    0x00005C6C, 0x00005C6D, 0x00004000, 0x000200F9, 0x00004F25, 0x000200F8,\n    0x00004F25, 0x000700F5, 0x00000017, 0x00002BCE, 0x00005133, 0x000019C2,\n    0x00005132, 0x00002302, 0x000700F5, 0x00000017, 0x00003721, 0x00005471,\n    0x000019C2, 0x00004CD7, 0x00002302, 0x000300F7, 0x00004F26, 0x00000000,\n    0x000700FB, 0x00002180, 0x00004F57, 0x00000005, 0x00002159, 0x00000007,\n    0x00002036, 0x000200F8, 0x00002036, 0x00050051, 0x0000000B, 0x00005F5B,\n    0x00003721, 0x00000000, 0x0006000C, 0x00000013, 0x0000606A, 0x00000001,\n    0x0000003E, 0x00005F5B, 0x00050051, 0x0000000D, 0x00002779, 0x0000606A,\n    0x00000000, 0x00050051, 0x0000000D, 0x00003EBC, 0x0000606A, 0x00000001,\n    0x00050051, 0x0000000B, 0x00004285, 0x00003721, 0x00000001, 0x0006000C,\n    0x00000013, 0x00003CF9, 0x00000001, 0x0000003E, 0x00004285, 0x00050051,\n    0x0000000D, 0x0000276E, 0x00003CF9, 0x00000000, 0x00050051, 0x0000000D,\n    0x0000444F, 0x00003CF9, 0x00000001, 0x00070050, 0x0000001D, 0x00003915,\n    0x00002779, 0x00003EBC, 0x0000276E, 0x0000444F, 0x00050051, 0x0000000B,\n    0x00004383, 0x00003721, 0x00000002, 0x0006000C, 0x00000013, 0x00004674,\n    0x00000001, 0x0000003E, 0x00004383, 0x00050051, 0x0000000D, 0x0000277A,\n    0x00004674, 0x00000000, 0x00050051, 0x0000000D, 0x00003EBD, 0x00004674,\n    0x00000001, 0x00050051, 0x0000000B, 0x00004286, 0x00003721, 0x00000003,\n    0x0006000C, 0x00000013, 0x00003CFA, 0x00000001, 0x0000003E, 0x00004286,\n    0x00050051, 0x0000000D, 0x0000276F, 0x00003CFA, 0x00000000, 0x00050051,\n    0x0000000D, 0x00004450, 0x00003CFA, 0x00000001, 0x00070050, 0x0000001D,\n    0x00003916, 0x0000277A, 0x00003EBD, 0x0000276F, 0x00004450, 0x00050051,\n    0x0000000B, 0x00004384, 0x00002BCE, 0x00000000, 0x0006000C, 0x00000013,\n    0x00004675, 0x00000001, 0x0000003E, 0x00004384, 0x00050051, 0x0000000D,\n    0x0000277B, 0x00004675, 0x00000000, 0x00050051, 0x0000000D, 0x00003EBE,\n    0x00004675, 0x00000001, 0x00050051, 0x0000000B, 0x00004287, 0x00002BCE,\n    0x00000001, 0x0006000C, 0x00000013, 0x00003CFB, 0x00000001, 0x0000003E,\n    0x00004287, 0x00050051, 0x0000000D, 0x00002770, 0x00003CFB, 0x00000000,\n    0x00050051, 0x0000000D, 0x00004451, 0x00003CFB, 0x00000001, 0x00070050,\n    0x0000001D, 0x00003917, 0x0000277B, 0x00003EBE, 0x00002770, 0x00004451,\n    0x00050051, 0x0000000B, 0x00004385, 0x00002BCE, 0x00000002, 0x0006000C,\n    0x00000013, 0x00004676, 0x00000001, 0x0000003E, 0x00004385, 0x00050051,\n    0x0000000D, 0x0000277C, 0x00004676, 0x00000000, 0x00050051, 0x0000000D,\n    0x00003EBF, 0x00004676, 0x00000001, 0x00050051, 0x0000000B, 0x00004288,\n    0x00002BCE, 0x00000003, 0x0006000C, 0x00000013, 0x00003CFC, 0x00000001,\n    0x0000003E, 0x00004288, 0x00050051, 0x0000000D, 0x00002771, 0x00003CFC,\n    0x00000000, 0x00050051, 0x0000000D, 0x000050C1, 0x00003CFC, 0x00000001,\n    0x00070050, 0x0000001D, 0x00002351, 0x0000277C, 0x00003EBF, 0x00002771,\n    0x000050C1, 0x000200F9, 0x00004F26, 0x000200F8, 0x00002159, 0x0007004F,\n    0x00000011, 0x000025FC, 0x00003721, 0x00003721, 0x00000000, 0x00000001,\n    0x0004007C, 0x00000012, 0x00005B3D, 0x000025FC, 0x0009004F, 0x0000001A,\n    0x000060D2, 0x00005B3D, 0x00005B3D, 0x00000000, 0x00000000, 0x00000001,\n    0x00000001, 0x000500C4, 0x0000001A, 0x000048AA, 0x000060D2, 0x00000122,\n    0x000500C3, 0x0000001A, 0x00003D91, 0x000048AA, 0x00000302, 0x0004006F,\n    0x0000001D, 0x00002AAB, 0x00003D91, 0x0005008E, 0x0000001D, 0x00004725,\n    0x00002AAB, 0x000007FE, 0x0007000C, 0x0000001D, 0x00006294, 0x00000001,\n    0x00000028, 0x00000504, 0x00004725, 0x0007004F, 0x00000011, 0x0000376E,\n    0x00003721, 0x00003721, 0x00000002, 0x00000003, 0x0004007C, 0x00000012,\n    0x000024C2, 0x0000376E, 0x0009004F, 0x0000001A, 0x000060D3, 0x000024C2,\n    0x000024C2, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x000500C4,\n    0x0000001A, 0x000048AB, 0x000060D3, 0x00000122, 0x000500C3, 0x0000001A,\n    0x00003D92, 0x000048AB, 0x00000302, 0x0004006F, 0x0000001D, 0x00002AAC,\n    0x00003D92, 0x0005008E, 0x0000001D, 0x00004726, 0x00002AAC, 0x000007FE,\n    0x0007000C, 0x0000001D, 0x00006295, 0x00000001, 0x00000028, 0x00000504,\n    0x00004726, 0x0007004F, 0x00000011, 0x0000376F, 0x00002BCE, 0x00002BCE,\n    0x00000000, 0x00000001, 0x0004007C, 0x00000012, 0x000024C3, 0x0000376F,\n    0x0009004F, 0x0000001A, 0x000060D4, 0x000024C3, 0x000024C3, 0x00000000,\n    0x00000000, 0x00000001, 0x00000001, 0x000500C4, 0x0000001A, 0x000048AC,\n    0x000060D4, 0x00000122, 0x000500C3, 0x0000001A, 0x00003D93, 0x000048AC,\n    0x00000302, 0x0004006F, 0x0000001D, 0x00002AAD, 0x00003D93, 0x0005008E,\n    0x0000001D, 0x00004727, 0x00002AAD, 0x000007FE, 0x0007000C, 0x0000001D,\n    0x00006296, 0x00000001, 0x00000028, 0x00000504, 0x00004727, 0x0007004F,\n    0x00000011, 0x00003770, 0x00002BCE, 0x00002BCE, 0x00000002, 0x00000003,\n    0x0004007C, 0x00000012, 0x000024C4, 0x00003770, 0x0009004F, 0x0000001A,\n    0x000060D5, 0x000024C4, 0x000024C4, 0x00000000, 0x00000000, 0x00000001,\n    0x00000001, 0x000500C4, 0x0000001A, 0x000048AD, 0x000060D5, 0x00000122,\n    0x000500C3, 0x0000001A, 0x00003D94, 0x000048AD, 0x00000302, 0x0004006F,\n    0x0000001D, 0x00002AAE, 0x00003D94, 0x0005008E, 0x0000001D, 0x000053C0,\n    0x00002AAE, 0x000007FE, 0x0007000C, 0x0000001D, 0x00004363, 0x00000001,\n    0x00000028, 0x00000504, 0x000053C0, 0x000200F9, 0x00004F26, 0x000200F8,\n    0x00004F57, 0x0007004F, 0x00000011, 0x00002622, 0x00003721, 0x00003721,\n    0x00000000, 0x00000001, 0x0004007C, 0x00000013, 0x0000515A, 0x00002622,\n    0x00050051, 0x0000000D, 0x00001B80, 0x0000515A, 0x00000000, 0x00050051,\n    0x0000000D, 0x0000346D, 0x0000515A, 0x00000001, 0x00070050, 0x0000001D,\n    0x0000427B, 0x00001B80, 0x0000346D, 0x00000A0C, 0x00000A0C, 0x0007004F,\n    0x00000011, 0x000041DB, 0x00003721, 0x00003721, 0x00000002, 0x00000003,\n    0x0004007C, 0x00000013, 0x00003760, 0x000041DB, 0x00050051, 0x0000000D,\n    0x00001B81, 0x00003760, 0x00000000, 0x00050051, 0x0000000D, 0x0000346E,\n    0x00003760, 0x00000001, 0x00070050, 0x0000001D, 0x0000427C, 0x00001B81,\n    0x0000346E, 0x00000A0C, 0x00000A0C, 0x0007004F, 0x00000011, 0x000041DC,\n    0x00002BCE, 0x00002BCE, 0x00000000, 0x00000001, 0x0004007C, 0x00000013,\n    0x00003761, 0x000041DC, 0x00050051, 0x0000000D, 0x00001B82, 0x00003761,\n    0x00000000, 0x00050051, 0x0000000D, 0x0000346F, 0x00003761, 0x00000001,\n    0x00070050, 0x0000001D, 0x0000427D, 0x00001B82, 0x0000346F, 0x00000A0C,\n    0x00000A0C, 0x0007004F, 0x00000011, 0x000041DD, 0x00002BCE, 0x00002BCE,\n    0x00000002, 0x00000003, 0x0004007C, 0x00000013, 0x00003762, 0x000041DD,\n    0x00050051, 0x0000000D, 0x00001B83, 0x00003762, 0x00000000, 0x00050051,\n    0x0000000D, 0x00004109, 0x00003762, 0x00000001, 0x00070050, 0x0000001D,\n    0x00002352, 0x00001B83, 0x00004109, 0x00000A0C, 0x00000A0C, 0x000200F9,\n    0x00004F26, 0x000200F8, 0x00004F26, 0x000900F5, 0x0000001D, 0x00002BAB,\n    0x00002352, 0x00004F57, 0x00004363, 0x00002159, 0x00002351, 0x00002036,\n    0x000900F5, 0x0000001D, 0x0000380C, 0x0000427D, 0x00004F57, 0x00006296,\n    0x00002159, 0x00003917, 0x00002036, 0x000900F5, 0x0000001D, 0x00003B80,\n    0x0000427C, 0x00004F57, 0x00006295, 0x00002159, 0x00003916, 0x00002036,\n    0x000900F5, 0x0000001D, 0x000038B9, 0x0000427B, 0x00004F57, 0x00006294,\n    0x00002159, 0x00003915, 0x00002036, 0x000200F9, 0x00005310, 0x000200F8,\n    0x00005310, 0x000700F5, 0x0000001D, 0x00002BAC, 0x00002BAB, 0x00004F26,\n    0x00002BAA, 0x00003F61, 0x000700F5, 0x0000001D, 0x0000380D, 0x0000380C,\n    0x00004F26, 0x0000380B, 0x00003F61, 0x000700F5, 0x0000001D, 0x00003295,\n    0x00003B80, 0x00004F26, 0x00003B7F, 0x00003F61, 0x000700F5, 0x0000001D,\n    0x0000367A, 0x000038B9, 0x00004F26, 0x000038B8, 0x00003F61, 0x00050081,\n    0x0000001D, 0x00004359, 0x000020D3, 0x0000367A, 0x00050081, 0x0000001D,\n    0x00005B01, 0x000035EC, 0x00003295, 0x00050081, 0x0000001D, 0x00001F92,\n    0x0000380A, 0x0000380D, 0x00050081, 0x0000001D, 0x00005113, 0x00002BA9,\n    0x00002BAC, 0x000500AE, 0x00000009, 0x0000387D, 0x00004356, 0x00000A1C,\n    0x000300F7, 0x00005ECA, 0x00000002, 0x000400FA, 0x0000387D, 0x000026B1,\n    0x00005ECA, 0x000200F8, 0x000026B1, 0x000500C4, 0x0000000B, 0x000037B2,\n    0x00000A16, 0x000023AA, 0x00050085, 0x0000000D, 0x00002F3A, 0x00002B2C,\n    0x0000016E, 0x00050080, 0x0000000B, 0x000051FC, 0x00001E06, 0x000037B2,\n    0x000300F7, 0x00005311, 0x00000002, 0x000400FA, 0x00005AEF, 0x00003B67,\n    0x000040BB, 0x000200F8, 0x000040BB, 0x000500AA, 0x00000009, 0x00004ADD,\n    0x0000199B, 0x00000A16, 0x000300F7, 0x00004F4B, 0x00000002, 0x000400FA,\n    0x00004ADD, 0x000019C3, 0x00002303, 0x000200F8, 0x00002303, 0x000500C2,\n    0x0000000B, 0x00005634, 0x000051FC, 0x00000A11, 0x00060041, 0x00000289,\n    0x00003441, 0x00000CC7, 0x00000A0B, 0x00005634, 0x0004003D, 0x0000000B,\n    0x00003AD6, 0x00003441, 0x00050080, 0x0000000B, 0x00002149, 0x000051FC,\n    0x0000199B, 0x000500C2, 0x0000000B, 0x000054AA, 0x00002149, 0x00000A11,\n    0x00060041, 0x00000289, 0x00004CE1, 0x00000CC7, 0x00000A0B, 0x000054AA,\n    0x0004003D, 0x0000000B, 0x0000333E, 0x00004CE1, 0x00050084, 0x0000000B,\n    0x000021F3, 0x00000A10, 0x0000199B, 0x00050080, 0x0000000B, 0x00005EC4,\n    0x000051FC, 0x000021F3, 0x000500C2, 0x0000000B, 0x000045EA, 0x00005EC4,\n    0x00000A11, 0x00060041, 0x00000289, 0x00004CE2, 0x00000CC7, 0x00000A0B,\n    0x000045EA, 0x0004003D, 0x0000000B, 0x0000333F, 0x00004CE2, 0x00050084,\n    0x0000000B, 0x000021F4, 0x00000A13, 0x0000199B, 0x00050080, 0x0000000B,\n    0x00005EC5, 0x000051FC, 0x000021F4, 0x000500C2, 0x0000000B, 0x000045EB,\n    0x00005EC5, 0x00000A11, 0x00060041, 0x00000289, 0x00004903, 0x00000CC7,\n    0x00000A0B, 0x000045EB, 0x0004003D, 0x0000000B, 0x00005F5C, 0x00004903,\n    0x00070050, 0x00000017, 0x00005134, 0x00003AD6, 0x0000333E, 0x0000333F,\n    0x00005F5C, 0x000200F9, 0x00004F4B, 0x000200F8, 0x000019C3, 0x000500C2,\n    0x0000000B, 0x00005FAA, 0x000051FC, 0x00000A11, 0x00060041, 0x00000289,\n    0x00003442, 0x00000CC7, 0x00000A0B, 0x00005FAA, 0x0004003D, 0x0000000B,\n    0x0000314F, 0x00003442, 0x00050080, 0x0000000B, 0x00002DC1, 0x00005FAA,\n    0x00000A0D, 0x00060041, 0x00000289, 0x0000190D, 0x00000CC7, 0x00000A0B,\n    0x00002DC1, 0x0004003D, 0x0000000B, 0x00005C6E, 0x0000190D, 0x00050080,\n    0x0000000B, 0x00002DC2, 0x00005FAA, 0x00000A10, 0x00060041, 0x00000289,\n    0x0000190E, 0x00000CC7, 0x00000A0B, 0x00002DC2, 0x0004003D, 0x0000000B,\n    0x00005C6F, 0x0000190E, 0x00050080, 0x0000000B, 0x00002DC3, 0x00005FAA,\n    0x00000A13, 0x00060041, 0x00000289, 0x00005FF8, 0x00000CC7, 0x00000A0B,\n    0x00002DC3, 0x0004003D, 0x0000000B, 0x00004001, 0x00005FF8, 0x00070050,\n    0x00000017, 0x00005135, 0x0000314F, 0x00005C6E, 0x00005C6F, 0x00004001,\n    0x000200F9, 0x00004F4B, 0x000200F8, 0x00004F4B, 0x000700F5, 0x00000017,\n    0x00002AC1, 0x00005135, 0x000019C3, 0x00005134, 0x00002303, 0x000300F7,\n    0x00003F62, 0x00000000, 0x001300FB, 0x00002180, 0x00004BFD, 0x00000000,\n    0x000038FB, 0x00000001, 0x000038FB, 0x00000002, 0x00001CBF, 0x0000000A,\n    0x00001CBF, 0x00000003, 0x00001CBE, 0x0000000C, 0x00001CBE, 0x00000004,\n    0x00002000, 0x00000006, 0x00002037, 0x000200F8, 0x00002037, 0x00050051,\n    0x0000000B, 0x00005F5D, 0x00002AC1, 0x00000000, 0x0006000C, 0x00000013,\n    0x0000606B, 0x00000001, 0x0000003E, 0x00005F5D, 0x00050051, 0x0000000D,\n    0x00002772, 0x0000606B, 0x00000000, 0x00050051, 0x0000000D, 0x00004452,\n    0x0000606B, 0x00000001, 0x00070050, 0x0000001D, 0x00003918, 0x00002772,\n    0x00004452, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x00004386,\n    0x00002AC1, 0x00000001, 0x0006000C, 0x00000013, 0x00004677, 0x00000001,\n    0x0000003E, 0x00004386, 0x00050051, 0x0000000D, 0x00002773, 0x00004677,\n    0x00000000, 0x00050051, 0x0000000D, 0x00004453, 0x00004677, 0x00000001,\n    0x00070050, 0x0000001D, 0x00003919, 0x00002773, 0x00004453, 0x00000A0C,\n    0x00000A0C, 0x00050051, 0x0000000B, 0x00004387, 0x00002AC1, 0x00000002,\n    0x0006000C, 0x00000013, 0x00004678, 0x00000001, 0x0000003E, 0x00004387,\n    0x00050051, 0x0000000D, 0x00002774, 0x00004678, 0x00000000, 0x00050051,\n    0x0000000D, 0x00004454, 0x00004678, 0x00000001, 0x00070050, 0x0000001D,\n    0x0000391A, 0x00002774, 0x00004454, 0x00000A0C, 0x00000A0C, 0x00050051,\n    0x0000000B, 0x00004388, 0x00002AC1, 0x00000003, 0x0006000C, 0x00000013,\n    0x00004679, 0x00000001, 0x0000003E, 0x00004388, 0x00050051, 0x0000000D,\n    0x0000277D, 0x00004679, 0x00000000, 0x00050051, 0x0000000D, 0x000050C2,\n    0x00004679, 0x00000001, 0x00070050, 0x0000001D, 0x00002353, 0x0000277D,\n    0x000050C2, 0x00000A0C, 0x00000A0C, 0x000200F9, 0x00003F62, 0x000200F8,\n    0x00002000, 0x00050051, 0x0000000B, 0x0000308F, 0x00002AC1, 0x00000000,\n    0x0004007C, 0x0000000C, 0x0000589F, 0x0000308F, 0x00050050, 0x00000012,\n    0x00004728, 0x0000589F, 0x0000589F, 0x000500C4, 0x00000012, 0x000047B5,\n    0x00004728, 0x000007A7, 0x000500C3, 0x00000012, 0x0000341F, 0x000047B5,\n    0x00000867, 0x0004006F, 0x00000013, 0x00002AAF, 0x0000341F, 0x0005008E,\n    0x00000013, 0x0000474F, 0x00002AAF, 0x000007FE, 0x0007000C, 0x00000013,\n    0x00005E0E, 0x00000001, 0x00000028, 0x00000049, 0x0000474F, 0x00050051,\n    0x0000000D, 0x00005F12, 0x00005E0E, 0x00000000, 0x00050051, 0x0000000D,\n    0x00003CDA, 0x00005E0E, 0x00000001, 0x00070050, 0x0000001D, 0x00004124,\n    0x00005F12, 0x00003CDA, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B,\n    0x00004C48, 0x00002AC1, 0x00000001, 0x0004007C, 0x0000000C, 0x00003EA7,\n    0x00004C48, 0x00050050, 0x00000012, 0x00004729, 0x00003EA7, 0x00003EA7,\n    0x000500C4, 0x00000012, 0x000047B6, 0x00004729, 0x000007A7, 0x000500C3,\n    0x00000012, 0x00003420, 0x000047B6, 0x00000867, 0x0004006F, 0x00000013,\n    0x00002AB0, 0x00003420, 0x0005008E, 0x00000013, 0x00004750, 0x00002AB0,\n    0x000007FE, 0x0007000C, 0x00000013, 0x00005E0F, 0x00000001, 0x00000028,\n    0x00000049, 0x00004750, 0x00050051, 0x0000000D, 0x00005F13, 0x00005E0F,\n    0x00000000, 0x00050051, 0x0000000D, 0x00003CDB, 0x00005E0F, 0x00000001,\n    0x00070050, 0x0000001D, 0x00004125, 0x00005F13, 0x00003CDB, 0x00000A0C,\n    0x00000A0C, 0x00050051, 0x0000000B, 0x00004C49, 0x00002AC1, 0x00000002,\n    0x0004007C, 0x0000000C, 0x00003EA8, 0x00004C49, 0x00050050, 0x00000012,\n    0x0000472A, 0x00003EA8, 0x00003EA8, 0x000500C4, 0x00000012, 0x000047B7,\n    0x0000472A, 0x000007A7, 0x000500C3, 0x00000012, 0x00003421, 0x000047B7,\n    0x00000867, 0x0004006F, 0x00000013, 0x00002AB1, 0x00003421, 0x0005008E,\n    0x00000013, 0x00004751, 0x00002AB1, 0x000007FE, 0x0007000C, 0x00000013,\n    0x00005E10, 0x00000001, 0x00000028, 0x00000049, 0x00004751, 0x00050051,\n    0x0000000D, 0x00005F14, 0x00005E10, 0x00000000, 0x00050051, 0x0000000D,\n    0x00003CDC, 0x00005E10, 0x00000001, 0x00070050, 0x0000001D, 0x00004126,\n    0x00005F14, 0x00003CDC, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B,\n    0x00004C4A, 0x00002AC1, 0x00000003, 0x0004007C, 0x0000000C, 0x00003EA9,\n    0x00004C4A, 0x00050050, 0x00000012, 0x0000472B, 0x00003EA9, 0x00003EA9,\n    0x000500C4, 0x00000012, 0x000047B8, 0x0000472B, 0x000007A7, 0x000500C3,\n    0x00000012, 0x00003422, 0x000047B8, 0x00000867, 0x0004006F, 0x00000013,\n    0x00002AB2, 0x00003422, 0x0005008E, 0x00000013, 0x00004752, 0x00002AB2,\n    0x000007FE, 0x0007000C, 0x00000013, 0x00005E11, 0x00000001, 0x00000028,\n    0x00000049, 0x00004752, 0x00050051, 0x0000000D, 0x00005F15, 0x00005E11,\n    0x00000000, 0x00050051, 0x0000000D, 0x0000494E, 0x00005E11, 0x00000001,\n    0x00070050, 0x0000001D, 0x00002354, 0x00005F15, 0x0000494E, 0x00000A0C,\n    0x00000A0C, 0x000200F9, 0x00003F62, 0x000200F8, 0x00001CBE, 0x00050051,\n    0x0000000B, 0x000056C3, 0x00002AC1, 0x00000000, 0x00060050, 0x00000014,\n    0x00004F10, 0x000056C3, 0x000056C3, 0x000056C3, 0x000500C2, 0x00000014,\n    0x00002B17, 0x00004F10, 0x00000BB4, 0x000500C7, 0x00000014, 0x00005DEE,\n    0x00002B17, 0x00000105, 0x000500C7, 0x00000014, 0x000048A4, 0x00002B17,\n    0x00000466, 0x000500C2, 0x00000014, 0x00005B98, 0x00005DEE, 0x00000B0C,\n    0x000500AA, 0x00000010, 0x000040D1, 0x00005B98, 0x00000A12, 0x0006000C,\n    0x00000016, 0x00002C53, 0x00000001, 0x0000004B, 0x000048A4, 0x0004007C,\n    0x00000014, 0x00002A1D, 0x00002C53, 0x00050082, 0x00000014, 0x00001882,\n    0x00000B0C, 0x00002A1D, 0x00050080, 0x00000014, 0x00002218, 0x00002A1D,\n    0x00000938, 0x000600A9, 0x00000014, 0x00002877, 0x000040D1, 0x00002218,\n    0x00005B98, 0x000500C4, 0x00000014, 0x00005ADC, 0x000048A4, 0x00001882,\n    0x000500C7, 0x00000014, 0x000049A2, 0x00005ADC, 0x00000466, 0x000600A9,\n    0x00000014, 0x00002AB3, 0x000040D1, 0x000049A2, 0x000048A4, 0x00050080,\n    0x00000014, 0x00006001, 0x00002877, 0x000003FA, 0x000500C4, 0x00000014,\n    0x00004F87, 0x00006001, 0x00000189, 0x000500C4, 0x00000014, 0x00003FAE,\n    0x00002AB3, 0x0000008D, 0x000500C5, 0x00000014, 0x00005784, 0x00004F87,\n    0x00003FAE, 0x000500AA, 0x00000010, 0x00003608, 0x00005DEE, 0x00000A12,\n    0x000600A9, 0x00000014, 0x0000424A, 0x00003608, 0x00000A12, 0x00005784,\n    0x0004007C, 0x00000018, 0x000029D7, 0x0000424A, 0x000500C2, 0x0000000B,\n    0x00004BAC, 0x000056C3, 0x00000A64, 0x00040070, 0x0000000D, 0x00004816,\n    0x00004BAC, 0x00050085, 0x0000000D, 0x00003E27, 0x00004816, 0x00000149,\n    0x00050051, 0x0000000D, 0x000053CA, 0x000029D7, 0x00000000, 0x00050051,\n    0x0000000D, 0x00002A5D, 0x000029D7, 0x00000001, 0x00050051, 0x0000000D,\n    0x00001E9F, 0x000029D7, 0x00000002, 0x00070050, 0x0000001D, 0x00003DE0,\n    0x000053CA, 0x00002A5D, 0x00001E9F, 0x00003E27, 0x00050051, 0x0000000B,\n    0x000027FB, 0x00002AC1, 0x00000001, 0x00060050, 0x00000014, 0x00003514,\n    0x000027FB, 0x000027FB, 0x000027FB, 0x000500C2, 0x00000014, 0x00002B18,\n    0x00003514, 0x00000BB4, 0x000500C7, 0x00000014, 0x00005DEF, 0x00002B18,\n    0x00000105, 0x000500C7, 0x00000014, 0x000048A5, 0x00002B18, 0x00000466,\n    0x000500C2, 0x00000014, 0x00005B99, 0x00005DEF, 0x00000B0C, 0x000500AA,\n    0x00000010, 0x000040D2, 0x00005B99, 0x00000A12, 0x0006000C, 0x00000016,\n    0x00002C54, 0x00000001, 0x0000004B, 0x000048A5, 0x0004007C, 0x00000014,\n    0x00002A1E, 0x00002C54, 0x00050082, 0x00000014, 0x00001883, 0x00000B0C,\n    0x00002A1E, 0x00050080, 0x00000014, 0x00002219, 0x00002A1E, 0x00000938,\n    0x000600A9, 0x00000014, 0x00002878, 0x000040D2, 0x00002219, 0x00005B99,\n    0x000500C4, 0x00000014, 0x00005ADD, 0x000048A5, 0x00001883, 0x000500C7,\n    0x00000014, 0x000049A3, 0x00005ADD, 0x00000466, 0x000600A9, 0x00000014,\n    0x00002AB4, 0x000040D2, 0x000049A3, 0x000048A5, 0x00050080, 0x00000014,\n    0x00006002, 0x00002878, 0x000003FA, 0x000500C4, 0x00000014, 0x00004F88,\n    0x00006002, 0x00000189, 0x000500C4, 0x00000014, 0x00003FAF, 0x00002AB4,\n    0x0000008D, 0x000500C5, 0x00000014, 0x00005785, 0x00004F88, 0x00003FAF,\n    0x000500AA, 0x00000010, 0x00003609, 0x00005DEF, 0x00000A12, 0x000600A9,\n    0x00000014, 0x0000424B, 0x00003609, 0x00000A12, 0x00005785, 0x0004007C,\n    0x00000018, 0x000029D8, 0x0000424B, 0x000500C2, 0x0000000B, 0x00004BAD,\n    0x000027FB, 0x00000A64, 0x00040070, 0x0000000D, 0x00004817, 0x00004BAD,\n    0x00050085, 0x0000000D, 0x00003E28, 0x00004817, 0x00000149, 0x00050051,\n    0x0000000D, 0x000053CB, 0x000029D8, 0x00000000, 0x00050051, 0x0000000D,\n    0x00002A5E, 0x000029D8, 0x00000001, 0x00050051, 0x0000000D, 0x00001EA0,\n    0x000029D8, 0x00000002, 0x00070050, 0x0000001D, 0x00003DE1, 0x000053CB,\n    0x00002A5E, 0x00001EA0, 0x00003E28, 0x00050051, 0x0000000B, 0x000027FC,\n    0x00002AC1, 0x00000002, 0x00060050, 0x00000014, 0x00003515, 0x000027FC,\n    0x000027FC, 0x000027FC, 0x000500C2, 0x00000014, 0x00002B19, 0x00003515,\n    0x00000BB4, 0x000500C7, 0x00000014, 0x00005DF0, 0x00002B19, 0x00000105,\n    0x000500C7, 0x00000014, 0x000048AE, 0x00002B19, 0x00000466, 0x000500C2,\n    0x00000014, 0x00005B9A, 0x00005DF0, 0x00000B0C, 0x000500AA, 0x00000010,\n    0x000040D3, 0x00005B9A, 0x00000A12, 0x0006000C, 0x00000016, 0x00002C55,\n    0x00000001, 0x0000004B, 0x000048AE, 0x0004007C, 0x00000014, 0x00002A1F,\n    0x00002C55, 0x00050082, 0x00000014, 0x00001884, 0x00000B0C, 0x00002A1F,\n    0x00050080, 0x00000014, 0x0000221A, 0x00002A1F, 0x00000938, 0x000600A9,\n    0x00000014, 0x00002879, 0x000040D3, 0x0000221A, 0x00005B9A, 0x000500C4,\n    0x00000014, 0x00005ADE, 0x000048AE, 0x00001884, 0x000500C7, 0x00000014,\n    0x000049A4, 0x00005ADE, 0x00000466, 0x000600A9, 0x00000014, 0x00002AB5,\n    0x000040D3, 0x000049A4, 0x000048AE, 0x00050080, 0x00000014, 0x00006003,\n    0x00002879, 0x000003FA, 0x000500C4, 0x00000014, 0x00004F89, 0x00006003,\n    0x00000189, 0x000500C4, 0x00000014, 0x00003FB0, 0x00002AB5, 0x0000008D,\n    0x000500C5, 0x00000014, 0x00005786, 0x00004F89, 0x00003FB0, 0x000500AA,\n    0x00000010, 0x0000360A, 0x00005DF0, 0x00000A12, 0x000600A9, 0x00000014,\n    0x0000424C, 0x0000360A, 0x00000A12, 0x00005786, 0x0004007C, 0x00000018,\n    0x000029D9, 0x0000424C, 0x000500C2, 0x0000000B, 0x00004BAE, 0x000027FC,\n    0x00000A64, 0x00040070, 0x0000000D, 0x00004818, 0x00004BAE, 0x00050085,\n    0x0000000D, 0x00003E29, 0x00004818, 0x00000149, 0x00050051, 0x0000000D,\n    0x000053CC, 0x000029D9, 0x00000000, 0x00050051, 0x0000000D, 0x00002A5F,\n    0x000029D9, 0x00000001, 0x00050051, 0x0000000D, 0x00001EA1, 0x000029D9,\n    0x00000002, 0x00070050, 0x0000001D, 0x00003DE2, 0x000053CC, 0x00002A5F,\n    0x00001EA1, 0x00003E29, 0x00050051, 0x0000000B, 0x000027FD, 0x00002AC1,\n    0x00000003, 0x00060050, 0x00000014, 0x00003516, 0x000027FD, 0x000027FD,\n    0x000027FD, 0x000500C2, 0x00000014, 0x00002B1A, 0x00003516, 0x00000BB4,\n    0x000500C7, 0x00000014, 0x00005DF1, 0x00002B1A, 0x00000105, 0x000500C7,\n    0x00000014, 0x000048AF, 0x00002B1A, 0x00000466, 0x000500C2, 0x00000014,\n    0x00005B9B, 0x00005DF1, 0x00000B0C, 0x000500AA, 0x00000010, 0x000040D4,\n    0x00005B9B, 0x00000A12, 0x0006000C, 0x00000016, 0x00002C56, 0x00000001,\n    0x0000004B, 0x000048AF, 0x0004007C, 0x00000014, 0x00002A20, 0x00002C56,\n    0x00050082, 0x00000014, 0x00001885, 0x00000B0C, 0x00002A20, 0x00050080,\n    0x00000014, 0x0000221B, 0x00002A20, 0x00000938, 0x000600A9, 0x00000014,\n    0x0000287A, 0x000040D4, 0x0000221B, 0x00005B9B, 0x000500C4, 0x00000014,\n    0x00005ADF, 0x000048AF, 0x00001885, 0x000500C7, 0x00000014, 0x000049A5,\n    0x00005ADF, 0x00000466, 0x000600A9, 0x00000014, 0x00002AB6, 0x000040D4,\n    0x000049A5, 0x000048AF, 0x00050080, 0x00000014, 0x00006004, 0x0000287A,\n    0x000003FA, 0x000500C4, 0x00000014, 0x00004F8A, 0x00006004, 0x00000189,\n    0x000500C4, 0x00000014, 0x00003FB1, 0x00002AB6, 0x0000008D, 0x000500C5,\n    0x00000014, 0x00005787, 0x00004F8A, 0x00003FB1, 0x000500AA, 0x00000010,\n    0x0000360B, 0x00005DF1, 0x00000A12, 0x000600A9, 0x00000014, 0x0000424D,\n    0x0000360B, 0x00000A12, 0x00005787, 0x0004007C, 0x00000018, 0x000029DA,\n    0x0000424D, 0x000500C2, 0x0000000B, 0x00004BAF, 0x000027FD, 0x00000A64,\n    0x00040070, 0x0000000D, 0x00004819, 0x00004BAF, 0x00050085, 0x0000000D,\n    0x00003E2A, 0x00004819, 0x00000149, 0x00050051, 0x0000000D, 0x000053CD,\n    0x000029DA, 0x00000000, 0x00050051, 0x0000000D, 0x00002A60, 0x000029DA,\n    0x00000001, 0x00050051, 0x0000000D, 0x00002B1B, 0x000029DA, 0x00000002,\n    0x00070050, 0x0000001D, 0x00002355, 0x000053CD, 0x00002A60, 0x00002B1B,\n    0x00003E2A, 0x000200F9, 0x00003F62, 0x000200F8, 0x00001CBF, 0x00050051,\n    0x0000000B, 0x000056C4, 0x00002AC1, 0x00000000, 0x00070050, 0x00000017,\n    0x00004F11, 0x000056C4, 0x000056C4, 0x000056C4, 0x000056C4, 0x000500C2,\n    0x00000017, 0x000024A8, 0x00004F11, 0x0000034D, 0x000500C7, 0x00000017,\n    0x000049B3, 0x000024A8, 0x0000027B, 0x00040070, 0x0000001D, 0x00003CBD,\n    0x000049B3, 0x00050085, 0x0000001D, 0x00004136, 0x00003CBD, 0x00000AEE,\n    0x00050051, 0x0000000B, 0x00005CD8, 0x00002AC1, 0x00000001, 0x00070050,\n    0x00000017, 0x00005153, 0x00005CD8, 0x00005CD8, 0x00005CD8, 0x00005CD8,\n    0x000500C2, 0x00000017, 0x000024A9, 0x00005153, 0x0000034D, 0x000500C7,\n    0x00000017, 0x000049B4, 0x000024A9, 0x0000027B, 0x00040070, 0x0000001D,\n    0x00003CBE, 0x000049B4, 0x00050085, 0x0000001D, 0x00004137, 0x00003CBE,\n    0x00000AEE, 0x00050051, 0x0000000B, 0x00005CD9, 0x00002AC1, 0x00000002,\n    0x00070050, 0x00000017, 0x00005154, 0x00005CD9, 0x00005CD9, 0x00005CD9,\n    0x00005CD9, 0x000500C2, 0x00000017, 0x000024AA, 0x00005154, 0x0000034D,\n    0x000500C7, 0x00000017, 0x000049B5, 0x000024AA, 0x0000027B, 0x00040070,\n    0x0000001D, 0x00003CBF, 0x000049B5, 0x00050085, 0x0000001D, 0x00004138,\n    0x00003CBF, 0x00000AEE, 0x00050051, 0x0000000B, 0x00005CDA, 0x00002AC1,\n    0x00000003, 0x00070050, 0x00000017, 0x00005155, 0x00005CDA, 0x00005CDA,\n    0x00005CDA, 0x00005CDA, 0x000500C2, 0x00000017, 0x000024AB, 0x00005155,\n    0x0000034D, 0x000500C7, 0x00000017, 0x000049B6, 0x000024AB, 0x0000027B,\n    0x00040070, 0x0000001D, 0x00004931, 0x000049B6, 0x00050085, 0x0000001D,\n    0x000026A1, 0x00004931, 0x00000AEE, 0x000200F9, 0x00003F62, 0x000200F8,\n    0x000038FB, 0x00050051, 0x0000000B, 0x000056C5, 0x00002AC1, 0x00000000,\n    0x00070050, 0x00000017, 0x00004F12, 0x000056C5, 0x000056C5, 0x000056C5,\n    0x000056C5, 0x000500C2, 0x00000017, 0x000024AC, 0x00004F12, 0x0000028D,\n    0x000500C7, 0x00000017, 0x00004A5E, 0x000024AC, 0x0000064B, 0x00040070,\n    0x0000001D, 0x000036A8, 0x00004A5E, 0x0005008E, 0x0000001D, 0x00004B29,\n    0x000036A8, 0x0000017A, 0x00050051, 0x0000000B, 0x000021A5, 0x00002AC1,\n    0x00000001, 0x00070050, 0x00000017, 0x00006111, 0x000021A5, 0x000021A5,\n    0x000021A5, 0x000021A5, 0x000500C2, 0x00000017, 0x000024AD, 0x00006111,\n    0x0000028D, 0x000500C7, 0x00000017, 0x00004A5F, 0x000024AD, 0x0000064B,\n    0x00040070, 0x0000001D, 0x000036A9, 0x00004A5F, 0x0005008E, 0x0000001D,\n    0x00004B2A, 0x000036A9, 0x0000017A, 0x00050051, 0x0000000B, 0x000021A6,\n    0x00002AC1, 0x00000002, 0x00070050, 0x00000017, 0x00006112, 0x000021A6,\n    0x000021A6, 0x000021A6, 0x000021A6, 0x000500C2, 0x00000017, 0x000024AE,\n    0x00006112, 0x0000028D, 0x000500C7, 0x00000017, 0x00004A60, 0x000024AE,\n    0x0000064B, 0x00040070, 0x0000001D, 0x000036AA, 0x00004A60, 0x0005008E,\n    0x0000001D, 0x00004B2B, 0x000036AA, 0x0000017A, 0x00050051, 0x0000000B,\n    0x000021A7, 0x00002AC1, 0x00000003, 0x00070050, 0x00000017, 0x00006113,\n    0x000021A7, 0x000021A7, 0x000021A7, 0x000021A7, 0x000500C2, 0x00000017,\n    0x000024AF, 0x00006113, 0x0000028D, 0x000500C7, 0x00000017, 0x00004A61,\n    0x000024AF, 0x0000064B, 0x00040070, 0x0000001D, 0x0000431C, 0x00004A61,\n    0x0005008E, 0x0000001D, 0x00003094, 0x0000431C, 0x0000017A, 0x000200F9,\n    0x00003F62, 0x000200F8, 0x00004BFD, 0x00050051, 0x0000000B, 0x00003090,\n    0x00002AC1, 0x00000000, 0x0004007C, 0x0000000D, 0x00004FF0, 0x00003090,\n    0x00050050, 0x00000013, 0x0000433C, 0x00004FF0, 0x00000A0C, 0x0009004F,\n    0x0000001D, 0x00002D96, 0x0000433C, 0x0000433C, 0x00000000, 0x00000001,\n    0x00000001, 0x00000001, 0x00050051, 0x0000000B, 0x000056B7, 0x00002AC1,\n    0x00000001, 0x0004007C, 0x0000000D, 0x00003F6E, 0x000056B7, 0x00050050,\n    0x00000013, 0x0000433D, 0x00003F6E, 0x00000A0C, 0x0009004F, 0x0000001D,\n    0x00002D97, 0x0000433D, 0x0000433D, 0x00000000, 0x00000001, 0x00000001,\n    0x00000001, 0x00050051, 0x0000000B, 0x000056B8, 0x00002AC1, 0x00000002,\n    0x0004007C, 0x0000000D, 0x00003F6F, 0x000056B8, 0x00050050, 0x00000013,\n    0x0000433E, 0x00003F6F, 0x00000A0C, 0x0009004F, 0x0000001D, 0x00002D98,\n    0x0000433E, 0x0000433E, 0x00000000, 0x00000001, 0x00000001, 0x00000001,\n    0x00050051, 0x0000000B, 0x000056B9, 0x00002AC1, 0x00000003, 0x0004007C,\n    0x0000000D, 0x00003F70, 0x000056B9, 0x00050050, 0x00000013, 0x00004FB0,\n    0x00003F70, 0x00000A0C, 0x0009004F, 0x0000001D, 0x00005A3C, 0x00004FB0,\n    0x00004FB0, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x000200F9,\n    0x00003F62, 0x000200F8, 0x00003F62, 0x000F00F5, 0x0000001D, 0x00002BAD,\n    0x00005A3C, 0x00004BFD, 0x00003094, 0x000038FB, 0x000026A1, 0x00001CBF,\n    0x00002355, 0x00001CBE, 0x00002354, 0x00002000, 0x00002353, 0x00002037,\n    0x000F00F5, 0x0000001D, 0x0000380E, 0x00002D98, 0x00004BFD, 0x00004B2B,\n    0x000038FB, 0x00004138, 0x00001CBF, 0x00003DE2, 0x00001CBE, 0x00004126,\n    0x00002000, 0x0000391A, 0x00002037, 0x000F00F5, 0x0000001D, 0x00003B81,\n    0x00002D97, 0x00004BFD, 0x00004B2A, 0x000038FB, 0x00004137, 0x00001CBF,\n    0x00003DE1, 0x00001CBE, 0x00004125, 0x00002000, 0x00003919, 0x00002037,\n    0x000F00F5, 0x0000001D, 0x000038BA, 0x00002D96, 0x00004BFD, 0x00004B29,\n    0x000038FB, 0x00004136, 0x00001CBF, 0x00003DE0, 0x00001CBE, 0x00004124,\n    0x00002000, 0x00003918, 0x00002037, 0x000200F9, 0x00005311, 0x000200F8,\n    0x00003B67, 0x000500AA, 0x00000009, 0x00005452, 0x0000199B, 0x00000A22,\n    0x000300F7, 0x00004F27, 0x00000002, 0x000400FA, 0x00005452, 0x000019C4,\n    0x00002304, 0x000200F8, 0x00002304, 0x000500C2, 0x0000000B, 0x00005635,\n    0x000051FC, 0x00000A11, 0x00060041, 0x00000289, 0x00003443, 0x00000CC7,\n    0x00000A0B, 0x00005635, 0x0004003D, 0x0000000B, 0x00003150, 0x00003443,\n    0x00050080, 0x0000000B, 0x00002DC4, 0x00005635, 0x00000A0D, 0x00060041,\n    0x00000289, 0x0000190F, 0x00000CC7, 0x00000A0B, 0x00002DC4, 0x0004003D,\n    0x0000000B, 0x00001B78, 0x0000190F, 0x00050080, 0x0000000B, 0x0000214A,\n    0x000051FC, 0x0000199B, 0x000500C2, 0x0000000B, 0x000054AB, 0x0000214A,\n    0x00000A11, 0x00060041, 0x00000289, 0x00004C99, 0x00000CC7, 0x00000A0B,\n    0x000054AB, 0x0004003D, 0x0000000B, 0x00003151, 0x00004C99, 0x00050080,\n    0x0000000B, 0x00002DC5, 0x000054AB, 0x00000A0D, 0x00060041, 0x00000289,\n    0x00006005, 0x00000CC7, 0x00000A0B, 0x00002DC5, 0x0004003D, 0x0000000B,\n    0x0000374E, 0x00006005, 0x00070050, 0x00000017, 0x00004CD9, 0x00003150,\n    0x00001B78, 0x00003151, 0x0000374E, 0x00050084, 0x0000000B, 0x00004C2D,\n    0x00000A10, 0x0000199B, 0x00050080, 0x0000000B, 0x00002A47, 0x000051FC,\n    0x00004C2D, 0x000500C2, 0x0000000B, 0x000045EC, 0x00002A47, 0x00000A11,\n    0x00060041, 0x00000289, 0x00004C9A, 0x00000CC7, 0x00000A0B, 0x000045EC,\n    0x0004003D, 0x0000000B, 0x00003152, 0x00004C9A, 0x00050080, 0x0000000B,\n    0x00002DC6, 0x000045EC, 0x00000A0D, 0x00060041, 0x00000289, 0x0000194D,\n    0x00000CC7, 0x00000A0B, 0x00002DC6, 0x0004003D, 0x0000000B, 0x00005E5D,\n    0x0000194D, 0x00050084, 0x0000000B, 0x000021F5, 0x00000A13, 0x0000199B,\n    0x00050080, 0x0000000B, 0x00005EC6, 0x000051FC, 0x000021F5, 0x000500C2,\n    0x0000000B, 0x000045ED, 0x00005EC6, 0x00000A11, 0x00060041, 0x00000289,\n    0x00004C9B, 0x00000CC7, 0x00000A0B, 0x000045ED, 0x0004003D, 0x0000000B,\n    0x00003153, 0x00004C9B, 0x00050080, 0x0000000B, 0x00002DC7, 0x000045ED,\n    0x00000A0D, 0x00060041, 0x00000289, 0x00006006, 0x00000CC7, 0x00000A0B,\n    0x00002DC7, 0x0004003D, 0x0000000B, 0x00004002, 0x00006006, 0x00070050,\n    0x00000017, 0x00005136, 0x00003152, 0x00005E5D, 0x00003153, 0x00004002,\n    0x000200F9, 0x00004F27, 0x000200F8, 0x000019C4, 0x000500C2, 0x0000000B,\n    0x00005FAB, 0x000051FC, 0x00000A11, 0x00060041, 0x00000289, 0x00003444,\n    0x00000CC7, 0x00000A0B, 0x00005FAB, 0x0004003D, 0x0000000B, 0x00003154,\n    0x00003444, 0x00050080, 0x0000000B, 0x00002DC8, 0x00005FAB, 0x00000A0D,\n    0x00060041, 0x00000289, 0x00001910, 0x00000CC7, 0x00000A0B, 0x00002DC8,\n    0x0004003D, 0x0000000B, 0x00005C70, 0x00001910, 0x00050080, 0x0000000B,\n    0x00002DC9, 0x00005FAB, 0x00000A10, 0x00060041, 0x00000289, 0x00001911,\n    0x00000CC7, 0x00000A0B, 0x00002DC9, 0x0004003D, 0x0000000B, 0x00005C71,\n    0x00001911, 0x00050080, 0x0000000B, 0x00002DCA, 0x00005FAB, 0x00000A13,\n    0x00060041, 0x00000289, 0x00006007, 0x00000CC7, 0x00000A0B, 0x00002DCA,\n    0x0004003D, 0x0000000B, 0x00003702, 0x00006007, 0x00070050, 0x00000017,\n    0x00005472, 0x00003154, 0x00005C70, 0x00005C71, 0x00003702, 0x00050080,\n    0x0000000B, 0x00004B85, 0x000051FC, 0x00000A3A, 0x000500C2, 0x0000000B,\n    0x0000202F, 0x00004B85, 0x00000A11, 0x00060041, 0x00000289, 0x00004C9C,\n    0x00000CC7, 0x00000A0B, 0x0000202F, 0x0004003D, 0x0000000B, 0x00003155,\n    0x00004C9C, 0x00050080, 0x0000000B, 0x00002DCB, 0x0000202F, 0x00000A0D,\n    0x00060041, 0x00000289, 0x00001912, 0x00000CC7, 0x00000A0B, 0x00002DCB,\n    0x0004003D, 0x0000000B, 0x00005C72, 0x00001912, 0x00050080, 0x0000000B,\n    0x00002DCC, 0x0000202F, 0x00000A10, 0x00060041, 0x00000289, 0x00001913,\n    0x00000CC7, 0x00000A0B, 0x00002DCC, 0x0004003D, 0x0000000B, 0x00005C73,\n    0x00001913, 0x00050080, 0x0000000B, 0x00002DCD, 0x0000202F, 0x00000A13,\n    0x00060041, 0x00000289, 0x00006008, 0x00000CC7, 0x00000A0B, 0x00002DCD,\n    0x0004003D, 0x0000000B, 0x00004003, 0x00006008, 0x00070050, 0x00000017,\n    0x00005137, 0x00003155, 0x00005C72, 0x00005C73, 0x00004003, 0x000200F9,\n    0x00004F27, 0x000200F8, 0x00004F27, 0x000700F5, 0x00000017, 0x00002BCF,\n    0x00005137, 0x000019C4, 0x00005136, 0x00002304, 0x000700F5, 0x00000017,\n    0x00003722, 0x00005472, 0x000019C4, 0x00004CD9, 0x00002304, 0x000300F7,\n    0x00004F28, 0x00000000, 0x000700FB, 0x00002180, 0x00004F58, 0x00000005,\n    0x0000215A, 0x00000007, 0x00002038, 0x000200F8, 0x00002038, 0x00050051,\n    0x0000000B, 0x00005F5E, 0x00003722, 0x00000000, 0x0006000C, 0x00000013,\n    0x0000606C, 0x00000001, 0x0000003E, 0x00005F5E, 0x00050051, 0x0000000D,\n    0x0000277E, 0x0000606C, 0x00000000, 0x00050051, 0x0000000D, 0x00003EC0,\n    0x0000606C, 0x00000001, 0x00050051, 0x0000000B, 0x00004289, 0x00003722,\n    0x00000001, 0x0006000C, 0x00000013, 0x00003CFD, 0x00000001, 0x0000003E,\n    0x00004289, 0x00050051, 0x0000000D, 0x0000277F, 0x00003CFD, 0x00000000,\n    0x00050051, 0x0000000D, 0x00004455, 0x00003CFD, 0x00000001, 0x00070050,\n    0x0000001D, 0x0000391B, 0x0000277E, 0x00003EC0, 0x0000277F, 0x00004455,\n    0x00050051, 0x0000000B, 0x00004389, 0x00003722, 0x00000002, 0x0006000C,\n    0x00000013, 0x0000467A, 0x00000001, 0x0000003E, 0x00004389, 0x00050051,\n    0x0000000D, 0x00002780, 0x0000467A, 0x00000000, 0x00050051, 0x0000000D,\n    0x00003EC1, 0x0000467A, 0x00000001, 0x00050051, 0x0000000B, 0x0000428A,\n    0x00003722, 0x00000003, 0x0006000C, 0x00000013, 0x00003CFE, 0x00000001,\n    0x0000003E, 0x0000428A, 0x00050051, 0x0000000D, 0x00002781, 0x00003CFE,\n    0x00000000, 0x00050051, 0x0000000D, 0x00004456, 0x00003CFE, 0x00000001,\n    0x00070050, 0x0000001D, 0x0000391C, 0x00002780, 0x00003EC1, 0x00002781,\n    0x00004456, 0x00050051, 0x0000000B, 0x0000438A, 0x00002BCF, 0x00000000,\n    0x0006000C, 0x00000013, 0x0000467B, 0x00000001, 0x0000003E, 0x0000438A,\n    0x00050051, 0x0000000D, 0x00002782, 0x0000467B, 0x00000000, 0x00050051,\n    0x0000000D, 0x00003EC2, 0x0000467B, 0x00000001, 0x00050051, 0x0000000B,\n    0x0000428B, 0x00002BCF, 0x00000001, 0x0006000C, 0x00000013, 0x00003CFF,\n    0x00000001, 0x0000003E, 0x0000428B, 0x00050051, 0x0000000D, 0x00002783,\n    0x00003CFF, 0x00000000, 0x00050051, 0x0000000D, 0x00004457, 0x00003CFF,\n    0x00000001, 0x00070050, 0x0000001D, 0x0000391D, 0x00002782, 0x00003EC2,\n    0x00002783, 0x00004457, 0x00050051, 0x0000000B, 0x0000438B, 0x00002BCF,\n    0x00000002, 0x0006000C, 0x00000013, 0x0000467C, 0x00000001, 0x0000003E,\n    0x0000438B, 0x00050051, 0x0000000D, 0x00002784, 0x0000467C, 0x00000000,\n    0x00050051, 0x0000000D, 0x00003EC3, 0x0000467C, 0x00000001, 0x00050051,\n    0x0000000B, 0x0000428C, 0x00002BCF, 0x00000003, 0x0006000C, 0x00000013,\n    0x00003D00, 0x00000001, 0x0000003E, 0x0000428C, 0x00050051, 0x0000000D,\n    0x00002785, 0x00003D00, 0x00000000, 0x00050051, 0x0000000D, 0x000050C3,\n    0x00003D00, 0x00000001, 0x00070050, 0x0000001D, 0x00002356, 0x00002784,\n    0x00003EC3, 0x00002785, 0x000050C3, 0x000200F9, 0x00004F28, 0x000200F8,\n    0x0000215A, 0x0007004F, 0x00000011, 0x000025FD, 0x00003722, 0x00003722,\n    0x00000000, 0x00000001, 0x0004007C, 0x00000012, 0x00005B3E, 0x000025FD,\n    0x0009004F, 0x0000001A, 0x000060D6, 0x00005B3E, 0x00005B3E, 0x00000000,\n    0x00000000, 0x00000001, 0x00000001, 0x000500C4, 0x0000001A, 0x000048B0,\n    0x000060D6, 0x00000122, 0x000500C3, 0x0000001A, 0x00003D95, 0x000048B0,\n    0x00000302, 0x0004006F, 0x0000001D, 0x00002AB7, 0x00003D95, 0x0005008E,\n    0x0000001D, 0x0000472C, 0x00002AB7, 0x000007FE, 0x0007000C, 0x0000001D,\n    0x00006297, 0x00000001, 0x00000028, 0x00000504, 0x0000472C, 0x0007004F,\n    0x00000011, 0x00003771, 0x00003722, 0x00003722, 0x00000002, 0x00000003,\n    0x0004007C, 0x00000012, 0x000024C5, 0x00003771, 0x0009004F, 0x0000001A,\n    0x000060D7, 0x000024C5, 0x000024C5, 0x00000000, 0x00000000, 0x00000001,\n    0x00000001, 0x000500C4, 0x0000001A, 0x000048B1, 0x000060D7, 0x00000122,\n    0x000500C3, 0x0000001A, 0x00003D96, 0x000048B1, 0x00000302, 0x0004006F,\n    0x0000001D, 0x00002AB8, 0x00003D96, 0x0005008E, 0x0000001D, 0x0000472D,\n    0x00002AB8, 0x000007FE, 0x0007000C, 0x0000001D, 0x00006298, 0x00000001,\n    0x00000028, 0x00000504, 0x0000472D, 0x0007004F, 0x00000011, 0x00003772,\n    0x00002BCF, 0x00002BCF, 0x00000000, 0x00000001, 0x0004007C, 0x00000012,\n    0x000024C6, 0x00003772, 0x0009004F, 0x0000001A, 0x000060D8, 0x000024C6,\n    0x000024C6, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x000500C4,\n    0x0000001A, 0x000048B2, 0x000060D8, 0x00000122, 0x000500C3, 0x0000001A,\n    0x00003D97, 0x000048B2, 0x00000302, 0x0004006F, 0x0000001D, 0x00002AB9,\n    0x00003D97, 0x0005008E, 0x0000001D, 0x0000472E, 0x00002AB9, 0x000007FE,\n    0x0007000C, 0x0000001D, 0x00006299, 0x00000001, 0x00000028, 0x00000504,\n    0x0000472E, 0x0007004F, 0x00000011, 0x00003773, 0x00002BCF, 0x00002BCF,\n    0x00000002, 0x00000003, 0x0004007C, 0x00000012, 0x000024C7, 0x00003773,\n    0x0009004F, 0x0000001A, 0x000060D9, 0x000024C7, 0x000024C7, 0x00000000,\n    0x00000000, 0x00000001, 0x00000001, 0x000500C4, 0x0000001A, 0x000048B3,\n    0x000060D9, 0x00000122, 0x000500C3, 0x0000001A, 0x00003D98, 0x000048B3,\n    0x00000302, 0x0004006F, 0x0000001D, 0x00002ABA, 0x00003D98, 0x0005008E,\n    0x0000001D, 0x000053C1, 0x00002ABA, 0x000007FE, 0x0007000C, 0x0000001D,\n    0x00004364, 0x00000001, 0x00000028, 0x00000504, 0x000053C1, 0x000200F9,\n    0x00004F28, 0x000200F8, 0x00004F58, 0x0007004F, 0x00000011, 0x00002623,\n    0x00003722, 0x00003722, 0x00000000, 0x00000001, 0x0004007C, 0x00000013,\n    0x0000515B, 0x00002623, 0x00050051, 0x0000000D, 0x00001B84, 0x0000515B,\n    0x00000000, 0x00050051, 0x0000000D, 0x00003470, 0x0000515B, 0x00000001,\n    0x00070050, 0x0000001D, 0x0000427E, 0x00001B84, 0x00003470, 0x00000A0C,\n    0x00000A0C, 0x0007004F, 0x00000011, 0x000041DE, 0x00003722, 0x00003722,\n    0x00000002, 0x00000003, 0x0004007C, 0x00000013, 0x00003763, 0x000041DE,\n    0x00050051, 0x0000000D, 0x00001B85, 0x00003763, 0x00000000, 0x00050051,\n    0x0000000D, 0x00003471, 0x00003763, 0x00000001, 0x00070050, 0x0000001D,\n    0x0000427F, 0x00001B85, 0x00003471, 0x00000A0C, 0x00000A0C, 0x0007004F,\n    0x00000011, 0x000041DF, 0x00002BCF, 0x00002BCF, 0x00000000, 0x00000001,\n    0x0004007C, 0x00000013, 0x00003764, 0x000041DF, 0x00050051, 0x0000000D,\n    0x00001B86, 0x00003764, 0x00000000, 0x00050051, 0x0000000D, 0x00003472,\n    0x00003764, 0x00000001, 0x00070050, 0x0000001D, 0x00004280, 0x00001B86,\n    0x00003472, 0x00000A0C, 0x00000A0C, 0x0007004F, 0x00000011, 0x000041E0,\n    0x00002BCF, 0x00002BCF, 0x00000002, 0x00000003, 0x0004007C, 0x00000013,\n    0x00003765, 0x000041E0, 0x00050051, 0x0000000D, 0x00001B87, 0x00003765,\n    0x00000000, 0x00050051, 0x0000000D, 0x0000410A, 0x00003765, 0x00000001,\n    0x00070050, 0x0000001D, 0x00002357, 0x00001B87, 0x0000410A, 0x00000A0C,\n    0x00000A0C, 0x000200F9, 0x00004F28, 0x000200F8, 0x00004F28, 0x000900F5,\n    0x0000001D, 0x00002BAE, 0x00002357, 0x00004F58, 0x00004364, 0x0000215A,\n    0x00002356, 0x00002038, 0x000900F5, 0x0000001D, 0x0000380F, 0x00004280,\n    0x00004F58, 0x00006299, 0x0000215A, 0x0000391D, 0x00002038, 0x000900F5,\n    0x0000001D, 0x00003B82, 0x0000427F, 0x00004F58, 0x00006298, 0x0000215A,\n    0x0000391C, 0x00002038, 0x000900F5, 0x0000001D, 0x000038BB, 0x0000427E,\n    0x00004F58, 0x00006297, 0x0000215A, 0x0000391B, 0x00002038, 0x000200F9,\n    0x00005311, 0x000200F8, 0x00005311, 0x000700F5, 0x0000001D, 0x00002BAF,\n    0x00002BAE, 0x00004F28, 0x00002BAD, 0x00003F62, 0x000700F5, 0x0000001D,\n    0x00003810, 0x0000380F, 0x00004F28, 0x0000380E, 0x00003F62, 0x000700F5,\n    0x0000001D, 0x00003296, 0x00003B82, 0x00004F28, 0x00003B81, 0x00003F62,\n    0x000700F5, 0x0000001D, 0x0000367B, 0x000038BB, 0x00004F28, 0x000038BA,\n    0x00003F62, 0x00050081, 0x0000001D, 0x0000435A, 0x00004359, 0x0000367B,\n    0x00050081, 0x0000001D, 0x00005B02, 0x00005B01, 0x00003296, 0x00050081,\n    0x0000001D, 0x00001C28, 0x00001F92, 0x00003810, 0x00050081, 0x0000001D,\n    0x000025AA, 0x00005113, 0x00002BAF, 0x00050080, 0x0000000B, 0x00003FF8,\n    0x00001FB2, 0x000037B2, 0x000300F7, 0x00005312, 0x00000002, 0x000400FA,\n    0x00005AEF, 0x00003B68, 0x000040BC, 0x000200F8, 0x000040BC, 0x000500AA,\n    0x00000009, 0x00004ADE, 0x0000199B, 0x00000A16, 0x000300F7, 0x00004F4C,\n    0x00000002, 0x000400FA, 0x00004ADE, 0x000019C5, 0x00002305, 0x000200F8,\n    0x00002305, 0x000500C2, 0x0000000B, 0x00005636, 0x00003FF8, 0x00000A11,\n    0x00060041, 0x00000289, 0x00003445, 0x00000CC7, 0x00000A0B, 0x00005636,\n    0x0004003D, 0x0000000B, 0x00003AD7, 0x00003445, 0x00050080, 0x0000000B,\n    0x0000214B, 0x00003FF8, 0x0000199B, 0x000500C2, 0x0000000B, 0x000054AC,\n    0x0000214B, 0x00000A11, 0x00060041, 0x00000289, 0x00004CE3, 0x00000CC7,\n    0x00000A0B, 0x000054AC, 0x0004003D, 0x0000000B, 0x00003340, 0x00004CE3,\n    0x00050084, 0x0000000B, 0x000021F6, 0x00000A10, 0x0000199B, 0x00050080,\n    0x0000000B, 0x00005EC7, 0x00003FF8, 0x000021F6, 0x000500C2, 0x0000000B,\n    0x000045EE, 0x00005EC7, 0x00000A11, 0x00060041, 0x00000289, 0x00004CE4,\n    0x00000CC7, 0x00000A0B, 0x000045EE, 0x0004003D, 0x0000000B, 0x00003341,\n    0x00004CE4, 0x00050084, 0x0000000B, 0x000021F7, 0x00000A13, 0x0000199B,\n    0x00050080, 0x0000000B, 0x00005EC8, 0x00003FF8, 0x000021F7, 0x000500C2,\n    0x0000000B, 0x000045EF, 0x00005EC8, 0x00000A11, 0x00060041, 0x00000289,\n    0x00004904, 0x00000CC7, 0x00000A0B, 0x000045EF, 0x0004003D, 0x0000000B,\n    0x00005F5F, 0x00004904, 0x00070050, 0x00000017, 0x00005138, 0x00003AD7,\n    0x00003340, 0x00003341, 0x00005F5F, 0x000200F9, 0x00004F4C, 0x000200F8,\n    0x000019C5, 0x000500C2, 0x0000000B, 0x00005FAC, 0x00003FF8, 0x00000A11,\n    0x00060041, 0x00000289, 0x00003446, 0x00000CC7, 0x00000A0B, 0x00005FAC,\n    0x0004003D, 0x0000000B, 0x00003156, 0x00003446, 0x00050080, 0x0000000B,\n    0x00002DCE, 0x00005FAC, 0x00000A0D, 0x00060041, 0x00000289, 0x00001914,\n    0x00000CC7, 0x00000A0B, 0x00002DCE, 0x0004003D, 0x0000000B, 0x00005C74,\n    0x00001914, 0x00050080, 0x0000000B, 0x00002DCF, 0x00005FAC, 0x00000A10,\n    0x00060041, 0x00000289, 0x00001915, 0x00000CC7, 0x00000A0B, 0x00002DCF,\n    0x0004003D, 0x0000000B, 0x00005C75, 0x00001915, 0x00050080, 0x0000000B,\n    0x00002DD0, 0x00005FAC, 0x00000A13, 0x00060041, 0x00000289, 0x00006009,\n    0x00000CC7, 0x00000A0B, 0x00002DD0, 0x0004003D, 0x0000000B, 0x00004004,\n    0x00006009, 0x00070050, 0x00000017, 0x00005139, 0x00003156, 0x00005C74,\n    0x00005C75, 0x00004004, 0x000200F9, 0x00004F4C, 0x000200F8, 0x00004F4C,\n    0x000700F5, 0x00000017, 0x00002AC2, 0x00005139, 0x000019C5, 0x00005138,\n    0x00002305, 0x000300F7, 0x00003F63, 0x00000000, 0x001300FB, 0x00002180,\n    0x00004BFE, 0x00000000, 0x000038FC, 0x00000001, 0x000038FC, 0x00000002,\n    0x00001CC1, 0x0000000A, 0x00001CC1, 0x00000003, 0x00001CC0, 0x0000000C,\n    0x00001CC0, 0x00000004, 0x00002001, 0x00000006, 0x00002039, 0x000200F8,\n    0x00002039, 0x00050051, 0x0000000B, 0x00005F60, 0x00002AC2, 0x00000000,\n    0x0006000C, 0x00000013, 0x0000606D, 0x00000001, 0x0000003E, 0x00005F60,\n    0x00050051, 0x0000000D, 0x00002786, 0x0000606D, 0x00000000, 0x00050051,\n    0x0000000D, 0x00004458, 0x0000606D, 0x00000001, 0x00070050, 0x0000001D,\n    0x0000391E, 0x00002786, 0x00004458, 0x00000A0C, 0x00000A0C, 0x00050051,\n    0x0000000B, 0x0000438C, 0x00002AC2, 0x00000001, 0x0006000C, 0x00000013,\n    0x0000467D, 0x00000001, 0x0000003E, 0x0000438C, 0x00050051, 0x0000000D,\n    0x00002787, 0x0000467D, 0x00000000, 0x00050051, 0x0000000D, 0x00004459,\n    0x0000467D, 0x00000001, 0x00070050, 0x0000001D, 0x0000391F, 0x00002787,\n    0x00004459, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x0000438D,\n    0x00002AC2, 0x00000002, 0x0006000C, 0x00000013, 0x0000467E, 0x00000001,\n    0x0000003E, 0x0000438D, 0x00050051, 0x0000000D, 0x00002788, 0x0000467E,\n    0x00000000, 0x00050051, 0x0000000D, 0x0000445A, 0x0000467E, 0x00000001,\n    0x00070050, 0x0000001D, 0x00003920, 0x00002788, 0x0000445A, 0x00000A0C,\n    0x00000A0C, 0x00050051, 0x0000000B, 0x0000438E, 0x00002AC2, 0x00000003,\n    0x0006000C, 0x00000013, 0x0000467F, 0x00000001, 0x0000003E, 0x0000438E,\n    0x00050051, 0x0000000D, 0x00002789, 0x0000467F, 0x00000000, 0x00050051,\n    0x0000000D, 0x000050C4, 0x0000467F, 0x00000001, 0x00070050, 0x0000001D,\n    0x00002358, 0x00002789, 0x000050C4, 0x00000A0C, 0x00000A0C, 0x000200F9,\n    0x00003F63, 0x000200F8, 0x00002001, 0x00050051, 0x0000000B, 0x00003091,\n    0x00002AC2, 0x00000000, 0x0004007C, 0x0000000C, 0x000058A0, 0x00003091,\n    0x00050050, 0x00000012, 0x0000472F, 0x000058A0, 0x000058A0, 0x000500C4,\n    0x00000012, 0x000047B9, 0x0000472F, 0x000007A7, 0x000500C3, 0x00000012,\n    0x00003423, 0x000047B9, 0x00000867, 0x0004006F, 0x00000013, 0x00002ABB,\n    0x00003423, 0x0005008E, 0x00000013, 0x00004753, 0x00002ABB, 0x000007FE,\n    0x0007000C, 0x00000013, 0x00005E12, 0x00000001, 0x00000028, 0x00000049,\n    0x00004753, 0x00050051, 0x0000000D, 0x00005F16, 0x00005E12, 0x00000000,\n    0x00050051, 0x0000000D, 0x00003CDD, 0x00005E12, 0x00000001, 0x00070050,\n    0x0000001D, 0x00004127, 0x00005F16, 0x00003CDD, 0x00000A0C, 0x00000A0C,\n    0x00050051, 0x0000000B, 0x00004C4B, 0x00002AC2, 0x00000001, 0x0004007C,\n    0x0000000C, 0x00003EAA, 0x00004C4B, 0x00050050, 0x00000012, 0x00004730,\n    0x00003EAA, 0x00003EAA, 0x000500C4, 0x00000012, 0x000047BA, 0x00004730,\n    0x000007A7, 0x000500C3, 0x00000012, 0x00003424, 0x000047BA, 0x00000867,\n    0x0004006F, 0x00000013, 0x00002ABC, 0x00003424, 0x0005008E, 0x00000013,\n    0x00004754, 0x00002ABC, 0x000007FE, 0x0007000C, 0x00000013, 0x00005E13,\n    0x00000001, 0x00000028, 0x00000049, 0x00004754, 0x00050051, 0x0000000D,\n    0x00005F17, 0x00005E13, 0x00000000, 0x00050051, 0x0000000D, 0x00003CDE,\n    0x00005E13, 0x00000001, 0x00070050, 0x0000001D, 0x00004128, 0x00005F17,\n    0x00003CDE, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x00004C4C,\n    0x00002AC2, 0x00000002, 0x0004007C, 0x0000000C, 0x00003EAB, 0x00004C4C,\n    0x00050050, 0x00000012, 0x00004731, 0x00003EAB, 0x00003EAB, 0x000500C4,\n    0x00000012, 0x000047BC, 0x00004731, 0x000007A7, 0x000500C3, 0x00000012,\n    0x00003425, 0x000047BC, 0x00000867, 0x0004006F, 0x00000013, 0x00002ABD,\n    0x00003425, 0x0005008E, 0x00000013, 0x00004755, 0x00002ABD, 0x000007FE,\n    0x0007000C, 0x00000013, 0x00005E14, 0x00000001, 0x00000028, 0x00000049,\n    0x00004755, 0x00050051, 0x0000000D, 0x00005F18, 0x00005E14, 0x00000000,\n    0x00050051, 0x0000000D, 0x00003CDF, 0x00005E14, 0x00000001, 0x00070050,\n    0x0000001D, 0x00004129, 0x00005F18, 0x00003CDF, 0x00000A0C, 0x00000A0C,\n    0x00050051, 0x0000000B, 0x00004C4D, 0x00002AC2, 0x00000003, 0x0004007C,\n    0x0000000C, 0x00003EAC, 0x00004C4D, 0x00050050, 0x00000012, 0x00004732,\n    0x00003EAC, 0x00003EAC, 0x000500C4, 0x00000012, 0x000047BD, 0x00004732,\n    0x000007A7, 0x000500C3, 0x00000012, 0x00003426, 0x000047BD, 0x00000867,\n    0x0004006F, 0x00000013, 0x00002ABE, 0x00003426, 0x0005008E, 0x00000013,\n    0x00004756, 0x00002ABE, 0x000007FE, 0x0007000C, 0x00000013, 0x00005E15,\n    0x00000001, 0x00000028, 0x00000049, 0x00004756, 0x00050051, 0x0000000D,\n    0x00005F19, 0x00005E15, 0x00000000, 0x00050051, 0x0000000D, 0x0000494F,\n    0x00005E15, 0x00000001, 0x00070050, 0x0000001D, 0x00002359, 0x00005F19,\n    0x0000494F, 0x00000A0C, 0x00000A0C, 0x000200F9, 0x00003F63, 0x000200F8,\n    0x00001CC0, 0x00050051, 0x0000000B, 0x000056C6, 0x00002AC2, 0x00000000,\n    0x00060050, 0x00000014, 0x00004F13, 0x000056C6, 0x000056C6, 0x000056C6,\n    0x000500C2, 0x00000014, 0x00002B1C, 0x00004F13, 0x00000BB4, 0x000500C7,\n    0x00000014, 0x00005DF2, 0x00002B1C, 0x00000105, 0x000500C7, 0x00000014,\n    0x000048B4, 0x00002B1C, 0x00000466, 0x000500C2, 0x00000014, 0x00005B9C,\n    0x00005DF2, 0x00000B0C, 0x000500AA, 0x00000010, 0x000040D5, 0x00005B9C,\n    0x00000A12, 0x0006000C, 0x00000016, 0x00002C57, 0x00000001, 0x0000004B,\n    0x000048B4, 0x0004007C, 0x00000014, 0x00002A21, 0x00002C57, 0x00050082,\n    0x00000014, 0x00001886, 0x00000B0C, 0x00002A21, 0x00050080, 0x00000014,\n    0x0000221C, 0x00002A21, 0x00000938, 0x000600A9, 0x00000014, 0x0000287B,\n    0x000040D5, 0x0000221C, 0x00005B9C, 0x000500C4, 0x00000014, 0x00005AE0,\n    0x000048B4, 0x00001886, 0x000500C7, 0x00000014, 0x000049A6, 0x00005AE0,\n    0x00000466, 0x000600A9, 0x00000014, 0x00002AC3, 0x000040D5, 0x000049A6,\n    0x000048B4, 0x00050080, 0x00000014, 0x0000600A, 0x0000287B, 0x000003FA,\n    0x000500C4, 0x00000014, 0x00004F8B, 0x0000600A, 0x00000189, 0x000500C4,\n    0x00000014, 0x00003FB2, 0x00002AC3, 0x0000008D, 0x000500C5, 0x00000014,\n    0x00005788, 0x00004F8B, 0x00003FB2, 0x000500AA, 0x00000010, 0x0000360C,\n    0x00005DF2, 0x00000A12, 0x000600A9, 0x00000014, 0x0000424E, 0x0000360C,\n    0x00000A12, 0x00005788, 0x0004007C, 0x00000018, 0x000029DB, 0x0000424E,\n    0x000500C2, 0x0000000B, 0x00004BB0, 0x000056C6, 0x00000A64, 0x00040070,\n    0x0000000D, 0x0000481A, 0x00004BB0, 0x00050085, 0x0000000D, 0x00003E2B,\n    0x0000481A, 0x00000149, 0x00050051, 0x0000000D, 0x000053CE, 0x000029DB,\n    0x00000000, 0x00050051, 0x0000000D, 0x00002A61, 0x000029DB, 0x00000001,\n    0x00050051, 0x0000000D, 0x00001EA2, 0x000029DB, 0x00000002, 0x00070050,\n    0x0000001D, 0x00003DE3, 0x000053CE, 0x00002A61, 0x00001EA2, 0x00003E2B,\n    0x00050051, 0x0000000B, 0x000027FE, 0x00002AC2, 0x00000001, 0x00060050,\n    0x00000014, 0x00003517, 0x000027FE, 0x000027FE, 0x000027FE, 0x000500C2,\n    0x00000014, 0x00002B1D, 0x00003517, 0x00000BB4, 0x000500C7, 0x00000014,\n    0x00005DF3, 0x00002B1D, 0x00000105, 0x000500C7, 0x00000014, 0x000048B5,\n    0x00002B1D, 0x00000466, 0x000500C2, 0x00000014, 0x00005B9D, 0x00005DF3,\n    0x00000B0C, 0x000500AA, 0x00000010, 0x000040D6, 0x00005B9D, 0x00000A12,\n    0x0006000C, 0x00000016, 0x00002C58, 0x00000001, 0x0000004B, 0x000048B5,\n    0x0004007C, 0x00000014, 0x00002A22, 0x00002C58, 0x00050082, 0x00000014,\n    0x00001887, 0x00000B0C, 0x00002A22, 0x00050080, 0x00000014, 0x0000221D,\n    0x00002A22, 0x00000938, 0x000600A9, 0x00000014, 0x0000287C, 0x000040D6,\n    0x0000221D, 0x00005B9D, 0x000500C4, 0x00000014, 0x00005AE1, 0x000048B5,\n    0x00001887, 0x000500C7, 0x00000014, 0x000049A7, 0x00005AE1, 0x00000466,\n    0x000600A9, 0x00000014, 0x00002AC4, 0x000040D6, 0x000049A7, 0x000048B5,\n    0x00050080, 0x00000014, 0x0000600B, 0x0000287C, 0x000003FA, 0x000500C4,\n    0x00000014, 0x00004F8C, 0x0000600B, 0x00000189, 0x000500C4, 0x00000014,\n    0x00003FB3, 0x00002AC4, 0x0000008D, 0x000500C5, 0x00000014, 0x00005789,\n    0x00004F8C, 0x00003FB3, 0x000500AA, 0x00000010, 0x0000360D, 0x00005DF3,\n    0x00000A12, 0x000600A9, 0x00000014, 0x0000424F, 0x0000360D, 0x00000A12,\n    0x00005789, 0x0004007C, 0x00000018, 0x000029DC, 0x0000424F, 0x000500C2,\n    0x0000000B, 0x00004BB1, 0x000027FE, 0x00000A64, 0x00040070, 0x0000000D,\n    0x0000481B, 0x00004BB1, 0x00050085, 0x0000000D, 0x00003E2C, 0x0000481B,\n    0x00000149, 0x00050051, 0x0000000D, 0x000053CF, 0x000029DC, 0x00000000,\n    0x00050051, 0x0000000D, 0x00002A62, 0x000029DC, 0x00000001, 0x00050051,\n    0x0000000D, 0x00001EA3, 0x000029DC, 0x00000002, 0x00070050, 0x0000001D,\n    0x00003DE4, 0x000053CF, 0x00002A62, 0x00001EA3, 0x00003E2C, 0x00050051,\n    0x0000000B, 0x000027FF, 0x00002AC2, 0x00000002, 0x00060050, 0x00000014,\n    0x00003518, 0x000027FF, 0x000027FF, 0x000027FF, 0x000500C2, 0x00000014,\n    0x00002B1E, 0x00003518, 0x00000BB4, 0x000500C7, 0x00000014, 0x00005DF4,\n    0x00002B1E, 0x00000105, 0x000500C7, 0x00000014, 0x000048B6, 0x00002B1E,\n    0x00000466, 0x000500C2, 0x00000014, 0x00005B9E, 0x00005DF4, 0x00000B0C,\n    0x000500AA, 0x00000010, 0x000040D7, 0x00005B9E, 0x00000A12, 0x0006000C,\n    0x00000016, 0x00002C59, 0x00000001, 0x0000004B, 0x000048B6, 0x0004007C,\n    0x00000014, 0x00002A23, 0x00002C59, 0x00050082, 0x00000014, 0x00001888,\n    0x00000B0C, 0x00002A23, 0x00050080, 0x00000014, 0x0000221E, 0x00002A23,\n    0x00000938, 0x000600A9, 0x00000014, 0x0000287D, 0x000040D7, 0x0000221E,\n    0x00005B9E, 0x000500C4, 0x00000014, 0x00005AE2, 0x000048B6, 0x00001888,\n    0x000500C7, 0x00000014, 0x000049A8, 0x00005AE2, 0x00000466, 0x000600A9,\n    0x00000014, 0x00002AC5, 0x000040D7, 0x000049A8, 0x000048B6, 0x00050080,\n    0x00000014, 0x0000600C, 0x0000287D, 0x000003FA, 0x000500C4, 0x00000014,\n    0x00004F8D, 0x0000600C, 0x00000189, 0x000500C4, 0x00000014, 0x00003FB4,\n    0x00002AC5, 0x0000008D, 0x000500C5, 0x00000014, 0x0000578A, 0x00004F8D,\n    0x00003FB4, 0x000500AA, 0x00000010, 0x0000360E, 0x00005DF4, 0x00000A12,\n    0x000600A9, 0x00000014, 0x00004250, 0x0000360E, 0x00000A12, 0x0000578A,\n    0x0004007C, 0x00000018, 0x000029DD, 0x00004250, 0x000500C2, 0x0000000B,\n    0x00004BB2, 0x000027FF, 0x00000A64, 0x00040070, 0x0000000D, 0x0000481C,\n    0x00004BB2, 0x00050085, 0x0000000D, 0x00003E2D, 0x0000481C, 0x00000149,\n    0x00050051, 0x0000000D, 0x000053D0, 0x000029DD, 0x00000000, 0x00050051,\n    0x0000000D, 0x00002A63, 0x000029DD, 0x00000001, 0x00050051, 0x0000000D,\n    0x00001EA4, 0x000029DD, 0x00000002, 0x00070050, 0x0000001D, 0x00003DE5,\n    0x000053D0, 0x00002A63, 0x00001EA4, 0x00003E2D, 0x00050051, 0x0000000B,\n    0x00002800, 0x00002AC2, 0x00000003, 0x00060050, 0x00000014, 0x00003519,\n    0x00002800, 0x00002800, 0x00002800, 0x000500C2, 0x00000014, 0x00002B1F,\n    0x00003519, 0x00000BB4, 0x000500C7, 0x00000014, 0x00005DF5, 0x00002B1F,\n    0x00000105, 0x000500C7, 0x00000014, 0x000048B8, 0x00002B1F, 0x00000466,\n    0x000500C2, 0x00000014, 0x00005B9F, 0x00005DF5, 0x00000B0C, 0x000500AA,\n    0x00000010, 0x000040D8, 0x00005B9F, 0x00000A12, 0x0006000C, 0x00000016,\n    0x00002C5A, 0x00000001, 0x0000004B, 0x000048B8, 0x0004007C, 0x00000014,\n    0x00002A24, 0x00002C5A, 0x00050082, 0x00000014, 0x00001889, 0x00000B0C,\n    0x00002A24, 0x00050080, 0x00000014, 0x0000221F, 0x00002A24, 0x00000938,\n    0x000600A9, 0x00000014, 0x0000287E, 0x000040D8, 0x0000221F, 0x00005B9F,\n    0x000500C4, 0x00000014, 0x00005AE3, 0x000048B8, 0x00001889, 0x000500C7,\n    0x00000014, 0x000049A9, 0x00005AE3, 0x00000466, 0x000600A9, 0x00000014,\n    0x00002AC6, 0x000040D8, 0x000049A9, 0x000048B8, 0x00050080, 0x00000014,\n    0x0000600D, 0x0000287E, 0x000003FA, 0x000500C4, 0x00000014, 0x00004F8E,\n    0x0000600D, 0x00000189, 0x000500C4, 0x00000014, 0x00003FB5, 0x00002AC6,\n    0x0000008D, 0x000500C5, 0x00000014, 0x0000578B, 0x00004F8E, 0x00003FB5,\n    0x000500AA, 0x00000010, 0x0000360F, 0x00005DF5, 0x00000A12, 0x000600A9,\n    0x00000014, 0x00004251, 0x0000360F, 0x00000A12, 0x0000578B, 0x0004007C,\n    0x00000018, 0x000029DE, 0x00004251, 0x000500C2, 0x0000000B, 0x00004BB3,\n    0x00002800, 0x00000A64, 0x00040070, 0x0000000D, 0x0000481D, 0x00004BB3,\n    0x00050085, 0x0000000D, 0x00003E2E, 0x0000481D, 0x00000149, 0x00050051,\n    0x0000000D, 0x000053D1, 0x000029DE, 0x00000000, 0x00050051, 0x0000000D,\n    0x00002A64, 0x000029DE, 0x00000001, 0x00050051, 0x0000000D, 0x00002B20,\n    0x000029DE, 0x00000002, 0x00070050, 0x0000001D, 0x0000235A, 0x000053D1,\n    0x00002A64, 0x00002B20, 0x00003E2E, 0x000200F9, 0x00003F63, 0x000200F8,\n    0x00001CC1, 0x00050051, 0x0000000B, 0x000056C7, 0x00002AC2, 0x00000000,\n    0x00070050, 0x00000017, 0x00004F14, 0x000056C7, 0x000056C7, 0x000056C7,\n    0x000056C7, 0x000500C2, 0x00000017, 0x000024B0, 0x00004F14, 0x0000034D,\n    0x000500C7, 0x00000017, 0x000049B7, 0x000024B0, 0x0000027B, 0x00040070,\n    0x0000001D, 0x00003CC0, 0x000049B7, 0x00050085, 0x0000001D, 0x00004139,\n    0x00003CC0, 0x00000AEE, 0x00050051, 0x0000000B, 0x00005CDB, 0x00002AC2,\n    0x00000001, 0x00070050, 0x00000017, 0x00005156, 0x00005CDB, 0x00005CDB,\n    0x00005CDB, 0x00005CDB, 0x000500C2, 0x00000017, 0x000024B1, 0x00005156,\n    0x0000034D, 0x000500C7, 0x00000017, 0x000049B8, 0x000024B1, 0x0000027B,\n    0x00040070, 0x0000001D, 0x00003CC1, 0x000049B8, 0x00050085, 0x0000001D,\n    0x0000413A, 0x00003CC1, 0x00000AEE, 0x00050051, 0x0000000B, 0x00005CDC,\n    0x00002AC2, 0x00000002, 0x00070050, 0x00000017, 0x00005157, 0x00005CDC,\n    0x00005CDC, 0x00005CDC, 0x00005CDC, 0x000500C2, 0x00000017, 0x000024B2,\n    0x00005157, 0x0000034D, 0x000500C7, 0x00000017, 0x000049B9, 0x000024B2,\n    0x0000027B, 0x00040070, 0x0000001D, 0x00003CC2, 0x000049B9, 0x00050085,\n    0x0000001D, 0x0000413B, 0x00003CC2, 0x00000AEE, 0x00050051, 0x0000000B,\n    0x00005CDD, 0x00002AC2, 0x00000003, 0x00070050, 0x00000017, 0x0000515C,\n    0x00005CDD, 0x00005CDD, 0x00005CDD, 0x00005CDD, 0x000500C2, 0x00000017,\n    0x000024B3, 0x0000515C, 0x0000034D, 0x000500C7, 0x00000017, 0x000049BA,\n    0x000024B3, 0x0000027B, 0x00040070, 0x0000001D, 0x00004932, 0x000049BA,\n    0x00050085, 0x0000001D, 0x000026A2, 0x00004932, 0x00000AEE, 0x000200F9,\n    0x00003F63, 0x000200F8, 0x000038FC, 0x00050051, 0x0000000B, 0x000056C8,\n    0x00002AC2, 0x00000000, 0x00070050, 0x00000017, 0x00004F15, 0x000056C8,\n    0x000056C8, 0x000056C8, 0x000056C8, 0x000500C2, 0x00000017, 0x000024B4,\n    0x00004F15, 0x0000028D, 0x000500C7, 0x00000017, 0x00004A62, 0x000024B4,\n    0x0000064B, 0x00040070, 0x0000001D, 0x000036AB, 0x00004A62, 0x0005008E,\n    0x0000001D, 0x00004B2C, 0x000036AB, 0x0000017A, 0x00050051, 0x0000000B,\n    0x000021A8, 0x00002AC2, 0x00000001, 0x00070050, 0x00000017, 0x00006114,\n    0x000021A8, 0x000021A8, 0x000021A8, 0x000021A8, 0x000500C2, 0x00000017,\n    0x000024B5, 0x00006114, 0x0000028D, 0x000500C7, 0x00000017, 0x00004A63,\n    0x000024B5, 0x0000064B, 0x00040070, 0x0000001D, 0x000036AC, 0x00004A63,\n    0x0005008E, 0x0000001D, 0x00004B2D, 0x000036AC, 0x0000017A, 0x00050051,\n    0x0000000B, 0x000021A9, 0x00002AC2, 0x00000002, 0x00070050, 0x00000017,\n    0x00006115, 0x000021A9, 0x000021A9, 0x000021A9, 0x000021A9, 0x000500C2,\n    0x00000017, 0x000024B6, 0x00006115, 0x0000028D, 0x000500C7, 0x00000017,\n    0x00004A64, 0x000024B6, 0x0000064B, 0x00040070, 0x0000001D, 0x000036AD,\n    0x00004A64, 0x0005008E, 0x0000001D, 0x00004B2E, 0x000036AD, 0x0000017A,\n    0x00050051, 0x0000000B, 0x000021AA, 0x00002AC2, 0x00000003, 0x00070050,\n    0x00000017, 0x00006116, 0x000021AA, 0x000021AA, 0x000021AA, 0x000021AA,\n    0x000500C2, 0x00000017, 0x000024B7, 0x00006116, 0x0000028D, 0x000500C7,\n    0x00000017, 0x00004A65, 0x000024B7, 0x0000064B, 0x00040070, 0x0000001D,\n    0x0000431D, 0x00004A65, 0x0005008E, 0x0000001D, 0x00003095, 0x0000431D,\n    0x0000017A, 0x000200F9, 0x00003F63, 0x000200F8, 0x00004BFE, 0x00050051,\n    0x0000000B, 0x00003096, 0x00002AC2, 0x00000000, 0x0004007C, 0x0000000D,\n    0x00004FF1, 0x00003096, 0x00050050, 0x00000013, 0x0000433F, 0x00004FF1,\n    0x00000A0C, 0x0009004F, 0x0000001D, 0x00002D99, 0x0000433F, 0x0000433F,\n    0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00050051, 0x0000000B,\n    0x000056BA, 0x00002AC2, 0x00000001, 0x0004007C, 0x0000000D, 0x00003F71,\n    0x000056BA, 0x00050050, 0x00000013, 0x00004340, 0x00003F71, 0x00000A0C,\n    0x0009004F, 0x0000001D, 0x00002D9A, 0x00004340, 0x00004340, 0x00000000,\n    0x00000001, 0x00000001, 0x00000001, 0x00050051, 0x0000000B, 0x000056BB,\n    0x00002AC2, 0x00000002, 0x0004007C, 0x0000000D, 0x00003F72, 0x000056BB,\n    0x00050050, 0x00000013, 0x00004341, 0x00003F72, 0x00000A0C, 0x0009004F,\n    0x0000001D, 0x00002D9B, 0x00004341, 0x00004341, 0x00000000, 0x00000001,\n    0x00000001, 0x00000001, 0x00050051, 0x0000000B, 0x000056BC, 0x00002AC2,\n    0x00000003, 0x0004007C, 0x0000000D, 0x00003F73, 0x000056BC, 0x00050050,\n    0x00000013, 0x00004FB1, 0x00003F73, 0x00000A0C, 0x0009004F, 0x0000001D,\n    0x00005A3D, 0x00004FB1, 0x00004FB1, 0x00000000, 0x00000001, 0x00000001,\n    0x00000001, 0x000200F9, 0x00003F63, 0x000200F8, 0x00003F63, 0x000F00F5,\n    0x0000001D, 0x00002BB0, 0x00005A3D, 0x00004BFE, 0x00003095, 0x000038FC,\n    0x000026A2, 0x00001CC1, 0x0000235A, 0x00001CC0, 0x00002359, 0x00002001,\n    0x00002358, 0x00002039, 0x000F00F5, 0x0000001D, 0x00003811, 0x00002D9B,\n    0x00004BFE, 0x00004B2E, 0x000038FC, 0x0000413B, 0x00001CC1, 0x00003DE5,\n    0x00001CC0, 0x00004129, 0x00002001, 0x00003920, 0x00002039, 0x000F00F5,\n    0x0000001D, 0x00003B83, 0x00002D9A, 0x00004BFE, 0x00004B2D, 0x000038FC,\n    0x0000413A, 0x00001CC1, 0x00003DE4, 0x00001CC0, 0x00004128, 0x00002001,\n    0x0000391F, 0x00002039, 0x000F00F5, 0x0000001D, 0x000038BC, 0x00002D99,\n    0x00004BFE, 0x00004B2C, 0x000038FC, 0x00004139, 0x00001CC1, 0x00003DE3,\n    0x00001CC0, 0x00004127, 0x00002001, 0x0000391E, 0x00002039, 0x000200F9,\n    0x00005312, 0x000200F8, 0x00003B68, 0x000500AA, 0x00000009, 0x00005453,\n    0x0000199B, 0x00000A22, 0x000300F7, 0x00004F29, 0x00000002, 0x000400FA,\n    0x00005453, 0x000019C6, 0x00002306, 0x000200F8, 0x00002306, 0x000500C2,\n    0x0000000B, 0x00005637, 0x00003FF8, 0x00000A11, 0x00060041, 0x00000289,\n    0x00003447, 0x00000CC7, 0x00000A0B, 0x00005637, 0x0004003D, 0x0000000B,\n    0x00003157, 0x00003447, 0x00050080, 0x0000000B, 0x00002DD1, 0x00005637,\n    0x00000A0D, 0x00060041, 0x00000289, 0x00001916, 0x00000CC7, 0x00000A0B,\n    0x00002DD1, 0x0004003D, 0x0000000B, 0x00001B79, 0x00001916, 0x00050080,\n    0x0000000B, 0x0000214C, 0x00003FF8, 0x0000199B, 0x000500C2, 0x0000000B,\n    0x000054AD, 0x0000214C, 0x00000A11, 0x00060041, 0x00000289, 0x00004C9D,\n    0x00000CC7, 0x00000A0B, 0x000054AD, 0x0004003D, 0x0000000B, 0x00003158,\n    0x00004C9D, 0x00050080, 0x0000000B, 0x00002DD2, 0x000054AD, 0x00000A0D,\n    0x00060041, 0x00000289, 0x0000600E, 0x00000CC7, 0x00000A0B, 0x00002DD2,\n    0x0004003D, 0x0000000B, 0x0000374F, 0x0000600E, 0x00070050, 0x00000017,\n    0x00004CDA, 0x00003157, 0x00001B79, 0x00003158, 0x0000374F, 0x00050084,\n    0x0000000B, 0x00004C2E, 0x00000A10, 0x0000199B, 0x00050080, 0x0000000B,\n    0x00002A48, 0x00003FF8, 0x00004C2E, 0x000500C2, 0x0000000B, 0x000045F0,\n    0x00002A48, 0x00000A11, 0x00060041, 0x00000289, 0x00004C9E, 0x00000CC7,\n    0x00000A0B, 0x000045F0, 0x0004003D, 0x0000000B, 0x00003159, 0x00004C9E,\n    0x00050080, 0x0000000B, 0x00002DD3, 0x000045F0, 0x00000A0D, 0x00060041,\n    0x00000289, 0x0000194E, 0x00000CC7, 0x00000A0B, 0x00002DD3, 0x0004003D,\n    0x0000000B, 0x00005E5E, 0x0000194E, 0x00050084, 0x0000000B, 0x000021F8,\n    0x00000A13, 0x0000199B, 0x00050080, 0x0000000B, 0x00005EC9, 0x00003FF8,\n    0x000021F8, 0x000500C2, 0x0000000B, 0x000045F1, 0x00005EC9, 0x00000A11,\n    0x00060041, 0x00000289, 0x00004C9F, 0x00000CC7, 0x00000A0B, 0x000045F1,\n    0x0004003D, 0x0000000B, 0x0000315A, 0x00004C9F, 0x00050080, 0x0000000B,\n    0x00002DD4, 0x000045F1, 0x00000A0D, 0x00060041, 0x00000289, 0x0000600F,\n    0x00000CC7, 0x00000A0B, 0x00002DD4, 0x0004003D, 0x0000000B, 0x00004005,\n    0x0000600F, 0x00070050, 0x00000017, 0x0000513A, 0x00003159, 0x00005E5E,\n    0x0000315A, 0x00004005, 0x000200F9, 0x00004F29, 0x000200F8, 0x000019C6,\n    0x000500C2, 0x0000000B, 0x00005FAD, 0x00003FF8, 0x00000A11, 0x00060041,\n    0x00000289, 0x00003448, 0x00000CC7, 0x00000A0B, 0x00005FAD, 0x0004003D,\n    0x0000000B, 0x0000315B, 0x00003448, 0x00050080, 0x0000000B, 0x00002DD5,\n    0x00005FAD, 0x00000A0D, 0x00060041, 0x00000289, 0x00001917, 0x00000CC7,\n    0x00000A0B, 0x00002DD5, 0x0004003D, 0x0000000B, 0x00005C76, 0x00001917,\n    0x00050080, 0x0000000B, 0x00002DD6, 0x00005FAD, 0x00000A10, 0x00060041,\n    0x00000289, 0x00001918, 0x00000CC7, 0x00000A0B, 0x00002DD6, 0x0004003D,\n    0x0000000B, 0x00005C77, 0x00001918, 0x00050080, 0x0000000B, 0x00002DD7,\n    0x00005FAD, 0x00000A13, 0x00060041, 0x00000289, 0x00006010, 0x00000CC7,\n    0x00000A0B, 0x00002DD7, 0x0004003D, 0x0000000B, 0x00003703, 0x00006010,\n    0x00070050, 0x00000017, 0x00005473, 0x0000315B, 0x00005C76, 0x00005C77,\n    0x00003703, 0x00050080, 0x0000000B, 0x00004B86, 0x00003FF8, 0x00000A3A,\n    0x000500C2, 0x0000000B, 0x00002030, 0x00004B86, 0x00000A11, 0x00060041,\n    0x00000289, 0x00004CA0, 0x00000CC7, 0x00000A0B, 0x00002030, 0x0004003D,\n    0x0000000B, 0x0000315C, 0x00004CA0, 0x00050080, 0x0000000B, 0x00002DD8,\n    0x00002030, 0x00000A0D, 0x00060041, 0x00000289, 0x00001919, 0x00000CC7,\n    0x00000A0B, 0x00002DD8, 0x0004003D, 0x0000000B, 0x00005C78, 0x00001919,\n    0x00050080, 0x0000000B, 0x00002DD9, 0x00002030, 0x00000A10, 0x00060041,\n    0x00000289, 0x0000191A, 0x00000CC7, 0x00000A0B, 0x00002DD9, 0x0004003D,\n    0x0000000B, 0x00005C79, 0x0000191A, 0x00050080, 0x0000000B, 0x00002DDA,\n    0x00002030, 0x00000A13, 0x00060041, 0x00000289, 0x00006011, 0x00000CC7,\n    0x00000A0B, 0x00002DDA, 0x0004003D, 0x0000000B, 0x00004006, 0x00006011,\n    0x00070050, 0x00000017, 0x0000513B, 0x0000315C, 0x00005C78, 0x00005C79,\n    0x00004006, 0x000200F9, 0x00004F29, 0x000200F8, 0x00004F29, 0x000700F5,\n    0x00000017, 0x00002BD0, 0x0000513B, 0x000019C6, 0x0000513A, 0x00002306,\n    0x000700F5, 0x00000017, 0x00003723, 0x00005473, 0x000019C6, 0x00004CDA,\n    0x00002306, 0x000300F7, 0x00004F2A, 0x00000000, 0x000700FB, 0x00002180,\n    0x00004F59, 0x00000005, 0x0000215B, 0x00000007, 0x0000203A, 0x000200F8,\n    0x0000203A, 0x00050051, 0x0000000B, 0x00005F61, 0x00003723, 0x00000000,\n    0x0006000C, 0x00000013, 0x0000606E, 0x00000001, 0x0000003E, 0x00005F61,\n    0x00050051, 0x0000000D, 0x0000278A, 0x0000606E, 0x00000000, 0x00050051,\n    0x0000000D, 0x00003EC4, 0x0000606E, 0x00000001, 0x00050051, 0x0000000B,\n    0x0000428D, 0x00003723, 0x00000001, 0x0006000C, 0x00000013, 0x00003D01,\n    0x00000001, 0x0000003E, 0x0000428D, 0x00050051, 0x0000000D, 0x0000278B,\n    0x00003D01, 0x00000000, 0x00050051, 0x0000000D, 0x0000445B, 0x00003D01,\n    0x00000001, 0x00070050, 0x0000001D, 0x00003921, 0x0000278A, 0x00003EC4,\n    0x0000278B, 0x0000445B, 0x00050051, 0x0000000B, 0x0000438F, 0x00003723,\n    0x00000002, 0x0006000C, 0x00000013, 0x00004680, 0x00000001, 0x0000003E,\n    0x0000438F, 0x00050051, 0x0000000D, 0x0000278C, 0x00004680, 0x00000000,\n    0x00050051, 0x0000000D, 0x00003EC5, 0x00004680, 0x00000001, 0x00050051,\n    0x0000000B, 0x0000428E, 0x00003723, 0x00000003, 0x0006000C, 0x00000013,\n    0x00003D02, 0x00000001, 0x0000003E, 0x0000428E, 0x00050051, 0x0000000D,\n    0x0000278D, 0x00003D02, 0x00000000, 0x00050051, 0x0000000D, 0x0000445C,\n    0x00003D02, 0x00000001, 0x00070050, 0x0000001D, 0x00003922, 0x0000278C,\n    0x00003EC5, 0x0000278D, 0x0000445C, 0x00050051, 0x0000000B, 0x00004390,\n    0x00002BD0, 0x00000000, 0x0006000C, 0x00000013, 0x00004681, 0x00000001,\n    0x0000003E, 0x00004390, 0x00050051, 0x0000000D, 0x0000278E, 0x00004681,\n    0x00000000, 0x00050051, 0x0000000D, 0x00003EC6, 0x00004681, 0x00000001,\n    0x00050051, 0x0000000B, 0x0000428F, 0x00002BD0, 0x00000001, 0x0006000C,\n    0x00000013, 0x00003D03, 0x00000001, 0x0000003E, 0x0000428F, 0x00050051,\n    0x0000000D, 0x0000278F, 0x00003D03, 0x00000000, 0x00050051, 0x0000000D,\n    0x0000445D, 0x00003D03, 0x00000001, 0x00070050, 0x0000001D, 0x00003923,\n    0x0000278E, 0x00003EC6, 0x0000278F, 0x0000445D, 0x00050051, 0x0000000B,\n    0x00004391, 0x00002BD0, 0x00000002, 0x0006000C, 0x00000013, 0x00004682,\n    0x00000001, 0x0000003E, 0x00004391, 0x00050051, 0x0000000D, 0x00002790,\n    0x00004682, 0x00000000, 0x00050051, 0x0000000D, 0x00003EC7, 0x00004682,\n    0x00000001, 0x00050051, 0x0000000B, 0x00004290, 0x00002BD0, 0x00000003,\n    0x0006000C, 0x00000013, 0x00003D04, 0x00000001, 0x0000003E, 0x00004290,\n    0x00050051, 0x0000000D, 0x00002791, 0x00003D04, 0x00000000, 0x00050051,\n    0x0000000D, 0x000050C5, 0x00003D04, 0x00000001, 0x00070050, 0x0000001D,\n    0x0000235B, 0x00002790, 0x00003EC7, 0x00002791, 0x000050C5, 0x000200F9,\n    0x00004F2A, 0x000200F8, 0x0000215B, 0x0007004F, 0x00000011, 0x000025FE,\n    0x00003723, 0x00003723, 0x00000000, 0x00000001, 0x0004007C, 0x00000012,\n    0x00005B3F, 0x000025FE, 0x0009004F, 0x0000001A, 0x000060DA, 0x00005B3F,\n    0x00005B3F, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x000500C4,\n    0x0000001A, 0x000048B9, 0x000060DA, 0x00000122, 0x000500C3, 0x0000001A,\n    0x00003D99, 0x000048B9, 0x00000302, 0x0004006F, 0x0000001D, 0x00002AC7,\n    0x00003D99, 0x0005008E, 0x0000001D, 0x00004733, 0x00002AC7, 0x000007FE,\n    0x0007000C, 0x0000001D, 0x0000629A, 0x00000001, 0x00000028, 0x00000504,\n    0x00004733, 0x0007004F, 0x00000011, 0x00003774, 0x00003723, 0x00003723,\n    0x00000002, 0x00000003, 0x0004007C, 0x00000012, 0x000024C8, 0x00003774,\n    0x0009004F, 0x0000001A, 0x000060DB, 0x000024C8, 0x000024C8, 0x00000000,\n    0x00000000, 0x00000001, 0x00000001, 0x000500C4, 0x0000001A, 0x000048BA,\n    0x000060DB, 0x00000122, 0x000500C3, 0x0000001A, 0x00003D9A, 0x000048BA,\n    0x00000302, 0x0004006F, 0x0000001D, 0x00002AC8, 0x00003D9A, 0x0005008E,\n    0x0000001D, 0x00004734, 0x00002AC8, 0x000007FE, 0x0007000C, 0x0000001D,\n    0x0000629B, 0x00000001, 0x00000028, 0x00000504, 0x00004734, 0x0007004F,\n    0x00000011, 0x00003775, 0x00002BD0, 0x00002BD0, 0x00000000, 0x00000001,\n    0x0004007C, 0x00000012, 0x000024C9, 0x00003775, 0x0009004F, 0x0000001A,\n    0x000060DC, 0x000024C9, 0x000024C9, 0x00000000, 0x00000000, 0x00000001,\n    0x00000001, 0x000500C4, 0x0000001A, 0x000048BB, 0x000060DC, 0x00000122,\n    0x000500C3, 0x0000001A, 0x00003D9B, 0x000048BB, 0x00000302, 0x0004006F,\n    0x0000001D, 0x00002AC9, 0x00003D9B, 0x0005008E, 0x0000001D, 0x00004735,\n    0x00002AC9, 0x000007FE, 0x0007000C, 0x0000001D, 0x0000629C, 0x00000001,\n    0x00000028, 0x00000504, 0x00004735, 0x0007004F, 0x00000011, 0x00003776,\n    0x00002BD0, 0x00002BD0, 0x00000002, 0x00000003, 0x0004007C, 0x00000012,\n    0x000024CA, 0x00003776, 0x0009004F, 0x0000001A, 0x000060DD, 0x000024CA,\n    0x000024CA, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x000500C4,\n    0x0000001A, 0x000048BC, 0x000060DD, 0x00000122, 0x000500C3, 0x0000001A,\n    0x00003D9C, 0x000048BC, 0x00000302, 0x0004006F, 0x0000001D, 0x00002ACA,\n    0x00003D9C, 0x0005008E, 0x0000001D, 0x000053D2, 0x00002ACA, 0x000007FE,\n    0x0007000C, 0x0000001D, 0x00004365, 0x00000001, 0x00000028, 0x00000504,\n    0x000053D2, 0x000200F9, 0x00004F2A, 0x000200F8, 0x00004F59, 0x0007004F,\n    0x00000011, 0x00002624, 0x00003723, 0x00003723, 0x00000000, 0x00000001,\n    0x0004007C, 0x00000013, 0x0000515D, 0x00002624, 0x00050051, 0x0000000D,\n    0x00001B88, 0x0000515D, 0x00000000, 0x00050051, 0x0000000D, 0x00003473,\n    0x0000515D, 0x00000001, 0x00070050, 0x0000001D, 0x00004291, 0x00001B88,\n    0x00003473, 0x00000A0C, 0x00000A0C, 0x0007004F, 0x00000011, 0x000041E1,\n    0x00003723, 0x00003723, 0x00000002, 0x00000003, 0x0004007C, 0x00000013,\n    0x00003766, 0x000041E1, 0x00050051, 0x0000000D, 0x00001B89, 0x00003766,\n    0x00000000, 0x00050051, 0x0000000D, 0x00003474, 0x00003766, 0x00000001,\n    0x00070050, 0x0000001D, 0x00004292, 0x00001B89, 0x00003474, 0x00000A0C,\n    0x00000A0C, 0x0007004F, 0x00000011, 0x000041E2, 0x00002BD0, 0x00002BD0,\n    0x00000000, 0x00000001, 0x0004007C, 0x00000013, 0x00003767, 0x000041E2,\n    0x00050051, 0x0000000D, 0x00001B8A, 0x00003767, 0x00000000, 0x00050051,\n    0x0000000D, 0x00003475, 0x00003767, 0x00000001, 0x00070050, 0x0000001D,\n    0x00004293, 0x00001B8A, 0x00003475, 0x00000A0C, 0x00000A0C, 0x0007004F,\n    0x00000011, 0x000041E3, 0x00002BD0, 0x00002BD0, 0x00000002, 0x00000003,\n    0x0004007C, 0x00000013, 0x00003768, 0x000041E3, 0x00050051, 0x0000000D,\n    0x00001B8B, 0x00003768, 0x00000000, 0x00050051, 0x0000000D, 0x0000410B,\n    0x00003768, 0x00000001, 0x00070050, 0x0000001D, 0x0000235C, 0x00001B8B,\n    0x0000410B, 0x00000A0C, 0x00000A0C, 0x000200F9, 0x00004F2A, 0x000200F8,\n    0x00004F2A, 0x000900F5, 0x0000001D, 0x00002BB1, 0x0000235C, 0x00004F59,\n    0x00004365, 0x0000215B, 0x0000235B, 0x0000203A, 0x000900F5, 0x0000001D,\n    0x00003812, 0x00004293, 0x00004F59, 0x0000629C, 0x0000215B, 0x00003923,\n    0x0000203A, 0x000900F5, 0x0000001D, 0x00003B84, 0x00004292, 0x00004F59,\n    0x0000629B, 0x0000215B, 0x00003922, 0x0000203A, 0x000900F5, 0x0000001D,\n    0x000038BD, 0x00004291, 0x00004F59, 0x0000629A, 0x0000215B, 0x00003921,\n    0x0000203A, 0x000200F9, 0x00005312, 0x000200F8, 0x00005312, 0x000700F5,\n    0x0000001D, 0x00002BB2, 0x00002BB1, 0x00004F2A, 0x00002BB0, 0x00003F63,\n    0x000700F5, 0x0000001D, 0x00003813, 0x00003812, 0x00004F2A, 0x00003811,\n    0x00003F63, 0x000700F5, 0x0000001D, 0x00003297, 0x00003B84, 0x00004F2A,\n    0x00003B83, 0x00003F63, 0x000700F5, 0x0000001D, 0x0000367C, 0x000038BD,\n    0x00004F2A, 0x000038BC, 0x00003F63, 0x00050081, 0x0000001D, 0x0000435B,\n    0x0000435A, 0x0000367C, 0x00050081, 0x0000001D, 0x00005B03, 0x00005B02,\n    0x00003297, 0x00050081, 0x0000001D, 0x00002523, 0x00001C28, 0x00003813,\n    0x00050081, 0x0000001D, 0x00001E77, 0x000025AA, 0x00002BB2, 0x000200F9,\n    0x00005ECA, 0x000200F8, 0x00005ECA, 0x000700F5, 0x0000001D, 0x00002BB3,\n    0x00005113, 0x00005310, 0x00001E77, 0x00005312, 0x000700F5, 0x0000001D,\n    0x00003814, 0x00001F92, 0x00005310, 0x00002523, 0x00005312, 0x000700F5,\n    0x0000001D, 0x00003B31, 0x00005B01, 0x00005310, 0x00005B03, 0x00005312,\n    0x000700F5, 0x0000001D, 0x00003B85, 0x00004359, 0x00005310, 0x0000435B,\n    0x00005312, 0x000700F5, 0x0000000D, 0x000038BE, 0x00005A1D, 0x00005310,\n    0x00002F3A, 0x00005312, 0x000200F9, 0x00005313, 0x000200F8, 0x00005313,\n    0x000700F5, 0x0000001D, 0x00002BB4, 0x00002BA9, 0x0000530F, 0x00002BB3,\n    0x00005ECA, 0x000700F5, 0x0000001D, 0x00003815, 0x0000380A, 0x0000530F,\n    0x00003814, 0x00005ECA, 0x000700F5, 0x0000001D, 0x00003B32, 0x000035EC,\n    0x0000530F, 0x00003B31, 0x00005ECA, 0x000700F5, 0x0000001D, 0x0000338C,\n    0x000020D3, 0x0000530F, 0x00003B85, 0x00005ECA, 0x000700F5, 0x0000000D,\n    0x00002EA8, 0x00002B2C, 0x0000530F, 0x000038BE, 0x00005ECA, 0x0005008E,\n    0x0000001D, 0x00005A74, 0x0000338C, 0x00002EA8, 0x0005008E, 0x0000001D,\n    0x000019CC, 0x00003B32, 0x00002EA8, 0x0005008E, 0x0000001D, 0x0000306F,\n    0x00003815, 0x00002EA8, 0x0005008E, 0x0000001D, 0x00003432, 0x00002BB4,\n    0x00002EA8, 0x000300F7, 0x00003F64, 0x00000002, 0x000400FA, 0x00001D33,\n    0x00002741, 0x00003F64, 0x000200F8, 0x00002741, 0x0009004F, 0x0000001D,\n    0x00003AEE, 0x00005A74, 0x00005A74, 0x00000002, 0x00000001, 0x00000000,\n    0x00000003, 0x0009004F, 0x0000001D, 0x00003A07, 0x000019CC, 0x000019CC,\n    0x00000002, 0x00000001, 0x00000000, 0x00000003, 0x0009004F, 0x0000001D,\n    0x00001CE6, 0x0000306F, 0x0000306F, 0x00000002, 0x00000001, 0x00000000,\n    0x00000003, 0x0009004F, 0x0000001D, 0x00003EEF, 0x00003432, 0x00003432,\n    0x00000002, 0x00000001, 0x00000000, 0x00000003, 0x000200F9, 0x00003F64,\n    0x000200F8, 0x00003F64, 0x000700F5, 0x0000001D, 0x00002BB5, 0x00003432,\n    0x00005313, 0x00003EEF, 0x00002741, 0x000700F5, 0x0000001D, 0x00003816,\n    0x0000306F, 0x00005313, 0x00001CE6, 0x00002741, 0x000700F5, 0x0000001D,\n    0x00003B57, 0x000019CC, 0x00005313, 0x00003A07, 0x00002741, 0x000700F5,\n    0x0000001D, 0x00003A49, 0x00005A74, 0x00005313, 0x00003AEE, 0x00002741,\n    0x000300F7, 0x00004992, 0x00000000, 0x001900FB, 0x00005093, 0x00002002,\n    0x00000006, 0x00004696, 0x0000000E, 0x00004696, 0x00000032, 0x00004696,\n    0x00000007, 0x000045F2, 0x00000036, 0x000045F2, 0x00000010, 0x00001935,\n    0x00000037, 0x00001935, 0x00000011, 0x00001934, 0x00000038, 0x00001934,\n    0x00000019, 0x00001933, 0x0000001F, 0x00002514, 0x000200F8, 0x00002514,\n    0x00050051, 0x0000000D, 0x00003AAE, 0x00003A49, 0x00000000, 0x00050051,\n    0x0000000D, 0x000023ED, 0x00003A49, 0x00000001, 0x00050050, 0x00000013,\n    0x00004B20, 0x00003AAE, 0x000023ED, 0x0006000C, 0x0000000B, 0x00002171,\n    0x00000001, 0x0000003A, 0x00004B20, 0x00050051, 0x0000000D, 0x00005BBF,\n    0x00003B57, 0x00000000, 0x00050051, 0x0000000D, 0x000039A7, 0x00003B57,\n    0x00000001, 0x00050050, 0x00000013, 0x00004B21, 0x00005BBF, 0x000039A7,\n    0x0006000C, 0x0000000B, 0x00002172, 0x00000001, 0x0000003A, 0x00004B21,\n    0x00050051, 0x0000000D, 0x00005BC0, 0x00003816, 0x00000000, 0x00050051,\n    0x0000000D, 0x000039A8, 0x00003816, 0x00000001, 0x00050050, 0x00000013,\n    0x00004B22, 0x00005BC0, 0x000039A8, 0x0006000C, 0x0000000B, 0x00002173,\n    0x00000001, 0x0000003A, 0x00004B22, 0x00050051, 0x0000000D, 0x00005BC1,\n    0x00002BB5, 0x00000000, 0x00050051, 0x0000000D, 0x000039A9, 0x00002BB5,\n    0x00000001, 0x00050050, 0x00000013, 0x00004B0D, 0x00005BC1, 0x000039A9,\n    0x0006000C, 0x0000000B, 0x00002E96, 0x00000001, 0x0000003A, 0x00004B0D,\n    0x00070050, 0x00000017, 0x0000612F, 0x00002171, 0x00002172, 0x00002173,\n    0x00002E96, 0x000200F9, 0x00004992, 0x000200F8, 0x00001933, 0x0007004F,\n    0x00000013, 0x0000227A, 0x00003A49, 0x00003A49, 0x00000000, 0x00000001,\n    0x0008000C, 0x00000013, 0x00005CB1, 0x00000001, 0x0000002B, 0x0000227A,\n    0x0000071F, 0x00000300, 0x0005008E, 0x00000013, 0x000025B4, 0x00005CB1,\n    0x0000022D, 0x00050081, 0x00000013, 0x00002E66, 0x000025B4, 0x0000061E,\n    0x0004006D, 0x00000011, 0x00001DD7, 0x00002E66, 0x00050051, 0x0000000B,\n    0x000021FC, 0x00001DD7, 0x00000000, 0x00050051, 0x0000000B, 0x00002FDB,\n    0x00001DD7, 0x00000001, 0x000500C4, 0x0000000B, 0x00002D03, 0x00002FDB,\n    0x00000A3B, 0x000500C5, 0x0000000B, 0x00004143, 0x000021FC, 0x00002D03,\n    0x0007004F, 0x00000013, 0x0000235D, 0x00003B57, 0x00003B57, 0x00000000,\n    0x00000001, 0x0008000C, 0x00000013, 0x000046BF, 0x00000001, 0x0000002B,\n    0x0000235D, 0x0000071F, 0x00000300, 0x0005008E, 0x00000013, 0x000025B5,\n    0x000046BF, 0x0000022D, 0x00050081, 0x00000013, 0x00002E67, 0x000025B5,\n    0x0000061E, 0x0004006D, 0x00000011, 0x00001DD9, 0x00002E67, 0x00050051,\n    0x0000000B, 0x000021FD, 0x00001DD9, 0x00000000, 0x00050051, 0x0000000B,\n    0x00002FDC, 0x00001DD9, 0x00000001, 0x000500C4, 0x0000000B, 0x00002D04,\n    0x00002FDC, 0x00000A3B, 0x000500C5, 0x0000000B, 0x00004144, 0x000021FD,\n    0x00002D04, 0x0007004F, 0x00000013, 0x0000235E, 0x00003816, 0x00003816,\n    0x00000000, 0x00000001, 0x0008000C, 0x00000013, 0x000046C0, 0x00000001,\n    0x0000002B, 0x0000235E, 0x0000071F, 0x00000300, 0x0005008E, 0x00000013,\n    0x000025B6, 0x000046C0, 0x0000022D, 0x00050081, 0x00000013, 0x00002E69,\n    0x000025B6, 0x0000061E, 0x0004006D, 0x00000011, 0x00001DDA, 0x00002E69,\n    0x00050051, 0x0000000B, 0x000021FE, 0x00001DDA, 0x00000000, 0x00050051,\n    0x0000000B, 0x00002FDD, 0x00001DDA, 0x00000001, 0x000500C4, 0x0000000B,\n    0x00002D05, 0x00002FDD, 0x00000A3B, 0x000500C5, 0x0000000B, 0x00004145,\n    0x000021FE, 0x00002D05, 0x0007004F, 0x00000013, 0x0000235F, 0x00002BB5,\n    0x00002BB5, 0x00000000, 0x00000001, 0x0008000C, 0x00000013, 0x000046C1,\n    0x00000001, 0x0000002B, 0x0000235F, 0x0000071F, 0x00000300, 0x0005008E,\n    0x00000013, 0x000025B7, 0x000046C1, 0x0000022D, 0x00050081, 0x00000013,\n    0x00002E6A, 0x000025B7, 0x0000061E, 0x0004006D, 0x00000011, 0x00001DDB,\n    0x00002E6A, 0x00050051, 0x0000000B, 0x000021FF, 0x00001DDB, 0x00000000,\n    0x00050051, 0x0000000B, 0x00002FDE, 0x00001DDB, 0x00000001, 0x000500C4,\n    0x0000000B, 0x00002D16, 0x00002FDE, 0x00000A3B, 0x000500C5, 0x0000000B,\n    0x00005202, 0x000021FF, 0x00002D16, 0x00070050, 0x00000017, 0x000053DD,\n    0x00004143, 0x00004144, 0x00004145, 0x00005202, 0x000200F9, 0x00004992,\n    0x000200F8, 0x00001934, 0x0008004F, 0x00000018, 0x000021CF, 0x00003A49,\n    0x00003A49, 0x00000000, 0x00000001, 0x00000002, 0x0008000C, 0x00000018,\n    0x00001847, 0x00000001, 0x0000002B, 0x000021CF, 0x00000A2D, 0x00000A18,\n    0x00050085, 0x00000018, 0x00001BC1, 0x00001847, 0x0000000E, 0x00050081,\n    0x00000018, 0x00001F1A, 0x00001BC1, 0x000003AB, 0x0004006D, 0x00000014,\n    0x00002752, 0x00001F1A, 0x00050051, 0x0000000B, 0x00002200, 0x00002752,\n    0x00000000, 0x00050051, 0x0000000B, 0x00002FDF, 0x00002752, 0x00000001,\n    0x000500C4, 0x0000000B, 0x00002D29, 0x00002FDF, 0x00000A29, 0x000500C5,\n    0x0000000B, 0x00004D66, 0x00002200, 0x00002D29, 0x00050051, 0x0000000B,\n    0x000053E4, 0x00002752, 0x00000002, 0x000500C4, 0x0000000B, 0x0000214D,\n    0x000053E4, 0x00000A4A, 0x000500C5, 0x0000000B, 0x00004146, 0x00004D66,\n    0x0000214D, 0x0008004F, 0x00000018, 0x000022A2, 0x00003B57, 0x00003B57,\n    0x00000000, 0x00000001, 0x00000002, 0x0008000C, 0x00000018, 0x00004CD4,\n    0x00000001, 0x0000002B, 0x000022A2, 0x00000A2D, 0x00000A18, 0x00050085,\n    0x00000018, 0x00001BC2, 0x00004CD4, 0x0000000E, 0x00050081, 0x00000018,\n    0x00001F1B, 0x00001BC2, 0x000003AB, 0x0004006D, 0x00000014, 0x00002753,\n    0x00001F1B, 0x00050051, 0x0000000B, 0x00002201, 0x00002753, 0x00000000,\n    0x00050051, 0x0000000B, 0x00002FE0, 0x00002753, 0x00000001, 0x000500C4,\n    0x0000000B, 0x00002D2A, 0x00002FE0, 0x00000A29, 0x000500C5, 0x0000000B,\n    0x00004D67, 0x00002201, 0x00002D2A, 0x00050051, 0x0000000B, 0x000053E5,\n    0x00002753, 0x00000002, 0x000500C4, 0x0000000B, 0x0000214E, 0x000053E5,\n    0x00000A4A, 0x000500C5, 0x0000000B, 0x00004147, 0x00004D67, 0x0000214E,\n    0x0008004F, 0x00000018, 0x000022A3, 0x00003816, 0x00003816, 0x00000000,\n    0x00000001, 0x00000002, 0x0008000C, 0x00000018, 0x00004CD5, 0x00000001,\n    0x0000002B, 0x000022A3, 0x00000A2D, 0x00000A18, 0x00050085, 0x00000018,\n    0x00001BC3, 0x00004CD5, 0x0000000E, 0x00050081, 0x00000018, 0x00001F1C,\n    0x00001BC3, 0x000003AB, 0x0004006D, 0x00000014, 0x00002754, 0x00001F1C,\n    0x00050051, 0x0000000B, 0x00002202, 0x00002754, 0x00000000, 0x00050051,\n    0x0000000B, 0x00002FE1, 0x00002754, 0x00000001, 0x000500C4, 0x0000000B,\n    0x00002D2B, 0x00002FE1, 0x00000A29, 0x000500C5, 0x0000000B, 0x00004D68,\n    0x00002202, 0x00002D2B, 0x00050051, 0x0000000B, 0x000053E6, 0x00002754,\n    0x00000002, 0x000500C4, 0x0000000B, 0x0000214F, 0x000053E6, 0x00000A4A,\n    0x000500C5, 0x0000000B, 0x00004148, 0x00004D68, 0x0000214F, 0x0008004F,\n    0x00000018, 0x000022A4, 0x00002BB5, 0x00002BB5, 0x00000000, 0x00000001,\n    0x00000002, 0x0008000C, 0x00000018, 0x00004CDB, 0x00000001, 0x0000002B,\n    0x000022A4, 0x00000A2D, 0x00000A18, 0x00050085, 0x00000018, 0x00001BC4,\n    0x00004CDB, 0x0000000E, 0x00050081, 0x00000018, 0x00001F1D, 0x00001BC4,\n    0x000003AB, 0x0004006D, 0x00000014, 0x00002755, 0x00001F1D, 0x00050051,\n    0x0000000B, 0x00002203, 0x00002755, 0x00000000, 0x00050051, 0x0000000B,\n    0x00002FE2, 0x00002755, 0x00000001, 0x000500C4, 0x0000000B, 0x00002D2C,\n    0x00002FE2, 0x00000A29, 0x000500C5, 0x0000000B, 0x00004D69, 0x00002203,\n    0x00002D2C, 0x00050051, 0x0000000B, 0x000053E7, 0x00002755, 0x00000002,\n    0x000500C4, 0x0000000B, 0x0000215D, 0x000053E7, 0x00000A4A, 0x000500C5,\n    0x0000000B, 0x00005203, 0x00004D69, 0x0000215D, 0x00070050, 0x00000017,\n    0x000053DE, 0x00004146, 0x00004147, 0x00004148, 0x00005203, 0x000200F9,\n    0x00004992, 0x000200F8, 0x00001935, 0x0008004F, 0x00000018, 0x000021D0,\n    0x00003A49, 0x00003A49, 0x00000000, 0x00000001, 0x00000002, 0x0008000C,\n    0x00000018, 0x00001848, 0x00000001, 0x0000002B, 0x000021D0, 0x00000A2D,\n    0x00000A18, 0x00050085, 0x00000018, 0x00001BC5, 0x00001848, 0x000008E3,\n    0x00050081, 0x00000018, 0x00001F1E, 0x00001BC5, 0x000003AB, 0x0004006D,\n    0x00000014, 0x00002756, 0x00001F1E, 0x00050051, 0x0000000B, 0x00002204,\n    0x00002756, 0x00000000, 0x00050051, 0x0000000B, 0x00002FE3, 0x00002756,\n    0x00000001, 0x000500C4, 0x0000000B, 0x00002D2D, 0x00002FE3, 0x00000A2C,\n    0x000500C5, 0x0000000B, 0x00004D6A, 0x00002204, 0x00002D2D, 0x00050051,\n    0x0000000B, 0x000053E8, 0x00002756, 0x00000002, 0x000500C4, 0x0000000B,\n    0x00002150, 0x000053E8, 0x00000A4D, 0x000500C5, 0x0000000B, 0x00004149,\n    0x00004D6A, 0x00002150, 0x0008004F, 0x00000018, 0x000022A5, 0x00003B57,\n    0x00003B57, 0x00000000, 0x00000001, 0x00000002, 0x0008000C, 0x00000018,\n    0x00004CDC, 0x00000001, 0x0000002B, 0x000022A5, 0x00000A2D, 0x00000A18,\n    0x00050085, 0x00000018, 0x00001BC6, 0x00004CDC, 0x000008E3, 0x00050081,\n    0x00000018, 0x00001F1F, 0x00001BC6, 0x000003AB, 0x0004006D, 0x00000014,\n    0x00002757, 0x00001F1F, 0x00050051, 0x0000000B, 0x00002205, 0x00002757,\n    0x00000000, 0x00050051, 0x0000000B, 0x00002FE4, 0x00002757, 0x00000001,\n    0x000500C4, 0x0000000B, 0x00002D2E, 0x00002FE4, 0x00000A2C, 0x000500C5,\n    0x0000000B, 0x00004D6B, 0x00002205, 0x00002D2E, 0x00050051, 0x0000000B,\n    0x000053E9, 0x00002757, 0x00000002, 0x000500C4, 0x0000000B, 0x00002151,\n    0x000053E9, 0x00000A4D, 0x000500C5, 0x0000000B, 0x0000414A, 0x00004D6B,\n    0x00002151, 0x0008004F, 0x00000018, 0x000022A6, 0x00003816, 0x00003816,\n    0x00000000, 0x00000001, 0x00000002, 0x0008000C, 0x00000018, 0x00004CE5,\n    0x00000001, 0x0000002B, 0x000022A6, 0x00000A2D, 0x00000A18, 0x00050085,\n    0x00000018, 0x00001BC7, 0x00004CE5, 0x000008E3, 0x00050081, 0x00000018,\n    0x00001F20, 0x00001BC7, 0x000003AB, 0x0004006D, 0x00000014, 0x00002758,\n    0x00001F20, 0x00050051, 0x0000000B, 0x00002206, 0x00002758, 0x00000000,\n    0x00050051, 0x0000000B, 0x00002FE5, 0x00002758, 0x00000001, 0x000500C4,\n    0x0000000B, 0x00002D2F, 0x00002FE5, 0x00000A2C, 0x000500C5, 0x0000000B,\n    0x00004D6C, 0x00002206, 0x00002D2F, 0x00050051, 0x0000000B, 0x000053EA,\n    0x00002758, 0x00000002, 0x000500C4, 0x0000000B, 0x00002152, 0x000053EA,\n    0x00000A4D, 0x000500C5, 0x0000000B, 0x0000414B, 0x00004D6C, 0x00002152,\n    0x0008004F, 0x00000018, 0x000022A8, 0x00002BB5, 0x00002BB5, 0x00000000,\n    0x00000001, 0x00000002, 0x0008000C, 0x00000018, 0x00004CE6, 0x00000001,\n    0x0000002B, 0x000022A8, 0x00000A2D, 0x00000A18, 0x00050085, 0x00000018,\n    0x00001BC8, 0x00004CE6, 0x000008E3, 0x00050081, 0x00000018, 0x00001F21,\n    0x00001BC8, 0x000003AB, 0x0004006D, 0x00000014, 0x00002759, 0x00001F21,\n    0x00050051, 0x0000000B, 0x00002207, 0x00002759, 0x00000000, 0x00050051,\n    0x0000000B, 0x00002FE6, 0x00002759, 0x00000001, 0x000500C4, 0x0000000B,\n    0x00002D30, 0x00002FE6, 0x00000A2C, 0x000500C5, 0x0000000B, 0x00004D6D,\n    0x00002207, 0x00002D30, 0x00050051, 0x0000000B, 0x000053EB, 0x00002759,\n    0x00000002, 0x000500C4, 0x0000000B, 0x0000215E, 0x000053EB, 0x00000A4D,\n    0x000500C5, 0x0000000B, 0x00005204, 0x00004D6D, 0x0000215E, 0x00070050,\n    0x00000017, 0x000053DF, 0x00004149, 0x0000414A, 0x0000414B, 0x00005204,\n    0x000200F9, 0x00004992, 0x000200F8, 0x000045F2, 0x0008000C, 0x0000001D,\n    0x000022A9, 0x00000001, 0x0000002B, 0x00003A49, 0x00000B7A, 0x00000505,\n    0x00050085, 0x0000001D, 0x00004580, 0x000022A9, 0x00000158, 0x00050081,\n    0x0000001D, 0x00001F22, 0x00004580, 0x00000145, 0x0004006D, 0x00000017,\n    0x0000275A, 0x00001F22, 0x00050051, 0x0000000B, 0x00002208, 0x0000275A,\n    0x00000000, 0x00050051, 0x0000000B, 0x00002FE7, 0x0000275A, 0x00000001,\n    0x000500C4, 0x0000000B, 0x00002D31, 0x00002FE7, 0x00000A29, 0x000500C5,\n    0x0000000B, 0x00004D6E, 0x00002208, 0x00002D31, 0x00050051, 0x0000000B,\n    0x000053EC, 0x0000275A, 0x00000002, 0x000500C4, 0x0000000B, 0x00002170,\n    0x000053EC, 0x00000A47, 0x000500C5, 0x0000000B, 0x00004D6F, 0x00004D6E,\n    0x00002170, 0x00050051, 0x0000000B, 0x000053ED, 0x0000275A, 0x00000003,\n    0x000500C4, 0x0000000B, 0x00001C7C, 0x000053ED, 0x00000A65, 0x000500C5,\n    0x0000000B, 0x0000237C, 0x00004D6F, 0x00001C7C, 0x0008000C, 0x0000001D,\n    0x00002377, 0x00000001, 0x0000002B, 0x00003B57, 0x00000B7A, 0x00000505,\n    0x00050085, 0x0000001D, 0x000060DE, 0x00002377, 0x00000158, 0x00050081,\n    0x0000001D, 0x00001F23, 0x000060DE, 0x00000145, 0x0004006D, 0x00000017,\n    0x0000275B, 0x00001F23, 0x00050051, 0x0000000B, 0x00002209, 0x0000275B,\n    0x00000000, 0x00050051, 0x0000000B, 0x00002FE8, 0x0000275B, 0x00000001,\n    0x000500C4, 0x0000000B, 0x00002D32, 0x00002FE8, 0x00000A29, 0x000500C5,\n    0x0000000B, 0x00004D70, 0x00002209, 0x00002D32, 0x00050051, 0x0000000B,\n    0x000053EE, 0x0000275B, 0x00000002, 0x000500C4, 0x0000000B, 0x00002174,\n    0x000053EE, 0x00000A47, 0x000500C5, 0x0000000B, 0x00004D71, 0x00004D70,\n    0x00002174, 0x00050051, 0x0000000B, 0x000053EF, 0x0000275B, 0x00000003,\n    0x000500C4, 0x0000000B, 0x00001C7D, 0x000053EF, 0x00000A65, 0x000500C5,\n    0x0000000B, 0x0000237D, 0x00004D71, 0x00001C7D, 0x0008000C, 0x0000001D,\n    0x00002378, 0x00000001, 0x0000002B, 0x00003816, 0x00000B7A, 0x00000505,\n    0x00050085, 0x0000001D, 0x000060DF, 0x00002378, 0x00000158, 0x00050081,\n    0x0000001D, 0x00001F24, 0x000060DF, 0x00000145, 0x0004006D, 0x00000017,\n    0x0000275C, 0x00001F24, 0x00050051, 0x0000000B, 0x0000220A, 0x0000275C,\n    0x00000000, 0x00050051, 0x0000000B, 0x00002FE9, 0x0000275C, 0x00000001,\n    0x000500C4, 0x0000000B, 0x00002D33, 0x00002FE9, 0x00000A29, 0x000500C5,\n    0x0000000B, 0x00004D72, 0x0000220A, 0x00002D33, 0x00050051, 0x0000000B,\n    0x000053F0, 0x0000275C, 0x00000002, 0x000500C4, 0x0000000B, 0x00002175,\n    0x000053F0, 0x00000A47, 0x000500C5, 0x0000000B, 0x00004D73, 0x00004D72,\n    0x00002175, 0x00050051, 0x0000000B, 0x000053F1, 0x0000275C, 0x00000003,\n    0x000500C4, 0x0000000B, 0x00001C7E, 0x000053F1, 0x00000A65, 0x000500C5,\n    0x0000000B, 0x0000237E, 0x00004D73, 0x00001C7E, 0x0008000C, 0x0000001D,\n    0x00002379, 0x00000001, 0x0000002B, 0x00002BB5, 0x00000B7A, 0x00000505,\n    0x00050085, 0x0000001D, 0x000060E0, 0x00002379, 0x00000158, 0x00050081,\n    0x0000001D, 0x00001F25, 0x000060E0, 0x00000145, 0x0004006D, 0x00000017,\n    0x0000275D, 0x00001F25, 0x00050051, 0x0000000B, 0x0000220B, 0x0000275D,\n    0x00000000, 0x00050051, 0x0000000B, 0x00002FEA, 0x0000275D, 0x00000001,\n    0x000500C4, 0x0000000B, 0x00002D34, 0x00002FEA, 0x00000A29, 0x000500C5,\n    0x0000000B, 0x00004D74, 0x0000220B, 0x00002D34, 0x00050051, 0x0000000B,\n    0x000053F2, 0x0000275D, 0x00000002, 0x000500C4, 0x0000000B, 0x00002176,\n    0x000053F2, 0x00000A47, 0x000500C5, 0x0000000B, 0x00004D75, 0x00004D74,\n    0x00002176, 0x00050051, 0x0000000B, 0x000053F3, 0x0000275D, 0x00000003,\n    0x000500C4, 0x0000000B, 0x0000215F, 0x000053F3, 0x00000A65, 0x000500C5,\n    0x0000000B, 0x00005205, 0x00004D75, 0x0000215F, 0x00070050, 0x00000017,\n    0x000053E0, 0x0000237C, 0x0000237D, 0x0000237E, 0x00005205, 0x000200F9,\n    0x00004992, 0x000200F8, 0x00004696, 0x0008000C, 0x0000001D, 0x00001C8F,\n    0x00000001, 0x0000002B, 0x00003A49, 0x00000B7A, 0x00000505, 0x0005008E,\n    0x0000001D, 0x00004F73, 0x00001C8F, 0x00000540, 0x00050081, 0x0000001D,\n    0x00002E6B, 0x00004F73, 0x00000145, 0x0004006D, 0x00000017, 0x00001DDC,\n    0x00002E6B, 0x00050051, 0x0000000B, 0x0000220C, 0x00001DDC, 0x00000000,\n    0x00050051, 0x0000000B, 0x00002FEB, 0x00001DDC, 0x00000001, 0x000500C4,\n    0x0000000B, 0x00002D35, 0x00002FEB, 0x00000A23, 0x000500C5, 0x0000000B,\n    0x00004D76, 0x0000220C, 0x00002D35, 0x00050051, 0x0000000B, 0x000053F4,\n    0x00001DDC, 0x00000002, 0x000500C4, 0x0000000B, 0x00002177, 0x000053F4,\n    0x00000A3B, 0x000500C5, 0x0000000B, 0x00004D77, 0x00004D76, 0x00002177,\n    0x00050051, 0x0000000B, 0x000053F5, 0x00001DDC, 0x00000003, 0x000500C4,\n    0x0000000B, 0x00001C7F, 0x000053F5, 0x00000A53, 0x000500C5, 0x0000000B,\n    0x00002427, 0x00004D77, 0x00001C7F, 0x0008000C, 0x0000001D, 0x00001D62,\n    0x00000001, 0x0000002B, 0x00003B57, 0x00000B7A, 0x00000505, 0x0005008E,\n    0x0000001D, 0x00002048, 0x00001D62, 0x00000540, 0x00050081, 0x0000001D,\n    0x00002E6C, 0x00002048, 0x00000145, 0x0004006D, 0x00000017, 0x00001DDD,\n    0x00002E6C, 0x00050051, 0x0000000B, 0x0000220D, 0x00001DDD, 0x00000000,\n    0x00050051, 0x0000000B, 0x00002FEC, 0x00001DDD, 0x00000001, 0x000500C4,\n    0x0000000B, 0x00002D36, 0x00002FEC, 0x00000A23, 0x000500C5, 0x0000000B,\n    0x00004D78, 0x0000220D, 0x00002D36, 0x00050051, 0x0000000B, 0x000053F6,\n    0x00001DDD, 0x00000002, 0x000500C4, 0x0000000B, 0x00002178, 0x000053F6,\n    0x00000A3B, 0x000500C5, 0x0000000B, 0x00004D79, 0x00004D78, 0x00002178,\n    0x00050051, 0x0000000B, 0x000053F7, 0x00001DDD, 0x00000003, 0x000500C4,\n    0x0000000B, 0x00001C80, 0x000053F7, 0x00000A53, 0x000500C5, 0x0000000B,\n    0x00002428, 0x00004D79, 0x00001C80, 0x0008000C, 0x0000001D, 0x00001D63,\n    0x00000001, 0x0000002B, 0x00003816, 0x00000B7A, 0x00000505, 0x0005008E,\n    0x0000001D, 0x00002049, 0x00001D63, 0x00000540, 0x00050081, 0x0000001D,\n    0x00002E6D, 0x00002049, 0x00000145, 0x0004006D, 0x00000017, 0x00001DDE,\n    0x00002E6D, 0x00050051, 0x0000000B, 0x0000220E, 0x00001DDE, 0x00000000,\n    0x00050051, 0x0000000B, 0x00002FED, 0x00001DDE, 0x00000001, 0x000500C4,\n    0x0000000B, 0x00002D37, 0x00002FED, 0x00000A23, 0x000500C5, 0x0000000B,\n    0x00004D7A, 0x0000220E, 0x00002D37, 0x00050051, 0x0000000B, 0x000053F8,\n    0x00001DDE, 0x00000002, 0x000500C4, 0x0000000B, 0x00002179, 0x000053F8,\n    0x00000A3B, 0x000500C5, 0x0000000B, 0x00004D7B, 0x00004D7A, 0x00002179,\n    0x00050051, 0x0000000B, 0x000053F9, 0x00001DDE, 0x00000003, 0x000500C4,\n    0x0000000B, 0x00001C81, 0x000053F9, 0x00000A53, 0x000500C5, 0x0000000B,\n    0x00002429, 0x00004D7B, 0x00001C81, 0x0008000C, 0x0000001D, 0x00001D64,\n    0x00000001, 0x0000002B, 0x00002BB5, 0x00000B7A, 0x00000505, 0x0005008E,\n    0x0000001D, 0x0000204A, 0x00001D64, 0x00000540, 0x00050081, 0x0000001D,\n    0x00002E6E, 0x0000204A, 0x00000145, 0x0004006D, 0x00000017, 0x00001DDF,\n    0x00002E6E, 0x00050051, 0x0000000B, 0x0000220F, 0x00001DDF, 0x00000000,\n    0x00050051, 0x0000000B, 0x00002FEE, 0x00001DDF, 0x00000001, 0x000500C4,\n    0x0000000B, 0x00002D38, 0x00002FEE, 0x00000A23, 0x000500C5, 0x0000000B,\n    0x00004D7C, 0x0000220F, 0x00002D38, 0x00050051, 0x0000000B, 0x000053FA,\n    0x00001DDF, 0x00000002, 0x000500C4, 0x0000000B, 0x0000217A, 0x000053FA,\n    0x00000A3B, 0x000500C5, 0x0000000B, 0x00004D7D, 0x00004D7C, 0x0000217A,\n    0x00050051, 0x0000000B, 0x000053FB, 0x00001DDF, 0x00000003, 0x000500C4,\n    0x0000000B, 0x00002160, 0x000053FB, 0x00000A53, 0x000500C5, 0x0000000B,\n    0x00005206, 0x00004D7D, 0x00002160, 0x00070050, 0x00000017, 0x000053E1,\n    0x00002427, 0x00002428, 0x00002429, 0x00005206, 0x000200F9, 0x00004992,\n    0x000200F8, 0x00002002, 0x00050051, 0x0000000D, 0x0000309E, 0x00003A49,\n    0x00000000, 0x0004007C, 0x0000000B, 0x00005298, 0x0000309E, 0x00050051,\n    0x0000000D, 0x00004F4D, 0x00003B57, 0x00000000, 0x0004007C, 0x0000000B,\n    0x0000451D, 0x00004F4D, 0x00050051, 0x0000000D, 0x00004F4E, 0x00003816,\n    0x00000000, 0x0004007C, 0x0000000B, 0x0000451E, 0x00004F4E, 0x00050051,\n    0x0000000D, 0x00004F38, 0x00002BB5, 0x00000000, 0x0004007C, 0x0000000B,\n    0x00004F16, 0x00004F38, 0x00070050, 0x00000017, 0x00002738, 0x00005298,\n    0x0000451D, 0x0000451E, 0x00004F16, 0x000200F9, 0x00004992, 0x000200F8,\n    0x00004992, 0x001100F5, 0x00000017, 0x00005E7C, 0x00002738, 0x00002002,\n    0x000053E1, 0x00004696, 0x000053E0, 0x000045F2, 0x000053DF, 0x00001935,\n    0x000053DE, 0x00001934, 0x000053DD, 0x00001933, 0x0000612F, 0x00002514,\n    0x000500AA, 0x00000009, 0x000060B1, 0x00001DD8, 0x00000A0A, 0x000300F7,\n    0x000033DC, 0x00000000, 0x000400FA, 0x000060B1, 0x00002CBB, 0x000033DC,\n    0x000200F8, 0x00002CBB, 0x00050051, 0x0000000B, 0x00005E5F, 0x00004AB4,\n    0x00000000, 0x000500AB, 0x00000009, 0x000057C6, 0x00005E5F, 0x00000A0A,\n    0x000200F9, 0x000033DC, 0x000200F8, 0x000033DC, 0x000700F5, 0x00000009,\n    0x00002ACB, 0x000060B1, 0x00004992, 0x000057C6, 0x00002CBB, 0x000300F7,\n    0x00004CC1, 0x00000002, 0x000400FA, 0x00002ACB, 0x00002CF4, 0x00004CC1,\n    0x000200F8, 0x00002CF4, 0x00050051, 0x0000000B, 0x00005C2F, 0x00004AB4,\n    0x00000000, 0x000500AE, 0x00000009, 0x000043C2, 0x00005C2F, 0x00000A10,\n    0x000300F7, 0x00004945, 0x00000000, 0x000400FA, 0x000043C2, 0x00003E05,\n    0x00004945, 0x000200F8, 0x00003E05, 0x000500AE, 0x00000009, 0x00005FD4,\n    0x00005C2F, 0x00000A13, 0x000300F7, 0x00004944, 0x00000000, 0x000400FA,\n    0x00005FD4, 0x00002620, 0x00004944, 0x000200F8, 0x00002620, 0x00050051,\n    0x0000000B, 0x00005002, 0x00005E7C, 0x00000003, 0x00060052, 0x00000017,\n    0x000037FF, 0x00005002, 0x00005E7C, 0x00000002, 0x000200F9, 0x00004944,\n    0x000200F8, 0x00004944, 0x000700F5, 0x00000017, 0x000043E3, 0x00005E7C,\n    0x00003E05, 0x000037FF, 0x00002620, 0x00050051, 0x0000000B, 0x00001B5A,\n    0x000043E3, 0x00000002, 0x00060052, 0x00000017, 0x00003B28, 0x00001B5A,\n    0x000043E3, 0x00000001, 0x000200F9, 0x00004945, 0x000200F8, 0x00004945,\n    0x000700F5, 0x00000017, 0x000043E4, 0x00005E7C, 0x00002CF4, 0x00003B28,\n    0x00004944, 0x00050051, 0x0000000B, 0x00001B5B, 0x000043E4, 0x00000001,\n    0x00060052, 0x00000017, 0x00003B29, 0x00001B5B, 0x000043E4, 0x00000000,\n    0x000200F9, 0x00004CC1, 0x000200F8, 0x00004CC1, 0x000700F5, 0x00000017,\n    0x00002C70, 0x00005E7C, 0x000033DC, 0x00003B29, 0x00004945, 0x00050080,\n    0x00000011, 0x00004DDC, 0x00002EF9, 0x000059EC, 0x000500C2, 0x00000011,\n    0x00005E75, 0x00004DDC, 0x00000740, 0x00050086, 0x00000011, 0x00001E20,\n    0x00005E75, 0x00005C31, 0x00050084, 0x00000011, 0x00004707, 0x00005C31,\n    0x00001E20, 0x00050082, 0x00000011, 0x00004761, 0x00005E75, 0x00004707,\n    0x000500C4, 0x00000011, 0x00002BE0, 0x00001E20, 0x00000740, 0x00050051,\n    0x0000000B, 0x000033E4, 0x00004761, 0x00000000, 0x00050051, 0x0000000B,\n    0x00002A78, 0x00005C31, 0x00000001, 0x00050084, 0x0000000B, 0x00005967,\n    0x000033E4, 0x00002A78, 0x00050051, 0x0000000B, 0x00001B1F, 0x00004761,\n    0x00000001, 0x00050080, 0x0000000B, 0x000028E5, 0x00005967, 0x00001B1F,\n    0x000500C7, 0x00000011, 0x000049AA, 0x00004DDC, 0x000007A3, 0x000500C4,\n    0x0000000B, 0x00002955, 0x000028E5, 0x00000A1F, 0x00050051, 0x0000000B,\n    0x000051B4, 0x000049AA, 0x00000001, 0x000500C4, 0x0000000B, 0x00005C2C,\n    0x000051B4, 0x00000A1C, 0x000500C5, 0x0000000B, 0x00004D7E, 0x00002955,\n    0x00005C2C, 0x00050051, 0x0000000B, 0x000053FC, 0x000049AA, 0x00000000,\n    0x000500C4, 0x0000000B, 0x00002DDB, 0x000053FC, 0x00000A10, 0x000500C5,\n    0x0000000B, 0x00002BB9, 0x00004D7E, 0x00002DDB, 0x000300F7, 0x00005341,\n    0x00000002, 0x000400FA, 0x0000500F, 0x0000294E, 0x0000537D, 0x000200F8,\n    0x0000537D, 0x0004007C, 0x00000012, 0x00002970, 0x00002BE0, 0x00050051,\n    0x0000000C, 0x000045F3, 0x00002970, 0x00000001, 0x000500C3, 0x0000000C,\n    0x00004DC0, 0x000045F3, 0x00000A1A, 0x0004007C, 0x0000000C, 0x0000578C,\n    0x000020FC, 0x00050084, 0x0000000C, 0x00001F02, 0x00004DC0, 0x0000578C,\n    0x00050051, 0x0000000C, 0x00006242, 0x00002970, 0x00000000, 0x000500C3,\n    0x0000000C, 0x00004FC7, 0x00006242, 0x00000A1A, 0x00050080, 0x0000000C,\n    0x000049BB, 0x00001F02, 0x00004FC7, 0x000500C4, 0x0000000C, 0x0000254A,\n    0x000049BB, 0x00000A1D, 0x000500C3, 0x0000000C, 0x0000603B, 0x000045F3,\n    0x00000A0E, 0x000500C7, 0x0000000C, 0x0000539A, 0x0000603B, 0x00000A20,\n    0x000500C4, 0x0000000C, 0x0000534A, 0x0000539A, 0x00000A14, 0x000500C7,\n    0x0000000C, 0x00004EA5, 0x00006242, 0x00000A20, 0x000500C5, 0x0000000C,\n    0x00002B21, 0x0000534A, 0x00004EA5, 0x000500C5, 0x0000000C, 0x000043B6,\n    0x0000254A, 0x00002B21, 0x000500C4, 0x0000000C, 0x00005E63, 0x000043B6,\n    0x00000A10, 0x000500C3, 0x0000000C, 0x000031DE, 0x000045F3, 0x00000A17,\n    0x000500C7, 0x0000000C, 0x00005447, 0x000031DE, 0x00000A0E, 0x000500C3,\n    0x0000000C, 0x000028A6, 0x00006242, 0x00000A14, 0x000500C7, 0x0000000C,\n    0x0000511E, 0x000028A6, 0x00000A14, 0x000500C3, 0x0000000C, 0x000028B9,\n    0x000045F3, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000505E, 0x000028B9,\n    0x00000A0E, 0x000500C4, 0x0000000C, 0x0000541D, 0x0000505E, 0x00000A0E,\n    0x000500C6, 0x0000000C, 0x000022BA, 0x0000511E, 0x0000541D, 0x000500C7,\n    0x0000000C, 0x00005076, 0x000045F3, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x00005228, 0x00005076, 0x00000A17, 0x000500C4, 0x0000000C, 0x00001997,\n    0x000022BA, 0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FE, 0x00005228,\n    0x00001997, 0x000500C4, 0x0000000C, 0x00001C00, 0x00005447, 0x00000A2C,\n    0x000500C5, 0x0000000C, 0x00003C81, 0x000047FE, 0x00001C00, 0x000500C7,\n    0x0000000C, 0x000050AF, 0x00005E63, 0x00000A38, 0x000500C5, 0x0000000C,\n    0x00003C70, 0x00003C81, 0x000050AF, 0x000500C3, 0x0000000C, 0x00003745,\n    0x00005E63, 0x00000A17, 0x000500C7, 0x0000000C, 0x000018B8, 0x00003745,\n    0x00000A0E, 0x000500C4, 0x0000000C, 0x0000547E, 0x000018B8, 0x00000A1A,\n    0x000500C5, 0x0000000C, 0x000045A8, 0x00003C70, 0x0000547E, 0x000500C3,\n    0x0000000C, 0x00003A6E, 0x00005E63, 0x00000A1A, 0x000500C7, 0x0000000C,\n    0x000018B9, 0x00003A6E, 0x00000A20, 0x000500C4, 0x0000000C, 0x0000547F,\n    0x000018B9, 0x00000A23, 0x000500C5, 0x0000000C, 0x0000456F, 0x000045A8,\n    0x0000547F, 0x000500C3, 0x0000000C, 0x00003C88, 0x00005E63, 0x00000A23,\n    0x000500C4, 0x0000000C, 0x00002824, 0x00003C88, 0x00000A2F, 0x000500C5,\n    0x0000000C, 0x00003B79, 0x0000456F, 0x00002824, 0x0004007C, 0x0000000B,\n    0x000041E5, 0x00003B79, 0x000200F9, 0x00005341, 0x000200F8, 0x0000294E,\n    0x00050051, 0x0000000B, 0x00004D9A, 0x00002BE0, 0x00000000, 0x00050051,\n    0x0000000B, 0x00002C03, 0x00002BE0, 0x00000001, 0x00060050, 0x00000014,\n    0x000020DE, 0x00004D9A, 0x00002C03, 0x00005F72, 0x0004007C, 0x00000016,\n    0x00004E9D, 0x000020DE, 0x00050051, 0x0000000C, 0x00002BF7, 0x00004E9D,\n    0x00000002, 0x000500C3, 0x0000000C, 0x00004DC1, 0x00002BF7, 0x00000A11,\n    0x0004007C, 0x0000000C, 0x0000578D, 0x00006273, 0x00050084, 0x0000000C,\n    0x00001F03, 0x00004DC1, 0x0000578D, 0x00050051, 0x0000000C, 0x00006243,\n    0x00004E9D, 0x00000001, 0x000500C3, 0x0000000C, 0x00004A6F, 0x00006243,\n    0x00000A17, 0x00050080, 0x0000000C, 0x00002B2D, 0x00001F03, 0x00004A6F,\n    0x0004007C, 0x0000000C, 0x00004202, 0x000020FC, 0x00050084, 0x0000000C,\n    0x00003A60, 0x00002B2D, 0x00004202, 0x00050051, 0x0000000C, 0x00006244,\n    0x00004E9D, 0x00000000, 0x000500C3, 0x0000000C, 0x00004FC8, 0x00006244,\n    0x00000A1A, 0x00050080, 0x0000000C, 0x000049FC, 0x00003A60, 0x00004FC8,\n    0x000500C4, 0x0000000C, 0x0000225D, 0x000049FC, 0x00000A20, 0x000500C7,\n    0x0000000C, 0x00002CAA, 0x00002BF7, 0x00000A14, 0x000500C4, 0x0000000C,\n    0x00004CAE, 0x00002CAA, 0x00000A1A, 0x000500C3, 0x0000000C, 0x0000383E,\n    0x00006243, 0x00000A0E, 0x000500C7, 0x0000000C, 0x00005374, 0x0000383E,\n    0x00000A14, 0x000500C4, 0x0000000C, 0x000054CA, 0x00005374, 0x00000A14,\n    0x000500C5, 0x0000000C, 0x000042CE, 0x00004CAE, 0x000054CA, 0x000500C7,\n    0x0000000C, 0x000050D5, 0x00006244, 0x00000A20, 0x000500C5, 0x0000000C,\n    0x00003ADD, 0x000042CE, 0x000050D5, 0x000500C5, 0x0000000C, 0x000043B7,\n    0x0000225D, 0x00003ADD, 0x000500C4, 0x0000000C, 0x00005E50, 0x000043B7,\n    0x00000A10, 0x000500C3, 0x0000000C, 0x000032D7, 0x00006243, 0x00000A14,\n    0x000500C6, 0x0000000C, 0x000026C9, 0x000032D7, 0x00004DC1, 0x000500C7,\n    0x0000000C, 0x00004199, 0x000026C9, 0x00000A0E, 0x000500C3, 0x0000000C,\n    0x00002590, 0x00006244, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000505F,\n    0x00002590, 0x00000A14, 0x000500C4, 0x0000000C, 0x0000541E, 0x00004199,\n    0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BB, 0x0000505F, 0x0000541E,\n    0x000500C7, 0x0000000C, 0x00005077, 0x00006243, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x00005229, 0x00005077, 0x00000A17, 0x000500C4, 0x0000000C,\n    0x00001998, 0x000022BB, 0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FF,\n    0x00005229, 0x00001998, 0x000500C4, 0x0000000C, 0x00001C01, 0x00004199,\n    0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C82, 0x000047FF, 0x00001C01,\n    0x000500C7, 0x0000000C, 0x000050B0, 0x00005E50, 0x00000A38, 0x000500C5,\n    0x0000000C, 0x00003C71, 0x00003C82, 0x000050B0, 0x000500C3, 0x0000000C,\n    0x00003746, 0x00005E50, 0x00000A17, 0x000500C7, 0x0000000C, 0x000018BA,\n    0x00003746, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005480, 0x000018BA,\n    0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A9, 0x00003C71, 0x00005480,\n    0x000500C3, 0x0000000C, 0x00003A6F, 0x00005E50, 0x00000A1A, 0x000500C7,\n    0x0000000C, 0x000018BB, 0x00003A6F, 0x00000A20, 0x000500C4, 0x0000000C,\n    0x00005481, 0x000018BB, 0x00000A23, 0x000500C5, 0x0000000C, 0x00004570,\n    0x000045A9, 0x00005481, 0x000500C3, 0x0000000C, 0x00003C89, 0x00005E50,\n    0x00000A23, 0x000500C4, 0x0000000C, 0x00002825, 0x00003C89, 0x00000A2F,\n    0x000500C5, 0x0000000C, 0x00003B7A, 0x00004570, 0x00002825, 0x0004007C,\n    0x0000000B, 0x000041E6, 0x00003B7A, 0x000200F9, 0x00005341, 0x000200F8,\n    0x00005341, 0x000700F5, 0x0000000B, 0x00002522, 0x000041E6, 0x0000294E,\n    0x000041E5, 0x0000537D, 0x00050084, 0x0000000B, 0x000041CB, 0x0000229A,\n    0x00002A78, 0x00050084, 0x0000000B, 0x00002ED9, 0x00002522, 0x000041CB,\n    0x00050080, 0x0000000B, 0x00003E8C, 0x00002ED9, 0x00002BB9, 0x000500C2,\n    0x0000000B, 0x00005183, 0x00003E8C, 0x00000A17, 0x000500AA, 0x00000009,\n    0x00002EEA, 0x00004ADC, 0x00000A0D, 0x000500AA, 0x00000009, 0x00005776,\n    0x00004ADC, 0x00000A10, 0x000500A6, 0x00000009, 0x00005686, 0x00002EEA,\n    0x00005776, 0x000300F7, 0x00003463, 0x00000000, 0x000400FA, 0x00005686,\n    0x00002957, 0x00003463, 0x000200F8, 0x00002957, 0x000500C7, 0x00000017,\n    0x0000475F, 0x00002C70, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D1,\n    0x0000475F, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AC, 0x00002C70,\n    0x0000072E, 0x000500C2, 0x00000017, 0x0000448D, 0x000050AC, 0x0000013D,\n    0x000500C5, 0x00000017, 0x00003FF9, 0x000024D1, 0x0000448D, 0x000200F9,\n    0x00003463, 0x000200F8, 0x00003463, 0x000700F5, 0x00000017, 0x0000587A,\n    0x00002C70, 0x00005341, 0x00003FF9, 0x00002957, 0x000500AA, 0x00000009,\n    0x00004CB6, 0x00004ADC, 0x00000A13, 0x000500A6, 0x00000009, 0x00003B23,\n    0x00005776, 0x00004CB6, 0x000300F7, 0x00002C98, 0x00000000, 0x000400FA,\n    0x00003B23, 0x00002B38, 0x00002C98, 0x000200F8, 0x00002B38, 0x000500C4,\n    0x00000017, 0x00005E17, 0x0000587A, 0x000002ED, 0x000500C2, 0x00000017,\n    0x00003BE7, 0x0000587A, 0x000002ED, 0x000500C5, 0x00000017, 0x000029E8,\n    0x00005E17, 0x00003BE7, 0x000200F9, 0x00002C98, 0x000200F8, 0x00002C98,\n    0x000700F5, 0x00000017, 0x00004D37, 0x0000587A, 0x00003463, 0x000029E8,\n    0x00002B38, 0x00060041, 0x00000294, 0x00001F75, 0x00001592, 0x00000A0B,\n    0x00005183, 0x0003003E, 0x00001F75, 0x00004D37, 0x000200F9, 0x00004C7A,\n    0x000200F8, 0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/resolve_full_64bpp_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25271\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 8 8 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_resolve_edram_info\"\n               OpMemberName %push_const_block_xe 1 \"xe_resolve_coordinate_info\"\n               OpMemberName %push_const_block_xe 2 \"xe_resolve_dest_info\"\n               OpMemberName %push_const_block_xe 3 \"xe_resolve_dest_coordinate_info\"\n               OpMemberName %push_const_block_xe 4 \"xe_resolve_dest_base\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %xe_resolve_edram_xe_block \"xe_resolve_edram_xe_block\"\n               OpMemberName %xe_resolve_edram_xe_block 0 \"data\"\n               OpName %xe_resolve_edram \"xe_resolve_edram\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_resolve_dest_xe_block \"xe_resolve_dest_xe_block\"\n               OpMemberName %xe_resolve_dest_xe_block 0 \"data\"\n               OpName %xe_resolve_dest \"xe_resolve_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpDecorate %_runtimearr_uint ArrayStride 4\n               OpDecorate %xe_resolve_edram_xe_block BufferBlock\n               OpMemberDecorate %xe_resolve_edram_xe_block 0 NonWritable\n               OpMemberDecorate %xe_resolve_edram_xe_block 0 Offset 0\n               OpDecorate %xe_resolve_edram NonWritable\n               OpDecorate %xe_resolve_edram Binding 0\n               OpDecorate %xe_resolve_edram DescriptorSet 0\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_resolve_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_resolve_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_resolve_dest_xe_block 0 Offset 0\n               OpDecorate %xe_resolve_dest NonReadable\n               OpDecorate %xe_resolve_dest Binding 0\n               OpDecorate %xe_resolve_dest DescriptorSet 1\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n     %v3uint = OpTypeVector %uint 3\n     %v4uint = OpTypeVector %uint 4\n      %float = OpTypeFloat 32\n    %v2float = OpTypeVector %float 2\n    %v4float = OpTypeVector %float 4\n       %bool = OpTypeBool\n      %v3int = OpTypeVector %int 3\n    %float_0 = OpConstant %float 0\n    %float_1 = OpConstant %float 1\n     %uint_1 = OpConstant %uint 1\n     %uint_2 = OpConstant %uint 2\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n     %uint_3 = OpConstant %uint 3\n    %uint_16 = OpConstant %uint 16\n     %uint_4 = OpConstant %uint 4\n%float_65535 = OpConstant %float 65535\n  %float_0_5 = OpConstant %float 0.5\n     %int_16 = OpConstant %int 16\n     %uint_0 = OpConstant %uint 0\n    %uint_24 = OpConstant %uint 24\n        %653 = OpConstantComposite %v4uint %uint_0 %uint_8 %uint_16 %uint_24\n   %uint_255 = OpConstant %uint 255\n%float_0_00392156886 = OpConstant %float 0.00392156886\n    %uint_10 = OpConstant %uint 10\n    %uint_20 = OpConstant %uint 20\n    %uint_30 = OpConstant %uint 30\n        %845 = OpConstantComposite %v4uint %uint_0 %uint_10 %uint_20 %uint_30\n  %uint_1023 = OpConstant %uint 1023\n        %635 = OpConstantComposite %v4uint %uint_1023 %uint_1023 %uint_1023 %uint_3\n%float_0_000977517106 = OpConstant %float 0.000977517106\n%float_0_333333343 = OpConstant %float 0.333333343\n       %2798 = OpConstantComposite %v4float %float_0_000977517106 %float_0_000977517106 %float_0_000977517106 %float_0_333333343\n       %2996 = OpConstantComposite %v3uint %uint_0 %uint_10 %uint_20\n   %uint_127 = OpConstant %uint 127\n     %uint_7 = OpConstant %uint 7\n     %v3bool = OpTypeVector %bool 3\n   %uint_124 = OpConstant %uint 124\n    %uint_23 = OpConstant %uint 23\n    %v3float = OpTypeVector %float 3\n   %float_n1 = OpConstant %float -1\n      %int_0 = OpConstant %int 0\n       %1959 = OpConstantComposite %v2int %int_16 %int_0\n%float_0_000976592302 = OpConstant %float 0.000976592302\n      %v4int = OpTypeVector %int 4\n        %290 = OpConstantComposite %v4int %int_16 %int_0 %int_16 %int_0\n       %1837 = OpConstantComposite %v2uint %uint_2 %uint_1\n     %v2bool = OpTypeVector %bool 2\n       %1807 = OpConstantComposite %v2uint %uint_0 %uint_0\n       %1828 = OpConstantComposite %v2uint %uint_1 %uint_1\n       %1816 = OpConstantComposite %v2uint %uint_1 %uint_0\n    %uint_80 = OpConstant %uint 80\n       %2719 = OpConstantComposite %v2uint %uint_80 %uint_16\n      %int_2 = OpConstant %int 2\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n      %int_3 = OpConstant %int 3\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n    %uint_13 = OpConstant %uint 13\n  %uint_2047 = OpConstant %uint 2047\n    %uint_15 = OpConstant %uint 15\n    %uint_28 = OpConstant %uint 28\n       %1855 = OpConstantComposite %v2uint %uint_0 %uint_4\n     %uint_5 = OpConstant %uint 5\n     %int_10 = OpConstant %int 10\n    %uint_63 = OpConstant %uint 63\n     %int_26 = OpConstant %int 26\n     %int_23 = OpConstant %int 23\n%uint_16777216 = OpConstant %uint 16777216\n       %2275 = OpConstantComposite %v2uint %uint_20 %uint_24\n      %false = OpConstantFalse %bool\n%_runtimearr_uint = OpTypeRuntimeArray %uint\n%xe_resolve_edram_xe_block = OpTypeStruct %_runtimearr_uint\n%_ptr_Uniform_xe_resolve_edram_xe_block = OpTypePointer Uniform %xe_resolve_edram_xe_block\n%xe_resolve_edram = OpVariable %_ptr_Uniform_xe_resolve_edram_xe_block Uniform\n%_ptr_Uniform_uint = OpTypePointer Uniform %uint\n   %uint_320 = OpConstant %uint 320\n     %uint_6 = OpConstant %uint 6\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %1825 = OpConstantComposite %v2uint %uint_2 %uint_0\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_resolve_dest_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_resolve_dest_xe_block = OpTypePointer Uniform %xe_resolve_dest_xe_block\n%xe_resolve_dest = OpVariable %_ptr_Uniform_xe_resolve_dest_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_8 %uint_8 %uint_1\n       %1954 = OpConstantComposite %v2uint %uint_15 %uint_1\n       %1870 = OpConstantComposite %v2uint %uint_3 %uint_3\n       %2122 = OpConstantComposite %v2uint %uint_15 %uint_15\n       %1284 = OpConstantComposite %v4float %float_n1 %float_n1 %float_n1 %float_n1\n        %770 = OpConstantComposite %v4int %int_16 %int_16 %int_16 %int_16\n       %1611 = OpConstantComposite %v4uint %uint_255 %uint_255 %uint_255 %uint_255\n        %261 = OpConstantComposite %v3uint %uint_1023 %uint_1023 %uint_1023\n       %1126 = OpConstantComposite %v3uint %uint_127 %uint_127 %uint_127\n       %2828 = OpConstantComposite %v3uint %uint_7 %uint_7 %uint_7\n       %2578 = OpConstantComposite %v3uint %uint_0 %uint_0 %uint_0\n       %1018 = OpConstantComposite %v3uint %uint_124 %uint_124 %uint_124\n        %393 = OpConstantComposite %v3uint %uint_23 %uint_23 %uint_23\n        %141 = OpConstantComposite %v3uint %uint_16 %uint_16 %uint_16\n         %73 = OpConstantComposite %v2float %float_n1 %float_n1\n       %2151 = OpConstantComposite %v2int %int_16 %int_16\n       %2938 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0\n       %1285 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1\n        %325 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_0_5\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n%int_1065353216 = OpConstant %int 1065353216\n  %uint_1280 = OpConstant %uint 1280\n%uint_2621440 = OpConstant %uint 2621440\n%uint_4294967290 = OpConstant %uint 4294967290\n       %2360 = OpConstantComposite %v3uint %uint_4294967290 %uint_4294967290 %uint_4294967290\n   %uint_336 = OpConstant %uint 336\n %float_0_25 = OpConstant %float 0.25\n    %uint_32 = OpConstant %uint 32\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %22245 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %15627 = OpLoad %uint %22245\n      %22700 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %20824 = OpLoad %uint %22700\n      %20561 = OpBitwiseAnd %uint %15627 %uint_1023\n      %19978 = OpShiftRightLogical %uint %15627 %uint_10\n       %8574 = OpBitwiseAnd %uint %19978 %uint_3\n      %21002 = OpShiftRightLogical %uint %15627 %uint_13\n       %8575 = OpBitwiseAnd %uint %21002 %uint_2047\n      %21003 = OpShiftRightLogical %uint %15627 %uint_24\n       %8576 = OpBitwiseAnd %uint %21003 %uint_15\n      %18836 = OpShiftRightLogical %uint %15627 %uint_28\n       %9130 = OpBitwiseAnd %uint %18836 %uint_1\n       %8871 = OpCompositeConstruct %v2uint %20824 %20824\n       %9576 = OpShiftRightLogical %v2uint %8871 %1855\n      %23379 = OpBitwiseAnd %v2uint %9576 %1954\n      %16207 = OpShiftLeftLogical %v2uint %23379 %1870\n      %23019 = OpIMul %v2uint %16207 %1828\n      %12819 = OpShiftRightLogical %uint %20824 %uint_5\n      %16204 = OpBitwiseAnd %uint %12819 %uint_2047\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %24236 = OpLoad %uint %18732\n      %22701 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %20919 = OpLoad %uint %22701\n      %19164 = OpBitwiseAnd %uint %24236 %uint_7\n      %21999 = OpBitwiseAnd %uint %24236 %uint_8\n      %20495 = OpINotEqual %bool %21999 %uint_0\n      %10307 = OpShiftRightLogical %uint %24236 %uint_4\n      %24434 = OpBitwiseAnd %uint %10307 %uint_7\n      %19672 = OpShiftRightLogical %uint %24236 %uint_7\n      %20627 = OpBitwiseAnd %uint %19672 %uint_63\n      %22920 = OpBitcast %int %24236\n      %13711 = OpShiftLeftLogical %int %22920 %int_10\n      %20636 = OpShiftRightArithmetic %int %13711 %int_26\n      %18178 = OpShiftLeftLogical %int %20636 %int_23\n       %7462 = OpIAdd %int %18178 %int_1065353216\n      %11052 = OpBitcast %float %7462\n      %22649 = OpBitwiseAnd %uint %24236 %uint_16777216\n       %7475 = OpINotEqual %bool %22649 %uint_0\n       %8444 = OpBitwiseAnd %uint %20919 %uint_1023\n      %12176 = OpShiftRightLogical %uint %20919 %uint_10\n      %25038 = OpBitwiseAnd %uint %12176 %uint_1023\n      %25203 = OpShiftLeftLogical %uint %25038 %int_1\n      %10422 = OpCompositeConstruct %v2uint %20919 %20919\n      %10385 = OpShiftRightLogical %v2uint %10422 %2275\n      %23380 = OpBitwiseAnd %v2uint %10385 %2122\n      %16208 = OpShiftLeftLogical %v2uint %23380 %1870\n      %23020 = OpIMul %v2uint %16208 %1828\n      %12820 = OpShiftRightLogical %uint %20919 %uint_28\n      %16205 = OpBitwiseAnd %uint %12820 %uint_7\n      %18656 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_4\n      %25270 = OpLoad %uint %18656\n      %14159 = OpLoad %v3uint %gl_GlobalInvocationID\n      %12672 = OpVectorShuffle %v2uint %14159 %14159 0 1\n      %12025 = OpShiftLeftLogical %v2uint %12672 %1825\n       %7640 = OpCompositeExtract %uint %12025 0\n      %11658 = OpShiftLeftLogical %uint %16204 %uint_3\n      %15379 = OpUGreaterThanEqual %bool %7640 %11658\n               OpSelectionMerge %12755 DontFlatten\n               OpBranchConditional %15379 %21992 %12755\n      %21992 = OpLabel\n               OpBranch %19578\n      %12755 = OpLabel\n       %7340 = OpCompositeExtract %uint %12025 1\n       %7992 = OpExtInst %uint %1 UMax %7340 %uint_0\n      %20975 = OpCompositeConstruct %v2uint %7640 %7992\n      %21036 = OpIAdd %v2uint %20975 %23019\n      %16075 = OpULessThanEqual %bool %16205 %uint_3\n               OpSelectionMerge %23776 None\n               OpBranchConditional %16075 %10990 %15087\n      %15087 = OpLabel\n      %13566 = OpIEqual %bool %16205 %uint_5\n       %8438 = OpSelect %uint %13566 %uint_2 %uint_0\n               OpBranch %23776\n      %10990 = OpLabel\n               OpBranch %23776\n      %23776 = OpLabel\n      %19300 = OpPhi %uint %16205 %10990 %8438 %15087\n      %16830 = OpCompositeConstruct %v2uint %8574 %8574\n      %11801 = OpUGreaterThanEqual %v2bool %16830 %1837\n      %19381 = OpSelect %v2uint %11801 %1828 %1807\n      %10986 = OpShiftLeftLogical %v2uint %21036 %19381\n      %24669 = OpCompositeConstruct %v2uint %19300 %19300\n       %9093 = OpShiftRightLogical %v2uint %24669 %1816\n      %15084 = OpBitwiseAnd %v2uint %9093 %1828\n      %10197 = OpIAdd %v2uint %10986 %15084\n       %8548 = OpCompositeConstruct %v2uint %9130 %uint_0\n       %9802 = OpShiftRightLogical %v2uint %2719 %8548\n      %10146 = OpUDiv %v2uint %10197 %9802\n      %20390 = OpCompositeExtract %uint %10146 1\n      %11046 = OpIMul %uint %20390 %20561\n      %24665 = OpCompositeExtract %uint %10146 0\n      %21536 = OpIAdd %uint %11046 %24665\n       %8742 = OpIAdd %uint %8575 %21536\n      %23345 = OpIMul %v2uint %10146 %9802\n      %11892 = OpISub %v2uint %10197 %23345\n       %8053 = OpIMul %uint %8742 %uint_1280\n      %24263 = OpCompositeExtract %uint %11892 1\n      %23526 = OpCompositeExtract %uint %9802 0\n      %22886 = OpIMul %uint %24263 %23526\n       %6886 = OpCompositeExtract %uint %11892 0\n       %9696 = OpIAdd %uint %22886 %6886\n      %18116 = OpShiftLeftLogical %uint %9696 %9130\n      %18619 = OpIAdd %uint %8053 %18116\n      %19545 = OpUMod %uint %18619 %uint_2621440\n      %23531 = OpShiftLeftLogical %uint %19545 %int_2\n      %13906 = OpUGreaterThanEqual %bool %8574 %uint_2\n      %11277 = OpSelect %uint %13906 %uint_1 %uint_0\n      %20074 = OpIAdd %uint %9130 %11277\n       %6555 = OpShiftLeftLogical %uint %uint_4 %20074\n      %23279 = OpINotEqual %bool %9130 %uint_0\n               OpSelectionMerge %21263 DontFlatten\n               OpBranchConditional %23279 %15205 %16569\n      %16569 = OpLabel\n      %19162 = OpIEqual %bool %6555 %uint_4\n               OpSelectionMerge %20297 DontFlatten\n               OpBranchConditional %19162 %6591 %8959\n       %8959 = OpLabel\n      %22064 = OpShiftRightLogical %uint %23531 %int_2\n      %13369 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22064\n      %15060 = OpLoad %uint %13369\n       %8517 = OpIAdd %uint %23531 %6555\n      %21670 = OpShiftRightLogical %uint %8517 %int_2\n      %19677 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21670\n      %13114 = OpLoad %uint %19677\n       %8685 = OpIMul %uint %uint_2 %6555\n      %24254 = OpIAdd %uint %23531 %8685\n      %17890 = OpShiftRightLogical %uint %24254 %int_2\n      %19678 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17890\n      %13115 = OpLoad %uint %19678\n       %8686 = OpIMul %uint %uint_3 %6555\n      %24255 = OpIAdd %uint %23531 %8686\n      %17891 = OpShiftRightLogical %uint %24255 %int_2\n      %18689 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17891\n      %24409 = OpLoad %uint %18689\n      %20780 = OpCompositeConstruct %v4uint %15060 %13114 %13115 %24409\n               OpBranch %20297\n       %6591 = OpLabel\n      %24486 = OpShiftRightLogical %uint %23531 %int_2\n      %13370 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24486\n      %12609 = OpLoad %uint %13370\n      %11687 = OpIAdd %uint %24486 %uint_1\n       %6399 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11687\n      %23650 = OpLoad %uint %6399\n      %11688 = OpIAdd %uint %24486 %uint_2\n       %6400 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11688\n      %23651 = OpLoad %uint %6400\n      %11689 = OpIAdd %uint %24486 %uint_3\n      %24558 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11689\n      %16379 = OpLoad %uint %24558\n      %20781 = OpCompositeConstruct %v4uint %12609 %23650 %23651 %16379\n               OpBranch %20297\n      %20297 = OpLabel\n      %10943 = OpPhi %v4uint %20781 %6591 %20780 %8959\n               OpSelectionMerge %16224 None\n               OpSwitch %8576 %19451 0 %14585 1 %14585 2 %7355 10 %7355 3 %7354 12 %7354 4 %8190 6 %8243\n       %8243 = OpLabel\n      %24406 = OpCompositeExtract %uint %10943 0\n      %24679 = OpExtInst %v2float %1 UnpackHalf2x16 %24406\n      %10082 = OpCompositeExtract %float %24679 0\n      %17478 = OpCompositeExtract %float %24679 1\n      %14604 = OpCompositeConstruct %v4float %10082 %17478 %float_0 %float_0\n      %17274 = OpCompositeExtract %uint %10943 1\n      %18027 = OpExtInst %v2float %1 UnpackHalf2x16 %17274\n      %10083 = OpCompositeExtract %float %18027 0\n      %17479 = OpCompositeExtract %float %18027 1\n      %14605 = OpCompositeConstruct %v4float %10083 %17479 %float_0 %float_0\n      %17275 = OpCompositeExtract %uint %10943 2\n      %18028 = OpExtInst %v2float %1 UnpackHalf2x16 %17275\n      %10084 = OpCompositeExtract %float %18028 0\n      %17480 = OpCompositeExtract %float %18028 1\n      %14606 = OpCompositeConstruct %v4float %10084 %17480 %float_0 %float_0\n      %17276 = OpCompositeExtract %uint %10943 3\n      %18029 = OpExtInst %v2float %1 UnpackHalf2x16 %17276\n      %10085 = OpCompositeExtract %float %18029 0\n      %20670 = OpCompositeExtract %float %18029 1\n       %9033 = OpCompositeConstruct %v4float %10085 %20670 %float_0 %float_0\n               OpBranch %16224\n       %8190 = OpLabel\n      %12427 = OpCompositeExtract %uint %10943 0\n      %22685 = OpBitcast %int %12427\n      %18202 = OpCompositeConstruct %v2int %22685 %22685\n      %18349 = OpShiftLeftLogical %v2int %18202 %1959\n      %13335 = OpShiftRightArithmetic %v2int %18349 %2151\n      %10903 = OpConvertSToF %v2float %13335\n      %18247 = OpVectorTimesScalar %v2float %10903 %float_0_000976592302\n      %24070 = OpExtInst %v2float %1 FMax %73 %18247\n      %24330 = OpCompositeExtract %float %24070 0\n      %15572 = OpCompositeExtract %float %24070 1\n      %16670 = OpCompositeConstruct %v4float %24330 %15572 %float_0 %float_0\n      %19522 = OpCompositeExtract %uint %10943 1\n      %16033 = OpBitcast %int %19522\n      %18203 = OpCompositeConstruct %v2int %16033 %16033\n      %18350 = OpShiftLeftLogical %v2int %18203 %1959\n      %13336 = OpShiftRightArithmetic %v2int %18350 %2151\n      %10904 = OpConvertSToF %v2float %13336\n      %18248 = OpVectorTimesScalar %v2float %10904 %float_0_000976592302\n      %24071 = OpExtInst %v2float %1 FMax %73 %18248\n      %24331 = OpCompositeExtract %float %24071 0\n      %15573 = OpCompositeExtract %float %24071 1\n      %16671 = OpCompositeConstruct %v4float %24331 %15573 %float_0 %float_0\n      %19523 = OpCompositeExtract %uint %10943 2\n      %16034 = OpBitcast %int %19523\n      %18204 = OpCompositeConstruct %v2int %16034 %16034\n      %18351 = OpShiftLeftLogical %v2int %18204 %1959\n      %13337 = OpShiftRightArithmetic %v2int %18351 %2151\n      %10905 = OpConvertSToF %v2float %13337\n      %18249 = OpVectorTimesScalar %v2float %10905 %float_0_000976592302\n      %24072 = OpExtInst %v2float %1 FMax %73 %18249\n      %24332 = OpCompositeExtract %float %24072 0\n      %15574 = OpCompositeExtract %float %24072 1\n      %16672 = OpCompositeConstruct %v4float %24332 %15574 %float_0 %float_0\n      %19524 = OpCompositeExtract %uint %10943 3\n      %16035 = OpBitcast %int %19524\n      %18205 = OpCompositeConstruct %v2int %16035 %16035\n      %18352 = OpShiftLeftLogical %v2int %18205 %1959\n      %13338 = OpShiftRightArithmetic %v2int %18352 %2151\n      %10906 = OpConvertSToF %v2float %13338\n      %18250 = OpVectorTimesScalar %v2float %10906 %float_0_000976592302\n      %24073 = OpExtInst %v2float %1 FMax %73 %18250\n      %24333 = OpCompositeExtract %float %24073 0\n      %18764 = OpCompositeExtract %float %24073 1\n       %9034 = OpCompositeConstruct %v4float %24333 %18764 %float_0 %float_0\n               OpBranch %16224\n       %7354 = OpLabel\n      %22205 = OpCompositeExtract %uint %10943 0\n      %20234 = OpCompositeConstruct %v3uint %22205 %22205 %22205\n      %11021 = OpShiftRightLogical %v3uint %20234 %2996\n      %24038 = OpBitwiseAnd %v3uint %11021 %261\n      %18588 = OpBitwiseAnd %v3uint %11021 %1126\n      %23440 = OpShiftRightLogical %v3uint %24038 %2828\n      %16585 = OpIEqual %v3bool %23440 %2578\n      %11339 = OpExtInst %v3int %1 FindUMsb %18588\n      %10773 = OpBitcast %v3uint %11339\n       %6266 = OpISub %v3uint %2828 %10773\n       %8720 = OpIAdd %v3uint %10773 %2360\n      %10351 = OpSelect %v3uint %16585 %8720 %23440\n      %23252 = OpShiftLeftLogical %v3uint %18588 %6266\n      %18842 = OpBitwiseAnd %v3uint %23252 %1126\n      %10909 = OpSelect %v3uint %16585 %18842 %18588\n      %24569 = OpIAdd %v3uint %10351 %1018\n      %20351 = OpShiftLeftLogical %v3uint %24569 %393\n      %16294 = OpShiftLeftLogical %v3uint %10909 %141\n      %22396 = OpBitwiseOr %v3uint %20351 %16294\n      %13824 = OpIEqual %v3bool %24038 %2578\n      %16962 = OpSelect %v3uint %13824 %2578 %22396\n      %10703 = OpBitcast %v3float %16962\n      %19364 = OpShiftRightLogical %uint %22205 %uint_30\n      %18446 = OpConvertUToF %float %19364\n      %15903 = OpFMul %float %18446 %float_0_333333343\n      %21442 = OpCompositeExtract %float %10703 0\n      %10837 = OpCompositeExtract %float %10703 1\n       %7833 = OpCompositeExtract %float %10703 2\n      %15834 = OpCompositeConstruct %v4float %21442 %10837 %7833 %15903\n      %10229 = OpCompositeExtract %uint %10943 1\n      %13582 = OpCompositeConstruct %v3uint %10229 %10229 %10229\n      %11022 = OpShiftRightLogical %v3uint %13582 %2996\n      %24039 = OpBitwiseAnd %v3uint %11022 %261\n      %18589 = OpBitwiseAnd %v3uint %11022 %1126\n      %23441 = OpShiftRightLogical %v3uint %24039 %2828\n      %16586 = OpIEqual %v3bool %23441 %2578\n      %11340 = OpExtInst %v3int %1 FindUMsb %18589\n      %10774 = OpBitcast %v3uint %11340\n       %6267 = OpISub %v3uint %2828 %10774\n       %8721 = OpIAdd %v3uint %10774 %2360\n      %10352 = OpSelect %v3uint %16586 %8721 %23441\n      %23253 = OpShiftLeftLogical %v3uint %18589 %6267\n      %18843 = OpBitwiseAnd %v3uint %23253 %1126\n      %10910 = OpSelect %v3uint %16586 %18843 %18589\n      %24570 = OpIAdd %v3uint %10352 %1018\n      %20352 = OpShiftLeftLogical %v3uint %24570 %393\n      %16295 = OpShiftLeftLogical %v3uint %10910 %141\n      %22397 = OpBitwiseOr %v3uint %20352 %16295\n      %13825 = OpIEqual %v3bool %24039 %2578\n      %16963 = OpSelect %v3uint %13825 %2578 %22397\n      %10704 = OpBitcast %v3float %16963\n      %19365 = OpShiftRightLogical %uint %10229 %uint_30\n      %18447 = OpConvertUToF %float %19365\n      %15904 = OpFMul %float %18447 %float_0_333333343\n      %21443 = OpCompositeExtract %float %10704 0\n      %10838 = OpCompositeExtract %float %10704 1\n       %7834 = OpCompositeExtract %float %10704 2\n      %15835 = OpCompositeConstruct %v4float %21443 %10838 %7834 %15904\n      %10230 = OpCompositeExtract %uint %10943 2\n      %13583 = OpCompositeConstruct %v3uint %10230 %10230 %10230\n      %11023 = OpShiftRightLogical %v3uint %13583 %2996\n      %24040 = OpBitwiseAnd %v3uint %11023 %261\n      %18590 = OpBitwiseAnd %v3uint %11023 %1126\n      %23442 = OpShiftRightLogical %v3uint %24040 %2828\n      %16587 = OpIEqual %v3bool %23442 %2578\n      %11341 = OpExtInst %v3int %1 FindUMsb %18590\n      %10775 = OpBitcast %v3uint %11341\n       %6268 = OpISub %v3uint %2828 %10775\n       %8722 = OpIAdd %v3uint %10775 %2360\n      %10353 = OpSelect %v3uint %16587 %8722 %23442\n      %23254 = OpShiftLeftLogical %v3uint %18590 %6268\n      %18844 = OpBitwiseAnd %v3uint %23254 %1126\n      %10911 = OpSelect %v3uint %16587 %18844 %18590\n      %24571 = OpIAdd %v3uint %10353 %1018\n      %20353 = OpShiftLeftLogical %v3uint %24571 %393\n      %16296 = OpShiftLeftLogical %v3uint %10911 %141\n      %22398 = OpBitwiseOr %v3uint %20353 %16296\n      %13826 = OpIEqual %v3bool %24040 %2578\n      %16964 = OpSelect %v3uint %13826 %2578 %22398\n      %10705 = OpBitcast %v3float %16964\n      %19366 = OpShiftRightLogical %uint %10230 %uint_30\n      %18448 = OpConvertUToF %float %19366\n      %15905 = OpFMul %float %18448 %float_0_333333343\n      %21444 = OpCompositeExtract %float %10705 0\n      %10839 = OpCompositeExtract %float %10705 1\n       %7835 = OpCompositeExtract %float %10705 2\n      %15836 = OpCompositeConstruct %v4float %21444 %10839 %7835 %15905\n      %10231 = OpCompositeExtract %uint %10943 3\n      %13584 = OpCompositeConstruct %v3uint %10231 %10231 %10231\n      %11024 = OpShiftRightLogical %v3uint %13584 %2996\n      %24041 = OpBitwiseAnd %v3uint %11024 %261\n      %18591 = OpBitwiseAnd %v3uint %11024 %1126\n      %23443 = OpShiftRightLogical %v3uint %24041 %2828\n      %16588 = OpIEqual %v3bool %23443 %2578\n      %11342 = OpExtInst %v3int %1 FindUMsb %18591\n      %10776 = OpBitcast %v3uint %11342\n       %6269 = OpISub %v3uint %2828 %10776\n       %8723 = OpIAdd %v3uint %10776 %2360\n      %10354 = OpSelect %v3uint %16588 %8723 %23443\n      %23255 = OpShiftLeftLogical %v3uint %18591 %6269\n      %18845 = OpBitwiseAnd %v3uint %23255 %1126\n      %10912 = OpSelect %v3uint %16588 %18845 %18591\n      %24572 = OpIAdd %v3uint %10354 %1018\n      %20354 = OpShiftLeftLogical %v3uint %24572 %393\n      %16297 = OpShiftLeftLogical %v3uint %10912 %141\n      %22399 = OpBitwiseOr %v3uint %20354 %16297\n      %13827 = OpIEqual %v3bool %24041 %2578\n      %16965 = OpSelect %v3uint %13827 %2578 %22399\n      %10706 = OpBitcast %v3float %16965\n      %19367 = OpShiftRightLogical %uint %10231 %uint_30\n      %18449 = OpConvertUToF %float %19367\n      %15906 = OpFMul %float %18449 %float_0_333333343\n      %21445 = OpCompositeExtract %float %10706 0\n      %10840 = OpCompositeExtract %float %10706 1\n      %11025 = OpCompositeExtract %float %10706 2\n       %9035 = OpCompositeConstruct %v4float %21445 %10840 %11025 %15906\n               OpBranch %16224\n       %7355 = OpLabel\n      %22206 = OpCompositeExtract %uint %10943 0\n      %20235 = OpCompositeConstruct %v4uint %22206 %22206 %22206 %22206\n       %9368 = OpShiftRightLogical %v4uint %20235 %845\n      %18859 = OpBitwiseAnd %v4uint %9368 %635\n      %15543 = OpConvertUToF %v4float %18859\n      %16688 = OpFMul %v4float %15543 %2798\n      %23762 = OpCompositeExtract %uint %10943 1\n      %20813 = OpCompositeConstruct %v4uint %23762 %23762 %23762 %23762\n       %9369 = OpShiftRightLogical %v4uint %20813 %845\n      %18860 = OpBitwiseAnd %v4uint %9369 %635\n      %15544 = OpConvertUToF %v4float %18860\n      %16689 = OpFMul %v4float %15544 %2798\n      %23763 = OpCompositeExtract %uint %10943 2\n      %20814 = OpCompositeConstruct %v4uint %23763 %23763 %23763 %23763\n       %9370 = OpShiftRightLogical %v4uint %20814 %845\n      %18861 = OpBitwiseAnd %v4uint %9370 %635\n      %15545 = OpConvertUToF %v4float %18861\n      %16690 = OpFMul %v4float %15545 %2798\n      %23764 = OpCompositeExtract %uint %10943 3\n      %20815 = OpCompositeConstruct %v4uint %23764 %23764 %23764 %23764\n       %9371 = OpShiftRightLogical %v4uint %20815 %845\n      %18862 = OpBitwiseAnd %v4uint %9371 %635\n      %18735 = OpConvertUToF %v4float %18862\n       %9887 = OpFMul %v4float %18735 %2798\n               OpBranch %16224\n      %14585 = OpLabel\n      %22207 = OpCompositeExtract %uint %10943 0\n      %20236 = OpCompositeConstruct %v4uint %22207 %22207 %22207 %22207\n       %9372 = OpShiftRightLogical %v4uint %20236 %653\n      %19030 = OpBitwiseAnd %v4uint %9372 %1611\n      %13986 = OpConvertUToF %v4float %19030\n      %19235 = OpVectorTimesScalar %v4float %13986 %float_0_00392156886\n       %8607 = OpCompositeExtract %uint %10943 1\n      %24843 = OpCompositeConstruct %v4uint %8607 %8607 %8607 %8607\n       %9373 = OpShiftRightLogical %v4uint %24843 %653\n      %19031 = OpBitwiseAnd %v4uint %9373 %1611\n      %13987 = OpConvertUToF %v4float %19031\n      %19236 = OpVectorTimesScalar %v4float %13987 %float_0_00392156886\n       %8608 = OpCompositeExtract %uint %10943 2\n      %24844 = OpCompositeConstruct %v4uint %8608 %8608 %8608 %8608\n       %9374 = OpShiftRightLogical %v4uint %24844 %653\n      %19032 = OpBitwiseAnd %v4uint %9374 %1611\n      %13988 = OpConvertUToF %v4float %19032\n      %19237 = OpVectorTimesScalar %v4float %13988 %float_0_00392156886\n       %8609 = OpCompositeExtract %uint %10943 3\n      %24845 = OpCompositeConstruct %v4uint %8609 %8609 %8609 %8609\n       %9375 = OpShiftRightLogical %v4uint %24845 %653\n      %19033 = OpBitwiseAnd %v4uint %9375 %1611\n      %17178 = OpConvertUToF %v4float %19033\n      %12434 = OpVectorTimesScalar %v4float %17178 %float_0_00392156886\n               OpBranch %16224\n      %19451 = OpLabel\n      %12428 = OpCompositeExtract %uint %10943 0\n      %20462 = OpBitcast %float %12428\n      %17206 = OpCompositeConstruct %v2float %20462 %float_0\n      %11664 = OpVectorShuffle %v4float %17206 %17206 0 1 1 1\n      %22193 = OpCompositeExtract %uint %10943 1\n      %16232 = OpBitcast %float %22193\n      %17207 = OpCompositeConstruct %v2float %16232 %float_0\n      %11665 = OpVectorShuffle %v4float %17207 %17207 0 1 1 1\n      %22194 = OpCompositeExtract %uint %10943 2\n      %16233 = OpBitcast %float %22194\n      %17208 = OpCompositeConstruct %v2float %16233 %float_0\n      %11666 = OpVectorShuffle %v4float %17208 %17208 0 1 1 1\n      %22195 = OpCompositeExtract %uint %10943 3\n      %16234 = OpBitcast %float %22195\n      %20398 = OpCompositeConstruct %v2float %16234 %float_0\n      %23098 = OpVectorShuffle %v4float %20398 %20398 0 1 1 1\n               OpBranch %16224\n      %16224 = OpLabel\n      %11175 = OpPhi %v4float %23098 %19451 %12434 %14585 %9887 %7355 %9035 %7354 %9034 %8190 %9033 %8243\n      %14344 = OpPhi %v4float %11666 %19451 %19237 %14585 %16690 %7355 %15836 %7354 %16672 %8190 %14606 %8243\n      %15229 = OpPhi %v4float %11665 %19451 %19236 %14585 %16689 %7355 %15835 %7354 %16671 %8190 %14605 %8243\n      %14518 = OpPhi %v4float %11664 %19451 %19235 %14585 %16688 %7355 %15834 %7354 %16670 %8190 %14604 %8243\n               OpBranch %21263\n      %15205 = OpLabel\n      %21584 = OpIEqual %bool %6555 %uint_8\n               OpSelectionMerge %20259 DontFlatten\n               OpBranchConditional %21584 %6592 %8960\n       %8960 = OpLabel\n      %22065 = OpShiftRightLogical %uint %23531 %int_2\n      %13371 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22065\n      %12610 = OpLoad %uint %13371\n      %11690 = OpIAdd %uint %22065 %uint_1\n       %6401 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11690\n       %7030 = OpLoad %uint %6401\n       %8518 = OpIAdd %uint %23531 %6555\n      %21671 = OpShiftRightLogical %uint %8518 %int_2\n      %19601 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21671\n      %12611 = OpLoad %uint %19601\n      %11691 = OpIAdd %uint %21671 %uint_1\n      %24559 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11691\n      %14156 = OpLoad %uint %24559\n      %19670 = OpCompositeConstruct %v4uint %12610 %7030 %12611 %14156\n      %19499 = OpIMul %uint %uint_2 %6555\n      %10821 = OpIAdd %uint %23531 %19499\n      %17892 = OpShiftRightLogical %uint %10821 %int_2\n      %19602 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17892\n      %12612 = OpLoad %uint %19602\n      %11692 = OpIAdd %uint %17892 %uint_1\n       %6475 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11692\n      %24155 = OpLoad %uint %6475\n       %8687 = OpIMul %uint %uint_3 %6555\n      %24256 = OpIAdd %uint %23531 %8687\n      %17893 = OpShiftRightLogical %uint %24256 %int_2\n      %19603 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17893\n      %12613 = OpLoad %uint %19603\n      %11693 = OpIAdd %uint %17893 %uint_1\n      %24560 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11693\n      %16380 = OpLoad %uint %24560\n      %20782 = OpCompositeConstruct %v4uint %12612 %24155 %12613 %16380\n               OpBranch %20259\n       %6592 = OpLabel\n      %24487 = OpShiftRightLogical %uint %23531 %int_2\n      %13372 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24487\n      %12614 = OpLoad %uint %13372\n      %11694 = OpIAdd %uint %24487 %uint_1\n       %6402 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11694\n      %23652 = OpLoad %uint %6402\n      %11695 = OpIAdd %uint %24487 %uint_2\n       %6403 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11695\n      %23653 = OpLoad %uint %6403\n      %11696 = OpIAdd %uint %24487 %uint_3\n      %24561 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11696\n      %14080 = OpLoad %uint %24561\n      %21616 = OpCompositeConstruct %v4uint %12614 %23652 %23653 %14080\n      %19331 = OpIAdd %uint %23531 %uint_16\n       %8237 = OpShiftRightLogical %uint %19331 %int_2\n      %19604 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %8237\n      %12615 = OpLoad %uint %19604\n      %11697 = OpIAdd %uint %8237 %uint_1\n       %6404 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11697\n      %23654 = OpLoad %uint %6404\n      %11698 = OpIAdd %uint %8237 %uint_2\n       %6405 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11698\n      %23655 = OpLoad %uint %6405\n      %11699 = OpIAdd %uint %8237 %uint_3\n      %24562 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11699\n      %16381 = OpLoad %uint %24562\n      %20783 = OpCompositeConstruct %v4uint %12615 %23654 %23655 %16381\n               OpBranch %20259\n      %20259 = OpLabel\n      %11213 = OpPhi %v4uint %20783 %6592 %20782 %8960\n      %14112 = OpPhi %v4uint %21616 %6592 %19670 %8960\n               OpSelectionMerge %20260 None\n               OpSwitch %8576 %20310 5 %8536 7 %8244\n       %8244 = OpLabel\n      %24407 = OpCompositeExtract %uint %14112 0\n      %24680 = OpExtInst %v2float %1 UnpackHalf2x16 %24407\n      %10101 = OpCompositeExtract %float %24680 0\n      %16056 = OpCompositeExtract %float %24680 1\n      %17025 = OpCompositeExtract %uint %14112 1\n      %15605 = OpExtInst %v2float %1 UnpackHalf2x16 %17025\n      %10086 = OpCompositeExtract %float %15605 0\n      %17481 = OpCompositeExtract %float %15605 1\n      %14607 = OpCompositeConstruct %v4float %10101 %16056 %10086 %17481\n      %17277 = OpCompositeExtract %uint %14112 2\n      %18030 = OpExtInst %v2float %1 UnpackHalf2x16 %17277\n      %10102 = OpCompositeExtract %float %18030 0\n      %16057 = OpCompositeExtract %float %18030 1\n      %17026 = OpCompositeExtract %uint %14112 3\n      %15606 = OpExtInst %v2float %1 UnpackHalf2x16 %17026\n      %10087 = OpCompositeExtract %float %15606 0\n      %17482 = OpCompositeExtract %float %15606 1\n      %14608 = OpCompositeConstruct %v4float %10102 %16057 %10087 %17482\n      %17278 = OpCompositeExtract %uint %11213 0\n      %18031 = OpExtInst %v2float %1 UnpackHalf2x16 %17278\n      %10103 = OpCompositeExtract %float %18031 0\n      %16058 = OpCompositeExtract %float %18031 1\n      %17027 = OpCompositeExtract %uint %11213 1\n      %15607 = OpExtInst %v2float %1 UnpackHalf2x16 %17027\n      %10088 = OpCompositeExtract %float %15607 0\n      %17483 = OpCompositeExtract %float %15607 1\n      %14609 = OpCompositeConstruct %v4float %10103 %16058 %10088 %17483\n      %17279 = OpCompositeExtract %uint %11213 2\n      %18032 = OpExtInst %v2float %1 UnpackHalf2x16 %17279\n      %10104 = OpCompositeExtract %float %18032 0\n      %16059 = OpCompositeExtract %float %18032 1\n      %17028 = OpCompositeExtract %uint %11213 3\n      %15608 = OpExtInst %v2float %1 UnpackHalf2x16 %17028\n      %10089 = OpCompositeExtract %float %15608 0\n      %20671 = OpCompositeExtract %float %15608 1\n       %9036 = OpCompositeConstruct %v4float %10104 %16059 %10089 %20671\n               OpBranch %20260\n       %8536 = OpLabel\n       %9723 = OpVectorShuffle %v2uint %14112 %14112 0 1\n      %23356 = OpBitcast %v2int %9723\n      %24782 = OpVectorShuffle %v4int %23356 %23356 0 0 1 1\n      %18598 = OpShiftLeftLogical %v4int %24782 %290\n      %15757 = OpShiftRightArithmetic %v4int %18598 %770\n      %10907 = OpConvertSToF %v4float %15757\n      %18209 = OpVectorTimesScalar %v4float %10907 %float_0_000976592302\n      %25233 = OpExtInst %v4float %1 FMax %1284 %18209\n      %14187 = OpVectorShuffle %v2uint %14112 %14112 2 3\n       %9407 = OpBitcast %v2int %14187\n      %24783 = OpVectorShuffle %v4int %9407 %9407 0 0 1 1\n      %18599 = OpShiftLeftLogical %v4int %24783 %290\n      %15758 = OpShiftRightArithmetic %v4int %18599 %770\n      %10908 = OpConvertSToF %v4float %15758\n      %18210 = OpVectorTimesScalar %v4float %10908 %float_0_000976592302\n      %25234 = OpExtInst %v4float %1 FMax %1284 %18210\n      %14188 = OpVectorShuffle %v2uint %11213 %11213 0 1\n       %9408 = OpBitcast %v2int %14188\n      %24784 = OpVectorShuffle %v4int %9408 %9408 0 0 1 1\n      %18600 = OpShiftLeftLogical %v4int %24784 %290\n      %15759 = OpShiftRightArithmetic %v4int %18600 %770\n      %10913 = OpConvertSToF %v4float %15759\n      %18211 = OpVectorTimesScalar %v4float %10913 %float_0_000976592302\n      %25235 = OpExtInst %v4float %1 FMax %1284 %18211\n      %14189 = OpVectorShuffle %v2uint %11213 %11213 2 3\n       %9409 = OpBitcast %v2int %14189\n      %24785 = OpVectorShuffle %v4int %9409 %9409 0 0 1 1\n      %18601 = OpShiftLeftLogical %v4int %24785 %290\n      %15760 = OpShiftRightArithmetic %v4int %18601 %770\n      %10914 = OpConvertSToF %v4float %15760\n      %21439 = OpVectorTimesScalar %v4float %10914 %float_0_000976592302\n      %17250 = OpExtInst %v4float %1 FMax %1284 %21439\n               OpBranch %20260\n      %20310 = OpLabel\n       %9761 = OpVectorShuffle %v2uint %14112 %14112 0 1\n      %20825 = OpBitcast %v2float %9761\n       %7035 = OpCompositeExtract %float %20825 0\n      %13418 = OpCompositeExtract %float %20825 1\n      %17016 = OpCompositeConstruct %v4float %7035 %13418 %float_0 %float_0\n      %16856 = OpVectorShuffle %v2uint %14112 %14112 2 3\n      %14173 = OpBitcast %v2float %16856\n       %7036 = OpCompositeExtract %float %14173 0\n      %13419 = OpCompositeExtract %float %14173 1\n      %17017 = OpCompositeConstruct %v4float %7036 %13419 %float_0 %float_0\n      %16857 = OpVectorShuffle %v2uint %11213 %11213 0 1\n      %14174 = OpBitcast %v2float %16857\n       %7037 = OpCompositeExtract %float %14174 0\n      %13420 = OpCompositeExtract %float %14174 1\n      %17018 = OpCompositeConstruct %v4float %7037 %13420 %float_0 %float_0\n      %16858 = OpVectorShuffle %v2uint %11213 %11213 2 3\n      %14175 = OpBitcast %v2float %16858\n       %7038 = OpCompositeExtract %float %14175 0\n      %16648 = OpCompositeExtract %float %14175 1\n       %9037 = OpCompositeConstruct %v4float %7038 %16648 %float_0 %float_0\n               OpBranch %20260\n      %20260 = OpLabel\n      %11176 = OpPhi %v4float %9037 %20310 %17250 %8536 %9036 %8244\n      %14345 = OpPhi %v4float %17018 %20310 %25235 %8536 %14609 %8244\n      %15230 = OpPhi %v4float %17017 %20310 %25234 %8536 %14608 %8244\n      %14519 = OpPhi %v4float %17016 %20310 %25233 %8536 %14607 %8244\n               OpBranch %21263\n      %21263 = OpLabel\n      %11177 = OpPhi %v4float %11176 %20260 %11175 %16224\n      %14346 = OpPhi %v4float %14345 %20260 %14344 %16224\n      %13804 = OpPhi %v4float %15230 %20260 %15229 %16224\n       %8403 = OpPhi %v4float %14519 %20260 %14518 %16224\n      %11861 = OpUGreaterThanEqual %bool %16205 %uint_4\n               OpSelectionMerge %21267 DontFlatten\n               OpBranchConditional %11861 %20709 %21267\n      %20709 = OpLabel\n      %25083 = OpFMul %float %11052 %float_0_5\n      %24184 = OpIAdd %uint %23531 %uint_320\n               OpSelectionMerge %21264 DontFlatten\n               OpBranchConditional %23279 %15206 %16570\n      %16570 = OpLabel\n      %19163 = OpIEqual %bool %6555 %uint_4\n               OpSelectionMerge %20298 DontFlatten\n               OpBranchConditional %19163 %6593 %8961\n       %8961 = OpLabel\n      %22066 = OpShiftRightLogical %uint %24184 %int_2\n      %13373 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22066\n      %15061 = OpLoad %uint %13373\n       %8519 = OpIAdd %uint %24184 %6555\n      %21672 = OpShiftRightLogical %uint %8519 %int_2\n      %19679 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21672\n      %13116 = OpLoad %uint %19679\n       %8688 = OpIMul %uint %uint_2 %6555\n      %24257 = OpIAdd %uint %24184 %8688\n      %17894 = OpShiftRightLogical %uint %24257 %int_2\n      %19680 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17894\n      %13117 = OpLoad %uint %19680\n       %8689 = OpIMul %uint %uint_3 %6555\n      %24258 = OpIAdd %uint %24184 %8689\n      %17895 = OpShiftRightLogical %uint %24258 %int_2\n      %18690 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17895\n      %24410 = OpLoad %uint %18690\n      %20784 = OpCompositeConstruct %v4uint %15061 %13116 %13117 %24410\n               OpBranch %20298\n       %6593 = OpLabel\n      %24488 = OpShiftRightLogical %uint %24184 %int_2\n      %13374 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24488\n      %12616 = OpLoad %uint %13374\n      %11700 = OpIAdd %uint %24488 %uint_1\n       %6406 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11700\n      %23656 = OpLoad %uint %6406\n      %11701 = OpIAdd %uint %24488 %uint_2\n       %6407 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11701\n      %23657 = OpLoad %uint %6407\n      %11702 = OpIAdd %uint %24488 %uint_3\n      %24563 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11702\n      %16382 = OpLoad %uint %24563\n      %20785 = OpCompositeConstruct %v4uint %12616 %23656 %23657 %16382\n               OpBranch %20298\n      %20298 = OpLabel\n      %10944 = OpPhi %v4uint %20785 %6593 %20784 %8961\n               OpSelectionMerge %16225 None\n               OpSwitch %8576 %19452 0 %14586 1 %14586 2 %7357 10 %7357 3 %7356 12 %7356 4 %8191 6 %8245\n       %8245 = OpLabel\n      %24408 = OpCompositeExtract %uint %10944 0\n      %24681 = OpExtInst %v2float %1 UnpackHalf2x16 %24408\n      %10090 = OpCompositeExtract %float %24681 0\n      %17484 = OpCompositeExtract %float %24681 1\n      %14610 = OpCompositeConstruct %v4float %10090 %17484 %float_0 %float_0\n      %17280 = OpCompositeExtract %uint %10944 1\n      %18033 = OpExtInst %v2float %1 UnpackHalf2x16 %17280\n      %10091 = OpCompositeExtract %float %18033 0\n      %17485 = OpCompositeExtract %float %18033 1\n      %14611 = OpCompositeConstruct %v4float %10091 %17485 %float_0 %float_0\n      %17281 = OpCompositeExtract %uint %10944 2\n      %18034 = OpExtInst %v2float %1 UnpackHalf2x16 %17281\n      %10092 = OpCompositeExtract %float %18034 0\n      %17486 = OpCompositeExtract %float %18034 1\n      %14612 = OpCompositeConstruct %v4float %10092 %17486 %float_0 %float_0\n      %17282 = OpCompositeExtract %uint %10944 3\n      %18035 = OpExtInst %v2float %1 UnpackHalf2x16 %17282\n      %10093 = OpCompositeExtract %float %18035 0\n      %20672 = OpCompositeExtract %float %18035 1\n       %9038 = OpCompositeConstruct %v4float %10093 %20672 %float_0 %float_0\n               OpBranch %16225\n       %8191 = OpLabel\n      %12429 = OpCompositeExtract %uint %10944 0\n      %22686 = OpBitcast %int %12429\n      %18206 = OpCompositeConstruct %v2int %22686 %22686\n      %18353 = OpShiftLeftLogical %v2int %18206 %1959\n      %13339 = OpShiftRightArithmetic %v2int %18353 %2151\n      %10915 = OpConvertSToF %v2float %13339\n      %18251 = OpVectorTimesScalar %v2float %10915 %float_0_000976592302\n      %24074 = OpExtInst %v2float %1 FMax %73 %18251\n      %24334 = OpCompositeExtract %float %24074 0\n      %15575 = OpCompositeExtract %float %24074 1\n      %16673 = OpCompositeConstruct %v4float %24334 %15575 %float_0 %float_0\n      %19525 = OpCompositeExtract %uint %10944 1\n      %16036 = OpBitcast %int %19525\n      %18207 = OpCompositeConstruct %v2int %16036 %16036\n      %18354 = OpShiftLeftLogical %v2int %18207 %1959\n      %13340 = OpShiftRightArithmetic %v2int %18354 %2151\n      %10916 = OpConvertSToF %v2float %13340\n      %18252 = OpVectorTimesScalar %v2float %10916 %float_0_000976592302\n      %24075 = OpExtInst %v2float %1 FMax %73 %18252\n      %24335 = OpCompositeExtract %float %24075 0\n      %15576 = OpCompositeExtract %float %24075 1\n      %16674 = OpCompositeConstruct %v4float %24335 %15576 %float_0 %float_0\n      %19526 = OpCompositeExtract %uint %10944 2\n      %16037 = OpBitcast %int %19526\n      %18208 = OpCompositeConstruct %v2int %16037 %16037\n      %18355 = OpShiftLeftLogical %v2int %18208 %1959\n      %13341 = OpShiftRightArithmetic %v2int %18355 %2151\n      %10917 = OpConvertSToF %v2float %13341\n      %18253 = OpVectorTimesScalar %v2float %10917 %float_0_000976592302\n      %24076 = OpExtInst %v2float %1 FMax %73 %18253\n      %24336 = OpCompositeExtract %float %24076 0\n      %15577 = OpCompositeExtract %float %24076 1\n      %16675 = OpCompositeConstruct %v4float %24336 %15577 %float_0 %float_0\n      %19527 = OpCompositeExtract %uint %10944 3\n      %16038 = OpBitcast %int %19527\n      %18212 = OpCompositeConstruct %v2int %16038 %16038\n      %18356 = OpShiftLeftLogical %v2int %18212 %1959\n      %13342 = OpShiftRightArithmetic %v2int %18356 %2151\n      %10918 = OpConvertSToF %v2float %13342\n      %18254 = OpVectorTimesScalar %v2float %10918 %float_0_000976592302\n      %24077 = OpExtInst %v2float %1 FMax %73 %18254\n      %24337 = OpCompositeExtract %float %24077 0\n      %18765 = OpCompositeExtract %float %24077 1\n       %9039 = OpCompositeConstruct %v4float %24337 %18765 %float_0 %float_0\n               OpBranch %16225\n       %7356 = OpLabel\n      %22208 = OpCompositeExtract %uint %10944 0\n      %20237 = OpCompositeConstruct %v3uint %22208 %22208 %22208\n      %11026 = OpShiftRightLogical %v3uint %20237 %2996\n      %24042 = OpBitwiseAnd %v3uint %11026 %261\n      %18592 = OpBitwiseAnd %v3uint %11026 %1126\n      %23444 = OpShiftRightLogical %v3uint %24042 %2828\n      %16589 = OpIEqual %v3bool %23444 %2578\n      %11343 = OpExtInst %v3int %1 FindUMsb %18592\n      %10777 = OpBitcast %v3uint %11343\n       %6270 = OpISub %v3uint %2828 %10777\n       %8724 = OpIAdd %v3uint %10777 %2360\n      %10355 = OpSelect %v3uint %16589 %8724 %23444\n      %23256 = OpShiftLeftLogical %v3uint %18592 %6270\n      %18846 = OpBitwiseAnd %v3uint %23256 %1126\n      %10919 = OpSelect %v3uint %16589 %18846 %18592\n      %24573 = OpIAdd %v3uint %10355 %1018\n      %20355 = OpShiftLeftLogical %v3uint %24573 %393\n      %16298 = OpShiftLeftLogical %v3uint %10919 %141\n      %22400 = OpBitwiseOr %v3uint %20355 %16298\n      %13828 = OpIEqual %v3bool %24042 %2578\n      %16966 = OpSelect %v3uint %13828 %2578 %22400\n      %10707 = OpBitcast %v3float %16966\n      %19368 = OpShiftRightLogical %uint %22208 %uint_30\n      %18450 = OpConvertUToF %float %19368\n      %15907 = OpFMul %float %18450 %float_0_333333343\n      %21446 = OpCompositeExtract %float %10707 0\n      %10841 = OpCompositeExtract %float %10707 1\n       %7836 = OpCompositeExtract %float %10707 2\n      %15837 = OpCompositeConstruct %v4float %21446 %10841 %7836 %15907\n      %10232 = OpCompositeExtract %uint %10944 1\n      %13585 = OpCompositeConstruct %v3uint %10232 %10232 %10232\n      %11027 = OpShiftRightLogical %v3uint %13585 %2996\n      %24043 = OpBitwiseAnd %v3uint %11027 %261\n      %18593 = OpBitwiseAnd %v3uint %11027 %1126\n      %23445 = OpShiftRightLogical %v3uint %24043 %2828\n      %16590 = OpIEqual %v3bool %23445 %2578\n      %11344 = OpExtInst %v3int %1 FindUMsb %18593\n      %10778 = OpBitcast %v3uint %11344\n       %6271 = OpISub %v3uint %2828 %10778\n       %8725 = OpIAdd %v3uint %10778 %2360\n      %10356 = OpSelect %v3uint %16590 %8725 %23445\n      %23257 = OpShiftLeftLogical %v3uint %18593 %6271\n      %18847 = OpBitwiseAnd %v3uint %23257 %1126\n      %10920 = OpSelect %v3uint %16590 %18847 %18593\n      %24574 = OpIAdd %v3uint %10356 %1018\n      %20356 = OpShiftLeftLogical %v3uint %24574 %393\n      %16299 = OpShiftLeftLogical %v3uint %10920 %141\n      %22401 = OpBitwiseOr %v3uint %20356 %16299\n      %13829 = OpIEqual %v3bool %24043 %2578\n      %16967 = OpSelect %v3uint %13829 %2578 %22401\n      %10708 = OpBitcast %v3float %16967\n      %19369 = OpShiftRightLogical %uint %10232 %uint_30\n      %18451 = OpConvertUToF %float %19369\n      %15908 = OpFMul %float %18451 %float_0_333333343\n      %21447 = OpCompositeExtract %float %10708 0\n      %10842 = OpCompositeExtract %float %10708 1\n       %7837 = OpCompositeExtract %float %10708 2\n      %15838 = OpCompositeConstruct %v4float %21447 %10842 %7837 %15908\n      %10233 = OpCompositeExtract %uint %10944 2\n      %13586 = OpCompositeConstruct %v3uint %10233 %10233 %10233\n      %11028 = OpShiftRightLogical %v3uint %13586 %2996\n      %24044 = OpBitwiseAnd %v3uint %11028 %261\n      %18594 = OpBitwiseAnd %v3uint %11028 %1126\n      %23446 = OpShiftRightLogical %v3uint %24044 %2828\n      %16591 = OpIEqual %v3bool %23446 %2578\n      %11345 = OpExtInst %v3int %1 FindUMsb %18594\n      %10779 = OpBitcast %v3uint %11345\n       %6272 = OpISub %v3uint %2828 %10779\n       %8726 = OpIAdd %v3uint %10779 %2360\n      %10357 = OpSelect %v3uint %16591 %8726 %23446\n      %23258 = OpShiftLeftLogical %v3uint %18594 %6272\n      %18848 = OpBitwiseAnd %v3uint %23258 %1126\n      %10921 = OpSelect %v3uint %16591 %18848 %18594\n      %24575 = OpIAdd %v3uint %10357 %1018\n      %20357 = OpShiftLeftLogical %v3uint %24575 %393\n      %16300 = OpShiftLeftLogical %v3uint %10921 %141\n      %22402 = OpBitwiseOr %v3uint %20357 %16300\n      %13830 = OpIEqual %v3bool %24044 %2578\n      %16968 = OpSelect %v3uint %13830 %2578 %22402\n      %10709 = OpBitcast %v3float %16968\n      %19370 = OpShiftRightLogical %uint %10233 %uint_30\n      %18452 = OpConvertUToF %float %19370\n      %15909 = OpFMul %float %18452 %float_0_333333343\n      %21448 = OpCompositeExtract %float %10709 0\n      %10843 = OpCompositeExtract %float %10709 1\n       %7838 = OpCompositeExtract %float %10709 2\n      %15839 = OpCompositeConstruct %v4float %21448 %10843 %7838 %15909\n      %10234 = OpCompositeExtract %uint %10944 3\n      %13587 = OpCompositeConstruct %v3uint %10234 %10234 %10234\n      %11029 = OpShiftRightLogical %v3uint %13587 %2996\n      %24045 = OpBitwiseAnd %v3uint %11029 %261\n      %18595 = OpBitwiseAnd %v3uint %11029 %1126\n      %23447 = OpShiftRightLogical %v3uint %24045 %2828\n      %16592 = OpIEqual %v3bool %23447 %2578\n      %11346 = OpExtInst %v3int %1 FindUMsb %18595\n      %10780 = OpBitcast %v3uint %11346\n       %6273 = OpISub %v3uint %2828 %10780\n       %8727 = OpIAdd %v3uint %10780 %2360\n      %10358 = OpSelect %v3uint %16592 %8727 %23447\n      %23259 = OpShiftLeftLogical %v3uint %18595 %6273\n      %18849 = OpBitwiseAnd %v3uint %23259 %1126\n      %10922 = OpSelect %v3uint %16592 %18849 %18595\n      %24576 = OpIAdd %v3uint %10358 %1018\n      %20358 = OpShiftLeftLogical %v3uint %24576 %393\n      %16301 = OpShiftLeftLogical %v3uint %10922 %141\n      %22403 = OpBitwiseOr %v3uint %20358 %16301\n      %13831 = OpIEqual %v3bool %24045 %2578\n      %16969 = OpSelect %v3uint %13831 %2578 %22403\n      %10710 = OpBitcast %v3float %16969\n      %19371 = OpShiftRightLogical %uint %10234 %uint_30\n      %18453 = OpConvertUToF %float %19371\n      %15910 = OpFMul %float %18453 %float_0_333333343\n      %21449 = OpCompositeExtract %float %10710 0\n      %10844 = OpCompositeExtract %float %10710 1\n      %11030 = OpCompositeExtract %float %10710 2\n       %9040 = OpCompositeConstruct %v4float %21449 %10844 %11030 %15910\n               OpBranch %16225\n       %7357 = OpLabel\n      %22209 = OpCompositeExtract %uint %10944 0\n      %20238 = OpCompositeConstruct %v4uint %22209 %22209 %22209 %22209\n       %9376 = OpShiftRightLogical %v4uint %20238 %845\n      %18863 = OpBitwiseAnd %v4uint %9376 %635\n      %15546 = OpConvertUToF %v4float %18863\n      %16691 = OpFMul %v4float %15546 %2798\n      %23765 = OpCompositeExtract %uint %10944 1\n      %20816 = OpCompositeConstruct %v4uint %23765 %23765 %23765 %23765\n       %9377 = OpShiftRightLogical %v4uint %20816 %845\n      %18864 = OpBitwiseAnd %v4uint %9377 %635\n      %15547 = OpConvertUToF %v4float %18864\n      %16692 = OpFMul %v4float %15547 %2798\n      %23766 = OpCompositeExtract %uint %10944 2\n      %20817 = OpCompositeConstruct %v4uint %23766 %23766 %23766 %23766\n       %9378 = OpShiftRightLogical %v4uint %20817 %845\n      %18865 = OpBitwiseAnd %v4uint %9378 %635\n      %15548 = OpConvertUToF %v4float %18865\n      %16693 = OpFMul %v4float %15548 %2798\n      %23767 = OpCompositeExtract %uint %10944 3\n      %20818 = OpCompositeConstruct %v4uint %23767 %23767 %23767 %23767\n       %9379 = OpShiftRightLogical %v4uint %20818 %845\n      %18866 = OpBitwiseAnd %v4uint %9379 %635\n      %18736 = OpConvertUToF %v4float %18866\n       %9888 = OpFMul %v4float %18736 %2798\n               OpBranch %16225\n      %14586 = OpLabel\n      %22210 = OpCompositeExtract %uint %10944 0\n      %20239 = OpCompositeConstruct %v4uint %22210 %22210 %22210 %22210\n       %9380 = OpShiftRightLogical %v4uint %20239 %653\n      %19034 = OpBitwiseAnd %v4uint %9380 %1611\n      %13989 = OpConvertUToF %v4float %19034\n      %19238 = OpVectorTimesScalar %v4float %13989 %float_0_00392156886\n       %8610 = OpCompositeExtract %uint %10944 1\n      %24846 = OpCompositeConstruct %v4uint %8610 %8610 %8610 %8610\n       %9381 = OpShiftRightLogical %v4uint %24846 %653\n      %19035 = OpBitwiseAnd %v4uint %9381 %1611\n      %13990 = OpConvertUToF %v4float %19035\n      %19239 = OpVectorTimesScalar %v4float %13990 %float_0_00392156886\n       %8611 = OpCompositeExtract %uint %10944 2\n      %24847 = OpCompositeConstruct %v4uint %8611 %8611 %8611 %8611\n       %9382 = OpShiftRightLogical %v4uint %24847 %653\n      %19036 = OpBitwiseAnd %v4uint %9382 %1611\n      %13991 = OpConvertUToF %v4float %19036\n      %19240 = OpVectorTimesScalar %v4float %13991 %float_0_00392156886\n       %8612 = OpCompositeExtract %uint %10944 3\n      %24848 = OpCompositeConstruct %v4uint %8612 %8612 %8612 %8612\n       %9383 = OpShiftRightLogical %v4uint %24848 %653\n      %19037 = OpBitwiseAnd %v4uint %9383 %1611\n      %17179 = OpConvertUToF %v4float %19037\n      %12435 = OpVectorTimesScalar %v4float %17179 %float_0_00392156886\n               OpBranch %16225\n      %19452 = OpLabel\n      %12430 = OpCompositeExtract %uint %10944 0\n      %20463 = OpBitcast %float %12430\n      %17209 = OpCompositeConstruct %v2float %20463 %float_0\n      %11667 = OpVectorShuffle %v4float %17209 %17209 0 1 1 1\n      %22196 = OpCompositeExtract %uint %10944 1\n      %16235 = OpBitcast %float %22196\n      %17210 = OpCompositeConstruct %v2float %16235 %float_0\n      %11668 = OpVectorShuffle %v4float %17210 %17210 0 1 1 1\n      %22197 = OpCompositeExtract %uint %10944 2\n      %16236 = OpBitcast %float %22197\n      %17211 = OpCompositeConstruct %v2float %16236 %float_0\n      %11669 = OpVectorShuffle %v4float %17211 %17211 0 1 1 1\n      %22198 = OpCompositeExtract %uint %10944 3\n      %16237 = OpBitcast %float %22198\n      %20399 = OpCompositeConstruct %v2float %16237 %float_0\n      %23099 = OpVectorShuffle %v4float %20399 %20399 0 1 1 1\n               OpBranch %16225\n      %16225 = OpLabel\n      %11178 = OpPhi %v4float %23099 %19452 %12435 %14586 %9888 %7357 %9040 %7356 %9039 %8191 %9038 %8245\n      %14347 = OpPhi %v4float %11669 %19452 %19240 %14586 %16693 %7357 %15839 %7356 %16675 %8191 %14612 %8245\n      %15231 = OpPhi %v4float %11668 %19452 %19239 %14586 %16692 %7357 %15838 %7356 %16674 %8191 %14611 %8245\n      %14520 = OpPhi %v4float %11667 %19452 %19238 %14586 %16691 %7357 %15837 %7356 %16673 %8191 %14610 %8245\n               OpBranch %21264\n      %15206 = OpLabel\n      %21585 = OpIEqual %bool %6555 %uint_8\n               OpSelectionMerge %20261 DontFlatten\n               OpBranchConditional %21585 %6594 %8962\n       %8962 = OpLabel\n      %22067 = OpShiftRightLogical %uint %24184 %int_2\n      %13375 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22067\n      %12617 = OpLoad %uint %13375\n      %11703 = OpIAdd %uint %22067 %uint_1\n       %6408 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11703\n       %7031 = OpLoad %uint %6408\n       %8520 = OpIAdd %uint %24184 %6555\n      %21673 = OpShiftRightLogical %uint %8520 %int_2\n      %19605 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21673\n      %12618 = OpLoad %uint %19605\n      %11704 = OpIAdd %uint %21673 %uint_1\n      %24564 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11704\n      %14157 = OpLoad %uint %24564\n      %19671 = OpCompositeConstruct %v4uint %12617 %7031 %12618 %14157\n      %19500 = OpIMul %uint %uint_2 %6555\n      %10822 = OpIAdd %uint %24184 %19500\n      %17896 = OpShiftRightLogical %uint %10822 %int_2\n      %19606 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17896\n      %12619 = OpLoad %uint %19606\n      %11705 = OpIAdd %uint %17896 %uint_1\n       %6476 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11705\n      %24156 = OpLoad %uint %6476\n       %8690 = OpIMul %uint %uint_3 %6555\n      %24259 = OpIAdd %uint %24184 %8690\n      %17897 = OpShiftRightLogical %uint %24259 %int_2\n      %19607 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17897\n      %12620 = OpLoad %uint %19607\n      %11706 = OpIAdd %uint %17897 %uint_1\n      %24565 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11706\n      %16383 = OpLoad %uint %24565\n      %20786 = OpCompositeConstruct %v4uint %12619 %24156 %12620 %16383\n               OpBranch %20261\n       %6594 = OpLabel\n      %24489 = OpShiftRightLogical %uint %24184 %int_2\n      %13376 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24489\n      %12621 = OpLoad %uint %13376\n      %11707 = OpIAdd %uint %24489 %uint_1\n       %6409 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11707\n      %23658 = OpLoad %uint %6409\n      %11708 = OpIAdd %uint %24489 %uint_2\n       %6410 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11708\n      %23659 = OpLoad %uint %6410\n      %11709 = OpIAdd %uint %24489 %uint_3\n      %24566 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11709\n      %14081 = OpLoad %uint %24566\n      %21617 = OpCompositeConstruct %v4uint %12621 %23658 %23659 %14081\n      %19332 = OpIAdd %uint %23531 %uint_336\n       %8238 = OpShiftRightLogical %uint %19332 %int_2\n      %19608 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %8238\n      %12622 = OpLoad %uint %19608\n      %11710 = OpIAdd %uint %8238 %uint_1\n       %6411 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11710\n      %23660 = OpLoad %uint %6411\n      %11711 = OpIAdd %uint %8238 %uint_2\n       %6412 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11711\n      %23661 = OpLoad %uint %6412\n      %11712 = OpIAdd %uint %8238 %uint_3\n      %24567 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11712\n      %16384 = OpLoad %uint %24567\n      %20787 = OpCompositeConstruct %v4uint %12622 %23660 %23661 %16384\n               OpBranch %20261\n      %20261 = OpLabel\n      %11214 = OpPhi %v4uint %20787 %6594 %20786 %8962\n      %14113 = OpPhi %v4uint %21617 %6594 %19671 %8962\n               OpSelectionMerge %20262 None\n               OpSwitch %8576 %20311 5 %8537 7 %8246\n       %8246 = OpLabel\n      %24411 = OpCompositeExtract %uint %14113 0\n      %24682 = OpExtInst %v2float %1 UnpackHalf2x16 %24411\n      %10105 = OpCompositeExtract %float %24682 0\n      %16060 = OpCompositeExtract %float %24682 1\n      %17029 = OpCompositeExtract %uint %14113 1\n      %15609 = OpExtInst %v2float %1 UnpackHalf2x16 %17029\n      %10094 = OpCompositeExtract %float %15609 0\n      %17487 = OpCompositeExtract %float %15609 1\n      %14613 = OpCompositeConstruct %v4float %10105 %16060 %10094 %17487\n      %17283 = OpCompositeExtract %uint %14113 2\n      %18036 = OpExtInst %v2float %1 UnpackHalf2x16 %17283\n      %10106 = OpCompositeExtract %float %18036 0\n      %16061 = OpCompositeExtract %float %18036 1\n      %17030 = OpCompositeExtract %uint %14113 3\n      %15610 = OpExtInst %v2float %1 UnpackHalf2x16 %17030\n      %10095 = OpCompositeExtract %float %15610 0\n      %17488 = OpCompositeExtract %float %15610 1\n      %14614 = OpCompositeConstruct %v4float %10106 %16061 %10095 %17488\n      %17284 = OpCompositeExtract %uint %11214 0\n      %18037 = OpExtInst %v2float %1 UnpackHalf2x16 %17284\n      %10107 = OpCompositeExtract %float %18037 0\n      %16062 = OpCompositeExtract %float %18037 1\n      %17031 = OpCompositeExtract %uint %11214 1\n      %15611 = OpExtInst %v2float %1 UnpackHalf2x16 %17031\n      %10096 = OpCompositeExtract %float %15611 0\n      %17489 = OpCompositeExtract %float %15611 1\n      %14615 = OpCompositeConstruct %v4float %10107 %16062 %10096 %17489\n      %17285 = OpCompositeExtract %uint %11214 2\n      %18038 = OpExtInst %v2float %1 UnpackHalf2x16 %17285\n      %10108 = OpCompositeExtract %float %18038 0\n      %16063 = OpCompositeExtract %float %18038 1\n      %17032 = OpCompositeExtract %uint %11214 3\n      %15612 = OpExtInst %v2float %1 UnpackHalf2x16 %17032\n      %10097 = OpCompositeExtract %float %15612 0\n      %20673 = OpCompositeExtract %float %15612 1\n       %9041 = OpCompositeConstruct %v4float %10108 %16063 %10097 %20673\n               OpBranch %20262\n       %8537 = OpLabel\n       %9724 = OpVectorShuffle %v2uint %14113 %14113 0 1\n      %23357 = OpBitcast %v2int %9724\n      %24786 = OpVectorShuffle %v4int %23357 %23357 0 0 1 1\n      %18602 = OpShiftLeftLogical %v4int %24786 %290\n      %15761 = OpShiftRightArithmetic %v4int %18602 %770\n      %10923 = OpConvertSToF %v4float %15761\n      %18213 = OpVectorTimesScalar %v4float %10923 %float_0_000976592302\n      %25236 = OpExtInst %v4float %1 FMax %1284 %18213\n      %14190 = OpVectorShuffle %v2uint %14113 %14113 2 3\n       %9410 = OpBitcast %v2int %14190\n      %24787 = OpVectorShuffle %v4int %9410 %9410 0 0 1 1\n      %18603 = OpShiftLeftLogical %v4int %24787 %290\n      %15762 = OpShiftRightArithmetic %v4int %18603 %770\n      %10924 = OpConvertSToF %v4float %15762\n      %18214 = OpVectorTimesScalar %v4float %10924 %float_0_000976592302\n      %25237 = OpExtInst %v4float %1 FMax %1284 %18214\n      %14191 = OpVectorShuffle %v2uint %11214 %11214 0 1\n       %9411 = OpBitcast %v2int %14191\n      %24788 = OpVectorShuffle %v4int %9411 %9411 0 0 1 1\n      %18604 = OpShiftLeftLogical %v4int %24788 %290\n      %15763 = OpShiftRightArithmetic %v4int %18604 %770\n      %10925 = OpConvertSToF %v4float %15763\n      %18215 = OpVectorTimesScalar %v4float %10925 %float_0_000976592302\n      %25238 = OpExtInst %v4float %1 FMax %1284 %18215\n      %14192 = OpVectorShuffle %v2uint %11214 %11214 2 3\n       %9412 = OpBitcast %v2int %14192\n      %24789 = OpVectorShuffle %v4int %9412 %9412 0 0 1 1\n      %18605 = OpShiftLeftLogical %v4int %24789 %290\n      %15764 = OpShiftRightArithmetic %v4int %18605 %770\n      %10926 = OpConvertSToF %v4float %15764\n      %21440 = OpVectorTimesScalar %v4float %10926 %float_0_000976592302\n      %17251 = OpExtInst %v4float %1 FMax %1284 %21440\n               OpBranch %20262\n      %20311 = OpLabel\n       %9762 = OpVectorShuffle %v2uint %14113 %14113 0 1\n      %20826 = OpBitcast %v2float %9762\n       %7039 = OpCompositeExtract %float %20826 0\n      %13421 = OpCompositeExtract %float %20826 1\n      %17019 = OpCompositeConstruct %v4float %7039 %13421 %float_0 %float_0\n      %16859 = OpVectorShuffle %v2uint %14113 %14113 2 3\n      %14176 = OpBitcast %v2float %16859\n       %7040 = OpCompositeExtract %float %14176 0\n      %13422 = OpCompositeExtract %float %14176 1\n      %17020 = OpCompositeConstruct %v4float %7040 %13422 %float_0 %float_0\n      %16860 = OpVectorShuffle %v2uint %11214 %11214 0 1\n      %14177 = OpBitcast %v2float %16860\n       %7041 = OpCompositeExtract %float %14177 0\n      %13423 = OpCompositeExtract %float %14177 1\n      %17021 = OpCompositeConstruct %v4float %7041 %13423 %float_0 %float_0\n      %16861 = OpVectorShuffle %v2uint %11214 %11214 2 3\n      %14178 = OpBitcast %v2float %16861\n       %7042 = OpCompositeExtract %float %14178 0\n      %16649 = OpCompositeExtract %float %14178 1\n       %9042 = OpCompositeConstruct %v4float %7042 %16649 %float_0 %float_0\n               OpBranch %20262\n      %20262 = OpLabel\n      %11179 = OpPhi %v4float %9042 %20311 %17251 %8537 %9041 %8246\n      %14348 = OpPhi %v4float %17021 %20311 %25238 %8537 %14615 %8246\n      %15232 = OpPhi %v4float %17020 %20311 %25237 %8537 %14614 %8246\n      %14521 = OpPhi %v4float %17019 %20311 %25236 %8537 %14613 %8246\n               OpBranch %21264\n      %21264 = OpLabel\n      %11180 = OpPhi %v4float %11179 %20262 %11178 %16225\n      %14349 = OpPhi %v4float %14348 %20262 %14347 %16225\n      %12949 = OpPhi %v4float %15232 %20262 %15231 %16225\n      %13946 = OpPhi %v4float %14521 %20262 %14520 %16225\n      %17241 = OpFAdd %v4float %8403 %13946\n      %23297 = OpFAdd %v4float %13804 %12949\n       %8082 = OpFAdd %v4float %14346 %14349\n      %20755 = OpFAdd %v4float %11177 %11180\n      %14461 = OpUGreaterThanEqual %bool %16205 %uint_6\n               OpSelectionMerge %24267 DontFlatten\n               OpBranchConditional %14461 %9905 %24267\n       %9905 = OpLabel\n      %14258 = OpShiftLeftLogical %uint %uint_4 %9130\n      %12090 = OpFMul %float %11052 %float_0_25\n      %20988 = OpIAdd %uint %23531 %14258\n               OpSelectionMerge %21265 DontFlatten\n               OpBranchConditional %23279 %15207 %16571\n      %16571 = OpLabel\n      %19165 = OpIEqual %bool %6555 %uint_4\n               OpSelectionMerge %20299 DontFlatten\n               OpBranchConditional %19165 %6595 %8963\n       %8963 = OpLabel\n      %22068 = OpShiftRightLogical %uint %20988 %int_2\n      %13377 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22068\n      %15062 = OpLoad %uint %13377\n       %8521 = OpIAdd %uint %20988 %6555\n      %21674 = OpShiftRightLogical %uint %8521 %int_2\n      %19681 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21674\n      %13118 = OpLoad %uint %19681\n       %8691 = OpIMul %uint %uint_2 %6555\n      %24260 = OpIAdd %uint %20988 %8691\n      %17898 = OpShiftRightLogical %uint %24260 %int_2\n      %19682 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17898\n      %13119 = OpLoad %uint %19682\n       %8692 = OpIMul %uint %uint_3 %6555\n      %24261 = OpIAdd %uint %20988 %8692\n      %17899 = OpShiftRightLogical %uint %24261 %int_2\n      %18691 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17899\n      %24412 = OpLoad %uint %18691\n      %20788 = OpCompositeConstruct %v4uint %15062 %13118 %13119 %24412\n               OpBranch %20299\n       %6595 = OpLabel\n      %24490 = OpShiftRightLogical %uint %20988 %int_2\n      %13378 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24490\n      %12623 = OpLoad %uint %13378\n      %11713 = OpIAdd %uint %24490 %uint_1\n       %6413 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11713\n      %23662 = OpLoad %uint %6413\n      %11714 = OpIAdd %uint %24490 %uint_2\n       %6414 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11714\n      %23663 = OpLoad %uint %6414\n      %11715 = OpIAdd %uint %24490 %uint_3\n      %24568 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11715\n      %16385 = OpLoad %uint %24568\n      %20789 = OpCompositeConstruct %v4uint %12623 %23662 %23663 %16385\n               OpBranch %20299\n      %20299 = OpLabel\n      %10945 = OpPhi %v4uint %20789 %6595 %20788 %8963\n               OpSelectionMerge %16226 None\n               OpSwitch %8576 %19453 0 %14587 1 %14587 2 %7359 10 %7359 3 %7358 12 %7358 4 %8192 6 %8247\n       %8247 = OpLabel\n      %24413 = OpCompositeExtract %uint %10945 0\n      %24683 = OpExtInst %v2float %1 UnpackHalf2x16 %24413\n      %10098 = OpCompositeExtract %float %24683 0\n      %17490 = OpCompositeExtract %float %24683 1\n      %14616 = OpCompositeConstruct %v4float %10098 %17490 %float_0 %float_0\n      %17286 = OpCompositeExtract %uint %10945 1\n      %18039 = OpExtInst %v2float %1 UnpackHalf2x16 %17286\n      %10099 = OpCompositeExtract %float %18039 0\n      %17491 = OpCompositeExtract %float %18039 1\n      %14617 = OpCompositeConstruct %v4float %10099 %17491 %float_0 %float_0\n      %17287 = OpCompositeExtract %uint %10945 2\n      %18040 = OpExtInst %v2float %1 UnpackHalf2x16 %17287\n      %10100 = OpCompositeExtract %float %18040 0\n      %17492 = OpCompositeExtract %float %18040 1\n      %14618 = OpCompositeConstruct %v4float %10100 %17492 %float_0 %float_0\n      %17288 = OpCompositeExtract %uint %10945 3\n      %18041 = OpExtInst %v2float %1 UnpackHalf2x16 %17288\n      %10109 = OpCompositeExtract %float %18041 0\n      %20674 = OpCompositeExtract %float %18041 1\n       %9043 = OpCompositeConstruct %v4float %10109 %20674 %float_0 %float_0\n               OpBranch %16226\n       %8192 = OpLabel\n      %12431 = OpCompositeExtract %uint %10945 0\n      %22687 = OpBitcast %int %12431\n      %18216 = OpCompositeConstruct %v2int %22687 %22687\n      %18357 = OpShiftLeftLogical %v2int %18216 %1959\n      %13343 = OpShiftRightArithmetic %v2int %18357 %2151\n      %10927 = OpConvertSToF %v2float %13343\n      %18255 = OpVectorTimesScalar %v2float %10927 %float_0_000976592302\n      %24078 = OpExtInst %v2float %1 FMax %73 %18255\n      %24338 = OpCompositeExtract %float %24078 0\n      %15578 = OpCompositeExtract %float %24078 1\n      %16676 = OpCompositeConstruct %v4float %24338 %15578 %float_0 %float_0\n      %19528 = OpCompositeExtract %uint %10945 1\n      %16039 = OpBitcast %int %19528\n      %18217 = OpCompositeConstruct %v2int %16039 %16039\n      %18358 = OpShiftLeftLogical %v2int %18217 %1959\n      %13344 = OpShiftRightArithmetic %v2int %18358 %2151\n      %10928 = OpConvertSToF %v2float %13344\n      %18256 = OpVectorTimesScalar %v2float %10928 %float_0_000976592302\n      %24079 = OpExtInst %v2float %1 FMax %73 %18256\n      %24339 = OpCompositeExtract %float %24079 0\n      %15579 = OpCompositeExtract %float %24079 1\n      %16677 = OpCompositeConstruct %v4float %24339 %15579 %float_0 %float_0\n      %19529 = OpCompositeExtract %uint %10945 2\n      %16040 = OpBitcast %int %19529\n      %18218 = OpCompositeConstruct %v2int %16040 %16040\n      %18359 = OpShiftLeftLogical %v2int %18218 %1959\n      %13345 = OpShiftRightArithmetic %v2int %18359 %2151\n      %10929 = OpConvertSToF %v2float %13345\n      %18257 = OpVectorTimesScalar %v2float %10929 %float_0_000976592302\n      %24080 = OpExtInst %v2float %1 FMax %73 %18257\n      %24340 = OpCompositeExtract %float %24080 0\n      %15580 = OpCompositeExtract %float %24080 1\n      %16678 = OpCompositeConstruct %v4float %24340 %15580 %float_0 %float_0\n      %19530 = OpCompositeExtract %uint %10945 3\n      %16041 = OpBitcast %int %19530\n      %18219 = OpCompositeConstruct %v2int %16041 %16041\n      %18360 = OpShiftLeftLogical %v2int %18219 %1959\n      %13346 = OpShiftRightArithmetic %v2int %18360 %2151\n      %10930 = OpConvertSToF %v2float %13346\n      %18258 = OpVectorTimesScalar %v2float %10930 %float_0_000976592302\n      %24081 = OpExtInst %v2float %1 FMax %73 %18258\n      %24341 = OpCompositeExtract %float %24081 0\n      %18766 = OpCompositeExtract %float %24081 1\n       %9044 = OpCompositeConstruct %v4float %24341 %18766 %float_0 %float_0\n               OpBranch %16226\n       %7358 = OpLabel\n      %22211 = OpCompositeExtract %uint %10945 0\n      %20240 = OpCompositeConstruct %v3uint %22211 %22211 %22211\n      %11031 = OpShiftRightLogical %v3uint %20240 %2996\n      %24046 = OpBitwiseAnd %v3uint %11031 %261\n      %18596 = OpBitwiseAnd %v3uint %11031 %1126\n      %23448 = OpShiftRightLogical %v3uint %24046 %2828\n      %16593 = OpIEqual %v3bool %23448 %2578\n      %11347 = OpExtInst %v3int %1 FindUMsb %18596\n      %10781 = OpBitcast %v3uint %11347\n       %6274 = OpISub %v3uint %2828 %10781\n       %8728 = OpIAdd %v3uint %10781 %2360\n      %10359 = OpSelect %v3uint %16593 %8728 %23448\n      %23260 = OpShiftLeftLogical %v3uint %18596 %6274\n      %18850 = OpBitwiseAnd %v3uint %23260 %1126\n      %10931 = OpSelect %v3uint %16593 %18850 %18596\n      %24577 = OpIAdd %v3uint %10359 %1018\n      %20359 = OpShiftLeftLogical %v3uint %24577 %393\n      %16302 = OpShiftLeftLogical %v3uint %10931 %141\n      %22404 = OpBitwiseOr %v3uint %20359 %16302\n      %13832 = OpIEqual %v3bool %24046 %2578\n      %16970 = OpSelect %v3uint %13832 %2578 %22404\n      %10711 = OpBitcast %v3float %16970\n      %19372 = OpShiftRightLogical %uint %22211 %uint_30\n      %18454 = OpConvertUToF %float %19372\n      %15911 = OpFMul %float %18454 %float_0_333333343\n      %21450 = OpCompositeExtract %float %10711 0\n      %10845 = OpCompositeExtract %float %10711 1\n       %7839 = OpCompositeExtract %float %10711 2\n      %15840 = OpCompositeConstruct %v4float %21450 %10845 %7839 %15911\n      %10235 = OpCompositeExtract %uint %10945 1\n      %13588 = OpCompositeConstruct %v3uint %10235 %10235 %10235\n      %11032 = OpShiftRightLogical %v3uint %13588 %2996\n      %24047 = OpBitwiseAnd %v3uint %11032 %261\n      %18597 = OpBitwiseAnd %v3uint %11032 %1126\n      %23449 = OpShiftRightLogical %v3uint %24047 %2828\n      %16594 = OpIEqual %v3bool %23449 %2578\n      %11348 = OpExtInst %v3int %1 FindUMsb %18597\n      %10782 = OpBitcast %v3uint %11348\n       %6275 = OpISub %v3uint %2828 %10782\n       %8729 = OpIAdd %v3uint %10782 %2360\n      %10360 = OpSelect %v3uint %16594 %8729 %23449\n      %23261 = OpShiftLeftLogical %v3uint %18597 %6275\n      %18851 = OpBitwiseAnd %v3uint %23261 %1126\n      %10932 = OpSelect %v3uint %16594 %18851 %18597\n      %24578 = OpIAdd %v3uint %10360 %1018\n      %20360 = OpShiftLeftLogical %v3uint %24578 %393\n      %16303 = OpShiftLeftLogical %v3uint %10932 %141\n      %22405 = OpBitwiseOr %v3uint %20360 %16303\n      %13833 = OpIEqual %v3bool %24047 %2578\n      %16971 = OpSelect %v3uint %13833 %2578 %22405\n      %10712 = OpBitcast %v3float %16971\n      %19373 = OpShiftRightLogical %uint %10235 %uint_30\n      %18455 = OpConvertUToF %float %19373\n      %15912 = OpFMul %float %18455 %float_0_333333343\n      %21451 = OpCompositeExtract %float %10712 0\n      %10846 = OpCompositeExtract %float %10712 1\n       %7840 = OpCompositeExtract %float %10712 2\n      %15841 = OpCompositeConstruct %v4float %21451 %10846 %7840 %15912\n      %10236 = OpCompositeExtract %uint %10945 2\n      %13589 = OpCompositeConstruct %v3uint %10236 %10236 %10236\n      %11033 = OpShiftRightLogical %v3uint %13589 %2996\n      %24048 = OpBitwiseAnd %v3uint %11033 %261\n      %18606 = OpBitwiseAnd %v3uint %11033 %1126\n      %23450 = OpShiftRightLogical %v3uint %24048 %2828\n      %16595 = OpIEqual %v3bool %23450 %2578\n      %11349 = OpExtInst %v3int %1 FindUMsb %18606\n      %10783 = OpBitcast %v3uint %11349\n       %6276 = OpISub %v3uint %2828 %10783\n       %8730 = OpIAdd %v3uint %10783 %2360\n      %10361 = OpSelect %v3uint %16595 %8730 %23450\n      %23262 = OpShiftLeftLogical %v3uint %18606 %6276\n      %18852 = OpBitwiseAnd %v3uint %23262 %1126\n      %10933 = OpSelect %v3uint %16595 %18852 %18606\n      %24579 = OpIAdd %v3uint %10361 %1018\n      %20361 = OpShiftLeftLogical %v3uint %24579 %393\n      %16304 = OpShiftLeftLogical %v3uint %10933 %141\n      %22406 = OpBitwiseOr %v3uint %20361 %16304\n      %13834 = OpIEqual %v3bool %24048 %2578\n      %16972 = OpSelect %v3uint %13834 %2578 %22406\n      %10713 = OpBitcast %v3float %16972\n      %19374 = OpShiftRightLogical %uint %10236 %uint_30\n      %18456 = OpConvertUToF %float %19374\n      %15913 = OpFMul %float %18456 %float_0_333333343\n      %21452 = OpCompositeExtract %float %10713 0\n      %10847 = OpCompositeExtract %float %10713 1\n       %7841 = OpCompositeExtract %float %10713 2\n      %15842 = OpCompositeConstruct %v4float %21452 %10847 %7841 %15913\n      %10237 = OpCompositeExtract %uint %10945 3\n      %13590 = OpCompositeConstruct %v3uint %10237 %10237 %10237\n      %11034 = OpShiftRightLogical %v3uint %13590 %2996\n      %24049 = OpBitwiseAnd %v3uint %11034 %261\n      %18607 = OpBitwiseAnd %v3uint %11034 %1126\n      %23451 = OpShiftRightLogical %v3uint %24049 %2828\n      %16596 = OpIEqual %v3bool %23451 %2578\n      %11350 = OpExtInst %v3int %1 FindUMsb %18607\n      %10784 = OpBitcast %v3uint %11350\n       %6277 = OpISub %v3uint %2828 %10784\n       %8731 = OpIAdd %v3uint %10784 %2360\n      %10362 = OpSelect %v3uint %16596 %8731 %23451\n      %23263 = OpShiftLeftLogical %v3uint %18607 %6277\n      %18853 = OpBitwiseAnd %v3uint %23263 %1126\n      %10934 = OpSelect %v3uint %16596 %18853 %18607\n      %24580 = OpIAdd %v3uint %10362 %1018\n      %20362 = OpShiftLeftLogical %v3uint %24580 %393\n      %16305 = OpShiftLeftLogical %v3uint %10934 %141\n      %22407 = OpBitwiseOr %v3uint %20362 %16305\n      %13835 = OpIEqual %v3bool %24049 %2578\n      %16973 = OpSelect %v3uint %13835 %2578 %22407\n      %10714 = OpBitcast %v3float %16973\n      %19375 = OpShiftRightLogical %uint %10237 %uint_30\n      %18457 = OpConvertUToF %float %19375\n      %15914 = OpFMul %float %18457 %float_0_333333343\n      %21453 = OpCompositeExtract %float %10714 0\n      %10848 = OpCompositeExtract %float %10714 1\n      %11035 = OpCompositeExtract %float %10714 2\n       %9045 = OpCompositeConstruct %v4float %21453 %10848 %11035 %15914\n               OpBranch %16226\n       %7359 = OpLabel\n      %22212 = OpCompositeExtract %uint %10945 0\n      %20241 = OpCompositeConstruct %v4uint %22212 %22212 %22212 %22212\n       %9384 = OpShiftRightLogical %v4uint %20241 %845\n      %18867 = OpBitwiseAnd %v4uint %9384 %635\n      %15549 = OpConvertUToF %v4float %18867\n      %16694 = OpFMul %v4float %15549 %2798\n      %23768 = OpCompositeExtract %uint %10945 1\n      %20819 = OpCompositeConstruct %v4uint %23768 %23768 %23768 %23768\n       %9385 = OpShiftRightLogical %v4uint %20819 %845\n      %18868 = OpBitwiseAnd %v4uint %9385 %635\n      %15550 = OpConvertUToF %v4float %18868\n      %16695 = OpFMul %v4float %15550 %2798\n      %23769 = OpCompositeExtract %uint %10945 2\n      %20820 = OpCompositeConstruct %v4uint %23769 %23769 %23769 %23769\n       %9386 = OpShiftRightLogical %v4uint %20820 %845\n      %18869 = OpBitwiseAnd %v4uint %9386 %635\n      %15551 = OpConvertUToF %v4float %18869\n      %16696 = OpFMul %v4float %15551 %2798\n      %23770 = OpCompositeExtract %uint %10945 3\n      %20821 = OpCompositeConstruct %v4uint %23770 %23770 %23770 %23770\n       %9387 = OpShiftRightLogical %v4uint %20821 %845\n      %18870 = OpBitwiseAnd %v4uint %9387 %635\n      %18737 = OpConvertUToF %v4float %18870\n       %9889 = OpFMul %v4float %18737 %2798\n               OpBranch %16226\n      %14587 = OpLabel\n      %22213 = OpCompositeExtract %uint %10945 0\n      %20242 = OpCompositeConstruct %v4uint %22213 %22213 %22213 %22213\n       %9388 = OpShiftRightLogical %v4uint %20242 %653\n      %19038 = OpBitwiseAnd %v4uint %9388 %1611\n      %13992 = OpConvertUToF %v4float %19038\n      %19241 = OpVectorTimesScalar %v4float %13992 %float_0_00392156886\n       %8613 = OpCompositeExtract %uint %10945 1\n      %24849 = OpCompositeConstruct %v4uint %8613 %8613 %8613 %8613\n       %9389 = OpShiftRightLogical %v4uint %24849 %653\n      %19039 = OpBitwiseAnd %v4uint %9389 %1611\n      %13993 = OpConvertUToF %v4float %19039\n      %19242 = OpVectorTimesScalar %v4float %13993 %float_0_00392156886\n       %8614 = OpCompositeExtract %uint %10945 2\n      %24850 = OpCompositeConstruct %v4uint %8614 %8614 %8614 %8614\n       %9390 = OpShiftRightLogical %v4uint %24850 %653\n      %19040 = OpBitwiseAnd %v4uint %9390 %1611\n      %13994 = OpConvertUToF %v4float %19040\n      %19243 = OpVectorTimesScalar %v4float %13994 %float_0_00392156886\n       %8615 = OpCompositeExtract %uint %10945 3\n      %24851 = OpCompositeConstruct %v4uint %8615 %8615 %8615 %8615\n       %9391 = OpShiftRightLogical %v4uint %24851 %653\n      %19041 = OpBitwiseAnd %v4uint %9391 %1611\n      %17180 = OpConvertUToF %v4float %19041\n      %12436 = OpVectorTimesScalar %v4float %17180 %float_0_00392156886\n               OpBranch %16226\n      %19453 = OpLabel\n      %12432 = OpCompositeExtract %uint %10945 0\n      %20464 = OpBitcast %float %12432\n      %17212 = OpCompositeConstruct %v2float %20464 %float_0\n      %11670 = OpVectorShuffle %v4float %17212 %17212 0 1 1 1\n      %22199 = OpCompositeExtract %uint %10945 1\n      %16238 = OpBitcast %float %22199\n      %17213 = OpCompositeConstruct %v2float %16238 %float_0\n      %11671 = OpVectorShuffle %v4float %17213 %17213 0 1 1 1\n      %22200 = OpCompositeExtract %uint %10945 2\n      %16239 = OpBitcast %float %22200\n      %17214 = OpCompositeConstruct %v2float %16239 %float_0\n      %11672 = OpVectorShuffle %v4float %17214 %17214 0 1 1 1\n      %22201 = OpCompositeExtract %uint %10945 3\n      %16240 = OpBitcast %float %22201\n      %20400 = OpCompositeConstruct %v2float %16240 %float_0\n      %23100 = OpVectorShuffle %v4float %20400 %20400 0 1 1 1\n               OpBranch %16226\n      %16226 = OpLabel\n      %11181 = OpPhi %v4float %23100 %19453 %12436 %14587 %9889 %7359 %9045 %7358 %9044 %8192 %9043 %8247\n      %14350 = OpPhi %v4float %11672 %19453 %19243 %14587 %16696 %7359 %15842 %7358 %16678 %8192 %14618 %8247\n      %15233 = OpPhi %v4float %11671 %19453 %19242 %14587 %16695 %7359 %15841 %7358 %16677 %8192 %14617 %8247\n      %14522 = OpPhi %v4float %11670 %19453 %19241 %14587 %16694 %7359 %15840 %7358 %16676 %8192 %14616 %8247\n               OpBranch %21265\n      %15207 = OpLabel\n      %21586 = OpIEqual %bool %6555 %uint_8\n               OpSelectionMerge %20263 DontFlatten\n               OpBranchConditional %21586 %6596 %8964\n       %8964 = OpLabel\n      %22069 = OpShiftRightLogical %uint %20988 %int_2\n      %13379 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22069\n      %12624 = OpLoad %uint %13379\n      %11716 = OpIAdd %uint %22069 %uint_1\n       %6415 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11716\n       %7032 = OpLoad %uint %6415\n       %8522 = OpIAdd %uint %20988 %6555\n      %21675 = OpShiftRightLogical %uint %8522 %int_2\n      %19609 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21675\n      %12625 = OpLoad %uint %19609\n      %11717 = OpIAdd %uint %21675 %uint_1\n      %24581 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11717\n      %14158 = OpLoad %uint %24581\n      %19673 = OpCompositeConstruct %v4uint %12624 %7032 %12625 %14158\n      %19501 = OpIMul %uint %uint_2 %6555\n      %10823 = OpIAdd %uint %20988 %19501\n      %17900 = OpShiftRightLogical %uint %10823 %int_2\n      %19610 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17900\n      %12626 = OpLoad %uint %19610\n      %11718 = OpIAdd %uint %17900 %uint_1\n       %6477 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11718\n      %24157 = OpLoad %uint %6477\n       %8693 = OpIMul %uint %uint_3 %6555\n      %24262 = OpIAdd %uint %20988 %8693\n      %17901 = OpShiftRightLogical %uint %24262 %int_2\n      %19611 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17901\n      %12627 = OpLoad %uint %19611\n      %11719 = OpIAdd %uint %17901 %uint_1\n      %24582 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11719\n      %16386 = OpLoad %uint %24582\n      %20790 = OpCompositeConstruct %v4uint %12626 %24157 %12627 %16386\n               OpBranch %20263\n       %6596 = OpLabel\n      %24491 = OpShiftRightLogical %uint %20988 %int_2\n      %13380 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24491\n      %12628 = OpLoad %uint %13380\n      %11720 = OpIAdd %uint %24491 %uint_1\n       %6416 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11720\n      %23664 = OpLoad %uint %6416\n      %11721 = OpIAdd %uint %24491 %uint_2\n       %6417 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11721\n      %23665 = OpLoad %uint %6417\n      %11722 = OpIAdd %uint %24491 %uint_3\n      %24583 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11722\n      %14082 = OpLoad %uint %24583\n      %21618 = OpCompositeConstruct %v4uint %12628 %23664 %23665 %14082\n      %19333 = OpIAdd %uint %20988 %uint_16\n       %8239 = OpShiftRightLogical %uint %19333 %int_2\n      %19612 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %8239\n      %12629 = OpLoad %uint %19612\n      %11723 = OpIAdd %uint %8239 %uint_1\n       %6418 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11723\n      %23666 = OpLoad %uint %6418\n      %11724 = OpIAdd %uint %8239 %uint_2\n       %6419 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11724\n      %23667 = OpLoad %uint %6419\n      %11725 = OpIAdd %uint %8239 %uint_3\n      %24584 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11725\n      %16387 = OpLoad %uint %24584\n      %20791 = OpCompositeConstruct %v4uint %12629 %23666 %23667 %16387\n               OpBranch %20263\n      %20263 = OpLabel\n      %11215 = OpPhi %v4uint %20791 %6596 %20790 %8964\n      %14114 = OpPhi %v4uint %21618 %6596 %19673 %8964\n               OpSelectionMerge %20264 None\n               OpSwitch %8576 %20312 5 %8538 7 %8248\n       %8248 = OpLabel\n      %24414 = OpCompositeExtract %uint %14114 0\n      %24684 = OpExtInst %v2float %1 UnpackHalf2x16 %24414\n      %10110 = OpCompositeExtract %float %24684 0\n      %16064 = OpCompositeExtract %float %24684 1\n      %17033 = OpCompositeExtract %uint %14114 1\n      %15613 = OpExtInst %v2float %1 UnpackHalf2x16 %17033\n      %10111 = OpCompositeExtract %float %15613 0\n      %17493 = OpCompositeExtract %float %15613 1\n      %14619 = OpCompositeConstruct %v4float %10110 %16064 %10111 %17493\n      %17289 = OpCompositeExtract %uint %14114 2\n      %18042 = OpExtInst %v2float %1 UnpackHalf2x16 %17289\n      %10112 = OpCompositeExtract %float %18042 0\n      %16065 = OpCompositeExtract %float %18042 1\n      %17034 = OpCompositeExtract %uint %14114 3\n      %15614 = OpExtInst %v2float %1 UnpackHalf2x16 %17034\n      %10113 = OpCompositeExtract %float %15614 0\n      %17494 = OpCompositeExtract %float %15614 1\n      %14620 = OpCompositeConstruct %v4float %10112 %16065 %10113 %17494\n      %17290 = OpCompositeExtract %uint %11215 0\n      %18043 = OpExtInst %v2float %1 UnpackHalf2x16 %17290\n      %10114 = OpCompositeExtract %float %18043 0\n      %16066 = OpCompositeExtract %float %18043 1\n      %17035 = OpCompositeExtract %uint %11215 1\n      %15615 = OpExtInst %v2float %1 UnpackHalf2x16 %17035\n      %10115 = OpCompositeExtract %float %15615 0\n      %17495 = OpCompositeExtract %float %15615 1\n      %14621 = OpCompositeConstruct %v4float %10114 %16066 %10115 %17495\n      %17291 = OpCompositeExtract %uint %11215 2\n      %18044 = OpExtInst %v2float %1 UnpackHalf2x16 %17291\n      %10116 = OpCompositeExtract %float %18044 0\n      %16067 = OpCompositeExtract %float %18044 1\n      %17036 = OpCompositeExtract %uint %11215 3\n      %15616 = OpExtInst %v2float %1 UnpackHalf2x16 %17036\n      %10117 = OpCompositeExtract %float %15616 0\n      %20675 = OpCompositeExtract %float %15616 1\n       %9046 = OpCompositeConstruct %v4float %10116 %16067 %10117 %20675\n               OpBranch %20264\n       %8538 = OpLabel\n       %9725 = OpVectorShuffle %v2uint %14114 %14114 0 1\n      %23358 = OpBitcast %v2int %9725\n      %24790 = OpVectorShuffle %v4int %23358 %23358 0 0 1 1\n      %18608 = OpShiftLeftLogical %v4int %24790 %290\n      %15765 = OpShiftRightArithmetic %v4int %18608 %770\n      %10935 = OpConvertSToF %v4float %15765\n      %18220 = OpVectorTimesScalar %v4float %10935 %float_0_000976592302\n      %25239 = OpExtInst %v4float %1 FMax %1284 %18220\n      %14193 = OpVectorShuffle %v2uint %14114 %14114 2 3\n       %9413 = OpBitcast %v2int %14193\n      %24791 = OpVectorShuffle %v4int %9413 %9413 0 0 1 1\n      %18609 = OpShiftLeftLogical %v4int %24791 %290\n      %15766 = OpShiftRightArithmetic %v4int %18609 %770\n      %10936 = OpConvertSToF %v4float %15766\n      %18221 = OpVectorTimesScalar %v4float %10936 %float_0_000976592302\n      %25240 = OpExtInst %v4float %1 FMax %1284 %18221\n      %14194 = OpVectorShuffle %v2uint %11215 %11215 0 1\n       %9414 = OpBitcast %v2int %14194\n      %24792 = OpVectorShuffle %v4int %9414 %9414 0 0 1 1\n      %18610 = OpShiftLeftLogical %v4int %24792 %290\n      %15767 = OpShiftRightArithmetic %v4int %18610 %770\n      %10937 = OpConvertSToF %v4float %15767\n      %18222 = OpVectorTimesScalar %v4float %10937 %float_0_000976592302\n      %25241 = OpExtInst %v4float %1 FMax %1284 %18222\n      %14195 = OpVectorShuffle %v2uint %11215 %11215 2 3\n       %9415 = OpBitcast %v2int %14195\n      %24793 = OpVectorShuffle %v4int %9415 %9415 0 0 1 1\n      %18611 = OpShiftLeftLogical %v4int %24793 %290\n      %15768 = OpShiftRightArithmetic %v4int %18611 %770\n      %10938 = OpConvertSToF %v4float %15768\n      %21441 = OpVectorTimesScalar %v4float %10938 %float_0_000976592302\n      %17252 = OpExtInst %v4float %1 FMax %1284 %21441\n               OpBranch %20264\n      %20312 = OpLabel\n       %9763 = OpVectorShuffle %v2uint %14114 %14114 0 1\n      %20827 = OpBitcast %v2float %9763\n       %7043 = OpCompositeExtract %float %20827 0\n      %13424 = OpCompositeExtract %float %20827 1\n      %17022 = OpCompositeConstruct %v4float %7043 %13424 %float_0 %float_0\n      %16862 = OpVectorShuffle %v2uint %14114 %14114 2 3\n      %14179 = OpBitcast %v2float %16862\n       %7044 = OpCompositeExtract %float %14179 0\n      %13425 = OpCompositeExtract %float %14179 1\n      %17023 = OpCompositeConstruct %v4float %7044 %13425 %float_0 %float_0\n      %16863 = OpVectorShuffle %v2uint %11215 %11215 0 1\n      %14180 = OpBitcast %v2float %16863\n       %7045 = OpCompositeExtract %float %14180 0\n      %13426 = OpCompositeExtract %float %14180 1\n      %17024 = OpCompositeConstruct %v4float %7045 %13426 %float_0 %float_0\n      %16864 = OpVectorShuffle %v2uint %11215 %11215 2 3\n      %14181 = OpBitcast %v2float %16864\n       %7046 = OpCompositeExtract %float %14181 0\n      %16650 = OpCompositeExtract %float %14181 1\n       %9047 = OpCompositeConstruct %v4float %7046 %16650 %float_0 %float_0\n               OpBranch %20264\n      %20264 = OpLabel\n      %11182 = OpPhi %v4float %9047 %20312 %17252 %8538 %9046 %8248\n      %14351 = OpPhi %v4float %17024 %20312 %25241 %8538 %14621 %8248\n      %15234 = OpPhi %v4float %17023 %20312 %25240 %8538 %14620 %8248\n      %14523 = OpPhi %v4float %17022 %20312 %25239 %8538 %14619 %8248\n               OpBranch %21265\n      %21265 = OpLabel\n      %11183 = OpPhi %v4float %11182 %20264 %11181 %16226\n      %14352 = OpPhi %v4float %14351 %20264 %14350 %16226\n      %12950 = OpPhi %v4float %15234 %20264 %15233 %16226\n      %13947 = OpPhi %v4float %14523 %20264 %14522 %16226\n      %17242 = OpFAdd %v4float %17241 %13947\n      %23298 = OpFAdd %v4float %23297 %12950\n       %7208 = OpFAdd %v4float %8082 %14352\n       %9642 = OpFAdd %v4float %20755 %11183\n      %16376 = OpIAdd %uint %24184 %14258\n               OpSelectionMerge %21266 DontFlatten\n               OpBranchConditional %23279 %15208 %16572\n      %16572 = OpLabel\n      %19166 = OpIEqual %bool %6555 %uint_4\n               OpSelectionMerge %20300 DontFlatten\n               OpBranchConditional %19166 %6597 %8965\n       %8965 = OpLabel\n      %22070 = OpShiftRightLogical %uint %16376 %int_2\n      %13381 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22070\n      %15063 = OpLoad %uint %13381\n       %8523 = OpIAdd %uint %16376 %6555\n      %21676 = OpShiftRightLogical %uint %8523 %int_2\n      %19683 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21676\n      %13120 = OpLoad %uint %19683\n       %8694 = OpIMul %uint %uint_2 %6555\n      %24264 = OpIAdd %uint %16376 %8694\n      %17902 = OpShiftRightLogical %uint %24264 %int_2\n      %19684 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17902\n      %13121 = OpLoad %uint %19684\n       %8695 = OpIMul %uint %uint_3 %6555\n      %24265 = OpIAdd %uint %16376 %8695\n      %17903 = OpShiftRightLogical %uint %24265 %int_2\n      %18692 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17903\n      %24415 = OpLoad %uint %18692\n      %20792 = OpCompositeConstruct %v4uint %15063 %13120 %13121 %24415\n               OpBranch %20300\n       %6597 = OpLabel\n      %24492 = OpShiftRightLogical %uint %16376 %int_2\n      %13382 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24492\n      %12630 = OpLoad %uint %13382\n      %11726 = OpIAdd %uint %24492 %uint_1\n       %6420 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11726\n      %23668 = OpLoad %uint %6420\n      %11727 = OpIAdd %uint %24492 %uint_2\n       %6421 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11727\n      %23669 = OpLoad %uint %6421\n      %11728 = OpIAdd %uint %24492 %uint_3\n      %24585 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11728\n      %16388 = OpLoad %uint %24585\n      %20793 = OpCompositeConstruct %v4uint %12630 %23668 %23669 %16388\n               OpBranch %20300\n      %20300 = OpLabel\n      %10946 = OpPhi %v4uint %20793 %6597 %20792 %8965\n               OpSelectionMerge %16227 None\n               OpSwitch %8576 %19454 0 %14588 1 %14588 2 %7361 10 %7361 3 %7360 12 %7360 4 %8193 6 %8249\n       %8249 = OpLabel\n      %24416 = OpCompositeExtract %uint %10946 0\n      %24685 = OpExtInst %v2float %1 UnpackHalf2x16 %24416\n      %10118 = OpCompositeExtract %float %24685 0\n      %17496 = OpCompositeExtract %float %24685 1\n      %14622 = OpCompositeConstruct %v4float %10118 %17496 %float_0 %float_0\n      %17292 = OpCompositeExtract %uint %10946 1\n      %18045 = OpExtInst %v2float %1 UnpackHalf2x16 %17292\n      %10119 = OpCompositeExtract %float %18045 0\n      %17497 = OpCompositeExtract %float %18045 1\n      %14623 = OpCompositeConstruct %v4float %10119 %17497 %float_0 %float_0\n      %17293 = OpCompositeExtract %uint %10946 2\n      %18046 = OpExtInst %v2float %1 UnpackHalf2x16 %17293\n      %10120 = OpCompositeExtract %float %18046 0\n      %17498 = OpCompositeExtract %float %18046 1\n      %14624 = OpCompositeConstruct %v4float %10120 %17498 %float_0 %float_0\n      %17294 = OpCompositeExtract %uint %10946 3\n      %18047 = OpExtInst %v2float %1 UnpackHalf2x16 %17294\n      %10121 = OpCompositeExtract %float %18047 0\n      %20676 = OpCompositeExtract %float %18047 1\n       %9048 = OpCompositeConstruct %v4float %10121 %20676 %float_0 %float_0\n               OpBranch %16227\n       %8193 = OpLabel\n      %12433 = OpCompositeExtract %uint %10946 0\n      %22688 = OpBitcast %int %12433\n      %18223 = OpCompositeConstruct %v2int %22688 %22688\n      %18361 = OpShiftLeftLogical %v2int %18223 %1959\n      %13347 = OpShiftRightArithmetic %v2int %18361 %2151\n      %10939 = OpConvertSToF %v2float %13347\n      %18259 = OpVectorTimesScalar %v2float %10939 %float_0_000976592302\n      %24082 = OpExtInst %v2float %1 FMax %73 %18259\n      %24342 = OpCompositeExtract %float %24082 0\n      %15581 = OpCompositeExtract %float %24082 1\n      %16679 = OpCompositeConstruct %v4float %24342 %15581 %float_0 %float_0\n      %19531 = OpCompositeExtract %uint %10946 1\n      %16042 = OpBitcast %int %19531\n      %18224 = OpCompositeConstruct %v2int %16042 %16042\n      %18362 = OpShiftLeftLogical %v2int %18224 %1959\n      %13348 = OpShiftRightArithmetic %v2int %18362 %2151\n      %10940 = OpConvertSToF %v2float %13348\n      %18260 = OpVectorTimesScalar %v2float %10940 %float_0_000976592302\n      %24083 = OpExtInst %v2float %1 FMax %73 %18260\n      %24343 = OpCompositeExtract %float %24083 0\n      %15582 = OpCompositeExtract %float %24083 1\n      %16680 = OpCompositeConstruct %v4float %24343 %15582 %float_0 %float_0\n      %19532 = OpCompositeExtract %uint %10946 2\n      %16043 = OpBitcast %int %19532\n      %18225 = OpCompositeConstruct %v2int %16043 %16043\n      %18363 = OpShiftLeftLogical %v2int %18225 %1959\n      %13349 = OpShiftRightArithmetic %v2int %18363 %2151\n      %10941 = OpConvertSToF %v2float %13349\n      %18261 = OpVectorTimesScalar %v2float %10941 %float_0_000976592302\n      %24084 = OpExtInst %v2float %1 FMax %73 %18261\n      %24344 = OpCompositeExtract %float %24084 0\n      %15583 = OpCompositeExtract %float %24084 1\n      %16681 = OpCompositeConstruct %v4float %24344 %15583 %float_0 %float_0\n      %19533 = OpCompositeExtract %uint %10946 3\n      %16044 = OpBitcast %int %19533\n      %18226 = OpCompositeConstruct %v2int %16044 %16044\n      %18364 = OpShiftLeftLogical %v2int %18226 %1959\n      %13350 = OpShiftRightArithmetic %v2int %18364 %2151\n      %10942 = OpConvertSToF %v2float %13350\n      %18262 = OpVectorTimesScalar %v2float %10942 %float_0_000976592302\n      %24085 = OpExtInst %v2float %1 FMax %73 %18262\n      %24345 = OpCompositeExtract %float %24085 0\n      %18767 = OpCompositeExtract %float %24085 1\n       %9049 = OpCompositeConstruct %v4float %24345 %18767 %float_0 %float_0\n               OpBranch %16227\n       %7360 = OpLabel\n      %22214 = OpCompositeExtract %uint %10946 0\n      %20243 = OpCompositeConstruct %v3uint %22214 %22214 %22214\n      %11036 = OpShiftRightLogical %v3uint %20243 %2996\n      %24050 = OpBitwiseAnd %v3uint %11036 %261\n      %18612 = OpBitwiseAnd %v3uint %11036 %1126\n      %23452 = OpShiftRightLogical %v3uint %24050 %2828\n      %16597 = OpIEqual %v3bool %23452 %2578\n      %11351 = OpExtInst %v3int %1 FindUMsb %18612\n      %10785 = OpBitcast %v3uint %11351\n       %6278 = OpISub %v3uint %2828 %10785\n       %8732 = OpIAdd %v3uint %10785 %2360\n      %10363 = OpSelect %v3uint %16597 %8732 %23452\n      %23264 = OpShiftLeftLogical %v3uint %18612 %6278\n      %18854 = OpBitwiseAnd %v3uint %23264 %1126\n      %10947 = OpSelect %v3uint %16597 %18854 %18612\n      %24586 = OpIAdd %v3uint %10363 %1018\n      %20363 = OpShiftLeftLogical %v3uint %24586 %393\n      %16306 = OpShiftLeftLogical %v3uint %10947 %141\n      %22408 = OpBitwiseOr %v3uint %20363 %16306\n      %13836 = OpIEqual %v3bool %24050 %2578\n      %16974 = OpSelect %v3uint %13836 %2578 %22408\n      %10715 = OpBitcast %v3float %16974\n      %19376 = OpShiftRightLogical %uint %22214 %uint_30\n      %18458 = OpConvertUToF %float %19376\n      %15915 = OpFMul %float %18458 %float_0_333333343\n      %21454 = OpCompositeExtract %float %10715 0\n      %10849 = OpCompositeExtract %float %10715 1\n       %7842 = OpCompositeExtract %float %10715 2\n      %15843 = OpCompositeConstruct %v4float %21454 %10849 %7842 %15915\n      %10238 = OpCompositeExtract %uint %10946 1\n      %13591 = OpCompositeConstruct %v3uint %10238 %10238 %10238\n      %11037 = OpShiftRightLogical %v3uint %13591 %2996\n      %24051 = OpBitwiseAnd %v3uint %11037 %261\n      %18613 = OpBitwiseAnd %v3uint %11037 %1126\n      %23453 = OpShiftRightLogical %v3uint %24051 %2828\n      %16598 = OpIEqual %v3bool %23453 %2578\n      %11352 = OpExtInst %v3int %1 FindUMsb %18613\n      %10786 = OpBitcast %v3uint %11352\n       %6279 = OpISub %v3uint %2828 %10786\n       %8733 = OpIAdd %v3uint %10786 %2360\n      %10364 = OpSelect %v3uint %16598 %8733 %23453\n      %23265 = OpShiftLeftLogical %v3uint %18613 %6279\n      %18855 = OpBitwiseAnd %v3uint %23265 %1126\n      %10948 = OpSelect %v3uint %16598 %18855 %18613\n      %24587 = OpIAdd %v3uint %10364 %1018\n      %20364 = OpShiftLeftLogical %v3uint %24587 %393\n      %16307 = OpShiftLeftLogical %v3uint %10948 %141\n      %22409 = OpBitwiseOr %v3uint %20364 %16307\n      %13837 = OpIEqual %v3bool %24051 %2578\n      %16975 = OpSelect %v3uint %13837 %2578 %22409\n      %10716 = OpBitcast %v3float %16975\n      %19377 = OpShiftRightLogical %uint %10238 %uint_30\n      %18459 = OpConvertUToF %float %19377\n      %15916 = OpFMul %float %18459 %float_0_333333343\n      %21455 = OpCompositeExtract %float %10716 0\n      %10850 = OpCompositeExtract %float %10716 1\n       %7843 = OpCompositeExtract %float %10716 2\n      %15844 = OpCompositeConstruct %v4float %21455 %10850 %7843 %15916\n      %10239 = OpCompositeExtract %uint %10946 2\n      %13592 = OpCompositeConstruct %v3uint %10239 %10239 %10239\n      %11038 = OpShiftRightLogical %v3uint %13592 %2996\n      %24052 = OpBitwiseAnd %v3uint %11038 %261\n      %18614 = OpBitwiseAnd %v3uint %11038 %1126\n      %23454 = OpShiftRightLogical %v3uint %24052 %2828\n      %16599 = OpIEqual %v3bool %23454 %2578\n      %11353 = OpExtInst %v3int %1 FindUMsb %18614\n      %10787 = OpBitcast %v3uint %11353\n       %6280 = OpISub %v3uint %2828 %10787\n       %8734 = OpIAdd %v3uint %10787 %2360\n      %10365 = OpSelect %v3uint %16599 %8734 %23454\n      %23266 = OpShiftLeftLogical %v3uint %18614 %6280\n      %18856 = OpBitwiseAnd %v3uint %23266 %1126\n      %10949 = OpSelect %v3uint %16599 %18856 %18614\n      %24588 = OpIAdd %v3uint %10365 %1018\n      %20365 = OpShiftLeftLogical %v3uint %24588 %393\n      %16308 = OpShiftLeftLogical %v3uint %10949 %141\n      %22410 = OpBitwiseOr %v3uint %20365 %16308\n      %13838 = OpIEqual %v3bool %24052 %2578\n      %16976 = OpSelect %v3uint %13838 %2578 %22410\n      %10717 = OpBitcast %v3float %16976\n      %19378 = OpShiftRightLogical %uint %10239 %uint_30\n      %18460 = OpConvertUToF %float %19378\n      %15917 = OpFMul %float %18460 %float_0_333333343\n      %21456 = OpCompositeExtract %float %10717 0\n      %10851 = OpCompositeExtract %float %10717 1\n       %7844 = OpCompositeExtract %float %10717 2\n      %15845 = OpCompositeConstruct %v4float %21456 %10851 %7844 %15917\n      %10240 = OpCompositeExtract %uint %10946 3\n      %13593 = OpCompositeConstruct %v3uint %10240 %10240 %10240\n      %11039 = OpShiftRightLogical %v3uint %13593 %2996\n      %24053 = OpBitwiseAnd %v3uint %11039 %261\n      %18615 = OpBitwiseAnd %v3uint %11039 %1126\n      %23455 = OpShiftRightLogical %v3uint %24053 %2828\n      %16600 = OpIEqual %v3bool %23455 %2578\n      %11354 = OpExtInst %v3int %1 FindUMsb %18615\n      %10788 = OpBitcast %v3uint %11354\n       %6281 = OpISub %v3uint %2828 %10788\n       %8735 = OpIAdd %v3uint %10788 %2360\n      %10366 = OpSelect %v3uint %16600 %8735 %23455\n      %23267 = OpShiftLeftLogical %v3uint %18615 %6281\n      %18857 = OpBitwiseAnd %v3uint %23267 %1126\n      %10950 = OpSelect %v3uint %16600 %18857 %18615\n      %24589 = OpIAdd %v3uint %10366 %1018\n      %20366 = OpShiftLeftLogical %v3uint %24589 %393\n      %16309 = OpShiftLeftLogical %v3uint %10950 %141\n      %22411 = OpBitwiseOr %v3uint %20366 %16309\n      %13839 = OpIEqual %v3bool %24053 %2578\n      %16977 = OpSelect %v3uint %13839 %2578 %22411\n      %10718 = OpBitcast %v3float %16977\n      %19379 = OpShiftRightLogical %uint %10240 %uint_30\n      %18461 = OpConvertUToF %float %19379\n      %15918 = OpFMul %float %18461 %float_0_333333343\n      %21457 = OpCompositeExtract %float %10718 0\n      %10852 = OpCompositeExtract %float %10718 1\n      %11040 = OpCompositeExtract %float %10718 2\n       %9050 = OpCompositeConstruct %v4float %21457 %10852 %11040 %15918\n               OpBranch %16227\n       %7361 = OpLabel\n      %22215 = OpCompositeExtract %uint %10946 0\n      %20244 = OpCompositeConstruct %v4uint %22215 %22215 %22215 %22215\n       %9392 = OpShiftRightLogical %v4uint %20244 %845\n      %18871 = OpBitwiseAnd %v4uint %9392 %635\n      %15552 = OpConvertUToF %v4float %18871\n      %16697 = OpFMul %v4float %15552 %2798\n      %23771 = OpCompositeExtract %uint %10946 1\n      %20822 = OpCompositeConstruct %v4uint %23771 %23771 %23771 %23771\n       %9393 = OpShiftRightLogical %v4uint %20822 %845\n      %18872 = OpBitwiseAnd %v4uint %9393 %635\n      %15553 = OpConvertUToF %v4float %18872\n      %16698 = OpFMul %v4float %15553 %2798\n      %23772 = OpCompositeExtract %uint %10946 2\n      %20823 = OpCompositeConstruct %v4uint %23772 %23772 %23772 %23772\n       %9394 = OpShiftRightLogical %v4uint %20823 %845\n      %18873 = OpBitwiseAnd %v4uint %9394 %635\n      %15554 = OpConvertUToF %v4float %18873\n      %16699 = OpFMul %v4float %15554 %2798\n      %23773 = OpCompositeExtract %uint %10946 3\n      %20828 = OpCompositeConstruct %v4uint %23773 %23773 %23773 %23773\n       %9395 = OpShiftRightLogical %v4uint %20828 %845\n      %18874 = OpBitwiseAnd %v4uint %9395 %635\n      %18738 = OpConvertUToF %v4float %18874\n       %9890 = OpFMul %v4float %18738 %2798\n               OpBranch %16227\n      %14588 = OpLabel\n      %22216 = OpCompositeExtract %uint %10946 0\n      %20245 = OpCompositeConstruct %v4uint %22216 %22216 %22216 %22216\n       %9396 = OpShiftRightLogical %v4uint %20245 %653\n      %19042 = OpBitwiseAnd %v4uint %9396 %1611\n      %13995 = OpConvertUToF %v4float %19042\n      %19244 = OpVectorTimesScalar %v4float %13995 %float_0_00392156886\n       %8616 = OpCompositeExtract %uint %10946 1\n      %24852 = OpCompositeConstruct %v4uint %8616 %8616 %8616 %8616\n       %9397 = OpShiftRightLogical %v4uint %24852 %653\n      %19043 = OpBitwiseAnd %v4uint %9397 %1611\n      %13996 = OpConvertUToF %v4float %19043\n      %19245 = OpVectorTimesScalar %v4float %13996 %float_0_00392156886\n       %8617 = OpCompositeExtract %uint %10946 2\n      %24853 = OpCompositeConstruct %v4uint %8617 %8617 %8617 %8617\n       %9398 = OpShiftRightLogical %v4uint %24853 %653\n      %19044 = OpBitwiseAnd %v4uint %9398 %1611\n      %13997 = OpConvertUToF %v4float %19044\n      %19246 = OpVectorTimesScalar %v4float %13997 %float_0_00392156886\n       %8618 = OpCompositeExtract %uint %10946 3\n      %24854 = OpCompositeConstruct %v4uint %8618 %8618 %8618 %8618\n       %9399 = OpShiftRightLogical %v4uint %24854 %653\n      %19045 = OpBitwiseAnd %v4uint %9399 %1611\n      %17181 = OpConvertUToF %v4float %19045\n      %12437 = OpVectorTimesScalar %v4float %17181 %float_0_00392156886\n               OpBranch %16227\n      %19454 = OpLabel\n      %12438 = OpCompositeExtract %uint %10946 0\n      %20465 = OpBitcast %float %12438\n      %17215 = OpCompositeConstruct %v2float %20465 %float_0\n      %11673 = OpVectorShuffle %v4float %17215 %17215 0 1 1 1\n      %22202 = OpCompositeExtract %uint %10946 1\n      %16241 = OpBitcast %float %22202\n      %17216 = OpCompositeConstruct %v2float %16241 %float_0\n      %11674 = OpVectorShuffle %v4float %17216 %17216 0 1 1 1\n      %22203 = OpCompositeExtract %uint %10946 2\n      %16242 = OpBitcast %float %22203\n      %17217 = OpCompositeConstruct %v2float %16242 %float_0\n      %11675 = OpVectorShuffle %v4float %17217 %17217 0 1 1 1\n      %22204 = OpCompositeExtract %uint %10946 3\n      %16243 = OpBitcast %float %22204\n      %20401 = OpCompositeConstruct %v2float %16243 %float_0\n      %23101 = OpVectorShuffle %v4float %20401 %20401 0 1 1 1\n               OpBranch %16227\n      %16227 = OpLabel\n      %11184 = OpPhi %v4float %23101 %19454 %12437 %14588 %9890 %7361 %9050 %7360 %9049 %8193 %9048 %8249\n      %14353 = OpPhi %v4float %11675 %19454 %19246 %14588 %16699 %7361 %15845 %7360 %16681 %8193 %14624 %8249\n      %15235 = OpPhi %v4float %11674 %19454 %19245 %14588 %16698 %7361 %15844 %7360 %16680 %8193 %14623 %8249\n      %14524 = OpPhi %v4float %11673 %19454 %19244 %14588 %16697 %7361 %15843 %7360 %16679 %8193 %14622 %8249\n               OpBranch %21266\n      %15208 = OpLabel\n      %21587 = OpIEqual %bool %6555 %uint_8\n               OpSelectionMerge %20265 DontFlatten\n               OpBranchConditional %21587 %6598 %8966\n       %8966 = OpLabel\n      %22071 = OpShiftRightLogical %uint %16376 %int_2\n      %13383 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22071\n      %12631 = OpLoad %uint %13383\n      %11729 = OpIAdd %uint %22071 %uint_1\n       %6422 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11729\n       %7033 = OpLoad %uint %6422\n       %8524 = OpIAdd %uint %16376 %6555\n      %21677 = OpShiftRightLogical %uint %8524 %int_2\n      %19613 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21677\n      %12632 = OpLoad %uint %19613\n      %11730 = OpIAdd %uint %21677 %uint_1\n      %24590 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11730\n      %14160 = OpLoad %uint %24590\n      %19674 = OpCompositeConstruct %v4uint %12631 %7033 %12632 %14160\n      %19502 = OpIMul %uint %uint_2 %6555\n      %10824 = OpIAdd %uint %16376 %19502\n      %17904 = OpShiftRightLogical %uint %10824 %int_2\n      %19614 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17904\n      %12633 = OpLoad %uint %19614\n      %11731 = OpIAdd %uint %17904 %uint_1\n       %6478 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11731\n      %24158 = OpLoad %uint %6478\n       %8696 = OpIMul %uint %uint_3 %6555\n      %24266 = OpIAdd %uint %16376 %8696\n      %17905 = OpShiftRightLogical %uint %24266 %int_2\n      %19615 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17905\n      %12634 = OpLoad %uint %19615\n      %11732 = OpIAdd %uint %17905 %uint_1\n      %24591 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11732\n      %16389 = OpLoad %uint %24591\n      %20794 = OpCompositeConstruct %v4uint %12633 %24158 %12634 %16389\n               OpBranch %20265\n       %6598 = OpLabel\n      %24493 = OpShiftRightLogical %uint %16376 %int_2\n      %13384 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24493\n      %12635 = OpLoad %uint %13384\n      %11733 = OpIAdd %uint %24493 %uint_1\n       %6423 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11733\n      %23670 = OpLoad %uint %6423\n      %11734 = OpIAdd %uint %24493 %uint_2\n       %6424 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11734\n      %23671 = OpLoad %uint %6424\n      %11735 = OpIAdd %uint %24493 %uint_3\n      %24592 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11735\n      %14083 = OpLoad %uint %24592\n      %21619 = OpCompositeConstruct %v4uint %12635 %23670 %23671 %14083\n      %19334 = OpIAdd %uint %16376 %uint_16\n       %8240 = OpShiftRightLogical %uint %19334 %int_2\n      %19616 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %8240\n      %12636 = OpLoad %uint %19616\n      %11736 = OpIAdd %uint %8240 %uint_1\n       %6425 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11736\n      %23672 = OpLoad %uint %6425\n      %11737 = OpIAdd %uint %8240 %uint_2\n       %6426 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11737\n      %23673 = OpLoad %uint %6426\n      %11738 = OpIAdd %uint %8240 %uint_3\n      %24593 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11738\n      %16390 = OpLoad %uint %24593\n      %20795 = OpCompositeConstruct %v4uint %12636 %23672 %23673 %16390\n               OpBranch %20265\n      %20265 = OpLabel\n      %11216 = OpPhi %v4uint %20795 %6598 %20794 %8966\n      %14115 = OpPhi %v4uint %21619 %6598 %19674 %8966\n               OpSelectionMerge %20266 None\n               OpSwitch %8576 %20313 5 %8539 7 %8250\n       %8250 = OpLabel\n      %24417 = OpCompositeExtract %uint %14115 0\n      %24686 = OpExtInst %v2float %1 UnpackHalf2x16 %24417\n      %10122 = OpCompositeExtract %float %24686 0\n      %16068 = OpCompositeExtract %float %24686 1\n      %17037 = OpCompositeExtract %uint %14115 1\n      %15617 = OpExtInst %v2float %1 UnpackHalf2x16 %17037\n      %10123 = OpCompositeExtract %float %15617 0\n      %17499 = OpCompositeExtract %float %15617 1\n      %14625 = OpCompositeConstruct %v4float %10122 %16068 %10123 %17499\n      %17295 = OpCompositeExtract %uint %14115 2\n      %18048 = OpExtInst %v2float %1 UnpackHalf2x16 %17295\n      %10124 = OpCompositeExtract %float %18048 0\n      %16069 = OpCompositeExtract %float %18048 1\n      %17038 = OpCompositeExtract %uint %14115 3\n      %15618 = OpExtInst %v2float %1 UnpackHalf2x16 %17038\n      %10125 = OpCompositeExtract %float %15618 0\n      %17500 = OpCompositeExtract %float %15618 1\n      %14626 = OpCompositeConstruct %v4float %10124 %16069 %10125 %17500\n      %17296 = OpCompositeExtract %uint %11216 0\n      %18049 = OpExtInst %v2float %1 UnpackHalf2x16 %17296\n      %10126 = OpCompositeExtract %float %18049 0\n      %16070 = OpCompositeExtract %float %18049 1\n      %17039 = OpCompositeExtract %uint %11216 1\n      %15619 = OpExtInst %v2float %1 UnpackHalf2x16 %17039\n      %10127 = OpCompositeExtract %float %15619 0\n      %17501 = OpCompositeExtract %float %15619 1\n      %14627 = OpCompositeConstruct %v4float %10126 %16070 %10127 %17501\n      %17297 = OpCompositeExtract %uint %11216 2\n      %18050 = OpExtInst %v2float %1 UnpackHalf2x16 %17297\n      %10128 = OpCompositeExtract %float %18050 0\n      %16071 = OpCompositeExtract %float %18050 1\n      %17040 = OpCompositeExtract %uint %11216 3\n      %15620 = OpExtInst %v2float %1 UnpackHalf2x16 %17040\n      %10129 = OpCompositeExtract %float %15620 0\n      %20677 = OpCompositeExtract %float %15620 1\n       %9051 = OpCompositeConstruct %v4float %10128 %16071 %10129 %20677\n               OpBranch %20266\n       %8539 = OpLabel\n       %9726 = OpVectorShuffle %v2uint %14115 %14115 0 1\n      %23359 = OpBitcast %v2int %9726\n      %24794 = OpVectorShuffle %v4int %23359 %23359 0 0 1 1\n      %18616 = OpShiftLeftLogical %v4int %24794 %290\n      %15769 = OpShiftRightArithmetic %v4int %18616 %770\n      %10951 = OpConvertSToF %v4float %15769\n      %18227 = OpVectorTimesScalar %v4float %10951 %float_0_000976592302\n      %25242 = OpExtInst %v4float %1 FMax %1284 %18227\n      %14196 = OpVectorShuffle %v2uint %14115 %14115 2 3\n       %9416 = OpBitcast %v2int %14196\n      %24795 = OpVectorShuffle %v4int %9416 %9416 0 0 1 1\n      %18617 = OpShiftLeftLogical %v4int %24795 %290\n      %15770 = OpShiftRightArithmetic %v4int %18617 %770\n      %10952 = OpConvertSToF %v4float %15770\n      %18228 = OpVectorTimesScalar %v4float %10952 %float_0_000976592302\n      %25243 = OpExtInst %v4float %1 FMax %1284 %18228\n      %14197 = OpVectorShuffle %v2uint %11216 %11216 0 1\n       %9417 = OpBitcast %v2int %14197\n      %24796 = OpVectorShuffle %v4int %9417 %9417 0 0 1 1\n      %18618 = OpShiftLeftLogical %v4int %24796 %290\n      %15771 = OpShiftRightArithmetic %v4int %18618 %770\n      %10953 = OpConvertSToF %v4float %15771\n      %18229 = OpVectorTimesScalar %v4float %10953 %float_0_000976592302\n      %25244 = OpExtInst %v4float %1 FMax %1284 %18229\n      %14198 = OpVectorShuffle %v2uint %11216 %11216 2 3\n       %9418 = OpBitcast %v2int %14198\n      %24797 = OpVectorShuffle %v4int %9418 %9418 0 0 1 1\n      %18620 = OpShiftLeftLogical %v4int %24797 %290\n      %15772 = OpShiftRightArithmetic %v4int %18620 %770\n      %10954 = OpConvertSToF %v4float %15772\n      %21458 = OpVectorTimesScalar %v4float %10954 %float_0_000976592302\n      %17253 = OpExtInst %v4float %1 FMax %1284 %21458\n               OpBranch %20266\n      %20313 = OpLabel\n       %9764 = OpVectorShuffle %v2uint %14115 %14115 0 1\n      %20829 = OpBitcast %v2float %9764\n       %7047 = OpCompositeExtract %float %20829 0\n      %13427 = OpCompositeExtract %float %20829 1\n      %17041 = OpCompositeConstruct %v4float %7047 %13427 %float_0 %float_0\n      %16865 = OpVectorShuffle %v2uint %14115 %14115 2 3\n      %14182 = OpBitcast %v2float %16865\n       %7048 = OpCompositeExtract %float %14182 0\n      %13428 = OpCompositeExtract %float %14182 1\n      %17042 = OpCompositeConstruct %v4float %7048 %13428 %float_0 %float_0\n      %16866 = OpVectorShuffle %v2uint %11216 %11216 0 1\n      %14183 = OpBitcast %v2float %16866\n       %7049 = OpCompositeExtract %float %14183 0\n      %13429 = OpCompositeExtract %float %14183 1\n      %17043 = OpCompositeConstruct %v4float %7049 %13429 %float_0 %float_0\n      %16867 = OpVectorShuffle %v2uint %11216 %11216 2 3\n      %14184 = OpBitcast %v2float %16867\n       %7050 = OpCompositeExtract %float %14184 0\n      %16651 = OpCompositeExtract %float %14184 1\n       %9052 = OpCompositeConstruct %v4float %7050 %16651 %float_0 %float_0\n               OpBranch %20266\n      %20266 = OpLabel\n      %11185 = OpPhi %v4float %9052 %20313 %17253 %8539 %9051 %8250\n      %14354 = OpPhi %v4float %17043 %20313 %25244 %8539 %14627 %8250\n      %15236 = OpPhi %v4float %17042 %20313 %25243 %8539 %14626 %8250\n      %14525 = OpPhi %v4float %17041 %20313 %25242 %8539 %14625 %8250\n               OpBranch %21266\n      %21266 = OpLabel\n      %11186 = OpPhi %v4float %11185 %20266 %11184 %16227\n      %14355 = OpPhi %v4float %14354 %20266 %14353 %16227\n      %12951 = OpPhi %v4float %15236 %20266 %15235 %16227\n      %13948 = OpPhi %v4float %14525 %20266 %14524 %16227\n      %17243 = OpFAdd %v4float %17242 %13948\n      %23299 = OpFAdd %v4float %23298 %12951\n       %9507 = OpFAdd %v4float %7208 %14355\n       %7799 = OpFAdd %v4float %9642 %11186\n               OpBranch %24267\n      %24267 = OpLabel\n      %11187 = OpPhi %v4float %20755 %21264 %7799 %21266\n      %14356 = OpPhi %v4float %8082 %21264 %9507 %21266\n      %15153 = OpPhi %v4float %23297 %21264 %23299 %21266\n      %15237 = OpPhi %v4float %17241 %21264 %17243 %21266\n      %14526 = OpPhi %float %25083 %21264 %12090 %21266\n               OpBranch %21267\n      %21267 = OpLabel\n      %11188 = OpPhi %v4float %11177 %21263 %11187 %24267\n      %14357 = OpPhi %v4float %14346 %21263 %14356 %24267\n      %15154 = OpPhi %v4float %13804 %21263 %15153 %24267\n      %13196 = OpPhi %v4float %8403 %21263 %15237 %24267\n      %11944 = OpPhi %float %11052 %21263 %14526 %24267\n      %23156 = OpVectorTimesScalar %v4float %13196 %11944\n       %6604 = OpVectorTimesScalar %v4float %15154 %11944\n      %12399 = OpVectorTimesScalar %v4float %14357 %11944\n      %13362 = OpVectorTimesScalar %v4float %11188 %11944\n               OpSelectionMerge %16228 DontFlatten\n               OpBranchConditional %7475 %10049 %16228\n      %10049 = OpLabel\n      %15086 = OpVectorShuffle %v4float %23156 %23156 2 1 0 3\n      %14855 = OpVectorShuffle %v4float %6604 %6604 2 1 0 3\n       %7398 = OpVectorShuffle %v4float %12399 %12399 2 1 0 3\n      %16111 = OpVectorShuffle %v4float %13362 %13362 2 1 0 3\n               OpBranch %16228\n      %16228 = OpLabel\n      %11189 = OpPhi %v4float %13362 %21267 %16111 %10049\n      %14358 = OpPhi %v4float %12399 %21267 %7398 %10049\n      %15191 = OpPhi %v4float %6604 %21267 %14855 %10049\n      %14921 = OpPhi %v4float %23156 %21267 %15086 %10049\n               OpSelectionMerge %23460 None\n               OpSwitch %20627 %7373 26 %18070 32 %9492\n       %9492 = OpLabel\n      %15022 = OpCompositeExtract %float %14921 0\n       %9197 = OpCompositeExtract %float %14921 1\n      %19232 = OpCompositeConstruct %v2float %15022 %9197\n       %8561 = OpExtInst %uint %1 PackHalf2x16 %19232\n      %23487 = OpCompositeExtract %float %14921 2\n      %14759 = OpCompositeExtract %float %14921 3\n      %19233 = OpCompositeConstruct %v2float %23487 %14759\n       %8562 = OpExtInst %uint %1 PackHalf2x16 %19233\n      %23488 = OpCompositeExtract %float %15191 0\n      %14760 = OpCompositeExtract %float %15191 1\n      %19234 = OpCompositeConstruct %v2float %23488 %14760\n       %8563 = OpExtInst %uint %1 PackHalf2x16 %19234\n      %23489 = OpCompositeExtract %float %15191 2\n      %14761 = OpCompositeExtract %float %15191 3\n      %19213 = OpCompositeConstruct %v2float %23489 %14761\n       %8736 = OpExtInst %uint %1 PackHalf2x16 %19213\n      %12637 = OpCompositeConstruct %v4uint %8561 %8562 %8563 %8736\n      %16072 = OpCompositeExtract %float %14358 0\n      %21620 = OpCompositeExtract %float %14358 1\n      %19247 = OpCompositeConstruct %v2float %16072 %21620\n       %8564 = OpExtInst %uint %1 PackHalf2x16 %19247\n      %23490 = OpCompositeExtract %float %14358 2\n      %14762 = OpCompositeExtract %float %14358 3\n      %19248 = OpCompositeConstruct %v2float %23490 %14762\n       %8565 = OpExtInst %uint %1 PackHalf2x16 %19248\n      %23491 = OpCompositeExtract %float %11189 0\n      %14763 = OpCompositeExtract %float %11189 1\n      %19249 = OpCompositeConstruct %v2float %23491 %14763\n       %8566 = OpExtInst %uint %1 PackHalf2x16 %19249\n      %23492 = OpCompositeExtract %float %11189 2\n      %14764 = OpCompositeExtract %float %11189 3\n      %19214 = OpCompositeConstruct %v2float %23492 %14764\n      %11926 = OpExtInst %uint %1 PackHalf2x16 %19214\n      %24879 = OpCompositeConstruct %v4uint %8564 %8565 %8566 %11926\n               OpBranch %23460\n      %18070 = OpLabel\n       %7311 = OpExtInst %v4float %1 FClamp %14921 %2938 %1285\n      %20339 = OpVectorTimesScalar %v4float %7311 %float_65535\n      %11840 = OpFAdd %v4float %20339 %325\n       %7947 = OpConvertFToU %v4uint %11840\n       %6361 = OpVectorShuffle %v2uint %7947 %7947 0 2\n      %10064 = OpVectorShuffle %v2uint %7947 %7947 1 3\n      %10446 = OpShiftLeftLogical %v2uint %10064 %2151\n      %22473 = OpBitwiseOr %v2uint %6361 %10446\n      %18828 = OpCompositeExtract %uint %22473 0\n      %15356 = OpCompositeExtract %uint %22473 1\n      %14161 = OpExtInst %v4float %1 FClamp %15191 %2938 %1285\n      %11265 = OpVectorTimesScalar %v4float %14161 %float_65535\n      %11841 = OpFAdd %v4float %11265 %325\n       %7948 = OpConvertFToU %v4uint %11841\n       %6362 = OpVectorShuffle %v2uint %7948 %7948 0 2\n      %10065 = OpVectorShuffle %v2uint %7948 %7948 1 3\n      %10447 = OpShiftLeftLogical %v2uint %10065 %2151\n      %22474 = OpBitwiseOr %v2uint %6362 %10447\n      %20077 = OpCompositeExtract %uint %22474 0\n      %22635 = OpCompositeExtract %uint %22474 1\n       %7479 = OpCompositeConstruct %v4uint %18828 %15356 %20077 %22635\n      %14406 = OpExtInst %v4float %1 FClamp %14358 %2938 %1285\n      %13687 = OpVectorTimesScalar %v4float %14406 %float_65535\n      %11842 = OpFAdd %v4float %13687 %325\n       %7949 = OpConvertFToU %v4uint %11842\n       %6363 = OpVectorShuffle %v2uint %7949 %7949 0 2\n      %10066 = OpVectorShuffle %v2uint %7949 %7949 1 3\n      %10448 = OpShiftLeftLogical %v2uint %10066 %2151\n      %22475 = OpBitwiseOr %v2uint %6363 %10448\n      %18829 = OpCompositeExtract %uint %22475 0\n      %15357 = OpCompositeExtract %uint %22475 1\n      %14162 = OpExtInst %v4float %1 FClamp %11189 %2938 %1285\n      %11266 = OpVectorTimesScalar %v4float %14162 %float_65535\n      %11843 = OpFAdd %v4float %11266 %325\n       %7950 = OpConvertFToU %v4uint %11843\n       %6364 = OpVectorShuffle %v2uint %7950 %7950 0 2\n      %10067 = OpVectorShuffle %v2uint %7950 %7950 1 3\n      %10449 = OpShiftLeftLogical %v2uint %10067 %2151\n      %22476 = OpBitwiseOr %v2uint %6364 %10449\n      %20078 = OpCompositeExtract %uint %22476 0\n       %8024 = OpCompositeExtract %uint %22476 1\n       %9053 = OpCompositeConstruct %v4uint %18829 %15357 %20078 %8024\n               OpBranch %23460\n       %7373 = OpLabel\n      %19885 = OpCompositeExtract %float %14921 0\n      %10277 = OpCompositeExtract %float %14921 1\n       %7641 = OpCompositeExtract %float %15191 0\n       %8650 = OpCompositeExtract %float %15191 1\n       %8414 = OpCompositeConstruct %v4float %19885 %10277 %7641 %8650\n      %17959 = OpBitcast %v4uint %8414\n      %11089 = OpCompositeExtract %float %14358 0\n      %13283 = OpCompositeExtract %float %14358 1\n       %7642 = OpCompositeExtract %float %11189 0\n       %8651 = OpCompositeExtract %float %11189 1\n      %11606 = OpCompositeConstruct %v4float %11089 %13283 %7642 %8651\n      %11139 = OpBitcast %v4uint %11606\n               OpBranch %23460\n      %23460 = OpLabel\n       %9750 = OpPhi %v4uint %11139 %7373 %9053 %18070 %24879 %9492\n      %13261 = OpPhi %v4uint %17959 %7373 %7479 %18070 %12637 %9492\n      %19928 = OpIEqual %bool %7640 %uint_0\n      %22246 = OpSelect %bool %19928 %false %19928\n               OpSelectionMerge %19649 DontFlatten\n               OpBranchConditional %22246 %9760 %19649\n       %9760 = OpLabel\n      %17298 = OpCompositeExtract %uint %13261 2\n      %21174 = OpCompositeInsert %v4uint %17298 %13261 0\n      %23044 = OpCompositeExtract %uint %13261 3\n       %9296 = OpCompositeInsert %v4uint %23044 %21174 1\n               OpBranch %19649\n      %19649 = OpLabel\n      %12383 = OpPhi %v4uint %13261 %23460 %9296 %9760\n      %12967 = OpIAdd %v2uint %12025 %23020\n               OpSelectionMerge %21237 DontFlatten\n               OpBranchConditional %20495 %10574 %21373\n      %21373 = OpLabel\n      %10608 = OpBitcast %v2int %12967\n      %17907 = OpCompositeExtract %int %10608 1\n      %19904 = OpShiftRightArithmetic %int %17907 %int_5\n      %22412 = OpBitcast %int %8444\n       %7938 = OpIMul %int %19904 %22412\n      %25154 = OpCompositeExtract %int %10608 0\n      %20423 = OpShiftRightArithmetic %int %25154 %int_5\n      %18875 = OpIAdd %int %7938 %20423\n       %9546 = OpShiftLeftLogical %int %18875 %int_6\n      %24635 = OpShiftRightArithmetic %int %17907 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25154 %int_7\n      %11041 = OpBitwiseOr %int %21322 %20133\n      %17334 = OpBitwiseOr %int %9546 %11041\n      %24163 = OpShiftLeftLogical %int %17334 %uint_3\n      %12766 = OpShiftRightArithmetic %int %17907 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25154 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %17907 %int_3\n      %20574 = OpBitwiseAnd %int %10425 %int_1\n      %21533 = OpShiftLeftLogical %int %20574 %int_1\n       %8890 = OpBitwiseXor %int %20766 %21533\n      %20598 = OpBitwiseAnd %int %17907 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6551\n       %7168 = OpShiftLeftLogical %int %21575 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24163 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24163 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24163 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24163 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %21237\n      %10574 = OpLabel\n      %19866 = OpCompositeExtract %uint %12967 0\n      %11267 = OpCompositeExtract %uint %12967 1\n       %8415 = OpCompositeConstruct %v3uint %19866 %11267 %24434\n      %20125 = OpBitcast %v3int %8415\n      %11255 = OpCompositeExtract %int %20125 2\n      %19905 = OpShiftRightArithmetic %int %11255 %int_2\n      %22413 = OpBitcast %int %25203\n       %7939 = OpIMul %int %19905 %22413\n      %25155 = OpCompositeExtract %int %20125 1\n      %19055 = OpShiftRightArithmetic %int %25155 %int_4\n      %11053 = OpIAdd %int %7939 %19055\n      %16898 = OpBitcast %int %8444\n      %14944 = OpIMul %int %11053 %16898\n      %25156 = OpCompositeExtract %int %20125 0\n      %20424 = OpShiftRightArithmetic %int %25156 %int_5\n      %18940 = OpIAdd %int %14944 %20424\n       %8797 = OpShiftLeftLogical %int %18940 %int_7\n      %11434 = OpBitwiseAnd %int %11255 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %25155 %int_1\n      %21364 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21364 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %25156 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17335 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17335 %uint_3\n      %13015 = OpShiftRightArithmetic %int %25155 %int_3\n       %9929 = OpBitwiseXor %int %13015 %19905\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %25156 %int_3\n      %20575 = OpBitwiseAnd %int %9616 %int_3\n      %21534 = OpShiftLeftLogical %int %16793 %int_1\n       %8891 = OpBitwiseXor %int %20575 %21534\n      %20599 = OpBitwiseAnd %int %25155 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6552\n       %7169 = OpShiftLeftLogical %int %16793 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24144 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24144 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24144 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24144 %int_8\n      %10278 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10278\n      %16870 = OpBitcast %uint %15226\n               OpBranch %21237\n      %21237 = OpLabel\n      %11376 = OpPhi %uint %16870 %10574 %16869 %21373\n      %20616 = OpIAdd %uint %11376 %25270\n      %20138 = OpShiftRightLogical %uint %20616 %int_4\n      %19356 = OpIEqual %bool %19164 %uint_4\n               OpSelectionMerge %14780 None\n               OpBranchConditional %19356 %13279 %14780\n      %13279 = OpLabel\n       %7958 = OpVectorShuffle %v4uint %12383 %12383 1 0 3 2\n               OpBranch %14780\n      %14780 = OpLabel\n      %22898 = OpPhi %v4uint %12383 %21237 %7958 %13279\n       %6605 = OpSelect %uint %19356 %uint_2 %19164\n      %13412 = OpIEqual %bool %6605 %uint_1\n      %18370 = OpIEqual %bool %6605 %uint_2\n      %22150 = OpLogicalOr %bool %13412 %18370\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %22898 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %22898 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16377 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22650 = OpPhi %v4uint %22898 %14780 %16377 %10583\n      %19638 = OpIEqual %bool %6605 %uint_3\n      %15139 = OpLogicalOr %bool %18370 %19638\n               OpSelectionMerge %11416 None\n               OpBranchConditional %15139 %11064 %11416\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22650 %749\n      %15335 = OpShiftRightLogical %v4uint %22650 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %11416\n      %11416 = OpLabel\n      %19767 = OpPhi %v4uint %22650 %13411 %10728 %11064\n      %24825 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_dest %int_0 %20138\n               OpStore %24825 %19767\n      %11739 = OpIAdd %uint %20616 %uint_32\n      %16881 = OpShiftRightLogical %uint %11739 %int_4\n               OpSelectionMerge %16262 None\n               OpBranchConditional %19356 %13280 %16262\n      %13280 = OpLabel\n       %7959 = OpVectorShuffle %v4uint %9750 %9750 1 0 3 2\n               OpBranch %16262\n      %16262 = OpLabel\n      %10955 = OpPhi %v4uint %9750 %11416 %7959 %13280\n               OpSelectionMerge %14874 None\n               OpBranchConditional %22150 %10584 %14874\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %10955 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %10955 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16378 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %14874\n      %14874 = OpLabel\n      %10956 = OpPhi %v4uint %10955 %16262 %16378 %10584\n               OpSelectionMerge %11417 None\n               OpBranchConditional %15139 %11065 %11417\n      %11065 = OpLabel\n      %24088 = OpShiftLeftLogical %v4uint %10956 %749\n      %15336 = OpShiftRightLogical %v4uint %10956 %749\n      %10729 = OpBitwiseOr %v4uint %24088 %15336\n               OpBranch %11417\n      %11417 = OpLabel\n      %19768 = OpPhi %v4uint %10956 %14874 %10729 %11065\n       %8054 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_dest %int_0 %16881\n               OpStore %8054 %19768\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t resolve_full_64bpp_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x000062B7, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000008, 0x00000008, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x0000040B, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x00090006, 0x0000040B, 0x00000000, 0x725F6578,\n    0x6C6F7365, 0x655F6576, 0x6D617264, 0x666E695F, 0x0000006F, 0x000A0006,\n    0x0000040B, 0x00000001, 0x725F6578, 0x6C6F7365, 0x635F6576, 0x64726F6F,\n    0x74616E69, 0x6E695F65, 0x00006F66, 0x00090006, 0x0000040B, 0x00000002,\n    0x725F6578, 0x6C6F7365, 0x645F6576, 0x5F747365, 0x6F666E69, 0x00000000,\n    0x000B0006, 0x0000040B, 0x00000003, 0x725F6578, 0x6C6F7365, 0x645F6576,\n    0x5F747365, 0x726F6F63, 0x616E6964, 0x695F6574, 0x006F666E, 0x00090006,\n    0x0000040B, 0x00000004, 0x725F6578, 0x6C6F7365, 0x645F6576, 0x5F747365,\n    0x65736162, 0x00000000, 0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F,\n    0x5F737473, 0x00006578, 0x00090005, 0x0000079C, 0x725F6578, 0x6C6F7365,\n    0x655F6576, 0x6D617264, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x0000079C, 0x00000000, 0x61746164, 0x00000000, 0x00070005, 0x00000CC7,\n    0x725F6578, 0x6C6F7365, 0x655F6576, 0x6D617264, 0x00000000, 0x00080005,\n    0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F, 0x496E6F69,\n    0x00000044, 0x00090005, 0x000007B4, 0x725F6578, 0x6C6F7365, 0x645F6576,\n    0x5F747365, 0x625F6578, 0x6B636F6C, 0x00000000, 0x00050006, 0x000007B4,\n    0x00000000, 0x61746164, 0x00000000, 0x00060005, 0x00001592, 0x725F6578,\n    0x6C6F7365, 0x645F6576, 0x00747365, 0x00030047, 0x0000040B, 0x00000002,\n    0x00050048, 0x0000040B, 0x00000000, 0x00000023, 0x00000000, 0x00050048,\n    0x0000040B, 0x00000001, 0x00000023, 0x00000004, 0x00050048, 0x0000040B,\n    0x00000002, 0x00000023, 0x00000008, 0x00050048, 0x0000040B, 0x00000003,\n    0x00000023, 0x0000000C, 0x00050048, 0x0000040B, 0x00000004, 0x00000023,\n    0x00000010, 0x00040047, 0x000007D0, 0x00000006, 0x00000004, 0x00030047,\n    0x0000079C, 0x00000003, 0x00040048, 0x0000079C, 0x00000000, 0x00000018,\n    0x00050048, 0x0000079C, 0x00000000, 0x00000023, 0x00000000, 0x00030047,\n    0x00000CC7, 0x00000018, 0x00040047, 0x00000CC7, 0x00000021, 0x00000000,\n    0x00040047, 0x00000CC7, 0x00000022, 0x00000000, 0x00040047, 0x00000F48,\n    0x0000000B, 0x0000001C, 0x00040047, 0x000007DC, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B4, 0x00000003, 0x00040048, 0x000007B4, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B4, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x00001592, 0x00000019, 0x00040047, 0x00001592, 0x00000021,\n    0x00000000, 0x00040047, 0x00001592, 0x00000022, 0x00000001, 0x00040047,\n    0x00000AC8, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000C, 0x00000020, 0x00000001,\n    0x00040017, 0x00000012, 0x0000000C, 0x00000002, 0x00040015, 0x0000000B,\n    0x00000020, 0x00000000, 0x00040017, 0x00000011, 0x0000000B, 0x00000002,\n    0x00040017, 0x00000014, 0x0000000B, 0x00000003, 0x00040017, 0x00000017,\n    0x0000000B, 0x00000004, 0x00030016, 0x0000000D, 0x00000020, 0x00040017,\n    0x00000013, 0x0000000D, 0x00000002, 0x00040017, 0x0000001D, 0x0000000D,\n    0x00000004, 0x00020014, 0x00000009, 0x00040017, 0x00000016, 0x0000000C,\n    0x00000003, 0x0004002B, 0x0000000D, 0x00000A0C, 0x00000000, 0x0004002B,\n    0x0000000D, 0x0000008A, 0x3F800000, 0x0004002B, 0x0000000B, 0x00000A0D,\n    0x00000001, 0x0004002B, 0x0000000B, 0x00000A10, 0x00000002, 0x0004002B,\n    0x0000000B, 0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B, 0x00000A22,\n    0x00000008, 0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00, 0x0004002B,\n    0x0000000B, 0x00000A13, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A3A,\n    0x00000010, 0x0004002B, 0x0000000B, 0x00000A16, 0x00000004, 0x0004002B,\n    0x0000000D, 0x0000022D, 0x477FFF00, 0x0004002B, 0x0000000D, 0x000000FC,\n    0x3F000000, 0x0004002B, 0x0000000C, 0x00000A3B, 0x00000010, 0x0004002B,\n    0x0000000B, 0x00000A0A, 0x00000000, 0x0004002B, 0x0000000B, 0x00000A52,\n    0x00000018, 0x0007002C, 0x00000017, 0x0000028D, 0x00000A0A, 0x00000A22,\n    0x00000A3A, 0x00000A52, 0x0004002B, 0x0000000B, 0x00000144, 0x000000FF,\n    0x0004002B, 0x0000000D, 0x0000017A, 0x3B808081, 0x0004002B, 0x0000000B,\n    0x00000A28, 0x0000000A, 0x0004002B, 0x0000000B, 0x00000A46, 0x00000014,\n    0x0004002B, 0x0000000B, 0x00000A64, 0x0000001E, 0x0007002C, 0x00000017,\n    0x0000034D, 0x00000A0A, 0x00000A28, 0x00000A46, 0x00000A64, 0x0004002B,\n    0x0000000B, 0x00000A44, 0x000003FF, 0x0007002C, 0x00000017, 0x0000027B,\n    0x00000A44, 0x00000A44, 0x00000A44, 0x00000A13, 0x0004002B, 0x0000000D,\n    0x000006FE, 0x3A802008, 0x0004002B, 0x0000000D, 0x00000149, 0x3EAAAAAB,\n    0x0007002C, 0x0000001D, 0x00000AEE, 0x000006FE, 0x000006FE, 0x000006FE,\n    0x00000149, 0x0006002C, 0x00000014, 0x00000BB4, 0x00000A0A, 0x00000A28,\n    0x00000A46, 0x0004002B, 0x0000000B, 0x00000B87, 0x0000007F, 0x0004002B,\n    0x0000000B, 0x00000A1F, 0x00000007, 0x00040017, 0x00000010, 0x00000009,\n    0x00000003, 0x0004002B, 0x0000000B, 0x00000B7E, 0x0000007C, 0x0004002B,\n    0x0000000B, 0x00000A4F, 0x00000017, 0x00040017, 0x00000018, 0x0000000D,\n    0x00000003, 0x0004002B, 0x0000000D, 0x00000341, 0xBF800000, 0x0004002B,\n    0x0000000C, 0x00000A0B, 0x00000000, 0x0005002C, 0x00000012, 0x000007A7,\n    0x00000A3B, 0x00000A0B, 0x0004002B, 0x0000000D, 0x000007FE, 0x3A800100,\n    0x00040017, 0x0000001A, 0x0000000C, 0x00000004, 0x0007002C, 0x0000001A,\n    0x00000122, 0x00000A3B, 0x00000A0B, 0x00000A3B, 0x00000A0B, 0x0005002C,\n    0x00000011, 0x0000072D, 0x00000A10, 0x00000A0D, 0x00040017, 0x0000000F,\n    0x00000009, 0x00000002, 0x0005002C, 0x00000011, 0x0000070F, 0x00000A0A,\n    0x00000A0A, 0x0005002C, 0x00000011, 0x00000724, 0x00000A0D, 0x00000A0D,\n    0x0005002C, 0x00000011, 0x00000718, 0x00000A0D, 0x00000A0A, 0x0004002B,\n    0x0000000B, 0x00000AFA, 0x00000050, 0x0005002C, 0x00000011, 0x00000A9F,\n    0x00000AFA, 0x00000A3A, 0x0004002B, 0x0000000C, 0x00000A11, 0x00000002,\n    0x0004002B, 0x0000000C, 0x00000A17, 0x00000004, 0x0004002B, 0x0000000C,\n    0x00000A1D, 0x00000006, 0x0004002B, 0x0000000C, 0x00000A2C, 0x0000000B,\n    0x0004002B, 0x0000000C, 0x00000A38, 0x0000000F, 0x0004002B, 0x0000000C,\n    0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C, 0x00000A1A, 0x00000005,\n    0x0004002B, 0x0000000C, 0x00000A20, 0x00000007, 0x0004002B, 0x0000000C,\n    0x00000A23, 0x00000008, 0x0004002B, 0x0000000C, 0x00000A2F, 0x0000000C,\n    0x0004002B, 0x0000000C, 0x00000A14, 0x00000003, 0x0007001E, 0x0000040B,\n    0x0000000B, 0x0000000B, 0x0000000B, 0x0000000B, 0x0000000B, 0x00040020,\n    0x00000688, 0x00000009, 0x0000040B, 0x0004003B, 0x00000688, 0x00000CE9,\n    0x00000009, 0x00040020, 0x00000288, 0x00000009, 0x0000000B, 0x0004002B,\n    0x0000000B, 0x00000A31, 0x0000000D, 0x0004002B, 0x0000000B, 0x00000A81,\n    0x000007FF, 0x0004002B, 0x0000000B, 0x00000A37, 0x0000000F, 0x0004002B,\n    0x0000000B, 0x00000A5E, 0x0000001C, 0x0005002C, 0x00000011, 0x0000073F,\n    0x00000A0A, 0x00000A16, 0x0004002B, 0x0000000B, 0x00000A19, 0x00000005,\n    0x0004002B, 0x0000000C, 0x00000A29, 0x0000000A, 0x0004002B, 0x0000000B,\n    0x00000AC7, 0x0000003F, 0x0004002B, 0x0000000C, 0x00000A59, 0x0000001A,\n    0x0004002B, 0x0000000C, 0x00000A50, 0x00000017, 0x0004002B, 0x0000000B,\n    0x00000926, 0x01000000, 0x0005002C, 0x00000011, 0x000008E3, 0x00000A46,\n    0x00000A52, 0x0003002A, 0x00000009, 0x00000787, 0x0003001D, 0x000007D0,\n    0x0000000B, 0x0003001E, 0x0000079C, 0x000007D0, 0x00040020, 0x00000A1B,\n    0x00000002, 0x0000079C, 0x0004003B, 0x00000A1B, 0x00000CC7, 0x00000002,\n    0x00040020, 0x00000289, 0x00000002, 0x0000000B, 0x0004002B, 0x0000000B,\n    0x00000207, 0x00000140, 0x0004002B, 0x0000000B, 0x00000A1C, 0x00000006,\n    0x00040020, 0x00000291, 0x00000001, 0x00000014, 0x0004003B, 0x00000291,\n    0x00000F48, 0x00000001, 0x0005002C, 0x00000011, 0x00000721, 0x00000A10,\n    0x00000A0A, 0x0003001D, 0x000007DC, 0x00000017, 0x0003001E, 0x000007B4,\n    0x000007DC, 0x00040020, 0x00000A32, 0x00000002, 0x000007B4, 0x0004003B,\n    0x00000A32, 0x00001592, 0x00000002, 0x00040020, 0x00000294, 0x00000002,\n    0x00000017, 0x0006002C, 0x00000014, 0x00000AC8, 0x00000A22, 0x00000A22,\n    0x00000A0D, 0x0005002C, 0x00000011, 0x000007A2, 0x00000A37, 0x00000A0D,\n    0x0005002C, 0x00000011, 0x0000074E, 0x00000A13, 0x00000A13, 0x0005002C,\n    0x00000011, 0x0000084A, 0x00000A37, 0x00000A37, 0x0007002C, 0x0000001D,\n    0x00000504, 0x00000341, 0x00000341, 0x00000341, 0x00000341, 0x0007002C,\n    0x0000001A, 0x00000302, 0x00000A3B, 0x00000A3B, 0x00000A3B, 0x00000A3B,\n    0x0007002C, 0x00000017, 0x0000064B, 0x00000144, 0x00000144, 0x00000144,\n    0x00000144, 0x0006002C, 0x00000014, 0x00000105, 0x00000A44, 0x00000A44,\n    0x00000A44, 0x0006002C, 0x00000014, 0x00000466, 0x00000B87, 0x00000B87,\n    0x00000B87, 0x0006002C, 0x00000014, 0x00000B0C, 0x00000A1F, 0x00000A1F,\n    0x00000A1F, 0x0006002C, 0x00000014, 0x00000A12, 0x00000A0A, 0x00000A0A,\n    0x00000A0A, 0x0006002C, 0x00000014, 0x000003FA, 0x00000B7E, 0x00000B7E,\n    0x00000B7E, 0x0006002C, 0x00000014, 0x00000189, 0x00000A4F, 0x00000A4F,\n    0x00000A4F, 0x0006002C, 0x00000014, 0x0000008D, 0x00000A3A, 0x00000A3A,\n    0x00000A3A, 0x0005002C, 0x00000013, 0x00000049, 0x00000341, 0x00000341,\n    0x0005002C, 0x00000012, 0x00000867, 0x00000A3B, 0x00000A3B, 0x0007002C,\n    0x0000001D, 0x00000B7A, 0x00000A0C, 0x00000A0C, 0x00000A0C, 0x00000A0C,\n    0x0007002C, 0x0000001D, 0x00000505, 0x0000008A, 0x0000008A, 0x0000008A,\n    0x0000008A, 0x0007002C, 0x0000001D, 0x00000145, 0x000000FC, 0x000000FC,\n    0x000000FC, 0x000000FC, 0x0007002C, 0x00000017, 0x000009CE, 0x000008A6,\n    0x000008A6, 0x000008A6, 0x000008A6, 0x0007002C, 0x00000017, 0x0000013D,\n    0x00000A22, 0x00000A22, 0x00000A22, 0x00000A22, 0x0007002C, 0x00000017,\n    0x0000072E, 0x000005FD, 0x000005FD, 0x000005FD, 0x000005FD, 0x0007002C,\n    0x00000017, 0x000002ED, 0x00000A3A, 0x00000A3A, 0x00000A3A, 0x00000A3A,\n    0x0004002B, 0x0000000C, 0x00000089, 0x3F800000, 0x0004002B, 0x0000000B,\n    0x00000184, 0x00000500, 0x0004002B, 0x0000000B, 0x0000086E, 0x00280000,\n    0x0004002B, 0x0000000B, 0x000009F8, 0xFFFFFFFA, 0x0006002C, 0x00000014,\n    0x00000938, 0x000009F8, 0x000009F8, 0x000009F8, 0x0004002B, 0x0000000B,\n    0x00000237, 0x00000150, 0x0004002B, 0x0000000D, 0x0000016E, 0x3E800000,\n    0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020, 0x00050036, 0x00000008,\n    0x0000161F, 0x00000000, 0x00000502, 0x000200F8, 0x00003B06, 0x000300F7,\n    0x00004C7A, 0x00000000, 0x000300FB, 0x00000A0A, 0x00002E68, 0x000200F8,\n    0x00002E68, 0x00050041, 0x00000288, 0x000056E5, 0x00000CE9, 0x00000A0B,\n    0x0004003D, 0x0000000B, 0x00003D0B, 0x000056E5, 0x00050041, 0x00000288,\n    0x000058AC, 0x00000CE9, 0x00000A0E, 0x0004003D, 0x0000000B, 0x00005158,\n    0x000058AC, 0x000500C7, 0x0000000B, 0x00005051, 0x00003D0B, 0x00000A44,\n    0x000500C2, 0x0000000B, 0x00004E0A, 0x00003D0B, 0x00000A28, 0x000500C7,\n    0x0000000B, 0x0000217E, 0x00004E0A, 0x00000A13, 0x000500C2, 0x0000000B,\n    0x0000520A, 0x00003D0B, 0x00000A31, 0x000500C7, 0x0000000B, 0x0000217F,\n    0x0000520A, 0x00000A81, 0x000500C2, 0x0000000B, 0x0000520B, 0x00003D0B,\n    0x00000A52, 0x000500C7, 0x0000000B, 0x00002180, 0x0000520B, 0x00000A37,\n    0x000500C2, 0x0000000B, 0x00004994, 0x00003D0B, 0x00000A5E, 0x000500C7,\n    0x0000000B, 0x000023AA, 0x00004994, 0x00000A0D, 0x00050050, 0x00000011,\n    0x000022A7, 0x00005158, 0x00005158, 0x000500C2, 0x00000011, 0x00002568,\n    0x000022A7, 0x0000073F, 0x000500C7, 0x00000011, 0x00005B53, 0x00002568,\n    0x000007A2, 0x000500C4, 0x00000011, 0x00003F4F, 0x00005B53, 0x0000074E,\n    0x00050084, 0x00000011, 0x000059EB, 0x00003F4F, 0x00000724, 0x000500C2,\n    0x0000000B, 0x00003213, 0x00005158, 0x00000A19, 0x000500C7, 0x0000000B,\n    0x00003F4C, 0x00003213, 0x00000A81, 0x00050041, 0x00000288, 0x0000492C,\n    0x00000CE9, 0x00000A11, 0x0004003D, 0x0000000B, 0x00005EAC, 0x0000492C,\n    0x00050041, 0x00000288, 0x000058AD, 0x00000CE9, 0x00000A14, 0x0004003D,\n    0x0000000B, 0x000051B7, 0x000058AD, 0x000500C7, 0x0000000B, 0x00004ADC,\n    0x00005EAC, 0x00000A1F, 0x000500C7, 0x0000000B, 0x000055EF, 0x00005EAC,\n    0x00000A22, 0x000500AB, 0x00000009, 0x0000500F, 0x000055EF, 0x00000A0A,\n    0x000500C2, 0x0000000B, 0x00002843, 0x00005EAC, 0x00000A16, 0x000500C7,\n    0x0000000B, 0x00005F72, 0x00002843, 0x00000A1F, 0x000500C2, 0x0000000B,\n    0x00004CD8, 0x00005EAC, 0x00000A1F, 0x000500C7, 0x0000000B, 0x00005093,\n    0x00004CD8, 0x00000AC7, 0x0004007C, 0x0000000C, 0x00005988, 0x00005EAC,\n    0x000500C4, 0x0000000C, 0x0000358F, 0x00005988, 0x00000A29, 0x000500C3,\n    0x0000000C, 0x0000509C, 0x0000358F, 0x00000A59, 0x000500C4, 0x0000000C,\n    0x00004702, 0x0000509C, 0x00000A50, 0x00050080, 0x0000000C, 0x00001D26,\n    0x00004702, 0x00000089, 0x0004007C, 0x0000000D, 0x00002B2C, 0x00001D26,\n    0x000500C7, 0x0000000B, 0x00005879, 0x00005EAC, 0x00000926, 0x000500AB,\n    0x00000009, 0x00001D33, 0x00005879, 0x00000A0A, 0x000500C7, 0x0000000B,\n    0x000020FC, 0x000051B7, 0x00000A44, 0x000500C2, 0x0000000B, 0x00002F90,\n    0x000051B7, 0x00000A28, 0x000500C7, 0x0000000B, 0x000061CE, 0x00002F90,\n    0x00000A44, 0x000500C4, 0x0000000B, 0x00006273, 0x000061CE, 0x00000A0E,\n    0x00050050, 0x00000011, 0x000028B6, 0x000051B7, 0x000051B7, 0x000500C2,\n    0x00000011, 0x00002891, 0x000028B6, 0x000008E3, 0x000500C7, 0x00000011,\n    0x00005B54, 0x00002891, 0x0000084A, 0x000500C4, 0x00000011, 0x00003F50,\n    0x00005B54, 0x0000074E, 0x00050084, 0x00000011, 0x000059EC, 0x00003F50,\n    0x00000724, 0x000500C2, 0x0000000B, 0x00003214, 0x000051B7, 0x00000A5E,\n    0x000500C7, 0x0000000B, 0x00003F4D, 0x00003214, 0x00000A1F, 0x00050041,\n    0x00000288, 0x000048E0, 0x00000CE9, 0x00000A17, 0x0004003D, 0x0000000B,\n    0x000062B6, 0x000048E0, 0x0004003D, 0x00000014, 0x0000374F, 0x00000F48,\n    0x0007004F, 0x00000011, 0x00003180, 0x0000374F, 0x0000374F, 0x00000000,\n    0x00000001, 0x000500C4, 0x00000011, 0x00002EF9, 0x00003180, 0x00000721,\n    0x00050051, 0x0000000B, 0x00001DD8, 0x00002EF9, 0x00000000, 0x000500C4,\n    0x0000000B, 0x00002D8A, 0x00003F4C, 0x00000A13, 0x000500AE, 0x00000009,\n    0x00003C13, 0x00001DD8, 0x00002D8A, 0x000300F7, 0x000031D3, 0x00000002,\n    0x000400FA, 0x00003C13, 0x000055E8, 0x000031D3, 0x000200F8, 0x000055E8,\n    0x000200F9, 0x00004C7A, 0x000200F8, 0x000031D3, 0x00050051, 0x0000000B,\n    0x00001CAC, 0x00002EF9, 0x00000001, 0x0007000C, 0x0000000B, 0x00001F38,\n    0x00000001, 0x00000029, 0x00001CAC, 0x00000A0A, 0x00050050, 0x00000011,\n    0x000051EF, 0x00001DD8, 0x00001F38, 0x00050080, 0x00000011, 0x0000522C,\n    0x000051EF, 0x000059EB, 0x000500B2, 0x00000009, 0x00003ECB, 0x00003F4D,\n    0x00000A13, 0x000300F7, 0x00005CE0, 0x00000000, 0x000400FA, 0x00003ECB,\n    0x00002AEE, 0x00003AEF, 0x000200F8, 0x00003AEF, 0x000500AA, 0x00000009,\n    0x000034FE, 0x00003F4D, 0x00000A19, 0x000600A9, 0x0000000B, 0x000020F6,\n    0x000034FE, 0x00000A10, 0x00000A0A, 0x000200F9, 0x00005CE0, 0x000200F8,\n    0x00002AEE, 0x000200F9, 0x00005CE0, 0x000200F8, 0x00005CE0, 0x000700F5,\n    0x0000000B, 0x00004B64, 0x00003F4D, 0x00002AEE, 0x000020F6, 0x00003AEF,\n    0x00050050, 0x00000011, 0x000041BE, 0x0000217E, 0x0000217E, 0x000500AE,\n    0x0000000F, 0x00002E19, 0x000041BE, 0x0000072D, 0x000600A9, 0x00000011,\n    0x00004BB5, 0x00002E19, 0x00000724, 0x0000070F, 0x000500C4, 0x00000011,\n    0x00002AEA, 0x0000522C, 0x00004BB5, 0x00050050, 0x00000011, 0x0000605D,\n    0x00004B64, 0x00004B64, 0x000500C2, 0x00000011, 0x00002385, 0x0000605D,\n    0x00000718, 0x000500C7, 0x00000011, 0x00003AEC, 0x00002385, 0x00000724,\n    0x00050080, 0x00000011, 0x000027D5, 0x00002AEA, 0x00003AEC, 0x00050050,\n    0x00000011, 0x00002164, 0x000023AA, 0x00000A0A, 0x000500C2, 0x00000011,\n    0x0000264A, 0x00000A9F, 0x00002164, 0x00050086, 0x00000011, 0x000027A2,\n    0x000027D5, 0x0000264A, 0x00050051, 0x0000000B, 0x00004FA6, 0x000027A2,\n    0x00000001, 0x00050084, 0x0000000B, 0x00002B26, 0x00004FA6, 0x00005051,\n    0x00050051, 0x0000000B, 0x00006059, 0x000027A2, 0x00000000, 0x00050080,\n    0x0000000B, 0x00005420, 0x00002B26, 0x00006059, 0x00050080, 0x0000000B,\n    0x00002226, 0x0000217F, 0x00005420, 0x00050084, 0x00000011, 0x00005B31,\n    0x000027A2, 0x0000264A, 0x00050082, 0x00000011, 0x00002E74, 0x000027D5,\n    0x00005B31, 0x00050084, 0x0000000B, 0x00001F75, 0x00002226, 0x00000184,\n    0x00050051, 0x0000000B, 0x00005EC7, 0x00002E74, 0x00000001, 0x00050051,\n    0x0000000B, 0x00005BE6, 0x0000264A, 0x00000000, 0x00050084, 0x0000000B,\n    0x00005966, 0x00005EC7, 0x00005BE6, 0x00050051, 0x0000000B, 0x00001AE6,\n    0x00002E74, 0x00000000, 0x00050080, 0x0000000B, 0x000025E0, 0x00005966,\n    0x00001AE6, 0x000500C4, 0x0000000B, 0x000046C4, 0x000025E0, 0x000023AA,\n    0x00050080, 0x0000000B, 0x000048BB, 0x00001F75, 0x000046C4, 0x00050089,\n    0x0000000B, 0x00004C59, 0x000048BB, 0x0000086E, 0x000500C4, 0x0000000B,\n    0x00005BEB, 0x00004C59, 0x00000A11, 0x000500AE, 0x00000009, 0x00003652,\n    0x0000217E, 0x00000A10, 0x000600A9, 0x0000000B, 0x00002C0D, 0x00003652,\n    0x00000A0D, 0x00000A0A, 0x00050080, 0x0000000B, 0x00004E6A, 0x000023AA,\n    0x00002C0D, 0x000500C4, 0x0000000B, 0x0000199B, 0x00000A16, 0x00004E6A,\n    0x000500AB, 0x00000009, 0x00005AEF, 0x000023AA, 0x00000A0A, 0x000300F7,\n    0x0000530F, 0x00000002, 0x000400FA, 0x00005AEF, 0x00003B65, 0x000040B9,\n    0x000200F8, 0x000040B9, 0x000500AA, 0x00000009, 0x00004ADA, 0x0000199B,\n    0x00000A16, 0x000300F7, 0x00004F49, 0x00000002, 0x000400FA, 0x00004ADA,\n    0x000019BF, 0x000022FF, 0x000200F8, 0x000022FF, 0x000500C2, 0x0000000B,\n    0x00005630, 0x00005BEB, 0x00000A11, 0x00060041, 0x00000289, 0x00003439,\n    0x00000CC7, 0x00000A0B, 0x00005630, 0x0004003D, 0x0000000B, 0x00003AD4,\n    0x00003439, 0x00050080, 0x0000000B, 0x00002145, 0x00005BEB, 0x0000199B,\n    0x000500C2, 0x0000000B, 0x000054A6, 0x00002145, 0x00000A11, 0x00060041,\n    0x00000289, 0x00004CDD, 0x00000CC7, 0x00000A0B, 0x000054A6, 0x0004003D,\n    0x0000000B, 0x0000333A, 0x00004CDD, 0x00050084, 0x0000000B, 0x000021ED,\n    0x00000A10, 0x0000199B, 0x00050080, 0x0000000B, 0x00005EBE, 0x00005BEB,\n    0x000021ED, 0x000500C2, 0x0000000B, 0x000045E2, 0x00005EBE, 0x00000A11,\n    0x00060041, 0x00000289, 0x00004CDE, 0x00000CC7, 0x00000A0B, 0x000045E2,\n    0x0004003D, 0x0000000B, 0x0000333B, 0x00004CDE, 0x00050084, 0x0000000B,\n    0x000021EE, 0x00000A13, 0x0000199B, 0x00050080, 0x0000000B, 0x00005EBF,\n    0x00005BEB, 0x000021EE, 0x000500C2, 0x0000000B, 0x000045E3, 0x00005EBF,\n    0x00000A11, 0x00060041, 0x00000289, 0x00004901, 0x00000CC7, 0x00000A0B,\n    0x000045E3, 0x0004003D, 0x0000000B, 0x00005F59, 0x00004901, 0x00070050,\n    0x00000017, 0x0000512C, 0x00003AD4, 0x0000333A, 0x0000333B, 0x00005F59,\n    0x000200F9, 0x00004F49, 0x000200F8, 0x000019BF, 0x000500C2, 0x0000000B,\n    0x00005FA6, 0x00005BEB, 0x00000A11, 0x00060041, 0x00000289, 0x0000343A,\n    0x00000CC7, 0x00000A0B, 0x00005FA6, 0x0004003D, 0x0000000B, 0x00003141,\n    0x0000343A, 0x00050080, 0x0000000B, 0x00002DA7, 0x00005FA6, 0x00000A0D,\n    0x00060041, 0x00000289, 0x000018FF, 0x00000CC7, 0x00000A0B, 0x00002DA7,\n    0x0004003D, 0x0000000B, 0x00005C62, 0x000018FF, 0x00050080, 0x0000000B,\n    0x00002DA8, 0x00005FA6, 0x00000A10, 0x00060041, 0x00000289, 0x00001900,\n    0x00000CC7, 0x00000A0B, 0x00002DA8, 0x0004003D, 0x0000000B, 0x00005C63,\n    0x00001900, 0x00050080, 0x0000000B, 0x00002DA9, 0x00005FA6, 0x00000A13,\n    0x00060041, 0x00000289, 0x00005FEE, 0x00000CC7, 0x00000A0B, 0x00002DA9,\n    0x0004003D, 0x0000000B, 0x00003FFB, 0x00005FEE, 0x00070050, 0x00000017,\n    0x0000512D, 0x00003141, 0x00005C62, 0x00005C63, 0x00003FFB, 0x000200F9,\n    0x00004F49, 0x000200F8, 0x00004F49, 0x000700F5, 0x00000017, 0x00002ABF,\n    0x0000512D, 0x000019BF, 0x0000512C, 0x000022FF, 0x000300F7, 0x00003F60,\n    0x00000000, 0x001300FB, 0x00002180, 0x00004BFB, 0x00000000, 0x000038F9,\n    0x00000001, 0x000038F9, 0x00000002, 0x00001CBB, 0x0000000A, 0x00001CBB,\n    0x00000003, 0x00001CBA, 0x0000000C, 0x00001CBA, 0x00000004, 0x00001FFE,\n    0x00000006, 0x00002033, 0x000200F8, 0x00002033, 0x00050051, 0x0000000B,\n    0x00005F56, 0x00002ABF, 0x00000000, 0x0006000C, 0x00000013, 0x00006067,\n    0x00000001, 0x0000003E, 0x00005F56, 0x00050051, 0x0000000D, 0x00002762,\n    0x00006067, 0x00000000, 0x00050051, 0x0000000D, 0x00004446, 0x00006067,\n    0x00000001, 0x00070050, 0x0000001D, 0x0000390C, 0x00002762, 0x00004446,\n    0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x0000437A, 0x00002ABF,\n    0x00000001, 0x0006000C, 0x00000013, 0x0000466B, 0x00000001, 0x0000003E,\n    0x0000437A, 0x00050051, 0x0000000D, 0x00002763, 0x0000466B, 0x00000000,\n    0x00050051, 0x0000000D, 0x00004447, 0x0000466B, 0x00000001, 0x00070050,\n    0x0000001D, 0x0000390D, 0x00002763, 0x00004447, 0x00000A0C, 0x00000A0C,\n    0x00050051, 0x0000000B, 0x0000437B, 0x00002ABF, 0x00000002, 0x0006000C,\n    0x00000013, 0x0000466C, 0x00000001, 0x0000003E, 0x0000437B, 0x00050051,\n    0x0000000D, 0x00002764, 0x0000466C, 0x00000000, 0x00050051, 0x0000000D,\n    0x00004448, 0x0000466C, 0x00000001, 0x00070050, 0x0000001D, 0x0000390E,\n    0x00002764, 0x00004448, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B,\n    0x0000437C, 0x00002ABF, 0x00000003, 0x0006000C, 0x00000013, 0x0000466D,\n    0x00000001, 0x0000003E, 0x0000437C, 0x00050051, 0x0000000D, 0x00002765,\n    0x0000466D, 0x00000000, 0x00050051, 0x0000000D, 0x000050BE, 0x0000466D,\n    0x00000001, 0x00070050, 0x0000001D, 0x00002349, 0x00002765, 0x000050BE,\n    0x00000A0C, 0x00000A0C, 0x000200F9, 0x00003F60, 0x000200F8, 0x00001FFE,\n    0x00050051, 0x0000000B, 0x0000308B, 0x00002ABF, 0x00000000, 0x0004007C,\n    0x0000000C, 0x0000589D, 0x0000308B, 0x00050050, 0x00000012, 0x0000471A,\n    0x0000589D, 0x0000589D, 0x000500C4, 0x00000012, 0x000047AD, 0x0000471A,\n    0x000007A7, 0x000500C3, 0x00000012, 0x00003417, 0x000047AD, 0x00000867,\n    0x0004006F, 0x00000013, 0x00002A97, 0x00003417, 0x0005008E, 0x00000013,\n    0x00004747, 0x00002A97, 0x000007FE, 0x0007000C, 0x00000013, 0x00005E06,\n    0x00000001, 0x00000028, 0x00000049, 0x00004747, 0x00050051, 0x0000000D,\n    0x00005F0A, 0x00005E06, 0x00000000, 0x00050051, 0x0000000D, 0x00003CD4,\n    0x00005E06, 0x00000001, 0x00070050, 0x0000001D, 0x0000411E, 0x00005F0A,\n    0x00003CD4, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x00004C42,\n    0x00002ABF, 0x00000001, 0x0004007C, 0x0000000C, 0x00003EA1, 0x00004C42,\n    0x00050050, 0x00000012, 0x0000471B, 0x00003EA1, 0x00003EA1, 0x000500C4,\n    0x00000012, 0x000047AE, 0x0000471B, 0x000007A7, 0x000500C3, 0x00000012,\n    0x00003418, 0x000047AE, 0x00000867, 0x0004006F, 0x00000013, 0x00002A98,\n    0x00003418, 0x0005008E, 0x00000013, 0x00004748, 0x00002A98, 0x000007FE,\n    0x0007000C, 0x00000013, 0x00005E07, 0x00000001, 0x00000028, 0x00000049,\n    0x00004748, 0x00050051, 0x0000000D, 0x00005F0B, 0x00005E07, 0x00000000,\n    0x00050051, 0x0000000D, 0x00003CD5, 0x00005E07, 0x00000001, 0x00070050,\n    0x0000001D, 0x0000411F, 0x00005F0B, 0x00003CD5, 0x00000A0C, 0x00000A0C,\n    0x00050051, 0x0000000B, 0x00004C43, 0x00002ABF, 0x00000002, 0x0004007C,\n    0x0000000C, 0x00003EA2, 0x00004C43, 0x00050050, 0x00000012, 0x0000471C,\n    0x00003EA2, 0x00003EA2, 0x000500C4, 0x00000012, 0x000047AF, 0x0000471C,\n    0x000007A7, 0x000500C3, 0x00000012, 0x00003419, 0x000047AF, 0x00000867,\n    0x0004006F, 0x00000013, 0x00002A99, 0x00003419, 0x0005008E, 0x00000013,\n    0x00004749, 0x00002A99, 0x000007FE, 0x0007000C, 0x00000013, 0x00005E08,\n    0x00000001, 0x00000028, 0x00000049, 0x00004749, 0x00050051, 0x0000000D,\n    0x00005F0C, 0x00005E08, 0x00000000, 0x00050051, 0x0000000D, 0x00003CD6,\n    0x00005E08, 0x00000001, 0x00070050, 0x0000001D, 0x00004120, 0x00005F0C,\n    0x00003CD6, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x00004C44,\n    0x00002ABF, 0x00000003, 0x0004007C, 0x0000000C, 0x00003EA3, 0x00004C44,\n    0x00050050, 0x00000012, 0x0000471D, 0x00003EA3, 0x00003EA3, 0x000500C4,\n    0x00000012, 0x000047B0, 0x0000471D, 0x000007A7, 0x000500C3, 0x00000012,\n    0x0000341A, 0x000047B0, 0x00000867, 0x0004006F, 0x00000013, 0x00002A9A,\n    0x0000341A, 0x0005008E, 0x00000013, 0x0000474A, 0x00002A9A, 0x000007FE,\n    0x0007000C, 0x00000013, 0x00005E09, 0x00000001, 0x00000028, 0x00000049,\n    0x0000474A, 0x00050051, 0x0000000D, 0x00005F0D, 0x00005E09, 0x00000000,\n    0x00050051, 0x0000000D, 0x0000494C, 0x00005E09, 0x00000001, 0x00070050,\n    0x0000001D, 0x0000234A, 0x00005F0D, 0x0000494C, 0x00000A0C, 0x00000A0C,\n    0x000200F9, 0x00003F60, 0x000200F8, 0x00001CBA, 0x00050051, 0x0000000B,\n    0x000056BD, 0x00002ABF, 0x00000000, 0x00060050, 0x00000014, 0x00004F0A,\n    0x000056BD, 0x000056BD, 0x000056BD, 0x000500C2, 0x00000014, 0x00002B0D,\n    0x00004F0A, 0x00000BB4, 0x000500C7, 0x00000014, 0x00005DE6, 0x00002B0D,\n    0x00000105, 0x000500C7, 0x00000014, 0x0000489C, 0x00002B0D, 0x00000466,\n    0x000500C2, 0x00000014, 0x00005B90, 0x00005DE6, 0x00000B0C, 0x000500AA,\n    0x00000010, 0x000040C9, 0x00005B90, 0x00000A12, 0x0006000C, 0x00000016,\n    0x00002C4B, 0x00000001, 0x0000004B, 0x0000489C, 0x0004007C, 0x00000014,\n    0x00002A15, 0x00002C4B, 0x00050082, 0x00000014, 0x0000187A, 0x00000B0C,\n    0x00002A15, 0x00050080, 0x00000014, 0x00002210, 0x00002A15, 0x00000938,\n    0x000600A9, 0x00000014, 0x0000286F, 0x000040C9, 0x00002210, 0x00005B90,\n    0x000500C4, 0x00000014, 0x00005AD4, 0x0000489C, 0x0000187A, 0x000500C7,\n    0x00000014, 0x0000499A, 0x00005AD4, 0x00000466, 0x000600A9, 0x00000014,\n    0x00002A9D, 0x000040C9, 0x0000499A, 0x0000489C, 0x00050080, 0x00000014,\n    0x00005FF9, 0x0000286F, 0x000003FA, 0x000500C4, 0x00000014, 0x00004F7F,\n    0x00005FF9, 0x00000189, 0x000500C4, 0x00000014, 0x00003FA6, 0x00002A9D,\n    0x0000008D, 0x000500C5, 0x00000014, 0x0000577C, 0x00004F7F, 0x00003FA6,\n    0x000500AA, 0x00000010, 0x00003600, 0x00005DE6, 0x00000A12, 0x000600A9,\n    0x00000014, 0x00004242, 0x00003600, 0x00000A12, 0x0000577C, 0x0004007C,\n    0x00000018, 0x000029CF, 0x00004242, 0x000500C2, 0x0000000B, 0x00004BA4,\n    0x000056BD, 0x00000A64, 0x00040070, 0x0000000D, 0x0000480E, 0x00004BA4,\n    0x00050085, 0x0000000D, 0x00003E1F, 0x0000480E, 0x00000149, 0x00050051,\n    0x0000000D, 0x000053C2, 0x000029CF, 0x00000000, 0x00050051, 0x0000000D,\n    0x00002A55, 0x000029CF, 0x00000001, 0x00050051, 0x0000000D, 0x00001E99,\n    0x000029CF, 0x00000002, 0x00070050, 0x0000001D, 0x00003DDA, 0x000053C2,\n    0x00002A55, 0x00001E99, 0x00003E1F, 0x00050051, 0x0000000B, 0x000027F5,\n    0x00002ABF, 0x00000001, 0x00060050, 0x00000014, 0x0000350E, 0x000027F5,\n    0x000027F5, 0x000027F5, 0x000500C2, 0x00000014, 0x00002B0E, 0x0000350E,\n    0x00000BB4, 0x000500C7, 0x00000014, 0x00005DE7, 0x00002B0E, 0x00000105,\n    0x000500C7, 0x00000014, 0x0000489D, 0x00002B0E, 0x00000466, 0x000500C2,\n    0x00000014, 0x00005B91, 0x00005DE7, 0x00000B0C, 0x000500AA, 0x00000010,\n    0x000040CA, 0x00005B91, 0x00000A12, 0x0006000C, 0x00000016, 0x00002C4C,\n    0x00000001, 0x0000004B, 0x0000489D, 0x0004007C, 0x00000014, 0x00002A16,\n    0x00002C4C, 0x00050082, 0x00000014, 0x0000187B, 0x00000B0C, 0x00002A16,\n    0x00050080, 0x00000014, 0x00002211, 0x00002A16, 0x00000938, 0x000600A9,\n    0x00000014, 0x00002870, 0x000040CA, 0x00002211, 0x00005B91, 0x000500C4,\n    0x00000014, 0x00005AD5, 0x0000489D, 0x0000187B, 0x000500C7, 0x00000014,\n    0x0000499B, 0x00005AD5, 0x00000466, 0x000600A9, 0x00000014, 0x00002A9E,\n    0x000040CA, 0x0000499B, 0x0000489D, 0x00050080, 0x00000014, 0x00005FFA,\n    0x00002870, 0x000003FA, 0x000500C4, 0x00000014, 0x00004F80, 0x00005FFA,\n    0x00000189, 0x000500C4, 0x00000014, 0x00003FA7, 0x00002A9E, 0x0000008D,\n    0x000500C5, 0x00000014, 0x0000577D, 0x00004F80, 0x00003FA7, 0x000500AA,\n    0x00000010, 0x00003601, 0x00005DE7, 0x00000A12, 0x000600A9, 0x00000014,\n    0x00004243, 0x00003601, 0x00000A12, 0x0000577D, 0x0004007C, 0x00000018,\n    0x000029D0, 0x00004243, 0x000500C2, 0x0000000B, 0x00004BA5, 0x000027F5,\n    0x00000A64, 0x00040070, 0x0000000D, 0x0000480F, 0x00004BA5, 0x00050085,\n    0x0000000D, 0x00003E20, 0x0000480F, 0x00000149, 0x00050051, 0x0000000D,\n    0x000053C3, 0x000029D0, 0x00000000, 0x00050051, 0x0000000D, 0x00002A56,\n    0x000029D0, 0x00000001, 0x00050051, 0x0000000D, 0x00001E9A, 0x000029D0,\n    0x00000002, 0x00070050, 0x0000001D, 0x00003DDB, 0x000053C3, 0x00002A56,\n    0x00001E9A, 0x00003E20, 0x00050051, 0x0000000B, 0x000027F6, 0x00002ABF,\n    0x00000002, 0x00060050, 0x00000014, 0x0000350F, 0x000027F6, 0x000027F6,\n    0x000027F6, 0x000500C2, 0x00000014, 0x00002B0F, 0x0000350F, 0x00000BB4,\n    0x000500C7, 0x00000014, 0x00005DE8, 0x00002B0F, 0x00000105, 0x000500C7,\n    0x00000014, 0x0000489E, 0x00002B0F, 0x00000466, 0x000500C2, 0x00000014,\n    0x00005B92, 0x00005DE8, 0x00000B0C, 0x000500AA, 0x00000010, 0x000040CB,\n    0x00005B92, 0x00000A12, 0x0006000C, 0x00000016, 0x00002C4D, 0x00000001,\n    0x0000004B, 0x0000489E, 0x0004007C, 0x00000014, 0x00002A17, 0x00002C4D,\n    0x00050082, 0x00000014, 0x0000187C, 0x00000B0C, 0x00002A17, 0x00050080,\n    0x00000014, 0x00002212, 0x00002A17, 0x00000938, 0x000600A9, 0x00000014,\n    0x00002871, 0x000040CB, 0x00002212, 0x00005B92, 0x000500C4, 0x00000014,\n    0x00005AD6, 0x0000489E, 0x0000187C, 0x000500C7, 0x00000014, 0x0000499C,\n    0x00005AD6, 0x00000466, 0x000600A9, 0x00000014, 0x00002A9F, 0x000040CB,\n    0x0000499C, 0x0000489E, 0x00050080, 0x00000014, 0x00005FFB, 0x00002871,\n    0x000003FA, 0x000500C4, 0x00000014, 0x00004F81, 0x00005FFB, 0x00000189,\n    0x000500C4, 0x00000014, 0x00003FA8, 0x00002A9F, 0x0000008D, 0x000500C5,\n    0x00000014, 0x0000577E, 0x00004F81, 0x00003FA8, 0x000500AA, 0x00000010,\n    0x00003602, 0x00005DE8, 0x00000A12, 0x000600A9, 0x00000014, 0x00004244,\n    0x00003602, 0x00000A12, 0x0000577E, 0x0004007C, 0x00000018, 0x000029D1,\n    0x00004244, 0x000500C2, 0x0000000B, 0x00004BA6, 0x000027F6, 0x00000A64,\n    0x00040070, 0x0000000D, 0x00004810, 0x00004BA6, 0x00050085, 0x0000000D,\n    0x00003E21, 0x00004810, 0x00000149, 0x00050051, 0x0000000D, 0x000053C4,\n    0x000029D1, 0x00000000, 0x00050051, 0x0000000D, 0x00002A57, 0x000029D1,\n    0x00000001, 0x00050051, 0x0000000D, 0x00001E9B, 0x000029D1, 0x00000002,\n    0x00070050, 0x0000001D, 0x00003DDC, 0x000053C4, 0x00002A57, 0x00001E9B,\n    0x00003E21, 0x00050051, 0x0000000B, 0x000027F7, 0x00002ABF, 0x00000003,\n    0x00060050, 0x00000014, 0x00003510, 0x000027F7, 0x000027F7, 0x000027F7,\n    0x000500C2, 0x00000014, 0x00002B10, 0x00003510, 0x00000BB4, 0x000500C7,\n    0x00000014, 0x00005DE9, 0x00002B10, 0x00000105, 0x000500C7, 0x00000014,\n    0x0000489F, 0x00002B10, 0x00000466, 0x000500C2, 0x00000014, 0x00005B93,\n    0x00005DE9, 0x00000B0C, 0x000500AA, 0x00000010, 0x000040CC, 0x00005B93,\n    0x00000A12, 0x0006000C, 0x00000016, 0x00002C4E, 0x00000001, 0x0000004B,\n    0x0000489F, 0x0004007C, 0x00000014, 0x00002A18, 0x00002C4E, 0x00050082,\n    0x00000014, 0x0000187D, 0x00000B0C, 0x00002A18, 0x00050080, 0x00000014,\n    0x00002213, 0x00002A18, 0x00000938, 0x000600A9, 0x00000014, 0x00002872,\n    0x000040CC, 0x00002213, 0x00005B93, 0x000500C4, 0x00000014, 0x00005AD7,\n    0x0000489F, 0x0000187D, 0x000500C7, 0x00000014, 0x0000499D, 0x00005AD7,\n    0x00000466, 0x000600A9, 0x00000014, 0x00002AA0, 0x000040CC, 0x0000499D,\n    0x0000489F, 0x00050080, 0x00000014, 0x00005FFC, 0x00002872, 0x000003FA,\n    0x000500C4, 0x00000014, 0x00004F82, 0x00005FFC, 0x00000189, 0x000500C4,\n    0x00000014, 0x00003FA9, 0x00002AA0, 0x0000008D, 0x000500C5, 0x00000014,\n    0x0000577F, 0x00004F82, 0x00003FA9, 0x000500AA, 0x00000010, 0x00003603,\n    0x00005DE9, 0x00000A12, 0x000600A9, 0x00000014, 0x00004245, 0x00003603,\n    0x00000A12, 0x0000577F, 0x0004007C, 0x00000018, 0x000029D2, 0x00004245,\n    0x000500C2, 0x0000000B, 0x00004BA7, 0x000027F7, 0x00000A64, 0x00040070,\n    0x0000000D, 0x00004811, 0x00004BA7, 0x00050085, 0x0000000D, 0x00003E22,\n    0x00004811, 0x00000149, 0x00050051, 0x0000000D, 0x000053C5, 0x000029D2,\n    0x00000000, 0x00050051, 0x0000000D, 0x00002A58, 0x000029D2, 0x00000001,\n    0x00050051, 0x0000000D, 0x00002B11, 0x000029D2, 0x00000002, 0x00070050,\n    0x0000001D, 0x0000234B, 0x000053C5, 0x00002A58, 0x00002B11, 0x00003E22,\n    0x000200F9, 0x00003F60, 0x000200F8, 0x00001CBB, 0x00050051, 0x0000000B,\n    0x000056BE, 0x00002ABF, 0x00000000, 0x00070050, 0x00000017, 0x00004F0B,\n    0x000056BE, 0x000056BE, 0x000056BE, 0x000056BE, 0x000500C2, 0x00000017,\n    0x00002498, 0x00004F0B, 0x0000034D, 0x000500C7, 0x00000017, 0x000049AB,\n    0x00002498, 0x0000027B, 0x00040070, 0x0000001D, 0x00003CB7, 0x000049AB,\n    0x00050085, 0x0000001D, 0x00004130, 0x00003CB7, 0x00000AEE, 0x00050051,\n    0x0000000B, 0x00005CD2, 0x00002ABF, 0x00000001, 0x00070050, 0x00000017,\n    0x0000514D, 0x00005CD2, 0x00005CD2, 0x00005CD2, 0x00005CD2, 0x000500C2,\n    0x00000017, 0x00002499, 0x0000514D, 0x0000034D, 0x000500C7, 0x00000017,\n    0x000049AC, 0x00002499, 0x0000027B, 0x00040070, 0x0000001D, 0x00003CB8,\n    0x000049AC, 0x00050085, 0x0000001D, 0x00004131, 0x00003CB8, 0x00000AEE,\n    0x00050051, 0x0000000B, 0x00005CD3, 0x00002ABF, 0x00000002, 0x00070050,\n    0x00000017, 0x0000514E, 0x00005CD3, 0x00005CD3, 0x00005CD3, 0x00005CD3,\n    0x000500C2, 0x00000017, 0x0000249A, 0x0000514E, 0x0000034D, 0x000500C7,\n    0x00000017, 0x000049AD, 0x0000249A, 0x0000027B, 0x00040070, 0x0000001D,\n    0x00003CB9, 0x000049AD, 0x00050085, 0x0000001D, 0x00004132, 0x00003CB9,\n    0x00000AEE, 0x00050051, 0x0000000B, 0x00005CD4, 0x00002ABF, 0x00000003,\n    0x00070050, 0x00000017, 0x0000514F, 0x00005CD4, 0x00005CD4, 0x00005CD4,\n    0x00005CD4, 0x000500C2, 0x00000017, 0x0000249B, 0x0000514F, 0x0000034D,\n    0x000500C7, 0x00000017, 0x000049AE, 0x0000249B, 0x0000027B, 0x00040070,\n    0x0000001D, 0x0000492F, 0x000049AE, 0x00050085, 0x0000001D, 0x0000269F,\n    0x0000492F, 0x00000AEE, 0x000200F9, 0x00003F60, 0x000200F8, 0x000038F9,\n    0x00050051, 0x0000000B, 0x000056BF, 0x00002ABF, 0x00000000, 0x00070050,\n    0x00000017, 0x00004F0C, 0x000056BF, 0x000056BF, 0x000056BF, 0x000056BF,\n    0x000500C2, 0x00000017, 0x0000249C, 0x00004F0C, 0x0000028D, 0x000500C7,\n    0x00000017, 0x00004A56, 0x0000249C, 0x0000064B, 0x00040070, 0x0000001D,\n    0x000036A2, 0x00004A56, 0x0005008E, 0x0000001D, 0x00004B23, 0x000036A2,\n    0x0000017A, 0x00050051, 0x0000000B, 0x0000219F, 0x00002ABF, 0x00000001,\n    0x00070050, 0x00000017, 0x0000610B, 0x0000219F, 0x0000219F, 0x0000219F,\n    0x0000219F, 0x000500C2, 0x00000017, 0x0000249D, 0x0000610B, 0x0000028D,\n    0x000500C7, 0x00000017, 0x00004A57, 0x0000249D, 0x0000064B, 0x00040070,\n    0x0000001D, 0x000036A3, 0x00004A57, 0x0005008E, 0x0000001D, 0x00004B24,\n    0x000036A3, 0x0000017A, 0x00050051, 0x0000000B, 0x000021A0, 0x00002ABF,\n    0x00000002, 0x00070050, 0x00000017, 0x0000610C, 0x000021A0, 0x000021A0,\n    0x000021A0, 0x000021A0, 0x000500C2, 0x00000017, 0x0000249E, 0x0000610C,\n    0x0000028D, 0x000500C7, 0x00000017, 0x00004A58, 0x0000249E, 0x0000064B,\n    0x00040070, 0x0000001D, 0x000036A4, 0x00004A58, 0x0005008E, 0x0000001D,\n    0x00004B25, 0x000036A4, 0x0000017A, 0x00050051, 0x0000000B, 0x000021A1,\n    0x00002ABF, 0x00000003, 0x00070050, 0x00000017, 0x0000610D, 0x000021A1,\n    0x000021A1, 0x000021A1, 0x000021A1, 0x000500C2, 0x00000017, 0x0000249F,\n    0x0000610D, 0x0000028D, 0x000500C7, 0x00000017, 0x00004A59, 0x0000249F,\n    0x0000064B, 0x00040070, 0x0000001D, 0x0000431A, 0x00004A59, 0x0005008E,\n    0x0000001D, 0x00003092, 0x0000431A, 0x0000017A, 0x000200F9, 0x00003F60,\n    0x000200F8, 0x00004BFB, 0x00050051, 0x0000000B, 0x0000308C, 0x00002ABF,\n    0x00000000, 0x0004007C, 0x0000000D, 0x00004FEE, 0x0000308C, 0x00050050,\n    0x00000013, 0x00004336, 0x00004FEE, 0x00000A0C, 0x0009004F, 0x0000001D,\n    0x00002D90, 0x00004336, 0x00004336, 0x00000000, 0x00000001, 0x00000001,\n    0x00000001, 0x00050051, 0x0000000B, 0x000056B1, 0x00002ABF, 0x00000001,\n    0x0004007C, 0x0000000D, 0x00003F68, 0x000056B1, 0x00050050, 0x00000013,\n    0x00004337, 0x00003F68, 0x00000A0C, 0x0009004F, 0x0000001D, 0x00002D91,\n    0x00004337, 0x00004337, 0x00000000, 0x00000001, 0x00000001, 0x00000001,\n    0x00050051, 0x0000000B, 0x000056B2, 0x00002ABF, 0x00000002, 0x0004007C,\n    0x0000000D, 0x00003F69, 0x000056B2, 0x00050050, 0x00000013, 0x00004338,\n    0x00003F69, 0x00000A0C, 0x0009004F, 0x0000001D, 0x00002D92, 0x00004338,\n    0x00004338, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00050051,\n    0x0000000B, 0x000056B3, 0x00002ABF, 0x00000003, 0x0004007C, 0x0000000D,\n    0x00003F6A, 0x000056B3, 0x00050050, 0x00000013, 0x00004FAE, 0x00003F6A,\n    0x00000A0C, 0x0009004F, 0x0000001D, 0x00005A3A, 0x00004FAE, 0x00004FAE,\n    0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x000200F9, 0x00003F60,\n    0x000200F8, 0x00003F60, 0x000F00F5, 0x0000001D, 0x00002BA7, 0x00005A3A,\n    0x00004BFB, 0x00003092, 0x000038F9, 0x0000269F, 0x00001CBB, 0x0000234B,\n    0x00001CBA, 0x0000234A, 0x00001FFE, 0x00002349, 0x00002033, 0x000F00F5,\n    0x0000001D, 0x00003808, 0x00002D92, 0x00004BFB, 0x00004B25, 0x000038F9,\n    0x00004132, 0x00001CBB, 0x00003DDC, 0x00001CBA, 0x00004120, 0x00001FFE,\n    0x0000390E, 0x00002033, 0x000F00F5, 0x0000001D, 0x00003B7D, 0x00002D91,\n    0x00004BFB, 0x00004B24, 0x000038F9, 0x00004131, 0x00001CBB, 0x00003DDB,\n    0x00001CBA, 0x0000411F, 0x00001FFE, 0x0000390D, 0x00002033, 0x000F00F5,\n    0x0000001D, 0x000038B6, 0x00002D90, 0x00004BFB, 0x00004B23, 0x000038F9,\n    0x00004130, 0x00001CBB, 0x00003DDA, 0x00001CBA, 0x0000411E, 0x00001FFE,\n    0x0000390C, 0x00002033, 0x000200F9, 0x0000530F, 0x000200F8, 0x00003B65,\n    0x000500AA, 0x00000009, 0x00005450, 0x0000199B, 0x00000A22, 0x000300F7,\n    0x00004F23, 0x00000002, 0x000400FA, 0x00005450, 0x000019C0, 0x00002300,\n    0x000200F8, 0x00002300, 0x000500C2, 0x0000000B, 0x00005631, 0x00005BEB,\n    0x00000A11, 0x00060041, 0x00000289, 0x0000343B, 0x00000CC7, 0x00000A0B,\n    0x00005631, 0x0004003D, 0x0000000B, 0x00003142, 0x0000343B, 0x00050080,\n    0x0000000B, 0x00002DAA, 0x00005631, 0x00000A0D, 0x00060041, 0x00000289,\n    0x00001901, 0x00000CC7, 0x00000A0B, 0x00002DAA, 0x0004003D, 0x0000000B,\n    0x00001B76, 0x00001901, 0x00050080, 0x0000000B, 0x00002146, 0x00005BEB,\n    0x0000199B, 0x000500C2, 0x0000000B, 0x000054A7, 0x00002146, 0x00000A11,\n    0x00060041, 0x00000289, 0x00004C91, 0x00000CC7, 0x00000A0B, 0x000054A7,\n    0x0004003D, 0x0000000B, 0x00003143, 0x00004C91, 0x00050080, 0x0000000B,\n    0x00002DAB, 0x000054A7, 0x00000A0D, 0x00060041, 0x00000289, 0x00005FEF,\n    0x00000CC7, 0x00000A0B, 0x00002DAB, 0x0004003D, 0x0000000B, 0x0000374C,\n    0x00005FEF, 0x00070050, 0x00000017, 0x00004CD6, 0x00003142, 0x00001B76,\n    0x00003143, 0x0000374C, 0x00050084, 0x0000000B, 0x00004C2B, 0x00000A10,\n    0x0000199B, 0x00050080, 0x0000000B, 0x00002A45, 0x00005BEB, 0x00004C2B,\n    0x000500C2, 0x0000000B, 0x000045E4, 0x00002A45, 0x00000A11, 0x00060041,\n    0x00000289, 0x00004C92, 0x00000CC7, 0x00000A0B, 0x000045E4, 0x0004003D,\n    0x0000000B, 0x00003144, 0x00004C92, 0x00050080, 0x0000000B, 0x00002DAC,\n    0x000045E4, 0x00000A0D, 0x00060041, 0x00000289, 0x0000194B, 0x00000CC7,\n    0x00000A0B, 0x00002DAC, 0x0004003D, 0x0000000B, 0x00005E5B, 0x0000194B,\n    0x00050084, 0x0000000B, 0x000021EF, 0x00000A13, 0x0000199B, 0x00050080,\n    0x0000000B, 0x00005EC0, 0x00005BEB, 0x000021EF, 0x000500C2, 0x0000000B,\n    0x000045E5, 0x00005EC0, 0x00000A11, 0x00060041, 0x00000289, 0x00004C93,\n    0x00000CC7, 0x00000A0B, 0x000045E5, 0x0004003D, 0x0000000B, 0x00003145,\n    0x00004C93, 0x00050080, 0x0000000B, 0x00002DAD, 0x000045E5, 0x00000A0D,\n    0x00060041, 0x00000289, 0x00005FF0, 0x00000CC7, 0x00000A0B, 0x00002DAD,\n    0x0004003D, 0x0000000B, 0x00003FFC, 0x00005FF0, 0x00070050, 0x00000017,\n    0x0000512E, 0x00003144, 0x00005E5B, 0x00003145, 0x00003FFC, 0x000200F9,\n    0x00004F23, 0x000200F8, 0x000019C0, 0x000500C2, 0x0000000B, 0x00005FA7,\n    0x00005BEB, 0x00000A11, 0x00060041, 0x00000289, 0x0000343C, 0x00000CC7,\n    0x00000A0B, 0x00005FA7, 0x0004003D, 0x0000000B, 0x00003146, 0x0000343C,\n    0x00050080, 0x0000000B, 0x00002DAE, 0x00005FA7, 0x00000A0D, 0x00060041,\n    0x00000289, 0x00001902, 0x00000CC7, 0x00000A0B, 0x00002DAE, 0x0004003D,\n    0x0000000B, 0x00005C64, 0x00001902, 0x00050080, 0x0000000B, 0x00002DAF,\n    0x00005FA7, 0x00000A10, 0x00060041, 0x00000289, 0x00001903, 0x00000CC7,\n    0x00000A0B, 0x00002DAF, 0x0004003D, 0x0000000B, 0x00005C65, 0x00001903,\n    0x00050080, 0x0000000B, 0x00002DB0, 0x00005FA7, 0x00000A13, 0x00060041,\n    0x00000289, 0x00005FF1, 0x00000CC7, 0x00000A0B, 0x00002DB0, 0x0004003D,\n    0x0000000B, 0x00003700, 0x00005FF1, 0x00070050, 0x00000017, 0x00005470,\n    0x00003146, 0x00005C64, 0x00005C65, 0x00003700, 0x00050080, 0x0000000B,\n    0x00004B83, 0x00005BEB, 0x00000A3A, 0x000500C2, 0x0000000B, 0x0000202D,\n    0x00004B83, 0x00000A11, 0x00060041, 0x00000289, 0x00004C94, 0x00000CC7,\n    0x00000A0B, 0x0000202D, 0x0004003D, 0x0000000B, 0x00003147, 0x00004C94,\n    0x00050080, 0x0000000B, 0x00002DB1, 0x0000202D, 0x00000A0D, 0x00060041,\n    0x00000289, 0x00001904, 0x00000CC7, 0x00000A0B, 0x00002DB1, 0x0004003D,\n    0x0000000B, 0x00005C66, 0x00001904, 0x00050080, 0x0000000B, 0x00002DB2,\n    0x0000202D, 0x00000A10, 0x00060041, 0x00000289, 0x00001905, 0x00000CC7,\n    0x00000A0B, 0x00002DB2, 0x0004003D, 0x0000000B, 0x00005C67, 0x00001905,\n    0x00050080, 0x0000000B, 0x00002DB3, 0x0000202D, 0x00000A13, 0x00060041,\n    0x00000289, 0x00005FF2, 0x00000CC7, 0x00000A0B, 0x00002DB3, 0x0004003D,\n    0x0000000B, 0x00003FFD, 0x00005FF2, 0x00070050, 0x00000017, 0x0000512F,\n    0x00003147, 0x00005C66, 0x00005C67, 0x00003FFD, 0x000200F9, 0x00004F23,\n    0x000200F8, 0x00004F23, 0x000700F5, 0x00000017, 0x00002BCD, 0x0000512F,\n    0x000019C0, 0x0000512E, 0x00002300, 0x000700F5, 0x00000017, 0x00003720,\n    0x00005470, 0x000019C0, 0x00004CD6, 0x00002300, 0x000300F7, 0x00004F24,\n    0x00000000, 0x000700FB, 0x00002180, 0x00004F56, 0x00000005, 0x00002158,\n    0x00000007, 0x00002034, 0x000200F8, 0x00002034, 0x00050051, 0x0000000B,\n    0x00005F57, 0x00003720, 0x00000000, 0x0006000C, 0x00000013, 0x00006068,\n    0x00000001, 0x0000003E, 0x00005F57, 0x00050051, 0x0000000D, 0x00002775,\n    0x00006068, 0x00000000, 0x00050051, 0x0000000D, 0x00003EB8, 0x00006068,\n    0x00000001, 0x00050051, 0x0000000B, 0x00004281, 0x00003720, 0x00000001,\n    0x0006000C, 0x00000013, 0x00003CF5, 0x00000001, 0x0000003E, 0x00004281,\n    0x00050051, 0x0000000D, 0x00002766, 0x00003CF5, 0x00000000, 0x00050051,\n    0x0000000D, 0x00004449, 0x00003CF5, 0x00000001, 0x00070050, 0x0000001D,\n    0x0000390F, 0x00002775, 0x00003EB8, 0x00002766, 0x00004449, 0x00050051,\n    0x0000000B, 0x0000437D, 0x00003720, 0x00000002, 0x0006000C, 0x00000013,\n    0x0000466E, 0x00000001, 0x0000003E, 0x0000437D, 0x00050051, 0x0000000D,\n    0x00002776, 0x0000466E, 0x00000000, 0x00050051, 0x0000000D, 0x00003EB9,\n    0x0000466E, 0x00000001, 0x00050051, 0x0000000B, 0x00004282, 0x00003720,\n    0x00000003, 0x0006000C, 0x00000013, 0x00003CF6, 0x00000001, 0x0000003E,\n    0x00004282, 0x00050051, 0x0000000D, 0x00002767, 0x00003CF6, 0x00000000,\n    0x00050051, 0x0000000D, 0x0000444A, 0x00003CF6, 0x00000001, 0x00070050,\n    0x0000001D, 0x00003910, 0x00002776, 0x00003EB9, 0x00002767, 0x0000444A,\n    0x00050051, 0x0000000B, 0x0000437E, 0x00002BCD, 0x00000000, 0x0006000C,\n    0x00000013, 0x0000466F, 0x00000001, 0x0000003E, 0x0000437E, 0x00050051,\n    0x0000000D, 0x00002777, 0x0000466F, 0x00000000, 0x00050051, 0x0000000D,\n    0x00003EBA, 0x0000466F, 0x00000001, 0x00050051, 0x0000000B, 0x00004283,\n    0x00002BCD, 0x00000001, 0x0006000C, 0x00000013, 0x00003CF7, 0x00000001,\n    0x0000003E, 0x00004283, 0x00050051, 0x0000000D, 0x00002768, 0x00003CF7,\n    0x00000000, 0x00050051, 0x0000000D, 0x0000444B, 0x00003CF7, 0x00000001,\n    0x00070050, 0x0000001D, 0x00003911, 0x00002777, 0x00003EBA, 0x00002768,\n    0x0000444B, 0x00050051, 0x0000000B, 0x0000437F, 0x00002BCD, 0x00000002,\n    0x0006000C, 0x00000013, 0x00004670, 0x00000001, 0x0000003E, 0x0000437F,\n    0x00050051, 0x0000000D, 0x00002778, 0x00004670, 0x00000000, 0x00050051,\n    0x0000000D, 0x00003EBB, 0x00004670, 0x00000001, 0x00050051, 0x0000000B,\n    0x00004284, 0x00002BCD, 0x00000003, 0x0006000C, 0x00000013, 0x00003CF8,\n    0x00000001, 0x0000003E, 0x00004284, 0x00050051, 0x0000000D, 0x00002769,\n    0x00003CF8, 0x00000000, 0x00050051, 0x0000000D, 0x000050BF, 0x00003CF8,\n    0x00000001, 0x00070050, 0x0000001D, 0x0000234C, 0x00002778, 0x00003EBB,\n    0x00002769, 0x000050BF, 0x000200F9, 0x00004F24, 0x000200F8, 0x00002158,\n    0x0007004F, 0x00000011, 0x000025FB, 0x00003720, 0x00003720, 0x00000000,\n    0x00000001, 0x0004007C, 0x00000012, 0x00005B3C, 0x000025FB, 0x0009004F,\n    0x0000001A, 0x000060CE, 0x00005B3C, 0x00005B3C, 0x00000000, 0x00000000,\n    0x00000001, 0x00000001, 0x000500C4, 0x0000001A, 0x000048A6, 0x000060CE,\n    0x00000122, 0x000500C3, 0x0000001A, 0x00003D8D, 0x000048A6, 0x00000302,\n    0x0004006F, 0x0000001D, 0x00002A9B, 0x00003D8D, 0x0005008E, 0x0000001D,\n    0x00004721, 0x00002A9B, 0x000007FE, 0x0007000C, 0x0000001D, 0x00006291,\n    0x00000001, 0x00000028, 0x00000504, 0x00004721, 0x0007004F, 0x00000011,\n    0x0000376B, 0x00003720, 0x00003720, 0x00000002, 0x00000003, 0x0004007C,\n    0x00000012, 0x000024BF, 0x0000376B, 0x0009004F, 0x0000001A, 0x000060CF,\n    0x000024BF, 0x000024BF, 0x00000000, 0x00000000, 0x00000001, 0x00000001,\n    0x000500C4, 0x0000001A, 0x000048A7, 0x000060CF, 0x00000122, 0x000500C3,\n    0x0000001A, 0x00003D8E, 0x000048A7, 0x00000302, 0x0004006F, 0x0000001D,\n    0x00002A9C, 0x00003D8E, 0x0005008E, 0x0000001D, 0x00004722, 0x00002A9C,\n    0x000007FE, 0x0007000C, 0x0000001D, 0x00006292, 0x00000001, 0x00000028,\n    0x00000504, 0x00004722, 0x0007004F, 0x00000011, 0x0000376C, 0x00002BCD,\n    0x00002BCD, 0x00000000, 0x00000001, 0x0004007C, 0x00000012, 0x000024C0,\n    0x0000376C, 0x0009004F, 0x0000001A, 0x000060D0, 0x000024C0, 0x000024C0,\n    0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x000500C4, 0x0000001A,\n    0x000048A8, 0x000060D0, 0x00000122, 0x000500C3, 0x0000001A, 0x00003D8F,\n    0x000048A8, 0x00000302, 0x0004006F, 0x0000001D, 0x00002AA1, 0x00003D8F,\n    0x0005008E, 0x0000001D, 0x00004723, 0x00002AA1, 0x000007FE, 0x0007000C,\n    0x0000001D, 0x00006293, 0x00000001, 0x00000028, 0x00000504, 0x00004723,\n    0x0007004F, 0x00000011, 0x0000376D, 0x00002BCD, 0x00002BCD, 0x00000002,\n    0x00000003, 0x0004007C, 0x00000012, 0x000024C1, 0x0000376D, 0x0009004F,\n    0x0000001A, 0x000060D1, 0x000024C1, 0x000024C1, 0x00000000, 0x00000000,\n    0x00000001, 0x00000001, 0x000500C4, 0x0000001A, 0x000048A9, 0x000060D1,\n    0x00000122, 0x000500C3, 0x0000001A, 0x00003D90, 0x000048A9, 0x00000302,\n    0x0004006F, 0x0000001D, 0x00002AA2, 0x00003D90, 0x0005008E, 0x0000001D,\n    0x000053BF, 0x00002AA2, 0x000007FE, 0x0007000C, 0x0000001D, 0x00004362,\n    0x00000001, 0x00000028, 0x00000504, 0x000053BF, 0x000200F9, 0x00004F24,\n    0x000200F8, 0x00004F56, 0x0007004F, 0x00000011, 0x00002621, 0x00003720,\n    0x00003720, 0x00000000, 0x00000001, 0x0004007C, 0x00000013, 0x00005159,\n    0x00002621, 0x00050051, 0x0000000D, 0x00001B7B, 0x00005159, 0x00000000,\n    0x00050051, 0x0000000D, 0x0000346A, 0x00005159, 0x00000001, 0x00070050,\n    0x0000001D, 0x00004278, 0x00001B7B, 0x0000346A, 0x00000A0C, 0x00000A0C,\n    0x0007004F, 0x00000011, 0x000041D8, 0x00003720, 0x00003720, 0x00000002,\n    0x00000003, 0x0004007C, 0x00000013, 0x0000375D, 0x000041D8, 0x00050051,\n    0x0000000D, 0x00001B7C, 0x0000375D, 0x00000000, 0x00050051, 0x0000000D,\n    0x0000346B, 0x0000375D, 0x00000001, 0x00070050, 0x0000001D, 0x00004279,\n    0x00001B7C, 0x0000346B, 0x00000A0C, 0x00000A0C, 0x0007004F, 0x00000011,\n    0x000041D9, 0x00002BCD, 0x00002BCD, 0x00000000, 0x00000001, 0x0004007C,\n    0x00000013, 0x0000375E, 0x000041D9, 0x00050051, 0x0000000D, 0x00001B7D,\n    0x0000375E, 0x00000000, 0x00050051, 0x0000000D, 0x0000346C, 0x0000375E,\n    0x00000001, 0x00070050, 0x0000001D, 0x0000427A, 0x00001B7D, 0x0000346C,\n    0x00000A0C, 0x00000A0C, 0x0007004F, 0x00000011, 0x000041DA, 0x00002BCD,\n    0x00002BCD, 0x00000002, 0x00000003, 0x0004007C, 0x00000013, 0x0000375F,\n    0x000041DA, 0x00050051, 0x0000000D, 0x00001B7E, 0x0000375F, 0x00000000,\n    0x00050051, 0x0000000D, 0x00004108, 0x0000375F, 0x00000001, 0x00070050,\n    0x0000001D, 0x0000234D, 0x00001B7E, 0x00004108, 0x00000A0C, 0x00000A0C,\n    0x000200F9, 0x00004F24, 0x000200F8, 0x00004F24, 0x000900F5, 0x0000001D,\n    0x00002BA8, 0x0000234D, 0x00004F56, 0x00004362, 0x00002158, 0x0000234C,\n    0x00002034, 0x000900F5, 0x0000001D, 0x00003809, 0x0000427A, 0x00004F56,\n    0x00006293, 0x00002158, 0x00003911, 0x00002034, 0x000900F5, 0x0000001D,\n    0x00003B7E, 0x00004279, 0x00004F56, 0x00006292, 0x00002158, 0x00003910,\n    0x00002034, 0x000900F5, 0x0000001D, 0x000038B7, 0x00004278, 0x00004F56,\n    0x00006291, 0x00002158, 0x0000390F, 0x00002034, 0x000200F9, 0x0000530F,\n    0x000200F8, 0x0000530F, 0x000700F5, 0x0000001D, 0x00002BA9, 0x00002BA8,\n    0x00004F24, 0x00002BA7, 0x00003F60, 0x000700F5, 0x0000001D, 0x0000380A,\n    0x00003809, 0x00004F24, 0x00003808, 0x00003F60, 0x000700F5, 0x0000001D,\n    0x000035EC, 0x00003B7E, 0x00004F24, 0x00003B7D, 0x00003F60, 0x000700F5,\n    0x0000001D, 0x000020D3, 0x000038B7, 0x00004F24, 0x000038B6, 0x00003F60,\n    0x000500AE, 0x00000009, 0x00002E55, 0x00003F4D, 0x00000A16, 0x000300F7,\n    0x00005313, 0x00000002, 0x000400FA, 0x00002E55, 0x000050E5, 0x00005313,\n    0x000200F8, 0x000050E5, 0x00050085, 0x0000000D, 0x000061FB, 0x00002B2C,\n    0x000000FC, 0x00050080, 0x0000000B, 0x00005E78, 0x00005BEB, 0x00000207,\n    0x000300F7, 0x00005310, 0x00000002, 0x000400FA, 0x00005AEF, 0x00003B66,\n    0x000040BA, 0x000200F8, 0x000040BA, 0x000500AA, 0x00000009, 0x00004ADB,\n    0x0000199B, 0x00000A16, 0x000300F7, 0x00004F4A, 0x00000002, 0x000400FA,\n    0x00004ADB, 0x000019C1, 0x00002301, 0x000200F8, 0x00002301, 0x000500C2,\n    0x0000000B, 0x00005632, 0x00005E78, 0x00000A11, 0x00060041, 0x00000289,\n    0x0000343D, 0x00000CC7, 0x00000A0B, 0x00005632, 0x0004003D, 0x0000000B,\n    0x00003AD5, 0x0000343D, 0x00050080, 0x0000000B, 0x00002147, 0x00005E78,\n    0x0000199B, 0x000500C2, 0x0000000B, 0x000054A8, 0x00002147, 0x00000A11,\n    0x00060041, 0x00000289, 0x00004CDF, 0x00000CC7, 0x00000A0B, 0x000054A8,\n    0x0004003D, 0x0000000B, 0x0000333C, 0x00004CDF, 0x00050084, 0x0000000B,\n    0x000021F0, 0x00000A10, 0x0000199B, 0x00050080, 0x0000000B, 0x00005EC1,\n    0x00005E78, 0x000021F0, 0x000500C2, 0x0000000B, 0x000045E6, 0x00005EC1,\n    0x00000A11, 0x00060041, 0x00000289, 0x00004CE0, 0x00000CC7, 0x00000A0B,\n    0x000045E6, 0x0004003D, 0x0000000B, 0x0000333D, 0x00004CE0, 0x00050084,\n    0x0000000B, 0x000021F1, 0x00000A13, 0x0000199B, 0x00050080, 0x0000000B,\n    0x00005EC2, 0x00005E78, 0x000021F1, 0x000500C2, 0x0000000B, 0x000045E7,\n    0x00005EC2, 0x00000A11, 0x00060041, 0x00000289, 0x00004902, 0x00000CC7,\n    0x00000A0B, 0x000045E7, 0x0004003D, 0x0000000B, 0x00005F5A, 0x00004902,\n    0x00070050, 0x00000017, 0x00005130, 0x00003AD5, 0x0000333C, 0x0000333D,\n    0x00005F5A, 0x000200F9, 0x00004F4A, 0x000200F8, 0x000019C1, 0x000500C2,\n    0x0000000B, 0x00005FA8, 0x00005E78, 0x00000A11, 0x00060041, 0x00000289,\n    0x0000343E, 0x00000CC7, 0x00000A0B, 0x00005FA8, 0x0004003D, 0x0000000B,\n    0x00003148, 0x0000343E, 0x00050080, 0x0000000B, 0x00002DB4, 0x00005FA8,\n    0x00000A0D, 0x00060041, 0x00000289, 0x00001906, 0x00000CC7, 0x00000A0B,\n    0x00002DB4, 0x0004003D, 0x0000000B, 0x00005C68, 0x00001906, 0x00050080,\n    0x0000000B, 0x00002DB5, 0x00005FA8, 0x00000A10, 0x00060041, 0x00000289,\n    0x00001907, 0x00000CC7, 0x00000A0B, 0x00002DB5, 0x0004003D, 0x0000000B,\n    0x00005C69, 0x00001907, 0x00050080, 0x0000000B, 0x00002DB6, 0x00005FA8,\n    0x00000A13, 0x00060041, 0x00000289, 0x00005FF3, 0x00000CC7, 0x00000A0B,\n    0x00002DB6, 0x0004003D, 0x0000000B, 0x00003FFE, 0x00005FF3, 0x00070050,\n    0x00000017, 0x00005131, 0x00003148, 0x00005C68, 0x00005C69, 0x00003FFE,\n    0x000200F9, 0x00004F4A, 0x000200F8, 0x00004F4A, 0x000700F5, 0x00000017,\n    0x00002AC0, 0x00005131, 0x000019C1, 0x00005130, 0x00002301, 0x000300F7,\n    0x00003F61, 0x00000000, 0x001300FB, 0x00002180, 0x00004BFC, 0x00000000,\n    0x000038FA, 0x00000001, 0x000038FA, 0x00000002, 0x00001CBD, 0x0000000A,\n    0x00001CBD, 0x00000003, 0x00001CBC, 0x0000000C, 0x00001CBC, 0x00000004,\n    0x00001FFF, 0x00000006, 0x00002035, 0x000200F8, 0x00002035, 0x00050051,\n    0x0000000B, 0x00005F58, 0x00002AC0, 0x00000000, 0x0006000C, 0x00000013,\n    0x00006069, 0x00000001, 0x0000003E, 0x00005F58, 0x00050051, 0x0000000D,\n    0x0000276A, 0x00006069, 0x00000000, 0x00050051, 0x0000000D, 0x0000444C,\n    0x00006069, 0x00000001, 0x00070050, 0x0000001D, 0x00003912, 0x0000276A,\n    0x0000444C, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x00004380,\n    0x00002AC0, 0x00000001, 0x0006000C, 0x00000013, 0x00004671, 0x00000001,\n    0x0000003E, 0x00004380, 0x00050051, 0x0000000D, 0x0000276B, 0x00004671,\n    0x00000000, 0x00050051, 0x0000000D, 0x0000444D, 0x00004671, 0x00000001,\n    0x00070050, 0x0000001D, 0x00003913, 0x0000276B, 0x0000444D, 0x00000A0C,\n    0x00000A0C, 0x00050051, 0x0000000B, 0x00004381, 0x00002AC0, 0x00000002,\n    0x0006000C, 0x00000013, 0x00004672, 0x00000001, 0x0000003E, 0x00004381,\n    0x00050051, 0x0000000D, 0x0000276C, 0x00004672, 0x00000000, 0x00050051,\n    0x0000000D, 0x0000444E, 0x00004672, 0x00000001, 0x00070050, 0x0000001D,\n    0x00003914, 0x0000276C, 0x0000444E, 0x00000A0C, 0x00000A0C, 0x00050051,\n    0x0000000B, 0x00004382, 0x00002AC0, 0x00000003, 0x0006000C, 0x00000013,\n    0x00004673, 0x00000001, 0x0000003E, 0x00004382, 0x00050051, 0x0000000D,\n    0x0000276D, 0x00004673, 0x00000000, 0x00050051, 0x0000000D, 0x000050C0,\n    0x00004673, 0x00000001, 0x00070050, 0x0000001D, 0x0000234E, 0x0000276D,\n    0x000050C0, 0x00000A0C, 0x00000A0C, 0x000200F9, 0x00003F61, 0x000200F8,\n    0x00001FFF, 0x00050051, 0x0000000B, 0x0000308D, 0x00002AC0, 0x00000000,\n    0x0004007C, 0x0000000C, 0x0000589E, 0x0000308D, 0x00050050, 0x00000012,\n    0x0000471E, 0x0000589E, 0x0000589E, 0x000500C4, 0x00000012, 0x000047B1,\n    0x0000471E, 0x000007A7, 0x000500C3, 0x00000012, 0x0000341B, 0x000047B1,\n    0x00000867, 0x0004006F, 0x00000013, 0x00002AA3, 0x0000341B, 0x0005008E,\n    0x00000013, 0x0000474B, 0x00002AA3, 0x000007FE, 0x0007000C, 0x00000013,\n    0x00005E0A, 0x00000001, 0x00000028, 0x00000049, 0x0000474B, 0x00050051,\n    0x0000000D, 0x00005F0E, 0x00005E0A, 0x00000000, 0x00050051, 0x0000000D,\n    0x00003CD7, 0x00005E0A, 0x00000001, 0x00070050, 0x0000001D, 0x00004121,\n    0x00005F0E, 0x00003CD7, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B,\n    0x00004C45, 0x00002AC0, 0x00000001, 0x0004007C, 0x0000000C, 0x00003EA4,\n    0x00004C45, 0x00050050, 0x00000012, 0x0000471F, 0x00003EA4, 0x00003EA4,\n    0x000500C4, 0x00000012, 0x000047B2, 0x0000471F, 0x000007A7, 0x000500C3,\n    0x00000012, 0x0000341C, 0x000047B2, 0x00000867, 0x0004006F, 0x00000013,\n    0x00002AA4, 0x0000341C, 0x0005008E, 0x00000013, 0x0000474C, 0x00002AA4,\n    0x000007FE, 0x0007000C, 0x00000013, 0x00005E0B, 0x00000001, 0x00000028,\n    0x00000049, 0x0000474C, 0x00050051, 0x0000000D, 0x00005F0F, 0x00005E0B,\n    0x00000000, 0x00050051, 0x0000000D, 0x00003CD8, 0x00005E0B, 0x00000001,\n    0x00070050, 0x0000001D, 0x00004122, 0x00005F0F, 0x00003CD8, 0x00000A0C,\n    0x00000A0C, 0x00050051, 0x0000000B, 0x00004C46, 0x00002AC0, 0x00000002,\n    0x0004007C, 0x0000000C, 0x00003EA5, 0x00004C46, 0x00050050, 0x00000012,\n    0x00004720, 0x00003EA5, 0x00003EA5, 0x000500C4, 0x00000012, 0x000047B3,\n    0x00004720, 0x000007A7, 0x000500C3, 0x00000012, 0x0000341D, 0x000047B3,\n    0x00000867, 0x0004006F, 0x00000013, 0x00002AA5, 0x0000341D, 0x0005008E,\n    0x00000013, 0x0000474D, 0x00002AA5, 0x000007FE, 0x0007000C, 0x00000013,\n    0x00005E0C, 0x00000001, 0x00000028, 0x00000049, 0x0000474D, 0x00050051,\n    0x0000000D, 0x00005F10, 0x00005E0C, 0x00000000, 0x00050051, 0x0000000D,\n    0x00003CD9, 0x00005E0C, 0x00000001, 0x00070050, 0x0000001D, 0x00004123,\n    0x00005F10, 0x00003CD9, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B,\n    0x00004C47, 0x00002AC0, 0x00000003, 0x0004007C, 0x0000000C, 0x00003EA6,\n    0x00004C47, 0x00050050, 0x00000012, 0x00004724, 0x00003EA6, 0x00003EA6,\n    0x000500C4, 0x00000012, 0x000047B4, 0x00004724, 0x000007A7, 0x000500C3,\n    0x00000012, 0x0000341E, 0x000047B4, 0x00000867, 0x0004006F, 0x00000013,\n    0x00002AA6, 0x0000341E, 0x0005008E, 0x00000013, 0x0000474E, 0x00002AA6,\n    0x000007FE, 0x0007000C, 0x00000013, 0x00005E0D, 0x00000001, 0x00000028,\n    0x00000049, 0x0000474E, 0x00050051, 0x0000000D, 0x00005F11, 0x00005E0D,\n    0x00000000, 0x00050051, 0x0000000D, 0x0000494D, 0x00005E0D, 0x00000001,\n    0x00070050, 0x0000001D, 0x0000234F, 0x00005F11, 0x0000494D, 0x00000A0C,\n    0x00000A0C, 0x000200F9, 0x00003F61, 0x000200F8, 0x00001CBC, 0x00050051,\n    0x0000000B, 0x000056C0, 0x00002AC0, 0x00000000, 0x00060050, 0x00000014,\n    0x00004F0D, 0x000056C0, 0x000056C0, 0x000056C0, 0x000500C2, 0x00000014,\n    0x00002B12, 0x00004F0D, 0x00000BB4, 0x000500C7, 0x00000014, 0x00005DEA,\n    0x00002B12, 0x00000105, 0x000500C7, 0x00000014, 0x000048A0, 0x00002B12,\n    0x00000466, 0x000500C2, 0x00000014, 0x00005B94, 0x00005DEA, 0x00000B0C,\n    0x000500AA, 0x00000010, 0x000040CD, 0x00005B94, 0x00000A12, 0x0006000C,\n    0x00000016, 0x00002C4F, 0x00000001, 0x0000004B, 0x000048A0, 0x0004007C,\n    0x00000014, 0x00002A19, 0x00002C4F, 0x00050082, 0x00000014, 0x0000187E,\n    0x00000B0C, 0x00002A19, 0x00050080, 0x00000014, 0x00002214, 0x00002A19,\n    0x00000938, 0x000600A9, 0x00000014, 0x00002873, 0x000040CD, 0x00002214,\n    0x00005B94, 0x000500C4, 0x00000014, 0x00005AD8, 0x000048A0, 0x0000187E,\n    0x000500C7, 0x00000014, 0x0000499E, 0x00005AD8, 0x00000466, 0x000600A9,\n    0x00000014, 0x00002AA7, 0x000040CD, 0x0000499E, 0x000048A0, 0x00050080,\n    0x00000014, 0x00005FFD, 0x00002873, 0x000003FA, 0x000500C4, 0x00000014,\n    0x00004F83, 0x00005FFD, 0x00000189, 0x000500C4, 0x00000014, 0x00003FAA,\n    0x00002AA7, 0x0000008D, 0x000500C5, 0x00000014, 0x00005780, 0x00004F83,\n    0x00003FAA, 0x000500AA, 0x00000010, 0x00003604, 0x00005DEA, 0x00000A12,\n    0x000600A9, 0x00000014, 0x00004246, 0x00003604, 0x00000A12, 0x00005780,\n    0x0004007C, 0x00000018, 0x000029D3, 0x00004246, 0x000500C2, 0x0000000B,\n    0x00004BA8, 0x000056C0, 0x00000A64, 0x00040070, 0x0000000D, 0x00004812,\n    0x00004BA8, 0x00050085, 0x0000000D, 0x00003E23, 0x00004812, 0x00000149,\n    0x00050051, 0x0000000D, 0x000053C6, 0x000029D3, 0x00000000, 0x00050051,\n    0x0000000D, 0x00002A59, 0x000029D3, 0x00000001, 0x00050051, 0x0000000D,\n    0x00001E9C, 0x000029D3, 0x00000002, 0x00070050, 0x0000001D, 0x00003DDD,\n    0x000053C6, 0x00002A59, 0x00001E9C, 0x00003E23, 0x00050051, 0x0000000B,\n    0x000027F8, 0x00002AC0, 0x00000001, 0x00060050, 0x00000014, 0x00003511,\n    0x000027F8, 0x000027F8, 0x000027F8, 0x000500C2, 0x00000014, 0x00002B13,\n    0x00003511, 0x00000BB4, 0x000500C7, 0x00000014, 0x00005DEB, 0x00002B13,\n    0x00000105, 0x000500C7, 0x00000014, 0x000048A1, 0x00002B13, 0x00000466,\n    0x000500C2, 0x00000014, 0x00005B95, 0x00005DEB, 0x00000B0C, 0x000500AA,\n    0x00000010, 0x000040CE, 0x00005B95, 0x00000A12, 0x0006000C, 0x00000016,\n    0x00002C50, 0x00000001, 0x0000004B, 0x000048A1, 0x0004007C, 0x00000014,\n    0x00002A1A, 0x00002C50, 0x00050082, 0x00000014, 0x0000187F, 0x00000B0C,\n    0x00002A1A, 0x00050080, 0x00000014, 0x00002215, 0x00002A1A, 0x00000938,\n    0x000600A9, 0x00000014, 0x00002874, 0x000040CE, 0x00002215, 0x00005B95,\n    0x000500C4, 0x00000014, 0x00005AD9, 0x000048A1, 0x0000187F, 0x000500C7,\n    0x00000014, 0x0000499F, 0x00005AD9, 0x00000466, 0x000600A9, 0x00000014,\n    0x00002AA8, 0x000040CE, 0x0000499F, 0x000048A1, 0x00050080, 0x00000014,\n    0x00005FFE, 0x00002874, 0x000003FA, 0x000500C4, 0x00000014, 0x00004F84,\n    0x00005FFE, 0x00000189, 0x000500C4, 0x00000014, 0x00003FAB, 0x00002AA8,\n    0x0000008D, 0x000500C5, 0x00000014, 0x00005781, 0x00004F84, 0x00003FAB,\n    0x000500AA, 0x00000010, 0x00003605, 0x00005DEB, 0x00000A12, 0x000600A9,\n    0x00000014, 0x00004247, 0x00003605, 0x00000A12, 0x00005781, 0x0004007C,\n    0x00000018, 0x000029D4, 0x00004247, 0x000500C2, 0x0000000B, 0x00004BA9,\n    0x000027F8, 0x00000A64, 0x00040070, 0x0000000D, 0x00004813, 0x00004BA9,\n    0x00050085, 0x0000000D, 0x00003E24, 0x00004813, 0x00000149, 0x00050051,\n    0x0000000D, 0x000053C7, 0x000029D4, 0x00000000, 0x00050051, 0x0000000D,\n    0x00002A5A, 0x000029D4, 0x00000001, 0x00050051, 0x0000000D, 0x00001E9D,\n    0x000029D4, 0x00000002, 0x00070050, 0x0000001D, 0x00003DDE, 0x000053C7,\n    0x00002A5A, 0x00001E9D, 0x00003E24, 0x00050051, 0x0000000B, 0x000027F9,\n    0x00002AC0, 0x00000002, 0x00060050, 0x00000014, 0x00003512, 0x000027F9,\n    0x000027F9, 0x000027F9, 0x000500C2, 0x00000014, 0x00002B14, 0x00003512,\n    0x00000BB4, 0x000500C7, 0x00000014, 0x00005DEC, 0x00002B14, 0x00000105,\n    0x000500C7, 0x00000014, 0x000048A2, 0x00002B14, 0x00000466, 0x000500C2,\n    0x00000014, 0x00005B96, 0x00005DEC, 0x00000B0C, 0x000500AA, 0x00000010,\n    0x000040CF, 0x00005B96, 0x00000A12, 0x0006000C, 0x00000016, 0x00002C51,\n    0x00000001, 0x0000004B, 0x000048A2, 0x0004007C, 0x00000014, 0x00002A1B,\n    0x00002C51, 0x00050082, 0x00000014, 0x00001880, 0x00000B0C, 0x00002A1B,\n    0x00050080, 0x00000014, 0x00002216, 0x00002A1B, 0x00000938, 0x000600A9,\n    0x00000014, 0x00002875, 0x000040CF, 0x00002216, 0x00005B96, 0x000500C4,\n    0x00000014, 0x00005ADA, 0x000048A2, 0x00001880, 0x000500C7, 0x00000014,\n    0x000049A0, 0x00005ADA, 0x00000466, 0x000600A9, 0x00000014, 0x00002AA9,\n    0x000040CF, 0x000049A0, 0x000048A2, 0x00050080, 0x00000014, 0x00005FFF,\n    0x00002875, 0x000003FA, 0x000500C4, 0x00000014, 0x00004F85, 0x00005FFF,\n    0x00000189, 0x000500C4, 0x00000014, 0x00003FAC, 0x00002AA9, 0x0000008D,\n    0x000500C5, 0x00000014, 0x00005782, 0x00004F85, 0x00003FAC, 0x000500AA,\n    0x00000010, 0x00003606, 0x00005DEC, 0x00000A12, 0x000600A9, 0x00000014,\n    0x00004248, 0x00003606, 0x00000A12, 0x00005782, 0x0004007C, 0x00000018,\n    0x000029D5, 0x00004248, 0x000500C2, 0x0000000B, 0x00004BAA, 0x000027F9,\n    0x00000A64, 0x00040070, 0x0000000D, 0x00004814, 0x00004BAA, 0x00050085,\n    0x0000000D, 0x00003E25, 0x00004814, 0x00000149, 0x00050051, 0x0000000D,\n    0x000053C8, 0x000029D5, 0x00000000, 0x00050051, 0x0000000D, 0x00002A5B,\n    0x000029D5, 0x00000001, 0x00050051, 0x0000000D, 0x00001E9E, 0x000029D5,\n    0x00000002, 0x00070050, 0x0000001D, 0x00003DDF, 0x000053C8, 0x00002A5B,\n    0x00001E9E, 0x00003E25, 0x00050051, 0x0000000B, 0x000027FA, 0x00002AC0,\n    0x00000003, 0x00060050, 0x00000014, 0x00003513, 0x000027FA, 0x000027FA,\n    0x000027FA, 0x000500C2, 0x00000014, 0x00002B15, 0x00003513, 0x00000BB4,\n    0x000500C7, 0x00000014, 0x00005DED, 0x00002B15, 0x00000105, 0x000500C7,\n    0x00000014, 0x000048A3, 0x00002B15, 0x00000466, 0x000500C2, 0x00000014,\n    0x00005B97, 0x00005DED, 0x00000B0C, 0x000500AA, 0x00000010, 0x000040D0,\n    0x00005B97, 0x00000A12, 0x0006000C, 0x00000016, 0x00002C52, 0x00000001,\n    0x0000004B, 0x000048A3, 0x0004007C, 0x00000014, 0x00002A1C, 0x00002C52,\n    0x00050082, 0x00000014, 0x00001881, 0x00000B0C, 0x00002A1C, 0x00050080,\n    0x00000014, 0x00002217, 0x00002A1C, 0x00000938, 0x000600A9, 0x00000014,\n    0x00002876, 0x000040D0, 0x00002217, 0x00005B97, 0x000500C4, 0x00000014,\n    0x00005ADB, 0x000048A3, 0x00001881, 0x000500C7, 0x00000014, 0x000049A1,\n    0x00005ADB, 0x00000466, 0x000600A9, 0x00000014, 0x00002AAA, 0x000040D0,\n    0x000049A1, 0x000048A3, 0x00050080, 0x00000014, 0x00006000, 0x00002876,\n    0x000003FA, 0x000500C4, 0x00000014, 0x00004F86, 0x00006000, 0x00000189,\n    0x000500C4, 0x00000014, 0x00003FAD, 0x00002AAA, 0x0000008D, 0x000500C5,\n    0x00000014, 0x00005783, 0x00004F86, 0x00003FAD, 0x000500AA, 0x00000010,\n    0x00003607, 0x00005DED, 0x00000A12, 0x000600A9, 0x00000014, 0x00004249,\n    0x00003607, 0x00000A12, 0x00005783, 0x0004007C, 0x00000018, 0x000029D6,\n    0x00004249, 0x000500C2, 0x0000000B, 0x00004BAB, 0x000027FA, 0x00000A64,\n    0x00040070, 0x0000000D, 0x00004815, 0x00004BAB, 0x00050085, 0x0000000D,\n    0x00003E26, 0x00004815, 0x00000149, 0x00050051, 0x0000000D, 0x000053C9,\n    0x000029D6, 0x00000000, 0x00050051, 0x0000000D, 0x00002A5C, 0x000029D6,\n    0x00000001, 0x00050051, 0x0000000D, 0x00002B16, 0x000029D6, 0x00000002,\n    0x00070050, 0x0000001D, 0x00002350, 0x000053C9, 0x00002A5C, 0x00002B16,\n    0x00003E26, 0x000200F9, 0x00003F61, 0x000200F8, 0x00001CBD, 0x00050051,\n    0x0000000B, 0x000056C1, 0x00002AC0, 0x00000000, 0x00070050, 0x00000017,\n    0x00004F0E, 0x000056C1, 0x000056C1, 0x000056C1, 0x000056C1, 0x000500C2,\n    0x00000017, 0x000024A0, 0x00004F0E, 0x0000034D, 0x000500C7, 0x00000017,\n    0x000049AF, 0x000024A0, 0x0000027B, 0x00040070, 0x0000001D, 0x00003CBA,\n    0x000049AF, 0x00050085, 0x0000001D, 0x00004133, 0x00003CBA, 0x00000AEE,\n    0x00050051, 0x0000000B, 0x00005CD5, 0x00002AC0, 0x00000001, 0x00070050,\n    0x00000017, 0x00005150, 0x00005CD5, 0x00005CD5, 0x00005CD5, 0x00005CD5,\n    0x000500C2, 0x00000017, 0x000024A1, 0x00005150, 0x0000034D, 0x000500C7,\n    0x00000017, 0x000049B0, 0x000024A1, 0x0000027B, 0x00040070, 0x0000001D,\n    0x00003CBB, 0x000049B0, 0x00050085, 0x0000001D, 0x00004134, 0x00003CBB,\n    0x00000AEE, 0x00050051, 0x0000000B, 0x00005CD6, 0x00002AC0, 0x00000002,\n    0x00070050, 0x00000017, 0x00005151, 0x00005CD6, 0x00005CD6, 0x00005CD6,\n    0x00005CD6, 0x000500C2, 0x00000017, 0x000024A2, 0x00005151, 0x0000034D,\n    0x000500C7, 0x00000017, 0x000049B1, 0x000024A2, 0x0000027B, 0x00040070,\n    0x0000001D, 0x00003CBC, 0x000049B1, 0x00050085, 0x0000001D, 0x00004135,\n    0x00003CBC, 0x00000AEE, 0x00050051, 0x0000000B, 0x00005CD7, 0x00002AC0,\n    0x00000003, 0x00070050, 0x00000017, 0x00005152, 0x00005CD7, 0x00005CD7,\n    0x00005CD7, 0x00005CD7, 0x000500C2, 0x00000017, 0x000024A3, 0x00005152,\n    0x0000034D, 0x000500C7, 0x00000017, 0x000049B2, 0x000024A3, 0x0000027B,\n    0x00040070, 0x0000001D, 0x00004930, 0x000049B2, 0x00050085, 0x0000001D,\n    0x000026A0, 0x00004930, 0x00000AEE, 0x000200F9, 0x00003F61, 0x000200F8,\n    0x000038FA, 0x00050051, 0x0000000B, 0x000056C2, 0x00002AC0, 0x00000000,\n    0x00070050, 0x00000017, 0x00004F0F, 0x000056C2, 0x000056C2, 0x000056C2,\n    0x000056C2, 0x000500C2, 0x00000017, 0x000024A4, 0x00004F0F, 0x0000028D,\n    0x000500C7, 0x00000017, 0x00004A5A, 0x000024A4, 0x0000064B, 0x00040070,\n    0x0000001D, 0x000036A5, 0x00004A5A, 0x0005008E, 0x0000001D, 0x00004B26,\n    0x000036A5, 0x0000017A, 0x00050051, 0x0000000B, 0x000021A2, 0x00002AC0,\n    0x00000001, 0x00070050, 0x00000017, 0x0000610E, 0x000021A2, 0x000021A2,\n    0x000021A2, 0x000021A2, 0x000500C2, 0x00000017, 0x000024A5, 0x0000610E,\n    0x0000028D, 0x000500C7, 0x00000017, 0x00004A5B, 0x000024A5, 0x0000064B,\n    0x00040070, 0x0000001D, 0x000036A6, 0x00004A5B, 0x0005008E, 0x0000001D,\n    0x00004B27, 0x000036A6, 0x0000017A, 0x00050051, 0x0000000B, 0x000021A3,\n    0x00002AC0, 0x00000002, 0x00070050, 0x00000017, 0x0000610F, 0x000021A3,\n    0x000021A3, 0x000021A3, 0x000021A3, 0x000500C2, 0x00000017, 0x000024A6,\n    0x0000610F, 0x0000028D, 0x000500C7, 0x00000017, 0x00004A5C, 0x000024A6,\n    0x0000064B, 0x00040070, 0x0000001D, 0x000036A7, 0x00004A5C, 0x0005008E,\n    0x0000001D, 0x00004B28, 0x000036A7, 0x0000017A, 0x00050051, 0x0000000B,\n    0x000021A4, 0x00002AC0, 0x00000003, 0x00070050, 0x00000017, 0x00006110,\n    0x000021A4, 0x000021A4, 0x000021A4, 0x000021A4, 0x000500C2, 0x00000017,\n    0x000024A7, 0x00006110, 0x0000028D, 0x000500C7, 0x00000017, 0x00004A5D,\n    0x000024A7, 0x0000064B, 0x00040070, 0x0000001D, 0x0000431B, 0x00004A5D,\n    0x0005008E, 0x0000001D, 0x00003093, 0x0000431B, 0x0000017A, 0x000200F9,\n    0x00003F61, 0x000200F8, 0x00004BFC, 0x00050051, 0x0000000B, 0x0000308E,\n    0x00002AC0, 0x00000000, 0x0004007C, 0x0000000D, 0x00004FEF, 0x0000308E,\n    0x00050050, 0x00000013, 0x00004339, 0x00004FEF, 0x00000A0C, 0x0009004F,\n    0x0000001D, 0x00002D93, 0x00004339, 0x00004339, 0x00000000, 0x00000001,\n    0x00000001, 0x00000001, 0x00050051, 0x0000000B, 0x000056B4, 0x00002AC0,\n    0x00000001, 0x0004007C, 0x0000000D, 0x00003F6B, 0x000056B4, 0x00050050,\n    0x00000013, 0x0000433A, 0x00003F6B, 0x00000A0C, 0x0009004F, 0x0000001D,\n    0x00002D94, 0x0000433A, 0x0000433A, 0x00000000, 0x00000001, 0x00000001,\n    0x00000001, 0x00050051, 0x0000000B, 0x000056B5, 0x00002AC0, 0x00000002,\n    0x0004007C, 0x0000000D, 0x00003F6C, 0x000056B5, 0x00050050, 0x00000013,\n    0x0000433B, 0x00003F6C, 0x00000A0C, 0x0009004F, 0x0000001D, 0x00002D95,\n    0x0000433B, 0x0000433B, 0x00000000, 0x00000001, 0x00000001, 0x00000001,\n    0x00050051, 0x0000000B, 0x000056B6, 0x00002AC0, 0x00000003, 0x0004007C,\n    0x0000000D, 0x00003F6D, 0x000056B6, 0x00050050, 0x00000013, 0x00004FAF,\n    0x00003F6D, 0x00000A0C, 0x0009004F, 0x0000001D, 0x00005A3B, 0x00004FAF,\n    0x00004FAF, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x000200F9,\n    0x00003F61, 0x000200F8, 0x00003F61, 0x000F00F5, 0x0000001D, 0x00002BAA,\n    0x00005A3B, 0x00004BFC, 0x00003093, 0x000038FA, 0x000026A0, 0x00001CBD,\n    0x00002350, 0x00001CBC, 0x0000234F, 0x00001FFF, 0x0000234E, 0x00002035,\n    0x000F00F5, 0x0000001D, 0x0000380B, 0x00002D95, 0x00004BFC, 0x00004B28,\n    0x000038FA, 0x00004135, 0x00001CBD, 0x00003DDF, 0x00001CBC, 0x00004123,\n    0x00001FFF, 0x00003914, 0x00002035, 0x000F00F5, 0x0000001D, 0x00003B7F,\n    0x00002D94, 0x00004BFC, 0x00004B27, 0x000038FA, 0x00004134, 0x00001CBD,\n    0x00003DDE, 0x00001CBC, 0x00004122, 0x00001FFF, 0x00003913, 0x00002035,\n    0x000F00F5, 0x0000001D, 0x000038B8, 0x00002D93, 0x00004BFC, 0x00004B26,\n    0x000038FA, 0x00004133, 0x00001CBD, 0x00003DDD, 0x00001CBC, 0x00004121,\n    0x00001FFF, 0x00003912, 0x00002035, 0x000200F9, 0x00005310, 0x000200F8,\n    0x00003B66, 0x000500AA, 0x00000009, 0x00005451, 0x0000199B, 0x00000A22,\n    0x000300F7, 0x00004F25, 0x00000002, 0x000400FA, 0x00005451, 0x000019C2,\n    0x00002302, 0x000200F8, 0x00002302, 0x000500C2, 0x0000000B, 0x00005633,\n    0x00005E78, 0x00000A11, 0x00060041, 0x00000289, 0x0000343F, 0x00000CC7,\n    0x00000A0B, 0x00005633, 0x0004003D, 0x0000000B, 0x00003149, 0x0000343F,\n    0x00050080, 0x0000000B, 0x00002DB7, 0x00005633, 0x00000A0D, 0x00060041,\n    0x00000289, 0x00001908, 0x00000CC7, 0x00000A0B, 0x00002DB7, 0x0004003D,\n    0x0000000B, 0x00001B77, 0x00001908, 0x00050080, 0x0000000B, 0x00002148,\n    0x00005E78, 0x0000199B, 0x000500C2, 0x0000000B, 0x000054A9, 0x00002148,\n    0x00000A11, 0x00060041, 0x00000289, 0x00004C95, 0x00000CC7, 0x00000A0B,\n    0x000054A9, 0x0004003D, 0x0000000B, 0x0000314A, 0x00004C95, 0x00050080,\n    0x0000000B, 0x00002DB8, 0x000054A9, 0x00000A0D, 0x00060041, 0x00000289,\n    0x00005FF4, 0x00000CC7, 0x00000A0B, 0x00002DB8, 0x0004003D, 0x0000000B,\n    0x0000374D, 0x00005FF4, 0x00070050, 0x00000017, 0x00004CD7, 0x00003149,\n    0x00001B77, 0x0000314A, 0x0000374D, 0x00050084, 0x0000000B, 0x00004C2C,\n    0x00000A10, 0x0000199B, 0x00050080, 0x0000000B, 0x00002A46, 0x00005E78,\n    0x00004C2C, 0x000500C2, 0x0000000B, 0x000045E8, 0x00002A46, 0x00000A11,\n    0x00060041, 0x00000289, 0x00004C96, 0x00000CC7, 0x00000A0B, 0x000045E8,\n    0x0004003D, 0x0000000B, 0x0000314B, 0x00004C96, 0x00050080, 0x0000000B,\n    0x00002DB9, 0x000045E8, 0x00000A0D, 0x00060041, 0x00000289, 0x0000194C,\n    0x00000CC7, 0x00000A0B, 0x00002DB9, 0x0004003D, 0x0000000B, 0x00005E5C,\n    0x0000194C, 0x00050084, 0x0000000B, 0x000021F2, 0x00000A13, 0x0000199B,\n    0x00050080, 0x0000000B, 0x00005EC3, 0x00005E78, 0x000021F2, 0x000500C2,\n    0x0000000B, 0x000045E9, 0x00005EC3, 0x00000A11, 0x00060041, 0x00000289,\n    0x00004C97, 0x00000CC7, 0x00000A0B, 0x000045E9, 0x0004003D, 0x0000000B,\n    0x0000314C, 0x00004C97, 0x00050080, 0x0000000B, 0x00002DBA, 0x000045E9,\n    0x00000A0D, 0x00060041, 0x00000289, 0x00005FF5, 0x00000CC7, 0x00000A0B,\n    0x00002DBA, 0x0004003D, 0x0000000B, 0x00003FFF, 0x00005FF5, 0x00070050,\n    0x00000017, 0x00005132, 0x0000314B, 0x00005E5C, 0x0000314C, 0x00003FFF,\n    0x000200F9, 0x00004F25, 0x000200F8, 0x000019C2, 0x000500C2, 0x0000000B,\n    0x00005FA9, 0x00005E78, 0x00000A11, 0x00060041, 0x00000289, 0x00003440,\n    0x00000CC7, 0x00000A0B, 0x00005FA9, 0x0004003D, 0x0000000B, 0x0000314D,\n    0x00003440, 0x00050080, 0x0000000B, 0x00002DBB, 0x00005FA9, 0x00000A0D,\n    0x00060041, 0x00000289, 0x00001909, 0x00000CC7, 0x00000A0B, 0x00002DBB,\n    0x0004003D, 0x0000000B, 0x00005C6A, 0x00001909, 0x00050080, 0x0000000B,\n    0x00002DBC, 0x00005FA9, 0x00000A10, 0x00060041, 0x00000289, 0x0000190A,\n    0x00000CC7, 0x00000A0B, 0x00002DBC, 0x0004003D, 0x0000000B, 0x00005C6B,\n    0x0000190A, 0x00050080, 0x0000000B, 0x00002DBD, 0x00005FA9, 0x00000A13,\n    0x00060041, 0x00000289, 0x00005FF6, 0x00000CC7, 0x00000A0B, 0x00002DBD,\n    0x0004003D, 0x0000000B, 0x00003701, 0x00005FF6, 0x00070050, 0x00000017,\n    0x00005471, 0x0000314D, 0x00005C6A, 0x00005C6B, 0x00003701, 0x00050080,\n    0x0000000B, 0x00004B84, 0x00005BEB, 0x00000237, 0x000500C2, 0x0000000B,\n    0x0000202E, 0x00004B84, 0x00000A11, 0x00060041, 0x00000289, 0x00004C98,\n    0x00000CC7, 0x00000A0B, 0x0000202E, 0x0004003D, 0x0000000B, 0x0000314E,\n    0x00004C98, 0x00050080, 0x0000000B, 0x00002DBE, 0x0000202E, 0x00000A0D,\n    0x00060041, 0x00000289, 0x0000190B, 0x00000CC7, 0x00000A0B, 0x00002DBE,\n    0x0004003D, 0x0000000B, 0x00005C6C, 0x0000190B, 0x00050080, 0x0000000B,\n    0x00002DBF, 0x0000202E, 0x00000A10, 0x00060041, 0x00000289, 0x0000190C,\n    0x00000CC7, 0x00000A0B, 0x00002DBF, 0x0004003D, 0x0000000B, 0x00005C6D,\n    0x0000190C, 0x00050080, 0x0000000B, 0x00002DC0, 0x0000202E, 0x00000A13,\n    0x00060041, 0x00000289, 0x00005FF7, 0x00000CC7, 0x00000A0B, 0x00002DC0,\n    0x0004003D, 0x0000000B, 0x00004000, 0x00005FF7, 0x00070050, 0x00000017,\n    0x00005133, 0x0000314E, 0x00005C6C, 0x00005C6D, 0x00004000, 0x000200F9,\n    0x00004F25, 0x000200F8, 0x00004F25, 0x000700F5, 0x00000017, 0x00002BCE,\n    0x00005133, 0x000019C2, 0x00005132, 0x00002302, 0x000700F5, 0x00000017,\n    0x00003721, 0x00005471, 0x000019C2, 0x00004CD7, 0x00002302, 0x000300F7,\n    0x00004F26, 0x00000000, 0x000700FB, 0x00002180, 0x00004F57, 0x00000005,\n    0x00002159, 0x00000007, 0x00002036, 0x000200F8, 0x00002036, 0x00050051,\n    0x0000000B, 0x00005F5B, 0x00003721, 0x00000000, 0x0006000C, 0x00000013,\n    0x0000606A, 0x00000001, 0x0000003E, 0x00005F5B, 0x00050051, 0x0000000D,\n    0x00002779, 0x0000606A, 0x00000000, 0x00050051, 0x0000000D, 0x00003EBC,\n    0x0000606A, 0x00000001, 0x00050051, 0x0000000B, 0x00004285, 0x00003721,\n    0x00000001, 0x0006000C, 0x00000013, 0x00003CF9, 0x00000001, 0x0000003E,\n    0x00004285, 0x00050051, 0x0000000D, 0x0000276E, 0x00003CF9, 0x00000000,\n    0x00050051, 0x0000000D, 0x0000444F, 0x00003CF9, 0x00000001, 0x00070050,\n    0x0000001D, 0x00003915, 0x00002779, 0x00003EBC, 0x0000276E, 0x0000444F,\n    0x00050051, 0x0000000B, 0x00004383, 0x00003721, 0x00000002, 0x0006000C,\n    0x00000013, 0x00004674, 0x00000001, 0x0000003E, 0x00004383, 0x00050051,\n    0x0000000D, 0x0000277A, 0x00004674, 0x00000000, 0x00050051, 0x0000000D,\n    0x00003EBD, 0x00004674, 0x00000001, 0x00050051, 0x0000000B, 0x00004286,\n    0x00003721, 0x00000003, 0x0006000C, 0x00000013, 0x00003CFA, 0x00000001,\n    0x0000003E, 0x00004286, 0x00050051, 0x0000000D, 0x0000276F, 0x00003CFA,\n    0x00000000, 0x00050051, 0x0000000D, 0x00004450, 0x00003CFA, 0x00000001,\n    0x00070050, 0x0000001D, 0x00003916, 0x0000277A, 0x00003EBD, 0x0000276F,\n    0x00004450, 0x00050051, 0x0000000B, 0x00004384, 0x00002BCE, 0x00000000,\n    0x0006000C, 0x00000013, 0x00004675, 0x00000001, 0x0000003E, 0x00004384,\n    0x00050051, 0x0000000D, 0x0000277B, 0x00004675, 0x00000000, 0x00050051,\n    0x0000000D, 0x00003EBE, 0x00004675, 0x00000001, 0x00050051, 0x0000000B,\n    0x00004287, 0x00002BCE, 0x00000001, 0x0006000C, 0x00000013, 0x00003CFB,\n    0x00000001, 0x0000003E, 0x00004287, 0x00050051, 0x0000000D, 0x00002770,\n    0x00003CFB, 0x00000000, 0x00050051, 0x0000000D, 0x00004451, 0x00003CFB,\n    0x00000001, 0x00070050, 0x0000001D, 0x00003917, 0x0000277B, 0x00003EBE,\n    0x00002770, 0x00004451, 0x00050051, 0x0000000B, 0x00004385, 0x00002BCE,\n    0x00000002, 0x0006000C, 0x00000013, 0x00004676, 0x00000001, 0x0000003E,\n    0x00004385, 0x00050051, 0x0000000D, 0x0000277C, 0x00004676, 0x00000000,\n    0x00050051, 0x0000000D, 0x00003EBF, 0x00004676, 0x00000001, 0x00050051,\n    0x0000000B, 0x00004288, 0x00002BCE, 0x00000003, 0x0006000C, 0x00000013,\n    0x00003CFC, 0x00000001, 0x0000003E, 0x00004288, 0x00050051, 0x0000000D,\n    0x00002771, 0x00003CFC, 0x00000000, 0x00050051, 0x0000000D, 0x000050C1,\n    0x00003CFC, 0x00000001, 0x00070050, 0x0000001D, 0x00002351, 0x0000277C,\n    0x00003EBF, 0x00002771, 0x000050C1, 0x000200F9, 0x00004F26, 0x000200F8,\n    0x00002159, 0x0007004F, 0x00000011, 0x000025FC, 0x00003721, 0x00003721,\n    0x00000000, 0x00000001, 0x0004007C, 0x00000012, 0x00005B3D, 0x000025FC,\n    0x0009004F, 0x0000001A, 0x000060D2, 0x00005B3D, 0x00005B3D, 0x00000000,\n    0x00000000, 0x00000001, 0x00000001, 0x000500C4, 0x0000001A, 0x000048AA,\n    0x000060D2, 0x00000122, 0x000500C3, 0x0000001A, 0x00003D91, 0x000048AA,\n    0x00000302, 0x0004006F, 0x0000001D, 0x00002AAB, 0x00003D91, 0x0005008E,\n    0x0000001D, 0x00004725, 0x00002AAB, 0x000007FE, 0x0007000C, 0x0000001D,\n    0x00006294, 0x00000001, 0x00000028, 0x00000504, 0x00004725, 0x0007004F,\n    0x00000011, 0x0000376E, 0x00003721, 0x00003721, 0x00000002, 0x00000003,\n    0x0004007C, 0x00000012, 0x000024C2, 0x0000376E, 0x0009004F, 0x0000001A,\n    0x000060D3, 0x000024C2, 0x000024C2, 0x00000000, 0x00000000, 0x00000001,\n    0x00000001, 0x000500C4, 0x0000001A, 0x000048AB, 0x000060D3, 0x00000122,\n    0x000500C3, 0x0000001A, 0x00003D92, 0x000048AB, 0x00000302, 0x0004006F,\n    0x0000001D, 0x00002AAC, 0x00003D92, 0x0005008E, 0x0000001D, 0x00004726,\n    0x00002AAC, 0x000007FE, 0x0007000C, 0x0000001D, 0x00006295, 0x00000001,\n    0x00000028, 0x00000504, 0x00004726, 0x0007004F, 0x00000011, 0x0000376F,\n    0x00002BCE, 0x00002BCE, 0x00000000, 0x00000001, 0x0004007C, 0x00000012,\n    0x000024C3, 0x0000376F, 0x0009004F, 0x0000001A, 0x000060D4, 0x000024C3,\n    0x000024C3, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x000500C4,\n    0x0000001A, 0x000048AC, 0x000060D4, 0x00000122, 0x000500C3, 0x0000001A,\n    0x00003D93, 0x000048AC, 0x00000302, 0x0004006F, 0x0000001D, 0x00002AAD,\n    0x00003D93, 0x0005008E, 0x0000001D, 0x00004727, 0x00002AAD, 0x000007FE,\n    0x0007000C, 0x0000001D, 0x00006296, 0x00000001, 0x00000028, 0x00000504,\n    0x00004727, 0x0007004F, 0x00000011, 0x00003770, 0x00002BCE, 0x00002BCE,\n    0x00000002, 0x00000003, 0x0004007C, 0x00000012, 0x000024C4, 0x00003770,\n    0x0009004F, 0x0000001A, 0x000060D5, 0x000024C4, 0x000024C4, 0x00000000,\n    0x00000000, 0x00000001, 0x00000001, 0x000500C4, 0x0000001A, 0x000048AD,\n    0x000060D5, 0x00000122, 0x000500C3, 0x0000001A, 0x00003D94, 0x000048AD,\n    0x00000302, 0x0004006F, 0x0000001D, 0x00002AAE, 0x00003D94, 0x0005008E,\n    0x0000001D, 0x000053C0, 0x00002AAE, 0x000007FE, 0x0007000C, 0x0000001D,\n    0x00004363, 0x00000001, 0x00000028, 0x00000504, 0x000053C0, 0x000200F9,\n    0x00004F26, 0x000200F8, 0x00004F57, 0x0007004F, 0x00000011, 0x00002622,\n    0x00003721, 0x00003721, 0x00000000, 0x00000001, 0x0004007C, 0x00000013,\n    0x0000515A, 0x00002622, 0x00050051, 0x0000000D, 0x00001B7F, 0x0000515A,\n    0x00000000, 0x00050051, 0x0000000D, 0x0000346D, 0x0000515A, 0x00000001,\n    0x00070050, 0x0000001D, 0x0000427B, 0x00001B7F, 0x0000346D, 0x00000A0C,\n    0x00000A0C, 0x0007004F, 0x00000011, 0x000041DB, 0x00003721, 0x00003721,\n    0x00000002, 0x00000003, 0x0004007C, 0x00000013, 0x00003760, 0x000041DB,\n    0x00050051, 0x0000000D, 0x00001B80, 0x00003760, 0x00000000, 0x00050051,\n    0x0000000D, 0x0000346E, 0x00003760, 0x00000001, 0x00070050, 0x0000001D,\n    0x0000427C, 0x00001B80, 0x0000346E, 0x00000A0C, 0x00000A0C, 0x0007004F,\n    0x00000011, 0x000041DC, 0x00002BCE, 0x00002BCE, 0x00000000, 0x00000001,\n    0x0004007C, 0x00000013, 0x00003761, 0x000041DC, 0x00050051, 0x0000000D,\n    0x00001B81, 0x00003761, 0x00000000, 0x00050051, 0x0000000D, 0x0000346F,\n    0x00003761, 0x00000001, 0x00070050, 0x0000001D, 0x0000427D, 0x00001B81,\n    0x0000346F, 0x00000A0C, 0x00000A0C, 0x0007004F, 0x00000011, 0x000041DD,\n    0x00002BCE, 0x00002BCE, 0x00000002, 0x00000003, 0x0004007C, 0x00000013,\n    0x00003762, 0x000041DD, 0x00050051, 0x0000000D, 0x00001B82, 0x00003762,\n    0x00000000, 0x00050051, 0x0000000D, 0x00004109, 0x00003762, 0x00000001,\n    0x00070050, 0x0000001D, 0x00002352, 0x00001B82, 0x00004109, 0x00000A0C,\n    0x00000A0C, 0x000200F9, 0x00004F26, 0x000200F8, 0x00004F26, 0x000900F5,\n    0x0000001D, 0x00002BAB, 0x00002352, 0x00004F57, 0x00004363, 0x00002159,\n    0x00002351, 0x00002036, 0x000900F5, 0x0000001D, 0x0000380C, 0x0000427D,\n    0x00004F57, 0x00006296, 0x00002159, 0x00003917, 0x00002036, 0x000900F5,\n    0x0000001D, 0x00003B80, 0x0000427C, 0x00004F57, 0x00006295, 0x00002159,\n    0x00003916, 0x00002036, 0x000900F5, 0x0000001D, 0x000038B9, 0x0000427B,\n    0x00004F57, 0x00006294, 0x00002159, 0x00003915, 0x00002036, 0x000200F9,\n    0x00005310, 0x000200F8, 0x00005310, 0x000700F5, 0x0000001D, 0x00002BAC,\n    0x00002BAB, 0x00004F26, 0x00002BAA, 0x00003F61, 0x000700F5, 0x0000001D,\n    0x0000380D, 0x0000380C, 0x00004F26, 0x0000380B, 0x00003F61, 0x000700F5,\n    0x0000001D, 0x00003295, 0x00003B80, 0x00004F26, 0x00003B7F, 0x00003F61,\n    0x000700F5, 0x0000001D, 0x0000367A, 0x000038B9, 0x00004F26, 0x000038B8,\n    0x00003F61, 0x00050081, 0x0000001D, 0x00004359, 0x000020D3, 0x0000367A,\n    0x00050081, 0x0000001D, 0x00005B01, 0x000035EC, 0x00003295, 0x00050081,\n    0x0000001D, 0x00001F92, 0x0000380A, 0x0000380D, 0x00050081, 0x0000001D,\n    0x00005113, 0x00002BA9, 0x00002BAC, 0x000500AE, 0x00000009, 0x0000387D,\n    0x00003F4D, 0x00000A1C, 0x000300F7, 0x00005ECB, 0x00000002, 0x000400FA,\n    0x0000387D, 0x000026B1, 0x00005ECB, 0x000200F8, 0x000026B1, 0x000500C4,\n    0x0000000B, 0x000037B2, 0x00000A16, 0x000023AA, 0x00050085, 0x0000000D,\n    0x00002F3A, 0x00002B2C, 0x0000016E, 0x00050080, 0x0000000B, 0x000051FC,\n    0x00005BEB, 0x000037B2, 0x000300F7, 0x00005311, 0x00000002, 0x000400FA,\n    0x00005AEF, 0x00003B67, 0x000040BB, 0x000200F8, 0x000040BB, 0x000500AA,\n    0x00000009, 0x00004ADD, 0x0000199B, 0x00000A16, 0x000300F7, 0x00004F4B,\n    0x00000002, 0x000400FA, 0x00004ADD, 0x000019C3, 0x00002303, 0x000200F8,\n    0x00002303, 0x000500C2, 0x0000000B, 0x00005634, 0x000051FC, 0x00000A11,\n    0x00060041, 0x00000289, 0x00003441, 0x00000CC7, 0x00000A0B, 0x00005634,\n    0x0004003D, 0x0000000B, 0x00003AD6, 0x00003441, 0x00050080, 0x0000000B,\n    0x00002149, 0x000051FC, 0x0000199B, 0x000500C2, 0x0000000B, 0x000054AA,\n    0x00002149, 0x00000A11, 0x00060041, 0x00000289, 0x00004CE1, 0x00000CC7,\n    0x00000A0B, 0x000054AA, 0x0004003D, 0x0000000B, 0x0000333E, 0x00004CE1,\n    0x00050084, 0x0000000B, 0x000021F3, 0x00000A10, 0x0000199B, 0x00050080,\n    0x0000000B, 0x00005EC4, 0x000051FC, 0x000021F3, 0x000500C2, 0x0000000B,\n    0x000045EA, 0x00005EC4, 0x00000A11, 0x00060041, 0x00000289, 0x00004CE2,\n    0x00000CC7, 0x00000A0B, 0x000045EA, 0x0004003D, 0x0000000B, 0x0000333F,\n    0x00004CE2, 0x00050084, 0x0000000B, 0x000021F4, 0x00000A13, 0x0000199B,\n    0x00050080, 0x0000000B, 0x00005EC5, 0x000051FC, 0x000021F4, 0x000500C2,\n    0x0000000B, 0x000045EB, 0x00005EC5, 0x00000A11, 0x00060041, 0x00000289,\n    0x00004903, 0x00000CC7, 0x00000A0B, 0x000045EB, 0x0004003D, 0x0000000B,\n    0x00005F5C, 0x00004903, 0x00070050, 0x00000017, 0x00005134, 0x00003AD6,\n    0x0000333E, 0x0000333F, 0x00005F5C, 0x000200F9, 0x00004F4B, 0x000200F8,\n    0x000019C3, 0x000500C2, 0x0000000B, 0x00005FAA, 0x000051FC, 0x00000A11,\n    0x00060041, 0x00000289, 0x00003442, 0x00000CC7, 0x00000A0B, 0x00005FAA,\n    0x0004003D, 0x0000000B, 0x0000314F, 0x00003442, 0x00050080, 0x0000000B,\n    0x00002DC1, 0x00005FAA, 0x00000A0D, 0x00060041, 0x00000289, 0x0000190D,\n    0x00000CC7, 0x00000A0B, 0x00002DC1, 0x0004003D, 0x0000000B, 0x00005C6E,\n    0x0000190D, 0x00050080, 0x0000000B, 0x00002DC2, 0x00005FAA, 0x00000A10,\n    0x00060041, 0x00000289, 0x0000190E, 0x00000CC7, 0x00000A0B, 0x00002DC2,\n    0x0004003D, 0x0000000B, 0x00005C6F, 0x0000190E, 0x00050080, 0x0000000B,\n    0x00002DC3, 0x00005FAA, 0x00000A13, 0x00060041, 0x00000289, 0x00005FF8,\n    0x00000CC7, 0x00000A0B, 0x00002DC3, 0x0004003D, 0x0000000B, 0x00004001,\n    0x00005FF8, 0x00070050, 0x00000017, 0x00005135, 0x0000314F, 0x00005C6E,\n    0x00005C6F, 0x00004001, 0x000200F9, 0x00004F4B, 0x000200F8, 0x00004F4B,\n    0x000700F5, 0x00000017, 0x00002AC1, 0x00005135, 0x000019C3, 0x00005134,\n    0x00002303, 0x000300F7, 0x00003F62, 0x00000000, 0x001300FB, 0x00002180,\n    0x00004BFD, 0x00000000, 0x000038FB, 0x00000001, 0x000038FB, 0x00000002,\n    0x00001CBF, 0x0000000A, 0x00001CBF, 0x00000003, 0x00001CBE, 0x0000000C,\n    0x00001CBE, 0x00000004, 0x00002000, 0x00000006, 0x00002037, 0x000200F8,\n    0x00002037, 0x00050051, 0x0000000B, 0x00005F5D, 0x00002AC1, 0x00000000,\n    0x0006000C, 0x00000013, 0x0000606B, 0x00000001, 0x0000003E, 0x00005F5D,\n    0x00050051, 0x0000000D, 0x00002772, 0x0000606B, 0x00000000, 0x00050051,\n    0x0000000D, 0x00004452, 0x0000606B, 0x00000001, 0x00070050, 0x0000001D,\n    0x00003918, 0x00002772, 0x00004452, 0x00000A0C, 0x00000A0C, 0x00050051,\n    0x0000000B, 0x00004386, 0x00002AC1, 0x00000001, 0x0006000C, 0x00000013,\n    0x00004677, 0x00000001, 0x0000003E, 0x00004386, 0x00050051, 0x0000000D,\n    0x00002773, 0x00004677, 0x00000000, 0x00050051, 0x0000000D, 0x00004453,\n    0x00004677, 0x00000001, 0x00070050, 0x0000001D, 0x00003919, 0x00002773,\n    0x00004453, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x00004387,\n    0x00002AC1, 0x00000002, 0x0006000C, 0x00000013, 0x00004678, 0x00000001,\n    0x0000003E, 0x00004387, 0x00050051, 0x0000000D, 0x00002774, 0x00004678,\n    0x00000000, 0x00050051, 0x0000000D, 0x00004454, 0x00004678, 0x00000001,\n    0x00070050, 0x0000001D, 0x0000391A, 0x00002774, 0x00004454, 0x00000A0C,\n    0x00000A0C, 0x00050051, 0x0000000B, 0x00004388, 0x00002AC1, 0x00000003,\n    0x0006000C, 0x00000013, 0x00004679, 0x00000001, 0x0000003E, 0x00004388,\n    0x00050051, 0x0000000D, 0x0000277D, 0x00004679, 0x00000000, 0x00050051,\n    0x0000000D, 0x000050C2, 0x00004679, 0x00000001, 0x00070050, 0x0000001D,\n    0x00002353, 0x0000277D, 0x000050C2, 0x00000A0C, 0x00000A0C, 0x000200F9,\n    0x00003F62, 0x000200F8, 0x00002000, 0x00050051, 0x0000000B, 0x0000308F,\n    0x00002AC1, 0x00000000, 0x0004007C, 0x0000000C, 0x0000589F, 0x0000308F,\n    0x00050050, 0x00000012, 0x00004728, 0x0000589F, 0x0000589F, 0x000500C4,\n    0x00000012, 0x000047B5, 0x00004728, 0x000007A7, 0x000500C3, 0x00000012,\n    0x0000341F, 0x000047B5, 0x00000867, 0x0004006F, 0x00000013, 0x00002AAF,\n    0x0000341F, 0x0005008E, 0x00000013, 0x0000474F, 0x00002AAF, 0x000007FE,\n    0x0007000C, 0x00000013, 0x00005E0E, 0x00000001, 0x00000028, 0x00000049,\n    0x0000474F, 0x00050051, 0x0000000D, 0x00005F12, 0x00005E0E, 0x00000000,\n    0x00050051, 0x0000000D, 0x00003CDA, 0x00005E0E, 0x00000001, 0x00070050,\n    0x0000001D, 0x00004124, 0x00005F12, 0x00003CDA, 0x00000A0C, 0x00000A0C,\n    0x00050051, 0x0000000B, 0x00004C48, 0x00002AC1, 0x00000001, 0x0004007C,\n    0x0000000C, 0x00003EA7, 0x00004C48, 0x00050050, 0x00000012, 0x00004729,\n    0x00003EA7, 0x00003EA7, 0x000500C4, 0x00000012, 0x000047B6, 0x00004729,\n    0x000007A7, 0x000500C3, 0x00000012, 0x00003420, 0x000047B6, 0x00000867,\n    0x0004006F, 0x00000013, 0x00002AB0, 0x00003420, 0x0005008E, 0x00000013,\n    0x00004750, 0x00002AB0, 0x000007FE, 0x0007000C, 0x00000013, 0x00005E0F,\n    0x00000001, 0x00000028, 0x00000049, 0x00004750, 0x00050051, 0x0000000D,\n    0x00005F13, 0x00005E0F, 0x00000000, 0x00050051, 0x0000000D, 0x00003CDB,\n    0x00005E0F, 0x00000001, 0x00070050, 0x0000001D, 0x00004125, 0x00005F13,\n    0x00003CDB, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x00004C49,\n    0x00002AC1, 0x00000002, 0x0004007C, 0x0000000C, 0x00003EA8, 0x00004C49,\n    0x00050050, 0x00000012, 0x0000472A, 0x00003EA8, 0x00003EA8, 0x000500C4,\n    0x00000012, 0x000047B7, 0x0000472A, 0x000007A7, 0x000500C3, 0x00000012,\n    0x00003421, 0x000047B7, 0x00000867, 0x0004006F, 0x00000013, 0x00002AB1,\n    0x00003421, 0x0005008E, 0x00000013, 0x00004751, 0x00002AB1, 0x000007FE,\n    0x0007000C, 0x00000013, 0x00005E10, 0x00000001, 0x00000028, 0x00000049,\n    0x00004751, 0x00050051, 0x0000000D, 0x00005F14, 0x00005E10, 0x00000000,\n    0x00050051, 0x0000000D, 0x00003CDC, 0x00005E10, 0x00000001, 0x00070050,\n    0x0000001D, 0x00004126, 0x00005F14, 0x00003CDC, 0x00000A0C, 0x00000A0C,\n    0x00050051, 0x0000000B, 0x00004C4A, 0x00002AC1, 0x00000003, 0x0004007C,\n    0x0000000C, 0x00003EA9, 0x00004C4A, 0x00050050, 0x00000012, 0x0000472B,\n    0x00003EA9, 0x00003EA9, 0x000500C4, 0x00000012, 0x000047B8, 0x0000472B,\n    0x000007A7, 0x000500C3, 0x00000012, 0x00003422, 0x000047B8, 0x00000867,\n    0x0004006F, 0x00000013, 0x00002AB2, 0x00003422, 0x0005008E, 0x00000013,\n    0x00004752, 0x00002AB2, 0x000007FE, 0x0007000C, 0x00000013, 0x00005E11,\n    0x00000001, 0x00000028, 0x00000049, 0x00004752, 0x00050051, 0x0000000D,\n    0x00005F15, 0x00005E11, 0x00000000, 0x00050051, 0x0000000D, 0x0000494E,\n    0x00005E11, 0x00000001, 0x00070050, 0x0000001D, 0x00002354, 0x00005F15,\n    0x0000494E, 0x00000A0C, 0x00000A0C, 0x000200F9, 0x00003F62, 0x000200F8,\n    0x00001CBE, 0x00050051, 0x0000000B, 0x000056C3, 0x00002AC1, 0x00000000,\n    0x00060050, 0x00000014, 0x00004F10, 0x000056C3, 0x000056C3, 0x000056C3,\n    0x000500C2, 0x00000014, 0x00002B17, 0x00004F10, 0x00000BB4, 0x000500C7,\n    0x00000014, 0x00005DEE, 0x00002B17, 0x00000105, 0x000500C7, 0x00000014,\n    0x000048A4, 0x00002B17, 0x00000466, 0x000500C2, 0x00000014, 0x00005B98,\n    0x00005DEE, 0x00000B0C, 0x000500AA, 0x00000010, 0x000040D1, 0x00005B98,\n    0x00000A12, 0x0006000C, 0x00000016, 0x00002C53, 0x00000001, 0x0000004B,\n    0x000048A4, 0x0004007C, 0x00000014, 0x00002A1D, 0x00002C53, 0x00050082,\n    0x00000014, 0x00001882, 0x00000B0C, 0x00002A1D, 0x00050080, 0x00000014,\n    0x00002218, 0x00002A1D, 0x00000938, 0x000600A9, 0x00000014, 0x00002877,\n    0x000040D1, 0x00002218, 0x00005B98, 0x000500C4, 0x00000014, 0x00005ADC,\n    0x000048A4, 0x00001882, 0x000500C7, 0x00000014, 0x000049A2, 0x00005ADC,\n    0x00000466, 0x000600A9, 0x00000014, 0x00002AB3, 0x000040D1, 0x000049A2,\n    0x000048A4, 0x00050080, 0x00000014, 0x00006001, 0x00002877, 0x000003FA,\n    0x000500C4, 0x00000014, 0x00004F87, 0x00006001, 0x00000189, 0x000500C4,\n    0x00000014, 0x00003FAE, 0x00002AB3, 0x0000008D, 0x000500C5, 0x00000014,\n    0x00005784, 0x00004F87, 0x00003FAE, 0x000500AA, 0x00000010, 0x00003608,\n    0x00005DEE, 0x00000A12, 0x000600A9, 0x00000014, 0x0000424A, 0x00003608,\n    0x00000A12, 0x00005784, 0x0004007C, 0x00000018, 0x000029D7, 0x0000424A,\n    0x000500C2, 0x0000000B, 0x00004BAC, 0x000056C3, 0x00000A64, 0x00040070,\n    0x0000000D, 0x00004816, 0x00004BAC, 0x00050085, 0x0000000D, 0x00003E27,\n    0x00004816, 0x00000149, 0x00050051, 0x0000000D, 0x000053CA, 0x000029D7,\n    0x00000000, 0x00050051, 0x0000000D, 0x00002A5D, 0x000029D7, 0x00000001,\n    0x00050051, 0x0000000D, 0x00001E9F, 0x000029D7, 0x00000002, 0x00070050,\n    0x0000001D, 0x00003DE0, 0x000053CA, 0x00002A5D, 0x00001E9F, 0x00003E27,\n    0x00050051, 0x0000000B, 0x000027FB, 0x00002AC1, 0x00000001, 0x00060050,\n    0x00000014, 0x00003514, 0x000027FB, 0x000027FB, 0x000027FB, 0x000500C2,\n    0x00000014, 0x00002B18, 0x00003514, 0x00000BB4, 0x000500C7, 0x00000014,\n    0x00005DEF, 0x00002B18, 0x00000105, 0x000500C7, 0x00000014, 0x000048A5,\n    0x00002B18, 0x00000466, 0x000500C2, 0x00000014, 0x00005B99, 0x00005DEF,\n    0x00000B0C, 0x000500AA, 0x00000010, 0x000040D2, 0x00005B99, 0x00000A12,\n    0x0006000C, 0x00000016, 0x00002C54, 0x00000001, 0x0000004B, 0x000048A5,\n    0x0004007C, 0x00000014, 0x00002A1E, 0x00002C54, 0x00050082, 0x00000014,\n    0x00001883, 0x00000B0C, 0x00002A1E, 0x00050080, 0x00000014, 0x00002219,\n    0x00002A1E, 0x00000938, 0x000600A9, 0x00000014, 0x00002878, 0x000040D2,\n    0x00002219, 0x00005B99, 0x000500C4, 0x00000014, 0x00005ADD, 0x000048A5,\n    0x00001883, 0x000500C7, 0x00000014, 0x000049A3, 0x00005ADD, 0x00000466,\n    0x000600A9, 0x00000014, 0x00002AB4, 0x000040D2, 0x000049A3, 0x000048A5,\n    0x00050080, 0x00000014, 0x00006002, 0x00002878, 0x000003FA, 0x000500C4,\n    0x00000014, 0x00004F88, 0x00006002, 0x00000189, 0x000500C4, 0x00000014,\n    0x00003FAF, 0x00002AB4, 0x0000008D, 0x000500C5, 0x00000014, 0x00005785,\n    0x00004F88, 0x00003FAF, 0x000500AA, 0x00000010, 0x00003609, 0x00005DEF,\n    0x00000A12, 0x000600A9, 0x00000014, 0x0000424B, 0x00003609, 0x00000A12,\n    0x00005785, 0x0004007C, 0x00000018, 0x000029D8, 0x0000424B, 0x000500C2,\n    0x0000000B, 0x00004BAD, 0x000027FB, 0x00000A64, 0x00040070, 0x0000000D,\n    0x00004817, 0x00004BAD, 0x00050085, 0x0000000D, 0x00003E28, 0x00004817,\n    0x00000149, 0x00050051, 0x0000000D, 0x000053CB, 0x000029D8, 0x00000000,\n    0x00050051, 0x0000000D, 0x00002A5E, 0x000029D8, 0x00000001, 0x00050051,\n    0x0000000D, 0x00001EA0, 0x000029D8, 0x00000002, 0x00070050, 0x0000001D,\n    0x00003DE1, 0x000053CB, 0x00002A5E, 0x00001EA0, 0x00003E28, 0x00050051,\n    0x0000000B, 0x000027FC, 0x00002AC1, 0x00000002, 0x00060050, 0x00000014,\n    0x00003515, 0x000027FC, 0x000027FC, 0x000027FC, 0x000500C2, 0x00000014,\n    0x00002B19, 0x00003515, 0x00000BB4, 0x000500C7, 0x00000014, 0x00005DF0,\n    0x00002B19, 0x00000105, 0x000500C7, 0x00000014, 0x000048AE, 0x00002B19,\n    0x00000466, 0x000500C2, 0x00000014, 0x00005B9A, 0x00005DF0, 0x00000B0C,\n    0x000500AA, 0x00000010, 0x000040D3, 0x00005B9A, 0x00000A12, 0x0006000C,\n    0x00000016, 0x00002C55, 0x00000001, 0x0000004B, 0x000048AE, 0x0004007C,\n    0x00000014, 0x00002A1F, 0x00002C55, 0x00050082, 0x00000014, 0x00001884,\n    0x00000B0C, 0x00002A1F, 0x00050080, 0x00000014, 0x0000221A, 0x00002A1F,\n    0x00000938, 0x000600A9, 0x00000014, 0x00002879, 0x000040D3, 0x0000221A,\n    0x00005B9A, 0x000500C4, 0x00000014, 0x00005ADE, 0x000048AE, 0x00001884,\n    0x000500C7, 0x00000014, 0x000049A4, 0x00005ADE, 0x00000466, 0x000600A9,\n    0x00000014, 0x00002AB5, 0x000040D3, 0x000049A4, 0x000048AE, 0x00050080,\n    0x00000014, 0x00006003, 0x00002879, 0x000003FA, 0x000500C4, 0x00000014,\n    0x00004F89, 0x00006003, 0x00000189, 0x000500C4, 0x00000014, 0x00003FB0,\n    0x00002AB5, 0x0000008D, 0x000500C5, 0x00000014, 0x00005786, 0x00004F89,\n    0x00003FB0, 0x000500AA, 0x00000010, 0x0000360A, 0x00005DF0, 0x00000A12,\n    0x000600A9, 0x00000014, 0x0000424C, 0x0000360A, 0x00000A12, 0x00005786,\n    0x0004007C, 0x00000018, 0x000029D9, 0x0000424C, 0x000500C2, 0x0000000B,\n    0x00004BAE, 0x000027FC, 0x00000A64, 0x00040070, 0x0000000D, 0x00004818,\n    0x00004BAE, 0x00050085, 0x0000000D, 0x00003E29, 0x00004818, 0x00000149,\n    0x00050051, 0x0000000D, 0x000053CC, 0x000029D9, 0x00000000, 0x00050051,\n    0x0000000D, 0x00002A5F, 0x000029D9, 0x00000001, 0x00050051, 0x0000000D,\n    0x00001EA1, 0x000029D9, 0x00000002, 0x00070050, 0x0000001D, 0x00003DE2,\n    0x000053CC, 0x00002A5F, 0x00001EA1, 0x00003E29, 0x00050051, 0x0000000B,\n    0x000027FD, 0x00002AC1, 0x00000003, 0x00060050, 0x00000014, 0x00003516,\n    0x000027FD, 0x000027FD, 0x000027FD, 0x000500C2, 0x00000014, 0x00002B1A,\n    0x00003516, 0x00000BB4, 0x000500C7, 0x00000014, 0x00005DF1, 0x00002B1A,\n    0x00000105, 0x000500C7, 0x00000014, 0x000048AF, 0x00002B1A, 0x00000466,\n    0x000500C2, 0x00000014, 0x00005B9B, 0x00005DF1, 0x00000B0C, 0x000500AA,\n    0x00000010, 0x000040D4, 0x00005B9B, 0x00000A12, 0x0006000C, 0x00000016,\n    0x00002C56, 0x00000001, 0x0000004B, 0x000048AF, 0x0004007C, 0x00000014,\n    0x00002A20, 0x00002C56, 0x00050082, 0x00000014, 0x00001885, 0x00000B0C,\n    0x00002A20, 0x00050080, 0x00000014, 0x0000221B, 0x00002A20, 0x00000938,\n    0x000600A9, 0x00000014, 0x0000287A, 0x000040D4, 0x0000221B, 0x00005B9B,\n    0x000500C4, 0x00000014, 0x00005ADF, 0x000048AF, 0x00001885, 0x000500C7,\n    0x00000014, 0x000049A5, 0x00005ADF, 0x00000466, 0x000600A9, 0x00000014,\n    0x00002AB6, 0x000040D4, 0x000049A5, 0x000048AF, 0x00050080, 0x00000014,\n    0x00006004, 0x0000287A, 0x000003FA, 0x000500C4, 0x00000014, 0x00004F8A,\n    0x00006004, 0x00000189, 0x000500C4, 0x00000014, 0x00003FB1, 0x00002AB6,\n    0x0000008D, 0x000500C5, 0x00000014, 0x00005787, 0x00004F8A, 0x00003FB1,\n    0x000500AA, 0x00000010, 0x0000360B, 0x00005DF1, 0x00000A12, 0x000600A9,\n    0x00000014, 0x0000424D, 0x0000360B, 0x00000A12, 0x00005787, 0x0004007C,\n    0x00000018, 0x000029DA, 0x0000424D, 0x000500C2, 0x0000000B, 0x00004BAF,\n    0x000027FD, 0x00000A64, 0x00040070, 0x0000000D, 0x00004819, 0x00004BAF,\n    0x00050085, 0x0000000D, 0x00003E2A, 0x00004819, 0x00000149, 0x00050051,\n    0x0000000D, 0x000053CD, 0x000029DA, 0x00000000, 0x00050051, 0x0000000D,\n    0x00002A60, 0x000029DA, 0x00000001, 0x00050051, 0x0000000D, 0x00002B1B,\n    0x000029DA, 0x00000002, 0x00070050, 0x0000001D, 0x00002355, 0x000053CD,\n    0x00002A60, 0x00002B1B, 0x00003E2A, 0x000200F9, 0x00003F62, 0x000200F8,\n    0x00001CBF, 0x00050051, 0x0000000B, 0x000056C4, 0x00002AC1, 0x00000000,\n    0x00070050, 0x00000017, 0x00004F11, 0x000056C4, 0x000056C4, 0x000056C4,\n    0x000056C4, 0x000500C2, 0x00000017, 0x000024A8, 0x00004F11, 0x0000034D,\n    0x000500C7, 0x00000017, 0x000049B3, 0x000024A8, 0x0000027B, 0x00040070,\n    0x0000001D, 0x00003CBD, 0x000049B3, 0x00050085, 0x0000001D, 0x00004136,\n    0x00003CBD, 0x00000AEE, 0x00050051, 0x0000000B, 0x00005CD8, 0x00002AC1,\n    0x00000001, 0x00070050, 0x00000017, 0x00005153, 0x00005CD8, 0x00005CD8,\n    0x00005CD8, 0x00005CD8, 0x000500C2, 0x00000017, 0x000024A9, 0x00005153,\n    0x0000034D, 0x000500C7, 0x00000017, 0x000049B4, 0x000024A9, 0x0000027B,\n    0x00040070, 0x0000001D, 0x00003CBE, 0x000049B4, 0x00050085, 0x0000001D,\n    0x00004137, 0x00003CBE, 0x00000AEE, 0x00050051, 0x0000000B, 0x00005CD9,\n    0x00002AC1, 0x00000002, 0x00070050, 0x00000017, 0x00005154, 0x00005CD9,\n    0x00005CD9, 0x00005CD9, 0x00005CD9, 0x000500C2, 0x00000017, 0x000024AA,\n    0x00005154, 0x0000034D, 0x000500C7, 0x00000017, 0x000049B5, 0x000024AA,\n    0x0000027B, 0x00040070, 0x0000001D, 0x00003CBF, 0x000049B5, 0x00050085,\n    0x0000001D, 0x00004138, 0x00003CBF, 0x00000AEE, 0x00050051, 0x0000000B,\n    0x00005CDA, 0x00002AC1, 0x00000003, 0x00070050, 0x00000017, 0x00005155,\n    0x00005CDA, 0x00005CDA, 0x00005CDA, 0x00005CDA, 0x000500C2, 0x00000017,\n    0x000024AB, 0x00005155, 0x0000034D, 0x000500C7, 0x00000017, 0x000049B6,\n    0x000024AB, 0x0000027B, 0x00040070, 0x0000001D, 0x00004931, 0x000049B6,\n    0x00050085, 0x0000001D, 0x000026A1, 0x00004931, 0x00000AEE, 0x000200F9,\n    0x00003F62, 0x000200F8, 0x000038FB, 0x00050051, 0x0000000B, 0x000056C5,\n    0x00002AC1, 0x00000000, 0x00070050, 0x00000017, 0x00004F12, 0x000056C5,\n    0x000056C5, 0x000056C5, 0x000056C5, 0x000500C2, 0x00000017, 0x000024AC,\n    0x00004F12, 0x0000028D, 0x000500C7, 0x00000017, 0x00004A5E, 0x000024AC,\n    0x0000064B, 0x00040070, 0x0000001D, 0x000036A8, 0x00004A5E, 0x0005008E,\n    0x0000001D, 0x00004B29, 0x000036A8, 0x0000017A, 0x00050051, 0x0000000B,\n    0x000021A5, 0x00002AC1, 0x00000001, 0x00070050, 0x00000017, 0x00006111,\n    0x000021A5, 0x000021A5, 0x000021A5, 0x000021A5, 0x000500C2, 0x00000017,\n    0x000024AD, 0x00006111, 0x0000028D, 0x000500C7, 0x00000017, 0x00004A5F,\n    0x000024AD, 0x0000064B, 0x00040070, 0x0000001D, 0x000036A9, 0x00004A5F,\n    0x0005008E, 0x0000001D, 0x00004B2A, 0x000036A9, 0x0000017A, 0x00050051,\n    0x0000000B, 0x000021A6, 0x00002AC1, 0x00000002, 0x00070050, 0x00000017,\n    0x00006112, 0x000021A6, 0x000021A6, 0x000021A6, 0x000021A6, 0x000500C2,\n    0x00000017, 0x000024AE, 0x00006112, 0x0000028D, 0x000500C7, 0x00000017,\n    0x00004A60, 0x000024AE, 0x0000064B, 0x00040070, 0x0000001D, 0x000036AA,\n    0x00004A60, 0x0005008E, 0x0000001D, 0x00004B2B, 0x000036AA, 0x0000017A,\n    0x00050051, 0x0000000B, 0x000021A7, 0x00002AC1, 0x00000003, 0x00070050,\n    0x00000017, 0x00006113, 0x000021A7, 0x000021A7, 0x000021A7, 0x000021A7,\n    0x000500C2, 0x00000017, 0x000024AF, 0x00006113, 0x0000028D, 0x000500C7,\n    0x00000017, 0x00004A61, 0x000024AF, 0x0000064B, 0x00040070, 0x0000001D,\n    0x0000431C, 0x00004A61, 0x0005008E, 0x0000001D, 0x00003094, 0x0000431C,\n    0x0000017A, 0x000200F9, 0x00003F62, 0x000200F8, 0x00004BFD, 0x00050051,\n    0x0000000B, 0x00003090, 0x00002AC1, 0x00000000, 0x0004007C, 0x0000000D,\n    0x00004FF0, 0x00003090, 0x00050050, 0x00000013, 0x0000433C, 0x00004FF0,\n    0x00000A0C, 0x0009004F, 0x0000001D, 0x00002D96, 0x0000433C, 0x0000433C,\n    0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00050051, 0x0000000B,\n    0x000056B7, 0x00002AC1, 0x00000001, 0x0004007C, 0x0000000D, 0x00003F6E,\n    0x000056B7, 0x00050050, 0x00000013, 0x0000433D, 0x00003F6E, 0x00000A0C,\n    0x0009004F, 0x0000001D, 0x00002D97, 0x0000433D, 0x0000433D, 0x00000000,\n    0x00000001, 0x00000001, 0x00000001, 0x00050051, 0x0000000B, 0x000056B8,\n    0x00002AC1, 0x00000002, 0x0004007C, 0x0000000D, 0x00003F6F, 0x000056B8,\n    0x00050050, 0x00000013, 0x0000433E, 0x00003F6F, 0x00000A0C, 0x0009004F,\n    0x0000001D, 0x00002D98, 0x0000433E, 0x0000433E, 0x00000000, 0x00000001,\n    0x00000001, 0x00000001, 0x00050051, 0x0000000B, 0x000056B9, 0x00002AC1,\n    0x00000003, 0x0004007C, 0x0000000D, 0x00003F70, 0x000056B9, 0x00050050,\n    0x00000013, 0x00004FB0, 0x00003F70, 0x00000A0C, 0x0009004F, 0x0000001D,\n    0x00005A3C, 0x00004FB0, 0x00004FB0, 0x00000000, 0x00000001, 0x00000001,\n    0x00000001, 0x000200F9, 0x00003F62, 0x000200F8, 0x00003F62, 0x000F00F5,\n    0x0000001D, 0x00002BAD, 0x00005A3C, 0x00004BFD, 0x00003094, 0x000038FB,\n    0x000026A1, 0x00001CBF, 0x00002355, 0x00001CBE, 0x00002354, 0x00002000,\n    0x00002353, 0x00002037, 0x000F00F5, 0x0000001D, 0x0000380E, 0x00002D98,\n    0x00004BFD, 0x00004B2B, 0x000038FB, 0x00004138, 0x00001CBF, 0x00003DE2,\n    0x00001CBE, 0x00004126, 0x00002000, 0x0000391A, 0x00002037, 0x000F00F5,\n    0x0000001D, 0x00003B81, 0x00002D97, 0x00004BFD, 0x00004B2A, 0x000038FB,\n    0x00004137, 0x00001CBF, 0x00003DE1, 0x00001CBE, 0x00004125, 0x00002000,\n    0x00003919, 0x00002037, 0x000F00F5, 0x0000001D, 0x000038BA, 0x00002D96,\n    0x00004BFD, 0x00004B29, 0x000038FB, 0x00004136, 0x00001CBF, 0x00003DE0,\n    0x00001CBE, 0x00004124, 0x00002000, 0x00003918, 0x00002037, 0x000200F9,\n    0x00005311, 0x000200F8, 0x00003B67, 0x000500AA, 0x00000009, 0x00005452,\n    0x0000199B, 0x00000A22, 0x000300F7, 0x00004F27, 0x00000002, 0x000400FA,\n    0x00005452, 0x000019C4, 0x00002304, 0x000200F8, 0x00002304, 0x000500C2,\n    0x0000000B, 0x00005635, 0x000051FC, 0x00000A11, 0x00060041, 0x00000289,\n    0x00003443, 0x00000CC7, 0x00000A0B, 0x00005635, 0x0004003D, 0x0000000B,\n    0x00003150, 0x00003443, 0x00050080, 0x0000000B, 0x00002DC4, 0x00005635,\n    0x00000A0D, 0x00060041, 0x00000289, 0x0000190F, 0x00000CC7, 0x00000A0B,\n    0x00002DC4, 0x0004003D, 0x0000000B, 0x00001B78, 0x0000190F, 0x00050080,\n    0x0000000B, 0x0000214A, 0x000051FC, 0x0000199B, 0x000500C2, 0x0000000B,\n    0x000054AB, 0x0000214A, 0x00000A11, 0x00060041, 0x00000289, 0x00004C99,\n    0x00000CC7, 0x00000A0B, 0x000054AB, 0x0004003D, 0x0000000B, 0x00003151,\n    0x00004C99, 0x00050080, 0x0000000B, 0x00002DC5, 0x000054AB, 0x00000A0D,\n    0x00060041, 0x00000289, 0x00006005, 0x00000CC7, 0x00000A0B, 0x00002DC5,\n    0x0004003D, 0x0000000B, 0x0000374E, 0x00006005, 0x00070050, 0x00000017,\n    0x00004CD9, 0x00003150, 0x00001B78, 0x00003151, 0x0000374E, 0x00050084,\n    0x0000000B, 0x00004C2D, 0x00000A10, 0x0000199B, 0x00050080, 0x0000000B,\n    0x00002A47, 0x000051FC, 0x00004C2D, 0x000500C2, 0x0000000B, 0x000045EC,\n    0x00002A47, 0x00000A11, 0x00060041, 0x00000289, 0x00004C9A, 0x00000CC7,\n    0x00000A0B, 0x000045EC, 0x0004003D, 0x0000000B, 0x00003152, 0x00004C9A,\n    0x00050080, 0x0000000B, 0x00002DC6, 0x000045EC, 0x00000A0D, 0x00060041,\n    0x00000289, 0x0000194D, 0x00000CC7, 0x00000A0B, 0x00002DC6, 0x0004003D,\n    0x0000000B, 0x00005E5D, 0x0000194D, 0x00050084, 0x0000000B, 0x000021F5,\n    0x00000A13, 0x0000199B, 0x00050080, 0x0000000B, 0x00005EC6, 0x000051FC,\n    0x000021F5, 0x000500C2, 0x0000000B, 0x000045ED, 0x00005EC6, 0x00000A11,\n    0x00060041, 0x00000289, 0x00004C9B, 0x00000CC7, 0x00000A0B, 0x000045ED,\n    0x0004003D, 0x0000000B, 0x00003153, 0x00004C9B, 0x00050080, 0x0000000B,\n    0x00002DC7, 0x000045ED, 0x00000A0D, 0x00060041, 0x00000289, 0x00006006,\n    0x00000CC7, 0x00000A0B, 0x00002DC7, 0x0004003D, 0x0000000B, 0x00004002,\n    0x00006006, 0x00070050, 0x00000017, 0x00005136, 0x00003152, 0x00005E5D,\n    0x00003153, 0x00004002, 0x000200F9, 0x00004F27, 0x000200F8, 0x000019C4,\n    0x000500C2, 0x0000000B, 0x00005FAB, 0x000051FC, 0x00000A11, 0x00060041,\n    0x00000289, 0x00003444, 0x00000CC7, 0x00000A0B, 0x00005FAB, 0x0004003D,\n    0x0000000B, 0x00003154, 0x00003444, 0x00050080, 0x0000000B, 0x00002DC8,\n    0x00005FAB, 0x00000A0D, 0x00060041, 0x00000289, 0x00001910, 0x00000CC7,\n    0x00000A0B, 0x00002DC8, 0x0004003D, 0x0000000B, 0x00005C70, 0x00001910,\n    0x00050080, 0x0000000B, 0x00002DC9, 0x00005FAB, 0x00000A10, 0x00060041,\n    0x00000289, 0x00001911, 0x00000CC7, 0x00000A0B, 0x00002DC9, 0x0004003D,\n    0x0000000B, 0x00005C71, 0x00001911, 0x00050080, 0x0000000B, 0x00002DCA,\n    0x00005FAB, 0x00000A13, 0x00060041, 0x00000289, 0x00006007, 0x00000CC7,\n    0x00000A0B, 0x00002DCA, 0x0004003D, 0x0000000B, 0x00003702, 0x00006007,\n    0x00070050, 0x00000017, 0x00005472, 0x00003154, 0x00005C70, 0x00005C71,\n    0x00003702, 0x00050080, 0x0000000B, 0x00004B85, 0x000051FC, 0x00000A3A,\n    0x000500C2, 0x0000000B, 0x0000202F, 0x00004B85, 0x00000A11, 0x00060041,\n    0x00000289, 0x00004C9C, 0x00000CC7, 0x00000A0B, 0x0000202F, 0x0004003D,\n    0x0000000B, 0x00003155, 0x00004C9C, 0x00050080, 0x0000000B, 0x00002DCB,\n    0x0000202F, 0x00000A0D, 0x00060041, 0x00000289, 0x00001912, 0x00000CC7,\n    0x00000A0B, 0x00002DCB, 0x0004003D, 0x0000000B, 0x00005C72, 0x00001912,\n    0x00050080, 0x0000000B, 0x00002DCC, 0x0000202F, 0x00000A10, 0x00060041,\n    0x00000289, 0x00001913, 0x00000CC7, 0x00000A0B, 0x00002DCC, 0x0004003D,\n    0x0000000B, 0x00005C73, 0x00001913, 0x00050080, 0x0000000B, 0x00002DCD,\n    0x0000202F, 0x00000A13, 0x00060041, 0x00000289, 0x00006008, 0x00000CC7,\n    0x00000A0B, 0x00002DCD, 0x0004003D, 0x0000000B, 0x00004003, 0x00006008,\n    0x00070050, 0x00000017, 0x00005137, 0x00003155, 0x00005C72, 0x00005C73,\n    0x00004003, 0x000200F9, 0x00004F27, 0x000200F8, 0x00004F27, 0x000700F5,\n    0x00000017, 0x00002BCF, 0x00005137, 0x000019C4, 0x00005136, 0x00002304,\n    0x000700F5, 0x00000017, 0x00003722, 0x00005472, 0x000019C4, 0x00004CD9,\n    0x00002304, 0x000300F7, 0x00004F28, 0x00000000, 0x000700FB, 0x00002180,\n    0x00004F58, 0x00000005, 0x0000215A, 0x00000007, 0x00002038, 0x000200F8,\n    0x00002038, 0x00050051, 0x0000000B, 0x00005F5E, 0x00003722, 0x00000000,\n    0x0006000C, 0x00000013, 0x0000606C, 0x00000001, 0x0000003E, 0x00005F5E,\n    0x00050051, 0x0000000D, 0x0000277E, 0x0000606C, 0x00000000, 0x00050051,\n    0x0000000D, 0x00003EC0, 0x0000606C, 0x00000001, 0x00050051, 0x0000000B,\n    0x00004289, 0x00003722, 0x00000001, 0x0006000C, 0x00000013, 0x00003CFD,\n    0x00000001, 0x0000003E, 0x00004289, 0x00050051, 0x0000000D, 0x0000277F,\n    0x00003CFD, 0x00000000, 0x00050051, 0x0000000D, 0x00004455, 0x00003CFD,\n    0x00000001, 0x00070050, 0x0000001D, 0x0000391B, 0x0000277E, 0x00003EC0,\n    0x0000277F, 0x00004455, 0x00050051, 0x0000000B, 0x00004389, 0x00003722,\n    0x00000002, 0x0006000C, 0x00000013, 0x0000467A, 0x00000001, 0x0000003E,\n    0x00004389, 0x00050051, 0x0000000D, 0x00002780, 0x0000467A, 0x00000000,\n    0x00050051, 0x0000000D, 0x00003EC1, 0x0000467A, 0x00000001, 0x00050051,\n    0x0000000B, 0x0000428A, 0x00003722, 0x00000003, 0x0006000C, 0x00000013,\n    0x00003CFE, 0x00000001, 0x0000003E, 0x0000428A, 0x00050051, 0x0000000D,\n    0x00002781, 0x00003CFE, 0x00000000, 0x00050051, 0x0000000D, 0x00004456,\n    0x00003CFE, 0x00000001, 0x00070050, 0x0000001D, 0x0000391C, 0x00002780,\n    0x00003EC1, 0x00002781, 0x00004456, 0x00050051, 0x0000000B, 0x0000438A,\n    0x00002BCF, 0x00000000, 0x0006000C, 0x00000013, 0x0000467B, 0x00000001,\n    0x0000003E, 0x0000438A, 0x00050051, 0x0000000D, 0x00002782, 0x0000467B,\n    0x00000000, 0x00050051, 0x0000000D, 0x00003EC2, 0x0000467B, 0x00000001,\n    0x00050051, 0x0000000B, 0x0000428B, 0x00002BCF, 0x00000001, 0x0006000C,\n    0x00000013, 0x00003CFF, 0x00000001, 0x0000003E, 0x0000428B, 0x00050051,\n    0x0000000D, 0x00002783, 0x00003CFF, 0x00000000, 0x00050051, 0x0000000D,\n    0x00004457, 0x00003CFF, 0x00000001, 0x00070050, 0x0000001D, 0x0000391D,\n    0x00002782, 0x00003EC2, 0x00002783, 0x00004457, 0x00050051, 0x0000000B,\n    0x0000438B, 0x00002BCF, 0x00000002, 0x0006000C, 0x00000013, 0x0000467C,\n    0x00000001, 0x0000003E, 0x0000438B, 0x00050051, 0x0000000D, 0x00002784,\n    0x0000467C, 0x00000000, 0x00050051, 0x0000000D, 0x00003EC3, 0x0000467C,\n    0x00000001, 0x00050051, 0x0000000B, 0x0000428C, 0x00002BCF, 0x00000003,\n    0x0006000C, 0x00000013, 0x00003D00, 0x00000001, 0x0000003E, 0x0000428C,\n    0x00050051, 0x0000000D, 0x00002785, 0x00003D00, 0x00000000, 0x00050051,\n    0x0000000D, 0x000050C3, 0x00003D00, 0x00000001, 0x00070050, 0x0000001D,\n    0x00002356, 0x00002784, 0x00003EC3, 0x00002785, 0x000050C3, 0x000200F9,\n    0x00004F28, 0x000200F8, 0x0000215A, 0x0007004F, 0x00000011, 0x000025FD,\n    0x00003722, 0x00003722, 0x00000000, 0x00000001, 0x0004007C, 0x00000012,\n    0x00005B3E, 0x000025FD, 0x0009004F, 0x0000001A, 0x000060D6, 0x00005B3E,\n    0x00005B3E, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x000500C4,\n    0x0000001A, 0x000048B0, 0x000060D6, 0x00000122, 0x000500C3, 0x0000001A,\n    0x00003D95, 0x000048B0, 0x00000302, 0x0004006F, 0x0000001D, 0x00002AB7,\n    0x00003D95, 0x0005008E, 0x0000001D, 0x0000472C, 0x00002AB7, 0x000007FE,\n    0x0007000C, 0x0000001D, 0x00006297, 0x00000001, 0x00000028, 0x00000504,\n    0x0000472C, 0x0007004F, 0x00000011, 0x00003771, 0x00003722, 0x00003722,\n    0x00000002, 0x00000003, 0x0004007C, 0x00000012, 0x000024C5, 0x00003771,\n    0x0009004F, 0x0000001A, 0x000060D7, 0x000024C5, 0x000024C5, 0x00000000,\n    0x00000000, 0x00000001, 0x00000001, 0x000500C4, 0x0000001A, 0x000048B1,\n    0x000060D7, 0x00000122, 0x000500C3, 0x0000001A, 0x00003D96, 0x000048B1,\n    0x00000302, 0x0004006F, 0x0000001D, 0x00002AB8, 0x00003D96, 0x0005008E,\n    0x0000001D, 0x0000472D, 0x00002AB8, 0x000007FE, 0x0007000C, 0x0000001D,\n    0x00006298, 0x00000001, 0x00000028, 0x00000504, 0x0000472D, 0x0007004F,\n    0x00000011, 0x00003772, 0x00002BCF, 0x00002BCF, 0x00000000, 0x00000001,\n    0x0004007C, 0x00000012, 0x000024C6, 0x00003772, 0x0009004F, 0x0000001A,\n    0x000060D8, 0x000024C6, 0x000024C6, 0x00000000, 0x00000000, 0x00000001,\n    0x00000001, 0x000500C4, 0x0000001A, 0x000048B2, 0x000060D8, 0x00000122,\n    0x000500C3, 0x0000001A, 0x00003D97, 0x000048B2, 0x00000302, 0x0004006F,\n    0x0000001D, 0x00002AB9, 0x00003D97, 0x0005008E, 0x0000001D, 0x0000472E,\n    0x00002AB9, 0x000007FE, 0x0007000C, 0x0000001D, 0x00006299, 0x00000001,\n    0x00000028, 0x00000504, 0x0000472E, 0x0007004F, 0x00000011, 0x00003773,\n    0x00002BCF, 0x00002BCF, 0x00000002, 0x00000003, 0x0004007C, 0x00000012,\n    0x000024C7, 0x00003773, 0x0009004F, 0x0000001A, 0x000060D9, 0x000024C7,\n    0x000024C7, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x000500C4,\n    0x0000001A, 0x000048B3, 0x000060D9, 0x00000122, 0x000500C3, 0x0000001A,\n    0x00003D98, 0x000048B3, 0x00000302, 0x0004006F, 0x0000001D, 0x00002ABA,\n    0x00003D98, 0x0005008E, 0x0000001D, 0x000053C1, 0x00002ABA, 0x000007FE,\n    0x0007000C, 0x0000001D, 0x00004364, 0x00000001, 0x00000028, 0x00000504,\n    0x000053C1, 0x000200F9, 0x00004F28, 0x000200F8, 0x00004F58, 0x0007004F,\n    0x00000011, 0x00002623, 0x00003722, 0x00003722, 0x00000000, 0x00000001,\n    0x0004007C, 0x00000013, 0x0000515B, 0x00002623, 0x00050051, 0x0000000D,\n    0x00001B83, 0x0000515B, 0x00000000, 0x00050051, 0x0000000D, 0x00003470,\n    0x0000515B, 0x00000001, 0x00070050, 0x0000001D, 0x0000427E, 0x00001B83,\n    0x00003470, 0x00000A0C, 0x00000A0C, 0x0007004F, 0x00000011, 0x000041DE,\n    0x00003722, 0x00003722, 0x00000002, 0x00000003, 0x0004007C, 0x00000013,\n    0x00003763, 0x000041DE, 0x00050051, 0x0000000D, 0x00001B84, 0x00003763,\n    0x00000000, 0x00050051, 0x0000000D, 0x00003471, 0x00003763, 0x00000001,\n    0x00070050, 0x0000001D, 0x0000427F, 0x00001B84, 0x00003471, 0x00000A0C,\n    0x00000A0C, 0x0007004F, 0x00000011, 0x000041DF, 0x00002BCF, 0x00002BCF,\n    0x00000000, 0x00000001, 0x0004007C, 0x00000013, 0x00003764, 0x000041DF,\n    0x00050051, 0x0000000D, 0x00001B85, 0x00003764, 0x00000000, 0x00050051,\n    0x0000000D, 0x00003472, 0x00003764, 0x00000001, 0x00070050, 0x0000001D,\n    0x00004280, 0x00001B85, 0x00003472, 0x00000A0C, 0x00000A0C, 0x0007004F,\n    0x00000011, 0x000041E0, 0x00002BCF, 0x00002BCF, 0x00000002, 0x00000003,\n    0x0004007C, 0x00000013, 0x00003765, 0x000041E0, 0x00050051, 0x0000000D,\n    0x00001B86, 0x00003765, 0x00000000, 0x00050051, 0x0000000D, 0x0000410A,\n    0x00003765, 0x00000001, 0x00070050, 0x0000001D, 0x00002357, 0x00001B86,\n    0x0000410A, 0x00000A0C, 0x00000A0C, 0x000200F9, 0x00004F28, 0x000200F8,\n    0x00004F28, 0x000900F5, 0x0000001D, 0x00002BAE, 0x00002357, 0x00004F58,\n    0x00004364, 0x0000215A, 0x00002356, 0x00002038, 0x000900F5, 0x0000001D,\n    0x0000380F, 0x00004280, 0x00004F58, 0x00006299, 0x0000215A, 0x0000391D,\n    0x00002038, 0x000900F5, 0x0000001D, 0x00003B82, 0x0000427F, 0x00004F58,\n    0x00006298, 0x0000215A, 0x0000391C, 0x00002038, 0x000900F5, 0x0000001D,\n    0x000038BB, 0x0000427E, 0x00004F58, 0x00006297, 0x0000215A, 0x0000391B,\n    0x00002038, 0x000200F9, 0x00005311, 0x000200F8, 0x00005311, 0x000700F5,\n    0x0000001D, 0x00002BAF, 0x00002BAE, 0x00004F28, 0x00002BAD, 0x00003F62,\n    0x000700F5, 0x0000001D, 0x00003810, 0x0000380F, 0x00004F28, 0x0000380E,\n    0x00003F62, 0x000700F5, 0x0000001D, 0x00003296, 0x00003B82, 0x00004F28,\n    0x00003B81, 0x00003F62, 0x000700F5, 0x0000001D, 0x0000367B, 0x000038BB,\n    0x00004F28, 0x000038BA, 0x00003F62, 0x00050081, 0x0000001D, 0x0000435A,\n    0x00004359, 0x0000367B, 0x00050081, 0x0000001D, 0x00005B02, 0x00005B01,\n    0x00003296, 0x00050081, 0x0000001D, 0x00001C28, 0x00001F92, 0x00003810,\n    0x00050081, 0x0000001D, 0x000025AA, 0x00005113, 0x00002BAF, 0x00050080,\n    0x0000000B, 0x00003FF8, 0x00005E78, 0x000037B2, 0x000300F7, 0x00005312,\n    0x00000002, 0x000400FA, 0x00005AEF, 0x00003B68, 0x000040BC, 0x000200F8,\n    0x000040BC, 0x000500AA, 0x00000009, 0x00004ADE, 0x0000199B, 0x00000A16,\n    0x000300F7, 0x00004F4C, 0x00000002, 0x000400FA, 0x00004ADE, 0x000019C5,\n    0x00002305, 0x000200F8, 0x00002305, 0x000500C2, 0x0000000B, 0x00005636,\n    0x00003FF8, 0x00000A11, 0x00060041, 0x00000289, 0x00003445, 0x00000CC7,\n    0x00000A0B, 0x00005636, 0x0004003D, 0x0000000B, 0x00003AD7, 0x00003445,\n    0x00050080, 0x0000000B, 0x0000214B, 0x00003FF8, 0x0000199B, 0x000500C2,\n    0x0000000B, 0x000054AC, 0x0000214B, 0x00000A11, 0x00060041, 0x00000289,\n    0x00004CE3, 0x00000CC7, 0x00000A0B, 0x000054AC, 0x0004003D, 0x0000000B,\n    0x00003340, 0x00004CE3, 0x00050084, 0x0000000B, 0x000021F6, 0x00000A10,\n    0x0000199B, 0x00050080, 0x0000000B, 0x00005EC8, 0x00003FF8, 0x000021F6,\n    0x000500C2, 0x0000000B, 0x000045EE, 0x00005EC8, 0x00000A11, 0x00060041,\n    0x00000289, 0x00004CE4, 0x00000CC7, 0x00000A0B, 0x000045EE, 0x0004003D,\n    0x0000000B, 0x00003341, 0x00004CE4, 0x00050084, 0x0000000B, 0x000021F7,\n    0x00000A13, 0x0000199B, 0x00050080, 0x0000000B, 0x00005EC9, 0x00003FF8,\n    0x000021F7, 0x000500C2, 0x0000000B, 0x000045EF, 0x00005EC9, 0x00000A11,\n    0x00060041, 0x00000289, 0x00004904, 0x00000CC7, 0x00000A0B, 0x000045EF,\n    0x0004003D, 0x0000000B, 0x00005F5F, 0x00004904, 0x00070050, 0x00000017,\n    0x00005138, 0x00003AD7, 0x00003340, 0x00003341, 0x00005F5F, 0x000200F9,\n    0x00004F4C, 0x000200F8, 0x000019C5, 0x000500C2, 0x0000000B, 0x00005FAC,\n    0x00003FF8, 0x00000A11, 0x00060041, 0x00000289, 0x00003446, 0x00000CC7,\n    0x00000A0B, 0x00005FAC, 0x0004003D, 0x0000000B, 0x00003156, 0x00003446,\n    0x00050080, 0x0000000B, 0x00002DCE, 0x00005FAC, 0x00000A0D, 0x00060041,\n    0x00000289, 0x00001914, 0x00000CC7, 0x00000A0B, 0x00002DCE, 0x0004003D,\n    0x0000000B, 0x00005C74, 0x00001914, 0x00050080, 0x0000000B, 0x00002DCF,\n    0x00005FAC, 0x00000A10, 0x00060041, 0x00000289, 0x00001915, 0x00000CC7,\n    0x00000A0B, 0x00002DCF, 0x0004003D, 0x0000000B, 0x00005C75, 0x00001915,\n    0x00050080, 0x0000000B, 0x00002DD0, 0x00005FAC, 0x00000A13, 0x00060041,\n    0x00000289, 0x00006009, 0x00000CC7, 0x00000A0B, 0x00002DD0, 0x0004003D,\n    0x0000000B, 0x00004004, 0x00006009, 0x00070050, 0x00000017, 0x00005139,\n    0x00003156, 0x00005C74, 0x00005C75, 0x00004004, 0x000200F9, 0x00004F4C,\n    0x000200F8, 0x00004F4C, 0x000700F5, 0x00000017, 0x00002AC2, 0x00005139,\n    0x000019C5, 0x00005138, 0x00002305, 0x000300F7, 0x00003F63, 0x00000000,\n    0x001300FB, 0x00002180, 0x00004BFE, 0x00000000, 0x000038FC, 0x00000001,\n    0x000038FC, 0x00000002, 0x00001CC1, 0x0000000A, 0x00001CC1, 0x00000003,\n    0x00001CC0, 0x0000000C, 0x00001CC0, 0x00000004, 0x00002001, 0x00000006,\n    0x00002039, 0x000200F8, 0x00002039, 0x00050051, 0x0000000B, 0x00005F60,\n    0x00002AC2, 0x00000000, 0x0006000C, 0x00000013, 0x0000606D, 0x00000001,\n    0x0000003E, 0x00005F60, 0x00050051, 0x0000000D, 0x00002786, 0x0000606D,\n    0x00000000, 0x00050051, 0x0000000D, 0x00004458, 0x0000606D, 0x00000001,\n    0x00070050, 0x0000001D, 0x0000391E, 0x00002786, 0x00004458, 0x00000A0C,\n    0x00000A0C, 0x00050051, 0x0000000B, 0x0000438C, 0x00002AC2, 0x00000001,\n    0x0006000C, 0x00000013, 0x0000467D, 0x00000001, 0x0000003E, 0x0000438C,\n    0x00050051, 0x0000000D, 0x00002787, 0x0000467D, 0x00000000, 0x00050051,\n    0x0000000D, 0x00004459, 0x0000467D, 0x00000001, 0x00070050, 0x0000001D,\n    0x0000391F, 0x00002787, 0x00004459, 0x00000A0C, 0x00000A0C, 0x00050051,\n    0x0000000B, 0x0000438D, 0x00002AC2, 0x00000002, 0x0006000C, 0x00000013,\n    0x0000467E, 0x00000001, 0x0000003E, 0x0000438D, 0x00050051, 0x0000000D,\n    0x00002788, 0x0000467E, 0x00000000, 0x00050051, 0x0000000D, 0x0000445A,\n    0x0000467E, 0x00000001, 0x00070050, 0x0000001D, 0x00003920, 0x00002788,\n    0x0000445A, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x0000438E,\n    0x00002AC2, 0x00000003, 0x0006000C, 0x00000013, 0x0000467F, 0x00000001,\n    0x0000003E, 0x0000438E, 0x00050051, 0x0000000D, 0x00002789, 0x0000467F,\n    0x00000000, 0x00050051, 0x0000000D, 0x000050C4, 0x0000467F, 0x00000001,\n    0x00070050, 0x0000001D, 0x00002358, 0x00002789, 0x000050C4, 0x00000A0C,\n    0x00000A0C, 0x000200F9, 0x00003F63, 0x000200F8, 0x00002001, 0x00050051,\n    0x0000000B, 0x00003091, 0x00002AC2, 0x00000000, 0x0004007C, 0x0000000C,\n    0x000058A0, 0x00003091, 0x00050050, 0x00000012, 0x0000472F, 0x000058A0,\n    0x000058A0, 0x000500C4, 0x00000012, 0x000047B9, 0x0000472F, 0x000007A7,\n    0x000500C3, 0x00000012, 0x00003423, 0x000047B9, 0x00000867, 0x0004006F,\n    0x00000013, 0x00002ABB, 0x00003423, 0x0005008E, 0x00000013, 0x00004753,\n    0x00002ABB, 0x000007FE, 0x0007000C, 0x00000013, 0x00005E12, 0x00000001,\n    0x00000028, 0x00000049, 0x00004753, 0x00050051, 0x0000000D, 0x00005F16,\n    0x00005E12, 0x00000000, 0x00050051, 0x0000000D, 0x00003CDD, 0x00005E12,\n    0x00000001, 0x00070050, 0x0000001D, 0x00004127, 0x00005F16, 0x00003CDD,\n    0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x00004C4B, 0x00002AC2,\n    0x00000001, 0x0004007C, 0x0000000C, 0x00003EAA, 0x00004C4B, 0x00050050,\n    0x00000012, 0x00004730, 0x00003EAA, 0x00003EAA, 0x000500C4, 0x00000012,\n    0x000047BA, 0x00004730, 0x000007A7, 0x000500C3, 0x00000012, 0x00003424,\n    0x000047BA, 0x00000867, 0x0004006F, 0x00000013, 0x00002ABC, 0x00003424,\n    0x0005008E, 0x00000013, 0x00004754, 0x00002ABC, 0x000007FE, 0x0007000C,\n    0x00000013, 0x00005E13, 0x00000001, 0x00000028, 0x00000049, 0x00004754,\n    0x00050051, 0x0000000D, 0x00005F17, 0x00005E13, 0x00000000, 0x00050051,\n    0x0000000D, 0x00003CDE, 0x00005E13, 0x00000001, 0x00070050, 0x0000001D,\n    0x00004128, 0x00005F17, 0x00003CDE, 0x00000A0C, 0x00000A0C, 0x00050051,\n    0x0000000B, 0x00004C4C, 0x00002AC2, 0x00000002, 0x0004007C, 0x0000000C,\n    0x00003EAB, 0x00004C4C, 0x00050050, 0x00000012, 0x00004731, 0x00003EAB,\n    0x00003EAB, 0x000500C4, 0x00000012, 0x000047BB, 0x00004731, 0x000007A7,\n    0x000500C3, 0x00000012, 0x00003425, 0x000047BB, 0x00000867, 0x0004006F,\n    0x00000013, 0x00002ABD, 0x00003425, 0x0005008E, 0x00000013, 0x00004755,\n    0x00002ABD, 0x000007FE, 0x0007000C, 0x00000013, 0x00005E14, 0x00000001,\n    0x00000028, 0x00000049, 0x00004755, 0x00050051, 0x0000000D, 0x00005F18,\n    0x00005E14, 0x00000000, 0x00050051, 0x0000000D, 0x00003CDF, 0x00005E14,\n    0x00000001, 0x00070050, 0x0000001D, 0x00004129, 0x00005F18, 0x00003CDF,\n    0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x00004C4D, 0x00002AC2,\n    0x00000003, 0x0004007C, 0x0000000C, 0x00003EAC, 0x00004C4D, 0x00050050,\n    0x00000012, 0x00004732, 0x00003EAC, 0x00003EAC, 0x000500C4, 0x00000012,\n    0x000047BC, 0x00004732, 0x000007A7, 0x000500C3, 0x00000012, 0x00003426,\n    0x000047BC, 0x00000867, 0x0004006F, 0x00000013, 0x00002ABE, 0x00003426,\n    0x0005008E, 0x00000013, 0x00004756, 0x00002ABE, 0x000007FE, 0x0007000C,\n    0x00000013, 0x00005E15, 0x00000001, 0x00000028, 0x00000049, 0x00004756,\n    0x00050051, 0x0000000D, 0x00005F19, 0x00005E15, 0x00000000, 0x00050051,\n    0x0000000D, 0x0000494F, 0x00005E15, 0x00000001, 0x00070050, 0x0000001D,\n    0x00002359, 0x00005F19, 0x0000494F, 0x00000A0C, 0x00000A0C, 0x000200F9,\n    0x00003F63, 0x000200F8, 0x00001CC0, 0x00050051, 0x0000000B, 0x000056C6,\n    0x00002AC2, 0x00000000, 0x00060050, 0x00000014, 0x00004F13, 0x000056C6,\n    0x000056C6, 0x000056C6, 0x000500C2, 0x00000014, 0x00002B1C, 0x00004F13,\n    0x00000BB4, 0x000500C7, 0x00000014, 0x00005DF2, 0x00002B1C, 0x00000105,\n    0x000500C7, 0x00000014, 0x000048B4, 0x00002B1C, 0x00000466, 0x000500C2,\n    0x00000014, 0x00005B9C, 0x00005DF2, 0x00000B0C, 0x000500AA, 0x00000010,\n    0x000040D5, 0x00005B9C, 0x00000A12, 0x0006000C, 0x00000016, 0x00002C57,\n    0x00000001, 0x0000004B, 0x000048B4, 0x0004007C, 0x00000014, 0x00002A21,\n    0x00002C57, 0x00050082, 0x00000014, 0x00001886, 0x00000B0C, 0x00002A21,\n    0x00050080, 0x00000014, 0x0000221C, 0x00002A21, 0x00000938, 0x000600A9,\n    0x00000014, 0x0000287B, 0x000040D5, 0x0000221C, 0x00005B9C, 0x000500C4,\n    0x00000014, 0x00005AE0, 0x000048B4, 0x00001886, 0x000500C7, 0x00000014,\n    0x000049A6, 0x00005AE0, 0x00000466, 0x000600A9, 0x00000014, 0x00002AC3,\n    0x000040D5, 0x000049A6, 0x000048B4, 0x00050080, 0x00000014, 0x0000600A,\n    0x0000287B, 0x000003FA, 0x000500C4, 0x00000014, 0x00004F8B, 0x0000600A,\n    0x00000189, 0x000500C4, 0x00000014, 0x00003FB2, 0x00002AC3, 0x0000008D,\n    0x000500C5, 0x00000014, 0x00005788, 0x00004F8B, 0x00003FB2, 0x000500AA,\n    0x00000010, 0x0000360C, 0x00005DF2, 0x00000A12, 0x000600A9, 0x00000014,\n    0x0000424E, 0x0000360C, 0x00000A12, 0x00005788, 0x0004007C, 0x00000018,\n    0x000029DB, 0x0000424E, 0x000500C2, 0x0000000B, 0x00004BB0, 0x000056C6,\n    0x00000A64, 0x00040070, 0x0000000D, 0x0000481A, 0x00004BB0, 0x00050085,\n    0x0000000D, 0x00003E2B, 0x0000481A, 0x00000149, 0x00050051, 0x0000000D,\n    0x000053CE, 0x000029DB, 0x00000000, 0x00050051, 0x0000000D, 0x00002A61,\n    0x000029DB, 0x00000001, 0x00050051, 0x0000000D, 0x00001EA2, 0x000029DB,\n    0x00000002, 0x00070050, 0x0000001D, 0x00003DE3, 0x000053CE, 0x00002A61,\n    0x00001EA2, 0x00003E2B, 0x00050051, 0x0000000B, 0x000027FE, 0x00002AC2,\n    0x00000001, 0x00060050, 0x00000014, 0x00003517, 0x000027FE, 0x000027FE,\n    0x000027FE, 0x000500C2, 0x00000014, 0x00002B1D, 0x00003517, 0x00000BB4,\n    0x000500C7, 0x00000014, 0x00005DF3, 0x00002B1D, 0x00000105, 0x000500C7,\n    0x00000014, 0x000048B5, 0x00002B1D, 0x00000466, 0x000500C2, 0x00000014,\n    0x00005B9D, 0x00005DF3, 0x00000B0C, 0x000500AA, 0x00000010, 0x000040D6,\n    0x00005B9D, 0x00000A12, 0x0006000C, 0x00000016, 0x00002C58, 0x00000001,\n    0x0000004B, 0x000048B5, 0x0004007C, 0x00000014, 0x00002A22, 0x00002C58,\n    0x00050082, 0x00000014, 0x00001887, 0x00000B0C, 0x00002A22, 0x00050080,\n    0x00000014, 0x0000221D, 0x00002A22, 0x00000938, 0x000600A9, 0x00000014,\n    0x0000287C, 0x000040D6, 0x0000221D, 0x00005B9D, 0x000500C4, 0x00000014,\n    0x00005AE1, 0x000048B5, 0x00001887, 0x000500C7, 0x00000014, 0x000049A7,\n    0x00005AE1, 0x00000466, 0x000600A9, 0x00000014, 0x00002AC4, 0x000040D6,\n    0x000049A7, 0x000048B5, 0x00050080, 0x00000014, 0x0000600B, 0x0000287C,\n    0x000003FA, 0x000500C4, 0x00000014, 0x00004F8C, 0x0000600B, 0x00000189,\n    0x000500C4, 0x00000014, 0x00003FB3, 0x00002AC4, 0x0000008D, 0x000500C5,\n    0x00000014, 0x00005789, 0x00004F8C, 0x00003FB3, 0x000500AA, 0x00000010,\n    0x0000360D, 0x00005DF3, 0x00000A12, 0x000600A9, 0x00000014, 0x0000424F,\n    0x0000360D, 0x00000A12, 0x00005789, 0x0004007C, 0x00000018, 0x000029DC,\n    0x0000424F, 0x000500C2, 0x0000000B, 0x00004BB1, 0x000027FE, 0x00000A64,\n    0x00040070, 0x0000000D, 0x0000481B, 0x00004BB1, 0x00050085, 0x0000000D,\n    0x00003E2C, 0x0000481B, 0x00000149, 0x00050051, 0x0000000D, 0x000053CF,\n    0x000029DC, 0x00000000, 0x00050051, 0x0000000D, 0x00002A62, 0x000029DC,\n    0x00000001, 0x00050051, 0x0000000D, 0x00001EA3, 0x000029DC, 0x00000002,\n    0x00070050, 0x0000001D, 0x00003DE4, 0x000053CF, 0x00002A62, 0x00001EA3,\n    0x00003E2C, 0x00050051, 0x0000000B, 0x000027FF, 0x00002AC2, 0x00000002,\n    0x00060050, 0x00000014, 0x00003518, 0x000027FF, 0x000027FF, 0x000027FF,\n    0x000500C2, 0x00000014, 0x00002B1E, 0x00003518, 0x00000BB4, 0x000500C7,\n    0x00000014, 0x00005DF4, 0x00002B1E, 0x00000105, 0x000500C7, 0x00000014,\n    0x000048B6, 0x00002B1E, 0x00000466, 0x000500C2, 0x00000014, 0x00005B9E,\n    0x00005DF4, 0x00000B0C, 0x000500AA, 0x00000010, 0x000040D7, 0x00005B9E,\n    0x00000A12, 0x0006000C, 0x00000016, 0x00002C59, 0x00000001, 0x0000004B,\n    0x000048B6, 0x0004007C, 0x00000014, 0x00002A23, 0x00002C59, 0x00050082,\n    0x00000014, 0x00001888, 0x00000B0C, 0x00002A23, 0x00050080, 0x00000014,\n    0x0000221E, 0x00002A23, 0x00000938, 0x000600A9, 0x00000014, 0x0000287D,\n    0x000040D7, 0x0000221E, 0x00005B9E, 0x000500C4, 0x00000014, 0x00005AE2,\n    0x000048B6, 0x00001888, 0x000500C7, 0x00000014, 0x000049A8, 0x00005AE2,\n    0x00000466, 0x000600A9, 0x00000014, 0x00002AC5, 0x000040D7, 0x000049A8,\n    0x000048B6, 0x00050080, 0x00000014, 0x0000600C, 0x0000287D, 0x000003FA,\n    0x000500C4, 0x00000014, 0x00004F8D, 0x0000600C, 0x00000189, 0x000500C4,\n    0x00000014, 0x00003FB4, 0x00002AC5, 0x0000008D, 0x000500C5, 0x00000014,\n    0x0000578A, 0x00004F8D, 0x00003FB4, 0x000500AA, 0x00000010, 0x0000360E,\n    0x00005DF4, 0x00000A12, 0x000600A9, 0x00000014, 0x00004250, 0x0000360E,\n    0x00000A12, 0x0000578A, 0x0004007C, 0x00000018, 0x000029DD, 0x00004250,\n    0x000500C2, 0x0000000B, 0x00004BB2, 0x000027FF, 0x00000A64, 0x00040070,\n    0x0000000D, 0x0000481C, 0x00004BB2, 0x00050085, 0x0000000D, 0x00003E2D,\n    0x0000481C, 0x00000149, 0x00050051, 0x0000000D, 0x000053D0, 0x000029DD,\n    0x00000000, 0x00050051, 0x0000000D, 0x00002A63, 0x000029DD, 0x00000001,\n    0x00050051, 0x0000000D, 0x00001EA4, 0x000029DD, 0x00000002, 0x00070050,\n    0x0000001D, 0x00003DE5, 0x000053D0, 0x00002A63, 0x00001EA4, 0x00003E2D,\n    0x00050051, 0x0000000B, 0x00002800, 0x00002AC2, 0x00000003, 0x00060050,\n    0x00000014, 0x00003519, 0x00002800, 0x00002800, 0x00002800, 0x000500C2,\n    0x00000014, 0x00002B1F, 0x00003519, 0x00000BB4, 0x000500C7, 0x00000014,\n    0x00005DF5, 0x00002B1F, 0x00000105, 0x000500C7, 0x00000014, 0x000048B7,\n    0x00002B1F, 0x00000466, 0x000500C2, 0x00000014, 0x00005B9F, 0x00005DF5,\n    0x00000B0C, 0x000500AA, 0x00000010, 0x000040D8, 0x00005B9F, 0x00000A12,\n    0x0006000C, 0x00000016, 0x00002C5A, 0x00000001, 0x0000004B, 0x000048B7,\n    0x0004007C, 0x00000014, 0x00002A24, 0x00002C5A, 0x00050082, 0x00000014,\n    0x00001889, 0x00000B0C, 0x00002A24, 0x00050080, 0x00000014, 0x0000221F,\n    0x00002A24, 0x00000938, 0x000600A9, 0x00000014, 0x0000287E, 0x000040D8,\n    0x0000221F, 0x00005B9F, 0x000500C4, 0x00000014, 0x00005AE3, 0x000048B7,\n    0x00001889, 0x000500C7, 0x00000014, 0x000049A9, 0x00005AE3, 0x00000466,\n    0x000600A9, 0x00000014, 0x00002AC6, 0x000040D8, 0x000049A9, 0x000048B7,\n    0x00050080, 0x00000014, 0x0000600D, 0x0000287E, 0x000003FA, 0x000500C4,\n    0x00000014, 0x00004F8E, 0x0000600D, 0x00000189, 0x000500C4, 0x00000014,\n    0x00003FB5, 0x00002AC6, 0x0000008D, 0x000500C5, 0x00000014, 0x0000578B,\n    0x00004F8E, 0x00003FB5, 0x000500AA, 0x00000010, 0x0000360F, 0x00005DF5,\n    0x00000A12, 0x000600A9, 0x00000014, 0x00004251, 0x0000360F, 0x00000A12,\n    0x0000578B, 0x0004007C, 0x00000018, 0x000029DE, 0x00004251, 0x000500C2,\n    0x0000000B, 0x00004BB3, 0x00002800, 0x00000A64, 0x00040070, 0x0000000D,\n    0x0000481D, 0x00004BB3, 0x00050085, 0x0000000D, 0x00003E2E, 0x0000481D,\n    0x00000149, 0x00050051, 0x0000000D, 0x000053D1, 0x000029DE, 0x00000000,\n    0x00050051, 0x0000000D, 0x00002A64, 0x000029DE, 0x00000001, 0x00050051,\n    0x0000000D, 0x00002B20, 0x000029DE, 0x00000002, 0x00070050, 0x0000001D,\n    0x0000235A, 0x000053D1, 0x00002A64, 0x00002B20, 0x00003E2E, 0x000200F9,\n    0x00003F63, 0x000200F8, 0x00001CC1, 0x00050051, 0x0000000B, 0x000056C7,\n    0x00002AC2, 0x00000000, 0x00070050, 0x00000017, 0x00004F14, 0x000056C7,\n    0x000056C7, 0x000056C7, 0x000056C7, 0x000500C2, 0x00000017, 0x000024B0,\n    0x00004F14, 0x0000034D, 0x000500C7, 0x00000017, 0x000049B7, 0x000024B0,\n    0x0000027B, 0x00040070, 0x0000001D, 0x00003CC0, 0x000049B7, 0x00050085,\n    0x0000001D, 0x00004139, 0x00003CC0, 0x00000AEE, 0x00050051, 0x0000000B,\n    0x00005CDB, 0x00002AC2, 0x00000001, 0x00070050, 0x00000017, 0x00005156,\n    0x00005CDB, 0x00005CDB, 0x00005CDB, 0x00005CDB, 0x000500C2, 0x00000017,\n    0x000024B1, 0x00005156, 0x0000034D, 0x000500C7, 0x00000017, 0x000049B8,\n    0x000024B1, 0x0000027B, 0x00040070, 0x0000001D, 0x00003CC1, 0x000049B8,\n    0x00050085, 0x0000001D, 0x0000413A, 0x00003CC1, 0x00000AEE, 0x00050051,\n    0x0000000B, 0x00005CDC, 0x00002AC2, 0x00000002, 0x00070050, 0x00000017,\n    0x00005157, 0x00005CDC, 0x00005CDC, 0x00005CDC, 0x00005CDC, 0x000500C2,\n    0x00000017, 0x000024B2, 0x00005157, 0x0000034D, 0x000500C7, 0x00000017,\n    0x000049B9, 0x000024B2, 0x0000027B, 0x00040070, 0x0000001D, 0x00003CC2,\n    0x000049B9, 0x00050085, 0x0000001D, 0x0000413B, 0x00003CC2, 0x00000AEE,\n    0x00050051, 0x0000000B, 0x00005CDD, 0x00002AC2, 0x00000003, 0x00070050,\n    0x00000017, 0x0000515C, 0x00005CDD, 0x00005CDD, 0x00005CDD, 0x00005CDD,\n    0x000500C2, 0x00000017, 0x000024B3, 0x0000515C, 0x0000034D, 0x000500C7,\n    0x00000017, 0x000049BA, 0x000024B3, 0x0000027B, 0x00040070, 0x0000001D,\n    0x00004932, 0x000049BA, 0x00050085, 0x0000001D, 0x000026A2, 0x00004932,\n    0x00000AEE, 0x000200F9, 0x00003F63, 0x000200F8, 0x000038FC, 0x00050051,\n    0x0000000B, 0x000056C8, 0x00002AC2, 0x00000000, 0x00070050, 0x00000017,\n    0x00004F15, 0x000056C8, 0x000056C8, 0x000056C8, 0x000056C8, 0x000500C2,\n    0x00000017, 0x000024B4, 0x00004F15, 0x0000028D, 0x000500C7, 0x00000017,\n    0x00004A62, 0x000024B4, 0x0000064B, 0x00040070, 0x0000001D, 0x000036AB,\n    0x00004A62, 0x0005008E, 0x0000001D, 0x00004B2C, 0x000036AB, 0x0000017A,\n    0x00050051, 0x0000000B, 0x000021A8, 0x00002AC2, 0x00000001, 0x00070050,\n    0x00000017, 0x00006114, 0x000021A8, 0x000021A8, 0x000021A8, 0x000021A8,\n    0x000500C2, 0x00000017, 0x000024B5, 0x00006114, 0x0000028D, 0x000500C7,\n    0x00000017, 0x00004A63, 0x000024B5, 0x0000064B, 0x00040070, 0x0000001D,\n    0x000036AC, 0x00004A63, 0x0005008E, 0x0000001D, 0x00004B2D, 0x000036AC,\n    0x0000017A, 0x00050051, 0x0000000B, 0x000021A9, 0x00002AC2, 0x00000002,\n    0x00070050, 0x00000017, 0x00006115, 0x000021A9, 0x000021A9, 0x000021A9,\n    0x000021A9, 0x000500C2, 0x00000017, 0x000024B6, 0x00006115, 0x0000028D,\n    0x000500C7, 0x00000017, 0x00004A64, 0x000024B6, 0x0000064B, 0x00040070,\n    0x0000001D, 0x000036AD, 0x00004A64, 0x0005008E, 0x0000001D, 0x00004B2E,\n    0x000036AD, 0x0000017A, 0x00050051, 0x0000000B, 0x000021AA, 0x00002AC2,\n    0x00000003, 0x00070050, 0x00000017, 0x00006116, 0x000021AA, 0x000021AA,\n    0x000021AA, 0x000021AA, 0x000500C2, 0x00000017, 0x000024B7, 0x00006116,\n    0x0000028D, 0x000500C7, 0x00000017, 0x00004A65, 0x000024B7, 0x0000064B,\n    0x00040070, 0x0000001D, 0x0000431D, 0x00004A65, 0x0005008E, 0x0000001D,\n    0x00003095, 0x0000431D, 0x0000017A, 0x000200F9, 0x00003F63, 0x000200F8,\n    0x00004BFE, 0x00050051, 0x0000000B, 0x00003096, 0x00002AC2, 0x00000000,\n    0x0004007C, 0x0000000D, 0x00004FF1, 0x00003096, 0x00050050, 0x00000013,\n    0x0000433F, 0x00004FF1, 0x00000A0C, 0x0009004F, 0x0000001D, 0x00002D99,\n    0x0000433F, 0x0000433F, 0x00000000, 0x00000001, 0x00000001, 0x00000001,\n    0x00050051, 0x0000000B, 0x000056BA, 0x00002AC2, 0x00000001, 0x0004007C,\n    0x0000000D, 0x00003F71, 0x000056BA, 0x00050050, 0x00000013, 0x00004340,\n    0x00003F71, 0x00000A0C, 0x0009004F, 0x0000001D, 0x00002D9A, 0x00004340,\n    0x00004340, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00050051,\n    0x0000000B, 0x000056BB, 0x00002AC2, 0x00000002, 0x0004007C, 0x0000000D,\n    0x00003F72, 0x000056BB, 0x00050050, 0x00000013, 0x00004341, 0x00003F72,\n    0x00000A0C, 0x0009004F, 0x0000001D, 0x00002D9B, 0x00004341, 0x00004341,\n    0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00050051, 0x0000000B,\n    0x000056BC, 0x00002AC2, 0x00000003, 0x0004007C, 0x0000000D, 0x00003F73,\n    0x000056BC, 0x00050050, 0x00000013, 0x00004FB1, 0x00003F73, 0x00000A0C,\n    0x0009004F, 0x0000001D, 0x00005A3D, 0x00004FB1, 0x00004FB1, 0x00000000,\n    0x00000001, 0x00000001, 0x00000001, 0x000200F9, 0x00003F63, 0x000200F8,\n    0x00003F63, 0x000F00F5, 0x0000001D, 0x00002BB0, 0x00005A3D, 0x00004BFE,\n    0x00003095, 0x000038FC, 0x000026A2, 0x00001CC1, 0x0000235A, 0x00001CC0,\n    0x00002359, 0x00002001, 0x00002358, 0x00002039, 0x000F00F5, 0x0000001D,\n    0x00003811, 0x00002D9B, 0x00004BFE, 0x00004B2E, 0x000038FC, 0x0000413B,\n    0x00001CC1, 0x00003DE5, 0x00001CC0, 0x00004129, 0x00002001, 0x00003920,\n    0x00002039, 0x000F00F5, 0x0000001D, 0x00003B83, 0x00002D9A, 0x00004BFE,\n    0x00004B2D, 0x000038FC, 0x0000413A, 0x00001CC1, 0x00003DE4, 0x00001CC0,\n    0x00004128, 0x00002001, 0x0000391F, 0x00002039, 0x000F00F5, 0x0000001D,\n    0x000038BC, 0x00002D99, 0x00004BFE, 0x00004B2C, 0x000038FC, 0x00004139,\n    0x00001CC1, 0x00003DE3, 0x00001CC0, 0x00004127, 0x00002001, 0x0000391E,\n    0x00002039, 0x000200F9, 0x00005312, 0x000200F8, 0x00003B68, 0x000500AA,\n    0x00000009, 0x00005453, 0x0000199B, 0x00000A22, 0x000300F7, 0x00004F29,\n    0x00000002, 0x000400FA, 0x00005453, 0x000019C6, 0x00002306, 0x000200F8,\n    0x00002306, 0x000500C2, 0x0000000B, 0x00005637, 0x00003FF8, 0x00000A11,\n    0x00060041, 0x00000289, 0x00003447, 0x00000CC7, 0x00000A0B, 0x00005637,\n    0x0004003D, 0x0000000B, 0x00003157, 0x00003447, 0x00050080, 0x0000000B,\n    0x00002DD1, 0x00005637, 0x00000A0D, 0x00060041, 0x00000289, 0x00001916,\n    0x00000CC7, 0x00000A0B, 0x00002DD1, 0x0004003D, 0x0000000B, 0x00001B79,\n    0x00001916, 0x00050080, 0x0000000B, 0x0000214C, 0x00003FF8, 0x0000199B,\n    0x000500C2, 0x0000000B, 0x000054AD, 0x0000214C, 0x00000A11, 0x00060041,\n    0x00000289, 0x00004C9D, 0x00000CC7, 0x00000A0B, 0x000054AD, 0x0004003D,\n    0x0000000B, 0x00003158, 0x00004C9D, 0x00050080, 0x0000000B, 0x00002DD2,\n    0x000054AD, 0x00000A0D, 0x00060041, 0x00000289, 0x0000600E, 0x00000CC7,\n    0x00000A0B, 0x00002DD2, 0x0004003D, 0x0000000B, 0x00003750, 0x0000600E,\n    0x00070050, 0x00000017, 0x00004CDA, 0x00003157, 0x00001B79, 0x00003158,\n    0x00003750, 0x00050084, 0x0000000B, 0x00004C2E, 0x00000A10, 0x0000199B,\n    0x00050080, 0x0000000B, 0x00002A48, 0x00003FF8, 0x00004C2E, 0x000500C2,\n    0x0000000B, 0x000045F0, 0x00002A48, 0x00000A11, 0x00060041, 0x00000289,\n    0x00004C9E, 0x00000CC7, 0x00000A0B, 0x000045F0, 0x0004003D, 0x0000000B,\n    0x00003159, 0x00004C9E, 0x00050080, 0x0000000B, 0x00002DD3, 0x000045F0,\n    0x00000A0D, 0x00060041, 0x00000289, 0x0000194E, 0x00000CC7, 0x00000A0B,\n    0x00002DD3, 0x0004003D, 0x0000000B, 0x00005E5E, 0x0000194E, 0x00050084,\n    0x0000000B, 0x000021F8, 0x00000A13, 0x0000199B, 0x00050080, 0x0000000B,\n    0x00005ECA, 0x00003FF8, 0x000021F8, 0x000500C2, 0x0000000B, 0x000045F1,\n    0x00005ECA, 0x00000A11, 0x00060041, 0x00000289, 0x00004C9F, 0x00000CC7,\n    0x00000A0B, 0x000045F1, 0x0004003D, 0x0000000B, 0x0000315A, 0x00004C9F,\n    0x00050080, 0x0000000B, 0x00002DD4, 0x000045F1, 0x00000A0D, 0x00060041,\n    0x00000289, 0x0000600F, 0x00000CC7, 0x00000A0B, 0x00002DD4, 0x0004003D,\n    0x0000000B, 0x00004005, 0x0000600F, 0x00070050, 0x00000017, 0x0000513A,\n    0x00003159, 0x00005E5E, 0x0000315A, 0x00004005, 0x000200F9, 0x00004F29,\n    0x000200F8, 0x000019C6, 0x000500C2, 0x0000000B, 0x00005FAD, 0x00003FF8,\n    0x00000A11, 0x00060041, 0x00000289, 0x00003448, 0x00000CC7, 0x00000A0B,\n    0x00005FAD, 0x0004003D, 0x0000000B, 0x0000315B, 0x00003448, 0x00050080,\n    0x0000000B, 0x00002DD5, 0x00005FAD, 0x00000A0D, 0x00060041, 0x00000289,\n    0x00001917, 0x00000CC7, 0x00000A0B, 0x00002DD5, 0x0004003D, 0x0000000B,\n    0x00005C76, 0x00001917, 0x00050080, 0x0000000B, 0x00002DD6, 0x00005FAD,\n    0x00000A10, 0x00060041, 0x00000289, 0x00001918, 0x00000CC7, 0x00000A0B,\n    0x00002DD6, 0x0004003D, 0x0000000B, 0x00005C77, 0x00001918, 0x00050080,\n    0x0000000B, 0x00002DD7, 0x00005FAD, 0x00000A13, 0x00060041, 0x00000289,\n    0x00006010, 0x00000CC7, 0x00000A0B, 0x00002DD7, 0x0004003D, 0x0000000B,\n    0x00003703, 0x00006010, 0x00070050, 0x00000017, 0x00005473, 0x0000315B,\n    0x00005C76, 0x00005C77, 0x00003703, 0x00050080, 0x0000000B, 0x00004B86,\n    0x00003FF8, 0x00000A3A, 0x000500C2, 0x0000000B, 0x00002030, 0x00004B86,\n    0x00000A11, 0x00060041, 0x00000289, 0x00004CA0, 0x00000CC7, 0x00000A0B,\n    0x00002030, 0x0004003D, 0x0000000B, 0x0000315C, 0x00004CA0, 0x00050080,\n    0x0000000B, 0x00002DD8, 0x00002030, 0x00000A0D, 0x00060041, 0x00000289,\n    0x00001919, 0x00000CC7, 0x00000A0B, 0x00002DD8, 0x0004003D, 0x0000000B,\n    0x00005C78, 0x00001919, 0x00050080, 0x0000000B, 0x00002DD9, 0x00002030,\n    0x00000A10, 0x00060041, 0x00000289, 0x0000191A, 0x00000CC7, 0x00000A0B,\n    0x00002DD9, 0x0004003D, 0x0000000B, 0x00005C79, 0x0000191A, 0x00050080,\n    0x0000000B, 0x00002DDA, 0x00002030, 0x00000A13, 0x00060041, 0x00000289,\n    0x00006011, 0x00000CC7, 0x00000A0B, 0x00002DDA, 0x0004003D, 0x0000000B,\n    0x00004006, 0x00006011, 0x00070050, 0x00000017, 0x0000513B, 0x0000315C,\n    0x00005C78, 0x00005C79, 0x00004006, 0x000200F9, 0x00004F29, 0x000200F8,\n    0x00004F29, 0x000700F5, 0x00000017, 0x00002BD0, 0x0000513B, 0x000019C6,\n    0x0000513A, 0x00002306, 0x000700F5, 0x00000017, 0x00003723, 0x00005473,\n    0x000019C6, 0x00004CDA, 0x00002306, 0x000300F7, 0x00004F2A, 0x00000000,\n    0x000700FB, 0x00002180, 0x00004F59, 0x00000005, 0x0000215B, 0x00000007,\n    0x0000203A, 0x000200F8, 0x0000203A, 0x00050051, 0x0000000B, 0x00005F61,\n    0x00003723, 0x00000000, 0x0006000C, 0x00000013, 0x0000606E, 0x00000001,\n    0x0000003E, 0x00005F61, 0x00050051, 0x0000000D, 0x0000278A, 0x0000606E,\n    0x00000000, 0x00050051, 0x0000000D, 0x00003EC4, 0x0000606E, 0x00000001,\n    0x00050051, 0x0000000B, 0x0000428D, 0x00003723, 0x00000001, 0x0006000C,\n    0x00000013, 0x00003D01, 0x00000001, 0x0000003E, 0x0000428D, 0x00050051,\n    0x0000000D, 0x0000278B, 0x00003D01, 0x00000000, 0x00050051, 0x0000000D,\n    0x0000445B, 0x00003D01, 0x00000001, 0x00070050, 0x0000001D, 0x00003921,\n    0x0000278A, 0x00003EC4, 0x0000278B, 0x0000445B, 0x00050051, 0x0000000B,\n    0x0000438F, 0x00003723, 0x00000002, 0x0006000C, 0x00000013, 0x00004680,\n    0x00000001, 0x0000003E, 0x0000438F, 0x00050051, 0x0000000D, 0x0000278C,\n    0x00004680, 0x00000000, 0x00050051, 0x0000000D, 0x00003EC5, 0x00004680,\n    0x00000001, 0x00050051, 0x0000000B, 0x0000428E, 0x00003723, 0x00000003,\n    0x0006000C, 0x00000013, 0x00003D02, 0x00000001, 0x0000003E, 0x0000428E,\n    0x00050051, 0x0000000D, 0x0000278D, 0x00003D02, 0x00000000, 0x00050051,\n    0x0000000D, 0x0000445C, 0x00003D02, 0x00000001, 0x00070050, 0x0000001D,\n    0x00003922, 0x0000278C, 0x00003EC5, 0x0000278D, 0x0000445C, 0x00050051,\n    0x0000000B, 0x00004390, 0x00002BD0, 0x00000000, 0x0006000C, 0x00000013,\n    0x00004681, 0x00000001, 0x0000003E, 0x00004390, 0x00050051, 0x0000000D,\n    0x0000278E, 0x00004681, 0x00000000, 0x00050051, 0x0000000D, 0x00003EC6,\n    0x00004681, 0x00000001, 0x00050051, 0x0000000B, 0x0000428F, 0x00002BD0,\n    0x00000001, 0x0006000C, 0x00000013, 0x00003D03, 0x00000001, 0x0000003E,\n    0x0000428F, 0x00050051, 0x0000000D, 0x0000278F, 0x00003D03, 0x00000000,\n    0x00050051, 0x0000000D, 0x0000445D, 0x00003D03, 0x00000001, 0x00070050,\n    0x0000001D, 0x00003923, 0x0000278E, 0x00003EC6, 0x0000278F, 0x0000445D,\n    0x00050051, 0x0000000B, 0x00004391, 0x00002BD0, 0x00000002, 0x0006000C,\n    0x00000013, 0x00004682, 0x00000001, 0x0000003E, 0x00004391, 0x00050051,\n    0x0000000D, 0x00002790, 0x00004682, 0x00000000, 0x00050051, 0x0000000D,\n    0x00003EC7, 0x00004682, 0x00000001, 0x00050051, 0x0000000B, 0x00004290,\n    0x00002BD0, 0x00000003, 0x0006000C, 0x00000013, 0x00003D04, 0x00000001,\n    0x0000003E, 0x00004290, 0x00050051, 0x0000000D, 0x00002791, 0x00003D04,\n    0x00000000, 0x00050051, 0x0000000D, 0x000050C5, 0x00003D04, 0x00000001,\n    0x00070050, 0x0000001D, 0x0000235B, 0x00002790, 0x00003EC7, 0x00002791,\n    0x000050C5, 0x000200F9, 0x00004F2A, 0x000200F8, 0x0000215B, 0x0007004F,\n    0x00000011, 0x000025FE, 0x00003723, 0x00003723, 0x00000000, 0x00000001,\n    0x0004007C, 0x00000012, 0x00005B3F, 0x000025FE, 0x0009004F, 0x0000001A,\n    0x000060DA, 0x00005B3F, 0x00005B3F, 0x00000000, 0x00000000, 0x00000001,\n    0x00000001, 0x000500C4, 0x0000001A, 0x000048B8, 0x000060DA, 0x00000122,\n    0x000500C3, 0x0000001A, 0x00003D99, 0x000048B8, 0x00000302, 0x0004006F,\n    0x0000001D, 0x00002AC7, 0x00003D99, 0x0005008E, 0x0000001D, 0x00004733,\n    0x00002AC7, 0x000007FE, 0x0007000C, 0x0000001D, 0x0000629A, 0x00000001,\n    0x00000028, 0x00000504, 0x00004733, 0x0007004F, 0x00000011, 0x00003774,\n    0x00003723, 0x00003723, 0x00000002, 0x00000003, 0x0004007C, 0x00000012,\n    0x000024C8, 0x00003774, 0x0009004F, 0x0000001A, 0x000060DB, 0x000024C8,\n    0x000024C8, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x000500C4,\n    0x0000001A, 0x000048B9, 0x000060DB, 0x00000122, 0x000500C3, 0x0000001A,\n    0x00003D9A, 0x000048B9, 0x00000302, 0x0004006F, 0x0000001D, 0x00002AC8,\n    0x00003D9A, 0x0005008E, 0x0000001D, 0x00004734, 0x00002AC8, 0x000007FE,\n    0x0007000C, 0x0000001D, 0x0000629B, 0x00000001, 0x00000028, 0x00000504,\n    0x00004734, 0x0007004F, 0x00000011, 0x00003775, 0x00002BD0, 0x00002BD0,\n    0x00000000, 0x00000001, 0x0004007C, 0x00000012, 0x000024C9, 0x00003775,\n    0x0009004F, 0x0000001A, 0x000060DC, 0x000024C9, 0x000024C9, 0x00000000,\n    0x00000000, 0x00000001, 0x00000001, 0x000500C4, 0x0000001A, 0x000048BA,\n    0x000060DC, 0x00000122, 0x000500C3, 0x0000001A, 0x00003D9B, 0x000048BA,\n    0x00000302, 0x0004006F, 0x0000001D, 0x00002AC9, 0x00003D9B, 0x0005008E,\n    0x0000001D, 0x00004735, 0x00002AC9, 0x000007FE, 0x0007000C, 0x0000001D,\n    0x0000629C, 0x00000001, 0x00000028, 0x00000504, 0x00004735, 0x0007004F,\n    0x00000011, 0x00003776, 0x00002BD0, 0x00002BD0, 0x00000002, 0x00000003,\n    0x0004007C, 0x00000012, 0x000024CA, 0x00003776, 0x0009004F, 0x0000001A,\n    0x000060DD, 0x000024CA, 0x000024CA, 0x00000000, 0x00000000, 0x00000001,\n    0x00000001, 0x000500C4, 0x0000001A, 0x000048BC, 0x000060DD, 0x00000122,\n    0x000500C3, 0x0000001A, 0x00003D9C, 0x000048BC, 0x00000302, 0x0004006F,\n    0x0000001D, 0x00002ACA, 0x00003D9C, 0x0005008E, 0x0000001D, 0x000053D2,\n    0x00002ACA, 0x000007FE, 0x0007000C, 0x0000001D, 0x00004365, 0x00000001,\n    0x00000028, 0x00000504, 0x000053D2, 0x000200F9, 0x00004F2A, 0x000200F8,\n    0x00004F59, 0x0007004F, 0x00000011, 0x00002624, 0x00003723, 0x00003723,\n    0x00000000, 0x00000001, 0x0004007C, 0x00000013, 0x0000515D, 0x00002624,\n    0x00050051, 0x0000000D, 0x00001B87, 0x0000515D, 0x00000000, 0x00050051,\n    0x0000000D, 0x00003473, 0x0000515D, 0x00000001, 0x00070050, 0x0000001D,\n    0x00004291, 0x00001B87, 0x00003473, 0x00000A0C, 0x00000A0C, 0x0007004F,\n    0x00000011, 0x000041E1, 0x00003723, 0x00003723, 0x00000002, 0x00000003,\n    0x0004007C, 0x00000013, 0x00003766, 0x000041E1, 0x00050051, 0x0000000D,\n    0x00001B88, 0x00003766, 0x00000000, 0x00050051, 0x0000000D, 0x00003474,\n    0x00003766, 0x00000001, 0x00070050, 0x0000001D, 0x00004292, 0x00001B88,\n    0x00003474, 0x00000A0C, 0x00000A0C, 0x0007004F, 0x00000011, 0x000041E2,\n    0x00002BD0, 0x00002BD0, 0x00000000, 0x00000001, 0x0004007C, 0x00000013,\n    0x00003767, 0x000041E2, 0x00050051, 0x0000000D, 0x00001B89, 0x00003767,\n    0x00000000, 0x00050051, 0x0000000D, 0x00003475, 0x00003767, 0x00000001,\n    0x00070050, 0x0000001D, 0x00004293, 0x00001B89, 0x00003475, 0x00000A0C,\n    0x00000A0C, 0x0007004F, 0x00000011, 0x000041E3, 0x00002BD0, 0x00002BD0,\n    0x00000002, 0x00000003, 0x0004007C, 0x00000013, 0x00003768, 0x000041E3,\n    0x00050051, 0x0000000D, 0x00001B8A, 0x00003768, 0x00000000, 0x00050051,\n    0x0000000D, 0x0000410B, 0x00003768, 0x00000001, 0x00070050, 0x0000001D,\n    0x0000235C, 0x00001B8A, 0x0000410B, 0x00000A0C, 0x00000A0C, 0x000200F9,\n    0x00004F2A, 0x000200F8, 0x00004F2A, 0x000900F5, 0x0000001D, 0x00002BB1,\n    0x0000235C, 0x00004F59, 0x00004365, 0x0000215B, 0x0000235B, 0x0000203A,\n    0x000900F5, 0x0000001D, 0x00003812, 0x00004293, 0x00004F59, 0x0000629C,\n    0x0000215B, 0x00003923, 0x0000203A, 0x000900F5, 0x0000001D, 0x00003B84,\n    0x00004292, 0x00004F59, 0x0000629B, 0x0000215B, 0x00003922, 0x0000203A,\n    0x000900F5, 0x0000001D, 0x000038BD, 0x00004291, 0x00004F59, 0x0000629A,\n    0x0000215B, 0x00003921, 0x0000203A, 0x000200F9, 0x00005312, 0x000200F8,\n    0x00005312, 0x000700F5, 0x0000001D, 0x00002BB2, 0x00002BB1, 0x00004F2A,\n    0x00002BB0, 0x00003F63, 0x000700F5, 0x0000001D, 0x00003813, 0x00003812,\n    0x00004F2A, 0x00003811, 0x00003F63, 0x000700F5, 0x0000001D, 0x00003297,\n    0x00003B84, 0x00004F2A, 0x00003B83, 0x00003F63, 0x000700F5, 0x0000001D,\n    0x0000367C, 0x000038BD, 0x00004F2A, 0x000038BC, 0x00003F63, 0x00050081,\n    0x0000001D, 0x0000435B, 0x0000435A, 0x0000367C, 0x00050081, 0x0000001D,\n    0x00005B03, 0x00005B02, 0x00003297, 0x00050081, 0x0000001D, 0x00002523,\n    0x00001C28, 0x00003813, 0x00050081, 0x0000001D, 0x00001E77, 0x000025AA,\n    0x00002BB2, 0x000200F9, 0x00005ECB, 0x000200F8, 0x00005ECB, 0x000700F5,\n    0x0000001D, 0x00002BB3, 0x00005113, 0x00005310, 0x00001E77, 0x00005312,\n    0x000700F5, 0x0000001D, 0x00003814, 0x00001F92, 0x00005310, 0x00002523,\n    0x00005312, 0x000700F5, 0x0000001D, 0x00003B31, 0x00005B01, 0x00005310,\n    0x00005B03, 0x00005312, 0x000700F5, 0x0000001D, 0x00003B85, 0x00004359,\n    0x00005310, 0x0000435B, 0x00005312, 0x000700F5, 0x0000000D, 0x000038BE,\n    0x000061FB, 0x00005310, 0x00002F3A, 0x00005312, 0x000200F9, 0x00005313,\n    0x000200F8, 0x00005313, 0x000700F5, 0x0000001D, 0x00002BB4, 0x00002BA9,\n    0x0000530F, 0x00002BB3, 0x00005ECB, 0x000700F5, 0x0000001D, 0x00003815,\n    0x0000380A, 0x0000530F, 0x00003814, 0x00005ECB, 0x000700F5, 0x0000001D,\n    0x00003B32, 0x000035EC, 0x0000530F, 0x00003B31, 0x00005ECB, 0x000700F5,\n    0x0000001D, 0x0000338C, 0x000020D3, 0x0000530F, 0x00003B85, 0x00005ECB,\n    0x000700F5, 0x0000000D, 0x00002EA8, 0x00002B2C, 0x0000530F, 0x000038BE,\n    0x00005ECB, 0x0005008E, 0x0000001D, 0x00005A74, 0x0000338C, 0x00002EA8,\n    0x0005008E, 0x0000001D, 0x000019CC, 0x00003B32, 0x00002EA8, 0x0005008E,\n    0x0000001D, 0x0000306F, 0x00003815, 0x00002EA8, 0x0005008E, 0x0000001D,\n    0x00003432, 0x00002BB4, 0x00002EA8, 0x000300F7, 0x00003F64, 0x00000002,\n    0x000400FA, 0x00001D33, 0x00002741, 0x00003F64, 0x000200F8, 0x00002741,\n    0x0009004F, 0x0000001D, 0x00003AEE, 0x00005A74, 0x00005A74, 0x00000002,\n    0x00000001, 0x00000000, 0x00000003, 0x0009004F, 0x0000001D, 0x00003A07,\n    0x000019CC, 0x000019CC, 0x00000002, 0x00000001, 0x00000000, 0x00000003,\n    0x0009004F, 0x0000001D, 0x00001CE6, 0x0000306F, 0x0000306F, 0x00000002,\n    0x00000001, 0x00000000, 0x00000003, 0x0009004F, 0x0000001D, 0x00003EEF,\n    0x00003432, 0x00003432, 0x00000002, 0x00000001, 0x00000000, 0x00000003,\n    0x000200F9, 0x00003F64, 0x000200F8, 0x00003F64, 0x000700F5, 0x0000001D,\n    0x00002BB5, 0x00003432, 0x00005313, 0x00003EEF, 0x00002741, 0x000700F5,\n    0x0000001D, 0x00003816, 0x0000306F, 0x00005313, 0x00001CE6, 0x00002741,\n    0x000700F5, 0x0000001D, 0x00003B57, 0x000019CC, 0x00005313, 0x00003A07,\n    0x00002741, 0x000700F5, 0x0000001D, 0x00003A49, 0x00005A74, 0x00005313,\n    0x00003AEE, 0x00002741, 0x000300F7, 0x00005BA4, 0x00000000, 0x000700FB,\n    0x00005093, 0x00001CCD, 0x0000001A, 0x00004696, 0x00000020, 0x00002514,\n    0x000200F8, 0x00002514, 0x00050051, 0x0000000D, 0x00003AAE, 0x00003A49,\n    0x00000000, 0x00050051, 0x0000000D, 0x000023ED, 0x00003A49, 0x00000001,\n    0x00050050, 0x00000013, 0x00004B20, 0x00003AAE, 0x000023ED, 0x0006000C,\n    0x0000000B, 0x00002171, 0x00000001, 0x0000003A, 0x00004B20, 0x00050051,\n    0x0000000D, 0x00005BBF, 0x00003A49, 0x00000002, 0x00050051, 0x0000000D,\n    0x000039A7, 0x00003A49, 0x00000003, 0x00050050, 0x00000013, 0x00004B21,\n    0x00005BBF, 0x000039A7, 0x0006000C, 0x0000000B, 0x00002172, 0x00000001,\n    0x0000003A, 0x00004B21, 0x00050051, 0x0000000D, 0x00005BC0, 0x00003B57,\n    0x00000000, 0x00050051, 0x0000000D, 0x000039A8, 0x00003B57, 0x00000001,\n    0x00050050, 0x00000013, 0x00004B22, 0x00005BC0, 0x000039A8, 0x0006000C,\n    0x0000000B, 0x00002173, 0x00000001, 0x0000003A, 0x00004B22, 0x00050051,\n    0x0000000D, 0x00005BC1, 0x00003B57, 0x00000002, 0x00050051, 0x0000000D,\n    0x000039A9, 0x00003B57, 0x00000003, 0x00050050, 0x00000013, 0x00004B0D,\n    0x00005BC1, 0x000039A9, 0x0006000C, 0x0000000B, 0x00002220, 0x00000001,\n    0x0000003A, 0x00004B0D, 0x00070050, 0x00000017, 0x0000315D, 0x00002171,\n    0x00002172, 0x00002173, 0x00002220, 0x00050051, 0x0000000D, 0x00003EC8,\n    0x00003816, 0x00000000, 0x00050051, 0x0000000D, 0x00005474, 0x00003816,\n    0x00000001, 0x00050050, 0x00000013, 0x00004B2F, 0x00003EC8, 0x00005474,\n    0x0006000C, 0x0000000B, 0x00002174, 0x00000001, 0x0000003A, 0x00004B2F,\n    0x00050051, 0x0000000D, 0x00005BC2, 0x00003816, 0x00000002, 0x00050051,\n    0x0000000D, 0x000039AA, 0x00003816, 0x00000003, 0x00050050, 0x00000013,\n    0x00004B30, 0x00005BC2, 0x000039AA, 0x0006000C, 0x0000000B, 0x00002175,\n    0x00000001, 0x0000003A, 0x00004B30, 0x00050051, 0x0000000D, 0x00005BC3,\n    0x00002BB5, 0x00000000, 0x00050051, 0x0000000D, 0x000039AB, 0x00002BB5,\n    0x00000001, 0x00050050, 0x00000013, 0x00004B31, 0x00005BC3, 0x000039AB,\n    0x0006000C, 0x0000000B, 0x00002176, 0x00000001, 0x0000003A, 0x00004B31,\n    0x00050051, 0x0000000D, 0x00005BC4, 0x00002BB5, 0x00000002, 0x00050051,\n    0x0000000D, 0x000039AC, 0x00002BB5, 0x00000003, 0x00050050, 0x00000013,\n    0x00004B0E, 0x00005BC4, 0x000039AC, 0x0006000C, 0x0000000B, 0x00002E96,\n    0x00000001, 0x0000003A, 0x00004B0E, 0x00070050, 0x00000017, 0x0000612F,\n    0x00002174, 0x00002175, 0x00002176, 0x00002E96, 0x000200F9, 0x00005BA4,\n    0x000200F8, 0x00004696, 0x0008000C, 0x0000001D, 0x00001C8F, 0x00000001,\n    0x0000002B, 0x00003A49, 0x00000B7A, 0x00000505, 0x0005008E, 0x0000001D,\n    0x00004F73, 0x00001C8F, 0x0000022D, 0x00050081, 0x0000001D, 0x00002E40,\n    0x00004F73, 0x00000145, 0x0004006D, 0x00000017, 0x00001F0B, 0x00002E40,\n    0x0007004F, 0x00000011, 0x000018D9, 0x00001F0B, 0x00001F0B, 0x00000000,\n    0x00000002, 0x0007004F, 0x00000011, 0x00002750, 0x00001F0B, 0x00001F0B,\n    0x00000001, 0x00000003, 0x000500C4, 0x00000011, 0x000028CE, 0x00002750,\n    0x00000867, 0x000500C5, 0x00000011, 0x000057C9, 0x000018D9, 0x000028CE,\n    0x00050051, 0x0000000B, 0x0000498C, 0x000057C9, 0x00000000, 0x00050051,\n    0x0000000B, 0x00003BFC, 0x000057C9, 0x00000001, 0x0008000C, 0x0000001D,\n    0x00003751, 0x00000001, 0x0000002B, 0x00003B57, 0x00000B7A, 0x00000505,\n    0x0005008E, 0x0000001D, 0x00002C01, 0x00003751, 0x0000022D, 0x00050081,\n    0x0000001D, 0x00002E41, 0x00002C01, 0x00000145, 0x0004006D, 0x00000017,\n    0x00001F0C, 0x00002E41, 0x0007004F, 0x00000011, 0x000018DA, 0x00001F0C,\n    0x00001F0C, 0x00000000, 0x00000002, 0x0007004F, 0x00000011, 0x00002751,\n    0x00001F0C, 0x00001F0C, 0x00000001, 0x00000003, 0x000500C4, 0x00000011,\n    0x000028CF, 0x00002751, 0x00000867, 0x000500C5, 0x00000011, 0x000057CA,\n    0x000018DA, 0x000028CF, 0x00050051, 0x0000000B, 0x00004E6D, 0x000057CA,\n    0x00000000, 0x00050051, 0x0000000B, 0x0000586B, 0x000057CA, 0x00000001,\n    0x00070050, 0x00000017, 0x00001D37, 0x0000498C, 0x00003BFC, 0x00004E6D,\n    0x0000586B, 0x0008000C, 0x0000001D, 0x00003846, 0x00000001, 0x0000002B,\n    0x00003816, 0x00000B7A, 0x00000505, 0x0005008E, 0x0000001D, 0x00003577,\n    0x00003846, 0x0000022D, 0x00050081, 0x0000001D, 0x00002E42, 0x00003577,\n    0x00000145, 0x0004006D, 0x00000017, 0x00001F0D, 0x00002E42, 0x0007004F,\n    0x00000011, 0x000018DB, 0x00001F0D, 0x00001F0D, 0x00000000, 0x00000002,\n    0x0007004F, 0x00000011, 0x00002752, 0x00001F0D, 0x00001F0D, 0x00000001,\n    0x00000003, 0x000500C4, 0x00000011, 0x000028D0, 0x00002752, 0x00000867,\n    0x000500C5, 0x00000011, 0x000057CB, 0x000018DB, 0x000028D0, 0x00050051,\n    0x0000000B, 0x0000498D, 0x000057CB, 0x00000000, 0x00050051, 0x0000000B,\n    0x00003BFD, 0x000057CB, 0x00000001, 0x0008000C, 0x0000001D, 0x00003752,\n    0x00000001, 0x0000002B, 0x00002BB5, 0x00000B7A, 0x00000505, 0x0005008E,\n    0x0000001D, 0x00002C02, 0x00003752, 0x0000022D, 0x00050081, 0x0000001D,\n    0x00002E43, 0x00002C02, 0x00000145, 0x0004006D, 0x00000017, 0x00001F0E,\n    0x00002E43, 0x0007004F, 0x00000011, 0x000018DC, 0x00001F0E, 0x00001F0E,\n    0x00000000, 0x00000002, 0x0007004F, 0x00000011, 0x00002753, 0x00001F0E,\n    0x00001F0E, 0x00000001, 0x00000003, 0x000500C4, 0x00000011, 0x000028D1,\n    0x00002753, 0x00000867, 0x000500C5, 0x00000011, 0x000057CC, 0x000018DC,\n    0x000028D1, 0x00050051, 0x0000000B, 0x00004E6E, 0x000057CC, 0x00000000,\n    0x00050051, 0x0000000B, 0x00001F58, 0x000057CC, 0x00000001, 0x00070050,\n    0x00000017, 0x0000235D, 0x0000498D, 0x00003BFD, 0x00004E6E, 0x00001F58,\n    0x000200F9, 0x00005BA4, 0x000200F8, 0x00001CCD, 0x00050051, 0x0000000D,\n    0x00004DAD, 0x00003A49, 0x00000000, 0x00050051, 0x0000000D, 0x00002825,\n    0x00003A49, 0x00000001, 0x00050051, 0x0000000D, 0x00001DD9, 0x00003B57,\n    0x00000000, 0x00050051, 0x0000000D, 0x000021CA, 0x00003B57, 0x00000001,\n    0x00070050, 0x0000001D, 0x000020DE, 0x00004DAD, 0x00002825, 0x00001DD9,\n    0x000021CA, 0x0004007C, 0x00000017, 0x00004627, 0x000020DE, 0x00050051,\n    0x0000000D, 0x00002B51, 0x00003816, 0x00000000, 0x00050051, 0x0000000D,\n    0x000033E3, 0x00003816, 0x00000001, 0x00050051, 0x0000000D, 0x00001DDA,\n    0x00002BB5, 0x00000000, 0x00050051, 0x0000000D, 0x000021CB, 0x00002BB5,\n    0x00000001, 0x00070050, 0x0000001D, 0x00002D56, 0x00002B51, 0x000033E3,\n    0x00001DDA, 0x000021CB, 0x0004007C, 0x00000017, 0x00002B83, 0x00002D56,\n    0x000200F9, 0x00005BA4, 0x000200F8, 0x00005BA4, 0x000900F5, 0x00000017,\n    0x00002616, 0x00002B83, 0x00001CCD, 0x0000235D, 0x00004696, 0x0000612F,\n    0x00002514, 0x000900F5, 0x00000017, 0x000033CD, 0x00004627, 0x00001CCD,\n    0x00001D37, 0x00004696, 0x0000315D, 0x00002514, 0x000500AA, 0x00000009,\n    0x00004DD8, 0x00001DD8, 0x00000A0A, 0x000600A9, 0x00000009, 0x000056E6,\n    0x00004DD8, 0x00000787, 0x00004DD8, 0x000300F7, 0x00004CC1, 0x00000002,\n    0x000400FA, 0x000056E6, 0x00002620, 0x00004CC1, 0x000200F8, 0x00002620,\n    0x00050051, 0x0000000B, 0x00004392, 0x000033CD, 0x00000002, 0x00060052,\n    0x00000017, 0x000052B6, 0x00004392, 0x000033CD, 0x00000000, 0x00050051,\n    0x0000000B, 0x00005A04, 0x000033CD, 0x00000003, 0x00060052, 0x00000017,\n    0x00002450, 0x00005A04, 0x000052B6, 0x00000001, 0x000200F9, 0x00004CC1,\n    0x000200F8, 0x00004CC1, 0x000700F5, 0x00000017, 0x0000305F, 0x000033CD,\n    0x00005BA4, 0x00002450, 0x00002620, 0x00050080, 0x00000011, 0x000032A7,\n    0x00002EF9, 0x000059EC, 0x000300F7, 0x000052F5, 0x00000002, 0x000400FA,\n    0x0000500F, 0x0000294E, 0x0000537D, 0x000200F8, 0x0000537D, 0x0004007C,\n    0x00000012, 0x00002970, 0x000032A7, 0x00050051, 0x0000000C, 0x000045F3,\n    0x00002970, 0x00000001, 0x000500C3, 0x0000000C, 0x00004DC0, 0x000045F3,\n    0x00000A1A, 0x0004007C, 0x0000000C, 0x0000578C, 0x000020FC, 0x00050084,\n    0x0000000C, 0x00001F02, 0x00004DC0, 0x0000578C, 0x00050051, 0x0000000C,\n    0x00006242, 0x00002970, 0x00000000, 0x000500C3, 0x0000000C, 0x00004FC7,\n    0x00006242, 0x00000A1A, 0x00050080, 0x0000000C, 0x000049BB, 0x00001F02,\n    0x00004FC7, 0x000500C4, 0x0000000C, 0x0000254A, 0x000049BB, 0x00000A1D,\n    0x000500C3, 0x0000000C, 0x0000603B, 0x000045F3, 0x00000A0E, 0x000500C7,\n    0x0000000C, 0x0000539A, 0x0000603B, 0x00000A20, 0x000500C4, 0x0000000C,\n    0x0000534A, 0x0000539A, 0x00000A14, 0x000500C7, 0x0000000C, 0x00004EA5,\n    0x00006242, 0x00000A20, 0x000500C5, 0x0000000C, 0x00002B21, 0x0000534A,\n    0x00004EA5, 0x000500C5, 0x0000000C, 0x000043B6, 0x0000254A, 0x00002B21,\n    0x000500C4, 0x0000000C, 0x00005E63, 0x000043B6, 0x00000A13, 0x000500C3,\n    0x0000000C, 0x000031DE, 0x000045F3, 0x00000A17, 0x000500C7, 0x0000000C,\n    0x00005447, 0x000031DE, 0x00000A0E, 0x000500C3, 0x0000000C, 0x000028A6,\n    0x00006242, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000511E, 0x000028A6,\n    0x00000A14, 0x000500C3, 0x0000000C, 0x000028B9, 0x000045F3, 0x00000A14,\n    0x000500C7, 0x0000000C, 0x0000505E, 0x000028B9, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x0000541D, 0x0000505E, 0x00000A0E, 0x000500C6, 0x0000000C,\n    0x000022BA, 0x0000511E, 0x0000541D, 0x000500C7, 0x0000000C, 0x00005076,\n    0x000045F3, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005228, 0x00005076,\n    0x00000A17, 0x000500C4, 0x0000000C, 0x00001997, 0x000022BA, 0x00000A1D,\n    0x000500C5, 0x0000000C, 0x000047FE, 0x00005228, 0x00001997, 0x000500C4,\n    0x0000000C, 0x00001C00, 0x00005447, 0x00000A2C, 0x000500C5, 0x0000000C,\n    0x00003C81, 0x000047FE, 0x00001C00, 0x000500C7, 0x0000000C, 0x000050AF,\n    0x00005E63, 0x00000A38, 0x000500C5, 0x0000000C, 0x00003C70, 0x00003C81,\n    0x000050AF, 0x000500C3, 0x0000000C, 0x00003745, 0x00005E63, 0x00000A17,\n    0x000500C7, 0x0000000C, 0x000018B8, 0x00003745, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x0000547E, 0x000018B8, 0x00000A1A, 0x000500C5, 0x0000000C,\n    0x000045A8, 0x00003C70, 0x0000547E, 0x000500C3, 0x0000000C, 0x00003A6E,\n    0x00005E63, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018B9, 0x00003A6E,\n    0x00000A20, 0x000500C4, 0x0000000C, 0x0000547F, 0x000018B9, 0x00000A23,\n    0x000500C5, 0x0000000C, 0x0000456F, 0x000045A8, 0x0000547F, 0x000500C3,\n    0x0000000C, 0x00003C88, 0x00005E63, 0x00000A23, 0x000500C4, 0x0000000C,\n    0x00002824, 0x00003C88, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B79,\n    0x0000456F, 0x00002824, 0x0004007C, 0x0000000B, 0x000041E5, 0x00003B79,\n    0x000200F9, 0x000052F5, 0x000200F8, 0x0000294E, 0x00050051, 0x0000000B,\n    0x00004D9A, 0x000032A7, 0x00000000, 0x00050051, 0x0000000B, 0x00002C03,\n    0x000032A7, 0x00000001, 0x00060050, 0x00000014, 0x000020DF, 0x00004D9A,\n    0x00002C03, 0x00005F72, 0x0004007C, 0x00000016, 0x00004E9D, 0x000020DF,\n    0x00050051, 0x0000000C, 0x00002BF7, 0x00004E9D, 0x00000002, 0x000500C3,\n    0x0000000C, 0x00004DC1, 0x00002BF7, 0x00000A11, 0x0004007C, 0x0000000C,\n    0x0000578D, 0x00006273, 0x00050084, 0x0000000C, 0x00001F03, 0x00004DC1,\n    0x0000578D, 0x00050051, 0x0000000C, 0x00006243, 0x00004E9D, 0x00000001,\n    0x000500C3, 0x0000000C, 0x00004A6F, 0x00006243, 0x00000A17, 0x00050080,\n    0x0000000C, 0x00002B2D, 0x00001F03, 0x00004A6F, 0x0004007C, 0x0000000C,\n    0x00004202, 0x000020FC, 0x00050084, 0x0000000C, 0x00003A60, 0x00002B2D,\n    0x00004202, 0x00050051, 0x0000000C, 0x00006244, 0x00004E9D, 0x00000000,\n    0x000500C3, 0x0000000C, 0x00004FC8, 0x00006244, 0x00000A1A, 0x00050080,\n    0x0000000C, 0x000049FC, 0x00003A60, 0x00004FC8, 0x000500C4, 0x0000000C,\n    0x0000225D, 0x000049FC, 0x00000A20, 0x000500C7, 0x0000000C, 0x00002CAA,\n    0x00002BF7, 0x00000A14, 0x000500C4, 0x0000000C, 0x00004CAE, 0x00002CAA,\n    0x00000A1A, 0x000500C3, 0x0000000C, 0x0000383E, 0x00006243, 0x00000A0E,\n    0x000500C7, 0x0000000C, 0x00005374, 0x0000383E, 0x00000A14, 0x000500C4,\n    0x0000000C, 0x000054CA, 0x00005374, 0x00000A14, 0x000500C5, 0x0000000C,\n    0x000042CE, 0x00004CAE, 0x000054CA, 0x000500C7, 0x0000000C, 0x000050D5,\n    0x00006244, 0x00000A20, 0x000500C5, 0x0000000C, 0x00003ADD, 0x000042CE,\n    0x000050D5, 0x000500C5, 0x0000000C, 0x000043B7, 0x0000225D, 0x00003ADD,\n    0x000500C4, 0x0000000C, 0x00005E50, 0x000043B7, 0x00000A13, 0x000500C3,\n    0x0000000C, 0x000032D7, 0x00006243, 0x00000A14, 0x000500C6, 0x0000000C,\n    0x000026C9, 0x000032D7, 0x00004DC1, 0x000500C7, 0x0000000C, 0x00004199,\n    0x000026C9, 0x00000A0E, 0x000500C3, 0x0000000C, 0x00002590, 0x00006244,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x0000505F, 0x00002590, 0x00000A14,\n    0x000500C4, 0x0000000C, 0x0000541E, 0x00004199, 0x00000A0E, 0x000500C6,\n    0x0000000C, 0x000022BB, 0x0000505F, 0x0000541E, 0x000500C7, 0x0000000C,\n    0x00005077, 0x00006243, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005229,\n    0x00005077, 0x00000A17, 0x000500C4, 0x0000000C, 0x00001998, 0x000022BB,\n    0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FF, 0x00005229, 0x00001998,\n    0x000500C4, 0x0000000C, 0x00001C01, 0x00004199, 0x00000A2C, 0x000500C5,\n    0x0000000C, 0x00003C82, 0x000047FF, 0x00001C01, 0x000500C7, 0x0000000C,\n    0x000050B0, 0x00005E50, 0x00000A38, 0x000500C5, 0x0000000C, 0x00003C71,\n    0x00003C82, 0x000050B0, 0x000500C3, 0x0000000C, 0x00003746, 0x00005E50,\n    0x00000A17, 0x000500C7, 0x0000000C, 0x000018BA, 0x00003746, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x00005480, 0x000018BA, 0x00000A1A, 0x000500C5,\n    0x0000000C, 0x000045A9, 0x00003C71, 0x00005480, 0x000500C3, 0x0000000C,\n    0x00003A6F, 0x00005E50, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018BB,\n    0x00003A6F, 0x00000A20, 0x000500C4, 0x0000000C, 0x00005481, 0x000018BB,\n    0x00000A23, 0x000500C5, 0x0000000C, 0x00004570, 0x000045A9, 0x00005481,\n    0x000500C3, 0x0000000C, 0x00003C89, 0x00005E50, 0x00000A23, 0x000500C4,\n    0x0000000C, 0x00002826, 0x00003C89, 0x00000A2F, 0x000500C5, 0x0000000C,\n    0x00003B7A, 0x00004570, 0x00002826, 0x0004007C, 0x0000000B, 0x000041E6,\n    0x00003B7A, 0x000200F9, 0x000052F5, 0x000200F8, 0x000052F5, 0x000700F5,\n    0x0000000B, 0x00002C70, 0x000041E6, 0x0000294E, 0x000041E5, 0x0000537D,\n    0x00050080, 0x0000000B, 0x00005088, 0x00002C70, 0x000062B6, 0x000500C2,\n    0x0000000B, 0x00004EAA, 0x00005088, 0x00000A17, 0x000500AA, 0x00000009,\n    0x00004B9C, 0x00004ADC, 0x00000A16, 0x000300F7, 0x000039BC, 0x00000000,\n    0x000400FA, 0x00004B9C, 0x000033DF, 0x000039BC, 0x000200F8, 0x000033DF,\n    0x0009004F, 0x00000017, 0x00001F16, 0x0000305F, 0x0000305F, 0x00000001,\n    0x00000000, 0x00000003, 0x00000002, 0x000200F9, 0x000039BC, 0x000200F8,\n    0x000039BC, 0x000700F5, 0x00000017, 0x00005972, 0x0000305F, 0x000052F5,\n    0x00001F16, 0x000033DF, 0x000600A9, 0x0000000B, 0x000019CD, 0x00004B9C,\n    0x00000A10, 0x00004ADC, 0x000500AA, 0x00000009, 0x00003464, 0x000019CD,\n    0x00000A0D, 0x000500AA, 0x00000009, 0x000047C2, 0x000019CD, 0x00000A10,\n    0x000500A6, 0x00000009, 0x00005686, 0x00003464, 0x000047C2, 0x000300F7,\n    0x00003463, 0x00000000, 0x000400FA, 0x00005686, 0x00002957, 0x00003463,\n    0x000200F8, 0x00002957, 0x000500C7, 0x00000017, 0x0000475F, 0x00005972,\n    0x000009CE, 0x000500C4, 0x00000017, 0x000024D1, 0x0000475F, 0x0000013D,\n    0x000500C7, 0x00000017, 0x000050AC, 0x00005972, 0x0000072E, 0x000500C2,\n    0x00000017, 0x0000448D, 0x000050AC, 0x0000013D, 0x000500C5, 0x00000017,\n    0x00003FF9, 0x000024D1, 0x0000448D, 0x000200F9, 0x00003463, 0x000200F8,\n    0x00003463, 0x000700F5, 0x00000017, 0x0000587A, 0x00005972, 0x000039BC,\n    0x00003FF9, 0x00002957, 0x000500AA, 0x00000009, 0x00004CB6, 0x000019CD,\n    0x00000A13, 0x000500A6, 0x00000009, 0x00003B23, 0x000047C2, 0x00004CB6,\n    0x000300F7, 0x00002C98, 0x00000000, 0x000400FA, 0x00003B23, 0x00002B38,\n    0x00002C98, 0x000200F8, 0x00002B38, 0x000500C4, 0x00000017, 0x00005E17,\n    0x0000587A, 0x000002ED, 0x000500C2, 0x00000017, 0x00003BE7, 0x0000587A,\n    0x000002ED, 0x000500C5, 0x00000017, 0x000029E8, 0x00005E17, 0x00003BE7,\n    0x000200F9, 0x00002C98, 0x000200F8, 0x00002C98, 0x000700F5, 0x00000017,\n    0x00004D37, 0x0000587A, 0x00003463, 0x000029E8, 0x00002B38, 0x00060041,\n    0x00000294, 0x000060F9, 0x00001592, 0x00000A0B, 0x00004EAA, 0x0003003E,\n    0x000060F9, 0x00004D37, 0x00050080, 0x0000000B, 0x00002DDB, 0x00005088,\n    0x00000A6A, 0x000500C2, 0x0000000B, 0x000041F1, 0x00002DDB, 0x00000A17,\n    0x000300F7, 0x00003F86, 0x00000000, 0x000400FA, 0x00004B9C, 0x000033E0,\n    0x00003F86, 0x000200F8, 0x000033E0, 0x0009004F, 0x00000017, 0x00001F17,\n    0x00002616, 0x00002616, 0x00000001, 0x00000000, 0x00000003, 0x00000002,\n    0x000200F9, 0x00003F86, 0x000200F8, 0x00003F86, 0x000700F5, 0x00000017,\n    0x00002ACB, 0x00002616, 0x00002C98, 0x00001F17, 0x000033E0, 0x000300F7,\n    0x00003A1A, 0x00000000, 0x000400FA, 0x00005686, 0x00002958, 0x00003A1A,\n    0x000200F8, 0x00002958, 0x000500C7, 0x00000017, 0x00004760, 0x00002ACB,\n    0x000009CE, 0x000500C4, 0x00000017, 0x000024D2, 0x00004760, 0x0000013D,\n    0x000500C7, 0x00000017, 0x000050AD, 0x00002ACB, 0x0000072E, 0x000500C2,\n    0x00000017, 0x0000448E, 0x000050AD, 0x0000013D, 0x000500C5, 0x00000017,\n    0x00003FFA, 0x000024D2, 0x0000448E, 0x000200F9, 0x00003A1A, 0x000200F8,\n    0x00003A1A, 0x000700F5, 0x00000017, 0x00002ACC, 0x00002ACB, 0x00003F86,\n    0x00003FFA, 0x00002958, 0x000300F7, 0x00002C99, 0x00000000, 0x000400FA,\n    0x00003B23, 0x00002B39, 0x00002C99, 0x000200F8, 0x00002B39, 0x000500C4,\n    0x00000017, 0x00005E18, 0x00002ACC, 0x000002ED, 0x000500C2, 0x00000017,\n    0x00003BE8, 0x00002ACC, 0x000002ED, 0x000500C5, 0x00000017, 0x000029E9,\n    0x00005E18, 0x00003BE8, 0x000200F9, 0x00002C99, 0x000200F8, 0x00002C99,\n    0x000700F5, 0x00000017, 0x00004D38, 0x00002ACC, 0x00003A1A, 0x000029E9,\n    0x00002B39, 0x00060041, 0x00000294, 0x00001F76, 0x00001592, 0x00000A0B,\n    0x000041F1, 0x0003003E, 0x00001F76, 0x00004D38, 0x000200F9, 0x00004C7A,\n    0x000200F8, 0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/resolve_full_64bpp_scaled_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25245\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 8 8 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_resolve_edram_info\"\n               OpMemberName %push_const_block_xe 1 \"xe_resolve_coordinate_info\"\n               OpMemberName %push_const_block_xe 2 \"xe_resolve_dest_info\"\n               OpMemberName %push_const_block_xe 3 \"xe_resolve_dest_coordinate_info\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %xe_resolve_edram_xe_block \"xe_resolve_edram_xe_block\"\n               OpMemberName %xe_resolve_edram_xe_block 0 \"data\"\n               OpName %xe_resolve_edram \"xe_resolve_edram\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_resolve_dest_xe_block \"xe_resolve_dest_xe_block\"\n               OpMemberName %xe_resolve_dest_xe_block 0 \"data\"\n               OpName %xe_resolve_dest \"xe_resolve_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpDecorate %_runtimearr_uint ArrayStride 4\n               OpDecorate %xe_resolve_edram_xe_block BufferBlock\n               OpMemberDecorate %xe_resolve_edram_xe_block 0 NonWritable\n               OpMemberDecorate %xe_resolve_edram_xe_block 0 Offset 0\n               OpDecorate %xe_resolve_edram NonWritable\n               OpDecorate %xe_resolve_edram Binding 0\n               OpDecorate %xe_resolve_edram DescriptorSet 0\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_resolve_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_resolve_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_resolve_dest_xe_block 0 Offset 0\n               OpDecorate %xe_resolve_dest NonReadable\n               OpDecorate %xe_resolve_dest Binding 0\n               OpDecorate %xe_resolve_dest DescriptorSet 1\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n     %v3uint = OpTypeVector %uint 3\n     %v4uint = OpTypeVector %uint 4\n      %float = OpTypeFloat 32\n    %v2float = OpTypeVector %float 2\n    %v4float = OpTypeVector %float 4\n       %bool = OpTypeBool\n      %v3int = OpTypeVector %int 3\n    %float_0 = OpConstant %float 0\n    %float_1 = OpConstant %float 1\n     %uint_1 = OpConstant %uint 1\n     %uint_2 = OpConstant %uint 2\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n     %uint_3 = OpConstant %uint 3\n    %uint_16 = OpConstant %uint 16\n     %uint_4 = OpConstant %uint 4\n%float_65535 = OpConstant %float 65535\n  %float_0_5 = OpConstant %float 0.5\n     %int_16 = OpConstant %int 16\n     %uint_0 = OpConstant %uint 0\n    %uint_24 = OpConstant %uint 24\n        %653 = OpConstantComposite %v4uint %uint_0 %uint_8 %uint_16 %uint_24\n   %uint_255 = OpConstant %uint 255\n%float_0_00392156886 = OpConstant %float 0.00392156886\n    %uint_10 = OpConstant %uint 10\n    %uint_20 = OpConstant %uint 20\n    %uint_30 = OpConstant %uint 30\n        %845 = OpConstantComposite %v4uint %uint_0 %uint_10 %uint_20 %uint_30\n  %uint_1023 = OpConstant %uint 1023\n        %635 = OpConstantComposite %v4uint %uint_1023 %uint_1023 %uint_1023 %uint_3\n%float_0_000977517106 = OpConstant %float 0.000977517106\n%float_0_333333343 = OpConstant %float 0.333333343\n       %2798 = OpConstantComposite %v4float %float_0_000977517106 %float_0_000977517106 %float_0_000977517106 %float_0_333333343\n       %2996 = OpConstantComposite %v3uint %uint_0 %uint_10 %uint_20\n   %uint_127 = OpConstant %uint 127\n     %uint_7 = OpConstant %uint 7\n     %v3bool = OpTypeVector %bool 3\n   %uint_124 = OpConstant %uint 124\n    %uint_23 = OpConstant %uint 23\n    %v3float = OpTypeVector %float 3\n   %float_n1 = OpConstant %float -1\n      %int_0 = OpConstant %int 0\n       %1959 = OpConstantComposite %v2int %int_16 %int_0\n%float_0_000976592302 = OpConstant %float 0.000976592302\n      %v4int = OpTypeVector %int 4\n        %290 = OpConstantComposite %v4int %int_16 %int_0 %int_16 %int_0\n       %1837 = OpConstantComposite %v2uint %uint_2 %uint_1\n     %v2bool = OpTypeVector %bool 2\n       %1807 = OpConstantComposite %v2uint %uint_0 %uint_0\n       %1828 = OpConstantComposite %v2uint %uint_1 %uint_1\n       %1816 = OpConstantComposite %v2uint %uint_1 %uint_0\n    %uint_80 = OpConstant %uint 80\n       %2719 = OpConstantComposite %v2uint %uint_80 %uint_16\n  %uint_2048 = OpConstant %uint 2048\n      %int_2 = OpConstant %int 2\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n      %int_3 = OpConstant %int 3\n     %uint_5 = OpConstant %uint 5\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n    %uint_13 = OpConstant %uint 13\n  %uint_2047 = OpConstant %uint 2047\n    %uint_15 = OpConstant %uint 15\n    %uint_28 = OpConstant %uint 28\n    %uint_19 = OpConstant %uint 19\n       %2179 = OpConstantComposite %v2uint %uint_16 %uint_19\n%uint_536870912 = OpConstant %uint 536870912\n       %1855 = OpConstantComposite %v2uint %uint_0 %uint_4\n     %int_10 = OpConstant %int 10\n    %uint_63 = OpConstant %uint 63\n     %int_26 = OpConstant %int 26\n     %int_23 = OpConstant %int 23\n%uint_16777216 = OpConstant %uint 16777216\n       %2275 = OpConstantComposite %v2uint %uint_20 %uint_24\n%_runtimearr_uint = OpTypeRuntimeArray %uint\n%xe_resolve_edram_xe_block = OpTypeStruct %_runtimearr_uint\n%_ptr_Uniform_xe_resolve_edram_xe_block = OpTypePointer Uniform %xe_resolve_edram_xe_block\n%xe_resolve_edram = OpVariable %_ptr_Uniform_xe_resolve_edram_xe_block Uniform\n%_ptr_Uniform_uint = OpTypePointer Uniform %uint\n   %uint_320 = OpConstant %uint 320\n     %uint_6 = OpConstant %uint 6\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %1825 = OpConstantComposite %v2uint %uint_2 %uint_0\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_resolve_dest_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_resolve_dest_xe_block = OpTypePointer Uniform %xe_resolve_dest_xe_block\n%xe_resolve_dest = OpVariable %_ptr_Uniform_xe_resolve_dest_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_8 %uint_8 %uint_1\n       %1954 = OpConstantComposite %v2uint %uint_7 %uint_7\n       %1955 = OpConstantComposite %v2uint %uint_15 %uint_1\n       %1870 = OpConstantComposite %v2uint %uint_3 %uint_3\n       %2122 = OpConstantComposite %v2uint %uint_15 %uint_15\n       %1284 = OpConstantComposite %v4float %float_n1 %float_n1 %float_n1 %float_n1\n        %770 = OpConstantComposite %v4int %int_16 %int_16 %int_16 %int_16\n       %1611 = OpConstantComposite %v4uint %uint_255 %uint_255 %uint_255 %uint_255\n        %261 = OpConstantComposite %v3uint %uint_1023 %uint_1023 %uint_1023\n       %1126 = OpConstantComposite %v3uint %uint_127 %uint_127 %uint_127\n       %2828 = OpConstantComposite %v3uint %uint_7 %uint_7 %uint_7\n       %2578 = OpConstantComposite %v3uint %uint_0 %uint_0 %uint_0\n       %1018 = OpConstantComposite %v3uint %uint_124 %uint_124 %uint_124\n        %393 = OpConstantComposite %v3uint %uint_23 %uint_23 %uint_23\n        %141 = OpConstantComposite %v3uint %uint_16 %uint_16 %uint_16\n         %73 = OpConstantComposite %v2float %float_n1 %float_n1\n       %2151 = OpConstantComposite %v2int %int_16 %int_16\n       %2938 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0\n       %1285 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1\n        %325 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_0_5\n       %1846 = OpConstantComposite %v2uint %uint_3 %uint_1\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n%int_1065353216 = OpConstant %int 1065353216\n%uint_4294967290 = OpConstant %uint 4294967290\n       %2360 = OpConstantComposite %v3uint %uint_4294967290 %uint_4294967290 %uint_4294967290\n %float_0_25 = OpConstant %float 0.25\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %22245 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %15627 = OpLoad %uint %22245\n      %22700 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %20824 = OpLoad %uint %22700\n      %20561 = OpBitwiseAnd %uint %15627 %uint_1023\n      %19978 = OpShiftRightLogical %uint %15627 %uint_10\n       %8574 = OpBitwiseAnd %uint %19978 %uint_3\n      %21002 = OpShiftRightLogical %uint %15627 %uint_13\n       %8575 = OpBitwiseAnd %uint %21002 %uint_2047\n      %21003 = OpShiftRightLogical %uint %15627 %uint_24\n       %8576 = OpBitwiseAnd %uint %21003 %uint_15\n      %18836 = OpShiftRightLogical %uint %15627 %uint_28\n       %9130 = OpBitwiseAnd %uint %18836 %uint_1\n       %8871 = OpCompositeConstruct %v2uint %20824 %20824\n       %9633 = OpShiftRightLogical %v2uint %8871 %2179\n      %23601 = OpBitwiseAnd %v2uint %9633 %1954\n      %24030 = OpBitwiseAnd %uint %15627 %uint_536870912\n      %12295 = OpINotEqual %bool %24030 %uint_0\n               OpSelectionMerge %14676 None\n               OpBranchConditional %12295 %16739 %21992\n      %21992 = OpLabel\n               OpBranch %14676\n      %16739 = OpLabel\n      %15278 = OpShiftRightLogical %v2uint %23601 %1828\n               OpBranch %14676\n      %14676 = OpLabel\n      %19124 = OpPhi %v2uint %15278 %16739 %1807 %21992\n       %7038 = OpShiftRightLogical %v2uint %8871 %1855\n      %11769 = OpBitwiseAnd %v2uint %7038 %1955\n      %16207 = OpShiftLeftLogical %v2uint %11769 %1870\n      %23019 = OpIMul %v2uint %16207 %23601\n      %13123 = OpShiftRightLogical %uint %20824 %uint_5\n      %14785 = OpBitwiseAnd %uint %13123 %uint_2047\n       %8858 = OpCompositeExtract %uint %23601 0\n      %22993 = OpIMul %uint %14785 %8858\n      %20036 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %18628 = OpLoad %uint %20036\n      %22701 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %20919 = OpLoad %uint %22701\n      %19164 = OpBitwiseAnd %uint %18628 %uint_7\n      %21999 = OpBitwiseAnd %uint %18628 %uint_8\n      %20495 = OpINotEqual %bool %21999 %uint_0\n      %10307 = OpShiftRightLogical %uint %18628 %uint_4\n      %24434 = OpBitwiseAnd %uint %10307 %uint_7\n      %19672 = OpShiftRightLogical %uint %18628 %uint_7\n      %20627 = OpBitwiseAnd %uint %19672 %uint_63\n      %22920 = OpBitcast %int %18628\n      %13711 = OpShiftLeftLogical %int %22920 %int_10\n      %20636 = OpShiftRightArithmetic %int %13711 %int_26\n      %18178 = OpShiftLeftLogical %int %20636 %int_23\n       %7462 = OpIAdd %int %18178 %int_1065353216\n      %11052 = OpBitcast %float %7462\n      %22649 = OpBitwiseAnd %uint %18628 %uint_16777216\n       %7475 = OpINotEqual %bool %22649 %uint_0\n       %8444 = OpBitwiseAnd %uint %20919 %uint_1023\n      %12176 = OpShiftRightLogical %uint %20919 %uint_10\n      %25038 = OpBitwiseAnd %uint %12176 %uint_1023\n      %25203 = OpShiftLeftLogical %uint %25038 %int_1\n      %10422 = OpCompositeConstruct %v2uint %20919 %20919\n      %10385 = OpShiftRightLogical %v2uint %10422 %2275\n      %23379 = OpBitwiseAnd %v2uint %10385 %2122\n      %16208 = OpShiftLeftLogical %v2uint %23379 %1870\n      %23020 = OpIMul %v2uint %16208 %23601\n      %12743 = OpShiftRightLogical %uint %20919 %uint_28\n      %17238 = OpBitwiseAnd %uint %12743 %uint_7\n      %12737 = OpLoad %v3uint %gl_GlobalInvocationID\n      %14500 = OpVectorShuffle %v2uint %12737 %12737 0 1\n      %12025 = OpShiftLeftLogical %v2uint %14500 %1825\n       %7640 = OpCompositeExtract %uint %12025 0\n      %11658 = OpShiftLeftLogical %uint %22993 %uint_3\n      %15379 = OpUGreaterThanEqual %bool %7640 %11658\n               OpSelectionMerge %14025 DontFlatten\n               OpBranchConditional %15379 %21993 %14025\n      %21993 = OpLabel\n               OpBranch %19578\n      %14025 = OpLabel\n      %18615 = OpCompositeExtract %uint %12025 1\n      %16803 = OpCompositeExtract %uint %19124 1\n      %24446 = OpExtInst %uint %1 UMax %18615 %16803\n      %20975 = OpCompositeConstruct %v2uint %7640 %24446\n      %21036 = OpIAdd %v2uint %20975 %23019\n      %16075 = OpULessThanEqual %bool %17238 %uint_3\n               OpSelectionMerge %23776 None\n               OpBranchConditional %16075 %10990 %15087\n      %15087 = OpLabel\n      %13566 = OpIEqual %bool %17238 %uint_5\n       %8438 = OpSelect %uint %13566 %uint_2 %uint_0\n               OpBranch %23776\n      %10990 = OpLabel\n               OpBranch %23776\n      %23776 = OpLabel\n      %19300 = OpPhi %uint %17238 %10990 %8438 %15087\n      %16830 = OpCompositeConstruct %v2uint %8574 %8574\n      %11801 = OpUGreaterThanEqual %v2bool %16830 %1837\n      %19381 = OpSelect %v2uint %11801 %1828 %1807\n      %10986 = OpShiftLeftLogical %v2uint %21036 %19381\n      %24669 = OpCompositeConstruct %v2uint %19300 %19300\n       %9093 = OpShiftRightLogical %v2uint %24669 %1816\n      %16072 = OpBitwiseAnd %v2uint %9093 %1828\n      %18106 = OpIAdd %v2uint %10986 %16072\n      %22936 = OpIMul %v2uint %2719 %23601\n      %11332 = OpCompositeConstruct %v2uint %9130 %uint_0\n       %6571 = OpShiftRightLogical %v2uint %22936 %11332\n      %10146 = OpUDiv %v2uint %18106 %6571\n      %20390 = OpCompositeExtract %uint %10146 1\n      %11046 = OpIMul %uint %20390 %20561\n      %24665 = OpCompositeExtract %uint %10146 0\n      %21536 = OpIAdd %uint %11046 %24665\n       %8742 = OpIAdd %uint %8575 %21536\n      %22376 = OpIMul %v2uint %10146 %6571\n      %20715 = OpISub %v2uint %18106 %22376\n       %7303 = OpCompositeExtract %uint %22936 0\n      %22882 = OpCompositeExtract %uint %22936 1\n      %13170 = OpIMul %uint %7303 %22882\n      %14551 = OpIMul %uint %8742 %13170\n       %6805 = OpCompositeExtract %uint %20715 1\n      %23526 = OpCompositeExtract %uint %6571 0\n      %22886 = OpIMul %uint %6805 %23526\n       %6886 = OpCompositeExtract %uint %20715 0\n       %9696 = OpIAdd %uint %22886 %6886\n      %18021 = OpShiftLeftLogical %uint %9696 %9130\n      %18363 = OpIAdd %uint %14551 %18021\n      %13922 = OpIMul %uint %13170 %uint_2048\n      %21520 = OpUMod %uint %18363 %13922\n       %7686 = OpShiftLeftLogical %uint %21520 %int_2\n      %13906 = OpUGreaterThanEqual %bool %8574 %uint_2\n      %11277 = OpSelect %uint %13906 %uint_1 %uint_0\n      %20074 = OpIAdd %uint %9130 %11277\n       %6555 = OpShiftLeftLogical %uint %uint_4 %20074\n      %23279 = OpINotEqual %bool %9130 %uint_0\n               OpSelectionMerge %21263 DontFlatten\n               OpBranchConditional %23279 %15205 %16569\n      %16569 = OpLabel\n      %19162 = OpIEqual %bool %6555 %uint_4\n               OpSelectionMerge %20297 DontFlatten\n               OpBranchConditional %19162 %6591 %8959\n       %8959 = OpLabel\n      %22064 = OpShiftRightLogical %uint %7686 %int_2\n      %13369 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22064\n      %15060 = OpLoad %uint %13369\n       %8517 = OpIAdd %uint %7686 %6555\n      %21670 = OpShiftRightLogical %uint %8517 %int_2\n      %19677 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21670\n      %13114 = OpLoad %uint %19677\n       %8685 = OpIMul %uint %uint_2 %6555\n      %24254 = OpIAdd %uint %7686 %8685\n      %17890 = OpShiftRightLogical %uint %24254 %int_2\n      %19678 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17890\n      %13115 = OpLoad %uint %19678\n       %8686 = OpIMul %uint %uint_3 %6555\n      %24255 = OpIAdd %uint %7686 %8686\n      %17891 = OpShiftRightLogical %uint %24255 %int_2\n      %18689 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17891\n      %24409 = OpLoad %uint %18689\n      %20780 = OpCompositeConstruct %v4uint %15060 %13114 %13115 %24409\n               OpBranch %20297\n       %6591 = OpLabel\n      %24486 = OpShiftRightLogical %uint %7686 %int_2\n      %13370 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24486\n      %12609 = OpLoad %uint %13370\n      %11687 = OpIAdd %uint %24486 %uint_1\n       %6399 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11687\n      %23650 = OpLoad %uint %6399\n      %11688 = OpIAdd %uint %24486 %uint_2\n       %6400 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11688\n      %23651 = OpLoad %uint %6400\n      %11689 = OpIAdd %uint %24486 %uint_3\n      %24558 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11689\n      %16379 = OpLoad %uint %24558\n      %20781 = OpCompositeConstruct %v4uint %12609 %23650 %23651 %16379\n               OpBranch %20297\n      %20297 = OpLabel\n      %10943 = OpPhi %v4uint %20781 %6591 %20780 %8959\n               OpSelectionMerge %16224 None\n               OpSwitch %8576 %19451 0 %14585 1 %14585 2 %7355 10 %7355 3 %7354 12 %7354 4 %8190 6 %8243\n       %8243 = OpLabel\n      %24406 = OpCompositeExtract %uint %10943 0\n      %24679 = OpExtInst %v2float %1 UnpackHalf2x16 %24406\n      %10082 = OpCompositeExtract %float %24679 0\n      %17478 = OpCompositeExtract %float %24679 1\n      %14604 = OpCompositeConstruct %v4float %10082 %17478 %float_0 %float_0\n      %17274 = OpCompositeExtract %uint %10943 1\n      %18027 = OpExtInst %v2float %1 UnpackHalf2x16 %17274\n      %10083 = OpCompositeExtract %float %18027 0\n      %17479 = OpCompositeExtract %float %18027 1\n      %14605 = OpCompositeConstruct %v4float %10083 %17479 %float_0 %float_0\n      %17275 = OpCompositeExtract %uint %10943 2\n      %18028 = OpExtInst %v2float %1 UnpackHalf2x16 %17275\n      %10084 = OpCompositeExtract %float %18028 0\n      %17480 = OpCompositeExtract %float %18028 1\n      %14606 = OpCompositeConstruct %v4float %10084 %17480 %float_0 %float_0\n      %17276 = OpCompositeExtract %uint %10943 3\n      %18029 = OpExtInst %v2float %1 UnpackHalf2x16 %17276\n      %10085 = OpCompositeExtract %float %18029 0\n      %20670 = OpCompositeExtract %float %18029 1\n       %9033 = OpCompositeConstruct %v4float %10085 %20670 %float_0 %float_0\n               OpBranch %16224\n       %8190 = OpLabel\n      %12427 = OpCompositeExtract %uint %10943 0\n      %22685 = OpBitcast %int %12427\n      %18202 = OpCompositeConstruct %v2int %22685 %22685\n      %18349 = OpShiftLeftLogical %v2int %18202 %1959\n      %13335 = OpShiftRightArithmetic %v2int %18349 %2151\n      %10903 = OpConvertSToF %v2float %13335\n      %18247 = OpVectorTimesScalar %v2float %10903 %float_0_000976592302\n      %24070 = OpExtInst %v2float %1 FMax %73 %18247\n      %24330 = OpCompositeExtract %float %24070 0\n      %15572 = OpCompositeExtract %float %24070 1\n      %16670 = OpCompositeConstruct %v4float %24330 %15572 %float_0 %float_0\n      %19522 = OpCompositeExtract %uint %10943 1\n      %16033 = OpBitcast %int %19522\n      %18203 = OpCompositeConstruct %v2int %16033 %16033\n      %18350 = OpShiftLeftLogical %v2int %18203 %1959\n      %13336 = OpShiftRightArithmetic %v2int %18350 %2151\n      %10904 = OpConvertSToF %v2float %13336\n      %18248 = OpVectorTimesScalar %v2float %10904 %float_0_000976592302\n      %24071 = OpExtInst %v2float %1 FMax %73 %18248\n      %24331 = OpCompositeExtract %float %24071 0\n      %15573 = OpCompositeExtract %float %24071 1\n      %16671 = OpCompositeConstruct %v4float %24331 %15573 %float_0 %float_0\n      %19523 = OpCompositeExtract %uint %10943 2\n      %16034 = OpBitcast %int %19523\n      %18204 = OpCompositeConstruct %v2int %16034 %16034\n      %18351 = OpShiftLeftLogical %v2int %18204 %1959\n      %13337 = OpShiftRightArithmetic %v2int %18351 %2151\n      %10905 = OpConvertSToF %v2float %13337\n      %18249 = OpVectorTimesScalar %v2float %10905 %float_0_000976592302\n      %24072 = OpExtInst %v2float %1 FMax %73 %18249\n      %24332 = OpCompositeExtract %float %24072 0\n      %15574 = OpCompositeExtract %float %24072 1\n      %16672 = OpCompositeConstruct %v4float %24332 %15574 %float_0 %float_0\n      %19524 = OpCompositeExtract %uint %10943 3\n      %16035 = OpBitcast %int %19524\n      %18205 = OpCompositeConstruct %v2int %16035 %16035\n      %18352 = OpShiftLeftLogical %v2int %18205 %1959\n      %13338 = OpShiftRightArithmetic %v2int %18352 %2151\n      %10906 = OpConvertSToF %v2float %13338\n      %18250 = OpVectorTimesScalar %v2float %10906 %float_0_000976592302\n      %24073 = OpExtInst %v2float %1 FMax %73 %18250\n      %24333 = OpCompositeExtract %float %24073 0\n      %18764 = OpCompositeExtract %float %24073 1\n       %9034 = OpCompositeConstruct %v4float %24333 %18764 %float_0 %float_0\n               OpBranch %16224\n       %7354 = OpLabel\n      %22205 = OpCompositeExtract %uint %10943 0\n      %20234 = OpCompositeConstruct %v3uint %22205 %22205 %22205\n      %11021 = OpShiftRightLogical %v3uint %20234 %2996\n      %24038 = OpBitwiseAnd %v3uint %11021 %261\n      %18588 = OpBitwiseAnd %v3uint %11021 %1126\n      %23440 = OpShiftRightLogical %v3uint %24038 %2828\n      %16585 = OpIEqual %v3bool %23440 %2578\n      %11339 = OpExtInst %v3int %1 FindUMsb %18588\n      %10773 = OpBitcast %v3uint %11339\n       %6266 = OpISub %v3uint %2828 %10773\n       %8720 = OpIAdd %v3uint %10773 %2360\n      %10351 = OpSelect %v3uint %16585 %8720 %23440\n      %23252 = OpShiftLeftLogical %v3uint %18588 %6266\n      %18842 = OpBitwiseAnd %v3uint %23252 %1126\n      %10909 = OpSelect %v3uint %16585 %18842 %18588\n      %24569 = OpIAdd %v3uint %10351 %1018\n      %20351 = OpShiftLeftLogical %v3uint %24569 %393\n      %16294 = OpShiftLeftLogical %v3uint %10909 %141\n      %22396 = OpBitwiseOr %v3uint %20351 %16294\n      %13824 = OpIEqual %v3bool %24038 %2578\n      %16962 = OpSelect %v3uint %13824 %2578 %22396\n      %10703 = OpBitcast %v3float %16962\n      %19364 = OpShiftRightLogical %uint %22205 %uint_30\n      %18446 = OpConvertUToF %float %19364\n      %15903 = OpFMul %float %18446 %float_0_333333343\n      %21442 = OpCompositeExtract %float %10703 0\n      %10837 = OpCompositeExtract %float %10703 1\n       %7833 = OpCompositeExtract %float %10703 2\n      %15834 = OpCompositeConstruct %v4float %21442 %10837 %7833 %15903\n      %10229 = OpCompositeExtract %uint %10943 1\n      %13582 = OpCompositeConstruct %v3uint %10229 %10229 %10229\n      %11022 = OpShiftRightLogical %v3uint %13582 %2996\n      %24039 = OpBitwiseAnd %v3uint %11022 %261\n      %18589 = OpBitwiseAnd %v3uint %11022 %1126\n      %23441 = OpShiftRightLogical %v3uint %24039 %2828\n      %16586 = OpIEqual %v3bool %23441 %2578\n      %11340 = OpExtInst %v3int %1 FindUMsb %18589\n      %10774 = OpBitcast %v3uint %11340\n       %6267 = OpISub %v3uint %2828 %10774\n       %8721 = OpIAdd %v3uint %10774 %2360\n      %10352 = OpSelect %v3uint %16586 %8721 %23441\n      %23253 = OpShiftLeftLogical %v3uint %18589 %6267\n      %18843 = OpBitwiseAnd %v3uint %23253 %1126\n      %10910 = OpSelect %v3uint %16586 %18843 %18589\n      %24570 = OpIAdd %v3uint %10352 %1018\n      %20352 = OpShiftLeftLogical %v3uint %24570 %393\n      %16295 = OpShiftLeftLogical %v3uint %10910 %141\n      %22397 = OpBitwiseOr %v3uint %20352 %16295\n      %13825 = OpIEqual %v3bool %24039 %2578\n      %16963 = OpSelect %v3uint %13825 %2578 %22397\n      %10704 = OpBitcast %v3float %16963\n      %19365 = OpShiftRightLogical %uint %10229 %uint_30\n      %18447 = OpConvertUToF %float %19365\n      %15904 = OpFMul %float %18447 %float_0_333333343\n      %21443 = OpCompositeExtract %float %10704 0\n      %10838 = OpCompositeExtract %float %10704 1\n       %7834 = OpCompositeExtract %float %10704 2\n      %15835 = OpCompositeConstruct %v4float %21443 %10838 %7834 %15904\n      %10230 = OpCompositeExtract %uint %10943 2\n      %13583 = OpCompositeConstruct %v3uint %10230 %10230 %10230\n      %11023 = OpShiftRightLogical %v3uint %13583 %2996\n      %24040 = OpBitwiseAnd %v3uint %11023 %261\n      %18590 = OpBitwiseAnd %v3uint %11023 %1126\n      %23442 = OpShiftRightLogical %v3uint %24040 %2828\n      %16587 = OpIEqual %v3bool %23442 %2578\n      %11341 = OpExtInst %v3int %1 FindUMsb %18590\n      %10775 = OpBitcast %v3uint %11341\n       %6268 = OpISub %v3uint %2828 %10775\n       %8722 = OpIAdd %v3uint %10775 %2360\n      %10353 = OpSelect %v3uint %16587 %8722 %23442\n      %23254 = OpShiftLeftLogical %v3uint %18590 %6268\n      %18844 = OpBitwiseAnd %v3uint %23254 %1126\n      %10911 = OpSelect %v3uint %16587 %18844 %18590\n      %24571 = OpIAdd %v3uint %10353 %1018\n      %20353 = OpShiftLeftLogical %v3uint %24571 %393\n      %16296 = OpShiftLeftLogical %v3uint %10911 %141\n      %22398 = OpBitwiseOr %v3uint %20353 %16296\n      %13826 = OpIEqual %v3bool %24040 %2578\n      %16964 = OpSelect %v3uint %13826 %2578 %22398\n      %10705 = OpBitcast %v3float %16964\n      %19366 = OpShiftRightLogical %uint %10230 %uint_30\n      %18448 = OpConvertUToF %float %19366\n      %15905 = OpFMul %float %18448 %float_0_333333343\n      %21444 = OpCompositeExtract %float %10705 0\n      %10839 = OpCompositeExtract %float %10705 1\n       %7835 = OpCompositeExtract %float %10705 2\n      %15836 = OpCompositeConstruct %v4float %21444 %10839 %7835 %15905\n      %10231 = OpCompositeExtract %uint %10943 3\n      %13584 = OpCompositeConstruct %v3uint %10231 %10231 %10231\n      %11024 = OpShiftRightLogical %v3uint %13584 %2996\n      %24041 = OpBitwiseAnd %v3uint %11024 %261\n      %18591 = OpBitwiseAnd %v3uint %11024 %1126\n      %23443 = OpShiftRightLogical %v3uint %24041 %2828\n      %16588 = OpIEqual %v3bool %23443 %2578\n      %11342 = OpExtInst %v3int %1 FindUMsb %18591\n      %10776 = OpBitcast %v3uint %11342\n       %6269 = OpISub %v3uint %2828 %10776\n       %8723 = OpIAdd %v3uint %10776 %2360\n      %10354 = OpSelect %v3uint %16588 %8723 %23443\n      %23255 = OpShiftLeftLogical %v3uint %18591 %6269\n      %18845 = OpBitwiseAnd %v3uint %23255 %1126\n      %10912 = OpSelect %v3uint %16588 %18845 %18591\n      %24572 = OpIAdd %v3uint %10354 %1018\n      %20354 = OpShiftLeftLogical %v3uint %24572 %393\n      %16297 = OpShiftLeftLogical %v3uint %10912 %141\n      %22399 = OpBitwiseOr %v3uint %20354 %16297\n      %13827 = OpIEqual %v3bool %24041 %2578\n      %16965 = OpSelect %v3uint %13827 %2578 %22399\n      %10706 = OpBitcast %v3float %16965\n      %19367 = OpShiftRightLogical %uint %10231 %uint_30\n      %18449 = OpConvertUToF %float %19367\n      %15906 = OpFMul %float %18449 %float_0_333333343\n      %21445 = OpCompositeExtract %float %10706 0\n      %10840 = OpCompositeExtract %float %10706 1\n      %11025 = OpCompositeExtract %float %10706 2\n       %9035 = OpCompositeConstruct %v4float %21445 %10840 %11025 %15906\n               OpBranch %16224\n       %7355 = OpLabel\n      %22206 = OpCompositeExtract %uint %10943 0\n      %20235 = OpCompositeConstruct %v4uint %22206 %22206 %22206 %22206\n       %9368 = OpShiftRightLogical %v4uint %20235 %845\n      %18859 = OpBitwiseAnd %v4uint %9368 %635\n      %15543 = OpConvertUToF %v4float %18859\n      %16688 = OpFMul %v4float %15543 %2798\n      %23762 = OpCompositeExtract %uint %10943 1\n      %20813 = OpCompositeConstruct %v4uint %23762 %23762 %23762 %23762\n       %9369 = OpShiftRightLogical %v4uint %20813 %845\n      %18860 = OpBitwiseAnd %v4uint %9369 %635\n      %15544 = OpConvertUToF %v4float %18860\n      %16689 = OpFMul %v4float %15544 %2798\n      %23763 = OpCompositeExtract %uint %10943 2\n      %20814 = OpCompositeConstruct %v4uint %23763 %23763 %23763 %23763\n       %9370 = OpShiftRightLogical %v4uint %20814 %845\n      %18861 = OpBitwiseAnd %v4uint %9370 %635\n      %15545 = OpConvertUToF %v4float %18861\n      %16690 = OpFMul %v4float %15545 %2798\n      %23764 = OpCompositeExtract %uint %10943 3\n      %20815 = OpCompositeConstruct %v4uint %23764 %23764 %23764 %23764\n       %9371 = OpShiftRightLogical %v4uint %20815 %845\n      %18862 = OpBitwiseAnd %v4uint %9371 %635\n      %18735 = OpConvertUToF %v4float %18862\n       %9887 = OpFMul %v4float %18735 %2798\n               OpBranch %16224\n      %14585 = OpLabel\n      %22207 = OpCompositeExtract %uint %10943 0\n      %20236 = OpCompositeConstruct %v4uint %22207 %22207 %22207 %22207\n       %9372 = OpShiftRightLogical %v4uint %20236 %653\n      %19030 = OpBitwiseAnd %v4uint %9372 %1611\n      %13986 = OpConvertUToF %v4float %19030\n      %19235 = OpVectorTimesScalar %v4float %13986 %float_0_00392156886\n       %8607 = OpCompositeExtract %uint %10943 1\n      %24843 = OpCompositeConstruct %v4uint %8607 %8607 %8607 %8607\n       %9373 = OpShiftRightLogical %v4uint %24843 %653\n      %19031 = OpBitwiseAnd %v4uint %9373 %1611\n      %13987 = OpConvertUToF %v4float %19031\n      %19236 = OpVectorTimesScalar %v4float %13987 %float_0_00392156886\n       %8608 = OpCompositeExtract %uint %10943 2\n      %24844 = OpCompositeConstruct %v4uint %8608 %8608 %8608 %8608\n       %9374 = OpShiftRightLogical %v4uint %24844 %653\n      %19032 = OpBitwiseAnd %v4uint %9374 %1611\n      %13988 = OpConvertUToF %v4float %19032\n      %19237 = OpVectorTimesScalar %v4float %13988 %float_0_00392156886\n       %8609 = OpCompositeExtract %uint %10943 3\n      %24845 = OpCompositeConstruct %v4uint %8609 %8609 %8609 %8609\n       %9375 = OpShiftRightLogical %v4uint %24845 %653\n      %19033 = OpBitwiseAnd %v4uint %9375 %1611\n      %17178 = OpConvertUToF %v4float %19033\n      %12434 = OpVectorTimesScalar %v4float %17178 %float_0_00392156886\n               OpBranch %16224\n      %19451 = OpLabel\n      %12428 = OpCompositeExtract %uint %10943 0\n      %20462 = OpBitcast %float %12428\n      %17206 = OpCompositeConstruct %v2float %20462 %float_0\n      %11664 = OpVectorShuffle %v4float %17206 %17206 0 1 1 1\n      %22193 = OpCompositeExtract %uint %10943 1\n      %16232 = OpBitcast %float %22193\n      %17207 = OpCompositeConstruct %v2float %16232 %float_0\n      %11665 = OpVectorShuffle %v4float %17207 %17207 0 1 1 1\n      %22194 = OpCompositeExtract %uint %10943 2\n      %16233 = OpBitcast %float %22194\n      %17208 = OpCompositeConstruct %v2float %16233 %float_0\n      %11666 = OpVectorShuffle %v4float %17208 %17208 0 1 1 1\n      %22195 = OpCompositeExtract %uint %10943 3\n      %16234 = OpBitcast %float %22195\n      %20398 = OpCompositeConstruct %v2float %16234 %float_0\n      %23098 = OpVectorShuffle %v4float %20398 %20398 0 1 1 1\n               OpBranch %16224\n      %16224 = OpLabel\n      %11175 = OpPhi %v4float %23098 %19451 %12434 %14585 %9887 %7355 %9035 %7354 %9034 %8190 %9033 %8243\n      %14344 = OpPhi %v4float %11666 %19451 %19237 %14585 %16690 %7355 %15836 %7354 %16672 %8190 %14606 %8243\n      %15229 = OpPhi %v4float %11665 %19451 %19236 %14585 %16689 %7355 %15835 %7354 %16671 %8190 %14605 %8243\n      %14518 = OpPhi %v4float %11664 %19451 %19235 %14585 %16688 %7355 %15834 %7354 %16670 %8190 %14604 %8243\n               OpBranch %21263\n      %15205 = OpLabel\n      %21584 = OpIEqual %bool %6555 %uint_8\n               OpSelectionMerge %20259 DontFlatten\n               OpBranchConditional %21584 %6592 %8960\n       %8960 = OpLabel\n      %22065 = OpShiftRightLogical %uint %7686 %int_2\n      %13371 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22065\n      %12610 = OpLoad %uint %13371\n      %11690 = OpIAdd %uint %22065 %uint_1\n       %6401 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11690\n       %7030 = OpLoad %uint %6401\n       %8518 = OpIAdd %uint %7686 %6555\n      %21671 = OpShiftRightLogical %uint %8518 %int_2\n      %19601 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21671\n      %12611 = OpLoad %uint %19601\n      %11691 = OpIAdd %uint %21671 %uint_1\n      %24559 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11691\n      %14156 = OpLoad %uint %24559\n      %19670 = OpCompositeConstruct %v4uint %12610 %7030 %12611 %14156\n      %19499 = OpIMul %uint %uint_2 %6555\n      %10821 = OpIAdd %uint %7686 %19499\n      %17892 = OpShiftRightLogical %uint %10821 %int_2\n      %19602 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17892\n      %12612 = OpLoad %uint %19602\n      %11692 = OpIAdd %uint %17892 %uint_1\n       %6475 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11692\n      %24155 = OpLoad %uint %6475\n       %8687 = OpIMul %uint %uint_3 %6555\n      %24256 = OpIAdd %uint %7686 %8687\n      %17893 = OpShiftRightLogical %uint %24256 %int_2\n      %19603 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17893\n      %12613 = OpLoad %uint %19603\n      %11693 = OpIAdd %uint %17893 %uint_1\n      %24560 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11693\n      %16380 = OpLoad %uint %24560\n      %20782 = OpCompositeConstruct %v4uint %12612 %24155 %12613 %16380\n               OpBranch %20259\n       %6592 = OpLabel\n      %24487 = OpShiftRightLogical %uint %7686 %int_2\n      %13372 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24487\n      %12614 = OpLoad %uint %13372\n      %11694 = OpIAdd %uint %24487 %uint_1\n       %6402 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11694\n      %23652 = OpLoad %uint %6402\n      %11695 = OpIAdd %uint %24487 %uint_2\n       %6403 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11695\n      %23653 = OpLoad %uint %6403\n      %11696 = OpIAdd %uint %24487 %uint_3\n      %24561 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11696\n      %14080 = OpLoad %uint %24561\n      %21616 = OpCompositeConstruct %v4uint %12614 %23652 %23653 %14080\n      %19331 = OpIAdd %uint %7686 %uint_16\n       %8237 = OpShiftRightLogical %uint %19331 %int_2\n      %19604 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %8237\n      %12615 = OpLoad %uint %19604\n      %11697 = OpIAdd %uint %8237 %uint_1\n       %6404 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11697\n      %23654 = OpLoad %uint %6404\n      %11698 = OpIAdd %uint %8237 %uint_2\n       %6405 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11698\n      %23655 = OpLoad %uint %6405\n      %11699 = OpIAdd %uint %8237 %uint_3\n      %24562 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11699\n      %16381 = OpLoad %uint %24562\n      %20783 = OpCompositeConstruct %v4uint %12615 %23654 %23655 %16381\n               OpBranch %20259\n      %20259 = OpLabel\n      %11213 = OpPhi %v4uint %20783 %6592 %20782 %8960\n      %14112 = OpPhi %v4uint %21616 %6592 %19670 %8960\n               OpSelectionMerge %20260 None\n               OpSwitch %8576 %20310 5 %8536 7 %8244\n       %8244 = OpLabel\n      %24407 = OpCompositeExtract %uint %14112 0\n      %24680 = OpExtInst %v2float %1 UnpackHalf2x16 %24407\n      %10101 = OpCompositeExtract %float %24680 0\n      %16056 = OpCompositeExtract %float %24680 1\n      %17025 = OpCompositeExtract %uint %14112 1\n      %15605 = OpExtInst %v2float %1 UnpackHalf2x16 %17025\n      %10086 = OpCompositeExtract %float %15605 0\n      %17481 = OpCompositeExtract %float %15605 1\n      %14607 = OpCompositeConstruct %v4float %10101 %16056 %10086 %17481\n      %17277 = OpCompositeExtract %uint %14112 2\n      %18030 = OpExtInst %v2float %1 UnpackHalf2x16 %17277\n      %10102 = OpCompositeExtract %float %18030 0\n      %16057 = OpCompositeExtract %float %18030 1\n      %17026 = OpCompositeExtract %uint %14112 3\n      %15606 = OpExtInst %v2float %1 UnpackHalf2x16 %17026\n      %10087 = OpCompositeExtract %float %15606 0\n      %17482 = OpCompositeExtract %float %15606 1\n      %14608 = OpCompositeConstruct %v4float %10102 %16057 %10087 %17482\n      %17278 = OpCompositeExtract %uint %11213 0\n      %18031 = OpExtInst %v2float %1 UnpackHalf2x16 %17278\n      %10103 = OpCompositeExtract %float %18031 0\n      %16058 = OpCompositeExtract %float %18031 1\n      %17027 = OpCompositeExtract %uint %11213 1\n      %15607 = OpExtInst %v2float %1 UnpackHalf2x16 %17027\n      %10088 = OpCompositeExtract %float %15607 0\n      %17483 = OpCompositeExtract %float %15607 1\n      %14609 = OpCompositeConstruct %v4float %10103 %16058 %10088 %17483\n      %17279 = OpCompositeExtract %uint %11213 2\n      %18032 = OpExtInst %v2float %1 UnpackHalf2x16 %17279\n      %10104 = OpCompositeExtract %float %18032 0\n      %16059 = OpCompositeExtract %float %18032 1\n      %17028 = OpCompositeExtract %uint %11213 3\n      %15608 = OpExtInst %v2float %1 UnpackHalf2x16 %17028\n      %10089 = OpCompositeExtract %float %15608 0\n      %20671 = OpCompositeExtract %float %15608 1\n       %9036 = OpCompositeConstruct %v4float %10104 %16059 %10089 %20671\n               OpBranch %20260\n       %8536 = OpLabel\n       %9723 = OpVectorShuffle %v2uint %14112 %14112 0 1\n      %23356 = OpBitcast %v2int %9723\n      %24782 = OpVectorShuffle %v4int %23356 %23356 0 0 1 1\n      %18598 = OpShiftLeftLogical %v4int %24782 %290\n      %15757 = OpShiftRightArithmetic %v4int %18598 %770\n      %10907 = OpConvertSToF %v4float %15757\n      %18209 = OpVectorTimesScalar %v4float %10907 %float_0_000976592302\n      %25233 = OpExtInst %v4float %1 FMax %1284 %18209\n      %14187 = OpVectorShuffle %v2uint %14112 %14112 2 3\n       %9407 = OpBitcast %v2int %14187\n      %24783 = OpVectorShuffle %v4int %9407 %9407 0 0 1 1\n      %18599 = OpShiftLeftLogical %v4int %24783 %290\n      %15758 = OpShiftRightArithmetic %v4int %18599 %770\n      %10908 = OpConvertSToF %v4float %15758\n      %18210 = OpVectorTimesScalar %v4float %10908 %float_0_000976592302\n      %25234 = OpExtInst %v4float %1 FMax %1284 %18210\n      %14188 = OpVectorShuffle %v2uint %11213 %11213 0 1\n       %9408 = OpBitcast %v2int %14188\n      %24784 = OpVectorShuffle %v4int %9408 %9408 0 0 1 1\n      %18600 = OpShiftLeftLogical %v4int %24784 %290\n      %15759 = OpShiftRightArithmetic %v4int %18600 %770\n      %10913 = OpConvertSToF %v4float %15759\n      %18211 = OpVectorTimesScalar %v4float %10913 %float_0_000976592302\n      %25235 = OpExtInst %v4float %1 FMax %1284 %18211\n      %14189 = OpVectorShuffle %v2uint %11213 %11213 2 3\n       %9409 = OpBitcast %v2int %14189\n      %24785 = OpVectorShuffle %v4int %9409 %9409 0 0 1 1\n      %18601 = OpShiftLeftLogical %v4int %24785 %290\n      %15760 = OpShiftRightArithmetic %v4int %18601 %770\n      %10914 = OpConvertSToF %v4float %15760\n      %21439 = OpVectorTimesScalar %v4float %10914 %float_0_000976592302\n      %17250 = OpExtInst %v4float %1 FMax %1284 %21439\n               OpBranch %20260\n      %20310 = OpLabel\n       %9761 = OpVectorShuffle %v2uint %14112 %14112 0 1\n      %20825 = OpBitcast %v2float %9761\n       %7035 = OpCompositeExtract %float %20825 0\n      %13418 = OpCompositeExtract %float %20825 1\n      %17016 = OpCompositeConstruct %v4float %7035 %13418 %float_0 %float_0\n      %16856 = OpVectorShuffle %v2uint %14112 %14112 2 3\n      %14173 = OpBitcast %v2float %16856\n       %7036 = OpCompositeExtract %float %14173 0\n      %13419 = OpCompositeExtract %float %14173 1\n      %17017 = OpCompositeConstruct %v4float %7036 %13419 %float_0 %float_0\n      %16857 = OpVectorShuffle %v2uint %11213 %11213 0 1\n      %14174 = OpBitcast %v2float %16857\n       %7037 = OpCompositeExtract %float %14174 0\n      %13420 = OpCompositeExtract %float %14174 1\n      %17018 = OpCompositeConstruct %v4float %7037 %13420 %float_0 %float_0\n      %16858 = OpVectorShuffle %v2uint %11213 %11213 2 3\n      %14175 = OpBitcast %v2float %16858\n       %7039 = OpCompositeExtract %float %14175 0\n      %16648 = OpCompositeExtract %float %14175 1\n       %9037 = OpCompositeConstruct %v4float %7039 %16648 %float_0 %float_0\n               OpBranch %20260\n      %20260 = OpLabel\n      %11176 = OpPhi %v4float %9037 %20310 %17250 %8536 %9036 %8244\n      %14345 = OpPhi %v4float %17018 %20310 %25235 %8536 %14609 %8244\n      %15230 = OpPhi %v4float %17017 %20310 %25234 %8536 %14608 %8244\n      %14519 = OpPhi %v4float %17016 %20310 %25233 %8536 %14607 %8244\n               OpBranch %21263\n      %21263 = OpLabel\n      %11177 = OpPhi %v4float %11176 %20260 %11175 %16224\n      %14346 = OpPhi %v4float %14345 %20260 %14344 %16224\n      %13804 = OpPhi %v4float %15230 %20260 %15229 %16224\n       %8403 = OpPhi %v4float %14519 %20260 %14518 %16224\n      %11861 = OpUGreaterThanEqual %bool %17238 %uint_4\n               OpSelectionMerge %21267 DontFlatten\n               OpBranchConditional %11861 %20977 %21267\n      %20977 = OpLabel\n      %11079 = OpIMul %uint %uint_320 %8858\n      %23069 = OpFMul %float %11052 %float_0_5\n       %8114 = OpIAdd %uint %7686 %11079\n               OpSelectionMerge %21264 DontFlatten\n               OpBranchConditional %23279 %15206 %16570\n      %16570 = OpLabel\n      %19163 = OpIEqual %bool %6555 %uint_4\n               OpSelectionMerge %20298 DontFlatten\n               OpBranchConditional %19163 %6593 %8961\n       %8961 = OpLabel\n      %22066 = OpShiftRightLogical %uint %8114 %int_2\n      %13373 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22066\n      %15061 = OpLoad %uint %13373\n       %8519 = OpIAdd %uint %8114 %6555\n      %21672 = OpShiftRightLogical %uint %8519 %int_2\n      %19679 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21672\n      %13116 = OpLoad %uint %19679\n       %8688 = OpIMul %uint %uint_2 %6555\n      %24257 = OpIAdd %uint %8114 %8688\n      %17894 = OpShiftRightLogical %uint %24257 %int_2\n      %19680 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17894\n      %13117 = OpLoad %uint %19680\n       %8689 = OpIMul %uint %uint_3 %6555\n      %24258 = OpIAdd %uint %8114 %8689\n      %17895 = OpShiftRightLogical %uint %24258 %int_2\n      %18690 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17895\n      %24410 = OpLoad %uint %18690\n      %20784 = OpCompositeConstruct %v4uint %15061 %13116 %13117 %24410\n               OpBranch %20298\n       %6593 = OpLabel\n      %24488 = OpShiftRightLogical %uint %8114 %int_2\n      %13374 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24488\n      %12616 = OpLoad %uint %13374\n      %11700 = OpIAdd %uint %24488 %uint_1\n       %6406 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11700\n      %23656 = OpLoad %uint %6406\n      %11701 = OpIAdd %uint %24488 %uint_2\n       %6407 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11701\n      %23657 = OpLoad %uint %6407\n      %11702 = OpIAdd %uint %24488 %uint_3\n      %24563 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11702\n      %16382 = OpLoad %uint %24563\n      %20785 = OpCompositeConstruct %v4uint %12616 %23656 %23657 %16382\n               OpBranch %20298\n      %20298 = OpLabel\n      %10944 = OpPhi %v4uint %20785 %6593 %20784 %8961\n               OpSelectionMerge %16225 None\n               OpSwitch %8576 %19452 0 %14586 1 %14586 2 %7357 10 %7357 3 %7356 12 %7356 4 %8191 6 %8245\n       %8245 = OpLabel\n      %24408 = OpCompositeExtract %uint %10944 0\n      %24681 = OpExtInst %v2float %1 UnpackHalf2x16 %24408\n      %10090 = OpCompositeExtract %float %24681 0\n      %17484 = OpCompositeExtract %float %24681 1\n      %14610 = OpCompositeConstruct %v4float %10090 %17484 %float_0 %float_0\n      %17280 = OpCompositeExtract %uint %10944 1\n      %18033 = OpExtInst %v2float %1 UnpackHalf2x16 %17280\n      %10091 = OpCompositeExtract %float %18033 0\n      %17485 = OpCompositeExtract %float %18033 1\n      %14611 = OpCompositeConstruct %v4float %10091 %17485 %float_0 %float_0\n      %17281 = OpCompositeExtract %uint %10944 2\n      %18034 = OpExtInst %v2float %1 UnpackHalf2x16 %17281\n      %10092 = OpCompositeExtract %float %18034 0\n      %17486 = OpCompositeExtract %float %18034 1\n      %14612 = OpCompositeConstruct %v4float %10092 %17486 %float_0 %float_0\n      %17282 = OpCompositeExtract %uint %10944 3\n      %18035 = OpExtInst %v2float %1 UnpackHalf2x16 %17282\n      %10093 = OpCompositeExtract %float %18035 0\n      %20672 = OpCompositeExtract %float %18035 1\n       %9038 = OpCompositeConstruct %v4float %10093 %20672 %float_0 %float_0\n               OpBranch %16225\n       %8191 = OpLabel\n      %12429 = OpCompositeExtract %uint %10944 0\n      %22686 = OpBitcast %int %12429\n      %18206 = OpCompositeConstruct %v2int %22686 %22686\n      %18353 = OpShiftLeftLogical %v2int %18206 %1959\n      %13339 = OpShiftRightArithmetic %v2int %18353 %2151\n      %10915 = OpConvertSToF %v2float %13339\n      %18251 = OpVectorTimesScalar %v2float %10915 %float_0_000976592302\n      %24074 = OpExtInst %v2float %1 FMax %73 %18251\n      %24334 = OpCompositeExtract %float %24074 0\n      %15575 = OpCompositeExtract %float %24074 1\n      %16673 = OpCompositeConstruct %v4float %24334 %15575 %float_0 %float_0\n      %19525 = OpCompositeExtract %uint %10944 1\n      %16036 = OpBitcast %int %19525\n      %18207 = OpCompositeConstruct %v2int %16036 %16036\n      %18354 = OpShiftLeftLogical %v2int %18207 %1959\n      %13340 = OpShiftRightArithmetic %v2int %18354 %2151\n      %10916 = OpConvertSToF %v2float %13340\n      %18252 = OpVectorTimesScalar %v2float %10916 %float_0_000976592302\n      %24075 = OpExtInst %v2float %1 FMax %73 %18252\n      %24335 = OpCompositeExtract %float %24075 0\n      %15576 = OpCompositeExtract %float %24075 1\n      %16674 = OpCompositeConstruct %v4float %24335 %15576 %float_0 %float_0\n      %19526 = OpCompositeExtract %uint %10944 2\n      %16037 = OpBitcast %int %19526\n      %18208 = OpCompositeConstruct %v2int %16037 %16037\n      %18355 = OpShiftLeftLogical %v2int %18208 %1959\n      %13341 = OpShiftRightArithmetic %v2int %18355 %2151\n      %10917 = OpConvertSToF %v2float %13341\n      %18253 = OpVectorTimesScalar %v2float %10917 %float_0_000976592302\n      %24076 = OpExtInst %v2float %1 FMax %73 %18253\n      %24336 = OpCompositeExtract %float %24076 0\n      %15577 = OpCompositeExtract %float %24076 1\n      %16675 = OpCompositeConstruct %v4float %24336 %15577 %float_0 %float_0\n      %19527 = OpCompositeExtract %uint %10944 3\n      %16038 = OpBitcast %int %19527\n      %18212 = OpCompositeConstruct %v2int %16038 %16038\n      %18356 = OpShiftLeftLogical %v2int %18212 %1959\n      %13342 = OpShiftRightArithmetic %v2int %18356 %2151\n      %10918 = OpConvertSToF %v2float %13342\n      %18254 = OpVectorTimesScalar %v2float %10918 %float_0_000976592302\n      %24077 = OpExtInst %v2float %1 FMax %73 %18254\n      %24337 = OpCompositeExtract %float %24077 0\n      %18765 = OpCompositeExtract %float %24077 1\n       %9039 = OpCompositeConstruct %v4float %24337 %18765 %float_0 %float_0\n               OpBranch %16225\n       %7356 = OpLabel\n      %22208 = OpCompositeExtract %uint %10944 0\n      %20237 = OpCompositeConstruct %v3uint %22208 %22208 %22208\n      %11026 = OpShiftRightLogical %v3uint %20237 %2996\n      %24042 = OpBitwiseAnd %v3uint %11026 %261\n      %18592 = OpBitwiseAnd %v3uint %11026 %1126\n      %23444 = OpShiftRightLogical %v3uint %24042 %2828\n      %16589 = OpIEqual %v3bool %23444 %2578\n      %11343 = OpExtInst %v3int %1 FindUMsb %18592\n      %10777 = OpBitcast %v3uint %11343\n       %6270 = OpISub %v3uint %2828 %10777\n       %8724 = OpIAdd %v3uint %10777 %2360\n      %10355 = OpSelect %v3uint %16589 %8724 %23444\n      %23256 = OpShiftLeftLogical %v3uint %18592 %6270\n      %18846 = OpBitwiseAnd %v3uint %23256 %1126\n      %10919 = OpSelect %v3uint %16589 %18846 %18592\n      %24573 = OpIAdd %v3uint %10355 %1018\n      %20355 = OpShiftLeftLogical %v3uint %24573 %393\n      %16298 = OpShiftLeftLogical %v3uint %10919 %141\n      %22400 = OpBitwiseOr %v3uint %20355 %16298\n      %13828 = OpIEqual %v3bool %24042 %2578\n      %16966 = OpSelect %v3uint %13828 %2578 %22400\n      %10707 = OpBitcast %v3float %16966\n      %19368 = OpShiftRightLogical %uint %22208 %uint_30\n      %18450 = OpConvertUToF %float %19368\n      %15907 = OpFMul %float %18450 %float_0_333333343\n      %21446 = OpCompositeExtract %float %10707 0\n      %10841 = OpCompositeExtract %float %10707 1\n       %7836 = OpCompositeExtract %float %10707 2\n      %15837 = OpCompositeConstruct %v4float %21446 %10841 %7836 %15907\n      %10232 = OpCompositeExtract %uint %10944 1\n      %13585 = OpCompositeConstruct %v3uint %10232 %10232 %10232\n      %11027 = OpShiftRightLogical %v3uint %13585 %2996\n      %24043 = OpBitwiseAnd %v3uint %11027 %261\n      %18593 = OpBitwiseAnd %v3uint %11027 %1126\n      %23445 = OpShiftRightLogical %v3uint %24043 %2828\n      %16590 = OpIEqual %v3bool %23445 %2578\n      %11344 = OpExtInst %v3int %1 FindUMsb %18593\n      %10778 = OpBitcast %v3uint %11344\n       %6271 = OpISub %v3uint %2828 %10778\n       %8725 = OpIAdd %v3uint %10778 %2360\n      %10356 = OpSelect %v3uint %16590 %8725 %23445\n      %23257 = OpShiftLeftLogical %v3uint %18593 %6271\n      %18847 = OpBitwiseAnd %v3uint %23257 %1126\n      %10920 = OpSelect %v3uint %16590 %18847 %18593\n      %24574 = OpIAdd %v3uint %10356 %1018\n      %20356 = OpShiftLeftLogical %v3uint %24574 %393\n      %16299 = OpShiftLeftLogical %v3uint %10920 %141\n      %22401 = OpBitwiseOr %v3uint %20356 %16299\n      %13829 = OpIEqual %v3bool %24043 %2578\n      %16967 = OpSelect %v3uint %13829 %2578 %22401\n      %10708 = OpBitcast %v3float %16967\n      %19369 = OpShiftRightLogical %uint %10232 %uint_30\n      %18451 = OpConvertUToF %float %19369\n      %15908 = OpFMul %float %18451 %float_0_333333343\n      %21447 = OpCompositeExtract %float %10708 0\n      %10842 = OpCompositeExtract %float %10708 1\n       %7837 = OpCompositeExtract %float %10708 2\n      %15838 = OpCompositeConstruct %v4float %21447 %10842 %7837 %15908\n      %10233 = OpCompositeExtract %uint %10944 2\n      %13586 = OpCompositeConstruct %v3uint %10233 %10233 %10233\n      %11028 = OpShiftRightLogical %v3uint %13586 %2996\n      %24044 = OpBitwiseAnd %v3uint %11028 %261\n      %18594 = OpBitwiseAnd %v3uint %11028 %1126\n      %23446 = OpShiftRightLogical %v3uint %24044 %2828\n      %16591 = OpIEqual %v3bool %23446 %2578\n      %11345 = OpExtInst %v3int %1 FindUMsb %18594\n      %10779 = OpBitcast %v3uint %11345\n       %6272 = OpISub %v3uint %2828 %10779\n       %8726 = OpIAdd %v3uint %10779 %2360\n      %10357 = OpSelect %v3uint %16591 %8726 %23446\n      %23258 = OpShiftLeftLogical %v3uint %18594 %6272\n      %18848 = OpBitwiseAnd %v3uint %23258 %1126\n      %10921 = OpSelect %v3uint %16591 %18848 %18594\n      %24575 = OpIAdd %v3uint %10357 %1018\n      %20357 = OpShiftLeftLogical %v3uint %24575 %393\n      %16300 = OpShiftLeftLogical %v3uint %10921 %141\n      %22402 = OpBitwiseOr %v3uint %20357 %16300\n      %13830 = OpIEqual %v3bool %24044 %2578\n      %16968 = OpSelect %v3uint %13830 %2578 %22402\n      %10709 = OpBitcast %v3float %16968\n      %19370 = OpShiftRightLogical %uint %10233 %uint_30\n      %18452 = OpConvertUToF %float %19370\n      %15909 = OpFMul %float %18452 %float_0_333333343\n      %21448 = OpCompositeExtract %float %10709 0\n      %10843 = OpCompositeExtract %float %10709 1\n       %7838 = OpCompositeExtract %float %10709 2\n      %15839 = OpCompositeConstruct %v4float %21448 %10843 %7838 %15909\n      %10234 = OpCompositeExtract %uint %10944 3\n      %13587 = OpCompositeConstruct %v3uint %10234 %10234 %10234\n      %11029 = OpShiftRightLogical %v3uint %13587 %2996\n      %24045 = OpBitwiseAnd %v3uint %11029 %261\n      %18595 = OpBitwiseAnd %v3uint %11029 %1126\n      %23447 = OpShiftRightLogical %v3uint %24045 %2828\n      %16592 = OpIEqual %v3bool %23447 %2578\n      %11346 = OpExtInst %v3int %1 FindUMsb %18595\n      %10780 = OpBitcast %v3uint %11346\n       %6273 = OpISub %v3uint %2828 %10780\n       %8727 = OpIAdd %v3uint %10780 %2360\n      %10358 = OpSelect %v3uint %16592 %8727 %23447\n      %23259 = OpShiftLeftLogical %v3uint %18595 %6273\n      %18849 = OpBitwiseAnd %v3uint %23259 %1126\n      %10922 = OpSelect %v3uint %16592 %18849 %18595\n      %24576 = OpIAdd %v3uint %10358 %1018\n      %20358 = OpShiftLeftLogical %v3uint %24576 %393\n      %16301 = OpShiftLeftLogical %v3uint %10922 %141\n      %22403 = OpBitwiseOr %v3uint %20358 %16301\n      %13831 = OpIEqual %v3bool %24045 %2578\n      %16969 = OpSelect %v3uint %13831 %2578 %22403\n      %10710 = OpBitcast %v3float %16969\n      %19371 = OpShiftRightLogical %uint %10234 %uint_30\n      %18453 = OpConvertUToF %float %19371\n      %15910 = OpFMul %float %18453 %float_0_333333343\n      %21449 = OpCompositeExtract %float %10710 0\n      %10844 = OpCompositeExtract %float %10710 1\n      %11030 = OpCompositeExtract %float %10710 2\n       %9040 = OpCompositeConstruct %v4float %21449 %10844 %11030 %15910\n               OpBranch %16225\n       %7357 = OpLabel\n      %22209 = OpCompositeExtract %uint %10944 0\n      %20238 = OpCompositeConstruct %v4uint %22209 %22209 %22209 %22209\n       %9376 = OpShiftRightLogical %v4uint %20238 %845\n      %18863 = OpBitwiseAnd %v4uint %9376 %635\n      %15546 = OpConvertUToF %v4float %18863\n      %16691 = OpFMul %v4float %15546 %2798\n      %23765 = OpCompositeExtract %uint %10944 1\n      %20816 = OpCompositeConstruct %v4uint %23765 %23765 %23765 %23765\n       %9377 = OpShiftRightLogical %v4uint %20816 %845\n      %18864 = OpBitwiseAnd %v4uint %9377 %635\n      %15547 = OpConvertUToF %v4float %18864\n      %16692 = OpFMul %v4float %15547 %2798\n      %23766 = OpCompositeExtract %uint %10944 2\n      %20817 = OpCompositeConstruct %v4uint %23766 %23766 %23766 %23766\n       %9378 = OpShiftRightLogical %v4uint %20817 %845\n      %18865 = OpBitwiseAnd %v4uint %9378 %635\n      %15548 = OpConvertUToF %v4float %18865\n      %16693 = OpFMul %v4float %15548 %2798\n      %23767 = OpCompositeExtract %uint %10944 3\n      %20818 = OpCompositeConstruct %v4uint %23767 %23767 %23767 %23767\n       %9379 = OpShiftRightLogical %v4uint %20818 %845\n      %18866 = OpBitwiseAnd %v4uint %9379 %635\n      %18736 = OpConvertUToF %v4float %18866\n       %9888 = OpFMul %v4float %18736 %2798\n               OpBranch %16225\n      %14586 = OpLabel\n      %22210 = OpCompositeExtract %uint %10944 0\n      %20239 = OpCompositeConstruct %v4uint %22210 %22210 %22210 %22210\n       %9380 = OpShiftRightLogical %v4uint %20239 %653\n      %19034 = OpBitwiseAnd %v4uint %9380 %1611\n      %13989 = OpConvertUToF %v4float %19034\n      %19238 = OpVectorTimesScalar %v4float %13989 %float_0_00392156886\n       %8610 = OpCompositeExtract %uint %10944 1\n      %24846 = OpCompositeConstruct %v4uint %8610 %8610 %8610 %8610\n       %9381 = OpShiftRightLogical %v4uint %24846 %653\n      %19035 = OpBitwiseAnd %v4uint %9381 %1611\n      %13990 = OpConvertUToF %v4float %19035\n      %19239 = OpVectorTimesScalar %v4float %13990 %float_0_00392156886\n       %8611 = OpCompositeExtract %uint %10944 2\n      %24847 = OpCompositeConstruct %v4uint %8611 %8611 %8611 %8611\n       %9382 = OpShiftRightLogical %v4uint %24847 %653\n      %19036 = OpBitwiseAnd %v4uint %9382 %1611\n      %13991 = OpConvertUToF %v4float %19036\n      %19240 = OpVectorTimesScalar %v4float %13991 %float_0_00392156886\n       %8612 = OpCompositeExtract %uint %10944 3\n      %24848 = OpCompositeConstruct %v4uint %8612 %8612 %8612 %8612\n       %9383 = OpShiftRightLogical %v4uint %24848 %653\n      %19037 = OpBitwiseAnd %v4uint %9383 %1611\n      %17179 = OpConvertUToF %v4float %19037\n      %12435 = OpVectorTimesScalar %v4float %17179 %float_0_00392156886\n               OpBranch %16225\n      %19452 = OpLabel\n      %12430 = OpCompositeExtract %uint %10944 0\n      %20463 = OpBitcast %float %12430\n      %17209 = OpCompositeConstruct %v2float %20463 %float_0\n      %11667 = OpVectorShuffle %v4float %17209 %17209 0 1 1 1\n      %22196 = OpCompositeExtract %uint %10944 1\n      %16235 = OpBitcast %float %22196\n      %17210 = OpCompositeConstruct %v2float %16235 %float_0\n      %11668 = OpVectorShuffle %v4float %17210 %17210 0 1 1 1\n      %22197 = OpCompositeExtract %uint %10944 2\n      %16236 = OpBitcast %float %22197\n      %17211 = OpCompositeConstruct %v2float %16236 %float_0\n      %11669 = OpVectorShuffle %v4float %17211 %17211 0 1 1 1\n      %22198 = OpCompositeExtract %uint %10944 3\n      %16237 = OpBitcast %float %22198\n      %20399 = OpCompositeConstruct %v2float %16237 %float_0\n      %23099 = OpVectorShuffle %v4float %20399 %20399 0 1 1 1\n               OpBranch %16225\n      %16225 = OpLabel\n      %11178 = OpPhi %v4float %23099 %19452 %12435 %14586 %9888 %7357 %9040 %7356 %9039 %8191 %9038 %8245\n      %14347 = OpPhi %v4float %11669 %19452 %19240 %14586 %16693 %7357 %15839 %7356 %16675 %8191 %14612 %8245\n      %15231 = OpPhi %v4float %11668 %19452 %19239 %14586 %16692 %7357 %15838 %7356 %16674 %8191 %14611 %8245\n      %14520 = OpPhi %v4float %11667 %19452 %19238 %14586 %16691 %7357 %15837 %7356 %16673 %8191 %14610 %8245\n               OpBranch %21264\n      %15206 = OpLabel\n      %21585 = OpIEqual %bool %6555 %uint_8\n               OpSelectionMerge %20261 DontFlatten\n               OpBranchConditional %21585 %6594 %8962\n       %8962 = OpLabel\n      %22067 = OpShiftRightLogical %uint %8114 %int_2\n      %13375 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22067\n      %12617 = OpLoad %uint %13375\n      %11703 = OpIAdd %uint %22067 %uint_1\n       %6408 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11703\n       %7031 = OpLoad %uint %6408\n       %8520 = OpIAdd %uint %8114 %6555\n      %21673 = OpShiftRightLogical %uint %8520 %int_2\n      %19605 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21673\n      %12618 = OpLoad %uint %19605\n      %11704 = OpIAdd %uint %21673 %uint_1\n      %24564 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11704\n      %14157 = OpLoad %uint %24564\n      %19671 = OpCompositeConstruct %v4uint %12617 %7031 %12618 %14157\n      %19500 = OpIMul %uint %uint_2 %6555\n      %10822 = OpIAdd %uint %8114 %19500\n      %17896 = OpShiftRightLogical %uint %10822 %int_2\n      %19606 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17896\n      %12619 = OpLoad %uint %19606\n      %11705 = OpIAdd %uint %17896 %uint_1\n       %6476 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11705\n      %24156 = OpLoad %uint %6476\n       %8690 = OpIMul %uint %uint_3 %6555\n      %24259 = OpIAdd %uint %8114 %8690\n      %17897 = OpShiftRightLogical %uint %24259 %int_2\n      %19607 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17897\n      %12620 = OpLoad %uint %19607\n      %11706 = OpIAdd %uint %17897 %uint_1\n      %24565 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11706\n      %16383 = OpLoad %uint %24565\n      %20786 = OpCompositeConstruct %v4uint %12619 %24156 %12620 %16383\n               OpBranch %20261\n       %6594 = OpLabel\n      %24489 = OpShiftRightLogical %uint %8114 %int_2\n      %13376 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24489\n      %12621 = OpLoad %uint %13376\n      %11707 = OpIAdd %uint %24489 %uint_1\n       %6409 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11707\n      %23658 = OpLoad %uint %6409\n      %11708 = OpIAdd %uint %24489 %uint_2\n       %6410 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11708\n      %23659 = OpLoad %uint %6410\n      %11709 = OpIAdd %uint %24489 %uint_3\n      %24566 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11709\n      %14081 = OpLoad %uint %24566\n      %21617 = OpCompositeConstruct %v4uint %12621 %23658 %23659 %14081\n      %19332 = OpIAdd %uint %8114 %uint_16\n       %8238 = OpShiftRightLogical %uint %19332 %int_2\n      %19608 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %8238\n      %12622 = OpLoad %uint %19608\n      %11710 = OpIAdd %uint %8238 %uint_1\n       %6411 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11710\n      %23660 = OpLoad %uint %6411\n      %11711 = OpIAdd %uint %8238 %uint_2\n       %6412 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11711\n      %23661 = OpLoad %uint %6412\n      %11712 = OpIAdd %uint %8238 %uint_3\n      %24567 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11712\n      %16384 = OpLoad %uint %24567\n      %20787 = OpCompositeConstruct %v4uint %12622 %23660 %23661 %16384\n               OpBranch %20261\n      %20261 = OpLabel\n      %11214 = OpPhi %v4uint %20787 %6594 %20786 %8962\n      %14113 = OpPhi %v4uint %21617 %6594 %19671 %8962\n               OpSelectionMerge %20262 None\n               OpSwitch %8576 %20311 5 %8537 7 %8246\n       %8246 = OpLabel\n      %24411 = OpCompositeExtract %uint %14113 0\n      %24682 = OpExtInst %v2float %1 UnpackHalf2x16 %24411\n      %10105 = OpCompositeExtract %float %24682 0\n      %16060 = OpCompositeExtract %float %24682 1\n      %17029 = OpCompositeExtract %uint %14113 1\n      %15609 = OpExtInst %v2float %1 UnpackHalf2x16 %17029\n      %10094 = OpCompositeExtract %float %15609 0\n      %17487 = OpCompositeExtract %float %15609 1\n      %14613 = OpCompositeConstruct %v4float %10105 %16060 %10094 %17487\n      %17283 = OpCompositeExtract %uint %14113 2\n      %18036 = OpExtInst %v2float %1 UnpackHalf2x16 %17283\n      %10106 = OpCompositeExtract %float %18036 0\n      %16061 = OpCompositeExtract %float %18036 1\n      %17030 = OpCompositeExtract %uint %14113 3\n      %15610 = OpExtInst %v2float %1 UnpackHalf2x16 %17030\n      %10095 = OpCompositeExtract %float %15610 0\n      %17488 = OpCompositeExtract %float %15610 1\n      %14614 = OpCompositeConstruct %v4float %10106 %16061 %10095 %17488\n      %17284 = OpCompositeExtract %uint %11214 0\n      %18037 = OpExtInst %v2float %1 UnpackHalf2x16 %17284\n      %10107 = OpCompositeExtract %float %18037 0\n      %16062 = OpCompositeExtract %float %18037 1\n      %17031 = OpCompositeExtract %uint %11214 1\n      %15611 = OpExtInst %v2float %1 UnpackHalf2x16 %17031\n      %10096 = OpCompositeExtract %float %15611 0\n      %17489 = OpCompositeExtract %float %15611 1\n      %14615 = OpCompositeConstruct %v4float %10107 %16062 %10096 %17489\n      %17285 = OpCompositeExtract %uint %11214 2\n      %18038 = OpExtInst %v2float %1 UnpackHalf2x16 %17285\n      %10108 = OpCompositeExtract %float %18038 0\n      %16063 = OpCompositeExtract %float %18038 1\n      %17032 = OpCompositeExtract %uint %11214 3\n      %15612 = OpExtInst %v2float %1 UnpackHalf2x16 %17032\n      %10097 = OpCompositeExtract %float %15612 0\n      %20673 = OpCompositeExtract %float %15612 1\n       %9041 = OpCompositeConstruct %v4float %10108 %16063 %10097 %20673\n               OpBranch %20262\n       %8537 = OpLabel\n       %9724 = OpVectorShuffle %v2uint %14113 %14113 0 1\n      %23357 = OpBitcast %v2int %9724\n      %24786 = OpVectorShuffle %v4int %23357 %23357 0 0 1 1\n      %18602 = OpShiftLeftLogical %v4int %24786 %290\n      %15761 = OpShiftRightArithmetic %v4int %18602 %770\n      %10923 = OpConvertSToF %v4float %15761\n      %18213 = OpVectorTimesScalar %v4float %10923 %float_0_000976592302\n      %25236 = OpExtInst %v4float %1 FMax %1284 %18213\n      %14190 = OpVectorShuffle %v2uint %14113 %14113 2 3\n       %9410 = OpBitcast %v2int %14190\n      %24787 = OpVectorShuffle %v4int %9410 %9410 0 0 1 1\n      %18603 = OpShiftLeftLogical %v4int %24787 %290\n      %15762 = OpShiftRightArithmetic %v4int %18603 %770\n      %10924 = OpConvertSToF %v4float %15762\n      %18214 = OpVectorTimesScalar %v4float %10924 %float_0_000976592302\n      %25237 = OpExtInst %v4float %1 FMax %1284 %18214\n      %14191 = OpVectorShuffle %v2uint %11214 %11214 0 1\n       %9411 = OpBitcast %v2int %14191\n      %24788 = OpVectorShuffle %v4int %9411 %9411 0 0 1 1\n      %18604 = OpShiftLeftLogical %v4int %24788 %290\n      %15763 = OpShiftRightArithmetic %v4int %18604 %770\n      %10925 = OpConvertSToF %v4float %15763\n      %18215 = OpVectorTimesScalar %v4float %10925 %float_0_000976592302\n      %25238 = OpExtInst %v4float %1 FMax %1284 %18215\n      %14192 = OpVectorShuffle %v2uint %11214 %11214 2 3\n       %9412 = OpBitcast %v2int %14192\n      %24789 = OpVectorShuffle %v4int %9412 %9412 0 0 1 1\n      %18605 = OpShiftLeftLogical %v4int %24789 %290\n      %15764 = OpShiftRightArithmetic %v4int %18605 %770\n      %10926 = OpConvertSToF %v4float %15764\n      %21440 = OpVectorTimesScalar %v4float %10926 %float_0_000976592302\n      %17251 = OpExtInst %v4float %1 FMax %1284 %21440\n               OpBranch %20262\n      %20311 = OpLabel\n       %9762 = OpVectorShuffle %v2uint %14113 %14113 0 1\n      %20826 = OpBitcast %v2float %9762\n       %7040 = OpCompositeExtract %float %20826 0\n      %13421 = OpCompositeExtract %float %20826 1\n      %17019 = OpCompositeConstruct %v4float %7040 %13421 %float_0 %float_0\n      %16859 = OpVectorShuffle %v2uint %14113 %14113 2 3\n      %14176 = OpBitcast %v2float %16859\n       %7041 = OpCompositeExtract %float %14176 0\n      %13422 = OpCompositeExtract %float %14176 1\n      %17020 = OpCompositeConstruct %v4float %7041 %13422 %float_0 %float_0\n      %16860 = OpVectorShuffle %v2uint %11214 %11214 0 1\n      %14177 = OpBitcast %v2float %16860\n       %7042 = OpCompositeExtract %float %14177 0\n      %13423 = OpCompositeExtract %float %14177 1\n      %17021 = OpCompositeConstruct %v4float %7042 %13423 %float_0 %float_0\n      %16861 = OpVectorShuffle %v2uint %11214 %11214 2 3\n      %14178 = OpBitcast %v2float %16861\n       %7043 = OpCompositeExtract %float %14178 0\n      %16649 = OpCompositeExtract %float %14178 1\n       %9042 = OpCompositeConstruct %v4float %7043 %16649 %float_0 %float_0\n               OpBranch %20262\n      %20262 = OpLabel\n      %11179 = OpPhi %v4float %9042 %20311 %17251 %8537 %9041 %8246\n      %14348 = OpPhi %v4float %17021 %20311 %25238 %8537 %14615 %8246\n      %15232 = OpPhi %v4float %17020 %20311 %25237 %8537 %14614 %8246\n      %14521 = OpPhi %v4float %17019 %20311 %25236 %8537 %14613 %8246\n               OpBranch %21264\n      %21264 = OpLabel\n      %11180 = OpPhi %v4float %11179 %20262 %11178 %16225\n      %14349 = OpPhi %v4float %14348 %20262 %14347 %16225\n      %12949 = OpPhi %v4float %15232 %20262 %15231 %16225\n      %13946 = OpPhi %v4float %14521 %20262 %14520 %16225\n      %17241 = OpFAdd %v4float %8403 %13946\n      %23297 = OpFAdd %v4float %13804 %12949\n       %8082 = OpFAdd %v4float %14346 %14349\n      %20755 = OpFAdd %v4float %11177 %11180\n      %14461 = OpUGreaterThanEqual %bool %17238 %uint_6\n               OpSelectionMerge %24266 DontFlatten\n               OpBranchConditional %14461 %9905 %24266\n       %9905 = OpLabel\n      %14258 = OpShiftLeftLogical %uint %uint_4 %9130\n      %12090 = OpFMul %float %11052 %float_0_25\n      %20988 = OpIAdd %uint %7686 %14258\n               OpSelectionMerge %21265 DontFlatten\n               OpBranchConditional %23279 %15207 %16571\n      %16571 = OpLabel\n      %19165 = OpIEqual %bool %6555 %uint_4\n               OpSelectionMerge %20299 DontFlatten\n               OpBranchConditional %19165 %6595 %8963\n       %8963 = OpLabel\n      %22068 = OpShiftRightLogical %uint %20988 %int_2\n      %13377 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22068\n      %15062 = OpLoad %uint %13377\n       %8521 = OpIAdd %uint %20988 %6555\n      %21674 = OpShiftRightLogical %uint %8521 %int_2\n      %19681 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21674\n      %13118 = OpLoad %uint %19681\n       %8691 = OpIMul %uint %uint_2 %6555\n      %24260 = OpIAdd %uint %20988 %8691\n      %17898 = OpShiftRightLogical %uint %24260 %int_2\n      %19682 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17898\n      %13119 = OpLoad %uint %19682\n       %8692 = OpIMul %uint %uint_3 %6555\n      %24261 = OpIAdd %uint %20988 %8692\n      %17899 = OpShiftRightLogical %uint %24261 %int_2\n      %18691 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17899\n      %24412 = OpLoad %uint %18691\n      %20788 = OpCompositeConstruct %v4uint %15062 %13118 %13119 %24412\n               OpBranch %20299\n       %6595 = OpLabel\n      %24490 = OpShiftRightLogical %uint %20988 %int_2\n      %13378 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24490\n      %12623 = OpLoad %uint %13378\n      %11713 = OpIAdd %uint %24490 %uint_1\n       %6413 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11713\n      %23662 = OpLoad %uint %6413\n      %11714 = OpIAdd %uint %24490 %uint_2\n       %6414 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11714\n      %23663 = OpLoad %uint %6414\n      %11715 = OpIAdd %uint %24490 %uint_3\n      %24568 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11715\n      %16385 = OpLoad %uint %24568\n      %20789 = OpCompositeConstruct %v4uint %12623 %23662 %23663 %16385\n               OpBranch %20299\n      %20299 = OpLabel\n      %10945 = OpPhi %v4uint %20789 %6595 %20788 %8963\n               OpSelectionMerge %16226 None\n               OpSwitch %8576 %19453 0 %14587 1 %14587 2 %7359 10 %7359 3 %7358 12 %7358 4 %8192 6 %8247\n       %8247 = OpLabel\n      %24413 = OpCompositeExtract %uint %10945 0\n      %24683 = OpExtInst %v2float %1 UnpackHalf2x16 %24413\n      %10098 = OpCompositeExtract %float %24683 0\n      %17490 = OpCompositeExtract %float %24683 1\n      %14616 = OpCompositeConstruct %v4float %10098 %17490 %float_0 %float_0\n      %17286 = OpCompositeExtract %uint %10945 1\n      %18039 = OpExtInst %v2float %1 UnpackHalf2x16 %17286\n      %10099 = OpCompositeExtract %float %18039 0\n      %17491 = OpCompositeExtract %float %18039 1\n      %14617 = OpCompositeConstruct %v4float %10099 %17491 %float_0 %float_0\n      %17287 = OpCompositeExtract %uint %10945 2\n      %18040 = OpExtInst %v2float %1 UnpackHalf2x16 %17287\n      %10100 = OpCompositeExtract %float %18040 0\n      %17492 = OpCompositeExtract %float %18040 1\n      %14618 = OpCompositeConstruct %v4float %10100 %17492 %float_0 %float_0\n      %17288 = OpCompositeExtract %uint %10945 3\n      %18041 = OpExtInst %v2float %1 UnpackHalf2x16 %17288\n      %10109 = OpCompositeExtract %float %18041 0\n      %20674 = OpCompositeExtract %float %18041 1\n       %9043 = OpCompositeConstruct %v4float %10109 %20674 %float_0 %float_0\n               OpBranch %16226\n       %8192 = OpLabel\n      %12431 = OpCompositeExtract %uint %10945 0\n      %22687 = OpBitcast %int %12431\n      %18216 = OpCompositeConstruct %v2int %22687 %22687\n      %18357 = OpShiftLeftLogical %v2int %18216 %1959\n      %13343 = OpShiftRightArithmetic %v2int %18357 %2151\n      %10927 = OpConvertSToF %v2float %13343\n      %18255 = OpVectorTimesScalar %v2float %10927 %float_0_000976592302\n      %24078 = OpExtInst %v2float %1 FMax %73 %18255\n      %24338 = OpCompositeExtract %float %24078 0\n      %15578 = OpCompositeExtract %float %24078 1\n      %16676 = OpCompositeConstruct %v4float %24338 %15578 %float_0 %float_0\n      %19528 = OpCompositeExtract %uint %10945 1\n      %16039 = OpBitcast %int %19528\n      %18217 = OpCompositeConstruct %v2int %16039 %16039\n      %18358 = OpShiftLeftLogical %v2int %18217 %1959\n      %13344 = OpShiftRightArithmetic %v2int %18358 %2151\n      %10928 = OpConvertSToF %v2float %13344\n      %18256 = OpVectorTimesScalar %v2float %10928 %float_0_000976592302\n      %24079 = OpExtInst %v2float %1 FMax %73 %18256\n      %24339 = OpCompositeExtract %float %24079 0\n      %15579 = OpCompositeExtract %float %24079 1\n      %16677 = OpCompositeConstruct %v4float %24339 %15579 %float_0 %float_0\n      %19529 = OpCompositeExtract %uint %10945 2\n      %16040 = OpBitcast %int %19529\n      %18218 = OpCompositeConstruct %v2int %16040 %16040\n      %18359 = OpShiftLeftLogical %v2int %18218 %1959\n      %13345 = OpShiftRightArithmetic %v2int %18359 %2151\n      %10929 = OpConvertSToF %v2float %13345\n      %18257 = OpVectorTimesScalar %v2float %10929 %float_0_000976592302\n      %24080 = OpExtInst %v2float %1 FMax %73 %18257\n      %24340 = OpCompositeExtract %float %24080 0\n      %15580 = OpCompositeExtract %float %24080 1\n      %16678 = OpCompositeConstruct %v4float %24340 %15580 %float_0 %float_0\n      %19530 = OpCompositeExtract %uint %10945 3\n      %16041 = OpBitcast %int %19530\n      %18219 = OpCompositeConstruct %v2int %16041 %16041\n      %18360 = OpShiftLeftLogical %v2int %18219 %1959\n      %13346 = OpShiftRightArithmetic %v2int %18360 %2151\n      %10930 = OpConvertSToF %v2float %13346\n      %18258 = OpVectorTimesScalar %v2float %10930 %float_0_000976592302\n      %24081 = OpExtInst %v2float %1 FMax %73 %18258\n      %24341 = OpCompositeExtract %float %24081 0\n      %18766 = OpCompositeExtract %float %24081 1\n       %9044 = OpCompositeConstruct %v4float %24341 %18766 %float_0 %float_0\n               OpBranch %16226\n       %7358 = OpLabel\n      %22211 = OpCompositeExtract %uint %10945 0\n      %20240 = OpCompositeConstruct %v3uint %22211 %22211 %22211\n      %11031 = OpShiftRightLogical %v3uint %20240 %2996\n      %24046 = OpBitwiseAnd %v3uint %11031 %261\n      %18596 = OpBitwiseAnd %v3uint %11031 %1126\n      %23448 = OpShiftRightLogical %v3uint %24046 %2828\n      %16593 = OpIEqual %v3bool %23448 %2578\n      %11347 = OpExtInst %v3int %1 FindUMsb %18596\n      %10781 = OpBitcast %v3uint %11347\n       %6274 = OpISub %v3uint %2828 %10781\n       %8728 = OpIAdd %v3uint %10781 %2360\n      %10359 = OpSelect %v3uint %16593 %8728 %23448\n      %23260 = OpShiftLeftLogical %v3uint %18596 %6274\n      %18850 = OpBitwiseAnd %v3uint %23260 %1126\n      %10931 = OpSelect %v3uint %16593 %18850 %18596\n      %24577 = OpIAdd %v3uint %10359 %1018\n      %20359 = OpShiftLeftLogical %v3uint %24577 %393\n      %16302 = OpShiftLeftLogical %v3uint %10931 %141\n      %22404 = OpBitwiseOr %v3uint %20359 %16302\n      %13832 = OpIEqual %v3bool %24046 %2578\n      %16970 = OpSelect %v3uint %13832 %2578 %22404\n      %10711 = OpBitcast %v3float %16970\n      %19372 = OpShiftRightLogical %uint %22211 %uint_30\n      %18454 = OpConvertUToF %float %19372\n      %15911 = OpFMul %float %18454 %float_0_333333343\n      %21450 = OpCompositeExtract %float %10711 0\n      %10845 = OpCompositeExtract %float %10711 1\n       %7839 = OpCompositeExtract %float %10711 2\n      %15840 = OpCompositeConstruct %v4float %21450 %10845 %7839 %15911\n      %10235 = OpCompositeExtract %uint %10945 1\n      %13588 = OpCompositeConstruct %v3uint %10235 %10235 %10235\n      %11032 = OpShiftRightLogical %v3uint %13588 %2996\n      %24047 = OpBitwiseAnd %v3uint %11032 %261\n      %18597 = OpBitwiseAnd %v3uint %11032 %1126\n      %23449 = OpShiftRightLogical %v3uint %24047 %2828\n      %16594 = OpIEqual %v3bool %23449 %2578\n      %11348 = OpExtInst %v3int %1 FindUMsb %18597\n      %10782 = OpBitcast %v3uint %11348\n       %6275 = OpISub %v3uint %2828 %10782\n       %8729 = OpIAdd %v3uint %10782 %2360\n      %10360 = OpSelect %v3uint %16594 %8729 %23449\n      %23261 = OpShiftLeftLogical %v3uint %18597 %6275\n      %18851 = OpBitwiseAnd %v3uint %23261 %1126\n      %10932 = OpSelect %v3uint %16594 %18851 %18597\n      %24578 = OpIAdd %v3uint %10360 %1018\n      %20360 = OpShiftLeftLogical %v3uint %24578 %393\n      %16303 = OpShiftLeftLogical %v3uint %10932 %141\n      %22405 = OpBitwiseOr %v3uint %20360 %16303\n      %13833 = OpIEqual %v3bool %24047 %2578\n      %16971 = OpSelect %v3uint %13833 %2578 %22405\n      %10712 = OpBitcast %v3float %16971\n      %19373 = OpShiftRightLogical %uint %10235 %uint_30\n      %18455 = OpConvertUToF %float %19373\n      %15912 = OpFMul %float %18455 %float_0_333333343\n      %21451 = OpCompositeExtract %float %10712 0\n      %10846 = OpCompositeExtract %float %10712 1\n       %7840 = OpCompositeExtract %float %10712 2\n      %15841 = OpCompositeConstruct %v4float %21451 %10846 %7840 %15912\n      %10236 = OpCompositeExtract %uint %10945 2\n      %13589 = OpCompositeConstruct %v3uint %10236 %10236 %10236\n      %11033 = OpShiftRightLogical %v3uint %13589 %2996\n      %24048 = OpBitwiseAnd %v3uint %11033 %261\n      %18606 = OpBitwiseAnd %v3uint %11033 %1126\n      %23450 = OpShiftRightLogical %v3uint %24048 %2828\n      %16595 = OpIEqual %v3bool %23450 %2578\n      %11349 = OpExtInst %v3int %1 FindUMsb %18606\n      %10783 = OpBitcast %v3uint %11349\n       %6276 = OpISub %v3uint %2828 %10783\n       %8730 = OpIAdd %v3uint %10783 %2360\n      %10361 = OpSelect %v3uint %16595 %8730 %23450\n      %23262 = OpShiftLeftLogical %v3uint %18606 %6276\n      %18852 = OpBitwiseAnd %v3uint %23262 %1126\n      %10933 = OpSelect %v3uint %16595 %18852 %18606\n      %24579 = OpIAdd %v3uint %10361 %1018\n      %20361 = OpShiftLeftLogical %v3uint %24579 %393\n      %16304 = OpShiftLeftLogical %v3uint %10933 %141\n      %22406 = OpBitwiseOr %v3uint %20361 %16304\n      %13834 = OpIEqual %v3bool %24048 %2578\n      %16972 = OpSelect %v3uint %13834 %2578 %22406\n      %10713 = OpBitcast %v3float %16972\n      %19374 = OpShiftRightLogical %uint %10236 %uint_30\n      %18456 = OpConvertUToF %float %19374\n      %15913 = OpFMul %float %18456 %float_0_333333343\n      %21452 = OpCompositeExtract %float %10713 0\n      %10847 = OpCompositeExtract %float %10713 1\n       %7841 = OpCompositeExtract %float %10713 2\n      %15842 = OpCompositeConstruct %v4float %21452 %10847 %7841 %15913\n      %10237 = OpCompositeExtract %uint %10945 3\n      %13590 = OpCompositeConstruct %v3uint %10237 %10237 %10237\n      %11034 = OpShiftRightLogical %v3uint %13590 %2996\n      %24049 = OpBitwiseAnd %v3uint %11034 %261\n      %18607 = OpBitwiseAnd %v3uint %11034 %1126\n      %23451 = OpShiftRightLogical %v3uint %24049 %2828\n      %16596 = OpIEqual %v3bool %23451 %2578\n      %11350 = OpExtInst %v3int %1 FindUMsb %18607\n      %10784 = OpBitcast %v3uint %11350\n       %6277 = OpISub %v3uint %2828 %10784\n       %8731 = OpIAdd %v3uint %10784 %2360\n      %10362 = OpSelect %v3uint %16596 %8731 %23451\n      %23263 = OpShiftLeftLogical %v3uint %18607 %6277\n      %18853 = OpBitwiseAnd %v3uint %23263 %1126\n      %10934 = OpSelect %v3uint %16596 %18853 %18607\n      %24580 = OpIAdd %v3uint %10362 %1018\n      %20362 = OpShiftLeftLogical %v3uint %24580 %393\n      %16305 = OpShiftLeftLogical %v3uint %10934 %141\n      %22407 = OpBitwiseOr %v3uint %20362 %16305\n      %13835 = OpIEqual %v3bool %24049 %2578\n      %16973 = OpSelect %v3uint %13835 %2578 %22407\n      %10714 = OpBitcast %v3float %16973\n      %19375 = OpShiftRightLogical %uint %10237 %uint_30\n      %18457 = OpConvertUToF %float %19375\n      %15914 = OpFMul %float %18457 %float_0_333333343\n      %21453 = OpCompositeExtract %float %10714 0\n      %10848 = OpCompositeExtract %float %10714 1\n      %11035 = OpCompositeExtract %float %10714 2\n       %9045 = OpCompositeConstruct %v4float %21453 %10848 %11035 %15914\n               OpBranch %16226\n       %7359 = OpLabel\n      %22212 = OpCompositeExtract %uint %10945 0\n      %20241 = OpCompositeConstruct %v4uint %22212 %22212 %22212 %22212\n       %9384 = OpShiftRightLogical %v4uint %20241 %845\n      %18867 = OpBitwiseAnd %v4uint %9384 %635\n      %15549 = OpConvertUToF %v4float %18867\n      %16694 = OpFMul %v4float %15549 %2798\n      %23768 = OpCompositeExtract %uint %10945 1\n      %20819 = OpCompositeConstruct %v4uint %23768 %23768 %23768 %23768\n       %9385 = OpShiftRightLogical %v4uint %20819 %845\n      %18868 = OpBitwiseAnd %v4uint %9385 %635\n      %15550 = OpConvertUToF %v4float %18868\n      %16695 = OpFMul %v4float %15550 %2798\n      %23769 = OpCompositeExtract %uint %10945 2\n      %20820 = OpCompositeConstruct %v4uint %23769 %23769 %23769 %23769\n       %9386 = OpShiftRightLogical %v4uint %20820 %845\n      %18869 = OpBitwiseAnd %v4uint %9386 %635\n      %15551 = OpConvertUToF %v4float %18869\n      %16696 = OpFMul %v4float %15551 %2798\n      %23770 = OpCompositeExtract %uint %10945 3\n      %20821 = OpCompositeConstruct %v4uint %23770 %23770 %23770 %23770\n       %9387 = OpShiftRightLogical %v4uint %20821 %845\n      %18870 = OpBitwiseAnd %v4uint %9387 %635\n      %18737 = OpConvertUToF %v4float %18870\n       %9889 = OpFMul %v4float %18737 %2798\n               OpBranch %16226\n      %14587 = OpLabel\n      %22213 = OpCompositeExtract %uint %10945 0\n      %20242 = OpCompositeConstruct %v4uint %22213 %22213 %22213 %22213\n       %9388 = OpShiftRightLogical %v4uint %20242 %653\n      %19038 = OpBitwiseAnd %v4uint %9388 %1611\n      %13992 = OpConvertUToF %v4float %19038\n      %19241 = OpVectorTimesScalar %v4float %13992 %float_0_00392156886\n       %8613 = OpCompositeExtract %uint %10945 1\n      %24849 = OpCompositeConstruct %v4uint %8613 %8613 %8613 %8613\n       %9389 = OpShiftRightLogical %v4uint %24849 %653\n      %19039 = OpBitwiseAnd %v4uint %9389 %1611\n      %13993 = OpConvertUToF %v4float %19039\n      %19242 = OpVectorTimesScalar %v4float %13993 %float_0_00392156886\n       %8614 = OpCompositeExtract %uint %10945 2\n      %24850 = OpCompositeConstruct %v4uint %8614 %8614 %8614 %8614\n       %9390 = OpShiftRightLogical %v4uint %24850 %653\n      %19040 = OpBitwiseAnd %v4uint %9390 %1611\n      %13994 = OpConvertUToF %v4float %19040\n      %19243 = OpVectorTimesScalar %v4float %13994 %float_0_00392156886\n       %8615 = OpCompositeExtract %uint %10945 3\n      %24851 = OpCompositeConstruct %v4uint %8615 %8615 %8615 %8615\n       %9391 = OpShiftRightLogical %v4uint %24851 %653\n      %19041 = OpBitwiseAnd %v4uint %9391 %1611\n      %17180 = OpConvertUToF %v4float %19041\n      %12436 = OpVectorTimesScalar %v4float %17180 %float_0_00392156886\n               OpBranch %16226\n      %19453 = OpLabel\n      %12432 = OpCompositeExtract %uint %10945 0\n      %20464 = OpBitcast %float %12432\n      %17212 = OpCompositeConstruct %v2float %20464 %float_0\n      %11670 = OpVectorShuffle %v4float %17212 %17212 0 1 1 1\n      %22199 = OpCompositeExtract %uint %10945 1\n      %16238 = OpBitcast %float %22199\n      %17213 = OpCompositeConstruct %v2float %16238 %float_0\n      %11671 = OpVectorShuffle %v4float %17213 %17213 0 1 1 1\n      %22200 = OpCompositeExtract %uint %10945 2\n      %16239 = OpBitcast %float %22200\n      %17214 = OpCompositeConstruct %v2float %16239 %float_0\n      %11672 = OpVectorShuffle %v4float %17214 %17214 0 1 1 1\n      %22201 = OpCompositeExtract %uint %10945 3\n      %16240 = OpBitcast %float %22201\n      %20400 = OpCompositeConstruct %v2float %16240 %float_0\n      %23100 = OpVectorShuffle %v4float %20400 %20400 0 1 1 1\n               OpBranch %16226\n      %16226 = OpLabel\n      %11181 = OpPhi %v4float %23100 %19453 %12436 %14587 %9889 %7359 %9045 %7358 %9044 %8192 %9043 %8247\n      %14350 = OpPhi %v4float %11672 %19453 %19243 %14587 %16696 %7359 %15842 %7358 %16678 %8192 %14618 %8247\n      %15233 = OpPhi %v4float %11671 %19453 %19242 %14587 %16695 %7359 %15841 %7358 %16677 %8192 %14617 %8247\n      %14522 = OpPhi %v4float %11670 %19453 %19241 %14587 %16694 %7359 %15840 %7358 %16676 %8192 %14616 %8247\n               OpBranch %21265\n      %15207 = OpLabel\n      %21586 = OpIEqual %bool %6555 %uint_8\n               OpSelectionMerge %20263 DontFlatten\n               OpBranchConditional %21586 %6596 %8964\n       %8964 = OpLabel\n      %22069 = OpShiftRightLogical %uint %20988 %int_2\n      %13379 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22069\n      %12624 = OpLoad %uint %13379\n      %11716 = OpIAdd %uint %22069 %uint_1\n       %6415 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11716\n       %7032 = OpLoad %uint %6415\n       %8522 = OpIAdd %uint %20988 %6555\n      %21675 = OpShiftRightLogical %uint %8522 %int_2\n      %19609 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21675\n      %12625 = OpLoad %uint %19609\n      %11717 = OpIAdd %uint %21675 %uint_1\n      %24581 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11717\n      %14158 = OpLoad %uint %24581\n      %19673 = OpCompositeConstruct %v4uint %12624 %7032 %12625 %14158\n      %19501 = OpIMul %uint %uint_2 %6555\n      %10823 = OpIAdd %uint %20988 %19501\n      %17900 = OpShiftRightLogical %uint %10823 %int_2\n      %19610 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17900\n      %12626 = OpLoad %uint %19610\n      %11718 = OpIAdd %uint %17900 %uint_1\n       %6477 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11718\n      %24157 = OpLoad %uint %6477\n       %8693 = OpIMul %uint %uint_3 %6555\n      %24262 = OpIAdd %uint %20988 %8693\n      %17901 = OpShiftRightLogical %uint %24262 %int_2\n      %19611 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17901\n      %12627 = OpLoad %uint %19611\n      %11719 = OpIAdd %uint %17901 %uint_1\n      %24582 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11719\n      %16386 = OpLoad %uint %24582\n      %20790 = OpCompositeConstruct %v4uint %12626 %24157 %12627 %16386\n               OpBranch %20263\n       %6596 = OpLabel\n      %24491 = OpShiftRightLogical %uint %20988 %int_2\n      %13380 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24491\n      %12628 = OpLoad %uint %13380\n      %11720 = OpIAdd %uint %24491 %uint_1\n       %6416 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11720\n      %23664 = OpLoad %uint %6416\n      %11721 = OpIAdd %uint %24491 %uint_2\n       %6417 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11721\n      %23665 = OpLoad %uint %6417\n      %11722 = OpIAdd %uint %24491 %uint_3\n      %24583 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11722\n      %14082 = OpLoad %uint %24583\n      %21618 = OpCompositeConstruct %v4uint %12628 %23664 %23665 %14082\n      %19333 = OpIAdd %uint %20988 %uint_16\n       %8239 = OpShiftRightLogical %uint %19333 %int_2\n      %19612 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %8239\n      %12629 = OpLoad %uint %19612\n      %11723 = OpIAdd %uint %8239 %uint_1\n       %6418 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11723\n      %23666 = OpLoad %uint %6418\n      %11724 = OpIAdd %uint %8239 %uint_2\n       %6419 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11724\n      %23667 = OpLoad %uint %6419\n      %11725 = OpIAdd %uint %8239 %uint_3\n      %24584 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11725\n      %16387 = OpLoad %uint %24584\n      %20791 = OpCompositeConstruct %v4uint %12629 %23666 %23667 %16387\n               OpBranch %20263\n      %20263 = OpLabel\n      %11215 = OpPhi %v4uint %20791 %6596 %20790 %8964\n      %14114 = OpPhi %v4uint %21618 %6596 %19673 %8964\n               OpSelectionMerge %20264 None\n               OpSwitch %8576 %20312 5 %8538 7 %8248\n       %8248 = OpLabel\n      %24414 = OpCompositeExtract %uint %14114 0\n      %24684 = OpExtInst %v2float %1 UnpackHalf2x16 %24414\n      %10110 = OpCompositeExtract %float %24684 0\n      %16064 = OpCompositeExtract %float %24684 1\n      %17033 = OpCompositeExtract %uint %14114 1\n      %15613 = OpExtInst %v2float %1 UnpackHalf2x16 %17033\n      %10111 = OpCompositeExtract %float %15613 0\n      %17493 = OpCompositeExtract %float %15613 1\n      %14619 = OpCompositeConstruct %v4float %10110 %16064 %10111 %17493\n      %17289 = OpCompositeExtract %uint %14114 2\n      %18042 = OpExtInst %v2float %1 UnpackHalf2x16 %17289\n      %10112 = OpCompositeExtract %float %18042 0\n      %16065 = OpCompositeExtract %float %18042 1\n      %17034 = OpCompositeExtract %uint %14114 3\n      %15614 = OpExtInst %v2float %1 UnpackHalf2x16 %17034\n      %10113 = OpCompositeExtract %float %15614 0\n      %17494 = OpCompositeExtract %float %15614 1\n      %14620 = OpCompositeConstruct %v4float %10112 %16065 %10113 %17494\n      %17290 = OpCompositeExtract %uint %11215 0\n      %18043 = OpExtInst %v2float %1 UnpackHalf2x16 %17290\n      %10114 = OpCompositeExtract %float %18043 0\n      %16066 = OpCompositeExtract %float %18043 1\n      %17035 = OpCompositeExtract %uint %11215 1\n      %15615 = OpExtInst %v2float %1 UnpackHalf2x16 %17035\n      %10115 = OpCompositeExtract %float %15615 0\n      %17495 = OpCompositeExtract %float %15615 1\n      %14621 = OpCompositeConstruct %v4float %10114 %16066 %10115 %17495\n      %17291 = OpCompositeExtract %uint %11215 2\n      %18044 = OpExtInst %v2float %1 UnpackHalf2x16 %17291\n      %10116 = OpCompositeExtract %float %18044 0\n      %16067 = OpCompositeExtract %float %18044 1\n      %17036 = OpCompositeExtract %uint %11215 3\n      %15616 = OpExtInst %v2float %1 UnpackHalf2x16 %17036\n      %10117 = OpCompositeExtract %float %15616 0\n      %20675 = OpCompositeExtract %float %15616 1\n       %9046 = OpCompositeConstruct %v4float %10116 %16067 %10117 %20675\n               OpBranch %20264\n       %8538 = OpLabel\n       %9725 = OpVectorShuffle %v2uint %14114 %14114 0 1\n      %23358 = OpBitcast %v2int %9725\n      %24790 = OpVectorShuffle %v4int %23358 %23358 0 0 1 1\n      %18608 = OpShiftLeftLogical %v4int %24790 %290\n      %15765 = OpShiftRightArithmetic %v4int %18608 %770\n      %10935 = OpConvertSToF %v4float %15765\n      %18220 = OpVectorTimesScalar %v4float %10935 %float_0_000976592302\n      %25239 = OpExtInst %v4float %1 FMax %1284 %18220\n      %14193 = OpVectorShuffle %v2uint %14114 %14114 2 3\n       %9413 = OpBitcast %v2int %14193\n      %24791 = OpVectorShuffle %v4int %9413 %9413 0 0 1 1\n      %18609 = OpShiftLeftLogical %v4int %24791 %290\n      %15766 = OpShiftRightArithmetic %v4int %18609 %770\n      %10936 = OpConvertSToF %v4float %15766\n      %18221 = OpVectorTimesScalar %v4float %10936 %float_0_000976592302\n      %25240 = OpExtInst %v4float %1 FMax %1284 %18221\n      %14194 = OpVectorShuffle %v2uint %11215 %11215 0 1\n       %9414 = OpBitcast %v2int %14194\n      %24792 = OpVectorShuffle %v4int %9414 %9414 0 0 1 1\n      %18610 = OpShiftLeftLogical %v4int %24792 %290\n      %15767 = OpShiftRightArithmetic %v4int %18610 %770\n      %10937 = OpConvertSToF %v4float %15767\n      %18222 = OpVectorTimesScalar %v4float %10937 %float_0_000976592302\n      %25241 = OpExtInst %v4float %1 FMax %1284 %18222\n      %14195 = OpVectorShuffle %v2uint %11215 %11215 2 3\n       %9415 = OpBitcast %v2int %14195\n      %24793 = OpVectorShuffle %v4int %9415 %9415 0 0 1 1\n      %18611 = OpShiftLeftLogical %v4int %24793 %290\n      %15768 = OpShiftRightArithmetic %v4int %18611 %770\n      %10938 = OpConvertSToF %v4float %15768\n      %21441 = OpVectorTimesScalar %v4float %10938 %float_0_000976592302\n      %17252 = OpExtInst %v4float %1 FMax %1284 %21441\n               OpBranch %20264\n      %20312 = OpLabel\n       %9763 = OpVectorShuffle %v2uint %14114 %14114 0 1\n      %20827 = OpBitcast %v2float %9763\n       %7044 = OpCompositeExtract %float %20827 0\n      %13424 = OpCompositeExtract %float %20827 1\n      %17022 = OpCompositeConstruct %v4float %7044 %13424 %float_0 %float_0\n      %16862 = OpVectorShuffle %v2uint %14114 %14114 2 3\n      %14179 = OpBitcast %v2float %16862\n       %7045 = OpCompositeExtract %float %14179 0\n      %13425 = OpCompositeExtract %float %14179 1\n      %17023 = OpCompositeConstruct %v4float %7045 %13425 %float_0 %float_0\n      %16863 = OpVectorShuffle %v2uint %11215 %11215 0 1\n      %14180 = OpBitcast %v2float %16863\n       %7046 = OpCompositeExtract %float %14180 0\n      %13426 = OpCompositeExtract %float %14180 1\n      %17024 = OpCompositeConstruct %v4float %7046 %13426 %float_0 %float_0\n      %16864 = OpVectorShuffle %v2uint %11215 %11215 2 3\n      %14181 = OpBitcast %v2float %16864\n       %7047 = OpCompositeExtract %float %14181 0\n      %16650 = OpCompositeExtract %float %14181 1\n       %9047 = OpCompositeConstruct %v4float %7047 %16650 %float_0 %float_0\n               OpBranch %20264\n      %20264 = OpLabel\n      %11182 = OpPhi %v4float %9047 %20312 %17252 %8538 %9046 %8248\n      %14351 = OpPhi %v4float %17024 %20312 %25241 %8538 %14621 %8248\n      %15234 = OpPhi %v4float %17023 %20312 %25240 %8538 %14620 %8248\n      %14523 = OpPhi %v4float %17022 %20312 %25239 %8538 %14619 %8248\n               OpBranch %21265\n      %21265 = OpLabel\n      %11183 = OpPhi %v4float %11182 %20264 %11181 %16226\n      %14352 = OpPhi %v4float %14351 %20264 %14350 %16226\n      %12950 = OpPhi %v4float %15234 %20264 %15233 %16226\n      %13947 = OpPhi %v4float %14523 %20264 %14522 %16226\n      %17242 = OpFAdd %v4float %17241 %13947\n      %23298 = OpFAdd %v4float %23297 %12950\n       %7208 = OpFAdd %v4float %8082 %14352\n       %9642 = OpFAdd %v4float %20755 %11183\n      %16376 = OpIAdd %uint %8114 %14258\n               OpSelectionMerge %21266 DontFlatten\n               OpBranchConditional %23279 %15208 %16572\n      %16572 = OpLabel\n      %19166 = OpIEqual %bool %6555 %uint_4\n               OpSelectionMerge %20300 DontFlatten\n               OpBranchConditional %19166 %6597 %8965\n       %8965 = OpLabel\n      %22070 = OpShiftRightLogical %uint %16376 %int_2\n      %13381 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22070\n      %15063 = OpLoad %uint %13381\n       %8523 = OpIAdd %uint %16376 %6555\n      %21676 = OpShiftRightLogical %uint %8523 %int_2\n      %19683 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21676\n      %13120 = OpLoad %uint %19683\n       %8694 = OpIMul %uint %uint_2 %6555\n      %24263 = OpIAdd %uint %16376 %8694\n      %17902 = OpShiftRightLogical %uint %24263 %int_2\n      %19684 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17902\n      %13121 = OpLoad %uint %19684\n       %8695 = OpIMul %uint %uint_3 %6555\n      %24264 = OpIAdd %uint %16376 %8695\n      %17903 = OpShiftRightLogical %uint %24264 %int_2\n      %18692 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17903\n      %24415 = OpLoad %uint %18692\n      %20792 = OpCompositeConstruct %v4uint %15063 %13120 %13121 %24415\n               OpBranch %20300\n       %6597 = OpLabel\n      %24492 = OpShiftRightLogical %uint %16376 %int_2\n      %13382 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24492\n      %12630 = OpLoad %uint %13382\n      %11726 = OpIAdd %uint %24492 %uint_1\n       %6420 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11726\n      %23668 = OpLoad %uint %6420\n      %11727 = OpIAdd %uint %24492 %uint_2\n       %6421 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11727\n      %23669 = OpLoad %uint %6421\n      %11728 = OpIAdd %uint %24492 %uint_3\n      %24585 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11728\n      %16388 = OpLoad %uint %24585\n      %20793 = OpCompositeConstruct %v4uint %12630 %23668 %23669 %16388\n               OpBranch %20300\n      %20300 = OpLabel\n      %10946 = OpPhi %v4uint %20793 %6597 %20792 %8965\n               OpSelectionMerge %16227 None\n               OpSwitch %8576 %19454 0 %14588 1 %14588 2 %7361 10 %7361 3 %7360 12 %7360 4 %8193 6 %8249\n       %8249 = OpLabel\n      %24416 = OpCompositeExtract %uint %10946 0\n      %24685 = OpExtInst %v2float %1 UnpackHalf2x16 %24416\n      %10118 = OpCompositeExtract %float %24685 0\n      %17496 = OpCompositeExtract %float %24685 1\n      %14622 = OpCompositeConstruct %v4float %10118 %17496 %float_0 %float_0\n      %17292 = OpCompositeExtract %uint %10946 1\n      %18045 = OpExtInst %v2float %1 UnpackHalf2x16 %17292\n      %10119 = OpCompositeExtract %float %18045 0\n      %17497 = OpCompositeExtract %float %18045 1\n      %14623 = OpCompositeConstruct %v4float %10119 %17497 %float_0 %float_0\n      %17293 = OpCompositeExtract %uint %10946 2\n      %18046 = OpExtInst %v2float %1 UnpackHalf2x16 %17293\n      %10120 = OpCompositeExtract %float %18046 0\n      %17498 = OpCompositeExtract %float %18046 1\n      %14624 = OpCompositeConstruct %v4float %10120 %17498 %float_0 %float_0\n      %17294 = OpCompositeExtract %uint %10946 3\n      %18047 = OpExtInst %v2float %1 UnpackHalf2x16 %17294\n      %10121 = OpCompositeExtract %float %18047 0\n      %20676 = OpCompositeExtract %float %18047 1\n       %9048 = OpCompositeConstruct %v4float %10121 %20676 %float_0 %float_0\n               OpBranch %16227\n       %8193 = OpLabel\n      %12433 = OpCompositeExtract %uint %10946 0\n      %22688 = OpBitcast %int %12433\n      %18223 = OpCompositeConstruct %v2int %22688 %22688\n      %18361 = OpShiftLeftLogical %v2int %18223 %1959\n      %13347 = OpShiftRightArithmetic %v2int %18361 %2151\n      %10939 = OpConvertSToF %v2float %13347\n      %18259 = OpVectorTimesScalar %v2float %10939 %float_0_000976592302\n      %24082 = OpExtInst %v2float %1 FMax %73 %18259\n      %24342 = OpCompositeExtract %float %24082 0\n      %15581 = OpCompositeExtract %float %24082 1\n      %16679 = OpCompositeConstruct %v4float %24342 %15581 %float_0 %float_0\n      %19531 = OpCompositeExtract %uint %10946 1\n      %16042 = OpBitcast %int %19531\n      %18224 = OpCompositeConstruct %v2int %16042 %16042\n      %18362 = OpShiftLeftLogical %v2int %18224 %1959\n      %13348 = OpShiftRightArithmetic %v2int %18362 %2151\n      %10940 = OpConvertSToF %v2float %13348\n      %18260 = OpVectorTimesScalar %v2float %10940 %float_0_000976592302\n      %24083 = OpExtInst %v2float %1 FMax %73 %18260\n      %24343 = OpCompositeExtract %float %24083 0\n      %15582 = OpCompositeExtract %float %24083 1\n      %16680 = OpCompositeConstruct %v4float %24343 %15582 %float_0 %float_0\n      %19532 = OpCompositeExtract %uint %10946 2\n      %16043 = OpBitcast %int %19532\n      %18225 = OpCompositeConstruct %v2int %16043 %16043\n      %18364 = OpShiftLeftLogical %v2int %18225 %1959\n      %13349 = OpShiftRightArithmetic %v2int %18364 %2151\n      %10941 = OpConvertSToF %v2float %13349\n      %18261 = OpVectorTimesScalar %v2float %10941 %float_0_000976592302\n      %24084 = OpExtInst %v2float %1 FMax %73 %18261\n      %24344 = OpCompositeExtract %float %24084 0\n      %15583 = OpCompositeExtract %float %24084 1\n      %16681 = OpCompositeConstruct %v4float %24344 %15583 %float_0 %float_0\n      %19533 = OpCompositeExtract %uint %10946 3\n      %16044 = OpBitcast %int %19533\n      %18226 = OpCompositeConstruct %v2int %16044 %16044\n      %18365 = OpShiftLeftLogical %v2int %18226 %1959\n      %13350 = OpShiftRightArithmetic %v2int %18365 %2151\n      %10942 = OpConvertSToF %v2float %13350\n      %18262 = OpVectorTimesScalar %v2float %10942 %float_0_000976592302\n      %24085 = OpExtInst %v2float %1 FMax %73 %18262\n      %24345 = OpCompositeExtract %float %24085 0\n      %18767 = OpCompositeExtract %float %24085 1\n       %9049 = OpCompositeConstruct %v4float %24345 %18767 %float_0 %float_0\n               OpBranch %16227\n       %7360 = OpLabel\n      %22214 = OpCompositeExtract %uint %10946 0\n      %20243 = OpCompositeConstruct %v3uint %22214 %22214 %22214\n      %11036 = OpShiftRightLogical %v3uint %20243 %2996\n      %24050 = OpBitwiseAnd %v3uint %11036 %261\n      %18612 = OpBitwiseAnd %v3uint %11036 %1126\n      %23452 = OpShiftRightLogical %v3uint %24050 %2828\n      %16597 = OpIEqual %v3bool %23452 %2578\n      %11351 = OpExtInst %v3int %1 FindUMsb %18612\n      %10785 = OpBitcast %v3uint %11351\n       %6278 = OpISub %v3uint %2828 %10785\n       %8732 = OpIAdd %v3uint %10785 %2360\n      %10363 = OpSelect %v3uint %16597 %8732 %23452\n      %23264 = OpShiftLeftLogical %v3uint %18612 %6278\n      %18854 = OpBitwiseAnd %v3uint %23264 %1126\n      %10947 = OpSelect %v3uint %16597 %18854 %18612\n      %24586 = OpIAdd %v3uint %10363 %1018\n      %20363 = OpShiftLeftLogical %v3uint %24586 %393\n      %16306 = OpShiftLeftLogical %v3uint %10947 %141\n      %22408 = OpBitwiseOr %v3uint %20363 %16306\n      %13836 = OpIEqual %v3bool %24050 %2578\n      %16974 = OpSelect %v3uint %13836 %2578 %22408\n      %10715 = OpBitcast %v3float %16974\n      %19376 = OpShiftRightLogical %uint %22214 %uint_30\n      %18458 = OpConvertUToF %float %19376\n      %15915 = OpFMul %float %18458 %float_0_333333343\n      %21454 = OpCompositeExtract %float %10715 0\n      %10849 = OpCompositeExtract %float %10715 1\n       %7842 = OpCompositeExtract %float %10715 2\n      %15843 = OpCompositeConstruct %v4float %21454 %10849 %7842 %15915\n      %10238 = OpCompositeExtract %uint %10946 1\n      %13591 = OpCompositeConstruct %v3uint %10238 %10238 %10238\n      %11037 = OpShiftRightLogical %v3uint %13591 %2996\n      %24051 = OpBitwiseAnd %v3uint %11037 %261\n      %18613 = OpBitwiseAnd %v3uint %11037 %1126\n      %23453 = OpShiftRightLogical %v3uint %24051 %2828\n      %16598 = OpIEqual %v3bool %23453 %2578\n      %11352 = OpExtInst %v3int %1 FindUMsb %18613\n      %10786 = OpBitcast %v3uint %11352\n       %6279 = OpISub %v3uint %2828 %10786\n       %8733 = OpIAdd %v3uint %10786 %2360\n      %10364 = OpSelect %v3uint %16598 %8733 %23453\n      %23265 = OpShiftLeftLogical %v3uint %18613 %6279\n      %18855 = OpBitwiseAnd %v3uint %23265 %1126\n      %10948 = OpSelect %v3uint %16598 %18855 %18613\n      %24587 = OpIAdd %v3uint %10364 %1018\n      %20364 = OpShiftLeftLogical %v3uint %24587 %393\n      %16307 = OpShiftLeftLogical %v3uint %10948 %141\n      %22409 = OpBitwiseOr %v3uint %20364 %16307\n      %13837 = OpIEqual %v3bool %24051 %2578\n      %16975 = OpSelect %v3uint %13837 %2578 %22409\n      %10716 = OpBitcast %v3float %16975\n      %19377 = OpShiftRightLogical %uint %10238 %uint_30\n      %18459 = OpConvertUToF %float %19377\n      %15916 = OpFMul %float %18459 %float_0_333333343\n      %21455 = OpCompositeExtract %float %10716 0\n      %10850 = OpCompositeExtract %float %10716 1\n       %7843 = OpCompositeExtract %float %10716 2\n      %15844 = OpCompositeConstruct %v4float %21455 %10850 %7843 %15916\n      %10239 = OpCompositeExtract %uint %10946 2\n      %13592 = OpCompositeConstruct %v3uint %10239 %10239 %10239\n      %11038 = OpShiftRightLogical %v3uint %13592 %2996\n      %24052 = OpBitwiseAnd %v3uint %11038 %261\n      %18614 = OpBitwiseAnd %v3uint %11038 %1126\n      %23454 = OpShiftRightLogical %v3uint %24052 %2828\n      %16599 = OpIEqual %v3bool %23454 %2578\n      %11353 = OpExtInst %v3int %1 FindUMsb %18614\n      %10787 = OpBitcast %v3uint %11353\n       %6280 = OpISub %v3uint %2828 %10787\n       %8734 = OpIAdd %v3uint %10787 %2360\n      %10365 = OpSelect %v3uint %16599 %8734 %23454\n      %23266 = OpShiftLeftLogical %v3uint %18614 %6280\n      %18856 = OpBitwiseAnd %v3uint %23266 %1126\n      %10949 = OpSelect %v3uint %16599 %18856 %18614\n      %24588 = OpIAdd %v3uint %10365 %1018\n      %20365 = OpShiftLeftLogical %v3uint %24588 %393\n      %16308 = OpShiftLeftLogical %v3uint %10949 %141\n      %22410 = OpBitwiseOr %v3uint %20365 %16308\n      %13838 = OpIEqual %v3bool %24052 %2578\n      %16976 = OpSelect %v3uint %13838 %2578 %22410\n      %10717 = OpBitcast %v3float %16976\n      %19378 = OpShiftRightLogical %uint %10239 %uint_30\n      %18460 = OpConvertUToF %float %19378\n      %15917 = OpFMul %float %18460 %float_0_333333343\n      %21456 = OpCompositeExtract %float %10717 0\n      %10851 = OpCompositeExtract %float %10717 1\n       %7844 = OpCompositeExtract %float %10717 2\n      %15845 = OpCompositeConstruct %v4float %21456 %10851 %7844 %15917\n      %10240 = OpCompositeExtract %uint %10946 3\n      %13593 = OpCompositeConstruct %v3uint %10240 %10240 %10240\n      %11039 = OpShiftRightLogical %v3uint %13593 %2996\n      %24053 = OpBitwiseAnd %v3uint %11039 %261\n      %18616 = OpBitwiseAnd %v3uint %11039 %1126\n      %23455 = OpShiftRightLogical %v3uint %24053 %2828\n      %16600 = OpIEqual %v3bool %23455 %2578\n      %11354 = OpExtInst %v3int %1 FindUMsb %18616\n      %10788 = OpBitcast %v3uint %11354\n       %6281 = OpISub %v3uint %2828 %10788\n       %8735 = OpIAdd %v3uint %10788 %2360\n      %10366 = OpSelect %v3uint %16600 %8735 %23455\n      %23267 = OpShiftLeftLogical %v3uint %18616 %6281\n      %18857 = OpBitwiseAnd %v3uint %23267 %1126\n      %10950 = OpSelect %v3uint %16600 %18857 %18616\n      %24589 = OpIAdd %v3uint %10366 %1018\n      %20366 = OpShiftLeftLogical %v3uint %24589 %393\n      %16309 = OpShiftLeftLogical %v3uint %10950 %141\n      %22411 = OpBitwiseOr %v3uint %20366 %16309\n      %13839 = OpIEqual %v3bool %24053 %2578\n      %16977 = OpSelect %v3uint %13839 %2578 %22411\n      %10718 = OpBitcast %v3float %16977\n      %19379 = OpShiftRightLogical %uint %10240 %uint_30\n      %18461 = OpConvertUToF %float %19379\n      %15918 = OpFMul %float %18461 %float_0_333333343\n      %21457 = OpCompositeExtract %float %10718 0\n      %10852 = OpCompositeExtract %float %10718 1\n      %11040 = OpCompositeExtract %float %10718 2\n       %9050 = OpCompositeConstruct %v4float %21457 %10852 %11040 %15918\n               OpBranch %16227\n       %7361 = OpLabel\n      %22215 = OpCompositeExtract %uint %10946 0\n      %20244 = OpCompositeConstruct %v4uint %22215 %22215 %22215 %22215\n       %9392 = OpShiftRightLogical %v4uint %20244 %845\n      %18871 = OpBitwiseAnd %v4uint %9392 %635\n      %15552 = OpConvertUToF %v4float %18871\n      %16697 = OpFMul %v4float %15552 %2798\n      %23771 = OpCompositeExtract %uint %10946 1\n      %20822 = OpCompositeConstruct %v4uint %23771 %23771 %23771 %23771\n       %9393 = OpShiftRightLogical %v4uint %20822 %845\n      %18872 = OpBitwiseAnd %v4uint %9393 %635\n      %15553 = OpConvertUToF %v4float %18872\n      %16698 = OpFMul %v4float %15553 %2798\n      %23772 = OpCompositeExtract %uint %10946 2\n      %20823 = OpCompositeConstruct %v4uint %23772 %23772 %23772 %23772\n       %9394 = OpShiftRightLogical %v4uint %20823 %845\n      %18873 = OpBitwiseAnd %v4uint %9394 %635\n      %15554 = OpConvertUToF %v4float %18873\n      %16699 = OpFMul %v4float %15554 %2798\n      %23773 = OpCompositeExtract %uint %10946 3\n      %20828 = OpCompositeConstruct %v4uint %23773 %23773 %23773 %23773\n       %9395 = OpShiftRightLogical %v4uint %20828 %845\n      %18874 = OpBitwiseAnd %v4uint %9395 %635\n      %18738 = OpConvertUToF %v4float %18874\n       %9890 = OpFMul %v4float %18738 %2798\n               OpBranch %16227\n      %14588 = OpLabel\n      %22216 = OpCompositeExtract %uint %10946 0\n      %20245 = OpCompositeConstruct %v4uint %22216 %22216 %22216 %22216\n       %9396 = OpShiftRightLogical %v4uint %20245 %653\n      %19042 = OpBitwiseAnd %v4uint %9396 %1611\n      %13995 = OpConvertUToF %v4float %19042\n      %19244 = OpVectorTimesScalar %v4float %13995 %float_0_00392156886\n       %8616 = OpCompositeExtract %uint %10946 1\n      %24852 = OpCompositeConstruct %v4uint %8616 %8616 %8616 %8616\n       %9397 = OpShiftRightLogical %v4uint %24852 %653\n      %19043 = OpBitwiseAnd %v4uint %9397 %1611\n      %13996 = OpConvertUToF %v4float %19043\n      %19245 = OpVectorTimesScalar %v4float %13996 %float_0_00392156886\n       %8617 = OpCompositeExtract %uint %10946 2\n      %24853 = OpCompositeConstruct %v4uint %8617 %8617 %8617 %8617\n       %9398 = OpShiftRightLogical %v4uint %24853 %653\n      %19044 = OpBitwiseAnd %v4uint %9398 %1611\n      %13997 = OpConvertUToF %v4float %19044\n      %19246 = OpVectorTimesScalar %v4float %13997 %float_0_00392156886\n       %8618 = OpCompositeExtract %uint %10946 3\n      %24854 = OpCompositeConstruct %v4uint %8618 %8618 %8618 %8618\n       %9399 = OpShiftRightLogical %v4uint %24854 %653\n      %19045 = OpBitwiseAnd %v4uint %9399 %1611\n      %17181 = OpConvertUToF %v4float %19045\n      %12437 = OpVectorTimesScalar %v4float %17181 %float_0_00392156886\n               OpBranch %16227\n      %19454 = OpLabel\n      %12438 = OpCompositeExtract %uint %10946 0\n      %20465 = OpBitcast %float %12438\n      %17215 = OpCompositeConstruct %v2float %20465 %float_0\n      %11673 = OpVectorShuffle %v4float %17215 %17215 0 1 1 1\n      %22202 = OpCompositeExtract %uint %10946 1\n      %16241 = OpBitcast %float %22202\n      %17216 = OpCompositeConstruct %v2float %16241 %float_0\n      %11674 = OpVectorShuffle %v4float %17216 %17216 0 1 1 1\n      %22203 = OpCompositeExtract %uint %10946 2\n      %16242 = OpBitcast %float %22203\n      %17217 = OpCompositeConstruct %v2float %16242 %float_0\n      %11675 = OpVectorShuffle %v4float %17217 %17217 0 1 1 1\n      %22204 = OpCompositeExtract %uint %10946 3\n      %16243 = OpBitcast %float %22204\n      %20401 = OpCompositeConstruct %v2float %16243 %float_0\n      %23101 = OpVectorShuffle %v4float %20401 %20401 0 1 1 1\n               OpBranch %16227\n      %16227 = OpLabel\n      %11184 = OpPhi %v4float %23101 %19454 %12437 %14588 %9890 %7361 %9050 %7360 %9049 %8193 %9048 %8249\n      %14353 = OpPhi %v4float %11675 %19454 %19246 %14588 %16699 %7361 %15845 %7360 %16681 %8193 %14624 %8249\n      %15235 = OpPhi %v4float %11674 %19454 %19245 %14588 %16698 %7361 %15844 %7360 %16680 %8193 %14623 %8249\n      %14524 = OpPhi %v4float %11673 %19454 %19244 %14588 %16697 %7361 %15843 %7360 %16679 %8193 %14622 %8249\n               OpBranch %21266\n      %15208 = OpLabel\n      %21587 = OpIEqual %bool %6555 %uint_8\n               OpSelectionMerge %20265 DontFlatten\n               OpBranchConditional %21587 %6598 %8966\n       %8966 = OpLabel\n      %22071 = OpShiftRightLogical %uint %16376 %int_2\n      %13383 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22071\n      %12631 = OpLoad %uint %13383\n      %11729 = OpIAdd %uint %22071 %uint_1\n       %6422 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11729\n       %7033 = OpLoad %uint %6422\n       %8524 = OpIAdd %uint %16376 %6555\n      %21677 = OpShiftRightLogical %uint %8524 %int_2\n      %19613 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21677\n      %12632 = OpLoad %uint %19613\n      %11730 = OpIAdd %uint %21677 %uint_1\n      %24590 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11730\n      %14159 = OpLoad %uint %24590\n      %19674 = OpCompositeConstruct %v4uint %12631 %7033 %12632 %14159\n      %19502 = OpIMul %uint %uint_2 %6555\n      %10824 = OpIAdd %uint %16376 %19502\n      %17904 = OpShiftRightLogical %uint %10824 %int_2\n      %19614 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17904\n      %12633 = OpLoad %uint %19614\n      %11731 = OpIAdd %uint %17904 %uint_1\n       %6478 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11731\n      %24158 = OpLoad %uint %6478\n       %8696 = OpIMul %uint %uint_3 %6555\n      %24265 = OpIAdd %uint %16376 %8696\n      %17905 = OpShiftRightLogical %uint %24265 %int_2\n      %19615 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17905\n      %12634 = OpLoad %uint %19615\n      %11732 = OpIAdd %uint %17905 %uint_1\n      %24591 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11732\n      %16389 = OpLoad %uint %24591\n      %20794 = OpCompositeConstruct %v4uint %12633 %24158 %12634 %16389\n               OpBranch %20265\n       %6598 = OpLabel\n      %24493 = OpShiftRightLogical %uint %16376 %int_2\n      %13384 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24493\n      %12635 = OpLoad %uint %13384\n      %11733 = OpIAdd %uint %24493 %uint_1\n       %6423 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11733\n      %23670 = OpLoad %uint %6423\n      %11734 = OpIAdd %uint %24493 %uint_2\n       %6424 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11734\n      %23671 = OpLoad %uint %6424\n      %11735 = OpIAdd %uint %24493 %uint_3\n      %24592 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11735\n      %14083 = OpLoad %uint %24592\n      %21619 = OpCompositeConstruct %v4uint %12635 %23670 %23671 %14083\n      %19334 = OpIAdd %uint %16376 %uint_16\n       %8240 = OpShiftRightLogical %uint %19334 %int_2\n      %19616 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %8240\n      %12636 = OpLoad %uint %19616\n      %11736 = OpIAdd %uint %8240 %uint_1\n       %6425 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11736\n      %23672 = OpLoad %uint %6425\n      %11737 = OpIAdd %uint %8240 %uint_2\n       %6426 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11737\n      %23673 = OpLoad %uint %6426\n      %11738 = OpIAdd %uint %8240 %uint_3\n      %24593 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11738\n      %16390 = OpLoad %uint %24593\n      %20795 = OpCompositeConstruct %v4uint %12636 %23672 %23673 %16390\n               OpBranch %20265\n      %20265 = OpLabel\n      %11216 = OpPhi %v4uint %20795 %6598 %20794 %8966\n      %14115 = OpPhi %v4uint %21619 %6598 %19674 %8966\n               OpSelectionMerge %20266 None\n               OpSwitch %8576 %20313 5 %8539 7 %8250\n       %8250 = OpLabel\n      %24417 = OpCompositeExtract %uint %14115 0\n      %24686 = OpExtInst %v2float %1 UnpackHalf2x16 %24417\n      %10122 = OpCompositeExtract %float %24686 0\n      %16068 = OpCompositeExtract %float %24686 1\n      %17037 = OpCompositeExtract %uint %14115 1\n      %15617 = OpExtInst %v2float %1 UnpackHalf2x16 %17037\n      %10123 = OpCompositeExtract %float %15617 0\n      %17499 = OpCompositeExtract %float %15617 1\n      %14625 = OpCompositeConstruct %v4float %10122 %16068 %10123 %17499\n      %17295 = OpCompositeExtract %uint %14115 2\n      %18048 = OpExtInst %v2float %1 UnpackHalf2x16 %17295\n      %10124 = OpCompositeExtract %float %18048 0\n      %16069 = OpCompositeExtract %float %18048 1\n      %17038 = OpCompositeExtract %uint %14115 3\n      %15618 = OpExtInst %v2float %1 UnpackHalf2x16 %17038\n      %10125 = OpCompositeExtract %float %15618 0\n      %17500 = OpCompositeExtract %float %15618 1\n      %14626 = OpCompositeConstruct %v4float %10124 %16069 %10125 %17500\n      %17296 = OpCompositeExtract %uint %11216 0\n      %18049 = OpExtInst %v2float %1 UnpackHalf2x16 %17296\n      %10126 = OpCompositeExtract %float %18049 0\n      %16070 = OpCompositeExtract %float %18049 1\n      %17039 = OpCompositeExtract %uint %11216 1\n      %15619 = OpExtInst %v2float %1 UnpackHalf2x16 %17039\n      %10127 = OpCompositeExtract %float %15619 0\n      %17501 = OpCompositeExtract %float %15619 1\n      %14627 = OpCompositeConstruct %v4float %10126 %16070 %10127 %17501\n      %17297 = OpCompositeExtract %uint %11216 2\n      %18050 = OpExtInst %v2float %1 UnpackHalf2x16 %17297\n      %10128 = OpCompositeExtract %float %18050 0\n      %16071 = OpCompositeExtract %float %18050 1\n      %17040 = OpCompositeExtract %uint %11216 3\n      %15620 = OpExtInst %v2float %1 UnpackHalf2x16 %17040\n      %10129 = OpCompositeExtract %float %15620 0\n      %20677 = OpCompositeExtract %float %15620 1\n       %9051 = OpCompositeConstruct %v4float %10128 %16071 %10129 %20677\n               OpBranch %20266\n       %8539 = OpLabel\n       %9726 = OpVectorShuffle %v2uint %14115 %14115 0 1\n      %23359 = OpBitcast %v2int %9726\n      %24794 = OpVectorShuffle %v4int %23359 %23359 0 0 1 1\n      %18617 = OpShiftLeftLogical %v4int %24794 %290\n      %15769 = OpShiftRightArithmetic %v4int %18617 %770\n      %10951 = OpConvertSToF %v4float %15769\n      %18227 = OpVectorTimesScalar %v4float %10951 %float_0_000976592302\n      %25242 = OpExtInst %v4float %1 FMax %1284 %18227\n      %14196 = OpVectorShuffle %v2uint %14115 %14115 2 3\n       %9416 = OpBitcast %v2int %14196\n      %24795 = OpVectorShuffle %v4int %9416 %9416 0 0 1 1\n      %18618 = OpShiftLeftLogical %v4int %24795 %290\n      %15770 = OpShiftRightArithmetic %v4int %18618 %770\n      %10952 = OpConvertSToF %v4float %15770\n      %18228 = OpVectorTimesScalar %v4float %10952 %float_0_000976592302\n      %25243 = OpExtInst %v4float %1 FMax %1284 %18228\n      %14197 = OpVectorShuffle %v2uint %11216 %11216 0 1\n       %9417 = OpBitcast %v2int %14197\n      %24796 = OpVectorShuffle %v4int %9417 %9417 0 0 1 1\n      %18619 = OpShiftLeftLogical %v4int %24796 %290\n      %15771 = OpShiftRightArithmetic %v4int %18619 %770\n      %10953 = OpConvertSToF %v4float %15771\n      %18229 = OpVectorTimesScalar %v4float %10953 %float_0_000976592302\n      %25244 = OpExtInst %v4float %1 FMax %1284 %18229\n      %14198 = OpVectorShuffle %v2uint %11216 %11216 2 3\n       %9418 = OpBitcast %v2int %14198\n      %24797 = OpVectorShuffle %v4int %9418 %9418 0 0 1 1\n      %18620 = OpShiftLeftLogical %v4int %24797 %290\n      %15772 = OpShiftRightArithmetic %v4int %18620 %770\n      %10954 = OpConvertSToF %v4float %15772\n      %21458 = OpVectorTimesScalar %v4float %10954 %float_0_000976592302\n      %17253 = OpExtInst %v4float %1 FMax %1284 %21458\n               OpBranch %20266\n      %20313 = OpLabel\n       %9764 = OpVectorShuffle %v2uint %14115 %14115 0 1\n      %20829 = OpBitcast %v2float %9764\n       %7048 = OpCompositeExtract %float %20829 0\n      %13427 = OpCompositeExtract %float %20829 1\n      %17041 = OpCompositeConstruct %v4float %7048 %13427 %float_0 %float_0\n      %16865 = OpVectorShuffle %v2uint %14115 %14115 2 3\n      %14182 = OpBitcast %v2float %16865\n       %7049 = OpCompositeExtract %float %14182 0\n      %13428 = OpCompositeExtract %float %14182 1\n      %17042 = OpCompositeConstruct %v4float %7049 %13428 %float_0 %float_0\n      %16866 = OpVectorShuffle %v2uint %11216 %11216 0 1\n      %14183 = OpBitcast %v2float %16866\n       %7050 = OpCompositeExtract %float %14183 0\n      %13429 = OpCompositeExtract %float %14183 1\n      %17043 = OpCompositeConstruct %v4float %7050 %13429 %float_0 %float_0\n      %16867 = OpVectorShuffle %v2uint %11216 %11216 2 3\n      %14184 = OpBitcast %v2float %16867\n       %7051 = OpCompositeExtract %float %14184 0\n      %16651 = OpCompositeExtract %float %14184 1\n       %9052 = OpCompositeConstruct %v4float %7051 %16651 %float_0 %float_0\n               OpBranch %20266\n      %20266 = OpLabel\n      %11185 = OpPhi %v4float %9052 %20313 %17253 %8539 %9051 %8250\n      %14354 = OpPhi %v4float %17043 %20313 %25244 %8539 %14627 %8250\n      %15236 = OpPhi %v4float %17042 %20313 %25243 %8539 %14626 %8250\n      %14525 = OpPhi %v4float %17041 %20313 %25242 %8539 %14625 %8250\n               OpBranch %21266\n      %21266 = OpLabel\n      %11186 = OpPhi %v4float %11185 %20266 %11184 %16227\n      %14355 = OpPhi %v4float %14354 %20266 %14353 %16227\n      %12951 = OpPhi %v4float %15236 %20266 %15235 %16227\n      %13948 = OpPhi %v4float %14525 %20266 %14524 %16227\n      %17243 = OpFAdd %v4float %17242 %13948\n      %23299 = OpFAdd %v4float %23298 %12951\n       %9507 = OpFAdd %v4float %7208 %14355\n       %7799 = OpFAdd %v4float %9642 %11186\n               OpBranch %24266\n      %24266 = OpLabel\n      %11187 = OpPhi %v4float %20755 %21264 %7799 %21266\n      %14356 = OpPhi %v4float %8082 %21264 %9507 %21266\n      %15153 = OpPhi %v4float %23297 %21264 %23299 %21266\n      %15237 = OpPhi %v4float %17241 %21264 %17243 %21266\n      %14526 = OpPhi %float %23069 %21264 %12090 %21266\n               OpBranch %21267\n      %21267 = OpLabel\n      %11188 = OpPhi %v4float %11177 %21263 %11187 %24266\n      %14357 = OpPhi %v4float %14346 %21263 %14356 %24266\n      %15154 = OpPhi %v4float %13804 %21263 %15153 %24266\n      %13196 = OpPhi %v4float %8403 %21263 %15237 %24266\n      %11944 = OpPhi %float %11052 %21263 %14526 %24266\n      %23156 = OpVectorTimesScalar %v4float %13196 %11944\n       %6604 = OpVectorTimesScalar %v4float %15154 %11944\n      %12399 = OpVectorTimesScalar %v4float %14357 %11944\n      %13362 = OpVectorTimesScalar %v4float %11188 %11944\n               OpSelectionMerge %16228 DontFlatten\n               OpBranchConditional %7475 %10049 %16228\n      %10049 = OpLabel\n      %15086 = OpVectorShuffle %v4float %23156 %23156 2 1 0 3\n      %14855 = OpVectorShuffle %v4float %6604 %6604 2 1 0 3\n       %7398 = OpVectorShuffle %v4float %12399 %12399 2 1 0 3\n      %16111 = OpVectorShuffle %v4float %13362 %13362 2 1 0 3\n               OpBranch %16228\n      %16228 = OpLabel\n      %11189 = OpPhi %v4float %13362 %21267 %16111 %10049\n      %14358 = OpPhi %v4float %12399 %21267 %7398 %10049\n      %15191 = OpPhi %v4float %6604 %21267 %14855 %10049\n      %14921 = OpPhi %v4float %23156 %21267 %15086 %10049\n               OpSelectionMerge %23460 None\n               OpSwitch %20627 %7373 26 %18070 32 %9492\n       %9492 = OpLabel\n      %15022 = OpCompositeExtract %float %14921 0\n       %9197 = OpCompositeExtract %float %14921 1\n      %19232 = OpCompositeConstruct %v2float %15022 %9197\n       %8561 = OpExtInst %uint %1 PackHalf2x16 %19232\n      %23487 = OpCompositeExtract %float %14921 2\n      %14759 = OpCompositeExtract %float %14921 3\n      %19233 = OpCompositeConstruct %v2float %23487 %14759\n       %8562 = OpExtInst %uint %1 PackHalf2x16 %19233\n      %23488 = OpCompositeExtract %float %15191 0\n      %14760 = OpCompositeExtract %float %15191 1\n      %19234 = OpCompositeConstruct %v2float %23488 %14760\n       %8563 = OpExtInst %uint %1 PackHalf2x16 %19234\n      %23489 = OpCompositeExtract %float %15191 2\n      %14761 = OpCompositeExtract %float %15191 3\n      %19213 = OpCompositeConstruct %v2float %23489 %14761\n       %8736 = OpExtInst %uint %1 PackHalf2x16 %19213\n      %12637 = OpCompositeConstruct %v4uint %8561 %8562 %8563 %8736\n      %16073 = OpCompositeExtract %float %14358 0\n      %21620 = OpCompositeExtract %float %14358 1\n      %19247 = OpCompositeConstruct %v2float %16073 %21620\n       %8564 = OpExtInst %uint %1 PackHalf2x16 %19247\n      %23490 = OpCompositeExtract %float %14358 2\n      %14762 = OpCompositeExtract %float %14358 3\n      %19248 = OpCompositeConstruct %v2float %23490 %14762\n       %8565 = OpExtInst %uint %1 PackHalf2x16 %19248\n      %23491 = OpCompositeExtract %float %11189 0\n      %14763 = OpCompositeExtract %float %11189 1\n      %19249 = OpCompositeConstruct %v2float %23491 %14763\n       %8566 = OpExtInst %uint %1 PackHalf2x16 %19249\n      %23492 = OpCompositeExtract %float %11189 2\n      %14764 = OpCompositeExtract %float %11189 3\n      %19214 = OpCompositeConstruct %v2float %23492 %14764\n      %11926 = OpExtInst %uint %1 PackHalf2x16 %19214\n      %24879 = OpCompositeConstruct %v4uint %8564 %8565 %8566 %11926\n               OpBranch %23460\n      %18070 = OpLabel\n       %7311 = OpExtInst %v4float %1 FClamp %14921 %2938 %1285\n      %20339 = OpVectorTimesScalar %v4float %7311 %float_65535\n      %11840 = OpFAdd %v4float %20339 %325\n       %7947 = OpConvertFToU %v4uint %11840\n       %6361 = OpVectorShuffle %v2uint %7947 %7947 0 2\n      %10064 = OpVectorShuffle %v2uint %7947 %7947 1 3\n      %10446 = OpShiftLeftLogical %v2uint %10064 %2151\n      %22473 = OpBitwiseOr %v2uint %6361 %10446\n      %18828 = OpCompositeExtract %uint %22473 0\n      %15356 = OpCompositeExtract %uint %22473 1\n      %14160 = OpExtInst %v4float %1 FClamp %15191 %2938 %1285\n      %11265 = OpVectorTimesScalar %v4float %14160 %float_65535\n      %11841 = OpFAdd %v4float %11265 %325\n       %7948 = OpConvertFToU %v4uint %11841\n       %6362 = OpVectorShuffle %v2uint %7948 %7948 0 2\n      %10065 = OpVectorShuffle %v2uint %7948 %7948 1 3\n      %10447 = OpShiftLeftLogical %v2uint %10065 %2151\n      %22474 = OpBitwiseOr %v2uint %6362 %10447\n      %20077 = OpCompositeExtract %uint %22474 0\n      %22635 = OpCompositeExtract %uint %22474 1\n       %7479 = OpCompositeConstruct %v4uint %18828 %15356 %20077 %22635\n      %14406 = OpExtInst %v4float %1 FClamp %14358 %2938 %1285\n      %13687 = OpVectorTimesScalar %v4float %14406 %float_65535\n      %11842 = OpFAdd %v4float %13687 %325\n       %7949 = OpConvertFToU %v4uint %11842\n       %6363 = OpVectorShuffle %v2uint %7949 %7949 0 2\n      %10066 = OpVectorShuffle %v2uint %7949 %7949 1 3\n      %10448 = OpShiftLeftLogical %v2uint %10066 %2151\n      %22475 = OpBitwiseOr %v2uint %6363 %10448\n      %18829 = OpCompositeExtract %uint %22475 0\n      %15357 = OpCompositeExtract %uint %22475 1\n      %14161 = OpExtInst %v4float %1 FClamp %11189 %2938 %1285\n      %11266 = OpVectorTimesScalar %v4float %14161 %float_65535\n      %11843 = OpFAdd %v4float %11266 %325\n       %7950 = OpConvertFToU %v4uint %11843\n       %6364 = OpVectorShuffle %v2uint %7950 %7950 0 2\n      %10067 = OpVectorShuffle %v2uint %7950 %7950 1 3\n      %10449 = OpShiftLeftLogical %v2uint %10067 %2151\n      %22476 = OpBitwiseOr %v2uint %6364 %10449\n      %20078 = OpCompositeExtract %uint %22476 0\n       %8024 = OpCompositeExtract %uint %22476 1\n       %9053 = OpCompositeConstruct %v4uint %18829 %15357 %20078 %8024\n               OpBranch %23460\n       %7373 = OpLabel\n      %19885 = OpCompositeExtract %float %14921 0\n      %10277 = OpCompositeExtract %float %14921 1\n       %7641 = OpCompositeExtract %float %15191 0\n       %8650 = OpCompositeExtract %float %15191 1\n       %8414 = OpCompositeConstruct %v4float %19885 %10277 %7641 %8650\n      %17959 = OpBitcast %v4uint %8414\n      %11089 = OpCompositeExtract %float %14358 0\n      %13283 = OpCompositeExtract %float %14358 1\n       %7642 = OpCompositeExtract %float %11189 0\n       %8651 = OpCompositeExtract %float %11189 1\n      %11606 = OpCompositeConstruct %v4float %11089 %13283 %7642 %8651\n      %11139 = OpBitcast %v4uint %11606\n               OpBranch %23460\n      %23460 = OpLabel\n       %9750 = OpPhi %v4uint %11139 %7373 %9053 %18070 %24879 %9492\n      %14743 = OpPhi %v4uint %17959 %7373 %7479 %18070 %12637 %9492\n       %6491 = OpIEqual %bool %7640 %uint_0\n               OpSelectionMerge %13276 None\n               OpBranchConditional %6491 %11451 %13276\n      %11451 = OpLabel\n      %24159 = OpCompositeExtract %uint %19124 0\n      %22470 = OpINotEqual %bool %24159 %uint_0\n               OpBranch %13276\n      %13276 = OpLabel\n      %10955 = OpPhi %bool %6491 %23460 %22470 %11451\n               OpSelectionMerge %21873 DontFlatten\n               OpBranchConditional %10955 %11508 %21873\n      %11508 = OpLabel\n      %23599 = OpCompositeExtract %uint %19124 0\n      %17346 = OpUGreaterThanEqual %bool %23599 %uint_2\n               OpSelectionMerge %21872 None\n               OpBranchConditional %17346 %15877 %21872\n      %15877 = OpLabel\n      %24532 = OpUGreaterThanEqual %bool %23599 %uint_3\n               OpSelectionMerge %18756 None\n               OpBranchConditional %24532 %9760 %18756\n       %9760 = OpLabel\n      %17298 = OpCompositeExtract %uint %9750 2\n      %21174 = OpCompositeInsert %v4uint %17298 %9750 0\n      %23044 = OpCompositeExtract %uint %9750 3\n       %9296 = OpCompositeInsert %v4uint %23044 %21174 1\n               OpBranch %18756\n      %18756 = OpLabel\n      %17379 = OpPhi %v4uint %9750 %15877 %9296 %9760\n      %22881 = OpCompositeExtract %uint %17379 0\n      %21983 = OpCompositeInsert %v4uint %22881 %14743 2\n      %23045 = OpCompositeExtract %uint %17379 1\n       %9297 = OpCompositeInsert %v4uint %23045 %21983 3\n               OpBranch %21872\n      %21872 = OpLabel\n       %8059 = OpPhi %v4uint %9750 %11508 %17379 %18756\n       %7934 = OpPhi %v4uint %14743 %11508 %9297 %18756\n      %23690 = OpCompositeExtract %uint %7934 2\n      %21984 = OpCompositeInsert %v4uint %23690 %7934 0\n      %23046 = OpCompositeExtract %uint %7934 3\n       %9298 = OpCompositeInsert %v4uint %23046 %21984 1\n               OpBranch %21873\n      %21873 = OpLabel\n       %8952 = OpPhi %v4uint %9750 %13276 %8059 %21872\n      %21004 = OpPhi %v4uint %14743 %13276 %9298 %21872\n      %14284 = OpIAdd %v2uint %12025 %23020\n      %24181 = OpShiftRightLogical %v2uint %14284 %1837\n       %7712 = OpUDiv %v2uint %24181 %23601\n      %18183 = OpIMul %v2uint %23601 %7712\n      %18273 = OpISub %v2uint %24181 %18183\n      %11232 = OpShiftLeftLogical %v2uint %7712 %1837\n      %13284 = OpCompositeExtract %uint %18273 0\n      %10872 = OpCompositeExtract %uint %23601 1\n      %22887 = OpIMul %uint %13284 %10872\n       %6943 = OpCompositeExtract %uint %18273 1\n      %10469 = OpIAdd %uint %22887 %6943\n      %18858 = OpBitwiseAnd %v2uint %14284 %1846\n      %10581 = OpShiftLeftLogical %uint %10469 %uint_6\n      %20916 = OpCompositeExtract %uint %18858 1\n      %23596 = OpShiftLeftLogical %uint %20916 %uint_5\n      %19814 = OpBitwiseOr %uint %10581 %23596\n      %21476 = OpCompositeExtract %uint %18858 0\n      %11739 = OpShiftLeftLogical %uint %21476 %uint_3\n      %11193 = OpBitwiseOr %uint %19814 %11739\n               OpSelectionMerge %21313 DontFlatten\n               OpBranchConditional %20495 %10574 %21373\n      %21373 = OpLabel\n      %10608 = OpBitcast %v2int %11232\n      %17907 = OpCompositeExtract %int %10608 1\n      %19904 = OpShiftRightArithmetic %int %17907 %int_5\n      %22412 = OpBitcast %int %8444\n       %7938 = OpIMul %int %19904 %22412\n      %25154 = OpCompositeExtract %int %10608 0\n      %20423 = OpShiftRightArithmetic %int %25154 %int_5\n      %18875 = OpIAdd %int %7938 %20423\n       %9546 = OpShiftLeftLogical %int %18875 %int_6\n      %24635 = OpShiftRightArithmetic %int %17907 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25154 %int_7\n      %11041 = OpBitwiseOr %int %21322 %20133\n      %17334 = OpBitwiseOr %int %9546 %11041\n      %24163 = OpShiftLeftLogical %int %17334 %uint_3\n      %12766 = OpShiftRightArithmetic %int %17907 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25154 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %17907 %int_3\n      %20574 = OpBitwiseAnd %int %10425 %int_1\n      %21533 = OpShiftLeftLogical %int %20574 %int_1\n       %8890 = OpBitwiseXor %int %20766 %21533\n      %20598 = OpBitwiseAnd %int %17907 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6551\n       %7168 = OpShiftLeftLogical %int %21575 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24163 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24163 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24163 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24163 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %21313\n      %10574 = OpLabel\n      %19866 = OpCompositeExtract %uint %11232 0\n      %11267 = OpCompositeExtract %uint %11232 1\n       %8415 = OpCompositeConstruct %v3uint %19866 %11267 %24434\n      %20125 = OpBitcast %v3int %8415\n      %11255 = OpCompositeExtract %int %20125 2\n      %19905 = OpShiftRightArithmetic %int %11255 %int_2\n      %22413 = OpBitcast %int %25203\n       %7939 = OpIMul %int %19905 %22413\n      %25155 = OpCompositeExtract %int %20125 1\n      %19055 = OpShiftRightArithmetic %int %25155 %int_4\n      %11053 = OpIAdd %int %7939 %19055\n      %16898 = OpBitcast %int %8444\n      %14944 = OpIMul %int %11053 %16898\n      %25156 = OpCompositeExtract %int %20125 0\n      %20424 = OpShiftRightArithmetic %int %25156 %int_5\n      %18940 = OpIAdd %int %14944 %20424\n       %8797 = OpShiftLeftLogical %int %18940 %int_7\n      %11434 = OpBitwiseAnd %int %11255 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %25155 %int_1\n      %21364 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21364 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %25156 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17335 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17335 %uint_3\n      %13015 = OpShiftRightArithmetic %int %25155 %int_3\n       %9929 = OpBitwiseXor %int %13015 %19905\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %25156 %int_3\n      %20575 = OpBitwiseAnd %int %9616 %int_3\n      %21534 = OpShiftLeftLogical %int %16793 %int_1\n       %8891 = OpBitwiseXor %int %20575 %21534\n      %20599 = OpBitwiseAnd %int %25155 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6552\n       %7169 = OpShiftLeftLogical %int %16793 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24144 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24144 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24144 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24144 %int_8\n      %10278 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10278\n      %16870 = OpBitcast %uint %15226\n               OpBranch %21313\n      %21313 = OpLabel\n       %9506 = OpPhi %uint %16870 %10574 %16869 %21373\n      %16843 = OpIMul %uint %8858 %10872\n      %11993 = OpIMul %uint %9506 %16843\n      %16012 = OpIAdd %uint %11993 %11193\n      %22330 = OpShiftRightLogical %uint %16012 %int_4\n      %19356 = OpIEqual %bool %19164 %uint_4\n               OpSelectionMerge %14780 None\n               OpBranchConditional %19356 %13279 %14780\n      %13279 = OpLabel\n       %7958 = OpVectorShuffle %v4uint %21004 %21004 1 0 3 2\n               OpBranch %14780\n      %14780 = OpLabel\n      %22898 = OpPhi %v4uint %21004 %21313 %7958 %13279\n       %6605 = OpSelect %uint %19356 %uint_2 %19164\n      %13412 = OpIEqual %bool %6605 %uint_1\n      %18370 = OpIEqual %bool %6605 %uint_2\n      %22150 = OpLogicalOr %bool %13412 %18370\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %22898 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %22898 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16377 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22650 = OpPhi %v4uint %22898 %14780 %16377 %10583\n      %19638 = OpIEqual %bool %6605 %uint_3\n      %15139 = OpLogicalOr %bool %18370 %19638\n               OpSelectionMerge %11416 None\n               OpBranchConditional %15139 %11064 %11416\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22650 %749\n      %15335 = OpShiftRightLogical %v4uint %22650 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %11416\n      %11416 = OpLabel\n      %19767 = OpPhi %v4uint %22650 %13411 %10728 %11064\n      %24825 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_dest %int_0 %22330\n               OpStore %24825 %19767\n      %11740 = OpIAdd %uint %16012 %uint_16\n      %16881 = OpShiftRightLogical %uint %11740 %int_4\n               OpSelectionMerge %16262 None\n               OpBranchConditional %19356 %13280 %16262\n      %13280 = OpLabel\n       %7959 = OpVectorShuffle %v4uint %8952 %8952 1 0 3 2\n               OpBranch %16262\n      %16262 = OpLabel\n      %10956 = OpPhi %v4uint %8952 %11416 %7959 %13280\n               OpSelectionMerge %14874 None\n               OpBranchConditional %22150 %10584 %14874\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %10956 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %10956 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16378 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %14874\n      %14874 = OpLabel\n      %10957 = OpPhi %v4uint %10956 %16262 %16378 %10584\n               OpSelectionMerge %11417 None\n               OpBranchConditional %15139 %11065 %11417\n      %11065 = OpLabel\n      %24088 = OpShiftLeftLogical %v4uint %10957 %749\n      %15336 = OpShiftRightLogical %v4uint %10957 %749\n      %10729 = OpBitwiseOr %v4uint %24088 %15336\n               OpBranch %11417\n      %11417 = OpLabel\n      %19768 = OpPhi %v4uint %10957 %14874 %10729 %11065\n       %8053 = OpAccessChain %_ptr_Uniform_v4uint %xe_resolve_dest %int_0 %16881\n               OpStore %8053 %19768\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t resolve_full_64bpp_scaled_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x0000629D, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000008, 0x00000008, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x000003F9, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x00090006, 0x000003F9, 0x00000000, 0x725F6578,\n    0x6C6F7365, 0x655F6576, 0x6D617264, 0x666E695F, 0x0000006F, 0x000A0006,\n    0x000003F9, 0x00000001, 0x725F6578, 0x6C6F7365, 0x635F6576, 0x64726F6F,\n    0x74616E69, 0x6E695F65, 0x00006F66, 0x00090006, 0x000003F9, 0x00000002,\n    0x725F6578, 0x6C6F7365, 0x645F6576, 0x5F747365, 0x6F666E69, 0x00000000,\n    0x000B0006, 0x000003F9, 0x00000003, 0x725F6578, 0x6C6F7365, 0x645F6576,\n    0x5F747365, 0x726F6F63, 0x616E6964, 0x695F6574, 0x006F666E, 0x00060005,\n    0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578, 0x00090005,\n    0x0000079C, 0x725F6578, 0x6C6F7365, 0x655F6576, 0x6D617264, 0x5F65785F,\n    0x636F6C62, 0x0000006B, 0x00050006, 0x0000079C, 0x00000000, 0x61746164,\n    0x00000000, 0x00070005, 0x00000CC7, 0x725F6578, 0x6C6F7365, 0x655F6576,\n    0x6D617264, 0x00000000, 0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C,\n    0x766E496C, 0x7461636F, 0x496E6F69, 0x00000044, 0x00090005, 0x000007B4,\n    0x725F6578, 0x6C6F7365, 0x645F6576, 0x5F747365, 0x625F6578, 0x6B636F6C,\n    0x00000000, 0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000,\n    0x00060005, 0x00001592, 0x725F6578, 0x6C6F7365, 0x645F6576, 0x00747365,\n    0x00030047, 0x000003F9, 0x00000002, 0x00050048, 0x000003F9, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x000003F9, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x000003F9, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x000003F9, 0x00000003, 0x00000023, 0x0000000C, 0x00040047,\n    0x000007D0, 0x00000006, 0x00000004, 0x00030047, 0x0000079C, 0x00000003,\n    0x00040048, 0x0000079C, 0x00000000, 0x00000018, 0x00050048, 0x0000079C,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x00000CC7, 0x00000018,\n    0x00040047, 0x00000CC7, 0x00000021, 0x00000000, 0x00040047, 0x00000CC7,\n    0x00000022, 0x00000000, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C,\n    0x00040047, 0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4,\n    0x00000003, 0x00040048, 0x000007B4, 0x00000000, 0x00000019, 0x00050048,\n    0x000007B4, 0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x00001592,\n    0x00000019, 0x00040047, 0x00001592, 0x00000021, 0x00000000, 0x00040047,\n    0x00001592, 0x00000022, 0x00000001, 0x00040047, 0x00000AC8, 0x0000000B,\n    0x00000019, 0x00020013, 0x00000008, 0x00030021, 0x00000502, 0x00000008,\n    0x00040015, 0x0000000C, 0x00000020, 0x00000001, 0x00040017, 0x00000012,\n    0x0000000C, 0x00000002, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x00040017, 0x00000017, 0x0000000B, 0x00000004,\n    0x00030016, 0x0000000D, 0x00000020, 0x00040017, 0x00000013, 0x0000000D,\n    0x00000002, 0x00040017, 0x0000001D, 0x0000000D, 0x00000004, 0x00020014,\n    0x00000009, 0x00040017, 0x00000016, 0x0000000C, 0x00000003, 0x0004002B,\n    0x0000000D, 0x00000A0C, 0x00000000, 0x0004002B, 0x0000000D, 0x0000008A,\n    0x3F800000, 0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001, 0x0004002B,\n    0x0000000B, 0x00000A10, 0x00000002, 0x0004002B, 0x0000000B, 0x000008A6,\n    0x00FF00FF, 0x0004002B, 0x0000000B, 0x00000A22, 0x00000008, 0x0004002B,\n    0x0000000B, 0x000005FD, 0xFF00FF00, 0x0004002B, 0x0000000B, 0x00000A13,\n    0x00000003, 0x0004002B, 0x0000000B, 0x00000A3A, 0x00000010, 0x0004002B,\n    0x0000000B, 0x00000A16, 0x00000004, 0x0004002B, 0x0000000D, 0x0000022D,\n    0x477FFF00, 0x0004002B, 0x0000000D, 0x000000FC, 0x3F000000, 0x0004002B,\n    0x0000000C, 0x00000A3B, 0x00000010, 0x0004002B, 0x0000000B, 0x00000A0A,\n    0x00000000, 0x0004002B, 0x0000000B, 0x00000A52, 0x00000018, 0x0007002C,\n    0x00000017, 0x0000028D, 0x00000A0A, 0x00000A22, 0x00000A3A, 0x00000A52,\n    0x0004002B, 0x0000000B, 0x00000144, 0x000000FF, 0x0004002B, 0x0000000D,\n    0x0000017A, 0x3B808081, 0x0004002B, 0x0000000B, 0x00000A28, 0x0000000A,\n    0x0004002B, 0x0000000B, 0x00000A46, 0x00000014, 0x0004002B, 0x0000000B,\n    0x00000A64, 0x0000001E, 0x0007002C, 0x00000017, 0x0000034D, 0x00000A0A,\n    0x00000A28, 0x00000A46, 0x00000A64, 0x0004002B, 0x0000000B, 0x00000A44,\n    0x000003FF, 0x0007002C, 0x00000017, 0x0000027B, 0x00000A44, 0x00000A44,\n    0x00000A44, 0x00000A13, 0x0004002B, 0x0000000D, 0x000006FE, 0x3A802008,\n    0x0004002B, 0x0000000D, 0x00000149, 0x3EAAAAAB, 0x0007002C, 0x0000001D,\n    0x00000AEE, 0x000006FE, 0x000006FE, 0x000006FE, 0x00000149, 0x0006002C,\n    0x00000014, 0x00000BB4, 0x00000A0A, 0x00000A28, 0x00000A46, 0x0004002B,\n    0x0000000B, 0x00000B87, 0x0000007F, 0x0004002B, 0x0000000B, 0x00000A1F,\n    0x00000007, 0x00040017, 0x00000010, 0x00000009, 0x00000003, 0x0004002B,\n    0x0000000B, 0x00000B7E, 0x0000007C, 0x0004002B, 0x0000000B, 0x00000A4F,\n    0x00000017, 0x00040017, 0x00000018, 0x0000000D, 0x00000003, 0x0004002B,\n    0x0000000D, 0x00000341, 0xBF800000, 0x0004002B, 0x0000000C, 0x00000A0B,\n    0x00000000, 0x0005002C, 0x00000012, 0x000007A7, 0x00000A3B, 0x00000A0B,\n    0x0004002B, 0x0000000D, 0x000007FE, 0x3A800100, 0x00040017, 0x0000001A,\n    0x0000000C, 0x00000004, 0x0007002C, 0x0000001A, 0x00000122, 0x00000A3B,\n    0x00000A0B, 0x00000A3B, 0x00000A0B, 0x0005002C, 0x00000011, 0x0000072D,\n    0x00000A10, 0x00000A0D, 0x00040017, 0x0000000F, 0x00000009, 0x00000002,\n    0x0005002C, 0x00000011, 0x0000070F, 0x00000A0A, 0x00000A0A, 0x0005002C,\n    0x00000011, 0x00000724, 0x00000A0D, 0x00000A0D, 0x0005002C, 0x00000011,\n    0x00000718, 0x00000A0D, 0x00000A0A, 0x0004002B, 0x0000000B, 0x00000AFA,\n    0x00000050, 0x0005002C, 0x00000011, 0x00000A9F, 0x00000AFA, 0x00000A3A,\n    0x0004002B, 0x0000000B, 0x00000A84, 0x00000800, 0x0004002B, 0x0000000C,\n    0x00000A11, 0x00000002, 0x0004002B, 0x0000000C, 0x00000A17, 0x00000004,\n    0x0004002B, 0x0000000C, 0x00000A1D, 0x00000006, 0x0004002B, 0x0000000C,\n    0x00000A2C, 0x0000000B, 0x0004002B, 0x0000000C, 0x00000A38, 0x0000000F,\n    0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C,\n    0x00000A1A, 0x00000005, 0x0004002B, 0x0000000C, 0x00000A20, 0x00000007,\n    0x0004002B, 0x0000000C, 0x00000A23, 0x00000008, 0x0004002B, 0x0000000C,\n    0x00000A2F, 0x0000000C, 0x0004002B, 0x0000000C, 0x00000A14, 0x00000003,\n    0x0004002B, 0x0000000B, 0x00000A19, 0x00000005, 0x0006001E, 0x000003F9,\n    0x0000000B, 0x0000000B, 0x0000000B, 0x0000000B, 0x00040020, 0x00000676,\n    0x00000009, 0x000003F9, 0x0004003B, 0x00000676, 0x00000CE9, 0x00000009,\n    0x00040020, 0x00000288, 0x00000009, 0x0000000B, 0x0004002B, 0x0000000B,\n    0x00000A31, 0x0000000D, 0x0004002B, 0x0000000B, 0x00000A81, 0x000007FF,\n    0x0004002B, 0x0000000B, 0x00000A37, 0x0000000F, 0x0004002B, 0x0000000B,\n    0x00000A5E, 0x0000001C, 0x0004002B, 0x0000000B, 0x00000A43, 0x00000013,\n    0x0005002C, 0x00000011, 0x00000883, 0x00000A3A, 0x00000A43, 0x0004002B,\n    0x0000000B, 0x00000510, 0x20000000, 0x0005002C, 0x00000011, 0x0000073F,\n    0x00000A0A, 0x00000A16, 0x0004002B, 0x0000000C, 0x00000A29, 0x0000000A,\n    0x0004002B, 0x0000000B, 0x00000AC7, 0x0000003F, 0x0004002B, 0x0000000C,\n    0x00000A59, 0x0000001A, 0x0004002B, 0x0000000C, 0x00000A50, 0x00000017,\n    0x0004002B, 0x0000000B, 0x00000926, 0x01000000, 0x0005002C, 0x00000011,\n    0x000008E3, 0x00000A46, 0x00000A52, 0x0003001D, 0x000007D0, 0x0000000B,\n    0x0003001E, 0x0000079C, 0x000007D0, 0x00040020, 0x00000A1B, 0x00000002,\n    0x0000079C, 0x0004003B, 0x00000A1B, 0x00000CC7, 0x00000002, 0x00040020,\n    0x00000289, 0x00000002, 0x0000000B, 0x0004002B, 0x0000000B, 0x00000207,\n    0x00000140, 0x0004002B, 0x0000000B, 0x00000A1C, 0x00000006, 0x00040020,\n    0x00000291, 0x00000001, 0x00000014, 0x0004003B, 0x00000291, 0x00000F48,\n    0x00000001, 0x0005002C, 0x00000011, 0x00000721, 0x00000A10, 0x00000A0A,\n    0x0003001D, 0x000007DC, 0x00000017, 0x0003001E, 0x000007B4, 0x000007DC,\n    0x00040020, 0x00000A32, 0x00000002, 0x000007B4, 0x0004003B, 0x00000A32,\n    0x00001592, 0x00000002, 0x00040020, 0x00000294, 0x00000002, 0x00000017,\n    0x0006002C, 0x00000014, 0x00000AC8, 0x00000A22, 0x00000A22, 0x00000A0D,\n    0x0005002C, 0x00000011, 0x000007A2, 0x00000A1F, 0x00000A1F, 0x0005002C,\n    0x00000011, 0x000007A3, 0x00000A37, 0x00000A0D, 0x0005002C, 0x00000011,\n    0x0000074E, 0x00000A13, 0x00000A13, 0x0005002C, 0x00000011, 0x0000084A,\n    0x00000A37, 0x00000A37, 0x0007002C, 0x0000001D, 0x00000504, 0x00000341,\n    0x00000341, 0x00000341, 0x00000341, 0x0007002C, 0x0000001A, 0x00000302,\n    0x00000A3B, 0x00000A3B, 0x00000A3B, 0x00000A3B, 0x0007002C, 0x00000017,\n    0x0000064B, 0x00000144, 0x00000144, 0x00000144, 0x00000144, 0x0006002C,\n    0x00000014, 0x00000105, 0x00000A44, 0x00000A44, 0x00000A44, 0x0006002C,\n    0x00000014, 0x00000466, 0x00000B87, 0x00000B87, 0x00000B87, 0x0006002C,\n    0x00000014, 0x00000B0C, 0x00000A1F, 0x00000A1F, 0x00000A1F, 0x0006002C,\n    0x00000014, 0x00000A12, 0x00000A0A, 0x00000A0A, 0x00000A0A, 0x0006002C,\n    0x00000014, 0x000003FA, 0x00000B7E, 0x00000B7E, 0x00000B7E, 0x0006002C,\n    0x00000014, 0x00000189, 0x00000A4F, 0x00000A4F, 0x00000A4F, 0x0006002C,\n    0x00000014, 0x0000008D, 0x00000A3A, 0x00000A3A, 0x00000A3A, 0x0005002C,\n    0x00000013, 0x00000049, 0x00000341, 0x00000341, 0x0005002C, 0x00000012,\n    0x00000867, 0x00000A3B, 0x00000A3B, 0x0007002C, 0x0000001D, 0x00000B7A,\n    0x00000A0C, 0x00000A0C, 0x00000A0C, 0x00000A0C, 0x0007002C, 0x0000001D,\n    0x00000505, 0x0000008A, 0x0000008A, 0x0000008A, 0x0000008A, 0x0007002C,\n    0x0000001D, 0x00000145, 0x000000FC, 0x000000FC, 0x000000FC, 0x000000FC,\n    0x0005002C, 0x00000011, 0x00000736, 0x00000A13, 0x00000A0D, 0x0007002C,\n    0x00000017, 0x000009CE, 0x000008A6, 0x000008A6, 0x000008A6, 0x000008A6,\n    0x0007002C, 0x00000017, 0x0000013D, 0x00000A22, 0x00000A22, 0x00000A22,\n    0x00000A22, 0x0007002C, 0x00000017, 0x0000072E, 0x000005FD, 0x000005FD,\n    0x000005FD, 0x000005FD, 0x0007002C, 0x00000017, 0x000002ED, 0x00000A3A,\n    0x00000A3A, 0x00000A3A, 0x00000A3A, 0x0004002B, 0x0000000C, 0x00000089,\n    0x3F800000, 0x0004002B, 0x0000000B, 0x000009F8, 0xFFFFFFFA, 0x0006002C,\n    0x00000014, 0x00000938, 0x000009F8, 0x000009F8, 0x000009F8, 0x0004002B,\n    0x0000000D, 0x0000016E, 0x3E800000, 0x00050036, 0x00000008, 0x0000161F,\n    0x00000000, 0x00000502, 0x000200F8, 0x00003B06, 0x000300F7, 0x00004C7A,\n    0x00000000, 0x000300FB, 0x00000A0A, 0x00002E68, 0x000200F8, 0x00002E68,\n    0x00050041, 0x00000288, 0x000056E5, 0x00000CE9, 0x00000A0B, 0x0004003D,\n    0x0000000B, 0x00003D0B, 0x000056E5, 0x00050041, 0x00000288, 0x000058AC,\n    0x00000CE9, 0x00000A0E, 0x0004003D, 0x0000000B, 0x00005158, 0x000058AC,\n    0x000500C7, 0x0000000B, 0x00005051, 0x00003D0B, 0x00000A44, 0x000500C2,\n    0x0000000B, 0x00004E0A, 0x00003D0B, 0x00000A28, 0x000500C7, 0x0000000B,\n    0x0000217E, 0x00004E0A, 0x00000A13, 0x000500C2, 0x0000000B, 0x0000520A,\n    0x00003D0B, 0x00000A31, 0x000500C7, 0x0000000B, 0x0000217F, 0x0000520A,\n    0x00000A81, 0x000500C2, 0x0000000B, 0x0000520B, 0x00003D0B, 0x00000A52,\n    0x000500C7, 0x0000000B, 0x00002180, 0x0000520B, 0x00000A37, 0x000500C2,\n    0x0000000B, 0x00004994, 0x00003D0B, 0x00000A5E, 0x000500C7, 0x0000000B,\n    0x000023AA, 0x00004994, 0x00000A0D, 0x00050050, 0x00000011, 0x000022A7,\n    0x00005158, 0x00005158, 0x000500C2, 0x00000011, 0x000025A1, 0x000022A7,\n    0x00000883, 0x000500C7, 0x00000011, 0x00005C31, 0x000025A1, 0x000007A2,\n    0x000500C7, 0x0000000B, 0x00005DDE, 0x00003D0B, 0x00000510, 0x000500AB,\n    0x00000009, 0x00003007, 0x00005DDE, 0x00000A0A, 0x000300F7, 0x00003954,\n    0x00000000, 0x000400FA, 0x00003007, 0x00004163, 0x000055E8, 0x000200F8,\n    0x000055E8, 0x000200F9, 0x00003954, 0x000200F8, 0x00004163, 0x000500C2,\n    0x00000011, 0x00003BAE, 0x00005C31, 0x00000724, 0x000200F9, 0x00003954,\n    0x000200F8, 0x00003954, 0x000700F5, 0x00000011, 0x00004AB4, 0x00003BAE,\n    0x00004163, 0x0000070F, 0x000055E8, 0x000500C2, 0x00000011, 0x00001B7E,\n    0x000022A7, 0x0000073F, 0x000500C7, 0x00000011, 0x00002DF9, 0x00001B7E,\n    0x000007A3, 0x000500C4, 0x00000011, 0x00003F4F, 0x00002DF9, 0x0000074E,\n    0x00050084, 0x00000011, 0x000059EB, 0x00003F4F, 0x00005C31, 0x000500C2,\n    0x0000000B, 0x00003343, 0x00005158, 0x00000A19, 0x000500C7, 0x0000000B,\n    0x000039C1, 0x00003343, 0x00000A81, 0x00050051, 0x0000000B, 0x0000229A,\n    0x00005C31, 0x00000000, 0x00050084, 0x0000000B, 0x000059D1, 0x000039C1,\n    0x0000229A, 0x00050041, 0x00000288, 0x00004E44, 0x00000CE9, 0x00000A11,\n    0x0004003D, 0x0000000B, 0x000048C4, 0x00004E44, 0x00050041, 0x00000288,\n    0x000058AD, 0x00000CE9, 0x00000A14, 0x0004003D, 0x0000000B, 0x000051B7,\n    0x000058AD, 0x000500C7, 0x0000000B, 0x00004ADC, 0x000048C4, 0x00000A1F,\n    0x000500C7, 0x0000000B, 0x000055EF, 0x000048C4, 0x00000A22, 0x000500AB,\n    0x00000009, 0x0000500F, 0x000055EF, 0x00000A0A, 0x000500C2, 0x0000000B,\n    0x00002843, 0x000048C4, 0x00000A16, 0x000500C7, 0x0000000B, 0x00005F72,\n    0x00002843, 0x00000A1F, 0x000500C2, 0x0000000B, 0x00004CD8, 0x000048C4,\n    0x00000A1F, 0x000500C7, 0x0000000B, 0x00005093, 0x00004CD8, 0x00000AC7,\n    0x0004007C, 0x0000000C, 0x00005988, 0x000048C4, 0x000500C4, 0x0000000C,\n    0x0000358F, 0x00005988, 0x00000A29, 0x000500C3, 0x0000000C, 0x0000509C,\n    0x0000358F, 0x00000A59, 0x000500C4, 0x0000000C, 0x00004702, 0x0000509C,\n    0x00000A50, 0x00050080, 0x0000000C, 0x00001D26, 0x00004702, 0x00000089,\n    0x0004007C, 0x0000000D, 0x00002B2C, 0x00001D26, 0x000500C7, 0x0000000B,\n    0x00005879, 0x000048C4, 0x00000926, 0x000500AB, 0x00000009, 0x00001D33,\n    0x00005879, 0x00000A0A, 0x000500C7, 0x0000000B, 0x000020FC, 0x000051B7,\n    0x00000A44, 0x000500C2, 0x0000000B, 0x00002F90, 0x000051B7, 0x00000A28,\n    0x000500C7, 0x0000000B, 0x000061CE, 0x00002F90, 0x00000A44, 0x000500C4,\n    0x0000000B, 0x00006273, 0x000061CE, 0x00000A0E, 0x00050050, 0x00000011,\n    0x000028B6, 0x000051B7, 0x000051B7, 0x000500C2, 0x00000011, 0x00002891,\n    0x000028B6, 0x000008E3, 0x000500C7, 0x00000011, 0x00005B53, 0x00002891,\n    0x0000084A, 0x000500C4, 0x00000011, 0x00003F50, 0x00005B53, 0x0000074E,\n    0x00050084, 0x00000011, 0x000059EC, 0x00003F50, 0x00005C31, 0x000500C2,\n    0x0000000B, 0x000031C7, 0x000051B7, 0x00000A5E, 0x000500C7, 0x0000000B,\n    0x00004356, 0x000031C7, 0x00000A1F, 0x0004003D, 0x00000014, 0x000031C1,\n    0x00000F48, 0x0007004F, 0x00000011, 0x000038A4, 0x000031C1, 0x000031C1,\n    0x00000000, 0x00000001, 0x000500C4, 0x00000011, 0x00002EF9, 0x000038A4,\n    0x00000721, 0x00050051, 0x0000000B, 0x00001DD8, 0x00002EF9, 0x00000000,\n    0x000500C4, 0x0000000B, 0x00002D8A, 0x000059D1, 0x00000A13, 0x000500AE,\n    0x00000009, 0x00003C13, 0x00001DD8, 0x00002D8A, 0x000300F7, 0x000036C9,\n    0x00000002, 0x000400FA, 0x00003C13, 0x000055E9, 0x000036C9, 0x000200F8,\n    0x000055E9, 0x000200F9, 0x00004C7A, 0x000200F8, 0x000036C9, 0x00050051,\n    0x0000000B, 0x000048B7, 0x00002EF9, 0x00000001, 0x00050051, 0x0000000B,\n    0x000041A3, 0x00004AB4, 0x00000001, 0x0007000C, 0x0000000B, 0x00005F7E,\n    0x00000001, 0x00000029, 0x000048B7, 0x000041A3, 0x00050050, 0x00000011,\n    0x000051EF, 0x00001DD8, 0x00005F7E, 0x00050080, 0x00000011, 0x0000522C,\n    0x000051EF, 0x000059EB, 0x000500B2, 0x00000009, 0x00003ECB, 0x00004356,\n    0x00000A13, 0x000300F7, 0x00005CE0, 0x00000000, 0x000400FA, 0x00003ECB,\n    0x00002AEE, 0x00003AEF, 0x000200F8, 0x00003AEF, 0x000500AA, 0x00000009,\n    0x000034FE, 0x00004356, 0x00000A19, 0x000600A9, 0x0000000B, 0x000020F6,\n    0x000034FE, 0x00000A10, 0x00000A0A, 0x000200F9, 0x00005CE0, 0x000200F8,\n    0x00002AEE, 0x000200F9, 0x00005CE0, 0x000200F8, 0x00005CE0, 0x000700F5,\n    0x0000000B, 0x00004B64, 0x00004356, 0x00002AEE, 0x000020F6, 0x00003AEF,\n    0x00050050, 0x00000011, 0x000041BE, 0x0000217E, 0x0000217E, 0x000500AE,\n    0x0000000F, 0x00002E19, 0x000041BE, 0x0000072D, 0x000600A9, 0x00000011,\n    0x00004BB5, 0x00002E19, 0x00000724, 0x0000070F, 0x000500C4, 0x00000011,\n    0x00002AEA, 0x0000522C, 0x00004BB5, 0x00050050, 0x00000011, 0x0000605D,\n    0x00004B64, 0x00004B64, 0x000500C2, 0x00000011, 0x00002385, 0x0000605D,\n    0x00000718, 0x000500C7, 0x00000011, 0x00003EC8, 0x00002385, 0x00000724,\n    0x00050080, 0x00000011, 0x000046BA, 0x00002AEA, 0x00003EC8, 0x00050084,\n    0x00000011, 0x00005998, 0x00000A9F, 0x00005C31, 0x00050050, 0x00000011,\n    0x00002C44, 0x000023AA, 0x00000A0A, 0x000500C2, 0x00000011, 0x000019AB,\n    0x00005998, 0x00002C44, 0x00050086, 0x00000011, 0x000027A2, 0x000046BA,\n    0x000019AB, 0x00050051, 0x0000000B, 0x00004FA6, 0x000027A2, 0x00000001,\n    0x00050084, 0x0000000B, 0x00002B26, 0x00004FA6, 0x00005051, 0x00050051,\n    0x0000000B, 0x00006059, 0x000027A2, 0x00000000, 0x00050080, 0x0000000B,\n    0x00005420, 0x00002B26, 0x00006059, 0x00050080, 0x0000000B, 0x00002226,\n    0x0000217F, 0x00005420, 0x00050084, 0x00000011, 0x00005768, 0x000027A2,\n    0x000019AB, 0x00050082, 0x00000011, 0x000050EB, 0x000046BA, 0x00005768,\n    0x00050051, 0x0000000B, 0x00001C87, 0x00005998, 0x00000000, 0x00050051,\n    0x0000000B, 0x00005962, 0x00005998, 0x00000001, 0x00050084, 0x0000000B,\n    0x00003372, 0x00001C87, 0x00005962, 0x00050084, 0x0000000B, 0x000038D7,\n    0x00002226, 0x00003372, 0x00050051, 0x0000000B, 0x00001A95, 0x000050EB,\n    0x00000001, 0x00050051, 0x0000000B, 0x00005BE6, 0x000019AB, 0x00000000,\n    0x00050084, 0x0000000B, 0x00005966, 0x00001A95, 0x00005BE6, 0x00050051,\n    0x0000000B, 0x00001AE6, 0x000050EB, 0x00000000, 0x00050080, 0x0000000B,\n    0x000025E0, 0x00005966, 0x00001AE6, 0x000500C4, 0x0000000B, 0x00004665,\n    0x000025E0, 0x000023AA, 0x00050080, 0x0000000B, 0x000047BB, 0x000038D7,\n    0x00004665, 0x00050084, 0x0000000B, 0x00003662, 0x00003372, 0x00000A84,\n    0x00050089, 0x0000000B, 0x00005410, 0x000047BB, 0x00003662, 0x000500C4,\n    0x0000000B, 0x00001E06, 0x00005410, 0x00000A11, 0x000500AE, 0x00000009,\n    0x00003652, 0x0000217E, 0x00000A10, 0x000600A9, 0x0000000B, 0x00002C0D,\n    0x00003652, 0x00000A0D, 0x00000A0A, 0x00050080, 0x0000000B, 0x00004E6A,\n    0x000023AA, 0x00002C0D, 0x000500C4, 0x0000000B, 0x0000199B, 0x00000A16,\n    0x00004E6A, 0x000500AB, 0x00000009, 0x00005AEF, 0x000023AA, 0x00000A0A,\n    0x000300F7, 0x0000530F, 0x00000002, 0x000400FA, 0x00005AEF, 0x00003B65,\n    0x000040B9, 0x000200F8, 0x000040B9, 0x000500AA, 0x00000009, 0x00004ADA,\n    0x0000199B, 0x00000A16, 0x000300F7, 0x00004F49, 0x00000002, 0x000400FA,\n    0x00004ADA, 0x000019BF, 0x000022FF, 0x000200F8, 0x000022FF, 0x000500C2,\n    0x0000000B, 0x00005630, 0x00001E06, 0x00000A11, 0x00060041, 0x00000289,\n    0x00003439, 0x00000CC7, 0x00000A0B, 0x00005630, 0x0004003D, 0x0000000B,\n    0x00003AD4, 0x00003439, 0x00050080, 0x0000000B, 0x00002145, 0x00001E06,\n    0x0000199B, 0x000500C2, 0x0000000B, 0x000054A6, 0x00002145, 0x00000A11,\n    0x00060041, 0x00000289, 0x00004CDD, 0x00000CC7, 0x00000A0B, 0x000054A6,\n    0x0004003D, 0x0000000B, 0x0000333A, 0x00004CDD, 0x00050084, 0x0000000B,\n    0x000021ED, 0x00000A10, 0x0000199B, 0x00050080, 0x0000000B, 0x00005EBE,\n    0x00001E06, 0x000021ED, 0x000500C2, 0x0000000B, 0x000045E2, 0x00005EBE,\n    0x00000A11, 0x00060041, 0x00000289, 0x00004CDE, 0x00000CC7, 0x00000A0B,\n    0x000045E2, 0x0004003D, 0x0000000B, 0x0000333B, 0x00004CDE, 0x00050084,\n    0x0000000B, 0x000021EE, 0x00000A13, 0x0000199B, 0x00050080, 0x0000000B,\n    0x00005EBF, 0x00001E06, 0x000021EE, 0x000500C2, 0x0000000B, 0x000045E3,\n    0x00005EBF, 0x00000A11, 0x00060041, 0x00000289, 0x00004901, 0x00000CC7,\n    0x00000A0B, 0x000045E3, 0x0004003D, 0x0000000B, 0x00005F59, 0x00004901,\n    0x00070050, 0x00000017, 0x0000512C, 0x00003AD4, 0x0000333A, 0x0000333B,\n    0x00005F59, 0x000200F9, 0x00004F49, 0x000200F8, 0x000019BF, 0x000500C2,\n    0x0000000B, 0x00005FA6, 0x00001E06, 0x00000A11, 0x00060041, 0x00000289,\n    0x0000343A, 0x00000CC7, 0x00000A0B, 0x00005FA6, 0x0004003D, 0x0000000B,\n    0x00003141, 0x0000343A, 0x00050080, 0x0000000B, 0x00002DA7, 0x00005FA6,\n    0x00000A0D, 0x00060041, 0x00000289, 0x000018FF, 0x00000CC7, 0x00000A0B,\n    0x00002DA7, 0x0004003D, 0x0000000B, 0x00005C62, 0x000018FF, 0x00050080,\n    0x0000000B, 0x00002DA8, 0x00005FA6, 0x00000A10, 0x00060041, 0x00000289,\n    0x00001900, 0x00000CC7, 0x00000A0B, 0x00002DA8, 0x0004003D, 0x0000000B,\n    0x00005C63, 0x00001900, 0x00050080, 0x0000000B, 0x00002DA9, 0x00005FA6,\n    0x00000A13, 0x00060041, 0x00000289, 0x00005FEE, 0x00000CC7, 0x00000A0B,\n    0x00002DA9, 0x0004003D, 0x0000000B, 0x00003FFB, 0x00005FEE, 0x00070050,\n    0x00000017, 0x0000512D, 0x00003141, 0x00005C62, 0x00005C63, 0x00003FFB,\n    0x000200F9, 0x00004F49, 0x000200F8, 0x00004F49, 0x000700F5, 0x00000017,\n    0x00002ABF, 0x0000512D, 0x000019BF, 0x0000512C, 0x000022FF, 0x000300F7,\n    0x00003F60, 0x00000000, 0x001300FB, 0x00002180, 0x00004BFB, 0x00000000,\n    0x000038F9, 0x00000001, 0x000038F9, 0x00000002, 0x00001CBB, 0x0000000A,\n    0x00001CBB, 0x00000003, 0x00001CBA, 0x0000000C, 0x00001CBA, 0x00000004,\n    0x00001FFE, 0x00000006, 0x00002033, 0x000200F8, 0x00002033, 0x00050051,\n    0x0000000B, 0x00005F56, 0x00002ABF, 0x00000000, 0x0006000C, 0x00000013,\n    0x00006067, 0x00000001, 0x0000003E, 0x00005F56, 0x00050051, 0x0000000D,\n    0x00002762, 0x00006067, 0x00000000, 0x00050051, 0x0000000D, 0x00004446,\n    0x00006067, 0x00000001, 0x00070050, 0x0000001D, 0x0000390C, 0x00002762,\n    0x00004446, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x0000437A,\n    0x00002ABF, 0x00000001, 0x0006000C, 0x00000013, 0x0000466B, 0x00000001,\n    0x0000003E, 0x0000437A, 0x00050051, 0x0000000D, 0x00002763, 0x0000466B,\n    0x00000000, 0x00050051, 0x0000000D, 0x00004447, 0x0000466B, 0x00000001,\n    0x00070050, 0x0000001D, 0x0000390D, 0x00002763, 0x00004447, 0x00000A0C,\n    0x00000A0C, 0x00050051, 0x0000000B, 0x0000437B, 0x00002ABF, 0x00000002,\n    0x0006000C, 0x00000013, 0x0000466C, 0x00000001, 0x0000003E, 0x0000437B,\n    0x00050051, 0x0000000D, 0x00002764, 0x0000466C, 0x00000000, 0x00050051,\n    0x0000000D, 0x00004448, 0x0000466C, 0x00000001, 0x00070050, 0x0000001D,\n    0x0000390E, 0x00002764, 0x00004448, 0x00000A0C, 0x00000A0C, 0x00050051,\n    0x0000000B, 0x0000437C, 0x00002ABF, 0x00000003, 0x0006000C, 0x00000013,\n    0x0000466D, 0x00000001, 0x0000003E, 0x0000437C, 0x00050051, 0x0000000D,\n    0x00002765, 0x0000466D, 0x00000000, 0x00050051, 0x0000000D, 0x000050BE,\n    0x0000466D, 0x00000001, 0x00070050, 0x0000001D, 0x00002349, 0x00002765,\n    0x000050BE, 0x00000A0C, 0x00000A0C, 0x000200F9, 0x00003F60, 0x000200F8,\n    0x00001FFE, 0x00050051, 0x0000000B, 0x0000308B, 0x00002ABF, 0x00000000,\n    0x0004007C, 0x0000000C, 0x0000589D, 0x0000308B, 0x00050050, 0x00000012,\n    0x0000471A, 0x0000589D, 0x0000589D, 0x000500C4, 0x00000012, 0x000047AD,\n    0x0000471A, 0x000007A7, 0x000500C3, 0x00000012, 0x00003417, 0x000047AD,\n    0x00000867, 0x0004006F, 0x00000013, 0x00002A97, 0x00003417, 0x0005008E,\n    0x00000013, 0x00004747, 0x00002A97, 0x000007FE, 0x0007000C, 0x00000013,\n    0x00005E06, 0x00000001, 0x00000028, 0x00000049, 0x00004747, 0x00050051,\n    0x0000000D, 0x00005F0A, 0x00005E06, 0x00000000, 0x00050051, 0x0000000D,\n    0x00003CD4, 0x00005E06, 0x00000001, 0x00070050, 0x0000001D, 0x0000411E,\n    0x00005F0A, 0x00003CD4, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B,\n    0x00004C42, 0x00002ABF, 0x00000001, 0x0004007C, 0x0000000C, 0x00003EA1,\n    0x00004C42, 0x00050050, 0x00000012, 0x0000471B, 0x00003EA1, 0x00003EA1,\n    0x000500C4, 0x00000012, 0x000047AE, 0x0000471B, 0x000007A7, 0x000500C3,\n    0x00000012, 0x00003418, 0x000047AE, 0x00000867, 0x0004006F, 0x00000013,\n    0x00002A98, 0x00003418, 0x0005008E, 0x00000013, 0x00004748, 0x00002A98,\n    0x000007FE, 0x0007000C, 0x00000013, 0x00005E07, 0x00000001, 0x00000028,\n    0x00000049, 0x00004748, 0x00050051, 0x0000000D, 0x00005F0B, 0x00005E07,\n    0x00000000, 0x00050051, 0x0000000D, 0x00003CD5, 0x00005E07, 0x00000001,\n    0x00070050, 0x0000001D, 0x0000411F, 0x00005F0B, 0x00003CD5, 0x00000A0C,\n    0x00000A0C, 0x00050051, 0x0000000B, 0x00004C43, 0x00002ABF, 0x00000002,\n    0x0004007C, 0x0000000C, 0x00003EA2, 0x00004C43, 0x00050050, 0x00000012,\n    0x0000471C, 0x00003EA2, 0x00003EA2, 0x000500C4, 0x00000012, 0x000047AF,\n    0x0000471C, 0x000007A7, 0x000500C3, 0x00000012, 0x00003419, 0x000047AF,\n    0x00000867, 0x0004006F, 0x00000013, 0x00002A99, 0x00003419, 0x0005008E,\n    0x00000013, 0x00004749, 0x00002A99, 0x000007FE, 0x0007000C, 0x00000013,\n    0x00005E08, 0x00000001, 0x00000028, 0x00000049, 0x00004749, 0x00050051,\n    0x0000000D, 0x00005F0C, 0x00005E08, 0x00000000, 0x00050051, 0x0000000D,\n    0x00003CD6, 0x00005E08, 0x00000001, 0x00070050, 0x0000001D, 0x00004120,\n    0x00005F0C, 0x00003CD6, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B,\n    0x00004C44, 0x00002ABF, 0x00000003, 0x0004007C, 0x0000000C, 0x00003EA3,\n    0x00004C44, 0x00050050, 0x00000012, 0x0000471D, 0x00003EA3, 0x00003EA3,\n    0x000500C4, 0x00000012, 0x000047B0, 0x0000471D, 0x000007A7, 0x000500C3,\n    0x00000012, 0x0000341A, 0x000047B0, 0x00000867, 0x0004006F, 0x00000013,\n    0x00002A9A, 0x0000341A, 0x0005008E, 0x00000013, 0x0000474A, 0x00002A9A,\n    0x000007FE, 0x0007000C, 0x00000013, 0x00005E09, 0x00000001, 0x00000028,\n    0x00000049, 0x0000474A, 0x00050051, 0x0000000D, 0x00005F0D, 0x00005E09,\n    0x00000000, 0x00050051, 0x0000000D, 0x0000494C, 0x00005E09, 0x00000001,\n    0x00070050, 0x0000001D, 0x0000234A, 0x00005F0D, 0x0000494C, 0x00000A0C,\n    0x00000A0C, 0x000200F9, 0x00003F60, 0x000200F8, 0x00001CBA, 0x00050051,\n    0x0000000B, 0x000056BD, 0x00002ABF, 0x00000000, 0x00060050, 0x00000014,\n    0x00004F0A, 0x000056BD, 0x000056BD, 0x000056BD, 0x000500C2, 0x00000014,\n    0x00002B0D, 0x00004F0A, 0x00000BB4, 0x000500C7, 0x00000014, 0x00005DE6,\n    0x00002B0D, 0x00000105, 0x000500C7, 0x00000014, 0x0000489C, 0x00002B0D,\n    0x00000466, 0x000500C2, 0x00000014, 0x00005B90, 0x00005DE6, 0x00000B0C,\n    0x000500AA, 0x00000010, 0x000040C9, 0x00005B90, 0x00000A12, 0x0006000C,\n    0x00000016, 0x00002C4B, 0x00000001, 0x0000004B, 0x0000489C, 0x0004007C,\n    0x00000014, 0x00002A15, 0x00002C4B, 0x00050082, 0x00000014, 0x0000187A,\n    0x00000B0C, 0x00002A15, 0x00050080, 0x00000014, 0x00002210, 0x00002A15,\n    0x00000938, 0x000600A9, 0x00000014, 0x0000286F, 0x000040C9, 0x00002210,\n    0x00005B90, 0x000500C4, 0x00000014, 0x00005AD4, 0x0000489C, 0x0000187A,\n    0x000500C7, 0x00000014, 0x0000499A, 0x00005AD4, 0x00000466, 0x000600A9,\n    0x00000014, 0x00002A9D, 0x000040C9, 0x0000499A, 0x0000489C, 0x00050080,\n    0x00000014, 0x00005FF9, 0x0000286F, 0x000003FA, 0x000500C4, 0x00000014,\n    0x00004F7F, 0x00005FF9, 0x00000189, 0x000500C4, 0x00000014, 0x00003FA6,\n    0x00002A9D, 0x0000008D, 0x000500C5, 0x00000014, 0x0000577C, 0x00004F7F,\n    0x00003FA6, 0x000500AA, 0x00000010, 0x00003600, 0x00005DE6, 0x00000A12,\n    0x000600A9, 0x00000014, 0x00004242, 0x00003600, 0x00000A12, 0x0000577C,\n    0x0004007C, 0x00000018, 0x000029CF, 0x00004242, 0x000500C2, 0x0000000B,\n    0x00004BA4, 0x000056BD, 0x00000A64, 0x00040070, 0x0000000D, 0x0000480E,\n    0x00004BA4, 0x00050085, 0x0000000D, 0x00003E1F, 0x0000480E, 0x00000149,\n    0x00050051, 0x0000000D, 0x000053C2, 0x000029CF, 0x00000000, 0x00050051,\n    0x0000000D, 0x00002A55, 0x000029CF, 0x00000001, 0x00050051, 0x0000000D,\n    0x00001E99, 0x000029CF, 0x00000002, 0x00070050, 0x0000001D, 0x00003DDA,\n    0x000053C2, 0x00002A55, 0x00001E99, 0x00003E1F, 0x00050051, 0x0000000B,\n    0x000027F5, 0x00002ABF, 0x00000001, 0x00060050, 0x00000014, 0x0000350E,\n    0x000027F5, 0x000027F5, 0x000027F5, 0x000500C2, 0x00000014, 0x00002B0E,\n    0x0000350E, 0x00000BB4, 0x000500C7, 0x00000014, 0x00005DE7, 0x00002B0E,\n    0x00000105, 0x000500C7, 0x00000014, 0x0000489D, 0x00002B0E, 0x00000466,\n    0x000500C2, 0x00000014, 0x00005B91, 0x00005DE7, 0x00000B0C, 0x000500AA,\n    0x00000010, 0x000040CA, 0x00005B91, 0x00000A12, 0x0006000C, 0x00000016,\n    0x00002C4C, 0x00000001, 0x0000004B, 0x0000489D, 0x0004007C, 0x00000014,\n    0x00002A16, 0x00002C4C, 0x00050082, 0x00000014, 0x0000187B, 0x00000B0C,\n    0x00002A16, 0x00050080, 0x00000014, 0x00002211, 0x00002A16, 0x00000938,\n    0x000600A9, 0x00000014, 0x00002870, 0x000040CA, 0x00002211, 0x00005B91,\n    0x000500C4, 0x00000014, 0x00005AD5, 0x0000489D, 0x0000187B, 0x000500C7,\n    0x00000014, 0x0000499B, 0x00005AD5, 0x00000466, 0x000600A9, 0x00000014,\n    0x00002A9E, 0x000040CA, 0x0000499B, 0x0000489D, 0x00050080, 0x00000014,\n    0x00005FFA, 0x00002870, 0x000003FA, 0x000500C4, 0x00000014, 0x00004F80,\n    0x00005FFA, 0x00000189, 0x000500C4, 0x00000014, 0x00003FA7, 0x00002A9E,\n    0x0000008D, 0x000500C5, 0x00000014, 0x0000577D, 0x00004F80, 0x00003FA7,\n    0x000500AA, 0x00000010, 0x00003601, 0x00005DE7, 0x00000A12, 0x000600A9,\n    0x00000014, 0x00004243, 0x00003601, 0x00000A12, 0x0000577D, 0x0004007C,\n    0x00000018, 0x000029D0, 0x00004243, 0x000500C2, 0x0000000B, 0x00004BA5,\n    0x000027F5, 0x00000A64, 0x00040070, 0x0000000D, 0x0000480F, 0x00004BA5,\n    0x00050085, 0x0000000D, 0x00003E20, 0x0000480F, 0x00000149, 0x00050051,\n    0x0000000D, 0x000053C3, 0x000029D0, 0x00000000, 0x00050051, 0x0000000D,\n    0x00002A56, 0x000029D0, 0x00000001, 0x00050051, 0x0000000D, 0x00001E9A,\n    0x000029D0, 0x00000002, 0x00070050, 0x0000001D, 0x00003DDB, 0x000053C3,\n    0x00002A56, 0x00001E9A, 0x00003E20, 0x00050051, 0x0000000B, 0x000027F6,\n    0x00002ABF, 0x00000002, 0x00060050, 0x00000014, 0x0000350F, 0x000027F6,\n    0x000027F6, 0x000027F6, 0x000500C2, 0x00000014, 0x00002B0F, 0x0000350F,\n    0x00000BB4, 0x000500C7, 0x00000014, 0x00005DE8, 0x00002B0F, 0x00000105,\n    0x000500C7, 0x00000014, 0x0000489E, 0x00002B0F, 0x00000466, 0x000500C2,\n    0x00000014, 0x00005B92, 0x00005DE8, 0x00000B0C, 0x000500AA, 0x00000010,\n    0x000040CB, 0x00005B92, 0x00000A12, 0x0006000C, 0x00000016, 0x00002C4D,\n    0x00000001, 0x0000004B, 0x0000489E, 0x0004007C, 0x00000014, 0x00002A17,\n    0x00002C4D, 0x00050082, 0x00000014, 0x0000187C, 0x00000B0C, 0x00002A17,\n    0x00050080, 0x00000014, 0x00002212, 0x00002A17, 0x00000938, 0x000600A9,\n    0x00000014, 0x00002871, 0x000040CB, 0x00002212, 0x00005B92, 0x000500C4,\n    0x00000014, 0x00005AD6, 0x0000489E, 0x0000187C, 0x000500C7, 0x00000014,\n    0x0000499C, 0x00005AD6, 0x00000466, 0x000600A9, 0x00000014, 0x00002A9F,\n    0x000040CB, 0x0000499C, 0x0000489E, 0x00050080, 0x00000014, 0x00005FFB,\n    0x00002871, 0x000003FA, 0x000500C4, 0x00000014, 0x00004F81, 0x00005FFB,\n    0x00000189, 0x000500C4, 0x00000014, 0x00003FA8, 0x00002A9F, 0x0000008D,\n    0x000500C5, 0x00000014, 0x0000577E, 0x00004F81, 0x00003FA8, 0x000500AA,\n    0x00000010, 0x00003602, 0x00005DE8, 0x00000A12, 0x000600A9, 0x00000014,\n    0x00004244, 0x00003602, 0x00000A12, 0x0000577E, 0x0004007C, 0x00000018,\n    0x000029D1, 0x00004244, 0x000500C2, 0x0000000B, 0x00004BA6, 0x000027F6,\n    0x00000A64, 0x00040070, 0x0000000D, 0x00004810, 0x00004BA6, 0x00050085,\n    0x0000000D, 0x00003E21, 0x00004810, 0x00000149, 0x00050051, 0x0000000D,\n    0x000053C4, 0x000029D1, 0x00000000, 0x00050051, 0x0000000D, 0x00002A57,\n    0x000029D1, 0x00000001, 0x00050051, 0x0000000D, 0x00001E9B, 0x000029D1,\n    0x00000002, 0x00070050, 0x0000001D, 0x00003DDC, 0x000053C4, 0x00002A57,\n    0x00001E9B, 0x00003E21, 0x00050051, 0x0000000B, 0x000027F7, 0x00002ABF,\n    0x00000003, 0x00060050, 0x00000014, 0x00003510, 0x000027F7, 0x000027F7,\n    0x000027F7, 0x000500C2, 0x00000014, 0x00002B10, 0x00003510, 0x00000BB4,\n    0x000500C7, 0x00000014, 0x00005DE9, 0x00002B10, 0x00000105, 0x000500C7,\n    0x00000014, 0x0000489F, 0x00002B10, 0x00000466, 0x000500C2, 0x00000014,\n    0x00005B93, 0x00005DE9, 0x00000B0C, 0x000500AA, 0x00000010, 0x000040CC,\n    0x00005B93, 0x00000A12, 0x0006000C, 0x00000016, 0x00002C4E, 0x00000001,\n    0x0000004B, 0x0000489F, 0x0004007C, 0x00000014, 0x00002A18, 0x00002C4E,\n    0x00050082, 0x00000014, 0x0000187D, 0x00000B0C, 0x00002A18, 0x00050080,\n    0x00000014, 0x00002213, 0x00002A18, 0x00000938, 0x000600A9, 0x00000014,\n    0x00002872, 0x000040CC, 0x00002213, 0x00005B93, 0x000500C4, 0x00000014,\n    0x00005AD7, 0x0000489F, 0x0000187D, 0x000500C7, 0x00000014, 0x0000499D,\n    0x00005AD7, 0x00000466, 0x000600A9, 0x00000014, 0x00002AA0, 0x000040CC,\n    0x0000499D, 0x0000489F, 0x00050080, 0x00000014, 0x00005FFC, 0x00002872,\n    0x000003FA, 0x000500C4, 0x00000014, 0x00004F82, 0x00005FFC, 0x00000189,\n    0x000500C4, 0x00000014, 0x00003FA9, 0x00002AA0, 0x0000008D, 0x000500C5,\n    0x00000014, 0x0000577F, 0x00004F82, 0x00003FA9, 0x000500AA, 0x00000010,\n    0x00003603, 0x00005DE9, 0x00000A12, 0x000600A9, 0x00000014, 0x00004245,\n    0x00003603, 0x00000A12, 0x0000577F, 0x0004007C, 0x00000018, 0x000029D2,\n    0x00004245, 0x000500C2, 0x0000000B, 0x00004BA7, 0x000027F7, 0x00000A64,\n    0x00040070, 0x0000000D, 0x00004811, 0x00004BA7, 0x00050085, 0x0000000D,\n    0x00003E22, 0x00004811, 0x00000149, 0x00050051, 0x0000000D, 0x000053C5,\n    0x000029D2, 0x00000000, 0x00050051, 0x0000000D, 0x00002A58, 0x000029D2,\n    0x00000001, 0x00050051, 0x0000000D, 0x00002B11, 0x000029D2, 0x00000002,\n    0x00070050, 0x0000001D, 0x0000234B, 0x000053C5, 0x00002A58, 0x00002B11,\n    0x00003E22, 0x000200F9, 0x00003F60, 0x000200F8, 0x00001CBB, 0x00050051,\n    0x0000000B, 0x000056BE, 0x00002ABF, 0x00000000, 0x00070050, 0x00000017,\n    0x00004F0B, 0x000056BE, 0x000056BE, 0x000056BE, 0x000056BE, 0x000500C2,\n    0x00000017, 0x00002498, 0x00004F0B, 0x0000034D, 0x000500C7, 0x00000017,\n    0x000049AB, 0x00002498, 0x0000027B, 0x00040070, 0x0000001D, 0x00003CB7,\n    0x000049AB, 0x00050085, 0x0000001D, 0x00004130, 0x00003CB7, 0x00000AEE,\n    0x00050051, 0x0000000B, 0x00005CD2, 0x00002ABF, 0x00000001, 0x00070050,\n    0x00000017, 0x0000514D, 0x00005CD2, 0x00005CD2, 0x00005CD2, 0x00005CD2,\n    0x000500C2, 0x00000017, 0x00002499, 0x0000514D, 0x0000034D, 0x000500C7,\n    0x00000017, 0x000049AC, 0x00002499, 0x0000027B, 0x00040070, 0x0000001D,\n    0x00003CB8, 0x000049AC, 0x00050085, 0x0000001D, 0x00004131, 0x00003CB8,\n    0x00000AEE, 0x00050051, 0x0000000B, 0x00005CD3, 0x00002ABF, 0x00000002,\n    0x00070050, 0x00000017, 0x0000514E, 0x00005CD3, 0x00005CD3, 0x00005CD3,\n    0x00005CD3, 0x000500C2, 0x00000017, 0x0000249A, 0x0000514E, 0x0000034D,\n    0x000500C7, 0x00000017, 0x000049AD, 0x0000249A, 0x0000027B, 0x00040070,\n    0x0000001D, 0x00003CB9, 0x000049AD, 0x00050085, 0x0000001D, 0x00004132,\n    0x00003CB9, 0x00000AEE, 0x00050051, 0x0000000B, 0x00005CD4, 0x00002ABF,\n    0x00000003, 0x00070050, 0x00000017, 0x0000514F, 0x00005CD4, 0x00005CD4,\n    0x00005CD4, 0x00005CD4, 0x000500C2, 0x00000017, 0x0000249B, 0x0000514F,\n    0x0000034D, 0x000500C7, 0x00000017, 0x000049AE, 0x0000249B, 0x0000027B,\n    0x00040070, 0x0000001D, 0x0000492F, 0x000049AE, 0x00050085, 0x0000001D,\n    0x0000269F, 0x0000492F, 0x00000AEE, 0x000200F9, 0x00003F60, 0x000200F8,\n    0x000038F9, 0x00050051, 0x0000000B, 0x000056BF, 0x00002ABF, 0x00000000,\n    0x00070050, 0x00000017, 0x00004F0C, 0x000056BF, 0x000056BF, 0x000056BF,\n    0x000056BF, 0x000500C2, 0x00000017, 0x0000249C, 0x00004F0C, 0x0000028D,\n    0x000500C7, 0x00000017, 0x00004A56, 0x0000249C, 0x0000064B, 0x00040070,\n    0x0000001D, 0x000036A2, 0x00004A56, 0x0005008E, 0x0000001D, 0x00004B23,\n    0x000036A2, 0x0000017A, 0x00050051, 0x0000000B, 0x0000219F, 0x00002ABF,\n    0x00000001, 0x00070050, 0x00000017, 0x0000610B, 0x0000219F, 0x0000219F,\n    0x0000219F, 0x0000219F, 0x000500C2, 0x00000017, 0x0000249D, 0x0000610B,\n    0x0000028D, 0x000500C7, 0x00000017, 0x00004A57, 0x0000249D, 0x0000064B,\n    0x00040070, 0x0000001D, 0x000036A3, 0x00004A57, 0x0005008E, 0x0000001D,\n    0x00004B24, 0x000036A3, 0x0000017A, 0x00050051, 0x0000000B, 0x000021A0,\n    0x00002ABF, 0x00000002, 0x00070050, 0x00000017, 0x0000610C, 0x000021A0,\n    0x000021A0, 0x000021A0, 0x000021A0, 0x000500C2, 0x00000017, 0x0000249E,\n    0x0000610C, 0x0000028D, 0x000500C7, 0x00000017, 0x00004A58, 0x0000249E,\n    0x0000064B, 0x00040070, 0x0000001D, 0x000036A4, 0x00004A58, 0x0005008E,\n    0x0000001D, 0x00004B25, 0x000036A4, 0x0000017A, 0x00050051, 0x0000000B,\n    0x000021A1, 0x00002ABF, 0x00000003, 0x00070050, 0x00000017, 0x0000610D,\n    0x000021A1, 0x000021A1, 0x000021A1, 0x000021A1, 0x000500C2, 0x00000017,\n    0x0000249F, 0x0000610D, 0x0000028D, 0x000500C7, 0x00000017, 0x00004A59,\n    0x0000249F, 0x0000064B, 0x00040070, 0x0000001D, 0x0000431A, 0x00004A59,\n    0x0005008E, 0x0000001D, 0x00003092, 0x0000431A, 0x0000017A, 0x000200F9,\n    0x00003F60, 0x000200F8, 0x00004BFB, 0x00050051, 0x0000000B, 0x0000308C,\n    0x00002ABF, 0x00000000, 0x0004007C, 0x0000000D, 0x00004FEE, 0x0000308C,\n    0x00050050, 0x00000013, 0x00004336, 0x00004FEE, 0x00000A0C, 0x0009004F,\n    0x0000001D, 0x00002D90, 0x00004336, 0x00004336, 0x00000000, 0x00000001,\n    0x00000001, 0x00000001, 0x00050051, 0x0000000B, 0x000056B1, 0x00002ABF,\n    0x00000001, 0x0004007C, 0x0000000D, 0x00003F68, 0x000056B1, 0x00050050,\n    0x00000013, 0x00004337, 0x00003F68, 0x00000A0C, 0x0009004F, 0x0000001D,\n    0x00002D91, 0x00004337, 0x00004337, 0x00000000, 0x00000001, 0x00000001,\n    0x00000001, 0x00050051, 0x0000000B, 0x000056B2, 0x00002ABF, 0x00000002,\n    0x0004007C, 0x0000000D, 0x00003F69, 0x000056B2, 0x00050050, 0x00000013,\n    0x00004338, 0x00003F69, 0x00000A0C, 0x0009004F, 0x0000001D, 0x00002D92,\n    0x00004338, 0x00004338, 0x00000000, 0x00000001, 0x00000001, 0x00000001,\n    0x00050051, 0x0000000B, 0x000056B3, 0x00002ABF, 0x00000003, 0x0004007C,\n    0x0000000D, 0x00003F6A, 0x000056B3, 0x00050050, 0x00000013, 0x00004FAE,\n    0x00003F6A, 0x00000A0C, 0x0009004F, 0x0000001D, 0x00005A3A, 0x00004FAE,\n    0x00004FAE, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x000200F9,\n    0x00003F60, 0x000200F8, 0x00003F60, 0x000F00F5, 0x0000001D, 0x00002BA7,\n    0x00005A3A, 0x00004BFB, 0x00003092, 0x000038F9, 0x0000269F, 0x00001CBB,\n    0x0000234B, 0x00001CBA, 0x0000234A, 0x00001FFE, 0x00002349, 0x00002033,\n    0x000F00F5, 0x0000001D, 0x00003808, 0x00002D92, 0x00004BFB, 0x00004B25,\n    0x000038F9, 0x00004132, 0x00001CBB, 0x00003DDC, 0x00001CBA, 0x00004120,\n    0x00001FFE, 0x0000390E, 0x00002033, 0x000F00F5, 0x0000001D, 0x00003B7D,\n    0x00002D91, 0x00004BFB, 0x00004B24, 0x000038F9, 0x00004131, 0x00001CBB,\n    0x00003DDB, 0x00001CBA, 0x0000411F, 0x00001FFE, 0x0000390D, 0x00002033,\n    0x000F00F5, 0x0000001D, 0x000038B6, 0x00002D90, 0x00004BFB, 0x00004B23,\n    0x000038F9, 0x00004130, 0x00001CBB, 0x00003DDA, 0x00001CBA, 0x0000411E,\n    0x00001FFE, 0x0000390C, 0x00002033, 0x000200F9, 0x0000530F, 0x000200F8,\n    0x00003B65, 0x000500AA, 0x00000009, 0x00005450, 0x0000199B, 0x00000A22,\n    0x000300F7, 0x00004F23, 0x00000002, 0x000400FA, 0x00005450, 0x000019C0,\n    0x00002300, 0x000200F8, 0x00002300, 0x000500C2, 0x0000000B, 0x00005631,\n    0x00001E06, 0x00000A11, 0x00060041, 0x00000289, 0x0000343B, 0x00000CC7,\n    0x00000A0B, 0x00005631, 0x0004003D, 0x0000000B, 0x00003142, 0x0000343B,\n    0x00050080, 0x0000000B, 0x00002DAA, 0x00005631, 0x00000A0D, 0x00060041,\n    0x00000289, 0x00001901, 0x00000CC7, 0x00000A0B, 0x00002DAA, 0x0004003D,\n    0x0000000B, 0x00001B76, 0x00001901, 0x00050080, 0x0000000B, 0x00002146,\n    0x00001E06, 0x0000199B, 0x000500C2, 0x0000000B, 0x000054A7, 0x00002146,\n    0x00000A11, 0x00060041, 0x00000289, 0x00004C91, 0x00000CC7, 0x00000A0B,\n    0x000054A7, 0x0004003D, 0x0000000B, 0x00003143, 0x00004C91, 0x00050080,\n    0x0000000B, 0x00002DAB, 0x000054A7, 0x00000A0D, 0x00060041, 0x00000289,\n    0x00005FEF, 0x00000CC7, 0x00000A0B, 0x00002DAB, 0x0004003D, 0x0000000B,\n    0x0000374C, 0x00005FEF, 0x00070050, 0x00000017, 0x00004CD6, 0x00003142,\n    0x00001B76, 0x00003143, 0x0000374C, 0x00050084, 0x0000000B, 0x00004C2B,\n    0x00000A10, 0x0000199B, 0x00050080, 0x0000000B, 0x00002A45, 0x00001E06,\n    0x00004C2B, 0x000500C2, 0x0000000B, 0x000045E4, 0x00002A45, 0x00000A11,\n    0x00060041, 0x00000289, 0x00004C92, 0x00000CC7, 0x00000A0B, 0x000045E4,\n    0x0004003D, 0x0000000B, 0x00003144, 0x00004C92, 0x00050080, 0x0000000B,\n    0x00002DAC, 0x000045E4, 0x00000A0D, 0x00060041, 0x00000289, 0x0000194B,\n    0x00000CC7, 0x00000A0B, 0x00002DAC, 0x0004003D, 0x0000000B, 0x00005E5B,\n    0x0000194B, 0x00050084, 0x0000000B, 0x000021EF, 0x00000A13, 0x0000199B,\n    0x00050080, 0x0000000B, 0x00005EC0, 0x00001E06, 0x000021EF, 0x000500C2,\n    0x0000000B, 0x000045E5, 0x00005EC0, 0x00000A11, 0x00060041, 0x00000289,\n    0x00004C93, 0x00000CC7, 0x00000A0B, 0x000045E5, 0x0004003D, 0x0000000B,\n    0x00003145, 0x00004C93, 0x00050080, 0x0000000B, 0x00002DAD, 0x000045E5,\n    0x00000A0D, 0x00060041, 0x00000289, 0x00005FF0, 0x00000CC7, 0x00000A0B,\n    0x00002DAD, 0x0004003D, 0x0000000B, 0x00003FFC, 0x00005FF0, 0x00070050,\n    0x00000017, 0x0000512E, 0x00003144, 0x00005E5B, 0x00003145, 0x00003FFC,\n    0x000200F9, 0x00004F23, 0x000200F8, 0x000019C0, 0x000500C2, 0x0000000B,\n    0x00005FA7, 0x00001E06, 0x00000A11, 0x00060041, 0x00000289, 0x0000343C,\n    0x00000CC7, 0x00000A0B, 0x00005FA7, 0x0004003D, 0x0000000B, 0x00003146,\n    0x0000343C, 0x00050080, 0x0000000B, 0x00002DAE, 0x00005FA7, 0x00000A0D,\n    0x00060041, 0x00000289, 0x00001902, 0x00000CC7, 0x00000A0B, 0x00002DAE,\n    0x0004003D, 0x0000000B, 0x00005C64, 0x00001902, 0x00050080, 0x0000000B,\n    0x00002DAF, 0x00005FA7, 0x00000A10, 0x00060041, 0x00000289, 0x00001903,\n    0x00000CC7, 0x00000A0B, 0x00002DAF, 0x0004003D, 0x0000000B, 0x00005C65,\n    0x00001903, 0x00050080, 0x0000000B, 0x00002DB0, 0x00005FA7, 0x00000A13,\n    0x00060041, 0x00000289, 0x00005FF1, 0x00000CC7, 0x00000A0B, 0x00002DB0,\n    0x0004003D, 0x0000000B, 0x00003700, 0x00005FF1, 0x00070050, 0x00000017,\n    0x00005470, 0x00003146, 0x00005C64, 0x00005C65, 0x00003700, 0x00050080,\n    0x0000000B, 0x00004B83, 0x00001E06, 0x00000A3A, 0x000500C2, 0x0000000B,\n    0x0000202D, 0x00004B83, 0x00000A11, 0x00060041, 0x00000289, 0x00004C94,\n    0x00000CC7, 0x00000A0B, 0x0000202D, 0x0004003D, 0x0000000B, 0x00003147,\n    0x00004C94, 0x00050080, 0x0000000B, 0x00002DB1, 0x0000202D, 0x00000A0D,\n    0x00060041, 0x00000289, 0x00001904, 0x00000CC7, 0x00000A0B, 0x00002DB1,\n    0x0004003D, 0x0000000B, 0x00005C66, 0x00001904, 0x00050080, 0x0000000B,\n    0x00002DB2, 0x0000202D, 0x00000A10, 0x00060041, 0x00000289, 0x00001905,\n    0x00000CC7, 0x00000A0B, 0x00002DB2, 0x0004003D, 0x0000000B, 0x00005C67,\n    0x00001905, 0x00050080, 0x0000000B, 0x00002DB3, 0x0000202D, 0x00000A13,\n    0x00060041, 0x00000289, 0x00005FF2, 0x00000CC7, 0x00000A0B, 0x00002DB3,\n    0x0004003D, 0x0000000B, 0x00003FFD, 0x00005FF2, 0x00070050, 0x00000017,\n    0x0000512F, 0x00003147, 0x00005C66, 0x00005C67, 0x00003FFD, 0x000200F9,\n    0x00004F23, 0x000200F8, 0x00004F23, 0x000700F5, 0x00000017, 0x00002BCD,\n    0x0000512F, 0x000019C0, 0x0000512E, 0x00002300, 0x000700F5, 0x00000017,\n    0x00003720, 0x00005470, 0x000019C0, 0x00004CD6, 0x00002300, 0x000300F7,\n    0x00004F24, 0x00000000, 0x000700FB, 0x00002180, 0x00004F56, 0x00000005,\n    0x00002158, 0x00000007, 0x00002034, 0x000200F8, 0x00002034, 0x00050051,\n    0x0000000B, 0x00005F57, 0x00003720, 0x00000000, 0x0006000C, 0x00000013,\n    0x00006068, 0x00000001, 0x0000003E, 0x00005F57, 0x00050051, 0x0000000D,\n    0x00002775, 0x00006068, 0x00000000, 0x00050051, 0x0000000D, 0x00003EB8,\n    0x00006068, 0x00000001, 0x00050051, 0x0000000B, 0x00004281, 0x00003720,\n    0x00000001, 0x0006000C, 0x00000013, 0x00003CF5, 0x00000001, 0x0000003E,\n    0x00004281, 0x00050051, 0x0000000D, 0x00002766, 0x00003CF5, 0x00000000,\n    0x00050051, 0x0000000D, 0x00004449, 0x00003CF5, 0x00000001, 0x00070050,\n    0x0000001D, 0x0000390F, 0x00002775, 0x00003EB8, 0x00002766, 0x00004449,\n    0x00050051, 0x0000000B, 0x0000437D, 0x00003720, 0x00000002, 0x0006000C,\n    0x00000013, 0x0000466E, 0x00000001, 0x0000003E, 0x0000437D, 0x00050051,\n    0x0000000D, 0x00002776, 0x0000466E, 0x00000000, 0x00050051, 0x0000000D,\n    0x00003EB9, 0x0000466E, 0x00000001, 0x00050051, 0x0000000B, 0x00004282,\n    0x00003720, 0x00000003, 0x0006000C, 0x00000013, 0x00003CF6, 0x00000001,\n    0x0000003E, 0x00004282, 0x00050051, 0x0000000D, 0x00002767, 0x00003CF6,\n    0x00000000, 0x00050051, 0x0000000D, 0x0000444A, 0x00003CF6, 0x00000001,\n    0x00070050, 0x0000001D, 0x00003910, 0x00002776, 0x00003EB9, 0x00002767,\n    0x0000444A, 0x00050051, 0x0000000B, 0x0000437E, 0x00002BCD, 0x00000000,\n    0x0006000C, 0x00000013, 0x0000466F, 0x00000001, 0x0000003E, 0x0000437E,\n    0x00050051, 0x0000000D, 0x00002777, 0x0000466F, 0x00000000, 0x00050051,\n    0x0000000D, 0x00003EBA, 0x0000466F, 0x00000001, 0x00050051, 0x0000000B,\n    0x00004283, 0x00002BCD, 0x00000001, 0x0006000C, 0x00000013, 0x00003CF7,\n    0x00000001, 0x0000003E, 0x00004283, 0x00050051, 0x0000000D, 0x00002768,\n    0x00003CF7, 0x00000000, 0x00050051, 0x0000000D, 0x0000444B, 0x00003CF7,\n    0x00000001, 0x00070050, 0x0000001D, 0x00003911, 0x00002777, 0x00003EBA,\n    0x00002768, 0x0000444B, 0x00050051, 0x0000000B, 0x0000437F, 0x00002BCD,\n    0x00000002, 0x0006000C, 0x00000013, 0x00004670, 0x00000001, 0x0000003E,\n    0x0000437F, 0x00050051, 0x0000000D, 0x00002778, 0x00004670, 0x00000000,\n    0x00050051, 0x0000000D, 0x00003EBB, 0x00004670, 0x00000001, 0x00050051,\n    0x0000000B, 0x00004284, 0x00002BCD, 0x00000003, 0x0006000C, 0x00000013,\n    0x00003CF8, 0x00000001, 0x0000003E, 0x00004284, 0x00050051, 0x0000000D,\n    0x00002769, 0x00003CF8, 0x00000000, 0x00050051, 0x0000000D, 0x000050BF,\n    0x00003CF8, 0x00000001, 0x00070050, 0x0000001D, 0x0000234C, 0x00002778,\n    0x00003EBB, 0x00002769, 0x000050BF, 0x000200F9, 0x00004F24, 0x000200F8,\n    0x00002158, 0x0007004F, 0x00000011, 0x000025FB, 0x00003720, 0x00003720,\n    0x00000000, 0x00000001, 0x0004007C, 0x00000012, 0x00005B3C, 0x000025FB,\n    0x0009004F, 0x0000001A, 0x000060CE, 0x00005B3C, 0x00005B3C, 0x00000000,\n    0x00000000, 0x00000001, 0x00000001, 0x000500C4, 0x0000001A, 0x000048A6,\n    0x000060CE, 0x00000122, 0x000500C3, 0x0000001A, 0x00003D8D, 0x000048A6,\n    0x00000302, 0x0004006F, 0x0000001D, 0x00002A9B, 0x00003D8D, 0x0005008E,\n    0x0000001D, 0x00004721, 0x00002A9B, 0x000007FE, 0x0007000C, 0x0000001D,\n    0x00006291, 0x00000001, 0x00000028, 0x00000504, 0x00004721, 0x0007004F,\n    0x00000011, 0x0000376B, 0x00003720, 0x00003720, 0x00000002, 0x00000003,\n    0x0004007C, 0x00000012, 0x000024BF, 0x0000376B, 0x0009004F, 0x0000001A,\n    0x000060CF, 0x000024BF, 0x000024BF, 0x00000000, 0x00000000, 0x00000001,\n    0x00000001, 0x000500C4, 0x0000001A, 0x000048A7, 0x000060CF, 0x00000122,\n    0x000500C3, 0x0000001A, 0x00003D8E, 0x000048A7, 0x00000302, 0x0004006F,\n    0x0000001D, 0x00002A9C, 0x00003D8E, 0x0005008E, 0x0000001D, 0x00004722,\n    0x00002A9C, 0x000007FE, 0x0007000C, 0x0000001D, 0x00006292, 0x00000001,\n    0x00000028, 0x00000504, 0x00004722, 0x0007004F, 0x00000011, 0x0000376C,\n    0x00002BCD, 0x00002BCD, 0x00000000, 0x00000001, 0x0004007C, 0x00000012,\n    0x000024C0, 0x0000376C, 0x0009004F, 0x0000001A, 0x000060D0, 0x000024C0,\n    0x000024C0, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x000500C4,\n    0x0000001A, 0x000048A8, 0x000060D0, 0x00000122, 0x000500C3, 0x0000001A,\n    0x00003D8F, 0x000048A8, 0x00000302, 0x0004006F, 0x0000001D, 0x00002AA1,\n    0x00003D8F, 0x0005008E, 0x0000001D, 0x00004723, 0x00002AA1, 0x000007FE,\n    0x0007000C, 0x0000001D, 0x00006293, 0x00000001, 0x00000028, 0x00000504,\n    0x00004723, 0x0007004F, 0x00000011, 0x0000376D, 0x00002BCD, 0x00002BCD,\n    0x00000002, 0x00000003, 0x0004007C, 0x00000012, 0x000024C1, 0x0000376D,\n    0x0009004F, 0x0000001A, 0x000060D1, 0x000024C1, 0x000024C1, 0x00000000,\n    0x00000000, 0x00000001, 0x00000001, 0x000500C4, 0x0000001A, 0x000048A9,\n    0x000060D1, 0x00000122, 0x000500C3, 0x0000001A, 0x00003D90, 0x000048A9,\n    0x00000302, 0x0004006F, 0x0000001D, 0x00002AA2, 0x00003D90, 0x0005008E,\n    0x0000001D, 0x000053BF, 0x00002AA2, 0x000007FE, 0x0007000C, 0x0000001D,\n    0x00004362, 0x00000001, 0x00000028, 0x00000504, 0x000053BF, 0x000200F9,\n    0x00004F24, 0x000200F8, 0x00004F56, 0x0007004F, 0x00000011, 0x00002621,\n    0x00003720, 0x00003720, 0x00000000, 0x00000001, 0x0004007C, 0x00000013,\n    0x00005159, 0x00002621, 0x00050051, 0x0000000D, 0x00001B7B, 0x00005159,\n    0x00000000, 0x00050051, 0x0000000D, 0x0000346A, 0x00005159, 0x00000001,\n    0x00070050, 0x0000001D, 0x00004278, 0x00001B7B, 0x0000346A, 0x00000A0C,\n    0x00000A0C, 0x0007004F, 0x00000011, 0x000041D8, 0x00003720, 0x00003720,\n    0x00000002, 0x00000003, 0x0004007C, 0x00000013, 0x0000375D, 0x000041D8,\n    0x00050051, 0x0000000D, 0x00001B7C, 0x0000375D, 0x00000000, 0x00050051,\n    0x0000000D, 0x0000346B, 0x0000375D, 0x00000001, 0x00070050, 0x0000001D,\n    0x00004279, 0x00001B7C, 0x0000346B, 0x00000A0C, 0x00000A0C, 0x0007004F,\n    0x00000011, 0x000041D9, 0x00002BCD, 0x00002BCD, 0x00000000, 0x00000001,\n    0x0004007C, 0x00000013, 0x0000375E, 0x000041D9, 0x00050051, 0x0000000D,\n    0x00001B7D, 0x0000375E, 0x00000000, 0x00050051, 0x0000000D, 0x0000346C,\n    0x0000375E, 0x00000001, 0x00070050, 0x0000001D, 0x0000427A, 0x00001B7D,\n    0x0000346C, 0x00000A0C, 0x00000A0C, 0x0007004F, 0x00000011, 0x000041DA,\n    0x00002BCD, 0x00002BCD, 0x00000002, 0x00000003, 0x0004007C, 0x00000013,\n    0x0000375F, 0x000041DA, 0x00050051, 0x0000000D, 0x00001B7F, 0x0000375F,\n    0x00000000, 0x00050051, 0x0000000D, 0x00004108, 0x0000375F, 0x00000001,\n    0x00070050, 0x0000001D, 0x0000234D, 0x00001B7F, 0x00004108, 0x00000A0C,\n    0x00000A0C, 0x000200F9, 0x00004F24, 0x000200F8, 0x00004F24, 0x000900F5,\n    0x0000001D, 0x00002BA8, 0x0000234D, 0x00004F56, 0x00004362, 0x00002158,\n    0x0000234C, 0x00002034, 0x000900F5, 0x0000001D, 0x00003809, 0x0000427A,\n    0x00004F56, 0x00006293, 0x00002158, 0x00003911, 0x00002034, 0x000900F5,\n    0x0000001D, 0x00003B7E, 0x00004279, 0x00004F56, 0x00006292, 0x00002158,\n    0x00003910, 0x00002034, 0x000900F5, 0x0000001D, 0x000038B7, 0x00004278,\n    0x00004F56, 0x00006291, 0x00002158, 0x0000390F, 0x00002034, 0x000200F9,\n    0x0000530F, 0x000200F8, 0x0000530F, 0x000700F5, 0x0000001D, 0x00002BA9,\n    0x00002BA8, 0x00004F24, 0x00002BA7, 0x00003F60, 0x000700F5, 0x0000001D,\n    0x0000380A, 0x00003809, 0x00004F24, 0x00003808, 0x00003F60, 0x000700F5,\n    0x0000001D, 0x000035EC, 0x00003B7E, 0x00004F24, 0x00003B7D, 0x00003F60,\n    0x000700F5, 0x0000001D, 0x000020D3, 0x000038B7, 0x00004F24, 0x000038B6,\n    0x00003F60, 0x000500AE, 0x00000009, 0x00002E55, 0x00004356, 0x00000A16,\n    0x000300F7, 0x00005313, 0x00000002, 0x000400FA, 0x00002E55, 0x000051F1,\n    0x00005313, 0x000200F8, 0x000051F1, 0x00050084, 0x0000000B, 0x00002B47,\n    0x00000207, 0x0000229A, 0x00050085, 0x0000000D, 0x00005A1D, 0x00002B2C,\n    0x000000FC, 0x00050080, 0x0000000B, 0x00001FB2, 0x00001E06, 0x00002B47,\n    0x000300F7, 0x00005310, 0x00000002, 0x000400FA, 0x00005AEF, 0x00003B66,\n    0x000040BA, 0x000200F8, 0x000040BA, 0x000500AA, 0x00000009, 0x00004ADB,\n    0x0000199B, 0x00000A16, 0x000300F7, 0x00004F4A, 0x00000002, 0x000400FA,\n    0x00004ADB, 0x000019C1, 0x00002301, 0x000200F8, 0x00002301, 0x000500C2,\n    0x0000000B, 0x00005632, 0x00001FB2, 0x00000A11, 0x00060041, 0x00000289,\n    0x0000343D, 0x00000CC7, 0x00000A0B, 0x00005632, 0x0004003D, 0x0000000B,\n    0x00003AD5, 0x0000343D, 0x00050080, 0x0000000B, 0x00002147, 0x00001FB2,\n    0x0000199B, 0x000500C2, 0x0000000B, 0x000054A8, 0x00002147, 0x00000A11,\n    0x00060041, 0x00000289, 0x00004CDF, 0x00000CC7, 0x00000A0B, 0x000054A8,\n    0x0004003D, 0x0000000B, 0x0000333C, 0x00004CDF, 0x00050084, 0x0000000B,\n    0x000021F0, 0x00000A10, 0x0000199B, 0x00050080, 0x0000000B, 0x00005EC1,\n    0x00001FB2, 0x000021F0, 0x000500C2, 0x0000000B, 0x000045E6, 0x00005EC1,\n    0x00000A11, 0x00060041, 0x00000289, 0x00004CE0, 0x00000CC7, 0x00000A0B,\n    0x000045E6, 0x0004003D, 0x0000000B, 0x0000333D, 0x00004CE0, 0x00050084,\n    0x0000000B, 0x000021F1, 0x00000A13, 0x0000199B, 0x00050080, 0x0000000B,\n    0x00005EC2, 0x00001FB2, 0x000021F1, 0x000500C2, 0x0000000B, 0x000045E7,\n    0x00005EC2, 0x00000A11, 0x00060041, 0x00000289, 0x00004902, 0x00000CC7,\n    0x00000A0B, 0x000045E7, 0x0004003D, 0x0000000B, 0x00005F5A, 0x00004902,\n    0x00070050, 0x00000017, 0x00005130, 0x00003AD5, 0x0000333C, 0x0000333D,\n    0x00005F5A, 0x000200F9, 0x00004F4A, 0x000200F8, 0x000019C1, 0x000500C2,\n    0x0000000B, 0x00005FA8, 0x00001FB2, 0x00000A11, 0x00060041, 0x00000289,\n    0x0000343E, 0x00000CC7, 0x00000A0B, 0x00005FA8, 0x0004003D, 0x0000000B,\n    0x00003148, 0x0000343E, 0x00050080, 0x0000000B, 0x00002DB4, 0x00005FA8,\n    0x00000A0D, 0x00060041, 0x00000289, 0x00001906, 0x00000CC7, 0x00000A0B,\n    0x00002DB4, 0x0004003D, 0x0000000B, 0x00005C68, 0x00001906, 0x00050080,\n    0x0000000B, 0x00002DB5, 0x00005FA8, 0x00000A10, 0x00060041, 0x00000289,\n    0x00001907, 0x00000CC7, 0x00000A0B, 0x00002DB5, 0x0004003D, 0x0000000B,\n    0x00005C69, 0x00001907, 0x00050080, 0x0000000B, 0x00002DB6, 0x00005FA8,\n    0x00000A13, 0x00060041, 0x00000289, 0x00005FF3, 0x00000CC7, 0x00000A0B,\n    0x00002DB6, 0x0004003D, 0x0000000B, 0x00003FFE, 0x00005FF3, 0x00070050,\n    0x00000017, 0x00005131, 0x00003148, 0x00005C68, 0x00005C69, 0x00003FFE,\n    0x000200F9, 0x00004F4A, 0x000200F8, 0x00004F4A, 0x000700F5, 0x00000017,\n    0x00002AC0, 0x00005131, 0x000019C1, 0x00005130, 0x00002301, 0x000300F7,\n    0x00003F61, 0x00000000, 0x001300FB, 0x00002180, 0x00004BFC, 0x00000000,\n    0x000038FA, 0x00000001, 0x000038FA, 0x00000002, 0x00001CBD, 0x0000000A,\n    0x00001CBD, 0x00000003, 0x00001CBC, 0x0000000C, 0x00001CBC, 0x00000004,\n    0x00001FFF, 0x00000006, 0x00002035, 0x000200F8, 0x00002035, 0x00050051,\n    0x0000000B, 0x00005F58, 0x00002AC0, 0x00000000, 0x0006000C, 0x00000013,\n    0x00006069, 0x00000001, 0x0000003E, 0x00005F58, 0x00050051, 0x0000000D,\n    0x0000276A, 0x00006069, 0x00000000, 0x00050051, 0x0000000D, 0x0000444C,\n    0x00006069, 0x00000001, 0x00070050, 0x0000001D, 0x00003912, 0x0000276A,\n    0x0000444C, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x00004380,\n    0x00002AC0, 0x00000001, 0x0006000C, 0x00000013, 0x00004671, 0x00000001,\n    0x0000003E, 0x00004380, 0x00050051, 0x0000000D, 0x0000276B, 0x00004671,\n    0x00000000, 0x00050051, 0x0000000D, 0x0000444D, 0x00004671, 0x00000001,\n    0x00070050, 0x0000001D, 0x00003913, 0x0000276B, 0x0000444D, 0x00000A0C,\n    0x00000A0C, 0x00050051, 0x0000000B, 0x00004381, 0x00002AC0, 0x00000002,\n    0x0006000C, 0x00000013, 0x00004672, 0x00000001, 0x0000003E, 0x00004381,\n    0x00050051, 0x0000000D, 0x0000276C, 0x00004672, 0x00000000, 0x00050051,\n    0x0000000D, 0x0000444E, 0x00004672, 0x00000001, 0x00070050, 0x0000001D,\n    0x00003914, 0x0000276C, 0x0000444E, 0x00000A0C, 0x00000A0C, 0x00050051,\n    0x0000000B, 0x00004382, 0x00002AC0, 0x00000003, 0x0006000C, 0x00000013,\n    0x00004673, 0x00000001, 0x0000003E, 0x00004382, 0x00050051, 0x0000000D,\n    0x0000276D, 0x00004673, 0x00000000, 0x00050051, 0x0000000D, 0x000050C0,\n    0x00004673, 0x00000001, 0x00070050, 0x0000001D, 0x0000234E, 0x0000276D,\n    0x000050C0, 0x00000A0C, 0x00000A0C, 0x000200F9, 0x00003F61, 0x000200F8,\n    0x00001FFF, 0x00050051, 0x0000000B, 0x0000308D, 0x00002AC0, 0x00000000,\n    0x0004007C, 0x0000000C, 0x0000589E, 0x0000308D, 0x00050050, 0x00000012,\n    0x0000471E, 0x0000589E, 0x0000589E, 0x000500C4, 0x00000012, 0x000047B1,\n    0x0000471E, 0x000007A7, 0x000500C3, 0x00000012, 0x0000341B, 0x000047B1,\n    0x00000867, 0x0004006F, 0x00000013, 0x00002AA3, 0x0000341B, 0x0005008E,\n    0x00000013, 0x0000474B, 0x00002AA3, 0x000007FE, 0x0007000C, 0x00000013,\n    0x00005E0A, 0x00000001, 0x00000028, 0x00000049, 0x0000474B, 0x00050051,\n    0x0000000D, 0x00005F0E, 0x00005E0A, 0x00000000, 0x00050051, 0x0000000D,\n    0x00003CD7, 0x00005E0A, 0x00000001, 0x00070050, 0x0000001D, 0x00004121,\n    0x00005F0E, 0x00003CD7, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B,\n    0x00004C45, 0x00002AC0, 0x00000001, 0x0004007C, 0x0000000C, 0x00003EA4,\n    0x00004C45, 0x00050050, 0x00000012, 0x0000471F, 0x00003EA4, 0x00003EA4,\n    0x000500C4, 0x00000012, 0x000047B2, 0x0000471F, 0x000007A7, 0x000500C3,\n    0x00000012, 0x0000341C, 0x000047B2, 0x00000867, 0x0004006F, 0x00000013,\n    0x00002AA4, 0x0000341C, 0x0005008E, 0x00000013, 0x0000474C, 0x00002AA4,\n    0x000007FE, 0x0007000C, 0x00000013, 0x00005E0B, 0x00000001, 0x00000028,\n    0x00000049, 0x0000474C, 0x00050051, 0x0000000D, 0x00005F0F, 0x00005E0B,\n    0x00000000, 0x00050051, 0x0000000D, 0x00003CD8, 0x00005E0B, 0x00000001,\n    0x00070050, 0x0000001D, 0x00004122, 0x00005F0F, 0x00003CD8, 0x00000A0C,\n    0x00000A0C, 0x00050051, 0x0000000B, 0x00004C46, 0x00002AC0, 0x00000002,\n    0x0004007C, 0x0000000C, 0x00003EA5, 0x00004C46, 0x00050050, 0x00000012,\n    0x00004720, 0x00003EA5, 0x00003EA5, 0x000500C4, 0x00000012, 0x000047B3,\n    0x00004720, 0x000007A7, 0x000500C3, 0x00000012, 0x0000341D, 0x000047B3,\n    0x00000867, 0x0004006F, 0x00000013, 0x00002AA5, 0x0000341D, 0x0005008E,\n    0x00000013, 0x0000474D, 0x00002AA5, 0x000007FE, 0x0007000C, 0x00000013,\n    0x00005E0C, 0x00000001, 0x00000028, 0x00000049, 0x0000474D, 0x00050051,\n    0x0000000D, 0x00005F10, 0x00005E0C, 0x00000000, 0x00050051, 0x0000000D,\n    0x00003CD9, 0x00005E0C, 0x00000001, 0x00070050, 0x0000001D, 0x00004123,\n    0x00005F10, 0x00003CD9, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B,\n    0x00004C47, 0x00002AC0, 0x00000003, 0x0004007C, 0x0000000C, 0x00003EA6,\n    0x00004C47, 0x00050050, 0x00000012, 0x00004724, 0x00003EA6, 0x00003EA6,\n    0x000500C4, 0x00000012, 0x000047B4, 0x00004724, 0x000007A7, 0x000500C3,\n    0x00000012, 0x0000341E, 0x000047B4, 0x00000867, 0x0004006F, 0x00000013,\n    0x00002AA6, 0x0000341E, 0x0005008E, 0x00000013, 0x0000474E, 0x00002AA6,\n    0x000007FE, 0x0007000C, 0x00000013, 0x00005E0D, 0x00000001, 0x00000028,\n    0x00000049, 0x0000474E, 0x00050051, 0x0000000D, 0x00005F11, 0x00005E0D,\n    0x00000000, 0x00050051, 0x0000000D, 0x0000494D, 0x00005E0D, 0x00000001,\n    0x00070050, 0x0000001D, 0x0000234F, 0x00005F11, 0x0000494D, 0x00000A0C,\n    0x00000A0C, 0x000200F9, 0x00003F61, 0x000200F8, 0x00001CBC, 0x00050051,\n    0x0000000B, 0x000056C0, 0x00002AC0, 0x00000000, 0x00060050, 0x00000014,\n    0x00004F0D, 0x000056C0, 0x000056C0, 0x000056C0, 0x000500C2, 0x00000014,\n    0x00002B12, 0x00004F0D, 0x00000BB4, 0x000500C7, 0x00000014, 0x00005DEA,\n    0x00002B12, 0x00000105, 0x000500C7, 0x00000014, 0x000048A0, 0x00002B12,\n    0x00000466, 0x000500C2, 0x00000014, 0x00005B94, 0x00005DEA, 0x00000B0C,\n    0x000500AA, 0x00000010, 0x000040CD, 0x00005B94, 0x00000A12, 0x0006000C,\n    0x00000016, 0x00002C4F, 0x00000001, 0x0000004B, 0x000048A0, 0x0004007C,\n    0x00000014, 0x00002A19, 0x00002C4F, 0x00050082, 0x00000014, 0x0000187E,\n    0x00000B0C, 0x00002A19, 0x00050080, 0x00000014, 0x00002214, 0x00002A19,\n    0x00000938, 0x000600A9, 0x00000014, 0x00002873, 0x000040CD, 0x00002214,\n    0x00005B94, 0x000500C4, 0x00000014, 0x00005AD8, 0x000048A0, 0x0000187E,\n    0x000500C7, 0x00000014, 0x0000499E, 0x00005AD8, 0x00000466, 0x000600A9,\n    0x00000014, 0x00002AA7, 0x000040CD, 0x0000499E, 0x000048A0, 0x00050080,\n    0x00000014, 0x00005FFD, 0x00002873, 0x000003FA, 0x000500C4, 0x00000014,\n    0x00004F83, 0x00005FFD, 0x00000189, 0x000500C4, 0x00000014, 0x00003FAA,\n    0x00002AA7, 0x0000008D, 0x000500C5, 0x00000014, 0x00005780, 0x00004F83,\n    0x00003FAA, 0x000500AA, 0x00000010, 0x00003604, 0x00005DEA, 0x00000A12,\n    0x000600A9, 0x00000014, 0x00004246, 0x00003604, 0x00000A12, 0x00005780,\n    0x0004007C, 0x00000018, 0x000029D3, 0x00004246, 0x000500C2, 0x0000000B,\n    0x00004BA8, 0x000056C0, 0x00000A64, 0x00040070, 0x0000000D, 0x00004812,\n    0x00004BA8, 0x00050085, 0x0000000D, 0x00003E23, 0x00004812, 0x00000149,\n    0x00050051, 0x0000000D, 0x000053C6, 0x000029D3, 0x00000000, 0x00050051,\n    0x0000000D, 0x00002A59, 0x000029D3, 0x00000001, 0x00050051, 0x0000000D,\n    0x00001E9C, 0x000029D3, 0x00000002, 0x00070050, 0x0000001D, 0x00003DDD,\n    0x000053C6, 0x00002A59, 0x00001E9C, 0x00003E23, 0x00050051, 0x0000000B,\n    0x000027F8, 0x00002AC0, 0x00000001, 0x00060050, 0x00000014, 0x00003511,\n    0x000027F8, 0x000027F8, 0x000027F8, 0x000500C2, 0x00000014, 0x00002B13,\n    0x00003511, 0x00000BB4, 0x000500C7, 0x00000014, 0x00005DEB, 0x00002B13,\n    0x00000105, 0x000500C7, 0x00000014, 0x000048A1, 0x00002B13, 0x00000466,\n    0x000500C2, 0x00000014, 0x00005B95, 0x00005DEB, 0x00000B0C, 0x000500AA,\n    0x00000010, 0x000040CE, 0x00005B95, 0x00000A12, 0x0006000C, 0x00000016,\n    0x00002C50, 0x00000001, 0x0000004B, 0x000048A1, 0x0004007C, 0x00000014,\n    0x00002A1A, 0x00002C50, 0x00050082, 0x00000014, 0x0000187F, 0x00000B0C,\n    0x00002A1A, 0x00050080, 0x00000014, 0x00002215, 0x00002A1A, 0x00000938,\n    0x000600A9, 0x00000014, 0x00002874, 0x000040CE, 0x00002215, 0x00005B95,\n    0x000500C4, 0x00000014, 0x00005AD9, 0x000048A1, 0x0000187F, 0x000500C7,\n    0x00000014, 0x0000499F, 0x00005AD9, 0x00000466, 0x000600A9, 0x00000014,\n    0x00002AA8, 0x000040CE, 0x0000499F, 0x000048A1, 0x00050080, 0x00000014,\n    0x00005FFE, 0x00002874, 0x000003FA, 0x000500C4, 0x00000014, 0x00004F84,\n    0x00005FFE, 0x00000189, 0x000500C4, 0x00000014, 0x00003FAB, 0x00002AA8,\n    0x0000008D, 0x000500C5, 0x00000014, 0x00005781, 0x00004F84, 0x00003FAB,\n    0x000500AA, 0x00000010, 0x00003605, 0x00005DEB, 0x00000A12, 0x000600A9,\n    0x00000014, 0x00004247, 0x00003605, 0x00000A12, 0x00005781, 0x0004007C,\n    0x00000018, 0x000029D4, 0x00004247, 0x000500C2, 0x0000000B, 0x00004BA9,\n    0x000027F8, 0x00000A64, 0x00040070, 0x0000000D, 0x00004813, 0x00004BA9,\n    0x00050085, 0x0000000D, 0x00003E24, 0x00004813, 0x00000149, 0x00050051,\n    0x0000000D, 0x000053C7, 0x000029D4, 0x00000000, 0x00050051, 0x0000000D,\n    0x00002A5A, 0x000029D4, 0x00000001, 0x00050051, 0x0000000D, 0x00001E9D,\n    0x000029D4, 0x00000002, 0x00070050, 0x0000001D, 0x00003DDE, 0x000053C7,\n    0x00002A5A, 0x00001E9D, 0x00003E24, 0x00050051, 0x0000000B, 0x000027F9,\n    0x00002AC0, 0x00000002, 0x00060050, 0x00000014, 0x00003512, 0x000027F9,\n    0x000027F9, 0x000027F9, 0x000500C2, 0x00000014, 0x00002B14, 0x00003512,\n    0x00000BB4, 0x000500C7, 0x00000014, 0x00005DEC, 0x00002B14, 0x00000105,\n    0x000500C7, 0x00000014, 0x000048A2, 0x00002B14, 0x00000466, 0x000500C2,\n    0x00000014, 0x00005B96, 0x00005DEC, 0x00000B0C, 0x000500AA, 0x00000010,\n    0x000040CF, 0x00005B96, 0x00000A12, 0x0006000C, 0x00000016, 0x00002C51,\n    0x00000001, 0x0000004B, 0x000048A2, 0x0004007C, 0x00000014, 0x00002A1B,\n    0x00002C51, 0x00050082, 0x00000014, 0x00001880, 0x00000B0C, 0x00002A1B,\n    0x00050080, 0x00000014, 0x00002216, 0x00002A1B, 0x00000938, 0x000600A9,\n    0x00000014, 0x00002875, 0x000040CF, 0x00002216, 0x00005B96, 0x000500C4,\n    0x00000014, 0x00005ADA, 0x000048A2, 0x00001880, 0x000500C7, 0x00000014,\n    0x000049A0, 0x00005ADA, 0x00000466, 0x000600A9, 0x00000014, 0x00002AA9,\n    0x000040CF, 0x000049A0, 0x000048A2, 0x00050080, 0x00000014, 0x00005FFF,\n    0x00002875, 0x000003FA, 0x000500C4, 0x00000014, 0x00004F85, 0x00005FFF,\n    0x00000189, 0x000500C4, 0x00000014, 0x00003FAC, 0x00002AA9, 0x0000008D,\n    0x000500C5, 0x00000014, 0x00005782, 0x00004F85, 0x00003FAC, 0x000500AA,\n    0x00000010, 0x00003606, 0x00005DEC, 0x00000A12, 0x000600A9, 0x00000014,\n    0x00004248, 0x00003606, 0x00000A12, 0x00005782, 0x0004007C, 0x00000018,\n    0x000029D5, 0x00004248, 0x000500C2, 0x0000000B, 0x00004BAA, 0x000027F9,\n    0x00000A64, 0x00040070, 0x0000000D, 0x00004814, 0x00004BAA, 0x00050085,\n    0x0000000D, 0x00003E25, 0x00004814, 0x00000149, 0x00050051, 0x0000000D,\n    0x000053C8, 0x000029D5, 0x00000000, 0x00050051, 0x0000000D, 0x00002A5B,\n    0x000029D5, 0x00000001, 0x00050051, 0x0000000D, 0x00001E9E, 0x000029D5,\n    0x00000002, 0x00070050, 0x0000001D, 0x00003DDF, 0x000053C8, 0x00002A5B,\n    0x00001E9E, 0x00003E25, 0x00050051, 0x0000000B, 0x000027FA, 0x00002AC0,\n    0x00000003, 0x00060050, 0x00000014, 0x00003513, 0x000027FA, 0x000027FA,\n    0x000027FA, 0x000500C2, 0x00000014, 0x00002B15, 0x00003513, 0x00000BB4,\n    0x000500C7, 0x00000014, 0x00005DED, 0x00002B15, 0x00000105, 0x000500C7,\n    0x00000014, 0x000048A3, 0x00002B15, 0x00000466, 0x000500C2, 0x00000014,\n    0x00005B97, 0x00005DED, 0x00000B0C, 0x000500AA, 0x00000010, 0x000040D0,\n    0x00005B97, 0x00000A12, 0x0006000C, 0x00000016, 0x00002C52, 0x00000001,\n    0x0000004B, 0x000048A3, 0x0004007C, 0x00000014, 0x00002A1C, 0x00002C52,\n    0x00050082, 0x00000014, 0x00001881, 0x00000B0C, 0x00002A1C, 0x00050080,\n    0x00000014, 0x00002217, 0x00002A1C, 0x00000938, 0x000600A9, 0x00000014,\n    0x00002876, 0x000040D0, 0x00002217, 0x00005B97, 0x000500C4, 0x00000014,\n    0x00005ADB, 0x000048A3, 0x00001881, 0x000500C7, 0x00000014, 0x000049A1,\n    0x00005ADB, 0x00000466, 0x000600A9, 0x00000014, 0x00002AAA, 0x000040D0,\n    0x000049A1, 0x000048A3, 0x00050080, 0x00000014, 0x00006000, 0x00002876,\n    0x000003FA, 0x000500C4, 0x00000014, 0x00004F86, 0x00006000, 0x00000189,\n    0x000500C4, 0x00000014, 0x00003FAD, 0x00002AAA, 0x0000008D, 0x000500C5,\n    0x00000014, 0x00005783, 0x00004F86, 0x00003FAD, 0x000500AA, 0x00000010,\n    0x00003607, 0x00005DED, 0x00000A12, 0x000600A9, 0x00000014, 0x00004249,\n    0x00003607, 0x00000A12, 0x00005783, 0x0004007C, 0x00000018, 0x000029D6,\n    0x00004249, 0x000500C2, 0x0000000B, 0x00004BAB, 0x000027FA, 0x00000A64,\n    0x00040070, 0x0000000D, 0x00004815, 0x00004BAB, 0x00050085, 0x0000000D,\n    0x00003E26, 0x00004815, 0x00000149, 0x00050051, 0x0000000D, 0x000053C9,\n    0x000029D6, 0x00000000, 0x00050051, 0x0000000D, 0x00002A5C, 0x000029D6,\n    0x00000001, 0x00050051, 0x0000000D, 0x00002B16, 0x000029D6, 0x00000002,\n    0x00070050, 0x0000001D, 0x00002350, 0x000053C9, 0x00002A5C, 0x00002B16,\n    0x00003E26, 0x000200F9, 0x00003F61, 0x000200F8, 0x00001CBD, 0x00050051,\n    0x0000000B, 0x000056C1, 0x00002AC0, 0x00000000, 0x00070050, 0x00000017,\n    0x00004F0E, 0x000056C1, 0x000056C1, 0x000056C1, 0x000056C1, 0x000500C2,\n    0x00000017, 0x000024A0, 0x00004F0E, 0x0000034D, 0x000500C7, 0x00000017,\n    0x000049AF, 0x000024A0, 0x0000027B, 0x00040070, 0x0000001D, 0x00003CBA,\n    0x000049AF, 0x00050085, 0x0000001D, 0x00004133, 0x00003CBA, 0x00000AEE,\n    0x00050051, 0x0000000B, 0x00005CD5, 0x00002AC0, 0x00000001, 0x00070050,\n    0x00000017, 0x00005150, 0x00005CD5, 0x00005CD5, 0x00005CD5, 0x00005CD5,\n    0x000500C2, 0x00000017, 0x000024A1, 0x00005150, 0x0000034D, 0x000500C7,\n    0x00000017, 0x000049B0, 0x000024A1, 0x0000027B, 0x00040070, 0x0000001D,\n    0x00003CBB, 0x000049B0, 0x00050085, 0x0000001D, 0x00004134, 0x00003CBB,\n    0x00000AEE, 0x00050051, 0x0000000B, 0x00005CD6, 0x00002AC0, 0x00000002,\n    0x00070050, 0x00000017, 0x00005151, 0x00005CD6, 0x00005CD6, 0x00005CD6,\n    0x00005CD6, 0x000500C2, 0x00000017, 0x000024A2, 0x00005151, 0x0000034D,\n    0x000500C7, 0x00000017, 0x000049B1, 0x000024A2, 0x0000027B, 0x00040070,\n    0x0000001D, 0x00003CBC, 0x000049B1, 0x00050085, 0x0000001D, 0x00004135,\n    0x00003CBC, 0x00000AEE, 0x00050051, 0x0000000B, 0x00005CD7, 0x00002AC0,\n    0x00000003, 0x00070050, 0x00000017, 0x00005152, 0x00005CD7, 0x00005CD7,\n    0x00005CD7, 0x00005CD7, 0x000500C2, 0x00000017, 0x000024A3, 0x00005152,\n    0x0000034D, 0x000500C7, 0x00000017, 0x000049B2, 0x000024A3, 0x0000027B,\n    0x00040070, 0x0000001D, 0x00004930, 0x000049B2, 0x00050085, 0x0000001D,\n    0x000026A0, 0x00004930, 0x00000AEE, 0x000200F9, 0x00003F61, 0x000200F8,\n    0x000038FA, 0x00050051, 0x0000000B, 0x000056C2, 0x00002AC0, 0x00000000,\n    0x00070050, 0x00000017, 0x00004F0F, 0x000056C2, 0x000056C2, 0x000056C2,\n    0x000056C2, 0x000500C2, 0x00000017, 0x000024A4, 0x00004F0F, 0x0000028D,\n    0x000500C7, 0x00000017, 0x00004A5A, 0x000024A4, 0x0000064B, 0x00040070,\n    0x0000001D, 0x000036A5, 0x00004A5A, 0x0005008E, 0x0000001D, 0x00004B26,\n    0x000036A5, 0x0000017A, 0x00050051, 0x0000000B, 0x000021A2, 0x00002AC0,\n    0x00000001, 0x00070050, 0x00000017, 0x0000610E, 0x000021A2, 0x000021A2,\n    0x000021A2, 0x000021A2, 0x000500C2, 0x00000017, 0x000024A5, 0x0000610E,\n    0x0000028D, 0x000500C7, 0x00000017, 0x00004A5B, 0x000024A5, 0x0000064B,\n    0x00040070, 0x0000001D, 0x000036A6, 0x00004A5B, 0x0005008E, 0x0000001D,\n    0x00004B27, 0x000036A6, 0x0000017A, 0x00050051, 0x0000000B, 0x000021A3,\n    0x00002AC0, 0x00000002, 0x00070050, 0x00000017, 0x0000610F, 0x000021A3,\n    0x000021A3, 0x000021A3, 0x000021A3, 0x000500C2, 0x00000017, 0x000024A6,\n    0x0000610F, 0x0000028D, 0x000500C7, 0x00000017, 0x00004A5C, 0x000024A6,\n    0x0000064B, 0x00040070, 0x0000001D, 0x000036A7, 0x00004A5C, 0x0005008E,\n    0x0000001D, 0x00004B28, 0x000036A7, 0x0000017A, 0x00050051, 0x0000000B,\n    0x000021A4, 0x00002AC0, 0x00000003, 0x00070050, 0x00000017, 0x00006110,\n    0x000021A4, 0x000021A4, 0x000021A4, 0x000021A4, 0x000500C2, 0x00000017,\n    0x000024A7, 0x00006110, 0x0000028D, 0x000500C7, 0x00000017, 0x00004A5D,\n    0x000024A7, 0x0000064B, 0x00040070, 0x0000001D, 0x0000431B, 0x00004A5D,\n    0x0005008E, 0x0000001D, 0x00003093, 0x0000431B, 0x0000017A, 0x000200F9,\n    0x00003F61, 0x000200F8, 0x00004BFC, 0x00050051, 0x0000000B, 0x0000308E,\n    0x00002AC0, 0x00000000, 0x0004007C, 0x0000000D, 0x00004FEF, 0x0000308E,\n    0x00050050, 0x00000013, 0x00004339, 0x00004FEF, 0x00000A0C, 0x0009004F,\n    0x0000001D, 0x00002D93, 0x00004339, 0x00004339, 0x00000000, 0x00000001,\n    0x00000001, 0x00000001, 0x00050051, 0x0000000B, 0x000056B4, 0x00002AC0,\n    0x00000001, 0x0004007C, 0x0000000D, 0x00003F6B, 0x000056B4, 0x00050050,\n    0x00000013, 0x0000433A, 0x00003F6B, 0x00000A0C, 0x0009004F, 0x0000001D,\n    0x00002D94, 0x0000433A, 0x0000433A, 0x00000000, 0x00000001, 0x00000001,\n    0x00000001, 0x00050051, 0x0000000B, 0x000056B5, 0x00002AC0, 0x00000002,\n    0x0004007C, 0x0000000D, 0x00003F6C, 0x000056B5, 0x00050050, 0x00000013,\n    0x0000433B, 0x00003F6C, 0x00000A0C, 0x0009004F, 0x0000001D, 0x00002D95,\n    0x0000433B, 0x0000433B, 0x00000000, 0x00000001, 0x00000001, 0x00000001,\n    0x00050051, 0x0000000B, 0x000056B6, 0x00002AC0, 0x00000003, 0x0004007C,\n    0x0000000D, 0x00003F6D, 0x000056B6, 0x00050050, 0x00000013, 0x00004FAF,\n    0x00003F6D, 0x00000A0C, 0x0009004F, 0x0000001D, 0x00005A3B, 0x00004FAF,\n    0x00004FAF, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x000200F9,\n    0x00003F61, 0x000200F8, 0x00003F61, 0x000F00F5, 0x0000001D, 0x00002BAA,\n    0x00005A3B, 0x00004BFC, 0x00003093, 0x000038FA, 0x000026A0, 0x00001CBD,\n    0x00002350, 0x00001CBC, 0x0000234F, 0x00001FFF, 0x0000234E, 0x00002035,\n    0x000F00F5, 0x0000001D, 0x0000380B, 0x00002D95, 0x00004BFC, 0x00004B28,\n    0x000038FA, 0x00004135, 0x00001CBD, 0x00003DDF, 0x00001CBC, 0x00004123,\n    0x00001FFF, 0x00003914, 0x00002035, 0x000F00F5, 0x0000001D, 0x00003B7F,\n    0x00002D94, 0x00004BFC, 0x00004B27, 0x000038FA, 0x00004134, 0x00001CBD,\n    0x00003DDE, 0x00001CBC, 0x00004122, 0x00001FFF, 0x00003913, 0x00002035,\n    0x000F00F5, 0x0000001D, 0x000038B8, 0x00002D93, 0x00004BFC, 0x00004B26,\n    0x000038FA, 0x00004133, 0x00001CBD, 0x00003DDD, 0x00001CBC, 0x00004121,\n    0x00001FFF, 0x00003912, 0x00002035, 0x000200F9, 0x00005310, 0x000200F8,\n    0x00003B66, 0x000500AA, 0x00000009, 0x00005451, 0x0000199B, 0x00000A22,\n    0x000300F7, 0x00004F25, 0x00000002, 0x000400FA, 0x00005451, 0x000019C2,\n    0x00002302, 0x000200F8, 0x00002302, 0x000500C2, 0x0000000B, 0x00005633,\n    0x00001FB2, 0x00000A11, 0x00060041, 0x00000289, 0x0000343F, 0x00000CC7,\n    0x00000A0B, 0x00005633, 0x0004003D, 0x0000000B, 0x00003149, 0x0000343F,\n    0x00050080, 0x0000000B, 0x00002DB7, 0x00005633, 0x00000A0D, 0x00060041,\n    0x00000289, 0x00001908, 0x00000CC7, 0x00000A0B, 0x00002DB7, 0x0004003D,\n    0x0000000B, 0x00001B77, 0x00001908, 0x00050080, 0x0000000B, 0x00002148,\n    0x00001FB2, 0x0000199B, 0x000500C2, 0x0000000B, 0x000054A9, 0x00002148,\n    0x00000A11, 0x00060041, 0x00000289, 0x00004C95, 0x00000CC7, 0x00000A0B,\n    0x000054A9, 0x0004003D, 0x0000000B, 0x0000314A, 0x00004C95, 0x00050080,\n    0x0000000B, 0x00002DB8, 0x000054A9, 0x00000A0D, 0x00060041, 0x00000289,\n    0x00005FF4, 0x00000CC7, 0x00000A0B, 0x00002DB8, 0x0004003D, 0x0000000B,\n    0x0000374D, 0x00005FF4, 0x00070050, 0x00000017, 0x00004CD7, 0x00003149,\n    0x00001B77, 0x0000314A, 0x0000374D, 0x00050084, 0x0000000B, 0x00004C2C,\n    0x00000A10, 0x0000199B, 0x00050080, 0x0000000B, 0x00002A46, 0x00001FB2,\n    0x00004C2C, 0x000500C2, 0x0000000B, 0x000045E8, 0x00002A46, 0x00000A11,\n    0x00060041, 0x00000289, 0x00004C96, 0x00000CC7, 0x00000A0B, 0x000045E8,\n    0x0004003D, 0x0000000B, 0x0000314B, 0x00004C96, 0x00050080, 0x0000000B,\n    0x00002DB9, 0x000045E8, 0x00000A0D, 0x00060041, 0x00000289, 0x0000194C,\n    0x00000CC7, 0x00000A0B, 0x00002DB9, 0x0004003D, 0x0000000B, 0x00005E5C,\n    0x0000194C, 0x00050084, 0x0000000B, 0x000021F2, 0x00000A13, 0x0000199B,\n    0x00050080, 0x0000000B, 0x00005EC3, 0x00001FB2, 0x000021F2, 0x000500C2,\n    0x0000000B, 0x000045E9, 0x00005EC3, 0x00000A11, 0x00060041, 0x00000289,\n    0x00004C97, 0x00000CC7, 0x00000A0B, 0x000045E9, 0x0004003D, 0x0000000B,\n    0x0000314C, 0x00004C97, 0x00050080, 0x0000000B, 0x00002DBA, 0x000045E9,\n    0x00000A0D, 0x00060041, 0x00000289, 0x00005FF5, 0x00000CC7, 0x00000A0B,\n    0x00002DBA, 0x0004003D, 0x0000000B, 0x00003FFF, 0x00005FF5, 0x00070050,\n    0x00000017, 0x00005132, 0x0000314B, 0x00005E5C, 0x0000314C, 0x00003FFF,\n    0x000200F9, 0x00004F25, 0x000200F8, 0x000019C2, 0x000500C2, 0x0000000B,\n    0x00005FA9, 0x00001FB2, 0x00000A11, 0x00060041, 0x00000289, 0x00003440,\n    0x00000CC7, 0x00000A0B, 0x00005FA9, 0x0004003D, 0x0000000B, 0x0000314D,\n    0x00003440, 0x00050080, 0x0000000B, 0x00002DBB, 0x00005FA9, 0x00000A0D,\n    0x00060041, 0x00000289, 0x00001909, 0x00000CC7, 0x00000A0B, 0x00002DBB,\n    0x0004003D, 0x0000000B, 0x00005C6A, 0x00001909, 0x00050080, 0x0000000B,\n    0x00002DBC, 0x00005FA9, 0x00000A10, 0x00060041, 0x00000289, 0x0000190A,\n    0x00000CC7, 0x00000A0B, 0x00002DBC, 0x0004003D, 0x0000000B, 0x00005C6B,\n    0x0000190A, 0x00050080, 0x0000000B, 0x00002DBD, 0x00005FA9, 0x00000A13,\n    0x00060041, 0x00000289, 0x00005FF6, 0x00000CC7, 0x00000A0B, 0x00002DBD,\n    0x0004003D, 0x0000000B, 0x00003701, 0x00005FF6, 0x00070050, 0x00000017,\n    0x00005471, 0x0000314D, 0x00005C6A, 0x00005C6B, 0x00003701, 0x00050080,\n    0x0000000B, 0x00004B84, 0x00001FB2, 0x00000A3A, 0x000500C2, 0x0000000B,\n    0x0000202E, 0x00004B84, 0x00000A11, 0x00060041, 0x00000289, 0x00004C98,\n    0x00000CC7, 0x00000A0B, 0x0000202E, 0x0004003D, 0x0000000B, 0x0000314E,\n    0x00004C98, 0x00050080, 0x0000000B, 0x00002DBE, 0x0000202E, 0x00000A0D,\n    0x00060041, 0x00000289, 0x0000190B, 0x00000CC7, 0x00000A0B, 0x00002DBE,\n    0x0004003D, 0x0000000B, 0x00005C6C, 0x0000190B, 0x00050080, 0x0000000B,\n    0x00002DBF, 0x0000202E, 0x00000A10, 0x00060041, 0x00000289, 0x0000190C,\n    0x00000CC7, 0x00000A0B, 0x00002DBF, 0x0004003D, 0x0000000B, 0x00005C6D,\n    0x0000190C, 0x00050080, 0x0000000B, 0x00002DC0, 0x0000202E, 0x00000A13,\n    0x00060041, 0x00000289, 0x00005FF7, 0x00000CC7, 0x00000A0B, 0x00002DC0,\n    0x0004003D, 0x0000000B, 0x00004000, 0x00005FF7, 0x00070050, 0x00000017,\n    0x00005133, 0x0000314E, 0x00005C6C, 0x00005C6D, 0x00004000, 0x000200F9,\n    0x00004F25, 0x000200F8, 0x00004F25, 0x000700F5, 0x00000017, 0x00002BCE,\n    0x00005133, 0x000019C2, 0x00005132, 0x00002302, 0x000700F5, 0x00000017,\n    0x00003721, 0x00005471, 0x000019C2, 0x00004CD7, 0x00002302, 0x000300F7,\n    0x00004F26, 0x00000000, 0x000700FB, 0x00002180, 0x00004F57, 0x00000005,\n    0x00002159, 0x00000007, 0x00002036, 0x000200F8, 0x00002036, 0x00050051,\n    0x0000000B, 0x00005F5B, 0x00003721, 0x00000000, 0x0006000C, 0x00000013,\n    0x0000606A, 0x00000001, 0x0000003E, 0x00005F5B, 0x00050051, 0x0000000D,\n    0x00002779, 0x0000606A, 0x00000000, 0x00050051, 0x0000000D, 0x00003EBC,\n    0x0000606A, 0x00000001, 0x00050051, 0x0000000B, 0x00004285, 0x00003721,\n    0x00000001, 0x0006000C, 0x00000013, 0x00003CF9, 0x00000001, 0x0000003E,\n    0x00004285, 0x00050051, 0x0000000D, 0x0000276E, 0x00003CF9, 0x00000000,\n    0x00050051, 0x0000000D, 0x0000444F, 0x00003CF9, 0x00000001, 0x00070050,\n    0x0000001D, 0x00003915, 0x00002779, 0x00003EBC, 0x0000276E, 0x0000444F,\n    0x00050051, 0x0000000B, 0x00004383, 0x00003721, 0x00000002, 0x0006000C,\n    0x00000013, 0x00004674, 0x00000001, 0x0000003E, 0x00004383, 0x00050051,\n    0x0000000D, 0x0000277A, 0x00004674, 0x00000000, 0x00050051, 0x0000000D,\n    0x00003EBD, 0x00004674, 0x00000001, 0x00050051, 0x0000000B, 0x00004286,\n    0x00003721, 0x00000003, 0x0006000C, 0x00000013, 0x00003CFA, 0x00000001,\n    0x0000003E, 0x00004286, 0x00050051, 0x0000000D, 0x0000276F, 0x00003CFA,\n    0x00000000, 0x00050051, 0x0000000D, 0x00004450, 0x00003CFA, 0x00000001,\n    0x00070050, 0x0000001D, 0x00003916, 0x0000277A, 0x00003EBD, 0x0000276F,\n    0x00004450, 0x00050051, 0x0000000B, 0x00004384, 0x00002BCE, 0x00000000,\n    0x0006000C, 0x00000013, 0x00004675, 0x00000001, 0x0000003E, 0x00004384,\n    0x00050051, 0x0000000D, 0x0000277B, 0x00004675, 0x00000000, 0x00050051,\n    0x0000000D, 0x00003EBE, 0x00004675, 0x00000001, 0x00050051, 0x0000000B,\n    0x00004287, 0x00002BCE, 0x00000001, 0x0006000C, 0x00000013, 0x00003CFB,\n    0x00000001, 0x0000003E, 0x00004287, 0x00050051, 0x0000000D, 0x00002770,\n    0x00003CFB, 0x00000000, 0x00050051, 0x0000000D, 0x00004451, 0x00003CFB,\n    0x00000001, 0x00070050, 0x0000001D, 0x00003917, 0x0000277B, 0x00003EBE,\n    0x00002770, 0x00004451, 0x00050051, 0x0000000B, 0x00004385, 0x00002BCE,\n    0x00000002, 0x0006000C, 0x00000013, 0x00004676, 0x00000001, 0x0000003E,\n    0x00004385, 0x00050051, 0x0000000D, 0x0000277C, 0x00004676, 0x00000000,\n    0x00050051, 0x0000000D, 0x00003EBF, 0x00004676, 0x00000001, 0x00050051,\n    0x0000000B, 0x00004288, 0x00002BCE, 0x00000003, 0x0006000C, 0x00000013,\n    0x00003CFC, 0x00000001, 0x0000003E, 0x00004288, 0x00050051, 0x0000000D,\n    0x00002771, 0x00003CFC, 0x00000000, 0x00050051, 0x0000000D, 0x000050C1,\n    0x00003CFC, 0x00000001, 0x00070050, 0x0000001D, 0x00002351, 0x0000277C,\n    0x00003EBF, 0x00002771, 0x000050C1, 0x000200F9, 0x00004F26, 0x000200F8,\n    0x00002159, 0x0007004F, 0x00000011, 0x000025FC, 0x00003721, 0x00003721,\n    0x00000000, 0x00000001, 0x0004007C, 0x00000012, 0x00005B3D, 0x000025FC,\n    0x0009004F, 0x0000001A, 0x000060D2, 0x00005B3D, 0x00005B3D, 0x00000000,\n    0x00000000, 0x00000001, 0x00000001, 0x000500C4, 0x0000001A, 0x000048AA,\n    0x000060D2, 0x00000122, 0x000500C3, 0x0000001A, 0x00003D91, 0x000048AA,\n    0x00000302, 0x0004006F, 0x0000001D, 0x00002AAB, 0x00003D91, 0x0005008E,\n    0x0000001D, 0x00004725, 0x00002AAB, 0x000007FE, 0x0007000C, 0x0000001D,\n    0x00006294, 0x00000001, 0x00000028, 0x00000504, 0x00004725, 0x0007004F,\n    0x00000011, 0x0000376E, 0x00003721, 0x00003721, 0x00000002, 0x00000003,\n    0x0004007C, 0x00000012, 0x000024C2, 0x0000376E, 0x0009004F, 0x0000001A,\n    0x000060D3, 0x000024C2, 0x000024C2, 0x00000000, 0x00000000, 0x00000001,\n    0x00000001, 0x000500C4, 0x0000001A, 0x000048AB, 0x000060D3, 0x00000122,\n    0x000500C3, 0x0000001A, 0x00003D92, 0x000048AB, 0x00000302, 0x0004006F,\n    0x0000001D, 0x00002AAC, 0x00003D92, 0x0005008E, 0x0000001D, 0x00004726,\n    0x00002AAC, 0x000007FE, 0x0007000C, 0x0000001D, 0x00006295, 0x00000001,\n    0x00000028, 0x00000504, 0x00004726, 0x0007004F, 0x00000011, 0x0000376F,\n    0x00002BCE, 0x00002BCE, 0x00000000, 0x00000001, 0x0004007C, 0x00000012,\n    0x000024C3, 0x0000376F, 0x0009004F, 0x0000001A, 0x000060D4, 0x000024C3,\n    0x000024C3, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x000500C4,\n    0x0000001A, 0x000048AC, 0x000060D4, 0x00000122, 0x000500C3, 0x0000001A,\n    0x00003D93, 0x000048AC, 0x00000302, 0x0004006F, 0x0000001D, 0x00002AAD,\n    0x00003D93, 0x0005008E, 0x0000001D, 0x00004727, 0x00002AAD, 0x000007FE,\n    0x0007000C, 0x0000001D, 0x00006296, 0x00000001, 0x00000028, 0x00000504,\n    0x00004727, 0x0007004F, 0x00000011, 0x00003770, 0x00002BCE, 0x00002BCE,\n    0x00000002, 0x00000003, 0x0004007C, 0x00000012, 0x000024C4, 0x00003770,\n    0x0009004F, 0x0000001A, 0x000060D5, 0x000024C4, 0x000024C4, 0x00000000,\n    0x00000000, 0x00000001, 0x00000001, 0x000500C4, 0x0000001A, 0x000048AD,\n    0x000060D5, 0x00000122, 0x000500C3, 0x0000001A, 0x00003D94, 0x000048AD,\n    0x00000302, 0x0004006F, 0x0000001D, 0x00002AAE, 0x00003D94, 0x0005008E,\n    0x0000001D, 0x000053C0, 0x00002AAE, 0x000007FE, 0x0007000C, 0x0000001D,\n    0x00004363, 0x00000001, 0x00000028, 0x00000504, 0x000053C0, 0x000200F9,\n    0x00004F26, 0x000200F8, 0x00004F57, 0x0007004F, 0x00000011, 0x00002622,\n    0x00003721, 0x00003721, 0x00000000, 0x00000001, 0x0004007C, 0x00000013,\n    0x0000515A, 0x00002622, 0x00050051, 0x0000000D, 0x00001B80, 0x0000515A,\n    0x00000000, 0x00050051, 0x0000000D, 0x0000346D, 0x0000515A, 0x00000001,\n    0x00070050, 0x0000001D, 0x0000427B, 0x00001B80, 0x0000346D, 0x00000A0C,\n    0x00000A0C, 0x0007004F, 0x00000011, 0x000041DB, 0x00003721, 0x00003721,\n    0x00000002, 0x00000003, 0x0004007C, 0x00000013, 0x00003760, 0x000041DB,\n    0x00050051, 0x0000000D, 0x00001B81, 0x00003760, 0x00000000, 0x00050051,\n    0x0000000D, 0x0000346E, 0x00003760, 0x00000001, 0x00070050, 0x0000001D,\n    0x0000427C, 0x00001B81, 0x0000346E, 0x00000A0C, 0x00000A0C, 0x0007004F,\n    0x00000011, 0x000041DC, 0x00002BCE, 0x00002BCE, 0x00000000, 0x00000001,\n    0x0004007C, 0x00000013, 0x00003761, 0x000041DC, 0x00050051, 0x0000000D,\n    0x00001B82, 0x00003761, 0x00000000, 0x00050051, 0x0000000D, 0x0000346F,\n    0x00003761, 0x00000001, 0x00070050, 0x0000001D, 0x0000427D, 0x00001B82,\n    0x0000346F, 0x00000A0C, 0x00000A0C, 0x0007004F, 0x00000011, 0x000041DD,\n    0x00002BCE, 0x00002BCE, 0x00000002, 0x00000003, 0x0004007C, 0x00000013,\n    0x00003762, 0x000041DD, 0x00050051, 0x0000000D, 0x00001B83, 0x00003762,\n    0x00000000, 0x00050051, 0x0000000D, 0x00004109, 0x00003762, 0x00000001,\n    0x00070050, 0x0000001D, 0x00002352, 0x00001B83, 0x00004109, 0x00000A0C,\n    0x00000A0C, 0x000200F9, 0x00004F26, 0x000200F8, 0x00004F26, 0x000900F5,\n    0x0000001D, 0x00002BAB, 0x00002352, 0x00004F57, 0x00004363, 0x00002159,\n    0x00002351, 0x00002036, 0x000900F5, 0x0000001D, 0x0000380C, 0x0000427D,\n    0x00004F57, 0x00006296, 0x00002159, 0x00003917, 0x00002036, 0x000900F5,\n    0x0000001D, 0x00003B80, 0x0000427C, 0x00004F57, 0x00006295, 0x00002159,\n    0x00003916, 0x00002036, 0x000900F5, 0x0000001D, 0x000038B9, 0x0000427B,\n    0x00004F57, 0x00006294, 0x00002159, 0x00003915, 0x00002036, 0x000200F9,\n    0x00005310, 0x000200F8, 0x00005310, 0x000700F5, 0x0000001D, 0x00002BAC,\n    0x00002BAB, 0x00004F26, 0x00002BAA, 0x00003F61, 0x000700F5, 0x0000001D,\n    0x0000380D, 0x0000380C, 0x00004F26, 0x0000380B, 0x00003F61, 0x000700F5,\n    0x0000001D, 0x00003295, 0x00003B80, 0x00004F26, 0x00003B7F, 0x00003F61,\n    0x000700F5, 0x0000001D, 0x0000367A, 0x000038B9, 0x00004F26, 0x000038B8,\n    0x00003F61, 0x00050081, 0x0000001D, 0x00004359, 0x000020D3, 0x0000367A,\n    0x00050081, 0x0000001D, 0x00005B01, 0x000035EC, 0x00003295, 0x00050081,\n    0x0000001D, 0x00001F92, 0x0000380A, 0x0000380D, 0x00050081, 0x0000001D,\n    0x00005113, 0x00002BA9, 0x00002BAC, 0x000500AE, 0x00000009, 0x0000387D,\n    0x00004356, 0x00000A1C, 0x000300F7, 0x00005ECA, 0x00000002, 0x000400FA,\n    0x0000387D, 0x000026B1, 0x00005ECA, 0x000200F8, 0x000026B1, 0x000500C4,\n    0x0000000B, 0x000037B2, 0x00000A16, 0x000023AA, 0x00050085, 0x0000000D,\n    0x00002F3A, 0x00002B2C, 0x0000016E, 0x00050080, 0x0000000B, 0x000051FC,\n    0x00001E06, 0x000037B2, 0x000300F7, 0x00005311, 0x00000002, 0x000400FA,\n    0x00005AEF, 0x00003B67, 0x000040BB, 0x000200F8, 0x000040BB, 0x000500AA,\n    0x00000009, 0x00004ADD, 0x0000199B, 0x00000A16, 0x000300F7, 0x00004F4B,\n    0x00000002, 0x000400FA, 0x00004ADD, 0x000019C3, 0x00002303, 0x000200F8,\n    0x00002303, 0x000500C2, 0x0000000B, 0x00005634, 0x000051FC, 0x00000A11,\n    0x00060041, 0x00000289, 0x00003441, 0x00000CC7, 0x00000A0B, 0x00005634,\n    0x0004003D, 0x0000000B, 0x00003AD6, 0x00003441, 0x00050080, 0x0000000B,\n    0x00002149, 0x000051FC, 0x0000199B, 0x000500C2, 0x0000000B, 0x000054AA,\n    0x00002149, 0x00000A11, 0x00060041, 0x00000289, 0x00004CE1, 0x00000CC7,\n    0x00000A0B, 0x000054AA, 0x0004003D, 0x0000000B, 0x0000333E, 0x00004CE1,\n    0x00050084, 0x0000000B, 0x000021F3, 0x00000A10, 0x0000199B, 0x00050080,\n    0x0000000B, 0x00005EC4, 0x000051FC, 0x000021F3, 0x000500C2, 0x0000000B,\n    0x000045EA, 0x00005EC4, 0x00000A11, 0x00060041, 0x00000289, 0x00004CE2,\n    0x00000CC7, 0x00000A0B, 0x000045EA, 0x0004003D, 0x0000000B, 0x0000333F,\n    0x00004CE2, 0x00050084, 0x0000000B, 0x000021F4, 0x00000A13, 0x0000199B,\n    0x00050080, 0x0000000B, 0x00005EC5, 0x000051FC, 0x000021F4, 0x000500C2,\n    0x0000000B, 0x000045EB, 0x00005EC5, 0x00000A11, 0x00060041, 0x00000289,\n    0x00004903, 0x00000CC7, 0x00000A0B, 0x000045EB, 0x0004003D, 0x0000000B,\n    0x00005F5C, 0x00004903, 0x00070050, 0x00000017, 0x00005134, 0x00003AD6,\n    0x0000333E, 0x0000333F, 0x00005F5C, 0x000200F9, 0x00004F4B, 0x000200F8,\n    0x000019C3, 0x000500C2, 0x0000000B, 0x00005FAA, 0x000051FC, 0x00000A11,\n    0x00060041, 0x00000289, 0x00003442, 0x00000CC7, 0x00000A0B, 0x00005FAA,\n    0x0004003D, 0x0000000B, 0x0000314F, 0x00003442, 0x00050080, 0x0000000B,\n    0x00002DC1, 0x00005FAA, 0x00000A0D, 0x00060041, 0x00000289, 0x0000190D,\n    0x00000CC7, 0x00000A0B, 0x00002DC1, 0x0004003D, 0x0000000B, 0x00005C6E,\n    0x0000190D, 0x00050080, 0x0000000B, 0x00002DC2, 0x00005FAA, 0x00000A10,\n    0x00060041, 0x00000289, 0x0000190E, 0x00000CC7, 0x00000A0B, 0x00002DC2,\n    0x0004003D, 0x0000000B, 0x00005C6F, 0x0000190E, 0x00050080, 0x0000000B,\n    0x00002DC3, 0x00005FAA, 0x00000A13, 0x00060041, 0x00000289, 0x00005FF8,\n    0x00000CC7, 0x00000A0B, 0x00002DC3, 0x0004003D, 0x0000000B, 0x00004001,\n    0x00005FF8, 0x00070050, 0x00000017, 0x00005135, 0x0000314F, 0x00005C6E,\n    0x00005C6F, 0x00004001, 0x000200F9, 0x00004F4B, 0x000200F8, 0x00004F4B,\n    0x000700F5, 0x00000017, 0x00002AC1, 0x00005135, 0x000019C3, 0x00005134,\n    0x00002303, 0x000300F7, 0x00003F62, 0x00000000, 0x001300FB, 0x00002180,\n    0x00004BFD, 0x00000000, 0x000038FB, 0x00000001, 0x000038FB, 0x00000002,\n    0x00001CBF, 0x0000000A, 0x00001CBF, 0x00000003, 0x00001CBE, 0x0000000C,\n    0x00001CBE, 0x00000004, 0x00002000, 0x00000006, 0x00002037, 0x000200F8,\n    0x00002037, 0x00050051, 0x0000000B, 0x00005F5D, 0x00002AC1, 0x00000000,\n    0x0006000C, 0x00000013, 0x0000606B, 0x00000001, 0x0000003E, 0x00005F5D,\n    0x00050051, 0x0000000D, 0x00002772, 0x0000606B, 0x00000000, 0x00050051,\n    0x0000000D, 0x00004452, 0x0000606B, 0x00000001, 0x00070050, 0x0000001D,\n    0x00003918, 0x00002772, 0x00004452, 0x00000A0C, 0x00000A0C, 0x00050051,\n    0x0000000B, 0x00004386, 0x00002AC1, 0x00000001, 0x0006000C, 0x00000013,\n    0x00004677, 0x00000001, 0x0000003E, 0x00004386, 0x00050051, 0x0000000D,\n    0x00002773, 0x00004677, 0x00000000, 0x00050051, 0x0000000D, 0x00004453,\n    0x00004677, 0x00000001, 0x00070050, 0x0000001D, 0x00003919, 0x00002773,\n    0x00004453, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x00004387,\n    0x00002AC1, 0x00000002, 0x0006000C, 0x00000013, 0x00004678, 0x00000001,\n    0x0000003E, 0x00004387, 0x00050051, 0x0000000D, 0x00002774, 0x00004678,\n    0x00000000, 0x00050051, 0x0000000D, 0x00004454, 0x00004678, 0x00000001,\n    0x00070050, 0x0000001D, 0x0000391A, 0x00002774, 0x00004454, 0x00000A0C,\n    0x00000A0C, 0x00050051, 0x0000000B, 0x00004388, 0x00002AC1, 0x00000003,\n    0x0006000C, 0x00000013, 0x00004679, 0x00000001, 0x0000003E, 0x00004388,\n    0x00050051, 0x0000000D, 0x0000277D, 0x00004679, 0x00000000, 0x00050051,\n    0x0000000D, 0x000050C2, 0x00004679, 0x00000001, 0x00070050, 0x0000001D,\n    0x00002353, 0x0000277D, 0x000050C2, 0x00000A0C, 0x00000A0C, 0x000200F9,\n    0x00003F62, 0x000200F8, 0x00002000, 0x00050051, 0x0000000B, 0x0000308F,\n    0x00002AC1, 0x00000000, 0x0004007C, 0x0000000C, 0x0000589F, 0x0000308F,\n    0x00050050, 0x00000012, 0x00004728, 0x0000589F, 0x0000589F, 0x000500C4,\n    0x00000012, 0x000047B5, 0x00004728, 0x000007A7, 0x000500C3, 0x00000012,\n    0x0000341F, 0x000047B5, 0x00000867, 0x0004006F, 0x00000013, 0x00002AAF,\n    0x0000341F, 0x0005008E, 0x00000013, 0x0000474F, 0x00002AAF, 0x000007FE,\n    0x0007000C, 0x00000013, 0x00005E0E, 0x00000001, 0x00000028, 0x00000049,\n    0x0000474F, 0x00050051, 0x0000000D, 0x00005F12, 0x00005E0E, 0x00000000,\n    0x00050051, 0x0000000D, 0x00003CDA, 0x00005E0E, 0x00000001, 0x00070050,\n    0x0000001D, 0x00004124, 0x00005F12, 0x00003CDA, 0x00000A0C, 0x00000A0C,\n    0x00050051, 0x0000000B, 0x00004C48, 0x00002AC1, 0x00000001, 0x0004007C,\n    0x0000000C, 0x00003EA7, 0x00004C48, 0x00050050, 0x00000012, 0x00004729,\n    0x00003EA7, 0x00003EA7, 0x000500C4, 0x00000012, 0x000047B6, 0x00004729,\n    0x000007A7, 0x000500C3, 0x00000012, 0x00003420, 0x000047B6, 0x00000867,\n    0x0004006F, 0x00000013, 0x00002AB0, 0x00003420, 0x0005008E, 0x00000013,\n    0x00004750, 0x00002AB0, 0x000007FE, 0x0007000C, 0x00000013, 0x00005E0F,\n    0x00000001, 0x00000028, 0x00000049, 0x00004750, 0x00050051, 0x0000000D,\n    0x00005F13, 0x00005E0F, 0x00000000, 0x00050051, 0x0000000D, 0x00003CDB,\n    0x00005E0F, 0x00000001, 0x00070050, 0x0000001D, 0x00004125, 0x00005F13,\n    0x00003CDB, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x00004C49,\n    0x00002AC1, 0x00000002, 0x0004007C, 0x0000000C, 0x00003EA8, 0x00004C49,\n    0x00050050, 0x00000012, 0x0000472A, 0x00003EA8, 0x00003EA8, 0x000500C4,\n    0x00000012, 0x000047B7, 0x0000472A, 0x000007A7, 0x000500C3, 0x00000012,\n    0x00003421, 0x000047B7, 0x00000867, 0x0004006F, 0x00000013, 0x00002AB1,\n    0x00003421, 0x0005008E, 0x00000013, 0x00004751, 0x00002AB1, 0x000007FE,\n    0x0007000C, 0x00000013, 0x00005E10, 0x00000001, 0x00000028, 0x00000049,\n    0x00004751, 0x00050051, 0x0000000D, 0x00005F14, 0x00005E10, 0x00000000,\n    0x00050051, 0x0000000D, 0x00003CDC, 0x00005E10, 0x00000001, 0x00070050,\n    0x0000001D, 0x00004126, 0x00005F14, 0x00003CDC, 0x00000A0C, 0x00000A0C,\n    0x00050051, 0x0000000B, 0x00004C4A, 0x00002AC1, 0x00000003, 0x0004007C,\n    0x0000000C, 0x00003EA9, 0x00004C4A, 0x00050050, 0x00000012, 0x0000472B,\n    0x00003EA9, 0x00003EA9, 0x000500C4, 0x00000012, 0x000047B8, 0x0000472B,\n    0x000007A7, 0x000500C3, 0x00000012, 0x00003422, 0x000047B8, 0x00000867,\n    0x0004006F, 0x00000013, 0x00002AB2, 0x00003422, 0x0005008E, 0x00000013,\n    0x00004752, 0x00002AB2, 0x000007FE, 0x0007000C, 0x00000013, 0x00005E11,\n    0x00000001, 0x00000028, 0x00000049, 0x00004752, 0x00050051, 0x0000000D,\n    0x00005F15, 0x00005E11, 0x00000000, 0x00050051, 0x0000000D, 0x0000494E,\n    0x00005E11, 0x00000001, 0x00070050, 0x0000001D, 0x00002354, 0x00005F15,\n    0x0000494E, 0x00000A0C, 0x00000A0C, 0x000200F9, 0x00003F62, 0x000200F8,\n    0x00001CBE, 0x00050051, 0x0000000B, 0x000056C3, 0x00002AC1, 0x00000000,\n    0x00060050, 0x00000014, 0x00004F10, 0x000056C3, 0x000056C3, 0x000056C3,\n    0x000500C2, 0x00000014, 0x00002B17, 0x00004F10, 0x00000BB4, 0x000500C7,\n    0x00000014, 0x00005DEE, 0x00002B17, 0x00000105, 0x000500C7, 0x00000014,\n    0x000048A4, 0x00002B17, 0x00000466, 0x000500C2, 0x00000014, 0x00005B98,\n    0x00005DEE, 0x00000B0C, 0x000500AA, 0x00000010, 0x000040D1, 0x00005B98,\n    0x00000A12, 0x0006000C, 0x00000016, 0x00002C53, 0x00000001, 0x0000004B,\n    0x000048A4, 0x0004007C, 0x00000014, 0x00002A1D, 0x00002C53, 0x00050082,\n    0x00000014, 0x00001882, 0x00000B0C, 0x00002A1D, 0x00050080, 0x00000014,\n    0x00002218, 0x00002A1D, 0x00000938, 0x000600A9, 0x00000014, 0x00002877,\n    0x000040D1, 0x00002218, 0x00005B98, 0x000500C4, 0x00000014, 0x00005ADC,\n    0x000048A4, 0x00001882, 0x000500C7, 0x00000014, 0x000049A2, 0x00005ADC,\n    0x00000466, 0x000600A9, 0x00000014, 0x00002AB3, 0x000040D1, 0x000049A2,\n    0x000048A4, 0x00050080, 0x00000014, 0x00006001, 0x00002877, 0x000003FA,\n    0x000500C4, 0x00000014, 0x00004F87, 0x00006001, 0x00000189, 0x000500C4,\n    0x00000014, 0x00003FAE, 0x00002AB3, 0x0000008D, 0x000500C5, 0x00000014,\n    0x00005784, 0x00004F87, 0x00003FAE, 0x000500AA, 0x00000010, 0x00003608,\n    0x00005DEE, 0x00000A12, 0x000600A9, 0x00000014, 0x0000424A, 0x00003608,\n    0x00000A12, 0x00005784, 0x0004007C, 0x00000018, 0x000029D7, 0x0000424A,\n    0x000500C2, 0x0000000B, 0x00004BAC, 0x000056C3, 0x00000A64, 0x00040070,\n    0x0000000D, 0x00004816, 0x00004BAC, 0x00050085, 0x0000000D, 0x00003E27,\n    0x00004816, 0x00000149, 0x00050051, 0x0000000D, 0x000053CA, 0x000029D7,\n    0x00000000, 0x00050051, 0x0000000D, 0x00002A5D, 0x000029D7, 0x00000001,\n    0x00050051, 0x0000000D, 0x00001E9F, 0x000029D7, 0x00000002, 0x00070050,\n    0x0000001D, 0x00003DE0, 0x000053CA, 0x00002A5D, 0x00001E9F, 0x00003E27,\n    0x00050051, 0x0000000B, 0x000027FB, 0x00002AC1, 0x00000001, 0x00060050,\n    0x00000014, 0x00003514, 0x000027FB, 0x000027FB, 0x000027FB, 0x000500C2,\n    0x00000014, 0x00002B18, 0x00003514, 0x00000BB4, 0x000500C7, 0x00000014,\n    0x00005DEF, 0x00002B18, 0x00000105, 0x000500C7, 0x00000014, 0x000048A5,\n    0x00002B18, 0x00000466, 0x000500C2, 0x00000014, 0x00005B99, 0x00005DEF,\n    0x00000B0C, 0x000500AA, 0x00000010, 0x000040D2, 0x00005B99, 0x00000A12,\n    0x0006000C, 0x00000016, 0x00002C54, 0x00000001, 0x0000004B, 0x000048A5,\n    0x0004007C, 0x00000014, 0x00002A1E, 0x00002C54, 0x00050082, 0x00000014,\n    0x00001883, 0x00000B0C, 0x00002A1E, 0x00050080, 0x00000014, 0x00002219,\n    0x00002A1E, 0x00000938, 0x000600A9, 0x00000014, 0x00002878, 0x000040D2,\n    0x00002219, 0x00005B99, 0x000500C4, 0x00000014, 0x00005ADD, 0x000048A5,\n    0x00001883, 0x000500C7, 0x00000014, 0x000049A3, 0x00005ADD, 0x00000466,\n    0x000600A9, 0x00000014, 0x00002AB4, 0x000040D2, 0x000049A3, 0x000048A5,\n    0x00050080, 0x00000014, 0x00006002, 0x00002878, 0x000003FA, 0x000500C4,\n    0x00000014, 0x00004F88, 0x00006002, 0x00000189, 0x000500C4, 0x00000014,\n    0x00003FAF, 0x00002AB4, 0x0000008D, 0x000500C5, 0x00000014, 0x00005785,\n    0x00004F88, 0x00003FAF, 0x000500AA, 0x00000010, 0x00003609, 0x00005DEF,\n    0x00000A12, 0x000600A9, 0x00000014, 0x0000424B, 0x00003609, 0x00000A12,\n    0x00005785, 0x0004007C, 0x00000018, 0x000029D8, 0x0000424B, 0x000500C2,\n    0x0000000B, 0x00004BAD, 0x000027FB, 0x00000A64, 0x00040070, 0x0000000D,\n    0x00004817, 0x00004BAD, 0x00050085, 0x0000000D, 0x00003E28, 0x00004817,\n    0x00000149, 0x00050051, 0x0000000D, 0x000053CB, 0x000029D8, 0x00000000,\n    0x00050051, 0x0000000D, 0x00002A5E, 0x000029D8, 0x00000001, 0x00050051,\n    0x0000000D, 0x00001EA0, 0x000029D8, 0x00000002, 0x00070050, 0x0000001D,\n    0x00003DE1, 0x000053CB, 0x00002A5E, 0x00001EA0, 0x00003E28, 0x00050051,\n    0x0000000B, 0x000027FC, 0x00002AC1, 0x00000002, 0x00060050, 0x00000014,\n    0x00003515, 0x000027FC, 0x000027FC, 0x000027FC, 0x000500C2, 0x00000014,\n    0x00002B19, 0x00003515, 0x00000BB4, 0x000500C7, 0x00000014, 0x00005DF0,\n    0x00002B19, 0x00000105, 0x000500C7, 0x00000014, 0x000048AE, 0x00002B19,\n    0x00000466, 0x000500C2, 0x00000014, 0x00005B9A, 0x00005DF0, 0x00000B0C,\n    0x000500AA, 0x00000010, 0x000040D3, 0x00005B9A, 0x00000A12, 0x0006000C,\n    0x00000016, 0x00002C55, 0x00000001, 0x0000004B, 0x000048AE, 0x0004007C,\n    0x00000014, 0x00002A1F, 0x00002C55, 0x00050082, 0x00000014, 0x00001884,\n    0x00000B0C, 0x00002A1F, 0x00050080, 0x00000014, 0x0000221A, 0x00002A1F,\n    0x00000938, 0x000600A9, 0x00000014, 0x00002879, 0x000040D3, 0x0000221A,\n    0x00005B9A, 0x000500C4, 0x00000014, 0x00005ADE, 0x000048AE, 0x00001884,\n    0x000500C7, 0x00000014, 0x000049A4, 0x00005ADE, 0x00000466, 0x000600A9,\n    0x00000014, 0x00002AB5, 0x000040D3, 0x000049A4, 0x000048AE, 0x00050080,\n    0x00000014, 0x00006003, 0x00002879, 0x000003FA, 0x000500C4, 0x00000014,\n    0x00004F89, 0x00006003, 0x00000189, 0x000500C4, 0x00000014, 0x00003FB0,\n    0x00002AB5, 0x0000008D, 0x000500C5, 0x00000014, 0x00005786, 0x00004F89,\n    0x00003FB0, 0x000500AA, 0x00000010, 0x0000360A, 0x00005DF0, 0x00000A12,\n    0x000600A9, 0x00000014, 0x0000424C, 0x0000360A, 0x00000A12, 0x00005786,\n    0x0004007C, 0x00000018, 0x000029D9, 0x0000424C, 0x000500C2, 0x0000000B,\n    0x00004BAE, 0x000027FC, 0x00000A64, 0x00040070, 0x0000000D, 0x00004818,\n    0x00004BAE, 0x00050085, 0x0000000D, 0x00003E29, 0x00004818, 0x00000149,\n    0x00050051, 0x0000000D, 0x000053CC, 0x000029D9, 0x00000000, 0x00050051,\n    0x0000000D, 0x00002A5F, 0x000029D9, 0x00000001, 0x00050051, 0x0000000D,\n    0x00001EA1, 0x000029D9, 0x00000002, 0x00070050, 0x0000001D, 0x00003DE2,\n    0x000053CC, 0x00002A5F, 0x00001EA1, 0x00003E29, 0x00050051, 0x0000000B,\n    0x000027FD, 0x00002AC1, 0x00000003, 0x00060050, 0x00000014, 0x00003516,\n    0x000027FD, 0x000027FD, 0x000027FD, 0x000500C2, 0x00000014, 0x00002B1A,\n    0x00003516, 0x00000BB4, 0x000500C7, 0x00000014, 0x00005DF1, 0x00002B1A,\n    0x00000105, 0x000500C7, 0x00000014, 0x000048AF, 0x00002B1A, 0x00000466,\n    0x000500C2, 0x00000014, 0x00005B9B, 0x00005DF1, 0x00000B0C, 0x000500AA,\n    0x00000010, 0x000040D4, 0x00005B9B, 0x00000A12, 0x0006000C, 0x00000016,\n    0x00002C56, 0x00000001, 0x0000004B, 0x000048AF, 0x0004007C, 0x00000014,\n    0x00002A20, 0x00002C56, 0x00050082, 0x00000014, 0x00001885, 0x00000B0C,\n    0x00002A20, 0x00050080, 0x00000014, 0x0000221B, 0x00002A20, 0x00000938,\n    0x000600A9, 0x00000014, 0x0000287A, 0x000040D4, 0x0000221B, 0x00005B9B,\n    0x000500C4, 0x00000014, 0x00005ADF, 0x000048AF, 0x00001885, 0x000500C7,\n    0x00000014, 0x000049A5, 0x00005ADF, 0x00000466, 0x000600A9, 0x00000014,\n    0x00002AB6, 0x000040D4, 0x000049A5, 0x000048AF, 0x00050080, 0x00000014,\n    0x00006004, 0x0000287A, 0x000003FA, 0x000500C4, 0x00000014, 0x00004F8A,\n    0x00006004, 0x00000189, 0x000500C4, 0x00000014, 0x00003FB1, 0x00002AB6,\n    0x0000008D, 0x000500C5, 0x00000014, 0x00005787, 0x00004F8A, 0x00003FB1,\n    0x000500AA, 0x00000010, 0x0000360B, 0x00005DF1, 0x00000A12, 0x000600A9,\n    0x00000014, 0x0000424D, 0x0000360B, 0x00000A12, 0x00005787, 0x0004007C,\n    0x00000018, 0x000029DA, 0x0000424D, 0x000500C2, 0x0000000B, 0x00004BAF,\n    0x000027FD, 0x00000A64, 0x00040070, 0x0000000D, 0x00004819, 0x00004BAF,\n    0x00050085, 0x0000000D, 0x00003E2A, 0x00004819, 0x00000149, 0x00050051,\n    0x0000000D, 0x000053CD, 0x000029DA, 0x00000000, 0x00050051, 0x0000000D,\n    0x00002A60, 0x000029DA, 0x00000001, 0x00050051, 0x0000000D, 0x00002B1B,\n    0x000029DA, 0x00000002, 0x00070050, 0x0000001D, 0x00002355, 0x000053CD,\n    0x00002A60, 0x00002B1B, 0x00003E2A, 0x000200F9, 0x00003F62, 0x000200F8,\n    0x00001CBF, 0x00050051, 0x0000000B, 0x000056C4, 0x00002AC1, 0x00000000,\n    0x00070050, 0x00000017, 0x00004F11, 0x000056C4, 0x000056C4, 0x000056C4,\n    0x000056C4, 0x000500C2, 0x00000017, 0x000024A8, 0x00004F11, 0x0000034D,\n    0x000500C7, 0x00000017, 0x000049B3, 0x000024A8, 0x0000027B, 0x00040070,\n    0x0000001D, 0x00003CBD, 0x000049B3, 0x00050085, 0x0000001D, 0x00004136,\n    0x00003CBD, 0x00000AEE, 0x00050051, 0x0000000B, 0x00005CD8, 0x00002AC1,\n    0x00000001, 0x00070050, 0x00000017, 0x00005153, 0x00005CD8, 0x00005CD8,\n    0x00005CD8, 0x00005CD8, 0x000500C2, 0x00000017, 0x000024A9, 0x00005153,\n    0x0000034D, 0x000500C7, 0x00000017, 0x000049B4, 0x000024A9, 0x0000027B,\n    0x00040070, 0x0000001D, 0x00003CBE, 0x000049B4, 0x00050085, 0x0000001D,\n    0x00004137, 0x00003CBE, 0x00000AEE, 0x00050051, 0x0000000B, 0x00005CD9,\n    0x00002AC1, 0x00000002, 0x00070050, 0x00000017, 0x00005154, 0x00005CD9,\n    0x00005CD9, 0x00005CD9, 0x00005CD9, 0x000500C2, 0x00000017, 0x000024AA,\n    0x00005154, 0x0000034D, 0x000500C7, 0x00000017, 0x000049B5, 0x000024AA,\n    0x0000027B, 0x00040070, 0x0000001D, 0x00003CBF, 0x000049B5, 0x00050085,\n    0x0000001D, 0x00004138, 0x00003CBF, 0x00000AEE, 0x00050051, 0x0000000B,\n    0x00005CDA, 0x00002AC1, 0x00000003, 0x00070050, 0x00000017, 0x00005155,\n    0x00005CDA, 0x00005CDA, 0x00005CDA, 0x00005CDA, 0x000500C2, 0x00000017,\n    0x000024AB, 0x00005155, 0x0000034D, 0x000500C7, 0x00000017, 0x000049B6,\n    0x000024AB, 0x0000027B, 0x00040070, 0x0000001D, 0x00004931, 0x000049B6,\n    0x00050085, 0x0000001D, 0x000026A1, 0x00004931, 0x00000AEE, 0x000200F9,\n    0x00003F62, 0x000200F8, 0x000038FB, 0x00050051, 0x0000000B, 0x000056C5,\n    0x00002AC1, 0x00000000, 0x00070050, 0x00000017, 0x00004F12, 0x000056C5,\n    0x000056C5, 0x000056C5, 0x000056C5, 0x000500C2, 0x00000017, 0x000024AC,\n    0x00004F12, 0x0000028D, 0x000500C7, 0x00000017, 0x00004A5E, 0x000024AC,\n    0x0000064B, 0x00040070, 0x0000001D, 0x000036A8, 0x00004A5E, 0x0005008E,\n    0x0000001D, 0x00004B29, 0x000036A8, 0x0000017A, 0x00050051, 0x0000000B,\n    0x000021A5, 0x00002AC1, 0x00000001, 0x00070050, 0x00000017, 0x00006111,\n    0x000021A5, 0x000021A5, 0x000021A5, 0x000021A5, 0x000500C2, 0x00000017,\n    0x000024AD, 0x00006111, 0x0000028D, 0x000500C7, 0x00000017, 0x00004A5F,\n    0x000024AD, 0x0000064B, 0x00040070, 0x0000001D, 0x000036A9, 0x00004A5F,\n    0x0005008E, 0x0000001D, 0x00004B2A, 0x000036A9, 0x0000017A, 0x00050051,\n    0x0000000B, 0x000021A6, 0x00002AC1, 0x00000002, 0x00070050, 0x00000017,\n    0x00006112, 0x000021A6, 0x000021A6, 0x000021A6, 0x000021A6, 0x000500C2,\n    0x00000017, 0x000024AE, 0x00006112, 0x0000028D, 0x000500C7, 0x00000017,\n    0x00004A60, 0x000024AE, 0x0000064B, 0x00040070, 0x0000001D, 0x000036AA,\n    0x00004A60, 0x0005008E, 0x0000001D, 0x00004B2B, 0x000036AA, 0x0000017A,\n    0x00050051, 0x0000000B, 0x000021A7, 0x00002AC1, 0x00000003, 0x00070050,\n    0x00000017, 0x00006113, 0x000021A7, 0x000021A7, 0x000021A7, 0x000021A7,\n    0x000500C2, 0x00000017, 0x000024AF, 0x00006113, 0x0000028D, 0x000500C7,\n    0x00000017, 0x00004A61, 0x000024AF, 0x0000064B, 0x00040070, 0x0000001D,\n    0x0000431C, 0x00004A61, 0x0005008E, 0x0000001D, 0x00003094, 0x0000431C,\n    0x0000017A, 0x000200F9, 0x00003F62, 0x000200F8, 0x00004BFD, 0x00050051,\n    0x0000000B, 0x00003090, 0x00002AC1, 0x00000000, 0x0004007C, 0x0000000D,\n    0x00004FF0, 0x00003090, 0x00050050, 0x00000013, 0x0000433C, 0x00004FF0,\n    0x00000A0C, 0x0009004F, 0x0000001D, 0x00002D96, 0x0000433C, 0x0000433C,\n    0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00050051, 0x0000000B,\n    0x000056B7, 0x00002AC1, 0x00000001, 0x0004007C, 0x0000000D, 0x00003F6E,\n    0x000056B7, 0x00050050, 0x00000013, 0x0000433D, 0x00003F6E, 0x00000A0C,\n    0x0009004F, 0x0000001D, 0x00002D97, 0x0000433D, 0x0000433D, 0x00000000,\n    0x00000001, 0x00000001, 0x00000001, 0x00050051, 0x0000000B, 0x000056B8,\n    0x00002AC1, 0x00000002, 0x0004007C, 0x0000000D, 0x00003F6F, 0x000056B8,\n    0x00050050, 0x00000013, 0x0000433E, 0x00003F6F, 0x00000A0C, 0x0009004F,\n    0x0000001D, 0x00002D98, 0x0000433E, 0x0000433E, 0x00000000, 0x00000001,\n    0x00000001, 0x00000001, 0x00050051, 0x0000000B, 0x000056B9, 0x00002AC1,\n    0x00000003, 0x0004007C, 0x0000000D, 0x00003F70, 0x000056B9, 0x00050050,\n    0x00000013, 0x00004FB0, 0x00003F70, 0x00000A0C, 0x0009004F, 0x0000001D,\n    0x00005A3C, 0x00004FB0, 0x00004FB0, 0x00000000, 0x00000001, 0x00000001,\n    0x00000001, 0x000200F9, 0x00003F62, 0x000200F8, 0x00003F62, 0x000F00F5,\n    0x0000001D, 0x00002BAD, 0x00005A3C, 0x00004BFD, 0x00003094, 0x000038FB,\n    0x000026A1, 0x00001CBF, 0x00002355, 0x00001CBE, 0x00002354, 0x00002000,\n    0x00002353, 0x00002037, 0x000F00F5, 0x0000001D, 0x0000380E, 0x00002D98,\n    0x00004BFD, 0x00004B2B, 0x000038FB, 0x00004138, 0x00001CBF, 0x00003DE2,\n    0x00001CBE, 0x00004126, 0x00002000, 0x0000391A, 0x00002037, 0x000F00F5,\n    0x0000001D, 0x00003B81, 0x00002D97, 0x00004BFD, 0x00004B2A, 0x000038FB,\n    0x00004137, 0x00001CBF, 0x00003DE1, 0x00001CBE, 0x00004125, 0x00002000,\n    0x00003919, 0x00002037, 0x000F00F5, 0x0000001D, 0x000038BA, 0x00002D96,\n    0x00004BFD, 0x00004B29, 0x000038FB, 0x00004136, 0x00001CBF, 0x00003DE0,\n    0x00001CBE, 0x00004124, 0x00002000, 0x00003918, 0x00002037, 0x000200F9,\n    0x00005311, 0x000200F8, 0x00003B67, 0x000500AA, 0x00000009, 0x00005452,\n    0x0000199B, 0x00000A22, 0x000300F7, 0x00004F27, 0x00000002, 0x000400FA,\n    0x00005452, 0x000019C4, 0x00002304, 0x000200F8, 0x00002304, 0x000500C2,\n    0x0000000B, 0x00005635, 0x000051FC, 0x00000A11, 0x00060041, 0x00000289,\n    0x00003443, 0x00000CC7, 0x00000A0B, 0x00005635, 0x0004003D, 0x0000000B,\n    0x00003150, 0x00003443, 0x00050080, 0x0000000B, 0x00002DC4, 0x00005635,\n    0x00000A0D, 0x00060041, 0x00000289, 0x0000190F, 0x00000CC7, 0x00000A0B,\n    0x00002DC4, 0x0004003D, 0x0000000B, 0x00001B78, 0x0000190F, 0x00050080,\n    0x0000000B, 0x0000214A, 0x000051FC, 0x0000199B, 0x000500C2, 0x0000000B,\n    0x000054AB, 0x0000214A, 0x00000A11, 0x00060041, 0x00000289, 0x00004C99,\n    0x00000CC7, 0x00000A0B, 0x000054AB, 0x0004003D, 0x0000000B, 0x00003151,\n    0x00004C99, 0x00050080, 0x0000000B, 0x00002DC5, 0x000054AB, 0x00000A0D,\n    0x00060041, 0x00000289, 0x00006005, 0x00000CC7, 0x00000A0B, 0x00002DC5,\n    0x0004003D, 0x0000000B, 0x0000374E, 0x00006005, 0x00070050, 0x00000017,\n    0x00004CD9, 0x00003150, 0x00001B78, 0x00003151, 0x0000374E, 0x00050084,\n    0x0000000B, 0x00004C2D, 0x00000A10, 0x0000199B, 0x00050080, 0x0000000B,\n    0x00002A47, 0x000051FC, 0x00004C2D, 0x000500C2, 0x0000000B, 0x000045EC,\n    0x00002A47, 0x00000A11, 0x00060041, 0x00000289, 0x00004C9A, 0x00000CC7,\n    0x00000A0B, 0x000045EC, 0x0004003D, 0x0000000B, 0x00003152, 0x00004C9A,\n    0x00050080, 0x0000000B, 0x00002DC6, 0x000045EC, 0x00000A0D, 0x00060041,\n    0x00000289, 0x0000194D, 0x00000CC7, 0x00000A0B, 0x00002DC6, 0x0004003D,\n    0x0000000B, 0x00005E5D, 0x0000194D, 0x00050084, 0x0000000B, 0x000021F5,\n    0x00000A13, 0x0000199B, 0x00050080, 0x0000000B, 0x00005EC6, 0x000051FC,\n    0x000021F5, 0x000500C2, 0x0000000B, 0x000045ED, 0x00005EC6, 0x00000A11,\n    0x00060041, 0x00000289, 0x00004C9B, 0x00000CC7, 0x00000A0B, 0x000045ED,\n    0x0004003D, 0x0000000B, 0x00003153, 0x00004C9B, 0x00050080, 0x0000000B,\n    0x00002DC7, 0x000045ED, 0x00000A0D, 0x00060041, 0x00000289, 0x00006006,\n    0x00000CC7, 0x00000A0B, 0x00002DC7, 0x0004003D, 0x0000000B, 0x00004002,\n    0x00006006, 0x00070050, 0x00000017, 0x00005136, 0x00003152, 0x00005E5D,\n    0x00003153, 0x00004002, 0x000200F9, 0x00004F27, 0x000200F8, 0x000019C4,\n    0x000500C2, 0x0000000B, 0x00005FAB, 0x000051FC, 0x00000A11, 0x00060041,\n    0x00000289, 0x00003444, 0x00000CC7, 0x00000A0B, 0x00005FAB, 0x0004003D,\n    0x0000000B, 0x00003154, 0x00003444, 0x00050080, 0x0000000B, 0x00002DC8,\n    0x00005FAB, 0x00000A0D, 0x00060041, 0x00000289, 0x00001910, 0x00000CC7,\n    0x00000A0B, 0x00002DC8, 0x0004003D, 0x0000000B, 0x00005C70, 0x00001910,\n    0x00050080, 0x0000000B, 0x00002DC9, 0x00005FAB, 0x00000A10, 0x00060041,\n    0x00000289, 0x00001911, 0x00000CC7, 0x00000A0B, 0x00002DC9, 0x0004003D,\n    0x0000000B, 0x00005C71, 0x00001911, 0x00050080, 0x0000000B, 0x00002DCA,\n    0x00005FAB, 0x00000A13, 0x00060041, 0x00000289, 0x00006007, 0x00000CC7,\n    0x00000A0B, 0x00002DCA, 0x0004003D, 0x0000000B, 0x00003702, 0x00006007,\n    0x00070050, 0x00000017, 0x00005472, 0x00003154, 0x00005C70, 0x00005C71,\n    0x00003702, 0x00050080, 0x0000000B, 0x00004B85, 0x000051FC, 0x00000A3A,\n    0x000500C2, 0x0000000B, 0x0000202F, 0x00004B85, 0x00000A11, 0x00060041,\n    0x00000289, 0x00004C9C, 0x00000CC7, 0x00000A0B, 0x0000202F, 0x0004003D,\n    0x0000000B, 0x00003155, 0x00004C9C, 0x00050080, 0x0000000B, 0x00002DCB,\n    0x0000202F, 0x00000A0D, 0x00060041, 0x00000289, 0x00001912, 0x00000CC7,\n    0x00000A0B, 0x00002DCB, 0x0004003D, 0x0000000B, 0x00005C72, 0x00001912,\n    0x00050080, 0x0000000B, 0x00002DCC, 0x0000202F, 0x00000A10, 0x00060041,\n    0x00000289, 0x00001913, 0x00000CC7, 0x00000A0B, 0x00002DCC, 0x0004003D,\n    0x0000000B, 0x00005C73, 0x00001913, 0x00050080, 0x0000000B, 0x00002DCD,\n    0x0000202F, 0x00000A13, 0x00060041, 0x00000289, 0x00006008, 0x00000CC7,\n    0x00000A0B, 0x00002DCD, 0x0004003D, 0x0000000B, 0x00004003, 0x00006008,\n    0x00070050, 0x00000017, 0x00005137, 0x00003155, 0x00005C72, 0x00005C73,\n    0x00004003, 0x000200F9, 0x00004F27, 0x000200F8, 0x00004F27, 0x000700F5,\n    0x00000017, 0x00002BCF, 0x00005137, 0x000019C4, 0x00005136, 0x00002304,\n    0x000700F5, 0x00000017, 0x00003722, 0x00005472, 0x000019C4, 0x00004CD9,\n    0x00002304, 0x000300F7, 0x00004F28, 0x00000000, 0x000700FB, 0x00002180,\n    0x00004F58, 0x00000005, 0x0000215A, 0x00000007, 0x00002038, 0x000200F8,\n    0x00002038, 0x00050051, 0x0000000B, 0x00005F5E, 0x00003722, 0x00000000,\n    0x0006000C, 0x00000013, 0x0000606C, 0x00000001, 0x0000003E, 0x00005F5E,\n    0x00050051, 0x0000000D, 0x0000277E, 0x0000606C, 0x00000000, 0x00050051,\n    0x0000000D, 0x00003EC0, 0x0000606C, 0x00000001, 0x00050051, 0x0000000B,\n    0x00004289, 0x00003722, 0x00000001, 0x0006000C, 0x00000013, 0x00003CFD,\n    0x00000001, 0x0000003E, 0x00004289, 0x00050051, 0x0000000D, 0x0000277F,\n    0x00003CFD, 0x00000000, 0x00050051, 0x0000000D, 0x00004455, 0x00003CFD,\n    0x00000001, 0x00070050, 0x0000001D, 0x0000391B, 0x0000277E, 0x00003EC0,\n    0x0000277F, 0x00004455, 0x00050051, 0x0000000B, 0x00004389, 0x00003722,\n    0x00000002, 0x0006000C, 0x00000013, 0x0000467A, 0x00000001, 0x0000003E,\n    0x00004389, 0x00050051, 0x0000000D, 0x00002780, 0x0000467A, 0x00000000,\n    0x00050051, 0x0000000D, 0x00003EC1, 0x0000467A, 0x00000001, 0x00050051,\n    0x0000000B, 0x0000428A, 0x00003722, 0x00000003, 0x0006000C, 0x00000013,\n    0x00003CFE, 0x00000001, 0x0000003E, 0x0000428A, 0x00050051, 0x0000000D,\n    0x00002781, 0x00003CFE, 0x00000000, 0x00050051, 0x0000000D, 0x00004456,\n    0x00003CFE, 0x00000001, 0x00070050, 0x0000001D, 0x0000391C, 0x00002780,\n    0x00003EC1, 0x00002781, 0x00004456, 0x00050051, 0x0000000B, 0x0000438A,\n    0x00002BCF, 0x00000000, 0x0006000C, 0x00000013, 0x0000467B, 0x00000001,\n    0x0000003E, 0x0000438A, 0x00050051, 0x0000000D, 0x00002782, 0x0000467B,\n    0x00000000, 0x00050051, 0x0000000D, 0x00003EC2, 0x0000467B, 0x00000001,\n    0x00050051, 0x0000000B, 0x0000428B, 0x00002BCF, 0x00000001, 0x0006000C,\n    0x00000013, 0x00003CFF, 0x00000001, 0x0000003E, 0x0000428B, 0x00050051,\n    0x0000000D, 0x00002783, 0x00003CFF, 0x00000000, 0x00050051, 0x0000000D,\n    0x00004457, 0x00003CFF, 0x00000001, 0x00070050, 0x0000001D, 0x0000391D,\n    0x00002782, 0x00003EC2, 0x00002783, 0x00004457, 0x00050051, 0x0000000B,\n    0x0000438B, 0x00002BCF, 0x00000002, 0x0006000C, 0x00000013, 0x0000467C,\n    0x00000001, 0x0000003E, 0x0000438B, 0x00050051, 0x0000000D, 0x00002784,\n    0x0000467C, 0x00000000, 0x00050051, 0x0000000D, 0x00003EC3, 0x0000467C,\n    0x00000001, 0x00050051, 0x0000000B, 0x0000428C, 0x00002BCF, 0x00000003,\n    0x0006000C, 0x00000013, 0x00003D00, 0x00000001, 0x0000003E, 0x0000428C,\n    0x00050051, 0x0000000D, 0x00002785, 0x00003D00, 0x00000000, 0x00050051,\n    0x0000000D, 0x000050C3, 0x00003D00, 0x00000001, 0x00070050, 0x0000001D,\n    0x00002356, 0x00002784, 0x00003EC3, 0x00002785, 0x000050C3, 0x000200F9,\n    0x00004F28, 0x000200F8, 0x0000215A, 0x0007004F, 0x00000011, 0x000025FD,\n    0x00003722, 0x00003722, 0x00000000, 0x00000001, 0x0004007C, 0x00000012,\n    0x00005B3E, 0x000025FD, 0x0009004F, 0x0000001A, 0x000060D6, 0x00005B3E,\n    0x00005B3E, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x000500C4,\n    0x0000001A, 0x000048B0, 0x000060D6, 0x00000122, 0x000500C3, 0x0000001A,\n    0x00003D95, 0x000048B0, 0x00000302, 0x0004006F, 0x0000001D, 0x00002AB7,\n    0x00003D95, 0x0005008E, 0x0000001D, 0x0000472C, 0x00002AB7, 0x000007FE,\n    0x0007000C, 0x0000001D, 0x00006297, 0x00000001, 0x00000028, 0x00000504,\n    0x0000472C, 0x0007004F, 0x00000011, 0x00003771, 0x00003722, 0x00003722,\n    0x00000002, 0x00000003, 0x0004007C, 0x00000012, 0x000024C5, 0x00003771,\n    0x0009004F, 0x0000001A, 0x000060D7, 0x000024C5, 0x000024C5, 0x00000000,\n    0x00000000, 0x00000001, 0x00000001, 0x000500C4, 0x0000001A, 0x000048B1,\n    0x000060D7, 0x00000122, 0x000500C3, 0x0000001A, 0x00003D96, 0x000048B1,\n    0x00000302, 0x0004006F, 0x0000001D, 0x00002AB8, 0x00003D96, 0x0005008E,\n    0x0000001D, 0x0000472D, 0x00002AB8, 0x000007FE, 0x0007000C, 0x0000001D,\n    0x00006298, 0x00000001, 0x00000028, 0x00000504, 0x0000472D, 0x0007004F,\n    0x00000011, 0x00003772, 0x00002BCF, 0x00002BCF, 0x00000000, 0x00000001,\n    0x0004007C, 0x00000012, 0x000024C6, 0x00003772, 0x0009004F, 0x0000001A,\n    0x000060D8, 0x000024C6, 0x000024C6, 0x00000000, 0x00000000, 0x00000001,\n    0x00000001, 0x000500C4, 0x0000001A, 0x000048B2, 0x000060D8, 0x00000122,\n    0x000500C3, 0x0000001A, 0x00003D97, 0x000048B2, 0x00000302, 0x0004006F,\n    0x0000001D, 0x00002AB9, 0x00003D97, 0x0005008E, 0x0000001D, 0x0000472E,\n    0x00002AB9, 0x000007FE, 0x0007000C, 0x0000001D, 0x00006299, 0x00000001,\n    0x00000028, 0x00000504, 0x0000472E, 0x0007004F, 0x00000011, 0x00003773,\n    0x00002BCF, 0x00002BCF, 0x00000002, 0x00000003, 0x0004007C, 0x00000012,\n    0x000024C7, 0x00003773, 0x0009004F, 0x0000001A, 0x000060D9, 0x000024C7,\n    0x000024C7, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x000500C4,\n    0x0000001A, 0x000048B3, 0x000060D9, 0x00000122, 0x000500C3, 0x0000001A,\n    0x00003D98, 0x000048B3, 0x00000302, 0x0004006F, 0x0000001D, 0x00002ABA,\n    0x00003D98, 0x0005008E, 0x0000001D, 0x000053C1, 0x00002ABA, 0x000007FE,\n    0x0007000C, 0x0000001D, 0x00004364, 0x00000001, 0x00000028, 0x00000504,\n    0x000053C1, 0x000200F9, 0x00004F28, 0x000200F8, 0x00004F58, 0x0007004F,\n    0x00000011, 0x00002623, 0x00003722, 0x00003722, 0x00000000, 0x00000001,\n    0x0004007C, 0x00000013, 0x0000515B, 0x00002623, 0x00050051, 0x0000000D,\n    0x00001B84, 0x0000515B, 0x00000000, 0x00050051, 0x0000000D, 0x00003470,\n    0x0000515B, 0x00000001, 0x00070050, 0x0000001D, 0x0000427E, 0x00001B84,\n    0x00003470, 0x00000A0C, 0x00000A0C, 0x0007004F, 0x00000011, 0x000041DE,\n    0x00003722, 0x00003722, 0x00000002, 0x00000003, 0x0004007C, 0x00000013,\n    0x00003763, 0x000041DE, 0x00050051, 0x0000000D, 0x00001B85, 0x00003763,\n    0x00000000, 0x00050051, 0x0000000D, 0x00003471, 0x00003763, 0x00000001,\n    0x00070050, 0x0000001D, 0x0000427F, 0x00001B85, 0x00003471, 0x00000A0C,\n    0x00000A0C, 0x0007004F, 0x00000011, 0x000041DF, 0x00002BCF, 0x00002BCF,\n    0x00000000, 0x00000001, 0x0004007C, 0x00000013, 0x00003764, 0x000041DF,\n    0x00050051, 0x0000000D, 0x00001B86, 0x00003764, 0x00000000, 0x00050051,\n    0x0000000D, 0x00003472, 0x00003764, 0x00000001, 0x00070050, 0x0000001D,\n    0x00004280, 0x00001B86, 0x00003472, 0x00000A0C, 0x00000A0C, 0x0007004F,\n    0x00000011, 0x000041E0, 0x00002BCF, 0x00002BCF, 0x00000002, 0x00000003,\n    0x0004007C, 0x00000013, 0x00003765, 0x000041E0, 0x00050051, 0x0000000D,\n    0x00001B87, 0x00003765, 0x00000000, 0x00050051, 0x0000000D, 0x0000410A,\n    0x00003765, 0x00000001, 0x00070050, 0x0000001D, 0x00002357, 0x00001B87,\n    0x0000410A, 0x00000A0C, 0x00000A0C, 0x000200F9, 0x00004F28, 0x000200F8,\n    0x00004F28, 0x000900F5, 0x0000001D, 0x00002BAE, 0x00002357, 0x00004F58,\n    0x00004364, 0x0000215A, 0x00002356, 0x00002038, 0x000900F5, 0x0000001D,\n    0x0000380F, 0x00004280, 0x00004F58, 0x00006299, 0x0000215A, 0x0000391D,\n    0x00002038, 0x000900F5, 0x0000001D, 0x00003B82, 0x0000427F, 0x00004F58,\n    0x00006298, 0x0000215A, 0x0000391C, 0x00002038, 0x000900F5, 0x0000001D,\n    0x000038BB, 0x0000427E, 0x00004F58, 0x00006297, 0x0000215A, 0x0000391B,\n    0x00002038, 0x000200F9, 0x00005311, 0x000200F8, 0x00005311, 0x000700F5,\n    0x0000001D, 0x00002BAF, 0x00002BAE, 0x00004F28, 0x00002BAD, 0x00003F62,\n    0x000700F5, 0x0000001D, 0x00003810, 0x0000380F, 0x00004F28, 0x0000380E,\n    0x00003F62, 0x000700F5, 0x0000001D, 0x00003296, 0x00003B82, 0x00004F28,\n    0x00003B81, 0x00003F62, 0x000700F5, 0x0000001D, 0x0000367B, 0x000038BB,\n    0x00004F28, 0x000038BA, 0x00003F62, 0x00050081, 0x0000001D, 0x0000435A,\n    0x00004359, 0x0000367B, 0x00050081, 0x0000001D, 0x00005B02, 0x00005B01,\n    0x00003296, 0x00050081, 0x0000001D, 0x00001C28, 0x00001F92, 0x00003810,\n    0x00050081, 0x0000001D, 0x000025AA, 0x00005113, 0x00002BAF, 0x00050080,\n    0x0000000B, 0x00003FF8, 0x00001FB2, 0x000037B2, 0x000300F7, 0x00005312,\n    0x00000002, 0x000400FA, 0x00005AEF, 0x00003B68, 0x000040BC, 0x000200F8,\n    0x000040BC, 0x000500AA, 0x00000009, 0x00004ADE, 0x0000199B, 0x00000A16,\n    0x000300F7, 0x00004F4C, 0x00000002, 0x000400FA, 0x00004ADE, 0x000019C5,\n    0x00002305, 0x000200F8, 0x00002305, 0x000500C2, 0x0000000B, 0x00005636,\n    0x00003FF8, 0x00000A11, 0x00060041, 0x00000289, 0x00003445, 0x00000CC7,\n    0x00000A0B, 0x00005636, 0x0004003D, 0x0000000B, 0x00003AD7, 0x00003445,\n    0x00050080, 0x0000000B, 0x0000214B, 0x00003FF8, 0x0000199B, 0x000500C2,\n    0x0000000B, 0x000054AC, 0x0000214B, 0x00000A11, 0x00060041, 0x00000289,\n    0x00004CE3, 0x00000CC7, 0x00000A0B, 0x000054AC, 0x0004003D, 0x0000000B,\n    0x00003340, 0x00004CE3, 0x00050084, 0x0000000B, 0x000021F6, 0x00000A10,\n    0x0000199B, 0x00050080, 0x0000000B, 0x00005EC7, 0x00003FF8, 0x000021F6,\n    0x000500C2, 0x0000000B, 0x000045EE, 0x00005EC7, 0x00000A11, 0x00060041,\n    0x00000289, 0x00004CE4, 0x00000CC7, 0x00000A0B, 0x000045EE, 0x0004003D,\n    0x0000000B, 0x00003341, 0x00004CE4, 0x00050084, 0x0000000B, 0x000021F7,\n    0x00000A13, 0x0000199B, 0x00050080, 0x0000000B, 0x00005EC8, 0x00003FF8,\n    0x000021F7, 0x000500C2, 0x0000000B, 0x000045EF, 0x00005EC8, 0x00000A11,\n    0x00060041, 0x00000289, 0x00004904, 0x00000CC7, 0x00000A0B, 0x000045EF,\n    0x0004003D, 0x0000000B, 0x00005F5F, 0x00004904, 0x00070050, 0x00000017,\n    0x00005138, 0x00003AD7, 0x00003340, 0x00003341, 0x00005F5F, 0x000200F9,\n    0x00004F4C, 0x000200F8, 0x000019C5, 0x000500C2, 0x0000000B, 0x00005FAC,\n    0x00003FF8, 0x00000A11, 0x00060041, 0x00000289, 0x00003446, 0x00000CC7,\n    0x00000A0B, 0x00005FAC, 0x0004003D, 0x0000000B, 0x00003156, 0x00003446,\n    0x00050080, 0x0000000B, 0x00002DCE, 0x00005FAC, 0x00000A0D, 0x00060041,\n    0x00000289, 0x00001914, 0x00000CC7, 0x00000A0B, 0x00002DCE, 0x0004003D,\n    0x0000000B, 0x00005C74, 0x00001914, 0x00050080, 0x0000000B, 0x00002DCF,\n    0x00005FAC, 0x00000A10, 0x00060041, 0x00000289, 0x00001915, 0x00000CC7,\n    0x00000A0B, 0x00002DCF, 0x0004003D, 0x0000000B, 0x00005C75, 0x00001915,\n    0x00050080, 0x0000000B, 0x00002DD0, 0x00005FAC, 0x00000A13, 0x00060041,\n    0x00000289, 0x00006009, 0x00000CC7, 0x00000A0B, 0x00002DD0, 0x0004003D,\n    0x0000000B, 0x00004004, 0x00006009, 0x00070050, 0x00000017, 0x00005139,\n    0x00003156, 0x00005C74, 0x00005C75, 0x00004004, 0x000200F9, 0x00004F4C,\n    0x000200F8, 0x00004F4C, 0x000700F5, 0x00000017, 0x00002AC2, 0x00005139,\n    0x000019C5, 0x00005138, 0x00002305, 0x000300F7, 0x00003F63, 0x00000000,\n    0x001300FB, 0x00002180, 0x00004BFE, 0x00000000, 0x000038FC, 0x00000001,\n    0x000038FC, 0x00000002, 0x00001CC1, 0x0000000A, 0x00001CC1, 0x00000003,\n    0x00001CC0, 0x0000000C, 0x00001CC0, 0x00000004, 0x00002001, 0x00000006,\n    0x00002039, 0x000200F8, 0x00002039, 0x00050051, 0x0000000B, 0x00005F60,\n    0x00002AC2, 0x00000000, 0x0006000C, 0x00000013, 0x0000606D, 0x00000001,\n    0x0000003E, 0x00005F60, 0x00050051, 0x0000000D, 0x00002786, 0x0000606D,\n    0x00000000, 0x00050051, 0x0000000D, 0x00004458, 0x0000606D, 0x00000001,\n    0x00070050, 0x0000001D, 0x0000391E, 0x00002786, 0x00004458, 0x00000A0C,\n    0x00000A0C, 0x00050051, 0x0000000B, 0x0000438C, 0x00002AC2, 0x00000001,\n    0x0006000C, 0x00000013, 0x0000467D, 0x00000001, 0x0000003E, 0x0000438C,\n    0x00050051, 0x0000000D, 0x00002787, 0x0000467D, 0x00000000, 0x00050051,\n    0x0000000D, 0x00004459, 0x0000467D, 0x00000001, 0x00070050, 0x0000001D,\n    0x0000391F, 0x00002787, 0x00004459, 0x00000A0C, 0x00000A0C, 0x00050051,\n    0x0000000B, 0x0000438D, 0x00002AC2, 0x00000002, 0x0006000C, 0x00000013,\n    0x0000467E, 0x00000001, 0x0000003E, 0x0000438D, 0x00050051, 0x0000000D,\n    0x00002788, 0x0000467E, 0x00000000, 0x00050051, 0x0000000D, 0x0000445A,\n    0x0000467E, 0x00000001, 0x00070050, 0x0000001D, 0x00003920, 0x00002788,\n    0x0000445A, 0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x0000438E,\n    0x00002AC2, 0x00000003, 0x0006000C, 0x00000013, 0x0000467F, 0x00000001,\n    0x0000003E, 0x0000438E, 0x00050051, 0x0000000D, 0x00002789, 0x0000467F,\n    0x00000000, 0x00050051, 0x0000000D, 0x000050C4, 0x0000467F, 0x00000001,\n    0x00070050, 0x0000001D, 0x00002358, 0x00002789, 0x000050C4, 0x00000A0C,\n    0x00000A0C, 0x000200F9, 0x00003F63, 0x000200F8, 0x00002001, 0x00050051,\n    0x0000000B, 0x00003091, 0x00002AC2, 0x00000000, 0x0004007C, 0x0000000C,\n    0x000058A0, 0x00003091, 0x00050050, 0x00000012, 0x0000472F, 0x000058A0,\n    0x000058A0, 0x000500C4, 0x00000012, 0x000047B9, 0x0000472F, 0x000007A7,\n    0x000500C3, 0x00000012, 0x00003423, 0x000047B9, 0x00000867, 0x0004006F,\n    0x00000013, 0x00002ABB, 0x00003423, 0x0005008E, 0x00000013, 0x00004753,\n    0x00002ABB, 0x000007FE, 0x0007000C, 0x00000013, 0x00005E12, 0x00000001,\n    0x00000028, 0x00000049, 0x00004753, 0x00050051, 0x0000000D, 0x00005F16,\n    0x00005E12, 0x00000000, 0x00050051, 0x0000000D, 0x00003CDD, 0x00005E12,\n    0x00000001, 0x00070050, 0x0000001D, 0x00004127, 0x00005F16, 0x00003CDD,\n    0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x00004C4B, 0x00002AC2,\n    0x00000001, 0x0004007C, 0x0000000C, 0x00003EAA, 0x00004C4B, 0x00050050,\n    0x00000012, 0x00004730, 0x00003EAA, 0x00003EAA, 0x000500C4, 0x00000012,\n    0x000047BA, 0x00004730, 0x000007A7, 0x000500C3, 0x00000012, 0x00003424,\n    0x000047BA, 0x00000867, 0x0004006F, 0x00000013, 0x00002ABC, 0x00003424,\n    0x0005008E, 0x00000013, 0x00004754, 0x00002ABC, 0x000007FE, 0x0007000C,\n    0x00000013, 0x00005E13, 0x00000001, 0x00000028, 0x00000049, 0x00004754,\n    0x00050051, 0x0000000D, 0x00005F17, 0x00005E13, 0x00000000, 0x00050051,\n    0x0000000D, 0x00003CDE, 0x00005E13, 0x00000001, 0x00070050, 0x0000001D,\n    0x00004128, 0x00005F17, 0x00003CDE, 0x00000A0C, 0x00000A0C, 0x00050051,\n    0x0000000B, 0x00004C4C, 0x00002AC2, 0x00000002, 0x0004007C, 0x0000000C,\n    0x00003EAB, 0x00004C4C, 0x00050050, 0x00000012, 0x00004731, 0x00003EAB,\n    0x00003EAB, 0x000500C4, 0x00000012, 0x000047BC, 0x00004731, 0x000007A7,\n    0x000500C3, 0x00000012, 0x00003425, 0x000047BC, 0x00000867, 0x0004006F,\n    0x00000013, 0x00002ABD, 0x00003425, 0x0005008E, 0x00000013, 0x00004755,\n    0x00002ABD, 0x000007FE, 0x0007000C, 0x00000013, 0x00005E14, 0x00000001,\n    0x00000028, 0x00000049, 0x00004755, 0x00050051, 0x0000000D, 0x00005F18,\n    0x00005E14, 0x00000000, 0x00050051, 0x0000000D, 0x00003CDF, 0x00005E14,\n    0x00000001, 0x00070050, 0x0000001D, 0x00004129, 0x00005F18, 0x00003CDF,\n    0x00000A0C, 0x00000A0C, 0x00050051, 0x0000000B, 0x00004C4D, 0x00002AC2,\n    0x00000003, 0x0004007C, 0x0000000C, 0x00003EAC, 0x00004C4D, 0x00050050,\n    0x00000012, 0x00004732, 0x00003EAC, 0x00003EAC, 0x000500C4, 0x00000012,\n    0x000047BD, 0x00004732, 0x000007A7, 0x000500C3, 0x00000012, 0x00003426,\n    0x000047BD, 0x00000867, 0x0004006F, 0x00000013, 0x00002ABE, 0x00003426,\n    0x0005008E, 0x00000013, 0x00004756, 0x00002ABE, 0x000007FE, 0x0007000C,\n    0x00000013, 0x00005E15, 0x00000001, 0x00000028, 0x00000049, 0x00004756,\n    0x00050051, 0x0000000D, 0x00005F19, 0x00005E15, 0x00000000, 0x00050051,\n    0x0000000D, 0x0000494F, 0x00005E15, 0x00000001, 0x00070050, 0x0000001D,\n    0x00002359, 0x00005F19, 0x0000494F, 0x00000A0C, 0x00000A0C, 0x000200F9,\n    0x00003F63, 0x000200F8, 0x00001CC0, 0x00050051, 0x0000000B, 0x000056C6,\n    0x00002AC2, 0x00000000, 0x00060050, 0x00000014, 0x00004F13, 0x000056C6,\n    0x000056C6, 0x000056C6, 0x000500C2, 0x00000014, 0x00002B1C, 0x00004F13,\n    0x00000BB4, 0x000500C7, 0x00000014, 0x00005DF2, 0x00002B1C, 0x00000105,\n    0x000500C7, 0x00000014, 0x000048B4, 0x00002B1C, 0x00000466, 0x000500C2,\n    0x00000014, 0x00005B9C, 0x00005DF2, 0x00000B0C, 0x000500AA, 0x00000010,\n    0x000040D5, 0x00005B9C, 0x00000A12, 0x0006000C, 0x00000016, 0x00002C57,\n    0x00000001, 0x0000004B, 0x000048B4, 0x0004007C, 0x00000014, 0x00002A21,\n    0x00002C57, 0x00050082, 0x00000014, 0x00001886, 0x00000B0C, 0x00002A21,\n    0x00050080, 0x00000014, 0x0000221C, 0x00002A21, 0x00000938, 0x000600A9,\n    0x00000014, 0x0000287B, 0x000040D5, 0x0000221C, 0x00005B9C, 0x000500C4,\n    0x00000014, 0x00005AE0, 0x000048B4, 0x00001886, 0x000500C7, 0x00000014,\n    0x000049A6, 0x00005AE0, 0x00000466, 0x000600A9, 0x00000014, 0x00002AC3,\n    0x000040D5, 0x000049A6, 0x000048B4, 0x00050080, 0x00000014, 0x0000600A,\n    0x0000287B, 0x000003FA, 0x000500C4, 0x00000014, 0x00004F8B, 0x0000600A,\n    0x00000189, 0x000500C4, 0x00000014, 0x00003FB2, 0x00002AC3, 0x0000008D,\n    0x000500C5, 0x00000014, 0x00005788, 0x00004F8B, 0x00003FB2, 0x000500AA,\n    0x00000010, 0x0000360C, 0x00005DF2, 0x00000A12, 0x000600A9, 0x00000014,\n    0x0000424E, 0x0000360C, 0x00000A12, 0x00005788, 0x0004007C, 0x00000018,\n    0x000029DB, 0x0000424E, 0x000500C2, 0x0000000B, 0x00004BB0, 0x000056C6,\n    0x00000A64, 0x00040070, 0x0000000D, 0x0000481A, 0x00004BB0, 0x00050085,\n    0x0000000D, 0x00003E2B, 0x0000481A, 0x00000149, 0x00050051, 0x0000000D,\n    0x000053CE, 0x000029DB, 0x00000000, 0x00050051, 0x0000000D, 0x00002A61,\n    0x000029DB, 0x00000001, 0x00050051, 0x0000000D, 0x00001EA2, 0x000029DB,\n    0x00000002, 0x00070050, 0x0000001D, 0x00003DE3, 0x000053CE, 0x00002A61,\n    0x00001EA2, 0x00003E2B, 0x00050051, 0x0000000B, 0x000027FE, 0x00002AC2,\n    0x00000001, 0x00060050, 0x00000014, 0x00003517, 0x000027FE, 0x000027FE,\n    0x000027FE, 0x000500C2, 0x00000014, 0x00002B1D, 0x00003517, 0x00000BB4,\n    0x000500C7, 0x00000014, 0x00005DF3, 0x00002B1D, 0x00000105, 0x000500C7,\n    0x00000014, 0x000048B5, 0x00002B1D, 0x00000466, 0x000500C2, 0x00000014,\n    0x00005B9D, 0x00005DF3, 0x00000B0C, 0x000500AA, 0x00000010, 0x000040D6,\n    0x00005B9D, 0x00000A12, 0x0006000C, 0x00000016, 0x00002C58, 0x00000001,\n    0x0000004B, 0x000048B5, 0x0004007C, 0x00000014, 0x00002A22, 0x00002C58,\n    0x00050082, 0x00000014, 0x00001887, 0x00000B0C, 0x00002A22, 0x00050080,\n    0x00000014, 0x0000221D, 0x00002A22, 0x00000938, 0x000600A9, 0x00000014,\n    0x0000287C, 0x000040D6, 0x0000221D, 0x00005B9D, 0x000500C4, 0x00000014,\n    0x00005AE1, 0x000048B5, 0x00001887, 0x000500C7, 0x00000014, 0x000049A7,\n    0x00005AE1, 0x00000466, 0x000600A9, 0x00000014, 0x00002AC4, 0x000040D6,\n    0x000049A7, 0x000048B5, 0x00050080, 0x00000014, 0x0000600B, 0x0000287C,\n    0x000003FA, 0x000500C4, 0x00000014, 0x00004F8C, 0x0000600B, 0x00000189,\n    0x000500C4, 0x00000014, 0x00003FB3, 0x00002AC4, 0x0000008D, 0x000500C5,\n    0x00000014, 0x00005789, 0x00004F8C, 0x00003FB3, 0x000500AA, 0x00000010,\n    0x0000360D, 0x00005DF3, 0x00000A12, 0x000600A9, 0x00000014, 0x0000424F,\n    0x0000360D, 0x00000A12, 0x00005789, 0x0004007C, 0x00000018, 0x000029DC,\n    0x0000424F, 0x000500C2, 0x0000000B, 0x00004BB1, 0x000027FE, 0x00000A64,\n    0x00040070, 0x0000000D, 0x0000481B, 0x00004BB1, 0x00050085, 0x0000000D,\n    0x00003E2C, 0x0000481B, 0x00000149, 0x00050051, 0x0000000D, 0x000053CF,\n    0x000029DC, 0x00000000, 0x00050051, 0x0000000D, 0x00002A62, 0x000029DC,\n    0x00000001, 0x00050051, 0x0000000D, 0x00001EA3, 0x000029DC, 0x00000002,\n    0x00070050, 0x0000001D, 0x00003DE4, 0x000053CF, 0x00002A62, 0x00001EA3,\n    0x00003E2C, 0x00050051, 0x0000000B, 0x000027FF, 0x00002AC2, 0x00000002,\n    0x00060050, 0x00000014, 0x00003518, 0x000027FF, 0x000027FF, 0x000027FF,\n    0x000500C2, 0x00000014, 0x00002B1E, 0x00003518, 0x00000BB4, 0x000500C7,\n    0x00000014, 0x00005DF4, 0x00002B1E, 0x00000105, 0x000500C7, 0x00000014,\n    0x000048B6, 0x00002B1E, 0x00000466, 0x000500C2, 0x00000014, 0x00005B9E,\n    0x00005DF4, 0x00000B0C, 0x000500AA, 0x00000010, 0x000040D7, 0x00005B9E,\n    0x00000A12, 0x0006000C, 0x00000016, 0x00002C59, 0x00000001, 0x0000004B,\n    0x000048B6, 0x0004007C, 0x00000014, 0x00002A23, 0x00002C59, 0x00050082,\n    0x00000014, 0x00001888, 0x00000B0C, 0x00002A23, 0x00050080, 0x00000014,\n    0x0000221E, 0x00002A23, 0x00000938, 0x000600A9, 0x00000014, 0x0000287D,\n    0x000040D7, 0x0000221E, 0x00005B9E, 0x000500C4, 0x00000014, 0x00005AE2,\n    0x000048B6, 0x00001888, 0x000500C7, 0x00000014, 0x000049A8, 0x00005AE2,\n    0x00000466, 0x000600A9, 0x00000014, 0x00002AC5, 0x000040D7, 0x000049A8,\n    0x000048B6, 0x00050080, 0x00000014, 0x0000600C, 0x0000287D, 0x000003FA,\n    0x000500C4, 0x00000014, 0x00004F8D, 0x0000600C, 0x00000189, 0x000500C4,\n    0x00000014, 0x00003FB4, 0x00002AC5, 0x0000008D, 0x000500C5, 0x00000014,\n    0x0000578A, 0x00004F8D, 0x00003FB4, 0x000500AA, 0x00000010, 0x0000360E,\n    0x00005DF4, 0x00000A12, 0x000600A9, 0x00000014, 0x00004250, 0x0000360E,\n    0x00000A12, 0x0000578A, 0x0004007C, 0x00000018, 0x000029DD, 0x00004250,\n    0x000500C2, 0x0000000B, 0x00004BB2, 0x000027FF, 0x00000A64, 0x00040070,\n    0x0000000D, 0x0000481C, 0x00004BB2, 0x00050085, 0x0000000D, 0x00003E2D,\n    0x0000481C, 0x00000149, 0x00050051, 0x0000000D, 0x000053D0, 0x000029DD,\n    0x00000000, 0x00050051, 0x0000000D, 0x00002A63, 0x000029DD, 0x00000001,\n    0x00050051, 0x0000000D, 0x00001EA4, 0x000029DD, 0x00000002, 0x00070050,\n    0x0000001D, 0x00003DE5, 0x000053D0, 0x00002A63, 0x00001EA4, 0x00003E2D,\n    0x00050051, 0x0000000B, 0x00002800, 0x00002AC2, 0x00000003, 0x00060050,\n    0x00000014, 0x00003519, 0x00002800, 0x00002800, 0x00002800, 0x000500C2,\n    0x00000014, 0x00002B1F, 0x00003519, 0x00000BB4, 0x000500C7, 0x00000014,\n    0x00005DF5, 0x00002B1F, 0x00000105, 0x000500C7, 0x00000014, 0x000048B8,\n    0x00002B1F, 0x00000466, 0x000500C2, 0x00000014, 0x00005B9F, 0x00005DF5,\n    0x00000B0C, 0x000500AA, 0x00000010, 0x000040D8, 0x00005B9F, 0x00000A12,\n    0x0006000C, 0x00000016, 0x00002C5A, 0x00000001, 0x0000004B, 0x000048B8,\n    0x0004007C, 0x00000014, 0x00002A24, 0x00002C5A, 0x00050082, 0x00000014,\n    0x00001889, 0x00000B0C, 0x00002A24, 0x00050080, 0x00000014, 0x0000221F,\n    0x00002A24, 0x00000938, 0x000600A9, 0x00000014, 0x0000287E, 0x000040D8,\n    0x0000221F, 0x00005B9F, 0x000500C4, 0x00000014, 0x00005AE3, 0x000048B8,\n    0x00001889, 0x000500C7, 0x00000014, 0x000049A9, 0x00005AE3, 0x00000466,\n    0x000600A9, 0x00000014, 0x00002AC6, 0x000040D8, 0x000049A9, 0x000048B8,\n    0x00050080, 0x00000014, 0x0000600D, 0x0000287E, 0x000003FA, 0x000500C4,\n    0x00000014, 0x00004F8E, 0x0000600D, 0x00000189, 0x000500C4, 0x00000014,\n    0x00003FB5, 0x00002AC6, 0x0000008D, 0x000500C5, 0x00000014, 0x0000578B,\n    0x00004F8E, 0x00003FB5, 0x000500AA, 0x00000010, 0x0000360F, 0x00005DF5,\n    0x00000A12, 0x000600A9, 0x00000014, 0x00004251, 0x0000360F, 0x00000A12,\n    0x0000578B, 0x0004007C, 0x00000018, 0x000029DE, 0x00004251, 0x000500C2,\n    0x0000000B, 0x00004BB3, 0x00002800, 0x00000A64, 0x00040070, 0x0000000D,\n    0x0000481D, 0x00004BB3, 0x00050085, 0x0000000D, 0x00003E2E, 0x0000481D,\n    0x00000149, 0x00050051, 0x0000000D, 0x000053D1, 0x000029DE, 0x00000000,\n    0x00050051, 0x0000000D, 0x00002A64, 0x000029DE, 0x00000001, 0x00050051,\n    0x0000000D, 0x00002B20, 0x000029DE, 0x00000002, 0x00070050, 0x0000001D,\n    0x0000235A, 0x000053D1, 0x00002A64, 0x00002B20, 0x00003E2E, 0x000200F9,\n    0x00003F63, 0x000200F8, 0x00001CC1, 0x00050051, 0x0000000B, 0x000056C7,\n    0x00002AC2, 0x00000000, 0x00070050, 0x00000017, 0x00004F14, 0x000056C7,\n    0x000056C7, 0x000056C7, 0x000056C7, 0x000500C2, 0x00000017, 0x000024B0,\n    0x00004F14, 0x0000034D, 0x000500C7, 0x00000017, 0x000049B7, 0x000024B0,\n    0x0000027B, 0x00040070, 0x0000001D, 0x00003CC0, 0x000049B7, 0x00050085,\n    0x0000001D, 0x00004139, 0x00003CC0, 0x00000AEE, 0x00050051, 0x0000000B,\n    0x00005CDB, 0x00002AC2, 0x00000001, 0x00070050, 0x00000017, 0x00005156,\n    0x00005CDB, 0x00005CDB, 0x00005CDB, 0x00005CDB, 0x000500C2, 0x00000017,\n    0x000024B1, 0x00005156, 0x0000034D, 0x000500C7, 0x00000017, 0x000049B8,\n    0x000024B1, 0x0000027B, 0x00040070, 0x0000001D, 0x00003CC1, 0x000049B8,\n    0x00050085, 0x0000001D, 0x0000413A, 0x00003CC1, 0x00000AEE, 0x00050051,\n    0x0000000B, 0x00005CDC, 0x00002AC2, 0x00000002, 0x00070050, 0x00000017,\n    0x00005157, 0x00005CDC, 0x00005CDC, 0x00005CDC, 0x00005CDC, 0x000500C2,\n    0x00000017, 0x000024B2, 0x00005157, 0x0000034D, 0x000500C7, 0x00000017,\n    0x000049B9, 0x000024B2, 0x0000027B, 0x00040070, 0x0000001D, 0x00003CC2,\n    0x000049B9, 0x00050085, 0x0000001D, 0x0000413B, 0x00003CC2, 0x00000AEE,\n    0x00050051, 0x0000000B, 0x00005CDD, 0x00002AC2, 0x00000003, 0x00070050,\n    0x00000017, 0x0000515C, 0x00005CDD, 0x00005CDD, 0x00005CDD, 0x00005CDD,\n    0x000500C2, 0x00000017, 0x000024B3, 0x0000515C, 0x0000034D, 0x000500C7,\n    0x00000017, 0x000049BA, 0x000024B3, 0x0000027B, 0x00040070, 0x0000001D,\n    0x00004932, 0x000049BA, 0x00050085, 0x0000001D, 0x000026A2, 0x00004932,\n    0x00000AEE, 0x000200F9, 0x00003F63, 0x000200F8, 0x000038FC, 0x00050051,\n    0x0000000B, 0x000056C8, 0x00002AC2, 0x00000000, 0x00070050, 0x00000017,\n    0x00004F15, 0x000056C8, 0x000056C8, 0x000056C8, 0x000056C8, 0x000500C2,\n    0x00000017, 0x000024B4, 0x00004F15, 0x0000028D, 0x000500C7, 0x00000017,\n    0x00004A62, 0x000024B4, 0x0000064B, 0x00040070, 0x0000001D, 0x000036AB,\n    0x00004A62, 0x0005008E, 0x0000001D, 0x00004B2C, 0x000036AB, 0x0000017A,\n    0x00050051, 0x0000000B, 0x000021A8, 0x00002AC2, 0x00000001, 0x00070050,\n    0x00000017, 0x00006114, 0x000021A8, 0x000021A8, 0x000021A8, 0x000021A8,\n    0x000500C2, 0x00000017, 0x000024B5, 0x00006114, 0x0000028D, 0x000500C7,\n    0x00000017, 0x00004A63, 0x000024B5, 0x0000064B, 0x00040070, 0x0000001D,\n    0x000036AC, 0x00004A63, 0x0005008E, 0x0000001D, 0x00004B2D, 0x000036AC,\n    0x0000017A, 0x00050051, 0x0000000B, 0x000021A9, 0x00002AC2, 0x00000002,\n    0x00070050, 0x00000017, 0x00006115, 0x000021A9, 0x000021A9, 0x000021A9,\n    0x000021A9, 0x000500C2, 0x00000017, 0x000024B6, 0x00006115, 0x0000028D,\n    0x000500C7, 0x00000017, 0x00004A64, 0x000024B6, 0x0000064B, 0x00040070,\n    0x0000001D, 0x000036AD, 0x00004A64, 0x0005008E, 0x0000001D, 0x00004B2E,\n    0x000036AD, 0x0000017A, 0x00050051, 0x0000000B, 0x000021AA, 0x00002AC2,\n    0x00000003, 0x00070050, 0x00000017, 0x00006116, 0x000021AA, 0x000021AA,\n    0x000021AA, 0x000021AA, 0x000500C2, 0x00000017, 0x000024B7, 0x00006116,\n    0x0000028D, 0x000500C7, 0x00000017, 0x00004A65, 0x000024B7, 0x0000064B,\n    0x00040070, 0x0000001D, 0x0000431D, 0x00004A65, 0x0005008E, 0x0000001D,\n    0x00003095, 0x0000431D, 0x0000017A, 0x000200F9, 0x00003F63, 0x000200F8,\n    0x00004BFE, 0x00050051, 0x0000000B, 0x00003096, 0x00002AC2, 0x00000000,\n    0x0004007C, 0x0000000D, 0x00004FF1, 0x00003096, 0x00050050, 0x00000013,\n    0x0000433F, 0x00004FF1, 0x00000A0C, 0x0009004F, 0x0000001D, 0x00002D99,\n    0x0000433F, 0x0000433F, 0x00000000, 0x00000001, 0x00000001, 0x00000001,\n    0x00050051, 0x0000000B, 0x000056BA, 0x00002AC2, 0x00000001, 0x0004007C,\n    0x0000000D, 0x00003F71, 0x000056BA, 0x00050050, 0x00000013, 0x00004340,\n    0x00003F71, 0x00000A0C, 0x0009004F, 0x0000001D, 0x00002D9A, 0x00004340,\n    0x00004340, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00050051,\n    0x0000000B, 0x000056BB, 0x00002AC2, 0x00000002, 0x0004007C, 0x0000000D,\n    0x00003F72, 0x000056BB, 0x00050050, 0x00000013, 0x00004341, 0x00003F72,\n    0x00000A0C, 0x0009004F, 0x0000001D, 0x00002D9B, 0x00004341, 0x00004341,\n    0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00050051, 0x0000000B,\n    0x000056BC, 0x00002AC2, 0x00000003, 0x0004007C, 0x0000000D, 0x00003F73,\n    0x000056BC, 0x00050050, 0x00000013, 0x00004FB1, 0x00003F73, 0x00000A0C,\n    0x0009004F, 0x0000001D, 0x00005A3D, 0x00004FB1, 0x00004FB1, 0x00000000,\n    0x00000001, 0x00000001, 0x00000001, 0x000200F9, 0x00003F63, 0x000200F8,\n    0x00003F63, 0x000F00F5, 0x0000001D, 0x00002BB0, 0x00005A3D, 0x00004BFE,\n    0x00003095, 0x000038FC, 0x000026A2, 0x00001CC1, 0x0000235A, 0x00001CC0,\n    0x00002359, 0x00002001, 0x00002358, 0x00002039, 0x000F00F5, 0x0000001D,\n    0x00003811, 0x00002D9B, 0x00004BFE, 0x00004B2E, 0x000038FC, 0x0000413B,\n    0x00001CC1, 0x00003DE5, 0x00001CC0, 0x00004129, 0x00002001, 0x00003920,\n    0x00002039, 0x000F00F5, 0x0000001D, 0x00003B83, 0x00002D9A, 0x00004BFE,\n    0x00004B2D, 0x000038FC, 0x0000413A, 0x00001CC1, 0x00003DE4, 0x00001CC0,\n    0x00004128, 0x00002001, 0x0000391F, 0x00002039, 0x000F00F5, 0x0000001D,\n    0x000038BC, 0x00002D99, 0x00004BFE, 0x00004B2C, 0x000038FC, 0x00004139,\n    0x00001CC1, 0x00003DE3, 0x00001CC0, 0x00004127, 0x00002001, 0x0000391E,\n    0x00002039, 0x000200F9, 0x00005312, 0x000200F8, 0x00003B68, 0x000500AA,\n    0x00000009, 0x00005453, 0x0000199B, 0x00000A22, 0x000300F7, 0x00004F29,\n    0x00000002, 0x000400FA, 0x00005453, 0x000019C6, 0x00002306, 0x000200F8,\n    0x00002306, 0x000500C2, 0x0000000B, 0x00005637, 0x00003FF8, 0x00000A11,\n    0x00060041, 0x00000289, 0x00003447, 0x00000CC7, 0x00000A0B, 0x00005637,\n    0x0004003D, 0x0000000B, 0x00003157, 0x00003447, 0x00050080, 0x0000000B,\n    0x00002DD1, 0x00005637, 0x00000A0D, 0x00060041, 0x00000289, 0x00001916,\n    0x00000CC7, 0x00000A0B, 0x00002DD1, 0x0004003D, 0x0000000B, 0x00001B79,\n    0x00001916, 0x00050080, 0x0000000B, 0x0000214C, 0x00003FF8, 0x0000199B,\n    0x000500C2, 0x0000000B, 0x000054AD, 0x0000214C, 0x00000A11, 0x00060041,\n    0x00000289, 0x00004C9D, 0x00000CC7, 0x00000A0B, 0x000054AD, 0x0004003D,\n    0x0000000B, 0x00003158, 0x00004C9D, 0x00050080, 0x0000000B, 0x00002DD2,\n    0x000054AD, 0x00000A0D, 0x00060041, 0x00000289, 0x0000600E, 0x00000CC7,\n    0x00000A0B, 0x00002DD2, 0x0004003D, 0x0000000B, 0x0000374F, 0x0000600E,\n    0x00070050, 0x00000017, 0x00004CDA, 0x00003157, 0x00001B79, 0x00003158,\n    0x0000374F, 0x00050084, 0x0000000B, 0x00004C2E, 0x00000A10, 0x0000199B,\n    0x00050080, 0x0000000B, 0x00002A48, 0x00003FF8, 0x00004C2E, 0x000500C2,\n    0x0000000B, 0x000045F0, 0x00002A48, 0x00000A11, 0x00060041, 0x00000289,\n    0x00004C9E, 0x00000CC7, 0x00000A0B, 0x000045F0, 0x0004003D, 0x0000000B,\n    0x00003159, 0x00004C9E, 0x00050080, 0x0000000B, 0x00002DD3, 0x000045F0,\n    0x00000A0D, 0x00060041, 0x00000289, 0x0000194E, 0x00000CC7, 0x00000A0B,\n    0x00002DD3, 0x0004003D, 0x0000000B, 0x00005E5E, 0x0000194E, 0x00050084,\n    0x0000000B, 0x000021F8, 0x00000A13, 0x0000199B, 0x00050080, 0x0000000B,\n    0x00005EC9, 0x00003FF8, 0x000021F8, 0x000500C2, 0x0000000B, 0x000045F1,\n    0x00005EC9, 0x00000A11, 0x00060041, 0x00000289, 0x00004C9F, 0x00000CC7,\n    0x00000A0B, 0x000045F1, 0x0004003D, 0x0000000B, 0x0000315A, 0x00004C9F,\n    0x00050080, 0x0000000B, 0x00002DD4, 0x000045F1, 0x00000A0D, 0x00060041,\n    0x00000289, 0x0000600F, 0x00000CC7, 0x00000A0B, 0x00002DD4, 0x0004003D,\n    0x0000000B, 0x00004005, 0x0000600F, 0x00070050, 0x00000017, 0x0000513A,\n    0x00003159, 0x00005E5E, 0x0000315A, 0x00004005, 0x000200F9, 0x00004F29,\n    0x000200F8, 0x000019C6, 0x000500C2, 0x0000000B, 0x00005FAD, 0x00003FF8,\n    0x00000A11, 0x00060041, 0x00000289, 0x00003448, 0x00000CC7, 0x00000A0B,\n    0x00005FAD, 0x0004003D, 0x0000000B, 0x0000315B, 0x00003448, 0x00050080,\n    0x0000000B, 0x00002DD5, 0x00005FAD, 0x00000A0D, 0x00060041, 0x00000289,\n    0x00001917, 0x00000CC7, 0x00000A0B, 0x00002DD5, 0x0004003D, 0x0000000B,\n    0x00005C76, 0x00001917, 0x00050080, 0x0000000B, 0x00002DD6, 0x00005FAD,\n    0x00000A10, 0x00060041, 0x00000289, 0x00001918, 0x00000CC7, 0x00000A0B,\n    0x00002DD6, 0x0004003D, 0x0000000B, 0x00005C77, 0x00001918, 0x00050080,\n    0x0000000B, 0x00002DD7, 0x00005FAD, 0x00000A13, 0x00060041, 0x00000289,\n    0x00006010, 0x00000CC7, 0x00000A0B, 0x00002DD7, 0x0004003D, 0x0000000B,\n    0x00003703, 0x00006010, 0x00070050, 0x00000017, 0x00005473, 0x0000315B,\n    0x00005C76, 0x00005C77, 0x00003703, 0x00050080, 0x0000000B, 0x00004B86,\n    0x00003FF8, 0x00000A3A, 0x000500C2, 0x0000000B, 0x00002030, 0x00004B86,\n    0x00000A11, 0x00060041, 0x00000289, 0x00004CA0, 0x00000CC7, 0x00000A0B,\n    0x00002030, 0x0004003D, 0x0000000B, 0x0000315C, 0x00004CA0, 0x00050080,\n    0x0000000B, 0x00002DD8, 0x00002030, 0x00000A0D, 0x00060041, 0x00000289,\n    0x00001919, 0x00000CC7, 0x00000A0B, 0x00002DD8, 0x0004003D, 0x0000000B,\n    0x00005C78, 0x00001919, 0x00050080, 0x0000000B, 0x00002DD9, 0x00002030,\n    0x00000A10, 0x00060041, 0x00000289, 0x0000191A, 0x00000CC7, 0x00000A0B,\n    0x00002DD9, 0x0004003D, 0x0000000B, 0x00005C79, 0x0000191A, 0x00050080,\n    0x0000000B, 0x00002DDA, 0x00002030, 0x00000A13, 0x00060041, 0x00000289,\n    0x00006011, 0x00000CC7, 0x00000A0B, 0x00002DDA, 0x0004003D, 0x0000000B,\n    0x00004006, 0x00006011, 0x00070050, 0x00000017, 0x0000513B, 0x0000315C,\n    0x00005C78, 0x00005C79, 0x00004006, 0x000200F9, 0x00004F29, 0x000200F8,\n    0x00004F29, 0x000700F5, 0x00000017, 0x00002BD0, 0x0000513B, 0x000019C6,\n    0x0000513A, 0x00002306, 0x000700F5, 0x00000017, 0x00003723, 0x00005473,\n    0x000019C6, 0x00004CDA, 0x00002306, 0x000300F7, 0x00004F2A, 0x00000000,\n    0x000700FB, 0x00002180, 0x00004F59, 0x00000005, 0x0000215B, 0x00000007,\n    0x0000203A, 0x000200F8, 0x0000203A, 0x00050051, 0x0000000B, 0x00005F61,\n    0x00003723, 0x00000000, 0x0006000C, 0x00000013, 0x0000606E, 0x00000001,\n    0x0000003E, 0x00005F61, 0x00050051, 0x0000000D, 0x0000278A, 0x0000606E,\n    0x00000000, 0x00050051, 0x0000000D, 0x00003EC4, 0x0000606E, 0x00000001,\n    0x00050051, 0x0000000B, 0x0000428D, 0x00003723, 0x00000001, 0x0006000C,\n    0x00000013, 0x00003D01, 0x00000001, 0x0000003E, 0x0000428D, 0x00050051,\n    0x0000000D, 0x0000278B, 0x00003D01, 0x00000000, 0x00050051, 0x0000000D,\n    0x0000445B, 0x00003D01, 0x00000001, 0x00070050, 0x0000001D, 0x00003921,\n    0x0000278A, 0x00003EC4, 0x0000278B, 0x0000445B, 0x00050051, 0x0000000B,\n    0x0000438F, 0x00003723, 0x00000002, 0x0006000C, 0x00000013, 0x00004680,\n    0x00000001, 0x0000003E, 0x0000438F, 0x00050051, 0x0000000D, 0x0000278C,\n    0x00004680, 0x00000000, 0x00050051, 0x0000000D, 0x00003EC5, 0x00004680,\n    0x00000001, 0x00050051, 0x0000000B, 0x0000428E, 0x00003723, 0x00000003,\n    0x0006000C, 0x00000013, 0x00003D02, 0x00000001, 0x0000003E, 0x0000428E,\n    0x00050051, 0x0000000D, 0x0000278D, 0x00003D02, 0x00000000, 0x00050051,\n    0x0000000D, 0x0000445C, 0x00003D02, 0x00000001, 0x00070050, 0x0000001D,\n    0x00003922, 0x0000278C, 0x00003EC5, 0x0000278D, 0x0000445C, 0x00050051,\n    0x0000000B, 0x00004390, 0x00002BD0, 0x00000000, 0x0006000C, 0x00000013,\n    0x00004681, 0x00000001, 0x0000003E, 0x00004390, 0x00050051, 0x0000000D,\n    0x0000278E, 0x00004681, 0x00000000, 0x00050051, 0x0000000D, 0x00003EC6,\n    0x00004681, 0x00000001, 0x00050051, 0x0000000B, 0x0000428F, 0x00002BD0,\n    0x00000001, 0x0006000C, 0x00000013, 0x00003D03, 0x00000001, 0x0000003E,\n    0x0000428F, 0x00050051, 0x0000000D, 0x0000278F, 0x00003D03, 0x00000000,\n    0x00050051, 0x0000000D, 0x0000445D, 0x00003D03, 0x00000001, 0x00070050,\n    0x0000001D, 0x00003923, 0x0000278E, 0x00003EC6, 0x0000278F, 0x0000445D,\n    0x00050051, 0x0000000B, 0x00004391, 0x00002BD0, 0x00000002, 0x0006000C,\n    0x00000013, 0x00004682, 0x00000001, 0x0000003E, 0x00004391, 0x00050051,\n    0x0000000D, 0x00002790, 0x00004682, 0x00000000, 0x00050051, 0x0000000D,\n    0x00003EC7, 0x00004682, 0x00000001, 0x00050051, 0x0000000B, 0x00004290,\n    0x00002BD0, 0x00000003, 0x0006000C, 0x00000013, 0x00003D04, 0x00000001,\n    0x0000003E, 0x00004290, 0x00050051, 0x0000000D, 0x00002791, 0x00003D04,\n    0x00000000, 0x00050051, 0x0000000D, 0x000050C5, 0x00003D04, 0x00000001,\n    0x00070050, 0x0000001D, 0x0000235B, 0x00002790, 0x00003EC7, 0x00002791,\n    0x000050C5, 0x000200F9, 0x00004F2A, 0x000200F8, 0x0000215B, 0x0007004F,\n    0x00000011, 0x000025FE, 0x00003723, 0x00003723, 0x00000000, 0x00000001,\n    0x0004007C, 0x00000012, 0x00005B3F, 0x000025FE, 0x0009004F, 0x0000001A,\n    0x000060DA, 0x00005B3F, 0x00005B3F, 0x00000000, 0x00000000, 0x00000001,\n    0x00000001, 0x000500C4, 0x0000001A, 0x000048B9, 0x000060DA, 0x00000122,\n    0x000500C3, 0x0000001A, 0x00003D99, 0x000048B9, 0x00000302, 0x0004006F,\n    0x0000001D, 0x00002AC7, 0x00003D99, 0x0005008E, 0x0000001D, 0x00004733,\n    0x00002AC7, 0x000007FE, 0x0007000C, 0x0000001D, 0x0000629A, 0x00000001,\n    0x00000028, 0x00000504, 0x00004733, 0x0007004F, 0x00000011, 0x00003774,\n    0x00003723, 0x00003723, 0x00000002, 0x00000003, 0x0004007C, 0x00000012,\n    0x000024C8, 0x00003774, 0x0009004F, 0x0000001A, 0x000060DB, 0x000024C8,\n    0x000024C8, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x000500C4,\n    0x0000001A, 0x000048BA, 0x000060DB, 0x00000122, 0x000500C3, 0x0000001A,\n    0x00003D9A, 0x000048BA, 0x00000302, 0x0004006F, 0x0000001D, 0x00002AC8,\n    0x00003D9A, 0x0005008E, 0x0000001D, 0x00004734, 0x00002AC8, 0x000007FE,\n    0x0007000C, 0x0000001D, 0x0000629B, 0x00000001, 0x00000028, 0x00000504,\n    0x00004734, 0x0007004F, 0x00000011, 0x00003775, 0x00002BD0, 0x00002BD0,\n    0x00000000, 0x00000001, 0x0004007C, 0x00000012, 0x000024C9, 0x00003775,\n    0x0009004F, 0x0000001A, 0x000060DC, 0x000024C9, 0x000024C9, 0x00000000,\n    0x00000000, 0x00000001, 0x00000001, 0x000500C4, 0x0000001A, 0x000048BB,\n    0x000060DC, 0x00000122, 0x000500C3, 0x0000001A, 0x00003D9B, 0x000048BB,\n    0x00000302, 0x0004006F, 0x0000001D, 0x00002AC9, 0x00003D9B, 0x0005008E,\n    0x0000001D, 0x00004735, 0x00002AC9, 0x000007FE, 0x0007000C, 0x0000001D,\n    0x0000629C, 0x00000001, 0x00000028, 0x00000504, 0x00004735, 0x0007004F,\n    0x00000011, 0x00003776, 0x00002BD0, 0x00002BD0, 0x00000002, 0x00000003,\n    0x0004007C, 0x00000012, 0x000024CA, 0x00003776, 0x0009004F, 0x0000001A,\n    0x000060DD, 0x000024CA, 0x000024CA, 0x00000000, 0x00000000, 0x00000001,\n    0x00000001, 0x000500C4, 0x0000001A, 0x000048BC, 0x000060DD, 0x00000122,\n    0x000500C3, 0x0000001A, 0x00003D9C, 0x000048BC, 0x00000302, 0x0004006F,\n    0x0000001D, 0x00002ACA, 0x00003D9C, 0x0005008E, 0x0000001D, 0x000053D2,\n    0x00002ACA, 0x000007FE, 0x0007000C, 0x0000001D, 0x00004365, 0x00000001,\n    0x00000028, 0x00000504, 0x000053D2, 0x000200F9, 0x00004F2A, 0x000200F8,\n    0x00004F59, 0x0007004F, 0x00000011, 0x00002624, 0x00003723, 0x00003723,\n    0x00000000, 0x00000001, 0x0004007C, 0x00000013, 0x0000515D, 0x00002624,\n    0x00050051, 0x0000000D, 0x00001B88, 0x0000515D, 0x00000000, 0x00050051,\n    0x0000000D, 0x00003473, 0x0000515D, 0x00000001, 0x00070050, 0x0000001D,\n    0x00004291, 0x00001B88, 0x00003473, 0x00000A0C, 0x00000A0C, 0x0007004F,\n    0x00000011, 0x000041E1, 0x00003723, 0x00003723, 0x00000002, 0x00000003,\n    0x0004007C, 0x00000013, 0x00003766, 0x000041E1, 0x00050051, 0x0000000D,\n    0x00001B89, 0x00003766, 0x00000000, 0x00050051, 0x0000000D, 0x00003474,\n    0x00003766, 0x00000001, 0x00070050, 0x0000001D, 0x00004292, 0x00001B89,\n    0x00003474, 0x00000A0C, 0x00000A0C, 0x0007004F, 0x00000011, 0x000041E2,\n    0x00002BD0, 0x00002BD0, 0x00000000, 0x00000001, 0x0004007C, 0x00000013,\n    0x00003767, 0x000041E2, 0x00050051, 0x0000000D, 0x00001B8A, 0x00003767,\n    0x00000000, 0x00050051, 0x0000000D, 0x00003475, 0x00003767, 0x00000001,\n    0x00070050, 0x0000001D, 0x00004293, 0x00001B8A, 0x00003475, 0x00000A0C,\n    0x00000A0C, 0x0007004F, 0x00000011, 0x000041E3, 0x00002BD0, 0x00002BD0,\n    0x00000002, 0x00000003, 0x0004007C, 0x00000013, 0x00003768, 0x000041E3,\n    0x00050051, 0x0000000D, 0x00001B8B, 0x00003768, 0x00000000, 0x00050051,\n    0x0000000D, 0x0000410B, 0x00003768, 0x00000001, 0x00070050, 0x0000001D,\n    0x0000235C, 0x00001B8B, 0x0000410B, 0x00000A0C, 0x00000A0C, 0x000200F9,\n    0x00004F2A, 0x000200F8, 0x00004F2A, 0x000900F5, 0x0000001D, 0x00002BB1,\n    0x0000235C, 0x00004F59, 0x00004365, 0x0000215B, 0x0000235B, 0x0000203A,\n    0x000900F5, 0x0000001D, 0x00003812, 0x00004293, 0x00004F59, 0x0000629C,\n    0x0000215B, 0x00003923, 0x0000203A, 0x000900F5, 0x0000001D, 0x00003B84,\n    0x00004292, 0x00004F59, 0x0000629B, 0x0000215B, 0x00003922, 0x0000203A,\n    0x000900F5, 0x0000001D, 0x000038BD, 0x00004291, 0x00004F59, 0x0000629A,\n    0x0000215B, 0x00003921, 0x0000203A, 0x000200F9, 0x00005312, 0x000200F8,\n    0x00005312, 0x000700F5, 0x0000001D, 0x00002BB2, 0x00002BB1, 0x00004F2A,\n    0x00002BB0, 0x00003F63, 0x000700F5, 0x0000001D, 0x00003813, 0x00003812,\n    0x00004F2A, 0x00003811, 0x00003F63, 0x000700F5, 0x0000001D, 0x00003297,\n    0x00003B84, 0x00004F2A, 0x00003B83, 0x00003F63, 0x000700F5, 0x0000001D,\n    0x0000367C, 0x000038BD, 0x00004F2A, 0x000038BC, 0x00003F63, 0x00050081,\n    0x0000001D, 0x0000435B, 0x0000435A, 0x0000367C, 0x00050081, 0x0000001D,\n    0x00005B03, 0x00005B02, 0x00003297, 0x00050081, 0x0000001D, 0x00002523,\n    0x00001C28, 0x00003813, 0x00050081, 0x0000001D, 0x00001E77, 0x000025AA,\n    0x00002BB2, 0x000200F9, 0x00005ECA, 0x000200F8, 0x00005ECA, 0x000700F5,\n    0x0000001D, 0x00002BB3, 0x00005113, 0x00005310, 0x00001E77, 0x00005312,\n    0x000700F5, 0x0000001D, 0x00003814, 0x00001F92, 0x00005310, 0x00002523,\n    0x00005312, 0x000700F5, 0x0000001D, 0x00003B31, 0x00005B01, 0x00005310,\n    0x00005B03, 0x00005312, 0x000700F5, 0x0000001D, 0x00003B85, 0x00004359,\n    0x00005310, 0x0000435B, 0x00005312, 0x000700F5, 0x0000000D, 0x000038BE,\n    0x00005A1D, 0x00005310, 0x00002F3A, 0x00005312, 0x000200F9, 0x00005313,\n    0x000200F8, 0x00005313, 0x000700F5, 0x0000001D, 0x00002BB4, 0x00002BA9,\n    0x0000530F, 0x00002BB3, 0x00005ECA, 0x000700F5, 0x0000001D, 0x00003815,\n    0x0000380A, 0x0000530F, 0x00003814, 0x00005ECA, 0x000700F5, 0x0000001D,\n    0x00003B32, 0x000035EC, 0x0000530F, 0x00003B31, 0x00005ECA, 0x000700F5,\n    0x0000001D, 0x0000338C, 0x000020D3, 0x0000530F, 0x00003B85, 0x00005ECA,\n    0x000700F5, 0x0000000D, 0x00002EA8, 0x00002B2C, 0x0000530F, 0x000038BE,\n    0x00005ECA, 0x0005008E, 0x0000001D, 0x00005A74, 0x0000338C, 0x00002EA8,\n    0x0005008E, 0x0000001D, 0x000019CC, 0x00003B32, 0x00002EA8, 0x0005008E,\n    0x0000001D, 0x0000306F, 0x00003815, 0x00002EA8, 0x0005008E, 0x0000001D,\n    0x00003432, 0x00002BB4, 0x00002EA8, 0x000300F7, 0x00003F64, 0x00000002,\n    0x000400FA, 0x00001D33, 0x00002741, 0x00003F64, 0x000200F8, 0x00002741,\n    0x0009004F, 0x0000001D, 0x00003AEE, 0x00005A74, 0x00005A74, 0x00000002,\n    0x00000001, 0x00000000, 0x00000003, 0x0009004F, 0x0000001D, 0x00003A07,\n    0x000019CC, 0x000019CC, 0x00000002, 0x00000001, 0x00000000, 0x00000003,\n    0x0009004F, 0x0000001D, 0x00001CE6, 0x0000306F, 0x0000306F, 0x00000002,\n    0x00000001, 0x00000000, 0x00000003, 0x0009004F, 0x0000001D, 0x00003EEF,\n    0x00003432, 0x00003432, 0x00000002, 0x00000001, 0x00000000, 0x00000003,\n    0x000200F9, 0x00003F64, 0x000200F8, 0x00003F64, 0x000700F5, 0x0000001D,\n    0x00002BB5, 0x00003432, 0x00005313, 0x00003EEF, 0x00002741, 0x000700F5,\n    0x0000001D, 0x00003816, 0x0000306F, 0x00005313, 0x00001CE6, 0x00002741,\n    0x000700F5, 0x0000001D, 0x00003B57, 0x000019CC, 0x00005313, 0x00003A07,\n    0x00002741, 0x000700F5, 0x0000001D, 0x00003A49, 0x00005A74, 0x00005313,\n    0x00003AEE, 0x00002741, 0x000300F7, 0x00005BA4, 0x00000000, 0x000700FB,\n    0x00005093, 0x00001CCD, 0x0000001A, 0x00004696, 0x00000020, 0x00002514,\n    0x000200F8, 0x00002514, 0x00050051, 0x0000000D, 0x00003AAE, 0x00003A49,\n    0x00000000, 0x00050051, 0x0000000D, 0x000023ED, 0x00003A49, 0x00000001,\n    0x00050050, 0x00000013, 0x00004B20, 0x00003AAE, 0x000023ED, 0x0006000C,\n    0x0000000B, 0x00002171, 0x00000001, 0x0000003A, 0x00004B20, 0x00050051,\n    0x0000000D, 0x00005BBF, 0x00003A49, 0x00000002, 0x00050051, 0x0000000D,\n    0x000039A7, 0x00003A49, 0x00000003, 0x00050050, 0x00000013, 0x00004B21,\n    0x00005BBF, 0x000039A7, 0x0006000C, 0x0000000B, 0x00002172, 0x00000001,\n    0x0000003A, 0x00004B21, 0x00050051, 0x0000000D, 0x00005BC0, 0x00003B57,\n    0x00000000, 0x00050051, 0x0000000D, 0x000039A8, 0x00003B57, 0x00000001,\n    0x00050050, 0x00000013, 0x00004B22, 0x00005BC0, 0x000039A8, 0x0006000C,\n    0x0000000B, 0x00002173, 0x00000001, 0x0000003A, 0x00004B22, 0x00050051,\n    0x0000000D, 0x00005BC1, 0x00003B57, 0x00000002, 0x00050051, 0x0000000D,\n    0x000039A9, 0x00003B57, 0x00000003, 0x00050050, 0x00000013, 0x00004B0D,\n    0x00005BC1, 0x000039A9, 0x0006000C, 0x0000000B, 0x00002220, 0x00000001,\n    0x0000003A, 0x00004B0D, 0x00070050, 0x00000017, 0x0000315D, 0x00002171,\n    0x00002172, 0x00002173, 0x00002220, 0x00050051, 0x0000000D, 0x00003EC9,\n    0x00003816, 0x00000000, 0x00050051, 0x0000000D, 0x00005474, 0x00003816,\n    0x00000001, 0x00050050, 0x00000013, 0x00004B2F, 0x00003EC9, 0x00005474,\n    0x0006000C, 0x0000000B, 0x00002174, 0x00000001, 0x0000003A, 0x00004B2F,\n    0x00050051, 0x0000000D, 0x00005BC2, 0x00003816, 0x00000002, 0x00050051,\n    0x0000000D, 0x000039AA, 0x00003816, 0x00000003, 0x00050050, 0x00000013,\n    0x00004B30, 0x00005BC2, 0x000039AA, 0x0006000C, 0x0000000B, 0x00002175,\n    0x00000001, 0x0000003A, 0x00004B30, 0x00050051, 0x0000000D, 0x00005BC3,\n    0x00002BB5, 0x00000000, 0x00050051, 0x0000000D, 0x000039AB, 0x00002BB5,\n    0x00000001, 0x00050050, 0x00000013, 0x00004B31, 0x00005BC3, 0x000039AB,\n    0x0006000C, 0x0000000B, 0x00002176, 0x00000001, 0x0000003A, 0x00004B31,\n    0x00050051, 0x0000000D, 0x00005BC4, 0x00002BB5, 0x00000002, 0x00050051,\n    0x0000000D, 0x000039AC, 0x00002BB5, 0x00000003, 0x00050050, 0x00000013,\n    0x00004B0E, 0x00005BC4, 0x000039AC, 0x0006000C, 0x0000000B, 0x00002E96,\n    0x00000001, 0x0000003A, 0x00004B0E, 0x00070050, 0x00000017, 0x0000612F,\n    0x00002174, 0x00002175, 0x00002176, 0x00002E96, 0x000200F9, 0x00005BA4,\n    0x000200F8, 0x00004696, 0x0008000C, 0x0000001D, 0x00001C8F, 0x00000001,\n    0x0000002B, 0x00003A49, 0x00000B7A, 0x00000505, 0x0005008E, 0x0000001D,\n    0x00004F73, 0x00001C8F, 0x0000022D, 0x00050081, 0x0000001D, 0x00002E40,\n    0x00004F73, 0x00000145, 0x0004006D, 0x00000017, 0x00001F0B, 0x00002E40,\n    0x0007004F, 0x00000011, 0x000018D9, 0x00001F0B, 0x00001F0B, 0x00000000,\n    0x00000002, 0x0007004F, 0x00000011, 0x00002750, 0x00001F0B, 0x00001F0B,\n    0x00000001, 0x00000003, 0x000500C4, 0x00000011, 0x000028CE, 0x00002750,\n    0x00000867, 0x000500C5, 0x00000011, 0x000057C9, 0x000018D9, 0x000028CE,\n    0x00050051, 0x0000000B, 0x0000498C, 0x000057C9, 0x00000000, 0x00050051,\n    0x0000000B, 0x00003BFC, 0x000057C9, 0x00000001, 0x0008000C, 0x0000001D,\n    0x00003750, 0x00000001, 0x0000002B, 0x00003B57, 0x00000B7A, 0x00000505,\n    0x0005008E, 0x0000001D, 0x00002C01, 0x00003750, 0x0000022D, 0x00050081,\n    0x0000001D, 0x00002E41, 0x00002C01, 0x00000145, 0x0004006D, 0x00000017,\n    0x00001F0C, 0x00002E41, 0x0007004F, 0x00000011, 0x000018DA, 0x00001F0C,\n    0x00001F0C, 0x00000000, 0x00000002, 0x0007004F, 0x00000011, 0x00002751,\n    0x00001F0C, 0x00001F0C, 0x00000001, 0x00000003, 0x000500C4, 0x00000011,\n    0x000028CF, 0x00002751, 0x00000867, 0x000500C5, 0x00000011, 0x000057CA,\n    0x000018DA, 0x000028CF, 0x00050051, 0x0000000B, 0x00004E6D, 0x000057CA,\n    0x00000000, 0x00050051, 0x0000000B, 0x0000586B, 0x000057CA, 0x00000001,\n    0x00070050, 0x00000017, 0x00001D37, 0x0000498C, 0x00003BFC, 0x00004E6D,\n    0x0000586B, 0x0008000C, 0x0000001D, 0x00003846, 0x00000001, 0x0000002B,\n    0x00003816, 0x00000B7A, 0x00000505, 0x0005008E, 0x0000001D, 0x00003577,\n    0x00003846, 0x0000022D, 0x00050081, 0x0000001D, 0x00002E42, 0x00003577,\n    0x00000145, 0x0004006D, 0x00000017, 0x00001F0D, 0x00002E42, 0x0007004F,\n    0x00000011, 0x000018DB, 0x00001F0D, 0x00001F0D, 0x00000000, 0x00000002,\n    0x0007004F, 0x00000011, 0x00002752, 0x00001F0D, 0x00001F0D, 0x00000001,\n    0x00000003, 0x000500C4, 0x00000011, 0x000028D0, 0x00002752, 0x00000867,\n    0x000500C5, 0x00000011, 0x000057CB, 0x000018DB, 0x000028D0, 0x00050051,\n    0x0000000B, 0x0000498D, 0x000057CB, 0x00000000, 0x00050051, 0x0000000B,\n    0x00003BFD, 0x000057CB, 0x00000001, 0x0008000C, 0x0000001D, 0x00003751,\n    0x00000001, 0x0000002B, 0x00002BB5, 0x00000B7A, 0x00000505, 0x0005008E,\n    0x0000001D, 0x00002C02, 0x00003751, 0x0000022D, 0x00050081, 0x0000001D,\n    0x00002E43, 0x00002C02, 0x00000145, 0x0004006D, 0x00000017, 0x00001F0E,\n    0x00002E43, 0x0007004F, 0x00000011, 0x000018DC, 0x00001F0E, 0x00001F0E,\n    0x00000000, 0x00000002, 0x0007004F, 0x00000011, 0x00002753, 0x00001F0E,\n    0x00001F0E, 0x00000001, 0x00000003, 0x000500C4, 0x00000011, 0x000028D1,\n    0x00002753, 0x00000867, 0x000500C5, 0x00000011, 0x000057CC, 0x000018DC,\n    0x000028D1, 0x00050051, 0x0000000B, 0x00004E6E, 0x000057CC, 0x00000000,\n    0x00050051, 0x0000000B, 0x00001F58, 0x000057CC, 0x00000001, 0x00070050,\n    0x00000017, 0x0000235D, 0x0000498D, 0x00003BFD, 0x00004E6E, 0x00001F58,\n    0x000200F9, 0x00005BA4, 0x000200F8, 0x00001CCD, 0x00050051, 0x0000000D,\n    0x00004DAD, 0x00003A49, 0x00000000, 0x00050051, 0x0000000D, 0x00002825,\n    0x00003A49, 0x00000001, 0x00050051, 0x0000000D, 0x00001DD9, 0x00003B57,\n    0x00000000, 0x00050051, 0x0000000D, 0x000021CA, 0x00003B57, 0x00000001,\n    0x00070050, 0x0000001D, 0x000020DE, 0x00004DAD, 0x00002825, 0x00001DD9,\n    0x000021CA, 0x0004007C, 0x00000017, 0x00004627, 0x000020DE, 0x00050051,\n    0x0000000D, 0x00002B51, 0x00003816, 0x00000000, 0x00050051, 0x0000000D,\n    0x000033E3, 0x00003816, 0x00000001, 0x00050051, 0x0000000D, 0x00001DDA,\n    0x00002BB5, 0x00000000, 0x00050051, 0x0000000D, 0x000021CB, 0x00002BB5,\n    0x00000001, 0x00070050, 0x0000001D, 0x00002D56, 0x00002B51, 0x000033E3,\n    0x00001DDA, 0x000021CB, 0x0004007C, 0x00000017, 0x00002B83, 0x00002D56,\n    0x000200F9, 0x00005BA4, 0x000200F8, 0x00005BA4, 0x000900F5, 0x00000017,\n    0x00002616, 0x00002B83, 0x00001CCD, 0x0000235D, 0x00004696, 0x0000612F,\n    0x00002514, 0x000900F5, 0x00000017, 0x00003997, 0x00004627, 0x00001CCD,\n    0x00001D37, 0x00004696, 0x0000315D, 0x00002514, 0x000500AA, 0x00000009,\n    0x0000195B, 0x00001DD8, 0x00000A0A, 0x000300F7, 0x000033DC, 0x00000000,\n    0x000400FA, 0x0000195B, 0x00002CBB, 0x000033DC, 0x000200F8, 0x00002CBB,\n    0x00050051, 0x0000000B, 0x00005E5F, 0x00004AB4, 0x00000000, 0x000500AB,\n    0x00000009, 0x000057C6, 0x00005E5F, 0x00000A0A, 0x000200F9, 0x000033DC,\n    0x000200F8, 0x000033DC, 0x000700F5, 0x00000009, 0x00002ACB, 0x0000195B,\n    0x00005BA4, 0x000057C6, 0x00002CBB, 0x000300F7, 0x00005571, 0x00000002,\n    0x000400FA, 0x00002ACB, 0x00002CF4, 0x00005571, 0x000200F8, 0x00002CF4,\n    0x00050051, 0x0000000B, 0x00005C2F, 0x00004AB4, 0x00000000, 0x000500AE,\n    0x00000009, 0x000043C2, 0x00005C2F, 0x00000A10, 0x000300F7, 0x00005570,\n    0x00000000, 0x000400FA, 0x000043C2, 0x00003E05, 0x00005570, 0x000200F8,\n    0x00003E05, 0x000500AE, 0x00000009, 0x00005FD4, 0x00005C2F, 0x00000A13,\n    0x000300F7, 0x00004944, 0x00000000, 0x000400FA, 0x00005FD4, 0x00002620,\n    0x00004944, 0x000200F8, 0x00002620, 0x00050051, 0x0000000B, 0x00004392,\n    0x00002616, 0x00000002, 0x00060052, 0x00000017, 0x000052B6, 0x00004392,\n    0x00002616, 0x00000000, 0x00050051, 0x0000000B, 0x00005A04, 0x00002616,\n    0x00000003, 0x00060052, 0x00000017, 0x00002450, 0x00005A04, 0x000052B6,\n    0x00000001, 0x000200F9, 0x00004944, 0x000200F8, 0x00004944, 0x000700F5,\n    0x00000017, 0x000043E3, 0x00002616, 0x00003E05, 0x00002450, 0x00002620,\n    0x00050051, 0x0000000B, 0x00005961, 0x000043E3, 0x00000000, 0x00060052,\n    0x00000017, 0x000055DF, 0x00005961, 0x00003997, 0x00000002, 0x00050051,\n    0x0000000B, 0x00005A05, 0x000043E3, 0x00000001, 0x00060052, 0x00000017,\n    0x00002451, 0x00005A05, 0x000055DF, 0x00000003, 0x000200F9, 0x00005570,\n    0x000200F8, 0x00005570, 0x000700F5, 0x00000017, 0x00001F7B, 0x00002616,\n    0x00002CF4, 0x000043E3, 0x00004944, 0x000700F5, 0x00000017, 0x00001EFE,\n    0x00003997, 0x00002CF4, 0x00002451, 0x00004944, 0x00050051, 0x0000000B,\n    0x00005C8A, 0x00001EFE, 0x00000002, 0x00060052, 0x00000017, 0x000055E0,\n    0x00005C8A, 0x00001EFE, 0x00000000, 0x00050051, 0x0000000B, 0x00005A06,\n    0x00001EFE, 0x00000003, 0x00060052, 0x00000017, 0x00002452, 0x00005A06,\n    0x000055E0, 0x00000001, 0x000200F9, 0x00005571, 0x000200F8, 0x00005571,\n    0x000700F5, 0x00000017, 0x000022F8, 0x00002616, 0x000033DC, 0x00001F7B,\n    0x00005570, 0x000700F5, 0x00000017, 0x0000520C, 0x00003997, 0x000033DC,\n    0x00002452, 0x00005570, 0x00050080, 0x00000011, 0x000037CC, 0x00002EF9,\n    0x000059EC, 0x000500C2, 0x00000011, 0x00005E75, 0x000037CC, 0x0000072D,\n    0x00050086, 0x00000011, 0x00001E20, 0x00005E75, 0x00005C31, 0x00050084,\n    0x00000011, 0x00004707, 0x00005C31, 0x00001E20, 0x00050082, 0x00000011,\n    0x00004761, 0x00005E75, 0x00004707, 0x000500C4, 0x00000011, 0x00002BE0,\n    0x00001E20, 0x0000072D, 0x00050051, 0x0000000B, 0x000033E4, 0x00004761,\n    0x00000000, 0x00050051, 0x0000000B, 0x00002A78, 0x00005C31, 0x00000001,\n    0x00050084, 0x0000000B, 0x00005967, 0x000033E4, 0x00002A78, 0x00050051,\n    0x0000000B, 0x00001B1F, 0x00004761, 0x00000001, 0x00050080, 0x0000000B,\n    0x000028E5, 0x00005967, 0x00001B1F, 0x000500C7, 0x00000011, 0x000049AA,\n    0x000037CC, 0x00000736, 0x000500C4, 0x0000000B, 0x00002955, 0x000028E5,\n    0x00000A1C, 0x00050051, 0x0000000B, 0x000051B4, 0x000049AA, 0x00000001,\n    0x000500C4, 0x0000000B, 0x00005C2C, 0x000051B4, 0x00000A19, 0x000500C5,\n    0x0000000B, 0x00004D66, 0x00002955, 0x00005C2C, 0x00050051, 0x0000000B,\n    0x000053E4, 0x000049AA, 0x00000000, 0x000500C4, 0x0000000B, 0x00002DDB,\n    0x000053E4, 0x00000A13, 0x000500C5, 0x0000000B, 0x00002BB9, 0x00004D66,\n    0x00002DDB, 0x000300F7, 0x00005341, 0x00000002, 0x000400FA, 0x0000500F,\n    0x0000294E, 0x0000537D, 0x000200F8, 0x0000537D, 0x0004007C, 0x00000012,\n    0x00002970, 0x00002BE0, 0x00050051, 0x0000000C, 0x000045F3, 0x00002970,\n    0x00000001, 0x000500C3, 0x0000000C, 0x00004DC0, 0x000045F3, 0x00000A1A,\n    0x0004007C, 0x0000000C, 0x0000578C, 0x000020FC, 0x00050084, 0x0000000C,\n    0x00001F02, 0x00004DC0, 0x0000578C, 0x00050051, 0x0000000C, 0x00006242,\n    0x00002970, 0x00000000, 0x000500C3, 0x0000000C, 0x00004FC7, 0x00006242,\n    0x00000A1A, 0x00050080, 0x0000000C, 0x000049BB, 0x00001F02, 0x00004FC7,\n    0x000500C4, 0x0000000C, 0x0000254A, 0x000049BB, 0x00000A1D, 0x000500C3,\n    0x0000000C, 0x0000603B, 0x000045F3, 0x00000A0E, 0x000500C7, 0x0000000C,\n    0x0000539A, 0x0000603B, 0x00000A20, 0x000500C4, 0x0000000C, 0x0000534A,\n    0x0000539A, 0x00000A14, 0x000500C7, 0x0000000C, 0x00004EA5, 0x00006242,\n    0x00000A20, 0x000500C5, 0x0000000C, 0x00002B21, 0x0000534A, 0x00004EA5,\n    0x000500C5, 0x0000000C, 0x000043B6, 0x0000254A, 0x00002B21, 0x000500C4,\n    0x0000000C, 0x00005E63, 0x000043B6, 0x00000A13, 0x000500C3, 0x0000000C,\n    0x000031DE, 0x000045F3, 0x00000A17, 0x000500C7, 0x0000000C, 0x00005447,\n    0x000031DE, 0x00000A0E, 0x000500C3, 0x0000000C, 0x000028A6, 0x00006242,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x0000511E, 0x000028A6, 0x00000A14,\n    0x000500C3, 0x0000000C, 0x000028B9, 0x000045F3, 0x00000A14, 0x000500C7,\n    0x0000000C, 0x0000505E, 0x000028B9, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x0000541D, 0x0000505E, 0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BA,\n    0x0000511E, 0x0000541D, 0x000500C7, 0x0000000C, 0x00005076, 0x000045F3,\n    0x00000A0E, 0x000500C4, 0x0000000C, 0x00005228, 0x00005076, 0x00000A17,\n    0x000500C4, 0x0000000C, 0x00001997, 0x000022BA, 0x00000A1D, 0x000500C5,\n    0x0000000C, 0x000047FE, 0x00005228, 0x00001997, 0x000500C4, 0x0000000C,\n    0x00001C00, 0x00005447, 0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C81,\n    0x000047FE, 0x00001C00, 0x000500C7, 0x0000000C, 0x000050AF, 0x00005E63,\n    0x00000A38, 0x000500C5, 0x0000000C, 0x00003C70, 0x00003C81, 0x000050AF,\n    0x000500C3, 0x0000000C, 0x00003745, 0x00005E63, 0x00000A17, 0x000500C7,\n    0x0000000C, 0x000018B8, 0x00003745, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x0000547E, 0x000018B8, 0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A8,\n    0x00003C70, 0x0000547E, 0x000500C3, 0x0000000C, 0x00003A6E, 0x00005E63,\n    0x00000A1A, 0x000500C7, 0x0000000C, 0x000018B9, 0x00003A6E, 0x00000A20,\n    0x000500C4, 0x0000000C, 0x0000547F, 0x000018B9, 0x00000A23, 0x000500C5,\n    0x0000000C, 0x0000456F, 0x000045A8, 0x0000547F, 0x000500C3, 0x0000000C,\n    0x00003C88, 0x00005E63, 0x00000A23, 0x000500C4, 0x0000000C, 0x00002824,\n    0x00003C88, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B79, 0x0000456F,\n    0x00002824, 0x0004007C, 0x0000000B, 0x000041E5, 0x00003B79, 0x000200F9,\n    0x00005341, 0x000200F8, 0x0000294E, 0x00050051, 0x0000000B, 0x00004D9A,\n    0x00002BE0, 0x00000000, 0x00050051, 0x0000000B, 0x00002C03, 0x00002BE0,\n    0x00000001, 0x00060050, 0x00000014, 0x000020DF, 0x00004D9A, 0x00002C03,\n    0x00005F72, 0x0004007C, 0x00000016, 0x00004E9D, 0x000020DF, 0x00050051,\n    0x0000000C, 0x00002BF7, 0x00004E9D, 0x00000002, 0x000500C3, 0x0000000C,\n    0x00004DC1, 0x00002BF7, 0x00000A11, 0x0004007C, 0x0000000C, 0x0000578D,\n    0x00006273, 0x00050084, 0x0000000C, 0x00001F03, 0x00004DC1, 0x0000578D,\n    0x00050051, 0x0000000C, 0x00006243, 0x00004E9D, 0x00000001, 0x000500C3,\n    0x0000000C, 0x00004A6F, 0x00006243, 0x00000A17, 0x00050080, 0x0000000C,\n    0x00002B2D, 0x00001F03, 0x00004A6F, 0x0004007C, 0x0000000C, 0x00004202,\n    0x000020FC, 0x00050084, 0x0000000C, 0x00003A60, 0x00002B2D, 0x00004202,\n    0x00050051, 0x0000000C, 0x00006244, 0x00004E9D, 0x00000000, 0x000500C3,\n    0x0000000C, 0x00004FC8, 0x00006244, 0x00000A1A, 0x00050080, 0x0000000C,\n    0x000049FC, 0x00003A60, 0x00004FC8, 0x000500C4, 0x0000000C, 0x0000225D,\n    0x000049FC, 0x00000A20, 0x000500C7, 0x0000000C, 0x00002CAA, 0x00002BF7,\n    0x00000A14, 0x000500C4, 0x0000000C, 0x00004CAE, 0x00002CAA, 0x00000A1A,\n    0x000500C3, 0x0000000C, 0x0000383E, 0x00006243, 0x00000A0E, 0x000500C7,\n    0x0000000C, 0x00005374, 0x0000383E, 0x00000A14, 0x000500C4, 0x0000000C,\n    0x000054CA, 0x00005374, 0x00000A14, 0x000500C5, 0x0000000C, 0x000042CE,\n    0x00004CAE, 0x000054CA, 0x000500C7, 0x0000000C, 0x000050D5, 0x00006244,\n    0x00000A20, 0x000500C5, 0x0000000C, 0x00003ADD, 0x000042CE, 0x000050D5,\n    0x000500C5, 0x0000000C, 0x000043B7, 0x0000225D, 0x00003ADD, 0x000500C4,\n    0x0000000C, 0x00005E50, 0x000043B7, 0x00000A13, 0x000500C3, 0x0000000C,\n    0x000032D7, 0x00006243, 0x00000A14, 0x000500C6, 0x0000000C, 0x000026C9,\n    0x000032D7, 0x00004DC1, 0x000500C7, 0x0000000C, 0x00004199, 0x000026C9,\n    0x00000A0E, 0x000500C3, 0x0000000C, 0x00002590, 0x00006244, 0x00000A14,\n    0x000500C7, 0x0000000C, 0x0000505F, 0x00002590, 0x00000A14, 0x000500C4,\n    0x0000000C, 0x0000541E, 0x00004199, 0x00000A0E, 0x000500C6, 0x0000000C,\n    0x000022BB, 0x0000505F, 0x0000541E, 0x000500C7, 0x0000000C, 0x00005077,\n    0x00006243, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005229, 0x00005077,\n    0x00000A17, 0x000500C4, 0x0000000C, 0x00001998, 0x000022BB, 0x00000A1D,\n    0x000500C5, 0x0000000C, 0x000047FF, 0x00005229, 0x00001998, 0x000500C4,\n    0x0000000C, 0x00001C01, 0x00004199, 0x00000A2C, 0x000500C5, 0x0000000C,\n    0x00003C82, 0x000047FF, 0x00001C01, 0x000500C7, 0x0000000C, 0x000050B0,\n    0x00005E50, 0x00000A38, 0x000500C5, 0x0000000C, 0x00003C71, 0x00003C82,\n    0x000050B0, 0x000500C3, 0x0000000C, 0x00003746, 0x00005E50, 0x00000A17,\n    0x000500C7, 0x0000000C, 0x000018BA, 0x00003746, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x00005480, 0x000018BA, 0x00000A1A, 0x000500C5, 0x0000000C,\n    0x000045A9, 0x00003C71, 0x00005480, 0x000500C3, 0x0000000C, 0x00003A6F,\n    0x00005E50, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018BB, 0x00003A6F,\n    0x00000A20, 0x000500C4, 0x0000000C, 0x00005481, 0x000018BB, 0x00000A23,\n    0x000500C5, 0x0000000C, 0x00004570, 0x000045A9, 0x00005481, 0x000500C3,\n    0x0000000C, 0x00003C89, 0x00005E50, 0x00000A23, 0x000500C4, 0x0000000C,\n    0x00002826, 0x00003C89, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B7A,\n    0x00004570, 0x00002826, 0x0004007C, 0x0000000B, 0x000041E6, 0x00003B7A,\n    0x000200F9, 0x00005341, 0x000200F8, 0x00005341, 0x000700F5, 0x0000000B,\n    0x00002522, 0x000041E6, 0x0000294E, 0x000041E5, 0x0000537D, 0x00050084,\n    0x0000000B, 0x000041CB, 0x0000229A, 0x00002A78, 0x00050084, 0x0000000B,\n    0x00002ED9, 0x00002522, 0x000041CB, 0x00050080, 0x0000000B, 0x00003E8C,\n    0x00002ED9, 0x00002BB9, 0x000500C2, 0x0000000B, 0x0000573A, 0x00003E8C,\n    0x00000A17, 0x000500AA, 0x00000009, 0x00004B9C, 0x00004ADC, 0x00000A16,\n    0x000300F7, 0x000039BC, 0x00000000, 0x000400FA, 0x00004B9C, 0x000033DF,\n    0x000039BC, 0x000200F8, 0x000033DF, 0x0009004F, 0x00000017, 0x00001F16,\n    0x0000520C, 0x0000520C, 0x00000001, 0x00000000, 0x00000003, 0x00000002,\n    0x000200F9, 0x000039BC, 0x000200F8, 0x000039BC, 0x000700F5, 0x00000017,\n    0x00005972, 0x0000520C, 0x00005341, 0x00001F16, 0x000033DF, 0x000600A9,\n    0x0000000B, 0x000019CD, 0x00004B9C, 0x00000A10, 0x00004ADC, 0x000500AA,\n    0x00000009, 0x00003464, 0x000019CD, 0x00000A0D, 0x000500AA, 0x00000009,\n    0x000047C2, 0x000019CD, 0x00000A10, 0x000500A6, 0x00000009, 0x00005686,\n    0x00003464, 0x000047C2, 0x000300F7, 0x00003463, 0x00000000, 0x000400FA,\n    0x00005686, 0x00002957, 0x00003463, 0x000200F8, 0x00002957, 0x000500C7,\n    0x00000017, 0x0000475F, 0x00005972, 0x000009CE, 0x000500C4, 0x00000017,\n    0x000024D1, 0x0000475F, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AC,\n    0x00005972, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448D, 0x000050AC,\n    0x0000013D, 0x000500C5, 0x00000017, 0x00003FF9, 0x000024D1, 0x0000448D,\n    0x000200F9, 0x00003463, 0x000200F8, 0x00003463, 0x000700F5, 0x00000017,\n    0x0000587A, 0x00005972, 0x000039BC, 0x00003FF9, 0x00002957, 0x000500AA,\n    0x00000009, 0x00004CB6, 0x000019CD, 0x00000A13, 0x000500A6, 0x00000009,\n    0x00003B23, 0x000047C2, 0x00004CB6, 0x000300F7, 0x00002C98, 0x00000000,\n    0x000400FA, 0x00003B23, 0x00002B38, 0x00002C98, 0x000200F8, 0x00002B38,\n    0x000500C4, 0x00000017, 0x00005E17, 0x0000587A, 0x000002ED, 0x000500C2,\n    0x00000017, 0x00003BE7, 0x0000587A, 0x000002ED, 0x000500C5, 0x00000017,\n    0x000029E8, 0x00005E17, 0x00003BE7, 0x000200F9, 0x00002C98, 0x000200F8,\n    0x00002C98, 0x000700F5, 0x00000017, 0x00004D37, 0x0000587A, 0x00003463,\n    0x000029E8, 0x00002B38, 0x00060041, 0x00000294, 0x000060F9, 0x00001592,\n    0x00000A0B, 0x0000573A, 0x0003003E, 0x000060F9, 0x00004D37, 0x00050080,\n    0x0000000B, 0x00002DDC, 0x00003E8C, 0x00000A3A, 0x000500C2, 0x0000000B,\n    0x000041F1, 0x00002DDC, 0x00000A17, 0x000300F7, 0x00003F86, 0x00000000,\n    0x000400FA, 0x00004B9C, 0x000033E0, 0x00003F86, 0x000200F8, 0x000033E0,\n    0x0009004F, 0x00000017, 0x00001F17, 0x000022F8, 0x000022F8, 0x00000001,\n    0x00000000, 0x00000003, 0x00000002, 0x000200F9, 0x00003F86, 0x000200F8,\n    0x00003F86, 0x000700F5, 0x00000017, 0x00002ACC, 0x000022F8, 0x00002C98,\n    0x00001F17, 0x000033E0, 0x000300F7, 0x00003A1A, 0x00000000, 0x000400FA,\n    0x00005686, 0x00002958, 0x00003A1A, 0x000200F8, 0x00002958, 0x000500C7,\n    0x00000017, 0x00004760, 0x00002ACC, 0x000009CE, 0x000500C4, 0x00000017,\n    0x000024D2, 0x00004760, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AD,\n    0x00002ACC, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448E, 0x000050AD,\n    0x0000013D, 0x000500C5, 0x00000017, 0x00003FFA, 0x000024D2, 0x0000448E,\n    0x000200F9, 0x00003A1A, 0x000200F8, 0x00003A1A, 0x000700F5, 0x00000017,\n    0x00002ACD, 0x00002ACC, 0x00003F86, 0x00003FFA, 0x00002958, 0x000300F7,\n    0x00002C99, 0x00000000, 0x000400FA, 0x00003B23, 0x00002B39, 0x00002C99,\n    0x000200F8, 0x00002B39, 0x000500C4, 0x00000017, 0x00005E18, 0x00002ACD,\n    0x000002ED, 0x000500C2, 0x00000017, 0x00003BE8, 0x00002ACD, 0x000002ED,\n    0x000500C5, 0x00000017, 0x000029E9, 0x00005E18, 0x00003BE8, 0x000200F9,\n    0x00002C99, 0x000200F8, 0x00002C99, 0x000700F5, 0x00000017, 0x00004D38,\n    0x00002ACD, 0x00003A1A, 0x000029E9, 0x00002B39, 0x00060041, 0x00000294,\n    0x00001F75, 0x00001592, 0x00000A0B, 0x000041F1, 0x0003003E, 0x00001F75,\n    0x00004D38, 0x000200F9, 0x00004C7A, 0x000200F8, 0x00004C7A, 0x000100FD,\n    0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/resolve_full_8bpp_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25262\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 8 8 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_resolve_edram_info\"\n               OpMemberName %push_const_block_xe 1 \"xe_resolve_coordinate_info\"\n               OpMemberName %push_const_block_xe 2 \"xe_resolve_dest_info\"\n               OpMemberName %push_const_block_xe 3 \"xe_resolve_dest_coordinate_info\"\n               OpMemberName %push_const_block_xe 4 \"xe_resolve_dest_base\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %xe_resolve_edram_xe_block \"xe_resolve_edram_xe_block\"\n               OpMemberName %xe_resolve_edram_xe_block 0 \"data\"\n               OpName %xe_resolve_edram \"xe_resolve_edram\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_resolve_dest_xe_block \"xe_resolve_dest_xe_block\"\n               OpMemberName %xe_resolve_dest_xe_block 0 \"data\"\n               OpName %xe_resolve_dest \"xe_resolve_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpDecorate %_runtimearr_uint ArrayStride 4\n               OpDecorate %xe_resolve_edram_xe_block BufferBlock\n               OpMemberDecorate %xe_resolve_edram_xe_block 0 NonWritable\n               OpMemberDecorate %xe_resolve_edram_xe_block 0 Offset 0\n               OpDecorate %xe_resolve_edram NonWritable\n               OpDecorate %xe_resolve_edram Binding 0\n               OpDecorate %xe_resolve_edram DescriptorSet 0\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v2uint ArrayStride 8\n               OpDecorate %xe_resolve_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_resolve_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_resolve_dest_xe_block 0 Offset 0\n               OpDecorate %xe_resolve_dest NonReadable\n               OpDecorate %xe_resolve_dest Binding 0\n               OpDecorate %xe_resolve_dest DescriptorSet 1\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n     %v4uint = OpTypeVector %uint 4\n      %float = OpTypeFloat 32\n    %v4float = OpTypeVector %float 4\n       %bool = OpTypeBool\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n    %float_0 = OpConstant %float 0\n    %float_1 = OpConstant %float 1\n      %v4int = OpTypeVector %int 4\n  %float_255 = OpConstant %float 255\n  %float_0_5 = OpConstant %float 0.5\n     %uint_0 = OpConstant %uint 0\n     %uint_1 = OpConstant %uint 1\n      %int_8 = OpConstant %int 8\n     %uint_2 = OpConstant %uint 2\n     %int_16 = OpConstant %int 16\n     %uint_3 = OpConstant %uint 3\n     %int_24 = OpConstant %int 24\n   %uint_255 = OpConstant %uint 255\n%float_0_00392156886 = OpConstant %float 0.00392156886\n  %uint_1023 = OpConstant %uint 1023\n%float_0_000977517106 = OpConstant %float 0.000977517106\n   %uint_127 = OpConstant %uint 127\n     %uint_7 = OpConstant %uint 7\n     %v4bool = OpTypeVector %bool 4\n   %uint_124 = OpConstant %uint 124\n    %uint_23 = OpConstant %uint 23\n    %uint_16 = OpConstant %uint 16\n   %float_n1 = OpConstant %float -1\n%float_0_000976592302 = OpConstant %float 0.000976592302\n       %1837 = OpConstantComposite %v2uint %uint_2 %uint_1\n     %v2bool = OpTypeVector %bool 2\n       %1807 = OpConstantComposite %v2uint %uint_0 %uint_0\n       %1828 = OpConstantComposite %v2uint %uint_1 %uint_1\n       %1816 = OpConstantComposite %v2uint %uint_1 %uint_0\n    %uint_80 = OpConstant %uint 80\n       %2719 = OpConstantComposite %v2uint %uint_80 %uint_16\n      %int_2 = OpConstant %int 2\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n     %int_12 = OpConstant %int 12\n      %int_3 = OpConstant %int 3\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n      %int_0 = OpConstant %int 0\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n    %uint_10 = OpConstant %uint 10\n    %uint_13 = OpConstant %uint 13\n  %uint_2047 = OpConstant %uint 2047\n    %uint_24 = OpConstant %uint 24\n    %uint_15 = OpConstant %uint 15\n    %uint_28 = OpConstant %uint 28\n     %uint_4 = OpConstant %uint 4\n       %1855 = OpConstantComposite %v2uint %uint_0 %uint_4\n     %uint_5 = OpConstant %uint 5\n     %int_10 = OpConstant %int 10\n     %uint_8 = OpConstant %uint 8\n     %int_26 = OpConstant %int 26\n     %int_23 = OpConstant %int 23\n%uint_16777216 = OpConstant %uint 16777216\n    %uint_20 = OpConstant %uint 20\n       %2275 = OpConstantComposite %v2uint %uint_20 %uint_24\n     %v3uint = OpTypeVector %uint 3\n      %false = OpConstantFalse %bool\n    %v2float = OpTypeVector %float 2\n%_runtimearr_uint = OpTypeRuntimeArray %uint\n%xe_resolve_edram_xe_block = OpTypeStruct %_runtimearr_uint\n%_ptr_Uniform_xe_resolve_edram_xe_block = OpTypePointer Uniform %xe_resolve_edram_xe_block\n%xe_resolve_edram = OpVariable %_ptr_Uniform_xe_resolve_edram_xe_block Uniform\n%_ptr_Uniform_uint = OpTypePointer Uniform %uint\n     %uint_6 = OpConstant %uint 6\n   %uint_320 = OpConstant %uint 320\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n%_ptr_Input_uint = OpTypePointer Input %uint\n       %1834 = OpConstantComposite %v2uint %uint_3 %uint_0\n%_runtimearr_v2uint = OpTypeRuntimeArray %v2uint\n%xe_resolve_dest_xe_block = OpTypeStruct %_runtimearr_v2uint\n%_ptr_Uniform_xe_resolve_dest_xe_block = OpTypePointer Uniform %xe_resolve_dest_xe_block\n%xe_resolve_dest = OpVariable %_ptr_Uniform_xe_resolve_dest_xe_block Uniform\n%_ptr_Uniform_v2uint = OpTypePointer Uniform %v2uint\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_8 %uint_8 %uint_1\n       %1954 = OpConstantComposite %v2uint %uint_15 %uint_1\n       %1870 = OpConstantComposite %v2uint %uint_3 %uint_3\n       %2122 = OpConstantComposite %v2uint %uint_15 %uint_15\n       %1284 = OpConstantComposite %v4float %float_n1 %float_n1 %float_n1 %float_n1\n        %770 = OpConstantComposite %v4int %int_16 %int_16 %int_16 %int_16\n       %1611 = OpConstantComposite %v4uint %uint_255 %uint_255 %uint_255 %uint_255\n        %929 = OpConstantComposite %v4uint %uint_1023 %uint_1023 %uint_1023 %uint_1023\n        %721 = OpConstantComposite %v4uint %uint_127 %uint_127 %uint_127 %uint_127\n        %263 = OpConstantComposite %v4uint %uint_7 %uint_7 %uint_7 %uint_7\n       %2896 = OpConstantComposite %v4uint %uint_0 %uint_0 %uint_0 %uint_0\n        %559 = OpConstantComposite %v4uint %uint_124 %uint_124 %uint_124 %uint_124\n       %1127 = OpConstantComposite %v4uint %uint_23 %uint_23 %uint_23 %uint_23\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n       %2938 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0\n       %1285 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1\n        %325 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_0_5\n%int_1065353216 = OpConstant %int 1065353216\n  %uint_1280 = OpConstant %uint 1280\n%uint_2621440 = OpConstant %uint 2621440\n%uint_4294967290 = OpConstant %uint 4294967290\n       %2575 = OpConstantComposite %v4uint %uint_4294967290 %uint_4294967290 %uint_4294967290 %uint_4294967290\n   %uint_336 = OpConstant %uint 336\n %float_0_25 = OpConstant %float 0.25\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %22245 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %15627 = OpLoad %uint %22245\n      %22700 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %20824 = OpLoad %uint %22700\n      %20561 = OpBitwiseAnd %uint %15627 %uint_1023\n      %19978 = OpShiftRightLogical %uint %15627 %uint_10\n       %8574 = OpBitwiseAnd %uint %19978 %uint_3\n      %21002 = OpShiftRightLogical %uint %15627 %uint_13\n       %8575 = OpBitwiseAnd %uint %21002 %uint_2047\n      %21003 = OpShiftRightLogical %uint %15627 %uint_24\n       %8576 = OpBitwiseAnd %uint %21003 %uint_15\n      %18836 = OpShiftRightLogical %uint %15627 %uint_28\n       %9130 = OpBitwiseAnd %uint %18836 %uint_1\n       %8871 = OpCompositeConstruct %v2uint %20824 %20824\n       %9576 = OpShiftRightLogical %v2uint %8871 %1855\n      %23379 = OpBitwiseAnd %v2uint %9576 %1954\n      %16207 = OpShiftLeftLogical %v2uint %23379 %1870\n      %23019 = OpIMul %v2uint %16207 %1828\n      %12819 = OpShiftRightLogical %uint %20824 %uint_5\n      %16204 = OpBitwiseAnd %uint %12819 %uint_2047\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %24236 = OpLoad %uint %18732\n      %22701 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %20387 = OpLoad %uint %22701\n      %24445 = OpBitwiseAnd %uint %24236 %uint_8\n      %18667 = OpINotEqual %bool %24445 %uint_0\n       %8977 = OpShiftRightLogical %uint %24236 %uint_4\n      %17416 = OpBitwiseAnd %uint %8977 %uint_7\n      %22920 = OpBitcast %int %24236\n      %13711 = OpShiftLeftLogical %int %22920 %int_10\n      %20636 = OpShiftRightArithmetic %int %13711 %int_26\n      %18178 = OpShiftLeftLogical %int %20636 %int_23\n       %7462 = OpIAdd %int %18178 %int_1065353216\n      %11052 = OpBitcast %float %7462\n      %22649 = OpBitwiseAnd %uint %24236 %uint_16777216\n       %7475 = OpINotEqual %bool %22649 %uint_0\n       %8444 = OpBitwiseAnd %uint %20387 %uint_1023\n      %12176 = OpShiftRightLogical %uint %20387 %uint_10\n      %25038 = OpBitwiseAnd %uint %12176 %uint_1023\n      %25203 = OpShiftLeftLogical %uint %25038 %int_1\n      %10422 = OpCompositeConstruct %v2uint %20387 %20387\n      %10385 = OpShiftRightLogical %v2uint %10422 %2275\n      %23380 = OpBitwiseAnd %v2uint %10385 %2122\n      %16208 = OpShiftLeftLogical %v2uint %23380 %1870\n      %23020 = OpIMul %v2uint %16208 %1828\n      %12820 = OpShiftRightLogical %uint %20387 %uint_28\n      %16205 = OpBitwiseAnd %uint %12820 %uint_7\n      %18733 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_4\n      %24237 = OpLoad %uint %18733\n      %22225 = OpAccessChain %_ptr_Input_uint %gl_GlobalInvocationID %uint_0\n       %7085 = OpLoad %uint %22225\n       %7405 = OpUGreaterThanEqual %bool %7085 %16204\n               OpSelectionMerge %17447 DontFlatten\n               OpBranchConditional %7405 %21992 %17447\n      %21992 = OpLabel\n               OpBranch %19578\n      %17447 = OpLabel\n      %14637 = OpLoad %v3uint %gl_GlobalInvocationID\n      %18505 = OpVectorShuffle %v2uint %14637 %14637 0 1\n       %9840 = OpShiftLeftLogical %v2uint %18505 %1834\n      %24498 = OpCompositeExtract %uint %9840 0\n       %7150 = OpCompositeExtract %uint %9840 1\n      %24446 = OpExtInst %uint %1 UMax %7150 %uint_0\n      %20975 = OpCompositeConstruct %v2uint %24498 %24446\n      %21036 = OpIAdd %v2uint %20975 %23019\n      %16075 = OpULessThanEqual %bool %16205 %uint_3\n               OpSelectionMerge %23776 None\n               OpBranchConditional %16075 %10990 %15087\n      %15087 = OpLabel\n      %13566 = OpIEqual %bool %16205 %uint_5\n       %8438 = OpSelect %uint %13566 %uint_2 %uint_0\n               OpBranch %23776\n      %10990 = OpLabel\n               OpBranch %23776\n      %23776 = OpLabel\n      %19300 = OpPhi %uint %16205 %10990 %8438 %15087\n      %16830 = OpCompositeConstruct %v2uint %8574 %8574\n      %11801 = OpUGreaterThanEqual %v2bool %16830 %1837\n      %19381 = OpSelect %v2uint %11801 %1828 %1807\n      %10986 = OpShiftLeftLogical %v2uint %21036 %19381\n      %24669 = OpCompositeConstruct %v2uint %19300 %19300\n       %9093 = OpShiftRightLogical %v2uint %24669 %1816\n      %15084 = OpBitwiseAnd %v2uint %9093 %1828\n      %10197 = OpIAdd %v2uint %10986 %15084\n       %8548 = OpCompositeConstruct %v2uint %9130 %uint_0\n       %9802 = OpShiftRightLogical %v2uint %2719 %8548\n      %10146 = OpUDiv %v2uint %10197 %9802\n      %20390 = OpCompositeExtract %uint %10146 1\n      %11046 = OpIMul %uint %20390 %20561\n      %24665 = OpCompositeExtract %uint %10146 0\n      %21536 = OpIAdd %uint %11046 %24665\n       %8742 = OpIAdd %uint %8575 %21536\n      %23345 = OpIMul %v2uint %10146 %9802\n      %11892 = OpISub %v2uint %10197 %23345\n       %8053 = OpIMul %uint %8742 %uint_1280\n      %24263 = OpCompositeExtract %uint %11892 1\n      %23526 = OpCompositeExtract %uint %9802 0\n      %22886 = OpIMul %uint %24263 %23526\n       %6886 = OpCompositeExtract %uint %11892 0\n       %9696 = OpIAdd %uint %22886 %6886\n      %18116 = OpShiftLeftLogical %uint %9696 %9130\n      %18619 = OpIAdd %uint %8053 %18116\n      %19545 = OpUMod %uint %18619 %uint_2621440\n      %23531 = OpShiftLeftLogical %uint %19545 %int_2\n      %13906 = OpUGreaterThanEqual %bool %8574 %uint_2\n      %11277 = OpSelect %uint %13906 %uint_1 %uint_0\n      %21518 = OpIAdd %uint %9130 %11277\n      %12535 = OpShiftLeftLogical %uint %uint_4 %21518\n               OpSelectionMerge %13276 None\n               OpBranchConditional %7475 %16434 %13276\n      %16434 = OpLabel\n      %10585 = OpINotEqual %bool %9130 %uint_0\n               OpBranch %13276\n      %13276 = OpLabel\n      %10924 = OpPhi %bool %7475 %23776 %10585 %16434\n               OpSelectionMerge %25261 None\n               OpBranchConditional %10924 %23873 %25261\n      %23873 = OpLabel\n       %6992 = OpIAdd %uint %23531 %uint_4\n               OpBranch %25261\n      %25261 = OpLabel\n      %24188 = OpPhi %uint %23531 %13276 %6992 %23873\n      %24753 = OpIEqual %bool %12535 %uint_4\n               OpSelectionMerge %20259 DontFlatten\n               OpBranchConditional %24753 %6591 %8959\n       %8959 = OpLabel\n      %22064 = OpShiftRightLogical %uint %24188 %int_2\n      %13369 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22064\n      %15060 = OpLoad %uint %13369\n       %8517 = OpIAdd %uint %24188 %12535\n      %21670 = OpShiftRightLogical %uint %8517 %int_2\n      %19677 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21670\n      %13114 = OpLoad %uint %19677\n       %8685 = OpIMul %uint %uint_2 %12535\n      %24254 = OpIAdd %uint %24188 %8685\n      %17890 = OpShiftRightLogical %uint %24254 %int_2\n      %19678 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17890\n      %13115 = OpLoad %uint %19678\n       %8686 = OpIMul %uint %uint_3 %12535\n      %24255 = OpIAdd %uint %24188 %8686\n      %17891 = OpShiftRightLogical %uint %24255 %int_2\n      %18689 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17891\n      %22186 = OpLoad %uint %18689\n      %19670 = OpCompositeConstruct %v4uint %15060 %13114 %13115 %22186\n      %19499 = OpIMul %uint %uint_4 %12535\n      %10821 = OpIAdd %uint %24188 %19499\n      %17892 = OpShiftRightLogical %uint %10821 %int_2\n      %19679 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17892\n      %13116 = OpLoad %uint %19679\n       %8687 = OpIMul %uint %uint_5 %12535\n      %24256 = OpIAdd %uint %24188 %8687\n      %17893 = OpShiftRightLogical %uint %24256 %int_2\n      %19680 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17893\n      %13117 = OpLoad %uint %19680\n       %8688 = OpIMul %uint %uint_6 %12535\n      %24257 = OpIAdd %uint %24188 %8688\n      %17894 = OpShiftRightLogical %uint %24257 %int_2\n      %19681 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17894\n      %13118 = OpLoad %uint %19681\n       %8689 = OpIMul %uint %uint_7 %12535\n      %24258 = OpIAdd %uint %24188 %8689\n      %17895 = OpShiftRightLogical %uint %24258 %int_2\n      %18690 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17895\n      %24409 = OpLoad %uint %18690\n      %20780 = OpCompositeConstruct %v4uint %13116 %13117 %13118 %24409\n               OpBranch %20259\n       %6591 = OpLabel\n      %24486 = OpShiftRightLogical %uint %24188 %int_2\n      %13370 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24486\n      %12609 = OpLoad %uint %13370\n      %11687 = OpIAdd %uint %24486 %uint_1\n       %6399 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11687\n      %23650 = OpLoad %uint %6399\n      %11688 = OpIAdd %uint %24486 %uint_2\n       %6400 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11688\n      %23651 = OpLoad %uint %6400\n      %11689 = OpIAdd %uint %24486 %uint_3\n      %24558 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11689\n      %14080 = OpLoad %uint %24558\n      %21616 = OpCompositeConstruct %v4uint %12609 %23650 %23651 %14080\n      %19331 = OpIAdd %uint %24188 %uint_16\n       %8237 = OpShiftRightLogical %uint %19331 %int_2\n      %19601 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %8237\n      %12610 = OpLoad %uint %19601\n      %11690 = OpIAdd %uint %8237 %uint_1\n       %6401 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11690\n      %23652 = OpLoad %uint %6401\n      %11691 = OpIAdd %uint %8237 %uint_2\n       %6402 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11691\n      %23653 = OpLoad %uint %6402\n      %11692 = OpIAdd %uint %8237 %uint_3\n      %24559 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11692\n      %16379 = OpLoad %uint %24559\n      %20781 = OpCompositeConstruct %v4uint %12610 %23652 %23653 %16379\n               OpBranch %20259\n      %20259 = OpLabel\n       %9769 = OpPhi %v4uint %20781 %6591 %20780 %8959\n      %14570 = OpPhi %v4uint %21616 %6591 %19670 %8959\n      %17369 = OpINotEqual %bool %9130 %uint_0\n               OpSelectionMerge %21263 DontFlatten\n               OpBranchConditional %17369 %21031 %22395\n      %22395 = OpLabel\n               OpSelectionMerge %23460 None\n               OpSwitch %8576 %24626 0 %16005 1 %16005 2 %14402 10 %14402 3 %22975 12 %22975 4 %21190 6 %8243\n       %8243 = OpLabel\n      %24406 = OpCompositeExtract %uint %14570 0\n      %24679 = OpExtInst %v2float %1 UnpackHalf2x16 %24406\n       %8852 = OpCompositeExtract %float %24679 0\n       %7599 = OpCompositeExtract %uint %14570 1\n      %15605 = OpExtInst %v2float %1 UnpackHalf2x16 %7599\n       %8853 = OpCompositeExtract %float %15605 0\n       %7600 = OpCompositeExtract %uint %14570 2\n      %15606 = OpExtInst %v2float %1 UnpackHalf2x16 %7600\n       %8854 = OpCompositeExtract %float %15606 0\n       %7601 = OpCompositeExtract %uint %14570 3\n      %15586 = OpExtInst %v2float %1 UnpackHalf2x16 %7601\n      %10274 = OpCompositeExtract %float %15586 0\n      %24249 = OpCompositeConstruct %v4float %8852 %8853 %8854 %10274\n      %17274 = OpCompositeExtract %uint %9769 0\n      %18027 = OpExtInst %v2float %1 UnpackHalf2x16 %17274\n       %8855 = OpCompositeExtract %float %18027 0\n       %7602 = OpCompositeExtract %uint %9769 1\n      %15607 = OpExtInst %v2float %1 UnpackHalf2x16 %7602\n       %8856 = OpCompositeExtract %float %15607 0\n       %7603 = OpCompositeExtract %uint %9769 2\n      %15608 = OpExtInst %v2float %1 UnpackHalf2x16 %7603\n       %8857 = OpCompositeExtract %float %15608 0\n       %7604 = OpCompositeExtract %uint %9769 3\n      %15587 = OpExtInst %v2float %1 UnpackHalf2x16 %7604\n      %13466 = OpCompositeExtract %float %15587 0\n      %18678 = OpCompositeConstruct %v4float %8855 %8856 %8857 %13466\n               OpBranch %23460\n      %21190 = OpLabel\n      %24820 = OpBitcast %v4int %14570\n      %22558 = OpShiftLeftLogical %v4int %24820 %770\n      %16536 = OpShiftRightArithmetic %v4int %22558 %770\n      %10903 = OpConvertSToF %v4float %16536\n      %19064 = OpVectorTimesScalar %v4float %10903 %float_0_000976592302\n      %18816 = OpExtInst %v4float %1 FMax %1284 %19064\n      %10213 = OpBitcast %v4int %9769\n       %8609 = OpShiftLeftLogical %v4int %10213 %770\n      %16537 = OpShiftRightArithmetic %v4int %8609 %770\n      %10904 = OpConvertSToF %v4float %16537\n      %21439 = OpVectorTimesScalar %v4float %10904 %float_0_000976592302\n      %17250 = OpExtInst %v4float %1 FMax %1284 %21439\n               OpBranch %23460\n      %22975 = OpLabel\n      %19462 = OpSelect %uint %7475 %uint_20 %uint_0\n       %9136 = OpCompositeConstruct %v4uint %19462 %19462 %19462 %19462\n      %23880 = OpShiftRightLogical %v4uint %14570 %9136\n      %24038 = OpBitwiseAnd %v4uint %23880 %929\n      %18588 = OpBitwiseAnd %v4uint %23880 %721\n      %23440 = OpShiftRightLogical %v4uint %24038 %263\n      %16585 = OpIEqual %v4bool %23440 %2896\n      %11339 = OpExtInst %v4int %1 FindUMsb %18588\n      %10773 = OpBitcast %v4uint %11339\n       %6266 = OpISub %v4uint %263 %10773\n       %8720 = OpIAdd %v4uint %10773 %2575\n      %10351 = OpSelect %v4uint %16585 %8720 %23440\n      %23252 = OpShiftLeftLogical %v4uint %18588 %6266\n      %18842 = OpBitwiseAnd %v4uint %23252 %721\n      %10909 = OpSelect %v4uint %16585 %18842 %18588\n      %24569 = OpIAdd %v4uint %10351 %559\n      %20351 = OpShiftLeftLogical %v4uint %24569 %1127\n      %16294 = OpShiftLeftLogical %v4uint %10909 %749\n      %22396 = OpBitwiseOr %v4uint %20351 %16294\n      %13824 = OpIEqual %v4bool %24038 %2896\n      %16962 = OpSelect %v4uint %13824 %2896 %22396\n      %12356 = OpBitcast %v4float %16962\n      %24638 = OpShiftRightLogical %v4uint %9769 %9136\n      %14625 = OpBitwiseAnd %v4uint %24638 %929\n      %18589 = OpBitwiseAnd %v4uint %24638 %721\n      %23441 = OpShiftRightLogical %v4uint %14625 %263\n      %16586 = OpIEqual %v4bool %23441 %2896\n      %11340 = OpExtInst %v4int %1 FindUMsb %18589\n      %10774 = OpBitcast %v4uint %11340\n       %6267 = OpISub %v4uint %263 %10774\n       %8721 = OpIAdd %v4uint %10774 %2575\n      %10352 = OpSelect %v4uint %16586 %8721 %23441\n      %23253 = OpShiftLeftLogical %v4uint %18589 %6267\n      %18843 = OpBitwiseAnd %v4uint %23253 %721\n      %10910 = OpSelect %v4uint %16586 %18843 %18589\n      %24570 = OpIAdd %v4uint %10352 %559\n      %20352 = OpShiftLeftLogical %v4uint %24570 %1127\n      %16295 = OpShiftLeftLogical %v4uint %10910 %749\n      %22397 = OpBitwiseOr %v4uint %20352 %16295\n      %13825 = OpIEqual %v4bool %14625 %2896\n      %18007 = OpSelect %v4uint %13825 %2896 %22397\n      %22843 = OpBitcast %v4float %18007\n               OpBranch %23460\n      %14402 = OpLabel\n      %19463 = OpSelect %uint %7475 %uint_20 %uint_0\n       %9137 = OpCompositeConstruct %v4uint %19463 %19463 %19463 %19463\n      %22227 = OpShiftRightLogical %v4uint %14570 %9137\n      %19030 = OpBitwiseAnd %v4uint %22227 %929\n      %16133 = OpConvertUToF %v4float %19030\n      %21018 = OpVectorTimesScalar %v4float %16133 %float_0_000977517106\n       %7746 = OpShiftRightLogical %v4uint %9769 %9137\n      %11220 = OpBitwiseAnd %v4uint %7746 %929\n      %17178 = OpConvertUToF %v4float %11220\n      %12434 = OpVectorTimesScalar %v4float %17178 %float_0_000977517106\n               OpBranch %23460\n      %16005 = OpLabel\n      %19464 = OpSelect %uint %7475 %uint_16 %uint_0\n       %9138 = OpCompositeConstruct %v4uint %19464 %19464 %19464 %19464\n      %22228 = OpShiftRightLogical %v4uint %14570 %9138\n      %19031 = OpBitwiseAnd %v4uint %22228 %1611\n      %16134 = OpConvertUToF %v4float %19031\n      %21019 = OpVectorTimesScalar %v4float %16134 %float_0_00392156886\n       %7747 = OpShiftRightLogical %v4uint %9769 %9138\n      %11221 = OpBitwiseAnd %v4uint %7747 %1611\n      %17179 = OpConvertUToF %v4float %11221\n      %12435 = OpVectorTimesScalar %v4float %17179 %float_0_00392156886\n               OpBranch %23460\n      %24626 = OpLabel\n      %19231 = OpBitcast %v4float %14570\n      %14514 = OpBitcast %v4float %9769\n               OpBranch %23460\n      %23460 = OpLabel\n      %11251 = OpPhi %v4float %14514 %24626 %12435 %16005 %12434 %14402 %22843 %22975 %17250 %21190 %18678 %8243\n      %13709 = OpPhi %v4float %19231 %24626 %21019 %16005 %21018 %14402 %12356 %22975 %18816 %21190 %24249 %8243\n               OpBranch %21263\n      %21031 = OpLabel\n               OpSelectionMerge %23461 None\n               OpSwitch %8576 %12525 5 %21191 7 %8244\n       %8244 = OpLabel\n      %24407 = OpCompositeExtract %uint %14570 0\n      %24680 = OpExtInst %v2float %1 UnpackHalf2x16 %24407\n       %8858 = OpCompositeExtract %float %24680 0\n       %7605 = OpCompositeExtract %uint %14570 1\n      %15609 = OpExtInst %v2float %1 UnpackHalf2x16 %7605\n       %8859 = OpCompositeExtract %float %15609 0\n       %7606 = OpCompositeExtract %uint %14570 2\n      %15610 = OpExtInst %v2float %1 UnpackHalf2x16 %7606\n       %8860 = OpCompositeExtract %float %15610 0\n       %7607 = OpCompositeExtract %uint %14570 3\n      %15588 = OpExtInst %v2float %1 UnpackHalf2x16 %7607\n      %10275 = OpCompositeExtract %float %15588 0\n      %24250 = OpCompositeConstruct %v4float %8858 %8859 %8860 %10275\n      %17275 = OpCompositeExtract %uint %9769 0\n      %18028 = OpExtInst %v2float %1 UnpackHalf2x16 %17275\n       %8861 = OpCompositeExtract %float %18028 0\n       %7608 = OpCompositeExtract %uint %9769 1\n      %15611 = OpExtInst %v2float %1 UnpackHalf2x16 %7608\n       %8862 = OpCompositeExtract %float %15611 0\n       %7609 = OpCompositeExtract %uint %9769 2\n      %15612 = OpExtInst %v2float %1 UnpackHalf2x16 %7609\n       %8863 = OpCompositeExtract %float %15612 0\n       %7610 = OpCompositeExtract %uint %9769 3\n      %15589 = OpExtInst %v2float %1 UnpackHalf2x16 %7610\n      %13467 = OpCompositeExtract %float %15589 0\n      %18679 = OpCompositeConstruct %v4float %8861 %8862 %8863 %13467\n               OpBranch %23461\n      %21191 = OpLabel\n      %24821 = OpBitcast %v4int %14570\n      %22559 = OpShiftLeftLogical %v4int %24821 %770\n      %16538 = OpShiftRightArithmetic %v4int %22559 %770\n      %10905 = OpConvertSToF %v4float %16538\n      %19065 = OpVectorTimesScalar %v4float %10905 %float_0_000976592302\n      %18817 = OpExtInst %v4float %1 FMax %1284 %19065\n      %10214 = OpBitcast %v4int %9769\n       %8610 = OpShiftLeftLogical %v4int %10214 %770\n      %16539 = OpShiftRightArithmetic %v4int %8610 %770\n      %10906 = OpConvertSToF %v4float %16539\n      %21440 = OpVectorTimesScalar %v4float %10906 %float_0_000976592302\n      %17251 = OpExtInst %v4float %1 FMax %1284 %21440\n               OpBranch %23461\n      %12525 = OpLabel\n      %19232 = OpBitcast %v4float %14570\n      %14515 = OpBitcast %v4float %9769\n               OpBranch %23461\n      %23461 = OpLabel\n      %11252 = OpPhi %v4float %14515 %12525 %17251 %21191 %18679 %8244\n      %13710 = OpPhi %v4float %19232 %12525 %18817 %21191 %24250 %8244\n               OpBranch %21263\n      %21263 = OpLabel\n       %9826 = OpPhi %v4float %11252 %23461 %11251 %23460\n      %14051 = OpPhi %v4float %13710 %23461 %13709 %23460\n      %11861 = OpUGreaterThanEqual %bool %16205 %uint_4\n               OpSelectionMerge %21267 DontFlatten\n               OpBranchConditional %11861 %20709 %21267\n      %20709 = OpLabel\n      %25083 = OpFMul %float %11052 %float_0_5\n      %24184 = OpIAdd %uint %24188 %uint_320\n               OpSelectionMerge %20260 DontFlatten\n               OpBranchConditional %24753 %6592 %8960\n       %8960 = OpLabel\n      %22065 = OpShiftRightLogical %uint %24184 %int_2\n      %13371 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22065\n      %15061 = OpLoad %uint %13371\n       %8518 = OpIAdd %uint %24184 %12535\n      %21671 = OpShiftRightLogical %uint %8518 %int_2\n      %19682 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21671\n      %13119 = OpLoad %uint %19682\n       %8690 = OpIMul %uint %uint_2 %12535\n      %24259 = OpIAdd %uint %24184 %8690\n      %17896 = OpShiftRightLogical %uint %24259 %int_2\n      %19683 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17896\n      %13120 = OpLoad %uint %19683\n       %8691 = OpIMul %uint %uint_3 %12535\n      %24260 = OpIAdd %uint %24184 %8691\n      %17897 = OpShiftRightLogical %uint %24260 %int_2\n      %18691 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17897\n      %22187 = OpLoad %uint %18691\n      %19671 = OpCompositeConstruct %v4uint %15061 %13119 %13120 %22187\n      %19500 = OpIMul %uint %uint_4 %12535\n      %10822 = OpIAdd %uint %24184 %19500\n      %17898 = OpShiftRightLogical %uint %10822 %int_2\n      %19684 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17898\n      %13121 = OpLoad %uint %19684\n       %8692 = OpIMul %uint %uint_5 %12535\n      %24261 = OpIAdd %uint %24184 %8692\n      %17899 = OpShiftRightLogical %uint %24261 %int_2\n      %19685 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17899\n      %13122 = OpLoad %uint %19685\n       %8693 = OpIMul %uint %uint_6 %12535\n      %24262 = OpIAdd %uint %24184 %8693\n      %17900 = OpShiftRightLogical %uint %24262 %int_2\n      %19686 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17900\n      %13123 = OpLoad %uint %19686\n       %8694 = OpIMul %uint %uint_7 %12535\n      %24264 = OpIAdd %uint %24184 %8694\n      %17901 = OpShiftRightLogical %uint %24264 %int_2\n      %18692 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17901\n      %24410 = OpLoad %uint %18692\n      %20782 = OpCompositeConstruct %v4uint %13121 %13122 %13123 %24410\n               OpBranch %20260\n       %6592 = OpLabel\n      %24487 = OpShiftRightLogical %uint %24184 %int_2\n      %13372 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24487\n      %12611 = OpLoad %uint %13372\n      %11693 = OpIAdd %uint %24487 %uint_1\n       %6403 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11693\n      %23654 = OpLoad %uint %6403\n      %11694 = OpIAdd %uint %24487 %uint_2\n       %6404 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11694\n      %23655 = OpLoad %uint %6404\n      %11695 = OpIAdd %uint %24487 %uint_3\n      %24560 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11695\n      %14081 = OpLoad %uint %24560\n      %21617 = OpCompositeConstruct %v4uint %12611 %23654 %23655 %14081\n      %19332 = OpIAdd %uint %24188 %uint_336\n       %8238 = OpShiftRightLogical %uint %19332 %int_2\n      %19602 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %8238\n      %12612 = OpLoad %uint %19602\n      %11696 = OpIAdd %uint %8238 %uint_1\n       %6405 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11696\n      %23656 = OpLoad %uint %6405\n      %11697 = OpIAdd %uint %8238 %uint_2\n       %6406 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11697\n      %23657 = OpLoad %uint %6406\n      %11698 = OpIAdd %uint %8238 %uint_3\n      %24561 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11698\n      %16380 = OpLoad %uint %24561\n      %20783 = OpCompositeConstruct %v4uint %12612 %23656 %23657 %16380\n               OpBranch %20260\n      %20260 = OpLabel\n      %11213 = OpPhi %v4uint %20783 %6592 %20782 %8960\n      %14093 = OpPhi %v4uint %21617 %6592 %19671 %8960\n               OpSelectionMerge %21264 DontFlatten\n               OpBranchConditional %17369 %21032 %22398\n      %22398 = OpLabel\n               OpSelectionMerge %23462 None\n               OpSwitch %8576 %24627 0 %16006 1 %16006 2 %14403 10 %14403 3 %22976 12 %22976 4 %21192 6 %8245\n       %8245 = OpLabel\n      %24408 = OpCompositeExtract %uint %14093 0\n      %24681 = OpExtInst %v2float %1 UnpackHalf2x16 %24408\n       %8864 = OpCompositeExtract %float %24681 0\n       %7611 = OpCompositeExtract %uint %14093 1\n      %15613 = OpExtInst %v2float %1 UnpackHalf2x16 %7611\n       %8865 = OpCompositeExtract %float %15613 0\n       %7612 = OpCompositeExtract %uint %14093 2\n      %15614 = OpExtInst %v2float %1 UnpackHalf2x16 %7612\n       %8866 = OpCompositeExtract %float %15614 0\n       %7613 = OpCompositeExtract %uint %14093 3\n      %15590 = OpExtInst %v2float %1 UnpackHalf2x16 %7613\n      %10276 = OpCompositeExtract %float %15590 0\n      %24251 = OpCompositeConstruct %v4float %8864 %8865 %8866 %10276\n      %17276 = OpCompositeExtract %uint %11213 0\n      %18029 = OpExtInst %v2float %1 UnpackHalf2x16 %17276\n       %8867 = OpCompositeExtract %float %18029 0\n       %7614 = OpCompositeExtract %uint %11213 1\n      %15615 = OpExtInst %v2float %1 UnpackHalf2x16 %7614\n       %8868 = OpCompositeExtract %float %15615 0\n       %7615 = OpCompositeExtract %uint %11213 2\n      %15616 = OpExtInst %v2float %1 UnpackHalf2x16 %7615\n       %8869 = OpCompositeExtract %float %15616 0\n       %7616 = OpCompositeExtract %uint %11213 3\n      %15591 = OpExtInst %v2float %1 UnpackHalf2x16 %7616\n      %13468 = OpCompositeExtract %float %15591 0\n      %18680 = OpCompositeConstruct %v4float %8867 %8868 %8869 %13468\n               OpBranch %23462\n      %21192 = OpLabel\n      %24822 = OpBitcast %v4int %14093\n      %22560 = OpShiftLeftLogical %v4int %24822 %770\n      %16540 = OpShiftRightArithmetic %v4int %22560 %770\n      %10907 = OpConvertSToF %v4float %16540\n      %19066 = OpVectorTimesScalar %v4float %10907 %float_0_000976592302\n      %18818 = OpExtInst %v4float %1 FMax %1284 %19066\n      %10215 = OpBitcast %v4int %11213\n       %8611 = OpShiftLeftLogical %v4int %10215 %770\n      %16541 = OpShiftRightArithmetic %v4int %8611 %770\n      %10908 = OpConvertSToF %v4float %16541\n      %21441 = OpVectorTimesScalar %v4float %10908 %float_0_000976592302\n      %17252 = OpExtInst %v4float %1 FMax %1284 %21441\n               OpBranch %23462\n      %22976 = OpLabel\n      %19465 = OpSelect %uint %7475 %uint_20 %uint_0\n       %9139 = OpCompositeConstruct %v4uint %19465 %19465 %19465 %19465\n      %23881 = OpShiftRightLogical %v4uint %14093 %9139\n      %24039 = OpBitwiseAnd %v4uint %23881 %929\n      %18590 = OpBitwiseAnd %v4uint %23881 %721\n      %23442 = OpShiftRightLogical %v4uint %24039 %263\n      %16587 = OpIEqual %v4bool %23442 %2896\n      %11341 = OpExtInst %v4int %1 FindUMsb %18590\n      %10775 = OpBitcast %v4uint %11341\n       %6268 = OpISub %v4uint %263 %10775\n       %8722 = OpIAdd %v4uint %10775 %2575\n      %10353 = OpSelect %v4uint %16587 %8722 %23442\n      %23254 = OpShiftLeftLogical %v4uint %18590 %6268\n      %18844 = OpBitwiseAnd %v4uint %23254 %721\n      %10911 = OpSelect %v4uint %16587 %18844 %18590\n      %24571 = OpIAdd %v4uint %10353 %559\n      %20353 = OpShiftLeftLogical %v4uint %24571 %1127\n      %16296 = OpShiftLeftLogical %v4uint %10911 %749\n      %22399 = OpBitwiseOr %v4uint %20353 %16296\n      %13826 = OpIEqual %v4bool %24039 %2896\n      %16963 = OpSelect %v4uint %13826 %2896 %22399\n      %12357 = OpBitcast %v4float %16963\n      %24639 = OpShiftRightLogical %v4uint %11213 %9139\n      %14626 = OpBitwiseAnd %v4uint %24639 %929\n      %18591 = OpBitwiseAnd %v4uint %24639 %721\n      %23443 = OpShiftRightLogical %v4uint %14626 %263\n      %16588 = OpIEqual %v4bool %23443 %2896\n      %11342 = OpExtInst %v4int %1 FindUMsb %18591\n      %10776 = OpBitcast %v4uint %11342\n       %6269 = OpISub %v4uint %263 %10776\n       %8723 = OpIAdd %v4uint %10776 %2575\n      %10354 = OpSelect %v4uint %16588 %8723 %23443\n      %23255 = OpShiftLeftLogical %v4uint %18591 %6269\n      %18845 = OpBitwiseAnd %v4uint %23255 %721\n      %10912 = OpSelect %v4uint %16588 %18845 %18591\n      %24572 = OpIAdd %v4uint %10354 %559\n      %20354 = OpShiftLeftLogical %v4uint %24572 %1127\n      %16297 = OpShiftLeftLogical %v4uint %10912 %749\n      %22400 = OpBitwiseOr %v4uint %20354 %16297\n      %13827 = OpIEqual %v4bool %14626 %2896\n      %18008 = OpSelect %v4uint %13827 %2896 %22400\n      %22844 = OpBitcast %v4float %18008\n               OpBranch %23462\n      %14403 = OpLabel\n      %19466 = OpSelect %uint %7475 %uint_20 %uint_0\n       %9140 = OpCompositeConstruct %v4uint %19466 %19466 %19466 %19466\n      %22229 = OpShiftRightLogical %v4uint %14093 %9140\n      %19032 = OpBitwiseAnd %v4uint %22229 %929\n      %16135 = OpConvertUToF %v4float %19032\n      %21020 = OpVectorTimesScalar %v4float %16135 %float_0_000977517106\n       %7748 = OpShiftRightLogical %v4uint %11213 %9140\n      %11222 = OpBitwiseAnd %v4uint %7748 %929\n      %17180 = OpConvertUToF %v4float %11222\n      %12436 = OpVectorTimesScalar %v4float %17180 %float_0_000977517106\n               OpBranch %23462\n      %16006 = OpLabel\n      %19467 = OpSelect %uint %7475 %uint_16 %uint_0\n       %9141 = OpCompositeConstruct %v4uint %19467 %19467 %19467 %19467\n      %22230 = OpShiftRightLogical %v4uint %14093 %9141\n      %19033 = OpBitwiseAnd %v4uint %22230 %1611\n      %16136 = OpConvertUToF %v4float %19033\n      %21021 = OpVectorTimesScalar %v4float %16136 %float_0_00392156886\n       %7749 = OpShiftRightLogical %v4uint %11213 %9141\n      %11223 = OpBitwiseAnd %v4uint %7749 %1611\n      %17181 = OpConvertUToF %v4float %11223\n      %12437 = OpVectorTimesScalar %v4float %17181 %float_0_00392156886\n               OpBranch %23462\n      %24627 = OpLabel\n      %19233 = OpBitcast %v4float %14093\n      %14516 = OpBitcast %v4float %11213\n               OpBranch %23462\n      %23462 = OpLabel\n      %11253 = OpPhi %v4float %14516 %24627 %12437 %16006 %12436 %14403 %22844 %22976 %17252 %21192 %18680 %8245\n      %13712 = OpPhi %v4float %19233 %24627 %21021 %16006 %21020 %14403 %12357 %22976 %18818 %21192 %24251 %8245\n               OpBranch %21264\n      %21032 = OpLabel\n               OpSelectionMerge %23463 None\n               OpSwitch %8576 %12526 5 %21193 7 %8246\n       %8246 = OpLabel\n      %24411 = OpCompositeExtract %uint %14093 0\n      %24682 = OpExtInst %v2float %1 UnpackHalf2x16 %24411\n       %8870 = OpCompositeExtract %float %24682 0\n       %7617 = OpCompositeExtract %uint %14093 1\n      %15617 = OpExtInst %v2float %1 UnpackHalf2x16 %7617\n       %8872 = OpCompositeExtract %float %15617 0\n       %7618 = OpCompositeExtract %uint %14093 2\n      %15618 = OpExtInst %v2float %1 UnpackHalf2x16 %7618\n       %8873 = OpCompositeExtract %float %15618 0\n       %7619 = OpCompositeExtract %uint %14093 3\n      %15592 = OpExtInst %v2float %1 UnpackHalf2x16 %7619\n      %10277 = OpCompositeExtract %float %15592 0\n      %24252 = OpCompositeConstruct %v4float %8870 %8872 %8873 %10277\n      %17277 = OpCompositeExtract %uint %11213 0\n      %18030 = OpExtInst %v2float %1 UnpackHalf2x16 %17277\n       %8874 = OpCompositeExtract %float %18030 0\n       %7620 = OpCompositeExtract %uint %11213 1\n      %15619 = OpExtInst %v2float %1 UnpackHalf2x16 %7620\n       %8875 = OpCompositeExtract %float %15619 0\n       %7621 = OpCompositeExtract %uint %11213 2\n      %15620 = OpExtInst %v2float %1 UnpackHalf2x16 %7621\n       %8876 = OpCompositeExtract %float %15620 0\n       %7622 = OpCompositeExtract %uint %11213 3\n      %15593 = OpExtInst %v2float %1 UnpackHalf2x16 %7622\n      %13469 = OpCompositeExtract %float %15593 0\n      %18681 = OpCompositeConstruct %v4float %8874 %8875 %8876 %13469\n               OpBranch %23463\n      %21193 = OpLabel\n      %24823 = OpBitcast %v4int %14093\n      %22561 = OpShiftLeftLogical %v4int %24823 %770\n      %16542 = OpShiftRightArithmetic %v4int %22561 %770\n      %10913 = OpConvertSToF %v4float %16542\n      %19067 = OpVectorTimesScalar %v4float %10913 %float_0_000976592302\n      %18819 = OpExtInst %v4float %1 FMax %1284 %19067\n      %10216 = OpBitcast %v4int %11213\n       %8612 = OpShiftLeftLogical %v4int %10216 %770\n      %16543 = OpShiftRightArithmetic %v4int %8612 %770\n      %10914 = OpConvertSToF %v4float %16543\n      %21442 = OpVectorTimesScalar %v4float %10914 %float_0_000976592302\n      %17253 = OpExtInst %v4float %1 FMax %1284 %21442\n               OpBranch %23463\n      %12526 = OpLabel\n      %19234 = OpBitcast %v4float %14093\n      %14517 = OpBitcast %v4float %11213\n               OpBranch %23463\n      %23463 = OpLabel\n      %11254 = OpPhi %v4float %14517 %12526 %17253 %21193 %18681 %8246\n      %13713 = OpPhi %v4float %19234 %12526 %18819 %21193 %24252 %8246\n               OpBranch %21264\n      %21264 = OpLabel\n       %8971 = OpPhi %v4float %11254 %23463 %11253 %23462\n      %19594 = OpPhi %v4float %13713 %23463 %13712 %23462\n      %18096 = OpFAdd %v4float %14051 %19594\n      %17754 = OpFAdd %v4float %9826 %8971\n      %14461 = OpUGreaterThanEqual %bool %16205 %uint_6\n               OpSelectionMerge %24278 DontFlatten\n               OpBranchConditional %14461 %9905 %24278\n       %9905 = OpLabel\n      %14258 = OpShiftLeftLogical %uint %uint_4 %9130\n      %12090 = OpFMul %float %11052 %float_0_25\n      %20988 = OpIAdd %uint %24188 %14258\n               OpSelectionMerge %20261 DontFlatten\n               OpBranchConditional %24753 %6593 %8961\n       %8961 = OpLabel\n      %22066 = OpShiftRightLogical %uint %20988 %int_2\n      %13373 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22066\n      %15062 = OpLoad %uint %13373\n       %8519 = OpIAdd %uint %20988 %12535\n      %21672 = OpShiftRightLogical %uint %8519 %int_2\n      %19687 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21672\n      %13124 = OpLoad %uint %19687\n       %8695 = OpIMul %uint %uint_2 %12535\n      %24265 = OpIAdd %uint %20988 %8695\n      %17902 = OpShiftRightLogical %uint %24265 %int_2\n      %19688 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17902\n      %13125 = OpLoad %uint %19688\n       %8696 = OpIMul %uint %uint_3 %12535\n      %24266 = OpIAdd %uint %20988 %8696\n      %17903 = OpShiftRightLogical %uint %24266 %int_2\n      %18693 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17903\n      %22188 = OpLoad %uint %18693\n      %19672 = OpCompositeConstruct %v4uint %15062 %13124 %13125 %22188\n      %19501 = OpIMul %uint %uint_4 %12535\n      %10823 = OpIAdd %uint %20988 %19501\n      %17904 = OpShiftRightLogical %uint %10823 %int_2\n      %19689 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17904\n      %13126 = OpLoad %uint %19689\n       %8697 = OpIMul %uint %uint_5 %12535\n      %24267 = OpIAdd %uint %20988 %8697\n      %17905 = OpShiftRightLogical %uint %24267 %int_2\n      %19690 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17905\n      %13127 = OpLoad %uint %19690\n       %8698 = OpIMul %uint %uint_6 %12535\n      %24268 = OpIAdd %uint %20988 %8698\n      %17906 = OpShiftRightLogical %uint %24268 %int_2\n      %19691 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17906\n      %13128 = OpLoad %uint %19691\n       %8699 = OpIMul %uint %uint_7 %12535\n      %24269 = OpIAdd %uint %20988 %8699\n      %17907 = OpShiftRightLogical %uint %24269 %int_2\n      %18694 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17907\n      %24412 = OpLoad %uint %18694\n      %20784 = OpCompositeConstruct %v4uint %13126 %13127 %13128 %24412\n               OpBranch %20261\n       %6593 = OpLabel\n      %24488 = OpShiftRightLogical %uint %20988 %int_2\n      %13374 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24488\n      %12613 = OpLoad %uint %13374\n      %11699 = OpIAdd %uint %24488 %uint_1\n       %6407 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11699\n      %23658 = OpLoad %uint %6407\n      %11700 = OpIAdd %uint %24488 %uint_2\n       %6408 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11700\n      %23659 = OpLoad %uint %6408\n      %11701 = OpIAdd %uint %24488 %uint_3\n      %24562 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11701\n      %14082 = OpLoad %uint %24562\n      %21618 = OpCompositeConstruct %v4uint %12613 %23658 %23659 %14082\n      %19333 = OpIAdd %uint %20988 %uint_16\n       %8239 = OpShiftRightLogical %uint %19333 %int_2\n      %19603 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %8239\n      %12614 = OpLoad %uint %19603\n      %11702 = OpIAdd %uint %8239 %uint_1\n       %6409 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11702\n      %23660 = OpLoad %uint %6409\n      %11703 = OpIAdd %uint %8239 %uint_2\n       %6410 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11703\n      %23661 = OpLoad %uint %6410\n      %11704 = OpIAdd %uint %8239 %uint_3\n      %24563 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11704\n      %16381 = OpLoad %uint %24563\n      %20785 = OpCompositeConstruct %v4uint %12614 %23660 %23661 %16381\n               OpBranch %20261\n      %20261 = OpLabel\n      %11214 = OpPhi %v4uint %20785 %6593 %20784 %8961\n      %14094 = OpPhi %v4uint %21618 %6593 %19672 %8961\n               OpSelectionMerge %21265 DontFlatten\n               OpBranchConditional %17369 %21033 %22401\n      %22401 = OpLabel\n               OpSelectionMerge %23464 None\n               OpSwitch %8576 %24628 0 %16007 1 %16007 2 %14404 10 %14404 3 %22977 12 %22977 4 %21194 6 %8247\n       %8247 = OpLabel\n      %24413 = OpCompositeExtract %uint %14094 0\n      %24683 = OpExtInst %v2float %1 UnpackHalf2x16 %24413\n       %8877 = OpCompositeExtract %float %24683 0\n       %7623 = OpCompositeExtract %uint %14094 1\n      %15621 = OpExtInst %v2float %1 UnpackHalf2x16 %7623\n       %8878 = OpCompositeExtract %float %15621 0\n       %7624 = OpCompositeExtract %uint %14094 2\n      %15622 = OpExtInst %v2float %1 UnpackHalf2x16 %7624\n       %8879 = OpCompositeExtract %float %15622 0\n       %7625 = OpCompositeExtract %uint %14094 3\n      %15594 = OpExtInst %v2float %1 UnpackHalf2x16 %7625\n      %10278 = OpCompositeExtract %float %15594 0\n      %24253 = OpCompositeConstruct %v4float %8877 %8878 %8879 %10278\n      %17278 = OpCompositeExtract %uint %11214 0\n      %18031 = OpExtInst %v2float %1 UnpackHalf2x16 %17278\n       %8880 = OpCompositeExtract %float %18031 0\n       %7626 = OpCompositeExtract %uint %11214 1\n      %15623 = OpExtInst %v2float %1 UnpackHalf2x16 %7626\n       %8881 = OpCompositeExtract %float %15623 0\n       %7627 = OpCompositeExtract %uint %11214 2\n      %15624 = OpExtInst %v2float %1 UnpackHalf2x16 %7627\n       %8882 = OpCompositeExtract %float %15624 0\n       %7628 = OpCompositeExtract %uint %11214 3\n      %15595 = OpExtInst %v2float %1 UnpackHalf2x16 %7628\n      %13470 = OpCompositeExtract %float %15595 0\n      %18682 = OpCompositeConstruct %v4float %8880 %8881 %8882 %13470\n               OpBranch %23464\n      %21194 = OpLabel\n      %24824 = OpBitcast %v4int %14094\n      %22562 = OpShiftLeftLogical %v4int %24824 %770\n      %16544 = OpShiftRightArithmetic %v4int %22562 %770\n      %10915 = OpConvertSToF %v4float %16544\n      %19068 = OpVectorTimesScalar %v4float %10915 %float_0_000976592302\n      %18820 = OpExtInst %v4float %1 FMax %1284 %19068\n      %10217 = OpBitcast %v4int %11214\n       %8613 = OpShiftLeftLogical %v4int %10217 %770\n      %16545 = OpShiftRightArithmetic %v4int %8613 %770\n      %10916 = OpConvertSToF %v4float %16545\n      %21443 = OpVectorTimesScalar %v4float %10916 %float_0_000976592302\n      %17254 = OpExtInst %v4float %1 FMax %1284 %21443\n               OpBranch %23464\n      %22977 = OpLabel\n      %19468 = OpSelect %uint %7475 %uint_20 %uint_0\n       %9142 = OpCompositeConstruct %v4uint %19468 %19468 %19468 %19468\n      %23882 = OpShiftRightLogical %v4uint %14094 %9142\n      %24040 = OpBitwiseAnd %v4uint %23882 %929\n      %18592 = OpBitwiseAnd %v4uint %23882 %721\n      %23444 = OpShiftRightLogical %v4uint %24040 %263\n      %16589 = OpIEqual %v4bool %23444 %2896\n      %11343 = OpExtInst %v4int %1 FindUMsb %18592\n      %10777 = OpBitcast %v4uint %11343\n       %6270 = OpISub %v4uint %263 %10777\n       %8724 = OpIAdd %v4uint %10777 %2575\n      %10355 = OpSelect %v4uint %16589 %8724 %23444\n      %23256 = OpShiftLeftLogical %v4uint %18592 %6270\n      %18846 = OpBitwiseAnd %v4uint %23256 %721\n      %10917 = OpSelect %v4uint %16589 %18846 %18592\n      %24573 = OpIAdd %v4uint %10355 %559\n      %20355 = OpShiftLeftLogical %v4uint %24573 %1127\n      %16298 = OpShiftLeftLogical %v4uint %10917 %749\n      %22402 = OpBitwiseOr %v4uint %20355 %16298\n      %13828 = OpIEqual %v4bool %24040 %2896\n      %16964 = OpSelect %v4uint %13828 %2896 %22402\n      %12358 = OpBitcast %v4float %16964\n      %24640 = OpShiftRightLogical %v4uint %11214 %9142\n      %14627 = OpBitwiseAnd %v4uint %24640 %929\n      %18593 = OpBitwiseAnd %v4uint %24640 %721\n      %23445 = OpShiftRightLogical %v4uint %14627 %263\n      %16590 = OpIEqual %v4bool %23445 %2896\n      %11344 = OpExtInst %v4int %1 FindUMsb %18593\n      %10778 = OpBitcast %v4uint %11344\n       %6271 = OpISub %v4uint %263 %10778\n       %8725 = OpIAdd %v4uint %10778 %2575\n      %10356 = OpSelect %v4uint %16590 %8725 %23445\n      %23257 = OpShiftLeftLogical %v4uint %18593 %6271\n      %18847 = OpBitwiseAnd %v4uint %23257 %721\n      %10918 = OpSelect %v4uint %16590 %18847 %18593\n      %24574 = OpIAdd %v4uint %10356 %559\n      %20356 = OpShiftLeftLogical %v4uint %24574 %1127\n      %16299 = OpShiftLeftLogical %v4uint %10918 %749\n      %22403 = OpBitwiseOr %v4uint %20356 %16299\n      %13829 = OpIEqual %v4bool %14627 %2896\n      %18009 = OpSelect %v4uint %13829 %2896 %22403\n      %22845 = OpBitcast %v4float %18009\n               OpBranch %23464\n      %14404 = OpLabel\n      %19469 = OpSelect %uint %7475 %uint_20 %uint_0\n       %9143 = OpCompositeConstruct %v4uint %19469 %19469 %19469 %19469\n      %22231 = OpShiftRightLogical %v4uint %14094 %9143\n      %19034 = OpBitwiseAnd %v4uint %22231 %929\n      %16137 = OpConvertUToF %v4float %19034\n      %21022 = OpVectorTimesScalar %v4float %16137 %float_0_000977517106\n       %7750 = OpShiftRightLogical %v4uint %11214 %9143\n      %11224 = OpBitwiseAnd %v4uint %7750 %929\n      %17182 = OpConvertUToF %v4float %11224\n      %12438 = OpVectorTimesScalar %v4float %17182 %float_0_000977517106\n               OpBranch %23464\n      %16007 = OpLabel\n      %19470 = OpSelect %uint %7475 %uint_16 %uint_0\n       %9144 = OpCompositeConstruct %v4uint %19470 %19470 %19470 %19470\n      %22232 = OpShiftRightLogical %v4uint %14094 %9144\n      %19035 = OpBitwiseAnd %v4uint %22232 %1611\n      %16138 = OpConvertUToF %v4float %19035\n      %21023 = OpVectorTimesScalar %v4float %16138 %float_0_00392156886\n       %7751 = OpShiftRightLogical %v4uint %11214 %9144\n      %11225 = OpBitwiseAnd %v4uint %7751 %1611\n      %17183 = OpConvertUToF %v4float %11225\n      %12439 = OpVectorTimesScalar %v4float %17183 %float_0_00392156886\n               OpBranch %23464\n      %24628 = OpLabel\n      %19235 = OpBitcast %v4float %14094\n      %14518 = OpBitcast %v4float %11214\n               OpBranch %23464\n      %23464 = OpLabel\n      %11255 = OpPhi %v4float %14518 %24628 %12439 %16007 %12438 %14404 %22845 %22977 %17254 %21194 %18682 %8247\n      %13714 = OpPhi %v4float %19235 %24628 %21023 %16007 %21022 %14404 %12358 %22977 %18820 %21194 %24253 %8247\n               OpBranch %21265\n      %21033 = OpLabel\n               OpSelectionMerge %23465 None\n               OpSwitch %8576 %12527 5 %21195 7 %8248\n       %8248 = OpLabel\n      %24414 = OpCompositeExtract %uint %14094 0\n      %24684 = OpExtInst %v2float %1 UnpackHalf2x16 %24414\n       %8883 = OpCompositeExtract %float %24684 0\n       %7629 = OpCompositeExtract %uint %14094 1\n      %15625 = OpExtInst %v2float %1 UnpackHalf2x16 %7629\n       %8884 = OpCompositeExtract %float %15625 0\n       %7630 = OpCompositeExtract %uint %14094 2\n      %15626 = OpExtInst %v2float %1 UnpackHalf2x16 %7630\n       %8885 = OpCompositeExtract %float %15626 0\n       %7631 = OpCompositeExtract %uint %14094 3\n      %15596 = OpExtInst %v2float %1 UnpackHalf2x16 %7631\n      %10279 = OpCompositeExtract %float %15596 0\n      %24270 = OpCompositeConstruct %v4float %8883 %8884 %8885 %10279\n      %17279 = OpCompositeExtract %uint %11214 0\n      %18032 = OpExtInst %v2float %1 UnpackHalf2x16 %17279\n       %8886 = OpCompositeExtract %float %18032 0\n       %7632 = OpCompositeExtract %uint %11214 1\n      %15628 = OpExtInst %v2float %1 UnpackHalf2x16 %7632\n       %8887 = OpCompositeExtract %float %15628 0\n       %7633 = OpCompositeExtract %uint %11214 2\n      %15629 = OpExtInst %v2float %1 UnpackHalf2x16 %7633\n       %8888 = OpCompositeExtract %float %15629 0\n       %7634 = OpCompositeExtract %uint %11214 3\n      %15597 = OpExtInst %v2float %1 UnpackHalf2x16 %7634\n      %13471 = OpCompositeExtract %float %15597 0\n      %18683 = OpCompositeConstruct %v4float %8886 %8887 %8888 %13471\n               OpBranch %23465\n      %21195 = OpLabel\n      %24825 = OpBitcast %v4int %14094\n      %22563 = OpShiftLeftLogical %v4int %24825 %770\n      %16546 = OpShiftRightArithmetic %v4int %22563 %770\n      %10919 = OpConvertSToF %v4float %16546\n      %19069 = OpVectorTimesScalar %v4float %10919 %float_0_000976592302\n      %18821 = OpExtInst %v4float %1 FMax %1284 %19069\n      %10218 = OpBitcast %v4int %11214\n       %8614 = OpShiftLeftLogical %v4int %10218 %770\n      %16547 = OpShiftRightArithmetic %v4int %8614 %770\n      %10920 = OpConvertSToF %v4float %16547\n      %21444 = OpVectorTimesScalar %v4float %10920 %float_0_000976592302\n      %17255 = OpExtInst %v4float %1 FMax %1284 %21444\n               OpBranch %23465\n      %12527 = OpLabel\n      %19236 = OpBitcast %v4float %14094\n      %14519 = OpBitcast %v4float %11214\n               OpBranch %23465\n      %23465 = OpLabel\n      %11256 = OpPhi %v4float %14519 %12527 %17255 %21195 %18683 %8248\n      %13715 = OpPhi %v4float %19236 %12527 %18821 %21195 %24270 %8248\n               OpBranch %21265\n      %21265 = OpLabel\n       %8972 = OpPhi %v4float %11256 %23465 %11255 %23464\n      %19595 = OpPhi %v4float %13715 %23465 %13714 %23464\n      %17222 = OpFAdd %v4float %18096 %19595\n       %6641 = OpFAdd %v4float %17754 %8972\n      %16376 = OpIAdd %uint %24184 %14258\n               OpSelectionMerge %20262 DontFlatten\n               OpBranchConditional %24753 %6594 %8962\n       %8962 = OpLabel\n      %22067 = OpShiftRightLogical %uint %16376 %int_2\n      %13375 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22067\n      %15063 = OpLoad %uint %13375\n       %8520 = OpIAdd %uint %16376 %12535\n      %21673 = OpShiftRightLogical %uint %8520 %int_2\n      %19692 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21673\n      %13129 = OpLoad %uint %19692\n       %8700 = OpIMul %uint %uint_2 %12535\n      %24271 = OpIAdd %uint %16376 %8700\n      %17908 = OpShiftRightLogical %uint %24271 %int_2\n      %19693 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17908\n      %13130 = OpLoad %uint %19693\n       %8701 = OpIMul %uint %uint_3 %12535\n      %24272 = OpIAdd %uint %16376 %8701\n      %17909 = OpShiftRightLogical %uint %24272 %int_2\n      %18695 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17909\n      %22189 = OpLoad %uint %18695\n      %19673 = OpCompositeConstruct %v4uint %15063 %13129 %13130 %22189\n      %19502 = OpIMul %uint %uint_4 %12535\n      %10824 = OpIAdd %uint %16376 %19502\n      %17910 = OpShiftRightLogical %uint %10824 %int_2\n      %19694 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17910\n      %13131 = OpLoad %uint %19694\n       %8702 = OpIMul %uint %uint_5 %12535\n      %24273 = OpIAdd %uint %16376 %8702\n      %17911 = OpShiftRightLogical %uint %24273 %int_2\n      %19695 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17911\n      %13132 = OpLoad %uint %19695\n       %8703 = OpIMul %uint %uint_6 %12535\n      %24274 = OpIAdd %uint %16376 %8703\n      %17912 = OpShiftRightLogical %uint %24274 %int_2\n      %19696 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17912\n      %13133 = OpLoad %uint %19696\n       %8704 = OpIMul %uint %uint_7 %12535\n      %24275 = OpIAdd %uint %16376 %8704\n      %17913 = OpShiftRightLogical %uint %24275 %int_2\n      %18696 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17913\n      %24415 = OpLoad %uint %18696\n      %20786 = OpCompositeConstruct %v4uint %13131 %13132 %13133 %24415\n               OpBranch %20262\n       %6594 = OpLabel\n      %24489 = OpShiftRightLogical %uint %16376 %int_2\n      %13376 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24489\n      %12615 = OpLoad %uint %13376\n      %11705 = OpIAdd %uint %24489 %uint_1\n       %6411 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11705\n      %23662 = OpLoad %uint %6411\n      %11706 = OpIAdd %uint %24489 %uint_2\n       %6412 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11706\n      %23663 = OpLoad %uint %6412\n      %11707 = OpIAdd %uint %24489 %uint_3\n      %24564 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11707\n      %14083 = OpLoad %uint %24564\n      %21619 = OpCompositeConstruct %v4uint %12615 %23662 %23663 %14083\n      %19334 = OpIAdd %uint %16376 %uint_16\n       %8240 = OpShiftRightLogical %uint %19334 %int_2\n      %19604 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %8240\n      %12616 = OpLoad %uint %19604\n      %11708 = OpIAdd %uint %8240 %uint_1\n       %6413 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11708\n      %23664 = OpLoad %uint %6413\n      %11709 = OpIAdd %uint %8240 %uint_2\n       %6414 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11709\n      %23665 = OpLoad %uint %6414\n      %11710 = OpIAdd %uint %8240 %uint_3\n      %24565 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11710\n      %16382 = OpLoad %uint %24565\n      %20787 = OpCompositeConstruct %v4uint %12616 %23664 %23665 %16382\n               OpBranch %20262\n      %20262 = OpLabel\n      %11215 = OpPhi %v4uint %20787 %6594 %20786 %8962\n      %14095 = OpPhi %v4uint %21619 %6594 %19673 %8962\n               OpSelectionMerge %21266 DontFlatten\n               OpBranchConditional %17369 %21034 %22404\n      %22404 = OpLabel\n               OpSelectionMerge %23466 None\n               OpSwitch %8576 %24629 0 %16008 1 %16008 2 %14405 10 %14405 3 %22978 12 %22978 4 %21196 6 %8249\n       %8249 = OpLabel\n      %24416 = OpCompositeExtract %uint %14095 0\n      %24685 = OpExtInst %v2float %1 UnpackHalf2x16 %24416\n       %8889 = OpCompositeExtract %float %24685 0\n       %7635 = OpCompositeExtract %uint %14095 1\n      %15630 = OpExtInst %v2float %1 UnpackHalf2x16 %7635\n       %8890 = OpCompositeExtract %float %15630 0\n       %7636 = OpCompositeExtract %uint %14095 2\n      %15631 = OpExtInst %v2float %1 UnpackHalf2x16 %7636\n       %8891 = OpCompositeExtract %float %15631 0\n       %7637 = OpCompositeExtract %uint %14095 3\n      %15598 = OpExtInst %v2float %1 UnpackHalf2x16 %7637\n      %10280 = OpCompositeExtract %float %15598 0\n      %24276 = OpCompositeConstruct %v4float %8889 %8890 %8891 %10280\n      %17280 = OpCompositeExtract %uint %11215 0\n      %18033 = OpExtInst %v2float %1 UnpackHalf2x16 %17280\n       %8892 = OpCompositeExtract %float %18033 0\n       %7638 = OpCompositeExtract %uint %11215 1\n      %15632 = OpExtInst %v2float %1 UnpackHalf2x16 %7638\n       %8893 = OpCompositeExtract %float %15632 0\n       %7639 = OpCompositeExtract %uint %11215 2\n      %15633 = OpExtInst %v2float %1 UnpackHalf2x16 %7639\n       %8894 = OpCompositeExtract %float %15633 0\n       %7640 = OpCompositeExtract %uint %11215 3\n      %15599 = OpExtInst %v2float %1 UnpackHalf2x16 %7640\n      %13472 = OpCompositeExtract %float %15599 0\n      %18684 = OpCompositeConstruct %v4float %8892 %8893 %8894 %13472\n               OpBranch %23466\n      %21196 = OpLabel\n      %24826 = OpBitcast %v4int %14095\n      %22564 = OpShiftLeftLogical %v4int %24826 %770\n      %16548 = OpShiftRightArithmetic %v4int %22564 %770\n      %10921 = OpConvertSToF %v4float %16548\n      %19070 = OpVectorTimesScalar %v4float %10921 %float_0_000976592302\n      %18822 = OpExtInst %v4float %1 FMax %1284 %19070\n      %10219 = OpBitcast %v4int %11215\n       %8615 = OpShiftLeftLogical %v4int %10219 %770\n      %16549 = OpShiftRightArithmetic %v4int %8615 %770\n      %10922 = OpConvertSToF %v4float %16549\n      %21445 = OpVectorTimesScalar %v4float %10922 %float_0_000976592302\n      %17256 = OpExtInst %v4float %1 FMax %1284 %21445\n               OpBranch %23466\n      %22978 = OpLabel\n      %19471 = OpSelect %uint %7475 %uint_20 %uint_0\n       %9145 = OpCompositeConstruct %v4uint %19471 %19471 %19471 %19471\n      %23883 = OpShiftRightLogical %v4uint %14095 %9145\n      %24041 = OpBitwiseAnd %v4uint %23883 %929\n      %18594 = OpBitwiseAnd %v4uint %23883 %721\n      %23446 = OpShiftRightLogical %v4uint %24041 %263\n      %16591 = OpIEqual %v4bool %23446 %2896\n      %11345 = OpExtInst %v4int %1 FindUMsb %18594\n      %10779 = OpBitcast %v4uint %11345\n       %6272 = OpISub %v4uint %263 %10779\n       %8726 = OpIAdd %v4uint %10779 %2575\n      %10357 = OpSelect %v4uint %16591 %8726 %23446\n      %23258 = OpShiftLeftLogical %v4uint %18594 %6272\n      %18848 = OpBitwiseAnd %v4uint %23258 %721\n      %10923 = OpSelect %v4uint %16591 %18848 %18594\n      %24575 = OpIAdd %v4uint %10357 %559\n      %20357 = OpShiftLeftLogical %v4uint %24575 %1127\n      %16300 = OpShiftLeftLogical %v4uint %10923 %749\n      %22405 = OpBitwiseOr %v4uint %20357 %16300\n      %13830 = OpIEqual %v4bool %24041 %2896\n      %16965 = OpSelect %v4uint %13830 %2896 %22405\n      %12359 = OpBitcast %v4float %16965\n      %24641 = OpShiftRightLogical %v4uint %11215 %9145\n      %14628 = OpBitwiseAnd %v4uint %24641 %929\n      %18595 = OpBitwiseAnd %v4uint %24641 %721\n      %23447 = OpShiftRightLogical %v4uint %14628 %263\n      %16592 = OpIEqual %v4bool %23447 %2896\n      %11346 = OpExtInst %v4int %1 FindUMsb %18595\n      %10780 = OpBitcast %v4uint %11346\n       %6273 = OpISub %v4uint %263 %10780\n       %8727 = OpIAdd %v4uint %10780 %2575\n      %10358 = OpSelect %v4uint %16592 %8727 %23447\n      %23259 = OpShiftLeftLogical %v4uint %18595 %6273\n      %18849 = OpBitwiseAnd %v4uint %23259 %721\n      %10925 = OpSelect %v4uint %16592 %18849 %18595\n      %24576 = OpIAdd %v4uint %10358 %559\n      %20358 = OpShiftLeftLogical %v4uint %24576 %1127\n      %16301 = OpShiftLeftLogical %v4uint %10925 %749\n      %22406 = OpBitwiseOr %v4uint %20358 %16301\n      %13831 = OpIEqual %v4bool %14628 %2896\n      %18010 = OpSelect %v4uint %13831 %2896 %22406\n      %22846 = OpBitcast %v4float %18010\n               OpBranch %23466\n      %14405 = OpLabel\n      %19472 = OpSelect %uint %7475 %uint_20 %uint_0\n       %9146 = OpCompositeConstruct %v4uint %19472 %19472 %19472 %19472\n      %22233 = OpShiftRightLogical %v4uint %14095 %9146\n      %19036 = OpBitwiseAnd %v4uint %22233 %929\n      %16139 = OpConvertUToF %v4float %19036\n      %21024 = OpVectorTimesScalar %v4float %16139 %float_0_000977517106\n       %7752 = OpShiftRightLogical %v4uint %11215 %9146\n      %11226 = OpBitwiseAnd %v4uint %7752 %929\n      %17184 = OpConvertUToF %v4float %11226\n      %12440 = OpVectorTimesScalar %v4float %17184 %float_0_000977517106\n               OpBranch %23466\n      %16008 = OpLabel\n      %19473 = OpSelect %uint %7475 %uint_16 %uint_0\n       %9147 = OpCompositeConstruct %v4uint %19473 %19473 %19473 %19473\n      %22234 = OpShiftRightLogical %v4uint %14095 %9147\n      %19037 = OpBitwiseAnd %v4uint %22234 %1611\n      %16140 = OpConvertUToF %v4float %19037\n      %21025 = OpVectorTimesScalar %v4float %16140 %float_0_00392156886\n       %7753 = OpShiftRightLogical %v4uint %11215 %9147\n      %11227 = OpBitwiseAnd %v4uint %7753 %1611\n      %17185 = OpConvertUToF %v4float %11227\n      %12441 = OpVectorTimesScalar %v4float %17185 %float_0_00392156886\n               OpBranch %23466\n      %24629 = OpLabel\n      %19237 = OpBitcast %v4float %14095\n      %14520 = OpBitcast %v4float %11215\n               OpBranch %23466\n      %23466 = OpLabel\n      %11257 = OpPhi %v4float %14520 %24629 %12441 %16008 %12440 %14405 %22846 %22978 %17256 %21196 %18684 %8249\n      %13716 = OpPhi %v4float %19237 %24629 %21025 %16008 %21024 %14405 %12359 %22978 %18822 %21196 %24276 %8249\n               OpBranch %21266\n      %21034 = OpLabel\n               OpSelectionMerge %23467 None\n               OpSwitch %8576 %12528 5 %21197 7 %8250\n       %8250 = OpLabel\n      %24417 = OpCompositeExtract %uint %14095 0\n      %24686 = OpExtInst %v2float %1 UnpackHalf2x16 %24417\n       %8895 = OpCompositeExtract %float %24686 0\n       %7641 = OpCompositeExtract %uint %14095 1\n      %15634 = OpExtInst %v2float %1 UnpackHalf2x16 %7641\n       %8896 = OpCompositeExtract %float %15634 0\n       %7642 = OpCompositeExtract %uint %14095 2\n      %15635 = OpExtInst %v2float %1 UnpackHalf2x16 %7642\n       %8897 = OpCompositeExtract %float %15635 0\n       %7643 = OpCompositeExtract %uint %14095 3\n      %15600 = OpExtInst %v2float %1 UnpackHalf2x16 %7643\n      %10281 = OpCompositeExtract %float %15600 0\n      %24277 = OpCompositeConstruct %v4float %8895 %8896 %8897 %10281\n      %17281 = OpCompositeExtract %uint %11215 0\n      %18034 = OpExtInst %v2float %1 UnpackHalf2x16 %17281\n       %8898 = OpCompositeExtract %float %18034 0\n       %7644 = OpCompositeExtract %uint %11215 1\n      %15636 = OpExtInst %v2float %1 UnpackHalf2x16 %7644\n       %8899 = OpCompositeExtract %float %15636 0\n       %7645 = OpCompositeExtract %uint %11215 2\n      %15637 = OpExtInst %v2float %1 UnpackHalf2x16 %7645\n       %8900 = OpCompositeExtract %float %15637 0\n       %7646 = OpCompositeExtract %uint %11215 3\n      %15601 = OpExtInst %v2float %1 UnpackHalf2x16 %7646\n      %13473 = OpCompositeExtract %float %15601 0\n      %18685 = OpCompositeConstruct %v4float %8898 %8899 %8900 %13473\n               OpBranch %23467\n      %21197 = OpLabel\n      %24827 = OpBitcast %v4int %14095\n      %22565 = OpShiftLeftLogical %v4int %24827 %770\n      %16550 = OpShiftRightArithmetic %v4int %22565 %770\n      %10926 = OpConvertSToF %v4float %16550\n      %19071 = OpVectorTimesScalar %v4float %10926 %float_0_000976592302\n      %18823 = OpExtInst %v4float %1 FMax %1284 %19071\n      %10220 = OpBitcast %v4int %11215\n       %8616 = OpShiftLeftLogical %v4int %10220 %770\n      %16551 = OpShiftRightArithmetic %v4int %8616 %770\n      %10927 = OpConvertSToF %v4float %16551\n      %21446 = OpVectorTimesScalar %v4float %10927 %float_0_000976592302\n      %17257 = OpExtInst %v4float %1 FMax %1284 %21446\n               OpBranch %23467\n      %12528 = OpLabel\n      %19238 = OpBitcast %v4float %14095\n      %14521 = OpBitcast %v4float %11215\n               OpBranch %23467\n      %23467 = OpLabel\n      %11258 = OpPhi %v4float %14521 %12528 %17257 %21197 %18685 %8250\n      %13717 = OpPhi %v4float %19238 %12528 %18823 %21197 %24277 %8250\n               OpBranch %21266\n      %21266 = OpLabel\n       %8973 = OpPhi %v4float %11258 %23467 %11257 %23466\n      %19596 = OpPhi %v4float %13717 %23467 %13716 %23466\n      %19521 = OpFAdd %v4float %17222 %19596\n      %23869 = OpFAdd %v4float %6641 %8973\n               OpBranch %24278\n      %24278 = OpLabel\n      %11175 = OpPhi %v4float %17754 %21264 %23869 %21266\n      %14420 = OpPhi %v4float %18096 %21264 %19521 %21266\n      %14522 = OpPhi %float %25083 %21264 %12090 %21266\n               OpBranch %21267\n      %21267 = OpLabel\n      %11176 = OpPhi %v4float %9826 %21263 %11175 %24278\n      %12387 = OpPhi %v4float %14051 %21263 %14420 %24278\n      %11944 = OpPhi %float %11052 %21263 %14522 %24278\n      %23688 = OpVectorTimesScalar %v4float %12387 %11944\n      %21344 = OpVectorTimesScalar %v4float %11176 %11944\n       %7176 = OpIEqual %bool %24498 %uint_0\n      %13431 = OpSelect %bool %7176 %false %7176\n               OpSelectionMerge %19649 DontFlatten\n               OpBranchConditional %13431 %9760 %19649\n       %9760 = OpLabel\n      %20482 = OpCompositeExtract %float %23688 1\n      %14335 = OpCompositeInsert %v4float %20482 %23688 0\n               OpBranch %19649\n      %19649 = OpLabel\n      %12383 = OpPhi %v4float %23688 %21267 %14335 %9760\n      %12967 = OpIAdd %v2uint %9840 %23020\n               OpSelectionMerge %21237 DontFlatten\n               OpBranchConditional %18667 %10574 %21373\n      %21373 = OpLabel\n      %10608 = OpBitcast %v2int %12967\n      %17914 = OpCompositeExtract %int %10608 1\n      %19904 = OpShiftRightArithmetic %int %17914 %int_5\n      %22407 = OpBitcast %int %8444\n       %7938 = OpIMul %int %19904 %22407\n      %25154 = OpCompositeExtract %int %10608 0\n      %20423 = OpShiftRightArithmetic %int %25154 %int_5\n      %18864 = OpIAdd %int %7938 %20423\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %17914 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25154 %int_7\n       %9666 = OpBitwiseOr %int %21322 %20133\n      %10719 = OpBitwiseOr %int %9546 %9666\n      %10244 = OpBitcast %int %10719\n      %19580 = OpShiftRightArithmetic %int %17914 %int_4\n      %15163 = OpBitwiseAnd %int %19580 %int_1\n      %10406 = OpShiftRightArithmetic %int %25154 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %17914 %int_3\n      %20574 = OpBitwiseAnd %int %10425 %int_1\n      %21533 = OpShiftLeftLogical %int %20574 %int_1\n       %8901 = OpBitwiseXor %int %20766 %21533\n      %20598 = OpBitwiseAnd %int %17914 %int_1\n      %21035 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8901 %int_6\n      %18430 = OpBitwiseOr %int %21035 %6551\n       %7168 = OpShiftLeftLogical %int %15163 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %10244 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %10244 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %10244 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %10244 %int_8\n      %10282 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10282\n      %16869 = OpBitcast %uint %15225\n               OpBranch %21237\n      %10574 = OpLabel\n      %19866 = OpCompositeExtract %uint %12967 0\n      %11267 = OpCompositeExtract %uint %12967 1\n       %8414 = OpCompositeConstruct %v3uint %19866 %11267 %17416\n      %20125 = OpBitcast %v3int %8414\n      %11259 = OpCompositeExtract %int %20125 2\n      %19905 = OpShiftRightArithmetic %int %11259 %int_2\n      %22408 = OpBitcast %int %25203\n       %7939 = OpIMul %int %19905 %22408\n      %25155 = OpCompositeExtract %int %20125 1\n      %19055 = OpShiftRightArithmetic %int %25155 %int_4\n      %11053 = OpIAdd %int %7939 %19055\n      %16898 = OpBitcast %int %8444\n      %14944 = OpIMul %int %11053 %16898\n      %25156 = OpCompositeExtract %int %20125 0\n      %20424 = OpShiftRightArithmetic %int %25156 %int_5\n      %18940 = OpIAdd %int %14944 %20424\n       %8797 = OpShiftLeftLogical %int %18940 %int_7\n      %11434 = OpBitwiseAnd %int %11259 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %25155 %int_1\n      %21364 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21364 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %25156 %int_7\n      %13701 = OpBitwiseOr %int %17102 %20693\n      %10720 = OpBitwiseOr %int %8797 %13701\n      %10225 = OpBitcast %int %10720\n      %19829 = OpShiftRightArithmetic %int %25155 %int_3\n      %22588 = OpBitwiseXor %int %19829 %19905\n      %16793 = OpBitwiseAnd %int %22588 %int_1\n       %9616 = OpShiftRightArithmetic %int %25156 %int_3\n      %20575 = OpBitwiseAnd %int %9616 %int_3\n      %21534 = OpShiftLeftLogical %int %16793 %int_1\n       %8902 = OpBitwiseXor %int %20575 %21534\n      %20599 = OpBitwiseAnd %int %25155 %int_1\n      %21037 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8902 %int_6\n      %18431 = OpBitwiseOr %int %21037 %6552\n       %7169 = OpShiftLeftLogical %int %16793 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %10225 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %10225 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %10225 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %10225 %int_8\n      %10283 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10283\n      %16870 = OpBitcast %uint %15226\n               OpBranch %21237\n      %21237 = OpLabel\n      %11376 = OpPhi %uint %16870 %10574 %16869 %21373\n      %17657 = OpIAdd %uint %11376 %24237\n      %24007 = OpShiftRightLogical %uint %17657 %int_3\n      %24154 = OpExtInst %v4float %1 FClamp %12383 %2938 %1285\n       %9073 = OpVectorTimesScalar %v4float %24154 %float_255\n      %11878 = OpFAdd %v4float %9073 %325\n       %7647 = OpConvertFToU %v4uint %11878\n       %8705 = OpCompositeExtract %uint %7647 0\n      %12251 = OpCompositeExtract %uint %7647 1\n      %11561 = OpShiftLeftLogical %uint %12251 %int_8\n      %19814 = OpBitwiseOr %uint %8705 %11561\n      %21476 = OpCompositeExtract %uint %7647 2\n       %8560 = OpShiftLeftLogical %uint %21476 %int_16\n      %19815 = OpBitwiseOr %uint %19814 %8560\n      %21477 = OpCompositeExtract %uint %7647 3\n       %7292 = OpShiftLeftLogical %uint %21477 %int_24\n       %9255 = OpBitwiseOr %uint %19815 %7292\n       %7522 = OpExtInst %v4float %1 FClamp %21344 %2938 %1285\n       %8264 = OpVectorTimesScalar %v4float %7522 %float_255\n      %11879 = OpFAdd %v4float %8264 %325\n       %7648 = OpConvertFToU %v4uint %11879\n       %8706 = OpCompositeExtract %uint %7648 0\n      %12252 = OpCompositeExtract %uint %7648 1\n      %11562 = OpShiftLeftLogical %uint %12252 %int_8\n      %19816 = OpBitwiseOr %uint %8706 %11562\n      %21478 = OpCompositeExtract %uint %7648 2\n       %8561 = OpShiftLeftLogical %uint %21478 %int_16\n      %19817 = OpBitwiseOr %uint %19816 %8561\n      %21479 = OpCompositeExtract %uint %7648 3\n       %8541 = OpShiftLeftLogical %uint %21479 %int_24\n      %17498 = OpBitwiseOr %uint %19817 %8541\n      %11625 = OpCompositeConstruct %v2uint %9255 %17498\n       %8978 = OpAccessChain %_ptr_Uniform_v2uint %xe_resolve_dest %int_0 %24007\n               OpStore %8978 %11625\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t resolve_full_8bpp_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x000062AE, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000008, 0x00000008, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x0000040B, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x00090006, 0x0000040B, 0x00000000, 0x725F6578,\n    0x6C6F7365, 0x655F6576, 0x6D617264, 0x666E695F, 0x0000006F, 0x000A0006,\n    0x0000040B, 0x00000001, 0x725F6578, 0x6C6F7365, 0x635F6576, 0x64726F6F,\n    0x74616E69, 0x6E695F65, 0x00006F66, 0x00090006, 0x0000040B, 0x00000002,\n    0x725F6578, 0x6C6F7365, 0x645F6576, 0x5F747365, 0x6F666E69, 0x00000000,\n    0x000B0006, 0x0000040B, 0x00000003, 0x725F6578, 0x6C6F7365, 0x645F6576,\n    0x5F747365, 0x726F6F63, 0x616E6964, 0x695F6574, 0x006F666E, 0x00090006,\n    0x0000040B, 0x00000004, 0x725F6578, 0x6C6F7365, 0x645F6576, 0x5F747365,\n    0x65736162, 0x00000000, 0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F,\n    0x5F737473, 0x00006578, 0x00090005, 0x0000079C, 0x725F6578, 0x6C6F7365,\n    0x655F6576, 0x6D617264, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x0000079C, 0x00000000, 0x61746164, 0x00000000, 0x00070005, 0x00000CC7,\n    0x725F6578, 0x6C6F7365, 0x655F6576, 0x6D617264, 0x00000000, 0x00080005,\n    0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F, 0x496E6F69,\n    0x00000044, 0x00090005, 0x000007A8, 0x725F6578, 0x6C6F7365, 0x645F6576,\n    0x5F747365, 0x625F6578, 0x6B636F6C, 0x00000000, 0x00050006, 0x000007A8,\n    0x00000000, 0x61746164, 0x00000000, 0x00060005, 0x00001592, 0x725F6578,\n    0x6C6F7365, 0x645F6576, 0x00747365, 0x00030047, 0x0000040B, 0x00000002,\n    0x00050048, 0x0000040B, 0x00000000, 0x00000023, 0x00000000, 0x00050048,\n    0x0000040B, 0x00000001, 0x00000023, 0x00000004, 0x00050048, 0x0000040B,\n    0x00000002, 0x00000023, 0x00000008, 0x00050048, 0x0000040B, 0x00000003,\n    0x00000023, 0x0000000C, 0x00050048, 0x0000040B, 0x00000004, 0x00000023,\n    0x00000010, 0x00040047, 0x000007D0, 0x00000006, 0x00000004, 0x00030047,\n    0x0000079C, 0x00000003, 0x00040048, 0x0000079C, 0x00000000, 0x00000018,\n    0x00050048, 0x0000079C, 0x00000000, 0x00000023, 0x00000000, 0x00030047,\n    0x00000CC7, 0x00000018, 0x00040047, 0x00000CC7, 0x00000021, 0x00000000,\n    0x00040047, 0x00000CC7, 0x00000022, 0x00000000, 0x00040047, 0x00000F48,\n    0x0000000B, 0x0000001C, 0x00040047, 0x000007D6, 0x00000006, 0x00000008,\n    0x00030047, 0x000007A8, 0x00000003, 0x00040048, 0x000007A8, 0x00000000,\n    0x00000019, 0x00050048, 0x000007A8, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x00001592, 0x00000019, 0x00040047, 0x00001592, 0x00000021,\n    0x00000000, 0x00040047, 0x00001592, 0x00000022, 0x00000001, 0x00040047,\n    0x00000AC7, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000017,\n    0x0000000B, 0x00000004, 0x00030016, 0x0000000D, 0x00000020, 0x00040017,\n    0x0000001D, 0x0000000D, 0x00000004, 0x00020014, 0x00000009, 0x00040015,\n    0x0000000C, 0x00000020, 0x00000001, 0x00040017, 0x00000012, 0x0000000C,\n    0x00000002, 0x00040017, 0x00000016, 0x0000000C, 0x00000003, 0x0004002B,\n    0x0000000D, 0x00000A0C, 0x00000000, 0x0004002B, 0x0000000D, 0x0000008A,\n    0x3F800000, 0x00040017, 0x0000001A, 0x0000000C, 0x00000004, 0x0004002B,\n    0x0000000D, 0x00000540, 0x437F0000, 0x0004002B, 0x0000000D, 0x000000FC,\n    0x3F000000, 0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000, 0x0004002B,\n    0x0000000B, 0x00000A0D, 0x00000001, 0x0004002B, 0x0000000C, 0x00000A23,\n    0x00000008, 0x0004002B, 0x0000000B, 0x00000A10, 0x00000002, 0x0004002B,\n    0x0000000C, 0x00000A3B, 0x00000010, 0x0004002B, 0x0000000B, 0x00000A13,\n    0x00000003, 0x0004002B, 0x0000000C, 0x00000A53, 0x00000018, 0x0004002B,\n    0x0000000B, 0x00000144, 0x000000FF, 0x0004002B, 0x0000000D, 0x0000017A,\n    0x3B808081, 0x0004002B, 0x0000000B, 0x00000A44, 0x000003FF, 0x0004002B,\n    0x0000000D, 0x000006FE, 0x3A802008, 0x0004002B, 0x0000000B, 0x00000B87,\n    0x0000007F, 0x0004002B, 0x0000000B, 0x00000A1F, 0x00000007, 0x00040017,\n    0x00000013, 0x00000009, 0x00000004, 0x0004002B, 0x0000000B, 0x00000B7E,\n    0x0000007C, 0x0004002B, 0x0000000B, 0x00000A4F, 0x00000017, 0x0004002B,\n    0x0000000B, 0x00000A3A, 0x00000010, 0x0004002B, 0x0000000D, 0x00000341,\n    0xBF800000, 0x0004002B, 0x0000000D, 0x000007FE, 0x3A800100, 0x0005002C,\n    0x00000011, 0x0000072D, 0x00000A10, 0x00000A0D, 0x00040017, 0x0000000F,\n    0x00000009, 0x00000002, 0x0005002C, 0x00000011, 0x0000070F, 0x00000A0A,\n    0x00000A0A, 0x0005002C, 0x00000011, 0x00000724, 0x00000A0D, 0x00000A0D,\n    0x0005002C, 0x00000011, 0x00000718, 0x00000A0D, 0x00000A0A, 0x0004002B,\n    0x0000000B, 0x00000AFA, 0x00000050, 0x0005002C, 0x00000011, 0x00000A9F,\n    0x00000AFA, 0x00000A3A, 0x0004002B, 0x0000000C, 0x00000A11, 0x00000002,\n    0x0004002B, 0x0000000C, 0x00000A17, 0x00000004, 0x0004002B, 0x0000000C,\n    0x00000A1D, 0x00000006, 0x0004002B, 0x0000000C, 0x00000A2C, 0x0000000B,\n    0x0004002B, 0x0000000C, 0x00000A38, 0x0000000F, 0x0004002B, 0x0000000C,\n    0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C, 0x00000A1A, 0x00000005,\n    0x0004002B, 0x0000000C, 0x00000A20, 0x00000007, 0x0004002B, 0x0000000C,\n    0x00000A2F, 0x0000000C, 0x0004002B, 0x0000000C, 0x00000A14, 0x00000003,\n    0x0007001E, 0x0000040B, 0x0000000B, 0x0000000B, 0x0000000B, 0x0000000B,\n    0x0000000B, 0x00040020, 0x00000688, 0x00000009, 0x0000040B, 0x0004003B,\n    0x00000688, 0x00000CE9, 0x00000009, 0x0004002B, 0x0000000C, 0x00000A0B,\n    0x00000000, 0x00040020, 0x00000288, 0x00000009, 0x0000000B, 0x0004002B,\n    0x0000000B, 0x00000A28, 0x0000000A, 0x0004002B, 0x0000000B, 0x00000A31,\n    0x0000000D, 0x0004002B, 0x0000000B, 0x00000A81, 0x000007FF, 0x0004002B,\n    0x0000000B, 0x00000A52, 0x00000018, 0x0004002B, 0x0000000B, 0x00000A37,\n    0x0000000F, 0x0004002B, 0x0000000B, 0x00000A5E, 0x0000001C, 0x0004002B,\n    0x0000000B, 0x00000A16, 0x00000004, 0x0005002C, 0x00000011, 0x0000073F,\n    0x00000A0A, 0x00000A16, 0x0004002B, 0x0000000B, 0x00000A19, 0x00000005,\n    0x0004002B, 0x0000000C, 0x00000A29, 0x0000000A, 0x0004002B, 0x0000000B,\n    0x00000A22, 0x00000008, 0x0004002B, 0x0000000C, 0x00000A59, 0x0000001A,\n    0x0004002B, 0x0000000C, 0x00000A50, 0x00000017, 0x0004002B, 0x0000000B,\n    0x00000926, 0x01000000, 0x0004002B, 0x0000000B, 0x00000A46, 0x00000014,\n    0x0005002C, 0x00000011, 0x000008E3, 0x00000A46, 0x00000A52, 0x00040017,\n    0x00000014, 0x0000000B, 0x00000003, 0x0003002A, 0x00000009, 0x00000787,\n    0x00040017, 0x00000015, 0x0000000D, 0x00000002, 0x0003001D, 0x000007D0,\n    0x0000000B, 0x0003001E, 0x0000079C, 0x000007D0, 0x00040020, 0x00000A1B,\n    0x00000002, 0x0000079C, 0x0004003B, 0x00000A1B, 0x00000CC7, 0x00000002,\n    0x00040020, 0x00000289, 0x00000002, 0x0000000B, 0x0004002B, 0x0000000B,\n    0x00000A1C, 0x00000006, 0x0004002B, 0x0000000B, 0x00000207, 0x00000140,\n    0x00040020, 0x00000291, 0x00000001, 0x00000014, 0x0004003B, 0x00000291,\n    0x00000F48, 0x00000001, 0x00040020, 0x0000028A, 0x00000001, 0x0000000B,\n    0x0005002C, 0x00000011, 0x0000072A, 0x00000A13, 0x00000A0A, 0x0003001D,\n    0x000007D6, 0x00000011, 0x0003001E, 0x000007A8, 0x000007D6, 0x00040020,\n    0x00000A25, 0x00000002, 0x000007A8, 0x0004003B, 0x00000A25, 0x00001592,\n    0x00000002, 0x00040020, 0x0000028E, 0x00000002, 0x00000011, 0x0006002C,\n    0x00000014, 0x00000AC7, 0x00000A22, 0x00000A22, 0x00000A0D, 0x0005002C,\n    0x00000011, 0x000007A2, 0x00000A37, 0x00000A0D, 0x0005002C, 0x00000011,\n    0x0000074E, 0x00000A13, 0x00000A13, 0x0005002C, 0x00000011, 0x0000084A,\n    0x00000A37, 0x00000A37, 0x0007002C, 0x0000001D, 0x00000504, 0x00000341,\n    0x00000341, 0x00000341, 0x00000341, 0x0007002C, 0x0000001A, 0x00000302,\n    0x00000A3B, 0x00000A3B, 0x00000A3B, 0x00000A3B, 0x0007002C, 0x00000017,\n    0x0000064B, 0x00000144, 0x00000144, 0x00000144, 0x00000144, 0x0007002C,\n    0x00000017, 0x000003A1, 0x00000A44, 0x00000A44, 0x00000A44, 0x00000A44,\n    0x0007002C, 0x00000017, 0x000002D1, 0x00000B87, 0x00000B87, 0x00000B87,\n    0x00000B87, 0x0007002C, 0x00000017, 0x00000107, 0x00000A1F, 0x00000A1F,\n    0x00000A1F, 0x00000A1F, 0x0007002C, 0x00000017, 0x00000B50, 0x00000A0A,\n    0x00000A0A, 0x00000A0A, 0x00000A0A, 0x0007002C, 0x00000017, 0x0000022F,\n    0x00000B7E, 0x00000B7E, 0x00000B7E, 0x00000B7E, 0x0007002C, 0x00000017,\n    0x00000467, 0x00000A4F, 0x00000A4F, 0x00000A4F, 0x00000A4F, 0x0007002C,\n    0x00000017, 0x000002ED, 0x00000A3A, 0x00000A3A, 0x00000A3A, 0x00000A3A,\n    0x0007002C, 0x0000001D, 0x00000B7A, 0x00000A0C, 0x00000A0C, 0x00000A0C,\n    0x00000A0C, 0x0007002C, 0x0000001D, 0x00000505, 0x0000008A, 0x0000008A,\n    0x0000008A, 0x0000008A, 0x0007002C, 0x0000001D, 0x00000145, 0x000000FC,\n    0x000000FC, 0x000000FC, 0x000000FC, 0x0004002B, 0x0000000C, 0x00000089,\n    0x3F800000, 0x0004002B, 0x0000000B, 0x00000184, 0x00000500, 0x0004002B,\n    0x0000000B, 0x0000086E, 0x00280000, 0x0004002B, 0x0000000B, 0x000009F8,\n    0xFFFFFFFA, 0x0007002C, 0x00000017, 0x00000A0F, 0x000009F8, 0x000009F8,\n    0x000009F8, 0x000009F8, 0x0004002B, 0x0000000B, 0x00000237, 0x00000150,\n    0x0004002B, 0x0000000D, 0x0000016E, 0x3E800000, 0x00050036, 0x00000008,\n    0x0000161F, 0x00000000, 0x00000502, 0x000200F8, 0x00003B06, 0x000300F7,\n    0x00004C7A, 0x00000000, 0x000300FB, 0x00000A0A, 0x00002E68, 0x000200F8,\n    0x00002E68, 0x00050041, 0x00000288, 0x000056E5, 0x00000CE9, 0x00000A0B,\n    0x0004003D, 0x0000000B, 0x00003D0B, 0x000056E5, 0x00050041, 0x00000288,\n    0x000058AC, 0x00000CE9, 0x00000A0E, 0x0004003D, 0x0000000B, 0x00005158,\n    0x000058AC, 0x000500C7, 0x0000000B, 0x00005051, 0x00003D0B, 0x00000A44,\n    0x000500C2, 0x0000000B, 0x00004E0A, 0x00003D0B, 0x00000A28, 0x000500C7,\n    0x0000000B, 0x0000217E, 0x00004E0A, 0x00000A13, 0x000500C2, 0x0000000B,\n    0x0000520A, 0x00003D0B, 0x00000A31, 0x000500C7, 0x0000000B, 0x0000217F,\n    0x0000520A, 0x00000A81, 0x000500C2, 0x0000000B, 0x0000520B, 0x00003D0B,\n    0x00000A52, 0x000500C7, 0x0000000B, 0x00002180, 0x0000520B, 0x00000A37,\n    0x000500C2, 0x0000000B, 0x00004994, 0x00003D0B, 0x00000A5E, 0x000500C7,\n    0x0000000B, 0x000023AA, 0x00004994, 0x00000A0D, 0x00050050, 0x00000011,\n    0x000022A7, 0x00005158, 0x00005158, 0x000500C2, 0x00000011, 0x00002568,\n    0x000022A7, 0x0000073F, 0x000500C7, 0x00000011, 0x00005B53, 0x00002568,\n    0x000007A2, 0x000500C4, 0x00000011, 0x00003F4F, 0x00005B53, 0x0000074E,\n    0x00050084, 0x00000011, 0x000059EB, 0x00003F4F, 0x00000724, 0x000500C2,\n    0x0000000B, 0x00003213, 0x00005158, 0x00000A19, 0x000500C7, 0x0000000B,\n    0x00003F4C, 0x00003213, 0x00000A81, 0x00050041, 0x00000288, 0x0000492C,\n    0x00000CE9, 0x00000A11, 0x0004003D, 0x0000000B, 0x00005EAC, 0x0000492C,\n    0x00050041, 0x00000288, 0x000058AD, 0x00000CE9, 0x00000A14, 0x0004003D,\n    0x0000000B, 0x00004FA3, 0x000058AD, 0x000500C7, 0x0000000B, 0x00005F7D,\n    0x00005EAC, 0x00000A22, 0x000500AB, 0x00000009, 0x000048EB, 0x00005F7D,\n    0x00000A0A, 0x000500C2, 0x0000000B, 0x00002311, 0x00005EAC, 0x00000A16,\n    0x000500C7, 0x0000000B, 0x00004408, 0x00002311, 0x00000A1F, 0x0004007C,\n    0x0000000C, 0x00005988, 0x00005EAC, 0x000500C4, 0x0000000C, 0x0000358F,\n    0x00005988, 0x00000A29, 0x000500C3, 0x0000000C, 0x0000509C, 0x0000358F,\n    0x00000A59, 0x000500C4, 0x0000000C, 0x00004702, 0x0000509C, 0x00000A50,\n    0x00050080, 0x0000000C, 0x00001D26, 0x00004702, 0x00000089, 0x0004007C,\n    0x0000000D, 0x00002B2C, 0x00001D26, 0x000500C7, 0x0000000B, 0x00005879,\n    0x00005EAC, 0x00000926, 0x000500AB, 0x00000009, 0x00001D33, 0x00005879,\n    0x00000A0A, 0x000500C7, 0x0000000B, 0x000020FC, 0x00004FA3, 0x00000A44,\n    0x000500C2, 0x0000000B, 0x00002F90, 0x00004FA3, 0x00000A28, 0x000500C7,\n    0x0000000B, 0x000061CE, 0x00002F90, 0x00000A44, 0x000500C4, 0x0000000B,\n    0x00006273, 0x000061CE, 0x00000A0E, 0x00050050, 0x00000011, 0x000028B6,\n    0x00004FA3, 0x00004FA3, 0x000500C2, 0x00000011, 0x00002891, 0x000028B6,\n    0x000008E3, 0x000500C7, 0x00000011, 0x00005B54, 0x00002891, 0x0000084A,\n    0x000500C4, 0x00000011, 0x00003F50, 0x00005B54, 0x0000074E, 0x00050084,\n    0x00000011, 0x000059EC, 0x00003F50, 0x00000724, 0x000500C2, 0x0000000B,\n    0x00003214, 0x00004FA3, 0x00000A5E, 0x000500C7, 0x0000000B, 0x00003F4D,\n    0x00003214, 0x00000A1F, 0x00050041, 0x00000288, 0x0000492D, 0x00000CE9,\n    0x00000A17, 0x0004003D, 0x0000000B, 0x00005EAD, 0x0000492D, 0x00050041,\n    0x0000028A, 0x000056D1, 0x00000F48, 0x00000A0A, 0x0004003D, 0x0000000B,\n    0x00001BAD, 0x000056D1, 0x000500AE, 0x00000009, 0x00001CED, 0x00001BAD,\n    0x00003F4C, 0x000300F7, 0x00004427, 0x00000002, 0x000400FA, 0x00001CED,\n    0x000055E8, 0x00004427, 0x000200F8, 0x000055E8, 0x000200F9, 0x00004C7A,\n    0x000200F8, 0x00004427, 0x0004003D, 0x00000014, 0x0000392D, 0x00000F48,\n    0x0007004F, 0x00000011, 0x00004849, 0x0000392D, 0x0000392D, 0x00000000,\n    0x00000001, 0x000500C4, 0x00000011, 0x00002670, 0x00004849, 0x0000072A,\n    0x00050051, 0x0000000B, 0x00005FB2, 0x00002670, 0x00000000, 0x00050051,\n    0x0000000B, 0x00001BEE, 0x00002670, 0x00000001, 0x0007000C, 0x0000000B,\n    0x00005F7E, 0x00000001, 0x00000029, 0x00001BEE, 0x00000A0A, 0x00050050,\n    0x00000011, 0x000051EF, 0x00005FB2, 0x00005F7E, 0x00050080, 0x00000011,\n    0x0000522C, 0x000051EF, 0x000059EB, 0x000500B2, 0x00000009, 0x00003ECB,\n    0x00003F4D, 0x00000A13, 0x000300F7, 0x00005CE0, 0x00000000, 0x000400FA,\n    0x00003ECB, 0x00002AEE, 0x00003AEF, 0x000200F8, 0x00003AEF, 0x000500AA,\n    0x00000009, 0x000034FE, 0x00003F4D, 0x00000A19, 0x000600A9, 0x0000000B,\n    0x000020F6, 0x000034FE, 0x00000A10, 0x00000A0A, 0x000200F9, 0x00005CE0,\n    0x000200F8, 0x00002AEE, 0x000200F9, 0x00005CE0, 0x000200F8, 0x00005CE0,\n    0x000700F5, 0x0000000B, 0x00004B64, 0x00003F4D, 0x00002AEE, 0x000020F6,\n    0x00003AEF, 0x00050050, 0x00000011, 0x000041BE, 0x0000217E, 0x0000217E,\n    0x000500AE, 0x0000000F, 0x00002E19, 0x000041BE, 0x0000072D, 0x000600A9,\n    0x00000011, 0x00004BB5, 0x00002E19, 0x00000724, 0x0000070F, 0x000500C4,\n    0x00000011, 0x00002AEA, 0x0000522C, 0x00004BB5, 0x00050050, 0x00000011,\n    0x0000605D, 0x00004B64, 0x00004B64, 0x000500C2, 0x00000011, 0x00002385,\n    0x0000605D, 0x00000718, 0x000500C7, 0x00000011, 0x00003AEC, 0x00002385,\n    0x00000724, 0x00050080, 0x00000011, 0x000027D5, 0x00002AEA, 0x00003AEC,\n    0x00050050, 0x00000011, 0x00002164, 0x000023AA, 0x00000A0A, 0x000500C2,\n    0x00000011, 0x0000264A, 0x00000A9F, 0x00002164, 0x00050086, 0x00000011,\n    0x000027A2, 0x000027D5, 0x0000264A, 0x00050051, 0x0000000B, 0x00004FA6,\n    0x000027A2, 0x00000001, 0x00050084, 0x0000000B, 0x00002B26, 0x00004FA6,\n    0x00005051, 0x00050051, 0x0000000B, 0x00006059, 0x000027A2, 0x00000000,\n    0x00050080, 0x0000000B, 0x00005420, 0x00002B26, 0x00006059, 0x00050080,\n    0x0000000B, 0x00002226, 0x0000217F, 0x00005420, 0x00050084, 0x00000011,\n    0x00005B31, 0x000027A2, 0x0000264A, 0x00050082, 0x00000011, 0x00002E74,\n    0x000027D5, 0x00005B31, 0x00050084, 0x0000000B, 0x00001F75, 0x00002226,\n    0x00000184, 0x00050051, 0x0000000B, 0x00005EC7, 0x00002E74, 0x00000001,\n    0x00050051, 0x0000000B, 0x00005BE6, 0x0000264A, 0x00000000, 0x00050084,\n    0x0000000B, 0x00005966, 0x00005EC7, 0x00005BE6, 0x00050051, 0x0000000B,\n    0x00001AE6, 0x00002E74, 0x00000000, 0x00050080, 0x0000000B, 0x000025E0,\n    0x00005966, 0x00001AE6, 0x000500C4, 0x0000000B, 0x000046C4, 0x000025E0,\n    0x000023AA, 0x00050080, 0x0000000B, 0x000048BB, 0x00001F75, 0x000046C4,\n    0x00050089, 0x0000000B, 0x00004C59, 0x000048BB, 0x0000086E, 0x000500C4,\n    0x0000000B, 0x00005BEB, 0x00004C59, 0x00000A11, 0x000500AE, 0x00000009,\n    0x00003652, 0x0000217E, 0x00000A10, 0x000600A9, 0x0000000B, 0x00002C0D,\n    0x00003652, 0x00000A0D, 0x00000A0A, 0x00050080, 0x0000000B, 0x0000540E,\n    0x000023AA, 0x00002C0D, 0x000500C4, 0x0000000B, 0x000030F7, 0x00000A16,\n    0x0000540E, 0x000300F7, 0x000033DC, 0x00000000, 0x000400FA, 0x00001D33,\n    0x00004032, 0x000033DC, 0x000200F8, 0x00004032, 0x000500AB, 0x00000009,\n    0x00002959, 0x000023AA, 0x00000A0A, 0x000200F9, 0x000033DC, 0x000200F8,\n    0x000033DC, 0x000700F5, 0x00000009, 0x00002AAC, 0x00001D33, 0x00005CE0,\n    0x00002959, 0x00004032, 0x000300F7, 0x000062AD, 0x00000000, 0x000400FA,\n    0x00002AAC, 0x00005D41, 0x000062AD, 0x000200F8, 0x00005D41, 0x00050080,\n    0x0000000B, 0x00001B50, 0x00005BEB, 0x00000A16, 0x000200F9, 0x000062AD,\n    0x000200F8, 0x000062AD, 0x000700F5, 0x0000000B, 0x00005E7C, 0x00005BEB,\n    0x000033DC, 0x00001B50, 0x00005D41, 0x000500AA, 0x00000009, 0x000060B1,\n    0x000030F7, 0x00000A16, 0x000300F7, 0x00004F23, 0x00000002, 0x000400FA,\n    0x000060B1, 0x000019BF, 0x000022FF, 0x000200F8, 0x000022FF, 0x000500C2,\n    0x0000000B, 0x00005630, 0x00005E7C, 0x00000A11, 0x00060041, 0x00000289,\n    0x00003439, 0x00000CC7, 0x00000A0B, 0x00005630, 0x0004003D, 0x0000000B,\n    0x00003AD4, 0x00003439, 0x00050080, 0x0000000B, 0x00002145, 0x00005E7C,\n    0x000030F7, 0x000500C2, 0x0000000B, 0x000054A6, 0x00002145, 0x00000A11,\n    0x00060041, 0x00000289, 0x00004CDD, 0x00000CC7, 0x00000A0B, 0x000054A6,\n    0x0004003D, 0x0000000B, 0x0000333A, 0x00004CDD, 0x00050084, 0x0000000B,\n    0x000021ED, 0x00000A10, 0x000030F7, 0x00050080, 0x0000000B, 0x00005EBE,\n    0x00005E7C, 0x000021ED, 0x000500C2, 0x0000000B, 0x000045E2, 0x00005EBE,\n    0x00000A11, 0x00060041, 0x00000289, 0x00004CDE, 0x00000CC7, 0x00000A0B,\n    0x000045E2, 0x0004003D, 0x0000000B, 0x0000333B, 0x00004CDE, 0x00050084,\n    0x0000000B, 0x000021EE, 0x00000A13, 0x000030F7, 0x00050080, 0x0000000B,\n    0x00005EBF, 0x00005E7C, 0x000021EE, 0x000500C2, 0x0000000B, 0x000045E3,\n    0x00005EBF, 0x00000A11, 0x00060041, 0x00000289, 0x00004901, 0x00000CC7,\n    0x00000A0B, 0x000045E3, 0x0004003D, 0x0000000B, 0x000056AA, 0x00004901,\n    0x00070050, 0x00000017, 0x00004CD6, 0x00003AD4, 0x0000333A, 0x0000333B,\n    0x000056AA, 0x00050084, 0x0000000B, 0x00004C2B, 0x00000A16, 0x000030F7,\n    0x00050080, 0x0000000B, 0x00002A45, 0x00005E7C, 0x00004C2B, 0x000500C2,\n    0x0000000B, 0x000045E4, 0x00002A45, 0x00000A11, 0x00060041, 0x00000289,\n    0x00004CDF, 0x00000CC7, 0x00000A0B, 0x000045E4, 0x0004003D, 0x0000000B,\n    0x0000333C, 0x00004CDF, 0x00050084, 0x0000000B, 0x000021EF, 0x00000A19,\n    0x000030F7, 0x00050080, 0x0000000B, 0x00005EC0, 0x00005E7C, 0x000021EF,\n    0x000500C2, 0x0000000B, 0x000045E5, 0x00005EC0, 0x00000A11, 0x00060041,\n    0x00000289, 0x00004CE0, 0x00000CC7, 0x00000A0B, 0x000045E5, 0x0004003D,\n    0x0000000B, 0x0000333D, 0x00004CE0, 0x00050084, 0x0000000B, 0x000021F0,\n    0x00000A1C, 0x000030F7, 0x00050080, 0x0000000B, 0x00005EC1, 0x00005E7C,\n    0x000021F0, 0x000500C2, 0x0000000B, 0x000045E6, 0x00005EC1, 0x00000A11,\n    0x00060041, 0x00000289, 0x00004CE1, 0x00000CC7, 0x00000A0B, 0x000045E6,\n    0x0004003D, 0x0000000B, 0x0000333E, 0x00004CE1, 0x00050084, 0x0000000B,\n    0x000021F1, 0x00000A1F, 0x000030F7, 0x00050080, 0x0000000B, 0x00005EC2,\n    0x00005E7C, 0x000021F1, 0x000500C2, 0x0000000B, 0x000045E7, 0x00005EC2,\n    0x00000A11, 0x00060041, 0x00000289, 0x00004902, 0x00000CC7, 0x00000A0B,\n    0x000045E7, 0x0004003D, 0x0000000B, 0x00005F59, 0x00004902, 0x00070050,\n    0x00000017, 0x0000512C, 0x0000333C, 0x0000333D, 0x0000333E, 0x00005F59,\n    0x000200F9, 0x00004F23, 0x000200F8, 0x000019BF, 0x000500C2, 0x0000000B,\n    0x00005FA6, 0x00005E7C, 0x00000A11, 0x00060041, 0x00000289, 0x0000343A,\n    0x00000CC7, 0x00000A0B, 0x00005FA6, 0x0004003D, 0x0000000B, 0x00003141,\n    0x0000343A, 0x00050080, 0x0000000B, 0x00002DA7, 0x00005FA6, 0x00000A0D,\n    0x00060041, 0x00000289, 0x000018FF, 0x00000CC7, 0x00000A0B, 0x00002DA7,\n    0x0004003D, 0x0000000B, 0x00005C62, 0x000018FF, 0x00050080, 0x0000000B,\n    0x00002DA8, 0x00005FA6, 0x00000A10, 0x00060041, 0x00000289, 0x00001900,\n    0x00000CC7, 0x00000A0B, 0x00002DA8, 0x0004003D, 0x0000000B, 0x00005C63,\n    0x00001900, 0x00050080, 0x0000000B, 0x00002DA9, 0x00005FA6, 0x00000A13,\n    0x00060041, 0x00000289, 0x00005FEE, 0x00000CC7, 0x00000A0B, 0x00002DA9,\n    0x0004003D, 0x0000000B, 0x00003700, 0x00005FEE, 0x00070050, 0x00000017,\n    0x00005470, 0x00003141, 0x00005C62, 0x00005C63, 0x00003700, 0x00050080,\n    0x0000000B, 0x00004B83, 0x00005E7C, 0x00000A3A, 0x000500C2, 0x0000000B,\n    0x0000202D, 0x00004B83, 0x00000A11, 0x00060041, 0x00000289, 0x00004C91,\n    0x00000CC7, 0x00000A0B, 0x0000202D, 0x0004003D, 0x0000000B, 0x00003142,\n    0x00004C91, 0x00050080, 0x0000000B, 0x00002DAA, 0x0000202D, 0x00000A0D,\n    0x00060041, 0x00000289, 0x00001901, 0x00000CC7, 0x00000A0B, 0x00002DAA,\n    0x0004003D, 0x0000000B, 0x00005C64, 0x00001901, 0x00050080, 0x0000000B,\n    0x00002DAB, 0x0000202D, 0x00000A10, 0x00060041, 0x00000289, 0x00001902,\n    0x00000CC7, 0x00000A0B, 0x00002DAB, 0x0004003D, 0x0000000B, 0x00005C65,\n    0x00001902, 0x00050080, 0x0000000B, 0x00002DAC, 0x0000202D, 0x00000A13,\n    0x00060041, 0x00000289, 0x00005FEF, 0x00000CC7, 0x00000A0B, 0x00002DAC,\n    0x0004003D, 0x0000000B, 0x00003FFB, 0x00005FEF, 0x00070050, 0x00000017,\n    0x0000512D, 0x00003142, 0x00005C64, 0x00005C65, 0x00003FFB, 0x000200F9,\n    0x00004F23, 0x000200F8, 0x00004F23, 0x000700F5, 0x00000017, 0x00002629,\n    0x0000512D, 0x000019BF, 0x0000512C, 0x000022FF, 0x000700F5, 0x00000017,\n    0x000038EA, 0x00005470, 0x000019BF, 0x00004CD6, 0x000022FF, 0x000500AB,\n    0x00000009, 0x000043D9, 0x000023AA, 0x00000A0A, 0x000300F7, 0x0000530F,\n    0x00000002, 0x000400FA, 0x000043D9, 0x00005227, 0x0000577B, 0x000200F8,\n    0x0000577B, 0x000300F7, 0x00005BA4, 0x00000000, 0x001300FB, 0x00002180,\n    0x00006032, 0x00000000, 0x00003E85, 0x00000001, 0x00003E85, 0x00000002,\n    0x00003842, 0x0000000A, 0x00003842, 0x00000003, 0x000059BF, 0x0000000C,\n    0x000059BF, 0x00000004, 0x000052C6, 0x00000006, 0x00002033, 0x000200F8,\n    0x00002033, 0x00050051, 0x0000000B, 0x00005F56, 0x000038EA, 0x00000000,\n    0x0006000C, 0x00000015, 0x00006067, 0x00000001, 0x0000003E, 0x00005F56,\n    0x00050051, 0x0000000D, 0x00002294, 0x00006067, 0x00000000, 0x00050051,\n    0x0000000B, 0x00001DAF, 0x000038EA, 0x00000001, 0x0006000C, 0x00000015,\n    0x00003CF5, 0x00000001, 0x0000003E, 0x00001DAF, 0x00050051, 0x0000000D,\n    0x00002295, 0x00003CF5, 0x00000000, 0x00050051, 0x0000000B, 0x00001DB0,\n    0x000038EA, 0x00000002, 0x0006000C, 0x00000015, 0x00003CF6, 0x00000001,\n    0x0000003E, 0x00001DB0, 0x00050051, 0x0000000D, 0x00002296, 0x00003CF6,\n    0x00000000, 0x00050051, 0x0000000B, 0x00001DB1, 0x000038EA, 0x00000003,\n    0x0006000C, 0x00000015, 0x00003CE2, 0x00000001, 0x0000003E, 0x00001DB1,\n    0x00050051, 0x0000000D, 0x00002822, 0x00003CE2, 0x00000000, 0x00070050,\n    0x0000001D, 0x00005EB9, 0x00002294, 0x00002295, 0x00002296, 0x00002822,\n    0x00050051, 0x0000000B, 0x0000437A, 0x00002629, 0x00000000, 0x0006000C,\n    0x00000015, 0x0000466B, 0x00000001, 0x0000003E, 0x0000437A, 0x00050051,\n    0x0000000D, 0x00002297, 0x0000466B, 0x00000000, 0x00050051, 0x0000000B,\n    0x00001DB2, 0x00002629, 0x00000001, 0x0006000C, 0x00000015, 0x00003CF7,\n    0x00000001, 0x0000003E, 0x00001DB2, 0x00050051, 0x0000000D, 0x00002298,\n    0x00003CF7, 0x00000000, 0x00050051, 0x0000000B, 0x00001DB3, 0x00002629,\n    0x00000002, 0x0006000C, 0x00000015, 0x00003CF8, 0x00000001, 0x0000003E,\n    0x00001DB3, 0x00050051, 0x0000000D, 0x00002299, 0x00003CF8, 0x00000000,\n    0x00050051, 0x0000000B, 0x00001DB4, 0x00002629, 0x00000003, 0x0006000C,\n    0x00000015, 0x00003CE3, 0x00000001, 0x0000003E, 0x00001DB4, 0x00050051,\n    0x0000000D, 0x0000349A, 0x00003CE3, 0x00000000, 0x00070050, 0x0000001D,\n    0x000048F6, 0x00002297, 0x00002298, 0x00002299, 0x0000349A, 0x000200F9,\n    0x00005BA4, 0x000200F8, 0x000052C6, 0x0004007C, 0x0000001A, 0x000060F4,\n    0x000038EA, 0x000500C4, 0x0000001A, 0x0000581E, 0x000060F4, 0x00000302,\n    0x000500C3, 0x0000001A, 0x00004098, 0x0000581E, 0x00000302, 0x0004006F,\n    0x0000001D, 0x00002A97, 0x00004098, 0x0005008E, 0x0000001D, 0x00004A78,\n    0x00002A97, 0x000007FE, 0x0007000C, 0x0000001D, 0x00004980, 0x00000001,\n    0x00000028, 0x00000504, 0x00004A78, 0x0004007C, 0x0000001A, 0x000027E5,\n    0x00002629, 0x000500C4, 0x0000001A, 0x000021A1, 0x000027E5, 0x00000302,\n    0x000500C3, 0x0000001A, 0x00004099, 0x000021A1, 0x00000302, 0x0004006F,\n    0x0000001D, 0x00002A98, 0x00004099, 0x0005008E, 0x0000001D, 0x000053BF,\n    0x00002A98, 0x000007FE, 0x0007000C, 0x0000001D, 0x00004362, 0x00000001,\n    0x00000028, 0x00000504, 0x000053BF, 0x000200F9, 0x00005BA4, 0x000200F8,\n    0x000059BF, 0x000600A9, 0x0000000B, 0x00004C06, 0x00001D33, 0x00000A46,\n    0x00000A0A, 0x00070050, 0x00000017, 0x000023B0, 0x00004C06, 0x00004C06,\n    0x00004C06, 0x00004C06, 0x000500C2, 0x00000017, 0x00005D48, 0x000038EA,\n    0x000023B0, 0x000500C7, 0x00000017, 0x00005DE6, 0x00005D48, 0x000003A1,\n    0x000500C7, 0x00000017, 0x0000489C, 0x00005D48, 0x000002D1, 0x000500C2,\n    0x00000017, 0x00005B90, 0x00005DE6, 0x00000107, 0x000500AA, 0x00000013,\n    0x000040C9, 0x00005B90, 0x00000B50, 0x0006000C, 0x0000001A, 0x00002C4B,\n    0x00000001, 0x0000004B, 0x0000489C, 0x0004007C, 0x00000017, 0x00002A15,\n    0x00002C4B, 0x00050082, 0x00000017, 0x0000187A, 0x00000107, 0x00002A15,\n    0x00050080, 0x00000017, 0x00002210, 0x00002A15, 0x00000A0F, 0x000600A9,\n    0x00000017, 0x0000286F, 0x000040C9, 0x00002210, 0x00005B90, 0x000500C4,\n    0x00000017, 0x00005AD4, 0x0000489C, 0x0000187A, 0x000500C7, 0x00000017,\n    0x0000499A, 0x00005AD4, 0x000002D1, 0x000600A9, 0x00000017, 0x00002A9D,\n    0x000040C9, 0x0000499A, 0x0000489C, 0x00050080, 0x00000017, 0x00005FF9,\n    0x0000286F, 0x0000022F, 0x000500C4, 0x00000017, 0x00004F7F, 0x00005FF9,\n    0x00000467, 0x000500C4, 0x00000017, 0x00003FA6, 0x00002A9D, 0x000002ED,\n    0x000500C5, 0x00000017, 0x0000577C, 0x00004F7F, 0x00003FA6, 0x000500AA,\n    0x00000013, 0x00003600, 0x00005DE6, 0x00000B50, 0x000600A9, 0x00000017,\n    0x00004242, 0x00003600, 0x00000B50, 0x0000577C, 0x0004007C, 0x0000001D,\n    0x00003044, 0x00004242, 0x000500C2, 0x00000017, 0x0000603E, 0x00002629,\n    0x000023B0, 0x000500C7, 0x00000017, 0x00003921, 0x0000603E, 0x000003A1,\n    0x000500C7, 0x00000017, 0x0000489D, 0x0000603E, 0x000002D1, 0x000500C2,\n    0x00000017, 0x00005B91, 0x00003921, 0x00000107, 0x000500AA, 0x00000013,\n    0x000040CA, 0x00005B91, 0x00000B50, 0x0006000C, 0x0000001A, 0x00002C4C,\n    0x00000001, 0x0000004B, 0x0000489D, 0x0004007C, 0x00000017, 0x00002A16,\n    0x00002C4C, 0x00050082, 0x00000017, 0x0000187B, 0x00000107, 0x00002A16,\n    0x00050080, 0x00000017, 0x00002211, 0x00002A16, 0x00000A0F, 0x000600A9,\n    0x00000017, 0x00002870, 0x000040CA, 0x00002211, 0x00005B91, 0x000500C4,\n    0x00000017, 0x00005AD5, 0x0000489D, 0x0000187B, 0x000500C7, 0x00000017,\n    0x0000499B, 0x00005AD5, 0x000002D1, 0x000600A9, 0x00000017, 0x00002A9E,\n    0x000040CA, 0x0000499B, 0x0000489D, 0x00050080, 0x00000017, 0x00005FFA,\n    0x00002870, 0x0000022F, 0x000500C4, 0x00000017, 0x00004F80, 0x00005FFA,\n    0x00000467, 0x000500C4, 0x00000017, 0x00003FA7, 0x00002A9E, 0x000002ED,\n    0x000500C5, 0x00000017, 0x0000577D, 0x00004F80, 0x00003FA7, 0x000500AA,\n    0x00000013, 0x00003601, 0x00003921, 0x00000B50, 0x000600A9, 0x00000017,\n    0x00004657, 0x00003601, 0x00000B50, 0x0000577D, 0x0004007C, 0x0000001D,\n    0x0000593B, 0x00004657, 0x000200F9, 0x00005BA4, 0x000200F8, 0x00003842,\n    0x000600A9, 0x0000000B, 0x00004C07, 0x00001D33, 0x00000A46, 0x00000A0A,\n    0x00070050, 0x00000017, 0x000023B1, 0x00004C07, 0x00004C07, 0x00004C07,\n    0x00004C07, 0x000500C2, 0x00000017, 0x000056D3, 0x000038EA, 0x000023B1,\n    0x000500C7, 0x00000017, 0x00004A56, 0x000056D3, 0x000003A1, 0x00040070,\n    0x0000001D, 0x00003F05, 0x00004A56, 0x0005008E, 0x0000001D, 0x0000521A,\n    0x00003F05, 0x000006FE, 0x000500C2, 0x00000017, 0x00001E42, 0x00002629,\n    0x000023B1, 0x000500C7, 0x00000017, 0x00002BD4, 0x00001E42, 0x000003A1,\n    0x00040070, 0x0000001D, 0x0000431A, 0x00002BD4, 0x0005008E, 0x0000001D,\n    0x00003092, 0x0000431A, 0x000006FE, 0x000200F9, 0x00005BA4, 0x000200F8,\n    0x00003E85, 0x000600A9, 0x0000000B, 0x00004C08, 0x00001D33, 0x00000A3A,\n    0x00000A0A, 0x00070050, 0x00000017, 0x000023B2, 0x00004C08, 0x00004C08,\n    0x00004C08, 0x00004C08, 0x000500C2, 0x00000017, 0x000056D4, 0x000038EA,\n    0x000023B2, 0x000500C7, 0x00000017, 0x00004A57, 0x000056D4, 0x0000064B,\n    0x00040070, 0x0000001D, 0x00003F06, 0x00004A57, 0x0005008E, 0x0000001D,\n    0x0000521B, 0x00003F06, 0x0000017A, 0x000500C2, 0x00000017, 0x00001E43,\n    0x00002629, 0x000023B2, 0x000500C7, 0x00000017, 0x00002BD5, 0x00001E43,\n    0x0000064B, 0x00040070, 0x0000001D, 0x0000431B, 0x00002BD5, 0x0005008E,\n    0x0000001D, 0x00003093, 0x0000431B, 0x0000017A, 0x000200F9, 0x00005BA4,\n    0x000200F8, 0x00006032, 0x0004007C, 0x0000001D, 0x00004B1F, 0x000038EA,\n    0x0004007C, 0x0000001D, 0x000038B2, 0x00002629, 0x000200F9, 0x00005BA4,\n    0x000200F8, 0x00005BA4, 0x000F00F5, 0x0000001D, 0x00002BF3, 0x000038B2,\n    0x00006032, 0x00003093, 0x00003E85, 0x00003092, 0x00003842, 0x0000593B,\n    0x000059BF, 0x00004362, 0x000052C6, 0x000048F6, 0x00002033, 0x000F00F5,\n    0x0000001D, 0x0000358D, 0x00004B1F, 0x00006032, 0x0000521B, 0x00003E85,\n    0x0000521A, 0x00003842, 0x00003044, 0x000059BF, 0x00004980, 0x000052C6,\n    0x00005EB9, 0x00002033, 0x000200F9, 0x0000530F, 0x000200F8, 0x00005227,\n    0x000300F7, 0x00005BA5, 0x00000000, 0x000700FB, 0x00002180, 0x000030ED,\n    0x00000005, 0x000052C7, 0x00000007, 0x00002034, 0x000200F8, 0x00002034,\n    0x00050051, 0x0000000B, 0x00005F57, 0x000038EA, 0x00000000, 0x0006000C,\n    0x00000015, 0x00006068, 0x00000001, 0x0000003E, 0x00005F57, 0x00050051,\n    0x0000000D, 0x0000229A, 0x00006068, 0x00000000, 0x00050051, 0x0000000B,\n    0x00001DB5, 0x000038EA, 0x00000001, 0x0006000C, 0x00000015, 0x00003CF9,\n    0x00000001, 0x0000003E, 0x00001DB5, 0x00050051, 0x0000000D, 0x0000229B,\n    0x00003CF9, 0x00000000, 0x00050051, 0x0000000B, 0x00001DB6, 0x000038EA,\n    0x00000002, 0x0006000C, 0x00000015, 0x00003CFA, 0x00000001, 0x0000003E,\n    0x00001DB6, 0x00050051, 0x0000000D, 0x0000229C, 0x00003CFA, 0x00000000,\n    0x00050051, 0x0000000B, 0x00001DB7, 0x000038EA, 0x00000003, 0x0006000C,\n    0x00000015, 0x00003CE4, 0x00000001, 0x0000003E, 0x00001DB7, 0x00050051,\n    0x0000000D, 0x00002823, 0x00003CE4, 0x00000000, 0x00070050, 0x0000001D,\n    0x00005EBA, 0x0000229A, 0x0000229B, 0x0000229C, 0x00002823, 0x00050051,\n    0x0000000B, 0x0000437B, 0x00002629, 0x00000000, 0x0006000C, 0x00000015,\n    0x0000466C, 0x00000001, 0x0000003E, 0x0000437B, 0x00050051, 0x0000000D,\n    0x0000229D, 0x0000466C, 0x00000000, 0x00050051, 0x0000000B, 0x00001DB8,\n    0x00002629, 0x00000001, 0x0006000C, 0x00000015, 0x00003CFB, 0x00000001,\n    0x0000003E, 0x00001DB8, 0x00050051, 0x0000000D, 0x0000229E, 0x00003CFB,\n    0x00000000, 0x00050051, 0x0000000B, 0x00001DB9, 0x00002629, 0x00000002,\n    0x0006000C, 0x00000015, 0x00003CFC, 0x00000001, 0x0000003E, 0x00001DB9,\n    0x00050051, 0x0000000D, 0x0000229F, 0x00003CFC, 0x00000000, 0x00050051,\n    0x0000000B, 0x00001DBA, 0x00002629, 0x00000003, 0x0006000C, 0x00000015,\n    0x00003CE5, 0x00000001, 0x0000003E, 0x00001DBA, 0x00050051, 0x0000000D,\n    0x0000349B, 0x00003CE5, 0x00000000, 0x00070050, 0x0000001D, 0x000048F7,\n    0x0000229D, 0x0000229E, 0x0000229F, 0x0000349B, 0x000200F9, 0x00005BA5,\n    0x000200F8, 0x000052C7, 0x0004007C, 0x0000001A, 0x000060F5, 0x000038EA,\n    0x000500C4, 0x0000001A, 0x0000581F, 0x000060F5, 0x00000302, 0x000500C3,\n    0x0000001A, 0x0000409A, 0x0000581F, 0x00000302, 0x0004006F, 0x0000001D,\n    0x00002A99, 0x0000409A, 0x0005008E, 0x0000001D, 0x00004A79, 0x00002A99,\n    0x000007FE, 0x0007000C, 0x0000001D, 0x00004981, 0x00000001, 0x00000028,\n    0x00000504, 0x00004A79, 0x0004007C, 0x0000001A, 0x000027E6, 0x00002629,\n    0x000500C4, 0x0000001A, 0x000021A2, 0x000027E6, 0x00000302, 0x000500C3,\n    0x0000001A, 0x0000409B, 0x000021A2, 0x00000302, 0x0004006F, 0x0000001D,\n    0x00002A9A, 0x0000409B, 0x0005008E, 0x0000001D, 0x000053C0, 0x00002A9A,\n    0x000007FE, 0x0007000C, 0x0000001D, 0x00004363, 0x00000001, 0x00000028,\n    0x00000504, 0x000053C0, 0x000200F9, 0x00005BA5, 0x000200F8, 0x000030ED,\n    0x0004007C, 0x0000001D, 0x00004B20, 0x000038EA, 0x0004007C, 0x0000001D,\n    0x000038B3, 0x00002629, 0x000200F9, 0x00005BA5, 0x000200F8, 0x00005BA5,\n    0x000900F5, 0x0000001D, 0x00002BF4, 0x000038B3, 0x000030ED, 0x00004363,\n    0x000052C7, 0x000048F7, 0x00002034, 0x000900F5, 0x0000001D, 0x0000358E,\n    0x00004B20, 0x000030ED, 0x00004981, 0x000052C7, 0x00005EBA, 0x00002034,\n    0x000200F9, 0x0000530F, 0x000200F8, 0x0000530F, 0x000700F5, 0x0000001D,\n    0x00002662, 0x00002BF4, 0x00005BA5, 0x00002BF3, 0x00005BA4, 0x000700F5,\n    0x0000001D, 0x000036E3, 0x0000358E, 0x00005BA5, 0x0000358D, 0x00005BA4,\n    0x000500AE, 0x00000009, 0x00002E55, 0x00003F4D, 0x00000A16, 0x000300F7,\n    0x00005313, 0x00000002, 0x000400FA, 0x00002E55, 0x000050E5, 0x00005313,\n    0x000200F8, 0x000050E5, 0x00050085, 0x0000000D, 0x000061FB, 0x00002B2C,\n    0x000000FC, 0x00050080, 0x0000000B, 0x00005E78, 0x00005E7C, 0x00000207,\n    0x000300F7, 0x00004F24, 0x00000002, 0x000400FA, 0x000060B1, 0x000019C0,\n    0x00002300, 0x000200F8, 0x00002300, 0x000500C2, 0x0000000B, 0x00005631,\n    0x00005E78, 0x00000A11, 0x00060041, 0x00000289, 0x0000343B, 0x00000CC7,\n    0x00000A0B, 0x00005631, 0x0004003D, 0x0000000B, 0x00003AD5, 0x0000343B,\n    0x00050080, 0x0000000B, 0x00002146, 0x00005E78, 0x000030F7, 0x000500C2,\n    0x0000000B, 0x000054A7, 0x00002146, 0x00000A11, 0x00060041, 0x00000289,\n    0x00004CE2, 0x00000CC7, 0x00000A0B, 0x000054A7, 0x0004003D, 0x0000000B,\n    0x0000333F, 0x00004CE2, 0x00050084, 0x0000000B, 0x000021F2, 0x00000A10,\n    0x000030F7, 0x00050080, 0x0000000B, 0x00005EC3, 0x00005E78, 0x000021F2,\n    0x000500C2, 0x0000000B, 0x000045E8, 0x00005EC3, 0x00000A11, 0x00060041,\n    0x00000289, 0x00004CE3, 0x00000CC7, 0x00000A0B, 0x000045E8, 0x0004003D,\n    0x0000000B, 0x00003340, 0x00004CE3, 0x00050084, 0x0000000B, 0x000021F3,\n    0x00000A13, 0x000030F7, 0x00050080, 0x0000000B, 0x00005EC4, 0x00005E78,\n    0x000021F3, 0x000500C2, 0x0000000B, 0x000045E9, 0x00005EC4, 0x00000A11,\n    0x00060041, 0x00000289, 0x00004903, 0x00000CC7, 0x00000A0B, 0x000045E9,\n    0x0004003D, 0x0000000B, 0x000056AB, 0x00004903, 0x00070050, 0x00000017,\n    0x00004CD7, 0x00003AD5, 0x0000333F, 0x00003340, 0x000056AB, 0x00050084,\n    0x0000000B, 0x00004C2C, 0x00000A16, 0x000030F7, 0x00050080, 0x0000000B,\n    0x00002A46, 0x00005E78, 0x00004C2C, 0x000500C2, 0x0000000B, 0x000045EA,\n    0x00002A46, 0x00000A11, 0x00060041, 0x00000289, 0x00004CE4, 0x00000CC7,\n    0x00000A0B, 0x000045EA, 0x0004003D, 0x0000000B, 0x00003341, 0x00004CE4,\n    0x00050084, 0x0000000B, 0x000021F4, 0x00000A19, 0x000030F7, 0x00050080,\n    0x0000000B, 0x00005EC5, 0x00005E78, 0x000021F4, 0x000500C2, 0x0000000B,\n    0x000045EB, 0x00005EC5, 0x00000A11, 0x00060041, 0x00000289, 0x00004CE5,\n    0x00000CC7, 0x00000A0B, 0x000045EB, 0x0004003D, 0x0000000B, 0x00003342,\n    0x00004CE5, 0x00050084, 0x0000000B, 0x000021F5, 0x00000A1C, 0x000030F7,\n    0x00050080, 0x0000000B, 0x00005EC6, 0x00005E78, 0x000021F5, 0x000500C2,\n    0x0000000B, 0x000045EC, 0x00005EC6, 0x00000A11, 0x00060041, 0x00000289,\n    0x00004CE6, 0x00000CC7, 0x00000A0B, 0x000045EC, 0x0004003D, 0x0000000B,\n    0x00003343, 0x00004CE6, 0x00050084, 0x0000000B, 0x000021F6, 0x00000A1F,\n    0x000030F7, 0x00050080, 0x0000000B, 0x00005EC8, 0x00005E78, 0x000021F6,\n    0x000500C2, 0x0000000B, 0x000045ED, 0x00005EC8, 0x00000A11, 0x00060041,\n    0x00000289, 0x00004904, 0x00000CC7, 0x00000A0B, 0x000045ED, 0x0004003D,\n    0x0000000B, 0x00005F5A, 0x00004904, 0x00070050, 0x00000017, 0x0000512E,\n    0x00003341, 0x00003342, 0x00003343, 0x00005F5A, 0x000200F9, 0x00004F24,\n    0x000200F8, 0x000019C0, 0x000500C2, 0x0000000B, 0x00005FA7, 0x00005E78,\n    0x00000A11, 0x00060041, 0x00000289, 0x0000343C, 0x00000CC7, 0x00000A0B,\n    0x00005FA7, 0x0004003D, 0x0000000B, 0x00003143, 0x0000343C, 0x00050080,\n    0x0000000B, 0x00002DAD, 0x00005FA7, 0x00000A0D, 0x00060041, 0x00000289,\n    0x00001903, 0x00000CC7, 0x00000A0B, 0x00002DAD, 0x0004003D, 0x0000000B,\n    0x00005C66, 0x00001903, 0x00050080, 0x0000000B, 0x00002DAE, 0x00005FA7,\n    0x00000A10, 0x00060041, 0x00000289, 0x00001904, 0x00000CC7, 0x00000A0B,\n    0x00002DAE, 0x0004003D, 0x0000000B, 0x00005C67, 0x00001904, 0x00050080,\n    0x0000000B, 0x00002DAF, 0x00005FA7, 0x00000A13, 0x00060041, 0x00000289,\n    0x00005FF0, 0x00000CC7, 0x00000A0B, 0x00002DAF, 0x0004003D, 0x0000000B,\n    0x00003701, 0x00005FF0, 0x00070050, 0x00000017, 0x00005471, 0x00003143,\n    0x00005C66, 0x00005C67, 0x00003701, 0x00050080, 0x0000000B, 0x00004B84,\n    0x00005E7C, 0x00000237, 0x000500C2, 0x0000000B, 0x0000202E, 0x00004B84,\n    0x00000A11, 0x00060041, 0x00000289, 0x00004C92, 0x00000CC7, 0x00000A0B,\n    0x0000202E, 0x0004003D, 0x0000000B, 0x00003144, 0x00004C92, 0x00050080,\n    0x0000000B, 0x00002DB0, 0x0000202E, 0x00000A0D, 0x00060041, 0x00000289,\n    0x00001905, 0x00000CC7, 0x00000A0B, 0x00002DB0, 0x0004003D, 0x0000000B,\n    0x00005C68, 0x00001905, 0x00050080, 0x0000000B, 0x00002DB1, 0x0000202E,\n    0x00000A10, 0x00060041, 0x00000289, 0x00001906, 0x00000CC7, 0x00000A0B,\n    0x00002DB1, 0x0004003D, 0x0000000B, 0x00005C69, 0x00001906, 0x00050080,\n    0x0000000B, 0x00002DB2, 0x0000202E, 0x00000A13, 0x00060041, 0x00000289,\n    0x00005FF1, 0x00000CC7, 0x00000A0B, 0x00002DB2, 0x0004003D, 0x0000000B,\n    0x00003FFC, 0x00005FF1, 0x00070050, 0x00000017, 0x0000512F, 0x00003144,\n    0x00005C68, 0x00005C69, 0x00003FFC, 0x000200F9, 0x00004F24, 0x000200F8,\n    0x00004F24, 0x000700F5, 0x00000017, 0x00002BCD, 0x0000512F, 0x000019C0,\n    0x0000512E, 0x00002300, 0x000700F5, 0x00000017, 0x0000370D, 0x00005471,\n    0x000019C0, 0x00004CD7, 0x00002300, 0x000300F7, 0x00005310, 0x00000002,\n    0x000400FA, 0x000043D9, 0x00005228, 0x0000577E, 0x000200F8, 0x0000577E,\n    0x000300F7, 0x00005BA6, 0x00000000, 0x001300FB, 0x00002180, 0x00006033,\n    0x00000000, 0x00003E86, 0x00000001, 0x00003E86, 0x00000002, 0x00003843,\n    0x0000000A, 0x00003843, 0x00000003, 0x000059C0, 0x0000000C, 0x000059C0,\n    0x00000004, 0x000052C8, 0x00000006, 0x00002035, 0x000200F8, 0x00002035,\n    0x00050051, 0x0000000B, 0x00005F58, 0x0000370D, 0x00000000, 0x0006000C,\n    0x00000015, 0x00006069, 0x00000001, 0x0000003E, 0x00005F58, 0x00050051,\n    0x0000000D, 0x000022A0, 0x00006069, 0x00000000, 0x00050051, 0x0000000B,\n    0x00001DBB, 0x0000370D, 0x00000001, 0x0006000C, 0x00000015, 0x00003CFD,\n    0x00000001, 0x0000003E, 0x00001DBB, 0x00050051, 0x0000000D, 0x000022A1,\n    0x00003CFD, 0x00000000, 0x00050051, 0x0000000B, 0x00001DBC, 0x0000370D,\n    0x00000002, 0x0006000C, 0x00000015, 0x00003CFE, 0x00000001, 0x0000003E,\n    0x00001DBC, 0x00050051, 0x0000000D, 0x000022A2, 0x00003CFE, 0x00000000,\n    0x00050051, 0x0000000B, 0x00001DBD, 0x0000370D, 0x00000003, 0x0006000C,\n    0x00000015, 0x00003CE6, 0x00000001, 0x0000003E, 0x00001DBD, 0x00050051,\n    0x0000000D, 0x00002824, 0x00003CE6, 0x00000000, 0x00070050, 0x0000001D,\n    0x00005EBB, 0x000022A0, 0x000022A1, 0x000022A2, 0x00002824, 0x00050051,\n    0x0000000B, 0x0000437C, 0x00002BCD, 0x00000000, 0x0006000C, 0x00000015,\n    0x0000466D, 0x00000001, 0x0000003E, 0x0000437C, 0x00050051, 0x0000000D,\n    0x000022A3, 0x0000466D, 0x00000000, 0x00050051, 0x0000000B, 0x00001DBE,\n    0x00002BCD, 0x00000001, 0x0006000C, 0x00000015, 0x00003CFF, 0x00000001,\n    0x0000003E, 0x00001DBE, 0x00050051, 0x0000000D, 0x000022A4, 0x00003CFF,\n    0x00000000, 0x00050051, 0x0000000B, 0x00001DBF, 0x00002BCD, 0x00000002,\n    0x0006000C, 0x00000015, 0x00003D00, 0x00000001, 0x0000003E, 0x00001DBF,\n    0x00050051, 0x0000000D, 0x000022A5, 0x00003D00, 0x00000000, 0x00050051,\n    0x0000000B, 0x00001DC0, 0x00002BCD, 0x00000003, 0x0006000C, 0x00000015,\n    0x00003CE7, 0x00000001, 0x0000003E, 0x00001DC0, 0x00050051, 0x0000000D,\n    0x0000349C, 0x00003CE7, 0x00000000, 0x00070050, 0x0000001D, 0x000048F8,\n    0x000022A3, 0x000022A4, 0x000022A5, 0x0000349C, 0x000200F9, 0x00005BA6,\n    0x000200F8, 0x000052C8, 0x0004007C, 0x0000001A, 0x000060F6, 0x0000370D,\n    0x000500C4, 0x0000001A, 0x00005820, 0x000060F6, 0x00000302, 0x000500C3,\n    0x0000001A, 0x0000409C, 0x00005820, 0x00000302, 0x0004006F, 0x0000001D,\n    0x00002A9B, 0x0000409C, 0x0005008E, 0x0000001D, 0x00004A7A, 0x00002A9B,\n    0x000007FE, 0x0007000C, 0x0000001D, 0x00004982, 0x00000001, 0x00000028,\n    0x00000504, 0x00004A7A, 0x0004007C, 0x0000001A, 0x000027E7, 0x00002BCD,\n    0x000500C4, 0x0000001A, 0x000021A3, 0x000027E7, 0x00000302, 0x000500C3,\n    0x0000001A, 0x0000409D, 0x000021A3, 0x00000302, 0x0004006F, 0x0000001D,\n    0x00002A9C, 0x0000409D, 0x0005008E, 0x0000001D, 0x000053C1, 0x00002A9C,\n    0x000007FE, 0x0007000C, 0x0000001D, 0x00004364, 0x00000001, 0x00000028,\n    0x00000504, 0x000053C1, 0x000200F9, 0x00005BA6, 0x000200F8, 0x000059C0,\n    0x000600A9, 0x0000000B, 0x00004C09, 0x00001D33, 0x00000A46, 0x00000A0A,\n    0x00070050, 0x00000017, 0x000023B3, 0x00004C09, 0x00004C09, 0x00004C09,\n    0x00004C09, 0x000500C2, 0x00000017, 0x00005D49, 0x0000370D, 0x000023B3,\n    0x000500C7, 0x00000017, 0x00005DE7, 0x00005D49, 0x000003A1, 0x000500C7,\n    0x00000017, 0x0000489E, 0x00005D49, 0x000002D1, 0x000500C2, 0x00000017,\n    0x00005B92, 0x00005DE7, 0x00000107, 0x000500AA, 0x00000013, 0x000040CB,\n    0x00005B92, 0x00000B50, 0x0006000C, 0x0000001A, 0x00002C4D, 0x00000001,\n    0x0000004B, 0x0000489E, 0x0004007C, 0x00000017, 0x00002A17, 0x00002C4D,\n    0x00050082, 0x00000017, 0x0000187C, 0x00000107, 0x00002A17, 0x00050080,\n    0x00000017, 0x00002212, 0x00002A17, 0x00000A0F, 0x000600A9, 0x00000017,\n    0x00002871, 0x000040CB, 0x00002212, 0x00005B92, 0x000500C4, 0x00000017,\n    0x00005AD6, 0x0000489E, 0x0000187C, 0x000500C7, 0x00000017, 0x0000499C,\n    0x00005AD6, 0x000002D1, 0x000600A9, 0x00000017, 0x00002A9F, 0x000040CB,\n    0x0000499C, 0x0000489E, 0x00050080, 0x00000017, 0x00005FFB, 0x00002871,\n    0x0000022F, 0x000500C4, 0x00000017, 0x00004F81, 0x00005FFB, 0x00000467,\n    0x000500C4, 0x00000017, 0x00003FA8, 0x00002A9F, 0x000002ED, 0x000500C5,\n    0x00000017, 0x0000577F, 0x00004F81, 0x00003FA8, 0x000500AA, 0x00000013,\n    0x00003602, 0x00005DE7, 0x00000B50, 0x000600A9, 0x00000017, 0x00004243,\n    0x00003602, 0x00000B50, 0x0000577F, 0x0004007C, 0x0000001D, 0x00003045,\n    0x00004243, 0x000500C2, 0x00000017, 0x0000603F, 0x00002BCD, 0x000023B3,\n    0x000500C7, 0x00000017, 0x00003922, 0x0000603F, 0x000003A1, 0x000500C7,\n    0x00000017, 0x0000489F, 0x0000603F, 0x000002D1, 0x000500C2, 0x00000017,\n    0x00005B93, 0x00003922, 0x00000107, 0x000500AA, 0x00000013, 0x000040CC,\n    0x00005B93, 0x00000B50, 0x0006000C, 0x0000001A, 0x00002C4E, 0x00000001,\n    0x0000004B, 0x0000489F, 0x0004007C, 0x00000017, 0x00002A18, 0x00002C4E,\n    0x00050082, 0x00000017, 0x0000187D, 0x00000107, 0x00002A18, 0x00050080,\n    0x00000017, 0x00002213, 0x00002A18, 0x00000A0F, 0x000600A9, 0x00000017,\n    0x00002872, 0x000040CC, 0x00002213, 0x00005B93, 0x000500C4, 0x00000017,\n    0x00005AD7, 0x0000489F, 0x0000187D, 0x000500C7, 0x00000017, 0x0000499D,\n    0x00005AD7, 0x000002D1, 0x000600A9, 0x00000017, 0x00002AA0, 0x000040CC,\n    0x0000499D, 0x0000489F, 0x00050080, 0x00000017, 0x00005FFC, 0x00002872,\n    0x0000022F, 0x000500C4, 0x00000017, 0x00004F82, 0x00005FFC, 0x00000467,\n    0x000500C4, 0x00000017, 0x00003FA9, 0x00002AA0, 0x000002ED, 0x000500C5,\n    0x00000017, 0x00005780, 0x00004F82, 0x00003FA9, 0x000500AA, 0x00000013,\n    0x00003603, 0x00003922, 0x00000B50, 0x000600A9, 0x00000017, 0x00004658,\n    0x00003603, 0x00000B50, 0x00005780, 0x0004007C, 0x0000001D, 0x0000593C,\n    0x00004658, 0x000200F9, 0x00005BA6, 0x000200F8, 0x00003843, 0x000600A9,\n    0x0000000B, 0x00004C0A, 0x00001D33, 0x00000A46, 0x00000A0A, 0x00070050,\n    0x00000017, 0x000023B4, 0x00004C0A, 0x00004C0A, 0x00004C0A, 0x00004C0A,\n    0x000500C2, 0x00000017, 0x000056D5, 0x0000370D, 0x000023B4, 0x000500C7,\n    0x00000017, 0x00004A58, 0x000056D5, 0x000003A1, 0x00040070, 0x0000001D,\n    0x00003F07, 0x00004A58, 0x0005008E, 0x0000001D, 0x0000521C, 0x00003F07,\n    0x000006FE, 0x000500C2, 0x00000017, 0x00001E44, 0x00002BCD, 0x000023B4,\n    0x000500C7, 0x00000017, 0x00002BD6, 0x00001E44, 0x000003A1, 0x00040070,\n    0x0000001D, 0x0000431C, 0x00002BD6, 0x0005008E, 0x0000001D, 0x00003094,\n    0x0000431C, 0x000006FE, 0x000200F9, 0x00005BA6, 0x000200F8, 0x00003E86,\n    0x000600A9, 0x0000000B, 0x00004C0B, 0x00001D33, 0x00000A3A, 0x00000A0A,\n    0x00070050, 0x00000017, 0x000023B5, 0x00004C0B, 0x00004C0B, 0x00004C0B,\n    0x00004C0B, 0x000500C2, 0x00000017, 0x000056D6, 0x0000370D, 0x000023B5,\n    0x000500C7, 0x00000017, 0x00004A59, 0x000056D6, 0x0000064B, 0x00040070,\n    0x0000001D, 0x00003F08, 0x00004A59, 0x0005008E, 0x0000001D, 0x0000521D,\n    0x00003F08, 0x0000017A, 0x000500C2, 0x00000017, 0x00001E45, 0x00002BCD,\n    0x000023B5, 0x000500C7, 0x00000017, 0x00002BD7, 0x00001E45, 0x0000064B,\n    0x00040070, 0x0000001D, 0x0000431D, 0x00002BD7, 0x0005008E, 0x0000001D,\n    0x00003095, 0x0000431D, 0x0000017A, 0x000200F9, 0x00005BA6, 0x000200F8,\n    0x00006033, 0x0004007C, 0x0000001D, 0x00004B21, 0x0000370D, 0x0004007C,\n    0x0000001D, 0x000038B4, 0x00002BCD, 0x000200F9, 0x00005BA6, 0x000200F8,\n    0x00005BA6, 0x000F00F5, 0x0000001D, 0x00002BF5, 0x000038B4, 0x00006033,\n    0x00003095, 0x00003E86, 0x00003094, 0x00003843, 0x0000593C, 0x000059C0,\n    0x00004364, 0x000052C8, 0x000048F8, 0x00002035, 0x000F00F5, 0x0000001D,\n    0x00003590, 0x00004B21, 0x00006033, 0x0000521D, 0x00003E86, 0x0000521C,\n    0x00003843, 0x00003045, 0x000059C0, 0x00004982, 0x000052C8, 0x00005EBB,\n    0x00002035, 0x000200F9, 0x00005310, 0x000200F8, 0x00005228, 0x000300F7,\n    0x00005BA7, 0x00000000, 0x000700FB, 0x00002180, 0x000030EE, 0x00000005,\n    0x000052C9, 0x00000007, 0x00002036, 0x000200F8, 0x00002036, 0x00050051,\n    0x0000000B, 0x00005F5B, 0x0000370D, 0x00000000, 0x0006000C, 0x00000015,\n    0x0000606A, 0x00000001, 0x0000003E, 0x00005F5B, 0x00050051, 0x0000000D,\n    0x000022A6, 0x0000606A, 0x00000000, 0x00050051, 0x0000000B, 0x00001DC1,\n    0x0000370D, 0x00000001, 0x0006000C, 0x00000015, 0x00003D01, 0x00000001,\n    0x0000003E, 0x00001DC1, 0x00050051, 0x0000000D, 0x000022A8, 0x00003D01,\n    0x00000000, 0x00050051, 0x0000000B, 0x00001DC2, 0x0000370D, 0x00000002,\n    0x0006000C, 0x00000015, 0x00003D02, 0x00000001, 0x0000003E, 0x00001DC2,\n    0x00050051, 0x0000000D, 0x000022A9, 0x00003D02, 0x00000000, 0x00050051,\n    0x0000000B, 0x00001DC3, 0x0000370D, 0x00000003, 0x0006000C, 0x00000015,\n    0x00003CE8, 0x00000001, 0x0000003E, 0x00001DC3, 0x00050051, 0x0000000D,\n    0x00002825, 0x00003CE8, 0x00000000, 0x00070050, 0x0000001D, 0x00005EBC,\n    0x000022A6, 0x000022A8, 0x000022A9, 0x00002825, 0x00050051, 0x0000000B,\n    0x0000437D, 0x00002BCD, 0x00000000, 0x0006000C, 0x00000015, 0x0000466E,\n    0x00000001, 0x0000003E, 0x0000437D, 0x00050051, 0x0000000D, 0x000022AA,\n    0x0000466E, 0x00000000, 0x00050051, 0x0000000B, 0x00001DC4, 0x00002BCD,\n    0x00000001, 0x0006000C, 0x00000015, 0x00003D03, 0x00000001, 0x0000003E,\n    0x00001DC4, 0x00050051, 0x0000000D, 0x000022AB, 0x00003D03, 0x00000000,\n    0x00050051, 0x0000000B, 0x00001DC5, 0x00002BCD, 0x00000002, 0x0006000C,\n    0x00000015, 0x00003D04, 0x00000001, 0x0000003E, 0x00001DC5, 0x00050051,\n    0x0000000D, 0x000022AC, 0x00003D04, 0x00000000, 0x00050051, 0x0000000B,\n    0x00001DC6, 0x00002BCD, 0x00000003, 0x0006000C, 0x00000015, 0x00003CE9,\n    0x00000001, 0x0000003E, 0x00001DC6, 0x00050051, 0x0000000D, 0x0000349D,\n    0x00003CE9, 0x00000000, 0x00070050, 0x0000001D, 0x000048F9, 0x000022AA,\n    0x000022AB, 0x000022AC, 0x0000349D, 0x000200F9, 0x00005BA7, 0x000200F8,\n    0x000052C9, 0x0004007C, 0x0000001A, 0x000060F7, 0x0000370D, 0x000500C4,\n    0x0000001A, 0x00005821, 0x000060F7, 0x00000302, 0x000500C3, 0x0000001A,\n    0x0000409E, 0x00005821, 0x00000302, 0x0004006F, 0x0000001D, 0x00002AA1,\n    0x0000409E, 0x0005008E, 0x0000001D, 0x00004A7B, 0x00002AA1, 0x000007FE,\n    0x0007000C, 0x0000001D, 0x00004983, 0x00000001, 0x00000028, 0x00000504,\n    0x00004A7B, 0x0004007C, 0x0000001A, 0x000027E8, 0x00002BCD, 0x000500C4,\n    0x0000001A, 0x000021A4, 0x000027E8, 0x00000302, 0x000500C3, 0x0000001A,\n    0x0000409F, 0x000021A4, 0x00000302, 0x0004006F, 0x0000001D, 0x00002AA2,\n    0x0000409F, 0x0005008E, 0x0000001D, 0x000053C2, 0x00002AA2, 0x000007FE,\n    0x0007000C, 0x0000001D, 0x00004365, 0x00000001, 0x00000028, 0x00000504,\n    0x000053C2, 0x000200F9, 0x00005BA7, 0x000200F8, 0x000030EE, 0x0004007C,\n    0x0000001D, 0x00004B22, 0x0000370D, 0x0004007C, 0x0000001D, 0x000038B5,\n    0x00002BCD, 0x000200F9, 0x00005BA7, 0x000200F8, 0x00005BA7, 0x000900F5,\n    0x0000001D, 0x00002BF6, 0x000038B5, 0x000030EE, 0x00004365, 0x000052C9,\n    0x000048F9, 0x00002036, 0x000900F5, 0x0000001D, 0x00003591, 0x00004B22,\n    0x000030EE, 0x00004983, 0x000052C9, 0x00005EBC, 0x00002036, 0x000200F9,\n    0x00005310, 0x000200F8, 0x00005310, 0x000700F5, 0x0000001D, 0x0000230B,\n    0x00002BF6, 0x00005BA7, 0x00002BF5, 0x00005BA6, 0x000700F5, 0x0000001D,\n    0x00004C8A, 0x00003591, 0x00005BA7, 0x00003590, 0x00005BA6, 0x00050081,\n    0x0000001D, 0x000046B0, 0x000036E3, 0x00004C8A, 0x00050081, 0x0000001D,\n    0x0000455A, 0x00002662, 0x0000230B, 0x000500AE, 0x00000009, 0x0000387D,\n    0x00003F4D, 0x00000A1C, 0x000300F7, 0x00005ED6, 0x00000002, 0x000400FA,\n    0x0000387D, 0x000026B1, 0x00005ED6, 0x000200F8, 0x000026B1, 0x000500C4,\n    0x0000000B, 0x000037B2, 0x00000A16, 0x000023AA, 0x00050085, 0x0000000D,\n    0x00002F3A, 0x00002B2C, 0x0000016E, 0x00050080, 0x0000000B, 0x000051FC,\n    0x00005E7C, 0x000037B2, 0x000300F7, 0x00004F25, 0x00000002, 0x000400FA,\n    0x000060B1, 0x000019C1, 0x00002301, 0x000200F8, 0x00002301, 0x000500C2,\n    0x0000000B, 0x00005632, 0x000051FC, 0x00000A11, 0x00060041, 0x00000289,\n    0x0000343D, 0x00000CC7, 0x00000A0B, 0x00005632, 0x0004003D, 0x0000000B,\n    0x00003AD6, 0x0000343D, 0x00050080, 0x0000000B, 0x00002147, 0x000051FC,\n    0x000030F7, 0x000500C2, 0x0000000B, 0x000054A8, 0x00002147, 0x00000A11,\n    0x00060041, 0x00000289, 0x00004CE7, 0x00000CC7, 0x00000A0B, 0x000054A8,\n    0x0004003D, 0x0000000B, 0x00003344, 0x00004CE7, 0x00050084, 0x0000000B,\n    0x000021F7, 0x00000A10, 0x000030F7, 0x00050080, 0x0000000B, 0x00005EC9,\n    0x000051FC, 0x000021F7, 0x000500C2, 0x0000000B, 0x000045EE, 0x00005EC9,\n    0x00000A11, 0x00060041, 0x00000289, 0x00004CE8, 0x00000CC7, 0x00000A0B,\n    0x000045EE, 0x0004003D, 0x0000000B, 0x00003345, 0x00004CE8, 0x00050084,\n    0x0000000B, 0x000021F8, 0x00000A13, 0x000030F7, 0x00050080, 0x0000000B,\n    0x00005ECA, 0x000051FC, 0x000021F8, 0x000500C2, 0x0000000B, 0x000045EF,\n    0x00005ECA, 0x00000A11, 0x00060041, 0x00000289, 0x00004905, 0x00000CC7,\n    0x00000A0B, 0x000045EF, 0x0004003D, 0x0000000B, 0x000056AC, 0x00004905,\n    0x00070050, 0x00000017, 0x00004CD8, 0x00003AD6, 0x00003344, 0x00003345,\n    0x000056AC, 0x00050084, 0x0000000B, 0x00004C2D, 0x00000A16, 0x000030F7,\n    0x00050080, 0x0000000B, 0x00002A47, 0x000051FC, 0x00004C2D, 0x000500C2,\n    0x0000000B, 0x000045F0, 0x00002A47, 0x00000A11, 0x00060041, 0x00000289,\n    0x00004CE9, 0x00000CC7, 0x00000A0B, 0x000045F0, 0x0004003D, 0x0000000B,\n    0x00003346, 0x00004CE9, 0x00050084, 0x0000000B, 0x000021F9, 0x00000A19,\n    0x000030F7, 0x00050080, 0x0000000B, 0x00005ECB, 0x000051FC, 0x000021F9,\n    0x000500C2, 0x0000000B, 0x000045F1, 0x00005ECB, 0x00000A11, 0x00060041,\n    0x00000289, 0x00004CEA, 0x00000CC7, 0x00000A0B, 0x000045F1, 0x0004003D,\n    0x0000000B, 0x00003347, 0x00004CEA, 0x00050084, 0x0000000B, 0x000021FA,\n    0x00000A1C, 0x000030F7, 0x00050080, 0x0000000B, 0x00005ECC, 0x000051FC,\n    0x000021FA, 0x000500C2, 0x0000000B, 0x000045F2, 0x00005ECC, 0x00000A11,\n    0x00060041, 0x00000289, 0x00004CEB, 0x00000CC7, 0x00000A0B, 0x000045F2,\n    0x0004003D, 0x0000000B, 0x00003348, 0x00004CEB, 0x00050084, 0x0000000B,\n    0x000021FB, 0x00000A1F, 0x000030F7, 0x00050080, 0x0000000B, 0x00005ECD,\n    0x000051FC, 0x000021FB, 0x000500C2, 0x0000000B, 0x000045F3, 0x00005ECD,\n    0x00000A11, 0x00060041, 0x00000289, 0x00004906, 0x00000CC7, 0x00000A0B,\n    0x000045F3, 0x0004003D, 0x0000000B, 0x00005F5C, 0x00004906, 0x00070050,\n    0x00000017, 0x00005130, 0x00003346, 0x00003347, 0x00003348, 0x00005F5C,\n    0x000200F9, 0x00004F25, 0x000200F8, 0x000019C1, 0x000500C2, 0x0000000B,\n    0x00005FA8, 0x000051FC, 0x00000A11, 0x00060041, 0x00000289, 0x0000343E,\n    0x00000CC7, 0x00000A0B, 0x00005FA8, 0x0004003D, 0x0000000B, 0x00003145,\n    0x0000343E, 0x00050080, 0x0000000B, 0x00002DB3, 0x00005FA8, 0x00000A0D,\n    0x00060041, 0x00000289, 0x00001907, 0x00000CC7, 0x00000A0B, 0x00002DB3,\n    0x0004003D, 0x0000000B, 0x00005C6A, 0x00001907, 0x00050080, 0x0000000B,\n    0x00002DB4, 0x00005FA8, 0x00000A10, 0x00060041, 0x00000289, 0x00001908,\n    0x00000CC7, 0x00000A0B, 0x00002DB4, 0x0004003D, 0x0000000B, 0x00005C6B,\n    0x00001908, 0x00050080, 0x0000000B, 0x00002DB5, 0x00005FA8, 0x00000A13,\n    0x00060041, 0x00000289, 0x00005FF2, 0x00000CC7, 0x00000A0B, 0x00002DB5,\n    0x0004003D, 0x0000000B, 0x00003702, 0x00005FF2, 0x00070050, 0x00000017,\n    0x00005472, 0x00003145, 0x00005C6A, 0x00005C6B, 0x00003702, 0x00050080,\n    0x0000000B, 0x00004B85, 0x000051FC, 0x00000A3A, 0x000500C2, 0x0000000B,\n    0x0000202F, 0x00004B85, 0x00000A11, 0x00060041, 0x00000289, 0x00004C93,\n    0x00000CC7, 0x00000A0B, 0x0000202F, 0x0004003D, 0x0000000B, 0x00003146,\n    0x00004C93, 0x00050080, 0x0000000B, 0x00002DB6, 0x0000202F, 0x00000A0D,\n    0x00060041, 0x00000289, 0x00001909, 0x00000CC7, 0x00000A0B, 0x00002DB6,\n    0x0004003D, 0x0000000B, 0x00005C6C, 0x00001909, 0x00050080, 0x0000000B,\n    0x00002DB7, 0x0000202F, 0x00000A10, 0x00060041, 0x00000289, 0x0000190A,\n    0x00000CC7, 0x00000A0B, 0x00002DB7, 0x0004003D, 0x0000000B, 0x00005C6D,\n    0x0000190A, 0x00050080, 0x0000000B, 0x00002DB8, 0x0000202F, 0x00000A13,\n    0x00060041, 0x00000289, 0x00005FF3, 0x00000CC7, 0x00000A0B, 0x00002DB8,\n    0x0004003D, 0x0000000B, 0x00003FFD, 0x00005FF3, 0x00070050, 0x00000017,\n    0x00005131, 0x00003146, 0x00005C6C, 0x00005C6D, 0x00003FFD, 0x000200F9,\n    0x00004F25, 0x000200F8, 0x00004F25, 0x000700F5, 0x00000017, 0x00002BCE,\n    0x00005131, 0x000019C1, 0x00005130, 0x00002301, 0x000700F5, 0x00000017,\n    0x0000370E, 0x00005472, 0x000019C1, 0x00004CD8, 0x00002301, 0x000300F7,\n    0x00005311, 0x00000002, 0x000400FA, 0x000043D9, 0x00005229, 0x00005781,\n    0x000200F8, 0x00005781, 0x000300F7, 0x00005BA8, 0x00000000, 0x001300FB,\n    0x00002180, 0x00006034, 0x00000000, 0x00003E87, 0x00000001, 0x00003E87,\n    0x00000002, 0x00003844, 0x0000000A, 0x00003844, 0x00000003, 0x000059C1,\n    0x0000000C, 0x000059C1, 0x00000004, 0x000052CA, 0x00000006, 0x00002037,\n    0x000200F8, 0x00002037, 0x00050051, 0x0000000B, 0x00005F5D, 0x0000370E,\n    0x00000000, 0x0006000C, 0x00000015, 0x0000606B, 0x00000001, 0x0000003E,\n    0x00005F5D, 0x00050051, 0x0000000D, 0x000022AD, 0x0000606B, 0x00000000,\n    0x00050051, 0x0000000B, 0x00001DC7, 0x0000370E, 0x00000001, 0x0006000C,\n    0x00000015, 0x00003D05, 0x00000001, 0x0000003E, 0x00001DC7, 0x00050051,\n    0x0000000D, 0x000022AE, 0x00003D05, 0x00000000, 0x00050051, 0x0000000B,\n    0x00001DC8, 0x0000370E, 0x00000002, 0x0006000C, 0x00000015, 0x00003D06,\n    0x00000001, 0x0000003E, 0x00001DC8, 0x00050051, 0x0000000D, 0x000022AF,\n    0x00003D06, 0x00000000, 0x00050051, 0x0000000B, 0x00001DC9, 0x0000370E,\n    0x00000003, 0x0006000C, 0x00000015, 0x00003CEA, 0x00000001, 0x0000003E,\n    0x00001DC9, 0x00050051, 0x0000000D, 0x00002826, 0x00003CEA, 0x00000000,\n    0x00070050, 0x0000001D, 0x00005EBD, 0x000022AD, 0x000022AE, 0x000022AF,\n    0x00002826, 0x00050051, 0x0000000B, 0x0000437E, 0x00002BCE, 0x00000000,\n    0x0006000C, 0x00000015, 0x0000466F, 0x00000001, 0x0000003E, 0x0000437E,\n    0x00050051, 0x0000000D, 0x000022B0, 0x0000466F, 0x00000000, 0x00050051,\n    0x0000000B, 0x00001DCA, 0x00002BCE, 0x00000001, 0x0006000C, 0x00000015,\n    0x00003D07, 0x00000001, 0x0000003E, 0x00001DCA, 0x00050051, 0x0000000D,\n    0x000022B1, 0x00003D07, 0x00000000, 0x00050051, 0x0000000B, 0x00001DCB,\n    0x00002BCE, 0x00000002, 0x0006000C, 0x00000015, 0x00003D08, 0x00000001,\n    0x0000003E, 0x00001DCB, 0x00050051, 0x0000000D, 0x000022B2, 0x00003D08,\n    0x00000000, 0x00050051, 0x0000000B, 0x00001DCC, 0x00002BCE, 0x00000003,\n    0x0006000C, 0x00000015, 0x00003CEB, 0x00000001, 0x0000003E, 0x00001DCC,\n    0x00050051, 0x0000000D, 0x0000349E, 0x00003CEB, 0x00000000, 0x00070050,\n    0x0000001D, 0x000048FA, 0x000022B0, 0x000022B1, 0x000022B2, 0x0000349E,\n    0x000200F9, 0x00005BA8, 0x000200F8, 0x000052CA, 0x0004007C, 0x0000001A,\n    0x000060F8, 0x0000370E, 0x000500C4, 0x0000001A, 0x00005822, 0x000060F8,\n    0x00000302, 0x000500C3, 0x0000001A, 0x000040A0, 0x00005822, 0x00000302,\n    0x0004006F, 0x0000001D, 0x00002AA3, 0x000040A0, 0x0005008E, 0x0000001D,\n    0x00004A7C, 0x00002AA3, 0x000007FE, 0x0007000C, 0x0000001D, 0x00004984,\n    0x00000001, 0x00000028, 0x00000504, 0x00004A7C, 0x0004007C, 0x0000001A,\n    0x000027E9, 0x00002BCE, 0x000500C4, 0x0000001A, 0x000021A5, 0x000027E9,\n    0x00000302, 0x000500C3, 0x0000001A, 0x000040A1, 0x000021A5, 0x00000302,\n    0x0004006F, 0x0000001D, 0x00002AA4, 0x000040A1, 0x0005008E, 0x0000001D,\n    0x000053C3, 0x00002AA4, 0x000007FE, 0x0007000C, 0x0000001D, 0x00004366,\n    0x00000001, 0x00000028, 0x00000504, 0x000053C3, 0x000200F9, 0x00005BA8,\n    0x000200F8, 0x000059C1, 0x000600A9, 0x0000000B, 0x00004C0C, 0x00001D33,\n    0x00000A46, 0x00000A0A, 0x00070050, 0x00000017, 0x000023B6, 0x00004C0C,\n    0x00004C0C, 0x00004C0C, 0x00004C0C, 0x000500C2, 0x00000017, 0x00005D4A,\n    0x0000370E, 0x000023B6, 0x000500C7, 0x00000017, 0x00005DE8, 0x00005D4A,\n    0x000003A1, 0x000500C7, 0x00000017, 0x000048A0, 0x00005D4A, 0x000002D1,\n    0x000500C2, 0x00000017, 0x00005B94, 0x00005DE8, 0x00000107, 0x000500AA,\n    0x00000013, 0x000040CD, 0x00005B94, 0x00000B50, 0x0006000C, 0x0000001A,\n    0x00002C4F, 0x00000001, 0x0000004B, 0x000048A0, 0x0004007C, 0x00000017,\n    0x00002A19, 0x00002C4F, 0x00050082, 0x00000017, 0x0000187E, 0x00000107,\n    0x00002A19, 0x00050080, 0x00000017, 0x00002214, 0x00002A19, 0x00000A0F,\n    0x000600A9, 0x00000017, 0x00002873, 0x000040CD, 0x00002214, 0x00005B94,\n    0x000500C4, 0x00000017, 0x00005AD8, 0x000048A0, 0x0000187E, 0x000500C7,\n    0x00000017, 0x0000499E, 0x00005AD8, 0x000002D1, 0x000600A9, 0x00000017,\n    0x00002AA5, 0x000040CD, 0x0000499E, 0x000048A0, 0x00050080, 0x00000017,\n    0x00005FFD, 0x00002873, 0x0000022F, 0x000500C4, 0x00000017, 0x00004F83,\n    0x00005FFD, 0x00000467, 0x000500C4, 0x00000017, 0x00003FAA, 0x00002AA5,\n    0x000002ED, 0x000500C5, 0x00000017, 0x00005782, 0x00004F83, 0x00003FAA,\n    0x000500AA, 0x00000013, 0x00003604, 0x00005DE8, 0x00000B50, 0x000600A9,\n    0x00000017, 0x00004244, 0x00003604, 0x00000B50, 0x00005782, 0x0004007C,\n    0x0000001D, 0x00003046, 0x00004244, 0x000500C2, 0x00000017, 0x00006040,\n    0x00002BCE, 0x000023B6, 0x000500C7, 0x00000017, 0x00003923, 0x00006040,\n    0x000003A1, 0x000500C7, 0x00000017, 0x000048A1, 0x00006040, 0x000002D1,\n    0x000500C2, 0x00000017, 0x00005B95, 0x00003923, 0x00000107, 0x000500AA,\n    0x00000013, 0x000040CE, 0x00005B95, 0x00000B50, 0x0006000C, 0x0000001A,\n    0x00002C50, 0x00000001, 0x0000004B, 0x000048A1, 0x0004007C, 0x00000017,\n    0x00002A1A, 0x00002C50, 0x00050082, 0x00000017, 0x0000187F, 0x00000107,\n    0x00002A1A, 0x00050080, 0x00000017, 0x00002215, 0x00002A1A, 0x00000A0F,\n    0x000600A9, 0x00000017, 0x00002874, 0x000040CE, 0x00002215, 0x00005B95,\n    0x000500C4, 0x00000017, 0x00005AD9, 0x000048A1, 0x0000187F, 0x000500C7,\n    0x00000017, 0x0000499F, 0x00005AD9, 0x000002D1, 0x000600A9, 0x00000017,\n    0x00002AA6, 0x000040CE, 0x0000499F, 0x000048A1, 0x00050080, 0x00000017,\n    0x00005FFE, 0x00002874, 0x0000022F, 0x000500C4, 0x00000017, 0x00004F84,\n    0x00005FFE, 0x00000467, 0x000500C4, 0x00000017, 0x00003FAB, 0x00002AA6,\n    0x000002ED, 0x000500C5, 0x00000017, 0x00005783, 0x00004F84, 0x00003FAB,\n    0x000500AA, 0x00000013, 0x00003605, 0x00003923, 0x00000B50, 0x000600A9,\n    0x00000017, 0x00004659, 0x00003605, 0x00000B50, 0x00005783, 0x0004007C,\n    0x0000001D, 0x0000593D, 0x00004659, 0x000200F9, 0x00005BA8, 0x000200F8,\n    0x00003844, 0x000600A9, 0x0000000B, 0x00004C0D, 0x00001D33, 0x00000A46,\n    0x00000A0A, 0x00070050, 0x00000017, 0x000023B7, 0x00004C0D, 0x00004C0D,\n    0x00004C0D, 0x00004C0D, 0x000500C2, 0x00000017, 0x000056D7, 0x0000370E,\n    0x000023B7, 0x000500C7, 0x00000017, 0x00004A5A, 0x000056D7, 0x000003A1,\n    0x00040070, 0x0000001D, 0x00003F09, 0x00004A5A, 0x0005008E, 0x0000001D,\n    0x0000521E, 0x00003F09, 0x000006FE, 0x000500C2, 0x00000017, 0x00001E46,\n    0x00002BCE, 0x000023B7, 0x000500C7, 0x00000017, 0x00002BD8, 0x00001E46,\n    0x000003A1, 0x00040070, 0x0000001D, 0x0000431E, 0x00002BD8, 0x0005008E,\n    0x0000001D, 0x00003096, 0x0000431E, 0x000006FE, 0x000200F9, 0x00005BA8,\n    0x000200F8, 0x00003E87, 0x000600A9, 0x0000000B, 0x00004C0E, 0x00001D33,\n    0x00000A3A, 0x00000A0A, 0x00070050, 0x00000017, 0x000023B8, 0x00004C0E,\n    0x00004C0E, 0x00004C0E, 0x00004C0E, 0x000500C2, 0x00000017, 0x000056D8,\n    0x0000370E, 0x000023B8, 0x000500C7, 0x00000017, 0x00004A5B, 0x000056D8,\n    0x0000064B, 0x00040070, 0x0000001D, 0x00003F0A, 0x00004A5B, 0x0005008E,\n    0x0000001D, 0x0000521F, 0x00003F0A, 0x0000017A, 0x000500C2, 0x00000017,\n    0x00001E47, 0x00002BCE, 0x000023B8, 0x000500C7, 0x00000017, 0x00002BD9,\n    0x00001E47, 0x0000064B, 0x00040070, 0x0000001D, 0x0000431F, 0x00002BD9,\n    0x0005008E, 0x0000001D, 0x00003097, 0x0000431F, 0x0000017A, 0x000200F9,\n    0x00005BA8, 0x000200F8, 0x00006034, 0x0004007C, 0x0000001D, 0x00004B23,\n    0x0000370E, 0x0004007C, 0x0000001D, 0x000038B6, 0x00002BCE, 0x000200F9,\n    0x00005BA8, 0x000200F8, 0x00005BA8, 0x000F00F5, 0x0000001D, 0x00002BF7,\n    0x000038B6, 0x00006034, 0x00003097, 0x00003E87, 0x00003096, 0x00003844,\n    0x0000593D, 0x000059C1, 0x00004366, 0x000052CA, 0x000048FA, 0x00002037,\n    0x000F00F5, 0x0000001D, 0x00003592, 0x00004B23, 0x00006034, 0x0000521F,\n    0x00003E87, 0x0000521E, 0x00003844, 0x00003046, 0x000059C1, 0x00004984,\n    0x000052CA, 0x00005EBD, 0x00002037, 0x000200F9, 0x00005311, 0x000200F8,\n    0x00005229, 0x000300F7, 0x00005BA9, 0x00000000, 0x000700FB, 0x00002180,\n    0x000030EF, 0x00000005, 0x000052CB, 0x00000007, 0x00002038, 0x000200F8,\n    0x00002038, 0x00050051, 0x0000000B, 0x00005F5E, 0x0000370E, 0x00000000,\n    0x0006000C, 0x00000015, 0x0000606C, 0x00000001, 0x0000003E, 0x00005F5E,\n    0x00050051, 0x0000000D, 0x000022B3, 0x0000606C, 0x00000000, 0x00050051,\n    0x0000000B, 0x00001DCD, 0x0000370E, 0x00000001, 0x0006000C, 0x00000015,\n    0x00003D09, 0x00000001, 0x0000003E, 0x00001DCD, 0x00050051, 0x0000000D,\n    0x000022B4, 0x00003D09, 0x00000000, 0x00050051, 0x0000000B, 0x00001DCE,\n    0x0000370E, 0x00000002, 0x0006000C, 0x00000015, 0x00003D0A, 0x00000001,\n    0x0000003E, 0x00001DCE, 0x00050051, 0x0000000D, 0x000022B5, 0x00003D0A,\n    0x00000000, 0x00050051, 0x0000000B, 0x00001DCF, 0x0000370E, 0x00000003,\n    0x0006000C, 0x00000015, 0x00003CEC, 0x00000001, 0x0000003E, 0x00001DCF,\n    0x00050051, 0x0000000D, 0x00002827, 0x00003CEC, 0x00000000, 0x00070050,\n    0x0000001D, 0x00005ECE, 0x000022B3, 0x000022B4, 0x000022B5, 0x00002827,\n    0x00050051, 0x0000000B, 0x0000437F, 0x00002BCE, 0x00000000, 0x0006000C,\n    0x00000015, 0x00004670, 0x00000001, 0x0000003E, 0x0000437F, 0x00050051,\n    0x0000000D, 0x000022B6, 0x00004670, 0x00000000, 0x00050051, 0x0000000B,\n    0x00001DD0, 0x00002BCE, 0x00000001, 0x0006000C, 0x00000015, 0x00003D0C,\n    0x00000001, 0x0000003E, 0x00001DD0, 0x00050051, 0x0000000D, 0x000022B7,\n    0x00003D0C, 0x00000000, 0x00050051, 0x0000000B, 0x00001DD1, 0x00002BCE,\n    0x00000002, 0x0006000C, 0x00000015, 0x00003D0D, 0x00000001, 0x0000003E,\n    0x00001DD1, 0x00050051, 0x0000000D, 0x000022B8, 0x00003D0D, 0x00000000,\n    0x00050051, 0x0000000B, 0x00001DD2, 0x00002BCE, 0x00000003, 0x0006000C,\n    0x00000015, 0x00003CED, 0x00000001, 0x0000003E, 0x00001DD2, 0x00050051,\n    0x0000000D, 0x0000349F, 0x00003CED, 0x00000000, 0x00070050, 0x0000001D,\n    0x000048FB, 0x000022B6, 0x000022B7, 0x000022B8, 0x0000349F, 0x000200F9,\n    0x00005BA9, 0x000200F8, 0x000052CB, 0x0004007C, 0x0000001A, 0x000060F9,\n    0x0000370E, 0x000500C4, 0x0000001A, 0x00005823, 0x000060F9, 0x00000302,\n    0x000500C3, 0x0000001A, 0x000040A2, 0x00005823, 0x00000302, 0x0004006F,\n    0x0000001D, 0x00002AA7, 0x000040A2, 0x0005008E, 0x0000001D, 0x00004A7D,\n    0x00002AA7, 0x000007FE, 0x0007000C, 0x0000001D, 0x00004985, 0x00000001,\n    0x00000028, 0x00000504, 0x00004A7D, 0x0004007C, 0x0000001A, 0x000027EA,\n    0x00002BCE, 0x000500C4, 0x0000001A, 0x000021A6, 0x000027EA, 0x00000302,\n    0x000500C3, 0x0000001A, 0x000040A3, 0x000021A6, 0x00000302, 0x0004006F,\n    0x0000001D, 0x00002AA8, 0x000040A3, 0x0005008E, 0x0000001D, 0x000053C4,\n    0x00002AA8, 0x000007FE, 0x0007000C, 0x0000001D, 0x00004367, 0x00000001,\n    0x00000028, 0x00000504, 0x000053C4, 0x000200F9, 0x00005BA9, 0x000200F8,\n    0x000030EF, 0x0004007C, 0x0000001D, 0x00004B24, 0x0000370E, 0x0004007C,\n    0x0000001D, 0x000038B7, 0x00002BCE, 0x000200F9, 0x00005BA9, 0x000200F8,\n    0x00005BA9, 0x000900F5, 0x0000001D, 0x00002BF8, 0x000038B7, 0x000030EF,\n    0x00004367, 0x000052CB, 0x000048FB, 0x00002038, 0x000900F5, 0x0000001D,\n    0x00003593, 0x00004B24, 0x000030EF, 0x00004985, 0x000052CB, 0x00005ECE,\n    0x00002038, 0x000200F9, 0x00005311, 0x000200F8, 0x00005311, 0x000700F5,\n    0x0000001D, 0x0000230C, 0x00002BF8, 0x00005BA9, 0x00002BF7, 0x00005BA8,\n    0x000700F5, 0x0000001D, 0x00004C8B, 0x00003593, 0x00005BA9, 0x00003592,\n    0x00005BA8, 0x00050081, 0x0000001D, 0x00004346, 0x000046B0, 0x00004C8B,\n    0x00050081, 0x0000001D, 0x000019F1, 0x0000455A, 0x0000230C, 0x00050080,\n    0x0000000B, 0x00003FF8, 0x00005E78, 0x000037B2, 0x000300F7, 0x00004F26,\n    0x00000002, 0x000400FA, 0x000060B1, 0x000019C2, 0x00002302, 0x000200F8,\n    0x00002302, 0x000500C2, 0x0000000B, 0x00005633, 0x00003FF8, 0x00000A11,\n    0x00060041, 0x00000289, 0x0000343F, 0x00000CC7, 0x00000A0B, 0x00005633,\n    0x0004003D, 0x0000000B, 0x00003AD7, 0x0000343F, 0x00050080, 0x0000000B,\n    0x00002148, 0x00003FF8, 0x000030F7, 0x000500C2, 0x0000000B, 0x000054A9,\n    0x00002148, 0x00000A11, 0x00060041, 0x00000289, 0x00004CEC, 0x00000CC7,\n    0x00000A0B, 0x000054A9, 0x0004003D, 0x0000000B, 0x00003349, 0x00004CEC,\n    0x00050084, 0x0000000B, 0x000021FC, 0x00000A10, 0x000030F7, 0x00050080,\n    0x0000000B, 0x00005ECF, 0x00003FF8, 0x000021FC, 0x000500C2, 0x0000000B,\n    0x000045F4, 0x00005ECF, 0x00000A11, 0x00060041, 0x00000289, 0x00004CED,\n    0x00000CC7, 0x00000A0B, 0x000045F4, 0x0004003D, 0x0000000B, 0x0000334A,\n    0x00004CED, 0x00050084, 0x0000000B, 0x000021FD, 0x00000A13, 0x000030F7,\n    0x00050080, 0x0000000B, 0x00005ED0, 0x00003FF8, 0x000021FD, 0x000500C2,\n    0x0000000B, 0x000045F5, 0x00005ED0, 0x00000A11, 0x00060041, 0x00000289,\n    0x00004907, 0x00000CC7, 0x00000A0B, 0x000045F5, 0x0004003D, 0x0000000B,\n    0x000056AD, 0x00004907, 0x00070050, 0x00000017, 0x00004CD9, 0x00003AD7,\n    0x00003349, 0x0000334A, 0x000056AD, 0x00050084, 0x0000000B, 0x00004C2E,\n    0x00000A16, 0x000030F7, 0x00050080, 0x0000000B, 0x00002A48, 0x00003FF8,\n    0x00004C2E, 0x000500C2, 0x0000000B, 0x000045F6, 0x00002A48, 0x00000A11,\n    0x00060041, 0x00000289, 0x00004CEE, 0x00000CC7, 0x00000A0B, 0x000045F6,\n    0x0004003D, 0x0000000B, 0x0000334B, 0x00004CEE, 0x00050084, 0x0000000B,\n    0x000021FE, 0x00000A19, 0x000030F7, 0x00050080, 0x0000000B, 0x00005ED1,\n    0x00003FF8, 0x000021FE, 0x000500C2, 0x0000000B, 0x000045F7, 0x00005ED1,\n    0x00000A11, 0x00060041, 0x00000289, 0x00004CEF, 0x00000CC7, 0x00000A0B,\n    0x000045F7, 0x0004003D, 0x0000000B, 0x0000334C, 0x00004CEF, 0x00050084,\n    0x0000000B, 0x000021FF, 0x00000A1C, 0x000030F7, 0x00050080, 0x0000000B,\n    0x00005ED2, 0x00003FF8, 0x000021FF, 0x000500C2, 0x0000000B, 0x000045F8,\n    0x00005ED2, 0x00000A11, 0x00060041, 0x00000289, 0x00004CF0, 0x00000CC7,\n    0x00000A0B, 0x000045F8, 0x0004003D, 0x0000000B, 0x0000334D, 0x00004CF0,\n    0x00050084, 0x0000000B, 0x00002200, 0x00000A1F, 0x000030F7, 0x00050080,\n    0x0000000B, 0x00005ED3, 0x00003FF8, 0x00002200, 0x000500C2, 0x0000000B,\n    0x000045F9, 0x00005ED3, 0x00000A11, 0x00060041, 0x00000289, 0x00004908,\n    0x00000CC7, 0x00000A0B, 0x000045F9, 0x0004003D, 0x0000000B, 0x00005F5F,\n    0x00004908, 0x00070050, 0x00000017, 0x00005132, 0x0000334B, 0x0000334C,\n    0x0000334D, 0x00005F5F, 0x000200F9, 0x00004F26, 0x000200F8, 0x000019C2,\n    0x000500C2, 0x0000000B, 0x00005FA9, 0x00003FF8, 0x00000A11, 0x00060041,\n    0x00000289, 0x00003440, 0x00000CC7, 0x00000A0B, 0x00005FA9, 0x0004003D,\n    0x0000000B, 0x00003147, 0x00003440, 0x00050080, 0x0000000B, 0x00002DB9,\n    0x00005FA9, 0x00000A0D, 0x00060041, 0x00000289, 0x0000190B, 0x00000CC7,\n    0x00000A0B, 0x00002DB9, 0x0004003D, 0x0000000B, 0x00005C6E, 0x0000190B,\n    0x00050080, 0x0000000B, 0x00002DBA, 0x00005FA9, 0x00000A10, 0x00060041,\n    0x00000289, 0x0000190C, 0x00000CC7, 0x00000A0B, 0x00002DBA, 0x0004003D,\n    0x0000000B, 0x00005C6F, 0x0000190C, 0x00050080, 0x0000000B, 0x00002DBB,\n    0x00005FA9, 0x00000A13, 0x00060041, 0x00000289, 0x00005FF4, 0x00000CC7,\n    0x00000A0B, 0x00002DBB, 0x0004003D, 0x0000000B, 0x00003703, 0x00005FF4,\n    0x00070050, 0x00000017, 0x00005473, 0x00003147, 0x00005C6E, 0x00005C6F,\n    0x00003703, 0x00050080, 0x0000000B, 0x00004B86, 0x00003FF8, 0x00000A3A,\n    0x000500C2, 0x0000000B, 0x00002030, 0x00004B86, 0x00000A11, 0x00060041,\n    0x00000289, 0x00004C94, 0x00000CC7, 0x00000A0B, 0x00002030, 0x0004003D,\n    0x0000000B, 0x00003148, 0x00004C94, 0x00050080, 0x0000000B, 0x00002DBC,\n    0x00002030, 0x00000A0D, 0x00060041, 0x00000289, 0x0000190D, 0x00000CC7,\n    0x00000A0B, 0x00002DBC, 0x0004003D, 0x0000000B, 0x00005C70, 0x0000190D,\n    0x00050080, 0x0000000B, 0x00002DBD, 0x00002030, 0x00000A10, 0x00060041,\n    0x00000289, 0x0000190E, 0x00000CC7, 0x00000A0B, 0x00002DBD, 0x0004003D,\n    0x0000000B, 0x00005C71, 0x0000190E, 0x00050080, 0x0000000B, 0x00002DBE,\n    0x00002030, 0x00000A13, 0x00060041, 0x00000289, 0x00005FF5, 0x00000CC7,\n    0x00000A0B, 0x00002DBE, 0x0004003D, 0x0000000B, 0x00003FFE, 0x00005FF5,\n    0x00070050, 0x00000017, 0x00005133, 0x00003148, 0x00005C70, 0x00005C71,\n    0x00003FFE, 0x000200F9, 0x00004F26, 0x000200F8, 0x00004F26, 0x000700F5,\n    0x00000017, 0x00002BCF, 0x00005133, 0x000019C2, 0x00005132, 0x00002302,\n    0x000700F5, 0x00000017, 0x0000370F, 0x00005473, 0x000019C2, 0x00004CD9,\n    0x00002302, 0x000300F7, 0x00005312, 0x00000002, 0x000400FA, 0x000043D9,\n    0x0000522A, 0x00005784, 0x000200F8, 0x00005784, 0x000300F7, 0x00005BAA,\n    0x00000000, 0x001300FB, 0x00002180, 0x00006035, 0x00000000, 0x00003E88,\n    0x00000001, 0x00003E88, 0x00000002, 0x00003845, 0x0000000A, 0x00003845,\n    0x00000003, 0x000059C2, 0x0000000C, 0x000059C2, 0x00000004, 0x000052CC,\n    0x00000006, 0x00002039, 0x000200F8, 0x00002039, 0x00050051, 0x0000000B,\n    0x00005F60, 0x0000370F, 0x00000000, 0x0006000C, 0x00000015, 0x0000606D,\n    0x00000001, 0x0000003E, 0x00005F60, 0x00050051, 0x0000000D, 0x000022B9,\n    0x0000606D, 0x00000000, 0x00050051, 0x0000000B, 0x00001DD3, 0x0000370F,\n    0x00000001, 0x0006000C, 0x00000015, 0x00003D0E, 0x00000001, 0x0000003E,\n    0x00001DD3, 0x00050051, 0x0000000D, 0x000022BA, 0x00003D0E, 0x00000000,\n    0x00050051, 0x0000000B, 0x00001DD4, 0x0000370F, 0x00000002, 0x0006000C,\n    0x00000015, 0x00003D0F, 0x00000001, 0x0000003E, 0x00001DD4, 0x00050051,\n    0x0000000D, 0x000022BB, 0x00003D0F, 0x00000000, 0x00050051, 0x0000000B,\n    0x00001DD5, 0x0000370F, 0x00000003, 0x0006000C, 0x00000015, 0x00003CEE,\n    0x00000001, 0x0000003E, 0x00001DD5, 0x00050051, 0x0000000D, 0x00002828,\n    0x00003CEE, 0x00000000, 0x00070050, 0x0000001D, 0x00005ED4, 0x000022B9,\n    0x000022BA, 0x000022BB, 0x00002828, 0x00050051, 0x0000000B, 0x00004380,\n    0x00002BCF, 0x00000000, 0x0006000C, 0x00000015, 0x00004671, 0x00000001,\n    0x0000003E, 0x00004380, 0x00050051, 0x0000000D, 0x000022BC, 0x00004671,\n    0x00000000, 0x00050051, 0x0000000B, 0x00001DD6, 0x00002BCF, 0x00000001,\n    0x0006000C, 0x00000015, 0x00003D10, 0x00000001, 0x0000003E, 0x00001DD6,\n    0x00050051, 0x0000000D, 0x000022BD, 0x00003D10, 0x00000000, 0x00050051,\n    0x0000000B, 0x00001DD7, 0x00002BCF, 0x00000002, 0x0006000C, 0x00000015,\n    0x00003D11, 0x00000001, 0x0000003E, 0x00001DD7, 0x00050051, 0x0000000D,\n    0x000022BE, 0x00003D11, 0x00000000, 0x00050051, 0x0000000B, 0x00001DD8,\n    0x00002BCF, 0x00000003, 0x0006000C, 0x00000015, 0x00003CEF, 0x00000001,\n    0x0000003E, 0x00001DD8, 0x00050051, 0x0000000D, 0x000034A0, 0x00003CEF,\n    0x00000000, 0x00070050, 0x0000001D, 0x000048FC, 0x000022BC, 0x000022BD,\n    0x000022BE, 0x000034A0, 0x000200F9, 0x00005BAA, 0x000200F8, 0x000052CC,\n    0x0004007C, 0x0000001A, 0x000060FA, 0x0000370F, 0x000500C4, 0x0000001A,\n    0x00005824, 0x000060FA, 0x00000302, 0x000500C3, 0x0000001A, 0x000040A4,\n    0x00005824, 0x00000302, 0x0004006F, 0x0000001D, 0x00002AA9, 0x000040A4,\n    0x0005008E, 0x0000001D, 0x00004A7E, 0x00002AA9, 0x000007FE, 0x0007000C,\n    0x0000001D, 0x00004986, 0x00000001, 0x00000028, 0x00000504, 0x00004A7E,\n    0x0004007C, 0x0000001A, 0x000027EB, 0x00002BCF, 0x000500C4, 0x0000001A,\n    0x000021A7, 0x000027EB, 0x00000302, 0x000500C3, 0x0000001A, 0x000040A5,\n    0x000021A7, 0x00000302, 0x0004006F, 0x0000001D, 0x00002AAA, 0x000040A5,\n    0x0005008E, 0x0000001D, 0x000053C5, 0x00002AAA, 0x000007FE, 0x0007000C,\n    0x0000001D, 0x00004368, 0x00000001, 0x00000028, 0x00000504, 0x000053C5,\n    0x000200F9, 0x00005BAA, 0x000200F8, 0x000059C2, 0x000600A9, 0x0000000B,\n    0x00004C0F, 0x00001D33, 0x00000A46, 0x00000A0A, 0x00070050, 0x00000017,\n    0x000023B9, 0x00004C0F, 0x00004C0F, 0x00004C0F, 0x00004C0F, 0x000500C2,\n    0x00000017, 0x00005D4B, 0x0000370F, 0x000023B9, 0x000500C7, 0x00000017,\n    0x00005DE9, 0x00005D4B, 0x000003A1, 0x000500C7, 0x00000017, 0x000048A2,\n    0x00005D4B, 0x000002D1, 0x000500C2, 0x00000017, 0x00005B96, 0x00005DE9,\n    0x00000107, 0x000500AA, 0x00000013, 0x000040CF, 0x00005B96, 0x00000B50,\n    0x0006000C, 0x0000001A, 0x00002C51, 0x00000001, 0x0000004B, 0x000048A2,\n    0x0004007C, 0x00000017, 0x00002A1B, 0x00002C51, 0x00050082, 0x00000017,\n    0x00001880, 0x00000107, 0x00002A1B, 0x00050080, 0x00000017, 0x00002216,\n    0x00002A1B, 0x00000A0F, 0x000600A9, 0x00000017, 0x00002875, 0x000040CF,\n    0x00002216, 0x00005B96, 0x000500C4, 0x00000017, 0x00005ADA, 0x000048A2,\n    0x00001880, 0x000500C7, 0x00000017, 0x000049A0, 0x00005ADA, 0x000002D1,\n    0x000600A9, 0x00000017, 0x00002AAB, 0x000040CF, 0x000049A0, 0x000048A2,\n    0x00050080, 0x00000017, 0x00005FFF, 0x00002875, 0x0000022F, 0x000500C4,\n    0x00000017, 0x00004F85, 0x00005FFF, 0x00000467, 0x000500C4, 0x00000017,\n    0x00003FAC, 0x00002AAB, 0x000002ED, 0x000500C5, 0x00000017, 0x00005785,\n    0x00004F85, 0x00003FAC, 0x000500AA, 0x00000013, 0x00003606, 0x00005DE9,\n    0x00000B50, 0x000600A9, 0x00000017, 0x00004245, 0x00003606, 0x00000B50,\n    0x00005785, 0x0004007C, 0x0000001D, 0x00003047, 0x00004245, 0x000500C2,\n    0x00000017, 0x00006041, 0x00002BCF, 0x000023B9, 0x000500C7, 0x00000017,\n    0x00003924, 0x00006041, 0x000003A1, 0x000500C7, 0x00000017, 0x000048A3,\n    0x00006041, 0x000002D1, 0x000500C2, 0x00000017, 0x00005B97, 0x00003924,\n    0x00000107, 0x000500AA, 0x00000013, 0x000040D0, 0x00005B97, 0x00000B50,\n    0x0006000C, 0x0000001A, 0x00002C52, 0x00000001, 0x0000004B, 0x000048A3,\n    0x0004007C, 0x00000017, 0x00002A1C, 0x00002C52, 0x00050082, 0x00000017,\n    0x00001881, 0x00000107, 0x00002A1C, 0x00050080, 0x00000017, 0x00002217,\n    0x00002A1C, 0x00000A0F, 0x000600A9, 0x00000017, 0x00002876, 0x000040D0,\n    0x00002217, 0x00005B97, 0x000500C4, 0x00000017, 0x00005ADB, 0x000048A3,\n    0x00001881, 0x000500C7, 0x00000017, 0x000049A1, 0x00005ADB, 0x000002D1,\n    0x000600A9, 0x00000017, 0x00002AAD, 0x000040D0, 0x000049A1, 0x000048A3,\n    0x00050080, 0x00000017, 0x00006000, 0x00002876, 0x0000022F, 0x000500C4,\n    0x00000017, 0x00004F86, 0x00006000, 0x00000467, 0x000500C4, 0x00000017,\n    0x00003FAD, 0x00002AAD, 0x000002ED, 0x000500C5, 0x00000017, 0x00005786,\n    0x00004F86, 0x00003FAD, 0x000500AA, 0x00000013, 0x00003607, 0x00003924,\n    0x00000B50, 0x000600A9, 0x00000017, 0x0000465A, 0x00003607, 0x00000B50,\n    0x00005786, 0x0004007C, 0x0000001D, 0x0000593E, 0x0000465A, 0x000200F9,\n    0x00005BAA, 0x000200F8, 0x00003845, 0x000600A9, 0x0000000B, 0x00004C10,\n    0x00001D33, 0x00000A46, 0x00000A0A, 0x00070050, 0x00000017, 0x000023BA,\n    0x00004C10, 0x00004C10, 0x00004C10, 0x00004C10, 0x000500C2, 0x00000017,\n    0x000056D9, 0x0000370F, 0x000023BA, 0x000500C7, 0x00000017, 0x00004A5C,\n    0x000056D9, 0x000003A1, 0x00040070, 0x0000001D, 0x00003F0B, 0x00004A5C,\n    0x0005008E, 0x0000001D, 0x00005220, 0x00003F0B, 0x000006FE, 0x000500C2,\n    0x00000017, 0x00001E48, 0x00002BCF, 0x000023BA, 0x000500C7, 0x00000017,\n    0x00002BDA, 0x00001E48, 0x000003A1, 0x00040070, 0x0000001D, 0x00004320,\n    0x00002BDA, 0x0005008E, 0x0000001D, 0x00003098, 0x00004320, 0x000006FE,\n    0x000200F9, 0x00005BAA, 0x000200F8, 0x00003E88, 0x000600A9, 0x0000000B,\n    0x00004C11, 0x00001D33, 0x00000A3A, 0x00000A0A, 0x00070050, 0x00000017,\n    0x000023BB, 0x00004C11, 0x00004C11, 0x00004C11, 0x00004C11, 0x000500C2,\n    0x00000017, 0x000056DA, 0x0000370F, 0x000023BB, 0x000500C7, 0x00000017,\n    0x00004A5D, 0x000056DA, 0x0000064B, 0x00040070, 0x0000001D, 0x00003F0C,\n    0x00004A5D, 0x0005008E, 0x0000001D, 0x00005221, 0x00003F0C, 0x0000017A,\n    0x000500C2, 0x00000017, 0x00001E49, 0x00002BCF, 0x000023BB, 0x000500C7,\n    0x00000017, 0x00002BDB, 0x00001E49, 0x0000064B, 0x00040070, 0x0000001D,\n    0x00004321, 0x00002BDB, 0x0005008E, 0x0000001D, 0x00003099, 0x00004321,\n    0x0000017A, 0x000200F9, 0x00005BAA, 0x000200F8, 0x00006035, 0x0004007C,\n    0x0000001D, 0x00004B25, 0x0000370F, 0x0004007C, 0x0000001D, 0x000038B8,\n    0x00002BCF, 0x000200F9, 0x00005BAA, 0x000200F8, 0x00005BAA, 0x000F00F5,\n    0x0000001D, 0x00002BF9, 0x000038B8, 0x00006035, 0x00003099, 0x00003E88,\n    0x00003098, 0x00003845, 0x0000593E, 0x000059C2, 0x00004368, 0x000052CC,\n    0x000048FC, 0x00002039, 0x000F00F5, 0x0000001D, 0x00003594, 0x00004B25,\n    0x00006035, 0x00005221, 0x00003E88, 0x00005220, 0x00003845, 0x00003047,\n    0x000059C2, 0x00004986, 0x000052CC, 0x00005ED4, 0x00002039, 0x000200F9,\n    0x00005312, 0x000200F8, 0x0000522A, 0x000300F7, 0x00005BAB, 0x00000000,\n    0x000700FB, 0x00002180, 0x000030F0, 0x00000005, 0x000052CD, 0x00000007,\n    0x0000203A, 0x000200F8, 0x0000203A, 0x00050051, 0x0000000B, 0x00005F61,\n    0x0000370F, 0x00000000, 0x0006000C, 0x00000015, 0x0000606E, 0x00000001,\n    0x0000003E, 0x00005F61, 0x00050051, 0x0000000D, 0x000022BF, 0x0000606E,\n    0x00000000, 0x00050051, 0x0000000B, 0x00001DD9, 0x0000370F, 0x00000001,\n    0x0006000C, 0x00000015, 0x00003D12, 0x00000001, 0x0000003E, 0x00001DD9,\n    0x00050051, 0x0000000D, 0x000022C0, 0x00003D12, 0x00000000, 0x00050051,\n    0x0000000B, 0x00001DDA, 0x0000370F, 0x00000002, 0x0006000C, 0x00000015,\n    0x00003D13, 0x00000001, 0x0000003E, 0x00001DDA, 0x00050051, 0x0000000D,\n    0x000022C1, 0x00003D13, 0x00000000, 0x00050051, 0x0000000B, 0x00001DDB,\n    0x0000370F, 0x00000003, 0x0006000C, 0x00000015, 0x00003CF0, 0x00000001,\n    0x0000003E, 0x00001DDB, 0x00050051, 0x0000000D, 0x00002829, 0x00003CF0,\n    0x00000000, 0x00070050, 0x0000001D, 0x00005ED5, 0x000022BF, 0x000022C0,\n    0x000022C1, 0x00002829, 0x00050051, 0x0000000B, 0x00004381, 0x00002BCF,\n    0x00000000, 0x0006000C, 0x00000015, 0x00004672, 0x00000001, 0x0000003E,\n    0x00004381, 0x00050051, 0x0000000D, 0x000022C2, 0x00004672, 0x00000000,\n    0x00050051, 0x0000000B, 0x00001DDC, 0x00002BCF, 0x00000001, 0x0006000C,\n    0x00000015, 0x00003D14, 0x00000001, 0x0000003E, 0x00001DDC, 0x00050051,\n    0x0000000D, 0x000022C3, 0x00003D14, 0x00000000, 0x00050051, 0x0000000B,\n    0x00001DDD, 0x00002BCF, 0x00000002, 0x0006000C, 0x00000015, 0x00003D15,\n    0x00000001, 0x0000003E, 0x00001DDD, 0x00050051, 0x0000000D, 0x000022C4,\n    0x00003D15, 0x00000000, 0x00050051, 0x0000000B, 0x00001DDE, 0x00002BCF,\n    0x00000003, 0x0006000C, 0x00000015, 0x00003CF1, 0x00000001, 0x0000003E,\n    0x00001DDE, 0x00050051, 0x0000000D, 0x000034A1, 0x00003CF1, 0x00000000,\n    0x00070050, 0x0000001D, 0x000048FD, 0x000022C2, 0x000022C3, 0x000022C4,\n    0x000034A1, 0x000200F9, 0x00005BAB, 0x000200F8, 0x000052CD, 0x0004007C,\n    0x0000001A, 0x000060FB, 0x0000370F, 0x000500C4, 0x0000001A, 0x00005825,\n    0x000060FB, 0x00000302, 0x000500C3, 0x0000001A, 0x000040A6, 0x00005825,\n    0x00000302, 0x0004006F, 0x0000001D, 0x00002AAE, 0x000040A6, 0x0005008E,\n    0x0000001D, 0x00004A7F, 0x00002AAE, 0x000007FE, 0x0007000C, 0x0000001D,\n    0x00004987, 0x00000001, 0x00000028, 0x00000504, 0x00004A7F, 0x0004007C,\n    0x0000001A, 0x000027EC, 0x00002BCF, 0x000500C4, 0x0000001A, 0x000021A8,\n    0x000027EC, 0x00000302, 0x000500C3, 0x0000001A, 0x000040A7, 0x000021A8,\n    0x00000302, 0x0004006F, 0x0000001D, 0x00002AAF, 0x000040A7, 0x0005008E,\n    0x0000001D, 0x000053C6, 0x00002AAF, 0x000007FE, 0x0007000C, 0x0000001D,\n    0x00004369, 0x00000001, 0x00000028, 0x00000504, 0x000053C6, 0x000200F9,\n    0x00005BAB, 0x000200F8, 0x000030F0, 0x0004007C, 0x0000001D, 0x00004B26,\n    0x0000370F, 0x0004007C, 0x0000001D, 0x000038B9, 0x00002BCF, 0x000200F9,\n    0x00005BAB, 0x000200F8, 0x00005BAB, 0x000900F5, 0x0000001D, 0x00002BFA,\n    0x000038B9, 0x000030F0, 0x00004369, 0x000052CD, 0x000048FD, 0x0000203A,\n    0x000900F5, 0x0000001D, 0x00003595, 0x00004B26, 0x000030F0, 0x00004987,\n    0x000052CD, 0x00005ED5, 0x0000203A, 0x000200F9, 0x00005312, 0x000200F8,\n    0x00005312, 0x000700F5, 0x0000001D, 0x0000230D, 0x00002BFA, 0x00005BAB,\n    0x00002BF9, 0x00005BAA, 0x000700F5, 0x0000001D, 0x00004C8C, 0x00003595,\n    0x00005BAB, 0x00003594, 0x00005BAA, 0x00050081, 0x0000001D, 0x00004C41,\n    0x00004346, 0x00004C8C, 0x00050081, 0x0000001D, 0x00005D3D, 0x000019F1,\n    0x0000230D, 0x000200F9, 0x00005ED6, 0x000200F8, 0x00005ED6, 0x000700F5,\n    0x0000001D, 0x00002BA7, 0x0000455A, 0x00005310, 0x00005D3D, 0x00005312,\n    0x000700F5, 0x0000001D, 0x00003854, 0x000046B0, 0x00005310, 0x00004C41,\n    0x00005312, 0x000700F5, 0x0000000D, 0x000038BA, 0x000061FB, 0x00005310,\n    0x00002F3A, 0x00005312, 0x000200F9, 0x00005313, 0x000200F8, 0x00005313,\n    0x000700F5, 0x0000001D, 0x00002BA8, 0x00002662, 0x0000530F, 0x00002BA7,\n    0x00005ED6, 0x000700F5, 0x0000001D, 0x00003063, 0x000036E3, 0x0000530F,\n    0x00003854, 0x00005ED6, 0x000700F5, 0x0000000D, 0x00002EA8, 0x00002B2C,\n    0x0000530F, 0x000038BA, 0x00005ED6, 0x0005008E, 0x0000001D, 0x00005C88,\n    0x00003063, 0x00002EA8, 0x0005008E, 0x0000001D, 0x00005360, 0x00002BA8,\n    0x00002EA8, 0x000500AA, 0x00000009, 0x00001C08, 0x00005FB2, 0x00000A0A,\n    0x000600A9, 0x00000009, 0x00003477, 0x00001C08, 0x00000787, 0x00001C08,\n    0x000300F7, 0x00004CC1, 0x00000002, 0x000400FA, 0x00003477, 0x00002620,\n    0x00004CC1, 0x000200F8, 0x00002620, 0x00050051, 0x0000000D, 0x00005002,\n    0x00005C88, 0x00000001, 0x00060052, 0x0000001D, 0x000037FF, 0x00005002,\n    0x00005C88, 0x00000000, 0x000200F9, 0x00004CC1, 0x000200F8, 0x00004CC1,\n    0x000700F5, 0x0000001D, 0x0000305F, 0x00005C88, 0x00005313, 0x000037FF,\n    0x00002620, 0x00050080, 0x00000011, 0x000032A7, 0x00002670, 0x000059EC,\n    0x000300F7, 0x000052F5, 0x00000002, 0x000400FA, 0x000048EB, 0x0000294E,\n    0x0000537D, 0x000200F8, 0x0000537D, 0x0004007C, 0x00000012, 0x00002970,\n    0x000032A7, 0x00050051, 0x0000000C, 0x000045FA, 0x00002970, 0x00000001,\n    0x000500C3, 0x0000000C, 0x00004DC0, 0x000045FA, 0x00000A1A, 0x0004007C,\n    0x0000000C, 0x00005787, 0x000020FC, 0x00050084, 0x0000000C, 0x00001F02,\n    0x00004DC0, 0x00005787, 0x00050051, 0x0000000C, 0x00006242, 0x00002970,\n    0x00000000, 0x000500C3, 0x0000000C, 0x00004FC7, 0x00006242, 0x00000A1A,\n    0x00050080, 0x0000000C, 0x000049B0, 0x00001F02, 0x00004FC7, 0x000500C4,\n    0x0000000C, 0x0000254A, 0x000049B0, 0x00000A1D, 0x000500C3, 0x0000000C,\n    0x0000603B, 0x000045FA, 0x00000A0E, 0x000500C7, 0x0000000C, 0x0000539A,\n    0x0000603B, 0x00000A20, 0x000500C4, 0x0000000C, 0x0000534A, 0x0000539A,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x00004EA5, 0x00006242, 0x00000A20,\n    0x000500C5, 0x0000000C, 0x000025C2, 0x0000534A, 0x00004EA5, 0x000500C5,\n    0x0000000C, 0x000029DF, 0x0000254A, 0x000025C2, 0x0004007C, 0x0000000C,\n    0x00002804, 0x000029DF, 0x000500C3, 0x0000000C, 0x00004C7C, 0x000045FA,\n    0x00000A17, 0x000500C7, 0x0000000C, 0x00003B3B, 0x00004C7C, 0x00000A0E,\n    0x000500C3, 0x0000000C, 0x000028A6, 0x00006242, 0x00000A14, 0x000500C7,\n    0x0000000C, 0x0000511E, 0x000028A6, 0x00000A14, 0x000500C3, 0x0000000C,\n    0x000028B9, 0x000045FA, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000505E,\n    0x000028B9, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000541D, 0x0000505E,\n    0x00000A0E, 0x000500C6, 0x0000000C, 0x000022C5, 0x0000511E, 0x0000541D,\n    0x000500C7, 0x0000000C, 0x00005076, 0x000045FA, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x0000522B, 0x00005076, 0x00000A17, 0x000500C4, 0x0000000C,\n    0x00001997, 0x000022C5, 0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FE,\n    0x0000522B, 0x00001997, 0x000500C4, 0x0000000C, 0x00001C00, 0x00003B3B,\n    0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C81, 0x000047FE, 0x00001C00,\n    0x000500C7, 0x0000000C, 0x000050AF, 0x00002804, 0x00000A38, 0x000500C5,\n    0x0000000C, 0x00003C70, 0x00003C81, 0x000050AF, 0x000500C3, 0x0000000C,\n    0x00003745, 0x00002804, 0x00000A17, 0x000500C7, 0x0000000C, 0x000018B8,\n    0x00003745, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000547E, 0x000018B8,\n    0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A8, 0x00003C70, 0x0000547E,\n    0x000500C3, 0x0000000C, 0x00003A6E, 0x00002804, 0x00000A1A, 0x000500C7,\n    0x0000000C, 0x000018B9, 0x00003A6E, 0x00000A20, 0x000500C4, 0x0000000C,\n    0x0000547F, 0x000018B9, 0x00000A23, 0x000500C5, 0x0000000C, 0x0000456F,\n    0x000045A8, 0x0000547F, 0x000500C3, 0x0000000C, 0x00003C88, 0x00002804,\n    0x00000A23, 0x000500C4, 0x0000000C, 0x0000282A, 0x00003C88, 0x00000A2F,\n    0x000500C5, 0x0000000C, 0x00003B79, 0x0000456F, 0x0000282A, 0x0004007C,\n    0x0000000B, 0x000041E5, 0x00003B79, 0x000200F9, 0x000052F5, 0x000200F8,\n    0x0000294E, 0x00050051, 0x0000000B, 0x00004D9A, 0x000032A7, 0x00000000,\n    0x00050051, 0x0000000B, 0x00002C03, 0x000032A7, 0x00000001, 0x00060050,\n    0x00000014, 0x000020DE, 0x00004D9A, 0x00002C03, 0x00004408, 0x0004007C,\n    0x00000016, 0x00004E9D, 0x000020DE, 0x00050051, 0x0000000C, 0x00002BFB,\n    0x00004E9D, 0x00000002, 0x000500C3, 0x0000000C, 0x00004DC1, 0x00002BFB,\n    0x00000A11, 0x0004007C, 0x0000000C, 0x00005788, 0x00006273, 0x00050084,\n    0x0000000C, 0x00001F03, 0x00004DC1, 0x00005788, 0x00050051, 0x0000000C,\n    0x00006243, 0x00004E9D, 0x00000001, 0x000500C3, 0x0000000C, 0x00004A6F,\n    0x00006243, 0x00000A17, 0x00050080, 0x0000000C, 0x00002B2D, 0x00001F03,\n    0x00004A6F, 0x0004007C, 0x0000000C, 0x00004202, 0x000020FC, 0x00050084,\n    0x0000000C, 0x00003A60, 0x00002B2D, 0x00004202, 0x00050051, 0x0000000C,\n    0x00006244, 0x00004E9D, 0x00000000, 0x000500C3, 0x0000000C, 0x00004FC8,\n    0x00006244, 0x00000A1A, 0x00050080, 0x0000000C, 0x000049FC, 0x00003A60,\n    0x00004FC8, 0x000500C4, 0x0000000C, 0x0000225D, 0x000049FC, 0x00000A20,\n    0x000500C7, 0x0000000C, 0x00002CAA, 0x00002BFB, 0x00000A14, 0x000500C4,\n    0x0000000C, 0x00004CAE, 0x00002CAA, 0x00000A1A, 0x000500C3, 0x0000000C,\n    0x0000383E, 0x00006243, 0x00000A0E, 0x000500C7, 0x0000000C, 0x00005374,\n    0x0000383E, 0x00000A14, 0x000500C4, 0x0000000C, 0x000054CA, 0x00005374,\n    0x00000A14, 0x000500C5, 0x0000000C, 0x000042CE, 0x00004CAE, 0x000054CA,\n    0x000500C7, 0x0000000C, 0x000050D5, 0x00006244, 0x00000A20, 0x000500C5,\n    0x0000000C, 0x00003585, 0x000042CE, 0x000050D5, 0x000500C5, 0x0000000C,\n    0x000029E0, 0x0000225D, 0x00003585, 0x0004007C, 0x0000000C, 0x000027F1,\n    0x000029E0, 0x000500C3, 0x0000000C, 0x00004D75, 0x00006243, 0x00000A14,\n    0x000500C6, 0x0000000C, 0x0000583C, 0x00004D75, 0x00004DC1, 0x000500C7,\n    0x0000000C, 0x00004199, 0x0000583C, 0x00000A0E, 0x000500C3, 0x0000000C,\n    0x00002590, 0x00006244, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000505F,\n    0x00002590, 0x00000A14, 0x000500C4, 0x0000000C, 0x0000541E, 0x00004199,\n    0x00000A0E, 0x000500C6, 0x0000000C, 0x000022C6, 0x0000505F, 0x0000541E,\n    0x000500C7, 0x0000000C, 0x00005077, 0x00006243, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x0000522D, 0x00005077, 0x00000A17, 0x000500C4, 0x0000000C,\n    0x00001998, 0x000022C6, 0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FF,\n    0x0000522D, 0x00001998, 0x000500C4, 0x0000000C, 0x00001C01, 0x00004199,\n    0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C82, 0x000047FF, 0x00001C01,\n    0x000500C7, 0x0000000C, 0x000050B0, 0x000027F1, 0x00000A38, 0x000500C5,\n    0x0000000C, 0x00003C71, 0x00003C82, 0x000050B0, 0x000500C3, 0x0000000C,\n    0x00003746, 0x000027F1, 0x00000A17, 0x000500C7, 0x0000000C, 0x000018BA,\n    0x00003746, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005480, 0x000018BA,\n    0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A9, 0x00003C71, 0x00005480,\n    0x000500C3, 0x0000000C, 0x00003A6F, 0x000027F1, 0x00000A1A, 0x000500C7,\n    0x0000000C, 0x000018BB, 0x00003A6F, 0x00000A20, 0x000500C4, 0x0000000C,\n    0x00005481, 0x000018BB, 0x00000A23, 0x000500C5, 0x0000000C, 0x00004570,\n    0x000045A9, 0x00005481, 0x000500C3, 0x0000000C, 0x00003C89, 0x000027F1,\n    0x00000A23, 0x000500C4, 0x0000000C, 0x0000282B, 0x00003C89, 0x00000A2F,\n    0x000500C5, 0x0000000C, 0x00003B7A, 0x00004570, 0x0000282B, 0x0004007C,\n    0x0000000B, 0x000041E6, 0x00003B7A, 0x000200F9, 0x000052F5, 0x000200F8,\n    0x000052F5, 0x000700F5, 0x0000000B, 0x00002C70, 0x000041E6, 0x0000294E,\n    0x000041E5, 0x0000537D, 0x00050080, 0x0000000B, 0x000044F9, 0x00002C70,\n    0x00005EAD, 0x000500C2, 0x0000000B, 0x00005DC7, 0x000044F9, 0x00000A14,\n    0x0008000C, 0x0000001D, 0x00005E5A, 0x00000001, 0x0000002B, 0x0000305F,\n    0x00000B7A, 0x00000505, 0x0005008E, 0x0000001D, 0x00002371, 0x00005E5A,\n    0x00000540, 0x00050081, 0x0000001D, 0x00002E66, 0x00002371, 0x00000145,\n    0x0004006D, 0x00000017, 0x00001DDF, 0x00002E66, 0x00050051, 0x0000000B,\n    0x00002201, 0x00001DDF, 0x00000000, 0x00050051, 0x0000000B, 0x00002FDB,\n    0x00001DDF, 0x00000001, 0x000500C4, 0x0000000B, 0x00002D29, 0x00002FDB,\n    0x00000A23, 0x000500C5, 0x0000000B, 0x00004D66, 0x00002201, 0x00002D29,\n    0x00050051, 0x0000000B, 0x000053E4, 0x00001DDF, 0x00000002, 0x000500C4,\n    0x0000000B, 0x00002170, 0x000053E4, 0x00000A3B, 0x000500C5, 0x0000000B,\n    0x00004D67, 0x00004D66, 0x00002170, 0x00050051, 0x0000000B, 0x000053E5,\n    0x00001DDF, 0x00000003, 0x000500C4, 0x0000000B, 0x00001C7C, 0x000053E5,\n    0x00000A53, 0x000500C5, 0x0000000B, 0x00002427, 0x00004D67, 0x00001C7C,\n    0x0008000C, 0x0000001D, 0x00001D62, 0x00000001, 0x0000002B, 0x00005360,\n    0x00000B7A, 0x00000505, 0x0005008E, 0x0000001D, 0x00002048, 0x00001D62,\n    0x00000540, 0x00050081, 0x0000001D, 0x00002E67, 0x00002048, 0x00000145,\n    0x0004006D, 0x00000017, 0x00001DE0, 0x00002E67, 0x00050051, 0x0000000B,\n    0x00002202, 0x00001DE0, 0x00000000, 0x00050051, 0x0000000B, 0x00002FDC,\n    0x00001DE0, 0x00000001, 0x000500C4, 0x0000000B, 0x00002D2A, 0x00002FDC,\n    0x00000A23, 0x000500C5, 0x0000000B, 0x00004D68, 0x00002202, 0x00002D2A,\n    0x00050051, 0x0000000B, 0x000053E6, 0x00001DE0, 0x00000002, 0x000500C4,\n    0x0000000B, 0x00002171, 0x000053E6, 0x00000A3B, 0x000500C5, 0x0000000B,\n    0x00004D69, 0x00004D68, 0x00002171, 0x00050051, 0x0000000B, 0x000053E7,\n    0x00001DE0, 0x00000003, 0x000500C4, 0x0000000B, 0x0000215D, 0x000053E7,\n    0x00000A53, 0x000500C5, 0x0000000B, 0x0000445A, 0x00004D69, 0x0000215D,\n    0x00050050, 0x00000011, 0x00002D69, 0x00002427, 0x0000445A, 0x00060041,\n    0x0000028E, 0x00002312, 0x00001592, 0x00000A0B, 0x00005DC7, 0x0003003E,\n    0x00002312, 0x00002D69, 0x000200F9, 0x00004C7A, 0x000200F8, 0x00004C7A,\n    0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/resolve_full_8bpp_scaled_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25262\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 8 8 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_resolve_edram_info\"\n               OpMemberName %push_const_block_xe 1 \"xe_resolve_coordinate_info\"\n               OpMemberName %push_const_block_xe 2 \"xe_resolve_dest_info\"\n               OpMemberName %push_const_block_xe 3 \"xe_resolve_dest_coordinate_info\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %xe_resolve_edram_xe_block \"xe_resolve_edram_xe_block\"\n               OpMemberName %xe_resolve_edram_xe_block 0 \"data\"\n               OpName %xe_resolve_edram \"xe_resolve_edram\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_resolve_dest_xe_block \"xe_resolve_dest_xe_block\"\n               OpMemberName %xe_resolve_dest_xe_block 0 \"data\"\n               OpName %xe_resolve_dest \"xe_resolve_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpDecorate %_runtimearr_uint ArrayStride 4\n               OpDecorate %xe_resolve_edram_xe_block BufferBlock\n               OpMemberDecorate %xe_resolve_edram_xe_block 0 NonWritable\n               OpMemberDecorate %xe_resolve_edram_xe_block 0 Offset 0\n               OpDecorate %xe_resolve_edram NonWritable\n               OpDecorate %xe_resolve_edram Binding 0\n               OpDecorate %xe_resolve_edram DescriptorSet 0\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v2uint ArrayStride 8\n               OpDecorate %xe_resolve_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_resolve_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_resolve_dest_xe_block 0 Offset 0\n               OpDecorate %xe_resolve_dest NonReadable\n               OpDecorate %xe_resolve_dest Binding 0\n               OpDecorate %xe_resolve_dest DescriptorSet 1\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n     %v4uint = OpTypeVector %uint 4\n      %float = OpTypeFloat 32\n    %v4float = OpTypeVector %float 4\n       %bool = OpTypeBool\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n    %float_0 = OpConstant %float 0\n    %float_1 = OpConstant %float 1\n      %v4int = OpTypeVector %int 4\n  %float_255 = OpConstant %float 255\n  %float_0_5 = OpConstant %float 0.5\n     %uint_0 = OpConstant %uint 0\n     %uint_1 = OpConstant %uint 1\n      %int_8 = OpConstant %int 8\n     %uint_2 = OpConstant %uint 2\n     %int_16 = OpConstant %int 16\n     %uint_3 = OpConstant %uint 3\n     %int_24 = OpConstant %int 24\n   %uint_255 = OpConstant %uint 255\n%float_0_00392156886 = OpConstant %float 0.00392156886\n  %uint_1023 = OpConstant %uint 1023\n%float_0_000977517106 = OpConstant %float 0.000977517106\n   %uint_127 = OpConstant %uint 127\n     %uint_7 = OpConstant %uint 7\n     %v4bool = OpTypeVector %bool 4\n   %uint_124 = OpConstant %uint 124\n    %uint_23 = OpConstant %uint 23\n    %uint_16 = OpConstant %uint 16\n   %float_n1 = OpConstant %float -1\n%float_0_000976592302 = OpConstant %float 0.000976592302\n       %1837 = OpConstantComposite %v2uint %uint_2 %uint_1\n     %v2bool = OpTypeVector %bool 2\n       %1807 = OpConstantComposite %v2uint %uint_0 %uint_0\n       %1828 = OpConstantComposite %v2uint %uint_1 %uint_1\n       %1816 = OpConstantComposite %v2uint %uint_1 %uint_0\n    %uint_80 = OpConstant %uint 80\n       %2719 = OpConstantComposite %v2uint %uint_80 %uint_16\n  %uint_2048 = OpConstant %uint 2048\n      %int_2 = OpConstant %int 2\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n     %int_12 = OpConstant %int 12\n      %int_3 = OpConstant %int 3\n     %uint_5 = OpConstant %uint 5\n     %uint_4 = OpConstant %uint 4\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n    %uint_10 = OpConstant %uint 10\n    %uint_13 = OpConstant %uint 13\n  %uint_2047 = OpConstant %uint 2047\n    %uint_24 = OpConstant %uint 24\n    %uint_15 = OpConstant %uint 15\n    %uint_28 = OpConstant %uint 28\n    %uint_19 = OpConstant %uint 19\n       %2179 = OpConstantComposite %v2uint %uint_16 %uint_19\n%uint_536870912 = OpConstant %uint 536870912\n       %1855 = OpConstantComposite %v2uint %uint_0 %uint_4\n     %int_10 = OpConstant %int 10\n     %uint_8 = OpConstant %uint 8\n     %int_26 = OpConstant %int 26\n     %int_23 = OpConstant %int 23\n%uint_16777216 = OpConstant %uint 16777216\n    %uint_20 = OpConstant %uint 20\n       %2275 = OpConstantComposite %v2uint %uint_20 %uint_24\n     %v3uint = OpTypeVector %uint 3\n    %v2float = OpTypeVector %float 2\n%_runtimearr_uint = OpTypeRuntimeArray %uint\n%xe_resolve_edram_xe_block = OpTypeStruct %_runtimearr_uint\n%_ptr_Uniform_xe_resolve_edram_xe_block = OpTypePointer Uniform %xe_resolve_edram_xe_block\n%xe_resolve_edram = OpVariable %_ptr_Uniform_xe_resolve_edram_xe_block Uniform\n%_ptr_Uniform_uint = OpTypePointer Uniform %uint\n     %uint_6 = OpConstant %uint 6\n   %uint_320 = OpConstant %uint 320\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n%_ptr_Input_uint = OpTypePointer Input %uint\n       %1834 = OpConstantComposite %v2uint %uint_3 %uint_0\n%_runtimearr_v2uint = OpTypeRuntimeArray %v2uint\n%xe_resolve_dest_xe_block = OpTypeStruct %_runtimearr_v2uint\n%_ptr_Uniform_xe_resolve_dest_xe_block = OpTypePointer Uniform %xe_resolve_dest_xe_block\n%xe_resolve_dest = OpVariable %_ptr_Uniform_xe_resolve_dest_xe_block Uniform\n%_ptr_Uniform_v2uint = OpTypePointer Uniform %v2uint\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_8 %uint_8 %uint_1\n       %1954 = OpConstantComposite %v2uint %uint_7 %uint_7\n       %1955 = OpConstantComposite %v2uint %uint_15 %uint_1\n       %1870 = OpConstantComposite %v2uint %uint_3 %uint_3\n       %2122 = OpConstantComposite %v2uint %uint_15 %uint_15\n       %1284 = OpConstantComposite %v4float %float_n1 %float_n1 %float_n1 %float_n1\n        %770 = OpConstantComposite %v4int %int_16 %int_16 %int_16 %int_16\n       %1611 = OpConstantComposite %v4uint %uint_255 %uint_255 %uint_255 %uint_255\n        %929 = OpConstantComposite %v4uint %uint_1023 %uint_1023 %uint_1023 %uint_1023\n        %721 = OpConstantComposite %v4uint %uint_127 %uint_127 %uint_127 %uint_127\n        %263 = OpConstantComposite %v4uint %uint_7 %uint_7 %uint_7 %uint_7\n       %2896 = OpConstantComposite %v4uint %uint_0 %uint_0 %uint_0 %uint_0\n        %559 = OpConstantComposite %v4uint %uint_124 %uint_124 %uint_124 %uint_124\n       %1127 = OpConstantComposite %v4uint %uint_23 %uint_23 %uint_23 %uint_23\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n       %1879 = OpConstantComposite %v2uint %uint_4 %uint_3\n       %2026 = OpConstantComposite %v2uint %uint_15 %uint_7\n       %2938 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0\n       %1285 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1\n        %325 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_0_5\n%int_1065353216 = OpConstant %int 1065353216\n%uint_4294967290 = OpConstant %uint 4294967290\n       %2575 = OpConstantComposite %v4uint %uint_4294967290 %uint_4294967290 %uint_4294967290 %uint_4294967290\n %float_0_25 = OpConstant %float 0.25\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %22245 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %15627 = OpLoad %uint %22245\n      %22700 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %20824 = OpLoad %uint %22700\n      %20561 = OpBitwiseAnd %uint %15627 %uint_1023\n      %19978 = OpShiftRightLogical %uint %15627 %uint_10\n       %8574 = OpBitwiseAnd %uint %19978 %uint_3\n      %21002 = OpShiftRightLogical %uint %15627 %uint_13\n       %8575 = OpBitwiseAnd %uint %21002 %uint_2047\n      %21003 = OpShiftRightLogical %uint %15627 %uint_24\n       %8576 = OpBitwiseAnd %uint %21003 %uint_15\n      %18836 = OpShiftRightLogical %uint %15627 %uint_28\n       %9130 = OpBitwiseAnd %uint %18836 %uint_1\n       %8871 = OpCompositeConstruct %v2uint %20824 %20824\n       %9633 = OpShiftRightLogical %v2uint %8871 %2179\n      %23601 = OpBitwiseAnd %v2uint %9633 %1954\n      %24030 = OpBitwiseAnd %uint %15627 %uint_536870912\n      %12295 = OpINotEqual %bool %24030 %uint_0\n               OpSelectionMerge %14676 None\n               OpBranchConditional %12295 %16739 %21992\n      %21992 = OpLabel\n               OpBranch %14676\n      %16739 = OpLabel\n      %15278 = OpShiftRightLogical %v2uint %23601 %1828\n               OpBranch %14676\n      %14676 = OpLabel\n      %19124 = OpPhi %v2uint %15278 %16739 %1807 %21992\n       %7038 = OpShiftRightLogical %v2uint %8871 %1855\n      %11769 = OpBitwiseAnd %v2uint %7038 %1955\n      %16207 = OpShiftLeftLogical %v2uint %11769 %1870\n      %23019 = OpIMul %v2uint %16207 %23601\n      %13123 = OpShiftRightLogical %uint %20824 %uint_5\n      %14785 = OpBitwiseAnd %uint %13123 %uint_2047\n       %8858 = OpCompositeExtract %uint %23601 0\n      %22993 = OpIMul %uint %14785 %8858\n      %20036 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %18628 = OpLoad %uint %20036\n      %22701 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %20387 = OpLoad %uint %22701\n      %24445 = OpBitwiseAnd %uint %18628 %uint_8\n      %18667 = OpINotEqual %bool %24445 %uint_0\n       %8977 = OpShiftRightLogical %uint %18628 %uint_4\n      %17416 = OpBitwiseAnd %uint %8977 %uint_7\n      %22920 = OpBitcast %int %18628\n      %13711 = OpShiftLeftLogical %int %22920 %int_10\n      %20636 = OpShiftRightArithmetic %int %13711 %int_26\n      %18178 = OpShiftLeftLogical %int %20636 %int_23\n       %7462 = OpIAdd %int %18178 %int_1065353216\n      %11052 = OpBitcast %float %7462\n      %22649 = OpBitwiseAnd %uint %18628 %uint_16777216\n       %7475 = OpINotEqual %bool %22649 %uint_0\n       %8444 = OpBitwiseAnd %uint %20387 %uint_1023\n      %12176 = OpShiftRightLogical %uint %20387 %uint_10\n      %25038 = OpBitwiseAnd %uint %12176 %uint_1023\n      %25203 = OpShiftLeftLogical %uint %25038 %int_1\n      %10422 = OpCompositeConstruct %v2uint %20387 %20387\n      %10385 = OpShiftRightLogical %v2uint %10422 %2275\n      %23379 = OpBitwiseAnd %v2uint %10385 %2122\n      %16208 = OpShiftLeftLogical %v2uint %23379 %1870\n      %23020 = OpIMul %v2uint %16208 %23601\n      %12819 = OpShiftRightLogical %uint %20387 %uint_28\n      %16204 = OpBitwiseAnd %uint %12819 %uint_7\n      %20803 = OpAccessChain %_ptr_Input_uint %gl_GlobalInvocationID %uint_0\n       %8913 = OpLoad %uint %20803\n       %7405 = OpUGreaterThanEqual %bool %8913 %22993\n               OpSelectionMerge %17447 DontFlatten\n               OpBranchConditional %7405 %21993 %17447\n      %21993 = OpLabel\n               OpBranch %19578\n      %17447 = OpLabel\n      %14637 = OpLoad %v3uint %gl_GlobalInvocationID\n      %18505 = OpVectorShuffle %v2uint %14637 %14637 0 1\n       %9840 = OpShiftLeftLogical %v2uint %18505 %1834\n       %6697 = OpCompositeExtract %uint %9840 0\n      %18425 = OpCompositeExtract %uint %9840 1\n      %14186 = OpCompositeExtract %uint %19124 1\n      %24446 = OpExtInst %uint %1 UMax %18425 %14186\n      %20975 = OpCompositeConstruct %v2uint %6697 %24446\n      %21036 = OpIAdd %v2uint %20975 %23019\n      %16075 = OpULessThanEqual %bool %16204 %uint_3\n               OpSelectionMerge %23776 None\n               OpBranchConditional %16075 %10990 %15087\n      %15087 = OpLabel\n      %13566 = OpIEqual %bool %16204 %uint_5\n       %8438 = OpSelect %uint %13566 %uint_2 %uint_0\n               OpBranch %23776\n      %10990 = OpLabel\n               OpBranch %23776\n      %23776 = OpLabel\n      %19300 = OpPhi %uint %16204 %10990 %8438 %15087\n      %16830 = OpCompositeConstruct %v2uint %8574 %8574\n      %11801 = OpUGreaterThanEqual %v2bool %16830 %1837\n      %19381 = OpSelect %v2uint %11801 %1828 %1807\n      %10986 = OpShiftLeftLogical %v2uint %21036 %19381\n      %24669 = OpCompositeConstruct %v2uint %19300 %19300\n       %9093 = OpShiftRightLogical %v2uint %24669 %1816\n      %16072 = OpBitwiseAnd %v2uint %9093 %1828\n      %18106 = OpIAdd %v2uint %10986 %16072\n      %22936 = OpIMul %v2uint %2719 %23601\n      %11332 = OpCompositeConstruct %v2uint %9130 %uint_0\n       %6571 = OpShiftRightLogical %v2uint %22936 %11332\n      %10146 = OpUDiv %v2uint %18106 %6571\n      %20390 = OpCompositeExtract %uint %10146 1\n      %11046 = OpIMul %uint %20390 %20561\n      %24665 = OpCompositeExtract %uint %10146 0\n      %21536 = OpIAdd %uint %11046 %24665\n       %8742 = OpIAdd %uint %8575 %21536\n      %22376 = OpIMul %v2uint %10146 %6571\n      %20715 = OpISub %v2uint %18106 %22376\n       %7303 = OpCompositeExtract %uint %22936 0\n      %22882 = OpCompositeExtract %uint %22936 1\n      %13170 = OpIMul %uint %7303 %22882\n      %14551 = OpIMul %uint %8742 %13170\n       %6805 = OpCompositeExtract %uint %20715 1\n      %23526 = OpCompositeExtract %uint %6571 0\n      %22886 = OpIMul %uint %6805 %23526\n       %6886 = OpCompositeExtract %uint %20715 0\n       %9696 = OpIAdd %uint %22886 %6886\n      %18021 = OpShiftLeftLogical %uint %9696 %9130\n      %18363 = OpIAdd %uint %14551 %18021\n      %13922 = OpIMul %uint %13170 %uint_2048\n      %21520 = OpUMod %uint %18363 %13922\n       %7686 = OpShiftLeftLogical %uint %21520 %int_2\n      %13906 = OpUGreaterThanEqual %bool %8574 %uint_2\n      %11277 = OpSelect %uint %13906 %uint_1 %uint_0\n      %21518 = OpIAdd %uint %9130 %11277\n      %12535 = OpShiftLeftLogical %uint %uint_4 %21518\n               OpSelectionMerge %13276 None\n               OpBranchConditional %7475 %16434 %13276\n      %16434 = OpLabel\n      %10585 = OpINotEqual %bool %9130 %uint_0\n               OpBranch %13276\n      %13276 = OpLabel\n      %10924 = OpPhi %bool %7475 %23776 %10585 %16434\n               OpSelectionMerge %25261 None\n               OpBranchConditional %10924 %23873 %25261\n      %23873 = OpLabel\n       %6992 = OpIAdd %uint %7686 %uint_4\n               OpBranch %25261\n      %25261 = OpLabel\n      %24188 = OpPhi %uint %7686 %13276 %6992 %23873\n      %24753 = OpIEqual %bool %12535 %uint_4\n               OpSelectionMerge %20259 DontFlatten\n               OpBranchConditional %24753 %6591 %8959\n       %8959 = OpLabel\n      %22064 = OpShiftRightLogical %uint %24188 %int_2\n      %13369 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22064\n      %15060 = OpLoad %uint %13369\n       %8517 = OpIAdd %uint %24188 %12535\n      %21670 = OpShiftRightLogical %uint %8517 %int_2\n      %19677 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21670\n      %13114 = OpLoad %uint %19677\n       %8685 = OpIMul %uint %uint_2 %12535\n      %24254 = OpIAdd %uint %24188 %8685\n      %17890 = OpShiftRightLogical %uint %24254 %int_2\n      %19678 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17890\n      %13115 = OpLoad %uint %19678\n       %8686 = OpIMul %uint %uint_3 %12535\n      %24255 = OpIAdd %uint %24188 %8686\n      %17891 = OpShiftRightLogical %uint %24255 %int_2\n      %18689 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17891\n      %22186 = OpLoad %uint %18689\n      %19670 = OpCompositeConstruct %v4uint %15060 %13114 %13115 %22186\n      %19499 = OpIMul %uint %uint_4 %12535\n      %10821 = OpIAdd %uint %24188 %19499\n      %17892 = OpShiftRightLogical %uint %10821 %int_2\n      %19679 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17892\n      %13116 = OpLoad %uint %19679\n       %8687 = OpIMul %uint %uint_5 %12535\n      %24256 = OpIAdd %uint %24188 %8687\n      %17893 = OpShiftRightLogical %uint %24256 %int_2\n      %19680 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17893\n      %13117 = OpLoad %uint %19680\n       %8688 = OpIMul %uint %uint_6 %12535\n      %24257 = OpIAdd %uint %24188 %8688\n      %17894 = OpShiftRightLogical %uint %24257 %int_2\n      %19681 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17894\n      %13118 = OpLoad %uint %19681\n       %8689 = OpIMul %uint %uint_7 %12535\n      %24258 = OpIAdd %uint %24188 %8689\n      %17895 = OpShiftRightLogical %uint %24258 %int_2\n      %18690 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17895\n      %24409 = OpLoad %uint %18690\n      %20780 = OpCompositeConstruct %v4uint %13116 %13117 %13118 %24409\n               OpBranch %20259\n       %6591 = OpLabel\n      %24486 = OpShiftRightLogical %uint %24188 %int_2\n      %13370 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24486\n      %12609 = OpLoad %uint %13370\n      %11687 = OpIAdd %uint %24486 %uint_1\n       %6399 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11687\n      %23650 = OpLoad %uint %6399\n      %11688 = OpIAdd %uint %24486 %uint_2\n       %6400 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11688\n      %23651 = OpLoad %uint %6400\n      %11689 = OpIAdd %uint %24486 %uint_3\n      %24558 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11689\n      %14080 = OpLoad %uint %24558\n      %21616 = OpCompositeConstruct %v4uint %12609 %23650 %23651 %14080\n      %19331 = OpIAdd %uint %24188 %uint_16\n       %8237 = OpShiftRightLogical %uint %19331 %int_2\n      %19601 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %8237\n      %12610 = OpLoad %uint %19601\n      %11690 = OpIAdd %uint %8237 %uint_1\n       %6401 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11690\n      %23652 = OpLoad %uint %6401\n      %11691 = OpIAdd %uint %8237 %uint_2\n       %6402 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11691\n      %23653 = OpLoad %uint %6402\n      %11692 = OpIAdd %uint %8237 %uint_3\n      %24559 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11692\n      %16379 = OpLoad %uint %24559\n      %20781 = OpCompositeConstruct %v4uint %12610 %23652 %23653 %16379\n               OpBranch %20259\n      %20259 = OpLabel\n       %9769 = OpPhi %v4uint %20781 %6591 %20780 %8959\n      %14570 = OpPhi %v4uint %21616 %6591 %19670 %8959\n      %17369 = OpINotEqual %bool %9130 %uint_0\n               OpSelectionMerge %21263 DontFlatten\n               OpBranchConditional %17369 %21031 %22395\n      %22395 = OpLabel\n               OpSelectionMerge %23460 None\n               OpSwitch %8576 %24626 0 %16005 1 %16005 2 %14402 10 %14402 3 %22975 12 %22975 4 %21190 6 %8243\n       %8243 = OpLabel\n      %24406 = OpCompositeExtract %uint %14570 0\n      %24679 = OpExtInst %v2float %1 UnpackHalf2x16 %24406\n       %8852 = OpCompositeExtract %float %24679 0\n       %7599 = OpCompositeExtract %uint %14570 1\n      %15605 = OpExtInst %v2float %1 UnpackHalf2x16 %7599\n       %8853 = OpCompositeExtract %float %15605 0\n       %7600 = OpCompositeExtract %uint %14570 2\n      %15606 = OpExtInst %v2float %1 UnpackHalf2x16 %7600\n       %8854 = OpCompositeExtract %float %15606 0\n       %7601 = OpCompositeExtract %uint %14570 3\n      %15586 = OpExtInst %v2float %1 UnpackHalf2x16 %7601\n      %10274 = OpCompositeExtract %float %15586 0\n      %24249 = OpCompositeConstruct %v4float %8852 %8853 %8854 %10274\n      %17274 = OpCompositeExtract %uint %9769 0\n      %18027 = OpExtInst %v2float %1 UnpackHalf2x16 %17274\n       %8855 = OpCompositeExtract %float %18027 0\n       %7602 = OpCompositeExtract %uint %9769 1\n      %15607 = OpExtInst %v2float %1 UnpackHalf2x16 %7602\n       %8856 = OpCompositeExtract %float %15607 0\n       %7603 = OpCompositeExtract %uint %9769 2\n      %15608 = OpExtInst %v2float %1 UnpackHalf2x16 %7603\n       %8857 = OpCompositeExtract %float %15608 0\n       %7604 = OpCompositeExtract %uint %9769 3\n      %15587 = OpExtInst %v2float %1 UnpackHalf2x16 %7604\n      %13466 = OpCompositeExtract %float %15587 0\n      %18678 = OpCompositeConstruct %v4float %8855 %8856 %8857 %13466\n               OpBranch %23460\n      %21190 = OpLabel\n      %24820 = OpBitcast %v4int %14570\n      %22558 = OpShiftLeftLogical %v4int %24820 %770\n      %16536 = OpShiftRightArithmetic %v4int %22558 %770\n      %10903 = OpConvertSToF %v4float %16536\n      %19064 = OpVectorTimesScalar %v4float %10903 %float_0_000976592302\n      %18816 = OpExtInst %v4float %1 FMax %1284 %19064\n      %10213 = OpBitcast %v4int %9769\n       %8609 = OpShiftLeftLogical %v4int %10213 %770\n      %16537 = OpShiftRightArithmetic %v4int %8609 %770\n      %10904 = OpConvertSToF %v4float %16537\n      %21439 = OpVectorTimesScalar %v4float %10904 %float_0_000976592302\n      %17250 = OpExtInst %v4float %1 FMax %1284 %21439\n               OpBranch %23460\n      %22975 = OpLabel\n      %19462 = OpSelect %uint %7475 %uint_20 %uint_0\n       %9136 = OpCompositeConstruct %v4uint %19462 %19462 %19462 %19462\n      %23880 = OpShiftRightLogical %v4uint %14570 %9136\n      %24038 = OpBitwiseAnd %v4uint %23880 %929\n      %18588 = OpBitwiseAnd %v4uint %23880 %721\n      %23440 = OpShiftRightLogical %v4uint %24038 %263\n      %16585 = OpIEqual %v4bool %23440 %2896\n      %11339 = OpExtInst %v4int %1 FindUMsb %18588\n      %10773 = OpBitcast %v4uint %11339\n       %6266 = OpISub %v4uint %263 %10773\n       %8720 = OpIAdd %v4uint %10773 %2575\n      %10351 = OpSelect %v4uint %16585 %8720 %23440\n      %23252 = OpShiftLeftLogical %v4uint %18588 %6266\n      %18842 = OpBitwiseAnd %v4uint %23252 %721\n      %10909 = OpSelect %v4uint %16585 %18842 %18588\n      %24569 = OpIAdd %v4uint %10351 %559\n      %20351 = OpShiftLeftLogical %v4uint %24569 %1127\n      %16294 = OpShiftLeftLogical %v4uint %10909 %749\n      %22396 = OpBitwiseOr %v4uint %20351 %16294\n      %13824 = OpIEqual %v4bool %24038 %2896\n      %16962 = OpSelect %v4uint %13824 %2896 %22396\n      %12356 = OpBitcast %v4float %16962\n      %24638 = OpShiftRightLogical %v4uint %9769 %9136\n      %14625 = OpBitwiseAnd %v4uint %24638 %929\n      %18589 = OpBitwiseAnd %v4uint %24638 %721\n      %23441 = OpShiftRightLogical %v4uint %14625 %263\n      %16586 = OpIEqual %v4bool %23441 %2896\n      %11340 = OpExtInst %v4int %1 FindUMsb %18589\n      %10774 = OpBitcast %v4uint %11340\n       %6267 = OpISub %v4uint %263 %10774\n       %8721 = OpIAdd %v4uint %10774 %2575\n      %10352 = OpSelect %v4uint %16586 %8721 %23441\n      %23253 = OpShiftLeftLogical %v4uint %18589 %6267\n      %18843 = OpBitwiseAnd %v4uint %23253 %721\n      %10910 = OpSelect %v4uint %16586 %18843 %18589\n      %24570 = OpIAdd %v4uint %10352 %559\n      %20352 = OpShiftLeftLogical %v4uint %24570 %1127\n      %16295 = OpShiftLeftLogical %v4uint %10910 %749\n      %22397 = OpBitwiseOr %v4uint %20352 %16295\n      %13825 = OpIEqual %v4bool %14625 %2896\n      %18007 = OpSelect %v4uint %13825 %2896 %22397\n      %22843 = OpBitcast %v4float %18007\n               OpBranch %23460\n      %14402 = OpLabel\n      %19463 = OpSelect %uint %7475 %uint_20 %uint_0\n       %9137 = OpCompositeConstruct %v4uint %19463 %19463 %19463 %19463\n      %22227 = OpShiftRightLogical %v4uint %14570 %9137\n      %19030 = OpBitwiseAnd %v4uint %22227 %929\n      %16133 = OpConvertUToF %v4float %19030\n      %21018 = OpVectorTimesScalar %v4float %16133 %float_0_000977517106\n       %7746 = OpShiftRightLogical %v4uint %9769 %9137\n      %11220 = OpBitwiseAnd %v4uint %7746 %929\n      %17178 = OpConvertUToF %v4float %11220\n      %12434 = OpVectorTimesScalar %v4float %17178 %float_0_000977517106\n               OpBranch %23460\n      %16005 = OpLabel\n      %19464 = OpSelect %uint %7475 %uint_16 %uint_0\n       %9138 = OpCompositeConstruct %v4uint %19464 %19464 %19464 %19464\n      %22228 = OpShiftRightLogical %v4uint %14570 %9138\n      %19031 = OpBitwiseAnd %v4uint %22228 %1611\n      %16134 = OpConvertUToF %v4float %19031\n      %21019 = OpVectorTimesScalar %v4float %16134 %float_0_00392156886\n       %7747 = OpShiftRightLogical %v4uint %9769 %9138\n      %11221 = OpBitwiseAnd %v4uint %7747 %1611\n      %17179 = OpConvertUToF %v4float %11221\n      %12435 = OpVectorTimesScalar %v4float %17179 %float_0_00392156886\n               OpBranch %23460\n      %24626 = OpLabel\n      %19231 = OpBitcast %v4float %14570\n      %14514 = OpBitcast %v4float %9769\n               OpBranch %23460\n      %23460 = OpLabel\n      %11251 = OpPhi %v4float %14514 %24626 %12435 %16005 %12434 %14402 %22843 %22975 %17250 %21190 %18678 %8243\n      %13709 = OpPhi %v4float %19231 %24626 %21019 %16005 %21018 %14402 %12356 %22975 %18816 %21190 %24249 %8243\n               OpBranch %21263\n      %21031 = OpLabel\n               OpSelectionMerge %23461 None\n               OpSwitch %8576 %12525 5 %21191 7 %8244\n       %8244 = OpLabel\n      %24407 = OpCompositeExtract %uint %14570 0\n      %24680 = OpExtInst %v2float %1 UnpackHalf2x16 %24407\n       %8859 = OpCompositeExtract %float %24680 0\n       %7605 = OpCompositeExtract %uint %14570 1\n      %15609 = OpExtInst %v2float %1 UnpackHalf2x16 %7605\n       %8860 = OpCompositeExtract %float %15609 0\n       %7606 = OpCompositeExtract %uint %14570 2\n      %15610 = OpExtInst %v2float %1 UnpackHalf2x16 %7606\n       %8861 = OpCompositeExtract %float %15610 0\n       %7607 = OpCompositeExtract %uint %14570 3\n      %15588 = OpExtInst %v2float %1 UnpackHalf2x16 %7607\n      %10275 = OpCompositeExtract %float %15588 0\n      %24250 = OpCompositeConstruct %v4float %8859 %8860 %8861 %10275\n      %17275 = OpCompositeExtract %uint %9769 0\n      %18028 = OpExtInst %v2float %1 UnpackHalf2x16 %17275\n       %8862 = OpCompositeExtract %float %18028 0\n       %7608 = OpCompositeExtract %uint %9769 1\n      %15611 = OpExtInst %v2float %1 UnpackHalf2x16 %7608\n       %8863 = OpCompositeExtract %float %15611 0\n       %7609 = OpCompositeExtract %uint %9769 2\n      %15612 = OpExtInst %v2float %1 UnpackHalf2x16 %7609\n       %8864 = OpCompositeExtract %float %15612 0\n       %7610 = OpCompositeExtract %uint %9769 3\n      %15589 = OpExtInst %v2float %1 UnpackHalf2x16 %7610\n      %13467 = OpCompositeExtract %float %15589 0\n      %18679 = OpCompositeConstruct %v4float %8862 %8863 %8864 %13467\n               OpBranch %23461\n      %21191 = OpLabel\n      %24821 = OpBitcast %v4int %14570\n      %22559 = OpShiftLeftLogical %v4int %24821 %770\n      %16538 = OpShiftRightArithmetic %v4int %22559 %770\n      %10905 = OpConvertSToF %v4float %16538\n      %19065 = OpVectorTimesScalar %v4float %10905 %float_0_000976592302\n      %18817 = OpExtInst %v4float %1 FMax %1284 %19065\n      %10214 = OpBitcast %v4int %9769\n       %8610 = OpShiftLeftLogical %v4int %10214 %770\n      %16539 = OpShiftRightArithmetic %v4int %8610 %770\n      %10906 = OpConvertSToF %v4float %16539\n      %21440 = OpVectorTimesScalar %v4float %10906 %float_0_000976592302\n      %17251 = OpExtInst %v4float %1 FMax %1284 %21440\n               OpBranch %23461\n      %12525 = OpLabel\n      %19232 = OpBitcast %v4float %14570\n      %14515 = OpBitcast %v4float %9769\n               OpBranch %23461\n      %23461 = OpLabel\n      %11252 = OpPhi %v4float %14515 %12525 %17251 %21191 %18679 %8244\n      %13710 = OpPhi %v4float %19232 %12525 %18817 %21191 %24250 %8244\n               OpBranch %21263\n      %21263 = OpLabel\n       %9826 = OpPhi %v4float %11252 %23461 %11251 %23460\n      %14051 = OpPhi %v4float %13710 %23461 %13709 %23460\n      %11861 = OpUGreaterThanEqual %bool %16204 %uint_4\n               OpSelectionMerge %21267 DontFlatten\n               OpBranchConditional %11861 %20977 %21267\n      %20977 = OpLabel\n      %11079 = OpIMul %uint %uint_320 %8858\n      %23069 = OpFMul %float %11052 %float_0_5\n       %8114 = OpIAdd %uint %24188 %11079\n               OpSelectionMerge %20260 DontFlatten\n               OpBranchConditional %24753 %6592 %8960\n       %8960 = OpLabel\n      %22065 = OpShiftRightLogical %uint %8114 %int_2\n      %13371 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22065\n      %15061 = OpLoad %uint %13371\n       %8518 = OpIAdd %uint %8114 %12535\n      %21671 = OpShiftRightLogical %uint %8518 %int_2\n      %19682 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21671\n      %13119 = OpLoad %uint %19682\n       %8690 = OpIMul %uint %uint_2 %12535\n      %24259 = OpIAdd %uint %8114 %8690\n      %17896 = OpShiftRightLogical %uint %24259 %int_2\n      %19683 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17896\n      %13120 = OpLoad %uint %19683\n       %8691 = OpIMul %uint %uint_3 %12535\n      %24260 = OpIAdd %uint %8114 %8691\n      %17897 = OpShiftRightLogical %uint %24260 %int_2\n      %18691 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17897\n      %22187 = OpLoad %uint %18691\n      %19671 = OpCompositeConstruct %v4uint %15061 %13119 %13120 %22187\n      %19500 = OpIMul %uint %uint_4 %12535\n      %10822 = OpIAdd %uint %8114 %19500\n      %17898 = OpShiftRightLogical %uint %10822 %int_2\n      %19684 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17898\n      %13121 = OpLoad %uint %19684\n       %8692 = OpIMul %uint %uint_5 %12535\n      %24261 = OpIAdd %uint %8114 %8692\n      %17899 = OpShiftRightLogical %uint %24261 %int_2\n      %19685 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17899\n      %13122 = OpLoad %uint %19685\n       %8693 = OpIMul %uint %uint_6 %12535\n      %24262 = OpIAdd %uint %8114 %8693\n      %17900 = OpShiftRightLogical %uint %24262 %int_2\n      %19686 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17900\n      %13124 = OpLoad %uint %19686\n       %8694 = OpIMul %uint %uint_7 %12535\n      %24263 = OpIAdd %uint %8114 %8694\n      %17901 = OpShiftRightLogical %uint %24263 %int_2\n      %18692 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17901\n      %24410 = OpLoad %uint %18692\n      %20782 = OpCompositeConstruct %v4uint %13121 %13122 %13124 %24410\n               OpBranch %20260\n       %6592 = OpLabel\n      %24487 = OpShiftRightLogical %uint %8114 %int_2\n      %13372 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24487\n      %12611 = OpLoad %uint %13372\n      %11693 = OpIAdd %uint %24487 %uint_1\n       %6403 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11693\n      %23654 = OpLoad %uint %6403\n      %11694 = OpIAdd %uint %24487 %uint_2\n       %6404 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11694\n      %23655 = OpLoad %uint %6404\n      %11695 = OpIAdd %uint %24487 %uint_3\n      %24560 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11695\n      %14081 = OpLoad %uint %24560\n      %21617 = OpCompositeConstruct %v4uint %12611 %23654 %23655 %14081\n      %19332 = OpIAdd %uint %8114 %uint_16\n       %8238 = OpShiftRightLogical %uint %19332 %int_2\n      %19602 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %8238\n      %12612 = OpLoad %uint %19602\n      %11696 = OpIAdd %uint %8238 %uint_1\n       %6405 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11696\n      %23656 = OpLoad %uint %6405\n      %11697 = OpIAdd %uint %8238 %uint_2\n       %6406 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11697\n      %23657 = OpLoad %uint %6406\n      %11698 = OpIAdd %uint %8238 %uint_3\n      %24561 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11698\n      %16380 = OpLoad %uint %24561\n      %20783 = OpCompositeConstruct %v4uint %12612 %23656 %23657 %16380\n               OpBranch %20260\n      %20260 = OpLabel\n      %11213 = OpPhi %v4uint %20783 %6592 %20782 %8960\n      %14093 = OpPhi %v4uint %21617 %6592 %19671 %8960\n               OpSelectionMerge %21264 DontFlatten\n               OpBranchConditional %17369 %21032 %22398\n      %22398 = OpLabel\n               OpSelectionMerge %23462 None\n               OpSwitch %8576 %24627 0 %16006 1 %16006 2 %14403 10 %14403 3 %22976 12 %22976 4 %21192 6 %8245\n       %8245 = OpLabel\n      %24408 = OpCompositeExtract %uint %14093 0\n      %24681 = OpExtInst %v2float %1 UnpackHalf2x16 %24408\n       %8865 = OpCompositeExtract %float %24681 0\n       %7611 = OpCompositeExtract %uint %14093 1\n      %15613 = OpExtInst %v2float %1 UnpackHalf2x16 %7611\n       %8866 = OpCompositeExtract %float %15613 0\n       %7612 = OpCompositeExtract %uint %14093 2\n      %15614 = OpExtInst %v2float %1 UnpackHalf2x16 %7612\n       %8867 = OpCompositeExtract %float %15614 0\n       %7613 = OpCompositeExtract %uint %14093 3\n      %15590 = OpExtInst %v2float %1 UnpackHalf2x16 %7613\n      %10276 = OpCompositeExtract %float %15590 0\n      %24251 = OpCompositeConstruct %v4float %8865 %8866 %8867 %10276\n      %17276 = OpCompositeExtract %uint %11213 0\n      %18029 = OpExtInst %v2float %1 UnpackHalf2x16 %17276\n       %8868 = OpCompositeExtract %float %18029 0\n       %7614 = OpCompositeExtract %uint %11213 1\n      %15615 = OpExtInst %v2float %1 UnpackHalf2x16 %7614\n       %8869 = OpCompositeExtract %float %15615 0\n       %7615 = OpCompositeExtract %uint %11213 2\n      %15616 = OpExtInst %v2float %1 UnpackHalf2x16 %7615\n       %8870 = OpCompositeExtract %float %15616 0\n       %7616 = OpCompositeExtract %uint %11213 3\n      %15591 = OpExtInst %v2float %1 UnpackHalf2x16 %7616\n      %13468 = OpCompositeExtract %float %15591 0\n      %18680 = OpCompositeConstruct %v4float %8868 %8869 %8870 %13468\n               OpBranch %23462\n      %21192 = OpLabel\n      %24822 = OpBitcast %v4int %14093\n      %22560 = OpShiftLeftLogical %v4int %24822 %770\n      %16540 = OpShiftRightArithmetic %v4int %22560 %770\n      %10907 = OpConvertSToF %v4float %16540\n      %19066 = OpVectorTimesScalar %v4float %10907 %float_0_000976592302\n      %18818 = OpExtInst %v4float %1 FMax %1284 %19066\n      %10215 = OpBitcast %v4int %11213\n       %8611 = OpShiftLeftLogical %v4int %10215 %770\n      %16541 = OpShiftRightArithmetic %v4int %8611 %770\n      %10908 = OpConvertSToF %v4float %16541\n      %21441 = OpVectorTimesScalar %v4float %10908 %float_0_000976592302\n      %17252 = OpExtInst %v4float %1 FMax %1284 %21441\n               OpBranch %23462\n      %22976 = OpLabel\n      %19465 = OpSelect %uint %7475 %uint_20 %uint_0\n       %9139 = OpCompositeConstruct %v4uint %19465 %19465 %19465 %19465\n      %23881 = OpShiftRightLogical %v4uint %14093 %9139\n      %24039 = OpBitwiseAnd %v4uint %23881 %929\n      %18590 = OpBitwiseAnd %v4uint %23881 %721\n      %23442 = OpShiftRightLogical %v4uint %24039 %263\n      %16587 = OpIEqual %v4bool %23442 %2896\n      %11341 = OpExtInst %v4int %1 FindUMsb %18590\n      %10775 = OpBitcast %v4uint %11341\n       %6268 = OpISub %v4uint %263 %10775\n       %8722 = OpIAdd %v4uint %10775 %2575\n      %10353 = OpSelect %v4uint %16587 %8722 %23442\n      %23254 = OpShiftLeftLogical %v4uint %18590 %6268\n      %18844 = OpBitwiseAnd %v4uint %23254 %721\n      %10911 = OpSelect %v4uint %16587 %18844 %18590\n      %24571 = OpIAdd %v4uint %10353 %559\n      %20353 = OpShiftLeftLogical %v4uint %24571 %1127\n      %16296 = OpShiftLeftLogical %v4uint %10911 %749\n      %22399 = OpBitwiseOr %v4uint %20353 %16296\n      %13826 = OpIEqual %v4bool %24039 %2896\n      %16963 = OpSelect %v4uint %13826 %2896 %22399\n      %12357 = OpBitcast %v4float %16963\n      %24639 = OpShiftRightLogical %v4uint %11213 %9139\n      %14626 = OpBitwiseAnd %v4uint %24639 %929\n      %18591 = OpBitwiseAnd %v4uint %24639 %721\n      %23443 = OpShiftRightLogical %v4uint %14626 %263\n      %16588 = OpIEqual %v4bool %23443 %2896\n      %11342 = OpExtInst %v4int %1 FindUMsb %18591\n      %10776 = OpBitcast %v4uint %11342\n       %6269 = OpISub %v4uint %263 %10776\n       %8723 = OpIAdd %v4uint %10776 %2575\n      %10354 = OpSelect %v4uint %16588 %8723 %23443\n      %23255 = OpShiftLeftLogical %v4uint %18591 %6269\n      %18845 = OpBitwiseAnd %v4uint %23255 %721\n      %10912 = OpSelect %v4uint %16588 %18845 %18591\n      %24572 = OpIAdd %v4uint %10354 %559\n      %20354 = OpShiftLeftLogical %v4uint %24572 %1127\n      %16297 = OpShiftLeftLogical %v4uint %10912 %749\n      %22400 = OpBitwiseOr %v4uint %20354 %16297\n      %13827 = OpIEqual %v4bool %14626 %2896\n      %18008 = OpSelect %v4uint %13827 %2896 %22400\n      %22844 = OpBitcast %v4float %18008\n               OpBranch %23462\n      %14403 = OpLabel\n      %19466 = OpSelect %uint %7475 %uint_20 %uint_0\n       %9140 = OpCompositeConstruct %v4uint %19466 %19466 %19466 %19466\n      %22229 = OpShiftRightLogical %v4uint %14093 %9140\n      %19032 = OpBitwiseAnd %v4uint %22229 %929\n      %16135 = OpConvertUToF %v4float %19032\n      %21020 = OpVectorTimesScalar %v4float %16135 %float_0_000977517106\n       %7748 = OpShiftRightLogical %v4uint %11213 %9140\n      %11222 = OpBitwiseAnd %v4uint %7748 %929\n      %17180 = OpConvertUToF %v4float %11222\n      %12436 = OpVectorTimesScalar %v4float %17180 %float_0_000977517106\n               OpBranch %23462\n      %16006 = OpLabel\n      %19467 = OpSelect %uint %7475 %uint_16 %uint_0\n       %9141 = OpCompositeConstruct %v4uint %19467 %19467 %19467 %19467\n      %22230 = OpShiftRightLogical %v4uint %14093 %9141\n      %19033 = OpBitwiseAnd %v4uint %22230 %1611\n      %16136 = OpConvertUToF %v4float %19033\n      %21021 = OpVectorTimesScalar %v4float %16136 %float_0_00392156886\n       %7749 = OpShiftRightLogical %v4uint %11213 %9141\n      %11223 = OpBitwiseAnd %v4uint %7749 %1611\n      %17181 = OpConvertUToF %v4float %11223\n      %12437 = OpVectorTimesScalar %v4float %17181 %float_0_00392156886\n               OpBranch %23462\n      %24627 = OpLabel\n      %19233 = OpBitcast %v4float %14093\n      %14516 = OpBitcast %v4float %11213\n               OpBranch %23462\n      %23462 = OpLabel\n      %11253 = OpPhi %v4float %14516 %24627 %12437 %16006 %12436 %14403 %22844 %22976 %17252 %21192 %18680 %8245\n      %13712 = OpPhi %v4float %19233 %24627 %21021 %16006 %21020 %14403 %12357 %22976 %18818 %21192 %24251 %8245\n               OpBranch %21264\n      %21032 = OpLabel\n               OpSelectionMerge %23463 None\n               OpSwitch %8576 %12526 5 %21193 7 %8246\n       %8246 = OpLabel\n      %24411 = OpCompositeExtract %uint %14093 0\n      %24682 = OpExtInst %v2float %1 UnpackHalf2x16 %24411\n       %8872 = OpCompositeExtract %float %24682 0\n       %7617 = OpCompositeExtract %uint %14093 1\n      %15617 = OpExtInst %v2float %1 UnpackHalf2x16 %7617\n       %8873 = OpCompositeExtract %float %15617 0\n       %7618 = OpCompositeExtract %uint %14093 2\n      %15618 = OpExtInst %v2float %1 UnpackHalf2x16 %7618\n       %8874 = OpCompositeExtract %float %15618 0\n       %7619 = OpCompositeExtract %uint %14093 3\n      %15592 = OpExtInst %v2float %1 UnpackHalf2x16 %7619\n      %10277 = OpCompositeExtract %float %15592 0\n      %24252 = OpCompositeConstruct %v4float %8872 %8873 %8874 %10277\n      %17277 = OpCompositeExtract %uint %11213 0\n      %18030 = OpExtInst %v2float %1 UnpackHalf2x16 %17277\n       %8875 = OpCompositeExtract %float %18030 0\n       %7620 = OpCompositeExtract %uint %11213 1\n      %15619 = OpExtInst %v2float %1 UnpackHalf2x16 %7620\n       %8876 = OpCompositeExtract %float %15619 0\n       %7621 = OpCompositeExtract %uint %11213 2\n      %15620 = OpExtInst %v2float %1 UnpackHalf2x16 %7621\n       %8877 = OpCompositeExtract %float %15620 0\n       %7622 = OpCompositeExtract %uint %11213 3\n      %15593 = OpExtInst %v2float %1 UnpackHalf2x16 %7622\n      %13469 = OpCompositeExtract %float %15593 0\n      %18681 = OpCompositeConstruct %v4float %8875 %8876 %8877 %13469\n               OpBranch %23463\n      %21193 = OpLabel\n      %24823 = OpBitcast %v4int %14093\n      %22561 = OpShiftLeftLogical %v4int %24823 %770\n      %16542 = OpShiftRightArithmetic %v4int %22561 %770\n      %10913 = OpConvertSToF %v4float %16542\n      %19067 = OpVectorTimesScalar %v4float %10913 %float_0_000976592302\n      %18819 = OpExtInst %v4float %1 FMax %1284 %19067\n      %10216 = OpBitcast %v4int %11213\n       %8612 = OpShiftLeftLogical %v4int %10216 %770\n      %16543 = OpShiftRightArithmetic %v4int %8612 %770\n      %10914 = OpConvertSToF %v4float %16543\n      %21442 = OpVectorTimesScalar %v4float %10914 %float_0_000976592302\n      %17253 = OpExtInst %v4float %1 FMax %1284 %21442\n               OpBranch %23463\n      %12526 = OpLabel\n      %19234 = OpBitcast %v4float %14093\n      %14517 = OpBitcast %v4float %11213\n               OpBranch %23463\n      %23463 = OpLabel\n      %11254 = OpPhi %v4float %14517 %12526 %17253 %21193 %18681 %8246\n      %13713 = OpPhi %v4float %19234 %12526 %18819 %21193 %24252 %8246\n               OpBranch %21264\n      %21264 = OpLabel\n       %8971 = OpPhi %v4float %11254 %23463 %11253 %23462\n      %19594 = OpPhi %v4float %13713 %23463 %13712 %23462\n      %18096 = OpFAdd %v4float %14051 %19594\n      %17754 = OpFAdd %v4float %9826 %8971\n      %14461 = OpUGreaterThanEqual %bool %16204 %uint_6\n               OpSelectionMerge %24277 DontFlatten\n               OpBranchConditional %14461 %9905 %24277\n       %9905 = OpLabel\n      %14258 = OpShiftLeftLogical %uint %uint_4 %9130\n      %12090 = OpFMul %float %11052 %float_0_25\n      %20988 = OpIAdd %uint %24188 %14258\n               OpSelectionMerge %20261 DontFlatten\n               OpBranchConditional %24753 %6593 %8961\n       %8961 = OpLabel\n      %22066 = OpShiftRightLogical %uint %20988 %int_2\n      %13373 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22066\n      %15062 = OpLoad %uint %13373\n       %8519 = OpIAdd %uint %20988 %12535\n      %21672 = OpShiftRightLogical %uint %8519 %int_2\n      %19687 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21672\n      %13125 = OpLoad %uint %19687\n       %8695 = OpIMul %uint %uint_2 %12535\n      %24264 = OpIAdd %uint %20988 %8695\n      %17902 = OpShiftRightLogical %uint %24264 %int_2\n      %19688 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17902\n      %13126 = OpLoad %uint %19688\n       %8696 = OpIMul %uint %uint_3 %12535\n      %24265 = OpIAdd %uint %20988 %8696\n      %17903 = OpShiftRightLogical %uint %24265 %int_2\n      %18693 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17903\n      %22188 = OpLoad %uint %18693\n      %19672 = OpCompositeConstruct %v4uint %15062 %13125 %13126 %22188\n      %19501 = OpIMul %uint %uint_4 %12535\n      %10823 = OpIAdd %uint %20988 %19501\n      %17904 = OpShiftRightLogical %uint %10823 %int_2\n      %19689 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17904\n      %13127 = OpLoad %uint %19689\n       %8697 = OpIMul %uint %uint_5 %12535\n      %24266 = OpIAdd %uint %20988 %8697\n      %17905 = OpShiftRightLogical %uint %24266 %int_2\n      %19690 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17905\n      %13128 = OpLoad %uint %19690\n       %8698 = OpIMul %uint %uint_6 %12535\n      %24267 = OpIAdd %uint %20988 %8698\n      %17906 = OpShiftRightLogical %uint %24267 %int_2\n      %19691 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17906\n      %13129 = OpLoad %uint %19691\n       %8699 = OpIMul %uint %uint_7 %12535\n      %24268 = OpIAdd %uint %20988 %8699\n      %17907 = OpShiftRightLogical %uint %24268 %int_2\n      %18694 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17907\n      %24412 = OpLoad %uint %18694\n      %20784 = OpCompositeConstruct %v4uint %13127 %13128 %13129 %24412\n               OpBranch %20261\n       %6593 = OpLabel\n      %24488 = OpShiftRightLogical %uint %20988 %int_2\n      %13374 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24488\n      %12613 = OpLoad %uint %13374\n      %11699 = OpIAdd %uint %24488 %uint_1\n       %6407 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11699\n      %23658 = OpLoad %uint %6407\n      %11700 = OpIAdd %uint %24488 %uint_2\n       %6408 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11700\n      %23659 = OpLoad %uint %6408\n      %11701 = OpIAdd %uint %24488 %uint_3\n      %24562 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11701\n      %14082 = OpLoad %uint %24562\n      %21618 = OpCompositeConstruct %v4uint %12613 %23658 %23659 %14082\n      %19333 = OpIAdd %uint %20988 %uint_16\n       %8239 = OpShiftRightLogical %uint %19333 %int_2\n      %19603 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %8239\n      %12614 = OpLoad %uint %19603\n      %11702 = OpIAdd %uint %8239 %uint_1\n       %6409 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11702\n      %23660 = OpLoad %uint %6409\n      %11703 = OpIAdd %uint %8239 %uint_2\n       %6410 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11703\n      %23661 = OpLoad %uint %6410\n      %11704 = OpIAdd %uint %8239 %uint_3\n      %24563 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11704\n      %16381 = OpLoad %uint %24563\n      %20785 = OpCompositeConstruct %v4uint %12614 %23660 %23661 %16381\n               OpBranch %20261\n      %20261 = OpLabel\n      %11214 = OpPhi %v4uint %20785 %6593 %20784 %8961\n      %14094 = OpPhi %v4uint %21618 %6593 %19672 %8961\n               OpSelectionMerge %21265 DontFlatten\n               OpBranchConditional %17369 %21033 %22401\n      %22401 = OpLabel\n               OpSelectionMerge %23464 None\n               OpSwitch %8576 %24628 0 %16007 1 %16007 2 %14404 10 %14404 3 %22977 12 %22977 4 %21194 6 %8247\n       %8247 = OpLabel\n      %24413 = OpCompositeExtract %uint %14094 0\n      %24683 = OpExtInst %v2float %1 UnpackHalf2x16 %24413\n       %8878 = OpCompositeExtract %float %24683 0\n       %7623 = OpCompositeExtract %uint %14094 1\n      %15621 = OpExtInst %v2float %1 UnpackHalf2x16 %7623\n       %8879 = OpCompositeExtract %float %15621 0\n       %7624 = OpCompositeExtract %uint %14094 2\n      %15622 = OpExtInst %v2float %1 UnpackHalf2x16 %7624\n       %8880 = OpCompositeExtract %float %15622 0\n       %7625 = OpCompositeExtract %uint %14094 3\n      %15594 = OpExtInst %v2float %1 UnpackHalf2x16 %7625\n      %10278 = OpCompositeExtract %float %15594 0\n      %24253 = OpCompositeConstruct %v4float %8878 %8879 %8880 %10278\n      %17278 = OpCompositeExtract %uint %11214 0\n      %18031 = OpExtInst %v2float %1 UnpackHalf2x16 %17278\n       %8881 = OpCompositeExtract %float %18031 0\n       %7626 = OpCompositeExtract %uint %11214 1\n      %15623 = OpExtInst %v2float %1 UnpackHalf2x16 %7626\n       %8882 = OpCompositeExtract %float %15623 0\n       %7627 = OpCompositeExtract %uint %11214 2\n      %15624 = OpExtInst %v2float %1 UnpackHalf2x16 %7627\n       %8883 = OpCompositeExtract %float %15624 0\n       %7628 = OpCompositeExtract %uint %11214 3\n      %15595 = OpExtInst %v2float %1 UnpackHalf2x16 %7628\n      %13470 = OpCompositeExtract %float %15595 0\n      %18682 = OpCompositeConstruct %v4float %8881 %8882 %8883 %13470\n               OpBranch %23464\n      %21194 = OpLabel\n      %24824 = OpBitcast %v4int %14094\n      %22562 = OpShiftLeftLogical %v4int %24824 %770\n      %16544 = OpShiftRightArithmetic %v4int %22562 %770\n      %10915 = OpConvertSToF %v4float %16544\n      %19068 = OpVectorTimesScalar %v4float %10915 %float_0_000976592302\n      %18820 = OpExtInst %v4float %1 FMax %1284 %19068\n      %10217 = OpBitcast %v4int %11214\n       %8613 = OpShiftLeftLogical %v4int %10217 %770\n      %16545 = OpShiftRightArithmetic %v4int %8613 %770\n      %10916 = OpConvertSToF %v4float %16545\n      %21443 = OpVectorTimesScalar %v4float %10916 %float_0_000976592302\n      %17254 = OpExtInst %v4float %1 FMax %1284 %21443\n               OpBranch %23464\n      %22977 = OpLabel\n      %19468 = OpSelect %uint %7475 %uint_20 %uint_0\n       %9142 = OpCompositeConstruct %v4uint %19468 %19468 %19468 %19468\n      %23882 = OpShiftRightLogical %v4uint %14094 %9142\n      %24040 = OpBitwiseAnd %v4uint %23882 %929\n      %18592 = OpBitwiseAnd %v4uint %23882 %721\n      %23444 = OpShiftRightLogical %v4uint %24040 %263\n      %16589 = OpIEqual %v4bool %23444 %2896\n      %11343 = OpExtInst %v4int %1 FindUMsb %18592\n      %10777 = OpBitcast %v4uint %11343\n       %6270 = OpISub %v4uint %263 %10777\n       %8724 = OpIAdd %v4uint %10777 %2575\n      %10355 = OpSelect %v4uint %16589 %8724 %23444\n      %23256 = OpShiftLeftLogical %v4uint %18592 %6270\n      %18846 = OpBitwiseAnd %v4uint %23256 %721\n      %10917 = OpSelect %v4uint %16589 %18846 %18592\n      %24573 = OpIAdd %v4uint %10355 %559\n      %20355 = OpShiftLeftLogical %v4uint %24573 %1127\n      %16298 = OpShiftLeftLogical %v4uint %10917 %749\n      %22402 = OpBitwiseOr %v4uint %20355 %16298\n      %13828 = OpIEqual %v4bool %24040 %2896\n      %16964 = OpSelect %v4uint %13828 %2896 %22402\n      %12358 = OpBitcast %v4float %16964\n      %24640 = OpShiftRightLogical %v4uint %11214 %9142\n      %14627 = OpBitwiseAnd %v4uint %24640 %929\n      %18593 = OpBitwiseAnd %v4uint %24640 %721\n      %23445 = OpShiftRightLogical %v4uint %14627 %263\n      %16590 = OpIEqual %v4bool %23445 %2896\n      %11344 = OpExtInst %v4int %1 FindUMsb %18593\n      %10778 = OpBitcast %v4uint %11344\n       %6271 = OpISub %v4uint %263 %10778\n       %8725 = OpIAdd %v4uint %10778 %2575\n      %10356 = OpSelect %v4uint %16590 %8725 %23445\n      %23257 = OpShiftLeftLogical %v4uint %18593 %6271\n      %18847 = OpBitwiseAnd %v4uint %23257 %721\n      %10918 = OpSelect %v4uint %16590 %18847 %18593\n      %24574 = OpIAdd %v4uint %10356 %559\n      %20356 = OpShiftLeftLogical %v4uint %24574 %1127\n      %16299 = OpShiftLeftLogical %v4uint %10918 %749\n      %22403 = OpBitwiseOr %v4uint %20356 %16299\n      %13829 = OpIEqual %v4bool %14627 %2896\n      %18009 = OpSelect %v4uint %13829 %2896 %22403\n      %22845 = OpBitcast %v4float %18009\n               OpBranch %23464\n      %14404 = OpLabel\n      %19469 = OpSelect %uint %7475 %uint_20 %uint_0\n       %9143 = OpCompositeConstruct %v4uint %19469 %19469 %19469 %19469\n      %22231 = OpShiftRightLogical %v4uint %14094 %9143\n      %19034 = OpBitwiseAnd %v4uint %22231 %929\n      %16137 = OpConvertUToF %v4float %19034\n      %21022 = OpVectorTimesScalar %v4float %16137 %float_0_000977517106\n       %7750 = OpShiftRightLogical %v4uint %11214 %9143\n      %11224 = OpBitwiseAnd %v4uint %7750 %929\n      %17182 = OpConvertUToF %v4float %11224\n      %12438 = OpVectorTimesScalar %v4float %17182 %float_0_000977517106\n               OpBranch %23464\n      %16007 = OpLabel\n      %19470 = OpSelect %uint %7475 %uint_16 %uint_0\n       %9144 = OpCompositeConstruct %v4uint %19470 %19470 %19470 %19470\n      %22232 = OpShiftRightLogical %v4uint %14094 %9144\n      %19035 = OpBitwiseAnd %v4uint %22232 %1611\n      %16138 = OpConvertUToF %v4float %19035\n      %21023 = OpVectorTimesScalar %v4float %16138 %float_0_00392156886\n       %7751 = OpShiftRightLogical %v4uint %11214 %9144\n      %11225 = OpBitwiseAnd %v4uint %7751 %1611\n      %17183 = OpConvertUToF %v4float %11225\n      %12439 = OpVectorTimesScalar %v4float %17183 %float_0_00392156886\n               OpBranch %23464\n      %24628 = OpLabel\n      %19235 = OpBitcast %v4float %14094\n      %14518 = OpBitcast %v4float %11214\n               OpBranch %23464\n      %23464 = OpLabel\n      %11255 = OpPhi %v4float %14518 %24628 %12439 %16007 %12438 %14404 %22845 %22977 %17254 %21194 %18682 %8247\n      %13714 = OpPhi %v4float %19235 %24628 %21023 %16007 %21022 %14404 %12358 %22977 %18820 %21194 %24253 %8247\n               OpBranch %21265\n      %21033 = OpLabel\n               OpSelectionMerge %23465 None\n               OpSwitch %8576 %12527 5 %21195 7 %8248\n       %8248 = OpLabel\n      %24414 = OpCompositeExtract %uint %14094 0\n      %24684 = OpExtInst %v2float %1 UnpackHalf2x16 %24414\n       %8884 = OpCompositeExtract %float %24684 0\n       %7629 = OpCompositeExtract %uint %14094 1\n      %15625 = OpExtInst %v2float %1 UnpackHalf2x16 %7629\n       %8885 = OpCompositeExtract %float %15625 0\n       %7630 = OpCompositeExtract %uint %14094 2\n      %15626 = OpExtInst %v2float %1 UnpackHalf2x16 %7630\n       %8886 = OpCompositeExtract %float %15626 0\n       %7631 = OpCompositeExtract %uint %14094 3\n      %15596 = OpExtInst %v2float %1 UnpackHalf2x16 %7631\n      %10279 = OpCompositeExtract %float %15596 0\n      %24269 = OpCompositeConstruct %v4float %8884 %8885 %8886 %10279\n      %17279 = OpCompositeExtract %uint %11214 0\n      %18032 = OpExtInst %v2float %1 UnpackHalf2x16 %17279\n       %8887 = OpCompositeExtract %float %18032 0\n       %7632 = OpCompositeExtract %uint %11214 1\n      %15628 = OpExtInst %v2float %1 UnpackHalf2x16 %7632\n       %8888 = OpCompositeExtract %float %15628 0\n       %7633 = OpCompositeExtract %uint %11214 2\n      %15629 = OpExtInst %v2float %1 UnpackHalf2x16 %7633\n       %8889 = OpCompositeExtract %float %15629 0\n       %7634 = OpCompositeExtract %uint %11214 3\n      %15597 = OpExtInst %v2float %1 UnpackHalf2x16 %7634\n      %13471 = OpCompositeExtract %float %15597 0\n      %18683 = OpCompositeConstruct %v4float %8887 %8888 %8889 %13471\n               OpBranch %23465\n      %21195 = OpLabel\n      %24825 = OpBitcast %v4int %14094\n      %22563 = OpShiftLeftLogical %v4int %24825 %770\n      %16546 = OpShiftRightArithmetic %v4int %22563 %770\n      %10919 = OpConvertSToF %v4float %16546\n      %19069 = OpVectorTimesScalar %v4float %10919 %float_0_000976592302\n      %18821 = OpExtInst %v4float %1 FMax %1284 %19069\n      %10218 = OpBitcast %v4int %11214\n       %8614 = OpShiftLeftLogical %v4int %10218 %770\n      %16547 = OpShiftRightArithmetic %v4int %8614 %770\n      %10920 = OpConvertSToF %v4float %16547\n      %21444 = OpVectorTimesScalar %v4float %10920 %float_0_000976592302\n      %17255 = OpExtInst %v4float %1 FMax %1284 %21444\n               OpBranch %23465\n      %12527 = OpLabel\n      %19236 = OpBitcast %v4float %14094\n      %14519 = OpBitcast %v4float %11214\n               OpBranch %23465\n      %23465 = OpLabel\n      %11256 = OpPhi %v4float %14519 %12527 %17255 %21195 %18683 %8248\n      %13715 = OpPhi %v4float %19236 %12527 %18821 %21195 %24269 %8248\n               OpBranch %21265\n      %21265 = OpLabel\n       %8972 = OpPhi %v4float %11256 %23465 %11255 %23464\n      %19595 = OpPhi %v4float %13715 %23465 %13714 %23464\n      %17222 = OpFAdd %v4float %18096 %19595\n       %6641 = OpFAdd %v4float %17754 %8972\n      %16376 = OpIAdd %uint %8114 %14258\n               OpSelectionMerge %20262 DontFlatten\n               OpBranchConditional %24753 %6594 %8962\n       %8962 = OpLabel\n      %22067 = OpShiftRightLogical %uint %16376 %int_2\n      %13375 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %22067\n      %15063 = OpLoad %uint %13375\n       %8520 = OpIAdd %uint %16376 %12535\n      %21673 = OpShiftRightLogical %uint %8520 %int_2\n      %19692 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %21673\n      %13130 = OpLoad %uint %19692\n       %8700 = OpIMul %uint %uint_2 %12535\n      %24270 = OpIAdd %uint %16376 %8700\n      %17908 = OpShiftRightLogical %uint %24270 %int_2\n      %19693 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17908\n      %13131 = OpLoad %uint %19693\n       %8701 = OpIMul %uint %uint_3 %12535\n      %24271 = OpIAdd %uint %16376 %8701\n      %17909 = OpShiftRightLogical %uint %24271 %int_2\n      %18695 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17909\n      %22189 = OpLoad %uint %18695\n      %19673 = OpCompositeConstruct %v4uint %15063 %13130 %13131 %22189\n      %19502 = OpIMul %uint %uint_4 %12535\n      %10824 = OpIAdd %uint %16376 %19502\n      %17910 = OpShiftRightLogical %uint %10824 %int_2\n      %19694 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17910\n      %13132 = OpLoad %uint %19694\n       %8702 = OpIMul %uint %uint_5 %12535\n      %24272 = OpIAdd %uint %16376 %8702\n      %17911 = OpShiftRightLogical %uint %24272 %int_2\n      %19695 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17911\n      %13133 = OpLoad %uint %19695\n       %8703 = OpIMul %uint %uint_6 %12535\n      %24273 = OpIAdd %uint %16376 %8703\n      %17912 = OpShiftRightLogical %uint %24273 %int_2\n      %19696 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17912\n      %13134 = OpLoad %uint %19696\n       %8704 = OpIMul %uint %uint_7 %12535\n      %24274 = OpIAdd %uint %16376 %8704\n      %17913 = OpShiftRightLogical %uint %24274 %int_2\n      %18696 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %17913\n      %24415 = OpLoad %uint %18696\n      %20786 = OpCompositeConstruct %v4uint %13132 %13133 %13134 %24415\n               OpBranch %20262\n       %6594 = OpLabel\n      %24489 = OpShiftRightLogical %uint %16376 %int_2\n      %13376 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %24489\n      %12615 = OpLoad %uint %13376\n      %11705 = OpIAdd %uint %24489 %uint_1\n       %6411 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11705\n      %23662 = OpLoad %uint %6411\n      %11706 = OpIAdd %uint %24489 %uint_2\n       %6412 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11706\n      %23663 = OpLoad %uint %6412\n      %11707 = OpIAdd %uint %24489 %uint_3\n      %24564 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11707\n      %14083 = OpLoad %uint %24564\n      %21619 = OpCompositeConstruct %v4uint %12615 %23662 %23663 %14083\n      %19334 = OpIAdd %uint %16376 %uint_16\n       %8240 = OpShiftRightLogical %uint %19334 %int_2\n      %19604 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %8240\n      %12616 = OpLoad %uint %19604\n      %11708 = OpIAdd %uint %8240 %uint_1\n       %6413 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11708\n      %23664 = OpLoad %uint %6413\n      %11709 = OpIAdd %uint %8240 %uint_2\n       %6414 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11709\n      %23665 = OpLoad %uint %6414\n      %11710 = OpIAdd %uint %8240 %uint_3\n      %24565 = OpAccessChain %_ptr_Uniform_uint %xe_resolve_edram %int_0 %11710\n      %16382 = OpLoad %uint %24565\n      %20787 = OpCompositeConstruct %v4uint %12616 %23664 %23665 %16382\n               OpBranch %20262\n      %20262 = OpLabel\n      %11215 = OpPhi %v4uint %20787 %6594 %20786 %8962\n      %14095 = OpPhi %v4uint %21619 %6594 %19673 %8962\n               OpSelectionMerge %21266 DontFlatten\n               OpBranchConditional %17369 %21034 %22404\n      %22404 = OpLabel\n               OpSelectionMerge %23466 None\n               OpSwitch %8576 %24629 0 %16008 1 %16008 2 %14405 10 %14405 3 %22978 12 %22978 4 %21196 6 %8249\n       %8249 = OpLabel\n      %24416 = OpCompositeExtract %uint %14095 0\n      %24685 = OpExtInst %v2float %1 UnpackHalf2x16 %24416\n       %8890 = OpCompositeExtract %float %24685 0\n       %7635 = OpCompositeExtract %uint %14095 1\n      %15630 = OpExtInst %v2float %1 UnpackHalf2x16 %7635\n       %8891 = OpCompositeExtract %float %15630 0\n       %7636 = OpCompositeExtract %uint %14095 2\n      %15631 = OpExtInst %v2float %1 UnpackHalf2x16 %7636\n       %8892 = OpCompositeExtract %float %15631 0\n       %7637 = OpCompositeExtract %uint %14095 3\n      %15598 = OpExtInst %v2float %1 UnpackHalf2x16 %7637\n      %10280 = OpCompositeExtract %float %15598 0\n      %24275 = OpCompositeConstruct %v4float %8890 %8891 %8892 %10280\n      %17280 = OpCompositeExtract %uint %11215 0\n      %18033 = OpExtInst %v2float %1 UnpackHalf2x16 %17280\n       %8893 = OpCompositeExtract %float %18033 0\n       %7638 = OpCompositeExtract %uint %11215 1\n      %15632 = OpExtInst %v2float %1 UnpackHalf2x16 %7638\n       %8894 = OpCompositeExtract %float %15632 0\n       %7639 = OpCompositeExtract %uint %11215 2\n      %15633 = OpExtInst %v2float %1 UnpackHalf2x16 %7639\n       %8895 = OpCompositeExtract %float %15633 0\n       %7640 = OpCompositeExtract %uint %11215 3\n      %15599 = OpExtInst %v2float %1 UnpackHalf2x16 %7640\n      %13472 = OpCompositeExtract %float %15599 0\n      %18684 = OpCompositeConstruct %v4float %8893 %8894 %8895 %13472\n               OpBranch %23466\n      %21196 = OpLabel\n      %24826 = OpBitcast %v4int %14095\n      %22564 = OpShiftLeftLogical %v4int %24826 %770\n      %16548 = OpShiftRightArithmetic %v4int %22564 %770\n      %10921 = OpConvertSToF %v4float %16548\n      %19070 = OpVectorTimesScalar %v4float %10921 %float_0_000976592302\n      %18822 = OpExtInst %v4float %1 FMax %1284 %19070\n      %10219 = OpBitcast %v4int %11215\n       %8615 = OpShiftLeftLogical %v4int %10219 %770\n      %16549 = OpShiftRightArithmetic %v4int %8615 %770\n      %10922 = OpConvertSToF %v4float %16549\n      %21445 = OpVectorTimesScalar %v4float %10922 %float_0_000976592302\n      %17256 = OpExtInst %v4float %1 FMax %1284 %21445\n               OpBranch %23466\n      %22978 = OpLabel\n      %19471 = OpSelect %uint %7475 %uint_20 %uint_0\n       %9145 = OpCompositeConstruct %v4uint %19471 %19471 %19471 %19471\n      %23883 = OpShiftRightLogical %v4uint %14095 %9145\n      %24041 = OpBitwiseAnd %v4uint %23883 %929\n      %18594 = OpBitwiseAnd %v4uint %23883 %721\n      %23446 = OpShiftRightLogical %v4uint %24041 %263\n      %16591 = OpIEqual %v4bool %23446 %2896\n      %11345 = OpExtInst %v4int %1 FindUMsb %18594\n      %10779 = OpBitcast %v4uint %11345\n       %6272 = OpISub %v4uint %263 %10779\n       %8726 = OpIAdd %v4uint %10779 %2575\n      %10357 = OpSelect %v4uint %16591 %8726 %23446\n      %23258 = OpShiftLeftLogical %v4uint %18594 %6272\n      %18848 = OpBitwiseAnd %v4uint %23258 %721\n      %10923 = OpSelect %v4uint %16591 %18848 %18594\n      %24575 = OpIAdd %v4uint %10357 %559\n      %20357 = OpShiftLeftLogical %v4uint %24575 %1127\n      %16300 = OpShiftLeftLogical %v4uint %10923 %749\n      %22405 = OpBitwiseOr %v4uint %20357 %16300\n      %13830 = OpIEqual %v4bool %24041 %2896\n      %16965 = OpSelect %v4uint %13830 %2896 %22405\n      %12359 = OpBitcast %v4float %16965\n      %24641 = OpShiftRightLogical %v4uint %11215 %9145\n      %14628 = OpBitwiseAnd %v4uint %24641 %929\n      %18595 = OpBitwiseAnd %v4uint %24641 %721\n      %23447 = OpShiftRightLogical %v4uint %14628 %263\n      %16592 = OpIEqual %v4bool %23447 %2896\n      %11346 = OpExtInst %v4int %1 FindUMsb %18595\n      %10780 = OpBitcast %v4uint %11346\n       %6273 = OpISub %v4uint %263 %10780\n       %8727 = OpIAdd %v4uint %10780 %2575\n      %10358 = OpSelect %v4uint %16592 %8727 %23447\n      %23259 = OpShiftLeftLogical %v4uint %18595 %6273\n      %18849 = OpBitwiseAnd %v4uint %23259 %721\n      %10925 = OpSelect %v4uint %16592 %18849 %18595\n      %24576 = OpIAdd %v4uint %10358 %559\n      %20358 = OpShiftLeftLogical %v4uint %24576 %1127\n      %16301 = OpShiftLeftLogical %v4uint %10925 %749\n      %22406 = OpBitwiseOr %v4uint %20358 %16301\n      %13831 = OpIEqual %v4bool %14628 %2896\n      %18010 = OpSelect %v4uint %13831 %2896 %22406\n      %22846 = OpBitcast %v4float %18010\n               OpBranch %23466\n      %14405 = OpLabel\n      %19472 = OpSelect %uint %7475 %uint_20 %uint_0\n       %9146 = OpCompositeConstruct %v4uint %19472 %19472 %19472 %19472\n      %22233 = OpShiftRightLogical %v4uint %14095 %9146\n      %19036 = OpBitwiseAnd %v4uint %22233 %929\n      %16139 = OpConvertUToF %v4float %19036\n      %21024 = OpVectorTimesScalar %v4float %16139 %float_0_000977517106\n       %7752 = OpShiftRightLogical %v4uint %11215 %9146\n      %11226 = OpBitwiseAnd %v4uint %7752 %929\n      %17184 = OpConvertUToF %v4float %11226\n      %12440 = OpVectorTimesScalar %v4float %17184 %float_0_000977517106\n               OpBranch %23466\n      %16008 = OpLabel\n      %19473 = OpSelect %uint %7475 %uint_16 %uint_0\n       %9147 = OpCompositeConstruct %v4uint %19473 %19473 %19473 %19473\n      %22234 = OpShiftRightLogical %v4uint %14095 %9147\n      %19037 = OpBitwiseAnd %v4uint %22234 %1611\n      %16140 = OpConvertUToF %v4float %19037\n      %21025 = OpVectorTimesScalar %v4float %16140 %float_0_00392156886\n       %7753 = OpShiftRightLogical %v4uint %11215 %9147\n      %11227 = OpBitwiseAnd %v4uint %7753 %1611\n      %17185 = OpConvertUToF %v4float %11227\n      %12441 = OpVectorTimesScalar %v4float %17185 %float_0_00392156886\n               OpBranch %23466\n      %24629 = OpLabel\n      %19237 = OpBitcast %v4float %14095\n      %14520 = OpBitcast %v4float %11215\n               OpBranch %23466\n      %23466 = OpLabel\n      %11257 = OpPhi %v4float %14520 %24629 %12441 %16008 %12440 %14405 %22846 %22978 %17256 %21196 %18684 %8249\n      %13716 = OpPhi %v4float %19237 %24629 %21025 %16008 %21024 %14405 %12359 %22978 %18822 %21196 %24275 %8249\n               OpBranch %21266\n      %21034 = OpLabel\n               OpSelectionMerge %23467 None\n               OpSwitch %8576 %12528 5 %21197 7 %8250\n       %8250 = OpLabel\n      %24417 = OpCompositeExtract %uint %14095 0\n      %24686 = OpExtInst %v2float %1 UnpackHalf2x16 %24417\n       %8896 = OpCompositeExtract %float %24686 0\n       %7641 = OpCompositeExtract %uint %14095 1\n      %15634 = OpExtInst %v2float %1 UnpackHalf2x16 %7641\n       %8897 = OpCompositeExtract %float %15634 0\n       %7642 = OpCompositeExtract %uint %14095 2\n      %15635 = OpExtInst %v2float %1 UnpackHalf2x16 %7642\n       %8898 = OpCompositeExtract %float %15635 0\n       %7643 = OpCompositeExtract %uint %14095 3\n      %15600 = OpExtInst %v2float %1 UnpackHalf2x16 %7643\n      %10281 = OpCompositeExtract %float %15600 0\n      %24276 = OpCompositeConstruct %v4float %8896 %8897 %8898 %10281\n      %17281 = OpCompositeExtract %uint %11215 0\n      %18034 = OpExtInst %v2float %1 UnpackHalf2x16 %17281\n       %8899 = OpCompositeExtract %float %18034 0\n       %7644 = OpCompositeExtract %uint %11215 1\n      %15636 = OpExtInst %v2float %1 UnpackHalf2x16 %7644\n       %8900 = OpCompositeExtract %float %15636 0\n       %7645 = OpCompositeExtract %uint %11215 2\n      %15637 = OpExtInst %v2float %1 UnpackHalf2x16 %7645\n       %8901 = OpCompositeExtract %float %15637 0\n       %7646 = OpCompositeExtract %uint %11215 3\n      %15601 = OpExtInst %v2float %1 UnpackHalf2x16 %7646\n      %13473 = OpCompositeExtract %float %15601 0\n      %18685 = OpCompositeConstruct %v4float %8899 %8900 %8901 %13473\n               OpBranch %23467\n      %21197 = OpLabel\n      %24827 = OpBitcast %v4int %14095\n      %22565 = OpShiftLeftLogical %v4int %24827 %770\n      %16550 = OpShiftRightArithmetic %v4int %22565 %770\n      %10926 = OpConvertSToF %v4float %16550\n      %19071 = OpVectorTimesScalar %v4float %10926 %float_0_000976592302\n      %18823 = OpExtInst %v4float %1 FMax %1284 %19071\n      %10220 = OpBitcast %v4int %11215\n       %8616 = OpShiftLeftLogical %v4int %10220 %770\n      %16551 = OpShiftRightArithmetic %v4int %8616 %770\n      %10927 = OpConvertSToF %v4float %16551\n      %21446 = OpVectorTimesScalar %v4float %10927 %float_0_000976592302\n      %17257 = OpExtInst %v4float %1 FMax %1284 %21446\n               OpBranch %23467\n      %12528 = OpLabel\n      %19238 = OpBitcast %v4float %14095\n      %14521 = OpBitcast %v4float %11215\n               OpBranch %23467\n      %23467 = OpLabel\n      %11258 = OpPhi %v4float %14521 %12528 %17257 %21197 %18685 %8250\n      %13717 = OpPhi %v4float %19238 %12528 %18823 %21197 %24276 %8250\n               OpBranch %21266\n      %21266 = OpLabel\n       %8973 = OpPhi %v4float %11258 %23467 %11257 %23466\n      %19596 = OpPhi %v4float %13717 %23467 %13716 %23466\n      %19521 = OpFAdd %v4float %17222 %19596\n      %23869 = OpFAdd %v4float %6641 %8973\n               OpBranch %24277\n      %24277 = OpLabel\n      %11175 = OpPhi %v4float %17754 %21264 %23869 %21266\n      %14420 = OpPhi %v4float %18096 %21264 %19521 %21266\n      %14522 = OpPhi %float %23069 %21264 %12090 %21266\n               OpBranch %21267\n      %21267 = OpLabel\n      %11176 = OpPhi %v4float %9826 %21263 %11175 %24277\n      %12387 = OpPhi %v4float %14051 %21263 %14420 %24277\n      %11944 = OpPhi %float %11052 %21263 %14522 %24277\n      %23688 = OpVectorTimesScalar %v4float %12387 %11944\n      %22826 = OpVectorTimesScalar %v4float %11176 %11944\n      %12810 = OpIEqual %bool %6697 %uint_0\n               OpSelectionMerge %13277 None\n               OpBranchConditional %12810 %11451 %13277\n      %11451 = OpLabel\n      %24156 = OpCompositeExtract %uint %19124 0\n      %22470 = OpINotEqual %bool %24156 %uint_0\n               OpBranch %13277\n      %13277 = OpLabel\n      %10928 = OpPhi %bool %12810 %21267 %22470 %11451\n               OpSelectionMerge %19649 DontFlatten\n               OpBranchConditional %10928 %11508 %19649\n      %11508 = OpLabel\n      %23599 = OpCompositeExtract %uint %19124 0\n      %17346 = OpUGreaterThanEqual %bool %23599 %uint_2\n               OpSelectionMerge %18757 None\n               OpBranchConditional %17346 %15877 %18757\n      %15877 = OpLabel\n      %24532 = OpUGreaterThanEqual %bool %23599 %uint_3\n               OpSelectionMerge %18756 None\n               OpBranchConditional %24532 %9760 %18756\n       %9760 = OpLabel\n      %20482 = OpCompositeExtract %float %23688 3\n      %14335 = OpCompositeInsert %v4float %20482 %23688 2\n               OpBranch %18756\n      %18756 = OpLabel\n      %17379 = OpPhi %v4float %23688 %15877 %14335 %9760\n       %7002 = OpCompositeExtract %float %17379 2\n      %15144 = OpCompositeInsert %v4float %7002 %17379 1\n               OpBranch %18757\n      %18757 = OpLabel\n      %17380 = OpPhi %v4float %23688 %11508 %15144 %18756\n       %7003 = OpCompositeExtract %float %17380 1\n      %15145 = OpCompositeInsert %v4float %7003 %17380 0\n               OpBranch %19649\n      %19649 = OpLabel\n      %11376 = OpPhi %v4float %23688 %13277 %15145 %18757\n      %19932 = OpIAdd %v2uint %9840 %23020\n      %24181 = OpShiftRightLogical %v2uint %19932 %1879\n       %7712 = OpUDiv %v2uint %24181 %23601\n      %18183 = OpIMul %v2uint %23601 %7712\n      %18273 = OpISub %v2uint %24181 %18183\n      %11232 = OpShiftLeftLogical %v2uint %7712 %1879\n      %13284 = OpCompositeExtract %uint %18273 0\n      %10872 = OpCompositeExtract %uint %23601 1\n      %22887 = OpIMul %uint %13284 %10872\n       %6943 = OpCompositeExtract %uint %18273 1\n      %10469 = OpIAdd %uint %22887 %6943\n      %18851 = OpBitwiseAnd %v2uint %19932 %2026\n      %10581 = OpShiftLeftLogical %uint %10469 %uint_7\n      %20916 = OpCompositeExtract %uint %18851 1\n      %23596 = OpShiftLeftLogical %uint %20916 %uint_4\n      %19833 = OpBitwiseOr %uint %10581 %23596\n      %22253 = OpCompositeExtract %uint %18851 0\n      %13999 = OpBitwiseOr %uint %19833 %22253\n               OpSelectionMerge %21313 DontFlatten\n               OpBranchConditional %18667 %10574 %21373\n      %21373 = OpLabel\n      %10608 = OpBitcast %v2int %11232\n      %17914 = OpCompositeExtract %int %10608 1\n      %19904 = OpShiftRightArithmetic %int %17914 %int_5\n      %22407 = OpBitcast %int %8444\n       %7938 = OpIMul %int %19904 %22407\n      %25154 = OpCompositeExtract %int %10608 0\n      %20423 = OpShiftRightArithmetic %int %25154 %int_5\n      %18864 = OpIAdd %int %7938 %20423\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %17914 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25154 %int_7\n       %9666 = OpBitwiseOr %int %21322 %20133\n      %10719 = OpBitwiseOr %int %9546 %9666\n      %10244 = OpBitcast %int %10719\n      %19580 = OpShiftRightArithmetic %int %17914 %int_4\n      %15163 = OpBitwiseAnd %int %19580 %int_1\n      %10406 = OpShiftRightArithmetic %int %25154 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %17914 %int_3\n      %20574 = OpBitwiseAnd %int %10425 %int_1\n      %21533 = OpShiftLeftLogical %int %20574 %int_1\n       %8902 = OpBitwiseXor %int %20766 %21533\n      %20598 = OpBitwiseAnd %int %17914 %int_1\n      %21035 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8902 %int_6\n      %18430 = OpBitwiseOr %int %21035 %6551\n       %7168 = OpShiftLeftLogical %int %15163 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %10244 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %10244 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %10244 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %10244 %int_8\n      %10282 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10282\n      %16869 = OpBitcast %uint %15225\n               OpBranch %21313\n      %10574 = OpLabel\n      %19866 = OpCompositeExtract %uint %11232 0\n      %11267 = OpCompositeExtract %uint %11232 1\n       %8414 = OpCompositeConstruct %v3uint %19866 %11267 %17416\n      %20125 = OpBitcast %v3int %8414\n      %11259 = OpCompositeExtract %int %20125 2\n      %19905 = OpShiftRightArithmetic %int %11259 %int_2\n      %22408 = OpBitcast %int %25203\n       %7939 = OpIMul %int %19905 %22408\n      %25155 = OpCompositeExtract %int %20125 1\n      %19055 = OpShiftRightArithmetic %int %25155 %int_4\n      %11053 = OpIAdd %int %7939 %19055\n      %16898 = OpBitcast %int %8444\n      %14944 = OpIMul %int %11053 %16898\n      %25156 = OpCompositeExtract %int %20125 0\n      %20424 = OpShiftRightArithmetic %int %25156 %int_5\n      %18940 = OpIAdd %int %14944 %20424\n       %8797 = OpShiftLeftLogical %int %18940 %int_7\n      %11434 = OpBitwiseAnd %int %11259 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %25155 %int_1\n      %21364 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21364 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %25156 %int_7\n      %13701 = OpBitwiseOr %int %17102 %20693\n      %10720 = OpBitwiseOr %int %8797 %13701\n      %10225 = OpBitcast %int %10720\n      %19829 = OpShiftRightArithmetic %int %25155 %int_3\n      %22588 = OpBitwiseXor %int %19829 %19905\n      %16793 = OpBitwiseAnd %int %22588 %int_1\n       %9616 = OpShiftRightArithmetic %int %25156 %int_3\n      %20575 = OpBitwiseAnd %int %9616 %int_3\n      %21534 = OpShiftLeftLogical %int %16793 %int_1\n       %8903 = OpBitwiseXor %int %20575 %21534\n      %20599 = OpBitwiseAnd %int %25155 %int_1\n      %21037 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8903 %int_6\n      %18431 = OpBitwiseOr %int %21037 %6552\n       %7169 = OpShiftLeftLogical %int %16793 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %10225 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %10225 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %10225 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %10225 %int_8\n      %10283 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10283\n      %16870 = OpBitcast %uint %15226\n               OpBranch %21313\n      %21313 = OpLabel\n       %9506 = OpPhi %uint %16870 %10574 %16869 %21373\n      %16843 = OpIMul %uint %8858 %10872\n      %11993 = OpIMul %uint %9506 %16843\n      %13053 = OpIAdd %uint %11993 %13999\n       %7128 = OpShiftRightLogical %uint %13053 %int_3\n      %24154 = OpExtInst %v4float %1 FClamp %11376 %2938 %1285\n       %9073 = OpVectorTimesScalar %v4float %24154 %float_255\n      %11878 = OpFAdd %v4float %9073 %325\n       %7647 = OpConvertFToU %v4uint %11878\n       %8705 = OpCompositeExtract %uint %7647 0\n      %12251 = OpCompositeExtract %uint %7647 1\n      %11561 = OpShiftLeftLogical %uint %12251 %int_8\n      %19814 = OpBitwiseOr %uint %8705 %11561\n      %21476 = OpCompositeExtract %uint %7647 2\n       %8560 = OpShiftLeftLogical %uint %21476 %int_16\n      %19815 = OpBitwiseOr %uint %19814 %8560\n      %21477 = OpCompositeExtract %uint %7647 3\n       %7292 = OpShiftLeftLogical %uint %21477 %int_24\n       %9255 = OpBitwiseOr %uint %19815 %7292\n       %7522 = OpExtInst %v4float %1 FClamp %22826 %2938 %1285\n       %8264 = OpVectorTimesScalar %v4float %7522 %float_255\n      %11879 = OpFAdd %v4float %8264 %325\n       %7648 = OpConvertFToU %v4uint %11879\n       %8706 = OpCompositeExtract %uint %7648 0\n      %12252 = OpCompositeExtract %uint %7648 1\n      %11562 = OpShiftLeftLogical %uint %12252 %int_8\n      %19816 = OpBitwiseOr %uint %8706 %11562\n      %21478 = OpCompositeExtract %uint %7648 2\n       %8561 = OpShiftLeftLogical %uint %21478 %int_16\n      %19817 = OpBitwiseOr %uint %19816 %8561\n      %21479 = OpCompositeExtract %uint %7648 3\n       %8541 = OpShiftLeftLogical %uint %21479 %int_24\n      %17498 = OpBitwiseOr %uint %19817 %8541\n      %11625 = OpCompositeConstruct %v2uint %9255 %17498\n       %8978 = OpAccessChain %_ptr_Uniform_v2uint %xe_resolve_dest %int_0 %7128\n               OpStore %8978 %11625\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t resolve_full_8bpp_scaled_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x000062AE, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000008, 0x00000008, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x000003F9, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x00090006, 0x000003F9, 0x00000000, 0x725F6578,\n    0x6C6F7365, 0x655F6576, 0x6D617264, 0x666E695F, 0x0000006F, 0x000A0006,\n    0x000003F9, 0x00000001, 0x725F6578, 0x6C6F7365, 0x635F6576, 0x64726F6F,\n    0x74616E69, 0x6E695F65, 0x00006F66, 0x00090006, 0x000003F9, 0x00000002,\n    0x725F6578, 0x6C6F7365, 0x645F6576, 0x5F747365, 0x6F666E69, 0x00000000,\n    0x000B0006, 0x000003F9, 0x00000003, 0x725F6578, 0x6C6F7365, 0x645F6576,\n    0x5F747365, 0x726F6F63, 0x616E6964, 0x695F6574, 0x006F666E, 0x00060005,\n    0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578, 0x00090005,\n    0x0000079C, 0x725F6578, 0x6C6F7365, 0x655F6576, 0x6D617264, 0x5F65785F,\n    0x636F6C62, 0x0000006B, 0x00050006, 0x0000079C, 0x00000000, 0x61746164,\n    0x00000000, 0x00070005, 0x00000CC7, 0x725F6578, 0x6C6F7365, 0x655F6576,\n    0x6D617264, 0x00000000, 0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C,\n    0x766E496C, 0x7461636F, 0x496E6F69, 0x00000044, 0x00090005, 0x000007A8,\n    0x725F6578, 0x6C6F7365, 0x645F6576, 0x5F747365, 0x625F6578, 0x6B636F6C,\n    0x00000000, 0x00050006, 0x000007A8, 0x00000000, 0x61746164, 0x00000000,\n    0x00060005, 0x00001592, 0x725F6578, 0x6C6F7365, 0x645F6576, 0x00747365,\n    0x00030047, 0x000003F9, 0x00000002, 0x00050048, 0x000003F9, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x000003F9, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x000003F9, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x000003F9, 0x00000003, 0x00000023, 0x0000000C, 0x00040047,\n    0x000007D0, 0x00000006, 0x00000004, 0x00030047, 0x0000079C, 0x00000003,\n    0x00040048, 0x0000079C, 0x00000000, 0x00000018, 0x00050048, 0x0000079C,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x00000CC7, 0x00000018,\n    0x00040047, 0x00000CC7, 0x00000021, 0x00000000, 0x00040047, 0x00000CC7,\n    0x00000022, 0x00000000, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C,\n    0x00040047, 0x000007D6, 0x00000006, 0x00000008, 0x00030047, 0x000007A8,\n    0x00000003, 0x00040048, 0x000007A8, 0x00000000, 0x00000019, 0x00050048,\n    0x000007A8, 0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x00001592,\n    0x00000019, 0x00040047, 0x00001592, 0x00000021, 0x00000000, 0x00040047,\n    0x00001592, 0x00000022, 0x00000001, 0x00040047, 0x00000AC7, 0x0000000B,\n    0x00000019, 0x00020013, 0x00000008, 0x00030021, 0x00000502, 0x00000008,\n    0x00040015, 0x0000000B, 0x00000020, 0x00000000, 0x00040017, 0x00000011,\n    0x0000000B, 0x00000002, 0x00040017, 0x00000017, 0x0000000B, 0x00000004,\n    0x00030016, 0x0000000D, 0x00000020, 0x00040017, 0x0000001D, 0x0000000D,\n    0x00000004, 0x00020014, 0x00000009, 0x00040015, 0x0000000C, 0x00000020,\n    0x00000001, 0x00040017, 0x00000012, 0x0000000C, 0x00000002, 0x00040017,\n    0x00000016, 0x0000000C, 0x00000003, 0x0004002B, 0x0000000D, 0x00000A0C,\n    0x00000000, 0x0004002B, 0x0000000D, 0x0000008A, 0x3F800000, 0x00040017,\n    0x0000001A, 0x0000000C, 0x00000004, 0x0004002B, 0x0000000D, 0x00000540,\n    0x437F0000, 0x0004002B, 0x0000000D, 0x000000FC, 0x3F000000, 0x0004002B,\n    0x0000000B, 0x00000A0A, 0x00000000, 0x0004002B, 0x0000000B, 0x00000A0D,\n    0x00000001, 0x0004002B, 0x0000000C, 0x00000A23, 0x00000008, 0x0004002B,\n    0x0000000B, 0x00000A10, 0x00000002, 0x0004002B, 0x0000000C, 0x00000A3B,\n    0x00000010, 0x0004002B, 0x0000000B, 0x00000A13, 0x00000003, 0x0004002B,\n    0x0000000C, 0x00000A53, 0x00000018, 0x0004002B, 0x0000000B, 0x00000144,\n    0x000000FF, 0x0004002B, 0x0000000D, 0x0000017A, 0x3B808081, 0x0004002B,\n    0x0000000B, 0x00000A44, 0x000003FF, 0x0004002B, 0x0000000D, 0x000006FE,\n    0x3A802008, 0x0004002B, 0x0000000B, 0x00000B87, 0x0000007F, 0x0004002B,\n    0x0000000B, 0x00000A1F, 0x00000007, 0x00040017, 0x00000013, 0x00000009,\n    0x00000004, 0x0004002B, 0x0000000B, 0x00000B7E, 0x0000007C, 0x0004002B,\n    0x0000000B, 0x00000A4F, 0x00000017, 0x0004002B, 0x0000000B, 0x00000A3A,\n    0x00000010, 0x0004002B, 0x0000000D, 0x00000341, 0xBF800000, 0x0004002B,\n    0x0000000D, 0x000007FE, 0x3A800100, 0x0005002C, 0x00000011, 0x0000072D,\n    0x00000A10, 0x00000A0D, 0x00040017, 0x0000000F, 0x00000009, 0x00000002,\n    0x0005002C, 0x00000011, 0x0000070F, 0x00000A0A, 0x00000A0A, 0x0005002C,\n    0x00000011, 0x00000724, 0x00000A0D, 0x00000A0D, 0x0005002C, 0x00000011,\n    0x00000718, 0x00000A0D, 0x00000A0A, 0x0004002B, 0x0000000B, 0x00000AFA,\n    0x00000050, 0x0005002C, 0x00000011, 0x00000A9F, 0x00000AFA, 0x00000A3A,\n    0x0004002B, 0x0000000B, 0x00000A84, 0x00000800, 0x0004002B, 0x0000000C,\n    0x00000A11, 0x00000002, 0x0004002B, 0x0000000C, 0x00000A17, 0x00000004,\n    0x0004002B, 0x0000000C, 0x00000A1D, 0x00000006, 0x0004002B, 0x0000000C,\n    0x00000A2C, 0x0000000B, 0x0004002B, 0x0000000C, 0x00000A38, 0x0000000F,\n    0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C,\n    0x00000A1A, 0x00000005, 0x0004002B, 0x0000000C, 0x00000A20, 0x00000007,\n    0x0004002B, 0x0000000C, 0x00000A2F, 0x0000000C, 0x0004002B, 0x0000000C,\n    0x00000A14, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A19, 0x00000005,\n    0x0004002B, 0x0000000B, 0x00000A16, 0x00000004, 0x0004002B, 0x0000000C,\n    0x00000A0B, 0x00000000, 0x0006001E, 0x000003F9, 0x0000000B, 0x0000000B,\n    0x0000000B, 0x0000000B, 0x00040020, 0x00000676, 0x00000009, 0x000003F9,\n    0x0004003B, 0x00000676, 0x00000CE9, 0x00000009, 0x00040020, 0x00000288,\n    0x00000009, 0x0000000B, 0x0004002B, 0x0000000B, 0x00000A28, 0x0000000A,\n    0x0004002B, 0x0000000B, 0x00000A31, 0x0000000D, 0x0004002B, 0x0000000B,\n    0x00000A81, 0x000007FF, 0x0004002B, 0x0000000B, 0x00000A52, 0x00000018,\n    0x0004002B, 0x0000000B, 0x00000A37, 0x0000000F, 0x0004002B, 0x0000000B,\n    0x00000A5E, 0x0000001C, 0x0004002B, 0x0000000B, 0x00000A43, 0x00000013,\n    0x0005002C, 0x00000011, 0x00000883, 0x00000A3A, 0x00000A43, 0x0004002B,\n    0x0000000B, 0x00000510, 0x20000000, 0x0005002C, 0x00000011, 0x0000073F,\n    0x00000A0A, 0x00000A16, 0x0004002B, 0x0000000C, 0x00000A29, 0x0000000A,\n    0x0004002B, 0x0000000B, 0x00000A22, 0x00000008, 0x0004002B, 0x0000000C,\n    0x00000A59, 0x0000001A, 0x0004002B, 0x0000000C, 0x00000A50, 0x00000017,\n    0x0004002B, 0x0000000B, 0x00000926, 0x01000000, 0x0004002B, 0x0000000B,\n    0x00000A46, 0x00000014, 0x0005002C, 0x00000011, 0x000008E3, 0x00000A46,\n    0x00000A52, 0x00040017, 0x00000014, 0x0000000B, 0x00000003, 0x00040017,\n    0x00000015, 0x0000000D, 0x00000002, 0x0003001D, 0x000007D0, 0x0000000B,\n    0x0003001E, 0x0000079C, 0x000007D0, 0x00040020, 0x00000A1B, 0x00000002,\n    0x0000079C, 0x0004003B, 0x00000A1B, 0x00000CC7, 0x00000002, 0x00040020,\n    0x00000289, 0x00000002, 0x0000000B, 0x0004002B, 0x0000000B, 0x00000A1C,\n    0x00000006, 0x0004002B, 0x0000000B, 0x00000207, 0x00000140, 0x00040020,\n    0x00000291, 0x00000001, 0x00000014, 0x0004003B, 0x00000291, 0x00000F48,\n    0x00000001, 0x00040020, 0x0000028A, 0x00000001, 0x0000000B, 0x0005002C,\n    0x00000011, 0x0000072A, 0x00000A13, 0x00000A0A, 0x0003001D, 0x000007D6,\n    0x00000011, 0x0003001E, 0x000007A8, 0x000007D6, 0x00040020, 0x00000A25,\n    0x00000002, 0x000007A8, 0x0004003B, 0x00000A25, 0x00001592, 0x00000002,\n    0x00040020, 0x0000028E, 0x00000002, 0x00000011, 0x0006002C, 0x00000014,\n    0x00000AC7, 0x00000A22, 0x00000A22, 0x00000A0D, 0x0005002C, 0x00000011,\n    0x000007A2, 0x00000A1F, 0x00000A1F, 0x0005002C, 0x00000011, 0x000007A3,\n    0x00000A37, 0x00000A0D, 0x0005002C, 0x00000011, 0x0000074E, 0x00000A13,\n    0x00000A13, 0x0005002C, 0x00000011, 0x0000084A, 0x00000A37, 0x00000A37,\n    0x0007002C, 0x0000001D, 0x00000504, 0x00000341, 0x00000341, 0x00000341,\n    0x00000341, 0x0007002C, 0x0000001A, 0x00000302, 0x00000A3B, 0x00000A3B,\n    0x00000A3B, 0x00000A3B, 0x0007002C, 0x00000017, 0x0000064B, 0x00000144,\n    0x00000144, 0x00000144, 0x00000144, 0x0007002C, 0x00000017, 0x000003A1,\n    0x00000A44, 0x00000A44, 0x00000A44, 0x00000A44, 0x0007002C, 0x00000017,\n    0x000002D1, 0x00000B87, 0x00000B87, 0x00000B87, 0x00000B87, 0x0007002C,\n    0x00000017, 0x00000107, 0x00000A1F, 0x00000A1F, 0x00000A1F, 0x00000A1F,\n    0x0007002C, 0x00000017, 0x00000B50, 0x00000A0A, 0x00000A0A, 0x00000A0A,\n    0x00000A0A, 0x0007002C, 0x00000017, 0x0000022F, 0x00000B7E, 0x00000B7E,\n    0x00000B7E, 0x00000B7E, 0x0007002C, 0x00000017, 0x00000467, 0x00000A4F,\n    0x00000A4F, 0x00000A4F, 0x00000A4F, 0x0007002C, 0x00000017, 0x000002ED,\n    0x00000A3A, 0x00000A3A, 0x00000A3A, 0x00000A3A, 0x0005002C, 0x00000011,\n    0x00000757, 0x00000A16, 0x00000A13, 0x0005002C, 0x00000011, 0x000007EA,\n    0x00000A37, 0x00000A1F, 0x0007002C, 0x0000001D, 0x00000B7A, 0x00000A0C,\n    0x00000A0C, 0x00000A0C, 0x00000A0C, 0x0007002C, 0x0000001D, 0x00000505,\n    0x0000008A, 0x0000008A, 0x0000008A, 0x0000008A, 0x0007002C, 0x0000001D,\n    0x00000145, 0x000000FC, 0x000000FC, 0x000000FC, 0x000000FC, 0x0004002B,\n    0x0000000C, 0x00000089, 0x3F800000, 0x0004002B, 0x0000000B, 0x000009F8,\n    0xFFFFFFFA, 0x0007002C, 0x00000017, 0x00000A0F, 0x000009F8, 0x000009F8,\n    0x000009F8, 0x000009F8, 0x0004002B, 0x0000000D, 0x0000016E, 0x3E800000,\n    0x00050036, 0x00000008, 0x0000161F, 0x00000000, 0x00000502, 0x000200F8,\n    0x00003B06, 0x000300F7, 0x00004C7A, 0x00000000, 0x000300FB, 0x00000A0A,\n    0x00002E68, 0x000200F8, 0x00002E68, 0x00050041, 0x00000288, 0x000056E5,\n    0x00000CE9, 0x00000A0B, 0x0004003D, 0x0000000B, 0x00003D0B, 0x000056E5,\n    0x00050041, 0x00000288, 0x000058AC, 0x00000CE9, 0x00000A0E, 0x0004003D,\n    0x0000000B, 0x00005158, 0x000058AC, 0x000500C7, 0x0000000B, 0x00005051,\n    0x00003D0B, 0x00000A44, 0x000500C2, 0x0000000B, 0x00004E0A, 0x00003D0B,\n    0x00000A28, 0x000500C7, 0x0000000B, 0x0000217E, 0x00004E0A, 0x00000A13,\n    0x000500C2, 0x0000000B, 0x0000520A, 0x00003D0B, 0x00000A31, 0x000500C7,\n    0x0000000B, 0x0000217F, 0x0000520A, 0x00000A81, 0x000500C2, 0x0000000B,\n    0x0000520B, 0x00003D0B, 0x00000A52, 0x000500C7, 0x0000000B, 0x00002180,\n    0x0000520B, 0x00000A37, 0x000500C2, 0x0000000B, 0x00004994, 0x00003D0B,\n    0x00000A5E, 0x000500C7, 0x0000000B, 0x000023AA, 0x00004994, 0x00000A0D,\n    0x00050050, 0x00000011, 0x000022A7, 0x00005158, 0x00005158, 0x000500C2,\n    0x00000011, 0x000025A1, 0x000022A7, 0x00000883, 0x000500C7, 0x00000011,\n    0x00005C31, 0x000025A1, 0x000007A2, 0x000500C7, 0x0000000B, 0x00005DDE,\n    0x00003D0B, 0x00000510, 0x000500AB, 0x00000009, 0x00003007, 0x00005DDE,\n    0x00000A0A, 0x000300F7, 0x00003954, 0x00000000, 0x000400FA, 0x00003007,\n    0x00004163, 0x000055E8, 0x000200F8, 0x000055E8, 0x000200F9, 0x00003954,\n    0x000200F8, 0x00004163, 0x000500C2, 0x00000011, 0x00003BAE, 0x00005C31,\n    0x00000724, 0x000200F9, 0x00003954, 0x000200F8, 0x00003954, 0x000700F5,\n    0x00000011, 0x00004AB4, 0x00003BAE, 0x00004163, 0x0000070F, 0x000055E8,\n    0x000500C2, 0x00000011, 0x00001B7E, 0x000022A7, 0x0000073F, 0x000500C7,\n    0x00000011, 0x00002DF9, 0x00001B7E, 0x000007A3, 0x000500C4, 0x00000011,\n    0x00003F4F, 0x00002DF9, 0x0000074E, 0x00050084, 0x00000011, 0x000059EB,\n    0x00003F4F, 0x00005C31, 0x000500C2, 0x0000000B, 0x00003343, 0x00005158,\n    0x00000A19, 0x000500C7, 0x0000000B, 0x000039C1, 0x00003343, 0x00000A81,\n    0x00050051, 0x0000000B, 0x0000229A, 0x00005C31, 0x00000000, 0x00050084,\n    0x0000000B, 0x000059D1, 0x000039C1, 0x0000229A, 0x00050041, 0x00000288,\n    0x00004E44, 0x00000CE9, 0x00000A11, 0x0004003D, 0x0000000B, 0x000048C4,\n    0x00004E44, 0x00050041, 0x00000288, 0x000058AD, 0x00000CE9, 0x00000A14,\n    0x0004003D, 0x0000000B, 0x00004FA3, 0x000058AD, 0x000500C7, 0x0000000B,\n    0x00005F7D, 0x000048C4, 0x00000A22, 0x000500AB, 0x00000009, 0x000048EB,\n    0x00005F7D, 0x00000A0A, 0x000500C2, 0x0000000B, 0x00002311, 0x000048C4,\n    0x00000A16, 0x000500C7, 0x0000000B, 0x00004408, 0x00002311, 0x00000A1F,\n    0x0004007C, 0x0000000C, 0x00005988, 0x000048C4, 0x000500C4, 0x0000000C,\n    0x0000358F, 0x00005988, 0x00000A29, 0x000500C3, 0x0000000C, 0x0000509C,\n    0x0000358F, 0x00000A59, 0x000500C4, 0x0000000C, 0x00004702, 0x0000509C,\n    0x00000A50, 0x00050080, 0x0000000C, 0x00001D26, 0x00004702, 0x00000089,\n    0x0004007C, 0x0000000D, 0x00002B2C, 0x00001D26, 0x000500C7, 0x0000000B,\n    0x00005879, 0x000048C4, 0x00000926, 0x000500AB, 0x00000009, 0x00001D33,\n    0x00005879, 0x00000A0A, 0x000500C7, 0x0000000B, 0x000020FC, 0x00004FA3,\n    0x00000A44, 0x000500C2, 0x0000000B, 0x00002F90, 0x00004FA3, 0x00000A28,\n    0x000500C7, 0x0000000B, 0x000061CE, 0x00002F90, 0x00000A44, 0x000500C4,\n    0x0000000B, 0x00006273, 0x000061CE, 0x00000A0E, 0x00050050, 0x00000011,\n    0x000028B6, 0x00004FA3, 0x00004FA3, 0x000500C2, 0x00000011, 0x00002891,\n    0x000028B6, 0x000008E3, 0x000500C7, 0x00000011, 0x00005B53, 0x00002891,\n    0x0000084A, 0x000500C4, 0x00000011, 0x00003F50, 0x00005B53, 0x0000074E,\n    0x00050084, 0x00000011, 0x000059EC, 0x00003F50, 0x00005C31, 0x000500C2,\n    0x0000000B, 0x00003213, 0x00004FA3, 0x00000A5E, 0x000500C7, 0x0000000B,\n    0x00003F4C, 0x00003213, 0x00000A1F, 0x00050041, 0x0000028A, 0x00005143,\n    0x00000F48, 0x00000A0A, 0x0004003D, 0x0000000B, 0x000022D1, 0x00005143,\n    0x000500AE, 0x00000009, 0x00001CED, 0x000022D1, 0x000059D1, 0x000300F7,\n    0x00004427, 0x00000002, 0x000400FA, 0x00001CED, 0x000055E9, 0x00004427,\n    0x000200F8, 0x000055E9, 0x000200F9, 0x00004C7A, 0x000200F8, 0x00004427,\n    0x0004003D, 0x00000014, 0x0000392D, 0x00000F48, 0x0007004F, 0x00000011,\n    0x00004849, 0x0000392D, 0x0000392D, 0x00000000, 0x00000001, 0x000500C4,\n    0x00000011, 0x00002670, 0x00004849, 0x0000072A, 0x00050051, 0x0000000B,\n    0x00001A29, 0x00002670, 0x00000000, 0x00050051, 0x0000000B, 0x000047F9,\n    0x00002670, 0x00000001, 0x00050051, 0x0000000B, 0x0000376A, 0x00004AB4,\n    0x00000001, 0x0007000C, 0x0000000B, 0x00005F7E, 0x00000001, 0x00000029,\n    0x000047F9, 0x0000376A, 0x00050050, 0x00000011, 0x000051EF, 0x00001A29,\n    0x00005F7E, 0x00050080, 0x00000011, 0x0000522C, 0x000051EF, 0x000059EB,\n    0x000500B2, 0x00000009, 0x00003ECB, 0x00003F4C, 0x00000A13, 0x000300F7,\n    0x00005CE0, 0x00000000, 0x000400FA, 0x00003ECB, 0x00002AEE, 0x00003AEF,\n    0x000200F8, 0x00003AEF, 0x000500AA, 0x00000009, 0x000034FE, 0x00003F4C,\n    0x00000A19, 0x000600A9, 0x0000000B, 0x000020F6, 0x000034FE, 0x00000A10,\n    0x00000A0A, 0x000200F9, 0x00005CE0, 0x000200F8, 0x00002AEE, 0x000200F9,\n    0x00005CE0, 0x000200F8, 0x00005CE0, 0x000700F5, 0x0000000B, 0x00004B64,\n    0x00003F4C, 0x00002AEE, 0x000020F6, 0x00003AEF, 0x00050050, 0x00000011,\n    0x000041BE, 0x0000217E, 0x0000217E, 0x000500AE, 0x0000000F, 0x00002E19,\n    0x000041BE, 0x0000072D, 0x000600A9, 0x00000011, 0x00004BB5, 0x00002E19,\n    0x00000724, 0x0000070F, 0x000500C4, 0x00000011, 0x00002AEA, 0x0000522C,\n    0x00004BB5, 0x00050050, 0x00000011, 0x0000605D, 0x00004B64, 0x00004B64,\n    0x000500C2, 0x00000011, 0x00002385, 0x0000605D, 0x00000718, 0x000500C7,\n    0x00000011, 0x00003EC8, 0x00002385, 0x00000724, 0x00050080, 0x00000011,\n    0x000046BA, 0x00002AEA, 0x00003EC8, 0x00050084, 0x00000011, 0x00005998,\n    0x00000A9F, 0x00005C31, 0x00050050, 0x00000011, 0x00002C44, 0x000023AA,\n    0x00000A0A, 0x000500C2, 0x00000011, 0x000019AB, 0x00005998, 0x00002C44,\n    0x00050086, 0x00000011, 0x000027A2, 0x000046BA, 0x000019AB, 0x00050051,\n    0x0000000B, 0x00004FA6, 0x000027A2, 0x00000001, 0x00050084, 0x0000000B,\n    0x00002B26, 0x00004FA6, 0x00005051, 0x00050051, 0x0000000B, 0x00006059,\n    0x000027A2, 0x00000000, 0x00050080, 0x0000000B, 0x00005420, 0x00002B26,\n    0x00006059, 0x00050080, 0x0000000B, 0x00002226, 0x0000217F, 0x00005420,\n    0x00050084, 0x00000011, 0x00005768, 0x000027A2, 0x000019AB, 0x00050082,\n    0x00000011, 0x000050EB, 0x000046BA, 0x00005768, 0x00050051, 0x0000000B,\n    0x00001C87, 0x00005998, 0x00000000, 0x00050051, 0x0000000B, 0x00005962,\n    0x00005998, 0x00000001, 0x00050084, 0x0000000B, 0x00003372, 0x00001C87,\n    0x00005962, 0x00050084, 0x0000000B, 0x000038D7, 0x00002226, 0x00003372,\n    0x00050051, 0x0000000B, 0x00001A95, 0x000050EB, 0x00000001, 0x00050051,\n    0x0000000B, 0x00005BE6, 0x000019AB, 0x00000000, 0x00050084, 0x0000000B,\n    0x00005966, 0x00001A95, 0x00005BE6, 0x00050051, 0x0000000B, 0x00001AE6,\n    0x000050EB, 0x00000000, 0x00050080, 0x0000000B, 0x000025E0, 0x00005966,\n    0x00001AE6, 0x000500C4, 0x0000000B, 0x00004665, 0x000025E0, 0x000023AA,\n    0x00050080, 0x0000000B, 0x000047BB, 0x000038D7, 0x00004665, 0x00050084,\n    0x0000000B, 0x00003662, 0x00003372, 0x00000A84, 0x00050089, 0x0000000B,\n    0x00005410, 0x000047BB, 0x00003662, 0x000500C4, 0x0000000B, 0x00001E06,\n    0x00005410, 0x00000A11, 0x000500AE, 0x00000009, 0x00003652, 0x0000217E,\n    0x00000A10, 0x000600A9, 0x0000000B, 0x00002C0D, 0x00003652, 0x00000A0D,\n    0x00000A0A, 0x00050080, 0x0000000B, 0x0000540E, 0x000023AA, 0x00002C0D,\n    0x000500C4, 0x0000000B, 0x000030F7, 0x00000A16, 0x0000540E, 0x000300F7,\n    0x000033DC, 0x00000000, 0x000400FA, 0x00001D33, 0x00004032, 0x000033DC,\n    0x000200F8, 0x00004032, 0x000500AB, 0x00000009, 0x00002959, 0x000023AA,\n    0x00000A0A, 0x000200F9, 0x000033DC, 0x000200F8, 0x000033DC, 0x000700F5,\n    0x00000009, 0x00002AAC, 0x00001D33, 0x00005CE0, 0x00002959, 0x00004032,\n    0x000300F7, 0x000062AD, 0x00000000, 0x000400FA, 0x00002AAC, 0x00005D41,\n    0x000062AD, 0x000200F8, 0x00005D41, 0x00050080, 0x0000000B, 0x00001B50,\n    0x00001E06, 0x00000A16, 0x000200F9, 0x000062AD, 0x000200F8, 0x000062AD,\n    0x000700F5, 0x0000000B, 0x00005E7C, 0x00001E06, 0x000033DC, 0x00001B50,\n    0x00005D41, 0x000500AA, 0x00000009, 0x000060B1, 0x000030F7, 0x00000A16,\n    0x000300F7, 0x00004F23, 0x00000002, 0x000400FA, 0x000060B1, 0x000019BF,\n    0x000022FF, 0x000200F8, 0x000022FF, 0x000500C2, 0x0000000B, 0x00005630,\n    0x00005E7C, 0x00000A11, 0x00060041, 0x00000289, 0x00003439, 0x00000CC7,\n    0x00000A0B, 0x00005630, 0x0004003D, 0x0000000B, 0x00003AD4, 0x00003439,\n    0x00050080, 0x0000000B, 0x00002145, 0x00005E7C, 0x000030F7, 0x000500C2,\n    0x0000000B, 0x000054A6, 0x00002145, 0x00000A11, 0x00060041, 0x00000289,\n    0x00004CDD, 0x00000CC7, 0x00000A0B, 0x000054A6, 0x0004003D, 0x0000000B,\n    0x0000333A, 0x00004CDD, 0x00050084, 0x0000000B, 0x000021ED, 0x00000A10,\n    0x000030F7, 0x00050080, 0x0000000B, 0x00005EBE, 0x00005E7C, 0x000021ED,\n    0x000500C2, 0x0000000B, 0x000045E2, 0x00005EBE, 0x00000A11, 0x00060041,\n    0x00000289, 0x00004CDE, 0x00000CC7, 0x00000A0B, 0x000045E2, 0x0004003D,\n    0x0000000B, 0x0000333B, 0x00004CDE, 0x00050084, 0x0000000B, 0x000021EE,\n    0x00000A13, 0x000030F7, 0x00050080, 0x0000000B, 0x00005EBF, 0x00005E7C,\n    0x000021EE, 0x000500C2, 0x0000000B, 0x000045E3, 0x00005EBF, 0x00000A11,\n    0x00060041, 0x00000289, 0x00004901, 0x00000CC7, 0x00000A0B, 0x000045E3,\n    0x0004003D, 0x0000000B, 0x000056AA, 0x00004901, 0x00070050, 0x00000017,\n    0x00004CD6, 0x00003AD4, 0x0000333A, 0x0000333B, 0x000056AA, 0x00050084,\n    0x0000000B, 0x00004C2B, 0x00000A16, 0x000030F7, 0x00050080, 0x0000000B,\n    0x00002A45, 0x00005E7C, 0x00004C2B, 0x000500C2, 0x0000000B, 0x000045E4,\n    0x00002A45, 0x00000A11, 0x00060041, 0x00000289, 0x00004CDF, 0x00000CC7,\n    0x00000A0B, 0x000045E4, 0x0004003D, 0x0000000B, 0x0000333C, 0x00004CDF,\n    0x00050084, 0x0000000B, 0x000021EF, 0x00000A19, 0x000030F7, 0x00050080,\n    0x0000000B, 0x00005EC0, 0x00005E7C, 0x000021EF, 0x000500C2, 0x0000000B,\n    0x000045E5, 0x00005EC0, 0x00000A11, 0x00060041, 0x00000289, 0x00004CE0,\n    0x00000CC7, 0x00000A0B, 0x000045E5, 0x0004003D, 0x0000000B, 0x0000333D,\n    0x00004CE0, 0x00050084, 0x0000000B, 0x000021F0, 0x00000A1C, 0x000030F7,\n    0x00050080, 0x0000000B, 0x00005EC1, 0x00005E7C, 0x000021F0, 0x000500C2,\n    0x0000000B, 0x000045E6, 0x00005EC1, 0x00000A11, 0x00060041, 0x00000289,\n    0x00004CE1, 0x00000CC7, 0x00000A0B, 0x000045E6, 0x0004003D, 0x0000000B,\n    0x0000333E, 0x00004CE1, 0x00050084, 0x0000000B, 0x000021F1, 0x00000A1F,\n    0x000030F7, 0x00050080, 0x0000000B, 0x00005EC2, 0x00005E7C, 0x000021F1,\n    0x000500C2, 0x0000000B, 0x000045E7, 0x00005EC2, 0x00000A11, 0x00060041,\n    0x00000289, 0x00004902, 0x00000CC7, 0x00000A0B, 0x000045E7, 0x0004003D,\n    0x0000000B, 0x00005F59, 0x00004902, 0x00070050, 0x00000017, 0x0000512C,\n    0x0000333C, 0x0000333D, 0x0000333E, 0x00005F59, 0x000200F9, 0x00004F23,\n    0x000200F8, 0x000019BF, 0x000500C2, 0x0000000B, 0x00005FA6, 0x00005E7C,\n    0x00000A11, 0x00060041, 0x00000289, 0x0000343A, 0x00000CC7, 0x00000A0B,\n    0x00005FA6, 0x0004003D, 0x0000000B, 0x00003141, 0x0000343A, 0x00050080,\n    0x0000000B, 0x00002DA7, 0x00005FA6, 0x00000A0D, 0x00060041, 0x00000289,\n    0x000018FF, 0x00000CC7, 0x00000A0B, 0x00002DA7, 0x0004003D, 0x0000000B,\n    0x00005C62, 0x000018FF, 0x00050080, 0x0000000B, 0x00002DA8, 0x00005FA6,\n    0x00000A10, 0x00060041, 0x00000289, 0x00001900, 0x00000CC7, 0x00000A0B,\n    0x00002DA8, 0x0004003D, 0x0000000B, 0x00005C63, 0x00001900, 0x00050080,\n    0x0000000B, 0x00002DA9, 0x00005FA6, 0x00000A13, 0x00060041, 0x00000289,\n    0x00005FEE, 0x00000CC7, 0x00000A0B, 0x00002DA9, 0x0004003D, 0x0000000B,\n    0x00003700, 0x00005FEE, 0x00070050, 0x00000017, 0x00005470, 0x00003141,\n    0x00005C62, 0x00005C63, 0x00003700, 0x00050080, 0x0000000B, 0x00004B83,\n    0x00005E7C, 0x00000A3A, 0x000500C2, 0x0000000B, 0x0000202D, 0x00004B83,\n    0x00000A11, 0x00060041, 0x00000289, 0x00004C91, 0x00000CC7, 0x00000A0B,\n    0x0000202D, 0x0004003D, 0x0000000B, 0x00003142, 0x00004C91, 0x00050080,\n    0x0000000B, 0x00002DAA, 0x0000202D, 0x00000A0D, 0x00060041, 0x00000289,\n    0x00001901, 0x00000CC7, 0x00000A0B, 0x00002DAA, 0x0004003D, 0x0000000B,\n    0x00005C64, 0x00001901, 0x00050080, 0x0000000B, 0x00002DAB, 0x0000202D,\n    0x00000A10, 0x00060041, 0x00000289, 0x00001902, 0x00000CC7, 0x00000A0B,\n    0x00002DAB, 0x0004003D, 0x0000000B, 0x00005C65, 0x00001902, 0x00050080,\n    0x0000000B, 0x00002DAC, 0x0000202D, 0x00000A13, 0x00060041, 0x00000289,\n    0x00005FEF, 0x00000CC7, 0x00000A0B, 0x00002DAC, 0x0004003D, 0x0000000B,\n    0x00003FFB, 0x00005FEF, 0x00070050, 0x00000017, 0x0000512D, 0x00003142,\n    0x00005C64, 0x00005C65, 0x00003FFB, 0x000200F9, 0x00004F23, 0x000200F8,\n    0x00004F23, 0x000700F5, 0x00000017, 0x00002629, 0x0000512D, 0x000019BF,\n    0x0000512C, 0x000022FF, 0x000700F5, 0x00000017, 0x000038EA, 0x00005470,\n    0x000019BF, 0x00004CD6, 0x000022FF, 0x000500AB, 0x00000009, 0x000043D9,\n    0x000023AA, 0x00000A0A, 0x000300F7, 0x0000530F, 0x00000002, 0x000400FA,\n    0x000043D9, 0x00005227, 0x0000577B, 0x000200F8, 0x0000577B, 0x000300F7,\n    0x00005BA4, 0x00000000, 0x001300FB, 0x00002180, 0x00006032, 0x00000000,\n    0x00003E85, 0x00000001, 0x00003E85, 0x00000002, 0x00003842, 0x0000000A,\n    0x00003842, 0x00000003, 0x000059BF, 0x0000000C, 0x000059BF, 0x00000004,\n    0x000052C6, 0x00000006, 0x00002033, 0x000200F8, 0x00002033, 0x00050051,\n    0x0000000B, 0x00005F56, 0x000038EA, 0x00000000, 0x0006000C, 0x00000015,\n    0x00006067, 0x00000001, 0x0000003E, 0x00005F56, 0x00050051, 0x0000000D,\n    0x00002294, 0x00006067, 0x00000000, 0x00050051, 0x0000000B, 0x00001DAF,\n    0x000038EA, 0x00000001, 0x0006000C, 0x00000015, 0x00003CF5, 0x00000001,\n    0x0000003E, 0x00001DAF, 0x00050051, 0x0000000D, 0x00002295, 0x00003CF5,\n    0x00000000, 0x00050051, 0x0000000B, 0x00001DB0, 0x000038EA, 0x00000002,\n    0x0006000C, 0x00000015, 0x00003CF6, 0x00000001, 0x0000003E, 0x00001DB0,\n    0x00050051, 0x0000000D, 0x00002296, 0x00003CF6, 0x00000000, 0x00050051,\n    0x0000000B, 0x00001DB1, 0x000038EA, 0x00000003, 0x0006000C, 0x00000015,\n    0x00003CE2, 0x00000001, 0x0000003E, 0x00001DB1, 0x00050051, 0x0000000D,\n    0x00002822, 0x00003CE2, 0x00000000, 0x00070050, 0x0000001D, 0x00005EB9,\n    0x00002294, 0x00002295, 0x00002296, 0x00002822, 0x00050051, 0x0000000B,\n    0x0000437A, 0x00002629, 0x00000000, 0x0006000C, 0x00000015, 0x0000466B,\n    0x00000001, 0x0000003E, 0x0000437A, 0x00050051, 0x0000000D, 0x00002297,\n    0x0000466B, 0x00000000, 0x00050051, 0x0000000B, 0x00001DB2, 0x00002629,\n    0x00000001, 0x0006000C, 0x00000015, 0x00003CF7, 0x00000001, 0x0000003E,\n    0x00001DB2, 0x00050051, 0x0000000D, 0x00002298, 0x00003CF7, 0x00000000,\n    0x00050051, 0x0000000B, 0x00001DB3, 0x00002629, 0x00000002, 0x0006000C,\n    0x00000015, 0x00003CF8, 0x00000001, 0x0000003E, 0x00001DB3, 0x00050051,\n    0x0000000D, 0x00002299, 0x00003CF8, 0x00000000, 0x00050051, 0x0000000B,\n    0x00001DB4, 0x00002629, 0x00000003, 0x0006000C, 0x00000015, 0x00003CE3,\n    0x00000001, 0x0000003E, 0x00001DB4, 0x00050051, 0x0000000D, 0x0000349A,\n    0x00003CE3, 0x00000000, 0x00070050, 0x0000001D, 0x000048F6, 0x00002297,\n    0x00002298, 0x00002299, 0x0000349A, 0x000200F9, 0x00005BA4, 0x000200F8,\n    0x000052C6, 0x0004007C, 0x0000001A, 0x000060F4, 0x000038EA, 0x000500C4,\n    0x0000001A, 0x0000581E, 0x000060F4, 0x00000302, 0x000500C3, 0x0000001A,\n    0x00004098, 0x0000581E, 0x00000302, 0x0004006F, 0x0000001D, 0x00002A97,\n    0x00004098, 0x0005008E, 0x0000001D, 0x00004A78, 0x00002A97, 0x000007FE,\n    0x0007000C, 0x0000001D, 0x00004980, 0x00000001, 0x00000028, 0x00000504,\n    0x00004A78, 0x0004007C, 0x0000001A, 0x000027E5, 0x00002629, 0x000500C4,\n    0x0000001A, 0x000021A1, 0x000027E5, 0x00000302, 0x000500C3, 0x0000001A,\n    0x00004099, 0x000021A1, 0x00000302, 0x0004006F, 0x0000001D, 0x00002A98,\n    0x00004099, 0x0005008E, 0x0000001D, 0x000053BF, 0x00002A98, 0x000007FE,\n    0x0007000C, 0x0000001D, 0x00004362, 0x00000001, 0x00000028, 0x00000504,\n    0x000053BF, 0x000200F9, 0x00005BA4, 0x000200F8, 0x000059BF, 0x000600A9,\n    0x0000000B, 0x00004C06, 0x00001D33, 0x00000A46, 0x00000A0A, 0x00070050,\n    0x00000017, 0x000023B0, 0x00004C06, 0x00004C06, 0x00004C06, 0x00004C06,\n    0x000500C2, 0x00000017, 0x00005D48, 0x000038EA, 0x000023B0, 0x000500C7,\n    0x00000017, 0x00005DE6, 0x00005D48, 0x000003A1, 0x000500C7, 0x00000017,\n    0x0000489C, 0x00005D48, 0x000002D1, 0x000500C2, 0x00000017, 0x00005B90,\n    0x00005DE6, 0x00000107, 0x000500AA, 0x00000013, 0x000040C9, 0x00005B90,\n    0x00000B50, 0x0006000C, 0x0000001A, 0x00002C4B, 0x00000001, 0x0000004B,\n    0x0000489C, 0x0004007C, 0x00000017, 0x00002A15, 0x00002C4B, 0x00050082,\n    0x00000017, 0x0000187A, 0x00000107, 0x00002A15, 0x00050080, 0x00000017,\n    0x00002210, 0x00002A15, 0x00000A0F, 0x000600A9, 0x00000017, 0x0000286F,\n    0x000040C9, 0x00002210, 0x00005B90, 0x000500C4, 0x00000017, 0x00005AD4,\n    0x0000489C, 0x0000187A, 0x000500C7, 0x00000017, 0x0000499A, 0x00005AD4,\n    0x000002D1, 0x000600A9, 0x00000017, 0x00002A9D, 0x000040C9, 0x0000499A,\n    0x0000489C, 0x00050080, 0x00000017, 0x00005FF9, 0x0000286F, 0x0000022F,\n    0x000500C4, 0x00000017, 0x00004F7F, 0x00005FF9, 0x00000467, 0x000500C4,\n    0x00000017, 0x00003FA6, 0x00002A9D, 0x000002ED, 0x000500C5, 0x00000017,\n    0x0000577C, 0x00004F7F, 0x00003FA6, 0x000500AA, 0x00000013, 0x00003600,\n    0x00005DE6, 0x00000B50, 0x000600A9, 0x00000017, 0x00004242, 0x00003600,\n    0x00000B50, 0x0000577C, 0x0004007C, 0x0000001D, 0x00003044, 0x00004242,\n    0x000500C2, 0x00000017, 0x0000603E, 0x00002629, 0x000023B0, 0x000500C7,\n    0x00000017, 0x00003921, 0x0000603E, 0x000003A1, 0x000500C7, 0x00000017,\n    0x0000489D, 0x0000603E, 0x000002D1, 0x000500C2, 0x00000017, 0x00005B91,\n    0x00003921, 0x00000107, 0x000500AA, 0x00000013, 0x000040CA, 0x00005B91,\n    0x00000B50, 0x0006000C, 0x0000001A, 0x00002C4C, 0x00000001, 0x0000004B,\n    0x0000489D, 0x0004007C, 0x00000017, 0x00002A16, 0x00002C4C, 0x00050082,\n    0x00000017, 0x0000187B, 0x00000107, 0x00002A16, 0x00050080, 0x00000017,\n    0x00002211, 0x00002A16, 0x00000A0F, 0x000600A9, 0x00000017, 0x00002870,\n    0x000040CA, 0x00002211, 0x00005B91, 0x000500C4, 0x00000017, 0x00005AD5,\n    0x0000489D, 0x0000187B, 0x000500C7, 0x00000017, 0x0000499B, 0x00005AD5,\n    0x000002D1, 0x000600A9, 0x00000017, 0x00002A9E, 0x000040CA, 0x0000499B,\n    0x0000489D, 0x00050080, 0x00000017, 0x00005FFA, 0x00002870, 0x0000022F,\n    0x000500C4, 0x00000017, 0x00004F80, 0x00005FFA, 0x00000467, 0x000500C4,\n    0x00000017, 0x00003FA7, 0x00002A9E, 0x000002ED, 0x000500C5, 0x00000017,\n    0x0000577D, 0x00004F80, 0x00003FA7, 0x000500AA, 0x00000013, 0x00003601,\n    0x00003921, 0x00000B50, 0x000600A9, 0x00000017, 0x00004657, 0x00003601,\n    0x00000B50, 0x0000577D, 0x0004007C, 0x0000001D, 0x0000593B, 0x00004657,\n    0x000200F9, 0x00005BA4, 0x000200F8, 0x00003842, 0x000600A9, 0x0000000B,\n    0x00004C07, 0x00001D33, 0x00000A46, 0x00000A0A, 0x00070050, 0x00000017,\n    0x000023B1, 0x00004C07, 0x00004C07, 0x00004C07, 0x00004C07, 0x000500C2,\n    0x00000017, 0x000056D3, 0x000038EA, 0x000023B1, 0x000500C7, 0x00000017,\n    0x00004A56, 0x000056D3, 0x000003A1, 0x00040070, 0x0000001D, 0x00003F05,\n    0x00004A56, 0x0005008E, 0x0000001D, 0x0000521A, 0x00003F05, 0x000006FE,\n    0x000500C2, 0x00000017, 0x00001E42, 0x00002629, 0x000023B1, 0x000500C7,\n    0x00000017, 0x00002BD4, 0x00001E42, 0x000003A1, 0x00040070, 0x0000001D,\n    0x0000431A, 0x00002BD4, 0x0005008E, 0x0000001D, 0x00003092, 0x0000431A,\n    0x000006FE, 0x000200F9, 0x00005BA4, 0x000200F8, 0x00003E85, 0x000600A9,\n    0x0000000B, 0x00004C08, 0x00001D33, 0x00000A3A, 0x00000A0A, 0x00070050,\n    0x00000017, 0x000023B2, 0x00004C08, 0x00004C08, 0x00004C08, 0x00004C08,\n    0x000500C2, 0x00000017, 0x000056D4, 0x000038EA, 0x000023B2, 0x000500C7,\n    0x00000017, 0x00004A57, 0x000056D4, 0x0000064B, 0x00040070, 0x0000001D,\n    0x00003F06, 0x00004A57, 0x0005008E, 0x0000001D, 0x0000521B, 0x00003F06,\n    0x0000017A, 0x000500C2, 0x00000017, 0x00001E43, 0x00002629, 0x000023B2,\n    0x000500C7, 0x00000017, 0x00002BD5, 0x00001E43, 0x0000064B, 0x00040070,\n    0x0000001D, 0x0000431B, 0x00002BD5, 0x0005008E, 0x0000001D, 0x00003093,\n    0x0000431B, 0x0000017A, 0x000200F9, 0x00005BA4, 0x000200F8, 0x00006032,\n    0x0004007C, 0x0000001D, 0x00004B1F, 0x000038EA, 0x0004007C, 0x0000001D,\n    0x000038B2, 0x00002629, 0x000200F9, 0x00005BA4, 0x000200F8, 0x00005BA4,\n    0x000F00F5, 0x0000001D, 0x00002BF3, 0x000038B2, 0x00006032, 0x00003093,\n    0x00003E85, 0x00003092, 0x00003842, 0x0000593B, 0x000059BF, 0x00004362,\n    0x000052C6, 0x000048F6, 0x00002033, 0x000F00F5, 0x0000001D, 0x0000358D,\n    0x00004B1F, 0x00006032, 0x0000521B, 0x00003E85, 0x0000521A, 0x00003842,\n    0x00003044, 0x000059BF, 0x00004980, 0x000052C6, 0x00005EB9, 0x00002033,\n    0x000200F9, 0x0000530F, 0x000200F8, 0x00005227, 0x000300F7, 0x00005BA5,\n    0x00000000, 0x000700FB, 0x00002180, 0x000030ED, 0x00000005, 0x000052C7,\n    0x00000007, 0x00002034, 0x000200F8, 0x00002034, 0x00050051, 0x0000000B,\n    0x00005F57, 0x000038EA, 0x00000000, 0x0006000C, 0x00000015, 0x00006068,\n    0x00000001, 0x0000003E, 0x00005F57, 0x00050051, 0x0000000D, 0x0000229B,\n    0x00006068, 0x00000000, 0x00050051, 0x0000000B, 0x00001DB5, 0x000038EA,\n    0x00000001, 0x0006000C, 0x00000015, 0x00003CF9, 0x00000001, 0x0000003E,\n    0x00001DB5, 0x00050051, 0x0000000D, 0x0000229C, 0x00003CF9, 0x00000000,\n    0x00050051, 0x0000000B, 0x00001DB6, 0x000038EA, 0x00000002, 0x0006000C,\n    0x00000015, 0x00003CFA, 0x00000001, 0x0000003E, 0x00001DB6, 0x00050051,\n    0x0000000D, 0x0000229D, 0x00003CFA, 0x00000000, 0x00050051, 0x0000000B,\n    0x00001DB7, 0x000038EA, 0x00000003, 0x0006000C, 0x00000015, 0x00003CE4,\n    0x00000001, 0x0000003E, 0x00001DB7, 0x00050051, 0x0000000D, 0x00002823,\n    0x00003CE4, 0x00000000, 0x00070050, 0x0000001D, 0x00005EBA, 0x0000229B,\n    0x0000229C, 0x0000229D, 0x00002823, 0x00050051, 0x0000000B, 0x0000437B,\n    0x00002629, 0x00000000, 0x0006000C, 0x00000015, 0x0000466C, 0x00000001,\n    0x0000003E, 0x0000437B, 0x00050051, 0x0000000D, 0x0000229E, 0x0000466C,\n    0x00000000, 0x00050051, 0x0000000B, 0x00001DB8, 0x00002629, 0x00000001,\n    0x0006000C, 0x00000015, 0x00003CFB, 0x00000001, 0x0000003E, 0x00001DB8,\n    0x00050051, 0x0000000D, 0x0000229F, 0x00003CFB, 0x00000000, 0x00050051,\n    0x0000000B, 0x00001DB9, 0x00002629, 0x00000002, 0x0006000C, 0x00000015,\n    0x00003CFC, 0x00000001, 0x0000003E, 0x00001DB9, 0x00050051, 0x0000000D,\n    0x000022A0, 0x00003CFC, 0x00000000, 0x00050051, 0x0000000B, 0x00001DBA,\n    0x00002629, 0x00000003, 0x0006000C, 0x00000015, 0x00003CE5, 0x00000001,\n    0x0000003E, 0x00001DBA, 0x00050051, 0x0000000D, 0x0000349B, 0x00003CE5,\n    0x00000000, 0x00070050, 0x0000001D, 0x000048F7, 0x0000229E, 0x0000229F,\n    0x000022A0, 0x0000349B, 0x000200F9, 0x00005BA5, 0x000200F8, 0x000052C7,\n    0x0004007C, 0x0000001A, 0x000060F5, 0x000038EA, 0x000500C4, 0x0000001A,\n    0x0000581F, 0x000060F5, 0x00000302, 0x000500C3, 0x0000001A, 0x0000409A,\n    0x0000581F, 0x00000302, 0x0004006F, 0x0000001D, 0x00002A99, 0x0000409A,\n    0x0005008E, 0x0000001D, 0x00004A79, 0x00002A99, 0x000007FE, 0x0007000C,\n    0x0000001D, 0x00004981, 0x00000001, 0x00000028, 0x00000504, 0x00004A79,\n    0x0004007C, 0x0000001A, 0x000027E6, 0x00002629, 0x000500C4, 0x0000001A,\n    0x000021A2, 0x000027E6, 0x00000302, 0x000500C3, 0x0000001A, 0x0000409B,\n    0x000021A2, 0x00000302, 0x0004006F, 0x0000001D, 0x00002A9A, 0x0000409B,\n    0x0005008E, 0x0000001D, 0x000053C0, 0x00002A9A, 0x000007FE, 0x0007000C,\n    0x0000001D, 0x00004363, 0x00000001, 0x00000028, 0x00000504, 0x000053C0,\n    0x000200F9, 0x00005BA5, 0x000200F8, 0x000030ED, 0x0004007C, 0x0000001D,\n    0x00004B20, 0x000038EA, 0x0004007C, 0x0000001D, 0x000038B3, 0x00002629,\n    0x000200F9, 0x00005BA5, 0x000200F8, 0x00005BA5, 0x000900F5, 0x0000001D,\n    0x00002BF4, 0x000038B3, 0x000030ED, 0x00004363, 0x000052C7, 0x000048F7,\n    0x00002034, 0x000900F5, 0x0000001D, 0x0000358E, 0x00004B20, 0x000030ED,\n    0x00004981, 0x000052C7, 0x00005EBA, 0x00002034, 0x000200F9, 0x0000530F,\n    0x000200F8, 0x0000530F, 0x000700F5, 0x0000001D, 0x00002662, 0x00002BF4,\n    0x00005BA5, 0x00002BF3, 0x00005BA4, 0x000700F5, 0x0000001D, 0x000036E3,\n    0x0000358E, 0x00005BA5, 0x0000358D, 0x00005BA4, 0x000500AE, 0x00000009,\n    0x00002E55, 0x00003F4C, 0x00000A16, 0x000300F7, 0x00005313, 0x00000002,\n    0x000400FA, 0x00002E55, 0x000051F1, 0x00005313, 0x000200F8, 0x000051F1,\n    0x00050084, 0x0000000B, 0x00002B47, 0x00000207, 0x0000229A, 0x00050085,\n    0x0000000D, 0x00005A1D, 0x00002B2C, 0x000000FC, 0x00050080, 0x0000000B,\n    0x00001FB2, 0x00005E7C, 0x00002B47, 0x000300F7, 0x00004F24, 0x00000002,\n    0x000400FA, 0x000060B1, 0x000019C0, 0x00002300, 0x000200F8, 0x00002300,\n    0x000500C2, 0x0000000B, 0x00005631, 0x00001FB2, 0x00000A11, 0x00060041,\n    0x00000289, 0x0000343B, 0x00000CC7, 0x00000A0B, 0x00005631, 0x0004003D,\n    0x0000000B, 0x00003AD5, 0x0000343B, 0x00050080, 0x0000000B, 0x00002146,\n    0x00001FB2, 0x000030F7, 0x000500C2, 0x0000000B, 0x000054A7, 0x00002146,\n    0x00000A11, 0x00060041, 0x00000289, 0x00004CE2, 0x00000CC7, 0x00000A0B,\n    0x000054A7, 0x0004003D, 0x0000000B, 0x0000333F, 0x00004CE2, 0x00050084,\n    0x0000000B, 0x000021F2, 0x00000A10, 0x000030F7, 0x00050080, 0x0000000B,\n    0x00005EC3, 0x00001FB2, 0x000021F2, 0x000500C2, 0x0000000B, 0x000045E8,\n    0x00005EC3, 0x00000A11, 0x00060041, 0x00000289, 0x00004CE3, 0x00000CC7,\n    0x00000A0B, 0x000045E8, 0x0004003D, 0x0000000B, 0x00003340, 0x00004CE3,\n    0x00050084, 0x0000000B, 0x000021F3, 0x00000A13, 0x000030F7, 0x00050080,\n    0x0000000B, 0x00005EC4, 0x00001FB2, 0x000021F3, 0x000500C2, 0x0000000B,\n    0x000045E9, 0x00005EC4, 0x00000A11, 0x00060041, 0x00000289, 0x00004903,\n    0x00000CC7, 0x00000A0B, 0x000045E9, 0x0004003D, 0x0000000B, 0x000056AB,\n    0x00004903, 0x00070050, 0x00000017, 0x00004CD7, 0x00003AD5, 0x0000333F,\n    0x00003340, 0x000056AB, 0x00050084, 0x0000000B, 0x00004C2C, 0x00000A16,\n    0x000030F7, 0x00050080, 0x0000000B, 0x00002A46, 0x00001FB2, 0x00004C2C,\n    0x000500C2, 0x0000000B, 0x000045EA, 0x00002A46, 0x00000A11, 0x00060041,\n    0x00000289, 0x00004CE4, 0x00000CC7, 0x00000A0B, 0x000045EA, 0x0004003D,\n    0x0000000B, 0x00003341, 0x00004CE4, 0x00050084, 0x0000000B, 0x000021F4,\n    0x00000A19, 0x000030F7, 0x00050080, 0x0000000B, 0x00005EC5, 0x00001FB2,\n    0x000021F4, 0x000500C2, 0x0000000B, 0x000045EB, 0x00005EC5, 0x00000A11,\n    0x00060041, 0x00000289, 0x00004CE5, 0x00000CC7, 0x00000A0B, 0x000045EB,\n    0x0004003D, 0x0000000B, 0x00003342, 0x00004CE5, 0x00050084, 0x0000000B,\n    0x000021F5, 0x00000A1C, 0x000030F7, 0x00050080, 0x0000000B, 0x00005EC6,\n    0x00001FB2, 0x000021F5, 0x000500C2, 0x0000000B, 0x000045EC, 0x00005EC6,\n    0x00000A11, 0x00060041, 0x00000289, 0x00004CE6, 0x00000CC7, 0x00000A0B,\n    0x000045EC, 0x0004003D, 0x0000000B, 0x00003344, 0x00004CE6, 0x00050084,\n    0x0000000B, 0x000021F6, 0x00000A1F, 0x000030F7, 0x00050080, 0x0000000B,\n    0x00005EC7, 0x00001FB2, 0x000021F6, 0x000500C2, 0x0000000B, 0x000045ED,\n    0x00005EC7, 0x00000A11, 0x00060041, 0x00000289, 0x00004904, 0x00000CC7,\n    0x00000A0B, 0x000045ED, 0x0004003D, 0x0000000B, 0x00005F5A, 0x00004904,\n    0x00070050, 0x00000017, 0x0000512E, 0x00003341, 0x00003342, 0x00003344,\n    0x00005F5A, 0x000200F9, 0x00004F24, 0x000200F8, 0x000019C0, 0x000500C2,\n    0x0000000B, 0x00005FA7, 0x00001FB2, 0x00000A11, 0x00060041, 0x00000289,\n    0x0000343C, 0x00000CC7, 0x00000A0B, 0x00005FA7, 0x0004003D, 0x0000000B,\n    0x00003143, 0x0000343C, 0x00050080, 0x0000000B, 0x00002DAD, 0x00005FA7,\n    0x00000A0D, 0x00060041, 0x00000289, 0x00001903, 0x00000CC7, 0x00000A0B,\n    0x00002DAD, 0x0004003D, 0x0000000B, 0x00005C66, 0x00001903, 0x00050080,\n    0x0000000B, 0x00002DAE, 0x00005FA7, 0x00000A10, 0x00060041, 0x00000289,\n    0x00001904, 0x00000CC7, 0x00000A0B, 0x00002DAE, 0x0004003D, 0x0000000B,\n    0x00005C67, 0x00001904, 0x00050080, 0x0000000B, 0x00002DAF, 0x00005FA7,\n    0x00000A13, 0x00060041, 0x00000289, 0x00005FF0, 0x00000CC7, 0x00000A0B,\n    0x00002DAF, 0x0004003D, 0x0000000B, 0x00003701, 0x00005FF0, 0x00070050,\n    0x00000017, 0x00005471, 0x00003143, 0x00005C66, 0x00005C67, 0x00003701,\n    0x00050080, 0x0000000B, 0x00004B84, 0x00001FB2, 0x00000A3A, 0x000500C2,\n    0x0000000B, 0x0000202E, 0x00004B84, 0x00000A11, 0x00060041, 0x00000289,\n    0x00004C92, 0x00000CC7, 0x00000A0B, 0x0000202E, 0x0004003D, 0x0000000B,\n    0x00003144, 0x00004C92, 0x00050080, 0x0000000B, 0x00002DB0, 0x0000202E,\n    0x00000A0D, 0x00060041, 0x00000289, 0x00001905, 0x00000CC7, 0x00000A0B,\n    0x00002DB0, 0x0004003D, 0x0000000B, 0x00005C68, 0x00001905, 0x00050080,\n    0x0000000B, 0x00002DB1, 0x0000202E, 0x00000A10, 0x00060041, 0x00000289,\n    0x00001906, 0x00000CC7, 0x00000A0B, 0x00002DB1, 0x0004003D, 0x0000000B,\n    0x00005C69, 0x00001906, 0x00050080, 0x0000000B, 0x00002DB2, 0x0000202E,\n    0x00000A13, 0x00060041, 0x00000289, 0x00005FF1, 0x00000CC7, 0x00000A0B,\n    0x00002DB2, 0x0004003D, 0x0000000B, 0x00003FFC, 0x00005FF1, 0x00070050,\n    0x00000017, 0x0000512F, 0x00003144, 0x00005C68, 0x00005C69, 0x00003FFC,\n    0x000200F9, 0x00004F24, 0x000200F8, 0x00004F24, 0x000700F5, 0x00000017,\n    0x00002BCD, 0x0000512F, 0x000019C0, 0x0000512E, 0x00002300, 0x000700F5,\n    0x00000017, 0x0000370D, 0x00005471, 0x000019C0, 0x00004CD7, 0x00002300,\n    0x000300F7, 0x00005310, 0x00000002, 0x000400FA, 0x000043D9, 0x00005228,\n    0x0000577E, 0x000200F8, 0x0000577E, 0x000300F7, 0x00005BA6, 0x00000000,\n    0x001300FB, 0x00002180, 0x00006033, 0x00000000, 0x00003E86, 0x00000001,\n    0x00003E86, 0x00000002, 0x00003843, 0x0000000A, 0x00003843, 0x00000003,\n    0x000059C0, 0x0000000C, 0x000059C0, 0x00000004, 0x000052C8, 0x00000006,\n    0x00002035, 0x000200F8, 0x00002035, 0x00050051, 0x0000000B, 0x00005F58,\n    0x0000370D, 0x00000000, 0x0006000C, 0x00000015, 0x00006069, 0x00000001,\n    0x0000003E, 0x00005F58, 0x00050051, 0x0000000D, 0x000022A1, 0x00006069,\n    0x00000000, 0x00050051, 0x0000000B, 0x00001DBB, 0x0000370D, 0x00000001,\n    0x0006000C, 0x00000015, 0x00003CFD, 0x00000001, 0x0000003E, 0x00001DBB,\n    0x00050051, 0x0000000D, 0x000022A2, 0x00003CFD, 0x00000000, 0x00050051,\n    0x0000000B, 0x00001DBC, 0x0000370D, 0x00000002, 0x0006000C, 0x00000015,\n    0x00003CFE, 0x00000001, 0x0000003E, 0x00001DBC, 0x00050051, 0x0000000D,\n    0x000022A3, 0x00003CFE, 0x00000000, 0x00050051, 0x0000000B, 0x00001DBD,\n    0x0000370D, 0x00000003, 0x0006000C, 0x00000015, 0x00003CE6, 0x00000001,\n    0x0000003E, 0x00001DBD, 0x00050051, 0x0000000D, 0x00002824, 0x00003CE6,\n    0x00000000, 0x00070050, 0x0000001D, 0x00005EBB, 0x000022A1, 0x000022A2,\n    0x000022A3, 0x00002824, 0x00050051, 0x0000000B, 0x0000437C, 0x00002BCD,\n    0x00000000, 0x0006000C, 0x00000015, 0x0000466D, 0x00000001, 0x0000003E,\n    0x0000437C, 0x00050051, 0x0000000D, 0x000022A4, 0x0000466D, 0x00000000,\n    0x00050051, 0x0000000B, 0x00001DBE, 0x00002BCD, 0x00000001, 0x0006000C,\n    0x00000015, 0x00003CFF, 0x00000001, 0x0000003E, 0x00001DBE, 0x00050051,\n    0x0000000D, 0x000022A5, 0x00003CFF, 0x00000000, 0x00050051, 0x0000000B,\n    0x00001DBF, 0x00002BCD, 0x00000002, 0x0006000C, 0x00000015, 0x00003D00,\n    0x00000001, 0x0000003E, 0x00001DBF, 0x00050051, 0x0000000D, 0x000022A6,\n    0x00003D00, 0x00000000, 0x00050051, 0x0000000B, 0x00001DC0, 0x00002BCD,\n    0x00000003, 0x0006000C, 0x00000015, 0x00003CE7, 0x00000001, 0x0000003E,\n    0x00001DC0, 0x00050051, 0x0000000D, 0x0000349C, 0x00003CE7, 0x00000000,\n    0x00070050, 0x0000001D, 0x000048F8, 0x000022A4, 0x000022A5, 0x000022A6,\n    0x0000349C, 0x000200F9, 0x00005BA6, 0x000200F8, 0x000052C8, 0x0004007C,\n    0x0000001A, 0x000060F6, 0x0000370D, 0x000500C4, 0x0000001A, 0x00005820,\n    0x000060F6, 0x00000302, 0x000500C3, 0x0000001A, 0x0000409C, 0x00005820,\n    0x00000302, 0x0004006F, 0x0000001D, 0x00002A9B, 0x0000409C, 0x0005008E,\n    0x0000001D, 0x00004A7A, 0x00002A9B, 0x000007FE, 0x0007000C, 0x0000001D,\n    0x00004982, 0x00000001, 0x00000028, 0x00000504, 0x00004A7A, 0x0004007C,\n    0x0000001A, 0x000027E7, 0x00002BCD, 0x000500C4, 0x0000001A, 0x000021A3,\n    0x000027E7, 0x00000302, 0x000500C3, 0x0000001A, 0x0000409D, 0x000021A3,\n    0x00000302, 0x0004006F, 0x0000001D, 0x00002A9C, 0x0000409D, 0x0005008E,\n    0x0000001D, 0x000053C1, 0x00002A9C, 0x000007FE, 0x0007000C, 0x0000001D,\n    0x00004364, 0x00000001, 0x00000028, 0x00000504, 0x000053C1, 0x000200F9,\n    0x00005BA6, 0x000200F8, 0x000059C0, 0x000600A9, 0x0000000B, 0x00004C09,\n    0x00001D33, 0x00000A46, 0x00000A0A, 0x00070050, 0x00000017, 0x000023B3,\n    0x00004C09, 0x00004C09, 0x00004C09, 0x00004C09, 0x000500C2, 0x00000017,\n    0x00005D49, 0x0000370D, 0x000023B3, 0x000500C7, 0x00000017, 0x00005DE7,\n    0x00005D49, 0x000003A1, 0x000500C7, 0x00000017, 0x0000489E, 0x00005D49,\n    0x000002D1, 0x000500C2, 0x00000017, 0x00005B92, 0x00005DE7, 0x00000107,\n    0x000500AA, 0x00000013, 0x000040CB, 0x00005B92, 0x00000B50, 0x0006000C,\n    0x0000001A, 0x00002C4D, 0x00000001, 0x0000004B, 0x0000489E, 0x0004007C,\n    0x00000017, 0x00002A17, 0x00002C4D, 0x00050082, 0x00000017, 0x0000187C,\n    0x00000107, 0x00002A17, 0x00050080, 0x00000017, 0x00002212, 0x00002A17,\n    0x00000A0F, 0x000600A9, 0x00000017, 0x00002871, 0x000040CB, 0x00002212,\n    0x00005B92, 0x000500C4, 0x00000017, 0x00005AD6, 0x0000489E, 0x0000187C,\n    0x000500C7, 0x00000017, 0x0000499C, 0x00005AD6, 0x000002D1, 0x000600A9,\n    0x00000017, 0x00002A9F, 0x000040CB, 0x0000499C, 0x0000489E, 0x00050080,\n    0x00000017, 0x00005FFB, 0x00002871, 0x0000022F, 0x000500C4, 0x00000017,\n    0x00004F81, 0x00005FFB, 0x00000467, 0x000500C4, 0x00000017, 0x00003FA8,\n    0x00002A9F, 0x000002ED, 0x000500C5, 0x00000017, 0x0000577F, 0x00004F81,\n    0x00003FA8, 0x000500AA, 0x00000013, 0x00003602, 0x00005DE7, 0x00000B50,\n    0x000600A9, 0x00000017, 0x00004243, 0x00003602, 0x00000B50, 0x0000577F,\n    0x0004007C, 0x0000001D, 0x00003045, 0x00004243, 0x000500C2, 0x00000017,\n    0x0000603F, 0x00002BCD, 0x000023B3, 0x000500C7, 0x00000017, 0x00003922,\n    0x0000603F, 0x000003A1, 0x000500C7, 0x00000017, 0x0000489F, 0x0000603F,\n    0x000002D1, 0x000500C2, 0x00000017, 0x00005B93, 0x00003922, 0x00000107,\n    0x000500AA, 0x00000013, 0x000040CC, 0x00005B93, 0x00000B50, 0x0006000C,\n    0x0000001A, 0x00002C4E, 0x00000001, 0x0000004B, 0x0000489F, 0x0004007C,\n    0x00000017, 0x00002A18, 0x00002C4E, 0x00050082, 0x00000017, 0x0000187D,\n    0x00000107, 0x00002A18, 0x00050080, 0x00000017, 0x00002213, 0x00002A18,\n    0x00000A0F, 0x000600A9, 0x00000017, 0x00002872, 0x000040CC, 0x00002213,\n    0x00005B93, 0x000500C4, 0x00000017, 0x00005AD7, 0x0000489F, 0x0000187D,\n    0x000500C7, 0x00000017, 0x0000499D, 0x00005AD7, 0x000002D1, 0x000600A9,\n    0x00000017, 0x00002AA0, 0x000040CC, 0x0000499D, 0x0000489F, 0x00050080,\n    0x00000017, 0x00005FFC, 0x00002872, 0x0000022F, 0x000500C4, 0x00000017,\n    0x00004F82, 0x00005FFC, 0x00000467, 0x000500C4, 0x00000017, 0x00003FA9,\n    0x00002AA0, 0x000002ED, 0x000500C5, 0x00000017, 0x00005780, 0x00004F82,\n    0x00003FA9, 0x000500AA, 0x00000013, 0x00003603, 0x00003922, 0x00000B50,\n    0x000600A9, 0x00000017, 0x00004658, 0x00003603, 0x00000B50, 0x00005780,\n    0x0004007C, 0x0000001D, 0x0000593C, 0x00004658, 0x000200F9, 0x00005BA6,\n    0x000200F8, 0x00003843, 0x000600A9, 0x0000000B, 0x00004C0A, 0x00001D33,\n    0x00000A46, 0x00000A0A, 0x00070050, 0x00000017, 0x000023B4, 0x00004C0A,\n    0x00004C0A, 0x00004C0A, 0x00004C0A, 0x000500C2, 0x00000017, 0x000056D5,\n    0x0000370D, 0x000023B4, 0x000500C7, 0x00000017, 0x00004A58, 0x000056D5,\n    0x000003A1, 0x00040070, 0x0000001D, 0x00003F07, 0x00004A58, 0x0005008E,\n    0x0000001D, 0x0000521C, 0x00003F07, 0x000006FE, 0x000500C2, 0x00000017,\n    0x00001E44, 0x00002BCD, 0x000023B4, 0x000500C7, 0x00000017, 0x00002BD6,\n    0x00001E44, 0x000003A1, 0x00040070, 0x0000001D, 0x0000431C, 0x00002BD6,\n    0x0005008E, 0x0000001D, 0x00003094, 0x0000431C, 0x000006FE, 0x000200F9,\n    0x00005BA6, 0x000200F8, 0x00003E86, 0x000600A9, 0x0000000B, 0x00004C0B,\n    0x00001D33, 0x00000A3A, 0x00000A0A, 0x00070050, 0x00000017, 0x000023B5,\n    0x00004C0B, 0x00004C0B, 0x00004C0B, 0x00004C0B, 0x000500C2, 0x00000017,\n    0x000056D6, 0x0000370D, 0x000023B5, 0x000500C7, 0x00000017, 0x00004A59,\n    0x000056D6, 0x0000064B, 0x00040070, 0x0000001D, 0x00003F08, 0x00004A59,\n    0x0005008E, 0x0000001D, 0x0000521D, 0x00003F08, 0x0000017A, 0x000500C2,\n    0x00000017, 0x00001E45, 0x00002BCD, 0x000023B5, 0x000500C7, 0x00000017,\n    0x00002BD7, 0x00001E45, 0x0000064B, 0x00040070, 0x0000001D, 0x0000431D,\n    0x00002BD7, 0x0005008E, 0x0000001D, 0x00003095, 0x0000431D, 0x0000017A,\n    0x000200F9, 0x00005BA6, 0x000200F8, 0x00006033, 0x0004007C, 0x0000001D,\n    0x00004B21, 0x0000370D, 0x0004007C, 0x0000001D, 0x000038B4, 0x00002BCD,\n    0x000200F9, 0x00005BA6, 0x000200F8, 0x00005BA6, 0x000F00F5, 0x0000001D,\n    0x00002BF5, 0x000038B4, 0x00006033, 0x00003095, 0x00003E86, 0x00003094,\n    0x00003843, 0x0000593C, 0x000059C0, 0x00004364, 0x000052C8, 0x000048F8,\n    0x00002035, 0x000F00F5, 0x0000001D, 0x00003590, 0x00004B21, 0x00006033,\n    0x0000521D, 0x00003E86, 0x0000521C, 0x00003843, 0x00003045, 0x000059C0,\n    0x00004982, 0x000052C8, 0x00005EBB, 0x00002035, 0x000200F9, 0x00005310,\n    0x000200F8, 0x00005228, 0x000300F7, 0x00005BA7, 0x00000000, 0x000700FB,\n    0x00002180, 0x000030EE, 0x00000005, 0x000052C9, 0x00000007, 0x00002036,\n    0x000200F8, 0x00002036, 0x00050051, 0x0000000B, 0x00005F5B, 0x0000370D,\n    0x00000000, 0x0006000C, 0x00000015, 0x0000606A, 0x00000001, 0x0000003E,\n    0x00005F5B, 0x00050051, 0x0000000D, 0x000022A8, 0x0000606A, 0x00000000,\n    0x00050051, 0x0000000B, 0x00001DC1, 0x0000370D, 0x00000001, 0x0006000C,\n    0x00000015, 0x00003D01, 0x00000001, 0x0000003E, 0x00001DC1, 0x00050051,\n    0x0000000D, 0x000022A9, 0x00003D01, 0x00000000, 0x00050051, 0x0000000B,\n    0x00001DC2, 0x0000370D, 0x00000002, 0x0006000C, 0x00000015, 0x00003D02,\n    0x00000001, 0x0000003E, 0x00001DC2, 0x00050051, 0x0000000D, 0x000022AA,\n    0x00003D02, 0x00000000, 0x00050051, 0x0000000B, 0x00001DC3, 0x0000370D,\n    0x00000003, 0x0006000C, 0x00000015, 0x00003CE8, 0x00000001, 0x0000003E,\n    0x00001DC3, 0x00050051, 0x0000000D, 0x00002825, 0x00003CE8, 0x00000000,\n    0x00070050, 0x0000001D, 0x00005EBC, 0x000022A8, 0x000022A9, 0x000022AA,\n    0x00002825, 0x00050051, 0x0000000B, 0x0000437D, 0x00002BCD, 0x00000000,\n    0x0006000C, 0x00000015, 0x0000466E, 0x00000001, 0x0000003E, 0x0000437D,\n    0x00050051, 0x0000000D, 0x000022AB, 0x0000466E, 0x00000000, 0x00050051,\n    0x0000000B, 0x00001DC4, 0x00002BCD, 0x00000001, 0x0006000C, 0x00000015,\n    0x00003D03, 0x00000001, 0x0000003E, 0x00001DC4, 0x00050051, 0x0000000D,\n    0x000022AC, 0x00003D03, 0x00000000, 0x00050051, 0x0000000B, 0x00001DC5,\n    0x00002BCD, 0x00000002, 0x0006000C, 0x00000015, 0x00003D04, 0x00000001,\n    0x0000003E, 0x00001DC5, 0x00050051, 0x0000000D, 0x000022AD, 0x00003D04,\n    0x00000000, 0x00050051, 0x0000000B, 0x00001DC6, 0x00002BCD, 0x00000003,\n    0x0006000C, 0x00000015, 0x00003CE9, 0x00000001, 0x0000003E, 0x00001DC6,\n    0x00050051, 0x0000000D, 0x0000349D, 0x00003CE9, 0x00000000, 0x00070050,\n    0x0000001D, 0x000048F9, 0x000022AB, 0x000022AC, 0x000022AD, 0x0000349D,\n    0x000200F9, 0x00005BA7, 0x000200F8, 0x000052C9, 0x0004007C, 0x0000001A,\n    0x000060F7, 0x0000370D, 0x000500C4, 0x0000001A, 0x00005821, 0x000060F7,\n    0x00000302, 0x000500C3, 0x0000001A, 0x0000409E, 0x00005821, 0x00000302,\n    0x0004006F, 0x0000001D, 0x00002AA1, 0x0000409E, 0x0005008E, 0x0000001D,\n    0x00004A7B, 0x00002AA1, 0x000007FE, 0x0007000C, 0x0000001D, 0x00004983,\n    0x00000001, 0x00000028, 0x00000504, 0x00004A7B, 0x0004007C, 0x0000001A,\n    0x000027E8, 0x00002BCD, 0x000500C4, 0x0000001A, 0x000021A4, 0x000027E8,\n    0x00000302, 0x000500C3, 0x0000001A, 0x0000409F, 0x000021A4, 0x00000302,\n    0x0004006F, 0x0000001D, 0x00002AA2, 0x0000409F, 0x0005008E, 0x0000001D,\n    0x000053C2, 0x00002AA2, 0x000007FE, 0x0007000C, 0x0000001D, 0x00004365,\n    0x00000001, 0x00000028, 0x00000504, 0x000053C2, 0x000200F9, 0x00005BA7,\n    0x000200F8, 0x000030EE, 0x0004007C, 0x0000001D, 0x00004B22, 0x0000370D,\n    0x0004007C, 0x0000001D, 0x000038B5, 0x00002BCD, 0x000200F9, 0x00005BA7,\n    0x000200F8, 0x00005BA7, 0x000900F5, 0x0000001D, 0x00002BF6, 0x000038B5,\n    0x000030EE, 0x00004365, 0x000052C9, 0x000048F9, 0x00002036, 0x000900F5,\n    0x0000001D, 0x00003591, 0x00004B22, 0x000030EE, 0x00004983, 0x000052C9,\n    0x00005EBC, 0x00002036, 0x000200F9, 0x00005310, 0x000200F8, 0x00005310,\n    0x000700F5, 0x0000001D, 0x0000230B, 0x00002BF6, 0x00005BA7, 0x00002BF5,\n    0x00005BA6, 0x000700F5, 0x0000001D, 0x00004C8A, 0x00003591, 0x00005BA7,\n    0x00003590, 0x00005BA6, 0x00050081, 0x0000001D, 0x000046B0, 0x000036E3,\n    0x00004C8A, 0x00050081, 0x0000001D, 0x0000455A, 0x00002662, 0x0000230B,\n    0x000500AE, 0x00000009, 0x0000387D, 0x00003F4C, 0x00000A1C, 0x000300F7,\n    0x00005ED5, 0x00000002, 0x000400FA, 0x0000387D, 0x000026B1, 0x00005ED5,\n    0x000200F8, 0x000026B1, 0x000500C4, 0x0000000B, 0x000037B2, 0x00000A16,\n    0x000023AA, 0x00050085, 0x0000000D, 0x00002F3A, 0x00002B2C, 0x0000016E,\n    0x00050080, 0x0000000B, 0x000051FC, 0x00005E7C, 0x000037B2, 0x000300F7,\n    0x00004F25, 0x00000002, 0x000400FA, 0x000060B1, 0x000019C1, 0x00002301,\n    0x000200F8, 0x00002301, 0x000500C2, 0x0000000B, 0x00005632, 0x000051FC,\n    0x00000A11, 0x00060041, 0x00000289, 0x0000343D, 0x00000CC7, 0x00000A0B,\n    0x00005632, 0x0004003D, 0x0000000B, 0x00003AD6, 0x0000343D, 0x00050080,\n    0x0000000B, 0x00002147, 0x000051FC, 0x000030F7, 0x000500C2, 0x0000000B,\n    0x000054A8, 0x00002147, 0x00000A11, 0x00060041, 0x00000289, 0x00004CE7,\n    0x00000CC7, 0x00000A0B, 0x000054A8, 0x0004003D, 0x0000000B, 0x00003345,\n    0x00004CE7, 0x00050084, 0x0000000B, 0x000021F7, 0x00000A10, 0x000030F7,\n    0x00050080, 0x0000000B, 0x00005EC8, 0x000051FC, 0x000021F7, 0x000500C2,\n    0x0000000B, 0x000045EE, 0x00005EC8, 0x00000A11, 0x00060041, 0x00000289,\n    0x00004CE8, 0x00000CC7, 0x00000A0B, 0x000045EE, 0x0004003D, 0x0000000B,\n    0x00003346, 0x00004CE8, 0x00050084, 0x0000000B, 0x000021F8, 0x00000A13,\n    0x000030F7, 0x00050080, 0x0000000B, 0x00005EC9, 0x000051FC, 0x000021F8,\n    0x000500C2, 0x0000000B, 0x000045EF, 0x00005EC9, 0x00000A11, 0x00060041,\n    0x00000289, 0x00004905, 0x00000CC7, 0x00000A0B, 0x000045EF, 0x0004003D,\n    0x0000000B, 0x000056AC, 0x00004905, 0x00070050, 0x00000017, 0x00004CD8,\n    0x00003AD6, 0x00003345, 0x00003346, 0x000056AC, 0x00050084, 0x0000000B,\n    0x00004C2D, 0x00000A16, 0x000030F7, 0x00050080, 0x0000000B, 0x00002A47,\n    0x000051FC, 0x00004C2D, 0x000500C2, 0x0000000B, 0x000045F0, 0x00002A47,\n    0x00000A11, 0x00060041, 0x00000289, 0x00004CE9, 0x00000CC7, 0x00000A0B,\n    0x000045F0, 0x0004003D, 0x0000000B, 0x00003347, 0x00004CE9, 0x00050084,\n    0x0000000B, 0x000021F9, 0x00000A19, 0x000030F7, 0x00050080, 0x0000000B,\n    0x00005ECA, 0x000051FC, 0x000021F9, 0x000500C2, 0x0000000B, 0x000045F1,\n    0x00005ECA, 0x00000A11, 0x00060041, 0x00000289, 0x00004CEA, 0x00000CC7,\n    0x00000A0B, 0x000045F1, 0x0004003D, 0x0000000B, 0x00003348, 0x00004CEA,\n    0x00050084, 0x0000000B, 0x000021FA, 0x00000A1C, 0x000030F7, 0x00050080,\n    0x0000000B, 0x00005ECB, 0x000051FC, 0x000021FA, 0x000500C2, 0x0000000B,\n    0x000045F2, 0x00005ECB, 0x00000A11, 0x00060041, 0x00000289, 0x00004CEB,\n    0x00000CC7, 0x00000A0B, 0x000045F2, 0x0004003D, 0x0000000B, 0x00003349,\n    0x00004CEB, 0x00050084, 0x0000000B, 0x000021FB, 0x00000A1F, 0x000030F7,\n    0x00050080, 0x0000000B, 0x00005ECC, 0x000051FC, 0x000021FB, 0x000500C2,\n    0x0000000B, 0x000045F3, 0x00005ECC, 0x00000A11, 0x00060041, 0x00000289,\n    0x00004906, 0x00000CC7, 0x00000A0B, 0x000045F3, 0x0004003D, 0x0000000B,\n    0x00005F5C, 0x00004906, 0x00070050, 0x00000017, 0x00005130, 0x00003347,\n    0x00003348, 0x00003349, 0x00005F5C, 0x000200F9, 0x00004F25, 0x000200F8,\n    0x000019C1, 0x000500C2, 0x0000000B, 0x00005FA8, 0x000051FC, 0x00000A11,\n    0x00060041, 0x00000289, 0x0000343E, 0x00000CC7, 0x00000A0B, 0x00005FA8,\n    0x0004003D, 0x0000000B, 0x00003145, 0x0000343E, 0x00050080, 0x0000000B,\n    0x00002DB3, 0x00005FA8, 0x00000A0D, 0x00060041, 0x00000289, 0x00001907,\n    0x00000CC7, 0x00000A0B, 0x00002DB3, 0x0004003D, 0x0000000B, 0x00005C6A,\n    0x00001907, 0x00050080, 0x0000000B, 0x00002DB4, 0x00005FA8, 0x00000A10,\n    0x00060041, 0x00000289, 0x00001908, 0x00000CC7, 0x00000A0B, 0x00002DB4,\n    0x0004003D, 0x0000000B, 0x00005C6B, 0x00001908, 0x00050080, 0x0000000B,\n    0x00002DB5, 0x00005FA8, 0x00000A13, 0x00060041, 0x00000289, 0x00005FF2,\n    0x00000CC7, 0x00000A0B, 0x00002DB5, 0x0004003D, 0x0000000B, 0x00003702,\n    0x00005FF2, 0x00070050, 0x00000017, 0x00005472, 0x00003145, 0x00005C6A,\n    0x00005C6B, 0x00003702, 0x00050080, 0x0000000B, 0x00004B85, 0x000051FC,\n    0x00000A3A, 0x000500C2, 0x0000000B, 0x0000202F, 0x00004B85, 0x00000A11,\n    0x00060041, 0x00000289, 0x00004C93, 0x00000CC7, 0x00000A0B, 0x0000202F,\n    0x0004003D, 0x0000000B, 0x00003146, 0x00004C93, 0x00050080, 0x0000000B,\n    0x00002DB6, 0x0000202F, 0x00000A0D, 0x00060041, 0x00000289, 0x00001909,\n    0x00000CC7, 0x00000A0B, 0x00002DB6, 0x0004003D, 0x0000000B, 0x00005C6C,\n    0x00001909, 0x00050080, 0x0000000B, 0x00002DB7, 0x0000202F, 0x00000A10,\n    0x00060041, 0x00000289, 0x0000190A, 0x00000CC7, 0x00000A0B, 0x00002DB7,\n    0x0004003D, 0x0000000B, 0x00005C6D, 0x0000190A, 0x00050080, 0x0000000B,\n    0x00002DB8, 0x0000202F, 0x00000A13, 0x00060041, 0x00000289, 0x00005FF3,\n    0x00000CC7, 0x00000A0B, 0x00002DB8, 0x0004003D, 0x0000000B, 0x00003FFD,\n    0x00005FF3, 0x00070050, 0x00000017, 0x00005131, 0x00003146, 0x00005C6C,\n    0x00005C6D, 0x00003FFD, 0x000200F9, 0x00004F25, 0x000200F8, 0x00004F25,\n    0x000700F5, 0x00000017, 0x00002BCE, 0x00005131, 0x000019C1, 0x00005130,\n    0x00002301, 0x000700F5, 0x00000017, 0x0000370E, 0x00005472, 0x000019C1,\n    0x00004CD8, 0x00002301, 0x000300F7, 0x00005311, 0x00000002, 0x000400FA,\n    0x000043D9, 0x00005229, 0x00005781, 0x000200F8, 0x00005781, 0x000300F7,\n    0x00005BA8, 0x00000000, 0x001300FB, 0x00002180, 0x00006034, 0x00000000,\n    0x00003E87, 0x00000001, 0x00003E87, 0x00000002, 0x00003844, 0x0000000A,\n    0x00003844, 0x00000003, 0x000059C1, 0x0000000C, 0x000059C1, 0x00000004,\n    0x000052CA, 0x00000006, 0x00002037, 0x000200F8, 0x00002037, 0x00050051,\n    0x0000000B, 0x00005F5D, 0x0000370E, 0x00000000, 0x0006000C, 0x00000015,\n    0x0000606B, 0x00000001, 0x0000003E, 0x00005F5D, 0x00050051, 0x0000000D,\n    0x000022AE, 0x0000606B, 0x00000000, 0x00050051, 0x0000000B, 0x00001DC7,\n    0x0000370E, 0x00000001, 0x0006000C, 0x00000015, 0x00003D05, 0x00000001,\n    0x0000003E, 0x00001DC7, 0x00050051, 0x0000000D, 0x000022AF, 0x00003D05,\n    0x00000000, 0x00050051, 0x0000000B, 0x00001DC8, 0x0000370E, 0x00000002,\n    0x0006000C, 0x00000015, 0x00003D06, 0x00000001, 0x0000003E, 0x00001DC8,\n    0x00050051, 0x0000000D, 0x000022B0, 0x00003D06, 0x00000000, 0x00050051,\n    0x0000000B, 0x00001DC9, 0x0000370E, 0x00000003, 0x0006000C, 0x00000015,\n    0x00003CEA, 0x00000001, 0x0000003E, 0x00001DC9, 0x00050051, 0x0000000D,\n    0x00002826, 0x00003CEA, 0x00000000, 0x00070050, 0x0000001D, 0x00005EBD,\n    0x000022AE, 0x000022AF, 0x000022B0, 0x00002826, 0x00050051, 0x0000000B,\n    0x0000437E, 0x00002BCE, 0x00000000, 0x0006000C, 0x00000015, 0x0000466F,\n    0x00000001, 0x0000003E, 0x0000437E, 0x00050051, 0x0000000D, 0x000022B1,\n    0x0000466F, 0x00000000, 0x00050051, 0x0000000B, 0x00001DCA, 0x00002BCE,\n    0x00000001, 0x0006000C, 0x00000015, 0x00003D07, 0x00000001, 0x0000003E,\n    0x00001DCA, 0x00050051, 0x0000000D, 0x000022B2, 0x00003D07, 0x00000000,\n    0x00050051, 0x0000000B, 0x00001DCB, 0x00002BCE, 0x00000002, 0x0006000C,\n    0x00000015, 0x00003D08, 0x00000001, 0x0000003E, 0x00001DCB, 0x00050051,\n    0x0000000D, 0x000022B3, 0x00003D08, 0x00000000, 0x00050051, 0x0000000B,\n    0x00001DCC, 0x00002BCE, 0x00000003, 0x0006000C, 0x00000015, 0x00003CEB,\n    0x00000001, 0x0000003E, 0x00001DCC, 0x00050051, 0x0000000D, 0x0000349E,\n    0x00003CEB, 0x00000000, 0x00070050, 0x0000001D, 0x000048FA, 0x000022B1,\n    0x000022B2, 0x000022B3, 0x0000349E, 0x000200F9, 0x00005BA8, 0x000200F8,\n    0x000052CA, 0x0004007C, 0x0000001A, 0x000060F8, 0x0000370E, 0x000500C4,\n    0x0000001A, 0x00005822, 0x000060F8, 0x00000302, 0x000500C3, 0x0000001A,\n    0x000040A0, 0x00005822, 0x00000302, 0x0004006F, 0x0000001D, 0x00002AA3,\n    0x000040A0, 0x0005008E, 0x0000001D, 0x00004A7C, 0x00002AA3, 0x000007FE,\n    0x0007000C, 0x0000001D, 0x00004984, 0x00000001, 0x00000028, 0x00000504,\n    0x00004A7C, 0x0004007C, 0x0000001A, 0x000027E9, 0x00002BCE, 0x000500C4,\n    0x0000001A, 0x000021A5, 0x000027E9, 0x00000302, 0x000500C3, 0x0000001A,\n    0x000040A1, 0x000021A5, 0x00000302, 0x0004006F, 0x0000001D, 0x00002AA4,\n    0x000040A1, 0x0005008E, 0x0000001D, 0x000053C3, 0x00002AA4, 0x000007FE,\n    0x0007000C, 0x0000001D, 0x00004366, 0x00000001, 0x00000028, 0x00000504,\n    0x000053C3, 0x000200F9, 0x00005BA8, 0x000200F8, 0x000059C1, 0x000600A9,\n    0x0000000B, 0x00004C0C, 0x00001D33, 0x00000A46, 0x00000A0A, 0x00070050,\n    0x00000017, 0x000023B6, 0x00004C0C, 0x00004C0C, 0x00004C0C, 0x00004C0C,\n    0x000500C2, 0x00000017, 0x00005D4A, 0x0000370E, 0x000023B6, 0x000500C7,\n    0x00000017, 0x00005DE8, 0x00005D4A, 0x000003A1, 0x000500C7, 0x00000017,\n    0x000048A0, 0x00005D4A, 0x000002D1, 0x000500C2, 0x00000017, 0x00005B94,\n    0x00005DE8, 0x00000107, 0x000500AA, 0x00000013, 0x000040CD, 0x00005B94,\n    0x00000B50, 0x0006000C, 0x0000001A, 0x00002C4F, 0x00000001, 0x0000004B,\n    0x000048A0, 0x0004007C, 0x00000017, 0x00002A19, 0x00002C4F, 0x00050082,\n    0x00000017, 0x0000187E, 0x00000107, 0x00002A19, 0x00050080, 0x00000017,\n    0x00002214, 0x00002A19, 0x00000A0F, 0x000600A9, 0x00000017, 0x00002873,\n    0x000040CD, 0x00002214, 0x00005B94, 0x000500C4, 0x00000017, 0x00005AD8,\n    0x000048A0, 0x0000187E, 0x000500C7, 0x00000017, 0x0000499E, 0x00005AD8,\n    0x000002D1, 0x000600A9, 0x00000017, 0x00002AA5, 0x000040CD, 0x0000499E,\n    0x000048A0, 0x00050080, 0x00000017, 0x00005FFD, 0x00002873, 0x0000022F,\n    0x000500C4, 0x00000017, 0x00004F83, 0x00005FFD, 0x00000467, 0x000500C4,\n    0x00000017, 0x00003FAA, 0x00002AA5, 0x000002ED, 0x000500C5, 0x00000017,\n    0x00005782, 0x00004F83, 0x00003FAA, 0x000500AA, 0x00000013, 0x00003604,\n    0x00005DE8, 0x00000B50, 0x000600A9, 0x00000017, 0x00004244, 0x00003604,\n    0x00000B50, 0x00005782, 0x0004007C, 0x0000001D, 0x00003046, 0x00004244,\n    0x000500C2, 0x00000017, 0x00006040, 0x00002BCE, 0x000023B6, 0x000500C7,\n    0x00000017, 0x00003923, 0x00006040, 0x000003A1, 0x000500C7, 0x00000017,\n    0x000048A1, 0x00006040, 0x000002D1, 0x000500C2, 0x00000017, 0x00005B95,\n    0x00003923, 0x00000107, 0x000500AA, 0x00000013, 0x000040CE, 0x00005B95,\n    0x00000B50, 0x0006000C, 0x0000001A, 0x00002C50, 0x00000001, 0x0000004B,\n    0x000048A1, 0x0004007C, 0x00000017, 0x00002A1A, 0x00002C50, 0x00050082,\n    0x00000017, 0x0000187F, 0x00000107, 0x00002A1A, 0x00050080, 0x00000017,\n    0x00002215, 0x00002A1A, 0x00000A0F, 0x000600A9, 0x00000017, 0x00002874,\n    0x000040CE, 0x00002215, 0x00005B95, 0x000500C4, 0x00000017, 0x00005AD9,\n    0x000048A1, 0x0000187F, 0x000500C7, 0x00000017, 0x0000499F, 0x00005AD9,\n    0x000002D1, 0x000600A9, 0x00000017, 0x00002AA6, 0x000040CE, 0x0000499F,\n    0x000048A1, 0x00050080, 0x00000017, 0x00005FFE, 0x00002874, 0x0000022F,\n    0x000500C4, 0x00000017, 0x00004F84, 0x00005FFE, 0x00000467, 0x000500C4,\n    0x00000017, 0x00003FAB, 0x00002AA6, 0x000002ED, 0x000500C5, 0x00000017,\n    0x00005783, 0x00004F84, 0x00003FAB, 0x000500AA, 0x00000013, 0x00003605,\n    0x00003923, 0x00000B50, 0x000600A9, 0x00000017, 0x00004659, 0x00003605,\n    0x00000B50, 0x00005783, 0x0004007C, 0x0000001D, 0x0000593D, 0x00004659,\n    0x000200F9, 0x00005BA8, 0x000200F8, 0x00003844, 0x000600A9, 0x0000000B,\n    0x00004C0D, 0x00001D33, 0x00000A46, 0x00000A0A, 0x00070050, 0x00000017,\n    0x000023B7, 0x00004C0D, 0x00004C0D, 0x00004C0D, 0x00004C0D, 0x000500C2,\n    0x00000017, 0x000056D7, 0x0000370E, 0x000023B7, 0x000500C7, 0x00000017,\n    0x00004A5A, 0x000056D7, 0x000003A1, 0x00040070, 0x0000001D, 0x00003F09,\n    0x00004A5A, 0x0005008E, 0x0000001D, 0x0000521E, 0x00003F09, 0x000006FE,\n    0x000500C2, 0x00000017, 0x00001E46, 0x00002BCE, 0x000023B7, 0x000500C7,\n    0x00000017, 0x00002BD8, 0x00001E46, 0x000003A1, 0x00040070, 0x0000001D,\n    0x0000431E, 0x00002BD8, 0x0005008E, 0x0000001D, 0x00003096, 0x0000431E,\n    0x000006FE, 0x000200F9, 0x00005BA8, 0x000200F8, 0x00003E87, 0x000600A9,\n    0x0000000B, 0x00004C0E, 0x00001D33, 0x00000A3A, 0x00000A0A, 0x00070050,\n    0x00000017, 0x000023B8, 0x00004C0E, 0x00004C0E, 0x00004C0E, 0x00004C0E,\n    0x000500C2, 0x00000017, 0x000056D8, 0x0000370E, 0x000023B8, 0x000500C7,\n    0x00000017, 0x00004A5B, 0x000056D8, 0x0000064B, 0x00040070, 0x0000001D,\n    0x00003F0A, 0x00004A5B, 0x0005008E, 0x0000001D, 0x0000521F, 0x00003F0A,\n    0x0000017A, 0x000500C2, 0x00000017, 0x00001E47, 0x00002BCE, 0x000023B8,\n    0x000500C7, 0x00000017, 0x00002BD9, 0x00001E47, 0x0000064B, 0x00040070,\n    0x0000001D, 0x0000431F, 0x00002BD9, 0x0005008E, 0x0000001D, 0x00003097,\n    0x0000431F, 0x0000017A, 0x000200F9, 0x00005BA8, 0x000200F8, 0x00006034,\n    0x0004007C, 0x0000001D, 0x00004B23, 0x0000370E, 0x0004007C, 0x0000001D,\n    0x000038B6, 0x00002BCE, 0x000200F9, 0x00005BA8, 0x000200F8, 0x00005BA8,\n    0x000F00F5, 0x0000001D, 0x00002BF7, 0x000038B6, 0x00006034, 0x00003097,\n    0x00003E87, 0x00003096, 0x00003844, 0x0000593D, 0x000059C1, 0x00004366,\n    0x000052CA, 0x000048FA, 0x00002037, 0x000F00F5, 0x0000001D, 0x00003592,\n    0x00004B23, 0x00006034, 0x0000521F, 0x00003E87, 0x0000521E, 0x00003844,\n    0x00003046, 0x000059C1, 0x00004984, 0x000052CA, 0x00005EBD, 0x00002037,\n    0x000200F9, 0x00005311, 0x000200F8, 0x00005229, 0x000300F7, 0x00005BA9,\n    0x00000000, 0x000700FB, 0x00002180, 0x000030EF, 0x00000005, 0x000052CB,\n    0x00000007, 0x00002038, 0x000200F8, 0x00002038, 0x00050051, 0x0000000B,\n    0x00005F5E, 0x0000370E, 0x00000000, 0x0006000C, 0x00000015, 0x0000606C,\n    0x00000001, 0x0000003E, 0x00005F5E, 0x00050051, 0x0000000D, 0x000022B4,\n    0x0000606C, 0x00000000, 0x00050051, 0x0000000B, 0x00001DCD, 0x0000370E,\n    0x00000001, 0x0006000C, 0x00000015, 0x00003D09, 0x00000001, 0x0000003E,\n    0x00001DCD, 0x00050051, 0x0000000D, 0x000022B5, 0x00003D09, 0x00000000,\n    0x00050051, 0x0000000B, 0x00001DCE, 0x0000370E, 0x00000002, 0x0006000C,\n    0x00000015, 0x00003D0A, 0x00000001, 0x0000003E, 0x00001DCE, 0x00050051,\n    0x0000000D, 0x000022B6, 0x00003D0A, 0x00000000, 0x00050051, 0x0000000B,\n    0x00001DCF, 0x0000370E, 0x00000003, 0x0006000C, 0x00000015, 0x00003CEC,\n    0x00000001, 0x0000003E, 0x00001DCF, 0x00050051, 0x0000000D, 0x00002827,\n    0x00003CEC, 0x00000000, 0x00070050, 0x0000001D, 0x00005ECD, 0x000022B4,\n    0x000022B5, 0x000022B6, 0x00002827, 0x00050051, 0x0000000B, 0x0000437F,\n    0x00002BCE, 0x00000000, 0x0006000C, 0x00000015, 0x00004670, 0x00000001,\n    0x0000003E, 0x0000437F, 0x00050051, 0x0000000D, 0x000022B7, 0x00004670,\n    0x00000000, 0x00050051, 0x0000000B, 0x00001DD0, 0x00002BCE, 0x00000001,\n    0x0006000C, 0x00000015, 0x00003D0C, 0x00000001, 0x0000003E, 0x00001DD0,\n    0x00050051, 0x0000000D, 0x000022B8, 0x00003D0C, 0x00000000, 0x00050051,\n    0x0000000B, 0x00001DD1, 0x00002BCE, 0x00000002, 0x0006000C, 0x00000015,\n    0x00003D0D, 0x00000001, 0x0000003E, 0x00001DD1, 0x00050051, 0x0000000D,\n    0x000022B9, 0x00003D0D, 0x00000000, 0x00050051, 0x0000000B, 0x00001DD2,\n    0x00002BCE, 0x00000003, 0x0006000C, 0x00000015, 0x00003CED, 0x00000001,\n    0x0000003E, 0x00001DD2, 0x00050051, 0x0000000D, 0x0000349F, 0x00003CED,\n    0x00000000, 0x00070050, 0x0000001D, 0x000048FB, 0x000022B7, 0x000022B8,\n    0x000022B9, 0x0000349F, 0x000200F9, 0x00005BA9, 0x000200F8, 0x000052CB,\n    0x0004007C, 0x0000001A, 0x000060F9, 0x0000370E, 0x000500C4, 0x0000001A,\n    0x00005823, 0x000060F9, 0x00000302, 0x000500C3, 0x0000001A, 0x000040A2,\n    0x00005823, 0x00000302, 0x0004006F, 0x0000001D, 0x00002AA7, 0x000040A2,\n    0x0005008E, 0x0000001D, 0x00004A7D, 0x00002AA7, 0x000007FE, 0x0007000C,\n    0x0000001D, 0x00004985, 0x00000001, 0x00000028, 0x00000504, 0x00004A7D,\n    0x0004007C, 0x0000001A, 0x000027EA, 0x00002BCE, 0x000500C4, 0x0000001A,\n    0x000021A6, 0x000027EA, 0x00000302, 0x000500C3, 0x0000001A, 0x000040A3,\n    0x000021A6, 0x00000302, 0x0004006F, 0x0000001D, 0x00002AA8, 0x000040A3,\n    0x0005008E, 0x0000001D, 0x000053C4, 0x00002AA8, 0x000007FE, 0x0007000C,\n    0x0000001D, 0x00004367, 0x00000001, 0x00000028, 0x00000504, 0x000053C4,\n    0x000200F9, 0x00005BA9, 0x000200F8, 0x000030EF, 0x0004007C, 0x0000001D,\n    0x00004B24, 0x0000370E, 0x0004007C, 0x0000001D, 0x000038B7, 0x00002BCE,\n    0x000200F9, 0x00005BA9, 0x000200F8, 0x00005BA9, 0x000900F5, 0x0000001D,\n    0x00002BF8, 0x000038B7, 0x000030EF, 0x00004367, 0x000052CB, 0x000048FB,\n    0x00002038, 0x000900F5, 0x0000001D, 0x00003593, 0x00004B24, 0x000030EF,\n    0x00004985, 0x000052CB, 0x00005ECD, 0x00002038, 0x000200F9, 0x00005311,\n    0x000200F8, 0x00005311, 0x000700F5, 0x0000001D, 0x0000230C, 0x00002BF8,\n    0x00005BA9, 0x00002BF7, 0x00005BA8, 0x000700F5, 0x0000001D, 0x00004C8B,\n    0x00003593, 0x00005BA9, 0x00003592, 0x00005BA8, 0x00050081, 0x0000001D,\n    0x00004346, 0x000046B0, 0x00004C8B, 0x00050081, 0x0000001D, 0x000019F1,\n    0x0000455A, 0x0000230C, 0x00050080, 0x0000000B, 0x00003FF8, 0x00001FB2,\n    0x000037B2, 0x000300F7, 0x00004F26, 0x00000002, 0x000400FA, 0x000060B1,\n    0x000019C2, 0x00002302, 0x000200F8, 0x00002302, 0x000500C2, 0x0000000B,\n    0x00005633, 0x00003FF8, 0x00000A11, 0x00060041, 0x00000289, 0x0000343F,\n    0x00000CC7, 0x00000A0B, 0x00005633, 0x0004003D, 0x0000000B, 0x00003AD7,\n    0x0000343F, 0x00050080, 0x0000000B, 0x00002148, 0x00003FF8, 0x000030F7,\n    0x000500C2, 0x0000000B, 0x000054A9, 0x00002148, 0x00000A11, 0x00060041,\n    0x00000289, 0x00004CEC, 0x00000CC7, 0x00000A0B, 0x000054A9, 0x0004003D,\n    0x0000000B, 0x0000334A, 0x00004CEC, 0x00050084, 0x0000000B, 0x000021FC,\n    0x00000A10, 0x000030F7, 0x00050080, 0x0000000B, 0x00005ECE, 0x00003FF8,\n    0x000021FC, 0x000500C2, 0x0000000B, 0x000045F4, 0x00005ECE, 0x00000A11,\n    0x00060041, 0x00000289, 0x00004CED, 0x00000CC7, 0x00000A0B, 0x000045F4,\n    0x0004003D, 0x0000000B, 0x0000334B, 0x00004CED, 0x00050084, 0x0000000B,\n    0x000021FD, 0x00000A13, 0x000030F7, 0x00050080, 0x0000000B, 0x00005ECF,\n    0x00003FF8, 0x000021FD, 0x000500C2, 0x0000000B, 0x000045F5, 0x00005ECF,\n    0x00000A11, 0x00060041, 0x00000289, 0x00004907, 0x00000CC7, 0x00000A0B,\n    0x000045F5, 0x0004003D, 0x0000000B, 0x000056AD, 0x00004907, 0x00070050,\n    0x00000017, 0x00004CD9, 0x00003AD7, 0x0000334A, 0x0000334B, 0x000056AD,\n    0x00050084, 0x0000000B, 0x00004C2E, 0x00000A16, 0x000030F7, 0x00050080,\n    0x0000000B, 0x00002A48, 0x00003FF8, 0x00004C2E, 0x000500C2, 0x0000000B,\n    0x000045F6, 0x00002A48, 0x00000A11, 0x00060041, 0x00000289, 0x00004CEE,\n    0x00000CC7, 0x00000A0B, 0x000045F6, 0x0004003D, 0x0000000B, 0x0000334C,\n    0x00004CEE, 0x00050084, 0x0000000B, 0x000021FE, 0x00000A19, 0x000030F7,\n    0x00050080, 0x0000000B, 0x00005ED0, 0x00003FF8, 0x000021FE, 0x000500C2,\n    0x0000000B, 0x000045F7, 0x00005ED0, 0x00000A11, 0x00060041, 0x00000289,\n    0x00004CEF, 0x00000CC7, 0x00000A0B, 0x000045F7, 0x0004003D, 0x0000000B,\n    0x0000334D, 0x00004CEF, 0x00050084, 0x0000000B, 0x000021FF, 0x00000A1C,\n    0x000030F7, 0x00050080, 0x0000000B, 0x00005ED1, 0x00003FF8, 0x000021FF,\n    0x000500C2, 0x0000000B, 0x000045F8, 0x00005ED1, 0x00000A11, 0x00060041,\n    0x00000289, 0x00004CF0, 0x00000CC7, 0x00000A0B, 0x000045F8, 0x0004003D,\n    0x0000000B, 0x0000334E, 0x00004CF0, 0x00050084, 0x0000000B, 0x00002200,\n    0x00000A1F, 0x000030F7, 0x00050080, 0x0000000B, 0x00005ED2, 0x00003FF8,\n    0x00002200, 0x000500C2, 0x0000000B, 0x000045F9, 0x00005ED2, 0x00000A11,\n    0x00060041, 0x00000289, 0x00004908, 0x00000CC7, 0x00000A0B, 0x000045F9,\n    0x0004003D, 0x0000000B, 0x00005F5F, 0x00004908, 0x00070050, 0x00000017,\n    0x00005132, 0x0000334C, 0x0000334D, 0x0000334E, 0x00005F5F, 0x000200F9,\n    0x00004F26, 0x000200F8, 0x000019C2, 0x000500C2, 0x0000000B, 0x00005FA9,\n    0x00003FF8, 0x00000A11, 0x00060041, 0x00000289, 0x00003440, 0x00000CC7,\n    0x00000A0B, 0x00005FA9, 0x0004003D, 0x0000000B, 0x00003147, 0x00003440,\n    0x00050080, 0x0000000B, 0x00002DB9, 0x00005FA9, 0x00000A0D, 0x00060041,\n    0x00000289, 0x0000190B, 0x00000CC7, 0x00000A0B, 0x00002DB9, 0x0004003D,\n    0x0000000B, 0x00005C6E, 0x0000190B, 0x00050080, 0x0000000B, 0x00002DBA,\n    0x00005FA9, 0x00000A10, 0x00060041, 0x00000289, 0x0000190C, 0x00000CC7,\n    0x00000A0B, 0x00002DBA, 0x0004003D, 0x0000000B, 0x00005C6F, 0x0000190C,\n    0x00050080, 0x0000000B, 0x00002DBB, 0x00005FA9, 0x00000A13, 0x00060041,\n    0x00000289, 0x00005FF4, 0x00000CC7, 0x00000A0B, 0x00002DBB, 0x0004003D,\n    0x0000000B, 0x00003703, 0x00005FF4, 0x00070050, 0x00000017, 0x00005473,\n    0x00003147, 0x00005C6E, 0x00005C6F, 0x00003703, 0x00050080, 0x0000000B,\n    0x00004B86, 0x00003FF8, 0x00000A3A, 0x000500C2, 0x0000000B, 0x00002030,\n    0x00004B86, 0x00000A11, 0x00060041, 0x00000289, 0x00004C94, 0x00000CC7,\n    0x00000A0B, 0x00002030, 0x0004003D, 0x0000000B, 0x00003148, 0x00004C94,\n    0x00050080, 0x0000000B, 0x00002DBC, 0x00002030, 0x00000A0D, 0x00060041,\n    0x00000289, 0x0000190D, 0x00000CC7, 0x00000A0B, 0x00002DBC, 0x0004003D,\n    0x0000000B, 0x00005C70, 0x0000190D, 0x00050080, 0x0000000B, 0x00002DBD,\n    0x00002030, 0x00000A10, 0x00060041, 0x00000289, 0x0000190E, 0x00000CC7,\n    0x00000A0B, 0x00002DBD, 0x0004003D, 0x0000000B, 0x00005C71, 0x0000190E,\n    0x00050080, 0x0000000B, 0x00002DBE, 0x00002030, 0x00000A13, 0x00060041,\n    0x00000289, 0x00005FF5, 0x00000CC7, 0x00000A0B, 0x00002DBE, 0x0004003D,\n    0x0000000B, 0x00003FFE, 0x00005FF5, 0x00070050, 0x00000017, 0x00005133,\n    0x00003148, 0x00005C70, 0x00005C71, 0x00003FFE, 0x000200F9, 0x00004F26,\n    0x000200F8, 0x00004F26, 0x000700F5, 0x00000017, 0x00002BCF, 0x00005133,\n    0x000019C2, 0x00005132, 0x00002302, 0x000700F5, 0x00000017, 0x0000370F,\n    0x00005473, 0x000019C2, 0x00004CD9, 0x00002302, 0x000300F7, 0x00005312,\n    0x00000002, 0x000400FA, 0x000043D9, 0x0000522A, 0x00005784, 0x000200F8,\n    0x00005784, 0x000300F7, 0x00005BAA, 0x00000000, 0x001300FB, 0x00002180,\n    0x00006035, 0x00000000, 0x00003E88, 0x00000001, 0x00003E88, 0x00000002,\n    0x00003845, 0x0000000A, 0x00003845, 0x00000003, 0x000059C2, 0x0000000C,\n    0x000059C2, 0x00000004, 0x000052CC, 0x00000006, 0x00002039, 0x000200F8,\n    0x00002039, 0x00050051, 0x0000000B, 0x00005F60, 0x0000370F, 0x00000000,\n    0x0006000C, 0x00000015, 0x0000606D, 0x00000001, 0x0000003E, 0x00005F60,\n    0x00050051, 0x0000000D, 0x000022BA, 0x0000606D, 0x00000000, 0x00050051,\n    0x0000000B, 0x00001DD3, 0x0000370F, 0x00000001, 0x0006000C, 0x00000015,\n    0x00003D0E, 0x00000001, 0x0000003E, 0x00001DD3, 0x00050051, 0x0000000D,\n    0x000022BB, 0x00003D0E, 0x00000000, 0x00050051, 0x0000000B, 0x00001DD4,\n    0x0000370F, 0x00000002, 0x0006000C, 0x00000015, 0x00003D0F, 0x00000001,\n    0x0000003E, 0x00001DD4, 0x00050051, 0x0000000D, 0x000022BC, 0x00003D0F,\n    0x00000000, 0x00050051, 0x0000000B, 0x00001DD5, 0x0000370F, 0x00000003,\n    0x0006000C, 0x00000015, 0x00003CEE, 0x00000001, 0x0000003E, 0x00001DD5,\n    0x00050051, 0x0000000D, 0x00002828, 0x00003CEE, 0x00000000, 0x00070050,\n    0x0000001D, 0x00005ED3, 0x000022BA, 0x000022BB, 0x000022BC, 0x00002828,\n    0x00050051, 0x0000000B, 0x00004380, 0x00002BCF, 0x00000000, 0x0006000C,\n    0x00000015, 0x00004671, 0x00000001, 0x0000003E, 0x00004380, 0x00050051,\n    0x0000000D, 0x000022BD, 0x00004671, 0x00000000, 0x00050051, 0x0000000B,\n    0x00001DD6, 0x00002BCF, 0x00000001, 0x0006000C, 0x00000015, 0x00003D10,\n    0x00000001, 0x0000003E, 0x00001DD6, 0x00050051, 0x0000000D, 0x000022BE,\n    0x00003D10, 0x00000000, 0x00050051, 0x0000000B, 0x00001DD7, 0x00002BCF,\n    0x00000002, 0x0006000C, 0x00000015, 0x00003D11, 0x00000001, 0x0000003E,\n    0x00001DD7, 0x00050051, 0x0000000D, 0x000022BF, 0x00003D11, 0x00000000,\n    0x00050051, 0x0000000B, 0x00001DD8, 0x00002BCF, 0x00000003, 0x0006000C,\n    0x00000015, 0x00003CEF, 0x00000001, 0x0000003E, 0x00001DD8, 0x00050051,\n    0x0000000D, 0x000034A0, 0x00003CEF, 0x00000000, 0x00070050, 0x0000001D,\n    0x000048FC, 0x000022BD, 0x000022BE, 0x000022BF, 0x000034A0, 0x000200F9,\n    0x00005BAA, 0x000200F8, 0x000052CC, 0x0004007C, 0x0000001A, 0x000060FA,\n    0x0000370F, 0x000500C4, 0x0000001A, 0x00005824, 0x000060FA, 0x00000302,\n    0x000500C3, 0x0000001A, 0x000040A4, 0x00005824, 0x00000302, 0x0004006F,\n    0x0000001D, 0x00002AA9, 0x000040A4, 0x0005008E, 0x0000001D, 0x00004A7E,\n    0x00002AA9, 0x000007FE, 0x0007000C, 0x0000001D, 0x00004986, 0x00000001,\n    0x00000028, 0x00000504, 0x00004A7E, 0x0004007C, 0x0000001A, 0x000027EB,\n    0x00002BCF, 0x000500C4, 0x0000001A, 0x000021A7, 0x000027EB, 0x00000302,\n    0x000500C3, 0x0000001A, 0x000040A5, 0x000021A7, 0x00000302, 0x0004006F,\n    0x0000001D, 0x00002AAA, 0x000040A5, 0x0005008E, 0x0000001D, 0x000053C5,\n    0x00002AAA, 0x000007FE, 0x0007000C, 0x0000001D, 0x00004368, 0x00000001,\n    0x00000028, 0x00000504, 0x000053C5, 0x000200F9, 0x00005BAA, 0x000200F8,\n    0x000059C2, 0x000600A9, 0x0000000B, 0x00004C0F, 0x00001D33, 0x00000A46,\n    0x00000A0A, 0x00070050, 0x00000017, 0x000023B9, 0x00004C0F, 0x00004C0F,\n    0x00004C0F, 0x00004C0F, 0x000500C2, 0x00000017, 0x00005D4B, 0x0000370F,\n    0x000023B9, 0x000500C7, 0x00000017, 0x00005DE9, 0x00005D4B, 0x000003A1,\n    0x000500C7, 0x00000017, 0x000048A2, 0x00005D4B, 0x000002D1, 0x000500C2,\n    0x00000017, 0x00005B96, 0x00005DE9, 0x00000107, 0x000500AA, 0x00000013,\n    0x000040CF, 0x00005B96, 0x00000B50, 0x0006000C, 0x0000001A, 0x00002C51,\n    0x00000001, 0x0000004B, 0x000048A2, 0x0004007C, 0x00000017, 0x00002A1B,\n    0x00002C51, 0x00050082, 0x00000017, 0x00001880, 0x00000107, 0x00002A1B,\n    0x00050080, 0x00000017, 0x00002216, 0x00002A1B, 0x00000A0F, 0x000600A9,\n    0x00000017, 0x00002875, 0x000040CF, 0x00002216, 0x00005B96, 0x000500C4,\n    0x00000017, 0x00005ADA, 0x000048A2, 0x00001880, 0x000500C7, 0x00000017,\n    0x000049A0, 0x00005ADA, 0x000002D1, 0x000600A9, 0x00000017, 0x00002AAB,\n    0x000040CF, 0x000049A0, 0x000048A2, 0x00050080, 0x00000017, 0x00005FFF,\n    0x00002875, 0x0000022F, 0x000500C4, 0x00000017, 0x00004F85, 0x00005FFF,\n    0x00000467, 0x000500C4, 0x00000017, 0x00003FAC, 0x00002AAB, 0x000002ED,\n    0x000500C5, 0x00000017, 0x00005785, 0x00004F85, 0x00003FAC, 0x000500AA,\n    0x00000013, 0x00003606, 0x00005DE9, 0x00000B50, 0x000600A9, 0x00000017,\n    0x00004245, 0x00003606, 0x00000B50, 0x00005785, 0x0004007C, 0x0000001D,\n    0x00003047, 0x00004245, 0x000500C2, 0x00000017, 0x00006041, 0x00002BCF,\n    0x000023B9, 0x000500C7, 0x00000017, 0x00003924, 0x00006041, 0x000003A1,\n    0x000500C7, 0x00000017, 0x000048A3, 0x00006041, 0x000002D1, 0x000500C2,\n    0x00000017, 0x00005B97, 0x00003924, 0x00000107, 0x000500AA, 0x00000013,\n    0x000040D0, 0x00005B97, 0x00000B50, 0x0006000C, 0x0000001A, 0x00002C52,\n    0x00000001, 0x0000004B, 0x000048A3, 0x0004007C, 0x00000017, 0x00002A1C,\n    0x00002C52, 0x00050082, 0x00000017, 0x00001881, 0x00000107, 0x00002A1C,\n    0x00050080, 0x00000017, 0x00002217, 0x00002A1C, 0x00000A0F, 0x000600A9,\n    0x00000017, 0x00002876, 0x000040D0, 0x00002217, 0x00005B97, 0x000500C4,\n    0x00000017, 0x00005ADB, 0x000048A3, 0x00001881, 0x000500C7, 0x00000017,\n    0x000049A1, 0x00005ADB, 0x000002D1, 0x000600A9, 0x00000017, 0x00002AAD,\n    0x000040D0, 0x000049A1, 0x000048A3, 0x00050080, 0x00000017, 0x00006000,\n    0x00002876, 0x0000022F, 0x000500C4, 0x00000017, 0x00004F86, 0x00006000,\n    0x00000467, 0x000500C4, 0x00000017, 0x00003FAD, 0x00002AAD, 0x000002ED,\n    0x000500C5, 0x00000017, 0x00005786, 0x00004F86, 0x00003FAD, 0x000500AA,\n    0x00000013, 0x00003607, 0x00003924, 0x00000B50, 0x000600A9, 0x00000017,\n    0x0000465A, 0x00003607, 0x00000B50, 0x00005786, 0x0004007C, 0x0000001D,\n    0x0000593E, 0x0000465A, 0x000200F9, 0x00005BAA, 0x000200F8, 0x00003845,\n    0x000600A9, 0x0000000B, 0x00004C10, 0x00001D33, 0x00000A46, 0x00000A0A,\n    0x00070050, 0x00000017, 0x000023BA, 0x00004C10, 0x00004C10, 0x00004C10,\n    0x00004C10, 0x000500C2, 0x00000017, 0x000056D9, 0x0000370F, 0x000023BA,\n    0x000500C7, 0x00000017, 0x00004A5C, 0x000056D9, 0x000003A1, 0x00040070,\n    0x0000001D, 0x00003F0B, 0x00004A5C, 0x0005008E, 0x0000001D, 0x00005220,\n    0x00003F0B, 0x000006FE, 0x000500C2, 0x00000017, 0x00001E48, 0x00002BCF,\n    0x000023BA, 0x000500C7, 0x00000017, 0x00002BDA, 0x00001E48, 0x000003A1,\n    0x00040070, 0x0000001D, 0x00004320, 0x00002BDA, 0x0005008E, 0x0000001D,\n    0x00003098, 0x00004320, 0x000006FE, 0x000200F9, 0x00005BAA, 0x000200F8,\n    0x00003E88, 0x000600A9, 0x0000000B, 0x00004C11, 0x00001D33, 0x00000A3A,\n    0x00000A0A, 0x00070050, 0x00000017, 0x000023BB, 0x00004C11, 0x00004C11,\n    0x00004C11, 0x00004C11, 0x000500C2, 0x00000017, 0x000056DA, 0x0000370F,\n    0x000023BB, 0x000500C7, 0x00000017, 0x00004A5D, 0x000056DA, 0x0000064B,\n    0x00040070, 0x0000001D, 0x00003F0C, 0x00004A5D, 0x0005008E, 0x0000001D,\n    0x00005221, 0x00003F0C, 0x0000017A, 0x000500C2, 0x00000017, 0x00001E49,\n    0x00002BCF, 0x000023BB, 0x000500C7, 0x00000017, 0x00002BDB, 0x00001E49,\n    0x0000064B, 0x00040070, 0x0000001D, 0x00004321, 0x00002BDB, 0x0005008E,\n    0x0000001D, 0x00003099, 0x00004321, 0x0000017A, 0x000200F9, 0x00005BAA,\n    0x000200F8, 0x00006035, 0x0004007C, 0x0000001D, 0x00004B25, 0x0000370F,\n    0x0004007C, 0x0000001D, 0x000038B8, 0x00002BCF, 0x000200F9, 0x00005BAA,\n    0x000200F8, 0x00005BAA, 0x000F00F5, 0x0000001D, 0x00002BF9, 0x000038B8,\n    0x00006035, 0x00003099, 0x00003E88, 0x00003098, 0x00003845, 0x0000593E,\n    0x000059C2, 0x00004368, 0x000052CC, 0x000048FC, 0x00002039, 0x000F00F5,\n    0x0000001D, 0x00003594, 0x00004B25, 0x00006035, 0x00005221, 0x00003E88,\n    0x00005220, 0x00003845, 0x00003047, 0x000059C2, 0x00004986, 0x000052CC,\n    0x00005ED3, 0x00002039, 0x000200F9, 0x00005312, 0x000200F8, 0x0000522A,\n    0x000300F7, 0x00005BAB, 0x00000000, 0x000700FB, 0x00002180, 0x000030F0,\n    0x00000005, 0x000052CD, 0x00000007, 0x0000203A, 0x000200F8, 0x0000203A,\n    0x00050051, 0x0000000B, 0x00005F61, 0x0000370F, 0x00000000, 0x0006000C,\n    0x00000015, 0x0000606E, 0x00000001, 0x0000003E, 0x00005F61, 0x00050051,\n    0x0000000D, 0x000022C0, 0x0000606E, 0x00000000, 0x00050051, 0x0000000B,\n    0x00001DD9, 0x0000370F, 0x00000001, 0x0006000C, 0x00000015, 0x00003D12,\n    0x00000001, 0x0000003E, 0x00001DD9, 0x00050051, 0x0000000D, 0x000022C1,\n    0x00003D12, 0x00000000, 0x00050051, 0x0000000B, 0x00001DDA, 0x0000370F,\n    0x00000002, 0x0006000C, 0x00000015, 0x00003D13, 0x00000001, 0x0000003E,\n    0x00001DDA, 0x00050051, 0x0000000D, 0x000022C2, 0x00003D13, 0x00000000,\n    0x00050051, 0x0000000B, 0x00001DDB, 0x0000370F, 0x00000003, 0x0006000C,\n    0x00000015, 0x00003CF0, 0x00000001, 0x0000003E, 0x00001DDB, 0x00050051,\n    0x0000000D, 0x00002829, 0x00003CF0, 0x00000000, 0x00070050, 0x0000001D,\n    0x00005ED4, 0x000022C0, 0x000022C1, 0x000022C2, 0x00002829, 0x00050051,\n    0x0000000B, 0x00004381, 0x00002BCF, 0x00000000, 0x0006000C, 0x00000015,\n    0x00004672, 0x00000001, 0x0000003E, 0x00004381, 0x00050051, 0x0000000D,\n    0x000022C3, 0x00004672, 0x00000000, 0x00050051, 0x0000000B, 0x00001DDC,\n    0x00002BCF, 0x00000001, 0x0006000C, 0x00000015, 0x00003D14, 0x00000001,\n    0x0000003E, 0x00001DDC, 0x00050051, 0x0000000D, 0x000022C4, 0x00003D14,\n    0x00000000, 0x00050051, 0x0000000B, 0x00001DDD, 0x00002BCF, 0x00000002,\n    0x0006000C, 0x00000015, 0x00003D15, 0x00000001, 0x0000003E, 0x00001DDD,\n    0x00050051, 0x0000000D, 0x000022C5, 0x00003D15, 0x00000000, 0x00050051,\n    0x0000000B, 0x00001DDE, 0x00002BCF, 0x00000003, 0x0006000C, 0x00000015,\n    0x00003CF1, 0x00000001, 0x0000003E, 0x00001DDE, 0x00050051, 0x0000000D,\n    0x000034A1, 0x00003CF1, 0x00000000, 0x00070050, 0x0000001D, 0x000048FD,\n    0x000022C3, 0x000022C4, 0x000022C5, 0x000034A1, 0x000200F9, 0x00005BAB,\n    0x000200F8, 0x000052CD, 0x0004007C, 0x0000001A, 0x000060FB, 0x0000370F,\n    0x000500C4, 0x0000001A, 0x00005825, 0x000060FB, 0x00000302, 0x000500C3,\n    0x0000001A, 0x000040A6, 0x00005825, 0x00000302, 0x0004006F, 0x0000001D,\n    0x00002AAE, 0x000040A6, 0x0005008E, 0x0000001D, 0x00004A7F, 0x00002AAE,\n    0x000007FE, 0x0007000C, 0x0000001D, 0x00004987, 0x00000001, 0x00000028,\n    0x00000504, 0x00004A7F, 0x0004007C, 0x0000001A, 0x000027EC, 0x00002BCF,\n    0x000500C4, 0x0000001A, 0x000021A8, 0x000027EC, 0x00000302, 0x000500C3,\n    0x0000001A, 0x000040A7, 0x000021A8, 0x00000302, 0x0004006F, 0x0000001D,\n    0x00002AAF, 0x000040A7, 0x0005008E, 0x0000001D, 0x000053C6, 0x00002AAF,\n    0x000007FE, 0x0007000C, 0x0000001D, 0x00004369, 0x00000001, 0x00000028,\n    0x00000504, 0x000053C6, 0x000200F9, 0x00005BAB, 0x000200F8, 0x000030F0,\n    0x0004007C, 0x0000001D, 0x00004B26, 0x0000370F, 0x0004007C, 0x0000001D,\n    0x000038B9, 0x00002BCF, 0x000200F9, 0x00005BAB, 0x000200F8, 0x00005BAB,\n    0x000900F5, 0x0000001D, 0x00002BFA, 0x000038B9, 0x000030F0, 0x00004369,\n    0x000052CD, 0x000048FD, 0x0000203A, 0x000900F5, 0x0000001D, 0x00003595,\n    0x00004B26, 0x000030F0, 0x00004987, 0x000052CD, 0x00005ED4, 0x0000203A,\n    0x000200F9, 0x00005312, 0x000200F8, 0x00005312, 0x000700F5, 0x0000001D,\n    0x0000230D, 0x00002BFA, 0x00005BAB, 0x00002BF9, 0x00005BAA, 0x000700F5,\n    0x0000001D, 0x00004C8C, 0x00003595, 0x00005BAB, 0x00003594, 0x00005BAA,\n    0x00050081, 0x0000001D, 0x00004C41, 0x00004346, 0x00004C8C, 0x00050081,\n    0x0000001D, 0x00005D3D, 0x000019F1, 0x0000230D, 0x000200F9, 0x00005ED5,\n    0x000200F8, 0x00005ED5, 0x000700F5, 0x0000001D, 0x00002BA7, 0x0000455A,\n    0x00005310, 0x00005D3D, 0x00005312, 0x000700F5, 0x0000001D, 0x00003854,\n    0x000046B0, 0x00005310, 0x00004C41, 0x00005312, 0x000700F5, 0x0000000D,\n    0x000038BA, 0x00005A1D, 0x00005310, 0x00002F3A, 0x00005312, 0x000200F9,\n    0x00005313, 0x000200F8, 0x00005313, 0x000700F5, 0x0000001D, 0x00002BA8,\n    0x00002662, 0x0000530F, 0x00002BA7, 0x00005ED5, 0x000700F5, 0x0000001D,\n    0x00003063, 0x000036E3, 0x0000530F, 0x00003854, 0x00005ED5, 0x000700F5,\n    0x0000000D, 0x00002EA8, 0x00002B2C, 0x0000530F, 0x000038BA, 0x00005ED5,\n    0x0005008E, 0x0000001D, 0x00005C88, 0x00003063, 0x00002EA8, 0x0005008E,\n    0x0000001D, 0x0000592A, 0x00002BA8, 0x00002EA8, 0x000500AA, 0x00000009,\n    0x0000320A, 0x00001A29, 0x00000A0A, 0x000300F7, 0x000033DD, 0x00000000,\n    0x000400FA, 0x0000320A, 0x00002CBB, 0x000033DD, 0x000200F8, 0x00002CBB,\n    0x00050051, 0x0000000B, 0x00005E5C, 0x00004AB4, 0x00000000, 0x000500AB,\n    0x00000009, 0x000057C6, 0x00005E5C, 0x00000A0A, 0x000200F9, 0x000033DD,\n    0x000200F8, 0x000033DD, 0x000700F5, 0x00000009, 0x00002AB0, 0x0000320A,\n    0x00005313, 0x000057C6, 0x00002CBB, 0x000300F7, 0x00004CC1, 0x00000002,\n    0x000400FA, 0x00002AB0, 0x00002CF4, 0x00004CC1, 0x000200F8, 0x00002CF4,\n    0x00050051, 0x0000000B, 0x00005C2F, 0x00004AB4, 0x00000000, 0x000500AE,\n    0x00000009, 0x000043C2, 0x00005C2F, 0x00000A10, 0x000300F7, 0x00004945,\n    0x00000000, 0x000400FA, 0x000043C2, 0x00003E05, 0x00004945, 0x000200F8,\n    0x00003E05, 0x000500AE, 0x00000009, 0x00005FD4, 0x00005C2F, 0x00000A13,\n    0x000300F7, 0x00004944, 0x00000000, 0x000400FA, 0x00005FD4, 0x00002620,\n    0x00004944, 0x000200F8, 0x00002620, 0x00050051, 0x0000000D, 0x00005002,\n    0x00005C88, 0x00000003, 0x00060052, 0x0000001D, 0x000037FF, 0x00005002,\n    0x00005C88, 0x00000002, 0x000200F9, 0x00004944, 0x000200F8, 0x00004944,\n    0x000700F5, 0x0000001D, 0x000043E3, 0x00005C88, 0x00003E05, 0x000037FF,\n    0x00002620, 0x00050051, 0x0000000D, 0x00001B5A, 0x000043E3, 0x00000002,\n    0x00060052, 0x0000001D, 0x00003B28, 0x00001B5A, 0x000043E3, 0x00000001,\n    0x000200F9, 0x00004945, 0x000200F8, 0x00004945, 0x000700F5, 0x0000001D,\n    0x000043E4, 0x00005C88, 0x00002CF4, 0x00003B28, 0x00004944, 0x00050051,\n    0x0000000D, 0x00001B5B, 0x000043E4, 0x00000001, 0x00060052, 0x0000001D,\n    0x00003B29, 0x00001B5B, 0x000043E4, 0x00000000, 0x000200F9, 0x00004CC1,\n    0x000200F8, 0x00004CC1, 0x000700F5, 0x0000001D, 0x00002C70, 0x00005C88,\n    0x000033DD, 0x00003B29, 0x00004945, 0x00050080, 0x00000011, 0x00004DDC,\n    0x00002670, 0x000059EC, 0x000500C2, 0x00000011, 0x00005E75, 0x00004DDC,\n    0x00000757, 0x00050086, 0x00000011, 0x00001E20, 0x00005E75, 0x00005C31,\n    0x00050084, 0x00000011, 0x00004707, 0x00005C31, 0x00001E20, 0x00050082,\n    0x00000011, 0x00004761, 0x00005E75, 0x00004707, 0x000500C4, 0x00000011,\n    0x00002BE0, 0x00001E20, 0x00000757, 0x00050051, 0x0000000B, 0x000033E4,\n    0x00004761, 0x00000000, 0x00050051, 0x0000000B, 0x00002A78, 0x00005C31,\n    0x00000001, 0x00050084, 0x0000000B, 0x00005967, 0x000033E4, 0x00002A78,\n    0x00050051, 0x0000000B, 0x00001B1F, 0x00004761, 0x00000001, 0x00050080,\n    0x0000000B, 0x000028E5, 0x00005967, 0x00001B1F, 0x000500C7, 0x00000011,\n    0x000049A3, 0x00004DDC, 0x000007EA, 0x000500C4, 0x0000000B, 0x00002955,\n    0x000028E5, 0x00000A1F, 0x00050051, 0x0000000B, 0x000051B4, 0x000049A3,\n    0x00000001, 0x000500C4, 0x0000000B, 0x00005C2C, 0x000051B4, 0x00000A16,\n    0x000500C5, 0x0000000B, 0x00004D79, 0x00002955, 0x00005C2C, 0x00050051,\n    0x0000000B, 0x000056ED, 0x000049A3, 0x00000000, 0x000500C5, 0x0000000B,\n    0x000036AF, 0x00004D79, 0x000056ED, 0x000300F7, 0x00005341, 0x00000002,\n    0x000400FA, 0x000048EB, 0x0000294E, 0x0000537D, 0x000200F8, 0x0000537D,\n    0x0004007C, 0x00000012, 0x00002970, 0x00002BE0, 0x00050051, 0x0000000C,\n    0x000045FA, 0x00002970, 0x00000001, 0x000500C3, 0x0000000C, 0x00004DC0,\n    0x000045FA, 0x00000A1A, 0x0004007C, 0x0000000C, 0x00005787, 0x000020FC,\n    0x00050084, 0x0000000C, 0x00001F02, 0x00004DC0, 0x00005787, 0x00050051,\n    0x0000000C, 0x00006242, 0x00002970, 0x00000000, 0x000500C3, 0x0000000C,\n    0x00004FC7, 0x00006242, 0x00000A1A, 0x00050080, 0x0000000C, 0x000049B0,\n    0x00001F02, 0x00004FC7, 0x000500C4, 0x0000000C, 0x0000254A, 0x000049B0,\n    0x00000A1D, 0x000500C3, 0x0000000C, 0x0000603B, 0x000045FA, 0x00000A0E,\n    0x000500C7, 0x0000000C, 0x0000539A, 0x0000603B, 0x00000A20, 0x000500C4,\n    0x0000000C, 0x0000534A, 0x0000539A, 0x00000A14, 0x000500C7, 0x0000000C,\n    0x00004EA5, 0x00006242, 0x00000A20, 0x000500C5, 0x0000000C, 0x000025C2,\n    0x0000534A, 0x00004EA5, 0x000500C5, 0x0000000C, 0x000029DF, 0x0000254A,\n    0x000025C2, 0x0004007C, 0x0000000C, 0x00002804, 0x000029DF, 0x000500C3,\n    0x0000000C, 0x00004C7C, 0x000045FA, 0x00000A17, 0x000500C7, 0x0000000C,\n    0x00003B3B, 0x00004C7C, 0x00000A0E, 0x000500C3, 0x0000000C, 0x000028A6,\n    0x00006242, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000511E, 0x000028A6,\n    0x00000A14, 0x000500C3, 0x0000000C, 0x000028B9, 0x000045FA, 0x00000A14,\n    0x000500C7, 0x0000000C, 0x0000505E, 0x000028B9, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x0000541D, 0x0000505E, 0x00000A0E, 0x000500C6, 0x0000000C,\n    0x000022C6, 0x0000511E, 0x0000541D, 0x000500C7, 0x0000000C, 0x00005076,\n    0x000045FA, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000522B, 0x00005076,\n    0x00000A17, 0x000500C4, 0x0000000C, 0x00001997, 0x000022C6, 0x00000A1D,\n    0x000500C5, 0x0000000C, 0x000047FE, 0x0000522B, 0x00001997, 0x000500C4,\n    0x0000000C, 0x00001C00, 0x00003B3B, 0x00000A2C, 0x000500C5, 0x0000000C,\n    0x00003C81, 0x000047FE, 0x00001C00, 0x000500C7, 0x0000000C, 0x000050AF,\n    0x00002804, 0x00000A38, 0x000500C5, 0x0000000C, 0x00003C70, 0x00003C81,\n    0x000050AF, 0x000500C3, 0x0000000C, 0x00003745, 0x00002804, 0x00000A17,\n    0x000500C7, 0x0000000C, 0x000018B8, 0x00003745, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x0000547E, 0x000018B8, 0x00000A1A, 0x000500C5, 0x0000000C,\n    0x000045A8, 0x00003C70, 0x0000547E, 0x000500C3, 0x0000000C, 0x00003A6E,\n    0x00002804, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018B9, 0x00003A6E,\n    0x00000A20, 0x000500C4, 0x0000000C, 0x0000547F, 0x000018B9, 0x00000A23,\n    0x000500C5, 0x0000000C, 0x0000456F, 0x000045A8, 0x0000547F, 0x000500C3,\n    0x0000000C, 0x00003C88, 0x00002804, 0x00000A23, 0x000500C4, 0x0000000C,\n    0x0000282A, 0x00003C88, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B79,\n    0x0000456F, 0x0000282A, 0x0004007C, 0x0000000B, 0x000041E5, 0x00003B79,\n    0x000200F9, 0x00005341, 0x000200F8, 0x0000294E, 0x00050051, 0x0000000B,\n    0x00004D9A, 0x00002BE0, 0x00000000, 0x00050051, 0x0000000B, 0x00002C03,\n    0x00002BE0, 0x00000001, 0x00060050, 0x00000014, 0x000020DE, 0x00004D9A,\n    0x00002C03, 0x00004408, 0x0004007C, 0x00000016, 0x00004E9D, 0x000020DE,\n    0x00050051, 0x0000000C, 0x00002BFB, 0x00004E9D, 0x00000002, 0x000500C3,\n    0x0000000C, 0x00004DC1, 0x00002BFB, 0x00000A11, 0x0004007C, 0x0000000C,\n    0x00005788, 0x00006273, 0x00050084, 0x0000000C, 0x00001F03, 0x00004DC1,\n    0x00005788, 0x00050051, 0x0000000C, 0x00006243, 0x00004E9D, 0x00000001,\n    0x000500C3, 0x0000000C, 0x00004A6F, 0x00006243, 0x00000A17, 0x00050080,\n    0x0000000C, 0x00002B2D, 0x00001F03, 0x00004A6F, 0x0004007C, 0x0000000C,\n    0x00004202, 0x000020FC, 0x00050084, 0x0000000C, 0x00003A60, 0x00002B2D,\n    0x00004202, 0x00050051, 0x0000000C, 0x00006244, 0x00004E9D, 0x00000000,\n    0x000500C3, 0x0000000C, 0x00004FC8, 0x00006244, 0x00000A1A, 0x00050080,\n    0x0000000C, 0x000049FC, 0x00003A60, 0x00004FC8, 0x000500C4, 0x0000000C,\n    0x0000225D, 0x000049FC, 0x00000A20, 0x000500C7, 0x0000000C, 0x00002CAA,\n    0x00002BFB, 0x00000A14, 0x000500C4, 0x0000000C, 0x00004CAE, 0x00002CAA,\n    0x00000A1A, 0x000500C3, 0x0000000C, 0x0000383E, 0x00006243, 0x00000A0E,\n    0x000500C7, 0x0000000C, 0x00005374, 0x0000383E, 0x00000A14, 0x000500C4,\n    0x0000000C, 0x000054CA, 0x00005374, 0x00000A14, 0x000500C5, 0x0000000C,\n    0x000042CE, 0x00004CAE, 0x000054CA, 0x000500C7, 0x0000000C, 0x000050D5,\n    0x00006244, 0x00000A20, 0x000500C5, 0x0000000C, 0x00003585, 0x000042CE,\n    0x000050D5, 0x000500C5, 0x0000000C, 0x000029E0, 0x0000225D, 0x00003585,\n    0x0004007C, 0x0000000C, 0x000027F1, 0x000029E0, 0x000500C3, 0x0000000C,\n    0x00004D75, 0x00006243, 0x00000A14, 0x000500C6, 0x0000000C, 0x0000583C,\n    0x00004D75, 0x00004DC1, 0x000500C7, 0x0000000C, 0x00004199, 0x0000583C,\n    0x00000A0E, 0x000500C3, 0x0000000C, 0x00002590, 0x00006244, 0x00000A14,\n    0x000500C7, 0x0000000C, 0x0000505F, 0x00002590, 0x00000A14, 0x000500C4,\n    0x0000000C, 0x0000541E, 0x00004199, 0x00000A0E, 0x000500C6, 0x0000000C,\n    0x000022C7, 0x0000505F, 0x0000541E, 0x000500C7, 0x0000000C, 0x00005077,\n    0x00006243, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000522D, 0x00005077,\n    0x00000A17, 0x000500C4, 0x0000000C, 0x00001998, 0x000022C7, 0x00000A1D,\n    0x000500C5, 0x0000000C, 0x000047FF, 0x0000522D, 0x00001998, 0x000500C4,\n    0x0000000C, 0x00001C01, 0x00004199, 0x00000A2C, 0x000500C5, 0x0000000C,\n    0x00003C82, 0x000047FF, 0x00001C01, 0x000500C7, 0x0000000C, 0x000050B0,\n    0x000027F1, 0x00000A38, 0x000500C5, 0x0000000C, 0x00003C71, 0x00003C82,\n    0x000050B0, 0x000500C3, 0x0000000C, 0x00003746, 0x000027F1, 0x00000A17,\n    0x000500C7, 0x0000000C, 0x000018BA, 0x00003746, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x00005480, 0x000018BA, 0x00000A1A, 0x000500C5, 0x0000000C,\n    0x000045A9, 0x00003C71, 0x00005480, 0x000500C3, 0x0000000C, 0x00003A6F,\n    0x000027F1, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018BB, 0x00003A6F,\n    0x00000A20, 0x000500C4, 0x0000000C, 0x00005481, 0x000018BB, 0x00000A23,\n    0x000500C5, 0x0000000C, 0x00004570, 0x000045A9, 0x00005481, 0x000500C3,\n    0x0000000C, 0x00003C89, 0x000027F1, 0x00000A23, 0x000500C4, 0x0000000C,\n    0x0000282B, 0x00003C89, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B7A,\n    0x00004570, 0x0000282B, 0x0004007C, 0x0000000B, 0x000041E6, 0x00003B7A,\n    0x000200F9, 0x00005341, 0x000200F8, 0x00005341, 0x000700F5, 0x0000000B,\n    0x00002522, 0x000041E6, 0x0000294E, 0x000041E5, 0x0000537D, 0x00050084,\n    0x0000000B, 0x000041CB, 0x0000229A, 0x00002A78, 0x00050084, 0x0000000B,\n    0x00002ED9, 0x00002522, 0x000041CB, 0x00050080, 0x0000000B, 0x000032FD,\n    0x00002ED9, 0x000036AF, 0x000500C2, 0x0000000B, 0x00001BD8, 0x000032FD,\n    0x00000A14, 0x0008000C, 0x0000001D, 0x00005E5A, 0x00000001, 0x0000002B,\n    0x00002C70, 0x00000B7A, 0x00000505, 0x0005008E, 0x0000001D, 0x00002371,\n    0x00005E5A, 0x00000540, 0x00050081, 0x0000001D, 0x00002E66, 0x00002371,\n    0x00000145, 0x0004006D, 0x00000017, 0x00001DDF, 0x00002E66, 0x00050051,\n    0x0000000B, 0x00002201, 0x00001DDF, 0x00000000, 0x00050051, 0x0000000B,\n    0x00002FDB, 0x00001DDF, 0x00000001, 0x000500C4, 0x0000000B, 0x00002D29,\n    0x00002FDB, 0x00000A23, 0x000500C5, 0x0000000B, 0x00004D66, 0x00002201,\n    0x00002D29, 0x00050051, 0x0000000B, 0x000053E4, 0x00001DDF, 0x00000002,\n    0x000500C4, 0x0000000B, 0x00002170, 0x000053E4, 0x00000A3B, 0x000500C5,\n    0x0000000B, 0x00004D67, 0x00004D66, 0x00002170, 0x00050051, 0x0000000B,\n    0x000053E5, 0x00001DDF, 0x00000003, 0x000500C4, 0x0000000B, 0x00001C7C,\n    0x000053E5, 0x00000A53, 0x000500C5, 0x0000000B, 0x00002427, 0x00004D67,\n    0x00001C7C, 0x0008000C, 0x0000001D, 0x00001D62, 0x00000001, 0x0000002B,\n    0x0000592A, 0x00000B7A, 0x00000505, 0x0005008E, 0x0000001D, 0x00002048,\n    0x00001D62, 0x00000540, 0x00050081, 0x0000001D, 0x00002E67, 0x00002048,\n    0x00000145, 0x0004006D, 0x00000017, 0x00001DE0, 0x00002E67, 0x00050051,\n    0x0000000B, 0x00002202, 0x00001DE0, 0x00000000, 0x00050051, 0x0000000B,\n    0x00002FDC, 0x00001DE0, 0x00000001, 0x000500C4, 0x0000000B, 0x00002D2A,\n    0x00002FDC, 0x00000A23, 0x000500C5, 0x0000000B, 0x00004D68, 0x00002202,\n    0x00002D2A, 0x00050051, 0x0000000B, 0x000053E6, 0x00001DE0, 0x00000002,\n    0x000500C4, 0x0000000B, 0x00002171, 0x000053E6, 0x00000A3B, 0x000500C5,\n    0x0000000B, 0x00004D69, 0x00004D68, 0x00002171, 0x00050051, 0x0000000B,\n    0x000053E7, 0x00001DE0, 0x00000003, 0x000500C4, 0x0000000B, 0x0000215D,\n    0x000053E7, 0x00000A53, 0x000500C5, 0x0000000B, 0x0000445A, 0x00004D69,\n    0x0000215D, 0x00050050, 0x00000011, 0x00002D69, 0x00002427, 0x0000445A,\n    0x00060041, 0x0000028E, 0x00002312, 0x00001592, 0x00000A0B, 0x00001BD8,\n    0x0003003E, 0x00002312, 0x00002D69, 0x000200F9, 0x00004C7A, 0x000200F8,\n    0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_128bpb_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25155\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v4uint = OpTypeVector %uint 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v2uint = OpTypeVector %uint 2\n     %v3uint = OpTypeVector %uint 3\n     %uint_1 = OpConstant %uint 1\n     %uint_2 = OpConstant %uint 2\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n     %uint_3 = OpConstant %uint 3\n    %uint_16 = OpConstant %uint 16\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n     %uint_0 = OpConstant %uint 0\n      %int_3 = OpConstant %int 3\n      %int_2 = OpConstant %int 2\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %2585 = OpConstantComposite %v3uint %uint_1 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n     %uint_4 = OpConstant %uint 4\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n    %uint_32 = OpConstant %uint 32\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n     %int_16 = OpConstant %int 16\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24540 = OpBitwiseAnd %uint %13606 %uint_1\n      %17270 = OpINotEqual %bool %24540 %uint_0\n      %12328 = OpBitwiseAnd %uint %13606 %uint_2\n      %17284 = OpINotEqual %bool %12328 %uint_0\n       %7856 = OpShiftRightLogical %uint %13606 %uint_2\n      %25058 = OpBitwiseAnd %uint %7856 %uint_3\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2585\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %6586 DontFlatten\n               OpBranchConditional %24679 %21992 %6586\n      %21992 = OpLabel\n               OpBranch %19578\n       %6586 = OpLabel\n      %23478 = OpBitcast %v3int %21387\n      %18710 = OpCompositeExtract %uint %22410 1\n      %23531 = OpCompositeExtract %int %23478 0\n      %22810 = OpIMul %int %23531 %int_16\n       %6362 = OpCompositeExtract %int %23478 2\n      %14505 = OpBitcast %int %18710\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %23478 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %6594\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %22810 %24535\n      %10404 = OpBitcast %uint %8258\n      %14582 = OpIAdd %uint %22411 %10404\n      %12308 = OpLogicalNot %bool %17270\n               OpSelectionMerge %19040 DontFlatten\n               OpBranchConditional %12308 %9741 %17007\n       %9741 = OpLabel\n      %17463 = OpCompositeExtract %uint %21387 0\n      %11246 = OpCompositeExtract %uint %21387 1\n      %18801 = OpCompositeExtract %uint %21387 2\n      %14831 = OpIMul %uint %22409 %18801\n      %20322 = OpIAdd %uint %11246 %14831\n      %21676 = OpIMul %uint %22408 %20322\n      %20398 = OpIAdd %uint %17463 %21676\n      %11367 = OpShiftLeftLogical %uint %20398 %uint_4\n               OpBranch %19040\n      %17007 = OpLabel\n               OpSelectionMerge %23536 DontFlatten\n               OpBranchConditional %17284 %11410 %24353\n      %11410 = OpLabel\n      %21364 = OpShiftRightLogical %uint %22408 %int_5\n      %13804 = OpShiftRightLogical %uint %22409 %int_4\n      %13237 = OpShiftRightArithmetic %int %6362 %int_2\n      %22374 = OpBitcast %int %13804\n      %25085 = OpIMul %int %13237 %22374\n      %11618 = OpShiftRightArithmetic %int %17598 %int_4\n      %16670 = OpIAdd %int %25085 %11618\n      %19064 = OpBitcast %int %21364\n      %13020 = OpIMul %int %16670 %19064\n      %12986 = OpShiftRightArithmetic %int %23531 %int_5\n      %24558 = OpIAdd %int %13020 %12986\n       %8797 = OpShiftLeftLogical %int %24558 %int_7\n      %11434 = OpBitwiseAnd %int %6362 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %17598 %int_1\n      %21365 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21365 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %23531 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17334 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17334 %uint_4\n      %13015 = OpShiftRightArithmetic %int %17598 %int_3\n       %9929 = OpBitwiseXor %int %13015 %13237\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %23531 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %17598 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6551\n       %7092 = OpShiftLeftLogical %int %16793 %int_11\n      %16219 = OpBitwiseOr %int %18430 %7092\n      %14958 = OpShiftRightArithmetic %int %24144 %int_4\n       %6328 = OpBitwiseAnd %int %14958 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %16219 %21630\n      %14959 = OpShiftRightArithmetic %int %24144 %int_5\n       %6329 = OpBitwiseAnd %int %14959 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24144 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %23536\n      %24353 = OpLabel\n      %23000 = OpBitcast %v2int %17136\n      %22120 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %23000 1\n      %12089 = OpShiftRightArithmetic %int %14597 %int_5\n      %22400 = OpBitcast %int %22120\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %23000 0\n      %20423 = OpShiftRightArithmetic %int %25154 %int_5\n      %18864 = OpIAdd %int %7938 %20423\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25154 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17335 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17335 %uint_4\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25154 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6552\n       %7093 = OpShiftLeftLogical %int %21575 %int_11\n      %16220 = OpBitwiseOr %int %18431 %7093\n      %14960 = OpShiftRightArithmetic %int %24163 %int_4\n       %6330 = OpBitwiseAnd %int %14960 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %16220 %21632\n      %14961 = OpShiftRightArithmetic %int %24163 %int_5\n       %6331 = OpBitwiseAnd %int %14961 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24163 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %23536\n      %23536 = OpLabel\n      %10540 = OpPhi %uint %16869 %11410 %16870 %24353\n               OpBranch %19040\n      %19040 = OpLabel\n      %11376 = OpPhi %uint %11367 %9741 %10540 %23536\n      %21072 = OpIAdd %uint %11376 %24236\n      %12528 = OpShiftRightLogical %uint %14582 %int_4\n      %22258 = OpShiftRightLogical %uint %21072 %int_4\n       %9358 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %22258\n       %7338 = OpLoad %v4uint %9358\n      %13760 = OpIEqual %bool %25058 %uint_1\n      %21366 = OpIEqual %bool %25058 %uint_2\n      %22150 = OpLogicalOr %bool %13760 %21366\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %7338 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %7338 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22649 = OpPhi %v4uint %7338 %19040 %16376 %10583\n      %19638 = OpIEqual %bool %25058 %uint_3\n      %15139 = OpLogicalOr %bool %21366 %19638\n               OpSelectionMerge %11416 None\n               OpBranchConditional %15139 %11064 %11416\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22649 %749\n      %15335 = OpShiftRightLogical %v4uint %22649 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %11416\n      %11416 = OpLabel\n      %19767 = OpPhi %v4uint %22649 %13411 %10728 %11064\n      %24825 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %12528\n               OpStore %24825 %19767\n      %21685 = OpIAdd %uint %14582 %uint_16\n               OpSelectionMerge %24688 DontFlatten\n               OpBranchConditional %17270 %21993 %7205\n      %21993 = OpLabel\n               OpBranch %24688\n       %7205 = OpLabel\n               OpBranch %24688\n      %24688 = OpLabel\n      %11377 = OpPhi %uint %uint_32 %21993 %uint_16 %7205\n      %21073 = OpIAdd %uint %21072 %11377\n      %12529 = OpShiftRightLogical %uint %21685 %int_4\n      %22259 = OpShiftRightLogical %uint %21073 %int_4\n      %10821 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %22259\n      %14608 = OpLoad %v4uint %10821\n               OpSelectionMerge %14874 None\n               OpBranchConditional %22150 %10584 %14874\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %14874\n      %14874 = OpLabel\n      %10924 = OpPhi %v4uint %14608 %24688 %16377 %10584\n               OpSelectionMerge %11417 None\n               OpBranchConditional %15139 %11065 %11417\n      %11065 = OpLabel\n      %24088 = OpShiftLeftLogical %v4uint %10924 %749\n      %15336 = OpShiftRightLogical %v4uint %10924 %749\n      %10729 = OpBitwiseOr %v4uint %24088 %15336\n               OpBranch %11417\n      %11417 = OpLabel\n      %19768 = OpPhi %v4uint %10924 %14874 %10729 %11065\n       %8053 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %12529\n               OpStore %8053 %19768\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_128bpb_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006243, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000140E, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564,\n    0x00000000, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000107A,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73, 0x00006563,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000019, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000140E, 0x00000019,\n    0x00040047, 0x0000140E, 0x00000021, 0x00000000, 0x00040047, 0x0000140E,\n    0x00000022, 0x00000000, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000018, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000107A, 0x00000018, 0x00040047, 0x0000107A, 0x00000021,\n    0x00000000, 0x00040047, 0x0000107A, 0x00000022, 0x00000001, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000017, 0x0000000B, 0x00000004, 0x00040015, 0x0000000C,\n    0x00000020, 0x00000001, 0x00040017, 0x00000012, 0x0000000C, 0x00000002,\n    0x00040017, 0x00000016, 0x0000000C, 0x00000003, 0x00020014, 0x00000009,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001,\n    0x0004002B, 0x0000000B, 0x00000A10, 0x00000002, 0x0004002B, 0x0000000B,\n    0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B, 0x00000A22, 0x00000008,\n    0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00, 0x0004002B, 0x0000000B,\n    0x00000A13, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A3A, 0x00000010,\n    0x0004002B, 0x0000000C, 0x00000A17, 0x00000004, 0x0004002B, 0x0000000C,\n    0x00000A1D, 0x00000006, 0x0004002B, 0x0000000C, 0x00000A2C, 0x0000000B,\n    0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C,\n    0x00000A1A, 0x00000005, 0x0004002B, 0x0000000C, 0x00000A20, 0x00000007,\n    0x0004002B, 0x0000000C, 0x00000A23, 0x00000008, 0x0004002B, 0x0000000C,\n    0x00000A2F, 0x0000000C, 0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000,\n    0x0004002B, 0x0000000C, 0x00000A14, 0x00000003, 0x0004002B, 0x0000000C,\n    0x00000A11, 0x00000002, 0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000,\n    0x000A001E, 0x00000489, 0x0000000B, 0x0000000B, 0x0000000B, 0x0000000B,\n    0x00000014, 0x0000000B, 0x0000000B, 0x0000000B, 0x00040020, 0x00000706,\n    0x00000009, 0x00000489, 0x0004003B, 0x00000706, 0x00000CE9, 0x00000009,\n    0x00040020, 0x00000288, 0x00000009, 0x0000000B, 0x00040020, 0x00000291,\n    0x00000009, 0x00000014, 0x00040020, 0x00000292, 0x00000001, 0x00000014,\n    0x0004003B, 0x00000292, 0x00000F48, 0x00000001, 0x0006002C, 0x00000014,\n    0x00000A19, 0x00000A0D, 0x00000A0A, 0x00000A0A, 0x00040017, 0x0000000F,\n    0x00000009, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A16, 0x00000004,\n    0x0003001D, 0x000007DC, 0x00000017, 0x0003001E, 0x000007B4, 0x000007DC,\n    0x00040020, 0x00000A31, 0x00000002, 0x000007B4, 0x0004003B, 0x00000A31,\n    0x0000140E, 0x00000002, 0x0003001D, 0x000007DD, 0x00000017, 0x0003001E,\n    0x000007B5, 0x000007DD, 0x00040020, 0x00000A32, 0x00000002, 0x000007B5,\n    0x0004003B, 0x00000A32, 0x0000107A, 0x00000002, 0x00040020, 0x00000294,\n    0x00000002, 0x00000017, 0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020,\n    0x0006002C, 0x00000014, 0x00000BC3, 0x00000A16, 0x00000A6A, 0x00000A0D,\n    0x0007002C, 0x00000017, 0x000009CE, 0x000008A6, 0x000008A6, 0x000008A6,\n    0x000008A6, 0x0007002C, 0x00000017, 0x0000013D, 0x00000A22, 0x00000A22,\n    0x00000A22, 0x00000A22, 0x0007002C, 0x00000017, 0x0000072E, 0x000005FD,\n    0x000005FD, 0x000005FD, 0x000005FD, 0x0007002C, 0x00000017, 0x000002ED,\n    0x00000A3A, 0x00000A3A, 0x00000A3A, 0x00000A3A, 0x0004002B, 0x0000000C,\n    0x00000A3B, 0x00000010, 0x00050036, 0x00000008, 0x0000161F, 0x00000000,\n    0x00000502, 0x000200F8, 0x00003B06, 0x000300F7, 0x00004C7A, 0x00000000,\n    0x000300FB, 0x00000A0A, 0x00002E68, 0x000200F8, 0x00002E68, 0x00050041,\n    0x00000288, 0x000060D7, 0x00000CE9, 0x00000A0B, 0x0004003D, 0x0000000B,\n    0x00003526, 0x000060D7, 0x000500C7, 0x0000000B, 0x00005FDC, 0x00003526,\n    0x00000A0D, 0x000500AB, 0x00000009, 0x00004376, 0x00005FDC, 0x00000A0A,\n    0x000500C7, 0x0000000B, 0x00003028, 0x00003526, 0x00000A10, 0x000500AB,\n    0x00000009, 0x00004384, 0x00003028, 0x00000A0A, 0x000500C2, 0x0000000B,\n    0x00001EB0, 0x00003526, 0x00000A10, 0x000500C7, 0x0000000B, 0x000061E2,\n    0x00001EB0, 0x00000A13, 0x00050041, 0x00000288, 0x0000492C, 0x00000CE9,\n    0x00000A0E, 0x0004003D, 0x0000000B, 0x00005EAC, 0x0000492C, 0x00050041,\n    0x00000288, 0x00004EBA, 0x00000CE9, 0x00000A11, 0x0004003D, 0x0000000B,\n    0x00005788, 0x00004EBA, 0x00050041, 0x00000288, 0x00004EBB, 0x00000CE9,\n    0x00000A14, 0x0004003D, 0x0000000B, 0x00005789, 0x00004EBB, 0x00050041,\n    0x00000291, 0x00004EBC, 0x00000CE9, 0x00000A17, 0x0004003D, 0x00000014,\n    0x0000578A, 0x00004EBC, 0x00050041, 0x00000288, 0x00004EBD, 0x00000CE9,\n    0x00000A1A, 0x0004003D, 0x0000000B, 0x0000578B, 0x00004EBD, 0x00050041,\n    0x00000288, 0x00004E6E, 0x00000CE9, 0x00000A1D, 0x0004003D, 0x0000000B,\n    0x000019C2, 0x00004E6E, 0x0004003D, 0x00000014, 0x00002A0E, 0x00000F48,\n    0x000500C4, 0x00000014, 0x0000538B, 0x00002A0E, 0x00000A19, 0x0007004F,\n    0x00000011, 0x000042F0, 0x0000538B, 0x0000538B, 0x00000000, 0x00000001,\n    0x0007004F, 0x00000011, 0x0000242F, 0x0000578A, 0x0000578A, 0x00000000,\n    0x00000001, 0x000500AE, 0x0000000F, 0x00004288, 0x000042F0, 0x0000242F,\n    0x0004009A, 0x00000009, 0x00006067, 0x00004288, 0x000300F7, 0x000019BA,\n    0x00000002, 0x000400FA, 0x00006067, 0x000055E8, 0x000019BA, 0x000200F8,\n    0x000055E8, 0x000200F9, 0x00004C7A, 0x000200F8, 0x000019BA, 0x0004007C,\n    0x00000016, 0x00005BB6, 0x0000538B, 0x00050051, 0x0000000B, 0x00004916,\n    0x0000578A, 0x00000001, 0x00050051, 0x0000000C, 0x00005BEB, 0x00005BB6,\n    0x00000000, 0x00050084, 0x0000000C, 0x0000591A, 0x00005BEB, 0x00000A3B,\n    0x00050051, 0x0000000C, 0x000018DA, 0x00005BB6, 0x00000002, 0x0004007C,\n    0x0000000C, 0x000038A9, 0x00004916, 0x00050084, 0x0000000C, 0x00002C0F,\n    0x000018DA, 0x000038A9, 0x00050051, 0x0000000C, 0x000044BE, 0x00005BB6,\n    0x00000001, 0x00050080, 0x0000000C, 0x000056D4, 0x00002C0F, 0x000044BE,\n    0x0004007C, 0x0000000C, 0x00005785, 0x000019C2, 0x00050084, 0x0000000C,\n    0x00005FD7, 0x000056D4, 0x00005785, 0x00050080, 0x0000000C, 0x00002042,\n    0x0000591A, 0x00005FD7, 0x0004007C, 0x0000000B, 0x000028A4, 0x00002042,\n    0x00050080, 0x0000000B, 0x000038F6, 0x0000578B, 0x000028A4, 0x000400A8,\n    0x00000009, 0x00003014, 0x00004376, 0x000300F7, 0x00004A60, 0x00000002,\n    0x000400FA, 0x00003014, 0x0000260D, 0x0000426F, 0x000200F8, 0x0000260D,\n    0x00050051, 0x0000000B, 0x00004437, 0x0000538B, 0x00000000, 0x00050051,\n    0x0000000B, 0x00002BEE, 0x0000538B, 0x00000001, 0x00050051, 0x0000000B,\n    0x00004971, 0x0000538B, 0x00000002, 0x00050084, 0x0000000B, 0x000039EF,\n    0x00005789, 0x00004971, 0x00050080, 0x0000000B, 0x00004F62, 0x00002BEE,\n    0x000039EF, 0x00050084, 0x0000000B, 0x000054AC, 0x00005788, 0x00004F62,\n    0x00050080, 0x0000000B, 0x00004FAE, 0x00004437, 0x000054AC, 0x000500C4,\n    0x0000000B, 0x00002C67, 0x00004FAE, 0x00000A16, 0x000200F9, 0x00004A60,\n    0x000200F8, 0x0000426F, 0x000300F7, 0x00005BF0, 0x00000002, 0x000400FA,\n    0x00004384, 0x00002C92, 0x00005F21, 0x000200F8, 0x00002C92, 0x000500C2,\n    0x0000000B, 0x00005374, 0x00005788, 0x00000A1A, 0x000500C2, 0x0000000B,\n    0x000035EC, 0x00005789, 0x00000A17, 0x000500C3, 0x0000000C, 0x000033B5,\n    0x000018DA, 0x00000A11, 0x0004007C, 0x0000000C, 0x00005766, 0x000035EC,\n    0x00050084, 0x0000000C, 0x000061FD, 0x000033B5, 0x00005766, 0x000500C3,\n    0x0000000C, 0x00002D62, 0x000044BE, 0x00000A17, 0x00050080, 0x0000000C,\n    0x0000411E, 0x000061FD, 0x00002D62, 0x0004007C, 0x0000000C, 0x00004A78,\n    0x00005374, 0x00050084, 0x0000000C, 0x000032DC, 0x0000411E, 0x00004A78,\n    0x000500C3, 0x0000000C, 0x000032BA, 0x00005BEB, 0x00000A1A, 0x00050080,\n    0x0000000C, 0x00005FEE, 0x000032DC, 0x000032BA, 0x000500C4, 0x0000000C,\n    0x0000225D, 0x00005FEE, 0x00000A20, 0x000500C7, 0x0000000C, 0x00002CAA,\n    0x000018DA, 0x00000A14, 0x000500C4, 0x0000000C, 0x00004CAE, 0x00002CAA,\n    0x00000A1A, 0x000500C3, 0x0000000C, 0x0000383E, 0x000044BE, 0x00000A0E,\n    0x000500C7, 0x0000000C, 0x00005375, 0x0000383E, 0x00000A14, 0x000500C4,\n    0x0000000C, 0x000054CA, 0x00005375, 0x00000A14, 0x000500C5, 0x0000000C,\n    0x000042CE, 0x00004CAE, 0x000054CA, 0x000500C7, 0x0000000C, 0x000050D5,\n    0x00005BEB, 0x00000A20, 0x000500C5, 0x0000000C, 0x00003ADD, 0x000042CE,\n    0x000050D5, 0x000500C5, 0x0000000C, 0x000043B6, 0x0000225D, 0x00003ADD,\n    0x000500C4, 0x0000000C, 0x00005E50, 0x000043B6, 0x00000A16, 0x000500C3,\n    0x0000000C, 0x000032D7, 0x000044BE, 0x00000A14, 0x000500C6, 0x0000000C,\n    0x000026C9, 0x000032D7, 0x000033B5, 0x000500C7, 0x0000000C, 0x00004199,\n    0x000026C9, 0x00000A0E, 0x000500C3, 0x0000000C, 0x00002590, 0x00005BEB,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x0000505E, 0x00002590, 0x00000A14,\n    0x000500C4, 0x0000000C, 0x0000541D, 0x00004199, 0x00000A0E, 0x000500C6,\n    0x0000000C, 0x000022BA, 0x0000505E, 0x0000541D, 0x000500C7, 0x0000000C,\n    0x00005076, 0x000044BE, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005228,\n    0x00005076, 0x00000A17, 0x000500C4, 0x0000000C, 0x00001997, 0x000022BA,\n    0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FE, 0x00005228, 0x00001997,\n    0x000500C4, 0x0000000C, 0x00001BB4, 0x00004199, 0x00000A2C, 0x000500C5,\n    0x0000000C, 0x00003F5B, 0x000047FE, 0x00001BB4, 0x000500C3, 0x0000000C,\n    0x00003A6E, 0x00005E50, 0x00000A17, 0x000500C7, 0x0000000C, 0x000018B8,\n    0x00003A6E, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000547E, 0x000018B8,\n    0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A8, 0x00003F5B, 0x0000547E,\n    0x000500C3, 0x0000000C, 0x00003A6F, 0x00005E50, 0x00000A1A, 0x000500C7,\n    0x0000000C, 0x000018B9, 0x00003A6F, 0x00000A20, 0x000500C4, 0x0000000C,\n    0x0000547F, 0x000018B9, 0x00000A23, 0x000500C5, 0x0000000C, 0x0000456F,\n    0x000045A8, 0x0000547F, 0x000500C3, 0x0000000C, 0x00003C88, 0x00005E50,\n    0x00000A23, 0x000500C4, 0x0000000C, 0x00002824, 0x00003C88, 0x00000A2F,\n    0x000500C5, 0x0000000C, 0x00003B79, 0x0000456F, 0x00002824, 0x0004007C,\n    0x0000000B, 0x000041E5, 0x00003B79, 0x000200F9, 0x00005BF0, 0x000200F8,\n    0x00005F21, 0x0004007C, 0x00000012, 0x000059D8, 0x000042F0, 0x000500C2,\n    0x0000000B, 0x00005668, 0x00005788, 0x00000A1A, 0x00050051, 0x0000000C,\n    0x00003905, 0x000059D8, 0x00000001, 0x000500C3, 0x0000000C, 0x00002F39,\n    0x00003905, 0x00000A1A, 0x0004007C, 0x0000000C, 0x00005780, 0x00005668,\n    0x00050084, 0x0000000C, 0x00001F02, 0x00002F39, 0x00005780, 0x00050051,\n    0x0000000C, 0x00006242, 0x000059D8, 0x00000000, 0x000500C3, 0x0000000C,\n    0x00004FC7, 0x00006242, 0x00000A1A, 0x00050080, 0x0000000C, 0x000049B0,\n    0x00001F02, 0x00004FC7, 0x000500C4, 0x0000000C, 0x0000254A, 0x000049B0,\n    0x00000A1D, 0x000500C3, 0x0000000C, 0x0000603B, 0x00003905, 0x00000A0E,\n    0x000500C7, 0x0000000C, 0x0000539A, 0x0000603B, 0x00000A20, 0x000500C4,\n    0x0000000C, 0x0000534A, 0x0000539A, 0x00000A14, 0x000500C7, 0x0000000C,\n    0x00004EA5, 0x00006242, 0x00000A20, 0x000500C5, 0x0000000C, 0x00002B1A,\n    0x0000534A, 0x00004EA5, 0x000500C5, 0x0000000C, 0x000043B7, 0x0000254A,\n    0x00002B1A, 0x000500C4, 0x0000000C, 0x00005E63, 0x000043B7, 0x00000A16,\n    0x000500C3, 0x0000000C, 0x000031DE, 0x00003905, 0x00000A17, 0x000500C7,\n    0x0000000C, 0x00005447, 0x000031DE, 0x00000A0E, 0x000500C3, 0x0000000C,\n    0x000028A6, 0x00006242, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000511E,\n    0x000028A6, 0x00000A14, 0x000500C3, 0x0000000C, 0x000028B9, 0x00003905,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x0000505F, 0x000028B9, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x0000541E, 0x0000505F, 0x00000A0E, 0x000500C6,\n    0x0000000C, 0x000022BB, 0x0000511E, 0x0000541E, 0x000500C7, 0x0000000C,\n    0x00005077, 0x00003905, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005229,\n    0x00005077, 0x00000A17, 0x000500C4, 0x0000000C, 0x00001998, 0x000022BB,\n    0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FF, 0x00005229, 0x00001998,\n    0x000500C4, 0x0000000C, 0x00001BB5, 0x00005447, 0x00000A2C, 0x000500C5,\n    0x0000000C, 0x00003F5C, 0x000047FF, 0x00001BB5, 0x000500C3, 0x0000000C,\n    0x00003A70, 0x00005E63, 0x00000A17, 0x000500C7, 0x0000000C, 0x000018BA,\n    0x00003A70, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005480, 0x000018BA,\n    0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A9, 0x00003F5C, 0x00005480,\n    0x000500C3, 0x0000000C, 0x00003A71, 0x00005E63, 0x00000A1A, 0x000500C7,\n    0x0000000C, 0x000018BB, 0x00003A71, 0x00000A20, 0x000500C4, 0x0000000C,\n    0x00005481, 0x000018BB, 0x00000A23, 0x000500C5, 0x0000000C, 0x00004570,\n    0x000045A9, 0x00005481, 0x000500C3, 0x0000000C, 0x00003C89, 0x00005E63,\n    0x00000A23, 0x000500C4, 0x0000000C, 0x00002825, 0x00003C89, 0x00000A2F,\n    0x000500C5, 0x0000000C, 0x00003B7A, 0x00004570, 0x00002825, 0x0004007C,\n    0x0000000B, 0x000041E6, 0x00003B7A, 0x000200F9, 0x00005BF0, 0x000200F8,\n    0x00005BF0, 0x000700F5, 0x0000000B, 0x0000292C, 0x000041E5, 0x00002C92,\n    0x000041E6, 0x00005F21, 0x000200F9, 0x00004A60, 0x000200F8, 0x00004A60,\n    0x000700F5, 0x0000000B, 0x00002C70, 0x00002C67, 0x0000260D, 0x0000292C,\n    0x00005BF0, 0x00050080, 0x0000000B, 0x00005250, 0x00002C70, 0x00005EAC,\n    0x000500C2, 0x0000000B, 0x000030F0, 0x000038F6, 0x00000A17, 0x000500C2,\n    0x0000000B, 0x000056F2, 0x00005250, 0x00000A17, 0x00060041, 0x00000294,\n    0x0000248E, 0x0000107A, 0x00000A0B, 0x000056F2, 0x0004003D, 0x00000017,\n    0x00001CAA, 0x0000248E, 0x000500AA, 0x00000009, 0x000035C0, 0x000061E2,\n    0x00000A0D, 0x000500AA, 0x00000009, 0x00005376, 0x000061E2, 0x00000A10,\n    0x000500A6, 0x00000009, 0x00005686, 0x000035C0, 0x00005376, 0x000300F7,\n    0x00003463, 0x00000000, 0x000400FA, 0x00005686, 0x00002957, 0x00003463,\n    0x000200F8, 0x00002957, 0x000500C7, 0x00000017, 0x0000475F, 0x00001CAA,\n    0x000009CE, 0x000500C4, 0x00000017, 0x000024D1, 0x0000475F, 0x0000013D,\n    0x000500C7, 0x00000017, 0x000050AC, 0x00001CAA, 0x0000072E, 0x000500C2,\n    0x00000017, 0x0000448D, 0x000050AC, 0x0000013D, 0x000500C5, 0x00000017,\n    0x00003FF8, 0x000024D1, 0x0000448D, 0x000200F9, 0x00003463, 0x000200F8,\n    0x00003463, 0x000700F5, 0x00000017, 0x00005879, 0x00001CAA, 0x00004A60,\n    0x00003FF8, 0x00002957, 0x000500AA, 0x00000009, 0x00004CB6, 0x000061E2,\n    0x00000A13, 0x000500A6, 0x00000009, 0x00003B23, 0x00005376, 0x00004CB6,\n    0x000300F7, 0x00002C98, 0x00000000, 0x000400FA, 0x00003B23, 0x00002B38,\n    0x00002C98, 0x000200F8, 0x00002B38, 0x000500C4, 0x00000017, 0x00005E17,\n    0x00005879, 0x000002ED, 0x000500C2, 0x00000017, 0x00003BE7, 0x00005879,\n    0x000002ED, 0x000500C5, 0x00000017, 0x000029E8, 0x00005E17, 0x00003BE7,\n    0x000200F9, 0x00002C98, 0x000200F8, 0x00002C98, 0x000700F5, 0x00000017,\n    0x00004D37, 0x00005879, 0x00003463, 0x000029E8, 0x00002B38, 0x00060041,\n    0x00000294, 0x000060F9, 0x0000140E, 0x00000A0B, 0x000030F0, 0x0003003E,\n    0x000060F9, 0x00004D37, 0x00050080, 0x0000000B, 0x000054B5, 0x000038F6,\n    0x00000A3A, 0x000300F7, 0x00006070, 0x00000002, 0x000400FA, 0x00004376,\n    0x000055E9, 0x00001C25, 0x000200F8, 0x000055E9, 0x000200F9, 0x00006070,\n    0x000200F8, 0x00001C25, 0x000200F9, 0x00006070, 0x000200F8, 0x00006070,\n    0x000700F5, 0x0000000B, 0x00002C71, 0x00000A6A, 0x000055E9, 0x00000A3A,\n    0x00001C25, 0x00050080, 0x0000000B, 0x00005251, 0x00005250, 0x00002C71,\n    0x000500C2, 0x0000000B, 0x000030F1, 0x000054B5, 0x00000A17, 0x000500C2,\n    0x0000000B, 0x000056F3, 0x00005251, 0x00000A17, 0x00060041, 0x00000294,\n    0x00002A45, 0x0000107A, 0x00000A0B, 0x000056F3, 0x0004003D, 0x00000017,\n    0x00003910, 0x00002A45, 0x000300F7, 0x00003A1A, 0x00000000, 0x000400FA,\n    0x00005686, 0x00002958, 0x00003A1A, 0x000200F8, 0x00002958, 0x000500C7,\n    0x00000017, 0x00004760, 0x00003910, 0x000009CE, 0x000500C4, 0x00000017,\n    0x000024D2, 0x00004760, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AD,\n    0x00003910, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448E, 0x000050AD,\n    0x0000013D, 0x000500C5, 0x00000017, 0x00003FF9, 0x000024D2, 0x0000448E,\n    0x000200F9, 0x00003A1A, 0x000200F8, 0x00003A1A, 0x000700F5, 0x00000017,\n    0x00002AAC, 0x00003910, 0x00006070, 0x00003FF9, 0x00002958, 0x000300F7,\n    0x00002C99, 0x00000000, 0x000400FA, 0x00003B23, 0x00002B39, 0x00002C99,\n    0x000200F8, 0x00002B39, 0x000500C4, 0x00000017, 0x00005E18, 0x00002AAC,\n    0x000002ED, 0x000500C2, 0x00000017, 0x00003BE8, 0x00002AAC, 0x000002ED,\n    0x000500C5, 0x00000017, 0x000029E9, 0x00005E18, 0x00003BE8, 0x000200F9,\n    0x00002C99, 0x000200F8, 0x00002C99, 0x000700F5, 0x00000017, 0x00004D38,\n    0x00002AAC, 0x00003A1A, 0x000029E9, 0x00002B39, 0x00060041, 0x00000294,\n    0x00001F75, 0x0000140E, 0x00000A0B, 0x000030F1, 0x0003003E, 0x00001F75,\n    0x00004D38, 0x000200F9, 0x00004C7A, 0x000200F8, 0x00004C7A, 0x000100FD,\n    0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_128bpb_scaled_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25157\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n     %v4uint = OpTypeVector %uint 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v3uint = OpTypeVector %uint 3\n     %uint_1 = OpConstant %uint 1\n     %uint_2 = OpConstant %uint 2\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n     %uint_3 = OpConstant %uint 3\n    %uint_16 = OpConstant %uint 16\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n     %uint_0 = OpConstant %uint 0\n      %int_3 = OpConstant %int 3\n      %int_2 = OpConstant %int 2\n     %uint_5 = OpConstant %uint 5\n     %uint_4 = OpConstant %uint 4\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n     %uint_7 = OpConstant %uint 7\n       %1927 = OpConstantComposite %v2uint %uint_4 %uint_7\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %2587 = OpConstantComposite %v3uint %uint_1 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n    %uint_32 = OpConstant %uint 32\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %1954 = OpConstantComposite %v2uint %uint_7 %uint_7\n       %1828 = OpConstantComposite %v2uint %uint_1 %uint_1\n     %uint_6 = OpConstant %uint 6\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n     %int_16 = OpConstant %int 16\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24445 = OpBitwiseAnd %uint %13606 %uint_2\n      %18667 = OpINotEqual %bool %24445 %uint_0\n       %8141 = OpShiftRightLogical %uint %13606 %uint_2\n      %24990 = OpBitwiseAnd %uint %8141 %uint_3\n       %8871 = OpCompositeConstruct %v2uint %13606 %13606\n       %7087 = OpShiftRightLogical %v2uint %8871 %1927\n       %6551 = OpBitwiseAnd %v2uint %7087 %1954\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2587\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %6586 DontFlatten\n               OpBranchConditional %24679 %21992 %6586\n      %21992 = OpLabel\n               OpBranch %19578\n       %6586 = OpLabel\n      %23478 = OpBitcast %v3int %21387\n      %18710 = OpCompositeExtract %uint %22410 1\n      %23531 = OpCompositeExtract %int %23478 0\n      %22810 = OpIMul %int %23531 %int_16\n       %6362 = OpCompositeExtract %int %23478 2\n      %14505 = OpBitcast %int %18710\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %23478 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %6594\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %22810 %24535\n      %10898 = OpBitcast %uint %8258\n       %7937 = OpIAdd %uint %22411 %10898\n      %19921 = OpShiftRightLogical %v2uint %17136 %1828\n       %7712 = OpUDiv %v2uint %19921 %6551\n      %18183 = OpIMul %v2uint %6551 %7712\n      %18273 = OpISub %v2uint %19921 %18183\n      %11232 = OpShiftLeftLogical %v2uint %7712 %1828\n      %13284 = OpCompositeExtract %uint %18273 0\n      %10872 = OpCompositeExtract %uint %6551 1\n      %22886 = OpIMul %uint %13284 %10872\n       %6943 = OpCompositeExtract %uint %18273 1\n      %10469 = OpIAdd %uint %22886 %6943\n      %18851 = OpBitwiseAnd %v2uint %17136 %1828\n      %10581 = OpShiftLeftLogical %uint %10469 %uint_6\n      %20916 = OpCompositeExtract %uint %18851 1\n      %23596 = OpShiftLeftLogical %uint %20916 %uint_5\n      %19814 = OpBitwiseOr %uint %10581 %23596\n      %21476 = OpCompositeExtract %uint %18851 0\n       %8560 = OpShiftLeftLogical %uint %21476 %uint_4\n      %17648 = OpBitwiseOr %uint %19814 %8560\n      %19923 = OpCompositeExtract %uint %11232 0\n      %15556 = OpCompositeInsert %v3uint %19923 %21387 0\n      %23006 = OpCompositeExtract %uint %11232 1\n       %9680 = OpCompositeInsert %v3uint %23006 %15556 1\n               OpSelectionMerge %20344 DontFlatten\n               OpBranchConditional %18667 %23520 %11737\n      %23520 = OpLabel\n      %10111 = OpBitcast %v3int %9680\n      %19476 = OpShiftRightLogical %uint %22408 %int_5\n      %18810 = OpShiftRightLogical %uint %22409 %int_4\n       %6782 = OpCompositeExtract %int %10111 2\n      %12089 = OpShiftRightArithmetic %int %6782 %int_2\n      %22400 = OpBitcast %int %18810\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %10111 1\n      %19055 = OpShiftRightArithmetic %int %25154 %int_4\n      %11052 = OpIAdd %int %7938 %19055\n      %16898 = OpBitcast %int %19476\n      %14944 = OpIMul %int %11052 %16898\n      %25155 = OpCompositeExtract %int %10111 0\n      %20423 = OpShiftRightArithmetic %int %25155 %int_5\n      %18940 = OpIAdd %int %14944 %20423\n       %8797 = OpShiftLeftLogical %int %18940 %int_7\n      %11434 = OpBitwiseAnd %int %6782 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %25154 %int_1\n      %21364 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21364 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %25155 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17334 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17334 %uint_4\n      %13015 = OpShiftRightArithmetic %int %25154 %int_3\n       %9929 = OpBitwiseXor %int %13015 %12089\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %25155 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %25154 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6552 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6552\n       %7092 = OpShiftLeftLogical %int %16793 %int_11\n      %16219 = OpBitwiseOr %int %18430 %7092\n      %14958 = OpShiftRightArithmetic %int %24144 %int_4\n       %6328 = OpBitwiseAnd %int %14958 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %16219 %21630\n      %14959 = OpShiftRightArithmetic %int %24144 %int_5\n       %6329 = OpBitwiseAnd %int %14959 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24144 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %20344\n      %11737 = OpLabel\n      %11908 = OpVectorShuffle %v2uint %9680 %9680 0 1\n      %20347 = OpBitcast %v2int %11908\n      %11433 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %20347 1\n      %12090 = OpShiftRightArithmetic %int %14597 %int_5\n      %22401 = OpBitcast %int %11433\n       %7939 = OpIMul %int %12090 %22401\n      %25156 = OpCompositeExtract %int %20347 0\n      %20424 = OpShiftRightArithmetic %int %25156 %int_5\n      %18864 = OpIAdd %int %7939 %20424\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25156 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17335 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17335 %uint_4\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25156 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6553 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6553\n       %7093 = OpShiftLeftLogical %int %21575 %int_11\n      %16220 = OpBitwiseOr %int %18431 %7093\n      %14960 = OpShiftRightArithmetic %int %24163 %int_4\n       %6330 = OpBitwiseAnd %int %14960 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %16220 %21632\n      %14961 = OpShiftRightArithmetic %int %24163 %int_5\n       %6331 = OpBitwiseAnd %int %14961 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24163 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %20344\n      %20344 = OpLabel\n      %18329 = OpPhi %uint %16869 %23520 %16870 %11737\n      %15200 = OpCompositeExtract %uint %6551 0\n      %17489 = OpIMul %uint %15200 %10872\n       %7313 = OpIMul %uint %18329 %17489\n       %8815 = OpIAdd %uint %7313 %17648\n      %23921 = OpIAdd %uint %8815 %24236\n      %11494 = OpShiftRightLogical %uint %7937 %int_4\n      %22258 = OpShiftRightLogical %uint %23921 %int_4\n       %9358 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %22258\n       %7338 = OpLoad %v4uint %9358\n      %13760 = OpIEqual %bool %24990 %uint_1\n      %21366 = OpIEqual %bool %24990 %uint_2\n      %22150 = OpLogicalOr %bool %13760 %21366\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %7338 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %7338 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22649 = OpPhi %v4uint %7338 %20344 %16376 %10583\n      %19638 = OpIEqual %bool %24990 %uint_3\n      %15139 = OpLogicalOr %bool %21366 %19638\n               OpSelectionMerge %11416 None\n               OpBranchConditional %15139 %11064 %11416\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22649 %749\n      %15335 = OpShiftRightLogical %v4uint %22649 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %11416\n      %11416 = OpLabel\n      %19767 = OpPhi %v4uint %22649 %13411 %10728 %11064\n      %24825 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %11494\n               OpStore %24825 %19767\n      %22137 = OpIAdd %uint %7937 %uint_16\n      %12665 = OpIAdd %uint %23921 %uint_16\n      %11495 = OpShiftRightLogical %uint %22137 %int_4\n      %22259 = OpShiftRightLogical %uint %12665 %int_4\n      %10821 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %22259\n      %14608 = OpLoad %v4uint %10821\n               OpSelectionMerge %14874 None\n               OpBranchConditional %22150 %10584 %14874\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %14874\n      %14874 = OpLabel\n      %10924 = OpPhi %v4uint %14608 %11416 %16377 %10584\n               OpSelectionMerge %11417 None\n               OpBranchConditional %15139 %11065 %11417\n      %11065 = OpLabel\n      %24088 = OpShiftLeftLogical %v4uint %10924 %749\n      %15336 = OpShiftRightLogical %v4uint %10924 %749\n      %10729 = OpBitwiseOr %v4uint %24088 %15336\n               OpBranch %11417\n      %11417 = OpLabel\n      %19768 = OpPhi %v4uint %10924 %14874 %10729 %11065\n       %8053 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %11495\n               OpStore %8053 %19768\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_128bpb_scaled_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006245, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000140E, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564,\n    0x00000000, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000107A,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73, 0x00006563,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000019, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000140E, 0x00000019,\n    0x00040047, 0x0000140E, 0x00000021, 0x00000000, 0x00040047, 0x0000140E,\n    0x00000022, 0x00000000, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000018, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000107A, 0x00000018, 0x00040047, 0x0000107A, 0x00000021,\n    0x00000000, 0x00040047, 0x0000107A, 0x00000022, 0x00000001, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000017,\n    0x0000000B, 0x00000004, 0x00040015, 0x0000000C, 0x00000020, 0x00000001,\n    0x00040017, 0x00000012, 0x0000000C, 0x00000002, 0x00040017, 0x00000016,\n    0x0000000C, 0x00000003, 0x00020014, 0x00000009, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001,\n    0x0004002B, 0x0000000B, 0x00000A10, 0x00000002, 0x0004002B, 0x0000000B,\n    0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B, 0x00000A22, 0x00000008,\n    0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00, 0x0004002B, 0x0000000B,\n    0x00000A13, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A3A, 0x00000010,\n    0x0004002B, 0x0000000C, 0x00000A17, 0x00000004, 0x0004002B, 0x0000000C,\n    0x00000A1D, 0x00000006, 0x0004002B, 0x0000000C, 0x00000A2C, 0x0000000B,\n    0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C,\n    0x00000A1A, 0x00000005, 0x0004002B, 0x0000000C, 0x00000A20, 0x00000007,\n    0x0004002B, 0x0000000C, 0x00000A23, 0x00000008, 0x0004002B, 0x0000000C,\n    0x00000A2F, 0x0000000C, 0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000,\n    0x0004002B, 0x0000000C, 0x00000A14, 0x00000003, 0x0004002B, 0x0000000C,\n    0x00000A11, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A19, 0x00000005,\n    0x0004002B, 0x0000000B, 0x00000A16, 0x00000004, 0x0004002B, 0x0000000C,\n    0x00000A0B, 0x00000000, 0x000A001E, 0x00000489, 0x0000000B, 0x0000000B,\n    0x0000000B, 0x0000000B, 0x00000014, 0x0000000B, 0x0000000B, 0x0000000B,\n    0x00040020, 0x00000706, 0x00000009, 0x00000489, 0x0004003B, 0x00000706,\n    0x00000CE9, 0x00000009, 0x00040020, 0x00000288, 0x00000009, 0x0000000B,\n    0x0004002B, 0x0000000B, 0x00000A1F, 0x00000007, 0x0005002C, 0x00000011,\n    0x00000787, 0x00000A16, 0x00000A1F, 0x00040020, 0x00000291, 0x00000009,\n    0x00000014, 0x00040020, 0x00000292, 0x00000001, 0x00000014, 0x0004003B,\n    0x00000292, 0x00000F48, 0x00000001, 0x0006002C, 0x00000014, 0x00000A1B,\n    0x00000A0D, 0x00000A0A, 0x00000A0A, 0x00040017, 0x0000000F, 0x00000009,\n    0x00000002, 0x0003001D, 0x000007DC, 0x00000017, 0x0003001E, 0x000007B4,\n    0x000007DC, 0x00040020, 0x00000A31, 0x00000002, 0x000007B4, 0x0004003B,\n    0x00000A31, 0x0000140E, 0x00000002, 0x0003001D, 0x000007DD, 0x00000017,\n    0x0003001E, 0x000007B5, 0x000007DD, 0x00040020, 0x00000A32, 0x00000002,\n    0x000007B5, 0x0004003B, 0x00000A32, 0x0000107A, 0x00000002, 0x00040020,\n    0x00000294, 0x00000002, 0x00000017, 0x0004002B, 0x0000000B, 0x00000A6A,\n    0x00000020, 0x0006002C, 0x00000014, 0x00000BC3, 0x00000A16, 0x00000A6A,\n    0x00000A0D, 0x0005002C, 0x00000011, 0x000007A2, 0x00000A1F, 0x00000A1F,\n    0x0005002C, 0x00000011, 0x00000724, 0x00000A0D, 0x00000A0D, 0x0004002B,\n    0x0000000B, 0x00000A1C, 0x00000006, 0x0007002C, 0x00000017, 0x000009CE,\n    0x000008A6, 0x000008A6, 0x000008A6, 0x000008A6, 0x0007002C, 0x00000017,\n    0x0000013D, 0x00000A22, 0x00000A22, 0x00000A22, 0x00000A22, 0x0007002C,\n    0x00000017, 0x0000072E, 0x000005FD, 0x000005FD, 0x000005FD, 0x000005FD,\n    0x0007002C, 0x00000017, 0x000002ED, 0x00000A3A, 0x00000A3A, 0x00000A3A,\n    0x00000A3A, 0x0004002B, 0x0000000C, 0x00000A3B, 0x00000010, 0x00050036,\n    0x00000008, 0x0000161F, 0x00000000, 0x00000502, 0x000200F8, 0x00003B06,\n    0x000300F7, 0x00004C7A, 0x00000000, 0x000300FB, 0x00000A0A, 0x00002E68,\n    0x000200F8, 0x00002E68, 0x00050041, 0x00000288, 0x000060D7, 0x00000CE9,\n    0x00000A0B, 0x0004003D, 0x0000000B, 0x00003526, 0x000060D7, 0x000500C7,\n    0x0000000B, 0x00005F7D, 0x00003526, 0x00000A10, 0x000500AB, 0x00000009,\n    0x000048EB, 0x00005F7D, 0x00000A0A, 0x000500C2, 0x0000000B, 0x00001FCD,\n    0x00003526, 0x00000A10, 0x000500C7, 0x0000000B, 0x0000619E, 0x00001FCD,\n    0x00000A13, 0x00050050, 0x00000011, 0x000022A7, 0x00003526, 0x00003526,\n    0x000500C2, 0x00000011, 0x00001BAF, 0x000022A7, 0x00000787, 0x000500C7,\n    0x00000011, 0x00001997, 0x00001BAF, 0x000007A2, 0x00050041, 0x00000288,\n    0x0000492C, 0x00000CE9, 0x00000A0E, 0x0004003D, 0x0000000B, 0x00005EAC,\n    0x0000492C, 0x00050041, 0x00000288, 0x00004EBA, 0x00000CE9, 0x00000A11,\n    0x0004003D, 0x0000000B, 0x00005788, 0x00004EBA, 0x00050041, 0x00000288,\n    0x00004EBB, 0x00000CE9, 0x00000A14, 0x0004003D, 0x0000000B, 0x00005789,\n    0x00004EBB, 0x00050041, 0x00000291, 0x00004EBC, 0x00000CE9, 0x00000A17,\n    0x0004003D, 0x00000014, 0x0000578A, 0x00004EBC, 0x00050041, 0x00000288,\n    0x00004EBD, 0x00000CE9, 0x00000A1A, 0x0004003D, 0x0000000B, 0x0000578B,\n    0x00004EBD, 0x00050041, 0x00000288, 0x00004E6E, 0x00000CE9, 0x00000A1D,\n    0x0004003D, 0x0000000B, 0x000019C2, 0x00004E6E, 0x0004003D, 0x00000014,\n    0x00002A0E, 0x00000F48, 0x000500C4, 0x00000014, 0x0000538B, 0x00002A0E,\n    0x00000A1B, 0x0007004F, 0x00000011, 0x000042F0, 0x0000538B, 0x0000538B,\n    0x00000000, 0x00000001, 0x0007004F, 0x00000011, 0x0000242F, 0x0000578A,\n    0x0000578A, 0x00000000, 0x00000001, 0x000500AE, 0x0000000F, 0x00004288,\n    0x000042F0, 0x0000242F, 0x0004009A, 0x00000009, 0x00006067, 0x00004288,\n    0x000300F7, 0x000019BA, 0x00000002, 0x000400FA, 0x00006067, 0x000055E8,\n    0x000019BA, 0x000200F8, 0x000055E8, 0x000200F9, 0x00004C7A, 0x000200F8,\n    0x000019BA, 0x0004007C, 0x00000016, 0x00005BB6, 0x0000538B, 0x00050051,\n    0x0000000B, 0x00004916, 0x0000578A, 0x00000001, 0x00050051, 0x0000000C,\n    0x00005BEB, 0x00005BB6, 0x00000000, 0x00050084, 0x0000000C, 0x0000591A,\n    0x00005BEB, 0x00000A3B, 0x00050051, 0x0000000C, 0x000018DA, 0x00005BB6,\n    0x00000002, 0x0004007C, 0x0000000C, 0x000038A9, 0x00004916, 0x00050084,\n    0x0000000C, 0x00002C0F, 0x000018DA, 0x000038A9, 0x00050051, 0x0000000C,\n    0x000044BE, 0x00005BB6, 0x00000001, 0x00050080, 0x0000000C, 0x000056D4,\n    0x00002C0F, 0x000044BE, 0x0004007C, 0x0000000C, 0x00005785, 0x000019C2,\n    0x00050084, 0x0000000C, 0x00005FD7, 0x000056D4, 0x00005785, 0x00050080,\n    0x0000000C, 0x00002042, 0x0000591A, 0x00005FD7, 0x0004007C, 0x0000000B,\n    0x00002A92, 0x00002042, 0x00050080, 0x0000000B, 0x00001F01, 0x0000578B,\n    0x00002A92, 0x000500C2, 0x00000011, 0x00004DD1, 0x000042F0, 0x00000724,\n    0x00050086, 0x00000011, 0x00001E20, 0x00004DD1, 0x00001997, 0x00050084,\n    0x00000011, 0x00004707, 0x00001997, 0x00001E20, 0x00050082, 0x00000011,\n    0x00004761, 0x00004DD1, 0x00004707, 0x000500C4, 0x00000011, 0x00002BE0,\n    0x00001E20, 0x00000724, 0x00050051, 0x0000000B, 0x000033E4, 0x00004761,\n    0x00000000, 0x00050051, 0x0000000B, 0x00002A78, 0x00001997, 0x00000001,\n    0x00050084, 0x0000000B, 0x00005966, 0x000033E4, 0x00002A78, 0x00050051,\n    0x0000000B, 0x00001B1F, 0x00004761, 0x00000001, 0x00050080, 0x0000000B,\n    0x000028E5, 0x00005966, 0x00001B1F, 0x000500C7, 0x00000011, 0x000049A3,\n    0x000042F0, 0x00000724, 0x000500C4, 0x0000000B, 0x00002955, 0x000028E5,\n    0x00000A1C, 0x00050051, 0x0000000B, 0x000051B4, 0x000049A3, 0x00000001,\n    0x000500C4, 0x0000000B, 0x00005C2C, 0x000051B4, 0x00000A19, 0x000500C5,\n    0x0000000B, 0x00004D66, 0x00002955, 0x00005C2C, 0x00050051, 0x0000000B,\n    0x000053E4, 0x000049A3, 0x00000000, 0x000500C4, 0x0000000B, 0x00002170,\n    0x000053E4, 0x00000A16, 0x000500C5, 0x0000000B, 0x000044F0, 0x00004D66,\n    0x00002170, 0x00050051, 0x0000000B, 0x00004DD3, 0x00002BE0, 0x00000000,\n    0x00060052, 0x00000014, 0x00003CC4, 0x00004DD3, 0x0000538B, 0x00000000,\n    0x00050051, 0x0000000B, 0x000059DE, 0x00002BE0, 0x00000001, 0x00060052,\n    0x00000014, 0x000025D0, 0x000059DE, 0x00003CC4, 0x00000001, 0x000300F7,\n    0x00004F78, 0x00000002, 0x000400FA, 0x000048EB, 0x00005BE0, 0x00002DD9,\n    0x000200F8, 0x00005BE0, 0x0004007C, 0x00000016, 0x0000277F, 0x000025D0,\n    0x000500C2, 0x0000000B, 0x00004C14, 0x00005788, 0x00000A1A, 0x000500C2,\n    0x0000000B, 0x0000497A, 0x00005789, 0x00000A17, 0x00050051, 0x0000000C,\n    0x00001A7E, 0x0000277F, 0x00000002, 0x000500C3, 0x0000000C, 0x00002F39,\n    0x00001A7E, 0x00000A11, 0x0004007C, 0x0000000C, 0x00005780, 0x0000497A,\n    0x00050084, 0x0000000C, 0x00001F02, 0x00002F39, 0x00005780, 0x00050051,\n    0x0000000C, 0x00006242, 0x0000277F, 0x00000001, 0x000500C3, 0x0000000C,\n    0x00004A6F, 0x00006242, 0x00000A17, 0x00050080, 0x0000000C, 0x00002B2C,\n    0x00001F02, 0x00004A6F, 0x0004007C, 0x0000000C, 0x00004202, 0x00004C14,\n    0x00050084, 0x0000000C, 0x00003A60, 0x00002B2C, 0x00004202, 0x00050051,\n    0x0000000C, 0x00006243, 0x0000277F, 0x00000000, 0x000500C3, 0x0000000C,\n    0x00004FC7, 0x00006243, 0x00000A1A, 0x00050080, 0x0000000C, 0x000049FC,\n    0x00003A60, 0x00004FC7, 0x000500C4, 0x0000000C, 0x0000225D, 0x000049FC,\n    0x00000A20, 0x000500C7, 0x0000000C, 0x00002CAA, 0x00001A7E, 0x00000A14,\n    0x000500C4, 0x0000000C, 0x00004CAE, 0x00002CAA, 0x00000A1A, 0x000500C3,\n    0x0000000C, 0x0000383E, 0x00006242, 0x00000A0E, 0x000500C7, 0x0000000C,\n    0x00005374, 0x0000383E, 0x00000A14, 0x000500C4, 0x0000000C, 0x000054CA,\n    0x00005374, 0x00000A14, 0x000500C5, 0x0000000C, 0x000042CE, 0x00004CAE,\n    0x000054CA, 0x000500C7, 0x0000000C, 0x000050D5, 0x00006243, 0x00000A20,\n    0x000500C5, 0x0000000C, 0x00003ADD, 0x000042CE, 0x000050D5, 0x000500C5,\n    0x0000000C, 0x000043B6, 0x0000225D, 0x00003ADD, 0x000500C4, 0x0000000C,\n    0x00005E50, 0x000043B6, 0x00000A16, 0x000500C3, 0x0000000C, 0x000032D7,\n    0x00006242, 0x00000A14, 0x000500C6, 0x0000000C, 0x000026C9, 0x000032D7,\n    0x00002F39, 0x000500C7, 0x0000000C, 0x00004199, 0x000026C9, 0x00000A0E,\n    0x000500C3, 0x0000000C, 0x00002590, 0x00006243, 0x00000A14, 0x000500C7,\n    0x0000000C, 0x0000505E, 0x00002590, 0x00000A14, 0x000500C4, 0x0000000C,\n    0x0000541D, 0x00004199, 0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BA,\n    0x0000505E, 0x0000541D, 0x000500C7, 0x0000000C, 0x00005076, 0x00006242,\n    0x00000A0E, 0x000500C4, 0x0000000C, 0x00005228, 0x00005076, 0x00000A17,\n    0x000500C4, 0x0000000C, 0x00001998, 0x000022BA, 0x00000A1D, 0x000500C5,\n    0x0000000C, 0x000047FE, 0x00005228, 0x00001998, 0x000500C4, 0x0000000C,\n    0x00001BB4, 0x00004199, 0x00000A2C, 0x000500C5, 0x0000000C, 0x00003F5B,\n    0x000047FE, 0x00001BB4, 0x000500C3, 0x0000000C, 0x00003A6E, 0x00005E50,\n    0x00000A17, 0x000500C7, 0x0000000C, 0x000018B8, 0x00003A6E, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x0000547E, 0x000018B8, 0x00000A1A, 0x000500C5,\n    0x0000000C, 0x000045A8, 0x00003F5B, 0x0000547E, 0x000500C3, 0x0000000C,\n    0x00003A6F, 0x00005E50, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018B9,\n    0x00003A6F, 0x00000A20, 0x000500C4, 0x0000000C, 0x0000547F, 0x000018B9,\n    0x00000A23, 0x000500C5, 0x0000000C, 0x0000456F, 0x000045A8, 0x0000547F,\n    0x000500C3, 0x0000000C, 0x00003C88, 0x00005E50, 0x00000A23, 0x000500C4,\n    0x0000000C, 0x00002824, 0x00003C88, 0x00000A2F, 0x000500C5, 0x0000000C,\n    0x00003B79, 0x0000456F, 0x00002824, 0x0004007C, 0x0000000B, 0x000041E5,\n    0x00003B79, 0x000200F9, 0x00004F78, 0x000200F8, 0x00002DD9, 0x0007004F,\n    0x00000011, 0x00002E84, 0x000025D0, 0x000025D0, 0x00000000, 0x00000001,\n    0x0004007C, 0x00000012, 0x00004F7B, 0x00002E84, 0x000500C2, 0x0000000B,\n    0x00002CA9, 0x00005788, 0x00000A1A, 0x00050051, 0x0000000C, 0x00003905,\n    0x00004F7B, 0x00000001, 0x000500C3, 0x0000000C, 0x00002F3A, 0x00003905,\n    0x00000A1A, 0x0004007C, 0x0000000C, 0x00005781, 0x00002CA9, 0x00050084,\n    0x0000000C, 0x00001F03, 0x00002F3A, 0x00005781, 0x00050051, 0x0000000C,\n    0x00006244, 0x00004F7B, 0x00000000, 0x000500C3, 0x0000000C, 0x00004FC8,\n    0x00006244, 0x00000A1A, 0x00050080, 0x0000000C, 0x000049B0, 0x00001F03,\n    0x00004FC8, 0x000500C4, 0x0000000C, 0x0000254A, 0x000049B0, 0x00000A1D,\n    0x000500C3, 0x0000000C, 0x0000603B, 0x00003905, 0x00000A0E, 0x000500C7,\n    0x0000000C, 0x0000539A, 0x0000603B, 0x00000A20, 0x000500C4, 0x0000000C,\n    0x0000534A, 0x0000539A, 0x00000A14, 0x000500C7, 0x0000000C, 0x00004EA5,\n    0x00006244, 0x00000A20, 0x000500C5, 0x0000000C, 0x00002B1A, 0x0000534A,\n    0x00004EA5, 0x000500C5, 0x0000000C, 0x000043B7, 0x0000254A, 0x00002B1A,\n    0x000500C4, 0x0000000C, 0x00005E63, 0x000043B7, 0x00000A16, 0x000500C3,\n    0x0000000C, 0x000031DE, 0x00003905, 0x00000A17, 0x000500C7, 0x0000000C,\n    0x00005447, 0x000031DE, 0x00000A0E, 0x000500C3, 0x0000000C, 0x000028A6,\n    0x00006244, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000511E, 0x000028A6,\n    0x00000A14, 0x000500C3, 0x0000000C, 0x000028B9, 0x00003905, 0x00000A14,\n    0x000500C7, 0x0000000C, 0x0000505F, 0x000028B9, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x0000541E, 0x0000505F, 0x00000A0E, 0x000500C6, 0x0000000C,\n    0x000022BB, 0x0000511E, 0x0000541E, 0x000500C7, 0x0000000C, 0x00005077,\n    0x00003905, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005229, 0x00005077,\n    0x00000A17, 0x000500C4, 0x0000000C, 0x00001999, 0x000022BB, 0x00000A1D,\n    0x000500C5, 0x0000000C, 0x000047FF, 0x00005229, 0x00001999, 0x000500C4,\n    0x0000000C, 0x00001BB5, 0x00005447, 0x00000A2C, 0x000500C5, 0x0000000C,\n    0x00003F5C, 0x000047FF, 0x00001BB5, 0x000500C3, 0x0000000C, 0x00003A70,\n    0x00005E63, 0x00000A17, 0x000500C7, 0x0000000C, 0x000018BA, 0x00003A70,\n    0x00000A0E, 0x000500C4, 0x0000000C, 0x00005480, 0x000018BA, 0x00000A1A,\n    0x000500C5, 0x0000000C, 0x000045A9, 0x00003F5C, 0x00005480, 0x000500C3,\n    0x0000000C, 0x00003A71, 0x00005E63, 0x00000A1A, 0x000500C7, 0x0000000C,\n    0x000018BB, 0x00003A71, 0x00000A20, 0x000500C4, 0x0000000C, 0x00005481,\n    0x000018BB, 0x00000A23, 0x000500C5, 0x0000000C, 0x00004570, 0x000045A9,\n    0x00005481, 0x000500C3, 0x0000000C, 0x00003C89, 0x00005E63, 0x00000A23,\n    0x000500C4, 0x0000000C, 0x00002825, 0x00003C89, 0x00000A2F, 0x000500C5,\n    0x0000000C, 0x00003B7A, 0x00004570, 0x00002825, 0x0004007C, 0x0000000B,\n    0x000041E6, 0x00003B7A, 0x000200F9, 0x00004F78, 0x000200F8, 0x00004F78,\n    0x000700F5, 0x0000000B, 0x00004799, 0x000041E5, 0x00005BE0, 0x000041E6,\n    0x00002DD9, 0x00050051, 0x0000000B, 0x00003B60, 0x00001997, 0x00000000,\n    0x00050084, 0x0000000B, 0x00004451, 0x00003B60, 0x00002A78, 0x00050084,\n    0x0000000B, 0x00001C91, 0x00004799, 0x00004451, 0x00050080, 0x0000000B,\n    0x0000226F, 0x00001C91, 0x000044F0, 0x00050080, 0x0000000B, 0x00005D71,\n    0x0000226F, 0x00005EAC, 0x000500C2, 0x0000000B, 0x00002CE6, 0x00001F01,\n    0x00000A17, 0x000500C2, 0x0000000B, 0x000056F2, 0x00005D71, 0x00000A17,\n    0x00060041, 0x00000294, 0x0000248E, 0x0000107A, 0x00000A0B, 0x000056F2,\n    0x0004003D, 0x00000017, 0x00001CAA, 0x0000248E, 0x000500AA, 0x00000009,\n    0x000035C0, 0x0000619E, 0x00000A0D, 0x000500AA, 0x00000009, 0x00005376,\n    0x0000619E, 0x00000A10, 0x000500A6, 0x00000009, 0x00005686, 0x000035C0,\n    0x00005376, 0x000300F7, 0x00003463, 0x00000000, 0x000400FA, 0x00005686,\n    0x00002957, 0x00003463, 0x000200F8, 0x00002957, 0x000500C7, 0x00000017,\n    0x0000475F, 0x00001CAA, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D1,\n    0x0000475F, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AC, 0x00001CAA,\n    0x0000072E, 0x000500C2, 0x00000017, 0x0000448D, 0x000050AC, 0x0000013D,\n    0x000500C5, 0x00000017, 0x00003FF8, 0x000024D1, 0x0000448D, 0x000200F9,\n    0x00003463, 0x000200F8, 0x00003463, 0x000700F5, 0x00000017, 0x00005879,\n    0x00001CAA, 0x00004F78, 0x00003FF8, 0x00002957, 0x000500AA, 0x00000009,\n    0x00004CB6, 0x0000619E, 0x00000A13, 0x000500A6, 0x00000009, 0x00003B23,\n    0x00005376, 0x00004CB6, 0x000300F7, 0x00002C98, 0x00000000, 0x000400FA,\n    0x00003B23, 0x00002B38, 0x00002C98, 0x000200F8, 0x00002B38, 0x000500C4,\n    0x00000017, 0x00005E17, 0x00005879, 0x000002ED, 0x000500C2, 0x00000017,\n    0x00003BE7, 0x00005879, 0x000002ED, 0x000500C5, 0x00000017, 0x000029E8,\n    0x00005E17, 0x00003BE7, 0x000200F9, 0x00002C98, 0x000200F8, 0x00002C98,\n    0x000700F5, 0x00000017, 0x00004D37, 0x00005879, 0x00003463, 0x000029E8,\n    0x00002B38, 0x00060041, 0x00000294, 0x000060F9, 0x0000140E, 0x00000A0B,\n    0x00002CE6, 0x0003003E, 0x000060F9, 0x00004D37, 0x00050080, 0x0000000B,\n    0x00005679, 0x00001F01, 0x00000A3A, 0x00050080, 0x0000000B, 0x00003179,\n    0x00005D71, 0x00000A3A, 0x000500C2, 0x0000000B, 0x00002CE7, 0x00005679,\n    0x00000A17, 0x000500C2, 0x0000000B, 0x000056F3, 0x00003179, 0x00000A17,\n    0x00060041, 0x00000294, 0x00002A45, 0x0000107A, 0x00000A0B, 0x000056F3,\n    0x0004003D, 0x00000017, 0x00003910, 0x00002A45, 0x000300F7, 0x00003A1A,\n    0x00000000, 0x000400FA, 0x00005686, 0x00002958, 0x00003A1A, 0x000200F8,\n    0x00002958, 0x000500C7, 0x00000017, 0x00004760, 0x00003910, 0x000009CE,\n    0x000500C4, 0x00000017, 0x000024D2, 0x00004760, 0x0000013D, 0x000500C7,\n    0x00000017, 0x000050AD, 0x00003910, 0x0000072E, 0x000500C2, 0x00000017,\n    0x0000448E, 0x000050AD, 0x0000013D, 0x000500C5, 0x00000017, 0x00003FF9,\n    0x000024D2, 0x0000448E, 0x000200F9, 0x00003A1A, 0x000200F8, 0x00003A1A,\n    0x000700F5, 0x00000017, 0x00002AAC, 0x00003910, 0x00002C98, 0x00003FF9,\n    0x00002958, 0x000300F7, 0x00002C99, 0x00000000, 0x000400FA, 0x00003B23,\n    0x00002B39, 0x00002C99, 0x000200F8, 0x00002B39, 0x000500C4, 0x00000017,\n    0x00005E18, 0x00002AAC, 0x000002ED, 0x000500C2, 0x00000017, 0x00003BE8,\n    0x00002AAC, 0x000002ED, 0x000500C5, 0x00000017, 0x000029E9, 0x00005E18,\n    0x00003BE8, 0x000200F9, 0x00002C99, 0x000200F8, 0x00002C99, 0x000700F5,\n    0x00000017, 0x00004D38, 0x00002AAC, 0x00003A1A, 0x000029E9, 0x00002B39,\n    0x00060041, 0x00000294, 0x00001F75, 0x0000140E, 0x00000A0B, 0x00002CE7,\n    0x0003003E, 0x00001F75, 0x00004D38, 0x000200F9, 0x00004C7A, 0x000200F8,\n    0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_16bpb_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25155\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v4uint = OpTypeVector %uint 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v2uint = OpTypeVector %uint 2\n     %v3uint = OpTypeVector %uint 3\n     %uint_1 = OpConstant %uint 1\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n     %uint_0 = OpConstant %uint 0\n      %int_3 = OpConstant %int 3\n     %uint_2 = OpConstant %uint 2\n      %int_2 = OpConstant %int 2\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n     %uint_3 = OpConstant %uint 3\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n     %uint_4 = OpConstant %uint 4\n       %2612 = OpConstantComposite %v3uint %uint_4 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n    %uint_16 = OpConstant %uint 16\n    %uint_32 = OpConstant %uint 32\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n    %uint_64 = OpConstant %uint 64\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24540 = OpBitwiseAnd %uint %13606 %uint_1\n      %17270 = OpINotEqual %bool %24540 %uint_0\n      %12328 = OpBitwiseAnd %uint %13606 %uint_2\n      %17284 = OpINotEqual %bool %12328 %uint_0\n       %7856 = OpShiftRightLogical %uint %13606 %uint_2\n      %25058 = OpBitwiseAnd %uint %7856 %uint_3\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2612\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %6586 DontFlatten\n               OpBranchConditional %24679 %21992 %6586\n      %21992 = OpLabel\n               OpBranch %19578\n       %6586 = OpLabel\n      %23478 = OpBitcast %v3int %21387\n      %18710 = OpCompositeExtract %uint %22410 1\n      %23531 = OpCompositeExtract %int %23478 0\n      %22810 = OpIMul %int %23531 %int_2\n       %6362 = OpCompositeExtract %int %23478 2\n      %14505 = OpBitcast %int %18710\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %23478 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %6594\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %22810 %24535\n      %10404 = OpBitcast %uint %8258\n      %14582 = OpIAdd %uint %22411 %10404\n      %12308 = OpLogicalNot %bool %17270\n               OpSelectionMerge %19040 DontFlatten\n               OpBranchConditional %12308 %9741 %17007\n       %9741 = OpLabel\n      %17463 = OpCompositeExtract %uint %21387 0\n      %11246 = OpCompositeExtract %uint %21387 1\n      %18801 = OpCompositeExtract %uint %21387 2\n      %14831 = OpIMul %uint %22409 %18801\n      %20322 = OpIAdd %uint %11246 %14831\n      %21676 = OpIMul %uint %22408 %20322\n      %20398 = OpIAdd %uint %17463 %21676\n      %11367 = OpShiftLeftLogical %uint %20398 %uint_1\n               OpBranch %19040\n      %17007 = OpLabel\n               OpSelectionMerge %23536 DontFlatten\n               OpBranchConditional %17284 %11410 %24353\n      %11410 = OpLabel\n      %21364 = OpShiftRightLogical %uint %22408 %int_5\n      %13804 = OpShiftRightLogical %uint %22409 %int_4\n      %13237 = OpShiftRightArithmetic %int %6362 %int_2\n      %22374 = OpBitcast %int %13804\n      %25085 = OpIMul %int %13237 %22374\n      %11618 = OpShiftRightArithmetic %int %17598 %int_4\n      %16670 = OpIAdd %int %25085 %11618\n      %19064 = OpBitcast %int %21364\n      %13020 = OpIMul %int %16670 %19064\n      %12986 = OpShiftRightArithmetic %int %23531 %int_5\n      %24558 = OpIAdd %int %13020 %12986\n       %8797 = OpShiftLeftLogical %int %24558 %int_7\n      %11434 = OpBitwiseAnd %int %6362 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %17598 %int_1\n      %21365 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21365 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %23531 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17334 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17334 %uint_1\n      %13015 = OpShiftRightArithmetic %int %17598 %int_3\n       %9929 = OpBitwiseXor %int %13015 %13237\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %23531 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %17598 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6551\n       %7168 = OpShiftLeftLogical %int %16793 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24144 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24144 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24144 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24144 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %23536\n      %24353 = OpLabel\n      %23000 = OpBitcast %v2int %17136\n      %22120 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %23000 1\n      %12089 = OpShiftRightArithmetic %int %14597 %int_5\n      %22400 = OpBitcast %int %22120\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %23000 0\n      %20423 = OpShiftRightArithmetic %int %25154 %int_5\n      %18864 = OpIAdd %int %7938 %20423\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25154 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17335 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17335 %uint_1\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25154 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6552\n       %7169 = OpShiftLeftLogical %int %21575 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24163 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24163 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24163 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %23536\n      %23536 = OpLabel\n      %10540 = OpPhi %uint %16869 %11410 %16870 %24353\n               OpBranch %19040\n      %19040 = OpLabel\n      %11376 = OpPhi %uint %11367 %9741 %10540 %23536\n      %18621 = OpIAdd %uint %11376 %24236\n      %15698 = OpShiftRightLogical %uint %18621 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15698\n       %8801 = OpLoad %v4uint %20399\n      %21106 = OpIEqual %bool %25058 %uint_1\n               OpSelectionMerge %13867 None\n               OpBranchConditional %21106 %10583 %13867\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %8801 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %8801 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13867\n      %13867 = OpLabel\n      %16578 = OpPhi %v4uint %8801 %19040 %16376 %10583\n       %8603 = OpShiftRightLogical %uint %14582 %int_4\n      %14005 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %8603\n               OpStore %14005 %16578\n      %21685 = OpIAdd %uint %14582 %uint_16\n               OpSelectionMerge %24688 DontFlatten\n               OpBranchConditional %17270 %21993 %7205\n      %21993 = OpLabel\n               OpBranch %24688\n       %7205 = OpLabel\n               OpBranch %24688\n      %24688 = OpLabel\n      %11377 = OpPhi %uint %uint_64 %21993 %uint_16 %7205\n      %18622 = OpIAdd %uint %18621 %11377\n      %15699 = OpShiftRightLogical %uint %18622 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15699\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %13868 None\n               OpBranchConditional %21106 %10584 %13868\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %13868\n      %13868 = OpLabel\n      %16579 = OpPhi %v4uint %14608 %24688 %16377 %10584\n       %8604 = OpShiftRightLogical %uint %21685 %int_4\n      %16304 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %8604\n               OpStore %16304 %16579\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_16bpb_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006243, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000017, 0x0000000B, 0x00000004, 0x00040015, 0x0000000C,\n    0x00000020, 0x00000001, 0x00040017, 0x00000012, 0x0000000C, 0x00000002,\n    0x00040017, 0x00000016, 0x0000000C, 0x00000003, 0x00020014, 0x00000009,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001,\n    0x0004002B, 0x0000000B, 0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B,\n    0x00000A22, 0x00000008, 0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00,\n    0x0004002B, 0x0000000C, 0x00000A17, 0x00000004, 0x0004002B, 0x0000000C,\n    0x00000A1D, 0x00000006, 0x0004002B, 0x0000000C, 0x00000A2C, 0x0000000B,\n    0x0004002B, 0x0000000C, 0x00000A38, 0x0000000F, 0x0004002B, 0x0000000C,\n    0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C, 0x00000A1A, 0x00000005,\n    0x0004002B, 0x0000000C, 0x00000A20, 0x00000007, 0x0004002B, 0x0000000C,\n    0x00000A23, 0x00000008, 0x0004002B, 0x0000000C, 0x00000A2F, 0x0000000C,\n    0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000, 0x0004002B, 0x0000000C,\n    0x00000A14, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A10, 0x00000002,\n    0x0004002B, 0x0000000C, 0x00000A11, 0x00000002, 0x0004002B, 0x0000000C,\n    0x00000A0B, 0x00000000, 0x000A001E, 0x00000489, 0x0000000B, 0x0000000B,\n    0x0000000B, 0x0000000B, 0x00000014, 0x0000000B, 0x0000000B, 0x0000000B,\n    0x00040020, 0x00000706, 0x00000009, 0x00000489, 0x0004003B, 0x00000706,\n    0x00000CE9, 0x00000009, 0x00040020, 0x00000288, 0x00000009, 0x0000000B,\n    0x0004002B, 0x0000000B, 0x00000A13, 0x00000003, 0x00040020, 0x00000291,\n    0x00000009, 0x00000014, 0x00040020, 0x00000292, 0x00000001, 0x00000014,\n    0x0004003B, 0x00000292, 0x00000F48, 0x00000001, 0x0004002B, 0x0000000B,\n    0x00000A16, 0x00000004, 0x0006002C, 0x00000014, 0x00000A34, 0x00000A16,\n    0x00000A0A, 0x00000A0A, 0x00040017, 0x0000000F, 0x00000009, 0x00000002,\n    0x0003001D, 0x000007DC, 0x00000017, 0x0003001E, 0x000007B4, 0x000007DC,\n    0x00040020, 0x00000A31, 0x00000002, 0x000007B4, 0x0004003B, 0x00000A31,\n    0x0000107A, 0x00000002, 0x00040020, 0x00000294, 0x00000002, 0x00000017,\n    0x0003001D, 0x000007DD, 0x00000017, 0x0003001E, 0x000007B5, 0x000007DD,\n    0x00040020, 0x00000A32, 0x00000002, 0x000007B5, 0x0004003B, 0x00000A32,\n    0x0000140E, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A3A, 0x00000010,\n    0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020, 0x0006002C, 0x00000014,\n    0x00000BC3, 0x00000A16, 0x00000A6A, 0x00000A0D, 0x0007002C, 0x00000017,\n    0x000009CE, 0x000008A6, 0x000008A6, 0x000008A6, 0x000008A6, 0x0007002C,\n    0x00000017, 0x0000013D, 0x00000A22, 0x00000A22, 0x00000A22, 0x00000A22,\n    0x0007002C, 0x00000017, 0x0000072E, 0x000005FD, 0x000005FD, 0x000005FD,\n    0x000005FD, 0x0004002B, 0x0000000B, 0x00000ACA, 0x00000040, 0x00050036,\n    0x00000008, 0x0000161F, 0x00000000, 0x00000502, 0x000200F8, 0x00003B06,\n    0x000300F7, 0x00004C7A, 0x00000000, 0x000300FB, 0x00000A0A, 0x00002E68,\n    0x000200F8, 0x00002E68, 0x00050041, 0x00000288, 0x000060D7, 0x00000CE9,\n    0x00000A0B, 0x0004003D, 0x0000000B, 0x00003526, 0x000060D7, 0x000500C7,\n    0x0000000B, 0x00005FDC, 0x00003526, 0x00000A0D, 0x000500AB, 0x00000009,\n    0x00004376, 0x00005FDC, 0x00000A0A, 0x000500C7, 0x0000000B, 0x00003028,\n    0x00003526, 0x00000A10, 0x000500AB, 0x00000009, 0x00004384, 0x00003028,\n    0x00000A0A, 0x000500C2, 0x0000000B, 0x00001EB0, 0x00003526, 0x00000A10,\n    0x000500C7, 0x0000000B, 0x000061E2, 0x00001EB0, 0x00000A13, 0x00050041,\n    0x00000288, 0x0000492C, 0x00000CE9, 0x00000A0E, 0x0004003D, 0x0000000B,\n    0x00005EAC, 0x0000492C, 0x00050041, 0x00000288, 0x00004EBA, 0x00000CE9,\n    0x00000A11, 0x0004003D, 0x0000000B, 0x00005788, 0x00004EBA, 0x00050041,\n    0x00000288, 0x00004EBB, 0x00000CE9, 0x00000A14, 0x0004003D, 0x0000000B,\n    0x00005789, 0x00004EBB, 0x00050041, 0x00000291, 0x00004EBC, 0x00000CE9,\n    0x00000A17, 0x0004003D, 0x00000014, 0x0000578A, 0x00004EBC, 0x00050041,\n    0x00000288, 0x00004EBD, 0x00000CE9, 0x00000A1A, 0x0004003D, 0x0000000B,\n    0x0000578B, 0x00004EBD, 0x00050041, 0x00000288, 0x00004E6E, 0x00000CE9,\n    0x00000A1D, 0x0004003D, 0x0000000B, 0x000019C2, 0x00004E6E, 0x0004003D,\n    0x00000014, 0x00002A0E, 0x00000F48, 0x000500C4, 0x00000014, 0x0000538B,\n    0x00002A0E, 0x00000A34, 0x0007004F, 0x00000011, 0x000042F0, 0x0000538B,\n    0x0000538B, 0x00000000, 0x00000001, 0x0007004F, 0x00000011, 0x0000242F,\n    0x0000578A, 0x0000578A, 0x00000000, 0x00000001, 0x000500AE, 0x0000000F,\n    0x00004288, 0x000042F0, 0x0000242F, 0x0004009A, 0x00000009, 0x00006067,\n    0x00004288, 0x000300F7, 0x000019BA, 0x00000002, 0x000400FA, 0x00006067,\n    0x000055E8, 0x000019BA, 0x000200F8, 0x000055E8, 0x000200F9, 0x00004C7A,\n    0x000200F8, 0x000019BA, 0x0004007C, 0x00000016, 0x00005BB6, 0x0000538B,\n    0x00050051, 0x0000000B, 0x00004916, 0x0000578A, 0x00000001, 0x00050051,\n    0x0000000C, 0x00005BEB, 0x00005BB6, 0x00000000, 0x00050084, 0x0000000C,\n    0x0000591A, 0x00005BEB, 0x00000A11, 0x00050051, 0x0000000C, 0x000018DA,\n    0x00005BB6, 0x00000002, 0x0004007C, 0x0000000C, 0x000038A9, 0x00004916,\n    0x00050084, 0x0000000C, 0x00002C0F, 0x000018DA, 0x000038A9, 0x00050051,\n    0x0000000C, 0x000044BE, 0x00005BB6, 0x00000001, 0x00050080, 0x0000000C,\n    0x000056D4, 0x00002C0F, 0x000044BE, 0x0004007C, 0x0000000C, 0x00005785,\n    0x000019C2, 0x00050084, 0x0000000C, 0x00005FD7, 0x000056D4, 0x00005785,\n    0x00050080, 0x0000000C, 0x00002042, 0x0000591A, 0x00005FD7, 0x0004007C,\n    0x0000000B, 0x000028A4, 0x00002042, 0x00050080, 0x0000000B, 0x000038F6,\n    0x0000578B, 0x000028A4, 0x000400A8, 0x00000009, 0x00003014, 0x00004376,\n    0x000300F7, 0x00004A60, 0x00000002, 0x000400FA, 0x00003014, 0x0000260D,\n    0x0000426F, 0x000200F8, 0x0000260D, 0x00050051, 0x0000000B, 0x00004437,\n    0x0000538B, 0x00000000, 0x00050051, 0x0000000B, 0x00002BEE, 0x0000538B,\n    0x00000001, 0x00050051, 0x0000000B, 0x00004971, 0x0000538B, 0x00000002,\n    0x00050084, 0x0000000B, 0x000039EF, 0x00005789, 0x00004971, 0x00050080,\n    0x0000000B, 0x00004F62, 0x00002BEE, 0x000039EF, 0x00050084, 0x0000000B,\n    0x000054AC, 0x00005788, 0x00004F62, 0x00050080, 0x0000000B, 0x00004FAE,\n    0x00004437, 0x000054AC, 0x000500C4, 0x0000000B, 0x00002C67, 0x00004FAE,\n    0x00000A0D, 0x000200F9, 0x00004A60, 0x000200F8, 0x0000426F, 0x000300F7,\n    0x00005BF0, 0x00000002, 0x000400FA, 0x00004384, 0x00002C92, 0x00005F21,\n    0x000200F8, 0x00002C92, 0x000500C2, 0x0000000B, 0x00005374, 0x00005788,\n    0x00000A1A, 0x000500C2, 0x0000000B, 0x000035EC, 0x00005789, 0x00000A17,\n    0x000500C3, 0x0000000C, 0x000033B5, 0x000018DA, 0x00000A11, 0x0004007C,\n    0x0000000C, 0x00005766, 0x000035EC, 0x00050084, 0x0000000C, 0x000061FD,\n    0x000033B5, 0x00005766, 0x000500C3, 0x0000000C, 0x00002D62, 0x000044BE,\n    0x00000A17, 0x00050080, 0x0000000C, 0x0000411E, 0x000061FD, 0x00002D62,\n    0x0004007C, 0x0000000C, 0x00004A78, 0x00005374, 0x00050084, 0x0000000C,\n    0x000032DC, 0x0000411E, 0x00004A78, 0x000500C3, 0x0000000C, 0x000032BA,\n    0x00005BEB, 0x00000A1A, 0x00050080, 0x0000000C, 0x00005FEE, 0x000032DC,\n    0x000032BA, 0x000500C4, 0x0000000C, 0x0000225D, 0x00005FEE, 0x00000A20,\n    0x000500C7, 0x0000000C, 0x00002CAA, 0x000018DA, 0x00000A14, 0x000500C4,\n    0x0000000C, 0x00004CAE, 0x00002CAA, 0x00000A1A, 0x000500C3, 0x0000000C,\n    0x0000383E, 0x000044BE, 0x00000A0E, 0x000500C7, 0x0000000C, 0x00005375,\n    0x0000383E, 0x00000A14, 0x000500C4, 0x0000000C, 0x000054CA, 0x00005375,\n    0x00000A14, 0x000500C5, 0x0000000C, 0x000042CE, 0x00004CAE, 0x000054CA,\n    0x000500C7, 0x0000000C, 0x000050D5, 0x00005BEB, 0x00000A20, 0x000500C5,\n    0x0000000C, 0x00003ADD, 0x000042CE, 0x000050D5, 0x000500C5, 0x0000000C,\n    0x000043B6, 0x0000225D, 0x00003ADD, 0x000500C4, 0x0000000C, 0x00005E50,\n    0x000043B6, 0x00000A0D, 0x000500C3, 0x0000000C, 0x000032D7, 0x000044BE,\n    0x00000A14, 0x000500C6, 0x0000000C, 0x000026C9, 0x000032D7, 0x000033B5,\n    0x000500C7, 0x0000000C, 0x00004199, 0x000026C9, 0x00000A0E, 0x000500C3,\n    0x0000000C, 0x00002590, 0x00005BEB, 0x00000A14, 0x000500C7, 0x0000000C,\n    0x0000505E, 0x00002590, 0x00000A14, 0x000500C4, 0x0000000C, 0x0000541D,\n    0x00004199, 0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BA, 0x0000505E,\n    0x0000541D, 0x000500C7, 0x0000000C, 0x00005076, 0x000044BE, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x00005228, 0x00005076, 0x00000A17, 0x000500C4,\n    0x0000000C, 0x00001997, 0x000022BA, 0x00000A1D, 0x000500C5, 0x0000000C,\n    0x000047FE, 0x00005228, 0x00001997, 0x000500C4, 0x0000000C, 0x00001C00,\n    0x00004199, 0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C81, 0x000047FE,\n    0x00001C00, 0x000500C7, 0x0000000C, 0x000050AF, 0x00005E50, 0x00000A38,\n    0x000500C5, 0x0000000C, 0x00003C70, 0x00003C81, 0x000050AF, 0x000500C3,\n    0x0000000C, 0x00003745, 0x00005E50, 0x00000A17, 0x000500C7, 0x0000000C,\n    0x000018B8, 0x00003745, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000547E,\n    0x000018B8, 0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A8, 0x00003C70,\n    0x0000547E, 0x000500C3, 0x0000000C, 0x00003A6E, 0x00005E50, 0x00000A1A,\n    0x000500C7, 0x0000000C, 0x000018B9, 0x00003A6E, 0x00000A20, 0x000500C4,\n    0x0000000C, 0x0000547F, 0x000018B9, 0x00000A23, 0x000500C5, 0x0000000C,\n    0x0000456F, 0x000045A8, 0x0000547F, 0x000500C3, 0x0000000C, 0x00003C88,\n    0x00005E50, 0x00000A23, 0x000500C4, 0x0000000C, 0x00002824, 0x00003C88,\n    0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B79, 0x0000456F, 0x00002824,\n    0x0004007C, 0x0000000B, 0x000041E5, 0x00003B79, 0x000200F9, 0x00005BF0,\n    0x000200F8, 0x00005F21, 0x0004007C, 0x00000012, 0x000059D8, 0x000042F0,\n    0x000500C2, 0x0000000B, 0x00005668, 0x00005788, 0x00000A1A, 0x00050051,\n    0x0000000C, 0x00003905, 0x000059D8, 0x00000001, 0x000500C3, 0x0000000C,\n    0x00002F39, 0x00003905, 0x00000A1A, 0x0004007C, 0x0000000C, 0x00005780,\n    0x00005668, 0x00050084, 0x0000000C, 0x00001F02, 0x00002F39, 0x00005780,\n    0x00050051, 0x0000000C, 0x00006242, 0x000059D8, 0x00000000, 0x000500C3,\n    0x0000000C, 0x00004FC7, 0x00006242, 0x00000A1A, 0x00050080, 0x0000000C,\n    0x000049B0, 0x00001F02, 0x00004FC7, 0x000500C4, 0x0000000C, 0x0000254A,\n    0x000049B0, 0x00000A1D, 0x000500C3, 0x0000000C, 0x0000603B, 0x00003905,\n    0x00000A0E, 0x000500C7, 0x0000000C, 0x0000539A, 0x0000603B, 0x00000A20,\n    0x000500C4, 0x0000000C, 0x0000534A, 0x0000539A, 0x00000A14, 0x000500C7,\n    0x0000000C, 0x00004EA5, 0x00006242, 0x00000A20, 0x000500C5, 0x0000000C,\n    0x00002B1A, 0x0000534A, 0x00004EA5, 0x000500C5, 0x0000000C, 0x000043B7,\n    0x0000254A, 0x00002B1A, 0x000500C4, 0x0000000C, 0x00005E63, 0x000043B7,\n    0x00000A0D, 0x000500C3, 0x0000000C, 0x000031DE, 0x00003905, 0x00000A17,\n    0x000500C7, 0x0000000C, 0x00005447, 0x000031DE, 0x00000A0E, 0x000500C3,\n    0x0000000C, 0x000028A6, 0x00006242, 0x00000A14, 0x000500C7, 0x0000000C,\n    0x0000511E, 0x000028A6, 0x00000A14, 0x000500C3, 0x0000000C, 0x000028B9,\n    0x00003905, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000505F, 0x000028B9,\n    0x00000A0E, 0x000500C4, 0x0000000C, 0x0000541E, 0x0000505F, 0x00000A0E,\n    0x000500C6, 0x0000000C, 0x000022BB, 0x0000511E, 0x0000541E, 0x000500C7,\n    0x0000000C, 0x00005077, 0x00003905, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x00005229, 0x00005077, 0x00000A17, 0x000500C4, 0x0000000C, 0x00001998,\n    0x000022BB, 0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FF, 0x00005229,\n    0x00001998, 0x000500C4, 0x0000000C, 0x00001C01, 0x00005447, 0x00000A2C,\n    0x000500C5, 0x0000000C, 0x00003C82, 0x000047FF, 0x00001C01, 0x000500C7,\n    0x0000000C, 0x000050B0, 0x00005E63, 0x00000A38, 0x000500C5, 0x0000000C,\n    0x00003C71, 0x00003C82, 0x000050B0, 0x000500C3, 0x0000000C, 0x00003746,\n    0x00005E63, 0x00000A17, 0x000500C7, 0x0000000C, 0x000018BA, 0x00003746,\n    0x00000A0E, 0x000500C4, 0x0000000C, 0x00005480, 0x000018BA, 0x00000A1A,\n    0x000500C5, 0x0000000C, 0x000045A9, 0x00003C71, 0x00005480, 0x000500C3,\n    0x0000000C, 0x00003A6F, 0x00005E63, 0x00000A1A, 0x000500C7, 0x0000000C,\n    0x000018BB, 0x00003A6F, 0x00000A20, 0x000500C4, 0x0000000C, 0x00005481,\n    0x000018BB, 0x00000A23, 0x000500C5, 0x0000000C, 0x00004570, 0x000045A9,\n    0x00005481, 0x000500C3, 0x0000000C, 0x00003C89, 0x00005E63, 0x00000A23,\n    0x000500C4, 0x0000000C, 0x00002825, 0x00003C89, 0x00000A2F, 0x000500C5,\n    0x0000000C, 0x00003B7A, 0x00004570, 0x00002825, 0x0004007C, 0x0000000B,\n    0x000041E6, 0x00003B7A, 0x000200F9, 0x00005BF0, 0x000200F8, 0x00005BF0,\n    0x000700F5, 0x0000000B, 0x0000292C, 0x000041E5, 0x00002C92, 0x000041E6,\n    0x00005F21, 0x000200F9, 0x00004A60, 0x000200F8, 0x00004A60, 0x000700F5,\n    0x0000000B, 0x00002C70, 0x00002C67, 0x0000260D, 0x0000292C, 0x00005BF0,\n    0x00050080, 0x0000000B, 0x000048BD, 0x00002C70, 0x00005EAC, 0x000500C2,\n    0x0000000B, 0x00003D52, 0x000048BD, 0x00000A17, 0x00060041, 0x00000294,\n    0x00004FAF, 0x0000107A, 0x00000A0B, 0x00003D52, 0x0004003D, 0x00000017,\n    0x00002261, 0x00004FAF, 0x000500AA, 0x00000009, 0x00005272, 0x000061E2,\n    0x00000A0D, 0x000300F7, 0x0000362B, 0x00000000, 0x000400FA, 0x00005272,\n    0x00002957, 0x0000362B, 0x000200F8, 0x00002957, 0x000500C7, 0x00000017,\n    0x0000475F, 0x00002261, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D1,\n    0x0000475F, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AC, 0x00002261,\n    0x0000072E, 0x000500C2, 0x00000017, 0x0000448D, 0x000050AC, 0x0000013D,\n    0x000500C5, 0x00000017, 0x00003FF8, 0x000024D1, 0x0000448D, 0x000200F9,\n    0x0000362B, 0x000200F8, 0x0000362B, 0x000700F5, 0x00000017, 0x000040C2,\n    0x00002261, 0x00004A60, 0x00003FF8, 0x00002957, 0x000500C2, 0x0000000B,\n    0x0000219B, 0x000038F6, 0x00000A17, 0x00060041, 0x00000294, 0x000036B5,\n    0x0000140E, 0x00000A0B, 0x0000219B, 0x0003003E, 0x000036B5, 0x000040C2,\n    0x00050080, 0x0000000B, 0x000054B5, 0x000038F6, 0x00000A3A, 0x000300F7,\n    0x00006070, 0x00000002, 0x000400FA, 0x00004376, 0x000055E9, 0x00001C25,\n    0x000200F8, 0x000055E9, 0x000200F9, 0x00006070, 0x000200F8, 0x00001C25,\n    0x000200F9, 0x00006070, 0x000200F8, 0x00006070, 0x000700F5, 0x0000000B,\n    0x00002C71, 0x00000ACA, 0x000055E9, 0x00000A3A, 0x00001C25, 0x00050080,\n    0x0000000B, 0x000048BE, 0x000048BD, 0x00002C71, 0x000500C2, 0x0000000B,\n    0x00003D53, 0x000048BE, 0x00000A17, 0x00060041, 0x00000294, 0x00005566,\n    0x0000107A, 0x00000A0B, 0x00003D53, 0x0004003D, 0x00000017, 0x00003910,\n    0x00005566, 0x000300F7, 0x0000362C, 0x00000000, 0x000400FA, 0x00005272,\n    0x00002958, 0x0000362C, 0x000200F8, 0x00002958, 0x000500C7, 0x00000017,\n    0x00004760, 0x00003910, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D2,\n    0x00004760, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AD, 0x00003910,\n    0x0000072E, 0x000500C2, 0x00000017, 0x0000448E, 0x000050AD, 0x0000013D,\n    0x000500C5, 0x00000017, 0x00003FF9, 0x000024D2, 0x0000448E, 0x000200F9,\n    0x0000362C, 0x000200F8, 0x0000362C, 0x000700F5, 0x00000017, 0x000040C3,\n    0x00003910, 0x00006070, 0x00003FF9, 0x00002958, 0x000500C2, 0x0000000B,\n    0x0000219C, 0x000054B5, 0x00000A17, 0x00060041, 0x00000294, 0x00003FB0,\n    0x0000140E, 0x00000A0B, 0x0000219C, 0x0003003E, 0x00003FB0, 0x000040C3,\n    0x000200F9, 0x00004C7A, 0x000200F8, 0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_16bpb_scaled_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25157\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n     %v4uint = OpTypeVector %uint 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v3uint = OpTypeVector %uint 3\n     %uint_1 = OpConstant %uint 1\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n     %uint_0 = OpConstant %uint 0\n      %int_3 = OpConstant %int 3\n     %uint_2 = OpConstant %uint 2\n      %int_2 = OpConstant %int 2\n     %uint_3 = OpConstant %uint 3\n     %uint_5 = OpConstant %uint 5\n     %uint_4 = OpConstant %uint 4\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n     %uint_7 = OpConstant %uint 7\n       %1927 = OpConstantComposite %v2uint %uint_4 %uint_7\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %2612 = OpConstantComposite %v3uint %uint_4 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n    %uint_16 = OpConstant %uint 16\n    %uint_32 = OpConstant %uint 32\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %1954 = OpConstantComposite %v2uint %uint_7 %uint_7\n       %1867 = OpConstantComposite %v2uint %uint_4 %uint_2\n    %uint_15 = OpConstant %uint 15\n       %1978 = OpConstantComposite %v2uint %uint_15 %uint_3\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24445 = OpBitwiseAnd %uint %13606 %uint_2\n      %18667 = OpINotEqual %bool %24445 %uint_0\n       %8141 = OpShiftRightLogical %uint %13606 %uint_2\n      %24990 = OpBitwiseAnd %uint %8141 %uint_3\n       %8871 = OpCompositeConstruct %v2uint %13606 %13606\n       %7087 = OpShiftRightLogical %v2uint %8871 %1927\n       %6551 = OpBitwiseAnd %v2uint %7087 %1954\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2612\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %6586 DontFlatten\n               OpBranchConditional %24679 %21992 %6586\n      %21992 = OpLabel\n               OpBranch %19578\n       %6586 = OpLabel\n      %23478 = OpBitcast %v3int %21387\n      %18710 = OpCompositeExtract %uint %22410 1\n      %23531 = OpCompositeExtract %int %23478 0\n      %22810 = OpIMul %int %23531 %int_2\n       %6362 = OpCompositeExtract %int %23478 2\n      %14505 = OpBitcast %int %18710\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %23478 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %6594\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %22810 %24535\n      %10898 = OpBitcast %uint %8258\n       %7937 = OpIAdd %uint %22411 %10898\n      %19921 = OpShiftRightLogical %v2uint %17136 %1867\n       %7712 = OpUDiv %v2uint %19921 %6551\n      %18183 = OpIMul %v2uint %6551 %7712\n      %18273 = OpISub %v2uint %19921 %18183\n      %11232 = OpShiftLeftLogical %v2uint %7712 %1867\n      %13284 = OpCompositeExtract %uint %18273 0\n      %10872 = OpCompositeExtract %uint %6551 1\n      %22886 = OpIMul %uint %13284 %10872\n       %6943 = OpCompositeExtract %uint %18273 1\n      %10469 = OpIAdd %uint %22886 %6943\n      %18851 = OpBitwiseAnd %v2uint %17136 %1978\n      %10581 = OpShiftLeftLogical %uint %10469 %uint_7\n      %20916 = OpCompositeExtract %uint %18851 1\n      %23596 = OpShiftLeftLogical %uint %20916 %uint_5\n      %19814 = OpBitwiseOr %uint %10581 %23596\n      %21476 = OpCompositeExtract %uint %18851 0\n       %8560 = OpShiftLeftLogical %uint %21476 %uint_1\n      %17648 = OpBitwiseOr %uint %19814 %8560\n      %19923 = OpCompositeExtract %uint %11232 0\n      %15556 = OpCompositeInsert %v3uint %19923 %21387 0\n      %23006 = OpCompositeExtract %uint %11232 1\n       %9680 = OpCompositeInsert %v3uint %23006 %15556 1\n               OpSelectionMerge %20344 DontFlatten\n               OpBranchConditional %18667 %23520 %11737\n      %23520 = OpLabel\n      %10111 = OpBitcast %v3int %9680\n      %19476 = OpShiftRightLogical %uint %22408 %int_5\n      %18810 = OpShiftRightLogical %uint %22409 %int_4\n       %6782 = OpCompositeExtract %int %10111 2\n      %12089 = OpShiftRightArithmetic %int %6782 %int_2\n      %22400 = OpBitcast %int %18810\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %10111 1\n      %19055 = OpShiftRightArithmetic %int %25154 %int_4\n      %11052 = OpIAdd %int %7938 %19055\n      %16898 = OpBitcast %int %19476\n      %14944 = OpIMul %int %11052 %16898\n      %25155 = OpCompositeExtract %int %10111 0\n      %20423 = OpShiftRightArithmetic %int %25155 %int_5\n      %18940 = OpIAdd %int %14944 %20423\n       %8797 = OpShiftLeftLogical %int %18940 %int_7\n      %11434 = OpBitwiseAnd %int %6782 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %25154 %int_1\n      %21364 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21364 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %25155 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17334 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17334 %uint_1\n      %13015 = OpShiftRightArithmetic %int %25154 %int_3\n       %9929 = OpBitwiseXor %int %13015 %12089\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %25155 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %25154 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6552 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6552\n       %7168 = OpShiftLeftLogical %int %16793 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24144 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24144 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24144 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24144 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %20344\n      %11737 = OpLabel\n      %11908 = OpVectorShuffle %v2uint %9680 %9680 0 1\n      %20347 = OpBitcast %v2int %11908\n      %11433 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %20347 1\n      %12090 = OpShiftRightArithmetic %int %14597 %int_5\n      %22401 = OpBitcast %int %11433\n       %7939 = OpIMul %int %12090 %22401\n      %25156 = OpCompositeExtract %int %20347 0\n      %20424 = OpShiftRightArithmetic %int %25156 %int_5\n      %18864 = OpIAdd %int %7939 %20424\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25156 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17335 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17335 %uint_1\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25156 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6553 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6553\n       %7169 = OpShiftLeftLogical %int %21575 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24163 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24163 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24163 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %20344\n      %20344 = OpLabel\n      %18329 = OpPhi %uint %16869 %23520 %16870 %11737\n      %15200 = OpCompositeExtract %uint %6551 0\n      %17489 = OpIMul %uint %15200 %10872\n       %7313 = OpIMul %uint %18329 %17489\n       %8815 = OpIAdd %uint %7313 %17648\n      %21470 = OpIAdd %uint %8815 %24236\n      %14664 = OpShiftRightLogical %uint %21470 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %14664\n       %8801 = OpLoad %v4uint %20399\n      %21106 = OpIEqual %bool %24990 %uint_1\n               OpSelectionMerge %13867 None\n               OpBranchConditional %21106 %10583 %13867\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %8801 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %8801 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13867\n      %13867 = OpLabel\n      %16578 = OpPhi %v4uint %8801 %20344 %16376 %10583\n       %8603 = OpShiftRightLogical %uint %7937 %int_4\n      %14005 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %8603\n               OpStore %14005 %16578\n      %22137 = OpIAdd %uint %7937 %uint_16\n      %10214 = OpIAdd %uint %21470 %uint_16\n      %14665 = OpShiftRightLogical %uint %10214 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %14665\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %13868 None\n               OpBranchConditional %21106 %10584 %13868\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %13868\n      %13868 = OpLabel\n      %16579 = OpPhi %v4uint %14608 %13867 %16377 %10584\n       %8604 = OpShiftRightLogical %uint %22137 %int_4\n      %16304 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %8604\n               OpStore %16304 %16579\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_16bpb_scaled_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006245, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000017,\n    0x0000000B, 0x00000004, 0x00040015, 0x0000000C, 0x00000020, 0x00000001,\n    0x00040017, 0x00000012, 0x0000000C, 0x00000002, 0x00040017, 0x00000016,\n    0x0000000C, 0x00000003, 0x00020014, 0x00000009, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001,\n    0x0004002B, 0x0000000B, 0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B,\n    0x00000A22, 0x00000008, 0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00,\n    0x0004002B, 0x0000000C, 0x00000A17, 0x00000004, 0x0004002B, 0x0000000C,\n    0x00000A1D, 0x00000006, 0x0004002B, 0x0000000C, 0x00000A2C, 0x0000000B,\n    0x0004002B, 0x0000000C, 0x00000A38, 0x0000000F, 0x0004002B, 0x0000000C,\n    0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C, 0x00000A1A, 0x00000005,\n    0x0004002B, 0x0000000C, 0x00000A20, 0x00000007, 0x0004002B, 0x0000000C,\n    0x00000A23, 0x00000008, 0x0004002B, 0x0000000C, 0x00000A2F, 0x0000000C,\n    0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000, 0x0004002B, 0x0000000C,\n    0x00000A14, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A10, 0x00000002,\n    0x0004002B, 0x0000000C, 0x00000A11, 0x00000002, 0x0004002B, 0x0000000B,\n    0x00000A13, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A19, 0x00000005,\n    0x0004002B, 0x0000000B, 0x00000A16, 0x00000004, 0x0004002B, 0x0000000C,\n    0x00000A0B, 0x00000000, 0x000A001E, 0x00000489, 0x0000000B, 0x0000000B,\n    0x0000000B, 0x0000000B, 0x00000014, 0x0000000B, 0x0000000B, 0x0000000B,\n    0x00040020, 0x00000706, 0x00000009, 0x00000489, 0x0004003B, 0x00000706,\n    0x00000CE9, 0x00000009, 0x00040020, 0x00000288, 0x00000009, 0x0000000B,\n    0x0004002B, 0x0000000B, 0x00000A1F, 0x00000007, 0x0005002C, 0x00000011,\n    0x00000787, 0x00000A16, 0x00000A1F, 0x00040020, 0x00000291, 0x00000009,\n    0x00000014, 0x00040020, 0x00000292, 0x00000001, 0x00000014, 0x0004003B,\n    0x00000292, 0x00000F48, 0x00000001, 0x0006002C, 0x00000014, 0x00000A34,\n    0x00000A16, 0x00000A0A, 0x00000A0A, 0x00040017, 0x0000000F, 0x00000009,\n    0x00000002, 0x0003001D, 0x000007DC, 0x00000017, 0x0003001E, 0x000007B4,\n    0x000007DC, 0x00040020, 0x00000A31, 0x00000002, 0x000007B4, 0x0004003B,\n    0x00000A31, 0x0000107A, 0x00000002, 0x00040020, 0x00000294, 0x00000002,\n    0x00000017, 0x0003001D, 0x000007DD, 0x00000017, 0x0003001E, 0x000007B5,\n    0x000007DD, 0x00040020, 0x00000A32, 0x00000002, 0x000007B5, 0x0004003B,\n    0x00000A32, 0x0000140E, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A3A,\n    0x00000010, 0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020, 0x0006002C,\n    0x00000014, 0x00000BC3, 0x00000A16, 0x00000A6A, 0x00000A0D, 0x0005002C,\n    0x00000011, 0x000007A2, 0x00000A1F, 0x00000A1F, 0x0005002C, 0x00000011,\n    0x0000074B, 0x00000A16, 0x00000A10, 0x0004002B, 0x0000000B, 0x00000A37,\n    0x0000000F, 0x0005002C, 0x00000011, 0x000007BA, 0x00000A37, 0x00000A13,\n    0x0007002C, 0x00000017, 0x000009CE, 0x000008A6, 0x000008A6, 0x000008A6,\n    0x000008A6, 0x0007002C, 0x00000017, 0x0000013D, 0x00000A22, 0x00000A22,\n    0x00000A22, 0x00000A22, 0x0007002C, 0x00000017, 0x0000072E, 0x000005FD,\n    0x000005FD, 0x000005FD, 0x000005FD, 0x00050036, 0x00000008, 0x0000161F,\n    0x00000000, 0x00000502, 0x000200F8, 0x00003B06, 0x000300F7, 0x00004C7A,\n    0x00000000, 0x000300FB, 0x00000A0A, 0x00002E68, 0x000200F8, 0x00002E68,\n    0x00050041, 0x00000288, 0x000060D7, 0x00000CE9, 0x00000A0B, 0x0004003D,\n    0x0000000B, 0x00003526, 0x000060D7, 0x000500C7, 0x0000000B, 0x00005F7D,\n    0x00003526, 0x00000A10, 0x000500AB, 0x00000009, 0x000048EB, 0x00005F7D,\n    0x00000A0A, 0x000500C2, 0x0000000B, 0x00001FCD, 0x00003526, 0x00000A10,\n    0x000500C7, 0x0000000B, 0x0000619E, 0x00001FCD, 0x00000A13, 0x00050050,\n    0x00000011, 0x000022A7, 0x00003526, 0x00003526, 0x000500C2, 0x00000011,\n    0x00001BAF, 0x000022A7, 0x00000787, 0x000500C7, 0x00000011, 0x00001997,\n    0x00001BAF, 0x000007A2, 0x00050041, 0x00000288, 0x0000492C, 0x00000CE9,\n    0x00000A0E, 0x0004003D, 0x0000000B, 0x00005EAC, 0x0000492C, 0x00050041,\n    0x00000288, 0x00004EBA, 0x00000CE9, 0x00000A11, 0x0004003D, 0x0000000B,\n    0x00005788, 0x00004EBA, 0x00050041, 0x00000288, 0x00004EBB, 0x00000CE9,\n    0x00000A14, 0x0004003D, 0x0000000B, 0x00005789, 0x00004EBB, 0x00050041,\n    0x00000291, 0x00004EBC, 0x00000CE9, 0x00000A17, 0x0004003D, 0x00000014,\n    0x0000578A, 0x00004EBC, 0x00050041, 0x00000288, 0x00004EBD, 0x00000CE9,\n    0x00000A1A, 0x0004003D, 0x0000000B, 0x0000578B, 0x00004EBD, 0x00050041,\n    0x00000288, 0x00004E6E, 0x00000CE9, 0x00000A1D, 0x0004003D, 0x0000000B,\n    0x000019C2, 0x00004E6E, 0x0004003D, 0x00000014, 0x00002A0E, 0x00000F48,\n    0x000500C4, 0x00000014, 0x0000538B, 0x00002A0E, 0x00000A34, 0x0007004F,\n    0x00000011, 0x000042F0, 0x0000538B, 0x0000538B, 0x00000000, 0x00000001,\n    0x0007004F, 0x00000011, 0x0000242F, 0x0000578A, 0x0000578A, 0x00000000,\n    0x00000001, 0x000500AE, 0x0000000F, 0x00004288, 0x000042F0, 0x0000242F,\n    0x0004009A, 0x00000009, 0x00006067, 0x00004288, 0x000300F7, 0x000019BA,\n    0x00000002, 0x000400FA, 0x00006067, 0x000055E8, 0x000019BA, 0x000200F8,\n    0x000055E8, 0x000200F9, 0x00004C7A, 0x000200F8, 0x000019BA, 0x0004007C,\n    0x00000016, 0x00005BB6, 0x0000538B, 0x00050051, 0x0000000B, 0x00004916,\n    0x0000578A, 0x00000001, 0x00050051, 0x0000000C, 0x00005BEB, 0x00005BB6,\n    0x00000000, 0x00050084, 0x0000000C, 0x0000591A, 0x00005BEB, 0x00000A11,\n    0x00050051, 0x0000000C, 0x000018DA, 0x00005BB6, 0x00000002, 0x0004007C,\n    0x0000000C, 0x000038A9, 0x00004916, 0x00050084, 0x0000000C, 0x00002C0F,\n    0x000018DA, 0x000038A9, 0x00050051, 0x0000000C, 0x000044BE, 0x00005BB6,\n    0x00000001, 0x00050080, 0x0000000C, 0x000056D4, 0x00002C0F, 0x000044BE,\n    0x0004007C, 0x0000000C, 0x00005785, 0x000019C2, 0x00050084, 0x0000000C,\n    0x00005FD7, 0x000056D4, 0x00005785, 0x00050080, 0x0000000C, 0x00002042,\n    0x0000591A, 0x00005FD7, 0x0004007C, 0x0000000B, 0x00002A92, 0x00002042,\n    0x00050080, 0x0000000B, 0x00001F01, 0x0000578B, 0x00002A92, 0x000500C2,\n    0x00000011, 0x00004DD1, 0x000042F0, 0x0000074B, 0x00050086, 0x00000011,\n    0x00001E20, 0x00004DD1, 0x00001997, 0x00050084, 0x00000011, 0x00004707,\n    0x00001997, 0x00001E20, 0x00050082, 0x00000011, 0x00004761, 0x00004DD1,\n    0x00004707, 0x000500C4, 0x00000011, 0x00002BE0, 0x00001E20, 0x0000074B,\n    0x00050051, 0x0000000B, 0x000033E4, 0x00004761, 0x00000000, 0x00050051,\n    0x0000000B, 0x00002A78, 0x00001997, 0x00000001, 0x00050084, 0x0000000B,\n    0x00005966, 0x000033E4, 0x00002A78, 0x00050051, 0x0000000B, 0x00001B1F,\n    0x00004761, 0x00000001, 0x00050080, 0x0000000B, 0x000028E5, 0x00005966,\n    0x00001B1F, 0x000500C7, 0x00000011, 0x000049A3, 0x000042F0, 0x000007BA,\n    0x000500C4, 0x0000000B, 0x00002955, 0x000028E5, 0x00000A1F, 0x00050051,\n    0x0000000B, 0x000051B4, 0x000049A3, 0x00000001, 0x000500C4, 0x0000000B,\n    0x00005C2C, 0x000051B4, 0x00000A19, 0x000500C5, 0x0000000B, 0x00004D66,\n    0x00002955, 0x00005C2C, 0x00050051, 0x0000000B, 0x000053E4, 0x000049A3,\n    0x00000000, 0x000500C4, 0x0000000B, 0x00002170, 0x000053E4, 0x00000A0D,\n    0x000500C5, 0x0000000B, 0x000044F0, 0x00004D66, 0x00002170, 0x00050051,\n    0x0000000B, 0x00004DD3, 0x00002BE0, 0x00000000, 0x00060052, 0x00000014,\n    0x00003CC4, 0x00004DD3, 0x0000538B, 0x00000000, 0x00050051, 0x0000000B,\n    0x000059DE, 0x00002BE0, 0x00000001, 0x00060052, 0x00000014, 0x000025D0,\n    0x000059DE, 0x00003CC4, 0x00000001, 0x000300F7, 0x00004F78, 0x00000002,\n    0x000400FA, 0x000048EB, 0x00005BE0, 0x00002DD9, 0x000200F8, 0x00005BE0,\n    0x0004007C, 0x00000016, 0x0000277F, 0x000025D0, 0x000500C2, 0x0000000B,\n    0x00004C14, 0x00005788, 0x00000A1A, 0x000500C2, 0x0000000B, 0x0000497A,\n    0x00005789, 0x00000A17, 0x00050051, 0x0000000C, 0x00001A7E, 0x0000277F,\n    0x00000002, 0x000500C3, 0x0000000C, 0x00002F39, 0x00001A7E, 0x00000A11,\n    0x0004007C, 0x0000000C, 0x00005780, 0x0000497A, 0x00050084, 0x0000000C,\n    0x00001F02, 0x00002F39, 0x00005780, 0x00050051, 0x0000000C, 0x00006242,\n    0x0000277F, 0x00000001, 0x000500C3, 0x0000000C, 0x00004A6F, 0x00006242,\n    0x00000A17, 0x00050080, 0x0000000C, 0x00002B2C, 0x00001F02, 0x00004A6F,\n    0x0004007C, 0x0000000C, 0x00004202, 0x00004C14, 0x00050084, 0x0000000C,\n    0x00003A60, 0x00002B2C, 0x00004202, 0x00050051, 0x0000000C, 0x00006243,\n    0x0000277F, 0x00000000, 0x000500C3, 0x0000000C, 0x00004FC7, 0x00006243,\n    0x00000A1A, 0x00050080, 0x0000000C, 0x000049FC, 0x00003A60, 0x00004FC7,\n    0x000500C4, 0x0000000C, 0x0000225D, 0x000049FC, 0x00000A20, 0x000500C7,\n    0x0000000C, 0x00002CAA, 0x00001A7E, 0x00000A14, 0x000500C4, 0x0000000C,\n    0x00004CAE, 0x00002CAA, 0x00000A1A, 0x000500C3, 0x0000000C, 0x0000383E,\n    0x00006242, 0x00000A0E, 0x000500C7, 0x0000000C, 0x00005374, 0x0000383E,\n    0x00000A14, 0x000500C4, 0x0000000C, 0x000054CA, 0x00005374, 0x00000A14,\n    0x000500C5, 0x0000000C, 0x000042CE, 0x00004CAE, 0x000054CA, 0x000500C7,\n    0x0000000C, 0x000050D5, 0x00006243, 0x00000A20, 0x000500C5, 0x0000000C,\n    0x00003ADD, 0x000042CE, 0x000050D5, 0x000500C5, 0x0000000C, 0x000043B6,\n    0x0000225D, 0x00003ADD, 0x000500C4, 0x0000000C, 0x00005E50, 0x000043B6,\n    0x00000A0D, 0x000500C3, 0x0000000C, 0x000032D7, 0x00006242, 0x00000A14,\n    0x000500C6, 0x0000000C, 0x000026C9, 0x000032D7, 0x00002F39, 0x000500C7,\n    0x0000000C, 0x00004199, 0x000026C9, 0x00000A0E, 0x000500C3, 0x0000000C,\n    0x00002590, 0x00006243, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000505E,\n    0x00002590, 0x00000A14, 0x000500C4, 0x0000000C, 0x0000541D, 0x00004199,\n    0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BA, 0x0000505E, 0x0000541D,\n    0x000500C7, 0x0000000C, 0x00005076, 0x00006242, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x00005228, 0x00005076, 0x00000A17, 0x000500C4, 0x0000000C,\n    0x00001998, 0x000022BA, 0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FE,\n    0x00005228, 0x00001998, 0x000500C4, 0x0000000C, 0x00001C00, 0x00004199,\n    0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C81, 0x000047FE, 0x00001C00,\n    0x000500C7, 0x0000000C, 0x000050AF, 0x00005E50, 0x00000A38, 0x000500C5,\n    0x0000000C, 0x00003C70, 0x00003C81, 0x000050AF, 0x000500C3, 0x0000000C,\n    0x00003745, 0x00005E50, 0x00000A17, 0x000500C7, 0x0000000C, 0x000018B8,\n    0x00003745, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000547E, 0x000018B8,\n    0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A8, 0x00003C70, 0x0000547E,\n    0x000500C3, 0x0000000C, 0x00003A6E, 0x00005E50, 0x00000A1A, 0x000500C7,\n    0x0000000C, 0x000018B9, 0x00003A6E, 0x00000A20, 0x000500C4, 0x0000000C,\n    0x0000547F, 0x000018B9, 0x00000A23, 0x000500C5, 0x0000000C, 0x0000456F,\n    0x000045A8, 0x0000547F, 0x000500C3, 0x0000000C, 0x00003C88, 0x00005E50,\n    0x00000A23, 0x000500C4, 0x0000000C, 0x00002824, 0x00003C88, 0x00000A2F,\n    0x000500C5, 0x0000000C, 0x00003B79, 0x0000456F, 0x00002824, 0x0004007C,\n    0x0000000B, 0x000041E5, 0x00003B79, 0x000200F9, 0x00004F78, 0x000200F8,\n    0x00002DD9, 0x0007004F, 0x00000011, 0x00002E84, 0x000025D0, 0x000025D0,\n    0x00000000, 0x00000001, 0x0004007C, 0x00000012, 0x00004F7B, 0x00002E84,\n    0x000500C2, 0x0000000B, 0x00002CA9, 0x00005788, 0x00000A1A, 0x00050051,\n    0x0000000C, 0x00003905, 0x00004F7B, 0x00000001, 0x000500C3, 0x0000000C,\n    0x00002F3A, 0x00003905, 0x00000A1A, 0x0004007C, 0x0000000C, 0x00005781,\n    0x00002CA9, 0x00050084, 0x0000000C, 0x00001F03, 0x00002F3A, 0x00005781,\n    0x00050051, 0x0000000C, 0x00006244, 0x00004F7B, 0x00000000, 0x000500C3,\n    0x0000000C, 0x00004FC8, 0x00006244, 0x00000A1A, 0x00050080, 0x0000000C,\n    0x000049B0, 0x00001F03, 0x00004FC8, 0x000500C4, 0x0000000C, 0x0000254A,\n    0x000049B0, 0x00000A1D, 0x000500C3, 0x0000000C, 0x0000603B, 0x00003905,\n    0x00000A0E, 0x000500C7, 0x0000000C, 0x0000539A, 0x0000603B, 0x00000A20,\n    0x000500C4, 0x0000000C, 0x0000534A, 0x0000539A, 0x00000A14, 0x000500C7,\n    0x0000000C, 0x00004EA5, 0x00006244, 0x00000A20, 0x000500C5, 0x0000000C,\n    0x00002B1A, 0x0000534A, 0x00004EA5, 0x000500C5, 0x0000000C, 0x000043B7,\n    0x0000254A, 0x00002B1A, 0x000500C4, 0x0000000C, 0x00005E63, 0x000043B7,\n    0x00000A0D, 0x000500C3, 0x0000000C, 0x000031DE, 0x00003905, 0x00000A17,\n    0x000500C7, 0x0000000C, 0x00005447, 0x000031DE, 0x00000A0E, 0x000500C3,\n    0x0000000C, 0x000028A6, 0x00006244, 0x00000A14, 0x000500C7, 0x0000000C,\n    0x0000511E, 0x000028A6, 0x00000A14, 0x000500C3, 0x0000000C, 0x000028B9,\n    0x00003905, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000505F, 0x000028B9,\n    0x00000A0E, 0x000500C4, 0x0000000C, 0x0000541E, 0x0000505F, 0x00000A0E,\n    0x000500C6, 0x0000000C, 0x000022BB, 0x0000511E, 0x0000541E, 0x000500C7,\n    0x0000000C, 0x00005077, 0x00003905, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x00005229, 0x00005077, 0x00000A17, 0x000500C4, 0x0000000C, 0x00001999,\n    0x000022BB, 0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FF, 0x00005229,\n    0x00001999, 0x000500C4, 0x0000000C, 0x00001C01, 0x00005447, 0x00000A2C,\n    0x000500C5, 0x0000000C, 0x00003C82, 0x000047FF, 0x00001C01, 0x000500C7,\n    0x0000000C, 0x000050B0, 0x00005E63, 0x00000A38, 0x000500C5, 0x0000000C,\n    0x00003C71, 0x00003C82, 0x000050B0, 0x000500C3, 0x0000000C, 0x00003746,\n    0x00005E63, 0x00000A17, 0x000500C7, 0x0000000C, 0x000018BA, 0x00003746,\n    0x00000A0E, 0x000500C4, 0x0000000C, 0x00005480, 0x000018BA, 0x00000A1A,\n    0x000500C5, 0x0000000C, 0x000045A9, 0x00003C71, 0x00005480, 0x000500C3,\n    0x0000000C, 0x00003A6F, 0x00005E63, 0x00000A1A, 0x000500C7, 0x0000000C,\n    0x000018BB, 0x00003A6F, 0x00000A20, 0x000500C4, 0x0000000C, 0x00005481,\n    0x000018BB, 0x00000A23, 0x000500C5, 0x0000000C, 0x00004570, 0x000045A9,\n    0x00005481, 0x000500C3, 0x0000000C, 0x00003C89, 0x00005E63, 0x00000A23,\n    0x000500C4, 0x0000000C, 0x00002825, 0x00003C89, 0x00000A2F, 0x000500C5,\n    0x0000000C, 0x00003B7A, 0x00004570, 0x00002825, 0x0004007C, 0x0000000B,\n    0x000041E6, 0x00003B7A, 0x000200F9, 0x00004F78, 0x000200F8, 0x00004F78,\n    0x000700F5, 0x0000000B, 0x00004799, 0x000041E5, 0x00005BE0, 0x000041E6,\n    0x00002DD9, 0x00050051, 0x0000000B, 0x00003B60, 0x00001997, 0x00000000,\n    0x00050084, 0x0000000B, 0x00004451, 0x00003B60, 0x00002A78, 0x00050084,\n    0x0000000B, 0x00001C91, 0x00004799, 0x00004451, 0x00050080, 0x0000000B,\n    0x0000226F, 0x00001C91, 0x000044F0, 0x00050080, 0x0000000B, 0x000053DE,\n    0x0000226F, 0x00005EAC, 0x000500C2, 0x0000000B, 0x00003948, 0x000053DE,\n    0x00000A17, 0x00060041, 0x00000294, 0x00004FAF, 0x0000107A, 0x00000A0B,\n    0x00003948, 0x0004003D, 0x00000017, 0x00002261, 0x00004FAF, 0x000500AA,\n    0x00000009, 0x00005272, 0x0000619E, 0x00000A0D, 0x000300F7, 0x0000362B,\n    0x00000000, 0x000400FA, 0x00005272, 0x00002957, 0x0000362B, 0x000200F8,\n    0x00002957, 0x000500C7, 0x00000017, 0x0000475F, 0x00002261, 0x000009CE,\n    0x000500C4, 0x00000017, 0x000024D1, 0x0000475F, 0x0000013D, 0x000500C7,\n    0x00000017, 0x000050AC, 0x00002261, 0x0000072E, 0x000500C2, 0x00000017,\n    0x0000448D, 0x000050AC, 0x0000013D, 0x000500C5, 0x00000017, 0x00003FF8,\n    0x000024D1, 0x0000448D, 0x000200F9, 0x0000362B, 0x000200F8, 0x0000362B,\n    0x000700F5, 0x00000017, 0x000040C2, 0x00002261, 0x00004F78, 0x00003FF8,\n    0x00002957, 0x000500C2, 0x0000000B, 0x0000219B, 0x00001F01, 0x00000A17,\n    0x00060041, 0x00000294, 0x000036B5, 0x0000140E, 0x00000A0B, 0x0000219B,\n    0x0003003E, 0x000036B5, 0x000040C2, 0x00050080, 0x0000000B, 0x00005679,\n    0x00001F01, 0x00000A3A, 0x00050080, 0x0000000B, 0x000027E6, 0x000053DE,\n    0x00000A3A, 0x000500C2, 0x0000000B, 0x00003949, 0x000027E6, 0x00000A17,\n    0x00060041, 0x00000294, 0x00005566, 0x0000107A, 0x00000A0B, 0x00003949,\n    0x0004003D, 0x00000017, 0x00003910, 0x00005566, 0x000300F7, 0x0000362C,\n    0x00000000, 0x000400FA, 0x00005272, 0x00002958, 0x0000362C, 0x000200F8,\n    0x00002958, 0x000500C7, 0x00000017, 0x00004760, 0x00003910, 0x000009CE,\n    0x000500C4, 0x00000017, 0x000024D2, 0x00004760, 0x0000013D, 0x000500C7,\n    0x00000017, 0x000050AD, 0x00003910, 0x0000072E, 0x000500C2, 0x00000017,\n    0x0000448E, 0x000050AD, 0x0000013D, 0x000500C5, 0x00000017, 0x00003FF9,\n    0x000024D2, 0x0000448E, 0x000200F9, 0x0000362C, 0x000200F8, 0x0000362C,\n    0x000700F5, 0x00000017, 0x000040C3, 0x00003910, 0x0000362B, 0x00003FF9,\n    0x00002958, 0x000500C2, 0x0000000B, 0x0000219C, 0x00005679, 0x00000A17,\n    0x00060041, 0x00000294, 0x00003FB0, 0x0000140E, 0x00000A0B, 0x0000219C,\n    0x0003003E, 0x00003FB0, 0x000040C3, 0x000200F9, 0x00004C7A, 0x000200F8,\n    0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_32bpb_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25155\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v4uint = OpTypeVector %uint 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v2uint = OpTypeVector %uint 2\n     %v3uint = OpTypeVector %uint 3\n     %uint_1 = OpConstant %uint 1\n     %uint_2 = OpConstant %uint 2\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n     %uint_3 = OpConstant %uint 3\n    %uint_16 = OpConstant %uint 16\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n     %uint_0 = OpConstant %uint 0\n      %int_3 = OpConstant %int 3\n      %int_2 = OpConstant %int 2\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %2603 = OpConstantComposite %v3uint %uint_3 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n     %uint_4 = OpConstant %uint 4\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n    %uint_32 = OpConstant %uint 32\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24540 = OpBitwiseAnd %uint %13606 %uint_1\n      %17270 = OpINotEqual %bool %24540 %uint_0\n      %12328 = OpBitwiseAnd %uint %13606 %uint_2\n      %17284 = OpINotEqual %bool %12328 %uint_0\n       %7856 = OpShiftRightLogical %uint %13606 %uint_2\n      %25058 = OpBitwiseAnd %uint %7856 %uint_3\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2603\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %6586 DontFlatten\n               OpBranchConditional %24679 %21992 %6586\n      %21992 = OpLabel\n               OpBranch %19578\n       %6586 = OpLabel\n      %23478 = OpBitcast %v3int %21387\n      %18710 = OpCompositeExtract %uint %22410 1\n      %23531 = OpCompositeExtract %int %23478 0\n      %22810 = OpIMul %int %23531 %int_4\n       %6362 = OpCompositeExtract %int %23478 2\n      %14505 = OpBitcast %int %18710\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %23478 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %6594\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %22810 %24535\n      %10404 = OpBitcast %uint %8258\n      %14582 = OpIAdd %uint %22411 %10404\n      %12308 = OpLogicalNot %bool %17270\n               OpSelectionMerge %19040 DontFlatten\n               OpBranchConditional %12308 %9741 %17007\n       %9741 = OpLabel\n      %17463 = OpCompositeExtract %uint %21387 0\n      %11246 = OpCompositeExtract %uint %21387 1\n      %18801 = OpCompositeExtract %uint %21387 2\n      %14831 = OpIMul %uint %22409 %18801\n      %20322 = OpIAdd %uint %11246 %14831\n      %21676 = OpIMul %uint %22408 %20322\n      %20398 = OpIAdd %uint %17463 %21676\n      %11367 = OpShiftLeftLogical %uint %20398 %uint_2\n               OpBranch %19040\n      %17007 = OpLabel\n               OpSelectionMerge %23536 DontFlatten\n               OpBranchConditional %17284 %11410 %24353\n      %11410 = OpLabel\n      %21364 = OpShiftRightLogical %uint %22408 %int_5\n      %13804 = OpShiftRightLogical %uint %22409 %int_4\n      %13237 = OpShiftRightArithmetic %int %6362 %int_2\n      %22374 = OpBitcast %int %13804\n      %25085 = OpIMul %int %13237 %22374\n      %11618 = OpShiftRightArithmetic %int %17598 %int_4\n      %16670 = OpIAdd %int %25085 %11618\n      %19064 = OpBitcast %int %21364\n      %13020 = OpIMul %int %16670 %19064\n      %12986 = OpShiftRightArithmetic %int %23531 %int_5\n      %24558 = OpIAdd %int %13020 %12986\n       %8797 = OpShiftLeftLogical %int %24558 %int_7\n      %11434 = OpBitwiseAnd %int %6362 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %17598 %int_1\n      %21365 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21365 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %23531 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17334 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17334 %uint_2\n      %13015 = OpShiftRightArithmetic %int %17598 %int_3\n       %9929 = OpBitwiseXor %int %13015 %13237\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %23531 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %17598 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6551\n       %7168 = OpShiftLeftLogical %int %16793 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24144 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24144 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24144 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24144 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %23536\n      %24353 = OpLabel\n      %23000 = OpBitcast %v2int %17136\n      %22120 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %23000 1\n      %12089 = OpShiftRightArithmetic %int %14597 %int_5\n      %22400 = OpBitcast %int %22120\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %23000 0\n      %20423 = OpShiftRightArithmetic %int %25154 %int_5\n      %18864 = OpIAdd %int %7938 %20423\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25154 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17335 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17335 %uint_2\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25154 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6552\n       %7169 = OpShiftLeftLogical %int %21575 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24163 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24163 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24163 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %23536\n      %23536 = OpLabel\n      %10540 = OpPhi %uint %16869 %11410 %16870 %24353\n               OpBranch %19040\n      %19040 = OpLabel\n      %11376 = OpPhi %uint %11367 %9741 %10540 %23536\n      %18621 = OpIAdd %uint %11376 %24236\n      %15698 = OpShiftRightLogical %uint %18621 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15698\n       %7338 = OpLoad %v4uint %20399\n      %13760 = OpIEqual %bool %25058 %uint_1\n      %21366 = OpIEqual %bool %25058 %uint_2\n      %22150 = OpLogicalOr %bool %13760 %21366\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %7338 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %7338 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22649 = OpPhi %v4uint %7338 %19040 %16376 %10583\n      %19638 = OpIEqual %bool %25058 %uint_3\n      %15139 = OpLogicalOr %bool %21366 %19638\n               OpSelectionMerge %13867 None\n               OpBranchConditional %15139 %11064 %13867\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22649 %749\n      %15335 = OpShiftRightLogical %v4uint %22649 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %13867\n      %13867 = OpLabel\n      %16578 = OpPhi %v4uint %22649 %13411 %10728 %11064\n       %8603 = OpShiftRightLogical %uint %14582 %int_4\n      %14005 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %8603\n               OpStore %14005 %16578\n      %21685 = OpIAdd %uint %14582 %uint_16\n               OpSelectionMerge %24688 DontFlatten\n               OpBranchConditional %17270 %21993 %7205\n      %21993 = OpLabel\n               OpBranch %24688\n       %7205 = OpLabel\n               OpBranch %24688\n      %24688 = OpLabel\n      %11377 = OpPhi %uint %uint_32 %21993 %uint_16 %7205\n      %18622 = OpIAdd %uint %18621 %11377\n      %15699 = OpShiftRightLogical %uint %18622 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15699\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %14874 None\n               OpBranchConditional %22150 %10584 %14874\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %14874\n      %14874 = OpLabel\n      %10924 = OpPhi %v4uint %14608 %24688 %16377 %10584\n               OpSelectionMerge %13868 None\n               OpBranchConditional %15139 %11065 %13868\n      %11065 = OpLabel\n      %24088 = OpShiftLeftLogical %v4uint %10924 %749\n      %15336 = OpShiftRightLogical %v4uint %10924 %749\n      %10729 = OpBitwiseOr %v4uint %24088 %15336\n               OpBranch %13868\n      %13868 = OpLabel\n      %16579 = OpPhi %v4uint %10924 %14874 %10729 %11065\n       %8604 = OpShiftRightLogical %uint %21685 %int_4\n      %16304 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %8604\n               OpStore %16304 %16579\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_32bpb_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006243, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000017, 0x0000000B, 0x00000004, 0x00040015, 0x0000000C,\n    0x00000020, 0x00000001, 0x00040017, 0x00000012, 0x0000000C, 0x00000002,\n    0x00040017, 0x00000016, 0x0000000C, 0x00000003, 0x00020014, 0x00000009,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001,\n    0x0004002B, 0x0000000B, 0x00000A10, 0x00000002, 0x0004002B, 0x0000000B,\n    0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B, 0x00000A22, 0x00000008,\n    0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00, 0x0004002B, 0x0000000B,\n    0x00000A13, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A3A, 0x00000010,\n    0x0004002B, 0x0000000C, 0x00000A17, 0x00000004, 0x0004002B, 0x0000000C,\n    0x00000A1D, 0x00000006, 0x0004002B, 0x0000000C, 0x00000A2C, 0x0000000B,\n    0x0004002B, 0x0000000C, 0x00000A38, 0x0000000F, 0x0004002B, 0x0000000C,\n    0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C, 0x00000A1A, 0x00000005,\n    0x0004002B, 0x0000000C, 0x00000A20, 0x00000007, 0x0004002B, 0x0000000C,\n    0x00000A23, 0x00000008, 0x0004002B, 0x0000000C, 0x00000A2F, 0x0000000C,\n    0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000, 0x0004002B, 0x0000000C,\n    0x00000A14, 0x00000003, 0x0004002B, 0x0000000C, 0x00000A11, 0x00000002,\n    0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000, 0x000A001E, 0x00000489,\n    0x0000000B, 0x0000000B, 0x0000000B, 0x0000000B, 0x00000014, 0x0000000B,\n    0x0000000B, 0x0000000B, 0x00040020, 0x00000706, 0x00000009, 0x00000489,\n    0x0004003B, 0x00000706, 0x00000CE9, 0x00000009, 0x00040020, 0x00000288,\n    0x00000009, 0x0000000B, 0x00040020, 0x00000291, 0x00000009, 0x00000014,\n    0x00040020, 0x00000292, 0x00000001, 0x00000014, 0x0004003B, 0x00000292,\n    0x00000F48, 0x00000001, 0x0006002C, 0x00000014, 0x00000A2B, 0x00000A13,\n    0x00000A0A, 0x00000A0A, 0x00040017, 0x0000000F, 0x00000009, 0x00000002,\n    0x0004002B, 0x0000000B, 0x00000A16, 0x00000004, 0x0003001D, 0x000007DC,\n    0x00000017, 0x0003001E, 0x000007B4, 0x000007DC, 0x00040020, 0x00000A31,\n    0x00000002, 0x000007B4, 0x0004003B, 0x00000A31, 0x0000107A, 0x00000002,\n    0x00040020, 0x00000294, 0x00000002, 0x00000017, 0x0003001D, 0x000007DD,\n    0x00000017, 0x0003001E, 0x000007B5, 0x000007DD, 0x00040020, 0x00000A32,\n    0x00000002, 0x000007B5, 0x0004003B, 0x00000A32, 0x0000140E, 0x00000002,\n    0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020, 0x0006002C, 0x00000014,\n    0x00000BC3, 0x00000A16, 0x00000A6A, 0x00000A0D, 0x0007002C, 0x00000017,\n    0x000009CE, 0x000008A6, 0x000008A6, 0x000008A6, 0x000008A6, 0x0007002C,\n    0x00000017, 0x0000013D, 0x00000A22, 0x00000A22, 0x00000A22, 0x00000A22,\n    0x0007002C, 0x00000017, 0x0000072E, 0x000005FD, 0x000005FD, 0x000005FD,\n    0x000005FD, 0x0007002C, 0x00000017, 0x000002ED, 0x00000A3A, 0x00000A3A,\n    0x00000A3A, 0x00000A3A, 0x00050036, 0x00000008, 0x0000161F, 0x00000000,\n    0x00000502, 0x000200F8, 0x00003B06, 0x000300F7, 0x00004C7A, 0x00000000,\n    0x000300FB, 0x00000A0A, 0x00002E68, 0x000200F8, 0x00002E68, 0x00050041,\n    0x00000288, 0x000060D7, 0x00000CE9, 0x00000A0B, 0x0004003D, 0x0000000B,\n    0x00003526, 0x000060D7, 0x000500C7, 0x0000000B, 0x00005FDC, 0x00003526,\n    0x00000A0D, 0x000500AB, 0x00000009, 0x00004376, 0x00005FDC, 0x00000A0A,\n    0x000500C7, 0x0000000B, 0x00003028, 0x00003526, 0x00000A10, 0x000500AB,\n    0x00000009, 0x00004384, 0x00003028, 0x00000A0A, 0x000500C2, 0x0000000B,\n    0x00001EB0, 0x00003526, 0x00000A10, 0x000500C7, 0x0000000B, 0x000061E2,\n    0x00001EB0, 0x00000A13, 0x00050041, 0x00000288, 0x0000492C, 0x00000CE9,\n    0x00000A0E, 0x0004003D, 0x0000000B, 0x00005EAC, 0x0000492C, 0x00050041,\n    0x00000288, 0x00004EBA, 0x00000CE9, 0x00000A11, 0x0004003D, 0x0000000B,\n    0x00005788, 0x00004EBA, 0x00050041, 0x00000288, 0x00004EBB, 0x00000CE9,\n    0x00000A14, 0x0004003D, 0x0000000B, 0x00005789, 0x00004EBB, 0x00050041,\n    0x00000291, 0x00004EBC, 0x00000CE9, 0x00000A17, 0x0004003D, 0x00000014,\n    0x0000578A, 0x00004EBC, 0x00050041, 0x00000288, 0x00004EBD, 0x00000CE9,\n    0x00000A1A, 0x0004003D, 0x0000000B, 0x0000578B, 0x00004EBD, 0x00050041,\n    0x00000288, 0x00004E6E, 0x00000CE9, 0x00000A1D, 0x0004003D, 0x0000000B,\n    0x000019C2, 0x00004E6E, 0x0004003D, 0x00000014, 0x00002A0E, 0x00000F48,\n    0x000500C4, 0x00000014, 0x0000538B, 0x00002A0E, 0x00000A2B, 0x0007004F,\n    0x00000011, 0x000042F0, 0x0000538B, 0x0000538B, 0x00000000, 0x00000001,\n    0x0007004F, 0x00000011, 0x0000242F, 0x0000578A, 0x0000578A, 0x00000000,\n    0x00000001, 0x000500AE, 0x0000000F, 0x00004288, 0x000042F0, 0x0000242F,\n    0x0004009A, 0x00000009, 0x00006067, 0x00004288, 0x000300F7, 0x000019BA,\n    0x00000002, 0x000400FA, 0x00006067, 0x000055E8, 0x000019BA, 0x000200F8,\n    0x000055E8, 0x000200F9, 0x00004C7A, 0x000200F8, 0x000019BA, 0x0004007C,\n    0x00000016, 0x00005BB6, 0x0000538B, 0x00050051, 0x0000000B, 0x00004916,\n    0x0000578A, 0x00000001, 0x00050051, 0x0000000C, 0x00005BEB, 0x00005BB6,\n    0x00000000, 0x00050084, 0x0000000C, 0x0000591A, 0x00005BEB, 0x00000A17,\n    0x00050051, 0x0000000C, 0x000018DA, 0x00005BB6, 0x00000002, 0x0004007C,\n    0x0000000C, 0x000038A9, 0x00004916, 0x00050084, 0x0000000C, 0x00002C0F,\n    0x000018DA, 0x000038A9, 0x00050051, 0x0000000C, 0x000044BE, 0x00005BB6,\n    0x00000001, 0x00050080, 0x0000000C, 0x000056D4, 0x00002C0F, 0x000044BE,\n    0x0004007C, 0x0000000C, 0x00005785, 0x000019C2, 0x00050084, 0x0000000C,\n    0x00005FD7, 0x000056D4, 0x00005785, 0x00050080, 0x0000000C, 0x00002042,\n    0x0000591A, 0x00005FD7, 0x0004007C, 0x0000000B, 0x000028A4, 0x00002042,\n    0x00050080, 0x0000000B, 0x000038F6, 0x0000578B, 0x000028A4, 0x000400A8,\n    0x00000009, 0x00003014, 0x00004376, 0x000300F7, 0x00004A60, 0x00000002,\n    0x000400FA, 0x00003014, 0x0000260D, 0x0000426F, 0x000200F8, 0x0000260D,\n    0x00050051, 0x0000000B, 0x00004437, 0x0000538B, 0x00000000, 0x00050051,\n    0x0000000B, 0x00002BEE, 0x0000538B, 0x00000001, 0x00050051, 0x0000000B,\n    0x00004971, 0x0000538B, 0x00000002, 0x00050084, 0x0000000B, 0x000039EF,\n    0x00005789, 0x00004971, 0x00050080, 0x0000000B, 0x00004F62, 0x00002BEE,\n    0x000039EF, 0x00050084, 0x0000000B, 0x000054AC, 0x00005788, 0x00004F62,\n    0x00050080, 0x0000000B, 0x00004FAE, 0x00004437, 0x000054AC, 0x000500C4,\n    0x0000000B, 0x00002C67, 0x00004FAE, 0x00000A10, 0x000200F9, 0x00004A60,\n    0x000200F8, 0x0000426F, 0x000300F7, 0x00005BF0, 0x00000002, 0x000400FA,\n    0x00004384, 0x00002C92, 0x00005F21, 0x000200F8, 0x00002C92, 0x000500C2,\n    0x0000000B, 0x00005374, 0x00005788, 0x00000A1A, 0x000500C2, 0x0000000B,\n    0x000035EC, 0x00005789, 0x00000A17, 0x000500C3, 0x0000000C, 0x000033B5,\n    0x000018DA, 0x00000A11, 0x0004007C, 0x0000000C, 0x00005766, 0x000035EC,\n    0x00050084, 0x0000000C, 0x000061FD, 0x000033B5, 0x00005766, 0x000500C3,\n    0x0000000C, 0x00002D62, 0x000044BE, 0x00000A17, 0x00050080, 0x0000000C,\n    0x0000411E, 0x000061FD, 0x00002D62, 0x0004007C, 0x0000000C, 0x00004A78,\n    0x00005374, 0x00050084, 0x0000000C, 0x000032DC, 0x0000411E, 0x00004A78,\n    0x000500C3, 0x0000000C, 0x000032BA, 0x00005BEB, 0x00000A1A, 0x00050080,\n    0x0000000C, 0x00005FEE, 0x000032DC, 0x000032BA, 0x000500C4, 0x0000000C,\n    0x0000225D, 0x00005FEE, 0x00000A20, 0x000500C7, 0x0000000C, 0x00002CAA,\n    0x000018DA, 0x00000A14, 0x000500C4, 0x0000000C, 0x00004CAE, 0x00002CAA,\n    0x00000A1A, 0x000500C3, 0x0000000C, 0x0000383E, 0x000044BE, 0x00000A0E,\n    0x000500C7, 0x0000000C, 0x00005375, 0x0000383E, 0x00000A14, 0x000500C4,\n    0x0000000C, 0x000054CA, 0x00005375, 0x00000A14, 0x000500C5, 0x0000000C,\n    0x000042CE, 0x00004CAE, 0x000054CA, 0x000500C7, 0x0000000C, 0x000050D5,\n    0x00005BEB, 0x00000A20, 0x000500C5, 0x0000000C, 0x00003ADD, 0x000042CE,\n    0x000050D5, 0x000500C5, 0x0000000C, 0x000043B6, 0x0000225D, 0x00003ADD,\n    0x000500C4, 0x0000000C, 0x00005E50, 0x000043B6, 0x00000A10, 0x000500C3,\n    0x0000000C, 0x000032D7, 0x000044BE, 0x00000A14, 0x000500C6, 0x0000000C,\n    0x000026C9, 0x000032D7, 0x000033B5, 0x000500C7, 0x0000000C, 0x00004199,\n    0x000026C9, 0x00000A0E, 0x000500C3, 0x0000000C, 0x00002590, 0x00005BEB,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x0000505E, 0x00002590, 0x00000A14,\n    0x000500C4, 0x0000000C, 0x0000541D, 0x00004199, 0x00000A0E, 0x000500C6,\n    0x0000000C, 0x000022BA, 0x0000505E, 0x0000541D, 0x000500C7, 0x0000000C,\n    0x00005076, 0x000044BE, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005228,\n    0x00005076, 0x00000A17, 0x000500C4, 0x0000000C, 0x00001997, 0x000022BA,\n    0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FE, 0x00005228, 0x00001997,\n    0x000500C4, 0x0000000C, 0x00001C00, 0x00004199, 0x00000A2C, 0x000500C5,\n    0x0000000C, 0x00003C81, 0x000047FE, 0x00001C00, 0x000500C7, 0x0000000C,\n    0x000050AF, 0x00005E50, 0x00000A38, 0x000500C5, 0x0000000C, 0x00003C70,\n    0x00003C81, 0x000050AF, 0x000500C3, 0x0000000C, 0x00003745, 0x00005E50,\n    0x00000A17, 0x000500C7, 0x0000000C, 0x000018B8, 0x00003745, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x0000547E, 0x000018B8, 0x00000A1A, 0x000500C5,\n    0x0000000C, 0x000045A8, 0x00003C70, 0x0000547E, 0x000500C3, 0x0000000C,\n    0x00003A6E, 0x00005E50, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018B9,\n    0x00003A6E, 0x00000A20, 0x000500C4, 0x0000000C, 0x0000547F, 0x000018B9,\n    0x00000A23, 0x000500C5, 0x0000000C, 0x0000456F, 0x000045A8, 0x0000547F,\n    0x000500C3, 0x0000000C, 0x00003C88, 0x00005E50, 0x00000A23, 0x000500C4,\n    0x0000000C, 0x00002824, 0x00003C88, 0x00000A2F, 0x000500C5, 0x0000000C,\n    0x00003B79, 0x0000456F, 0x00002824, 0x0004007C, 0x0000000B, 0x000041E5,\n    0x00003B79, 0x000200F9, 0x00005BF0, 0x000200F8, 0x00005F21, 0x0004007C,\n    0x00000012, 0x000059D8, 0x000042F0, 0x000500C2, 0x0000000B, 0x00005668,\n    0x00005788, 0x00000A1A, 0x00050051, 0x0000000C, 0x00003905, 0x000059D8,\n    0x00000001, 0x000500C3, 0x0000000C, 0x00002F39, 0x00003905, 0x00000A1A,\n    0x0004007C, 0x0000000C, 0x00005780, 0x00005668, 0x00050084, 0x0000000C,\n    0x00001F02, 0x00002F39, 0x00005780, 0x00050051, 0x0000000C, 0x00006242,\n    0x000059D8, 0x00000000, 0x000500C3, 0x0000000C, 0x00004FC7, 0x00006242,\n    0x00000A1A, 0x00050080, 0x0000000C, 0x000049B0, 0x00001F02, 0x00004FC7,\n    0x000500C4, 0x0000000C, 0x0000254A, 0x000049B0, 0x00000A1D, 0x000500C3,\n    0x0000000C, 0x0000603B, 0x00003905, 0x00000A0E, 0x000500C7, 0x0000000C,\n    0x0000539A, 0x0000603B, 0x00000A20, 0x000500C4, 0x0000000C, 0x0000534A,\n    0x0000539A, 0x00000A14, 0x000500C7, 0x0000000C, 0x00004EA5, 0x00006242,\n    0x00000A20, 0x000500C5, 0x0000000C, 0x00002B1A, 0x0000534A, 0x00004EA5,\n    0x000500C5, 0x0000000C, 0x000043B7, 0x0000254A, 0x00002B1A, 0x000500C4,\n    0x0000000C, 0x00005E63, 0x000043B7, 0x00000A10, 0x000500C3, 0x0000000C,\n    0x000031DE, 0x00003905, 0x00000A17, 0x000500C7, 0x0000000C, 0x00005447,\n    0x000031DE, 0x00000A0E, 0x000500C3, 0x0000000C, 0x000028A6, 0x00006242,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x0000511E, 0x000028A6, 0x00000A14,\n    0x000500C3, 0x0000000C, 0x000028B9, 0x00003905, 0x00000A14, 0x000500C7,\n    0x0000000C, 0x0000505F, 0x000028B9, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x0000541E, 0x0000505F, 0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BB,\n    0x0000511E, 0x0000541E, 0x000500C7, 0x0000000C, 0x00005077, 0x00003905,\n    0x00000A0E, 0x000500C4, 0x0000000C, 0x00005229, 0x00005077, 0x00000A17,\n    0x000500C4, 0x0000000C, 0x00001998, 0x000022BB, 0x00000A1D, 0x000500C5,\n    0x0000000C, 0x000047FF, 0x00005229, 0x00001998, 0x000500C4, 0x0000000C,\n    0x00001C01, 0x00005447, 0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C82,\n    0x000047FF, 0x00001C01, 0x000500C7, 0x0000000C, 0x000050B0, 0x00005E63,\n    0x00000A38, 0x000500C5, 0x0000000C, 0x00003C71, 0x00003C82, 0x000050B0,\n    0x000500C3, 0x0000000C, 0x00003746, 0x00005E63, 0x00000A17, 0x000500C7,\n    0x0000000C, 0x000018BA, 0x00003746, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x00005480, 0x000018BA, 0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A9,\n    0x00003C71, 0x00005480, 0x000500C3, 0x0000000C, 0x00003A6F, 0x00005E63,\n    0x00000A1A, 0x000500C7, 0x0000000C, 0x000018BB, 0x00003A6F, 0x00000A20,\n    0x000500C4, 0x0000000C, 0x00005481, 0x000018BB, 0x00000A23, 0x000500C5,\n    0x0000000C, 0x00004570, 0x000045A9, 0x00005481, 0x000500C3, 0x0000000C,\n    0x00003C89, 0x00005E63, 0x00000A23, 0x000500C4, 0x0000000C, 0x00002825,\n    0x00003C89, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B7A, 0x00004570,\n    0x00002825, 0x0004007C, 0x0000000B, 0x000041E6, 0x00003B7A, 0x000200F9,\n    0x00005BF0, 0x000200F8, 0x00005BF0, 0x000700F5, 0x0000000B, 0x0000292C,\n    0x000041E5, 0x00002C92, 0x000041E6, 0x00005F21, 0x000200F9, 0x00004A60,\n    0x000200F8, 0x00004A60, 0x000700F5, 0x0000000B, 0x00002C70, 0x00002C67,\n    0x0000260D, 0x0000292C, 0x00005BF0, 0x00050080, 0x0000000B, 0x000048BD,\n    0x00002C70, 0x00005EAC, 0x000500C2, 0x0000000B, 0x00003D52, 0x000048BD,\n    0x00000A17, 0x00060041, 0x00000294, 0x00004FAF, 0x0000107A, 0x00000A0B,\n    0x00003D52, 0x0004003D, 0x00000017, 0x00001CAA, 0x00004FAF, 0x000500AA,\n    0x00000009, 0x000035C0, 0x000061E2, 0x00000A0D, 0x000500AA, 0x00000009,\n    0x00005376, 0x000061E2, 0x00000A10, 0x000500A6, 0x00000009, 0x00005686,\n    0x000035C0, 0x00005376, 0x000300F7, 0x00003463, 0x00000000, 0x000400FA,\n    0x00005686, 0x00002957, 0x00003463, 0x000200F8, 0x00002957, 0x000500C7,\n    0x00000017, 0x0000475F, 0x00001CAA, 0x000009CE, 0x000500C4, 0x00000017,\n    0x000024D1, 0x0000475F, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AC,\n    0x00001CAA, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448D, 0x000050AC,\n    0x0000013D, 0x000500C5, 0x00000017, 0x00003FF8, 0x000024D1, 0x0000448D,\n    0x000200F9, 0x00003463, 0x000200F8, 0x00003463, 0x000700F5, 0x00000017,\n    0x00005879, 0x00001CAA, 0x00004A60, 0x00003FF8, 0x00002957, 0x000500AA,\n    0x00000009, 0x00004CB6, 0x000061E2, 0x00000A13, 0x000500A6, 0x00000009,\n    0x00003B23, 0x00005376, 0x00004CB6, 0x000300F7, 0x0000362B, 0x00000000,\n    0x000400FA, 0x00003B23, 0x00002B38, 0x0000362B, 0x000200F8, 0x00002B38,\n    0x000500C4, 0x00000017, 0x00005E17, 0x00005879, 0x000002ED, 0x000500C2,\n    0x00000017, 0x00003BE7, 0x00005879, 0x000002ED, 0x000500C5, 0x00000017,\n    0x000029E8, 0x00005E17, 0x00003BE7, 0x000200F9, 0x0000362B, 0x000200F8,\n    0x0000362B, 0x000700F5, 0x00000017, 0x000040C2, 0x00005879, 0x00003463,\n    0x000029E8, 0x00002B38, 0x000500C2, 0x0000000B, 0x0000219B, 0x000038F6,\n    0x00000A17, 0x00060041, 0x00000294, 0x000036B5, 0x0000140E, 0x00000A0B,\n    0x0000219B, 0x0003003E, 0x000036B5, 0x000040C2, 0x00050080, 0x0000000B,\n    0x000054B5, 0x000038F6, 0x00000A3A, 0x000300F7, 0x00006070, 0x00000002,\n    0x000400FA, 0x00004376, 0x000055E9, 0x00001C25, 0x000200F8, 0x000055E9,\n    0x000200F9, 0x00006070, 0x000200F8, 0x00001C25, 0x000200F9, 0x00006070,\n    0x000200F8, 0x00006070, 0x000700F5, 0x0000000B, 0x00002C71, 0x00000A6A,\n    0x000055E9, 0x00000A3A, 0x00001C25, 0x00050080, 0x0000000B, 0x000048BE,\n    0x000048BD, 0x00002C71, 0x000500C2, 0x0000000B, 0x00003D53, 0x000048BE,\n    0x00000A17, 0x00060041, 0x00000294, 0x00005566, 0x0000107A, 0x00000A0B,\n    0x00003D53, 0x0004003D, 0x00000017, 0x00003910, 0x00005566, 0x000300F7,\n    0x00003A1A, 0x00000000, 0x000400FA, 0x00005686, 0x00002958, 0x00003A1A,\n    0x000200F8, 0x00002958, 0x000500C7, 0x00000017, 0x00004760, 0x00003910,\n    0x000009CE, 0x000500C4, 0x00000017, 0x000024D2, 0x00004760, 0x0000013D,\n    0x000500C7, 0x00000017, 0x000050AD, 0x00003910, 0x0000072E, 0x000500C2,\n    0x00000017, 0x0000448E, 0x000050AD, 0x0000013D, 0x000500C5, 0x00000017,\n    0x00003FF9, 0x000024D2, 0x0000448E, 0x000200F9, 0x00003A1A, 0x000200F8,\n    0x00003A1A, 0x000700F5, 0x00000017, 0x00002AAC, 0x00003910, 0x00006070,\n    0x00003FF9, 0x00002958, 0x000300F7, 0x0000362C, 0x00000000, 0x000400FA,\n    0x00003B23, 0x00002B39, 0x0000362C, 0x000200F8, 0x00002B39, 0x000500C4,\n    0x00000017, 0x00005E18, 0x00002AAC, 0x000002ED, 0x000500C2, 0x00000017,\n    0x00003BE8, 0x00002AAC, 0x000002ED, 0x000500C5, 0x00000017, 0x000029E9,\n    0x00005E18, 0x00003BE8, 0x000200F9, 0x0000362C, 0x000200F8, 0x0000362C,\n    0x000700F5, 0x00000017, 0x000040C3, 0x00002AAC, 0x00003A1A, 0x000029E9,\n    0x00002B39, 0x000500C2, 0x0000000B, 0x0000219C, 0x000054B5, 0x00000A17,\n    0x00060041, 0x00000294, 0x00003FB0, 0x0000140E, 0x00000A0B, 0x0000219C,\n    0x0003003E, 0x00003FB0, 0x000040C3, 0x000200F9, 0x00004C7A, 0x000200F8,\n    0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_32bpb_scaled_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25157\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n     %v4uint = OpTypeVector %uint 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v3uint = OpTypeVector %uint 3\n     %uint_1 = OpConstant %uint 1\n     %uint_2 = OpConstant %uint 2\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n     %uint_3 = OpConstant %uint 3\n    %uint_16 = OpConstant %uint 16\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n     %uint_0 = OpConstant %uint 0\n      %int_3 = OpConstant %int 3\n      %int_2 = OpConstant %int 2\n     %uint_4 = OpConstant %uint 4\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n     %uint_7 = OpConstant %uint 7\n       %1927 = OpConstantComposite %v2uint %uint_4 %uint_7\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %2603 = OpConstantComposite %v3uint %uint_3 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n    %uint_32 = OpConstant %uint 32\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %1954 = OpConstantComposite %v2uint %uint_7 %uint_7\n       %1855 = OpConstantComposite %v2uint %uint_4 %uint_1\n     %uint_6 = OpConstant %uint 6\n    %uint_15 = OpConstant %uint 15\n       %1955 = OpConstantComposite %v2uint %uint_15 %uint_1\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24445 = OpBitwiseAnd %uint %13606 %uint_2\n      %18667 = OpINotEqual %bool %24445 %uint_0\n       %8141 = OpShiftRightLogical %uint %13606 %uint_2\n      %24990 = OpBitwiseAnd %uint %8141 %uint_3\n       %8871 = OpCompositeConstruct %v2uint %13606 %13606\n       %7087 = OpShiftRightLogical %v2uint %8871 %1927\n       %6551 = OpBitwiseAnd %v2uint %7087 %1954\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2603\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %6586 DontFlatten\n               OpBranchConditional %24679 %21992 %6586\n      %21992 = OpLabel\n               OpBranch %19578\n       %6586 = OpLabel\n      %23478 = OpBitcast %v3int %21387\n      %18710 = OpCompositeExtract %uint %22410 1\n      %23531 = OpCompositeExtract %int %23478 0\n      %22810 = OpIMul %int %23531 %int_4\n       %6362 = OpCompositeExtract %int %23478 2\n      %14505 = OpBitcast %int %18710\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %23478 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %6594\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %22810 %24535\n      %10898 = OpBitcast %uint %8258\n       %7937 = OpIAdd %uint %22411 %10898\n      %19921 = OpShiftRightLogical %v2uint %17136 %1855\n       %7712 = OpUDiv %v2uint %19921 %6551\n      %18183 = OpIMul %v2uint %6551 %7712\n      %18273 = OpISub %v2uint %19921 %18183\n      %11232 = OpShiftLeftLogical %v2uint %7712 %1855\n      %13284 = OpCompositeExtract %uint %18273 0\n      %10872 = OpCompositeExtract %uint %6551 1\n      %22886 = OpIMul %uint %13284 %10872\n       %6943 = OpCompositeExtract %uint %18273 1\n      %10469 = OpIAdd %uint %22886 %6943\n      %18851 = OpBitwiseAnd %v2uint %17136 %1955\n      %10581 = OpShiftLeftLogical %uint %10469 %uint_7\n      %20916 = OpCompositeExtract %uint %18851 1\n      %23596 = OpShiftLeftLogical %uint %20916 %uint_6\n      %19814 = OpBitwiseOr %uint %10581 %23596\n      %21476 = OpCompositeExtract %uint %18851 0\n       %8560 = OpShiftLeftLogical %uint %21476 %uint_2\n      %17648 = OpBitwiseOr %uint %19814 %8560\n      %19923 = OpCompositeExtract %uint %11232 0\n      %15556 = OpCompositeInsert %v3uint %19923 %21387 0\n      %23006 = OpCompositeExtract %uint %11232 1\n       %9680 = OpCompositeInsert %v3uint %23006 %15556 1\n               OpSelectionMerge %20344 DontFlatten\n               OpBranchConditional %18667 %23520 %11737\n      %23520 = OpLabel\n      %10111 = OpBitcast %v3int %9680\n      %19476 = OpShiftRightLogical %uint %22408 %int_5\n      %18810 = OpShiftRightLogical %uint %22409 %int_4\n       %6782 = OpCompositeExtract %int %10111 2\n      %12089 = OpShiftRightArithmetic %int %6782 %int_2\n      %22400 = OpBitcast %int %18810\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %10111 1\n      %19055 = OpShiftRightArithmetic %int %25154 %int_4\n      %11052 = OpIAdd %int %7938 %19055\n      %16898 = OpBitcast %int %19476\n      %14944 = OpIMul %int %11052 %16898\n      %25155 = OpCompositeExtract %int %10111 0\n      %20423 = OpShiftRightArithmetic %int %25155 %int_5\n      %18940 = OpIAdd %int %14944 %20423\n       %8797 = OpShiftLeftLogical %int %18940 %int_7\n      %11434 = OpBitwiseAnd %int %6782 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %25154 %int_1\n      %21364 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21364 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %25155 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17334 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17334 %uint_2\n      %13015 = OpShiftRightArithmetic %int %25154 %int_3\n       %9929 = OpBitwiseXor %int %13015 %12089\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %25155 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %25154 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6552 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6552\n       %7168 = OpShiftLeftLogical %int %16793 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24144 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24144 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24144 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24144 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %20344\n      %11737 = OpLabel\n      %11908 = OpVectorShuffle %v2uint %9680 %9680 0 1\n      %20347 = OpBitcast %v2int %11908\n      %11433 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %20347 1\n      %12090 = OpShiftRightArithmetic %int %14597 %int_5\n      %22401 = OpBitcast %int %11433\n       %7939 = OpIMul %int %12090 %22401\n      %25156 = OpCompositeExtract %int %20347 0\n      %20424 = OpShiftRightArithmetic %int %25156 %int_5\n      %18864 = OpIAdd %int %7939 %20424\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25156 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17335 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17335 %uint_2\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25156 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6553 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6553\n       %7169 = OpShiftLeftLogical %int %21575 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24163 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24163 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24163 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %20344\n      %20344 = OpLabel\n      %18329 = OpPhi %uint %16869 %23520 %16870 %11737\n      %15200 = OpCompositeExtract %uint %6551 0\n      %17489 = OpIMul %uint %15200 %10872\n       %7313 = OpIMul %uint %18329 %17489\n       %8815 = OpIAdd %uint %7313 %17648\n      %21470 = OpIAdd %uint %8815 %24236\n      %14664 = OpShiftRightLogical %uint %21470 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %14664\n       %7338 = OpLoad %v4uint %20399\n      %13760 = OpIEqual %bool %24990 %uint_1\n      %21366 = OpIEqual %bool %24990 %uint_2\n      %22150 = OpLogicalOr %bool %13760 %21366\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %7338 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %7338 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22649 = OpPhi %v4uint %7338 %20344 %16376 %10583\n      %19638 = OpIEqual %bool %24990 %uint_3\n      %15139 = OpLogicalOr %bool %21366 %19638\n               OpSelectionMerge %13867 None\n               OpBranchConditional %15139 %11064 %13867\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22649 %749\n      %15335 = OpShiftRightLogical %v4uint %22649 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %13867\n      %13867 = OpLabel\n      %16578 = OpPhi %v4uint %22649 %13411 %10728 %11064\n       %8603 = OpShiftRightLogical %uint %7937 %int_4\n      %14005 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %8603\n               OpStore %14005 %16578\n      %22137 = OpIAdd %uint %7937 %uint_16\n      %10214 = OpIAdd %uint %21470 %uint_16\n      %14665 = OpShiftRightLogical %uint %10214 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %14665\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %14874 None\n               OpBranchConditional %22150 %10584 %14874\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %14874\n      %14874 = OpLabel\n      %10924 = OpPhi %v4uint %14608 %13867 %16377 %10584\n               OpSelectionMerge %13868 None\n               OpBranchConditional %15139 %11065 %13868\n      %11065 = OpLabel\n      %24088 = OpShiftLeftLogical %v4uint %10924 %749\n      %15336 = OpShiftRightLogical %v4uint %10924 %749\n      %10729 = OpBitwiseOr %v4uint %24088 %15336\n               OpBranch %13868\n      %13868 = OpLabel\n      %16579 = OpPhi %v4uint %10924 %14874 %10729 %11065\n       %8604 = OpShiftRightLogical %uint %22137 %int_4\n      %16304 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %8604\n               OpStore %16304 %16579\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_32bpb_scaled_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006245, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000017,\n    0x0000000B, 0x00000004, 0x00040015, 0x0000000C, 0x00000020, 0x00000001,\n    0x00040017, 0x00000012, 0x0000000C, 0x00000002, 0x00040017, 0x00000016,\n    0x0000000C, 0x00000003, 0x00020014, 0x00000009, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001,\n    0x0004002B, 0x0000000B, 0x00000A10, 0x00000002, 0x0004002B, 0x0000000B,\n    0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B, 0x00000A22, 0x00000008,\n    0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00, 0x0004002B, 0x0000000B,\n    0x00000A13, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A3A, 0x00000010,\n    0x0004002B, 0x0000000C, 0x00000A17, 0x00000004, 0x0004002B, 0x0000000C,\n    0x00000A1D, 0x00000006, 0x0004002B, 0x0000000C, 0x00000A2C, 0x0000000B,\n    0x0004002B, 0x0000000C, 0x00000A38, 0x0000000F, 0x0004002B, 0x0000000C,\n    0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C, 0x00000A1A, 0x00000005,\n    0x0004002B, 0x0000000C, 0x00000A20, 0x00000007, 0x0004002B, 0x0000000C,\n    0x00000A23, 0x00000008, 0x0004002B, 0x0000000C, 0x00000A2F, 0x0000000C,\n    0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000, 0x0004002B, 0x0000000C,\n    0x00000A14, 0x00000003, 0x0004002B, 0x0000000C, 0x00000A11, 0x00000002,\n    0x0004002B, 0x0000000B, 0x00000A16, 0x00000004, 0x0004002B, 0x0000000C,\n    0x00000A0B, 0x00000000, 0x000A001E, 0x00000489, 0x0000000B, 0x0000000B,\n    0x0000000B, 0x0000000B, 0x00000014, 0x0000000B, 0x0000000B, 0x0000000B,\n    0x00040020, 0x00000706, 0x00000009, 0x00000489, 0x0004003B, 0x00000706,\n    0x00000CE9, 0x00000009, 0x00040020, 0x00000288, 0x00000009, 0x0000000B,\n    0x0004002B, 0x0000000B, 0x00000A1F, 0x00000007, 0x0005002C, 0x00000011,\n    0x00000787, 0x00000A16, 0x00000A1F, 0x00040020, 0x00000291, 0x00000009,\n    0x00000014, 0x00040020, 0x00000292, 0x00000001, 0x00000014, 0x0004003B,\n    0x00000292, 0x00000F48, 0x00000001, 0x0006002C, 0x00000014, 0x00000A2B,\n    0x00000A13, 0x00000A0A, 0x00000A0A, 0x00040017, 0x0000000F, 0x00000009,\n    0x00000002, 0x0003001D, 0x000007DC, 0x00000017, 0x0003001E, 0x000007B4,\n    0x000007DC, 0x00040020, 0x00000A31, 0x00000002, 0x000007B4, 0x0004003B,\n    0x00000A31, 0x0000107A, 0x00000002, 0x00040020, 0x00000294, 0x00000002,\n    0x00000017, 0x0003001D, 0x000007DD, 0x00000017, 0x0003001E, 0x000007B5,\n    0x000007DD, 0x00040020, 0x00000A32, 0x00000002, 0x000007B5, 0x0004003B,\n    0x00000A32, 0x0000140E, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A6A,\n    0x00000020, 0x0006002C, 0x00000014, 0x00000BC3, 0x00000A16, 0x00000A6A,\n    0x00000A0D, 0x0005002C, 0x00000011, 0x000007A2, 0x00000A1F, 0x00000A1F,\n    0x0005002C, 0x00000011, 0x0000073F, 0x00000A16, 0x00000A0D, 0x0004002B,\n    0x0000000B, 0x00000A1C, 0x00000006, 0x0004002B, 0x0000000B, 0x00000A37,\n    0x0000000F, 0x0005002C, 0x00000011, 0x000007A3, 0x00000A37, 0x00000A0D,\n    0x0007002C, 0x00000017, 0x000009CE, 0x000008A6, 0x000008A6, 0x000008A6,\n    0x000008A6, 0x0007002C, 0x00000017, 0x0000013D, 0x00000A22, 0x00000A22,\n    0x00000A22, 0x00000A22, 0x0007002C, 0x00000017, 0x0000072E, 0x000005FD,\n    0x000005FD, 0x000005FD, 0x000005FD, 0x0007002C, 0x00000017, 0x000002ED,\n    0x00000A3A, 0x00000A3A, 0x00000A3A, 0x00000A3A, 0x00050036, 0x00000008,\n    0x0000161F, 0x00000000, 0x00000502, 0x000200F8, 0x00003B06, 0x000300F7,\n    0x00004C7A, 0x00000000, 0x000300FB, 0x00000A0A, 0x00002E68, 0x000200F8,\n    0x00002E68, 0x00050041, 0x00000288, 0x000060D7, 0x00000CE9, 0x00000A0B,\n    0x0004003D, 0x0000000B, 0x00003526, 0x000060D7, 0x000500C7, 0x0000000B,\n    0x00005F7D, 0x00003526, 0x00000A10, 0x000500AB, 0x00000009, 0x000048EB,\n    0x00005F7D, 0x00000A0A, 0x000500C2, 0x0000000B, 0x00001FCD, 0x00003526,\n    0x00000A10, 0x000500C7, 0x0000000B, 0x0000619E, 0x00001FCD, 0x00000A13,\n    0x00050050, 0x00000011, 0x000022A7, 0x00003526, 0x00003526, 0x000500C2,\n    0x00000011, 0x00001BAF, 0x000022A7, 0x00000787, 0x000500C7, 0x00000011,\n    0x00001997, 0x00001BAF, 0x000007A2, 0x00050041, 0x00000288, 0x0000492C,\n    0x00000CE9, 0x00000A0E, 0x0004003D, 0x0000000B, 0x00005EAC, 0x0000492C,\n    0x00050041, 0x00000288, 0x00004EBA, 0x00000CE9, 0x00000A11, 0x0004003D,\n    0x0000000B, 0x00005788, 0x00004EBA, 0x00050041, 0x00000288, 0x00004EBB,\n    0x00000CE9, 0x00000A14, 0x0004003D, 0x0000000B, 0x00005789, 0x00004EBB,\n    0x00050041, 0x00000291, 0x00004EBC, 0x00000CE9, 0x00000A17, 0x0004003D,\n    0x00000014, 0x0000578A, 0x00004EBC, 0x00050041, 0x00000288, 0x00004EBD,\n    0x00000CE9, 0x00000A1A, 0x0004003D, 0x0000000B, 0x0000578B, 0x00004EBD,\n    0x00050041, 0x00000288, 0x00004E6E, 0x00000CE9, 0x00000A1D, 0x0004003D,\n    0x0000000B, 0x000019C2, 0x00004E6E, 0x0004003D, 0x00000014, 0x00002A0E,\n    0x00000F48, 0x000500C4, 0x00000014, 0x0000538B, 0x00002A0E, 0x00000A2B,\n    0x0007004F, 0x00000011, 0x000042F0, 0x0000538B, 0x0000538B, 0x00000000,\n    0x00000001, 0x0007004F, 0x00000011, 0x0000242F, 0x0000578A, 0x0000578A,\n    0x00000000, 0x00000001, 0x000500AE, 0x0000000F, 0x00004288, 0x000042F0,\n    0x0000242F, 0x0004009A, 0x00000009, 0x00006067, 0x00004288, 0x000300F7,\n    0x000019BA, 0x00000002, 0x000400FA, 0x00006067, 0x000055E8, 0x000019BA,\n    0x000200F8, 0x000055E8, 0x000200F9, 0x00004C7A, 0x000200F8, 0x000019BA,\n    0x0004007C, 0x00000016, 0x00005BB6, 0x0000538B, 0x00050051, 0x0000000B,\n    0x00004916, 0x0000578A, 0x00000001, 0x00050051, 0x0000000C, 0x00005BEB,\n    0x00005BB6, 0x00000000, 0x00050084, 0x0000000C, 0x0000591A, 0x00005BEB,\n    0x00000A17, 0x00050051, 0x0000000C, 0x000018DA, 0x00005BB6, 0x00000002,\n    0x0004007C, 0x0000000C, 0x000038A9, 0x00004916, 0x00050084, 0x0000000C,\n    0x00002C0F, 0x000018DA, 0x000038A9, 0x00050051, 0x0000000C, 0x000044BE,\n    0x00005BB6, 0x00000001, 0x00050080, 0x0000000C, 0x000056D4, 0x00002C0F,\n    0x000044BE, 0x0004007C, 0x0000000C, 0x00005785, 0x000019C2, 0x00050084,\n    0x0000000C, 0x00005FD7, 0x000056D4, 0x00005785, 0x00050080, 0x0000000C,\n    0x00002042, 0x0000591A, 0x00005FD7, 0x0004007C, 0x0000000B, 0x00002A92,\n    0x00002042, 0x00050080, 0x0000000B, 0x00001F01, 0x0000578B, 0x00002A92,\n    0x000500C2, 0x00000011, 0x00004DD1, 0x000042F0, 0x0000073F, 0x00050086,\n    0x00000011, 0x00001E20, 0x00004DD1, 0x00001997, 0x00050084, 0x00000011,\n    0x00004707, 0x00001997, 0x00001E20, 0x00050082, 0x00000011, 0x00004761,\n    0x00004DD1, 0x00004707, 0x000500C4, 0x00000011, 0x00002BE0, 0x00001E20,\n    0x0000073F, 0x00050051, 0x0000000B, 0x000033E4, 0x00004761, 0x00000000,\n    0x00050051, 0x0000000B, 0x00002A78, 0x00001997, 0x00000001, 0x00050084,\n    0x0000000B, 0x00005966, 0x000033E4, 0x00002A78, 0x00050051, 0x0000000B,\n    0x00001B1F, 0x00004761, 0x00000001, 0x00050080, 0x0000000B, 0x000028E5,\n    0x00005966, 0x00001B1F, 0x000500C7, 0x00000011, 0x000049A3, 0x000042F0,\n    0x000007A3, 0x000500C4, 0x0000000B, 0x00002955, 0x000028E5, 0x00000A1F,\n    0x00050051, 0x0000000B, 0x000051B4, 0x000049A3, 0x00000001, 0x000500C4,\n    0x0000000B, 0x00005C2C, 0x000051B4, 0x00000A1C, 0x000500C5, 0x0000000B,\n    0x00004D66, 0x00002955, 0x00005C2C, 0x00050051, 0x0000000B, 0x000053E4,\n    0x000049A3, 0x00000000, 0x000500C4, 0x0000000B, 0x00002170, 0x000053E4,\n    0x00000A10, 0x000500C5, 0x0000000B, 0x000044F0, 0x00004D66, 0x00002170,\n    0x00050051, 0x0000000B, 0x00004DD3, 0x00002BE0, 0x00000000, 0x00060052,\n    0x00000014, 0x00003CC4, 0x00004DD3, 0x0000538B, 0x00000000, 0x00050051,\n    0x0000000B, 0x000059DE, 0x00002BE0, 0x00000001, 0x00060052, 0x00000014,\n    0x000025D0, 0x000059DE, 0x00003CC4, 0x00000001, 0x000300F7, 0x00004F78,\n    0x00000002, 0x000400FA, 0x000048EB, 0x00005BE0, 0x00002DD9, 0x000200F8,\n    0x00005BE0, 0x0004007C, 0x00000016, 0x0000277F, 0x000025D0, 0x000500C2,\n    0x0000000B, 0x00004C14, 0x00005788, 0x00000A1A, 0x000500C2, 0x0000000B,\n    0x0000497A, 0x00005789, 0x00000A17, 0x00050051, 0x0000000C, 0x00001A7E,\n    0x0000277F, 0x00000002, 0x000500C3, 0x0000000C, 0x00002F39, 0x00001A7E,\n    0x00000A11, 0x0004007C, 0x0000000C, 0x00005780, 0x0000497A, 0x00050084,\n    0x0000000C, 0x00001F02, 0x00002F39, 0x00005780, 0x00050051, 0x0000000C,\n    0x00006242, 0x0000277F, 0x00000001, 0x000500C3, 0x0000000C, 0x00004A6F,\n    0x00006242, 0x00000A17, 0x00050080, 0x0000000C, 0x00002B2C, 0x00001F02,\n    0x00004A6F, 0x0004007C, 0x0000000C, 0x00004202, 0x00004C14, 0x00050084,\n    0x0000000C, 0x00003A60, 0x00002B2C, 0x00004202, 0x00050051, 0x0000000C,\n    0x00006243, 0x0000277F, 0x00000000, 0x000500C3, 0x0000000C, 0x00004FC7,\n    0x00006243, 0x00000A1A, 0x00050080, 0x0000000C, 0x000049FC, 0x00003A60,\n    0x00004FC7, 0x000500C4, 0x0000000C, 0x0000225D, 0x000049FC, 0x00000A20,\n    0x000500C7, 0x0000000C, 0x00002CAA, 0x00001A7E, 0x00000A14, 0x000500C4,\n    0x0000000C, 0x00004CAE, 0x00002CAA, 0x00000A1A, 0x000500C3, 0x0000000C,\n    0x0000383E, 0x00006242, 0x00000A0E, 0x000500C7, 0x0000000C, 0x00005374,\n    0x0000383E, 0x00000A14, 0x000500C4, 0x0000000C, 0x000054CA, 0x00005374,\n    0x00000A14, 0x000500C5, 0x0000000C, 0x000042CE, 0x00004CAE, 0x000054CA,\n    0x000500C7, 0x0000000C, 0x000050D5, 0x00006243, 0x00000A20, 0x000500C5,\n    0x0000000C, 0x00003ADD, 0x000042CE, 0x000050D5, 0x000500C5, 0x0000000C,\n    0x000043B6, 0x0000225D, 0x00003ADD, 0x000500C4, 0x0000000C, 0x00005E50,\n    0x000043B6, 0x00000A10, 0x000500C3, 0x0000000C, 0x000032D7, 0x00006242,\n    0x00000A14, 0x000500C6, 0x0000000C, 0x000026C9, 0x000032D7, 0x00002F39,\n    0x000500C7, 0x0000000C, 0x00004199, 0x000026C9, 0x00000A0E, 0x000500C3,\n    0x0000000C, 0x00002590, 0x00006243, 0x00000A14, 0x000500C7, 0x0000000C,\n    0x0000505E, 0x00002590, 0x00000A14, 0x000500C4, 0x0000000C, 0x0000541D,\n    0x00004199, 0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BA, 0x0000505E,\n    0x0000541D, 0x000500C7, 0x0000000C, 0x00005076, 0x00006242, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x00005228, 0x00005076, 0x00000A17, 0x000500C4,\n    0x0000000C, 0x00001998, 0x000022BA, 0x00000A1D, 0x000500C5, 0x0000000C,\n    0x000047FE, 0x00005228, 0x00001998, 0x000500C4, 0x0000000C, 0x00001C00,\n    0x00004199, 0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C81, 0x000047FE,\n    0x00001C00, 0x000500C7, 0x0000000C, 0x000050AF, 0x00005E50, 0x00000A38,\n    0x000500C5, 0x0000000C, 0x00003C70, 0x00003C81, 0x000050AF, 0x000500C3,\n    0x0000000C, 0x00003745, 0x00005E50, 0x00000A17, 0x000500C7, 0x0000000C,\n    0x000018B8, 0x00003745, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000547E,\n    0x000018B8, 0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A8, 0x00003C70,\n    0x0000547E, 0x000500C3, 0x0000000C, 0x00003A6E, 0x00005E50, 0x00000A1A,\n    0x000500C7, 0x0000000C, 0x000018B9, 0x00003A6E, 0x00000A20, 0x000500C4,\n    0x0000000C, 0x0000547F, 0x000018B9, 0x00000A23, 0x000500C5, 0x0000000C,\n    0x0000456F, 0x000045A8, 0x0000547F, 0x000500C3, 0x0000000C, 0x00003C88,\n    0x00005E50, 0x00000A23, 0x000500C4, 0x0000000C, 0x00002824, 0x00003C88,\n    0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B79, 0x0000456F, 0x00002824,\n    0x0004007C, 0x0000000B, 0x000041E5, 0x00003B79, 0x000200F9, 0x00004F78,\n    0x000200F8, 0x00002DD9, 0x0007004F, 0x00000011, 0x00002E84, 0x000025D0,\n    0x000025D0, 0x00000000, 0x00000001, 0x0004007C, 0x00000012, 0x00004F7B,\n    0x00002E84, 0x000500C2, 0x0000000B, 0x00002CA9, 0x00005788, 0x00000A1A,\n    0x00050051, 0x0000000C, 0x00003905, 0x00004F7B, 0x00000001, 0x000500C3,\n    0x0000000C, 0x00002F3A, 0x00003905, 0x00000A1A, 0x0004007C, 0x0000000C,\n    0x00005781, 0x00002CA9, 0x00050084, 0x0000000C, 0x00001F03, 0x00002F3A,\n    0x00005781, 0x00050051, 0x0000000C, 0x00006244, 0x00004F7B, 0x00000000,\n    0x000500C3, 0x0000000C, 0x00004FC8, 0x00006244, 0x00000A1A, 0x00050080,\n    0x0000000C, 0x000049B0, 0x00001F03, 0x00004FC8, 0x000500C4, 0x0000000C,\n    0x0000254A, 0x000049B0, 0x00000A1D, 0x000500C3, 0x0000000C, 0x0000603B,\n    0x00003905, 0x00000A0E, 0x000500C7, 0x0000000C, 0x0000539A, 0x0000603B,\n    0x00000A20, 0x000500C4, 0x0000000C, 0x0000534A, 0x0000539A, 0x00000A14,\n    0x000500C7, 0x0000000C, 0x00004EA5, 0x00006244, 0x00000A20, 0x000500C5,\n    0x0000000C, 0x00002B1A, 0x0000534A, 0x00004EA5, 0x000500C5, 0x0000000C,\n    0x000043B7, 0x0000254A, 0x00002B1A, 0x000500C4, 0x0000000C, 0x00005E63,\n    0x000043B7, 0x00000A10, 0x000500C3, 0x0000000C, 0x000031DE, 0x00003905,\n    0x00000A17, 0x000500C7, 0x0000000C, 0x00005447, 0x000031DE, 0x00000A0E,\n    0x000500C3, 0x0000000C, 0x000028A6, 0x00006244, 0x00000A14, 0x000500C7,\n    0x0000000C, 0x0000511E, 0x000028A6, 0x00000A14, 0x000500C3, 0x0000000C,\n    0x000028B9, 0x00003905, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000505F,\n    0x000028B9, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000541E, 0x0000505F,\n    0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BB, 0x0000511E, 0x0000541E,\n    0x000500C7, 0x0000000C, 0x00005077, 0x00003905, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x00005229, 0x00005077, 0x00000A17, 0x000500C4, 0x0000000C,\n    0x00001999, 0x000022BB, 0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FF,\n    0x00005229, 0x00001999, 0x000500C4, 0x0000000C, 0x00001C01, 0x00005447,\n    0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C82, 0x000047FF, 0x00001C01,\n    0x000500C7, 0x0000000C, 0x000050B0, 0x00005E63, 0x00000A38, 0x000500C5,\n    0x0000000C, 0x00003C71, 0x00003C82, 0x000050B0, 0x000500C3, 0x0000000C,\n    0x00003746, 0x00005E63, 0x00000A17, 0x000500C7, 0x0000000C, 0x000018BA,\n    0x00003746, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005480, 0x000018BA,\n    0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A9, 0x00003C71, 0x00005480,\n    0x000500C3, 0x0000000C, 0x00003A6F, 0x00005E63, 0x00000A1A, 0x000500C7,\n    0x0000000C, 0x000018BB, 0x00003A6F, 0x00000A20, 0x000500C4, 0x0000000C,\n    0x00005481, 0x000018BB, 0x00000A23, 0x000500C5, 0x0000000C, 0x00004570,\n    0x000045A9, 0x00005481, 0x000500C3, 0x0000000C, 0x00003C89, 0x00005E63,\n    0x00000A23, 0x000500C4, 0x0000000C, 0x00002825, 0x00003C89, 0x00000A2F,\n    0x000500C5, 0x0000000C, 0x00003B7A, 0x00004570, 0x00002825, 0x0004007C,\n    0x0000000B, 0x000041E6, 0x00003B7A, 0x000200F9, 0x00004F78, 0x000200F8,\n    0x00004F78, 0x000700F5, 0x0000000B, 0x00004799, 0x000041E5, 0x00005BE0,\n    0x000041E6, 0x00002DD9, 0x00050051, 0x0000000B, 0x00003B60, 0x00001997,\n    0x00000000, 0x00050084, 0x0000000B, 0x00004451, 0x00003B60, 0x00002A78,\n    0x00050084, 0x0000000B, 0x00001C91, 0x00004799, 0x00004451, 0x00050080,\n    0x0000000B, 0x0000226F, 0x00001C91, 0x000044F0, 0x00050080, 0x0000000B,\n    0x000053DE, 0x0000226F, 0x00005EAC, 0x000500C2, 0x0000000B, 0x00003948,\n    0x000053DE, 0x00000A17, 0x00060041, 0x00000294, 0x00004FAF, 0x0000107A,\n    0x00000A0B, 0x00003948, 0x0004003D, 0x00000017, 0x00001CAA, 0x00004FAF,\n    0x000500AA, 0x00000009, 0x000035C0, 0x0000619E, 0x00000A0D, 0x000500AA,\n    0x00000009, 0x00005376, 0x0000619E, 0x00000A10, 0x000500A6, 0x00000009,\n    0x00005686, 0x000035C0, 0x00005376, 0x000300F7, 0x00003463, 0x00000000,\n    0x000400FA, 0x00005686, 0x00002957, 0x00003463, 0x000200F8, 0x00002957,\n    0x000500C7, 0x00000017, 0x0000475F, 0x00001CAA, 0x000009CE, 0x000500C4,\n    0x00000017, 0x000024D1, 0x0000475F, 0x0000013D, 0x000500C7, 0x00000017,\n    0x000050AC, 0x00001CAA, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448D,\n    0x000050AC, 0x0000013D, 0x000500C5, 0x00000017, 0x00003FF8, 0x000024D1,\n    0x0000448D, 0x000200F9, 0x00003463, 0x000200F8, 0x00003463, 0x000700F5,\n    0x00000017, 0x00005879, 0x00001CAA, 0x00004F78, 0x00003FF8, 0x00002957,\n    0x000500AA, 0x00000009, 0x00004CB6, 0x0000619E, 0x00000A13, 0x000500A6,\n    0x00000009, 0x00003B23, 0x00005376, 0x00004CB6, 0x000300F7, 0x0000362B,\n    0x00000000, 0x000400FA, 0x00003B23, 0x00002B38, 0x0000362B, 0x000200F8,\n    0x00002B38, 0x000500C4, 0x00000017, 0x00005E17, 0x00005879, 0x000002ED,\n    0x000500C2, 0x00000017, 0x00003BE7, 0x00005879, 0x000002ED, 0x000500C5,\n    0x00000017, 0x000029E8, 0x00005E17, 0x00003BE7, 0x000200F9, 0x0000362B,\n    0x000200F8, 0x0000362B, 0x000700F5, 0x00000017, 0x000040C2, 0x00005879,\n    0x00003463, 0x000029E8, 0x00002B38, 0x000500C2, 0x0000000B, 0x0000219B,\n    0x00001F01, 0x00000A17, 0x00060041, 0x00000294, 0x000036B5, 0x0000140E,\n    0x00000A0B, 0x0000219B, 0x0003003E, 0x000036B5, 0x000040C2, 0x00050080,\n    0x0000000B, 0x00005679, 0x00001F01, 0x00000A3A, 0x00050080, 0x0000000B,\n    0x000027E6, 0x000053DE, 0x00000A3A, 0x000500C2, 0x0000000B, 0x00003949,\n    0x000027E6, 0x00000A17, 0x00060041, 0x00000294, 0x00005566, 0x0000107A,\n    0x00000A0B, 0x00003949, 0x0004003D, 0x00000017, 0x00003910, 0x00005566,\n    0x000300F7, 0x00003A1A, 0x00000000, 0x000400FA, 0x00005686, 0x00002958,\n    0x00003A1A, 0x000200F8, 0x00002958, 0x000500C7, 0x00000017, 0x00004760,\n    0x00003910, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D2, 0x00004760,\n    0x0000013D, 0x000500C7, 0x00000017, 0x000050AD, 0x00003910, 0x0000072E,\n    0x000500C2, 0x00000017, 0x0000448E, 0x000050AD, 0x0000013D, 0x000500C5,\n    0x00000017, 0x00003FF9, 0x000024D2, 0x0000448E, 0x000200F9, 0x00003A1A,\n    0x000200F8, 0x00003A1A, 0x000700F5, 0x00000017, 0x00002AAC, 0x00003910,\n    0x0000362B, 0x00003FF9, 0x00002958, 0x000300F7, 0x0000362C, 0x00000000,\n    0x000400FA, 0x00003B23, 0x00002B39, 0x0000362C, 0x000200F8, 0x00002B39,\n    0x000500C4, 0x00000017, 0x00005E18, 0x00002AAC, 0x000002ED, 0x000500C2,\n    0x00000017, 0x00003BE8, 0x00002AAC, 0x000002ED, 0x000500C5, 0x00000017,\n    0x000029E9, 0x00005E18, 0x00003BE8, 0x000200F9, 0x0000362C, 0x000200F8,\n    0x0000362C, 0x000700F5, 0x00000017, 0x000040C3, 0x00002AAC, 0x00003A1A,\n    0x000029E9, 0x00002B39, 0x000500C2, 0x0000000B, 0x0000219C, 0x00005679,\n    0x00000A17, 0x00060041, 0x00000294, 0x00003FB0, 0x0000140E, 0x00000A0B,\n    0x0000219C, 0x0003003E, 0x00003FB0, 0x000040C3, 0x000200F9, 0x00004C7A,\n    0x000200F8, 0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_64bpb_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25155\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v4uint = OpTypeVector %uint 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v2uint = OpTypeVector %uint 2\n     %v3uint = OpTypeVector %uint 3\n     %uint_1 = OpConstant %uint 1\n     %uint_2 = OpConstant %uint 2\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n     %uint_3 = OpConstant %uint 3\n    %uint_16 = OpConstant %uint 16\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n     %uint_0 = OpConstant %uint 0\n      %int_3 = OpConstant %int 3\n      %int_2 = OpConstant %int 2\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %2596 = OpConstantComposite %v3uint %uint_2 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n     %uint_4 = OpConstant %uint 4\n    %uint_32 = OpConstant %uint 32\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24540 = OpBitwiseAnd %uint %13606 %uint_1\n      %17270 = OpINotEqual %bool %24540 %uint_0\n      %12328 = OpBitwiseAnd %uint %13606 %uint_2\n      %17284 = OpINotEqual %bool %12328 %uint_0\n       %7856 = OpShiftRightLogical %uint %13606 %uint_2\n      %25058 = OpBitwiseAnd %uint %7856 %uint_3\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2596\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %6586 DontFlatten\n               OpBranchConditional %24679 %21992 %6586\n      %21992 = OpLabel\n               OpBranch %19578\n       %6586 = OpLabel\n      %23478 = OpBitcast %v3int %21387\n      %18710 = OpCompositeExtract %uint %22410 1\n      %23531 = OpCompositeExtract %int %23478 0\n      %22810 = OpIMul %int %23531 %int_8\n       %6362 = OpCompositeExtract %int %23478 2\n      %14505 = OpBitcast %int %18710\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %23478 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %6594\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %22810 %24535\n      %10404 = OpBitcast %uint %8258\n      %14582 = OpIAdd %uint %22411 %10404\n      %12308 = OpLogicalNot %bool %17270\n               OpSelectionMerge %19040 DontFlatten\n               OpBranchConditional %12308 %9741 %17007\n       %9741 = OpLabel\n      %17463 = OpCompositeExtract %uint %21387 0\n      %11246 = OpCompositeExtract %uint %21387 1\n      %18801 = OpCompositeExtract %uint %21387 2\n      %14831 = OpIMul %uint %22409 %18801\n      %20322 = OpIAdd %uint %11246 %14831\n      %21676 = OpIMul %uint %22408 %20322\n      %20398 = OpIAdd %uint %17463 %21676\n      %11367 = OpShiftLeftLogical %uint %20398 %uint_3\n               OpBranch %19040\n      %17007 = OpLabel\n               OpSelectionMerge %23536 DontFlatten\n               OpBranchConditional %17284 %11410 %24353\n      %11410 = OpLabel\n      %21364 = OpShiftRightLogical %uint %22408 %int_5\n      %13804 = OpShiftRightLogical %uint %22409 %int_4\n      %13237 = OpShiftRightArithmetic %int %6362 %int_2\n      %22374 = OpBitcast %int %13804\n      %25085 = OpIMul %int %13237 %22374\n      %11618 = OpShiftRightArithmetic %int %17598 %int_4\n      %16670 = OpIAdd %int %25085 %11618\n      %19064 = OpBitcast %int %21364\n      %13020 = OpIMul %int %16670 %19064\n      %12986 = OpShiftRightArithmetic %int %23531 %int_5\n      %24558 = OpIAdd %int %13020 %12986\n       %8797 = OpShiftLeftLogical %int %24558 %int_7\n      %11434 = OpBitwiseAnd %int %6362 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %17598 %int_1\n      %21365 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21365 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %23531 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17334 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17334 %uint_3\n      %13015 = OpShiftRightArithmetic %int %17598 %int_3\n       %9929 = OpBitwiseXor %int %13015 %13237\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %23531 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %17598 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6551\n       %7168 = OpShiftLeftLogical %int %16793 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24144 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24144 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24144 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24144 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %23536\n      %24353 = OpLabel\n      %23000 = OpBitcast %v2int %17136\n      %22120 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %23000 1\n      %12089 = OpShiftRightArithmetic %int %14597 %int_5\n      %22400 = OpBitcast %int %22120\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %23000 0\n      %20423 = OpShiftRightArithmetic %int %25154 %int_5\n      %18864 = OpIAdd %int %7938 %20423\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25154 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17335 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17335 %uint_3\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25154 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6552\n       %7169 = OpShiftLeftLogical %int %21575 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24163 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24163 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24163 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %23536\n      %23536 = OpLabel\n      %10540 = OpPhi %uint %16869 %11410 %16870 %24353\n               OpBranch %19040\n      %19040 = OpLabel\n      %11376 = OpPhi %uint %11367 %9741 %10540 %23536\n      %18621 = OpIAdd %uint %11376 %24236\n      %15698 = OpShiftRightLogical %uint %18621 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15698\n       %7338 = OpLoad %v4uint %20399\n      %13760 = OpIEqual %bool %25058 %uint_1\n      %21366 = OpIEqual %bool %25058 %uint_2\n      %22150 = OpLogicalOr %bool %13760 %21366\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %7338 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %7338 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22649 = OpPhi %v4uint %7338 %19040 %16376 %10583\n      %19638 = OpIEqual %bool %25058 %uint_3\n      %15139 = OpLogicalOr %bool %21366 %19638\n               OpSelectionMerge %13867 None\n               OpBranchConditional %15139 %11064 %13867\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22649 %749\n      %15335 = OpShiftRightLogical %v4uint %22649 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %13867\n      %13867 = OpLabel\n      %16578 = OpPhi %v4uint %22649 %13411 %10728 %11064\n       %8603 = OpShiftRightLogical %uint %14582 %int_4\n      %14005 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %8603\n               OpStore %14005 %16578\n      %21685 = OpIAdd %uint %14582 %uint_16\n               OpSelectionMerge %24688 DontFlatten\n               OpBranchConditional %17270 %21993 %7205\n      %21993 = OpLabel\n               OpBranch %24688\n       %7205 = OpLabel\n               OpBranch %24688\n      %24688 = OpLabel\n      %11377 = OpPhi %uint %uint_32 %21993 %uint_16 %7205\n      %18622 = OpIAdd %uint %18621 %11377\n      %15699 = OpShiftRightLogical %uint %18622 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15699\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %14874 None\n               OpBranchConditional %22150 %10584 %14874\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %14874\n      %14874 = OpLabel\n      %10924 = OpPhi %v4uint %14608 %24688 %16377 %10584\n               OpSelectionMerge %13868 None\n               OpBranchConditional %15139 %11065 %13868\n      %11065 = OpLabel\n      %24088 = OpShiftLeftLogical %v4uint %10924 %749\n      %15336 = OpShiftRightLogical %v4uint %10924 %749\n      %10729 = OpBitwiseOr %v4uint %24088 %15336\n               OpBranch %13868\n      %13868 = OpLabel\n      %16579 = OpPhi %v4uint %10924 %14874 %10729 %11065\n       %8604 = OpShiftRightLogical %uint %21685 %int_4\n      %16304 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %8604\n               OpStore %16304 %16579\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_64bpb_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006243, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000017, 0x0000000B, 0x00000004, 0x00040015, 0x0000000C,\n    0x00000020, 0x00000001, 0x00040017, 0x00000012, 0x0000000C, 0x00000002,\n    0x00040017, 0x00000016, 0x0000000C, 0x00000003, 0x00020014, 0x00000009,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001,\n    0x0004002B, 0x0000000B, 0x00000A10, 0x00000002, 0x0004002B, 0x0000000B,\n    0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B, 0x00000A22, 0x00000008,\n    0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00, 0x0004002B, 0x0000000B,\n    0x00000A13, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A3A, 0x00000010,\n    0x0004002B, 0x0000000C, 0x00000A17, 0x00000004, 0x0004002B, 0x0000000C,\n    0x00000A1D, 0x00000006, 0x0004002B, 0x0000000C, 0x00000A2C, 0x0000000B,\n    0x0004002B, 0x0000000C, 0x00000A38, 0x0000000F, 0x0004002B, 0x0000000C,\n    0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C, 0x00000A1A, 0x00000005,\n    0x0004002B, 0x0000000C, 0x00000A20, 0x00000007, 0x0004002B, 0x0000000C,\n    0x00000A23, 0x00000008, 0x0004002B, 0x0000000C, 0x00000A2F, 0x0000000C,\n    0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000, 0x0004002B, 0x0000000C,\n    0x00000A14, 0x00000003, 0x0004002B, 0x0000000C, 0x00000A11, 0x00000002,\n    0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000, 0x000A001E, 0x00000489,\n    0x0000000B, 0x0000000B, 0x0000000B, 0x0000000B, 0x00000014, 0x0000000B,\n    0x0000000B, 0x0000000B, 0x00040020, 0x00000706, 0x00000009, 0x00000489,\n    0x0004003B, 0x00000706, 0x00000CE9, 0x00000009, 0x00040020, 0x00000288,\n    0x00000009, 0x0000000B, 0x00040020, 0x00000291, 0x00000009, 0x00000014,\n    0x00040020, 0x00000292, 0x00000001, 0x00000014, 0x0004003B, 0x00000292,\n    0x00000F48, 0x00000001, 0x0006002C, 0x00000014, 0x00000A24, 0x00000A10,\n    0x00000A0A, 0x00000A0A, 0x00040017, 0x0000000F, 0x00000009, 0x00000002,\n    0x0003001D, 0x000007DC, 0x00000017, 0x0003001E, 0x000007B4, 0x000007DC,\n    0x00040020, 0x00000A31, 0x00000002, 0x000007B4, 0x0004003B, 0x00000A31,\n    0x0000107A, 0x00000002, 0x00040020, 0x00000294, 0x00000002, 0x00000017,\n    0x0003001D, 0x000007DD, 0x00000017, 0x0003001E, 0x000007B5, 0x000007DD,\n    0x00040020, 0x00000A32, 0x00000002, 0x000007B5, 0x0004003B, 0x00000A32,\n    0x0000140E, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A16, 0x00000004,\n    0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020, 0x0006002C, 0x00000014,\n    0x00000BC3, 0x00000A16, 0x00000A6A, 0x00000A0D, 0x0007002C, 0x00000017,\n    0x000009CE, 0x000008A6, 0x000008A6, 0x000008A6, 0x000008A6, 0x0007002C,\n    0x00000017, 0x0000013D, 0x00000A22, 0x00000A22, 0x00000A22, 0x00000A22,\n    0x0007002C, 0x00000017, 0x0000072E, 0x000005FD, 0x000005FD, 0x000005FD,\n    0x000005FD, 0x0007002C, 0x00000017, 0x000002ED, 0x00000A3A, 0x00000A3A,\n    0x00000A3A, 0x00000A3A, 0x00050036, 0x00000008, 0x0000161F, 0x00000000,\n    0x00000502, 0x000200F8, 0x00003B06, 0x000300F7, 0x00004C7A, 0x00000000,\n    0x000300FB, 0x00000A0A, 0x00002E68, 0x000200F8, 0x00002E68, 0x00050041,\n    0x00000288, 0x000060D7, 0x00000CE9, 0x00000A0B, 0x0004003D, 0x0000000B,\n    0x00003526, 0x000060D7, 0x000500C7, 0x0000000B, 0x00005FDC, 0x00003526,\n    0x00000A0D, 0x000500AB, 0x00000009, 0x00004376, 0x00005FDC, 0x00000A0A,\n    0x000500C7, 0x0000000B, 0x00003028, 0x00003526, 0x00000A10, 0x000500AB,\n    0x00000009, 0x00004384, 0x00003028, 0x00000A0A, 0x000500C2, 0x0000000B,\n    0x00001EB0, 0x00003526, 0x00000A10, 0x000500C7, 0x0000000B, 0x000061E2,\n    0x00001EB0, 0x00000A13, 0x00050041, 0x00000288, 0x0000492C, 0x00000CE9,\n    0x00000A0E, 0x0004003D, 0x0000000B, 0x00005EAC, 0x0000492C, 0x00050041,\n    0x00000288, 0x00004EBA, 0x00000CE9, 0x00000A11, 0x0004003D, 0x0000000B,\n    0x00005788, 0x00004EBA, 0x00050041, 0x00000288, 0x00004EBB, 0x00000CE9,\n    0x00000A14, 0x0004003D, 0x0000000B, 0x00005789, 0x00004EBB, 0x00050041,\n    0x00000291, 0x00004EBC, 0x00000CE9, 0x00000A17, 0x0004003D, 0x00000014,\n    0x0000578A, 0x00004EBC, 0x00050041, 0x00000288, 0x00004EBD, 0x00000CE9,\n    0x00000A1A, 0x0004003D, 0x0000000B, 0x0000578B, 0x00004EBD, 0x00050041,\n    0x00000288, 0x00004E6E, 0x00000CE9, 0x00000A1D, 0x0004003D, 0x0000000B,\n    0x000019C2, 0x00004E6E, 0x0004003D, 0x00000014, 0x00002A0E, 0x00000F48,\n    0x000500C4, 0x00000014, 0x0000538B, 0x00002A0E, 0x00000A24, 0x0007004F,\n    0x00000011, 0x000042F0, 0x0000538B, 0x0000538B, 0x00000000, 0x00000001,\n    0x0007004F, 0x00000011, 0x0000242F, 0x0000578A, 0x0000578A, 0x00000000,\n    0x00000001, 0x000500AE, 0x0000000F, 0x00004288, 0x000042F0, 0x0000242F,\n    0x0004009A, 0x00000009, 0x00006067, 0x00004288, 0x000300F7, 0x000019BA,\n    0x00000002, 0x000400FA, 0x00006067, 0x000055E8, 0x000019BA, 0x000200F8,\n    0x000055E8, 0x000200F9, 0x00004C7A, 0x000200F8, 0x000019BA, 0x0004007C,\n    0x00000016, 0x00005BB6, 0x0000538B, 0x00050051, 0x0000000B, 0x00004916,\n    0x0000578A, 0x00000001, 0x00050051, 0x0000000C, 0x00005BEB, 0x00005BB6,\n    0x00000000, 0x00050084, 0x0000000C, 0x0000591A, 0x00005BEB, 0x00000A23,\n    0x00050051, 0x0000000C, 0x000018DA, 0x00005BB6, 0x00000002, 0x0004007C,\n    0x0000000C, 0x000038A9, 0x00004916, 0x00050084, 0x0000000C, 0x00002C0F,\n    0x000018DA, 0x000038A9, 0x00050051, 0x0000000C, 0x000044BE, 0x00005BB6,\n    0x00000001, 0x00050080, 0x0000000C, 0x000056D4, 0x00002C0F, 0x000044BE,\n    0x0004007C, 0x0000000C, 0x00005785, 0x000019C2, 0x00050084, 0x0000000C,\n    0x00005FD7, 0x000056D4, 0x00005785, 0x00050080, 0x0000000C, 0x00002042,\n    0x0000591A, 0x00005FD7, 0x0004007C, 0x0000000B, 0x000028A4, 0x00002042,\n    0x00050080, 0x0000000B, 0x000038F6, 0x0000578B, 0x000028A4, 0x000400A8,\n    0x00000009, 0x00003014, 0x00004376, 0x000300F7, 0x00004A60, 0x00000002,\n    0x000400FA, 0x00003014, 0x0000260D, 0x0000426F, 0x000200F8, 0x0000260D,\n    0x00050051, 0x0000000B, 0x00004437, 0x0000538B, 0x00000000, 0x00050051,\n    0x0000000B, 0x00002BEE, 0x0000538B, 0x00000001, 0x00050051, 0x0000000B,\n    0x00004971, 0x0000538B, 0x00000002, 0x00050084, 0x0000000B, 0x000039EF,\n    0x00005789, 0x00004971, 0x00050080, 0x0000000B, 0x00004F62, 0x00002BEE,\n    0x000039EF, 0x00050084, 0x0000000B, 0x000054AC, 0x00005788, 0x00004F62,\n    0x00050080, 0x0000000B, 0x00004FAE, 0x00004437, 0x000054AC, 0x000500C4,\n    0x0000000B, 0x00002C67, 0x00004FAE, 0x00000A13, 0x000200F9, 0x00004A60,\n    0x000200F8, 0x0000426F, 0x000300F7, 0x00005BF0, 0x00000002, 0x000400FA,\n    0x00004384, 0x00002C92, 0x00005F21, 0x000200F8, 0x00002C92, 0x000500C2,\n    0x0000000B, 0x00005374, 0x00005788, 0x00000A1A, 0x000500C2, 0x0000000B,\n    0x000035EC, 0x00005789, 0x00000A17, 0x000500C3, 0x0000000C, 0x000033B5,\n    0x000018DA, 0x00000A11, 0x0004007C, 0x0000000C, 0x00005766, 0x000035EC,\n    0x00050084, 0x0000000C, 0x000061FD, 0x000033B5, 0x00005766, 0x000500C3,\n    0x0000000C, 0x00002D62, 0x000044BE, 0x00000A17, 0x00050080, 0x0000000C,\n    0x0000411E, 0x000061FD, 0x00002D62, 0x0004007C, 0x0000000C, 0x00004A78,\n    0x00005374, 0x00050084, 0x0000000C, 0x000032DC, 0x0000411E, 0x00004A78,\n    0x000500C3, 0x0000000C, 0x000032BA, 0x00005BEB, 0x00000A1A, 0x00050080,\n    0x0000000C, 0x00005FEE, 0x000032DC, 0x000032BA, 0x000500C4, 0x0000000C,\n    0x0000225D, 0x00005FEE, 0x00000A20, 0x000500C7, 0x0000000C, 0x00002CAA,\n    0x000018DA, 0x00000A14, 0x000500C4, 0x0000000C, 0x00004CAE, 0x00002CAA,\n    0x00000A1A, 0x000500C3, 0x0000000C, 0x0000383E, 0x000044BE, 0x00000A0E,\n    0x000500C7, 0x0000000C, 0x00005375, 0x0000383E, 0x00000A14, 0x000500C4,\n    0x0000000C, 0x000054CA, 0x00005375, 0x00000A14, 0x000500C5, 0x0000000C,\n    0x000042CE, 0x00004CAE, 0x000054CA, 0x000500C7, 0x0000000C, 0x000050D5,\n    0x00005BEB, 0x00000A20, 0x000500C5, 0x0000000C, 0x00003ADD, 0x000042CE,\n    0x000050D5, 0x000500C5, 0x0000000C, 0x000043B6, 0x0000225D, 0x00003ADD,\n    0x000500C4, 0x0000000C, 0x00005E50, 0x000043B6, 0x00000A13, 0x000500C3,\n    0x0000000C, 0x000032D7, 0x000044BE, 0x00000A14, 0x000500C6, 0x0000000C,\n    0x000026C9, 0x000032D7, 0x000033B5, 0x000500C7, 0x0000000C, 0x00004199,\n    0x000026C9, 0x00000A0E, 0x000500C3, 0x0000000C, 0x00002590, 0x00005BEB,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x0000505E, 0x00002590, 0x00000A14,\n    0x000500C4, 0x0000000C, 0x0000541D, 0x00004199, 0x00000A0E, 0x000500C6,\n    0x0000000C, 0x000022BA, 0x0000505E, 0x0000541D, 0x000500C7, 0x0000000C,\n    0x00005076, 0x000044BE, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005228,\n    0x00005076, 0x00000A17, 0x000500C4, 0x0000000C, 0x00001997, 0x000022BA,\n    0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FE, 0x00005228, 0x00001997,\n    0x000500C4, 0x0000000C, 0x00001C00, 0x00004199, 0x00000A2C, 0x000500C5,\n    0x0000000C, 0x00003C81, 0x000047FE, 0x00001C00, 0x000500C7, 0x0000000C,\n    0x000050AF, 0x00005E50, 0x00000A38, 0x000500C5, 0x0000000C, 0x00003C70,\n    0x00003C81, 0x000050AF, 0x000500C3, 0x0000000C, 0x00003745, 0x00005E50,\n    0x00000A17, 0x000500C7, 0x0000000C, 0x000018B8, 0x00003745, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x0000547E, 0x000018B8, 0x00000A1A, 0x000500C5,\n    0x0000000C, 0x000045A8, 0x00003C70, 0x0000547E, 0x000500C3, 0x0000000C,\n    0x00003A6E, 0x00005E50, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018B9,\n    0x00003A6E, 0x00000A20, 0x000500C4, 0x0000000C, 0x0000547F, 0x000018B9,\n    0x00000A23, 0x000500C5, 0x0000000C, 0x0000456F, 0x000045A8, 0x0000547F,\n    0x000500C3, 0x0000000C, 0x00003C88, 0x00005E50, 0x00000A23, 0x000500C4,\n    0x0000000C, 0x00002824, 0x00003C88, 0x00000A2F, 0x000500C5, 0x0000000C,\n    0x00003B79, 0x0000456F, 0x00002824, 0x0004007C, 0x0000000B, 0x000041E5,\n    0x00003B79, 0x000200F9, 0x00005BF0, 0x000200F8, 0x00005F21, 0x0004007C,\n    0x00000012, 0x000059D8, 0x000042F0, 0x000500C2, 0x0000000B, 0x00005668,\n    0x00005788, 0x00000A1A, 0x00050051, 0x0000000C, 0x00003905, 0x000059D8,\n    0x00000001, 0x000500C3, 0x0000000C, 0x00002F39, 0x00003905, 0x00000A1A,\n    0x0004007C, 0x0000000C, 0x00005780, 0x00005668, 0x00050084, 0x0000000C,\n    0x00001F02, 0x00002F39, 0x00005780, 0x00050051, 0x0000000C, 0x00006242,\n    0x000059D8, 0x00000000, 0x000500C3, 0x0000000C, 0x00004FC7, 0x00006242,\n    0x00000A1A, 0x00050080, 0x0000000C, 0x000049B0, 0x00001F02, 0x00004FC7,\n    0x000500C4, 0x0000000C, 0x0000254A, 0x000049B0, 0x00000A1D, 0x000500C3,\n    0x0000000C, 0x0000603B, 0x00003905, 0x00000A0E, 0x000500C7, 0x0000000C,\n    0x0000539A, 0x0000603B, 0x00000A20, 0x000500C4, 0x0000000C, 0x0000534A,\n    0x0000539A, 0x00000A14, 0x000500C7, 0x0000000C, 0x00004EA5, 0x00006242,\n    0x00000A20, 0x000500C5, 0x0000000C, 0x00002B1A, 0x0000534A, 0x00004EA5,\n    0x000500C5, 0x0000000C, 0x000043B7, 0x0000254A, 0x00002B1A, 0x000500C4,\n    0x0000000C, 0x00005E63, 0x000043B7, 0x00000A13, 0x000500C3, 0x0000000C,\n    0x000031DE, 0x00003905, 0x00000A17, 0x000500C7, 0x0000000C, 0x00005447,\n    0x000031DE, 0x00000A0E, 0x000500C3, 0x0000000C, 0x000028A6, 0x00006242,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x0000511E, 0x000028A6, 0x00000A14,\n    0x000500C3, 0x0000000C, 0x000028B9, 0x00003905, 0x00000A14, 0x000500C7,\n    0x0000000C, 0x0000505F, 0x000028B9, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x0000541E, 0x0000505F, 0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BB,\n    0x0000511E, 0x0000541E, 0x000500C7, 0x0000000C, 0x00005077, 0x00003905,\n    0x00000A0E, 0x000500C4, 0x0000000C, 0x00005229, 0x00005077, 0x00000A17,\n    0x000500C4, 0x0000000C, 0x00001998, 0x000022BB, 0x00000A1D, 0x000500C5,\n    0x0000000C, 0x000047FF, 0x00005229, 0x00001998, 0x000500C4, 0x0000000C,\n    0x00001C01, 0x00005447, 0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C82,\n    0x000047FF, 0x00001C01, 0x000500C7, 0x0000000C, 0x000050B0, 0x00005E63,\n    0x00000A38, 0x000500C5, 0x0000000C, 0x00003C71, 0x00003C82, 0x000050B0,\n    0x000500C3, 0x0000000C, 0x00003746, 0x00005E63, 0x00000A17, 0x000500C7,\n    0x0000000C, 0x000018BA, 0x00003746, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x00005480, 0x000018BA, 0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A9,\n    0x00003C71, 0x00005480, 0x000500C3, 0x0000000C, 0x00003A6F, 0x00005E63,\n    0x00000A1A, 0x000500C7, 0x0000000C, 0x000018BB, 0x00003A6F, 0x00000A20,\n    0x000500C4, 0x0000000C, 0x00005481, 0x000018BB, 0x00000A23, 0x000500C5,\n    0x0000000C, 0x00004570, 0x000045A9, 0x00005481, 0x000500C3, 0x0000000C,\n    0x00003C89, 0x00005E63, 0x00000A23, 0x000500C4, 0x0000000C, 0x00002825,\n    0x00003C89, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B7A, 0x00004570,\n    0x00002825, 0x0004007C, 0x0000000B, 0x000041E6, 0x00003B7A, 0x000200F9,\n    0x00005BF0, 0x000200F8, 0x00005BF0, 0x000700F5, 0x0000000B, 0x0000292C,\n    0x000041E5, 0x00002C92, 0x000041E6, 0x00005F21, 0x000200F9, 0x00004A60,\n    0x000200F8, 0x00004A60, 0x000700F5, 0x0000000B, 0x00002C70, 0x00002C67,\n    0x0000260D, 0x0000292C, 0x00005BF0, 0x00050080, 0x0000000B, 0x000048BD,\n    0x00002C70, 0x00005EAC, 0x000500C2, 0x0000000B, 0x00003D52, 0x000048BD,\n    0x00000A17, 0x00060041, 0x00000294, 0x00004FAF, 0x0000107A, 0x00000A0B,\n    0x00003D52, 0x0004003D, 0x00000017, 0x00001CAA, 0x00004FAF, 0x000500AA,\n    0x00000009, 0x000035C0, 0x000061E2, 0x00000A0D, 0x000500AA, 0x00000009,\n    0x00005376, 0x000061E2, 0x00000A10, 0x000500A6, 0x00000009, 0x00005686,\n    0x000035C0, 0x00005376, 0x000300F7, 0x00003463, 0x00000000, 0x000400FA,\n    0x00005686, 0x00002957, 0x00003463, 0x000200F8, 0x00002957, 0x000500C7,\n    0x00000017, 0x0000475F, 0x00001CAA, 0x000009CE, 0x000500C4, 0x00000017,\n    0x000024D1, 0x0000475F, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AC,\n    0x00001CAA, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448D, 0x000050AC,\n    0x0000013D, 0x000500C5, 0x00000017, 0x00003FF8, 0x000024D1, 0x0000448D,\n    0x000200F9, 0x00003463, 0x000200F8, 0x00003463, 0x000700F5, 0x00000017,\n    0x00005879, 0x00001CAA, 0x00004A60, 0x00003FF8, 0x00002957, 0x000500AA,\n    0x00000009, 0x00004CB6, 0x000061E2, 0x00000A13, 0x000500A6, 0x00000009,\n    0x00003B23, 0x00005376, 0x00004CB6, 0x000300F7, 0x0000362B, 0x00000000,\n    0x000400FA, 0x00003B23, 0x00002B38, 0x0000362B, 0x000200F8, 0x00002B38,\n    0x000500C4, 0x00000017, 0x00005E17, 0x00005879, 0x000002ED, 0x000500C2,\n    0x00000017, 0x00003BE7, 0x00005879, 0x000002ED, 0x000500C5, 0x00000017,\n    0x000029E8, 0x00005E17, 0x00003BE7, 0x000200F9, 0x0000362B, 0x000200F8,\n    0x0000362B, 0x000700F5, 0x00000017, 0x000040C2, 0x00005879, 0x00003463,\n    0x000029E8, 0x00002B38, 0x000500C2, 0x0000000B, 0x0000219B, 0x000038F6,\n    0x00000A17, 0x00060041, 0x00000294, 0x000036B5, 0x0000140E, 0x00000A0B,\n    0x0000219B, 0x0003003E, 0x000036B5, 0x000040C2, 0x00050080, 0x0000000B,\n    0x000054B5, 0x000038F6, 0x00000A3A, 0x000300F7, 0x00006070, 0x00000002,\n    0x000400FA, 0x00004376, 0x000055E9, 0x00001C25, 0x000200F8, 0x000055E9,\n    0x000200F9, 0x00006070, 0x000200F8, 0x00001C25, 0x000200F9, 0x00006070,\n    0x000200F8, 0x00006070, 0x000700F5, 0x0000000B, 0x00002C71, 0x00000A6A,\n    0x000055E9, 0x00000A3A, 0x00001C25, 0x00050080, 0x0000000B, 0x000048BE,\n    0x000048BD, 0x00002C71, 0x000500C2, 0x0000000B, 0x00003D53, 0x000048BE,\n    0x00000A17, 0x00060041, 0x00000294, 0x00005566, 0x0000107A, 0x00000A0B,\n    0x00003D53, 0x0004003D, 0x00000017, 0x00003910, 0x00005566, 0x000300F7,\n    0x00003A1A, 0x00000000, 0x000400FA, 0x00005686, 0x00002958, 0x00003A1A,\n    0x000200F8, 0x00002958, 0x000500C7, 0x00000017, 0x00004760, 0x00003910,\n    0x000009CE, 0x000500C4, 0x00000017, 0x000024D2, 0x00004760, 0x0000013D,\n    0x000500C7, 0x00000017, 0x000050AD, 0x00003910, 0x0000072E, 0x000500C2,\n    0x00000017, 0x0000448E, 0x000050AD, 0x0000013D, 0x000500C5, 0x00000017,\n    0x00003FF9, 0x000024D2, 0x0000448E, 0x000200F9, 0x00003A1A, 0x000200F8,\n    0x00003A1A, 0x000700F5, 0x00000017, 0x00002AAC, 0x00003910, 0x00006070,\n    0x00003FF9, 0x00002958, 0x000300F7, 0x0000362C, 0x00000000, 0x000400FA,\n    0x00003B23, 0x00002B39, 0x0000362C, 0x000200F8, 0x00002B39, 0x000500C4,\n    0x00000017, 0x00005E18, 0x00002AAC, 0x000002ED, 0x000500C2, 0x00000017,\n    0x00003BE8, 0x00002AAC, 0x000002ED, 0x000500C5, 0x00000017, 0x000029E9,\n    0x00005E18, 0x00003BE8, 0x000200F9, 0x0000362C, 0x000200F8, 0x0000362C,\n    0x000700F5, 0x00000017, 0x000040C3, 0x00002AAC, 0x00003A1A, 0x000029E9,\n    0x00002B39, 0x000500C2, 0x0000000B, 0x0000219C, 0x000054B5, 0x00000A17,\n    0x00060041, 0x00000294, 0x00003FB0, 0x0000140E, 0x00000A0B, 0x0000219C,\n    0x0003003E, 0x00003FB0, 0x000040C3, 0x000200F9, 0x00004C7A, 0x000200F8,\n    0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_64bpb_scaled_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25157\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n     %v4uint = OpTypeVector %uint 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v3uint = OpTypeVector %uint 3\n     %uint_1 = OpConstant %uint 1\n     %uint_2 = OpConstant %uint 2\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n     %uint_3 = OpConstant %uint 3\n    %uint_16 = OpConstant %uint 16\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n     %uint_0 = OpConstant %uint 0\n      %int_3 = OpConstant %int 3\n      %int_2 = OpConstant %int 2\n     %uint_5 = OpConstant %uint 5\n     %uint_4 = OpConstant %uint 4\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n     %uint_7 = OpConstant %uint 7\n       %1927 = OpConstantComposite %v2uint %uint_4 %uint_7\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %2596 = OpConstantComposite %v3uint %uint_2 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n    %uint_32 = OpConstant %uint 32\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %1954 = OpConstantComposite %v2uint %uint_7 %uint_7\n       %1837 = OpConstantComposite %v2uint %uint_2 %uint_1\n       %1846 = OpConstantComposite %v2uint %uint_3 %uint_1\n     %uint_6 = OpConstant %uint 6\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24445 = OpBitwiseAnd %uint %13606 %uint_2\n      %18667 = OpINotEqual %bool %24445 %uint_0\n       %8141 = OpShiftRightLogical %uint %13606 %uint_2\n      %24990 = OpBitwiseAnd %uint %8141 %uint_3\n       %8871 = OpCompositeConstruct %v2uint %13606 %13606\n       %7087 = OpShiftRightLogical %v2uint %8871 %1927\n       %6551 = OpBitwiseAnd %v2uint %7087 %1954\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2596\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %6586 DontFlatten\n               OpBranchConditional %24679 %21992 %6586\n      %21992 = OpLabel\n               OpBranch %19578\n       %6586 = OpLabel\n      %23478 = OpBitcast %v3int %21387\n      %18710 = OpCompositeExtract %uint %22410 1\n      %23531 = OpCompositeExtract %int %23478 0\n      %22810 = OpIMul %int %23531 %int_8\n       %6362 = OpCompositeExtract %int %23478 2\n      %14505 = OpBitcast %int %18710\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %23478 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %6594\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %22810 %24535\n      %10898 = OpBitcast %uint %8258\n       %7937 = OpIAdd %uint %22411 %10898\n      %19921 = OpShiftRightLogical %v2uint %17136 %1837\n       %7712 = OpUDiv %v2uint %19921 %6551\n      %18183 = OpIMul %v2uint %6551 %7712\n      %18273 = OpISub %v2uint %19921 %18183\n      %11232 = OpShiftLeftLogical %v2uint %7712 %1837\n      %13284 = OpCompositeExtract %uint %18273 0\n      %10872 = OpCompositeExtract %uint %6551 1\n      %22886 = OpIMul %uint %13284 %10872\n       %6943 = OpCompositeExtract %uint %18273 1\n      %10469 = OpIAdd %uint %22886 %6943\n      %18851 = OpBitwiseAnd %v2uint %17136 %1846\n      %10581 = OpShiftLeftLogical %uint %10469 %uint_6\n      %20916 = OpCompositeExtract %uint %18851 1\n      %23596 = OpShiftLeftLogical %uint %20916 %uint_5\n      %19814 = OpBitwiseOr %uint %10581 %23596\n      %21476 = OpCompositeExtract %uint %18851 0\n       %8560 = OpShiftLeftLogical %uint %21476 %uint_3\n      %17648 = OpBitwiseOr %uint %19814 %8560\n      %19923 = OpCompositeExtract %uint %11232 0\n      %15556 = OpCompositeInsert %v3uint %19923 %21387 0\n      %23006 = OpCompositeExtract %uint %11232 1\n       %9680 = OpCompositeInsert %v3uint %23006 %15556 1\n               OpSelectionMerge %20344 DontFlatten\n               OpBranchConditional %18667 %23520 %11737\n      %23520 = OpLabel\n      %10111 = OpBitcast %v3int %9680\n      %19476 = OpShiftRightLogical %uint %22408 %int_5\n      %18810 = OpShiftRightLogical %uint %22409 %int_4\n       %6782 = OpCompositeExtract %int %10111 2\n      %12089 = OpShiftRightArithmetic %int %6782 %int_2\n      %22400 = OpBitcast %int %18810\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %10111 1\n      %19055 = OpShiftRightArithmetic %int %25154 %int_4\n      %11052 = OpIAdd %int %7938 %19055\n      %16898 = OpBitcast %int %19476\n      %14944 = OpIMul %int %11052 %16898\n      %25155 = OpCompositeExtract %int %10111 0\n      %20423 = OpShiftRightArithmetic %int %25155 %int_5\n      %18940 = OpIAdd %int %14944 %20423\n       %8797 = OpShiftLeftLogical %int %18940 %int_7\n      %11434 = OpBitwiseAnd %int %6782 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %25154 %int_1\n      %21364 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21364 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %25155 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17334 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17334 %uint_3\n      %13015 = OpShiftRightArithmetic %int %25154 %int_3\n       %9929 = OpBitwiseXor %int %13015 %12089\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %25155 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %25154 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6552 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6552\n       %7168 = OpShiftLeftLogical %int %16793 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24144 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24144 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24144 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24144 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %20344\n      %11737 = OpLabel\n      %11908 = OpVectorShuffle %v2uint %9680 %9680 0 1\n      %20347 = OpBitcast %v2int %11908\n      %11433 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %20347 1\n      %12090 = OpShiftRightArithmetic %int %14597 %int_5\n      %22401 = OpBitcast %int %11433\n       %7939 = OpIMul %int %12090 %22401\n      %25156 = OpCompositeExtract %int %20347 0\n      %20424 = OpShiftRightArithmetic %int %25156 %int_5\n      %18864 = OpIAdd %int %7939 %20424\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25156 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17335 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17335 %uint_3\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25156 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6553 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6553\n       %7169 = OpShiftLeftLogical %int %21575 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24163 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24163 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24163 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %20344\n      %20344 = OpLabel\n      %18329 = OpPhi %uint %16869 %23520 %16870 %11737\n      %15200 = OpCompositeExtract %uint %6551 0\n      %17489 = OpIMul %uint %15200 %10872\n       %7313 = OpIMul %uint %18329 %17489\n       %8815 = OpIAdd %uint %7313 %17648\n      %21470 = OpIAdd %uint %8815 %24236\n      %14664 = OpShiftRightLogical %uint %21470 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %14664\n       %7338 = OpLoad %v4uint %20399\n      %13760 = OpIEqual %bool %24990 %uint_1\n      %21366 = OpIEqual %bool %24990 %uint_2\n      %22150 = OpLogicalOr %bool %13760 %21366\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %7338 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %7338 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22649 = OpPhi %v4uint %7338 %20344 %16376 %10583\n      %19638 = OpIEqual %bool %24990 %uint_3\n      %15139 = OpLogicalOr %bool %21366 %19638\n               OpSelectionMerge %13867 None\n               OpBranchConditional %15139 %11064 %13867\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22649 %749\n      %15335 = OpShiftRightLogical %v4uint %22649 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %13867\n      %13867 = OpLabel\n      %16578 = OpPhi %v4uint %22649 %13411 %10728 %11064\n       %8603 = OpShiftRightLogical %uint %7937 %int_4\n      %14005 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %8603\n               OpStore %14005 %16578\n      %22137 = OpIAdd %uint %7937 %uint_16\n      %10214 = OpIAdd %uint %21470 %uint_16\n      %14665 = OpShiftRightLogical %uint %10214 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %14665\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %14874 None\n               OpBranchConditional %22150 %10584 %14874\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %14874\n      %14874 = OpLabel\n      %10924 = OpPhi %v4uint %14608 %13867 %16377 %10584\n               OpSelectionMerge %13868 None\n               OpBranchConditional %15139 %11065 %13868\n      %11065 = OpLabel\n      %24088 = OpShiftLeftLogical %v4uint %10924 %749\n      %15336 = OpShiftRightLogical %v4uint %10924 %749\n      %10729 = OpBitwiseOr %v4uint %24088 %15336\n               OpBranch %13868\n      %13868 = OpLabel\n      %16579 = OpPhi %v4uint %10924 %14874 %10729 %11065\n       %8604 = OpShiftRightLogical %uint %22137 %int_4\n      %16304 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %8604\n               OpStore %16304 %16579\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_64bpb_scaled_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006245, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000017,\n    0x0000000B, 0x00000004, 0x00040015, 0x0000000C, 0x00000020, 0x00000001,\n    0x00040017, 0x00000012, 0x0000000C, 0x00000002, 0x00040017, 0x00000016,\n    0x0000000C, 0x00000003, 0x00020014, 0x00000009, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001,\n    0x0004002B, 0x0000000B, 0x00000A10, 0x00000002, 0x0004002B, 0x0000000B,\n    0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B, 0x00000A22, 0x00000008,\n    0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00, 0x0004002B, 0x0000000B,\n    0x00000A13, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A3A, 0x00000010,\n    0x0004002B, 0x0000000C, 0x00000A17, 0x00000004, 0x0004002B, 0x0000000C,\n    0x00000A1D, 0x00000006, 0x0004002B, 0x0000000C, 0x00000A2C, 0x0000000B,\n    0x0004002B, 0x0000000C, 0x00000A38, 0x0000000F, 0x0004002B, 0x0000000C,\n    0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C, 0x00000A1A, 0x00000005,\n    0x0004002B, 0x0000000C, 0x00000A20, 0x00000007, 0x0004002B, 0x0000000C,\n    0x00000A23, 0x00000008, 0x0004002B, 0x0000000C, 0x00000A2F, 0x0000000C,\n    0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000, 0x0004002B, 0x0000000C,\n    0x00000A14, 0x00000003, 0x0004002B, 0x0000000C, 0x00000A11, 0x00000002,\n    0x0004002B, 0x0000000B, 0x00000A19, 0x00000005, 0x0004002B, 0x0000000B,\n    0x00000A16, 0x00000004, 0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000,\n    0x000A001E, 0x00000489, 0x0000000B, 0x0000000B, 0x0000000B, 0x0000000B,\n    0x00000014, 0x0000000B, 0x0000000B, 0x0000000B, 0x00040020, 0x00000706,\n    0x00000009, 0x00000489, 0x0004003B, 0x00000706, 0x00000CE9, 0x00000009,\n    0x00040020, 0x00000288, 0x00000009, 0x0000000B, 0x0004002B, 0x0000000B,\n    0x00000A1F, 0x00000007, 0x0005002C, 0x00000011, 0x00000787, 0x00000A16,\n    0x00000A1F, 0x00040020, 0x00000291, 0x00000009, 0x00000014, 0x00040020,\n    0x00000292, 0x00000001, 0x00000014, 0x0004003B, 0x00000292, 0x00000F48,\n    0x00000001, 0x0006002C, 0x00000014, 0x00000A24, 0x00000A10, 0x00000A0A,\n    0x00000A0A, 0x00040017, 0x0000000F, 0x00000009, 0x00000002, 0x0003001D,\n    0x000007DC, 0x00000017, 0x0003001E, 0x000007B4, 0x000007DC, 0x00040020,\n    0x00000A31, 0x00000002, 0x000007B4, 0x0004003B, 0x00000A31, 0x0000107A,\n    0x00000002, 0x00040020, 0x00000294, 0x00000002, 0x00000017, 0x0003001D,\n    0x000007DD, 0x00000017, 0x0003001E, 0x000007B5, 0x000007DD, 0x00040020,\n    0x00000A32, 0x00000002, 0x000007B5, 0x0004003B, 0x00000A32, 0x0000140E,\n    0x00000002, 0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020, 0x0006002C,\n    0x00000014, 0x00000BC3, 0x00000A16, 0x00000A6A, 0x00000A0D, 0x0005002C,\n    0x00000011, 0x000007A2, 0x00000A1F, 0x00000A1F, 0x0005002C, 0x00000011,\n    0x0000072D, 0x00000A10, 0x00000A0D, 0x0005002C, 0x00000011, 0x00000736,\n    0x00000A13, 0x00000A0D, 0x0004002B, 0x0000000B, 0x00000A1C, 0x00000006,\n    0x0007002C, 0x00000017, 0x000009CE, 0x000008A6, 0x000008A6, 0x000008A6,\n    0x000008A6, 0x0007002C, 0x00000017, 0x0000013D, 0x00000A22, 0x00000A22,\n    0x00000A22, 0x00000A22, 0x0007002C, 0x00000017, 0x0000072E, 0x000005FD,\n    0x000005FD, 0x000005FD, 0x000005FD, 0x0007002C, 0x00000017, 0x000002ED,\n    0x00000A3A, 0x00000A3A, 0x00000A3A, 0x00000A3A, 0x00050036, 0x00000008,\n    0x0000161F, 0x00000000, 0x00000502, 0x000200F8, 0x00003B06, 0x000300F7,\n    0x00004C7A, 0x00000000, 0x000300FB, 0x00000A0A, 0x00002E68, 0x000200F8,\n    0x00002E68, 0x00050041, 0x00000288, 0x000060D7, 0x00000CE9, 0x00000A0B,\n    0x0004003D, 0x0000000B, 0x00003526, 0x000060D7, 0x000500C7, 0x0000000B,\n    0x00005F7D, 0x00003526, 0x00000A10, 0x000500AB, 0x00000009, 0x000048EB,\n    0x00005F7D, 0x00000A0A, 0x000500C2, 0x0000000B, 0x00001FCD, 0x00003526,\n    0x00000A10, 0x000500C7, 0x0000000B, 0x0000619E, 0x00001FCD, 0x00000A13,\n    0x00050050, 0x00000011, 0x000022A7, 0x00003526, 0x00003526, 0x000500C2,\n    0x00000011, 0x00001BAF, 0x000022A7, 0x00000787, 0x000500C7, 0x00000011,\n    0x00001997, 0x00001BAF, 0x000007A2, 0x00050041, 0x00000288, 0x0000492C,\n    0x00000CE9, 0x00000A0E, 0x0004003D, 0x0000000B, 0x00005EAC, 0x0000492C,\n    0x00050041, 0x00000288, 0x00004EBA, 0x00000CE9, 0x00000A11, 0x0004003D,\n    0x0000000B, 0x00005788, 0x00004EBA, 0x00050041, 0x00000288, 0x00004EBB,\n    0x00000CE9, 0x00000A14, 0x0004003D, 0x0000000B, 0x00005789, 0x00004EBB,\n    0x00050041, 0x00000291, 0x00004EBC, 0x00000CE9, 0x00000A17, 0x0004003D,\n    0x00000014, 0x0000578A, 0x00004EBC, 0x00050041, 0x00000288, 0x00004EBD,\n    0x00000CE9, 0x00000A1A, 0x0004003D, 0x0000000B, 0x0000578B, 0x00004EBD,\n    0x00050041, 0x00000288, 0x00004E6E, 0x00000CE9, 0x00000A1D, 0x0004003D,\n    0x0000000B, 0x000019C2, 0x00004E6E, 0x0004003D, 0x00000014, 0x00002A0E,\n    0x00000F48, 0x000500C4, 0x00000014, 0x0000538B, 0x00002A0E, 0x00000A24,\n    0x0007004F, 0x00000011, 0x000042F0, 0x0000538B, 0x0000538B, 0x00000000,\n    0x00000001, 0x0007004F, 0x00000011, 0x0000242F, 0x0000578A, 0x0000578A,\n    0x00000000, 0x00000001, 0x000500AE, 0x0000000F, 0x00004288, 0x000042F0,\n    0x0000242F, 0x0004009A, 0x00000009, 0x00006067, 0x00004288, 0x000300F7,\n    0x000019BA, 0x00000002, 0x000400FA, 0x00006067, 0x000055E8, 0x000019BA,\n    0x000200F8, 0x000055E8, 0x000200F9, 0x00004C7A, 0x000200F8, 0x000019BA,\n    0x0004007C, 0x00000016, 0x00005BB6, 0x0000538B, 0x00050051, 0x0000000B,\n    0x00004916, 0x0000578A, 0x00000001, 0x00050051, 0x0000000C, 0x00005BEB,\n    0x00005BB6, 0x00000000, 0x00050084, 0x0000000C, 0x0000591A, 0x00005BEB,\n    0x00000A23, 0x00050051, 0x0000000C, 0x000018DA, 0x00005BB6, 0x00000002,\n    0x0004007C, 0x0000000C, 0x000038A9, 0x00004916, 0x00050084, 0x0000000C,\n    0x00002C0F, 0x000018DA, 0x000038A9, 0x00050051, 0x0000000C, 0x000044BE,\n    0x00005BB6, 0x00000001, 0x00050080, 0x0000000C, 0x000056D4, 0x00002C0F,\n    0x000044BE, 0x0004007C, 0x0000000C, 0x00005785, 0x000019C2, 0x00050084,\n    0x0000000C, 0x00005FD7, 0x000056D4, 0x00005785, 0x00050080, 0x0000000C,\n    0x00002042, 0x0000591A, 0x00005FD7, 0x0004007C, 0x0000000B, 0x00002A92,\n    0x00002042, 0x00050080, 0x0000000B, 0x00001F01, 0x0000578B, 0x00002A92,\n    0x000500C2, 0x00000011, 0x00004DD1, 0x000042F0, 0x0000072D, 0x00050086,\n    0x00000011, 0x00001E20, 0x00004DD1, 0x00001997, 0x00050084, 0x00000011,\n    0x00004707, 0x00001997, 0x00001E20, 0x00050082, 0x00000011, 0x00004761,\n    0x00004DD1, 0x00004707, 0x000500C4, 0x00000011, 0x00002BE0, 0x00001E20,\n    0x0000072D, 0x00050051, 0x0000000B, 0x000033E4, 0x00004761, 0x00000000,\n    0x00050051, 0x0000000B, 0x00002A78, 0x00001997, 0x00000001, 0x00050084,\n    0x0000000B, 0x00005966, 0x000033E4, 0x00002A78, 0x00050051, 0x0000000B,\n    0x00001B1F, 0x00004761, 0x00000001, 0x00050080, 0x0000000B, 0x000028E5,\n    0x00005966, 0x00001B1F, 0x000500C7, 0x00000011, 0x000049A3, 0x000042F0,\n    0x00000736, 0x000500C4, 0x0000000B, 0x00002955, 0x000028E5, 0x00000A1C,\n    0x00050051, 0x0000000B, 0x000051B4, 0x000049A3, 0x00000001, 0x000500C4,\n    0x0000000B, 0x00005C2C, 0x000051B4, 0x00000A19, 0x000500C5, 0x0000000B,\n    0x00004D66, 0x00002955, 0x00005C2C, 0x00050051, 0x0000000B, 0x000053E4,\n    0x000049A3, 0x00000000, 0x000500C4, 0x0000000B, 0x00002170, 0x000053E4,\n    0x00000A13, 0x000500C5, 0x0000000B, 0x000044F0, 0x00004D66, 0x00002170,\n    0x00050051, 0x0000000B, 0x00004DD3, 0x00002BE0, 0x00000000, 0x00060052,\n    0x00000014, 0x00003CC4, 0x00004DD3, 0x0000538B, 0x00000000, 0x00050051,\n    0x0000000B, 0x000059DE, 0x00002BE0, 0x00000001, 0x00060052, 0x00000014,\n    0x000025D0, 0x000059DE, 0x00003CC4, 0x00000001, 0x000300F7, 0x00004F78,\n    0x00000002, 0x000400FA, 0x000048EB, 0x00005BE0, 0x00002DD9, 0x000200F8,\n    0x00005BE0, 0x0004007C, 0x00000016, 0x0000277F, 0x000025D0, 0x000500C2,\n    0x0000000B, 0x00004C14, 0x00005788, 0x00000A1A, 0x000500C2, 0x0000000B,\n    0x0000497A, 0x00005789, 0x00000A17, 0x00050051, 0x0000000C, 0x00001A7E,\n    0x0000277F, 0x00000002, 0x000500C3, 0x0000000C, 0x00002F39, 0x00001A7E,\n    0x00000A11, 0x0004007C, 0x0000000C, 0x00005780, 0x0000497A, 0x00050084,\n    0x0000000C, 0x00001F02, 0x00002F39, 0x00005780, 0x00050051, 0x0000000C,\n    0x00006242, 0x0000277F, 0x00000001, 0x000500C3, 0x0000000C, 0x00004A6F,\n    0x00006242, 0x00000A17, 0x00050080, 0x0000000C, 0x00002B2C, 0x00001F02,\n    0x00004A6F, 0x0004007C, 0x0000000C, 0x00004202, 0x00004C14, 0x00050084,\n    0x0000000C, 0x00003A60, 0x00002B2C, 0x00004202, 0x00050051, 0x0000000C,\n    0x00006243, 0x0000277F, 0x00000000, 0x000500C3, 0x0000000C, 0x00004FC7,\n    0x00006243, 0x00000A1A, 0x00050080, 0x0000000C, 0x000049FC, 0x00003A60,\n    0x00004FC7, 0x000500C4, 0x0000000C, 0x0000225D, 0x000049FC, 0x00000A20,\n    0x000500C7, 0x0000000C, 0x00002CAA, 0x00001A7E, 0x00000A14, 0x000500C4,\n    0x0000000C, 0x00004CAE, 0x00002CAA, 0x00000A1A, 0x000500C3, 0x0000000C,\n    0x0000383E, 0x00006242, 0x00000A0E, 0x000500C7, 0x0000000C, 0x00005374,\n    0x0000383E, 0x00000A14, 0x000500C4, 0x0000000C, 0x000054CA, 0x00005374,\n    0x00000A14, 0x000500C5, 0x0000000C, 0x000042CE, 0x00004CAE, 0x000054CA,\n    0x000500C7, 0x0000000C, 0x000050D5, 0x00006243, 0x00000A20, 0x000500C5,\n    0x0000000C, 0x00003ADD, 0x000042CE, 0x000050D5, 0x000500C5, 0x0000000C,\n    0x000043B6, 0x0000225D, 0x00003ADD, 0x000500C4, 0x0000000C, 0x00005E50,\n    0x000043B6, 0x00000A13, 0x000500C3, 0x0000000C, 0x000032D7, 0x00006242,\n    0x00000A14, 0x000500C6, 0x0000000C, 0x000026C9, 0x000032D7, 0x00002F39,\n    0x000500C7, 0x0000000C, 0x00004199, 0x000026C9, 0x00000A0E, 0x000500C3,\n    0x0000000C, 0x00002590, 0x00006243, 0x00000A14, 0x000500C7, 0x0000000C,\n    0x0000505E, 0x00002590, 0x00000A14, 0x000500C4, 0x0000000C, 0x0000541D,\n    0x00004199, 0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BA, 0x0000505E,\n    0x0000541D, 0x000500C7, 0x0000000C, 0x00005076, 0x00006242, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x00005228, 0x00005076, 0x00000A17, 0x000500C4,\n    0x0000000C, 0x00001998, 0x000022BA, 0x00000A1D, 0x000500C5, 0x0000000C,\n    0x000047FE, 0x00005228, 0x00001998, 0x000500C4, 0x0000000C, 0x00001C00,\n    0x00004199, 0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C81, 0x000047FE,\n    0x00001C00, 0x000500C7, 0x0000000C, 0x000050AF, 0x00005E50, 0x00000A38,\n    0x000500C5, 0x0000000C, 0x00003C70, 0x00003C81, 0x000050AF, 0x000500C3,\n    0x0000000C, 0x00003745, 0x00005E50, 0x00000A17, 0x000500C7, 0x0000000C,\n    0x000018B8, 0x00003745, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000547E,\n    0x000018B8, 0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A8, 0x00003C70,\n    0x0000547E, 0x000500C3, 0x0000000C, 0x00003A6E, 0x00005E50, 0x00000A1A,\n    0x000500C7, 0x0000000C, 0x000018B9, 0x00003A6E, 0x00000A20, 0x000500C4,\n    0x0000000C, 0x0000547F, 0x000018B9, 0x00000A23, 0x000500C5, 0x0000000C,\n    0x0000456F, 0x000045A8, 0x0000547F, 0x000500C3, 0x0000000C, 0x00003C88,\n    0x00005E50, 0x00000A23, 0x000500C4, 0x0000000C, 0x00002824, 0x00003C88,\n    0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B79, 0x0000456F, 0x00002824,\n    0x0004007C, 0x0000000B, 0x000041E5, 0x00003B79, 0x000200F9, 0x00004F78,\n    0x000200F8, 0x00002DD9, 0x0007004F, 0x00000011, 0x00002E84, 0x000025D0,\n    0x000025D0, 0x00000000, 0x00000001, 0x0004007C, 0x00000012, 0x00004F7B,\n    0x00002E84, 0x000500C2, 0x0000000B, 0x00002CA9, 0x00005788, 0x00000A1A,\n    0x00050051, 0x0000000C, 0x00003905, 0x00004F7B, 0x00000001, 0x000500C3,\n    0x0000000C, 0x00002F3A, 0x00003905, 0x00000A1A, 0x0004007C, 0x0000000C,\n    0x00005781, 0x00002CA9, 0x00050084, 0x0000000C, 0x00001F03, 0x00002F3A,\n    0x00005781, 0x00050051, 0x0000000C, 0x00006244, 0x00004F7B, 0x00000000,\n    0x000500C3, 0x0000000C, 0x00004FC8, 0x00006244, 0x00000A1A, 0x00050080,\n    0x0000000C, 0x000049B0, 0x00001F03, 0x00004FC8, 0x000500C4, 0x0000000C,\n    0x0000254A, 0x000049B0, 0x00000A1D, 0x000500C3, 0x0000000C, 0x0000603B,\n    0x00003905, 0x00000A0E, 0x000500C7, 0x0000000C, 0x0000539A, 0x0000603B,\n    0x00000A20, 0x000500C4, 0x0000000C, 0x0000534A, 0x0000539A, 0x00000A14,\n    0x000500C7, 0x0000000C, 0x00004EA5, 0x00006244, 0x00000A20, 0x000500C5,\n    0x0000000C, 0x00002B1A, 0x0000534A, 0x00004EA5, 0x000500C5, 0x0000000C,\n    0x000043B7, 0x0000254A, 0x00002B1A, 0x000500C4, 0x0000000C, 0x00005E63,\n    0x000043B7, 0x00000A13, 0x000500C3, 0x0000000C, 0x000031DE, 0x00003905,\n    0x00000A17, 0x000500C7, 0x0000000C, 0x00005447, 0x000031DE, 0x00000A0E,\n    0x000500C3, 0x0000000C, 0x000028A6, 0x00006244, 0x00000A14, 0x000500C7,\n    0x0000000C, 0x0000511E, 0x000028A6, 0x00000A14, 0x000500C3, 0x0000000C,\n    0x000028B9, 0x00003905, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000505F,\n    0x000028B9, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000541E, 0x0000505F,\n    0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BB, 0x0000511E, 0x0000541E,\n    0x000500C7, 0x0000000C, 0x00005077, 0x00003905, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x00005229, 0x00005077, 0x00000A17, 0x000500C4, 0x0000000C,\n    0x00001999, 0x000022BB, 0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FF,\n    0x00005229, 0x00001999, 0x000500C4, 0x0000000C, 0x00001C01, 0x00005447,\n    0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C82, 0x000047FF, 0x00001C01,\n    0x000500C7, 0x0000000C, 0x000050B0, 0x00005E63, 0x00000A38, 0x000500C5,\n    0x0000000C, 0x00003C71, 0x00003C82, 0x000050B0, 0x000500C3, 0x0000000C,\n    0x00003746, 0x00005E63, 0x00000A17, 0x000500C7, 0x0000000C, 0x000018BA,\n    0x00003746, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005480, 0x000018BA,\n    0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A9, 0x00003C71, 0x00005480,\n    0x000500C3, 0x0000000C, 0x00003A6F, 0x00005E63, 0x00000A1A, 0x000500C7,\n    0x0000000C, 0x000018BB, 0x00003A6F, 0x00000A20, 0x000500C4, 0x0000000C,\n    0x00005481, 0x000018BB, 0x00000A23, 0x000500C5, 0x0000000C, 0x00004570,\n    0x000045A9, 0x00005481, 0x000500C3, 0x0000000C, 0x00003C89, 0x00005E63,\n    0x00000A23, 0x000500C4, 0x0000000C, 0x00002825, 0x00003C89, 0x00000A2F,\n    0x000500C5, 0x0000000C, 0x00003B7A, 0x00004570, 0x00002825, 0x0004007C,\n    0x0000000B, 0x000041E6, 0x00003B7A, 0x000200F9, 0x00004F78, 0x000200F8,\n    0x00004F78, 0x000700F5, 0x0000000B, 0x00004799, 0x000041E5, 0x00005BE0,\n    0x000041E6, 0x00002DD9, 0x00050051, 0x0000000B, 0x00003B60, 0x00001997,\n    0x00000000, 0x00050084, 0x0000000B, 0x00004451, 0x00003B60, 0x00002A78,\n    0x00050084, 0x0000000B, 0x00001C91, 0x00004799, 0x00004451, 0x00050080,\n    0x0000000B, 0x0000226F, 0x00001C91, 0x000044F0, 0x00050080, 0x0000000B,\n    0x000053DE, 0x0000226F, 0x00005EAC, 0x000500C2, 0x0000000B, 0x00003948,\n    0x000053DE, 0x00000A17, 0x00060041, 0x00000294, 0x00004FAF, 0x0000107A,\n    0x00000A0B, 0x00003948, 0x0004003D, 0x00000017, 0x00001CAA, 0x00004FAF,\n    0x000500AA, 0x00000009, 0x000035C0, 0x0000619E, 0x00000A0D, 0x000500AA,\n    0x00000009, 0x00005376, 0x0000619E, 0x00000A10, 0x000500A6, 0x00000009,\n    0x00005686, 0x000035C0, 0x00005376, 0x000300F7, 0x00003463, 0x00000000,\n    0x000400FA, 0x00005686, 0x00002957, 0x00003463, 0x000200F8, 0x00002957,\n    0x000500C7, 0x00000017, 0x0000475F, 0x00001CAA, 0x000009CE, 0x000500C4,\n    0x00000017, 0x000024D1, 0x0000475F, 0x0000013D, 0x000500C7, 0x00000017,\n    0x000050AC, 0x00001CAA, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448D,\n    0x000050AC, 0x0000013D, 0x000500C5, 0x00000017, 0x00003FF8, 0x000024D1,\n    0x0000448D, 0x000200F9, 0x00003463, 0x000200F8, 0x00003463, 0x000700F5,\n    0x00000017, 0x00005879, 0x00001CAA, 0x00004F78, 0x00003FF8, 0x00002957,\n    0x000500AA, 0x00000009, 0x00004CB6, 0x0000619E, 0x00000A13, 0x000500A6,\n    0x00000009, 0x00003B23, 0x00005376, 0x00004CB6, 0x000300F7, 0x0000362B,\n    0x00000000, 0x000400FA, 0x00003B23, 0x00002B38, 0x0000362B, 0x000200F8,\n    0x00002B38, 0x000500C4, 0x00000017, 0x00005E17, 0x00005879, 0x000002ED,\n    0x000500C2, 0x00000017, 0x00003BE7, 0x00005879, 0x000002ED, 0x000500C5,\n    0x00000017, 0x000029E8, 0x00005E17, 0x00003BE7, 0x000200F9, 0x0000362B,\n    0x000200F8, 0x0000362B, 0x000700F5, 0x00000017, 0x000040C2, 0x00005879,\n    0x00003463, 0x000029E8, 0x00002B38, 0x000500C2, 0x0000000B, 0x0000219B,\n    0x00001F01, 0x00000A17, 0x00060041, 0x00000294, 0x000036B5, 0x0000140E,\n    0x00000A0B, 0x0000219B, 0x0003003E, 0x000036B5, 0x000040C2, 0x00050080,\n    0x0000000B, 0x00005679, 0x00001F01, 0x00000A3A, 0x00050080, 0x0000000B,\n    0x000027E6, 0x000053DE, 0x00000A3A, 0x000500C2, 0x0000000B, 0x00003949,\n    0x000027E6, 0x00000A17, 0x00060041, 0x00000294, 0x00005566, 0x0000107A,\n    0x00000A0B, 0x00003949, 0x0004003D, 0x00000017, 0x00003910, 0x00005566,\n    0x000300F7, 0x00003A1A, 0x00000000, 0x000400FA, 0x00005686, 0x00002958,\n    0x00003A1A, 0x000200F8, 0x00002958, 0x000500C7, 0x00000017, 0x00004760,\n    0x00003910, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D2, 0x00004760,\n    0x0000013D, 0x000500C7, 0x00000017, 0x000050AD, 0x00003910, 0x0000072E,\n    0x000500C2, 0x00000017, 0x0000448E, 0x000050AD, 0x0000013D, 0x000500C5,\n    0x00000017, 0x00003FF9, 0x000024D2, 0x0000448E, 0x000200F9, 0x00003A1A,\n    0x000200F8, 0x00003A1A, 0x000700F5, 0x00000017, 0x00002AAC, 0x00003910,\n    0x0000362B, 0x00003FF9, 0x00002958, 0x000300F7, 0x0000362C, 0x00000000,\n    0x000400FA, 0x00003B23, 0x00002B39, 0x0000362C, 0x000200F8, 0x00002B39,\n    0x000500C4, 0x00000017, 0x00005E18, 0x00002AAC, 0x000002ED, 0x000500C2,\n    0x00000017, 0x00003BE8, 0x00002AAC, 0x000002ED, 0x000500C5, 0x00000017,\n    0x000029E9, 0x00005E18, 0x00003BE8, 0x000200F9, 0x0000362C, 0x000200F8,\n    0x0000362C, 0x000700F5, 0x00000017, 0x000040C3, 0x00002AAC, 0x00003A1A,\n    0x000029E9, 0x00002B39, 0x000500C2, 0x0000000B, 0x0000219C, 0x00005679,\n    0x00000A17, 0x00060041, 0x00000294, 0x00003FB0, 0x0000140E, 0x00000A0B,\n    0x0000219C, 0x0003003E, 0x00003FB0, 0x000040C3, 0x000200F9, 0x00004C7A,\n    0x000200F8, 0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_8bpb_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25155\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %_runtimearr_v2uint ArrayStride 8\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n       %uint = OpTypeInt 32 0\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v2uint = OpTypeVector %uint 2\n     %v3uint = OpTypeVector %uint 3\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n     %uint_1 = OpConstant %uint 1\n     %uint_0 = OpConstant %uint 0\n      %int_3 = OpConstant %int 3\n     %uint_2 = OpConstant %uint 2\n      %int_2 = OpConstant %int 2\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n     %uint_4 = OpConstant %uint 4\n       %2612 = OpConstantComposite %v3uint %uint_4 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n     %v4uint = OpTypeVector %uint 4\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n%_runtimearr_v2uint = OpTypeRuntimeArray %v2uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v2uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v2uint = OpTypePointer Uniform %v2uint\n     %uint_8 = OpConstant %uint 8\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n    %uint_32 = OpConstant %uint 32\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n    %uint_64 = OpConstant %uint 64\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24540 = OpBitwiseAnd %uint %13606 %uint_1\n      %17270 = OpINotEqual %bool %24540 %uint_0\n       %9877 = OpBitwiseAnd %uint %13606 %uint_2\n      %17908 = OpINotEqual %bool %9877 %uint_0\n       %8037 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %21025 = OpLoad %uint %8037\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2612\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %6586 DontFlatten\n               OpBranchConditional %24679 %21992 %6586\n      %21992 = OpLabel\n               OpBranch %19578\n       %6586 = OpLabel\n      %23478 = OpBitcast %v3int %21387\n      %17741 = OpCompositeExtract %uint %22410 1\n      %14100 = OpCompositeExtract %int %23478 0\n      %20261 = OpCompositeExtract %int %23478 2\n      %21501 = OpBitcast %int %17741\n      %11279 = OpIMul %int %20261 %21501\n      %17598 = OpCompositeExtract %int %23478 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %6594\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %14100 %24535\n      %10404 = OpBitcast %uint %8258\n      %14582 = OpIAdd %uint %22411 %10404\n      %12308 = OpLogicalNot %bool %17270\n               OpSelectionMerge %19040 DontFlatten\n               OpBranchConditional %12308 %9741 %7364\n       %9741 = OpLabel\n      %17463 = OpCompositeExtract %uint %21387 0\n      %11246 = OpCompositeExtract %uint %21387 1\n      %18801 = OpCompositeExtract %uint %21387 2\n      %14831 = OpIMul %uint %22409 %18801\n      %20322 = OpIAdd %uint %11246 %14831\n      %22683 = OpIMul %uint %22408 %20322\n      %11210 = OpIAdd %uint %17463 %22683\n               OpBranch %19040\n       %7364 = OpLabel\n               OpSelectionMerge %23536 DontFlatten\n               OpBranchConditional %17908 %11410 %24353\n      %11410 = OpLabel\n      %21364 = OpShiftRightLogical %uint %22408 %int_5\n      %13804 = OpShiftRightLogical %uint %22409 %int_4\n      %13237 = OpShiftRightArithmetic %int %20261 %int_2\n      %22374 = OpBitcast %int %13804\n      %25085 = OpIMul %int %13237 %22374\n      %11618 = OpShiftRightArithmetic %int %17598 %int_4\n      %16670 = OpIAdd %int %25085 %11618\n      %19064 = OpBitcast %int %21364\n      %13020 = OpIMul %int %16670 %19064\n      %12986 = OpShiftRightArithmetic %int %14100 %int_5\n      %24558 = OpIAdd %int %13020 %12986\n       %8797 = OpShiftLeftLogical %int %24558 %int_7\n      %11434 = OpBitwiseAnd %int %20261 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %17598 %int_1\n      %21365 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21365 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %14100 %int_7\n      %13701 = OpBitwiseOr %int %17102 %20693\n      %10719 = OpBitwiseOr %int %8797 %13701\n      %10225 = OpBitcast %int %10719\n      %19829 = OpShiftRightArithmetic %int %17598 %int_3\n      %22588 = OpBitwiseXor %int %19829 %13237\n      %16793 = OpBitwiseAnd %int %22588 %int_1\n       %9616 = OpShiftRightArithmetic %int %14100 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %17598 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6551\n       %7168 = OpShiftLeftLogical %int %16793 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %10225 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %10225 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %10225 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %10225 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %23536\n      %24353 = OpLabel\n      %23000 = OpBitcast %v2int %17136\n      %22120 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %23000 1\n      %12089 = OpShiftRightArithmetic %int %14597 %int_5\n      %22400 = OpBitcast %int %22120\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %23000 0\n      %20423 = OpShiftRightArithmetic %int %25154 %int_5\n      %18864 = OpIAdd %int %7938 %20423\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25154 %int_7\n       %9666 = OpBitwiseOr %int %21322 %20133\n      %10720 = OpBitwiseOr %int %9546 %9666\n      %10244 = OpBitcast %int %10720\n      %19580 = OpShiftRightArithmetic %int %14597 %int_4\n      %15163 = OpBitwiseAnd %int %19580 %int_1\n      %10406 = OpShiftRightArithmetic %int %25154 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6552\n       %7169 = OpShiftLeftLogical %int %15163 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %10244 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %10244 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %10244 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %10244 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %23536\n      %23536 = OpLabel\n      %10540 = OpPhi %uint %16869 %11410 %16870 %24353\n               OpBranch %19040\n      %19040 = OpLabel\n      %11376 = OpPhi %uint %11210 %9741 %10540 %23536\n      %21072 = OpIAdd %uint %11376 %21025\n      %12528 = OpShiftRightLogical %uint %14582 %int_4\n      %22258 = OpShiftRightLogical %uint %21072 %int_3\n      %10821 = OpAccessChain %_ptr_Uniform_v2uint %xe_texture_load_source %int_0 %22258\n      %14608 = OpLoad %v2uint %10821\n               OpSelectionMerge %24688 DontFlatten\n               OpBranchConditional %17270 %21993 %7205\n      %21993 = OpLabel\n               OpBranch %24688\n       %7205 = OpLabel\n               OpBranch %24688\n      %24688 = OpLabel\n      %11377 = OpPhi %uint %uint_64 %21993 %uint_8 %7205\n      %18621 = OpIAdd %uint %21072 %11377\n      %15698 = OpShiftRightLogical %uint %18621 %int_3\n      %18708 = OpAccessChain %_ptr_Uniform_v2uint %xe_texture_load_source %int_0 %15698\n      %21044 = OpLoad %v2uint %18708\n      %19407 = OpCompositeExtract %uint %14608 0\n      %23515 = OpCompositeExtract %uint %14608 1\n       %7641 = OpCompositeExtract %uint %21044 0\n       %7529 = OpCompositeExtract %uint %21044 1\n      %18260 = OpCompositeConstruct %v4uint %19407 %23515 %7641 %7529\n      %11979 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %12528\n               OpStore %11979 %18260\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_8bpb_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006243, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000140E, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564,\n    0x00000000, 0x000A0005, 0x000007A8, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F, 0x00050006,\n    0x000007A8, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000107A,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73, 0x00006563,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000019, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000140E, 0x00000019,\n    0x00040047, 0x0000140E, 0x00000021, 0x00000000, 0x00040047, 0x0000140E,\n    0x00000022, 0x00000000, 0x00040047, 0x000007D6, 0x00000006, 0x00000008,\n    0x00030047, 0x000007A8, 0x00000003, 0x00040048, 0x000007A8, 0x00000000,\n    0x00000018, 0x00050048, 0x000007A8, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000107A, 0x00000018, 0x00040047, 0x0000107A, 0x00000021,\n    0x00000000, 0x00040047, 0x0000107A, 0x00000022, 0x00000001, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000C, 0x00000020, 0x00000001,\n    0x00040017, 0x00000012, 0x0000000C, 0x00000002, 0x00040015, 0x0000000B,\n    0x00000020, 0x00000000, 0x00040017, 0x00000016, 0x0000000C, 0x00000003,\n    0x00020014, 0x00000009, 0x00040017, 0x00000011, 0x0000000B, 0x00000002,\n    0x00040017, 0x00000014, 0x0000000B, 0x00000003, 0x0004002B, 0x0000000C,\n    0x00000A17, 0x00000004, 0x0004002B, 0x0000000C, 0x00000A1D, 0x00000006,\n    0x0004002B, 0x0000000C, 0x00000A2C, 0x0000000B, 0x0004002B, 0x0000000C,\n    0x00000A38, 0x0000000F, 0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001,\n    0x0004002B, 0x0000000C, 0x00000A1A, 0x00000005, 0x0004002B, 0x0000000C,\n    0x00000A20, 0x00000007, 0x0004002B, 0x0000000C, 0x00000A23, 0x00000008,\n    0x0004002B, 0x0000000C, 0x00000A2F, 0x0000000C, 0x0004002B, 0x0000000B,\n    0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000,\n    0x0004002B, 0x0000000C, 0x00000A14, 0x00000003, 0x0004002B, 0x0000000B,\n    0x00000A10, 0x00000002, 0x0004002B, 0x0000000C, 0x00000A11, 0x00000002,\n    0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000, 0x000A001E, 0x00000489,\n    0x0000000B, 0x0000000B, 0x0000000B, 0x0000000B, 0x00000014, 0x0000000B,\n    0x0000000B, 0x0000000B, 0x00040020, 0x00000706, 0x00000009, 0x00000489,\n    0x0004003B, 0x00000706, 0x00000CE9, 0x00000009, 0x00040020, 0x00000288,\n    0x00000009, 0x0000000B, 0x00040020, 0x00000291, 0x00000009, 0x00000014,\n    0x00040020, 0x00000292, 0x00000001, 0x00000014, 0x0004003B, 0x00000292,\n    0x00000F48, 0x00000001, 0x0004002B, 0x0000000B, 0x00000A16, 0x00000004,\n    0x0006002C, 0x00000014, 0x00000A34, 0x00000A16, 0x00000A0A, 0x00000A0A,\n    0x00040017, 0x0000000F, 0x00000009, 0x00000002, 0x00040017, 0x00000017,\n    0x0000000B, 0x00000004, 0x0003001D, 0x000007DC, 0x00000017, 0x0003001E,\n    0x000007B4, 0x000007DC, 0x00040020, 0x00000A31, 0x00000002, 0x000007B4,\n    0x0004003B, 0x00000A31, 0x0000140E, 0x00000002, 0x0003001D, 0x000007D6,\n    0x00000011, 0x0003001E, 0x000007A8, 0x000007D6, 0x00040020, 0x00000A25,\n    0x00000002, 0x000007A8, 0x0004003B, 0x00000A25, 0x0000107A, 0x00000002,\n    0x00040020, 0x0000028E, 0x00000002, 0x00000011, 0x0004002B, 0x0000000B,\n    0x00000A22, 0x00000008, 0x00040020, 0x00000294, 0x00000002, 0x00000017,\n    0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020, 0x0006002C, 0x00000014,\n    0x00000BC3, 0x00000A16, 0x00000A6A, 0x00000A0D, 0x0004002B, 0x0000000B,\n    0x00000ACA, 0x00000040, 0x00050036, 0x00000008, 0x0000161F, 0x00000000,\n    0x00000502, 0x000200F8, 0x00003B06, 0x000300F7, 0x00004C7A, 0x00000000,\n    0x000300FB, 0x00000A0A, 0x00002E68, 0x000200F8, 0x00002E68, 0x00050041,\n    0x00000288, 0x000060D7, 0x00000CE9, 0x00000A0B, 0x0004003D, 0x0000000B,\n    0x00003526, 0x000060D7, 0x000500C7, 0x0000000B, 0x00005FDC, 0x00003526,\n    0x00000A0D, 0x000500AB, 0x00000009, 0x00004376, 0x00005FDC, 0x00000A0A,\n    0x000500C7, 0x0000000B, 0x00002695, 0x00003526, 0x00000A10, 0x000500AB,\n    0x00000009, 0x000045F4, 0x00002695, 0x00000A0A, 0x00050041, 0x00000288,\n    0x00001F65, 0x00000CE9, 0x00000A0E, 0x0004003D, 0x0000000B, 0x00005221,\n    0x00001F65, 0x00050041, 0x00000288, 0x00004EBA, 0x00000CE9, 0x00000A11,\n    0x0004003D, 0x0000000B, 0x00005788, 0x00004EBA, 0x00050041, 0x00000288,\n    0x00004EBB, 0x00000CE9, 0x00000A14, 0x0004003D, 0x0000000B, 0x00005789,\n    0x00004EBB, 0x00050041, 0x00000291, 0x00004EBC, 0x00000CE9, 0x00000A17,\n    0x0004003D, 0x00000014, 0x0000578A, 0x00004EBC, 0x00050041, 0x00000288,\n    0x00004EBD, 0x00000CE9, 0x00000A1A, 0x0004003D, 0x0000000B, 0x0000578B,\n    0x00004EBD, 0x00050041, 0x00000288, 0x00004E6E, 0x00000CE9, 0x00000A1D,\n    0x0004003D, 0x0000000B, 0x000019C2, 0x00004E6E, 0x0004003D, 0x00000014,\n    0x00002A0E, 0x00000F48, 0x000500C4, 0x00000014, 0x0000538B, 0x00002A0E,\n    0x00000A34, 0x0007004F, 0x00000011, 0x000042F0, 0x0000538B, 0x0000538B,\n    0x00000000, 0x00000001, 0x0007004F, 0x00000011, 0x0000242F, 0x0000578A,\n    0x0000578A, 0x00000000, 0x00000001, 0x000500AE, 0x0000000F, 0x00004288,\n    0x000042F0, 0x0000242F, 0x0004009A, 0x00000009, 0x00006067, 0x00004288,\n    0x000300F7, 0x000019BA, 0x00000002, 0x000400FA, 0x00006067, 0x000055E8,\n    0x000019BA, 0x000200F8, 0x000055E8, 0x000200F9, 0x00004C7A, 0x000200F8,\n    0x000019BA, 0x0004007C, 0x00000016, 0x00005BB6, 0x0000538B, 0x00050051,\n    0x0000000B, 0x0000454D, 0x0000578A, 0x00000001, 0x00050051, 0x0000000C,\n    0x00003714, 0x00005BB6, 0x00000000, 0x00050051, 0x0000000C, 0x00004F25,\n    0x00005BB6, 0x00000002, 0x0004007C, 0x0000000C, 0x000053FD, 0x0000454D,\n    0x00050084, 0x0000000C, 0x00002C0F, 0x00004F25, 0x000053FD, 0x00050051,\n    0x0000000C, 0x000044BE, 0x00005BB6, 0x00000001, 0x00050080, 0x0000000C,\n    0x000056D4, 0x00002C0F, 0x000044BE, 0x0004007C, 0x0000000C, 0x00005785,\n    0x000019C2, 0x00050084, 0x0000000C, 0x00005FD7, 0x000056D4, 0x00005785,\n    0x00050080, 0x0000000C, 0x00002042, 0x00003714, 0x00005FD7, 0x0004007C,\n    0x0000000B, 0x000028A4, 0x00002042, 0x00050080, 0x0000000B, 0x000038F6,\n    0x0000578B, 0x000028A4, 0x000400A8, 0x00000009, 0x00003014, 0x00004376,\n    0x000300F7, 0x00004A60, 0x00000002, 0x000400FA, 0x00003014, 0x0000260D,\n    0x00001CC4, 0x000200F8, 0x0000260D, 0x00050051, 0x0000000B, 0x00004437,\n    0x0000538B, 0x00000000, 0x00050051, 0x0000000B, 0x00002BEE, 0x0000538B,\n    0x00000001, 0x00050051, 0x0000000B, 0x00004971, 0x0000538B, 0x00000002,\n    0x00050084, 0x0000000B, 0x000039EF, 0x00005789, 0x00004971, 0x00050080,\n    0x0000000B, 0x00004F62, 0x00002BEE, 0x000039EF, 0x00050084, 0x0000000B,\n    0x0000589B, 0x00005788, 0x00004F62, 0x00050080, 0x0000000B, 0x00002BCA,\n    0x00004437, 0x0000589B, 0x000200F9, 0x00004A60, 0x000200F8, 0x00001CC4,\n    0x000300F7, 0x00005BF0, 0x00000002, 0x000400FA, 0x000045F4, 0x00002C92,\n    0x00005F21, 0x000200F8, 0x00002C92, 0x000500C2, 0x0000000B, 0x00005374,\n    0x00005788, 0x00000A1A, 0x000500C2, 0x0000000B, 0x000035EC, 0x00005789,\n    0x00000A17, 0x000500C3, 0x0000000C, 0x000033B5, 0x00004F25, 0x00000A11,\n    0x0004007C, 0x0000000C, 0x00005766, 0x000035EC, 0x00050084, 0x0000000C,\n    0x000061FD, 0x000033B5, 0x00005766, 0x000500C3, 0x0000000C, 0x00002D62,\n    0x000044BE, 0x00000A17, 0x00050080, 0x0000000C, 0x0000411E, 0x000061FD,\n    0x00002D62, 0x0004007C, 0x0000000C, 0x00004A78, 0x00005374, 0x00050084,\n    0x0000000C, 0x000032DC, 0x0000411E, 0x00004A78, 0x000500C3, 0x0000000C,\n    0x000032BA, 0x00003714, 0x00000A1A, 0x00050080, 0x0000000C, 0x00005FEE,\n    0x000032DC, 0x000032BA, 0x000500C4, 0x0000000C, 0x0000225D, 0x00005FEE,\n    0x00000A20, 0x000500C7, 0x0000000C, 0x00002CAA, 0x00004F25, 0x00000A14,\n    0x000500C4, 0x0000000C, 0x00004CAE, 0x00002CAA, 0x00000A1A, 0x000500C3,\n    0x0000000C, 0x0000383E, 0x000044BE, 0x00000A0E, 0x000500C7, 0x0000000C,\n    0x00005375, 0x0000383E, 0x00000A14, 0x000500C4, 0x0000000C, 0x000054CA,\n    0x00005375, 0x00000A14, 0x000500C5, 0x0000000C, 0x000042CE, 0x00004CAE,\n    0x000054CA, 0x000500C7, 0x0000000C, 0x000050D5, 0x00003714, 0x00000A20,\n    0x000500C5, 0x0000000C, 0x00003585, 0x000042CE, 0x000050D5, 0x000500C5,\n    0x0000000C, 0x000029DF, 0x0000225D, 0x00003585, 0x0004007C, 0x0000000C,\n    0x000027F1, 0x000029DF, 0x000500C3, 0x0000000C, 0x00004D75, 0x000044BE,\n    0x00000A14, 0x000500C6, 0x0000000C, 0x0000583C, 0x00004D75, 0x000033B5,\n    0x000500C7, 0x0000000C, 0x00004199, 0x0000583C, 0x00000A0E, 0x000500C3,\n    0x0000000C, 0x00002590, 0x00003714, 0x00000A14, 0x000500C7, 0x0000000C,\n    0x0000505E, 0x00002590, 0x00000A14, 0x000500C4, 0x0000000C, 0x0000541D,\n    0x00004199, 0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BA, 0x0000505E,\n    0x0000541D, 0x000500C7, 0x0000000C, 0x00005076, 0x000044BE, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x00005228, 0x00005076, 0x00000A17, 0x000500C4,\n    0x0000000C, 0x00001997, 0x000022BA, 0x00000A1D, 0x000500C5, 0x0000000C,\n    0x000047FE, 0x00005228, 0x00001997, 0x000500C4, 0x0000000C, 0x00001C00,\n    0x00004199, 0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C81, 0x000047FE,\n    0x00001C00, 0x000500C7, 0x0000000C, 0x000050AF, 0x000027F1, 0x00000A38,\n    0x000500C5, 0x0000000C, 0x00003C70, 0x00003C81, 0x000050AF, 0x000500C3,\n    0x0000000C, 0x00003745, 0x000027F1, 0x00000A17, 0x000500C7, 0x0000000C,\n    0x000018B8, 0x00003745, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000547E,\n    0x000018B8, 0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A8, 0x00003C70,\n    0x0000547E, 0x000500C3, 0x0000000C, 0x00003A6E, 0x000027F1, 0x00000A1A,\n    0x000500C7, 0x0000000C, 0x000018B9, 0x00003A6E, 0x00000A20, 0x000500C4,\n    0x0000000C, 0x0000547F, 0x000018B9, 0x00000A23, 0x000500C5, 0x0000000C,\n    0x0000456F, 0x000045A8, 0x0000547F, 0x000500C3, 0x0000000C, 0x00003C88,\n    0x000027F1, 0x00000A23, 0x000500C4, 0x0000000C, 0x00002824, 0x00003C88,\n    0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B79, 0x0000456F, 0x00002824,\n    0x0004007C, 0x0000000B, 0x000041E5, 0x00003B79, 0x000200F9, 0x00005BF0,\n    0x000200F8, 0x00005F21, 0x0004007C, 0x00000012, 0x000059D8, 0x000042F0,\n    0x000500C2, 0x0000000B, 0x00005668, 0x00005788, 0x00000A1A, 0x00050051,\n    0x0000000C, 0x00003905, 0x000059D8, 0x00000001, 0x000500C3, 0x0000000C,\n    0x00002F39, 0x00003905, 0x00000A1A, 0x0004007C, 0x0000000C, 0x00005780,\n    0x00005668, 0x00050084, 0x0000000C, 0x00001F02, 0x00002F39, 0x00005780,\n    0x00050051, 0x0000000C, 0x00006242, 0x000059D8, 0x00000000, 0x000500C3,\n    0x0000000C, 0x00004FC7, 0x00006242, 0x00000A1A, 0x00050080, 0x0000000C,\n    0x000049B0, 0x00001F02, 0x00004FC7, 0x000500C4, 0x0000000C, 0x0000254A,\n    0x000049B0, 0x00000A1D, 0x000500C3, 0x0000000C, 0x0000603B, 0x00003905,\n    0x00000A0E, 0x000500C7, 0x0000000C, 0x0000539A, 0x0000603B, 0x00000A20,\n    0x000500C4, 0x0000000C, 0x0000534A, 0x0000539A, 0x00000A14, 0x000500C7,\n    0x0000000C, 0x00004EA5, 0x00006242, 0x00000A20, 0x000500C5, 0x0000000C,\n    0x000025C2, 0x0000534A, 0x00004EA5, 0x000500C5, 0x0000000C, 0x000029E0,\n    0x0000254A, 0x000025C2, 0x0004007C, 0x0000000C, 0x00002804, 0x000029E0,\n    0x000500C3, 0x0000000C, 0x00004C7C, 0x00003905, 0x00000A17, 0x000500C7,\n    0x0000000C, 0x00003B3B, 0x00004C7C, 0x00000A0E, 0x000500C3, 0x0000000C,\n    0x000028A6, 0x00006242, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000511E,\n    0x000028A6, 0x00000A14, 0x000500C3, 0x0000000C, 0x000028B9, 0x00003905,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x0000505F, 0x000028B9, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x0000541E, 0x0000505F, 0x00000A0E, 0x000500C6,\n    0x0000000C, 0x000022BB, 0x0000511E, 0x0000541E, 0x000500C7, 0x0000000C,\n    0x00005077, 0x00003905, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005229,\n    0x00005077, 0x00000A17, 0x000500C4, 0x0000000C, 0x00001998, 0x000022BB,\n    0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FF, 0x00005229, 0x00001998,\n    0x000500C4, 0x0000000C, 0x00001C01, 0x00003B3B, 0x00000A2C, 0x000500C5,\n    0x0000000C, 0x00003C82, 0x000047FF, 0x00001C01, 0x000500C7, 0x0000000C,\n    0x000050B0, 0x00002804, 0x00000A38, 0x000500C5, 0x0000000C, 0x00003C71,\n    0x00003C82, 0x000050B0, 0x000500C3, 0x0000000C, 0x00003746, 0x00002804,\n    0x00000A17, 0x000500C7, 0x0000000C, 0x000018BA, 0x00003746, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x00005480, 0x000018BA, 0x00000A1A, 0x000500C5,\n    0x0000000C, 0x000045A9, 0x00003C71, 0x00005480, 0x000500C3, 0x0000000C,\n    0x00003A6F, 0x00002804, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018BB,\n    0x00003A6F, 0x00000A20, 0x000500C4, 0x0000000C, 0x00005481, 0x000018BB,\n    0x00000A23, 0x000500C5, 0x0000000C, 0x00004570, 0x000045A9, 0x00005481,\n    0x000500C3, 0x0000000C, 0x00003C89, 0x00002804, 0x00000A23, 0x000500C4,\n    0x0000000C, 0x00002825, 0x00003C89, 0x00000A2F, 0x000500C5, 0x0000000C,\n    0x00003B7A, 0x00004570, 0x00002825, 0x0004007C, 0x0000000B, 0x000041E6,\n    0x00003B7A, 0x000200F9, 0x00005BF0, 0x000200F8, 0x00005BF0, 0x000700F5,\n    0x0000000B, 0x0000292C, 0x000041E5, 0x00002C92, 0x000041E6, 0x00005F21,\n    0x000200F9, 0x00004A60, 0x000200F8, 0x00004A60, 0x000700F5, 0x0000000B,\n    0x00002C70, 0x00002BCA, 0x0000260D, 0x0000292C, 0x00005BF0, 0x00050080,\n    0x0000000B, 0x00005250, 0x00002C70, 0x00005221, 0x000500C2, 0x0000000B,\n    0x000030F0, 0x000038F6, 0x00000A17, 0x000500C2, 0x0000000B, 0x000056F2,\n    0x00005250, 0x00000A14, 0x00060041, 0x0000028E, 0x00002A45, 0x0000107A,\n    0x00000A0B, 0x000056F2, 0x0004003D, 0x00000011, 0x00003910, 0x00002A45,\n    0x000300F7, 0x00006070, 0x00000002, 0x000400FA, 0x00004376, 0x000055E9,\n    0x00001C25, 0x000200F8, 0x000055E9, 0x000200F9, 0x00006070, 0x000200F8,\n    0x00001C25, 0x000200F9, 0x00006070, 0x000200F8, 0x00006070, 0x000700F5,\n    0x0000000B, 0x00002C71, 0x00000ACA, 0x000055E9, 0x00000A22, 0x00001C25,\n    0x00050080, 0x0000000B, 0x000048BD, 0x00005250, 0x00002C71, 0x000500C2,\n    0x0000000B, 0x00003D52, 0x000048BD, 0x00000A14, 0x00060041, 0x0000028E,\n    0x00004914, 0x0000107A, 0x00000A0B, 0x00003D52, 0x0004003D, 0x00000011,\n    0x00005234, 0x00004914, 0x00050051, 0x0000000B, 0x00004BCF, 0x00003910,\n    0x00000000, 0x00050051, 0x0000000B, 0x00005BDB, 0x00003910, 0x00000001,\n    0x00050051, 0x0000000B, 0x00001DD9, 0x00005234, 0x00000000, 0x00050051,\n    0x0000000B, 0x00001D69, 0x00005234, 0x00000001, 0x00070050, 0x00000017,\n    0x00004754, 0x00004BCF, 0x00005BDB, 0x00001DD9, 0x00001D69, 0x00060041,\n    0x00000294, 0x00002ECB, 0x0000140E, 0x00000A0B, 0x000030F0, 0x0003003E,\n    0x00002ECB, 0x00004754, 0x000200F9, 0x00004C7A, 0x000200F8, 0x00004C7A,\n    0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_8bpb_scaled_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25157\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %_runtimearr_v2uint ArrayStride 8\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v3uint = OpTypeVector %uint 3\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n     %uint_1 = OpConstant %uint 1\n     %uint_0 = OpConstant %uint 0\n      %int_3 = OpConstant %int 3\n     %uint_2 = OpConstant %uint 2\n      %int_2 = OpConstant %int 2\n     %uint_3 = OpConstant %uint 3\n     %uint_4 = OpConstant %uint 4\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n     %uint_7 = OpConstant %uint 7\n       %1927 = OpConstantComposite %v2uint %uint_4 %uint_7\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %2612 = OpConstantComposite %v3uint %uint_4 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n     %v4uint = OpTypeVector %uint 4\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n%_runtimearr_v2uint = OpTypeRuntimeArray %v2uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v2uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v2uint = OpTypePointer Uniform %v2uint\n     %uint_8 = OpConstant %uint 8\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n    %uint_32 = OpConstant %uint 32\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %1954 = OpConstantComposite %v2uint %uint_7 %uint_7\n       %1879 = OpConstantComposite %v2uint %uint_4 %uint_3\n    %uint_15 = OpConstant %uint 15\n       %2026 = OpConstantComposite %v2uint %uint_15 %uint_7\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %22279 = OpBitwiseAnd %uint %13606 %uint_2\n      %19223 = OpINotEqual %bool %22279 %uint_0\n      %17247 = OpCompositeConstruct %v2uint %13606 %13606\n      %22947 = OpShiftRightLogical %v2uint %17247 %1927\n       %6551 = OpBitwiseAnd %v2uint %22947 %1954\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2612\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %6586 DontFlatten\n               OpBranchConditional %24679 %21992 %6586\n      %21992 = OpLabel\n               OpBranch %19578\n       %6586 = OpLabel\n      %23478 = OpBitcast %v3int %21387\n      %17741 = OpCompositeExtract %uint %22410 1\n      %14100 = OpCompositeExtract %int %23478 0\n      %20261 = OpCompositeExtract %int %23478 2\n      %21501 = OpBitcast %int %17741\n      %11279 = OpIMul %int %20261 %21501\n      %17598 = OpCompositeExtract %int %23478 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %6594\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %14100 %24535\n      %10898 = OpBitcast %uint %8258\n       %7937 = OpIAdd %uint %22411 %10898\n      %19921 = OpShiftRightLogical %v2uint %17136 %1879\n       %7712 = OpUDiv %v2uint %19921 %6551\n      %18183 = OpIMul %v2uint %6551 %7712\n      %18273 = OpISub %v2uint %19921 %18183\n      %11232 = OpShiftLeftLogical %v2uint %7712 %1879\n      %13284 = OpCompositeExtract %uint %18273 0\n      %10872 = OpCompositeExtract %uint %6551 1\n      %22886 = OpIMul %uint %13284 %10872\n       %6943 = OpCompositeExtract %uint %18273 1\n      %10469 = OpIAdd %uint %22886 %6943\n      %18851 = OpBitwiseAnd %v2uint %17136 %2026\n      %10581 = OpShiftLeftLogical %uint %10469 %uint_7\n      %20916 = OpCompositeExtract %uint %18851 1\n      %23596 = OpShiftLeftLogical %uint %20916 %uint_4\n      %19833 = OpBitwiseOr %uint %10581 %23596\n      %19099 = OpCompositeExtract %uint %18851 0\n      %20454 = OpBitwiseOr %uint %19833 %19099\n      %20502 = OpCompositeExtract %uint %11232 0\n      %15556 = OpCompositeInsert %v3uint %20502 %21387 0\n      %23006 = OpCompositeExtract %uint %11232 1\n       %9680 = OpCompositeInsert %v3uint %23006 %15556 1\n               OpSelectionMerge %20344 DontFlatten\n               OpBranchConditional %19223 %23520 %11737\n      %23520 = OpLabel\n      %10111 = OpBitcast %v3int %9680\n      %19476 = OpShiftRightLogical %uint %22408 %int_5\n      %18810 = OpShiftRightLogical %uint %22409 %int_4\n       %6782 = OpCompositeExtract %int %10111 2\n      %12089 = OpShiftRightArithmetic %int %6782 %int_2\n      %22400 = OpBitcast %int %18810\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %10111 1\n      %19055 = OpShiftRightArithmetic %int %25154 %int_4\n      %11052 = OpIAdd %int %7938 %19055\n      %16898 = OpBitcast %int %19476\n      %14944 = OpIMul %int %11052 %16898\n      %25155 = OpCompositeExtract %int %10111 0\n      %20423 = OpShiftRightArithmetic %int %25155 %int_5\n      %18940 = OpIAdd %int %14944 %20423\n       %8797 = OpShiftLeftLogical %int %18940 %int_7\n      %11434 = OpBitwiseAnd %int %6782 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %25154 %int_1\n      %21364 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21364 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %25155 %int_7\n      %13701 = OpBitwiseOr %int %17102 %20693\n      %10719 = OpBitwiseOr %int %8797 %13701\n      %10225 = OpBitcast %int %10719\n      %19829 = OpShiftRightArithmetic %int %25154 %int_3\n      %22588 = OpBitwiseXor %int %19829 %12089\n      %16793 = OpBitwiseAnd %int %22588 %int_1\n       %9616 = OpShiftRightArithmetic %int %25155 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %25154 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6552 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6552\n       %7168 = OpShiftLeftLogical %int %16793 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %10225 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %10225 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %10225 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %10225 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %20344\n      %11737 = OpLabel\n      %11908 = OpVectorShuffle %v2uint %9680 %9680 0 1\n      %20347 = OpBitcast %v2int %11908\n      %11433 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %20347 1\n      %12090 = OpShiftRightArithmetic %int %14597 %int_5\n      %22401 = OpBitcast %int %11433\n       %7939 = OpIMul %int %12090 %22401\n      %25156 = OpCompositeExtract %int %20347 0\n      %20424 = OpShiftRightArithmetic %int %25156 %int_5\n      %18864 = OpIAdd %int %7939 %20424\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25156 %int_7\n       %9666 = OpBitwiseOr %int %21322 %20133\n      %10720 = OpBitwiseOr %int %9546 %9666\n      %10244 = OpBitcast %int %10720\n      %19580 = OpShiftRightArithmetic %int %14597 %int_4\n      %15163 = OpBitwiseAnd %int %19580 %int_1\n      %10406 = OpShiftRightArithmetic %int %25156 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6553 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6553\n       %7169 = OpShiftLeftLogical %int %15163 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %10244 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %10244 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %10244 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %10244 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %20344\n      %20344 = OpLabel\n      %18329 = OpPhi %uint %16869 %23520 %16870 %11737\n      %15200 = OpCompositeExtract %uint %6551 0\n      %17489 = OpIMul %uint %15200 %10872\n       %7313 = OpIMul %uint %18329 %17489\n       %8815 = OpIAdd %uint %7313 %20454\n      %23921 = OpIAdd %uint %8815 %24236\n      %11494 = OpShiftRightLogical %uint %7937 %int_4\n      %22258 = OpShiftRightLogical %uint %23921 %int_3\n       %8560 = OpAccessChain %_ptr_Uniform_v2uint %xe_texture_load_source %int_0 %22258\n      %15060 = OpLoad %v2uint %8560\n       %8517 = OpIAdd %uint %23921 %uint_8\n      %21670 = OpShiftRightLogical %uint %8517 %int_3\n      %18708 = OpAccessChain %_ptr_Uniform_v2uint %xe_texture_load_source %int_0 %21670\n      %21044 = OpLoad %v2uint %18708\n      %19407 = OpCompositeExtract %uint %15060 0\n      %23515 = OpCompositeExtract %uint %15060 1\n       %7641 = OpCompositeExtract %uint %21044 0\n       %7529 = OpCompositeExtract %uint %21044 1\n      %18260 = OpCompositeConstruct %v4uint %19407 %23515 %7641 %7529\n      %11979 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %11494\n               OpStore %11979 %18260\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_8bpb_scaled_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006245, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000140E, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564,\n    0x00000000, 0x000A0005, 0x000007A8, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F, 0x00050006,\n    0x000007A8, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000107A,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73, 0x00006563,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000019, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000140E, 0x00000019,\n    0x00040047, 0x0000140E, 0x00000021, 0x00000000, 0x00040047, 0x0000140E,\n    0x00000022, 0x00000000, 0x00040047, 0x000007D6, 0x00000006, 0x00000008,\n    0x00030047, 0x000007A8, 0x00000003, 0x00040048, 0x000007A8, 0x00000000,\n    0x00000018, 0x00050048, 0x000007A8, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000107A, 0x00000018, 0x00040047, 0x0000107A, 0x00000021,\n    0x00000000, 0x00040047, 0x0000107A, 0x00000022, 0x00000001, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040015, 0x0000000C,\n    0x00000020, 0x00000001, 0x00040017, 0x00000012, 0x0000000C, 0x00000002,\n    0x00040017, 0x00000016, 0x0000000C, 0x00000003, 0x00020014, 0x00000009,\n    0x00040017, 0x00000014, 0x0000000B, 0x00000003, 0x0004002B, 0x0000000C,\n    0x00000A17, 0x00000004, 0x0004002B, 0x0000000C, 0x00000A1D, 0x00000006,\n    0x0004002B, 0x0000000C, 0x00000A2C, 0x0000000B, 0x0004002B, 0x0000000C,\n    0x00000A38, 0x0000000F, 0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001,\n    0x0004002B, 0x0000000C, 0x00000A1A, 0x00000005, 0x0004002B, 0x0000000C,\n    0x00000A20, 0x00000007, 0x0004002B, 0x0000000C, 0x00000A23, 0x00000008,\n    0x0004002B, 0x0000000C, 0x00000A2F, 0x0000000C, 0x0004002B, 0x0000000B,\n    0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000,\n    0x0004002B, 0x0000000C, 0x00000A14, 0x00000003, 0x0004002B, 0x0000000B,\n    0x00000A10, 0x00000002, 0x0004002B, 0x0000000C, 0x00000A11, 0x00000002,\n    0x0004002B, 0x0000000B, 0x00000A13, 0x00000003, 0x0004002B, 0x0000000B,\n    0x00000A16, 0x00000004, 0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000,\n    0x000A001E, 0x00000489, 0x0000000B, 0x0000000B, 0x0000000B, 0x0000000B,\n    0x00000014, 0x0000000B, 0x0000000B, 0x0000000B, 0x00040020, 0x00000706,\n    0x00000009, 0x00000489, 0x0004003B, 0x00000706, 0x00000CE9, 0x00000009,\n    0x00040020, 0x00000288, 0x00000009, 0x0000000B, 0x0004002B, 0x0000000B,\n    0x00000A1F, 0x00000007, 0x0005002C, 0x00000011, 0x00000787, 0x00000A16,\n    0x00000A1F, 0x00040020, 0x00000291, 0x00000009, 0x00000014, 0x00040020,\n    0x00000292, 0x00000001, 0x00000014, 0x0004003B, 0x00000292, 0x00000F48,\n    0x00000001, 0x0006002C, 0x00000014, 0x00000A34, 0x00000A16, 0x00000A0A,\n    0x00000A0A, 0x00040017, 0x0000000F, 0x00000009, 0x00000002, 0x00040017,\n    0x00000017, 0x0000000B, 0x00000004, 0x0003001D, 0x000007DC, 0x00000017,\n    0x0003001E, 0x000007B4, 0x000007DC, 0x00040020, 0x00000A31, 0x00000002,\n    0x000007B4, 0x0004003B, 0x00000A31, 0x0000140E, 0x00000002, 0x0003001D,\n    0x000007D6, 0x00000011, 0x0003001E, 0x000007A8, 0x000007D6, 0x00040020,\n    0x00000A25, 0x00000002, 0x000007A8, 0x0004003B, 0x00000A25, 0x0000107A,\n    0x00000002, 0x00040020, 0x0000028E, 0x00000002, 0x00000011, 0x0004002B,\n    0x0000000B, 0x00000A22, 0x00000008, 0x00040020, 0x00000294, 0x00000002,\n    0x00000017, 0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020, 0x0006002C,\n    0x00000014, 0x00000BC3, 0x00000A16, 0x00000A6A, 0x00000A0D, 0x0005002C,\n    0x00000011, 0x000007A2, 0x00000A1F, 0x00000A1F, 0x0005002C, 0x00000011,\n    0x00000757, 0x00000A16, 0x00000A13, 0x0004002B, 0x0000000B, 0x00000A37,\n    0x0000000F, 0x0005002C, 0x00000011, 0x000007EA, 0x00000A37, 0x00000A1F,\n    0x00050036, 0x00000008, 0x0000161F, 0x00000000, 0x00000502, 0x000200F8,\n    0x00003B06, 0x000300F7, 0x00004C7A, 0x00000000, 0x000300FB, 0x00000A0A,\n    0x00002E68, 0x000200F8, 0x00002E68, 0x00050041, 0x00000288, 0x000060D7,\n    0x00000CE9, 0x00000A0B, 0x0004003D, 0x0000000B, 0x00003526, 0x000060D7,\n    0x000500C7, 0x0000000B, 0x00005707, 0x00003526, 0x00000A10, 0x000500AB,\n    0x00000009, 0x00004B17, 0x00005707, 0x00000A0A, 0x00050050, 0x00000011,\n    0x0000435F, 0x00003526, 0x00003526, 0x000500C2, 0x00000011, 0x000059A3,\n    0x0000435F, 0x00000787, 0x000500C7, 0x00000011, 0x00001997, 0x000059A3,\n    0x000007A2, 0x00050041, 0x00000288, 0x0000492C, 0x00000CE9, 0x00000A0E,\n    0x0004003D, 0x0000000B, 0x00005EAC, 0x0000492C, 0x00050041, 0x00000288,\n    0x00004EBA, 0x00000CE9, 0x00000A11, 0x0004003D, 0x0000000B, 0x00005788,\n    0x00004EBA, 0x00050041, 0x00000288, 0x00004EBB, 0x00000CE9, 0x00000A14,\n    0x0004003D, 0x0000000B, 0x00005789, 0x00004EBB, 0x00050041, 0x00000291,\n    0x00004EBC, 0x00000CE9, 0x00000A17, 0x0004003D, 0x00000014, 0x0000578A,\n    0x00004EBC, 0x00050041, 0x00000288, 0x00004EBD, 0x00000CE9, 0x00000A1A,\n    0x0004003D, 0x0000000B, 0x0000578B, 0x00004EBD, 0x00050041, 0x00000288,\n    0x00004E6E, 0x00000CE9, 0x00000A1D, 0x0004003D, 0x0000000B, 0x000019C2,\n    0x00004E6E, 0x0004003D, 0x00000014, 0x00002A0E, 0x00000F48, 0x000500C4,\n    0x00000014, 0x0000538B, 0x00002A0E, 0x00000A34, 0x0007004F, 0x00000011,\n    0x000042F0, 0x0000538B, 0x0000538B, 0x00000000, 0x00000001, 0x0007004F,\n    0x00000011, 0x0000242F, 0x0000578A, 0x0000578A, 0x00000000, 0x00000001,\n    0x000500AE, 0x0000000F, 0x00004288, 0x000042F0, 0x0000242F, 0x0004009A,\n    0x00000009, 0x00006067, 0x00004288, 0x000300F7, 0x000019BA, 0x00000002,\n    0x000400FA, 0x00006067, 0x000055E8, 0x000019BA, 0x000200F8, 0x000055E8,\n    0x000200F9, 0x00004C7A, 0x000200F8, 0x000019BA, 0x0004007C, 0x00000016,\n    0x00005BB6, 0x0000538B, 0x00050051, 0x0000000B, 0x0000454D, 0x0000578A,\n    0x00000001, 0x00050051, 0x0000000C, 0x00003714, 0x00005BB6, 0x00000000,\n    0x00050051, 0x0000000C, 0x00004F25, 0x00005BB6, 0x00000002, 0x0004007C,\n    0x0000000C, 0x000053FD, 0x0000454D, 0x00050084, 0x0000000C, 0x00002C0F,\n    0x00004F25, 0x000053FD, 0x00050051, 0x0000000C, 0x000044BE, 0x00005BB6,\n    0x00000001, 0x00050080, 0x0000000C, 0x000056D4, 0x00002C0F, 0x000044BE,\n    0x0004007C, 0x0000000C, 0x00005785, 0x000019C2, 0x00050084, 0x0000000C,\n    0x00005FD7, 0x000056D4, 0x00005785, 0x00050080, 0x0000000C, 0x00002042,\n    0x00003714, 0x00005FD7, 0x0004007C, 0x0000000B, 0x00002A92, 0x00002042,\n    0x00050080, 0x0000000B, 0x00001F01, 0x0000578B, 0x00002A92, 0x000500C2,\n    0x00000011, 0x00004DD1, 0x000042F0, 0x00000757, 0x00050086, 0x00000011,\n    0x00001E20, 0x00004DD1, 0x00001997, 0x00050084, 0x00000011, 0x00004707,\n    0x00001997, 0x00001E20, 0x00050082, 0x00000011, 0x00004761, 0x00004DD1,\n    0x00004707, 0x000500C4, 0x00000011, 0x00002BE0, 0x00001E20, 0x00000757,\n    0x00050051, 0x0000000B, 0x000033E4, 0x00004761, 0x00000000, 0x00050051,\n    0x0000000B, 0x00002A78, 0x00001997, 0x00000001, 0x00050084, 0x0000000B,\n    0x00005966, 0x000033E4, 0x00002A78, 0x00050051, 0x0000000B, 0x00001B1F,\n    0x00004761, 0x00000001, 0x00050080, 0x0000000B, 0x000028E5, 0x00005966,\n    0x00001B1F, 0x000500C7, 0x00000011, 0x000049A3, 0x000042F0, 0x000007EA,\n    0x000500C4, 0x0000000B, 0x00002955, 0x000028E5, 0x00000A1F, 0x00050051,\n    0x0000000B, 0x000051B4, 0x000049A3, 0x00000001, 0x000500C4, 0x0000000B,\n    0x00005C2C, 0x000051B4, 0x00000A16, 0x000500C5, 0x0000000B, 0x00004D79,\n    0x00002955, 0x00005C2C, 0x00050051, 0x0000000B, 0x00004A9B, 0x000049A3,\n    0x00000000, 0x000500C5, 0x0000000B, 0x00004FE6, 0x00004D79, 0x00004A9B,\n    0x00050051, 0x0000000B, 0x00005016, 0x00002BE0, 0x00000000, 0x00060052,\n    0x00000014, 0x00003CC4, 0x00005016, 0x0000538B, 0x00000000, 0x00050051,\n    0x0000000B, 0x000059DE, 0x00002BE0, 0x00000001, 0x00060052, 0x00000014,\n    0x000025D0, 0x000059DE, 0x00003CC4, 0x00000001, 0x000300F7, 0x00004F78,\n    0x00000002, 0x000400FA, 0x00004B17, 0x00005BE0, 0x00002DD9, 0x000200F8,\n    0x00005BE0, 0x0004007C, 0x00000016, 0x0000277F, 0x000025D0, 0x000500C2,\n    0x0000000B, 0x00004C14, 0x00005788, 0x00000A1A, 0x000500C2, 0x0000000B,\n    0x0000497A, 0x00005789, 0x00000A17, 0x00050051, 0x0000000C, 0x00001A7E,\n    0x0000277F, 0x00000002, 0x000500C3, 0x0000000C, 0x00002F39, 0x00001A7E,\n    0x00000A11, 0x0004007C, 0x0000000C, 0x00005780, 0x0000497A, 0x00050084,\n    0x0000000C, 0x00001F02, 0x00002F39, 0x00005780, 0x00050051, 0x0000000C,\n    0x00006242, 0x0000277F, 0x00000001, 0x000500C3, 0x0000000C, 0x00004A6F,\n    0x00006242, 0x00000A17, 0x00050080, 0x0000000C, 0x00002B2C, 0x00001F02,\n    0x00004A6F, 0x0004007C, 0x0000000C, 0x00004202, 0x00004C14, 0x00050084,\n    0x0000000C, 0x00003A60, 0x00002B2C, 0x00004202, 0x00050051, 0x0000000C,\n    0x00006243, 0x0000277F, 0x00000000, 0x000500C3, 0x0000000C, 0x00004FC7,\n    0x00006243, 0x00000A1A, 0x00050080, 0x0000000C, 0x000049FC, 0x00003A60,\n    0x00004FC7, 0x000500C4, 0x0000000C, 0x0000225D, 0x000049FC, 0x00000A20,\n    0x000500C7, 0x0000000C, 0x00002CAA, 0x00001A7E, 0x00000A14, 0x000500C4,\n    0x0000000C, 0x00004CAE, 0x00002CAA, 0x00000A1A, 0x000500C3, 0x0000000C,\n    0x0000383E, 0x00006242, 0x00000A0E, 0x000500C7, 0x0000000C, 0x00005374,\n    0x0000383E, 0x00000A14, 0x000500C4, 0x0000000C, 0x000054CA, 0x00005374,\n    0x00000A14, 0x000500C5, 0x0000000C, 0x000042CE, 0x00004CAE, 0x000054CA,\n    0x000500C7, 0x0000000C, 0x000050D5, 0x00006243, 0x00000A20, 0x000500C5,\n    0x0000000C, 0x00003585, 0x000042CE, 0x000050D5, 0x000500C5, 0x0000000C,\n    0x000029DF, 0x0000225D, 0x00003585, 0x0004007C, 0x0000000C, 0x000027F1,\n    0x000029DF, 0x000500C3, 0x0000000C, 0x00004D75, 0x00006242, 0x00000A14,\n    0x000500C6, 0x0000000C, 0x0000583C, 0x00004D75, 0x00002F39, 0x000500C7,\n    0x0000000C, 0x00004199, 0x0000583C, 0x00000A0E, 0x000500C3, 0x0000000C,\n    0x00002590, 0x00006243, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000505E,\n    0x00002590, 0x00000A14, 0x000500C4, 0x0000000C, 0x0000541D, 0x00004199,\n    0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BA, 0x0000505E, 0x0000541D,\n    0x000500C7, 0x0000000C, 0x00005076, 0x00006242, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x00005228, 0x00005076, 0x00000A17, 0x000500C4, 0x0000000C,\n    0x00001998, 0x000022BA, 0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FE,\n    0x00005228, 0x00001998, 0x000500C4, 0x0000000C, 0x00001C00, 0x00004199,\n    0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C81, 0x000047FE, 0x00001C00,\n    0x000500C7, 0x0000000C, 0x000050AF, 0x000027F1, 0x00000A38, 0x000500C5,\n    0x0000000C, 0x00003C70, 0x00003C81, 0x000050AF, 0x000500C3, 0x0000000C,\n    0x00003745, 0x000027F1, 0x00000A17, 0x000500C7, 0x0000000C, 0x000018B8,\n    0x00003745, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000547E, 0x000018B8,\n    0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A8, 0x00003C70, 0x0000547E,\n    0x000500C3, 0x0000000C, 0x00003A6E, 0x000027F1, 0x00000A1A, 0x000500C7,\n    0x0000000C, 0x000018B9, 0x00003A6E, 0x00000A20, 0x000500C4, 0x0000000C,\n    0x0000547F, 0x000018B9, 0x00000A23, 0x000500C5, 0x0000000C, 0x0000456F,\n    0x000045A8, 0x0000547F, 0x000500C3, 0x0000000C, 0x00003C88, 0x000027F1,\n    0x00000A23, 0x000500C4, 0x0000000C, 0x00002824, 0x00003C88, 0x00000A2F,\n    0x000500C5, 0x0000000C, 0x00003B79, 0x0000456F, 0x00002824, 0x0004007C,\n    0x0000000B, 0x000041E5, 0x00003B79, 0x000200F9, 0x00004F78, 0x000200F8,\n    0x00002DD9, 0x0007004F, 0x00000011, 0x00002E84, 0x000025D0, 0x000025D0,\n    0x00000000, 0x00000001, 0x0004007C, 0x00000012, 0x00004F7B, 0x00002E84,\n    0x000500C2, 0x0000000B, 0x00002CA9, 0x00005788, 0x00000A1A, 0x00050051,\n    0x0000000C, 0x00003905, 0x00004F7B, 0x00000001, 0x000500C3, 0x0000000C,\n    0x00002F3A, 0x00003905, 0x00000A1A, 0x0004007C, 0x0000000C, 0x00005781,\n    0x00002CA9, 0x00050084, 0x0000000C, 0x00001F03, 0x00002F3A, 0x00005781,\n    0x00050051, 0x0000000C, 0x00006244, 0x00004F7B, 0x00000000, 0x000500C3,\n    0x0000000C, 0x00004FC8, 0x00006244, 0x00000A1A, 0x00050080, 0x0000000C,\n    0x000049B0, 0x00001F03, 0x00004FC8, 0x000500C4, 0x0000000C, 0x0000254A,\n    0x000049B0, 0x00000A1D, 0x000500C3, 0x0000000C, 0x0000603B, 0x00003905,\n    0x00000A0E, 0x000500C7, 0x0000000C, 0x0000539A, 0x0000603B, 0x00000A20,\n    0x000500C4, 0x0000000C, 0x0000534A, 0x0000539A, 0x00000A14, 0x000500C7,\n    0x0000000C, 0x00004EA5, 0x00006244, 0x00000A20, 0x000500C5, 0x0000000C,\n    0x000025C2, 0x0000534A, 0x00004EA5, 0x000500C5, 0x0000000C, 0x000029E0,\n    0x0000254A, 0x000025C2, 0x0004007C, 0x0000000C, 0x00002804, 0x000029E0,\n    0x000500C3, 0x0000000C, 0x00004C7C, 0x00003905, 0x00000A17, 0x000500C7,\n    0x0000000C, 0x00003B3B, 0x00004C7C, 0x00000A0E, 0x000500C3, 0x0000000C,\n    0x000028A6, 0x00006244, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000511E,\n    0x000028A6, 0x00000A14, 0x000500C3, 0x0000000C, 0x000028B9, 0x00003905,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x0000505F, 0x000028B9, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x0000541E, 0x0000505F, 0x00000A0E, 0x000500C6,\n    0x0000000C, 0x000022BB, 0x0000511E, 0x0000541E, 0x000500C7, 0x0000000C,\n    0x00005077, 0x00003905, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005229,\n    0x00005077, 0x00000A17, 0x000500C4, 0x0000000C, 0x00001999, 0x000022BB,\n    0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FF, 0x00005229, 0x00001999,\n    0x000500C4, 0x0000000C, 0x00001C01, 0x00003B3B, 0x00000A2C, 0x000500C5,\n    0x0000000C, 0x00003C82, 0x000047FF, 0x00001C01, 0x000500C7, 0x0000000C,\n    0x000050B0, 0x00002804, 0x00000A38, 0x000500C5, 0x0000000C, 0x00003C71,\n    0x00003C82, 0x000050B0, 0x000500C3, 0x0000000C, 0x00003746, 0x00002804,\n    0x00000A17, 0x000500C7, 0x0000000C, 0x000018BA, 0x00003746, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x00005480, 0x000018BA, 0x00000A1A, 0x000500C5,\n    0x0000000C, 0x000045A9, 0x00003C71, 0x00005480, 0x000500C3, 0x0000000C,\n    0x00003A6F, 0x00002804, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018BB,\n    0x00003A6F, 0x00000A20, 0x000500C4, 0x0000000C, 0x00005481, 0x000018BB,\n    0x00000A23, 0x000500C5, 0x0000000C, 0x00004570, 0x000045A9, 0x00005481,\n    0x000500C3, 0x0000000C, 0x00003C89, 0x00002804, 0x00000A23, 0x000500C4,\n    0x0000000C, 0x00002825, 0x00003C89, 0x00000A2F, 0x000500C5, 0x0000000C,\n    0x00003B7A, 0x00004570, 0x00002825, 0x0004007C, 0x0000000B, 0x000041E6,\n    0x00003B7A, 0x000200F9, 0x00004F78, 0x000200F8, 0x00004F78, 0x000700F5,\n    0x0000000B, 0x00004799, 0x000041E5, 0x00005BE0, 0x000041E6, 0x00002DD9,\n    0x00050051, 0x0000000B, 0x00003B60, 0x00001997, 0x00000000, 0x00050084,\n    0x0000000B, 0x00004451, 0x00003B60, 0x00002A78, 0x00050084, 0x0000000B,\n    0x00001C91, 0x00004799, 0x00004451, 0x00050080, 0x0000000B, 0x0000226F,\n    0x00001C91, 0x00004FE6, 0x00050080, 0x0000000B, 0x00005D71, 0x0000226F,\n    0x00005EAC, 0x000500C2, 0x0000000B, 0x00002CE6, 0x00001F01, 0x00000A17,\n    0x000500C2, 0x0000000B, 0x000056F2, 0x00005D71, 0x00000A14, 0x00060041,\n    0x0000028E, 0x00002170, 0x0000107A, 0x00000A0B, 0x000056F2, 0x0004003D,\n    0x00000011, 0x00003AD4, 0x00002170, 0x00050080, 0x0000000B, 0x00002145,\n    0x00005D71, 0x00000A22, 0x000500C2, 0x0000000B, 0x000054A6, 0x00002145,\n    0x00000A14, 0x00060041, 0x0000028E, 0x00004914, 0x0000107A, 0x00000A0B,\n    0x000054A6, 0x0004003D, 0x00000011, 0x00005234, 0x00004914, 0x00050051,\n    0x0000000B, 0x00004BCF, 0x00003AD4, 0x00000000, 0x00050051, 0x0000000B,\n    0x00005BDB, 0x00003AD4, 0x00000001, 0x00050051, 0x0000000B, 0x00001DD9,\n    0x00005234, 0x00000000, 0x00050051, 0x0000000B, 0x00001D69, 0x00005234,\n    0x00000001, 0x00070050, 0x00000017, 0x00004754, 0x00004BCF, 0x00005BDB,\n    0x00001DD9, 0x00001D69, 0x00060041, 0x00000294, 0x00002ECB, 0x0000140E,\n    0x00000A0B, 0x00002CE6, 0x0003003E, 0x00002ECB, 0x00004754, 0x000200F9,\n    0x00004C7A, 0x000200F8, 0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_bgrg8_rgb8_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25155\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n     %v4uint = OpTypeVector %uint 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v3uint = OpTypeVector %uint 3\n%uint_16711680 = OpConstant %uint 16711680\n    %uint_16 = OpConstant %uint 16\n   %uint_255 = OpConstant %uint 255\n   %uint_257 = OpConstant %uint 257\n %uint_65280 = OpConstant %uint 65280\n%uint_4278190080 = OpConstant %uint 4278190080\n     %uint_1 = OpConstant %uint 1\n     %uint_2 = OpConstant %uint 2\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n     %uint_3 = OpConstant %uint 3\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n     %uint_0 = OpConstant %uint 0\n      %int_3 = OpConstant %int 3\n      %int_2 = OpConstant %int 2\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %2603 = OpConstantComposite %v3uint %uint_3 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n     %uint_4 = OpConstant %uint 4\n    %uint_32 = OpConstant %uint 32\n    %uint_48 = OpConstant %uint 48\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n       %2993 = OpConstantComposite %v2uint %uint_16711680 %uint_16711680\n       %2143 = OpConstantComposite %v2uint %uint_16 %uint_16\n       %1140 = OpConstantComposite %v2uint %uint_255 %uint_255\n       %1182 = OpConstantComposite %v2uint %uint_257 %uint_257\n       %2682 = OpConstantComposite %v2uint %uint_65280 %uint_65280\n       %2014 = OpConstantComposite %v2uint %uint_4278190080 %uint_4278190080\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24540 = OpBitwiseAnd %uint %13606 %uint_1\n      %17270 = OpINotEqual %bool %24540 %uint_0\n      %12328 = OpBitwiseAnd %uint %13606 %uint_2\n      %17284 = OpINotEqual %bool %12328 %uint_0\n       %7856 = OpShiftRightLogical %uint %13606 %uint_2\n      %25058 = OpBitwiseAnd %uint %7856 %uint_3\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2603\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %6586 DontFlatten\n               OpBranchConditional %24679 %21992 %6586\n      %21992 = OpLabel\n               OpBranch %19578\n       %6586 = OpLabel\n      %23478 = OpBitcast %v3int %21387\n      %18710 = OpCompositeExtract %uint %22410 1\n      %23531 = OpCompositeExtract %int %23478 0\n      %22810 = OpIMul %int %23531 %int_8\n       %6362 = OpCompositeExtract %int %23478 2\n      %14505 = OpBitcast %int %18710\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %23478 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %6594\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %22810 %24535\n      %10404 = OpBitcast %uint %8258\n      %14582 = OpIAdd %uint %22411 %10404\n      %12308 = OpLogicalNot %bool %17270\n               OpSelectionMerge %19040 DontFlatten\n               OpBranchConditional %12308 %9741 %17007\n       %9741 = OpLabel\n      %17463 = OpCompositeExtract %uint %21387 0\n      %11246 = OpCompositeExtract %uint %21387 1\n      %18801 = OpCompositeExtract %uint %21387 2\n      %14831 = OpIMul %uint %22409 %18801\n      %20322 = OpIAdd %uint %11246 %14831\n      %21676 = OpIMul %uint %22408 %20322\n      %20398 = OpIAdd %uint %17463 %21676\n      %11367 = OpShiftLeftLogical %uint %20398 %uint_2\n               OpBranch %19040\n      %17007 = OpLabel\n               OpSelectionMerge %23536 DontFlatten\n               OpBranchConditional %17284 %11410 %24353\n      %11410 = OpLabel\n      %21364 = OpShiftRightLogical %uint %22408 %int_5\n      %13804 = OpShiftRightLogical %uint %22409 %int_4\n      %13237 = OpShiftRightArithmetic %int %6362 %int_2\n      %22374 = OpBitcast %int %13804\n      %25085 = OpIMul %int %13237 %22374\n      %11618 = OpShiftRightArithmetic %int %17598 %int_4\n      %16670 = OpIAdd %int %25085 %11618\n      %19064 = OpBitcast %int %21364\n      %13020 = OpIMul %int %16670 %19064\n      %12986 = OpShiftRightArithmetic %int %23531 %int_5\n      %24558 = OpIAdd %int %13020 %12986\n       %8797 = OpShiftLeftLogical %int %24558 %int_7\n      %11434 = OpBitwiseAnd %int %6362 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %17598 %int_1\n      %21365 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21365 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %23531 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17334 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17334 %uint_2\n      %13015 = OpShiftRightArithmetic %int %17598 %int_3\n       %9929 = OpBitwiseXor %int %13015 %13237\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %23531 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %17598 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6551\n       %7168 = OpShiftLeftLogical %int %16793 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24144 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24144 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24144 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24144 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %23536\n      %24353 = OpLabel\n      %23000 = OpBitcast %v2int %17136\n      %22120 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %23000 1\n      %12089 = OpShiftRightArithmetic %int %14597 %int_5\n      %22400 = OpBitcast %int %22120\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %23000 0\n      %20423 = OpShiftRightArithmetic %int %25154 %int_5\n      %18864 = OpIAdd %int %7938 %20423\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25154 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17335 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17335 %uint_2\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25154 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6552\n       %7169 = OpShiftLeftLogical %int %21575 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24163 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24163 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24163 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %23536\n      %23536 = OpLabel\n      %10540 = OpPhi %uint %16869 %11410 %16870 %24353\n               OpBranch %19040\n      %19040 = OpLabel\n      %11376 = OpPhi %uint %11367 %9741 %10540 %23536\n      %18621 = OpIAdd %uint %11376 %24236\n      %15698 = OpShiftRightLogical %uint %18621 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15698\n       %7338 = OpLoad %v4uint %20399\n      %13760 = OpIEqual %bool %25058 %uint_1\n      %21366 = OpIEqual %bool %25058 %uint_2\n      %22150 = OpLogicalOr %bool %13760 %21366\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %7338 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %7338 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22649 = OpPhi %v4uint %7338 %19040 %16376 %10583\n      %19638 = OpIEqual %bool %25058 %uint_3\n      %15139 = OpLogicalOr %bool %21366 %19638\n               OpSelectionMerge %11682 None\n               OpBranchConditional %15139 %11064 %11682\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22649 %749\n      %15335 = OpShiftRightLogical %v4uint %22649 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %11682\n      %11682 = OpLabel\n      %19948 = OpPhi %v4uint %22649 %13411 %10728 %11064\n      %21173 = OpVectorShuffle %v2uint %19948 %19948 0 1\n      %12738 = OpBitwiseAnd %v2uint %21173 %2993\n      %21619 = OpShiftRightLogical %v2uint %12738 %2143\n       %6955 = OpBitwiseAnd %v2uint %21173 %1140\n      %16264 = OpShiftLeftLogical %v2uint %6955 %2143\n      %22500 = OpIMul %v2uint %16264 %1182\n       %9857 = OpBitwiseOr %v2uint %21619 %22500\n       %7416 = OpBitwiseAnd %v2uint %21173 %2682\n      %16088 = OpBitwiseAnd %v2uint %21173 %2014\n      %21002 = OpShiftRightLogical %v2uint %16088 %2143\n       %7420 = OpCompositeExtract %uint %7416 0\n      %24539 = OpCompositeExtract %uint %7416 1\n       %7641 = OpCompositeExtract %uint %21002 0\n       %7795 = OpCompositeExtract %uint %21002 1\n      %16161 = OpCompositeConstruct %v4uint %7420 %24539 %7641 %7795\n       %7774 = OpVectorShuffle %v4uint %16161 %16161 0 2 1 3\n       %6860 = OpVectorShuffle %v4uint %9857 %9857 0 0 1 1\n      %24909 = OpBitwiseOr %v4uint %6860 %7774\n      %17181 = OpVectorShuffle %v2uint %19948 %19948 2 3\n       %6311 = OpBitwiseAnd %v2uint %17181 %2993\n      %21620 = OpShiftRightLogical %v2uint %6311 %2143\n       %6956 = OpBitwiseAnd %v2uint %17181 %1140\n      %16265 = OpShiftLeftLogical %v2uint %6956 %2143\n      %22501 = OpIMul %v2uint %16265 %1182\n       %9858 = OpBitwiseOr %v2uint %21620 %22501\n       %7417 = OpBitwiseAnd %v2uint %17181 %2682\n      %16089 = OpBitwiseAnd %v2uint %17181 %2014\n      %21003 = OpShiftRightLogical %v2uint %16089 %2143\n       %7421 = OpCompositeExtract %uint %7417 0\n      %24541 = OpCompositeExtract %uint %7417 1\n       %7642 = OpCompositeExtract %uint %21003 0\n       %7796 = OpCompositeExtract %uint %21003 1\n      %16162 = OpCompositeConstruct %v4uint %7421 %24541 %7642 %7796\n       %7775 = OpVectorShuffle %v4uint %16162 %16162 0 2 1 3\n       %9045 = OpVectorShuffle %v4uint %9858 %9858 0 0 1 1\n      %21539 = OpBitwiseOr %v4uint %9045 %7775\n      %23682 = OpShiftRightLogical %uint %14582 %int_4\n       %7578 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %23682\n               OpStore %7578 %24909\n       %8268 = OpIAdd %uint %14582 %uint_16\n       %6653 = OpShiftRightLogical %uint %8268 %int_4\n      %21689 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %6653\n               OpStore %21689 %21539\n               OpSelectionMerge %24688 DontFlatten\n               OpBranchConditional %17270 %21993 %7205\n      %21993 = OpLabel\n               OpBranch %24688\n       %7205 = OpLabel\n               OpBranch %24688\n      %24688 = OpLabel\n      %11377 = OpPhi %uint %uint_32 %21993 %uint_16 %7205\n      %18622 = OpIAdd %uint %18621 %11377\n      %15699 = OpShiftRightLogical %uint %18622 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15699\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %14874 None\n               OpBranchConditional %22150 %10584 %14874\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %14874\n      %14874 = OpLabel\n      %10924 = OpPhi %v4uint %14608 %24688 %16377 %10584\n               OpSelectionMerge %11683 None\n               OpBranchConditional %15139 %11065 %11683\n      %11065 = OpLabel\n      %24088 = OpShiftLeftLogical %v4uint %10924 %749\n      %15336 = OpShiftRightLogical %v4uint %10924 %749\n      %10729 = OpBitwiseOr %v4uint %24088 %15336\n               OpBranch %11683\n      %11683 = OpLabel\n      %19949 = OpPhi %v4uint %10924 %14874 %10729 %11065\n      %21174 = OpVectorShuffle %v2uint %19949 %19949 0 1\n      %12739 = OpBitwiseAnd %v2uint %21174 %2993\n      %21621 = OpShiftRightLogical %v2uint %12739 %2143\n       %6957 = OpBitwiseAnd %v2uint %21174 %1140\n      %16266 = OpShiftLeftLogical %v2uint %6957 %2143\n      %22502 = OpIMul %v2uint %16266 %1182\n       %9859 = OpBitwiseOr %v2uint %21621 %22502\n       %7418 = OpBitwiseAnd %v2uint %21174 %2682\n      %16090 = OpBitwiseAnd %v2uint %21174 %2014\n      %21004 = OpShiftRightLogical %v2uint %16090 %2143\n       %7422 = OpCompositeExtract %uint %7418 0\n      %24542 = OpCompositeExtract %uint %7418 1\n       %7643 = OpCompositeExtract %uint %21004 0\n       %7797 = OpCompositeExtract %uint %21004 1\n      %16163 = OpCompositeConstruct %v4uint %7422 %24542 %7643 %7797\n       %7776 = OpVectorShuffle %v4uint %16163 %16163 0 2 1 3\n       %6861 = OpVectorShuffle %v4uint %9859 %9859 0 0 1 1\n      %24910 = OpBitwiseOr %v4uint %6861 %7776\n      %17182 = OpVectorShuffle %v2uint %19949 %19949 2 3\n       %6312 = OpBitwiseAnd %v2uint %17182 %2993\n      %21622 = OpShiftRightLogical %v2uint %6312 %2143\n       %6958 = OpBitwiseAnd %v2uint %17182 %1140\n      %16267 = OpShiftLeftLogical %v2uint %6958 %2143\n      %22503 = OpIMul %v2uint %16267 %1182\n       %9860 = OpBitwiseOr %v2uint %21622 %22503\n       %7419 = OpBitwiseAnd %v2uint %17182 %2682\n      %16091 = OpBitwiseAnd %v2uint %17182 %2014\n      %21005 = OpShiftRightLogical %v2uint %16091 %2143\n       %7423 = OpCompositeExtract %uint %7419 0\n      %24543 = OpCompositeExtract %uint %7419 1\n       %7644 = OpCompositeExtract %uint %21005 0\n       %7798 = OpCompositeExtract %uint %21005 1\n      %16164 = OpCompositeConstruct %v4uint %7423 %24543 %7644 %7798\n       %7777 = OpVectorShuffle %v4uint %16164 %16164 0 2 1 3\n       %7791 = OpVectorShuffle %v4uint %9860 %9860 0 0 1 1\n      %16337 = OpBitwiseOr %v4uint %7791 %7777\n      %14629 = OpIAdd %uint %14582 %uint_32\n      %21904 = OpShiftRightLogical %uint %14629 %int_4\n      %19428 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %21904\n               OpStore %19428 %24910\n       %8269 = OpIAdd %uint %14582 %uint_48\n       %6654 = OpShiftRightLogical %uint %8269 %int_4\n      %21727 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %6654\n               OpStore %21727 %16337\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_bgrg8_rgb8_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006243, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000017,\n    0x0000000B, 0x00000004, 0x00040015, 0x0000000C, 0x00000020, 0x00000001,\n    0x00040017, 0x00000012, 0x0000000C, 0x00000002, 0x00040017, 0x00000016,\n    0x0000000C, 0x00000003, 0x00020014, 0x00000009, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x0004002B, 0x0000000B, 0x000005A9, 0x00FF0000,\n    0x0004002B, 0x0000000B, 0x00000A3A, 0x00000010, 0x0004002B, 0x0000000B,\n    0x00000144, 0x000000FF, 0x0004002B, 0x0000000B, 0x0000014A, 0x00000101,\n    0x0004002B, 0x0000000B, 0x00000A87, 0x0000FF00, 0x0004002B, 0x0000000B,\n    0x00000580, 0xFF000000, 0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001,\n    0x0004002B, 0x0000000B, 0x00000A10, 0x00000002, 0x0004002B, 0x0000000B,\n    0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B, 0x00000A22, 0x00000008,\n    0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00, 0x0004002B, 0x0000000B,\n    0x00000A13, 0x00000003, 0x0004002B, 0x0000000C, 0x00000A17, 0x00000004,\n    0x0004002B, 0x0000000C, 0x00000A1D, 0x00000006, 0x0004002B, 0x0000000C,\n    0x00000A2C, 0x0000000B, 0x0004002B, 0x0000000C, 0x00000A38, 0x0000000F,\n    0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C,\n    0x00000A1A, 0x00000005, 0x0004002B, 0x0000000C, 0x00000A20, 0x00000007,\n    0x0004002B, 0x0000000C, 0x00000A23, 0x00000008, 0x0004002B, 0x0000000C,\n    0x00000A2F, 0x0000000C, 0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000,\n    0x0004002B, 0x0000000C, 0x00000A14, 0x00000003, 0x0004002B, 0x0000000C,\n    0x00000A11, 0x00000002, 0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000,\n    0x000A001E, 0x00000489, 0x0000000B, 0x0000000B, 0x0000000B, 0x0000000B,\n    0x00000014, 0x0000000B, 0x0000000B, 0x0000000B, 0x00040020, 0x00000706,\n    0x00000009, 0x00000489, 0x0004003B, 0x00000706, 0x00000CE9, 0x00000009,\n    0x00040020, 0x00000288, 0x00000009, 0x0000000B, 0x00040020, 0x00000291,\n    0x00000009, 0x00000014, 0x00040020, 0x00000292, 0x00000001, 0x00000014,\n    0x0004003B, 0x00000292, 0x00000F48, 0x00000001, 0x0006002C, 0x00000014,\n    0x00000A2B, 0x00000A13, 0x00000A0A, 0x00000A0A, 0x00040017, 0x0000000F,\n    0x00000009, 0x00000002, 0x0003001D, 0x000007DC, 0x00000017, 0x0003001E,\n    0x000007B4, 0x000007DC, 0x00040020, 0x00000A31, 0x00000002, 0x000007B4,\n    0x0004003B, 0x00000A31, 0x0000107A, 0x00000002, 0x00040020, 0x00000294,\n    0x00000002, 0x00000017, 0x0003001D, 0x000007DD, 0x00000017, 0x0003001E,\n    0x000007B5, 0x000007DD, 0x00040020, 0x00000A32, 0x00000002, 0x000007B5,\n    0x0004003B, 0x00000A32, 0x0000140E, 0x00000002, 0x0004002B, 0x0000000B,\n    0x00000A16, 0x00000004, 0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020,\n    0x0004002B, 0x0000000B, 0x00000A9A, 0x00000030, 0x0006002C, 0x00000014,\n    0x00000BC3, 0x00000A16, 0x00000A6A, 0x00000A0D, 0x0007002C, 0x00000017,\n    0x000009CE, 0x000008A6, 0x000008A6, 0x000008A6, 0x000008A6, 0x0007002C,\n    0x00000017, 0x0000013D, 0x00000A22, 0x00000A22, 0x00000A22, 0x00000A22,\n    0x0007002C, 0x00000017, 0x0000072E, 0x000005FD, 0x000005FD, 0x000005FD,\n    0x000005FD, 0x0007002C, 0x00000017, 0x000002ED, 0x00000A3A, 0x00000A3A,\n    0x00000A3A, 0x00000A3A, 0x0005002C, 0x00000011, 0x00000BB1, 0x000005A9,\n    0x000005A9, 0x0005002C, 0x00000011, 0x0000085F, 0x00000A3A, 0x00000A3A,\n    0x0005002C, 0x00000011, 0x00000474, 0x00000144, 0x00000144, 0x0005002C,\n    0x00000011, 0x0000049E, 0x0000014A, 0x0000014A, 0x0005002C, 0x00000011,\n    0x00000A7A, 0x00000A87, 0x00000A87, 0x0005002C, 0x00000011, 0x000007DE,\n    0x00000580, 0x00000580, 0x00050036, 0x00000008, 0x0000161F, 0x00000000,\n    0x00000502, 0x000200F8, 0x00003B06, 0x000300F7, 0x00004C7A, 0x00000000,\n    0x000300FB, 0x00000A0A, 0x00002E68, 0x000200F8, 0x00002E68, 0x00050041,\n    0x00000288, 0x000060D7, 0x00000CE9, 0x00000A0B, 0x0004003D, 0x0000000B,\n    0x00003526, 0x000060D7, 0x000500C7, 0x0000000B, 0x00005FDC, 0x00003526,\n    0x00000A0D, 0x000500AB, 0x00000009, 0x00004376, 0x00005FDC, 0x00000A0A,\n    0x000500C7, 0x0000000B, 0x00003028, 0x00003526, 0x00000A10, 0x000500AB,\n    0x00000009, 0x00004384, 0x00003028, 0x00000A0A, 0x000500C2, 0x0000000B,\n    0x00001EB0, 0x00003526, 0x00000A10, 0x000500C7, 0x0000000B, 0x000061E2,\n    0x00001EB0, 0x00000A13, 0x00050041, 0x00000288, 0x0000492C, 0x00000CE9,\n    0x00000A0E, 0x0004003D, 0x0000000B, 0x00005EAC, 0x0000492C, 0x00050041,\n    0x00000288, 0x00004EBA, 0x00000CE9, 0x00000A11, 0x0004003D, 0x0000000B,\n    0x00005788, 0x00004EBA, 0x00050041, 0x00000288, 0x00004EBB, 0x00000CE9,\n    0x00000A14, 0x0004003D, 0x0000000B, 0x00005789, 0x00004EBB, 0x00050041,\n    0x00000291, 0x00004EBC, 0x00000CE9, 0x00000A17, 0x0004003D, 0x00000014,\n    0x0000578A, 0x00004EBC, 0x00050041, 0x00000288, 0x00004EBD, 0x00000CE9,\n    0x00000A1A, 0x0004003D, 0x0000000B, 0x0000578B, 0x00004EBD, 0x00050041,\n    0x00000288, 0x00004E6E, 0x00000CE9, 0x00000A1D, 0x0004003D, 0x0000000B,\n    0x000019C2, 0x00004E6E, 0x0004003D, 0x00000014, 0x00002A0E, 0x00000F48,\n    0x000500C4, 0x00000014, 0x0000538B, 0x00002A0E, 0x00000A2B, 0x0007004F,\n    0x00000011, 0x000042F0, 0x0000538B, 0x0000538B, 0x00000000, 0x00000001,\n    0x0007004F, 0x00000011, 0x0000242F, 0x0000578A, 0x0000578A, 0x00000000,\n    0x00000001, 0x000500AE, 0x0000000F, 0x00004288, 0x000042F0, 0x0000242F,\n    0x0004009A, 0x00000009, 0x00006067, 0x00004288, 0x000300F7, 0x000019BA,\n    0x00000002, 0x000400FA, 0x00006067, 0x000055E8, 0x000019BA, 0x000200F8,\n    0x000055E8, 0x000200F9, 0x00004C7A, 0x000200F8, 0x000019BA, 0x0004007C,\n    0x00000016, 0x00005BB6, 0x0000538B, 0x00050051, 0x0000000B, 0x00004916,\n    0x0000578A, 0x00000001, 0x00050051, 0x0000000C, 0x00005BEB, 0x00005BB6,\n    0x00000000, 0x00050084, 0x0000000C, 0x0000591A, 0x00005BEB, 0x00000A23,\n    0x00050051, 0x0000000C, 0x000018DA, 0x00005BB6, 0x00000002, 0x0004007C,\n    0x0000000C, 0x000038A9, 0x00004916, 0x00050084, 0x0000000C, 0x00002C0F,\n    0x000018DA, 0x000038A9, 0x00050051, 0x0000000C, 0x000044BE, 0x00005BB6,\n    0x00000001, 0x00050080, 0x0000000C, 0x000056D4, 0x00002C0F, 0x000044BE,\n    0x0004007C, 0x0000000C, 0x00005785, 0x000019C2, 0x00050084, 0x0000000C,\n    0x00005FD7, 0x000056D4, 0x00005785, 0x00050080, 0x0000000C, 0x00002042,\n    0x0000591A, 0x00005FD7, 0x0004007C, 0x0000000B, 0x000028A4, 0x00002042,\n    0x00050080, 0x0000000B, 0x000038F6, 0x0000578B, 0x000028A4, 0x000400A8,\n    0x00000009, 0x00003014, 0x00004376, 0x000300F7, 0x00004A60, 0x00000002,\n    0x000400FA, 0x00003014, 0x0000260D, 0x0000426F, 0x000200F8, 0x0000260D,\n    0x00050051, 0x0000000B, 0x00004437, 0x0000538B, 0x00000000, 0x00050051,\n    0x0000000B, 0x00002BEE, 0x0000538B, 0x00000001, 0x00050051, 0x0000000B,\n    0x00004971, 0x0000538B, 0x00000002, 0x00050084, 0x0000000B, 0x000039EF,\n    0x00005789, 0x00004971, 0x00050080, 0x0000000B, 0x00004F62, 0x00002BEE,\n    0x000039EF, 0x00050084, 0x0000000B, 0x000054AC, 0x00005788, 0x00004F62,\n    0x00050080, 0x0000000B, 0x00004FAE, 0x00004437, 0x000054AC, 0x000500C4,\n    0x0000000B, 0x00002C67, 0x00004FAE, 0x00000A10, 0x000200F9, 0x00004A60,\n    0x000200F8, 0x0000426F, 0x000300F7, 0x00005BF0, 0x00000002, 0x000400FA,\n    0x00004384, 0x00002C92, 0x00005F21, 0x000200F8, 0x00002C92, 0x000500C2,\n    0x0000000B, 0x00005374, 0x00005788, 0x00000A1A, 0x000500C2, 0x0000000B,\n    0x000035EC, 0x00005789, 0x00000A17, 0x000500C3, 0x0000000C, 0x000033B5,\n    0x000018DA, 0x00000A11, 0x0004007C, 0x0000000C, 0x00005766, 0x000035EC,\n    0x00050084, 0x0000000C, 0x000061FD, 0x000033B5, 0x00005766, 0x000500C3,\n    0x0000000C, 0x00002D62, 0x000044BE, 0x00000A17, 0x00050080, 0x0000000C,\n    0x0000411E, 0x000061FD, 0x00002D62, 0x0004007C, 0x0000000C, 0x00004A78,\n    0x00005374, 0x00050084, 0x0000000C, 0x000032DC, 0x0000411E, 0x00004A78,\n    0x000500C3, 0x0000000C, 0x000032BA, 0x00005BEB, 0x00000A1A, 0x00050080,\n    0x0000000C, 0x00005FEE, 0x000032DC, 0x000032BA, 0x000500C4, 0x0000000C,\n    0x0000225D, 0x00005FEE, 0x00000A20, 0x000500C7, 0x0000000C, 0x00002CAA,\n    0x000018DA, 0x00000A14, 0x000500C4, 0x0000000C, 0x00004CAE, 0x00002CAA,\n    0x00000A1A, 0x000500C3, 0x0000000C, 0x0000383E, 0x000044BE, 0x00000A0E,\n    0x000500C7, 0x0000000C, 0x00005375, 0x0000383E, 0x00000A14, 0x000500C4,\n    0x0000000C, 0x000054CA, 0x00005375, 0x00000A14, 0x000500C5, 0x0000000C,\n    0x000042CE, 0x00004CAE, 0x000054CA, 0x000500C7, 0x0000000C, 0x000050D5,\n    0x00005BEB, 0x00000A20, 0x000500C5, 0x0000000C, 0x00003ADD, 0x000042CE,\n    0x000050D5, 0x000500C5, 0x0000000C, 0x000043B6, 0x0000225D, 0x00003ADD,\n    0x000500C4, 0x0000000C, 0x00005E50, 0x000043B6, 0x00000A10, 0x000500C3,\n    0x0000000C, 0x000032D7, 0x000044BE, 0x00000A14, 0x000500C6, 0x0000000C,\n    0x000026C9, 0x000032D7, 0x000033B5, 0x000500C7, 0x0000000C, 0x00004199,\n    0x000026C9, 0x00000A0E, 0x000500C3, 0x0000000C, 0x00002590, 0x00005BEB,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x0000505E, 0x00002590, 0x00000A14,\n    0x000500C4, 0x0000000C, 0x0000541D, 0x00004199, 0x00000A0E, 0x000500C6,\n    0x0000000C, 0x000022BA, 0x0000505E, 0x0000541D, 0x000500C7, 0x0000000C,\n    0x00005076, 0x000044BE, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005228,\n    0x00005076, 0x00000A17, 0x000500C4, 0x0000000C, 0x00001997, 0x000022BA,\n    0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FE, 0x00005228, 0x00001997,\n    0x000500C4, 0x0000000C, 0x00001C00, 0x00004199, 0x00000A2C, 0x000500C5,\n    0x0000000C, 0x00003C81, 0x000047FE, 0x00001C00, 0x000500C7, 0x0000000C,\n    0x000050AF, 0x00005E50, 0x00000A38, 0x000500C5, 0x0000000C, 0x00003C70,\n    0x00003C81, 0x000050AF, 0x000500C3, 0x0000000C, 0x00003745, 0x00005E50,\n    0x00000A17, 0x000500C7, 0x0000000C, 0x000018B8, 0x00003745, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x0000547E, 0x000018B8, 0x00000A1A, 0x000500C5,\n    0x0000000C, 0x000045A8, 0x00003C70, 0x0000547E, 0x000500C3, 0x0000000C,\n    0x00003A6E, 0x00005E50, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018B9,\n    0x00003A6E, 0x00000A20, 0x000500C4, 0x0000000C, 0x0000547F, 0x000018B9,\n    0x00000A23, 0x000500C5, 0x0000000C, 0x0000456F, 0x000045A8, 0x0000547F,\n    0x000500C3, 0x0000000C, 0x00003C88, 0x00005E50, 0x00000A23, 0x000500C4,\n    0x0000000C, 0x00002824, 0x00003C88, 0x00000A2F, 0x000500C5, 0x0000000C,\n    0x00003B79, 0x0000456F, 0x00002824, 0x0004007C, 0x0000000B, 0x000041E5,\n    0x00003B79, 0x000200F9, 0x00005BF0, 0x000200F8, 0x00005F21, 0x0004007C,\n    0x00000012, 0x000059D8, 0x000042F0, 0x000500C2, 0x0000000B, 0x00005668,\n    0x00005788, 0x00000A1A, 0x00050051, 0x0000000C, 0x00003905, 0x000059D8,\n    0x00000001, 0x000500C3, 0x0000000C, 0x00002F39, 0x00003905, 0x00000A1A,\n    0x0004007C, 0x0000000C, 0x00005780, 0x00005668, 0x00050084, 0x0000000C,\n    0x00001F02, 0x00002F39, 0x00005780, 0x00050051, 0x0000000C, 0x00006242,\n    0x000059D8, 0x00000000, 0x000500C3, 0x0000000C, 0x00004FC7, 0x00006242,\n    0x00000A1A, 0x00050080, 0x0000000C, 0x000049B0, 0x00001F02, 0x00004FC7,\n    0x000500C4, 0x0000000C, 0x0000254A, 0x000049B0, 0x00000A1D, 0x000500C3,\n    0x0000000C, 0x0000603B, 0x00003905, 0x00000A0E, 0x000500C7, 0x0000000C,\n    0x0000539A, 0x0000603B, 0x00000A20, 0x000500C4, 0x0000000C, 0x0000534A,\n    0x0000539A, 0x00000A14, 0x000500C7, 0x0000000C, 0x00004EA5, 0x00006242,\n    0x00000A20, 0x000500C5, 0x0000000C, 0x00002B1A, 0x0000534A, 0x00004EA5,\n    0x000500C5, 0x0000000C, 0x000043B7, 0x0000254A, 0x00002B1A, 0x000500C4,\n    0x0000000C, 0x00005E63, 0x000043B7, 0x00000A10, 0x000500C3, 0x0000000C,\n    0x000031DE, 0x00003905, 0x00000A17, 0x000500C7, 0x0000000C, 0x00005447,\n    0x000031DE, 0x00000A0E, 0x000500C3, 0x0000000C, 0x000028A6, 0x00006242,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x0000511E, 0x000028A6, 0x00000A14,\n    0x000500C3, 0x0000000C, 0x000028B9, 0x00003905, 0x00000A14, 0x000500C7,\n    0x0000000C, 0x0000505F, 0x000028B9, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x0000541E, 0x0000505F, 0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BB,\n    0x0000511E, 0x0000541E, 0x000500C7, 0x0000000C, 0x00005077, 0x00003905,\n    0x00000A0E, 0x000500C4, 0x0000000C, 0x00005229, 0x00005077, 0x00000A17,\n    0x000500C4, 0x0000000C, 0x00001998, 0x000022BB, 0x00000A1D, 0x000500C5,\n    0x0000000C, 0x000047FF, 0x00005229, 0x00001998, 0x000500C4, 0x0000000C,\n    0x00001C01, 0x00005447, 0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C82,\n    0x000047FF, 0x00001C01, 0x000500C7, 0x0000000C, 0x000050B0, 0x00005E63,\n    0x00000A38, 0x000500C5, 0x0000000C, 0x00003C71, 0x00003C82, 0x000050B0,\n    0x000500C3, 0x0000000C, 0x00003746, 0x00005E63, 0x00000A17, 0x000500C7,\n    0x0000000C, 0x000018BA, 0x00003746, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x00005480, 0x000018BA, 0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A9,\n    0x00003C71, 0x00005480, 0x000500C3, 0x0000000C, 0x00003A6F, 0x00005E63,\n    0x00000A1A, 0x000500C7, 0x0000000C, 0x000018BB, 0x00003A6F, 0x00000A20,\n    0x000500C4, 0x0000000C, 0x00005481, 0x000018BB, 0x00000A23, 0x000500C5,\n    0x0000000C, 0x00004570, 0x000045A9, 0x00005481, 0x000500C3, 0x0000000C,\n    0x00003C89, 0x00005E63, 0x00000A23, 0x000500C4, 0x0000000C, 0x00002825,\n    0x00003C89, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B7A, 0x00004570,\n    0x00002825, 0x0004007C, 0x0000000B, 0x000041E6, 0x00003B7A, 0x000200F9,\n    0x00005BF0, 0x000200F8, 0x00005BF0, 0x000700F5, 0x0000000B, 0x0000292C,\n    0x000041E5, 0x00002C92, 0x000041E6, 0x00005F21, 0x000200F9, 0x00004A60,\n    0x000200F8, 0x00004A60, 0x000700F5, 0x0000000B, 0x00002C70, 0x00002C67,\n    0x0000260D, 0x0000292C, 0x00005BF0, 0x00050080, 0x0000000B, 0x000048BD,\n    0x00002C70, 0x00005EAC, 0x000500C2, 0x0000000B, 0x00003D52, 0x000048BD,\n    0x00000A17, 0x00060041, 0x00000294, 0x00004FAF, 0x0000107A, 0x00000A0B,\n    0x00003D52, 0x0004003D, 0x00000017, 0x00001CAA, 0x00004FAF, 0x000500AA,\n    0x00000009, 0x000035C0, 0x000061E2, 0x00000A0D, 0x000500AA, 0x00000009,\n    0x00005376, 0x000061E2, 0x00000A10, 0x000500A6, 0x00000009, 0x00005686,\n    0x000035C0, 0x00005376, 0x000300F7, 0x00003463, 0x00000000, 0x000400FA,\n    0x00005686, 0x00002957, 0x00003463, 0x000200F8, 0x00002957, 0x000500C7,\n    0x00000017, 0x0000475F, 0x00001CAA, 0x000009CE, 0x000500C4, 0x00000017,\n    0x000024D1, 0x0000475F, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AC,\n    0x00001CAA, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448D, 0x000050AC,\n    0x0000013D, 0x000500C5, 0x00000017, 0x00003FF8, 0x000024D1, 0x0000448D,\n    0x000200F9, 0x00003463, 0x000200F8, 0x00003463, 0x000700F5, 0x00000017,\n    0x00005879, 0x00001CAA, 0x00004A60, 0x00003FF8, 0x00002957, 0x000500AA,\n    0x00000009, 0x00004CB6, 0x000061E2, 0x00000A13, 0x000500A6, 0x00000009,\n    0x00003B23, 0x00005376, 0x00004CB6, 0x000300F7, 0x00002DA2, 0x00000000,\n    0x000400FA, 0x00003B23, 0x00002B38, 0x00002DA2, 0x000200F8, 0x00002B38,\n    0x000500C4, 0x00000017, 0x00005E17, 0x00005879, 0x000002ED, 0x000500C2,\n    0x00000017, 0x00003BE7, 0x00005879, 0x000002ED, 0x000500C5, 0x00000017,\n    0x000029E8, 0x00005E17, 0x00003BE7, 0x000200F9, 0x00002DA2, 0x000200F8,\n    0x00002DA2, 0x000700F5, 0x00000017, 0x00004DEC, 0x00005879, 0x00003463,\n    0x000029E8, 0x00002B38, 0x0007004F, 0x00000011, 0x000052B5, 0x00004DEC,\n    0x00004DEC, 0x00000000, 0x00000001, 0x000500C7, 0x00000011, 0x000031C2,\n    0x000052B5, 0x00000BB1, 0x000500C2, 0x00000011, 0x00005473, 0x000031C2,\n    0x0000085F, 0x000500C7, 0x00000011, 0x00001B2B, 0x000052B5, 0x00000474,\n    0x000500C4, 0x00000011, 0x00003F88, 0x00001B2B, 0x0000085F, 0x00050084,\n    0x00000011, 0x000057E4, 0x00003F88, 0x0000049E, 0x000500C5, 0x00000011,\n    0x00002681, 0x00005473, 0x000057E4, 0x000500C7, 0x00000011, 0x00001CF8,\n    0x000052B5, 0x00000A7A, 0x000500C7, 0x00000011, 0x00003ED8, 0x000052B5,\n    0x000007DE, 0x000500C2, 0x00000011, 0x0000520A, 0x00003ED8, 0x0000085F,\n    0x00050051, 0x0000000B, 0x00001CFC, 0x00001CF8, 0x00000000, 0x00050051,\n    0x0000000B, 0x00005FDB, 0x00001CF8, 0x00000001, 0x00050051, 0x0000000B,\n    0x00001DD9, 0x0000520A, 0x00000000, 0x00050051, 0x0000000B, 0x00001E73,\n    0x0000520A, 0x00000001, 0x00070050, 0x00000017, 0x00003F21, 0x00001CFC,\n    0x00005FDB, 0x00001DD9, 0x00001E73, 0x0009004F, 0x00000017, 0x00001E5E,\n    0x00003F21, 0x00003F21, 0x00000000, 0x00000002, 0x00000001, 0x00000003,\n    0x0009004F, 0x00000017, 0x00001ACC, 0x00002681, 0x00002681, 0x00000000,\n    0x00000000, 0x00000001, 0x00000001, 0x000500C5, 0x00000017, 0x0000614D,\n    0x00001ACC, 0x00001E5E, 0x0007004F, 0x00000011, 0x0000431D, 0x00004DEC,\n    0x00004DEC, 0x00000002, 0x00000003, 0x000500C7, 0x00000011, 0x000018A7,\n    0x0000431D, 0x00000BB1, 0x000500C2, 0x00000011, 0x00005474, 0x000018A7,\n    0x0000085F, 0x000500C7, 0x00000011, 0x00001B2C, 0x0000431D, 0x00000474,\n    0x000500C4, 0x00000011, 0x00003F89, 0x00001B2C, 0x0000085F, 0x00050084,\n    0x00000011, 0x000057E5, 0x00003F89, 0x0000049E, 0x000500C5, 0x00000011,\n    0x00002682, 0x00005474, 0x000057E5, 0x000500C7, 0x00000011, 0x00001CF9,\n    0x0000431D, 0x00000A7A, 0x000500C7, 0x00000011, 0x00003ED9, 0x0000431D,\n    0x000007DE, 0x000500C2, 0x00000011, 0x0000520B, 0x00003ED9, 0x0000085F,\n    0x00050051, 0x0000000B, 0x00001CFD, 0x00001CF9, 0x00000000, 0x00050051,\n    0x0000000B, 0x00005FDD, 0x00001CF9, 0x00000001, 0x00050051, 0x0000000B,\n    0x00001DDA, 0x0000520B, 0x00000000, 0x00050051, 0x0000000B, 0x00001E74,\n    0x0000520B, 0x00000001, 0x00070050, 0x00000017, 0x00003F22, 0x00001CFD,\n    0x00005FDD, 0x00001DDA, 0x00001E74, 0x0009004F, 0x00000017, 0x00001E5F,\n    0x00003F22, 0x00003F22, 0x00000000, 0x00000002, 0x00000001, 0x00000003,\n    0x0009004F, 0x00000017, 0x00002355, 0x00002682, 0x00002682, 0x00000000,\n    0x00000000, 0x00000001, 0x00000001, 0x000500C5, 0x00000017, 0x00005423,\n    0x00002355, 0x00001E5F, 0x000500C2, 0x0000000B, 0x00005C82, 0x000038F6,\n    0x00000A17, 0x00060041, 0x00000294, 0x00001D9A, 0x0000140E, 0x00000A0B,\n    0x00005C82, 0x0003003E, 0x00001D9A, 0x0000614D, 0x00050080, 0x0000000B,\n    0x0000204C, 0x000038F6, 0x00000A3A, 0x000500C2, 0x0000000B, 0x000019FD,\n    0x0000204C, 0x00000A17, 0x00060041, 0x00000294, 0x000054B9, 0x0000140E,\n    0x00000A0B, 0x000019FD, 0x0003003E, 0x000054B9, 0x00005423, 0x000300F7,\n    0x00006070, 0x00000002, 0x000400FA, 0x00004376, 0x000055E9, 0x00001C25,\n    0x000200F8, 0x000055E9, 0x000200F9, 0x00006070, 0x000200F8, 0x00001C25,\n    0x000200F9, 0x00006070, 0x000200F8, 0x00006070, 0x000700F5, 0x0000000B,\n    0x00002C71, 0x00000A6A, 0x000055E9, 0x00000A3A, 0x00001C25, 0x00050080,\n    0x0000000B, 0x000048BE, 0x000048BD, 0x00002C71, 0x000500C2, 0x0000000B,\n    0x00003D53, 0x000048BE, 0x00000A17, 0x00060041, 0x00000294, 0x00005566,\n    0x0000107A, 0x00000A0B, 0x00003D53, 0x0004003D, 0x00000017, 0x00003910,\n    0x00005566, 0x000300F7, 0x00003A1A, 0x00000000, 0x000400FA, 0x00005686,\n    0x00002958, 0x00003A1A, 0x000200F8, 0x00002958, 0x000500C7, 0x00000017,\n    0x00004760, 0x00003910, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D2,\n    0x00004760, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AD, 0x00003910,\n    0x0000072E, 0x000500C2, 0x00000017, 0x0000448E, 0x000050AD, 0x0000013D,\n    0x000500C5, 0x00000017, 0x00003FF9, 0x000024D2, 0x0000448E, 0x000200F9,\n    0x00003A1A, 0x000200F8, 0x00003A1A, 0x000700F5, 0x00000017, 0x00002AAC,\n    0x00003910, 0x00006070, 0x00003FF9, 0x00002958, 0x000300F7, 0x00002DA3,\n    0x00000000, 0x000400FA, 0x00003B23, 0x00002B39, 0x00002DA3, 0x000200F8,\n    0x00002B39, 0x000500C4, 0x00000017, 0x00005E18, 0x00002AAC, 0x000002ED,\n    0x000500C2, 0x00000017, 0x00003BE8, 0x00002AAC, 0x000002ED, 0x000500C5,\n    0x00000017, 0x000029E9, 0x00005E18, 0x00003BE8, 0x000200F9, 0x00002DA3,\n    0x000200F8, 0x00002DA3, 0x000700F5, 0x00000017, 0x00004DED, 0x00002AAC,\n    0x00003A1A, 0x000029E9, 0x00002B39, 0x0007004F, 0x00000011, 0x000052B6,\n    0x00004DED, 0x00004DED, 0x00000000, 0x00000001, 0x000500C7, 0x00000011,\n    0x000031C3, 0x000052B6, 0x00000BB1, 0x000500C2, 0x00000011, 0x00005475,\n    0x000031C3, 0x0000085F, 0x000500C7, 0x00000011, 0x00001B2D, 0x000052B6,\n    0x00000474, 0x000500C4, 0x00000011, 0x00003F8A, 0x00001B2D, 0x0000085F,\n    0x00050084, 0x00000011, 0x000057E6, 0x00003F8A, 0x0000049E, 0x000500C5,\n    0x00000011, 0x00002683, 0x00005475, 0x000057E6, 0x000500C7, 0x00000011,\n    0x00001CFA, 0x000052B6, 0x00000A7A, 0x000500C7, 0x00000011, 0x00003EDA,\n    0x000052B6, 0x000007DE, 0x000500C2, 0x00000011, 0x0000520C, 0x00003EDA,\n    0x0000085F, 0x00050051, 0x0000000B, 0x00001CFE, 0x00001CFA, 0x00000000,\n    0x00050051, 0x0000000B, 0x00005FDE, 0x00001CFA, 0x00000001, 0x00050051,\n    0x0000000B, 0x00001DDB, 0x0000520C, 0x00000000, 0x00050051, 0x0000000B,\n    0x00001E75, 0x0000520C, 0x00000001, 0x00070050, 0x00000017, 0x00003F23,\n    0x00001CFE, 0x00005FDE, 0x00001DDB, 0x00001E75, 0x0009004F, 0x00000017,\n    0x00001E60, 0x00003F23, 0x00003F23, 0x00000000, 0x00000002, 0x00000001,\n    0x00000003, 0x0009004F, 0x00000017, 0x00001ACD, 0x00002683, 0x00002683,\n    0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x000500C5, 0x00000017,\n    0x0000614E, 0x00001ACD, 0x00001E60, 0x0007004F, 0x00000011, 0x0000431E,\n    0x00004DED, 0x00004DED, 0x00000002, 0x00000003, 0x000500C7, 0x00000011,\n    0x000018A8, 0x0000431E, 0x00000BB1, 0x000500C2, 0x00000011, 0x00005476,\n    0x000018A8, 0x0000085F, 0x000500C7, 0x00000011, 0x00001B2E, 0x0000431E,\n    0x00000474, 0x000500C4, 0x00000011, 0x00003F8B, 0x00001B2E, 0x0000085F,\n    0x00050084, 0x00000011, 0x000057E7, 0x00003F8B, 0x0000049E, 0x000500C5,\n    0x00000011, 0x00002684, 0x00005476, 0x000057E7, 0x000500C7, 0x00000011,\n    0x00001CFB, 0x0000431E, 0x00000A7A, 0x000500C7, 0x00000011, 0x00003EDB,\n    0x0000431E, 0x000007DE, 0x000500C2, 0x00000011, 0x0000520D, 0x00003EDB,\n    0x0000085F, 0x00050051, 0x0000000B, 0x00001CFF, 0x00001CFB, 0x00000000,\n    0x00050051, 0x0000000B, 0x00005FDF, 0x00001CFB, 0x00000001, 0x00050051,\n    0x0000000B, 0x00001DDC, 0x0000520D, 0x00000000, 0x00050051, 0x0000000B,\n    0x00001E76, 0x0000520D, 0x00000001, 0x00070050, 0x00000017, 0x00003F24,\n    0x00001CFF, 0x00005FDF, 0x00001DDC, 0x00001E76, 0x0009004F, 0x00000017,\n    0x00001E61, 0x00003F24, 0x00003F24, 0x00000000, 0x00000002, 0x00000001,\n    0x00000003, 0x0009004F, 0x00000017, 0x00001E6F, 0x00002684, 0x00002684,\n    0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x000500C5, 0x00000017,\n    0x00003FD1, 0x00001E6F, 0x00001E61, 0x00050080, 0x0000000B, 0x00003925,\n    0x000038F6, 0x00000A6A, 0x000500C2, 0x0000000B, 0x00005590, 0x00003925,\n    0x00000A17, 0x00060041, 0x00000294, 0x00004BE4, 0x0000140E, 0x00000A0B,\n    0x00005590, 0x0003003E, 0x00004BE4, 0x0000614E, 0x00050080, 0x0000000B,\n    0x0000204D, 0x000038F6, 0x00000A9A, 0x000500C2, 0x0000000B, 0x000019FE,\n    0x0000204D, 0x00000A17, 0x00060041, 0x00000294, 0x000054DF, 0x0000140E,\n    0x00000A0B, 0x000019FE, 0x0003003E, 0x000054DF, 0x00003FD1, 0x000200F9,\n    0x00004C7A, 0x000200F8, 0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_bgrg8_rgbg8_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25155\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v4uint = OpTypeVector %uint 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v2uint = OpTypeVector %uint 2\n     %v3uint = OpTypeVector %uint 3\n%uint_4278255360 = OpConstant %uint 4278255360\n   %uint_255 = OpConstant %uint 255\n    %uint_16 = OpConstant %uint 16\n%uint_16711680 = OpConstant %uint 16711680\n     %uint_1 = OpConstant %uint 1\n     %uint_2 = OpConstant %uint 2\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n     %uint_3 = OpConstant %uint 3\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n     %uint_0 = OpConstant %uint 0\n      %int_3 = OpConstant %int 3\n      %int_2 = OpConstant %int 2\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %2603 = OpConstantComposite %v3uint %uint_3 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n     %uint_4 = OpConstant %uint 4\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n    %uint_32 = OpConstant %uint 32\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n       %1611 = OpConstantComposite %v4uint %uint_255 %uint_255 %uint_255 %uint_255\n        %784 = OpConstantComposite %v4uint %uint_16711680 %uint_16711680 %uint_16711680 %uint_16711680\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24540 = OpBitwiseAnd %uint %13606 %uint_1\n      %17270 = OpINotEqual %bool %24540 %uint_0\n      %12328 = OpBitwiseAnd %uint %13606 %uint_2\n      %17284 = OpINotEqual %bool %12328 %uint_0\n       %7856 = OpShiftRightLogical %uint %13606 %uint_2\n      %25058 = OpBitwiseAnd %uint %7856 %uint_3\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2603\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %6586 DontFlatten\n               OpBranchConditional %24679 %21992 %6586\n      %21992 = OpLabel\n               OpBranch %19578\n       %6586 = OpLabel\n      %23478 = OpBitcast %v3int %21387\n      %18710 = OpCompositeExtract %uint %22410 1\n      %23531 = OpCompositeExtract %int %23478 0\n      %22810 = OpIMul %int %23531 %int_4\n       %6362 = OpCompositeExtract %int %23478 2\n      %14505 = OpBitcast %int %18710\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %23478 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %6594\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %22810 %24535\n      %10404 = OpBitcast %uint %8258\n      %14582 = OpIAdd %uint %22411 %10404\n      %12308 = OpLogicalNot %bool %17270\n               OpSelectionMerge %19040 DontFlatten\n               OpBranchConditional %12308 %9741 %17007\n       %9741 = OpLabel\n      %17463 = OpCompositeExtract %uint %21387 0\n      %11246 = OpCompositeExtract %uint %21387 1\n      %18801 = OpCompositeExtract %uint %21387 2\n      %14831 = OpIMul %uint %22409 %18801\n      %20322 = OpIAdd %uint %11246 %14831\n      %21676 = OpIMul %uint %22408 %20322\n      %20398 = OpIAdd %uint %17463 %21676\n      %11367 = OpShiftLeftLogical %uint %20398 %uint_2\n               OpBranch %19040\n      %17007 = OpLabel\n               OpSelectionMerge %23536 DontFlatten\n               OpBranchConditional %17284 %11410 %24353\n      %11410 = OpLabel\n      %21364 = OpShiftRightLogical %uint %22408 %int_5\n      %13804 = OpShiftRightLogical %uint %22409 %int_4\n      %13237 = OpShiftRightArithmetic %int %6362 %int_2\n      %22374 = OpBitcast %int %13804\n      %25085 = OpIMul %int %13237 %22374\n      %11618 = OpShiftRightArithmetic %int %17598 %int_4\n      %16670 = OpIAdd %int %25085 %11618\n      %19064 = OpBitcast %int %21364\n      %13020 = OpIMul %int %16670 %19064\n      %12986 = OpShiftRightArithmetic %int %23531 %int_5\n      %24558 = OpIAdd %int %13020 %12986\n       %8797 = OpShiftLeftLogical %int %24558 %int_7\n      %11434 = OpBitwiseAnd %int %6362 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %17598 %int_1\n      %21365 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21365 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %23531 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17334 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17334 %uint_2\n      %13015 = OpShiftRightArithmetic %int %17598 %int_3\n       %9929 = OpBitwiseXor %int %13015 %13237\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %23531 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %17598 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6551\n       %7168 = OpShiftLeftLogical %int %16793 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24144 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24144 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24144 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24144 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %23536\n      %24353 = OpLabel\n      %23000 = OpBitcast %v2int %17136\n      %22120 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %23000 1\n      %12089 = OpShiftRightArithmetic %int %14597 %int_5\n      %22400 = OpBitcast %int %22120\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %23000 0\n      %20423 = OpShiftRightArithmetic %int %25154 %int_5\n      %18864 = OpIAdd %int %7938 %20423\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25154 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17335 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17335 %uint_2\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25154 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6552\n       %7169 = OpShiftLeftLogical %int %21575 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24163 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24163 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24163 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %23536\n      %23536 = OpLabel\n      %10540 = OpPhi %uint %16869 %11410 %16870 %24353\n               OpBranch %19040\n      %19040 = OpLabel\n      %11376 = OpPhi %uint %11367 %9741 %10540 %23536\n      %18621 = OpIAdd %uint %11376 %24236\n      %15698 = OpShiftRightLogical %uint %18621 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15698\n       %7338 = OpLoad %v4uint %20399\n      %13760 = OpIEqual %bool %25058 %uint_1\n      %21366 = OpIEqual %bool %25058 %uint_2\n      %22150 = OpLogicalOr %bool %13760 %21366\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %7338 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %7338 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22649 = OpPhi %v4uint %7338 %19040 %16376 %10583\n      %19638 = OpIEqual %bool %25058 %uint_3\n      %15139 = OpLogicalOr %bool %21366 %19638\n               OpSelectionMerge %13867 None\n               OpBranchConditional %15139 %11064 %13867\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22649 %749\n      %15335 = OpShiftRightLogical %v4uint %22649 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %13867\n      %13867 = OpLabel\n      %19124 = OpPhi %v4uint %22649 %13411 %10728 %11064\n       %7095 = OpShiftRightLogical %uint %14582 %int_4\n      %12466 = OpBitwiseAnd %v4uint %19124 %1838\n      %18755 = OpBitwiseAnd %v4uint %19124 %1611\n      %24932 = OpShiftLeftLogical %v4uint %18755 %749\n      %17045 = OpBitwiseOr %v4uint %12466 %24932\n      %21212 = OpBitwiseAnd %v4uint %19124 %784\n      %18088 = OpShiftRightLogical %v4uint %21212 %749\n       %6532 = OpBitwiseOr %v4uint %17045 %18088\n      %20254 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %7095\n               OpStore %20254 %6532\n      %21685 = OpIAdd %uint %14582 %uint_16\n               OpSelectionMerge %24688 DontFlatten\n               OpBranchConditional %17270 %21993 %7205\n      %21993 = OpLabel\n               OpBranch %24688\n       %7205 = OpLabel\n               OpBranch %24688\n      %24688 = OpLabel\n      %11377 = OpPhi %uint %uint_32 %21993 %uint_16 %7205\n      %18622 = OpIAdd %uint %18621 %11377\n      %15699 = OpShiftRightLogical %uint %18622 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15699\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %14874 None\n               OpBranchConditional %22150 %10584 %14874\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %14874\n      %14874 = OpLabel\n      %10924 = OpPhi %v4uint %14608 %24688 %16377 %10584\n               OpSelectionMerge %13868 None\n               OpBranchConditional %15139 %11065 %13868\n      %11065 = OpLabel\n      %24088 = OpShiftLeftLogical %v4uint %10924 %749\n      %15336 = OpShiftRightLogical %v4uint %10924 %749\n      %10729 = OpBitwiseOr %v4uint %24088 %15336\n               OpBranch %13868\n      %13868 = OpLabel\n      %19125 = OpPhi %v4uint %10924 %14874 %10729 %11065\n       %7096 = OpShiftRightLogical %uint %21685 %int_4\n      %12467 = OpBitwiseAnd %v4uint %19125 %1838\n      %18756 = OpBitwiseAnd %v4uint %19125 %1611\n      %24933 = OpShiftLeftLogical %v4uint %18756 %749\n      %17046 = OpBitwiseOr %v4uint %12467 %24933\n      %21213 = OpBitwiseAnd %v4uint %19125 %784\n      %18089 = OpShiftRightLogical %v4uint %21213 %749\n       %6533 = OpBitwiseOr %v4uint %17046 %18089\n      %22553 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %7096\n               OpStore %22553 %6533\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_bgrg8_rgbg8_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006243, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000017, 0x0000000B, 0x00000004, 0x00040015, 0x0000000C,\n    0x00000020, 0x00000001, 0x00040017, 0x00000012, 0x0000000C, 0x00000002,\n    0x00040017, 0x00000016, 0x0000000C, 0x00000003, 0x00020014, 0x00000009,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00,\n    0x0004002B, 0x0000000B, 0x00000144, 0x000000FF, 0x0004002B, 0x0000000B,\n    0x00000A3A, 0x00000010, 0x0004002B, 0x0000000B, 0x000005A9, 0x00FF0000,\n    0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B,\n    0x00000A10, 0x00000002, 0x0004002B, 0x0000000B, 0x000008A6, 0x00FF00FF,\n    0x0004002B, 0x0000000B, 0x00000A22, 0x00000008, 0x0004002B, 0x0000000B,\n    0x00000A13, 0x00000003, 0x0004002B, 0x0000000C, 0x00000A17, 0x00000004,\n    0x0004002B, 0x0000000C, 0x00000A1D, 0x00000006, 0x0004002B, 0x0000000C,\n    0x00000A2C, 0x0000000B, 0x0004002B, 0x0000000C, 0x00000A38, 0x0000000F,\n    0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C,\n    0x00000A1A, 0x00000005, 0x0004002B, 0x0000000C, 0x00000A20, 0x00000007,\n    0x0004002B, 0x0000000C, 0x00000A23, 0x00000008, 0x0004002B, 0x0000000C,\n    0x00000A2F, 0x0000000C, 0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000,\n    0x0004002B, 0x0000000C, 0x00000A14, 0x00000003, 0x0004002B, 0x0000000C,\n    0x00000A11, 0x00000002, 0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000,\n    0x000A001E, 0x00000489, 0x0000000B, 0x0000000B, 0x0000000B, 0x0000000B,\n    0x00000014, 0x0000000B, 0x0000000B, 0x0000000B, 0x00040020, 0x00000706,\n    0x00000009, 0x00000489, 0x0004003B, 0x00000706, 0x00000CE9, 0x00000009,\n    0x00040020, 0x00000288, 0x00000009, 0x0000000B, 0x00040020, 0x00000291,\n    0x00000009, 0x00000014, 0x00040020, 0x00000292, 0x00000001, 0x00000014,\n    0x0004003B, 0x00000292, 0x00000F48, 0x00000001, 0x0006002C, 0x00000014,\n    0x00000A2B, 0x00000A13, 0x00000A0A, 0x00000A0A, 0x00040017, 0x0000000F,\n    0x00000009, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A16, 0x00000004,\n    0x0003001D, 0x000007DC, 0x00000017, 0x0003001E, 0x000007B4, 0x000007DC,\n    0x00040020, 0x00000A31, 0x00000002, 0x000007B4, 0x0004003B, 0x00000A31,\n    0x0000107A, 0x00000002, 0x00040020, 0x00000294, 0x00000002, 0x00000017,\n    0x0003001D, 0x000007DD, 0x00000017, 0x0003001E, 0x000007B5, 0x000007DD,\n    0x00040020, 0x00000A32, 0x00000002, 0x000007B5, 0x0004003B, 0x00000A32,\n    0x0000140E, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020,\n    0x0006002C, 0x00000014, 0x00000BC3, 0x00000A16, 0x00000A6A, 0x00000A0D,\n    0x0007002C, 0x00000017, 0x000009CE, 0x000008A6, 0x000008A6, 0x000008A6,\n    0x000008A6, 0x0007002C, 0x00000017, 0x0000013D, 0x00000A22, 0x00000A22,\n    0x00000A22, 0x00000A22, 0x0007002C, 0x00000017, 0x0000072E, 0x000005FD,\n    0x000005FD, 0x000005FD, 0x000005FD, 0x0007002C, 0x00000017, 0x000002ED,\n    0x00000A3A, 0x00000A3A, 0x00000A3A, 0x00000A3A, 0x0007002C, 0x00000017,\n    0x0000064B, 0x00000144, 0x00000144, 0x00000144, 0x00000144, 0x0007002C,\n    0x00000017, 0x00000310, 0x000005A9, 0x000005A9, 0x000005A9, 0x000005A9,\n    0x00050036, 0x00000008, 0x0000161F, 0x00000000, 0x00000502, 0x000200F8,\n    0x00003B06, 0x000300F7, 0x00004C7A, 0x00000000, 0x000300FB, 0x00000A0A,\n    0x00002E68, 0x000200F8, 0x00002E68, 0x00050041, 0x00000288, 0x000060D7,\n    0x00000CE9, 0x00000A0B, 0x0004003D, 0x0000000B, 0x00003526, 0x000060D7,\n    0x000500C7, 0x0000000B, 0x00005FDC, 0x00003526, 0x00000A0D, 0x000500AB,\n    0x00000009, 0x00004376, 0x00005FDC, 0x00000A0A, 0x000500C7, 0x0000000B,\n    0x00003028, 0x00003526, 0x00000A10, 0x000500AB, 0x00000009, 0x00004384,\n    0x00003028, 0x00000A0A, 0x000500C2, 0x0000000B, 0x00001EB0, 0x00003526,\n    0x00000A10, 0x000500C7, 0x0000000B, 0x000061E2, 0x00001EB0, 0x00000A13,\n    0x00050041, 0x00000288, 0x0000492C, 0x00000CE9, 0x00000A0E, 0x0004003D,\n    0x0000000B, 0x00005EAC, 0x0000492C, 0x00050041, 0x00000288, 0x00004EBA,\n    0x00000CE9, 0x00000A11, 0x0004003D, 0x0000000B, 0x00005788, 0x00004EBA,\n    0x00050041, 0x00000288, 0x00004EBB, 0x00000CE9, 0x00000A14, 0x0004003D,\n    0x0000000B, 0x00005789, 0x00004EBB, 0x00050041, 0x00000291, 0x00004EBC,\n    0x00000CE9, 0x00000A17, 0x0004003D, 0x00000014, 0x0000578A, 0x00004EBC,\n    0x00050041, 0x00000288, 0x00004EBD, 0x00000CE9, 0x00000A1A, 0x0004003D,\n    0x0000000B, 0x0000578B, 0x00004EBD, 0x00050041, 0x00000288, 0x00004E6E,\n    0x00000CE9, 0x00000A1D, 0x0004003D, 0x0000000B, 0x000019C2, 0x00004E6E,\n    0x0004003D, 0x00000014, 0x00002A0E, 0x00000F48, 0x000500C4, 0x00000014,\n    0x0000538B, 0x00002A0E, 0x00000A2B, 0x0007004F, 0x00000011, 0x000042F0,\n    0x0000538B, 0x0000538B, 0x00000000, 0x00000001, 0x0007004F, 0x00000011,\n    0x0000242F, 0x0000578A, 0x0000578A, 0x00000000, 0x00000001, 0x000500AE,\n    0x0000000F, 0x00004288, 0x000042F0, 0x0000242F, 0x0004009A, 0x00000009,\n    0x00006067, 0x00004288, 0x000300F7, 0x000019BA, 0x00000002, 0x000400FA,\n    0x00006067, 0x000055E8, 0x000019BA, 0x000200F8, 0x000055E8, 0x000200F9,\n    0x00004C7A, 0x000200F8, 0x000019BA, 0x0004007C, 0x00000016, 0x00005BB6,\n    0x0000538B, 0x00050051, 0x0000000B, 0x00004916, 0x0000578A, 0x00000001,\n    0x00050051, 0x0000000C, 0x00005BEB, 0x00005BB6, 0x00000000, 0x00050084,\n    0x0000000C, 0x0000591A, 0x00005BEB, 0x00000A17, 0x00050051, 0x0000000C,\n    0x000018DA, 0x00005BB6, 0x00000002, 0x0004007C, 0x0000000C, 0x000038A9,\n    0x00004916, 0x00050084, 0x0000000C, 0x00002C0F, 0x000018DA, 0x000038A9,\n    0x00050051, 0x0000000C, 0x000044BE, 0x00005BB6, 0x00000001, 0x00050080,\n    0x0000000C, 0x000056D4, 0x00002C0F, 0x000044BE, 0x0004007C, 0x0000000C,\n    0x00005785, 0x000019C2, 0x00050084, 0x0000000C, 0x00005FD7, 0x000056D4,\n    0x00005785, 0x00050080, 0x0000000C, 0x00002042, 0x0000591A, 0x00005FD7,\n    0x0004007C, 0x0000000B, 0x000028A4, 0x00002042, 0x00050080, 0x0000000B,\n    0x000038F6, 0x0000578B, 0x000028A4, 0x000400A8, 0x00000009, 0x00003014,\n    0x00004376, 0x000300F7, 0x00004A60, 0x00000002, 0x000400FA, 0x00003014,\n    0x0000260D, 0x0000426F, 0x000200F8, 0x0000260D, 0x00050051, 0x0000000B,\n    0x00004437, 0x0000538B, 0x00000000, 0x00050051, 0x0000000B, 0x00002BEE,\n    0x0000538B, 0x00000001, 0x00050051, 0x0000000B, 0x00004971, 0x0000538B,\n    0x00000002, 0x00050084, 0x0000000B, 0x000039EF, 0x00005789, 0x00004971,\n    0x00050080, 0x0000000B, 0x00004F62, 0x00002BEE, 0x000039EF, 0x00050084,\n    0x0000000B, 0x000054AC, 0x00005788, 0x00004F62, 0x00050080, 0x0000000B,\n    0x00004FAE, 0x00004437, 0x000054AC, 0x000500C4, 0x0000000B, 0x00002C67,\n    0x00004FAE, 0x00000A10, 0x000200F9, 0x00004A60, 0x000200F8, 0x0000426F,\n    0x000300F7, 0x00005BF0, 0x00000002, 0x000400FA, 0x00004384, 0x00002C92,\n    0x00005F21, 0x000200F8, 0x00002C92, 0x000500C2, 0x0000000B, 0x00005374,\n    0x00005788, 0x00000A1A, 0x000500C2, 0x0000000B, 0x000035EC, 0x00005789,\n    0x00000A17, 0x000500C3, 0x0000000C, 0x000033B5, 0x000018DA, 0x00000A11,\n    0x0004007C, 0x0000000C, 0x00005766, 0x000035EC, 0x00050084, 0x0000000C,\n    0x000061FD, 0x000033B5, 0x00005766, 0x000500C3, 0x0000000C, 0x00002D62,\n    0x000044BE, 0x00000A17, 0x00050080, 0x0000000C, 0x0000411E, 0x000061FD,\n    0x00002D62, 0x0004007C, 0x0000000C, 0x00004A78, 0x00005374, 0x00050084,\n    0x0000000C, 0x000032DC, 0x0000411E, 0x00004A78, 0x000500C3, 0x0000000C,\n    0x000032BA, 0x00005BEB, 0x00000A1A, 0x00050080, 0x0000000C, 0x00005FEE,\n    0x000032DC, 0x000032BA, 0x000500C4, 0x0000000C, 0x0000225D, 0x00005FEE,\n    0x00000A20, 0x000500C7, 0x0000000C, 0x00002CAA, 0x000018DA, 0x00000A14,\n    0x000500C4, 0x0000000C, 0x00004CAE, 0x00002CAA, 0x00000A1A, 0x000500C3,\n    0x0000000C, 0x0000383E, 0x000044BE, 0x00000A0E, 0x000500C7, 0x0000000C,\n    0x00005375, 0x0000383E, 0x00000A14, 0x000500C4, 0x0000000C, 0x000054CA,\n    0x00005375, 0x00000A14, 0x000500C5, 0x0000000C, 0x000042CE, 0x00004CAE,\n    0x000054CA, 0x000500C7, 0x0000000C, 0x000050D5, 0x00005BEB, 0x00000A20,\n    0x000500C5, 0x0000000C, 0x00003ADD, 0x000042CE, 0x000050D5, 0x000500C5,\n    0x0000000C, 0x000043B6, 0x0000225D, 0x00003ADD, 0x000500C4, 0x0000000C,\n    0x00005E50, 0x000043B6, 0x00000A10, 0x000500C3, 0x0000000C, 0x000032D7,\n    0x000044BE, 0x00000A14, 0x000500C6, 0x0000000C, 0x000026C9, 0x000032D7,\n    0x000033B5, 0x000500C7, 0x0000000C, 0x00004199, 0x000026C9, 0x00000A0E,\n    0x000500C3, 0x0000000C, 0x00002590, 0x00005BEB, 0x00000A14, 0x000500C7,\n    0x0000000C, 0x0000505E, 0x00002590, 0x00000A14, 0x000500C4, 0x0000000C,\n    0x0000541D, 0x00004199, 0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BA,\n    0x0000505E, 0x0000541D, 0x000500C7, 0x0000000C, 0x00005076, 0x000044BE,\n    0x00000A0E, 0x000500C4, 0x0000000C, 0x00005228, 0x00005076, 0x00000A17,\n    0x000500C4, 0x0000000C, 0x00001997, 0x000022BA, 0x00000A1D, 0x000500C5,\n    0x0000000C, 0x000047FE, 0x00005228, 0x00001997, 0x000500C4, 0x0000000C,\n    0x00001C00, 0x00004199, 0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C81,\n    0x000047FE, 0x00001C00, 0x000500C7, 0x0000000C, 0x000050AF, 0x00005E50,\n    0x00000A38, 0x000500C5, 0x0000000C, 0x00003C70, 0x00003C81, 0x000050AF,\n    0x000500C3, 0x0000000C, 0x00003745, 0x00005E50, 0x00000A17, 0x000500C7,\n    0x0000000C, 0x000018B8, 0x00003745, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x0000547E, 0x000018B8, 0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A8,\n    0x00003C70, 0x0000547E, 0x000500C3, 0x0000000C, 0x00003A6E, 0x00005E50,\n    0x00000A1A, 0x000500C7, 0x0000000C, 0x000018B9, 0x00003A6E, 0x00000A20,\n    0x000500C4, 0x0000000C, 0x0000547F, 0x000018B9, 0x00000A23, 0x000500C5,\n    0x0000000C, 0x0000456F, 0x000045A8, 0x0000547F, 0x000500C3, 0x0000000C,\n    0x00003C88, 0x00005E50, 0x00000A23, 0x000500C4, 0x0000000C, 0x00002824,\n    0x00003C88, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B79, 0x0000456F,\n    0x00002824, 0x0004007C, 0x0000000B, 0x000041E5, 0x00003B79, 0x000200F9,\n    0x00005BF0, 0x000200F8, 0x00005F21, 0x0004007C, 0x00000012, 0x000059D8,\n    0x000042F0, 0x000500C2, 0x0000000B, 0x00005668, 0x00005788, 0x00000A1A,\n    0x00050051, 0x0000000C, 0x00003905, 0x000059D8, 0x00000001, 0x000500C3,\n    0x0000000C, 0x00002F39, 0x00003905, 0x00000A1A, 0x0004007C, 0x0000000C,\n    0x00005780, 0x00005668, 0x00050084, 0x0000000C, 0x00001F02, 0x00002F39,\n    0x00005780, 0x00050051, 0x0000000C, 0x00006242, 0x000059D8, 0x00000000,\n    0x000500C3, 0x0000000C, 0x00004FC7, 0x00006242, 0x00000A1A, 0x00050080,\n    0x0000000C, 0x000049B0, 0x00001F02, 0x00004FC7, 0x000500C4, 0x0000000C,\n    0x0000254A, 0x000049B0, 0x00000A1D, 0x000500C3, 0x0000000C, 0x0000603B,\n    0x00003905, 0x00000A0E, 0x000500C7, 0x0000000C, 0x0000539A, 0x0000603B,\n    0x00000A20, 0x000500C4, 0x0000000C, 0x0000534A, 0x0000539A, 0x00000A14,\n    0x000500C7, 0x0000000C, 0x00004EA5, 0x00006242, 0x00000A20, 0x000500C5,\n    0x0000000C, 0x00002B1A, 0x0000534A, 0x00004EA5, 0x000500C5, 0x0000000C,\n    0x000043B7, 0x0000254A, 0x00002B1A, 0x000500C4, 0x0000000C, 0x00005E63,\n    0x000043B7, 0x00000A10, 0x000500C3, 0x0000000C, 0x000031DE, 0x00003905,\n    0x00000A17, 0x000500C7, 0x0000000C, 0x00005447, 0x000031DE, 0x00000A0E,\n    0x000500C3, 0x0000000C, 0x000028A6, 0x00006242, 0x00000A14, 0x000500C7,\n    0x0000000C, 0x0000511E, 0x000028A6, 0x00000A14, 0x000500C3, 0x0000000C,\n    0x000028B9, 0x00003905, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000505F,\n    0x000028B9, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000541E, 0x0000505F,\n    0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BB, 0x0000511E, 0x0000541E,\n    0x000500C7, 0x0000000C, 0x00005077, 0x00003905, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x00005229, 0x00005077, 0x00000A17, 0x000500C4, 0x0000000C,\n    0x00001998, 0x000022BB, 0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FF,\n    0x00005229, 0x00001998, 0x000500C4, 0x0000000C, 0x00001C01, 0x00005447,\n    0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C82, 0x000047FF, 0x00001C01,\n    0x000500C7, 0x0000000C, 0x000050B0, 0x00005E63, 0x00000A38, 0x000500C5,\n    0x0000000C, 0x00003C71, 0x00003C82, 0x000050B0, 0x000500C3, 0x0000000C,\n    0x00003746, 0x00005E63, 0x00000A17, 0x000500C7, 0x0000000C, 0x000018BA,\n    0x00003746, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005480, 0x000018BA,\n    0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A9, 0x00003C71, 0x00005480,\n    0x000500C3, 0x0000000C, 0x00003A6F, 0x00005E63, 0x00000A1A, 0x000500C7,\n    0x0000000C, 0x000018BB, 0x00003A6F, 0x00000A20, 0x000500C4, 0x0000000C,\n    0x00005481, 0x000018BB, 0x00000A23, 0x000500C5, 0x0000000C, 0x00004570,\n    0x000045A9, 0x00005481, 0x000500C3, 0x0000000C, 0x00003C89, 0x00005E63,\n    0x00000A23, 0x000500C4, 0x0000000C, 0x00002825, 0x00003C89, 0x00000A2F,\n    0x000500C5, 0x0000000C, 0x00003B7A, 0x00004570, 0x00002825, 0x0004007C,\n    0x0000000B, 0x000041E6, 0x00003B7A, 0x000200F9, 0x00005BF0, 0x000200F8,\n    0x00005BF0, 0x000700F5, 0x0000000B, 0x0000292C, 0x000041E5, 0x00002C92,\n    0x000041E6, 0x00005F21, 0x000200F9, 0x00004A60, 0x000200F8, 0x00004A60,\n    0x000700F5, 0x0000000B, 0x00002C70, 0x00002C67, 0x0000260D, 0x0000292C,\n    0x00005BF0, 0x00050080, 0x0000000B, 0x000048BD, 0x00002C70, 0x00005EAC,\n    0x000500C2, 0x0000000B, 0x00003D52, 0x000048BD, 0x00000A17, 0x00060041,\n    0x00000294, 0x00004FAF, 0x0000107A, 0x00000A0B, 0x00003D52, 0x0004003D,\n    0x00000017, 0x00001CAA, 0x00004FAF, 0x000500AA, 0x00000009, 0x000035C0,\n    0x000061E2, 0x00000A0D, 0x000500AA, 0x00000009, 0x00005376, 0x000061E2,\n    0x00000A10, 0x000500A6, 0x00000009, 0x00005686, 0x000035C0, 0x00005376,\n    0x000300F7, 0x00003463, 0x00000000, 0x000400FA, 0x00005686, 0x00002957,\n    0x00003463, 0x000200F8, 0x00002957, 0x000500C7, 0x00000017, 0x0000475F,\n    0x00001CAA, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D1, 0x0000475F,\n    0x0000013D, 0x000500C7, 0x00000017, 0x000050AC, 0x00001CAA, 0x0000072E,\n    0x000500C2, 0x00000017, 0x0000448D, 0x000050AC, 0x0000013D, 0x000500C5,\n    0x00000017, 0x00003FF8, 0x000024D1, 0x0000448D, 0x000200F9, 0x00003463,\n    0x000200F8, 0x00003463, 0x000700F5, 0x00000017, 0x00005879, 0x00001CAA,\n    0x00004A60, 0x00003FF8, 0x00002957, 0x000500AA, 0x00000009, 0x00004CB6,\n    0x000061E2, 0x00000A13, 0x000500A6, 0x00000009, 0x00003B23, 0x00005376,\n    0x00004CB6, 0x000300F7, 0x0000362B, 0x00000000, 0x000400FA, 0x00003B23,\n    0x00002B38, 0x0000362B, 0x000200F8, 0x00002B38, 0x000500C4, 0x00000017,\n    0x00005E17, 0x00005879, 0x000002ED, 0x000500C2, 0x00000017, 0x00003BE7,\n    0x00005879, 0x000002ED, 0x000500C5, 0x00000017, 0x000029E8, 0x00005E17,\n    0x00003BE7, 0x000200F9, 0x0000362B, 0x000200F8, 0x0000362B, 0x000700F5,\n    0x00000017, 0x00004AB4, 0x00005879, 0x00003463, 0x000029E8, 0x00002B38,\n    0x000500C2, 0x0000000B, 0x00001BB7, 0x000038F6, 0x00000A17, 0x000500C7,\n    0x00000017, 0x000030B2, 0x00004AB4, 0x0000072E, 0x000500C7, 0x00000017,\n    0x00004943, 0x00004AB4, 0x0000064B, 0x000500C4, 0x00000017, 0x00006164,\n    0x00004943, 0x000002ED, 0x000500C5, 0x00000017, 0x00004295, 0x000030B2,\n    0x00006164, 0x000500C7, 0x00000017, 0x000052DC, 0x00004AB4, 0x00000310,\n    0x000500C2, 0x00000017, 0x000046A8, 0x000052DC, 0x000002ED, 0x000500C5,\n    0x00000017, 0x00001984, 0x00004295, 0x000046A8, 0x00060041, 0x00000294,\n    0x00004F1E, 0x0000140E, 0x00000A0B, 0x00001BB7, 0x0003003E, 0x00004F1E,\n    0x00001984, 0x00050080, 0x0000000B, 0x000054B5, 0x000038F6, 0x00000A3A,\n    0x000300F7, 0x00006070, 0x00000002, 0x000400FA, 0x00004376, 0x000055E9,\n    0x00001C25, 0x000200F8, 0x000055E9, 0x000200F9, 0x00006070, 0x000200F8,\n    0x00001C25, 0x000200F9, 0x00006070, 0x000200F8, 0x00006070, 0x000700F5,\n    0x0000000B, 0x00002C71, 0x00000A6A, 0x000055E9, 0x00000A3A, 0x00001C25,\n    0x00050080, 0x0000000B, 0x000048BE, 0x000048BD, 0x00002C71, 0x000500C2,\n    0x0000000B, 0x00003D53, 0x000048BE, 0x00000A17, 0x00060041, 0x00000294,\n    0x00005566, 0x0000107A, 0x00000A0B, 0x00003D53, 0x0004003D, 0x00000017,\n    0x00003910, 0x00005566, 0x000300F7, 0x00003A1A, 0x00000000, 0x000400FA,\n    0x00005686, 0x00002958, 0x00003A1A, 0x000200F8, 0x00002958, 0x000500C7,\n    0x00000017, 0x00004760, 0x00003910, 0x000009CE, 0x000500C4, 0x00000017,\n    0x000024D2, 0x00004760, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AD,\n    0x00003910, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448E, 0x000050AD,\n    0x0000013D, 0x000500C5, 0x00000017, 0x00003FF9, 0x000024D2, 0x0000448E,\n    0x000200F9, 0x00003A1A, 0x000200F8, 0x00003A1A, 0x000700F5, 0x00000017,\n    0x00002AAC, 0x00003910, 0x00006070, 0x00003FF9, 0x00002958, 0x000300F7,\n    0x0000362C, 0x00000000, 0x000400FA, 0x00003B23, 0x00002B39, 0x0000362C,\n    0x000200F8, 0x00002B39, 0x000500C4, 0x00000017, 0x00005E18, 0x00002AAC,\n    0x000002ED, 0x000500C2, 0x00000017, 0x00003BE8, 0x00002AAC, 0x000002ED,\n    0x000500C5, 0x00000017, 0x000029E9, 0x00005E18, 0x00003BE8, 0x000200F9,\n    0x0000362C, 0x000200F8, 0x0000362C, 0x000700F5, 0x00000017, 0x00004AB5,\n    0x00002AAC, 0x00003A1A, 0x000029E9, 0x00002B39, 0x000500C2, 0x0000000B,\n    0x00001BB8, 0x000054B5, 0x00000A17, 0x000500C7, 0x00000017, 0x000030B3,\n    0x00004AB5, 0x0000072E, 0x000500C7, 0x00000017, 0x00004944, 0x00004AB5,\n    0x0000064B, 0x000500C4, 0x00000017, 0x00006165, 0x00004944, 0x000002ED,\n    0x000500C5, 0x00000017, 0x00004296, 0x000030B3, 0x00006165, 0x000500C7,\n    0x00000017, 0x000052DD, 0x00004AB5, 0x00000310, 0x000500C2, 0x00000017,\n    0x000046A9, 0x000052DD, 0x000002ED, 0x000500C5, 0x00000017, 0x00001985,\n    0x00004296, 0x000046A9, 0x00060041, 0x00000294, 0x00005819, 0x0000140E,\n    0x00000A0B, 0x00001BB8, 0x0003003E, 0x00005819, 0x00001985, 0x000200F9,\n    0x00004C7A, 0x000200F8, 0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_ctx1_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25268\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v4uint = OpTypeVector %uint 4\n     %v2uint = OpTypeVector %uint 2\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v3uint = OpTypeVector %uint 3\n%uint_1431655765 = OpConstant %uint 1431655765\n     %uint_1 = OpConstant %uint 1\n%uint_2863311530 = OpConstant %uint 2863311530\n     %uint_0 = OpConstant %uint 0\n     %uint_2 = OpConstant %uint 2\n     %uint_4 = OpConstant %uint 4\n     %uint_6 = OpConstant %uint 6\n         %77 = OpConstantComposite %v4uint %uint_0 %uint_2 %uint_4 %uint_6\n     %uint_3 = OpConstant %uint 3\n %uint_65535 = OpConstant %uint 65535\n    %uint_16 = OpConstant %uint 16\n     %uint_8 = OpConstant %uint 8\n    %uint_24 = OpConstant %uint 24\n%uint_16711935 = OpConstant %uint 16711935\n%uint_4278255360 = OpConstant %uint 4278255360\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n      %int_3 = OpConstant %int 3\n      %int_2 = OpConstant %int 2\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %2596 = OpConstantComposite %v3uint %uint_2 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n       %2619 = OpConstantComposite %v3uint %uint_2 %uint_2 %uint_0\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n   %uint_255 = OpConstant %uint 255\n%uint_16711680 = OpConstant %uint 16711680\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n    %uint_32 = OpConstant %uint 32\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n       %1975 = OpConstantComposite %v2uint %uint_8 %uint_8\n       %1140 = OpConstantComposite %v2uint %uint_255 %uint_255\n       %2143 = OpConstantComposite %v2uint %uint_16 %uint_16\n       %2311 = OpConstantComposite %v2uint %uint_24 %uint_24\n       %2993 = OpConstantComposite %v2uint %uint_16711680 %uint_16711680\n       %2878 = OpConstantComposite %v4uint %uint_1431655765 %uint_1431655765 %uint_1431655765 %uint_1431655765\n       %2950 = OpConstantComposite %v4uint %uint_1 %uint_1 %uint_1 %uint_1\n       %2860 = OpConstantComposite %v4uint %uint_2863311530 %uint_2863311530 %uint_2863311530 %uint_2863311530\n         %47 = OpConstantComposite %v4uint %uint_3 %uint_3 %uint_3 %uint_3\n       %2015 = OpConstantComposite %v2uint %uint_65535 %uint_65535\n       %1870 = OpConstantComposite %v2uint %uint_3 %uint_3\n        %200 = OpConstantNull %v2uint\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %14903 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24540 = OpBitwiseAnd %uint %13606 %uint_1\n      %17270 = OpINotEqual %bool %24540 %uint_0\n      %12328 = OpBitwiseAnd %uint %13606 %uint_2\n      %17284 = OpINotEqual %bool %12328 %uint_0\n       %7856 = OpShiftRightLogical %uint %13606 %uint_2\n      %25058 = OpBitwiseAnd %uint %7856 %uint_3\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20158 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n      %22412 = OpLoad %uint %20158\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_7\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2596\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %14018 DontFlatten\n               OpBranchConditional %24679 %21992 %14018\n      %21992 = OpLabel\n               OpBranch %14903\n      %14018 = OpLabel\n      %17344 = OpShiftLeftLogical %v3uint %21387 %2619\n      %15489 = OpBitcast %v3int %17344\n      %18336 = OpCompositeExtract %int %15489 0\n       %9362 = OpIMul %int %18336 %int_2\n       %6362 = OpCompositeExtract %int %15489 2\n      %14505 = OpBitcast %int %6594\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %15489 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %22412\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %9362 %24535\n      %10404 = OpBitcast %uint %8258\n      %14582 = OpIAdd %uint %22411 %10404\n      %12308 = OpLogicalNot %bool %17270\n               OpSelectionMerge %15035 DontFlatten\n               OpBranchConditional %12308 %8377 %22376\n      %22376 = OpLabel\n               OpSelectionMerge %23536 DontFlatten\n               OpBranchConditional %17284 %24353 %23520\n      %23520 = OpLabel\n       %7964 = OpBitcast %v2int %17136\n      %22120 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %7964 1\n      %12089 = OpShiftRightArithmetic %int %14597 %int_5\n      %22400 = OpBitcast %int %22120\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %7964 0\n      %20423 = OpShiftRightArithmetic %int %25154 %int_5\n      %18864 = OpIAdd %int %7938 %20423\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25154 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17334 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17334 %uint_3\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25154 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20574 = OpBitwiseAnd %int %10425 %int_1\n      %21533 = OpShiftLeftLogical %int %20574 %int_1\n       %8890 = OpBitwiseXor %int %20766 %21533\n      %20598 = OpBitwiseAnd %int %14597 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6551\n       %7168 = OpShiftLeftLogical %int %21575 %int_11\n      %15490 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24163 %int_15\n      %15472 = OpBitwiseOr %int %15490 %20655\n      %14149 = OpShiftRightArithmetic %int %24163 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24163 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24163 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %23536\n      %24353 = OpLabel\n      %25147 = OpBitcast %v3int %21387\n      %19476 = OpShiftRightLogical %uint %22408 %int_5\n      %18810 = OpShiftRightLogical %uint %22409 %int_4\n       %6782 = OpCompositeExtract %int %25147 2\n      %12090 = OpShiftRightArithmetic %int %6782 %int_2\n      %22401 = OpBitcast %int %18810\n       %7939 = OpIMul %int %12090 %22401\n      %25155 = OpCompositeExtract %int %25147 1\n      %19055 = OpShiftRightArithmetic %int %25155 %int_4\n      %11052 = OpIAdd %int %7939 %19055\n      %16898 = OpBitcast %int %19476\n      %14944 = OpIMul %int %11052 %16898\n      %25156 = OpCompositeExtract %int %25147 0\n      %20424 = OpShiftRightArithmetic %int %25156 %int_5\n      %18940 = OpIAdd %int %14944 %20424\n       %8797 = OpShiftLeftLogical %int %18940 %int_7\n      %11434 = OpBitwiseAnd %int %6782 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %25155 %int_1\n      %21364 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21364 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %25156 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17335 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17335 %uint_3\n      %13015 = OpShiftRightArithmetic %int %25155 %int_3\n       %9929 = OpBitwiseXor %int %13015 %12090\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %25156 %int_3\n      %20575 = OpBitwiseAnd %int %9616 %int_3\n      %21534 = OpShiftLeftLogical %int %16793 %int_1\n       %8891 = OpBitwiseXor %int %20575 %21534\n      %20599 = OpBitwiseAnd %int %25155 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6552\n       %7169 = OpShiftLeftLogical %int %16793 %int_11\n      %15491 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24144 %int_15\n      %15473 = OpBitwiseOr %int %15491 %20656\n      %14150 = OpShiftRightArithmetic %int %24144 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24144 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24144 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %23536\n      %23536 = OpLabel\n      %10540 = OpPhi %uint %16870 %24353 %16869 %23520\n               OpBranch %15035\n       %8377 = OpLabel\n      %19885 = OpCompositeExtract %uint %21387 0\n      %11246 = OpCompositeExtract %uint %21387 1\n      %18801 = OpCompositeExtract %uint %21387 2\n      %14831 = OpIMul %uint %22409 %18801\n      %20322 = OpIAdd %uint %11246 %14831\n      %21676 = OpIMul %uint %22408 %20322\n      %20398 = OpIAdd %uint %19885 %21676\n      %11367 = OpShiftLeftLogical %uint %20398 %uint_3\n               OpBranch %15035\n      %15035 = OpLabel\n      %11376 = OpPhi %uint %11367 %8377 %10540 %23536\n      %18621 = OpIAdd %uint %11376 %24236\n      %15698 = OpShiftRightLogical %uint %18621 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15698\n       %7338 = OpLoad %v4uint %20399\n      %13760 = OpIEqual %bool %25058 %uint_1\n      %21366 = OpIEqual %bool %25058 %uint_2\n      %22150 = OpLogicalOr %bool %13760 %21366\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %7338 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %7338 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22649 = OpPhi %v4uint %7338 %15035 %16376 %10583\n      %19638 = OpIEqual %bool %25058 %uint_3\n      %15139 = OpLogicalOr %bool %21366 %19638\n               OpSelectionMerge %11682 None\n               OpBranchConditional %15139 %11064 %11682\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22649 %749\n      %15335 = OpShiftRightLogical %v4uint %22649 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %11682\n      %11682 = OpLabel\n      %19853 = OpPhi %v4uint %22649 %13411 %10728 %11064\n      %22133 = OpVectorShuffle %v2uint %19853 %19853 0 2\n      %14696 = OpShiftRightLogical %v2uint %22133 %1975\n       %7427 = OpBitwiseAnd %v2uint %14696 %1140\n      %18755 = OpBitwiseAnd %v2uint %22133 %1140\n      %22690 = OpShiftLeftLogical %v2uint %18755 %2143\n      %16241 = OpBitwiseOr %v2uint %7427 %22690\n      %22243 = OpCompositeExtract %uint %16241 0\n       %6423 = OpCompositeExtract %uint %16241 1\n      %10734 = OpShiftRightLogical %v2uint %22133 %2311\n       %7201 = OpBitwiseAnd %v2uint %22133 %2993\n      %14690 = OpBitwiseOr %v2uint %10734 %7201\n      %19249 = OpCompositeExtract %uint %14690 0\n       %7247 = OpCompositeExtract %uint %14690 1\n      %24888 = OpVectorShuffle %v4uint %19853 %200 1 3 1 1\n       %8966 = OpBitwiseAnd %v4uint %24888 %2878\n      %24266 = OpShiftLeftLogical %v4uint %8966 %2950\n      %20653 = OpBitwiseAnd %v4uint %24888 %2860\n      %16599 = OpShiftRightLogical %v4uint %20653 %2950\n      %24000 = OpBitwiseOr %v4uint %24266 %16599\n      %19618 = OpBitwiseAnd %v4uint %24000 %2860\n      %18181 = OpShiftRightLogical %v4uint %19618 %2950\n      %17496 = OpBitwiseXor %v4uint %24000 %18181\n      %17332 = OpVectorShuffle %v2uint %17496 %17496 0 1\n       %9851 = OpShiftRightLogical %uint %14582 %int_4\n      %19956 = OpNot %v2uint %17332\n      %10358 = OpVectorShuffle %v4uint %19956 %19956 0 0 0 0\n      %24270 = OpShiftRightLogical %v4uint %10358 %77\n       %7727 = OpBitwiseAnd %v4uint %24270 %47\n      %17317 = OpCompositeConstruct %v4uint %22243 %22243 %22243 %22243\n      %23347 = OpIMul %v4uint %7727 %17317\n      %14333 = OpVectorShuffle %v4uint %17496 %200 0 0 0 0\n      %14627 = OpShiftRightLogical %v4uint %14333 %77\n       %7728 = OpBitwiseAnd %v4uint %14627 %47\n      %18248 = OpCompositeConstruct %v4uint %19249 %19249 %19249 %19249\n      %12685 = OpIMul %v4uint %7728 %18248\n      %14191 = OpIAdd %v4uint %23347 %12685\n      %10268 = OpVectorShuffle %v2uint %14191 %14191 0 2\n       %9375 = OpBitwiseAnd %v2uint %10268 %2015\n      %17040 = OpUDiv %v2uint %9375 %1870\n      %25246 = OpShiftRightLogical %v2uint %10268 %2143\n      %15366 = OpUDiv %v2uint %25246 %1870\n      %14005 = OpShiftLeftLogical %v2uint %15366 %1975\n       %8378 = OpBitwiseOr %v2uint %17040 %14005\n      %17075 = OpVectorShuffle %v2uint %14191 %14191 1 3\n      %16634 = OpBitwiseAnd %v2uint %17075 %2015\n      %17891 = OpUDiv %v2uint %16634 %1870\n      %16994 = OpShiftLeftLogical %v2uint %17891 %2143\n       %6318 = OpBitwiseOr %v2uint %8378 %16994\n      %15325 = OpShiftRightLogical %v2uint %17075 %2143\n      %24205 = OpUDiv %v2uint %15325 %1870\n      %14043 = OpShiftLeftLogical %v2uint %24205 %2311\n      %24860 = OpBitwiseOr %v2uint %6318 %14043\n      %20058 = OpCompositeExtract %uint %24860 0\n       %7152 = OpCompositeExtract %uint %24860 1\n       %6739 = OpVectorShuffle %v4uint %19956 %19956 1 1 1 1\n       %9009 = OpShiftRightLogical %v4uint %6739 %77\n       %7729 = OpBitwiseAnd %v4uint %9009 %47\n      %17318 = OpCompositeConstruct %v4uint %6423 %6423 %6423 %6423\n      %23348 = OpIMul %v4uint %7729 %17318\n      %14334 = OpVectorShuffle %v4uint %17496 %200 1 1 1 1\n      %14628 = OpShiftRightLogical %v4uint %14334 %77\n       %7730 = OpBitwiseAnd %v4uint %14628 %47\n      %18249 = OpCompositeConstruct %v4uint %7247 %7247 %7247 %7247\n      %12686 = OpIMul %v4uint %7730 %18249\n      %14192 = OpIAdd %v4uint %23348 %12686\n      %10269 = OpVectorShuffle %v2uint %14192 %14192 0 2\n       %9376 = OpBitwiseAnd %v2uint %10269 %2015\n      %17041 = OpUDiv %v2uint %9376 %1870\n      %25247 = OpShiftRightLogical %v2uint %10269 %2143\n      %15367 = OpUDiv %v2uint %25247 %1870\n      %14006 = OpShiftLeftLogical %v2uint %15367 %1975\n       %8379 = OpBitwiseOr %v2uint %17041 %14006\n      %17076 = OpVectorShuffle %v2uint %14192 %14192 1 3\n      %16635 = OpBitwiseAnd %v2uint %17076 %2015\n      %17892 = OpUDiv %v2uint %16635 %1870\n      %16995 = OpShiftLeftLogical %v2uint %17892 %2143\n       %6319 = OpBitwiseOr %v2uint %8379 %16995\n      %15326 = OpShiftRightLogical %v2uint %17076 %2143\n      %24206 = OpUDiv %v2uint %15326 %1870\n      %14044 = OpShiftLeftLogical %v2uint %24206 %2311\n      %24861 = OpBitwiseOr %v2uint %6319 %14044\n      %20077 = OpCompositeExtract %uint %24861 0\n      %23599 = OpCompositeExtract %uint %24861 1\n      %18260 = OpCompositeConstruct %v4uint %20058 %7152 %20077 %23599\n       %8787 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %9851\n               OpStore %8787 %18260\n      %12832 = OpCompositeExtract %uint %17344 1\n      %23232 = OpIAdd %uint %12832 %uint_1\n      %17425 = OpULessThan %bool %23232 %6594\n               OpSelectionMerge %9048 DontFlatten\n               OpBranchConditional %17425 %22828 %9048\n      %22828 = OpLabel\n      %15481 = OpIAdd %uint %14582 %22412\n      %14284 = OpShiftRightLogical %uint %15481 %int_4\n      %11859 = OpShiftRightLogical %v2uint %17332 %1975\n      %19377 = OpNot %v2uint %11859\n      %10359 = OpVectorShuffle %v4uint %19377 %19377 0 0 0 0\n      %25258 = OpShiftRightLogical %v4uint %10359 %77\n      %16795 = OpBitwiseAnd %v4uint %25258 %47\n      %15740 = OpIMul %v4uint %16795 %17317\n      %10523 = OpVectorShuffle %v4uint %11859 %11859 0 0 0 0\n      %15615 = OpShiftRightLogical %v4uint %10523 %77\n      %17726 = OpBitwiseAnd %v4uint %15615 %47\n      %24149 = OpIMul %v4uint %17726 %18248\n      %10381 = OpIAdd %v4uint %15740 %24149\n      %10270 = OpVectorShuffle %v2uint %10381 %10381 0 2\n       %9377 = OpBitwiseAnd %v2uint %10270 %2015\n      %17042 = OpUDiv %v2uint %9377 %1870\n      %25248 = OpShiftRightLogical %v2uint %10270 %2143\n      %15368 = OpUDiv %v2uint %25248 %1870\n      %14007 = OpShiftLeftLogical %v2uint %15368 %1975\n       %8380 = OpBitwiseOr %v2uint %17042 %14007\n      %17077 = OpVectorShuffle %v2uint %10381 %10381 1 3\n      %16636 = OpBitwiseAnd %v2uint %17077 %2015\n      %17893 = OpUDiv %v2uint %16636 %1870\n      %16996 = OpShiftLeftLogical %v2uint %17893 %2143\n       %6320 = OpBitwiseOr %v2uint %8380 %16996\n      %15327 = OpShiftRightLogical %v2uint %17077 %2143\n      %24207 = OpUDiv %v2uint %15327 %1870\n      %14045 = OpShiftLeftLogical %v2uint %24207 %2311\n      %24862 = OpBitwiseOr %v2uint %6320 %14045\n      %20059 = OpCompositeExtract %uint %24862 0\n       %7153 = OpCompositeExtract %uint %24862 1\n       %6740 = OpVectorShuffle %v4uint %19377 %19377 1 1 1 1\n       %9997 = OpShiftRightLogical %v4uint %6740 %77\n      %16796 = OpBitwiseAnd %v4uint %9997 %47\n      %15741 = OpIMul %v4uint %16796 %17318\n      %10524 = OpVectorShuffle %v4uint %11859 %11859 1 1 1 1\n      %15616 = OpShiftRightLogical %v4uint %10524 %77\n      %17727 = OpBitwiseAnd %v4uint %15616 %47\n      %24150 = OpIMul %v4uint %17727 %18249\n      %10382 = OpIAdd %v4uint %15741 %24150\n      %10271 = OpVectorShuffle %v2uint %10382 %10382 0 2\n       %9378 = OpBitwiseAnd %v2uint %10271 %2015\n      %17043 = OpUDiv %v2uint %9378 %1870\n      %25249 = OpShiftRightLogical %v2uint %10271 %2143\n      %15369 = OpUDiv %v2uint %25249 %1870\n      %14008 = OpShiftLeftLogical %v2uint %15369 %1975\n       %8381 = OpBitwiseOr %v2uint %17043 %14008\n      %17078 = OpVectorShuffle %v2uint %10382 %10382 1 3\n      %16637 = OpBitwiseAnd %v2uint %17078 %2015\n      %17894 = OpUDiv %v2uint %16637 %1870\n      %16997 = OpShiftLeftLogical %v2uint %17894 %2143\n       %6321 = OpBitwiseOr %v2uint %8381 %16997\n      %15328 = OpShiftRightLogical %v2uint %17078 %2143\n      %24208 = OpUDiv %v2uint %15328 %1870\n      %14046 = OpShiftLeftLogical %v2uint %24208 %2311\n      %24863 = OpBitwiseOr %v2uint %6321 %14046\n      %20079 = OpCompositeExtract %uint %24863 0\n      %23600 = OpCompositeExtract %uint %24863 1\n      %18261 = OpCompositeConstruct %v4uint %20059 %7153 %20079 %23600\n       %9680 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %14284\n               OpStore %9680 %18261\n      %14840 = OpIAdd %uint %12832 %uint_2\n      %11787 = OpULessThan %bool %14840 %6594\n               OpSelectionMerge %7205 DontFlatten\n               OpBranchConditional %11787 %20882 %7205\n      %20882 = OpLabel\n      %13198 = OpIMul %uint %uint_2 %22412\n      %13467 = OpIAdd %uint %14582 %13198\n      %17285 = OpShiftRightLogical %uint %13467 %int_4\n      %11860 = OpShiftRightLogical %v2uint %17332 %2143\n      %19378 = OpNot %v2uint %11860\n      %10360 = OpVectorShuffle %v4uint %19378 %19378 0 0 0 0\n      %25259 = OpShiftRightLogical %v4uint %10360 %77\n      %16797 = OpBitwiseAnd %v4uint %25259 %47\n      %15742 = OpIMul %v4uint %16797 %17317\n      %10525 = OpVectorShuffle %v4uint %11860 %11860 0 0 0 0\n      %15617 = OpShiftRightLogical %v4uint %10525 %77\n      %17728 = OpBitwiseAnd %v4uint %15617 %47\n      %24151 = OpIMul %v4uint %17728 %18248\n      %10383 = OpIAdd %v4uint %15742 %24151\n      %10272 = OpVectorShuffle %v2uint %10383 %10383 0 2\n       %9379 = OpBitwiseAnd %v2uint %10272 %2015\n      %17044 = OpUDiv %v2uint %9379 %1870\n      %25250 = OpShiftRightLogical %v2uint %10272 %2143\n      %15370 = OpUDiv %v2uint %25250 %1870\n      %14009 = OpShiftLeftLogical %v2uint %15370 %1975\n       %8382 = OpBitwiseOr %v2uint %17044 %14009\n      %17079 = OpVectorShuffle %v2uint %10383 %10383 1 3\n      %16638 = OpBitwiseAnd %v2uint %17079 %2015\n      %17895 = OpUDiv %v2uint %16638 %1870\n      %16998 = OpShiftLeftLogical %v2uint %17895 %2143\n       %6322 = OpBitwiseOr %v2uint %8382 %16998\n      %15329 = OpShiftRightLogical %v2uint %17079 %2143\n      %24209 = OpUDiv %v2uint %15329 %1870\n      %14047 = OpShiftLeftLogical %v2uint %24209 %2311\n      %24864 = OpBitwiseOr %v2uint %6322 %14047\n      %20060 = OpCompositeExtract %uint %24864 0\n       %7154 = OpCompositeExtract %uint %24864 1\n       %6741 = OpVectorShuffle %v4uint %19378 %19378 1 1 1 1\n       %9998 = OpShiftRightLogical %v4uint %6741 %77\n      %16798 = OpBitwiseAnd %v4uint %9998 %47\n      %15743 = OpIMul %v4uint %16798 %17318\n      %10526 = OpVectorShuffle %v4uint %11860 %11860 1 1 1 1\n      %15618 = OpShiftRightLogical %v4uint %10526 %77\n      %17729 = OpBitwiseAnd %v4uint %15618 %47\n      %24152 = OpIMul %v4uint %17729 %18249\n      %10384 = OpIAdd %v4uint %15743 %24152\n      %10273 = OpVectorShuffle %v2uint %10384 %10384 0 2\n       %9380 = OpBitwiseAnd %v2uint %10273 %2015\n      %17045 = OpUDiv %v2uint %9380 %1870\n      %25251 = OpShiftRightLogical %v2uint %10273 %2143\n      %15371 = OpUDiv %v2uint %25251 %1870\n      %14010 = OpShiftLeftLogical %v2uint %15371 %1975\n       %8383 = OpBitwiseOr %v2uint %17045 %14010\n      %17080 = OpVectorShuffle %v2uint %10384 %10384 1 3\n      %16639 = OpBitwiseAnd %v2uint %17080 %2015\n      %17896 = OpUDiv %v2uint %16639 %1870\n      %16999 = OpShiftLeftLogical %v2uint %17896 %2143\n       %6323 = OpBitwiseOr %v2uint %8383 %16999\n      %15330 = OpShiftRightLogical %v2uint %17080 %2143\n      %24210 = OpUDiv %v2uint %15330 %1870\n      %14048 = OpShiftLeftLogical %v2uint %24210 %2311\n      %24865 = OpBitwiseOr %v2uint %6323 %14048\n      %20080 = OpCompositeExtract %uint %24865 0\n      %23601 = OpCompositeExtract %uint %24865 1\n      %18262 = OpCompositeConstruct %v4uint %20060 %7154 %20080 %23601\n       %9681 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %17285\n               OpStore %9681 %18262\n      %14841 = OpIAdd %uint %12832 %uint_3\n      %11788 = OpULessThan %bool %14841 %6594\n               OpSelectionMerge %18021 DontFlatten\n               OpBranchConditional %11788 %20883 %18021\n      %20883 = OpLabel\n      %13199 = OpIMul %uint %uint_3 %22412\n      %13468 = OpIAdd %uint %14582 %13199\n      %17286 = OpShiftRightLogical %uint %13468 %int_4\n      %11861 = OpShiftRightLogical %v2uint %17332 %2311\n      %19379 = OpNot %v2uint %11861\n      %10361 = OpVectorShuffle %v4uint %19379 %19379 0 0 0 0\n      %25260 = OpShiftRightLogical %v4uint %10361 %77\n      %16799 = OpBitwiseAnd %v4uint %25260 %47\n      %15744 = OpIMul %v4uint %16799 %17317\n      %10527 = OpVectorShuffle %v4uint %11861 %11861 0 0 0 0\n      %15619 = OpShiftRightLogical %v4uint %10527 %77\n      %17730 = OpBitwiseAnd %v4uint %15619 %47\n      %24153 = OpIMul %v4uint %17730 %18248\n      %10385 = OpIAdd %v4uint %15744 %24153\n      %10274 = OpVectorShuffle %v2uint %10385 %10385 0 2\n       %9381 = OpBitwiseAnd %v2uint %10274 %2015\n      %17046 = OpUDiv %v2uint %9381 %1870\n      %25252 = OpShiftRightLogical %v2uint %10274 %2143\n      %15372 = OpUDiv %v2uint %25252 %1870\n      %14011 = OpShiftLeftLogical %v2uint %15372 %1975\n       %8384 = OpBitwiseOr %v2uint %17046 %14011\n      %17081 = OpVectorShuffle %v2uint %10385 %10385 1 3\n      %16640 = OpBitwiseAnd %v2uint %17081 %2015\n      %17897 = OpUDiv %v2uint %16640 %1870\n      %17000 = OpShiftLeftLogical %v2uint %17897 %2143\n       %6324 = OpBitwiseOr %v2uint %8384 %17000\n      %15331 = OpShiftRightLogical %v2uint %17081 %2143\n      %24211 = OpUDiv %v2uint %15331 %1870\n      %14049 = OpShiftLeftLogical %v2uint %24211 %2311\n      %24866 = OpBitwiseOr %v2uint %6324 %14049\n      %20061 = OpCompositeExtract %uint %24866 0\n       %7155 = OpCompositeExtract %uint %24866 1\n       %6742 = OpVectorShuffle %v4uint %19379 %19379 1 1 1 1\n       %9999 = OpShiftRightLogical %v4uint %6742 %77\n      %16800 = OpBitwiseAnd %v4uint %9999 %47\n      %15745 = OpIMul %v4uint %16800 %17318\n      %10528 = OpVectorShuffle %v4uint %11861 %11861 1 1 1 1\n      %15620 = OpShiftRightLogical %v4uint %10528 %77\n      %17731 = OpBitwiseAnd %v4uint %15620 %47\n      %24154 = OpIMul %v4uint %17731 %18249\n      %10386 = OpIAdd %v4uint %15745 %24154\n      %10275 = OpVectorShuffle %v2uint %10386 %10386 0 2\n       %9382 = OpBitwiseAnd %v2uint %10275 %2015\n      %17047 = OpUDiv %v2uint %9382 %1870\n      %25253 = OpShiftRightLogical %v2uint %10275 %2143\n      %15373 = OpUDiv %v2uint %25253 %1870\n      %14012 = OpShiftLeftLogical %v2uint %15373 %1975\n       %8385 = OpBitwiseOr %v2uint %17047 %14012\n      %17082 = OpVectorShuffle %v2uint %10386 %10386 1 3\n      %16641 = OpBitwiseAnd %v2uint %17082 %2015\n      %17898 = OpUDiv %v2uint %16641 %1870\n      %17001 = OpShiftLeftLogical %v2uint %17898 %2143\n       %6325 = OpBitwiseOr %v2uint %8385 %17001\n      %15332 = OpShiftRightLogical %v2uint %17082 %2143\n      %24212 = OpUDiv %v2uint %15332 %1870\n      %14050 = OpShiftLeftLogical %v2uint %24212 %2311\n      %24867 = OpBitwiseOr %v2uint %6325 %14050\n      %20081 = OpCompositeExtract %uint %24867 0\n      %23602 = OpCompositeExtract %uint %24867 1\n      %18263 = OpCompositeConstruct %v4uint %20061 %7155 %20081 %23602\n      %11979 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %17286\n               OpStore %11979 %18263\n               OpBranch %18021\n      %18021 = OpLabel\n               OpBranch %7205\n       %7205 = OpLabel\n               OpBranch %9048\n       %9048 = OpLabel\n      %22413 = OpIAdd %uint %14582 %uint_16\n               OpSelectionMerge %24688 DontFlatten\n               OpBranchConditional %17270 %7206 %21993\n      %21993 = OpLabel\n               OpBranch %24688\n       %7206 = OpLabel\n               OpBranch %24688\n      %24688 = OpLabel\n      %11377 = OpPhi %uint %uint_32 %7206 %uint_16 %21993\n      %18622 = OpIAdd %uint %18621 %11377\n      %15699 = OpShiftRightLogical %uint %18622 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15699\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %14874 None\n               OpBranchConditional %22150 %10584 %14874\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20654 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20654 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %14874\n      %14874 = OpLabel\n      %10924 = OpPhi %v4uint %14608 %24688 %16377 %10584\n               OpSelectionMerge %11683 None\n               OpBranchConditional %15139 %11065 %11683\n      %11065 = OpLabel\n      %24088 = OpShiftLeftLogical %v4uint %10924 %749\n      %15336 = OpShiftRightLogical %v4uint %10924 %749\n      %10729 = OpBitwiseOr %v4uint %24088 %15336\n               OpBranch %11683\n      %11683 = OpLabel\n      %19854 = OpPhi %v4uint %10924 %14874 %10729 %11065\n      %22134 = OpVectorShuffle %v2uint %19854 %19854 0 2\n      %14697 = OpShiftRightLogical %v2uint %22134 %1975\n       %7428 = OpBitwiseAnd %v2uint %14697 %1140\n      %18756 = OpBitwiseAnd %v2uint %22134 %1140\n      %22691 = OpShiftLeftLogical %v2uint %18756 %2143\n      %16242 = OpBitwiseOr %v2uint %7428 %22691\n      %22244 = OpCompositeExtract %uint %16242 0\n       %6424 = OpCompositeExtract %uint %16242 1\n      %10735 = OpShiftRightLogical %v2uint %22134 %2311\n       %7202 = OpBitwiseAnd %v2uint %22134 %2993\n      %14691 = OpBitwiseOr %v2uint %10735 %7202\n      %19250 = OpCompositeExtract %uint %14691 0\n       %7248 = OpCompositeExtract %uint %14691 1\n      %24889 = OpVectorShuffle %v4uint %19854 %200 1 3 1 1\n       %8967 = OpBitwiseAnd %v4uint %24889 %2878\n      %24267 = OpShiftLeftLogical %v4uint %8967 %2950\n      %20657 = OpBitwiseAnd %v4uint %24889 %2860\n      %16600 = OpShiftRightLogical %v4uint %20657 %2950\n      %24001 = OpBitwiseOr %v4uint %24267 %16600\n      %19619 = OpBitwiseAnd %v4uint %24001 %2860\n      %18182 = OpShiftRightLogical %v4uint %19619 %2950\n      %17497 = OpBitwiseXor %v4uint %24001 %18182\n      %17333 = OpVectorShuffle %v2uint %17497 %17497 0 1\n       %9852 = OpShiftRightLogical %uint %22413 %int_4\n      %19957 = OpNot %v2uint %17333\n      %10362 = OpVectorShuffle %v4uint %19957 %19957 0 0 0 0\n      %24271 = OpShiftRightLogical %v4uint %10362 %77\n       %7731 = OpBitwiseAnd %v4uint %24271 %47\n      %17319 = OpCompositeConstruct %v4uint %22244 %22244 %22244 %22244\n      %23349 = OpIMul %v4uint %7731 %17319\n      %14335 = OpVectorShuffle %v4uint %17497 %200 0 0 0 0\n      %14629 = OpShiftRightLogical %v4uint %14335 %77\n       %7732 = OpBitwiseAnd %v4uint %14629 %47\n      %18250 = OpCompositeConstruct %v4uint %19250 %19250 %19250 %19250\n      %12687 = OpIMul %v4uint %7732 %18250\n      %14193 = OpIAdd %v4uint %23349 %12687\n      %10278 = OpVectorShuffle %v2uint %14193 %14193 0 2\n       %9383 = OpBitwiseAnd %v2uint %10278 %2015\n      %17048 = OpUDiv %v2uint %9383 %1870\n      %25254 = OpShiftRightLogical %v2uint %10278 %2143\n      %15374 = OpUDiv %v2uint %25254 %1870\n      %14013 = OpShiftLeftLogical %v2uint %15374 %1975\n       %8386 = OpBitwiseOr %v2uint %17048 %14013\n      %17083 = OpVectorShuffle %v2uint %14193 %14193 1 3\n      %16642 = OpBitwiseAnd %v2uint %17083 %2015\n      %17899 = OpUDiv %v2uint %16642 %1870\n      %17002 = OpShiftLeftLogical %v2uint %17899 %2143\n       %6326 = OpBitwiseOr %v2uint %8386 %17002\n      %15333 = OpShiftRightLogical %v2uint %17083 %2143\n      %24213 = OpUDiv %v2uint %15333 %1870\n      %14051 = OpShiftLeftLogical %v2uint %24213 %2311\n      %24868 = OpBitwiseOr %v2uint %6326 %14051\n      %20062 = OpCompositeExtract %uint %24868 0\n       %7156 = OpCompositeExtract %uint %24868 1\n       %6743 = OpVectorShuffle %v4uint %19957 %19957 1 1 1 1\n       %9010 = OpShiftRightLogical %v4uint %6743 %77\n       %7733 = OpBitwiseAnd %v4uint %9010 %47\n      %17320 = OpCompositeConstruct %v4uint %6424 %6424 %6424 %6424\n      %23350 = OpIMul %v4uint %7733 %17320\n      %14336 = OpVectorShuffle %v4uint %17497 %200 1 1 1 1\n      %14630 = OpShiftRightLogical %v4uint %14336 %77\n       %7734 = OpBitwiseAnd %v4uint %14630 %47\n      %18251 = OpCompositeConstruct %v4uint %7248 %7248 %7248 %7248\n      %12688 = OpIMul %v4uint %7734 %18251\n      %14194 = OpIAdd %v4uint %23350 %12688\n      %10279 = OpVectorShuffle %v2uint %14194 %14194 0 2\n       %9384 = OpBitwiseAnd %v2uint %10279 %2015\n      %17049 = OpUDiv %v2uint %9384 %1870\n      %25255 = OpShiftRightLogical %v2uint %10279 %2143\n      %15375 = OpUDiv %v2uint %25255 %1870\n      %14014 = OpShiftLeftLogical %v2uint %15375 %1975\n       %8387 = OpBitwiseOr %v2uint %17049 %14014\n      %17084 = OpVectorShuffle %v2uint %14194 %14194 1 3\n      %16643 = OpBitwiseAnd %v2uint %17084 %2015\n      %17900 = OpUDiv %v2uint %16643 %1870\n      %17003 = OpShiftLeftLogical %v2uint %17900 %2143\n       %6327 = OpBitwiseOr %v2uint %8387 %17003\n      %15334 = OpShiftRightLogical %v2uint %17084 %2143\n      %24214 = OpUDiv %v2uint %15334 %1870\n      %14052 = OpShiftLeftLogical %v2uint %24214 %2311\n      %24869 = OpBitwiseOr %v2uint %6327 %14052\n      %20082 = OpCompositeExtract %uint %24869 0\n      %23603 = OpCompositeExtract %uint %24869 1\n      %18264 = OpCompositeConstruct %v4uint %20062 %7156 %20082 %23603\n      %11941 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %9852\n               OpStore %11941 %18264\n               OpSelectionMerge %7208 DontFlatten\n               OpBranchConditional %17425 %22829 %7208\n      %22829 = OpLabel\n      %15482 = OpIAdd %uint %22413 %22412\n      %14285 = OpShiftRightLogical %uint %15482 %int_4\n      %11862 = OpShiftRightLogical %v2uint %17333 %1975\n      %19380 = OpNot %v2uint %11862\n      %10363 = OpVectorShuffle %v4uint %19380 %19380 0 0 0 0\n      %25261 = OpShiftRightLogical %v4uint %10363 %77\n      %16801 = OpBitwiseAnd %v4uint %25261 %47\n      %15746 = OpIMul %v4uint %16801 %17319\n      %10529 = OpVectorShuffle %v4uint %11862 %11862 0 0 0 0\n      %15621 = OpShiftRightLogical %v4uint %10529 %77\n      %17732 = OpBitwiseAnd %v4uint %15621 %47\n      %24155 = OpIMul %v4uint %17732 %18250\n      %10387 = OpIAdd %v4uint %15746 %24155\n      %10280 = OpVectorShuffle %v2uint %10387 %10387 0 2\n       %9385 = OpBitwiseAnd %v2uint %10280 %2015\n      %17050 = OpUDiv %v2uint %9385 %1870\n      %25256 = OpShiftRightLogical %v2uint %10280 %2143\n      %15376 = OpUDiv %v2uint %25256 %1870\n      %14015 = OpShiftLeftLogical %v2uint %15376 %1975\n       %8388 = OpBitwiseOr %v2uint %17050 %14015\n      %17085 = OpVectorShuffle %v2uint %10387 %10387 1 3\n      %16644 = OpBitwiseAnd %v2uint %17085 %2015\n      %17901 = OpUDiv %v2uint %16644 %1870\n      %17004 = OpShiftLeftLogical %v2uint %17901 %2143\n       %6332 = OpBitwiseOr %v2uint %8388 %17004\n      %15337 = OpShiftRightLogical %v2uint %17085 %2143\n      %24215 = OpUDiv %v2uint %15337 %1870\n      %14053 = OpShiftLeftLogical %v2uint %24215 %2311\n      %24870 = OpBitwiseOr %v2uint %6332 %14053\n      %20063 = OpCompositeExtract %uint %24870 0\n       %7157 = OpCompositeExtract %uint %24870 1\n       %6744 = OpVectorShuffle %v4uint %19380 %19380 1 1 1 1\n      %10000 = OpShiftRightLogical %v4uint %6744 %77\n      %16802 = OpBitwiseAnd %v4uint %10000 %47\n      %15747 = OpIMul %v4uint %16802 %17320\n      %10530 = OpVectorShuffle %v4uint %11862 %11862 1 1 1 1\n      %15622 = OpShiftRightLogical %v4uint %10530 %77\n      %17733 = OpBitwiseAnd %v4uint %15622 %47\n      %24156 = OpIMul %v4uint %17733 %18251\n      %10388 = OpIAdd %v4uint %15747 %24156\n      %10281 = OpVectorShuffle %v2uint %10388 %10388 0 2\n       %9386 = OpBitwiseAnd %v2uint %10281 %2015\n      %17051 = OpUDiv %v2uint %9386 %1870\n      %25257 = OpShiftRightLogical %v2uint %10281 %2143\n      %15377 = OpUDiv %v2uint %25257 %1870\n      %14016 = OpShiftLeftLogical %v2uint %15377 %1975\n       %8389 = OpBitwiseOr %v2uint %17051 %14016\n      %17086 = OpVectorShuffle %v2uint %10388 %10388 1 3\n      %16645 = OpBitwiseAnd %v2uint %17086 %2015\n      %17902 = OpUDiv %v2uint %16645 %1870\n      %17005 = OpShiftLeftLogical %v2uint %17902 %2143\n       %6333 = OpBitwiseOr %v2uint %8389 %17005\n      %15338 = OpShiftRightLogical %v2uint %17086 %2143\n      %24216 = OpUDiv %v2uint %15338 %1870\n      %14054 = OpShiftLeftLogical %v2uint %24216 %2311\n      %24871 = OpBitwiseOr %v2uint %6333 %14054\n      %20083 = OpCompositeExtract %uint %24871 0\n      %23604 = OpCompositeExtract %uint %24871 1\n      %18265 = OpCompositeConstruct %v4uint %20063 %7157 %20083 %23604\n       %9682 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %14285\n               OpStore %9682 %18265\n      %14842 = OpIAdd %uint %12832 %uint_2\n      %11789 = OpULessThan %bool %14842 %6594\n               OpSelectionMerge %7207 DontFlatten\n               OpBranchConditional %11789 %20884 %7207\n      %20884 = OpLabel\n      %13200 = OpIMul %uint %uint_2 %22412\n      %13469 = OpIAdd %uint %22413 %13200\n      %17287 = OpShiftRightLogical %uint %13469 %int_4\n      %11863 = OpShiftRightLogical %v2uint %17333 %2143\n      %19381 = OpNot %v2uint %11863\n      %10364 = OpVectorShuffle %v4uint %19381 %19381 0 0 0 0\n      %25262 = OpShiftRightLogical %v4uint %10364 %77\n      %16803 = OpBitwiseAnd %v4uint %25262 %47\n      %15748 = OpIMul %v4uint %16803 %17319\n      %10531 = OpVectorShuffle %v4uint %11863 %11863 0 0 0 0\n      %15623 = OpShiftRightLogical %v4uint %10531 %77\n      %17734 = OpBitwiseAnd %v4uint %15623 %47\n      %24157 = OpIMul %v4uint %17734 %18250\n      %10389 = OpIAdd %v4uint %15748 %24157\n      %10282 = OpVectorShuffle %v2uint %10389 %10389 0 2\n       %9387 = OpBitwiseAnd %v2uint %10282 %2015\n      %17052 = OpUDiv %v2uint %9387 %1870\n      %25263 = OpShiftRightLogical %v2uint %10282 %2143\n      %15378 = OpUDiv %v2uint %25263 %1870\n      %14017 = OpShiftLeftLogical %v2uint %15378 %1975\n       %8390 = OpBitwiseOr %v2uint %17052 %14017\n      %17087 = OpVectorShuffle %v2uint %10389 %10389 1 3\n      %16646 = OpBitwiseAnd %v2uint %17087 %2015\n      %17903 = OpUDiv %v2uint %16646 %1870\n      %17006 = OpShiftLeftLogical %v2uint %17903 %2143\n       %6334 = OpBitwiseOr %v2uint %8390 %17006\n      %15339 = OpShiftRightLogical %v2uint %17087 %2143\n      %24217 = OpUDiv %v2uint %15339 %1870\n      %14055 = OpShiftLeftLogical %v2uint %24217 %2311\n      %24872 = OpBitwiseOr %v2uint %6334 %14055\n      %20064 = OpCompositeExtract %uint %24872 0\n       %7158 = OpCompositeExtract %uint %24872 1\n       %6745 = OpVectorShuffle %v4uint %19381 %19381 1 1 1 1\n      %10001 = OpShiftRightLogical %v4uint %6745 %77\n      %16804 = OpBitwiseAnd %v4uint %10001 %47\n      %15749 = OpIMul %v4uint %16804 %17320\n      %10532 = OpVectorShuffle %v4uint %11863 %11863 1 1 1 1\n      %15624 = OpShiftRightLogical %v4uint %10532 %77\n      %17735 = OpBitwiseAnd %v4uint %15624 %47\n      %24158 = OpIMul %v4uint %17735 %18251\n      %10390 = OpIAdd %v4uint %15749 %24158\n      %10283 = OpVectorShuffle %v2uint %10390 %10390 0 2\n       %9388 = OpBitwiseAnd %v2uint %10283 %2015\n      %17053 = OpUDiv %v2uint %9388 %1870\n      %25264 = OpShiftRightLogical %v2uint %10283 %2143\n      %15379 = OpUDiv %v2uint %25264 %1870\n      %14019 = OpShiftLeftLogical %v2uint %15379 %1975\n       %8391 = OpBitwiseOr %v2uint %17053 %14019\n      %17088 = OpVectorShuffle %v2uint %10390 %10390 1 3\n      %16647 = OpBitwiseAnd %v2uint %17088 %2015\n      %17904 = OpUDiv %v2uint %16647 %1870\n      %17007 = OpShiftLeftLogical %v2uint %17904 %2143\n       %6335 = OpBitwiseOr %v2uint %8391 %17007\n      %15340 = OpShiftRightLogical %v2uint %17088 %2143\n      %24218 = OpUDiv %v2uint %15340 %1870\n      %14056 = OpShiftLeftLogical %v2uint %24218 %2311\n      %24873 = OpBitwiseOr %v2uint %6335 %14056\n      %20084 = OpCompositeExtract %uint %24873 0\n      %23605 = OpCompositeExtract %uint %24873 1\n      %18266 = OpCompositeConstruct %v4uint %20064 %7158 %20084 %23605\n       %9683 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %17287\n               OpStore %9683 %18266\n      %14843 = OpIAdd %uint %12832 %uint_3\n      %11790 = OpULessThan %bool %14843 %6594\n               OpSelectionMerge %18022 DontFlatten\n               OpBranchConditional %11790 %20885 %18022\n      %20885 = OpLabel\n      %13201 = OpIMul %uint %uint_3 %22412\n      %13470 = OpIAdd %uint %22413 %13201\n      %17288 = OpShiftRightLogical %uint %13470 %int_4\n      %11864 = OpShiftRightLogical %v2uint %17333 %2311\n      %19382 = OpNot %v2uint %11864\n      %10365 = OpVectorShuffle %v4uint %19382 %19382 0 0 0 0\n      %25265 = OpShiftRightLogical %v4uint %10365 %77\n      %16805 = OpBitwiseAnd %v4uint %25265 %47\n      %15750 = OpIMul %v4uint %16805 %17319\n      %10533 = OpVectorShuffle %v4uint %11864 %11864 0 0 0 0\n      %15625 = OpShiftRightLogical %v4uint %10533 %77\n      %17736 = OpBitwiseAnd %v4uint %15625 %47\n      %24159 = OpIMul %v4uint %17736 %18250\n      %10391 = OpIAdd %v4uint %15750 %24159\n      %10284 = OpVectorShuffle %v2uint %10391 %10391 0 2\n       %9389 = OpBitwiseAnd %v2uint %10284 %2015\n      %17054 = OpUDiv %v2uint %9389 %1870\n      %25266 = OpShiftRightLogical %v2uint %10284 %2143\n      %15380 = OpUDiv %v2uint %25266 %1870\n      %14020 = OpShiftLeftLogical %v2uint %15380 %1975\n       %8392 = OpBitwiseOr %v2uint %17054 %14020\n      %17089 = OpVectorShuffle %v2uint %10391 %10391 1 3\n      %16648 = OpBitwiseAnd %v2uint %17089 %2015\n      %17905 = OpUDiv %v2uint %16648 %1870\n      %17008 = OpShiftLeftLogical %v2uint %17905 %2143\n       %6336 = OpBitwiseOr %v2uint %8392 %17008\n      %15341 = OpShiftRightLogical %v2uint %17089 %2143\n      %24219 = OpUDiv %v2uint %15341 %1870\n      %14057 = OpShiftLeftLogical %v2uint %24219 %2311\n      %24874 = OpBitwiseOr %v2uint %6336 %14057\n      %20065 = OpCompositeExtract %uint %24874 0\n       %7159 = OpCompositeExtract %uint %24874 1\n       %6746 = OpVectorShuffle %v4uint %19382 %19382 1 1 1 1\n      %10002 = OpShiftRightLogical %v4uint %6746 %77\n      %16806 = OpBitwiseAnd %v4uint %10002 %47\n      %15751 = OpIMul %v4uint %16806 %17320\n      %10534 = OpVectorShuffle %v4uint %11864 %11864 1 1 1 1\n      %15626 = OpShiftRightLogical %v4uint %10534 %77\n      %17737 = OpBitwiseAnd %v4uint %15626 %47\n      %24160 = OpIMul %v4uint %17737 %18251\n      %10392 = OpIAdd %v4uint %15751 %24160\n      %10285 = OpVectorShuffle %v2uint %10392 %10392 0 2\n       %9390 = OpBitwiseAnd %v2uint %10285 %2015\n      %17055 = OpUDiv %v2uint %9390 %1870\n      %25267 = OpShiftRightLogical %v2uint %10285 %2143\n      %15381 = OpUDiv %v2uint %25267 %1870\n      %14021 = OpShiftLeftLogical %v2uint %15381 %1975\n       %8393 = OpBitwiseOr %v2uint %17055 %14021\n      %17090 = OpVectorShuffle %v2uint %10392 %10392 1 3\n      %16649 = OpBitwiseAnd %v2uint %17090 %2015\n      %17906 = OpUDiv %v2uint %16649 %1870\n      %17009 = OpShiftLeftLogical %v2uint %17906 %2143\n       %6337 = OpBitwiseOr %v2uint %8393 %17009\n      %15342 = OpShiftRightLogical %v2uint %17090 %2143\n      %24220 = OpUDiv %v2uint %15342 %1870\n      %14058 = OpShiftLeftLogical %v2uint %24220 %2311\n      %24875 = OpBitwiseOr %v2uint %6337 %14058\n      %20085 = OpCompositeExtract %uint %24875 0\n      %23606 = OpCompositeExtract %uint %24875 1\n      %18267 = OpCompositeConstruct %v4uint %20065 %7159 %20085 %23606\n      %11980 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %17288\n               OpStore %11980 %18267\n               OpBranch %18022\n      %18022 = OpLabel\n               OpBranch %7207\n       %7207 = OpLabel\n               OpBranch %7208\n       %7208 = OpLabel\n               OpBranch %14903\n      %14903 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_ctx1_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x000062B4, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000017, 0x0000000B, 0x00000004, 0x00040017, 0x00000011,\n    0x0000000B, 0x00000002, 0x00040015, 0x0000000C, 0x00000020, 0x00000001,\n    0x00040017, 0x00000012, 0x0000000C, 0x00000002, 0x00040017, 0x00000016,\n    0x0000000C, 0x00000003, 0x00020014, 0x00000009, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A09, 0x55555555,\n    0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B,\n    0x00000A08, 0xAAAAAAAA, 0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000,\n    0x0004002B, 0x0000000B, 0x00000A10, 0x00000002, 0x0004002B, 0x0000000B,\n    0x00000A16, 0x00000004, 0x0004002B, 0x0000000B, 0x00000A1C, 0x00000006,\n    0x0007002C, 0x00000017, 0x0000004D, 0x00000A0A, 0x00000A10, 0x00000A16,\n    0x00000A1C, 0x0004002B, 0x0000000B, 0x00000A13, 0x00000003, 0x0004002B,\n    0x0000000B, 0x000001C1, 0x0000FFFF, 0x0004002B, 0x0000000B, 0x00000A3A,\n    0x00000010, 0x0004002B, 0x0000000B, 0x00000A22, 0x00000008, 0x0004002B,\n    0x0000000B, 0x00000A52, 0x00000018, 0x0004002B, 0x0000000B, 0x000008A6,\n    0x00FF00FF, 0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00, 0x0004002B,\n    0x0000000C, 0x00000A17, 0x00000004, 0x0004002B, 0x0000000C, 0x00000A1D,\n    0x00000006, 0x0004002B, 0x0000000C, 0x00000A2C, 0x0000000B, 0x0004002B,\n    0x0000000C, 0x00000A38, 0x0000000F, 0x0004002B, 0x0000000C, 0x00000A0E,\n    0x00000001, 0x0004002B, 0x0000000C, 0x00000A1A, 0x00000005, 0x0004002B,\n    0x0000000C, 0x00000A20, 0x00000007, 0x0004002B, 0x0000000C, 0x00000A23,\n    0x00000008, 0x0004002B, 0x0000000C, 0x00000A2F, 0x0000000C, 0x0004002B,\n    0x0000000C, 0x00000A14, 0x00000003, 0x0004002B, 0x0000000C, 0x00000A11,\n    0x00000002, 0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000, 0x000A001E,\n    0x00000489, 0x0000000B, 0x0000000B, 0x0000000B, 0x0000000B, 0x00000014,\n    0x0000000B, 0x0000000B, 0x0000000B, 0x00040020, 0x00000706, 0x00000009,\n    0x00000489, 0x0004003B, 0x00000706, 0x00000CE9, 0x00000009, 0x00040020,\n    0x00000288, 0x00000009, 0x0000000B, 0x00040020, 0x00000291, 0x00000009,\n    0x00000014, 0x00040020, 0x00000292, 0x00000001, 0x00000014, 0x0004003B,\n    0x00000292, 0x00000F48, 0x00000001, 0x0006002C, 0x00000014, 0x00000A24,\n    0x00000A10, 0x00000A0A, 0x00000A0A, 0x00040017, 0x0000000F, 0x00000009,\n    0x00000002, 0x0006002C, 0x00000014, 0x00000A3B, 0x00000A10, 0x00000A10,\n    0x00000A0A, 0x0003001D, 0x000007DC, 0x00000017, 0x0003001E, 0x000007B4,\n    0x000007DC, 0x00040020, 0x00000A31, 0x00000002, 0x000007B4, 0x0004003B,\n    0x00000A31, 0x0000107A, 0x00000002, 0x00040020, 0x00000294, 0x00000002,\n    0x00000017, 0x0004002B, 0x0000000B, 0x00000144, 0x000000FF, 0x0004002B,\n    0x0000000B, 0x000005A9, 0x00FF0000, 0x0003001D, 0x000007DD, 0x00000017,\n    0x0003001E, 0x000007B5, 0x000007DD, 0x00040020, 0x00000A32, 0x00000002,\n    0x000007B5, 0x0004003B, 0x00000A32, 0x0000140E, 0x00000002, 0x0004002B,\n    0x0000000B, 0x00000A6A, 0x00000020, 0x0006002C, 0x00000014, 0x00000BC3,\n    0x00000A16, 0x00000A6A, 0x00000A0D, 0x0007002C, 0x00000017, 0x000009CE,\n    0x000008A6, 0x000008A6, 0x000008A6, 0x000008A6, 0x0007002C, 0x00000017,\n    0x0000013D, 0x00000A22, 0x00000A22, 0x00000A22, 0x00000A22, 0x0007002C,\n    0x00000017, 0x0000072E, 0x000005FD, 0x000005FD, 0x000005FD, 0x000005FD,\n    0x0007002C, 0x00000017, 0x000002ED, 0x00000A3A, 0x00000A3A, 0x00000A3A,\n    0x00000A3A, 0x0005002C, 0x00000011, 0x000007B7, 0x00000A22, 0x00000A22,\n    0x0005002C, 0x00000011, 0x00000474, 0x00000144, 0x00000144, 0x0005002C,\n    0x00000011, 0x0000085F, 0x00000A3A, 0x00000A3A, 0x0005002C, 0x00000011,\n    0x00000907, 0x00000A52, 0x00000A52, 0x0005002C, 0x00000011, 0x00000BB1,\n    0x000005A9, 0x000005A9, 0x0007002C, 0x00000017, 0x00000B3E, 0x00000A09,\n    0x00000A09, 0x00000A09, 0x00000A09, 0x0007002C, 0x00000017, 0x00000B86,\n    0x00000A0D, 0x00000A0D, 0x00000A0D, 0x00000A0D, 0x0007002C, 0x00000017,\n    0x00000B2C, 0x00000A08, 0x00000A08, 0x00000A08, 0x00000A08, 0x0007002C,\n    0x00000017, 0x0000002F, 0x00000A13, 0x00000A13, 0x00000A13, 0x00000A13,\n    0x0005002C, 0x00000011, 0x000007DF, 0x000001C1, 0x000001C1, 0x0005002C,\n    0x00000011, 0x0000074E, 0x00000A13, 0x00000A13, 0x0003002E, 0x00000011,\n    0x000000C8, 0x00050036, 0x00000008, 0x0000161F, 0x00000000, 0x00000502,\n    0x000200F8, 0x00003B06, 0x000300F7, 0x00003A37, 0x00000000, 0x000300FB,\n    0x00000A0A, 0x00002E68, 0x000200F8, 0x00002E68, 0x00050041, 0x00000288,\n    0x000060D7, 0x00000CE9, 0x00000A0B, 0x0004003D, 0x0000000B, 0x00003526,\n    0x000060D7, 0x000500C7, 0x0000000B, 0x00005FDC, 0x00003526, 0x00000A0D,\n    0x000500AB, 0x00000009, 0x00004376, 0x00005FDC, 0x00000A0A, 0x000500C7,\n    0x0000000B, 0x00003028, 0x00003526, 0x00000A10, 0x000500AB, 0x00000009,\n    0x00004384, 0x00003028, 0x00000A0A, 0x000500C2, 0x0000000B, 0x00001EB0,\n    0x00003526, 0x00000A10, 0x000500C7, 0x0000000B, 0x000061E2, 0x00001EB0,\n    0x00000A13, 0x00050041, 0x00000288, 0x0000492C, 0x00000CE9, 0x00000A0E,\n    0x0004003D, 0x0000000B, 0x00005EAC, 0x0000492C, 0x00050041, 0x00000288,\n    0x00004EBA, 0x00000CE9, 0x00000A11, 0x0004003D, 0x0000000B, 0x00005788,\n    0x00004EBA, 0x00050041, 0x00000288, 0x00004EBB, 0x00000CE9, 0x00000A14,\n    0x0004003D, 0x0000000B, 0x00005789, 0x00004EBB, 0x00050041, 0x00000291,\n    0x00004EBC, 0x00000CE9, 0x00000A17, 0x0004003D, 0x00000014, 0x0000578A,\n    0x00004EBC, 0x00050041, 0x00000288, 0x00004EBD, 0x00000CE9, 0x00000A1A,\n    0x0004003D, 0x0000000B, 0x0000578B, 0x00004EBD, 0x00050041, 0x00000288,\n    0x00004EBE, 0x00000CE9, 0x00000A1D, 0x0004003D, 0x0000000B, 0x0000578C,\n    0x00004EBE, 0x00050041, 0x00000288, 0x00004E6E, 0x00000CE9, 0x00000A20,\n    0x0004003D, 0x0000000B, 0x000019C2, 0x00004E6E, 0x0004003D, 0x00000014,\n    0x00002A0E, 0x00000F48, 0x000500C4, 0x00000014, 0x0000538B, 0x00002A0E,\n    0x00000A24, 0x0007004F, 0x00000011, 0x000042F0, 0x0000538B, 0x0000538B,\n    0x00000000, 0x00000001, 0x0007004F, 0x00000011, 0x0000242F, 0x0000578A,\n    0x0000578A, 0x00000000, 0x00000001, 0x000500AE, 0x0000000F, 0x00004288,\n    0x000042F0, 0x0000242F, 0x0004009A, 0x00000009, 0x00006067, 0x00004288,\n    0x000300F7, 0x000036C2, 0x00000002, 0x000400FA, 0x00006067, 0x000055E8,\n    0x000036C2, 0x000200F8, 0x000055E8, 0x000200F9, 0x00003A37, 0x000200F8,\n    0x000036C2, 0x000500C4, 0x00000014, 0x000043C0, 0x0000538B, 0x00000A3B,\n    0x0004007C, 0x00000016, 0x00003C81, 0x000043C0, 0x00050051, 0x0000000C,\n    0x000047A0, 0x00003C81, 0x00000000, 0x00050084, 0x0000000C, 0x00002492,\n    0x000047A0, 0x00000A11, 0x00050051, 0x0000000C, 0x000018DA, 0x00003C81,\n    0x00000002, 0x0004007C, 0x0000000C, 0x000038A9, 0x000019C2, 0x00050084,\n    0x0000000C, 0x00002C0F, 0x000018DA, 0x000038A9, 0x00050051, 0x0000000C,\n    0x000044BE, 0x00003C81, 0x00000001, 0x00050080, 0x0000000C, 0x000056D4,\n    0x00002C0F, 0x000044BE, 0x0004007C, 0x0000000C, 0x00005785, 0x0000578C,\n    0x00050084, 0x0000000C, 0x00005FD7, 0x000056D4, 0x00005785, 0x00050080,\n    0x0000000C, 0x00002042, 0x00002492, 0x00005FD7, 0x0004007C, 0x0000000B,\n    0x000028A4, 0x00002042, 0x00050080, 0x0000000B, 0x000038F6, 0x0000578B,\n    0x000028A4, 0x000400A8, 0x00000009, 0x00003014, 0x00004376, 0x000300F7,\n    0x00003ABB, 0x00000002, 0x000400FA, 0x00003014, 0x000020B9, 0x00005768,\n    0x000200F8, 0x00005768, 0x000300F7, 0x00005BF0, 0x00000002, 0x000400FA,\n    0x00004384, 0x00005F21, 0x00005BE0, 0x000200F8, 0x00005BE0, 0x0004007C,\n    0x00000012, 0x00001F1C, 0x000042F0, 0x000500C2, 0x0000000B, 0x00005668,\n    0x00005788, 0x00000A1A, 0x00050051, 0x0000000C, 0x00003905, 0x00001F1C,\n    0x00000001, 0x000500C3, 0x0000000C, 0x00002F39, 0x00003905, 0x00000A1A,\n    0x0004007C, 0x0000000C, 0x00005780, 0x00005668, 0x00050084, 0x0000000C,\n    0x00001F02, 0x00002F39, 0x00005780, 0x00050051, 0x0000000C, 0x00006242,\n    0x00001F1C, 0x00000000, 0x000500C3, 0x0000000C, 0x00004FC7, 0x00006242,\n    0x00000A1A, 0x00050080, 0x0000000C, 0x000049B0, 0x00001F02, 0x00004FC7,\n    0x000500C4, 0x0000000C, 0x0000254A, 0x000049B0, 0x00000A1D, 0x000500C3,\n    0x0000000C, 0x0000603B, 0x00003905, 0x00000A0E, 0x000500C7, 0x0000000C,\n    0x0000539A, 0x0000603B, 0x00000A20, 0x000500C4, 0x0000000C, 0x0000534A,\n    0x0000539A, 0x00000A14, 0x000500C7, 0x0000000C, 0x00004EA5, 0x00006242,\n    0x00000A20, 0x000500C5, 0x0000000C, 0x00002B1A, 0x0000534A, 0x00004EA5,\n    0x000500C5, 0x0000000C, 0x000043B6, 0x0000254A, 0x00002B1A, 0x000500C4,\n    0x0000000C, 0x00005E63, 0x000043B6, 0x00000A13, 0x000500C3, 0x0000000C,\n    0x000031DE, 0x00003905, 0x00000A17, 0x000500C7, 0x0000000C, 0x00005447,\n    0x000031DE, 0x00000A0E, 0x000500C3, 0x0000000C, 0x000028A6, 0x00006242,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x0000511E, 0x000028A6, 0x00000A14,\n    0x000500C3, 0x0000000C, 0x000028B9, 0x00003905, 0x00000A14, 0x000500C7,\n    0x0000000C, 0x0000505E, 0x000028B9, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x0000541D, 0x0000505E, 0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BA,\n    0x0000511E, 0x0000541D, 0x000500C7, 0x0000000C, 0x00005076, 0x00003905,\n    0x00000A0E, 0x000500C4, 0x0000000C, 0x00005228, 0x00005076, 0x00000A17,\n    0x000500C4, 0x0000000C, 0x00001997, 0x000022BA, 0x00000A1D, 0x000500C5,\n    0x0000000C, 0x000047FE, 0x00005228, 0x00001997, 0x000500C4, 0x0000000C,\n    0x00001C00, 0x00005447, 0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C82,\n    0x000047FE, 0x00001C00, 0x000500C7, 0x0000000C, 0x000050AF, 0x00005E63,\n    0x00000A38, 0x000500C5, 0x0000000C, 0x00003C70, 0x00003C82, 0x000050AF,\n    0x000500C3, 0x0000000C, 0x00003745, 0x00005E63, 0x00000A17, 0x000500C7,\n    0x0000000C, 0x000018B8, 0x00003745, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x0000547E, 0x000018B8, 0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A8,\n    0x00003C70, 0x0000547E, 0x000500C3, 0x0000000C, 0x00003A6E, 0x00005E63,\n    0x00000A1A, 0x000500C7, 0x0000000C, 0x000018B9, 0x00003A6E, 0x00000A20,\n    0x000500C4, 0x0000000C, 0x0000547F, 0x000018B9, 0x00000A23, 0x000500C5,\n    0x0000000C, 0x0000456F, 0x000045A8, 0x0000547F, 0x000500C3, 0x0000000C,\n    0x00003C88, 0x00005E63, 0x00000A23, 0x000500C4, 0x0000000C, 0x00002824,\n    0x00003C88, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B79, 0x0000456F,\n    0x00002824, 0x0004007C, 0x0000000B, 0x000041E5, 0x00003B79, 0x000200F9,\n    0x00005BF0, 0x000200F8, 0x00005F21, 0x0004007C, 0x00000016, 0x0000623B,\n    0x0000538B, 0x000500C2, 0x0000000B, 0x00004C14, 0x00005788, 0x00000A1A,\n    0x000500C2, 0x0000000B, 0x0000497A, 0x00005789, 0x00000A17, 0x00050051,\n    0x0000000C, 0x00001A7E, 0x0000623B, 0x00000002, 0x000500C3, 0x0000000C,\n    0x00002F3A, 0x00001A7E, 0x00000A11, 0x0004007C, 0x0000000C, 0x00005781,\n    0x0000497A, 0x00050084, 0x0000000C, 0x00001F03, 0x00002F3A, 0x00005781,\n    0x00050051, 0x0000000C, 0x00006243, 0x0000623B, 0x00000001, 0x000500C3,\n    0x0000000C, 0x00004A6F, 0x00006243, 0x00000A17, 0x00050080, 0x0000000C,\n    0x00002B2C, 0x00001F03, 0x00004A6F, 0x0004007C, 0x0000000C, 0x00004202,\n    0x00004C14, 0x00050084, 0x0000000C, 0x00003A60, 0x00002B2C, 0x00004202,\n    0x00050051, 0x0000000C, 0x00006244, 0x0000623B, 0x00000000, 0x000500C3,\n    0x0000000C, 0x00004FC8, 0x00006244, 0x00000A1A, 0x00050080, 0x0000000C,\n    0x000049FC, 0x00003A60, 0x00004FC8, 0x000500C4, 0x0000000C, 0x0000225D,\n    0x000049FC, 0x00000A20, 0x000500C7, 0x0000000C, 0x00002CAA, 0x00001A7E,\n    0x00000A14, 0x000500C4, 0x0000000C, 0x00004CAE, 0x00002CAA, 0x00000A1A,\n    0x000500C3, 0x0000000C, 0x0000383E, 0x00006243, 0x00000A0E, 0x000500C7,\n    0x0000000C, 0x00005374, 0x0000383E, 0x00000A14, 0x000500C4, 0x0000000C,\n    0x000054CA, 0x00005374, 0x00000A14, 0x000500C5, 0x0000000C, 0x000042CE,\n    0x00004CAE, 0x000054CA, 0x000500C7, 0x0000000C, 0x000050D5, 0x00006244,\n    0x00000A20, 0x000500C5, 0x0000000C, 0x00003ADD, 0x000042CE, 0x000050D5,\n    0x000500C5, 0x0000000C, 0x000043B7, 0x0000225D, 0x00003ADD, 0x000500C4,\n    0x0000000C, 0x00005E50, 0x000043B7, 0x00000A13, 0x000500C3, 0x0000000C,\n    0x000032D7, 0x00006243, 0x00000A14, 0x000500C6, 0x0000000C, 0x000026C9,\n    0x000032D7, 0x00002F3A, 0x000500C7, 0x0000000C, 0x00004199, 0x000026C9,\n    0x00000A0E, 0x000500C3, 0x0000000C, 0x00002590, 0x00006244, 0x00000A14,\n    0x000500C7, 0x0000000C, 0x0000505F, 0x00002590, 0x00000A14, 0x000500C4,\n    0x0000000C, 0x0000541E, 0x00004199, 0x00000A0E, 0x000500C6, 0x0000000C,\n    0x000022BB, 0x0000505F, 0x0000541E, 0x000500C7, 0x0000000C, 0x00005077,\n    0x00006243, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005229, 0x00005077,\n    0x00000A17, 0x000500C4, 0x0000000C, 0x00001998, 0x000022BB, 0x00000A1D,\n    0x000500C5, 0x0000000C, 0x000047FF, 0x00005229, 0x00001998, 0x000500C4,\n    0x0000000C, 0x00001C01, 0x00004199, 0x00000A2C, 0x000500C5, 0x0000000C,\n    0x00003C83, 0x000047FF, 0x00001C01, 0x000500C7, 0x0000000C, 0x000050B0,\n    0x00005E50, 0x00000A38, 0x000500C5, 0x0000000C, 0x00003C71, 0x00003C83,\n    0x000050B0, 0x000500C3, 0x0000000C, 0x00003746, 0x00005E50, 0x00000A17,\n    0x000500C7, 0x0000000C, 0x000018BA, 0x00003746, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x00005480, 0x000018BA, 0x00000A1A, 0x000500C5, 0x0000000C,\n    0x000045A9, 0x00003C71, 0x00005480, 0x000500C3, 0x0000000C, 0x00003A6F,\n    0x00005E50, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018BB, 0x00003A6F,\n    0x00000A20, 0x000500C4, 0x0000000C, 0x00005481, 0x000018BB, 0x00000A23,\n    0x000500C5, 0x0000000C, 0x00004570, 0x000045A9, 0x00005481, 0x000500C3,\n    0x0000000C, 0x00003C89, 0x00005E50, 0x00000A23, 0x000500C4, 0x0000000C,\n    0x00002825, 0x00003C89, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B7A,\n    0x00004570, 0x00002825, 0x0004007C, 0x0000000B, 0x000041E6, 0x00003B7A,\n    0x000200F9, 0x00005BF0, 0x000200F8, 0x00005BF0, 0x000700F5, 0x0000000B,\n    0x0000292C, 0x000041E6, 0x00005F21, 0x000041E5, 0x00005BE0, 0x000200F9,\n    0x00003ABB, 0x000200F8, 0x000020B9, 0x00050051, 0x0000000B, 0x00004DAD,\n    0x0000538B, 0x00000000, 0x00050051, 0x0000000B, 0x00002BEE, 0x0000538B,\n    0x00000001, 0x00050051, 0x0000000B, 0x00004971, 0x0000538B, 0x00000002,\n    0x00050084, 0x0000000B, 0x000039EF, 0x00005789, 0x00004971, 0x00050080,\n    0x0000000B, 0x00004F62, 0x00002BEE, 0x000039EF, 0x00050084, 0x0000000B,\n    0x000054AC, 0x00005788, 0x00004F62, 0x00050080, 0x0000000B, 0x00004FAE,\n    0x00004DAD, 0x000054AC, 0x000500C4, 0x0000000B, 0x00002C67, 0x00004FAE,\n    0x00000A13, 0x000200F9, 0x00003ABB, 0x000200F8, 0x00003ABB, 0x000700F5,\n    0x0000000B, 0x00002C70, 0x00002C67, 0x000020B9, 0x0000292C, 0x00005BF0,\n    0x00050080, 0x0000000B, 0x000048BD, 0x00002C70, 0x00005EAC, 0x000500C2,\n    0x0000000B, 0x00003D52, 0x000048BD, 0x00000A17, 0x00060041, 0x00000294,\n    0x00004FAF, 0x0000107A, 0x00000A0B, 0x00003D52, 0x0004003D, 0x00000017,\n    0x00001CAA, 0x00004FAF, 0x000500AA, 0x00000009, 0x000035C0, 0x000061E2,\n    0x00000A0D, 0x000500AA, 0x00000009, 0x00005376, 0x000061E2, 0x00000A10,\n    0x000500A6, 0x00000009, 0x00005686, 0x000035C0, 0x00005376, 0x000300F7,\n    0x00003463, 0x00000000, 0x000400FA, 0x00005686, 0x00002957, 0x00003463,\n    0x000200F8, 0x00002957, 0x000500C7, 0x00000017, 0x0000475F, 0x00001CAA,\n    0x000009CE, 0x000500C4, 0x00000017, 0x000024D1, 0x0000475F, 0x0000013D,\n    0x000500C7, 0x00000017, 0x000050AC, 0x00001CAA, 0x0000072E, 0x000500C2,\n    0x00000017, 0x0000448D, 0x000050AC, 0x0000013D, 0x000500C5, 0x00000017,\n    0x00003FF8, 0x000024D1, 0x0000448D, 0x000200F9, 0x00003463, 0x000200F8,\n    0x00003463, 0x000700F5, 0x00000017, 0x00005879, 0x00001CAA, 0x00003ABB,\n    0x00003FF8, 0x00002957, 0x000500AA, 0x00000009, 0x00004CB6, 0x000061E2,\n    0x00000A13, 0x000500A6, 0x00000009, 0x00003B23, 0x00005376, 0x00004CB6,\n    0x000300F7, 0x00002DA2, 0x00000000, 0x000400FA, 0x00003B23, 0x00002B38,\n    0x00002DA2, 0x000200F8, 0x00002B38, 0x000500C4, 0x00000017, 0x00005E17,\n    0x00005879, 0x000002ED, 0x000500C2, 0x00000017, 0x00003BE7, 0x00005879,\n    0x000002ED, 0x000500C5, 0x00000017, 0x000029E8, 0x00005E17, 0x00003BE7,\n    0x000200F9, 0x00002DA2, 0x000200F8, 0x00002DA2, 0x000700F5, 0x00000017,\n    0x00004D8D, 0x00005879, 0x00003463, 0x000029E8, 0x00002B38, 0x0007004F,\n    0x00000011, 0x00005675, 0x00004D8D, 0x00004D8D, 0x00000000, 0x00000002,\n    0x000500C2, 0x00000011, 0x00003968, 0x00005675, 0x000007B7, 0x000500C7,\n    0x00000011, 0x00001D03, 0x00003968, 0x00000474, 0x000500C7, 0x00000011,\n    0x00004943, 0x00005675, 0x00000474, 0x000500C4, 0x00000011, 0x000058A2,\n    0x00004943, 0x0000085F, 0x000500C5, 0x00000011, 0x00003F71, 0x00001D03,\n    0x000058A2, 0x00050051, 0x0000000B, 0x000056E3, 0x00003F71, 0x00000000,\n    0x00050051, 0x0000000B, 0x00001917, 0x00003F71, 0x00000001, 0x000500C2,\n    0x00000011, 0x000029EE, 0x00005675, 0x00000907, 0x000500C7, 0x00000011,\n    0x00001C21, 0x00005675, 0x00000BB1, 0x000500C5, 0x00000011, 0x00003962,\n    0x000029EE, 0x00001C21, 0x00050051, 0x0000000B, 0x00004B31, 0x00003962,\n    0x00000000, 0x00050051, 0x0000000B, 0x00001C4F, 0x00003962, 0x00000001,\n    0x0009004F, 0x00000017, 0x00006138, 0x00004D8D, 0x000000C8, 0x00000001,\n    0x00000003, 0x00000001, 0x00000001, 0x000500C7, 0x00000017, 0x00002306,\n    0x00006138, 0x00000B3E, 0x000500C4, 0x00000017, 0x00005ECA, 0x00002306,\n    0x00000B86, 0x000500C7, 0x00000017, 0x000050AD, 0x00006138, 0x00000B2C,\n    0x000500C2, 0x00000017, 0x000040D7, 0x000050AD, 0x00000B86, 0x000500C5,\n    0x00000017, 0x00005DC0, 0x00005ECA, 0x000040D7, 0x000500C7, 0x00000017,\n    0x00004CA2, 0x00005DC0, 0x00000B2C, 0x000500C2, 0x00000017, 0x00004705,\n    0x00004CA2, 0x00000B86, 0x000500C6, 0x00000017, 0x00004458, 0x00005DC0,\n    0x00004705, 0x0007004F, 0x00000011, 0x000043B4, 0x00004458, 0x00004458,\n    0x00000000, 0x00000001, 0x000500C2, 0x0000000B, 0x0000267B, 0x000038F6,\n    0x00000A17, 0x000400C8, 0x00000011, 0x00004DF4, 0x000043B4, 0x0009004F,\n    0x00000017, 0x00002876, 0x00004DF4, 0x00004DF4, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x000500C2, 0x00000017, 0x00005ECE, 0x00002876,\n    0x0000004D, 0x000500C7, 0x00000017, 0x00001E2F, 0x00005ECE, 0x0000002F,\n    0x00070050, 0x00000017, 0x000043A5, 0x000056E3, 0x000056E3, 0x000056E3,\n    0x000056E3, 0x00050084, 0x00000017, 0x00005B33, 0x00001E2F, 0x000043A5,\n    0x0009004F, 0x00000017, 0x000037FD, 0x00004458, 0x000000C8, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x000500C2, 0x00000017, 0x00003923,\n    0x000037FD, 0x0000004D, 0x000500C7, 0x00000017, 0x00001E30, 0x00003923,\n    0x0000002F, 0x00070050, 0x00000017, 0x00004748, 0x00004B31, 0x00004B31,\n    0x00004B31, 0x00004B31, 0x00050084, 0x00000017, 0x0000318D, 0x00001E30,\n    0x00004748, 0x00050080, 0x00000017, 0x0000376F, 0x00005B33, 0x0000318D,\n    0x0007004F, 0x00000011, 0x0000281C, 0x0000376F, 0x0000376F, 0x00000000,\n    0x00000002, 0x000500C7, 0x00000011, 0x0000249F, 0x0000281C, 0x000007DF,\n    0x00050086, 0x00000011, 0x00004290, 0x0000249F, 0x0000074E, 0x000500C2,\n    0x00000011, 0x0000629E, 0x0000281C, 0x0000085F, 0x00050086, 0x00000011,\n    0x00003C06, 0x0000629E, 0x0000074E, 0x000500C4, 0x00000011, 0x000036B5,\n    0x00003C06, 0x000007B7, 0x000500C5, 0x00000011, 0x000020BA, 0x00004290,\n    0x000036B5, 0x0007004F, 0x00000011, 0x000042B3, 0x0000376F, 0x0000376F,\n    0x00000001, 0x00000003, 0x000500C7, 0x00000011, 0x000040FA, 0x000042B3,\n    0x000007DF, 0x00050086, 0x00000011, 0x000045E3, 0x000040FA, 0x0000074E,\n    0x000500C4, 0x00000011, 0x00004262, 0x000045E3, 0x0000085F, 0x000500C5,\n    0x00000011, 0x000018AE, 0x000020BA, 0x00004262, 0x000500C2, 0x00000011,\n    0x00003BDD, 0x000042B3, 0x0000085F, 0x00050086, 0x00000011, 0x00005E8D,\n    0x00003BDD, 0x0000074E, 0x000500C4, 0x00000011, 0x000036DB, 0x00005E8D,\n    0x00000907, 0x000500C5, 0x00000011, 0x0000611C, 0x000018AE, 0x000036DB,\n    0x00050051, 0x0000000B, 0x00004E5A, 0x0000611C, 0x00000000, 0x00050051,\n    0x0000000B, 0x00001BF0, 0x0000611C, 0x00000001, 0x0009004F, 0x00000017,\n    0x00001A53, 0x00004DF4, 0x00004DF4, 0x00000001, 0x00000001, 0x00000001,\n    0x00000001, 0x000500C2, 0x00000017, 0x00002331, 0x00001A53, 0x0000004D,\n    0x000500C7, 0x00000017, 0x00001E31, 0x00002331, 0x0000002F, 0x00070050,\n    0x00000017, 0x000043A6, 0x00001917, 0x00001917, 0x00001917, 0x00001917,\n    0x00050084, 0x00000017, 0x00005B34, 0x00001E31, 0x000043A6, 0x0009004F,\n    0x00000017, 0x000037FE, 0x00004458, 0x000000C8, 0x00000001, 0x00000001,\n    0x00000001, 0x00000001, 0x000500C2, 0x00000017, 0x00003924, 0x000037FE,\n    0x0000004D, 0x000500C7, 0x00000017, 0x00001E32, 0x00003924, 0x0000002F,\n    0x00070050, 0x00000017, 0x00004749, 0x00001C4F, 0x00001C4F, 0x00001C4F,\n    0x00001C4F, 0x00050084, 0x00000017, 0x0000318E, 0x00001E32, 0x00004749,\n    0x00050080, 0x00000017, 0x00003770, 0x00005B34, 0x0000318E, 0x0007004F,\n    0x00000011, 0x0000281D, 0x00003770, 0x00003770, 0x00000000, 0x00000002,\n    0x000500C7, 0x00000011, 0x000024A0, 0x0000281D, 0x000007DF, 0x00050086,\n    0x00000011, 0x00004291, 0x000024A0, 0x0000074E, 0x000500C2, 0x00000011,\n    0x0000629F, 0x0000281D, 0x0000085F, 0x00050086, 0x00000011, 0x00003C07,\n    0x0000629F, 0x0000074E, 0x000500C4, 0x00000011, 0x000036B6, 0x00003C07,\n    0x000007B7, 0x000500C5, 0x00000011, 0x000020BB, 0x00004291, 0x000036B6,\n    0x0007004F, 0x00000011, 0x000042B4, 0x00003770, 0x00003770, 0x00000001,\n    0x00000003, 0x000500C7, 0x00000011, 0x000040FB, 0x000042B4, 0x000007DF,\n    0x00050086, 0x00000011, 0x000045E4, 0x000040FB, 0x0000074E, 0x000500C4,\n    0x00000011, 0x00004263, 0x000045E4, 0x0000085F, 0x000500C5, 0x00000011,\n    0x000018AF, 0x000020BB, 0x00004263, 0x000500C2, 0x00000011, 0x00003BDE,\n    0x000042B4, 0x0000085F, 0x00050086, 0x00000011, 0x00005E8E, 0x00003BDE,\n    0x0000074E, 0x000500C4, 0x00000011, 0x000036DC, 0x00005E8E, 0x00000907,\n    0x000500C5, 0x00000011, 0x0000611D, 0x000018AF, 0x000036DC, 0x00050051,\n    0x0000000B, 0x00004E6D, 0x0000611D, 0x00000000, 0x00050051, 0x0000000B,\n    0x00005C2F, 0x0000611D, 0x00000001, 0x00070050, 0x00000017, 0x00004754,\n    0x00004E5A, 0x00001BF0, 0x00004E6D, 0x00005C2F, 0x00060041, 0x00000294,\n    0x00002253, 0x0000140E, 0x00000A0B, 0x0000267B, 0x0003003E, 0x00002253,\n    0x00004754, 0x00050051, 0x0000000B, 0x00003220, 0x000043C0, 0x00000001,\n    0x00050080, 0x0000000B, 0x00005AC0, 0x00003220, 0x00000A0D, 0x000500B0,\n    0x00000009, 0x00004411, 0x00005AC0, 0x000019C2, 0x000300F7, 0x00002358,\n    0x00000002, 0x000400FA, 0x00004411, 0x0000592C, 0x00002358, 0x000200F8,\n    0x0000592C, 0x00050080, 0x0000000B, 0x00003C79, 0x000038F6, 0x0000578C,\n    0x000500C2, 0x0000000B, 0x000037CC, 0x00003C79, 0x00000A17, 0x000500C2,\n    0x00000011, 0x00002E53, 0x000043B4, 0x000007B7, 0x000400C8, 0x00000011,\n    0x00004BB1, 0x00002E53, 0x0009004F, 0x00000017, 0x00002877, 0x00004BB1,\n    0x00004BB1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000500C2,\n    0x00000017, 0x000062AA, 0x00002877, 0x0000004D, 0x000500C7, 0x00000017,\n    0x0000419B, 0x000062AA, 0x0000002F, 0x00050084, 0x00000017, 0x00003D7C,\n    0x0000419B, 0x000043A5, 0x0009004F, 0x00000017, 0x0000291B, 0x00002E53,\n    0x00002E53, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000500C2,\n    0x00000017, 0x00003CFF, 0x0000291B, 0x0000004D, 0x000500C7, 0x00000017,\n    0x0000453E, 0x00003CFF, 0x0000002F, 0x00050084, 0x00000017, 0x00005E55,\n    0x0000453E, 0x00004748, 0x00050080, 0x00000017, 0x0000288D, 0x00003D7C,\n    0x00005E55, 0x0007004F, 0x00000011, 0x0000281E, 0x0000288D, 0x0000288D,\n    0x00000000, 0x00000002, 0x000500C7, 0x00000011, 0x000024A1, 0x0000281E,\n    0x000007DF, 0x00050086, 0x00000011, 0x00004292, 0x000024A1, 0x0000074E,\n    0x000500C2, 0x00000011, 0x000062A0, 0x0000281E, 0x0000085F, 0x00050086,\n    0x00000011, 0x00003C08, 0x000062A0, 0x0000074E, 0x000500C4, 0x00000011,\n    0x000036B7, 0x00003C08, 0x000007B7, 0x000500C5, 0x00000011, 0x000020BC,\n    0x00004292, 0x000036B7, 0x0007004F, 0x00000011, 0x000042B5, 0x0000288D,\n    0x0000288D, 0x00000001, 0x00000003, 0x000500C7, 0x00000011, 0x000040FC,\n    0x000042B5, 0x000007DF, 0x00050086, 0x00000011, 0x000045E5, 0x000040FC,\n    0x0000074E, 0x000500C4, 0x00000011, 0x00004264, 0x000045E5, 0x0000085F,\n    0x000500C5, 0x00000011, 0x000018B0, 0x000020BC, 0x00004264, 0x000500C2,\n    0x00000011, 0x00003BDF, 0x000042B5, 0x0000085F, 0x00050086, 0x00000011,\n    0x00005E8F, 0x00003BDF, 0x0000074E, 0x000500C4, 0x00000011, 0x000036DD,\n    0x00005E8F, 0x00000907, 0x000500C5, 0x00000011, 0x0000611E, 0x000018B0,\n    0x000036DD, 0x00050051, 0x0000000B, 0x00004E5B, 0x0000611E, 0x00000000,\n    0x00050051, 0x0000000B, 0x00001BF1, 0x0000611E, 0x00000001, 0x0009004F,\n    0x00000017, 0x00001A54, 0x00004BB1, 0x00004BB1, 0x00000001, 0x00000001,\n    0x00000001, 0x00000001, 0x000500C2, 0x00000017, 0x0000270D, 0x00001A54,\n    0x0000004D, 0x000500C7, 0x00000017, 0x0000419C, 0x0000270D, 0x0000002F,\n    0x00050084, 0x00000017, 0x00003D7D, 0x0000419C, 0x000043A6, 0x0009004F,\n    0x00000017, 0x0000291C, 0x00002E53, 0x00002E53, 0x00000001, 0x00000001,\n    0x00000001, 0x00000001, 0x000500C2, 0x00000017, 0x00003D00, 0x0000291C,\n    0x0000004D, 0x000500C7, 0x00000017, 0x0000453F, 0x00003D00, 0x0000002F,\n    0x00050084, 0x00000017, 0x00005E56, 0x0000453F, 0x00004749, 0x00050080,\n    0x00000017, 0x0000288E, 0x00003D7D, 0x00005E56, 0x0007004F, 0x00000011,\n    0x0000281F, 0x0000288E, 0x0000288E, 0x00000000, 0x00000002, 0x000500C7,\n    0x00000011, 0x000024A2, 0x0000281F, 0x000007DF, 0x00050086, 0x00000011,\n    0x00004293, 0x000024A2, 0x0000074E, 0x000500C2, 0x00000011, 0x000062A1,\n    0x0000281F, 0x0000085F, 0x00050086, 0x00000011, 0x00003C09, 0x000062A1,\n    0x0000074E, 0x000500C4, 0x00000011, 0x000036B8, 0x00003C09, 0x000007B7,\n    0x000500C5, 0x00000011, 0x000020BD, 0x00004293, 0x000036B8, 0x0007004F,\n    0x00000011, 0x000042B6, 0x0000288E, 0x0000288E, 0x00000001, 0x00000003,\n    0x000500C7, 0x00000011, 0x000040FD, 0x000042B6, 0x000007DF, 0x00050086,\n    0x00000011, 0x000045E6, 0x000040FD, 0x0000074E, 0x000500C4, 0x00000011,\n    0x00004265, 0x000045E6, 0x0000085F, 0x000500C5, 0x00000011, 0x000018B1,\n    0x000020BD, 0x00004265, 0x000500C2, 0x00000011, 0x00003BE0, 0x000042B6,\n    0x0000085F, 0x00050086, 0x00000011, 0x00005E90, 0x00003BE0, 0x0000074E,\n    0x000500C4, 0x00000011, 0x000036DE, 0x00005E90, 0x00000907, 0x000500C5,\n    0x00000011, 0x0000611F, 0x000018B1, 0x000036DE, 0x00050051, 0x0000000B,\n    0x00004E6F, 0x0000611F, 0x00000000, 0x00050051, 0x0000000B, 0x00005C30,\n    0x0000611F, 0x00000001, 0x00070050, 0x00000017, 0x00004755, 0x00004E5B,\n    0x00001BF1, 0x00004E6F, 0x00005C30, 0x00060041, 0x00000294, 0x000025D0,\n    0x0000140E, 0x00000A0B, 0x000037CC, 0x0003003E, 0x000025D0, 0x00004755,\n    0x00050080, 0x0000000B, 0x000039F8, 0x00003220, 0x00000A10, 0x000500B0,\n    0x00000009, 0x00002E0B, 0x000039F8, 0x000019C2, 0x000300F7, 0x00001C25,\n    0x00000002, 0x000400FA, 0x00002E0B, 0x00005192, 0x00001C25, 0x000200F8,\n    0x00005192, 0x00050084, 0x0000000B, 0x0000338E, 0x00000A10, 0x0000578C,\n    0x00050080, 0x0000000B, 0x0000349B, 0x000038F6, 0x0000338E, 0x000500C2,\n    0x0000000B, 0x00004385, 0x0000349B, 0x00000A17, 0x000500C2, 0x00000011,\n    0x00002E54, 0x000043B4, 0x0000085F, 0x000400C8, 0x00000011, 0x00004BB2,\n    0x00002E54, 0x0009004F, 0x00000017, 0x00002878, 0x00004BB2, 0x00004BB2,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000500C2, 0x00000017,\n    0x000062AB, 0x00002878, 0x0000004D, 0x000500C7, 0x00000017, 0x0000419D,\n    0x000062AB, 0x0000002F, 0x00050084, 0x00000017, 0x00003D7E, 0x0000419D,\n    0x000043A5, 0x0009004F, 0x00000017, 0x0000291D, 0x00002E54, 0x00002E54,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000500C2, 0x00000017,\n    0x00003D01, 0x0000291D, 0x0000004D, 0x000500C7, 0x00000017, 0x00004540,\n    0x00003D01, 0x0000002F, 0x00050084, 0x00000017, 0x00005E57, 0x00004540,\n    0x00004748, 0x00050080, 0x00000017, 0x0000288F, 0x00003D7E, 0x00005E57,\n    0x0007004F, 0x00000011, 0x00002820, 0x0000288F, 0x0000288F, 0x00000000,\n    0x00000002, 0x000500C7, 0x00000011, 0x000024A3, 0x00002820, 0x000007DF,\n    0x00050086, 0x00000011, 0x00004294, 0x000024A3, 0x0000074E, 0x000500C2,\n    0x00000011, 0x000062A2, 0x00002820, 0x0000085F, 0x00050086, 0x00000011,\n    0x00003C0A, 0x000062A2, 0x0000074E, 0x000500C4, 0x00000011, 0x000036B9,\n    0x00003C0A, 0x000007B7, 0x000500C5, 0x00000011, 0x000020BE, 0x00004294,\n    0x000036B9, 0x0007004F, 0x00000011, 0x000042B7, 0x0000288F, 0x0000288F,\n    0x00000001, 0x00000003, 0x000500C7, 0x00000011, 0x000040FE, 0x000042B7,\n    0x000007DF, 0x00050086, 0x00000011, 0x000045E7, 0x000040FE, 0x0000074E,\n    0x000500C4, 0x00000011, 0x00004266, 0x000045E7, 0x0000085F, 0x000500C5,\n    0x00000011, 0x000018B2, 0x000020BE, 0x00004266, 0x000500C2, 0x00000011,\n    0x00003BE1, 0x000042B7, 0x0000085F, 0x00050086, 0x00000011, 0x00005E91,\n    0x00003BE1, 0x0000074E, 0x000500C4, 0x00000011, 0x000036DF, 0x00005E91,\n    0x00000907, 0x000500C5, 0x00000011, 0x00006120, 0x000018B2, 0x000036DF,\n    0x00050051, 0x0000000B, 0x00004E5C, 0x00006120, 0x00000000, 0x00050051,\n    0x0000000B, 0x00001BF2, 0x00006120, 0x00000001, 0x0009004F, 0x00000017,\n    0x00001A55, 0x00004BB2, 0x00004BB2, 0x00000001, 0x00000001, 0x00000001,\n    0x00000001, 0x000500C2, 0x00000017, 0x0000270E, 0x00001A55, 0x0000004D,\n    0x000500C7, 0x00000017, 0x0000419E, 0x0000270E, 0x0000002F, 0x00050084,\n    0x00000017, 0x00003D7F, 0x0000419E, 0x000043A6, 0x0009004F, 0x00000017,\n    0x0000291E, 0x00002E54, 0x00002E54, 0x00000001, 0x00000001, 0x00000001,\n    0x00000001, 0x000500C2, 0x00000017, 0x00003D02, 0x0000291E, 0x0000004D,\n    0x000500C7, 0x00000017, 0x00004541, 0x00003D02, 0x0000002F, 0x00050084,\n    0x00000017, 0x00005E58, 0x00004541, 0x00004749, 0x00050080, 0x00000017,\n    0x00002890, 0x00003D7F, 0x00005E58, 0x0007004F, 0x00000011, 0x00002821,\n    0x00002890, 0x00002890, 0x00000000, 0x00000002, 0x000500C7, 0x00000011,\n    0x000024A4, 0x00002821, 0x000007DF, 0x00050086, 0x00000011, 0x00004295,\n    0x000024A4, 0x0000074E, 0x000500C2, 0x00000011, 0x000062A3, 0x00002821,\n    0x0000085F, 0x00050086, 0x00000011, 0x00003C0B, 0x000062A3, 0x0000074E,\n    0x000500C4, 0x00000011, 0x000036BA, 0x00003C0B, 0x000007B7, 0x000500C5,\n    0x00000011, 0x000020BF, 0x00004295, 0x000036BA, 0x0007004F, 0x00000011,\n    0x000042B8, 0x00002890, 0x00002890, 0x00000001, 0x00000003, 0x000500C7,\n    0x00000011, 0x000040FF, 0x000042B8, 0x000007DF, 0x00050086, 0x00000011,\n    0x000045E8, 0x000040FF, 0x0000074E, 0x000500C4, 0x00000011, 0x00004267,\n    0x000045E8, 0x0000085F, 0x000500C5, 0x00000011, 0x000018B3, 0x000020BF,\n    0x00004267, 0x000500C2, 0x00000011, 0x00003BE2, 0x000042B8, 0x0000085F,\n    0x00050086, 0x00000011, 0x00005E92, 0x00003BE2, 0x0000074E, 0x000500C4,\n    0x00000011, 0x000036E0, 0x00005E92, 0x00000907, 0x000500C5, 0x00000011,\n    0x00006121, 0x000018B3, 0x000036E0, 0x00050051, 0x0000000B, 0x00004E70,\n    0x00006121, 0x00000000, 0x00050051, 0x0000000B, 0x00005C31, 0x00006121,\n    0x00000001, 0x00070050, 0x00000017, 0x00004756, 0x00004E5C, 0x00001BF2,\n    0x00004E70, 0x00005C31, 0x00060041, 0x00000294, 0x000025D1, 0x0000140E,\n    0x00000A0B, 0x00004385, 0x0003003E, 0x000025D1, 0x00004756, 0x00050080,\n    0x0000000B, 0x000039F9, 0x00003220, 0x00000A13, 0x000500B0, 0x00000009,\n    0x00002E0C, 0x000039F9, 0x000019C2, 0x000300F7, 0x00004665, 0x00000002,\n    0x000400FA, 0x00002E0C, 0x00005193, 0x00004665, 0x000200F8, 0x00005193,\n    0x00050084, 0x0000000B, 0x0000338F, 0x00000A13, 0x0000578C, 0x00050080,\n    0x0000000B, 0x0000349C, 0x000038F6, 0x0000338F, 0x000500C2, 0x0000000B,\n    0x00004386, 0x0000349C, 0x00000A17, 0x000500C2, 0x00000011, 0x00002E55,\n    0x000043B4, 0x00000907, 0x000400C8, 0x00000011, 0x00004BB3, 0x00002E55,\n    0x0009004F, 0x00000017, 0x00002879, 0x00004BB3, 0x00004BB3, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x000500C2, 0x00000017, 0x000062AC,\n    0x00002879, 0x0000004D, 0x000500C7, 0x00000017, 0x0000419F, 0x000062AC,\n    0x0000002F, 0x00050084, 0x00000017, 0x00003D80, 0x0000419F, 0x000043A5,\n    0x0009004F, 0x00000017, 0x0000291F, 0x00002E55, 0x00002E55, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x000500C2, 0x00000017, 0x00003D03,\n    0x0000291F, 0x0000004D, 0x000500C7, 0x00000017, 0x00004542, 0x00003D03,\n    0x0000002F, 0x00050084, 0x00000017, 0x00005E59, 0x00004542, 0x00004748,\n    0x00050080, 0x00000017, 0x00002891, 0x00003D80, 0x00005E59, 0x0007004F,\n    0x00000011, 0x00002822, 0x00002891, 0x00002891, 0x00000000, 0x00000002,\n    0x000500C7, 0x00000011, 0x000024A5, 0x00002822, 0x000007DF, 0x00050086,\n    0x00000011, 0x00004296, 0x000024A5, 0x0000074E, 0x000500C2, 0x00000011,\n    0x000062A4, 0x00002822, 0x0000085F, 0x00050086, 0x00000011, 0x00003C0C,\n    0x000062A4, 0x0000074E, 0x000500C4, 0x00000011, 0x000036BB, 0x00003C0C,\n    0x000007B7, 0x000500C5, 0x00000011, 0x000020C0, 0x00004296, 0x000036BB,\n    0x0007004F, 0x00000011, 0x000042B9, 0x00002891, 0x00002891, 0x00000001,\n    0x00000003, 0x000500C7, 0x00000011, 0x00004100, 0x000042B9, 0x000007DF,\n    0x00050086, 0x00000011, 0x000045E9, 0x00004100, 0x0000074E, 0x000500C4,\n    0x00000011, 0x00004268, 0x000045E9, 0x0000085F, 0x000500C5, 0x00000011,\n    0x000018B4, 0x000020C0, 0x00004268, 0x000500C2, 0x00000011, 0x00003BE3,\n    0x000042B9, 0x0000085F, 0x00050086, 0x00000011, 0x00005E93, 0x00003BE3,\n    0x0000074E, 0x000500C4, 0x00000011, 0x000036E1, 0x00005E93, 0x00000907,\n    0x000500C5, 0x00000011, 0x00006122, 0x000018B4, 0x000036E1, 0x00050051,\n    0x0000000B, 0x00004E5D, 0x00006122, 0x00000000, 0x00050051, 0x0000000B,\n    0x00001BF3, 0x00006122, 0x00000001, 0x0009004F, 0x00000017, 0x00001A56,\n    0x00004BB3, 0x00004BB3, 0x00000001, 0x00000001, 0x00000001, 0x00000001,\n    0x000500C2, 0x00000017, 0x0000270F, 0x00001A56, 0x0000004D, 0x000500C7,\n    0x00000017, 0x000041A0, 0x0000270F, 0x0000002F, 0x00050084, 0x00000017,\n    0x00003D81, 0x000041A0, 0x000043A6, 0x0009004F, 0x00000017, 0x00002920,\n    0x00002E55, 0x00002E55, 0x00000001, 0x00000001, 0x00000001, 0x00000001,\n    0x000500C2, 0x00000017, 0x00003D04, 0x00002920, 0x0000004D, 0x000500C7,\n    0x00000017, 0x00004543, 0x00003D04, 0x0000002F, 0x00050084, 0x00000017,\n    0x00005E5A, 0x00004543, 0x00004749, 0x00050080, 0x00000017, 0x00002892,\n    0x00003D81, 0x00005E5A, 0x0007004F, 0x00000011, 0x00002823, 0x00002892,\n    0x00002892, 0x00000000, 0x00000002, 0x000500C7, 0x00000011, 0x000024A6,\n    0x00002823, 0x000007DF, 0x00050086, 0x00000011, 0x00004297, 0x000024A6,\n    0x0000074E, 0x000500C2, 0x00000011, 0x000062A5, 0x00002823, 0x0000085F,\n    0x00050086, 0x00000011, 0x00003C0D, 0x000062A5, 0x0000074E, 0x000500C4,\n    0x00000011, 0x000036BC, 0x00003C0D, 0x000007B7, 0x000500C5, 0x00000011,\n    0x000020C1, 0x00004297, 0x000036BC, 0x0007004F, 0x00000011, 0x000042BA,\n    0x00002892, 0x00002892, 0x00000001, 0x00000003, 0x000500C7, 0x00000011,\n    0x00004101, 0x000042BA, 0x000007DF, 0x00050086, 0x00000011, 0x000045EA,\n    0x00004101, 0x0000074E, 0x000500C4, 0x00000011, 0x00004269, 0x000045EA,\n    0x0000085F, 0x000500C5, 0x00000011, 0x000018B5, 0x000020C1, 0x00004269,\n    0x000500C2, 0x00000011, 0x00003BE4, 0x000042BA, 0x0000085F, 0x00050086,\n    0x00000011, 0x00005E94, 0x00003BE4, 0x0000074E, 0x000500C4, 0x00000011,\n    0x000036E2, 0x00005E94, 0x00000907, 0x000500C5, 0x00000011, 0x00006123,\n    0x000018B5, 0x000036E2, 0x00050051, 0x0000000B, 0x00004E71, 0x00006123,\n    0x00000000, 0x00050051, 0x0000000B, 0x00005C32, 0x00006123, 0x00000001,\n    0x00070050, 0x00000017, 0x00004757, 0x00004E5D, 0x00001BF3, 0x00004E71,\n    0x00005C32, 0x00060041, 0x00000294, 0x00002ECB, 0x0000140E, 0x00000A0B,\n    0x00004386, 0x0003003E, 0x00002ECB, 0x00004757, 0x000200F9, 0x00004665,\n    0x000200F8, 0x00004665, 0x000200F9, 0x00001C25, 0x000200F8, 0x00001C25,\n    0x000200F9, 0x00002358, 0x000200F8, 0x00002358, 0x00050080, 0x0000000B,\n    0x0000578D, 0x000038F6, 0x00000A3A, 0x000300F7, 0x00006070, 0x00000002,\n    0x000400FA, 0x00004376, 0x00001C26, 0x000055E9, 0x000200F8, 0x000055E9,\n    0x000200F9, 0x00006070, 0x000200F8, 0x00001C26, 0x000200F9, 0x00006070,\n    0x000200F8, 0x00006070, 0x000700F5, 0x0000000B, 0x00002C71, 0x00000A6A,\n    0x00001C26, 0x00000A3A, 0x000055E9, 0x00050080, 0x0000000B, 0x000048BE,\n    0x000048BD, 0x00002C71, 0x000500C2, 0x0000000B, 0x00003D53, 0x000048BE,\n    0x00000A17, 0x00060041, 0x00000294, 0x00005566, 0x0000107A, 0x00000A0B,\n    0x00003D53, 0x0004003D, 0x00000017, 0x00003910, 0x00005566, 0x000300F7,\n    0x00003A1A, 0x00000000, 0x000400FA, 0x00005686, 0x00002958, 0x00003A1A,\n    0x000200F8, 0x00002958, 0x000500C7, 0x00000017, 0x00004760, 0x00003910,\n    0x000009CE, 0x000500C4, 0x00000017, 0x000024D2, 0x00004760, 0x0000013D,\n    0x000500C7, 0x00000017, 0x000050AE, 0x00003910, 0x0000072E, 0x000500C2,\n    0x00000017, 0x0000448E, 0x000050AE, 0x0000013D, 0x000500C5, 0x00000017,\n    0x00003FF9, 0x000024D2, 0x0000448E, 0x000200F9, 0x00003A1A, 0x000200F8,\n    0x00003A1A, 0x000700F5, 0x00000017, 0x00002AAC, 0x00003910, 0x00006070,\n    0x00003FF9, 0x00002958, 0x000300F7, 0x00002DA3, 0x00000000, 0x000400FA,\n    0x00003B23, 0x00002B39, 0x00002DA3, 0x000200F8, 0x00002B39, 0x000500C4,\n    0x00000017, 0x00005E18, 0x00002AAC, 0x000002ED, 0x000500C2, 0x00000017,\n    0x00003BE8, 0x00002AAC, 0x000002ED, 0x000500C5, 0x00000017, 0x000029E9,\n    0x00005E18, 0x00003BE8, 0x000200F9, 0x00002DA3, 0x000200F8, 0x00002DA3,\n    0x000700F5, 0x00000017, 0x00004D8E, 0x00002AAC, 0x00003A1A, 0x000029E9,\n    0x00002B39, 0x0007004F, 0x00000011, 0x00005676, 0x00004D8E, 0x00004D8E,\n    0x00000000, 0x00000002, 0x000500C2, 0x00000011, 0x00003969, 0x00005676,\n    0x000007B7, 0x000500C7, 0x00000011, 0x00001D04, 0x00003969, 0x00000474,\n    0x000500C7, 0x00000011, 0x00004944, 0x00005676, 0x00000474, 0x000500C4,\n    0x00000011, 0x000058A3, 0x00004944, 0x0000085F, 0x000500C5, 0x00000011,\n    0x00003F72, 0x00001D04, 0x000058A3, 0x00050051, 0x0000000B, 0x000056E4,\n    0x00003F72, 0x00000000, 0x00050051, 0x0000000B, 0x00001918, 0x00003F72,\n    0x00000001, 0x000500C2, 0x00000011, 0x000029EF, 0x00005676, 0x00000907,\n    0x000500C7, 0x00000011, 0x00001C22, 0x00005676, 0x00000BB1, 0x000500C5,\n    0x00000011, 0x00003963, 0x000029EF, 0x00001C22, 0x00050051, 0x0000000B,\n    0x00004B32, 0x00003963, 0x00000000, 0x00050051, 0x0000000B, 0x00001C50,\n    0x00003963, 0x00000001, 0x0009004F, 0x00000017, 0x00006139, 0x00004D8E,\n    0x000000C8, 0x00000001, 0x00000003, 0x00000001, 0x00000001, 0x000500C7,\n    0x00000017, 0x00002307, 0x00006139, 0x00000B3E, 0x000500C4, 0x00000017,\n    0x00005ECB, 0x00002307, 0x00000B86, 0x000500C7, 0x00000017, 0x000050B1,\n    0x00006139, 0x00000B2C, 0x000500C2, 0x00000017, 0x000040D8, 0x000050B1,\n    0x00000B86, 0x000500C5, 0x00000017, 0x00005DC1, 0x00005ECB, 0x000040D8,\n    0x000500C7, 0x00000017, 0x00004CA3, 0x00005DC1, 0x00000B2C, 0x000500C2,\n    0x00000017, 0x00004706, 0x00004CA3, 0x00000B86, 0x000500C6, 0x00000017,\n    0x00004459, 0x00005DC1, 0x00004706, 0x0007004F, 0x00000011, 0x000043B5,\n    0x00004459, 0x00004459, 0x00000000, 0x00000001, 0x000500C2, 0x0000000B,\n    0x0000267C, 0x0000578D, 0x00000A17, 0x000400C8, 0x00000011, 0x00004DF5,\n    0x000043B5, 0x0009004F, 0x00000017, 0x0000287A, 0x00004DF5, 0x00004DF5,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000500C2, 0x00000017,\n    0x00005ECF, 0x0000287A, 0x0000004D, 0x000500C7, 0x00000017, 0x00001E33,\n    0x00005ECF, 0x0000002F, 0x00070050, 0x00000017, 0x000043A7, 0x000056E4,\n    0x000056E4, 0x000056E4, 0x000056E4, 0x00050084, 0x00000017, 0x00005B35,\n    0x00001E33, 0x000043A7, 0x0009004F, 0x00000017, 0x000037FF, 0x00004459,\n    0x000000C8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000500C2,\n    0x00000017, 0x00003925, 0x000037FF, 0x0000004D, 0x000500C7, 0x00000017,\n    0x00001E34, 0x00003925, 0x0000002F, 0x00070050, 0x00000017, 0x0000474A,\n    0x00004B32, 0x00004B32, 0x00004B32, 0x00004B32, 0x00050084, 0x00000017,\n    0x0000318F, 0x00001E34, 0x0000474A, 0x00050080, 0x00000017, 0x00003771,\n    0x00005B35, 0x0000318F, 0x0007004F, 0x00000011, 0x00002826, 0x00003771,\n    0x00003771, 0x00000000, 0x00000002, 0x000500C7, 0x00000011, 0x000024A7,\n    0x00002826, 0x000007DF, 0x00050086, 0x00000011, 0x00004298, 0x000024A7,\n    0x0000074E, 0x000500C2, 0x00000011, 0x000062A6, 0x00002826, 0x0000085F,\n    0x00050086, 0x00000011, 0x00003C0E, 0x000062A6, 0x0000074E, 0x000500C4,\n    0x00000011, 0x000036BD, 0x00003C0E, 0x000007B7, 0x000500C5, 0x00000011,\n    0x000020C2, 0x00004298, 0x000036BD, 0x0007004F, 0x00000011, 0x000042BB,\n    0x00003771, 0x00003771, 0x00000001, 0x00000003, 0x000500C7, 0x00000011,\n    0x00004102, 0x000042BB, 0x000007DF, 0x00050086, 0x00000011, 0x000045EB,\n    0x00004102, 0x0000074E, 0x000500C4, 0x00000011, 0x0000426A, 0x000045EB,\n    0x0000085F, 0x000500C5, 0x00000011, 0x000018B6, 0x000020C2, 0x0000426A,\n    0x000500C2, 0x00000011, 0x00003BE5, 0x000042BB, 0x0000085F, 0x00050086,\n    0x00000011, 0x00005E95, 0x00003BE5, 0x0000074E, 0x000500C4, 0x00000011,\n    0x000036E3, 0x00005E95, 0x00000907, 0x000500C5, 0x00000011, 0x00006124,\n    0x000018B6, 0x000036E3, 0x00050051, 0x0000000B, 0x00004E5E, 0x00006124,\n    0x00000000, 0x00050051, 0x0000000B, 0x00001BF4, 0x00006124, 0x00000001,\n    0x0009004F, 0x00000017, 0x00001A57, 0x00004DF5, 0x00004DF5, 0x00000001,\n    0x00000001, 0x00000001, 0x00000001, 0x000500C2, 0x00000017, 0x00002332,\n    0x00001A57, 0x0000004D, 0x000500C7, 0x00000017, 0x00001E35, 0x00002332,\n    0x0000002F, 0x00070050, 0x00000017, 0x000043A8, 0x00001918, 0x00001918,\n    0x00001918, 0x00001918, 0x00050084, 0x00000017, 0x00005B36, 0x00001E35,\n    0x000043A8, 0x0009004F, 0x00000017, 0x00003800, 0x00004459, 0x000000C8,\n    0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x000500C2, 0x00000017,\n    0x00003926, 0x00003800, 0x0000004D, 0x000500C7, 0x00000017, 0x00001E36,\n    0x00003926, 0x0000002F, 0x00070050, 0x00000017, 0x0000474B, 0x00001C50,\n    0x00001C50, 0x00001C50, 0x00001C50, 0x00050084, 0x00000017, 0x00003190,\n    0x00001E36, 0x0000474B, 0x00050080, 0x00000017, 0x00003772, 0x00005B36,\n    0x00003190, 0x0007004F, 0x00000011, 0x00002827, 0x00003772, 0x00003772,\n    0x00000000, 0x00000002, 0x000500C7, 0x00000011, 0x000024A8, 0x00002827,\n    0x000007DF, 0x00050086, 0x00000011, 0x00004299, 0x000024A8, 0x0000074E,\n    0x000500C2, 0x00000011, 0x000062A7, 0x00002827, 0x0000085F, 0x00050086,\n    0x00000011, 0x00003C0F, 0x000062A7, 0x0000074E, 0x000500C4, 0x00000011,\n    0x000036BE, 0x00003C0F, 0x000007B7, 0x000500C5, 0x00000011, 0x000020C3,\n    0x00004299, 0x000036BE, 0x0007004F, 0x00000011, 0x000042BC, 0x00003772,\n    0x00003772, 0x00000001, 0x00000003, 0x000500C7, 0x00000011, 0x00004103,\n    0x000042BC, 0x000007DF, 0x00050086, 0x00000011, 0x000045EC, 0x00004103,\n    0x0000074E, 0x000500C4, 0x00000011, 0x0000426B, 0x000045EC, 0x0000085F,\n    0x000500C5, 0x00000011, 0x000018B7, 0x000020C3, 0x0000426B, 0x000500C2,\n    0x00000011, 0x00003BE6, 0x000042BC, 0x0000085F, 0x00050086, 0x00000011,\n    0x00005E96, 0x00003BE6, 0x0000074E, 0x000500C4, 0x00000011, 0x000036E4,\n    0x00005E96, 0x00000907, 0x000500C5, 0x00000011, 0x00006125, 0x000018B7,\n    0x000036E4, 0x00050051, 0x0000000B, 0x00004E72, 0x00006125, 0x00000000,\n    0x00050051, 0x0000000B, 0x00005C33, 0x00006125, 0x00000001, 0x00070050,\n    0x00000017, 0x00004758, 0x00004E5E, 0x00001BF4, 0x00004E72, 0x00005C33,\n    0x00060041, 0x00000294, 0x00002EA5, 0x0000140E, 0x00000A0B, 0x0000267C,\n    0x0003003E, 0x00002EA5, 0x00004758, 0x000300F7, 0x00001C28, 0x00000002,\n    0x000400FA, 0x00004411, 0x0000592D, 0x00001C28, 0x000200F8, 0x0000592D,\n    0x00050080, 0x0000000B, 0x00003C7A, 0x0000578D, 0x0000578C, 0x000500C2,\n    0x0000000B, 0x000037CD, 0x00003C7A, 0x00000A17, 0x000500C2, 0x00000011,\n    0x00002E56, 0x000043B5, 0x000007B7, 0x000400C8, 0x00000011, 0x00004BB4,\n    0x00002E56, 0x0009004F, 0x00000017, 0x0000287B, 0x00004BB4, 0x00004BB4,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000500C2, 0x00000017,\n    0x000062AD, 0x0000287B, 0x0000004D, 0x000500C7, 0x00000017, 0x000041A1,\n    0x000062AD, 0x0000002F, 0x00050084, 0x00000017, 0x00003D82, 0x000041A1,\n    0x000043A7, 0x0009004F, 0x00000017, 0x00002921, 0x00002E56, 0x00002E56,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000500C2, 0x00000017,\n    0x00003D05, 0x00002921, 0x0000004D, 0x000500C7, 0x00000017, 0x00004544,\n    0x00003D05, 0x0000002F, 0x00050084, 0x00000017, 0x00005E5B, 0x00004544,\n    0x0000474A, 0x00050080, 0x00000017, 0x00002893, 0x00003D82, 0x00005E5B,\n    0x0007004F, 0x00000011, 0x00002828, 0x00002893, 0x00002893, 0x00000000,\n    0x00000002, 0x000500C7, 0x00000011, 0x000024A9, 0x00002828, 0x000007DF,\n    0x00050086, 0x00000011, 0x0000429A, 0x000024A9, 0x0000074E, 0x000500C2,\n    0x00000011, 0x000062A8, 0x00002828, 0x0000085F, 0x00050086, 0x00000011,\n    0x00003C10, 0x000062A8, 0x0000074E, 0x000500C4, 0x00000011, 0x000036BF,\n    0x00003C10, 0x000007B7, 0x000500C5, 0x00000011, 0x000020C4, 0x0000429A,\n    0x000036BF, 0x0007004F, 0x00000011, 0x000042BD, 0x00002893, 0x00002893,\n    0x00000001, 0x00000003, 0x000500C7, 0x00000011, 0x00004104, 0x000042BD,\n    0x000007DF, 0x00050086, 0x00000011, 0x000045ED, 0x00004104, 0x0000074E,\n    0x000500C4, 0x00000011, 0x0000426C, 0x000045ED, 0x0000085F, 0x000500C5,\n    0x00000011, 0x000018BC, 0x000020C4, 0x0000426C, 0x000500C2, 0x00000011,\n    0x00003BE9, 0x000042BD, 0x0000085F, 0x00050086, 0x00000011, 0x00005E97,\n    0x00003BE9, 0x0000074E, 0x000500C4, 0x00000011, 0x000036E5, 0x00005E97,\n    0x00000907, 0x000500C5, 0x00000011, 0x00006126, 0x000018BC, 0x000036E5,\n    0x00050051, 0x0000000B, 0x00004E5F, 0x00006126, 0x00000000, 0x00050051,\n    0x0000000B, 0x00001BF5, 0x00006126, 0x00000001, 0x0009004F, 0x00000017,\n    0x00001A58, 0x00004BB4, 0x00004BB4, 0x00000001, 0x00000001, 0x00000001,\n    0x00000001, 0x000500C2, 0x00000017, 0x00002710, 0x00001A58, 0x0000004D,\n    0x000500C7, 0x00000017, 0x000041A2, 0x00002710, 0x0000002F, 0x00050084,\n    0x00000017, 0x00003D83, 0x000041A2, 0x000043A8, 0x0009004F, 0x00000017,\n    0x00002922, 0x00002E56, 0x00002E56, 0x00000001, 0x00000001, 0x00000001,\n    0x00000001, 0x000500C2, 0x00000017, 0x00003D06, 0x00002922, 0x0000004D,\n    0x000500C7, 0x00000017, 0x00004545, 0x00003D06, 0x0000002F, 0x00050084,\n    0x00000017, 0x00005E5C, 0x00004545, 0x0000474B, 0x00050080, 0x00000017,\n    0x00002894, 0x00003D83, 0x00005E5C, 0x0007004F, 0x00000011, 0x00002829,\n    0x00002894, 0x00002894, 0x00000000, 0x00000002, 0x000500C7, 0x00000011,\n    0x000024AA, 0x00002829, 0x000007DF, 0x00050086, 0x00000011, 0x0000429B,\n    0x000024AA, 0x0000074E, 0x000500C2, 0x00000011, 0x000062A9, 0x00002829,\n    0x0000085F, 0x00050086, 0x00000011, 0x00003C11, 0x000062A9, 0x0000074E,\n    0x000500C4, 0x00000011, 0x000036C0, 0x00003C11, 0x000007B7, 0x000500C5,\n    0x00000011, 0x000020C5, 0x0000429B, 0x000036C0, 0x0007004F, 0x00000011,\n    0x000042BE, 0x00002894, 0x00002894, 0x00000001, 0x00000003, 0x000500C7,\n    0x00000011, 0x00004105, 0x000042BE, 0x000007DF, 0x00050086, 0x00000011,\n    0x000045EE, 0x00004105, 0x0000074E, 0x000500C4, 0x00000011, 0x0000426D,\n    0x000045EE, 0x0000085F, 0x000500C5, 0x00000011, 0x000018BD, 0x000020C5,\n    0x0000426D, 0x000500C2, 0x00000011, 0x00003BEA, 0x000042BE, 0x0000085F,\n    0x00050086, 0x00000011, 0x00005E98, 0x00003BEA, 0x0000074E, 0x000500C4,\n    0x00000011, 0x000036E6, 0x00005E98, 0x00000907, 0x000500C5, 0x00000011,\n    0x00006127, 0x000018BD, 0x000036E6, 0x00050051, 0x0000000B, 0x00004E73,\n    0x00006127, 0x00000000, 0x00050051, 0x0000000B, 0x00005C34, 0x00006127,\n    0x00000001, 0x00070050, 0x00000017, 0x00004759, 0x00004E5F, 0x00001BF5,\n    0x00004E73, 0x00005C34, 0x00060041, 0x00000294, 0x000025D2, 0x0000140E,\n    0x00000A0B, 0x000037CD, 0x0003003E, 0x000025D2, 0x00004759, 0x00050080,\n    0x0000000B, 0x000039FA, 0x00003220, 0x00000A10, 0x000500B0, 0x00000009,\n    0x00002E0D, 0x000039FA, 0x000019C2, 0x000300F7, 0x00001C27, 0x00000002,\n    0x000400FA, 0x00002E0D, 0x00005194, 0x00001C27, 0x000200F8, 0x00005194,\n    0x00050084, 0x0000000B, 0x00003390, 0x00000A10, 0x0000578C, 0x00050080,\n    0x0000000B, 0x0000349D, 0x0000578D, 0x00003390, 0x000500C2, 0x0000000B,\n    0x00004387, 0x0000349D, 0x00000A17, 0x000500C2, 0x00000011, 0x00002E57,\n    0x000043B5, 0x0000085F, 0x000400C8, 0x00000011, 0x00004BB5, 0x00002E57,\n    0x0009004F, 0x00000017, 0x0000287C, 0x00004BB5, 0x00004BB5, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x000500C2, 0x00000017, 0x000062AE,\n    0x0000287C, 0x0000004D, 0x000500C7, 0x00000017, 0x000041A3, 0x000062AE,\n    0x0000002F, 0x00050084, 0x00000017, 0x00003D84, 0x000041A3, 0x000043A7,\n    0x0009004F, 0x00000017, 0x00002923, 0x00002E57, 0x00002E57, 0x00000000,\n    0x00000000, 0x00000000, 0x00000000, 0x000500C2, 0x00000017, 0x00003D07,\n    0x00002923, 0x0000004D, 0x000500C7, 0x00000017, 0x00004546, 0x00003D07,\n    0x0000002F, 0x00050084, 0x00000017, 0x00005E5D, 0x00004546, 0x0000474A,\n    0x00050080, 0x00000017, 0x00002895, 0x00003D84, 0x00005E5D, 0x0007004F,\n    0x00000011, 0x0000282A, 0x00002895, 0x00002895, 0x00000000, 0x00000002,\n    0x000500C7, 0x00000011, 0x000024AB, 0x0000282A, 0x000007DF, 0x00050086,\n    0x00000011, 0x0000429C, 0x000024AB, 0x0000074E, 0x000500C2, 0x00000011,\n    0x000062AF, 0x0000282A, 0x0000085F, 0x00050086, 0x00000011, 0x00003C12,\n    0x000062AF, 0x0000074E, 0x000500C4, 0x00000011, 0x000036C1, 0x00003C12,\n    0x000007B7, 0x000500C5, 0x00000011, 0x000020C6, 0x0000429C, 0x000036C1,\n    0x0007004F, 0x00000011, 0x000042BF, 0x00002895, 0x00002895, 0x00000001,\n    0x00000003, 0x000500C7, 0x00000011, 0x00004106, 0x000042BF, 0x000007DF,\n    0x00050086, 0x00000011, 0x000045EF, 0x00004106, 0x0000074E, 0x000500C4,\n    0x00000011, 0x0000426E, 0x000045EF, 0x0000085F, 0x000500C5, 0x00000011,\n    0x000018BE, 0x000020C6, 0x0000426E, 0x000500C2, 0x00000011, 0x00003BEB,\n    0x000042BF, 0x0000085F, 0x00050086, 0x00000011, 0x00005E99, 0x00003BEB,\n    0x0000074E, 0x000500C4, 0x00000011, 0x000036E7, 0x00005E99, 0x00000907,\n    0x000500C5, 0x00000011, 0x00006128, 0x000018BE, 0x000036E7, 0x00050051,\n    0x0000000B, 0x00004E60, 0x00006128, 0x00000000, 0x00050051, 0x0000000B,\n    0x00001BF6, 0x00006128, 0x00000001, 0x0009004F, 0x00000017, 0x00001A59,\n    0x00004BB5, 0x00004BB5, 0x00000001, 0x00000001, 0x00000001, 0x00000001,\n    0x000500C2, 0x00000017, 0x00002711, 0x00001A59, 0x0000004D, 0x000500C7,\n    0x00000017, 0x000041A4, 0x00002711, 0x0000002F, 0x00050084, 0x00000017,\n    0x00003D85, 0x000041A4, 0x000043A8, 0x0009004F, 0x00000017, 0x00002924,\n    0x00002E57, 0x00002E57, 0x00000001, 0x00000001, 0x00000001, 0x00000001,\n    0x000500C2, 0x00000017, 0x00003D08, 0x00002924, 0x0000004D, 0x000500C7,\n    0x00000017, 0x00004547, 0x00003D08, 0x0000002F, 0x00050084, 0x00000017,\n    0x00005E5E, 0x00004547, 0x0000474B, 0x00050080, 0x00000017, 0x00002896,\n    0x00003D85, 0x00005E5E, 0x0007004F, 0x00000011, 0x0000282B, 0x00002896,\n    0x00002896, 0x00000000, 0x00000002, 0x000500C7, 0x00000011, 0x000024AC,\n    0x0000282B, 0x000007DF, 0x00050086, 0x00000011, 0x0000429D, 0x000024AC,\n    0x0000074E, 0x000500C2, 0x00000011, 0x000062B0, 0x0000282B, 0x0000085F,\n    0x00050086, 0x00000011, 0x00003C13, 0x000062B0, 0x0000074E, 0x000500C4,\n    0x00000011, 0x000036C3, 0x00003C13, 0x000007B7, 0x000500C5, 0x00000011,\n    0x000020C7, 0x0000429D, 0x000036C3, 0x0007004F, 0x00000011, 0x000042C0,\n    0x00002896, 0x00002896, 0x00000001, 0x00000003, 0x000500C7, 0x00000011,\n    0x00004107, 0x000042C0, 0x000007DF, 0x00050086, 0x00000011, 0x000045F0,\n    0x00004107, 0x0000074E, 0x000500C4, 0x00000011, 0x0000426F, 0x000045F0,\n    0x0000085F, 0x000500C5, 0x00000011, 0x000018BF, 0x000020C7, 0x0000426F,\n    0x000500C2, 0x00000011, 0x00003BEC, 0x000042C0, 0x0000085F, 0x00050086,\n    0x00000011, 0x00005E9A, 0x00003BEC, 0x0000074E, 0x000500C4, 0x00000011,\n    0x000036E8, 0x00005E9A, 0x00000907, 0x000500C5, 0x00000011, 0x00006129,\n    0x000018BF, 0x000036E8, 0x00050051, 0x0000000B, 0x00004E74, 0x00006129,\n    0x00000000, 0x00050051, 0x0000000B, 0x00005C35, 0x00006129, 0x00000001,\n    0x00070050, 0x00000017, 0x0000475A, 0x00004E60, 0x00001BF6, 0x00004E74,\n    0x00005C35, 0x00060041, 0x00000294, 0x000025D3, 0x0000140E, 0x00000A0B,\n    0x00004387, 0x0003003E, 0x000025D3, 0x0000475A, 0x00050080, 0x0000000B,\n    0x000039FB, 0x00003220, 0x00000A13, 0x000500B0, 0x00000009, 0x00002E0E,\n    0x000039FB, 0x000019C2, 0x000300F7, 0x00004666, 0x00000002, 0x000400FA,\n    0x00002E0E, 0x00005195, 0x00004666, 0x000200F8, 0x00005195, 0x00050084,\n    0x0000000B, 0x00003391, 0x00000A13, 0x0000578C, 0x00050080, 0x0000000B,\n    0x0000349E, 0x0000578D, 0x00003391, 0x000500C2, 0x0000000B, 0x00004388,\n    0x0000349E, 0x00000A17, 0x000500C2, 0x00000011, 0x00002E58, 0x000043B5,\n    0x00000907, 0x000400C8, 0x00000011, 0x00004BB6, 0x00002E58, 0x0009004F,\n    0x00000017, 0x0000287D, 0x00004BB6, 0x00004BB6, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x000500C2, 0x00000017, 0x000062B1, 0x0000287D,\n    0x0000004D, 0x000500C7, 0x00000017, 0x000041A5, 0x000062B1, 0x0000002F,\n    0x00050084, 0x00000017, 0x00003D86, 0x000041A5, 0x000043A7, 0x0009004F,\n    0x00000017, 0x00002925, 0x00002E58, 0x00002E58, 0x00000000, 0x00000000,\n    0x00000000, 0x00000000, 0x000500C2, 0x00000017, 0x00003D09, 0x00002925,\n    0x0000004D, 0x000500C7, 0x00000017, 0x00004548, 0x00003D09, 0x0000002F,\n    0x00050084, 0x00000017, 0x00005E5F, 0x00004548, 0x0000474A, 0x00050080,\n    0x00000017, 0x00002897, 0x00003D86, 0x00005E5F, 0x0007004F, 0x00000011,\n    0x0000282C, 0x00002897, 0x00002897, 0x00000000, 0x00000002, 0x000500C7,\n    0x00000011, 0x000024AD, 0x0000282C, 0x000007DF, 0x00050086, 0x00000011,\n    0x0000429E, 0x000024AD, 0x0000074E, 0x000500C2, 0x00000011, 0x000062B2,\n    0x0000282C, 0x0000085F, 0x00050086, 0x00000011, 0x00003C14, 0x000062B2,\n    0x0000074E, 0x000500C4, 0x00000011, 0x000036C4, 0x00003C14, 0x000007B7,\n    0x000500C5, 0x00000011, 0x000020C8, 0x0000429E, 0x000036C4, 0x0007004F,\n    0x00000011, 0x000042C1, 0x00002897, 0x00002897, 0x00000001, 0x00000003,\n    0x000500C7, 0x00000011, 0x00004108, 0x000042C1, 0x000007DF, 0x00050086,\n    0x00000011, 0x000045F1, 0x00004108, 0x0000074E, 0x000500C4, 0x00000011,\n    0x00004270, 0x000045F1, 0x0000085F, 0x000500C5, 0x00000011, 0x000018C0,\n    0x000020C8, 0x00004270, 0x000500C2, 0x00000011, 0x00003BED, 0x000042C1,\n    0x0000085F, 0x00050086, 0x00000011, 0x00005E9B, 0x00003BED, 0x0000074E,\n    0x000500C4, 0x00000011, 0x000036E9, 0x00005E9B, 0x00000907, 0x000500C5,\n    0x00000011, 0x0000612A, 0x000018C0, 0x000036E9, 0x00050051, 0x0000000B,\n    0x00004E61, 0x0000612A, 0x00000000, 0x00050051, 0x0000000B, 0x00001BF7,\n    0x0000612A, 0x00000001, 0x0009004F, 0x00000017, 0x00001A5A, 0x00004BB6,\n    0x00004BB6, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x000500C2,\n    0x00000017, 0x00002712, 0x00001A5A, 0x0000004D, 0x000500C7, 0x00000017,\n    0x000041A6, 0x00002712, 0x0000002F, 0x00050084, 0x00000017, 0x00003D87,\n    0x000041A6, 0x000043A8, 0x0009004F, 0x00000017, 0x00002926, 0x00002E58,\n    0x00002E58, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x000500C2,\n    0x00000017, 0x00003D0A, 0x00002926, 0x0000004D, 0x000500C7, 0x00000017,\n    0x00004549, 0x00003D0A, 0x0000002F, 0x00050084, 0x00000017, 0x00005E60,\n    0x00004549, 0x0000474B, 0x00050080, 0x00000017, 0x00002898, 0x00003D87,\n    0x00005E60, 0x0007004F, 0x00000011, 0x0000282D, 0x00002898, 0x00002898,\n    0x00000000, 0x00000002, 0x000500C7, 0x00000011, 0x000024AE, 0x0000282D,\n    0x000007DF, 0x00050086, 0x00000011, 0x0000429F, 0x000024AE, 0x0000074E,\n    0x000500C2, 0x00000011, 0x000062B3, 0x0000282D, 0x0000085F, 0x00050086,\n    0x00000011, 0x00003C15, 0x000062B3, 0x0000074E, 0x000500C4, 0x00000011,\n    0x000036C5, 0x00003C15, 0x000007B7, 0x000500C5, 0x00000011, 0x000020C9,\n    0x0000429F, 0x000036C5, 0x0007004F, 0x00000011, 0x000042C2, 0x00002898,\n    0x00002898, 0x00000001, 0x00000003, 0x000500C7, 0x00000011, 0x00004109,\n    0x000042C2, 0x000007DF, 0x00050086, 0x00000011, 0x000045F2, 0x00004109,\n    0x0000074E, 0x000500C4, 0x00000011, 0x00004271, 0x000045F2, 0x0000085F,\n    0x000500C5, 0x00000011, 0x000018C1, 0x000020C9, 0x00004271, 0x000500C2,\n    0x00000011, 0x00003BEE, 0x000042C2, 0x0000085F, 0x00050086, 0x00000011,\n    0x00005E9C, 0x00003BEE, 0x0000074E, 0x000500C4, 0x00000011, 0x000036EA,\n    0x00005E9C, 0x00000907, 0x000500C5, 0x00000011, 0x0000612B, 0x000018C1,\n    0x000036EA, 0x00050051, 0x0000000B, 0x00004E75, 0x0000612B, 0x00000000,\n    0x00050051, 0x0000000B, 0x00005C36, 0x0000612B, 0x00000001, 0x00070050,\n    0x00000017, 0x0000475B, 0x00004E61, 0x00001BF7, 0x00004E75, 0x00005C36,\n    0x00060041, 0x00000294, 0x00002ECC, 0x0000140E, 0x00000A0B, 0x00004388,\n    0x0003003E, 0x00002ECC, 0x0000475B, 0x000200F9, 0x00004666, 0x000200F8,\n    0x00004666, 0x000200F9, 0x00001C27, 0x000200F8, 0x00001C27, 0x000200F9,\n    0x00001C28, 0x000200F8, 0x00001C28, 0x000200F9, 0x00003A37, 0x000200F8,\n    0x00003A37, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_depth_float_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25155\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v4uint = OpTypeVector %uint 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v2uint = OpTypeVector %uint 2\n     %v3uint = OpTypeVector %uint 3\n      %v4int = OpTypeVector %int 4\n%uint_1048575 = OpConstant %uint 1048575\n    %uint_20 = OpConstant %uint 20\n     %v4bool = OpTypeVector %bool 4\n     %uint_0 = OpConstant %uint 0\n     %uint_1 = OpConstant %uint 1\n   %uint_112 = OpConstant %uint 112\n    %uint_23 = OpConstant %uint 23\n     %uint_3 = OpConstant %uint 3\n     %uint_2 = OpConstant %uint 2\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n    %uint_16 = OpConstant %uint 16\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n      %int_3 = OpConstant %int 3\n      %int_2 = OpConstant %int 2\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %2603 = OpConstantComposite %v3uint %uint_3 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n     %uint_4 = OpConstant %uint 4\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n    %uint_32 = OpConstant %uint 32\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n       %1080 = OpConstantComposite %v4uint %uint_1048575 %uint_1048575 %uint_1048575 %uint_1048575\n        %965 = OpConstantComposite %v4uint %uint_20 %uint_20 %uint_20 %uint_20\n       %2896 = OpConstantComposite %v4uint %uint_0 %uint_0 %uint_0 %uint_0\n       %2922 = OpConstantComposite %v4uint %uint_112 %uint_112 %uint_112 %uint_112\n       %1127 = OpConstantComposite %v4uint %uint_23 %uint_23 %uint_23 %uint_23\n         %47 = OpConstantComposite %v4uint %uint_3 %uint_3 %uint_3 %uint_3\n%uint_4294967277 = OpConstant %uint 4294967277\n       %1870 = OpConstantComposite %v4uint %uint_4294967277 %uint_4294967277 %uint_4294967277 %uint_4294967277\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24540 = OpBitwiseAnd %uint %13606 %uint_1\n      %17270 = OpINotEqual %bool %24540 %uint_0\n      %12328 = OpBitwiseAnd %uint %13606 %uint_2\n      %17284 = OpINotEqual %bool %12328 %uint_0\n       %7856 = OpShiftRightLogical %uint %13606 %uint_2\n      %25058 = OpBitwiseAnd %uint %7856 %uint_3\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2603\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %6586 DontFlatten\n               OpBranchConditional %24679 %21992 %6586\n      %21992 = OpLabel\n               OpBranch %19578\n       %6586 = OpLabel\n      %23478 = OpBitcast %v3int %21387\n      %18710 = OpCompositeExtract %uint %22410 1\n      %23531 = OpCompositeExtract %int %23478 0\n      %22810 = OpIMul %int %23531 %int_4\n       %6362 = OpCompositeExtract %int %23478 2\n      %14505 = OpBitcast %int %18710\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %23478 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %6594\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %22810 %24535\n      %10404 = OpBitcast %uint %8258\n      %14582 = OpIAdd %uint %22411 %10404\n      %12308 = OpLogicalNot %bool %17270\n               OpSelectionMerge %19040 DontFlatten\n               OpBranchConditional %12308 %9741 %17007\n       %9741 = OpLabel\n      %17463 = OpCompositeExtract %uint %21387 0\n      %11246 = OpCompositeExtract %uint %21387 1\n      %18801 = OpCompositeExtract %uint %21387 2\n      %14831 = OpIMul %uint %22409 %18801\n      %20322 = OpIAdd %uint %11246 %14831\n      %21676 = OpIMul %uint %22408 %20322\n      %20398 = OpIAdd %uint %17463 %21676\n      %11367 = OpShiftLeftLogical %uint %20398 %uint_2\n               OpBranch %19040\n      %17007 = OpLabel\n               OpSelectionMerge %23536 DontFlatten\n               OpBranchConditional %17284 %11410 %24353\n      %11410 = OpLabel\n      %21364 = OpShiftRightLogical %uint %22408 %int_5\n      %13804 = OpShiftRightLogical %uint %22409 %int_4\n      %13237 = OpShiftRightArithmetic %int %6362 %int_2\n      %22374 = OpBitcast %int %13804\n      %25085 = OpIMul %int %13237 %22374\n      %11618 = OpShiftRightArithmetic %int %17598 %int_4\n      %16670 = OpIAdd %int %25085 %11618\n      %19064 = OpBitcast %int %21364\n      %13020 = OpIMul %int %16670 %19064\n      %12986 = OpShiftRightArithmetic %int %23531 %int_5\n      %24558 = OpIAdd %int %13020 %12986\n       %8797 = OpShiftLeftLogical %int %24558 %int_7\n      %11434 = OpBitwiseAnd %int %6362 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %17598 %int_1\n      %21365 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21365 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %23531 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17334 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17334 %uint_2\n      %13015 = OpShiftRightArithmetic %int %17598 %int_3\n       %9929 = OpBitwiseXor %int %13015 %13237\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %23531 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %17598 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6551\n       %7168 = OpShiftLeftLogical %int %16793 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24144 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24144 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24144 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24144 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %23536\n      %24353 = OpLabel\n      %23000 = OpBitcast %v2int %17136\n      %22120 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %23000 1\n      %12089 = OpShiftRightArithmetic %int %14597 %int_5\n      %22400 = OpBitcast %int %22120\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %23000 0\n      %20423 = OpShiftRightArithmetic %int %25154 %int_5\n      %18864 = OpIAdd %int %7938 %20423\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25154 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17335 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17335 %uint_2\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25154 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6552\n       %7169 = OpShiftLeftLogical %int %21575 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24163 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24163 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24163 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %23536\n      %23536 = OpLabel\n      %10540 = OpPhi %uint %16869 %11410 %16870 %24353\n               OpBranch %19040\n      %19040 = OpLabel\n      %11376 = OpPhi %uint %11367 %9741 %10540 %23536\n      %18621 = OpIAdd %uint %11376 %24236\n      %15698 = OpShiftRightLogical %uint %18621 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15698\n       %7338 = OpLoad %v4uint %20399\n      %13760 = OpIEqual %bool %25058 %uint_1\n      %21366 = OpIEqual %bool %25058 %uint_2\n      %22150 = OpLogicalOr %bool %13760 %21366\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %7338 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %7338 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22649 = OpPhi %v4uint %7338 %19040 %16376 %10583\n      %19638 = OpIEqual %bool %25058 %uint_3\n      %15139 = OpLogicalOr %bool %21366 %19638\n               OpSelectionMerge %13867 None\n               OpBranchConditional %15139 %11064 %13867\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22649 %749\n      %15335 = OpShiftRightLogical %v4uint %22649 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %13867\n      %13867 = OpLabel\n      %19029 = OpPhi %v4uint %22649 %13411 %10728 %11064\n       %7960 = OpShiftRightLogical %uint %14582 %int_4\n      %15251 = OpShiftRightLogical %v4uint %19029 %317\n       %7219 = OpBitwiseAnd %v4uint %15251 %1080\n      %22636 = OpShiftRightLogical %v4uint %15251 %965\n      %16585 = OpIEqual %v4bool %22636 %2896\n      %11339 = OpExtInst %v4int %1 FindUMsb %7219\n      %10773 = OpBitcast %v4uint %11339\n       %6266 = OpISub %v4uint %965 %10773\n       %8720 = OpIAdd %v4uint %10773 %1870\n      %10351 = OpSelect %v4uint %16585 %8720 %22636\n      %23252 = OpShiftLeftLogical %v4uint %7219 %6266\n      %18842 = OpBitwiseAnd %v4uint %23252 %1080\n      %10909 = OpSelect %v4uint %16585 %18842 %7219\n      %24569 = OpIAdd %v4uint %10351 %2922\n      %20351 = OpShiftLeftLogical %v4uint %24569 %1127\n      %16294 = OpShiftLeftLogical %v4uint %10909 %47\n      %22396 = OpBitwiseOr %v4uint %20351 %16294\n      %12703 = OpIEqual %v4bool %15251 %2896\n      %24661 = OpSelect %v4uint %12703 %2896 %22396\n       %8770 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %7960\n               OpStore %8770 %24661\n      %21685 = OpIAdd %uint %14582 %uint_16\n               OpSelectionMerge %24688 DontFlatten\n               OpBranchConditional %17270 %21993 %7205\n      %21993 = OpLabel\n               OpBranch %24688\n       %7205 = OpLabel\n               OpBranch %24688\n      %24688 = OpLabel\n      %11377 = OpPhi %uint %uint_32 %21993 %uint_16 %7205\n      %18622 = OpIAdd %uint %18621 %11377\n      %15699 = OpShiftRightLogical %uint %18622 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15699\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %14874 None\n               OpBranchConditional %22150 %10584 %14874\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %14874\n      %14874 = OpLabel\n      %10924 = OpPhi %v4uint %14608 %24688 %16377 %10584\n               OpSelectionMerge %13868 None\n               OpBranchConditional %15139 %11065 %13868\n      %11065 = OpLabel\n      %24088 = OpShiftLeftLogical %v4uint %10924 %749\n      %15336 = OpShiftRightLogical %v4uint %10924 %749\n      %10729 = OpBitwiseOr %v4uint %24088 %15336\n               OpBranch %13868\n      %13868 = OpLabel\n      %19030 = OpPhi %v4uint %10924 %14874 %10729 %11065\n       %7961 = OpShiftRightLogical %uint %21685 %int_4\n      %15252 = OpShiftRightLogical %v4uint %19030 %317\n       %7220 = OpBitwiseAnd %v4uint %15252 %1080\n      %22637 = OpShiftRightLogical %v4uint %15252 %965\n      %16586 = OpIEqual %v4bool %22637 %2896\n      %11340 = OpExtInst %v4int %1 FindUMsb %7220\n      %10774 = OpBitcast %v4uint %11340\n       %6267 = OpISub %v4uint %965 %10774\n       %8721 = OpIAdd %v4uint %10774 %1870\n      %10352 = OpSelect %v4uint %16586 %8721 %22637\n      %23253 = OpShiftLeftLogical %v4uint %7220 %6267\n      %18843 = OpBitwiseAnd %v4uint %23253 %1080\n      %10910 = OpSelect %v4uint %16586 %18843 %7220\n      %24570 = OpIAdd %v4uint %10352 %2922\n      %20352 = OpShiftLeftLogical %v4uint %24570 %1127\n      %16295 = OpShiftLeftLogical %v4uint %10910 %47\n      %22397 = OpBitwiseOr %v4uint %20352 %16295\n      %12704 = OpIEqual %v4bool %15252 %2896\n      %24662 = OpSelect %v4uint %12704 %2896 %22397\n      %11069 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %7961\n               OpStore %11069 %24662\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_depth_float_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006243, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000017, 0x0000000B, 0x00000004, 0x00040015, 0x0000000C,\n    0x00000020, 0x00000001, 0x00040017, 0x00000012, 0x0000000C, 0x00000002,\n    0x00040017, 0x00000016, 0x0000000C, 0x00000003, 0x00020014, 0x00000009,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x00040017, 0x0000001A, 0x0000000C, 0x00000004,\n    0x0004002B, 0x0000000B, 0x00000708, 0x000FFFFF, 0x0004002B, 0x0000000B,\n    0x00000A46, 0x00000014, 0x00040017, 0x00000013, 0x00000009, 0x00000004,\n    0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000, 0x0004002B, 0x0000000B,\n    0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B, 0x00000B5A, 0x00000070,\n    0x0004002B, 0x0000000B, 0x00000A4F, 0x00000017, 0x0004002B, 0x0000000B,\n    0x00000A13, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A10, 0x00000002,\n    0x0004002B, 0x0000000B, 0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B,\n    0x00000A22, 0x00000008, 0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00,\n    0x0004002B, 0x0000000B, 0x00000A3A, 0x00000010, 0x0004002B, 0x0000000C,\n    0x00000A17, 0x00000004, 0x0004002B, 0x0000000C, 0x00000A1D, 0x00000006,\n    0x0004002B, 0x0000000C, 0x00000A2C, 0x0000000B, 0x0004002B, 0x0000000C,\n    0x00000A38, 0x0000000F, 0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001,\n    0x0004002B, 0x0000000C, 0x00000A1A, 0x00000005, 0x0004002B, 0x0000000C,\n    0x00000A20, 0x00000007, 0x0004002B, 0x0000000C, 0x00000A23, 0x00000008,\n    0x0004002B, 0x0000000C, 0x00000A2F, 0x0000000C, 0x0004002B, 0x0000000C,\n    0x00000A14, 0x00000003, 0x0004002B, 0x0000000C, 0x00000A11, 0x00000002,\n    0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000, 0x000A001E, 0x00000489,\n    0x0000000B, 0x0000000B, 0x0000000B, 0x0000000B, 0x00000014, 0x0000000B,\n    0x0000000B, 0x0000000B, 0x00040020, 0x00000706, 0x00000009, 0x00000489,\n    0x0004003B, 0x00000706, 0x00000CE9, 0x00000009, 0x00040020, 0x00000288,\n    0x00000009, 0x0000000B, 0x00040020, 0x00000291, 0x00000009, 0x00000014,\n    0x00040020, 0x00000292, 0x00000001, 0x00000014, 0x0004003B, 0x00000292,\n    0x00000F48, 0x00000001, 0x0006002C, 0x00000014, 0x00000A2B, 0x00000A13,\n    0x00000A0A, 0x00000A0A, 0x00040017, 0x0000000F, 0x00000009, 0x00000002,\n    0x0004002B, 0x0000000B, 0x00000A16, 0x00000004, 0x0003001D, 0x000007DC,\n    0x00000017, 0x0003001E, 0x000007B4, 0x000007DC, 0x00040020, 0x00000A31,\n    0x00000002, 0x000007B4, 0x0004003B, 0x00000A31, 0x0000107A, 0x00000002,\n    0x00040020, 0x00000294, 0x00000002, 0x00000017, 0x0003001D, 0x000007DD,\n    0x00000017, 0x0003001E, 0x000007B5, 0x000007DD, 0x00040020, 0x00000A32,\n    0x00000002, 0x000007B5, 0x0004003B, 0x00000A32, 0x0000140E, 0x00000002,\n    0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020, 0x0006002C, 0x00000014,\n    0x00000BC3, 0x00000A16, 0x00000A6A, 0x00000A0D, 0x0007002C, 0x00000017,\n    0x000009CE, 0x000008A6, 0x000008A6, 0x000008A6, 0x000008A6, 0x0007002C,\n    0x00000017, 0x0000013D, 0x00000A22, 0x00000A22, 0x00000A22, 0x00000A22,\n    0x0007002C, 0x00000017, 0x0000072E, 0x000005FD, 0x000005FD, 0x000005FD,\n    0x000005FD, 0x0007002C, 0x00000017, 0x000002ED, 0x00000A3A, 0x00000A3A,\n    0x00000A3A, 0x00000A3A, 0x0007002C, 0x00000017, 0x00000438, 0x00000708,\n    0x00000708, 0x00000708, 0x00000708, 0x0007002C, 0x00000017, 0x000003C5,\n    0x00000A46, 0x00000A46, 0x00000A46, 0x00000A46, 0x0007002C, 0x00000017,\n    0x00000B50, 0x00000A0A, 0x00000A0A, 0x00000A0A, 0x00000A0A, 0x0007002C,\n    0x00000017, 0x00000B6A, 0x00000B5A, 0x00000B5A, 0x00000B5A, 0x00000B5A,\n    0x0007002C, 0x00000017, 0x00000467, 0x00000A4F, 0x00000A4F, 0x00000A4F,\n    0x00000A4F, 0x0007002C, 0x00000017, 0x0000002F, 0x00000A13, 0x00000A13,\n    0x00000A13, 0x00000A13, 0x0004002B, 0x0000000B, 0x000009D1, 0xFFFFFFED,\n    0x0007002C, 0x00000017, 0x0000074E, 0x000009D1, 0x000009D1, 0x000009D1,\n    0x000009D1, 0x00050036, 0x00000008, 0x0000161F, 0x00000000, 0x00000502,\n    0x000200F8, 0x00003B06, 0x000300F7, 0x00004C7A, 0x00000000, 0x000300FB,\n    0x00000A0A, 0x00002E68, 0x000200F8, 0x00002E68, 0x00050041, 0x00000288,\n    0x000060D7, 0x00000CE9, 0x00000A0B, 0x0004003D, 0x0000000B, 0x00003526,\n    0x000060D7, 0x000500C7, 0x0000000B, 0x00005FDC, 0x00003526, 0x00000A0D,\n    0x000500AB, 0x00000009, 0x00004376, 0x00005FDC, 0x00000A0A, 0x000500C7,\n    0x0000000B, 0x00003028, 0x00003526, 0x00000A10, 0x000500AB, 0x00000009,\n    0x00004384, 0x00003028, 0x00000A0A, 0x000500C2, 0x0000000B, 0x00001EB0,\n    0x00003526, 0x00000A10, 0x000500C7, 0x0000000B, 0x000061E2, 0x00001EB0,\n    0x00000A13, 0x00050041, 0x00000288, 0x0000492C, 0x00000CE9, 0x00000A0E,\n    0x0004003D, 0x0000000B, 0x00005EAC, 0x0000492C, 0x00050041, 0x00000288,\n    0x00004EBA, 0x00000CE9, 0x00000A11, 0x0004003D, 0x0000000B, 0x00005788,\n    0x00004EBA, 0x00050041, 0x00000288, 0x00004EBB, 0x00000CE9, 0x00000A14,\n    0x0004003D, 0x0000000B, 0x00005789, 0x00004EBB, 0x00050041, 0x00000291,\n    0x00004EBC, 0x00000CE9, 0x00000A17, 0x0004003D, 0x00000014, 0x0000578A,\n    0x00004EBC, 0x00050041, 0x00000288, 0x00004EBD, 0x00000CE9, 0x00000A1A,\n    0x0004003D, 0x0000000B, 0x0000578B, 0x00004EBD, 0x00050041, 0x00000288,\n    0x00004E6E, 0x00000CE9, 0x00000A1D, 0x0004003D, 0x0000000B, 0x000019C2,\n    0x00004E6E, 0x0004003D, 0x00000014, 0x00002A0E, 0x00000F48, 0x000500C4,\n    0x00000014, 0x0000538B, 0x00002A0E, 0x00000A2B, 0x0007004F, 0x00000011,\n    0x000042F0, 0x0000538B, 0x0000538B, 0x00000000, 0x00000001, 0x0007004F,\n    0x00000011, 0x0000242F, 0x0000578A, 0x0000578A, 0x00000000, 0x00000001,\n    0x000500AE, 0x0000000F, 0x00004288, 0x000042F0, 0x0000242F, 0x0004009A,\n    0x00000009, 0x00006067, 0x00004288, 0x000300F7, 0x000019BA, 0x00000002,\n    0x000400FA, 0x00006067, 0x000055E8, 0x000019BA, 0x000200F8, 0x000055E8,\n    0x000200F9, 0x00004C7A, 0x000200F8, 0x000019BA, 0x0004007C, 0x00000016,\n    0x00005BB6, 0x0000538B, 0x00050051, 0x0000000B, 0x00004916, 0x0000578A,\n    0x00000001, 0x00050051, 0x0000000C, 0x00005BEB, 0x00005BB6, 0x00000000,\n    0x00050084, 0x0000000C, 0x0000591A, 0x00005BEB, 0x00000A17, 0x00050051,\n    0x0000000C, 0x000018DA, 0x00005BB6, 0x00000002, 0x0004007C, 0x0000000C,\n    0x000038A9, 0x00004916, 0x00050084, 0x0000000C, 0x00002C0F, 0x000018DA,\n    0x000038A9, 0x00050051, 0x0000000C, 0x000044BE, 0x00005BB6, 0x00000001,\n    0x00050080, 0x0000000C, 0x000056D4, 0x00002C0F, 0x000044BE, 0x0004007C,\n    0x0000000C, 0x00005785, 0x000019C2, 0x00050084, 0x0000000C, 0x00005FD7,\n    0x000056D4, 0x00005785, 0x00050080, 0x0000000C, 0x00002042, 0x0000591A,\n    0x00005FD7, 0x0004007C, 0x0000000B, 0x000028A4, 0x00002042, 0x00050080,\n    0x0000000B, 0x000038F6, 0x0000578B, 0x000028A4, 0x000400A8, 0x00000009,\n    0x00003014, 0x00004376, 0x000300F7, 0x00004A60, 0x00000002, 0x000400FA,\n    0x00003014, 0x0000260D, 0x0000426F, 0x000200F8, 0x0000260D, 0x00050051,\n    0x0000000B, 0x00004437, 0x0000538B, 0x00000000, 0x00050051, 0x0000000B,\n    0x00002BEE, 0x0000538B, 0x00000001, 0x00050051, 0x0000000B, 0x00004971,\n    0x0000538B, 0x00000002, 0x00050084, 0x0000000B, 0x000039EF, 0x00005789,\n    0x00004971, 0x00050080, 0x0000000B, 0x00004F62, 0x00002BEE, 0x000039EF,\n    0x00050084, 0x0000000B, 0x000054AC, 0x00005788, 0x00004F62, 0x00050080,\n    0x0000000B, 0x00004FAE, 0x00004437, 0x000054AC, 0x000500C4, 0x0000000B,\n    0x00002C67, 0x00004FAE, 0x00000A10, 0x000200F9, 0x00004A60, 0x000200F8,\n    0x0000426F, 0x000300F7, 0x00005BF0, 0x00000002, 0x000400FA, 0x00004384,\n    0x00002C92, 0x00005F21, 0x000200F8, 0x00002C92, 0x000500C2, 0x0000000B,\n    0x00005374, 0x00005788, 0x00000A1A, 0x000500C2, 0x0000000B, 0x000035EC,\n    0x00005789, 0x00000A17, 0x000500C3, 0x0000000C, 0x000033B5, 0x000018DA,\n    0x00000A11, 0x0004007C, 0x0000000C, 0x00005766, 0x000035EC, 0x00050084,\n    0x0000000C, 0x000061FD, 0x000033B5, 0x00005766, 0x000500C3, 0x0000000C,\n    0x00002D62, 0x000044BE, 0x00000A17, 0x00050080, 0x0000000C, 0x0000411E,\n    0x000061FD, 0x00002D62, 0x0004007C, 0x0000000C, 0x00004A78, 0x00005374,\n    0x00050084, 0x0000000C, 0x000032DC, 0x0000411E, 0x00004A78, 0x000500C3,\n    0x0000000C, 0x000032BA, 0x00005BEB, 0x00000A1A, 0x00050080, 0x0000000C,\n    0x00005FEE, 0x000032DC, 0x000032BA, 0x000500C4, 0x0000000C, 0x0000225D,\n    0x00005FEE, 0x00000A20, 0x000500C7, 0x0000000C, 0x00002CAA, 0x000018DA,\n    0x00000A14, 0x000500C4, 0x0000000C, 0x00004CAE, 0x00002CAA, 0x00000A1A,\n    0x000500C3, 0x0000000C, 0x0000383E, 0x000044BE, 0x00000A0E, 0x000500C7,\n    0x0000000C, 0x00005375, 0x0000383E, 0x00000A14, 0x000500C4, 0x0000000C,\n    0x000054CA, 0x00005375, 0x00000A14, 0x000500C5, 0x0000000C, 0x000042CE,\n    0x00004CAE, 0x000054CA, 0x000500C7, 0x0000000C, 0x000050D5, 0x00005BEB,\n    0x00000A20, 0x000500C5, 0x0000000C, 0x00003ADD, 0x000042CE, 0x000050D5,\n    0x000500C5, 0x0000000C, 0x000043B6, 0x0000225D, 0x00003ADD, 0x000500C4,\n    0x0000000C, 0x00005E50, 0x000043B6, 0x00000A10, 0x000500C3, 0x0000000C,\n    0x000032D7, 0x000044BE, 0x00000A14, 0x000500C6, 0x0000000C, 0x000026C9,\n    0x000032D7, 0x000033B5, 0x000500C7, 0x0000000C, 0x00004199, 0x000026C9,\n    0x00000A0E, 0x000500C3, 0x0000000C, 0x00002590, 0x00005BEB, 0x00000A14,\n    0x000500C7, 0x0000000C, 0x0000505E, 0x00002590, 0x00000A14, 0x000500C4,\n    0x0000000C, 0x0000541D, 0x00004199, 0x00000A0E, 0x000500C6, 0x0000000C,\n    0x000022BA, 0x0000505E, 0x0000541D, 0x000500C7, 0x0000000C, 0x00005076,\n    0x000044BE, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005228, 0x00005076,\n    0x00000A17, 0x000500C4, 0x0000000C, 0x00001997, 0x000022BA, 0x00000A1D,\n    0x000500C5, 0x0000000C, 0x000047FE, 0x00005228, 0x00001997, 0x000500C4,\n    0x0000000C, 0x00001C00, 0x00004199, 0x00000A2C, 0x000500C5, 0x0000000C,\n    0x00003C81, 0x000047FE, 0x00001C00, 0x000500C7, 0x0000000C, 0x000050AF,\n    0x00005E50, 0x00000A38, 0x000500C5, 0x0000000C, 0x00003C70, 0x00003C81,\n    0x000050AF, 0x000500C3, 0x0000000C, 0x00003745, 0x00005E50, 0x00000A17,\n    0x000500C7, 0x0000000C, 0x000018B8, 0x00003745, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x0000547E, 0x000018B8, 0x00000A1A, 0x000500C5, 0x0000000C,\n    0x000045A8, 0x00003C70, 0x0000547E, 0x000500C3, 0x0000000C, 0x00003A6E,\n    0x00005E50, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018B9, 0x00003A6E,\n    0x00000A20, 0x000500C4, 0x0000000C, 0x0000547F, 0x000018B9, 0x00000A23,\n    0x000500C5, 0x0000000C, 0x0000456F, 0x000045A8, 0x0000547F, 0x000500C3,\n    0x0000000C, 0x00003C88, 0x00005E50, 0x00000A23, 0x000500C4, 0x0000000C,\n    0x00002824, 0x00003C88, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B79,\n    0x0000456F, 0x00002824, 0x0004007C, 0x0000000B, 0x000041E5, 0x00003B79,\n    0x000200F9, 0x00005BF0, 0x000200F8, 0x00005F21, 0x0004007C, 0x00000012,\n    0x000059D8, 0x000042F0, 0x000500C2, 0x0000000B, 0x00005668, 0x00005788,\n    0x00000A1A, 0x00050051, 0x0000000C, 0x00003905, 0x000059D8, 0x00000001,\n    0x000500C3, 0x0000000C, 0x00002F39, 0x00003905, 0x00000A1A, 0x0004007C,\n    0x0000000C, 0x00005780, 0x00005668, 0x00050084, 0x0000000C, 0x00001F02,\n    0x00002F39, 0x00005780, 0x00050051, 0x0000000C, 0x00006242, 0x000059D8,\n    0x00000000, 0x000500C3, 0x0000000C, 0x00004FC7, 0x00006242, 0x00000A1A,\n    0x00050080, 0x0000000C, 0x000049B0, 0x00001F02, 0x00004FC7, 0x000500C4,\n    0x0000000C, 0x0000254A, 0x000049B0, 0x00000A1D, 0x000500C3, 0x0000000C,\n    0x0000603B, 0x00003905, 0x00000A0E, 0x000500C7, 0x0000000C, 0x0000539A,\n    0x0000603B, 0x00000A20, 0x000500C4, 0x0000000C, 0x0000534A, 0x0000539A,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x00004EA5, 0x00006242, 0x00000A20,\n    0x000500C5, 0x0000000C, 0x00002B1A, 0x0000534A, 0x00004EA5, 0x000500C5,\n    0x0000000C, 0x000043B7, 0x0000254A, 0x00002B1A, 0x000500C4, 0x0000000C,\n    0x00005E63, 0x000043B7, 0x00000A10, 0x000500C3, 0x0000000C, 0x000031DE,\n    0x00003905, 0x00000A17, 0x000500C7, 0x0000000C, 0x00005447, 0x000031DE,\n    0x00000A0E, 0x000500C3, 0x0000000C, 0x000028A6, 0x00006242, 0x00000A14,\n    0x000500C7, 0x0000000C, 0x0000511E, 0x000028A6, 0x00000A14, 0x000500C3,\n    0x0000000C, 0x000028B9, 0x00003905, 0x00000A14, 0x000500C7, 0x0000000C,\n    0x0000505F, 0x000028B9, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000541E,\n    0x0000505F, 0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BB, 0x0000511E,\n    0x0000541E, 0x000500C7, 0x0000000C, 0x00005077, 0x00003905, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x00005229, 0x00005077, 0x00000A17, 0x000500C4,\n    0x0000000C, 0x00001998, 0x000022BB, 0x00000A1D, 0x000500C5, 0x0000000C,\n    0x000047FF, 0x00005229, 0x00001998, 0x000500C4, 0x0000000C, 0x00001C01,\n    0x00005447, 0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C82, 0x000047FF,\n    0x00001C01, 0x000500C7, 0x0000000C, 0x000050B0, 0x00005E63, 0x00000A38,\n    0x000500C5, 0x0000000C, 0x00003C71, 0x00003C82, 0x000050B0, 0x000500C3,\n    0x0000000C, 0x00003746, 0x00005E63, 0x00000A17, 0x000500C7, 0x0000000C,\n    0x000018BA, 0x00003746, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005480,\n    0x000018BA, 0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A9, 0x00003C71,\n    0x00005480, 0x000500C3, 0x0000000C, 0x00003A6F, 0x00005E63, 0x00000A1A,\n    0x000500C7, 0x0000000C, 0x000018BB, 0x00003A6F, 0x00000A20, 0x000500C4,\n    0x0000000C, 0x00005481, 0x000018BB, 0x00000A23, 0x000500C5, 0x0000000C,\n    0x00004570, 0x000045A9, 0x00005481, 0x000500C3, 0x0000000C, 0x00003C89,\n    0x00005E63, 0x00000A23, 0x000500C4, 0x0000000C, 0x00002825, 0x00003C89,\n    0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B7A, 0x00004570, 0x00002825,\n    0x0004007C, 0x0000000B, 0x000041E6, 0x00003B7A, 0x000200F9, 0x00005BF0,\n    0x000200F8, 0x00005BF0, 0x000700F5, 0x0000000B, 0x0000292C, 0x000041E5,\n    0x00002C92, 0x000041E6, 0x00005F21, 0x000200F9, 0x00004A60, 0x000200F8,\n    0x00004A60, 0x000700F5, 0x0000000B, 0x00002C70, 0x00002C67, 0x0000260D,\n    0x0000292C, 0x00005BF0, 0x00050080, 0x0000000B, 0x000048BD, 0x00002C70,\n    0x00005EAC, 0x000500C2, 0x0000000B, 0x00003D52, 0x000048BD, 0x00000A17,\n    0x00060041, 0x00000294, 0x00004FAF, 0x0000107A, 0x00000A0B, 0x00003D52,\n    0x0004003D, 0x00000017, 0x00001CAA, 0x00004FAF, 0x000500AA, 0x00000009,\n    0x000035C0, 0x000061E2, 0x00000A0D, 0x000500AA, 0x00000009, 0x00005376,\n    0x000061E2, 0x00000A10, 0x000500A6, 0x00000009, 0x00005686, 0x000035C0,\n    0x00005376, 0x000300F7, 0x00003463, 0x00000000, 0x000400FA, 0x00005686,\n    0x00002957, 0x00003463, 0x000200F8, 0x00002957, 0x000500C7, 0x00000017,\n    0x0000475F, 0x00001CAA, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D1,\n    0x0000475F, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AC, 0x00001CAA,\n    0x0000072E, 0x000500C2, 0x00000017, 0x0000448D, 0x000050AC, 0x0000013D,\n    0x000500C5, 0x00000017, 0x00003FF8, 0x000024D1, 0x0000448D, 0x000200F9,\n    0x00003463, 0x000200F8, 0x00003463, 0x000700F5, 0x00000017, 0x00005879,\n    0x00001CAA, 0x00004A60, 0x00003FF8, 0x00002957, 0x000500AA, 0x00000009,\n    0x00004CB6, 0x000061E2, 0x00000A13, 0x000500A6, 0x00000009, 0x00003B23,\n    0x00005376, 0x00004CB6, 0x000300F7, 0x0000362B, 0x00000000, 0x000400FA,\n    0x00003B23, 0x00002B38, 0x0000362B, 0x000200F8, 0x00002B38, 0x000500C4,\n    0x00000017, 0x00005E17, 0x00005879, 0x000002ED, 0x000500C2, 0x00000017,\n    0x00003BE7, 0x00005879, 0x000002ED, 0x000500C5, 0x00000017, 0x000029E8,\n    0x00005E17, 0x00003BE7, 0x000200F9, 0x0000362B, 0x000200F8, 0x0000362B,\n    0x000700F5, 0x00000017, 0x00004A55, 0x00005879, 0x00003463, 0x000029E8,\n    0x00002B38, 0x000500C2, 0x0000000B, 0x00001F18, 0x000038F6, 0x00000A17,\n    0x000500C2, 0x00000017, 0x00003B93, 0x00004A55, 0x0000013D, 0x000500C7,\n    0x00000017, 0x00001C33, 0x00003B93, 0x00000438, 0x000500C2, 0x00000017,\n    0x0000586C, 0x00003B93, 0x000003C5, 0x000500AA, 0x00000013, 0x000040C9,\n    0x0000586C, 0x00000B50, 0x0006000C, 0x0000001A, 0x00002C4B, 0x00000001,\n    0x0000004B, 0x00001C33, 0x0004007C, 0x00000017, 0x00002A15, 0x00002C4B,\n    0x00050082, 0x00000017, 0x0000187A, 0x000003C5, 0x00002A15, 0x00050080,\n    0x00000017, 0x00002210, 0x00002A15, 0x0000074E, 0x000600A9, 0x00000017,\n    0x0000286F, 0x000040C9, 0x00002210, 0x0000586C, 0x000500C4, 0x00000017,\n    0x00005AD4, 0x00001C33, 0x0000187A, 0x000500C7, 0x00000017, 0x0000499A,\n    0x00005AD4, 0x00000438, 0x000600A9, 0x00000017, 0x00002A9D, 0x000040C9,\n    0x0000499A, 0x00001C33, 0x00050080, 0x00000017, 0x00005FF9, 0x0000286F,\n    0x00000B6A, 0x000500C4, 0x00000017, 0x00004F7F, 0x00005FF9, 0x00000467,\n    0x000500C4, 0x00000017, 0x00003FA6, 0x00002A9D, 0x0000002F, 0x000500C5,\n    0x00000017, 0x0000577C, 0x00004F7F, 0x00003FA6, 0x000500AA, 0x00000013,\n    0x0000319F, 0x00003B93, 0x00000B50, 0x000600A9, 0x00000017, 0x00006055,\n    0x0000319F, 0x00000B50, 0x0000577C, 0x00060041, 0x00000294, 0x00002242,\n    0x0000140E, 0x00000A0B, 0x00001F18, 0x0003003E, 0x00002242, 0x00006055,\n    0x00050080, 0x0000000B, 0x000054B5, 0x000038F6, 0x00000A3A, 0x000300F7,\n    0x00006070, 0x00000002, 0x000400FA, 0x00004376, 0x000055E9, 0x00001C25,\n    0x000200F8, 0x000055E9, 0x000200F9, 0x00006070, 0x000200F8, 0x00001C25,\n    0x000200F9, 0x00006070, 0x000200F8, 0x00006070, 0x000700F5, 0x0000000B,\n    0x00002C71, 0x00000A6A, 0x000055E9, 0x00000A3A, 0x00001C25, 0x00050080,\n    0x0000000B, 0x000048BE, 0x000048BD, 0x00002C71, 0x000500C2, 0x0000000B,\n    0x00003D53, 0x000048BE, 0x00000A17, 0x00060041, 0x00000294, 0x00005566,\n    0x0000107A, 0x00000A0B, 0x00003D53, 0x0004003D, 0x00000017, 0x00003910,\n    0x00005566, 0x000300F7, 0x00003A1A, 0x00000000, 0x000400FA, 0x00005686,\n    0x00002958, 0x00003A1A, 0x000200F8, 0x00002958, 0x000500C7, 0x00000017,\n    0x00004760, 0x00003910, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D2,\n    0x00004760, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AD, 0x00003910,\n    0x0000072E, 0x000500C2, 0x00000017, 0x0000448E, 0x000050AD, 0x0000013D,\n    0x000500C5, 0x00000017, 0x00003FF9, 0x000024D2, 0x0000448E, 0x000200F9,\n    0x00003A1A, 0x000200F8, 0x00003A1A, 0x000700F5, 0x00000017, 0x00002AAC,\n    0x00003910, 0x00006070, 0x00003FF9, 0x00002958, 0x000300F7, 0x0000362C,\n    0x00000000, 0x000400FA, 0x00003B23, 0x00002B39, 0x0000362C, 0x000200F8,\n    0x00002B39, 0x000500C4, 0x00000017, 0x00005E18, 0x00002AAC, 0x000002ED,\n    0x000500C2, 0x00000017, 0x00003BE8, 0x00002AAC, 0x000002ED, 0x000500C5,\n    0x00000017, 0x000029E9, 0x00005E18, 0x00003BE8, 0x000200F9, 0x0000362C,\n    0x000200F8, 0x0000362C, 0x000700F5, 0x00000017, 0x00004A56, 0x00002AAC,\n    0x00003A1A, 0x000029E9, 0x00002B39, 0x000500C2, 0x0000000B, 0x00001F19,\n    0x000054B5, 0x00000A17, 0x000500C2, 0x00000017, 0x00003B94, 0x00004A56,\n    0x0000013D, 0x000500C7, 0x00000017, 0x00001C34, 0x00003B94, 0x00000438,\n    0x000500C2, 0x00000017, 0x0000586D, 0x00003B94, 0x000003C5, 0x000500AA,\n    0x00000013, 0x000040CA, 0x0000586D, 0x00000B50, 0x0006000C, 0x0000001A,\n    0x00002C4C, 0x00000001, 0x0000004B, 0x00001C34, 0x0004007C, 0x00000017,\n    0x00002A16, 0x00002C4C, 0x00050082, 0x00000017, 0x0000187B, 0x000003C5,\n    0x00002A16, 0x00050080, 0x00000017, 0x00002211, 0x00002A16, 0x0000074E,\n    0x000600A9, 0x00000017, 0x00002870, 0x000040CA, 0x00002211, 0x0000586D,\n    0x000500C4, 0x00000017, 0x00005AD5, 0x00001C34, 0x0000187B, 0x000500C7,\n    0x00000017, 0x0000499B, 0x00005AD5, 0x00000438, 0x000600A9, 0x00000017,\n    0x00002A9E, 0x000040CA, 0x0000499B, 0x00001C34, 0x00050080, 0x00000017,\n    0x00005FFA, 0x00002870, 0x00000B6A, 0x000500C4, 0x00000017, 0x00004F80,\n    0x00005FFA, 0x00000467, 0x000500C4, 0x00000017, 0x00003FA7, 0x00002A9E,\n    0x0000002F, 0x000500C5, 0x00000017, 0x0000577D, 0x00004F80, 0x00003FA7,\n    0x000500AA, 0x00000013, 0x000031A0, 0x00003B94, 0x00000B50, 0x000600A9,\n    0x00000017, 0x00006056, 0x000031A0, 0x00000B50, 0x0000577D, 0x00060041,\n    0x00000294, 0x00002B3D, 0x0000140E, 0x00000A0B, 0x00001F19, 0x0003003E,\n    0x00002B3D, 0x00006056, 0x000200F9, 0x00004C7A, 0x000200F8, 0x00004C7A,\n    0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_depth_float_scaled_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25157\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n     %v4uint = OpTypeVector %uint 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v3uint = OpTypeVector %uint 3\n      %v4int = OpTypeVector %int 4\n%uint_1048575 = OpConstant %uint 1048575\n    %uint_20 = OpConstant %uint 20\n     %v4bool = OpTypeVector %bool 4\n     %uint_0 = OpConstant %uint 0\n     %uint_1 = OpConstant %uint 1\n   %uint_112 = OpConstant %uint 112\n    %uint_23 = OpConstant %uint 23\n     %uint_3 = OpConstant %uint 3\n     %uint_2 = OpConstant %uint 2\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n    %uint_16 = OpConstant %uint 16\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n      %int_3 = OpConstant %int 3\n      %int_2 = OpConstant %int 2\n     %uint_4 = OpConstant %uint 4\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n     %uint_7 = OpConstant %uint 7\n       %1927 = OpConstantComposite %v2uint %uint_4 %uint_7\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %2603 = OpConstantComposite %v3uint %uint_3 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n    %uint_32 = OpConstant %uint 32\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %1954 = OpConstantComposite %v2uint %uint_7 %uint_7\n       %1855 = OpConstantComposite %v2uint %uint_4 %uint_1\n     %uint_6 = OpConstant %uint 6\n    %uint_15 = OpConstant %uint 15\n       %1955 = OpConstantComposite %v2uint %uint_15 %uint_1\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n       %1080 = OpConstantComposite %v4uint %uint_1048575 %uint_1048575 %uint_1048575 %uint_1048575\n        %965 = OpConstantComposite %v4uint %uint_20 %uint_20 %uint_20 %uint_20\n       %2896 = OpConstantComposite %v4uint %uint_0 %uint_0 %uint_0 %uint_0\n       %2922 = OpConstantComposite %v4uint %uint_112 %uint_112 %uint_112 %uint_112\n       %1127 = OpConstantComposite %v4uint %uint_23 %uint_23 %uint_23 %uint_23\n         %47 = OpConstantComposite %v4uint %uint_3 %uint_3 %uint_3 %uint_3\n%uint_4294967277 = OpConstant %uint 4294967277\n       %1870 = OpConstantComposite %v4uint %uint_4294967277 %uint_4294967277 %uint_4294967277 %uint_4294967277\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24445 = OpBitwiseAnd %uint %13606 %uint_2\n      %18667 = OpINotEqual %bool %24445 %uint_0\n       %8141 = OpShiftRightLogical %uint %13606 %uint_2\n      %24990 = OpBitwiseAnd %uint %8141 %uint_3\n       %8871 = OpCompositeConstruct %v2uint %13606 %13606\n       %7087 = OpShiftRightLogical %v2uint %8871 %1927\n       %6551 = OpBitwiseAnd %v2uint %7087 %1954\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2603\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %6586 DontFlatten\n               OpBranchConditional %24679 %21992 %6586\n      %21992 = OpLabel\n               OpBranch %19578\n       %6586 = OpLabel\n      %23478 = OpBitcast %v3int %21387\n      %18710 = OpCompositeExtract %uint %22410 1\n      %23531 = OpCompositeExtract %int %23478 0\n      %22810 = OpIMul %int %23531 %int_4\n       %6362 = OpCompositeExtract %int %23478 2\n      %14505 = OpBitcast %int %18710\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %23478 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %6594\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %22810 %24535\n      %10898 = OpBitcast %uint %8258\n       %7937 = OpIAdd %uint %22411 %10898\n      %19921 = OpShiftRightLogical %v2uint %17136 %1855\n       %7712 = OpUDiv %v2uint %19921 %6551\n      %18183 = OpIMul %v2uint %6551 %7712\n      %18273 = OpISub %v2uint %19921 %18183\n      %11232 = OpShiftLeftLogical %v2uint %7712 %1855\n      %13284 = OpCompositeExtract %uint %18273 0\n      %10872 = OpCompositeExtract %uint %6551 1\n      %22886 = OpIMul %uint %13284 %10872\n       %6943 = OpCompositeExtract %uint %18273 1\n      %10469 = OpIAdd %uint %22886 %6943\n      %18851 = OpBitwiseAnd %v2uint %17136 %1955\n      %10581 = OpShiftLeftLogical %uint %10469 %uint_7\n      %20916 = OpCompositeExtract %uint %18851 1\n      %23596 = OpShiftLeftLogical %uint %20916 %uint_6\n      %19814 = OpBitwiseOr %uint %10581 %23596\n      %21476 = OpCompositeExtract %uint %18851 0\n       %8560 = OpShiftLeftLogical %uint %21476 %uint_2\n      %17648 = OpBitwiseOr %uint %19814 %8560\n      %19923 = OpCompositeExtract %uint %11232 0\n      %15556 = OpCompositeInsert %v3uint %19923 %21387 0\n      %23006 = OpCompositeExtract %uint %11232 1\n       %9680 = OpCompositeInsert %v3uint %23006 %15556 1\n               OpSelectionMerge %20344 DontFlatten\n               OpBranchConditional %18667 %23520 %11737\n      %23520 = OpLabel\n      %10111 = OpBitcast %v3int %9680\n      %19476 = OpShiftRightLogical %uint %22408 %int_5\n      %18810 = OpShiftRightLogical %uint %22409 %int_4\n       %6782 = OpCompositeExtract %int %10111 2\n      %12089 = OpShiftRightArithmetic %int %6782 %int_2\n      %22400 = OpBitcast %int %18810\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %10111 1\n      %19055 = OpShiftRightArithmetic %int %25154 %int_4\n      %11052 = OpIAdd %int %7938 %19055\n      %16898 = OpBitcast %int %19476\n      %14944 = OpIMul %int %11052 %16898\n      %25155 = OpCompositeExtract %int %10111 0\n      %20423 = OpShiftRightArithmetic %int %25155 %int_5\n      %18940 = OpIAdd %int %14944 %20423\n       %8797 = OpShiftLeftLogical %int %18940 %int_7\n      %11434 = OpBitwiseAnd %int %6782 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %25154 %int_1\n      %21364 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21364 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %25155 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17334 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17334 %uint_2\n      %13015 = OpShiftRightArithmetic %int %25154 %int_3\n       %9929 = OpBitwiseXor %int %13015 %12089\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %25155 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %25154 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6552 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6552\n       %7168 = OpShiftLeftLogical %int %16793 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24144 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24144 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24144 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24144 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %20344\n      %11737 = OpLabel\n      %11908 = OpVectorShuffle %v2uint %9680 %9680 0 1\n      %20347 = OpBitcast %v2int %11908\n      %11433 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %20347 1\n      %12090 = OpShiftRightArithmetic %int %14597 %int_5\n      %22401 = OpBitcast %int %11433\n       %7939 = OpIMul %int %12090 %22401\n      %25156 = OpCompositeExtract %int %20347 0\n      %20424 = OpShiftRightArithmetic %int %25156 %int_5\n      %18864 = OpIAdd %int %7939 %20424\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25156 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17335 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17335 %uint_2\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25156 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6553 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6553\n       %7169 = OpShiftLeftLogical %int %21575 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24163 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24163 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24163 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %20344\n      %20344 = OpLabel\n      %18329 = OpPhi %uint %16869 %23520 %16870 %11737\n      %15200 = OpCompositeExtract %uint %6551 0\n      %17489 = OpIMul %uint %15200 %10872\n       %7313 = OpIMul %uint %18329 %17489\n       %8815 = OpIAdd %uint %7313 %17648\n      %21470 = OpIAdd %uint %8815 %24236\n      %14664 = OpShiftRightLogical %uint %21470 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %14664\n       %7338 = OpLoad %v4uint %20399\n      %13760 = OpIEqual %bool %24990 %uint_1\n      %21366 = OpIEqual %bool %24990 %uint_2\n      %22150 = OpLogicalOr %bool %13760 %21366\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %7338 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %7338 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22649 = OpPhi %v4uint %7338 %20344 %16376 %10583\n      %19638 = OpIEqual %bool %24990 %uint_3\n      %15139 = OpLogicalOr %bool %21366 %19638\n               OpSelectionMerge %13867 None\n               OpBranchConditional %15139 %11064 %13867\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22649 %749\n      %15335 = OpShiftRightLogical %v4uint %22649 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %13867\n      %13867 = OpLabel\n      %19029 = OpPhi %v4uint %22649 %13411 %10728 %11064\n       %7960 = OpShiftRightLogical %uint %7937 %int_4\n      %15251 = OpShiftRightLogical %v4uint %19029 %317\n       %7219 = OpBitwiseAnd %v4uint %15251 %1080\n      %22636 = OpShiftRightLogical %v4uint %15251 %965\n      %16585 = OpIEqual %v4bool %22636 %2896\n      %11339 = OpExtInst %v4int %1 FindUMsb %7219\n      %10773 = OpBitcast %v4uint %11339\n       %6266 = OpISub %v4uint %965 %10773\n       %8720 = OpIAdd %v4uint %10773 %1870\n      %10351 = OpSelect %v4uint %16585 %8720 %22636\n      %23252 = OpShiftLeftLogical %v4uint %7219 %6266\n      %18842 = OpBitwiseAnd %v4uint %23252 %1080\n      %10909 = OpSelect %v4uint %16585 %18842 %7219\n      %24569 = OpIAdd %v4uint %10351 %2922\n      %20351 = OpShiftLeftLogical %v4uint %24569 %1127\n      %16294 = OpShiftLeftLogical %v4uint %10909 %47\n      %22396 = OpBitwiseOr %v4uint %20351 %16294\n      %12703 = OpIEqual %v4bool %15251 %2896\n      %24661 = OpSelect %v4uint %12703 %2896 %22396\n       %8770 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %7960\n               OpStore %8770 %24661\n      %22137 = OpIAdd %uint %7937 %uint_16\n      %10214 = OpIAdd %uint %21470 %uint_16\n      %14665 = OpShiftRightLogical %uint %10214 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %14665\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %14874 None\n               OpBranchConditional %22150 %10584 %14874\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %14874\n      %14874 = OpLabel\n      %10924 = OpPhi %v4uint %14608 %13867 %16377 %10584\n               OpSelectionMerge %13868 None\n               OpBranchConditional %15139 %11065 %13868\n      %11065 = OpLabel\n      %24088 = OpShiftLeftLogical %v4uint %10924 %749\n      %15336 = OpShiftRightLogical %v4uint %10924 %749\n      %10729 = OpBitwiseOr %v4uint %24088 %15336\n               OpBranch %13868\n      %13868 = OpLabel\n      %19030 = OpPhi %v4uint %10924 %14874 %10729 %11065\n       %7961 = OpShiftRightLogical %uint %22137 %int_4\n      %15252 = OpShiftRightLogical %v4uint %19030 %317\n       %7220 = OpBitwiseAnd %v4uint %15252 %1080\n      %22637 = OpShiftRightLogical %v4uint %15252 %965\n      %16586 = OpIEqual %v4bool %22637 %2896\n      %11340 = OpExtInst %v4int %1 FindUMsb %7220\n      %10774 = OpBitcast %v4uint %11340\n       %6267 = OpISub %v4uint %965 %10774\n       %8721 = OpIAdd %v4uint %10774 %1870\n      %10352 = OpSelect %v4uint %16586 %8721 %22637\n      %23253 = OpShiftLeftLogical %v4uint %7220 %6267\n      %18843 = OpBitwiseAnd %v4uint %23253 %1080\n      %10910 = OpSelect %v4uint %16586 %18843 %7220\n      %24570 = OpIAdd %v4uint %10352 %2922\n      %20352 = OpShiftLeftLogical %v4uint %24570 %1127\n      %16295 = OpShiftLeftLogical %v4uint %10910 %47\n      %22397 = OpBitwiseOr %v4uint %20352 %16295\n      %12704 = OpIEqual %v4bool %15252 %2896\n      %24662 = OpSelect %v4uint %12704 %2896 %22397\n      %11069 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %7961\n               OpStore %11069 %24662\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_depth_float_scaled_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006245, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000017,\n    0x0000000B, 0x00000004, 0x00040015, 0x0000000C, 0x00000020, 0x00000001,\n    0x00040017, 0x00000012, 0x0000000C, 0x00000002, 0x00040017, 0x00000016,\n    0x0000000C, 0x00000003, 0x00020014, 0x00000009, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x00040017, 0x0000001A, 0x0000000C, 0x00000004,\n    0x0004002B, 0x0000000B, 0x00000708, 0x000FFFFF, 0x0004002B, 0x0000000B,\n    0x00000A46, 0x00000014, 0x00040017, 0x00000013, 0x00000009, 0x00000004,\n    0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000, 0x0004002B, 0x0000000B,\n    0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B, 0x00000B5A, 0x00000070,\n    0x0004002B, 0x0000000B, 0x00000A4F, 0x00000017, 0x0004002B, 0x0000000B,\n    0x00000A13, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A10, 0x00000002,\n    0x0004002B, 0x0000000B, 0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B,\n    0x00000A22, 0x00000008, 0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00,\n    0x0004002B, 0x0000000B, 0x00000A3A, 0x00000010, 0x0004002B, 0x0000000C,\n    0x00000A17, 0x00000004, 0x0004002B, 0x0000000C, 0x00000A1D, 0x00000006,\n    0x0004002B, 0x0000000C, 0x00000A2C, 0x0000000B, 0x0004002B, 0x0000000C,\n    0x00000A38, 0x0000000F, 0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001,\n    0x0004002B, 0x0000000C, 0x00000A1A, 0x00000005, 0x0004002B, 0x0000000C,\n    0x00000A20, 0x00000007, 0x0004002B, 0x0000000C, 0x00000A23, 0x00000008,\n    0x0004002B, 0x0000000C, 0x00000A2F, 0x0000000C, 0x0004002B, 0x0000000C,\n    0x00000A14, 0x00000003, 0x0004002B, 0x0000000C, 0x00000A11, 0x00000002,\n    0x0004002B, 0x0000000B, 0x00000A16, 0x00000004, 0x0004002B, 0x0000000C,\n    0x00000A0B, 0x00000000, 0x000A001E, 0x00000489, 0x0000000B, 0x0000000B,\n    0x0000000B, 0x0000000B, 0x00000014, 0x0000000B, 0x0000000B, 0x0000000B,\n    0x00040020, 0x00000706, 0x00000009, 0x00000489, 0x0004003B, 0x00000706,\n    0x00000CE9, 0x00000009, 0x00040020, 0x00000288, 0x00000009, 0x0000000B,\n    0x0004002B, 0x0000000B, 0x00000A1F, 0x00000007, 0x0005002C, 0x00000011,\n    0x00000787, 0x00000A16, 0x00000A1F, 0x00040020, 0x00000291, 0x00000009,\n    0x00000014, 0x00040020, 0x00000292, 0x00000001, 0x00000014, 0x0004003B,\n    0x00000292, 0x00000F48, 0x00000001, 0x0006002C, 0x00000014, 0x00000A2B,\n    0x00000A13, 0x00000A0A, 0x00000A0A, 0x00040017, 0x0000000F, 0x00000009,\n    0x00000002, 0x0003001D, 0x000007DC, 0x00000017, 0x0003001E, 0x000007B4,\n    0x000007DC, 0x00040020, 0x00000A31, 0x00000002, 0x000007B4, 0x0004003B,\n    0x00000A31, 0x0000107A, 0x00000002, 0x00040020, 0x00000294, 0x00000002,\n    0x00000017, 0x0003001D, 0x000007DD, 0x00000017, 0x0003001E, 0x000007B5,\n    0x000007DD, 0x00040020, 0x00000A32, 0x00000002, 0x000007B5, 0x0004003B,\n    0x00000A32, 0x0000140E, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A6A,\n    0x00000020, 0x0006002C, 0x00000014, 0x00000BC3, 0x00000A16, 0x00000A6A,\n    0x00000A0D, 0x0005002C, 0x00000011, 0x000007A2, 0x00000A1F, 0x00000A1F,\n    0x0005002C, 0x00000011, 0x0000073F, 0x00000A16, 0x00000A0D, 0x0004002B,\n    0x0000000B, 0x00000A1C, 0x00000006, 0x0004002B, 0x0000000B, 0x00000A37,\n    0x0000000F, 0x0005002C, 0x00000011, 0x000007A3, 0x00000A37, 0x00000A0D,\n    0x0007002C, 0x00000017, 0x000009CE, 0x000008A6, 0x000008A6, 0x000008A6,\n    0x000008A6, 0x0007002C, 0x00000017, 0x0000013D, 0x00000A22, 0x00000A22,\n    0x00000A22, 0x00000A22, 0x0007002C, 0x00000017, 0x0000072E, 0x000005FD,\n    0x000005FD, 0x000005FD, 0x000005FD, 0x0007002C, 0x00000017, 0x000002ED,\n    0x00000A3A, 0x00000A3A, 0x00000A3A, 0x00000A3A, 0x0007002C, 0x00000017,\n    0x00000438, 0x00000708, 0x00000708, 0x00000708, 0x00000708, 0x0007002C,\n    0x00000017, 0x000003C5, 0x00000A46, 0x00000A46, 0x00000A46, 0x00000A46,\n    0x0007002C, 0x00000017, 0x00000B50, 0x00000A0A, 0x00000A0A, 0x00000A0A,\n    0x00000A0A, 0x0007002C, 0x00000017, 0x00000B6A, 0x00000B5A, 0x00000B5A,\n    0x00000B5A, 0x00000B5A, 0x0007002C, 0x00000017, 0x00000467, 0x00000A4F,\n    0x00000A4F, 0x00000A4F, 0x00000A4F, 0x0007002C, 0x00000017, 0x0000002F,\n    0x00000A13, 0x00000A13, 0x00000A13, 0x00000A13, 0x0004002B, 0x0000000B,\n    0x000009D1, 0xFFFFFFED, 0x0007002C, 0x00000017, 0x0000074E, 0x000009D1,\n    0x000009D1, 0x000009D1, 0x000009D1, 0x00050036, 0x00000008, 0x0000161F,\n    0x00000000, 0x00000502, 0x000200F8, 0x00003B06, 0x000300F7, 0x00004C7A,\n    0x00000000, 0x000300FB, 0x00000A0A, 0x00002E68, 0x000200F8, 0x00002E68,\n    0x00050041, 0x00000288, 0x000060D7, 0x00000CE9, 0x00000A0B, 0x0004003D,\n    0x0000000B, 0x00003526, 0x000060D7, 0x000500C7, 0x0000000B, 0x00005F7D,\n    0x00003526, 0x00000A10, 0x000500AB, 0x00000009, 0x000048EB, 0x00005F7D,\n    0x00000A0A, 0x000500C2, 0x0000000B, 0x00001FCD, 0x00003526, 0x00000A10,\n    0x000500C7, 0x0000000B, 0x0000619E, 0x00001FCD, 0x00000A13, 0x00050050,\n    0x00000011, 0x000022A7, 0x00003526, 0x00003526, 0x000500C2, 0x00000011,\n    0x00001BAF, 0x000022A7, 0x00000787, 0x000500C7, 0x00000011, 0x00001997,\n    0x00001BAF, 0x000007A2, 0x00050041, 0x00000288, 0x0000492C, 0x00000CE9,\n    0x00000A0E, 0x0004003D, 0x0000000B, 0x00005EAC, 0x0000492C, 0x00050041,\n    0x00000288, 0x00004EBA, 0x00000CE9, 0x00000A11, 0x0004003D, 0x0000000B,\n    0x00005788, 0x00004EBA, 0x00050041, 0x00000288, 0x00004EBB, 0x00000CE9,\n    0x00000A14, 0x0004003D, 0x0000000B, 0x00005789, 0x00004EBB, 0x00050041,\n    0x00000291, 0x00004EBC, 0x00000CE9, 0x00000A17, 0x0004003D, 0x00000014,\n    0x0000578A, 0x00004EBC, 0x00050041, 0x00000288, 0x00004EBD, 0x00000CE9,\n    0x00000A1A, 0x0004003D, 0x0000000B, 0x0000578B, 0x00004EBD, 0x00050041,\n    0x00000288, 0x00004E6E, 0x00000CE9, 0x00000A1D, 0x0004003D, 0x0000000B,\n    0x000019C2, 0x00004E6E, 0x0004003D, 0x00000014, 0x00002A0E, 0x00000F48,\n    0x000500C4, 0x00000014, 0x0000538B, 0x00002A0E, 0x00000A2B, 0x0007004F,\n    0x00000011, 0x000042F0, 0x0000538B, 0x0000538B, 0x00000000, 0x00000001,\n    0x0007004F, 0x00000011, 0x0000242F, 0x0000578A, 0x0000578A, 0x00000000,\n    0x00000001, 0x000500AE, 0x0000000F, 0x00004288, 0x000042F0, 0x0000242F,\n    0x0004009A, 0x00000009, 0x00006067, 0x00004288, 0x000300F7, 0x000019BA,\n    0x00000002, 0x000400FA, 0x00006067, 0x000055E8, 0x000019BA, 0x000200F8,\n    0x000055E8, 0x000200F9, 0x00004C7A, 0x000200F8, 0x000019BA, 0x0004007C,\n    0x00000016, 0x00005BB6, 0x0000538B, 0x00050051, 0x0000000B, 0x00004916,\n    0x0000578A, 0x00000001, 0x00050051, 0x0000000C, 0x00005BEB, 0x00005BB6,\n    0x00000000, 0x00050084, 0x0000000C, 0x0000591A, 0x00005BEB, 0x00000A17,\n    0x00050051, 0x0000000C, 0x000018DA, 0x00005BB6, 0x00000002, 0x0004007C,\n    0x0000000C, 0x000038A9, 0x00004916, 0x00050084, 0x0000000C, 0x00002C0F,\n    0x000018DA, 0x000038A9, 0x00050051, 0x0000000C, 0x000044BE, 0x00005BB6,\n    0x00000001, 0x00050080, 0x0000000C, 0x000056D4, 0x00002C0F, 0x000044BE,\n    0x0004007C, 0x0000000C, 0x00005785, 0x000019C2, 0x00050084, 0x0000000C,\n    0x00005FD7, 0x000056D4, 0x00005785, 0x00050080, 0x0000000C, 0x00002042,\n    0x0000591A, 0x00005FD7, 0x0004007C, 0x0000000B, 0x00002A92, 0x00002042,\n    0x00050080, 0x0000000B, 0x00001F01, 0x0000578B, 0x00002A92, 0x000500C2,\n    0x00000011, 0x00004DD1, 0x000042F0, 0x0000073F, 0x00050086, 0x00000011,\n    0x00001E20, 0x00004DD1, 0x00001997, 0x00050084, 0x00000011, 0x00004707,\n    0x00001997, 0x00001E20, 0x00050082, 0x00000011, 0x00004761, 0x00004DD1,\n    0x00004707, 0x000500C4, 0x00000011, 0x00002BE0, 0x00001E20, 0x0000073F,\n    0x00050051, 0x0000000B, 0x000033E4, 0x00004761, 0x00000000, 0x00050051,\n    0x0000000B, 0x00002A78, 0x00001997, 0x00000001, 0x00050084, 0x0000000B,\n    0x00005966, 0x000033E4, 0x00002A78, 0x00050051, 0x0000000B, 0x00001B1F,\n    0x00004761, 0x00000001, 0x00050080, 0x0000000B, 0x000028E5, 0x00005966,\n    0x00001B1F, 0x000500C7, 0x00000011, 0x000049A3, 0x000042F0, 0x000007A3,\n    0x000500C4, 0x0000000B, 0x00002955, 0x000028E5, 0x00000A1F, 0x00050051,\n    0x0000000B, 0x000051B4, 0x000049A3, 0x00000001, 0x000500C4, 0x0000000B,\n    0x00005C2C, 0x000051B4, 0x00000A1C, 0x000500C5, 0x0000000B, 0x00004D66,\n    0x00002955, 0x00005C2C, 0x00050051, 0x0000000B, 0x000053E4, 0x000049A3,\n    0x00000000, 0x000500C4, 0x0000000B, 0x00002170, 0x000053E4, 0x00000A10,\n    0x000500C5, 0x0000000B, 0x000044F0, 0x00004D66, 0x00002170, 0x00050051,\n    0x0000000B, 0x00004DD3, 0x00002BE0, 0x00000000, 0x00060052, 0x00000014,\n    0x00003CC4, 0x00004DD3, 0x0000538B, 0x00000000, 0x00050051, 0x0000000B,\n    0x000059DE, 0x00002BE0, 0x00000001, 0x00060052, 0x00000014, 0x000025D0,\n    0x000059DE, 0x00003CC4, 0x00000001, 0x000300F7, 0x00004F78, 0x00000002,\n    0x000400FA, 0x000048EB, 0x00005BE0, 0x00002DD9, 0x000200F8, 0x00005BE0,\n    0x0004007C, 0x00000016, 0x0000277F, 0x000025D0, 0x000500C2, 0x0000000B,\n    0x00004C14, 0x00005788, 0x00000A1A, 0x000500C2, 0x0000000B, 0x0000497A,\n    0x00005789, 0x00000A17, 0x00050051, 0x0000000C, 0x00001A7E, 0x0000277F,\n    0x00000002, 0x000500C3, 0x0000000C, 0x00002F39, 0x00001A7E, 0x00000A11,\n    0x0004007C, 0x0000000C, 0x00005780, 0x0000497A, 0x00050084, 0x0000000C,\n    0x00001F02, 0x00002F39, 0x00005780, 0x00050051, 0x0000000C, 0x00006242,\n    0x0000277F, 0x00000001, 0x000500C3, 0x0000000C, 0x00004A6F, 0x00006242,\n    0x00000A17, 0x00050080, 0x0000000C, 0x00002B2C, 0x00001F02, 0x00004A6F,\n    0x0004007C, 0x0000000C, 0x00004202, 0x00004C14, 0x00050084, 0x0000000C,\n    0x00003A60, 0x00002B2C, 0x00004202, 0x00050051, 0x0000000C, 0x00006243,\n    0x0000277F, 0x00000000, 0x000500C3, 0x0000000C, 0x00004FC7, 0x00006243,\n    0x00000A1A, 0x00050080, 0x0000000C, 0x000049FC, 0x00003A60, 0x00004FC7,\n    0x000500C4, 0x0000000C, 0x0000225D, 0x000049FC, 0x00000A20, 0x000500C7,\n    0x0000000C, 0x00002CAA, 0x00001A7E, 0x00000A14, 0x000500C4, 0x0000000C,\n    0x00004CAE, 0x00002CAA, 0x00000A1A, 0x000500C3, 0x0000000C, 0x0000383E,\n    0x00006242, 0x00000A0E, 0x000500C7, 0x0000000C, 0x00005374, 0x0000383E,\n    0x00000A14, 0x000500C4, 0x0000000C, 0x000054CA, 0x00005374, 0x00000A14,\n    0x000500C5, 0x0000000C, 0x000042CE, 0x00004CAE, 0x000054CA, 0x000500C7,\n    0x0000000C, 0x000050D5, 0x00006243, 0x00000A20, 0x000500C5, 0x0000000C,\n    0x00003ADD, 0x000042CE, 0x000050D5, 0x000500C5, 0x0000000C, 0x000043B6,\n    0x0000225D, 0x00003ADD, 0x000500C4, 0x0000000C, 0x00005E50, 0x000043B6,\n    0x00000A10, 0x000500C3, 0x0000000C, 0x000032D7, 0x00006242, 0x00000A14,\n    0x000500C6, 0x0000000C, 0x000026C9, 0x000032D7, 0x00002F39, 0x000500C7,\n    0x0000000C, 0x00004199, 0x000026C9, 0x00000A0E, 0x000500C3, 0x0000000C,\n    0x00002590, 0x00006243, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000505E,\n    0x00002590, 0x00000A14, 0x000500C4, 0x0000000C, 0x0000541D, 0x00004199,\n    0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BA, 0x0000505E, 0x0000541D,\n    0x000500C7, 0x0000000C, 0x00005076, 0x00006242, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x00005228, 0x00005076, 0x00000A17, 0x000500C4, 0x0000000C,\n    0x00001998, 0x000022BA, 0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FE,\n    0x00005228, 0x00001998, 0x000500C4, 0x0000000C, 0x00001C00, 0x00004199,\n    0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C81, 0x000047FE, 0x00001C00,\n    0x000500C7, 0x0000000C, 0x000050AF, 0x00005E50, 0x00000A38, 0x000500C5,\n    0x0000000C, 0x00003C70, 0x00003C81, 0x000050AF, 0x000500C3, 0x0000000C,\n    0x00003745, 0x00005E50, 0x00000A17, 0x000500C7, 0x0000000C, 0x000018B8,\n    0x00003745, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000547E, 0x000018B8,\n    0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A8, 0x00003C70, 0x0000547E,\n    0x000500C3, 0x0000000C, 0x00003A6E, 0x00005E50, 0x00000A1A, 0x000500C7,\n    0x0000000C, 0x000018B9, 0x00003A6E, 0x00000A20, 0x000500C4, 0x0000000C,\n    0x0000547F, 0x000018B9, 0x00000A23, 0x000500C5, 0x0000000C, 0x0000456F,\n    0x000045A8, 0x0000547F, 0x000500C3, 0x0000000C, 0x00003C88, 0x00005E50,\n    0x00000A23, 0x000500C4, 0x0000000C, 0x00002824, 0x00003C88, 0x00000A2F,\n    0x000500C5, 0x0000000C, 0x00003B79, 0x0000456F, 0x00002824, 0x0004007C,\n    0x0000000B, 0x000041E5, 0x00003B79, 0x000200F9, 0x00004F78, 0x000200F8,\n    0x00002DD9, 0x0007004F, 0x00000011, 0x00002E84, 0x000025D0, 0x000025D0,\n    0x00000000, 0x00000001, 0x0004007C, 0x00000012, 0x00004F7B, 0x00002E84,\n    0x000500C2, 0x0000000B, 0x00002CA9, 0x00005788, 0x00000A1A, 0x00050051,\n    0x0000000C, 0x00003905, 0x00004F7B, 0x00000001, 0x000500C3, 0x0000000C,\n    0x00002F3A, 0x00003905, 0x00000A1A, 0x0004007C, 0x0000000C, 0x00005781,\n    0x00002CA9, 0x00050084, 0x0000000C, 0x00001F03, 0x00002F3A, 0x00005781,\n    0x00050051, 0x0000000C, 0x00006244, 0x00004F7B, 0x00000000, 0x000500C3,\n    0x0000000C, 0x00004FC8, 0x00006244, 0x00000A1A, 0x00050080, 0x0000000C,\n    0x000049B0, 0x00001F03, 0x00004FC8, 0x000500C4, 0x0000000C, 0x0000254A,\n    0x000049B0, 0x00000A1D, 0x000500C3, 0x0000000C, 0x0000603B, 0x00003905,\n    0x00000A0E, 0x000500C7, 0x0000000C, 0x0000539A, 0x0000603B, 0x00000A20,\n    0x000500C4, 0x0000000C, 0x0000534A, 0x0000539A, 0x00000A14, 0x000500C7,\n    0x0000000C, 0x00004EA5, 0x00006244, 0x00000A20, 0x000500C5, 0x0000000C,\n    0x00002B1A, 0x0000534A, 0x00004EA5, 0x000500C5, 0x0000000C, 0x000043B7,\n    0x0000254A, 0x00002B1A, 0x000500C4, 0x0000000C, 0x00005E63, 0x000043B7,\n    0x00000A10, 0x000500C3, 0x0000000C, 0x000031DE, 0x00003905, 0x00000A17,\n    0x000500C7, 0x0000000C, 0x00005447, 0x000031DE, 0x00000A0E, 0x000500C3,\n    0x0000000C, 0x000028A6, 0x00006244, 0x00000A14, 0x000500C7, 0x0000000C,\n    0x0000511E, 0x000028A6, 0x00000A14, 0x000500C3, 0x0000000C, 0x000028B9,\n    0x00003905, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000505F, 0x000028B9,\n    0x00000A0E, 0x000500C4, 0x0000000C, 0x0000541E, 0x0000505F, 0x00000A0E,\n    0x000500C6, 0x0000000C, 0x000022BB, 0x0000511E, 0x0000541E, 0x000500C7,\n    0x0000000C, 0x00005077, 0x00003905, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x00005229, 0x00005077, 0x00000A17, 0x000500C4, 0x0000000C, 0x00001999,\n    0x000022BB, 0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FF, 0x00005229,\n    0x00001999, 0x000500C4, 0x0000000C, 0x00001C01, 0x00005447, 0x00000A2C,\n    0x000500C5, 0x0000000C, 0x00003C82, 0x000047FF, 0x00001C01, 0x000500C7,\n    0x0000000C, 0x000050B0, 0x00005E63, 0x00000A38, 0x000500C5, 0x0000000C,\n    0x00003C71, 0x00003C82, 0x000050B0, 0x000500C3, 0x0000000C, 0x00003746,\n    0x00005E63, 0x00000A17, 0x000500C7, 0x0000000C, 0x000018BA, 0x00003746,\n    0x00000A0E, 0x000500C4, 0x0000000C, 0x00005480, 0x000018BA, 0x00000A1A,\n    0x000500C5, 0x0000000C, 0x000045A9, 0x00003C71, 0x00005480, 0x000500C3,\n    0x0000000C, 0x00003A6F, 0x00005E63, 0x00000A1A, 0x000500C7, 0x0000000C,\n    0x000018BB, 0x00003A6F, 0x00000A20, 0x000500C4, 0x0000000C, 0x00005481,\n    0x000018BB, 0x00000A23, 0x000500C5, 0x0000000C, 0x00004570, 0x000045A9,\n    0x00005481, 0x000500C3, 0x0000000C, 0x00003C89, 0x00005E63, 0x00000A23,\n    0x000500C4, 0x0000000C, 0x00002825, 0x00003C89, 0x00000A2F, 0x000500C5,\n    0x0000000C, 0x00003B7A, 0x00004570, 0x00002825, 0x0004007C, 0x0000000B,\n    0x000041E6, 0x00003B7A, 0x000200F9, 0x00004F78, 0x000200F8, 0x00004F78,\n    0x000700F5, 0x0000000B, 0x00004799, 0x000041E5, 0x00005BE0, 0x000041E6,\n    0x00002DD9, 0x00050051, 0x0000000B, 0x00003B60, 0x00001997, 0x00000000,\n    0x00050084, 0x0000000B, 0x00004451, 0x00003B60, 0x00002A78, 0x00050084,\n    0x0000000B, 0x00001C91, 0x00004799, 0x00004451, 0x00050080, 0x0000000B,\n    0x0000226F, 0x00001C91, 0x000044F0, 0x00050080, 0x0000000B, 0x000053DE,\n    0x0000226F, 0x00005EAC, 0x000500C2, 0x0000000B, 0x00003948, 0x000053DE,\n    0x00000A17, 0x00060041, 0x00000294, 0x00004FAF, 0x0000107A, 0x00000A0B,\n    0x00003948, 0x0004003D, 0x00000017, 0x00001CAA, 0x00004FAF, 0x000500AA,\n    0x00000009, 0x000035C0, 0x0000619E, 0x00000A0D, 0x000500AA, 0x00000009,\n    0x00005376, 0x0000619E, 0x00000A10, 0x000500A6, 0x00000009, 0x00005686,\n    0x000035C0, 0x00005376, 0x000300F7, 0x00003463, 0x00000000, 0x000400FA,\n    0x00005686, 0x00002957, 0x00003463, 0x000200F8, 0x00002957, 0x000500C7,\n    0x00000017, 0x0000475F, 0x00001CAA, 0x000009CE, 0x000500C4, 0x00000017,\n    0x000024D1, 0x0000475F, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AC,\n    0x00001CAA, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448D, 0x000050AC,\n    0x0000013D, 0x000500C5, 0x00000017, 0x00003FF8, 0x000024D1, 0x0000448D,\n    0x000200F9, 0x00003463, 0x000200F8, 0x00003463, 0x000700F5, 0x00000017,\n    0x00005879, 0x00001CAA, 0x00004F78, 0x00003FF8, 0x00002957, 0x000500AA,\n    0x00000009, 0x00004CB6, 0x0000619E, 0x00000A13, 0x000500A6, 0x00000009,\n    0x00003B23, 0x00005376, 0x00004CB6, 0x000300F7, 0x0000362B, 0x00000000,\n    0x000400FA, 0x00003B23, 0x00002B38, 0x0000362B, 0x000200F8, 0x00002B38,\n    0x000500C4, 0x00000017, 0x00005E17, 0x00005879, 0x000002ED, 0x000500C2,\n    0x00000017, 0x00003BE7, 0x00005879, 0x000002ED, 0x000500C5, 0x00000017,\n    0x000029E8, 0x00005E17, 0x00003BE7, 0x000200F9, 0x0000362B, 0x000200F8,\n    0x0000362B, 0x000700F5, 0x00000017, 0x00004A55, 0x00005879, 0x00003463,\n    0x000029E8, 0x00002B38, 0x000500C2, 0x0000000B, 0x00001F18, 0x00001F01,\n    0x00000A17, 0x000500C2, 0x00000017, 0x00003B93, 0x00004A55, 0x0000013D,\n    0x000500C7, 0x00000017, 0x00001C33, 0x00003B93, 0x00000438, 0x000500C2,\n    0x00000017, 0x0000586C, 0x00003B93, 0x000003C5, 0x000500AA, 0x00000013,\n    0x000040C9, 0x0000586C, 0x00000B50, 0x0006000C, 0x0000001A, 0x00002C4B,\n    0x00000001, 0x0000004B, 0x00001C33, 0x0004007C, 0x00000017, 0x00002A15,\n    0x00002C4B, 0x00050082, 0x00000017, 0x0000187A, 0x000003C5, 0x00002A15,\n    0x00050080, 0x00000017, 0x00002210, 0x00002A15, 0x0000074E, 0x000600A9,\n    0x00000017, 0x0000286F, 0x000040C9, 0x00002210, 0x0000586C, 0x000500C4,\n    0x00000017, 0x00005AD4, 0x00001C33, 0x0000187A, 0x000500C7, 0x00000017,\n    0x0000499A, 0x00005AD4, 0x00000438, 0x000600A9, 0x00000017, 0x00002A9D,\n    0x000040C9, 0x0000499A, 0x00001C33, 0x00050080, 0x00000017, 0x00005FF9,\n    0x0000286F, 0x00000B6A, 0x000500C4, 0x00000017, 0x00004F7F, 0x00005FF9,\n    0x00000467, 0x000500C4, 0x00000017, 0x00003FA6, 0x00002A9D, 0x0000002F,\n    0x000500C5, 0x00000017, 0x0000577C, 0x00004F7F, 0x00003FA6, 0x000500AA,\n    0x00000013, 0x0000319F, 0x00003B93, 0x00000B50, 0x000600A9, 0x00000017,\n    0x00006055, 0x0000319F, 0x00000B50, 0x0000577C, 0x00060041, 0x00000294,\n    0x00002242, 0x0000140E, 0x00000A0B, 0x00001F18, 0x0003003E, 0x00002242,\n    0x00006055, 0x00050080, 0x0000000B, 0x00005679, 0x00001F01, 0x00000A3A,\n    0x00050080, 0x0000000B, 0x000027E6, 0x000053DE, 0x00000A3A, 0x000500C2,\n    0x0000000B, 0x00003949, 0x000027E6, 0x00000A17, 0x00060041, 0x00000294,\n    0x00005566, 0x0000107A, 0x00000A0B, 0x00003949, 0x0004003D, 0x00000017,\n    0x00003910, 0x00005566, 0x000300F7, 0x00003A1A, 0x00000000, 0x000400FA,\n    0x00005686, 0x00002958, 0x00003A1A, 0x000200F8, 0x00002958, 0x000500C7,\n    0x00000017, 0x00004760, 0x00003910, 0x000009CE, 0x000500C4, 0x00000017,\n    0x000024D2, 0x00004760, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AD,\n    0x00003910, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448E, 0x000050AD,\n    0x0000013D, 0x000500C5, 0x00000017, 0x00003FF9, 0x000024D2, 0x0000448E,\n    0x000200F9, 0x00003A1A, 0x000200F8, 0x00003A1A, 0x000700F5, 0x00000017,\n    0x00002AAC, 0x00003910, 0x0000362B, 0x00003FF9, 0x00002958, 0x000300F7,\n    0x0000362C, 0x00000000, 0x000400FA, 0x00003B23, 0x00002B39, 0x0000362C,\n    0x000200F8, 0x00002B39, 0x000500C4, 0x00000017, 0x00005E18, 0x00002AAC,\n    0x000002ED, 0x000500C2, 0x00000017, 0x00003BE8, 0x00002AAC, 0x000002ED,\n    0x000500C5, 0x00000017, 0x000029E9, 0x00005E18, 0x00003BE8, 0x000200F9,\n    0x0000362C, 0x000200F8, 0x0000362C, 0x000700F5, 0x00000017, 0x00004A56,\n    0x00002AAC, 0x00003A1A, 0x000029E9, 0x00002B39, 0x000500C2, 0x0000000B,\n    0x00001F19, 0x00005679, 0x00000A17, 0x000500C2, 0x00000017, 0x00003B94,\n    0x00004A56, 0x0000013D, 0x000500C7, 0x00000017, 0x00001C34, 0x00003B94,\n    0x00000438, 0x000500C2, 0x00000017, 0x0000586D, 0x00003B94, 0x000003C5,\n    0x000500AA, 0x00000013, 0x000040CA, 0x0000586D, 0x00000B50, 0x0006000C,\n    0x0000001A, 0x00002C4C, 0x00000001, 0x0000004B, 0x00001C34, 0x0004007C,\n    0x00000017, 0x00002A16, 0x00002C4C, 0x00050082, 0x00000017, 0x0000187B,\n    0x000003C5, 0x00002A16, 0x00050080, 0x00000017, 0x00002211, 0x00002A16,\n    0x0000074E, 0x000600A9, 0x00000017, 0x00002870, 0x000040CA, 0x00002211,\n    0x0000586D, 0x000500C4, 0x00000017, 0x00005AD5, 0x00001C34, 0x0000187B,\n    0x000500C7, 0x00000017, 0x0000499B, 0x00005AD5, 0x00000438, 0x000600A9,\n    0x00000017, 0x00002A9E, 0x000040CA, 0x0000499B, 0x00001C34, 0x00050080,\n    0x00000017, 0x00005FFA, 0x00002870, 0x00000B6A, 0x000500C4, 0x00000017,\n    0x00004F80, 0x00005FFA, 0x00000467, 0x000500C4, 0x00000017, 0x00003FA7,\n    0x00002A9E, 0x0000002F, 0x000500C5, 0x00000017, 0x0000577D, 0x00004F80,\n    0x00003FA7, 0x000500AA, 0x00000013, 0x000031A0, 0x00003B94, 0x00000B50,\n    0x000600A9, 0x00000017, 0x00006056, 0x000031A0, 0x00000B50, 0x0000577D,\n    0x00060041, 0x00000294, 0x00002B3D, 0x0000140E, 0x00000A0B, 0x00001F19,\n    0x0003003E, 0x00002B3D, 0x00006056, 0x000200F9, 0x00004C7A, 0x000200F8,\n    0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_depth_unorm_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25155\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v4uint = OpTypeVector %uint 4\n      %float = OpTypeFloat 32\n    %v4float = OpTypeVector %float 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v2uint = OpTypeVector %uint 2\n     %v3uint = OpTypeVector %uint 3\n    %uint_23 = OpConstant %uint 23\n%float_5_96046448en08 = OpConstant %float 5.96046448e-08\n     %uint_1 = OpConstant %uint 1\n     %uint_2 = OpConstant %uint 2\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n     %uint_3 = OpConstant %uint 3\n    %uint_16 = OpConstant %uint 16\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n     %uint_0 = OpConstant %uint 0\n      %int_3 = OpConstant %int 3\n      %int_2 = OpConstant %int 2\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %2603 = OpConstantComposite %v3uint %uint_3 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n     %uint_4 = OpConstant %uint 4\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n    %uint_32 = OpConstant %uint 32\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n       %1127 = OpConstantComposite %v4uint %uint_23 %uint_23 %uint_23 %uint_23\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24540 = OpBitwiseAnd %uint %13606 %uint_1\n      %17270 = OpINotEqual %bool %24540 %uint_0\n      %12328 = OpBitwiseAnd %uint %13606 %uint_2\n      %17284 = OpINotEqual %bool %12328 %uint_0\n       %7856 = OpShiftRightLogical %uint %13606 %uint_2\n      %25058 = OpBitwiseAnd %uint %7856 %uint_3\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2603\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %6586 DontFlatten\n               OpBranchConditional %24679 %21992 %6586\n      %21992 = OpLabel\n               OpBranch %19578\n       %6586 = OpLabel\n      %23478 = OpBitcast %v3int %21387\n      %18710 = OpCompositeExtract %uint %22410 1\n      %23531 = OpCompositeExtract %int %23478 0\n      %22810 = OpIMul %int %23531 %int_4\n       %6362 = OpCompositeExtract %int %23478 2\n      %14505 = OpBitcast %int %18710\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %23478 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %6594\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %22810 %24535\n      %10404 = OpBitcast %uint %8258\n      %14582 = OpIAdd %uint %22411 %10404\n      %12308 = OpLogicalNot %bool %17270\n               OpSelectionMerge %19040 DontFlatten\n               OpBranchConditional %12308 %9741 %17007\n       %9741 = OpLabel\n      %17463 = OpCompositeExtract %uint %21387 0\n      %11246 = OpCompositeExtract %uint %21387 1\n      %18801 = OpCompositeExtract %uint %21387 2\n      %14831 = OpIMul %uint %22409 %18801\n      %20322 = OpIAdd %uint %11246 %14831\n      %21676 = OpIMul %uint %22408 %20322\n      %20398 = OpIAdd %uint %17463 %21676\n      %11367 = OpShiftLeftLogical %uint %20398 %uint_2\n               OpBranch %19040\n      %17007 = OpLabel\n               OpSelectionMerge %23536 DontFlatten\n               OpBranchConditional %17284 %11410 %24353\n      %11410 = OpLabel\n      %21364 = OpShiftRightLogical %uint %22408 %int_5\n      %13804 = OpShiftRightLogical %uint %22409 %int_4\n      %13237 = OpShiftRightArithmetic %int %6362 %int_2\n      %22374 = OpBitcast %int %13804\n      %25085 = OpIMul %int %13237 %22374\n      %11618 = OpShiftRightArithmetic %int %17598 %int_4\n      %16670 = OpIAdd %int %25085 %11618\n      %19064 = OpBitcast %int %21364\n      %13020 = OpIMul %int %16670 %19064\n      %12986 = OpShiftRightArithmetic %int %23531 %int_5\n      %24558 = OpIAdd %int %13020 %12986\n       %8797 = OpShiftLeftLogical %int %24558 %int_7\n      %11434 = OpBitwiseAnd %int %6362 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %17598 %int_1\n      %21365 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21365 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %23531 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17334 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17334 %uint_2\n      %13015 = OpShiftRightArithmetic %int %17598 %int_3\n       %9929 = OpBitwiseXor %int %13015 %13237\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %23531 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %17598 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6551\n       %7168 = OpShiftLeftLogical %int %16793 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24144 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24144 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24144 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24144 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %23536\n      %24353 = OpLabel\n      %23000 = OpBitcast %v2int %17136\n      %22120 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %23000 1\n      %12089 = OpShiftRightArithmetic %int %14597 %int_5\n      %22400 = OpBitcast %int %22120\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %23000 0\n      %20423 = OpShiftRightArithmetic %int %25154 %int_5\n      %18864 = OpIAdd %int %7938 %20423\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25154 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17335 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17335 %uint_2\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25154 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6552\n       %7169 = OpShiftLeftLogical %int %21575 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24163 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24163 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24163 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %23536\n      %23536 = OpLabel\n      %10540 = OpPhi %uint %16869 %11410 %16870 %24353\n               OpBranch %19040\n      %19040 = OpLabel\n      %11376 = OpPhi %uint %11367 %9741 %10540 %23536\n      %18621 = OpIAdd %uint %11376 %24236\n      %15698 = OpShiftRightLogical %uint %18621 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15698\n       %7338 = OpLoad %v4uint %20399\n      %13760 = OpIEqual %bool %25058 %uint_1\n      %21366 = OpIEqual %bool %25058 %uint_2\n      %22150 = OpLogicalOr %bool %13760 %21366\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %7338 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %7338 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22649 = OpPhi %v4uint %7338 %19040 %16376 %10583\n      %19638 = OpIEqual %bool %25058 %uint_3\n      %15139 = OpLogicalOr %bool %21366 %19638\n               OpSelectionMerge %13867 None\n               OpBranchConditional %15139 %11064 %13867\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22649 %749\n      %15335 = OpShiftRightLogical %v4uint %22649 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %13867\n      %13867 = OpLabel\n      %19029 = OpPhi %v4uint %22649 %13411 %10728 %11064\n       %7865 = OpShiftRightLogical %uint %14582 %int_4\n      %14862 = OpShiftRightLogical %v4uint %19029 %317\n      %20358 = OpShiftRightLogical %v4uint %14862 %1127\n      %11375 = OpIAdd %v4uint %14862 %20358\n      %21368 = OpConvertUToF %v4float %11375\n      %21748 = OpVectorTimesScalar %v4float %21368 %float_5_96046448en08\n      %12287 = OpBitcast %v4uint %21748\n      %24121 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %7865\n               OpStore %24121 %12287\n      %21685 = OpIAdd %uint %14582 %uint_16\n               OpSelectionMerge %24688 DontFlatten\n               OpBranchConditional %17270 %21993 %7205\n      %21993 = OpLabel\n               OpBranch %24688\n       %7205 = OpLabel\n               OpBranch %24688\n      %24688 = OpLabel\n      %11377 = OpPhi %uint %uint_32 %21993 %uint_16 %7205\n      %18622 = OpIAdd %uint %18621 %11377\n      %15699 = OpShiftRightLogical %uint %18622 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15699\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %14874 None\n               OpBranchConditional %22150 %10584 %14874\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %14874\n      %14874 = OpLabel\n      %10924 = OpPhi %v4uint %14608 %24688 %16377 %10584\n               OpSelectionMerge %13868 None\n               OpBranchConditional %15139 %11065 %13868\n      %11065 = OpLabel\n      %24088 = OpShiftLeftLogical %v4uint %10924 %749\n      %15336 = OpShiftRightLogical %v4uint %10924 %749\n      %10729 = OpBitwiseOr %v4uint %24088 %15336\n               OpBranch %13868\n      %13868 = OpLabel\n      %19030 = OpPhi %v4uint %10924 %14874 %10729 %11065\n       %7866 = OpShiftRightLogical %uint %21685 %int_4\n      %14863 = OpShiftRightLogical %v4uint %19030 %317\n      %20359 = OpShiftRightLogical %v4uint %14863 %1127\n      %11378 = OpIAdd %v4uint %14863 %20359\n      %21369 = OpConvertUToF %v4float %11378\n      %21749 = OpVectorTimesScalar %v4float %21369 %float_5_96046448en08\n      %12288 = OpBitcast %v4uint %21749\n       %7349 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %7866\n               OpStore %7349 %12288\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_depth_unorm_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006243, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000017, 0x0000000B, 0x00000004, 0x00030016, 0x0000000D,\n    0x00000020, 0x00040017, 0x0000001D, 0x0000000D, 0x00000004, 0x00040015,\n    0x0000000C, 0x00000020, 0x00000001, 0x00040017, 0x00000012, 0x0000000C,\n    0x00000002, 0x00040017, 0x00000016, 0x0000000C, 0x00000003, 0x00020014,\n    0x00000009, 0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017,\n    0x00000014, 0x0000000B, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A4F,\n    0x00000017, 0x0004002B, 0x0000000D, 0x00000B3A, 0x33800000, 0x0004002B,\n    0x0000000B, 0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B, 0x00000A10,\n    0x00000002, 0x0004002B, 0x0000000B, 0x000008A6, 0x00FF00FF, 0x0004002B,\n    0x0000000B, 0x00000A22, 0x00000008, 0x0004002B, 0x0000000B, 0x000005FD,\n    0xFF00FF00, 0x0004002B, 0x0000000B, 0x00000A13, 0x00000003, 0x0004002B,\n    0x0000000B, 0x00000A3A, 0x00000010, 0x0004002B, 0x0000000C, 0x00000A17,\n    0x00000004, 0x0004002B, 0x0000000C, 0x00000A1D, 0x00000006, 0x0004002B,\n    0x0000000C, 0x00000A2C, 0x0000000B, 0x0004002B, 0x0000000C, 0x00000A38,\n    0x0000000F, 0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001, 0x0004002B,\n    0x0000000C, 0x00000A1A, 0x00000005, 0x0004002B, 0x0000000C, 0x00000A20,\n    0x00000007, 0x0004002B, 0x0000000C, 0x00000A23, 0x00000008, 0x0004002B,\n    0x0000000C, 0x00000A2F, 0x0000000C, 0x0004002B, 0x0000000B, 0x00000A0A,\n    0x00000000, 0x0004002B, 0x0000000C, 0x00000A14, 0x00000003, 0x0004002B,\n    0x0000000C, 0x00000A11, 0x00000002, 0x0004002B, 0x0000000C, 0x00000A0B,\n    0x00000000, 0x000A001E, 0x00000489, 0x0000000B, 0x0000000B, 0x0000000B,\n    0x0000000B, 0x00000014, 0x0000000B, 0x0000000B, 0x0000000B, 0x00040020,\n    0x00000706, 0x00000009, 0x00000489, 0x0004003B, 0x00000706, 0x00000CE9,\n    0x00000009, 0x00040020, 0x00000288, 0x00000009, 0x0000000B, 0x00040020,\n    0x00000291, 0x00000009, 0x00000014, 0x00040020, 0x00000292, 0x00000001,\n    0x00000014, 0x0004003B, 0x00000292, 0x00000F48, 0x00000001, 0x0006002C,\n    0x00000014, 0x00000A2B, 0x00000A13, 0x00000A0A, 0x00000A0A, 0x00040017,\n    0x0000000F, 0x00000009, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A16,\n    0x00000004, 0x0003001D, 0x000007DC, 0x00000017, 0x0003001E, 0x000007B4,\n    0x000007DC, 0x00040020, 0x00000A31, 0x00000002, 0x000007B4, 0x0004003B,\n    0x00000A31, 0x0000107A, 0x00000002, 0x00040020, 0x00000294, 0x00000002,\n    0x00000017, 0x0003001D, 0x000007DD, 0x00000017, 0x0003001E, 0x000007B5,\n    0x000007DD, 0x00040020, 0x00000A32, 0x00000002, 0x000007B5, 0x0004003B,\n    0x00000A32, 0x0000140E, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A6A,\n    0x00000020, 0x0006002C, 0x00000014, 0x00000BC3, 0x00000A16, 0x00000A6A,\n    0x00000A0D, 0x0007002C, 0x00000017, 0x000009CE, 0x000008A6, 0x000008A6,\n    0x000008A6, 0x000008A6, 0x0007002C, 0x00000017, 0x0000013D, 0x00000A22,\n    0x00000A22, 0x00000A22, 0x00000A22, 0x0007002C, 0x00000017, 0x0000072E,\n    0x000005FD, 0x000005FD, 0x000005FD, 0x000005FD, 0x0007002C, 0x00000017,\n    0x000002ED, 0x00000A3A, 0x00000A3A, 0x00000A3A, 0x00000A3A, 0x0007002C,\n    0x00000017, 0x00000467, 0x00000A4F, 0x00000A4F, 0x00000A4F, 0x00000A4F,\n    0x00050036, 0x00000008, 0x0000161F, 0x00000000, 0x00000502, 0x000200F8,\n    0x00003B06, 0x000300F7, 0x00004C7A, 0x00000000, 0x000300FB, 0x00000A0A,\n    0x00002E68, 0x000200F8, 0x00002E68, 0x00050041, 0x00000288, 0x000060D7,\n    0x00000CE9, 0x00000A0B, 0x0004003D, 0x0000000B, 0x00003526, 0x000060D7,\n    0x000500C7, 0x0000000B, 0x00005FDC, 0x00003526, 0x00000A0D, 0x000500AB,\n    0x00000009, 0x00004376, 0x00005FDC, 0x00000A0A, 0x000500C7, 0x0000000B,\n    0x00003028, 0x00003526, 0x00000A10, 0x000500AB, 0x00000009, 0x00004384,\n    0x00003028, 0x00000A0A, 0x000500C2, 0x0000000B, 0x00001EB0, 0x00003526,\n    0x00000A10, 0x000500C7, 0x0000000B, 0x000061E2, 0x00001EB0, 0x00000A13,\n    0x00050041, 0x00000288, 0x0000492C, 0x00000CE9, 0x00000A0E, 0x0004003D,\n    0x0000000B, 0x00005EAC, 0x0000492C, 0x00050041, 0x00000288, 0x00004EBA,\n    0x00000CE9, 0x00000A11, 0x0004003D, 0x0000000B, 0x00005788, 0x00004EBA,\n    0x00050041, 0x00000288, 0x00004EBB, 0x00000CE9, 0x00000A14, 0x0004003D,\n    0x0000000B, 0x00005789, 0x00004EBB, 0x00050041, 0x00000291, 0x00004EBC,\n    0x00000CE9, 0x00000A17, 0x0004003D, 0x00000014, 0x0000578A, 0x00004EBC,\n    0x00050041, 0x00000288, 0x00004EBD, 0x00000CE9, 0x00000A1A, 0x0004003D,\n    0x0000000B, 0x0000578B, 0x00004EBD, 0x00050041, 0x00000288, 0x00004E6E,\n    0x00000CE9, 0x00000A1D, 0x0004003D, 0x0000000B, 0x000019C2, 0x00004E6E,\n    0x0004003D, 0x00000014, 0x00002A0E, 0x00000F48, 0x000500C4, 0x00000014,\n    0x0000538B, 0x00002A0E, 0x00000A2B, 0x0007004F, 0x00000011, 0x000042F0,\n    0x0000538B, 0x0000538B, 0x00000000, 0x00000001, 0x0007004F, 0x00000011,\n    0x0000242F, 0x0000578A, 0x0000578A, 0x00000000, 0x00000001, 0x000500AE,\n    0x0000000F, 0x00004288, 0x000042F0, 0x0000242F, 0x0004009A, 0x00000009,\n    0x00006067, 0x00004288, 0x000300F7, 0x000019BA, 0x00000002, 0x000400FA,\n    0x00006067, 0x000055E8, 0x000019BA, 0x000200F8, 0x000055E8, 0x000200F9,\n    0x00004C7A, 0x000200F8, 0x000019BA, 0x0004007C, 0x00000016, 0x00005BB6,\n    0x0000538B, 0x00050051, 0x0000000B, 0x00004916, 0x0000578A, 0x00000001,\n    0x00050051, 0x0000000C, 0x00005BEB, 0x00005BB6, 0x00000000, 0x00050084,\n    0x0000000C, 0x0000591A, 0x00005BEB, 0x00000A17, 0x00050051, 0x0000000C,\n    0x000018DA, 0x00005BB6, 0x00000002, 0x0004007C, 0x0000000C, 0x000038A9,\n    0x00004916, 0x00050084, 0x0000000C, 0x00002C0F, 0x000018DA, 0x000038A9,\n    0x00050051, 0x0000000C, 0x000044BE, 0x00005BB6, 0x00000001, 0x00050080,\n    0x0000000C, 0x000056D4, 0x00002C0F, 0x000044BE, 0x0004007C, 0x0000000C,\n    0x00005785, 0x000019C2, 0x00050084, 0x0000000C, 0x00005FD7, 0x000056D4,\n    0x00005785, 0x00050080, 0x0000000C, 0x00002042, 0x0000591A, 0x00005FD7,\n    0x0004007C, 0x0000000B, 0x000028A4, 0x00002042, 0x00050080, 0x0000000B,\n    0x000038F6, 0x0000578B, 0x000028A4, 0x000400A8, 0x00000009, 0x00003014,\n    0x00004376, 0x000300F7, 0x00004A60, 0x00000002, 0x000400FA, 0x00003014,\n    0x0000260D, 0x0000426F, 0x000200F8, 0x0000260D, 0x00050051, 0x0000000B,\n    0x00004437, 0x0000538B, 0x00000000, 0x00050051, 0x0000000B, 0x00002BEE,\n    0x0000538B, 0x00000001, 0x00050051, 0x0000000B, 0x00004971, 0x0000538B,\n    0x00000002, 0x00050084, 0x0000000B, 0x000039EF, 0x00005789, 0x00004971,\n    0x00050080, 0x0000000B, 0x00004F62, 0x00002BEE, 0x000039EF, 0x00050084,\n    0x0000000B, 0x000054AC, 0x00005788, 0x00004F62, 0x00050080, 0x0000000B,\n    0x00004FAE, 0x00004437, 0x000054AC, 0x000500C4, 0x0000000B, 0x00002C67,\n    0x00004FAE, 0x00000A10, 0x000200F9, 0x00004A60, 0x000200F8, 0x0000426F,\n    0x000300F7, 0x00005BF0, 0x00000002, 0x000400FA, 0x00004384, 0x00002C92,\n    0x00005F21, 0x000200F8, 0x00002C92, 0x000500C2, 0x0000000B, 0x00005374,\n    0x00005788, 0x00000A1A, 0x000500C2, 0x0000000B, 0x000035EC, 0x00005789,\n    0x00000A17, 0x000500C3, 0x0000000C, 0x000033B5, 0x000018DA, 0x00000A11,\n    0x0004007C, 0x0000000C, 0x00005766, 0x000035EC, 0x00050084, 0x0000000C,\n    0x000061FD, 0x000033B5, 0x00005766, 0x000500C3, 0x0000000C, 0x00002D62,\n    0x000044BE, 0x00000A17, 0x00050080, 0x0000000C, 0x0000411E, 0x000061FD,\n    0x00002D62, 0x0004007C, 0x0000000C, 0x00004A78, 0x00005374, 0x00050084,\n    0x0000000C, 0x000032DC, 0x0000411E, 0x00004A78, 0x000500C3, 0x0000000C,\n    0x000032BA, 0x00005BEB, 0x00000A1A, 0x00050080, 0x0000000C, 0x00005FEE,\n    0x000032DC, 0x000032BA, 0x000500C4, 0x0000000C, 0x0000225D, 0x00005FEE,\n    0x00000A20, 0x000500C7, 0x0000000C, 0x00002CAA, 0x000018DA, 0x00000A14,\n    0x000500C4, 0x0000000C, 0x00004CAE, 0x00002CAA, 0x00000A1A, 0x000500C3,\n    0x0000000C, 0x0000383E, 0x000044BE, 0x00000A0E, 0x000500C7, 0x0000000C,\n    0x00005375, 0x0000383E, 0x00000A14, 0x000500C4, 0x0000000C, 0x000054CA,\n    0x00005375, 0x00000A14, 0x000500C5, 0x0000000C, 0x000042CE, 0x00004CAE,\n    0x000054CA, 0x000500C7, 0x0000000C, 0x000050D5, 0x00005BEB, 0x00000A20,\n    0x000500C5, 0x0000000C, 0x00003ADD, 0x000042CE, 0x000050D5, 0x000500C5,\n    0x0000000C, 0x000043B6, 0x0000225D, 0x00003ADD, 0x000500C4, 0x0000000C,\n    0x00005E50, 0x000043B6, 0x00000A10, 0x000500C3, 0x0000000C, 0x000032D7,\n    0x000044BE, 0x00000A14, 0x000500C6, 0x0000000C, 0x000026C9, 0x000032D7,\n    0x000033B5, 0x000500C7, 0x0000000C, 0x00004199, 0x000026C9, 0x00000A0E,\n    0x000500C3, 0x0000000C, 0x00002590, 0x00005BEB, 0x00000A14, 0x000500C7,\n    0x0000000C, 0x0000505E, 0x00002590, 0x00000A14, 0x000500C4, 0x0000000C,\n    0x0000541D, 0x00004199, 0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BA,\n    0x0000505E, 0x0000541D, 0x000500C7, 0x0000000C, 0x00005076, 0x000044BE,\n    0x00000A0E, 0x000500C4, 0x0000000C, 0x00005228, 0x00005076, 0x00000A17,\n    0x000500C4, 0x0000000C, 0x00001997, 0x000022BA, 0x00000A1D, 0x000500C5,\n    0x0000000C, 0x000047FE, 0x00005228, 0x00001997, 0x000500C4, 0x0000000C,\n    0x00001C00, 0x00004199, 0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C81,\n    0x000047FE, 0x00001C00, 0x000500C7, 0x0000000C, 0x000050AF, 0x00005E50,\n    0x00000A38, 0x000500C5, 0x0000000C, 0x00003C70, 0x00003C81, 0x000050AF,\n    0x000500C3, 0x0000000C, 0x00003745, 0x00005E50, 0x00000A17, 0x000500C7,\n    0x0000000C, 0x000018B8, 0x00003745, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x0000547E, 0x000018B8, 0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A8,\n    0x00003C70, 0x0000547E, 0x000500C3, 0x0000000C, 0x00003A6E, 0x00005E50,\n    0x00000A1A, 0x000500C7, 0x0000000C, 0x000018B9, 0x00003A6E, 0x00000A20,\n    0x000500C4, 0x0000000C, 0x0000547F, 0x000018B9, 0x00000A23, 0x000500C5,\n    0x0000000C, 0x0000456F, 0x000045A8, 0x0000547F, 0x000500C3, 0x0000000C,\n    0x00003C88, 0x00005E50, 0x00000A23, 0x000500C4, 0x0000000C, 0x00002824,\n    0x00003C88, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B79, 0x0000456F,\n    0x00002824, 0x0004007C, 0x0000000B, 0x000041E5, 0x00003B79, 0x000200F9,\n    0x00005BF0, 0x000200F8, 0x00005F21, 0x0004007C, 0x00000012, 0x000059D8,\n    0x000042F0, 0x000500C2, 0x0000000B, 0x00005668, 0x00005788, 0x00000A1A,\n    0x00050051, 0x0000000C, 0x00003905, 0x000059D8, 0x00000001, 0x000500C3,\n    0x0000000C, 0x00002F39, 0x00003905, 0x00000A1A, 0x0004007C, 0x0000000C,\n    0x00005780, 0x00005668, 0x00050084, 0x0000000C, 0x00001F02, 0x00002F39,\n    0x00005780, 0x00050051, 0x0000000C, 0x00006242, 0x000059D8, 0x00000000,\n    0x000500C3, 0x0000000C, 0x00004FC7, 0x00006242, 0x00000A1A, 0x00050080,\n    0x0000000C, 0x000049B0, 0x00001F02, 0x00004FC7, 0x000500C4, 0x0000000C,\n    0x0000254A, 0x000049B0, 0x00000A1D, 0x000500C3, 0x0000000C, 0x0000603B,\n    0x00003905, 0x00000A0E, 0x000500C7, 0x0000000C, 0x0000539A, 0x0000603B,\n    0x00000A20, 0x000500C4, 0x0000000C, 0x0000534A, 0x0000539A, 0x00000A14,\n    0x000500C7, 0x0000000C, 0x00004EA5, 0x00006242, 0x00000A20, 0x000500C5,\n    0x0000000C, 0x00002B1A, 0x0000534A, 0x00004EA5, 0x000500C5, 0x0000000C,\n    0x000043B7, 0x0000254A, 0x00002B1A, 0x000500C4, 0x0000000C, 0x00005E63,\n    0x000043B7, 0x00000A10, 0x000500C3, 0x0000000C, 0x000031DE, 0x00003905,\n    0x00000A17, 0x000500C7, 0x0000000C, 0x00005447, 0x000031DE, 0x00000A0E,\n    0x000500C3, 0x0000000C, 0x000028A6, 0x00006242, 0x00000A14, 0x000500C7,\n    0x0000000C, 0x0000511E, 0x000028A6, 0x00000A14, 0x000500C3, 0x0000000C,\n    0x000028B9, 0x00003905, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000505F,\n    0x000028B9, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000541E, 0x0000505F,\n    0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BB, 0x0000511E, 0x0000541E,\n    0x000500C7, 0x0000000C, 0x00005077, 0x00003905, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x00005229, 0x00005077, 0x00000A17, 0x000500C4, 0x0000000C,\n    0x00001998, 0x000022BB, 0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FF,\n    0x00005229, 0x00001998, 0x000500C4, 0x0000000C, 0x00001C01, 0x00005447,\n    0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C82, 0x000047FF, 0x00001C01,\n    0x000500C7, 0x0000000C, 0x000050B0, 0x00005E63, 0x00000A38, 0x000500C5,\n    0x0000000C, 0x00003C71, 0x00003C82, 0x000050B0, 0x000500C3, 0x0000000C,\n    0x00003746, 0x00005E63, 0x00000A17, 0x000500C7, 0x0000000C, 0x000018BA,\n    0x00003746, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005480, 0x000018BA,\n    0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A9, 0x00003C71, 0x00005480,\n    0x000500C3, 0x0000000C, 0x00003A6F, 0x00005E63, 0x00000A1A, 0x000500C7,\n    0x0000000C, 0x000018BB, 0x00003A6F, 0x00000A20, 0x000500C4, 0x0000000C,\n    0x00005481, 0x000018BB, 0x00000A23, 0x000500C5, 0x0000000C, 0x00004570,\n    0x000045A9, 0x00005481, 0x000500C3, 0x0000000C, 0x00003C89, 0x00005E63,\n    0x00000A23, 0x000500C4, 0x0000000C, 0x00002825, 0x00003C89, 0x00000A2F,\n    0x000500C5, 0x0000000C, 0x00003B7A, 0x00004570, 0x00002825, 0x0004007C,\n    0x0000000B, 0x000041E6, 0x00003B7A, 0x000200F9, 0x00005BF0, 0x000200F8,\n    0x00005BF0, 0x000700F5, 0x0000000B, 0x0000292C, 0x000041E5, 0x00002C92,\n    0x000041E6, 0x00005F21, 0x000200F9, 0x00004A60, 0x000200F8, 0x00004A60,\n    0x000700F5, 0x0000000B, 0x00002C70, 0x00002C67, 0x0000260D, 0x0000292C,\n    0x00005BF0, 0x00050080, 0x0000000B, 0x000048BD, 0x00002C70, 0x00005EAC,\n    0x000500C2, 0x0000000B, 0x00003D52, 0x000048BD, 0x00000A17, 0x00060041,\n    0x00000294, 0x00004FAF, 0x0000107A, 0x00000A0B, 0x00003D52, 0x0004003D,\n    0x00000017, 0x00001CAA, 0x00004FAF, 0x000500AA, 0x00000009, 0x000035C0,\n    0x000061E2, 0x00000A0D, 0x000500AA, 0x00000009, 0x00005376, 0x000061E2,\n    0x00000A10, 0x000500A6, 0x00000009, 0x00005686, 0x000035C0, 0x00005376,\n    0x000300F7, 0x00003463, 0x00000000, 0x000400FA, 0x00005686, 0x00002957,\n    0x00003463, 0x000200F8, 0x00002957, 0x000500C7, 0x00000017, 0x0000475F,\n    0x00001CAA, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D1, 0x0000475F,\n    0x0000013D, 0x000500C7, 0x00000017, 0x000050AC, 0x00001CAA, 0x0000072E,\n    0x000500C2, 0x00000017, 0x0000448D, 0x000050AC, 0x0000013D, 0x000500C5,\n    0x00000017, 0x00003FF8, 0x000024D1, 0x0000448D, 0x000200F9, 0x00003463,\n    0x000200F8, 0x00003463, 0x000700F5, 0x00000017, 0x00005879, 0x00001CAA,\n    0x00004A60, 0x00003FF8, 0x00002957, 0x000500AA, 0x00000009, 0x00004CB6,\n    0x000061E2, 0x00000A13, 0x000500A6, 0x00000009, 0x00003B23, 0x00005376,\n    0x00004CB6, 0x000300F7, 0x0000362B, 0x00000000, 0x000400FA, 0x00003B23,\n    0x00002B38, 0x0000362B, 0x000200F8, 0x00002B38, 0x000500C4, 0x00000017,\n    0x00005E17, 0x00005879, 0x000002ED, 0x000500C2, 0x00000017, 0x00003BE7,\n    0x00005879, 0x000002ED, 0x000500C5, 0x00000017, 0x000029E8, 0x00005E17,\n    0x00003BE7, 0x000200F9, 0x0000362B, 0x000200F8, 0x0000362B, 0x000700F5,\n    0x00000017, 0x00004A55, 0x00005879, 0x00003463, 0x000029E8, 0x00002B38,\n    0x000500C2, 0x0000000B, 0x00001EB9, 0x000038F6, 0x00000A17, 0x000500C2,\n    0x00000017, 0x00003A0E, 0x00004A55, 0x0000013D, 0x000500C2, 0x00000017,\n    0x00004F86, 0x00003A0E, 0x00000467, 0x00050080, 0x00000017, 0x00002C6F,\n    0x00003A0E, 0x00004F86, 0x00040070, 0x0000001D, 0x00005378, 0x00002C6F,\n    0x0005008E, 0x0000001D, 0x000054F4, 0x00005378, 0x00000B3A, 0x0004007C,\n    0x00000017, 0x00002FFF, 0x000054F4, 0x00060041, 0x00000294, 0x00005E39,\n    0x0000140E, 0x00000A0B, 0x00001EB9, 0x0003003E, 0x00005E39, 0x00002FFF,\n    0x00050080, 0x0000000B, 0x000054B5, 0x000038F6, 0x00000A3A, 0x000300F7,\n    0x00006070, 0x00000002, 0x000400FA, 0x00004376, 0x000055E9, 0x00001C25,\n    0x000200F8, 0x000055E9, 0x000200F9, 0x00006070, 0x000200F8, 0x00001C25,\n    0x000200F9, 0x00006070, 0x000200F8, 0x00006070, 0x000700F5, 0x0000000B,\n    0x00002C71, 0x00000A6A, 0x000055E9, 0x00000A3A, 0x00001C25, 0x00050080,\n    0x0000000B, 0x000048BE, 0x000048BD, 0x00002C71, 0x000500C2, 0x0000000B,\n    0x00003D53, 0x000048BE, 0x00000A17, 0x00060041, 0x00000294, 0x00005566,\n    0x0000107A, 0x00000A0B, 0x00003D53, 0x0004003D, 0x00000017, 0x00003910,\n    0x00005566, 0x000300F7, 0x00003A1A, 0x00000000, 0x000400FA, 0x00005686,\n    0x00002958, 0x00003A1A, 0x000200F8, 0x00002958, 0x000500C7, 0x00000017,\n    0x00004760, 0x00003910, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D2,\n    0x00004760, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AD, 0x00003910,\n    0x0000072E, 0x000500C2, 0x00000017, 0x0000448E, 0x000050AD, 0x0000013D,\n    0x000500C5, 0x00000017, 0x00003FF9, 0x000024D2, 0x0000448E, 0x000200F9,\n    0x00003A1A, 0x000200F8, 0x00003A1A, 0x000700F5, 0x00000017, 0x00002AAC,\n    0x00003910, 0x00006070, 0x00003FF9, 0x00002958, 0x000300F7, 0x0000362C,\n    0x00000000, 0x000400FA, 0x00003B23, 0x00002B39, 0x0000362C, 0x000200F8,\n    0x00002B39, 0x000500C4, 0x00000017, 0x00005E18, 0x00002AAC, 0x000002ED,\n    0x000500C2, 0x00000017, 0x00003BE8, 0x00002AAC, 0x000002ED, 0x000500C5,\n    0x00000017, 0x000029E9, 0x00005E18, 0x00003BE8, 0x000200F9, 0x0000362C,\n    0x000200F8, 0x0000362C, 0x000700F5, 0x00000017, 0x00004A56, 0x00002AAC,\n    0x00003A1A, 0x000029E9, 0x00002B39, 0x000500C2, 0x0000000B, 0x00001EBA,\n    0x000054B5, 0x00000A17, 0x000500C2, 0x00000017, 0x00003A0F, 0x00004A56,\n    0x0000013D, 0x000500C2, 0x00000017, 0x00004F87, 0x00003A0F, 0x00000467,\n    0x00050080, 0x00000017, 0x00002C72, 0x00003A0F, 0x00004F87, 0x00040070,\n    0x0000001D, 0x00005379, 0x00002C72, 0x0005008E, 0x0000001D, 0x000054F5,\n    0x00005379, 0x00000B3A, 0x0004007C, 0x00000017, 0x00003000, 0x000054F5,\n    0x00060041, 0x00000294, 0x00001CB5, 0x0000140E, 0x00000A0B, 0x00001EBA,\n    0x0003003E, 0x00001CB5, 0x00003000, 0x000200F9, 0x00004C7A, 0x000200F8,\n    0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_depth_unorm_scaled_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25157\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n     %v4uint = OpTypeVector %uint 4\n      %float = OpTypeFloat 32\n    %v4float = OpTypeVector %float 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v3uint = OpTypeVector %uint 3\n    %uint_23 = OpConstant %uint 23\n%float_5_96046448en08 = OpConstant %float 5.96046448e-08\n     %uint_1 = OpConstant %uint 1\n     %uint_2 = OpConstant %uint 2\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n     %uint_3 = OpConstant %uint 3\n    %uint_16 = OpConstant %uint 16\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n     %uint_0 = OpConstant %uint 0\n      %int_3 = OpConstant %int 3\n      %int_2 = OpConstant %int 2\n     %uint_4 = OpConstant %uint 4\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n     %uint_7 = OpConstant %uint 7\n       %1927 = OpConstantComposite %v2uint %uint_4 %uint_7\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %2603 = OpConstantComposite %v3uint %uint_3 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n    %uint_32 = OpConstant %uint 32\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %1954 = OpConstantComposite %v2uint %uint_7 %uint_7\n       %1855 = OpConstantComposite %v2uint %uint_4 %uint_1\n     %uint_6 = OpConstant %uint 6\n    %uint_15 = OpConstant %uint 15\n       %1955 = OpConstantComposite %v2uint %uint_15 %uint_1\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n       %1127 = OpConstantComposite %v4uint %uint_23 %uint_23 %uint_23 %uint_23\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24445 = OpBitwiseAnd %uint %13606 %uint_2\n      %18667 = OpINotEqual %bool %24445 %uint_0\n       %8141 = OpShiftRightLogical %uint %13606 %uint_2\n      %24990 = OpBitwiseAnd %uint %8141 %uint_3\n       %8871 = OpCompositeConstruct %v2uint %13606 %13606\n       %7087 = OpShiftRightLogical %v2uint %8871 %1927\n       %6551 = OpBitwiseAnd %v2uint %7087 %1954\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2603\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %6586 DontFlatten\n               OpBranchConditional %24679 %21992 %6586\n      %21992 = OpLabel\n               OpBranch %19578\n       %6586 = OpLabel\n      %23478 = OpBitcast %v3int %21387\n      %18710 = OpCompositeExtract %uint %22410 1\n      %23531 = OpCompositeExtract %int %23478 0\n      %22810 = OpIMul %int %23531 %int_4\n       %6362 = OpCompositeExtract %int %23478 2\n      %14505 = OpBitcast %int %18710\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %23478 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %6594\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %22810 %24535\n      %10898 = OpBitcast %uint %8258\n       %7937 = OpIAdd %uint %22411 %10898\n      %19921 = OpShiftRightLogical %v2uint %17136 %1855\n       %7712 = OpUDiv %v2uint %19921 %6551\n      %18183 = OpIMul %v2uint %6551 %7712\n      %18273 = OpISub %v2uint %19921 %18183\n      %11232 = OpShiftLeftLogical %v2uint %7712 %1855\n      %13284 = OpCompositeExtract %uint %18273 0\n      %10872 = OpCompositeExtract %uint %6551 1\n      %22886 = OpIMul %uint %13284 %10872\n       %6943 = OpCompositeExtract %uint %18273 1\n      %10469 = OpIAdd %uint %22886 %6943\n      %18851 = OpBitwiseAnd %v2uint %17136 %1955\n      %10581 = OpShiftLeftLogical %uint %10469 %uint_7\n      %20916 = OpCompositeExtract %uint %18851 1\n      %23596 = OpShiftLeftLogical %uint %20916 %uint_6\n      %19814 = OpBitwiseOr %uint %10581 %23596\n      %21476 = OpCompositeExtract %uint %18851 0\n       %8560 = OpShiftLeftLogical %uint %21476 %uint_2\n      %17648 = OpBitwiseOr %uint %19814 %8560\n      %19923 = OpCompositeExtract %uint %11232 0\n      %15556 = OpCompositeInsert %v3uint %19923 %21387 0\n      %23006 = OpCompositeExtract %uint %11232 1\n       %9680 = OpCompositeInsert %v3uint %23006 %15556 1\n               OpSelectionMerge %20344 DontFlatten\n               OpBranchConditional %18667 %23520 %11737\n      %23520 = OpLabel\n      %10111 = OpBitcast %v3int %9680\n      %19476 = OpShiftRightLogical %uint %22408 %int_5\n      %18810 = OpShiftRightLogical %uint %22409 %int_4\n       %6782 = OpCompositeExtract %int %10111 2\n      %12089 = OpShiftRightArithmetic %int %6782 %int_2\n      %22400 = OpBitcast %int %18810\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %10111 1\n      %19055 = OpShiftRightArithmetic %int %25154 %int_4\n      %11052 = OpIAdd %int %7938 %19055\n      %16898 = OpBitcast %int %19476\n      %14944 = OpIMul %int %11052 %16898\n      %25155 = OpCompositeExtract %int %10111 0\n      %20423 = OpShiftRightArithmetic %int %25155 %int_5\n      %18940 = OpIAdd %int %14944 %20423\n       %8797 = OpShiftLeftLogical %int %18940 %int_7\n      %11434 = OpBitwiseAnd %int %6782 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %25154 %int_1\n      %21364 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21364 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %25155 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17334 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17334 %uint_2\n      %13015 = OpShiftRightArithmetic %int %25154 %int_3\n       %9929 = OpBitwiseXor %int %13015 %12089\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %25155 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %25154 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6552 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6552\n       %7168 = OpShiftLeftLogical %int %16793 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24144 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24144 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24144 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24144 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %20344\n      %11737 = OpLabel\n      %11908 = OpVectorShuffle %v2uint %9680 %9680 0 1\n      %20347 = OpBitcast %v2int %11908\n      %11433 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %20347 1\n      %12090 = OpShiftRightArithmetic %int %14597 %int_5\n      %22401 = OpBitcast %int %11433\n       %7939 = OpIMul %int %12090 %22401\n      %25156 = OpCompositeExtract %int %20347 0\n      %20424 = OpShiftRightArithmetic %int %25156 %int_5\n      %18864 = OpIAdd %int %7939 %20424\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25156 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17335 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17335 %uint_2\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25156 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6553 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6553\n       %7169 = OpShiftLeftLogical %int %21575 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24163 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24163 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24163 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %20344\n      %20344 = OpLabel\n      %18329 = OpPhi %uint %16869 %23520 %16870 %11737\n      %15200 = OpCompositeExtract %uint %6551 0\n      %17489 = OpIMul %uint %15200 %10872\n       %7313 = OpIMul %uint %18329 %17489\n       %8815 = OpIAdd %uint %7313 %17648\n      %21470 = OpIAdd %uint %8815 %24236\n      %14664 = OpShiftRightLogical %uint %21470 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %14664\n       %7338 = OpLoad %v4uint %20399\n      %13760 = OpIEqual %bool %24990 %uint_1\n      %21366 = OpIEqual %bool %24990 %uint_2\n      %22150 = OpLogicalOr %bool %13760 %21366\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %7338 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %7338 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22649 = OpPhi %v4uint %7338 %20344 %16376 %10583\n      %19638 = OpIEqual %bool %24990 %uint_3\n      %15139 = OpLogicalOr %bool %21366 %19638\n               OpSelectionMerge %13867 None\n               OpBranchConditional %15139 %11064 %13867\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22649 %749\n      %15335 = OpShiftRightLogical %v4uint %22649 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %13867\n      %13867 = OpLabel\n      %19029 = OpPhi %v4uint %22649 %13411 %10728 %11064\n       %7865 = OpShiftRightLogical %uint %7937 %int_4\n      %14862 = OpShiftRightLogical %v4uint %19029 %317\n      %20358 = OpShiftRightLogical %v4uint %14862 %1127\n      %11375 = OpIAdd %v4uint %14862 %20358\n      %21368 = OpConvertUToF %v4float %11375\n      %21748 = OpVectorTimesScalar %v4float %21368 %float_5_96046448en08\n      %12287 = OpBitcast %v4uint %21748\n      %24121 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %7865\n               OpStore %24121 %12287\n      %22137 = OpIAdd %uint %7937 %uint_16\n      %10214 = OpIAdd %uint %21470 %uint_16\n      %14665 = OpShiftRightLogical %uint %10214 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %14665\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %14874 None\n               OpBranchConditional %22150 %10584 %14874\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %14874\n      %14874 = OpLabel\n      %10924 = OpPhi %v4uint %14608 %13867 %16377 %10584\n               OpSelectionMerge %13868 None\n               OpBranchConditional %15139 %11065 %13868\n      %11065 = OpLabel\n      %24088 = OpShiftLeftLogical %v4uint %10924 %749\n      %15336 = OpShiftRightLogical %v4uint %10924 %749\n      %10729 = OpBitwiseOr %v4uint %24088 %15336\n               OpBranch %13868\n      %13868 = OpLabel\n      %19030 = OpPhi %v4uint %10924 %14874 %10729 %11065\n       %7866 = OpShiftRightLogical %uint %22137 %int_4\n      %14863 = OpShiftRightLogical %v4uint %19030 %317\n      %20359 = OpShiftRightLogical %v4uint %14863 %1127\n      %11376 = OpIAdd %v4uint %14863 %20359\n      %21369 = OpConvertUToF %v4float %11376\n      %21749 = OpVectorTimesScalar %v4float %21369 %float_5_96046448en08\n      %12288 = OpBitcast %v4uint %21749\n       %7349 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %7866\n               OpStore %7349 %12288\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_depth_unorm_scaled_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006245, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000017,\n    0x0000000B, 0x00000004, 0x00030016, 0x0000000D, 0x00000020, 0x00040017,\n    0x0000001D, 0x0000000D, 0x00000004, 0x00040015, 0x0000000C, 0x00000020,\n    0x00000001, 0x00040017, 0x00000012, 0x0000000C, 0x00000002, 0x00040017,\n    0x00000016, 0x0000000C, 0x00000003, 0x00020014, 0x00000009, 0x00040017,\n    0x00000014, 0x0000000B, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A4F,\n    0x00000017, 0x0004002B, 0x0000000D, 0x00000B3A, 0x33800000, 0x0004002B,\n    0x0000000B, 0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B, 0x00000A10,\n    0x00000002, 0x0004002B, 0x0000000B, 0x000008A6, 0x00FF00FF, 0x0004002B,\n    0x0000000B, 0x00000A22, 0x00000008, 0x0004002B, 0x0000000B, 0x000005FD,\n    0xFF00FF00, 0x0004002B, 0x0000000B, 0x00000A13, 0x00000003, 0x0004002B,\n    0x0000000B, 0x00000A3A, 0x00000010, 0x0004002B, 0x0000000C, 0x00000A17,\n    0x00000004, 0x0004002B, 0x0000000C, 0x00000A1D, 0x00000006, 0x0004002B,\n    0x0000000C, 0x00000A2C, 0x0000000B, 0x0004002B, 0x0000000C, 0x00000A38,\n    0x0000000F, 0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001, 0x0004002B,\n    0x0000000C, 0x00000A1A, 0x00000005, 0x0004002B, 0x0000000C, 0x00000A20,\n    0x00000007, 0x0004002B, 0x0000000C, 0x00000A23, 0x00000008, 0x0004002B,\n    0x0000000C, 0x00000A2F, 0x0000000C, 0x0004002B, 0x0000000B, 0x00000A0A,\n    0x00000000, 0x0004002B, 0x0000000C, 0x00000A14, 0x00000003, 0x0004002B,\n    0x0000000C, 0x00000A11, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A16,\n    0x00000004, 0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000, 0x000A001E,\n    0x00000489, 0x0000000B, 0x0000000B, 0x0000000B, 0x0000000B, 0x00000014,\n    0x0000000B, 0x0000000B, 0x0000000B, 0x00040020, 0x00000706, 0x00000009,\n    0x00000489, 0x0004003B, 0x00000706, 0x00000CE9, 0x00000009, 0x00040020,\n    0x00000288, 0x00000009, 0x0000000B, 0x0004002B, 0x0000000B, 0x00000A1F,\n    0x00000007, 0x0005002C, 0x00000011, 0x00000787, 0x00000A16, 0x00000A1F,\n    0x00040020, 0x00000291, 0x00000009, 0x00000014, 0x00040020, 0x00000292,\n    0x00000001, 0x00000014, 0x0004003B, 0x00000292, 0x00000F48, 0x00000001,\n    0x0006002C, 0x00000014, 0x00000A2B, 0x00000A13, 0x00000A0A, 0x00000A0A,\n    0x00040017, 0x0000000F, 0x00000009, 0x00000002, 0x0003001D, 0x000007DC,\n    0x00000017, 0x0003001E, 0x000007B4, 0x000007DC, 0x00040020, 0x00000A31,\n    0x00000002, 0x000007B4, 0x0004003B, 0x00000A31, 0x0000107A, 0x00000002,\n    0x00040020, 0x00000294, 0x00000002, 0x00000017, 0x0003001D, 0x000007DD,\n    0x00000017, 0x0003001E, 0x000007B5, 0x000007DD, 0x00040020, 0x00000A32,\n    0x00000002, 0x000007B5, 0x0004003B, 0x00000A32, 0x0000140E, 0x00000002,\n    0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020, 0x0006002C, 0x00000014,\n    0x00000BC3, 0x00000A16, 0x00000A6A, 0x00000A0D, 0x0005002C, 0x00000011,\n    0x000007A2, 0x00000A1F, 0x00000A1F, 0x0005002C, 0x00000011, 0x0000073F,\n    0x00000A16, 0x00000A0D, 0x0004002B, 0x0000000B, 0x00000A1C, 0x00000006,\n    0x0004002B, 0x0000000B, 0x00000A37, 0x0000000F, 0x0005002C, 0x00000011,\n    0x000007A3, 0x00000A37, 0x00000A0D, 0x0007002C, 0x00000017, 0x000009CE,\n    0x000008A6, 0x000008A6, 0x000008A6, 0x000008A6, 0x0007002C, 0x00000017,\n    0x0000013D, 0x00000A22, 0x00000A22, 0x00000A22, 0x00000A22, 0x0007002C,\n    0x00000017, 0x0000072E, 0x000005FD, 0x000005FD, 0x000005FD, 0x000005FD,\n    0x0007002C, 0x00000017, 0x000002ED, 0x00000A3A, 0x00000A3A, 0x00000A3A,\n    0x00000A3A, 0x0007002C, 0x00000017, 0x00000467, 0x00000A4F, 0x00000A4F,\n    0x00000A4F, 0x00000A4F, 0x00050036, 0x00000008, 0x0000161F, 0x00000000,\n    0x00000502, 0x000200F8, 0x00003B06, 0x000300F7, 0x00004C7A, 0x00000000,\n    0x000300FB, 0x00000A0A, 0x00002E68, 0x000200F8, 0x00002E68, 0x00050041,\n    0x00000288, 0x000060D7, 0x00000CE9, 0x00000A0B, 0x0004003D, 0x0000000B,\n    0x00003526, 0x000060D7, 0x000500C7, 0x0000000B, 0x00005F7D, 0x00003526,\n    0x00000A10, 0x000500AB, 0x00000009, 0x000048EB, 0x00005F7D, 0x00000A0A,\n    0x000500C2, 0x0000000B, 0x00001FCD, 0x00003526, 0x00000A10, 0x000500C7,\n    0x0000000B, 0x0000619E, 0x00001FCD, 0x00000A13, 0x00050050, 0x00000011,\n    0x000022A7, 0x00003526, 0x00003526, 0x000500C2, 0x00000011, 0x00001BAF,\n    0x000022A7, 0x00000787, 0x000500C7, 0x00000011, 0x00001997, 0x00001BAF,\n    0x000007A2, 0x00050041, 0x00000288, 0x0000492C, 0x00000CE9, 0x00000A0E,\n    0x0004003D, 0x0000000B, 0x00005EAC, 0x0000492C, 0x00050041, 0x00000288,\n    0x00004EBA, 0x00000CE9, 0x00000A11, 0x0004003D, 0x0000000B, 0x00005788,\n    0x00004EBA, 0x00050041, 0x00000288, 0x00004EBB, 0x00000CE9, 0x00000A14,\n    0x0004003D, 0x0000000B, 0x00005789, 0x00004EBB, 0x00050041, 0x00000291,\n    0x00004EBC, 0x00000CE9, 0x00000A17, 0x0004003D, 0x00000014, 0x0000578A,\n    0x00004EBC, 0x00050041, 0x00000288, 0x00004EBD, 0x00000CE9, 0x00000A1A,\n    0x0004003D, 0x0000000B, 0x0000578B, 0x00004EBD, 0x00050041, 0x00000288,\n    0x00004E6E, 0x00000CE9, 0x00000A1D, 0x0004003D, 0x0000000B, 0x000019C2,\n    0x00004E6E, 0x0004003D, 0x00000014, 0x00002A0E, 0x00000F48, 0x000500C4,\n    0x00000014, 0x0000538B, 0x00002A0E, 0x00000A2B, 0x0007004F, 0x00000011,\n    0x000042F0, 0x0000538B, 0x0000538B, 0x00000000, 0x00000001, 0x0007004F,\n    0x00000011, 0x0000242F, 0x0000578A, 0x0000578A, 0x00000000, 0x00000001,\n    0x000500AE, 0x0000000F, 0x00004288, 0x000042F0, 0x0000242F, 0x0004009A,\n    0x00000009, 0x00006067, 0x00004288, 0x000300F7, 0x000019BA, 0x00000002,\n    0x000400FA, 0x00006067, 0x000055E8, 0x000019BA, 0x000200F8, 0x000055E8,\n    0x000200F9, 0x00004C7A, 0x000200F8, 0x000019BA, 0x0004007C, 0x00000016,\n    0x00005BB6, 0x0000538B, 0x00050051, 0x0000000B, 0x00004916, 0x0000578A,\n    0x00000001, 0x00050051, 0x0000000C, 0x00005BEB, 0x00005BB6, 0x00000000,\n    0x00050084, 0x0000000C, 0x0000591A, 0x00005BEB, 0x00000A17, 0x00050051,\n    0x0000000C, 0x000018DA, 0x00005BB6, 0x00000002, 0x0004007C, 0x0000000C,\n    0x000038A9, 0x00004916, 0x00050084, 0x0000000C, 0x00002C0F, 0x000018DA,\n    0x000038A9, 0x00050051, 0x0000000C, 0x000044BE, 0x00005BB6, 0x00000001,\n    0x00050080, 0x0000000C, 0x000056D4, 0x00002C0F, 0x000044BE, 0x0004007C,\n    0x0000000C, 0x00005785, 0x000019C2, 0x00050084, 0x0000000C, 0x00005FD7,\n    0x000056D4, 0x00005785, 0x00050080, 0x0000000C, 0x00002042, 0x0000591A,\n    0x00005FD7, 0x0004007C, 0x0000000B, 0x00002A92, 0x00002042, 0x00050080,\n    0x0000000B, 0x00001F01, 0x0000578B, 0x00002A92, 0x000500C2, 0x00000011,\n    0x00004DD1, 0x000042F0, 0x0000073F, 0x00050086, 0x00000011, 0x00001E20,\n    0x00004DD1, 0x00001997, 0x00050084, 0x00000011, 0x00004707, 0x00001997,\n    0x00001E20, 0x00050082, 0x00000011, 0x00004761, 0x00004DD1, 0x00004707,\n    0x000500C4, 0x00000011, 0x00002BE0, 0x00001E20, 0x0000073F, 0x00050051,\n    0x0000000B, 0x000033E4, 0x00004761, 0x00000000, 0x00050051, 0x0000000B,\n    0x00002A78, 0x00001997, 0x00000001, 0x00050084, 0x0000000B, 0x00005966,\n    0x000033E4, 0x00002A78, 0x00050051, 0x0000000B, 0x00001B1F, 0x00004761,\n    0x00000001, 0x00050080, 0x0000000B, 0x000028E5, 0x00005966, 0x00001B1F,\n    0x000500C7, 0x00000011, 0x000049A3, 0x000042F0, 0x000007A3, 0x000500C4,\n    0x0000000B, 0x00002955, 0x000028E5, 0x00000A1F, 0x00050051, 0x0000000B,\n    0x000051B4, 0x000049A3, 0x00000001, 0x000500C4, 0x0000000B, 0x00005C2C,\n    0x000051B4, 0x00000A1C, 0x000500C5, 0x0000000B, 0x00004D66, 0x00002955,\n    0x00005C2C, 0x00050051, 0x0000000B, 0x000053E4, 0x000049A3, 0x00000000,\n    0x000500C4, 0x0000000B, 0x00002170, 0x000053E4, 0x00000A10, 0x000500C5,\n    0x0000000B, 0x000044F0, 0x00004D66, 0x00002170, 0x00050051, 0x0000000B,\n    0x00004DD3, 0x00002BE0, 0x00000000, 0x00060052, 0x00000014, 0x00003CC4,\n    0x00004DD3, 0x0000538B, 0x00000000, 0x00050051, 0x0000000B, 0x000059DE,\n    0x00002BE0, 0x00000001, 0x00060052, 0x00000014, 0x000025D0, 0x000059DE,\n    0x00003CC4, 0x00000001, 0x000300F7, 0x00004F78, 0x00000002, 0x000400FA,\n    0x000048EB, 0x00005BE0, 0x00002DD9, 0x000200F8, 0x00005BE0, 0x0004007C,\n    0x00000016, 0x0000277F, 0x000025D0, 0x000500C2, 0x0000000B, 0x00004C14,\n    0x00005788, 0x00000A1A, 0x000500C2, 0x0000000B, 0x0000497A, 0x00005789,\n    0x00000A17, 0x00050051, 0x0000000C, 0x00001A7E, 0x0000277F, 0x00000002,\n    0x000500C3, 0x0000000C, 0x00002F39, 0x00001A7E, 0x00000A11, 0x0004007C,\n    0x0000000C, 0x00005780, 0x0000497A, 0x00050084, 0x0000000C, 0x00001F02,\n    0x00002F39, 0x00005780, 0x00050051, 0x0000000C, 0x00006242, 0x0000277F,\n    0x00000001, 0x000500C3, 0x0000000C, 0x00004A6F, 0x00006242, 0x00000A17,\n    0x00050080, 0x0000000C, 0x00002B2C, 0x00001F02, 0x00004A6F, 0x0004007C,\n    0x0000000C, 0x00004202, 0x00004C14, 0x00050084, 0x0000000C, 0x00003A60,\n    0x00002B2C, 0x00004202, 0x00050051, 0x0000000C, 0x00006243, 0x0000277F,\n    0x00000000, 0x000500C3, 0x0000000C, 0x00004FC7, 0x00006243, 0x00000A1A,\n    0x00050080, 0x0000000C, 0x000049FC, 0x00003A60, 0x00004FC7, 0x000500C4,\n    0x0000000C, 0x0000225D, 0x000049FC, 0x00000A20, 0x000500C7, 0x0000000C,\n    0x00002CAA, 0x00001A7E, 0x00000A14, 0x000500C4, 0x0000000C, 0x00004CAE,\n    0x00002CAA, 0x00000A1A, 0x000500C3, 0x0000000C, 0x0000383E, 0x00006242,\n    0x00000A0E, 0x000500C7, 0x0000000C, 0x00005374, 0x0000383E, 0x00000A14,\n    0x000500C4, 0x0000000C, 0x000054CA, 0x00005374, 0x00000A14, 0x000500C5,\n    0x0000000C, 0x000042CE, 0x00004CAE, 0x000054CA, 0x000500C7, 0x0000000C,\n    0x000050D5, 0x00006243, 0x00000A20, 0x000500C5, 0x0000000C, 0x00003ADD,\n    0x000042CE, 0x000050D5, 0x000500C5, 0x0000000C, 0x000043B6, 0x0000225D,\n    0x00003ADD, 0x000500C4, 0x0000000C, 0x00005E50, 0x000043B6, 0x00000A10,\n    0x000500C3, 0x0000000C, 0x000032D7, 0x00006242, 0x00000A14, 0x000500C6,\n    0x0000000C, 0x000026C9, 0x000032D7, 0x00002F39, 0x000500C7, 0x0000000C,\n    0x00004199, 0x000026C9, 0x00000A0E, 0x000500C3, 0x0000000C, 0x00002590,\n    0x00006243, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000505E, 0x00002590,\n    0x00000A14, 0x000500C4, 0x0000000C, 0x0000541D, 0x00004199, 0x00000A0E,\n    0x000500C6, 0x0000000C, 0x000022BA, 0x0000505E, 0x0000541D, 0x000500C7,\n    0x0000000C, 0x00005076, 0x00006242, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x00005228, 0x00005076, 0x00000A17, 0x000500C4, 0x0000000C, 0x00001998,\n    0x000022BA, 0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FE, 0x00005228,\n    0x00001998, 0x000500C4, 0x0000000C, 0x00001C00, 0x00004199, 0x00000A2C,\n    0x000500C5, 0x0000000C, 0x00003C81, 0x000047FE, 0x00001C00, 0x000500C7,\n    0x0000000C, 0x000050AF, 0x00005E50, 0x00000A38, 0x000500C5, 0x0000000C,\n    0x00003C70, 0x00003C81, 0x000050AF, 0x000500C3, 0x0000000C, 0x00003745,\n    0x00005E50, 0x00000A17, 0x000500C7, 0x0000000C, 0x000018B8, 0x00003745,\n    0x00000A0E, 0x000500C4, 0x0000000C, 0x0000547E, 0x000018B8, 0x00000A1A,\n    0x000500C5, 0x0000000C, 0x000045A8, 0x00003C70, 0x0000547E, 0x000500C3,\n    0x0000000C, 0x00003A6E, 0x00005E50, 0x00000A1A, 0x000500C7, 0x0000000C,\n    0x000018B9, 0x00003A6E, 0x00000A20, 0x000500C4, 0x0000000C, 0x0000547F,\n    0x000018B9, 0x00000A23, 0x000500C5, 0x0000000C, 0x0000456F, 0x000045A8,\n    0x0000547F, 0x000500C3, 0x0000000C, 0x00003C88, 0x00005E50, 0x00000A23,\n    0x000500C4, 0x0000000C, 0x00002824, 0x00003C88, 0x00000A2F, 0x000500C5,\n    0x0000000C, 0x00003B79, 0x0000456F, 0x00002824, 0x0004007C, 0x0000000B,\n    0x000041E5, 0x00003B79, 0x000200F9, 0x00004F78, 0x000200F8, 0x00002DD9,\n    0x0007004F, 0x00000011, 0x00002E84, 0x000025D0, 0x000025D0, 0x00000000,\n    0x00000001, 0x0004007C, 0x00000012, 0x00004F7B, 0x00002E84, 0x000500C2,\n    0x0000000B, 0x00002CA9, 0x00005788, 0x00000A1A, 0x00050051, 0x0000000C,\n    0x00003905, 0x00004F7B, 0x00000001, 0x000500C3, 0x0000000C, 0x00002F3A,\n    0x00003905, 0x00000A1A, 0x0004007C, 0x0000000C, 0x00005781, 0x00002CA9,\n    0x00050084, 0x0000000C, 0x00001F03, 0x00002F3A, 0x00005781, 0x00050051,\n    0x0000000C, 0x00006244, 0x00004F7B, 0x00000000, 0x000500C3, 0x0000000C,\n    0x00004FC8, 0x00006244, 0x00000A1A, 0x00050080, 0x0000000C, 0x000049B0,\n    0x00001F03, 0x00004FC8, 0x000500C4, 0x0000000C, 0x0000254A, 0x000049B0,\n    0x00000A1D, 0x000500C3, 0x0000000C, 0x0000603B, 0x00003905, 0x00000A0E,\n    0x000500C7, 0x0000000C, 0x0000539A, 0x0000603B, 0x00000A20, 0x000500C4,\n    0x0000000C, 0x0000534A, 0x0000539A, 0x00000A14, 0x000500C7, 0x0000000C,\n    0x00004EA5, 0x00006244, 0x00000A20, 0x000500C5, 0x0000000C, 0x00002B1A,\n    0x0000534A, 0x00004EA5, 0x000500C5, 0x0000000C, 0x000043B7, 0x0000254A,\n    0x00002B1A, 0x000500C4, 0x0000000C, 0x00005E63, 0x000043B7, 0x00000A10,\n    0x000500C3, 0x0000000C, 0x000031DE, 0x00003905, 0x00000A17, 0x000500C7,\n    0x0000000C, 0x00005447, 0x000031DE, 0x00000A0E, 0x000500C3, 0x0000000C,\n    0x000028A6, 0x00006244, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000511E,\n    0x000028A6, 0x00000A14, 0x000500C3, 0x0000000C, 0x000028B9, 0x00003905,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x0000505F, 0x000028B9, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x0000541E, 0x0000505F, 0x00000A0E, 0x000500C6,\n    0x0000000C, 0x000022BB, 0x0000511E, 0x0000541E, 0x000500C7, 0x0000000C,\n    0x00005077, 0x00003905, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005229,\n    0x00005077, 0x00000A17, 0x000500C4, 0x0000000C, 0x00001999, 0x000022BB,\n    0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FF, 0x00005229, 0x00001999,\n    0x000500C4, 0x0000000C, 0x00001C01, 0x00005447, 0x00000A2C, 0x000500C5,\n    0x0000000C, 0x00003C82, 0x000047FF, 0x00001C01, 0x000500C7, 0x0000000C,\n    0x000050B0, 0x00005E63, 0x00000A38, 0x000500C5, 0x0000000C, 0x00003C71,\n    0x00003C82, 0x000050B0, 0x000500C3, 0x0000000C, 0x00003746, 0x00005E63,\n    0x00000A17, 0x000500C7, 0x0000000C, 0x000018BA, 0x00003746, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x00005480, 0x000018BA, 0x00000A1A, 0x000500C5,\n    0x0000000C, 0x000045A9, 0x00003C71, 0x00005480, 0x000500C3, 0x0000000C,\n    0x00003A6F, 0x00005E63, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018BB,\n    0x00003A6F, 0x00000A20, 0x000500C4, 0x0000000C, 0x00005481, 0x000018BB,\n    0x00000A23, 0x000500C5, 0x0000000C, 0x00004570, 0x000045A9, 0x00005481,\n    0x000500C3, 0x0000000C, 0x00003C89, 0x00005E63, 0x00000A23, 0x000500C4,\n    0x0000000C, 0x00002825, 0x00003C89, 0x00000A2F, 0x000500C5, 0x0000000C,\n    0x00003B7A, 0x00004570, 0x00002825, 0x0004007C, 0x0000000B, 0x000041E6,\n    0x00003B7A, 0x000200F9, 0x00004F78, 0x000200F8, 0x00004F78, 0x000700F5,\n    0x0000000B, 0x00004799, 0x000041E5, 0x00005BE0, 0x000041E6, 0x00002DD9,\n    0x00050051, 0x0000000B, 0x00003B60, 0x00001997, 0x00000000, 0x00050084,\n    0x0000000B, 0x00004451, 0x00003B60, 0x00002A78, 0x00050084, 0x0000000B,\n    0x00001C91, 0x00004799, 0x00004451, 0x00050080, 0x0000000B, 0x0000226F,\n    0x00001C91, 0x000044F0, 0x00050080, 0x0000000B, 0x000053DE, 0x0000226F,\n    0x00005EAC, 0x000500C2, 0x0000000B, 0x00003948, 0x000053DE, 0x00000A17,\n    0x00060041, 0x00000294, 0x00004FAF, 0x0000107A, 0x00000A0B, 0x00003948,\n    0x0004003D, 0x00000017, 0x00001CAA, 0x00004FAF, 0x000500AA, 0x00000009,\n    0x000035C0, 0x0000619E, 0x00000A0D, 0x000500AA, 0x00000009, 0x00005376,\n    0x0000619E, 0x00000A10, 0x000500A6, 0x00000009, 0x00005686, 0x000035C0,\n    0x00005376, 0x000300F7, 0x00003463, 0x00000000, 0x000400FA, 0x00005686,\n    0x00002957, 0x00003463, 0x000200F8, 0x00002957, 0x000500C7, 0x00000017,\n    0x0000475F, 0x00001CAA, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D1,\n    0x0000475F, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AC, 0x00001CAA,\n    0x0000072E, 0x000500C2, 0x00000017, 0x0000448D, 0x000050AC, 0x0000013D,\n    0x000500C5, 0x00000017, 0x00003FF8, 0x000024D1, 0x0000448D, 0x000200F9,\n    0x00003463, 0x000200F8, 0x00003463, 0x000700F5, 0x00000017, 0x00005879,\n    0x00001CAA, 0x00004F78, 0x00003FF8, 0x00002957, 0x000500AA, 0x00000009,\n    0x00004CB6, 0x0000619E, 0x00000A13, 0x000500A6, 0x00000009, 0x00003B23,\n    0x00005376, 0x00004CB6, 0x000300F7, 0x0000362B, 0x00000000, 0x000400FA,\n    0x00003B23, 0x00002B38, 0x0000362B, 0x000200F8, 0x00002B38, 0x000500C4,\n    0x00000017, 0x00005E17, 0x00005879, 0x000002ED, 0x000500C2, 0x00000017,\n    0x00003BE7, 0x00005879, 0x000002ED, 0x000500C5, 0x00000017, 0x000029E8,\n    0x00005E17, 0x00003BE7, 0x000200F9, 0x0000362B, 0x000200F8, 0x0000362B,\n    0x000700F5, 0x00000017, 0x00004A55, 0x00005879, 0x00003463, 0x000029E8,\n    0x00002B38, 0x000500C2, 0x0000000B, 0x00001EB9, 0x00001F01, 0x00000A17,\n    0x000500C2, 0x00000017, 0x00003A0E, 0x00004A55, 0x0000013D, 0x000500C2,\n    0x00000017, 0x00004F86, 0x00003A0E, 0x00000467, 0x00050080, 0x00000017,\n    0x00002C6F, 0x00003A0E, 0x00004F86, 0x00040070, 0x0000001D, 0x00005378,\n    0x00002C6F, 0x0005008E, 0x0000001D, 0x000054F4, 0x00005378, 0x00000B3A,\n    0x0004007C, 0x00000017, 0x00002FFF, 0x000054F4, 0x00060041, 0x00000294,\n    0x00005E39, 0x0000140E, 0x00000A0B, 0x00001EB9, 0x0003003E, 0x00005E39,\n    0x00002FFF, 0x00050080, 0x0000000B, 0x00005679, 0x00001F01, 0x00000A3A,\n    0x00050080, 0x0000000B, 0x000027E6, 0x000053DE, 0x00000A3A, 0x000500C2,\n    0x0000000B, 0x00003949, 0x000027E6, 0x00000A17, 0x00060041, 0x00000294,\n    0x00005566, 0x0000107A, 0x00000A0B, 0x00003949, 0x0004003D, 0x00000017,\n    0x00003910, 0x00005566, 0x000300F7, 0x00003A1A, 0x00000000, 0x000400FA,\n    0x00005686, 0x00002958, 0x00003A1A, 0x000200F8, 0x00002958, 0x000500C7,\n    0x00000017, 0x00004760, 0x00003910, 0x000009CE, 0x000500C4, 0x00000017,\n    0x000024D2, 0x00004760, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AD,\n    0x00003910, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448E, 0x000050AD,\n    0x0000013D, 0x000500C5, 0x00000017, 0x00003FF9, 0x000024D2, 0x0000448E,\n    0x000200F9, 0x00003A1A, 0x000200F8, 0x00003A1A, 0x000700F5, 0x00000017,\n    0x00002AAC, 0x00003910, 0x0000362B, 0x00003FF9, 0x00002958, 0x000300F7,\n    0x0000362C, 0x00000000, 0x000400FA, 0x00003B23, 0x00002B39, 0x0000362C,\n    0x000200F8, 0x00002B39, 0x000500C4, 0x00000017, 0x00005E18, 0x00002AAC,\n    0x000002ED, 0x000500C2, 0x00000017, 0x00003BE8, 0x00002AAC, 0x000002ED,\n    0x000500C5, 0x00000017, 0x000029E9, 0x00005E18, 0x00003BE8, 0x000200F9,\n    0x0000362C, 0x000200F8, 0x0000362C, 0x000700F5, 0x00000017, 0x00004A56,\n    0x00002AAC, 0x00003A1A, 0x000029E9, 0x00002B39, 0x000500C2, 0x0000000B,\n    0x00001EBA, 0x00005679, 0x00000A17, 0x000500C2, 0x00000017, 0x00003A0F,\n    0x00004A56, 0x0000013D, 0x000500C2, 0x00000017, 0x00004F87, 0x00003A0F,\n    0x00000467, 0x00050080, 0x00000017, 0x00002C70, 0x00003A0F, 0x00004F87,\n    0x00040070, 0x0000001D, 0x00005379, 0x00002C70, 0x0005008E, 0x0000001D,\n    0x000054F5, 0x00005379, 0x00000B3A, 0x0004007C, 0x00000017, 0x00003000,\n    0x000054F5, 0x00060041, 0x00000294, 0x00001CB5, 0x0000140E, 0x00000A0B,\n    0x00001EBA, 0x0003003E, 0x00001CB5, 0x00003000, 0x000200F9, 0x00004C7A,\n    0x000200F8, 0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_dxn_rg8_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25290\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n     %v4uint = OpTypeVector %uint 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v3uint = OpTypeVector %uint 3\n%uint_2396745 = OpConstant %uint 2396745\n%uint_4793490 = OpConstant %uint 4793490\n     %uint_1 = OpConstant %uint 1\n%uint_9586980 = OpConstant %uint 9586980\n     %uint_2 = OpConstant %uint 2\n%uint_14380470 = OpConstant %uint 14380470\n     %uint_0 = OpConstant %uint 0\n     %uint_7 = OpConstant %uint 7\n     %uint_3 = OpConstant %uint 3\n    %uint_16 = OpConstant %uint 16\n     %uint_6 = OpConstant %uint 6\n     %uint_9 = OpConstant %uint 9\n  %uint_1170 = OpConstant %uint 1170\n  %uint_2340 = OpConstant %uint 2340\n  %uint_2925 = OpConstant %uint 2925\n     %uint_5 = OpConstant %uint 5\n     %uint_8 = OpConstant %uint 8\n    %uint_13 = OpConstant %uint 13\n   %uint_512 = OpConstant %uint 512\n   %uint_255 = OpConstant %uint 255\n%uint_16711935 = OpConstant %uint 16711935\n%uint_4278255360 = OpConstant %uint 4278255360\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n      %int_3 = OpConstant %int 3\n      %int_2 = OpConstant %int 2\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %2587 = OpConstantComposite %v3uint %uint_1 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n       %2619 = OpConstantComposite %v3uint %uint_2 %uint_2 %uint_0\n     %uint_4 = OpConstant %uint 4\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n        %125 = OpConstantComposite %v4uint %uint_0 %uint_8 %uint_0 %uint_8\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n    %uint_12 = OpConstant %uint 12\n    %uint_32 = OpConstant %uint 32\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n       %1611 = OpConstantComposite %v4uint %uint_255 %uint_255 %uint_255 %uint_255\n       %1140 = OpConstantComposite %v2uint %uint_255 %uint_255\n       %1975 = OpConstantComposite %v2uint %uint_8 %uint_8\n        %533 = OpConstantComposite %v4uint %uint_12 %uint_12 %uint_12 %uint_12\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %14903 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24540 = OpBitwiseAnd %uint %13606 %uint_1\n      %17270 = OpINotEqual %bool %24540 %uint_0\n      %12328 = OpBitwiseAnd %uint %13606 %uint_2\n      %17284 = OpINotEqual %bool %12328 %uint_0\n       %7856 = OpShiftRightLogical %uint %13606 %uint_2\n      %25058 = OpBitwiseAnd %uint %7856 %uint_3\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20158 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n      %22412 = OpLoad %uint %20158\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_7\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2587\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %14018 DontFlatten\n               OpBranchConditional %24679 %21992 %14018\n      %21992 = OpLabel\n               OpBranch %14903\n      %14018 = OpLabel\n      %17344 = OpShiftLeftLogical %v3uint %21387 %2619\n      %15489 = OpBitcast %v3int %17344\n      %18336 = OpCompositeExtract %int %15489 0\n       %9362 = OpIMul %int %18336 %int_2\n       %6362 = OpCompositeExtract %int %15489 2\n      %14505 = OpBitcast %int %6594\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %15489 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %22412\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %9362 %24535\n      %10404 = OpBitcast %uint %8258\n      %14582 = OpIAdd %uint %22411 %10404\n      %12308 = OpLogicalNot %bool %17270\n               OpSelectionMerge %19040 DontFlatten\n               OpBranchConditional %12308 %9741 %17007\n       %9741 = OpLabel\n      %17463 = OpCompositeExtract %uint %21387 0\n      %11246 = OpCompositeExtract %uint %21387 1\n      %18801 = OpCompositeExtract %uint %21387 2\n      %14831 = OpIMul %uint %22409 %18801\n      %20322 = OpIAdd %uint %11246 %14831\n      %21676 = OpIMul %uint %22408 %20322\n      %20398 = OpIAdd %uint %17463 %21676\n      %11367 = OpShiftLeftLogical %uint %20398 %uint_4\n               OpBranch %19040\n      %17007 = OpLabel\n               OpSelectionMerge %23536 DontFlatten\n               OpBranchConditional %17284 %23520 %24353\n      %23520 = OpLabel\n      %10111 = OpBitcast %v3int %21387\n      %19476 = OpShiftRightLogical %uint %22408 %int_5\n      %18810 = OpShiftRightLogical %uint %22409 %int_4\n       %6782 = OpCompositeExtract %int %10111 2\n      %12089 = OpShiftRightArithmetic %int %6782 %int_2\n      %22400 = OpBitcast %int %18810\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %10111 1\n      %19055 = OpShiftRightArithmetic %int %25154 %int_4\n      %11052 = OpIAdd %int %7938 %19055\n      %16898 = OpBitcast %int %19476\n      %14944 = OpIMul %int %11052 %16898\n      %25155 = OpCompositeExtract %int %10111 0\n      %20423 = OpShiftRightArithmetic %int %25155 %int_5\n      %18940 = OpIAdd %int %14944 %20423\n       %8797 = OpShiftLeftLogical %int %18940 %int_7\n      %11434 = OpBitwiseAnd %int %6782 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %25154 %int_1\n      %21364 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21364 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %25155 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17334 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17334 %uint_4\n      %13015 = OpShiftRightArithmetic %int %25154 %int_3\n       %9929 = OpBitwiseXor %int %13015 %12089\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %25155 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %25154 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6551\n       %7092 = OpShiftLeftLogical %int %16793 %int_11\n      %16219 = OpBitwiseOr %int %18430 %7092\n      %14958 = OpShiftRightArithmetic %int %24144 %int_4\n       %6328 = OpBitwiseAnd %int %14958 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %16219 %21630\n      %14959 = OpShiftRightArithmetic %int %24144 %int_5\n       %6329 = OpBitwiseAnd %int %14959 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24144 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %23536\n      %24353 = OpLabel\n      %23000 = OpBitcast %v2int %17136\n      %22120 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %23000 1\n      %12090 = OpShiftRightArithmetic %int %14597 %int_5\n      %22401 = OpBitcast %int %22120\n       %7939 = OpIMul %int %12090 %22401\n      %25156 = OpCompositeExtract %int %23000 0\n      %20424 = OpShiftRightArithmetic %int %25156 %int_5\n      %18864 = OpIAdd %int %7939 %20424\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25156 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17335 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17335 %uint_4\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25156 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6552\n       %7093 = OpShiftLeftLogical %int %21575 %int_11\n      %16220 = OpBitwiseOr %int %18431 %7093\n      %14960 = OpShiftRightArithmetic %int %24163 %int_4\n       %6330 = OpBitwiseAnd %int %14960 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %16220 %21632\n      %14961 = OpShiftRightArithmetic %int %24163 %int_5\n       %6331 = OpBitwiseAnd %int %14961 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24163 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %23536\n      %23536 = OpLabel\n      %10540 = OpPhi %uint %16869 %23520 %16870 %24353\n               OpBranch %19040\n      %19040 = OpLabel\n      %11376 = OpPhi %uint %11367 %9741 %10540 %23536\n      %18621 = OpIAdd %uint %11376 %24236\n      %15698 = OpShiftRightLogical %uint %18621 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15698\n       %7338 = OpLoad %v4uint %20399\n      %13760 = OpIEqual %bool %25058 %uint_1\n      %21366 = OpIEqual %bool %25058 %uint_2\n      %22150 = OpLogicalOr %bool %13760 %21366\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %7338 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %7338 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22649 = OpPhi %v4uint %7338 %19040 %16376 %10583\n      %19638 = OpIEqual %bool %25058 %uint_3\n      %15139 = OpLogicalOr %bool %21366 %19638\n               OpSelectionMerge %14874 None\n               OpBranchConditional %15139 %11064 %14874\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22649 %749\n      %15335 = OpShiftRightLogical %v4uint %22649 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %14874\n      %14874 = OpLabel\n      %10924 = OpPhi %v4uint %22649 %13411 %10728 %11064\n               OpSelectionMerge %24688 DontFlatten\n               OpBranchConditional %17270 %21993 %7205\n      %21993 = OpLabel\n               OpBranch %24688\n       %7205 = OpLabel\n               OpBranch %24688\n      %24688 = OpLabel\n      %11377 = OpPhi %uint %uint_32 %21993 %uint_16 %7205\n      %18622 = OpIAdd %uint %18621 %11377\n      %15699 = OpShiftRightLogical %uint %18622 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15699\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %14875 None\n               OpBranchConditional %22150 %10584 %14875\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %14875\n      %14875 = OpLabel\n      %10925 = OpPhi %v4uint %14608 %24688 %16377 %10584\n               OpSelectionMerge %11682 None\n               OpBranchConditional %15139 %11065 %11682\n      %11065 = OpLabel\n      %24088 = OpShiftLeftLogical %v4uint %10925 %749\n      %15336 = OpShiftRightLogical %v4uint %10925 %749\n      %10729 = OpBitwiseOr %v4uint %24088 %15336\n               OpBranch %11682\n      %11682 = OpLabel\n      %19853 = OpPhi %v4uint %10925 %14875 %10729 %11065\n      %22133 = OpVectorShuffle %v4uint %10924 %10924 0 0 2 2\n      %12416 = OpShiftRightLogical %v4uint %22133 %125\n       %9078 = OpBitwiseAnd %v4uint %12416 %1611\n      %17064 = OpVectorShuffle %v4uint %19853 %19853 0 0 2 2\n       %7640 = OpShiftRightLogical %v4uint %17064 %125\n       %6585 = OpBitwiseAnd %v4uint %7640 %1611\n      %17985 = OpCompositeExtract %uint %10924 0\n       %6272 = OpCompositeExtract %uint %10924 2\n       %7641 = OpCompositeExtract %uint %19853 0\n       %9980 = OpCompositeExtract %uint %19853 2\n      %15375 = OpCompositeConstruct %v4uint %17985 %6272 %7641 %9980\n      %10122 = OpShiftRightLogical %v4uint %15375 %749\n      %23844 = OpCompositeExtract %uint %10924 1\n      %24539 = OpCompositeExtract %uint %10924 3\n       %7642 = OpCompositeExtract %uint %19853 1\n      %10075 = OpCompositeExtract %uint %19853 3\n      %16695 = OpCompositeConstruct %v4uint %23844 %24539 %7642 %10075\n       %8679 = OpBitwiseAnd %v4uint %16695 %1611\n      %20043 = OpShiftLeftLogical %v4uint %8679 %749\n      %16241 = OpBitwiseOr %v4uint %10122 %20043\n      %20096 = OpCompositeExtract %uint %16241 0\n       %6502 = OpCompositeExtract %uint %9078 0\n      %13104 = OpCompositeExtract %uint %9078 1\n      %20099 = OpULessThanEqual %bool %6502 %13104\n               OpSelectionMerge %11720 None\n               OpBranchConditional %20099 %10640 %21920\n      %10640 = OpLabel\n      %17657 = OpBitwiseAnd %uint %20096 %uint_4793490\n      %23948 = OpBitwiseAnd %uint %20096 %uint_9586980\n      %21844 = OpShiftRightLogical %uint %23948 %uint_1\n       %8133 = OpBitwiseAnd %uint %17657 %21844\n      %24609 = OpShiftLeftLogical %uint %8133 %uint_1\n      %22956 = OpShiftRightLogical %uint %8133 %uint_1\n      %18793 = OpBitwiseOr %uint %24609 %22956\n      %16049 = OpBitwiseOr %uint %8133 %18793\n      %18309 = OpBitwiseAnd %uint %20096 %uint_2396745\n      %14685 = OpBitwiseOr %uint %18309 %uint_14380470\n      %20403 = OpBitwiseAnd %uint %14685 %16049\n      %20539 = OpShiftRightLogical %uint %17657 %uint_1\n      %24922 = OpBitwiseOr %uint %18309 %20539\n      %21922 = OpShiftRightLogical %uint %23948 %uint_2\n      %22674 = OpBitwiseOr %uint %24922 %21922\n       %7721 = OpBitwiseXor %uint %22674 %uint_2396745\n       %9540 = OpNot %uint %20539\n      %14621 = OpBitwiseAnd %uint %18309 %9540\n       %8425 = OpNot %uint %21922\n      %11407 = OpBitwiseAnd %uint %14621 %8425\n       %6799 = OpBitwiseOr %uint %20096 %7721\n      %19509 = OpISub %uint %6799 %uint_2396745\n      %14871 = OpBitwiseOr %uint %19509 %11407\n      %18228 = OpShiftLeftLogical %uint %11407 %uint_2\n      %15354 = OpBitwiseOr %uint %14871 %18228\n      %12154 = OpNot %uint %16049\n      %18512 = OpBitwiseAnd %uint %15354 %12154\n       %6252 = OpBitwiseOr %uint %18512 %20403\n               OpBranch %11720\n      %21920 = OpLabel\n      %20079 = OpBitwiseAnd %uint %20096 %uint_2396745\n      %23910 = OpBitwiseAnd %uint %20096 %uint_4793490\n      %22247 = OpShiftRightLogical %uint %23910 %uint_1\n      %24000 = OpBitwiseOr %uint %20079 %22247\n      %19599 = OpBitwiseAnd %uint %20096 %uint_9586980\n      %20615 = OpShiftRightLogical %uint %19599 %uint_2\n      %24287 = OpBitwiseOr %uint %24000 %20615\n       %7722 = OpBitwiseXor %uint %24287 %uint_2396745\n       %9541 = OpNot %uint %22247\n      %14622 = OpBitwiseAnd %uint %20079 %9541\n       %8426 = OpNot %uint %20615\n      %11408 = OpBitwiseAnd %uint %14622 %8426\n       %6800 = OpBitwiseOr %uint %20096 %7722\n      %19510 = OpISub %uint %6800 %uint_2396745\n      %14872 = OpBitwiseOr %uint %19510 %11408\n      %18152 = OpShiftLeftLogical %uint %11408 %uint_1\n      %16008 = OpBitwiseOr %uint %14872 %18152\n       %8118 = OpShiftLeftLogical %uint %11408 %uint_2\n       %7808 = OpBitwiseOr %uint %16008 %8118\n               OpBranch %11720\n      %11720 = OpLabel\n      %17360 = OpPhi %uint %6252 %10640 %7808 %21920\n      %23054 = OpCompositeExtract %uint %16241 1\n      %12929 = OpCompositeExtract %uint %9078 2\n      %13105 = OpCompositeExtract %uint %9078 3\n      %20100 = OpULessThanEqual %bool %12929 %13105\n               OpSelectionMerge %11721 None\n               OpBranchConditional %20100 %10641 %21921\n      %10641 = OpLabel\n      %17658 = OpBitwiseAnd %uint %23054 %uint_4793490\n      %23949 = OpBitwiseAnd %uint %23054 %uint_9586980\n      %21845 = OpShiftRightLogical %uint %23949 %uint_1\n       %8134 = OpBitwiseAnd %uint %17658 %21845\n      %24610 = OpShiftLeftLogical %uint %8134 %uint_1\n      %22957 = OpShiftRightLogical %uint %8134 %uint_1\n      %18794 = OpBitwiseOr %uint %24610 %22957\n      %16050 = OpBitwiseOr %uint %8134 %18794\n      %18310 = OpBitwiseAnd %uint %23054 %uint_2396745\n      %14686 = OpBitwiseOr %uint %18310 %uint_14380470\n      %20404 = OpBitwiseAnd %uint %14686 %16050\n      %20540 = OpShiftRightLogical %uint %17658 %uint_1\n      %24923 = OpBitwiseOr %uint %18310 %20540\n      %21923 = OpShiftRightLogical %uint %23949 %uint_2\n      %22675 = OpBitwiseOr %uint %24923 %21923\n       %7723 = OpBitwiseXor %uint %22675 %uint_2396745\n       %9542 = OpNot %uint %20540\n      %14623 = OpBitwiseAnd %uint %18310 %9542\n       %8427 = OpNot %uint %21923\n      %11409 = OpBitwiseAnd %uint %14623 %8427\n       %6801 = OpBitwiseOr %uint %23054 %7723\n      %19511 = OpISub %uint %6801 %uint_2396745\n      %14873 = OpBitwiseOr %uint %19511 %11409\n      %18229 = OpShiftLeftLogical %uint %11409 %uint_2\n      %15355 = OpBitwiseOr %uint %14873 %18229\n      %12155 = OpNot %uint %16050\n      %18513 = OpBitwiseAnd %uint %15355 %12155\n       %6253 = OpBitwiseOr %uint %18513 %20404\n               OpBranch %11721\n      %21921 = OpLabel\n      %20080 = OpBitwiseAnd %uint %23054 %uint_2396745\n      %23911 = OpBitwiseAnd %uint %23054 %uint_4793490\n      %22248 = OpShiftRightLogical %uint %23911 %uint_1\n      %24001 = OpBitwiseOr %uint %20080 %22248\n      %19600 = OpBitwiseAnd %uint %23054 %uint_9586980\n      %20616 = OpShiftRightLogical %uint %19600 %uint_2\n      %24288 = OpBitwiseOr %uint %24001 %20616\n       %7724 = OpBitwiseXor %uint %24288 %uint_2396745\n       %9543 = OpNot %uint %22248\n      %14624 = OpBitwiseAnd %uint %20080 %9543\n       %8428 = OpNot %uint %20616\n      %11410 = OpBitwiseAnd %uint %14624 %8428\n       %6802 = OpBitwiseOr %uint %23054 %7724\n      %19512 = OpISub %uint %6802 %uint_2396745\n      %14876 = OpBitwiseOr %uint %19512 %11410\n      %18153 = OpShiftLeftLogical %uint %11410 %uint_1\n      %16009 = OpBitwiseOr %uint %14876 %18153\n       %8119 = OpShiftLeftLogical %uint %11410 %uint_2\n       %7809 = OpBitwiseOr %uint %16009 %8119\n               OpBranch %11721\n      %11721 = OpLabel\n      %17361 = OpPhi %uint %6253 %10641 %7809 %21921\n      %23055 = OpCompositeExtract %uint %16241 2\n      %12930 = OpCompositeExtract %uint %6585 0\n      %13106 = OpCompositeExtract %uint %6585 1\n      %20101 = OpULessThanEqual %bool %12930 %13106\n               OpSelectionMerge %11722 None\n               OpBranchConditional %20101 %10642 %21925\n      %10642 = OpLabel\n      %17659 = OpBitwiseAnd %uint %23055 %uint_4793490\n      %23950 = OpBitwiseAnd %uint %23055 %uint_9586980\n      %21846 = OpShiftRightLogical %uint %23950 %uint_1\n       %8135 = OpBitwiseAnd %uint %17659 %21846\n      %24611 = OpShiftLeftLogical %uint %8135 %uint_1\n      %22958 = OpShiftRightLogical %uint %8135 %uint_1\n      %18795 = OpBitwiseOr %uint %24611 %22958\n      %16051 = OpBitwiseOr %uint %8135 %18795\n      %18311 = OpBitwiseAnd %uint %23055 %uint_2396745\n      %14687 = OpBitwiseOr %uint %18311 %uint_14380470\n      %20405 = OpBitwiseAnd %uint %14687 %16051\n      %20541 = OpShiftRightLogical %uint %17659 %uint_1\n      %24924 = OpBitwiseOr %uint %18311 %20541\n      %21924 = OpShiftRightLogical %uint %23950 %uint_2\n      %22676 = OpBitwiseOr %uint %24924 %21924\n       %7725 = OpBitwiseXor %uint %22676 %uint_2396745\n       %9544 = OpNot %uint %20541\n      %14625 = OpBitwiseAnd %uint %18311 %9544\n       %8429 = OpNot %uint %21924\n      %11411 = OpBitwiseAnd %uint %14625 %8429\n       %6803 = OpBitwiseOr %uint %23055 %7725\n      %19513 = OpISub %uint %6803 %uint_2396745\n      %14877 = OpBitwiseOr %uint %19513 %11411\n      %18230 = OpShiftLeftLogical %uint %11411 %uint_2\n      %15356 = OpBitwiseOr %uint %14877 %18230\n      %12156 = OpNot %uint %16051\n      %18514 = OpBitwiseAnd %uint %15356 %12156\n       %6254 = OpBitwiseOr %uint %18514 %20405\n               OpBranch %11722\n      %21925 = OpLabel\n      %20081 = OpBitwiseAnd %uint %23055 %uint_2396745\n      %23912 = OpBitwiseAnd %uint %23055 %uint_4793490\n      %22249 = OpShiftRightLogical %uint %23912 %uint_1\n      %24002 = OpBitwiseOr %uint %20081 %22249\n      %19601 = OpBitwiseAnd %uint %23055 %uint_9586980\n      %20617 = OpShiftRightLogical %uint %19601 %uint_2\n      %24289 = OpBitwiseOr %uint %24002 %20617\n       %7726 = OpBitwiseXor %uint %24289 %uint_2396745\n       %9545 = OpNot %uint %22249\n      %14626 = OpBitwiseAnd %uint %20081 %9545\n       %8430 = OpNot %uint %20617\n      %11412 = OpBitwiseAnd %uint %14626 %8430\n       %6804 = OpBitwiseOr %uint %23055 %7726\n      %19514 = OpISub %uint %6804 %uint_2396745\n      %14878 = OpBitwiseOr %uint %19514 %11412\n      %18154 = OpShiftLeftLogical %uint %11412 %uint_1\n      %16010 = OpBitwiseOr %uint %14878 %18154\n       %8120 = OpShiftLeftLogical %uint %11412 %uint_2\n       %7810 = OpBitwiseOr %uint %16010 %8120\n               OpBranch %11722\n      %11722 = OpLabel\n      %17362 = OpPhi %uint %6254 %10642 %7810 %21925\n      %23056 = OpCompositeExtract %uint %16241 3\n      %12931 = OpCompositeExtract %uint %6585 2\n      %13107 = OpCompositeExtract %uint %6585 3\n      %20102 = OpULessThanEqual %bool %12931 %13107\n               OpSelectionMerge %11701 None\n               OpBranchConditional %20102 %10643 %21927\n      %10643 = OpLabel\n      %17660 = OpBitwiseAnd %uint %23056 %uint_4793490\n      %23951 = OpBitwiseAnd %uint %23056 %uint_9586980\n      %21847 = OpShiftRightLogical %uint %23951 %uint_1\n       %8136 = OpBitwiseAnd %uint %17660 %21847\n      %24612 = OpShiftLeftLogical %uint %8136 %uint_1\n      %22959 = OpShiftRightLogical %uint %8136 %uint_1\n      %18796 = OpBitwiseOr %uint %24612 %22959\n      %16052 = OpBitwiseOr %uint %8136 %18796\n      %18312 = OpBitwiseAnd %uint %23056 %uint_2396745\n      %14688 = OpBitwiseOr %uint %18312 %uint_14380470\n      %20406 = OpBitwiseAnd %uint %14688 %16052\n      %20542 = OpShiftRightLogical %uint %17660 %uint_1\n      %24925 = OpBitwiseOr %uint %18312 %20542\n      %21926 = OpShiftRightLogical %uint %23951 %uint_2\n      %22677 = OpBitwiseOr %uint %24925 %21926\n       %7727 = OpBitwiseXor %uint %22677 %uint_2396745\n       %9547 = OpNot %uint %20542\n      %14627 = OpBitwiseAnd %uint %18312 %9547\n       %8431 = OpNot %uint %21926\n      %11413 = OpBitwiseAnd %uint %14627 %8431\n       %6805 = OpBitwiseOr %uint %23056 %7727\n      %19515 = OpISub %uint %6805 %uint_2396745\n      %14879 = OpBitwiseOr %uint %19515 %11413\n      %18231 = OpShiftLeftLogical %uint %11413 %uint_2\n      %15357 = OpBitwiseOr %uint %14879 %18231\n      %12157 = OpNot %uint %16052\n      %18515 = OpBitwiseAnd %uint %15357 %12157\n       %6255 = OpBitwiseOr %uint %18515 %20406\n               OpBranch %11701\n      %21927 = OpLabel\n      %20082 = OpBitwiseAnd %uint %23056 %uint_2396745\n      %23913 = OpBitwiseAnd %uint %23056 %uint_4793490\n      %22250 = OpShiftRightLogical %uint %23913 %uint_1\n      %24003 = OpBitwiseOr %uint %20082 %22250\n      %19602 = OpBitwiseAnd %uint %23056 %uint_9586980\n      %20618 = OpShiftRightLogical %uint %19602 %uint_2\n      %24290 = OpBitwiseOr %uint %24003 %20618\n       %7728 = OpBitwiseXor %uint %24290 %uint_2396745\n       %9548 = OpNot %uint %22250\n      %14628 = OpBitwiseAnd %uint %20082 %9548\n       %8432 = OpNot %uint %20618\n      %11414 = OpBitwiseAnd %uint %14628 %8432\n       %6806 = OpBitwiseOr %uint %23056 %7728\n      %19516 = OpISub %uint %6806 %uint_2396745\n      %14880 = OpBitwiseOr %uint %19516 %11414\n      %18155 = OpShiftLeftLogical %uint %11414 %uint_1\n      %16011 = OpBitwiseOr %uint %14880 %18155\n       %8121 = OpShiftLeftLogical %uint %11414 %uint_2\n       %7811 = OpBitwiseOr %uint %16011 %8121\n               OpBranch %11701\n      %11701 = OpLabel\n      %19680 = OpPhi %uint %6255 %10643 %7811 %21927\n      %14852 = OpCompositeConstruct %v4uint %17360 %17361 %17362 %19680\n       %7112 = OpShiftRightLogical %uint %14582 %int_4\n               OpSelectionMerge %20297 None\n               OpBranchConditional %20099 %10644 %14526\n      %10644 = OpLabel\n      %17661 = OpBitwiseAnd %uint %17360 %uint_1170\n      %23952 = OpBitwiseAnd %uint %17360 %uint_2340\n      %21848 = OpShiftRightLogical %uint %23952 %uint_1\n       %8137 = OpBitwiseAnd %uint %17661 %21848\n      %24613 = OpShiftLeftLogical %uint %8137 %uint_1\n      %22960 = OpShiftRightLogical %uint %8137 %uint_1\n      %18812 = OpBitwiseOr %uint %24613 %22960\n      %15914 = OpBitwiseOr %uint %8137 %18812\n       %8459 = OpNot %uint %15914\n      %10082 = OpBitwiseAnd %uint %17360 %8459\n      %16300 = OpISub %uint %uint_2925 %10082\n      %17415 = OpBitwiseAnd %uint %16300 %8459\n      %16991 = OpBitwiseAnd %uint %17415 %uint_7\n      %13677 = OpIMul %uint %6502 %16991\n      %21975 = OpBitwiseAnd %uint %10082 %uint_7\n      %20390 = OpIMul %uint %13104 %21975\n      %19842 = OpIAdd %uint %13677 %20390\n      %13000 = OpUDiv %uint %19842 %uint_5\n      %23022 = OpShiftRightLogical %uint %17415 %uint_3\n       %8753 = OpBitwiseAnd %uint %23022 %uint_7\n      %15011 = OpIMul %uint %6502 %8753\n      %13283 = OpShiftRightLogical %uint %10082 %uint_3\n      %24957 = OpBitwiseAnd %uint %13283 %uint_7\n      %25194 = OpIMul %uint %13104 %24957\n      %19880 = OpIAdd %uint %15011 %25194\n      %12616 = OpUDiv %uint %19880 %uint_5\n       %8160 = OpShiftLeftLogical %uint %12616 %uint_16\n       %7553 = OpBitwiseOr %uint %13000 %8160\n      %21935 = OpShiftRightLogical %uint %17415 %uint_6\n      %17592 = OpBitwiseAnd %uint %21935 %uint_7\n      %15012 = OpIMul %uint %6502 %17592\n      %13284 = OpShiftRightLogical %uint %10082 %uint_6\n      %24958 = OpBitwiseAnd %uint %13284 %uint_7\n      %25195 = OpIMul %uint %13104 %24958\n      %19843 = OpIAdd %uint %15012 %25195\n      %13001 = OpUDiv %uint %19843 %uint_5\n      %23023 = OpShiftRightLogical %uint %17415 %uint_9\n       %8754 = OpBitwiseAnd %uint %23023 %uint_7\n      %15013 = OpIMul %uint %6502 %8754\n      %13285 = OpShiftRightLogical %uint %10082 %uint_9\n      %24959 = OpBitwiseAnd %uint %13285 %uint_7\n      %25196 = OpIMul %uint %13104 %24959\n      %19881 = OpIAdd %uint %15013 %25196\n      %12617 = OpUDiv %uint %19881 %uint_5\n      %25065 = OpShiftLeftLogical %uint %12617 %uint_16\n       %8204 = OpBitwiseOr %uint %13001 %25065\n      %10117 = OpCompositeConstruct %v2uint %7553 %8204\n      %24268 = OpBitwiseAnd %uint %17360 %15914\n      %16374 = OpBitwiseAnd %uint %24268 %uint_1\n      %19559 = OpBitwiseAnd %uint %24268 %uint_8\n      %24837 = OpShiftLeftLogical %uint %19559 %uint_13\n      %18005 = OpBitwiseOr %uint %16374 %24837\n      %23208 = OpShiftRightLogical %uint %24268 %uint_6\n      %25110 = OpBitwiseAnd %uint %23208 %uint_1\n      %18755 = OpBitwiseAnd %uint %24268 %uint_512\n      %22671 = OpShiftLeftLogical %uint %18755 %uint_7\n      %17383 = OpBitwiseOr %uint %25110 %22671\n      %20359 = OpCompositeConstruct %v2uint %18005 %17383\n      %20759 = OpIMul %v2uint %20359 %1140\n      %23854 = OpIAdd %v2uint %10117 %20759\n               OpBranch %20297\n      %14526 = OpLabel\n      %10708 = OpNot %uint %17360\n      %15358 = OpBitwiseAnd %uint %10708 %uint_7\n      %17712 = OpIMul %uint %6502 %15358\n      %21976 = OpBitwiseAnd %uint %17360 %uint_7\n      %20391 = OpIMul %uint %13104 %21976\n      %19844 = OpIAdd %uint %17712 %20391\n      %13002 = OpUDiv %uint %19844 %uint_7\n      %23024 = OpShiftRightLogical %uint %10708 %uint_3\n       %8755 = OpBitwiseAnd %uint %23024 %uint_7\n      %15014 = OpIMul %uint %6502 %8755\n      %13286 = OpShiftRightLogical %uint %17360 %uint_3\n      %24960 = OpBitwiseAnd %uint %13286 %uint_7\n      %25197 = OpIMul %uint %13104 %24960\n      %19882 = OpIAdd %uint %15014 %25197\n      %12618 = OpUDiv %uint %19882 %uint_7\n       %8161 = OpShiftLeftLogical %uint %12618 %uint_16\n       %7554 = OpBitwiseOr %uint %13002 %8161\n      %21936 = OpShiftRightLogical %uint %10708 %uint_6\n      %17593 = OpBitwiseAnd %uint %21936 %uint_7\n      %15015 = OpIMul %uint %6502 %17593\n      %13287 = OpShiftRightLogical %uint %17360 %uint_6\n      %24961 = OpBitwiseAnd %uint %13287 %uint_7\n      %25198 = OpIMul %uint %13104 %24961\n      %19845 = OpIAdd %uint %15015 %25198\n      %13003 = OpUDiv %uint %19845 %uint_7\n      %23025 = OpShiftRightLogical %uint %10708 %uint_9\n       %8756 = OpBitwiseAnd %uint %23025 %uint_7\n      %15016 = OpIMul %uint %6502 %8756\n      %13288 = OpShiftRightLogical %uint %17360 %uint_9\n      %24962 = OpBitwiseAnd %uint %13288 %uint_7\n      %25199 = OpIMul %uint %13104 %24962\n      %19883 = OpIAdd %uint %15016 %25199\n      %12619 = OpUDiv %uint %19883 %uint_7\n      %25066 = OpShiftLeftLogical %uint %12619 %uint_16\n       %9154 = OpBitwiseOr %uint %13003 %25066\n      %21469 = OpCompositeConstruct %v2uint %7554 %9154\n               OpBranch %20297\n      %20297 = OpLabel\n      %10926 = OpPhi %v2uint %23854 %10644 %21469 %14526\n               OpSelectionMerge %19328 None\n               OpBranchConditional %20100 %10645 %14527\n      %10645 = OpLabel\n      %17662 = OpBitwiseAnd %uint %17361 %uint_1170\n      %23953 = OpBitwiseAnd %uint %17361 %uint_2340\n      %21849 = OpShiftRightLogical %uint %23953 %uint_1\n       %8138 = OpBitwiseAnd %uint %17662 %21849\n      %24614 = OpShiftLeftLogical %uint %8138 %uint_1\n      %22961 = OpShiftRightLogical %uint %8138 %uint_1\n      %18813 = OpBitwiseOr %uint %24614 %22961\n      %15915 = OpBitwiseOr %uint %8138 %18813\n       %8460 = OpNot %uint %15915\n      %10083 = OpBitwiseAnd %uint %17361 %8460\n      %16301 = OpISub %uint %uint_2925 %10083\n      %17416 = OpBitwiseAnd %uint %16301 %8460\n      %16992 = OpBitwiseAnd %uint %17416 %uint_7\n      %13678 = OpIMul %uint %12929 %16992\n      %21977 = OpBitwiseAnd %uint %10083 %uint_7\n      %20392 = OpIMul %uint %13105 %21977\n      %19846 = OpIAdd %uint %13678 %20392\n      %13004 = OpUDiv %uint %19846 %uint_5\n      %23026 = OpShiftRightLogical %uint %17416 %uint_3\n       %8757 = OpBitwiseAnd %uint %23026 %uint_7\n      %15017 = OpIMul %uint %12929 %8757\n      %13289 = OpShiftRightLogical %uint %10083 %uint_3\n      %24963 = OpBitwiseAnd %uint %13289 %uint_7\n      %25200 = OpIMul %uint %13105 %24963\n      %19884 = OpIAdd %uint %15017 %25200\n      %12620 = OpUDiv %uint %19884 %uint_5\n       %8162 = OpShiftLeftLogical %uint %12620 %uint_16\n       %7555 = OpBitwiseOr %uint %13004 %8162\n      %21937 = OpShiftRightLogical %uint %17416 %uint_6\n      %17594 = OpBitwiseAnd %uint %21937 %uint_7\n      %15018 = OpIMul %uint %12929 %17594\n      %13290 = OpShiftRightLogical %uint %10083 %uint_6\n      %24964 = OpBitwiseAnd %uint %13290 %uint_7\n      %25201 = OpIMul %uint %13105 %24964\n      %19847 = OpIAdd %uint %15018 %25201\n      %13005 = OpUDiv %uint %19847 %uint_5\n      %23027 = OpShiftRightLogical %uint %17416 %uint_9\n       %8758 = OpBitwiseAnd %uint %23027 %uint_7\n      %15019 = OpIMul %uint %12929 %8758\n      %13291 = OpShiftRightLogical %uint %10083 %uint_9\n      %24965 = OpBitwiseAnd %uint %13291 %uint_7\n      %25202 = OpIMul %uint %13105 %24965\n      %19885 = OpIAdd %uint %15019 %25202\n      %12621 = OpUDiv %uint %19885 %uint_5\n      %25067 = OpShiftLeftLogical %uint %12621 %uint_16\n       %8205 = OpBitwiseOr %uint %13005 %25067\n      %10118 = OpCompositeConstruct %v2uint %7555 %8205\n      %24269 = OpBitwiseAnd %uint %17361 %15915\n      %16375 = OpBitwiseAnd %uint %24269 %uint_1\n      %19560 = OpBitwiseAnd %uint %24269 %uint_8\n      %24838 = OpShiftLeftLogical %uint %19560 %uint_13\n      %18006 = OpBitwiseOr %uint %16375 %24838\n      %23209 = OpShiftRightLogical %uint %24269 %uint_6\n      %25111 = OpBitwiseAnd %uint %23209 %uint_1\n      %18756 = OpBitwiseAnd %uint %24269 %uint_512\n      %22672 = OpShiftLeftLogical %uint %18756 %uint_7\n      %17384 = OpBitwiseOr %uint %25111 %22672\n      %20360 = OpCompositeConstruct %v2uint %18006 %17384\n      %20760 = OpIMul %v2uint %20360 %1140\n      %23855 = OpIAdd %v2uint %10118 %20760\n               OpBranch %19328\n      %14527 = OpLabel\n      %10709 = OpNot %uint %17361\n      %15359 = OpBitwiseAnd %uint %10709 %uint_7\n      %17713 = OpIMul %uint %12929 %15359\n      %21978 = OpBitwiseAnd %uint %17361 %uint_7\n      %20393 = OpIMul %uint %13105 %21978\n      %19848 = OpIAdd %uint %17713 %20393\n      %13006 = OpUDiv %uint %19848 %uint_7\n      %23028 = OpShiftRightLogical %uint %10709 %uint_3\n       %8759 = OpBitwiseAnd %uint %23028 %uint_7\n      %15020 = OpIMul %uint %12929 %8759\n      %13292 = OpShiftRightLogical %uint %17361 %uint_3\n      %24966 = OpBitwiseAnd %uint %13292 %uint_7\n      %25203 = OpIMul %uint %13105 %24966\n      %19886 = OpIAdd %uint %15020 %25203\n      %12622 = OpUDiv %uint %19886 %uint_7\n       %8163 = OpShiftLeftLogical %uint %12622 %uint_16\n       %7556 = OpBitwiseOr %uint %13006 %8163\n      %21938 = OpShiftRightLogical %uint %10709 %uint_6\n      %17595 = OpBitwiseAnd %uint %21938 %uint_7\n      %15021 = OpIMul %uint %12929 %17595\n      %13293 = OpShiftRightLogical %uint %17361 %uint_6\n      %24967 = OpBitwiseAnd %uint %13293 %uint_7\n      %25204 = OpIMul %uint %13105 %24967\n      %19849 = OpIAdd %uint %15021 %25204\n      %13007 = OpUDiv %uint %19849 %uint_7\n      %23029 = OpShiftRightLogical %uint %10709 %uint_9\n       %8760 = OpBitwiseAnd %uint %23029 %uint_7\n      %15022 = OpIMul %uint %12929 %8760\n      %13294 = OpShiftRightLogical %uint %17361 %uint_9\n      %24968 = OpBitwiseAnd %uint %13294 %uint_7\n      %25205 = OpIMul %uint %13105 %24968\n      %19887 = OpIAdd %uint %15022 %25205\n      %12623 = OpUDiv %uint %19887 %uint_7\n      %25068 = OpShiftLeftLogical %uint %12623 %uint_16\n       %9155 = OpBitwiseOr %uint %13007 %25068\n      %21470 = OpCompositeConstruct %v2uint %7556 %9155\n               OpBranch %19328\n      %19328 = OpLabel\n      %18740 = OpPhi %v2uint %23855 %10645 %21470 %14527\n      %11038 = OpShiftLeftLogical %v2uint %18740 %1975\n      %21076 = OpBitwiseOr %v2uint %10926 %11038\n               OpSelectionMerge %20298 None\n               OpBranchConditional %20101 %10646 %14528\n      %10646 = OpLabel\n      %17663 = OpBitwiseAnd %uint %17362 %uint_1170\n      %23954 = OpBitwiseAnd %uint %17362 %uint_2340\n      %21850 = OpShiftRightLogical %uint %23954 %uint_1\n       %8139 = OpBitwiseAnd %uint %17663 %21850\n      %24615 = OpShiftLeftLogical %uint %8139 %uint_1\n      %22962 = OpShiftRightLogical %uint %8139 %uint_1\n      %18814 = OpBitwiseOr %uint %24615 %22962\n      %15916 = OpBitwiseOr %uint %8139 %18814\n       %8461 = OpNot %uint %15916\n      %10084 = OpBitwiseAnd %uint %17362 %8461\n      %16302 = OpISub %uint %uint_2925 %10084\n      %17417 = OpBitwiseAnd %uint %16302 %8461\n      %16993 = OpBitwiseAnd %uint %17417 %uint_7\n      %13679 = OpIMul %uint %12930 %16993\n      %21979 = OpBitwiseAnd %uint %10084 %uint_7\n      %20394 = OpIMul %uint %13106 %21979\n      %19850 = OpIAdd %uint %13679 %20394\n      %13008 = OpUDiv %uint %19850 %uint_5\n      %23030 = OpShiftRightLogical %uint %17417 %uint_3\n       %8761 = OpBitwiseAnd %uint %23030 %uint_7\n      %15023 = OpIMul %uint %12930 %8761\n      %13295 = OpShiftRightLogical %uint %10084 %uint_3\n      %24969 = OpBitwiseAnd %uint %13295 %uint_7\n      %25206 = OpIMul %uint %13106 %24969\n      %19888 = OpIAdd %uint %15023 %25206\n      %12624 = OpUDiv %uint %19888 %uint_5\n       %8164 = OpShiftLeftLogical %uint %12624 %uint_16\n       %7557 = OpBitwiseOr %uint %13008 %8164\n      %21939 = OpShiftRightLogical %uint %17417 %uint_6\n      %17596 = OpBitwiseAnd %uint %21939 %uint_7\n      %15024 = OpIMul %uint %12930 %17596\n      %13296 = OpShiftRightLogical %uint %10084 %uint_6\n      %24970 = OpBitwiseAnd %uint %13296 %uint_7\n      %25207 = OpIMul %uint %13106 %24970\n      %19851 = OpIAdd %uint %15024 %25207\n      %13009 = OpUDiv %uint %19851 %uint_5\n      %23031 = OpShiftRightLogical %uint %17417 %uint_9\n       %8762 = OpBitwiseAnd %uint %23031 %uint_7\n      %15025 = OpIMul %uint %12930 %8762\n      %13297 = OpShiftRightLogical %uint %10084 %uint_9\n      %24971 = OpBitwiseAnd %uint %13297 %uint_7\n      %25208 = OpIMul %uint %13106 %24971\n      %19889 = OpIAdd %uint %15025 %25208\n      %12625 = OpUDiv %uint %19889 %uint_5\n      %25069 = OpShiftLeftLogical %uint %12625 %uint_16\n       %8206 = OpBitwiseOr %uint %13009 %25069\n      %10119 = OpCompositeConstruct %v2uint %7557 %8206\n      %24270 = OpBitwiseAnd %uint %17362 %15916\n      %16378 = OpBitwiseAnd %uint %24270 %uint_1\n      %19561 = OpBitwiseAnd %uint %24270 %uint_8\n      %24839 = OpShiftLeftLogical %uint %19561 %uint_13\n      %18007 = OpBitwiseOr %uint %16378 %24839\n      %23210 = OpShiftRightLogical %uint %24270 %uint_6\n      %25112 = OpBitwiseAnd %uint %23210 %uint_1\n      %18757 = OpBitwiseAnd %uint %24270 %uint_512\n      %22673 = OpShiftLeftLogical %uint %18757 %uint_7\n      %17385 = OpBitwiseOr %uint %25112 %22673\n      %20361 = OpCompositeConstruct %v2uint %18007 %17385\n      %20761 = OpIMul %v2uint %20361 %1140\n      %23856 = OpIAdd %v2uint %10119 %20761\n               OpBranch %20298\n      %14528 = OpLabel\n      %10710 = OpNot %uint %17362\n      %15360 = OpBitwiseAnd %uint %10710 %uint_7\n      %17714 = OpIMul %uint %12930 %15360\n      %21980 = OpBitwiseAnd %uint %17362 %uint_7\n      %20395 = OpIMul %uint %13106 %21980\n      %19852 = OpIAdd %uint %17714 %20395\n      %13010 = OpUDiv %uint %19852 %uint_7\n      %23032 = OpShiftRightLogical %uint %10710 %uint_3\n       %8763 = OpBitwiseAnd %uint %23032 %uint_7\n      %15026 = OpIMul %uint %12930 %8763\n      %13298 = OpShiftRightLogical %uint %17362 %uint_3\n      %24972 = OpBitwiseAnd %uint %13298 %uint_7\n      %25209 = OpIMul %uint %13106 %24972\n      %19890 = OpIAdd %uint %15026 %25209\n      %12626 = OpUDiv %uint %19890 %uint_7\n       %8165 = OpShiftLeftLogical %uint %12626 %uint_16\n       %7558 = OpBitwiseOr %uint %13010 %8165\n      %21940 = OpShiftRightLogical %uint %10710 %uint_6\n      %17597 = OpBitwiseAnd %uint %21940 %uint_7\n      %15027 = OpIMul %uint %12930 %17597\n      %13299 = OpShiftRightLogical %uint %17362 %uint_6\n      %24973 = OpBitwiseAnd %uint %13299 %uint_7\n      %25210 = OpIMul %uint %13106 %24973\n      %19854 = OpIAdd %uint %15027 %25210\n      %13011 = OpUDiv %uint %19854 %uint_7\n      %23033 = OpShiftRightLogical %uint %10710 %uint_9\n       %8764 = OpBitwiseAnd %uint %23033 %uint_7\n      %15028 = OpIMul %uint %12930 %8764\n      %13300 = OpShiftRightLogical %uint %17362 %uint_9\n      %24974 = OpBitwiseAnd %uint %13300 %uint_7\n      %25211 = OpIMul %uint %13106 %24974\n      %19891 = OpIAdd %uint %15028 %25211\n      %12627 = OpUDiv %uint %19891 %uint_7\n      %25070 = OpShiftLeftLogical %uint %12627 %uint_16\n       %9156 = OpBitwiseOr %uint %13011 %25070\n      %21471 = OpCompositeConstruct %v2uint %7558 %9156\n               OpBranch %20298\n      %20298 = OpLabel\n      %10927 = OpPhi %v2uint %23856 %10646 %21471 %14528\n               OpSelectionMerge %19329 None\n               OpBranchConditional %20102 %10647 %14529\n      %10647 = OpLabel\n      %17664 = OpBitwiseAnd %uint %19680 %uint_1170\n      %23955 = OpBitwiseAnd %uint %19680 %uint_2340\n      %21851 = OpShiftRightLogical %uint %23955 %uint_1\n       %8140 = OpBitwiseAnd %uint %17664 %21851\n      %24616 = OpShiftLeftLogical %uint %8140 %uint_1\n      %22963 = OpShiftRightLogical %uint %8140 %uint_1\n      %18815 = OpBitwiseOr %uint %24616 %22963\n      %15917 = OpBitwiseOr %uint %8140 %18815\n       %8462 = OpNot %uint %15917\n      %10085 = OpBitwiseAnd %uint %19680 %8462\n      %16303 = OpISub %uint %uint_2925 %10085\n      %17418 = OpBitwiseAnd %uint %16303 %8462\n      %16994 = OpBitwiseAnd %uint %17418 %uint_7\n      %13680 = OpIMul %uint %12931 %16994\n      %21981 = OpBitwiseAnd %uint %10085 %uint_7\n      %20396 = OpIMul %uint %13107 %21981\n      %19855 = OpIAdd %uint %13680 %20396\n      %13012 = OpUDiv %uint %19855 %uint_5\n      %23034 = OpShiftRightLogical %uint %17418 %uint_3\n       %8765 = OpBitwiseAnd %uint %23034 %uint_7\n      %15029 = OpIMul %uint %12931 %8765\n      %13301 = OpShiftRightLogical %uint %10085 %uint_3\n      %24975 = OpBitwiseAnd %uint %13301 %uint_7\n      %25212 = OpIMul %uint %13107 %24975\n      %19892 = OpIAdd %uint %15029 %25212\n      %12628 = OpUDiv %uint %19892 %uint_5\n       %8166 = OpShiftLeftLogical %uint %12628 %uint_16\n       %7559 = OpBitwiseOr %uint %13012 %8166\n      %21941 = OpShiftRightLogical %uint %17418 %uint_6\n      %17599 = OpBitwiseAnd %uint %21941 %uint_7\n      %15030 = OpIMul %uint %12931 %17599\n      %13302 = OpShiftRightLogical %uint %10085 %uint_6\n      %24976 = OpBitwiseAnd %uint %13302 %uint_7\n      %25213 = OpIMul %uint %13107 %24976\n      %19856 = OpIAdd %uint %15030 %25213\n      %13013 = OpUDiv %uint %19856 %uint_5\n      %23035 = OpShiftRightLogical %uint %17418 %uint_9\n       %8766 = OpBitwiseAnd %uint %23035 %uint_7\n      %15031 = OpIMul %uint %12931 %8766\n      %13303 = OpShiftRightLogical %uint %10085 %uint_9\n      %24977 = OpBitwiseAnd %uint %13303 %uint_7\n      %25214 = OpIMul %uint %13107 %24977\n      %19893 = OpIAdd %uint %15031 %25214\n      %12629 = OpUDiv %uint %19893 %uint_5\n      %25071 = OpShiftLeftLogical %uint %12629 %uint_16\n       %8207 = OpBitwiseOr %uint %13013 %25071\n      %10120 = OpCompositeConstruct %v2uint %7559 %8207\n      %24271 = OpBitwiseAnd %uint %19680 %15917\n      %16379 = OpBitwiseAnd %uint %24271 %uint_1\n      %19562 = OpBitwiseAnd %uint %24271 %uint_8\n      %24840 = OpShiftLeftLogical %uint %19562 %uint_13\n      %18008 = OpBitwiseOr %uint %16379 %24840\n      %23211 = OpShiftRightLogical %uint %24271 %uint_6\n      %25113 = OpBitwiseAnd %uint %23211 %uint_1\n      %18758 = OpBitwiseAnd %uint %24271 %uint_512\n      %22678 = OpShiftLeftLogical %uint %18758 %uint_7\n      %17386 = OpBitwiseOr %uint %25113 %22678\n      %20362 = OpCompositeConstruct %v2uint %18008 %17386\n      %20762 = OpIMul %v2uint %20362 %1140\n      %23857 = OpIAdd %v2uint %10120 %20762\n               OpBranch %19329\n      %14529 = OpLabel\n      %10711 = OpNot %uint %19680\n      %15361 = OpBitwiseAnd %uint %10711 %uint_7\n      %17715 = OpIMul %uint %12931 %15361\n      %21982 = OpBitwiseAnd %uint %19680 %uint_7\n      %20397 = OpIMul %uint %13107 %21982\n      %19857 = OpIAdd %uint %17715 %20397\n      %13014 = OpUDiv %uint %19857 %uint_7\n      %23036 = OpShiftRightLogical %uint %10711 %uint_3\n       %8767 = OpBitwiseAnd %uint %23036 %uint_7\n      %15032 = OpIMul %uint %12931 %8767\n      %13304 = OpShiftRightLogical %uint %19680 %uint_3\n      %24978 = OpBitwiseAnd %uint %13304 %uint_7\n      %25215 = OpIMul %uint %13107 %24978\n      %19894 = OpIAdd %uint %15032 %25215\n      %12630 = OpUDiv %uint %19894 %uint_7\n       %8167 = OpShiftLeftLogical %uint %12630 %uint_16\n       %7560 = OpBitwiseOr %uint %13014 %8167\n      %21942 = OpShiftRightLogical %uint %10711 %uint_6\n      %17600 = OpBitwiseAnd %uint %21942 %uint_7\n      %15033 = OpIMul %uint %12931 %17600\n      %13305 = OpShiftRightLogical %uint %19680 %uint_6\n      %24979 = OpBitwiseAnd %uint %13305 %uint_7\n      %25216 = OpIMul %uint %13107 %24979\n      %19858 = OpIAdd %uint %15033 %25216\n      %13016 = OpUDiv %uint %19858 %uint_7\n      %23037 = OpShiftRightLogical %uint %10711 %uint_9\n       %8768 = OpBitwiseAnd %uint %23037 %uint_7\n      %15034 = OpIMul %uint %12931 %8768\n      %13306 = OpShiftRightLogical %uint %19680 %uint_9\n      %24980 = OpBitwiseAnd %uint %13306 %uint_7\n      %25217 = OpIMul %uint %13107 %24980\n      %19895 = OpIAdd %uint %15034 %25217\n      %12631 = OpUDiv %uint %19895 %uint_7\n      %25072 = OpShiftLeftLogical %uint %12631 %uint_16\n       %9157 = OpBitwiseOr %uint %13016 %25072\n      %21472 = OpCompositeConstruct %v2uint %7560 %9157\n               OpBranch %19329\n      %19329 = OpLabel\n      %18741 = OpPhi %v2uint %23857 %10647 %21472 %14529\n       %7884 = OpShiftLeftLogical %v2uint %18741 %1975\n       %8441 = OpBitwiseOr %v2uint %10927 %7884\n      %20097 = OpCompositeExtract %uint %21076 0\n      %23730 = OpCompositeExtract %uint %21076 1\n       %7643 = OpCompositeExtract %uint %8441 0\n       %7529 = OpCompositeExtract %uint %8441 1\n      %18260 = OpCompositeConstruct %v4uint %20097 %23730 %7643 %7529\n       %8787 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %7112\n               OpStore %8787 %18260\n      %12832 = OpCompositeExtract %uint %17344 1\n      %23232 = OpIAdd %uint %12832 %int_1\n      %17425 = OpULessThan %bool %23232 %6594\n               OpSelectionMerge %7207 DontFlatten\n               OpBranchConditional %17425 %22828 %7207\n      %22828 = OpLabel\n      %15481 = OpIAdd %uint %14582 %22412\n      %12023 = OpShiftRightLogical %v4uint %14852 %533\n      %23038 = OpShiftRightLogical %uint %15481 %int_4\n      %19251 = OpCompositeExtract %uint %12023 0\n               OpSelectionMerge %17143 None\n               OpBranchConditional %20099 %10648 %14530\n      %10648 = OpLabel\n      %17665 = OpBitwiseAnd %uint %19251 %uint_1170\n      %23956 = OpBitwiseAnd %uint %19251 %uint_2340\n      %21852 = OpShiftRightLogical %uint %23956 %uint_1\n       %8141 = OpBitwiseAnd %uint %17665 %21852\n      %24617 = OpShiftLeftLogical %uint %8141 %uint_1\n      %22964 = OpShiftRightLogical %uint %8141 %uint_1\n      %18816 = OpBitwiseOr %uint %24617 %22964\n      %15918 = OpBitwiseOr %uint %8141 %18816\n       %8463 = OpNot %uint %15918\n      %10086 = OpBitwiseAnd %uint %19251 %8463\n      %16304 = OpISub %uint %uint_2925 %10086\n      %17419 = OpBitwiseAnd %uint %16304 %8463\n      %16995 = OpBitwiseAnd %uint %17419 %uint_7\n      %13681 = OpIMul %uint %6502 %16995\n      %21983 = OpBitwiseAnd %uint %10086 %uint_7\n      %20400 = OpIMul %uint %13104 %21983\n      %19859 = OpIAdd %uint %13681 %20400\n      %13017 = OpUDiv %uint %19859 %uint_5\n      %23039 = OpShiftRightLogical %uint %17419 %uint_3\n       %8769 = OpBitwiseAnd %uint %23039 %uint_7\n      %15035 = OpIMul %uint %6502 %8769\n      %13307 = OpShiftRightLogical %uint %10086 %uint_3\n      %24981 = OpBitwiseAnd %uint %13307 %uint_7\n      %25218 = OpIMul %uint %13104 %24981\n      %19896 = OpIAdd %uint %15035 %25218\n      %12632 = OpUDiv %uint %19896 %uint_5\n       %8168 = OpShiftLeftLogical %uint %12632 %uint_16\n       %7561 = OpBitwiseOr %uint %13017 %8168\n      %21943 = OpShiftRightLogical %uint %17419 %uint_6\n      %17601 = OpBitwiseAnd %uint %21943 %uint_7\n      %15036 = OpIMul %uint %6502 %17601\n      %13308 = OpShiftRightLogical %uint %10086 %uint_6\n      %24982 = OpBitwiseAnd %uint %13308 %uint_7\n      %25219 = OpIMul %uint %13104 %24982\n      %19860 = OpIAdd %uint %15036 %25219\n      %13018 = OpUDiv %uint %19860 %uint_5\n      %23040 = OpShiftRightLogical %uint %17419 %uint_9\n       %8770 = OpBitwiseAnd %uint %23040 %uint_7\n      %15037 = OpIMul %uint %6502 %8770\n      %13309 = OpShiftRightLogical %uint %10086 %uint_9\n      %24983 = OpBitwiseAnd %uint %13309 %uint_7\n      %25220 = OpIMul %uint %13104 %24983\n      %19897 = OpIAdd %uint %15037 %25220\n      %12633 = OpUDiv %uint %19897 %uint_5\n      %25073 = OpShiftLeftLogical %uint %12633 %uint_16\n       %8208 = OpBitwiseOr %uint %13018 %25073\n      %10121 = OpCompositeConstruct %v2uint %7561 %8208\n      %24272 = OpBitwiseAnd %uint %19251 %15918\n      %16380 = OpBitwiseAnd %uint %24272 %uint_1\n      %19563 = OpBitwiseAnd %uint %24272 %uint_8\n      %24841 = OpShiftLeftLogical %uint %19563 %uint_13\n      %18009 = OpBitwiseOr %uint %16380 %24841\n      %23212 = OpShiftRightLogical %uint %24272 %uint_6\n      %25114 = OpBitwiseAnd %uint %23212 %uint_1\n      %18759 = OpBitwiseAnd %uint %24272 %uint_512\n      %22679 = OpShiftLeftLogical %uint %18759 %uint_7\n      %17387 = OpBitwiseOr %uint %25114 %22679\n      %20363 = OpCompositeConstruct %v2uint %18009 %17387\n      %20763 = OpIMul %v2uint %20363 %1140\n      %23858 = OpIAdd %v2uint %10121 %20763\n               OpBranch %17143\n      %14530 = OpLabel\n      %10712 = OpNot %uint %19251\n      %15362 = OpBitwiseAnd %uint %10712 %uint_7\n      %17716 = OpIMul %uint %6502 %15362\n      %21984 = OpBitwiseAnd %uint %19251 %uint_7\n      %20401 = OpIMul %uint %13104 %21984\n      %19861 = OpIAdd %uint %17716 %20401\n      %13019 = OpUDiv %uint %19861 %uint_7\n      %23041 = OpShiftRightLogical %uint %10712 %uint_3\n       %8771 = OpBitwiseAnd %uint %23041 %uint_7\n      %15038 = OpIMul %uint %6502 %8771\n      %13310 = OpShiftRightLogical %uint %19251 %uint_3\n      %24984 = OpBitwiseAnd %uint %13310 %uint_7\n      %25221 = OpIMul %uint %13104 %24984\n      %19898 = OpIAdd %uint %15038 %25221\n      %12634 = OpUDiv %uint %19898 %uint_7\n       %8169 = OpShiftLeftLogical %uint %12634 %uint_16\n       %7562 = OpBitwiseOr %uint %13019 %8169\n      %21944 = OpShiftRightLogical %uint %10712 %uint_6\n      %17602 = OpBitwiseAnd %uint %21944 %uint_7\n      %15039 = OpIMul %uint %6502 %17602\n      %13311 = OpShiftRightLogical %uint %19251 %uint_6\n      %24985 = OpBitwiseAnd %uint %13311 %uint_7\n      %25222 = OpIMul %uint %13104 %24985\n      %19862 = OpIAdd %uint %15039 %25222\n      %13020 = OpUDiv %uint %19862 %uint_7\n      %23042 = OpShiftRightLogical %uint %10712 %uint_9\n       %8772 = OpBitwiseAnd %uint %23042 %uint_7\n      %15040 = OpIMul %uint %6502 %8772\n      %13312 = OpShiftRightLogical %uint %19251 %uint_9\n      %24986 = OpBitwiseAnd %uint %13312 %uint_7\n      %25223 = OpIMul %uint %13104 %24986\n      %19899 = OpIAdd %uint %15040 %25223\n      %12635 = OpUDiv %uint %19899 %uint_7\n      %25074 = OpShiftLeftLogical %uint %12635 %uint_16\n       %9158 = OpBitwiseOr %uint %13020 %25074\n      %21473 = OpCompositeConstruct %v2uint %7562 %9158\n               OpBranch %17143\n      %17143 = OpLabel\n      %20514 = OpPhi %v2uint %23858 %10648 %21473 %14530\n      %16618 = OpCompositeExtract %uint %12023 1\n               OpSelectionMerge %19330 None\n               OpBranchConditional %20100 %10649 %14531\n      %10649 = OpLabel\n      %17666 = OpBitwiseAnd %uint %16618 %uint_1170\n      %23957 = OpBitwiseAnd %uint %16618 %uint_2340\n      %21853 = OpShiftRightLogical %uint %23957 %uint_1\n       %8142 = OpBitwiseAnd %uint %17666 %21853\n      %24618 = OpShiftLeftLogical %uint %8142 %uint_1\n      %22965 = OpShiftRightLogical %uint %8142 %uint_1\n      %18817 = OpBitwiseOr %uint %24618 %22965\n      %15919 = OpBitwiseOr %uint %8142 %18817\n       %8464 = OpNot %uint %15919\n      %10087 = OpBitwiseAnd %uint %16618 %8464\n      %16305 = OpISub %uint %uint_2925 %10087\n      %17420 = OpBitwiseAnd %uint %16305 %8464\n      %16996 = OpBitwiseAnd %uint %17420 %uint_7\n      %13682 = OpIMul %uint %12929 %16996\n      %21985 = OpBitwiseAnd %uint %10087 %uint_7\n      %20402 = OpIMul %uint %13105 %21985\n      %19863 = OpIAdd %uint %13682 %20402\n      %13021 = OpUDiv %uint %19863 %uint_5\n      %23043 = OpShiftRightLogical %uint %17420 %uint_3\n       %8773 = OpBitwiseAnd %uint %23043 %uint_7\n      %15041 = OpIMul %uint %12929 %8773\n      %13313 = OpShiftRightLogical %uint %10087 %uint_3\n      %24987 = OpBitwiseAnd %uint %13313 %uint_7\n      %25224 = OpIMul %uint %13105 %24987\n      %19900 = OpIAdd %uint %15041 %25224\n      %12636 = OpUDiv %uint %19900 %uint_5\n       %8170 = OpShiftLeftLogical %uint %12636 %uint_16\n       %7563 = OpBitwiseOr %uint %13021 %8170\n      %21945 = OpShiftRightLogical %uint %17420 %uint_6\n      %17603 = OpBitwiseAnd %uint %21945 %uint_7\n      %15042 = OpIMul %uint %12929 %17603\n      %13314 = OpShiftRightLogical %uint %10087 %uint_6\n      %24988 = OpBitwiseAnd %uint %13314 %uint_7\n      %25225 = OpIMul %uint %13105 %24988\n      %19864 = OpIAdd %uint %15042 %25225\n      %13022 = OpUDiv %uint %19864 %uint_5\n      %23044 = OpShiftRightLogical %uint %17420 %uint_9\n       %8774 = OpBitwiseAnd %uint %23044 %uint_7\n      %15043 = OpIMul %uint %12929 %8774\n      %13315 = OpShiftRightLogical %uint %10087 %uint_9\n      %24989 = OpBitwiseAnd %uint %13315 %uint_7\n      %25226 = OpIMul %uint %13105 %24989\n      %19901 = OpIAdd %uint %15043 %25226\n      %12637 = OpUDiv %uint %19901 %uint_5\n      %25075 = OpShiftLeftLogical %uint %12637 %uint_16\n       %8209 = OpBitwiseOr %uint %13022 %25075\n      %10123 = OpCompositeConstruct %v2uint %7563 %8209\n      %24273 = OpBitwiseAnd %uint %16618 %15919\n      %16381 = OpBitwiseAnd %uint %24273 %uint_1\n      %19564 = OpBitwiseAnd %uint %24273 %uint_8\n      %24842 = OpShiftLeftLogical %uint %19564 %uint_13\n      %18010 = OpBitwiseOr %uint %16381 %24842\n      %23213 = OpShiftRightLogical %uint %24273 %uint_6\n      %25115 = OpBitwiseAnd %uint %23213 %uint_1\n      %18760 = OpBitwiseAnd %uint %24273 %uint_512\n      %22680 = OpShiftLeftLogical %uint %18760 %uint_7\n      %17388 = OpBitwiseOr %uint %25115 %22680\n      %20364 = OpCompositeConstruct %v2uint %18010 %17388\n      %20764 = OpIMul %v2uint %20364 %1140\n      %23859 = OpIAdd %v2uint %10123 %20764\n               OpBranch %19330\n      %14531 = OpLabel\n      %10713 = OpNot %uint %16618\n      %15363 = OpBitwiseAnd %uint %10713 %uint_7\n      %17717 = OpIMul %uint %12929 %15363\n      %21986 = OpBitwiseAnd %uint %16618 %uint_7\n      %20407 = OpIMul %uint %13105 %21986\n      %19865 = OpIAdd %uint %17717 %20407\n      %13023 = OpUDiv %uint %19865 %uint_7\n      %23045 = OpShiftRightLogical %uint %10713 %uint_3\n       %8775 = OpBitwiseAnd %uint %23045 %uint_7\n      %15044 = OpIMul %uint %12929 %8775\n      %13316 = OpShiftRightLogical %uint %16618 %uint_3\n      %24990 = OpBitwiseAnd %uint %13316 %uint_7\n      %25227 = OpIMul %uint %13105 %24990\n      %19902 = OpIAdd %uint %15044 %25227\n      %12638 = OpUDiv %uint %19902 %uint_7\n       %8171 = OpShiftLeftLogical %uint %12638 %uint_16\n       %7564 = OpBitwiseOr %uint %13023 %8171\n      %21946 = OpShiftRightLogical %uint %10713 %uint_6\n      %17604 = OpBitwiseAnd %uint %21946 %uint_7\n      %15045 = OpIMul %uint %12929 %17604\n      %13317 = OpShiftRightLogical %uint %16618 %uint_6\n      %24991 = OpBitwiseAnd %uint %13317 %uint_7\n      %25228 = OpIMul %uint %13105 %24991\n      %19866 = OpIAdd %uint %15045 %25228\n      %13024 = OpUDiv %uint %19866 %uint_7\n      %23046 = OpShiftRightLogical %uint %10713 %uint_9\n       %8776 = OpBitwiseAnd %uint %23046 %uint_7\n      %15046 = OpIMul %uint %12929 %8776\n      %13318 = OpShiftRightLogical %uint %16618 %uint_9\n      %24992 = OpBitwiseAnd %uint %13318 %uint_7\n      %25229 = OpIMul %uint %13105 %24992\n      %19903 = OpIAdd %uint %15046 %25229\n      %12639 = OpUDiv %uint %19903 %uint_7\n      %25076 = OpShiftLeftLogical %uint %12639 %uint_16\n       %9159 = OpBitwiseOr %uint %13024 %25076\n      %21474 = OpCompositeConstruct %v2uint %7564 %9159\n               OpBranch %19330\n      %19330 = OpLabel\n      %18742 = OpPhi %v2uint %23859 %10649 %21474 %14531\n       %7885 = OpShiftLeftLogical %v2uint %18742 %1975\n      %11595 = OpBitwiseOr %v2uint %20514 %7885\n      %13660 = OpCompositeExtract %uint %12023 2\n               OpSelectionMerge %17144 None\n               OpBranchConditional %20101 %10650 %14532\n      %10650 = OpLabel\n      %17667 = OpBitwiseAnd %uint %13660 %uint_1170\n      %23958 = OpBitwiseAnd %uint %13660 %uint_2340\n      %21854 = OpShiftRightLogical %uint %23958 %uint_1\n       %8143 = OpBitwiseAnd %uint %17667 %21854\n      %24619 = OpShiftLeftLogical %uint %8143 %uint_1\n      %22966 = OpShiftRightLogical %uint %8143 %uint_1\n      %18818 = OpBitwiseOr %uint %24619 %22966\n      %15920 = OpBitwiseOr %uint %8143 %18818\n       %8465 = OpNot %uint %15920\n      %10088 = OpBitwiseAnd %uint %13660 %8465\n      %16306 = OpISub %uint %uint_2925 %10088\n      %17421 = OpBitwiseAnd %uint %16306 %8465\n      %16997 = OpBitwiseAnd %uint %17421 %uint_7\n      %13683 = OpIMul %uint %12930 %16997\n      %21987 = OpBitwiseAnd %uint %10088 %uint_7\n      %20408 = OpIMul %uint %13106 %21987\n      %19867 = OpIAdd %uint %13683 %20408\n      %13025 = OpUDiv %uint %19867 %uint_5\n      %23047 = OpShiftRightLogical %uint %17421 %uint_3\n       %8777 = OpBitwiseAnd %uint %23047 %uint_7\n      %15047 = OpIMul %uint %12930 %8777\n      %13319 = OpShiftRightLogical %uint %10088 %uint_3\n      %24993 = OpBitwiseAnd %uint %13319 %uint_7\n      %25230 = OpIMul %uint %13106 %24993\n      %19904 = OpIAdd %uint %15047 %25230\n      %12640 = OpUDiv %uint %19904 %uint_5\n       %8172 = OpShiftLeftLogical %uint %12640 %uint_16\n       %7565 = OpBitwiseOr %uint %13025 %8172\n      %21947 = OpShiftRightLogical %uint %17421 %uint_6\n      %17605 = OpBitwiseAnd %uint %21947 %uint_7\n      %15048 = OpIMul %uint %12930 %17605\n      %13320 = OpShiftRightLogical %uint %10088 %uint_6\n      %24994 = OpBitwiseAnd %uint %13320 %uint_7\n      %25231 = OpIMul %uint %13106 %24994\n      %19868 = OpIAdd %uint %15048 %25231\n      %13026 = OpUDiv %uint %19868 %uint_5\n      %23048 = OpShiftRightLogical %uint %17421 %uint_9\n       %8778 = OpBitwiseAnd %uint %23048 %uint_7\n      %15049 = OpIMul %uint %12930 %8778\n      %13321 = OpShiftRightLogical %uint %10088 %uint_9\n      %24995 = OpBitwiseAnd %uint %13321 %uint_7\n      %25232 = OpIMul %uint %13106 %24995\n      %19905 = OpIAdd %uint %15049 %25232\n      %12641 = OpUDiv %uint %19905 %uint_5\n      %25077 = OpShiftLeftLogical %uint %12641 %uint_16\n       %8210 = OpBitwiseOr %uint %13026 %25077\n      %10124 = OpCompositeConstruct %v2uint %7565 %8210\n      %24274 = OpBitwiseAnd %uint %13660 %15920\n      %16382 = OpBitwiseAnd %uint %24274 %uint_1\n      %19565 = OpBitwiseAnd %uint %24274 %uint_8\n      %24843 = OpShiftLeftLogical %uint %19565 %uint_13\n      %18011 = OpBitwiseOr %uint %16382 %24843\n      %23214 = OpShiftRightLogical %uint %24274 %uint_6\n      %25116 = OpBitwiseAnd %uint %23214 %uint_1\n      %18761 = OpBitwiseAnd %uint %24274 %uint_512\n      %22681 = OpShiftLeftLogical %uint %18761 %uint_7\n      %17389 = OpBitwiseOr %uint %25116 %22681\n      %20365 = OpCompositeConstruct %v2uint %18011 %17389\n      %20765 = OpIMul %v2uint %20365 %1140\n      %23860 = OpIAdd %v2uint %10124 %20765\n               OpBranch %17144\n      %14532 = OpLabel\n      %10714 = OpNot %uint %13660\n      %15364 = OpBitwiseAnd %uint %10714 %uint_7\n      %17718 = OpIMul %uint %12930 %15364\n      %21988 = OpBitwiseAnd %uint %13660 %uint_7\n      %20409 = OpIMul %uint %13106 %21988\n      %19869 = OpIAdd %uint %17718 %20409\n      %13027 = OpUDiv %uint %19869 %uint_7\n      %23049 = OpShiftRightLogical %uint %10714 %uint_3\n       %8779 = OpBitwiseAnd %uint %23049 %uint_7\n      %15050 = OpIMul %uint %12930 %8779\n      %13322 = OpShiftRightLogical %uint %13660 %uint_3\n      %24996 = OpBitwiseAnd %uint %13322 %uint_7\n      %25233 = OpIMul %uint %13106 %24996\n      %19906 = OpIAdd %uint %15050 %25233\n      %12642 = OpUDiv %uint %19906 %uint_7\n       %8173 = OpShiftLeftLogical %uint %12642 %uint_16\n       %7566 = OpBitwiseOr %uint %13027 %8173\n      %21948 = OpShiftRightLogical %uint %10714 %uint_6\n      %17606 = OpBitwiseAnd %uint %21948 %uint_7\n      %15051 = OpIMul %uint %12930 %17606\n      %13323 = OpShiftRightLogical %uint %13660 %uint_6\n      %24997 = OpBitwiseAnd %uint %13323 %uint_7\n      %25234 = OpIMul %uint %13106 %24997\n      %19870 = OpIAdd %uint %15051 %25234\n      %13028 = OpUDiv %uint %19870 %uint_7\n      %23050 = OpShiftRightLogical %uint %10714 %uint_9\n       %8780 = OpBitwiseAnd %uint %23050 %uint_7\n      %15052 = OpIMul %uint %12930 %8780\n      %13324 = OpShiftRightLogical %uint %13660 %uint_9\n      %24998 = OpBitwiseAnd %uint %13324 %uint_7\n      %25235 = OpIMul %uint %13106 %24998\n      %19907 = OpIAdd %uint %15052 %25235\n      %12643 = OpUDiv %uint %19907 %uint_7\n      %25078 = OpShiftLeftLogical %uint %12643 %uint_16\n       %9160 = OpBitwiseOr %uint %13028 %25078\n      %21475 = OpCompositeConstruct %v2uint %7566 %9160\n               OpBranch %17144\n      %17144 = OpLabel\n      %20515 = OpPhi %v2uint %23860 %10650 %21475 %14532\n      %16619 = OpCompositeExtract %uint %12023 3\n               OpSelectionMerge %19331 None\n               OpBranchConditional %20102 %10651 %14533\n      %10651 = OpLabel\n      %17668 = OpBitwiseAnd %uint %16619 %uint_1170\n      %23959 = OpBitwiseAnd %uint %16619 %uint_2340\n      %21855 = OpShiftRightLogical %uint %23959 %uint_1\n       %8144 = OpBitwiseAnd %uint %17668 %21855\n      %24620 = OpShiftLeftLogical %uint %8144 %uint_1\n      %22967 = OpShiftRightLogical %uint %8144 %uint_1\n      %18819 = OpBitwiseOr %uint %24620 %22967\n      %15921 = OpBitwiseOr %uint %8144 %18819\n       %8466 = OpNot %uint %15921\n      %10089 = OpBitwiseAnd %uint %16619 %8466\n      %16307 = OpISub %uint %uint_2925 %10089\n      %17422 = OpBitwiseAnd %uint %16307 %8466\n      %16998 = OpBitwiseAnd %uint %17422 %uint_7\n      %13684 = OpIMul %uint %12931 %16998\n      %21989 = OpBitwiseAnd %uint %10089 %uint_7\n      %20410 = OpIMul %uint %13107 %21989\n      %19871 = OpIAdd %uint %13684 %20410\n      %13029 = OpUDiv %uint %19871 %uint_5\n      %23051 = OpShiftRightLogical %uint %17422 %uint_3\n       %8781 = OpBitwiseAnd %uint %23051 %uint_7\n      %15053 = OpIMul %uint %12931 %8781\n      %13325 = OpShiftRightLogical %uint %10089 %uint_3\n      %24999 = OpBitwiseAnd %uint %13325 %uint_7\n      %25236 = OpIMul %uint %13107 %24999\n      %19908 = OpIAdd %uint %15053 %25236\n      %12644 = OpUDiv %uint %19908 %uint_5\n       %8174 = OpShiftLeftLogical %uint %12644 %uint_16\n       %7567 = OpBitwiseOr %uint %13029 %8174\n      %21949 = OpShiftRightLogical %uint %17422 %uint_6\n      %17607 = OpBitwiseAnd %uint %21949 %uint_7\n      %15054 = OpIMul %uint %12931 %17607\n      %13326 = OpShiftRightLogical %uint %10089 %uint_6\n      %25000 = OpBitwiseAnd %uint %13326 %uint_7\n      %25237 = OpIMul %uint %13107 %25000\n      %19872 = OpIAdd %uint %15054 %25237\n      %13030 = OpUDiv %uint %19872 %uint_5\n      %23052 = OpShiftRightLogical %uint %17422 %uint_9\n       %8782 = OpBitwiseAnd %uint %23052 %uint_7\n      %15055 = OpIMul %uint %12931 %8782\n      %13327 = OpShiftRightLogical %uint %10089 %uint_9\n      %25001 = OpBitwiseAnd %uint %13327 %uint_7\n      %25238 = OpIMul %uint %13107 %25001\n      %19909 = OpIAdd %uint %15055 %25238\n      %12645 = OpUDiv %uint %19909 %uint_5\n      %25079 = OpShiftLeftLogical %uint %12645 %uint_16\n       %8211 = OpBitwiseOr %uint %13030 %25079\n      %10125 = OpCompositeConstruct %v2uint %7567 %8211\n      %24275 = OpBitwiseAnd %uint %16619 %15921\n      %16383 = OpBitwiseAnd %uint %24275 %uint_1\n      %19566 = OpBitwiseAnd %uint %24275 %uint_8\n      %24844 = OpShiftLeftLogical %uint %19566 %uint_13\n      %18012 = OpBitwiseOr %uint %16383 %24844\n      %23215 = OpShiftRightLogical %uint %24275 %uint_6\n      %25117 = OpBitwiseAnd %uint %23215 %uint_1\n      %18762 = OpBitwiseAnd %uint %24275 %uint_512\n      %22682 = OpShiftLeftLogical %uint %18762 %uint_7\n      %17390 = OpBitwiseOr %uint %25117 %22682\n      %20366 = OpCompositeConstruct %v2uint %18012 %17390\n      %20767 = OpIMul %v2uint %20366 %1140\n      %23861 = OpIAdd %v2uint %10125 %20767\n               OpBranch %19331\n      %14533 = OpLabel\n      %10715 = OpNot %uint %16619\n      %15365 = OpBitwiseAnd %uint %10715 %uint_7\n      %17719 = OpIMul %uint %12931 %15365\n      %21990 = OpBitwiseAnd %uint %16619 %uint_7\n      %20411 = OpIMul %uint %13107 %21990\n      %19873 = OpIAdd %uint %17719 %20411\n      %13031 = OpUDiv %uint %19873 %uint_7\n      %23053 = OpShiftRightLogical %uint %10715 %uint_3\n       %8783 = OpBitwiseAnd %uint %23053 %uint_7\n      %15056 = OpIMul %uint %12931 %8783\n      %13328 = OpShiftRightLogical %uint %16619 %uint_3\n      %25002 = OpBitwiseAnd %uint %13328 %uint_7\n      %25239 = OpIMul %uint %13107 %25002\n      %19910 = OpIAdd %uint %15056 %25239\n      %12646 = OpUDiv %uint %19910 %uint_7\n       %8175 = OpShiftLeftLogical %uint %12646 %uint_16\n       %7568 = OpBitwiseOr %uint %13031 %8175\n      %21950 = OpShiftRightLogical %uint %10715 %uint_6\n      %17608 = OpBitwiseAnd %uint %21950 %uint_7\n      %15057 = OpIMul %uint %12931 %17608\n      %13329 = OpShiftRightLogical %uint %16619 %uint_6\n      %25003 = OpBitwiseAnd %uint %13329 %uint_7\n      %25240 = OpIMul %uint %13107 %25003\n      %19874 = OpIAdd %uint %15057 %25240\n      %13032 = OpUDiv %uint %19874 %uint_7\n      %23057 = OpShiftRightLogical %uint %10715 %uint_9\n       %8784 = OpBitwiseAnd %uint %23057 %uint_7\n      %15058 = OpIMul %uint %12931 %8784\n      %13330 = OpShiftRightLogical %uint %16619 %uint_9\n      %25004 = OpBitwiseAnd %uint %13330 %uint_7\n      %25241 = OpIMul %uint %13107 %25004\n      %19911 = OpIAdd %uint %15058 %25241\n      %12647 = OpUDiv %uint %19911 %uint_7\n      %25080 = OpShiftLeftLogical %uint %12647 %uint_16\n       %9161 = OpBitwiseOr %uint %13032 %25080\n      %21476 = OpCompositeConstruct %v2uint %7568 %9161\n               OpBranch %19331\n      %19331 = OpLabel\n      %18743 = OpPhi %v2uint %23861 %10651 %21476 %14533\n       %7886 = OpShiftLeftLogical %v2uint %18743 %1975\n       %8442 = OpBitwiseOr %v2uint %20515 %7886\n      %20098 = OpCompositeExtract %uint %11595 0\n      %23731 = OpCompositeExtract %uint %11595 1\n       %7644 = OpCompositeExtract %uint %8442 0\n       %7530 = OpCompositeExtract %uint %8442 1\n      %18261 = OpCompositeConstruct %v4uint %20098 %23731 %7644 %7530\n       %9680 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %23038\n               OpStore %9680 %18261\n      %14840 = OpIAdd %uint %12832 %int_2\n      %11787 = OpULessThan %bool %14840 %6594\n               OpSelectionMerge %7206 DontFlatten\n               OpBranchConditional %11787 %22829 %7206\n      %22829 = OpLabel\n      %13334 = OpIAdd %uint %15481 %22412\n      %15655 = OpShiftRightLogical %v4uint %16695 %317\n      %23835 = OpCompositeExtract %uint %15655 0\n               OpSelectionMerge %11723 None\n               OpBranchConditional %20099 %10652 %21929\n      %10652 = OpLabel\n      %17669 = OpBitwiseAnd %uint %23835 %uint_4793490\n      %23960 = OpBitwiseAnd %uint %23835 %uint_9586980\n      %21856 = OpShiftRightLogical %uint %23960 %uint_1\n       %8145 = OpBitwiseAnd %uint %17669 %21856\n      %24621 = OpShiftLeftLogical %uint %8145 %uint_1\n      %22968 = OpShiftRightLogical %uint %8145 %uint_1\n      %18797 = OpBitwiseOr %uint %24621 %22968\n      %16053 = OpBitwiseOr %uint %8145 %18797\n      %18313 = OpBitwiseAnd %uint %23835 %uint_2396745\n      %14689 = OpBitwiseOr %uint %18313 %uint_14380470\n      %20412 = OpBitwiseAnd %uint %14689 %16053\n      %20543 = OpShiftRightLogical %uint %17669 %uint_1\n      %24926 = OpBitwiseOr %uint %18313 %20543\n      %21928 = OpShiftRightLogical %uint %23960 %uint_2\n      %22683 = OpBitwiseOr %uint %24926 %21928\n       %7729 = OpBitwiseXor %uint %22683 %uint_2396745\n       %9549 = OpNot %uint %20543\n      %14629 = OpBitwiseAnd %uint %18313 %9549\n       %8433 = OpNot %uint %21928\n      %11415 = OpBitwiseAnd %uint %14629 %8433\n       %6807 = OpBitwiseOr %uint %23835 %7729\n      %19517 = OpISub %uint %6807 %uint_2396745\n      %14881 = OpBitwiseOr %uint %19517 %11415\n      %18232 = OpShiftLeftLogical %uint %11415 %uint_2\n      %15366 = OpBitwiseOr %uint %14881 %18232\n      %12158 = OpNot %uint %16053\n      %18516 = OpBitwiseAnd %uint %15366 %12158\n       %6256 = OpBitwiseOr %uint %18516 %20412\n               OpBranch %11723\n      %21929 = OpLabel\n      %20083 = OpBitwiseAnd %uint %23835 %uint_2396745\n      %23914 = OpBitwiseAnd %uint %23835 %uint_4793490\n      %22251 = OpShiftRightLogical %uint %23914 %uint_1\n      %24004 = OpBitwiseOr %uint %20083 %22251\n      %19603 = OpBitwiseAnd %uint %23835 %uint_9586980\n      %20619 = OpShiftRightLogical %uint %19603 %uint_2\n      %24291 = OpBitwiseOr %uint %24004 %20619\n       %7730 = OpBitwiseXor %uint %24291 %uint_2396745\n       %9550 = OpNot %uint %22251\n      %14630 = OpBitwiseAnd %uint %20083 %9550\n       %8434 = OpNot %uint %20619\n      %11416 = OpBitwiseAnd %uint %14630 %8434\n       %6808 = OpBitwiseOr %uint %23835 %7730\n      %19518 = OpISub %uint %6808 %uint_2396745\n      %14882 = OpBitwiseOr %uint %19518 %11416\n      %18156 = OpShiftLeftLogical %uint %11416 %uint_1\n      %16012 = OpBitwiseOr %uint %14882 %18156\n       %8122 = OpShiftLeftLogical %uint %11416 %uint_2\n       %7812 = OpBitwiseOr %uint %16012 %8122\n               OpBranch %11723\n      %11723 = OpLabel\n      %20516 = OpPhi %uint %6256 %10652 %7812 %21929\n      %16620 = OpCompositeExtract %uint %15655 1\n               OpSelectionMerge %11724 None\n               OpBranchConditional %20100 %10653 %21931\n      %10653 = OpLabel\n      %17670 = OpBitwiseAnd %uint %16620 %uint_4793490\n      %23961 = OpBitwiseAnd %uint %16620 %uint_9586980\n      %21857 = OpShiftRightLogical %uint %23961 %uint_1\n       %8146 = OpBitwiseAnd %uint %17670 %21857\n      %24622 = OpShiftLeftLogical %uint %8146 %uint_1\n      %22969 = OpShiftRightLogical %uint %8146 %uint_1\n      %18798 = OpBitwiseOr %uint %24622 %22969\n      %16054 = OpBitwiseOr %uint %8146 %18798\n      %18314 = OpBitwiseAnd %uint %16620 %uint_2396745\n      %14690 = OpBitwiseOr %uint %18314 %uint_14380470\n      %20413 = OpBitwiseAnd %uint %14690 %16054\n      %20544 = OpShiftRightLogical %uint %17670 %uint_1\n      %24927 = OpBitwiseOr %uint %18314 %20544\n      %21930 = OpShiftRightLogical %uint %23961 %uint_2\n      %22684 = OpBitwiseOr %uint %24927 %21930\n       %7731 = OpBitwiseXor %uint %22684 %uint_2396745\n       %9551 = OpNot %uint %20544\n      %14631 = OpBitwiseAnd %uint %18314 %9551\n       %8435 = OpNot %uint %21930\n      %11417 = OpBitwiseAnd %uint %14631 %8435\n       %6809 = OpBitwiseOr %uint %16620 %7731\n      %19519 = OpISub %uint %6809 %uint_2396745\n      %14883 = OpBitwiseOr %uint %19519 %11417\n      %18233 = OpShiftLeftLogical %uint %11417 %uint_2\n      %15367 = OpBitwiseOr %uint %14883 %18233\n      %12159 = OpNot %uint %16054\n      %18517 = OpBitwiseAnd %uint %15367 %12159\n       %6257 = OpBitwiseOr %uint %18517 %20413\n               OpBranch %11724\n      %21931 = OpLabel\n      %20084 = OpBitwiseAnd %uint %16620 %uint_2396745\n      %23915 = OpBitwiseAnd %uint %16620 %uint_4793490\n      %22252 = OpShiftRightLogical %uint %23915 %uint_1\n      %24005 = OpBitwiseOr %uint %20084 %22252\n      %19604 = OpBitwiseAnd %uint %16620 %uint_9586980\n      %20620 = OpShiftRightLogical %uint %19604 %uint_2\n      %24292 = OpBitwiseOr %uint %24005 %20620\n       %7732 = OpBitwiseXor %uint %24292 %uint_2396745\n       %9552 = OpNot %uint %22252\n      %14632 = OpBitwiseAnd %uint %20084 %9552\n       %8436 = OpNot %uint %20620\n      %11418 = OpBitwiseAnd %uint %14632 %8436\n       %6810 = OpBitwiseOr %uint %16620 %7732\n      %19520 = OpISub %uint %6810 %uint_2396745\n      %14884 = OpBitwiseOr %uint %19520 %11418\n      %18157 = OpShiftLeftLogical %uint %11418 %uint_1\n      %16013 = OpBitwiseOr %uint %14884 %18157\n       %8123 = OpShiftLeftLogical %uint %11418 %uint_2\n       %7813 = OpBitwiseOr %uint %16013 %8123\n               OpBranch %11724\n      %11724 = OpLabel\n      %20517 = OpPhi %uint %6257 %10653 %7813 %21931\n      %16621 = OpCompositeExtract %uint %15655 2\n               OpSelectionMerge %11725 None\n               OpBranchConditional %20101 %10654 %21933\n      %10654 = OpLabel\n      %17671 = OpBitwiseAnd %uint %16621 %uint_4793490\n      %23962 = OpBitwiseAnd %uint %16621 %uint_9586980\n      %21858 = OpShiftRightLogical %uint %23962 %uint_1\n       %8147 = OpBitwiseAnd %uint %17671 %21858\n      %24623 = OpShiftLeftLogical %uint %8147 %uint_1\n      %22970 = OpShiftRightLogical %uint %8147 %uint_1\n      %18799 = OpBitwiseOr %uint %24623 %22970\n      %16055 = OpBitwiseOr %uint %8147 %18799\n      %18315 = OpBitwiseAnd %uint %16621 %uint_2396745\n      %14691 = OpBitwiseOr %uint %18315 %uint_14380470\n      %20414 = OpBitwiseAnd %uint %14691 %16055\n      %20545 = OpShiftRightLogical %uint %17671 %uint_1\n      %24928 = OpBitwiseOr %uint %18315 %20545\n      %21932 = OpShiftRightLogical %uint %23962 %uint_2\n      %22685 = OpBitwiseOr %uint %24928 %21932\n       %7733 = OpBitwiseXor %uint %22685 %uint_2396745\n       %9553 = OpNot %uint %20545\n      %14633 = OpBitwiseAnd %uint %18315 %9553\n       %8437 = OpNot %uint %21932\n      %11419 = OpBitwiseAnd %uint %14633 %8437\n       %6811 = OpBitwiseOr %uint %16621 %7733\n      %19521 = OpISub %uint %6811 %uint_2396745\n      %14885 = OpBitwiseOr %uint %19521 %11419\n      %18234 = OpShiftLeftLogical %uint %11419 %uint_2\n      %15368 = OpBitwiseOr %uint %14885 %18234\n      %12160 = OpNot %uint %16055\n      %18518 = OpBitwiseAnd %uint %15368 %12160\n       %6258 = OpBitwiseOr %uint %18518 %20414\n               OpBranch %11725\n      %21933 = OpLabel\n      %20085 = OpBitwiseAnd %uint %16621 %uint_2396745\n      %23916 = OpBitwiseAnd %uint %16621 %uint_4793490\n      %22253 = OpShiftRightLogical %uint %23916 %uint_1\n      %24006 = OpBitwiseOr %uint %20085 %22253\n      %19605 = OpBitwiseAnd %uint %16621 %uint_9586980\n      %20621 = OpShiftRightLogical %uint %19605 %uint_2\n      %24293 = OpBitwiseOr %uint %24006 %20621\n       %7734 = OpBitwiseXor %uint %24293 %uint_2396745\n       %9554 = OpNot %uint %22253\n      %14634 = OpBitwiseAnd %uint %20085 %9554\n       %8438 = OpNot %uint %20621\n      %11420 = OpBitwiseAnd %uint %14634 %8438\n       %6812 = OpBitwiseOr %uint %16621 %7734\n      %19522 = OpISub %uint %6812 %uint_2396745\n      %14886 = OpBitwiseOr %uint %19522 %11420\n      %18158 = OpShiftLeftLogical %uint %11420 %uint_1\n      %16014 = OpBitwiseOr %uint %14886 %18158\n       %8124 = OpShiftLeftLogical %uint %11420 %uint_2\n       %7814 = OpBitwiseOr %uint %16014 %8124\n               OpBranch %11725\n      %11725 = OpLabel\n      %20518 = OpPhi %uint %6258 %10654 %7814 %21933\n      %16622 = OpCompositeExtract %uint %15655 3\n               OpSelectionMerge %11702 None\n               OpBranchConditional %20102 %10655 %21951\n      %10655 = OpLabel\n      %17672 = OpBitwiseAnd %uint %16622 %uint_4793490\n      %23963 = OpBitwiseAnd %uint %16622 %uint_9586980\n      %21859 = OpShiftRightLogical %uint %23963 %uint_1\n       %8148 = OpBitwiseAnd %uint %17672 %21859\n      %24624 = OpShiftLeftLogical %uint %8148 %uint_1\n      %22971 = OpShiftRightLogical %uint %8148 %uint_1\n      %18800 = OpBitwiseOr %uint %24624 %22971\n      %16056 = OpBitwiseOr %uint %8148 %18800\n      %18316 = OpBitwiseAnd %uint %16622 %uint_2396745\n      %14692 = OpBitwiseOr %uint %18316 %uint_14380470\n      %20415 = OpBitwiseAnd %uint %14692 %16056\n      %20546 = OpShiftRightLogical %uint %17672 %uint_1\n      %24929 = OpBitwiseOr %uint %18316 %20546\n      %21934 = OpShiftRightLogical %uint %23963 %uint_2\n      %22686 = OpBitwiseOr %uint %24929 %21934\n       %7735 = OpBitwiseXor %uint %22686 %uint_2396745\n       %9555 = OpNot %uint %20546\n      %14635 = OpBitwiseAnd %uint %18316 %9555\n       %8439 = OpNot %uint %21934\n      %11421 = OpBitwiseAnd %uint %14635 %8439\n       %6813 = OpBitwiseOr %uint %16622 %7735\n      %19523 = OpISub %uint %6813 %uint_2396745\n      %14887 = OpBitwiseOr %uint %19523 %11421\n      %18235 = OpShiftLeftLogical %uint %11421 %uint_2\n      %15369 = OpBitwiseOr %uint %14887 %18235\n      %12161 = OpNot %uint %16056\n      %18519 = OpBitwiseAnd %uint %15369 %12161\n       %6259 = OpBitwiseOr %uint %18519 %20415\n               OpBranch %11702\n      %21951 = OpLabel\n      %20086 = OpBitwiseAnd %uint %16622 %uint_2396745\n      %23917 = OpBitwiseAnd %uint %16622 %uint_4793490\n      %22254 = OpShiftRightLogical %uint %23917 %uint_1\n      %24007 = OpBitwiseOr %uint %20086 %22254\n      %19606 = OpBitwiseAnd %uint %16622 %uint_9586980\n      %20622 = OpShiftRightLogical %uint %19606 %uint_2\n      %24294 = OpBitwiseOr %uint %24007 %20622\n       %7736 = OpBitwiseXor %uint %24294 %uint_2396745\n       %9556 = OpNot %uint %22254\n      %14636 = OpBitwiseAnd %uint %20086 %9556\n       %8440 = OpNot %uint %20622\n      %11422 = OpBitwiseAnd %uint %14636 %8440\n       %6814 = OpBitwiseOr %uint %16622 %7736\n      %19524 = OpISub %uint %6814 %uint_2396745\n      %14888 = OpBitwiseOr %uint %19524 %11422\n      %18159 = OpShiftLeftLogical %uint %11422 %uint_1\n      %16015 = OpBitwiseOr %uint %14888 %18159\n       %8125 = OpShiftLeftLogical %uint %11422 %uint_2\n       %7815 = OpBitwiseOr %uint %16015 %8125\n               OpBranch %11702\n      %11702 = OpLabel\n      %19681 = OpPhi %uint %6259 %10655 %7815 %21951\n      %14853 = OpCompositeConstruct %v4uint %20516 %20517 %20518 %19681\n       %7113 = OpShiftRightLogical %uint %13334 %int_4\n               OpSelectionMerge %20299 None\n               OpBranchConditional %20099 %10656 %14534\n      %10656 = OpLabel\n      %17673 = OpBitwiseAnd %uint %20516 %uint_1170\n      %23964 = OpBitwiseAnd %uint %20516 %uint_2340\n      %21860 = OpShiftRightLogical %uint %23964 %uint_1\n       %8149 = OpBitwiseAnd %uint %17673 %21860\n      %24625 = OpShiftLeftLogical %uint %8149 %uint_1\n      %22972 = OpShiftRightLogical %uint %8149 %uint_1\n      %18820 = OpBitwiseOr %uint %24625 %22972\n      %15922 = OpBitwiseOr %uint %8149 %18820\n       %8467 = OpNot %uint %15922\n      %10090 = OpBitwiseAnd %uint %20516 %8467\n      %16308 = OpISub %uint %uint_2925 %10090\n      %17423 = OpBitwiseAnd %uint %16308 %8467\n      %16999 = OpBitwiseAnd %uint %17423 %uint_7\n      %13685 = OpIMul %uint %6502 %16999\n      %21991 = OpBitwiseAnd %uint %10090 %uint_7\n      %20416 = OpIMul %uint %13104 %21991\n      %19875 = OpIAdd %uint %13685 %20416\n      %13033 = OpUDiv %uint %19875 %uint_5\n      %23058 = OpShiftRightLogical %uint %17423 %uint_3\n       %8785 = OpBitwiseAnd %uint %23058 %uint_7\n      %15059 = OpIMul %uint %6502 %8785\n      %13331 = OpShiftRightLogical %uint %10090 %uint_3\n      %25005 = OpBitwiseAnd %uint %13331 %uint_7\n      %25242 = OpIMul %uint %13104 %25005\n      %19912 = OpIAdd %uint %15059 %25242\n      %12648 = OpUDiv %uint %19912 %uint_5\n       %8176 = OpShiftLeftLogical %uint %12648 %uint_16\n       %7569 = OpBitwiseOr %uint %13033 %8176\n      %21952 = OpShiftRightLogical %uint %17423 %uint_6\n      %17609 = OpBitwiseAnd %uint %21952 %uint_7\n      %15060 = OpIMul %uint %6502 %17609\n      %13332 = OpShiftRightLogical %uint %10090 %uint_6\n      %25006 = OpBitwiseAnd %uint %13332 %uint_7\n      %25243 = OpIMul %uint %13104 %25006\n      %19876 = OpIAdd %uint %15060 %25243\n      %13034 = OpUDiv %uint %19876 %uint_5\n      %23059 = OpShiftRightLogical %uint %17423 %uint_9\n       %8786 = OpBitwiseAnd %uint %23059 %uint_7\n      %15061 = OpIMul %uint %6502 %8786\n      %13333 = OpShiftRightLogical %uint %10090 %uint_9\n      %25007 = OpBitwiseAnd %uint %13333 %uint_7\n      %25244 = OpIMul %uint %13104 %25007\n      %19913 = OpIAdd %uint %15061 %25244\n      %12649 = OpUDiv %uint %19913 %uint_5\n      %25081 = OpShiftLeftLogical %uint %12649 %uint_16\n       %8212 = OpBitwiseOr %uint %13034 %25081\n      %10126 = OpCompositeConstruct %v2uint %7569 %8212\n      %24276 = OpBitwiseAnd %uint %20516 %15922\n      %16384 = OpBitwiseAnd %uint %24276 %uint_1\n      %19567 = OpBitwiseAnd %uint %24276 %uint_8\n      %24845 = OpShiftLeftLogical %uint %19567 %uint_13\n      %18013 = OpBitwiseOr %uint %16384 %24845\n      %23216 = OpShiftRightLogical %uint %24276 %uint_6\n      %25118 = OpBitwiseAnd %uint %23216 %uint_1\n      %18763 = OpBitwiseAnd %uint %24276 %uint_512\n      %22687 = OpShiftLeftLogical %uint %18763 %uint_7\n      %17391 = OpBitwiseOr %uint %25118 %22687\n      %20367 = OpCompositeConstruct %v2uint %18013 %17391\n      %20768 = OpIMul %v2uint %20367 %1140\n      %23862 = OpIAdd %v2uint %10126 %20768\n               OpBranch %20299\n      %14534 = OpLabel\n      %10716 = OpNot %uint %20516\n      %15370 = OpBitwiseAnd %uint %10716 %uint_7\n      %17720 = OpIMul %uint %6502 %15370\n      %21994 = OpBitwiseAnd %uint %20516 %uint_7\n      %20417 = OpIMul %uint %13104 %21994\n      %19877 = OpIAdd %uint %17720 %20417\n      %13035 = OpUDiv %uint %19877 %uint_7\n      %23060 = OpShiftRightLogical %uint %10716 %uint_3\n       %8788 = OpBitwiseAnd %uint %23060 %uint_7\n      %15062 = OpIMul %uint %6502 %8788\n      %13335 = OpShiftRightLogical %uint %20516 %uint_3\n      %25008 = OpBitwiseAnd %uint %13335 %uint_7\n      %25245 = OpIMul %uint %13104 %25008\n      %19914 = OpIAdd %uint %15062 %25245\n      %12650 = OpUDiv %uint %19914 %uint_7\n       %8177 = OpShiftLeftLogical %uint %12650 %uint_16\n       %7570 = OpBitwiseOr %uint %13035 %8177\n      %21953 = OpShiftRightLogical %uint %10716 %uint_6\n      %17610 = OpBitwiseAnd %uint %21953 %uint_7\n      %15063 = OpIMul %uint %6502 %17610\n      %13336 = OpShiftRightLogical %uint %20516 %uint_6\n      %25009 = OpBitwiseAnd %uint %13336 %uint_7\n      %25246 = OpIMul %uint %13104 %25009\n      %19878 = OpIAdd %uint %15063 %25246\n      %13036 = OpUDiv %uint %19878 %uint_7\n      %23061 = OpShiftRightLogical %uint %10716 %uint_9\n       %8789 = OpBitwiseAnd %uint %23061 %uint_7\n      %15064 = OpIMul %uint %6502 %8789\n      %13337 = OpShiftRightLogical %uint %20516 %uint_9\n      %25010 = OpBitwiseAnd %uint %13337 %uint_7\n      %25247 = OpIMul %uint %13104 %25010\n      %19915 = OpIAdd %uint %15064 %25247\n      %12651 = OpUDiv %uint %19915 %uint_7\n      %25082 = OpShiftLeftLogical %uint %12651 %uint_16\n       %9162 = OpBitwiseOr %uint %13036 %25082\n      %21477 = OpCompositeConstruct %v2uint %7570 %9162\n               OpBranch %20299\n      %20299 = OpLabel\n      %10928 = OpPhi %v2uint %23862 %10656 %21477 %14534\n               OpSelectionMerge %19332 None\n               OpBranchConditional %20100 %10657 %14535\n      %10657 = OpLabel\n      %17674 = OpBitwiseAnd %uint %20517 %uint_1170\n      %23965 = OpBitwiseAnd %uint %20517 %uint_2340\n      %21861 = OpShiftRightLogical %uint %23965 %uint_1\n       %8150 = OpBitwiseAnd %uint %17674 %21861\n      %24626 = OpShiftLeftLogical %uint %8150 %uint_1\n      %22973 = OpShiftRightLogical %uint %8150 %uint_1\n      %18821 = OpBitwiseOr %uint %24626 %22973\n      %15923 = OpBitwiseOr %uint %8150 %18821\n       %8468 = OpNot %uint %15923\n      %10091 = OpBitwiseAnd %uint %20517 %8468\n      %16309 = OpISub %uint %uint_2925 %10091\n      %17424 = OpBitwiseAnd %uint %16309 %8468\n      %17000 = OpBitwiseAnd %uint %17424 %uint_7\n      %13686 = OpIMul %uint %12929 %17000\n      %21995 = OpBitwiseAnd %uint %10091 %uint_7\n      %20418 = OpIMul %uint %13105 %21995\n      %19879 = OpIAdd %uint %13686 %20418\n      %13037 = OpUDiv %uint %19879 %uint_5\n      %23062 = OpShiftRightLogical %uint %17424 %uint_3\n       %8790 = OpBitwiseAnd %uint %23062 %uint_7\n      %15065 = OpIMul %uint %12929 %8790\n      %13338 = OpShiftRightLogical %uint %10091 %uint_3\n      %25011 = OpBitwiseAnd %uint %13338 %uint_7\n      %25248 = OpIMul %uint %13105 %25011\n      %19916 = OpIAdd %uint %15065 %25248\n      %12652 = OpUDiv %uint %19916 %uint_5\n       %8178 = OpShiftLeftLogical %uint %12652 %uint_16\n       %7571 = OpBitwiseOr %uint %13037 %8178\n      %21954 = OpShiftRightLogical %uint %17424 %uint_6\n      %17611 = OpBitwiseAnd %uint %21954 %uint_7\n      %15066 = OpIMul %uint %12929 %17611\n      %13339 = OpShiftRightLogical %uint %10091 %uint_6\n      %25012 = OpBitwiseAnd %uint %13339 %uint_7\n      %25249 = OpIMul %uint %13105 %25012\n      %19917 = OpIAdd %uint %15066 %25249\n      %13038 = OpUDiv %uint %19917 %uint_5\n      %23063 = OpShiftRightLogical %uint %17424 %uint_9\n       %8791 = OpBitwiseAnd %uint %23063 %uint_7\n      %15067 = OpIMul %uint %12929 %8791\n      %13340 = OpShiftRightLogical %uint %10091 %uint_9\n      %25013 = OpBitwiseAnd %uint %13340 %uint_7\n      %25250 = OpIMul %uint %13105 %25013\n      %19918 = OpIAdd %uint %15067 %25250\n      %12653 = OpUDiv %uint %19918 %uint_5\n      %25083 = OpShiftLeftLogical %uint %12653 %uint_16\n       %8213 = OpBitwiseOr %uint %13038 %25083\n      %10127 = OpCompositeConstruct %v2uint %7571 %8213\n      %24277 = OpBitwiseAnd %uint %20517 %15923\n      %16385 = OpBitwiseAnd %uint %24277 %uint_1\n      %19568 = OpBitwiseAnd %uint %24277 %uint_8\n      %24846 = OpShiftLeftLogical %uint %19568 %uint_13\n      %18014 = OpBitwiseOr %uint %16385 %24846\n      %23217 = OpShiftRightLogical %uint %24277 %uint_6\n      %25119 = OpBitwiseAnd %uint %23217 %uint_1\n      %18764 = OpBitwiseAnd %uint %24277 %uint_512\n      %22688 = OpShiftLeftLogical %uint %18764 %uint_7\n      %17392 = OpBitwiseOr %uint %25119 %22688\n      %20368 = OpCompositeConstruct %v2uint %18014 %17392\n      %20769 = OpIMul %v2uint %20368 %1140\n      %23863 = OpIAdd %v2uint %10127 %20769\n               OpBranch %19332\n      %14535 = OpLabel\n      %10717 = OpNot %uint %20517\n      %15371 = OpBitwiseAnd %uint %10717 %uint_7\n      %17721 = OpIMul %uint %12929 %15371\n      %21996 = OpBitwiseAnd %uint %20517 %uint_7\n      %20419 = OpIMul %uint %13105 %21996\n      %19919 = OpIAdd %uint %17721 %20419\n      %13039 = OpUDiv %uint %19919 %uint_7\n      %23064 = OpShiftRightLogical %uint %10717 %uint_3\n       %8792 = OpBitwiseAnd %uint %23064 %uint_7\n      %15068 = OpIMul %uint %12929 %8792\n      %13341 = OpShiftRightLogical %uint %20517 %uint_3\n      %25014 = OpBitwiseAnd %uint %13341 %uint_7\n      %25251 = OpIMul %uint %13105 %25014\n      %19920 = OpIAdd %uint %15068 %25251\n      %12654 = OpUDiv %uint %19920 %uint_7\n       %8179 = OpShiftLeftLogical %uint %12654 %uint_16\n       %7572 = OpBitwiseOr %uint %13039 %8179\n      %21955 = OpShiftRightLogical %uint %10717 %uint_6\n      %17612 = OpBitwiseAnd %uint %21955 %uint_7\n      %15070 = OpIMul %uint %12929 %17612\n      %13342 = OpShiftRightLogical %uint %20517 %uint_6\n      %25015 = OpBitwiseAnd %uint %13342 %uint_7\n      %25252 = OpIMul %uint %13105 %25015\n      %19921 = OpIAdd %uint %15070 %25252\n      %13040 = OpUDiv %uint %19921 %uint_7\n      %23065 = OpShiftRightLogical %uint %10717 %uint_9\n       %8793 = OpBitwiseAnd %uint %23065 %uint_7\n      %15071 = OpIMul %uint %12929 %8793\n      %13343 = OpShiftRightLogical %uint %20517 %uint_9\n      %25016 = OpBitwiseAnd %uint %13343 %uint_7\n      %25253 = OpIMul %uint %13105 %25016\n      %19922 = OpIAdd %uint %15071 %25253\n      %12655 = OpUDiv %uint %19922 %uint_7\n      %25084 = OpShiftLeftLogical %uint %12655 %uint_16\n       %9163 = OpBitwiseOr %uint %13040 %25084\n      %21478 = OpCompositeConstruct %v2uint %7572 %9163\n               OpBranch %19332\n      %19332 = OpLabel\n      %18744 = OpPhi %v2uint %23863 %10657 %21478 %14535\n      %11039 = OpShiftLeftLogical %v2uint %18744 %1975\n      %21077 = OpBitwiseOr %v2uint %10928 %11039\n               OpSelectionMerge %20300 None\n               OpBranchConditional %20101 %10658 %14536\n      %10658 = OpLabel\n      %17675 = OpBitwiseAnd %uint %20518 %uint_1170\n      %23966 = OpBitwiseAnd %uint %20518 %uint_2340\n      %21863 = OpShiftRightLogical %uint %23966 %uint_1\n       %8151 = OpBitwiseAnd %uint %17675 %21863\n      %24627 = OpShiftLeftLogical %uint %8151 %uint_1\n      %22974 = OpShiftRightLogical %uint %8151 %uint_1\n      %18822 = OpBitwiseOr %uint %24627 %22974\n      %15924 = OpBitwiseOr %uint %8151 %18822\n       %8469 = OpNot %uint %15924\n      %10092 = OpBitwiseAnd %uint %20518 %8469\n      %16310 = OpISub %uint %uint_2925 %10092\n      %17426 = OpBitwiseAnd %uint %16310 %8469\n      %17001 = OpBitwiseAnd %uint %17426 %uint_7\n      %13687 = OpIMul %uint %12930 %17001\n      %21997 = OpBitwiseAnd %uint %10092 %uint_7\n      %20420 = OpIMul %uint %13106 %21997\n      %19923 = OpIAdd %uint %13687 %20420\n      %13041 = OpUDiv %uint %19923 %uint_5\n      %23066 = OpShiftRightLogical %uint %17426 %uint_3\n       %8794 = OpBitwiseAnd %uint %23066 %uint_7\n      %15072 = OpIMul %uint %12930 %8794\n      %13344 = OpShiftRightLogical %uint %10092 %uint_3\n      %25017 = OpBitwiseAnd %uint %13344 %uint_7\n      %25254 = OpIMul %uint %13106 %25017\n      %19924 = OpIAdd %uint %15072 %25254\n      %12656 = OpUDiv %uint %19924 %uint_5\n       %8180 = OpShiftLeftLogical %uint %12656 %uint_16\n       %7573 = OpBitwiseOr %uint %13041 %8180\n      %21956 = OpShiftRightLogical %uint %17426 %uint_6\n      %17613 = OpBitwiseAnd %uint %21956 %uint_7\n      %15073 = OpIMul %uint %12930 %17613\n      %13345 = OpShiftRightLogical %uint %10092 %uint_6\n      %25018 = OpBitwiseAnd %uint %13345 %uint_7\n      %25255 = OpIMul %uint %13106 %25018\n      %19925 = OpIAdd %uint %15073 %25255\n      %13042 = OpUDiv %uint %19925 %uint_5\n      %23067 = OpShiftRightLogical %uint %17426 %uint_9\n       %8795 = OpBitwiseAnd %uint %23067 %uint_7\n      %15074 = OpIMul %uint %12930 %8795\n      %13346 = OpShiftRightLogical %uint %10092 %uint_9\n      %25019 = OpBitwiseAnd %uint %13346 %uint_7\n      %25256 = OpIMul %uint %13106 %25019\n      %19926 = OpIAdd %uint %15074 %25256\n      %12657 = OpUDiv %uint %19926 %uint_5\n      %25085 = OpShiftLeftLogical %uint %12657 %uint_16\n       %8214 = OpBitwiseOr %uint %13042 %25085\n      %10128 = OpCompositeConstruct %v2uint %7573 %8214\n      %24278 = OpBitwiseAnd %uint %20518 %15924\n      %16386 = OpBitwiseAnd %uint %24278 %uint_1\n      %19569 = OpBitwiseAnd %uint %24278 %uint_8\n      %24847 = OpShiftLeftLogical %uint %19569 %uint_13\n      %18015 = OpBitwiseOr %uint %16386 %24847\n      %23218 = OpShiftRightLogical %uint %24278 %uint_6\n      %25120 = OpBitwiseAnd %uint %23218 %uint_1\n      %18765 = OpBitwiseAnd %uint %24278 %uint_512\n      %22689 = OpShiftLeftLogical %uint %18765 %uint_7\n      %17393 = OpBitwiseOr %uint %25120 %22689\n      %20369 = OpCompositeConstruct %v2uint %18015 %17393\n      %20770 = OpIMul %v2uint %20369 %1140\n      %23864 = OpIAdd %v2uint %10128 %20770\n               OpBranch %20300\n      %14536 = OpLabel\n      %10718 = OpNot %uint %20518\n      %15372 = OpBitwiseAnd %uint %10718 %uint_7\n      %17722 = OpIMul %uint %12930 %15372\n      %21998 = OpBitwiseAnd %uint %20518 %uint_7\n      %20421 = OpIMul %uint %13106 %21998\n      %19927 = OpIAdd %uint %17722 %20421\n      %13043 = OpUDiv %uint %19927 %uint_7\n      %23068 = OpShiftRightLogical %uint %10718 %uint_3\n       %8796 = OpBitwiseAnd %uint %23068 %uint_7\n      %15075 = OpIMul %uint %12930 %8796\n      %13347 = OpShiftRightLogical %uint %20518 %uint_3\n      %25020 = OpBitwiseAnd %uint %13347 %uint_7\n      %25257 = OpIMul %uint %13106 %25020\n      %19928 = OpIAdd %uint %15075 %25257\n      %12658 = OpUDiv %uint %19928 %uint_7\n       %8181 = OpShiftLeftLogical %uint %12658 %uint_16\n       %7574 = OpBitwiseOr %uint %13043 %8181\n      %21957 = OpShiftRightLogical %uint %10718 %uint_6\n      %17614 = OpBitwiseAnd %uint %21957 %uint_7\n      %15076 = OpIMul %uint %12930 %17614\n      %13348 = OpShiftRightLogical %uint %20518 %uint_6\n      %25021 = OpBitwiseAnd %uint %13348 %uint_7\n      %25258 = OpIMul %uint %13106 %25021\n      %19929 = OpIAdd %uint %15076 %25258\n      %13044 = OpUDiv %uint %19929 %uint_7\n      %23069 = OpShiftRightLogical %uint %10718 %uint_9\n       %8798 = OpBitwiseAnd %uint %23069 %uint_7\n      %15077 = OpIMul %uint %12930 %8798\n      %13349 = OpShiftRightLogical %uint %20518 %uint_9\n      %25022 = OpBitwiseAnd %uint %13349 %uint_7\n      %25259 = OpIMul %uint %13106 %25022\n      %19930 = OpIAdd %uint %15077 %25259\n      %12659 = OpUDiv %uint %19930 %uint_7\n      %25086 = OpShiftLeftLogical %uint %12659 %uint_16\n       %9164 = OpBitwiseOr %uint %13044 %25086\n      %21479 = OpCompositeConstruct %v2uint %7574 %9164\n               OpBranch %20300\n      %20300 = OpLabel\n      %10929 = OpPhi %v2uint %23864 %10658 %21479 %14536\n               OpSelectionMerge %19333 None\n               OpBranchConditional %20102 %10659 %14537\n      %10659 = OpLabel\n      %17676 = OpBitwiseAnd %uint %19681 %uint_1170\n      %23967 = OpBitwiseAnd %uint %19681 %uint_2340\n      %21864 = OpShiftRightLogical %uint %23967 %uint_1\n       %8152 = OpBitwiseAnd %uint %17676 %21864\n      %24628 = OpShiftLeftLogical %uint %8152 %uint_1\n      %22975 = OpShiftRightLogical %uint %8152 %uint_1\n      %18823 = OpBitwiseOr %uint %24628 %22975\n      %15925 = OpBitwiseOr %uint %8152 %18823\n       %8470 = OpNot %uint %15925\n      %10093 = OpBitwiseAnd %uint %19681 %8470\n      %16311 = OpISub %uint %uint_2925 %10093\n      %17427 = OpBitwiseAnd %uint %16311 %8470\n      %17002 = OpBitwiseAnd %uint %17427 %uint_7\n      %13688 = OpIMul %uint %12931 %17002\n      %21999 = OpBitwiseAnd %uint %10093 %uint_7\n      %20422 = OpIMul %uint %13107 %21999\n      %19931 = OpIAdd %uint %13688 %20422\n      %13045 = OpUDiv %uint %19931 %uint_5\n      %23070 = OpShiftRightLogical %uint %17427 %uint_3\n       %8799 = OpBitwiseAnd %uint %23070 %uint_7\n      %15078 = OpIMul %uint %12931 %8799\n      %13350 = OpShiftRightLogical %uint %10093 %uint_3\n      %25023 = OpBitwiseAnd %uint %13350 %uint_7\n      %25260 = OpIMul %uint %13107 %25023\n      %19932 = OpIAdd %uint %15078 %25260\n      %12660 = OpUDiv %uint %19932 %uint_5\n       %8182 = OpShiftLeftLogical %uint %12660 %uint_16\n       %7575 = OpBitwiseOr %uint %13045 %8182\n      %21958 = OpShiftRightLogical %uint %17427 %uint_6\n      %17615 = OpBitwiseAnd %uint %21958 %uint_7\n      %15079 = OpIMul %uint %12931 %17615\n      %13351 = OpShiftRightLogical %uint %10093 %uint_6\n      %25024 = OpBitwiseAnd %uint %13351 %uint_7\n      %25261 = OpIMul %uint %13107 %25024\n      %19933 = OpIAdd %uint %15079 %25261\n      %13046 = OpUDiv %uint %19933 %uint_5\n      %23071 = OpShiftRightLogical %uint %17427 %uint_9\n       %8800 = OpBitwiseAnd %uint %23071 %uint_7\n      %15080 = OpIMul %uint %12931 %8800\n      %13352 = OpShiftRightLogical %uint %10093 %uint_9\n      %25025 = OpBitwiseAnd %uint %13352 %uint_7\n      %25262 = OpIMul %uint %13107 %25025\n      %19934 = OpIAdd %uint %15080 %25262\n      %12661 = OpUDiv %uint %19934 %uint_5\n      %25087 = OpShiftLeftLogical %uint %12661 %uint_16\n       %8215 = OpBitwiseOr %uint %13046 %25087\n      %10129 = OpCompositeConstruct %v2uint %7575 %8215\n      %24279 = OpBitwiseAnd %uint %19681 %15925\n      %16387 = OpBitwiseAnd %uint %24279 %uint_1\n      %19570 = OpBitwiseAnd %uint %24279 %uint_8\n      %24848 = OpShiftLeftLogical %uint %19570 %uint_13\n      %18016 = OpBitwiseOr %uint %16387 %24848\n      %23219 = OpShiftRightLogical %uint %24279 %uint_6\n      %25121 = OpBitwiseAnd %uint %23219 %uint_1\n      %18766 = OpBitwiseAnd %uint %24279 %uint_512\n      %22690 = OpShiftLeftLogical %uint %18766 %uint_7\n      %17394 = OpBitwiseOr %uint %25121 %22690\n      %20370 = OpCompositeConstruct %v2uint %18016 %17394\n      %20771 = OpIMul %v2uint %20370 %1140\n      %23865 = OpIAdd %v2uint %10129 %20771\n               OpBranch %19333\n      %14537 = OpLabel\n      %10719 = OpNot %uint %19681\n      %15373 = OpBitwiseAnd %uint %10719 %uint_7\n      %17723 = OpIMul %uint %12931 %15373\n      %22000 = OpBitwiseAnd %uint %19681 %uint_7\n      %20425 = OpIMul %uint %13107 %22000\n      %19935 = OpIAdd %uint %17723 %20425\n      %13047 = OpUDiv %uint %19935 %uint_7\n      %23072 = OpShiftRightLogical %uint %10719 %uint_3\n       %8801 = OpBitwiseAnd %uint %23072 %uint_7\n      %15081 = OpIMul %uint %12931 %8801\n      %13353 = OpShiftRightLogical %uint %19681 %uint_3\n      %25026 = OpBitwiseAnd %uint %13353 %uint_7\n      %25263 = OpIMul %uint %13107 %25026\n      %19936 = OpIAdd %uint %15081 %25263\n      %12662 = OpUDiv %uint %19936 %uint_7\n       %8183 = OpShiftLeftLogical %uint %12662 %uint_16\n       %7576 = OpBitwiseOr %uint %13047 %8183\n      %21959 = OpShiftRightLogical %uint %10719 %uint_6\n      %17616 = OpBitwiseAnd %uint %21959 %uint_7\n      %15082 = OpIMul %uint %12931 %17616\n      %13354 = OpShiftRightLogical %uint %19681 %uint_6\n      %25027 = OpBitwiseAnd %uint %13354 %uint_7\n      %25264 = OpIMul %uint %13107 %25027\n      %19937 = OpIAdd %uint %15082 %25264\n      %13048 = OpUDiv %uint %19937 %uint_7\n      %23073 = OpShiftRightLogical %uint %10719 %uint_9\n       %8802 = OpBitwiseAnd %uint %23073 %uint_7\n      %15083 = OpIMul %uint %12931 %8802\n      %13355 = OpShiftRightLogical %uint %19681 %uint_9\n      %25028 = OpBitwiseAnd %uint %13355 %uint_7\n      %25265 = OpIMul %uint %13107 %25028\n      %19938 = OpIAdd %uint %15083 %25265\n      %12663 = OpUDiv %uint %19938 %uint_7\n      %25088 = OpShiftLeftLogical %uint %12663 %uint_16\n       %9165 = OpBitwiseOr %uint %13048 %25088\n      %21480 = OpCompositeConstruct %v2uint %7576 %9165\n               OpBranch %19333\n      %19333 = OpLabel\n      %18745 = OpPhi %v2uint %23865 %10659 %21480 %14537\n       %7887 = OpShiftLeftLogical %v2uint %18745 %1975\n       %8443 = OpBitwiseOr %v2uint %10929 %7887\n      %20103 = OpCompositeExtract %uint %21077 0\n      %23732 = OpCompositeExtract %uint %21077 1\n       %7645 = OpCompositeExtract %uint %8443 0\n       %7531 = OpCompositeExtract %uint %8443 1\n      %18262 = OpCompositeConstruct %v4uint %20103 %23732 %7645 %7531\n       %9681 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %7113\n               OpStore %9681 %18262\n      %14841 = OpIAdd %uint %12832 %int_3\n      %11788 = OpULessThan %bool %14841 %6594\n               OpSelectionMerge %18021 DontFlatten\n               OpBranchConditional %11788 %22830 %18021\n      %22830 = OpLabel\n      %15482 = OpIAdd %uint %13334 %22412\n      %12024 = OpShiftRightLogical %v4uint %14853 %533\n      %23074 = OpShiftRightLogical %uint %15482 %int_4\n      %19252 = OpCompositeExtract %uint %12024 0\n               OpSelectionMerge %17145 None\n               OpBranchConditional %20099 %10660 %14538\n      %10660 = OpLabel\n      %17677 = OpBitwiseAnd %uint %19252 %uint_1170\n      %23968 = OpBitwiseAnd %uint %19252 %uint_2340\n      %21865 = OpShiftRightLogical %uint %23968 %uint_1\n       %8153 = OpBitwiseAnd %uint %17677 %21865\n      %24629 = OpShiftLeftLogical %uint %8153 %uint_1\n      %22976 = OpShiftRightLogical %uint %8153 %uint_1\n      %18824 = OpBitwiseOr %uint %24629 %22976\n      %15926 = OpBitwiseOr %uint %8153 %18824\n       %8471 = OpNot %uint %15926\n      %10094 = OpBitwiseAnd %uint %19252 %8471\n      %16312 = OpISub %uint %uint_2925 %10094\n      %17428 = OpBitwiseAnd %uint %16312 %8471\n      %17003 = OpBitwiseAnd %uint %17428 %uint_7\n      %13689 = OpIMul %uint %6502 %17003\n      %22001 = OpBitwiseAnd %uint %10094 %uint_7\n      %20426 = OpIMul %uint %13104 %22001\n      %19939 = OpIAdd %uint %13689 %20426\n      %13049 = OpUDiv %uint %19939 %uint_5\n      %23075 = OpShiftRightLogical %uint %17428 %uint_3\n       %8803 = OpBitwiseAnd %uint %23075 %uint_7\n      %15084 = OpIMul %uint %6502 %8803\n      %13356 = OpShiftRightLogical %uint %10094 %uint_3\n      %25029 = OpBitwiseAnd %uint %13356 %uint_7\n      %25266 = OpIMul %uint %13104 %25029\n      %19940 = OpIAdd %uint %15084 %25266\n      %12664 = OpUDiv %uint %19940 %uint_5\n       %8184 = OpShiftLeftLogical %uint %12664 %uint_16\n       %7577 = OpBitwiseOr %uint %13049 %8184\n      %21960 = OpShiftRightLogical %uint %17428 %uint_6\n      %17617 = OpBitwiseAnd %uint %21960 %uint_7\n      %15085 = OpIMul %uint %6502 %17617\n      %13357 = OpShiftRightLogical %uint %10094 %uint_6\n      %25030 = OpBitwiseAnd %uint %13357 %uint_7\n      %25267 = OpIMul %uint %13104 %25030\n      %19941 = OpIAdd %uint %15085 %25267\n      %13050 = OpUDiv %uint %19941 %uint_5\n      %23076 = OpShiftRightLogical %uint %17428 %uint_9\n       %8804 = OpBitwiseAnd %uint %23076 %uint_7\n      %15086 = OpIMul %uint %6502 %8804\n      %13358 = OpShiftRightLogical %uint %10094 %uint_9\n      %25031 = OpBitwiseAnd %uint %13358 %uint_7\n      %25268 = OpIMul %uint %13104 %25031\n      %19942 = OpIAdd %uint %15086 %25268\n      %12665 = OpUDiv %uint %19942 %uint_5\n      %25089 = OpShiftLeftLogical %uint %12665 %uint_16\n       %8216 = OpBitwiseOr %uint %13050 %25089\n      %10130 = OpCompositeConstruct %v2uint %7577 %8216\n      %24280 = OpBitwiseAnd %uint %19252 %15926\n      %16388 = OpBitwiseAnd %uint %24280 %uint_1\n      %19571 = OpBitwiseAnd %uint %24280 %uint_8\n      %24849 = OpShiftLeftLogical %uint %19571 %uint_13\n      %18017 = OpBitwiseOr %uint %16388 %24849\n      %23220 = OpShiftRightLogical %uint %24280 %uint_6\n      %25122 = OpBitwiseAnd %uint %23220 %uint_1\n      %18767 = OpBitwiseAnd %uint %24280 %uint_512\n      %22691 = OpShiftLeftLogical %uint %18767 %uint_7\n      %17395 = OpBitwiseOr %uint %25122 %22691\n      %20371 = OpCompositeConstruct %v2uint %18017 %17395\n      %20772 = OpIMul %v2uint %20371 %1140\n      %23866 = OpIAdd %v2uint %10130 %20772\n               OpBranch %17145\n      %14538 = OpLabel\n      %10720 = OpNot %uint %19252\n      %15374 = OpBitwiseAnd %uint %10720 %uint_7\n      %17724 = OpIMul %uint %6502 %15374\n      %22002 = OpBitwiseAnd %uint %19252 %uint_7\n      %20427 = OpIMul %uint %13104 %22002\n      %19943 = OpIAdd %uint %17724 %20427\n      %13051 = OpUDiv %uint %19943 %uint_7\n      %23077 = OpShiftRightLogical %uint %10720 %uint_3\n       %8805 = OpBitwiseAnd %uint %23077 %uint_7\n      %15087 = OpIMul %uint %6502 %8805\n      %13359 = OpShiftRightLogical %uint %19252 %uint_3\n      %25032 = OpBitwiseAnd %uint %13359 %uint_7\n      %25269 = OpIMul %uint %13104 %25032\n      %19944 = OpIAdd %uint %15087 %25269\n      %12666 = OpUDiv %uint %19944 %uint_7\n       %8185 = OpShiftLeftLogical %uint %12666 %uint_16\n       %7578 = OpBitwiseOr %uint %13051 %8185\n      %21961 = OpShiftRightLogical %uint %10720 %uint_6\n      %17618 = OpBitwiseAnd %uint %21961 %uint_7\n      %15088 = OpIMul %uint %6502 %17618\n      %13360 = OpShiftRightLogical %uint %19252 %uint_6\n      %25033 = OpBitwiseAnd %uint %13360 %uint_7\n      %25270 = OpIMul %uint %13104 %25033\n      %19945 = OpIAdd %uint %15088 %25270\n      %13052 = OpUDiv %uint %19945 %uint_7\n      %23078 = OpShiftRightLogical %uint %10720 %uint_9\n       %8806 = OpBitwiseAnd %uint %23078 %uint_7\n      %15089 = OpIMul %uint %6502 %8806\n      %13361 = OpShiftRightLogical %uint %19252 %uint_9\n      %25034 = OpBitwiseAnd %uint %13361 %uint_7\n      %25271 = OpIMul %uint %13104 %25034\n      %19946 = OpIAdd %uint %15089 %25271\n      %12667 = OpUDiv %uint %19946 %uint_7\n      %25090 = OpShiftLeftLogical %uint %12667 %uint_16\n       %9166 = OpBitwiseOr %uint %13052 %25090\n      %21481 = OpCompositeConstruct %v2uint %7578 %9166\n               OpBranch %17145\n      %17145 = OpLabel\n      %20519 = OpPhi %v2uint %23866 %10660 %21481 %14538\n      %16623 = OpCompositeExtract %uint %12024 1\n               OpSelectionMerge %19334 None\n               OpBranchConditional %20100 %10661 %14539\n      %10661 = OpLabel\n      %17678 = OpBitwiseAnd %uint %16623 %uint_1170\n      %23969 = OpBitwiseAnd %uint %16623 %uint_2340\n      %21866 = OpShiftRightLogical %uint %23969 %uint_1\n       %8154 = OpBitwiseAnd %uint %17678 %21866\n      %24630 = OpShiftLeftLogical %uint %8154 %uint_1\n      %22977 = OpShiftRightLogical %uint %8154 %uint_1\n      %18825 = OpBitwiseOr %uint %24630 %22977\n      %15927 = OpBitwiseOr %uint %8154 %18825\n       %8472 = OpNot %uint %15927\n      %10095 = OpBitwiseAnd %uint %16623 %8472\n      %16313 = OpISub %uint %uint_2925 %10095\n      %17429 = OpBitwiseAnd %uint %16313 %8472\n      %17004 = OpBitwiseAnd %uint %17429 %uint_7\n      %13690 = OpIMul %uint %12929 %17004\n      %22003 = OpBitwiseAnd %uint %10095 %uint_7\n      %20428 = OpIMul %uint %13105 %22003\n      %19947 = OpIAdd %uint %13690 %20428\n      %13053 = OpUDiv %uint %19947 %uint_5\n      %23079 = OpShiftRightLogical %uint %17429 %uint_3\n       %8807 = OpBitwiseAnd %uint %23079 %uint_7\n      %15090 = OpIMul %uint %12929 %8807\n      %13362 = OpShiftRightLogical %uint %10095 %uint_3\n      %25035 = OpBitwiseAnd %uint %13362 %uint_7\n      %25272 = OpIMul %uint %13105 %25035\n      %19948 = OpIAdd %uint %15090 %25272\n      %12668 = OpUDiv %uint %19948 %uint_5\n       %8186 = OpShiftLeftLogical %uint %12668 %uint_16\n       %7579 = OpBitwiseOr %uint %13053 %8186\n      %21962 = OpShiftRightLogical %uint %17429 %uint_6\n      %17619 = OpBitwiseAnd %uint %21962 %uint_7\n      %15091 = OpIMul %uint %12929 %17619\n      %13363 = OpShiftRightLogical %uint %10095 %uint_6\n      %25036 = OpBitwiseAnd %uint %13363 %uint_7\n      %25273 = OpIMul %uint %13105 %25036\n      %19949 = OpIAdd %uint %15091 %25273\n      %13054 = OpUDiv %uint %19949 %uint_5\n      %23080 = OpShiftRightLogical %uint %17429 %uint_9\n       %8808 = OpBitwiseAnd %uint %23080 %uint_7\n      %15092 = OpIMul %uint %12929 %8808\n      %13364 = OpShiftRightLogical %uint %10095 %uint_9\n      %25037 = OpBitwiseAnd %uint %13364 %uint_7\n      %25274 = OpIMul %uint %13105 %25037\n      %19950 = OpIAdd %uint %15092 %25274\n      %12669 = OpUDiv %uint %19950 %uint_5\n      %25091 = OpShiftLeftLogical %uint %12669 %uint_16\n       %8217 = OpBitwiseOr %uint %13054 %25091\n      %10131 = OpCompositeConstruct %v2uint %7579 %8217\n      %24281 = OpBitwiseAnd %uint %16623 %15927\n      %16389 = OpBitwiseAnd %uint %24281 %uint_1\n      %19572 = OpBitwiseAnd %uint %24281 %uint_8\n      %24850 = OpShiftLeftLogical %uint %19572 %uint_13\n      %18018 = OpBitwiseOr %uint %16389 %24850\n      %23221 = OpShiftRightLogical %uint %24281 %uint_6\n      %25123 = OpBitwiseAnd %uint %23221 %uint_1\n      %18768 = OpBitwiseAnd %uint %24281 %uint_512\n      %22692 = OpShiftLeftLogical %uint %18768 %uint_7\n      %17396 = OpBitwiseOr %uint %25123 %22692\n      %20372 = OpCompositeConstruct %v2uint %18018 %17396\n      %20773 = OpIMul %v2uint %20372 %1140\n      %23867 = OpIAdd %v2uint %10131 %20773\n               OpBranch %19334\n      %14539 = OpLabel\n      %10721 = OpNot %uint %16623\n      %15376 = OpBitwiseAnd %uint %10721 %uint_7\n      %17725 = OpIMul %uint %12929 %15376\n      %22004 = OpBitwiseAnd %uint %16623 %uint_7\n      %20429 = OpIMul %uint %13105 %22004\n      %19951 = OpIAdd %uint %17725 %20429\n      %13055 = OpUDiv %uint %19951 %uint_7\n      %23081 = OpShiftRightLogical %uint %10721 %uint_3\n       %8809 = OpBitwiseAnd %uint %23081 %uint_7\n      %15093 = OpIMul %uint %12929 %8809\n      %13365 = OpShiftRightLogical %uint %16623 %uint_3\n      %25038 = OpBitwiseAnd %uint %13365 %uint_7\n      %25275 = OpIMul %uint %13105 %25038\n      %19952 = OpIAdd %uint %15093 %25275\n      %12670 = OpUDiv %uint %19952 %uint_7\n       %8187 = OpShiftLeftLogical %uint %12670 %uint_16\n       %7580 = OpBitwiseOr %uint %13055 %8187\n      %21963 = OpShiftRightLogical %uint %10721 %uint_6\n      %17620 = OpBitwiseAnd %uint %21963 %uint_7\n      %15094 = OpIMul %uint %12929 %17620\n      %13366 = OpShiftRightLogical %uint %16623 %uint_6\n      %25039 = OpBitwiseAnd %uint %13366 %uint_7\n      %25276 = OpIMul %uint %13105 %25039\n      %19953 = OpIAdd %uint %15094 %25276\n      %13056 = OpUDiv %uint %19953 %uint_7\n      %23082 = OpShiftRightLogical %uint %10721 %uint_9\n       %8810 = OpBitwiseAnd %uint %23082 %uint_7\n      %15095 = OpIMul %uint %12929 %8810\n      %13367 = OpShiftRightLogical %uint %16623 %uint_9\n      %25040 = OpBitwiseAnd %uint %13367 %uint_7\n      %25277 = OpIMul %uint %13105 %25040\n      %19954 = OpIAdd %uint %15095 %25277\n      %12671 = OpUDiv %uint %19954 %uint_7\n      %25092 = OpShiftLeftLogical %uint %12671 %uint_16\n       %9167 = OpBitwiseOr %uint %13056 %25092\n      %21482 = OpCompositeConstruct %v2uint %7580 %9167\n               OpBranch %19334\n      %19334 = OpLabel\n      %18746 = OpPhi %v2uint %23867 %10661 %21482 %14539\n       %7888 = OpShiftLeftLogical %v2uint %18746 %1975\n      %11596 = OpBitwiseOr %v2uint %20519 %7888\n      %13661 = OpCompositeExtract %uint %12024 2\n               OpSelectionMerge %17146 None\n               OpBranchConditional %20101 %10662 %14540\n      %10662 = OpLabel\n      %17679 = OpBitwiseAnd %uint %13661 %uint_1170\n      %23970 = OpBitwiseAnd %uint %13661 %uint_2340\n      %21867 = OpShiftRightLogical %uint %23970 %uint_1\n       %8155 = OpBitwiseAnd %uint %17679 %21867\n      %24631 = OpShiftLeftLogical %uint %8155 %uint_1\n      %22978 = OpShiftRightLogical %uint %8155 %uint_1\n      %18826 = OpBitwiseOr %uint %24631 %22978\n      %15928 = OpBitwiseOr %uint %8155 %18826\n       %8473 = OpNot %uint %15928\n      %10096 = OpBitwiseAnd %uint %13661 %8473\n      %16314 = OpISub %uint %uint_2925 %10096\n      %17430 = OpBitwiseAnd %uint %16314 %8473\n      %17005 = OpBitwiseAnd %uint %17430 %uint_7\n      %13691 = OpIMul %uint %12930 %17005\n      %22005 = OpBitwiseAnd %uint %10096 %uint_7\n      %20430 = OpIMul %uint %13106 %22005\n      %19955 = OpIAdd %uint %13691 %20430\n      %13057 = OpUDiv %uint %19955 %uint_5\n      %23083 = OpShiftRightLogical %uint %17430 %uint_3\n       %8811 = OpBitwiseAnd %uint %23083 %uint_7\n      %15096 = OpIMul %uint %12930 %8811\n      %13368 = OpShiftRightLogical %uint %10096 %uint_3\n      %25041 = OpBitwiseAnd %uint %13368 %uint_7\n      %25278 = OpIMul %uint %13106 %25041\n      %19956 = OpIAdd %uint %15096 %25278\n      %12672 = OpUDiv %uint %19956 %uint_5\n       %8188 = OpShiftLeftLogical %uint %12672 %uint_16\n       %7581 = OpBitwiseOr %uint %13057 %8188\n      %21964 = OpShiftRightLogical %uint %17430 %uint_6\n      %17621 = OpBitwiseAnd %uint %21964 %uint_7\n      %15097 = OpIMul %uint %12930 %17621\n      %13369 = OpShiftRightLogical %uint %10096 %uint_6\n      %25042 = OpBitwiseAnd %uint %13369 %uint_7\n      %25279 = OpIMul %uint %13106 %25042\n      %19957 = OpIAdd %uint %15097 %25279\n      %13058 = OpUDiv %uint %19957 %uint_5\n      %23084 = OpShiftRightLogical %uint %17430 %uint_9\n       %8812 = OpBitwiseAnd %uint %23084 %uint_7\n      %15098 = OpIMul %uint %12930 %8812\n      %13370 = OpShiftRightLogical %uint %10096 %uint_9\n      %25043 = OpBitwiseAnd %uint %13370 %uint_7\n      %25280 = OpIMul %uint %13106 %25043\n      %19958 = OpIAdd %uint %15098 %25280\n      %12673 = OpUDiv %uint %19958 %uint_5\n      %25093 = OpShiftLeftLogical %uint %12673 %uint_16\n       %8218 = OpBitwiseOr %uint %13058 %25093\n      %10132 = OpCompositeConstruct %v2uint %7581 %8218\n      %24282 = OpBitwiseAnd %uint %13661 %15928\n      %16390 = OpBitwiseAnd %uint %24282 %uint_1\n      %19573 = OpBitwiseAnd %uint %24282 %uint_8\n      %24851 = OpShiftLeftLogical %uint %19573 %uint_13\n      %18019 = OpBitwiseOr %uint %16390 %24851\n      %23222 = OpShiftRightLogical %uint %24282 %uint_6\n      %25124 = OpBitwiseAnd %uint %23222 %uint_1\n      %18769 = OpBitwiseAnd %uint %24282 %uint_512\n      %22693 = OpShiftLeftLogical %uint %18769 %uint_7\n      %17397 = OpBitwiseOr %uint %25124 %22693\n      %20373 = OpCompositeConstruct %v2uint %18019 %17397\n      %20774 = OpIMul %v2uint %20373 %1140\n      %23868 = OpIAdd %v2uint %10132 %20774\n               OpBranch %17146\n      %14540 = OpLabel\n      %10722 = OpNot %uint %13661\n      %15377 = OpBitwiseAnd %uint %10722 %uint_7\n      %17726 = OpIMul %uint %12930 %15377\n      %22006 = OpBitwiseAnd %uint %13661 %uint_7\n      %20431 = OpIMul %uint %13106 %22006\n      %19959 = OpIAdd %uint %17726 %20431\n      %13059 = OpUDiv %uint %19959 %uint_7\n      %23085 = OpShiftRightLogical %uint %10722 %uint_3\n       %8813 = OpBitwiseAnd %uint %23085 %uint_7\n      %15099 = OpIMul %uint %12930 %8813\n      %13371 = OpShiftRightLogical %uint %13661 %uint_3\n      %25044 = OpBitwiseAnd %uint %13371 %uint_7\n      %25281 = OpIMul %uint %13106 %25044\n      %19960 = OpIAdd %uint %15099 %25281\n      %12674 = OpUDiv %uint %19960 %uint_7\n       %8189 = OpShiftLeftLogical %uint %12674 %uint_16\n       %7582 = OpBitwiseOr %uint %13059 %8189\n      %21965 = OpShiftRightLogical %uint %10722 %uint_6\n      %17622 = OpBitwiseAnd %uint %21965 %uint_7\n      %15100 = OpIMul %uint %12930 %17622\n      %13372 = OpShiftRightLogical %uint %13661 %uint_6\n      %25045 = OpBitwiseAnd %uint %13372 %uint_7\n      %25282 = OpIMul %uint %13106 %25045\n      %19961 = OpIAdd %uint %15100 %25282\n      %13060 = OpUDiv %uint %19961 %uint_7\n      %23086 = OpShiftRightLogical %uint %10722 %uint_9\n       %8814 = OpBitwiseAnd %uint %23086 %uint_7\n      %15101 = OpIMul %uint %12930 %8814\n      %13373 = OpShiftRightLogical %uint %13661 %uint_9\n      %25046 = OpBitwiseAnd %uint %13373 %uint_7\n      %25283 = OpIMul %uint %13106 %25046\n      %19962 = OpIAdd %uint %15101 %25283\n      %12675 = OpUDiv %uint %19962 %uint_7\n      %25094 = OpShiftLeftLogical %uint %12675 %uint_16\n       %9168 = OpBitwiseOr %uint %13060 %25094\n      %21483 = OpCompositeConstruct %v2uint %7582 %9168\n               OpBranch %17146\n      %17146 = OpLabel\n      %20520 = OpPhi %v2uint %23868 %10662 %21483 %14540\n      %16624 = OpCompositeExtract %uint %12024 3\n               OpSelectionMerge %19335 None\n               OpBranchConditional %20102 %10663 %14541\n      %10663 = OpLabel\n      %17680 = OpBitwiseAnd %uint %16624 %uint_1170\n      %23971 = OpBitwiseAnd %uint %16624 %uint_2340\n      %21868 = OpShiftRightLogical %uint %23971 %uint_1\n       %8156 = OpBitwiseAnd %uint %17680 %21868\n      %24632 = OpShiftLeftLogical %uint %8156 %uint_1\n      %22979 = OpShiftRightLogical %uint %8156 %uint_1\n      %18827 = OpBitwiseOr %uint %24632 %22979\n      %15929 = OpBitwiseOr %uint %8156 %18827\n       %8474 = OpNot %uint %15929\n      %10097 = OpBitwiseAnd %uint %16624 %8474\n      %16315 = OpISub %uint %uint_2925 %10097\n      %17431 = OpBitwiseAnd %uint %16315 %8474\n      %17006 = OpBitwiseAnd %uint %17431 %uint_7\n      %13692 = OpIMul %uint %12931 %17006\n      %22007 = OpBitwiseAnd %uint %10097 %uint_7\n      %20432 = OpIMul %uint %13107 %22007\n      %19963 = OpIAdd %uint %13692 %20432\n      %13061 = OpUDiv %uint %19963 %uint_5\n      %23087 = OpShiftRightLogical %uint %17431 %uint_3\n       %8815 = OpBitwiseAnd %uint %23087 %uint_7\n      %15102 = OpIMul %uint %12931 %8815\n      %13374 = OpShiftRightLogical %uint %10097 %uint_3\n      %25047 = OpBitwiseAnd %uint %13374 %uint_7\n      %25284 = OpIMul %uint %13107 %25047\n      %19964 = OpIAdd %uint %15102 %25284\n      %12676 = OpUDiv %uint %19964 %uint_5\n       %8190 = OpShiftLeftLogical %uint %12676 %uint_16\n       %7583 = OpBitwiseOr %uint %13061 %8190\n      %21966 = OpShiftRightLogical %uint %17431 %uint_6\n      %17623 = OpBitwiseAnd %uint %21966 %uint_7\n      %15103 = OpIMul %uint %12931 %17623\n      %13375 = OpShiftRightLogical %uint %10097 %uint_6\n      %25048 = OpBitwiseAnd %uint %13375 %uint_7\n      %25285 = OpIMul %uint %13107 %25048\n      %19965 = OpIAdd %uint %15103 %25285\n      %13062 = OpUDiv %uint %19965 %uint_5\n      %23088 = OpShiftRightLogical %uint %17431 %uint_9\n       %8816 = OpBitwiseAnd %uint %23088 %uint_7\n      %15104 = OpIMul %uint %12931 %8816\n      %13376 = OpShiftRightLogical %uint %10097 %uint_9\n      %25049 = OpBitwiseAnd %uint %13376 %uint_7\n      %25286 = OpIMul %uint %13107 %25049\n      %19966 = OpIAdd %uint %15104 %25286\n      %12677 = OpUDiv %uint %19966 %uint_5\n      %25095 = OpShiftLeftLogical %uint %12677 %uint_16\n       %8219 = OpBitwiseOr %uint %13062 %25095\n      %10133 = OpCompositeConstruct %v2uint %7583 %8219\n      %24283 = OpBitwiseAnd %uint %16624 %15929\n      %16391 = OpBitwiseAnd %uint %24283 %uint_1\n      %19574 = OpBitwiseAnd %uint %24283 %uint_8\n      %24852 = OpShiftLeftLogical %uint %19574 %uint_13\n      %18020 = OpBitwiseOr %uint %16391 %24852\n      %23223 = OpShiftRightLogical %uint %24283 %uint_6\n      %25125 = OpBitwiseAnd %uint %23223 %uint_1\n      %18770 = OpBitwiseAnd %uint %24283 %uint_512\n      %22694 = OpShiftLeftLogical %uint %18770 %uint_7\n      %17398 = OpBitwiseOr %uint %25125 %22694\n      %20374 = OpCompositeConstruct %v2uint %18020 %17398\n      %20775 = OpIMul %v2uint %20374 %1140\n      %23869 = OpIAdd %v2uint %10133 %20775\n               OpBranch %19335\n      %14541 = OpLabel\n      %10723 = OpNot %uint %16624\n      %15378 = OpBitwiseAnd %uint %10723 %uint_7\n      %17727 = OpIMul %uint %12931 %15378\n      %22008 = OpBitwiseAnd %uint %16624 %uint_7\n      %20433 = OpIMul %uint %13107 %22008\n      %19967 = OpIAdd %uint %17727 %20433\n      %13063 = OpUDiv %uint %19967 %uint_7\n      %23089 = OpShiftRightLogical %uint %10723 %uint_3\n       %8817 = OpBitwiseAnd %uint %23089 %uint_7\n      %15105 = OpIMul %uint %12931 %8817\n      %13377 = OpShiftRightLogical %uint %16624 %uint_3\n      %25050 = OpBitwiseAnd %uint %13377 %uint_7\n      %25287 = OpIMul %uint %13107 %25050\n      %19968 = OpIAdd %uint %15105 %25287\n      %12678 = OpUDiv %uint %19968 %uint_7\n       %8191 = OpShiftLeftLogical %uint %12678 %uint_16\n       %7584 = OpBitwiseOr %uint %13063 %8191\n      %21967 = OpShiftRightLogical %uint %10723 %uint_6\n      %17624 = OpBitwiseAnd %uint %21967 %uint_7\n      %15106 = OpIMul %uint %12931 %17624\n      %13378 = OpShiftRightLogical %uint %16624 %uint_6\n      %25051 = OpBitwiseAnd %uint %13378 %uint_7\n      %25288 = OpIMul %uint %13107 %25051\n      %19969 = OpIAdd %uint %15106 %25288\n      %13064 = OpUDiv %uint %19969 %uint_7\n      %23090 = OpShiftRightLogical %uint %10723 %uint_9\n       %8818 = OpBitwiseAnd %uint %23090 %uint_7\n      %15107 = OpIMul %uint %12931 %8818\n      %13379 = OpShiftRightLogical %uint %16624 %uint_9\n      %25052 = OpBitwiseAnd %uint %13379 %uint_7\n      %25289 = OpIMul %uint %13107 %25052\n      %19970 = OpIAdd %uint %15107 %25289\n      %12679 = OpUDiv %uint %19970 %uint_7\n      %25096 = OpShiftLeftLogical %uint %12679 %uint_16\n       %9169 = OpBitwiseOr %uint %13064 %25096\n      %21484 = OpCompositeConstruct %v2uint %7584 %9169\n               OpBranch %19335\n      %19335 = OpLabel\n      %18747 = OpPhi %v2uint %23869 %10663 %21484 %14541\n       %7889 = OpShiftLeftLogical %v2uint %18747 %1975\n       %8444 = OpBitwiseOr %v2uint %20520 %7889\n      %20104 = OpCompositeExtract %uint %11596 0\n      %23733 = OpCompositeExtract %uint %11596 1\n       %7646 = OpCompositeExtract %uint %8444 0\n       %7532 = OpCompositeExtract %uint %8444 1\n      %18263 = OpCompositeConstruct %v4uint %20104 %23733 %7646 %7532\n      %11979 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %23074\n               OpStore %11979 %18263\n               OpBranch %18021\n      %18021 = OpLabel\n               OpBranch %7206\n       %7206 = OpLabel\n               OpBranch %7207\n       %7207 = OpLabel\n               OpBranch %14903\n      %14903 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_dxn_rg8_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x000062CA, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000017,\n    0x0000000B, 0x00000004, 0x00040015, 0x0000000C, 0x00000020, 0x00000001,\n    0x00040017, 0x00000012, 0x0000000C, 0x00000002, 0x00040017, 0x00000016,\n    0x0000000C, 0x00000003, 0x00020014, 0x00000009, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x0004002B, 0x0000000B, 0x000009E9, 0x00249249,\n    0x0004002B, 0x0000000B, 0x000009C8, 0x00492492, 0x0004002B, 0x0000000B,\n    0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B, 0x00000986, 0x00924924,\n    0x0004002B, 0x0000000B, 0x00000A10, 0x00000002, 0x0004002B, 0x0000000B,\n    0x00000944, 0x00DB6DB6, 0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000,\n    0x0004002B, 0x0000000B, 0x00000A1F, 0x00000007, 0x0004002B, 0x0000000B,\n    0x00000A13, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A3A, 0x00000010,\n    0x0004002B, 0x0000000B, 0x00000A1C, 0x00000006, 0x0004002B, 0x0000000B,\n    0x00000A25, 0x00000009, 0x0004002B, 0x0000000B, 0x0000003A, 0x00000492,\n    0x0004002B, 0x0000000B, 0x0000022D, 0x00000924, 0x0004002B, 0x0000000B,\n    0x00000908, 0x00000B6D, 0x0004002B, 0x0000000B, 0x00000A19, 0x00000005,\n    0x0004002B, 0x0000000B, 0x00000A22, 0x00000008, 0x0004002B, 0x0000000B,\n    0x00000A31, 0x0000000D, 0x0004002B, 0x0000000B, 0x00000447, 0x00000200,\n    0x0004002B, 0x0000000B, 0x00000144, 0x000000FF, 0x0004002B, 0x0000000B,\n    0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00,\n    0x0004002B, 0x0000000C, 0x00000A17, 0x00000004, 0x0004002B, 0x0000000C,\n    0x00000A1D, 0x00000006, 0x0004002B, 0x0000000C, 0x00000A2C, 0x0000000B,\n    0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C,\n    0x00000A1A, 0x00000005, 0x0004002B, 0x0000000C, 0x00000A20, 0x00000007,\n    0x0004002B, 0x0000000C, 0x00000A23, 0x00000008, 0x0004002B, 0x0000000C,\n    0x00000A2F, 0x0000000C, 0x0004002B, 0x0000000C, 0x00000A14, 0x00000003,\n    0x0004002B, 0x0000000C, 0x00000A11, 0x00000002, 0x0004002B, 0x0000000C,\n    0x00000A0B, 0x00000000, 0x000A001E, 0x00000489, 0x0000000B, 0x0000000B,\n    0x0000000B, 0x0000000B, 0x00000014, 0x0000000B, 0x0000000B, 0x0000000B,\n    0x00040020, 0x00000706, 0x00000009, 0x00000489, 0x0004003B, 0x00000706,\n    0x00000CE9, 0x00000009, 0x00040020, 0x00000288, 0x00000009, 0x0000000B,\n    0x00040020, 0x00000291, 0x00000009, 0x00000014, 0x00040020, 0x00000292,\n    0x00000001, 0x00000014, 0x0004003B, 0x00000292, 0x00000F48, 0x00000001,\n    0x0006002C, 0x00000014, 0x00000A1B, 0x00000A0D, 0x00000A0A, 0x00000A0A,\n    0x00040017, 0x0000000F, 0x00000009, 0x00000002, 0x0006002C, 0x00000014,\n    0x00000A3B, 0x00000A10, 0x00000A10, 0x00000A0A, 0x0004002B, 0x0000000B,\n    0x00000A16, 0x00000004, 0x0003001D, 0x000007DC, 0x00000017, 0x0003001E,\n    0x000007B4, 0x000007DC, 0x00040020, 0x00000A32, 0x00000002, 0x000007B4,\n    0x0004003B, 0x00000A32, 0x0000107A, 0x00000002, 0x00040020, 0x00000294,\n    0x00000002, 0x00000017, 0x0007002C, 0x00000017, 0x0000007D, 0x00000A0A,\n    0x00000A22, 0x00000A0A, 0x00000A22, 0x0003001D, 0x000007DD, 0x00000017,\n    0x0003001E, 0x000007B5, 0x000007DD, 0x00040020, 0x00000A33, 0x00000002,\n    0x000007B5, 0x0004003B, 0x00000A33, 0x0000140E, 0x00000002, 0x0004002B,\n    0x0000000B, 0x00000A2E, 0x0000000C, 0x0004002B, 0x0000000B, 0x00000A6A,\n    0x00000020, 0x0006002C, 0x00000014, 0x00000BC3, 0x00000A16, 0x00000A6A,\n    0x00000A0D, 0x0007002C, 0x00000017, 0x000009CE, 0x000008A6, 0x000008A6,\n    0x000008A6, 0x000008A6, 0x0007002C, 0x00000017, 0x0000013D, 0x00000A22,\n    0x00000A22, 0x00000A22, 0x00000A22, 0x0007002C, 0x00000017, 0x0000072E,\n    0x000005FD, 0x000005FD, 0x000005FD, 0x000005FD, 0x0007002C, 0x00000017,\n    0x000002ED, 0x00000A3A, 0x00000A3A, 0x00000A3A, 0x00000A3A, 0x0007002C,\n    0x00000017, 0x0000064B, 0x00000144, 0x00000144, 0x00000144, 0x00000144,\n    0x0005002C, 0x00000011, 0x00000474, 0x00000144, 0x00000144, 0x0005002C,\n    0x00000011, 0x000007B7, 0x00000A22, 0x00000A22, 0x0007002C, 0x00000017,\n    0x00000215, 0x00000A2E, 0x00000A2E, 0x00000A2E, 0x00000A2E, 0x00050036,\n    0x00000008, 0x0000161F, 0x00000000, 0x00000502, 0x000200F8, 0x00003B06,\n    0x000300F7, 0x00003A37, 0x00000000, 0x000300FB, 0x00000A0A, 0x00002E68,\n    0x000200F8, 0x00002E68, 0x00050041, 0x00000288, 0x000060D7, 0x00000CE9,\n    0x00000A0B, 0x0004003D, 0x0000000B, 0x00003526, 0x000060D7, 0x000500C7,\n    0x0000000B, 0x00005FDC, 0x00003526, 0x00000A0D, 0x000500AB, 0x00000009,\n    0x00004376, 0x00005FDC, 0x00000A0A, 0x000500C7, 0x0000000B, 0x00003028,\n    0x00003526, 0x00000A10, 0x000500AB, 0x00000009, 0x00004384, 0x00003028,\n    0x00000A0A, 0x000500C2, 0x0000000B, 0x00001EB0, 0x00003526, 0x00000A10,\n    0x000500C7, 0x0000000B, 0x000061E2, 0x00001EB0, 0x00000A13, 0x00050041,\n    0x00000288, 0x0000492C, 0x00000CE9, 0x00000A0E, 0x0004003D, 0x0000000B,\n    0x00005EAC, 0x0000492C, 0x00050041, 0x00000288, 0x00004EBA, 0x00000CE9,\n    0x00000A11, 0x0004003D, 0x0000000B, 0x00005788, 0x00004EBA, 0x00050041,\n    0x00000288, 0x00004EBB, 0x00000CE9, 0x00000A14, 0x0004003D, 0x0000000B,\n    0x00005789, 0x00004EBB, 0x00050041, 0x00000291, 0x00004EBC, 0x00000CE9,\n    0x00000A17, 0x0004003D, 0x00000014, 0x0000578A, 0x00004EBC, 0x00050041,\n    0x00000288, 0x00004EBD, 0x00000CE9, 0x00000A1A, 0x0004003D, 0x0000000B,\n    0x0000578B, 0x00004EBD, 0x00050041, 0x00000288, 0x00004EBE, 0x00000CE9,\n    0x00000A1D, 0x0004003D, 0x0000000B, 0x0000578C, 0x00004EBE, 0x00050041,\n    0x00000288, 0x00004E6E, 0x00000CE9, 0x00000A20, 0x0004003D, 0x0000000B,\n    0x000019C2, 0x00004E6E, 0x0004003D, 0x00000014, 0x00002A0E, 0x00000F48,\n    0x000500C4, 0x00000014, 0x0000538B, 0x00002A0E, 0x00000A1B, 0x0007004F,\n    0x00000011, 0x000042F0, 0x0000538B, 0x0000538B, 0x00000000, 0x00000001,\n    0x0007004F, 0x00000011, 0x0000242F, 0x0000578A, 0x0000578A, 0x00000000,\n    0x00000001, 0x000500AE, 0x0000000F, 0x00004288, 0x000042F0, 0x0000242F,\n    0x0004009A, 0x00000009, 0x00006067, 0x00004288, 0x000300F7, 0x000036C2,\n    0x00000002, 0x000400FA, 0x00006067, 0x000055E8, 0x000036C2, 0x000200F8,\n    0x000055E8, 0x000200F9, 0x00003A37, 0x000200F8, 0x000036C2, 0x000500C4,\n    0x00000014, 0x000043C0, 0x0000538B, 0x00000A3B, 0x0004007C, 0x00000016,\n    0x00003C81, 0x000043C0, 0x00050051, 0x0000000C, 0x000047A0, 0x00003C81,\n    0x00000000, 0x00050084, 0x0000000C, 0x00002492, 0x000047A0, 0x00000A11,\n    0x00050051, 0x0000000C, 0x000018DA, 0x00003C81, 0x00000002, 0x0004007C,\n    0x0000000C, 0x000038A9, 0x000019C2, 0x00050084, 0x0000000C, 0x00002C0F,\n    0x000018DA, 0x000038A9, 0x00050051, 0x0000000C, 0x000044BE, 0x00003C81,\n    0x00000001, 0x00050080, 0x0000000C, 0x000056D4, 0x00002C0F, 0x000044BE,\n    0x0004007C, 0x0000000C, 0x00005785, 0x0000578C, 0x00050084, 0x0000000C,\n    0x00005FD7, 0x000056D4, 0x00005785, 0x00050080, 0x0000000C, 0x00002042,\n    0x00002492, 0x00005FD7, 0x0004007C, 0x0000000B, 0x000028A4, 0x00002042,\n    0x00050080, 0x0000000B, 0x000038F6, 0x0000578B, 0x000028A4, 0x000400A8,\n    0x00000009, 0x00003014, 0x00004376, 0x000300F7, 0x00004A60, 0x00000002,\n    0x000400FA, 0x00003014, 0x0000260D, 0x0000426F, 0x000200F8, 0x0000260D,\n    0x00050051, 0x0000000B, 0x00004437, 0x0000538B, 0x00000000, 0x00050051,\n    0x0000000B, 0x00002BEE, 0x0000538B, 0x00000001, 0x00050051, 0x0000000B,\n    0x00004971, 0x0000538B, 0x00000002, 0x00050084, 0x0000000B, 0x000039EF,\n    0x00005789, 0x00004971, 0x00050080, 0x0000000B, 0x00004F62, 0x00002BEE,\n    0x000039EF, 0x00050084, 0x0000000B, 0x000054AC, 0x00005788, 0x00004F62,\n    0x00050080, 0x0000000B, 0x00004FAE, 0x00004437, 0x000054AC, 0x000500C4,\n    0x0000000B, 0x00002C67, 0x00004FAE, 0x00000A16, 0x000200F9, 0x00004A60,\n    0x000200F8, 0x0000426F, 0x000300F7, 0x00005BF0, 0x00000002, 0x000400FA,\n    0x00004384, 0x00005BE0, 0x00005F21, 0x000200F8, 0x00005BE0, 0x0004007C,\n    0x00000016, 0x0000277F, 0x0000538B, 0x000500C2, 0x0000000B, 0x00004C14,\n    0x00005788, 0x00000A1A, 0x000500C2, 0x0000000B, 0x0000497A, 0x00005789,\n    0x00000A17, 0x00050051, 0x0000000C, 0x00001A7E, 0x0000277F, 0x00000002,\n    0x000500C3, 0x0000000C, 0x00002F39, 0x00001A7E, 0x00000A11, 0x0004007C,\n    0x0000000C, 0x00005780, 0x0000497A, 0x00050084, 0x0000000C, 0x00001F02,\n    0x00002F39, 0x00005780, 0x00050051, 0x0000000C, 0x00006242, 0x0000277F,\n    0x00000001, 0x000500C3, 0x0000000C, 0x00004A6F, 0x00006242, 0x00000A17,\n    0x00050080, 0x0000000C, 0x00002B2C, 0x00001F02, 0x00004A6F, 0x0004007C,\n    0x0000000C, 0x00004202, 0x00004C14, 0x00050084, 0x0000000C, 0x00003A60,\n    0x00002B2C, 0x00004202, 0x00050051, 0x0000000C, 0x00006243, 0x0000277F,\n    0x00000000, 0x000500C3, 0x0000000C, 0x00004FC7, 0x00006243, 0x00000A1A,\n    0x00050080, 0x0000000C, 0x000049FC, 0x00003A60, 0x00004FC7, 0x000500C4,\n    0x0000000C, 0x0000225D, 0x000049FC, 0x00000A20, 0x000500C7, 0x0000000C,\n    0x00002CAA, 0x00001A7E, 0x00000A14, 0x000500C4, 0x0000000C, 0x00004CAE,\n    0x00002CAA, 0x00000A1A, 0x000500C3, 0x0000000C, 0x0000383E, 0x00006242,\n    0x00000A0E, 0x000500C7, 0x0000000C, 0x00005374, 0x0000383E, 0x00000A14,\n    0x000500C4, 0x0000000C, 0x000054CA, 0x00005374, 0x00000A14, 0x000500C5,\n    0x0000000C, 0x000042CE, 0x00004CAE, 0x000054CA, 0x000500C7, 0x0000000C,\n    0x000050D5, 0x00006243, 0x00000A20, 0x000500C5, 0x0000000C, 0x00003ADD,\n    0x000042CE, 0x000050D5, 0x000500C5, 0x0000000C, 0x000043B6, 0x0000225D,\n    0x00003ADD, 0x000500C4, 0x0000000C, 0x00005E50, 0x000043B6, 0x00000A16,\n    0x000500C3, 0x0000000C, 0x000032D7, 0x00006242, 0x00000A14, 0x000500C6,\n    0x0000000C, 0x000026C9, 0x000032D7, 0x00002F39, 0x000500C7, 0x0000000C,\n    0x00004199, 0x000026C9, 0x00000A0E, 0x000500C3, 0x0000000C, 0x00002590,\n    0x00006243, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000505E, 0x00002590,\n    0x00000A14, 0x000500C4, 0x0000000C, 0x0000541D, 0x00004199, 0x00000A0E,\n    0x000500C6, 0x0000000C, 0x000022BA, 0x0000505E, 0x0000541D, 0x000500C7,\n    0x0000000C, 0x00005076, 0x00006242, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x00005228, 0x00005076, 0x00000A17, 0x000500C4, 0x0000000C, 0x00001997,\n    0x000022BA, 0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FE, 0x00005228,\n    0x00001997, 0x000500C4, 0x0000000C, 0x00001BB4, 0x00004199, 0x00000A2C,\n    0x000500C5, 0x0000000C, 0x00003F5B, 0x000047FE, 0x00001BB4, 0x000500C3,\n    0x0000000C, 0x00003A6E, 0x00005E50, 0x00000A17, 0x000500C7, 0x0000000C,\n    0x000018B8, 0x00003A6E, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000547E,\n    0x000018B8, 0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A8, 0x00003F5B,\n    0x0000547E, 0x000500C3, 0x0000000C, 0x00003A6F, 0x00005E50, 0x00000A1A,\n    0x000500C7, 0x0000000C, 0x000018B9, 0x00003A6F, 0x00000A20, 0x000500C4,\n    0x0000000C, 0x0000547F, 0x000018B9, 0x00000A23, 0x000500C5, 0x0000000C,\n    0x0000456F, 0x000045A8, 0x0000547F, 0x000500C3, 0x0000000C, 0x00003C88,\n    0x00005E50, 0x00000A23, 0x000500C4, 0x0000000C, 0x00002824, 0x00003C88,\n    0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B79, 0x0000456F, 0x00002824,\n    0x0004007C, 0x0000000B, 0x000041E5, 0x00003B79, 0x000200F9, 0x00005BF0,\n    0x000200F8, 0x00005F21, 0x0004007C, 0x00000012, 0x000059D8, 0x000042F0,\n    0x000500C2, 0x0000000B, 0x00005668, 0x00005788, 0x00000A1A, 0x00050051,\n    0x0000000C, 0x00003905, 0x000059D8, 0x00000001, 0x000500C3, 0x0000000C,\n    0x00002F3A, 0x00003905, 0x00000A1A, 0x0004007C, 0x0000000C, 0x00005781,\n    0x00005668, 0x00050084, 0x0000000C, 0x00001F03, 0x00002F3A, 0x00005781,\n    0x00050051, 0x0000000C, 0x00006244, 0x000059D8, 0x00000000, 0x000500C3,\n    0x0000000C, 0x00004FC8, 0x00006244, 0x00000A1A, 0x00050080, 0x0000000C,\n    0x000049B0, 0x00001F03, 0x00004FC8, 0x000500C4, 0x0000000C, 0x0000254A,\n    0x000049B0, 0x00000A1D, 0x000500C3, 0x0000000C, 0x0000603B, 0x00003905,\n    0x00000A0E, 0x000500C7, 0x0000000C, 0x0000539A, 0x0000603B, 0x00000A20,\n    0x000500C4, 0x0000000C, 0x0000534A, 0x0000539A, 0x00000A14, 0x000500C7,\n    0x0000000C, 0x00004EA5, 0x00006244, 0x00000A20, 0x000500C5, 0x0000000C,\n    0x00002B1A, 0x0000534A, 0x00004EA5, 0x000500C5, 0x0000000C, 0x000043B7,\n    0x0000254A, 0x00002B1A, 0x000500C4, 0x0000000C, 0x00005E63, 0x000043B7,\n    0x00000A16, 0x000500C3, 0x0000000C, 0x000031DE, 0x00003905, 0x00000A17,\n    0x000500C7, 0x0000000C, 0x00005447, 0x000031DE, 0x00000A0E, 0x000500C3,\n    0x0000000C, 0x000028A6, 0x00006244, 0x00000A14, 0x000500C7, 0x0000000C,\n    0x0000511E, 0x000028A6, 0x00000A14, 0x000500C3, 0x0000000C, 0x000028B9,\n    0x00003905, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000505F, 0x000028B9,\n    0x00000A0E, 0x000500C4, 0x0000000C, 0x0000541E, 0x0000505F, 0x00000A0E,\n    0x000500C6, 0x0000000C, 0x000022BB, 0x0000511E, 0x0000541E, 0x000500C7,\n    0x0000000C, 0x00005077, 0x00003905, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x00005229, 0x00005077, 0x00000A17, 0x000500C4, 0x0000000C, 0x00001998,\n    0x000022BB, 0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FF, 0x00005229,\n    0x00001998, 0x000500C4, 0x0000000C, 0x00001BB5, 0x00005447, 0x00000A2C,\n    0x000500C5, 0x0000000C, 0x00003F5C, 0x000047FF, 0x00001BB5, 0x000500C3,\n    0x0000000C, 0x00003A70, 0x00005E63, 0x00000A17, 0x000500C7, 0x0000000C,\n    0x000018BA, 0x00003A70, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005480,\n    0x000018BA, 0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A9, 0x00003F5C,\n    0x00005480, 0x000500C3, 0x0000000C, 0x00003A71, 0x00005E63, 0x00000A1A,\n    0x000500C7, 0x0000000C, 0x000018BB, 0x00003A71, 0x00000A20, 0x000500C4,\n    0x0000000C, 0x00005481, 0x000018BB, 0x00000A23, 0x000500C5, 0x0000000C,\n    0x00004570, 0x000045A9, 0x00005481, 0x000500C3, 0x0000000C, 0x00003C89,\n    0x00005E63, 0x00000A23, 0x000500C4, 0x0000000C, 0x00002825, 0x00003C89,\n    0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B7A, 0x00004570, 0x00002825,\n    0x0004007C, 0x0000000B, 0x000041E6, 0x00003B7A, 0x000200F9, 0x00005BF0,\n    0x000200F8, 0x00005BF0, 0x000700F5, 0x0000000B, 0x0000292C, 0x000041E5,\n    0x00005BE0, 0x000041E6, 0x00005F21, 0x000200F9, 0x00004A60, 0x000200F8,\n    0x00004A60, 0x000700F5, 0x0000000B, 0x00002C70, 0x00002C67, 0x0000260D,\n    0x0000292C, 0x00005BF0, 0x00050080, 0x0000000B, 0x000048BD, 0x00002C70,\n    0x00005EAC, 0x000500C2, 0x0000000B, 0x00003D52, 0x000048BD, 0x00000A17,\n    0x00060041, 0x00000294, 0x00004FAF, 0x0000107A, 0x00000A0B, 0x00003D52,\n    0x0004003D, 0x00000017, 0x00001CAA, 0x00004FAF, 0x000500AA, 0x00000009,\n    0x000035C0, 0x000061E2, 0x00000A0D, 0x000500AA, 0x00000009, 0x00005376,\n    0x000061E2, 0x00000A10, 0x000500A6, 0x00000009, 0x00005686, 0x000035C0,\n    0x00005376, 0x000300F7, 0x00003463, 0x00000000, 0x000400FA, 0x00005686,\n    0x00002957, 0x00003463, 0x000200F8, 0x00002957, 0x000500C7, 0x00000017,\n    0x0000475F, 0x00001CAA, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D1,\n    0x0000475F, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AC, 0x00001CAA,\n    0x0000072E, 0x000500C2, 0x00000017, 0x0000448D, 0x000050AC, 0x0000013D,\n    0x000500C5, 0x00000017, 0x00003FF8, 0x000024D1, 0x0000448D, 0x000200F9,\n    0x00003463, 0x000200F8, 0x00003463, 0x000700F5, 0x00000017, 0x00005879,\n    0x00001CAA, 0x00004A60, 0x00003FF8, 0x00002957, 0x000500AA, 0x00000009,\n    0x00004CB6, 0x000061E2, 0x00000A13, 0x000500A6, 0x00000009, 0x00003B23,\n    0x00005376, 0x00004CB6, 0x000300F7, 0x00003A1A, 0x00000000, 0x000400FA,\n    0x00003B23, 0x00002B38, 0x00003A1A, 0x000200F8, 0x00002B38, 0x000500C4,\n    0x00000017, 0x00005E17, 0x00005879, 0x000002ED, 0x000500C2, 0x00000017,\n    0x00003BE7, 0x00005879, 0x000002ED, 0x000500C5, 0x00000017, 0x000029E8,\n    0x00005E17, 0x00003BE7, 0x000200F9, 0x00003A1A, 0x000200F8, 0x00003A1A,\n    0x000700F5, 0x00000017, 0x00002AAC, 0x00005879, 0x00003463, 0x000029E8,\n    0x00002B38, 0x000300F7, 0x00006070, 0x00000002, 0x000400FA, 0x00004376,\n    0x000055E9, 0x00001C25, 0x000200F8, 0x000055E9, 0x000200F9, 0x00006070,\n    0x000200F8, 0x00001C25, 0x000200F9, 0x00006070, 0x000200F8, 0x00006070,\n    0x000700F5, 0x0000000B, 0x00002C71, 0x00000A6A, 0x000055E9, 0x00000A3A,\n    0x00001C25, 0x00050080, 0x0000000B, 0x000048BE, 0x000048BD, 0x00002C71,\n    0x000500C2, 0x0000000B, 0x00003D53, 0x000048BE, 0x00000A17, 0x00060041,\n    0x00000294, 0x00005566, 0x0000107A, 0x00000A0B, 0x00003D53, 0x0004003D,\n    0x00000017, 0x00003910, 0x00005566, 0x000300F7, 0x00003A1B, 0x00000000,\n    0x000400FA, 0x00005686, 0x00002958, 0x00003A1B, 0x000200F8, 0x00002958,\n    0x000500C7, 0x00000017, 0x00004760, 0x00003910, 0x000009CE, 0x000500C4,\n    0x00000017, 0x000024D2, 0x00004760, 0x0000013D, 0x000500C7, 0x00000017,\n    0x000050AD, 0x00003910, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448E,\n    0x000050AD, 0x0000013D, 0x000500C5, 0x00000017, 0x00003FF9, 0x000024D2,\n    0x0000448E, 0x000200F9, 0x00003A1B, 0x000200F8, 0x00003A1B, 0x000700F5,\n    0x00000017, 0x00002AAD, 0x00003910, 0x00006070, 0x00003FF9, 0x00002958,\n    0x000300F7, 0x00002DA2, 0x00000000, 0x000400FA, 0x00003B23, 0x00002B39,\n    0x00002DA2, 0x000200F8, 0x00002B39, 0x000500C4, 0x00000017, 0x00005E18,\n    0x00002AAD, 0x000002ED, 0x000500C2, 0x00000017, 0x00003BE8, 0x00002AAD,\n    0x000002ED, 0x000500C5, 0x00000017, 0x000029E9, 0x00005E18, 0x00003BE8,\n    0x000200F9, 0x00002DA2, 0x000200F8, 0x00002DA2, 0x000700F5, 0x00000017,\n    0x00004D8D, 0x00002AAD, 0x00003A1B, 0x000029E9, 0x00002B39, 0x0009004F,\n    0x00000017, 0x00005675, 0x00002AAC, 0x00002AAC, 0x00000000, 0x00000000,\n    0x00000002, 0x00000002, 0x000500C2, 0x00000017, 0x00003080, 0x00005675,\n    0x0000007D, 0x000500C7, 0x00000017, 0x00002376, 0x00003080, 0x0000064B,\n    0x0009004F, 0x00000017, 0x000042A8, 0x00004D8D, 0x00004D8D, 0x00000000,\n    0x00000000, 0x00000002, 0x00000002, 0x000500C2, 0x00000017, 0x00001DD8,\n    0x000042A8, 0x0000007D, 0x000500C7, 0x00000017, 0x000019B9, 0x00001DD8,\n    0x0000064B, 0x00050051, 0x0000000B, 0x00004641, 0x00002AAC, 0x00000000,\n    0x00050051, 0x0000000B, 0x00001880, 0x00002AAC, 0x00000002, 0x00050051,\n    0x0000000B, 0x00001DD9, 0x00004D8D, 0x00000000, 0x00050051, 0x0000000B,\n    0x000026FC, 0x00004D8D, 0x00000002, 0x00070050, 0x00000017, 0x00003C0F,\n    0x00004641, 0x00001880, 0x00001DD9, 0x000026FC, 0x000500C2, 0x00000017,\n    0x0000278A, 0x00003C0F, 0x000002ED, 0x00050051, 0x0000000B, 0x00005D24,\n    0x00002AAC, 0x00000001, 0x00050051, 0x0000000B, 0x00005FDB, 0x00002AAC,\n    0x00000003, 0x00050051, 0x0000000B, 0x00001DDA, 0x00004D8D, 0x00000001,\n    0x00050051, 0x0000000B, 0x0000275B, 0x00004D8D, 0x00000003, 0x00070050,\n    0x00000017, 0x00004137, 0x00005D24, 0x00005FDB, 0x00001DDA, 0x0000275B,\n    0x000500C7, 0x00000017, 0x000021E7, 0x00004137, 0x0000064B, 0x000500C4,\n    0x00000017, 0x00004E4B, 0x000021E7, 0x000002ED, 0x000500C5, 0x00000017,\n    0x00003F71, 0x0000278A, 0x00004E4B, 0x00050051, 0x0000000B, 0x00004E80,\n    0x00003F71, 0x00000000, 0x00050051, 0x0000000B, 0x00001966, 0x00002376,\n    0x00000000, 0x00050051, 0x0000000B, 0x00003330, 0x00002376, 0x00000001,\n    0x000500B2, 0x00000009, 0x00004E83, 0x00001966, 0x00003330, 0x000300F7,\n    0x00002DC8, 0x00000000, 0x000400FA, 0x00004E83, 0x00002990, 0x000055A0,\n    0x000200F8, 0x00002990, 0x000500C7, 0x0000000B, 0x000044F9, 0x00004E80,\n    0x000009C8, 0x000500C7, 0x0000000B, 0x00005D8C, 0x00004E80, 0x00000986,\n    0x000500C2, 0x0000000B, 0x00005554, 0x00005D8C, 0x00000A0D, 0x000500C7,\n    0x0000000B, 0x00001FC5, 0x000044F9, 0x00005554, 0x000500C4, 0x0000000B,\n    0x00006021, 0x00001FC5, 0x00000A0D, 0x000500C2, 0x0000000B, 0x000059AC,\n    0x00001FC5, 0x00000A0D, 0x000500C5, 0x0000000B, 0x00004969, 0x00006021,\n    0x000059AC, 0x000500C5, 0x0000000B, 0x00003EB1, 0x00001FC5, 0x00004969,\n    0x000500C7, 0x0000000B, 0x00004785, 0x00004E80, 0x000009E9, 0x000500C5,\n    0x0000000B, 0x0000395D, 0x00004785, 0x00000944, 0x000500C7, 0x0000000B,\n    0x00004FB3, 0x0000395D, 0x00003EB1, 0x000500C2, 0x0000000B, 0x0000503B,\n    0x000044F9, 0x00000A0D, 0x000500C5, 0x0000000B, 0x0000615A, 0x00004785,\n    0x0000503B, 0x000500C2, 0x0000000B, 0x000055A2, 0x00005D8C, 0x00000A10,\n    0x000500C5, 0x0000000B, 0x00005892, 0x0000615A, 0x000055A2, 0x000500C6,\n    0x0000000B, 0x00001E29, 0x00005892, 0x000009E9, 0x000400C8, 0x0000000B,\n    0x00002544, 0x0000503B, 0x000500C7, 0x0000000B, 0x0000391D, 0x00004785,\n    0x00002544, 0x000400C8, 0x0000000B, 0x000020E9, 0x000055A2, 0x000500C7,\n    0x0000000B, 0x00002C8F, 0x0000391D, 0x000020E9, 0x000500C5, 0x0000000B,\n    0x00001A8F, 0x00004E80, 0x00001E29, 0x00050082, 0x0000000B, 0x00004C35,\n    0x00001A8F, 0x000009E9, 0x000500C5, 0x0000000B, 0x00003A17, 0x00004C35,\n    0x00002C8F, 0x000500C4, 0x0000000B, 0x00004734, 0x00002C8F, 0x00000A10,\n    0x000500C5, 0x0000000B, 0x00003BFA, 0x00003A17, 0x00004734, 0x000400C8,\n    0x0000000B, 0x00002F7A, 0x00003EB1, 0x000500C7, 0x0000000B, 0x00004850,\n    0x00003BFA, 0x00002F7A, 0x000500C5, 0x0000000B, 0x0000186C, 0x00004850,\n    0x00004FB3, 0x000200F9, 0x00002DC8, 0x000200F8, 0x000055A0, 0x000500C7,\n    0x0000000B, 0x00004E6F, 0x00004E80, 0x000009E9, 0x000500C7, 0x0000000B,\n    0x00005D66, 0x00004E80, 0x000009C8, 0x000500C2, 0x0000000B, 0x000056E7,\n    0x00005D66, 0x00000A0D, 0x000500C5, 0x0000000B, 0x00005DC0, 0x00004E6F,\n    0x000056E7, 0x000500C7, 0x0000000B, 0x00004C8F, 0x00004E80, 0x00000986,\n    0x000500C2, 0x0000000B, 0x00005087, 0x00004C8F, 0x00000A10, 0x000500C5,\n    0x0000000B, 0x00005EDF, 0x00005DC0, 0x00005087, 0x000500C6, 0x0000000B,\n    0x00001E2A, 0x00005EDF, 0x000009E9, 0x000400C8, 0x0000000B, 0x00002545,\n    0x000056E7, 0x000500C7, 0x0000000B, 0x0000391E, 0x00004E6F, 0x00002545,\n    0x000400C8, 0x0000000B, 0x000020EA, 0x00005087, 0x000500C7, 0x0000000B,\n    0x00002C90, 0x0000391E, 0x000020EA, 0x000500C5, 0x0000000B, 0x00001A90,\n    0x00004E80, 0x00001E2A, 0x00050082, 0x0000000B, 0x00004C36, 0x00001A90,\n    0x000009E9, 0x000500C5, 0x0000000B, 0x00003A18, 0x00004C36, 0x00002C90,\n    0x000500C4, 0x0000000B, 0x000046E8, 0x00002C90, 0x00000A0D, 0x000500C5,\n    0x0000000B, 0x00003E88, 0x00003A18, 0x000046E8, 0x000500C4, 0x0000000B,\n    0x00001FB6, 0x00002C90, 0x00000A10, 0x000500C5, 0x0000000B, 0x00001E80,\n    0x00003E88, 0x00001FB6, 0x000200F9, 0x00002DC8, 0x000200F8, 0x00002DC8,\n    0x000700F5, 0x0000000B, 0x000043D0, 0x0000186C, 0x00002990, 0x00001E80,\n    0x000055A0, 0x00050051, 0x0000000B, 0x00005A0E, 0x00003F71, 0x00000001,\n    0x00050051, 0x0000000B, 0x00003281, 0x00002376, 0x00000002, 0x00050051,\n    0x0000000B, 0x00003331, 0x00002376, 0x00000003, 0x000500B2, 0x00000009,\n    0x00004E84, 0x00003281, 0x00003331, 0x000300F7, 0x00002DC9, 0x00000000,\n    0x000400FA, 0x00004E84, 0x00002991, 0x000055A1, 0x000200F8, 0x00002991,\n    0x000500C7, 0x0000000B, 0x000044FA, 0x00005A0E, 0x000009C8, 0x000500C7,\n    0x0000000B, 0x00005D8D, 0x00005A0E, 0x00000986, 0x000500C2, 0x0000000B,\n    0x00005555, 0x00005D8D, 0x00000A0D, 0x000500C7, 0x0000000B, 0x00001FC6,\n    0x000044FA, 0x00005555, 0x000500C4, 0x0000000B, 0x00006022, 0x00001FC6,\n    0x00000A0D, 0x000500C2, 0x0000000B, 0x000059AD, 0x00001FC6, 0x00000A0D,\n    0x000500C5, 0x0000000B, 0x0000496A, 0x00006022, 0x000059AD, 0x000500C5,\n    0x0000000B, 0x00003EB2, 0x00001FC6, 0x0000496A, 0x000500C7, 0x0000000B,\n    0x00004786, 0x00005A0E, 0x000009E9, 0x000500C5, 0x0000000B, 0x0000395E,\n    0x00004786, 0x00000944, 0x000500C7, 0x0000000B, 0x00004FB4, 0x0000395E,\n    0x00003EB2, 0x000500C2, 0x0000000B, 0x0000503C, 0x000044FA, 0x00000A0D,\n    0x000500C5, 0x0000000B, 0x0000615B, 0x00004786, 0x0000503C, 0x000500C2,\n    0x0000000B, 0x000055A3, 0x00005D8D, 0x00000A10, 0x000500C5, 0x0000000B,\n    0x00005893, 0x0000615B, 0x000055A3, 0x000500C6, 0x0000000B, 0x00001E2B,\n    0x00005893, 0x000009E9, 0x000400C8, 0x0000000B, 0x00002546, 0x0000503C,\n    0x000500C7, 0x0000000B, 0x0000391F, 0x00004786, 0x00002546, 0x000400C8,\n    0x0000000B, 0x000020EB, 0x000055A3, 0x000500C7, 0x0000000B, 0x00002C91,\n    0x0000391F, 0x000020EB, 0x000500C5, 0x0000000B, 0x00001A91, 0x00005A0E,\n    0x00001E2B, 0x00050082, 0x0000000B, 0x00004C37, 0x00001A91, 0x000009E9,\n    0x000500C5, 0x0000000B, 0x00003A19, 0x00004C37, 0x00002C91, 0x000500C4,\n    0x0000000B, 0x00004735, 0x00002C91, 0x00000A10, 0x000500C5, 0x0000000B,\n    0x00003BFB, 0x00003A19, 0x00004735, 0x000400C8, 0x0000000B, 0x00002F7B,\n    0x00003EB2, 0x000500C7, 0x0000000B, 0x00004851, 0x00003BFB, 0x00002F7B,\n    0x000500C5, 0x0000000B, 0x0000186D, 0x00004851, 0x00004FB4, 0x000200F9,\n    0x00002DC9, 0x000200F8, 0x000055A1, 0x000500C7, 0x0000000B, 0x00004E70,\n    0x00005A0E, 0x000009E9, 0x000500C7, 0x0000000B, 0x00005D67, 0x00005A0E,\n    0x000009C8, 0x000500C2, 0x0000000B, 0x000056E8, 0x00005D67, 0x00000A0D,\n    0x000500C5, 0x0000000B, 0x00005DC1, 0x00004E70, 0x000056E8, 0x000500C7,\n    0x0000000B, 0x00004C90, 0x00005A0E, 0x00000986, 0x000500C2, 0x0000000B,\n    0x00005088, 0x00004C90, 0x00000A10, 0x000500C5, 0x0000000B, 0x00005EE0,\n    0x00005DC1, 0x00005088, 0x000500C6, 0x0000000B, 0x00001E2C, 0x00005EE0,\n    0x000009E9, 0x000400C8, 0x0000000B, 0x00002547, 0x000056E8, 0x000500C7,\n    0x0000000B, 0x00003920, 0x00004E70, 0x00002547, 0x000400C8, 0x0000000B,\n    0x000020EC, 0x00005088, 0x000500C7, 0x0000000B, 0x00002C92, 0x00003920,\n    0x000020EC, 0x000500C5, 0x0000000B, 0x00001A92, 0x00005A0E, 0x00001E2C,\n    0x00050082, 0x0000000B, 0x00004C38, 0x00001A92, 0x000009E9, 0x000500C5,\n    0x0000000B, 0x00003A1C, 0x00004C38, 0x00002C92, 0x000500C4, 0x0000000B,\n    0x000046E9, 0x00002C92, 0x00000A0D, 0x000500C5, 0x0000000B, 0x00003E89,\n    0x00003A1C, 0x000046E9, 0x000500C4, 0x0000000B, 0x00001FB7, 0x00002C92,\n    0x00000A10, 0x000500C5, 0x0000000B, 0x00001E81, 0x00003E89, 0x00001FB7,\n    0x000200F9, 0x00002DC9, 0x000200F8, 0x00002DC9, 0x000700F5, 0x0000000B,\n    0x000043D1, 0x0000186D, 0x00002991, 0x00001E81, 0x000055A1, 0x00050051,\n    0x0000000B, 0x00005A0F, 0x00003F71, 0x00000002, 0x00050051, 0x0000000B,\n    0x00003282, 0x000019B9, 0x00000000, 0x00050051, 0x0000000B, 0x00003332,\n    0x000019B9, 0x00000001, 0x000500B2, 0x00000009, 0x00004E85, 0x00003282,\n    0x00003332, 0x000300F7, 0x00002DCA, 0x00000000, 0x000400FA, 0x00004E85,\n    0x00002992, 0x000055A5, 0x000200F8, 0x00002992, 0x000500C7, 0x0000000B,\n    0x000044FB, 0x00005A0F, 0x000009C8, 0x000500C7, 0x0000000B, 0x00005D8E,\n    0x00005A0F, 0x00000986, 0x000500C2, 0x0000000B, 0x00005556, 0x00005D8E,\n    0x00000A0D, 0x000500C7, 0x0000000B, 0x00001FC7, 0x000044FB, 0x00005556,\n    0x000500C4, 0x0000000B, 0x00006023, 0x00001FC7, 0x00000A0D, 0x000500C2,\n    0x0000000B, 0x000059AE, 0x00001FC7, 0x00000A0D, 0x000500C5, 0x0000000B,\n    0x0000496B, 0x00006023, 0x000059AE, 0x000500C5, 0x0000000B, 0x00003EB3,\n    0x00001FC7, 0x0000496B, 0x000500C7, 0x0000000B, 0x00004787, 0x00005A0F,\n    0x000009E9, 0x000500C5, 0x0000000B, 0x0000395F, 0x00004787, 0x00000944,\n    0x000500C7, 0x0000000B, 0x00004FB5, 0x0000395F, 0x00003EB3, 0x000500C2,\n    0x0000000B, 0x0000503D, 0x000044FB, 0x00000A0D, 0x000500C5, 0x0000000B,\n    0x0000615C, 0x00004787, 0x0000503D, 0x000500C2, 0x0000000B, 0x000055A4,\n    0x00005D8E, 0x00000A10, 0x000500C5, 0x0000000B, 0x00005894, 0x0000615C,\n    0x000055A4, 0x000500C6, 0x0000000B, 0x00001E2D, 0x00005894, 0x000009E9,\n    0x000400C8, 0x0000000B, 0x00002548, 0x0000503D, 0x000500C7, 0x0000000B,\n    0x00003921, 0x00004787, 0x00002548, 0x000400C8, 0x0000000B, 0x000020ED,\n    0x000055A4, 0x000500C7, 0x0000000B, 0x00002C93, 0x00003921, 0x000020ED,\n    0x000500C5, 0x0000000B, 0x00001A93, 0x00005A0F, 0x00001E2D, 0x00050082,\n    0x0000000B, 0x00004C39, 0x00001A93, 0x000009E9, 0x000500C5, 0x0000000B,\n    0x00003A1D, 0x00004C39, 0x00002C93, 0x000500C4, 0x0000000B, 0x00004736,\n    0x00002C93, 0x00000A10, 0x000500C5, 0x0000000B, 0x00003BFC, 0x00003A1D,\n    0x00004736, 0x000400C8, 0x0000000B, 0x00002F7C, 0x00003EB3, 0x000500C7,\n    0x0000000B, 0x00004852, 0x00003BFC, 0x00002F7C, 0x000500C5, 0x0000000B,\n    0x0000186E, 0x00004852, 0x00004FB5, 0x000200F9, 0x00002DCA, 0x000200F8,\n    0x000055A5, 0x000500C7, 0x0000000B, 0x00004E71, 0x00005A0F, 0x000009E9,\n    0x000500C7, 0x0000000B, 0x00005D68, 0x00005A0F, 0x000009C8, 0x000500C2,\n    0x0000000B, 0x000056E9, 0x00005D68, 0x00000A0D, 0x000500C5, 0x0000000B,\n    0x00005DC2, 0x00004E71, 0x000056E9, 0x000500C7, 0x0000000B, 0x00004C91,\n    0x00005A0F, 0x00000986, 0x000500C2, 0x0000000B, 0x00005089, 0x00004C91,\n    0x00000A10, 0x000500C5, 0x0000000B, 0x00005EE1, 0x00005DC2, 0x00005089,\n    0x000500C6, 0x0000000B, 0x00001E2E, 0x00005EE1, 0x000009E9, 0x000400C8,\n    0x0000000B, 0x00002549, 0x000056E9, 0x000500C7, 0x0000000B, 0x00003922,\n    0x00004E71, 0x00002549, 0x000400C8, 0x0000000B, 0x000020EE, 0x00005089,\n    0x000500C7, 0x0000000B, 0x00002C94, 0x00003922, 0x000020EE, 0x000500C5,\n    0x0000000B, 0x00001A94, 0x00005A0F, 0x00001E2E, 0x00050082, 0x0000000B,\n    0x00004C3A, 0x00001A94, 0x000009E9, 0x000500C5, 0x0000000B, 0x00003A1E,\n    0x00004C3A, 0x00002C94, 0x000500C4, 0x0000000B, 0x000046EA, 0x00002C94,\n    0x00000A0D, 0x000500C5, 0x0000000B, 0x00003E8A, 0x00003A1E, 0x000046EA,\n    0x000500C4, 0x0000000B, 0x00001FB8, 0x00002C94, 0x00000A10, 0x000500C5,\n    0x0000000B, 0x00001E82, 0x00003E8A, 0x00001FB8, 0x000200F9, 0x00002DCA,\n    0x000200F8, 0x00002DCA, 0x000700F5, 0x0000000B, 0x000043D2, 0x0000186E,\n    0x00002992, 0x00001E82, 0x000055A5, 0x00050051, 0x0000000B, 0x00005A10,\n    0x00003F71, 0x00000003, 0x00050051, 0x0000000B, 0x00003283, 0x000019B9,\n    0x00000002, 0x00050051, 0x0000000B, 0x00003333, 0x000019B9, 0x00000003,\n    0x000500B2, 0x00000009, 0x00004E86, 0x00003283, 0x00003333, 0x000300F7,\n    0x00002DB5, 0x00000000, 0x000400FA, 0x00004E86, 0x00002993, 0x000055A7,\n    0x000200F8, 0x00002993, 0x000500C7, 0x0000000B, 0x000044FC, 0x00005A10,\n    0x000009C8, 0x000500C7, 0x0000000B, 0x00005D8F, 0x00005A10, 0x00000986,\n    0x000500C2, 0x0000000B, 0x00005557, 0x00005D8F, 0x00000A0D, 0x000500C7,\n    0x0000000B, 0x00001FC8, 0x000044FC, 0x00005557, 0x000500C4, 0x0000000B,\n    0x00006024, 0x00001FC8, 0x00000A0D, 0x000500C2, 0x0000000B, 0x000059AF,\n    0x00001FC8, 0x00000A0D, 0x000500C5, 0x0000000B, 0x0000496C, 0x00006024,\n    0x000059AF, 0x000500C5, 0x0000000B, 0x00003EB4, 0x00001FC8, 0x0000496C,\n    0x000500C7, 0x0000000B, 0x00004788, 0x00005A10, 0x000009E9, 0x000500C5,\n    0x0000000B, 0x00003960, 0x00004788, 0x00000944, 0x000500C7, 0x0000000B,\n    0x00004FB6, 0x00003960, 0x00003EB4, 0x000500C2, 0x0000000B, 0x0000503E,\n    0x000044FC, 0x00000A0D, 0x000500C5, 0x0000000B, 0x0000615D, 0x00004788,\n    0x0000503E, 0x000500C2, 0x0000000B, 0x000055A6, 0x00005D8F, 0x00000A10,\n    0x000500C5, 0x0000000B, 0x00005895, 0x0000615D, 0x000055A6, 0x000500C6,\n    0x0000000B, 0x00001E2F, 0x00005895, 0x000009E9, 0x000400C8, 0x0000000B,\n    0x0000254B, 0x0000503E, 0x000500C7, 0x0000000B, 0x00003923, 0x00004788,\n    0x0000254B, 0x000400C8, 0x0000000B, 0x000020EF, 0x000055A6, 0x000500C7,\n    0x0000000B, 0x00002C95, 0x00003923, 0x000020EF, 0x000500C5, 0x0000000B,\n    0x00001A95, 0x00005A10, 0x00001E2F, 0x00050082, 0x0000000B, 0x00004C3B,\n    0x00001A95, 0x000009E9, 0x000500C5, 0x0000000B, 0x00003A1F, 0x00004C3B,\n    0x00002C95, 0x000500C4, 0x0000000B, 0x00004737, 0x00002C95, 0x00000A10,\n    0x000500C5, 0x0000000B, 0x00003BFD, 0x00003A1F, 0x00004737, 0x000400C8,\n    0x0000000B, 0x00002F7D, 0x00003EB4, 0x000500C7, 0x0000000B, 0x00004853,\n    0x00003BFD, 0x00002F7D, 0x000500C5, 0x0000000B, 0x0000186F, 0x00004853,\n    0x00004FB6, 0x000200F9, 0x00002DB5, 0x000200F8, 0x000055A7, 0x000500C7,\n    0x0000000B, 0x00004E72, 0x00005A10, 0x000009E9, 0x000500C7, 0x0000000B,\n    0x00005D69, 0x00005A10, 0x000009C8, 0x000500C2, 0x0000000B, 0x000056EA,\n    0x00005D69, 0x00000A0D, 0x000500C5, 0x0000000B, 0x00005DC3, 0x00004E72,\n    0x000056EA, 0x000500C7, 0x0000000B, 0x00004C92, 0x00005A10, 0x00000986,\n    0x000500C2, 0x0000000B, 0x0000508A, 0x00004C92, 0x00000A10, 0x000500C5,\n    0x0000000B, 0x00005EE2, 0x00005DC3, 0x0000508A, 0x000500C6, 0x0000000B,\n    0x00001E30, 0x00005EE2, 0x000009E9, 0x000400C8, 0x0000000B, 0x0000254C,\n    0x000056EA, 0x000500C7, 0x0000000B, 0x00003924, 0x00004E72, 0x0000254C,\n    0x000400C8, 0x0000000B, 0x000020F0, 0x0000508A, 0x000500C7, 0x0000000B,\n    0x00002C96, 0x00003924, 0x000020F0, 0x000500C5, 0x0000000B, 0x00001A96,\n    0x00005A10, 0x00001E30, 0x00050082, 0x0000000B, 0x00004C3C, 0x00001A96,\n    0x000009E9, 0x000500C5, 0x0000000B, 0x00003A20, 0x00004C3C, 0x00002C96,\n    0x000500C4, 0x0000000B, 0x000046EB, 0x00002C96, 0x00000A0D, 0x000500C5,\n    0x0000000B, 0x00003E8B, 0x00003A20, 0x000046EB, 0x000500C4, 0x0000000B,\n    0x00001FB9, 0x00002C96, 0x00000A10, 0x000500C5, 0x0000000B, 0x00001E83,\n    0x00003E8B, 0x00001FB9, 0x000200F9, 0x00002DB5, 0x000200F8, 0x00002DB5,\n    0x000700F5, 0x0000000B, 0x00004CE0, 0x0000186F, 0x00002993, 0x00001E83,\n    0x000055A7, 0x00070050, 0x00000017, 0x00003A04, 0x000043D0, 0x000043D1,\n    0x000043D2, 0x00004CE0, 0x000500C2, 0x0000000B, 0x00001BC8, 0x000038F6,\n    0x00000A17, 0x000300F7, 0x00004F49, 0x00000000, 0x000400FA, 0x00004E83,\n    0x00002994, 0x000038BE, 0x000200F8, 0x00002994, 0x000500C7, 0x0000000B,\n    0x000044FD, 0x000043D0, 0x0000003A, 0x000500C7, 0x0000000B, 0x00005D90,\n    0x000043D0, 0x0000022D, 0x000500C2, 0x0000000B, 0x00005558, 0x00005D90,\n    0x00000A0D, 0x000500C7, 0x0000000B, 0x00001FC9, 0x000044FD, 0x00005558,\n    0x000500C4, 0x0000000B, 0x00006025, 0x00001FC9, 0x00000A0D, 0x000500C2,\n    0x0000000B, 0x000059B0, 0x00001FC9, 0x00000A0D, 0x000500C5, 0x0000000B,\n    0x0000497C, 0x00006025, 0x000059B0, 0x000500C5, 0x0000000B, 0x00003E2A,\n    0x00001FC9, 0x0000497C, 0x000400C8, 0x0000000B, 0x0000210B, 0x00003E2A,\n    0x000500C7, 0x0000000B, 0x00002762, 0x000043D0, 0x0000210B, 0x00050082,\n    0x0000000B, 0x00003FAC, 0x00000908, 0x00002762, 0x000500C7, 0x0000000B,\n    0x00004407, 0x00003FAC, 0x0000210B, 0x000500C7, 0x0000000B, 0x0000425F,\n    0x00004407, 0x00000A1F, 0x00050084, 0x0000000B, 0x0000356D, 0x00001966,\n    0x0000425F, 0x000500C7, 0x0000000B, 0x000055D7, 0x00002762, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00004FA6, 0x00003330, 0x000055D7, 0x00050080,\n    0x0000000B, 0x00004D82, 0x0000356D, 0x00004FA6, 0x00050086, 0x0000000B,\n    0x000032C8, 0x00004D82, 0x00000A19, 0x000500C2, 0x0000000B, 0x000059EE,\n    0x00004407, 0x00000A13, 0x000500C7, 0x0000000B, 0x00002231, 0x000059EE,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00003AA3, 0x00001966, 0x00002231,\n    0x000500C2, 0x0000000B, 0x000033E3, 0x00002762, 0x00000A13, 0x000500C7,\n    0x0000000B, 0x0000617D, 0x000033E3, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x0000626A, 0x00003330, 0x0000617D, 0x00050080, 0x0000000B, 0x00004DA8,\n    0x00003AA3, 0x0000626A, 0x00050086, 0x0000000B, 0x00003148, 0x00004DA8,\n    0x00000A19, 0x000500C4, 0x0000000B, 0x00001FE0, 0x00003148, 0x00000A3A,\n    0x000500C5, 0x0000000B, 0x00001D81, 0x000032C8, 0x00001FE0, 0x000500C2,\n    0x0000000B, 0x000055AF, 0x00004407, 0x00000A1C, 0x000500C7, 0x0000000B,\n    0x000044B8, 0x000055AF, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AA4,\n    0x00001966, 0x000044B8, 0x000500C2, 0x0000000B, 0x000033E4, 0x00002762,\n    0x00000A1C, 0x000500C7, 0x0000000B, 0x0000617E, 0x000033E4, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x0000626B, 0x00003330, 0x0000617E, 0x00050080,\n    0x0000000B, 0x00004D83, 0x00003AA4, 0x0000626B, 0x00050086, 0x0000000B,\n    0x000032C9, 0x00004D83, 0x00000A19, 0x000500C2, 0x0000000B, 0x000059EF,\n    0x00004407, 0x00000A25, 0x000500C7, 0x0000000B, 0x00002232, 0x000059EF,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00003AA5, 0x00001966, 0x00002232,\n    0x000500C2, 0x0000000B, 0x000033E5, 0x00002762, 0x00000A25, 0x000500C7,\n    0x0000000B, 0x0000617F, 0x000033E5, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x0000626C, 0x00003330, 0x0000617F, 0x00050080, 0x0000000B, 0x00004DA9,\n    0x00003AA5, 0x0000626C, 0x00050086, 0x0000000B, 0x00003149, 0x00004DA9,\n    0x00000A19, 0x000500C4, 0x0000000B, 0x000061E9, 0x00003149, 0x00000A3A,\n    0x000500C5, 0x0000000B, 0x0000200C, 0x000032C9, 0x000061E9, 0x00050050,\n    0x00000011, 0x00002785, 0x00001D81, 0x0000200C, 0x000500C7, 0x0000000B,\n    0x00005ECC, 0x000043D0, 0x00003E2A, 0x000500C7, 0x0000000B, 0x00003FF6,\n    0x00005ECC, 0x00000A0D, 0x000500C7, 0x0000000B, 0x00004C67, 0x00005ECC,\n    0x00000A22, 0x000500C4, 0x0000000B, 0x00006105, 0x00004C67, 0x00000A31,\n    0x000500C5, 0x0000000B, 0x00004655, 0x00003FF6, 0x00006105, 0x000500C2,\n    0x0000000B, 0x00005AA8, 0x00005ECC, 0x00000A1C, 0x000500C7, 0x0000000B,\n    0x00006216, 0x00005AA8, 0x00000A0D, 0x000500C7, 0x0000000B, 0x00004943,\n    0x00005ECC, 0x00000447, 0x000500C4, 0x0000000B, 0x0000588F, 0x00004943,\n    0x00000A1F, 0x000500C5, 0x0000000B, 0x000043E7, 0x00006216, 0x0000588F,\n    0x00050050, 0x00000011, 0x00004F87, 0x00004655, 0x000043E7, 0x00050084,\n    0x00000011, 0x00005117, 0x00004F87, 0x00000474, 0x00050080, 0x00000011,\n    0x00005D2E, 0x00002785, 0x00005117, 0x000200F9, 0x00004F49, 0x000200F8,\n    0x000038BE, 0x000400C8, 0x0000000B, 0x000029D4, 0x000043D0, 0x000500C7,\n    0x0000000B, 0x00003BFE, 0x000029D4, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00004530, 0x00001966, 0x00003BFE, 0x000500C7, 0x0000000B, 0x000055D8,\n    0x000043D0, 0x00000A1F, 0x00050084, 0x0000000B, 0x00004FA7, 0x00003330,\n    0x000055D8, 0x00050080, 0x0000000B, 0x00004D84, 0x00004530, 0x00004FA7,\n    0x00050086, 0x0000000B, 0x000032CA, 0x00004D84, 0x00000A1F, 0x000500C2,\n    0x0000000B, 0x000059F0, 0x000029D4, 0x00000A13, 0x000500C7, 0x0000000B,\n    0x00002233, 0x000059F0, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AA6,\n    0x00001966, 0x00002233, 0x000500C2, 0x0000000B, 0x000033E6, 0x000043D0,\n    0x00000A13, 0x000500C7, 0x0000000B, 0x00006180, 0x000033E6, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x0000626D, 0x00003330, 0x00006180, 0x00050080,\n    0x0000000B, 0x00004DAA, 0x00003AA6, 0x0000626D, 0x00050086, 0x0000000B,\n    0x0000314A, 0x00004DAA, 0x00000A1F, 0x000500C4, 0x0000000B, 0x00001FE1,\n    0x0000314A, 0x00000A3A, 0x000500C5, 0x0000000B, 0x00001D82, 0x000032CA,\n    0x00001FE1, 0x000500C2, 0x0000000B, 0x000055B0, 0x000029D4, 0x00000A1C,\n    0x000500C7, 0x0000000B, 0x000044B9, 0x000055B0, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00003AA7, 0x00001966, 0x000044B9, 0x000500C2, 0x0000000B,\n    0x000033E7, 0x000043D0, 0x00000A1C, 0x000500C7, 0x0000000B, 0x00006181,\n    0x000033E7, 0x00000A1F, 0x00050084, 0x0000000B, 0x0000626E, 0x00003330,\n    0x00006181, 0x00050080, 0x0000000B, 0x00004D85, 0x00003AA7, 0x0000626E,\n    0x00050086, 0x0000000B, 0x000032CB, 0x00004D85, 0x00000A1F, 0x000500C2,\n    0x0000000B, 0x000059F1, 0x000029D4, 0x00000A25, 0x000500C7, 0x0000000B,\n    0x00002234, 0x000059F1, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AA8,\n    0x00001966, 0x00002234, 0x000500C2, 0x0000000B, 0x000033E8, 0x000043D0,\n    0x00000A25, 0x000500C7, 0x0000000B, 0x00006182, 0x000033E8, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x0000626F, 0x00003330, 0x00006182, 0x00050080,\n    0x0000000B, 0x00004DAB, 0x00003AA8, 0x0000626F, 0x00050086, 0x0000000B,\n    0x0000314B, 0x00004DAB, 0x00000A1F, 0x000500C4, 0x0000000B, 0x000061EA,\n    0x0000314B, 0x00000A3A, 0x000500C5, 0x0000000B, 0x000023C2, 0x000032CB,\n    0x000061EA, 0x00050050, 0x00000011, 0x000053DD, 0x00001D82, 0x000023C2,\n    0x000200F9, 0x00004F49, 0x000200F8, 0x00004F49, 0x000700F5, 0x00000011,\n    0x00002AAE, 0x00005D2E, 0x00002994, 0x000053DD, 0x000038BE, 0x000300F7,\n    0x00004B80, 0x00000000, 0x000400FA, 0x00004E84, 0x00002995, 0x000038BF,\n    0x000200F8, 0x00002995, 0x000500C7, 0x0000000B, 0x000044FE, 0x000043D1,\n    0x0000003A, 0x000500C7, 0x0000000B, 0x00005D91, 0x000043D1, 0x0000022D,\n    0x000500C2, 0x0000000B, 0x00005559, 0x00005D91, 0x00000A0D, 0x000500C7,\n    0x0000000B, 0x00001FCA, 0x000044FE, 0x00005559, 0x000500C4, 0x0000000B,\n    0x00006026, 0x00001FCA, 0x00000A0D, 0x000500C2, 0x0000000B, 0x000059B1,\n    0x00001FCA, 0x00000A0D, 0x000500C5, 0x0000000B, 0x0000497D, 0x00006026,\n    0x000059B1, 0x000500C5, 0x0000000B, 0x00003E2B, 0x00001FCA, 0x0000497D,\n    0x000400C8, 0x0000000B, 0x0000210C, 0x00003E2B, 0x000500C7, 0x0000000B,\n    0x00002763, 0x000043D1, 0x0000210C, 0x00050082, 0x0000000B, 0x00003FAD,\n    0x00000908, 0x00002763, 0x000500C7, 0x0000000B, 0x00004408, 0x00003FAD,\n    0x0000210C, 0x000500C7, 0x0000000B, 0x00004260, 0x00004408, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x0000356E, 0x00003281, 0x00004260, 0x000500C7,\n    0x0000000B, 0x000055D9, 0x00002763, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00004FA8, 0x00003331, 0x000055D9, 0x00050080, 0x0000000B, 0x00004D86,\n    0x0000356E, 0x00004FA8, 0x00050086, 0x0000000B, 0x000032CC, 0x00004D86,\n    0x00000A19, 0x000500C2, 0x0000000B, 0x000059F2, 0x00004408, 0x00000A13,\n    0x000500C7, 0x0000000B, 0x00002235, 0x000059F2, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00003AA9, 0x00003281, 0x00002235, 0x000500C2, 0x0000000B,\n    0x000033E9, 0x00002763, 0x00000A13, 0x000500C7, 0x0000000B, 0x00006183,\n    0x000033E9, 0x00000A1F, 0x00050084, 0x0000000B, 0x00006270, 0x00003331,\n    0x00006183, 0x00050080, 0x0000000B, 0x00004DAC, 0x00003AA9, 0x00006270,\n    0x00050086, 0x0000000B, 0x0000314C, 0x00004DAC, 0x00000A19, 0x000500C4,\n    0x0000000B, 0x00001FE2, 0x0000314C, 0x00000A3A, 0x000500C5, 0x0000000B,\n    0x00001D83, 0x000032CC, 0x00001FE2, 0x000500C2, 0x0000000B, 0x000055B1,\n    0x00004408, 0x00000A1C, 0x000500C7, 0x0000000B, 0x000044BA, 0x000055B1,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00003AAA, 0x00003281, 0x000044BA,\n    0x000500C2, 0x0000000B, 0x000033EA, 0x00002763, 0x00000A1C, 0x000500C7,\n    0x0000000B, 0x00006184, 0x000033EA, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00006271, 0x00003331, 0x00006184, 0x00050080, 0x0000000B, 0x00004D87,\n    0x00003AAA, 0x00006271, 0x00050086, 0x0000000B, 0x000032CD, 0x00004D87,\n    0x00000A19, 0x000500C2, 0x0000000B, 0x000059F3, 0x00004408, 0x00000A25,\n    0x000500C7, 0x0000000B, 0x00002236, 0x000059F3, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00003AAB, 0x00003281, 0x00002236, 0x000500C2, 0x0000000B,\n    0x000033EB, 0x00002763, 0x00000A25, 0x000500C7, 0x0000000B, 0x00006185,\n    0x000033EB, 0x00000A1F, 0x00050084, 0x0000000B, 0x00006272, 0x00003331,\n    0x00006185, 0x00050080, 0x0000000B, 0x00004DAD, 0x00003AAB, 0x00006272,\n    0x00050086, 0x0000000B, 0x0000314D, 0x00004DAD, 0x00000A19, 0x000500C4,\n    0x0000000B, 0x000061EB, 0x0000314D, 0x00000A3A, 0x000500C5, 0x0000000B,\n    0x0000200D, 0x000032CD, 0x000061EB, 0x00050050, 0x00000011, 0x00002786,\n    0x00001D83, 0x0000200D, 0x000500C7, 0x0000000B, 0x00005ECD, 0x000043D1,\n    0x00003E2B, 0x000500C7, 0x0000000B, 0x00003FF7, 0x00005ECD, 0x00000A0D,\n    0x000500C7, 0x0000000B, 0x00004C68, 0x00005ECD, 0x00000A22, 0x000500C4,\n    0x0000000B, 0x00006106, 0x00004C68, 0x00000A31, 0x000500C5, 0x0000000B,\n    0x00004656, 0x00003FF7, 0x00006106, 0x000500C2, 0x0000000B, 0x00005AA9,\n    0x00005ECD, 0x00000A1C, 0x000500C7, 0x0000000B, 0x00006217, 0x00005AA9,\n    0x00000A0D, 0x000500C7, 0x0000000B, 0x00004944, 0x00005ECD, 0x00000447,\n    0x000500C4, 0x0000000B, 0x00005890, 0x00004944, 0x00000A1F, 0x000500C5,\n    0x0000000B, 0x000043E8, 0x00006217, 0x00005890, 0x00050050, 0x00000011,\n    0x00004F88, 0x00004656, 0x000043E8, 0x00050084, 0x00000011, 0x00005118,\n    0x00004F88, 0x00000474, 0x00050080, 0x00000011, 0x00005D2F, 0x00002786,\n    0x00005118, 0x000200F9, 0x00004B80, 0x000200F8, 0x000038BF, 0x000400C8,\n    0x0000000B, 0x000029D5, 0x000043D1, 0x000500C7, 0x0000000B, 0x00003BFF,\n    0x000029D5, 0x00000A1F, 0x00050084, 0x0000000B, 0x00004531, 0x00003281,\n    0x00003BFF, 0x000500C7, 0x0000000B, 0x000055DA, 0x000043D1, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00004FA9, 0x00003331, 0x000055DA, 0x00050080,\n    0x0000000B, 0x00004D88, 0x00004531, 0x00004FA9, 0x00050086, 0x0000000B,\n    0x000032CE, 0x00004D88, 0x00000A1F, 0x000500C2, 0x0000000B, 0x000059F4,\n    0x000029D5, 0x00000A13, 0x000500C7, 0x0000000B, 0x00002237, 0x000059F4,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00003AAC, 0x00003281, 0x00002237,\n    0x000500C2, 0x0000000B, 0x000033EC, 0x000043D1, 0x00000A13, 0x000500C7,\n    0x0000000B, 0x00006186, 0x000033EC, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00006273, 0x00003331, 0x00006186, 0x00050080, 0x0000000B, 0x00004DAE,\n    0x00003AAC, 0x00006273, 0x00050086, 0x0000000B, 0x0000314E, 0x00004DAE,\n    0x00000A1F, 0x000500C4, 0x0000000B, 0x00001FE3, 0x0000314E, 0x00000A3A,\n    0x000500C5, 0x0000000B, 0x00001D84, 0x000032CE, 0x00001FE3, 0x000500C2,\n    0x0000000B, 0x000055B2, 0x000029D5, 0x00000A1C, 0x000500C7, 0x0000000B,\n    0x000044BB, 0x000055B2, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AAD,\n    0x00003281, 0x000044BB, 0x000500C2, 0x0000000B, 0x000033ED, 0x000043D1,\n    0x00000A1C, 0x000500C7, 0x0000000B, 0x00006187, 0x000033ED, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00006274, 0x00003331, 0x00006187, 0x00050080,\n    0x0000000B, 0x00004D89, 0x00003AAD, 0x00006274, 0x00050086, 0x0000000B,\n    0x000032CF, 0x00004D89, 0x00000A1F, 0x000500C2, 0x0000000B, 0x000059F5,\n    0x000029D5, 0x00000A25, 0x000500C7, 0x0000000B, 0x00002238, 0x000059F5,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00003AAE, 0x00003281, 0x00002238,\n    0x000500C2, 0x0000000B, 0x000033EE, 0x000043D1, 0x00000A25, 0x000500C7,\n    0x0000000B, 0x00006188, 0x000033EE, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00006275, 0x00003331, 0x00006188, 0x00050080, 0x0000000B, 0x00004DAF,\n    0x00003AAE, 0x00006275, 0x00050086, 0x0000000B, 0x0000314F, 0x00004DAF,\n    0x00000A1F, 0x000500C4, 0x0000000B, 0x000061EC, 0x0000314F, 0x00000A3A,\n    0x000500C5, 0x0000000B, 0x000023C3, 0x000032CF, 0x000061EC, 0x00050050,\n    0x00000011, 0x000053DE, 0x00001D84, 0x000023C3, 0x000200F9, 0x00004B80,\n    0x000200F8, 0x00004B80, 0x000700F5, 0x00000011, 0x00004934, 0x00005D2F,\n    0x00002995, 0x000053DE, 0x000038BF, 0x000500C4, 0x00000011, 0x00002B1E,\n    0x00004934, 0x000007B7, 0x000500C5, 0x00000011, 0x00005254, 0x00002AAE,\n    0x00002B1E, 0x000300F7, 0x00004F4A, 0x00000000, 0x000400FA, 0x00004E85,\n    0x00002996, 0x000038C0, 0x000200F8, 0x00002996, 0x000500C7, 0x0000000B,\n    0x000044FF, 0x000043D2, 0x0000003A, 0x000500C7, 0x0000000B, 0x00005D92,\n    0x000043D2, 0x0000022D, 0x000500C2, 0x0000000B, 0x0000555A, 0x00005D92,\n    0x00000A0D, 0x000500C7, 0x0000000B, 0x00001FCB, 0x000044FF, 0x0000555A,\n    0x000500C4, 0x0000000B, 0x00006027, 0x00001FCB, 0x00000A0D, 0x000500C2,\n    0x0000000B, 0x000059B2, 0x00001FCB, 0x00000A0D, 0x000500C5, 0x0000000B,\n    0x0000497E, 0x00006027, 0x000059B2, 0x000500C5, 0x0000000B, 0x00003E2C,\n    0x00001FCB, 0x0000497E, 0x000400C8, 0x0000000B, 0x0000210D, 0x00003E2C,\n    0x000500C7, 0x0000000B, 0x00002764, 0x000043D2, 0x0000210D, 0x00050082,\n    0x0000000B, 0x00003FAE, 0x00000908, 0x00002764, 0x000500C7, 0x0000000B,\n    0x00004409, 0x00003FAE, 0x0000210D, 0x000500C7, 0x0000000B, 0x00004261,\n    0x00004409, 0x00000A1F, 0x00050084, 0x0000000B, 0x0000356F, 0x00003282,\n    0x00004261, 0x000500C7, 0x0000000B, 0x000055DB, 0x00002764, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00004FAA, 0x00003332, 0x000055DB, 0x00050080,\n    0x0000000B, 0x00004D8A, 0x0000356F, 0x00004FAA, 0x00050086, 0x0000000B,\n    0x000032D0, 0x00004D8A, 0x00000A19, 0x000500C2, 0x0000000B, 0x000059F6,\n    0x00004409, 0x00000A13, 0x000500C7, 0x0000000B, 0x00002239, 0x000059F6,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00003AAF, 0x00003282, 0x00002239,\n    0x000500C2, 0x0000000B, 0x000033EF, 0x00002764, 0x00000A13, 0x000500C7,\n    0x0000000B, 0x00006189, 0x000033EF, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00006276, 0x00003332, 0x00006189, 0x00050080, 0x0000000B, 0x00004DB0,\n    0x00003AAF, 0x00006276, 0x00050086, 0x0000000B, 0x00003150, 0x00004DB0,\n    0x00000A19, 0x000500C4, 0x0000000B, 0x00001FE4, 0x00003150, 0x00000A3A,\n    0x000500C5, 0x0000000B, 0x00001D85, 0x000032D0, 0x00001FE4, 0x000500C2,\n    0x0000000B, 0x000055B3, 0x00004409, 0x00000A1C, 0x000500C7, 0x0000000B,\n    0x000044BC, 0x000055B3, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AB0,\n    0x00003282, 0x000044BC, 0x000500C2, 0x0000000B, 0x000033F0, 0x00002764,\n    0x00000A1C, 0x000500C7, 0x0000000B, 0x0000618A, 0x000033F0, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00006277, 0x00003332, 0x0000618A, 0x00050080,\n    0x0000000B, 0x00004D8B, 0x00003AB0, 0x00006277, 0x00050086, 0x0000000B,\n    0x000032D1, 0x00004D8B, 0x00000A19, 0x000500C2, 0x0000000B, 0x000059F7,\n    0x00004409, 0x00000A25, 0x000500C7, 0x0000000B, 0x0000223A, 0x000059F7,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00003AB1, 0x00003282, 0x0000223A,\n    0x000500C2, 0x0000000B, 0x000033F1, 0x00002764, 0x00000A25, 0x000500C7,\n    0x0000000B, 0x0000618B, 0x000033F1, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00006278, 0x00003332, 0x0000618B, 0x00050080, 0x0000000B, 0x00004DB1,\n    0x00003AB1, 0x00006278, 0x00050086, 0x0000000B, 0x00003151, 0x00004DB1,\n    0x00000A19, 0x000500C4, 0x0000000B, 0x000061ED, 0x00003151, 0x00000A3A,\n    0x000500C5, 0x0000000B, 0x0000200E, 0x000032D1, 0x000061ED, 0x00050050,\n    0x00000011, 0x00002787, 0x00001D85, 0x0000200E, 0x000500C7, 0x0000000B,\n    0x00005ECE, 0x000043D2, 0x00003E2C, 0x000500C7, 0x0000000B, 0x00003FFA,\n    0x00005ECE, 0x00000A0D, 0x000500C7, 0x0000000B, 0x00004C69, 0x00005ECE,\n    0x00000A22, 0x000500C4, 0x0000000B, 0x00006107, 0x00004C69, 0x00000A31,\n    0x000500C5, 0x0000000B, 0x00004657, 0x00003FFA, 0x00006107, 0x000500C2,\n    0x0000000B, 0x00005AAA, 0x00005ECE, 0x00000A1C, 0x000500C7, 0x0000000B,\n    0x00006218, 0x00005AAA, 0x00000A0D, 0x000500C7, 0x0000000B, 0x00004945,\n    0x00005ECE, 0x00000447, 0x000500C4, 0x0000000B, 0x00005891, 0x00004945,\n    0x00000A1F, 0x000500C5, 0x0000000B, 0x000043E9, 0x00006218, 0x00005891,\n    0x00050050, 0x00000011, 0x00004F89, 0x00004657, 0x000043E9, 0x00050084,\n    0x00000011, 0x00005119, 0x00004F89, 0x00000474, 0x00050080, 0x00000011,\n    0x00005D30, 0x00002787, 0x00005119, 0x000200F9, 0x00004F4A, 0x000200F8,\n    0x000038C0, 0x000400C8, 0x0000000B, 0x000029D6, 0x000043D2, 0x000500C7,\n    0x0000000B, 0x00003C00, 0x000029D6, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00004532, 0x00003282, 0x00003C00, 0x000500C7, 0x0000000B, 0x000055DC,\n    0x000043D2, 0x00000A1F, 0x00050084, 0x0000000B, 0x00004FAB, 0x00003332,\n    0x000055DC, 0x00050080, 0x0000000B, 0x00004D8C, 0x00004532, 0x00004FAB,\n    0x00050086, 0x0000000B, 0x000032D2, 0x00004D8C, 0x00000A1F, 0x000500C2,\n    0x0000000B, 0x000059F8, 0x000029D6, 0x00000A13, 0x000500C7, 0x0000000B,\n    0x0000223B, 0x000059F8, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AB2,\n    0x00003282, 0x0000223B, 0x000500C2, 0x0000000B, 0x000033F2, 0x000043D2,\n    0x00000A13, 0x000500C7, 0x0000000B, 0x0000618C, 0x000033F2, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00006279, 0x00003332, 0x0000618C, 0x00050080,\n    0x0000000B, 0x00004DB2, 0x00003AB2, 0x00006279, 0x00050086, 0x0000000B,\n    0x00003152, 0x00004DB2, 0x00000A1F, 0x000500C4, 0x0000000B, 0x00001FE5,\n    0x00003152, 0x00000A3A, 0x000500C5, 0x0000000B, 0x00001D86, 0x000032D2,\n    0x00001FE5, 0x000500C2, 0x0000000B, 0x000055B4, 0x000029D6, 0x00000A1C,\n    0x000500C7, 0x0000000B, 0x000044BD, 0x000055B4, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00003AB3, 0x00003282, 0x000044BD, 0x000500C2, 0x0000000B,\n    0x000033F3, 0x000043D2, 0x00000A1C, 0x000500C7, 0x0000000B, 0x0000618D,\n    0x000033F3, 0x00000A1F, 0x00050084, 0x0000000B, 0x0000627A, 0x00003332,\n    0x0000618D, 0x00050080, 0x0000000B, 0x00004D8E, 0x00003AB3, 0x0000627A,\n    0x00050086, 0x0000000B, 0x000032D3, 0x00004D8E, 0x00000A1F, 0x000500C2,\n    0x0000000B, 0x000059F9, 0x000029D6, 0x00000A25, 0x000500C7, 0x0000000B,\n    0x0000223C, 0x000059F9, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AB4,\n    0x00003282, 0x0000223C, 0x000500C2, 0x0000000B, 0x000033F4, 0x000043D2,\n    0x00000A25, 0x000500C7, 0x0000000B, 0x0000618E, 0x000033F4, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x0000627B, 0x00003332, 0x0000618E, 0x00050080,\n    0x0000000B, 0x00004DB3, 0x00003AB4, 0x0000627B, 0x00050086, 0x0000000B,\n    0x00003153, 0x00004DB3, 0x00000A1F, 0x000500C4, 0x0000000B, 0x000061EE,\n    0x00003153, 0x00000A3A, 0x000500C5, 0x0000000B, 0x000023C4, 0x000032D3,\n    0x000061EE, 0x00050050, 0x00000011, 0x000053DF, 0x00001D86, 0x000023C4,\n    0x000200F9, 0x00004F4A, 0x000200F8, 0x00004F4A, 0x000700F5, 0x00000011,\n    0x00002AAF, 0x00005D30, 0x00002996, 0x000053DF, 0x000038C0, 0x000300F7,\n    0x00004B81, 0x00000000, 0x000400FA, 0x00004E86, 0x00002997, 0x000038C1,\n    0x000200F8, 0x00002997, 0x000500C7, 0x0000000B, 0x00004500, 0x00004CE0,\n    0x0000003A, 0x000500C7, 0x0000000B, 0x00005D93, 0x00004CE0, 0x0000022D,\n    0x000500C2, 0x0000000B, 0x0000555B, 0x00005D93, 0x00000A0D, 0x000500C7,\n    0x0000000B, 0x00001FCC, 0x00004500, 0x0000555B, 0x000500C4, 0x0000000B,\n    0x00006028, 0x00001FCC, 0x00000A0D, 0x000500C2, 0x0000000B, 0x000059B3,\n    0x00001FCC, 0x00000A0D, 0x000500C5, 0x0000000B, 0x0000497F, 0x00006028,\n    0x000059B3, 0x000500C5, 0x0000000B, 0x00003E2D, 0x00001FCC, 0x0000497F,\n    0x000400C8, 0x0000000B, 0x0000210E, 0x00003E2D, 0x000500C7, 0x0000000B,\n    0x00002765, 0x00004CE0, 0x0000210E, 0x00050082, 0x0000000B, 0x00003FAF,\n    0x00000908, 0x00002765, 0x000500C7, 0x0000000B, 0x0000440A, 0x00003FAF,\n    0x0000210E, 0x000500C7, 0x0000000B, 0x00004262, 0x0000440A, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00003570, 0x00003283, 0x00004262, 0x000500C7,\n    0x0000000B, 0x000055DD, 0x00002765, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00004FAC, 0x00003333, 0x000055DD, 0x00050080, 0x0000000B, 0x00004D8F,\n    0x00003570, 0x00004FAC, 0x00050086, 0x0000000B, 0x000032D4, 0x00004D8F,\n    0x00000A19, 0x000500C2, 0x0000000B, 0x000059FA, 0x0000440A, 0x00000A13,\n    0x000500C7, 0x0000000B, 0x0000223D, 0x000059FA, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00003AB5, 0x00003283, 0x0000223D, 0x000500C2, 0x0000000B,\n    0x000033F5, 0x00002765, 0x00000A13, 0x000500C7, 0x0000000B, 0x0000618F,\n    0x000033F5, 0x00000A1F, 0x00050084, 0x0000000B, 0x0000627C, 0x00003333,\n    0x0000618F, 0x00050080, 0x0000000B, 0x00004DB4, 0x00003AB5, 0x0000627C,\n    0x00050086, 0x0000000B, 0x00003154, 0x00004DB4, 0x00000A19, 0x000500C4,\n    0x0000000B, 0x00001FE6, 0x00003154, 0x00000A3A, 0x000500C5, 0x0000000B,\n    0x00001D87, 0x000032D4, 0x00001FE6, 0x000500C2, 0x0000000B, 0x000055B5,\n    0x0000440A, 0x00000A1C, 0x000500C7, 0x0000000B, 0x000044BF, 0x000055B5,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00003AB6, 0x00003283, 0x000044BF,\n    0x000500C2, 0x0000000B, 0x000033F6, 0x00002765, 0x00000A1C, 0x000500C7,\n    0x0000000B, 0x00006190, 0x000033F6, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x0000627D, 0x00003333, 0x00006190, 0x00050080, 0x0000000B, 0x00004D90,\n    0x00003AB6, 0x0000627D, 0x00050086, 0x0000000B, 0x000032D5, 0x00004D90,\n    0x00000A19, 0x000500C2, 0x0000000B, 0x000059FB, 0x0000440A, 0x00000A25,\n    0x000500C7, 0x0000000B, 0x0000223E, 0x000059FB, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00003AB7, 0x00003283, 0x0000223E, 0x000500C2, 0x0000000B,\n    0x000033F7, 0x00002765, 0x00000A25, 0x000500C7, 0x0000000B, 0x00006191,\n    0x000033F7, 0x00000A1F, 0x00050084, 0x0000000B, 0x0000627E, 0x00003333,\n    0x00006191, 0x00050080, 0x0000000B, 0x00004DB5, 0x00003AB7, 0x0000627E,\n    0x00050086, 0x0000000B, 0x00003155, 0x00004DB5, 0x00000A19, 0x000500C4,\n    0x0000000B, 0x000061EF, 0x00003155, 0x00000A3A, 0x000500C5, 0x0000000B,\n    0x0000200F, 0x000032D5, 0x000061EF, 0x00050050, 0x00000011, 0x00002788,\n    0x00001D87, 0x0000200F, 0x000500C7, 0x0000000B, 0x00005ECF, 0x00004CE0,\n    0x00003E2D, 0x000500C7, 0x0000000B, 0x00003FFB, 0x00005ECF, 0x00000A0D,\n    0x000500C7, 0x0000000B, 0x00004C6A, 0x00005ECF, 0x00000A22, 0x000500C4,\n    0x0000000B, 0x00006108, 0x00004C6A, 0x00000A31, 0x000500C5, 0x0000000B,\n    0x00004658, 0x00003FFB, 0x00006108, 0x000500C2, 0x0000000B, 0x00005AAB,\n    0x00005ECF, 0x00000A1C, 0x000500C7, 0x0000000B, 0x00006219, 0x00005AAB,\n    0x00000A0D, 0x000500C7, 0x0000000B, 0x00004946, 0x00005ECF, 0x00000447,\n    0x000500C4, 0x0000000B, 0x00005896, 0x00004946, 0x00000A1F, 0x000500C5,\n    0x0000000B, 0x000043EA, 0x00006219, 0x00005896, 0x00050050, 0x00000011,\n    0x00004F8A, 0x00004658, 0x000043EA, 0x00050084, 0x00000011, 0x0000511A,\n    0x00004F8A, 0x00000474, 0x00050080, 0x00000011, 0x00005D31, 0x00002788,\n    0x0000511A, 0x000200F9, 0x00004B81, 0x000200F8, 0x000038C1, 0x000400C8,\n    0x0000000B, 0x000029D7, 0x00004CE0, 0x000500C7, 0x0000000B, 0x00003C01,\n    0x000029D7, 0x00000A1F, 0x00050084, 0x0000000B, 0x00004533, 0x00003283,\n    0x00003C01, 0x000500C7, 0x0000000B, 0x000055DE, 0x00004CE0, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00004FAD, 0x00003333, 0x000055DE, 0x00050080,\n    0x0000000B, 0x00004D91, 0x00004533, 0x00004FAD, 0x00050086, 0x0000000B,\n    0x000032D6, 0x00004D91, 0x00000A1F, 0x000500C2, 0x0000000B, 0x000059FC,\n    0x000029D7, 0x00000A13, 0x000500C7, 0x0000000B, 0x0000223F, 0x000059FC,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00003AB8, 0x00003283, 0x0000223F,\n    0x000500C2, 0x0000000B, 0x000033F8, 0x00004CE0, 0x00000A13, 0x000500C7,\n    0x0000000B, 0x00006192, 0x000033F8, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x0000627F, 0x00003333, 0x00006192, 0x00050080, 0x0000000B, 0x00004DB6,\n    0x00003AB8, 0x0000627F, 0x00050086, 0x0000000B, 0x00003156, 0x00004DB6,\n    0x00000A1F, 0x000500C4, 0x0000000B, 0x00001FE7, 0x00003156, 0x00000A3A,\n    0x000500C5, 0x0000000B, 0x00001D88, 0x000032D6, 0x00001FE7, 0x000500C2,\n    0x0000000B, 0x000055B6, 0x000029D7, 0x00000A1C, 0x000500C7, 0x0000000B,\n    0x000044C0, 0x000055B6, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AB9,\n    0x00003283, 0x000044C0, 0x000500C2, 0x0000000B, 0x000033F9, 0x00004CE0,\n    0x00000A1C, 0x000500C7, 0x0000000B, 0x00006193, 0x000033F9, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00006280, 0x00003333, 0x00006193, 0x00050080,\n    0x0000000B, 0x00004D92, 0x00003AB9, 0x00006280, 0x00050086, 0x0000000B,\n    0x000032D8, 0x00004D92, 0x00000A1F, 0x000500C2, 0x0000000B, 0x000059FD,\n    0x000029D7, 0x00000A25, 0x000500C7, 0x0000000B, 0x00002240, 0x000059FD,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00003ABA, 0x00003283, 0x00002240,\n    0x000500C2, 0x0000000B, 0x000033FA, 0x00004CE0, 0x00000A25, 0x000500C7,\n    0x0000000B, 0x00006194, 0x000033FA, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00006281, 0x00003333, 0x00006194, 0x00050080, 0x0000000B, 0x00004DB7,\n    0x00003ABA, 0x00006281, 0x00050086, 0x0000000B, 0x00003157, 0x00004DB7,\n    0x00000A1F, 0x000500C4, 0x0000000B, 0x000061F0, 0x00003157, 0x00000A3A,\n    0x000500C5, 0x0000000B, 0x000023C5, 0x000032D8, 0x000061F0, 0x00050050,\n    0x00000011, 0x000053E0, 0x00001D88, 0x000023C5, 0x000200F9, 0x00004B81,\n    0x000200F8, 0x00004B81, 0x000700F5, 0x00000011, 0x00004935, 0x00005D31,\n    0x00002997, 0x000053E0, 0x000038C1, 0x000500C4, 0x00000011, 0x00001ECC,\n    0x00004935, 0x000007B7, 0x000500C5, 0x00000011, 0x000020F9, 0x00002AAF,\n    0x00001ECC, 0x00050051, 0x0000000B, 0x00004E81, 0x00005254, 0x00000000,\n    0x00050051, 0x0000000B, 0x00005CB2, 0x00005254, 0x00000001, 0x00050051,\n    0x0000000B, 0x00001DDB, 0x000020F9, 0x00000000, 0x00050051, 0x0000000B,\n    0x00001D69, 0x000020F9, 0x00000001, 0x00070050, 0x00000017, 0x00004754,\n    0x00004E81, 0x00005CB2, 0x00001DDB, 0x00001D69, 0x00060041, 0x00000294,\n    0x00002253, 0x0000140E, 0x00000A0B, 0x00001BC8, 0x0003003E, 0x00002253,\n    0x00004754, 0x00050051, 0x0000000B, 0x00003220, 0x000043C0, 0x00000001,\n    0x00050080, 0x0000000B, 0x00005AC0, 0x00003220, 0x00000A0E, 0x000500B0,\n    0x00000009, 0x00004411, 0x00005AC0, 0x000019C2, 0x000300F7, 0x00001C27,\n    0x00000002, 0x000400FA, 0x00004411, 0x0000592C, 0x00001C27, 0x000200F8,\n    0x0000592C, 0x00050080, 0x0000000B, 0x00003C79, 0x000038F6, 0x0000578C,\n    0x000500C2, 0x00000017, 0x00002EF7, 0x00003A04, 0x00000215, 0x000500C2,\n    0x0000000B, 0x000059FE, 0x00003C79, 0x00000A17, 0x00050051, 0x0000000B,\n    0x00004B33, 0x00002EF7, 0x00000000, 0x000300F7, 0x000042F7, 0x00000000,\n    0x000400FA, 0x00004E83, 0x00002998, 0x000038C2, 0x000200F8, 0x00002998,\n    0x000500C7, 0x0000000B, 0x00004501, 0x00004B33, 0x0000003A, 0x000500C7,\n    0x0000000B, 0x00005D94, 0x00004B33, 0x0000022D, 0x000500C2, 0x0000000B,\n    0x0000555C, 0x00005D94, 0x00000A0D, 0x000500C7, 0x0000000B, 0x00001FCD,\n    0x00004501, 0x0000555C, 0x000500C4, 0x0000000B, 0x00006029, 0x00001FCD,\n    0x00000A0D, 0x000500C2, 0x0000000B, 0x000059B4, 0x00001FCD, 0x00000A0D,\n    0x000500C5, 0x0000000B, 0x00004980, 0x00006029, 0x000059B4, 0x000500C5,\n    0x0000000B, 0x00003E2E, 0x00001FCD, 0x00004980, 0x000400C8, 0x0000000B,\n    0x0000210F, 0x00003E2E, 0x000500C7, 0x0000000B, 0x00002766, 0x00004B33,\n    0x0000210F, 0x00050082, 0x0000000B, 0x00003FB0, 0x00000908, 0x00002766,\n    0x000500C7, 0x0000000B, 0x0000440B, 0x00003FB0, 0x0000210F, 0x000500C7,\n    0x0000000B, 0x00004263, 0x0000440B, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00003571, 0x00001966, 0x00004263, 0x000500C7, 0x0000000B, 0x000055DF,\n    0x00002766, 0x00000A1F, 0x00050084, 0x0000000B, 0x00004FB0, 0x00003330,\n    0x000055DF, 0x00050080, 0x0000000B, 0x00004D93, 0x00003571, 0x00004FB0,\n    0x00050086, 0x0000000B, 0x000032D9, 0x00004D93, 0x00000A19, 0x000500C2,\n    0x0000000B, 0x000059FF, 0x0000440B, 0x00000A13, 0x000500C7, 0x0000000B,\n    0x00002241, 0x000059FF, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003ABB,\n    0x00001966, 0x00002241, 0x000500C2, 0x0000000B, 0x000033FB, 0x00002766,\n    0x00000A13, 0x000500C7, 0x0000000B, 0x00006195, 0x000033FB, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00006282, 0x00003330, 0x00006195, 0x00050080,\n    0x0000000B, 0x00004DB8, 0x00003ABB, 0x00006282, 0x00050086, 0x0000000B,\n    0x00003158, 0x00004DB8, 0x00000A19, 0x000500C4, 0x0000000B, 0x00001FE8,\n    0x00003158, 0x00000A3A, 0x000500C5, 0x0000000B, 0x00001D89, 0x000032D9,\n    0x00001FE8, 0x000500C2, 0x0000000B, 0x000055B7, 0x0000440B, 0x00000A1C,\n    0x000500C7, 0x0000000B, 0x000044C1, 0x000055B7, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00003ABC, 0x00001966, 0x000044C1, 0x000500C2, 0x0000000B,\n    0x000033FC, 0x00002766, 0x00000A1C, 0x000500C7, 0x0000000B, 0x00006196,\n    0x000033FC, 0x00000A1F, 0x00050084, 0x0000000B, 0x00006283, 0x00003330,\n    0x00006196, 0x00050080, 0x0000000B, 0x00004D94, 0x00003ABC, 0x00006283,\n    0x00050086, 0x0000000B, 0x000032DA, 0x00004D94, 0x00000A19, 0x000500C2,\n    0x0000000B, 0x00005A00, 0x0000440B, 0x00000A25, 0x000500C7, 0x0000000B,\n    0x00002242, 0x00005A00, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003ABD,\n    0x00001966, 0x00002242, 0x000500C2, 0x0000000B, 0x000033FD, 0x00002766,\n    0x00000A25, 0x000500C7, 0x0000000B, 0x00006197, 0x000033FD, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00006284, 0x00003330, 0x00006197, 0x00050080,\n    0x0000000B, 0x00004DB9, 0x00003ABD, 0x00006284, 0x00050086, 0x0000000B,\n    0x00003159, 0x00004DB9, 0x00000A19, 0x000500C4, 0x0000000B, 0x000061F1,\n    0x00003159, 0x00000A3A, 0x000500C5, 0x0000000B, 0x00002010, 0x000032DA,\n    0x000061F1, 0x00050050, 0x00000011, 0x00002789, 0x00001D89, 0x00002010,\n    0x000500C7, 0x0000000B, 0x00005ED0, 0x00004B33, 0x00003E2E, 0x000500C7,\n    0x0000000B, 0x00003FFC, 0x00005ED0, 0x00000A0D, 0x000500C7, 0x0000000B,\n    0x00004C6B, 0x00005ED0, 0x00000A22, 0x000500C4, 0x0000000B, 0x00006109,\n    0x00004C6B, 0x00000A31, 0x000500C5, 0x0000000B, 0x00004659, 0x00003FFC,\n    0x00006109, 0x000500C2, 0x0000000B, 0x00005AAC, 0x00005ED0, 0x00000A1C,\n    0x000500C7, 0x0000000B, 0x0000621A, 0x00005AAC, 0x00000A0D, 0x000500C7,\n    0x0000000B, 0x00004947, 0x00005ED0, 0x00000447, 0x000500C4, 0x0000000B,\n    0x00005897, 0x00004947, 0x00000A1F, 0x000500C5, 0x0000000B, 0x000043EB,\n    0x0000621A, 0x00005897, 0x00050050, 0x00000011, 0x00004F8B, 0x00004659,\n    0x000043EB, 0x00050084, 0x00000011, 0x0000511B, 0x00004F8B, 0x00000474,\n    0x00050080, 0x00000011, 0x00005D32, 0x00002789, 0x0000511B, 0x000200F9,\n    0x000042F7, 0x000200F8, 0x000038C2, 0x000400C8, 0x0000000B, 0x000029D8,\n    0x00004B33, 0x000500C7, 0x0000000B, 0x00003C02, 0x000029D8, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00004534, 0x00001966, 0x00003C02, 0x000500C7,\n    0x0000000B, 0x000055E0, 0x00004B33, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00004FB1, 0x00003330, 0x000055E0, 0x00050080, 0x0000000B, 0x00004D95,\n    0x00004534, 0x00004FB1, 0x00050086, 0x0000000B, 0x000032DB, 0x00004D95,\n    0x00000A1F, 0x000500C2, 0x0000000B, 0x00005A01, 0x000029D8, 0x00000A13,\n    0x000500C7, 0x0000000B, 0x00002243, 0x00005A01, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00003ABE, 0x00001966, 0x00002243, 0x000500C2, 0x0000000B,\n    0x000033FE, 0x00004B33, 0x00000A13, 0x000500C7, 0x0000000B, 0x00006198,\n    0x000033FE, 0x00000A1F, 0x00050084, 0x0000000B, 0x00006285, 0x00003330,\n    0x00006198, 0x00050080, 0x0000000B, 0x00004DBA, 0x00003ABE, 0x00006285,\n    0x00050086, 0x0000000B, 0x0000315A, 0x00004DBA, 0x00000A1F, 0x000500C4,\n    0x0000000B, 0x00001FE9, 0x0000315A, 0x00000A3A, 0x000500C5, 0x0000000B,\n    0x00001D8A, 0x000032DB, 0x00001FE9, 0x000500C2, 0x0000000B, 0x000055B8,\n    0x000029D8, 0x00000A1C, 0x000500C7, 0x0000000B, 0x000044C2, 0x000055B8,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00003ABF, 0x00001966, 0x000044C2,\n    0x000500C2, 0x0000000B, 0x000033FF, 0x00004B33, 0x00000A1C, 0x000500C7,\n    0x0000000B, 0x00006199, 0x000033FF, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00006286, 0x00003330, 0x00006199, 0x00050080, 0x0000000B, 0x00004D96,\n    0x00003ABF, 0x00006286, 0x00050086, 0x0000000B, 0x000032DC, 0x00004D96,\n    0x00000A1F, 0x000500C2, 0x0000000B, 0x00005A02, 0x000029D8, 0x00000A25,\n    0x000500C7, 0x0000000B, 0x00002244, 0x00005A02, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00003AC0, 0x00001966, 0x00002244, 0x000500C2, 0x0000000B,\n    0x00003400, 0x00004B33, 0x00000A25, 0x000500C7, 0x0000000B, 0x0000619A,\n    0x00003400, 0x00000A1F, 0x00050084, 0x0000000B, 0x00006287, 0x00003330,\n    0x0000619A, 0x00050080, 0x0000000B, 0x00004DBB, 0x00003AC0, 0x00006287,\n    0x00050086, 0x0000000B, 0x0000315B, 0x00004DBB, 0x00000A1F, 0x000500C4,\n    0x0000000B, 0x000061F2, 0x0000315B, 0x00000A3A, 0x000500C5, 0x0000000B,\n    0x000023C6, 0x000032DC, 0x000061F2, 0x00050050, 0x00000011, 0x000053E1,\n    0x00001D8A, 0x000023C6, 0x000200F9, 0x000042F7, 0x000200F8, 0x000042F7,\n    0x000700F5, 0x00000011, 0x00005022, 0x00005D32, 0x00002998, 0x000053E1,\n    0x000038C2, 0x00050051, 0x0000000B, 0x000040EA, 0x00002EF7, 0x00000001,\n    0x000300F7, 0x00004B82, 0x00000000, 0x000400FA, 0x00004E84, 0x00002999,\n    0x000038C3, 0x000200F8, 0x00002999, 0x000500C7, 0x0000000B, 0x00004502,\n    0x000040EA, 0x0000003A, 0x000500C7, 0x0000000B, 0x00005D95, 0x000040EA,\n    0x0000022D, 0x000500C2, 0x0000000B, 0x0000555D, 0x00005D95, 0x00000A0D,\n    0x000500C7, 0x0000000B, 0x00001FCE, 0x00004502, 0x0000555D, 0x000500C4,\n    0x0000000B, 0x0000602A, 0x00001FCE, 0x00000A0D, 0x000500C2, 0x0000000B,\n    0x000059B5, 0x00001FCE, 0x00000A0D, 0x000500C5, 0x0000000B, 0x00004981,\n    0x0000602A, 0x000059B5, 0x000500C5, 0x0000000B, 0x00003E2F, 0x00001FCE,\n    0x00004981, 0x000400C8, 0x0000000B, 0x00002110, 0x00003E2F, 0x000500C7,\n    0x0000000B, 0x00002767, 0x000040EA, 0x00002110, 0x00050082, 0x0000000B,\n    0x00003FB1, 0x00000908, 0x00002767, 0x000500C7, 0x0000000B, 0x0000440C,\n    0x00003FB1, 0x00002110, 0x000500C7, 0x0000000B, 0x00004264, 0x0000440C,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00003572, 0x00003281, 0x00004264,\n    0x000500C7, 0x0000000B, 0x000055E1, 0x00002767, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00004FB2, 0x00003331, 0x000055E1, 0x00050080, 0x0000000B,\n    0x00004D97, 0x00003572, 0x00004FB2, 0x00050086, 0x0000000B, 0x000032DD,\n    0x00004D97, 0x00000A19, 0x000500C2, 0x0000000B, 0x00005A03, 0x0000440C,\n    0x00000A13, 0x000500C7, 0x0000000B, 0x00002245, 0x00005A03, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00003AC1, 0x00003281, 0x00002245, 0x000500C2,\n    0x0000000B, 0x00003401, 0x00002767, 0x00000A13, 0x000500C7, 0x0000000B,\n    0x0000619B, 0x00003401, 0x00000A1F, 0x00050084, 0x0000000B, 0x00006288,\n    0x00003331, 0x0000619B, 0x00050080, 0x0000000B, 0x00004DBC, 0x00003AC1,\n    0x00006288, 0x00050086, 0x0000000B, 0x0000315C, 0x00004DBC, 0x00000A19,\n    0x000500C4, 0x0000000B, 0x00001FEA, 0x0000315C, 0x00000A3A, 0x000500C5,\n    0x0000000B, 0x00001D8B, 0x000032DD, 0x00001FEA, 0x000500C2, 0x0000000B,\n    0x000055B9, 0x0000440C, 0x00000A1C, 0x000500C7, 0x0000000B, 0x000044C3,\n    0x000055B9, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AC2, 0x00003281,\n    0x000044C3, 0x000500C2, 0x0000000B, 0x00003402, 0x00002767, 0x00000A1C,\n    0x000500C7, 0x0000000B, 0x0000619C, 0x00003402, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00006289, 0x00003331, 0x0000619C, 0x00050080, 0x0000000B,\n    0x00004D98, 0x00003AC2, 0x00006289, 0x00050086, 0x0000000B, 0x000032DE,\n    0x00004D98, 0x00000A19, 0x000500C2, 0x0000000B, 0x00005A04, 0x0000440C,\n    0x00000A25, 0x000500C7, 0x0000000B, 0x00002246, 0x00005A04, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00003AC3, 0x00003281, 0x00002246, 0x000500C2,\n    0x0000000B, 0x00003403, 0x00002767, 0x00000A25, 0x000500C7, 0x0000000B,\n    0x0000619D, 0x00003403, 0x00000A1F, 0x00050084, 0x0000000B, 0x0000628A,\n    0x00003331, 0x0000619D, 0x00050080, 0x0000000B, 0x00004DBD, 0x00003AC3,\n    0x0000628A, 0x00050086, 0x0000000B, 0x0000315D, 0x00004DBD, 0x00000A19,\n    0x000500C4, 0x0000000B, 0x000061F3, 0x0000315D, 0x00000A3A, 0x000500C5,\n    0x0000000B, 0x00002011, 0x000032DE, 0x000061F3, 0x00050050, 0x00000011,\n    0x0000278B, 0x00001D8B, 0x00002011, 0x000500C7, 0x0000000B, 0x00005ED1,\n    0x000040EA, 0x00003E2F, 0x000500C7, 0x0000000B, 0x00003FFD, 0x00005ED1,\n    0x00000A0D, 0x000500C7, 0x0000000B, 0x00004C6C, 0x00005ED1, 0x00000A22,\n    0x000500C4, 0x0000000B, 0x0000610A, 0x00004C6C, 0x00000A31, 0x000500C5,\n    0x0000000B, 0x0000465A, 0x00003FFD, 0x0000610A, 0x000500C2, 0x0000000B,\n    0x00005AAD, 0x00005ED1, 0x00000A1C, 0x000500C7, 0x0000000B, 0x0000621B,\n    0x00005AAD, 0x00000A0D, 0x000500C7, 0x0000000B, 0x00004948, 0x00005ED1,\n    0x00000447, 0x000500C4, 0x0000000B, 0x00005898, 0x00004948, 0x00000A1F,\n    0x000500C5, 0x0000000B, 0x000043EC, 0x0000621B, 0x00005898, 0x00050050,\n    0x00000011, 0x00004F8C, 0x0000465A, 0x000043EC, 0x00050084, 0x00000011,\n    0x0000511C, 0x00004F8C, 0x00000474, 0x00050080, 0x00000011, 0x00005D33,\n    0x0000278B, 0x0000511C, 0x000200F9, 0x00004B82, 0x000200F8, 0x000038C3,\n    0x000400C8, 0x0000000B, 0x000029D9, 0x000040EA, 0x000500C7, 0x0000000B,\n    0x00003C03, 0x000029D9, 0x00000A1F, 0x00050084, 0x0000000B, 0x00004535,\n    0x00003281, 0x00003C03, 0x000500C7, 0x0000000B, 0x000055E2, 0x000040EA,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00004FB7, 0x00003331, 0x000055E2,\n    0x00050080, 0x0000000B, 0x00004D99, 0x00004535, 0x00004FB7, 0x00050086,\n    0x0000000B, 0x000032DF, 0x00004D99, 0x00000A1F, 0x000500C2, 0x0000000B,\n    0x00005A05, 0x000029D9, 0x00000A13, 0x000500C7, 0x0000000B, 0x00002247,\n    0x00005A05, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AC4, 0x00003281,\n    0x00002247, 0x000500C2, 0x0000000B, 0x00003404, 0x000040EA, 0x00000A13,\n    0x000500C7, 0x0000000B, 0x0000619E, 0x00003404, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x0000628B, 0x00003331, 0x0000619E, 0x00050080, 0x0000000B,\n    0x00004DBE, 0x00003AC4, 0x0000628B, 0x00050086, 0x0000000B, 0x0000315E,\n    0x00004DBE, 0x00000A1F, 0x000500C4, 0x0000000B, 0x00001FEB, 0x0000315E,\n    0x00000A3A, 0x000500C5, 0x0000000B, 0x00001D8C, 0x000032DF, 0x00001FEB,\n    0x000500C2, 0x0000000B, 0x000055BA, 0x000029D9, 0x00000A1C, 0x000500C7,\n    0x0000000B, 0x000044C4, 0x000055BA, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00003AC5, 0x00003281, 0x000044C4, 0x000500C2, 0x0000000B, 0x00003405,\n    0x000040EA, 0x00000A1C, 0x000500C7, 0x0000000B, 0x0000619F, 0x00003405,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x0000628C, 0x00003331, 0x0000619F,\n    0x00050080, 0x0000000B, 0x00004D9A, 0x00003AC5, 0x0000628C, 0x00050086,\n    0x0000000B, 0x000032E0, 0x00004D9A, 0x00000A1F, 0x000500C2, 0x0000000B,\n    0x00005A06, 0x000029D9, 0x00000A25, 0x000500C7, 0x0000000B, 0x00002248,\n    0x00005A06, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AC6, 0x00003281,\n    0x00002248, 0x000500C2, 0x0000000B, 0x00003406, 0x000040EA, 0x00000A25,\n    0x000500C7, 0x0000000B, 0x000061A0, 0x00003406, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x0000628D, 0x00003331, 0x000061A0, 0x00050080, 0x0000000B,\n    0x00004DBF, 0x00003AC6, 0x0000628D, 0x00050086, 0x0000000B, 0x0000315F,\n    0x00004DBF, 0x00000A1F, 0x000500C4, 0x0000000B, 0x000061F4, 0x0000315F,\n    0x00000A3A, 0x000500C5, 0x0000000B, 0x000023C7, 0x000032E0, 0x000061F4,\n    0x00050050, 0x00000011, 0x000053E2, 0x00001D8C, 0x000023C7, 0x000200F9,\n    0x00004B82, 0x000200F8, 0x00004B82, 0x000700F5, 0x00000011, 0x00004936,\n    0x00005D33, 0x00002999, 0x000053E2, 0x000038C3, 0x000500C4, 0x00000011,\n    0x00001ECD, 0x00004936, 0x000007B7, 0x000500C5, 0x00000011, 0x00002D4B,\n    0x00005022, 0x00001ECD, 0x00050051, 0x0000000B, 0x0000355C, 0x00002EF7,\n    0x00000002, 0x000300F7, 0x000042F8, 0x00000000, 0x000400FA, 0x00004E85,\n    0x0000299A, 0x000038C4, 0x000200F8, 0x0000299A, 0x000500C7, 0x0000000B,\n    0x00004503, 0x0000355C, 0x0000003A, 0x000500C7, 0x0000000B, 0x00005D96,\n    0x0000355C, 0x0000022D, 0x000500C2, 0x0000000B, 0x0000555E, 0x00005D96,\n    0x00000A0D, 0x000500C7, 0x0000000B, 0x00001FCF, 0x00004503, 0x0000555E,\n    0x000500C4, 0x0000000B, 0x0000602B, 0x00001FCF, 0x00000A0D, 0x000500C2,\n    0x0000000B, 0x000059B6, 0x00001FCF, 0x00000A0D, 0x000500C5, 0x0000000B,\n    0x00004982, 0x0000602B, 0x000059B6, 0x000500C5, 0x0000000B, 0x00003E30,\n    0x00001FCF, 0x00004982, 0x000400C8, 0x0000000B, 0x00002111, 0x00003E30,\n    0x000500C7, 0x0000000B, 0x00002768, 0x0000355C, 0x00002111, 0x00050082,\n    0x0000000B, 0x00003FB2, 0x00000908, 0x00002768, 0x000500C7, 0x0000000B,\n    0x0000440D, 0x00003FB2, 0x00002111, 0x000500C7, 0x0000000B, 0x00004265,\n    0x0000440D, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003573, 0x00003282,\n    0x00004265, 0x000500C7, 0x0000000B, 0x000055E3, 0x00002768, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00004FB8, 0x00003332, 0x000055E3, 0x00050080,\n    0x0000000B, 0x00004D9B, 0x00003573, 0x00004FB8, 0x00050086, 0x0000000B,\n    0x000032E1, 0x00004D9B, 0x00000A19, 0x000500C2, 0x0000000B, 0x00005A07,\n    0x0000440D, 0x00000A13, 0x000500C7, 0x0000000B, 0x00002249, 0x00005A07,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00003AC7, 0x00003282, 0x00002249,\n    0x000500C2, 0x0000000B, 0x00003407, 0x00002768, 0x00000A13, 0x000500C7,\n    0x0000000B, 0x000061A1, 0x00003407, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x0000628E, 0x00003332, 0x000061A1, 0x00050080, 0x0000000B, 0x00004DC0,\n    0x00003AC7, 0x0000628E, 0x00050086, 0x0000000B, 0x00003160, 0x00004DC0,\n    0x00000A19, 0x000500C4, 0x0000000B, 0x00001FEC, 0x00003160, 0x00000A3A,\n    0x000500C5, 0x0000000B, 0x00001D8D, 0x000032E1, 0x00001FEC, 0x000500C2,\n    0x0000000B, 0x000055BB, 0x0000440D, 0x00000A1C, 0x000500C7, 0x0000000B,\n    0x000044C5, 0x000055BB, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AC8,\n    0x00003282, 0x000044C5, 0x000500C2, 0x0000000B, 0x00003408, 0x00002768,\n    0x00000A1C, 0x000500C7, 0x0000000B, 0x000061A2, 0x00003408, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x0000628F, 0x00003332, 0x000061A2, 0x00050080,\n    0x0000000B, 0x00004D9C, 0x00003AC8, 0x0000628F, 0x00050086, 0x0000000B,\n    0x000032E2, 0x00004D9C, 0x00000A19, 0x000500C2, 0x0000000B, 0x00005A08,\n    0x0000440D, 0x00000A25, 0x000500C7, 0x0000000B, 0x0000224A, 0x00005A08,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00003AC9, 0x00003282, 0x0000224A,\n    0x000500C2, 0x0000000B, 0x00003409, 0x00002768, 0x00000A25, 0x000500C7,\n    0x0000000B, 0x000061A3, 0x00003409, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00006290, 0x00003332, 0x000061A3, 0x00050080, 0x0000000B, 0x00004DC1,\n    0x00003AC9, 0x00006290, 0x00050086, 0x0000000B, 0x00003161, 0x00004DC1,\n    0x00000A19, 0x000500C4, 0x0000000B, 0x000061F5, 0x00003161, 0x00000A3A,\n    0x000500C5, 0x0000000B, 0x00002012, 0x000032E2, 0x000061F5, 0x00050050,\n    0x00000011, 0x0000278C, 0x00001D8D, 0x00002012, 0x000500C7, 0x0000000B,\n    0x00005ED2, 0x0000355C, 0x00003E30, 0x000500C7, 0x0000000B, 0x00003FFE,\n    0x00005ED2, 0x00000A0D, 0x000500C7, 0x0000000B, 0x00004C6D, 0x00005ED2,\n    0x00000A22, 0x000500C4, 0x0000000B, 0x0000610B, 0x00004C6D, 0x00000A31,\n    0x000500C5, 0x0000000B, 0x0000465B, 0x00003FFE, 0x0000610B, 0x000500C2,\n    0x0000000B, 0x00005AAE, 0x00005ED2, 0x00000A1C, 0x000500C7, 0x0000000B,\n    0x0000621C, 0x00005AAE, 0x00000A0D, 0x000500C7, 0x0000000B, 0x00004949,\n    0x00005ED2, 0x00000447, 0x000500C4, 0x0000000B, 0x00005899, 0x00004949,\n    0x00000A1F, 0x000500C5, 0x0000000B, 0x000043ED, 0x0000621C, 0x00005899,\n    0x00050050, 0x00000011, 0x00004F8D, 0x0000465B, 0x000043ED, 0x00050084,\n    0x00000011, 0x0000511D, 0x00004F8D, 0x00000474, 0x00050080, 0x00000011,\n    0x00005D34, 0x0000278C, 0x0000511D, 0x000200F9, 0x000042F8, 0x000200F8,\n    0x000038C4, 0x000400C8, 0x0000000B, 0x000029DA, 0x0000355C, 0x000500C7,\n    0x0000000B, 0x00003C04, 0x000029DA, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00004536, 0x00003282, 0x00003C04, 0x000500C7, 0x0000000B, 0x000055E4,\n    0x0000355C, 0x00000A1F, 0x00050084, 0x0000000B, 0x00004FB9, 0x00003332,\n    0x000055E4, 0x00050080, 0x0000000B, 0x00004D9D, 0x00004536, 0x00004FB9,\n    0x00050086, 0x0000000B, 0x000032E3, 0x00004D9D, 0x00000A1F, 0x000500C2,\n    0x0000000B, 0x00005A09, 0x000029DA, 0x00000A13, 0x000500C7, 0x0000000B,\n    0x0000224B, 0x00005A09, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003ACA,\n    0x00003282, 0x0000224B, 0x000500C2, 0x0000000B, 0x0000340A, 0x0000355C,\n    0x00000A13, 0x000500C7, 0x0000000B, 0x000061A4, 0x0000340A, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00006291, 0x00003332, 0x000061A4, 0x00050080,\n    0x0000000B, 0x00004DC2, 0x00003ACA, 0x00006291, 0x00050086, 0x0000000B,\n    0x00003162, 0x00004DC2, 0x00000A1F, 0x000500C4, 0x0000000B, 0x00001FED,\n    0x00003162, 0x00000A3A, 0x000500C5, 0x0000000B, 0x00001D8E, 0x000032E3,\n    0x00001FED, 0x000500C2, 0x0000000B, 0x000055BC, 0x000029DA, 0x00000A1C,\n    0x000500C7, 0x0000000B, 0x000044C6, 0x000055BC, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00003ACB, 0x00003282, 0x000044C6, 0x000500C2, 0x0000000B,\n    0x0000340B, 0x0000355C, 0x00000A1C, 0x000500C7, 0x0000000B, 0x000061A5,\n    0x0000340B, 0x00000A1F, 0x00050084, 0x0000000B, 0x00006292, 0x00003332,\n    0x000061A5, 0x00050080, 0x0000000B, 0x00004D9E, 0x00003ACB, 0x00006292,\n    0x00050086, 0x0000000B, 0x000032E4, 0x00004D9E, 0x00000A1F, 0x000500C2,\n    0x0000000B, 0x00005A0A, 0x000029DA, 0x00000A25, 0x000500C7, 0x0000000B,\n    0x0000224C, 0x00005A0A, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003ACC,\n    0x00003282, 0x0000224C, 0x000500C2, 0x0000000B, 0x0000340C, 0x0000355C,\n    0x00000A25, 0x000500C7, 0x0000000B, 0x000061A6, 0x0000340C, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00006293, 0x00003332, 0x000061A6, 0x00050080,\n    0x0000000B, 0x00004DC3, 0x00003ACC, 0x00006293, 0x00050086, 0x0000000B,\n    0x00003163, 0x00004DC3, 0x00000A1F, 0x000500C4, 0x0000000B, 0x000061F6,\n    0x00003163, 0x00000A3A, 0x000500C5, 0x0000000B, 0x000023C8, 0x000032E4,\n    0x000061F6, 0x00050050, 0x00000011, 0x000053E3, 0x00001D8E, 0x000023C8,\n    0x000200F9, 0x000042F8, 0x000200F8, 0x000042F8, 0x000700F5, 0x00000011,\n    0x00005023, 0x00005D34, 0x0000299A, 0x000053E3, 0x000038C4, 0x00050051,\n    0x0000000B, 0x000040EB, 0x00002EF7, 0x00000003, 0x000300F7, 0x00004B83,\n    0x00000000, 0x000400FA, 0x00004E86, 0x0000299B, 0x000038C5, 0x000200F8,\n    0x0000299B, 0x000500C7, 0x0000000B, 0x00004504, 0x000040EB, 0x0000003A,\n    0x000500C7, 0x0000000B, 0x00005D97, 0x000040EB, 0x0000022D, 0x000500C2,\n    0x0000000B, 0x0000555F, 0x00005D97, 0x00000A0D, 0x000500C7, 0x0000000B,\n    0x00001FD0, 0x00004504, 0x0000555F, 0x000500C4, 0x0000000B, 0x0000602C,\n    0x00001FD0, 0x00000A0D, 0x000500C2, 0x0000000B, 0x000059B7, 0x00001FD0,\n    0x00000A0D, 0x000500C5, 0x0000000B, 0x00004983, 0x0000602C, 0x000059B7,\n    0x000500C5, 0x0000000B, 0x00003E31, 0x00001FD0, 0x00004983, 0x000400C8,\n    0x0000000B, 0x00002112, 0x00003E31, 0x000500C7, 0x0000000B, 0x00002769,\n    0x000040EB, 0x00002112, 0x00050082, 0x0000000B, 0x00003FB3, 0x00000908,\n    0x00002769, 0x000500C7, 0x0000000B, 0x0000440E, 0x00003FB3, 0x00002112,\n    0x000500C7, 0x0000000B, 0x00004266, 0x0000440E, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00003574, 0x00003283, 0x00004266, 0x000500C7, 0x0000000B,\n    0x000055E5, 0x00002769, 0x00000A1F, 0x00050084, 0x0000000B, 0x00004FBA,\n    0x00003333, 0x000055E5, 0x00050080, 0x0000000B, 0x00004D9F, 0x00003574,\n    0x00004FBA, 0x00050086, 0x0000000B, 0x000032E5, 0x00004D9F, 0x00000A19,\n    0x000500C2, 0x0000000B, 0x00005A0B, 0x0000440E, 0x00000A13, 0x000500C7,\n    0x0000000B, 0x0000224D, 0x00005A0B, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00003ACD, 0x00003283, 0x0000224D, 0x000500C2, 0x0000000B, 0x0000340D,\n    0x00002769, 0x00000A13, 0x000500C7, 0x0000000B, 0x000061A7, 0x0000340D,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00006294, 0x00003333, 0x000061A7,\n    0x00050080, 0x0000000B, 0x00004DC4, 0x00003ACD, 0x00006294, 0x00050086,\n    0x0000000B, 0x00003164, 0x00004DC4, 0x00000A19, 0x000500C4, 0x0000000B,\n    0x00001FEE, 0x00003164, 0x00000A3A, 0x000500C5, 0x0000000B, 0x00001D8F,\n    0x000032E5, 0x00001FEE, 0x000500C2, 0x0000000B, 0x000055BD, 0x0000440E,\n    0x00000A1C, 0x000500C7, 0x0000000B, 0x000044C7, 0x000055BD, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00003ACE, 0x00003283, 0x000044C7, 0x000500C2,\n    0x0000000B, 0x0000340E, 0x00002769, 0x00000A1C, 0x000500C7, 0x0000000B,\n    0x000061A8, 0x0000340E, 0x00000A1F, 0x00050084, 0x0000000B, 0x00006295,\n    0x00003333, 0x000061A8, 0x00050080, 0x0000000B, 0x00004DA0, 0x00003ACE,\n    0x00006295, 0x00050086, 0x0000000B, 0x000032E6, 0x00004DA0, 0x00000A19,\n    0x000500C2, 0x0000000B, 0x00005A0C, 0x0000440E, 0x00000A25, 0x000500C7,\n    0x0000000B, 0x0000224E, 0x00005A0C, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00003ACF, 0x00003283, 0x0000224E, 0x000500C2, 0x0000000B, 0x0000340F,\n    0x00002769, 0x00000A25, 0x000500C7, 0x0000000B, 0x000061A9, 0x0000340F,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00006296, 0x00003333, 0x000061A9,\n    0x00050080, 0x0000000B, 0x00004DC5, 0x00003ACF, 0x00006296, 0x00050086,\n    0x0000000B, 0x00003165, 0x00004DC5, 0x00000A19, 0x000500C4, 0x0000000B,\n    0x000061F7, 0x00003165, 0x00000A3A, 0x000500C5, 0x0000000B, 0x00002013,\n    0x000032E6, 0x000061F7, 0x00050050, 0x00000011, 0x0000278D, 0x00001D8F,\n    0x00002013, 0x000500C7, 0x0000000B, 0x00005ED3, 0x000040EB, 0x00003E31,\n    0x000500C7, 0x0000000B, 0x00003FFF, 0x00005ED3, 0x00000A0D, 0x000500C7,\n    0x0000000B, 0x00004C6E, 0x00005ED3, 0x00000A22, 0x000500C4, 0x0000000B,\n    0x0000610C, 0x00004C6E, 0x00000A31, 0x000500C5, 0x0000000B, 0x0000465C,\n    0x00003FFF, 0x0000610C, 0x000500C2, 0x0000000B, 0x00005AAF, 0x00005ED3,\n    0x00000A1C, 0x000500C7, 0x0000000B, 0x0000621D, 0x00005AAF, 0x00000A0D,\n    0x000500C7, 0x0000000B, 0x0000494A, 0x00005ED3, 0x00000447, 0x000500C4,\n    0x0000000B, 0x0000589A, 0x0000494A, 0x00000A1F, 0x000500C5, 0x0000000B,\n    0x000043EE, 0x0000621D, 0x0000589A, 0x00050050, 0x00000011, 0x00004F8E,\n    0x0000465C, 0x000043EE, 0x00050084, 0x00000011, 0x0000511F, 0x00004F8E,\n    0x00000474, 0x00050080, 0x00000011, 0x00005D35, 0x0000278D, 0x0000511F,\n    0x000200F9, 0x00004B83, 0x000200F8, 0x000038C5, 0x000400C8, 0x0000000B,\n    0x000029DB, 0x000040EB, 0x000500C7, 0x0000000B, 0x00003C05, 0x000029DB,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00004537, 0x00003283, 0x00003C05,\n    0x000500C7, 0x0000000B, 0x000055E6, 0x000040EB, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00004FBB, 0x00003333, 0x000055E6, 0x00050080, 0x0000000B,\n    0x00004DA1, 0x00004537, 0x00004FBB, 0x00050086, 0x0000000B, 0x000032E7,\n    0x00004DA1, 0x00000A1F, 0x000500C2, 0x0000000B, 0x00005A0D, 0x000029DB,\n    0x00000A13, 0x000500C7, 0x0000000B, 0x0000224F, 0x00005A0D, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00003AD0, 0x00003283, 0x0000224F, 0x000500C2,\n    0x0000000B, 0x00003410, 0x000040EB, 0x00000A13, 0x000500C7, 0x0000000B,\n    0x000061AA, 0x00003410, 0x00000A1F, 0x00050084, 0x0000000B, 0x00006297,\n    0x00003333, 0x000061AA, 0x00050080, 0x0000000B, 0x00004DC6, 0x00003AD0,\n    0x00006297, 0x00050086, 0x0000000B, 0x00003166, 0x00004DC6, 0x00000A1F,\n    0x000500C4, 0x0000000B, 0x00001FEF, 0x00003166, 0x00000A3A, 0x000500C5,\n    0x0000000B, 0x00001D90, 0x000032E7, 0x00001FEF, 0x000500C2, 0x0000000B,\n    0x000055BE, 0x000029DB, 0x00000A1C, 0x000500C7, 0x0000000B, 0x000044C8,\n    0x000055BE, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AD1, 0x00003283,\n    0x000044C8, 0x000500C2, 0x0000000B, 0x00003411, 0x000040EB, 0x00000A1C,\n    0x000500C7, 0x0000000B, 0x000061AB, 0x00003411, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00006298, 0x00003333, 0x000061AB, 0x00050080, 0x0000000B,\n    0x00004DA2, 0x00003AD1, 0x00006298, 0x00050086, 0x0000000B, 0x000032E8,\n    0x00004DA2, 0x00000A1F, 0x000500C2, 0x0000000B, 0x00005A11, 0x000029DB,\n    0x00000A25, 0x000500C7, 0x0000000B, 0x00002250, 0x00005A11, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00003AD2, 0x00003283, 0x00002250, 0x000500C2,\n    0x0000000B, 0x00003412, 0x000040EB, 0x00000A25, 0x000500C7, 0x0000000B,\n    0x000061AC, 0x00003412, 0x00000A1F, 0x00050084, 0x0000000B, 0x00006299,\n    0x00003333, 0x000061AC, 0x00050080, 0x0000000B, 0x00004DC7, 0x00003AD2,\n    0x00006299, 0x00050086, 0x0000000B, 0x00003167, 0x00004DC7, 0x00000A1F,\n    0x000500C4, 0x0000000B, 0x000061F8, 0x00003167, 0x00000A3A, 0x000500C5,\n    0x0000000B, 0x000023C9, 0x000032E8, 0x000061F8, 0x00050050, 0x00000011,\n    0x000053E4, 0x00001D90, 0x000023C9, 0x000200F9, 0x00004B83, 0x000200F8,\n    0x00004B83, 0x000700F5, 0x00000011, 0x00004937, 0x00005D35, 0x0000299B,\n    0x000053E4, 0x000038C5, 0x000500C4, 0x00000011, 0x00001ECE, 0x00004937,\n    0x000007B7, 0x000500C5, 0x00000011, 0x000020FA, 0x00005023, 0x00001ECE,\n    0x00050051, 0x0000000B, 0x00004E82, 0x00002D4B, 0x00000000, 0x00050051,\n    0x0000000B, 0x00005CB3, 0x00002D4B, 0x00000001, 0x00050051, 0x0000000B,\n    0x00001DDC, 0x000020FA, 0x00000000, 0x00050051, 0x0000000B, 0x00001D6A,\n    0x000020FA, 0x00000001, 0x00070050, 0x00000017, 0x00004755, 0x00004E82,\n    0x00005CB3, 0x00001DDC, 0x00001D6A, 0x00060041, 0x00000294, 0x000025D0,\n    0x0000140E, 0x00000A0B, 0x000059FE, 0x0003003E, 0x000025D0, 0x00004755,\n    0x00050080, 0x0000000B, 0x000039F8, 0x00003220, 0x00000A11, 0x000500B0,\n    0x00000009, 0x00002E0B, 0x000039F8, 0x000019C2, 0x000300F7, 0x00001C26,\n    0x00000002, 0x000400FA, 0x00002E0B, 0x0000592D, 0x00001C26, 0x000200F8,\n    0x0000592D, 0x00050080, 0x0000000B, 0x00003416, 0x00003C79, 0x0000578C,\n    0x000500C2, 0x00000017, 0x00003D27, 0x00004137, 0x0000013D, 0x00050051,\n    0x0000000B, 0x00005D1B, 0x00003D27, 0x00000000, 0x000300F7, 0x00002DCB,\n    0x00000000, 0x000400FA, 0x00004E83, 0x0000299C, 0x000055A9, 0x000200F8,\n    0x0000299C, 0x000500C7, 0x0000000B, 0x00004505, 0x00005D1B, 0x000009C8,\n    0x000500C7, 0x0000000B, 0x00005D98, 0x00005D1B, 0x00000986, 0x000500C2,\n    0x0000000B, 0x00005560, 0x00005D98, 0x00000A0D, 0x000500C7, 0x0000000B,\n    0x00001FD1, 0x00004505, 0x00005560, 0x000500C4, 0x0000000B, 0x0000602D,\n    0x00001FD1, 0x00000A0D, 0x000500C2, 0x0000000B, 0x000059B8, 0x00001FD1,\n    0x00000A0D, 0x000500C5, 0x0000000B, 0x0000496D, 0x0000602D, 0x000059B8,\n    0x000500C5, 0x0000000B, 0x00003EB5, 0x00001FD1, 0x0000496D, 0x000500C7,\n    0x0000000B, 0x00004789, 0x00005D1B, 0x000009E9, 0x000500C5, 0x0000000B,\n    0x00003961, 0x00004789, 0x00000944, 0x000500C7, 0x0000000B, 0x00004FBC,\n    0x00003961, 0x00003EB5, 0x000500C2, 0x0000000B, 0x0000503F, 0x00004505,\n    0x00000A0D, 0x000500C5, 0x0000000B, 0x0000615E, 0x00004789, 0x0000503F,\n    0x000500C2, 0x0000000B, 0x000055A8, 0x00005D98, 0x00000A10, 0x000500C5,\n    0x0000000B, 0x0000589B, 0x0000615E, 0x000055A8, 0x000500C6, 0x0000000B,\n    0x00001E31, 0x0000589B, 0x000009E9, 0x000400C8, 0x0000000B, 0x0000254D,\n    0x0000503F, 0x000500C7, 0x0000000B, 0x00003925, 0x00004789, 0x0000254D,\n    0x000400C8, 0x0000000B, 0x000020F1, 0x000055A8, 0x000500C7, 0x0000000B,\n    0x00002C97, 0x00003925, 0x000020F1, 0x000500C5, 0x0000000B, 0x00001A97,\n    0x00005D1B, 0x00001E31, 0x00050082, 0x0000000B, 0x00004C3D, 0x00001A97,\n    0x000009E9, 0x000500C5, 0x0000000B, 0x00003A21, 0x00004C3D, 0x00002C97,\n    0x000500C4, 0x0000000B, 0x00004738, 0x00002C97, 0x00000A10, 0x000500C5,\n    0x0000000B, 0x00003C06, 0x00003A21, 0x00004738, 0x000400C8, 0x0000000B,\n    0x00002F7E, 0x00003EB5, 0x000500C7, 0x0000000B, 0x00004854, 0x00003C06,\n    0x00002F7E, 0x000500C5, 0x0000000B, 0x00001870, 0x00004854, 0x00004FBC,\n    0x000200F9, 0x00002DCB, 0x000200F8, 0x000055A9, 0x000500C7, 0x0000000B,\n    0x00004E73, 0x00005D1B, 0x000009E9, 0x000500C7, 0x0000000B, 0x00005D6A,\n    0x00005D1B, 0x000009C8, 0x000500C2, 0x0000000B, 0x000056EB, 0x00005D6A,\n    0x00000A0D, 0x000500C5, 0x0000000B, 0x00005DC4, 0x00004E73, 0x000056EB,\n    0x000500C7, 0x0000000B, 0x00004C93, 0x00005D1B, 0x00000986, 0x000500C2,\n    0x0000000B, 0x0000508B, 0x00004C93, 0x00000A10, 0x000500C5, 0x0000000B,\n    0x00005EE3, 0x00005DC4, 0x0000508B, 0x000500C6, 0x0000000B, 0x00001E32,\n    0x00005EE3, 0x000009E9, 0x000400C8, 0x0000000B, 0x0000254E, 0x000056EB,\n    0x000500C7, 0x0000000B, 0x00003926, 0x00004E73, 0x0000254E, 0x000400C8,\n    0x0000000B, 0x000020F2, 0x0000508B, 0x000500C7, 0x0000000B, 0x00002C98,\n    0x00003926, 0x000020F2, 0x000500C5, 0x0000000B, 0x00001A98, 0x00005D1B,\n    0x00001E32, 0x00050082, 0x0000000B, 0x00004C3E, 0x00001A98, 0x000009E9,\n    0x000500C5, 0x0000000B, 0x00003A22, 0x00004C3E, 0x00002C98, 0x000500C4,\n    0x0000000B, 0x000046EC, 0x00002C98, 0x00000A0D, 0x000500C5, 0x0000000B,\n    0x00003E8C, 0x00003A22, 0x000046EC, 0x000500C4, 0x0000000B, 0x00001FBA,\n    0x00002C98, 0x00000A10, 0x000500C5, 0x0000000B, 0x00001E84, 0x00003E8C,\n    0x00001FBA, 0x000200F9, 0x00002DCB, 0x000200F8, 0x00002DCB, 0x000700F5,\n    0x0000000B, 0x00005024, 0x00001870, 0x0000299C, 0x00001E84, 0x000055A9,\n    0x00050051, 0x0000000B, 0x000040EC, 0x00003D27, 0x00000001, 0x000300F7,\n    0x00002DCC, 0x00000000, 0x000400FA, 0x00004E84, 0x0000299D, 0x000055AB,\n    0x000200F8, 0x0000299D, 0x000500C7, 0x0000000B, 0x00004506, 0x000040EC,\n    0x000009C8, 0x000500C7, 0x0000000B, 0x00005D99, 0x000040EC, 0x00000986,\n    0x000500C2, 0x0000000B, 0x00005561, 0x00005D99, 0x00000A0D, 0x000500C7,\n    0x0000000B, 0x00001FD2, 0x00004506, 0x00005561, 0x000500C4, 0x0000000B,\n    0x0000602E, 0x00001FD2, 0x00000A0D, 0x000500C2, 0x0000000B, 0x000059B9,\n    0x00001FD2, 0x00000A0D, 0x000500C5, 0x0000000B, 0x0000496E, 0x0000602E,\n    0x000059B9, 0x000500C5, 0x0000000B, 0x00003EB6, 0x00001FD2, 0x0000496E,\n    0x000500C7, 0x0000000B, 0x0000478A, 0x000040EC, 0x000009E9, 0x000500C5,\n    0x0000000B, 0x00003962, 0x0000478A, 0x00000944, 0x000500C7, 0x0000000B,\n    0x00004FBD, 0x00003962, 0x00003EB6, 0x000500C2, 0x0000000B, 0x00005040,\n    0x00004506, 0x00000A0D, 0x000500C5, 0x0000000B, 0x0000615F, 0x0000478A,\n    0x00005040, 0x000500C2, 0x0000000B, 0x000055AA, 0x00005D99, 0x00000A10,\n    0x000500C5, 0x0000000B, 0x0000589C, 0x0000615F, 0x000055AA, 0x000500C6,\n    0x0000000B, 0x00001E33, 0x0000589C, 0x000009E9, 0x000400C8, 0x0000000B,\n    0x0000254F, 0x00005040, 0x000500C7, 0x0000000B, 0x00003927, 0x0000478A,\n    0x0000254F, 0x000400C8, 0x0000000B, 0x000020F3, 0x000055AA, 0x000500C7,\n    0x0000000B, 0x00002C99, 0x00003927, 0x000020F3, 0x000500C5, 0x0000000B,\n    0x00001A99, 0x000040EC, 0x00001E33, 0x00050082, 0x0000000B, 0x00004C3F,\n    0x00001A99, 0x000009E9, 0x000500C5, 0x0000000B, 0x00003A23, 0x00004C3F,\n    0x00002C99, 0x000500C4, 0x0000000B, 0x00004739, 0x00002C99, 0x00000A10,\n    0x000500C5, 0x0000000B, 0x00003C07, 0x00003A23, 0x00004739, 0x000400C8,\n    0x0000000B, 0x00002F7F, 0x00003EB6, 0x000500C7, 0x0000000B, 0x00004855,\n    0x00003C07, 0x00002F7F, 0x000500C5, 0x0000000B, 0x00001871, 0x00004855,\n    0x00004FBD, 0x000200F9, 0x00002DCC, 0x000200F8, 0x000055AB, 0x000500C7,\n    0x0000000B, 0x00004E74, 0x000040EC, 0x000009E9, 0x000500C7, 0x0000000B,\n    0x00005D6B, 0x000040EC, 0x000009C8, 0x000500C2, 0x0000000B, 0x000056EC,\n    0x00005D6B, 0x00000A0D, 0x000500C5, 0x0000000B, 0x00005DC5, 0x00004E74,\n    0x000056EC, 0x000500C7, 0x0000000B, 0x00004C94, 0x000040EC, 0x00000986,\n    0x000500C2, 0x0000000B, 0x0000508C, 0x00004C94, 0x00000A10, 0x000500C5,\n    0x0000000B, 0x00005EE4, 0x00005DC5, 0x0000508C, 0x000500C6, 0x0000000B,\n    0x00001E34, 0x00005EE4, 0x000009E9, 0x000400C8, 0x0000000B, 0x00002550,\n    0x000056EC, 0x000500C7, 0x0000000B, 0x00003928, 0x00004E74, 0x00002550,\n    0x000400C8, 0x0000000B, 0x000020F4, 0x0000508C, 0x000500C7, 0x0000000B,\n    0x00002C9A, 0x00003928, 0x000020F4, 0x000500C5, 0x0000000B, 0x00001A9A,\n    0x000040EC, 0x00001E34, 0x00050082, 0x0000000B, 0x00004C40, 0x00001A9A,\n    0x000009E9, 0x000500C5, 0x0000000B, 0x00003A24, 0x00004C40, 0x00002C9A,\n    0x000500C4, 0x0000000B, 0x000046ED, 0x00002C9A, 0x00000A0D, 0x000500C5,\n    0x0000000B, 0x00003E8D, 0x00003A24, 0x000046ED, 0x000500C4, 0x0000000B,\n    0x00001FBB, 0x00002C9A, 0x00000A10, 0x000500C5, 0x0000000B, 0x00001E85,\n    0x00003E8D, 0x00001FBB, 0x000200F9, 0x00002DCC, 0x000200F8, 0x00002DCC,\n    0x000700F5, 0x0000000B, 0x00005025, 0x00001871, 0x0000299D, 0x00001E85,\n    0x000055AB, 0x00050051, 0x0000000B, 0x000040ED, 0x00003D27, 0x00000002,\n    0x000300F7, 0x00002DCD, 0x00000000, 0x000400FA, 0x00004E85, 0x0000299E,\n    0x000055AD, 0x000200F8, 0x0000299E, 0x000500C7, 0x0000000B, 0x00004507,\n    0x000040ED, 0x000009C8, 0x000500C7, 0x0000000B, 0x00005D9A, 0x000040ED,\n    0x00000986, 0x000500C2, 0x0000000B, 0x00005562, 0x00005D9A, 0x00000A0D,\n    0x000500C7, 0x0000000B, 0x00001FD3, 0x00004507, 0x00005562, 0x000500C4,\n    0x0000000B, 0x0000602F, 0x00001FD3, 0x00000A0D, 0x000500C2, 0x0000000B,\n    0x000059BA, 0x00001FD3, 0x00000A0D, 0x000500C5, 0x0000000B, 0x0000496F,\n    0x0000602F, 0x000059BA, 0x000500C5, 0x0000000B, 0x00003EB7, 0x00001FD3,\n    0x0000496F, 0x000500C7, 0x0000000B, 0x0000478B, 0x000040ED, 0x000009E9,\n    0x000500C5, 0x0000000B, 0x00003963, 0x0000478B, 0x00000944, 0x000500C7,\n    0x0000000B, 0x00004FBE, 0x00003963, 0x00003EB7, 0x000500C2, 0x0000000B,\n    0x00005041, 0x00004507, 0x00000A0D, 0x000500C5, 0x0000000B, 0x00006160,\n    0x0000478B, 0x00005041, 0x000500C2, 0x0000000B, 0x000055AC, 0x00005D9A,\n    0x00000A10, 0x000500C5, 0x0000000B, 0x0000589D, 0x00006160, 0x000055AC,\n    0x000500C6, 0x0000000B, 0x00001E35, 0x0000589D, 0x000009E9, 0x000400C8,\n    0x0000000B, 0x00002551, 0x00005041, 0x000500C7, 0x0000000B, 0x00003929,\n    0x0000478B, 0x00002551, 0x000400C8, 0x0000000B, 0x000020F5, 0x000055AC,\n    0x000500C7, 0x0000000B, 0x00002C9B, 0x00003929, 0x000020F5, 0x000500C5,\n    0x0000000B, 0x00001A9B, 0x000040ED, 0x00001E35, 0x00050082, 0x0000000B,\n    0x00004C41, 0x00001A9B, 0x000009E9, 0x000500C5, 0x0000000B, 0x00003A25,\n    0x00004C41, 0x00002C9B, 0x000500C4, 0x0000000B, 0x0000473A, 0x00002C9B,\n    0x00000A10, 0x000500C5, 0x0000000B, 0x00003C08, 0x00003A25, 0x0000473A,\n    0x000400C8, 0x0000000B, 0x00002F80, 0x00003EB7, 0x000500C7, 0x0000000B,\n    0x00004856, 0x00003C08, 0x00002F80, 0x000500C5, 0x0000000B, 0x00001872,\n    0x00004856, 0x00004FBE, 0x000200F9, 0x00002DCD, 0x000200F8, 0x000055AD,\n    0x000500C7, 0x0000000B, 0x00004E75, 0x000040ED, 0x000009E9, 0x000500C7,\n    0x0000000B, 0x00005D6C, 0x000040ED, 0x000009C8, 0x000500C2, 0x0000000B,\n    0x000056ED, 0x00005D6C, 0x00000A0D, 0x000500C5, 0x0000000B, 0x00005DC6,\n    0x00004E75, 0x000056ED, 0x000500C7, 0x0000000B, 0x00004C95, 0x000040ED,\n    0x00000986, 0x000500C2, 0x0000000B, 0x0000508D, 0x00004C95, 0x00000A10,\n    0x000500C5, 0x0000000B, 0x00005EE5, 0x00005DC6, 0x0000508D, 0x000500C6,\n    0x0000000B, 0x00001E36, 0x00005EE5, 0x000009E9, 0x000400C8, 0x0000000B,\n    0x00002552, 0x000056ED, 0x000500C7, 0x0000000B, 0x0000392A, 0x00004E75,\n    0x00002552, 0x000400C8, 0x0000000B, 0x000020F6, 0x0000508D, 0x000500C7,\n    0x0000000B, 0x00002C9C, 0x0000392A, 0x000020F6, 0x000500C5, 0x0000000B,\n    0x00001A9C, 0x000040ED, 0x00001E36, 0x00050082, 0x0000000B, 0x00004C42,\n    0x00001A9C, 0x000009E9, 0x000500C5, 0x0000000B, 0x00003A26, 0x00004C42,\n    0x00002C9C, 0x000500C4, 0x0000000B, 0x000046EE, 0x00002C9C, 0x00000A0D,\n    0x000500C5, 0x0000000B, 0x00003E8E, 0x00003A26, 0x000046EE, 0x000500C4,\n    0x0000000B, 0x00001FBC, 0x00002C9C, 0x00000A10, 0x000500C5, 0x0000000B,\n    0x00001E86, 0x00003E8E, 0x00001FBC, 0x000200F9, 0x00002DCD, 0x000200F8,\n    0x00002DCD, 0x000700F5, 0x0000000B, 0x00005026, 0x00001872, 0x0000299E,\n    0x00001E86, 0x000055AD, 0x00050051, 0x0000000B, 0x000040EE, 0x00003D27,\n    0x00000003, 0x000300F7, 0x00002DB6, 0x00000000, 0x000400FA, 0x00004E86,\n    0x0000299F, 0x000055BF, 0x000200F8, 0x0000299F, 0x000500C7, 0x0000000B,\n    0x00004508, 0x000040EE, 0x000009C8, 0x000500C7, 0x0000000B, 0x00005D9B,\n    0x000040EE, 0x00000986, 0x000500C2, 0x0000000B, 0x00005563, 0x00005D9B,\n    0x00000A0D, 0x000500C7, 0x0000000B, 0x00001FD4, 0x00004508, 0x00005563,\n    0x000500C4, 0x0000000B, 0x00006030, 0x00001FD4, 0x00000A0D, 0x000500C2,\n    0x0000000B, 0x000059BB, 0x00001FD4, 0x00000A0D, 0x000500C5, 0x0000000B,\n    0x00004970, 0x00006030, 0x000059BB, 0x000500C5, 0x0000000B, 0x00003EB8,\n    0x00001FD4, 0x00004970, 0x000500C7, 0x0000000B, 0x0000478C, 0x000040EE,\n    0x000009E9, 0x000500C5, 0x0000000B, 0x00003964, 0x0000478C, 0x00000944,\n    0x000500C7, 0x0000000B, 0x00004FBF, 0x00003964, 0x00003EB8, 0x000500C2,\n    0x0000000B, 0x00005042, 0x00004508, 0x00000A0D, 0x000500C5, 0x0000000B,\n    0x00006161, 0x0000478C, 0x00005042, 0x000500C2, 0x0000000B, 0x000055AE,\n    0x00005D9B, 0x00000A10, 0x000500C5, 0x0000000B, 0x0000589E, 0x00006161,\n    0x000055AE, 0x000500C6, 0x0000000B, 0x00001E37, 0x0000589E, 0x000009E9,\n    0x000400C8, 0x0000000B, 0x00002553, 0x00005042, 0x000500C7, 0x0000000B,\n    0x0000392B, 0x0000478C, 0x00002553, 0x000400C8, 0x0000000B, 0x000020F7,\n    0x000055AE, 0x000500C7, 0x0000000B, 0x00002C9D, 0x0000392B, 0x000020F7,\n    0x000500C5, 0x0000000B, 0x00001A9D, 0x000040EE, 0x00001E37, 0x00050082,\n    0x0000000B, 0x00004C43, 0x00001A9D, 0x000009E9, 0x000500C5, 0x0000000B,\n    0x00003A27, 0x00004C43, 0x00002C9D, 0x000500C4, 0x0000000B, 0x0000473B,\n    0x00002C9D, 0x00000A10, 0x000500C5, 0x0000000B, 0x00003C09, 0x00003A27,\n    0x0000473B, 0x000400C8, 0x0000000B, 0x00002F81, 0x00003EB8, 0x000500C7,\n    0x0000000B, 0x00004857, 0x00003C09, 0x00002F81, 0x000500C5, 0x0000000B,\n    0x00001873, 0x00004857, 0x00004FBF, 0x000200F9, 0x00002DB6, 0x000200F8,\n    0x000055BF, 0x000500C7, 0x0000000B, 0x00004E76, 0x000040EE, 0x000009E9,\n    0x000500C7, 0x0000000B, 0x00005D6D, 0x000040EE, 0x000009C8, 0x000500C2,\n    0x0000000B, 0x000056EE, 0x00005D6D, 0x00000A0D, 0x000500C5, 0x0000000B,\n    0x00005DC7, 0x00004E76, 0x000056EE, 0x000500C7, 0x0000000B, 0x00004C96,\n    0x000040EE, 0x00000986, 0x000500C2, 0x0000000B, 0x0000508E, 0x00004C96,\n    0x00000A10, 0x000500C5, 0x0000000B, 0x00005EE6, 0x00005DC7, 0x0000508E,\n    0x000500C6, 0x0000000B, 0x00001E38, 0x00005EE6, 0x000009E9, 0x000400C8,\n    0x0000000B, 0x00002554, 0x000056EE, 0x000500C7, 0x0000000B, 0x0000392C,\n    0x00004E76, 0x00002554, 0x000400C8, 0x0000000B, 0x000020F8, 0x0000508E,\n    0x000500C7, 0x0000000B, 0x00002C9E, 0x0000392C, 0x000020F8, 0x000500C5,\n    0x0000000B, 0x00001A9E, 0x000040EE, 0x00001E38, 0x00050082, 0x0000000B,\n    0x00004C44, 0x00001A9E, 0x000009E9, 0x000500C5, 0x0000000B, 0x00003A28,\n    0x00004C44, 0x00002C9E, 0x000500C4, 0x0000000B, 0x000046EF, 0x00002C9E,\n    0x00000A0D, 0x000500C5, 0x0000000B, 0x00003E8F, 0x00003A28, 0x000046EF,\n    0x000500C4, 0x0000000B, 0x00001FBD, 0x00002C9E, 0x00000A10, 0x000500C5,\n    0x0000000B, 0x00001E87, 0x00003E8F, 0x00001FBD, 0x000200F9, 0x00002DB6,\n    0x000200F8, 0x00002DB6, 0x000700F5, 0x0000000B, 0x00004CE1, 0x00001873,\n    0x0000299F, 0x00001E87, 0x000055BF, 0x00070050, 0x00000017, 0x00003A05,\n    0x00005024, 0x00005025, 0x00005026, 0x00004CE1, 0x000500C2, 0x0000000B,\n    0x00001BC9, 0x00003416, 0x00000A17, 0x000300F7, 0x00004F4B, 0x00000000,\n    0x000400FA, 0x00004E83, 0x000029A0, 0x000038C6, 0x000200F8, 0x000029A0,\n    0x000500C7, 0x0000000B, 0x00004509, 0x00005024, 0x0000003A, 0x000500C7,\n    0x0000000B, 0x00005D9C, 0x00005024, 0x0000022D, 0x000500C2, 0x0000000B,\n    0x00005564, 0x00005D9C, 0x00000A0D, 0x000500C7, 0x0000000B, 0x00001FD5,\n    0x00004509, 0x00005564, 0x000500C4, 0x0000000B, 0x00006031, 0x00001FD5,\n    0x00000A0D, 0x000500C2, 0x0000000B, 0x000059BC, 0x00001FD5, 0x00000A0D,\n    0x000500C5, 0x0000000B, 0x00004984, 0x00006031, 0x000059BC, 0x000500C5,\n    0x0000000B, 0x00003E32, 0x00001FD5, 0x00004984, 0x000400C8, 0x0000000B,\n    0x00002113, 0x00003E32, 0x000500C7, 0x0000000B, 0x0000276A, 0x00005024,\n    0x00002113, 0x00050082, 0x0000000B, 0x00003FB4, 0x00000908, 0x0000276A,\n    0x000500C7, 0x0000000B, 0x0000440F, 0x00003FB4, 0x00002113, 0x000500C7,\n    0x0000000B, 0x00004267, 0x0000440F, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00003575, 0x00001966, 0x00004267, 0x000500C7, 0x0000000B, 0x000055E7,\n    0x0000276A, 0x00000A1F, 0x00050084, 0x0000000B, 0x00004FC0, 0x00003330,\n    0x000055E7, 0x00050080, 0x0000000B, 0x00004DA3, 0x00003575, 0x00004FC0,\n    0x00050086, 0x0000000B, 0x000032E9, 0x00004DA3, 0x00000A19, 0x000500C2,\n    0x0000000B, 0x00005A12, 0x0000440F, 0x00000A13, 0x000500C7, 0x0000000B,\n    0x00002251, 0x00005A12, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AD3,\n    0x00001966, 0x00002251, 0x000500C2, 0x0000000B, 0x00003413, 0x0000276A,\n    0x00000A13, 0x000500C7, 0x0000000B, 0x000061AD, 0x00003413, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x0000629A, 0x00003330, 0x000061AD, 0x00050080,\n    0x0000000B, 0x00004DC8, 0x00003AD3, 0x0000629A, 0x00050086, 0x0000000B,\n    0x00003168, 0x00004DC8, 0x00000A19, 0x000500C4, 0x0000000B, 0x00001FF0,\n    0x00003168, 0x00000A3A, 0x000500C5, 0x0000000B, 0x00001D91, 0x000032E9,\n    0x00001FF0, 0x000500C2, 0x0000000B, 0x000055C0, 0x0000440F, 0x00000A1C,\n    0x000500C7, 0x0000000B, 0x000044C9, 0x000055C0, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00003AD4, 0x00001966, 0x000044C9, 0x000500C2, 0x0000000B,\n    0x00003414, 0x0000276A, 0x00000A1C, 0x000500C7, 0x0000000B, 0x000061AE,\n    0x00003414, 0x00000A1F, 0x00050084, 0x0000000B, 0x0000629B, 0x00003330,\n    0x000061AE, 0x00050080, 0x0000000B, 0x00004DA4, 0x00003AD4, 0x0000629B,\n    0x00050086, 0x0000000B, 0x000032EA, 0x00004DA4, 0x00000A19, 0x000500C2,\n    0x0000000B, 0x00005A13, 0x0000440F, 0x00000A25, 0x000500C7, 0x0000000B,\n    0x00002252, 0x00005A13, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AD5,\n    0x00001966, 0x00002252, 0x000500C2, 0x0000000B, 0x00003415, 0x0000276A,\n    0x00000A25, 0x000500C7, 0x0000000B, 0x000061AF, 0x00003415, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x0000629C, 0x00003330, 0x000061AF, 0x00050080,\n    0x0000000B, 0x00004DC9, 0x00003AD5, 0x0000629C, 0x00050086, 0x0000000B,\n    0x00003169, 0x00004DC9, 0x00000A19, 0x000500C4, 0x0000000B, 0x000061F9,\n    0x00003169, 0x00000A3A, 0x000500C5, 0x0000000B, 0x00002014, 0x000032EA,\n    0x000061F9, 0x00050050, 0x00000011, 0x0000278E, 0x00001D91, 0x00002014,\n    0x000500C7, 0x0000000B, 0x00005ED4, 0x00005024, 0x00003E32, 0x000500C7,\n    0x0000000B, 0x00004000, 0x00005ED4, 0x00000A0D, 0x000500C7, 0x0000000B,\n    0x00004C6F, 0x00005ED4, 0x00000A22, 0x000500C4, 0x0000000B, 0x0000610D,\n    0x00004C6F, 0x00000A31, 0x000500C5, 0x0000000B, 0x0000465D, 0x00004000,\n    0x0000610D, 0x000500C2, 0x0000000B, 0x00005AB0, 0x00005ED4, 0x00000A1C,\n    0x000500C7, 0x0000000B, 0x0000621E, 0x00005AB0, 0x00000A0D, 0x000500C7,\n    0x0000000B, 0x0000494B, 0x00005ED4, 0x00000447, 0x000500C4, 0x0000000B,\n    0x0000589F, 0x0000494B, 0x00000A1F, 0x000500C5, 0x0000000B, 0x000043EF,\n    0x0000621E, 0x0000589F, 0x00050050, 0x00000011, 0x00004F8F, 0x0000465D,\n    0x000043EF, 0x00050084, 0x00000011, 0x00005120, 0x00004F8F, 0x00000474,\n    0x00050080, 0x00000011, 0x00005D36, 0x0000278E, 0x00005120, 0x000200F9,\n    0x00004F4B, 0x000200F8, 0x000038C6, 0x000400C8, 0x0000000B, 0x000029DC,\n    0x00005024, 0x000500C7, 0x0000000B, 0x00003C0A, 0x000029DC, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00004538, 0x00001966, 0x00003C0A, 0x000500C7,\n    0x0000000B, 0x000055EA, 0x00005024, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00004FC1, 0x00003330, 0x000055EA, 0x00050080, 0x0000000B, 0x00004DA5,\n    0x00004538, 0x00004FC1, 0x00050086, 0x0000000B, 0x000032EB, 0x00004DA5,\n    0x00000A1F, 0x000500C2, 0x0000000B, 0x00005A14, 0x000029DC, 0x00000A13,\n    0x000500C7, 0x0000000B, 0x00002254, 0x00005A14, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00003AD6, 0x00001966, 0x00002254, 0x000500C2, 0x0000000B,\n    0x00003417, 0x00005024, 0x00000A13, 0x000500C7, 0x0000000B, 0x000061B0,\n    0x00003417, 0x00000A1F, 0x00050084, 0x0000000B, 0x0000629D, 0x00003330,\n    0x000061B0, 0x00050080, 0x0000000B, 0x00004DCA, 0x00003AD6, 0x0000629D,\n    0x00050086, 0x0000000B, 0x0000316A, 0x00004DCA, 0x00000A1F, 0x000500C4,\n    0x0000000B, 0x00001FF1, 0x0000316A, 0x00000A3A, 0x000500C5, 0x0000000B,\n    0x00001D92, 0x000032EB, 0x00001FF1, 0x000500C2, 0x0000000B, 0x000055C1,\n    0x000029DC, 0x00000A1C, 0x000500C7, 0x0000000B, 0x000044CA, 0x000055C1,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00003AD7, 0x00001966, 0x000044CA,\n    0x000500C2, 0x0000000B, 0x00003418, 0x00005024, 0x00000A1C, 0x000500C7,\n    0x0000000B, 0x000061B1, 0x00003418, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x0000629E, 0x00003330, 0x000061B1, 0x00050080, 0x0000000B, 0x00004DA6,\n    0x00003AD7, 0x0000629E, 0x00050086, 0x0000000B, 0x000032EC, 0x00004DA6,\n    0x00000A1F, 0x000500C2, 0x0000000B, 0x00005A15, 0x000029DC, 0x00000A25,\n    0x000500C7, 0x0000000B, 0x00002255, 0x00005A15, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00003AD8, 0x00001966, 0x00002255, 0x000500C2, 0x0000000B,\n    0x00003419, 0x00005024, 0x00000A25, 0x000500C7, 0x0000000B, 0x000061B2,\n    0x00003419, 0x00000A1F, 0x00050084, 0x0000000B, 0x0000629F, 0x00003330,\n    0x000061B2, 0x00050080, 0x0000000B, 0x00004DCB, 0x00003AD8, 0x0000629F,\n    0x00050086, 0x0000000B, 0x0000316B, 0x00004DCB, 0x00000A1F, 0x000500C4,\n    0x0000000B, 0x000061FA, 0x0000316B, 0x00000A3A, 0x000500C5, 0x0000000B,\n    0x000023CA, 0x000032EC, 0x000061FA, 0x00050050, 0x00000011, 0x000053E5,\n    0x00001D92, 0x000023CA, 0x000200F9, 0x00004F4B, 0x000200F8, 0x00004F4B,\n    0x000700F5, 0x00000011, 0x00002AB0, 0x00005D36, 0x000029A0, 0x000053E5,\n    0x000038C6, 0x000300F7, 0x00004B84, 0x00000000, 0x000400FA, 0x00004E84,\n    0x000029A1, 0x000038C7, 0x000200F8, 0x000029A1, 0x000500C7, 0x0000000B,\n    0x0000450A, 0x00005025, 0x0000003A, 0x000500C7, 0x0000000B, 0x00005D9D,\n    0x00005025, 0x0000022D, 0x000500C2, 0x0000000B, 0x00005565, 0x00005D9D,\n    0x00000A0D, 0x000500C7, 0x0000000B, 0x00001FD6, 0x0000450A, 0x00005565,\n    0x000500C4, 0x0000000B, 0x00006032, 0x00001FD6, 0x00000A0D, 0x000500C2,\n    0x0000000B, 0x000059BD, 0x00001FD6, 0x00000A0D, 0x000500C5, 0x0000000B,\n    0x00004985, 0x00006032, 0x000059BD, 0x000500C5, 0x0000000B, 0x00003E33,\n    0x00001FD6, 0x00004985, 0x000400C8, 0x0000000B, 0x00002114, 0x00003E33,\n    0x000500C7, 0x0000000B, 0x0000276B, 0x00005025, 0x00002114, 0x00050082,\n    0x0000000B, 0x00003FB5, 0x00000908, 0x0000276B, 0x000500C7, 0x0000000B,\n    0x00004410, 0x00003FB5, 0x00002114, 0x000500C7, 0x0000000B, 0x00004268,\n    0x00004410, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003576, 0x00003281,\n    0x00004268, 0x000500C7, 0x0000000B, 0x000055EB, 0x0000276B, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00004FC2, 0x00003331, 0x000055EB, 0x00050080,\n    0x0000000B, 0x00004DA7, 0x00003576, 0x00004FC2, 0x00050086, 0x0000000B,\n    0x000032ED, 0x00004DA7, 0x00000A19, 0x000500C2, 0x0000000B, 0x00005A16,\n    0x00004410, 0x00000A13, 0x000500C7, 0x0000000B, 0x00002256, 0x00005A16,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00003AD9, 0x00003281, 0x00002256,\n    0x000500C2, 0x0000000B, 0x0000341A, 0x0000276B, 0x00000A13, 0x000500C7,\n    0x0000000B, 0x000061B3, 0x0000341A, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x000062A0, 0x00003331, 0x000061B3, 0x00050080, 0x0000000B, 0x00004DCC,\n    0x00003AD9, 0x000062A0, 0x00050086, 0x0000000B, 0x0000316C, 0x00004DCC,\n    0x00000A19, 0x000500C4, 0x0000000B, 0x00001FF2, 0x0000316C, 0x00000A3A,\n    0x000500C5, 0x0000000B, 0x00001D93, 0x000032ED, 0x00001FF2, 0x000500C2,\n    0x0000000B, 0x000055C2, 0x00004410, 0x00000A1C, 0x000500C7, 0x0000000B,\n    0x000044CB, 0x000055C2, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003ADA,\n    0x00003281, 0x000044CB, 0x000500C2, 0x0000000B, 0x0000341B, 0x0000276B,\n    0x00000A1C, 0x000500C7, 0x0000000B, 0x000061B4, 0x0000341B, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x000062A1, 0x00003331, 0x000061B4, 0x00050080,\n    0x0000000B, 0x00004DCD, 0x00003ADA, 0x000062A1, 0x00050086, 0x0000000B,\n    0x000032EE, 0x00004DCD, 0x00000A19, 0x000500C2, 0x0000000B, 0x00005A17,\n    0x00004410, 0x00000A25, 0x000500C7, 0x0000000B, 0x00002257, 0x00005A17,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00003ADB, 0x00003281, 0x00002257,\n    0x000500C2, 0x0000000B, 0x0000341C, 0x0000276B, 0x00000A25, 0x000500C7,\n    0x0000000B, 0x000061B5, 0x0000341C, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x000062A2, 0x00003331, 0x000061B5, 0x00050080, 0x0000000B, 0x00004DCE,\n    0x00003ADB, 0x000062A2, 0x00050086, 0x0000000B, 0x0000316D, 0x00004DCE,\n    0x00000A19, 0x000500C4, 0x0000000B, 0x000061FB, 0x0000316D, 0x00000A3A,\n    0x000500C5, 0x0000000B, 0x00002015, 0x000032EE, 0x000061FB, 0x00050050,\n    0x00000011, 0x0000278F, 0x00001D93, 0x00002015, 0x000500C7, 0x0000000B,\n    0x00005ED5, 0x00005025, 0x00003E33, 0x000500C7, 0x0000000B, 0x00004001,\n    0x00005ED5, 0x00000A0D, 0x000500C7, 0x0000000B, 0x00004C70, 0x00005ED5,\n    0x00000A22, 0x000500C4, 0x0000000B, 0x0000610E, 0x00004C70, 0x00000A31,\n    0x000500C5, 0x0000000B, 0x0000465E, 0x00004001, 0x0000610E, 0x000500C2,\n    0x0000000B, 0x00005AB1, 0x00005ED5, 0x00000A1C, 0x000500C7, 0x0000000B,\n    0x0000621F, 0x00005AB1, 0x00000A0D, 0x000500C7, 0x0000000B, 0x0000494C,\n    0x00005ED5, 0x00000447, 0x000500C4, 0x0000000B, 0x000058A0, 0x0000494C,\n    0x00000A1F, 0x000500C5, 0x0000000B, 0x000043F0, 0x0000621F, 0x000058A0,\n    0x00050050, 0x00000011, 0x00004F90, 0x0000465E, 0x000043F0, 0x00050084,\n    0x00000011, 0x00005121, 0x00004F90, 0x00000474, 0x00050080, 0x00000011,\n    0x00005D37, 0x0000278F, 0x00005121, 0x000200F9, 0x00004B84, 0x000200F8,\n    0x000038C7, 0x000400C8, 0x0000000B, 0x000029DD, 0x00005025, 0x000500C7,\n    0x0000000B, 0x00003C0B, 0x000029DD, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00004539, 0x00003281, 0x00003C0B, 0x000500C7, 0x0000000B, 0x000055EC,\n    0x00005025, 0x00000A1F, 0x00050084, 0x0000000B, 0x00004FC3, 0x00003331,\n    0x000055EC, 0x00050080, 0x0000000B, 0x00004DCF, 0x00004539, 0x00004FC3,\n    0x00050086, 0x0000000B, 0x000032EF, 0x00004DCF, 0x00000A1F, 0x000500C2,\n    0x0000000B, 0x00005A18, 0x000029DD, 0x00000A13, 0x000500C7, 0x0000000B,\n    0x00002258, 0x00005A18, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003ADC,\n    0x00003281, 0x00002258, 0x000500C2, 0x0000000B, 0x0000341D, 0x00005025,\n    0x00000A13, 0x000500C7, 0x0000000B, 0x000061B6, 0x0000341D, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x000062A3, 0x00003331, 0x000061B6, 0x00050080,\n    0x0000000B, 0x00004DD0, 0x00003ADC, 0x000062A3, 0x00050086, 0x0000000B,\n    0x0000316E, 0x00004DD0, 0x00000A1F, 0x000500C4, 0x0000000B, 0x00001FF3,\n    0x0000316E, 0x00000A3A, 0x000500C5, 0x0000000B, 0x00001D94, 0x000032EF,\n    0x00001FF3, 0x000500C2, 0x0000000B, 0x000055C3, 0x000029DD, 0x00000A1C,\n    0x000500C7, 0x0000000B, 0x000044CC, 0x000055C3, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00003ADE, 0x00003281, 0x000044CC, 0x000500C2, 0x0000000B,\n    0x0000341E, 0x00005025, 0x00000A1C, 0x000500C7, 0x0000000B, 0x000061B7,\n    0x0000341E, 0x00000A1F, 0x00050084, 0x0000000B, 0x000062A4, 0x00003331,\n    0x000061B7, 0x00050080, 0x0000000B, 0x00004DD1, 0x00003ADE, 0x000062A4,\n    0x00050086, 0x0000000B, 0x000032F0, 0x00004DD1, 0x00000A1F, 0x000500C2,\n    0x0000000B, 0x00005A19, 0x000029DD, 0x00000A25, 0x000500C7, 0x0000000B,\n    0x00002259, 0x00005A19, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003ADF,\n    0x00003281, 0x00002259, 0x000500C2, 0x0000000B, 0x0000341F, 0x00005025,\n    0x00000A25, 0x000500C7, 0x0000000B, 0x000061B8, 0x0000341F, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x000062A5, 0x00003331, 0x000061B8, 0x00050080,\n    0x0000000B, 0x00004DD2, 0x00003ADF, 0x000062A5, 0x00050086, 0x0000000B,\n    0x0000316F, 0x00004DD2, 0x00000A1F, 0x000500C4, 0x0000000B, 0x000061FC,\n    0x0000316F, 0x00000A3A, 0x000500C5, 0x0000000B, 0x000023CB, 0x000032F0,\n    0x000061FC, 0x00050050, 0x00000011, 0x000053E6, 0x00001D94, 0x000023CB,\n    0x000200F9, 0x00004B84, 0x000200F8, 0x00004B84, 0x000700F5, 0x00000011,\n    0x00004938, 0x00005D37, 0x000029A1, 0x000053E6, 0x000038C7, 0x000500C4,\n    0x00000011, 0x00002B1F, 0x00004938, 0x000007B7, 0x000500C5, 0x00000011,\n    0x00005255, 0x00002AB0, 0x00002B1F, 0x000300F7, 0x00004F4C, 0x00000000,\n    0x000400FA, 0x00004E85, 0x000029A2, 0x000038C8, 0x000200F8, 0x000029A2,\n    0x000500C7, 0x0000000B, 0x0000450B, 0x00005026, 0x0000003A, 0x000500C7,\n    0x0000000B, 0x00005D9E, 0x00005026, 0x0000022D, 0x000500C2, 0x0000000B,\n    0x00005567, 0x00005D9E, 0x00000A0D, 0x000500C7, 0x0000000B, 0x00001FD7,\n    0x0000450B, 0x00005567, 0x000500C4, 0x0000000B, 0x00006033, 0x00001FD7,\n    0x00000A0D, 0x000500C2, 0x0000000B, 0x000059BE, 0x00001FD7, 0x00000A0D,\n    0x000500C5, 0x0000000B, 0x00004986, 0x00006033, 0x000059BE, 0x000500C5,\n    0x0000000B, 0x00003E34, 0x00001FD7, 0x00004986, 0x000400C8, 0x0000000B,\n    0x00002115, 0x00003E34, 0x000500C7, 0x0000000B, 0x0000276C, 0x00005026,\n    0x00002115, 0x00050082, 0x0000000B, 0x00003FB6, 0x00000908, 0x0000276C,\n    0x000500C7, 0x0000000B, 0x00004412, 0x00003FB6, 0x00002115, 0x000500C7,\n    0x0000000B, 0x00004269, 0x00004412, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00003577, 0x00003282, 0x00004269, 0x000500C7, 0x0000000B, 0x000055ED,\n    0x0000276C, 0x00000A1F, 0x00050084, 0x0000000B, 0x00004FC4, 0x00003332,\n    0x000055ED, 0x00050080, 0x0000000B, 0x00004DD3, 0x00003577, 0x00004FC4,\n    0x00050086, 0x0000000B, 0x000032F1, 0x00004DD3, 0x00000A19, 0x000500C2,\n    0x0000000B, 0x00005A1A, 0x00004412, 0x00000A13, 0x000500C7, 0x0000000B,\n    0x0000225A, 0x00005A1A, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AE0,\n    0x00003282, 0x0000225A, 0x000500C2, 0x0000000B, 0x00003420, 0x0000276C,\n    0x00000A13, 0x000500C7, 0x0000000B, 0x000061B9, 0x00003420, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x000062A6, 0x00003332, 0x000061B9, 0x00050080,\n    0x0000000B, 0x00004DD4, 0x00003AE0, 0x000062A6, 0x00050086, 0x0000000B,\n    0x00003170, 0x00004DD4, 0x00000A19, 0x000500C4, 0x0000000B, 0x00001FF4,\n    0x00003170, 0x00000A3A, 0x000500C5, 0x0000000B, 0x00001D95, 0x000032F1,\n    0x00001FF4, 0x000500C2, 0x0000000B, 0x000055C4, 0x00004412, 0x00000A1C,\n    0x000500C7, 0x0000000B, 0x000044CD, 0x000055C4, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00003AE1, 0x00003282, 0x000044CD, 0x000500C2, 0x0000000B,\n    0x00003421, 0x0000276C, 0x00000A1C, 0x000500C7, 0x0000000B, 0x000061BA,\n    0x00003421, 0x00000A1F, 0x00050084, 0x0000000B, 0x000062A7, 0x00003332,\n    0x000061BA, 0x00050080, 0x0000000B, 0x00004DD5, 0x00003AE1, 0x000062A7,\n    0x00050086, 0x0000000B, 0x000032F2, 0x00004DD5, 0x00000A19, 0x000500C2,\n    0x0000000B, 0x00005A1B, 0x00004412, 0x00000A25, 0x000500C7, 0x0000000B,\n    0x0000225B, 0x00005A1B, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AE2,\n    0x00003282, 0x0000225B, 0x000500C2, 0x0000000B, 0x00003422, 0x0000276C,\n    0x00000A25, 0x000500C7, 0x0000000B, 0x000061BB, 0x00003422, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x000062A8, 0x00003332, 0x000061BB, 0x00050080,\n    0x0000000B, 0x00004DD6, 0x00003AE2, 0x000062A8, 0x00050086, 0x0000000B,\n    0x00003171, 0x00004DD6, 0x00000A19, 0x000500C4, 0x0000000B, 0x000061FD,\n    0x00003171, 0x00000A3A, 0x000500C5, 0x0000000B, 0x00002016, 0x000032F2,\n    0x000061FD, 0x00050050, 0x00000011, 0x00002790, 0x00001D95, 0x00002016,\n    0x000500C7, 0x0000000B, 0x00005ED6, 0x00005026, 0x00003E34, 0x000500C7,\n    0x0000000B, 0x00004002, 0x00005ED6, 0x00000A0D, 0x000500C7, 0x0000000B,\n    0x00004C71, 0x00005ED6, 0x00000A22, 0x000500C4, 0x0000000B, 0x0000610F,\n    0x00004C71, 0x00000A31, 0x000500C5, 0x0000000B, 0x0000465F, 0x00004002,\n    0x0000610F, 0x000500C2, 0x0000000B, 0x00005AB2, 0x00005ED6, 0x00000A1C,\n    0x000500C7, 0x0000000B, 0x00006220, 0x00005AB2, 0x00000A0D, 0x000500C7,\n    0x0000000B, 0x0000494D, 0x00005ED6, 0x00000447, 0x000500C4, 0x0000000B,\n    0x000058A1, 0x0000494D, 0x00000A1F, 0x000500C5, 0x0000000B, 0x000043F1,\n    0x00006220, 0x000058A1, 0x00050050, 0x00000011, 0x00004F91, 0x0000465F,\n    0x000043F1, 0x00050084, 0x00000011, 0x00005122, 0x00004F91, 0x00000474,\n    0x00050080, 0x00000011, 0x00005D38, 0x00002790, 0x00005122, 0x000200F9,\n    0x00004F4C, 0x000200F8, 0x000038C8, 0x000400C8, 0x0000000B, 0x000029DE,\n    0x00005026, 0x000500C7, 0x0000000B, 0x00003C0C, 0x000029DE, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x0000453A, 0x00003282, 0x00003C0C, 0x000500C7,\n    0x0000000B, 0x000055EE, 0x00005026, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00004FC5, 0x00003332, 0x000055EE, 0x00050080, 0x0000000B, 0x00004DD7,\n    0x0000453A, 0x00004FC5, 0x00050086, 0x0000000B, 0x000032F3, 0x00004DD7,\n    0x00000A1F, 0x000500C2, 0x0000000B, 0x00005A1C, 0x000029DE, 0x00000A13,\n    0x000500C7, 0x0000000B, 0x0000225C, 0x00005A1C, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00003AE3, 0x00003282, 0x0000225C, 0x000500C2, 0x0000000B,\n    0x00003423, 0x00005026, 0x00000A13, 0x000500C7, 0x0000000B, 0x000061BC,\n    0x00003423, 0x00000A1F, 0x00050084, 0x0000000B, 0x000062A9, 0x00003332,\n    0x000061BC, 0x00050080, 0x0000000B, 0x00004DD8, 0x00003AE3, 0x000062A9,\n    0x00050086, 0x0000000B, 0x00003172, 0x00004DD8, 0x00000A1F, 0x000500C4,\n    0x0000000B, 0x00001FF5, 0x00003172, 0x00000A3A, 0x000500C5, 0x0000000B,\n    0x00001D96, 0x000032F3, 0x00001FF5, 0x000500C2, 0x0000000B, 0x000055C5,\n    0x000029DE, 0x00000A1C, 0x000500C7, 0x0000000B, 0x000044CE, 0x000055C5,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00003AE4, 0x00003282, 0x000044CE,\n    0x000500C2, 0x0000000B, 0x00003424, 0x00005026, 0x00000A1C, 0x000500C7,\n    0x0000000B, 0x000061BD, 0x00003424, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x000062AA, 0x00003332, 0x000061BD, 0x00050080, 0x0000000B, 0x00004DD9,\n    0x00003AE4, 0x000062AA, 0x00050086, 0x0000000B, 0x000032F4, 0x00004DD9,\n    0x00000A1F, 0x000500C2, 0x0000000B, 0x00005A1D, 0x000029DE, 0x00000A25,\n    0x000500C7, 0x0000000B, 0x0000225E, 0x00005A1D, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00003AE5, 0x00003282, 0x0000225E, 0x000500C2, 0x0000000B,\n    0x00003425, 0x00005026, 0x00000A25, 0x000500C7, 0x0000000B, 0x000061BE,\n    0x00003425, 0x00000A1F, 0x00050084, 0x0000000B, 0x000062AB, 0x00003332,\n    0x000061BE, 0x00050080, 0x0000000B, 0x00004DDA, 0x00003AE5, 0x000062AB,\n    0x00050086, 0x0000000B, 0x00003173, 0x00004DDA, 0x00000A1F, 0x000500C4,\n    0x0000000B, 0x000061FE, 0x00003173, 0x00000A3A, 0x000500C5, 0x0000000B,\n    0x000023CC, 0x000032F4, 0x000061FE, 0x00050050, 0x00000011, 0x000053E7,\n    0x00001D96, 0x000023CC, 0x000200F9, 0x00004F4C, 0x000200F8, 0x00004F4C,\n    0x000700F5, 0x00000011, 0x00002AB1, 0x00005D38, 0x000029A2, 0x000053E7,\n    0x000038C8, 0x000300F7, 0x00004B85, 0x00000000, 0x000400FA, 0x00004E86,\n    0x000029A3, 0x000038C9, 0x000200F8, 0x000029A3, 0x000500C7, 0x0000000B,\n    0x0000450C, 0x00004CE1, 0x0000003A, 0x000500C7, 0x0000000B, 0x00005D9F,\n    0x00004CE1, 0x0000022D, 0x000500C2, 0x0000000B, 0x00005568, 0x00005D9F,\n    0x00000A0D, 0x000500C7, 0x0000000B, 0x00001FD8, 0x0000450C, 0x00005568,\n    0x000500C4, 0x0000000B, 0x00006034, 0x00001FD8, 0x00000A0D, 0x000500C2,\n    0x0000000B, 0x000059BF, 0x00001FD8, 0x00000A0D, 0x000500C5, 0x0000000B,\n    0x00004987, 0x00006034, 0x000059BF, 0x000500C5, 0x0000000B, 0x00003E35,\n    0x00001FD8, 0x00004987, 0x000400C8, 0x0000000B, 0x00002116, 0x00003E35,\n    0x000500C7, 0x0000000B, 0x0000276D, 0x00004CE1, 0x00002116, 0x00050082,\n    0x0000000B, 0x00003FB7, 0x00000908, 0x0000276D, 0x000500C7, 0x0000000B,\n    0x00004413, 0x00003FB7, 0x00002116, 0x000500C7, 0x0000000B, 0x0000426A,\n    0x00004413, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003578, 0x00003283,\n    0x0000426A, 0x000500C7, 0x0000000B, 0x000055EF, 0x0000276D, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00004FC6, 0x00003333, 0x000055EF, 0x00050080,\n    0x0000000B, 0x00004DDB, 0x00003578, 0x00004FC6, 0x00050086, 0x0000000B,\n    0x000032F5, 0x00004DDB, 0x00000A19, 0x000500C2, 0x0000000B, 0x00005A1E,\n    0x00004413, 0x00000A13, 0x000500C7, 0x0000000B, 0x0000225F, 0x00005A1E,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00003AE6, 0x00003283, 0x0000225F,\n    0x000500C2, 0x0000000B, 0x00003426, 0x0000276D, 0x00000A13, 0x000500C7,\n    0x0000000B, 0x000061BF, 0x00003426, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x000062AC, 0x00003333, 0x000061BF, 0x00050080, 0x0000000B, 0x00004DDC,\n    0x00003AE6, 0x000062AC, 0x00050086, 0x0000000B, 0x00003174, 0x00004DDC,\n    0x00000A19, 0x000500C4, 0x0000000B, 0x00001FF6, 0x00003174, 0x00000A3A,\n    0x000500C5, 0x0000000B, 0x00001D97, 0x000032F5, 0x00001FF6, 0x000500C2,\n    0x0000000B, 0x000055C6, 0x00004413, 0x00000A1C, 0x000500C7, 0x0000000B,\n    0x000044CF, 0x000055C6, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AE7,\n    0x00003283, 0x000044CF, 0x000500C2, 0x0000000B, 0x00003427, 0x0000276D,\n    0x00000A1C, 0x000500C7, 0x0000000B, 0x000061C0, 0x00003427, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x000062AD, 0x00003333, 0x000061C0, 0x00050080,\n    0x0000000B, 0x00004DDD, 0x00003AE7, 0x000062AD, 0x00050086, 0x0000000B,\n    0x000032F6, 0x00004DDD, 0x00000A19, 0x000500C2, 0x0000000B, 0x00005A1F,\n    0x00004413, 0x00000A25, 0x000500C7, 0x0000000B, 0x00002260, 0x00005A1F,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00003AE8, 0x00003283, 0x00002260,\n    0x000500C2, 0x0000000B, 0x00003428, 0x0000276D, 0x00000A25, 0x000500C7,\n    0x0000000B, 0x000061C1, 0x00003428, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x000062AE, 0x00003333, 0x000061C1, 0x00050080, 0x0000000B, 0x00004DDE,\n    0x00003AE8, 0x000062AE, 0x00050086, 0x0000000B, 0x00003175, 0x00004DDE,\n    0x00000A19, 0x000500C4, 0x0000000B, 0x000061FF, 0x00003175, 0x00000A3A,\n    0x000500C5, 0x0000000B, 0x00002017, 0x000032F6, 0x000061FF, 0x00050050,\n    0x00000011, 0x00002791, 0x00001D97, 0x00002017, 0x000500C7, 0x0000000B,\n    0x00005ED7, 0x00004CE1, 0x00003E35, 0x000500C7, 0x0000000B, 0x00004003,\n    0x00005ED7, 0x00000A0D, 0x000500C7, 0x0000000B, 0x00004C72, 0x00005ED7,\n    0x00000A22, 0x000500C4, 0x0000000B, 0x00006110, 0x00004C72, 0x00000A31,\n    0x000500C5, 0x0000000B, 0x00004660, 0x00004003, 0x00006110, 0x000500C2,\n    0x0000000B, 0x00005AB3, 0x00005ED7, 0x00000A1C, 0x000500C7, 0x0000000B,\n    0x00006221, 0x00005AB3, 0x00000A0D, 0x000500C7, 0x0000000B, 0x0000494E,\n    0x00005ED7, 0x00000447, 0x000500C4, 0x0000000B, 0x000058A2, 0x0000494E,\n    0x00000A1F, 0x000500C5, 0x0000000B, 0x000043F2, 0x00006221, 0x000058A2,\n    0x00050050, 0x00000011, 0x00004F92, 0x00004660, 0x000043F2, 0x00050084,\n    0x00000011, 0x00005123, 0x00004F92, 0x00000474, 0x00050080, 0x00000011,\n    0x00005D39, 0x00002791, 0x00005123, 0x000200F9, 0x00004B85, 0x000200F8,\n    0x000038C9, 0x000400C8, 0x0000000B, 0x000029DF, 0x00004CE1, 0x000500C7,\n    0x0000000B, 0x00003C0D, 0x000029DF, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x0000453B, 0x00003283, 0x00003C0D, 0x000500C7, 0x0000000B, 0x000055F0,\n    0x00004CE1, 0x00000A1F, 0x00050084, 0x0000000B, 0x00004FC9, 0x00003333,\n    0x000055F0, 0x00050080, 0x0000000B, 0x00004DDF, 0x0000453B, 0x00004FC9,\n    0x00050086, 0x0000000B, 0x000032F7, 0x00004DDF, 0x00000A1F, 0x000500C2,\n    0x0000000B, 0x00005A20, 0x000029DF, 0x00000A13, 0x000500C7, 0x0000000B,\n    0x00002261, 0x00005A20, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AE9,\n    0x00003283, 0x00002261, 0x000500C2, 0x0000000B, 0x00003429, 0x00004CE1,\n    0x00000A13, 0x000500C7, 0x0000000B, 0x000061C2, 0x00003429, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x000062AF, 0x00003333, 0x000061C2, 0x00050080,\n    0x0000000B, 0x00004DE0, 0x00003AE9, 0x000062AF, 0x00050086, 0x0000000B,\n    0x00003176, 0x00004DE0, 0x00000A1F, 0x000500C4, 0x0000000B, 0x00001FF7,\n    0x00003176, 0x00000A3A, 0x000500C5, 0x0000000B, 0x00001D98, 0x000032F7,\n    0x00001FF7, 0x000500C2, 0x0000000B, 0x000055C7, 0x000029DF, 0x00000A1C,\n    0x000500C7, 0x0000000B, 0x000044D0, 0x000055C7, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00003AEA, 0x00003283, 0x000044D0, 0x000500C2, 0x0000000B,\n    0x0000342A, 0x00004CE1, 0x00000A1C, 0x000500C7, 0x0000000B, 0x000061C3,\n    0x0000342A, 0x00000A1F, 0x00050084, 0x0000000B, 0x000062B0, 0x00003333,\n    0x000061C3, 0x00050080, 0x0000000B, 0x00004DE1, 0x00003AEA, 0x000062B0,\n    0x00050086, 0x0000000B, 0x000032F8, 0x00004DE1, 0x00000A1F, 0x000500C2,\n    0x0000000B, 0x00005A21, 0x000029DF, 0x00000A25, 0x000500C7, 0x0000000B,\n    0x00002262, 0x00005A21, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AEB,\n    0x00003283, 0x00002262, 0x000500C2, 0x0000000B, 0x0000342B, 0x00004CE1,\n    0x00000A25, 0x000500C7, 0x0000000B, 0x000061C4, 0x0000342B, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x000062B1, 0x00003333, 0x000061C4, 0x00050080,\n    0x0000000B, 0x00004DE2, 0x00003AEB, 0x000062B1, 0x00050086, 0x0000000B,\n    0x00003177, 0x00004DE2, 0x00000A1F, 0x000500C4, 0x0000000B, 0x00006200,\n    0x00003177, 0x00000A3A, 0x000500C5, 0x0000000B, 0x000023CD, 0x000032F8,\n    0x00006200, 0x00050050, 0x00000011, 0x000053E8, 0x00001D98, 0x000023CD,\n    0x000200F9, 0x00004B85, 0x000200F8, 0x00004B85, 0x000700F5, 0x00000011,\n    0x00004939, 0x00005D39, 0x000029A3, 0x000053E8, 0x000038C9, 0x000500C4,\n    0x00000011, 0x00001ECF, 0x00004939, 0x000007B7, 0x000500C5, 0x00000011,\n    0x000020FB, 0x00002AB1, 0x00001ECF, 0x00050051, 0x0000000B, 0x00004E87,\n    0x00005255, 0x00000000, 0x00050051, 0x0000000B, 0x00005CB4, 0x00005255,\n    0x00000001, 0x00050051, 0x0000000B, 0x00001DDD, 0x000020FB, 0x00000000,\n    0x00050051, 0x0000000B, 0x00001D6B, 0x000020FB, 0x00000001, 0x00070050,\n    0x00000017, 0x00004756, 0x00004E87, 0x00005CB4, 0x00001DDD, 0x00001D6B,\n    0x00060041, 0x00000294, 0x000025D1, 0x0000140E, 0x00000A0B, 0x00001BC9,\n    0x0003003E, 0x000025D1, 0x00004756, 0x00050080, 0x0000000B, 0x000039F9,\n    0x00003220, 0x00000A14, 0x000500B0, 0x00000009, 0x00002E0C, 0x000039F9,\n    0x000019C2, 0x000300F7, 0x00004665, 0x00000002, 0x000400FA, 0x00002E0C,\n    0x0000592E, 0x00004665, 0x000200F8, 0x0000592E, 0x00050080, 0x0000000B,\n    0x00003C7A, 0x00003416, 0x0000578C, 0x000500C2, 0x00000017, 0x00002EF8,\n    0x00003A05, 0x00000215, 0x000500C2, 0x0000000B, 0x00005A22, 0x00003C7A,\n    0x00000A17, 0x00050051, 0x0000000B, 0x00004B34, 0x00002EF8, 0x00000000,\n    0x000300F7, 0x000042F9, 0x00000000, 0x000400FA, 0x00004E83, 0x000029A4,\n    0x000038CA, 0x000200F8, 0x000029A4, 0x000500C7, 0x0000000B, 0x0000450D,\n    0x00004B34, 0x0000003A, 0x000500C7, 0x0000000B, 0x00005DA0, 0x00004B34,\n    0x0000022D, 0x000500C2, 0x0000000B, 0x00005569, 0x00005DA0, 0x00000A0D,\n    0x000500C7, 0x0000000B, 0x00001FD9, 0x0000450D, 0x00005569, 0x000500C4,\n    0x0000000B, 0x00006035, 0x00001FD9, 0x00000A0D, 0x000500C2, 0x0000000B,\n    0x000059C0, 0x00001FD9, 0x00000A0D, 0x000500C5, 0x0000000B, 0x00004988,\n    0x00006035, 0x000059C0, 0x000500C5, 0x0000000B, 0x00003E36, 0x00001FD9,\n    0x00004988, 0x000400C8, 0x0000000B, 0x00002117, 0x00003E36, 0x000500C7,\n    0x0000000B, 0x0000276E, 0x00004B34, 0x00002117, 0x00050082, 0x0000000B,\n    0x00003FB8, 0x00000908, 0x0000276E, 0x000500C7, 0x0000000B, 0x00004414,\n    0x00003FB8, 0x00002117, 0x000500C7, 0x0000000B, 0x0000426B, 0x00004414,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00003579, 0x00001966, 0x0000426B,\n    0x000500C7, 0x0000000B, 0x000055F1, 0x0000276E, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00004FCA, 0x00003330, 0x000055F1, 0x00050080, 0x0000000B,\n    0x00004DE3, 0x00003579, 0x00004FCA, 0x00050086, 0x0000000B, 0x000032F9,\n    0x00004DE3, 0x00000A19, 0x000500C2, 0x0000000B, 0x00005A23, 0x00004414,\n    0x00000A13, 0x000500C7, 0x0000000B, 0x00002263, 0x00005A23, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00003AEC, 0x00001966, 0x00002263, 0x000500C2,\n    0x0000000B, 0x0000342C, 0x0000276E, 0x00000A13, 0x000500C7, 0x0000000B,\n    0x000061C5, 0x0000342C, 0x00000A1F, 0x00050084, 0x0000000B, 0x000062B2,\n    0x00003330, 0x000061C5, 0x00050080, 0x0000000B, 0x00004DE4, 0x00003AEC,\n    0x000062B2, 0x00050086, 0x0000000B, 0x00003178, 0x00004DE4, 0x00000A19,\n    0x000500C4, 0x0000000B, 0x00001FF8, 0x00003178, 0x00000A3A, 0x000500C5,\n    0x0000000B, 0x00001D99, 0x000032F9, 0x00001FF8, 0x000500C2, 0x0000000B,\n    0x000055C8, 0x00004414, 0x00000A1C, 0x000500C7, 0x0000000B, 0x000044D1,\n    0x000055C8, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AED, 0x00001966,\n    0x000044D1, 0x000500C2, 0x0000000B, 0x0000342D, 0x0000276E, 0x00000A1C,\n    0x000500C7, 0x0000000B, 0x000061C6, 0x0000342D, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x000062B3, 0x00003330, 0x000061C6, 0x00050080, 0x0000000B,\n    0x00004DE5, 0x00003AED, 0x000062B3, 0x00050086, 0x0000000B, 0x000032FA,\n    0x00004DE5, 0x00000A19, 0x000500C2, 0x0000000B, 0x00005A24, 0x00004414,\n    0x00000A25, 0x000500C7, 0x0000000B, 0x00002264, 0x00005A24, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00003AEE, 0x00001966, 0x00002264, 0x000500C2,\n    0x0000000B, 0x0000342E, 0x0000276E, 0x00000A25, 0x000500C7, 0x0000000B,\n    0x000061C7, 0x0000342E, 0x00000A1F, 0x00050084, 0x0000000B, 0x000062B4,\n    0x00003330, 0x000061C7, 0x00050080, 0x0000000B, 0x00004DE6, 0x00003AEE,\n    0x000062B4, 0x00050086, 0x0000000B, 0x00003179, 0x00004DE6, 0x00000A19,\n    0x000500C4, 0x0000000B, 0x00006201, 0x00003179, 0x00000A3A, 0x000500C5,\n    0x0000000B, 0x00002018, 0x000032FA, 0x00006201, 0x00050050, 0x00000011,\n    0x00002792, 0x00001D99, 0x00002018, 0x000500C7, 0x0000000B, 0x00005ED8,\n    0x00004B34, 0x00003E36, 0x000500C7, 0x0000000B, 0x00004004, 0x00005ED8,\n    0x00000A0D, 0x000500C7, 0x0000000B, 0x00004C73, 0x00005ED8, 0x00000A22,\n    0x000500C4, 0x0000000B, 0x00006111, 0x00004C73, 0x00000A31, 0x000500C5,\n    0x0000000B, 0x00004661, 0x00004004, 0x00006111, 0x000500C2, 0x0000000B,\n    0x00005AB4, 0x00005ED8, 0x00000A1C, 0x000500C7, 0x0000000B, 0x00006222,\n    0x00005AB4, 0x00000A0D, 0x000500C7, 0x0000000B, 0x0000494F, 0x00005ED8,\n    0x00000447, 0x000500C4, 0x0000000B, 0x000058A3, 0x0000494F, 0x00000A1F,\n    0x000500C5, 0x0000000B, 0x000043F3, 0x00006222, 0x000058A3, 0x00050050,\n    0x00000011, 0x00004F93, 0x00004661, 0x000043F3, 0x00050084, 0x00000011,\n    0x00005124, 0x00004F93, 0x00000474, 0x00050080, 0x00000011, 0x00005D3A,\n    0x00002792, 0x00005124, 0x000200F9, 0x000042F9, 0x000200F8, 0x000038CA,\n    0x000400C8, 0x0000000B, 0x000029E0, 0x00004B34, 0x000500C7, 0x0000000B,\n    0x00003C0E, 0x000029E0, 0x00000A1F, 0x00050084, 0x0000000B, 0x0000453C,\n    0x00001966, 0x00003C0E, 0x000500C7, 0x0000000B, 0x000055F2, 0x00004B34,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00004FCB, 0x00003330, 0x000055F2,\n    0x00050080, 0x0000000B, 0x00004DE7, 0x0000453C, 0x00004FCB, 0x00050086,\n    0x0000000B, 0x000032FB, 0x00004DE7, 0x00000A1F, 0x000500C2, 0x0000000B,\n    0x00005A25, 0x000029E0, 0x00000A13, 0x000500C7, 0x0000000B, 0x00002265,\n    0x00005A25, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AEF, 0x00001966,\n    0x00002265, 0x000500C2, 0x0000000B, 0x0000342F, 0x00004B34, 0x00000A13,\n    0x000500C7, 0x0000000B, 0x000061C8, 0x0000342F, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x000062B5, 0x00003330, 0x000061C8, 0x00050080, 0x0000000B,\n    0x00004DE8, 0x00003AEF, 0x000062B5, 0x00050086, 0x0000000B, 0x0000317A,\n    0x00004DE8, 0x00000A1F, 0x000500C4, 0x0000000B, 0x00001FF9, 0x0000317A,\n    0x00000A3A, 0x000500C5, 0x0000000B, 0x00001D9A, 0x000032FB, 0x00001FF9,\n    0x000500C2, 0x0000000B, 0x000055C9, 0x000029E0, 0x00000A1C, 0x000500C7,\n    0x0000000B, 0x000044D2, 0x000055C9, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00003AF0, 0x00001966, 0x000044D2, 0x000500C2, 0x0000000B, 0x00003430,\n    0x00004B34, 0x00000A1C, 0x000500C7, 0x0000000B, 0x000061C9, 0x00003430,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x000062B6, 0x00003330, 0x000061C9,\n    0x00050080, 0x0000000B, 0x00004DE9, 0x00003AF0, 0x000062B6, 0x00050086,\n    0x0000000B, 0x000032FC, 0x00004DE9, 0x00000A1F, 0x000500C2, 0x0000000B,\n    0x00005A26, 0x000029E0, 0x00000A25, 0x000500C7, 0x0000000B, 0x00002266,\n    0x00005A26, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AF1, 0x00001966,\n    0x00002266, 0x000500C2, 0x0000000B, 0x00003431, 0x00004B34, 0x00000A25,\n    0x000500C7, 0x0000000B, 0x000061CA, 0x00003431, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x000062B7, 0x00003330, 0x000061CA, 0x00050080, 0x0000000B,\n    0x00004DEA, 0x00003AF1, 0x000062B7, 0x00050086, 0x0000000B, 0x0000317B,\n    0x00004DEA, 0x00000A1F, 0x000500C4, 0x0000000B, 0x00006202, 0x0000317B,\n    0x00000A3A, 0x000500C5, 0x0000000B, 0x000023CE, 0x000032FC, 0x00006202,\n    0x00050050, 0x00000011, 0x000053E9, 0x00001D9A, 0x000023CE, 0x000200F9,\n    0x000042F9, 0x000200F8, 0x000042F9, 0x000700F5, 0x00000011, 0x00005027,\n    0x00005D3A, 0x000029A4, 0x000053E9, 0x000038CA, 0x00050051, 0x0000000B,\n    0x000040EF, 0x00002EF8, 0x00000001, 0x000300F7, 0x00004B86, 0x00000000,\n    0x000400FA, 0x00004E84, 0x000029A5, 0x000038CB, 0x000200F8, 0x000029A5,\n    0x000500C7, 0x0000000B, 0x0000450E, 0x000040EF, 0x0000003A, 0x000500C7,\n    0x0000000B, 0x00005DA1, 0x000040EF, 0x0000022D, 0x000500C2, 0x0000000B,\n    0x0000556A, 0x00005DA1, 0x00000A0D, 0x000500C7, 0x0000000B, 0x00001FDA,\n    0x0000450E, 0x0000556A, 0x000500C4, 0x0000000B, 0x00006036, 0x00001FDA,\n    0x00000A0D, 0x000500C2, 0x0000000B, 0x000059C1, 0x00001FDA, 0x00000A0D,\n    0x000500C5, 0x0000000B, 0x00004989, 0x00006036, 0x000059C1, 0x000500C5,\n    0x0000000B, 0x00003E37, 0x00001FDA, 0x00004989, 0x000400C8, 0x0000000B,\n    0x00002118, 0x00003E37, 0x000500C7, 0x0000000B, 0x0000276F, 0x000040EF,\n    0x00002118, 0x00050082, 0x0000000B, 0x00003FB9, 0x00000908, 0x0000276F,\n    0x000500C7, 0x0000000B, 0x00004415, 0x00003FB9, 0x00002118, 0x000500C7,\n    0x0000000B, 0x0000426C, 0x00004415, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x0000357A, 0x00003281, 0x0000426C, 0x000500C7, 0x0000000B, 0x000055F3,\n    0x0000276F, 0x00000A1F, 0x00050084, 0x0000000B, 0x00004FCC, 0x00003331,\n    0x000055F3, 0x00050080, 0x0000000B, 0x00004DEB, 0x0000357A, 0x00004FCC,\n    0x00050086, 0x0000000B, 0x000032FD, 0x00004DEB, 0x00000A19, 0x000500C2,\n    0x0000000B, 0x00005A27, 0x00004415, 0x00000A13, 0x000500C7, 0x0000000B,\n    0x00002267, 0x00005A27, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AF2,\n    0x00003281, 0x00002267, 0x000500C2, 0x0000000B, 0x00003432, 0x0000276F,\n    0x00000A13, 0x000500C7, 0x0000000B, 0x000061CB, 0x00003432, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x000062B8, 0x00003331, 0x000061CB, 0x00050080,\n    0x0000000B, 0x00004DEC, 0x00003AF2, 0x000062B8, 0x00050086, 0x0000000B,\n    0x0000317C, 0x00004DEC, 0x00000A19, 0x000500C4, 0x0000000B, 0x00001FFA,\n    0x0000317C, 0x00000A3A, 0x000500C5, 0x0000000B, 0x00001D9B, 0x000032FD,\n    0x00001FFA, 0x000500C2, 0x0000000B, 0x000055CA, 0x00004415, 0x00000A1C,\n    0x000500C7, 0x0000000B, 0x000044D3, 0x000055CA, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00003AF3, 0x00003281, 0x000044D3, 0x000500C2, 0x0000000B,\n    0x00003433, 0x0000276F, 0x00000A1C, 0x000500C7, 0x0000000B, 0x000061CC,\n    0x00003433, 0x00000A1F, 0x00050084, 0x0000000B, 0x000062B9, 0x00003331,\n    0x000061CC, 0x00050080, 0x0000000B, 0x00004DED, 0x00003AF3, 0x000062B9,\n    0x00050086, 0x0000000B, 0x000032FE, 0x00004DED, 0x00000A19, 0x000500C2,\n    0x0000000B, 0x00005A28, 0x00004415, 0x00000A25, 0x000500C7, 0x0000000B,\n    0x00002268, 0x00005A28, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AF4,\n    0x00003281, 0x00002268, 0x000500C2, 0x0000000B, 0x00003434, 0x0000276F,\n    0x00000A25, 0x000500C7, 0x0000000B, 0x000061CD, 0x00003434, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x000062BA, 0x00003331, 0x000061CD, 0x00050080,\n    0x0000000B, 0x00004DEE, 0x00003AF4, 0x000062BA, 0x00050086, 0x0000000B,\n    0x0000317D, 0x00004DEE, 0x00000A19, 0x000500C4, 0x0000000B, 0x00006203,\n    0x0000317D, 0x00000A3A, 0x000500C5, 0x0000000B, 0x00002019, 0x000032FE,\n    0x00006203, 0x00050050, 0x00000011, 0x00002793, 0x00001D9B, 0x00002019,\n    0x000500C7, 0x0000000B, 0x00005ED9, 0x000040EF, 0x00003E37, 0x000500C7,\n    0x0000000B, 0x00004005, 0x00005ED9, 0x00000A0D, 0x000500C7, 0x0000000B,\n    0x00004C74, 0x00005ED9, 0x00000A22, 0x000500C4, 0x0000000B, 0x00006112,\n    0x00004C74, 0x00000A31, 0x000500C5, 0x0000000B, 0x00004662, 0x00004005,\n    0x00006112, 0x000500C2, 0x0000000B, 0x00005AB5, 0x00005ED9, 0x00000A1C,\n    0x000500C7, 0x0000000B, 0x00006223, 0x00005AB5, 0x00000A0D, 0x000500C7,\n    0x0000000B, 0x00004950, 0x00005ED9, 0x00000447, 0x000500C4, 0x0000000B,\n    0x000058A4, 0x00004950, 0x00000A1F, 0x000500C5, 0x0000000B, 0x000043F4,\n    0x00006223, 0x000058A4, 0x00050050, 0x00000011, 0x00004F94, 0x00004662,\n    0x000043F4, 0x00050084, 0x00000011, 0x00005125, 0x00004F94, 0x00000474,\n    0x00050080, 0x00000011, 0x00005D3B, 0x00002793, 0x00005125, 0x000200F9,\n    0x00004B86, 0x000200F8, 0x000038CB, 0x000400C8, 0x0000000B, 0x000029E1,\n    0x000040EF, 0x000500C7, 0x0000000B, 0x00003C10, 0x000029E1, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x0000453D, 0x00003281, 0x00003C10, 0x000500C7,\n    0x0000000B, 0x000055F4, 0x000040EF, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00004FCD, 0x00003331, 0x000055F4, 0x00050080, 0x0000000B, 0x00004DEF,\n    0x0000453D, 0x00004FCD, 0x00050086, 0x0000000B, 0x000032FF, 0x00004DEF,\n    0x00000A1F, 0x000500C2, 0x0000000B, 0x00005A29, 0x000029E1, 0x00000A13,\n    0x000500C7, 0x0000000B, 0x00002269, 0x00005A29, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00003AF5, 0x00003281, 0x00002269, 0x000500C2, 0x0000000B,\n    0x00003435, 0x000040EF, 0x00000A13, 0x000500C7, 0x0000000B, 0x000061CE,\n    0x00003435, 0x00000A1F, 0x00050084, 0x0000000B, 0x000062BB, 0x00003331,\n    0x000061CE, 0x00050080, 0x0000000B, 0x00004DF0, 0x00003AF5, 0x000062BB,\n    0x00050086, 0x0000000B, 0x0000317E, 0x00004DF0, 0x00000A1F, 0x000500C4,\n    0x0000000B, 0x00001FFB, 0x0000317E, 0x00000A3A, 0x000500C5, 0x0000000B,\n    0x00001D9C, 0x000032FF, 0x00001FFB, 0x000500C2, 0x0000000B, 0x000055CB,\n    0x000029E1, 0x00000A1C, 0x000500C7, 0x0000000B, 0x000044D4, 0x000055CB,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00003AF6, 0x00003281, 0x000044D4,\n    0x000500C2, 0x0000000B, 0x00003436, 0x000040EF, 0x00000A1C, 0x000500C7,\n    0x0000000B, 0x000061CF, 0x00003436, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x000062BC, 0x00003331, 0x000061CF, 0x00050080, 0x0000000B, 0x00004DF1,\n    0x00003AF6, 0x000062BC, 0x00050086, 0x0000000B, 0x00003300, 0x00004DF1,\n    0x00000A1F, 0x000500C2, 0x0000000B, 0x00005A2A, 0x000029E1, 0x00000A25,\n    0x000500C7, 0x0000000B, 0x0000226A, 0x00005A2A, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00003AF7, 0x00003281, 0x0000226A, 0x000500C2, 0x0000000B,\n    0x00003437, 0x000040EF, 0x00000A25, 0x000500C7, 0x0000000B, 0x000061D0,\n    0x00003437, 0x00000A1F, 0x00050084, 0x0000000B, 0x000062BD, 0x00003331,\n    0x000061D0, 0x00050080, 0x0000000B, 0x00004DF2, 0x00003AF7, 0x000062BD,\n    0x00050086, 0x0000000B, 0x0000317F, 0x00004DF2, 0x00000A1F, 0x000500C4,\n    0x0000000B, 0x00006204, 0x0000317F, 0x00000A3A, 0x000500C5, 0x0000000B,\n    0x000023CF, 0x00003300, 0x00006204, 0x00050050, 0x00000011, 0x000053EA,\n    0x00001D9C, 0x000023CF, 0x000200F9, 0x00004B86, 0x000200F8, 0x00004B86,\n    0x000700F5, 0x00000011, 0x0000493A, 0x00005D3B, 0x000029A5, 0x000053EA,\n    0x000038CB, 0x000500C4, 0x00000011, 0x00001ED0, 0x0000493A, 0x000007B7,\n    0x000500C5, 0x00000011, 0x00002D4C, 0x00005027, 0x00001ED0, 0x00050051,\n    0x0000000B, 0x0000355D, 0x00002EF8, 0x00000002, 0x000300F7, 0x000042FA,\n    0x00000000, 0x000400FA, 0x00004E85, 0x000029A6, 0x000038CC, 0x000200F8,\n    0x000029A6, 0x000500C7, 0x0000000B, 0x0000450F, 0x0000355D, 0x0000003A,\n    0x000500C7, 0x0000000B, 0x00005DA2, 0x0000355D, 0x0000022D, 0x000500C2,\n    0x0000000B, 0x0000556B, 0x00005DA2, 0x00000A0D, 0x000500C7, 0x0000000B,\n    0x00001FDB, 0x0000450F, 0x0000556B, 0x000500C4, 0x0000000B, 0x00006037,\n    0x00001FDB, 0x00000A0D, 0x000500C2, 0x0000000B, 0x000059C2, 0x00001FDB,\n    0x00000A0D, 0x000500C5, 0x0000000B, 0x0000498A, 0x00006037, 0x000059C2,\n    0x000500C5, 0x0000000B, 0x00003E38, 0x00001FDB, 0x0000498A, 0x000400C8,\n    0x0000000B, 0x00002119, 0x00003E38, 0x000500C7, 0x0000000B, 0x00002770,\n    0x0000355D, 0x00002119, 0x00050082, 0x0000000B, 0x00003FBA, 0x00000908,\n    0x00002770, 0x000500C7, 0x0000000B, 0x00004416, 0x00003FBA, 0x00002119,\n    0x000500C7, 0x0000000B, 0x0000426D, 0x00004416, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x0000357B, 0x00003282, 0x0000426D, 0x000500C7, 0x0000000B,\n    0x000055F5, 0x00002770, 0x00000A1F, 0x00050084, 0x0000000B, 0x00004FCE,\n    0x00003332, 0x000055F5, 0x00050080, 0x0000000B, 0x00004DF3, 0x0000357B,\n    0x00004FCE, 0x00050086, 0x0000000B, 0x00003301, 0x00004DF3, 0x00000A19,\n    0x000500C2, 0x0000000B, 0x00005A2B, 0x00004416, 0x00000A13, 0x000500C7,\n    0x0000000B, 0x0000226B, 0x00005A2B, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00003AF8, 0x00003282, 0x0000226B, 0x000500C2, 0x0000000B, 0x00003438,\n    0x00002770, 0x00000A13, 0x000500C7, 0x0000000B, 0x000061D1, 0x00003438,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x000062BE, 0x00003332, 0x000061D1,\n    0x00050080, 0x0000000B, 0x00004DF4, 0x00003AF8, 0x000062BE, 0x00050086,\n    0x0000000B, 0x00003180, 0x00004DF4, 0x00000A19, 0x000500C4, 0x0000000B,\n    0x00001FFC, 0x00003180, 0x00000A3A, 0x000500C5, 0x0000000B, 0x00001D9D,\n    0x00003301, 0x00001FFC, 0x000500C2, 0x0000000B, 0x000055CC, 0x00004416,\n    0x00000A1C, 0x000500C7, 0x0000000B, 0x000044D5, 0x000055CC, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00003AF9, 0x00003282, 0x000044D5, 0x000500C2,\n    0x0000000B, 0x00003439, 0x00002770, 0x00000A1C, 0x000500C7, 0x0000000B,\n    0x000061D2, 0x00003439, 0x00000A1F, 0x00050084, 0x0000000B, 0x000062BF,\n    0x00003332, 0x000061D2, 0x00050080, 0x0000000B, 0x00004DF5, 0x00003AF9,\n    0x000062BF, 0x00050086, 0x0000000B, 0x00003302, 0x00004DF5, 0x00000A19,\n    0x000500C2, 0x0000000B, 0x00005A2C, 0x00004416, 0x00000A25, 0x000500C7,\n    0x0000000B, 0x0000226C, 0x00005A2C, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00003AFA, 0x00003282, 0x0000226C, 0x000500C2, 0x0000000B, 0x0000343A,\n    0x00002770, 0x00000A25, 0x000500C7, 0x0000000B, 0x000061D3, 0x0000343A,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x000062C0, 0x00003332, 0x000061D3,\n    0x00050080, 0x0000000B, 0x00004DF6, 0x00003AFA, 0x000062C0, 0x00050086,\n    0x0000000B, 0x00003181, 0x00004DF6, 0x00000A19, 0x000500C4, 0x0000000B,\n    0x00006205, 0x00003181, 0x00000A3A, 0x000500C5, 0x0000000B, 0x0000201A,\n    0x00003302, 0x00006205, 0x00050050, 0x00000011, 0x00002794, 0x00001D9D,\n    0x0000201A, 0x000500C7, 0x0000000B, 0x00005EDA, 0x0000355D, 0x00003E38,\n    0x000500C7, 0x0000000B, 0x00004006, 0x00005EDA, 0x00000A0D, 0x000500C7,\n    0x0000000B, 0x00004C75, 0x00005EDA, 0x00000A22, 0x000500C4, 0x0000000B,\n    0x00006113, 0x00004C75, 0x00000A31, 0x000500C5, 0x0000000B, 0x00004663,\n    0x00004006, 0x00006113, 0x000500C2, 0x0000000B, 0x00005AB6, 0x00005EDA,\n    0x00000A1C, 0x000500C7, 0x0000000B, 0x00006224, 0x00005AB6, 0x00000A0D,\n    0x000500C7, 0x0000000B, 0x00004951, 0x00005EDA, 0x00000447, 0x000500C4,\n    0x0000000B, 0x000058A5, 0x00004951, 0x00000A1F, 0x000500C5, 0x0000000B,\n    0x000043F5, 0x00006224, 0x000058A5, 0x00050050, 0x00000011, 0x00004F95,\n    0x00004663, 0x000043F5, 0x00050084, 0x00000011, 0x00005126, 0x00004F95,\n    0x00000474, 0x00050080, 0x00000011, 0x00005D3C, 0x00002794, 0x00005126,\n    0x000200F9, 0x000042FA, 0x000200F8, 0x000038CC, 0x000400C8, 0x0000000B,\n    0x000029E2, 0x0000355D, 0x000500C7, 0x0000000B, 0x00003C11, 0x000029E2,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x0000453E, 0x00003282, 0x00003C11,\n    0x000500C7, 0x0000000B, 0x000055F6, 0x0000355D, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00004FCF, 0x00003332, 0x000055F6, 0x00050080, 0x0000000B,\n    0x00004DF7, 0x0000453E, 0x00004FCF, 0x00050086, 0x0000000B, 0x00003303,\n    0x00004DF7, 0x00000A1F, 0x000500C2, 0x0000000B, 0x00005A2D, 0x000029E2,\n    0x00000A13, 0x000500C7, 0x0000000B, 0x0000226D, 0x00005A2D, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00003AFB, 0x00003282, 0x0000226D, 0x000500C2,\n    0x0000000B, 0x0000343B, 0x0000355D, 0x00000A13, 0x000500C7, 0x0000000B,\n    0x000061D4, 0x0000343B, 0x00000A1F, 0x00050084, 0x0000000B, 0x000062C1,\n    0x00003332, 0x000061D4, 0x00050080, 0x0000000B, 0x00004DF8, 0x00003AFB,\n    0x000062C1, 0x00050086, 0x0000000B, 0x00003182, 0x00004DF8, 0x00000A1F,\n    0x000500C4, 0x0000000B, 0x00001FFD, 0x00003182, 0x00000A3A, 0x000500C5,\n    0x0000000B, 0x00001D9E, 0x00003303, 0x00001FFD, 0x000500C2, 0x0000000B,\n    0x000055CD, 0x000029E2, 0x00000A1C, 0x000500C7, 0x0000000B, 0x000044D6,\n    0x000055CD, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AFC, 0x00003282,\n    0x000044D6, 0x000500C2, 0x0000000B, 0x0000343C, 0x0000355D, 0x00000A1C,\n    0x000500C7, 0x0000000B, 0x000061D5, 0x0000343C, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x000062C2, 0x00003332, 0x000061D5, 0x00050080, 0x0000000B,\n    0x00004DF9, 0x00003AFC, 0x000062C2, 0x00050086, 0x0000000B, 0x00003304,\n    0x00004DF9, 0x00000A1F, 0x000500C2, 0x0000000B, 0x00005A2E, 0x000029E2,\n    0x00000A25, 0x000500C7, 0x0000000B, 0x0000226E, 0x00005A2E, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00003AFD, 0x00003282, 0x0000226E, 0x000500C2,\n    0x0000000B, 0x0000343D, 0x0000355D, 0x00000A25, 0x000500C7, 0x0000000B,\n    0x000061D6, 0x0000343D, 0x00000A1F, 0x00050084, 0x0000000B, 0x000062C3,\n    0x00003332, 0x000061D6, 0x00050080, 0x0000000B, 0x00004DFA, 0x00003AFD,\n    0x000062C3, 0x00050086, 0x0000000B, 0x00003183, 0x00004DFA, 0x00000A1F,\n    0x000500C4, 0x0000000B, 0x00006206, 0x00003183, 0x00000A3A, 0x000500C5,\n    0x0000000B, 0x000023D0, 0x00003304, 0x00006206, 0x00050050, 0x00000011,\n    0x000053EB, 0x00001D9E, 0x000023D0, 0x000200F9, 0x000042FA, 0x000200F8,\n    0x000042FA, 0x000700F5, 0x00000011, 0x00005028, 0x00005D3C, 0x000029A6,\n    0x000053EB, 0x000038CC, 0x00050051, 0x0000000B, 0x000040F0, 0x00002EF8,\n    0x00000003, 0x000300F7, 0x00004B87, 0x00000000, 0x000400FA, 0x00004E86,\n    0x000029A7, 0x000038CD, 0x000200F8, 0x000029A7, 0x000500C7, 0x0000000B,\n    0x00004510, 0x000040F0, 0x0000003A, 0x000500C7, 0x0000000B, 0x00005DA3,\n    0x000040F0, 0x0000022D, 0x000500C2, 0x0000000B, 0x0000556C, 0x00005DA3,\n    0x00000A0D, 0x000500C7, 0x0000000B, 0x00001FDC, 0x00004510, 0x0000556C,\n    0x000500C4, 0x0000000B, 0x00006038, 0x00001FDC, 0x00000A0D, 0x000500C2,\n    0x0000000B, 0x000059C3, 0x00001FDC, 0x00000A0D, 0x000500C5, 0x0000000B,\n    0x0000498B, 0x00006038, 0x000059C3, 0x000500C5, 0x0000000B, 0x00003E39,\n    0x00001FDC, 0x0000498B, 0x000400C8, 0x0000000B, 0x0000211A, 0x00003E39,\n    0x000500C7, 0x0000000B, 0x00002771, 0x000040F0, 0x0000211A, 0x00050082,\n    0x0000000B, 0x00003FBB, 0x00000908, 0x00002771, 0x000500C7, 0x0000000B,\n    0x00004417, 0x00003FBB, 0x0000211A, 0x000500C7, 0x0000000B, 0x0000426E,\n    0x00004417, 0x00000A1F, 0x00050084, 0x0000000B, 0x0000357C, 0x00003283,\n    0x0000426E, 0x000500C7, 0x0000000B, 0x000055F7, 0x00002771, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00004FD0, 0x00003333, 0x000055F7, 0x00050080,\n    0x0000000B, 0x00004DFB, 0x0000357C, 0x00004FD0, 0x00050086, 0x0000000B,\n    0x00003305, 0x00004DFB, 0x00000A19, 0x000500C2, 0x0000000B, 0x00005A2F,\n    0x00004417, 0x00000A13, 0x000500C7, 0x0000000B, 0x0000226F, 0x00005A2F,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00003AFE, 0x00003283, 0x0000226F,\n    0x000500C2, 0x0000000B, 0x0000343E, 0x00002771, 0x00000A13, 0x000500C7,\n    0x0000000B, 0x000061D7, 0x0000343E, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x000062C4, 0x00003333, 0x000061D7, 0x00050080, 0x0000000B, 0x00004DFC,\n    0x00003AFE, 0x000062C4, 0x00050086, 0x0000000B, 0x00003184, 0x00004DFC,\n    0x00000A19, 0x000500C4, 0x0000000B, 0x00001FFE, 0x00003184, 0x00000A3A,\n    0x000500C5, 0x0000000B, 0x00001D9F, 0x00003305, 0x00001FFE, 0x000500C2,\n    0x0000000B, 0x000055CE, 0x00004417, 0x00000A1C, 0x000500C7, 0x0000000B,\n    0x000044D7, 0x000055CE, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AFF,\n    0x00003283, 0x000044D7, 0x000500C2, 0x0000000B, 0x0000343F, 0x00002771,\n    0x00000A1C, 0x000500C7, 0x0000000B, 0x000061D8, 0x0000343F, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x000062C5, 0x00003333, 0x000061D8, 0x00050080,\n    0x0000000B, 0x00004DFD, 0x00003AFF, 0x000062C5, 0x00050086, 0x0000000B,\n    0x00003306, 0x00004DFD, 0x00000A19, 0x000500C2, 0x0000000B, 0x00005A30,\n    0x00004417, 0x00000A25, 0x000500C7, 0x0000000B, 0x00002270, 0x00005A30,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00003B00, 0x00003283, 0x00002270,\n    0x000500C2, 0x0000000B, 0x00003440, 0x00002771, 0x00000A25, 0x000500C7,\n    0x0000000B, 0x000061D9, 0x00003440, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x000062C6, 0x00003333, 0x000061D9, 0x00050080, 0x0000000B, 0x00004DFE,\n    0x00003B00, 0x000062C6, 0x00050086, 0x0000000B, 0x00003185, 0x00004DFE,\n    0x00000A19, 0x000500C4, 0x0000000B, 0x00006207, 0x00003185, 0x00000A3A,\n    0x000500C5, 0x0000000B, 0x0000201B, 0x00003306, 0x00006207, 0x00050050,\n    0x00000011, 0x00002795, 0x00001D9F, 0x0000201B, 0x000500C7, 0x0000000B,\n    0x00005EDB, 0x000040F0, 0x00003E39, 0x000500C7, 0x0000000B, 0x00004007,\n    0x00005EDB, 0x00000A0D, 0x000500C7, 0x0000000B, 0x00004C76, 0x00005EDB,\n    0x00000A22, 0x000500C4, 0x0000000B, 0x00006114, 0x00004C76, 0x00000A31,\n    0x000500C5, 0x0000000B, 0x00004664, 0x00004007, 0x00006114, 0x000500C2,\n    0x0000000B, 0x00005AB7, 0x00005EDB, 0x00000A1C, 0x000500C7, 0x0000000B,\n    0x00006225, 0x00005AB7, 0x00000A0D, 0x000500C7, 0x0000000B, 0x00004952,\n    0x00005EDB, 0x00000447, 0x000500C4, 0x0000000B, 0x000058A6, 0x00004952,\n    0x00000A1F, 0x000500C5, 0x0000000B, 0x000043F6, 0x00006225, 0x000058A6,\n    0x00050050, 0x00000011, 0x00004F96, 0x00004664, 0x000043F6, 0x00050084,\n    0x00000011, 0x00005127, 0x00004F96, 0x00000474, 0x00050080, 0x00000011,\n    0x00005D3D, 0x00002795, 0x00005127, 0x000200F9, 0x00004B87, 0x000200F8,\n    0x000038CD, 0x000400C8, 0x0000000B, 0x000029E3, 0x000040F0, 0x000500C7,\n    0x0000000B, 0x00003C12, 0x000029E3, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x0000453F, 0x00003283, 0x00003C12, 0x000500C7, 0x0000000B, 0x000055F8,\n    0x000040F0, 0x00000A1F, 0x00050084, 0x0000000B, 0x00004FD1, 0x00003333,\n    0x000055F8, 0x00050080, 0x0000000B, 0x00004DFF, 0x0000453F, 0x00004FD1,\n    0x00050086, 0x0000000B, 0x00003307, 0x00004DFF, 0x00000A1F, 0x000500C2,\n    0x0000000B, 0x00005A31, 0x000029E3, 0x00000A13, 0x000500C7, 0x0000000B,\n    0x00002271, 0x00005A31, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003B01,\n    0x00003283, 0x00002271, 0x000500C2, 0x0000000B, 0x00003441, 0x000040F0,\n    0x00000A13, 0x000500C7, 0x0000000B, 0x000061DA, 0x00003441, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x000062C7, 0x00003333, 0x000061DA, 0x00050080,\n    0x0000000B, 0x00004E00, 0x00003B01, 0x000062C7, 0x00050086, 0x0000000B,\n    0x00003186, 0x00004E00, 0x00000A1F, 0x000500C4, 0x0000000B, 0x00001FFF,\n    0x00003186, 0x00000A3A, 0x000500C5, 0x0000000B, 0x00001DA0, 0x00003307,\n    0x00001FFF, 0x000500C2, 0x0000000B, 0x000055CF, 0x000029E3, 0x00000A1C,\n    0x000500C7, 0x0000000B, 0x000044D8, 0x000055CF, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00003B02, 0x00003283, 0x000044D8, 0x000500C2, 0x0000000B,\n    0x00003442, 0x000040F0, 0x00000A1C, 0x000500C7, 0x0000000B, 0x000061DB,\n    0x00003442, 0x00000A1F, 0x00050084, 0x0000000B, 0x000062C8, 0x00003333,\n    0x000061DB, 0x00050080, 0x0000000B, 0x00004E01, 0x00003B02, 0x000062C8,\n    0x00050086, 0x0000000B, 0x00003308, 0x00004E01, 0x00000A1F, 0x000500C2,\n    0x0000000B, 0x00005A32, 0x000029E3, 0x00000A25, 0x000500C7, 0x0000000B,\n    0x00002272, 0x00005A32, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003B03,\n    0x00003283, 0x00002272, 0x000500C2, 0x0000000B, 0x00003443, 0x000040F0,\n    0x00000A25, 0x000500C7, 0x0000000B, 0x000061DC, 0x00003443, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x000062C9, 0x00003333, 0x000061DC, 0x00050080,\n    0x0000000B, 0x00004E02, 0x00003B03, 0x000062C9, 0x00050086, 0x0000000B,\n    0x00003187, 0x00004E02, 0x00000A1F, 0x000500C4, 0x0000000B, 0x00006208,\n    0x00003187, 0x00000A3A, 0x000500C5, 0x0000000B, 0x000023D1, 0x00003308,\n    0x00006208, 0x00050050, 0x00000011, 0x000053EC, 0x00001DA0, 0x000023D1,\n    0x000200F9, 0x00004B87, 0x000200F8, 0x00004B87, 0x000700F5, 0x00000011,\n    0x0000493B, 0x00005D3D, 0x000029A7, 0x000053EC, 0x000038CD, 0x000500C4,\n    0x00000011, 0x00001ED1, 0x0000493B, 0x000007B7, 0x000500C5, 0x00000011,\n    0x000020FC, 0x00005028, 0x00001ED1, 0x00050051, 0x0000000B, 0x00004E88,\n    0x00002D4C, 0x00000000, 0x00050051, 0x0000000B, 0x00005CB5, 0x00002D4C,\n    0x00000001, 0x00050051, 0x0000000B, 0x00001DDE, 0x000020FC, 0x00000000,\n    0x00050051, 0x0000000B, 0x00001D6C, 0x000020FC, 0x00000001, 0x00070050,\n    0x00000017, 0x00004757, 0x00004E88, 0x00005CB5, 0x00001DDE, 0x00001D6C,\n    0x00060041, 0x00000294, 0x00002ECB, 0x0000140E, 0x00000A0B, 0x00005A22,\n    0x0003003E, 0x00002ECB, 0x00004757, 0x000200F9, 0x00004665, 0x000200F8,\n    0x00004665, 0x000200F9, 0x00001C26, 0x000200F8, 0x00001C26, 0x000200F9,\n    0x00001C27, 0x000200F8, 0x00001C27, 0x000200F9, 0x00003A37, 0x000200F8,\n    0x00003A37, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_dxt1_rgba8_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25215\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v4uint = OpTypeVector %uint 4\n     %v2uint = OpTypeVector %uint 2\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v3uint = OpTypeVector %uint 3\n     %uint_3 = OpConstant %uint 3\n    %uint_13 = OpConstant %uint 13\n   %uint_248 = OpConstant %uint 248\n     %uint_7 = OpConstant %uint 7\n     %uint_9 = OpConstant %uint 9\n%uint_258048 = OpConstant %uint 258048\n    %uint_12 = OpConstant %uint 12\n     %uint_4 = OpConstant %uint 4\n%uint_260046848 = OpConstant %uint 260046848\n     %uint_5 = OpConstant %uint 5\n%uint_7340039 = OpConstant %uint 7340039\n     %uint_6 = OpConstant %uint 6\n  %uint_3072 = OpConstant %uint 3072\n%uint_1431655765 = OpConstant %uint 1431655765\n     %uint_1 = OpConstant %uint 1\n%uint_2863311530 = OpConstant %uint 2863311530\n     %uint_0 = OpConstant %uint 0\n     %uint_2 = OpConstant %uint 2\n         %77 = OpConstantComposite %v4uint %uint_0 %uint_2 %uint_4 %uint_6\n  %uint_1023 = OpConstant %uint 1023\n    %uint_16 = OpConstant %uint 16\n    %uint_10 = OpConstant %uint 10\n     %uint_8 = OpConstant %uint 8\n    %uint_20 = OpConstant %uint 20\n        %131 = OpConstantComposite %v4uint %uint_1 %uint_3 %uint_5 %uint_7\n%uint_4278190080 = OpConstant %uint 4278190080\n%uint_16711935 = OpConstant %uint 16711935\n%uint_4278255360 = OpConstant %uint 4278255360\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n      %int_3 = OpConstant %int 3\n      %int_2 = OpConstant %int 2\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %2596 = OpConstantComposite %v3uint %uint_2 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n       %2619 = OpConstantComposite %v3uint %uint_2 %uint_2 %uint_0\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n     %v4bool = OpTypeVector %bool 4\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n    %uint_32 = OpConstant %uint 32\n    %uint_48 = OpConstant %uint 48\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n        %993 = OpConstantComposite %v2uint %uint_248 %uint_248\n       %1015 = OpConstantComposite %v2uint %uint_258048 %uint_258048\n       %2547 = OpConstantComposite %v2uint %uint_260046848 %uint_260046848\n       %1912 = OpConstantComposite %v2uint %uint_5 %uint_5\n        %503 = OpConstantComposite %v2uint %uint_7340039 %uint_7340039\n       %1933 = OpConstantComposite %v2uint %uint_6 %uint_6\n         %78 = OpConstantComposite %v2uint %uint_3072 %uint_3072\n       %2878 = OpConstantComposite %v4uint %uint_1431655765 %uint_1431655765 %uint_1431655765 %uint_1431655765\n       %2950 = OpConstantComposite %v4uint %uint_1 %uint_1 %uint_1 %uint_1\n       %2860 = OpConstantComposite %v4uint %uint_2863311530 %uint_2863311530 %uint_2863311530 %uint_2863311530\n        %929 = OpConstantComposite %v4uint %uint_1023 %uint_1023 %uint_1023 %uint_1023\n        %425 = OpConstantComposite %v4uint %uint_10 %uint_10 %uint_10 %uint_10\n        %965 = OpConstantComposite %v4uint %uint_20 %uint_20 %uint_20 %uint_20\n       %2599 = OpConstantComposite %v4uint %uint_4278190080 %uint_4278190080 %uint_4278190080 %uint_4278190080\n         %47 = OpConstantComposite %v4uint %uint_3 %uint_3 %uint_3 %uint_3\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %14903 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24540 = OpBitwiseAnd %uint %13606 %uint_1\n      %17270 = OpINotEqual %bool %24540 %uint_0\n      %12328 = OpBitwiseAnd %uint %13606 %uint_2\n      %17284 = OpINotEqual %bool %12328 %uint_0\n       %7856 = OpShiftRightLogical %uint %13606 %uint_2\n      %25058 = OpBitwiseAnd %uint %7856 %uint_3\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20158 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n      %22412 = OpLoad %uint %20158\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_7\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2596\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %14018 DontFlatten\n               OpBranchConditional %24679 %21992 %14018\n      %21992 = OpLabel\n               OpBranch %14903\n      %14018 = OpLabel\n      %17344 = OpShiftLeftLogical %v3uint %21387 %2619\n      %15489 = OpBitcast %v3int %17344\n      %18336 = OpCompositeExtract %int %15489 0\n       %9362 = OpIMul %int %18336 %int_4\n       %6362 = OpCompositeExtract %int %15489 2\n      %14505 = OpBitcast %int %6594\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %15489 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %22412\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %9362 %24535\n      %10404 = OpBitcast %uint %8258\n      %14582 = OpIAdd %uint %22411 %10404\n      %12308 = OpLogicalNot %bool %17270\n               OpSelectionMerge %19040 DontFlatten\n               OpBranchConditional %12308 %9741 %17007\n       %9741 = OpLabel\n      %17463 = OpCompositeExtract %uint %21387 0\n      %11246 = OpCompositeExtract %uint %21387 1\n      %18801 = OpCompositeExtract %uint %21387 2\n      %14831 = OpIMul %uint %22409 %18801\n      %20322 = OpIAdd %uint %11246 %14831\n      %21676 = OpIMul %uint %22408 %20322\n      %20398 = OpIAdd %uint %17463 %21676\n      %11367 = OpShiftLeftLogical %uint %20398 %uint_3\n               OpBranch %19040\n      %17007 = OpLabel\n               OpSelectionMerge %23536 DontFlatten\n               OpBranchConditional %17284 %23520 %24353\n      %23520 = OpLabel\n      %10111 = OpBitcast %v3int %21387\n      %19476 = OpShiftRightLogical %uint %22408 %int_5\n      %18810 = OpShiftRightLogical %uint %22409 %int_4\n       %6782 = OpCompositeExtract %int %10111 2\n      %12089 = OpShiftRightArithmetic %int %6782 %int_2\n      %22400 = OpBitcast %int %18810\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %10111 1\n      %19055 = OpShiftRightArithmetic %int %25154 %int_4\n      %11052 = OpIAdd %int %7938 %19055\n      %16898 = OpBitcast %int %19476\n      %14944 = OpIMul %int %11052 %16898\n      %25155 = OpCompositeExtract %int %10111 0\n      %20423 = OpShiftRightArithmetic %int %25155 %int_5\n      %18940 = OpIAdd %int %14944 %20423\n       %8797 = OpShiftLeftLogical %int %18940 %int_7\n      %11434 = OpBitwiseAnd %int %6782 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %25154 %int_1\n      %21364 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21364 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %25155 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17334 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17334 %uint_3\n      %13015 = OpShiftRightArithmetic %int %25154 %int_3\n       %9929 = OpBitwiseXor %int %13015 %12089\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %25155 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %25154 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6551\n       %7168 = OpShiftLeftLogical %int %16793 %int_11\n      %15490 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24144 %int_15\n      %15472 = OpBitwiseOr %int %15490 %20655\n      %14149 = OpShiftRightArithmetic %int %24144 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24144 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24144 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %23536\n      %24353 = OpLabel\n      %23000 = OpBitcast %v2int %17136\n      %22120 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %23000 1\n      %12090 = OpShiftRightArithmetic %int %14597 %int_5\n      %22401 = OpBitcast %int %22120\n       %7939 = OpIMul %int %12090 %22401\n      %25156 = OpCompositeExtract %int %23000 0\n      %20424 = OpShiftRightArithmetic %int %25156 %int_5\n      %18864 = OpIAdd %int %7939 %20424\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25156 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17335 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17335 %uint_3\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25156 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6552\n       %7169 = OpShiftLeftLogical %int %21575 %int_11\n      %15491 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24163 %int_15\n      %15473 = OpBitwiseOr %int %15491 %20656\n      %14150 = OpShiftRightArithmetic %int %24163 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24163 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %23536\n      %23536 = OpLabel\n      %10540 = OpPhi %uint %16869 %23520 %16870 %24353\n               OpBranch %19040\n      %19040 = OpLabel\n      %11376 = OpPhi %uint %11367 %9741 %10540 %23536\n      %18621 = OpIAdd %uint %11376 %24236\n      %15698 = OpShiftRightLogical %uint %18621 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15698\n       %7338 = OpLoad %v4uint %20399\n      %13760 = OpIEqual %bool %25058 %uint_1\n      %21366 = OpIEqual %bool %25058 %uint_2\n      %22150 = OpLogicalOr %bool %13760 %21366\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %7338 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %7338 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22649 = OpPhi %v4uint %7338 %19040 %16376 %10583\n      %19638 = OpIEqual %bool %25058 %uint_3\n      %15139 = OpLogicalOr %bool %21366 %19638\n               OpSelectionMerge %14874 None\n               OpBranchConditional %15139 %11064 %14874\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22649 %749\n      %15335 = OpShiftRightLogical %v4uint %22649 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %14874\n      %14874 = OpLabel\n      %10924 = OpPhi %v4uint %22649 %13411 %10728 %11064\n               OpSelectionMerge %24688 DontFlatten\n               OpBranchConditional %17270 %21993 %7205\n      %21993 = OpLabel\n               OpBranch %24688\n       %7205 = OpLabel\n               OpBranch %24688\n      %24688 = OpLabel\n      %11377 = OpPhi %uint %uint_32 %21993 %uint_16 %7205\n      %18622 = OpIAdd %uint %18621 %11377\n      %15699 = OpShiftRightLogical %uint %18622 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15699\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %14875 None\n               OpBranchConditional %22150 %10584 %14875\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %14875\n      %14875 = OpLabel\n      %10925 = OpPhi %v4uint %14608 %24688 %16377 %10584\n               OpSelectionMerge %11720 None\n               OpBranchConditional %15139 %11065 %11720\n      %11065 = OpLabel\n      %24088 = OpShiftLeftLogical %v4uint %10925 %749\n      %15336 = OpShiftRightLogical %v4uint %10925 %749\n      %10729 = OpBitwiseOr %v4uint %24088 %15336\n               OpBranch %11720\n      %11720 = OpLabel\n      %19545 = OpPhi %v4uint %10925 %14875 %10729 %11065\n      %24377 = OpCompositeExtract %uint %10924 0\n      %15487 = OpShiftLeftLogical %uint %24377 %uint_3\n       %6481 = OpShiftRightLogical %uint %24377 %uint_13\n      %17264 = OpCompositeConstruct %v2uint %15487 %6481\n       %6430 = OpBitwiseAnd %v2uint %17264 %993\n      %20543 = OpShiftLeftLogical %uint %24377 %uint_7\n      %24164 = OpShiftRightLogical %uint %24377 %uint_9\n      %17283 = OpCompositeConstruct %v2uint %20543 %24164\n       %6295 = OpBitwiseAnd %v2uint %17283 %1015\n      %14170 = OpBitwiseOr %v2uint %6430 %6295\n      %23688 = OpShiftLeftLogical %uint %24377 %uint_12\n      %22551 = OpShiftRightLogical %uint %24377 %uint_4\n      %17285 = OpCompositeConstruct %v2uint %23688 %22551\n       %6257 = OpBitwiseAnd %v2uint %17285 %2547\n      %14611 = OpBitwiseOr %v2uint %14170 %6257\n      %22361 = OpShiftRightLogical %v2uint %14611 %1912\n       %6347 = OpBitwiseAnd %v2uint %22361 %503\n      %16454 = OpBitwiseOr %v2uint %14611 %6347\n      %22362 = OpShiftRightLogical %v2uint %16454 %1933\n      %23271 = OpBitwiseAnd %v2uint %22362 %78\n      %16875 = OpBitwiseOr %v2uint %16454 %23271\n      %20610 = OpCompositeExtract %uint %10924 2\n       %9060 = OpShiftLeftLogical %uint %20610 %uint_3\n       %6482 = OpShiftRightLogical %uint %20610 %uint_13\n      %17265 = OpCompositeConstruct %v2uint %9060 %6482\n       %6431 = OpBitwiseAnd %v2uint %17265 %993\n      %20544 = OpShiftLeftLogical %uint %20610 %uint_7\n      %24165 = OpShiftRightLogical %uint %20610 %uint_9\n      %17286 = OpCompositeConstruct %v2uint %20544 %24165\n       %6296 = OpBitwiseAnd %v2uint %17286 %1015\n      %14171 = OpBitwiseOr %v2uint %6431 %6296\n      %23689 = OpShiftLeftLogical %uint %20610 %uint_12\n      %22552 = OpShiftRightLogical %uint %20610 %uint_4\n      %17287 = OpCompositeConstruct %v2uint %23689 %22552\n       %6258 = OpBitwiseAnd %v2uint %17287 %2547\n      %14612 = OpBitwiseOr %v2uint %14171 %6258\n      %22363 = OpShiftRightLogical %v2uint %14612 %1912\n       %6348 = OpBitwiseAnd %v2uint %22363 %503\n      %16455 = OpBitwiseOr %v2uint %14612 %6348\n      %22364 = OpShiftRightLogical %v2uint %16455 %1933\n      %23272 = OpBitwiseAnd %v2uint %22364 %78\n      %14690 = OpBitwiseOr %v2uint %16455 %23272\n      %19287 = OpCompositeExtract %uint %16875 0\n      %23730 = OpCompositeExtract %uint %16875 1\n       %7660 = OpCompositeExtract %uint %14690 0\n       %9845 = OpCompositeExtract %uint %14690 1\n       %8983 = OpCompositeExtract %uint %19545 0\n      %12061 = OpShiftLeftLogical %uint %8983 %uint_3\n       %6483 = OpShiftRightLogical %uint %8983 %uint_13\n      %17266 = OpCompositeConstruct %v2uint %12061 %6483\n       %6432 = OpBitwiseAnd %v2uint %17266 %993\n      %20545 = OpShiftLeftLogical %uint %8983 %uint_7\n      %24166 = OpShiftRightLogical %uint %8983 %uint_9\n      %17288 = OpCompositeConstruct %v2uint %20545 %24166\n       %6297 = OpBitwiseAnd %v2uint %17288 %1015\n      %14172 = OpBitwiseOr %v2uint %6432 %6297\n      %23690 = OpShiftLeftLogical %uint %8983 %uint_12\n      %22553 = OpShiftRightLogical %uint %8983 %uint_4\n      %17289 = OpCompositeConstruct %v2uint %23690 %22553\n       %6259 = OpBitwiseAnd %v2uint %17289 %2547\n      %14613 = OpBitwiseOr %v2uint %14172 %6259\n      %22365 = OpShiftRightLogical %v2uint %14613 %1912\n       %6349 = OpBitwiseAnd %v2uint %22365 %503\n      %16456 = OpBitwiseOr %v2uint %14613 %6349\n      %22366 = OpShiftRightLogical %v2uint %16456 %1933\n      %23273 = OpBitwiseAnd %v2uint %22366 %78\n      %16876 = OpBitwiseOr %v2uint %16456 %23273\n      %20611 = OpCompositeExtract %uint %19545 2\n       %9061 = OpShiftLeftLogical %uint %20611 %uint_3\n       %6484 = OpShiftRightLogical %uint %20611 %uint_13\n      %17267 = OpCompositeConstruct %v2uint %9061 %6484\n       %6433 = OpBitwiseAnd %v2uint %17267 %993\n      %20546 = OpShiftLeftLogical %uint %20611 %uint_7\n      %24167 = OpShiftRightLogical %uint %20611 %uint_9\n      %17290 = OpCompositeConstruct %v2uint %20546 %24167\n       %6298 = OpBitwiseAnd %v2uint %17290 %1015\n      %14173 = OpBitwiseOr %v2uint %6433 %6298\n      %23691 = OpShiftLeftLogical %uint %20611 %uint_12\n      %22554 = OpShiftRightLogical %uint %20611 %uint_4\n      %17291 = OpCompositeConstruct %v2uint %23691 %22554\n       %6260 = OpBitwiseAnd %v2uint %17291 %2547\n      %14614 = OpBitwiseOr %v2uint %14173 %6260\n      %22367 = OpShiftRightLogical %v2uint %14614 %1912\n       %6350 = OpBitwiseAnd %v2uint %22367 %503\n      %16457 = OpBitwiseOr %v2uint %14614 %6350\n      %22368 = OpShiftRightLogical %v2uint %16457 %1933\n      %23274 = OpBitwiseAnd %v2uint %22368 %78\n      %14691 = OpBitwiseOr %v2uint %16457 %23274\n      %19288 = OpCompositeExtract %uint %16876 0\n      %23731 = OpCompositeExtract %uint %16876 1\n       %7641 = OpCompositeExtract %uint %14691 0\n       %7814 = OpCompositeExtract %uint %14691 1\n      %17869 = OpCompositeConstruct %v4uint %19287 %7660 %19288 %7641\n      %18392 = OpCompositeConstruct %v4uint %23730 %9845 %23731 %7814\n      %10135 = OpULessThanEqual %v4bool %17869 %18392\n      %15514 = OpCompositeExtract %uint %10924 1\n      %18092 = OpCompositeExtract %uint %10924 3\n       %7642 = OpCompositeExtract %uint %19545 1\n      %10075 = OpCompositeExtract %uint %19545 3\n      %16695 = OpCompositeConstruct %v4uint %15514 %18092 %7642 %10075\n       %8717 = OpBitwiseAnd %v4uint %16695 %2878\n      %21844 = OpShiftLeftLogical %v4uint %8717 %2950\n      %20654 = OpBitwiseAnd %v4uint %16695 %2860\n      %16599 = OpShiftRightLogical %v4uint %20654 %2950\n      %24000 = OpBitwiseOr %v4uint %21844 %16599\n      %19618 = OpBitwiseAnd %v4uint %24000 %2860\n      %20480 = OpShiftRightLogical %v4uint %19618 %2950\n      %15729 = OpBitwiseXor %v4uint %24000 %20480\n      %10273 = OpNot %v4uint %16695\n      %15294 = OpBitwiseAnd %v4uint %10273 %2878\n      %21767 = OpShiftLeftLogical %v4uint %15294 %2950\n      %15087 = OpBitwiseXor %v4uint %10273 %21767\n      %10284 = OpSelect %v4uint %10135 %15087 %15729\n               OpBranch %11625\n      %11625 = OpLabel\n      %11175 = OpPhi %v4uint %10284 %11720 %10206 %19902\n      %13033 = OpPhi %uint %14582 %11720 %7437 %19902\n       %8038 = OpPhi %uint %uint_0 %11720 %22028 %19902\n      %14719 = OpULessThan %bool %8038 %uint_4\n               OpLoopMerge %6980 %19902 Unroll\n               OpBranchConditional %14719 %18818 %6980\n      %18818 = OpLabel\n      %10969 = OpINotEqual %bool %8038 %uint_0\n               OpSelectionMerge %15645 None\n               OpBranchConditional %10969 %10634 %15645\n      %10634 = OpLabel\n      %11099 = OpCompositeExtract %uint %17344 1\n      %12762 = OpIAdd %uint %11099 %8038\n      %14740 = OpUGreaterThanEqual %bool %12762 %6594\n               OpSelectionMerge %8041 None\n               OpBranchConditional %14740 %21994 %8041\n      %21994 = OpLabel\n               OpBranch %6980\n       %8041 = OpLabel\n      %12491 = OpIAdd %uint %13033 %22412\n      %24752 = OpShiftRightLogical %v4uint %11175 %317\n               OpBranch %15645\n      %15645 = OpLabel\n      %10206 = OpPhi %v4uint %11175 %18818 %24752 %8041\n       %7437 = OpPhi %uint %13033 %18818 %12491 %8041\n      %10159 = OpShiftRightLogical %uint %7437 %int_4\n      %24869 = OpCompositeExtract %bool %10135 0\n               OpSelectionMerge %11416 None\n               OpBranchConditional %24869 %9722 %16061\n       %9722 = OpLabel\n      %19783 = OpCompositeExtract %uint %10206 0\n      %20234 = OpCompositeConstruct %v4uint %19783 %19783 %19783 %19783\n       %8760 = OpShiftRightLogical %v4uint %20234 %77\n      %24376 = OpBitwiseAnd %v4uint %8760 %2950\n      %19502 = OpCompositeConstruct %v4uint %19287 %19287 %19287 %19287\n      %22618 = OpIMul %v4uint %24376 %19502\n      %16105 = OpShiftRightLogical %v4uint %20234 %131\n      %14960 = OpBitwiseAnd %v4uint %16105 %2950\n      %18248 = OpCompositeConstruct %v4uint %23730 %23730 %23730 %23730\n      %14965 = OpIMul %v4uint %14960 %18248\n      %12407 = OpIAdd %v4uint %22618 %14965\n      %14443 = OpBitwiseAnd %uint %19783 %uint_2863311530\n      %23420 = OpShiftRightLogical %uint %14443 %uint_1\n       %9130 = OpBitwiseAnd %uint %19783 %23420\n       %8871 = OpCompositeConstruct %v4uint %9130 %9130 %9130 %9130\n       %9633 = OpShiftRightLogical %v4uint %8871 %77\n      %24095 = OpBitwiseAnd %v4uint %9633 %2950\n      %18620 = OpBitwiseAnd %uint %19783 %uint_1431655765\n      %16298 = OpBitwiseOr %uint %18620 %23420\n      %20384 = OpBitwiseAnd %v4uint %12407 %929\n      %20712 = OpShiftRightLogical %v4uint %20384 %24095\n      %14082 = OpShiftLeftLogical %v4uint %20712 %749\n      %21749 = OpShiftRightLogical %v4uint %12407 %425\n      %21940 = OpBitwiseAnd %v4uint %21749 %929\n      %20267 = OpShiftRightLogical %v4uint %21940 %24095\n       %6334 = OpShiftLeftLogical %v4uint %20267 %317\n      %16750 = OpIAdd %v4uint %14082 %6334\n      %22334 = OpShiftRightLogical %v4uint %12407 %965\n      %11721 = OpShiftRightLogical %v4uint %22334 %24095\n      %17899 = OpIAdd %v4uint %16750 %11721\n       %8979 = OpCompositeConstruct %v4uint %16298 %16298 %16298 %16298\n      %18597 = OpShiftRightLogical %v4uint %8979 %77\n      %15304 = OpBitwiseAnd %v4uint %18597 %2950\n       %8308 = OpIMul %v4uint %15304 %2599\n      %20044 = OpIAdd %v4uint %17899 %8308\n               OpBranch %11416\n      %16061 = OpLabel\n      %18350 = OpCompositeExtract %uint %10206 0\n      %22865 = OpNot %uint %18350\n      %10814 = OpCompositeConstruct %v4uint %22865 %22865 %22865 %22865\n      %24021 = OpShiftRightLogical %v4uint %10814 %77\n      %24378 = OpBitwiseAnd %v4uint %24021 %47\n      %17336 = OpCompositeConstruct %v4uint %19287 %19287 %19287 %19287\n      %23174 = OpIMul %v4uint %24378 %17336\n      %25211 = OpCompositeConstruct %v4uint %18350 %18350 %18350 %18350\n      %14378 = OpShiftRightLogical %v4uint %25211 %77\n      %24379 = OpBitwiseAnd %v4uint %14378 %47\n      %18249 = OpCompositeConstruct %v4uint %23730 %23730 %23730 %23730\n      %14966 = OpIMul %v4uint %24379 %18249\n      %11267 = OpIAdd %v4uint %23174 %14966\n      %24766 = OpBitwiseAnd %v4uint %11267 %929\n       %9225 = OpUDiv %v4uint %24766 %47\n      %17608 = OpShiftLeftLogical %v4uint %9225 %749\n      %10961 = OpShiftRightLogical %v4uint %11267 %425\n      %13249 = OpBitwiseAnd %v4uint %10961 %929\n      %17312 = OpUDiv %v4uint %13249 %47\n      %16994 = OpShiftLeftLogical %v4uint %17312 %317\n       %6318 = OpBitwiseOr %v4uint %17608 %16994\n      %15344 = OpShiftRightLogical %v4uint %11267 %965\n      %24032 = OpUDiv %v4uint %15344 %47\n       %9042 = OpBitwiseOr %v4uint %6318 %24032\n      %17791 = OpBitwiseOr %v4uint %9042 %2599\n               OpBranch %11416\n      %11416 = OpLabel\n      %19767 = OpPhi %v4uint %20044 %9722 %17791 %16061\n      %24825 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %10159\n               OpStore %24825 %19767\n       %8572 = OpIAdd %uint %7437 %uint_16\n       %7400 = OpShiftRightLogical %uint %8572 %int_4\n      %23835 = OpCompositeExtract %bool %10135 1\n               OpSelectionMerge %11417 None\n               OpBranchConditional %23835 %9723 %16062\n       %9723 = OpLabel\n      %19784 = OpCompositeExtract %uint %10206 1\n      %20235 = OpCompositeConstruct %v4uint %19784 %19784 %19784 %19784\n       %8761 = OpShiftRightLogical %v4uint %20235 %77\n      %24380 = OpBitwiseAnd %v4uint %8761 %2950\n      %19503 = OpCompositeConstruct %v4uint %7660 %7660 %7660 %7660\n      %22619 = OpIMul %v4uint %24380 %19503\n      %16106 = OpShiftRightLogical %v4uint %20235 %131\n      %14961 = OpBitwiseAnd %v4uint %16106 %2950\n      %18250 = OpCompositeConstruct %v4uint %9845 %9845 %9845 %9845\n      %14967 = OpIMul %v4uint %14961 %18250\n      %12408 = OpIAdd %v4uint %22619 %14967\n      %14444 = OpBitwiseAnd %uint %19784 %uint_2863311530\n      %23421 = OpShiftRightLogical %uint %14444 %uint_1\n       %9131 = OpBitwiseAnd %uint %19784 %23421\n       %8872 = OpCompositeConstruct %v4uint %9131 %9131 %9131 %9131\n       %9634 = OpShiftRightLogical %v4uint %8872 %77\n      %24096 = OpBitwiseAnd %v4uint %9634 %2950\n      %18623 = OpBitwiseAnd %uint %19784 %uint_1431655765\n      %16299 = OpBitwiseOr %uint %18623 %23421\n      %20385 = OpBitwiseAnd %v4uint %12408 %929\n      %20713 = OpShiftRightLogical %v4uint %20385 %24096\n      %14083 = OpShiftLeftLogical %v4uint %20713 %749\n      %21750 = OpShiftRightLogical %v4uint %12408 %425\n      %21941 = OpBitwiseAnd %v4uint %21750 %929\n      %20268 = OpShiftRightLogical %v4uint %21941 %24096\n       %6335 = OpShiftLeftLogical %v4uint %20268 %317\n      %16751 = OpIAdd %v4uint %14083 %6335\n      %22335 = OpShiftRightLogical %v4uint %12408 %965\n      %11722 = OpShiftRightLogical %v4uint %22335 %24096\n      %17900 = OpIAdd %v4uint %16751 %11722\n       %8980 = OpCompositeConstruct %v4uint %16299 %16299 %16299 %16299\n      %18598 = OpShiftRightLogical %v4uint %8980 %77\n      %15305 = OpBitwiseAnd %v4uint %18598 %2950\n       %8309 = OpIMul %v4uint %15305 %2599\n      %20045 = OpIAdd %v4uint %17900 %8309\n               OpBranch %11417\n      %16062 = OpLabel\n      %18351 = OpCompositeExtract %uint %10206 1\n      %22866 = OpNot %uint %18351\n      %10815 = OpCompositeConstruct %v4uint %22866 %22866 %22866 %22866\n      %24022 = OpShiftRightLogical %v4uint %10815 %77\n      %24381 = OpBitwiseAnd %v4uint %24022 %47\n      %17337 = OpCompositeConstruct %v4uint %7660 %7660 %7660 %7660\n      %23175 = OpIMul %v4uint %24381 %17337\n      %25212 = OpCompositeConstruct %v4uint %18351 %18351 %18351 %18351\n      %14379 = OpShiftRightLogical %v4uint %25212 %77\n      %24382 = OpBitwiseAnd %v4uint %14379 %47\n      %18251 = OpCompositeConstruct %v4uint %9845 %9845 %9845 %9845\n      %14968 = OpIMul %v4uint %24382 %18251\n      %11268 = OpIAdd %v4uint %23175 %14968\n      %24767 = OpBitwiseAnd %v4uint %11268 %929\n       %9226 = OpUDiv %v4uint %24767 %47\n      %17609 = OpShiftLeftLogical %v4uint %9226 %749\n      %10962 = OpShiftRightLogical %v4uint %11268 %425\n      %13250 = OpBitwiseAnd %v4uint %10962 %929\n      %17313 = OpUDiv %v4uint %13250 %47\n      %16995 = OpShiftLeftLogical %v4uint %17313 %317\n       %6319 = OpBitwiseOr %v4uint %17609 %16995\n      %15345 = OpShiftRightLogical %v4uint %11268 %965\n      %24033 = OpUDiv %v4uint %15345 %47\n       %9043 = OpBitwiseOr %v4uint %6319 %24033\n      %17792 = OpBitwiseOr %v4uint %9043 %2599\n               OpBranch %11417\n      %11417 = OpLabel\n      %19768 = OpPhi %v4uint %20045 %9723 %17792 %16062\n      %24826 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %7400\n               OpStore %24826 %19768\n       %8573 = OpIAdd %uint %7437 %uint_32\n       %7401 = OpShiftRightLogical %uint %8573 %int_4\n      %23836 = OpCompositeExtract %bool %10135 2\n               OpSelectionMerge %11418 None\n               OpBranchConditional %23836 %9724 %16063\n       %9724 = OpLabel\n      %19785 = OpCompositeExtract %uint %10206 2\n      %20236 = OpCompositeConstruct %v4uint %19785 %19785 %19785 %19785\n       %8762 = OpShiftRightLogical %v4uint %20236 %77\n      %24383 = OpBitwiseAnd %v4uint %8762 %2950\n      %19504 = OpCompositeConstruct %v4uint %19288 %19288 %19288 %19288\n      %22620 = OpIMul %v4uint %24383 %19504\n      %16107 = OpShiftRightLogical %v4uint %20236 %131\n      %14962 = OpBitwiseAnd %v4uint %16107 %2950\n      %18252 = OpCompositeConstruct %v4uint %23731 %23731 %23731 %23731\n      %14969 = OpIMul %v4uint %14962 %18252\n      %12409 = OpIAdd %v4uint %22620 %14969\n      %14445 = OpBitwiseAnd %uint %19785 %uint_2863311530\n      %23422 = OpShiftRightLogical %uint %14445 %uint_1\n       %9132 = OpBitwiseAnd %uint %19785 %23422\n       %8873 = OpCompositeConstruct %v4uint %9132 %9132 %9132 %9132\n       %9635 = OpShiftRightLogical %v4uint %8873 %77\n      %24097 = OpBitwiseAnd %v4uint %9635 %2950\n      %18624 = OpBitwiseAnd %uint %19785 %uint_1431655765\n      %16300 = OpBitwiseOr %uint %18624 %23422\n      %20386 = OpBitwiseAnd %v4uint %12409 %929\n      %20714 = OpShiftRightLogical %v4uint %20386 %24097\n      %14084 = OpShiftLeftLogical %v4uint %20714 %749\n      %21751 = OpShiftRightLogical %v4uint %12409 %425\n      %21942 = OpBitwiseAnd %v4uint %21751 %929\n      %20269 = OpShiftRightLogical %v4uint %21942 %24097\n       %6336 = OpShiftLeftLogical %v4uint %20269 %317\n      %16752 = OpIAdd %v4uint %14084 %6336\n      %22336 = OpShiftRightLogical %v4uint %12409 %965\n      %11723 = OpShiftRightLogical %v4uint %22336 %24097\n      %17901 = OpIAdd %v4uint %16752 %11723\n       %8981 = OpCompositeConstruct %v4uint %16300 %16300 %16300 %16300\n      %18599 = OpShiftRightLogical %v4uint %8981 %77\n      %15306 = OpBitwiseAnd %v4uint %18599 %2950\n       %8310 = OpIMul %v4uint %15306 %2599\n      %20046 = OpIAdd %v4uint %17901 %8310\n               OpBranch %11418\n      %16063 = OpLabel\n      %18352 = OpCompositeExtract %uint %10206 2\n      %22867 = OpNot %uint %18352\n      %10816 = OpCompositeConstruct %v4uint %22867 %22867 %22867 %22867\n      %24023 = OpShiftRightLogical %v4uint %10816 %77\n      %24384 = OpBitwiseAnd %v4uint %24023 %47\n      %17338 = OpCompositeConstruct %v4uint %19288 %19288 %19288 %19288\n      %23176 = OpIMul %v4uint %24384 %17338\n      %25213 = OpCompositeConstruct %v4uint %18352 %18352 %18352 %18352\n      %14380 = OpShiftRightLogical %v4uint %25213 %77\n      %24385 = OpBitwiseAnd %v4uint %14380 %47\n      %18253 = OpCompositeConstruct %v4uint %23731 %23731 %23731 %23731\n      %14970 = OpIMul %v4uint %24385 %18253\n      %11269 = OpIAdd %v4uint %23176 %14970\n      %24768 = OpBitwiseAnd %v4uint %11269 %929\n       %9227 = OpUDiv %v4uint %24768 %47\n      %17610 = OpShiftLeftLogical %v4uint %9227 %749\n      %10963 = OpShiftRightLogical %v4uint %11269 %425\n      %13251 = OpBitwiseAnd %v4uint %10963 %929\n      %17314 = OpUDiv %v4uint %13251 %47\n      %16996 = OpShiftLeftLogical %v4uint %17314 %317\n       %6320 = OpBitwiseOr %v4uint %17610 %16996\n      %15346 = OpShiftRightLogical %v4uint %11269 %965\n      %24034 = OpUDiv %v4uint %15346 %47\n       %9044 = OpBitwiseOr %v4uint %6320 %24034\n      %17793 = OpBitwiseOr %v4uint %9044 %2599\n               OpBranch %11418\n      %11418 = OpLabel\n      %19769 = OpPhi %v4uint %20046 %9724 %17793 %16063\n      %24827 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %7401\n               OpStore %24827 %19769\n       %8574 = OpIAdd %uint %7437 %uint_48\n       %7402 = OpShiftRightLogical %uint %8574 %int_4\n      %23837 = OpCompositeExtract %bool %10135 3\n               OpSelectionMerge %11419 None\n               OpBranchConditional %23837 %9725 %16064\n       %9725 = OpLabel\n      %19786 = OpCompositeExtract %uint %10206 3\n      %20237 = OpCompositeConstruct %v4uint %19786 %19786 %19786 %19786\n       %8763 = OpShiftRightLogical %v4uint %20237 %77\n      %24386 = OpBitwiseAnd %v4uint %8763 %2950\n      %19505 = OpCompositeConstruct %v4uint %7641 %7641 %7641 %7641\n      %22621 = OpIMul %v4uint %24386 %19505\n      %16108 = OpShiftRightLogical %v4uint %20237 %131\n      %14963 = OpBitwiseAnd %v4uint %16108 %2950\n      %18254 = OpCompositeConstruct %v4uint %7814 %7814 %7814 %7814\n      %14971 = OpIMul %v4uint %14963 %18254\n      %12410 = OpIAdd %v4uint %22621 %14971\n      %14446 = OpBitwiseAnd %uint %19786 %uint_2863311530\n      %23423 = OpShiftRightLogical %uint %14446 %uint_1\n       %9133 = OpBitwiseAnd %uint %19786 %23423\n       %8874 = OpCompositeConstruct %v4uint %9133 %9133 %9133 %9133\n       %9636 = OpShiftRightLogical %v4uint %8874 %77\n      %24098 = OpBitwiseAnd %v4uint %9636 %2950\n      %18625 = OpBitwiseAnd %uint %19786 %uint_1431655765\n      %16301 = OpBitwiseOr %uint %18625 %23423\n      %20387 = OpBitwiseAnd %v4uint %12410 %929\n      %20715 = OpShiftRightLogical %v4uint %20387 %24098\n      %14085 = OpShiftLeftLogical %v4uint %20715 %749\n      %21752 = OpShiftRightLogical %v4uint %12410 %425\n      %21943 = OpBitwiseAnd %v4uint %21752 %929\n      %20270 = OpShiftRightLogical %v4uint %21943 %24098\n       %6337 = OpShiftLeftLogical %v4uint %20270 %317\n      %16753 = OpIAdd %v4uint %14085 %6337\n      %22337 = OpShiftRightLogical %v4uint %12410 %965\n      %11724 = OpShiftRightLogical %v4uint %22337 %24098\n      %17902 = OpIAdd %v4uint %16753 %11724\n       %8982 = OpCompositeConstruct %v4uint %16301 %16301 %16301 %16301\n      %18600 = OpShiftRightLogical %v4uint %8982 %77\n      %15307 = OpBitwiseAnd %v4uint %18600 %2950\n       %8311 = OpIMul %v4uint %15307 %2599\n      %20047 = OpIAdd %v4uint %17902 %8311\n               OpBranch %11419\n      %16064 = OpLabel\n      %18353 = OpCompositeExtract %uint %10206 3\n      %22868 = OpNot %uint %18353\n      %10817 = OpCompositeConstruct %v4uint %22868 %22868 %22868 %22868\n      %24024 = OpShiftRightLogical %v4uint %10817 %77\n      %24387 = OpBitwiseAnd %v4uint %24024 %47\n      %17339 = OpCompositeConstruct %v4uint %7641 %7641 %7641 %7641\n      %23177 = OpIMul %v4uint %24387 %17339\n      %25214 = OpCompositeConstruct %v4uint %18353 %18353 %18353 %18353\n      %14381 = OpShiftRightLogical %v4uint %25214 %77\n      %24388 = OpBitwiseAnd %v4uint %14381 %47\n      %18255 = OpCompositeConstruct %v4uint %7814 %7814 %7814 %7814\n      %14972 = OpIMul %v4uint %24388 %18255\n      %11270 = OpIAdd %v4uint %23177 %14972\n      %24769 = OpBitwiseAnd %v4uint %11270 %929\n       %9228 = OpUDiv %v4uint %24769 %47\n      %17611 = OpShiftLeftLogical %v4uint %9228 %749\n      %10964 = OpShiftRightLogical %v4uint %11270 %425\n      %13252 = OpBitwiseAnd %v4uint %10964 %929\n      %17315 = OpUDiv %v4uint %13252 %47\n      %16997 = OpShiftLeftLogical %v4uint %17315 %317\n       %6321 = OpBitwiseOr %v4uint %17611 %16997\n      %15347 = OpShiftRightLogical %v4uint %11270 %965\n      %24035 = OpUDiv %v4uint %15347 %47\n       %9045 = OpBitwiseOr %v4uint %6321 %24035\n      %17794 = OpBitwiseOr %v4uint %9045 %2599\n               OpBranch %11419\n      %11419 = OpLabel\n      %19770 = OpPhi %v4uint %20047 %9725 %17794 %16064\n       %8053 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %7402\n               OpStore %8053 %19770\n               OpBranch %19902\n      %19902 = OpLabel\n      %22028 = OpIAdd %uint %8038 %int_1\n               OpBranch %11625\n       %6980 = OpLabel\n               OpBranch %14903\n      %14903 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_dxt1_rgba8_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x0000627F, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000017, 0x0000000B, 0x00000004, 0x00040017, 0x00000011,\n    0x0000000B, 0x00000002, 0x00040015, 0x0000000C, 0x00000020, 0x00000001,\n    0x00040017, 0x00000012, 0x0000000C, 0x00000002, 0x00040017, 0x00000016,\n    0x0000000C, 0x00000003, 0x00020014, 0x00000009, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A13, 0x00000003,\n    0x0004002B, 0x0000000B, 0x00000A31, 0x0000000D, 0x0004002B, 0x0000000B,\n    0x0000012F, 0x000000F8, 0x0004002B, 0x0000000B, 0x00000A1F, 0x00000007,\n    0x0004002B, 0x0000000B, 0x00000A25, 0x00000009, 0x0004002B, 0x0000000B,\n    0x00000B47, 0x0003F000, 0x0004002B, 0x0000000B, 0x00000A2E, 0x0000000C,\n    0x0004002B, 0x0000000B, 0x00000A16, 0x00000004, 0x0004002B, 0x0000000B,\n    0x000007FF, 0x0F800000, 0x0004002B, 0x0000000B, 0x00000A19, 0x00000005,\n    0x0004002B, 0x0000000B, 0x000000E9, 0x00700007, 0x0004002B, 0x0000000B,\n    0x00000A1C, 0x00000006, 0x0004002B, 0x0000000B, 0x00000AC1, 0x00000C00,\n    0x0004002B, 0x0000000B, 0x00000A09, 0x55555555, 0x0004002B, 0x0000000B,\n    0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B, 0x00000A08, 0xAAAAAAAA,\n    0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000, 0x0004002B, 0x0000000B,\n    0x00000A10, 0x00000002, 0x0007002C, 0x00000017, 0x0000004D, 0x00000A0A,\n    0x00000A10, 0x00000A16, 0x00000A1C, 0x0004002B, 0x0000000B, 0x00000A44,\n    0x000003FF, 0x0004002B, 0x0000000B, 0x00000A3A, 0x00000010, 0x0004002B,\n    0x0000000B, 0x00000A28, 0x0000000A, 0x0004002B, 0x0000000B, 0x00000A22,\n    0x00000008, 0x0004002B, 0x0000000B, 0x00000A46, 0x00000014, 0x0007002C,\n    0x00000017, 0x00000083, 0x00000A0D, 0x00000A13, 0x00000A19, 0x00000A1F,\n    0x0004002B, 0x0000000B, 0x00000580, 0xFF000000, 0x0004002B, 0x0000000B,\n    0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00,\n    0x0004002B, 0x0000000C, 0x00000A17, 0x00000004, 0x0004002B, 0x0000000C,\n    0x00000A1D, 0x00000006, 0x0004002B, 0x0000000C, 0x00000A2C, 0x0000000B,\n    0x0004002B, 0x0000000C, 0x00000A38, 0x0000000F, 0x0004002B, 0x0000000C,\n    0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C, 0x00000A1A, 0x00000005,\n    0x0004002B, 0x0000000C, 0x00000A20, 0x00000007, 0x0004002B, 0x0000000C,\n    0x00000A23, 0x00000008, 0x0004002B, 0x0000000C, 0x00000A2F, 0x0000000C,\n    0x0004002B, 0x0000000C, 0x00000A14, 0x00000003, 0x0004002B, 0x0000000C,\n    0x00000A11, 0x00000002, 0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000,\n    0x000A001E, 0x00000489, 0x0000000B, 0x0000000B, 0x0000000B, 0x0000000B,\n    0x00000014, 0x0000000B, 0x0000000B, 0x0000000B, 0x00040020, 0x00000706,\n    0x00000009, 0x00000489, 0x0004003B, 0x00000706, 0x00000CE9, 0x00000009,\n    0x00040020, 0x00000288, 0x00000009, 0x0000000B, 0x00040020, 0x00000291,\n    0x00000009, 0x00000014, 0x00040020, 0x00000292, 0x00000001, 0x00000014,\n    0x0004003B, 0x00000292, 0x00000F48, 0x00000001, 0x0006002C, 0x00000014,\n    0x00000A24, 0x00000A10, 0x00000A0A, 0x00000A0A, 0x00040017, 0x0000000F,\n    0x00000009, 0x00000002, 0x0006002C, 0x00000014, 0x00000A3B, 0x00000A10,\n    0x00000A10, 0x00000A0A, 0x0003001D, 0x000007DC, 0x00000017, 0x0003001E,\n    0x000007B4, 0x000007DC, 0x00040020, 0x00000A32, 0x00000002, 0x000007B4,\n    0x0004003B, 0x00000A32, 0x0000107A, 0x00000002, 0x00040020, 0x00000294,\n    0x00000002, 0x00000017, 0x00040017, 0x00000013, 0x00000009, 0x00000004,\n    0x0003001D, 0x000007DD, 0x00000017, 0x0003001E, 0x000007B5, 0x000007DD,\n    0x00040020, 0x00000A33, 0x00000002, 0x000007B5, 0x0004003B, 0x00000A33,\n    0x0000140E, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020,\n    0x0004002B, 0x0000000B, 0x00000A9A, 0x00000030, 0x0006002C, 0x00000014,\n    0x00000BC3, 0x00000A16, 0x00000A6A, 0x00000A0D, 0x0007002C, 0x00000017,\n    0x000009CE, 0x000008A6, 0x000008A6, 0x000008A6, 0x000008A6, 0x0007002C,\n    0x00000017, 0x0000013D, 0x00000A22, 0x00000A22, 0x00000A22, 0x00000A22,\n    0x0007002C, 0x00000017, 0x0000072E, 0x000005FD, 0x000005FD, 0x000005FD,\n    0x000005FD, 0x0007002C, 0x00000017, 0x000002ED, 0x00000A3A, 0x00000A3A,\n    0x00000A3A, 0x00000A3A, 0x0005002C, 0x00000011, 0x000003E1, 0x0000012F,\n    0x0000012F, 0x0005002C, 0x00000011, 0x000003F7, 0x00000B47, 0x00000B47,\n    0x0005002C, 0x00000011, 0x000009F3, 0x000007FF, 0x000007FF, 0x0005002C,\n    0x00000011, 0x00000778, 0x00000A19, 0x00000A19, 0x0005002C, 0x00000011,\n    0x000001F7, 0x000000E9, 0x000000E9, 0x0005002C, 0x00000011, 0x0000078D,\n    0x00000A1C, 0x00000A1C, 0x0005002C, 0x00000011, 0x0000004E, 0x00000AC1,\n    0x00000AC1, 0x0007002C, 0x00000017, 0x00000B3E, 0x00000A09, 0x00000A09,\n    0x00000A09, 0x00000A09, 0x0007002C, 0x00000017, 0x00000B86, 0x00000A0D,\n    0x00000A0D, 0x00000A0D, 0x00000A0D, 0x0007002C, 0x00000017, 0x00000B2C,\n    0x00000A08, 0x00000A08, 0x00000A08, 0x00000A08, 0x0007002C, 0x00000017,\n    0x000003A1, 0x00000A44, 0x00000A44, 0x00000A44, 0x00000A44, 0x0007002C,\n    0x00000017, 0x000001A9, 0x00000A28, 0x00000A28, 0x00000A28, 0x00000A28,\n    0x0007002C, 0x00000017, 0x000003C5, 0x00000A46, 0x00000A46, 0x00000A46,\n    0x00000A46, 0x0007002C, 0x00000017, 0x00000A27, 0x00000580, 0x00000580,\n    0x00000580, 0x00000580, 0x0007002C, 0x00000017, 0x0000002F, 0x00000A13,\n    0x00000A13, 0x00000A13, 0x00000A13, 0x00050036, 0x00000008, 0x0000161F,\n    0x00000000, 0x00000502, 0x000200F8, 0x00003B06, 0x000300F7, 0x00003A37,\n    0x00000000, 0x000300FB, 0x00000A0A, 0x00002E68, 0x000200F8, 0x00002E68,\n    0x00050041, 0x00000288, 0x000060D7, 0x00000CE9, 0x00000A0B, 0x0004003D,\n    0x0000000B, 0x00003526, 0x000060D7, 0x000500C7, 0x0000000B, 0x00005FDC,\n    0x00003526, 0x00000A0D, 0x000500AB, 0x00000009, 0x00004376, 0x00005FDC,\n    0x00000A0A, 0x000500C7, 0x0000000B, 0x00003028, 0x00003526, 0x00000A10,\n    0x000500AB, 0x00000009, 0x00004384, 0x00003028, 0x00000A0A, 0x000500C2,\n    0x0000000B, 0x00001EB0, 0x00003526, 0x00000A10, 0x000500C7, 0x0000000B,\n    0x000061E2, 0x00001EB0, 0x00000A13, 0x00050041, 0x00000288, 0x0000492C,\n    0x00000CE9, 0x00000A0E, 0x0004003D, 0x0000000B, 0x00005EAC, 0x0000492C,\n    0x00050041, 0x00000288, 0x00004EBA, 0x00000CE9, 0x00000A11, 0x0004003D,\n    0x0000000B, 0x00005788, 0x00004EBA, 0x00050041, 0x00000288, 0x00004EBB,\n    0x00000CE9, 0x00000A14, 0x0004003D, 0x0000000B, 0x00005789, 0x00004EBB,\n    0x00050041, 0x00000291, 0x00004EBC, 0x00000CE9, 0x00000A17, 0x0004003D,\n    0x00000014, 0x0000578A, 0x00004EBC, 0x00050041, 0x00000288, 0x00004EBD,\n    0x00000CE9, 0x00000A1A, 0x0004003D, 0x0000000B, 0x0000578B, 0x00004EBD,\n    0x00050041, 0x00000288, 0x00004EBE, 0x00000CE9, 0x00000A1D, 0x0004003D,\n    0x0000000B, 0x0000578C, 0x00004EBE, 0x00050041, 0x00000288, 0x00004E6E,\n    0x00000CE9, 0x00000A20, 0x0004003D, 0x0000000B, 0x000019C2, 0x00004E6E,\n    0x0004003D, 0x00000014, 0x00002A0E, 0x00000F48, 0x000500C4, 0x00000014,\n    0x0000538B, 0x00002A0E, 0x00000A24, 0x0007004F, 0x00000011, 0x000042F0,\n    0x0000538B, 0x0000538B, 0x00000000, 0x00000001, 0x0007004F, 0x00000011,\n    0x0000242F, 0x0000578A, 0x0000578A, 0x00000000, 0x00000001, 0x000500AE,\n    0x0000000F, 0x00004288, 0x000042F0, 0x0000242F, 0x0004009A, 0x00000009,\n    0x00006067, 0x00004288, 0x000300F7, 0x000036C2, 0x00000002, 0x000400FA,\n    0x00006067, 0x000055E8, 0x000036C2, 0x000200F8, 0x000055E8, 0x000200F9,\n    0x00003A37, 0x000200F8, 0x000036C2, 0x000500C4, 0x00000014, 0x000043C0,\n    0x0000538B, 0x00000A3B, 0x0004007C, 0x00000016, 0x00003C81, 0x000043C0,\n    0x00050051, 0x0000000C, 0x000047A0, 0x00003C81, 0x00000000, 0x00050084,\n    0x0000000C, 0x00002492, 0x000047A0, 0x00000A17, 0x00050051, 0x0000000C,\n    0x000018DA, 0x00003C81, 0x00000002, 0x0004007C, 0x0000000C, 0x000038A9,\n    0x000019C2, 0x00050084, 0x0000000C, 0x00002C0F, 0x000018DA, 0x000038A9,\n    0x00050051, 0x0000000C, 0x000044BE, 0x00003C81, 0x00000001, 0x00050080,\n    0x0000000C, 0x000056D4, 0x00002C0F, 0x000044BE, 0x0004007C, 0x0000000C,\n    0x00005785, 0x0000578C, 0x00050084, 0x0000000C, 0x00005FD7, 0x000056D4,\n    0x00005785, 0x00050080, 0x0000000C, 0x00002042, 0x00002492, 0x00005FD7,\n    0x0004007C, 0x0000000B, 0x000028A4, 0x00002042, 0x00050080, 0x0000000B,\n    0x000038F6, 0x0000578B, 0x000028A4, 0x000400A8, 0x00000009, 0x00003014,\n    0x00004376, 0x000300F7, 0x00004A60, 0x00000002, 0x000400FA, 0x00003014,\n    0x0000260D, 0x0000426F, 0x000200F8, 0x0000260D, 0x00050051, 0x0000000B,\n    0x00004437, 0x0000538B, 0x00000000, 0x00050051, 0x0000000B, 0x00002BEE,\n    0x0000538B, 0x00000001, 0x00050051, 0x0000000B, 0x00004971, 0x0000538B,\n    0x00000002, 0x00050084, 0x0000000B, 0x000039EF, 0x00005789, 0x00004971,\n    0x00050080, 0x0000000B, 0x00004F62, 0x00002BEE, 0x000039EF, 0x00050084,\n    0x0000000B, 0x000054AC, 0x00005788, 0x00004F62, 0x00050080, 0x0000000B,\n    0x00004FAE, 0x00004437, 0x000054AC, 0x000500C4, 0x0000000B, 0x00002C67,\n    0x00004FAE, 0x00000A13, 0x000200F9, 0x00004A60, 0x000200F8, 0x0000426F,\n    0x000300F7, 0x00005BF0, 0x00000002, 0x000400FA, 0x00004384, 0x00005BE0,\n    0x00005F21, 0x000200F8, 0x00005BE0, 0x0004007C, 0x00000016, 0x0000277F,\n    0x0000538B, 0x000500C2, 0x0000000B, 0x00004C14, 0x00005788, 0x00000A1A,\n    0x000500C2, 0x0000000B, 0x0000497A, 0x00005789, 0x00000A17, 0x00050051,\n    0x0000000C, 0x00001A7E, 0x0000277F, 0x00000002, 0x000500C3, 0x0000000C,\n    0x00002F39, 0x00001A7E, 0x00000A11, 0x0004007C, 0x0000000C, 0x00005780,\n    0x0000497A, 0x00050084, 0x0000000C, 0x00001F02, 0x00002F39, 0x00005780,\n    0x00050051, 0x0000000C, 0x00006242, 0x0000277F, 0x00000001, 0x000500C3,\n    0x0000000C, 0x00004A6F, 0x00006242, 0x00000A17, 0x00050080, 0x0000000C,\n    0x00002B2C, 0x00001F02, 0x00004A6F, 0x0004007C, 0x0000000C, 0x00004202,\n    0x00004C14, 0x00050084, 0x0000000C, 0x00003A60, 0x00002B2C, 0x00004202,\n    0x00050051, 0x0000000C, 0x00006243, 0x0000277F, 0x00000000, 0x000500C3,\n    0x0000000C, 0x00004FC7, 0x00006243, 0x00000A1A, 0x00050080, 0x0000000C,\n    0x000049FC, 0x00003A60, 0x00004FC7, 0x000500C4, 0x0000000C, 0x0000225D,\n    0x000049FC, 0x00000A20, 0x000500C7, 0x0000000C, 0x00002CAA, 0x00001A7E,\n    0x00000A14, 0x000500C4, 0x0000000C, 0x00004CAE, 0x00002CAA, 0x00000A1A,\n    0x000500C3, 0x0000000C, 0x0000383E, 0x00006242, 0x00000A0E, 0x000500C7,\n    0x0000000C, 0x00005374, 0x0000383E, 0x00000A14, 0x000500C4, 0x0000000C,\n    0x000054CA, 0x00005374, 0x00000A14, 0x000500C5, 0x0000000C, 0x000042CE,\n    0x00004CAE, 0x000054CA, 0x000500C7, 0x0000000C, 0x000050D5, 0x00006243,\n    0x00000A20, 0x000500C5, 0x0000000C, 0x00003ADD, 0x000042CE, 0x000050D5,\n    0x000500C5, 0x0000000C, 0x000043B6, 0x0000225D, 0x00003ADD, 0x000500C4,\n    0x0000000C, 0x00005E50, 0x000043B6, 0x00000A13, 0x000500C3, 0x0000000C,\n    0x000032D7, 0x00006242, 0x00000A14, 0x000500C6, 0x0000000C, 0x000026C9,\n    0x000032D7, 0x00002F39, 0x000500C7, 0x0000000C, 0x00004199, 0x000026C9,\n    0x00000A0E, 0x000500C3, 0x0000000C, 0x00002590, 0x00006243, 0x00000A14,\n    0x000500C7, 0x0000000C, 0x0000505E, 0x00002590, 0x00000A14, 0x000500C4,\n    0x0000000C, 0x0000541D, 0x00004199, 0x00000A0E, 0x000500C6, 0x0000000C,\n    0x000022BA, 0x0000505E, 0x0000541D, 0x000500C7, 0x0000000C, 0x00005076,\n    0x00006242, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005228, 0x00005076,\n    0x00000A17, 0x000500C4, 0x0000000C, 0x00001997, 0x000022BA, 0x00000A1D,\n    0x000500C5, 0x0000000C, 0x000047FE, 0x00005228, 0x00001997, 0x000500C4,\n    0x0000000C, 0x00001C00, 0x00004199, 0x00000A2C, 0x000500C5, 0x0000000C,\n    0x00003C82, 0x000047FE, 0x00001C00, 0x000500C7, 0x0000000C, 0x000050AF,\n    0x00005E50, 0x00000A38, 0x000500C5, 0x0000000C, 0x00003C70, 0x00003C82,\n    0x000050AF, 0x000500C3, 0x0000000C, 0x00003745, 0x00005E50, 0x00000A17,\n    0x000500C7, 0x0000000C, 0x000018B8, 0x00003745, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x0000547E, 0x000018B8, 0x00000A1A, 0x000500C5, 0x0000000C,\n    0x000045A8, 0x00003C70, 0x0000547E, 0x000500C3, 0x0000000C, 0x00003A6E,\n    0x00005E50, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018B9, 0x00003A6E,\n    0x00000A20, 0x000500C4, 0x0000000C, 0x0000547F, 0x000018B9, 0x00000A23,\n    0x000500C5, 0x0000000C, 0x0000456F, 0x000045A8, 0x0000547F, 0x000500C3,\n    0x0000000C, 0x00003C88, 0x00005E50, 0x00000A23, 0x000500C4, 0x0000000C,\n    0x00002824, 0x00003C88, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B79,\n    0x0000456F, 0x00002824, 0x0004007C, 0x0000000B, 0x000041E5, 0x00003B79,\n    0x000200F9, 0x00005BF0, 0x000200F8, 0x00005F21, 0x0004007C, 0x00000012,\n    0x000059D8, 0x000042F0, 0x000500C2, 0x0000000B, 0x00005668, 0x00005788,\n    0x00000A1A, 0x00050051, 0x0000000C, 0x00003905, 0x000059D8, 0x00000001,\n    0x000500C3, 0x0000000C, 0x00002F3A, 0x00003905, 0x00000A1A, 0x0004007C,\n    0x0000000C, 0x00005781, 0x00005668, 0x00050084, 0x0000000C, 0x00001F03,\n    0x00002F3A, 0x00005781, 0x00050051, 0x0000000C, 0x00006244, 0x000059D8,\n    0x00000000, 0x000500C3, 0x0000000C, 0x00004FC8, 0x00006244, 0x00000A1A,\n    0x00050080, 0x0000000C, 0x000049B0, 0x00001F03, 0x00004FC8, 0x000500C4,\n    0x0000000C, 0x0000254A, 0x000049B0, 0x00000A1D, 0x000500C3, 0x0000000C,\n    0x0000603B, 0x00003905, 0x00000A0E, 0x000500C7, 0x0000000C, 0x0000539A,\n    0x0000603B, 0x00000A20, 0x000500C4, 0x0000000C, 0x0000534A, 0x0000539A,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x00004EA5, 0x00006244, 0x00000A20,\n    0x000500C5, 0x0000000C, 0x00002B1A, 0x0000534A, 0x00004EA5, 0x000500C5,\n    0x0000000C, 0x000043B7, 0x0000254A, 0x00002B1A, 0x000500C4, 0x0000000C,\n    0x00005E63, 0x000043B7, 0x00000A13, 0x000500C3, 0x0000000C, 0x000031DE,\n    0x00003905, 0x00000A17, 0x000500C7, 0x0000000C, 0x00005447, 0x000031DE,\n    0x00000A0E, 0x000500C3, 0x0000000C, 0x000028A6, 0x00006244, 0x00000A14,\n    0x000500C7, 0x0000000C, 0x0000511E, 0x000028A6, 0x00000A14, 0x000500C3,\n    0x0000000C, 0x000028B9, 0x00003905, 0x00000A14, 0x000500C7, 0x0000000C,\n    0x0000505F, 0x000028B9, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000541E,\n    0x0000505F, 0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BB, 0x0000511E,\n    0x0000541E, 0x000500C7, 0x0000000C, 0x00005077, 0x00003905, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x00005229, 0x00005077, 0x00000A17, 0x000500C4,\n    0x0000000C, 0x00001998, 0x000022BB, 0x00000A1D, 0x000500C5, 0x0000000C,\n    0x000047FF, 0x00005229, 0x00001998, 0x000500C4, 0x0000000C, 0x00001C01,\n    0x00005447, 0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C83, 0x000047FF,\n    0x00001C01, 0x000500C7, 0x0000000C, 0x000050B0, 0x00005E63, 0x00000A38,\n    0x000500C5, 0x0000000C, 0x00003C71, 0x00003C83, 0x000050B0, 0x000500C3,\n    0x0000000C, 0x00003746, 0x00005E63, 0x00000A17, 0x000500C7, 0x0000000C,\n    0x000018BA, 0x00003746, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005480,\n    0x000018BA, 0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A9, 0x00003C71,\n    0x00005480, 0x000500C3, 0x0000000C, 0x00003A6F, 0x00005E63, 0x00000A1A,\n    0x000500C7, 0x0000000C, 0x000018BB, 0x00003A6F, 0x00000A20, 0x000500C4,\n    0x0000000C, 0x00005481, 0x000018BB, 0x00000A23, 0x000500C5, 0x0000000C,\n    0x00004570, 0x000045A9, 0x00005481, 0x000500C3, 0x0000000C, 0x00003C89,\n    0x00005E63, 0x00000A23, 0x000500C4, 0x0000000C, 0x00002825, 0x00003C89,\n    0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B7A, 0x00004570, 0x00002825,\n    0x0004007C, 0x0000000B, 0x000041E6, 0x00003B7A, 0x000200F9, 0x00005BF0,\n    0x000200F8, 0x00005BF0, 0x000700F5, 0x0000000B, 0x0000292C, 0x000041E5,\n    0x00005BE0, 0x000041E6, 0x00005F21, 0x000200F9, 0x00004A60, 0x000200F8,\n    0x00004A60, 0x000700F5, 0x0000000B, 0x00002C70, 0x00002C67, 0x0000260D,\n    0x0000292C, 0x00005BF0, 0x00050080, 0x0000000B, 0x000048BD, 0x00002C70,\n    0x00005EAC, 0x000500C2, 0x0000000B, 0x00003D52, 0x000048BD, 0x00000A17,\n    0x00060041, 0x00000294, 0x00004FAF, 0x0000107A, 0x00000A0B, 0x00003D52,\n    0x0004003D, 0x00000017, 0x00001CAA, 0x00004FAF, 0x000500AA, 0x00000009,\n    0x000035C0, 0x000061E2, 0x00000A0D, 0x000500AA, 0x00000009, 0x00005376,\n    0x000061E2, 0x00000A10, 0x000500A6, 0x00000009, 0x00005686, 0x000035C0,\n    0x00005376, 0x000300F7, 0x00003463, 0x00000000, 0x000400FA, 0x00005686,\n    0x00002957, 0x00003463, 0x000200F8, 0x00002957, 0x000500C7, 0x00000017,\n    0x0000475F, 0x00001CAA, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D1,\n    0x0000475F, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AC, 0x00001CAA,\n    0x0000072E, 0x000500C2, 0x00000017, 0x0000448D, 0x000050AC, 0x0000013D,\n    0x000500C5, 0x00000017, 0x00003FF8, 0x000024D1, 0x0000448D, 0x000200F9,\n    0x00003463, 0x000200F8, 0x00003463, 0x000700F5, 0x00000017, 0x00005879,\n    0x00001CAA, 0x00004A60, 0x00003FF8, 0x00002957, 0x000500AA, 0x00000009,\n    0x00004CB6, 0x000061E2, 0x00000A13, 0x000500A6, 0x00000009, 0x00003B23,\n    0x00005376, 0x00004CB6, 0x000300F7, 0x00003A1A, 0x00000000, 0x000400FA,\n    0x00003B23, 0x00002B38, 0x00003A1A, 0x000200F8, 0x00002B38, 0x000500C4,\n    0x00000017, 0x00005E17, 0x00005879, 0x000002ED, 0x000500C2, 0x00000017,\n    0x00003BE7, 0x00005879, 0x000002ED, 0x000500C5, 0x00000017, 0x000029E8,\n    0x00005E17, 0x00003BE7, 0x000200F9, 0x00003A1A, 0x000200F8, 0x00003A1A,\n    0x000700F5, 0x00000017, 0x00002AAC, 0x00005879, 0x00003463, 0x000029E8,\n    0x00002B38, 0x000300F7, 0x00006070, 0x00000002, 0x000400FA, 0x00004376,\n    0x000055E9, 0x00001C25, 0x000200F8, 0x000055E9, 0x000200F9, 0x00006070,\n    0x000200F8, 0x00001C25, 0x000200F9, 0x00006070, 0x000200F8, 0x00006070,\n    0x000700F5, 0x0000000B, 0x00002C71, 0x00000A6A, 0x000055E9, 0x00000A3A,\n    0x00001C25, 0x00050080, 0x0000000B, 0x000048BE, 0x000048BD, 0x00002C71,\n    0x000500C2, 0x0000000B, 0x00003D53, 0x000048BE, 0x00000A17, 0x00060041,\n    0x00000294, 0x00005566, 0x0000107A, 0x00000A0B, 0x00003D53, 0x0004003D,\n    0x00000017, 0x00003910, 0x00005566, 0x000300F7, 0x00003A1B, 0x00000000,\n    0x000400FA, 0x00005686, 0x00002958, 0x00003A1B, 0x000200F8, 0x00002958,\n    0x000500C7, 0x00000017, 0x00004760, 0x00003910, 0x000009CE, 0x000500C4,\n    0x00000017, 0x000024D2, 0x00004760, 0x0000013D, 0x000500C7, 0x00000017,\n    0x000050AD, 0x00003910, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448E,\n    0x000050AD, 0x0000013D, 0x000500C5, 0x00000017, 0x00003FF9, 0x000024D2,\n    0x0000448E, 0x000200F9, 0x00003A1B, 0x000200F8, 0x00003A1B, 0x000700F5,\n    0x00000017, 0x00002AAD, 0x00003910, 0x00006070, 0x00003FF9, 0x00002958,\n    0x000300F7, 0x00002DC8, 0x00000000, 0x000400FA, 0x00003B23, 0x00002B39,\n    0x00002DC8, 0x000200F8, 0x00002B39, 0x000500C4, 0x00000017, 0x00005E18,\n    0x00002AAD, 0x000002ED, 0x000500C2, 0x00000017, 0x00003BE8, 0x00002AAD,\n    0x000002ED, 0x000500C5, 0x00000017, 0x000029E9, 0x00005E18, 0x00003BE8,\n    0x000200F9, 0x00002DC8, 0x000200F8, 0x00002DC8, 0x000700F5, 0x00000017,\n    0x00004C59, 0x00002AAD, 0x00003A1B, 0x000029E9, 0x00002B39, 0x00050051,\n    0x0000000B, 0x00005F39, 0x00002AAC, 0x00000000, 0x000500C4, 0x0000000B,\n    0x00003C7F, 0x00005F39, 0x00000A13, 0x000500C2, 0x0000000B, 0x00001951,\n    0x00005F39, 0x00000A31, 0x00050050, 0x00000011, 0x00004370, 0x00003C7F,\n    0x00001951, 0x000500C7, 0x00000011, 0x0000191E, 0x00004370, 0x000003E1,\n    0x000500C4, 0x0000000B, 0x0000503F, 0x00005F39, 0x00000A1F, 0x000500C2,\n    0x0000000B, 0x00005E64, 0x00005F39, 0x00000A25, 0x00050050, 0x00000011,\n    0x00004383, 0x0000503F, 0x00005E64, 0x000500C7, 0x00000011, 0x00001897,\n    0x00004383, 0x000003F7, 0x000500C5, 0x00000011, 0x0000375A, 0x0000191E,\n    0x00001897, 0x000500C4, 0x0000000B, 0x00005C88, 0x00005F39, 0x00000A2E,\n    0x000500C2, 0x0000000B, 0x00005817, 0x00005F39, 0x00000A16, 0x00050050,\n    0x00000011, 0x00004385, 0x00005C88, 0x00005817, 0x000500C7, 0x00000011,\n    0x00001871, 0x00004385, 0x000009F3, 0x000500C5, 0x00000011, 0x00003913,\n    0x0000375A, 0x00001871, 0x000500C2, 0x00000011, 0x00005759, 0x00003913,\n    0x00000778, 0x000500C7, 0x00000011, 0x000018CB, 0x00005759, 0x000001F7,\n    0x000500C5, 0x00000011, 0x00004046, 0x00003913, 0x000018CB, 0x000500C2,\n    0x00000011, 0x0000575A, 0x00004046, 0x0000078D, 0x000500C7, 0x00000011,\n    0x00005AE7, 0x0000575A, 0x0000004E, 0x000500C5, 0x00000011, 0x000041EB,\n    0x00004046, 0x00005AE7, 0x00050051, 0x0000000B, 0x00005082, 0x00002AAC,\n    0x00000002, 0x000500C4, 0x0000000B, 0x00002364, 0x00005082, 0x00000A13,\n    0x000500C2, 0x0000000B, 0x00001952, 0x00005082, 0x00000A31, 0x00050050,\n    0x00000011, 0x00004371, 0x00002364, 0x00001952, 0x000500C7, 0x00000011,\n    0x0000191F, 0x00004371, 0x000003E1, 0x000500C4, 0x0000000B, 0x00005040,\n    0x00005082, 0x00000A1F, 0x000500C2, 0x0000000B, 0x00005E65, 0x00005082,\n    0x00000A25, 0x00050050, 0x00000011, 0x00004386, 0x00005040, 0x00005E65,\n    0x000500C7, 0x00000011, 0x00001898, 0x00004386, 0x000003F7, 0x000500C5,\n    0x00000011, 0x0000375B, 0x0000191F, 0x00001898, 0x000500C4, 0x0000000B,\n    0x00005C89, 0x00005082, 0x00000A2E, 0x000500C2, 0x0000000B, 0x00005818,\n    0x00005082, 0x00000A16, 0x00050050, 0x00000011, 0x00004387, 0x00005C89,\n    0x00005818, 0x000500C7, 0x00000011, 0x00001872, 0x00004387, 0x000009F3,\n    0x000500C5, 0x00000011, 0x00003914, 0x0000375B, 0x00001872, 0x000500C2,\n    0x00000011, 0x0000575B, 0x00003914, 0x00000778, 0x000500C7, 0x00000011,\n    0x000018CC, 0x0000575B, 0x000001F7, 0x000500C5, 0x00000011, 0x00004047,\n    0x00003914, 0x000018CC, 0x000500C2, 0x00000011, 0x0000575C, 0x00004047,\n    0x0000078D, 0x000500C7, 0x00000011, 0x00005AE8, 0x0000575C, 0x0000004E,\n    0x000500C5, 0x00000011, 0x00003962, 0x00004047, 0x00005AE8, 0x00050051,\n    0x0000000B, 0x00004B57, 0x000041EB, 0x00000000, 0x00050051, 0x0000000B,\n    0x00005CB2, 0x000041EB, 0x00000001, 0x00050051, 0x0000000B, 0x00001DEC,\n    0x00003962, 0x00000000, 0x00050051, 0x0000000B, 0x00002675, 0x00003962,\n    0x00000001, 0x00050051, 0x0000000B, 0x00002317, 0x00004C59, 0x00000000,\n    0x000500C4, 0x0000000B, 0x00002F1D, 0x00002317, 0x00000A13, 0x000500C2,\n    0x0000000B, 0x00001953, 0x00002317, 0x00000A31, 0x00050050, 0x00000011,\n    0x00004372, 0x00002F1D, 0x00001953, 0x000500C7, 0x00000011, 0x00001920,\n    0x00004372, 0x000003E1, 0x000500C4, 0x0000000B, 0x00005041, 0x00002317,\n    0x00000A1F, 0x000500C2, 0x0000000B, 0x00005E66, 0x00002317, 0x00000A25,\n    0x00050050, 0x00000011, 0x00004388, 0x00005041, 0x00005E66, 0x000500C7,\n    0x00000011, 0x00001899, 0x00004388, 0x000003F7, 0x000500C5, 0x00000011,\n    0x0000375C, 0x00001920, 0x00001899, 0x000500C4, 0x0000000B, 0x00005C8A,\n    0x00002317, 0x00000A2E, 0x000500C2, 0x0000000B, 0x00005819, 0x00002317,\n    0x00000A16, 0x00050050, 0x00000011, 0x00004389, 0x00005C8A, 0x00005819,\n    0x000500C7, 0x00000011, 0x00001873, 0x00004389, 0x000009F3, 0x000500C5,\n    0x00000011, 0x00003915, 0x0000375C, 0x00001873, 0x000500C2, 0x00000011,\n    0x0000575D, 0x00003915, 0x00000778, 0x000500C7, 0x00000011, 0x000018CD,\n    0x0000575D, 0x000001F7, 0x000500C5, 0x00000011, 0x00004048, 0x00003915,\n    0x000018CD, 0x000500C2, 0x00000011, 0x0000575E, 0x00004048, 0x0000078D,\n    0x000500C7, 0x00000011, 0x00005AE9, 0x0000575E, 0x0000004E, 0x000500C5,\n    0x00000011, 0x000041EC, 0x00004048, 0x00005AE9, 0x00050051, 0x0000000B,\n    0x00005083, 0x00004C59, 0x00000002, 0x000500C4, 0x0000000B, 0x00002365,\n    0x00005083, 0x00000A13, 0x000500C2, 0x0000000B, 0x00001954, 0x00005083,\n    0x00000A31, 0x00050050, 0x00000011, 0x00004373, 0x00002365, 0x00001954,\n    0x000500C7, 0x00000011, 0x00001921, 0x00004373, 0x000003E1, 0x000500C4,\n    0x0000000B, 0x00005042, 0x00005083, 0x00000A1F, 0x000500C2, 0x0000000B,\n    0x00005E67, 0x00005083, 0x00000A25, 0x00050050, 0x00000011, 0x0000438A,\n    0x00005042, 0x00005E67, 0x000500C7, 0x00000011, 0x0000189A, 0x0000438A,\n    0x000003F7, 0x000500C5, 0x00000011, 0x0000375D, 0x00001921, 0x0000189A,\n    0x000500C4, 0x0000000B, 0x00005C8B, 0x00005083, 0x00000A2E, 0x000500C2,\n    0x0000000B, 0x0000581A, 0x00005083, 0x00000A16, 0x00050050, 0x00000011,\n    0x0000438B, 0x00005C8B, 0x0000581A, 0x000500C7, 0x00000011, 0x00001874,\n    0x0000438B, 0x000009F3, 0x000500C5, 0x00000011, 0x00003916, 0x0000375D,\n    0x00001874, 0x000500C2, 0x00000011, 0x0000575F, 0x00003916, 0x00000778,\n    0x000500C7, 0x00000011, 0x000018CE, 0x0000575F, 0x000001F7, 0x000500C5,\n    0x00000011, 0x00004049, 0x00003916, 0x000018CE, 0x000500C2, 0x00000011,\n    0x00005760, 0x00004049, 0x0000078D, 0x000500C7, 0x00000011, 0x00005AEA,\n    0x00005760, 0x0000004E, 0x000500C5, 0x00000011, 0x00003963, 0x00004049,\n    0x00005AEA, 0x00050051, 0x0000000B, 0x00004B58, 0x000041EC, 0x00000000,\n    0x00050051, 0x0000000B, 0x00005CB3, 0x000041EC, 0x00000001, 0x00050051,\n    0x0000000B, 0x00001DD9, 0x00003963, 0x00000000, 0x00050051, 0x0000000B,\n    0x00001E86, 0x00003963, 0x00000001, 0x00070050, 0x00000017, 0x000045CD,\n    0x00004B57, 0x00001DEC, 0x00004B58, 0x00001DD9, 0x00070050, 0x00000017,\n    0x000047D8, 0x00005CB2, 0x00002675, 0x00005CB3, 0x00001E86, 0x000500B2,\n    0x00000013, 0x00002797, 0x000045CD, 0x000047D8, 0x00050051, 0x0000000B,\n    0x00003C9A, 0x00002AAC, 0x00000001, 0x00050051, 0x0000000B, 0x000046AC,\n    0x00002AAC, 0x00000003, 0x00050051, 0x0000000B, 0x00001DDA, 0x00004C59,\n    0x00000001, 0x00050051, 0x0000000B, 0x0000275B, 0x00004C59, 0x00000003,\n    0x00070050, 0x00000017, 0x00004137, 0x00003C9A, 0x000046AC, 0x00001DDA,\n    0x0000275B, 0x000500C7, 0x00000017, 0x0000220D, 0x00004137, 0x00000B3E,\n    0x000500C4, 0x00000017, 0x00005554, 0x0000220D, 0x00000B86, 0x000500C7,\n    0x00000017, 0x000050AE, 0x00004137, 0x00000B2C, 0x000500C2, 0x00000017,\n    0x000040D7, 0x000050AE, 0x00000B86, 0x000500C5, 0x00000017, 0x00005DC0,\n    0x00005554, 0x000040D7, 0x000500C7, 0x00000017, 0x00004CA2, 0x00005DC0,\n    0x00000B2C, 0x000500C2, 0x00000017, 0x00005000, 0x00004CA2, 0x00000B86,\n    0x000500C6, 0x00000017, 0x00003D71, 0x00005DC0, 0x00005000, 0x000400C8,\n    0x00000017, 0x00002821, 0x00004137, 0x000500C7, 0x00000017, 0x00003BBE,\n    0x00002821, 0x00000B3E, 0x000500C4, 0x00000017, 0x00005507, 0x00003BBE,\n    0x00000B86, 0x000500C6, 0x00000017, 0x00003AEF, 0x00002821, 0x00005507,\n    0x000600A9, 0x00000017, 0x0000282C, 0x00002797, 0x00003AEF, 0x00003D71,\n    0x000200F9, 0x00002D69, 0x000200F8, 0x00002D69, 0x000700F5, 0x00000017,\n    0x00002BA7, 0x0000282C, 0x00002DC8, 0x000027DE, 0x00004DBE, 0x000700F5,\n    0x0000000B, 0x000032E9, 0x000038F6, 0x00002DC8, 0x00001D0D, 0x00004DBE,\n    0x000700F5, 0x0000000B, 0x00001F66, 0x00000A0A, 0x00002DC8, 0x0000560C,\n    0x00004DBE, 0x000500B0, 0x00000009, 0x0000397F, 0x00001F66, 0x00000A16,\n    0x000400F6, 0x00001B44, 0x00004DBE, 0x00000001, 0x000400FA, 0x0000397F,\n    0x00004982, 0x00001B44, 0x000200F8, 0x00004982, 0x000500AB, 0x00000009,\n    0x00002AD9, 0x00001F66, 0x00000A0A, 0x000300F7, 0x00003D1D, 0x00000000,\n    0x000400FA, 0x00002AD9, 0x0000298A, 0x00003D1D, 0x000200F8, 0x0000298A,\n    0x00050051, 0x0000000B, 0x00002B5B, 0x000043C0, 0x00000001, 0x00050080,\n    0x0000000B, 0x000031DA, 0x00002B5B, 0x00001F66, 0x000500AE, 0x00000009,\n    0x00003994, 0x000031DA, 0x000019C2, 0x000300F7, 0x00001F69, 0x00000000,\n    0x000400FA, 0x00003994, 0x000055EA, 0x00001F69, 0x000200F8, 0x000055EA,\n    0x000200F9, 0x00001B44, 0x000200F8, 0x00001F69, 0x00050080, 0x0000000B,\n    0x000030CB, 0x000032E9, 0x0000578C, 0x000500C2, 0x00000017, 0x000060B0,\n    0x00002BA7, 0x0000013D, 0x000200F9, 0x00003D1D, 0x000200F8, 0x00003D1D,\n    0x000700F5, 0x00000017, 0x000027DE, 0x00002BA7, 0x00004982, 0x000060B0,\n    0x00001F69, 0x000700F5, 0x0000000B, 0x00001D0D, 0x000032E9, 0x00004982,\n    0x000030CB, 0x00001F69, 0x000500C2, 0x0000000B, 0x000027AF, 0x00001D0D,\n    0x00000A17, 0x00050051, 0x00000009, 0x00006125, 0x00002797, 0x00000000,\n    0x000300F7, 0x00002C98, 0x00000000, 0x000400FA, 0x00006125, 0x000025FA,\n    0x00003EBD, 0x000200F8, 0x000025FA, 0x00050051, 0x0000000B, 0x00004D47,\n    0x000027DE, 0x00000000, 0x00070050, 0x00000017, 0x00004F0A, 0x00004D47,\n    0x00004D47, 0x00004D47, 0x00004D47, 0x000500C2, 0x00000017, 0x00002238,\n    0x00004F0A, 0x0000004D, 0x000500C7, 0x00000017, 0x00005F38, 0x00002238,\n    0x00000B86, 0x00070050, 0x00000017, 0x00004C2E, 0x00004B57, 0x00004B57,\n    0x00004B57, 0x00004B57, 0x00050084, 0x00000017, 0x0000585A, 0x00005F38,\n    0x00004C2E, 0x000500C2, 0x00000017, 0x00003EE9, 0x00004F0A, 0x00000083,\n    0x000500C7, 0x00000017, 0x00003A70, 0x00003EE9, 0x00000B86, 0x00070050,\n    0x00000017, 0x00004748, 0x00005CB2, 0x00005CB2, 0x00005CB2, 0x00005CB2,\n    0x00050084, 0x00000017, 0x00003A75, 0x00003A70, 0x00004748, 0x00050080,\n    0x00000017, 0x00003077, 0x0000585A, 0x00003A75, 0x000500C7, 0x0000000B,\n    0x0000386B, 0x00004D47, 0x00000A08, 0x000500C2, 0x0000000B, 0x00005B7C,\n    0x0000386B, 0x00000A0D, 0x000500C7, 0x0000000B, 0x000023AA, 0x00004D47,\n    0x00005B7C, 0x00070050, 0x00000017, 0x000022A7, 0x000023AA, 0x000023AA,\n    0x000023AA, 0x000023AA, 0x000500C2, 0x00000017, 0x000025A1, 0x000022A7,\n    0x0000004D, 0x000500C7, 0x00000017, 0x00005E1F, 0x000025A1, 0x00000B86,\n    0x000500C7, 0x0000000B, 0x000048BC, 0x00004D47, 0x00000A09, 0x000500C5,\n    0x0000000B, 0x00003FAA, 0x000048BC, 0x00005B7C, 0x000500C7, 0x00000017,\n    0x00004FA0, 0x00003077, 0x000003A1, 0x000500C2, 0x00000017, 0x000050E8,\n    0x00004FA0, 0x00005E1F, 0x000500C4, 0x00000017, 0x00003702, 0x000050E8,\n    0x000002ED, 0x000500C2, 0x00000017, 0x000054F5, 0x00003077, 0x000001A9,\n    0x000500C7, 0x00000017, 0x000055B4, 0x000054F5, 0x000003A1, 0x000500C2,\n    0x00000017, 0x00004F2B, 0x000055B4, 0x00005E1F, 0x000500C4, 0x00000017,\n    0x000018BE, 0x00004F2B, 0x0000013D, 0x00050080, 0x00000017, 0x0000416E,\n    0x00003702, 0x000018BE, 0x000500C2, 0x00000017, 0x0000573E, 0x00003077,\n    0x000003C5, 0x000500C2, 0x00000017, 0x00002DC9, 0x0000573E, 0x00005E1F,\n    0x00050080, 0x00000017, 0x000045EB, 0x0000416E, 0x00002DC9, 0x00070050,\n    0x00000017, 0x00002313, 0x00003FAA, 0x00003FAA, 0x00003FAA, 0x00003FAA,\n    0x000500C2, 0x00000017, 0x000048A5, 0x00002313, 0x0000004D, 0x000500C7,\n    0x00000017, 0x00003BC8, 0x000048A5, 0x00000B86, 0x00050084, 0x00000017,\n    0x00002074, 0x00003BC8, 0x00000A27, 0x00050080, 0x00000017, 0x00004E4C,\n    0x000045EB, 0x00002074, 0x000200F9, 0x00002C98, 0x000200F8, 0x00003EBD,\n    0x00050051, 0x0000000B, 0x000047AE, 0x000027DE, 0x00000000, 0x000400C8,\n    0x0000000B, 0x00005951, 0x000047AE, 0x00070050, 0x00000017, 0x00002A3E,\n    0x00005951, 0x00005951, 0x00005951, 0x00005951, 0x000500C2, 0x00000017,\n    0x00005DD5, 0x00002A3E, 0x0000004D, 0x000500C7, 0x00000017, 0x00005F3A,\n    0x00005DD5, 0x0000002F, 0x00070050, 0x00000017, 0x000043B8, 0x00004B57,\n    0x00004B57, 0x00004B57, 0x00004B57, 0x00050084, 0x00000017, 0x00005A86,\n    0x00005F3A, 0x000043B8, 0x00070050, 0x00000017, 0x0000627B, 0x000047AE,\n    0x000047AE, 0x000047AE, 0x000047AE, 0x000500C2, 0x00000017, 0x0000382A,\n    0x0000627B, 0x0000004D, 0x000500C7, 0x00000017, 0x00005F3B, 0x0000382A,\n    0x0000002F, 0x00070050, 0x00000017, 0x00004749, 0x00005CB2, 0x00005CB2,\n    0x00005CB2, 0x00005CB2, 0x00050084, 0x00000017, 0x00003A76, 0x00005F3B,\n    0x00004749, 0x00050080, 0x00000017, 0x00002C03, 0x00005A86, 0x00003A76,\n    0x000500C7, 0x00000017, 0x000060BE, 0x00002C03, 0x000003A1, 0x00050086,\n    0x00000017, 0x00002409, 0x000060BE, 0x0000002F, 0x000500C4, 0x00000017,\n    0x000044C8, 0x00002409, 0x000002ED, 0x000500C2, 0x00000017, 0x00002AD1,\n    0x00002C03, 0x000001A9, 0x000500C7, 0x00000017, 0x000033C1, 0x00002AD1,\n    0x000003A1, 0x00050086, 0x00000017, 0x000043A0, 0x000033C1, 0x0000002F,\n    0x000500C4, 0x00000017, 0x00004262, 0x000043A0, 0x0000013D, 0x000500C5,\n    0x00000017, 0x000018AE, 0x000044C8, 0x00004262, 0x000500C2, 0x00000017,\n    0x00003BF0, 0x00002C03, 0x000003C5, 0x00050086, 0x00000017, 0x00005DE0,\n    0x00003BF0, 0x0000002F, 0x000500C5, 0x00000017, 0x00002352, 0x000018AE,\n    0x00005DE0, 0x000500C5, 0x00000017, 0x0000457F, 0x00002352, 0x00000A27,\n    0x000200F9, 0x00002C98, 0x000200F8, 0x00002C98, 0x000700F5, 0x00000017,\n    0x00004D37, 0x00004E4C, 0x000025FA, 0x0000457F, 0x00003EBD, 0x00060041,\n    0x00000294, 0x000060F9, 0x0000140E, 0x00000A0B, 0x000027AF, 0x0003003E,\n    0x000060F9, 0x00004D37, 0x00050080, 0x0000000B, 0x0000217C, 0x00001D0D,\n    0x00000A3A, 0x000500C2, 0x0000000B, 0x00001CE8, 0x0000217C, 0x00000A17,\n    0x00050051, 0x00000009, 0x00005D1B, 0x00002797, 0x00000001, 0x000300F7,\n    0x00002C99, 0x00000000, 0x000400FA, 0x00005D1B, 0x000025FB, 0x00003EBE,\n    0x000200F8, 0x000025FB, 0x00050051, 0x0000000B, 0x00004D48, 0x000027DE,\n    0x00000001, 0x00070050, 0x00000017, 0x00004F0B, 0x00004D48, 0x00004D48,\n    0x00004D48, 0x00004D48, 0x000500C2, 0x00000017, 0x00002239, 0x00004F0B,\n    0x0000004D, 0x000500C7, 0x00000017, 0x00005F3C, 0x00002239, 0x00000B86,\n    0x00070050, 0x00000017, 0x00004C2F, 0x00001DEC, 0x00001DEC, 0x00001DEC,\n    0x00001DEC, 0x00050084, 0x00000017, 0x0000585B, 0x00005F3C, 0x00004C2F,\n    0x000500C2, 0x00000017, 0x00003EEA, 0x00004F0B, 0x00000083, 0x000500C7,\n    0x00000017, 0x00003A71, 0x00003EEA, 0x00000B86, 0x00070050, 0x00000017,\n    0x0000474A, 0x00002675, 0x00002675, 0x00002675, 0x00002675, 0x00050084,\n    0x00000017, 0x00003A77, 0x00003A71, 0x0000474A, 0x00050080, 0x00000017,\n    0x00003078, 0x0000585B, 0x00003A77, 0x000500C7, 0x0000000B, 0x0000386C,\n    0x00004D48, 0x00000A08, 0x000500C2, 0x0000000B, 0x00005B7D, 0x0000386C,\n    0x00000A0D, 0x000500C7, 0x0000000B, 0x000023AB, 0x00004D48, 0x00005B7D,\n    0x00070050, 0x00000017, 0x000022A8, 0x000023AB, 0x000023AB, 0x000023AB,\n    0x000023AB, 0x000500C2, 0x00000017, 0x000025A2, 0x000022A8, 0x0000004D,\n    0x000500C7, 0x00000017, 0x00005E20, 0x000025A2, 0x00000B86, 0x000500C7,\n    0x0000000B, 0x000048BF, 0x00004D48, 0x00000A09, 0x000500C5, 0x0000000B,\n    0x00003FAB, 0x000048BF, 0x00005B7D, 0x000500C7, 0x00000017, 0x00004FA1,\n    0x00003078, 0x000003A1, 0x000500C2, 0x00000017, 0x000050E9, 0x00004FA1,\n    0x00005E20, 0x000500C4, 0x00000017, 0x00003703, 0x000050E9, 0x000002ED,\n    0x000500C2, 0x00000017, 0x000054F6, 0x00003078, 0x000001A9, 0x000500C7,\n    0x00000017, 0x000055B5, 0x000054F6, 0x000003A1, 0x000500C2, 0x00000017,\n    0x00004F2C, 0x000055B5, 0x00005E20, 0x000500C4, 0x00000017, 0x000018BF,\n    0x00004F2C, 0x0000013D, 0x00050080, 0x00000017, 0x0000416F, 0x00003703,\n    0x000018BF, 0x000500C2, 0x00000017, 0x0000573F, 0x00003078, 0x000003C5,\n    0x000500C2, 0x00000017, 0x00002DCA, 0x0000573F, 0x00005E20, 0x00050080,\n    0x00000017, 0x000045EC, 0x0000416F, 0x00002DCA, 0x00070050, 0x00000017,\n    0x00002314, 0x00003FAB, 0x00003FAB, 0x00003FAB, 0x00003FAB, 0x000500C2,\n    0x00000017, 0x000048A6, 0x00002314, 0x0000004D, 0x000500C7, 0x00000017,\n    0x00003BC9, 0x000048A6, 0x00000B86, 0x00050084, 0x00000017, 0x00002075,\n    0x00003BC9, 0x00000A27, 0x00050080, 0x00000017, 0x00004E4D, 0x000045EC,\n    0x00002075, 0x000200F9, 0x00002C99, 0x000200F8, 0x00003EBE, 0x00050051,\n    0x0000000B, 0x000047AF, 0x000027DE, 0x00000001, 0x000400C8, 0x0000000B,\n    0x00005952, 0x000047AF, 0x00070050, 0x00000017, 0x00002A3F, 0x00005952,\n    0x00005952, 0x00005952, 0x00005952, 0x000500C2, 0x00000017, 0x00005DD6,\n    0x00002A3F, 0x0000004D, 0x000500C7, 0x00000017, 0x00005F3D, 0x00005DD6,\n    0x0000002F, 0x00070050, 0x00000017, 0x000043B9, 0x00001DEC, 0x00001DEC,\n    0x00001DEC, 0x00001DEC, 0x00050084, 0x00000017, 0x00005A87, 0x00005F3D,\n    0x000043B9, 0x00070050, 0x00000017, 0x0000627C, 0x000047AF, 0x000047AF,\n    0x000047AF, 0x000047AF, 0x000500C2, 0x00000017, 0x0000382B, 0x0000627C,\n    0x0000004D, 0x000500C7, 0x00000017, 0x00005F3E, 0x0000382B, 0x0000002F,\n    0x00070050, 0x00000017, 0x0000474B, 0x00002675, 0x00002675, 0x00002675,\n    0x00002675, 0x00050084, 0x00000017, 0x00003A78, 0x00005F3E, 0x0000474B,\n    0x00050080, 0x00000017, 0x00002C04, 0x00005A87, 0x00003A78, 0x000500C7,\n    0x00000017, 0x000060BF, 0x00002C04, 0x000003A1, 0x00050086, 0x00000017,\n    0x0000240A, 0x000060BF, 0x0000002F, 0x000500C4, 0x00000017, 0x000044C9,\n    0x0000240A, 0x000002ED, 0x000500C2, 0x00000017, 0x00002AD2, 0x00002C04,\n    0x000001A9, 0x000500C7, 0x00000017, 0x000033C2, 0x00002AD2, 0x000003A1,\n    0x00050086, 0x00000017, 0x000043A1, 0x000033C2, 0x0000002F, 0x000500C4,\n    0x00000017, 0x00004263, 0x000043A1, 0x0000013D, 0x000500C5, 0x00000017,\n    0x000018AF, 0x000044C9, 0x00004263, 0x000500C2, 0x00000017, 0x00003BF1,\n    0x00002C04, 0x000003C5, 0x00050086, 0x00000017, 0x00005DE1, 0x00003BF1,\n    0x0000002F, 0x000500C5, 0x00000017, 0x00002353, 0x000018AF, 0x00005DE1,\n    0x000500C5, 0x00000017, 0x00004580, 0x00002353, 0x00000A27, 0x000200F9,\n    0x00002C99, 0x000200F8, 0x00002C99, 0x000700F5, 0x00000017, 0x00004D38,\n    0x00004E4D, 0x000025FB, 0x00004580, 0x00003EBE, 0x00060041, 0x00000294,\n    0x000060FA, 0x0000140E, 0x00000A0B, 0x00001CE8, 0x0003003E, 0x000060FA,\n    0x00004D38, 0x00050080, 0x0000000B, 0x0000217D, 0x00001D0D, 0x00000A6A,\n    0x000500C2, 0x0000000B, 0x00001CE9, 0x0000217D, 0x00000A17, 0x00050051,\n    0x00000009, 0x00005D1C, 0x00002797, 0x00000002, 0x000300F7, 0x00002C9A,\n    0x00000000, 0x000400FA, 0x00005D1C, 0x000025FC, 0x00003EBF, 0x000200F8,\n    0x000025FC, 0x00050051, 0x0000000B, 0x00004D49, 0x000027DE, 0x00000002,\n    0x00070050, 0x00000017, 0x00004F0C, 0x00004D49, 0x00004D49, 0x00004D49,\n    0x00004D49, 0x000500C2, 0x00000017, 0x0000223A, 0x00004F0C, 0x0000004D,\n    0x000500C7, 0x00000017, 0x00005F3F, 0x0000223A, 0x00000B86, 0x00070050,\n    0x00000017, 0x00004C30, 0x00004B58, 0x00004B58, 0x00004B58, 0x00004B58,\n    0x00050084, 0x00000017, 0x0000585C, 0x00005F3F, 0x00004C30, 0x000500C2,\n    0x00000017, 0x00003EEB, 0x00004F0C, 0x00000083, 0x000500C7, 0x00000017,\n    0x00003A72, 0x00003EEB, 0x00000B86, 0x00070050, 0x00000017, 0x0000474C,\n    0x00005CB3, 0x00005CB3, 0x00005CB3, 0x00005CB3, 0x00050084, 0x00000017,\n    0x00003A79, 0x00003A72, 0x0000474C, 0x00050080, 0x00000017, 0x00003079,\n    0x0000585C, 0x00003A79, 0x000500C7, 0x0000000B, 0x0000386D, 0x00004D49,\n    0x00000A08, 0x000500C2, 0x0000000B, 0x00005B7E, 0x0000386D, 0x00000A0D,\n    0x000500C7, 0x0000000B, 0x000023AC, 0x00004D49, 0x00005B7E, 0x00070050,\n    0x00000017, 0x000022A9, 0x000023AC, 0x000023AC, 0x000023AC, 0x000023AC,\n    0x000500C2, 0x00000017, 0x000025A3, 0x000022A9, 0x0000004D, 0x000500C7,\n    0x00000017, 0x00005E21, 0x000025A3, 0x00000B86, 0x000500C7, 0x0000000B,\n    0x000048C0, 0x00004D49, 0x00000A09, 0x000500C5, 0x0000000B, 0x00003FAC,\n    0x000048C0, 0x00005B7E, 0x000500C7, 0x00000017, 0x00004FA2, 0x00003079,\n    0x000003A1, 0x000500C2, 0x00000017, 0x000050EA, 0x00004FA2, 0x00005E21,\n    0x000500C4, 0x00000017, 0x00003704, 0x000050EA, 0x000002ED, 0x000500C2,\n    0x00000017, 0x000054F7, 0x00003079, 0x000001A9, 0x000500C7, 0x00000017,\n    0x000055B6, 0x000054F7, 0x000003A1, 0x000500C2, 0x00000017, 0x00004F2D,\n    0x000055B6, 0x00005E21, 0x000500C4, 0x00000017, 0x000018C0, 0x00004F2D,\n    0x0000013D, 0x00050080, 0x00000017, 0x00004170, 0x00003704, 0x000018C0,\n    0x000500C2, 0x00000017, 0x00005740, 0x00003079, 0x000003C5, 0x000500C2,\n    0x00000017, 0x00002DCB, 0x00005740, 0x00005E21, 0x00050080, 0x00000017,\n    0x000045ED, 0x00004170, 0x00002DCB, 0x00070050, 0x00000017, 0x00002315,\n    0x00003FAC, 0x00003FAC, 0x00003FAC, 0x00003FAC, 0x000500C2, 0x00000017,\n    0x000048A7, 0x00002315, 0x0000004D, 0x000500C7, 0x00000017, 0x00003BCA,\n    0x000048A7, 0x00000B86, 0x00050084, 0x00000017, 0x00002076, 0x00003BCA,\n    0x00000A27, 0x00050080, 0x00000017, 0x00004E4E, 0x000045ED, 0x00002076,\n    0x000200F9, 0x00002C9A, 0x000200F8, 0x00003EBF, 0x00050051, 0x0000000B,\n    0x000047B0, 0x000027DE, 0x00000002, 0x000400C8, 0x0000000B, 0x00005953,\n    0x000047B0, 0x00070050, 0x00000017, 0x00002A40, 0x00005953, 0x00005953,\n    0x00005953, 0x00005953, 0x000500C2, 0x00000017, 0x00005DD7, 0x00002A40,\n    0x0000004D, 0x000500C7, 0x00000017, 0x00005F40, 0x00005DD7, 0x0000002F,\n    0x00070050, 0x00000017, 0x000043BA, 0x00004B58, 0x00004B58, 0x00004B58,\n    0x00004B58, 0x00050084, 0x00000017, 0x00005A88, 0x00005F40, 0x000043BA,\n    0x00070050, 0x00000017, 0x0000627D, 0x000047B0, 0x000047B0, 0x000047B0,\n    0x000047B0, 0x000500C2, 0x00000017, 0x0000382C, 0x0000627D, 0x0000004D,\n    0x000500C7, 0x00000017, 0x00005F41, 0x0000382C, 0x0000002F, 0x00070050,\n    0x00000017, 0x0000474D, 0x00005CB3, 0x00005CB3, 0x00005CB3, 0x00005CB3,\n    0x00050084, 0x00000017, 0x00003A7A, 0x00005F41, 0x0000474D, 0x00050080,\n    0x00000017, 0x00002C05, 0x00005A88, 0x00003A7A, 0x000500C7, 0x00000017,\n    0x000060C0, 0x00002C05, 0x000003A1, 0x00050086, 0x00000017, 0x0000240B,\n    0x000060C0, 0x0000002F, 0x000500C4, 0x00000017, 0x000044CA, 0x0000240B,\n    0x000002ED, 0x000500C2, 0x00000017, 0x00002AD3, 0x00002C05, 0x000001A9,\n    0x000500C7, 0x00000017, 0x000033C3, 0x00002AD3, 0x000003A1, 0x00050086,\n    0x00000017, 0x000043A2, 0x000033C3, 0x0000002F, 0x000500C4, 0x00000017,\n    0x00004264, 0x000043A2, 0x0000013D, 0x000500C5, 0x00000017, 0x000018B0,\n    0x000044CA, 0x00004264, 0x000500C2, 0x00000017, 0x00003BF2, 0x00002C05,\n    0x000003C5, 0x00050086, 0x00000017, 0x00005DE2, 0x00003BF2, 0x0000002F,\n    0x000500C5, 0x00000017, 0x00002354, 0x000018B0, 0x00005DE2, 0x000500C5,\n    0x00000017, 0x00004581, 0x00002354, 0x00000A27, 0x000200F9, 0x00002C9A,\n    0x000200F8, 0x00002C9A, 0x000700F5, 0x00000017, 0x00004D39, 0x00004E4E,\n    0x000025FC, 0x00004581, 0x00003EBF, 0x00060041, 0x00000294, 0x000060FB,\n    0x0000140E, 0x00000A0B, 0x00001CE9, 0x0003003E, 0x000060FB, 0x00004D39,\n    0x00050080, 0x0000000B, 0x0000217E, 0x00001D0D, 0x00000A9A, 0x000500C2,\n    0x0000000B, 0x00001CEA, 0x0000217E, 0x00000A17, 0x00050051, 0x00000009,\n    0x00005D1D, 0x00002797, 0x00000003, 0x000300F7, 0x00002C9B, 0x00000000,\n    0x000400FA, 0x00005D1D, 0x000025FD, 0x00003EC0, 0x000200F8, 0x000025FD,\n    0x00050051, 0x0000000B, 0x00004D4A, 0x000027DE, 0x00000003, 0x00070050,\n    0x00000017, 0x00004F0D, 0x00004D4A, 0x00004D4A, 0x00004D4A, 0x00004D4A,\n    0x000500C2, 0x00000017, 0x0000223B, 0x00004F0D, 0x0000004D, 0x000500C7,\n    0x00000017, 0x00005F42, 0x0000223B, 0x00000B86, 0x00070050, 0x00000017,\n    0x00004C31, 0x00001DD9, 0x00001DD9, 0x00001DD9, 0x00001DD9, 0x00050084,\n    0x00000017, 0x0000585D, 0x00005F42, 0x00004C31, 0x000500C2, 0x00000017,\n    0x00003EEC, 0x00004F0D, 0x00000083, 0x000500C7, 0x00000017, 0x00003A73,\n    0x00003EEC, 0x00000B86, 0x00070050, 0x00000017, 0x0000474E, 0x00001E86,\n    0x00001E86, 0x00001E86, 0x00001E86, 0x00050084, 0x00000017, 0x00003A7B,\n    0x00003A73, 0x0000474E, 0x00050080, 0x00000017, 0x0000307A, 0x0000585D,\n    0x00003A7B, 0x000500C7, 0x0000000B, 0x0000386E, 0x00004D4A, 0x00000A08,\n    0x000500C2, 0x0000000B, 0x00005B7F, 0x0000386E, 0x00000A0D, 0x000500C7,\n    0x0000000B, 0x000023AD, 0x00004D4A, 0x00005B7F, 0x00070050, 0x00000017,\n    0x000022AA, 0x000023AD, 0x000023AD, 0x000023AD, 0x000023AD, 0x000500C2,\n    0x00000017, 0x000025A4, 0x000022AA, 0x0000004D, 0x000500C7, 0x00000017,\n    0x00005E22, 0x000025A4, 0x00000B86, 0x000500C7, 0x0000000B, 0x000048C1,\n    0x00004D4A, 0x00000A09, 0x000500C5, 0x0000000B, 0x00003FAD, 0x000048C1,\n    0x00005B7F, 0x000500C7, 0x00000017, 0x00004FA3, 0x0000307A, 0x000003A1,\n    0x000500C2, 0x00000017, 0x000050EB, 0x00004FA3, 0x00005E22, 0x000500C4,\n    0x00000017, 0x00003705, 0x000050EB, 0x000002ED, 0x000500C2, 0x00000017,\n    0x000054F8, 0x0000307A, 0x000001A9, 0x000500C7, 0x00000017, 0x000055B7,\n    0x000054F8, 0x000003A1, 0x000500C2, 0x00000017, 0x00004F2E, 0x000055B7,\n    0x00005E22, 0x000500C4, 0x00000017, 0x000018C1, 0x00004F2E, 0x0000013D,\n    0x00050080, 0x00000017, 0x00004171, 0x00003705, 0x000018C1, 0x000500C2,\n    0x00000017, 0x00005741, 0x0000307A, 0x000003C5, 0x000500C2, 0x00000017,\n    0x00002DCC, 0x00005741, 0x00005E22, 0x00050080, 0x00000017, 0x000045EE,\n    0x00004171, 0x00002DCC, 0x00070050, 0x00000017, 0x00002316, 0x00003FAD,\n    0x00003FAD, 0x00003FAD, 0x00003FAD, 0x000500C2, 0x00000017, 0x000048A8,\n    0x00002316, 0x0000004D, 0x000500C7, 0x00000017, 0x00003BCB, 0x000048A8,\n    0x00000B86, 0x00050084, 0x00000017, 0x00002077, 0x00003BCB, 0x00000A27,\n    0x00050080, 0x00000017, 0x00004E4F, 0x000045EE, 0x00002077, 0x000200F9,\n    0x00002C9B, 0x000200F8, 0x00003EC0, 0x00050051, 0x0000000B, 0x000047B1,\n    0x000027DE, 0x00000003, 0x000400C8, 0x0000000B, 0x00005954, 0x000047B1,\n    0x00070050, 0x00000017, 0x00002A41, 0x00005954, 0x00005954, 0x00005954,\n    0x00005954, 0x000500C2, 0x00000017, 0x00005DD8, 0x00002A41, 0x0000004D,\n    0x000500C7, 0x00000017, 0x00005F43, 0x00005DD8, 0x0000002F, 0x00070050,\n    0x00000017, 0x000043BB, 0x00001DD9, 0x00001DD9, 0x00001DD9, 0x00001DD9,\n    0x00050084, 0x00000017, 0x00005A89, 0x00005F43, 0x000043BB, 0x00070050,\n    0x00000017, 0x0000627E, 0x000047B1, 0x000047B1, 0x000047B1, 0x000047B1,\n    0x000500C2, 0x00000017, 0x0000382D, 0x0000627E, 0x0000004D, 0x000500C7,\n    0x00000017, 0x00005F44, 0x0000382D, 0x0000002F, 0x00070050, 0x00000017,\n    0x0000474F, 0x00001E86, 0x00001E86, 0x00001E86, 0x00001E86, 0x00050084,\n    0x00000017, 0x00003A7C, 0x00005F44, 0x0000474F, 0x00050080, 0x00000017,\n    0x00002C06, 0x00005A89, 0x00003A7C, 0x000500C7, 0x00000017, 0x000060C1,\n    0x00002C06, 0x000003A1, 0x00050086, 0x00000017, 0x0000240C, 0x000060C1,\n    0x0000002F, 0x000500C4, 0x00000017, 0x000044CB, 0x0000240C, 0x000002ED,\n    0x000500C2, 0x00000017, 0x00002AD4, 0x00002C06, 0x000001A9, 0x000500C7,\n    0x00000017, 0x000033C4, 0x00002AD4, 0x000003A1, 0x00050086, 0x00000017,\n    0x000043A3, 0x000033C4, 0x0000002F, 0x000500C4, 0x00000017, 0x00004265,\n    0x000043A3, 0x0000013D, 0x000500C5, 0x00000017, 0x000018B1, 0x000044CB,\n    0x00004265, 0x000500C2, 0x00000017, 0x00003BF3, 0x00002C06, 0x000003C5,\n    0x00050086, 0x00000017, 0x00005DE3, 0x00003BF3, 0x0000002F, 0x000500C5,\n    0x00000017, 0x00002355, 0x000018B1, 0x00005DE3, 0x000500C5, 0x00000017,\n    0x00004582, 0x00002355, 0x00000A27, 0x000200F9, 0x00002C9B, 0x000200F8,\n    0x00002C9B, 0x000700F5, 0x00000017, 0x00004D3A, 0x00004E4F, 0x000025FD,\n    0x00004582, 0x00003EC0, 0x00060041, 0x00000294, 0x00001F75, 0x0000140E,\n    0x00000A0B, 0x00001CEA, 0x0003003E, 0x00001F75, 0x00004D3A, 0x000200F9,\n    0x00004DBE, 0x000200F8, 0x00004DBE, 0x00050080, 0x0000000B, 0x0000560C,\n    0x00001F66, 0x00000A0E, 0x000200F9, 0x00002D69, 0x000200F8, 0x00001B44,\n    0x000200F9, 0x00003A37, 0x000200F8, 0x00003A37, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_dxt3_rgba8_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25213\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n     %v4uint = OpTypeVector %uint 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v3uint = OpTypeVector %uint 3\n     %uint_3 = OpConstant %uint 3\n    %uint_13 = OpConstant %uint 13\n   %uint_248 = OpConstant %uint 248\n     %uint_7 = OpConstant %uint 7\n     %uint_9 = OpConstant %uint 9\n%uint_258048 = OpConstant %uint 258048\n    %uint_12 = OpConstant %uint 12\n     %uint_4 = OpConstant %uint 4\n%uint_260046848 = OpConstant %uint 260046848\n     %uint_5 = OpConstant %uint 5\n%uint_7340039 = OpConstant %uint 7340039\n     %uint_6 = OpConstant %uint 6\n  %uint_3072 = OpConstant %uint 3072\n%uint_1431655765 = OpConstant %uint 1431655765\n     %uint_1 = OpConstant %uint 1\n%uint_2863311530 = OpConstant %uint 2863311530\n     %uint_0 = OpConstant %uint 0\n     %uint_2 = OpConstant %uint 2\n         %77 = OpConstantComposite %v4uint %uint_0 %uint_2 %uint_4 %uint_6\n  %uint_1023 = OpConstant %uint 1023\n    %uint_16 = OpConstant %uint 16\n    %uint_10 = OpConstant %uint 10\n     %uint_8 = OpConstant %uint 8\n    %uint_20 = OpConstant %uint 20\n%uint_16711935 = OpConstant %uint 16711935\n%uint_4278255360 = OpConstant %uint 4278255360\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n      %int_3 = OpConstant %int 3\n      %int_2 = OpConstant %int 2\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %2587 = OpConstantComposite %v3uint %uint_1 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n       %2619 = OpConstantComposite %v3uint %uint_2 %uint_2 %uint_0\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n        %269 = OpConstantComposite %v4uint %uint_0 %uint_4 %uint_8 %uint_12\n    %uint_15 = OpConstant %uint 15\n%uint_285212672 = OpConstant %uint 285212672\n    %uint_24 = OpConstant %uint 24\n    %uint_28 = OpConstant %uint 28\n       %1133 = OpConstantComposite %v4uint %uint_16 %uint_20 %uint_24 %uint_28\n    %uint_32 = OpConstant %uint 32\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n        %993 = OpConstantComposite %v2uint %uint_248 %uint_248\n       %1015 = OpConstantComposite %v2uint %uint_258048 %uint_258048\n       %2547 = OpConstantComposite %v2uint %uint_260046848 %uint_260046848\n       %1912 = OpConstantComposite %v2uint %uint_5 %uint_5\n        %503 = OpConstantComposite %v2uint %uint_7340039 %uint_7340039\n       %1933 = OpConstantComposite %v2uint %uint_6 %uint_6\n         %78 = OpConstantComposite %v2uint %uint_3072 %uint_3072\n       %2878 = OpConstantComposite %v4uint %uint_1431655765 %uint_1431655765 %uint_1431655765 %uint_1431655765\n       %2950 = OpConstantComposite %v4uint %uint_1 %uint_1 %uint_1 %uint_1\n       %2860 = OpConstantComposite %v4uint %uint_2863311530 %uint_2863311530 %uint_2863311530 %uint_2863311530\n         %47 = OpConstantComposite %v4uint %uint_3 %uint_3 %uint_3 %uint_3\n        %929 = OpConstantComposite %v4uint %uint_1023 %uint_1023 %uint_1023 %uint_1023\n        %425 = OpConstantComposite %v4uint %uint_10 %uint_10 %uint_10 %uint_10\n        %965 = OpConstantComposite %v4uint %uint_20 %uint_20 %uint_20 %uint_20\n        %695 = OpConstantComposite %v4uint %uint_15 %uint_15 %uint_15 %uint_15\n        %529 = OpConstantComposite %v4uint %uint_285212672 %uint_285212672 %uint_285212672 %uint_285212672\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %14903 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24540 = OpBitwiseAnd %uint %13606 %uint_1\n      %17270 = OpINotEqual %bool %24540 %uint_0\n      %12328 = OpBitwiseAnd %uint %13606 %uint_2\n      %17284 = OpINotEqual %bool %12328 %uint_0\n       %7856 = OpShiftRightLogical %uint %13606 %uint_2\n      %25058 = OpBitwiseAnd %uint %7856 %uint_3\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20158 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n      %22412 = OpLoad %uint %20158\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_7\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2587\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %14018 DontFlatten\n               OpBranchConditional %24679 %21992 %14018\n      %21992 = OpLabel\n               OpBranch %14903\n      %14018 = OpLabel\n      %17344 = OpShiftLeftLogical %v3uint %21387 %2619\n      %15489 = OpBitcast %v3int %17344\n      %18336 = OpCompositeExtract %int %15489 0\n       %9362 = OpIMul %int %18336 %int_4\n       %6362 = OpCompositeExtract %int %15489 2\n      %14505 = OpBitcast %int %6594\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %15489 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %22412\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %9362 %24535\n      %10404 = OpBitcast %uint %8258\n      %14582 = OpIAdd %uint %22411 %10404\n      %12308 = OpLogicalNot %bool %17270\n               OpSelectionMerge %15035 DontFlatten\n               OpBranchConditional %12308 %8377 %22376\n      %22376 = OpLabel\n               OpSelectionMerge %23536 DontFlatten\n               OpBranchConditional %17284 %24353 %23520\n      %23520 = OpLabel\n       %7964 = OpBitcast %v2int %17136\n      %22120 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %7964 1\n      %12089 = OpShiftRightArithmetic %int %14597 %int_5\n      %22400 = OpBitcast %int %22120\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %7964 0\n      %20423 = OpShiftRightArithmetic %int %25154 %int_5\n      %18864 = OpIAdd %int %7938 %20423\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25154 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17334 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17334 %uint_4\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25154 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20574 = OpBitwiseAnd %int %10425 %int_1\n      %21533 = OpShiftLeftLogical %int %20574 %int_1\n       %8890 = OpBitwiseXor %int %20766 %21533\n      %20598 = OpBitwiseAnd %int %14597 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6551\n       %7092 = OpShiftLeftLogical %int %21575 %int_11\n      %16219 = OpBitwiseOr %int %18430 %7092\n      %14958 = OpShiftRightArithmetic %int %24163 %int_4\n       %6328 = OpBitwiseAnd %int %14958 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %16219 %21630\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6329 = OpBitwiseAnd %int %14959 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24163 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %23536\n      %24353 = OpLabel\n      %25147 = OpBitcast %v3int %21387\n      %19476 = OpShiftRightLogical %uint %22408 %int_5\n      %18810 = OpShiftRightLogical %uint %22409 %int_4\n       %6782 = OpCompositeExtract %int %25147 2\n      %12090 = OpShiftRightArithmetic %int %6782 %int_2\n      %22401 = OpBitcast %int %18810\n       %7939 = OpIMul %int %12090 %22401\n      %25155 = OpCompositeExtract %int %25147 1\n      %19055 = OpShiftRightArithmetic %int %25155 %int_4\n      %11052 = OpIAdd %int %7939 %19055\n      %16898 = OpBitcast %int %19476\n      %14944 = OpIMul %int %11052 %16898\n      %25156 = OpCompositeExtract %int %25147 0\n      %20424 = OpShiftRightArithmetic %int %25156 %int_5\n      %18940 = OpIAdd %int %14944 %20424\n       %8797 = OpShiftLeftLogical %int %18940 %int_7\n      %11434 = OpBitwiseAnd %int %6782 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %25155 %int_1\n      %21364 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21364 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %25156 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17335 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17335 %uint_4\n      %13015 = OpShiftRightArithmetic %int %25155 %int_3\n       %9929 = OpBitwiseXor %int %13015 %12090\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %25156 %int_3\n      %20575 = OpBitwiseAnd %int %9616 %int_3\n      %21534 = OpShiftLeftLogical %int %16793 %int_1\n       %8891 = OpBitwiseXor %int %20575 %21534\n      %20599 = OpBitwiseAnd %int %25155 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6552\n       %7093 = OpShiftLeftLogical %int %16793 %int_11\n      %16220 = OpBitwiseOr %int %18431 %7093\n      %14960 = OpShiftRightArithmetic %int %24144 %int_4\n       %6330 = OpBitwiseAnd %int %14960 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %16220 %21632\n      %14961 = OpShiftRightArithmetic %int %24144 %int_5\n       %6331 = OpBitwiseAnd %int %14961 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24144 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %23536\n      %23536 = OpLabel\n      %10540 = OpPhi %uint %16870 %24353 %16869 %23520\n               OpBranch %15035\n       %8377 = OpLabel\n      %19885 = OpCompositeExtract %uint %21387 0\n      %11246 = OpCompositeExtract %uint %21387 1\n      %18801 = OpCompositeExtract %uint %21387 2\n      %14831 = OpIMul %uint %22409 %18801\n      %20322 = OpIAdd %uint %11246 %14831\n      %21676 = OpIMul %uint %22408 %20322\n      %20398 = OpIAdd %uint %19885 %21676\n      %11367 = OpShiftLeftLogical %uint %20398 %uint_4\n               OpBranch %15035\n      %15035 = OpLabel\n      %11376 = OpPhi %uint %11367 %8377 %10540 %23536\n      %18621 = OpIAdd %uint %11376 %24236\n      %15698 = OpShiftRightLogical %uint %18621 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15698\n       %7338 = OpLoad %v4uint %20399\n      %13760 = OpIEqual %bool %25058 %uint_1\n      %21366 = OpIEqual %bool %25058 %uint_2\n      %22150 = OpLogicalOr %bool %13760 %21366\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %7338 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %7338 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22649 = OpPhi %v4uint %7338 %15035 %16376 %10583\n      %19638 = OpIEqual %bool %25058 %uint_3\n      %15139 = OpLogicalOr %bool %21366 %19638\n               OpSelectionMerge %11720 None\n               OpBranchConditional %15139 %11064 %11720\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22649 %749\n      %15335 = OpShiftRightLogical %v4uint %22649 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %11720\n      %11720 = OpLabel\n      %19545 = OpPhi %v4uint %22649 %13411 %10728 %11064\n      %24377 = OpCompositeExtract %uint %19545 2\n      %15487 = OpShiftLeftLogical %uint %24377 %uint_3\n       %6481 = OpShiftRightLogical %uint %24377 %uint_13\n      %17264 = OpCompositeConstruct %v2uint %15487 %6481\n       %6430 = OpBitwiseAnd %v2uint %17264 %993\n      %20543 = OpShiftLeftLogical %uint %24377 %uint_7\n      %24164 = OpShiftRightLogical %uint %24377 %uint_9\n      %17283 = OpCompositeConstruct %v2uint %20543 %24164\n       %6295 = OpBitwiseAnd %v2uint %17283 %1015\n      %14170 = OpBitwiseOr %v2uint %6430 %6295\n      %23688 = OpShiftLeftLogical %uint %24377 %uint_12\n      %22551 = OpShiftRightLogical %uint %24377 %uint_4\n      %17285 = OpCompositeConstruct %v2uint %23688 %22551\n       %6257 = OpBitwiseAnd %v2uint %17285 %2547\n      %14611 = OpBitwiseOr %v2uint %14170 %6257\n      %22361 = OpShiftRightLogical %v2uint %14611 %1912\n       %6347 = OpBitwiseAnd %v2uint %22361 %503\n      %16454 = OpBitwiseOr %v2uint %14611 %6347\n      %22362 = OpShiftRightLogical %v2uint %16454 %1933\n      %23271 = OpBitwiseAnd %v2uint %22362 %78\n      %14671 = OpBitwiseOr %v2uint %16454 %23271\n      %19422 = OpCompositeExtract %uint %19545 3\n      %15440 = OpCompositeConstruct %v2uint %19422 %19422\n      %25137 = OpVectorShuffle %v4uint %15440 %15440 0 1 0 0\n      %11388 = OpBitwiseAnd %v4uint %25137 %2878\n      %24266 = OpShiftLeftLogical %v4uint %11388 %2950\n      %20653 = OpBitwiseAnd %v4uint %25137 %2860\n      %16599 = OpShiftRightLogical %v4uint %20653 %2950\n      %24000 = OpBitwiseOr %v4uint %24266 %16599\n      %19618 = OpBitwiseAnd %v4uint %24000 %2860\n      %18219 = OpShiftRightLogical %v4uint %19618 %2950\n      %17150 = OpBitwiseXor %v4uint %24000 %18219\n      %20017 = OpCompositeExtract %uint %17150 0\n      %21986 = OpShiftRightLogical %uint %14582 %int_4\n      %21396 = OpNot %uint %20017\n      %21236 = OpCompositeConstruct %v4uint %21396 %21396 %21396 %21396\n      %24040 = OpShiftRightLogical %v4uint %21236 %77\n      %23215 = OpBitwiseAnd %v4uint %24040 %47\n      %19127 = OpCompositeExtract %uint %14671 0\n      %24694 = OpCompositeConstruct %v4uint %19127 %19127 %19127 %19127\n      %24562 = OpIMul %v4uint %23215 %24694\n      %25211 = OpCompositeConstruct %v4uint %20017 %20017 %20017 %20017\n      %14397 = OpShiftRightLogical %v4uint %25211 %77\n      %23216 = OpBitwiseAnd %v4uint %14397 %47\n      %19128 = OpCompositeExtract %uint %14671 1\n       %6535 = OpCompositeConstruct %v4uint %19128 %19128 %19128 %19128\n      %16353 = OpIMul %v4uint %23216 %6535\n      %11267 = OpIAdd %v4uint %24562 %16353\n      %24766 = OpBitwiseAnd %v4uint %11267 %929\n       %9225 = OpUDiv %v4uint %24766 %47\n      %17608 = OpShiftLeftLogical %v4uint %9225 %749\n      %10961 = OpShiftRightLogical %v4uint %11267 %425\n      %13249 = OpBitwiseAnd %v4uint %10961 %929\n      %17312 = OpUDiv %v4uint %13249 %47\n      %16994 = OpShiftLeftLogical %v4uint %17312 %317\n       %6318 = OpBitwiseOr %v4uint %17608 %16994\n      %15344 = OpShiftRightLogical %v4uint %11267 %965\n      %21790 = OpUDiv %v4uint %15344 %47\n       %9340 = OpBitwiseOr %v4uint %6318 %21790\n       %7914 = OpVectorShuffle %v4uint %19545 %19545 0 0 0 0\n       %6996 = OpShiftRightLogical %v4uint %7914 %269\n      %17726 = OpBitwiseAnd %v4uint %6996 %695\n      %23883 = OpIMul %v4uint %17726 %529\n      %10200 = OpIAdd %v4uint %9340 %23883\n      %14167 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %21986\n               OpStore %14167 %10200\n      %12832 = OpCompositeExtract %uint %17344 1\n      %23232 = OpIAdd %uint %12832 %uint_1\n      %17425 = OpULessThan %bool %23232 %6594\n               OpSelectionMerge %9048 DontFlatten\n               OpBranchConditional %17425 %22828 %9048\n      %22828 = OpLabel\n      %15481 = OpIAdd %uint %14582 %22412\n      %14284 = OpShiftRightLogical %uint %15481 %int_4\n      %11878 = OpShiftRightLogical %uint %20017 %uint_8\n      %19204 = OpNot %uint %11878\n      %21237 = OpCompositeConstruct %v4uint %19204 %19204 %19204 %19204\n      %25009 = OpShiftRightLogical %v4uint %21237 %77\n      %14392 = OpBitwiseAnd %v4uint %25009 %47\n      %15567 = OpIMul %v4uint %14392 %24694\n      %21401 = OpCompositeConstruct %v4uint %11878 %11878 %11878 %11878\n      %15366 = OpShiftRightLogical %v4uint %21401 %77\n      %15304 = OpBitwiseAnd %v4uint %15366 %47\n       %7358 = OpIMul %v4uint %15304 %6535\n       %7457 = OpIAdd %v4uint %15567 %7358\n      %24767 = OpBitwiseAnd %v4uint %7457 %929\n       %9226 = OpUDiv %v4uint %24767 %47\n      %17609 = OpShiftLeftLogical %v4uint %9226 %749\n      %10962 = OpShiftRightLogical %v4uint %7457 %425\n      %13250 = OpBitwiseAnd %v4uint %10962 %929\n      %17313 = OpUDiv %v4uint %13250 %47\n      %16995 = OpShiftLeftLogical %v4uint %17313 %317\n       %6319 = OpBitwiseOr %v4uint %17609 %16995\n      %15345 = OpShiftRightLogical %v4uint %7457 %965\n      %23975 = OpUDiv %v4uint %15345 %47\n       %8611 = OpBitwiseOr %v4uint %6319 %23975\n      %10674 = OpShiftRightLogical %v4uint %7914 %1133\n      %16338 = OpBitwiseAnd %v4uint %10674 %695\n      %23884 = OpIMul %v4uint %16338 %529\n      %10201 = OpIAdd %v4uint %8611 %23884\n      %15060 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %14284\n               OpStore %15060 %10201\n      %14840 = OpIAdd %uint %12832 %uint_2\n      %11787 = OpULessThan %bool %14840 %6594\n               OpSelectionMerge %7205 DontFlatten\n               OpBranchConditional %11787 %20882 %7205\n      %20882 = OpLabel\n      %13198 = OpIMul %uint %uint_2 %22412\n      %13467 = OpIAdd %uint %14582 %13198\n      %17286 = OpShiftRightLogical %uint %13467 %int_4\n      %11879 = OpShiftRightLogical %uint %20017 %uint_16\n      %19205 = OpNot %uint %11879\n      %21238 = OpCompositeConstruct %v4uint %19205 %19205 %19205 %19205\n      %25010 = OpShiftRightLogical %v4uint %21238 %77\n      %14393 = OpBitwiseAnd %v4uint %25010 %47\n      %15568 = OpIMul %v4uint %14393 %24694\n      %21403 = OpCompositeConstruct %v4uint %11879 %11879 %11879 %11879\n      %15367 = OpShiftRightLogical %v4uint %21403 %77\n      %15305 = OpBitwiseAnd %v4uint %15367 %47\n       %7359 = OpIMul %v4uint %15305 %6535\n       %7458 = OpIAdd %v4uint %15568 %7359\n      %24768 = OpBitwiseAnd %v4uint %7458 %929\n       %9227 = OpUDiv %v4uint %24768 %47\n      %17610 = OpShiftLeftLogical %v4uint %9227 %749\n      %10963 = OpShiftRightLogical %v4uint %7458 %425\n      %13251 = OpBitwiseAnd %v4uint %10963 %929\n      %17314 = OpUDiv %v4uint %13251 %47\n      %16996 = OpShiftLeftLogical %v4uint %17314 %317\n       %6320 = OpBitwiseOr %v4uint %17610 %16996\n      %15346 = OpShiftRightLogical %v4uint %7458 %965\n      %21791 = OpUDiv %v4uint %15346 %47\n       %9341 = OpBitwiseOr %v4uint %6320 %21791\n       %7915 = OpVectorShuffle %v4uint %19545 %19545 1 1 1 1\n       %6997 = OpShiftRightLogical %v4uint %7915 %269\n      %17727 = OpBitwiseAnd %v4uint %6997 %695\n      %23885 = OpIMul %v4uint %17727 %529\n      %10202 = OpIAdd %v4uint %9341 %23885\n      %15061 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %17286\n               OpStore %15061 %10202\n      %14841 = OpIAdd %uint %12832 %uint_3\n      %11788 = OpULessThan %bool %14841 %6594\n               OpSelectionMerge %18021 DontFlatten\n               OpBranchConditional %11788 %20883 %18021\n      %20883 = OpLabel\n      %13199 = OpIMul %uint %uint_3 %22412\n      %13468 = OpIAdd %uint %14582 %13199\n      %17287 = OpShiftRightLogical %uint %13468 %int_4\n      %11881 = OpShiftRightLogical %uint %20017 %uint_24\n      %19206 = OpNot %uint %11881\n      %21239 = OpCompositeConstruct %v4uint %19206 %19206 %19206 %19206\n      %25011 = OpShiftRightLogical %v4uint %21239 %77\n      %14394 = OpBitwiseAnd %v4uint %25011 %47\n      %15569 = OpIMul %v4uint %14394 %24694\n      %21404 = OpCompositeConstruct %v4uint %11881 %11881 %11881 %11881\n      %15368 = OpShiftRightLogical %v4uint %21404 %77\n      %15306 = OpBitwiseAnd %v4uint %15368 %47\n       %7360 = OpIMul %v4uint %15306 %6535\n       %7459 = OpIAdd %v4uint %15569 %7360\n      %24769 = OpBitwiseAnd %v4uint %7459 %929\n       %9228 = OpUDiv %v4uint %24769 %47\n      %17611 = OpShiftLeftLogical %v4uint %9228 %749\n      %10964 = OpShiftRightLogical %v4uint %7459 %425\n      %13252 = OpBitwiseAnd %v4uint %10964 %929\n      %17315 = OpUDiv %v4uint %13252 %47\n      %16997 = OpShiftLeftLogical %v4uint %17315 %317\n       %6321 = OpBitwiseOr %v4uint %17611 %16997\n      %15347 = OpShiftRightLogical %v4uint %7459 %965\n      %23976 = OpUDiv %v4uint %15347 %47\n       %8612 = OpBitwiseOr %v4uint %6321 %23976\n      %10675 = OpShiftRightLogical %v4uint %7915 %1133\n      %16339 = OpBitwiseAnd %v4uint %10675 %695\n      %23886 = OpIMul %v4uint %16339 %529\n      %10203 = OpIAdd %v4uint %8612 %23886\n      %17359 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %17287\n               OpStore %17359 %10203\n               OpBranch %18021\n      %18021 = OpLabel\n               OpBranch %7205\n       %7205 = OpLabel\n               OpBranch %9048\n       %9048 = OpLabel\n      %22413 = OpIAdd %uint %14582 %uint_16\n               OpSelectionMerge %24688 DontFlatten\n               OpBranchConditional %17270 %7206 %21993\n      %21993 = OpLabel\n               OpBranch %24688\n       %7206 = OpLabel\n               OpBranch %24688\n      %24688 = OpLabel\n      %11377 = OpPhi %uint %uint_32 %7206 %uint_16 %21993\n      %18622 = OpIAdd %uint %18621 %11377\n      %15699 = OpShiftRightLogical %uint %18622 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15699\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %14874 None\n               OpBranchConditional %22150 %10584 %14874\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20654 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20654 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %14874\n      %14874 = OpLabel\n      %10924 = OpPhi %v4uint %14608 %24688 %16377 %10584\n               OpSelectionMerge %11721 None\n               OpBranchConditional %15139 %11065 %11721\n      %11065 = OpLabel\n      %24088 = OpShiftLeftLogical %v4uint %10924 %749\n      %15336 = OpShiftRightLogical %v4uint %10924 %749\n      %10729 = OpBitwiseOr %v4uint %24088 %15336\n               OpBranch %11721\n      %11721 = OpLabel\n      %19546 = OpPhi %v4uint %10924 %14874 %10729 %11065\n      %24378 = OpCompositeExtract %uint %19546 2\n      %15488 = OpShiftLeftLogical %uint %24378 %uint_3\n       %6482 = OpShiftRightLogical %uint %24378 %uint_13\n      %17265 = OpCompositeConstruct %v2uint %15488 %6482\n       %6431 = OpBitwiseAnd %v2uint %17265 %993\n      %20544 = OpShiftLeftLogical %uint %24378 %uint_7\n      %24165 = OpShiftRightLogical %uint %24378 %uint_9\n      %17288 = OpCompositeConstruct %v2uint %20544 %24165\n       %6296 = OpBitwiseAnd %v2uint %17288 %1015\n      %14171 = OpBitwiseOr %v2uint %6431 %6296\n      %23689 = OpShiftLeftLogical %uint %24378 %uint_12\n      %22552 = OpShiftRightLogical %uint %24378 %uint_4\n      %17289 = OpCompositeConstruct %v2uint %23689 %22552\n       %6258 = OpBitwiseAnd %v2uint %17289 %2547\n      %14612 = OpBitwiseOr %v2uint %14171 %6258\n      %22363 = OpShiftRightLogical %v2uint %14612 %1912\n       %6348 = OpBitwiseAnd %v2uint %22363 %503\n      %16455 = OpBitwiseOr %v2uint %14612 %6348\n      %22364 = OpShiftRightLogical %v2uint %16455 %1933\n      %23272 = OpBitwiseAnd %v2uint %22364 %78\n      %14672 = OpBitwiseOr %v2uint %16455 %23272\n      %19423 = OpCompositeExtract %uint %19546 3\n      %15441 = OpCompositeConstruct %v2uint %19423 %19423\n      %25138 = OpVectorShuffle %v4uint %15441 %15441 0 1 0 0\n      %11389 = OpBitwiseAnd %v4uint %25138 %2878\n      %24267 = OpShiftLeftLogical %v4uint %11389 %2950\n      %20655 = OpBitwiseAnd %v4uint %25138 %2860\n      %16600 = OpShiftRightLogical %v4uint %20655 %2950\n      %24001 = OpBitwiseOr %v4uint %24267 %16600\n      %19619 = OpBitwiseAnd %v4uint %24001 %2860\n      %18220 = OpShiftRightLogical %v4uint %19619 %2950\n      %17151 = OpBitwiseXor %v4uint %24001 %18220\n      %20018 = OpCompositeExtract %uint %17151 0\n      %21987 = OpShiftRightLogical %uint %22413 %int_4\n      %21397 = OpNot %uint %20018\n      %21240 = OpCompositeConstruct %v4uint %21397 %21397 %21397 %21397\n      %24041 = OpShiftRightLogical %v4uint %21240 %77\n      %23217 = OpBitwiseAnd %v4uint %24041 %47\n      %19129 = OpCompositeExtract %uint %14672 0\n      %24695 = OpCompositeConstruct %v4uint %19129 %19129 %19129 %19129\n      %24563 = OpIMul %v4uint %23217 %24695\n      %25212 = OpCompositeConstruct %v4uint %20018 %20018 %20018 %20018\n      %14399 = OpShiftRightLogical %v4uint %25212 %77\n      %23218 = OpBitwiseAnd %v4uint %14399 %47\n      %19130 = OpCompositeExtract %uint %14672 1\n       %6536 = OpCompositeConstruct %v4uint %19130 %19130 %19130 %19130\n      %16354 = OpIMul %v4uint %23218 %6536\n      %11268 = OpIAdd %v4uint %24563 %16354\n      %24770 = OpBitwiseAnd %v4uint %11268 %929\n       %9229 = OpUDiv %v4uint %24770 %47\n      %17612 = OpShiftLeftLogical %v4uint %9229 %749\n      %10965 = OpShiftRightLogical %v4uint %11268 %425\n      %13253 = OpBitwiseAnd %v4uint %10965 %929\n      %17316 = OpUDiv %v4uint %13253 %47\n      %16998 = OpShiftLeftLogical %v4uint %17316 %317\n       %6322 = OpBitwiseOr %v4uint %17612 %16998\n      %15348 = OpShiftRightLogical %v4uint %11268 %965\n      %21792 = OpUDiv %v4uint %15348 %47\n       %9342 = OpBitwiseOr %v4uint %6322 %21792\n       %7916 = OpVectorShuffle %v4uint %19546 %19546 0 0 0 0\n       %6998 = OpShiftRightLogical %v4uint %7916 %269\n      %17728 = OpBitwiseAnd %v4uint %6998 %695\n      %23887 = OpIMul %v4uint %17728 %529\n      %10204 = OpIAdd %v4uint %9342 %23887\n      %17321 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %21987\n               OpStore %17321 %10204\n               OpSelectionMerge %7208 DontFlatten\n               OpBranchConditional %17425 %22829 %7208\n      %22829 = OpLabel\n      %15482 = OpIAdd %uint %22413 %22412\n      %14285 = OpShiftRightLogical %uint %15482 %int_4\n      %11882 = OpShiftRightLogical %uint %20018 %uint_8\n      %19207 = OpNot %uint %11882\n      %21241 = OpCompositeConstruct %v4uint %19207 %19207 %19207 %19207\n      %25012 = OpShiftRightLogical %v4uint %21241 %77\n      %14395 = OpBitwiseAnd %v4uint %25012 %47\n      %15570 = OpIMul %v4uint %14395 %24695\n      %21405 = OpCompositeConstruct %v4uint %11882 %11882 %11882 %11882\n      %15369 = OpShiftRightLogical %v4uint %21405 %77\n      %15307 = OpBitwiseAnd %v4uint %15369 %47\n       %7361 = OpIMul %v4uint %15307 %6536\n       %7460 = OpIAdd %v4uint %15570 %7361\n      %24771 = OpBitwiseAnd %v4uint %7460 %929\n       %9230 = OpUDiv %v4uint %24771 %47\n      %17613 = OpShiftLeftLogical %v4uint %9230 %749\n      %10966 = OpShiftRightLogical %v4uint %7460 %425\n      %13254 = OpBitwiseAnd %v4uint %10966 %929\n      %17317 = OpUDiv %v4uint %13254 %47\n      %16999 = OpShiftLeftLogical %v4uint %17317 %317\n       %6323 = OpBitwiseOr %v4uint %17613 %16999\n      %15349 = OpShiftRightLogical %v4uint %7460 %965\n      %23977 = OpUDiv %v4uint %15349 %47\n       %8613 = OpBitwiseOr %v4uint %6323 %23977\n      %10676 = OpShiftRightLogical %v4uint %7916 %1133\n      %16340 = OpBitwiseAnd %v4uint %10676 %695\n      %23888 = OpIMul %v4uint %16340 %529\n      %10205 = OpIAdd %v4uint %8613 %23888\n      %15062 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %14285\n               OpStore %15062 %10205\n      %14842 = OpIAdd %uint %12832 %uint_2\n      %11789 = OpULessThan %bool %14842 %6594\n               OpSelectionMerge %7207 DontFlatten\n               OpBranchConditional %11789 %20884 %7207\n      %20884 = OpLabel\n      %13200 = OpIMul %uint %uint_2 %22412\n      %13469 = OpIAdd %uint %22413 %13200\n      %17290 = OpShiftRightLogical %uint %13469 %int_4\n      %11883 = OpShiftRightLogical %uint %20018 %uint_16\n      %19208 = OpNot %uint %11883\n      %21242 = OpCompositeConstruct %v4uint %19208 %19208 %19208 %19208\n      %25013 = OpShiftRightLogical %v4uint %21242 %77\n      %14396 = OpBitwiseAnd %v4uint %25013 %47\n      %15571 = OpIMul %v4uint %14396 %24695\n      %21406 = OpCompositeConstruct %v4uint %11883 %11883 %11883 %11883\n      %15370 = OpShiftRightLogical %v4uint %21406 %77\n      %15308 = OpBitwiseAnd %v4uint %15370 %47\n       %7362 = OpIMul %v4uint %15308 %6536\n       %7461 = OpIAdd %v4uint %15571 %7362\n      %24772 = OpBitwiseAnd %v4uint %7461 %929\n       %9231 = OpUDiv %v4uint %24772 %47\n      %17614 = OpShiftLeftLogical %v4uint %9231 %749\n      %10967 = OpShiftRightLogical %v4uint %7461 %425\n      %13255 = OpBitwiseAnd %v4uint %10967 %929\n      %17318 = OpUDiv %v4uint %13255 %47\n      %17000 = OpShiftLeftLogical %v4uint %17318 %317\n       %6324 = OpBitwiseOr %v4uint %17614 %17000\n      %15350 = OpShiftRightLogical %v4uint %7461 %965\n      %21793 = OpUDiv %v4uint %15350 %47\n       %9343 = OpBitwiseOr %v4uint %6324 %21793\n       %7917 = OpVectorShuffle %v4uint %19546 %19546 1 1 1 1\n       %6999 = OpShiftRightLogical %v4uint %7917 %269\n      %17729 = OpBitwiseAnd %v4uint %6999 %695\n      %23889 = OpIMul %v4uint %17729 %529\n      %10206 = OpIAdd %v4uint %9343 %23889\n      %15063 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %17290\n               OpStore %15063 %10206\n      %14843 = OpIAdd %uint %12832 %uint_3\n      %11790 = OpULessThan %bool %14843 %6594\n               OpSelectionMerge %18022 DontFlatten\n               OpBranchConditional %11790 %20885 %18022\n      %20885 = OpLabel\n      %13201 = OpIMul %uint %uint_3 %22412\n      %13470 = OpIAdd %uint %22413 %13201\n      %17291 = OpShiftRightLogical %uint %13470 %int_4\n      %11884 = OpShiftRightLogical %uint %20018 %uint_24\n      %19209 = OpNot %uint %11884\n      %21243 = OpCompositeConstruct %v4uint %19209 %19209 %19209 %19209\n      %25014 = OpShiftRightLogical %v4uint %21243 %77\n      %14400 = OpBitwiseAnd %v4uint %25014 %47\n      %15572 = OpIMul %v4uint %14400 %24695\n      %21407 = OpCompositeConstruct %v4uint %11884 %11884 %11884 %11884\n      %15371 = OpShiftRightLogical %v4uint %21407 %77\n      %15309 = OpBitwiseAnd %v4uint %15371 %47\n       %7363 = OpIMul %v4uint %15309 %6536\n       %7462 = OpIAdd %v4uint %15572 %7363\n      %24773 = OpBitwiseAnd %v4uint %7462 %929\n       %9232 = OpUDiv %v4uint %24773 %47\n      %17615 = OpShiftLeftLogical %v4uint %9232 %749\n      %10968 = OpShiftRightLogical %v4uint %7462 %425\n      %13256 = OpBitwiseAnd %v4uint %10968 %929\n      %17319 = OpUDiv %v4uint %13256 %47\n      %17001 = OpShiftLeftLogical %v4uint %17319 %317\n       %6325 = OpBitwiseOr %v4uint %17615 %17001\n      %15351 = OpShiftRightLogical %v4uint %7462 %965\n      %23978 = OpUDiv %v4uint %15351 %47\n       %8614 = OpBitwiseOr %v4uint %6325 %23978\n      %10677 = OpShiftRightLogical %v4uint %7917 %1133\n      %16341 = OpBitwiseAnd %v4uint %10677 %695\n      %23890 = OpIMul %v4uint %16341 %529\n      %10207 = OpIAdd %v4uint %8614 %23890\n      %17360 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %17291\n               OpStore %17360 %10207\n               OpBranch %18022\n      %18022 = OpLabel\n               OpBranch %7207\n       %7207 = OpLabel\n               OpBranch %7208\n       %7208 = OpLabel\n               OpBranch %14903\n      %14903 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_dxt3_rgba8_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x0000627D, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000017,\n    0x0000000B, 0x00000004, 0x00040015, 0x0000000C, 0x00000020, 0x00000001,\n    0x00040017, 0x00000012, 0x0000000C, 0x00000002, 0x00040017, 0x00000016,\n    0x0000000C, 0x00000003, 0x00020014, 0x00000009, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A13, 0x00000003,\n    0x0004002B, 0x0000000B, 0x00000A31, 0x0000000D, 0x0004002B, 0x0000000B,\n    0x0000012F, 0x000000F8, 0x0004002B, 0x0000000B, 0x00000A1F, 0x00000007,\n    0x0004002B, 0x0000000B, 0x00000A25, 0x00000009, 0x0004002B, 0x0000000B,\n    0x00000B47, 0x0003F000, 0x0004002B, 0x0000000B, 0x00000A2E, 0x0000000C,\n    0x0004002B, 0x0000000B, 0x00000A16, 0x00000004, 0x0004002B, 0x0000000B,\n    0x000007FF, 0x0F800000, 0x0004002B, 0x0000000B, 0x00000A19, 0x00000005,\n    0x0004002B, 0x0000000B, 0x000000E9, 0x00700007, 0x0004002B, 0x0000000B,\n    0x00000A1C, 0x00000006, 0x0004002B, 0x0000000B, 0x00000AC1, 0x00000C00,\n    0x0004002B, 0x0000000B, 0x00000A09, 0x55555555, 0x0004002B, 0x0000000B,\n    0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B, 0x00000A08, 0xAAAAAAAA,\n    0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000, 0x0004002B, 0x0000000B,\n    0x00000A10, 0x00000002, 0x0007002C, 0x00000017, 0x0000004D, 0x00000A0A,\n    0x00000A10, 0x00000A16, 0x00000A1C, 0x0004002B, 0x0000000B, 0x00000A44,\n    0x000003FF, 0x0004002B, 0x0000000B, 0x00000A3A, 0x00000010, 0x0004002B,\n    0x0000000B, 0x00000A28, 0x0000000A, 0x0004002B, 0x0000000B, 0x00000A22,\n    0x00000008, 0x0004002B, 0x0000000B, 0x00000A46, 0x00000014, 0x0004002B,\n    0x0000000B, 0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B, 0x000005FD,\n    0xFF00FF00, 0x0004002B, 0x0000000C, 0x00000A17, 0x00000004, 0x0004002B,\n    0x0000000C, 0x00000A1D, 0x00000006, 0x0004002B, 0x0000000C, 0x00000A2C,\n    0x0000000B, 0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001, 0x0004002B,\n    0x0000000C, 0x00000A1A, 0x00000005, 0x0004002B, 0x0000000C, 0x00000A20,\n    0x00000007, 0x0004002B, 0x0000000C, 0x00000A23, 0x00000008, 0x0004002B,\n    0x0000000C, 0x00000A2F, 0x0000000C, 0x0004002B, 0x0000000C, 0x00000A14,\n    0x00000003, 0x0004002B, 0x0000000C, 0x00000A11, 0x00000002, 0x0004002B,\n    0x0000000C, 0x00000A0B, 0x00000000, 0x000A001E, 0x00000489, 0x0000000B,\n    0x0000000B, 0x0000000B, 0x0000000B, 0x00000014, 0x0000000B, 0x0000000B,\n    0x0000000B, 0x00040020, 0x00000706, 0x00000009, 0x00000489, 0x0004003B,\n    0x00000706, 0x00000CE9, 0x00000009, 0x00040020, 0x00000288, 0x00000009,\n    0x0000000B, 0x00040020, 0x00000291, 0x00000009, 0x00000014, 0x00040020,\n    0x00000292, 0x00000001, 0x00000014, 0x0004003B, 0x00000292, 0x00000F48,\n    0x00000001, 0x0006002C, 0x00000014, 0x00000A1B, 0x00000A0D, 0x00000A0A,\n    0x00000A0A, 0x00040017, 0x0000000F, 0x00000009, 0x00000002, 0x0006002C,\n    0x00000014, 0x00000A3B, 0x00000A10, 0x00000A10, 0x00000A0A, 0x0003001D,\n    0x000007DC, 0x00000017, 0x0003001E, 0x000007B4, 0x000007DC, 0x00040020,\n    0x00000A32, 0x00000002, 0x000007B4, 0x0004003B, 0x00000A32, 0x0000107A,\n    0x00000002, 0x00040020, 0x00000294, 0x00000002, 0x00000017, 0x0003001D,\n    0x000007DD, 0x00000017, 0x0003001E, 0x000007B5, 0x000007DD, 0x00040020,\n    0x00000A33, 0x00000002, 0x000007B5, 0x0004003B, 0x00000A33, 0x0000140E,\n    0x00000002, 0x0007002C, 0x00000017, 0x0000010D, 0x00000A0A, 0x00000A16,\n    0x00000A22, 0x00000A2E, 0x0004002B, 0x0000000B, 0x00000A37, 0x0000000F,\n    0x0004002B, 0x0000000B, 0x000006A9, 0x11000000, 0x0004002B, 0x0000000B,\n    0x00000A52, 0x00000018, 0x0004002B, 0x0000000B, 0x00000A5E, 0x0000001C,\n    0x0007002C, 0x00000017, 0x0000046D, 0x00000A3A, 0x00000A46, 0x00000A52,\n    0x00000A5E, 0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020, 0x0006002C,\n    0x00000014, 0x00000BC3, 0x00000A16, 0x00000A6A, 0x00000A0D, 0x0007002C,\n    0x00000017, 0x000009CE, 0x000008A6, 0x000008A6, 0x000008A6, 0x000008A6,\n    0x0007002C, 0x00000017, 0x0000013D, 0x00000A22, 0x00000A22, 0x00000A22,\n    0x00000A22, 0x0007002C, 0x00000017, 0x0000072E, 0x000005FD, 0x000005FD,\n    0x000005FD, 0x000005FD, 0x0007002C, 0x00000017, 0x000002ED, 0x00000A3A,\n    0x00000A3A, 0x00000A3A, 0x00000A3A, 0x0005002C, 0x00000011, 0x000003E1,\n    0x0000012F, 0x0000012F, 0x0005002C, 0x00000011, 0x000003F7, 0x00000B47,\n    0x00000B47, 0x0005002C, 0x00000011, 0x000009F3, 0x000007FF, 0x000007FF,\n    0x0005002C, 0x00000011, 0x00000778, 0x00000A19, 0x00000A19, 0x0005002C,\n    0x00000011, 0x000001F7, 0x000000E9, 0x000000E9, 0x0005002C, 0x00000011,\n    0x0000078D, 0x00000A1C, 0x00000A1C, 0x0005002C, 0x00000011, 0x0000004E,\n    0x00000AC1, 0x00000AC1, 0x0007002C, 0x00000017, 0x00000B3E, 0x00000A09,\n    0x00000A09, 0x00000A09, 0x00000A09, 0x0007002C, 0x00000017, 0x00000B86,\n    0x00000A0D, 0x00000A0D, 0x00000A0D, 0x00000A0D, 0x0007002C, 0x00000017,\n    0x00000B2C, 0x00000A08, 0x00000A08, 0x00000A08, 0x00000A08, 0x0007002C,\n    0x00000017, 0x0000002F, 0x00000A13, 0x00000A13, 0x00000A13, 0x00000A13,\n    0x0007002C, 0x00000017, 0x000003A1, 0x00000A44, 0x00000A44, 0x00000A44,\n    0x00000A44, 0x0007002C, 0x00000017, 0x000001A9, 0x00000A28, 0x00000A28,\n    0x00000A28, 0x00000A28, 0x0007002C, 0x00000017, 0x000003C5, 0x00000A46,\n    0x00000A46, 0x00000A46, 0x00000A46, 0x0007002C, 0x00000017, 0x000002B7,\n    0x00000A37, 0x00000A37, 0x00000A37, 0x00000A37, 0x0007002C, 0x00000017,\n    0x00000211, 0x000006A9, 0x000006A9, 0x000006A9, 0x000006A9, 0x00050036,\n    0x00000008, 0x0000161F, 0x00000000, 0x00000502, 0x000200F8, 0x00003B06,\n    0x000300F7, 0x00003A37, 0x00000000, 0x000300FB, 0x00000A0A, 0x00002E68,\n    0x000200F8, 0x00002E68, 0x00050041, 0x00000288, 0x000060D7, 0x00000CE9,\n    0x00000A0B, 0x0004003D, 0x0000000B, 0x00003526, 0x000060D7, 0x000500C7,\n    0x0000000B, 0x00005FDC, 0x00003526, 0x00000A0D, 0x000500AB, 0x00000009,\n    0x00004376, 0x00005FDC, 0x00000A0A, 0x000500C7, 0x0000000B, 0x00003028,\n    0x00003526, 0x00000A10, 0x000500AB, 0x00000009, 0x00004384, 0x00003028,\n    0x00000A0A, 0x000500C2, 0x0000000B, 0x00001EB0, 0x00003526, 0x00000A10,\n    0x000500C7, 0x0000000B, 0x000061E2, 0x00001EB0, 0x00000A13, 0x00050041,\n    0x00000288, 0x0000492C, 0x00000CE9, 0x00000A0E, 0x0004003D, 0x0000000B,\n    0x00005EAC, 0x0000492C, 0x00050041, 0x00000288, 0x00004EBA, 0x00000CE9,\n    0x00000A11, 0x0004003D, 0x0000000B, 0x00005788, 0x00004EBA, 0x00050041,\n    0x00000288, 0x00004EBB, 0x00000CE9, 0x00000A14, 0x0004003D, 0x0000000B,\n    0x00005789, 0x00004EBB, 0x00050041, 0x00000291, 0x00004EBC, 0x00000CE9,\n    0x00000A17, 0x0004003D, 0x00000014, 0x0000578A, 0x00004EBC, 0x00050041,\n    0x00000288, 0x00004EBD, 0x00000CE9, 0x00000A1A, 0x0004003D, 0x0000000B,\n    0x0000578B, 0x00004EBD, 0x00050041, 0x00000288, 0x00004EBE, 0x00000CE9,\n    0x00000A1D, 0x0004003D, 0x0000000B, 0x0000578C, 0x00004EBE, 0x00050041,\n    0x00000288, 0x00004E6E, 0x00000CE9, 0x00000A20, 0x0004003D, 0x0000000B,\n    0x000019C2, 0x00004E6E, 0x0004003D, 0x00000014, 0x00002A0E, 0x00000F48,\n    0x000500C4, 0x00000014, 0x0000538B, 0x00002A0E, 0x00000A1B, 0x0007004F,\n    0x00000011, 0x000042F0, 0x0000538B, 0x0000538B, 0x00000000, 0x00000001,\n    0x0007004F, 0x00000011, 0x0000242F, 0x0000578A, 0x0000578A, 0x00000000,\n    0x00000001, 0x000500AE, 0x0000000F, 0x00004288, 0x000042F0, 0x0000242F,\n    0x0004009A, 0x00000009, 0x00006067, 0x00004288, 0x000300F7, 0x000036C2,\n    0x00000002, 0x000400FA, 0x00006067, 0x000055E8, 0x000036C2, 0x000200F8,\n    0x000055E8, 0x000200F9, 0x00003A37, 0x000200F8, 0x000036C2, 0x000500C4,\n    0x00000014, 0x000043C0, 0x0000538B, 0x00000A3B, 0x0004007C, 0x00000016,\n    0x00003C81, 0x000043C0, 0x00050051, 0x0000000C, 0x000047A0, 0x00003C81,\n    0x00000000, 0x00050084, 0x0000000C, 0x00002492, 0x000047A0, 0x00000A17,\n    0x00050051, 0x0000000C, 0x000018DA, 0x00003C81, 0x00000002, 0x0004007C,\n    0x0000000C, 0x000038A9, 0x000019C2, 0x00050084, 0x0000000C, 0x00002C0F,\n    0x000018DA, 0x000038A9, 0x00050051, 0x0000000C, 0x000044BE, 0x00003C81,\n    0x00000001, 0x00050080, 0x0000000C, 0x000056D4, 0x00002C0F, 0x000044BE,\n    0x0004007C, 0x0000000C, 0x00005785, 0x0000578C, 0x00050084, 0x0000000C,\n    0x00005FD7, 0x000056D4, 0x00005785, 0x00050080, 0x0000000C, 0x00002042,\n    0x00002492, 0x00005FD7, 0x0004007C, 0x0000000B, 0x000028A4, 0x00002042,\n    0x00050080, 0x0000000B, 0x000038F6, 0x0000578B, 0x000028A4, 0x000400A8,\n    0x00000009, 0x00003014, 0x00004376, 0x000300F7, 0x00003ABB, 0x00000002,\n    0x000400FA, 0x00003014, 0x000020B9, 0x00005768, 0x000200F8, 0x00005768,\n    0x000300F7, 0x00005BF0, 0x00000002, 0x000400FA, 0x00004384, 0x00005F21,\n    0x00005BE0, 0x000200F8, 0x00005BE0, 0x0004007C, 0x00000012, 0x00001F1C,\n    0x000042F0, 0x000500C2, 0x0000000B, 0x00005668, 0x00005788, 0x00000A1A,\n    0x00050051, 0x0000000C, 0x00003905, 0x00001F1C, 0x00000001, 0x000500C3,\n    0x0000000C, 0x00002F39, 0x00003905, 0x00000A1A, 0x0004007C, 0x0000000C,\n    0x00005780, 0x00005668, 0x00050084, 0x0000000C, 0x00001F02, 0x00002F39,\n    0x00005780, 0x00050051, 0x0000000C, 0x00006242, 0x00001F1C, 0x00000000,\n    0x000500C3, 0x0000000C, 0x00004FC7, 0x00006242, 0x00000A1A, 0x00050080,\n    0x0000000C, 0x000049B0, 0x00001F02, 0x00004FC7, 0x000500C4, 0x0000000C,\n    0x0000254A, 0x000049B0, 0x00000A1D, 0x000500C3, 0x0000000C, 0x0000603B,\n    0x00003905, 0x00000A0E, 0x000500C7, 0x0000000C, 0x0000539A, 0x0000603B,\n    0x00000A20, 0x000500C4, 0x0000000C, 0x0000534A, 0x0000539A, 0x00000A14,\n    0x000500C7, 0x0000000C, 0x00004EA5, 0x00006242, 0x00000A20, 0x000500C5,\n    0x0000000C, 0x00002B1A, 0x0000534A, 0x00004EA5, 0x000500C5, 0x0000000C,\n    0x000043B6, 0x0000254A, 0x00002B1A, 0x000500C4, 0x0000000C, 0x00005E63,\n    0x000043B6, 0x00000A16, 0x000500C3, 0x0000000C, 0x000031DE, 0x00003905,\n    0x00000A17, 0x000500C7, 0x0000000C, 0x00005447, 0x000031DE, 0x00000A0E,\n    0x000500C3, 0x0000000C, 0x000028A6, 0x00006242, 0x00000A14, 0x000500C7,\n    0x0000000C, 0x0000511E, 0x000028A6, 0x00000A14, 0x000500C3, 0x0000000C,\n    0x000028B9, 0x00003905, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000505E,\n    0x000028B9, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000541D, 0x0000505E,\n    0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BA, 0x0000511E, 0x0000541D,\n    0x000500C7, 0x0000000C, 0x00005076, 0x00003905, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x00005228, 0x00005076, 0x00000A17, 0x000500C4, 0x0000000C,\n    0x00001997, 0x000022BA, 0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FE,\n    0x00005228, 0x00001997, 0x000500C4, 0x0000000C, 0x00001BB4, 0x00005447,\n    0x00000A2C, 0x000500C5, 0x0000000C, 0x00003F5B, 0x000047FE, 0x00001BB4,\n    0x000500C3, 0x0000000C, 0x00003A6E, 0x00005E63, 0x00000A17, 0x000500C7,\n    0x0000000C, 0x000018B8, 0x00003A6E, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x0000547E, 0x000018B8, 0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A8,\n    0x00003F5B, 0x0000547E, 0x000500C3, 0x0000000C, 0x00003A6F, 0x00005E63,\n    0x00000A1A, 0x000500C7, 0x0000000C, 0x000018B9, 0x00003A6F, 0x00000A20,\n    0x000500C4, 0x0000000C, 0x0000547F, 0x000018B9, 0x00000A23, 0x000500C5,\n    0x0000000C, 0x0000456F, 0x000045A8, 0x0000547F, 0x000500C3, 0x0000000C,\n    0x00003C88, 0x00005E63, 0x00000A23, 0x000500C4, 0x0000000C, 0x00002824,\n    0x00003C88, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B79, 0x0000456F,\n    0x00002824, 0x0004007C, 0x0000000B, 0x000041E5, 0x00003B79, 0x000200F9,\n    0x00005BF0, 0x000200F8, 0x00005F21, 0x0004007C, 0x00000016, 0x0000623B,\n    0x0000538B, 0x000500C2, 0x0000000B, 0x00004C14, 0x00005788, 0x00000A1A,\n    0x000500C2, 0x0000000B, 0x0000497A, 0x00005789, 0x00000A17, 0x00050051,\n    0x0000000C, 0x00001A7E, 0x0000623B, 0x00000002, 0x000500C3, 0x0000000C,\n    0x00002F3A, 0x00001A7E, 0x00000A11, 0x0004007C, 0x0000000C, 0x00005781,\n    0x0000497A, 0x00050084, 0x0000000C, 0x00001F03, 0x00002F3A, 0x00005781,\n    0x00050051, 0x0000000C, 0x00006243, 0x0000623B, 0x00000001, 0x000500C3,\n    0x0000000C, 0x00004A6F, 0x00006243, 0x00000A17, 0x00050080, 0x0000000C,\n    0x00002B2C, 0x00001F03, 0x00004A6F, 0x0004007C, 0x0000000C, 0x00004202,\n    0x00004C14, 0x00050084, 0x0000000C, 0x00003A60, 0x00002B2C, 0x00004202,\n    0x00050051, 0x0000000C, 0x00006244, 0x0000623B, 0x00000000, 0x000500C3,\n    0x0000000C, 0x00004FC8, 0x00006244, 0x00000A1A, 0x00050080, 0x0000000C,\n    0x000049FC, 0x00003A60, 0x00004FC8, 0x000500C4, 0x0000000C, 0x0000225D,\n    0x000049FC, 0x00000A20, 0x000500C7, 0x0000000C, 0x00002CAA, 0x00001A7E,\n    0x00000A14, 0x000500C4, 0x0000000C, 0x00004CAE, 0x00002CAA, 0x00000A1A,\n    0x000500C3, 0x0000000C, 0x0000383E, 0x00006243, 0x00000A0E, 0x000500C7,\n    0x0000000C, 0x00005374, 0x0000383E, 0x00000A14, 0x000500C4, 0x0000000C,\n    0x000054CA, 0x00005374, 0x00000A14, 0x000500C5, 0x0000000C, 0x000042CE,\n    0x00004CAE, 0x000054CA, 0x000500C7, 0x0000000C, 0x000050D5, 0x00006244,\n    0x00000A20, 0x000500C5, 0x0000000C, 0x00003ADD, 0x000042CE, 0x000050D5,\n    0x000500C5, 0x0000000C, 0x000043B7, 0x0000225D, 0x00003ADD, 0x000500C4,\n    0x0000000C, 0x00005E50, 0x000043B7, 0x00000A16, 0x000500C3, 0x0000000C,\n    0x000032D7, 0x00006243, 0x00000A14, 0x000500C6, 0x0000000C, 0x000026C9,\n    0x000032D7, 0x00002F3A, 0x000500C7, 0x0000000C, 0x00004199, 0x000026C9,\n    0x00000A0E, 0x000500C3, 0x0000000C, 0x00002590, 0x00006244, 0x00000A14,\n    0x000500C7, 0x0000000C, 0x0000505F, 0x00002590, 0x00000A14, 0x000500C4,\n    0x0000000C, 0x0000541E, 0x00004199, 0x00000A0E, 0x000500C6, 0x0000000C,\n    0x000022BB, 0x0000505F, 0x0000541E, 0x000500C7, 0x0000000C, 0x00005077,\n    0x00006243, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005229, 0x00005077,\n    0x00000A17, 0x000500C4, 0x0000000C, 0x00001998, 0x000022BB, 0x00000A1D,\n    0x000500C5, 0x0000000C, 0x000047FF, 0x00005229, 0x00001998, 0x000500C4,\n    0x0000000C, 0x00001BB5, 0x00004199, 0x00000A2C, 0x000500C5, 0x0000000C,\n    0x00003F5C, 0x000047FF, 0x00001BB5, 0x000500C3, 0x0000000C, 0x00003A70,\n    0x00005E50, 0x00000A17, 0x000500C7, 0x0000000C, 0x000018BA, 0x00003A70,\n    0x00000A0E, 0x000500C4, 0x0000000C, 0x00005480, 0x000018BA, 0x00000A1A,\n    0x000500C5, 0x0000000C, 0x000045A9, 0x00003F5C, 0x00005480, 0x000500C3,\n    0x0000000C, 0x00003A71, 0x00005E50, 0x00000A1A, 0x000500C7, 0x0000000C,\n    0x000018BB, 0x00003A71, 0x00000A20, 0x000500C4, 0x0000000C, 0x00005481,\n    0x000018BB, 0x00000A23, 0x000500C5, 0x0000000C, 0x00004570, 0x000045A9,\n    0x00005481, 0x000500C3, 0x0000000C, 0x00003C89, 0x00005E50, 0x00000A23,\n    0x000500C4, 0x0000000C, 0x00002825, 0x00003C89, 0x00000A2F, 0x000500C5,\n    0x0000000C, 0x00003B7A, 0x00004570, 0x00002825, 0x0004007C, 0x0000000B,\n    0x000041E6, 0x00003B7A, 0x000200F9, 0x00005BF0, 0x000200F8, 0x00005BF0,\n    0x000700F5, 0x0000000B, 0x0000292C, 0x000041E6, 0x00005F21, 0x000041E5,\n    0x00005BE0, 0x000200F9, 0x00003ABB, 0x000200F8, 0x000020B9, 0x00050051,\n    0x0000000B, 0x00004DAD, 0x0000538B, 0x00000000, 0x00050051, 0x0000000B,\n    0x00002BEE, 0x0000538B, 0x00000001, 0x00050051, 0x0000000B, 0x00004971,\n    0x0000538B, 0x00000002, 0x00050084, 0x0000000B, 0x000039EF, 0x00005789,\n    0x00004971, 0x00050080, 0x0000000B, 0x00004F62, 0x00002BEE, 0x000039EF,\n    0x00050084, 0x0000000B, 0x000054AC, 0x00005788, 0x00004F62, 0x00050080,\n    0x0000000B, 0x00004FAE, 0x00004DAD, 0x000054AC, 0x000500C4, 0x0000000B,\n    0x00002C67, 0x00004FAE, 0x00000A16, 0x000200F9, 0x00003ABB, 0x000200F8,\n    0x00003ABB, 0x000700F5, 0x0000000B, 0x00002C70, 0x00002C67, 0x000020B9,\n    0x0000292C, 0x00005BF0, 0x00050080, 0x0000000B, 0x000048BD, 0x00002C70,\n    0x00005EAC, 0x000500C2, 0x0000000B, 0x00003D52, 0x000048BD, 0x00000A17,\n    0x00060041, 0x00000294, 0x00004FAF, 0x0000107A, 0x00000A0B, 0x00003D52,\n    0x0004003D, 0x00000017, 0x00001CAA, 0x00004FAF, 0x000500AA, 0x00000009,\n    0x000035C0, 0x000061E2, 0x00000A0D, 0x000500AA, 0x00000009, 0x00005376,\n    0x000061E2, 0x00000A10, 0x000500A6, 0x00000009, 0x00005686, 0x000035C0,\n    0x00005376, 0x000300F7, 0x00003463, 0x00000000, 0x000400FA, 0x00005686,\n    0x00002957, 0x00003463, 0x000200F8, 0x00002957, 0x000500C7, 0x00000017,\n    0x0000475F, 0x00001CAA, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D1,\n    0x0000475F, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AC, 0x00001CAA,\n    0x0000072E, 0x000500C2, 0x00000017, 0x0000448D, 0x000050AC, 0x0000013D,\n    0x000500C5, 0x00000017, 0x00003FF8, 0x000024D1, 0x0000448D, 0x000200F9,\n    0x00003463, 0x000200F8, 0x00003463, 0x000700F5, 0x00000017, 0x00005879,\n    0x00001CAA, 0x00003ABB, 0x00003FF8, 0x00002957, 0x000500AA, 0x00000009,\n    0x00004CB6, 0x000061E2, 0x00000A13, 0x000500A6, 0x00000009, 0x00003B23,\n    0x00005376, 0x00004CB6, 0x000300F7, 0x00002DC8, 0x00000000, 0x000400FA,\n    0x00003B23, 0x00002B38, 0x00002DC8, 0x000200F8, 0x00002B38, 0x000500C4,\n    0x00000017, 0x00005E17, 0x00005879, 0x000002ED, 0x000500C2, 0x00000017,\n    0x00003BE7, 0x00005879, 0x000002ED, 0x000500C5, 0x00000017, 0x000029E8,\n    0x00005E17, 0x00003BE7, 0x000200F9, 0x00002DC8, 0x000200F8, 0x00002DC8,\n    0x000700F5, 0x00000017, 0x00004C59, 0x00005879, 0x00003463, 0x000029E8,\n    0x00002B38, 0x00050051, 0x0000000B, 0x00005F39, 0x00004C59, 0x00000002,\n    0x000500C4, 0x0000000B, 0x00003C7F, 0x00005F39, 0x00000A13, 0x000500C2,\n    0x0000000B, 0x00001951, 0x00005F39, 0x00000A31, 0x00050050, 0x00000011,\n    0x00004370, 0x00003C7F, 0x00001951, 0x000500C7, 0x00000011, 0x0000191E,\n    0x00004370, 0x000003E1, 0x000500C4, 0x0000000B, 0x0000503F, 0x00005F39,\n    0x00000A1F, 0x000500C2, 0x0000000B, 0x00005E64, 0x00005F39, 0x00000A25,\n    0x00050050, 0x00000011, 0x00004383, 0x0000503F, 0x00005E64, 0x000500C7,\n    0x00000011, 0x00001897, 0x00004383, 0x000003F7, 0x000500C5, 0x00000011,\n    0x0000375A, 0x0000191E, 0x00001897, 0x000500C4, 0x0000000B, 0x00005C88,\n    0x00005F39, 0x00000A2E, 0x000500C2, 0x0000000B, 0x00005817, 0x00005F39,\n    0x00000A16, 0x00050050, 0x00000011, 0x00004385, 0x00005C88, 0x00005817,\n    0x000500C7, 0x00000011, 0x00001871, 0x00004385, 0x000009F3, 0x000500C5,\n    0x00000011, 0x00003913, 0x0000375A, 0x00001871, 0x000500C2, 0x00000011,\n    0x00005759, 0x00003913, 0x00000778, 0x000500C7, 0x00000011, 0x000018CB,\n    0x00005759, 0x000001F7, 0x000500C5, 0x00000011, 0x00004046, 0x00003913,\n    0x000018CB, 0x000500C2, 0x00000011, 0x0000575A, 0x00004046, 0x0000078D,\n    0x000500C7, 0x00000011, 0x00005AE7, 0x0000575A, 0x0000004E, 0x000500C5,\n    0x00000011, 0x0000394F, 0x00004046, 0x00005AE7, 0x00050051, 0x0000000B,\n    0x00004BDE, 0x00004C59, 0x00000003, 0x00050050, 0x00000011, 0x00003C50,\n    0x00004BDE, 0x00004BDE, 0x0009004F, 0x00000017, 0x00006231, 0x00003C50,\n    0x00003C50, 0x00000000, 0x00000001, 0x00000000, 0x00000000, 0x000500C7,\n    0x00000017, 0x00002C7C, 0x00006231, 0x00000B3E, 0x000500C4, 0x00000017,\n    0x00005ECA, 0x00002C7C, 0x00000B86, 0x000500C7, 0x00000017, 0x000050AD,\n    0x00006231, 0x00000B2C, 0x000500C2, 0x00000017, 0x000040D7, 0x000050AD,\n    0x00000B86, 0x000500C5, 0x00000017, 0x00005DC0, 0x00005ECA, 0x000040D7,\n    0x000500C7, 0x00000017, 0x00004CA2, 0x00005DC0, 0x00000B2C, 0x000500C2,\n    0x00000017, 0x0000472B, 0x00004CA2, 0x00000B86, 0x000500C6, 0x00000017,\n    0x000042FE, 0x00005DC0, 0x0000472B, 0x00050051, 0x0000000B, 0x00004E31,\n    0x000042FE, 0x00000000, 0x000500C2, 0x0000000B, 0x000055E2, 0x000038F6,\n    0x00000A17, 0x000400C8, 0x0000000B, 0x00005394, 0x00004E31, 0x00070050,\n    0x00000017, 0x000052F4, 0x00005394, 0x00005394, 0x00005394, 0x00005394,\n    0x000500C2, 0x00000017, 0x00005DE8, 0x000052F4, 0x0000004D, 0x000500C7,\n    0x00000017, 0x00005AAF, 0x00005DE8, 0x0000002F, 0x00050051, 0x0000000B,\n    0x00004AB7, 0x0000394F, 0x00000000, 0x00070050, 0x00000017, 0x00006076,\n    0x00004AB7, 0x00004AB7, 0x00004AB7, 0x00004AB7, 0x00050084, 0x00000017,\n    0x00005FF2, 0x00005AAF, 0x00006076, 0x00070050, 0x00000017, 0x0000627B,\n    0x00004E31, 0x00004E31, 0x00004E31, 0x00004E31, 0x000500C2, 0x00000017,\n    0x0000383D, 0x0000627B, 0x0000004D, 0x000500C7, 0x00000017, 0x00005AB0,\n    0x0000383D, 0x0000002F, 0x00050051, 0x0000000B, 0x00004AB8, 0x0000394F,\n    0x00000001, 0x00070050, 0x00000017, 0x00001987, 0x00004AB8, 0x00004AB8,\n    0x00004AB8, 0x00004AB8, 0x00050084, 0x00000017, 0x00003FE1, 0x00005AB0,\n    0x00001987, 0x00050080, 0x00000017, 0x00002C03, 0x00005FF2, 0x00003FE1,\n    0x000500C7, 0x00000017, 0x000060BE, 0x00002C03, 0x000003A1, 0x00050086,\n    0x00000017, 0x00002409, 0x000060BE, 0x0000002F, 0x000500C4, 0x00000017,\n    0x000044C8, 0x00002409, 0x000002ED, 0x000500C2, 0x00000017, 0x00002AD1,\n    0x00002C03, 0x000001A9, 0x000500C7, 0x00000017, 0x000033C1, 0x00002AD1,\n    0x000003A1, 0x00050086, 0x00000017, 0x000043A0, 0x000033C1, 0x0000002F,\n    0x000500C4, 0x00000017, 0x00004262, 0x000043A0, 0x0000013D, 0x000500C5,\n    0x00000017, 0x000018AE, 0x000044C8, 0x00004262, 0x000500C2, 0x00000017,\n    0x00003BF0, 0x00002C03, 0x000003C5, 0x00050086, 0x00000017, 0x0000551E,\n    0x00003BF0, 0x0000002F, 0x000500C5, 0x00000017, 0x0000247C, 0x000018AE,\n    0x0000551E, 0x0009004F, 0x00000017, 0x00001EEA, 0x00004C59, 0x00004C59,\n    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000500C2, 0x00000017,\n    0x00001B54, 0x00001EEA, 0x0000010D, 0x000500C7, 0x00000017, 0x0000453E,\n    0x00001B54, 0x000002B7, 0x00050084, 0x00000017, 0x00005D4B, 0x0000453E,\n    0x00000211, 0x00050080, 0x00000017, 0x000027D8, 0x0000247C, 0x00005D4B,\n    0x00060041, 0x00000294, 0x00003757, 0x0000140E, 0x00000A0B, 0x000055E2,\n    0x0003003E, 0x00003757, 0x000027D8, 0x00050051, 0x0000000B, 0x00003220,\n    0x000043C0, 0x00000001, 0x00050080, 0x0000000B, 0x00005AC0, 0x00003220,\n    0x00000A0D, 0x000500B0, 0x00000009, 0x00004411, 0x00005AC0, 0x000019C2,\n    0x000300F7, 0x00002358, 0x00000002, 0x000400FA, 0x00004411, 0x0000592C,\n    0x00002358, 0x000200F8, 0x0000592C, 0x00050080, 0x0000000B, 0x00003C79,\n    0x000038F6, 0x0000578C, 0x000500C2, 0x0000000B, 0x000037CC, 0x00003C79,\n    0x00000A17, 0x000500C2, 0x0000000B, 0x00002E66, 0x00004E31, 0x00000A22,\n    0x000400C8, 0x0000000B, 0x00004B04, 0x00002E66, 0x00070050, 0x00000017,\n    0x000052F5, 0x00004B04, 0x00004B04, 0x00004B04, 0x00004B04, 0x000500C2,\n    0x00000017, 0x000061B1, 0x000052F5, 0x0000004D, 0x000500C7, 0x00000017,\n    0x00003838, 0x000061B1, 0x0000002F, 0x00050084, 0x00000017, 0x00003CCF,\n    0x00003838, 0x00006076, 0x00070050, 0x00000017, 0x00005399, 0x00002E66,\n    0x00002E66, 0x00002E66, 0x00002E66, 0x000500C2, 0x00000017, 0x00003C06,\n    0x00005399, 0x0000004D, 0x000500C7, 0x00000017, 0x00003BC8, 0x00003C06,\n    0x0000002F, 0x00050084, 0x00000017, 0x00001CBE, 0x00003BC8, 0x00001987,\n    0x00050080, 0x00000017, 0x00001D21, 0x00003CCF, 0x00001CBE, 0x000500C7,\n    0x00000017, 0x000060BF, 0x00001D21, 0x000003A1, 0x00050086, 0x00000017,\n    0x0000240A, 0x000060BF, 0x0000002F, 0x000500C4, 0x00000017, 0x000044C9,\n    0x0000240A, 0x000002ED, 0x000500C2, 0x00000017, 0x00002AD2, 0x00001D21,\n    0x000001A9, 0x000500C7, 0x00000017, 0x000033C2, 0x00002AD2, 0x000003A1,\n    0x00050086, 0x00000017, 0x000043A1, 0x000033C2, 0x0000002F, 0x000500C4,\n    0x00000017, 0x00004263, 0x000043A1, 0x0000013D, 0x000500C5, 0x00000017,\n    0x000018AF, 0x000044C9, 0x00004263, 0x000500C2, 0x00000017, 0x00003BF1,\n    0x00001D21, 0x000003C5, 0x00050086, 0x00000017, 0x00005DA7, 0x00003BF1,\n    0x0000002F, 0x000500C5, 0x00000017, 0x000021A3, 0x000018AF, 0x00005DA7,\n    0x000500C2, 0x00000017, 0x000029B2, 0x00001EEA, 0x0000046D, 0x000500C7,\n    0x00000017, 0x00003FD2, 0x000029B2, 0x000002B7, 0x00050084, 0x00000017,\n    0x00005D4C, 0x00003FD2, 0x00000211, 0x00050080, 0x00000017, 0x000027D9,\n    0x000021A3, 0x00005D4C, 0x00060041, 0x00000294, 0x00003AD4, 0x0000140E,\n    0x00000A0B, 0x000037CC, 0x0003003E, 0x00003AD4, 0x000027D9, 0x00050080,\n    0x0000000B, 0x000039F8, 0x00003220, 0x00000A10, 0x000500B0, 0x00000009,\n    0x00002E0B, 0x000039F8, 0x000019C2, 0x000300F7, 0x00001C25, 0x00000002,\n    0x000400FA, 0x00002E0B, 0x00005192, 0x00001C25, 0x000200F8, 0x00005192,\n    0x00050084, 0x0000000B, 0x0000338E, 0x00000A10, 0x0000578C, 0x00050080,\n    0x0000000B, 0x0000349B, 0x000038F6, 0x0000338E, 0x000500C2, 0x0000000B,\n    0x00004386, 0x0000349B, 0x00000A17, 0x000500C2, 0x0000000B, 0x00002E67,\n    0x00004E31, 0x00000A3A, 0x000400C8, 0x0000000B, 0x00004B05, 0x00002E67,\n    0x00070050, 0x00000017, 0x000052F6, 0x00004B05, 0x00004B05, 0x00004B05,\n    0x00004B05, 0x000500C2, 0x00000017, 0x000061B2, 0x000052F6, 0x0000004D,\n    0x000500C7, 0x00000017, 0x00003839, 0x000061B2, 0x0000002F, 0x00050084,\n    0x00000017, 0x00003CD0, 0x00003839, 0x00006076, 0x00070050, 0x00000017,\n    0x0000539B, 0x00002E67, 0x00002E67, 0x00002E67, 0x00002E67, 0x000500C2,\n    0x00000017, 0x00003C07, 0x0000539B, 0x0000004D, 0x000500C7, 0x00000017,\n    0x00003BC9, 0x00003C07, 0x0000002F, 0x00050084, 0x00000017, 0x00001CBF,\n    0x00003BC9, 0x00001987, 0x00050080, 0x00000017, 0x00001D22, 0x00003CD0,\n    0x00001CBF, 0x000500C7, 0x00000017, 0x000060C0, 0x00001D22, 0x000003A1,\n    0x00050086, 0x00000017, 0x0000240B, 0x000060C0, 0x0000002F, 0x000500C4,\n    0x00000017, 0x000044CA, 0x0000240B, 0x000002ED, 0x000500C2, 0x00000017,\n    0x00002AD3, 0x00001D22, 0x000001A9, 0x000500C7, 0x00000017, 0x000033C3,\n    0x00002AD3, 0x000003A1, 0x00050086, 0x00000017, 0x000043A2, 0x000033C3,\n    0x0000002F, 0x000500C4, 0x00000017, 0x00004264, 0x000043A2, 0x0000013D,\n    0x000500C5, 0x00000017, 0x000018B0, 0x000044CA, 0x00004264, 0x000500C2,\n    0x00000017, 0x00003BF2, 0x00001D22, 0x000003C5, 0x00050086, 0x00000017,\n    0x0000551F, 0x00003BF2, 0x0000002F, 0x000500C5, 0x00000017, 0x0000247D,\n    0x000018B0, 0x0000551F, 0x0009004F, 0x00000017, 0x00001EEB, 0x00004C59,\n    0x00004C59, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x000500C2,\n    0x00000017, 0x00001B55, 0x00001EEB, 0x0000010D, 0x000500C7, 0x00000017,\n    0x0000453F, 0x00001B55, 0x000002B7, 0x00050084, 0x00000017, 0x00005D4D,\n    0x0000453F, 0x00000211, 0x00050080, 0x00000017, 0x000027DA, 0x0000247D,\n    0x00005D4D, 0x00060041, 0x00000294, 0x00003AD5, 0x0000140E, 0x00000A0B,\n    0x00004386, 0x0003003E, 0x00003AD5, 0x000027DA, 0x00050080, 0x0000000B,\n    0x000039F9, 0x00003220, 0x00000A13, 0x000500B0, 0x00000009, 0x00002E0C,\n    0x000039F9, 0x000019C2, 0x000300F7, 0x00004665, 0x00000002, 0x000400FA,\n    0x00002E0C, 0x00005193, 0x00004665, 0x000200F8, 0x00005193, 0x00050084,\n    0x0000000B, 0x0000338F, 0x00000A13, 0x0000578C, 0x00050080, 0x0000000B,\n    0x0000349C, 0x000038F6, 0x0000338F, 0x000500C2, 0x0000000B, 0x00004387,\n    0x0000349C, 0x00000A17, 0x000500C2, 0x0000000B, 0x00002E69, 0x00004E31,\n    0x00000A52, 0x000400C8, 0x0000000B, 0x00004B06, 0x00002E69, 0x00070050,\n    0x00000017, 0x000052F7, 0x00004B06, 0x00004B06, 0x00004B06, 0x00004B06,\n    0x000500C2, 0x00000017, 0x000061B3, 0x000052F7, 0x0000004D, 0x000500C7,\n    0x00000017, 0x0000383A, 0x000061B3, 0x0000002F, 0x00050084, 0x00000017,\n    0x00003CD1, 0x0000383A, 0x00006076, 0x00070050, 0x00000017, 0x0000539C,\n    0x00002E69, 0x00002E69, 0x00002E69, 0x00002E69, 0x000500C2, 0x00000017,\n    0x00003C08, 0x0000539C, 0x0000004D, 0x000500C7, 0x00000017, 0x00003BCA,\n    0x00003C08, 0x0000002F, 0x00050084, 0x00000017, 0x00001CC0, 0x00003BCA,\n    0x00001987, 0x00050080, 0x00000017, 0x00001D23, 0x00003CD1, 0x00001CC0,\n    0x000500C7, 0x00000017, 0x000060C1, 0x00001D23, 0x000003A1, 0x00050086,\n    0x00000017, 0x0000240C, 0x000060C1, 0x0000002F, 0x000500C4, 0x00000017,\n    0x000044CB, 0x0000240C, 0x000002ED, 0x000500C2, 0x00000017, 0x00002AD4,\n    0x00001D23, 0x000001A9, 0x000500C7, 0x00000017, 0x000033C4, 0x00002AD4,\n    0x000003A1, 0x00050086, 0x00000017, 0x000043A3, 0x000033C4, 0x0000002F,\n    0x000500C4, 0x00000017, 0x00004265, 0x000043A3, 0x0000013D, 0x000500C5,\n    0x00000017, 0x000018B1, 0x000044CB, 0x00004265, 0x000500C2, 0x00000017,\n    0x00003BF3, 0x00001D23, 0x000003C5, 0x00050086, 0x00000017, 0x00005DA8,\n    0x00003BF3, 0x0000002F, 0x000500C5, 0x00000017, 0x000021A4, 0x000018B1,\n    0x00005DA8, 0x000500C2, 0x00000017, 0x000029B3, 0x00001EEB, 0x0000046D,\n    0x000500C7, 0x00000017, 0x00003FD3, 0x000029B3, 0x000002B7, 0x00050084,\n    0x00000017, 0x00005D4E, 0x00003FD3, 0x00000211, 0x00050080, 0x00000017,\n    0x000027DB, 0x000021A4, 0x00005D4E, 0x00060041, 0x00000294, 0x000043CF,\n    0x0000140E, 0x00000A0B, 0x00004387, 0x0003003E, 0x000043CF, 0x000027DB,\n    0x000200F9, 0x00004665, 0x000200F8, 0x00004665, 0x000200F9, 0x00001C25,\n    0x000200F8, 0x00001C25, 0x000200F9, 0x00002358, 0x000200F8, 0x00002358,\n    0x00050080, 0x0000000B, 0x0000578D, 0x000038F6, 0x00000A3A, 0x000300F7,\n    0x00006070, 0x00000002, 0x000400FA, 0x00004376, 0x00001C26, 0x000055E9,\n    0x000200F8, 0x000055E9, 0x000200F9, 0x00006070, 0x000200F8, 0x00001C26,\n    0x000200F9, 0x00006070, 0x000200F8, 0x00006070, 0x000700F5, 0x0000000B,\n    0x00002C71, 0x00000A6A, 0x00001C26, 0x00000A3A, 0x000055E9, 0x00050080,\n    0x0000000B, 0x000048BE, 0x000048BD, 0x00002C71, 0x000500C2, 0x0000000B,\n    0x00003D53, 0x000048BE, 0x00000A17, 0x00060041, 0x00000294, 0x00005566,\n    0x0000107A, 0x00000A0B, 0x00003D53, 0x0004003D, 0x00000017, 0x00003910,\n    0x00005566, 0x000300F7, 0x00003A1A, 0x00000000, 0x000400FA, 0x00005686,\n    0x00002958, 0x00003A1A, 0x000200F8, 0x00002958, 0x000500C7, 0x00000017,\n    0x00004760, 0x00003910, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D2,\n    0x00004760, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AE, 0x00003910,\n    0x0000072E, 0x000500C2, 0x00000017, 0x0000448E, 0x000050AE, 0x0000013D,\n    0x000500C5, 0x00000017, 0x00003FF9, 0x000024D2, 0x0000448E, 0x000200F9,\n    0x00003A1A, 0x000200F8, 0x00003A1A, 0x000700F5, 0x00000017, 0x00002AAC,\n    0x00003910, 0x00006070, 0x00003FF9, 0x00002958, 0x000300F7, 0x00002DC9,\n    0x00000000, 0x000400FA, 0x00003B23, 0x00002B39, 0x00002DC9, 0x000200F8,\n    0x00002B39, 0x000500C4, 0x00000017, 0x00005E18, 0x00002AAC, 0x000002ED,\n    0x000500C2, 0x00000017, 0x00003BE8, 0x00002AAC, 0x000002ED, 0x000500C5,\n    0x00000017, 0x000029E9, 0x00005E18, 0x00003BE8, 0x000200F9, 0x00002DC9,\n    0x000200F8, 0x00002DC9, 0x000700F5, 0x00000017, 0x00004C5A, 0x00002AAC,\n    0x00003A1A, 0x000029E9, 0x00002B39, 0x00050051, 0x0000000B, 0x00005F3A,\n    0x00004C5A, 0x00000002, 0x000500C4, 0x0000000B, 0x00003C80, 0x00005F3A,\n    0x00000A13, 0x000500C2, 0x0000000B, 0x00001952, 0x00005F3A, 0x00000A31,\n    0x00050050, 0x00000011, 0x00004371, 0x00003C80, 0x00001952, 0x000500C7,\n    0x00000011, 0x0000191F, 0x00004371, 0x000003E1, 0x000500C4, 0x0000000B,\n    0x00005040, 0x00005F3A, 0x00000A1F, 0x000500C2, 0x0000000B, 0x00005E65,\n    0x00005F3A, 0x00000A25, 0x00050050, 0x00000011, 0x00004388, 0x00005040,\n    0x00005E65, 0x000500C7, 0x00000011, 0x00001898, 0x00004388, 0x000003F7,\n    0x000500C5, 0x00000011, 0x0000375B, 0x0000191F, 0x00001898, 0x000500C4,\n    0x0000000B, 0x00005C89, 0x00005F3A, 0x00000A2E, 0x000500C2, 0x0000000B,\n    0x00005818, 0x00005F3A, 0x00000A16, 0x00050050, 0x00000011, 0x00004389,\n    0x00005C89, 0x00005818, 0x000500C7, 0x00000011, 0x00001872, 0x00004389,\n    0x000009F3, 0x000500C5, 0x00000011, 0x00003914, 0x0000375B, 0x00001872,\n    0x000500C2, 0x00000011, 0x0000575B, 0x00003914, 0x00000778, 0x000500C7,\n    0x00000011, 0x000018CC, 0x0000575B, 0x000001F7, 0x000500C5, 0x00000011,\n    0x00004047, 0x00003914, 0x000018CC, 0x000500C2, 0x00000011, 0x0000575C,\n    0x00004047, 0x0000078D, 0x000500C7, 0x00000011, 0x00005AE8, 0x0000575C,\n    0x0000004E, 0x000500C5, 0x00000011, 0x00003950, 0x00004047, 0x00005AE8,\n    0x00050051, 0x0000000B, 0x00004BDF, 0x00004C5A, 0x00000003, 0x00050050,\n    0x00000011, 0x00003C51, 0x00004BDF, 0x00004BDF, 0x0009004F, 0x00000017,\n    0x00006232, 0x00003C51, 0x00003C51, 0x00000000, 0x00000001, 0x00000000,\n    0x00000000, 0x000500C7, 0x00000017, 0x00002C7D, 0x00006232, 0x00000B3E,\n    0x000500C4, 0x00000017, 0x00005ECB, 0x00002C7D, 0x00000B86, 0x000500C7,\n    0x00000017, 0x000050AF, 0x00006232, 0x00000B2C, 0x000500C2, 0x00000017,\n    0x000040D8, 0x000050AF, 0x00000B86, 0x000500C5, 0x00000017, 0x00005DC1,\n    0x00005ECB, 0x000040D8, 0x000500C7, 0x00000017, 0x00004CA3, 0x00005DC1,\n    0x00000B2C, 0x000500C2, 0x00000017, 0x0000472C, 0x00004CA3, 0x00000B86,\n    0x000500C6, 0x00000017, 0x000042FF, 0x00005DC1, 0x0000472C, 0x00050051,\n    0x0000000B, 0x00004E32, 0x000042FF, 0x00000000, 0x000500C2, 0x0000000B,\n    0x000055E3, 0x0000578D, 0x00000A17, 0x000400C8, 0x0000000B, 0x00005395,\n    0x00004E32, 0x00070050, 0x00000017, 0x000052F8, 0x00005395, 0x00005395,\n    0x00005395, 0x00005395, 0x000500C2, 0x00000017, 0x00005DE9, 0x000052F8,\n    0x0000004D, 0x000500C7, 0x00000017, 0x00005AB1, 0x00005DE9, 0x0000002F,\n    0x00050051, 0x0000000B, 0x00004AB9, 0x00003950, 0x00000000, 0x00070050,\n    0x00000017, 0x00006077, 0x00004AB9, 0x00004AB9, 0x00004AB9, 0x00004AB9,\n    0x00050084, 0x00000017, 0x00005FF3, 0x00005AB1, 0x00006077, 0x00070050,\n    0x00000017, 0x0000627C, 0x00004E32, 0x00004E32, 0x00004E32, 0x00004E32,\n    0x000500C2, 0x00000017, 0x0000383F, 0x0000627C, 0x0000004D, 0x000500C7,\n    0x00000017, 0x00005AB2, 0x0000383F, 0x0000002F, 0x00050051, 0x0000000B,\n    0x00004ABA, 0x00003950, 0x00000001, 0x00070050, 0x00000017, 0x00001988,\n    0x00004ABA, 0x00004ABA, 0x00004ABA, 0x00004ABA, 0x00050084, 0x00000017,\n    0x00003FE2, 0x00005AB2, 0x00001988, 0x00050080, 0x00000017, 0x00002C04,\n    0x00005FF3, 0x00003FE2, 0x000500C7, 0x00000017, 0x000060C2, 0x00002C04,\n    0x000003A1, 0x00050086, 0x00000017, 0x0000240D, 0x000060C2, 0x0000002F,\n    0x000500C4, 0x00000017, 0x000044CC, 0x0000240D, 0x000002ED, 0x000500C2,\n    0x00000017, 0x00002AD5, 0x00002C04, 0x000001A9, 0x000500C7, 0x00000017,\n    0x000033C5, 0x00002AD5, 0x000003A1, 0x00050086, 0x00000017, 0x000043A4,\n    0x000033C5, 0x0000002F, 0x000500C4, 0x00000017, 0x00004266, 0x000043A4,\n    0x0000013D, 0x000500C5, 0x00000017, 0x000018B2, 0x000044CC, 0x00004266,\n    0x000500C2, 0x00000017, 0x00003BF4, 0x00002C04, 0x000003C5, 0x00050086,\n    0x00000017, 0x00005520, 0x00003BF4, 0x0000002F, 0x000500C5, 0x00000017,\n    0x0000247E, 0x000018B2, 0x00005520, 0x0009004F, 0x00000017, 0x00001EEC,\n    0x00004C5A, 0x00004C5A, 0x00000000, 0x00000000, 0x00000000, 0x00000000,\n    0x000500C2, 0x00000017, 0x00001B56, 0x00001EEC, 0x0000010D, 0x000500C7,\n    0x00000017, 0x00004540, 0x00001B56, 0x000002B7, 0x00050084, 0x00000017,\n    0x00005D4F, 0x00004540, 0x00000211, 0x00050080, 0x00000017, 0x000027DC,\n    0x0000247E, 0x00005D4F, 0x00060041, 0x00000294, 0x000043A9, 0x0000140E,\n    0x00000A0B, 0x000055E3, 0x0003003E, 0x000043A9, 0x000027DC, 0x000300F7,\n    0x00001C28, 0x00000002, 0x000400FA, 0x00004411, 0x0000592D, 0x00001C28,\n    0x000200F8, 0x0000592D, 0x00050080, 0x0000000B, 0x00003C7A, 0x0000578D,\n    0x0000578C, 0x000500C2, 0x0000000B, 0x000037CD, 0x00003C7A, 0x00000A17,\n    0x000500C2, 0x0000000B, 0x00002E6A, 0x00004E32, 0x00000A22, 0x000400C8,\n    0x0000000B, 0x00004B07, 0x00002E6A, 0x00070050, 0x00000017, 0x000052F9,\n    0x00004B07, 0x00004B07, 0x00004B07, 0x00004B07, 0x000500C2, 0x00000017,\n    0x000061B4, 0x000052F9, 0x0000004D, 0x000500C7, 0x00000017, 0x0000383B,\n    0x000061B4, 0x0000002F, 0x00050084, 0x00000017, 0x00003CD2, 0x0000383B,\n    0x00006077, 0x00070050, 0x00000017, 0x0000539D, 0x00002E6A, 0x00002E6A,\n    0x00002E6A, 0x00002E6A, 0x000500C2, 0x00000017, 0x00003C09, 0x0000539D,\n    0x0000004D, 0x000500C7, 0x00000017, 0x00003BCB, 0x00003C09, 0x0000002F,\n    0x00050084, 0x00000017, 0x00001CC1, 0x00003BCB, 0x00001988, 0x00050080,\n    0x00000017, 0x00001D24, 0x00003CD2, 0x00001CC1, 0x000500C7, 0x00000017,\n    0x000060C3, 0x00001D24, 0x000003A1, 0x00050086, 0x00000017, 0x0000240E,\n    0x000060C3, 0x0000002F, 0x000500C4, 0x00000017, 0x000044CD, 0x0000240E,\n    0x000002ED, 0x000500C2, 0x00000017, 0x00002AD6, 0x00001D24, 0x000001A9,\n    0x000500C7, 0x00000017, 0x000033C6, 0x00002AD6, 0x000003A1, 0x00050086,\n    0x00000017, 0x000043A5, 0x000033C6, 0x0000002F, 0x000500C4, 0x00000017,\n    0x00004267, 0x000043A5, 0x0000013D, 0x000500C5, 0x00000017, 0x000018B3,\n    0x000044CD, 0x00004267, 0x000500C2, 0x00000017, 0x00003BF5, 0x00001D24,\n    0x000003C5, 0x00050086, 0x00000017, 0x00005DA9, 0x00003BF5, 0x0000002F,\n    0x000500C5, 0x00000017, 0x000021A5, 0x000018B3, 0x00005DA9, 0x000500C2,\n    0x00000017, 0x000029B4, 0x00001EEC, 0x0000046D, 0x000500C7, 0x00000017,\n    0x00003FD4, 0x000029B4, 0x000002B7, 0x00050084, 0x00000017, 0x00005D50,\n    0x00003FD4, 0x00000211, 0x00050080, 0x00000017, 0x000027DD, 0x000021A5,\n    0x00005D50, 0x00060041, 0x00000294, 0x00003AD6, 0x0000140E, 0x00000A0B,\n    0x000037CD, 0x0003003E, 0x00003AD6, 0x000027DD, 0x00050080, 0x0000000B,\n    0x000039FA, 0x00003220, 0x00000A10, 0x000500B0, 0x00000009, 0x00002E0D,\n    0x000039FA, 0x000019C2, 0x000300F7, 0x00001C27, 0x00000002, 0x000400FA,\n    0x00002E0D, 0x00005194, 0x00001C27, 0x000200F8, 0x00005194, 0x00050084,\n    0x0000000B, 0x00003390, 0x00000A10, 0x0000578C, 0x00050080, 0x0000000B,\n    0x0000349D, 0x0000578D, 0x00003390, 0x000500C2, 0x0000000B, 0x0000438A,\n    0x0000349D, 0x00000A17, 0x000500C2, 0x0000000B, 0x00002E6B, 0x00004E32,\n    0x00000A3A, 0x000400C8, 0x0000000B, 0x00004B08, 0x00002E6B, 0x00070050,\n    0x00000017, 0x000052FA, 0x00004B08, 0x00004B08, 0x00004B08, 0x00004B08,\n    0x000500C2, 0x00000017, 0x000061B5, 0x000052FA, 0x0000004D, 0x000500C7,\n    0x00000017, 0x0000383C, 0x000061B5, 0x0000002F, 0x00050084, 0x00000017,\n    0x00003CD3, 0x0000383C, 0x00006077, 0x00070050, 0x00000017, 0x0000539E,\n    0x00002E6B, 0x00002E6B, 0x00002E6B, 0x00002E6B, 0x000500C2, 0x00000017,\n    0x00003C0A, 0x0000539E, 0x0000004D, 0x000500C7, 0x00000017, 0x00003BCC,\n    0x00003C0A, 0x0000002F, 0x00050084, 0x00000017, 0x00001CC2, 0x00003BCC,\n    0x00001988, 0x00050080, 0x00000017, 0x00001D25, 0x00003CD3, 0x00001CC2,\n    0x000500C7, 0x00000017, 0x000060C4, 0x00001D25, 0x000003A1, 0x00050086,\n    0x00000017, 0x0000240F, 0x000060C4, 0x0000002F, 0x000500C4, 0x00000017,\n    0x000044CE, 0x0000240F, 0x000002ED, 0x000500C2, 0x00000017, 0x00002AD7,\n    0x00001D25, 0x000001A9, 0x000500C7, 0x00000017, 0x000033C7, 0x00002AD7,\n    0x000003A1, 0x00050086, 0x00000017, 0x000043A6, 0x000033C7, 0x0000002F,\n    0x000500C4, 0x00000017, 0x00004268, 0x000043A6, 0x0000013D, 0x000500C5,\n    0x00000017, 0x000018B4, 0x000044CE, 0x00004268, 0x000500C2, 0x00000017,\n    0x00003BF6, 0x00001D25, 0x000003C5, 0x00050086, 0x00000017, 0x00005521,\n    0x00003BF6, 0x0000002F, 0x000500C5, 0x00000017, 0x0000247F, 0x000018B4,\n    0x00005521, 0x0009004F, 0x00000017, 0x00001EED, 0x00004C5A, 0x00004C5A,\n    0x00000001, 0x00000001, 0x00000001, 0x00000001, 0x000500C2, 0x00000017,\n    0x00001B57, 0x00001EED, 0x0000010D, 0x000500C7, 0x00000017, 0x00004541,\n    0x00001B57, 0x000002B7, 0x00050084, 0x00000017, 0x00005D51, 0x00004541,\n    0x00000211, 0x00050080, 0x00000017, 0x000027DE, 0x0000247F, 0x00005D51,\n    0x00060041, 0x00000294, 0x00003AD7, 0x0000140E, 0x00000A0B, 0x0000438A,\n    0x0003003E, 0x00003AD7, 0x000027DE, 0x00050080, 0x0000000B, 0x000039FB,\n    0x00003220, 0x00000A13, 0x000500B0, 0x00000009, 0x00002E0E, 0x000039FB,\n    0x000019C2, 0x000300F7, 0x00004666, 0x00000002, 0x000400FA, 0x00002E0E,\n    0x00005195, 0x00004666, 0x000200F8, 0x00005195, 0x00050084, 0x0000000B,\n    0x00003391, 0x00000A13, 0x0000578C, 0x00050080, 0x0000000B, 0x0000349E,\n    0x0000578D, 0x00003391, 0x000500C2, 0x0000000B, 0x0000438B, 0x0000349E,\n    0x00000A17, 0x000500C2, 0x0000000B, 0x00002E6C, 0x00004E32, 0x00000A52,\n    0x000400C8, 0x0000000B, 0x00004B09, 0x00002E6C, 0x00070050, 0x00000017,\n    0x000052FB, 0x00004B09, 0x00004B09, 0x00004B09, 0x00004B09, 0x000500C2,\n    0x00000017, 0x000061B6, 0x000052FB, 0x0000004D, 0x000500C7, 0x00000017,\n    0x00003840, 0x000061B6, 0x0000002F, 0x00050084, 0x00000017, 0x00003CD4,\n    0x00003840, 0x00006077, 0x00070050, 0x00000017, 0x0000539F, 0x00002E6C,\n    0x00002E6C, 0x00002E6C, 0x00002E6C, 0x000500C2, 0x00000017, 0x00003C0B,\n    0x0000539F, 0x0000004D, 0x000500C7, 0x00000017, 0x00003BCD, 0x00003C0B,\n    0x0000002F, 0x00050084, 0x00000017, 0x00001CC3, 0x00003BCD, 0x00001988,\n    0x00050080, 0x00000017, 0x00001D26, 0x00003CD4, 0x00001CC3, 0x000500C7,\n    0x00000017, 0x000060C5, 0x00001D26, 0x000003A1, 0x00050086, 0x00000017,\n    0x00002410, 0x000060C5, 0x0000002F, 0x000500C4, 0x00000017, 0x000044CF,\n    0x00002410, 0x000002ED, 0x000500C2, 0x00000017, 0x00002AD8, 0x00001D26,\n    0x000001A9, 0x000500C7, 0x00000017, 0x000033C8, 0x00002AD8, 0x000003A1,\n    0x00050086, 0x00000017, 0x000043A7, 0x000033C8, 0x0000002F, 0x000500C4,\n    0x00000017, 0x00004269, 0x000043A7, 0x0000013D, 0x000500C5, 0x00000017,\n    0x000018B5, 0x000044CF, 0x00004269, 0x000500C2, 0x00000017, 0x00003BF7,\n    0x00001D26, 0x000003C5, 0x00050086, 0x00000017, 0x00005DAA, 0x00003BF7,\n    0x0000002F, 0x000500C5, 0x00000017, 0x000021A6, 0x000018B5, 0x00005DAA,\n    0x000500C2, 0x00000017, 0x000029B5, 0x00001EED, 0x0000046D, 0x000500C7,\n    0x00000017, 0x00003FD5, 0x000029B5, 0x000002B7, 0x00050084, 0x00000017,\n    0x00005D52, 0x00003FD5, 0x00000211, 0x00050080, 0x00000017, 0x000027DF,\n    0x000021A6, 0x00005D52, 0x00060041, 0x00000294, 0x000043D0, 0x0000140E,\n    0x00000A0B, 0x0000438B, 0x0003003E, 0x000043D0, 0x000027DF, 0x000200F9,\n    0x00004666, 0x000200F8, 0x00004666, 0x000200F9, 0x00001C27, 0x000200F8,\n    0x00001C27, 0x000200F9, 0x00001C28, 0x000200F8, 0x00001C28, 0x000200F9,\n    0x00003A37, 0x000200F8, 0x00003A37, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_dxt3a_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25268\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v4uint = OpTypeVector %uint 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v2uint = OpTypeVector %uint 2\n     %v3uint = OpTypeVector %uint 3\n    %uint_15 = OpConstant %uint 15\n   %uint_255 = OpConstant %uint 255\n     %uint_4 = OpConstant %uint 4\n  %uint_4080 = OpConstant %uint 4080\n     %uint_8 = OpConstant %uint 8\n %uint_65280 = OpConstant %uint 65280\n    %uint_12 = OpConstant %uint 12\n %uint_61440 = OpConstant %uint 61440\n    %uint_16 = OpConstant %uint 16\n     %uint_1 = OpConstant %uint 1\n     %uint_2 = OpConstant %uint 2\n%uint_16711935 = OpConstant %uint 16711935\n%uint_4278255360 = OpConstant %uint 4278255360\n     %uint_3 = OpConstant %uint 3\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n     %uint_0 = OpConstant %uint 0\n      %int_3 = OpConstant %int 3\n      %int_2 = OpConstant %int 2\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %2596 = OpConstantComposite %v3uint %uint_2 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n       %2619 = OpConstantComposite %v3uint %uint_2 %uint_2 %uint_0\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n    %uint_32 = OpConstant %uint 32\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n        %695 = OpConstantComposite %v4uint %uint_15 %uint_15 %uint_15 %uint_15\n       %1611 = OpConstantComposite %v4uint %uint_255 %uint_255 %uint_255 %uint_255\n        %101 = OpConstantComposite %v4uint %uint_4 %uint_4 %uint_4 %uint_4\n        %402 = OpConstantComposite %v4uint %uint_4080 %uint_4080 %uint_4080 %uint_4080\n       %2135 = OpConstantComposite %v4uint %uint_65280 %uint_65280 %uint_65280 %uint_65280\n        %533 = OpConstantComposite %v4uint %uint_12 %uint_12 %uint_12 %uint_12\n       %2534 = OpConstantComposite %v4uint %uint_61440 %uint_61440 %uint_61440 %uint_61440\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %14903 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24540 = OpBitwiseAnd %uint %13606 %uint_1\n      %17270 = OpINotEqual %bool %24540 %uint_0\n      %12328 = OpBitwiseAnd %uint %13606 %uint_2\n      %17284 = OpINotEqual %bool %12328 %uint_0\n       %7856 = OpShiftRightLogical %uint %13606 %uint_2\n      %25058 = OpBitwiseAnd %uint %7856 %uint_3\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20158 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n      %22412 = OpLoad %uint %20158\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_7\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2596\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %14018 DontFlatten\n               OpBranchConditional %24679 %21992 %14018\n      %21992 = OpLabel\n               OpBranch %14903\n      %14018 = OpLabel\n      %17344 = OpShiftLeftLogical %v3uint %21387 %2619\n      %14520 = OpBitcast %v3int %17344\n       %8905 = OpCompositeExtract %int %14520 0\n       %6813 = OpCompositeExtract %int %14520 2\n      %21501 = OpBitcast %int %6594\n      %11279 = OpIMul %int %6813 %21501\n      %17598 = OpCompositeExtract %int %14520 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %22412\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %8905 %24535\n      %10404 = OpBitcast %uint %8258\n      %14582 = OpIAdd %uint %22411 %10404\n      %12308 = OpLogicalNot %bool %17270\n               OpSelectionMerge %19040 DontFlatten\n               OpBranchConditional %12308 %9741 %17007\n       %9741 = OpLabel\n      %17463 = OpCompositeExtract %uint %21387 0\n      %11246 = OpCompositeExtract %uint %21387 1\n      %18801 = OpCompositeExtract %uint %21387 2\n      %14831 = OpIMul %uint %22409 %18801\n      %20322 = OpIAdd %uint %11246 %14831\n      %21676 = OpIMul %uint %22408 %20322\n      %20398 = OpIAdd %uint %17463 %21676\n      %11367 = OpShiftLeftLogical %uint %20398 %uint_3\n               OpBranch %19040\n      %17007 = OpLabel\n               OpSelectionMerge %23536 DontFlatten\n               OpBranchConditional %17284 %23520 %24353\n      %23520 = OpLabel\n      %10111 = OpBitcast %v3int %21387\n      %19476 = OpShiftRightLogical %uint %22408 %int_5\n      %18810 = OpShiftRightLogical %uint %22409 %int_4\n       %6782 = OpCompositeExtract %int %10111 2\n      %12089 = OpShiftRightArithmetic %int %6782 %int_2\n      %22400 = OpBitcast %int %18810\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %10111 1\n      %19055 = OpShiftRightArithmetic %int %25154 %int_4\n      %11052 = OpIAdd %int %7938 %19055\n      %16898 = OpBitcast %int %19476\n      %14944 = OpIMul %int %11052 %16898\n      %25155 = OpCompositeExtract %int %10111 0\n      %20423 = OpShiftRightArithmetic %int %25155 %int_5\n      %18940 = OpIAdd %int %14944 %20423\n       %8797 = OpShiftLeftLogical %int %18940 %int_7\n      %11434 = OpBitwiseAnd %int %6782 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %25154 %int_1\n      %21364 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21364 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %25155 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17334 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17334 %uint_3\n      %13015 = OpShiftRightArithmetic %int %25154 %int_3\n       %9929 = OpBitwiseXor %int %13015 %12089\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %25155 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %25154 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6551\n       %7168 = OpShiftLeftLogical %int %16793 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24144 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24144 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24144 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24144 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %23536\n      %24353 = OpLabel\n      %23000 = OpBitcast %v2int %17136\n      %22120 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %23000 1\n      %12090 = OpShiftRightArithmetic %int %14597 %int_5\n      %22401 = OpBitcast %int %22120\n       %7939 = OpIMul %int %12090 %22401\n      %25156 = OpCompositeExtract %int %23000 0\n      %20424 = OpShiftRightArithmetic %int %25156 %int_5\n      %18864 = OpIAdd %int %7939 %20424\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25156 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17335 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17335 %uint_3\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25156 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6552\n       %7169 = OpShiftLeftLogical %int %21575 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24163 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24163 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24163 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %23536\n      %23536 = OpLabel\n      %10540 = OpPhi %uint %16869 %23520 %16870 %24353\n               OpBranch %19040\n      %19040 = OpLabel\n      %11376 = OpPhi %uint %11367 %9741 %10540 %23536\n      %18621 = OpIAdd %uint %11376 %24236\n      %15698 = OpShiftRightLogical %uint %18621 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15698\n       %7338 = OpLoad %v4uint %20399\n      %13760 = OpIEqual %bool %25058 %uint_1\n      %21366 = OpIEqual %bool %25058 %uint_2\n      %22150 = OpLogicalOr %bool %13760 %21366\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %7338 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %7338 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22649 = OpPhi %v4uint %7338 %19040 %16376 %10583\n      %19638 = OpIEqual %bool %25058 %uint_3\n      %15139 = OpLogicalOr %bool %21366 %19638\n               OpSelectionMerge %14874 None\n               OpBranchConditional %15139 %11064 %14874\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22649 %749\n      %15335 = OpShiftRightLogical %v4uint %22649 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %14874\n      %14874 = OpLabel\n      %10924 = OpPhi %v4uint %22649 %13411 %10728 %11064\n               OpSelectionMerge %24688 DontFlatten\n               OpBranchConditional %17270 %21993 %7205\n      %21993 = OpLabel\n               OpBranch %24688\n       %7205 = OpLabel\n               OpBranch %24688\n      %24688 = OpLabel\n      %11377 = OpPhi %uint %uint_32 %21993 %uint_16 %7205\n      %18622 = OpIAdd %uint %18621 %11377\n      %15699 = OpShiftRightLogical %uint %18622 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15699\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %14875 None\n               OpBranchConditional %22150 %10584 %14875\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %14875\n      %14875 = OpLabel\n      %10925 = OpPhi %v4uint %14608 %24688 %16377 %10584\n               OpSelectionMerge %13867 None\n               OpBranchConditional %15139 %11065 %13867\n      %11065 = OpLabel\n      %24088 = OpShiftLeftLogical %v4uint %10925 %749\n      %15336 = OpShiftRightLogical %v4uint %10925 %749\n      %10729 = OpBitwiseOr %v4uint %24088 %15336\n               OpBranch %13867\n      %13867 = OpLabel\n      %16882 = OpPhi %v4uint %10925 %14875 %10729 %11065\n      %25267 = OpShiftRightLogical %uint %14582 %int_4\n      %12234 = OpCompositeExtract %uint %10924 0\n      %24539 = OpCompositeExtract %uint %10924 2\n       %7641 = OpCompositeExtract %uint %16882 0\n      %10075 = OpCompositeExtract %uint %16882 2\n      %16752 = OpCompositeConstruct %v4uint %12234 %24539 %7641 %10075\n       %8141 = OpBitwiseAnd %v4uint %16752 %695\n      %16912 = OpBitwiseAnd %v4uint %16752 %1611\n      %24932 = OpShiftLeftLogical %v4uint %16912 %101\n      %17083 = OpBitwiseOr %v4uint %8141 %24932\n      %20866 = OpBitwiseAnd %v4uint %16752 %402\n      %23319 = OpShiftLeftLogical %v4uint %20866 %317\n      %17084 = OpBitwiseOr %v4uint %17083 %23319\n      %20867 = OpBitwiseAnd %v4uint %16752 %2135\n      %23320 = OpShiftLeftLogical %v4uint %20867 %533\n      %17085 = OpBitwiseOr %v4uint %17084 %23320\n      %20868 = OpBitwiseAnd %v4uint %16752 %2534\n      %20773 = OpShiftLeftLogical %v4uint %20868 %749\n      %18648 = OpBitwiseOr %v4uint %17085 %20773\n      %20974 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %25267\n               OpStore %20974 %18648\n      %12832 = OpCompositeExtract %uint %17344 1\n      %23232 = OpIAdd %uint %12832 %int_1\n      %17425 = OpULessThan %bool %23232 %6594\n               OpSelectionMerge %7207 DontFlatten\n               OpBranchConditional %17425 %22828 %7207\n      %22828 = OpLabel\n      %15481 = OpIAdd %uint %14582 %22412\n      %14265 = OpShiftRightLogical %uint %15481 %int_4\n      %14312 = OpShiftRightLogical %v4uint %16752 %749\n       %6848 = OpBitwiseAnd %v4uint %14312 %695\n      %18755 = OpBitwiseAnd %v4uint %14312 %1611\n      %24933 = OpShiftLeftLogical %v4uint %18755 %101\n      %17086 = OpBitwiseOr %v4uint %6848 %24933\n      %20869 = OpBitwiseAnd %v4uint %14312 %402\n      %23321 = OpShiftLeftLogical %v4uint %20869 %317\n      %17087 = OpBitwiseOr %v4uint %17086 %23321\n      %20870 = OpBitwiseAnd %v4uint %14312 %2135\n      %23322 = OpShiftLeftLogical %v4uint %20870 %533\n      %17088 = OpBitwiseOr %v4uint %17087 %23322\n      %20871 = OpBitwiseAnd %v4uint %14312 %2534\n      %20774 = OpShiftLeftLogical %v4uint %20871 %749\n      %18649 = OpBitwiseOr %v4uint %17088 %20774\n      %21867 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %14265\n               OpStore %21867 %18649\n      %14840 = OpIAdd %uint %12832 %int_2\n      %11787 = OpULessThan %bool %14840 %6594\n               OpSelectionMerge %7206 DontFlatten\n               OpBranchConditional %11787 %22829 %7206\n      %22829 = OpLabel\n      %13334 = OpIAdd %uint %15481 %22412\n      %12501 = OpShiftRightLogical %uint %13334 %int_4\n      %17657 = OpCompositeExtract %uint %10924 1\n      %24541 = OpCompositeExtract %uint %10924 3\n       %7642 = OpCompositeExtract %uint %16882 1\n      %10076 = OpCompositeExtract %uint %16882 3\n      %16753 = OpCompositeConstruct %v4uint %17657 %24541 %7642 %10076\n       %8142 = OpBitwiseAnd %v4uint %16753 %695\n      %16913 = OpBitwiseAnd %v4uint %16753 %1611\n      %24934 = OpShiftLeftLogical %v4uint %16913 %101\n      %17089 = OpBitwiseOr %v4uint %8142 %24934\n      %20872 = OpBitwiseAnd %v4uint %16753 %402\n      %23323 = OpShiftLeftLogical %v4uint %20872 %317\n      %17090 = OpBitwiseOr %v4uint %17089 %23323\n      %20873 = OpBitwiseAnd %v4uint %16753 %2135\n      %23324 = OpShiftLeftLogical %v4uint %20873 %533\n      %17091 = OpBitwiseOr %v4uint %17090 %23324\n      %20874 = OpBitwiseAnd %v4uint %16753 %2534\n      %20775 = OpShiftLeftLogical %v4uint %20874 %749\n      %18650 = OpBitwiseOr %v4uint %17091 %20775\n      %21868 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %12501\n               OpStore %21868 %18650\n      %14841 = OpIAdd %uint %12832 %int_3\n      %11788 = OpULessThan %bool %14841 %6594\n               OpSelectionMerge %18021 DontFlatten\n               OpBranchConditional %11788 %22830 %18021\n      %22830 = OpLabel\n      %15482 = OpIAdd %uint %13334 %22412\n      %14266 = OpShiftRightLogical %uint %15482 %int_4\n      %14313 = OpShiftRightLogical %v4uint %16753 %749\n       %6849 = OpBitwiseAnd %v4uint %14313 %695\n      %18756 = OpBitwiseAnd %v4uint %14313 %1611\n      %24935 = OpShiftLeftLogical %v4uint %18756 %101\n      %17092 = OpBitwiseOr %v4uint %6849 %24935\n      %20875 = OpBitwiseAnd %v4uint %14313 %402\n      %23325 = OpShiftLeftLogical %v4uint %20875 %317\n      %17093 = OpBitwiseOr %v4uint %17092 %23325\n      %20876 = OpBitwiseAnd %v4uint %14313 %2135\n      %23326 = OpShiftLeftLogical %v4uint %20876 %533\n      %17094 = OpBitwiseOr %v4uint %17093 %23326\n      %20877 = OpBitwiseAnd %v4uint %14313 %2534\n      %20776 = OpShiftLeftLogical %v4uint %20877 %749\n      %18651 = OpBitwiseOr %v4uint %17094 %20776\n      %24166 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %14266\n               OpStore %24166 %18651\n               OpBranch %18021\n      %18021 = OpLabel\n               OpBranch %7206\n       %7206 = OpLabel\n               OpBranch %7207\n       %7207 = OpLabel\n               OpBranch %14903\n      %14903 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_dxt3a_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x000062B4, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000017, 0x0000000B, 0x00000004, 0x00040015, 0x0000000C,\n    0x00000020, 0x00000001, 0x00040017, 0x00000012, 0x0000000C, 0x00000002,\n    0x00040017, 0x00000016, 0x0000000C, 0x00000003, 0x00020014, 0x00000009,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A37, 0x0000000F,\n    0x0004002B, 0x0000000B, 0x00000144, 0x000000FF, 0x0004002B, 0x0000000B,\n    0x00000A16, 0x00000004, 0x0004002B, 0x0000000B, 0x00000ACE, 0x00000FF0,\n    0x0004002B, 0x0000000B, 0x00000A22, 0x00000008, 0x0004002B, 0x0000000B,\n    0x00000A87, 0x0000FF00, 0x0004002B, 0x0000000B, 0x00000A2E, 0x0000000C,\n    0x0004002B, 0x0000000B, 0x000000D0, 0x0000F000, 0x0004002B, 0x0000000B,\n    0x00000A3A, 0x00000010, 0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001,\n    0x0004002B, 0x0000000B, 0x00000A10, 0x00000002, 0x0004002B, 0x0000000B,\n    0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00,\n    0x0004002B, 0x0000000B, 0x00000A13, 0x00000003, 0x0004002B, 0x0000000C,\n    0x00000A17, 0x00000004, 0x0004002B, 0x0000000C, 0x00000A1D, 0x00000006,\n    0x0004002B, 0x0000000C, 0x00000A2C, 0x0000000B, 0x0004002B, 0x0000000C,\n    0x00000A38, 0x0000000F, 0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001,\n    0x0004002B, 0x0000000C, 0x00000A1A, 0x00000005, 0x0004002B, 0x0000000C,\n    0x00000A20, 0x00000007, 0x0004002B, 0x0000000C, 0x00000A23, 0x00000008,\n    0x0004002B, 0x0000000C, 0x00000A2F, 0x0000000C, 0x0004002B, 0x0000000B,\n    0x00000A0A, 0x00000000, 0x0004002B, 0x0000000C, 0x00000A14, 0x00000003,\n    0x0004002B, 0x0000000C, 0x00000A11, 0x00000002, 0x0004002B, 0x0000000C,\n    0x00000A0B, 0x00000000, 0x000A001E, 0x00000489, 0x0000000B, 0x0000000B,\n    0x0000000B, 0x0000000B, 0x00000014, 0x0000000B, 0x0000000B, 0x0000000B,\n    0x00040020, 0x00000706, 0x00000009, 0x00000489, 0x0004003B, 0x00000706,\n    0x00000CE9, 0x00000009, 0x00040020, 0x00000288, 0x00000009, 0x0000000B,\n    0x00040020, 0x00000291, 0x00000009, 0x00000014, 0x00040020, 0x00000292,\n    0x00000001, 0x00000014, 0x0004003B, 0x00000292, 0x00000F48, 0x00000001,\n    0x0006002C, 0x00000014, 0x00000A24, 0x00000A10, 0x00000A0A, 0x00000A0A,\n    0x00040017, 0x0000000F, 0x00000009, 0x00000002, 0x0006002C, 0x00000014,\n    0x00000A3B, 0x00000A10, 0x00000A10, 0x00000A0A, 0x0003001D, 0x000007DC,\n    0x00000017, 0x0003001E, 0x000007B4, 0x000007DC, 0x00040020, 0x00000A31,\n    0x00000002, 0x000007B4, 0x0004003B, 0x00000A31, 0x0000107A, 0x00000002,\n    0x00040020, 0x00000294, 0x00000002, 0x00000017, 0x0003001D, 0x000007DD,\n    0x00000017, 0x0003001E, 0x000007B5, 0x000007DD, 0x00040020, 0x00000A32,\n    0x00000002, 0x000007B5, 0x0004003B, 0x00000A32, 0x0000140E, 0x00000002,\n    0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020, 0x0006002C, 0x00000014,\n    0x00000BC3, 0x00000A16, 0x00000A6A, 0x00000A0D, 0x0007002C, 0x00000017,\n    0x000009CE, 0x000008A6, 0x000008A6, 0x000008A6, 0x000008A6, 0x0007002C,\n    0x00000017, 0x0000013D, 0x00000A22, 0x00000A22, 0x00000A22, 0x00000A22,\n    0x0007002C, 0x00000017, 0x0000072E, 0x000005FD, 0x000005FD, 0x000005FD,\n    0x000005FD, 0x0007002C, 0x00000017, 0x000002ED, 0x00000A3A, 0x00000A3A,\n    0x00000A3A, 0x00000A3A, 0x0007002C, 0x00000017, 0x000002B7, 0x00000A37,\n    0x00000A37, 0x00000A37, 0x00000A37, 0x0007002C, 0x00000017, 0x0000064B,\n    0x00000144, 0x00000144, 0x00000144, 0x00000144, 0x0007002C, 0x00000017,\n    0x00000065, 0x00000A16, 0x00000A16, 0x00000A16, 0x00000A16, 0x0007002C,\n    0x00000017, 0x00000192, 0x00000ACE, 0x00000ACE, 0x00000ACE, 0x00000ACE,\n    0x0007002C, 0x00000017, 0x00000857, 0x00000A87, 0x00000A87, 0x00000A87,\n    0x00000A87, 0x0007002C, 0x00000017, 0x00000215, 0x00000A2E, 0x00000A2E,\n    0x00000A2E, 0x00000A2E, 0x0007002C, 0x00000017, 0x000009E6, 0x000000D0,\n    0x000000D0, 0x000000D0, 0x000000D0, 0x00050036, 0x00000008, 0x0000161F,\n    0x00000000, 0x00000502, 0x000200F8, 0x00003B06, 0x000300F7, 0x00003A37,\n    0x00000000, 0x000300FB, 0x00000A0A, 0x00002E68, 0x000200F8, 0x00002E68,\n    0x00050041, 0x00000288, 0x000060D7, 0x00000CE9, 0x00000A0B, 0x0004003D,\n    0x0000000B, 0x00003526, 0x000060D7, 0x000500C7, 0x0000000B, 0x00005FDC,\n    0x00003526, 0x00000A0D, 0x000500AB, 0x00000009, 0x00004376, 0x00005FDC,\n    0x00000A0A, 0x000500C7, 0x0000000B, 0x00003028, 0x00003526, 0x00000A10,\n    0x000500AB, 0x00000009, 0x00004384, 0x00003028, 0x00000A0A, 0x000500C2,\n    0x0000000B, 0x00001EB0, 0x00003526, 0x00000A10, 0x000500C7, 0x0000000B,\n    0x000061E2, 0x00001EB0, 0x00000A13, 0x00050041, 0x00000288, 0x0000492C,\n    0x00000CE9, 0x00000A0E, 0x0004003D, 0x0000000B, 0x00005EAC, 0x0000492C,\n    0x00050041, 0x00000288, 0x00004EBA, 0x00000CE9, 0x00000A11, 0x0004003D,\n    0x0000000B, 0x00005788, 0x00004EBA, 0x00050041, 0x00000288, 0x00004EBB,\n    0x00000CE9, 0x00000A14, 0x0004003D, 0x0000000B, 0x00005789, 0x00004EBB,\n    0x00050041, 0x00000291, 0x00004EBC, 0x00000CE9, 0x00000A17, 0x0004003D,\n    0x00000014, 0x0000578A, 0x00004EBC, 0x00050041, 0x00000288, 0x00004EBD,\n    0x00000CE9, 0x00000A1A, 0x0004003D, 0x0000000B, 0x0000578B, 0x00004EBD,\n    0x00050041, 0x00000288, 0x00004EBE, 0x00000CE9, 0x00000A1D, 0x0004003D,\n    0x0000000B, 0x0000578C, 0x00004EBE, 0x00050041, 0x00000288, 0x00004E6E,\n    0x00000CE9, 0x00000A20, 0x0004003D, 0x0000000B, 0x000019C2, 0x00004E6E,\n    0x0004003D, 0x00000014, 0x00002A0E, 0x00000F48, 0x000500C4, 0x00000014,\n    0x0000538B, 0x00002A0E, 0x00000A24, 0x0007004F, 0x00000011, 0x000042F0,\n    0x0000538B, 0x0000538B, 0x00000000, 0x00000001, 0x0007004F, 0x00000011,\n    0x0000242F, 0x0000578A, 0x0000578A, 0x00000000, 0x00000001, 0x000500AE,\n    0x0000000F, 0x00004288, 0x000042F0, 0x0000242F, 0x0004009A, 0x00000009,\n    0x00006067, 0x00004288, 0x000300F7, 0x000036C2, 0x00000002, 0x000400FA,\n    0x00006067, 0x000055E8, 0x000036C2, 0x000200F8, 0x000055E8, 0x000200F9,\n    0x00003A37, 0x000200F8, 0x000036C2, 0x000500C4, 0x00000014, 0x000043C0,\n    0x0000538B, 0x00000A3B, 0x0004007C, 0x00000016, 0x000038B8, 0x000043C0,\n    0x00050051, 0x0000000C, 0x000022C9, 0x000038B8, 0x00000000, 0x00050051,\n    0x0000000C, 0x00001A9D, 0x000038B8, 0x00000002, 0x0004007C, 0x0000000C,\n    0x000053FD, 0x000019C2, 0x00050084, 0x0000000C, 0x00002C0F, 0x00001A9D,\n    0x000053FD, 0x00050051, 0x0000000C, 0x000044BE, 0x000038B8, 0x00000001,\n    0x00050080, 0x0000000C, 0x000056D4, 0x00002C0F, 0x000044BE, 0x0004007C,\n    0x0000000C, 0x00005785, 0x0000578C, 0x00050084, 0x0000000C, 0x00005FD7,\n    0x000056D4, 0x00005785, 0x00050080, 0x0000000C, 0x00002042, 0x000022C9,\n    0x00005FD7, 0x0004007C, 0x0000000B, 0x000028A4, 0x00002042, 0x00050080,\n    0x0000000B, 0x000038F6, 0x0000578B, 0x000028A4, 0x000400A8, 0x00000009,\n    0x00003014, 0x00004376, 0x000300F7, 0x00004A60, 0x00000002, 0x000400FA,\n    0x00003014, 0x0000260D, 0x0000426F, 0x000200F8, 0x0000260D, 0x00050051,\n    0x0000000B, 0x00004437, 0x0000538B, 0x00000000, 0x00050051, 0x0000000B,\n    0x00002BEE, 0x0000538B, 0x00000001, 0x00050051, 0x0000000B, 0x00004971,\n    0x0000538B, 0x00000002, 0x00050084, 0x0000000B, 0x000039EF, 0x00005789,\n    0x00004971, 0x00050080, 0x0000000B, 0x00004F62, 0x00002BEE, 0x000039EF,\n    0x00050084, 0x0000000B, 0x000054AC, 0x00005788, 0x00004F62, 0x00050080,\n    0x0000000B, 0x00004FAE, 0x00004437, 0x000054AC, 0x000500C4, 0x0000000B,\n    0x00002C67, 0x00004FAE, 0x00000A13, 0x000200F9, 0x00004A60, 0x000200F8,\n    0x0000426F, 0x000300F7, 0x00005BF0, 0x00000002, 0x000400FA, 0x00004384,\n    0x00005BE0, 0x00005F21, 0x000200F8, 0x00005BE0, 0x0004007C, 0x00000016,\n    0x0000277F, 0x0000538B, 0x000500C2, 0x0000000B, 0x00004C14, 0x00005788,\n    0x00000A1A, 0x000500C2, 0x0000000B, 0x0000497A, 0x00005789, 0x00000A17,\n    0x00050051, 0x0000000C, 0x00001A7E, 0x0000277F, 0x00000002, 0x000500C3,\n    0x0000000C, 0x00002F39, 0x00001A7E, 0x00000A11, 0x0004007C, 0x0000000C,\n    0x00005780, 0x0000497A, 0x00050084, 0x0000000C, 0x00001F02, 0x00002F39,\n    0x00005780, 0x00050051, 0x0000000C, 0x00006242, 0x0000277F, 0x00000001,\n    0x000500C3, 0x0000000C, 0x00004A6F, 0x00006242, 0x00000A17, 0x00050080,\n    0x0000000C, 0x00002B2C, 0x00001F02, 0x00004A6F, 0x0004007C, 0x0000000C,\n    0x00004202, 0x00004C14, 0x00050084, 0x0000000C, 0x00003A60, 0x00002B2C,\n    0x00004202, 0x00050051, 0x0000000C, 0x00006243, 0x0000277F, 0x00000000,\n    0x000500C3, 0x0000000C, 0x00004FC7, 0x00006243, 0x00000A1A, 0x00050080,\n    0x0000000C, 0x000049FC, 0x00003A60, 0x00004FC7, 0x000500C4, 0x0000000C,\n    0x0000225D, 0x000049FC, 0x00000A20, 0x000500C7, 0x0000000C, 0x00002CAA,\n    0x00001A7E, 0x00000A14, 0x000500C4, 0x0000000C, 0x00004CAE, 0x00002CAA,\n    0x00000A1A, 0x000500C3, 0x0000000C, 0x0000383E, 0x00006242, 0x00000A0E,\n    0x000500C7, 0x0000000C, 0x00005374, 0x0000383E, 0x00000A14, 0x000500C4,\n    0x0000000C, 0x000054CA, 0x00005374, 0x00000A14, 0x000500C5, 0x0000000C,\n    0x000042CE, 0x00004CAE, 0x000054CA, 0x000500C7, 0x0000000C, 0x000050D5,\n    0x00006243, 0x00000A20, 0x000500C5, 0x0000000C, 0x00003ADD, 0x000042CE,\n    0x000050D5, 0x000500C5, 0x0000000C, 0x000043B6, 0x0000225D, 0x00003ADD,\n    0x000500C4, 0x0000000C, 0x00005E50, 0x000043B6, 0x00000A13, 0x000500C3,\n    0x0000000C, 0x000032D7, 0x00006242, 0x00000A14, 0x000500C6, 0x0000000C,\n    0x000026C9, 0x000032D7, 0x00002F39, 0x000500C7, 0x0000000C, 0x00004199,\n    0x000026C9, 0x00000A0E, 0x000500C3, 0x0000000C, 0x00002590, 0x00006243,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x0000505E, 0x00002590, 0x00000A14,\n    0x000500C4, 0x0000000C, 0x0000541D, 0x00004199, 0x00000A0E, 0x000500C6,\n    0x0000000C, 0x000022BA, 0x0000505E, 0x0000541D, 0x000500C7, 0x0000000C,\n    0x00005076, 0x00006242, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005228,\n    0x00005076, 0x00000A17, 0x000500C4, 0x0000000C, 0x00001997, 0x000022BA,\n    0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FE, 0x00005228, 0x00001997,\n    0x000500C4, 0x0000000C, 0x00001C00, 0x00004199, 0x00000A2C, 0x000500C5,\n    0x0000000C, 0x00003C81, 0x000047FE, 0x00001C00, 0x000500C7, 0x0000000C,\n    0x000050AF, 0x00005E50, 0x00000A38, 0x000500C5, 0x0000000C, 0x00003C70,\n    0x00003C81, 0x000050AF, 0x000500C3, 0x0000000C, 0x00003745, 0x00005E50,\n    0x00000A17, 0x000500C7, 0x0000000C, 0x000018B8, 0x00003745, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x0000547E, 0x000018B8, 0x00000A1A, 0x000500C5,\n    0x0000000C, 0x000045A8, 0x00003C70, 0x0000547E, 0x000500C3, 0x0000000C,\n    0x00003A6E, 0x00005E50, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018B9,\n    0x00003A6E, 0x00000A20, 0x000500C4, 0x0000000C, 0x0000547F, 0x000018B9,\n    0x00000A23, 0x000500C5, 0x0000000C, 0x0000456F, 0x000045A8, 0x0000547F,\n    0x000500C3, 0x0000000C, 0x00003C88, 0x00005E50, 0x00000A23, 0x000500C4,\n    0x0000000C, 0x00002824, 0x00003C88, 0x00000A2F, 0x000500C5, 0x0000000C,\n    0x00003B79, 0x0000456F, 0x00002824, 0x0004007C, 0x0000000B, 0x000041E5,\n    0x00003B79, 0x000200F9, 0x00005BF0, 0x000200F8, 0x00005F21, 0x0004007C,\n    0x00000012, 0x000059D8, 0x000042F0, 0x000500C2, 0x0000000B, 0x00005668,\n    0x00005788, 0x00000A1A, 0x00050051, 0x0000000C, 0x00003905, 0x000059D8,\n    0x00000001, 0x000500C3, 0x0000000C, 0x00002F3A, 0x00003905, 0x00000A1A,\n    0x0004007C, 0x0000000C, 0x00005781, 0x00005668, 0x00050084, 0x0000000C,\n    0x00001F03, 0x00002F3A, 0x00005781, 0x00050051, 0x0000000C, 0x00006244,\n    0x000059D8, 0x00000000, 0x000500C3, 0x0000000C, 0x00004FC8, 0x00006244,\n    0x00000A1A, 0x00050080, 0x0000000C, 0x000049B0, 0x00001F03, 0x00004FC8,\n    0x000500C4, 0x0000000C, 0x0000254A, 0x000049B0, 0x00000A1D, 0x000500C3,\n    0x0000000C, 0x0000603B, 0x00003905, 0x00000A0E, 0x000500C7, 0x0000000C,\n    0x0000539A, 0x0000603B, 0x00000A20, 0x000500C4, 0x0000000C, 0x0000534A,\n    0x0000539A, 0x00000A14, 0x000500C7, 0x0000000C, 0x00004EA5, 0x00006244,\n    0x00000A20, 0x000500C5, 0x0000000C, 0x00002B1A, 0x0000534A, 0x00004EA5,\n    0x000500C5, 0x0000000C, 0x000043B7, 0x0000254A, 0x00002B1A, 0x000500C4,\n    0x0000000C, 0x00005E63, 0x000043B7, 0x00000A13, 0x000500C3, 0x0000000C,\n    0x000031DE, 0x00003905, 0x00000A17, 0x000500C7, 0x0000000C, 0x00005447,\n    0x000031DE, 0x00000A0E, 0x000500C3, 0x0000000C, 0x000028A6, 0x00006244,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x0000511E, 0x000028A6, 0x00000A14,\n    0x000500C3, 0x0000000C, 0x000028B9, 0x00003905, 0x00000A14, 0x000500C7,\n    0x0000000C, 0x0000505F, 0x000028B9, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x0000541E, 0x0000505F, 0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BB,\n    0x0000511E, 0x0000541E, 0x000500C7, 0x0000000C, 0x00005077, 0x00003905,\n    0x00000A0E, 0x000500C4, 0x0000000C, 0x00005229, 0x00005077, 0x00000A17,\n    0x000500C4, 0x0000000C, 0x00001998, 0x000022BB, 0x00000A1D, 0x000500C5,\n    0x0000000C, 0x000047FF, 0x00005229, 0x00001998, 0x000500C4, 0x0000000C,\n    0x00001C01, 0x00005447, 0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C82,\n    0x000047FF, 0x00001C01, 0x000500C7, 0x0000000C, 0x000050B0, 0x00005E63,\n    0x00000A38, 0x000500C5, 0x0000000C, 0x00003C71, 0x00003C82, 0x000050B0,\n    0x000500C3, 0x0000000C, 0x00003746, 0x00005E63, 0x00000A17, 0x000500C7,\n    0x0000000C, 0x000018BA, 0x00003746, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x00005480, 0x000018BA, 0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A9,\n    0x00003C71, 0x00005480, 0x000500C3, 0x0000000C, 0x00003A6F, 0x00005E63,\n    0x00000A1A, 0x000500C7, 0x0000000C, 0x000018BB, 0x00003A6F, 0x00000A20,\n    0x000500C4, 0x0000000C, 0x00005481, 0x000018BB, 0x00000A23, 0x000500C5,\n    0x0000000C, 0x00004570, 0x000045A9, 0x00005481, 0x000500C3, 0x0000000C,\n    0x00003C89, 0x00005E63, 0x00000A23, 0x000500C4, 0x0000000C, 0x00002825,\n    0x00003C89, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B7A, 0x00004570,\n    0x00002825, 0x0004007C, 0x0000000B, 0x000041E6, 0x00003B7A, 0x000200F9,\n    0x00005BF0, 0x000200F8, 0x00005BF0, 0x000700F5, 0x0000000B, 0x0000292C,\n    0x000041E5, 0x00005BE0, 0x000041E6, 0x00005F21, 0x000200F9, 0x00004A60,\n    0x000200F8, 0x00004A60, 0x000700F5, 0x0000000B, 0x00002C70, 0x00002C67,\n    0x0000260D, 0x0000292C, 0x00005BF0, 0x00050080, 0x0000000B, 0x000048BD,\n    0x00002C70, 0x00005EAC, 0x000500C2, 0x0000000B, 0x00003D52, 0x000048BD,\n    0x00000A17, 0x00060041, 0x00000294, 0x00004FAF, 0x0000107A, 0x00000A0B,\n    0x00003D52, 0x0004003D, 0x00000017, 0x00001CAA, 0x00004FAF, 0x000500AA,\n    0x00000009, 0x000035C0, 0x000061E2, 0x00000A0D, 0x000500AA, 0x00000009,\n    0x00005376, 0x000061E2, 0x00000A10, 0x000500A6, 0x00000009, 0x00005686,\n    0x000035C0, 0x00005376, 0x000300F7, 0x00003463, 0x00000000, 0x000400FA,\n    0x00005686, 0x00002957, 0x00003463, 0x000200F8, 0x00002957, 0x000500C7,\n    0x00000017, 0x0000475F, 0x00001CAA, 0x000009CE, 0x000500C4, 0x00000017,\n    0x000024D1, 0x0000475F, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AC,\n    0x00001CAA, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448D, 0x000050AC,\n    0x0000013D, 0x000500C5, 0x00000017, 0x00003FF8, 0x000024D1, 0x0000448D,\n    0x000200F9, 0x00003463, 0x000200F8, 0x00003463, 0x000700F5, 0x00000017,\n    0x00005879, 0x00001CAA, 0x00004A60, 0x00003FF8, 0x00002957, 0x000500AA,\n    0x00000009, 0x00004CB6, 0x000061E2, 0x00000A13, 0x000500A6, 0x00000009,\n    0x00003B23, 0x00005376, 0x00004CB6, 0x000300F7, 0x00003A1A, 0x00000000,\n    0x000400FA, 0x00003B23, 0x00002B38, 0x00003A1A, 0x000200F8, 0x00002B38,\n    0x000500C4, 0x00000017, 0x00005E17, 0x00005879, 0x000002ED, 0x000500C2,\n    0x00000017, 0x00003BE7, 0x00005879, 0x000002ED, 0x000500C5, 0x00000017,\n    0x000029E8, 0x00005E17, 0x00003BE7, 0x000200F9, 0x00003A1A, 0x000200F8,\n    0x00003A1A, 0x000700F5, 0x00000017, 0x00002AAC, 0x00005879, 0x00003463,\n    0x000029E8, 0x00002B38, 0x000300F7, 0x00006070, 0x00000002, 0x000400FA,\n    0x00004376, 0x000055E9, 0x00001C25, 0x000200F8, 0x000055E9, 0x000200F9,\n    0x00006070, 0x000200F8, 0x00001C25, 0x000200F9, 0x00006070, 0x000200F8,\n    0x00006070, 0x000700F5, 0x0000000B, 0x00002C71, 0x00000A6A, 0x000055E9,\n    0x00000A3A, 0x00001C25, 0x00050080, 0x0000000B, 0x000048BE, 0x000048BD,\n    0x00002C71, 0x000500C2, 0x0000000B, 0x00003D53, 0x000048BE, 0x00000A17,\n    0x00060041, 0x00000294, 0x00005566, 0x0000107A, 0x00000A0B, 0x00003D53,\n    0x0004003D, 0x00000017, 0x00003910, 0x00005566, 0x000300F7, 0x00003A1B,\n    0x00000000, 0x000400FA, 0x00005686, 0x00002958, 0x00003A1B, 0x000200F8,\n    0x00002958, 0x000500C7, 0x00000017, 0x00004760, 0x00003910, 0x000009CE,\n    0x000500C4, 0x00000017, 0x000024D2, 0x00004760, 0x0000013D, 0x000500C7,\n    0x00000017, 0x000050AD, 0x00003910, 0x0000072E, 0x000500C2, 0x00000017,\n    0x0000448E, 0x000050AD, 0x0000013D, 0x000500C5, 0x00000017, 0x00003FF9,\n    0x000024D2, 0x0000448E, 0x000200F9, 0x00003A1B, 0x000200F8, 0x00003A1B,\n    0x000700F5, 0x00000017, 0x00002AAD, 0x00003910, 0x00006070, 0x00003FF9,\n    0x00002958, 0x000300F7, 0x0000362B, 0x00000000, 0x000400FA, 0x00003B23,\n    0x00002B39, 0x0000362B, 0x000200F8, 0x00002B39, 0x000500C4, 0x00000017,\n    0x00005E18, 0x00002AAD, 0x000002ED, 0x000500C2, 0x00000017, 0x00003BE8,\n    0x00002AAD, 0x000002ED, 0x000500C5, 0x00000017, 0x000029E9, 0x00005E18,\n    0x00003BE8, 0x000200F9, 0x0000362B, 0x000200F8, 0x0000362B, 0x000700F5,\n    0x00000017, 0x000041F2, 0x00002AAD, 0x00003A1B, 0x000029E9, 0x00002B39,\n    0x000500C2, 0x0000000B, 0x000062B3, 0x000038F6, 0x00000A17, 0x00050051,\n    0x0000000B, 0x00002FCA, 0x00002AAC, 0x00000000, 0x00050051, 0x0000000B,\n    0x00005FDB, 0x00002AAC, 0x00000002, 0x00050051, 0x0000000B, 0x00001DD9,\n    0x000041F2, 0x00000000, 0x00050051, 0x0000000B, 0x0000275B, 0x000041F2,\n    0x00000002, 0x00070050, 0x00000017, 0x00004170, 0x00002FCA, 0x00005FDB,\n    0x00001DD9, 0x0000275B, 0x000500C7, 0x00000017, 0x00001FCD, 0x00004170,\n    0x000002B7, 0x000500C7, 0x00000017, 0x00004210, 0x00004170, 0x0000064B,\n    0x000500C4, 0x00000017, 0x00006164, 0x00004210, 0x00000065, 0x000500C5,\n    0x00000017, 0x000042BB, 0x00001FCD, 0x00006164, 0x000500C7, 0x00000017,\n    0x00005182, 0x00004170, 0x00000192, 0x000500C4, 0x00000017, 0x00005B17,\n    0x00005182, 0x0000013D, 0x000500C5, 0x00000017, 0x000042BC, 0x000042BB,\n    0x00005B17, 0x000500C7, 0x00000017, 0x00005183, 0x00004170, 0x00000857,\n    0x000500C4, 0x00000017, 0x00005B18, 0x00005183, 0x00000215, 0x000500C5,\n    0x00000017, 0x000042BD, 0x000042BC, 0x00005B18, 0x000500C7, 0x00000017,\n    0x00005184, 0x00004170, 0x000009E6, 0x000500C4, 0x00000017, 0x00005125,\n    0x00005184, 0x000002ED, 0x000500C5, 0x00000017, 0x000048D8, 0x000042BD,\n    0x00005125, 0x00060041, 0x00000294, 0x000051EE, 0x0000140E, 0x00000A0B,\n    0x000062B3, 0x0003003E, 0x000051EE, 0x000048D8, 0x00050051, 0x0000000B,\n    0x00003220, 0x000043C0, 0x00000001, 0x00050080, 0x0000000B, 0x00005AC0,\n    0x00003220, 0x00000A0E, 0x000500B0, 0x00000009, 0x00004411, 0x00005AC0,\n    0x000019C2, 0x000300F7, 0x00001C27, 0x00000002, 0x000400FA, 0x00004411,\n    0x0000592C, 0x00001C27, 0x000200F8, 0x0000592C, 0x00050080, 0x0000000B,\n    0x00003C79, 0x000038F6, 0x0000578C, 0x000500C2, 0x0000000B, 0x000037B9,\n    0x00003C79, 0x00000A17, 0x000500C2, 0x00000017, 0x000037E8, 0x00004170,\n    0x000002ED, 0x000500C7, 0x00000017, 0x00001AC0, 0x000037E8, 0x000002B7,\n    0x000500C7, 0x00000017, 0x00004943, 0x000037E8, 0x0000064B, 0x000500C4,\n    0x00000017, 0x00006165, 0x00004943, 0x00000065, 0x000500C5, 0x00000017,\n    0x000042BE, 0x00001AC0, 0x00006165, 0x000500C7, 0x00000017, 0x00005185,\n    0x000037E8, 0x00000192, 0x000500C4, 0x00000017, 0x00005B19, 0x00005185,\n    0x0000013D, 0x000500C5, 0x00000017, 0x000042BF, 0x000042BE, 0x00005B19,\n    0x000500C7, 0x00000017, 0x00005186, 0x000037E8, 0x00000857, 0x000500C4,\n    0x00000017, 0x00005B1A, 0x00005186, 0x00000215, 0x000500C5, 0x00000017,\n    0x000042C0, 0x000042BF, 0x00005B1A, 0x000500C7, 0x00000017, 0x00005187,\n    0x000037E8, 0x000009E6, 0x000500C4, 0x00000017, 0x00005126, 0x00005187,\n    0x000002ED, 0x000500C5, 0x00000017, 0x000048D9, 0x000042C0, 0x00005126,\n    0x00060041, 0x00000294, 0x0000556B, 0x0000140E, 0x00000A0B, 0x000037B9,\n    0x0003003E, 0x0000556B, 0x000048D9, 0x00050080, 0x0000000B, 0x000039F8,\n    0x00003220, 0x00000A11, 0x000500B0, 0x00000009, 0x00002E0B, 0x000039F8,\n    0x000019C2, 0x000300F7, 0x00001C26, 0x00000002, 0x000400FA, 0x00002E0B,\n    0x0000592D, 0x00001C26, 0x000200F8, 0x0000592D, 0x00050080, 0x0000000B,\n    0x00003416, 0x00003C79, 0x0000578C, 0x000500C2, 0x0000000B, 0x000030D5,\n    0x00003416, 0x00000A17, 0x00050051, 0x0000000B, 0x000044F9, 0x00002AAC,\n    0x00000001, 0x00050051, 0x0000000B, 0x00005FDD, 0x00002AAC, 0x00000003,\n    0x00050051, 0x0000000B, 0x00001DDA, 0x000041F2, 0x00000001, 0x00050051,\n    0x0000000B, 0x0000275C, 0x000041F2, 0x00000003, 0x00070050, 0x00000017,\n    0x00004171, 0x000044F9, 0x00005FDD, 0x00001DDA, 0x0000275C, 0x000500C7,\n    0x00000017, 0x00001FCE, 0x00004171, 0x000002B7, 0x000500C7, 0x00000017,\n    0x00004211, 0x00004171, 0x0000064B, 0x000500C4, 0x00000017, 0x00006166,\n    0x00004211, 0x00000065, 0x000500C5, 0x00000017, 0x000042C1, 0x00001FCE,\n    0x00006166, 0x000500C7, 0x00000017, 0x00005188, 0x00004171, 0x00000192,\n    0x000500C4, 0x00000017, 0x00005B1B, 0x00005188, 0x0000013D, 0x000500C5,\n    0x00000017, 0x000042C2, 0x000042C1, 0x00005B1B, 0x000500C7, 0x00000017,\n    0x00005189, 0x00004171, 0x00000857, 0x000500C4, 0x00000017, 0x00005B1C,\n    0x00005189, 0x00000215, 0x000500C5, 0x00000017, 0x000042C3, 0x000042C2,\n    0x00005B1C, 0x000500C7, 0x00000017, 0x0000518A, 0x00004171, 0x000009E6,\n    0x000500C4, 0x00000017, 0x00005127, 0x0000518A, 0x000002ED, 0x000500C5,\n    0x00000017, 0x000048DA, 0x000042C3, 0x00005127, 0x00060041, 0x00000294,\n    0x0000556C, 0x0000140E, 0x00000A0B, 0x000030D5, 0x0003003E, 0x0000556C,\n    0x000048DA, 0x00050080, 0x0000000B, 0x000039F9, 0x00003220, 0x00000A14,\n    0x000500B0, 0x00000009, 0x00002E0C, 0x000039F9, 0x000019C2, 0x000300F7,\n    0x00004665, 0x00000002, 0x000400FA, 0x00002E0C, 0x0000592E, 0x00004665,\n    0x000200F8, 0x0000592E, 0x00050080, 0x0000000B, 0x00003C7A, 0x00003416,\n    0x0000578C, 0x000500C2, 0x0000000B, 0x000037BA, 0x00003C7A, 0x00000A17,\n    0x000500C2, 0x00000017, 0x000037E9, 0x00004171, 0x000002ED, 0x000500C7,\n    0x00000017, 0x00001AC1, 0x000037E9, 0x000002B7, 0x000500C7, 0x00000017,\n    0x00004944, 0x000037E9, 0x0000064B, 0x000500C4, 0x00000017, 0x00006167,\n    0x00004944, 0x00000065, 0x000500C5, 0x00000017, 0x000042C4, 0x00001AC1,\n    0x00006167, 0x000500C7, 0x00000017, 0x0000518B, 0x000037E9, 0x00000192,\n    0x000500C4, 0x00000017, 0x00005B1D, 0x0000518B, 0x0000013D, 0x000500C5,\n    0x00000017, 0x000042C5, 0x000042C4, 0x00005B1D, 0x000500C7, 0x00000017,\n    0x0000518C, 0x000037E9, 0x00000857, 0x000500C4, 0x00000017, 0x00005B1E,\n    0x0000518C, 0x00000215, 0x000500C5, 0x00000017, 0x000042C6, 0x000042C5,\n    0x00005B1E, 0x000500C7, 0x00000017, 0x0000518D, 0x000037E9, 0x000009E6,\n    0x000500C4, 0x00000017, 0x00005128, 0x0000518D, 0x000002ED, 0x000500C5,\n    0x00000017, 0x000048DB, 0x000042C6, 0x00005128, 0x00060041, 0x00000294,\n    0x00005E66, 0x0000140E, 0x00000A0B, 0x000037BA, 0x0003003E, 0x00005E66,\n    0x000048DB, 0x000200F9, 0x00004665, 0x000200F8, 0x00004665, 0x000200F9,\n    0x00001C26, 0x000200F8, 0x00001C26, 0x000200F9, 0x00001C27, 0x000200F8,\n    0x00001C27, 0x000200F9, 0x00003A37, 0x000200F8, 0x00003A37, 0x000100FD,\n    0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_dxt3aas1111_argb4_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25157\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n     %v4uint = OpTypeVector %uint 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v3uint = OpTypeVector %uint 3\n     %uint_3 = OpConstant %uint 3\n    %uint_11 = OpConstant %uint 11\n        %287 = OpConstantComposite %v4uint %uint_3 %uint_11 %uint_3 %uint_11\n     %uint_1 = OpConstant %uint 1\n     %uint_4 = OpConstant %uint 4\n     %uint_7 = OpConstant %uint 7\n    %uint_15 = OpConstant %uint 15\n        %503 = OpConstantComposite %v4uint %uint_7 %uint_15 %uint_7 %uint_15\n    %uint_20 = OpConstant %uint 20\n     %uint_2 = OpConstant %uint 2\n    %uint_10 = OpConstant %uint 10\n        %233 = OpConstantComposite %v4uint %uint_2 %uint_10 %uint_2 %uint_10\n     %uint_8 = OpConstant %uint 8\n     %uint_6 = OpConstant %uint 6\n    %uint_14 = OpConstant %uint 14\n        %449 = OpConstantComposite %v4uint %uint_6 %uint_14 %uint_6 %uint_14\n    %uint_24 = OpConstant %uint 24\n     %uint_9 = OpConstant %uint 9\n        %179 = OpConstantComposite %v4uint %uint_1 %uint_9 %uint_1 %uint_9\n    %uint_12 = OpConstant %uint 12\n     %uint_5 = OpConstant %uint 5\n    %uint_13 = OpConstant %uint 13\n        %395 = OpConstantComposite %v4uint %uint_5 %uint_13 %uint_5 %uint_13\n    %uint_28 = OpConstant %uint 28\n     %uint_0 = OpConstant %uint 0\n        %125 = OpConstantComposite %v4uint %uint_0 %uint_8 %uint_0 %uint_8\n        %341 = OpConstantComposite %v4uint %uint_4 %uint_12 %uint_4 %uint_12\n    %uint_16 = OpConstant %uint 16\n%uint_16711935 = OpConstant %uint 16711935\n%uint_4278255360 = OpConstant %uint 4278255360\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n      %int_3 = OpConstant %int 3\n      %int_2 = OpConstant %int 2\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %2596 = OpConstantComposite %v3uint %uint_2 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n       %2619 = OpConstantComposite %v3uint %uint_2 %uint_2 %uint_0\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n    %uint_32 = OpConstant %uint 32\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n       %2950 = OpConstantComposite %v4uint %uint_1 %uint_1 %uint_1 %uint_1\n        %101 = OpConstantComposite %v4uint %uint_4 %uint_4 %uint_4 %uint_4\n        %965 = OpConstantComposite %v4uint %uint_20 %uint_20 %uint_20 %uint_20\n       %1181 = OpConstantComposite %v4uint %uint_24 %uint_24 %uint_24 %uint_24\n        %533 = OpConstantComposite %v4uint %uint_12 %uint_12 %uint_12 %uint_12\n       %1397 = OpConstantComposite %v4uint %uint_28 %uint_28 %uint_28 %uint_28\n       %3004 = OpConstantComposite %v4uint %uint_2 %uint_2 %uint_2 %uint_2\n        %200 = OpConstantNull %v2uint\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %14903 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24540 = OpBitwiseAnd %uint %13606 %uint_1\n      %17270 = OpINotEqual %bool %24540 %uint_0\n      %12328 = OpBitwiseAnd %uint %13606 %uint_2\n      %17284 = OpINotEqual %bool %12328 %uint_0\n       %7856 = OpShiftRightLogical %uint %13606 %uint_2\n      %25058 = OpBitwiseAnd %uint %7856 %uint_3\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20158 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n      %22412 = OpLoad %uint %20158\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_7\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2596\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %14018 DontFlatten\n               OpBranchConditional %24679 %21992 %14018\n      %21992 = OpLabel\n               OpBranch %14903\n      %14018 = OpLabel\n      %17344 = OpShiftLeftLogical %v3uint %21387 %2619\n      %15489 = OpBitcast %v3int %17344\n      %18336 = OpCompositeExtract %int %15489 0\n       %9362 = OpIMul %int %18336 %int_2\n       %6362 = OpCompositeExtract %int %15489 2\n      %14505 = OpBitcast %int %6594\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %15489 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %22412\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %9362 %24535\n      %10404 = OpBitcast %uint %8258\n      %14582 = OpIAdd %uint %22411 %10404\n      %12308 = OpLogicalNot %bool %17270\n               OpSelectionMerge %19040 DontFlatten\n               OpBranchConditional %12308 %9741 %17007\n       %9741 = OpLabel\n      %17463 = OpCompositeExtract %uint %21387 0\n      %11246 = OpCompositeExtract %uint %21387 1\n      %18801 = OpCompositeExtract %uint %21387 2\n      %14831 = OpIMul %uint %22409 %18801\n      %20322 = OpIAdd %uint %11246 %14831\n      %21676 = OpIMul %uint %22408 %20322\n      %20398 = OpIAdd %uint %17463 %21676\n      %11367 = OpShiftLeftLogical %uint %20398 %uint_3\n               OpBranch %19040\n      %17007 = OpLabel\n               OpSelectionMerge %23536 DontFlatten\n               OpBranchConditional %17284 %23520 %24353\n      %23520 = OpLabel\n      %10111 = OpBitcast %v3int %21387\n      %19476 = OpShiftRightLogical %uint %22408 %int_5\n      %18810 = OpShiftRightLogical %uint %22409 %int_4\n       %6782 = OpCompositeExtract %int %10111 2\n      %12089 = OpShiftRightArithmetic %int %6782 %int_2\n      %22400 = OpBitcast %int %18810\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %10111 1\n      %19055 = OpShiftRightArithmetic %int %25154 %int_4\n      %11052 = OpIAdd %int %7938 %19055\n      %16898 = OpBitcast %int %19476\n      %14944 = OpIMul %int %11052 %16898\n      %25155 = OpCompositeExtract %int %10111 0\n      %20423 = OpShiftRightArithmetic %int %25155 %int_5\n      %18940 = OpIAdd %int %14944 %20423\n       %8797 = OpShiftLeftLogical %int %18940 %int_7\n      %11434 = OpBitwiseAnd %int %6782 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %25154 %int_1\n      %21364 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21364 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %25155 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17334 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17334 %uint_3\n      %13015 = OpShiftRightArithmetic %int %25154 %int_3\n       %9929 = OpBitwiseXor %int %13015 %12089\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %25155 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %25154 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6551\n       %7168 = OpShiftLeftLogical %int %16793 %int_11\n      %15490 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24144 %int_15\n      %15472 = OpBitwiseOr %int %15490 %20655\n      %14149 = OpShiftRightArithmetic %int %24144 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24144 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24144 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %23536\n      %24353 = OpLabel\n      %23000 = OpBitcast %v2int %17136\n      %22120 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %23000 1\n      %12090 = OpShiftRightArithmetic %int %14597 %int_5\n      %22401 = OpBitcast %int %22120\n       %7939 = OpIMul %int %12090 %22401\n      %25156 = OpCompositeExtract %int %23000 0\n      %20424 = OpShiftRightArithmetic %int %25156 %int_5\n      %18864 = OpIAdd %int %7939 %20424\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25156 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17335 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17335 %uint_3\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25156 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6552\n       %7169 = OpShiftLeftLogical %int %21575 %int_11\n      %15491 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24163 %int_15\n      %15473 = OpBitwiseOr %int %15491 %20656\n      %14150 = OpShiftRightArithmetic %int %24163 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24163 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %23536\n      %23536 = OpLabel\n      %10540 = OpPhi %uint %16869 %23520 %16870 %24353\n               OpBranch %19040\n      %19040 = OpLabel\n      %11376 = OpPhi %uint %11367 %9741 %10540 %23536\n      %18621 = OpIAdd %uint %11376 %24236\n      %15698 = OpShiftRightLogical %uint %18621 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15698\n       %7338 = OpLoad %v4uint %20399\n      %13760 = OpIEqual %bool %25058 %uint_1\n      %21366 = OpIEqual %bool %25058 %uint_2\n      %22150 = OpLogicalOr %bool %13760 %21366\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %7338 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %7338 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22649 = OpPhi %v4uint %7338 %19040 %16376 %10583\n      %19638 = OpIEqual %bool %25058 %uint_3\n      %15139 = OpLogicalOr %bool %21366 %19638\n               OpSelectionMerge %14874 None\n               OpBranchConditional %15139 %11064 %14874\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22649 %749\n      %15335 = OpShiftRightLogical %v4uint %22649 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %14874\n      %14874 = OpLabel\n      %10924 = OpPhi %v4uint %22649 %13411 %10728 %11064\n               OpSelectionMerge %24688 DontFlatten\n               OpBranchConditional %17270 %21993 %7205\n      %21993 = OpLabel\n               OpBranch %24688\n       %7205 = OpLabel\n               OpBranch %24688\n      %24688 = OpLabel\n      %11377 = OpPhi %uint %uint_32 %21993 %uint_16 %7205\n      %18622 = OpIAdd %uint %18621 %11377\n      %15699 = OpShiftRightLogical %uint %18622 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15699\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %14875 None\n               OpBranchConditional %22150 %10584 %14875\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %14875\n      %14875 = OpLabel\n      %10925 = OpPhi %v4uint %14608 %24688 %16377 %10584\n               OpSelectionMerge %13867 None\n               OpBranchConditional %15139 %11065 %13867\n      %11065 = OpLabel\n      %24088 = OpShiftLeftLogical %v4uint %10925 %749\n      %15336 = OpShiftRightLogical %v4uint %10925 %749\n      %10729 = OpBitwiseOr %v4uint %24088 %15336\n               OpBranch %13867\n      %13867 = OpLabel\n      %16844 = OpPhi %v4uint %10925 %14875 %10729 %11065\n       %8689 = OpShiftRightLogical %uint %14582 %int_4\n      %11313 = OpVectorShuffle %v4uint %10924 %200 0 0 2 2\n       %9021 = OpShiftRightLogical %v4uint %11313 %287\n       %7908 = OpBitwiseAnd %v4uint %9021 %2950\n      %24647 = OpShiftLeftLogical %v4uint %7908 %101\n      %22591 = OpShiftRightLogical %v4uint %11313 %503\n      %21613 = OpBitwiseAnd %v4uint %22591 %2950\n      %24033 = OpShiftLeftLogical %v4uint %21613 %965\n      %18005 = OpBitwiseOr %v4uint %24647 %24033\n      %23151 = OpShiftRightLogical %v4uint %11313 %233\n       %6577 = OpBitwiseAnd %v4uint %23151 %2950\n      %24034 = OpShiftLeftLogical %v4uint %6577 %317\n      %18006 = OpBitwiseOr %v4uint %18005 %24034\n      %23152 = OpShiftRightLogical %v4uint %11313 %449\n       %6578 = OpBitwiseAnd %v4uint %23152 %2950\n      %24035 = OpShiftLeftLogical %v4uint %6578 %1181\n      %18007 = OpBitwiseOr %v4uint %18006 %24035\n      %23153 = OpShiftRightLogical %v4uint %11313 %179\n       %6579 = OpBitwiseAnd %v4uint %23153 %2950\n      %24036 = OpShiftLeftLogical %v4uint %6579 %533\n      %18008 = OpBitwiseOr %v4uint %18007 %24036\n      %23154 = OpShiftRightLogical %v4uint %11313 %395\n       %6580 = OpBitwiseAnd %v4uint %23154 %2950\n      %24037 = OpShiftLeftLogical %v4uint %6580 %1397\n      %18009 = OpBitwiseOr %v4uint %18008 %24037\n      %23170 = OpShiftRightLogical %v4uint %11313 %125\n       %6347 = OpBitwiseAnd %v4uint %23170 %2950\n      %16454 = OpBitwiseOr %v4uint %18009 %6347\n      %22342 = OpShiftRightLogical %v4uint %11313 %341\n       %6581 = OpBitwiseAnd %v4uint %22342 %2950\n      %24071 = OpShiftLeftLogical %v4uint %6581 %749\n      %17621 = OpBitwiseOr %v4uint %16454 %24071\n       %7111 = OpShiftLeftLogical %v4uint %17621 %2950\n      %16008 = OpBitwiseOr %v4uint %17621 %7111\n      %23693 = OpShiftLeftLogical %v4uint %16008 %3004\n      %17035 = OpBitwiseOr %v4uint %16008 %23693\n      %21867 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %8689\n               OpStore %21867 %17035\n       %8534 = OpIAdd %uint %14582 %uint_16\n       %6739 = OpShiftRightLogical %uint %8534 %int_4\n      %16736 = OpVectorShuffle %v4uint %16844 %200 0 0 2 2\n       %9022 = OpShiftRightLogical %v4uint %16736 %287\n       %7909 = OpBitwiseAnd %v4uint %9022 %2950\n      %24648 = OpShiftLeftLogical %v4uint %7909 %101\n      %22592 = OpShiftRightLogical %v4uint %16736 %503\n      %21614 = OpBitwiseAnd %v4uint %22592 %2950\n      %24038 = OpShiftLeftLogical %v4uint %21614 %965\n      %18010 = OpBitwiseOr %v4uint %24648 %24038\n      %23155 = OpShiftRightLogical %v4uint %16736 %233\n       %6582 = OpBitwiseAnd %v4uint %23155 %2950\n      %24039 = OpShiftLeftLogical %v4uint %6582 %317\n      %18011 = OpBitwiseOr %v4uint %18010 %24039\n      %23156 = OpShiftRightLogical %v4uint %16736 %449\n       %6583 = OpBitwiseAnd %v4uint %23156 %2950\n      %24040 = OpShiftLeftLogical %v4uint %6583 %1181\n      %18012 = OpBitwiseOr %v4uint %18011 %24040\n      %23157 = OpShiftRightLogical %v4uint %16736 %179\n       %6584 = OpBitwiseAnd %v4uint %23157 %2950\n      %24041 = OpShiftLeftLogical %v4uint %6584 %533\n      %18013 = OpBitwiseOr %v4uint %18012 %24041\n      %23158 = OpShiftRightLogical %v4uint %16736 %395\n       %6585 = OpBitwiseAnd %v4uint %23158 %2950\n      %24042 = OpShiftLeftLogical %v4uint %6585 %1397\n      %18014 = OpBitwiseOr %v4uint %18013 %24042\n      %23171 = OpShiftRightLogical %v4uint %16736 %125\n       %6348 = OpBitwiseAnd %v4uint %23171 %2950\n      %16455 = OpBitwiseOr %v4uint %18014 %6348\n      %22343 = OpShiftRightLogical %v4uint %16736 %341\n       %6586 = OpBitwiseAnd %v4uint %22343 %2950\n      %24072 = OpShiftLeftLogical %v4uint %6586 %749\n      %17622 = OpBitwiseOr %v4uint %16455 %24072\n       %7112 = OpShiftLeftLogical %v4uint %17622 %2950\n      %16009 = OpBitwiseOr %v4uint %17622 %7112\n      %23694 = OpShiftLeftLogical %v4uint %16009 %3004\n      %17036 = OpBitwiseOr %v4uint %16009 %23694\n      %20974 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %6739\n               OpStore %20974 %17036\n      %12832 = OpCompositeExtract %uint %17344 1\n      %23232 = OpIAdd %uint %12832 %int_1\n      %17425 = OpULessThan %bool %23232 %6594\n               OpSelectionMerge %7207 DontFlatten\n               OpBranchConditional %17425 %20681 %7207\n      %20681 = OpLabel\n      %13812 = OpIAdd %uint %14582 %22412\n      %10288 = OpCompositeExtract %uint %10924 0\n      %10052 = OpCompositeExtract %uint %10924 2\n       %7641 = OpCompositeExtract %uint %16844 0\n       %9980 = OpCompositeExtract %uint %16844 2\n      %17522 = OpCompositeConstruct %v4uint %10288 %10052 %7641 %9980\n       %9606 = OpShiftRightLogical %v4uint %17522 %749\n       %9479 = OpShiftRightLogical %uint %13812 %int_4\n      %24766 = OpVectorShuffle %v4uint %9606 %200 0 0 1 1\n       %9023 = OpShiftRightLogical %v4uint %24766 %287\n       %7910 = OpBitwiseAnd %v4uint %9023 %2950\n      %24649 = OpShiftLeftLogical %v4uint %7910 %101\n      %22593 = OpShiftRightLogical %v4uint %24766 %503\n      %21615 = OpBitwiseAnd %v4uint %22593 %2950\n      %24043 = OpShiftLeftLogical %v4uint %21615 %965\n      %18015 = OpBitwiseOr %v4uint %24649 %24043\n      %23159 = OpShiftRightLogical %v4uint %24766 %233\n       %6587 = OpBitwiseAnd %v4uint %23159 %2950\n      %24044 = OpShiftLeftLogical %v4uint %6587 %317\n      %18016 = OpBitwiseOr %v4uint %18015 %24044\n      %23160 = OpShiftRightLogical %v4uint %24766 %449\n       %6588 = OpBitwiseAnd %v4uint %23160 %2950\n      %24045 = OpShiftLeftLogical %v4uint %6588 %1181\n      %18017 = OpBitwiseOr %v4uint %18016 %24045\n      %23161 = OpShiftRightLogical %v4uint %24766 %179\n       %6589 = OpBitwiseAnd %v4uint %23161 %2950\n      %24046 = OpShiftLeftLogical %v4uint %6589 %533\n      %18018 = OpBitwiseOr %v4uint %18017 %24046\n      %23162 = OpShiftRightLogical %v4uint %24766 %395\n       %6590 = OpBitwiseAnd %v4uint %23162 %2950\n      %24047 = OpShiftLeftLogical %v4uint %6590 %1397\n      %18019 = OpBitwiseOr %v4uint %18018 %24047\n      %23172 = OpShiftRightLogical %v4uint %24766 %125\n       %6349 = OpBitwiseAnd %v4uint %23172 %2950\n      %16456 = OpBitwiseOr %v4uint %18019 %6349\n      %22344 = OpShiftRightLogical %v4uint %24766 %341\n       %6591 = OpBitwiseAnd %v4uint %22344 %2950\n      %24073 = OpShiftLeftLogical %v4uint %6591 %749\n      %17623 = OpBitwiseOr %v4uint %16456 %24073\n       %7113 = OpShiftLeftLogical %v4uint %17623 %2950\n      %16010 = OpBitwiseOr %v4uint %17623 %7113\n      %23695 = OpShiftLeftLogical %v4uint %16010 %3004\n      %17037 = OpBitwiseOr %v4uint %16010 %23695\n      %21868 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %9479\n               OpStore %21868 %17037\n       %8535 = OpIAdd %uint %13812 %uint_16\n       %6740 = OpShiftRightLogical %uint %8535 %int_4\n      %16737 = OpVectorShuffle %v4uint %9606 %200 2 2 3 3\n       %9024 = OpShiftRightLogical %v4uint %16737 %287\n       %7911 = OpBitwiseAnd %v4uint %9024 %2950\n      %24650 = OpShiftLeftLogical %v4uint %7911 %101\n      %22594 = OpShiftRightLogical %v4uint %16737 %503\n      %21616 = OpBitwiseAnd %v4uint %22594 %2950\n      %24048 = OpShiftLeftLogical %v4uint %21616 %965\n      %18020 = OpBitwiseOr %v4uint %24650 %24048\n      %23163 = OpShiftRightLogical %v4uint %16737 %233\n       %6592 = OpBitwiseAnd %v4uint %23163 %2950\n      %24049 = OpShiftLeftLogical %v4uint %6592 %317\n      %18021 = OpBitwiseOr %v4uint %18020 %24049\n      %23164 = OpShiftRightLogical %v4uint %16737 %449\n       %6593 = OpBitwiseAnd %v4uint %23164 %2950\n      %24050 = OpShiftLeftLogical %v4uint %6593 %1181\n      %18022 = OpBitwiseOr %v4uint %18021 %24050\n      %23165 = OpShiftRightLogical %v4uint %16737 %179\n       %6595 = OpBitwiseAnd %v4uint %23165 %2950\n      %24051 = OpShiftLeftLogical %v4uint %6595 %533\n      %18023 = OpBitwiseOr %v4uint %18022 %24051\n      %23166 = OpShiftRightLogical %v4uint %16737 %395\n       %6596 = OpBitwiseAnd %v4uint %23166 %2950\n      %24052 = OpShiftLeftLogical %v4uint %6596 %1397\n      %18024 = OpBitwiseOr %v4uint %18023 %24052\n      %23173 = OpShiftRightLogical %v4uint %16737 %125\n       %6350 = OpBitwiseAnd %v4uint %23173 %2950\n      %16457 = OpBitwiseOr %v4uint %18024 %6350\n      %22345 = OpShiftRightLogical %v4uint %16737 %341\n       %6597 = OpBitwiseAnd %v4uint %22345 %2950\n      %24074 = OpShiftLeftLogical %v4uint %6597 %749\n      %17624 = OpBitwiseOr %v4uint %16457 %24074\n       %7114 = OpShiftLeftLogical %v4uint %17624 %2950\n      %16011 = OpBitwiseOr %v4uint %17624 %7114\n      %23696 = OpShiftLeftLogical %v4uint %16011 %3004\n      %17038 = OpBitwiseOr %v4uint %16011 %23696\n      %21869 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %6740\n               OpStore %21869 %17038\n      %14840 = OpIAdd %uint %12832 %int_2\n      %11787 = OpULessThan %bool %14840 %6594\n               OpSelectionMerge %7206 DontFlatten\n               OpBranchConditional %11787 %22828 %7206\n      %22828 = OpLabel\n      %13296 = OpIAdd %uint %13812 %22412\n      %14994 = OpShiftRightLogical %uint %13296 %int_4\n      %16738 = OpVectorShuffle %v4uint %10924 %200 1 1 3 3\n       %9025 = OpShiftRightLogical %v4uint %16738 %287\n       %7912 = OpBitwiseAnd %v4uint %9025 %2950\n      %24651 = OpShiftLeftLogical %v4uint %7912 %101\n      %22595 = OpShiftRightLogical %v4uint %16738 %503\n      %21617 = OpBitwiseAnd %v4uint %22595 %2950\n      %24053 = OpShiftLeftLogical %v4uint %21617 %965\n      %18025 = OpBitwiseOr %v4uint %24651 %24053\n      %23167 = OpShiftRightLogical %v4uint %16738 %233\n       %6598 = OpBitwiseAnd %v4uint %23167 %2950\n      %24054 = OpShiftLeftLogical %v4uint %6598 %317\n      %18026 = OpBitwiseOr %v4uint %18025 %24054\n      %23168 = OpShiftRightLogical %v4uint %16738 %449\n       %6599 = OpBitwiseAnd %v4uint %23168 %2950\n      %24055 = OpShiftLeftLogical %v4uint %6599 %1181\n      %18027 = OpBitwiseOr %v4uint %18026 %24055\n      %23169 = OpShiftRightLogical %v4uint %16738 %179\n       %6600 = OpBitwiseAnd %v4uint %23169 %2950\n      %24056 = OpShiftLeftLogical %v4uint %6600 %533\n      %18028 = OpBitwiseOr %v4uint %18027 %24056\n      %23174 = OpShiftRightLogical %v4uint %16738 %395\n       %6601 = OpBitwiseAnd %v4uint %23174 %2950\n      %24057 = OpShiftLeftLogical %v4uint %6601 %1397\n      %18029 = OpBitwiseOr %v4uint %18028 %24057\n      %23175 = OpShiftRightLogical %v4uint %16738 %125\n       %6351 = OpBitwiseAnd %v4uint %23175 %2950\n      %16458 = OpBitwiseOr %v4uint %18029 %6351\n      %22346 = OpShiftRightLogical %v4uint %16738 %341\n       %6602 = OpBitwiseAnd %v4uint %22346 %2950\n      %24075 = OpShiftLeftLogical %v4uint %6602 %749\n      %17625 = OpBitwiseOr %v4uint %16458 %24075\n       %7115 = OpShiftLeftLogical %v4uint %17625 %2950\n      %16012 = OpBitwiseOr %v4uint %17625 %7115\n      %23697 = OpShiftLeftLogical %v4uint %16012 %3004\n      %17039 = OpBitwiseOr %v4uint %16012 %23697\n      %21870 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %14994\n               OpStore %21870 %17039\n       %8536 = OpIAdd %uint %13296 %uint_16\n       %6741 = OpShiftRightLogical %uint %8536 %int_4\n      %16739 = OpVectorShuffle %v4uint %16844 %200 1 1 3 3\n       %9026 = OpShiftRightLogical %v4uint %16739 %287\n       %7913 = OpBitwiseAnd %v4uint %9026 %2950\n      %24652 = OpShiftLeftLogical %v4uint %7913 %101\n      %22596 = OpShiftRightLogical %v4uint %16739 %503\n      %21618 = OpBitwiseAnd %v4uint %22596 %2950\n      %24058 = OpShiftLeftLogical %v4uint %21618 %965\n      %18030 = OpBitwiseOr %v4uint %24652 %24058\n      %23176 = OpShiftRightLogical %v4uint %16739 %233\n       %6603 = OpBitwiseAnd %v4uint %23176 %2950\n      %24059 = OpShiftLeftLogical %v4uint %6603 %317\n      %18031 = OpBitwiseOr %v4uint %18030 %24059\n      %23177 = OpShiftRightLogical %v4uint %16739 %449\n       %6604 = OpBitwiseAnd %v4uint %23177 %2950\n      %24060 = OpShiftLeftLogical %v4uint %6604 %1181\n      %18032 = OpBitwiseOr %v4uint %18031 %24060\n      %23178 = OpShiftRightLogical %v4uint %16739 %179\n       %6605 = OpBitwiseAnd %v4uint %23178 %2950\n      %24061 = OpShiftLeftLogical %v4uint %6605 %533\n      %18033 = OpBitwiseOr %v4uint %18032 %24061\n      %23179 = OpShiftRightLogical %v4uint %16739 %395\n       %6606 = OpBitwiseAnd %v4uint %23179 %2950\n      %24062 = OpShiftLeftLogical %v4uint %6606 %1397\n      %18034 = OpBitwiseOr %v4uint %18033 %24062\n      %23180 = OpShiftRightLogical %v4uint %16739 %125\n       %6352 = OpBitwiseAnd %v4uint %23180 %2950\n      %16459 = OpBitwiseOr %v4uint %18034 %6352\n      %22347 = OpShiftRightLogical %v4uint %16739 %341\n       %6607 = OpBitwiseAnd %v4uint %22347 %2950\n      %24076 = OpShiftLeftLogical %v4uint %6607 %749\n      %17626 = OpBitwiseOr %v4uint %16459 %24076\n       %7116 = OpShiftLeftLogical %v4uint %17626 %2950\n      %16013 = OpBitwiseOr %v4uint %17626 %7116\n      %23698 = OpShiftLeftLogical %v4uint %16013 %3004\n      %17040 = OpBitwiseOr %v4uint %16013 %23698\n      %21871 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %6741\n               OpStore %21871 %17040\n      %14841 = OpIAdd %uint %12832 %int_3\n      %11788 = OpULessThan %bool %14841 %6594\n               OpSelectionMerge %18045 DontFlatten\n               OpBranchConditional %11788 %20682 %18045\n      %20682 = OpLabel\n      %13813 = OpIAdd %uint %13296 %22412\n      %10289 = OpCompositeExtract %uint %10924 1\n      %10053 = OpCompositeExtract %uint %10924 3\n       %7642 = OpCompositeExtract %uint %16844 1\n       %9981 = OpCompositeExtract %uint %16844 3\n      %17523 = OpCompositeConstruct %v4uint %10289 %10053 %7642 %9981\n       %9607 = OpShiftRightLogical %v4uint %17523 %749\n       %9480 = OpShiftRightLogical %uint %13813 %int_4\n      %24767 = OpVectorShuffle %v4uint %9607 %200 0 0 1 1\n       %9027 = OpShiftRightLogical %v4uint %24767 %287\n       %7914 = OpBitwiseAnd %v4uint %9027 %2950\n      %24653 = OpShiftLeftLogical %v4uint %7914 %101\n      %22597 = OpShiftRightLogical %v4uint %24767 %503\n      %21619 = OpBitwiseAnd %v4uint %22597 %2950\n      %24063 = OpShiftLeftLogical %v4uint %21619 %965\n      %18035 = OpBitwiseOr %v4uint %24653 %24063\n      %23181 = OpShiftRightLogical %v4uint %24767 %233\n       %6608 = OpBitwiseAnd %v4uint %23181 %2950\n      %24064 = OpShiftLeftLogical %v4uint %6608 %317\n      %18036 = OpBitwiseOr %v4uint %18035 %24064\n      %23182 = OpShiftRightLogical %v4uint %24767 %449\n       %6609 = OpBitwiseAnd %v4uint %23182 %2950\n      %24065 = OpShiftLeftLogical %v4uint %6609 %1181\n      %18037 = OpBitwiseOr %v4uint %18036 %24065\n      %23183 = OpShiftRightLogical %v4uint %24767 %179\n       %6610 = OpBitwiseAnd %v4uint %23183 %2950\n      %24066 = OpShiftLeftLogical %v4uint %6610 %533\n      %18038 = OpBitwiseOr %v4uint %18037 %24066\n      %23184 = OpShiftRightLogical %v4uint %24767 %395\n       %6611 = OpBitwiseAnd %v4uint %23184 %2950\n      %24067 = OpShiftLeftLogical %v4uint %6611 %1397\n      %18039 = OpBitwiseOr %v4uint %18038 %24067\n      %23185 = OpShiftRightLogical %v4uint %24767 %125\n       %6353 = OpBitwiseAnd %v4uint %23185 %2950\n      %16460 = OpBitwiseOr %v4uint %18039 %6353\n      %22348 = OpShiftRightLogical %v4uint %24767 %341\n       %6612 = OpBitwiseAnd %v4uint %22348 %2950\n      %24077 = OpShiftLeftLogical %v4uint %6612 %749\n      %17627 = OpBitwiseOr %v4uint %16460 %24077\n       %7117 = OpShiftLeftLogical %v4uint %17627 %2950\n      %16014 = OpBitwiseOr %v4uint %17627 %7117\n      %23699 = OpShiftLeftLogical %v4uint %16014 %3004\n      %17041 = OpBitwiseOr %v4uint %16014 %23699\n      %21872 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %9480\n               OpStore %21872 %17041\n       %8537 = OpIAdd %uint %13813 %uint_16\n       %6742 = OpShiftRightLogical %uint %8537 %int_4\n      %16740 = OpVectorShuffle %v4uint %9607 %200 2 2 3 3\n       %9028 = OpShiftRightLogical %v4uint %16740 %287\n       %7915 = OpBitwiseAnd %v4uint %9028 %2950\n      %24654 = OpShiftLeftLogical %v4uint %7915 %101\n      %22598 = OpShiftRightLogical %v4uint %16740 %503\n      %21620 = OpBitwiseAnd %v4uint %22598 %2950\n      %24068 = OpShiftLeftLogical %v4uint %21620 %965\n      %18040 = OpBitwiseOr %v4uint %24654 %24068\n      %23186 = OpShiftRightLogical %v4uint %16740 %233\n       %6613 = OpBitwiseAnd %v4uint %23186 %2950\n      %24069 = OpShiftLeftLogical %v4uint %6613 %317\n      %18041 = OpBitwiseOr %v4uint %18040 %24069\n      %23187 = OpShiftRightLogical %v4uint %16740 %449\n       %6614 = OpBitwiseAnd %v4uint %23187 %2950\n      %24070 = OpShiftLeftLogical %v4uint %6614 %1181\n      %18042 = OpBitwiseOr %v4uint %18041 %24070\n      %23188 = OpShiftRightLogical %v4uint %16740 %179\n       %6615 = OpBitwiseAnd %v4uint %23188 %2950\n      %24078 = OpShiftLeftLogical %v4uint %6615 %533\n      %18043 = OpBitwiseOr %v4uint %18042 %24078\n      %23189 = OpShiftRightLogical %v4uint %16740 %395\n       %6616 = OpBitwiseAnd %v4uint %23189 %2950\n      %24079 = OpShiftLeftLogical %v4uint %6616 %1397\n      %18044 = OpBitwiseOr %v4uint %18043 %24079\n      %23190 = OpShiftRightLogical %v4uint %16740 %125\n       %6354 = OpBitwiseAnd %v4uint %23190 %2950\n      %16461 = OpBitwiseOr %v4uint %18044 %6354\n      %22349 = OpShiftRightLogical %v4uint %16740 %341\n       %6617 = OpBitwiseAnd %v4uint %22349 %2950\n      %24080 = OpShiftLeftLogical %v4uint %6617 %749\n      %17628 = OpBitwiseOr %v4uint %16461 %24080\n       %7118 = OpShiftLeftLogical %v4uint %17628 %2950\n      %16015 = OpBitwiseOr %v4uint %17628 %7118\n      %23700 = OpShiftLeftLogical %v4uint %16015 %3004\n      %17042 = OpBitwiseOr %v4uint %16015 %23700\n      %24166 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %6742\n               OpStore %24166 %17042\n               OpBranch %18045\n      %18045 = OpLabel\n               OpBranch %7206\n       %7206 = OpLabel\n               OpBranch %7207\n       %7207 = OpLabel\n               OpBranch %14903\n      %14903 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_dxt3aas1111_argb4_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006245, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000017,\n    0x0000000B, 0x00000004, 0x00040015, 0x0000000C, 0x00000020, 0x00000001,\n    0x00040017, 0x00000012, 0x0000000C, 0x00000002, 0x00040017, 0x00000016,\n    0x0000000C, 0x00000003, 0x00020014, 0x00000009, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A13, 0x00000003,\n    0x0004002B, 0x0000000B, 0x00000A2B, 0x0000000B, 0x0007002C, 0x00000017,\n    0x0000011F, 0x00000A13, 0x00000A2B, 0x00000A13, 0x00000A2B, 0x0004002B,\n    0x0000000B, 0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B, 0x00000A16,\n    0x00000004, 0x0004002B, 0x0000000B, 0x00000A1F, 0x00000007, 0x0004002B,\n    0x0000000B, 0x00000A37, 0x0000000F, 0x0007002C, 0x00000017, 0x000001F7,\n    0x00000A1F, 0x00000A37, 0x00000A1F, 0x00000A37, 0x0004002B, 0x0000000B,\n    0x00000A46, 0x00000014, 0x0004002B, 0x0000000B, 0x00000A10, 0x00000002,\n    0x0004002B, 0x0000000B, 0x00000A28, 0x0000000A, 0x0007002C, 0x00000017,\n    0x000000E9, 0x00000A10, 0x00000A28, 0x00000A10, 0x00000A28, 0x0004002B,\n    0x0000000B, 0x00000A22, 0x00000008, 0x0004002B, 0x0000000B, 0x00000A1C,\n    0x00000006, 0x0004002B, 0x0000000B, 0x00000A34, 0x0000000E, 0x0007002C,\n    0x00000017, 0x000001C1, 0x00000A1C, 0x00000A34, 0x00000A1C, 0x00000A34,\n    0x0004002B, 0x0000000B, 0x00000A52, 0x00000018, 0x0004002B, 0x0000000B,\n    0x00000A25, 0x00000009, 0x0007002C, 0x00000017, 0x000000B3, 0x00000A0D,\n    0x00000A25, 0x00000A0D, 0x00000A25, 0x0004002B, 0x0000000B, 0x00000A2E,\n    0x0000000C, 0x0004002B, 0x0000000B, 0x00000A19, 0x00000005, 0x0004002B,\n    0x0000000B, 0x00000A31, 0x0000000D, 0x0007002C, 0x00000017, 0x0000018B,\n    0x00000A19, 0x00000A31, 0x00000A19, 0x00000A31, 0x0004002B, 0x0000000B,\n    0x00000A5E, 0x0000001C, 0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000,\n    0x0007002C, 0x00000017, 0x0000007D, 0x00000A0A, 0x00000A22, 0x00000A0A,\n    0x00000A22, 0x0007002C, 0x00000017, 0x00000155, 0x00000A16, 0x00000A2E,\n    0x00000A16, 0x00000A2E, 0x0004002B, 0x0000000B, 0x00000A3A, 0x00000010,\n    0x0004002B, 0x0000000B, 0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B,\n    0x000005FD, 0xFF00FF00, 0x0004002B, 0x0000000C, 0x00000A17, 0x00000004,\n    0x0004002B, 0x0000000C, 0x00000A1D, 0x00000006, 0x0004002B, 0x0000000C,\n    0x00000A2C, 0x0000000B, 0x0004002B, 0x0000000C, 0x00000A38, 0x0000000F,\n    0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C,\n    0x00000A1A, 0x00000005, 0x0004002B, 0x0000000C, 0x00000A20, 0x00000007,\n    0x0004002B, 0x0000000C, 0x00000A23, 0x00000008, 0x0004002B, 0x0000000C,\n    0x00000A2F, 0x0000000C, 0x0004002B, 0x0000000C, 0x00000A14, 0x00000003,\n    0x0004002B, 0x0000000C, 0x00000A11, 0x00000002, 0x0004002B, 0x0000000C,\n    0x00000A0B, 0x00000000, 0x000A001E, 0x00000489, 0x0000000B, 0x0000000B,\n    0x0000000B, 0x0000000B, 0x00000014, 0x0000000B, 0x0000000B, 0x0000000B,\n    0x00040020, 0x00000706, 0x00000009, 0x00000489, 0x0004003B, 0x00000706,\n    0x00000CE9, 0x00000009, 0x00040020, 0x00000288, 0x00000009, 0x0000000B,\n    0x00040020, 0x00000291, 0x00000009, 0x00000014, 0x00040020, 0x00000292,\n    0x00000001, 0x00000014, 0x0004003B, 0x00000292, 0x00000F48, 0x00000001,\n    0x0006002C, 0x00000014, 0x00000A24, 0x00000A10, 0x00000A0A, 0x00000A0A,\n    0x00040017, 0x0000000F, 0x00000009, 0x00000002, 0x0006002C, 0x00000014,\n    0x00000A3B, 0x00000A10, 0x00000A10, 0x00000A0A, 0x0003001D, 0x000007DC,\n    0x00000017, 0x0003001E, 0x000007B4, 0x000007DC, 0x00040020, 0x00000A32,\n    0x00000002, 0x000007B4, 0x0004003B, 0x00000A32, 0x0000107A, 0x00000002,\n    0x00040020, 0x00000294, 0x00000002, 0x00000017, 0x0003001D, 0x000007DD,\n    0x00000017, 0x0003001E, 0x000007B5, 0x000007DD, 0x00040020, 0x00000A33,\n    0x00000002, 0x000007B5, 0x0004003B, 0x00000A33, 0x0000140E, 0x00000002,\n    0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020, 0x0006002C, 0x00000014,\n    0x00000BC3, 0x00000A16, 0x00000A6A, 0x00000A0D, 0x0007002C, 0x00000017,\n    0x000009CE, 0x000008A6, 0x000008A6, 0x000008A6, 0x000008A6, 0x0007002C,\n    0x00000017, 0x0000013D, 0x00000A22, 0x00000A22, 0x00000A22, 0x00000A22,\n    0x0007002C, 0x00000017, 0x0000072E, 0x000005FD, 0x000005FD, 0x000005FD,\n    0x000005FD, 0x0007002C, 0x00000017, 0x000002ED, 0x00000A3A, 0x00000A3A,\n    0x00000A3A, 0x00000A3A, 0x0007002C, 0x00000017, 0x00000B86, 0x00000A0D,\n    0x00000A0D, 0x00000A0D, 0x00000A0D, 0x0007002C, 0x00000017, 0x00000065,\n    0x00000A16, 0x00000A16, 0x00000A16, 0x00000A16, 0x0007002C, 0x00000017,\n    0x000003C5, 0x00000A46, 0x00000A46, 0x00000A46, 0x00000A46, 0x0007002C,\n    0x00000017, 0x0000049D, 0x00000A52, 0x00000A52, 0x00000A52, 0x00000A52,\n    0x0007002C, 0x00000017, 0x00000215, 0x00000A2E, 0x00000A2E, 0x00000A2E,\n    0x00000A2E, 0x0007002C, 0x00000017, 0x00000575, 0x00000A5E, 0x00000A5E,\n    0x00000A5E, 0x00000A5E, 0x0007002C, 0x00000017, 0x00000BBC, 0x00000A10,\n    0x00000A10, 0x00000A10, 0x00000A10, 0x0003002E, 0x00000011, 0x000000C8,\n    0x00050036, 0x00000008, 0x0000161F, 0x00000000, 0x00000502, 0x000200F8,\n    0x00003B06, 0x000300F7, 0x00003A37, 0x00000000, 0x000300FB, 0x00000A0A,\n    0x00002E68, 0x000200F8, 0x00002E68, 0x00050041, 0x00000288, 0x000060D7,\n    0x00000CE9, 0x00000A0B, 0x0004003D, 0x0000000B, 0x00003526, 0x000060D7,\n    0x000500C7, 0x0000000B, 0x00005FDC, 0x00003526, 0x00000A0D, 0x000500AB,\n    0x00000009, 0x00004376, 0x00005FDC, 0x00000A0A, 0x000500C7, 0x0000000B,\n    0x00003028, 0x00003526, 0x00000A10, 0x000500AB, 0x00000009, 0x00004384,\n    0x00003028, 0x00000A0A, 0x000500C2, 0x0000000B, 0x00001EB0, 0x00003526,\n    0x00000A10, 0x000500C7, 0x0000000B, 0x000061E2, 0x00001EB0, 0x00000A13,\n    0x00050041, 0x00000288, 0x0000492C, 0x00000CE9, 0x00000A0E, 0x0004003D,\n    0x0000000B, 0x00005EAC, 0x0000492C, 0x00050041, 0x00000288, 0x00004EBA,\n    0x00000CE9, 0x00000A11, 0x0004003D, 0x0000000B, 0x00005788, 0x00004EBA,\n    0x00050041, 0x00000288, 0x00004EBB, 0x00000CE9, 0x00000A14, 0x0004003D,\n    0x0000000B, 0x00005789, 0x00004EBB, 0x00050041, 0x00000291, 0x00004EBC,\n    0x00000CE9, 0x00000A17, 0x0004003D, 0x00000014, 0x0000578A, 0x00004EBC,\n    0x00050041, 0x00000288, 0x00004EBD, 0x00000CE9, 0x00000A1A, 0x0004003D,\n    0x0000000B, 0x0000578B, 0x00004EBD, 0x00050041, 0x00000288, 0x00004EBE,\n    0x00000CE9, 0x00000A1D, 0x0004003D, 0x0000000B, 0x0000578C, 0x00004EBE,\n    0x00050041, 0x00000288, 0x00004E6E, 0x00000CE9, 0x00000A20, 0x0004003D,\n    0x0000000B, 0x000019C2, 0x00004E6E, 0x0004003D, 0x00000014, 0x00002A0E,\n    0x00000F48, 0x000500C4, 0x00000014, 0x0000538B, 0x00002A0E, 0x00000A24,\n    0x0007004F, 0x00000011, 0x000042F0, 0x0000538B, 0x0000538B, 0x00000000,\n    0x00000001, 0x0007004F, 0x00000011, 0x0000242F, 0x0000578A, 0x0000578A,\n    0x00000000, 0x00000001, 0x000500AE, 0x0000000F, 0x00004288, 0x000042F0,\n    0x0000242F, 0x0004009A, 0x00000009, 0x00006067, 0x00004288, 0x000300F7,\n    0x000036C2, 0x00000002, 0x000400FA, 0x00006067, 0x000055E8, 0x000036C2,\n    0x000200F8, 0x000055E8, 0x000200F9, 0x00003A37, 0x000200F8, 0x000036C2,\n    0x000500C4, 0x00000014, 0x000043C0, 0x0000538B, 0x00000A3B, 0x0004007C,\n    0x00000016, 0x00003C81, 0x000043C0, 0x00050051, 0x0000000C, 0x000047A0,\n    0x00003C81, 0x00000000, 0x00050084, 0x0000000C, 0x00002492, 0x000047A0,\n    0x00000A11, 0x00050051, 0x0000000C, 0x000018DA, 0x00003C81, 0x00000002,\n    0x0004007C, 0x0000000C, 0x000038A9, 0x000019C2, 0x00050084, 0x0000000C,\n    0x00002C0F, 0x000018DA, 0x000038A9, 0x00050051, 0x0000000C, 0x000044BE,\n    0x00003C81, 0x00000001, 0x00050080, 0x0000000C, 0x000056D4, 0x00002C0F,\n    0x000044BE, 0x0004007C, 0x0000000C, 0x00005785, 0x0000578C, 0x00050084,\n    0x0000000C, 0x00005FD7, 0x000056D4, 0x00005785, 0x00050080, 0x0000000C,\n    0x00002042, 0x00002492, 0x00005FD7, 0x0004007C, 0x0000000B, 0x000028A4,\n    0x00002042, 0x00050080, 0x0000000B, 0x000038F6, 0x0000578B, 0x000028A4,\n    0x000400A8, 0x00000009, 0x00003014, 0x00004376, 0x000300F7, 0x00004A60,\n    0x00000002, 0x000400FA, 0x00003014, 0x0000260D, 0x0000426F, 0x000200F8,\n    0x0000260D, 0x00050051, 0x0000000B, 0x00004437, 0x0000538B, 0x00000000,\n    0x00050051, 0x0000000B, 0x00002BEE, 0x0000538B, 0x00000001, 0x00050051,\n    0x0000000B, 0x00004971, 0x0000538B, 0x00000002, 0x00050084, 0x0000000B,\n    0x000039EF, 0x00005789, 0x00004971, 0x00050080, 0x0000000B, 0x00004F62,\n    0x00002BEE, 0x000039EF, 0x00050084, 0x0000000B, 0x000054AC, 0x00005788,\n    0x00004F62, 0x00050080, 0x0000000B, 0x00004FAE, 0x00004437, 0x000054AC,\n    0x000500C4, 0x0000000B, 0x00002C67, 0x00004FAE, 0x00000A13, 0x000200F9,\n    0x00004A60, 0x000200F8, 0x0000426F, 0x000300F7, 0x00005BF0, 0x00000002,\n    0x000400FA, 0x00004384, 0x00005BE0, 0x00005F21, 0x000200F8, 0x00005BE0,\n    0x0004007C, 0x00000016, 0x0000277F, 0x0000538B, 0x000500C2, 0x0000000B,\n    0x00004C14, 0x00005788, 0x00000A1A, 0x000500C2, 0x0000000B, 0x0000497A,\n    0x00005789, 0x00000A17, 0x00050051, 0x0000000C, 0x00001A7E, 0x0000277F,\n    0x00000002, 0x000500C3, 0x0000000C, 0x00002F39, 0x00001A7E, 0x00000A11,\n    0x0004007C, 0x0000000C, 0x00005780, 0x0000497A, 0x00050084, 0x0000000C,\n    0x00001F02, 0x00002F39, 0x00005780, 0x00050051, 0x0000000C, 0x00006242,\n    0x0000277F, 0x00000001, 0x000500C3, 0x0000000C, 0x00004A6F, 0x00006242,\n    0x00000A17, 0x00050080, 0x0000000C, 0x00002B2C, 0x00001F02, 0x00004A6F,\n    0x0004007C, 0x0000000C, 0x00004202, 0x00004C14, 0x00050084, 0x0000000C,\n    0x00003A60, 0x00002B2C, 0x00004202, 0x00050051, 0x0000000C, 0x00006243,\n    0x0000277F, 0x00000000, 0x000500C3, 0x0000000C, 0x00004FC7, 0x00006243,\n    0x00000A1A, 0x00050080, 0x0000000C, 0x000049FC, 0x00003A60, 0x00004FC7,\n    0x000500C4, 0x0000000C, 0x0000225D, 0x000049FC, 0x00000A20, 0x000500C7,\n    0x0000000C, 0x00002CAA, 0x00001A7E, 0x00000A14, 0x000500C4, 0x0000000C,\n    0x00004CAE, 0x00002CAA, 0x00000A1A, 0x000500C3, 0x0000000C, 0x0000383E,\n    0x00006242, 0x00000A0E, 0x000500C7, 0x0000000C, 0x00005374, 0x0000383E,\n    0x00000A14, 0x000500C4, 0x0000000C, 0x000054CA, 0x00005374, 0x00000A14,\n    0x000500C5, 0x0000000C, 0x000042CE, 0x00004CAE, 0x000054CA, 0x000500C7,\n    0x0000000C, 0x000050D5, 0x00006243, 0x00000A20, 0x000500C5, 0x0000000C,\n    0x00003ADD, 0x000042CE, 0x000050D5, 0x000500C5, 0x0000000C, 0x000043B6,\n    0x0000225D, 0x00003ADD, 0x000500C4, 0x0000000C, 0x00005E50, 0x000043B6,\n    0x00000A13, 0x000500C3, 0x0000000C, 0x000032D7, 0x00006242, 0x00000A14,\n    0x000500C6, 0x0000000C, 0x000026C9, 0x000032D7, 0x00002F39, 0x000500C7,\n    0x0000000C, 0x00004199, 0x000026C9, 0x00000A0E, 0x000500C3, 0x0000000C,\n    0x00002590, 0x00006243, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000505E,\n    0x00002590, 0x00000A14, 0x000500C4, 0x0000000C, 0x0000541D, 0x00004199,\n    0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BA, 0x0000505E, 0x0000541D,\n    0x000500C7, 0x0000000C, 0x00005076, 0x00006242, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x00005228, 0x00005076, 0x00000A17, 0x000500C4, 0x0000000C,\n    0x00001997, 0x000022BA, 0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FE,\n    0x00005228, 0x00001997, 0x000500C4, 0x0000000C, 0x00001C00, 0x00004199,\n    0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C82, 0x000047FE, 0x00001C00,\n    0x000500C7, 0x0000000C, 0x000050AF, 0x00005E50, 0x00000A38, 0x000500C5,\n    0x0000000C, 0x00003C70, 0x00003C82, 0x000050AF, 0x000500C3, 0x0000000C,\n    0x00003745, 0x00005E50, 0x00000A17, 0x000500C7, 0x0000000C, 0x000018B8,\n    0x00003745, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000547E, 0x000018B8,\n    0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A8, 0x00003C70, 0x0000547E,\n    0x000500C3, 0x0000000C, 0x00003A6E, 0x00005E50, 0x00000A1A, 0x000500C7,\n    0x0000000C, 0x000018B9, 0x00003A6E, 0x00000A20, 0x000500C4, 0x0000000C,\n    0x0000547F, 0x000018B9, 0x00000A23, 0x000500C5, 0x0000000C, 0x0000456F,\n    0x000045A8, 0x0000547F, 0x000500C3, 0x0000000C, 0x00003C88, 0x00005E50,\n    0x00000A23, 0x000500C4, 0x0000000C, 0x00002824, 0x00003C88, 0x00000A2F,\n    0x000500C5, 0x0000000C, 0x00003B79, 0x0000456F, 0x00002824, 0x0004007C,\n    0x0000000B, 0x000041E5, 0x00003B79, 0x000200F9, 0x00005BF0, 0x000200F8,\n    0x00005F21, 0x0004007C, 0x00000012, 0x000059D8, 0x000042F0, 0x000500C2,\n    0x0000000B, 0x00005668, 0x00005788, 0x00000A1A, 0x00050051, 0x0000000C,\n    0x00003905, 0x000059D8, 0x00000001, 0x000500C3, 0x0000000C, 0x00002F3A,\n    0x00003905, 0x00000A1A, 0x0004007C, 0x0000000C, 0x00005781, 0x00005668,\n    0x00050084, 0x0000000C, 0x00001F03, 0x00002F3A, 0x00005781, 0x00050051,\n    0x0000000C, 0x00006244, 0x000059D8, 0x00000000, 0x000500C3, 0x0000000C,\n    0x00004FC8, 0x00006244, 0x00000A1A, 0x00050080, 0x0000000C, 0x000049B0,\n    0x00001F03, 0x00004FC8, 0x000500C4, 0x0000000C, 0x0000254A, 0x000049B0,\n    0x00000A1D, 0x000500C3, 0x0000000C, 0x0000603B, 0x00003905, 0x00000A0E,\n    0x000500C7, 0x0000000C, 0x0000539A, 0x0000603B, 0x00000A20, 0x000500C4,\n    0x0000000C, 0x0000534A, 0x0000539A, 0x00000A14, 0x000500C7, 0x0000000C,\n    0x00004EA5, 0x00006244, 0x00000A20, 0x000500C5, 0x0000000C, 0x00002B1A,\n    0x0000534A, 0x00004EA5, 0x000500C5, 0x0000000C, 0x000043B7, 0x0000254A,\n    0x00002B1A, 0x000500C4, 0x0000000C, 0x00005E63, 0x000043B7, 0x00000A13,\n    0x000500C3, 0x0000000C, 0x000031DE, 0x00003905, 0x00000A17, 0x000500C7,\n    0x0000000C, 0x00005447, 0x000031DE, 0x00000A0E, 0x000500C3, 0x0000000C,\n    0x000028A6, 0x00006244, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000511E,\n    0x000028A6, 0x00000A14, 0x000500C3, 0x0000000C, 0x000028B9, 0x00003905,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x0000505F, 0x000028B9, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x0000541E, 0x0000505F, 0x00000A0E, 0x000500C6,\n    0x0000000C, 0x000022BB, 0x0000511E, 0x0000541E, 0x000500C7, 0x0000000C,\n    0x00005077, 0x00003905, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005229,\n    0x00005077, 0x00000A17, 0x000500C4, 0x0000000C, 0x00001998, 0x000022BB,\n    0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FF, 0x00005229, 0x00001998,\n    0x000500C4, 0x0000000C, 0x00001C01, 0x00005447, 0x00000A2C, 0x000500C5,\n    0x0000000C, 0x00003C83, 0x000047FF, 0x00001C01, 0x000500C7, 0x0000000C,\n    0x000050B0, 0x00005E63, 0x00000A38, 0x000500C5, 0x0000000C, 0x00003C71,\n    0x00003C83, 0x000050B0, 0x000500C3, 0x0000000C, 0x00003746, 0x00005E63,\n    0x00000A17, 0x000500C7, 0x0000000C, 0x000018BA, 0x00003746, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x00005480, 0x000018BA, 0x00000A1A, 0x000500C5,\n    0x0000000C, 0x000045A9, 0x00003C71, 0x00005480, 0x000500C3, 0x0000000C,\n    0x00003A6F, 0x00005E63, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018BB,\n    0x00003A6F, 0x00000A20, 0x000500C4, 0x0000000C, 0x00005481, 0x000018BB,\n    0x00000A23, 0x000500C5, 0x0000000C, 0x00004570, 0x000045A9, 0x00005481,\n    0x000500C3, 0x0000000C, 0x00003C89, 0x00005E63, 0x00000A23, 0x000500C4,\n    0x0000000C, 0x00002825, 0x00003C89, 0x00000A2F, 0x000500C5, 0x0000000C,\n    0x00003B7A, 0x00004570, 0x00002825, 0x0004007C, 0x0000000B, 0x000041E6,\n    0x00003B7A, 0x000200F9, 0x00005BF0, 0x000200F8, 0x00005BF0, 0x000700F5,\n    0x0000000B, 0x0000292C, 0x000041E5, 0x00005BE0, 0x000041E6, 0x00005F21,\n    0x000200F9, 0x00004A60, 0x000200F8, 0x00004A60, 0x000700F5, 0x0000000B,\n    0x00002C70, 0x00002C67, 0x0000260D, 0x0000292C, 0x00005BF0, 0x00050080,\n    0x0000000B, 0x000048BD, 0x00002C70, 0x00005EAC, 0x000500C2, 0x0000000B,\n    0x00003D52, 0x000048BD, 0x00000A17, 0x00060041, 0x00000294, 0x00004FAF,\n    0x0000107A, 0x00000A0B, 0x00003D52, 0x0004003D, 0x00000017, 0x00001CAA,\n    0x00004FAF, 0x000500AA, 0x00000009, 0x000035C0, 0x000061E2, 0x00000A0D,\n    0x000500AA, 0x00000009, 0x00005376, 0x000061E2, 0x00000A10, 0x000500A6,\n    0x00000009, 0x00005686, 0x000035C0, 0x00005376, 0x000300F7, 0x00003463,\n    0x00000000, 0x000400FA, 0x00005686, 0x00002957, 0x00003463, 0x000200F8,\n    0x00002957, 0x000500C7, 0x00000017, 0x0000475F, 0x00001CAA, 0x000009CE,\n    0x000500C4, 0x00000017, 0x000024D1, 0x0000475F, 0x0000013D, 0x000500C7,\n    0x00000017, 0x000050AC, 0x00001CAA, 0x0000072E, 0x000500C2, 0x00000017,\n    0x0000448D, 0x000050AC, 0x0000013D, 0x000500C5, 0x00000017, 0x00003FF8,\n    0x000024D1, 0x0000448D, 0x000200F9, 0x00003463, 0x000200F8, 0x00003463,\n    0x000700F5, 0x00000017, 0x00005879, 0x00001CAA, 0x00004A60, 0x00003FF8,\n    0x00002957, 0x000500AA, 0x00000009, 0x00004CB6, 0x000061E2, 0x00000A13,\n    0x000500A6, 0x00000009, 0x00003B23, 0x00005376, 0x00004CB6, 0x000300F7,\n    0x00003A1A, 0x00000000, 0x000400FA, 0x00003B23, 0x00002B38, 0x00003A1A,\n    0x000200F8, 0x00002B38, 0x000500C4, 0x00000017, 0x00005E17, 0x00005879,\n    0x000002ED, 0x000500C2, 0x00000017, 0x00003BE7, 0x00005879, 0x000002ED,\n    0x000500C5, 0x00000017, 0x000029E8, 0x00005E17, 0x00003BE7, 0x000200F9,\n    0x00003A1A, 0x000200F8, 0x00003A1A, 0x000700F5, 0x00000017, 0x00002AAC,\n    0x00005879, 0x00003463, 0x000029E8, 0x00002B38, 0x000300F7, 0x00006070,\n    0x00000002, 0x000400FA, 0x00004376, 0x000055E9, 0x00001C25, 0x000200F8,\n    0x000055E9, 0x000200F9, 0x00006070, 0x000200F8, 0x00001C25, 0x000200F9,\n    0x00006070, 0x000200F8, 0x00006070, 0x000700F5, 0x0000000B, 0x00002C71,\n    0x00000A6A, 0x000055E9, 0x00000A3A, 0x00001C25, 0x00050080, 0x0000000B,\n    0x000048BE, 0x000048BD, 0x00002C71, 0x000500C2, 0x0000000B, 0x00003D53,\n    0x000048BE, 0x00000A17, 0x00060041, 0x00000294, 0x00005566, 0x0000107A,\n    0x00000A0B, 0x00003D53, 0x0004003D, 0x00000017, 0x00003910, 0x00005566,\n    0x000300F7, 0x00003A1B, 0x00000000, 0x000400FA, 0x00005686, 0x00002958,\n    0x00003A1B, 0x000200F8, 0x00002958, 0x000500C7, 0x00000017, 0x00004760,\n    0x00003910, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D2, 0x00004760,\n    0x0000013D, 0x000500C7, 0x00000017, 0x000050AD, 0x00003910, 0x0000072E,\n    0x000500C2, 0x00000017, 0x0000448E, 0x000050AD, 0x0000013D, 0x000500C5,\n    0x00000017, 0x00003FF9, 0x000024D2, 0x0000448E, 0x000200F9, 0x00003A1B,\n    0x000200F8, 0x00003A1B, 0x000700F5, 0x00000017, 0x00002AAD, 0x00003910,\n    0x00006070, 0x00003FF9, 0x00002958, 0x000300F7, 0x0000362B, 0x00000000,\n    0x000400FA, 0x00003B23, 0x00002B39, 0x0000362B, 0x000200F8, 0x00002B39,\n    0x000500C4, 0x00000017, 0x00005E18, 0x00002AAD, 0x000002ED, 0x000500C2,\n    0x00000017, 0x00003BE8, 0x00002AAD, 0x000002ED, 0x000500C5, 0x00000017,\n    0x000029E9, 0x00005E18, 0x00003BE8, 0x000200F9, 0x0000362B, 0x000200F8,\n    0x0000362B, 0x000700F5, 0x00000017, 0x000041CC, 0x00002AAD, 0x00003A1B,\n    0x000029E9, 0x00002B39, 0x000500C2, 0x0000000B, 0x000021F1, 0x000038F6,\n    0x00000A17, 0x0009004F, 0x00000017, 0x00002C31, 0x00002AAC, 0x000000C8,\n    0x00000000, 0x00000000, 0x00000002, 0x00000002, 0x000500C2, 0x00000017,\n    0x0000233D, 0x00002C31, 0x0000011F, 0x000500C7, 0x00000017, 0x00001EE4,\n    0x0000233D, 0x00000B86, 0x000500C4, 0x00000017, 0x00006047, 0x00001EE4,\n    0x00000065, 0x000500C2, 0x00000017, 0x0000583F, 0x00002C31, 0x000001F7,\n    0x000500C7, 0x00000017, 0x0000546D, 0x0000583F, 0x00000B86, 0x000500C4,\n    0x00000017, 0x00005DE1, 0x0000546D, 0x000003C5, 0x000500C5, 0x00000017,\n    0x00004655, 0x00006047, 0x00005DE1, 0x000500C2, 0x00000017, 0x00005A6F,\n    0x00002C31, 0x000000E9, 0x000500C7, 0x00000017, 0x000019B1, 0x00005A6F,\n    0x00000B86, 0x000500C4, 0x00000017, 0x00005DE2, 0x000019B1, 0x0000013D,\n    0x000500C5, 0x00000017, 0x00004656, 0x00004655, 0x00005DE2, 0x000500C2,\n    0x00000017, 0x00005A70, 0x00002C31, 0x000001C1, 0x000500C7, 0x00000017,\n    0x000019B2, 0x00005A70, 0x00000B86, 0x000500C4, 0x00000017, 0x00005DE3,\n    0x000019B2, 0x0000049D, 0x000500C5, 0x00000017, 0x00004657, 0x00004656,\n    0x00005DE3, 0x000500C2, 0x00000017, 0x00005A71, 0x00002C31, 0x000000B3,\n    0x000500C7, 0x00000017, 0x000019B3, 0x00005A71, 0x00000B86, 0x000500C4,\n    0x00000017, 0x00005DE4, 0x000019B3, 0x00000215, 0x000500C5, 0x00000017,\n    0x00004658, 0x00004657, 0x00005DE4, 0x000500C2, 0x00000017, 0x00005A72,\n    0x00002C31, 0x0000018B, 0x000500C7, 0x00000017, 0x000019B4, 0x00005A72,\n    0x00000B86, 0x000500C4, 0x00000017, 0x00005DE5, 0x000019B4, 0x00000575,\n    0x000500C5, 0x00000017, 0x00004659, 0x00004658, 0x00005DE5, 0x000500C2,\n    0x00000017, 0x00005A82, 0x00002C31, 0x0000007D, 0x000500C7, 0x00000017,\n    0x000018CB, 0x00005A82, 0x00000B86, 0x000500C5, 0x00000017, 0x00004046,\n    0x00004659, 0x000018CB, 0x000500C2, 0x00000017, 0x00005746, 0x00002C31,\n    0x00000155, 0x000500C7, 0x00000017, 0x000019B5, 0x00005746, 0x00000B86,\n    0x000500C4, 0x00000017, 0x00005E07, 0x000019B5, 0x000002ED, 0x000500C5,\n    0x00000017, 0x000044D5, 0x00004046, 0x00005E07, 0x000500C4, 0x00000017,\n    0x00001BC7, 0x000044D5, 0x00000B86, 0x000500C5, 0x00000017, 0x00003E88,\n    0x000044D5, 0x00001BC7, 0x000500C4, 0x00000017, 0x00005C8D, 0x00003E88,\n    0x00000BBC, 0x000500C5, 0x00000017, 0x0000428B, 0x00003E88, 0x00005C8D,\n    0x00060041, 0x00000294, 0x0000556B, 0x0000140E, 0x00000A0B, 0x000021F1,\n    0x0003003E, 0x0000556B, 0x0000428B, 0x00050080, 0x0000000B, 0x00002156,\n    0x000038F6, 0x00000A3A, 0x000500C2, 0x0000000B, 0x00001A53, 0x00002156,\n    0x00000A17, 0x0009004F, 0x00000017, 0x00004160, 0x000041CC, 0x000000C8,\n    0x00000000, 0x00000000, 0x00000002, 0x00000002, 0x000500C2, 0x00000017,\n    0x0000233E, 0x00004160, 0x0000011F, 0x000500C7, 0x00000017, 0x00001EE5,\n    0x0000233E, 0x00000B86, 0x000500C4, 0x00000017, 0x00006048, 0x00001EE5,\n    0x00000065, 0x000500C2, 0x00000017, 0x00005840, 0x00004160, 0x000001F7,\n    0x000500C7, 0x00000017, 0x0000546E, 0x00005840, 0x00000B86, 0x000500C4,\n    0x00000017, 0x00005DE6, 0x0000546E, 0x000003C5, 0x000500C5, 0x00000017,\n    0x0000465A, 0x00006048, 0x00005DE6, 0x000500C2, 0x00000017, 0x00005A73,\n    0x00004160, 0x000000E9, 0x000500C7, 0x00000017, 0x000019B6, 0x00005A73,\n    0x00000B86, 0x000500C4, 0x00000017, 0x00005DE7, 0x000019B6, 0x0000013D,\n    0x000500C5, 0x00000017, 0x0000465B, 0x0000465A, 0x00005DE7, 0x000500C2,\n    0x00000017, 0x00005A74, 0x00004160, 0x000001C1, 0x000500C7, 0x00000017,\n    0x000019B7, 0x00005A74, 0x00000B86, 0x000500C4, 0x00000017, 0x00005DE8,\n    0x000019B7, 0x0000049D, 0x000500C5, 0x00000017, 0x0000465C, 0x0000465B,\n    0x00005DE8, 0x000500C2, 0x00000017, 0x00005A75, 0x00004160, 0x000000B3,\n    0x000500C7, 0x00000017, 0x000019B8, 0x00005A75, 0x00000B86, 0x000500C4,\n    0x00000017, 0x00005DE9, 0x000019B8, 0x00000215, 0x000500C5, 0x00000017,\n    0x0000465D, 0x0000465C, 0x00005DE9, 0x000500C2, 0x00000017, 0x00005A76,\n    0x00004160, 0x0000018B, 0x000500C7, 0x00000017, 0x000019B9, 0x00005A76,\n    0x00000B86, 0x000500C4, 0x00000017, 0x00005DEA, 0x000019B9, 0x00000575,\n    0x000500C5, 0x00000017, 0x0000465E, 0x0000465D, 0x00005DEA, 0x000500C2,\n    0x00000017, 0x00005A83, 0x00004160, 0x0000007D, 0x000500C7, 0x00000017,\n    0x000018CC, 0x00005A83, 0x00000B86, 0x000500C5, 0x00000017, 0x00004047,\n    0x0000465E, 0x000018CC, 0x000500C2, 0x00000017, 0x00005747, 0x00004160,\n    0x00000155, 0x000500C7, 0x00000017, 0x000019BA, 0x00005747, 0x00000B86,\n    0x000500C4, 0x00000017, 0x00005E08, 0x000019BA, 0x000002ED, 0x000500C5,\n    0x00000017, 0x000044D6, 0x00004047, 0x00005E08, 0x000500C4, 0x00000017,\n    0x00001BC8, 0x000044D6, 0x00000B86, 0x000500C5, 0x00000017, 0x00003E89,\n    0x000044D6, 0x00001BC8, 0x000500C4, 0x00000017, 0x00005C8E, 0x00003E89,\n    0x00000BBC, 0x000500C5, 0x00000017, 0x0000428C, 0x00003E89, 0x00005C8E,\n    0x00060041, 0x00000294, 0x000051EE, 0x0000140E, 0x00000A0B, 0x00001A53,\n    0x0003003E, 0x000051EE, 0x0000428C, 0x00050051, 0x0000000B, 0x00003220,\n    0x000043C0, 0x00000001, 0x00050080, 0x0000000B, 0x00005AC0, 0x00003220,\n    0x00000A0E, 0x000500B0, 0x00000009, 0x00004411, 0x00005AC0, 0x000019C2,\n    0x000300F7, 0x00001C27, 0x00000002, 0x000400FA, 0x00004411, 0x000050C9,\n    0x00001C27, 0x000200F8, 0x000050C9, 0x00050080, 0x0000000B, 0x000035F4,\n    0x000038F6, 0x0000578C, 0x00050051, 0x0000000B, 0x00002830, 0x00002AAC,\n    0x00000000, 0x00050051, 0x0000000B, 0x00002744, 0x00002AAC, 0x00000002,\n    0x00050051, 0x0000000B, 0x00001DD9, 0x000041CC, 0x00000000, 0x00050051,\n    0x0000000B, 0x000026FC, 0x000041CC, 0x00000002, 0x00070050, 0x00000017,\n    0x00004472, 0x00002830, 0x00002744, 0x00001DD9, 0x000026FC, 0x000500C2,\n    0x00000017, 0x00002586, 0x00004472, 0x000002ED, 0x000500C2, 0x0000000B,\n    0x00002507, 0x000035F4, 0x00000A17, 0x0009004F, 0x00000017, 0x000060BE,\n    0x00002586, 0x000000C8, 0x00000000, 0x00000000, 0x00000001, 0x00000001,\n    0x000500C2, 0x00000017, 0x0000233F, 0x000060BE, 0x0000011F, 0x000500C7,\n    0x00000017, 0x00001EE6, 0x0000233F, 0x00000B86, 0x000500C4, 0x00000017,\n    0x00006049, 0x00001EE6, 0x00000065, 0x000500C2, 0x00000017, 0x00005841,\n    0x000060BE, 0x000001F7, 0x000500C7, 0x00000017, 0x0000546F, 0x00005841,\n    0x00000B86, 0x000500C4, 0x00000017, 0x00005DEB, 0x0000546F, 0x000003C5,\n    0x000500C5, 0x00000017, 0x0000465F, 0x00006049, 0x00005DEB, 0x000500C2,\n    0x00000017, 0x00005A77, 0x000060BE, 0x000000E9, 0x000500C7, 0x00000017,\n    0x000019BB, 0x00005A77, 0x00000B86, 0x000500C4, 0x00000017, 0x00005DEC,\n    0x000019BB, 0x0000013D, 0x000500C5, 0x00000017, 0x00004660, 0x0000465F,\n    0x00005DEC, 0x000500C2, 0x00000017, 0x00005A78, 0x000060BE, 0x000001C1,\n    0x000500C7, 0x00000017, 0x000019BC, 0x00005A78, 0x00000B86, 0x000500C4,\n    0x00000017, 0x00005DED, 0x000019BC, 0x0000049D, 0x000500C5, 0x00000017,\n    0x00004661, 0x00004660, 0x00005DED, 0x000500C2, 0x00000017, 0x00005A79,\n    0x000060BE, 0x000000B3, 0x000500C7, 0x00000017, 0x000019BD, 0x00005A79,\n    0x00000B86, 0x000500C4, 0x00000017, 0x00005DEE, 0x000019BD, 0x00000215,\n    0x000500C5, 0x00000017, 0x00004662, 0x00004661, 0x00005DEE, 0x000500C2,\n    0x00000017, 0x00005A7A, 0x000060BE, 0x0000018B, 0x000500C7, 0x00000017,\n    0x000019BE, 0x00005A7A, 0x00000B86, 0x000500C4, 0x00000017, 0x00005DEF,\n    0x000019BE, 0x00000575, 0x000500C5, 0x00000017, 0x00004663, 0x00004662,\n    0x00005DEF, 0x000500C2, 0x00000017, 0x00005A84, 0x000060BE, 0x0000007D,\n    0x000500C7, 0x00000017, 0x000018CD, 0x00005A84, 0x00000B86, 0x000500C5,\n    0x00000017, 0x00004048, 0x00004663, 0x000018CD, 0x000500C2, 0x00000017,\n    0x00005748, 0x000060BE, 0x00000155, 0x000500C7, 0x00000017, 0x000019BF,\n    0x00005748, 0x00000B86, 0x000500C4, 0x00000017, 0x00005E09, 0x000019BF,\n    0x000002ED, 0x000500C5, 0x00000017, 0x000044D7, 0x00004048, 0x00005E09,\n    0x000500C4, 0x00000017, 0x00001BC9, 0x000044D7, 0x00000B86, 0x000500C5,\n    0x00000017, 0x00003E8A, 0x000044D7, 0x00001BC9, 0x000500C4, 0x00000017,\n    0x00005C8F, 0x00003E8A, 0x00000BBC, 0x000500C5, 0x00000017, 0x0000428D,\n    0x00003E8A, 0x00005C8F, 0x00060041, 0x00000294, 0x0000556C, 0x0000140E,\n    0x00000A0B, 0x00002507, 0x0003003E, 0x0000556C, 0x0000428D, 0x00050080,\n    0x0000000B, 0x00002157, 0x000035F4, 0x00000A3A, 0x000500C2, 0x0000000B,\n    0x00001A54, 0x00002157, 0x00000A17, 0x0009004F, 0x00000017, 0x00004161,\n    0x00002586, 0x000000C8, 0x00000002, 0x00000002, 0x00000003, 0x00000003,\n    0x000500C2, 0x00000017, 0x00002340, 0x00004161, 0x0000011F, 0x000500C7,\n    0x00000017, 0x00001EE7, 0x00002340, 0x00000B86, 0x000500C4, 0x00000017,\n    0x0000604A, 0x00001EE7, 0x00000065, 0x000500C2, 0x00000017, 0x00005842,\n    0x00004161, 0x000001F7, 0x000500C7, 0x00000017, 0x00005470, 0x00005842,\n    0x00000B86, 0x000500C4, 0x00000017, 0x00005DF0, 0x00005470, 0x000003C5,\n    0x000500C5, 0x00000017, 0x00004664, 0x0000604A, 0x00005DF0, 0x000500C2,\n    0x00000017, 0x00005A7B, 0x00004161, 0x000000E9, 0x000500C7, 0x00000017,\n    0x000019C0, 0x00005A7B, 0x00000B86, 0x000500C4, 0x00000017, 0x00005DF1,\n    0x000019C0, 0x0000013D, 0x000500C5, 0x00000017, 0x00004665, 0x00004664,\n    0x00005DF1, 0x000500C2, 0x00000017, 0x00005A7C, 0x00004161, 0x000001C1,\n    0x000500C7, 0x00000017, 0x000019C1, 0x00005A7C, 0x00000B86, 0x000500C4,\n    0x00000017, 0x00005DF2, 0x000019C1, 0x0000049D, 0x000500C5, 0x00000017,\n    0x00004666, 0x00004665, 0x00005DF2, 0x000500C2, 0x00000017, 0x00005A7D,\n    0x00004161, 0x000000B3, 0x000500C7, 0x00000017, 0x000019C3, 0x00005A7D,\n    0x00000B86, 0x000500C4, 0x00000017, 0x00005DF3, 0x000019C3, 0x00000215,\n    0x000500C5, 0x00000017, 0x00004667, 0x00004666, 0x00005DF3, 0x000500C2,\n    0x00000017, 0x00005A7E, 0x00004161, 0x0000018B, 0x000500C7, 0x00000017,\n    0x000019C4, 0x00005A7E, 0x00000B86, 0x000500C4, 0x00000017, 0x00005DF4,\n    0x000019C4, 0x00000575, 0x000500C5, 0x00000017, 0x00004668, 0x00004667,\n    0x00005DF4, 0x000500C2, 0x00000017, 0x00005A85, 0x00004161, 0x0000007D,\n    0x000500C7, 0x00000017, 0x000018CE, 0x00005A85, 0x00000B86, 0x000500C5,\n    0x00000017, 0x00004049, 0x00004668, 0x000018CE, 0x000500C2, 0x00000017,\n    0x00005749, 0x00004161, 0x00000155, 0x000500C7, 0x00000017, 0x000019C5,\n    0x00005749, 0x00000B86, 0x000500C4, 0x00000017, 0x00005E0A, 0x000019C5,\n    0x000002ED, 0x000500C5, 0x00000017, 0x000044D8, 0x00004049, 0x00005E0A,\n    0x000500C4, 0x00000017, 0x00001BCA, 0x000044D8, 0x00000B86, 0x000500C5,\n    0x00000017, 0x00003E8B, 0x000044D8, 0x00001BCA, 0x000500C4, 0x00000017,\n    0x00005C90, 0x00003E8B, 0x00000BBC, 0x000500C5, 0x00000017, 0x0000428E,\n    0x00003E8B, 0x00005C90, 0x00060041, 0x00000294, 0x0000556D, 0x0000140E,\n    0x00000A0B, 0x00001A54, 0x0003003E, 0x0000556D, 0x0000428E, 0x00050080,\n    0x0000000B, 0x000039F8, 0x00003220, 0x00000A11, 0x000500B0, 0x00000009,\n    0x00002E0B, 0x000039F8, 0x000019C2, 0x000300F7, 0x00001C26, 0x00000002,\n    0x000400FA, 0x00002E0B, 0x0000592C, 0x00001C26, 0x000200F8, 0x0000592C,\n    0x00050080, 0x0000000B, 0x000033F0, 0x000035F4, 0x0000578C, 0x000500C2,\n    0x0000000B, 0x00003A92, 0x000033F0, 0x00000A17, 0x0009004F, 0x00000017,\n    0x00004162, 0x00002AAC, 0x000000C8, 0x00000001, 0x00000001, 0x00000003,\n    0x00000003, 0x000500C2, 0x00000017, 0x00002341, 0x00004162, 0x0000011F,\n    0x000500C7, 0x00000017, 0x00001EE8, 0x00002341, 0x00000B86, 0x000500C4,\n    0x00000017, 0x0000604B, 0x00001EE8, 0x00000065, 0x000500C2, 0x00000017,\n    0x00005843, 0x00004162, 0x000001F7, 0x000500C7, 0x00000017, 0x00005471,\n    0x00005843, 0x00000B86, 0x000500C4, 0x00000017, 0x00005DF5, 0x00005471,\n    0x000003C5, 0x000500C5, 0x00000017, 0x00004669, 0x0000604B, 0x00005DF5,\n    0x000500C2, 0x00000017, 0x00005A7F, 0x00004162, 0x000000E9, 0x000500C7,\n    0x00000017, 0x000019C6, 0x00005A7F, 0x00000B86, 0x000500C4, 0x00000017,\n    0x00005DF6, 0x000019C6, 0x0000013D, 0x000500C5, 0x00000017, 0x0000466A,\n    0x00004669, 0x00005DF6, 0x000500C2, 0x00000017, 0x00005A80, 0x00004162,\n    0x000001C1, 0x000500C7, 0x00000017, 0x000019C7, 0x00005A80, 0x00000B86,\n    0x000500C4, 0x00000017, 0x00005DF7, 0x000019C7, 0x0000049D, 0x000500C5,\n    0x00000017, 0x0000466B, 0x0000466A, 0x00005DF7, 0x000500C2, 0x00000017,\n    0x00005A81, 0x00004162, 0x000000B3, 0x000500C7, 0x00000017, 0x000019C8,\n    0x00005A81, 0x00000B86, 0x000500C4, 0x00000017, 0x00005DF8, 0x000019C8,\n    0x00000215, 0x000500C5, 0x00000017, 0x0000466C, 0x0000466B, 0x00005DF8,\n    0x000500C2, 0x00000017, 0x00005A86, 0x00004162, 0x0000018B, 0x000500C7,\n    0x00000017, 0x000019C9, 0x00005A86, 0x00000B86, 0x000500C4, 0x00000017,\n    0x00005DF9, 0x000019C9, 0x00000575, 0x000500C5, 0x00000017, 0x0000466D,\n    0x0000466C, 0x00005DF9, 0x000500C2, 0x00000017, 0x00005A87, 0x00004162,\n    0x0000007D, 0x000500C7, 0x00000017, 0x000018CF, 0x00005A87, 0x00000B86,\n    0x000500C5, 0x00000017, 0x0000404A, 0x0000466D, 0x000018CF, 0x000500C2,\n    0x00000017, 0x0000574A, 0x00004162, 0x00000155, 0x000500C7, 0x00000017,\n    0x000019CA, 0x0000574A, 0x00000B86, 0x000500C4, 0x00000017, 0x00005E0B,\n    0x000019CA, 0x000002ED, 0x000500C5, 0x00000017, 0x000044D9, 0x0000404A,\n    0x00005E0B, 0x000500C4, 0x00000017, 0x00001BCB, 0x000044D9, 0x00000B86,\n    0x000500C5, 0x00000017, 0x00003E8C, 0x000044D9, 0x00001BCB, 0x000500C4,\n    0x00000017, 0x00005C91, 0x00003E8C, 0x00000BBC, 0x000500C5, 0x00000017,\n    0x0000428F, 0x00003E8C, 0x00005C91, 0x00060041, 0x00000294, 0x0000556E,\n    0x0000140E, 0x00000A0B, 0x00003A92, 0x0003003E, 0x0000556E, 0x0000428F,\n    0x00050080, 0x0000000B, 0x00002158, 0x000033F0, 0x00000A3A, 0x000500C2,\n    0x0000000B, 0x00001A55, 0x00002158, 0x00000A17, 0x0009004F, 0x00000017,\n    0x00004163, 0x000041CC, 0x000000C8, 0x00000001, 0x00000001, 0x00000003,\n    0x00000003, 0x000500C2, 0x00000017, 0x00002342, 0x00004163, 0x0000011F,\n    0x000500C7, 0x00000017, 0x00001EE9, 0x00002342, 0x00000B86, 0x000500C4,\n    0x00000017, 0x0000604C, 0x00001EE9, 0x00000065, 0x000500C2, 0x00000017,\n    0x00005844, 0x00004163, 0x000001F7, 0x000500C7, 0x00000017, 0x00005472,\n    0x00005844, 0x00000B86, 0x000500C4, 0x00000017, 0x00005DFA, 0x00005472,\n    0x000003C5, 0x000500C5, 0x00000017, 0x0000466E, 0x0000604C, 0x00005DFA,\n    0x000500C2, 0x00000017, 0x00005A88, 0x00004163, 0x000000E9, 0x000500C7,\n    0x00000017, 0x000019CB, 0x00005A88, 0x00000B86, 0x000500C4, 0x00000017,\n    0x00005DFB, 0x000019CB, 0x0000013D, 0x000500C5, 0x00000017, 0x0000466F,\n    0x0000466E, 0x00005DFB, 0x000500C2, 0x00000017, 0x00005A89, 0x00004163,\n    0x000001C1, 0x000500C7, 0x00000017, 0x000019CC, 0x00005A89, 0x00000B86,\n    0x000500C4, 0x00000017, 0x00005DFC, 0x000019CC, 0x0000049D, 0x000500C5,\n    0x00000017, 0x00004670, 0x0000466F, 0x00005DFC, 0x000500C2, 0x00000017,\n    0x00005A8A, 0x00004163, 0x000000B3, 0x000500C7, 0x00000017, 0x000019CD,\n    0x00005A8A, 0x00000B86, 0x000500C4, 0x00000017, 0x00005DFD, 0x000019CD,\n    0x00000215, 0x000500C5, 0x00000017, 0x00004671, 0x00004670, 0x00005DFD,\n    0x000500C2, 0x00000017, 0x00005A8B, 0x00004163, 0x0000018B, 0x000500C7,\n    0x00000017, 0x000019CE, 0x00005A8B, 0x00000B86, 0x000500C4, 0x00000017,\n    0x00005DFE, 0x000019CE, 0x00000575, 0x000500C5, 0x00000017, 0x00004672,\n    0x00004671, 0x00005DFE, 0x000500C2, 0x00000017, 0x00005A8C, 0x00004163,\n    0x0000007D, 0x000500C7, 0x00000017, 0x000018D0, 0x00005A8C, 0x00000B86,\n    0x000500C5, 0x00000017, 0x0000404B, 0x00004672, 0x000018D0, 0x000500C2,\n    0x00000017, 0x0000574B, 0x00004163, 0x00000155, 0x000500C7, 0x00000017,\n    0x000019CF, 0x0000574B, 0x00000B86, 0x000500C4, 0x00000017, 0x00005E0C,\n    0x000019CF, 0x000002ED, 0x000500C5, 0x00000017, 0x000044DA, 0x0000404B,\n    0x00005E0C, 0x000500C4, 0x00000017, 0x00001BCC, 0x000044DA, 0x00000B86,\n    0x000500C5, 0x00000017, 0x00003E8D, 0x000044DA, 0x00001BCC, 0x000500C4,\n    0x00000017, 0x00005C92, 0x00003E8D, 0x00000BBC, 0x000500C5, 0x00000017,\n    0x00004290, 0x00003E8D, 0x00005C92, 0x00060041, 0x00000294, 0x0000556F,\n    0x0000140E, 0x00000A0B, 0x00001A55, 0x0003003E, 0x0000556F, 0x00004290,\n    0x00050080, 0x0000000B, 0x000039F9, 0x00003220, 0x00000A14, 0x000500B0,\n    0x00000009, 0x00002E0C, 0x000039F9, 0x000019C2, 0x000300F7, 0x0000467D,\n    0x00000002, 0x000400FA, 0x00002E0C, 0x000050CA, 0x0000467D, 0x000200F8,\n    0x000050CA, 0x00050080, 0x0000000B, 0x000035F5, 0x000033F0, 0x0000578C,\n    0x00050051, 0x0000000B, 0x00002831, 0x00002AAC, 0x00000001, 0x00050051,\n    0x0000000B, 0x00002745, 0x00002AAC, 0x00000003, 0x00050051, 0x0000000B,\n    0x00001DDA, 0x000041CC, 0x00000001, 0x00050051, 0x0000000B, 0x000026FD,\n    0x000041CC, 0x00000003, 0x00070050, 0x00000017, 0x00004473, 0x00002831,\n    0x00002745, 0x00001DDA, 0x000026FD, 0x000500C2, 0x00000017, 0x00002587,\n    0x00004473, 0x000002ED, 0x000500C2, 0x0000000B, 0x00002508, 0x000035F5,\n    0x00000A17, 0x0009004F, 0x00000017, 0x000060BF, 0x00002587, 0x000000C8,\n    0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x000500C2, 0x00000017,\n    0x00002343, 0x000060BF, 0x0000011F, 0x000500C7, 0x00000017, 0x00001EEA,\n    0x00002343, 0x00000B86, 0x000500C4, 0x00000017, 0x0000604D, 0x00001EEA,\n    0x00000065, 0x000500C2, 0x00000017, 0x00005845, 0x000060BF, 0x000001F7,\n    0x000500C7, 0x00000017, 0x00005473, 0x00005845, 0x00000B86, 0x000500C4,\n    0x00000017, 0x00005DFF, 0x00005473, 0x000003C5, 0x000500C5, 0x00000017,\n    0x00004673, 0x0000604D, 0x00005DFF, 0x000500C2, 0x00000017, 0x00005A8D,\n    0x000060BF, 0x000000E9, 0x000500C7, 0x00000017, 0x000019D0, 0x00005A8D,\n    0x00000B86, 0x000500C4, 0x00000017, 0x00005E00, 0x000019D0, 0x0000013D,\n    0x000500C5, 0x00000017, 0x00004674, 0x00004673, 0x00005E00, 0x000500C2,\n    0x00000017, 0x00005A8E, 0x000060BF, 0x000001C1, 0x000500C7, 0x00000017,\n    0x000019D1, 0x00005A8E, 0x00000B86, 0x000500C4, 0x00000017, 0x00005E01,\n    0x000019D1, 0x0000049D, 0x000500C5, 0x00000017, 0x00004675, 0x00004674,\n    0x00005E01, 0x000500C2, 0x00000017, 0x00005A8F, 0x000060BF, 0x000000B3,\n    0x000500C7, 0x00000017, 0x000019D2, 0x00005A8F, 0x00000B86, 0x000500C4,\n    0x00000017, 0x00005E02, 0x000019D2, 0x00000215, 0x000500C5, 0x00000017,\n    0x00004676, 0x00004675, 0x00005E02, 0x000500C2, 0x00000017, 0x00005A90,\n    0x000060BF, 0x0000018B, 0x000500C7, 0x00000017, 0x000019D3, 0x00005A90,\n    0x00000B86, 0x000500C4, 0x00000017, 0x00005E03, 0x000019D3, 0x00000575,\n    0x000500C5, 0x00000017, 0x00004677, 0x00004676, 0x00005E03, 0x000500C2,\n    0x00000017, 0x00005A91, 0x000060BF, 0x0000007D, 0x000500C7, 0x00000017,\n    0x000018D1, 0x00005A91, 0x00000B86, 0x000500C5, 0x00000017, 0x0000404C,\n    0x00004677, 0x000018D1, 0x000500C2, 0x00000017, 0x0000574C, 0x000060BF,\n    0x00000155, 0x000500C7, 0x00000017, 0x000019D4, 0x0000574C, 0x00000B86,\n    0x000500C4, 0x00000017, 0x00005E0D, 0x000019D4, 0x000002ED, 0x000500C5,\n    0x00000017, 0x000044DB, 0x0000404C, 0x00005E0D, 0x000500C4, 0x00000017,\n    0x00001BCD, 0x000044DB, 0x00000B86, 0x000500C5, 0x00000017, 0x00003E8E,\n    0x000044DB, 0x00001BCD, 0x000500C4, 0x00000017, 0x00005C93, 0x00003E8E,\n    0x00000BBC, 0x000500C5, 0x00000017, 0x00004291, 0x00003E8E, 0x00005C93,\n    0x00060041, 0x00000294, 0x00005570, 0x0000140E, 0x00000A0B, 0x00002508,\n    0x0003003E, 0x00005570, 0x00004291, 0x00050080, 0x0000000B, 0x00002159,\n    0x000035F5, 0x00000A3A, 0x000500C2, 0x0000000B, 0x00001A56, 0x00002159,\n    0x00000A17, 0x0009004F, 0x00000017, 0x00004164, 0x00002587, 0x000000C8,\n    0x00000002, 0x00000002, 0x00000003, 0x00000003, 0x000500C2, 0x00000017,\n    0x00002344, 0x00004164, 0x0000011F, 0x000500C7, 0x00000017, 0x00001EEB,\n    0x00002344, 0x00000B86, 0x000500C4, 0x00000017, 0x0000604E, 0x00001EEB,\n    0x00000065, 0x000500C2, 0x00000017, 0x00005846, 0x00004164, 0x000001F7,\n    0x000500C7, 0x00000017, 0x00005474, 0x00005846, 0x00000B86, 0x000500C4,\n    0x00000017, 0x00005E04, 0x00005474, 0x000003C5, 0x000500C5, 0x00000017,\n    0x00004678, 0x0000604E, 0x00005E04, 0x000500C2, 0x00000017, 0x00005A92,\n    0x00004164, 0x000000E9, 0x000500C7, 0x00000017, 0x000019D5, 0x00005A92,\n    0x00000B86, 0x000500C4, 0x00000017, 0x00005E05, 0x000019D5, 0x0000013D,\n    0x000500C5, 0x00000017, 0x00004679, 0x00004678, 0x00005E05, 0x000500C2,\n    0x00000017, 0x00005A93, 0x00004164, 0x000001C1, 0x000500C7, 0x00000017,\n    0x000019D6, 0x00005A93, 0x00000B86, 0x000500C4, 0x00000017, 0x00005E06,\n    0x000019D6, 0x0000049D, 0x000500C5, 0x00000017, 0x0000467A, 0x00004679,\n    0x00005E06, 0x000500C2, 0x00000017, 0x00005A94, 0x00004164, 0x000000B3,\n    0x000500C7, 0x00000017, 0x000019D7, 0x00005A94, 0x00000B86, 0x000500C4,\n    0x00000017, 0x00005E0E, 0x000019D7, 0x00000215, 0x000500C5, 0x00000017,\n    0x0000467B, 0x0000467A, 0x00005E0E, 0x000500C2, 0x00000017, 0x00005A95,\n    0x00004164, 0x0000018B, 0x000500C7, 0x00000017, 0x000019D8, 0x00005A95,\n    0x00000B86, 0x000500C4, 0x00000017, 0x00005E0F, 0x000019D8, 0x00000575,\n    0x000500C5, 0x00000017, 0x0000467C, 0x0000467B, 0x00005E0F, 0x000500C2,\n    0x00000017, 0x00005A96, 0x00004164, 0x0000007D, 0x000500C7, 0x00000017,\n    0x000018D2, 0x00005A96, 0x00000B86, 0x000500C5, 0x00000017, 0x0000404D,\n    0x0000467C, 0x000018D2, 0x000500C2, 0x00000017, 0x0000574D, 0x00004164,\n    0x00000155, 0x000500C7, 0x00000017, 0x000019D9, 0x0000574D, 0x00000B86,\n    0x000500C4, 0x00000017, 0x00005E10, 0x000019D9, 0x000002ED, 0x000500C5,\n    0x00000017, 0x000044DC, 0x0000404D, 0x00005E10, 0x000500C4, 0x00000017,\n    0x00001BCE, 0x000044DC, 0x00000B86, 0x000500C5, 0x00000017, 0x00003E8F,\n    0x000044DC, 0x00001BCE, 0x000500C4, 0x00000017, 0x00005C94, 0x00003E8F,\n    0x00000BBC, 0x000500C5, 0x00000017, 0x00004292, 0x00003E8F, 0x00005C94,\n    0x00060041, 0x00000294, 0x00005E66, 0x0000140E, 0x00000A0B, 0x00001A56,\n    0x0003003E, 0x00005E66, 0x00004292, 0x000200F9, 0x0000467D, 0x000200F8,\n    0x0000467D, 0x000200F9, 0x00001C26, 0x000200F8, 0x00001C26, 0x000200F9,\n    0x00001C27, 0x000200F8, 0x00001C27, 0x000200F9, 0x00003A37, 0x000200F8,\n    0x00003A37, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_dxt3aas1111_bgra4_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25157\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n     %v4uint = OpTypeVector %uint 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v3uint = OpTypeVector %uint 3\n     %uint_3 = OpConstant %uint 3\n    %uint_11 = OpConstant %uint 11\n        %287 = OpConstantComposite %v4uint %uint_3 %uint_11 %uint_3 %uint_11\n     %uint_1 = OpConstant %uint 1\n     %uint_8 = OpConstant %uint 8\n     %uint_7 = OpConstant %uint 7\n    %uint_15 = OpConstant %uint 15\n        %503 = OpConstantComposite %v4uint %uint_7 %uint_15 %uint_7 %uint_15\n    %uint_24 = OpConstant %uint 24\n     %uint_2 = OpConstant %uint 2\n    %uint_10 = OpConstant %uint 10\n        %233 = OpConstantComposite %v4uint %uint_2 %uint_10 %uint_2 %uint_10\n     %uint_4 = OpConstant %uint 4\n     %uint_6 = OpConstant %uint 6\n    %uint_14 = OpConstant %uint 14\n        %449 = OpConstantComposite %v4uint %uint_6 %uint_14 %uint_6 %uint_14\n    %uint_20 = OpConstant %uint 20\n     %uint_9 = OpConstant %uint 9\n        %179 = OpConstantComposite %v4uint %uint_1 %uint_9 %uint_1 %uint_9\n     %uint_5 = OpConstant %uint 5\n    %uint_13 = OpConstant %uint 13\n        %395 = OpConstantComposite %v4uint %uint_5 %uint_13 %uint_5 %uint_13\n    %uint_16 = OpConstant %uint 16\n     %uint_0 = OpConstant %uint 0\n        %125 = OpConstantComposite %v4uint %uint_0 %uint_8 %uint_0 %uint_8\n    %uint_12 = OpConstant %uint 12\n        %341 = OpConstantComposite %v4uint %uint_4 %uint_12 %uint_4 %uint_12\n    %uint_28 = OpConstant %uint 28\n%uint_16711935 = OpConstant %uint 16711935\n%uint_4278255360 = OpConstant %uint 4278255360\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n      %int_3 = OpConstant %int 3\n      %int_2 = OpConstant %int 2\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %2596 = OpConstantComposite %v3uint %uint_2 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n       %2619 = OpConstantComposite %v3uint %uint_2 %uint_2 %uint_0\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n    %uint_32 = OpConstant %uint 32\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n       %2950 = OpConstantComposite %v4uint %uint_1 %uint_1 %uint_1 %uint_1\n       %1181 = OpConstantComposite %v4uint %uint_24 %uint_24 %uint_24 %uint_24\n        %101 = OpConstantComposite %v4uint %uint_4 %uint_4 %uint_4 %uint_4\n        %965 = OpConstantComposite %v4uint %uint_20 %uint_20 %uint_20 %uint_20\n        %533 = OpConstantComposite %v4uint %uint_12 %uint_12 %uint_12 %uint_12\n       %1397 = OpConstantComposite %v4uint %uint_28 %uint_28 %uint_28 %uint_28\n       %3004 = OpConstantComposite %v4uint %uint_2 %uint_2 %uint_2 %uint_2\n        %200 = OpConstantNull %v2uint\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %14903 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24540 = OpBitwiseAnd %uint %13606 %uint_1\n      %17270 = OpINotEqual %bool %24540 %uint_0\n      %12328 = OpBitwiseAnd %uint %13606 %uint_2\n      %17284 = OpINotEqual %bool %12328 %uint_0\n       %7856 = OpShiftRightLogical %uint %13606 %uint_2\n      %25058 = OpBitwiseAnd %uint %7856 %uint_3\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20158 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n      %22412 = OpLoad %uint %20158\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_7\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2596\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %14018 DontFlatten\n               OpBranchConditional %24679 %21992 %14018\n      %21992 = OpLabel\n               OpBranch %14903\n      %14018 = OpLabel\n      %17344 = OpShiftLeftLogical %v3uint %21387 %2619\n      %15489 = OpBitcast %v3int %17344\n      %18336 = OpCompositeExtract %int %15489 0\n       %9362 = OpIMul %int %18336 %int_2\n       %6362 = OpCompositeExtract %int %15489 2\n      %14505 = OpBitcast %int %6594\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %15489 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %22412\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %9362 %24535\n      %10404 = OpBitcast %uint %8258\n      %14582 = OpIAdd %uint %22411 %10404\n      %12308 = OpLogicalNot %bool %17270\n               OpSelectionMerge %19040 DontFlatten\n               OpBranchConditional %12308 %9741 %17007\n       %9741 = OpLabel\n      %17463 = OpCompositeExtract %uint %21387 0\n      %11246 = OpCompositeExtract %uint %21387 1\n      %18801 = OpCompositeExtract %uint %21387 2\n      %14831 = OpIMul %uint %22409 %18801\n      %20322 = OpIAdd %uint %11246 %14831\n      %21676 = OpIMul %uint %22408 %20322\n      %20398 = OpIAdd %uint %17463 %21676\n      %11367 = OpShiftLeftLogical %uint %20398 %uint_3\n               OpBranch %19040\n      %17007 = OpLabel\n               OpSelectionMerge %23536 DontFlatten\n               OpBranchConditional %17284 %23520 %24353\n      %23520 = OpLabel\n      %10111 = OpBitcast %v3int %21387\n      %19476 = OpShiftRightLogical %uint %22408 %int_5\n      %18810 = OpShiftRightLogical %uint %22409 %int_4\n       %6782 = OpCompositeExtract %int %10111 2\n      %12089 = OpShiftRightArithmetic %int %6782 %int_2\n      %22400 = OpBitcast %int %18810\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %10111 1\n      %19055 = OpShiftRightArithmetic %int %25154 %int_4\n      %11052 = OpIAdd %int %7938 %19055\n      %16898 = OpBitcast %int %19476\n      %14944 = OpIMul %int %11052 %16898\n      %25155 = OpCompositeExtract %int %10111 0\n      %20423 = OpShiftRightArithmetic %int %25155 %int_5\n      %18940 = OpIAdd %int %14944 %20423\n       %8797 = OpShiftLeftLogical %int %18940 %int_7\n      %11434 = OpBitwiseAnd %int %6782 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %25154 %int_1\n      %21364 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21364 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %25155 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17334 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17334 %uint_3\n      %13015 = OpShiftRightArithmetic %int %25154 %int_3\n       %9929 = OpBitwiseXor %int %13015 %12089\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %25155 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %25154 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6551\n       %7168 = OpShiftLeftLogical %int %16793 %int_11\n      %15490 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24144 %int_15\n      %15472 = OpBitwiseOr %int %15490 %20655\n      %14149 = OpShiftRightArithmetic %int %24144 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24144 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24144 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %23536\n      %24353 = OpLabel\n      %23000 = OpBitcast %v2int %17136\n      %22120 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %23000 1\n      %12090 = OpShiftRightArithmetic %int %14597 %int_5\n      %22401 = OpBitcast %int %22120\n       %7939 = OpIMul %int %12090 %22401\n      %25156 = OpCompositeExtract %int %23000 0\n      %20424 = OpShiftRightArithmetic %int %25156 %int_5\n      %18864 = OpIAdd %int %7939 %20424\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25156 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17335 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17335 %uint_3\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25156 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6552\n       %7169 = OpShiftLeftLogical %int %21575 %int_11\n      %15491 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24163 %int_15\n      %15473 = OpBitwiseOr %int %15491 %20656\n      %14150 = OpShiftRightArithmetic %int %24163 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24163 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %23536\n      %23536 = OpLabel\n      %10540 = OpPhi %uint %16869 %23520 %16870 %24353\n               OpBranch %19040\n      %19040 = OpLabel\n      %11376 = OpPhi %uint %11367 %9741 %10540 %23536\n      %18621 = OpIAdd %uint %11376 %24236\n      %15698 = OpShiftRightLogical %uint %18621 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15698\n       %7338 = OpLoad %v4uint %20399\n      %13760 = OpIEqual %bool %25058 %uint_1\n      %21366 = OpIEqual %bool %25058 %uint_2\n      %22150 = OpLogicalOr %bool %13760 %21366\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %7338 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %7338 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22649 = OpPhi %v4uint %7338 %19040 %16376 %10583\n      %19638 = OpIEqual %bool %25058 %uint_3\n      %15139 = OpLogicalOr %bool %21366 %19638\n               OpSelectionMerge %14874 None\n               OpBranchConditional %15139 %11064 %14874\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22649 %749\n      %15335 = OpShiftRightLogical %v4uint %22649 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %14874\n      %14874 = OpLabel\n      %10924 = OpPhi %v4uint %22649 %13411 %10728 %11064\n               OpSelectionMerge %24688 DontFlatten\n               OpBranchConditional %17270 %21993 %7205\n      %21993 = OpLabel\n               OpBranch %24688\n       %7205 = OpLabel\n               OpBranch %24688\n      %24688 = OpLabel\n      %11377 = OpPhi %uint %uint_32 %21993 %uint_16 %7205\n      %18622 = OpIAdd %uint %18621 %11377\n      %15699 = OpShiftRightLogical %uint %18622 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15699\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %14875 None\n               OpBranchConditional %22150 %10584 %14875\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %14875\n      %14875 = OpLabel\n      %10925 = OpPhi %v4uint %14608 %24688 %16377 %10584\n               OpSelectionMerge %13867 None\n               OpBranchConditional %15139 %11065 %13867\n      %11065 = OpLabel\n      %24088 = OpShiftLeftLogical %v4uint %10925 %749\n      %15336 = OpShiftRightLogical %v4uint %10925 %749\n      %10729 = OpBitwiseOr %v4uint %24088 %15336\n               OpBranch %13867\n      %13867 = OpLabel\n      %16844 = OpPhi %v4uint %10925 %14875 %10729 %11065\n       %8689 = OpShiftRightLogical %uint %14582 %int_4\n      %11313 = OpVectorShuffle %v4uint %10924 %200 0 0 2 2\n       %9021 = OpShiftRightLogical %v4uint %11313 %287\n       %7908 = OpBitwiseAnd %v4uint %9021 %2950\n      %24647 = OpShiftLeftLogical %v4uint %7908 %317\n      %22591 = OpShiftRightLogical %v4uint %11313 %503\n      %21613 = OpBitwiseAnd %v4uint %22591 %2950\n      %24033 = OpShiftLeftLogical %v4uint %21613 %1181\n      %18005 = OpBitwiseOr %v4uint %24647 %24033\n      %23151 = OpShiftRightLogical %v4uint %11313 %233\n       %6577 = OpBitwiseAnd %v4uint %23151 %2950\n      %24034 = OpShiftLeftLogical %v4uint %6577 %101\n      %18006 = OpBitwiseOr %v4uint %18005 %24034\n      %23152 = OpShiftRightLogical %v4uint %11313 %449\n       %6578 = OpBitwiseAnd %v4uint %23152 %2950\n      %24035 = OpShiftLeftLogical %v4uint %6578 %965\n      %18007 = OpBitwiseOr %v4uint %18006 %24035\n      %23170 = OpShiftRightLogical %v4uint %11313 %179\n       %6347 = OpBitwiseAnd %v4uint %23170 %2950\n      %16454 = OpBitwiseOr %v4uint %18007 %6347\n      %22342 = OpShiftRightLogical %v4uint %11313 %395\n       %6579 = OpBitwiseAnd %v4uint %22342 %2950\n      %24036 = OpShiftLeftLogical %v4uint %6579 %749\n      %18008 = OpBitwiseOr %v4uint %16454 %24036\n      %23153 = OpShiftRightLogical %v4uint %11313 %125\n       %6580 = OpBitwiseAnd %v4uint %23153 %2950\n      %24037 = OpShiftLeftLogical %v4uint %6580 %533\n      %18009 = OpBitwiseOr %v4uint %18008 %24037\n      %23154 = OpShiftRightLogical %v4uint %11313 %341\n       %6581 = OpBitwiseAnd %v4uint %23154 %2950\n      %24071 = OpShiftLeftLogical %v4uint %6581 %1397\n      %17621 = OpBitwiseOr %v4uint %18009 %24071\n       %7111 = OpShiftLeftLogical %v4uint %17621 %2950\n      %16008 = OpBitwiseOr %v4uint %17621 %7111\n      %23693 = OpShiftLeftLogical %v4uint %16008 %3004\n      %17035 = OpBitwiseOr %v4uint %16008 %23693\n      %21867 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %8689\n               OpStore %21867 %17035\n       %8534 = OpIAdd %uint %14582 %uint_16\n       %6739 = OpShiftRightLogical %uint %8534 %int_4\n      %16736 = OpVectorShuffle %v4uint %16844 %200 0 0 2 2\n       %9022 = OpShiftRightLogical %v4uint %16736 %287\n       %7909 = OpBitwiseAnd %v4uint %9022 %2950\n      %24648 = OpShiftLeftLogical %v4uint %7909 %317\n      %22592 = OpShiftRightLogical %v4uint %16736 %503\n      %21614 = OpBitwiseAnd %v4uint %22592 %2950\n      %24038 = OpShiftLeftLogical %v4uint %21614 %1181\n      %18010 = OpBitwiseOr %v4uint %24648 %24038\n      %23155 = OpShiftRightLogical %v4uint %16736 %233\n       %6582 = OpBitwiseAnd %v4uint %23155 %2950\n      %24039 = OpShiftLeftLogical %v4uint %6582 %101\n      %18011 = OpBitwiseOr %v4uint %18010 %24039\n      %23156 = OpShiftRightLogical %v4uint %16736 %449\n       %6583 = OpBitwiseAnd %v4uint %23156 %2950\n      %24040 = OpShiftLeftLogical %v4uint %6583 %965\n      %18012 = OpBitwiseOr %v4uint %18011 %24040\n      %23171 = OpShiftRightLogical %v4uint %16736 %179\n       %6348 = OpBitwiseAnd %v4uint %23171 %2950\n      %16455 = OpBitwiseOr %v4uint %18012 %6348\n      %22343 = OpShiftRightLogical %v4uint %16736 %395\n       %6584 = OpBitwiseAnd %v4uint %22343 %2950\n      %24041 = OpShiftLeftLogical %v4uint %6584 %749\n      %18013 = OpBitwiseOr %v4uint %16455 %24041\n      %23157 = OpShiftRightLogical %v4uint %16736 %125\n       %6585 = OpBitwiseAnd %v4uint %23157 %2950\n      %24042 = OpShiftLeftLogical %v4uint %6585 %533\n      %18014 = OpBitwiseOr %v4uint %18013 %24042\n      %23158 = OpShiftRightLogical %v4uint %16736 %341\n       %6586 = OpBitwiseAnd %v4uint %23158 %2950\n      %24072 = OpShiftLeftLogical %v4uint %6586 %1397\n      %17622 = OpBitwiseOr %v4uint %18014 %24072\n       %7112 = OpShiftLeftLogical %v4uint %17622 %2950\n      %16009 = OpBitwiseOr %v4uint %17622 %7112\n      %23694 = OpShiftLeftLogical %v4uint %16009 %3004\n      %17036 = OpBitwiseOr %v4uint %16009 %23694\n      %20974 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %6739\n               OpStore %20974 %17036\n      %12832 = OpCompositeExtract %uint %17344 1\n      %23232 = OpIAdd %uint %12832 %int_1\n      %17425 = OpULessThan %bool %23232 %6594\n               OpSelectionMerge %7207 DontFlatten\n               OpBranchConditional %17425 %20681 %7207\n      %20681 = OpLabel\n      %13812 = OpIAdd %uint %14582 %22412\n      %10288 = OpCompositeExtract %uint %10924 0\n      %10052 = OpCompositeExtract %uint %10924 2\n       %7641 = OpCompositeExtract %uint %16844 0\n       %9980 = OpCompositeExtract %uint %16844 2\n      %17522 = OpCompositeConstruct %v4uint %10288 %10052 %7641 %9980\n       %9606 = OpShiftRightLogical %v4uint %17522 %749\n       %9479 = OpShiftRightLogical %uint %13812 %int_4\n      %24766 = OpVectorShuffle %v4uint %9606 %200 0 0 1 1\n       %9023 = OpShiftRightLogical %v4uint %24766 %287\n       %7910 = OpBitwiseAnd %v4uint %9023 %2950\n      %24649 = OpShiftLeftLogical %v4uint %7910 %317\n      %22593 = OpShiftRightLogical %v4uint %24766 %503\n      %21615 = OpBitwiseAnd %v4uint %22593 %2950\n      %24043 = OpShiftLeftLogical %v4uint %21615 %1181\n      %18015 = OpBitwiseOr %v4uint %24649 %24043\n      %23159 = OpShiftRightLogical %v4uint %24766 %233\n       %6587 = OpBitwiseAnd %v4uint %23159 %2950\n      %24044 = OpShiftLeftLogical %v4uint %6587 %101\n      %18016 = OpBitwiseOr %v4uint %18015 %24044\n      %23160 = OpShiftRightLogical %v4uint %24766 %449\n       %6588 = OpBitwiseAnd %v4uint %23160 %2950\n      %24045 = OpShiftLeftLogical %v4uint %6588 %965\n      %18017 = OpBitwiseOr %v4uint %18016 %24045\n      %23172 = OpShiftRightLogical %v4uint %24766 %179\n       %6349 = OpBitwiseAnd %v4uint %23172 %2950\n      %16456 = OpBitwiseOr %v4uint %18017 %6349\n      %22344 = OpShiftRightLogical %v4uint %24766 %395\n       %6589 = OpBitwiseAnd %v4uint %22344 %2950\n      %24046 = OpShiftLeftLogical %v4uint %6589 %749\n      %18018 = OpBitwiseOr %v4uint %16456 %24046\n      %23161 = OpShiftRightLogical %v4uint %24766 %125\n       %6590 = OpBitwiseAnd %v4uint %23161 %2950\n      %24047 = OpShiftLeftLogical %v4uint %6590 %533\n      %18019 = OpBitwiseOr %v4uint %18018 %24047\n      %23162 = OpShiftRightLogical %v4uint %24766 %341\n       %6591 = OpBitwiseAnd %v4uint %23162 %2950\n      %24073 = OpShiftLeftLogical %v4uint %6591 %1397\n      %17623 = OpBitwiseOr %v4uint %18019 %24073\n       %7113 = OpShiftLeftLogical %v4uint %17623 %2950\n      %16010 = OpBitwiseOr %v4uint %17623 %7113\n      %23695 = OpShiftLeftLogical %v4uint %16010 %3004\n      %17037 = OpBitwiseOr %v4uint %16010 %23695\n      %21868 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %9479\n               OpStore %21868 %17037\n       %8535 = OpIAdd %uint %13812 %uint_16\n       %6740 = OpShiftRightLogical %uint %8535 %int_4\n      %16737 = OpVectorShuffle %v4uint %9606 %200 2 2 3 3\n       %9024 = OpShiftRightLogical %v4uint %16737 %287\n       %7911 = OpBitwiseAnd %v4uint %9024 %2950\n      %24650 = OpShiftLeftLogical %v4uint %7911 %317\n      %22594 = OpShiftRightLogical %v4uint %16737 %503\n      %21616 = OpBitwiseAnd %v4uint %22594 %2950\n      %24048 = OpShiftLeftLogical %v4uint %21616 %1181\n      %18020 = OpBitwiseOr %v4uint %24650 %24048\n      %23163 = OpShiftRightLogical %v4uint %16737 %233\n       %6592 = OpBitwiseAnd %v4uint %23163 %2950\n      %24049 = OpShiftLeftLogical %v4uint %6592 %101\n      %18021 = OpBitwiseOr %v4uint %18020 %24049\n      %23164 = OpShiftRightLogical %v4uint %16737 %449\n       %6593 = OpBitwiseAnd %v4uint %23164 %2950\n      %24050 = OpShiftLeftLogical %v4uint %6593 %965\n      %18022 = OpBitwiseOr %v4uint %18021 %24050\n      %23173 = OpShiftRightLogical %v4uint %16737 %179\n       %6350 = OpBitwiseAnd %v4uint %23173 %2950\n      %16457 = OpBitwiseOr %v4uint %18022 %6350\n      %22345 = OpShiftRightLogical %v4uint %16737 %395\n       %6595 = OpBitwiseAnd %v4uint %22345 %2950\n      %24051 = OpShiftLeftLogical %v4uint %6595 %749\n      %18023 = OpBitwiseOr %v4uint %16457 %24051\n      %23165 = OpShiftRightLogical %v4uint %16737 %125\n       %6596 = OpBitwiseAnd %v4uint %23165 %2950\n      %24052 = OpShiftLeftLogical %v4uint %6596 %533\n      %18024 = OpBitwiseOr %v4uint %18023 %24052\n      %23166 = OpShiftRightLogical %v4uint %16737 %341\n       %6597 = OpBitwiseAnd %v4uint %23166 %2950\n      %24074 = OpShiftLeftLogical %v4uint %6597 %1397\n      %17624 = OpBitwiseOr %v4uint %18024 %24074\n       %7114 = OpShiftLeftLogical %v4uint %17624 %2950\n      %16011 = OpBitwiseOr %v4uint %17624 %7114\n      %23696 = OpShiftLeftLogical %v4uint %16011 %3004\n      %17038 = OpBitwiseOr %v4uint %16011 %23696\n      %21869 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %6740\n               OpStore %21869 %17038\n      %14840 = OpIAdd %uint %12832 %int_2\n      %11787 = OpULessThan %bool %14840 %6594\n               OpSelectionMerge %7206 DontFlatten\n               OpBranchConditional %11787 %22828 %7206\n      %22828 = OpLabel\n      %13296 = OpIAdd %uint %13812 %22412\n      %14994 = OpShiftRightLogical %uint %13296 %int_4\n      %16738 = OpVectorShuffle %v4uint %10924 %200 1 1 3 3\n       %9025 = OpShiftRightLogical %v4uint %16738 %287\n       %7912 = OpBitwiseAnd %v4uint %9025 %2950\n      %24651 = OpShiftLeftLogical %v4uint %7912 %317\n      %22595 = OpShiftRightLogical %v4uint %16738 %503\n      %21617 = OpBitwiseAnd %v4uint %22595 %2950\n      %24053 = OpShiftLeftLogical %v4uint %21617 %1181\n      %18025 = OpBitwiseOr %v4uint %24651 %24053\n      %23167 = OpShiftRightLogical %v4uint %16738 %233\n       %6598 = OpBitwiseAnd %v4uint %23167 %2950\n      %24054 = OpShiftLeftLogical %v4uint %6598 %101\n      %18026 = OpBitwiseOr %v4uint %18025 %24054\n      %23168 = OpShiftRightLogical %v4uint %16738 %449\n       %6599 = OpBitwiseAnd %v4uint %23168 %2950\n      %24055 = OpShiftLeftLogical %v4uint %6599 %965\n      %18027 = OpBitwiseOr %v4uint %18026 %24055\n      %23174 = OpShiftRightLogical %v4uint %16738 %179\n       %6351 = OpBitwiseAnd %v4uint %23174 %2950\n      %16458 = OpBitwiseOr %v4uint %18027 %6351\n      %22346 = OpShiftRightLogical %v4uint %16738 %395\n       %6600 = OpBitwiseAnd %v4uint %22346 %2950\n      %24056 = OpShiftLeftLogical %v4uint %6600 %749\n      %18028 = OpBitwiseOr %v4uint %16458 %24056\n      %23169 = OpShiftRightLogical %v4uint %16738 %125\n       %6601 = OpBitwiseAnd %v4uint %23169 %2950\n      %24057 = OpShiftLeftLogical %v4uint %6601 %533\n      %18029 = OpBitwiseOr %v4uint %18028 %24057\n      %23175 = OpShiftRightLogical %v4uint %16738 %341\n       %6602 = OpBitwiseAnd %v4uint %23175 %2950\n      %24075 = OpShiftLeftLogical %v4uint %6602 %1397\n      %17625 = OpBitwiseOr %v4uint %18029 %24075\n       %7115 = OpShiftLeftLogical %v4uint %17625 %2950\n      %16012 = OpBitwiseOr %v4uint %17625 %7115\n      %23697 = OpShiftLeftLogical %v4uint %16012 %3004\n      %17039 = OpBitwiseOr %v4uint %16012 %23697\n      %21870 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %14994\n               OpStore %21870 %17039\n       %8536 = OpIAdd %uint %13296 %uint_16\n       %6741 = OpShiftRightLogical %uint %8536 %int_4\n      %16739 = OpVectorShuffle %v4uint %16844 %200 1 1 3 3\n       %9026 = OpShiftRightLogical %v4uint %16739 %287\n       %7913 = OpBitwiseAnd %v4uint %9026 %2950\n      %24652 = OpShiftLeftLogical %v4uint %7913 %317\n      %22596 = OpShiftRightLogical %v4uint %16739 %503\n      %21618 = OpBitwiseAnd %v4uint %22596 %2950\n      %24058 = OpShiftLeftLogical %v4uint %21618 %1181\n      %18030 = OpBitwiseOr %v4uint %24652 %24058\n      %23176 = OpShiftRightLogical %v4uint %16739 %233\n       %6603 = OpBitwiseAnd %v4uint %23176 %2950\n      %24059 = OpShiftLeftLogical %v4uint %6603 %101\n      %18031 = OpBitwiseOr %v4uint %18030 %24059\n      %23177 = OpShiftRightLogical %v4uint %16739 %449\n       %6604 = OpBitwiseAnd %v4uint %23177 %2950\n      %24060 = OpShiftLeftLogical %v4uint %6604 %965\n      %18032 = OpBitwiseOr %v4uint %18031 %24060\n      %23178 = OpShiftRightLogical %v4uint %16739 %179\n       %6352 = OpBitwiseAnd %v4uint %23178 %2950\n      %16459 = OpBitwiseOr %v4uint %18032 %6352\n      %22347 = OpShiftRightLogical %v4uint %16739 %395\n       %6605 = OpBitwiseAnd %v4uint %22347 %2950\n      %24061 = OpShiftLeftLogical %v4uint %6605 %749\n      %18033 = OpBitwiseOr %v4uint %16459 %24061\n      %23179 = OpShiftRightLogical %v4uint %16739 %125\n       %6606 = OpBitwiseAnd %v4uint %23179 %2950\n      %24062 = OpShiftLeftLogical %v4uint %6606 %533\n      %18034 = OpBitwiseOr %v4uint %18033 %24062\n      %23180 = OpShiftRightLogical %v4uint %16739 %341\n       %6607 = OpBitwiseAnd %v4uint %23180 %2950\n      %24076 = OpShiftLeftLogical %v4uint %6607 %1397\n      %17626 = OpBitwiseOr %v4uint %18034 %24076\n       %7116 = OpShiftLeftLogical %v4uint %17626 %2950\n      %16013 = OpBitwiseOr %v4uint %17626 %7116\n      %23698 = OpShiftLeftLogical %v4uint %16013 %3004\n      %17040 = OpBitwiseOr %v4uint %16013 %23698\n      %21871 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %6741\n               OpStore %21871 %17040\n      %14841 = OpIAdd %uint %12832 %int_3\n      %11788 = OpULessThan %bool %14841 %6594\n               OpSelectionMerge %18045 DontFlatten\n               OpBranchConditional %11788 %20682 %18045\n      %20682 = OpLabel\n      %13813 = OpIAdd %uint %13296 %22412\n      %10289 = OpCompositeExtract %uint %10924 1\n      %10053 = OpCompositeExtract %uint %10924 3\n       %7642 = OpCompositeExtract %uint %16844 1\n       %9981 = OpCompositeExtract %uint %16844 3\n      %17523 = OpCompositeConstruct %v4uint %10289 %10053 %7642 %9981\n       %9607 = OpShiftRightLogical %v4uint %17523 %749\n       %9480 = OpShiftRightLogical %uint %13813 %int_4\n      %24767 = OpVectorShuffle %v4uint %9607 %200 0 0 1 1\n       %9027 = OpShiftRightLogical %v4uint %24767 %287\n       %7914 = OpBitwiseAnd %v4uint %9027 %2950\n      %24653 = OpShiftLeftLogical %v4uint %7914 %317\n      %22597 = OpShiftRightLogical %v4uint %24767 %503\n      %21619 = OpBitwiseAnd %v4uint %22597 %2950\n      %24063 = OpShiftLeftLogical %v4uint %21619 %1181\n      %18035 = OpBitwiseOr %v4uint %24653 %24063\n      %23181 = OpShiftRightLogical %v4uint %24767 %233\n       %6608 = OpBitwiseAnd %v4uint %23181 %2950\n      %24064 = OpShiftLeftLogical %v4uint %6608 %101\n      %18036 = OpBitwiseOr %v4uint %18035 %24064\n      %23182 = OpShiftRightLogical %v4uint %24767 %449\n       %6609 = OpBitwiseAnd %v4uint %23182 %2950\n      %24065 = OpShiftLeftLogical %v4uint %6609 %965\n      %18037 = OpBitwiseOr %v4uint %18036 %24065\n      %23183 = OpShiftRightLogical %v4uint %24767 %179\n       %6353 = OpBitwiseAnd %v4uint %23183 %2950\n      %16460 = OpBitwiseOr %v4uint %18037 %6353\n      %22348 = OpShiftRightLogical %v4uint %24767 %395\n       %6610 = OpBitwiseAnd %v4uint %22348 %2950\n      %24066 = OpShiftLeftLogical %v4uint %6610 %749\n      %18038 = OpBitwiseOr %v4uint %16460 %24066\n      %23184 = OpShiftRightLogical %v4uint %24767 %125\n       %6611 = OpBitwiseAnd %v4uint %23184 %2950\n      %24067 = OpShiftLeftLogical %v4uint %6611 %533\n      %18039 = OpBitwiseOr %v4uint %18038 %24067\n      %23185 = OpShiftRightLogical %v4uint %24767 %341\n       %6612 = OpBitwiseAnd %v4uint %23185 %2950\n      %24077 = OpShiftLeftLogical %v4uint %6612 %1397\n      %17627 = OpBitwiseOr %v4uint %18039 %24077\n       %7117 = OpShiftLeftLogical %v4uint %17627 %2950\n      %16014 = OpBitwiseOr %v4uint %17627 %7117\n      %23699 = OpShiftLeftLogical %v4uint %16014 %3004\n      %17041 = OpBitwiseOr %v4uint %16014 %23699\n      %21872 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %9480\n               OpStore %21872 %17041\n       %8537 = OpIAdd %uint %13813 %uint_16\n       %6742 = OpShiftRightLogical %uint %8537 %int_4\n      %16740 = OpVectorShuffle %v4uint %9607 %200 2 2 3 3\n       %9028 = OpShiftRightLogical %v4uint %16740 %287\n       %7915 = OpBitwiseAnd %v4uint %9028 %2950\n      %24654 = OpShiftLeftLogical %v4uint %7915 %317\n      %22598 = OpShiftRightLogical %v4uint %16740 %503\n      %21620 = OpBitwiseAnd %v4uint %22598 %2950\n      %24068 = OpShiftLeftLogical %v4uint %21620 %1181\n      %18040 = OpBitwiseOr %v4uint %24654 %24068\n      %23186 = OpShiftRightLogical %v4uint %16740 %233\n       %6613 = OpBitwiseAnd %v4uint %23186 %2950\n      %24069 = OpShiftLeftLogical %v4uint %6613 %101\n      %18041 = OpBitwiseOr %v4uint %18040 %24069\n      %23187 = OpShiftRightLogical %v4uint %16740 %449\n       %6614 = OpBitwiseAnd %v4uint %23187 %2950\n      %24070 = OpShiftLeftLogical %v4uint %6614 %965\n      %18042 = OpBitwiseOr %v4uint %18041 %24070\n      %23188 = OpShiftRightLogical %v4uint %16740 %179\n       %6354 = OpBitwiseAnd %v4uint %23188 %2950\n      %16461 = OpBitwiseOr %v4uint %18042 %6354\n      %22349 = OpShiftRightLogical %v4uint %16740 %395\n       %6615 = OpBitwiseAnd %v4uint %22349 %2950\n      %24078 = OpShiftLeftLogical %v4uint %6615 %749\n      %18043 = OpBitwiseOr %v4uint %16461 %24078\n      %23189 = OpShiftRightLogical %v4uint %16740 %125\n       %6616 = OpBitwiseAnd %v4uint %23189 %2950\n      %24079 = OpShiftLeftLogical %v4uint %6616 %533\n      %18044 = OpBitwiseOr %v4uint %18043 %24079\n      %23190 = OpShiftRightLogical %v4uint %16740 %341\n       %6617 = OpBitwiseAnd %v4uint %23190 %2950\n      %24080 = OpShiftLeftLogical %v4uint %6617 %1397\n      %17628 = OpBitwiseOr %v4uint %18044 %24080\n       %7118 = OpShiftLeftLogical %v4uint %17628 %2950\n      %16015 = OpBitwiseOr %v4uint %17628 %7118\n      %23700 = OpShiftLeftLogical %v4uint %16015 %3004\n      %17042 = OpBitwiseOr %v4uint %16015 %23700\n      %24166 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %6742\n               OpStore %24166 %17042\n               OpBranch %18045\n      %18045 = OpLabel\n               OpBranch %7206\n       %7206 = OpLabel\n               OpBranch %7207\n       %7207 = OpLabel\n               OpBranch %14903\n      %14903 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_dxt3aas1111_bgra4_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006245, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000017,\n    0x0000000B, 0x00000004, 0x00040015, 0x0000000C, 0x00000020, 0x00000001,\n    0x00040017, 0x00000012, 0x0000000C, 0x00000002, 0x00040017, 0x00000016,\n    0x0000000C, 0x00000003, 0x00020014, 0x00000009, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A13, 0x00000003,\n    0x0004002B, 0x0000000B, 0x00000A2B, 0x0000000B, 0x0007002C, 0x00000017,\n    0x0000011F, 0x00000A13, 0x00000A2B, 0x00000A13, 0x00000A2B, 0x0004002B,\n    0x0000000B, 0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B, 0x00000A22,\n    0x00000008, 0x0004002B, 0x0000000B, 0x00000A1F, 0x00000007, 0x0004002B,\n    0x0000000B, 0x00000A37, 0x0000000F, 0x0007002C, 0x00000017, 0x000001F7,\n    0x00000A1F, 0x00000A37, 0x00000A1F, 0x00000A37, 0x0004002B, 0x0000000B,\n    0x00000A52, 0x00000018, 0x0004002B, 0x0000000B, 0x00000A10, 0x00000002,\n    0x0004002B, 0x0000000B, 0x00000A28, 0x0000000A, 0x0007002C, 0x00000017,\n    0x000000E9, 0x00000A10, 0x00000A28, 0x00000A10, 0x00000A28, 0x0004002B,\n    0x0000000B, 0x00000A16, 0x00000004, 0x0004002B, 0x0000000B, 0x00000A1C,\n    0x00000006, 0x0004002B, 0x0000000B, 0x00000A34, 0x0000000E, 0x0007002C,\n    0x00000017, 0x000001C1, 0x00000A1C, 0x00000A34, 0x00000A1C, 0x00000A34,\n    0x0004002B, 0x0000000B, 0x00000A46, 0x00000014, 0x0004002B, 0x0000000B,\n    0x00000A25, 0x00000009, 0x0007002C, 0x00000017, 0x000000B3, 0x00000A0D,\n    0x00000A25, 0x00000A0D, 0x00000A25, 0x0004002B, 0x0000000B, 0x00000A19,\n    0x00000005, 0x0004002B, 0x0000000B, 0x00000A31, 0x0000000D, 0x0007002C,\n    0x00000017, 0x0000018B, 0x00000A19, 0x00000A31, 0x00000A19, 0x00000A31,\n    0x0004002B, 0x0000000B, 0x00000A3A, 0x00000010, 0x0004002B, 0x0000000B,\n    0x00000A0A, 0x00000000, 0x0007002C, 0x00000017, 0x0000007D, 0x00000A0A,\n    0x00000A22, 0x00000A0A, 0x00000A22, 0x0004002B, 0x0000000B, 0x00000A2E,\n    0x0000000C, 0x0007002C, 0x00000017, 0x00000155, 0x00000A16, 0x00000A2E,\n    0x00000A16, 0x00000A2E, 0x0004002B, 0x0000000B, 0x00000A5E, 0x0000001C,\n    0x0004002B, 0x0000000B, 0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B,\n    0x000005FD, 0xFF00FF00, 0x0004002B, 0x0000000C, 0x00000A17, 0x00000004,\n    0x0004002B, 0x0000000C, 0x00000A1D, 0x00000006, 0x0004002B, 0x0000000C,\n    0x00000A2C, 0x0000000B, 0x0004002B, 0x0000000C, 0x00000A38, 0x0000000F,\n    0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C,\n    0x00000A1A, 0x00000005, 0x0004002B, 0x0000000C, 0x00000A20, 0x00000007,\n    0x0004002B, 0x0000000C, 0x00000A23, 0x00000008, 0x0004002B, 0x0000000C,\n    0x00000A2F, 0x0000000C, 0x0004002B, 0x0000000C, 0x00000A14, 0x00000003,\n    0x0004002B, 0x0000000C, 0x00000A11, 0x00000002, 0x0004002B, 0x0000000C,\n    0x00000A0B, 0x00000000, 0x000A001E, 0x00000489, 0x0000000B, 0x0000000B,\n    0x0000000B, 0x0000000B, 0x00000014, 0x0000000B, 0x0000000B, 0x0000000B,\n    0x00040020, 0x00000706, 0x00000009, 0x00000489, 0x0004003B, 0x00000706,\n    0x00000CE9, 0x00000009, 0x00040020, 0x00000288, 0x00000009, 0x0000000B,\n    0x00040020, 0x00000291, 0x00000009, 0x00000014, 0x00040020, 0x00000292,\n    0x00000001, 0x00000014, 0x0004003B, 0x00000292, 0x00000F48, 0x00000001,\n    0x0006002C, 0x00000014, 0x00000A24, 0x00000A10, 0x00000A0A, 0x00000A0A,\n    0x00040017, 0x0000000F, 0x00000009, 0x00000002, 0x0006002C, 0x00000014,\n    0x00000A3B, 0x00000A10, 0x00000A10, 0x00000A0A, 0x0003001D, 0x000007DC,\n    0x00000017, 0x0003001E, 0x000007B4, 0x000007DC, 0x00040020, 0x00000A32,\n    0x00000002, 0x000007B4, 0x0004003B, 0x00000A32, 0x0000107A, 0x00000002,\n    0x00040020, 0x00000294, 0x00000002, 0x00000017, 0x0003001D, 0x000007DD,\n    0x00000017, 0x0003001E, 0x000007B5, 0x000007DD, 0x00040020, 0x00000A33,\n    0x00000002, 0x000007B5, 0x0004003B, 0x00000A33, 0x0000140E, 0x00000002,\n    0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020, 0x0006002C, 0x00000014,\n    0x00000BC3, 0x00000A16, 0x00000A6A, 0x00000A0D, 0x0007002C, 0x00000017,\n    0x000009CE, 0x000008A6, 0x000008A6, 0x000008A6, 0x000008A6, 0x0007002C,\n    0x00000017, 0x0000013D, 0x00000A22, 0x00000A22, 0x00000A22, 0x00000A22,\n    0x0007002C, 0x00000017, 0x0000072E, 0x000005FD, 0x000005FD, 0x000005FD,\n    0x000005FD, 0x0007002C, 0x00000017, 0x000002ED, 0x00000A3A, 0x00000A3A,\n    0x00000A3A, 0x00000A3A, 0x0007002C, 0x00000017, 0x00000B86, 0x00000A0D,\n    0x00000A0D, 0x00000A0D, 0x00000A0D, 0x0007002C, 0x00000017, 0x0000049D,\n    0x00000A52, 0x00000A52, 0x00000A52, 0x00000A52, 0x0007002C, 0x00000017,\n    0x00000065, 0x00000A16, 0x00000A16, 0x00000A16, 0x00000A16, 0x0007002C,\n    0x00000017, 0x000003C5, 0x00000A46, 0x00000A46, 0x00000A46, 0x00000A46,\n    0x0007002C, 0x00000017, 0x00000215, 0x00000A2E, 0x00000A2E, 0x00000A2E,\n    0x00000A2E, 0x0007002C, 0x00000017, 0x00000575, 0x00000A5E, 0x00000A5E,\n    0x00000A5E, 0x00000A5E, 0x0007002C, 0x00000017, 0x00000BBC, 0x00000A10,\n    0x00000A10, 0x00000A10, 0x00000A10, 0x0003002E, 0x00000011, 0x000000C8,\n    0x00050036, 0x00000008, 0x0000161F, 0x00000000, 0x00000502, 0x000200F8,\n    0x00003B06, 0x000300F7, 0x00003A37, 0x00000000, 0x000300FB, 0x00000A0A,\n    0x00002E68, 0x000200F8, 0x00002E68, 0x00050041, 0x00000288, 0x000060D7,\n    0x00000CE9, 0x00000A0B, 0x0004003D, 0x0000000B, 0x00003526, 0x000060D7,\n    0x000500C7, 0x0000000B, 0x00005FDC, 0x00003526, 0x00000A0D, 0x000500AB,\n    0x00000009, 0x00004376, 0x00005FDC, 0x00000A0A, 0x000500C7, 0x0000000B,\n    0x00003028, 0x00003526, 0x00000A10, 0x000500AB, 0x00000009, 0x00004384,\n    0x00003028, 0x00000A0A, 0x000500C2, 0x0000000B, 0x00001EB0, 0x00003526,\n    0x00000A10, 0x000500C7, 0x0000000B, 0x000061E2, 0x00001EB0, 0x00000A13,\n    0x00050041, 0x00000288, 0x0000492C, 0x00000CE9, 0x00000A0E, 0x0004003D,\n    0x0000000B, 0x00005EAC, 0x0000492C, 0x00050041, 0x00000288, 0x00004EBA,\n    0x00000CE9, 0x00000A11, 0x0004003D, 0x0000000B, 0x00005788, 0x00004EBA,\n    0x00050041, 0x00000288, 0x00004EBB, 0x00000CE9, 0x00000A14, 0x0004003D,\n    0x0000000B, 0x00005789, 0x00004EBB, 0x00050041, 0x00000291, 0x00004EBC,\n    0x00000CE9, 0x00000A17, 0x0004003D, 0x00000014, 0x0000578A, 0x00004EBC,\n    0x00050041, 0x00000288, 0x00004EBD, 0x00000CE9, 0x00000A1A, 0x0004003D,\n    0x0000000B, 0x0000578B, 0x00004EBD, 0x00050041, 0x00000288, 0x00004EBE,\n    0x00000CE9, 0x00000A1D, 0x0004003D, 0x0000000B, 0x0000578C, 0x00004EBE,\n    0x00050041, 0x00000288, 0x00004E6E, 0x00000CE9, 0x00000A20, 0x0004003D,\n    0x0000000B, 0x000019C2, 0x00004E6E, 0x0004003D, 0x00000014, 0x00002A0E,\n    0x00000F48, 0x000500C4, 0x00000014, 0x0000538B, 0x00002A0E, 0x00000A24,\n    0x0007004F, 0x00000011, 0x000042F0, 0x0000538B, 0x0000538B, 0x00000000,\n    0x00000001, 0x0007004F, 0x00000011, 0x0000242F, 0x0000578A, 0x0000578A,\n    0x00000000, 0x00000001, 0x000500AE, 0x0000000F, 0x00004288, 0x000042F0,\n    0x0000242F, 0x0004009A, 0x00000009, 0x00006067, 0x00004288, 0x000300F7,\n    0x000036C2, 0x00000002, 0x000400FA, 0x00006067, 0x000055E8, 0x000036C2,\n    0x000200F8, 0x000055E8, 0x000200F9, 0x00003A37, 0x000200F8, 0x000036C2,\n    0x000500C4, 0x00000014, 0x000043C0, 0x0000538B, 0x00000A3B, 0x0004007C,\n    0x00000016, 0x00003C81, 0x000043C0, 0x00050051, 0x0000000C, 0x000047A0,\n    0x00003C81, 0x00000000, 0x00050084, 0x0000000C, 0x00002492, 0x000047A0,\n    0x00000A11, 0x00050051, 0x0000000C, 0x000018DA, 0x00003C81, 0x00000002,\n    0x0004007C, 0x0000000C, 0x000038A9, 0x000019C2, 0x00050084, 0x0000000C,\n    0x00002C0F, 0x000018DA, 0x000038A9, 0x00050051, 0x0000000C, 0x000044BE,\n    0x00003C81, 0x00000001, 0x00050080, 0x0000000C, 0x000056D4, 0x00002C0F,\n    0x000044BE, 0x0004007C, 0x0000000C, 0x00005785, 0x0000578C, 0x00050084,\n    0x0000000C, 0x00005FD7, 0x000056D4, 0x00005785, 0x00050080, 0x0000000C,\n    0x00002042, 0x00002492, 0x00005FD7, 0x0004007C, 0x0000000B, 0x000028A4,\n    0x00002042, 0x00050080, 0x0000000B, 0x000038F6, 0x0000578B, 0x000028A4,\n    0x000400A8, 0x00000009, 0x00003014, 0x00004376, 0x000300F7, 0x00004A60,\n    0x00000002, 0x000400FA, 0x00003014, 0x0000260D, 0x0000426F, 0x000200F8,\n    0x0000260D, 0x00050051, 0x0000000B, 0x00004437, 0x0000538B, 0x00000000,\n    0x00050051, 0x0000000B, 0x00002BEE, 0x0000538B, 0x00000001, 0x00050051,\n    0x0000000B, 0x00004971, 0x0000538B, 0x00000002, 0x00050084, 0x0000000B,\n    0x000039EF, 0x00005789, 0x00004971, 0x00050080, 0x0000000B, 0x00004F62,\n    0x00002BEE, 0x000039EF, 0x00050084, 0x0000000B, 0x000054AC, 0x00005788,\n    0x00004F62, 0x00050080, 0x0000000B, 0x00004FAE, 0x00004437, 0x000054AC,\n    0x000500C4, 0x0000000B, 0x00002C67, 0x00004FAE, 0x00000A13, 0x000200F9,\n    0x00004A60, 0x000200F8, 0x0000426F, 0x000300F7, 0x00005BF0, 0x00000002,\n    0x000400FA, 0x00004384, 0x00005BE0, 0x00005F21, 0x000200F8, 0x00005BE0,\n    0x0004007C, 0x00000016, 0x0000277F, 0x0000538B, 0x000500C2, 0x0000000B,\n    0x00004C14, 0x00005788, 0x00000A1A, 0x000500C2, 0x0000000B, 0x0000497A,\n    0x00005789, 0x00000A17, 0x00050051, 0x0000000C, 0x00001A7E, 0x0000277F,\n    0x00000002, 0x000500C3, 0x0000000C, 0x00002F39, 0x00001A7E, 0x00000A11,\n    0x0004007C, 0x0000000C, 0x00005780, 0x0000497A, 0x00050084, 0x0000000C,\n    0x00001F02, 0x00002F39, 0x00005780, 0x00050051, 0x0000000C, 0x00006242,\n    0x0000277F, 0x00000001, 0x000500C3, 0x0000000C, 0x00004A6F, 0x00006242,\n    0x00000A17, 0x00050080, 0x0000000C, 0x00002B2C, 0x00001F02, 0x00004A6F,\n    0x0004007C, 0x0000000C, 0x00004202, 0x00004C14, 0x00050084, 0x0000000C,\n    0x00003A60, 0x00002B2C, 0x00004202, 0x00050051, 0x0000000C, 0x00006243,\n    0x0000277F, 0x00000000, 0x000500C3, 0x0000000C, 0x00004FC7, 0x00006243,\n    0x00000A1A, 0x00050080, 0x0000000C, 0x000049FC, 0x00003A60, 0x00004FC7,\n    0x000500C4, 0x0000000C, 0x0000225D, 0x000049FC, 0x00000A20, 0x000500C7,\n    0x0000000C, 0x00002CAA, 0x00001A7E, 0x00000A14, 0x000500C4, 0x0000000C,\n    0x00004CAE, 0x00002CAA, 0x00000A1A, 0x000500C3, 0x0000000C, 0x0000383E,\n    0x00006242, 0x00000A0E, 0x000500C7, 0x0000000C, 0x00005374, 0x0000383E,\n    0x00000A14, 0x000500C4, 0x0000000C, 0x000054CA, 0x00005374, 0x00000A14,\n    0x000500C5, 0x0000000C, 0x000042CE, 0x00004CAE, 0x000054CA, 0x000500C7,\n    0x0000000C, 0x000050D5, 0x00006243, 0x00000A20, 0x000500C5, 0x0000000C,\n    0x00003ADD, 0x000042CE, 0x000050D5, 0x000500C5, 0x0000000C, 0x000043B6,\n    0x0000225D, 0x00003ADD, 0x000500C4, 0x0000000C, 0x00005E50, 0x000043B6,\n    0x00000A13, 0x000500C3, 0x0000000C, 0x000032D7, 0x00006242, 0x00000A14,\n    0x000500C6, 0x0000000C, 0x000026C9, 0x000032D7, 0x00002F39, 0x000500C7,\n    0x0000000C, 0x00004199, 0x000026C9, 0x00000A0E, 0x000500C3, 0x0000000C,\n    0x00002590, 0x00006243, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000505E,\n    0x00002590, 0x00000A14, 0x000500C4, 0x0000000C, 0x0000541D, 0x00004199,\n    0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BA, 0x0000505E, 0x0000541D,\n    0x000500C7, 0x0000000C, 0x00005076, 0x00006242, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x00005228, 0x00005076, 0x00000A17, 0x000500C4, 0x0000000C,\n    0x00001997, 0x000022BA, 0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FE,\n    0x00005228, 0x00001997, 0x000500C4, 0x0000000C, 0x00001C00, 0x00004199,\n    0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C82, 0x000047FE, 0x00001C00,\n    0x000500C7, 0x0000000C, 0x000050AF, 0x00005E50, 0x00000A38, 0x000500C5,\n    0x0000000C, 0x00003C70, 0x00003C82, 0x000050AF, 0x000500C3, 0x0000000C,\n    0x00003745, 0x00005E50, 0x00000A17, 0x000500C7, 0x0000000C, 0x000018B8,\n    0x00003745, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000547E, 0x000018B8,\n    0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A8, 0x00003C70, 0x0000547E,\n    0x000500C3, 0x0000000C, 0x00003A6E, 0x00005E50, 0x00000A1A, 0x000500C7,\n    0x0000000C, 0x000018B9, 0x00003A6E, 0x00000A20, 0x000500C4, 0x0000000C,\n    0x0000547F, 0x000018B9, 0x00000A23, 0x000500C5, 0x0000000C, 0x0000456F,\n    0x000045A8, 0x0000547F, 0x000500C3, 0x0000000C, 0x00003C88, 0x00005E50,\n    0x00000A23, 0x000500C4, 0x0000000C, 0x00002824, 0x00003C88, 0x00000A2F,\n    0x000500C5, 0x0000000C, 0x00003B79, 0x0000456F, 0x00002824, 0x0004007C,\n    0x0000000B, 0x000041E5, 0x00003B79, 0x000200F9, 0x00005BF0, 0x000200F8,\n    0x00005F21, 0x0004007C, 0x00000012, 0x000059D8, 0x000042F0, 0x000500C2,\n    0x0000000B, 0x00005668, 0x00005788, 0x00000A1A, 0x00050051, 0x0000000C,\n    0x00003905, 0x000059D8, 0x00000001, 0x000500C3, 0x0000000C, 0x00002F3A,\n    0x00003905, 0x00000A1A, 0x0004007C, 0x0000000C, 0x00005781, 0x00005668,\n    0x00050084, 0x0000000C, 0x00001F03, 0x00002F3A, 0x00005781, 0x00050051,\n    0x0000000C, 0x00006244, 0x000059D8, 0x00000000, 0x000500C3, 0x0000000C,\n    0x00004FC8, 0x00006244, 0x00000A1A, 0x00050080, 0x0000000C, 0x000049B0,\n    0x00001F03, 0x00004FC8, 0x000500C4, 0x0000000C, 0x0000254A, 0x000049B0,\n    0x00000A1D, 0x000500C3, 0x0000000C, 0x0000603B, 0x00003905, 0x00000A0E,\n    0x000500C7, 0x0000000C, 0x0000539A, 0x0000603B, 0x00000A20, 0x000500C4,\n    0x0000000C, 0x0000534A, 0x0000539A, 0x00000A14, 0x000500C7, 0x0000000C,\n    0x00004EA5, 0x00006244, 0x00000A20, 0x000500C5, 0x0000000C, 0x00002B1A,\n    0x0000534A, 0x00004EA5, 0x000500C5, 0x0000000C, 0x000043B7, 0x0000254A,\n    0x00002B1A, 0x000500C4, 0x0000000C, 0x00005E63, 0x000043B7, 0x00000A13,\n    0x000500C3, 0x0000000C, 0x000031DE, 0x00003905, 0x00000A17, 0x000500C7,\n    0x0000000C, 0x00005447, 0x000031DE, 0x00000A0E, 0x000500C3, 0x0000000C,\n    0x000028A6, 0x00006244, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000511E,\n    0x000028A6, 0x00000A14, 0x000500C3, 0x0000000C, 0x000028B9, 0x00003905,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x0000505F, 0x000028B9, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x0000541E, 0x0000505F, 0x00000A0E, 0x000500C6,\n    0x0000000C, 0x000022BB, 0x0000511E, 0x0000541E, 0x000500C7, 0x0000000C,\n    0x00005077, 0x00003905, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005229,\n    0x00005077, 0x00000A17, 0x000500C4, 0x0000000C, 0x00001998, 0x000022BB,\n    0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FF, 0x00005229, 0x00001998,\n    0x000500C4, 0x0000000C, 0x00001C01, 0x00005447, 0x00000A2C, 0x000500C5,\n    0x0000000C, 0x00003C83, 0x000047FF, 0x00001C01, 0x000500C7, 0x0000000C,\n    0x000050B0, 0x00005E63, 0x00000A38, 0x000500C5, 0x0000000C, 0x00003C71,\n    0x00003C83, 0x000050B0, 0x000500C3, 0x0000000C, 0x00003746, 0x00005E63,\n    0x00000A17, 0x000500C7, 0x0000000C, 0x000018BA, 0x00003746, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x00005480, 0x000018BA, 0x00000A1A, 0x000500C5,\n    0x0000000C, 0x000045A9, 0x00003C71, 0x00005480, 0x000500C3, 0x0000000C,\n    0x00003A6F, 0x00005E63, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018BB,\n    0x00003A6F, 0x00000A20, 0x000500C4, 0x0000000C, 0x00005481, 0x000018BB,\n    0x00000A23, 0x000500C5, 0x0000000C, 0x00004570, 0x000045A9, 0x00005481,\n    0x000500C3, 0x0000000C, 0x00003C89, 0x00005E63, 0x00000A23, 0x000500C4,\n    0x0000000C, 0x00002825, 0x00003C89, 0x00000A2F, 0x000500C5, 0x0000000C,\n    0x00003B7A, 0x00004570, 0x00002825, 0x0004007C, 0x0000000B, 0x000041E6,\n    0x00003B7A, 0x000200F9, 0x00005BF0, 0x000200F8, 0x00005BF0, 0x000700F5,\n    0x0000000B, 0x0000292C, 0x000041E5, 0x00005BE0, 0x000041E6, 0x00005F21,\n    0x000200F9, 0x00004A60, 0x000200F8, 0x00004A60, 0x000700F5, 0x0000000B,\n    0x00002C70, 0x00002C67, 0x0000260D, 0x0000292C, 0x00005BF0, 0x00050080,\n    0x0000000B, 0x000048BD, 0x00002C70, 0x00005EAC, 0x000500C2, 0x0000000B,\n    0x00003D52, 0x000048BD, 0x00000A17, 0x00060041, 0x00000294, 0x00004FAF,\n    0x0000107A, 0x00000A0B, 0x00003D52, 0x0004003D, 0x00000017, 0x00001CAA,\n    0x00004FAF, 0x000500AA, 0x00000009, 0x000035C0, 0x000061E2, 0x00000A0D,\n    0x000500AA, 0x00000009, 0x00005376, 0x000061E2, 0x00000A10, 0x000500A6,\n    0x00000009, 0x00005686, 0x000035C0, 0x00005376, 0x000300F7, 0x00003463,\n    0x00000000, 0x000400FA, 0x00005686, 0x00002957, 0x00003463, 0x000200F8,\n    0x00002957, 0x000500C7, 0x00000017, 0x0000475F, 0x00001CAA, 0x000009CE,\n    0x000500C4, 0x00000017, 0x000024D1, 0x0000475F, 0x0000013D, 0x000500C7,\n    0x00000017, 0x000050AC, 0x00001CAA, 0x0000072E, 0x000500C2, 0x00000017,\n    0x0000448D, 0x000050AC, 0x0000013D, 0x000500C5, 0x00000017, 0x00003FF8,\n    0x000024D1, 0x0000448D, 0x000200F9, 0x00003463, 0x000200F8, 0x00003463,\n    0x000700F5, 0x00000017, 0x00005879, 0x00001CAA, 0x00004A60, 0x00003FF8,\n    0x00002957, 0x000500AA, 0x00000009, 0x00004CB6, 0x000061E2, 0x00000A13,\n    0x000500A6, 0x00000009, 0x00003B23, 0x00005376, 0x00004CB6, 0x000300F7,\n    0x00003A1A, 0x00000000, 0x000400FA, 0x00003B23, 0x00002B38, 0x00003A1A,\n    0x000200F8, 0x00002B38, 0x000500C4, 0x00000017, 0x00005E17, 0x00005879,\n    0x000002ED, 0x000500C2, 0x00000017, 0x00003BE7, 0x00005879, 0x000002ED,\n    0x000500C5, 0x00000017, 0x000029E8, 0x00005E17, 0x00003BE7, 0x000200F9,\n    0x00003A1A, 0x000200F8, 0x00003A1A, 0x000700F5, 0x00000017, 0x00002AAC,\n    0x00005879, 0x00003463, 0x000029E8, 0x00002B38, 0x000300F7, 0x00006070,\n    0x00000002, 0x000400FA, 0x00004376, 0x000055E9, 0x00001C25, 0x000200F8,\n    0x000055E9, 0x000200F9, 0x00006070, 0x000200F8, 0x00001C25, 0x000200F9,\n    0x00006070, 0x000200F8, 0x00006070, 0x000700F5, 0x0000000B, 0x00002C71,\n    0x00000A6A, 0x000055E9, 0x00000A3A, 0x00001C25, 0x00050080, 0x0000000B,\n    0x000048BE, 0x000048BD, 0x00002C71, 0x000500C2, 0x0000000B, 0x00003D53,\n    0x000048BE, 0x00000A17, 0x00060041, 0x00000294, 0x00005566, 0x0000107A,\n    0x00000A0B, 0x00003D53, 0x0004003D, 0x00000017, 0x00003910, 0x00005566,\n    0x000300F7, 0x00003A1B, 0x00000000, 0x000400FA, 0x00005686, 0x00002958,\n    0x00003A1B, 0x000200F8, 0x00002958, 0x000500C7, 0x00000017, 0x00004760,\n    0x00003910, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D2, 0x00004760,\n    0x0000013D, 0x000500C7, 0x00000017, 0x000050AD, 0x00003910, 0x0000072E,\n    0x000500C2, 0x00000017, 0x0000448E, 0x000050AD, 0x0000013D, 0x000500C5,\n    0x00000017, 0x00003FF9, 0x000024D2, 0x0000448E, 0x000200F9, 0x00003A1B,\n    0x000200F8, 0x00003A1B, 0x000700F5, 0x00000017, 0x00002AAD, 0x00003910,\n    0x00006070, 0x00003FF9, 0x00002958, 0x000300F7, 0x0000362B, 0x00000000,\n    0x000400FA, 0x00003B23, 0x00002B39, 0x0000362B, 0x000200F8, 0x00002B39,\n    0x000500C4, 0x00000017, 0x00005E18, 0x00002AAD, 0x000002ED, 0x000500C2,\n    0x00000017, 0x00003BE8, 0x00002AAD, 0x000002ED, 0x000500C5, 0x00000017,\n    0x000029E9, 0x00005E18, 0x00003BE8, 0x000200F9, 0x0000362B, 0x000200F8,\n    0x0000362B, 0x000700F5, 0x00000017, 0x000041CC, 0x00002AAD, 0x00003A1B,\n    0x000029E9, 0x00002B39, 0x000500C2, 0x0000000B, 0x000021F1, 0x000038F6,\n    0x00000A17, 0x0009004F, 0x00000017, 0x00002C31, 0x00002AAC, 0x000000C8,\n    0x00000000, 0x00000000, 0x00000002, 0x00000002, 0x000500C2, 0x00000017,\n    0x0000233D, 0x00002C31, 0x0000011F, 0x000500C7, 0x00000017, 0x00001EE4,\n    0x0000233D, 0x00000B86, 0x000500C4, 0x00000017, 0x00006047, 0x00001EE4,\n    0x0000013D, 0x000500C2, 0x00000017, 0x0000583F, 0x00002C31, 0x000001F7,\n    0x000500C7, 0x00000017, 0x0000546D, 0x0000583F, 0x00000B86, 0x000500C4,\n    0x00000017, 0x00005DE1, 0x0000546D, 0x0000049D, 0x000500C5, 0x00000017,\n    0x00004655, 0x00006047, 0x00005DE1, 0x000500C2, 0x00000017, 0x00005A6F,\n    0x00002C31, 0x000000E9, 0x000500C7, 0x00000017, 0x000019B1, 0x00005A6F,\n    0x00000B86, 0x000500C4, 0x00000017, 0x00005DE2, 0x000019B1, 0x00000065,\n    0x000500C5, 0x00000017, 0x00004656, 0x00004655, 0x00005DE2, 0x000500C2,\n    0x00000017, 0x00005A70, 0x00002C31, 0x000001C1, 0x000500C7, 0x00000017,\n    0x000019B2, 0x00005A70, 0x00000B86, 0x000500C4, 0x00000017, 0x00005DE3,\n    0x000019B2, 0x000003C5, 0x000500C5, 0x00000017, 0x00004657, 0x00004656,\n    0x00005DE3, 0x000500C2, 0x00000017, 0x00005A82, 0x00002C31, 0x000000B3,\n    0x000500C7, 0x00000017, 0x000018CB, 0x00005A82, 0x00000B86, 0x000500C5,\n    0x00000017, 0x00004046, 0x00004657, 0x000018CB, 0x000500C2, 0x00000017,\n    0x00005746, 0x00002C31, 0x0000018B, 0x000500C7, 0x00000017, 0x000019B3,\n    0x00005746, 0x00000B86, 0x000500C4, 0x00000017, 0x00005DE4, 0x000019B3,\n    0x000002ED, 0x000500C5, 0x00000017, 0x00004658, 0x00004046, 0x00005DE4,\n    0x000500C2, 0x00000017, 0x00005A71, 0x00002C31, 0x0000007D, 0x000500C7,\n    0x00000017, 0x000019B4, 0x00005A71, 0x00000B86, 0x000500C4, 0x00000017,\n    0x00005DE5, 0x000019B4, 0x00000215, 0x000500C5, 0x00000017, 0x00004659,\n    0x00004658, 0x00005DE5, 0x000500C2, 0x00000017, 0x00005A72, 0x00002C31,\n    0x00000155, 0x000500C7, 0x00000017, 0x000019B5, 0x00005A72, 0x00000B86,\n    0x000500C4, 0x00000017, 0x00005E07, 0x000019B5, 0x00000575, 0x000500C5,\n    0x00000017, 0x000044D5, 0x00004659, 0x00005E07, 0x000500C4, 0x00000017,\n    0x00001BC7, 0x000044D5, 0x00000B86, 0x000500C5, 0x00000017, 0x00003E88,\n    0x000044D5, 0x00001BC7, 0x000500C4, 0x00000017, 0x00005C8D, 0x00003E88,\n    0x00000BBC, 0x000500C5, 0x00000017, 0x0000428B, 0x00003E88, 0x00005C8D,\n    0x00060041, 0x00000294, 0x0000556B, 0x0000140E, 0x00000A0B, 0x000021F1,\n    0x0003003E, 0x0000556B, 0x0000428B, 0x00050080, 0x0000000B, 0x00002156,\n    0x000038F6, 0x00000A3A, 0x000500C2, 0x0000000B, 0x00001A53, 0x00002156,\n    0x00000A17, 0x0009004F, 0x00000017, 0x00004160, 0x000041CC, 0x000000C8,\n    0x00000000, 0x00000000, 0x00000002, 0x00000002, 0x000500C2, 0x00000017,\n    0x0000233E, 0x00004160, 0x0000011F, 0x000500C7, 0x00000017, 0x00001EE5,\n    0x0000233E, 0x00000B86, 0x000500C4, 0x00000017, 0x00006048, 0x00001EE5,\n    0x0000013D, 0x000500C2, 0x00000017, 0x00005840, 0x00004160, 0x000001F7,\n    0x000500C7, 0x00000017, 0x0000546E, 0x00005840, 0x00000B86, 0x000500C4,\n    0x00000017, 0x00005DE6, 0x0000546E, 0x0000049D, 0x000500C5, 0x00000017,\n    0x0000465A, 0x00006048, 0x00005DE6, 0x000500C2, 0x00000017, 0x00005A73,\n    0x00004160, 0x000000E9, 0x000500C7, 0x00000017, 0x000019B6, 0x00005A73,\n    0x00000B86, 0x000500C4, 0x00000017, 0x00005DE7, 0x000019B6, 0x00000065,\n    0x000500C5, 0x00000017, 0x0000465B, 0x0000465A, 0x00005DE7, 0x000500C2,\n    0x00000017, 0x00005A74, 0x00004160, 0x000001C1, 0x000500C7, 0x00000017,\n    0x000019B7, 0x00005A74, 0x00000B86, 0x000500C4, 0x00000017, 0x00005DE8,\n    0x000019B7, 0x000003C5, 0x000500C5, 0x00000017, 0x0000465C, 0x0000465B,\n    0x00005DE8, 0x000500C2, 0x00000017, 0x00005A83, 0x00004160, 0x000000B3,\n    0x000500C7, 0x00000017, 0x000018CC, 0x00005A83, 0x00000B86, 0x000500C5,\n    0x00000017, 0x00004047, 0x0000465C, 0x000018CC, 0x000500C2, 0x00000017,\n    0x00005747, 0x00004160, 0x0000018B, 0x000500C7, 0x00000017, 0x000019B8,\n    0x00005747, 0x00000B86, 0x000500C4, 0x00000017, 0x00005DE9, 0x000019B8,\n    0x000002ED, 0x000500C5, 0x00000017, 0x0000465D, 0x00004047, 0x00005DE9,\n    0x000500C2, 0x00000017, 0x00005A75, 0x00004160, 0x0000007D, 0x000500C7,\n    0x00000017, 0x000019B9, 0x00005A75, 0x00000B86, 0x000500C4, 0x00000017,\n    0x00005DEA, 0x000019B9, 0x00000215, 0x000500C5, 0x00000017, 0x0000465E,\n    0x0000465D, 0x00005DEA, 0x000500C2, 0x00000017, 0x00005A76, 0x00004160,\n    0x00000155, 0x000500C7, 0x00000017, 0x000019BA, 0x00005A76, 0x00000B86,\n    0x000500C4, 0x00000017, 0x00005E08, 0x000019BA, 0x00000575, 0x000500C5,\n    0x00000017, 0x000044D6, 0x0000465E, 0x00005E08, 0x000500C4, 0x00000017,\n    0x00001BC8, 0x000044D6, 0x00000B86, 0x000500C5, 0x00000017, 0x00003E89,\n    0x000044D6, 0x00001BC8, 0x000500C4, 0x00000017, 0x00005C8E, 0x00003E89,\n    0x00000BBC, 0x000500C5, 0x00000017, 0x0000428C, 0x00003E89, 0x00005C8E,\n    0x00060041, 0x00000294, 0x000051EE, 0x0000140E, 0x00000A0B, 0x00001A53,\n    0x0003003E, 0x000051EE, 0x0000428C, 0x00050051, 0x0000000B, 0x00003220,\n    0x000043C0, 0x00000001, 0x00050080, 0x0000000B, 0x00005AC0, 0x00003220,\n    0x00000A0E, 0x000500B0, 0x00000009, 0x00004411, 0x00005AC0, 0x000019C2,\n    0x000300F7, 0x00001C27, 0x00000002, 0x000400FA, 0x00004411, 0x000050C9,\n    0x00001C27, 0x000200F8, 0x000050C9, 0x00050080, 0x0000000B, 0x000035F4,\n    0x000038F6, 0x0000578C, 0x00050051, 0x0000000B, 0x00002830, 0x00002AAC,\n    0x00000000, 0x00050051, 0x0000000B, 0x00002744, 0x00002AAC, 0x00000002,\n    0x00050051, 0x0000000B, 0x00001DD9, 0x000041CC, 0x00000000, 0x00050051,\n    0x0000000B, 0x000026FC, 0x000041CC, 0x00000002, 0x00070050, 0x00000017,\n    0x00004472, 0x00002830, 0x00002744, 0x00001DD9, 0x000026FC, 0x000500C2,\n    0x00000017, 0x00002586, 0x00004472, 0x000002ED, 0x000500C2, 0x0000000B,\n    0x00002507, 0x000035F4, 0x00000A17, 0x0009004F, 0x00000017, 0x000060BE,\n    0x00002586, 0x000000C8, 0x00000000, 0x00000000, 0x00000001, 0x00000001,\n    0x000500C2, 0x00000017, 0x0000233F, 0x000060BE, 0x0000011F, 0x000500C7,\n    0x00000017, 0x00001EE6, 0x0000233F, 0x00000B86, 0x000500C4, 0x00000017,\n    0x00006049, 0x00001EE6, 0x0000013D, 0x000500C2, 0x00000017, 0x00005841,\n    0x000060BE, 0x000001F7, 0x000500C7, 0x00000017, 0x0000546F, 0x00005841,\n    0x00000B86, 0x000500C4, 0x00000017, 0x00005DEB, 0x0000546F, 0x0000049D,\n    0x000500C5, 0x00000017, 0x0000465F, 0x00006049, 0x00005DEB, 0x000500C2,\n    0x00000017, 0x00005A77, 0x000060BE, 0x000000E9, 0x000500C7, 0x00000017,\n    0x000019BB, 0x00005A77, 0x00000B86, 0x000500C4, 0x00000017, 0x00005DEC,\n    0x000019BB, 0x00000065, 0x000500C5, 0x00000017, 0x00004660, 0x0000465F,\n    0x00005DEC, 0x000500C2, 0x00000017, 0x00005A78, 0x000060BE, 0x000001C1,\n    0x000500C7, 0x00000017, 0x000019BC, 0x00005A78, 0x00000B86, 0x000500C4,\n    0x00000017, 0x00005DED, 0x000019BC, 0x000003C5, 0x000500C5, 0x00000017,\n    0x00004661, 0x00004660, 0x00005DED, 0x000500C2, 0x00000017, 0x00005A84,\n    0x000060BE, 0x000000B3, 0x000500C7, 0x00000017, 0x000018CD, 0x00005A84,\n    0x00000B86, 0x000500C5, 0x00000017, 0x00004048, 0x00004661, 0x000018CD,\n    0x000500C2, 0x00000017, 0x00005748, 0x000060BE, 0x0000018B, 0x000500C7,\n    0x00000017, 0x000019BD, 0x00005748, 0x00000B86, 0x000500C4, 0x00000017,\n    0x00005DEE, 0x000019BD, 0x000002ED, 0x000500C5, 0x00000017, 0x00004662,\n    0x00004048, 0x00005DEE, 0x000500C2, 0x00000017, 0x00005A79, 0x000060BE,\n    0x0000007D, 0x000500C7, 0x00000017, 0x000019BE, 0x00005A79, 0x00000B86,\n    0x000500C4, 0x00000017, 0x00005DEF, 0x000019BE, 0x00000215, 0x000500C5,\n    0x00000017, 0x00004663, 0x00004662, 0x00005DEF, 0x000500C2, 0x00000017,\n    0x00005A7A, 0x000060BE, 0x00000155, 0x000500C7, 0x00000017, 0x000019BF,\n    0x00005A7A, 0x00000B86, 0x000500C4, 0x00000017, 0x00005E09, 0x000019BF,\n    0x00000575, 0x000500C5, 0x00000017, 0x000044D7, 0x00004663, 0x00005E09,\n    0x000500C4, 0x00000017, 0x00001BC9, 0x000044D7, 0x00000B86, 0x000500C5,\n    0x00000017, 0x00003E8A, 0x000044D7, 0x00001BC9, 0x000500C4, 0x00000017,\n    0x00005C8F, 0x00003E8A, 0x00000BBC, 0x000500C5, 0x00000017, 0x0000428D,\n    0x00003E8A, 0x00005C8F, 0x00060041, 0x00000294, 0x0000556C, 0x0000140E,\n    0x00000A0B, 0x00002507, 0x0003003E, 0x0000556C, 0x0000428D, 0x00050080,\n    0x0000000B, 0x00002157, 0x000035F4, 0x00000A3A, 0x000500C2, 0x0000000B,\n    0x00001A54, 0x00002157, 0x00000A17, 0x0009004F, 0x00000017, 0x00004161,\n    0x00002586, 0x000000C8, 0x00000002, 0x00000002, 0x00000003, 0x00000003,\n    0x000500C2, 0x00000017, 0x00002340, 0x00004161, 0x0000011F, 0x000500C7,\n    0x00000017, 0x00001EE7, 0x00002340, 0x00000B86, 0x000500C4, 0x00000017,\n    0x0000604A, 0x00001EE7, 0x0000013D, 0x000500C2, 0x00000017, 0x00005842,\n    0x00004161, 0x000001F7, 0x000500C7, 0x00000017, 0x00005470, 0x00005842,\n    0x00000B86, 0x000500C4, 0x00000017, 0x00005DF0, 0x00005470, 0x0000049D,\n    0x000500C5, 0x00000017, 0x00004664, 0x0000604A, 0x00005DF0, 0x000500C2,\n    0x00000017, 0x00005A7B, 0x00004161, 0x000000E9, 0x000500C7, 0x00000017,\n    0x000019C0, 0x00005A7B, 0x00000B86, 0x000500C4, 0x00000017, 0x00005DF1,\n    0x000019C0, 0x00000065, 0x000500C5, 0x00000017, 0x00004665, 0x00004664,\n    0x00005DF1, 0x000500C2, 0x00000017, 0x00005A7C, 0x00004161, 0x000001C1,\n    0x000500C7, 0x00000017, 0x000019C1, 0x00005A7C, 0x00000B86, 0x000500C4,\n    0x00000017, 0x00005DF2, 0x000019C1, 0x000003C5, 0x000500C5, 0x00000017,\n    0x00004666, 0x00004665, 0x00005DF2, 0x000500C2, 0x00000017, 0x00005A85,\n    0x00004161, 0x000000B3, 0x000500C7, 0x00000017, 0x000018CE, 0x00005A85,\n    0x00000B86, 0x000500C5, 0x00000017, 0x00004049, 0x00004666, 0x000018CE,\n    0x000500C2, 0x00000017, 0x00005749, 0x00004161, 0x0000018B, 0x000500C7,\n    0x00000017, 0x000019C3, 0x00005749, 0x00000B86, 0x000500C4, 0x00000017,\n    0x00005DF3, 0x000019C3, 0x000002ED, 0x000500C5, 0x00000017, 0x00004667,\n    0x00004049, 0x00005DF3, 0x000500C2, 0x00000017, 0x00005A7D, 0x00004161,\n    0x0000007D, 0x000500C7, 0x00000017, 0x000019C4, 0x00005A7D, 0x00000B86,\n    0x000500C4, 0x00000017, 0x00005DF4, 0x000019C4, 0x00000215, 0x000500C5,\n    0x00000017, 0x00004668, 0x00004667, 0x00005DF4, 0x000500C2, 0x00000017,\n    0x00005A7E, 0x00004161, 0x00000155, 0x000500C7, 0x00000017, 0x000019C5,\n    0x00005A7E, 0x00000B86, 0x000500C4, 0x00000017, 0x00005E0A, 0x000019C5,\n    0x00000575, 0x000500C5, 0x00000017, 0x000044D8, 0x00004668, 0x00005E0A,\n    0x000500C4, 0x00000017, 0x00001BCA, 0x000044D8, 0x00000B86, 0x000500C5,\n    0x00000017, 0x00003E8B, 0x000044D8, 0x00001BCA, 0x000500C4, 0x00000017,\n    0x00005C90, 0x00003E8B, 0x00000BBC, 0x000500C5, 0x00000017, 0x0000428E,\n    0x00003E8B, 0x00005C90, 0x00060041, 0x00000294, 0x0000556D, 0x0000140E,\n    0x00000A0B, 0x00001A54, 0x0003003E, 0x0000556D, 0x0000428E, 0x00050080,\n    0x0000000B, 0x000039F8, 0x00003220, 0x00000A11, 0x000500B0, 0x00000009,\n    0x00002E0B, 0x000039F8, 0x000019C2, 0x000300F7, 0x00001C26, 0x00000002,\n    0x000400FA, 0x00002E0B, 0x0000592C, 0x00001C26, 0x000200F8, 0x0000592C,\n    0x00050080, 0x0000000B, 0x000033F0, 0x000035F4, 0x0000578C, 0x000500C2,\n    0x0000000B, 0x00003A92, 0x000033F0, 0x00000A17, 0x0009004F, 0x00000017,\n    0x00004162, 0x00002AAC, 0x000000C8, 0x00000001, 0x00000001, 0x00000003,\n    0x00000003, 0x000500C2, 0x00000017, 0x00002341, 0x00004162, 0x0000011F,\n    0x000500C7, 0x00000017, 0x00001EE8, 0x00002341, 0x00000B86, 0x000500C4,\n    0x00000017, 0x0000604B, 0x00001EE8, 0x0000013D, 0x000500C2, 0x00000017,\n    0x00005843, 0x00004162, 0x000001F7, 0x000500C7, 0x00000017, 0x00005471,\n    0x00005843, 0x00000B86, 0x000500C4, 0x00000017, 0x00005DF5, 0x00005471,\n    0x0000049D, 0x000500C5, 0x00000017, 0x00004669, 0x0000604B, 0x00005DF5,\n    0x000500C2, 0x00000017, 0x00005A7F, 0x00004162, 0x000000E9, 0x000500C7,\n    0x00000017, 0x000019C6, 0x00005A7F, 0x00000B86, 0x000500C4, 0x00000017,\n    0x00005DF6, 0x000019C6, 0x00000065, 0x000500C5, 0x00000017, 0x0000466A,\n    0x00004669, 0x00005DF6, 0x000500C2, 0x00000017, 0x00005A80, 0x00004162,\n    0x000001C1, 0x000500C7, 0x00000017, 0x000019C7, 0x00005A80, 0x00000B86,\n    0x000500C4, 0x00000017, 0x00005DF7, 0x000019C7, 0x000003C5, 0x000500C5,\n    0x00000017, 0x0000466B, 0x0000466A, 0x00005DF7, 0x000500C2, 0x00000017,\n    0x00005A86, 0x00004162, 0x000000B3, 0x000500C7, 0x00000017, 0x000018CF,\n    0x00005A86, 0x00000B86, 0x000500C5, 0x00000017, 0x0000404A, 0x0000466B,\n    0x000018CF, 0x000500C2, 0x00000017, 0x0000574A, 0x00004162, 0x0000018B,\n    0x000500C7, 0x00000017, 0x000019C8, 0x0000574A, 0x00000B86, 0x000500C4,\n    0x00000017, 0x00005DF8, 0x000019C8, 0x000002ED, 0x000500C5, 0x00000017,\n    0x0000466C, 0x0000404A, 0x00005DF8, 0x000500C2, 0x00000017, 0x00005A81,\n    0x00004162, 0x0000007D, 0x000500C7, 0x00000017, 0x000019C9, 0x00005A81,\n    0x00000B86, 0x000500C4, 0x00000017, 0x00005DF9, 0x000019C9, 0x00000215,\n    0x000500C5, 0x00000017, 0x0000466D, 0x0000466C, 0x00005DF9, 0x000500C2,\n    0x00000017, 0x00005A87, 0x00004162, 0x00000155, 0x000500C7, 0x00000017,\n    0x000019CA, 0x00005A87, 0x00000B86, 0x000500C4, 0x00000017, 0x00005E0B,\n    0x000019CA, 0x00000575, 0x000500C5, 0x00000017, 0x000044D9, 0x0000466D,\n    0x00005E0B, 0x000500C4, 0x00000017, 0x00001BCB, 0x000044D9, 0x00000B86,\n    0x000500C5, 0x00000017, 0x00003E8C, 0x000044D9, 0x00001BCB, 0x000500C4,\n    0x00000017, 0x00005C91, 0x00003E8C, 0x00000BBC, 0x000500C5, 0x00000017,\n    0x0000428F, 0x00003E8C, 0x00005C91, 0x00060041, 0x00000294, 0x0000556E,\n    0x0000140E, 0x00000A0B, 0x00003A92, 0x0003003E, 0x0000556E, 0x0000428F,\n    0x00050080, 0x0000000B, 0x00002158, 0x000033F0, 0x00000A3A, 0x000500C2,\n    0x0000000B, 0x00001A55, 0x00002158, 0x00000A17, 0x0009004F, 0x00000017,\n    0x00004163, 0x000041CC, 0x000000C8, 0x00000001, 0x00000001, 0x00000003,\n    0x00000003, 0x000500C2, 0x00000017, 0x00002342, 0x00004163, 0x0000011F,\n    0x000500C7, 0x00000017, 0x00001EE9, 0x00002342, 0x00000B86, 0x000500C4,\n    0x00000017, 0x0000604C, 0x00001EE9, 0x0000013D, 0x000500C2, 0x00000017,\n    0x00005844, 0x00004163, 0x000001F7, 0x000500C7, 0x00000017, 0x00005472,\n    0x00005844, 0x00000B86, 0x000500C4, 0x00000017, 0x00005DFA, 0x00005472,\n    0x0000049D, 0x000500C5, 0x00000017, 0x0000466E, 0x0000604C, 0x00005DFA,\n    0x000500C2, 0x00000017, 0x00005A88, 0x00004163, 0x000000E9, 0x000500C7,\n    0x00000017, 0x000019CB, 0x00005A88, 0x00000B86, 0x000500C4, 0x00000017,\n    0x00005DFB, 0x000019CB, 0x00000065, 0x000500C5, 0x00000017, 0x0000466F,\n    0x0000466E, 0x00005DFB, 0x000500C2, 0x00000017, 0x00005A89, 0x00004163,\n    0x000001C1, 0x000500C7, 0x00000017, 0x000019CC, 0x00005A89, 0x00000B86,\n    0x000500C4, 0x00000017, 0x00005DFC, 0x000019CC, 0x000003C5, 0x000500C5,\n    0x00000017, 0x00004670, 0x0000466F, 0x00005DFC, 0x000500C2, 0x00000017,\n    0x00005A8A, 0x00004163, 0x000000B3, 0x000500C7, 0x00000017, 0x000018D0,\n    0x00005A8A, 0x00000B86, 0x000500C5, 0x00000017, 0x0000404B, 0x00004670,\n    0x000018D0, 0x000500C2, 0x00000017, 0x0000574B, 0x00004163, 0x0000018B,\n    0x000500C7, 0x00000017, 0x000019CD, 0x0000574B, 0x00000B86, 0x000500C4,\n    0x00000017, 0x00005DFD, 0x000019CD, 0x000002ED, 0x000500C5, 0x00000017,\n    0x00004671, 0x0000404B, 0x00005DFD, 0x000500C2, 0x00000017, 0x00005A8B,\n    0x00004163, 0x0000007D, 0x000500C7, 0x00000017, 0x000019CE, 0x00005A8B,\n    0x00000B86, 0x000500C4, 0x00000017, 0x00005DFE, 0x000019CE, 0x00000215,\n    0x000500C5, 0x00000017, 0x00004672, 0x00004671, 0x00005DFE, 0x000500C2,\n    0x00000017, 0x00005A8C, 0x00004163, 0x00000155, 0x000500C7, 0x00000017,\n    0x000019CF, 0x00005A8C, 0x00000B86, 0x000500C4, 0x00000017, 0x00005E0C,\n    0x000019CF, 0x00000575, 0x000500C5, 0x00000017, 0x000044DA, 0x00004672,\n    0x00005E0C, 0x000500C4, 0x00000017, 0x00001BCC, 0x000044DA, 0x00000B86,\n    0x000500C5, 0x00000017, 0x00003E8D, 0x000044DA, 0x00001BCC, 0x000500C4,\n    0x00000017, 0x00005C92, 0x00003E8D, 0x00000BBC, 0x000500C5, 0x00000017,\n    0x00004290, 0x00003E8D, 0x00005C92, 0x00060041, 0x00000294, 0x0000556F,\n    0x0000140E, 0x00000A0B, 0x00001A55, 0x0003003E, 0x0000556F, 0x00004290,\n    0x00050080, 0x0000000B, 0x000039F9, 0x00003220, 0x00000A14, 0x000500B0,\n    0x00000009, 0x00002E0C, 0x000039F9, 0x000019C2, 0x000300F7, 0x0000467D,\n    0x00000002, 0x000400FA, 0x00002E0C, 0x000050CA, 0x0000467D, 0x000200F8,\n    0x000050CA, 0x00050080, 0x0000000B, 0x000035F5, 0x000033F0, 0x0000578C,\n    0x00050051, 0x0000000B, 0x00002831, 0x00002AAC, 0x00000001, 0x00050051,\n    0x0000000B, 0x00002745, 0x00002AAC, 0x00000003, 0x00050051, 0x0000000B,\n    0x00001DDA, 0x000041CC, 0x00000001, 0x00050051, 0x0000000B, 0x000026FD,\n    0x000041CC, 0x00000003, 0x00070050, 0x00000017, 0x00004473, 0x00002831,\n    0x00002745, 0x00001DDA, 0x000026FD, 0x000500C2, 0x00000017, 0x00002587,\n    0x00004473, 0x000002ED, 0x000500C2, 0x0000000B, 0x00002508, 0x000035F5,\n    0x00000A17, 0x0009004F, 0x00000017, 0x000060BF, 0x00002587, 0x000000C8,\n    0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x000500C2, 0x00000017,\n    0x00002343, 0x000060BF, 0x0000011F, 0x000500C7, 0x00000017, 0x00001EEA,\n    0x00002343, 0x00000B86, 0x000500C4, 0x00000017, 0x0000604D, 0x00001EEA,\n    0x0000013D, 0x000500C2, 0x00000017, 0x00005845, 0x000060BF, 0x000001F7,\n    0x000500C7, 0x00000017, 0x00005473, 0x00005845, 0x00000B86, 0x000500C4,\n    0x00000017, 0x00005DFF, 0x00005473, 0x0000049D, 0x000500C5, 0x00000017,\n    0x00004673, 0x0000604D, 0x00005DFF, 0x000500C2, 0x00000017, 0x00005A8D,\n    0x000060BF, 0x000000E9, 0x000500C7, 0x00000017, 0x000019D0, 0x00005A8D,\n    0x00000B86, 0x000500C4, 0x00000017, 0x00005E00, 0x000019D0, 0x00000065,\n    0x000500C5, 0x00000017, 0x00004674, 0x00004673, 0x00005E00, 0x000500C2,\n    0x00000017, 0x00005A8E, 0x000060BF, 0x000001C1, 0x000500C7, 0x00000017,\n    0x000019D1, 0x00005A8E, 0x00000B86, 0x000500C4, 0x00000017, 0x00005E01,\n    0x000019D1, 0x000003C5, 0x000500C5, 0x00000017, 0x00004675, 0x00004674,\n    0x00005E01, 0x000500C2, 0x00000017, 0x00005A8F, 0x000060BF, 0x000000B3,\n    0x000500C7, 0x00000017, 0x000018D1, 0x00005A8F, 0x00000B86, 0x000500C5,\n    0x00000017, 0x0000404C, 0x00004675, 0x000018D1, 0x000500C2, 0x00000017,\n    0x0000574C, 0x000060BF, 0x0000018B, 0x000500C7, 0x00000017, 0x000019D2,\n    0x0000574C, 0x00000B86, 0x000500C4, 0x00000017, 0x00005E02, 0x000019D2,\n    0x000002ED, 0x000500C5, 0x00000017, 0x00004676, 0x0000404C, 0x00005E02,\n    0x000500C2, 0x00000017, 0x00005A90, 0x000060BF, 0x0000007D, 0x000500C7,\n    0x00000017, 0x000019D3, 0x00005A90, 0x00000B86, 0x000500C4, 0x00000017,\n    0x00005E03, 0x000019D3, 0x00000215, 0x000500C5, 0x00000017, 0x00004677,\n    0x00004676, 0x00005E03, 0x000500C2, 0x00000017, 0x00005A91, 0x000060BF,\n    0x00000155, 0x000500C7, 0x00000017, 0x000019D4, 0x00005A91, 0x00000B86,\n    0x000500C4, 0x00000017, 0x00005E0D, 0x000019D4, 0x00000575, 0x000500C5,\n    0x00000017, 0x000044DB, 0x00004677, 0x00005E0D, 0x000500C4, 0x00000017,\n    0x00001BCD, 0x000044DB, 0x00000B86, 0x000500C5, 0x00000017, 0x00003E8E,\n    0x000044DB, 0x00001BCD, 0x000500C4, 0x00000017, 0x00005C93, 0x00003E8E,\n    0x00000BBC, 0x000500C5, 0x00000017, 0x00004291, 0x00003E8E, 0x00005C93,\n    0x00060041, 0x00000294, 0x00005570, 0x0000140E, 0x00000A0B, 0x00002508,\n    0x0003003E, 0x00005570, 0x00004291, 0x00050080, 0x0000000B, 0x00002159,\n    0x000035F5, 0x00000A3A, 0x000500C2, 0x0000000B, 0x00001A56, 0x00002159,\n    0x00000A17, 0x0009004F, 0x00000017, 0x00004164, 0x00002587, 0x000000C8,\n    0x00000002, 0x00000002, 0x00000003, 0x00000003, 0x000500C2, 0x00000017,\n    0x00002344, 0x00004164, 0x0000011F, 0x000500C7, 0x00000017, 0x00001EEB,\n    0x00002344, 0x00000B86, 0x000500C4, 0x00000017, 0x0000604E, 0x00001EEB,\n    0x0000013D, 0x000500C2, 0x00000017, 0x00005846, 0x00004164, 0x000001F7,\n    0x000500C7, 0x00000017, 0x00005474, 0x00005846, 0x00000B86, 0x000500C4,\n    0x00000017, 0x00005E04, 0x00005474, 0x0000049D, 0x000500C5, 0x00000017,\n    0x00004678, 0x0000604E, 0x00005E04, 0x000500C2, 0x00000017, 0x00005A92,\n    0x00004164, 0x000000E9, 0x000500C7, 0x00000017, 0x000019D5, 0x00005A92,\n    0x00000B86, 0x000500C4, 0x00000017, 0x00005E05, 0x000019D5, 0x00000065,\n    0x000500C5, 0x00000017, 0x00004679, 0x00004678, 0x00005E05, 0x000500C2,\n    0x00000017, 0x00005A93, 0x00004164, 0x000001C1, 0x000500C7, 0x00000017,\n    0x000019D6, 0x00005A93, 0x00000B86, 0x000500C4, 0x00000017, 0x00005E06,\n    0x000019D6, 0x000003C5, 0x000500C5, 0x00000017, 0x0000467A, 0x00004679,\n    0x00005E06, 0x000500C2, 0x00000017, 0x00005A94, 0x00004164, 0x000000B3,\n    0x000500C7, 0x00000017, 0x000018D2, 0x00005A94, 0x00000B86, 0x000500C5,\n    0x00000017, 0x0000404D, 0x0000467A, 0x000018D2, 0x000500C2, 0x00000017,\n    0x0000574D, 0x00004164, 0x0000018B, 0x000500C7, 0x00000017, 0x000019D7,\n    0x0000574D, 0x00000B86, 0x000500C4, 0x00000017, 0x00005E0E, 0x000019D7,\n    0x000002ED, 0x000500C5, 0x00000017, 0x0000467B, 0x0000404D, 0x00005E0E,\n    0x000500C2, 0x00000017, 0x00005A95, 0x00004164, 0x0000007D, 0x000500C7,\n    0x00000017, 0x000019D8, 0x00005A95, 0x00000B86, 0x000500C4, 0x00000017,\n    0x00005E0F, 0x000019D8, 0x00000215, 0x000500C5, 0x00000017, 0x0000467C,\n    0x0000467B, 0x00005E0F, 0x000500C2, 0x00000017, 0x00005A96, 0x00004164,\n    0x00000155, 0x000500C7, 0x00000017, 0x000019D9, 0x00005A96, 0x00000B86,\n    0x000500C4, 0x00000017, 0x00005E10, 0x000019D9, 0x00000575, 0x000500C5,\n    0x00000017, 0x000044DC, 0x0000467C, 0x00005E10, 0x000500C4, 0x00000017,\n    0x00001BCE, 0x000044DC, 0x00000B86, 0x000500C5, 0x00000017, 0x00003E8F,\n    0x000044DC, 0x00001BCE, 0x000500C4, 0x00000017, 0x00005C94, 0x00003E8F,\n    0x00000BBC, 0x000500C5, 0x00000017, 0x00004292, 0x00003E8F, 0x00005C94,\n    0x00060041, 0x00000294, 0x00005E66, 0x0000140E, 0x00000A0B, 0x00001A56,\n    0x0003003E, 0x00005E66, 0x00004292, 0x000200F9, 0x0000467D, 0x000200F8,\n    0x0000467D, 0x000200F9, 0x00001C26, 0x000200F8, 0x00001C26, 0x000200F9,\n    0x00001C27, 0x000200F8, 0x00001C27, 0x000200F9, 0x00003A37, 0x000200F8,\n    0x00003A37, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_dxt5_rgba8_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25244\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n     %v4uint = OpTypeVector %uint 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v3uint = OpTypeVector %uint 3\n     %uint_3 = OpConstant %uint 3\n    %uint_13 = OpConstant %uint 13\n   %uint_248 = OpConstant %uint 248\n     %uint_7 = OpConstant %uint 7\n     %uint_9 = OpConstant %uint 9\n%uint_258048 = OpConstant %uint 258048\n    %uint_12 = OpConstant %uint 12\n     %uint_4 = OpConstant %uint 4\n%uint_260046848 = OpConstant %uint 260046848\n     %uint_5 = OpConstant %uint 5\n%uint_7340039 = OpConstant %uint 7340039\n     %uint_6 = OpConstant %uint 6\n  %uint_3072 = OpConstant %uint 3072\n%uint_1431655765 = OpConstant %uint 1431655765\n     %uint_1 = OpConstant %uint 1\n%uint_2863311530 = OpConstant %uint 2863311530\n     %uint_0 = OpConstant %uint 0\n     %uint_2 = OpConstant %uint 2\n         %77 = OpConstantComposite %v4uint %uint_0 %uint_2 %uint_4 %uint_6\n  %uint_1023 = OpConstant %uint 1023\n    %uint_16 = OpConstant %uint 16\n    %uint_10 = OpConstant %uint 10\n     %uint_8 = OpConstant %uint 8\n    %uint_20 = OpConstant %uint 20\n%uint_2396745 = OpConstant %uint 2396745\n%uint_4793490 = OpConstant %uint 4793490\n%uint_9586980 = OpConstant %uint 9586980\n%uint_14380470 = OpConstant %uint 14380470\n    %uint_24 = OpConstant %uint 24\n  %uint_1170 = OpConstant %uint 1170\n  %uint_2340 = OpConstant %uint 2340\n  %uint_2925 = OpConstant %uint 2925\n    %uint_64 = OpConstant %uint 64\n   %uint_512 = OpConstant %uint 512\n    %uint_15 = OpConstant %uint 15\n   %uint_255 = OpConstant %uint 255\n%uint_16711935 = OpConstant %uint 16711935\n%uint_4278255360 = OpConstant %uint 4278255360\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n      %int_3 = OpConstant %int 3\n      %int_2 = OpConstant %int 2\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %2587 = OpConstantComposite %v3uint %uint_1 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n       %2619 = OpConstantComposite %v3uint %uint_2 %uint_2 %uint_0\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n       %1903 = OpConstantComposite %v2uint %uint_0 %uint_8\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n        %413 = OpConstantComposite %v4uint %uint_24 %uint_16 %uint_8 %uint_0\n%uint_4278190080 = OpConstant %uint 4278190080\n    %uint_32 = OpConstant %uint 32\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n        %993 = OpConstantComposite %v2uint %uint_248 %uint_248\n       %1015 = OpConstantComposite %v2uint %uint_258048 %uint_258048\n       %2547 = OpConstantComposite %v2uint %uint_260046848 %uint_260046848\n       %1912 = OpConstantComposite %v2uint %uint_5 %uint_5\n        %503 = OpConstantComposite %v2uint %uint_7340039 %uint_7340039\n       %1933 = OpConstantComposite %v2uint %uint_6 %uint_6\n         %78 = OpConstantComposite %v2uint %uint_3072 %uint_3072\n       %2878 = OpConstantComposite %v4uint %uint_1431655765 %uint_1431655765 %uint_1431655765 %uint_1431655765\n       %2950 = OpConstantComposite %v4uint %uint_1 %uint_1 %uint_1 %uint_1\n       %2860 = OpConstantComposite %v4uint %uint_2863311530 %uint_2863311530 %uint_2863311530 %uint_2863311530\n       %1140 = OpConstantComposite %v2uint %uint_255 %uint_255\n         %47 = OpConstantComposite %v4uint %uint_3 %uint_3 %uint_3 %uint_3\n        %929 = OpConstantComposite %v4uint %uint_1023 %uint_1023 %uint_1023 %uint_1023\n        %425 = OpConstantComposite %v4uint %uint_10 %uint_10 %uint_10 %uint_10\n        %965 = OpConstantComposite %v4uint %uint_20 %uint_20 %uint_20 %uint_20\n       %2599 = OpConstantComposite %v4uint %uint_4278190080 %uint_4278190080 %uint_4278190080 %uint_4278190080\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %14903 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24540 = OpBitwiseAnd %uint %13606 %uint_1\n      %17270 = OpINotEqual %bool %24540 %uint_0\n      %12328 = OpBitwiseAnd %uint %13606 %uint_2\n      %17284 = OpINotEqual %bool %12328 %uint_0\n       %7856 = OpShiftRightLogical %uint %13606 %uint_2\n      %25058 = OpBitwiseAnd %uint %7856 %uint_3\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20158 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n      %22412 = OpLoad %uint %20158\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_7\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2587\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %14018 DontFlatten\n               OpBranchConditional %24679 %21992 %14018\n      %21992 = OpLabel\n               OpBranch %14903\n      %14018 = OpLabel\n      %17344 = OpShiftLeftLogical %v3uint %21387 %2619\n      %15489 = OpBitcast %v3int %17344\n      %18336 = OpCompositeExtract %int %15489 0\n       %9362 = OpIMul %int %18336 %int_4\n       %6362 = OpCompositeExtract %int %15489 2\n      %14505 = OpBitcast %int %6594\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %15489 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %22412\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %9362 %24535\n      %10404 = OpBitcast %uint %8258\n      %14582 = OpIAdd %uint %22411 %10404\n      %12308 = OpLogicalNot %bool %17270\n               OpSelectionMerge %15035 DontFlatten\n               OpBranchConditional %12308 %8377 %22376\n      %22376 = OpLabel\n               OpSelectionMerge %23536 DontFlatten\n               OpBranchConditional %17284 %24353 %23520\n      %23520 = OpLabel\n       %7964 = OpBitcast %v2int %17136\n      %22120 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %7964 1\n      %12089 = OpShiftRightArithmetic %int %14597 %int_5\n      %22400 = OpBitcast %int %22120\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %7964 0\n      %20423 = OpShiftRightArithmetic %int %25154 %int_5\n      %18864 = OpIAdd %int %7938 %20423\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25154 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17334 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17334 %uint_4\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25154 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20574 = OpBitwiseAnd %int %10425 %int_1\n      %21533 = OpShiftLeftLogical %int %20574 %int_1\n       %8890 = OpBitwiseXor %int %20766 %21533\n      %20598 = OpBitwiseAnd %int %14597 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6551\n       %7092 = OpShiftLeftLogical %int %21575 %int_11\n      %16219 = OpBitwiseOr %int %18430 %7092\n      %14958 = OpShiftRightArithmetic %int %24163 %int_4\n       %6328 = OpBitwiseAnd %int %14958 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %16219 %21630\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6329 = OpBitwiseAnd %int %14959 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24163 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %23536\n      %24353 = OpLabel\n      %25147 = OpBitcast %v3int %21387\n      %19476 = OpShiftRightLogical %uint %22408 %int_5\n      %18810 = OpShiftRightLogical %uint %22409 %int_4\n       %6782 = OpCompositeExtract %int %25147 2\n      %12090 = OpShiftRightArithmetic %int %6782 %int_2\n      %22401 = OpBitcast %int %18810\n       %7939 = OpIMul %int %12090 %22401\n      %25155 = OpCompositeExtract %int %25147 1\n      %19055 = OpShiftRightArithmetic %int %25155 %int_4\n      %11052 = OpIAdd %int %7939 %19055\n      %16898 = OpBitcast %int %19476\n      %14944 = OpIMul %int %11052 %16898\n      %25156 = OpCompositeExtract %int %25147 0\n      %20424 = OpShiftRightArithmetic %int %25156 %int_5\n      %18940 = OpIAdd %int %14944 %20424\n       %8797 = OpShiftLeftLogical %int %18940 %int_7\n      %11434 = OpBitwiseAnd %int %6782 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %25155 %int_1\n      %21364 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21364 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %25156 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17335 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17335 %uint_4\n      %13015 = OpShiftRightArithmetic %int %25155 %int_3\n       %9929 = OpBitwiseXor %int %13015 %12090\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %25156 %int_3\n      %20575 = OpBitwiseAnd %int %9616 %int_3\n      %21534 = OpShiftLeftLogical %int %16793 %int_1\n       %8891 = OpBitwiseXor %int %20575 %21534\n      %20599 = OpBitwiseAnd %int %25155 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6552\n       %7093 = OpShiftLeftLogical %int %16793 %int_11\n      %16220 = OpBitwiseOr %int %18431 %7093\n      %14960 = OpShiftRightArithmetic %int %24144 %int_4\n       %6330 = OpBitwiseAnd %int %14960 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %16220 %21632\n      %14961 = OpShiftRightArithmetic %int %24144 %int_5\n       %6331 = OpBitwiseAnd %int %14961 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24144 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %23536\n      %23536 = OpLabel\n      %10540 = OpPhi %uint %16870 %24353 %16869 %23520\n               OpBranch %15035\n       %8377 = OpLabel\n      %19885 = OpCompositeExtract %uint %21387 0\n      %11246 = OpCompositeExtract %uint %21387 1\n      %18801 = OpCompositeExtract %uint %21387 2\n      %14831 = OpIMul %uint %22409 %18801\n      %20322 = OpIAdd %uint %11246 %14831\n      %21676 = OpIMul %uint %22408 %20322\n      %20398 = OpIAdd %uint %19885 %21676\n      %11367 = OpShiftLeftLogical %uint %20398 %uint_4\n               OpBranch %15035\n      %15035 = OpLabel\n      %11376 = OpPhi %uint %11367 %8377 %10540 %23536\n      %18621 = OpIAdd %uint %11376 %24236\n      %15698 = OpShiftRightLogical %uint %18621 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15698\n       %7338 = OpLoad %v4uint %20399\n      %13760 = OpIEqual %bool %25058 %uint_1\n      %21366 = OpIEqual %bool %25058 %uint_2\n      %22150 = OpLogicalOr %bool %13760 %21366\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %7338 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %7338 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22649 = OpPhi %v4uint %7338 %15035 %16376 %10583\n      %19638 = OpIEqual %bool %25058 %uint_3\n      %15139 = OpLogicalOr %bool %21366 %19638\n               OpSelectionMerge %11720 None\n               OpBranchConditional %15139 %11064 %11720\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22649 %749\n      %15335 = OpShiftRightLogical %v4uint %22649 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %11720\n      %11720 = OpLabel\n      %19545 = OpPhi %v4uint %22649 %13411 %10728 %11064\n      %24377 = OpCompositeExtract %uint %19545 2\n      %15487 = OpShiftLeftLogical %uint %24377 %uint_3\n       %6481 = OpShiftRightLogical %uint %24377 %uint_13\n      %17264 = OpCompositeConstruct %v2uint %15487 %6481\n       %6430 = OpBitwiseAnd %v2uint %17264 %993\n      %20543 = OpShiftLeftLogical %uint %24377 %uint_7\n      %24164 = OpShiftRightLogical %uint %24377 %uint_9\n      %17283 = OpCompositeConstruct %v2uint %20543 %24164\n       %6295 = OpBitwiseAnd %v2uint %17283 %1015\n      %14170 = OpBitwiseOr %v2uint %6430 %6295\n      %23688 = OpShiftLeftLogical %uint %24377 %uint_12\n      %22551 = OpShiftRightLogical %uint %24377 %uint_4\n      %17285 = OpCompositeConstruct %v2uint %23688 %22551\n       %6257 = OpBitwiseAnd %v2uint %17285 %2547\n      %14611 = OpBitwiseOr %v2uint %14170 %6257\n      %22361 = OpShiftRightLogical %v2uint %14611 %1912\n       %6347 = OpBitwiseAnd %v2uint %22361 %503\n      %16454 = OpBitwiseOr %v2uint %14611 %6347\n      %22362 = OpShiftRightLogical %v2uint %16454 %1933\n      %23271 = OpBitwiseAnd %v2uint %22362 %78\n      %14671 = OpBitwiseOr %v2uint %16454 %23271\n      %19422 = OpCompositeExtract %uint %19545 3\n      %15440 = OpCompositeConstruct %v2uint %19422 %19422\n      %25137 = OpVectorShuffle %v4uint %15440 %15440 0 1 0 0\n      %11388 = OpBitwiseAnd %v4uint %25137 %2878\n      %24266 = OpShiftLeftLogical %v4uint %11388 %2950\n      %20653 = OpBitwiseAnd %v4uint %25137 %2860\n      %16599 = OpShiftRightLogical %v4uint %20653 %2950\n      %24000 = OpBitwiseOr %v4uint %24266 %16599\n      %19618 = OpBitwiseAnd %v4uint %24000 %2860\n      %18219 = OpShiftRightLogical %v4uint %19618 %2950\n      %14965 = OpBitwiseXor %v4uint %24000 %18219\n      %20727 = OpCompositeExtract %uint %14965 0\n      %20387 = OpVectorShuffle %v2uint %19545 %19545 0 0\n       %9028 = OpShiftRightLogical %v2uint %20387 %1903\n       %8732 = OpBitwiseAnd %v2uint %9028 %1140\n      %17507 = OpCompositeExtract %uint %19545 0\n      %10727 = OpShiftRightLogical %uint %17507 %uint_16\n       %9650 = OpCompositeExtract %uint %19545 1\n       %6238 = OpBitwiseAnd %uint %9650 %uint_255\n      %24078 = OpShiftLeftLogical %uint %6238 %uint_16\n      %16241 = OpBitwiseOr %uint %10727 %24078\n      %21939 = OpCompositeExtract %uint %8732 0\n      %10103 = OpCompositeExtract %uint %8732 1\n      %20099 = OpULessThanEqual %bool %21939 %10103\n               OpSelectionMerge %13867 None\n               OpBranchConditional %20099 %21920 %10640\n      %10640 = OpLabel\n      %17657 = OpBitwiseAnd %uint %16241 %uint_2396745\n      %23910 = OpBitwiseAnd %uint %16241 %uint_4793490\n      %22247 = OpShiftRightLogical %uint %23910 %uint_1\n      %24001 = OpBitwiseOr %uint %17657 %22247\n      %19599 = OpBitwiseAnd %uint %16241 %uint_9586980\n      %20615 = OpShiftRightLogical %uint %19599 %uint_2\n      %24287 = OpBitwiseOr %uint %24001 %20615\n       %7721 = OpBitwiseXor %uint %24287 %uint_2396745\n       %9540 = OpNot %uint %22247\n      %14621 = OpBitwiseAnd %uint %17657 %9540\n       %8425 = OpNot %uint %20615\n      %11407 = OpBitwiseAnd %uint %14621 %8425\n       %6799 = OpBitwiseOr %uint %16241 %7721\n      %19509 = OpISub %uint %6799 %uint_2396745\n      %14871 = OpBitwiseOr %uint %19509 %11407\n      %18152 = OpShiftLeftLogical %uint %11407 %uint_1\n      %16008 = OpBitwiseOr %uint %14871 %18152\n       %8118 = OpShiftLeftLogical %uint %11407 %uint_2\n       %7808 = OpBitwiseOr %uint %16008 %8118\n               OpBranch %13867\n      %21920 = OpLabel\n      %20079 = OpBitwiseAnd %uint %16241 %uint_4793490\n      %23948 = OpBitwiseAnd %uint %16241 %uint_9586980\n      %21844 = OpShiftRightLogical %uint %23948 %uint_1\n       %8133 = OpBitwiseAnd %uint %20079 %21844\n      %24609 = OpShiftLeftLogical %uint %8133 %uint_1\n      %22956 = OpShiftRightLogical %uint %8133 %uint_1\n      %18793 = OpBitwiseOr %uint %24609 %22956\n      %16049 = OpBitwiseOr %uint %8133 %18793\n      %18309 = OpBitwiseAnd %uint %16241 %uint_2396745\n      %14685 = OpBitwiseOr %uint %18309 %uint_14380470\n      %20403 = OpBitwiseAnd %uint %14685 %16049\n      %20539 = OpShiftRightLogical %uint %20079 %uint_1\n      %24922 = OpBitwiseOr %uint %18309 %20539\n      %21922 = OpShiftRightLogical %uint %23948 %uint_2\n      %22674 = OpBitwiseOr %uint %24922 %21922\n       %7722 = OpBitwiseXor %uint %22674 %uint_2396745\n       %9541 = OpNot %uint %20539\n      %14622 = OpBitwiseAnd %uint %18309 %9541\n       %8426 = OpNot %uint %21922\n      %11408 = OpBitwiseAnd %uint %14622 %8426\n       %6800 = OpBitwiseOr %uint %16241 %7722\n      %19510 = OpISub %uint %6800 %uint_2396745\n      %14872 = OpBitwiseOr %uint %19510 %11408\n      %18228 = OpShiftLeftLogical %uint %11408 %uint_2\n      %15354 = OpBitwiseOr %uint %14872 %18228\n      %12154 = OpNot %uint %16049\n      %18512 = OpBitwiseAnd %uint %15354 %12154\n       %6252 = OpBitwiseOr %uint %18512 %20403\n               OpBranch %13867\n      %13867 = OpLabel\n      %19143 = OpPhi %uint %6252 %21920 %7808 %10640\n      %23732 = OpShiftRightLogical %uint %14582 %int_4\n      %24822 = OpNot %uint %20727\n      %21236 = OpCompositeConstruct %v4uint %24822 %24822 %24822 %24822\n      %24040 = OpShiftRightLogical %v4uint %21236 %77\n      %23215 = OpBitwiseAnd %v4uint %24040 %47\n      %19127 = OpCompositeExtract %uint %14671 0\n      %24694 = OpCompositeConstruct %v4uint %19127 %19127 %19127 %19127\n      %24562 = OpIMul %v4uint %23215 %24694\n      %25211 = OpCompositeConstruct %v4uint %20727 %20727 %20727 %20727\n      %14397 = OpShiftRightLogical %v4uint %25211 %77\n      %23216 = OpBitwiseAnd %v4uint %14397 %47\n      %19128 = OpCompositeExtract %uint %14671 1\n       %6535 = OpCompositeConstruct %v4uint %19128 %19128 %19128 %19128\n      %16353 = OpIMul %v4uint %23216 %6535\n      %11267 = OpIAdd %v4uint %24562 %16353\n      %24766 = OpBitwiseAnd %v4uint %11267 %929\n       %9225 = OpUDiv %v4uint %24766 %47\n      %17608 = OpShiftLeftLogical %v4uint %9225 %749\n      %10961 = OpShiftRightLogical %v4uint %11267 %425\n      %13249 = OpBitwiseAnd %v4uint %10961 %929\n      %17312 = OpUDiv %v4uint %13249 %47\n      %16994 = OpShiftLeftLogical %v4uint %17312 %317\n       %6318 = OpBitwiseOr %v4uint %17608 %16994\n      %15344 = OpShiftRightLogical %v4uint %11267 %965\n      %24982 = OpUDiv %v4uint %15344 %47\n      %19482 = OpBitwiseOr %v4uint %6318 %24982\n               OpSelectionMerge %23551 None\n               OpBranchConditional %20099 %21921 %10467\n      %10467 = OpLabel\n       %8286 = OpNot %uint %19143\n      %15355 = OpBitwiseAnd %uint %8286 %uint_7\n      %17712 = OpIMul %uint %21939 %15355\n      %21975 = OpBitwiseAnd %uint %19143 %uint_7\n      %20390 = OpIMul %uint %10103 %21975\n      %19842 = OpIAdd %uint %17712 %20390\n      %13000 = OpUDiv %uint %19842 %uint_7\n      %23022 = OpShiftRightLogical %uint %8286 %uint_3\n       %8753 = OpBitwiseAnd %uint %23022 %uint_7\n      %15011 = OpIMul %uint %21939 %8753\n      %13283 = OpShiftRightLogical %uint %19143 %uint_3\n      %24957 = OpBitwiseAnd %uint %13283 %uint_7\n      %25194 = OpIMul %uint %10103 %24957\n      %19880 = OpIAdd %uint %15011 %25194\n      %12616 = OpUDiv %uint %19880 %uint_7\n       %8160 = OpShiftLeftLogical %uint %12616 %uint_8\n       %7553 = OpBitwiseOr %uint %13000 %8160\n      %21935 = OpShiftRightLogical %uint %8286 %uint_6\n      %17592 = OpBitwiseAnd %uint %21935 %uint_7\n      %15012 = OpIMul %uint %21939 %17592\n      %13284 = OpShiftRightLogical %uint %19143 %uint_6\n      %24958 = OpBitwiseAnd %uint %13284 %uint_7\n      %25195 = OpIMul %uint %10103 %24958\n      %19881 = OpIAdd %uint %15012 %25195\n      %12617 = OpUDiv %uint %19881 %uint_7\n       %8161 = OpShiftLeftLogical %uint %12617 %uint_16\n       %7554 = OpBitwiseOr %uint %7553 %8161\n      %21936 = OpShiftRightLogical %uint %8286 %uint_9\n      %17593 = OpBitwiseAnd %uint %21936 %uint_7\n      %15013 = OpIMul %uint %21939 %17593\n      %13285 = OpShiftRightLogical %uint %19143 %uint_9\n      %24959 = OpBitwiseAnd %uint %13285 %uint_7\n      %25196 = OpIMul %uint %10103 %24959\n      %19882 = OpIAdd %uint %15013 %25196\n      %12618 = OpUDiv %uint %19882 %uint_7\n       %9205 = OpShiftLeftLogical %uint %12618 %uint_24\n      %18040 = OpBitwiseOr %uint %7554 %9205\n               OpBranch %23551\n      %21921 = OpLabel\n      %20080 = OpBitwiseAnd %uint %19143 %uint_1170\n      %23949 = OpBitwiseAnd %uint %19143 %uint_2340\n      %21845 = OpShiftRightLogical %uint %23949 %uint_1\n       %8134 = OpBitwiseAnd %uint %20080 %21845\n      %24610 = OpShiftLeftLogical %uint %8134 %uint_1\n      %22957 = OpShiftRightLogical %uint %8134 %uint_1\n      %18812 = OpBitwiseOr %uint %24610 %22957\n      %15914 = OpBitwiseOr %uint %8134 %18812\n       %8459 = OpNot %uint %15914\n      %10082 = OpBitwiseAnd %uint %19143 %8459\n      %16300 = OpISub %uint %uint_2925 %10082\n      %17415 = OpBitwiseAnd %uint %16300 %8459\n      %16991 = OpBitwiseAnd %uint %17415 %uint_7\n      %13677 = OpIMul %uint %21939 %16991\n      %21976 = OpBitwiseAnd %uint %10082 %uint_7\n      %20391 = OpIMul %uint %10103 %21976\n      %19843 = OpIAdd %uint %13677 %20391\n      %13001 = OpUDiv %uint %19843 %uint_5\n      %23023 = OpShiftRightLogical %uint %17415 %uint_3\n       %8754 = OpBitwiseAnd %uint %23023 %uint_7\n      %15014 = OpIMul %uint %21939 %8754\n      %13286 = OpShiftRightLogical %uint %10082 %uint_3\n      %24960 = OpBitwiseAnd %uint %13286 %uint_7\n      %25197 = OpIMul %uint %10103 %24960\n      %19883 = OpIAdd %uint %15014 %25197\n      %12619 = OpUDiv %uint %19883 %uint_5\n       %8162 = OpShiftLeftLogical %uint %12619 %uint_8\n       %7555 = OpBitwiseOr %uint %13001 %8162\n      %21937 = OpShiftRightLogical %uint %17415 %uint_6\n      %17594 = OpBitwiseAnd %uint %21937 %uint_7\n      %15015 = OpIMul %uint %21939 %17594\n      %13287 = OpShiftRightLogical %uint %10082 %uint_6\n      %24961 = OpBitwiseAnd %uint %13287 %uint_7\n      %25198 = OpIMul %uint %10103 %24961\n      %19884 = OpIAdd %uint %15015 %25198\n      %12620 = OpUDiv %uint %19884 %uint_5\n       %8163 = OpShiftLeftLogical %uint %12620 %uint_16\n       %7556 = OpBitwiseOr %uint %7555 %8163\n      %21938 = OpShiftRightLogical %uint %17415 %uint_9\n      %17595 = OpBitwiseAnd %uint %21938 %uint_7\n      %15016 = OpIMul %uint %21939 %17595\n      %13288 = OpShiftRightLogical %uint %10082 %uint_9\n      %24962 = OpBitwiseAnd %uint %13288 %uint_7\n      %25199 = OpIMul %uint %10103 %24962\n      %19886 = OpIAdd %uint %15016 %25199\n      %12621 = OpUDiv %uint %19886 %uint_5\n       %8255 = OpShiftLeftLogical %uint %12621 %uint_24\n       %6688 = OpBitwiseOr %uint %7556 %8255\n      %20385 = OpBitwiseAnd %uint %19143 %15914\n      %17408 = OpBitwiseAnd %uint %20385 %uint_1\n      %19559 = OpBitwiseAnd %uint %20385 %uint_8\n      %24932 = OpShiftLeftLogical %uint %19559 %uint_5\n      %17083 = OpBitwiseOr %uint %17408 %24932\n      %20866 = OpBitwiseAnd %uint %20385 %uint_64\n      %23319 = OpShiftLeftLogical %uint %20866 %uint_10\n      %17084 = OpBitwiseOr %uint %17083 %23319\n      %20867 = OpBitwiseAnd %uint %20385 %uint_512\n      %22046 = OpShiftLeftLogical %uint %20867 %uint_15\n       %8311 = OpBitwiseOr %uint %17084 %22046\n      %10419 = OpIMul %uint %8311 %uint_255\n      %18432 = OpIAdd %uint %6688 %10419\n               OpBranch %23551\n      %23551 = OpLabel\n      %19718 = OpPhi %uint %18432 %21921 %18040 %10467\n      %13594 = OpCompositeConstruct %v4uint %19718 %19718 %19718 %19718\n      %17094 = OpShiftLeftLogical %v4uint %13594 %413\n      %21435 = OpBitwiseAnd %v4uint %17094 %2599\n      %12253 = OpBitwiseOr %v4uint %19482 %21435\n      %20165 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %23732\n               OpStore %20165 %12253\n      %12832 = OpCompositeExtract %uint %17344 1\n      %23232 = OpIAdd %uint %12832 %uint_1\n      %17425 = OpULessThan %bool %23232 %6594\n               OpSelectionMerge %9048 DontFlatten\n               OpBranchConditional %17425 %22828 %9048\n      %22828 = OpLabel\n      %15481 = OpIAdd %uint %14582 %22412\n      %14284 = OpShiftRightLogical %uint %15481 %int_4\n      %11878 = OpShiftRightLogical %uint %20727 %uint_8\n      %19204 = OpNot %uint %11878\n      %21237 = OpCompositeConstruct %v4uint %19204 %19204 %19204 %19204\n      %25009 = OpShiftRightLogical %v4uint %21237 %77\n      %14392 = OpBitwiseAnd %v4uint %25009 %47\n      %15567 = OpIMul %v4uint %14392 %24694\n      %21401 = OpCompositeConstruct %v4uint %11878 %11878 %11878 %11878\n      %15366 = OpShiftRightLogical %v4uint %21401 %77\n      %15304 = OpBitwiseAnd %v4uint %15366 %47\n       %7358 = OpIMul %v4uint %15304 %6535\n       %7457 = OpIAdd %v4uint %15567 %7358\n      %24767 = OpBitwiseAnd %v4uint %7457 %929\n       %9226 = OpUDiv %v4uint %24767 %47\n      %17609 = OpShiftLeftLogical %v4uint %9226 %749\n      %10962 = OpShiftRightLogical %v4uint %7457 %425\n      %13250 = OpBitwiseAnd %v4uint %10962 %929\n      %17313 = OpUDiv %v4uint %13250 %47\n      %16995 = OpShiftLeftLogical %v4uint %17313 %317\n       %6319 = OpBitwiseOr %v4uint %17609 %16995\n      %15345 = OpShiftRightLogical %v4uint %7457 %965\n      %23975 = OpUDiv %v4uint %15345 %47\n       %9523 = OpBitwiseOr %v4uint %6319 %23975\n      %23683 = OpShiftRightLogical %uint %19143 %uint_12\n               OpSelectionMerge %23552 None\n               OpBranchConditional %20099 %21923 %10468\n      %10468 = OpLabel\n       %8287 = OpNot %uint %23683\n      %15356 = OpBitwiseAnd %uint %8287 %uint_7\n      %17713 = OpIMul %uint %21939 %15356\n      %21977 = OpBitwiseAnd %uint %23683 %uint_7\n      %20392 = OpIMul %uint %10103 %21977\n      %19844 = OpIAdd %uint %17713 %20392\n      %13002 = OpUDiv %uint %19844 %uint_7\n      %23024 = OpShiftRightLogical %uint %8287 %uint_3\n       %8755 = OpBitwiseAnd %uint %23024 %uint_7\n      %15017 = OpIMul %uint %21939 %8755\n      %13289 = OpShiftRightLogical %uint %23683 %uint_3\n      %24963 = OpBitwiseAnd %uint %13289 %uint_7\n      %25200 = OpIMul %uint %10103 %24963\n      %19887 = OpIAdd %uint %15017 %25200\n      %12622 = OpUDiv %uint %19887 %uint_7\n       %8164 = OpShiftLeftLogical %uint %12622 %uint_8\n       %7557 = OpBitwiseOr %uint %13002 %8164\n      %21940 = OpShiftRightLogical %uint %8287 %uint_6\n      %17596 = OpBitwiseAnd %uint %21940 %uint_7\n      %15018 = OpIMul %uint %21939 %17596\n      %13290 = OpShiftRightLogical %uint %23683 %uint_6\n      %24964 = OpBitwiseAnd %uint %13290 %uint_7\n      %25201 = OpIMul %uint %10103 %24964\n      %19888 = OpIAdd %uint %15018 %25201\n      %12623 = OpUDiv %uint %19888 %uint_7\n       %8165 = OpShiftLeftLogical %uint %12623 %uint_16\n       %7558 = OpBitwiseOr %uint %7557 %8165\n      %21941 = OpShiftRightLogical %uint %8287 %uint_9\n      %17597 = OpBitwiseAnd %uint %21941 %uint_7\n      %15019 = OpIMul %uint %21939 %17597\n      %13291 = OpShiftRightLogical %uint %23683 %uint_9\n      %24965 = OpBitwiseAnd %uint %13291 %uint_7\n      %25202 = OpIMul %uint %10103 %24965\n      %19889 = OpIAdd %uint %15019 %25202\n      %12624 = OpUDiv %uint %19889 %uint_7\n       %9206 = OpShiftLeftLogical %uint %12624 %uint_24\n      %18041 = OpBitwiseOr %uint %7558 %9206\n               OpBranch %23552\n      %21923 = OpLabel\n      %20081 = OpBitwiseAnd %uint %23683 %uint_1170\n      %23950 = OpBitwiseAnd %uint %23683 %uint_2340\n      %21846 = OpShiftRightLogical %uint %23950 %uint_1\n       %8135 = OpBitwiseAnd %uint %20081 %21846\n      %24611 = OpShiftLeftLogical %uint %8135 %uint_1\n      %22958 = OpShiftRightLogical %uint %8135 %uint_1\n      %18813 = OpBitwiseOr %uint %24611 %22958\n      %15915 = OpBitwiseOr %uint %8135 %18813\n       %8460 = OpNot %uint %15915\n      %10083 = OpBitwiseAnd %uint %23683 %8460\n      %16301 = OpISub %uint %uint_2925 %10083\n      %17416 = OpBitwiseAnd %uint %16301 %8460\n      %16992 = OpBitwiseAnd %uint %17416 %uint_7\n      %13678 = OpIMul %uint %21939 %16992\n      %21978 = OpBitwiseAnd %uint %10083 %uint_7\n      %20393 = OpIMul %uint %10103 %21978\n      %19845 = OpIAdd %uint %13678 %20393\n      %13003 = OpUDiv %uint %19845 %uint_5\n      %23025 = OpShiftRightLogical %uint %17416 %uint_3\n       %8756 = OpBitwiseAnd %uint %23025 %uint_7\n      %15020 = OpIMul %uint %21939 %8756\n      %13292 = OpShiftRightLogical %uint %10083 %uint_3\n      %24966 = OpBitwiseAnd %uint %13292 %uint_7\n      %25203 = OpIMul %uint %10103 %24966\n      %19890 = OpIAdd %uint %15020 %25203\n      %12625 = OpUDiv %uint %19890 %uint_5\n       %8166 = OpShiftLeftLogical %uint %12625 %uint_8\n       %7559 = OpBitwiseOr %uint %13003 %8166\n      %21942 = OpShiftRightLogical %uint %17416 %uint_6\n      %17599 = OpBitwiseAnd %uint %21942 %uint_7\n      %15021 = OpIMul %uint %21939 %17599\n      %13293 = OpShiftRightLogical %uint %10083 %uint_6\n      %24967 = OpBitwiseAnd %uint %13293 %uint_7\n      %25204 = OpIMul %uint %10103 %24967\n      %19891 = OpIAdd %uint %15021 %25204\n      %12626 = OpUDiv %uint %19891 %uint_5\n       %8167 = OpShiftLeftLogical %uint %12626 %uint_16\n       %7560 = OpBitwiseOr %uint %7559 %8167\n      %21943 = OpShiftRightLogical %uint %17416 %uint_9\n      %17600 = OpBitwiseAnd %uint %21943 %uint_7\n      %15022 = OpIMul %uint %21939 %17600\n      %13294 = OpShiftRightLogical %uint %10083 %uint_9\n      %24968 = OpBitwiseAnd %uint %13294 %uint_7\n      %25205 = OpIMul %uint %10103 %24968\n      %19892 = OpIAdd %uint %15022 %25205\n      %12627 = OpUDiv %uint %19892 %uint_5\n       %8256 = OpShiftLeftLogical %uint %12627 %uint_24\n       %6689 = OpBitwiseOr %uint %7560 %8256\n      %20386 = OpBitwiseAnd %uint %23683 %15915\n      %17409 = OpBitwiseAnd %uint %20386 %uint_1\n      %19560 = OpBitwiseAnd %uint %20386 %uint_8\n      %24933 = OpShiftLeftLogical %uint %19560 %uint_5\n      %17085 = OpBitwiseOr %uint %17409 %24933\n      %20868 = OpBitwiseAnd %uint %20386 %uint_64\n      %23320 = OpShiftLeftLogical %uint %20868 %uint_10\n      %17086 = OpBitwiseOr %uint %17085 %23320\n      %20869 = OpBitwiseAnd %uint %20386 %uint_512\n      %22047 = OpShiftLeftLogical %uint %20869 %uint_15\n       %8312 = OpBitwiseOr %uint %17086 %22047\n      %10420 = OpIMul %uint %8312 %uint_255\n      %18433 = OpIAdd %uint %6689 %10420\n               OpBranch %23552\n      %23552 = OpLabel\n      %19719 = OpPhi %uint %18433 %21923 %18041 %10468\n      %13595 = OpCompositeConstruct %v4uint %19719 %19719 %19719 %19719\n      %17095 = OpShiftLeftLogical %v4uint %13595 %413\n      %21436 = OpBitwiseAnd %v4uint %17095 %2599\n      %12254 = OpBitwiseOr %v4uint %9523 %21436\n      %21058 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %14284\n               OpStore %21058 %12254\n      %14840 = OpIAdd %uint %12832 %uint_2\n      %11787 = OpULessThan %bool %14840 %6594\n               OpSelectionMerge %7205 DontFlatten\n               OpBranchConditional %11787 %12417 %7205\n      %12417 = OpLabel\n      %13240 = OpShiftRightLogical %uint %9650 %uint_8\n               OpSelectionMerge %12689 None\n               OpBranchConditional %20099 %21924 %10641\n      %10641 = OpLabel\n      %17658 = OpBitwiseAnd %uint %13240 %uint_2396745\n      %23911 = OpBitwiseAnd %uint %13240 %uint_4793490\n      %22248 = OpShiftRightLogical %uint %23911 %uint_1\n      %24002 = OpBitwiseOr %uint %17658 %22248\n      %19600 = OpBitwiseAnd %uint %13240 %uint_9586980\n      %20616 = OpShiftRightLogical %uint %19600 %uint_2\n      %24288 = OpBitwiseOr %uint %24002 %20616\n       %7723 = OpBitwiseXor %uint %24288 %uint_2396745\n       %9542 = OpNot %uint %22248\n      %14623 = OpBitwiseAnd %uint %17658 %9542\n       %8427 = OpNot %uint %20616\n      %11409 = OpBitwiseAnd %uint %14623 %8427\n       %6801 = OpBitwiseOr %uint %13240 %7723\n      %19511 = OpISub %uint %6801 %uint_2396745\n      %14873 = OpBitwiseOr %uint %19511 %11409\n      %18153 = OpShiftLeftLogical %uint %11409 %uint_1\n      %16009 = OpBitwiseOr %uint %14873 %18153\n       %8119 = OpShiftLeftLogical %uint %11409 %uint_2\n       %7809 = OpBitwiseOr %uint %16009 %8119\n               OpBranch %12689\n      %21924 = OpLabel\n      %20082 = OpBitwiseAnd %uint %13240 %uint_4793490\n      %23951 = OpBitwiseAnd %uint %13240 %uint_9586980\n      %21847 = OpShiftRightLogical %uint %23951 %uint_1\n       %8136 = OpBitwiseAnd %uint %20082 %21847\n      %24612 = OpShiftLeftLogical %uint %8136 %uint_1\n      %22959 = OpShiftRightLogical %uint %8136 %uint_1\n      %18794 = OpBitwiseOr %uint %24612 %22959\n      %16050 = OpBitwiseOr %uint %8136 %18794\n      %18310 = OpBitwiseAnd %uint %13240 %uint_2396745\n      %14686 = OpBitwiseOr %uint %18310 %uint_14380470\n      %20404 = OpBitwiseAnd %uint %14686 %16050\n      %20540 = OpShiftRightLogical %uint %20082 %uint_1\n      %24923 = OpBitwiseOr %uint %18310 %20540\n      %21925 = OpShiftRightLogical %uint %23951 %uint_2\n      %22675 = OpBitwiseOr %uint %24923 %21925\n       %7724 = OpBitwiseXor %uint %22675 %uint_2396745\n       %9543 = OpNot %uint %20540\n      %14624 = OpBitwiseAnd %uint %18310 %9543\n       %8428 = OpNot %uint %21925\n      %11410 = OpBitwiseAnd %uint %14624 %8428\n       %6802 = OpBitwiseOr %uint %13240 %7724\n      %19512 = OpISub %uint %6802 %uint_2396745\n      %14874 = OpBitwiseOr %uint %19512 %11410\n      %18229 = OpShiftLeftLogical %uint %11410 %uint_2\n      %15357 = OpBitwiseOr %uint %14874 %18229\n      %12155 = OpNot %uint %16050\n      %18513 = OpBitwiseAnd %uint %15357 %12155\n       %6253 = OpBitwiseOr %uint %18513 %20404\n               OpBranch %12689\n      %12689 = OpLabel\n       %9430 = OpPhi %uint %6253 %21924 %7809 %10641\n      %18789 = OpIMul %uint %uint_2 %22412\n      %14276 = OpIAdd %uint %14582 %18789\n      %17286 = OpShiftRightLogical %uint %14276 %int_4\n      %11879 = OpShiftRightLogical %uint %20727 %uint_16\n      %19205 = OpNot %uint %11879\n      %21238 = OpCompositeConstruct %v4uint %19205 %19205 %19205 %19205\n      %25010 = OpShiftRightLogical %v4uint %21238 %77\n      %14393 = OpBitwiseAnd %v4uint %25010 %47\n      %15568 = OpIMul %v4uint %14393 %24694\n      %21403 = OpCompositeConstruct %v4uint %11879 %11879 %11879 %11879\n      %15367 = OpShiftRightLogical %v4uint %21403 %77\n      %15305 = OpBitwiseAnd %v4uint %15367 %47\n       %7359 = OpIMul %v4uint %15305 %6535\n       %7458 = OpIAdd %v4uint %15568 %7359\n      %24768 = OpBitwiseAnd %v4uint %7458 %929\n       %9227 = OpUDiv %v4uint %24768 %47\n      %17610 = OpShiftLeftLogical %v4uint %9227 %749\n      %10963 = OpShiftRightLogical %v4uint %7458 %425\n      %13251 = OpBitwiseAnd %v4uint %10963 %929\n      %17314 = OpUDiv %v4uint %13251 %47\n      %16996 = OpShiftLeftLogical %v4uint %17314 %317\n       %6320 = OpBitwiseOr %v4uint %17610 %16996\n      %15346 = OpShiftRightLogical %v4uint %7458 %965\n      %24983 = OpUDiv %v4uint %15346 %47\n      %19483 = OpBitwiseOr %v4uint %6320 %24983\n               OpSelectionMerge %23553 None\n               OpBranchConditional %20099 %21926 %10469\n      %10469 = OpLabel\n       %8288 = OpNot %uint %9430\n      %15358 = OpBitwiseAnd %uint %8288 %uint_7\n      %17714 = OpIMul %uint %21939 %15358\n      %21979 = OpBitwiseAnd %uint %9430 %uint_7\n      %20394 = OpIMul %uint %10103 %21979\n      %19846 = OpIAdd %uint %17714 %20394\n      %13004 = OpUDiv %uint %19846 %uint_7\n      %23026 = OpShiftRightLogical %uint %8288 %uint_3\n       %8757 = OpBitwiseAnd %uint %23026 %uint_7\n      %15023 = OpIMul %uint %21939 %8757\n      %13295 = OpShiftRightLogical %uint %9430 %uint_3\n      %24969 = OpBitwiseAnd %uint %13295 %uint_7\n      %25206 = OpIMul %uint %10103 %24969\n      %19893 = OpIAdd %uint %15023 %25206\n      %12628 = OpUDiv %uint %19893 %uint_7\n       %8168 = OpShiftLeftLogical %uint %12628 %uint_8\n       %7561 = OpBitwiseOr %uint %13004 %8168\n      %21944 = OpShiftRightLogical %uint %8288 %uint_6\n      %17601 = OpBitwiseAnd %uint %21944 %uint_7\n      %15024 = OpIMul %uint %21939 %17601\n      %13296 = OpShiftRightLogical %uint %9430 %uint_6\n      %24970 = OpBitwiseAnd %uint %13296 %uint_7\n      %25207 = OpIMul %uint %10103 %24970\n      %19894 = OpIAdd %uint %15024 %25207\n      %12629 = OpUDiv %uint %19894 %uint_7\n       %8169 = OpShiftLeftLogical %uint %12629 %uint_16\n       %7562 = OpBitwiseOr %uint %7561 %8169\n      %21945 = OpShiftRightLogical %uint %8288 %uint_9\n      %17602 = OpBitwiseAnd %uint %21945 %uint_7\n      %15025 = OpIMul %uint %21939 %17602\n      %13297 = OpShiftRightLogical %uint %9430 %uint_9\n      %24971 = OpBitwiseAnd %uint %13297 %uint_7\n      %25208 = OpIMul %uint %10103 %24971\n      %19895 = OpIAdd %uint %15025 %25208\n      %12630 = OpUDiv %uint %19895 %uint_7\n       %9207 = OpShiftLeftLogical %uint %12630 %uint_24\n      %18042 = OpBitwiseOr %uint %7562 %9207\n               OpBranch %23553\n      %21926 = OpLabel\n      %20083 = OpBitwiseAnd %uint %9430 %uint_1170\n      %23952 = OpBitwiseAnd %uint %9430 %uint_2340\n      %21848 = OpShiftRightLogical %uint %23952 %uint_1\n       %8137 = OpBitwiseAnd %uint %20083 %21848\n      %24613 = OpShiftLeftLogical %uint %8137 %uint_1\n      %22960 = OpShiftRightLogical %uint %8137 %uint_1\n      %18814 = OpBitwiseOr %uint %24613 %22960\n      %15916 = OpBitwiseOr %uint %8137 %18814\n       %8461 = OpNot %uint %15916\n      %10084 = OpBitwiseAnd %uint %9430 %8461\n      %16302 = OpISub %uint %uint_2925 %10084\n      %17417 = OpBitwiseAnd %uint %16302 %8461\n      %16993 = OpBitwiseAnd %uint %17417 %uint_7\n      %13679 = OpIMul %uint %21939 %16993\n      %21980 = OpBitwiseAnd %uint %10084 %uint_7\n      %20395 = OpIMul %uint %10103 %21980\n      %19847 = OpIAdd %uint %13679 %20395\n      %13005 = OpUDiv %uint %19847 %uint_5\n      %23027 = OpShiftRightLogical %uint %17417 %uint_3\n       %8758 = OpBitwiseAnd %uint %23027 %uint_7\n      %15026 = OpIMul %uint %21939 %8758\n      %13298 = OpShiftRightLogical %uint %10084 %uint_3\n      %24972 = OpBitwiseAnd %uint %13298 %uint_7\n      %25209 = OpIMul %uint %10103 %24972\n      %19896 = OpIAdd %uint %15026 %25209\n      %12631 = OpUDiv %uint %19896 %uint_5\n       %8170 = OpShiftLeftLogical %uint %12631 %uint_8\n       %7563 = OpBitwiseOr %uint %13005 %8170\n      %21946 = OpShiftRightLogical %uint %17417 %uint_6\n      %17603 = OpBitwiseAnd %uint %21946 %uint_7\n      %15027 = OpIMul %uint %21939 %17603\n      %13299 = OpShiftRightLogical %uint %10084 %uint_6\n      %24973 = OpBitwiseAnd %uint %13299 %uint_7\n      %25210 = OpIMul %uint %10103 %24973\n      %19897 = OpIAdd %uint %15027 %25210\n      %12632 = OpUDiv %uint %19897 %uint_5\n       %8171 = OpShiftLeftLogical %uint %12632 %uint_16\n       %7564 = OpBitwiseOr %uint %7563 %8171\n      %21947 = OpShiftRightLogical %uint %17417 %uint_9\n      %17604 = OpBitwiseAnd %uint %21947 %uint_7\n      %15028 = OpIMul %uint %21939 %17604\n      %13300 = OpShiftRightLogical %uint %10084 %uint_9\n      %24974 = OpBitwiseAnd %uint %13300 %uint_7\n      %25212 = OpIMul %uint %10103 %24974\n      %19898 = OpIAdd %uint %15028 %25212\n      %12633 = OpUDiv %uint %19898 %uint_5\n       %8257 = OpShiftLeftLogical %uint %12633 %uint_24\n       %6690 = OpBitwiseOr %uint %7564 %8257\n      %20388 = OpBitwiseAnd %uint %9430 %15916\n      %17410 = OpBitwiseAnd %uint %20388 %uint_1\n      %19561 = OpBitwiseAnd %uint %20388 %uint_8\n      %24934 = OpShiftLeftLogical %uint %19561 %uint_5\n      %17087 = OpBitwiseOr %uint %17410 %24934\n      %20870 = OpBitwiseAnd %uint %20388 %uint_64\n      %23321 = OpShiftLeftLogical %uint %20870 %uint_10\n      %17088 = OpBitwiseOr %uint %17087 %23321\n      %20871 = OpBitwiseAnd %uint %20388 %uint_512\n      %22048 = OpShiftLeftLogical %uint %20871 %uint_15\n       %8313 = OpBitwiseOr %uint %17088 %22048\n      %10421 = OpIMul %uint %8313 %uint_255\n      %18434 = OpIAdd %uint %6690 %10421\n               OpBranch %23553\n      %23553 = OpLabel\n      %19720 = OpPhi %uint %18434 %21926 %18042 %10469\n      %13596 = OpCompositeConstruct %v4uint %19720 %19720 %19720 %19720\n      %17096 = OpShiftLeftLogical %v4uint %13596 %413\n      %21437 = OpBitwiseAnd %v4uint %17096 %2599\n      %12255 = OpBitwiseOr %v4uint %19483 %21437\n      %21059 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %17286\n               OpStore %21059 %12255\n      %14841 = OpIAdd %uint %12832 %uint_3\n      %11788 = OpULessThan %bool %14841 %6594\n               OpSelectionMerge %18021 DontFlatten\n               OpBranchConditional %11788 %20882 %18021\n      %20882 = OpLabel\n      %13198 = OpIMul %uint %uint_3 %22412\n      %13467 = OpIAdd %uint %14582 %13198\n      %17287 = OpShiftRightLogical %uint %13467 %int_4\n      %11881 = OpShiftRightLogical %uint %20727 %uint_24\n      %19206 = OpNot %uint %11881\n      %21239 = OpCompositeConstruct %v4uint %19206 %19206 %19206 %19206\n      %25011 = OpShiftRightLogical %v4uint %21239 %77\n      %14394 = OpBitwiseAnd %v4uint %25011 %47\n      %15569 = OpIMul %v4uint %14394 %24694\n      %21404 = OpCompositeConstruct %v4uint %11881 %11881 %11881 %11881\n      %15368 = OpShiftRightLogical %v4uint %21404 %77\n      %15306 = OpBitwiseAnd %v4uint %15368 %47\n       %7360 = OpIMul %v4uint %15306 %6535\n       %7459 = OpIAdd %v4uint %15569 %7360\n      %24769 = OpBitwiseAnd %v4uint %7459 %929\n       %9228 = OpUDiv %v4uint %24769 %47\n      %17611 = OpShiftLeftLogical %v4uint %9228 %749\n      %10964 = OpShiftRightLogical %v4uint %7459 %425\n      %13252 = OpBitwiseAnd %v4uint %10964 %929\n      %17315 = OpUDiv %v4uint %13252 %47\n      %16997 = OpShiftLeftLogical %v4uint %17315 %317\n       %6321 = OpBitwiseOr %v4uint %17611 %16997\n      %15347 = OpShiftRightLogical %v4uint %7459 %965\n      %23976 = OpUDiv %v4uint %15347 %47\n       %9524 = OpBitwiseOr %v4uint %6321 %23976\n      %23684 = OpShiftRightLogical %uint %9430 %uint_12\n               OpSelectionMerge %23554 None\n               OpBranchConditional %20099 %21927 %10470\n      %10470 = OpLabel\n       %8289 = OpNot %uint %23684\n      %15359 = OpBitwiseAnd %uint %8289 %uint_7\n      %17715 = OpIMul %uint %21939 %15359\n      %21981 = OpBitwiseAnd %uint %23684 %uint_7\n      %20396 = OpIMul %uint %10103 %21981\n      %19848 = OpIAdd %uint %17715 %20396\n      %13006 = OpUDiv %uint %19848 %uint_7\n      %23028 = OpShiftRightLogical %uint %8289 %uint_3\n       %8759 = OpBitwiseAnd %uint %23028 %uint_7\n      %15029 = OpIMul %uint %21939 %8759\n      %13301 = OpShiftRightLogical %uint %23684 %uint_3\n      %24975 = OpBitwiseAnd %uint %13301 %uint_7\n      %25213 = OpIMul %uint %10103 %24975\n      %19899 = OpIAdd %uint %15029 %25213\n      %12634 = OpUDiv %uint %19899 %uint_7\n       %8172 = OpShiftLeftLogical %uint %12634 %uint_8\n       %7565 = OpBitwiseOr %uint %13006 %8172\n      %21948 = OpShiftRightLogical %uint %8289 %uint_6\n      %17605 = OpBitwiseAnd %uint %21948 %uint_7\n      %15030 = OpIMul %uint %21939 %17605\n      %13302 = OpShiftRightLogical %uint %23684 %uint_6\n      %24976 = OpBitwiseAnd %uint %13302 %uint_7\n      %25214 = OpIMul %uint %10103 %24976\n      %19900 = OpIAdd %uint %15030 %25214\n      %12635 = OpUDiv %uint %19900 %uint_7\n       %8173 = OpShiftLeftLogical %uint %12635 %uint_16\n       %7566 = OpBitwiseOr %uint %7565 %8173\n      %21949 = OpShiftRightLogical %uint %8289 %uint_9\n      %17606 = OpBitwiseAnd %uint %21949 %uint_7\n      %15031 = OpIMul %uint %21939 %17606\n      %13303 = OpShiftRightLogical %uint %23684 %uint_9\n      %24977 = OpBitwiseAnd %uint %13303 %uint_7\n      %25215 = OpIMul %uint %10103 %24977\n      %19901 = OpIAdd %uint %15031 %25215\n      %12636 = OpUDiv %uint %19901 %uint_7\n       %9208 = OpShiftLeftLogical %uint %12636 %uint_24\n      %18043 = OpBitwiseOr %uint %7566 %9208\n               OpBranch %23554\n      %21927 = OpLabel\n      %20084 = OpBitwiseAnd %uint %23684 %uint_1170\n      %23953 = OpBitwiseAnd %uint %23684 %uint_2340\n      %21849 = OpShiftRightLogical %uint %23953 %uint_1\n       %8138 = OpBitwiseAnd %uint %20084 %21849\n      %24614 = OpShiftLeftLogical %uint %8138 %uint_1\n      %22961 = OpShiftRightLogical %uint %8138 %uint_1\n      %18815 = OpBitwiseOr %uint %24614 %22961\n      %15917 = OpBitwiseOr %uint %8138 %18815\n       %8462 = OpNot %uint %15917\n      %10085 = OpBitwiseAnd %uint %23684 %8462\n      %16303 = OpISub %uint %uint_2925 %10085\n      %17418 = OpBitwiseAnd %uint %16303 %8462\n      %16998 = OpBitwiseAnd %uint %17418 %uint_7\n      %13680 = OpIMul %uint %21939 %16998\n      %21982 = OpBitwiseAnd %uint %10085 %uint_7\n      %20397 = OpIMul %uint %10103 %21982\n      %19849 = OpIAdd %uint %13680 %20397\n      %13007 = OpUDiv %uint %19849 %uint_5\n      %23029 = OpShiftRightLogical %uint %17418 %uint_3\n       %8760 = OpBitwiseAnd %uint %23029 %uint_7\n      %15032 = OpIMul %uint %21939 %8760\n      %13304 = OpShiftRightLogical %uint %10085 %uint_3\n      %24978 = OpBitwiseAnd %uint %13304 %uint_7\n      %25216 = OpIMul %uint %10103 %24978\n      %19902 = OpIAdd %uint %15032 %25216\n      %12637 = OpUDiv %uint %19902 %uint_5\n       %8174 = OpShiftLeftLogical %uint %12637 %uint_8\n       %7567 = OpBitwiseOr %uint %13007 %8174\n      %21950 = OpShiftRightLogical %uint %17418 %uint_6\n      %17607 = OpBitwiseAnd %uint %21950 %uint_7\n      %15033 = OpIMul %uint %21939 %17607\n      %13305 = OpShiftRightLogical %uint %10085 %uint_6\n      %24979 = OpBitwiseAnd %uint %13305 %uint_7\n      %25217 = OpIMul %uint %10103 %24979\n      %19903 = OpIAdd %uint %15033 %25217\n      %12638 = OpUDiv %uint %19903 %uint_5\n       %8175 = OpShiftLeftLogical %uint %12638 %uint_16\n       %7568 = OpBitwiseOr %uint %7567 %8175\n      %21951 = OpShiftRightLogical %uint %17418 %uint_9\n      %17612 = OpBitwiseAnd %uint %21951 %uint_7\n      %15034 = OpIMul %uint %21939 %17612\n      %13306 = OpShiftRightLogical %uint %10085 %uint_9\n      %24980 = OpBitwiseAnd %uint %13306 %uint_7\n      %25218 = OpIMul %uint %10103 %24980\n      %19904 = OpIAdd %uint %15034 %25218\n      %12639 = OpUDiv %uint %19904 %uint_5\n       %8259 = OpShiftLeftLogical %uint %12639 %uint_24\n       %6691 = OpBitwiseOr %uint %7568 %8259\n      %20389 = OpBitwiseAnd %uint %23684 %15917\n      %17411 = OpBitwiseAnd %uint %20389 %uint_1\n      %19562 = OpBitwiseAnd %uint %20389 %uint_8\n      %24935 = OpShiftLeftLogical %uint %19562 %uint_5\n      %17089 = OpBitwiseOr %uint %17411 %24935\n      %20872 = OpBitwiseAnd %uint %20389 %uint_64\n      %23322 = OpShiftLeftLogical %uint %20872 %uint_10\n      %17090 = OpBitwiseOr %uint %17089 %23322\n      %20873 = OpBitwiseAnd %uint %20389 %uint_512\n      %22049 = OpShiftLeftLogical %uint %20873 %uint_15\n       %8314 = OpBitwiseOr %uint %17090 %22049\n      %10422 = OpIMul %uint %8314 %uint_255\n      %18435 = OpIAdd %uint %6691 %10422\n               OpBranch %23554\n      %23554 = OpLabel\n      %19721 = OpPhi %uint %18435 %21927 %18043 %10470\n      %13597 = OpCompositeConstruct %v4uint %19721 %19721 %19721 %19721\n      %17097 = OpShiftLeftLogical %v4uint %13597 %413\n      %21438 = OpBitwiseAnd %v4uint %17097 %2599\n      %12256 = OpBitwiseOr %v4uint %9524 %21438\n      %23357 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %17287\n               OpStore %23357 %12256\n               OpBranch %18021\n      %18021 = OpLabel\n               OpBranch %7205\n       %7205 = OpLabel\n               OpBranch %9048\n       %9048 = OpLabel\n      %22413 = OpIAdd %uint %14582 %uint_16\n               OpSelectionMerge %24688 DontFlatten\n               OpBranchConditional %17270 %7206 %21993\n      %21993 = OpLabel\n               OpBranch %24688\n       %7206 = OpLabel\n               OpBranch %24688\n      %24688 = OpLabel\n      %11377 = OpPhi %uint %uint_32 %7206 %uint_16 %21993\n      %18622 = OpIAdd %uint %18621 %11377\n      %15699 = OpShiftRightLogical %uint %18622 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15699\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %14875 None\n               OpBranchConditional %22150 %10584 %14875\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20654 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20654 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %14875\n      %14875 = OpLabel\n      %10924 = OpPhi %v4uint %14608 %24688 %16377 %10584\n               OpSelectionMerge %11721 None\n               OpBranchConditional %15139 %11065 %11721\n      %11065 = OpLabel\n      %24088 = OpShiftLeftLogical %v4uint %10924 %749\n      %15336 = OpShiftRightLogical %v4uint %10924 %749\n      %10729 = OpBitwiseOr %v4uint %24088 %15336\n               OpBranch %11721\n      %11721 = OpLabel\n      %19546 = OpPhi %v4uint %10924 %14875 %10729 %11065\n      %24378 = OpCompositeExtract %uint %19546 2\n      %15488 = OpShiftLeftLogical %uint %24378 %uint_3\n       %6482 = OpShiftRightLogical %uint %24378 %uint_13\n      %17265 = OpCompositeConstruct %v2uint %15488 %6482\n       %6431 = OpBitwiseAnd %v2uint %17265 %993\n      %20544 = OpShiftLeftLogical %uint %24378 %uint_7\n      %24165 = OpShiftRightLogical %uint %24378 %uint_9\n      %17288 = OpCompositeConstruct %v2uint %20544 %24165\n       %6296 = OpBitwiseAnd %v2uint %17288 %1015\n      %14171 = OpBitwiseOr %v2uint %6431 %6296\n      %23689 = OpShiftLeftLogical %uint %24378 %uint_12\n      %22552 = OpShiftRightLogical %uint %24378 %uint_4\n      %17289 = OpCompositeConstruct %v2uint %23689 %22552\n       %6258 = OpBitwiseAnd %v2uint %17289 %2547\n      %14612 = OpBitwiseOr %v2uint %14171 %6258\n      %22363 = OpShiftRightLogical %v2uint %14612 %1912\n       %6348 = OpBitwiseAnd %v2uint %22363 %503\n      %16455 = OpBitwiseOr %v2uint %14612 %6348\n      %22364 = OpShiftRightLogical %v2uint %16455 %1933\n      %23272 = OpBitwiseAnd %v2uint %22364 %78\n      %14672 = OpBitwiseOr %v2uint %16455 %23272\n      %19423 = OpCompositeExtract %uint %19546 3\n      %15441 = OpCompositeConstruct %v2uint %19423 %19423\n      %25138 = OpVectorShuffle %v4uint %15441 %15441 0 1 0 0\n      %11389 = OpBitwiseAnd %v4uint %25138 %2878\n      %24267 = OpShiftLeftLogical %v4uint %11389 %2950\n      %20655 = OpBitwiseAnd %v4uint %25138 %2860\n      %16600 = OpShiftRightLogical %v4uint %20655 %2950\n      %24003 = OpBitwiseOr %v4uint %24267 %16600\n      %19619 = OpBitwiseAnd %v4uint %24003 %2860\n      %18220 = OpShiftRightLogical %v4uint %19619 %2950\n      %14966 = OpBitwiseXor %v4uint %24003 %18220\n      %20728 = OpCompositeExtract %uint %14966 0\n      %20400 = OpVectorShuffle %v2uint %19546 %19546 0 0\n       %9029 = OpShiftRightLogical %v2uint %20400 %1903\n       %8733 = OpBitwiseAnd %v2uint %9029 %1140\n      %17508 = OpCompositeExtract %uint %19546 0\n      %10730 = OpShiftRightLogical %uint %17508 %uint_16\n       %9651 = OpCompositeExtract %uint %19546 1\n       %6239 = OpBitwiseAnd %uint %9651 %uint_255\n      %24079 = OpShiftLeftLogical %uint %6239 %uint_16\n      %16242 = OpBitwiseOr %uint %10730 %24079\n      %21952 = OpCompositeExtract %uint %8733 0\n      %10104 = OpCompositeExtract %uint %8733 1\n      %20100 = OpULessThanEqual %bool %21952 %10104\n               OpSelectionMerge %13868 None\n               OpBranchConditional %20100 %21928 %10642\n      %10642 = OpLabel\n      %17659 = OpBitwiseAnd %uint %16242 %uint_2396745\n      %23912 = OpBitwiseAnd %uint %16242 %uint_4793490\n      %22249 = OpShiftRightLogical %uint %23912 %uint_1\n      %24004 = OpBitwiseOr %uint %17659 %22249\n      %19601 = OpBitwiseAnd %uint %16242 %uint_9586980\n      %20617 = OpShiftRightLogical %uint %19601 %uint_2\n      %24289 = OpBitwiseOr %uint %24004 %20617\n       %7725 = OpBitwiseXor %uint %24289 %uint_2396745\n       %9544 = OpNot %uint %22249\n      %14625 = OpBitwiseAnd %uint %17659 %9544\n       %8429 = OpNot %uint %20617\n      %11411 = OpBitwiseAnd %uint %14625 %8429\n       %6803 = OpBitwiseOr %uint %16242 %7725\n      %19513 = OpISub %uint %6803 %uint_2396745\n      %14876 = OpBitwiseOr %uint %19513 %11411\n      %18154 = OpShiftLeftLogical %uint %11411 %uint_1\n      %16010 = OpBitwiseOr %uint %14876 %18154\n       %8120 = OpShiftLeftLogical %uint %11411 %uint_2\n       %7810 = OpBitwiseOr %uint %16010 %8120\n               OpBranch %13868\n      %21928 = OpLabel\n      %20085 = OpBitwiseAnd %uint %16242 %uint_4793490\n      %23954 = OpBitwiseAnd %uint %16242 %uint_9586980\n      %21850 = OpShiftRightLogical %uint %23954 %uint_1\n       %8139 = OpBitwiseAnd %uint %20085 %21850\n      %24615 = OpShiftLeftLogical %uint %8139 %uint_1\n      %22962 = OpShiftRightLogical %uint %8139 %uint_1\n      %18795 = OpBitwiseOr %uint %24615 %22962\n      %16051 = OpBitwiseOr %uint %8139 %18795\n      %18311 = OpBitwiseAnd %uint %16242 %uint_2396745\n      %14687 = OpBitwiseOr %uint %18311 %uint_14380470\n      %20405 = OpBitwiseAnd %uint %14687 %16051\n      %20541 = OpShiftRightLogical %uint %20085 %uint_1\n      %24924 = OpBitwiseOr %uint %18311 %20541\n      %21929 = OpShiftRightLogical %uint %23954 %uint_2\n      %22676 = OpBitwiseOr %uint %24924 %21929\n       %7726 = OpBitwiseXor %uint %22676 %uint_2396745\n       %9545 = OpNot %uint %20541\n      %14626 = OpBitwiseAnd %uint %18311 %9545\n       %8430 = OpNot %uint %21929\n      %11412 = OpBitwiseAnd %uint %14626 %8430\n       %6804 = OpBitwiseOr %uint %16242 %7726\n      %19514 = OpISub %uint %6804 %uint_2396745\n      %14877 = OpBitwiseOr %uint %19514 %11412\n      %18230 = OpShiftLeftLogical %uint %11412 %uint_2\n      %15360 = OpBitwiseOr %uint %14877 %18230\n      %12156 = OpNot %uint %16051\n      %18514 = OpBitwiseAnd %uint %15360 %12156\n       %6254 = OpBitwiseOr %uint %18514 %20405\n               OpBranch %13868\n      %13868 = OpLabel\n      %19144 = OpPhi %uint %6254 %21928 %7810 %10642\n      %23733 = OpShiftRightLogical %uint %22413 %int_4\n      %24823 = OpNot %uint %20728\n      %21240 = OpCompositeConstruct %v4uint %24823 %24823 %24823 %24823\n      %24041 = OpShiftRightLogical %v4uint %21240 %77\n      %23217 = OpBitwiseAnd %v4uint %24041 %47\n      %19129 = OpCompositeExtract %uint %14672 0\n      %24695 = OpCompositeConstruct %v4uint %19129 %19129 %19129 %19129\n      %24563 = OpIMul %v4uint %23217 %24695\n      %25219 = OpCompositeConstruct %v4uint %20728 %20728 %20728 %20728\n      %14399 = OpShiftRightLogical %v4uint %25219 %77\n      %23218 = OpBitwiseAnd %v4uint %14399 %47\n      %19130 = OpCompositeExtract %uint %14672 1\n       %6536 = OpCompositeConstruct %v4uint %19130 %19130 %19130 %19130\n      %16354 = OpIMul %v4uint %23218 %6536\n      %11268 = OpIAdd %v4uint %24563 %16354\n      %24770 = OpBitwiseAnd %v4uint %11268 %929\n       %9229 = OpUDiv %v4uint %24770 %47\n      %17613 = OpShiftLeftLogical %v4uint %9229 %749\n      %10965 = OpShiftRightLogical %v4uint %11268 %425\n      %13253 = OpBitwiseAnd %v4uint %10965 %929\n      %17316 = OpUDiv %v4uint %13253 %47\n      %16999 = OpShiftLeftLogical %v4uint %17316 %317\n       %6322 = OpBitwiseOr %v4uint %17613 %16999\n      %15348 = OpShiftRightLogical %v4uint %11268 %965\n      %24984 = OpUDiv %v4uint %15348 %47\n      %19484 = OpBitwiseOr %v4uint %6322 %24984\n               OpSelectionMerge %23555 None\n               OpBranchConditional %20100 %21930 %10471\n      %10471 = OpLabel\n       %8290 = OpNot %uint %19144\n      %15361 = OpBitwiseAnd %uint %8290 %uint_7\n      %17716 = OpIMul %uint %21952 %15361\n      %21983 = OpBitwiseAnd %uint %19144 %uint_7\n      %20401 = OpIMul %uint %10104 %21983\n      %19850 = OpIAdd %uint %17716 %20401\n      %13008 = OpUDiv %uint %19850 %uint_7\n      %23030 = OpShiftRightLogical %uint %8290 %uint_3\n       %8761 = OpBitwiseAnd %uint %23030 %uint_7\n      %15036 = OpIMul %uint %21952 %8761\n      %13307 = OpShiftRightLogical %uint %19144 %uint_3\n      %24981 = OpBitwiseAnd %uint %13307 %uint_7\n      %25220 = OpIMul %uint %10104 %24981\n      %19905 = OpIAdd %uint %15036 %25220\n      %12640 = OpUDiv %uint %19905 %uint_7\n       %8176 = OpShiftLeftLogical %uint %12640 %uint_8\n       %7569 = OpBitwiseOr %uint %13008 %8176\n      %21953 = OpShiftRightLogical %uint %8290 %uint_6\n      %17614 = OpBitwiseAnd %uint %21953 %uint_7\n      %15037 = OpIMul %uint %21952 %17614\n      %13308 = OpShiftRightLogical %uint %19144 %uint_6\n      %24985 = OpBitwiseAnd %uint %13308 %uint_7\n      %25221 = OpIMul %uint %10104 %24985\n      %19906 = OpIAdd %uint %15037 %25221\n      %12641 = OpUDiv %uint %19906 %uint_7\n       %8177 = OpShiftLeftLogical %uint %12641 %uint_16\n       %7570 = OpBitwiseOr %uint %7569 %8177\n      %21954 = OpShiftRightLogical %uint %8290 %uint_9\n      %17615 = OpBitwiseAnd %uint %21954 %uint_7\n      %15038 = OpIMul %uint %21952 %17615\n      %13309 = OpShiftRightLogical %uint %19144 %uint_9\n      %24986 = OpBitwiseAnd %uint %13309 %uint_7\n      %25222 = OpIMul %uint %10104 %24986\n      %19907 = OpIAdd %uint %15038 %25222\n      %12642 = OpUDiv %uint %19907 %uint_7\n       %9209 = OpShiftLeftLogical %uint %12642 %uint_24\n      %18044 = OpBitwiseOr %uint %7570 %9209\n               OpBranch %23555\n      %21930 = OpLabel\n      %20086 = OpBitwiseAnd %uint %19144 %uint_1170\n      %23955 = OpBitwiseAnd %uint %19144 %uint_2340\n      %21851 = OpShiftRightLogical %uint %23955 %uint_1\n       %8140 = OpBitwiseAnd %uint %20086 %21851\n      %24616 = OpShiftLeftLogical %uint %8140 %uint_1\n      %22963 = OpShiftRightLogical %uint %8140 %uint_1\n      %18816 = OpBitwiseOr %uint %24616 %22963\n      %15918 = OpBitwiseOr %uint %8140 %18816\n       %8463 = OpNot %uint %15918\n      %10086 = OpBitwiseAnd %uint %19144 %8463\n      %16304 = OpISub %uint %uint_2925 %10086\n      %17419 = OpBitwiseAnd %uint %16304 %8463\n      %17000 = OpBitwiseAnd %uint %17419 %uint_7\n      %13681 = OpIMul %uint %21952 %17000\n      %21984 = OpBitwiseAnd %uint %10086 %uint_7\n      %20402 = OpIMul %uint %10104 %21984\n      %19851 = OpIAdd %uint %13681 %20402\n      %13009 = OpUDiv %uint %19851 %uint_5\n      %23031 = OpShiftRightLogical %uint %17419 %uint_3\n       %8762 = OpBitwiseAnd %uint %23031 %uint_7\n      %15039 = OpIMul %uint %21952 %8762\n      %13310 = OpShiftRightLogical %uint %10086 %uint_3\n      %24987 = OpBitwiseAnd %uint %13310 %uint_7\n      %25223 = OpIMul %uint %10104 %24987\n      %19908 = OpIAdd %uint %15039 %25223\n      %12643 = OpUDiv %uint %19908 %uint_5\n       %8178 = OpShiftLeftLogical %uint %12643 %uint_8\n       %7571 = OpBitwiseOr %uint %13009 %8178\n      %21955 = OpShiftRightLogical %uint %17419 %uint_6\n      %17616 = OpBitwiseAnd %uint %21955 %uint_7\n      %15040 = OpIMul %uint %21952 %17616\n      %13311 = OpShiftRightLogical %uint %10086 %uint_6\n      %24988 = OpBitwiseAnd %uint %13311 %uint_7\n      %25224 = OpIMul %uint %10104 %24988\n      %19909 = OpIAdd %uint %15040 %25224\n      %12644 = OpUDiv %uint %19909 %uint_5\n       %8179 = OpShiftLeftLogical %uint %12644 %uint_16\n       %7572 = OpBitwiseOr %uint %7571 %8179\n      %21956 = OpShiftRightLogical %uint %17419 %uint_9\n      %17617 = OpBitwiseAnd %uint %21956 %uint_7\n      %15041 = OpIMul %uint %21952 %17617\n      %13312 = OpShiftRightLogical %uint %10086 %uint_9\n      %24989 = OpBitwiseAnd %uint %13312 %uint_7\n      %25225 = OpIMul %uint %10104 %24989\n      %19910 = OpIAdd %uint %15041 %25225\n      %12645 = OpUDiv %uint %19910 %uint_5\n       %8260 = OpShiftLeftLogical %uint %12645 %uint_24\n       %6692 = OpBitwiseOr %uint %7572 %8260\n      %20406 = OpBitwiseAnd %uint %19144 %15918\n      %17412 = OpBitwiseAnd %uint %20406 %uint_1\n      %19563 = OpBitwiseAnd %uint %20406 %uint_8\n      %24936 = OpShiftLeftLogical %uint %19563 %uint_5\n      %17091 = OpBitwiseOr %uint %17412 %24936\n      %20874 = OpBitwiseAnd %uint %20406 %uint_64\n      %23323 = OpShiftLeftLogical %uint %20874 %uint_10\n      %17092 = OpBitwiseOr %uint %17091 %23323\n      %20875 = OpBitwiseAnd %uint %20406 %uint_512\n      %22050 = OpShiftLeftLogical %uint %20875 %uint_15\n       %8315 = OpBitwiseOr %uint %17092 %22050\n      %10423 = OpIMul %uint %8315 %uint_255\n      %18436 = OpIAdd %uint %6692 %10423\n               OpBranch %23555\n      %23555 = OpLabel\n      %19722 = OpPhi %uint %18436 %21930 %18044 %10471\n      %13598 = OpCompositeConstruct %v4uint %19722 %19722 %19722 %19722\n      %17098 = OpShiftLeftLogical %v4uint %13598 %413\n      %21439 = OpBitwiseAnd %v4uint %17098 %2599\n      %12257 = OpBitwiseOr %v4uint %19484 %21439\n      %23324 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %23733\n               OpStore %23324 %12257\n               OpSelectionMerge %7208 DontFlatten\n               OpBranchConditional %17425 %22829 %7208\n      %22829 = OpLabel\n      %15482 = OpIAdd %uint %22413 %22412\n      %14285 = OpShiftRightLogical %uint %15482 %int_4\n      %11882 = OpShiftRightLogical %uint %20728 %uint_8\n      %19207 = OpNot %uint %11882\n      %21241 = OpCompositeConstruct %v4uint %19207 %19207 %19207 %19207\n      %25012 = OpShiftRightLogical %v4uint %21241 %77\n      %14395 = OpBitwiseAnd %v4uint %25012 %47\n      %15570 = OpIMul %v4uint %14395 %24695\n      %21405 = OpCompositeConstruct %v4uint %11882 %11882 %11882 %11882\n      %15369 = OpShiftRightLogical %v4uint %21405 %77\n      %15307 = OpBitwiseAnd %v4uint %15369 %47\n       %7361 = OpIMul %v4uint %15307 %6536\n       %7460 = OpIAdd %v4uint %15570 %7361\n      %24771 = OpBitwiseAnd %v4uint %7460 %929\n       %9230 = OpUDiv %v4uint %24771 %47\n      %17618 = OpShiftLeftLogical %v4uint %9230 %749\n      %10966 = OpShiftRightLogical %v4uint %7460 %425\n      %13254 = OpBitwiseAnd %v4uint %10966 %929\n      %17317 = OpUDiv %v4uint %13254 %47\n      %17001 = OpShiftLeftLogical %v4uint %17317 %317\n       %6323 = OpBitwiseOr %v4uint %17618 %17001\n      %15349 = OpShiftRightLogical %v4uint %7460 %965\n      %23977 = OpUDiv %v4uint %15349 %47\n       %9525 = OpBitwiseOr %v4uint %6323 %23977\n      %23685 = OpShiftRightLogical %uint %19144 %uint_12\n               OpSelectionMerge %23556 None\n               OpBranchConditional %20100 %21931 %10472\n      %10472 = OpLabel\n       %8291 = OpNot %uint %23685\n      %15362 = OpBitwiseAnd %uint %8291 %uint_7\n      %17717 = OpIMul %uint %21952 %15362\n      %21985 = OpBitwiseAnd %uint %23685 %uint_7\n      %20407 = OpIMul %uint %10104 %21985\n      %19852 = OpIAdd %uint %17717 %20407\n      %13010 = OpUDiv %uint %19852 %uint_7\n      %23032 = OpShiftRightLogical %uint %8291 %uint_3\n       %8763 = OpBitwiseAnd %uint %23032 %uint_7\n      %15042 = OpIMul %uint %21952 %8763\n      %13313 = OpShiftRightLogical %uint %23685 %uint_3\n      %24990 = OpBitwiseAnd %uint %13313 %uint_7\n      %25226 = OpIMul %uint %10104 %24990\n      %19911 = OpIAdd %uint %15042 %25226\n      %12646 = OpUDiv %uint %19911 %uint_7\n       %8180 = OpShiftLeftLogical %uint %12646 %uint_8\n       %7573 = OpBitwiseOr %uint %13010 %8180\n      %21957 = OpShiftRightLogical %uint %8291 %uint_6\n      %17619 = OpBitwiseAnd %uint %21957 %uint_7\n      %15043 = OpIMul %uint %21952 %17619\n      %13314 = OpShiftRightLogical %uint %23685 %uint_6\n      %24991 = OpBitwiseAnd %uint %13314 %uint_7\n      %25227 = OpIMul %uint %10104 %24991\n      %19912 = OpIAdd %uint %15043 %25227\n      %12647 = OpUDiv %uint %19912 %uint_7\n       %8181 = OpShiftLeftLogical %uint %12647 %uint_16\n       %7574 = OpBitwiseOr %uint %7573 %8181\n      %21958 = OpShiftRightLogical %uint %8291 %uint_9\n      %17620 = OpBitwiseAnd %uint %21958 %uint_7\n      %15044 = OpIMul %uint %21952 %17620\n      %13315 = OpShiftRightLogical %uint %23685 %uint_9\n      %24992 = OpBitwiseAnd %uint %13315 %uint_7\n      %25228 = OpIMul %uint %10104 %24992\n      %19913 = OpIAdd %uint %15044 %25228\n      %12648 = OpUDiv %uint %19913 %uint_7\n       %9210 = OpShiftLeftLogical %uint %12648 %uint_24\n      %18045 = OpBitwiseOr %uint %7574 %9210\n               OpBranch %23556\n      %21931 = OpLabel\n      %20087 = OpBitwiseAnd %uint %23685 %uint_1170\n      %23956 = OpBitwiseAnd %uint %23685 %uint_2340\n      %21852 = OpShiftRightLogical %uint %23956 %uint_1\n       %8141 = OpBitwiseAnd %uint %20087 %21852\n      %24617 = OpShiftLeftLogical %uint %8141 %uint_1\n      %22964 = OpShiftRightLogical %uint %8141 %uint_1\n      %18817 = OpBitwiseOr %uint %24617 %22964\n      %15919 = OpBitwiseOr %uint %8141 %18817\n       %8464 = OpNot %uint %15919\n      %10087 = OpBitwiseAnd %uint %23685 %8464\n      %16305 = OpISub %uint %uint_2925 %10087\n      %17420 = OpBitwiseAnd %uint %16305 %8464\n      %17002 = OpBitwiseAnd %uint %17420 %uint_7\n      %13682 = OpIMul %uint %21952 %17002\n      %21986 = OpBitwiseAnd %uint %10087 %uint_7\n      %20408 = OpIMul %uint %10104 %21986\n      %19853 = OpIAdd %uint %13682 %20408\n      %13011 = OpUDiv %uint %19853 %uint_5\n      %23033 = OpShiftRightLogical %uint %17420 %uint_3\n       %8764 = OpBitwiseAnd %uint %23033 %uint_7\n      %15045 = OpIMul %uint %21952 %8764\n      %13316 = OpShiftRightLogical %uint %10087 %uint_3\n      %24993 = OpBitwiseAnd %uint %13316 %uint_7\n      %25229 = OpIMul %uint %10104 %24993\n      %19914 = OpIAdd %uint %15045 %25229\n      %12649 = OpUDiv %uint %19914 %uint_5\n       %8182 = OpShiftLeftLogical %uint %12649 %uint_8\n       %7575 = OpBitwiseOr %uint %13011 %8182\n      %21959 = OpShiftRightLogical %uint %17420 %uint_6\n      %17621 = OpBitwiseAnd %uint %21959 %uint_7\n      %15046 = OpIMul %uint %21952 %17621\n      %13317 = OpShiftRightLogical %uint %10087 %uint_6\n      %24994 = OpBitwiseAnd %uint %13317 %uint_7\n      %25230 = OpIMul %uint %10104 %24994\n      %19915 = OpIAdd %uint %15046 %25230\n      %12650 = OpUDiv %uint %19915 %uint_5\n       %8183 = OpShiftLeftLogical %uint %12650 %uint_16\n       %7576 = OpBitwiseOr %uint %7575 %8183\n      %21960 = OpShiftRightLogical %uint %17420 %uint_9\n      %17622 = OpBitwiseAnd %uint %21960 %uint_7\n      %15047 = OpIMul %uint %21952 %17622\n      %13318 = OpShiftRightLogical %uint %10087 %uint_9\n      %24995 = OpBitwiseAnd %uint %13318 %uint_7\n      %25231 = OpIMul %uint %10104 %24995\n      %19916 = OpIAdd %uint %15047 %25231\n      %12651 = OpUDiv %uint %19916 %uint_5\n       %8261 = OpShiftLeftLogical %uint %12651 %uint_24\n       %6693 = OpBitwiseOr %uint %7576 %8261\n      %20409 = OpBitwiseAnd %uint %23685 %15919\n      %17413 = OpBitwiseAnd %uint %20409 %uint_1\n      %19564 = OpBitwiseAnd %uint %20409 %uint_8\n      %24937 = OpShiftLeftLogical %uint %19564 %uint_5\n      %17093 = OpBitwiseOr %uint %17413 %24937\n      %20876 = OpBitwiseAnd %uint %20409 %uint_64\n      %23325 = OpShiftLeftLogical %uint %20876 %uint_10\n      %17099 = OpBitwiseOr %uint %17093 %23325\n      %20877 = OpBitwiseAnd %uint %20409 %uint_512\n      %22051 = OpShiftLeftLogical %uint %20877 %uint_15\n       %8316 = OpBitwiseOr %uint %17099 %22051\n      %10424 = OpIMul %uint %8316 %uint_255\n      %18437 = OpIAdd %uint %6693 %10424\n               OpBranch %23556\n      %23556 = OpLabel\n      %19723 = OpPhi %uint %18437 %21931 %18045 %10472\n      %13599 = OpCompositeConstruct %v4uint %19723 %19723 %19723 %19723\n      %17100 = OpShiftLeftLogical %v4uint %13599 %413\n      %21440 = OpBitwiseAnd %v4uint %17100 %2599\n      %12258 = OpBitwiseOr %v4uint %9525 %21440\n      %21060 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %14285\n               OpStore %21060 %12258\n      %14842 = OpIAdd %uint %12832 %uint_2\n      %11789 = OpULessThan %bool %14842 %6594\n               OpSelectionMerge %7207 DontFlatten\n               OpBranchConditional %11789 %12418 %7207\n      %12418 = OpLabel\n      %13241 = OpShiftRightLogical %uint %9651 %uint_8\n               OpSelectionMerge %12690 None\n               OpBranchConditional %20100 %21932 %10643\n      %10643 = OpLabel\n      %17660 = OpBitwiseAnd %uint %13241 %uint_2396745\n      %23913 = OpBitwiseAnd %uint %13241 %uint_4793490\n      %22250 = OpShiftRightLogical %uint %23913 %uint_1\n      %24005 = OpBitwiseOr %uint %17660 %22250\n      %19602 = OpBitwiseAnd %uint %13241 %uint_9586980\n      %20618 = OpShiftRightLogical %uint %19602 %uint_2\n      %24290 = OpBitwiseOr %uint %24005 %20618\n       %7727 = OpBitwiseXor %uint %24290 %uint_2396745\n       %9547 = OpNot %uint %22250\n      %14627 = OpBitwiseAnd %uint %17660 %9547\n       %8431 = OpNot %uint %20618\n      %11413 = OpBitwiseAnd %uint %14627 %8431\n       %6805 = OpBitwiseOr %uint %13241 %7727\n      %19515 = OpISub %uint %6805 %uint_2396745\n      %14878 = OpBitwiseOr %uint %19515 %11413\n      %18155 = OpShiftLeftLogical %uint %11413 %uint_1\n      %16011 = OpBitwiseOr %uint %14878 %18155\n       %8121 = OpShiftLeftLogical %uint %11413 %uint_2\n       %7811 = OpBitwiseOr %uint %16011 %8121\n               OpBranch %12690\n      %21932 = OpLabel\n      %20088 = OpBitwiseAnd %uint %13241 %uint_4793490\n      %23957 = OpBitwiseAnd %uint %13241 %uint_9586980\n      %21853 = OpShiftRightLogical %uint %23957 %uint_1\n       %8142 = OpBitwiseAnd %uint %20088 %21853\n      %24618 = OpShiftLeftLogical %uint %8142 %uint_1\n      %22965 = OpShiftRightLogical %uint %8142 %uint_1\n      %18796 = OpBitwiseOr %uint %24618 %22965\n      %16052 = OpBitwiseOr %uint %8142 %18796\n      %18312 = OpBitwiseAnd %uint %13241 %uint_2396745\n      %14688 = OpBitwiseOr %uint %18312 %uint_14380470\n      %20410 = OpBitwiseAnd %uint %14688 %16052\n      %20542 = OpShiftRightLogical %uint %20088 %uint_1\n      %24925 = OpBitwiseOr %uint %18312 %20542\n      %21933 = OpShiftRightLogical %uint %23957 %uint_2\n      %22677 = OpBitwiseOr %uint %24925 %21933\n       %7728 = OpBitwiseXor %uint %22677 %uint_2396745\n       %9548 = OpNot %uint %20542\n      %14628 = OpBitwiseAnd %uint %18312 %9548\n       %8432 = OpNot %uint %21933\n      %11414 = OpBitwiseAnd %uint %14628 %8432\n       %6806 = OpBitwiseOr %uint %13241 %7728\n      %19516 = OpISub %uint %6806 %uint_2396745\n      %14879 = OpBitwiseOr %uint %19516 %11414\n      %18231 = OpShiftLeftLogical %uint %11414 %uint_2\n      %15363 = OpBitwiseOr %uint %14879 %18231\n      %12157 = OpNot %uint %16052\n      %18515 = OpBitwiseAnd %uint %15363 %12157\n       %6255 = OpBitwiseOr %uint %18515 %20410\n               OpBranch %12690\n      %12690 = OpLabel\n       %9431 = OpPhi %uint %6255 %21932 %7811 %10643\n      %18790 = OpIMul %uint %uint_2 %22412\n      %14277 = OpIAdd %uint %22413 %18790\n      %17290 = OpShiftRightLogical %uint %14277 %int_4\n      %11883 = OpShiftRightLogical %uint %20728 %uint_16\n      %19208 = OpNot %uint %11883\n      %21242 = OpCompositeConstruct %v4uint %19208 %19208 %19208 %19208\n      %25013 = OpShiftRightLogical %v4uint %21242 %77\n      %14396 = OpBitwiseAnd %v4uint %25013 %47\n      %15571 = OpIMul %v4uint %14396 %24695\n      %21406 = OpCompositeConstruct %v4uint %11883 %11883 %11883 %11883\n      %15370 = OpShiftRightLogical %v4uint %21406 %77\n      %15308 = OpBitwiseAnd %v4uint %15370 %47\n       %7362 = OpIMul %v4uint %15308 %6536\n       %7461 = OpIAdd %v4uint %15571 %7362\n      %24772 = OpBitwiseAnd %v4uint %7461 %929\n       %9231 = OpUDiv %v4uint %24772 %47\n      %17623 = OpShiftLeftLogical %v4uint %9231 %749\n      %10967 = OpShiftRightLogical %v4uint %7461 %425\n      %13255 = OpBitwiseAnd %v4uint %10967 %929\n      %17318 = OpUDiv %v4uint %13255 %47\n      %17003 = OpShiftLeftLogical %v4uint %17318 %317\n       %6324 = OpBitwiseOr %v4uint %17623 %17003\n      %15350 = OpShiftRightLogical %v4uint %7461 %965\n      %24996 = OpUDiv %v4uint %15350 %47\n      %19485 = OpBitwiseOr %v4uint %6324 %24996\n               OpSelectionMerge %23557 None\n               OpBranchConditional %20100 %21934 %10473\n      %10473 = OpLabel\n       %8292 = OpNot %uint %9431\n      %15364 = OpBitwiseAnd %uint %8292 %uint_7\n      %17718 = OpIMul %uint %21952 %15364\n      %21987 = OpBitwiseAnd %uint %9431 %uint_7\n      %20411 = OpIMul %uint %10104 %21987\n      %19854 = OpIAdd %uint %17718 %20411\n      %13012 = OpUDiv %uint %19854 %uint_7\n      %23034 = OpShiftRightLogical %uint %8292 %uint_3\n       %8765 = OpBitwiseAnd %uint %23034 %uint_7\n      %15048 = OpIMul %uint %21952 %8765\n      %13319 = OpShiftRightLogical %uint %9431 %uint_3\n      %24997 = OpBitwiseAnd %uint %13319 %uint_7\n      %25232 = OpIMul %uint %10104 %24997\n      %19917 = OpIAdd %uint %15048 %25232\n      %12652 = OpUDiv %uint %19917 %uint_7\n       %8184 = OpShiftLeftLogical %uint %12652 %uint_8\n       %7577 = OpBitwiseOr %uint %13012 %8184\n      %21961 = OpShiftRightLogical %uint %8292 %uint_6\n      %17624 = OpBitwiseAnd %uint %21961 %uint_7\n      %15049 = OpIMul %uint %21952 %17624\n      %13320 = OpShiftRightLogical %uint %9431 %uint_6\n      %24998 = OpBitwiseAnd %uint %13320 %uint_7\n      %25233 = OpIMul %uint %10104 %24998\n      %19918 = OpIAdd %uint %15049 %25233\n      %12653 = OpUDiv %uint %19918 %uint_7\n       %8185 = OpShiftLeftLogical %uint %12653 %uint_16\n       %7578 = OpBitwiseOr %uint %7577 %8185\n      %21962 = OpShiftRightLogical %uint %8292 %uint_9\n      %17625 = OpBitwiseAnd %uint %21962 %uint_7\n      %15050 = OpIMul %uint %21952 %17625\n      %13321 = OpShiftRightLogical %uint %9431 %uint_9\n      %24999 = OpBitwiseAnd %uint %13321 %uint_7\n      %25234 = OpIMul %uint %10104 %24999\n      %19919 = OpIAdd %uint %15050 %25234\n      %12654 = OpUDiv %uint %19919 %uint_7\n       %9211 = OpShiftLeftLogical %uint %12654 %uint_24\n      %18046 = OpBitwiseOr %uint %7578 %9211\n               OpBranch %23557\n      %21934 = OpLabel\n      %20089 = OpBitwiseAnd %uint %9431 %uint_1170\n      %23958 = OpBitwiseAnd %uint %9431 %uint_2340\n      %21854 = OpShiftRightLogical %uint %23958 %uint_1\n       %8143 = OpBitwiseAnd %uint %20089 %21854\n      %24619 = OpShiftLeftLogical %uint %8143 %uint_1\n      %22966 = OpShiftRightLogical %uint %8143 %uint_1\n      %18818 = OpBitwiseOr %uint %24619 %22966\n      %15920 = OpBitwiseOr %uint %8143 %18818\n       %8465 = OpNot %uint %15920\n      %10088 = OpBitwiseAnd %uint %9431 %8465\n      %16306 = OpISub %uint %uint_2925 %10088\n      %17421 = OpBitwiseAnd %uint %16306 %8465\n      %17004 = OpBitwiseAnd %uint %17421 %uint_7\n      %13683 = OpIMul %uint %21952 %17004\n      %21988 = OpBitwiseAnd %uint %10088 %uint_7\n      %20412 = OpIMul %uint %10104 %21988\n      %19855 = OpIAdd %uint %13683 %20412\n      %13013 = OpUDiv %uint %19855 %uint_5\n      %23035 = OpShiftRightLogical %uint %17421 %uint_3\n       %8766 = OpBitwiseAnd %uint %23035 %uint_7\n      %15051 = OpIMul %uint %21952 %8766\n      %13322 = OpShiftRightLogical %uint %10088 %uint_3\n      %25000 = OpBitwiseAnd %uint %13322 %uint_7\n      %25235 = OpIMul %uint %10104 %25000\n      %19920 = OpIAdd %uint %15051 %25235\n      %12655 = OpUDiv %uint %19920 %uint_5\n       %8186 = OpShiftLeftLogical %uint %12655 %uint_8\n       %7579 = OpBitwiseOr %uint %13013 %8186\n      %21963 = OpShiftRightLogical %uint %17421 %uint_6\n      %17626 = OpBitwiseAnd %uint %21963 %uint_7\n      %15052 = OpIMul %uint %21952 %17626\n      %13323 = OpShiftRightLogical %uint %10088 %uint_6\n      %25001 = OpBitwiseAnd %uint %13323 %uint_7\n      %25236 = OpIMul %uint %10104 %25001\n      %19921 = OpIAdd %uint %15052 %25236\n      %12656 = OpUDiv %uint %19921 %uint_5\n       %8187 = OpShiftLeftLogical %uint %12656 %uint_16\n       %7580 = OpBitwiseOr %uint %7579 %8187\n      %21964 = OpShiftRightLogical %uint %17421 %uint_9\n      %17627 = OpBitwiseAnd %uint %21964 %uint_7\n      %15053 = OpIMul %uint %21952 %17627\n      %13324 = OpShiftRightLogical %uint %10088 %uint_9\n      %25002 = OpBitwiseAnd %uint %13324 %uint_7\n      %25237 = OpIMul %uint %10104 %25002\n      %19922 = OpIAdd %uint %15053 %25237\n      %12657 = OpUDiv %uint %19922 %uint_5\n       %8262 = OpShiftLeftLogical %uint %12657 %uint_24\n       %6694 = OpBitwiseOr %uint %7580 %8262\n      %20413 = OpBitwiseAnd %uint %9431 %15920\n      %17414 = OpBitwiseAnd %uint %20413 %uint_1\n      %19565 = OpBitwiseAnd %uint %20413 %uint_8\n      %24938 = OpShiftLeftLogical %uint %19565 %uint_5\n      %17101 = OpBitwiseOr %uint %17414 %24938\n      %20878 = OpBitwiseAnd %uint %20413 %uint_64\n      %23326 = OpShiftLeftLogical %uint %20878 %uint_10\n      %17103 = OpBitwiseOr %uint %17101 %23326\n      %20879 = OpBitwiseAnd %uint %20413 %uint_512\n      %22052 = OpShiftLeftLogical %uint %20879 %uint_15\n       %8317 = OpBitwiseOr %uint %17103 %22052\n      %10426 = OpIMul %uint %8317 %uint_255\n      %18438 = OpIAdd %uint %6694 %10426\n               OpBranch %23557\n      %23557 = OpLabel\n      %19724 = OpPhi %uint %18438 %21934 %18046 %10473\n      %13600 = OpCompositeConstruct %v4uint %19724 %19724 %19724 %19724\n      %17104 = OpShiftLeftLogical %v4uint %13600 %413\n      %21441 = OpBitwiseAnd %v4uint %17104 %2599\n      %12259 = OpBitwiseOr %v4uint %19485 %21441\n      %21061 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %17290\n               OpStore %21061 %12259\n      %14843 = OpIAdd %uint %12832 %uint_3\n      %11790 = OpULessThan %bool %14843 %6594\n               OpSelectionMerge %18022 DontFlatten\n               OpBranchConditional %11790 %20883 %18022\n      %20883 = OpLabel\n      %13199 = OpIMul %uint %uint_3 %22412\n      %13468 = OpIAdd %uint %22413 %13199\n      %17291 = OpShiftRightLogical %uint %13468 %int_4\n      %11884 = OpShiftRightLogical %uint %20728 %uint_24\n      %19209 = OpNot %uint %11884\n      %21243 = OpCompositeConstruct %v4uint %19209 %19209 %19209 %19209\n      %25014 = OpShiftRightLogical %v4uint %21243 %77\n      %14400 = OpBitwiseAnd %v4uint %25014 %47\n      %15572 = OpIMul %v4uint %14400 %24695\n      %21407 = OpCompositeConstruct %v4uint %11884 %11884 %11884 %11884\n      %15371 = OpShiftRightLogical %v4uint %21407 %77\n      %15309 = OpBitwiseAnd %v4uint %15371 %47\n       %7363 = OpIMul %v4uint %15309 %6536\n       %7462 = OpIAdd %v4uint %15572 %7363\n      %24773 = OpBitwiseAnd %v4uint %7462 %929\n       %9232 = OpUDiv %v4uint %24773 %47\n      %17628 = OpShiftLeftLogical %v4uint %9232 %749\n      %10968 = OpShiftRightLogical %v4uint %7462 %425\n      %13256 = OpBitwiseAnd %v4uint %10968 %929\n      %17319 = OpUDiv %v4uint %13256 %47\n      %17005 = OpShiftLeftLogical %v4uint %17319 %317\n       %6325 = OpBitwiseOr %v4uint %17628 %17005\n      %15351 = OpShiftRightLogical %v4uint %7462 %965\n      %23978 = OpUDiv %v4uint %15351 %47\n       %9526 = OpBitwiseOr %v4uint %6325 %23978\n      %23686 = OpShiftRightLogical %uint %9431 %uint_12\n               OpSelectionMerge %23558 None\n               OpBranchConditional %20100 %21967 %10474\n      %10474 = OpLabel\n       %8293 = OpNot %uint %23686\n      %15365 = OpBitwiseAnd %uint %8293 %uint_7\n      %17719 = OpIMul %uint %21952 %15365\n      %21989 = OpBitwiseAnd %uint %23686 %uint_7\n      %20414 = OpIMul %uint %10104 %21989\n      %19856 = OpIAdd %uint %17719 %20414\n      %13014 = OpUDiv %uint %19856 %uint_7\n      %23036 = OpShiftRightLogical %uint %8293 %uint_3\n       %8767 = OpBitwiseAnd %uint %23036 %uint_7\n      %15054 = OpIMul %uint %21952 %8767\n      %13325 = OpShiftRightLogical %uint %23686 %uint_3\n      %25003 = OpBitwiseAnd %uint %13325 %uint_7\n      %25238 = OpIMul %uint %10104 %25003\n      %19923 = OpIAdd %uint %15054 %25238\n      %12658 = OpUDiv %uint %19923 %uint_7\n       %8188 = OpShiftLeftLogical %uint %12658 %uint_8\n       %7581 = OpBitwiseOr %uint %13014 %8188\n      %21965 = OpShiftRightLogical %uint %8293 %uint_6\n      %17629 = OpBitwiseAnd %uint %21965 %uint_7\n      %15055 = OpIMul %uint %21952 %17629\n      %13326 = OpShiftRightLogical %uint %23686 %uint_6\n      %25004 = OpBitwiseAnd %uint %13326 %uint_7\n      %25239 = OpIMul %uint %10104 %25004\n      %19924 = OpIAdd %uint %15055 %25239\n      %12659 = OpUDiv %uint %19924 %uint_7\n       %8189 = OpShiftLeftLogical %uint %12659 %uint_16\n       %7582 = OpBitwiseOr %uint %7581 %8189\n      %21966 = OpShiftRightLogical %uint %8293 %uint_9\n      %17630 = OpBitwiseAnd %uint %21966 %uint_7\n      %15056 = OpIMul %uint %21952 %17630\n      %13327 = OpShiftRightLogical %uint %23686 %uint_9\n      %25005 = OpBitwiseAnd %uint %13327 %uint_7\n      %25240 = OpIMul %uint %10104 %25005\n      %19925 = OpIAdd %uint %15056 %25240\n      %12660 = OpUDiv %uint %19925 %uint_7\n       %9212 = OpShiftLeftLogical %uint %12660 %uint_24\n      %18047 = OpBitwiseOr %uint %7582 %9212\n               OpBranch %23558\n      %21967 = OpLabel\n      %20090 = OpBitwiseAnd %uint %23686 %uint_1170\n      %23959 = OpBitwiseAnd %uint %23686 %uint_2340\n      %21855 = OpShiftRightLogical %uint %23959 %uint_1\n       %8144 = OpBitwiseAnd %uint %20090 %21855\n      %24620 = OpShiftLeftLogical %uint %8144 %uint_1\n      %22967 = OpShiftRightLogical %uint %8144 %uint_1\n      %18819 = OpBitwiseOr %uint %24620 %22967\n      %15921 = OpBitwiseOr %uint %8144 %18819\n       %8466 = OpNot %uint %15921\n      %10089 = OpBitwiseAnd %uint %23686 %8466\n      %16307 = OpISub %uint %uint_2925 %10089\n      %17422 = OpBitwiseAnd %uint %16307 %8466\n      %17006 = OpBitwiseAnd %uint %17422 %uint_7\n      %13684 = OpIMul %uint %21952 %17006\n      %21990 = OpBitwiseAnd %uint %10089 %uint_7\n      %20415 = OpIMul %uint %10104 %21990\n      %19857 = OpIAdd %uint %13684 %20415\n      %13016 = OpUDiv %uint %19857 %uint_5\n      %23037 = OpShiftRightLogical %uint %17422 %uint_3\n       %8768 = OpBitwiseAnd %uint %23037 %uint_7\n      %15057 = OpIMul %uint %21952 %8768\n      %13328 = OpShiftRightLogical %uint %10089 %uint_3\n      %25006 = OpBitwiseAnd %uint %13328 %uint_7\n      %25241 = OpIMul %uint %10104 %25006\n      %19926 = OpIAdd %uint %15057 %25241\n      %12661 = OpUDiv %uint %19926 %uint_5\n       %8190 = OpShiftLeftLogical %uint %12661 %uint_8\n       %7583 = OpBitwiseOr %uint %13016 %8190\n      %21968 = OpShiftRightLogical %uint %17422 %uint_6\n      %17631 = OpBitwiseAnd %uint %21968 %uint_7\n      %15058 = OpIMul %uint %21952 %17631\n      %13329 = OpShiftRightLogical %uint %10089 %uint_6\n      %25007 = OpBitwiseAnd %uint %13329 %uint_7\n      %25242 = OpIMul %uint %10104 %25007\n      %19927 = OpIAdd %uint %15058 %25242\n      %12662 = OpUDiv %uint %19927 %uint_5\n       %8191 = OpShiftLeftLogical %uint %12662 %uint_16\n       %7584 = OpBitwiseOr %uint %7583 %8191\n      %21969 = OpShiftRightLogical %uint %17422 %uint_9\n      %17632 = OpBitwiseAnd %uint %21969 %uint_7\n      %15059 = OpIMul %uint %21952 %17632\n      %13330 = OpShiftRightLogical %uint %10089 %uint_9\n      %25008 = OpBitwiseAnd %uint %13330 %uint_7\n      %25243 = OpIMul %uint %10104 %25008\n      %19928 = OpIAdd %uint %15059 %25243\n      %12663 = OpUDiv %uint %19928 %uint_5\n       %8263 = OpShiftLeftLogical %uint %12663 %uint_24\n       %6695 = OpBitwiseOr %uint %7584 %8263\n      %20416 = OpBitwiseAnd %uint %23686 %15921\n      %17423 = OpBitwiseAnd %uint %20416 %uint_1\n      %19566 = OpBitwiseAnd %uint %20416 %uint_8\n      %24939 = OpShiftLeftLogical %uint %19566 %uint_5\n      %17105 = OpBitwiseOr %uint %17423 %24939\n      %20880 = OpBitwiseAnd %uint %20416 %uint_64\n      %23327 = OpShiftLeftLogical %uint %20880 %uint_10\n      %17106 = OpBitwiseOr %uint %17105 %23327\n      %20881 = OpBitwiseAnd %uint %20416 %uint_512\n      %22053 = OpShiftLeftLogical %uint %20881 %uint_15\n       %8318 = OpBitwiseOr %uint %17106 %22053\n      %10427 = OpIMul %uint %8318 %uint_255\n      %18439 = OpIAdd %uint %6695 %10427\n               OpBranch %23558\n      %23558 = OpLabel\n      %19725 = OpPhi %uint %18439 %21967 %18047 %10474\n      %13601 = OpCompositeConstruct %v4uint %19725 %19725 %19725 %19725\n      %17107 = OpShiftLeftLogical %v4uint %13601 %413\n      %21442 = OpBitwiseAnd %v4uint %17107 %2599\n      %12260 = OpBitwiseOr %v4uint %9526 %21442\n      %23358 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %17291\n               OpStore %23358 %12260\n               OpBranch %18022\n      %18022 = OpLabel\n               OpBranch %7207\n       %7207 = OpLabel\n               OpBranch %7208\n       %7208 = OpLabel\n               OpBranch %14903\n      %14903 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_dxt5_rgba8_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x0000629C, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000017,\n    0x0000000B, 0x00000004, 0x00040015, 0x0000000C, 0x00000020, 0x00000001,\n    0x00040017, 0x00000012, 0x0000000C, 0x00000002, 0x00040017, 0x00000016,\n    0x0000000C, 0x00000003, 0x00020014, 0x00000009, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A13, 0x00000003,\n    0x0004002B, 0x0000000B, 0x00000A31, 0x0000000D, 0x0004002B, 0x0000000B,\n    0x0000012F, 0x000000F8, 0x0004002B, 0x0000000B, 0x00000A1F, 0x00000007,\n    0x0004002B, 0x0000000B, 0x00000A25, 0x00000009, 0x0004002B, 0x0000000B,\n    0x00000B47, 0x0003F000, 0x0004002B, 0x0000000B, 0x00000A2E, 0x0000000C,\n    0x0004002B, 0x0000000B, 0x00000A16, 0x00000004, 0x0004002B, 0x0000000B,\n    0x000007FF, 0x0F800000, 0x0004002B, 0x0000000B, 0x00000A19, 0x00000005,\n    0x0004002B, 0x0000000B, 0x000000E9, 0x00700007, 0x0004002B, 0x0000000B,\n    0x00000A1C, 0x00000006, 0x0004002B, 0x0000000B, 0x00000AC1, 0x00000C00,\n    0x0004002B, 0x0000000B, 0x00000A09, 0x55555555, 0x0004002B, 0x0000000B,\n    0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B, 0x00000A08, 0xAAAAAAAA,\n    0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000, 0x0004002B, 0x0000000B,\n    0x00000A10, 0x00000002, 0x0007002C, 0x00000017, 0x0000004D, 0x00000A0A,\n    0x00000A10, 0x00000A16, 0x00000A1C, 0x0004002B, 0x0000000B, 0x00000A44,\n    0x000003FF, 0x0004002B, 0x0000000B, 0x00000A3A, 0x00000010, 0x0004002B,\n    0x0000000B, 0x00000A28, 0x0000000A, 0x0004002B, 0x0000000B, 0x00000A22,\n    0x00000008, 0x0004002B, 0x0000000B, 0x00000A46, 0x00000014, 0x0004002B,\n    0x0000000B, 0x000009E9, 0x00249249, 0x0004002B, 0x0000000B, 0x000009C8,\n    0x00492492, 0x0004002B, 0x0000000B, 0x00000986, 0x00924924, 0x0004002B,\n    0x0000000B, 0x00000944, 0x00DB6DB6, 0x0004002B, 0x0000000B, 0x00000A52,\n    0x00000018, 0x0004002B, 0x0000000B, 0x0000003A, 0x00000492, 0x0004002B,\n    0x0000000B, 0x0000022D, 0x00000924, 0x0004002B, 0x0000000B, 0x00000908,\n    0x00000B6D, 0x0004002B, 0x0000000B, 0x00000ACA, 0x00000040, 0x0004002B,\n    0x0000000B, 0x00000447, 0x00000200, 0x0004002B, 0x0000000B, 0x00000A37,\n    0x0000000F, 0x0004002B, 0x0000000B, 0x00000144, 0x000000FF, 0x0004002B,\n    0x0000000B, 0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B, 0x000005FD,\n    0xFF00FF00, 0x0004002B, 0x0000000C, 0x00000A17, 0x00000004, 0x0004002B,\n    0x0000000C, 0x00000A1D, 0x00000006, 0x0004002B, 0x0000000C, 0x00000A2C,\n    0x0000000B, 0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001, 0x0004002B,\n    0x0000000C, 0x00000A1A, 0x00000005, 0x0004002B, 0x0000000C, 0x00000A20,\n    0x00000007, 0x0004002B, 0x0000000C, 0x00000A23, 0x00000008, 0x0004002B,\n    0x0000000C, 0x00000A2F, 0x0000000C, 0x0004002B, 0x0000000C, 0x00000A14,\n    0x00000003, 0x0004002B, 0x0000000C, 0x00000A11, 0x00000002, 0x0004002B,\n    0x0000000C, 0x00000A0B, 0x00000000, 0x000A001E, 0x00000489, 0x0000000B,\n    0x0000000B, 0x0000000B, 0x0000000B, 0x00000014, 0x0000000B, 0x0000000B,\n    0x0000000B, 0x00040020, 0x00000706, 0x00000009, 0x00000489, 0x0004003B,\n    0x00000706, 0x00000CE9, 0x00000009, 0x00040020, 0x00000288, 0x00000009,\n    0x0000000B, 0x00040020, 0x00000291, 0x00000009, 0x00000014, 0x00040020,\n    0x00000292, 0x00000001, 0x00000014, 0x0004003B, 0x00000292, 0x00000F48,\n    0x00000001, 0x0006002C, 0x00000014, 0x00000A1B, 0x00000A0D, 0x00000A0A,\n    0x00000A0A, 0x00040017, 0x0000000F, 0x00000009, 0x00000002, 0x0006002C,\n    0x00000014, 0x00000A3B, 0x00000A10, 0x00000A10, 0x00000A0A, 0x0003001D,\n    0x000007DC, 0x00000017, 0x0003001E, 0x000007B4, 0x000007DC, 0x00040020,\n    0x00000A32, 0x00000002, 0x000007B4, 0x0004003B, 0x00000A32, 0x0000107A,\n    0x00000002, 0x00040020, 0x00000294, 0x00000002, 0x00000017, 0x0005002C,\n    0x00000011, 0x0000076F, 0x00000A0A, 0x00000A22, 0x0003001D, 0x000007DD,\n    0x00000017, 0x0003001E, 0x000007B5, 0x000007DD, 0x00040020, 0x00000A33,\n    0x00000002, 0x000007B5, 0x0004003B, 0x00000A33, 0x0000140E, 0x00000002,\n    0x0007002C, 0x00000017, 0x0000019D, 0x00000A52, 0x00000A3A, 0x00000A22,\n    0x00000A0A, 0x0004002B, 0x0000000B, 0x00000580, 0xFF000000, 0x0004002B,\n    0x0000000B, 0x00000A6A, 0x00000020, 0x0006002C, 0x00000014, 0x00000BC3,\n    0x00000A16, 0x00000A6A, 0x00000A0D, 0x0007002C, 0x00000017, 0x000009CE,\n    0x000008A6, 0x000008A6, 0x000008A6, 0x000008A6, 0x0007002C, 0x00000017,\n    0x0000013D, 0x00000A22, 0x00000A22, 0x00000A22, 0x00000A22, 0x0007002C,\n    0x00000017, 0x0000072E, 0x000005FD, 0x000005FD, 0x000005FD, 0x000005FD,\n    0x0007002C, 0x00000017, 0x000002ED, 0x00000A3A, 0x00000A3A, 0x00000A3A,\n    0x00000A3A, 0x0005002C, 0x00000011, 0x000003E1, 0x0000012F, 0x0000012F,\n    0x0005002C, 0x00000011, 0x000003F7, 0x00000B47, 0x00000B47, 0x0005002C,\n    0x00000011, 0x000009F3, 0x000007FF, 0x000007FF, 0x0005002C, 0x00000011,\n    0x00000778, 0x00000A19, 0x00000A19, 0x0005002C, 0x00000011, 0x000001F7,\n    0x000000E9, 0x000000E9, 0x0005002C, 0x00000011, 0x0000078D, 0x00000A1C,\n    0x00000A1C, 0x0005002C, 0x00000011, 0x0000004E, 0x00000AC1, 0x00000AC1,\n    0x0007002C, 0x00000017, 0x00000B3E, 0x00000A09, 0x00000A09, 0x00000A09,\n    0x00000A09, 0x0007002C, 0x00000017, 0x00000B86, 0x00000A0D, 0x00000A0D,\n    0x00000A0D, 0x00000A0D, 0x0007002C, 0x00000017, 0x00000B2C, 0x00000A08,\n    0x00000A08, 0x00000A08, 0x00000A08, 0x0005002C, 0x00000011, 0x00000474,\n    0x00000144, 0x00000144, 0x0007002C, 0x00000017, 0x0000002F, 0x00000A13,\n    0x00000A13, 0x00000A13, 0x00000A13, 0x0007002C, 0x00000017, 0x000003A1,\n    0x00000A44, 0x00000A44, 0x00000A44, 0x00000A44, 0x0007002C, 0x00000017,\n    0x000001A9, 0x00000A28, 0x00000A28, 0x00000A28, 0x00000A28, 0x0007002C,\n    0x00000017, 0x000003C5, 0x00000A46, 0x00000A46, 0x00000A46, 0x00000A46,\n    0x0007002C, 0x00000017, 0x00000A27, 0x00000580, 0x00000580, 0x00000580,\n    0x00000580, 0x00050036, 0x00000008, 0x0000161F, 0x00000000, 0x00000502,\n    0x000200F8, 0x00003B06, 0x000300F7, 0x00003A37, 0x00000000, 0x000300FB,\n    0x00000A0A, 0x00002E68, 0x000200F8, 0x00002E68, 0x00050041, 0x00000288,\n    0x000060D7, 0x00000CE9, 0x00000A0B, 0x0004003D, 0x0000000B, 0x00003526,\n    0x000060D7, 0x000500C7, 0x0000000B, 0x00005FDC, 0x00003526, 0x00000A0D,\n    0x000500AB, 0x00000009, 0x00004376, 0x00005FDC, 0x00000A0A, 0x000500C7,\n    0x0000000B, 0x00003028, 0x00003526, 0x00000A10, 0x000500AB, 0x00000009,\n    0x00004384, 0x00003028, 0x00000A0A, 0x000500C2, 0x0000000B, 0x00001EB0,\n    0x00003526, 0x00000A10, 0x000500C7, 0x0000000B, 0x000061E2, 0x00001EB0,\n    0x00000A13, 0x00050041, 0x00000288, 0x0000492C, 0x00000CE9, 0x00000A0E,\n    0x0004003D, 0x0000000B, 0x00005EAC, 0x0000492C, 0x00050041, 0x00000288,\n    0x00004EBA, 0x00000CE9, 0x00000A11, 0x0004003D, 0x0000000B, 0x00005788,\n    0x00004EBA, 0x00050041, 0x00000288, 0x00004EBB, 0x00000CE9, 0x00000A14,\n    0x0004003D, 0x0000000B, 0x00005789, 0x00004EBB, 0x00050041, 0x00000291,\n    0x00004EBC, 0x00000CE9, 0x00000A17, 0x0004003D, 0x00000014, 0x0000578A,\n    0x00004EBC, 0x00050041, 0x00000288, 0x00004EBD, 0x00000CE9, 0x00000A1A,\n    0x0004003D, 0x0000000B, 0x0000578B, 0x00004EBD, 0x00050041, 0x00000288,\n    0x00004EBE, 0x00000CE9, 0x00000A1D, 0x0004003D, 0x0000000B, 0x0000578C,\n    0x00004EBE, 0x00050041, 0x00000288, 0x00004E6E, 0x00000CE9, 0x00000A20,\n    0x0004003D, 0x0000000B, 0x000019C2, 0x00004E6E, 0x0004003D, 0x00000014,\n    0x00002A0E, 0x00000F48, 0x000500C4, 0x00000014, 0x0000538B, 0x00002A0E,\n    0x00000A1B, 0x0007004F, 0x00000011, 0x000042F0, 0x0000538B, 0x0000538B,\n    0x00000000, 0x00000001, 0x0007004F, 0x00000011, 0x0000242F, 0x0000578A,\n    0x0000578A, 0x00000000, 0x00000001, 0x000500AE, 0x0000000F, 0x00004288,\n    0x000042F0, 0x0000242F, 0x0004009A, 0x00000009, 0x00006067, 0x00004288,\n    0x000300F7, 0x000036C2, 0x00000002, 0x000400FA, 0x00006067, 0x000055E8,\n    0x000036C2, 0x000200F8, 0x000055E8, 0x000200F9, 0x00003A37, 0x000200F8,\n    0x000036C2, 0x000500C4, 0x00000014, 0x000043C0, 0x0000538B, 0x00000A3B,\n    0x0004007C, 0x00000016, 0x00003C81, 0x000043C0, 0x00050051, 0x0000000C,\n    0x000047A0, 0x00003C81, 0x00000000, 0x00050084, 0x0000000C, 0x00002492,\n    0x000047A0, 0x00000A17, 0x00050051, 0x0000000C, 0x000018DA, 0x00003C81,\n    0x00000002, 0x0004007C, 0x0000000C, 0x000038A9, 0x000019C2, 0x00050084,\n    0x0000000C, 0x00002C0F, 0x000018DA, 0x000038A9, 0x00050051, 0x0000000C,\n    0x000044BE, 0x00003C81, 0x00000001, 0x00050080, 0x0000000C, 0x000056D4,\n    0x00002C0F, 0x000044BE, 0x0004007C, 0x0000000C, 0x00005785, 0x0000578C,\n    0x00050084, 0x0000000C, 0x00005FD7, 0x000056D4, 0x00005785, 0x00050080,\n    0x0000000C, 0x00002042, 0x00002492, 0x00005FD7, 0x0004007C, 0x0000000B,\n    0x000028A4, 0x00002042, 0x00050080, 0x0000000B, 0x000038F6, 0x0000578B,\n    0x000028A4, 0x000400A8, 0x00000009, 0x00003014, 0x00004376, 0x000300F7,\n    0x00003ABB, 0x00000002, 0x000400FA, 0x00003014, 0x000020B9, 0x00005768,\n    0x000200F8, 0x00005768, 0x000300F7, 0x00005BF0, 0x00000002, 0x000400FA,\n    0x00004384, 0x00005F21, 0x00005BE0, 0x000200F8, 0x00005BE0, 0x0004007C,\n    0x00000012, 0x00001F1C, 0x000042F0, 0x000500C2, 0x0000000B, 0x00005668,\n    0x00005788, 0x00000A1A, 0x00050051, 0x0000000C, 0x00003905, 0x00001F1C,\n    0x00000001, 0x000500C3, 0x0000000C, 0x00002F39, 0x00003905, 0x00000A1A,\n    0x0004007C, 0x0000000C, 0x00005780, 0x00005668, 0x00050084, 0x0000000C,\n    0x00001F02, 0x00002F39, 0x00005780, 0x00050051, 0x0000000C, 0x00006242,\n    0x00001F1C, 0x00000000, 0x000500C3, 0x0000000C, 0x00004FC7, 0x00006242,\n    0x00000A1A, 0x00050080, 0x0000000C, 0x000049B0, 0x00001F02, 0x00004FC7,\n    0x000500C4, 0x0000000C, 0x0000254A, 0x000049B0, 0x00000A1D, 0x000500C3,\n    0x0000000C, 0x0000603B, 0x00003905, 0x00000A0E, 0x000500C7, 0x0000000C,\n    0x0000539A, 0x0000603B, 0x00000A20, 0x000500C4, 0x0000000C, 0x0000534A,\n    0x0000539A, 0x00000A14, 0x000500C7, 0x0000000C, 0x00004EA5, 0x00006242,\n    0x00000A20, 0x000500C5, 0x0000000C, 0x00002B1A, 0x0000534A, 0x00004EA5,\n    0x000500C5, 0x0000000C, 0x000043B6, 0x0000254A, 0x00002B1A, 0x000500C4,\n    0x0000000C, 0x00005E63, 0x000043B6, 0x00000A16, 0x000500C3, 0x0000000C,\n    0x000031DE, 0x00003905, 0x00000A17, 0x000500C7, 0x0000000C, 0x00005447,\n    0x000031DE, 0x00000A0E, 0x000500C3, 0x0000000C, 0x000028A6, 0x00006242,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x0000511E, 0x000028A6, 0x00000A14,\n    0x000500C3, 0x0000000C, 0x000028B9, 0x00003905, 0x00000A14, 0x000500C7,\n    0x0000000C, 0x0000505E, 0x000028B9, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x0000541D, 0x0000505E, 0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BA,\n    0x0000511E, 0x0000541D, 0x000500C7, 0x0000000C, 0x00005076, 0x00003905,\n    0x00000A0E, 0x000500C4, 0x0000000C, 0x00005228, 0x00005076, 0x00000A17,\n    0x000500C4, 0x0000000C, 0x00001997, 0x000022BA, 0x00000A1D, 0x000500C5,\n    0x0000000C, 0x000047FE, 0x00005228, 0x00001997, 0x000500C4, 0x0000000C,\n    0x00001BB4, 0x00005447, 0x00000A2C, 0x000500C5, 0x0000000C, 0x00003F5B,\n    0x000047FE, 0x00001BB4, 0x000500C3, 0x0000000C, 0x00003A6E, 0x00005E63,\n    0x00000A17, 0x000500C7, 0x0000000C, 0x000018B8, 0x00003A6E, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x0000547E, 0x000018B8, 0x00000A1A, 0x000500C5,\n    0x0000000C, 0x000045A8, 0x00003F5B, 0x0000547E, 0x000500C3, 0x0000000C,\n    0x00003A6F, 0x00005E63, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018B9,\n    0x00003A6F, 0x00000A20, 0x000500C4, 0x0000000C, 0x0000547F, 0x000018B9,\n    0x00000A23, 0x000500C5, 0x0000000C, 0x0000456F, 0x000045A8, 0x0000547F,\n    0x000500C3, 0x0000000C, 0x00003C88, 0x00005E63, 0x00000A23, 0x000500C4,\n    0x0000000C, 0x00002824, 0x00003C88, 0x00000A2F, 0x000500C5, 0x0000000C,\n    0x00003B79, 0x0000456F, 0x00002824, 0x0004007C, 0x0000000B, 0x000041E5,\n    0x00003B79, 0x000200F9, 0x00005BF0, 0x000200F8, 0x00005F21, 0x0004007C,\n    0x00000016, 0x0000623B, 0x0000538B, 0x000500C2, 0x0000000B, 0x00004C14,\n    0x00005788, 0x00000A1A, 0x000500C2, 0x0000000B, 0x0000497A, 0x00005789,\n    0x00000A17, 0x00050051, 0x0000000C, 0x00001A7E, 0x0000623B, 0x00000002,\n    0x000500C3, 0x0000000C, 0x00002F3A, 0x00001A7E, 0x00000A11, 0x0004007C,\n    0x0000000C, 0x00005781, 0x0000497A, 0x00050084, 0x0000000C, 0x00001F03,\n    0x00002F3A, 0x00005781, 0x00050051, 0x0000000C, 0x00006243, 0x0000623B,\n    0x00000001, 0x000500C3, 0x0000000C, 0x00004A6F, 0x00006243, 0x00000A17,\n    0x00050080, 0x0000000C, 0x00002B2C, 0x00001F03, 0x00004A6F, 0x0004007C,\n    0x0000000C, 0x00004202, 0x00004C14, 0x00050084, 0x0000000C, 0x00003A60,\n    0x00002B2C, 0x00004202, 0x00050051, 0x0000000C, 0x00006244, 0x0000623B,\n    0x00000000, 0x000500C3, 0x0000000C, 0x00004FC8, 0x00006244, 0x00000A1A,\n    0x00050080, 0x0000000C, 0x000049FC, 0x00003A60, 0x00004FC8, 0x000500C4,\n    0x0000000C, 0x0000225D, 0x000049FC, 0x00000A20, 0x000500C7, 0x0000000C,\n    0x00002CAA, 0x00001A7E, 0x00000A14, 0x000500C4, 0x0000000C, 0x00004CAE,\n    0x00002CAA, 0x00000A1A, 0x000500C3, 0x0000000C, 0x0000383E, 0x00006243,\n    0x00000A0E, 0x000500C7, 0x0000000C, 0x00005374, 0x0000383E, 0x00000A14,\n    0x000500C4, 0x0000000C, 0x000054CA, 0x00005374, 0x00000A14, 0x000500C5,\n    0x0000000C, 0x000042CE, 0x00004CAE, 0x000054CA, 0x000500C7, 0x0000000C,\n    0x000050D5, 0x00006244, 0x00000A20, 0x000500C5, 0x0000000C, 0x00003ADD,\n    0x000042CE, 0x000050D5, 0x000500C5, 0x0000000C, 0x000043B7, 0x0000225D,\n    0x00003ADD, 0x000500C4, 0x0000000C, 0x00005E50, 0x000043B7, 0x00000A16,\n    0x000500C3, 0x0000000C, 0x000032D7, 0x00006243, 0x00000A14, 0x000500C6,\n    0x0000000C, 0x000026C9, 0x000032D7, 0x00002F3A, 0x000500C7, 0x0000000C,\n    0x00004199, 0x000026C9, 0x00000A0E, 0x000500C3, 0x0000000C, 0x00002590,\n    0x00006244, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000505F, 0x00002590,\n    0x00000A14, 0x000500C4, 0x0000000C, 0x0000541E, 0x00004199, 0x00000A0E,\n    0x000500C6, 0x0000000C, 0x000022BB, 0x0000505F, 0x0000541E, 0x000500C7,\n    0x0000000C, 0x00005077, 0x00006243, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x00005229, 0x00005077, 0x00000A17, 0x000500C4, 0x0000000C, 0x00001998,\n    0x000022BB, 0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FF, 0x00005229,\n    0x00001998, 0x000500C4, 0x0000000C, 0x00001BB5, 0x00004199, 0x00000A2C,\n    0x000500C5, 0x0000000C, 0x00003F5C, 0x000047FF, 0x00001BB5, 0x000500C3,\n    0x0000000C, 0x00003A70, 0x00005E50, 0x00000A17, 0x000500C7, 0x0000000C,\n    0x000018BA, 0x00003A70, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005480,\n    0x000018BA, 0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A9, 0x00003F5C,\n    0x00005480, 0x000500C3, 0x0000000C, 0x00003A71, 0x00005E50, 0x00000A1A,\n    0x000500C7, 0x0000000C, 0x000018BB, 0x00003A71, 0x00000A20, 0x000500C4,\n    0x0000000C, 0x00005481, 0x000018BB, 0x00000A23, 0x000500C5, 0x0000000C,\n    0x00004570, 0x000045A9, 0x00005481, 0x000500C3, 0x0000000C, 0x00003C89,\n    0x00005E50, 0x00000A23, 0x000500C4, 0x0000000C, 0x00002825, 0x00003C89,\n    0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B7A, 0x00004570, 0x00002825,\n    0x0004007C, 0x0000000B, 0x000041E6, 0x00003B7A, 0x000200F9, 0x00005BF0,\n    0x000200F8, 0x00005BF0, 0x000700F5, 0x0000000B, 0x0000292C, 0x000041E6,\n    0x00005F21, 0x000041E5, 0x00005BE0, 0x000200F9, 0x00003ABB, 0x000200F8,\n    0x000020B9, 0x00050051, 0x0000000B, 0x00004DAD, 0x0000538B, 0x00000000,\n    0x00050051, 0x0000000B, 0x00002BEE, 0x0000538B, 0x00000001, 0x00050051,\n    0x0000000B, 0x00004971, 0x0000538B, 0x00000002, 0x00050084, 0x0000000B,\n    0x000039EF, 0x00005789, 0x00004971, 0x00050080, 0x0000000B, 0x00004F62,\n    0x00002BEE, 0x000039EF, 0x00050084, 0x0000000B, 0x000054AC, 0x00005788,\n    0x00004F62, 0x00050080, 0x0000000B, 0x00004FAE, 0x00004DAD, 0x000054AC,\n    0x000500C4, 0x0000000B, 0x00002C67, 0x00004FAE, 0x00000A16, 0x000200F9,\n    0x00003ABB, 0x000200F8, 0x00003ABB, 0x000700F5, 0x0000000B, 0x00002C70,\n    0x00002C67, 0x000020B9, 0x0000292C, 0x00005BF0, 0x00050080, 0x0000000B,\n    0x000048BD, 0x00002C70, 0x00005EAC, 0x000500C2, 0x0000000B, 0x00003D52,\n    0x000048BD, 0x00000A17, 0x00060041, 0x00000294, 0x00004FAF, 0x0000107A,\n    0x00000A0B, 0x00003D52, 0x0004003D, 0x00000017, 0x00001CAA, 0x00004FAF,\n    0x000500AA, 0x00000009, 0x000035C0, 0x000061E2, 0x00000A0D, 0x000500AA,\n    0x00000009, 0x00005376, 0x000061E2, 0x00000A10, 0x000500A6, 0x00000009,\n    0x00005686, 0x000035C0, 0x00005376, 0x000300F7, 0x00003463, 0x00000000,\n    0x000400FA, 0x00005686, 0x00002957, 0x00003463, 0x000200F8, 0x00002957,\n    0x000500C7, 0x00000017, 0x0000475F, 0x00001CAA, 0x000009CE, 0x000500C4,\n    0x00000017, 0x000024D1, 0x0000475F, 0x0000013D, 0x000500C7, 0x00000017,\n    0x000050AC, 0x00001CAA, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448D,\n    0x000050AC, 0x0000013D, 0x000500C5, 0x00000017, 0x00003FF8, 0x000024D1,\n    0x0000448D, 0x000200F9, 0x00003463, 0x000200F8, 0x00003463, 0x000700F5,\n    0x00000017, 0x00005879, 0x00001CAA, 0x00003ABB, 0x00003FF8, 0x00002957,\n    0x000500AA, 0x00000009, 0x00004CB6, 0x000061E2, 0x00000A13, 0x000500A6,\n    0x00000009, 0x00003B23, 0x00005376, 0x00004CB6, 0x000300F7, 0x00002DC8,\n    0x00000000, 0x000400FA, 0x00003B23, 0x00002B38, 0x00002DC8, 0x000200F8,\n    0x00002B38, 0x000500C4, 0x00000017, 0x00005E17, 0x00005879, 0x000002ED,\n    0x000500C2, 0x00000017, 0x00003BE7, 0x00005879, 0x000002ED, 0x000500C5,\n    0x00000017, 0x000029E8, 0x00005E17, 0x00003BE7, 0x000200F9, 0x00002DC8,\n    0x000200F8, 0x00002DC8, 0x000700F5, 0x00000017, 0x00004C59, 0x00005879,\n    0x00003463, 0x000029E8, 0x00002B38, 0x00050051, 0x0000000B, 0x00005F39,\n    0x00004C59, 0x00000002, 0x000500C4, 0x0000000B, 0x00003C7F, 0x00005F39,\n    0x00000A13, 0x000500C2, 0x0000000B, 0x00001951, 0x00005F39, 0x00000A31,\n    0x00050050, 0x00000011, 0x00004370, 0x00003C7F, 0x00001951, 0x000500C7,\n    0x00000011, 0x0000191E, 0x00004370, 0x000003E1, 0x000500C4, 0x0000000B,\n    0x0000503F, 0x00005F39, 0x00000A1F, 0x000500C2, 0x0000000B, 0x00005E64,\n    0x00005F39, 0x00000A25, 0x00050050, 0x00000011, 0x00004383, 0x0000503F,\n    0x00005E64, 0x000500C7, 0x00000011, 0x00001897, 0x00004383, 0x000003F7,\n    0x000500C5, 0x00000011, 0x0000375A, 0x0000191E, 0x00001897, 0x000500C4,\n    0x0000000B, 0x00005C88, 0x00005F39, 0x00000A2E, 0x000500C2, 0x0000000B,\n    0x00005817, 0x00005F39, 0x00000A16, 0x00050050, 0x00000011, 0x00004385,\n    0x00005C88, 0x00005817, 0x000500C7, 0x00000011, 0x00001871, 0x00004385,\n    0x000009F3, 0x000500C5, 0x00000011, 0x00003913, 0x0000375A, 0x00001871,\n    0x000500C2, 0x00000011, 0x00005759, 0x00003913, 0x00000778, 0x000500C7,\n    0x00000011, 0x000018CB, 0x00005759, 0x000001F7, 0x000500C5, 0x00000011,\n    0x00004046, 0x00003913, 0x000018CB, 0x000500C2, 0x00000011, 0x0000575A,\n    0x00004046, 0x0000078D, 0x000500C7, 0x00000011, 0x00005AE7, 0x0000575A,\n    0x0000004E, 0x000500C5, 0x00000011, 0x0000394F, 0x00004046, 0x00005AE7,\n    0x00050051, 0x0000000B, 0x00004BDE, 0x00004C59, 0x00000003, 0x00050050,\n    0x00000011, 0x00003C50, 0x00004BDE, 0x00004BDE, 0x0009004F, 0x00000017,\n    0x00006231, 0x00003C50, 0x00003C50, 0x00000000, 0x00000001, 0x00000000,\n    0x00000000, 0x000500C7, 0x00000017, 0x00002C7C, 0x00006231, 0x00000B3E,\n    0x000500C4, 0x00000017, 0x00005ECA, 0x00002C7C, 0x00000B86, 0x000500C7,\n    0x00000017, 0x000050AD, 0x00006231, 0x00000B2C, 0x000500C2, 0x00000017,\n    0x000040D7, 0x000050AD, 0x00000B86, 0x000500C5, 0x00000017, 0x00005DC0,\n    0x00005ECA, 0x000040D7, 0x000500C7, 0x00000017, 0x00004CA2, 0x00005DC0,\n    0x00000B2C, 0x000500C2, 0x00000017, 0x0000472B, 0x00004CA2, 0x00000B86,\n    0x000500C6, 0x00000017, 0x00003A75, 0x00005DC0, 0x0000472B, 0x00050051,\n    0x0000000B, 0x000050F7, 0x00003A75, 0x00000000, 0x0007004F, 0x00000011,\n    0x00004FA3, 0x00004C59, 0x00004C59, 0x00000000, 0x00000000, 0x000500C2,\n    0x00000011, 0x00002344, 0x00004FA3, 0x0000076F, 0x000500C7, 0x00000011,\n    0x0000221C, 0x00002344, 0x00000474, 0x00050051, 0x0000000B, 0x00004463,\n    0x00004C59, 0x00000000, 0x000500C2, 0x0000000B, 0x000029E7, 0x00004463,\n    0x00000A3A, 0x00050051, 0x0000000B, 0x000025B2, 0x00004C59, 0x00000001,\n    0x000500C7, 0x0000000B, 0x0000185E, 0x000025B2, 0x00000144, 0x000500C4,\n    0x0000000B, 0x00005E0E, 0x0000185E, 0x00000A3A, 0x000500C5, 0x0000000B,\n    0x00003F71, 0x000029E7, 0x00005E0E, 0x00050051, 0x0000000B, 0x000055B3,\n    0x0000221C, 0x00000000, 0x00050051, 0x0000000B, 0x00002777, 0x0000221C,\n    0x00000001, 0x000500B2, 0x00000009, 0x00004E83, 0x000055B3, 0x00002777,\n    0x000300F7, 0x0000362B, 0x00000000, 0x000400FA, 0x00004E83, 0x000055A0,\n    0x00002990, 0x000200F8, 0x00002990, 0x000500C7, 0x0000000B, 0x000044F9,\n    0x00003F71, 0x000009E9, 0x000500C7, 0x0000000B, 0x00005D66, 0x00003F71,\n    0x000009C8, 0x000500C2, 0x0000000B, 0x000056E7, 0x00005D66, 0x00000A0D,\n    0x000500C5, 0x0000000B, 0x00005DC1, 0x000044F9, 0x000056E7, 0x000500C7,\n    0x0000000B, 0x00004C8F, 0x00003F71, 0x00000986, 0x000500C2, 0x0000000B,\n    0x00005087, 0x00004C8F, 0x00000A10, 0x000500C5, 0x0000000B, 0x00005EDF,\n    0x00005DC1, 0x00005087, 0x000500C6, 0x0000000B, 0x00001E29, 0x00005EDF,\n    0x000009E9, 0x000400C8, 0x0000000B, 0x00002544, 0x000056E7, 0x000500C7,\n    0x0000000B, 0x0000391D, 0x000044F9, 0x00002544, 0x000400C8, 0x0000000B,\n    0x000020E9, 0x00005087, 0x000500C7, 0x0000000B, 0x00002C8F, 0x0000391D,\n    0x000020E9, 0x000500C5, 0x0000000B, 0x00001A8F, 0x00003F71, 0x00001E29,\n    0x00050082, 0x0000000B, 0x00004C35, 0x00001A8F, 0x000009E9, 0x000500C5,\n    0x0000000B, 0x00003A17, 0x00004C35, 0x00002C8F, 0x000500C4, 0x0000000B,\n    0x000046E8, 0x00002C8F, 0x00000A0D, 0x000500C5, 0x0000000B, 0x00003E88,\n    0x00003A17, 0x000046E8, 0x000500C4, 0x0000000B, 0x00001FB6, 0x00002C8F,\n    0x00000A10, 0x000500C5, 0x0000000B, 0x00001E80, 0x00003E88, 0x00001FB6,\n    0x000200F9, 0x0000362B, 0x000200F8, 0x000055A0, 0x000500C7, 0x0000000B,\n    0x00004E6F, 0x00003F71, 0x000009C8, 0x000500C7, 0x0000000B, 0x00005D8C,\n    0x00003F71, 0x00000986, 0x000500C2, 0x0000000B, 0x00005554, 0x00005D8C,\n    0x00000A0D, 0x000500C7, 0x0000000B, 0x00001FC5, 0x00004E6F, 0x00005554,\n    0x000500C4, 0x0000000B, 0x00006021, 0x00001FC5, 0x00000A0D, 0x000500C2,\n    0x0000000B, 0x000059AC, 0x00001FC5, 0x00000A0D, 0x000500C5, 0x0000000B,\n    0x00004969, 0x00006021, 0x000059AC, 0x000500C5, 0x0000000B, 0x00003EB1,\n    0x00001FC5, 0x00004969, 0x000500C7, 0x0000000B, 0x00004785, 0x00003F71,\n    0x000009E9, 0x000500C5, 0x0000000B, 0x0000395D, 0x00004785, 0x00000944,\n    0x000500C7, 0x0000000B, 0x00004FB3, 0x0000395D, 0x00003EB1, 0x000500C2,\n    0x0000000B, 0x0000503B, 0x00004E6F, 0x00000A0D, 0x000500C5, 0x0000000B,\n    0x0000615A, 0x00004785, 0x0000503B, 0x000500C2, 0x0000000B, 0x000055A2,\n    0x00005D8C, 0x00000A10, 0x000500C5, 0x0000000B, 0x00005892, 0x0000615A,\n    0x000055A2, 0x000500C6, 0x0000000B, 0x00001E2A, 0x00005892, 0x000009E9,\n    0x000400C8, 0x0000000B, 0x00002545, 0x0000503B, 0x000500C7, 0x0000000B,\n    0x0000391E, 0x00004785, 0x00002545, 0x000400C8, 0x0000000B, 0x000020EA,\n    0x000055A2, 0x000500C7, 0x0000000B, 0x00002C90, 0x0000391E, 0x000020EA,\n    0x000500C5, 0x0000000B, 0x00001A90, 0x00003F71, 0x00001E2A, 0x00050082,\n    0x0000000B, 0x00004C36, 0x00001A90, 0x000009E9, 0x000500C5, 0x0000000B,\n    0x00003A18, 0x00004C36, 0x00002C90, 0x000500C4, 0x0000000B, 0x00004734,\n    0x00002C90, 0x00000A10, 0x000500C5, 0x0000000B, 0x00003BFA, 0x00003A18,\n    0x00004734, 0x000400C8, 0x0000000B, 0x00002F7A, 0x00003EB1, 0x000500C7,\n    0x0000000B, 0x00004850, 0x00003BFA, 0x00002F7A, 0x000500C5, 0x0000000B,\n    0x0000186C, 0x00004850, 0x00004FB3, 0x000200F9, 0x0000362B, 0x000200F8,\n    0x0000362B, 0x000700F5, 0x0000000B, 0x00004AC7, 0x0000186C, 0x000055A0,\n    0x00001E80, 0x00002990, 0x000500C2, 0x0000000B, 0x00005CB4, 0x000038F6,\n    0x00000A17, 0x000400C8, 0x0000000B, 0x000060F6, 0x000050F7, 0x00070050,\n    0x00000017, 0x000052F4, 0x000060F6, 0x000060F6, 0x000060F6, 0x000060F6,\n    0x000500C2, 0x00000017, 0x00005DE8, 0x000052F4, 0x0000004D, 0x000500C7,\n    0x00000017, 0x00005AAF, 0x00005DE8, 0x0000002F, 0x00050051, 0x0000000B,\n    0x00004AB7, 0x0000394F, 0x00000000, 0x00070050, 0x00000017, 0x00006076,\n    0x00004AB7, 0x00004AB7, 0x00004AB7, 0x00004AB7, 0x00050084, 0x00000017,\n    0x00005FF2, 0x00005AAF, 0x00006076, 0x00070050, 0x00000017, 0x0000627B,\n    0x000050F7, 0x000050F7, 0x000050F7, 0x000050F7, 0x000500C2, 0x00000017,\n    0x0000383D, 0x0000627B, 0x0000004D, 0x000500C7, 0x00000017, 0x00005AB0,\n    0x0000383D, 0x0000002F, 0x00050051, 0x0000000B, 0x00004AB8, 0x0000394F,\n    0x00000001, 0x00070050, 0x00000017, 0x00001987, 0x00004AB8, 0x00004AB8,\n    0x00004AB8, 0x00004AB8, 0x00050084, 0x00000017, 0x00003FE1, 0x00005AB0,\n    0x00001987, 0x00050080, 0x00000017, 0x00002C03, 0x00005FF2, 0x00003FE1,\n    0x000500C7, 0x00000017, 0x000060BE, 0x00002C03, 0x000003A1, 0x00050086,\n    0x00000017, 0x00002409, 0x000060BE, 0x0000002F, 0x000500C4, 0x00000017,\n    0x000044C8, 0x00002409, 0x000002ED, 0x000500C2, 0x00000017, 0x00002AD1,\n    0x00002C03, 0x000001A9, 0x000500C7, 0x00000017, 0x000033C1, 0x00002AD1,\n    0x000003A1, 0x00050086, 0x00000017, 0x000043A0, 0x000033C1, 0x0000002F,\n    0x000500C4, 0x00000017, 0x00004262, 0x000043A0, 0x0000013D, 0x000500C5,\n    0x00000017, 0x000018AE, 0x000044C8, 0x00004262, 0x000500C2, 0x00000017,\n    0x00003BF0, 0x00002C03, 0x000003C5, 0x00050086, 0x00000017, 0x00006196,\n    0x00003BF0, 0x0000002F, 0x000500C5, 0x00000017, 0x00004C1A, 0x000018AE,\n    0x00006196, 0x000300F7, 0x00005BFF, 0x00000000, 0x000400FA, 0x00004E83,\n    0x000055A1, 0x000028E3, 0x000200F8, 0x000028E3, 0x000400C8, 0x0000000B,\n    0x0000205E, 0x00004AC7, 0x000500C7, 0x0000000B, 0x00003BFB, 0x0000205E,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00004530, 0x000055B3, 0x00003BFB,\n    0x000500C7, 0x0000000B, 0x000055D7, 0x00004AC7, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00004FA6, 0x00002777, 0x000055D7, 0x00050080, 0x0000000B,\n    0x00004D82, 0x00004530, 0x00004FA6, 0x00050086, 0x0000000B, 0x000032C8,\n    0x00004D82, 0x00000A1F, 0x000500C2, 0x0000000B, 0x000059EE, 0x0000205E,\n    0x00000A13, 0x000500C7, 0x0000000B, 0x00002231, 0x000059EE, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00003AA3, 0x000055B3, 0x00002231, 0x000500C2,\n    0x0000000B, 0x000033E3, 0x00004AC7, 0x00000A13, 0x000500C7, 0x0000000B,\n    0x0000617D, 0x000033E3, 0x00000A1F, 0x00050084, 0x0000000B, 0x0000626A,\n    0x00002777, 0x0000617D, 0x00050080, 0x0000000B, 0x00004DA8, 0x00003AA3,\n    0x0000626A, 0x00050086, 0x0000000B, 0x00003148, 0x00004DA8, 0x00000A1F,\n    0x000500C4, 0x0000000B, 0x00001FE0, 0x00003148, 0x00000A22, 0x000500C5,\n    0x0000000B, 0x00001D81, 0x000032C8, 0x00001FE0, 0x000500C2, 0x0000000B,\n    0x000055AF, 0x0000205E, 0x00000A1C, 0x000500C7, 0x0000000B, 0x000044B8,\n    0x000055AF, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AA4, 0x000055B3,\n    0x000044B8, 0x000500C2, 0x0000000B, 0x000033E4, 0x00004AC7, 0x00000A1C,\n    0x000500C7, 0x0000000B, 0x0000617E, 0x000033E4, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x0000626B, 0x00002777, 0x0000617E, 0x00050080, 0x0000000B,\n    0x00004DA9, 0x00003AA4, 0x0000626B, 0x00050086, 0x0000000B, 0x00003149,\n    0x00004DA9, 0x00000A1F, 0x000500C4, 0x0000000B, 0x00001FE1, 0x00003149,\n    0x00000A3A, 0x000500C5, 0x0000000B, 0x00001D82, 0x00001D81, 0x00001FE1,\n    0x000500C2, 0x0000000B, 0x000055B0, 0x0000205E, 0x00000A25, 0x000500C7,\n    0x0000000B, 0x000044B9, 0x000055B0, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00003AA5, 0x000055B3, 0x000044B9, 0x000500C2, 0x0000000B, 0x000033E5,\n    0x00004AC7, 0x00000A25, 0x000500C7, 0x0000000B, 0x0000617F, 0x000033E5,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x0000626C, 0x00002777, 0x0000617F,\n    0x00050080, 0x0000000B, 0x00004DAA, 0x00003AA5, 0x0000626C, 0x00050086,\n    0x0000000B, 0x0000314A, 0x00004DAA, 0x00000A1F, 0x000500C4, 0x0000000B,\n    0x000023F5, 0x0000314A, 0x00000A52, 0x000500C5, 0x0000000B, 0x00004678,\n    0x00001D82, 0x000023F5, 0x000200F9, 0x00005BFF, 0x000200F8, 0x000055A1,\n    0x000500C7, 0x0000000B, 0x00004E70, 0x00004AC7, 0x0000003A, 0x000500C7,\n    0x0000000B, 0x00005D8D, 0x00004AC7, 0x0000022D, 0x000500C2, 0x0000000B,\n    0x00005555, 0x00005D8D, 0x00000A0D, 0x000500C7, 0x0000000B, 0x00001FC6,\n    0x00004E70, 0x00005555, 0x000500C4, 0x0000000B, 0x00006022, 0x00001FC6,\n    0x00000A0D, 0x000500C2, 0x0000000B, 0x000059AD, 0x00001FC6, 0x00000A0D,\n    0x000500C5, 0x0000000B, 0x0000497C, 0x00006022, 0x000059AD, 0x000500C5,\n    0x0000000B, 0x00003E2A, 0x00001FC6, 0x0000497C, 0x000400C8, 0x0000000B,\n    0x0000210B, 0x00003E2A, 0x000500C7, 0x0000000B, 0x00002762, 0x00004AC7,\n    0x0000210B, 0x00050082, 0x0000000B, 0x00003FAC, 0x00000908, 0x00002762,\n    0x000500C7, 0x0000000B, 0x00004407, 0x00003FAC, 0x0000210B, 0x000500C7,\n    0x0000000B, 0x0000425F, 0x00004407, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x0000356D, 0x000055B3, 0x0000425F, 0x000500C7, 0x0000000B, 0x000055D8,\n    0x00002762, 0x00000A1F, 0x00050084, 0x0000000B, 0x00004FA7, 0x00002777,\n    0x000055D8, 0x00050080, 0x0000000B, 0x00004D83, 0x0000356D, 0x00004FA7,\n    0x00050086, 0x0000000B, 0x000032C9, 0x00004D83, 0x00000A19, 0x000500C2,\n    0x0000000B, 0x000059EF, 0x00004407, 0x00000A13, 0x000500C7, 0x0000000B,\n    0x00002232, 0x000059EF, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AA6,\n    0x000055B3, 0x00002232, 0x000500C2, 0x0000000B, 0x000033E6, 0x00002762,\n    0x00000A13, 0x000500C7, 0x0000000B, 0x00006180, 0x000033E6, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x0000626D, 0x00002777, 0x00006180, 0x00050080,\n    0x0000000B, 0x00004DAB, 0x00003AA6, 0x0000626D, 0x00050086, 0x0000000B,\n    0x0000314B, 0x00004DAB, 0x00000A19, 0x000500C4, 0x0000000B, 0x00001FE2,\n    0x0000314B, 0x00000A22, 0x000500C5, 0x0000000B, 0x00001D83, 0x000032C9,\n    0x00001FE2, 0x000500C2, 0x0000000B, 0x000055B1, 0x00004407, 0x00000A1C,\n    0x000500C7, 0x0000000B, 0x000044BA, 0x000055B1, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00003AA7, 0x000055B3, 0x000044BA, 0x000500C2, 0x0000000B,\n    0x000033E7, 0x00002762, 0x00000A1C, 0x000500C7, 0x0000000B, 0x00006181,\n    0x000033E7, 0x00000A1F, 0x00050084, 0x0000000B, 0x0000626E, 0x00002777,\n    0x00006181, 0x00050080, 0x0000000B, 0x00004DAC, 0x00003AA7, 0x0000626E,\n    0x00050086, 0x0000000B, 0x0000314C, 0x00004DAC, 0x00000A19, 0x000500C4,\n    0x0000000B, 0x00001FE3, 0x0000314C, 0x00000A3A, 0x000500C5, 0x0000000B,\n    0x00001D84, 0x00001D83, 0x00001FE3, 0x000500C2, 0x0000000B, 0x000055B2,\n    0x00004407, 0x00000A25, 0x000500C7, 0x0000000B, 0x000044BB, 0x000055B2,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00003AA8, 0x000055B3, 0x000044BB,\n    0x000500C2, 0x0000000B, 0x000033E8, 0x00002762, 0x00000A25, 0x000500C7,\n    0x0000000B, 0x00006182, 0x000033E8, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x0000626F, 0x00002777, 0x00006182, 0x00050080, 0x0000000B, 0x00004DAE,\n    0x00003AA8, 0x0000626F, 0x00050086, 0x0000000B, 0x0000314D, 0x00004DAE,\n    0x00000A19, 0x000500C4, 0x0000000B, 0x0000203F, 0x0000314D, 0x00000A52,\n    0x000500C5, 0x0000000B, 0x00001A20, 0x00001D84, 0x0000203F, 0x000500C7,\n    0x0000000B, 0x00004FA1, 0x00004AC7, 0x00003E2A, 0x000500C7, 0x0000000B,\n    0x00004400, 0x00004FA1, 0x00000A0D, 0x000500C7, 0x0000000B, 0x00004C67,\n    0x00004FA1, 0x00000A22, 0x000500C4, 0x0000000B, 0x00006164, 0x00004C67,\n    0x00000A19, 0x000500C5, 0x0000000B, 0x000042BB, 0x00004400, 0x00006164,\n    0x000500C7, 0x0000000B, 0x00005182, 0x00004FA1, 0x00000ACA, 0x000500C4,\n    0x0000000B, 0x00005B17, 0x00005182, 0x00000A28, 0x000500C5, 0x0000000B,\n    0x000042BC, 0x000042BB, 0x00005B17, 0x000500C7, 0x0000000B, 0x00005183,\n    0x00004FA1, 0x00000447, 0x000500C4, 0x0000000B, 0x0000561E, 0x00005183,\n    0x00000A37, 0x000500C5, 0x0000000B, 0x00002077, 0x000042BC, 0x0000561E,\n    0x00050084, 0x0000000B, 0x000028B3, 0x00002077, 0x00000144, 0x00050080,\n    0x0000000B, 0x00004800, 0x00001A20, 0x000028B3, 0x000200F9, 0x00005BFF,\n    0x000200F8, 0x00005BFF, 0x000700F5, 0x0000000B, 0x00004D06, 0x00004800,\n    0x000055A1, 0x00004678, 0x000028E3, 0x00070050, 0x00000017, 0x0000351A,\n    0x00004D06, 0x00004D06, 0x00004D06, 0x00004D06, 0x000500C4, 0x00000017,\n    0x000042C6, 0x0000351A, 0x0000019D, 0x000500C7, 0x00000017, 0x000053BB,\n    0x000042C6, 0x00000A27, 0x000500C5, 0x00000017, 0x00002FDD, 0x00004C1A,\n    0x000053BB, 0x00060041, 0x00000294, 0x00004EC5, 0x0000140E, 0x00000A0B,\n    0x00005CB4, 0x0003003E, 0x00004EC5, 0x00002FDD, 0x00050051, 0x0000000B,\n    0x00003220, 0x000043C0, 0x00000001, 0x00050080, 0x0000000B, 0x00005AC0,\n    0x00003220, 0x00000A0D, 0x000500B0, 0x00000009, 0x00004411, 0x00005AC0,\n    0x000019C2, 0x000300F7, 0x00002358, 0x00000002, 0x000400FA, 0x00004411,\n    0x0000592C, 0x00002358, 0x000200F8, 0x0000592C, 0x00050080, 0x0000000B,\n    0x00003C79, 0x000038F6, 0x0000578C, 0x000500C2, 0x0000000B, 0x000037CC,\n    0x00003C79, 0x00000A17, 0x000500C2, 0x0000000B, 0x00002E66, 0x000050F7,\n    0x00000A22, 0x000400C8, 0x0000000B, 0x00004B04, 0x00002E66, 0x00070050,\n    0x00000017, 0x000052F5, 0x00004B04, 0x00004B04, 0x00004B04, 0x00004B04,\n    0x000500C2, 0x00000017, 0x000061B1, 0x000052F5, 0x0000004D, 0x000500C7,\n    0x00000017, 0x00003838, 0x000061B1, 0x0000002F, 0x00050084, 0x00000017,\n    0x00003CCF, 0x00003838, 0x00006076, 0x00070050, 0x00000017, 0x00005399,\n    0x00002E66, 0x00002E66, 0x00002E66, 0x00002E66, 0x000500C2, 0x00000017,\n    0x00003C06, 0x00005399, 0x0000004D, 0x000500C7, 0x00000017, 0x00003BC8,\n    0x00003C06, 0x0000002F, 0x00050084, 0x00000017, 0x00001CBE, 0x00003BC8,\n    0x00001987, 0x00050080, 0x00000017, 0x00001D21, 0x00003CCF, 0x00001CBE,\n    0x000500C7, 0x00000017, 0x000060BF, 0x00001D21, 0x000003A1, 0x00050086,\n    0x00000017, 0x0000240A, 0x000060BF, 0x0000002F, 0x000500C4, 0x00000017,\n    0x000044C9, 0x0000240A, 0x000002ED, 0x000500C2, 0x00000017, 0x00002AD2,\n    0x00001D21, 0x000001A9, 0x000500C7, 0x00000017, 0x000033C2, 0x00002AD2,\n    0x000003A1, 0x00050086, 0x00000017, 0x000043A1, 0x000033C2, 0x0000002F,\n    0x000500C4, 0x00000017, 0x00004263, 0x000043A1, 0x0000013D, 0x000500C5,\n    0x00000017, 0x000018AF, 0x000044C9, 0x00004263, 0x000500C2, 0x00000017,\n    0x00003BF1, 0x00001D21, 0x000003C5, 0x00050086, 0x00000017, 0x00005DA7,\n    0x00003BF1, 0x0000002F, 0x000500C5, 0x00000017, 0x00002533, 0x000018AF,\n    0x00005DA7, 0x000500C2, 0x0000000B, 0x00005C83, 0x00004AC7, 0x00000A2E,\n    0x000300F7, 0x00005C00, 0x00000000, 0x000400FA, 0x00004E83, 0x000055A3,\n    0x000028E4, 0x000200F8, 0x000028E4, 0x000400C8, 0x0000000B, 0x0000205F,\n    0x00005C83, 0x000500C7, 0x0000000B, 0x00003BFC, 0x0000205F, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00004531, 0x000055B3, 0x00003BFC, 0x000500C7,\n    0x0000000B, 0x000055D9, 0x00005C83, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00004FA8, 0x00002777, 0x000055D9, 0x00050080, 0x0000000B, 0x00004D84,\n    0x00004531, 0x00004FA8, 0x00050086, 0x0000000B, 0x000032CA, 0x00004D84,\n    0x00000A1F, 0x000500C2, 0x0000000B, 0x000059F0, 0x0000205F, 0x00000A13,\n    0x000500C7, 0x0000000B, 0x00002233, 0x000059F0, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00003AA9, 0x000055B3, 0x00002233, 0x000500C2, 0x0000000B,\n    0x000033E9, 0x00005C83, 0x00000A13, 0x000500C7, 0x0000000B, 0x00006183,\n    0x000033E9, 0x00000A1F, 0x00050084, 0x0000000B, 0x00006270, 0x00002777,\n    0x00006183, 0x00050080, 0x0000000B, 0x00004DAF, 0x00003AA9, 0x00006270,\n    0x00050086, 0x0000000B, 0x0000314E, 0x00004DAF, 0x00000A1F, 0x000500C4,\n    0x0000000B, 0x00001FE4, 0x0000314E, 0x00000A22, 0x000500C5, 0x0000000B,\n    0x00001D85, 0x000032CA, 0x00001FE4, 0x000500C2, 0x0000000B, 0x000055B4,\n    0x0000205F, 0x00000A1C, 0x000500C7, 0x0000000B, 0x000044BC, 0x000055B4,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00003AAA, 0x000055B3, 0x000044BC,\n    0x000500C2, 0x0000000B, 0x000033EA, 0x00005C83, 0x00000A1C, 0x000500C7,\n    0x0000000B, 0x00006184, 0x000033EA, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00006271, 0x00002777, 0x00006184, 0x00050080, 0x0000000B, 0x00004DB0,\n    0x00003AAA, 0x00006271, 0x00050086, 0x0000000B, 0x0000314F, 0x00004DB0,\n    0x00000A1F, 0x000500C4, 0x0000000B, 0x00001FE5, 0x0000314F, 0x00000A3A,\n    0x000500C5, 0x0000000B, 0x00001D86, 0x00001D85, 0x00001FE5, 0x000500C2,\n    0x0000000B, 0x000055B5, 0x0000205F, 0x00000A25, 0x000500C7, 0x0000000B,\n    0x000044BD, 0x000055B5, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AAB,\n    0x000055B3, 0x000044BD, 0x000500C2, 0x0000000B, 0x000033EB, 0x00005C83,\n    0x00000A25, 0x000500C7, 0x0000000B, 0x00006185, 0x000033EB, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00006272, 0x00002777, 0x00006185, 0x00050080,\n    0x0000000B, 0x00004DB1, 0x00003AAB, 0x00006272, 0x00050086, 0x0000000B,\n    0x00003150, 0x00004DB1, 0x00000A1F, 0x000500C4, 0x0000000B, 0x000023F6,\n    0x00003150, 0x00000A52, 0x000500C5, 0x0000000B, 0x00004679, 0x00001D86,\n    0x000023F6, 0x000200F9, 0x00005C00, 0x000200F8, 0x000055A3, 0x000500C7,\n    0x0000000B, 0x00004E71, 0x00005C83, 0x0000003A, 0x000500C7, 0x0000000B,\n    0x00005D8E, 0x00005C83, 0x0000022D, 0x000500C2, 0x0000000B, 0x00005556,\n    0x00005D8E, 0x00000A0D, 0x000500C7, 0x0000000B, 0x00001FC7, 0x00004E71,\n    0x00005556, 0x000500C4, 0x0000000B, 0x00006023, 0x00001FC7, 0x00000A0D,\n    0x000500C2, 0x0000000B, 0x000059AE, 0x00001FC7, 0x00000A0D, 0x000500C5,\n    0x0000000B, 0x0000497D, 0x00006023, 0x000059AE, 0x000500C5, 0x0000000B,\n    0x00003E2B, 0x00001FC7, 0x0000497D, 0x000400C8, 0x0000000B, 0x0000210C,\n    0x00003E2B, 0x000500C7, 0x0000000B, 0x00002763, 0x00005C83, 0x0000210C,\n    0x00050082, 0x0000000B, 0x00003FAD, 0x00000908, 0x00002763, 0x000500C7,\n    0x0000000B, 0x00004408, 0x00003FAD, 0x0000210C, 0x000500C7, 0x0000000B,\n    0x00004260, 0x00004408, 0x00000A1F, 0x00050084, 0x0000000B, 0x0000356E,\n    0x000055B3, 0x00004260, 0x000500C7, 0x0000000B, 0x000055DA, 0x00002763,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00004FA9, 0x00002777, 0x000055DA,\n    0x00050080, 0x0000000B, 0x00004D85, 0x0000356E, 0x00004FA9, 0x00050086,\n    0x0000000B, 0x000032CB, 0x00004D85, 0x00000A19, 0x000500C2, 0x0000000B,\n    0x000059F1, 0x00004408, 0x00000A13, 0x000500C7, 0x0000000B, 0x00002234,\n    0x000059F1, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AAC, 0x000055B3,\n    0x00002234, 0x000500C2, 0x0000000B, 0x000033EC, 0x00002763, 0x00000A13,\n    0x000500C7, 0x0000000B, 0x00006186, 0x000033EC, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00006273, 0x00002777, 0x00006186, 0x00050080, 0x0000000B,\n    0x00004DB2, 0x00003AAC, 0x00006273, 0x00050086, 0x0000000B, 0x00003151,\n    0x00004DB2, 0x00000A19, 0x000500C4, 0x0000000B, 0x00001FE6, 0x00003151,\n    0x00000A22, 0x000500C5, 0x0000000B, 0x00001D87, 0x000032CB, 0x00001FE6,\n    0x000500C2, 0x0000000B, 0x000055B6, 0x00004408, 0x00000A1C, 0x000500C7,\n    0x0000000B, 0x000044BF, 0x000055B6, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00003AAD, 0x000055B3, 0x000044BF, 0x000500C2, 0x0000000B, 0x000033ED,\n    0x00002763, 0x00000A1C, 0x000500C7, 0x0000000B, 0x00006187, 0x000033ED,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00006274, 0x00002777, 0x00006187,\n    0x00050080, 0x0000000B, 0x00004DB3, 0x00003AAD, 0x00006274, 0x00050086,\n    0x0000000B, 0x00003152, 0x00004DB3, 0x00000A19, 0x000500C4, 0x0000000B,\n    0x00001FE7, 0x00003152, 0x00000A3A, 0x000500C5, 0x0000000B, 0x00001D88,\n    0x00001D87, 0x00001FE7, 0x000500C2, 0x0000000B, 0x000055B7, 0x00004408,\n    0x00000A25, 0x000500C7, 0x0000000B, 0x000044C0, 0x000055B7, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00003AAE, 0x000055B3, 0x000044C0, 0x000500C2,\n    0x0000000B, 0x000033EE, 0x00002763, 0x00000A25, 0x000500C7, 0x0000000B,\n    0x00006188, 0x000033EE, 0x00000A1F, 0x00050084, 0x0000000B, 0x00006275,\n    0x00002777, 0x00006188, 0x00050080, 0x0000000B, 0x00004DB4, 0x00003AAE,\n    0x00006275, 0x00050086, 0x0000000B, 0x00003153, 0x00004DB4, 0x00000A19,\n    0x000500C4, 0x0000000B, 0x00002040, 0x00003153, 0x00000A52, 0x000500C5,\n    0x0000000B, 0x00001A21, 0x00001D88, 0x00002040, 0x000500C7, 0x0000000B,\n    0x00004FA2, 0x00005C83, 0x00003E2B, 0x000500C7, 0x0000000B, 0x00004401,\n    0x00004FA2, 0x00000A0D, 0x000500C7, 0x0000000B, 0x00004C68, 0x00004FA2,\n    0x00000A22, 0x000500C4, 0x0000000B, 0x00006165, 0x00004C68, 0x00000A19,\n    0x000500C5, 0x0000000B, 0x000042BD, 0x00004401, 0x00006165, 0x000500C7,\n    0x0000000B, 0x00005184, 0x00004FA2, 0x00000ACA, 0x000500C4, 0x0000000B,\n    0x00005B18, 0x00005184, 0x00000A28, 0x000500C5, 0x0000000B, 0x000042BE,\n    0x000042BD, 0x00005B18, 0x000500C7, 0x0000000B, 0x00005185, 0x00004FA2,\n    0x00000447, 0x000500C4, 0x0000000B, 0x0000561F, 0x00005185, 0x00000A37,\n    0x000500C5, 0x0000000B, 0x00002078, 0x000042BE, 0x0000561F, 0x00050084,\n    0x0000000B, 0x000028B4, 0x00002078, 0x00000144, 0x00050080, 0x0000000B,\n    0x00004801, 0x00001A21, 0x000028B4, 0x000200F9, 0x00005C00, 0x000200F8,\n    0x00005C00, 0x000700F5, 0x0000000B, 0x00004D07, 0x00004801, 0x000055A3,\n    0x00004679, 0x000028E4, 0x00070050, 0x00000017, 0x0000351B, 0x00004D07,\n    0x00004D07, 0x00004D07, 0x00004D07, 0x000500C4, 0x00000017, 0x000042C7,\n    0x0000351B, 0x0000019D, 0x000500C7, 0x00000017, 0x000053BC, 0x000042C7,\n    0x00000A27, 0x000500C5, 0x00000017, 0x00002FDE, 0x00002533, 0x000053BC,\n    0x00060041, 0x00000294, 0x00005242, 0x0000140E, 0x00000A0B, 0x000037CC,\n    0x0003003E, 0x00005242, 0x00002FDE, 0x00050080, 0x0000000B, 0x000039F8,\n    0x00003220, 0x00000A10, 0x000500B0, 0x00000009, 0x00002E0B, 0x000039F8,\n    0x000019C2, 0x000300F7, 0x00001C25, 0x00000002, 0x000400FA, 0x00002E0B,\n    0x00003081, 0x00001C25, 0x000200F8, 0x00003081, 0x000500C2, 0x0000000B,\n    0x000033B8, 0x000025B2, 0x00000A22, 0x000300F7, 0x00003191, 0x00000000,\n    0x000400FA, 0x00004E83, 0x000055A4, 0x00002991, 0x000200F8, 0x00002991,\n    0x000500C7, 0x0000000B, 0x000044FA, 0x000033B8, 0x000009E9, 0x000500C7,\n    0x0000000B, 0x00005D67, 0x000033B8, 0x000009C8, 0x000500C2, 0x0000000B,\n    0x000056E8, 0x00005D67, 0x00000A0D, 0x000500C5, 0x0000000B, 0x00005DC2,\n    0x000044FA, 0x000056E8, 0x000500C7, 0x0000000B, 0x00004C90, 0x000033B8,\n    0x00000986, 0x000500C2, 0x0000000B, 0x00005088, 0x00004C90, 0x00000A10,\n    0x000500C5, 0x0000000B, 0x00005EE0, 0x00005DC2, 0x00005088, 0x000500C6,\n    0x0000000B, 0x00001E2B, 0x00005EE0, 0x000009E9, 0x000400C8, 0x0000000B,\n    0x00002546, 0x000056E8, 0x000500C7, 0x0000000B, 0x0000391F, 0x000044FA,\n    0x00002546, 0x000400C8, 0x0000000B, 0x000020EB, 0x00005088, 0x000500C7,\n    0x0000000B, 0x00002C91, 0x0000391F, 0x000020EB, 0x000500C5, 0x0000000B,\n    0x00001A91, 0x000033B8, 0x00001E2B, 0x00050082, 0x0000000B, 0x00004C37,\n    0x00001A91, 0x000009E9, 0x000500C5, 0x0000000B, 0x00003A19, 0x00004C37,\n    0x00002C91, 0x000500C4, 0x0000000B, 0x000046E9, 0x00002C91, 0x00000A0D,\n    0x000500C5, 0x0000000B, 0x00003E89, 0x00003A19, 0x000046E9, 0x000500C4,\n    0x0000000B, 0x00001FB7, 0x00002C91, 0x00000A10, 0x000500C5, 0x0000000B,\n    0x00001E81, 0x00003E89, 0x00001FB7, 0x000200F9, 0x00003191, 0x000200F8,\n    0x000055A4, 0x000500C7, 0x0000000B, 0x00004E72, 0x000033B8, 0x000009C8,\n    0x000500C7, 0x0000000B, 0x00005D8F, 0x000033B8, 0x00000986, 0x000500C2,\n    0x0000000B, 0x00005557, 0x00005D8F, 0x00000A0D, 0x000500C7, 0x0000000B,\n    0x00001FC8, 0x00004E72, 0x00005557, 0x000500C4, 0x0000000B, 0x00006024,\n    0x00001FC8, 0x00000A0D, 0x000500C2, 0x0000000B, 0x000059AF, 0x00001FC8,\n    0x00000A0D, 0x000500C5, 0x0000000B, 0x0000496A, 0x00006024, 0x000059AF,\n    0x000500C5, 0x0000000B, 0x00003EB2, 0x00001FC8, 0x0000496A, 0x000500C7,\n    0x0000000B, 0x00004786, 0x000033B8, 0x000009E9, 0x000500C5, 0x0000000B,\n    0x0000395E, 0x00004786, 0x00000944, 0x000500C7, 0x0000000B, 0x00004FB4,\n    0x0000395E, 0x00003EB2, 0x000500C2, 0x0000000B, 0x0000503C, 0x00004E72,\n    0x00000A0D, 0x000500C5, 0x0000000B, 0x0000615B, 0x00004786, 0x0000503C,\n    0x000500C2, 0x0000000B, 0x000055A5, 0x00005D8F, 0x00000A10, 0x000500C5,\n    0x0000000B, 0x00005893, 0x0000615B, 0x000055A5, 0x000500C6, 0x0000000B,\n    0x00001E2C, 0x00005893, 0x000009E9, 0x000400C8, 0x0000000B, 0x00002547,\n    0x0000503C, 0x000500C7, 0x0000000B, 0x00003920, 0x00004786, 0x00002547,\n    0x000400C8, 0x0000000B, 0x000020EC, 0x000055A5, 0x000500C7, 0x0000000B,\n    0x00002C92, 0x00003920, 0x000020EC, 0x000500C5, 0x0000000B, 0x00001A92,\n    0x000033B8, 0x00001E2C, 0x00050082, 0x0000000B, 0x00004C38, 0x00001A92,\n    0x000009E9, 0x000500C5, 0x0000000B, 0x00003A1A, 0x00004C38, 0x00002C92,\n    0x000500C4, 0x0000000B, 0x00004735, 0x00002C92, 0x00000A10, 0x000500C5,\n    0x0000000B, 0x00003BFD, 0x00003A1A, 0x00004735, 0x000400C8, 0x0000000B,\n    0x00002F7B, 0x00003EB2, 0x000500C7, 0x0000000B, 0x00004851, 0x00003BFD,\n    0x00002F7B, 0x000500C5, 0x0000000B, 0x0000186D, 0x00004851, 0x00004FB4,\n    0x000200F9, 0x00003191, 0x000200F8, 0x00003191, 0x000700F5, 0x0000000B,\n    0x000024D6, 0x0000186D, 0x000055A4, 0x00001E81, 0x00002991, 0x00050084,\n    0x0000000B, 0x00004965, 0x00000A10, 0x0000578C, 0x00050080, 0x0000000B,\n    0x000037C4, 0x000038F6, 0x00004965, 0x000500C2, 0x0000000B, 0x00004386,\n    0x000037C4, 0x00000A17, 0x000500C2, 0x0000000B, 0x00002E67, 0x000050F7,\n    0x00000A3A, 0x000400C8, 0x0000000B, 0x00004B05, 0x00002E67, 0x00070050,\n    0x00000017, 0x000052F6, 0x00004B05, 0x00004B05, 0x00004B05, 0x00004B05,\n    0x000500C2, 0x00000017, 0x000061B2, 0x000052F6, 0x0000004D, 0x000500C7,\n    0x00000017, 0x00003839, 0x000061B2, 0x0000002F, 0x00050084, 0x00000017,\n    0x00003CD0, 0x00003839, 0x00006076, 0x00070050, 0x00000017, 0x0000539B,\n    0x00002E67, 0x00002E67, 0x00002E67, 0x00002E67, 0x000500C2, 0x00000017,\n    0x00003C07, 0x0000539B, 0x0000004D, 0x000500C7, 0x00000017, 0x00003BC9,\n    0x00003C07, 0x0000002F, 0x00050084, 0x00000017, 0x00001CBF, 0x00003BC9,\n    0x00001987, 0x00050080, 0x00000017, 0x00001D22, 0x00003CD0, 0x00001CBF,\n    0x000500C7, 0x00000017, 0x000060C0, 0x00001D22, 0x000003A1, 0x00050086,\n    0x00000017, 0x0000240B, 0x000060C0, 0x0000002F, 0x000500C4, 0x00000017,\n    0x000044CA, 0x0000240B, 0x000002ED, 0x000500C2, 0x00000017, 0x00002AD3,\n    0x00001D22, 0x000001A9, 0x000500C7, 0x00000017, 0x000033C3, 0x00002AD3,\n    0x000003A1, 0x00050086, 0x00000017, 0x000043A2, 0x000033C3, 0x0000002F,\n    0x000500C4, 0x00000017, 0x00004264, 0x000043A2, 0x0000013D, 0x000500C5,\n    0x00000017, 0x000018B0, 0x000044CA, 0x00004264, 0x000500C2, 0x00000017,\n    0x00003BF2, 0x00001D22, 0x000003C5, 0x00050086, 0x00000017, 0x00006197,\n    0x00003BF2, 0x0000002F, 0x000500C5, 0x00000017, 0x00004C1B, 0x000018B0,\n    0x00006197, 0x000300F7, 0x00005C01, 0x00000000, 0x000400FA, 0x00004E83,\n    0x000055A6, 0x000028E5, 0x000200F8, 0x000028E5, 0x000400C8, 0x0000000B,\n    0x00002060, 0x000024D6, 0x000500C7, 0x0000000B, 0x00003BFE, 0x00002060,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00004532, 0x000055B3, 0x00003BFE,\n    0x000500C7, 0x0000000B, 0x000055DB, 0x000024D6, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00004FAA, 0x00002777, 0x000055DB, 0x00050080, 0x0000000B,\n    0x00004D86, 0x00004532, 0x00004FAA, 0x00050086, 0x0000000B, 0x000032CC,\n    0x00004D86, 0x00000A1F, 0x000500C2, 0x0000000B, 0x000059F2, 0x00002060,\n    0x00000A13, 0x000500C7, 0x0000000B, 0x00002235, 0x000059F2, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00003AAF, 0x000055B3, 0x00002235, 0x000500C2,\n    0x0000000B, 0x000033EF, 0x000024D6, 0x00000A13, 0x000500C7, 0x0000000B,\n    0x00006189, 0x000033EF, 0x00000A1F, 0x00050084, 0x0000000B, 0x00006276,\n    0x00002777, 0x00006189, 0x00050080, 0x0000000B, 0x00004DB5, 0x00003AAF,\n    0x00006276, 0x00050086, 0x0000000B, 0x00003154, 0x00004DB5, 0x00000A1F,\n    0x000500C4, 0x0000000B, 0x00001FE8, 0x00003154, 0x00000A22, 0x000500C5,\n    0x0000000B, 0x00001D89, 0x000032CC, 0x00001FE8, 0x000500C2, 0x0000000B,\n    0x000055B8, 0x00002060, 0x00000A1C, 0x000500C7, 0x0000000B, 0x000044C1,\n    0x000055B8, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AB0, 0x000055B3,\n    0x000044C1, 0x000500C2, 0x0000000B, 0x000033F0, 0x000024D6, 0x00000A1C,\n    0x000500C7, 0x0000000B, 0x0000618A, 0x000033F0, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00006277, 0x00002777, 0x0000618A, 0x00050080, 0x0000000B,\n    0x00004DB6, 0x00003AB0, 0x00006277, 0x00050086, 0x0000000B, 0x00003155,\n    0x00004DB6, 0x00000A1F, 0x000500C4, 0x0000000B, 0x00001FE9, 0x00003155,\n    0x00000A3A, 0x000500C5, 0x0000000B, 0x00001D8A, 0x00001D89, 0x00001FE9,\n    0x000500C2, 0x0000000B, 0x000055B9, 0x00002060, 0x00000A25, 0x000500C7,\n    0x0000000B, 0x000044C2, 0x000055B9, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00003AB1, 0x000055B3, 0x000044C2, 0x000500C2, 0x0000000B, 0x000033F1,\n    0x000024D6, 0x00000A25, 0x000500C7, 0x0000000B, 0x0000618B, 0x000033F1,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00006278, 0x00002777, 0x0000618B,\n    0x00050080, 0x0000000B, 0x00004DB7, 0x00003AB1, 0x00006278, 0x00050086,\n    0x0000000B, 0x00003156, 0x00004DB7, 0x00000A1F, 0x000500C4, 0x0000000B,\n    0x000023F7, 0x00003156, 0x00000A52, 0x000500C5, 0x0000000B, 0x0000467A,\n    0x00001D8A, 0x000023F7, 0x000200F9, 0x00005C01, 0x000200F8, 0x000055A6,\n    0x000500C7, 0x0000000B, 0x00004E73, 0x000024D6, 0x0000003A, 0x000500C7,\n    0x0000000B, 0x00005D90, 0x000024D6, 0x0000022D, 0x000500C2, 0x0000000B,\n    0x00005558, 0x00005D90, 0x00000A0D, 0x000500C7, 0x0000000B, 0x00001FC9,\n    0x00004E73, 0x00005558, 0x000500C4, 0x0000000B, 0x00006025, 0x00001FC9,\n    0x00000A0D, 0x000500C2, 0x0000000B, 0x000059B0, 0x00001FC9, 0x00000A0D,\n    0x000500C5, 0x0000000B, 0x0000497E, 0x00006025, 0x000059B0, 0x000500C5,\n    0x0000000B, 0x00003E2C, 0x00001FC9, 0x0000497E, 0x000400C8, 0x0000000B,\n    0x0000210D, 0x00003E2C, 0x000500C7, 0x0000000B, 0x00002764, 0x000024D6,\n    0x0000210D, 0x00050082, 0x0000000B, 0x00003FAE, 0x00000908, 0x00002764,\n    0x000500C7, 0x0000000B, 0x00004409, 0x00003FAE, 0x0000210D, 0x000500C7,\n    0x0000000B, 0x00004261, 0x00004409, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x0000356F, 0x000055B3, 0x00004261, 0x000500C7, 0x0000000B, 0x000055DC,\n    0x00002764, 0x00000A1F, 0x00050084, 0x0000000B, 0x00004FAB, 0x00002777,\n    0x000055DC, 0x00050080, 0x0000000B, 0x00004D87, 0x0000356F, 0x00004FAB,\n    0x00050086, 0x0000000B, 0x000032CD, 0x00004D87, 0x00000A19, 0x000500C2,\n    0x0000000B, 0x000059F3, 0x00004409, 0x00000A13, 0x000500C7, 0x0000000B,\n    0x00002236, 0x000059F3, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AB2,\n    0x000055B3, 0x00002236, 0x000500C2, 0x0000000B, 0x000033F2, 0x00002764,\n    0x00000A13, 0x000500C7, 0x0000000B, 0x0000618C, 0x000033F2, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00006279, 0x00002777, 0x0000618C, 0x00050080,\n    0x0000000B, 0x00004DB8, 0x00003AB2, 0x00006279, 0x00050086, 0x0000000B,\n    0x00003157, 0x00004DB8, 0x00000A19, 0x000500C4, 0x0000000B, 0x00001FEA,\n    0x00003157, 0x00000A22, 0x000500C5, 0x0000000B, 0x00001D8B, 0x000032CD,\n    0x00001FEA, 0x000500C2, 0x0000000B, 0x000055BA, 0x00004409, 0x00000A1C,\n    0x000500C7, 0x0000000B, 0x000044C3, 0x000055BA, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00003AB3, 0x000055B3, 0x000044C3, 0x000500C2, 0x0000000B,\n    0x000033F3, 0x00002764, 0x00000A1C, 0x000500C7, 0x0000000B, 0x0000618D,\n    0x000033F3, 0x00000A1F, 0x00050084, 0x0000000B, 0x0000627A, 0x00002777,\n    0x0000618D, 0x00050080, 0x0000000B, 0x00004DB9, 0x00003AB3, 0x0000627A,\n    0x00050086, 0x0000000B, 0x00003158, 0x00004DB9, 0x00000A19, 0x000500C4,\n    0x0000000B, 0x00001FEB, 0x00003158, 0x00000A3A, 0x000500C5, 0x0000000B,\n    0x00001D8C, 0x00001D8B, 0x00001FEB, 0x000500C2, 0x0000000B, 0x000055BB,\n    0x00004409, 0x00000A25, 0x000500C7, 0x0000000B, 0x000044C4, 0x000055BB,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00003AB4, 0x000055B3, 0x000044C4,\n    0x000500C2, 0x0000000B, 0x000033F4, 0x00002764, 0x00000A25, 0x000500C7,\n    0x0000000B, 0x0000618E, 0x000033F4, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x0000627C, 0x00002777, 0x0000618E, 0x00050080, 0x0000000B, 0x00004DBA,\n    0x00003AB4, 0x0000627C, 0x00050086, 0x0000000B, 0x00003159, 0x00004DBA,\n    0x00000A19, 0x000500C4, 0x0000000B, 0x00002041, 0x00003159, 0x00000A52,\n    0x000500C5, 0x0000000B, 0x00001A22, 0x00001D8C, 0x00002041, 0x000500C7,\n    0x0000000B, 0x00004FA4, 0x000024D6, 0x00003E2C, 0x000500C7, 0x0000000B,\n    0x00004402, 0x00004FA4, 0x00000A0D, 0x000500C7, 0x0000000B, 0x00004C69,\n    0x00004FA4, 0x00000A22, 0x000500C4, 0x0000000B, 0x00006166, 0x00004C69,\n    0x00000A19, 0x000500C5, 0x0000000B, 0x000042BF, 0x00004402, 0x00006166,\n    0x000500C7, 0x0000000B, 0x00005186, 0x00004FA4, 0x00000ACA, 0x000500C4,\n    0x0000000B, 0x00005B19, 0x00005186, 0x00000A28, 0x000500C5, 0x0000000B,\n    0x000042C0, 0x000042BF, 0x00005B19, 0x000500C7, 0x0000000B, 0x00005187,\n    0x00004FA4, 0x00000447, 0x000500C4, 0x0000000B, 0x00005620, 0x00005187,\n    0x00000A37, 0x000500C5, 0x0000000B, 0x00002079, 0x000042C0, 0x00005620,\n    0x00050084, 0x0000000B, 0x000028B5, 0x00002079, 0x00000144, 0x00050080,\n    0x0000000B, 0x00004802, 0x00001A22, 0x000028B5, 0x000200F9, 0x00005C01,\n    0x000200F8, 0x00005C01, 0x000700F5, 0x0000000B, 0x00004D08, 0x00004802,\n    0x000055A6, 0x0000467A, 0x000028E5, 0x00070050, 0x00000017, 0x0000351C,\n    0x00004D08, 0x00004D08, 0x00004D08, 0x00004D08, 0x000500C4, 0x00000017,\n    0x000042C8, 0x0000351C, 0x0000019D, 0x000500C7, 0x00000017, 0x000053BD,\n    0x000042C8, 0x00000A27, 0x000500C5, 0x00000017, 0x00002FDF, 0x00004C1B,\n    0x000053BD, 0x00060041, 0x00000294, 0x00005243, 0x0000140E, 0x00000A0B,\n    0x00004386, 0x0003003E, 0x00005243, 0x00002FDF, 0x00050080, 0x0000000B,\n    0x000039F9, 0x00003220, 0x00000A13, 0x000500B0, 0x00000009, 0x00002E0C,\n    0x000039F9, 0x000019C2, 0x000300F7, 0x00004665, 0x00000002, 0x000400FA,\n    0x00002E0C, 0x00005192, 0x00004665, 0x000200F8, 0x00005192, 0x00050084,\n    0x0000000B, 0x0000338E, 0x00000A13, 0x0000578C, 0x00050080, 0x0000000B,\n    0x0000349B, 0x000038F6, 0x0000338E, 0x000500C2, 0x0000000B, 0x00004387,\n    0x0000349B, 0x00000A17, 0x000500C2, 0x0000000B, 0x00002E69, 0x000050F7,\n    0x00000A52, 0x000400C8, 0x0000000B, 0x00004B06, 0x00002E69, 0x00070050,\n    0x00000017, 0x000052F7, 0x00004B06, 0x00004B06, 0x00004B06, 0x00004B06,\n    0x000500C2, 0x00000017, 0x000061B3, 0x000052F7, 0x0000004D, 0x000500C7,\n    0x00000017, 0x0000383A, 0x000061B3, 0x0000002F, 0x00050084, 0x00000017,\n    0x00003CD1, 0x0000383A, 0x00006076, 0x00070050, 0x00000017, 0x0000539C,\n    0x00002E69, 0x00002E69, 0x00002E69, 0x00002E69, 0x000500C2, 0x00000017,\n    0x00003C08, 0x0000539C, 0x0000004D, 0x000500C7, 0x00000017, 0x00003BCA,\n    0x00003C08, 0x0000002F, 0x00050084, 0x00000017, 0x00001CC0, 0x00003BCA,\n    0x00001987, 0x00050080, 0x00000017, 0x00001D23, 0x00003CD1, 0x00001CC0,\n    0x000500C7, 0x00000017, 0x000060C1, 0x00001D23, 0x000003A1, 0x00050086,\n    0x00000017, 0x0000240C, 0x000060C1, 0x0000002F, 0x000500C4, 0x00000017,\n    0x000044CB, 0x0000240C, 0x000002ED, 0x000500C2, 0x00000017, 0x00002AD4,\n    0x00001D23, 0x000001A9, 0x000500C7, 0x00000017, 0x000033C4, 0x00002AD4,\n    0x000003A1, 0x00050086, 0x00000017, 0x000043A3, 0x000033C4, 0x0000002F,\n    0x000500C4, 0x00000017, 0x00004265, 0x000043A3, 0x0000013D, 0x000500C5,\n    0x00000017, 0x000018B1, 0x000044CB, 0x00004265, 0x000500C2, 0x00000017,\n    0x00003BF3, 0x00001D23, 0x000003C5, 0x00050086, 0x00000017, 0x00005DA8,\n    0x00003BF3, 0x0000002F, 0x000500C5, 0x00000017, 0x00002534, 0x000018B1,\n    0x00005DA8, 0x000500C2, 0x0000000B, 0x00005C84, 0x000024D6, 0x00000A2E,\n    0x000300F7, 0x00005C02, 0x00000000, 0x000400FA, 0x00004E83, 0x000055A7,\n    0x000028E6, 0x000200F8, 0x000028E6, 0x000400C8, 0x0000000B, 0x00002061,\n    0x00005C84, 0x000500C7, 0x0000000B, 0x00003BFF, 0x00002061, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00004533, 0x000055B3, 0x00003BFF, 0x000500C7,\n    0x0000000B, 0x000055DD, 0x00005C84, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00004FAC, 0x00002777, 0x000055DD, 0x00050080, 0x0000000B, 0x00004D88,\n    0x00004533, 0x00004FAC, 0x00050086, 0x0000000B, 0x000032CE, 0x00004D88,\n    0x00000A1F, 0x000500C2, 0x0000000B, 0x000059F4, 0x00002061, 0x00000A13,\n    0x000500C7, 0x0000000B, 0x00002237, 0x000059F4, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00003AB5, 0x000055B3, 0x00002237, 0x000500C2, 0x0000000B,\n    0x000033F5, 0x00005C84, 0x00000A13, 0x000500C7, 0x0000000B, 0x0000618F,\n    0x000033F5, 0x00000A1F, 0x00050084, 0x0000000B, 0x0000627D, 0x00002777,\n    0x0000618F, 0x00050080, 0x0000000B, 0x00004DBB, 0x00003AB5, 0x0000627D,\n    0x00050086, 0x0000000B, 0x0000315A, 0x00004DBB, 0x00000A1F, 0x000500C4,\n    0x0000000B, 0x00001FEC, 0x0000315A, 0x00000A22, 0x000500C5, 0x0000000B,\n    0x00001D8D, 0x000032CE, 0x00001FEC, 0x000500C2, 0x0000000B, 0x000055BC,\n    0x00002061, 0x00000A1C, 0x000500C7, 0x0000000B, 0x000044C5, 0x000055BC,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00003AB6, 0x000055B3, 0x000044C5,\n    0x000500C2, 0x0000000B, 0x000033F6, 0x00005C84, 0x00000A1C, 0x000500C7,\n    0x0000000B, 0x00006190, 0x000033F6, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x0000627E, 0x00002777, 0x00006190, 0x00050080, 0x0000000B, 0x00004DBC,\n    0x00003AB6, 0x0000627E, 0x00050086, 0x0000000B, 0x0000315B, 0x00004DBC,\n    0x00000A1F, 0x000500C4, 0x0000000B, 0x00001FED, 0x0000315B, 0x00000A3A,\n    0x000500C5, 0x0000000B, 0x00001D8E, 0x00001D8D, 0x00001FED, 0x000500C2,\n    0x0000000B, 0x000055BD, 0x00002061, 0x00000A25, 0x000500C7, 0x0000000B,\n    0x000044C6, 0x000055BD, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AB7,\n    0x000055B3, 0x000044C6, 0x000500C2, 0x0000000B, 0x000033F7, 0x00005C84,\n    0x00000A25, 0x000500C7, 0x0000000B, 0x00006191, 0x000033F7, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x0000627F, 0x00002777, 0x00006191, 0x00050080,\n    0x0000000B, 0x00004DBD, 0x00003AB7, 0x0000627F, 0x00050086, 0x0000000B,\n    0x0000315C, 0x00004DBD, 0x00000A1F, 0x000500C4, 0x0000000B, 0x000023F8,\n    0x0000315C, 0x00000A52, 0x000500C5, 0x0000000B, 0x0000467B, 0x00001D8E,\n    0x000023F8, 0x000200F9, 0x00005C02, 0x000200F8, 0x000055A7, 0x000500C7,\n    0x0000000B, 0x00004E74, 0x00005C84, 0x0000003A, 0x000500C7, 0x0000000B,\n    0x00005D91, 0x00005C84, 0x0000022D, 0x000500C2, 0x0000000B, 0x00005559,\n    0x00005D91, 0x00000A0D, 0x000500C7, 0x0000000B, 0x00001FCA, 0x00004E74,\n    0x00005559, 0x000500C4, 0x0000000B, 0x00006026, 0x00001FCA, 0x00000A0D,\n    0x000500C2, 0x0000000B, 0x000059B1, 0x00001FCA, 0x00000A0D, 0x000500C5,\n    0x0000000B, 0x0000497F, 0x00006026, 0x000059B1, 0x000500C5, 0x0000000B,\n    0x00003E2D, 0x00001FCA, 0x0000497F, 0x000400C8, 0x0000000B, 0x0000210E,\n    0x00003E2D, 0x000500C7, 0x0000000B, 0x00002765, 0x00005C84, 0x0000210E,\n    0x00050082, 0x0000000B, 0x00003FAF, 0x00000908, 0x00002765, 0x000500C7,\n    0x0000000B, 0x0000440A, 0x00003FAF, 0x0000210E, 0x000500C7, 0x0000000B,\n    0x00004266, 0x0000440A, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003570,\n    0x000055B3, 0x00004266, 0x000500C7, 0x0000000B, 0x000055DE, 0x00002765,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00004FAD, 0x00002777, 0x000055DE,\n    0x00050080, 0x0000000B, 0x00004D89, 0x00003570, 0x00004FAD, 0x00050086,\n    0x0000000B, 0x000032CF, 0x00004D89, 0x00000A19, 0x000500C2, 0x0000000B,\n    0x000059F5, 0x0000440A, 0x00000A13, 0x000500C7, 0x0000000B, 0x00002238,\n    0x000059F5, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AB8, 0x000055B3,\n    0x00002238, 0x000500C2, 0x0000000B, 0x000033F8, 0x00002765, 0x00000A13,\n    0x000500C7, 0x0000000B, 0x00006192, 0x000033F8, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00006280, 0x00002777, 0x00006192, 0x00050080, 0x0000000B,\n    0x00004DBE, 0x00003AB8, 0x00006280, 0x00050086, 0x0000000B, 0x0000315D,\n    0x00004DBE, 0x00000A19, 0x000500C4, 0x0000000B, 0x00001FEE, 0x0000315D,\n    0x00000A22, 0x000500C5, 0x0000000B, 0x00001D8F, 0x000032CF, 0x00001FEE,\n    0x000500C2, 0x0000000B, 0x000055BE, 0x0000440A, 0x00000A1C, 0x000500C7,\n    0x0000000B, 0x000044C7, 0x000055BE, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00003AB9, 0x000055B3, 0x000044C7, 0x000500C2, 0x0000000B, 0x000033F9,\n    0x00002765, 0x00000A1C, 0x000500C7, 0x0000000B, 0x00006193, 0x000033F9,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00006281, 0x00002777, 0x00006193,\n    0x00050080, 0x0000000B, 0x00004DBF, 0x00003AB9, 0x00006281, 0x00050086,\n    0x0000000B, 0x0000315E, 0x00004DBF, 0x00000A19, 0x000500C4, 0x0000000B,\n    0x00001FEF, 0x0000315E, 0x00000A3A, 0x000500C5, 0x0000000B, 0x00001D90,\n    0x00001D8F, 0x00001FEF, 0x000500C2, 0x0000000B, 0x000055BF, 0x0000440A,\n    0x00000A25, 0x000500C7, 0x0000000B, 0x000044CC, 0x000055BF, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00003ABA, 0x000055B3, 0x000044CC, 0x000500C2,\n    0x0000000B, 0x000033FA, 0x00002765, 0x00000A25, 0x000500C7, 0x0000000B,\n    0x00006194, 0x000033FA, 0x00000A1F, 0x00050084, 0x0000000B, 0x00006282,\n    0x00002777, 0x00006194, 0x00050080, 0x0000000B, 0x00004DC0, 0x00003ABA,\n    0x00006282, 0x00050086, 0x0000000B, 0x0000315F, 0x00004DC0, 0x00000A19,\n    0x000500C4, 0x0000000B, 0x00002043, 0x0000315F, 0x00000A52, 0x000500C5,\n    0x0000000B, 0x00001A23, 0x00001D90, 0x00002043, 0x000500C7, 0x0000000B,\n    0x00004FA5, 0x00005C84, 0x00003E2D, 0x000500C7, 0x0000000B, 0x00004403,\n    0x00004FA5, 0x00000A0D, 0x000500C7, 0x0000000B, 0x00004C6A, 0x00004FA5,\n    0x00000A22, 0x000500C4, 0x0000000B, 0x00006167, 0x00004C6A, 0x00000A19,\n    0x000500C5, 0x0000000B, 0x000042C1, 0x00004403, 0x00006167, 0x000500C7,\n    0x0000000B, 0x00005188, 0x00004FA5, 0x00000ACA, 0x000500C4, 0x0000000B,\n    0x00005B1A, 0x00005188, 0x00000A28, 0x000500C5, 0x0000000B, 0x000042C2,\n    0x000042C1, 0x00005B1A, 0x000500C7, 0x0000000B, 0x00005189, 0x00004FA5,\n    0x00000447, 0x000500C4, 0x0000000B, 0x00005621, 0x00005189, 0x00000A37,\n    0x000500C5, 0x0000000B, 0x0000207A, 0x000042C2, 0x00005621, 0x00050084,\n    0x0000000B, 0x000028B6, 0x0000207A, 0x00000144, 0x00050080, 0x0000000B,\n    0x00004803, 0x00001A23, 0x000028B6, 0x000200F9, 0x00005C02, 0x000200F8,\n    0x00005C02, 0x000700F5, 0x0000000B, 0x00004D09, 0x00004803, 0x000055A7,\n    0x0000467B, 0x000028E6, 0x00070050, 0x00000017, 0x0000351D, 0x00004D09,\n    0x00004D09, 0x00004D09, 0x00004D09, 0x000500C4, 0x00000017, 0x000042C9,\n    0x0000351D, 0x0000019D, 0x000500C7, 0x00000017, 0x000053BE, 0x000042C9,\n    0x00000A27, 0x000500C5, 0x00000017, 0x00002FE0, 0x00002534, 0x000053BE,\n    0x00060041, 0x00000294, 0x00005B3D, 0x0000140E, 0x00000A0B, 0x00004387,\n    0x0003003E, 0x00005B3D, 0x00002FE0, 0x000200F9, 0x00004665, 0x000200F8,\n    0x00004665, 0x000200F9, 0x00001C25, 0x000200F8, 0x00001C25, 0x000200F9,\n    0x00002358, 0x000200F8, 0x00002358, 0x00050080, 0x0000000B, 0x0000578D,\n    0x000038F6, 0x00000A3A, 0x000300F7, 0x00006070, 0x00000002, 0x000400FA,\n    0x00004376, 0x00001C26, 0x000055E9, 0x000200F8, 0x000055E9, 0x000200F9,\n    0x00006070, 0x000200F8, 0x00001C26, 0x000200F9, 0x00006070, 0x000200F8,\n    0x00006070, 0x000700F5, 0x0000000B, 0x00002C71, 0x00000A6A, 0x00001C26,\n    0x00000A3A, 0x000055E9, 0x00050080, 0x0000000B, 0x000048BE, 0x000048BD,\n    0x00002C71, 0x000500C2, 0x0000000B, 0x00003D53, 0x000048BE, 0x00000A17,\n    0x00060041, 0x00000294, 0x00005566, 0x0000107A, 0x00000A0B, 0x00003D53,\n    0x0004003D, 0x00000017, 0x00003910, 0x00005566, 0x000300F7, 0x00003A1B,\n    0x00000000, 0x000400FA, 0x00005686, 0x00002958, 0x00003A1B, 0x000200F8,\n    0x00002958, 0x000500C7, 0x00000017, 0x00004760, 0x00003910, 0x000009CE,\n    0x000500C4, 0x00000017, 0x000024D2, 0x00004760, 0x0000013D, 0x000500C7,\n    0x00000017, 0x000050AE, 0x00003910, 0x0000072E, 0x000500C2, 0x00000017,\n    0x0000448E, 0x000050AE, 0x0000013D, 0x000500C5, 0x00000017, 0x00003FF9,\n    0x000024D2, 0x0000448E, 0x000200F9, 0x00003A1B, 0x000200F8, 0x00003A1B,\n    0x000700F5, 0x00000017, 0x00002AAC, 0x00003910, 0x00006070, 0x00003FF9,\n    0x00002958, 0x000300F7, 0x00002DC9, 0x00000000, 0x000400FA, 0x00003B23,\n    0x00002B39, 0x00002DC9, 0x000200F8, 0x00002B39, 0x000500C4, 0x00000017,\n    0x00005E18, 0x00002AAC, 0x000002ED, 0x000500C2, 0x00000017, 0x00003BE8,\n    0x00002AAC, 0x000002ED, 0x000500C5, 0x00000017, 0x000029E9, 0x00005E18,\n    0x00003BE8, 0x000200F9, 0x00002DC9, 0x000200F8, 0x00002DC9, 0x000700F5,\n    0x00000017, 0x00004C5A, 0x00002AAC, 0x00003A1B, 0x000029E9, 0x00002B39,\n    0x00050051, 0x0000000B, 0x00005F3A, 0x00004C5A, 0x00000002, 0x000500C4,\n    0x0000000B, 0x00003C80, 0x00005F3A, 0x00000A13, 0x000500C2, 0x0000000B,\n    0x00001952, 0x00005F3A, 0x00000A31, 0x00050050, 0x00000011, 0x00004371,\n    0x00003C80, 0x00001952, 0x000500C7, 0x00000011, 0x0000191F, 0x00004371,\n    0x000003E1, 0x000500C4, 0x0000000B, 0x00005040, 0x00005F3A, 0x00000A1F,\n    0x000500C2, 0x0000000B, 0x00005E65, 0x00005F3A, 0x00000A25, 0x00050050,\n    0x00000011, 0x00004388, 0x00005040, 0x00005E65, 0x000500C7, 0x00000011,\n    0x00001898, 0x00004388, 0x000003F7, 0x000500C5, 0x00000011, 0x0000375B,\n    0x0000191F, 0x00001898, 0x000500C4, 0x0000000B, 0x00005C89, 0x00005F3A,\n    0x00000A2E, 0x000500C2, 0x0000000B, 0x00005818, 0x00005F3A, 0x00000A16,\n    0x00050050, 0x00000011, 0x00004389, 0x00005C89, 0x00005818, 0x000500C7,\n    0x00000011, 0x00001872, 0x00004389, 0x000009F3, 0x000500C5, 0x00000011,\n    0x00003914, 0x0000375B, 0x00001872, 0x000500C2, 0x00000011, 0x0000575B,\n    0x00003914, 0x00000778, 0x000500C7, 0x00000011, 0x000018CC, 0x0000575B,\n    0x000001F7, 0x000500C5, 0x00000011, 0x00004047, 0x00003914, 0x000018CC,\n    0x000500C2, 0x00000011, 0x0000575C, 0x00004047, 0x0000078D, 0x000500C7,\n    0x00000011, 0x00005AE8, 0x0000575C, 0x0000004E, 0x000500C5, 0x00000011,\n    0x00003950, 0x00004047, 0x00005AE8, 0x00050051, 0x0000000B, 0x00004BDF,\n    0x00004C5A, 0x00000003, 0x00050050, 0x00000011, 0x00003C51, 0x00004BDF,\n    0x00004BDF, 0x0009004F, 0x00000017, 0x00006232, 0x00003C51, 0x00003C51,\n    0x00000000, 0x00000001, 0x00000000, 0x00000000, 0x000500C7, 0x00000017,\n    0x00002C7D, 0x00006232, 0x00000B3E, 0x000500C4, 0x00000017, 0x00005ECB,\n    0x00002C7D, 0x00000B86, 0x000500C7, 0x00000017, 0x000050AF, 0x00006232,\n    0x00000B2C, 0x000500C2, 0x00000017, 0x000040D8, 0x000050AF, 0x00000B86,\n    0x000500C5, 0x00000017, 0x00005DC3, 0x00005ECB, 0x000040D8, 0x000500C7,\n    0x00000017, 0x00004CA3, 0x00005DC3, 0x00000B2C, 0x000500C2, 0x00000017,\n    0x0000472C, 0x00004CA3, 0x00000B86, 0x000500C6, 0x00000017, 0x00003A76,\n    0x00005DC3, 0x0000472C, 0x00050051, 0x0000000B, 0x000050F8, 0x00003A76,\n    0x00000000, 0x0007004F, 0x00000011, 0x00004FB0, 0x00004C5A, 0x00004C5A,\n    0x00000000, 0x00000000, 0x000500C2, 0x00000011, 0x00002345, 0x00004FB0,\n    0x0000076F, 0x000500C7, 0x00000011, 0x0000221D, 0x00002345, 0x00000474,\n    0x00050051, 0x0000000B, 0x00004464, 0x00004C5A, 0x00000000, 0x000500C2,\n    0x0000000B, 0x000029EA, 0x00004464, 0x00000A3A, 0x00050051, 0x0000000B,\n    0x000025B3, 0x00004C5A, 0x00000001, 0x000500C7, 0x0000000B, 0x0000185F,\n    0x000025B3, 0x00000144, 0x000500C4, 0x0000000B, 0x00005E0F, 0x0000185F,\n    0x00000A3A, 0x000500C5, 0x0000000B, 0x00003F72, 0x000029EA, 0x00005E0F,\n    0x00050051, 0x0000000B, 0x000055C0, 0x0000221D, 0x00000000, 0x00050051,\n    0x0000000B, 0x00002778, 0x0000221D, 0x00000001, 0x000500B2, 0x00000009,\n    0x00004E84, 0x000055C0, 0x00002778, 0x000300F7, 0x0000362C, 0x00000000,\n    0x000400FA, 0x00004E84, 0x000055A8, 0x00002992, 0x000200F8, 0x00002992,\n    0x000500C7, 0x0000000B, 0x000044FB, 0x00003F72, 0x000009E9, 0x000500C7,\n    0x0000000B, 0x00005D68, 0x00003F72, 0x000009C8, 0x000500C2, 0x0000000B,\n    0x000056E9, 0x00005D68, 0x00000A0D, 0x000500C5, 0x0000000B, 0x00005DC4,\n    0x000044FB, 0x000056E9, 0x000500C7, 0x0000000B, 0x00004C91, 0x00003F72,\n    0x00000986, 0x000500C2, 0x0000000B, 0x00005089, 0x00004C91, 0x00000A10,\n    0x000500C5, 0x0000000B, 0x00005EE1, 0x00005DC4, 0x00005089, 0x000500C6,\n    0x0000000B, 0x00001E2D, 0x00005EE1, 0x000009E9, 0x000400C8, 0x0000000B,\n    0x00002548, 0x000056E9, 0x000500C7, 0x0000000B, 0x00003921, 0x000044FB,\n    0x00002548, 0x000400C8, 0x0000000B, 0x000020ED, 0x00005089, 0x000500C7,\n    0x0000000B, 0x00002C93, 0x00003921, 0x000020ED, 0x000500C5, 0x0000000B,\n    0x00001A93, 0x00003F72, 0x00001E2D, 0x00050082, 0x0000000B, 0x00004C39,\n    0x00001A93, 0x000009E9, 0x000500C5, 0x0000000B, 0x00003A1C, 0x00004C39,\n    0x00002C93, 0x000500C4, 0x0000000B, 0x000046EA, 0x00002C93, 0x00000A0D,\n    0x000500C5, 0x0000000B, 0x00003E8A, 0x00003A1C, 0x000046EA, 0x000500C4,\n    0x0000000B, 0x00001FB8, 0x00002C93, 0x00000A10, 0x000500C5, 0x0000000B,\n    0x00001E82, 0x00003E8A, 0x00001FB8, 0x000200F9, 0x0000362C, 0x000200F8,\n    0x000055A8, 0x000500C7, 0x0000000B, 0x00004E75, 0x00003F72, 0x000009C8,\n    0x000500C7, 0x0000000B, 0x00005D92, 0x00003F72, 0x00000986, 0x000500C2,\n    0x0000000B, 0x0000555A, 0x00005D92, 0x00000A0D, 0x000500C7, 0x0000000B,\n    0x00001FCB, 0x00004E75, 0x0000555A, 0x000500C4, 0x0000000B, 0x00006027,\n    0x00001FCB, 0x00000A0D, 0x000500C2, 0x0000000B, 0x000059B2, 0x00001FCB,\n    0x00000A0D, 0x000500C5, 0x0000000B, 0x0000496B, 0x00006027, 0x000059B2,\n    0x000500C5, 0x0000000B, 0x00003EB3, 0x00001FCB, 0x0000496B, 0x000500C7,\n    0x0000000B, 0x00004787, 0x00003F72, 0x000009E9, 0x000500C5, 0x0000000B,\n    0x0000395F, 0x00004787, 0x00000944, 0x000500C7, 0x0000000B, 0x00004FB5,\n    0x0000395F, 0x00003EB3, 0x000500C2, 0x0000000B, 0x0000503D, 0x00004E75,\n    0x00000A0D, 0x000500C5, 0x0000000B, 0x0000615C, 0x00004787, 0x0000503D,\n    0x000500C2, 0x0000000B, 0x000055A9, 0x00005D92, 0x00000A10, 0x000500C5,\n    0x0000000B, 0x00005894, 0x0000615C, 0x000055A9, 0x000500C6, 0x0000000B,\n    0x00001E2E, 0x00005894, 0x000009E9, 0x000400C8, 0x0000000B, 0x00002549,\n    0x0000503D, 0x000500C7, 0x0000000B, 0x00003922, 0x00004787, 0x00002549,\n    0x000400C8, 0x0000000B, 0x000020EE, 0x000055A9, 0x000500C7, 0x0000000B,\n    0x00002C94, 0x00003922, 0x000020EE, 0x000500C5, 0x0000000B, 0x00001A94,\n    0x00003F72, 0x00001E2E, 0x00050082, 0x0000000B, 0x00004C3A, 0x00001A94,\n    0x000009E9, 0x000500C5, 0x0000000B, 0x00003A1D, 0x00004C3A, 0x00002C94,\n    0x000500C4, 0x0000000B, 0x00004736, 0x00002C94, 0x00000A10, 0x000500C5,\n    0x0000000B, 0x00003C00, 0x00003A1D, 0x00004736, 0x000400C8, 0x0000000B,\n    0x00002F7C, 0x00003EB3, 0x000500C7, 0x0000000B, 0x00004852, 0x00003C00,\n    0x00002F7C, 0x000500C5, 0x0000000B, 0x0000186E, 0x00004852, 0x00004FB5,\n    0x000200F9, 0x0000362C, 0x000200F8, 0x0000362C, 0x000700F5, 0x0000000B,\n    0x00004AC8, 0x0000186E, 0x000055A8, 0x00001E82, 0x00002992, 0x000500C2,\n    0x0000000B, 0x00005CB5, 0x0000578D, 0x00000A17, 0x000400C8, 0x0000000B,\n    0x000060F7, 0x000050F8, 0x00070050, 0x00000017, 0x000052F8, 0x000060F7,\n    0x000060F7, 0x000060F7, 0x000060F7, 0x000500C2, 0x00000017, 0x00005DE9,\n    0x000052F8, 0x0000004D, 0x000500C7, 0x00000017, 0x00005AB1, 0x00005DE9,\n    0x0000002F, 0x00050051, 0x0000000B, 0x00004AB9, 0x00003950, 0x00000000,\n    0x00070050, 0x00000017, 0x00006077, 0x00004AB9, 0x00004AB9, 0x00004AB9,\n    0x00004AB9, 0x00050084, 0x00000017, 0x00005FF3, 0x00005AB1, 0x00006077,\n    0x00070050, 0x00000017, 0x00006283, 0x000050F8, 0x000050F8, 0x000050F8,\n    0x000050F8, 0x000500C2, 0x00000017, 0x0000383F, 0x00006283, 0x0000004D,\n    0x000500C7, 0x00000017, 0x00005AB2, 0x0000383F, 0x0000002F, 0x00050051,\n    0x0000000B, 0x00004ABA, 0x00003950, 0x00000001, 0x00070050, 0x00000017,\n    0x00001988, 0x00004ABA, 0x00004ABA, 0x00004ABA, 0x00004ABA, 0x00050084,\n    0x00000017, 0x00003FE2, 0x00005AB2, 0x00001988, 0x00050080, 0x00000017,\n    0x00002C04, 0x00005FF3, 0x00003FE2, 0x000500C7, 0x00000017, 0x000060C2,\n    0x00002C04, 0x000003A1, 0x00050086, 0x00000017, 0x0000240D, 0x000060C2,\n    0x0000002F, 0x000500C4, 0x00000017, 0x000044CD, 0x0000240D, 0x000002ED,\n    0x000500C2, 0x00000017, 0x00002AD5, 0x00002C04, 0x000001A9, 0x000500C7,\n    0x00000017, 0x000033C5, 0x00002AD5, 0x000003A1, 0x00050086, 0x00000017,\n    0x000043A4, 0x000033C5, 0x0000002F, 0x000500C4, 0x00000017, 0x00004267,\n    0x000043A4, 0x0000013D, 0x000500C5, 0x00000017, 0x000018B2, 0x000044CD,\n    0x00004267, 0x000500C2, 0x00000017, 0x00003BF4, 0x00002C04, 0x000003C5,\n    0x00050086, 0x00000017, 0x00006198, 0x00003BF4, 0x0000002F, 0x000500C5,\n    0x00000017, 0x00004C1C, 0x000018B2, 0x00006198, 0x000300F7, 0x00005C03,\n    0x00000000, 0x000400FA, 0x00004E84, 0x000055AA, 0x000028E7, 0x000200F8,\n    0x000028E7, 0x000400C8, 0x0000000B, 0x00002062, 0x00004AC8, 0x000500C7,\n    0x0000000B, 0x00003C01, 0x00002062, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00004534, 0x000055C0, 0x00003C01, 0x000500C7, 0x0000000B, 0x000055DF,\n    0x00004AC8, 0x00000A1F, 0x00050084, 0x0000000B, 0x00004FB1, 0x00002778,\n    0x000055DF, 0x00050080, 0x0000000B, 0x00004D8A, 0x00004534, 0x00004FB1,\n    0x00050086, 0x0000000B, 0x000032D0, 0x00004D8A, 0x00000A1F, 0x000500C2,\n    0x0000000B, 0x000059F6, 0x00002062, 0x00000A13, 0x000500C7, 0x0000000B,\n    0x00002239, 0x000059F6, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003ABC,\n    0x000055C0, 0x00002239, 0x000500C2, 0x0000000B, 0x000033FB, 0x00004AC8,\n    0x00000A13, 0x000500C7, 0x0000000B, 0x00006195, 0x000033FB, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00006284, 0x00002778, 0x00006195, 0x00050080,\n    0x0000000B, 0x00004DC1, 0x00003ABC, 0x00006284, 0x00050086, 0x0000000B,\n    0x00003160, 0x00004DC1, 0x00000A1F, 0x000500C4, 0x0000000B, 0x00001FF0,\n    0x00003160, 0x00000A22, 0x000500C5, 0x0000000B, 0x00001D91, 0x000032D0,\n    0x00001FF0, 0x000500C2, 0x0000000B, 0x000055C1, 0x00002062, 0x00000A1C,\n    0x000500C7, 0x0000000B, 0x000044CE, 0x000055C1, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00003ABD, 0x000055C0, 0x000044CE, 0x000500C2, 0x0000000B,\n    0x000033FC, 0x00004AC8, 0x00000A1C, 0x000500C7, 0x0000000B, 0x00006199,\n    0x000033FC, 0x00000A1F, 0x00050084, 0x0000000B, 0x00006285, 0x00002778,\n    0x00006199, 0x00050080, 0x0000000B, 0x00004DC2, 0x00003ABD, 0x00006285,\n    0x00050086, 0x0000000B, 0x00003161, 0x00004DC2, 0x00000A1F, 0x000500C4,\n    0x0000000B, 0x00001FF1, 0x00003161, 0x00000A3A, 0x000500C5, 0x0000000B,\n    0x00001D92, 0x00001D91, 0x00001FF1, 0x000500C2, 0x0000000B, 0x000055C2,\n    0x00002062, 0x00000A25, 0x000500C7, 0x0000000B, 0x000044CF, 0x000055C2,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00003ABE, 0x000055C0, 0x000044CF,\n    0x000500C2, 0x0000000B, 0x000033FD, 0x00004AC8, 0x00000A25, 0x000500C7,\n    0x0000000B, 0x0000619A, 0x000033FD, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00006286, 0x00002778, 0x0000619A, 0x00050080, 0x0000000B, 0x00004DC3,\n    0x00003ABE, 0x00006286, 0x00050086, 0x0000000B, 0x00003162, 0x00004DC3,\n    0x00000A1F, 0x000500C4, 0x0000000B, 0x000023F9, 0x00003162, 0x00000A52,\n    0x000500C5, 0x0000000B, 0x0000467C, 0x00001D92, 0x000023F9, 0x000200F9,\n    0x00005C03, 0x000200F8, 0x000055AA, 0x000500C7, 0x0000000B, 0x00004E76,\n    0x00004AC8, 0x0000003A, 0x000500C7, 0x0000000B, 0x00005D93, 0x00004AC8,\n    0x0000022D, 0x000500C2, 0x0000000B, 0x0000555B, 0x00005D93, 0x00000A0D,\n    0x000500C7, 0x0000000B, 0x00001FCC, 0x00004E76, 0x0000555B, 0x000500C4,\n    0x0000000B, 0x00006028, 0x00001FCC, 0x00000A0D, 0x000500C2, 0x0000000B,\n    0x000059B3, 0x00001FCC, 0x00000A0D, 0x000500C5, 0x0000000B, 0x00004980,\n    0x00006028, 0x000059B3, 0x000500C5, 0x0000000B, 0x00003E2E, 0x00001FCC,\n    0x00004980, 0x000400C8, 0x0000000B, 0x0000210F, 0x00003E2E, 0x000500C7,\n    0x0000000B, 0x00002766, 0x00004AC8, 0x0000210F, 0x00050082, 0x0000000B,\n    0x00003FB0, 0x00000908, 0x00002766, 0x000500C7, 0x0000000B, 0x0000440B,\n    0x00003FB0, 0x0000210F, 0x000500C7, 0x0000000B, 0x00004268, 0x0000440B,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00003571, 0x000055C0, 0x00004268,\n    0x000500C7, 0x0000000B, 0x000055E0, 0x00002766, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00004FB2, 0x00002778, 0x000055E0, 0x00050080, 0x0000000B,\n    0x00004D8B, 0x00003571, 0x00004FB2, 0x00050086, 0x0000000B, 0x000032D1,\n    0x00004D8B, 0x00000A19, 0x000500C2, 0x0000000B, 0x000059F7, 0x0000440B,\n    0x00000A13, 0x000500C7, 0x0000000B, 0x0000223A, 0x000059F7, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00003ABF, 0x000055C0, 0x0000223A, 0x000500C2,\n    0x0000000B, 0x000033FE, 0x00002766, 0x00000A13, 0x000500C7, 0x0000000B,\n    0x0000619B, 0x000033FE, 0x00000A1F, 0x00050084, 0x0000000B, 0x00006287,\n    0x00002778, 0x0000619B, 0x00050080, 0x0000000B, 0x00004DC4, 0x00003ABF,\n    0x00006287, 0x00050086, 0x0000000B, 0x00003163, 0x00004DC4, 0x00000A19,\n    0x000500C4, 0x0000000B, 0x00001FF2, 0x00003163, 0x00000A22, 0x000500C5,\n    0x0000000B, 0x00001D93, 0x000032D1, 0x00001FF2, 0x000500C2, 0x0000000B,\n    0x000055C3, 0x0000440B, 0x00000A1C, 0x000500C7, 0x0000000B, 0x000044D0,\n    0x000055C3, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AC0, 0x000055C0,\n    0x000044D0, 0x000500C2, 0x0000000B, 0x000033FF, 0x00002766, 0x00000A1C,\n    0x000500C7, 0x0000000B, 0x0000619C, 0x000033FF, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00006288, 0x00002778, 0x0000619C, 0x00050080, 0x0000000B,\n    0x00004DC5, 0x00003AC0, 0x00006288, 0x00050086, 0x0000000B, 0x00003164,\n    0x00004DC5, 0x00000A19, 0x000500C4, 0x0000000B, 0x00001FF3, 0x00003164,\n    0x00000A3A, 0x000500C5, 0x0000000B, 0x00001D94, 0x00001D93, 0x00001FF3,\n    0x000500C2, 0x0000000B, 0x000055C4, 0x0000440B, 0x00000A25, 0x000500C7,\n    0x0000000B, 0x000044D1, 0x000055C4, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00003AC1, 0x000055C0, 0x000044D1, 0x000500C2, 0x0000000B, 0x00003400,\n    0x00002766, 0x00000A25, 0x000500C7, 0x0000000B, 0x0000619D, 0x00003400,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00006289, 0x00002778, 0x0000619D,\n    0x00050080, 0x0000000B, 0x00004DC6, 0x00003AC1, 0x00006289, 0x00050086,\n    0x0000000B, 0x00003165, 0x00004DC6, 0x00000A19, 0x000500C4, 0x0000000B,\n    0x00002044, 0x00003165, 0x00000A52, 0x000500C5, 0x0000000B, 0x00001A24,\n    0x00001D94, 0x00002044, 0x000500C7, 0x0000000B, 0x00004FB6, 0x00004AC8,\n    0x00003E2E, 0x000500C7, 0x0000000B, 0x00004404, 0x00004FB6, 0x00000A0D,\n    0x000500C7, 0x0000000B, 0x00004C6B, 0x00004FB6, 0x00000A22, 0x000500C4,\n    0x0000000B, 0x00006168, 0x00004C6B, 0x00000A19, 0x000500C5, 0x0000000B,\n    0x000042C3, 0x00004404, 0x00006168, 0x000500C7, 0x0000000B, 0x0000518A,\n    0x00004FB6, 0x00000ACA, 0x000500C4, 0x0000000B, 0x00005B1B, 0x0000518A,\n    0x00000A28, 0x000500C5, 0x0000000B, 0x000042C4, 0x000042C3, 0x00005B1B,\n    0x000500C7, 0x0000000B, 0x0000518B, 0x00004FB6, 0x00000447, 0x000500C4,\n    0x0000000B, 0x00005622, 0x0000518B, 0x00000A37, 0x000500C5, 0x0000000B,\n    0x0000207B, 0x000042C4, 0x00005622, 0x00050084, 0x0000000B, 0x000028B7,\n    0x0000207B, 0x00000144, 0x00050080, 0x0000000B, 0x00004804, 0x00001A24,\n    0x000028B7, 0x000200F9, 0x00005C03, 0x000200F8, 0x00005C03, 0x000700F5,\n    0x0000000B, 0x00004D0A, 0x00004804, 0x000055AA, 0x0000467C, 0x000028E7,\n    0x00070050, 0x00000017, 0x0000351E, 0x00004D0A, 0x00004D0A, 0x00004D0A,\n    0x00004D0A, 0x000500C4, 0x00000017, 0x000042CA, 0x0000351E, 0x0000019D,\n    0x000500C7, 0x00000017, 0x000053BF, 0x000042CA, 0x00000A27, 0x000500C5,\n    0x00000017, 0x00002FE1, 0x00004C1C, 0x000053BF, 0x00060041, 0x00000294,\n    0x00005B1C, 0x0000140E, 0x00000A0B, 0x00005CB5, 0x0003003E, 0x00005B1C,\n    0x00002FE1, 0x000300F7, 0x00001C28, 0x00000002, 0x000400FA, 0x00004411,\n    0x0000592D, 0x00001C28, 0x000200F8, 0x0000592D, 0x00050080, 0x0000000B,\n    0x00003C7A, 0x0000578D, 0x0000578C, 0x000500C2, 0x0000000B, 0x000037CD,\n    0x00003C7A, 0x00000A17, 0x000500C2, 0x0000000B, 0x00002E6A, 0x000050F8,\n    0x00000A22, 0x000400C8, 0x0000000B, 0x00004B07, 0x00002E6A, 0x00070050,\n    0x00000017, 0x000052F9, 0x00004B07, 0x00004B07, 0x00004B07, 0x00004B07,\n    0x000500C2, 0x00000017, 0x000061B4, 0x000052F9, 0x0000004D, 0x000500C7,\n    0x00000017, 0x0000383B, 0x000061B4, 0x0000002F, 0x00050084, 0x00000017,\n    0x00003CD2, 0x0000383B, 0x00006077, 0x00070050, 0x00000017, 0x0000539D,\n    0x00002E6A, 0x00002E6A, 0x00002E6A, 0x00002E6A, 0x000500C2, 0x00000017,\n    0x00003C09, 0x0000539D, 0x0000004D, 0x000500C7, 0x00000017, 0x00003BCB,\n    0x00003C09, 0x0000002F, 0x00050084, 0x00000017, 0x00001CC1, 0x00003BCB,\n    0x00001988, 0x00050080, 0x00000017, 0x00001D24, 0x00003CD2, 0x00001CC1,\n    0x000500C7, 0x00000017, 0x000060C3, 0x00001D24, 0x000003A1, 0x00050086,\n    0x00000017, 0x0000240E, 0x000060C3, 0x0000002F, 0x000500C4, 0x00000017,\n    0x000044D2, 0x0000240E, 0x000002ED, 0x000500C2, 0x00000017, 0x00002AD6,\n    0x00001D24, 0x000001A9, 0x000500C7, 0x00000017, 0x000033C6, 0x00002AD6,\n    0x000003A1, 0x00050086, 0x00000017, 0x000043A5, 0x000033C6, 0x0000002F,\n    0x000500C4, 0x00000017, 0x00004269, 0x000043A5, 0x0000013D, 0x000500C5,\n    0x00000017, 0x000018B3, 0x000044D2, 0x00004269, 0x000500C2, 0x00000017,\n    0x00003BF5, 0x00001D24, 0x000003C5, 0x00050086, 0x00000017, 0x00005DA9,\n    0x00003BF5, 0x0000002F, 0x000500C5, 0x00000017, 0x00002535, 0x000018B3,\n    0x00005DA9, 0x000500C2, 0x0000000B, 0x00005C85, 0x00004AC8, 0x00000A2E,\n    0x000300F7, 0x00005C04, 0x00000000, 0x000400FA, 0x00004E84, 0x000055AB,\n    0x000028E8, 0x000200F8, 0x000028E8, 0x000400C8, 0x0000000B, 0x00002063,\n    0x00005C85, 0x000500C7, 0x0000000B, 0x00003C02, 0x00002063, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00004535, 0x000055C0, 0x00003C02, 0x000500C7,\n    0x0000000B, 0x000055E1, 0x00005C85, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00004FB7, 0x00002778, 0x000055E1, 0x00050080, 0x0000000B, 0x00004D8C,\n    0x00004535, 0x00004FB7, 0x00050086, 0x0000000B, 0x000032D2, 0x00004D8C,\n    0x00000A1F, 0x000500C2, 0x0000000B, 0x000059F8, 0x00002063, 0x00000A13,\n    0x000500C7, 0x0000000B, 0x0000223B, 0x000059F8, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00003AC2, 0x000055C0, 0x0000223B, 0x000500C2, 0x0000000B,\n    0x00003401, 0x00005C85, 0x00000A13, 0x000500C7, 0x0000000B, 0x0000619E,\n    0x00003401, 0x00000A1F, 0x00050084, 0x0000000B, 0x0000628A, 0x00002778,\n    0x0000619E, 0x00050080, 0x0000000B, 0x00004DC7, 0x00003AC2, 0x0000628A,\n    0x00050086, 0x0000000B, 0x00003166, 0x00004DC7, 0x00000A1F, 0x000500C4,\n    0x0000000B, 0x00001FF4, 0x00003166, 0x00000A22, 0x000500C5, 0x0000000B,\n    0x00001D95, 0x000032D2, 0x00001FF4, 0x000500C2, 0x0000000B, 0x000055C5,\n    0x00002063, 0x00000A1C, 0x000500C7, 0x0000000B, 0x000044D3, 0x000055C5,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00003AC3, 0x000055C0, 0x000044D3,\n    0x000500C2, 0x0000000B, 0x00003402, 0x00005C85, 0x00000A1C, 0x000500C7,\n    0x0000000B, 0x0000619F, 0x00003402, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x0000628B, 0x00002778, 0x0000619F, 0x00050080, 0x0000000B, 0x00004DC8,\n    0x00003AC3, 0x0000628B, 0x00050086, 0x0000000B, 0x00003167, 0x00004DC8,\n    0x00000A1F, 0x000500C4, 0x0000000B, 0x00001FF5, 0x00003167, 0x00000A3A,\n    0x000500C5, 0x0000000B, 0x00001D96, 0x00001D95, 0x00001FF5, 0x000500C2,\n    0x0000000B, 0x000055C6, 0x00002063, 0x00000A25, 0x000500C7, 0x0000000B,\n    0x000044D4, 0x000055C6, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AC4,\n    0x000055C0, 0x000044D4, 0x000500C2, 0x0000000B, 0x00003403, 0x00005C85,\n    0x00000A25, 0x000500C7, 0x0000000B, 0x000061A0, 0x00003403, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x0000628C, 0x00002778, 0x000061A0, 0x00050080,\n    0x0000000B, 0x00004DC9, 0x00003AC4, 0x0000628C, 0x00050086, 0x0000000B,\n    0x00003168, 0x00004DC9, 0x00000A1F, 0x000500C4, 0x0000000B, 0x000023FA,\n    0x00003168, 0x00000A52, 0x000500C5, 0x0000000B, 0x0000467D, 0x00001D96,\n    0x000023FA, 0x000200F9, 0x00005C04, 0x000200F8, 0x000055AB, 0x000500C7,\n    0x0000000B, 0x00004E77, 0x00005C85, 0x0000003A, 0x000500C7, 0x0000000B,\n    0x00005D94, 0x00005C85, 0x0000022D, 0x000500C2, 0x0000000B, 0x0000555C,\n    0x00005D94, 0x00000A0D, 0x000500C7, 0x0000000B, 0x00001FCD, 0x00004E77,\n    0x0000555C, 0x000500C4, 0x0000000B, 0x00006029, 0x00001FCD, 0x00000A0D,\n    0x000500C2, 0x0000000B, 0x000059B4, 0x00001FCD, 0x00000A0D, 0x000500C5,\n    0x0000000B, 0x00004981, 0x00006029, 0x000059B4, 0x000500C5, 0x0000000B,\n    0x00003E2F, 0x00001FCD, 0x00004981, 0x000400C8, 0x0000000B, 0x00002110,\n    0x00003E2F, 0x000500C7, 0x0000000B, 0x00002767, 0x00005C85, 0x00002110,\n    0x00050082, 0x0000000B, 0x00003FB1, 0x00000908, 0x00002767, 0x000500C7,\n    0x0000000B, 0x0000440C, 0x00003FB1, 0x00002110, 0x000500C7, 0x0000000B,\n    0x0000426A, 0x0000440C, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003572,\n    0x000055C0, 0x0000426A, 0x000500C7, 0x0000000B, 0x000055E2, 0x00002767,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00004FB8, 0x00002778, 0x000055E2,\n    0x00050080, 0x0000000B, 0x00004D8D, 0x00003572, 0x00004FB8, 0x00050086,\n    0x0000000B, 0x000032D3, 0x00004D8D, 0x00000A19, 0x000500C2, 0x0000000B,\n    0x000059F9, 0x0000440C, 0x00000A13, 0x000500C7, 0x0000000B, 0x0000223C,\n    0x000059F9, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AC5, 0x000055C0,\n    0x0000223C, 0x000500C2, 0x0000000B, 0x00003404, 0x00002767, 0x00000A13,\n    0x000500C7, 0x0000000B, 0x000061A1, 0x00003404, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x0000628D, 0x00002778, 0x000061A1, 0x00050080, 0x0000000B,\n    0x00004DCA, 0x00003AC5, 0x0000628D, 0x00050086, 0x0000000B, 0x00003169,\n    0x00004DCA, 0x00000A19, 0x000500C4, 0x0000000B, 0x00001FF6, 0x00003169,\n    0x00000A22, 0x000500C5, 0x0000000B, 0x00001D97, 0x000032D3, 0x00001FF6,\n    0x000500C2, 0x0000000B, 0x000055C7, 0x0000440C, 0x00000A1C, 0x000500C7,\n    0x0000000B, 0x000044D5, 0x000055C7, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00003AC6, 0x000055C0, 0x000044D5, 0x000500C2, 0x0000000B, 0x00003405,\n    0x00002767, 0x00000A1C, 0x000500C7, 0x0000000B, 0x000061A2, 0x00003405,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x0000628E, 0x00002778, 0x000061A2,\n    0x00050080, 0x0000000B, 0x00004DCB, 0x00003AC6, 0x0000628E, 0x00050086,\n    0x0000000B, 0x0000316A, 0x00004DCB, 0x00000A19, 0x000500C4, 0x0000000B,\n    0x00001FF7, 0x0000316A, 0x00000A3A, 0x000500C5, 0x0000000B, 0x00001D98,\n    0x00001D97, 0x00001FF7, 0x000500C2, 0x0000000B, 0x000055C8, 0x0000440C,\n    0x00000A25, 0x000500C7, 0x0000000B, 0x000044D6, 0x000055C8, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00003AC7, 0x000055C0, 0x000044D6, 0x000500C2,\n    0x0000000B, 0x00003406, 0x00002767, 0x00000A25, 0x000500C7, 0x0000000B,\n    0x000061A3, 0x00003406, 0x00000A1F, 0x00050084, 0x0000000B, 0x0000628F,\n    0x00002778, 0x000061A3, 0x00050080, 0x0000000B, 0x00004DCC, 0x00003AC7,\n    0x0000628F, 0x00050086, 0x0000000B, 0x0000316B, 0x00004DCC, 0x00000A19,\n    0x000500C4, 0x0000000B, 0x00002045, 0x0000316B, 0x00000A52, 0x000500C5,\n    0x0000000B, 0x00001A25, 0x00001D98, 0x00002045, 0x000500C7, 0x0000000B,\n    0x00004FB9, 0x00005C85, 0x00003E2F, 0x000500C7, 0x0000000B, 0x00004405,\n    0x00004FB9, 0x00000A0D, 0x000500C7, 0x0000000B, 0x00004C6C, 0x00004FB9,\n    0x00000A22, 0x000500C4, 0x0000000B, 0x00006169, 0x00004C6C, 0x00000A19,\n    0x000500C5, 0x0000000B, 0x000042C5, 0x00004405, 0x00006169, 0x000500C7,\n    0x0000000B, 0x0000518C, 0x00004FB9, 0x00000ACA, 0x000500C4, 0x0000000B,\n    0x00005B1D, 0x0000518C, 0x00000A28, 0x000500C5, 0x0000000B, 0x000042CB,\n    0x000042C5, 0x00005B1D, 0x000500C7, 0x0000000B, 0x0000518D, 0x00004FB9,\n    0x00000447, 0x000500C4, 0x0000000B, 0x00005623, 0x0000518D, 0x00000A37,\n    0x000500C5, 0x0000000B, 0x0000207C, 0x000042CB, 0x00005623, 0x00050084,\n    0x0000000B, 0x000028B8, 0x0000207C, 0x00000144, 0x00050080, 0x0000000B,\n    0x00004805, 0x00001A25, 0x000028B8, 0x000200F9, 0x00005C04, 0x000200F8,\n    0x00005C04, 0x000700F5, 0x0000000B, 0x00004D0B, 0x00004805, 0x000055AB,\n    0x0000467D, 0x000028E8, 0x00070050, 0x00000017, 0x0000351F, 0x00004D0B,\n    0x00004D0B, 0x00004D0B, 0x00004D0B, 0x000500C4, 0x00000017, 0x000042CC,\n    0x0000351F, 0x0000019D, 0x000500C7, 0x00000017, 0x000053C0, 0x000042CC,\n    0x00000A27, 0x000500C5, 0x00000017, 0x00002FE2, 0x00002535, 0x000053C0,\n    0x00060041, 0x00000294, 0x00005244, 0x0000140E, 0x00000A0B, 0x000037CD,\n    0x0003003E, 0x00005244, 0x00002FE2, 0x00050080, 0x0000000B, 0x000039FA,\n    0x00003220, 0x00000A10, 0x000500B0, 0x00000009, 0x00002E0D, 0x000039FA,\n    0x000019C2, 0x000300F7, 0x00001C27, 0x00000002, 0x000400FA, 0x00002E0D,\n    0x00003082, 0x00001C27, 0x000200F8, 0x00003082, 0x000500C2, 0x0000000B,\n    0x000033B9, 0x000025B3, 0x00000A22, 0x000300F7, 0x00003192, 0x00000000,\n    0x000400FA, 0x00004E84, 0x000055AC, 0x00002993, 0x000200F8, 0x00002993,\n    0x000500C7, 0x0000000B, 0x000044FC, 0x000033B9, 0x000009E9, 0x000500C7,\n    0x0000000B, 0x00005D69, 0x000033B9, 0x000009C8, 0x000500C2, 0x0000000B,\n    0x000056EA, 0x00005D69, 0x00000A0D, 0x000500C5, 0x0000000B, 0x00005DC5,\n    0x000044FC, 0x000056EA, 0x000500C7, 0x0000000B, 0x00004C92, 0x000033B9,\n    0x00000986, 0x000500C2, 0x0000000B, 0x0000508A, 0x00004C92, 0x00000A10,\n    0x000500C5, 0x0000000B, 0x00005EE2, 0x00005DC5, 0x0000508A, 0x000500C6,\n    0x0000000B, 0x00001E2F, 0x00005EE2, 0x000009E9, 0x000400C8, 0x0000000B,\n    0x0000254B, 0x000056EA, 0x000500C7, 0x0000000B, 0x00003923, 0x000044FC,\n    0x0000254B, 0x000400C8, 0x0000000B, 0x000020EF, 0x0000508A, 0x000500C7,\n    0x0000000B, 0x00002C95, 0x00003923, 0x000020EF, 0x000500C5, 0x0000000B,\n    0x00001A95, 0x000033B9, 0x00001E2F, 0x00050082, 0x0000000B, 0x00004C3B,\n    0x00001A95, 0x000009E9, 0x000500C5, 0x0000000B, 0x00003A1E, 0x00004C3B,\n    0x00002C95, 0x000500C4, 0x0000000B, 0x000046EB, 0x00002C95, 0x00000A0D,\n    0x000500C5, 0x0000000B, 0x00003E8B, 0x00003A1E, 0x000046EB, 0x000500C4,\n    0x0000000B, 0x00001FB9, 0x00002C95, 0x00000A10, 0x000500C5, 0x0000000B,\n    0x00001E83, 0x00003E8B, 0x00001FB9, 0x000200F9, 0x00003192, 0x000200F8,\n    0x000055AC, 0x000500C7, 0x0000000B, 0x00004E78, 0x000033B9, 0x000009C8,\n    0x000500C7, 0x0000000B, 0x00005D95, 0x000033B9, 0x00000986, 0x000500C2,\n    0x0000000B, 0x0000555D, 0x00005D95, 0x00000A0D, 0x000500C7, 0x0000000B,\n    0x00001FCE, 0x00004E78, 0x0000555D, 0x000500C4, 0x0000000B, 0x0000602A,\n    0x00001FCE, 0x00000A0D, 0x000500C2, 0x0000000B, 0x000059B5, 0x00001FCE,\n    0x00000A0D, 0x000500C5, 0x0000000B, 0x0000496C, 0x0000602A, 0x000059B5,\n    0x000500C5, 0x0000000B, 0x00003EB4, 0x00001FCE, 0x0000496C, 0x000500C7,\n    0x0000000B, 0x00004788, 0x000033B9, 0x000009E9, 0x000500C5, 0x0000000B,\n    0x00003960, 0x00004788, 0x00000944, 0x000500C7, 0x0000000B, 0x00004FBA,\n    0x00003960, 0x00003EB4, 0x000500C2, 0x0000000B, 0x0000503E, 0x00004E78,\n    0x00000A0D, 0x000500C5, 0x0000000B, 0x0000615D, 0x00004788, 0x0000503E,\n    0x000500C2, 0x0000000B, 0x000055AD, 0x00005D95, 0x00000A10, 0x000500C5,\n    0x0000000B, 0x00005895, 0x0000615D, 0x000055AD, 0x000500C6, 0x0000000B,\n    0x00001E30, 0x00005895, 0x000009E9, 0x000400C8, 0x0000000B, 0x0000254C,\n    0x0000503E, 0x000500C7, 0x0000000B, 0x00003924, 0x00004788, 0x0000254C,\n    0x000400C8, 0x0000000B, 0x000020F0, 0x000055AD, 0x000500C7, 0x0000000B,\n    0x00002C96, 0x00003924, 0x000020F0, 0x000500C5, 0x0000000B, 0x00001A96,\n    0x000033B9, 0x00001E30, 0x00050082, 0x0000000B, 0x00004C3C, 0x00001A96,\n    0x000009E9, 0x000500C5, 0x0000000B, 0x00003A1F, 0x00004C3C, 0x00002C96,\n    0x000500C4, 0x0000000B, 0x00004737, 0x00002C96, 0x00000A10, 0x000500C5,\n    0x0000000B, 0x00003C03, 0x00003A1F, 0x00004737, 0x000400C8, 0x0000000B,\n    0x00002F7D, 0x00003EB4, 0x000500C7, 0x0000000B, 0x00004853, 0x00003C03,\n    0x00002F7D, 0x000500C5, 0x0000000B, 0x0000186F, 0x00004853, 0x00004FBA,\n    0x000200F9, 0x00003192, 0x000200F8, 0x00003192, 0x000700F5, 0x0000000B,\n    0x000024D7, 0x0000186F, 0x000055AC, 0x00001E83, 0x00002993, 0x00050084,\n    0x0000000B, 0x00004966, 0x00000A10, 0x0000578C, 0x00050080, 0x0000000B,\n    0x000037C5, 0x0000578D, 0x00004966, 0x000500C2, 0x0000000B, 0x0000438A,\n    0x000037C5, 0x00000A17, 0x000500C2, 0x0000000B, 0x00002E6B, 0x000050F8,\n    0x00000A3A, 0x000400C8, 0x0000000B, 0x00004B08, 0x00002E6B, 0x00070050,\n    0x00000017, 0x000052FA, 0x00004B08, 0x00004B08, 0x00004B08, 0x00004B08,\n    0x000500C2, 0x00000017, 0x000061B5, 0x000052FA, 0x0000004D, 0x000500C7,\n    0x00000017, 0x0000383C, 0x000061B5, 0x0000002F, 0x00050084, 0x00000017,\n    0x00003CD3, 0x0000383C, 0x00006077, 0x00070050, 0x00000017, 0x0000539E,\n    0x00002E6B, 0x00002E6B, 0x00002E6B, 0x00002E6B, 0x000500C2, 0x00000017,\n    0x00003C0A, 0x0000539E, 0x0000004D, 0x000500C7, 0x00000017, 0x00003BCC,\n    0x00003C0A, 0x0000002F, 0x00050084, 0x00000017, 0x00001CC2, 0x00003BCC,\n    0x00001988, 0x00050080, 0x00000017, 0x00001D25, 0x00003CD3, 0x00001CC2,\n    0x000500C7, 0x00000017, 0x000060C4, 0x00001D25, 0x000003A1, 0x00050086,\n    0x00000017, 0x0000240F, 0x000060C4, 0x0000002F, 0x000500C4, 0x00000017,\n    0x000044D7, 0x0000240F, 0x000002ED, 0x000500C2, 0x00000017, 0x00002AD7,\n    0x00001D25, 0x000001A9, 0x000500C7, 0x00000017, 0x000033C7, 0x00002AD7,\n    0x000003A1, 0x00050086, 0x00000017, 0x000043A6, 0x000033C7, 0x0000002F,\n    0x000500C4, 0x00000017, 0x0000426B, 0x000043A6, 0x0000013D, 0x000500C5,\n    0x00000017, 0x000018B4, 0x000044D7, 0x0000426B, 0x000500C2, 0x00000017,\n    0x00003BF6, 0x00001D25, 0x000003C5, 0x00050086, 0x00000017, 0x000061A4,\n    0x00003BF6, 0x0000002F, 0x000500C5, 0x00000017, 0x00004C1D, 0x000018B4,\n    0x000061A4, 0x000300F7, 0x00005C05, 0x00000000, 0x000400FA, 0x00004E84,\n    0x000055AE, 0x000028E9, 0x000200F8, 0x000028E9, 0x000400C8, 0x0000000B,\n    0x00002064, 0x000024D7, 0x000500C7, 0x0000000B, 0x00003C04, 0x00002064,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00004536, 0x000055C0, 0x00003C04,\n    0x000500C7, 0x0000000B, 0x000055E3, 0x000024D7, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00004FBB, 0x00002778, 0x000055E3, 0x00050080, 0x0000000B,\n    0x00004D8E, 0x00004536, 0x00004FBB, 0x00050086, 0x0000000B, 0x000032D4,\n    0x00004D8E, 0x00000A1F, 0x000500C2, 0x0000000B, 0x000059FA, 0x00002064,\n    0x00000A13, 0x000500C7, 0x0000000B, 0x0000223D, 0x000059FA, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00003AC8, 0x000055C0, 0x0000223D, 0x000500C2,\n    0x0000000B, 0x00003407, 0x000024D7, 0x00000A13, 0x000500C7, 0x0000000B,\n    0x000061A5, 0x00003407, 0x00000A1F, 0x00050084, 0x0000000B, 0x00006290,\n    0x00002778, 0x000061A5, 0x00050080, 0x0000000B, 0x00004DCD, 0x00003AC8,\n    0x00006290, 0x00050086, 0x0000000B, 0x0000316C, 0x00004DCD, 0x00000A1F,\n    0x000500C4, 0x0000000B, 0x00001FF8, 0x0000316C, 0x00000A22, 0x000500C5,\n    0x0000000B, 0x00001D99, 0x000032D4, 0x00001FF8, 0x000500C2, 0x0000000B,\n    0x000055C9, 0x00002064, 0x00000A1C, 0x000500C7, 0x0000000B, 0x000044D8,\n    0x000055C9, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AC9, 0x000055C0,\n    0x000044D8, 0x000500C2, 0x0000000B, 0x00003408, 0x000024D7, 0x00000A1C,\n    0x000500C7, 0x0000000B, 0x000061A6, 0x00003408, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00006291, 0x00002778, 0x000061A6, 0x00050080, 0x0000000B,\n    0x00004DCE, 0x00003AC9, 0x00006291, 0x00050086, 0x0000000B, 0x0000316D,\n    0x00004DCE, 0x00000A1F, 0x000500C4, 0x0000000B, 0x00001FF9, 0x0000316D,\n    0x00000A3A, 0x000500C5, 0x0000000B, 0x00001D9A, 0x00001D99, 0x00001FF9,\n    0x000500C2, 0x0000000B, 0x000055CA, 0x00002064, 0x00000A25, 0x000500C7,\n    0x0000000B, 0x000044D9, 0x000055CA, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00003ACA, 0x000055C0, 0x000044D9, 0x000500C2, 0x0000000B, 0x00003409,\n    0x000024D7, 0x00000A25, 0x000500C7, 0x0000000B, 0x000061A7, 0x00003409,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00006292, 0x00002778, 0x000061A7,\n    0x00050080, 0x0000000B, 0x00004DCF, 0x00003ACA, 0x00006292, 0x00050086,\n    0x0000000B, 0x0000316E, 0x00004DCF, 0x00000A1F, 0x000500C4, 0x0000000B,\n    0x000023FB, 0x0000316E, 0x00000A52, 0x000500C5, 0x0000000B, 0x0000467E,\n    0x00001D9A, 0x000023FB, 0x000200F9, 0x00005C05, 0x000200F8, 0x000055AE,\n    0x000500C7, 0x0000000B, 0x00004E79, 0x000024D7, 0x0000003A, 0x000500C7,\n    0x0000000B, 0x00005D96, 0x000024D7, 0x0000022D, 0x000500C2, 0x0000000B,\n    0x0000555E, 0x00005D96, 0x00000A0D, 0x000500C7, 0x0000000B, 0x00001FCF,\n    0x00004E79, 0x0000555E, 0x000500C4, 0x0000000B, 0x0000602B, 0x00001FCF,\n    0x00000A0D, 0x000500C2, 0x0000000B, 0x000059B6, 0x00001FCF, 0x00000A0D,\n    0x000500C5, 0x0000000B, 0x00004982, 0x0000602B, 0x000059B6, 0x000500C5,\n    0x0000000B, 0x00003E30, 0x00001FCF, 0x00004982, 0x000400C8, 0x0000000B,\n    0x00002111, 0x00003E30, 0x000500C7, 0x0000000B, 0x00002768, 0x000024D7,\n    0x00002111, 0x00050082, 0x0000000B, 0x00003FB2, 0x00000908, 0x00002768,\n    0x000500C7, 0x0000000B, 0x0000440D, 0x00003FB2, 0x00002111, 0x000500C7,\n    0x0000000B, 0x0000426C, 0x0000440D, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00003573, 0x000055C0, 0x0000426C, 0x000500C7, 0x0000000B, 0x000055E4,\n    0x00002768, 0x00000A1F, 0x00050084, 0x0000000B, 0x00004FBC, 0x00002778,\n    0x000055E4, 0x00050080, 0x0000000B, 0x00004D8F, 0x00003573, 0x00004FBC,\n    0x00050086, 0x0000000B, 0x000032D5, 0x00004D8F, 0x00000A19, 0x000500C2,\n    0x0000000B, 0x000059FB, 0x0000440D, 0x00000A13, 0x000500C7, 0x0000000B,\n    0x0000223E, 0x000059FB, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003ACB,\n    0x000055C0, 0x0000223E, 0x000500C2, 0x0000000B, 0x0000340A, 0x00002768,\n    0x00000A13, 0x000500C7, 0x0000000B, 0x000061A8, 0x0000340A, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00006293, 0x00002778, 0x000061A8, 0x00050080,\n    0x0000000B, 0x00004DD0, 0x00003ACB, 0x00006293, 0x00050086, 0x0000000B,\n    0x0000316F, 0x00004DD0, 0x00000A19, 0x000500C4, 0x0000000B, 0x00001FFA,\n    0x0000316F, 0x00000A22, 0x000500C5, 0x0000000B, 0x00001D9B, 0x000032D5,\n    0x00001FFA, 0x000500C2, 0x0000000B, 0x000055CB, 0x0000440D, 0x00000A1C,\n    0x000500C7, 0x0000000B, 0x000044DA, 0x000055CB, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00003ACC, 0x000055C0, 0x000044DA, 0x000500C2, 0x0000000B,\n    0x0000340B, 0x00002768, 0x00000A1C, 0x000500C7, 0x0000000B, 0x000061A9,\n    0x0000340B, 0x00000A1F, 0x00050084, 0x0000000B, 0x00006294, 0x00002778,\n    0x000061A9, 0x00050080, 0x0000000B, 0x00004DD1, 0x00003ACC, 0x00006294,\n    0x00050086, 0x0000000B, 0x00003170, 0x00004DD1, 0x00000A19, 0x000500C4,\n    0x0000000B, 0x00001FFB, 0x00003170, 0x00000A3A, 0x000500C5, 0x0000000B,\n    0x00001D9C, 0x00001D9B, 0x00001FFB, 0x000500C2, 0x0000000B, 0x000055CC,\n    0x0000440D, 0x00000A25, 0x000500C7, 0x0000000B, 0x000044DB, 0x000055CC,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00003ACD, 0x000055C0, 0x000044DB,\n    0x000500C2, 0x0000000B, 0x0000340C, 0x00002768, 0x00000A25, 0x000500C7,\n    0x0000000B, 0x000061AA, 0x0000340C, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00006295, 0x00002778, 0x000061AA, 0x00050080, 0x0000000B, 0x00004DD2,\n    0x00003ACD, 0x00006295, 0x00050086, 0x0000000B, 0x00003171, 0x00004DD2,\n    0x00000A19, 0x000500C4, 0x0000000B, 0x00002046, 0x00003171, 0x00000A52,\n    0x000500C5, 0x0000000B, 0x00001A26, 0x00001D9C, 0x00002046, 0x000500C7,\n    0x0000000B, 0x00004FBD, 0x000024D7, 0x00003E30, 0x000500C7, 0x0000000B,\n    0x00004406, 0x00004FBD, 0x00000A0D, 0x000500C7, 0x0000000B, 0x00004C6D,\n    0x00004FBD, 0x00000A22, 0x000500C4, 0x0000000B, 0x0000616A, 0x00004C6D,\n    0x00000A19, 0x000500C5, 0x0000000B, 0x000042CD, 0x00004406, 0x0000616A,\n    0x000500C7, 0x0000000B, 0x0000518E, 0x00004FBD, 0x00000ACA, 0x000500C4,\n    0x0000000B, 0x00005B1E, 0x0000518E, 0x00000A28, 0x000500C5, 0x0000000B,\n    0x000042CF, 0x000042CD, 0x00005B1E, 0x000500C7, 0x0000000B, 0x0000518F,\n    0x00004FBD, 0x00000447, 0x000500C4, 0x0000000B, 0x00005624, 0x0000518F,\n    0x00000A37, 0x000500C5, 0x0000000B, 0x0000207D, 0x000042CF, 0x00005624,\n    0x00050084, 0x0000000B, 0x000028BA, 0x0000207D, 0x00000144, 0x00050080,\n    0x0000000B, 0x00004806, 0x00001A26, 0x000028BA, 0x000200F9, 0x00005C05,\n    0x000200F8, 0x00005C05, 0x000700F5, 0x0000000B, 0x00004D0C, 0x00004806,\n    0x000055AE, 0x0000467E, 0x000028E9, 0x00070050, 0x00000017, 0x00003520,\n    0x00004D0C, 0x00004D0C, 0x00004D0C, 0x00004D0C, 0x000500C4, 0x00000017,\n    0x000042D0, 0x00003520, 0x0000019D, 0x000500C7, 0x00000017, 0x000053C1,\n    0x000042D0, 0x00000A27, 0x000500C5, 0x00000017, 0x00002FE3, 0x00004C1D,\n    0x000053C1, 0x00060041, 0x00000294, 0x00005245, 0x0000140E, 0x00000A0B,\n    0x0000438A, 0x0003003E, 0x00005245, 0x00002FE3, 0x00050080, 0x0000000B,\n    0x000039FB, 0x00003220, 0x00000A13, 0x000500B0, 0x00000009, 0x00002E0E,\n    0x000039FB, 0x000019C2, 0x000300F7, 0x00004666, 0x00000002, 0x000400FA,\n    0x00002E0E, 0x00005193, 0x00004666, 0x000200F8, 0x00005193, 0x00050084,\n    0x0000000B, 0x0000338F, 0x00000A13, 0x0000578C, 0x00050080, 0x0000000B,\n    0x0000349C, 0x0000578D, 0x0000338F, 0x000500C2, 0x0000000B, 0x0000438B,\n    0x0000349C, 0x00000A17, 0x000500C2, 0x0000000B, 0x00002E6C, 0x000050F8,\n    0x00000A52, 0x000400C8, 0x0000000B, 0x00004B09, 0x00002E6C, 0x00070050,\n    0x00000017, 0x000052FB, 0x00004B09, 0x00004B09, 0x00004B09, 0x00004B09,\n    0x000500C2, 0x00000017, 0x000061B6, 0x000052FB, 0x0000004D, 0x000500C7,\n    0x00000017, 0x00003840, 0x000061B6, 0x0000002F, 0x00050084, 0x00000017,\n    0x00003CD4, 0x00003840, 0x00006077, 0x00070050, 0x00000017, 0x0000539F,\n    0x00002E6C, 0x00002E6C, 0x00002E6C, 0x00002E6C, 0x000500C2, 0x00000017,\n    0x00003C0B, 0x0000539F, 0x0000004D, 0x000500C7, 0x00000017, 0x00003BCD,\n    0x00003C0B, 0x0000002F, 0x00050084, 0x00000017, 0x00001CC3, 0x00003BCD,\n    0x00001988, 0x00050080, 0x00000017, 0x00001D26, 0x00003CD4, 0x00001CC3,\n    0x000500C7, 0x00000017, 0x000060C5, 0x00001D26, 0x000003A1, 0x00050086,\n    0x00000017, 0x00002410, 0x000060C5, 0x0000002F, 0x000500C4, 0x00000017,\n    0x000044DC, 0x00002410, 0x000002ED, 0x000500C2, 0x00000017, 0x00002AD8,\n    0x00001D26, 0x000001A9, 0x000500C7, 0x00000017, 0x000033C8, 0x00002AD8,\n    0x000003A1, 0x00050086, 0x00000017, 0x000043A7, 0x000033C8, 0x0000002F,\n    0x000500C4, 0x00000017, 0x0000426D, 0x000043A7, 0x0000013D, 0x000500C5,\n    0x00000017, 0x000018B5, 0x000044DC, 0x0000426D, 0x000500C2, 0x00000017,\n    0x00003BF7, 0x00001D26, 0x000003C5, 0x00050086, 0x00000017, 0x00005DAA,\n    0x00003BF7, 0x0000002F, 0x000500C5, 0x00000017, 0x00002536, 0x000018B5,\n    0x00005DAA, 0x000500C2, 0x0000000B, 0x00005C86, 0x000024D7, 0x00000A2E,\n    0x000300F7, 0x00005C06, 0x00000000, 0x000400FA, 0x00004E84, 0x000055CF,\n    0x000028EA, 0x000200F8, 0x000028EA, 0x000400C8, 0x0000000B, 0x00002065,\n    0x00005C86, 0x000500C7, 0x0000000B, 0x00003C05, 0x00002065, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00004537, 0x000055C0, 0x00003C05, 0x000500C7,\n    0x0000000B, 0x000055E5, 0x00005C86, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00004FBE, 0x00002778, 0x000055E5, 0x00050080, 0x0000000B, 0x00004D90,\n    0x00004537, 0x00004FBE, 0x00050086, 0x0000000B, 0x000032D6, 0x00004D90,\n    0x00000A1F, 0x000500C2, 0x0000000B, 0x000059FC, 0x00002065, 0x00000A13,\n    0x000500C7, 0x0000000B, 0x0000223F, 0x000059FC, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00003ACE, 0x000055C0, 0x0000223F, 0x000500C2, 0x0000000B,\n    0x0000340D, 0x00005C86, 0x00000A13, 0x000500C7, 0x0000000B, 0x000061AB,\n    0x0000340D, 0x00000A1F, 0x00050084, 0x0000000B, 0x00006296, 0x00002778,\n    0x000061AB, 0x00050080, 0x0000000B, 0x00004DD3, 0x00003ACE, 0x00006296,\n    0x00050086, 0x0000000B, 0x00003172, 0x00004DD3, 0x00000A1F, 0x000500C4,\n    0x0000000B, 0x00001FFC, 0x00003172, 0x00000A22, 0x000500C5, 0x0000000B,\n    0x00001D9D, 0x000032D6, 0x00001FFC, 0x000500C2, 0x0000000B, 0x000055CD,\n    0x00002065, 0x00000A1C, 0x000500C7, 0x0000000B, 0x000044DD, 0x000055CD,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00003ACF, 0x000055C0, 0x000044DD,\n    0x000500C2, 0x0000000B, 0x0000340E, 0x00005C86, 0x00000A1C, 0x000500C7,\n    0x0000000B, 0x000061AC, 0x0000340E, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00006297, 0x00002778, 0x000061AC, 0x00050080, 0x0000000B, 0x00004DD4,\n    0x00003ACF, 0x00006297, 0x00050086, 0x0000000B, 0x00003173, 0x00004DD4,\n    0x00000A1F, 0x000500C4, 0x0000000B, 0x00001FFD, 0x00003173, 0x00000A3A,\n    0x000500C5, 0x0000000B, 0x00001D9E, 0x00001D9D, 0x00001FFD, 0x000500C2,\n    0x0000000B, 0x000055CE, 0x00002065, 0x00000A25, 0x000500C7, 0x0000000B,\n    0x000044DE, 0x000055CE, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AD0,\n    0x000055C0, 0x000044DE, 0x000500C2, 0x0000000B, 0x0000340F, 0x00005C86,\n    0x00000A25, 0x000500C7, 0x0000000B, 0x000061AD, 0x0000340F, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00006298, 0x00002778, 0x000061AD, 0x00050080,\n    0x0000000B, 0x00004DD5, 0x00003AD0, 0x00006298, 0x00050086, 0x0000000B,\n    0x00003174, 0x00004DD5, 0x00000A1F, 0x000500C4, 0x0000000B, 0x000023FC,\n    0x00003174, 0x00000A52, 0x000500C5, 0x0000000B, 0x0000467F, 0x00001D9E,\n    0x000023FC, 0x000200F9, 0x00005C06, 0x000200F8, 0x000055CF, 0x000500C7,\n    0x0000000B, 0x00004E7A, 0x00005C86, 0x0000003A, 0x000500C7, 0x0000000B,\n    0x00005D97, 0x00005C86, 0x0000022D, 0x000500C2, 0x0000000B, 0x0000555F,\n    0x00005D97, 0x00000A0D, 0x000500C7, 0x0000000B, 0x00001FD0, 0x00004E7A,\n    0x0000555F, 0x000500C4, 0x0000000B, 0x0000602C, 0x00001FD0, 0x00000A0D,\n    0x000500C2, 0x0000000B, 0x000059B7, 0x00001FD0, 0x00000A0D, 0x000500C5,\n    0x0000000B, 0x00004983, 0x0000602C, 0x000059B7, 0x000500C5, 0x0000000B,\n    0x00003E31, 0x00001FD0, 0x00004983, 0x000400C8, 0x0000000B, 0x00002112,\n    0x00003E31, 0x000500C7, 0x0000000B, 0x00002769, 0x00005C86, 0x00002112,\n    0x00050082, 0x0000000B, 0x00003FB3, 0x00000908, 0x00002769, 0x000500C7,\n    0x0000000B, 0x0000440E, 0x00003FB3, 0x00002112, 0x000500C7, 0x0000000B,\n    0x0000426E, 0x0000440E, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003574,\n    0x000055C0, 0x0000426E, 0x000500C7, 0x0000000B, 0x000055E6, 0x00002769,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00004FBF, 0x00002778, 0x000055E6,\n    0x00050080, 0x0000000B, 0x00004D91, 0x00003574, 0x00004FBF, 0x00050086,\n    0x0000000B, 0x000032D8, 0x00004D91, 0x00000A19, 0x000500C2, 0x0000000B,\n    0x000059FD, 0x0000440E, 0x00000A13, 0x000500C7, 0x0000000B, 0x00002240,\n    0x000059FD, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AD1, 0x000055C0,\n    0x00002240, 0x000500C2, 0x0000000B, 0x00003410, 0x00002769, 0x00000A13,\n    0x000500C7, 0x0000000B, 0x000061AE, 0x00003410, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00006299, 0x00002778, 0x000061AE, 0x00050080, 0x0000000B,\n    0x00004DD6, 0x00003AD1, 0x00006299, 0x00050086, 0x0000000B, 0x00003175,\n    0x00004DD6, 0x00000A19, 0x000500C4, 0x0000000B, 0x00001FFE, 0x00003175,\n    0x00000A22, 0x000500C5, 0x0000000B, 0x00001D9F, 0x000032D8, 0x00001FFE,\n    0x000500C2, 0x0000000B, 0x000055D0, 0x0000440E, 0x00000A1C, 0x000500C7,\n    0x0000000B, 0x000044DF, 0x000055D0, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00003AD2, 0x000055C0, 0x000044DF, 0x000500C2, 0x0000000B, 0x00003411,\n    0x00002769, 0x00000A1C, 0x000500C7, 0x0000000B, 0x000061AF, 0x00003411,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x0000629A, 0x00002778, 0x000061AF,\n    0x00050080, 0x0000000B, 0x00004DD7, 0x00003AD2, 0x0000629A, 0x00050086,\n    0x0000000B, 0x00003176, 0x00004DD7, 0x00000A19, 0x000500C4, 0x0000000B,\n    0x00001FFF, 0x00003176, 0x00000A3A, 0x000500C5, 0x0000000B, 0x00001DA0,\n    0x00001D9F, 0x00001FFF, 0x000500C2, 0x0000000B, 0x000055D1, 0x0000440E,\n    0x00000A25, 0x000500C7, 0x0000000B, 0x000044E0, 0x000055D1, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00003AD3, 0x000055C0, 0x000044E0, 0x000500C2,\n    0x0000000B, 0x00003412, 0x00002769, 0x00000A25, 0x000500C7, 0x0000000B,\n    0x000061B0, 0x00003412, 0x00000A1F, 0x00050084, 0x0000000B, 0x0000629B,\n    0x00002778, 0x000061B0, 0x00050080, 0x0000000B, 0x00004DD8, 0x00003AD3,\n    0x0000629B, 0x00050086, 0x0000000B, 0x00003177, 0x00004DD8, 0x00000A19,\n    0x000500C4, 0x0000000B, 0x00002047, 0x00003177, 0x00000A52, 0x000500C5,\n    0x0000000B, 0x00001A27, 0x00001DA0, 0x00002047, 0x000500C7, 0x0000000B,\n    0x00004FC0, 0x00005C86, 0x00003E31, 0x000500C7, 0x0000000B, 0x0000440F,\n    0x00004FC0, 0x00000A0D, 0x000500C7, 0x0000000B, 0x00004C6E, 0x00004FC0,\n    0x00000A22, 0x000500C4, 0x0000000B, 0x0000616B, 0x00004C6E, 0x00000A19,\n    0x000500C5, 0x0000000B, 0x000042D1, 0x0000440F, 0x0000616B, 0x000500C7,\n    0x0000000B, 0x00005190, 0x00004FC0, 0x00000ACA, 0x000500C4, 0x0000000B,\n    0x00005B1F, 0x00005190, 0x00000A28, 0x000500C5, 0x0000000B, 0x000042D2,\n    0x000042D1, 0x00005B1F, 0x000500C7, 0x0000000B, 0x00005191, 0x00004FC0,\n    0x00000447, 0x000500C4, 0x0000000B, 0x00005625, 0x00005191, 0x00000A37,\n    0x000500C5, 0x0000000B, 0x0000207E, 0x000042D2, 0x00005625, 0x00050084,\n    0x0000000B, 0x000028BB, 0x0000207E, 0x00000144, 0x00050080, 0x0000000B,\n    0x00004807, 0x00001A27, 0x000028BB, 0x000200F9, 0x00005C06, 0x000200F8,\n    0x00005C06, 0x000700F5, 0x0000000B, 0x00004D0D, 0x00004807, 0x000055CF,\n    0x0000467F, 0x000028EA, 0x00070050, 0x00000017, 0x00003521, 0x00004D0D,\n    0x00004D0D, 0x00004D0D, 0x00004D0D, 0x000500C4, 0x00000017, 0x000042D3,\n    0x00003521, 0x0000019D, 0x000500C7, 0x00000017, 0x000053C2, 0x000042D3,\n    0x00000A27, 0x000500C5, 0x00000017, 0x00002FE4, 0x00002536, 0x000053C2,\n    0x00060041, 0x00000294, 0x00005B3E, 0x0000140E, 0x00000A0B, 0x0000438B,\n    0x0003003E, 0x00005B3E, 0x00002FE4, 0x000200F9, 0x00004666, 0x000200F8,\n    0x00004666, 0x000200F9, 0x00001C27, 0x000200F8, 0x00001C27, 0x000200F9,\n    0x00001C28, 0x000200F8, 0x00001C28, 0x000200F9, 0x00003A37, 0x000200F8,\n    0x00003A37, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_dxt5a_r8_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25290\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n     %v4uint = OpTypeVector %uint 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v3uint = OpTypeVector %uint 3\n%uint_2396745 = OpConstant %uint 2396745\n%uint_4793490 = OpConstant %uint 4793490\n     %uint_1 = OpConstant %uint 1\n%uint_9586980 = OpConstant %uint 9586980\n     %uint_2 = OpConstant %uint 2\n%uint_14380470 = OpConstant %uint 14380470\n     %uint_0 = OpConstant %uint 0\n     %uint_7 = OpConstant %uint 7\n     %uint_3 = OpConstant %uint 3\n     %uint_8 = OpConstant %uint 8\n     %uint_6 = OpConstant %uint 6\n    %uint_16 = OpConstant %uint 16\n     %uint_9 = OpConstant %uint 9\n    %uint_24 = OpConstant %uint 24\n  %uint_1170 = OpConstant %uint 1170\n  %uint_2340 = OpConstant %uint 2340\n  %uint_2925 = OpConstant %uint 2925\n     %uint_5 = OpConstant %uint 5\n    %uint_64 = OpConstant %uint 64\n    %uint_10 = OpConstant %uint 10\n   %uint_512 = OpConstant %uint 512\n    %uint_15 = OpConstant %uint 15\n   %uint_255 = OpConstant %uint 255\n%uint_16711935 = OpConstant %uint 16711935\n%uint_4278255360 = OpConstant %uint 4278255360\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n      %int_3 = OpConstant %int 3\n      %int_2 = OpConstant %int 2\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %2596 = OpConstantComposite %v3uint %uint_2 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n       %2619 = OpConstantComposite %v3uint %uint_2 %uint_2 %uint_0\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n        %125 = OpConstantComposite %v4uint %uint_0 %uint_8 %uint_0 %uint_8\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n    %uint_12 = OpConstant %uint 12\n     %uint_4 = OpConstant %uint 4\n    %uint_32 = OpConstant %uint 32\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n       %1611 = OpConstantComposite %v4uint %uint_255 %uint_255 %uint_255 %uint_255\n        %533 = OpConstantComposite %v4uint %uint_12 %uint_12 %uint_12 %uint_12\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %14903 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24540 = OpBitwiseAnd %uint %13606 %uint_1\n      %17270 = OpINotEqual %bool %24540 %uint_0\n      %12328 = OpBitwiseAnd %uint %13606 %uint_2\n      %17284 = OpINotEqual %bool %12328 %uint_0\n       %7856 = OpShiftRightLogical %uint %13606 %uint_2\n      %25058 = OpBitwiseAnd %uint %7856 %uint_3\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20158 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n      %22412 = OpLoad %uint %20158\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_7\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2596\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %14018 DontFlatten\n               OpBranchConditional %24679 %21992 %14018\n      %21992 = OpLabel\n               OpBranch %14903\n      %14018 = OpLabel\n      %17344 = OpShiftLeftLogical %v3uint %21387 %2619\n      %14520 = OpBitcast %v3int %17344\n       %8905 = OpCompositeExtract %int %14520 0\n       %6813 = OpCompositeExtract %int %14520 2\n      %21501 = OpBitcast %int %6594\n      %11279 = OpIMul %int %6813 %21501\n      %17598 = OpCompositeExtract %int %14520 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %22412\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %8905 %24535\n      %10404 = OpBitcast %uint %8258\n      %14582 = OpIAdd %uint %22411 %10404\n      %12308 = OpLogicalNot %bool %17270\n               OpSelectionMerge %19040 DontFlatten\n               OpBranchConditional %12308 %9741 %17007\n       %9741 = OpLabel\n      %17463 = OpCompositeExtract %uint %21387 0\n      %11246 = OpCompositeExtract %uint %21387 1\n      %18801 = OpCompositeExtract %uint %21387 2\n      %14831 = OpIMul %uint %22409 %18801\n      %20322 = OpIAdd %uint %11246 %14831\n      %21676 = OpIMul %uint %22408 %20322\n      %20398 = OpIAdd %uint %17463 %21676\n      %11367 = OpShiftLeftLogical %uint %20398 %uint_3\n               OpBranch %19040\n      %17007 = OpLabel\n               OpSelectionMerge %23536 DontFlatten\n               OpBranchConditional %17284 %23520 %24353\n      %23520 = OpLabel\n      %10111 = OpBitcast %v3int %21387\n      %19476 = OpShiftRightLogical %uint %22408 %int_5\n      %18810 = OpShiftRightLogical %uint %22409 %int_4\n       %6782 = OpCompositeExtract %int %10111 2\n      %12089 = OpShiftRightArithmetic %int %6782 %int_2\n      %22400 = OpBitcast %int %18810\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %10111 1\n      %19055 = OpShiftRightArithmetic %int %25154 %int_4\n      %11052 = OpIAdd %int %7938 %19055\n      %16898 = OpBitcast %int %19476\n      %14944 = OpIMul %int %11052 %16898\n      %25155 = OpCompositeExtract %int %10111 0\n      %20423 = OpShiftRightArithmetic %int %25155 %int_5\n      %18940 = OpIAdd %int %14944 %20423\n       %8797 = OpShiftLeftLogical %int %18940 %int_7\n      %11434 = OpBitwiseAnd %int %6782 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %25154 %int_1\n      %21364 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21364 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %25155 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17334 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17334 %uint_3\n      %13015 = OpShiftRightArithmetic %int %25154 %int_3\n       %9929 = OpBitwiseXor %int %13015 %12089\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %25155 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %25154 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6551\n       %7168 = OpShiftLeftLogical %int %16793 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24144 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24144 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24144 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24144 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %23536\n      %24353 = OpLabel\n      %23000 = OpBitcast %v2int %17136\n      %22120 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %23000 1\n      %12090 = OpShiftRightArithmetic %int %14597 %int_5\n      %22401 = OpBitcast %int %22120\n       %7939 = OpIMul %int %12090 %22401\n      %25156 = OpCompositeExtract %int %23000 0\n      %20424 = OpShiftRightArithmetic %int %25156 %int_5\n      %18864 = OpIAdd %int %7939 %20424\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25156 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17335 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17335 %uint_3\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25156 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6552\n       %7169 = OpShiftLeftLogical %int %21575 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24163 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24163 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24163 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %23536\n      %23536 = OpLabel\n      %10540 = OpPhi %uint %16869 %23520 %16870 %24353\n               OpBranch %19040\n      %19040 = OpLabel\n      %11376 = OpPhi %uint %11367 %9741 %10540 %23536\n      %18621 = OpIAdd %uint %11376 %24236\n      %15698 = OpShiftRightLogical %uint %18621 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15698\n       %7338 = OpLoad %v4uint %20399\n      %13760 = OpIEqual %bool %25058 %uint_1\n      %21366 = OpIEqual %bool %25058 %uint_2\n      %22150 = OpLogicalOr %bool %13760 %21366\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %7338 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %7338 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22649 = OpPhi %v4uint %7338 %19040 %16376 %10583\n      %19638 = OpIEqual %bool %25058 %uint_3\n      %15139 = OpLogicalOr %bool %21366 %19638\n               OpSelectionMerge %14874 None\n               OpBranchConditional %15139 %11064 %14874\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22649 %749\n      %15335 = OpShiftRightLogical %v4uint %22649 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %14874\n      %14874 = OpLabel\n      %10924 = OpPhi %v4uint %22649 %13411 %10728 %11064\n               OpSelectionMerge %24688 DontFlatten\n               OpBranchConditional %17270 %21993 %7205\n      %21993 = OpLabel\n               OpBranch %24688\n       %7205 = OpLabel\n               OpBranch %24688\n      %24688 = OpLabel\n      %11377 = OpPhi %uint %uint_32 %21993 %uint_16 %7205\n      %18622 = OpIAdd %uint %18621 %11377\n      %15699 = OpShiftRightLogical %uint %18622 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15699\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %14875 None\n               OpBranchConditional %22150 %10584 %14875\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %14875\n      %14875 = OpLabel\n      %10925 = OpPhi %v4uint %14608 %24688 %16377 %10584\n               OpSelectionMerge %11682 None\n               OpBranchConditional %15139 %11065 %11682\n      %11065 = OpLabel\n      %24088 = OpShiftLeftLogical %v4uint %10925 %749\n      %15336 = OpShiftRightLogical %v4uint %10925 %749\n      %10729 = OpBitwiseOr %v4uint %24088 %15336\n               OpBranch %11682\n      %11682 = OpLabel\n      %19853 = OpPhi %v4uint %10925 %14875 %10729 %11065\n      %22133 = OpVectorShuffle %v4uint %10924 %10924 0 0 2 2\n      %12416 = OpShiftRightLogical %v4uint %22133 %125\n       %9078 = OpBitwiseAnd %v4uint %12416 %1611\n      %17064 = OpVectorShuffle %v4uint %19853 %19853 0 0 2 2\n       %7640 = OpShiftRightLogical %v4uint %17064 %125\n       %6585 = OpBitwiseAnd %v4uint %7640 %1611\n      %17985 = OpCompositeExtract %uint %10924 0\n       %6272 = OpCompositeExtract %uint %10924 2\n       %7641 = OpCompositeExtract %uint %19853 0\n       %9980 = OpCompositeExtract %uint %19853 2\n      %15375 = OpCompositeConstruct %v4uint %17985 %6272 %7641 %9980\n      %10122 = OpShiftRightLogical %v4uint %15375 %749\n      %23844 = OpCompositeExtract %uint %10924 1\n      %24539 = OpCompositeExtract %uint %10924 3\n       %7642 = OpCompositeExtract %uint %19853 1\n      %10075 = OpCompositeExtract %uint %19853 3\n      %16695 = OpCompositeConstruct %v4uint %23844 %24539 %7642 %10075\n       %8679 = OpBitwiseAnd %v4uint %16695 %1611\n      %20043 = OpShiftLeftLogical %v4uint %8679 %749\n      %16241 = OpBitwiseOr %v4uint %10122 %20043\n      %20096 = OpCompositeExtract %uint %16241 0\n       %6502 = OpCompositeExtract %uint %9078 0\n      %13104 = OpCompositeExtract %uint %9078 1\n      %20099 = OpULessThanEqual %bool %6502 %13104\n               OpSelectionMerge %11720 None\n               OpBranchConditional %20099 %10640 %21920\n      %10640 = OpLabel\n      %17657 = OpBitwiseAnd %uint %20096 %uint_4793490\n      %23948 = OpBitwiseAnd %uint %20096 %uint_9586980\n      %21844 = OpShiftRightLogical %uint %23948 %uint_1\n       %8133 = OpBitwiseAnd %uint %17657 %21844\n      %24609 = OpShiftLeftLogical %uint %8133 %uint_1\n      %22956 = OpShiftRightLogical %uint %8133 %uint_1\n      %18793 = OpBitwiseOr %uint %24609 %22956\n      %16049 = OpBitwiseOr %uint %8133 %18793\n      %18309 = OpBitwiseAnd %uint %20096 %uint_2396745\n      %14685 = OpBitwiseOr %uint %18309 %uint_14380470\n      %20403 = OpBitwiseAnd %uint %14685 %16049\n      %20539 = OpShiftRightLogical %uint %17657 %uint_1\n      %24922 = OpBitwiseOr %uint %18309 %20539\n      %21922 = OpShiftRightLogical %uint %23948 %uint_2\n      %22674 = OpBitwiseOr %uint %24922 %21922\n       %7721 = OpBitwiseXor %uint %22674 %uint_2396745\n       %9540 = OpNot %uint %20539\n      %14621 = OpBitwiseAnd %uint %18309 %9540\n       %8425 = OpNot %uint %21922\n      %11407 = OpBitwiseAnd %uint %14621 %8425\n       %6799 = OpBitwiseOr %uint %20096 %7721\n      %19509 = OpISub %uint %6799 %uint_2396745\n      %14871 = OpBitwiseOr %uint %19509 %11407\n      %18228 = OpShiftLeftLogical %uint %11407 %uint_2\n      %15354 = OpBitwiseOr %uint %14871 %18228\n      %12154 = OpNot %uint %16049\n      %18512 = OpBitwiseAnd %uint %15354 %12154\n       %6252 = OpBitwiseOr %uint %18512 %20403\n               OpBranch %11720\n      %21920 = OpLabel\n      %20079 = OpBitwiseAnd %uint %20096 %uint_2396745\n      %23910 = OpBitwiseAnd %uint %20096 %uint_4793490\n      %22247 = OpShiftRightLogical %uint %23910 %uint_1\n      %24000 = OpBitwiseOr %uint %20079 %22247\n      %19599 = OpBitwiseAnd %uint %20096 %uint_9586980\n      %20615 = OpShiftRightLogical %uint %19599 %uint_2\n      %24287 = OpBitwiseOr %uint %24000 %20615\n       %7722 = OpBitwiseXor %uint %24287 %uint_2396745\n       %9541 = OpNot %uint %22247\n      %14622 = OpBitwiseAnd %uint %20079 %9541\n       %8426 = OpNot %uint %20615\n      %11408 = OpBitwiseAnd %uint %14622 %8426\n       %6800 = OpBitwiseOr %uint %20096 %7722\n      %19510 = OpISub %uint %6800 %uint_2396745\n      %14872 = OpBitwiseOr %uint %19510 %11408\n      %18152 = OpShiftLeftLogical %uint %11408 %uint_1\n      %16008 = OpBitwiseOr %uint %14872 %18152\n       %8118 = OpShiftLeftLogical %uint %11408 %uint_2\n       %7808 = OpBitwiseOr %uint %16008 %8118\n               OpBranch %11720\n      %11720 = OpLabel\n      %17360 = OpPhi %uint %6252 %10640 %7808 %21920\n      %23054 = OpCompositeExtract %uint %16241 1\n      %12929 = OpCompositeExtract %uint %9078 2\n      %13105 = OpCompositeExtract %uint %9078 3\n      %20100 = OpULessThanEqual %bool %12929 %13105\n               OpSelectionMerge %11721 None\n               OpBranchConditional %20100 %10641 %21921\n      %10641 = OpLabel\n      %17658 = OpBitwiseAnd %uint %23054 %uint_4793490\n      %23949 = OpBitwiseAnd %uint %23054 %uint_9586980\n      %21845 = OpShiftRightLogical %uint %23949 %uint_1\n       %8134 = OpBitwiseAnd %uint %17658 %21845\n      %24610 = OpShiftLeftLogical %uint %8134 %uint_1\n      %22957 = OpShiftRightLogical %uint %8134 %uint_1\n      %18794 = OpBitwiseOr %uint %24610 %22957\n      %16050 = OpBitwiseOr %uint %8134 %18794\n      %18310 = OpBitwiseAnd %uint %23054 %uint_2396745\n      %14686 = OpBitwiseOr %uint %18310 %uint_14380470\n      %20404 = OpBitwiseAnd %uint %14686 %16050\n      %20540 = OpShiftRightLogical %uint %17658 %uint_1\n      %24923 = OpBitwiseOr %uint %18310 %20540\n      %21923 = OpShiftRightLogical %uint %23949 %uint_2\n      %22675 = OpBitwiseOr %uint %24923 %21923\n       %7723 = OpBitwiseXor %uint %22675 %uint_2396745\n       %9542 = OpNot %uint %20540\n      %14623 = OpBitwiseAnd %uint %18310 %9542\n       %8427 = OpNot %uint %21923\n      %11409 = OpBitwiseAnd %uint %14623 %8427\n       %6801 = OpBitwiseOr %uint %23054 %7723\n      %19511 = OpISub %uint %6801 %uint_2396745\n      %14873 = OpBitwiseOr %uint %19511 %11409\n      %18229 = OpShiftLeftLogical %uint %11409 %uint_2\n      %15355 = OpBitwiseOr %uint %14873 %18229\n      %12155 = OpNot %uint %16050\n      %18513 = OpBitwiseAnd %uint %15355 %12155\n       %6253 = OpBitwiseOr %uint %18513 %20404\n               OpBranch %11721\n      %21921 = OpLabel\n      %20080 = OpBitwiseAnd %uint %23054 %uint_2396745\n      %23911 = OpBitwiseAnd %uint %23054 %uint_4793490\n      %22248 = OpShiftRightLogical %uint %23911 %uint_1\n      %24001 = OpBitwiseOr %uint %20080 %22248\n      %19600 = OpBitwiseAnd %uint %23054 %uint_9586980\n      %20616 = OpShiftRightLogical %uint %19600 %uint_2\n      %24288 = OpBitwiseOr %uint %24001 %20616\n       %7724 = OpBitwiseXor %uint %24288 %uint_2396745\n       %9543 = OpNot %uint %22248\n      %14624 = OpBitwiseAnd %uint %20080 %9543\n       %8428 = OpNot %uint %20616\n      %11410 = OpBitwiseAnd %uint %14624 %8428\n       %6802 = OpBitwiseOr %uint %23054 %7724\n      %19512 = OpISub %uint %6802 %uint_2396745\n      %14876 = OpBitwiseOr %uint %19512 %11410\n      %18153 = OpShiftLeftLogical %uint %11410 %uint_1\n      %16009 = OpBitwiseOr %uint %14876 %18153\n       %8119 = OpShiftLeftLogical %uint %11410 %uint_2\n       %7809 = OpBitwiseOr %uint %16009 %8119\n               OpBranch %11721\n      %11721 = OpLabel\n      %17361 = OpPhi %uint %6253 %10641 %7809 %21921\n      %23055 = OpCompositeExtract %uint %16241 2\n      %12930 = OpCompositeExtract %uint %6585 0\n      %13106 = OpCompositeExtract %uint %6585 1\n      %20101 = OpULessThanEqual %bool %12930 %13106\n               OpSelectionMerge %11722 None\n               OpBranchConditional %20101 %10642 %21925\n      %10642 = OpLabel\n      %17659 = OpBitwiseAnd %uint %23055 %uint_4793490\n      %23950 = OpBitwiseAnd %uint %23055 %uint_9586980\n      %21846 = OpShiftRightLogical %uint %23950 %uint_1\n       %8135 = OpBitwiseAnd %uint %17659 %21846\n      %24611 = OpShiftLeftLogical %uint %8135 %uint_1\n      %22958 = OpShiftRightLogical %uint %8135 %uint_1\n      %18795 = OpBitwiseOr %uint %24611 %22958\n      %16051 = OpBitwiseOr %uint %8135 %18795\n      %18311 = OpBitwiseAnd %uint %23055 %uint_2396745\n      %14687 = OpBitwiseOr %uint %18311 %uint_14380470\n      %20405 = OpBitwiseAnd %uint %14687 %16051\n      %20541 = OpShiftRightLogical %uint %17659 %uint_1\n      %24924 = OpBitwiseOr %uint %18311 %20541\n      %21924 = OpShiftRightLogical %uint %23950 %uint_2\n      %22676 = OpBitwiseOr %uint %24924 %21924\n       %7725 = OpBitwiseXor %uint %22676 %uint_2396745\n       %9544 = OpNot %uint %20541\n      %14625 = OpBitwiseAnd %uint %18311 %9544\n       %8429 = OpNot %uint %21924\n      %11411 = OpBitwiseAnd %uint %14625 %8429\n       %6803 = OpBitwiseOr %uint %23055 %7725\n      %19513 = OpISub %uint %6803 %uint_2396745\n      %14877 = OpBitwiseOr %uint %19513 %11411\n      %18230 = OpShiftLeftLogical %uint %11411 %uint_2\n      %15356 = OpBitwiseOr %uint %14877 %18230\n      %12156 = OpNot %uint %16051\n      %18514 = OpBitwiseAnd %uint %15356 %12156\n       %6254 = OpBitwiseOr %uint %18514 %20405\n               OpBranch %11722\n      %21925 = OpLabel\n      %20081 = OpBitwiseAnd %uint %23055 %uint_2396745\n      %23912 = OpBitwiseAnd %uint %23055 %uint_4793490\n      %22249 = OpShiftRightLogical %uint %23912 %uint_1\n      %24002 = OpBitwiseOr %uint %20081 %22249\n      %19601 = OpBitwiseAnd %uint %23055 %uint_9586980\n      %20617 = OpShiftRightLogical %uint %19601 %uint_2\n      %24289 = OpBitwiseOr %uint %24002 %20617\n       %7726 = OpBitwiseXor %uint %24289 %uint_2396745\n       %9545 = OpNot %uint %22249\n      %14626 = OpBitwiseAnd %uint %20081 %9545\n       %8430 = OpNot %uint %20617\n      %11412 = OpBitwiseAnd %uint %14626 %8430\n       %6804 = OpBitwiseOr %uint %23055 %7726\n      %19514 = OpISub %uint %6804 %uint_2396745\n      %14878 = OpBitwiseOr %uint %19514 %11412\n      %18154 = OpShiftLeftLogical %uint %11412 %uint_1\n      %16010 = OpBitwiseOr %uint %14878 %18154\n       %8120 = OpShiftLeftLogical %uint %11412 %uint_2\n       %7810 = OpBitwiseOr %uint %16010 %8120\n               OpBranch %11722\n      %11722 = OpLabel\n      %17362 = OpPhi %uint %6254 %10642 %7810 %21925\n      %23056 = OpCompositeExtract %uint %16241 3\n      %12931 = OpCompositeExtract %uint %6585 2\n      %13107 = OpCompositeExtract %uint %6585 3\n      %20102 = OpULessThanEqual %bool %12931 %13107\n               OpSelectionMerge %11701 None\n               OpBranchConditional %20102 %10643 %21927\n      %10643 = OpLabel\n      %17660 = OpBitwiseAnd %uint %23056 %uint_4793490\n      %23951 = OpBitwiseAnd %uint %23056 %uint_9586980\n      %21847 = OpShiftRightLogical %uint %23951 %uint_1\n       %8136 = OpBitwiseAnd %uint %17660 %21847\n      %24612 = OpShiftLeftLogical %uint %8136 %uint_1\n      %22959 = OpShiftRightLogical %uint %8136 %uint_1\n      %18796 = OpBitwiseOr %uint %24612 %22959\n      %16052 = OpBitwiseOr %uint %8136 %18796\n      %18312 = OpBitwiseAnd %uint %23056 %uint_2396745\n      %14688 = OpBitwiseOr %uint %18312 %uint_14380470\n      %20406 = OpBitwiseAnd %uint %14688 %16052\n      %20542 = OpShiftRightLogical %uint %17660 %uint_1\n      %24925 = OpBitwiseOr %uint %18312 %20542\n      %21926 = OpShiftRightLogical %uint %23951 %uint_2\n      %22677 = OpBitwiseOr %uint %24925 %21926\n       %7727 = OpBitwiseXor %uint %22677 %uint_2396745\n       %9547 = OpNot %uint %20542\n      %14627 = OpBitwiseAnd %uint %18312 %9547\n       %8431 = OpNot %uint %21926\n      %11413 = OpBitwiseAnd %uint %14627 %8431\n       %6805 = OpBitwiseOr %uint %23056 %7727\n      %19515 = OpISub %uint %6805 %uint_2396745\n      %14879 = OpBitwiseOr %uint %19515 %11413\n      %18231 = OpShiftLeftLogical %uint %11413 %uint_2\n      %15357 = OpBitwiseOr %uint %14879 %18231\n      %12157 = OpNot %uint %16052\n      %18515 = OpBitwiseAnd %uint %15357 %12157\n       %6255 = OpBitwiseOr %uint %18515 %20406\n               OpBranch %11701\n      %21927 = OpLabel\n      %20082 = OpBitwiseAnd %uint %23056 %uint_2396745\n      %23913 = OpBitwiseAnd %uint %23056 %uint_4793490\n      %22250 = OpShiftRightLogical %uint %23913 %uint_1\n      %24003 = OpBitwiseOr %uint %20082 %22250\n      %19602 = OpBitwiseAnd %uint %23056 %uint_9586980\n      %20618 = OpShiftRightLogical %uint %19602 %uint_2\n      %24290 = OpBitwiseOr %uint %24003 %20618\n       %7728 = OpBitwiseXor %uint %24290 %uint_2396745\n       %9548 = OpNot %uint %22250\n      %14628 = OpBitwiseAnd %uint %20082 %9548\n       %8432 = OpNot %uint %20618\n      %11414 = OpBitwiseAnd %uint %14628 %8432\n       %6806 = OpBitwiseOr %uint %23056 %7728\n      %19516 = OpISub %uint %6806 %uint_2396745\n      %14880 = OpBitwiseOr %uint %19516 %11414\n      %18155 = OpShiftLeftLogical %uint %11414 %uint_1\n      %16011 = OpBitwiseOr %uint %14880 %18155\n       %8121 = OpShiftLeftLogical %uint %11414 %uint_2\n       %7811 = OpBitwiseOr %uint %16011 %8121\n               OpBranch %11701\n      %11701 = OpLabel\n      %19680 = OpPhi %uint %6255 %10643 %7811 %21927\n      %14852 = OpCompositeConstruct %v4uint %17360 %17361 %17362 %19680\n       %7112 = OpShiftRightLogical %uint %14582 %int_4\n               OpSelectionMerge %14881 None\n               OpBranchConditional %20099 %10644 %14526\n      %10644 = OpLabel\n      %17661 = OpBitwiseAnd %uint %17360 %uint_1170\n      %23952 = OpBitwiseAnd %uint %17360 %uint_2340\n      %21848 = OpShiftRightLogical %uint %23952 %uint_1\n       %8137 = OpBitwiseAnd %uint %17661 %21848\n      %24613 = OpShiftLeftLogical %uint %8137 %uint_1\n      %22960 = OpShiftRightLogical %uint %8137 %uint_1\n      %18812 = OpBitwiseOr %uint %24613 %22960\n      %15914 = OpBitwiseOr %uint %8137 %18812\n       %8459 = OpNot %uint %15914\n      %10082 = OpBitwiseAnd %uint %17360 %8459\n      %16300 = OpISub %uint %uint_2925 %10082\n      %17415 = OpBitwiseAnd %uint %16300 %8459\n      %16991 = OpBitwiseAnd %uint %17415 %uint_7\n      %13677 = OpIMul %uint %6502 %16991\n      %21975 = OpBitwiseAnd %uint %10082 %uint_7\n      %20390 = OpIMul %uint %13104 %21975\n      %19842 = OpIAdd %uint %13677 %20390\n      %13000 = OpUDiv %uint %19842 %uint_5\n      %23022 = OpShiftRightLogical %uint %17415 %uint_3\n       %8753 = OpBitwiseAnd %uint %23022 %uint_7\n      %15011 = OpIMul %uint %6502 %8753\n      %13283 = OpShiftRightLogical %uint %10082 %uint_3\n      %24957 = OpBitwiseAnd %uint %13283 %uint_7\n      %25194 = OpIMul %uint %13104 %24957\n      %19880 = OpIAdd %uint %15011 %25194\n      %12616 = OpUDiv %uint %19880 %uint_5\n       %8160 = OpShiftLeftLogical %uint %12616 %uint_8\n       %7553 = OpBitwiseOr %uint %13000 %8160\n      %21935 = OpShiftRightLogical %uint %17415 %uint_6\n      %17592 = OpBitwiseAnd %uint %21935 %uint_7\n      %15012 = OpIMul %uint %6502 %17592\n      %13284 = OpShiftRightLogical %uint %10082 %uint_6\n      %24958 = OpBitwiseAnd %uint %13284 %uint_7\n      %25195 = OpIMul %uint %13104 %24958\n      %19881 = OpIAdd %uint %15012 %25195\n      %12617 = OpUDiv %uint %19881 %uint_5\n       %8161 = OpShiftLeftLogical %uint %12617 %uint_16\n       %7554 = OpBitwiseOr %uint %7553 %8161\n      %21936 = OpShiftRightLogical %uint %17415 %uint_9\n      %17593 = OpBitwiseAnd %uint %21936 %uint_7\n      %15013 = OpIMul %uint %6502 %17593\n      %13285 = OpShiftRightLogical %uint %10082 %uint_9\n      %24959 = OpBitwiseAnd %uint %13285 %uint_7\n      %25196 = OpIMul %uint %13104 %24959\n      %19882 = OpIAdd %uint %15013 %25196\n      %12618 = OpUDiv %uint %19882 %uint_5\n       %8255 = OpShiftLeftLogical %uint %12618 %uint_24\n       %6688 = OpBitwiseOr %uint %7554 %8255\n      %20385 = OpBitwiseAnd %uint %17360 %15914\n      %17408 = OpBitwiseAnd %uint %20385 %uint_1\n      %19559 = OpBitwiseAnd %uint %20385 %uint_8\n      %24932 = OpShiftLeftLogical %uint %19559 %uint_5\n      %17083 = OpBitwiseOr %uint %17408 %24932\n      %20866 = OpBitwiseAnd %uint %20385 %uint_64\n      %23319 = OpShiftLeftLogical %uint %20866 %uint_10\n      %17084 = OpBitwiseOr %uint %17083 %23319\n      %20867 = OpBitwiseAnd %uint %20385 %uint_512\n      %22046 = OpShiftLeftLogical %uint %20867 %uint_15\n       %8311 = OpBitwiseOr %uint %17084 %22046\n      %10419 = OpIMul %uint %8311 %uint_255\n      %18432 = OpIAdd %uint %6688 %10419\n               OpBranch %14881\n      %14526 = OpLabel\n      %10708 = OpNot %uint %17360\n      %15358 = OpBitwiseAnd %uint %10708 %uint_7\n      %17712 = OpIMul %uint %6502 %15358\n      %21976 = OpBitwiseAnd %uint %17360 %uint_7\n      %20391 = OpIMul %uint %13104 %21976\n      %19843 = OpIAdd %uint %17712 %20391\n      %13001 = OpUDiv %uint %19843 %uint_7\n      %23023 = OpShiftRightLogical %uint %10708 %uint_3\n       %8754 = OpBitwiseAnd %uint %23023 %uint_7\n      %15014 = OpIMul %uint %6502 %8754\n      %13286 = OpShiftRightLogical %uint %17360 %uint_3\n      %24960 = OpBitwiseAnd %uint %13286 %uint_7\n      %25197 = OpIMul %uint %13104 %24960\n      %19883 = OpIAdd %uint %15014 %25197\n      %12619 = OpUDiv %uint %19883 %uint_7\n       %8162 = OpShiftLeftLogical %uint %12619 %uint_8\n       %7555 = OpBitwiseOr %uint %13001 %8162\n      %21937 = OpShiftRightLogical %uint %10708 %uint_6\n      %17594 = OpBitwiseAnd %uint %21937 %uint_7\n      %15015 = OpIMul %uint %6502 %17594\n      %13287 = OpShiftRightLogical %uint %17360 %uint_6\n      %24961 = OpBitwiseAnd %uint %13287 %uint_7\n      %25198 = OpIMul %uint %13104 %24961\n      %19884 = OpIAdd %uint %15015 %25198\n      %12620 = OpUDiv %uint %19884 %uint_7\n       %8163 = OpShiftLeftLogical %uint %12620 %uint_16\n       %7556 = OpBitwiseOr %uint %7555 %8163\n      %21938 = OpShiftRightLogical %uint %10708 %uint_9\n      %17595 = OpBitwiseAnd %uint %21938 %uint_7\n      %15016 = OpIMul %uint %6502 %17595\n      %13288 = OpShiftRightLogical %uint %17360 %uint_9\n      %24962 = OpBitwiseAnd %uint %13288 %uint_7\n      %25199 = OpIMul %uint %13104 %24962\n      %19885 = OpIAdd %uint %15016 %25199\n      %12621 = OpUDiv %uint %19885 %uint_7\n       %9205 = OpShiftLeftLogical %uint %12621 %uint_24\n      %18040 = OpBitwiseOr %uint %7556 %9205\n               OpBranch %14881\n      %14881 = OpLabel\n      %10926 = OpPhi %uint %18432 %10644 %18040 %14526\n               OpSelectionMerge %14882 None\n               OpBranchConditional %20100 %10645 %14527\n      %10645 = OpLabel\n      %17662 = OpBitwiseAnd %uint %17361 %uint_1170\n      %23953 = OpBitwiseAnd %uint %17361 %uint_2340\n      %21849 = OpShiftRightLogical %uint %23953 %uint_1\n       %8138 = OpBitwiseAnd %uint %17662 %21849\n      %24614 = OpShiftLeftLogical %uint %8138 %uint_1\n      %22961 = OpShiftRightLogical %uint %8138 %uint_1\n      %18813 = OpBitwiseOr %uint %24614 %22961\n      %15915 = OpBitwiseOr %uint %8138 %18813\n       %8460 = OpNot %uint %15915\n      %10083 = OpBitwiseAnd %uint %17361 %8460\n      %16301 = OpISub %uint %uint_2925 %10083\n      %17416 = OpBitwiseAnd %uint %16301 %8460\n      %16992 = OpBitwiseAnd %uint %17416 %uint_7\n      %13678 = OpIMul %uint %12929 %16992\n      %21977 = OpBitwiseAnd %uint %10083 %uint_7\n      %20392 = OpIMul %uint %13105 %21977\n      %19844 = OpIAdd %uint %13678 %20392\n      %13002 = OpUDiv %uint %19844 %uint_5\n      %23024 = OpShiftRightLogical %uint %17416 %uint_3\n       %8755 = OpBitwiseAnd %uint %23024 %uint_7\n      %15017 = OpIMul %uint %12929 %8755\n      %13289 = OpShiftRightLogical %uint %10083 %uint_3\n      %24963 = OpBitwiseAnd %uint %13289 %uint_7\n      %25200 = OpIMul %uint %13105 %24963\n      %19886 = OpIAdd %uint %15017 %25200\n      %12622 = OpUDiv %uint %19886 %uint_5\n       %8164 = OpShiftLeftLogical %uint %12622 %uint_8\n       %7557 = OpBitwiseOr %uint %13002 %8164\n      %21939 = OpShiftRightLogical %uint %17416 %uint_6\n      %17596 = OpBitwiseAnd %uint %21939 %uint_7\n      %15018 = OpIMul %uint %12929 %17596\n      %13290 = OpShiftRightLogical %uint %10083 %uint_6\n      %24964 = OpBitwiseAnd %uint %13290 %uint_7\n      %25201 = OpIMul %uint %13105 %24964\n      %19887 = OpIAdd %uint %15018 %25201\n      %12623 = OpUDiv %uint %19887 %uint_5\n       %8165 = OpShiftLeftLogical %uint %12623 %uint_16\n       %7558 = OpBitwiseOr %uint %7557 %8165\n      %21940 = OpShiftRightLogical %uint %17416 %uint_9\n      %17597 = OpBitwiseAnd %uint %21940 %uint_7\n      %15019 = OpIMul %uint %12929 %17597\n      %13291 = OpShiftRightLogical %uint %10083 %uint_9\n      %24965 = OpBitwiseAnd %uint %13291 %uint_7\n      %25202 = OpIMul %uint %13105 %24965\n      %19888 = OpIAdd %uint %15019 %25202\n      %12624 = OpUDiv %uint %19888 %uint_5\n       %8256 = OpShiftLeftLogical %uint %12624 %uint_24\n       %6689 = OpBitwiseOr %uint %7558 %8256\n      %20386 = OpBitwiseAnd %uint %17361 %15915\n      %17409 = OpBitwiseAnd %uint %20386 %uint_1\n      %19560 = OpBitwiseAnd %uint %20386 %uint_8\n      %24933 = OpShiftLeftLogical %uint %19560 %uint_5\n      %17085 = OpBitwiseOr %uint %17409 %24933\n      %20868 = OpBitwiseAnd %uint %20386 %uint_64\n      %23320 = OpShiftLeftLogical %uint %20868 %uint_10\n      %17086 = OpBitwiseOr %uint %17085 %23320\n      %20869 = OpBitwiseAnd %uint %20386 %uint_512\n      %22047 = OpShiftLeftLogical %uint %20869 %uint_15\n       %8312 = OpBitwiseOr %uint %17086 %22047\n      %10420 = OpIMul %uint %8312 %uint_255\n      %18433 = OpIAdd %uint %6689 %10420\n               OpBranch %14882\n      %14527 = OpLabel\n      %10709 = OpNot %uint %17361\n      %15359 = OpBitwiseAnd %uint %10709 %uint_7\n      %17713 = OpIMul %uint %12929 %15359\n      %21978 = OpBitwiseAnd %uint %17361 %uint_7\n      %20393 = OpIMul %uint %13105 %21978\n      %19845 = OpIAdd %uint %17713 %20393\n      %13003 = OpUDiv %uint %19845 %uint_7\n      %23025 = OpShiftRightLogical %uint %10709 %uint_3\n       %8756 = OpBitwiseAnd %uint %23025 %uint_7\n      %15020 = OpIMul %uint %12929 %8756\n      %13292 = OpShiftRightLogical %uint %17361 %uint_3\n      %24966 = OpBitwiseAnd %uint %13292 %uint_7\n      %25203 = OpIMul %uint %13105 %24966\n      %19889 = OpIAdd %uint %15020 %25203\n      %12625 = OpUDiv %uint %19889 %uint_7\n       %8166 = OpShiftLeftLogical %uint %12625 %uint_8\n       %7559 = OpBitwiseOr %uint %13003 %8166\n      %21941 = OpShiftRightLogical %uint %10709 %uint_6\n      %17599 = OpBitwiseAnd %uint %21941 %uint_7\n      %15021 = OpIMul %uint %12929 %17599\n      %13293 = OpShiftRightLogical %uint %17361 %uint_6\n      %24967 = OpBitwiseAnd %uint %13293 %uint_7\n      %25204 = OpIMul %uint %13105 %24967\n      %19890 = OpIAdd %uint %15021 %25204\n      %12626 = OpUDiv %uint %19890 %uint_7\n       %8167 = OpShiftLeftLogical %uint %12626 %uint_16\n       %7560 = OpBitwiseOr %uint %7559 %8167\n      %21942 = OpShiftRightLogical %uint %10709 %uint_9\n      %17600 = OpBitwiseAnd %uint %21942 %uint_7\n      %15022 = OpIMul %uint %12929 %17600\n      %13294 = OpShiftRightLogical %uint %17361 %uint_9\n      %24968 = OpBitwiseAnd %uint %13294 %uint_7\n      %25205 = OpIMul %uint %13105 %24968\n      %19891 = OpIAdd %uint %15022 %25205\n      %12627 = OpUDiv %uint %19891 %uint_7\n       %9206 = OpShiftLeftLogical %uint %12627 %uint_24\n      %18041 = OpBitwiseOr %uint %7560 %9206\n               OpBranch %14882\n      %14882 = OpLabel\n      %10927 = OpPhi %uint %18433 %10645 %18041 %14527\n               OpSelectionMerge %14883 None\n               OpBranchConditional %20101 %10646 %14528\n      %10646 = OpLabel\n      %17663 = OpBitwiseAnd %uint %17362 %uint_1170\n      %23954 = OpBitwiseAnd %uint %17362 %uint_2340\n      %21850 = OpShiftRightLogical %uint %23954 %uint_1\n       %8139 = OpBitwiseAnd %uint %17663 %21850\n      %24615 = OpShiftLeftLogical %uint %8139 %uint_1\n      %22962 = OpShiftRightLogical %uint %8139 %uint_1\n      %18814 = OpBitwiseOr %uint %24615 %22962\n      %15916 = OpBitwiseOr %uint %8139 %18814\n       %8461 = OpNot %uint %15916\n      %10084 = OpBitwiseAnd %uint %17362 %8461\n      %16302 = OpISub %uint %uint_2925 %10084\n      %17417 = OpBitwiseAnd %uint %16302 %8461\n      %16993 = OpBitwiseAnd %uint %17417 %uint_7\n      %13679 = OpIMul %uint %12930 %16993\n      %21979 = OpBitwiseAnd %uint %10084 %uint_7\n      %20394 = OpIMul %uint %13106 %21979\n      %19846 = OpIAdd %uint %13679 %20394\n      %13004 = OpUDiv %uint %19846 %uint_5\n      %23026 = OpShiftRightLogical %uint %17417 %uint_3\n       %8757 = OpBitwiseAnd %uint %23026 %uint_7\n      %15023 = OpIMul %uint %12930 %8757\n      %13295 = OpShiftRightLogical %uint %10084 %uint_3\n      %24969 = OpBitwiseAnd %uint %13295 %uint_7\n      %25206 = OpIMul %uint %13106 %24969\n      %19892 = OpIAdd %uint %15023 %25206\n      %12628 = OpUDiv %uint %19892 %uint_5\n       %8168 = OpShiftLeftLogical %uint %12628 %uint_8\n       %7561 = OpBitwiseOr %uint %13004 %8168\n      %21943 = OpShiftRightLogical %uint %17417 %uint_6\n      %17601 = OpBitwiseAnd %uint %21943 %uint_7\n      %15024 = OpIMul %uint %12930 %17601\n      %13296 = OpShiftRightLogical %uint %10084 %uint_6\n      %24970 = OpBitwiseAnd %uint %13296 %uint_7\n      %25207 = OpIMul %uint %13106 %24970\n      %19893 = OpIAdd %uint %15024 %25207\n      %12629 = OpUDiv %uint %19893 %uint_5\n       %8169 = OpShiftLeftLogical %uint %12629 %uint_16\n       %7562 = OpBitwiseOr %uint %7561 %8169\n      %21944 = OpShiftRightLogical %uint %17417 %uint_9\n      %17602 = OpBitwiseAnd %uint %21944 %uint_7\n      %15025 = OpIMul %uint %12930 %17602\n      %13297 = OpShiftRightLogical %uint %10084 %uint_9\n      %24971 = OpBitwiseAnd %uint %13297 %uint_7\n      %25208 = OpIMul %uint %13106 %24971\n      %19894 = OpIAdd %uint %15025 %25208\n      %12630 = OpUDiv %uint %19894 %uint_5\n       %8257 = OpShiftLeftLogical %uint %12630 %uint_24\n       %6690 = OpBitwiseOr %uint %7562 %8257\n      %20387 = OpBitwiseAnd %uint %17362 %15916\n      %17410 = OpBitwiseAnd %uint %20387 %uint_1\n      %19561 = OpBitwiseAnd %uint %20387 %uint_8\n      %24934 = OpShiftLeftLogical %uint %19561 %uint_5\n      %17087 = OpBitwiseOr %uint %17410 %24934\n      %20870 = OpBitwiseAnd %uint %20387 %uint_64\n      %23321 = OpShiftLeftLogical %uint %20870 %uint_10\n      %17088 = OpBitwiseOr %uint %17087 %23321\n      %20871 = OpBitwiseAnd %uint %20387 %uint_512\n      %22048 = OpShiftLeftLogical %uint %20871 %uint_15\n       %8313 = OpBitwiseOr %uint %17088 %22048\n      %10421 = OpIMul %uint %8313 %uint_255\n      %18434 = OpIAdd %uint %6690 %10421\n               OpBranch %14883\n      %14528 = OpLabel\n      %10710 = OpNot %uint %17362\n      %15360 = OpBitwiseAnd %uint %10710 %uint_7\n      %17714 = OpIMul %uint %12930 %15360\n      %21980 = OpBitwiseAnd %uint %17362 %uint_7\n      %20395 = OpIMul %uint %13106 %21980\n      %19847 = OpIAdd %uint %17714 %20395\n      %13005 = OpUDiv %uint %19847 %uint_7\n      %23027 = OpShiftRightLogical %uint %10710 %uint_3\n       %8758 = OpBitwiseAnd %uint %23027 %uint_7\n      %15026 = OpIMul %uint %12930 %8758\n      %13298 = OpShiftRightLogical %uint %17362 %uint_3\n      %24972 = OpBitwiseAnd %uint %13298 %uint_7\n      %25209 = OpIMul %uint %13106 %24972\n      %19895 = OpIAdd %uint %15026 %25209\n      %12631 = OpUDiv %uint %19895 %uint_7\n       %8170 = OpShiftLeftLogical %uint %12631 %uint_8\n       %7563 = OpBitwiseOr %uint %13005 %8170\n      %21945 = OpShiftRightLogical %uint %10710 %uint_6\n      %17603 = OpBitwiseAnd %uint %21945 %uint_7\n      %15027 = OpIMul %uint %12930 %17603\n      %13299 = OpShiftRightLogical %uint %17362 %uint_6\n      %24973 = OpBitwiseAnd %uint %13299 %uint_7\n      %25210 = OpIMul %uint %13106 %24973\n      %19896 = OpIAdd %uint %15027 %25210\n      %12632 = OpUDiv %uint %19896 %uint_7\n       %8171 = OpShiftLeftLogical %uint %12632 %uint_16\n       %7564 = OpBitwiseOr %uint %7563 %8171\n      %21946 = OpShiftRightLogical %uint %10710 %uint_9\n      %17604 = OpBitwiseAnd %uint %21946 %uint_7\n      %15028 = OpIMul %uint %12930 %17604\n      %13300 = OpShiftRightLogical %uint %17362 %uint_9\n      %24974 = OpBitwiseAnd %uint %13300 %uint_7\n      %25211 = OpIMul %uint %13106 %24974\n      %19897 = OpIAdd %uint %15028 %25211\n      %12633 = OpUDiv %uint %19897 %uint_7\n       %9207 = OpShiftLeftLogical %uint %12633 %uint_24\n      %18042 = OpBitwiseOr %uint %7564 %9207\n               OpBranch %14883\n      %14883 = OpLabel\n      %10928 = OpPhi %uint %18434 %10646 %18042 %14528\n               OpSelectionMerge %11702 None\n               OpBranchConditional %20102 %10647 %14529\n      %10647 = OpLabel\n      %17664 = OpBitwiseAnd %uint %19680 %uint_1170\n      %23955 = OpBitwiseAnd %uint %19680 %uint_2340\n      %21851 = OpShiftRightLogical %uint %23955 %uint_1\n       %8140 = OpBitwiseAnd %uint %17664 %21851\n      %24616 = OpShiftLeftLogical %uint %8140 %uint_1\n      %22963 = OpShiftRightLogical %uint %8140 %uint_1\n      %18815 = OpBitwiseOr %uint %24616 %22963\n      %15917 = OpBitwiseOr %uint %8140 %18815\n       %8462 = OpNot %uint %15917\n      %10085 = OpBitwiseAnd %uint %19680 %8462\n      %16303 = OpISub %uint %uint_2925 %10085\n      %17418 = OpBitwiseAnd %uint %16303 %8462\n      %16994 = OpBitwiseAnd %uint %17418 %uint_7\n      %13680 = OpIMul %uint %12931 %16994\n      %21981 = OpBitwiseAnd %uint %10085 %uint_7\n      %20396 = OpIMul %uint %13107 %21981\n      %19848 = OpIAdd %uint %13680 %20396\n      %13006 = OpUDiv %uint %19848 %uint_5\n      %23028 = OpShiftRightLogical %uint %17418 %uint_3\n       %8759 = OpBitwiseAnd %uint %23028 %uint_7\n      %15029 = OpIMul %uint %12931 %8759\n      %13301 = OpShiftRightLogical %uint %10085 %uint_3\n      %24975 = OpBitwiseAnd %uint %13301 %uint_7\n      %25212 = OpIMul %uint %13107 %24975\n      %19898 = OpIAdd %uint %15029 %25212\n      %12634 = OpUDiv %uint %19898 %uint_5\n       %8172 = OpShiftLeftLogical %uint %12634 %uint_8\n       %7565 = OpBitwiseOr %uint %13006 %8172\n      %21947 = OpShiftRightLogical %uint %17418 %uint_6\n      %17605 = OpBitwiseAnd %uint %21947 %uint_7\n      %15030 = OpIMul %uint %12931 %17605\n      %13302 = OpShiftRightLogical %uint %10085 %uint_6\n      %24976 = OpBitwiseAnd %uint %13302 %uint_7\n      %25213 = OpIMul %uint %13107 %24976\n      %19899 = OpIAdd %uint %15030 %25213\n      %12635 = OpUDiv %uint %19899 %uint_5\n       %8173 = OpShiftLeftLogical %uint %12635 %uint_16\n       %7566 = OpBitwiseOr %uint %7565 %8173\n      %21948 = OpShiftRightLogical %uint %17418 %uint_9\n      %17606 = OpBitwiseAnd %uint %21948 %uint_7\n      %15031 = OpIMul %uint %12931 %17606\n      %13303 = OpShiftRightLogical %uint %10085 %uint_9\n      %24977 = OpBitwiseAnd %uint %13303 %uint_7\n      %25214 = OpIMul %uint %13107 %24977\n      %19900 = OpIAdd %uint %15031 %25214\n      %12636 = OpUDiv %uint %19900 %uint_5\n       %8259 = OpShiftLeftLogical %uint %12636 %uint_24\n       %6691 = OpBitwiseOr %uint %7566 %8259\n      %20388 = OpBitwiseAnd %uint %19680 %15917\n      %17411 = OpBitwiseAnd %uint %20388 %uint_1\n      %19562 = OpBitwiseAnd %uint %20388 %uint_8\n      %24935 = OpShiftLeftLogical %uint %19562 %uint_5\n      %17089 = OpBitwiseOr %uint %17411 %24935\n      %20872 = OpBitwiseAnd %uint %20388 %uint_64\n      %23322 = OpShiftLeftLogical %uint %20872 %uint_10\n      %17090 = OpBitwiseOr %uint %17089 %23322\n      %20873 = OpBitwiseAnd %uint %20388 %uint_512\n      %22049 = OpShiftLeftLogical %uint %20873 %uint_15\n       %8314 = OpBitwiseOr %uint %17090 %22049\n      %10422 = OpIMul %uint %8314 %uint_255\n      %18435 = OpIAdd %uint %6691 %10422\n               OpBranch %11702\n      %14529 = OpLabel\n      %10711 = OpNot %uint %19680\n      %15361 = OpBitwiseAnd %uint %10711 %uint_7\n      %17715 = OpIMul %uint %12931 %15361\n      %21982 = OpBitwiseAnd %uint %19680 %uint_7\n      %20397 = OpIMul %uint %13107 %21982\n      %19849 = OpIAdd %uint %17715 %20397\n      %13007 = OpUDiv %uint %19849 %uint_7\n      %23029 = OpShiftRightLogical %uint %10711 %uint_3\n       %8760 = OpBitwiseAnd %uint %23029 %uint_7\n      %15032 = OpIMul %uint %12931 %8760\n      %13304 = OpShiftRightLogical %uint %19680 %uint_3\n      %24978 = OpBitwiseAnd %uint %13304 %uint_7\n      %25215 = OpIMul %uint %13107 %24978\n      %19901 = OpIAdd %uint %15032 %25215\n      %12637 = OpUDiv %uint %19901 %uint_7\n       %8174 = OpShiftLeftLogical %uint %12637 %uint_8\n       %7567 = OpBitwiseOr %uint %13007 %8174\n      %21949 = OpShiftRightLogical %uint %10711 %uint_6\n      %17607 = OpBitwiseAnd %uint %21949 %uint_7\n      %15033 = OpIMul %uint %12931 %17607\n      %13305 = OpShiftRightLogical %uint %19680 %uint_6\n      %24979 = OpBitwiseAnd %uint %13305 %uint_7\n      %25216 = OpIMul %uint %13107 %24979\n      %19902 = OpIAdd %uint %15033 %25216\n      %12638 = OpUDiv %uint %19902 %uint_7\n       %8175 = OpShiftLeftLogical %uint %12638 %uint_16\n       %7568 = OpBitwiseOr %uint %7567 %8175\n      %21950 = OpShiftRightLogical %uint %10711 %uint_9\n      %17608 = OpBitwiseAnd %uint %21950 %uint_7\n      %15034 = OpIMul %uint %12931 %17608\n      %13306 = OpShiftRightLogical %uint %19680 %uint_9\n      %24980 = OpBitwiseAnd %uint %13306 %uint_7\n      %25217 = OpIMul %uint %13107 %24980\n      %19903 = OpIAdd %uint %15034 %25217\n      %12639 = OpUDiv %uint %19903 %uint_7\n       %9208 = OpShiftLeftLogical %uint %12639 %uint_24\n      %18043 = OpBitwiseOr %uint %7568 %9208\n               OpBranch %11702\n      %11702 = OpLabel\n      %17229 = OpPhi %uint %18435 %10647 %18043 %14529\n      %14583 = OpCompositeConstruct %v4uint %10926 %10927 %10928 %17229\n      %12213 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %7112\n               OpStore %12213 %14583\n      %12832 = OpCompositeExtract %uint %17344 1\n      %23232 = OpIAdd %uint %12832 %int_1\n      %17425 = OpULessThan %bool %23232 %6594\n               OpSelectionMerge %7207 DontFlatten\n               OpBranchConditional %17425 %22828 %7207\n      %22828 = OpLabel\n      %15481 = OpIAdd %uint %14582 %22412\n      %12023 = OpShiftRightLogical %v4uint %14852 %533\n      %23030 = OpShiftRightLogical %uint %15481 %int_4\n      %19251 = OpCompositeExtract %uint %12023 0\n               OpSelectionMerge %11723 None\n               OpBranchConditional %20099 %10648 %14530\n      %10648 = OpLabel\n      %17665 = OpBitwiseAnd %uint %19251 %uint_1170\n      %23956 = OpBitwiseAnd %uint %19251 %uint_2340\n      %21852 = OpShiftRightLogical %uint %23956 %uint_1\n       %8141 = OpBitwiseAnd %uint %17665 %21852\n      %24617 = OpShiftLeftLogical %uint %8141 %uint_1\n      %22964 = OpShiftRightLogical %uint %8141 %uint_1\n      %18816 = OpBitwiseOr %uint %24617 %22964\n      %15918 = OpBitwiseOr %uint %8141 %18816\n       %8463 = OpNot %uint %15918\n      %10086 = OpBitwiseAnd %uint %19251 %8463\n      %16304 = OpISub %uint %uint_2925 %10086\n      %17419 = OpBitwiseAnd %uint %16304 %8463\n      %16995 = OpBitwiseAnd %uint %17419 %uint_7\n      %13681 = OpIMul %uint %6502 %16995\n      %21983 = OpBitwiseAnd %uint %10086 %uint_7\n      %20400 = OpIMul %uint %13104 %21983\n      %19850 = OpIAdd %uint %13681 %20400\n      %13008 = OpUDiv %uint %19850 %uint_5\n      %23031 = OpShiftRightLogical %uint %17419 %uint_3\n       %8761 = OpBitwiseAnd %uint %23031 %uint_7\n      %15035 = OpIMul %uint %6502 %8761\n      %13307 = OpShiftRightLogical %uint %10086 %uint_3\n      %24981 = OpBitwiseAnd %uint %13307 %uint_7\n      %25218 = OpIMul %uint %13104 %24981\n      %19904 = OpIAdd %uint %15035 %25218\n      %12640 = OpUDiv %uint %19904 %uint_5\n       %8176 = OpShiftLeftLogical %uint %12640 %uint_8\n       %7569 = OpBitwiseOr %uint %13008 %8176\n      %21951 = OpShiftRightLogical %uint %17419 %uint_6\n      %17609 = OpBitwiseAnd %uint %21951 %uint_7\n      %15036 = OpIMul %uint %6502 %17609\n      %13308 = OpShiftRightLogical %uint %10086 %uint_6\n      %24982 = OpBitwiseAnd %uint %13308 %uint_7\n      %25219 = OpIMul %uint %13104 %24982\n      %19905 = OpIAdd %uint %15036 %25219\n      %12641 = OpUDiv %uint %19905 %uint_5\n       %8177 = OpShiftLeftLogical %uint %12641 %uint_16\n       %7570 = OpBitwiseOr %uint %7569 %8177\n      %21952 = OpShiftRightLogical %uint %17419 %uint_9\n      %17610 = OpBitwiseAnd %uint %21952 %uint_7\n      %15037 = OpIMul %uint %6502 %17610\n      %13309 = OpShiftRightLogical %uint %10086 %uint_9\n      %24983 = OpBitwiseAnd %uint %13309 %uint_7\n      %25220 = OpIMul %uint %13104 %24983\n      %19906 = OpIAdd %uint %15037 %25220\n      %12642 = OpUDiv %uint %19906 %uint_5\n       %8260 = OpShiftLeftLogical %uint %12642 %uint_24\n       %6692 = OpBitwiseOr %uint %7570 %8260\n      %20389 = OpBitwiseAnd %uint %19251 %15918\n      %17412 = OpBitwiseAnd %uint %20389 %uint_1\n      %19563 = OpBitwiseAnd %uint %20389 %uint_8\n      %24936 = OpShiftLeftLogical %uint %19563 %uint_5\n      %17091 = OpBitwiseOr %uint %17412 %24936\n      %20874 = OpBitwiseAnd %uint %20389 %uint_64\n      %23323 = OpShiftLeftLogical %uint %20874 %uint_10\n      %17092 = OpBitwiseOr %uint %17091 %23323\n      %20875 = OpBitwiseAnd %uint %20389 %uint_512\n      %22050 = OpShiftLeftLogical %uint %20875 %uint_15\n       %8315 = OpBitwiseOr %uint %17092 %22050\n      %10423 = OpIMul %uint %8315 %uint_255\n      %18436 = OpIAdd %uint %6692 %10423\n               OpBranch %11723\n      %14530 = OpLabel\n      %10712 = OpNot %uint %19251\n      %15362 = OpBitwiseAnd %uint %10712 %uint_7\n      %17716 = OpIMul %uint %6502 %15362\n      %21984 = OpBitwiseAnd %uint %19251 %uint_7\n      %20401 = OpIMul %uint %13104 %21984\n      %19851 = OpIAdd %uint %17716 %20401\n      %13009 = OpUDiv %uint %19851 %uint_7\n      %23032 = OpShiftRightLogical %uint %10712 %uint_3\n       %8762 = OpBitwiseAnd %uint %23032 %uint_7\n      %15038 = OpIMul %uint %6502 %8762\n      %13310 = OpShiftRightLogical %uint %19251 %uint_3\n      %24984 = OpBitwiseAnd %uint %13310 %uint_7\n      %25221 = OpIMul %uint %13104 %24984\n      %19907 = OpIAdd %uint %15038 %25221\n      %12643 = OpUDiv %uint %19907 %uint_7\n       %8178 = OpShiftLeftLogical %uint %12643 %uint_8\n       %7571 = OpBitwiseOr %uint %13009 %8178\n      %21953 = OpShiftRightLogical %uint %10712 %uint_6\n      %17611 = OpBitwiseAnd %uint %21953 %uint_7\n      %15039 = OpIMul %uint %6502 %17611\n      %13311 = OpShiftRightLogical %uint %19251 %uint_6\n      %24985 = OpBitwiseAnd %uint %13311 %uint_7\n      %25222 = OpIMul %uint %13104 %24985\n      %19908 = OpIAdd %uint %15039 %25222\n      %12644 = OpUDiv %uint %19908 %uint_7\n       %8179 = OpShiftLeftLogical %uint %12644 %uint_16\n       %7572 = OpBitwiseOr %uint %7571 %8179\n      %21954 = OpShiftRightLogical %uint %10712 %uint_9\n      %17612 = OpBitwiseAnd %uint %21954 %uint_7\n      %15040 = OpIMul %uint %6502 %17612\n      %13312 = OpShiftRightLogical %uint %19251 %uint_9\n      %24986 = OpBitwiseAnd %uint %13312 %uint_7\n      %25223 = OpIMul %uint %13104 %24986\n      %19909 = OpIAdd %uint %15040 %25223\n      %12645 = OpUDiv %uint %19909 %uint_7\n       %9209 = OpShiftLeftLogical %uint %12645 %uint_24\n      %18044 = OpBitwiseOr %uint %7572 %9209\n               OpBranch %11723\n      %11723 = OpLabel\n      %20514 = OpPhi %uint %18436 %10648 %18044 %14530\n      %16618 = OpCompositeExtract %uint %12023 1\n               OpSelectionMerge %11724 None\n               OpBranchConditional %20100 %10649 %14531\n      %10649 = OpLabel\n      %17666 = OpBitwiseAnd %uint %16618 %uint_1170\n      %23957 = OpBitwiseAnd %uint %16618 %uint_2340\n      %21853 = OpShiftRightLogical %uint %23957 %uint_1\n       %8142 = OpBitwiseAnd %uint %17666 %21853\n      %24618 = OpShiftLeftLogical %uint %8142 %uint_1\n      %22965 = OpShiftRightLogical %uint %8142 %uint_1\n      %18817 = OpBitwiseOr %uint %24618 %22965\n      %15919 = OpBitwiseOr %uint %8142 %18817\n       %8464 = OpNot %uint %15919\n      %10087 = OpBitwiseAnd %uint %16618 %8464\n      %16305 = OpISub %uint %uint_2925 %10087\n      %17420 = OpBitwiseAnd %uint %16305 %8464\n      %16996 = OpBitwiseAnd %uint %17420 %uint_7\n      %13682 = OpIMul %uint %12929 %16996\n      %21985 = OpBitwiseAnd %uint %10087 %uint_7\n      %20402 = OpIMul %uint %13105 %21985\n      %19852 = OpIAdd %uint %13682 %20402\n      %13010 = OpUDiv %uint %19852 %uint_5\n      %23033 = OpShiftRightLogical %uint %17420 %uint_3\n       %8763 = OpBitwiseAnd %uint %23033 %uint_7\n      %15041 = OpIMul %uint %12929 %8763\n      %13313 = OpShiftRightLogical %uint %10087 %uint_3\n      %24987 = OpBitwiseAnd %uint %13313 %uint_7\n      %25224 = OpIMul %uint %13105 %24987\n      %19910 = OpIAdd %uint %15041 %25224\n      %12646 = OpUDiv %uint %19910 %uint_5\n       %8180 = OpShiftLeftLogical %uint %12646 %uint_8\n       %7573 = OpBitwiseOr %uint %13010 %8180\n      %21955 = OpShiftRightLogical %uint %17420 %uint_6\n      %17613 = OpBitwiseAnd %uint %21955 %uint_7\n      %15042 = OpIMul %uint %12929 %17613\n      %13314 = OpShiftRightLogical %uint %10087 %uint_6\n      %24988 = OpBitwiseAnd %uint %13314 %uint_7\n      %25225 = OpIMul %uint %13105 %24988\n      %19911 = OpIAdd %uint %15042 %25225\n      %12647 = OpUDiv %uint %19911 %uint_5\n       %8181 = OpShiftLeftLogical %uint %12647 %uint_16\n       %7574 = OpBitwiseOr %uint %7573 %8181\n      %21956 = OpShiftRightLogical %uint %17420 %uint_9\n      %17614 = OpBitwiseAnd %uint %21956 %uint_7\n      %15043 = OpIMul %uint %12929 %17614\n      %13315 = OpShiftRightLogical %uint %10087 %uint_9\n      %24989 = OpBitwiseAnd %uint %13315 %uint_7\n      %25226 = OpIMul %uint %13105 %24989\n      %19912 = OpIAdd %uint %15043 %25226\n      %12648 = OpUDiv %uint %19912 %uint_5\n       %8261 = OpShiftLeftLogical %uint %12648 %uint_24\n       %6693 = OpBitwiseOr %uint %7574 %8261\n      %20407 = OpBitwiseAnd %uint %16618 %15919\n      %17413 = OpBitwiseAnd %uint %20407 %uint_1\n      %19564 = OpBitwiseAnd %uint %20407 %uint_8\n      %24937 = OpShiftLeftLogical %uint %19564 %uint_5\n      %17093 = OpBitwiseOr %uint %17413 %24937\n      %20876 = OpBitwiseAnd %uint %20407 %uint_64\n      %23324 = OpShiftLeftLogical %uint %20876 %uint_10\n      %17094 = OpBitwiseOr %uint %17093 %23324\n      %20877 = OpBitwiseAnd %uint %20407 %uint_512\n      %22051 = OpShiftLeftLogical %uint %20877 %uint_15\n       %8316 = OpBitwiseOr %uint %17094 %22051\n      %10424 = OpIMul %uint %8316 %uint_255\n      %18437 = OpIAdd %uint %6693 %10424\n               OpBranch %11724\n      %14531 = OpLabel\n      %10713 = OpNot %uint %16618\n      %15363 = OpBitwiseAnd %uint %10713 %uint_7\n      %17717 = OpIMul %uint %12929 %15363\n      %21986 = OpBitwiseAnd %uint %16618 %uint_7\n      %20408 = OpIMul %uint %13105 %21986\n      %19854 = OpIAdd %uint %17717 %20408\n      %13011 = OpUDiv %uint %19854 %uint_7\n      %23034 = OpShiftRightLogical %uint %10713 %uint_3\n       %8764 = OpBitwiseAnd %uint %23034 %uint_7\n      %15044 = OpIMul %uint %12929 %8764\n      %13316 = OpShiftRightLogical %uint %16618 %uint_3\n      %24990 = OpBitwiseAnd %uint %13316 %uint_7\n      %25227 = OpIMul %uint %13105 %24990\n      %19913 = OpIAdd %uint %15044 %25227\n      %12649 = OpUDiv %uint %19913 %uint_7\n       %8182 = OpShiftLeftLogical %uint %12649 %uint_8\n       %7575 = OpBitwiseOr %uint %13011 %8182\n      %21957 = OpShiftRightLogical %uint %10713 %uint_6\n      %17615 = OpBitwiseAnd %uint %21957 %uint_7\n      %15045 = OpIMul %uint %12929 %17615\n      %13317 = OpShiftRightLogical %uint %16618 %uint_6\n      %24991 = OpBitwiseAnd %uint %13317 %uint_7\n      %25228 = OpIMul %uint %13105 %24991\n      %19914 = OpIAdd %uint %15045 %25228\n      %12650 = OpUDiv %uint %19914 %uint_7\n       %8183 = OpShiftLeftLogical %uint %12650 %uint_16\n       %7576 = OpBitwiseOr %uint %7575 %8183\n      %21958 = OpShiftRightLogical %uint %10713 %uint_9\n      %17616 = OpBitwiseAnd %uint %21958 %uint_7\n      %15046 = OpIMul %uint %12929 %17616\n      %13318 = OpShiftRightLogical %uint %16618 %uint_9\n      %24992 = OpBitwiseAnd %uint %13318 %uint_7\n      %25229 = OpIMul %uint %13105 %24992\n      %19915 = OpIAdd %uint %15046 %25229\n      %12651 = OpUDiv %uint %19915 %uint_7\n       %9210 = OpShiftLeftLogical %uint %12651 %uint_24\n      %18045 = OpBitwiseOr %uint %7576 %9210\n               OpBranch %11724\n      %11724 = OpLabel\n      %20515 = OpPhi %uint %18437 %10649 %18045 %14531\n      %16619 = OpCompositeExtract %uint %12023 2\n               OpSelectionMerge %11725 None\n               OpBranchConditional %20101 %10650 %14532\n      %10650 = OpLabel\n      %17667 = OpBitwiseAnd %uint %16619 %uint_1170\n      %23958 = OpBitwiseAnd %uint %16619 %uint_2340\n      %21854 = OpShiftRightLogical %uint %23958 %uint_1\n       %8143 = OpBitwiseAnd %uint %17667 %21854\n      %24619 = OpShiftLeftLogical %uint %8143 %uint_1\n      %22966 = OpShiftRightLogical %uint %8143 %uint_1\n      %18818 = OpBitwiseOr %uint %24619 %22966\n      %15920 = OpBitwiseOr %uint %8143 %18818\n       %8465 = OpNot %uint %15920\n      %10088 = OpBitwiseAnd %uint %16619 %8465\n      %16306 = OpISub %uint %uint_2925 %10088\n      %17421 = OpBitwiseAnd %uint %16306 %8465\n      %16997 = OpBitwiseAnd %uint %17421 %uint_7\n      %13683 = OpIMul %uint %12930 %16997\n      %21987 = OpBitwiseAnd %uint %10088 %uint_7\n      %20409 = OpIMul %uint %13106 %21987\n      %19855 = OpIAdd %uint %13683 %20409\n      %13012 = OpUDiv %uint %19855 %uint_5\n      %23035 = OpShiftRightLogical %uint %17421 %uint_3\n       %8765 = OpBitwiseAnd %uint %23035 %uint_7\n      %15047 = OpIMul %uint %12930 %8765\n      %13319 = OpShiftRightLogical %uint %10088 %uint_3\n      %24993 = OpBitwiseAnd %uint %13319 %uint_7\n      %25230 = OpIMul %uint %13106 %24993\n      %19916 = OpIAdd %uint %15047 %25230\n      %12652 = OpUDiv %uint %19916 %uint_5\n       %8184 = OpShiftLeftLogical %uint %12652 %uint_8\n       %7577 = OpBitwiseOr %uint %13012 %8184\n      %21959 = OpShiftRightLogical %uint %17421 %uint_6\n      %17617 = OpBitwiseAnd %uint %21959 %uint_7\n      %15048 = OpIMul %uint %12930 %17617\n      %13320 = OpShiftRightLogical %uint %10088 %uint_6\n      %24994 = OpBitwiseAnd %uint %13320 %uint_7\n      %25231 = OpIMul %uint %13106 %24994\n      %19917 = OpIAdd %uint %15048 %25231\n      %12653 = OpUDiv %uint %19917 %uint_5\n       %8185 = OpShiftLeftLogical %uint %12653 %uint_16\n       %7578 = OpBitwiseOr %uint %7577 %8185\n      %21960 = OpShiftRightLogical %uint %17421 %uint_9\n      %17618 = OpBitwiseAnd %uint %21960 %uint_7\n      %15049 = OpIMul %uint %12930 %17618\n      %13321 = OpShiftRightLogical %uint %10088 %uint_9\n      %24995 = OpBitwiseAnd %uint %13321 %uint_7\n      %25232 = OpIMul %uint %13106 %24995\n      %19918 = OpIAdd %uint %15049 %25232\n      %12654 = OpUDiv %uint %19918 %uint_5\n       %8262 = OpShiftLeftLogical %uint %12654 %uint_24\n       %6694 = OpBitwiseOr %uint %7578 %8262\n      %20410 = OpBitwiseAnd %uint %16619 %15920\n      %17414 = OpBitwiseAnd %uint %20410 %uint_1\n      %19565 = OpBitwiseAnd %uint %20410 %uint_8\n      %24938 = OpShiftLeftLogical %uint %19565 %uint_5\n      %17095 = OpBitwiseOr %uint %17414 %24938\n      %20878 = OpBitwiseAnd %uint %20410 %uint_64\n      %23325 = OpShiftLeftLogical %uint %20878 %uint_10\n      %17096 = OpBitwiseOr %uint %17095 %23325\n      %20879 = OpBitwiseAnd %uint %20410 %uint_512\n      %22052 = OpShiftLeftLogical %uint %20879 %uint_15\n       %8317 = OpBitwiseOr %uint %17096 %22052\n      %10426 = OpIMul %uint %8317 %uint_255\n      %18438 = OpIAdd %uint %6694 %10426\n               OpBranch %11725\n      %14532 = OpLabel\n      %10714 = OpNot %uint %16619\n      %15364 = OpBitwiseAnd %uint %10714 %uint_7\n      %17718 = OpIMul %uint %12930 %15364\n      %21988 = OpBitwiseAnd %uint %16619 %uint_7\n      %20411 = OpIMul %uint %13106 %21988\n      %19856 = OpIAdd %uint %17718 %20411\n      %13013 = OpUDiv %uint %19856 %uint_7\n      %23036 = OpShiftRightLogical %uint %10714 %uint_3\n       %8766 = OpBitwiseAnd %uint %23036 %uint_7\n      %15050 = OpIMul %uint %12930 %8766\n      %13322 = OpShiftRightLogical %uint %16619 %uint_3\n      %24996 = OpBitwiseAnd %uint %13322 %uint_7\n      %25233 = OpIMul %uint %13106 %24996\n      %19919 = OpIAdd %uint %15050 %25233\n      %12655 = OpUDiv %uint %19919 %uint_7\n       %8186 = OpShiftLeftLogical %uint %12655 %uint_8\n       %7579 = OpBitwiseOr %uint %13013 %8186\n      %21961 = OpShiftRightLogical %uint %10714 %uint_6\n      %17619 = OpBitwiseAnd %uint %21961 %uint_7\n      %15051 = OpIMul %uint %12930 %17619\n      %13323 = OpShiftRightLogical %uint %16619 %uint_6\n      %24997 = OpBitwiseAnd %uint %13323 %uint_7\n      %25234 = OpIMul %uint %13106 %24997\n      %19920 = OpIAdd %uint %15051 %25234\n      %12656 = OpUDiv %uint %19920 %uint_7\n       %8187 = OpShiftLeftLogical %uint %12656 %uint_16\n       %7580 = OpBitwiseOr %uint %7579 %8187\n      %21962 = OpShiftRightLogical %uint %10714 %uint_9\n      %17620 = OpBitwiseAnd %uint %21962 %uint_7\n      %15052 = OpIMul %uint %12930 %17620\n      %13324 = OpShiftRightLogical %uint %16619 %uint_9\n      %24998 = OpBitwiseAnd %uint %13324 %uint_7\n      %25235 = OpIMul %uint %13106 %24998\n      %19921 = OpIAdd %uint %15052 %25235\n      %12657 = OpUDiv %uint %19921 %uint_7\n       %9211 = OpShiftLeftLogical %uint %12657 %uint_24\n      %18046 = OpBitwiseOr %uint %7580 %9211\n               OpBranch %11725\n      %11725 = OpLabel\n      %20516 = OpPhi %uint %18438 %10650 %18046 %14532\n      %16620 = OpCompositeExtract %uint %12023 3\n               OpSelectionMerge %11703 None\n               OpBranchConditional %20102 %10651 %14533\n      %10651 = OpLabel\n      %17668 = OpBitwiseAnd %uint %16620 %uint_1170\n      %23959 = OpBitwiseAnd %uint %16620 %uint_2340\n      %21855 = OpShiftRightLogical %uint %23959 %uint_1\n       %8144 = OpBitwiseAnd %uint %17668 %21855\n      %24620 = OpShiftLeftLogical %uint %8144 %uint_1\n      %22967 = OpShiftRightLogical %uint %8144 %uint_1\n      %18819 = OpBitwiseOr %uint %24620 %22967\n      %15921 = OpBitwiseOr %uint %8144 %18819\n       %8466 = OpNot %uint %15921\n      %10089 = OpBitwiseAnd %uint %16620 %8466\n      %16307 = OpISub %uint %uint_2925 %10089\n      %17422 = OpBitwiseAnd %uint %16307 %8466\n      %16998 = OpBitwiseAnd %uint %17422 %uint_7\n      %13684 = OpIMul %uint %12931 %16998\n      %21989 = OpBitwiseAnd %uint %10089 %uint_7\n      %20412 = OpIMul %uint %13107 %21989\n      %19857 = OpIAdd %uint %13684 %20412\n      %13014 = OpUDiv %uint %19857 %uint_5\n      %23037 = OpShiftRightLogical %uint %17422 %uint_3\n       %8767 = OpBitwiseAnd %uint %23037 %uint_7\n      %15053 = OpIMul %uint %12931 %8767\n      %13325 = OpShiftRightLogical %uint %10089 %uint_3\n      %24999 = OpBitwiseAnd %uint %13325 %uint_7\n      %25236 = OpIMul %uint %13107 %24999\n      %19922 = OpIAdd %uint %15053 %25236\n      %12658 = OpUDiv %uint %19922 %uint_5\n       %8188 = OpShiftLeftLogical %uint %12658 %uint_8\n       %7581 = OpBitwiseOr %uint %13014 %8188\n      %21963 = OpShiftRightLogical %uint %17422 %uint_6\n      %17621 = OpBitwiseAnd %uint %21963 %uint_7\n      %15054 = OpIMul %uint %12931 %17621\n      %13326 = OpShiftRightLogical %uint %10089 %uint_6\n      %25000 = OpBitwiseAnd %uint %13326 %uint_7\n      %25237 = OpIMul %uint %13107 %25000\n      %19923 = OpIAdd %uint %15054 %25237\n      %12659 = OpUDiv %uint %19923 %uint_5\n       %8189 = OpShiftLeftLogical %uint %12659 %uint_16\n       %7582 = OpBitwiseOr %uint %7581 %8189\n      %21964 = OpShiftRightLogical %uint %17422 %uint_9\n      %17622 = OpBitwiseAnd %uint %21964 %uint_7\n      %15055 = OpIMul %uint %12931 %17622\n      %13327 = OpShiftRightLogical %uint %10089 %uint_9\n      %25001 = OpBitwiseAnd %uint %13327 %uint_7\n      %25238 = OpIMul %uint %13107 %25001\n      %19924 = OpIAdd %uint %15055 %25238\n      %12660 = OpUDiv %uint %19924 %uint_5\n       %8263 = OpShiftLeftLogical %uint %12660 %uint_24\n       %6695 = OpBitwiseOr %uint %7582 %8263\n      %20413 = OpBitwiseAnd %uint %16620 %15921\n      %17423 = OpBitwiseAnd %uint %20413 %uint_1\n      %19566 = OpBitwiseAnd %uint %20413 %uint_8\n      %24939 = OpShiftLeftLogical %uint %19566 %uint_5\n      %17097 = OpBitwiseOr %uint %17423 %24939\n      %20880 = OpBitwiseAnd %uint %20413 %uint_64\n      %23326 = OpShiftLeftLogical %uint %20880 %uint_10\n      %17098 = OpBitwiseOr %uint %17097 %23326\n      %20881 = OpBitwiseAnd %uint %20413 %uint_512\n      %22053 = OpShiftLeftLogical %uint %20881 %uint_15\n       %8318 = OpBitwiseOr %uint %17098 %22053\n      %10427 = OpIMul %uint %8318 %uint_255\n      %18439 = OpIAdd %uint %6695 %10427\n               OpBranch %11703\n      %14533 = OpLabel\n      %10715 = OpNot %uint %16620\n      %15365 = OpBitwiseAnd %uint %10715 %uint_7\n      %17719 = OpIMul %uint %12931 %15365\n      %21990 = OpBitwiseAnd %uint %16620 %uint_7\n      %20414 = OpIMul %uint %13107 %21990\n      %19858 = OpIAdd %uint %17719 %20414\n      %13016 = OpUDiv %uint %19858 %uint_7\n      %23038 = OpShiftRightLogical %uint %10715 %uint_3\n       %8768 = OpBitwiseAnd %uint %23038 %uint_7\n      %15056 = OpIMul %uint %12931 %8768\n      %13328 = OpShiftRightLogical %uint %16620 %uint_3\n      %25002 = OpBitwiseAnd %uint %13328 %uint_7\n      %25239 = OpIMul %uint %13107 %25002\n      %19925 = OpIAdd %uint %15056 %25239\n      %12661 = OpUDiv %uint %19925 %uint_7\n       %8190 = OpShiftLeftLogical %uint %12661 %uint_8\n       %7583 = OpBitwiseOr %uint %13016 %8190\n      %21965 = OpShiftRightLogical %uint %10715 %uint_6\n      %17623 = OpBitwiseAnd %uint %21965 %uint_7\n      %15057 = OpIMul %uint %12931 %17623\n      %13329 = OpShiftRightLogical %uint %16620 %uint_6\n      %25003 = OpBitwiseAnd %uint %13329 %uint_7\n      %25240 = OpIMul %uint %13107 %25003\n      %19926 = OpIAdd %uint %15057 %25240\n      %12662 = OpUDiv %uint %19926 %uint_7\n       %8191 = OpShiftLeftLogical %uint %12662 %uint_16\n       %7584 = OpBitwiseOr %uint %7583 %8191\n      %21966 = OpShiftRightLogical %uint %10715 %uint_9\n      %17624 = OpBitwiseAnd %uint %21966 %uint_7\n      %15058 = OpIMul %uint %12931 %17624\n      %13330 = OpShiftRightLogical %uint %16620 %uint_9\n      %25004 = OpBitwiseAnd %uint %13330 %uint_7\n      %25241 = OpIMul %uint %13107 %25004\n      %19927 = OpIAdd %uint %15058 %25241\n      %12663 = OpUDiv %uint %19927 %uint_7\n       %9212 = OpShiftLeftLogical %uint %12663 %uint_24\n      %18047 = OpBitwiseOr %uint %7584 %9212\n               OpBranch %11703\n      %11703 = OpLabel\n      %17230 = OpPhi %uint %18439 %10651 %18047 %14533\n      %14584 = OpCompositeConstruct %v4uint %20514 %20515 %20516 %17230\n      %13108 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %23030\n               OpStore %13108 %14584\n      %14840 = OpIAdd %uint %12832 %int_2\n      %11787 = OpULessThan %bool %14840 %6594\n               OpSelectionMerge %7206 DontFlatten\n               OpBranchConditional %11787 %22829 %7206\n      %22829 = OpLabel\n      %13334 = OpIAdd %uint %15481 %22412\n      %15655 = OpShiftRightLogical %v4uint %16695 %317\n      %23835 = OpCompositeExtract %uint %15655 0\n               OpSelectionMerge %11726 None\n               OpBranchConditional %20099 %10652 %21929\n      %10652 = OpLabel\n      %17669 = OpBitwiseAnd %uint %23835 %uint_4793490\n      %23960 = OpBitwiseAnd %uint %23835 %uint_9586980\n      %21856 = OpShiftRightLogical %uint %23960 %uint_1\n       %8145 = OpBitwiseAnd %uint %17669 %21856\n      %24621 = OpShiftLeftLogical %uint %8145 %uint_1\n      %22968 = OpShiftRightLogical %uint %8145 %uint_1\n      %18797 = OpBitwiseOr %uint %24621 %22968\n      %16053 = OpBitwiseOr %uint %8145 %18797\n      %18313 = OpBitwiseAnd %uint %23835 %uint_2396745\n      %14689 = OpBitwiseOr %uint %18313 %uint_14380470\n      %20415 = OpBitwiseAnd %uint %14689 %16053\n      %20543 = OpShiftRightLogical %uint %17669 %uint_1\n      %24926 = OpBitwiseOr %uint %18313 %20543\n      %21928 = OpShiftRightLogical %uint %23960 %uint_2\n      %22678 = OpBitwiseOr %uint %24926 %21928\n       %7729 = OpBitwiseXor %uint %22678 %uint_2396745\n       %9549 = OpNot %uint %20543\n      %14629 = OpBitwiseAnd %uint %18313 %9549\n       %8433 = OpNot %uint %21928\n      %11415 = OpBitwiseAnd %uint %14629 %8433\n       %6807 = OpBitwiseOr %uint %23835 %7729\n      %19517 = OpISub %uint %6807 %uint_2396745\n      %14884 = OpBitwiseOr %uint %19517 %11415\n      %18232 = OpShiftLeftLogical %uint %11415 %uint_2\n      %15366 = OpBitwiseOr %uint %14884 %18232\n      %12158 = OpNot %uint %16053\n      %18516 = OpBitwiseAnd %uint %15366 %12158\n       %6256 = OpBitwiseOr %uint %18516 %20415\n               OpBranch %11726\n      %21929 = OpLabel\n      %20083 = OpBitwiseAnd %uint %23835 %uint_2396745\n      %23914 = OpBitwiseAnd %uint %23835 %uint_4793490\n      %22251 = OpShiftRightLogical %uint %23914 %uint_1\n      %24004 = OpBitwiseOr %uint %20083 %22251\n      %19603 = OpBitwiseAnd %uint %23835 %uint_9586980\n      %20619 = OpShiftRightLogical %uint %19603 %uint_2\n      %24291 = OpBitwiseOr %uint %24004 %20619\n       %7730 = OpBitwiseXor %uint %24291 %uint_2396745\n       %9550 = OpNot %uint %22251\n      %14630 = OpBitwiseAnd %uint %20083 %9550\n       %8434 = OpNot %uint %20619\n      %11416 = OpBitwiseAnd %uint %14630 %8434\n       %6808 = OpBitwiseOr %uint %23835 %7730\n      %19518 = OpISub %uint %6808 %uint_2396745\n      %14885 = OpBitwiseOr %uint %19518 %11416\n      %18156 = OpShiftLeftLogical %uint %11416 %uint_1\n      %16012 = OpBitwiseOr %uint %14885 %18156\n       %8122 = OpShiftLeftLogical %uint %11416 %uint_2\n       %7812 = OpBitwiseOr %uint %16012 %8122\n               OpBranch %11726\n      %11726 = OpLabel\n      %20517 = OpPhi %uint %6256 %10652 %7812 %21929\n      %16621 = OpCompositeExtract %uint %15655 1\n               OpSelectionMerge %11727 None\n               OpBranchConditional %20100 %10653 %21931\n      %10653 = OpLabel\n      %17670 = OpBitwiseAnd %uint %16621 %uint_4793490\n      %23961 = OpBitwiseAnd %uint %16621 %uint_9586980\n      %21857 = OpShiftRightLogical %uint %23961 %uint_1\n       %8146 = OpBitwiseAnd %uint %17670 %21857\n      %24622 = OpShiftLeftLogical %uint %8146 %uint_1\n      %22969 = OpShiftRightLogical %uint %8146 %uint_1\n      %18798 = OpBitwiseOr %uint %24622 %22969\n      %16054 = OpBitwiseOr %uint %8146 %18798\n      %18314 = OpBitwiseAnd %uint %16621 %uint_2396745\n      %14690 = OpBitwiseOr %uint %18314 %uint_14380470\n      %20416 = OpBitwiseAnd %uint %14690 %16054\n      %20544 = OpShiftRightLogical %uint %17670 %uint_1\n      %24927 = OpBitwiseOr %uint %18314 %20544\n      %21930 = OpShiftRightLogical %uint %23961 %uint_2\n      %22679 = OpBitwiseOr %uint %24927 %21930\n       %7731 = OpBitwiseXor %uint %22679 %uint_2396745\n       %9551 = OpNot %uint %20544\n      %14631 = OpBitwiseAnd %uint %18314 %9551\n       %8435 = OpNot %uint %21930\n      %11417 = OpBitwiseAnd %uint %14631 %8435\n       %6809 = OpBitwiseOr %uint %16621 %7731\n      %19519 = OpISub %uint %6809 %uint_2396745\n      %14886 = OpBitwiseOr %uint %19519 %11417\n      %18233 = OpShiftLeftLogical %uint %11417 %uint_2\n      %15367 = OpBitwiseOr %uint %14886 %18233\n      %12159 = OpNot %uint %16054\n      %18517 = OpBitwiseAnd %uint %15367 %12159\n       %6257 = OpBitwiseOr %uint %18517 %20416\n               OpBranch %11727\n      %21931 = OpLabel\n      %20084 = OpBitwiseAnd %uint %16621 %uint_2396745\n      %23915 = OpBitwiseAnd %uint %16621 %uint_4793490\n      %22252 = OpShiftRightLogical %uint %23915 %uint_1\n      %24005 = OpBitwiseOr %uint %20084 %22252\n      %19604 = OpBitwiseAnd %uint %16621 %uint_9586980\n      %20620 = OpShiftRightLogical %uint %19604 %uint_2\n      %24292 = OpBitwiseOr %uint %24005 %20620\n       %7732 = OpBitwiseXor %uint %24292 %uint_2396745\n       %9552 = OpNot %uint %22252\n      %14632 = OpBitwiseAnd %uint %20084 %9552\n       %8436 = OpNot %uint %20620\n      %11418 = OpBitwiseAnd %uint %14632 %8436\n       %6810 = OpBitwiseOr %uint %16621 %7732\n      %19520 = OpISub %uint %6810 %uint_2396745\n      %14887 = OpBitwiseOr %uint %19520 %11418\n      %18157 = OpShiftLeftLogical %uint %11418 %uint_1\n      %16013 = OpBitwiseOr %uint %14887 %18157\n       %8123 = OpShiftLeftLogical %uint %11418 %uint_2\n       %7813 = OpBitwiseOr %uint %16013 %8123\n               OpBranch %11727\n      %11727 = OpLabel\n      %20518 = OpPhi %uint %6257 %10653 %7813 %21931\n      %16622 = OpCompositeExtract %uint %15655 2\n               OpSelectionMerge %11728 None\n               OpBranchConditional %20101 %10654 %21933\n      %10654 = OpLabel\n      %17671 = OpBitwiseAnd %uint %16622 %uint_4793490\n      %23962 = OpBitwiseAnd %uint %16622 %uint_9586980\n      %21858 = OpShiftRightLogical %uint %23962 %uint_1\n       %8147 = OpBitwiseAnd %uint %17671 %21858\n      %24623 = OpShiftLeftLogical %uint %8147 %uint_1\n      %22970 = OpShiftRightLogical %uint %8147 %uint_1\n      %18799 = OpBitwiseOr %uint %24623 %22970\n      %16055 = OpBitwiseOr %uint %8147 %18799\n      %18315 = OpBitwiseAnd %uint %16622 %uint_2396745\n      %14691 = OpBitwiseOr %uint %18315 %uint_14380470\n      %20417 = OpBitwiseAnd %uint %14691 %16055\n      %20545 = OpShiftRightLogical %uint %17671 %uint_1\n      %24928 = OpBitwiseOr %uint %18315 %20545\n      %21932 = OpShiftRightLogical %uint %23962 %uint_2\n      %22680 = OpBitwiseOr %uint %24928 %21932\n       %7733 = OpBitwiseXor %uint %22680 %uint_2396745\n       %9553 = OpNot %uint %20545\n      %14633 = OpBitwiseAnd %uint %18315 %9553\n       %8437 = OpNot %uint %21932\n      %11419 = OpBitwiseAnd %uint %14633 %8437\n       %6811 = OpBitwiseOr %uint %16622 %7733\n      %19521 = OpISub %uint %6811 %uint_2396745\n      %14888 = OpBitwiseOr %uint %19521 %11419\n      %18234 = OpShiftLeftLogical %uint %11419 %uint_2\n      %15368 = OpBitwiseOr %uint %14888 %18234\n      %12160 = OpNot %uint %16055\n      %18518 = OpBitwiseAnd %uint %15368 %12160\n       %6258 = OpBitwiseOr %uint %18518 %20417\n               OpBranch %11728\n      %21933 = OpLabel\n      %20085 = OpBitwiseAnd %uint %16622 %uint_2396745\n      %23916 = OpBitwiseAnd %uint %16622 %uint_4793490\n      %22253 = OpShiftRightLogical %uint %23916 %uint_1\n      %24006 = OpBitwiseOr %uint %20085 %22253\n      %19605 = OpBitwiseAnd %uint %16622 %uint_9586980\n      %20621 = OpShiftRightLogical %uint %19605 %uint_2\n      %24293 = OpBitwiseOr %uint %24006 %20621\n       %7734 = OpBitwiseXor %uint %24293 %uint_2396745\n       %9554 = OpNot %uint %22253\n      %14634 = OpBitwiseAnd %uint %20085 %9554\n       %8438 = OpNot %uint %20621\n      %11420 = OpBitwiseAnd %uint %14634 %8438\n       %6812 = OpBitwiseOr %uint %16622 %7734\n      %19522 = OpISub %uint %6812 %uint_2396745\n      %14889 = OpBitwiseOr %uint %19522 %11420\n      %18158 = OpShiftLeftLogical %uint %11420 %uint_1\n      %16014 = OpBitwiseOr %uint %14889 %18158\n       %8124 = OpShiftLeftLogical %uint %11420 %uint_2\n       %7814 = OpBitwiseOr %uint %16014 %8124\n               OpBranch %11728\n      %11728 = OpLabel\n      %20519 = OpPhi %uint %6258 %10654 %7814 %21933\n      %16623 = OpCompositeExtract %uint %15655 3\n               OpSelectionMerge %11704 None\n               OpBranchConditional %20102 %10655 %21967\n      %10655 = OpLabel\n      %17672 = OpBitwiseAnd %uint %16623 %uint_4793490\n      %23963 = OpBitwiseAnd %uint %16623 %uint_9586980\n      %21859 = OpShiftRightLogical %uint %23963 %uint_1\n       %8148 = OpBitwiseAnd %uint %17672 %21859\n      %24624 = OpShiftLeftLogical %uint %8148 %uint_1\n      %22971 = OpShiftRightLogical %uint %8148 %uint_1\n      %18800 = OpBitwiseOr %uint %24624 %22971\n      %16056 = OpBitwiseOr %uint %8148 %18800\n      %18316 = OpBitwiseAnd %uint %16623 %uint_2396745\n      %14692 = OpBitwiseOr %uint %18316 %uint_14380470\n      %20418 = OpBitwiseAnd %uint %14692 %16056\n      %20546 = OpShiftRightLogical %uint %17672 %uint_1\n      %24929 = OpBitwiseOr %uint %18316 %20546\n      %21934 = OpShiftRightLogical %uint %23963 %uint_2\n      %22681 = OpBitwiseOr %uint %24929 %21934\n       %7735 = OpBitwiseXor %uint %22681 %uint_2396745\n       %9555 = OpNot %uint %20546\n      %14635 = OpBitwiseAnd %uint %18316 %9555\n       %8439 = OpNot %uint %21934\n      %11421 = OpBitwiseAnd %uint %14635 %8439\n       %6814 = OpBitwiseOr %uint %16623 %7735\n      %19523 = OpISub %uint %6814 %uint_2396745\n      %14890 = OpBitwiseOr %uint %19523 %11421\n      %18235 = OpShiftLeftLogical %uint %11421 %uint_2\n      %15369 = OpBitwiseOr %uint %14890 %18235\n      %12161 = OpNot %uint %16056\n      %18519 = OpBitwiseAnd %uint %15369 %12161\n       %6259 = OpBitwiseOr %uint %18519 %20418\n               OpBranch %11704\n      %21967 = OpLabel\n      %20086 = OpBitwiseAnd %uint %16623 %uint_2396745\n      %23917 = OpBitwiseAnd %uint %16623 %uint_4793490\n      %22254 = OpShiftRightLogical %uint %23917 %uint_1\n      %24007 = OpBitwiseOr %uint %20086 %22254\n      %19606 = OpBitwiseAnd %uint %16623 %uint_9586980\n      %20622 = OpShiftRightLogical %uint %19606 %uint_2\n      %24294 = OpBitwiseOr %uint %24007 %20622\n       %7736 = OpBitwiseXor %uint %24294 %uint_2396745\n       %9556 = OpNot %uint %22254\n      %14636 = OpBitwiseAnd %uint %20086 %9556\n       %8440 = OpNot %uint %20622\n      %11422 = OpBitwiseAnd %uint %14636 %8440\n       %6815 = OpBitwiseOr %uint %16623 %7736\n      %19524 = OpISub %uint %6815 %uint_2396745\n      %14891 = OpBitwiseOr %uint %19524 %11422\n      %18159 = OpShiftLeftLogical %uint %11422 %uint_1\n      %16015 = OpBitwiseOr %uint %14891 %18159\n       %8125 = OpShiftLeftLogical %uint %11422 %uint_2\n       %7815 = OpBitwiseOr %uint %16015 %8125\n               OpBranch %11704\n      %11704 = OpLabel\n      %19681 = OpPhi %uint %6259 %10655 %7815 %21967\n      %14853 = OpCompositeConstruct %v4uint %20517 %20518 %20519 %19681\n       %7113 = OpShiftRightLogical %uint %13334 %int_4\n               OpSelectionMerge %14892 None\n               OpBranchConditional %20099 %10656 %14534\n      %10656 = OpLabel\n      %17673 = OpBitwiseAnd %uint %20517 %uint_1170\n      %23964 = OpBitwiseAnd %uint %20517 %uint_2340\n      %21860 = OpShiftRightLogical %uint %23964 %uint_1\n       %8149 = OpBitwiseAnd %uint %17673 %21860\n      %24625 = OpShiftLeftLogical %uint %8149 %uint_1\n      %22972 = OpShiftRightLogical %uint %8149 %uint_1\n      %18820 = OpBitwiseOr %uint %24625 %22972\n      %15922 = OpBitwiseOr %uint %8149 %18820\n       %8467 = OpNot %uint %15922\n      %10090 = OpBitwiseAnd %uint %20517 %8467\n      %16308 = OpISub %uint %uint_2925 %10090\n      %17424 = OpBitwiseAnd %uint %16308 %8467\n      %16999 = OpBitwiseAnd %uint %17424 %uint_7\n      %13685 = OpIMul %uint %6502 %16999\n      %21991 = OpBitwiseAnd %uint %10090 %uint_7\n      %20419 = OpIMul %uint %13104 %21991\n      %19859 = OpIAdd %uint %13685 %20419\n      %13017 = OpUDiv %uint %19859 %uint_5\n      %23039 = OpShiftRightLogical %uint %17424 %uint_3\n       %8769 = OpBitwiseAnd %uint %23039 %uint_7\n      %15059 = OpIMul %uint %6502 %8769\n      %13331 = OpShiftRightLogical %uint %10090 %uint_3\n      %25005 = OpBitwiseAnd %uint %13331 %uint_7\n      %25242 = OpIMul %uint %13104 %25005\n      %19928 = OpIAdd %uint %15059 %25242\n      %12664 = OpUDiv %uint %19928 %uint_5\n       %8192 = OpShiftLeftLogical %uint %12664 %uint_8\n       %7585 = OpBitwiseOr %uint %13017 %8192\n      %21968 = OpShiftRightLogical %uint %17424 %uint_6\n      %17625 = OpBitwiseAnd %uint %21968 %uint_7\n      %15060 = OpIMul %uint %6502 %17625\n      %13332 = OpShiftRightLogical %uint %10090 %uint_6\n      %25006 = OpBitwiseAnd %uint %13332 %uint_7\n      %25243 = OpIMul %uint %13104 %25006\n      %19929 = OpIAdd %uint %15060 %25243\n      %12665 = OpUDiv %uint %19929 %uint_5\n       %8193 = OpShiftLeftLogical %uint %12665 %uint_16\n       %7586 = OpBitwiseOr %uint %7585 %8193\n      %21969 = OpShiftRightLogical %uint %17424 %uint_9\n      %17626 = OpBitwiseAnd %uint %21969 %uint_7\n      %15061 = OpIMul %uint %6502 %17626\n      %13333 = OpShiftRightLogical %uint %10090 %uint_9\n      %25007 = OpBitwiseAnd %uint %13333 %uint_7\n      %25244 = OpIMul %uint %13104 %25007\n      %19930 = OpIAdd %uint %15061 %25244\n      %12666 = OpUDiv %uint %19930 %uint_5\n       %8264 = OpShiftLeftLogical %uint %12666 %uint_24\n       %6696 = OpBitwiseOr %uint %7586 %8264\n      %20420 = OpBitwiseAnd %uint %20517 %15922\n      %17426 = OpBitwiseAnd %uint %20420 %uint_1\n      %19567 = OpBitwiseAnd %uint %20420 %uint_8\n      %24940 = OpShiftLeftLogical %uint %19567 %uint_5\n      %17099 = OpBitwiseOr %uint %17426 %24940\n      %20882 = OpBitwiseAnd %uint %20420 %uint_64\n      %23327 = OpShiftLeftLogical %uint %20882 %uint_10\n      %17100 = OpBitwiseOr %uint %17099 %23327\n      %20883 = OpBitwiseAnd %uint %20420 %uint_512\n      %22054 = OpShiftLeftLogical %uint %20883 %uint_15\n       %8319 = OpBitwiseOr %uint %17100 %22054\n      %10428 = OpIMul %uint %8319 %uint_255\n      %18440 = OpIAdd %uint %6696 %10428\n               OpBranch %14892\n      %14534 = OpLabel\n      %10716 = OpNot %uint %20517\n      %15370 = OpBitwiseAnd %uint %10716 %uint_7\n      %17720 = OpIMul %uint %6502 %15370\n      %21994 = OpBitwiseAnd %uint %20517 %uint_7\n      %20421 = OpIMul %uint %13104 %21994\n      %19860 = OpIAdd %uint %17720 %20421\n      %13018 = OpUDiv %uint %19860 %uint_7\n      %23040 = OpShiftRightLogical %uint %10716 %uint_3\n       %8770 = OpBitwiseAnd %uint %23040 %uint_7\n      %15062 = OpIMul %uint %6502 %8770\n      %13335 = OpShiftRightLogical %uint %20517 %uint_3\n      %25008 = OpBitwiseAnd %uint %13335 %uint_7\n      %25245 = OpIMul %uint %13104 %25008\n      %19931 = OpIAdd %uint %15062 %25245\n      %12667 = OpUDiv %uint %19931 %uint_7\n       %8194 = OpShiftLeftLogical %uint %12667 %uint_8\n       %7587 = OpBitwiseOr %uint %13018 %8194\n      %21970 = OpShiftRightLogical %uint %10716 %uint_6\n      %17627 = OpBitwiseAnd %uint %21970 %uint_7\n      %15063 = OpIMul %uint %6502 %17627\n      %13336 = OpShiftRightLogical %uint %20517 %uint_6\n      %25009 = OpBitwiseAnd %uint %13336 %uint_7\n      %25246 = OpIMul %uint %13104 %25009\n      %19932 = OpIAdd %uint %15063 %25246\n      %12668 = OpUDiv %uint %19932 %uint_7\n       %8195 = OpShiftLeftLogical %uint %12668 %uint_16\n       %7588 = OpBitwiseOr %uint %7587 %8195\n      %21971 = OpShiftRightLogical %uint %10716 %uint_9\n      %17628 = OpBitwiseAnd %uint %21971 %uint_7\n      %15064 = OpIMul %uint %6502 %17628\n      %13337 = OpShiftRightLogical %uint %20517 %uint_9\n      %25010 = OpBitwiseAnd %uint %13337 %uint_7\n      %25247 = OpIMul %uint %13104 %25010\n      %19933 = OpIAdd %uint %15064 %25247\n      %12669 = OpUDiv %uint %19933 %uint_7\n       %9213 = OpShiftLeftLogical %uint %12669 %uint_24\n      %18048 = OpBitwiseOr %uint %7588 %9213\n               OpBranch %14892\n      %14892 = OpLabel\n      %10929 = OpPhi %uint %18440 %10656 %18048 %14534\n               OpSelectionMerge %14893 None\n               OpBranchConditional %20100 %10657 %14535\n      %10657 = OpLabel\n      %17674 = OpBitwiseAnd %uint %20518 %uint_1170\n      %23965 = OpBitwiseAnd %uint %20518 %uint_2340\n      %21861 = OpShiftRightLogical %uint %23965 %uint_1\n       %8150 = OpBitwiseAnd %uint %17674 %21861\n      %24626 = OpShiftLeftLogical %uint %8150 %uint_1\n      %22973 = OpShiftRightLogical %uint %8150 %uint_1\n      %18821 = OpBitwiseOr %uint %24626 %22973\n      %15923 = OpBitwiseOr %uint %8150 %18821\n       %8468 = OpNot %uint %15923\n      %10091 = OpBitwiseAnd %uint %20518 %8468\n      %16309 = OpISub %uint %uint_2925 %10091\n      %17427 = OpBitwiseAnd %uint %16309 %8468\n      %17000 = OpBitwiseAnd %uint %17427 %uint_7\n      %13686 = OpIMul %uint %12929 %17000\n      %21995 = OpBitwiseAnd %uint %10091 %uint_7\n      %20422 = OpIMul %uint %13105 %21995\n      %19861 = OpIAdd %uint %13686 %20422\n      %13019 = OpUDiv %uint %19861 %uint_5\n      %23041 = OpShiftRightLogical %uint %17427 %uint_3\n       %8771 = OpBitwiseAnd %uint %23041 %uint_7\n      %15065 = OpIMul %uint %12929 %8771\n      %13338 = OpShiftRightLogical %uint %10091 %uint_3\n      %25011 = OpBitwiseAnd %uint %13338 %uint_7\n      %25248 = OpIMul %uint %13105 %25011\n      %19934 = OpIAdd %uint %15065 %25248\n      %12670 = OpUDiv %uint %19934 %uint_5\n       %8196 = OpShiftLeftLogical %uint %12670 %uint_8\n       %7589 = OpBitwiseOr %uint %13019 %8196\n      %21972 = OpShiftRightLogical %uint %17427 %uint_6\n      %17629 = OpBitwiseAnd %uint %21972 %uint_7\n      %15066 = OpIMul %uint %12929 %17629\n      %13339 = OpShiftRightLogical %uint %10091 %uint_6\n      %25012 = OpBitwiseAnd %uint %13339 %uint_7\n      %25249 = OpIMul %uint %13105 %25012\n      %19935 = OpIAdd %uint %15066 %25249\n      %12671 = OpUDiv %uint %19935 %uint_5\n       %8197 = OpShiftLeftLogical %uint %12671 %uint_16\n       %7590 = OpBitwiseOr %uint %7589 %8197\n      %21973 = OpShiftRightLogical %uint %17427 %uint_9\n      %17630 = OpBitwiseAnd %uint %21973 %uint_7\n      %15067 = OpIMul %uint %12929 %17630\n      %13340 = OpShiftRightLogical %uint %10091 %uint_9\n      %25013 = OpBitwiseAnd %uint %13340 %uint_7\n      %25250 = OpIMul %uint %13105 %25013\n      %19936 = OpIAdd %uint %15067 %25250\n      %12672 = OpUDiv %uint %19936 %uint_5\n       %8265 = OpShiftLeftLogical %uint %12672 %uint_24\n       %6697 = OpBitwiseOr %uint %7590 %8265\n      %20425 = OpBitwiseAnd %uint %20518 %15923\n      %17428 = OpBitwiseAnd %uint %20425 %uint_1\n      %19568 = OpBitwiseAnd %uint %20425 %uint_8\n      %24941 = OpShiftLeftLogical %uint %19568 %uint_5\n      %17101 = OpBitwiseOr %uint %17428 %24941\n      %20884 = OpBitwiseAnd %uint %20425 %uint_64\n      %23328 = OpShiftLeftLogical %uint %20884 %uint_10\n      %17103 = OpBitwiseOr %uint %17101 %23328\n      %20885 = OpBitwiseAnd %uint %20425 %uint_512\n      %22055 = OpShiftLeftLogical %uint %20885 %uint_15\n       %8320 = OpBitwiseOr %uint %17103 %22055\n      %10429 = OpIMul %uint %8320 %uint_255\n      %18441 = OpIAdd %uint %6697 %10429\n               OpBranch %14893\n      %14535 = OpLabel\n      %10717 = OpNot %uint %20518\n      %15371 = OpBitwiseAnd %uint %10717 %uint_7\n      %17721 = OpIMul %uint %12929 %15371\n      %21996 = OpBitwiseAnd %uint %20518 %uint_7\n      %20426 = OpIMul %uint %13105 %21996\n      %19862 = OpIAdd %uint %17721 %20426\n      %13020 = OpUDiv %uint %19862 %uint_7\n      %23042 = OpShiftRightLogical %uint %10717 %uint_3\n       %8772 = OpBitwiseAnd %uint %23042 %uint_7\n      %15068 = OpIMul %uint %12929 %8772\n      %13341 = OpShiftRightLogical %uint %20518 %uint_3\n      %25014 = OpBitwiseAnd %uint %13341 %uint_7\n      %25251 = OpIMul %uint %13105 %25014\n      %19937 = OpIAdd %uint %15068 %25251\n      %12673 = OpUDiv %uint %19937 %uint_7\n       %8198 = OpShiftLeftLogical %uint %12673 %uint_8\n       %7591 = OpBitwiseOr %uint %13020 %8198\n      %21974 = OpShiftRightLogical %uint %10717 %uint_6\n      %17631 = OpBitwiseAnd %uint %21974 %uint_7\n      %15070 = OpIMul %uint %12929 %17631\n      %13342 = OpShiftRightLogical %uint %20518 %uint_6\n      %25015 = OpBitwiseAnd %uint %13342 %uint_7\n      %25252 = OpIMul %uint %13105 %25015\n      %19938 = OpIAdd %uint %15070 %25252\n      %12674 = OpUDiv %uint %19938 %uint_7\n       %8199 = OpShiftLeftLogical %uint %12674 %uint_16\n       %7592 = OpBitwiseOr %uint %7591 %8199\n      %21997 = OpShiftRightLogical %uint %10717 %uint_9\n      %17632 = OpBitwiseAnd %uint %21997 %uint_7\n      %15071 = OpIMul %uint %12929 %17632\n      %13343 = OpShiftRightLogical %uint %20518 %uint_9\n      %25016 = OpBitwiseAnd %uint %13343 %uint_7\n      %25253 = OpIMul %uint %13105 %25016\n      %19939 = OpIAdd %uint %15071 %25253\n      %12675 = OpUDiv %uint %19939 %uint_7\n       %9214 = OpShiftLeftLogical %uint %12675 %uint_24\n      %18049 = OpBitwiseOr %uint %7592 %9214\n               OpBranch %14893\n      %14893 = OpLabel\n      %10930 = OpPhi %uint %18441 %10657 %18049 %14535\n               OpSelectionMerge %14894 None\n               OpBranchConditional %20101 %10658 %14536\n      %10658 = OpLabel\n      %17675 = OpBitwiseAnd %uint %20519 %uint_1170\n      %23966 = OpBitwiseAnd %uint %20519 %uint_2340\n      %21863 = OpShiftRightLogical %uint %23966 %uint_1\n       %8151 = OpBitwiseAnd %uint %17675 %21863\n      %24627 = OpShiftLeftLogical %uint %8151 %uint_1\n      %22974 = OpShiftRightLogical %uint %8151 %uint_1\n      %18822 = OpBitwiseOr %uint %24627 %22974\n      %15924 = OpBitwiseOr %uint %8151 %18822\n       %8469 = OpNot %uint %15924\n      %10092 = OpBitwiseAnd %uint %20519 %8469\n      %16310 = OpISub %uint %uint_2925 %10092\n      %17429 = OpBitwiseAnd %uint %16310 %8469\n      %17001 = OpBitwiseAnd %uint %17429 %uint_7\n      %13687 = OpIMul %uint %12930 %17001\n      %21998 = OpBitwiseAnd %uint %10092 %uint_7\n      %20427 = OpIMul %uint %13106 %21998\n      %19863 = OpIAdd %uint %13687 %20427\n      %13021 = OpUDiv %uint %19863 %uint_5\n      %23043 = OpShiftRightLogical %uint %17429 %uint_3\n       %8773 = OpBitwiseAnd %uint %23043 %uint_7\n      %15072 = OpIMul %uint %12930 %8773\n      %13344 = OpShiftRightLogical %uint %10092 %uint_3\n      %25017 = OpBitwiseAnd %uint %13344 %uint_7\n      %25254 = OpIMul %uint %13106 %25017\n      %19940 = OpIAdd %uint %15072 %25254\n      %12676 = OpUDiv %uint %19940 %uint_5\n       %8200 = OpShiftLeftLogical %uint %12676 %uint_8\n       %7593 = OpBitwiseOr %uint %13021 %8200\n      %21999 = OpShiftRightLogical %uint %17429 %uint_6\n      %17633 = OpBitwiseAnd %uint %21999 %uint_7\n      %15073 = OpIMul %uint %12930 %17633\n      %13345 = OpShiftRightLogical %uint %10092 %uint_6\n      %25018 = OpBitwiseAnd %uint %13345 %uint_7\n      %25255 = OpIMul %uint %13106 %25018\n      %19941 = OpIAdd %uint %15073 %25255\n      %12677 = OpUDiv %uint %19941 %uint_5\n       %8201 = OpShiftLeftLogical %uint %12677 %uint_16\n       %7594 = OpBitwiseOr %uint %7593 %8201\n      %22000 = OpShiftRightLogical %uint %17429 %uint_9\n      %17634 = OpBitwiseAnd %uint %22000 %uint_7\n      %15074 = OpIMul %uint %12930 %17634\n      %13346 = OpShiftRightLogical %uint %10092 %uint_9\n      %25019 = OpBitwiseAnd %uint %13346 %uint_7\n      %25256 = OpIMul %uint %13106 %25019\n      %19942 = OpIAdd %uint %15074 %25256\n      %12678 = OpUDiv %uint %19942 %uint_5\n       %8266 = OpShiftLeftLogical %uint %12678 %uint_24\n       %6698 = OpBitwiseOr %uint %7594 %8266\n      %20428 = OpBitwiseAnd %uint %20519 %15924\n      %17430 = OpBitwiseAnd %uint %20428 %uint_1\n      %19569 = OpBitwiseAnd %uint %20428 %uint_8\n      %24942 = OpShiftLeftLogical %uint %19569 %uint_5\n      %17104 = OpBitwiseOr %uint %17430 %24942\n      %20886 = OpBitwiseAnd %uint %20428 %uint_64\n      %23329 = OpShiftLeftLogical %uint %20886 %uint_10\n      %17105 = OpBitwiseOr %uint %17104 %23329\n      %20887 = OpBitwiseAnd %uint %20428 %uint_512\n      %22056 = OpShiftLeftLogical %uint %20887 %uint_15\n       %8321 = OpBitwiseOr %uint %17105 %22056\n      %10430 = OpIMul %uint %8321 %uint_255\n      %18442 = OpIAdd %uint %6698 %10430\n               OpBranch %14894\n      %14536 = OpLabel\n      %10718 = OpNot %uint %20519\n      %15372 = OpBitwiseAnd %uint %10718 %uint_7\n      %17722 = OpIMul %uint %12930 %15372\n      %22001 = OpBitwiseAnd %uint %20519 %uint_7\n      %20429 = OpIMul %uint %13106 %22001\n      %19864 = OpIAdd %uint %17722 %20429\n      %13022 = OpUDiv %uint %19864 %uint_7\n      %23044 = OpShiftRightLogical %uint %10718 %uint_3\n       %8774 = OpBitwiseAnd %uint %23044 %uint_7\n      %15075 = OpIMul %uint %12930 %8774\n      %13347 = OpShiftRightLogical %uint %20519 %uint_3\n      %25020 = OpBitwiseAnd %uint %13347 %uint_7\n      %25257 = OpIMul %uint %13106 %25020\n      %19943 = OpIAdd %uint %15075 %25257\n      %12679 = OpUDiv %uint %19943 %uint_7\n       %8202 = OpShiftLeftLogical %uint %12679 %uint_8\n       %7595 = OpBitwiseOr %uint %13022 %8202\n      %22002 = OpShiftRightLogical %uint %10718 %uint_6\n      %17635 = OpBitwiseAnd %uint %22002 %uint_7\n      %15076 = OpIMul %uint %12930 %17635\n      %13348 = OpShiftRightLogical %uint %20519 %uint_6\n      %25021 = OpBitwiseAnd %uint %13348 %uint_7\n      %25258 = OpIMul %uint %13106 %25021\n      %19944 = OpIAdd %uint %15076 %25258\n      %12680 = OpUDiv %uint %19944 %uint_7\n       %8203 = OpShiftLeftLogical %uint %12680 %uint_16\n       %7596 = OpBitwiseOr %uint %7595 %8203\n      %22003 = OpShiftRightLogical %uint %10718 %uint_9\n      %17636 = OpBitwiseAnd %uint %22003 %uint_7\n      %15077 = OpIMul %uint %12930 %17636\n      %13349 = OpShiftRightLogical %uint %20519 %uint_9\n      %25022 = OpBitwiseAnd %uint %13349 %uint_7\n      %25259 = OpIMul %uint %13106 %25022\n      %19945 = OpIAdd %uint %15077 %25259\n      %12681 = OpUDiv %uint %19945 %uint_7\n       %9215 = OpShiftLeftLogical %uint %12681 %uint_24\n      %18050 = OpBitwiseOr %uint %7596 %9215\n               OpBranch %14894\n      %14894 = OpLabel\n      %10931 = OpPhi %uint %18442 %10658 %18050 %14536\n               OpSelectionMerge %11705 None\n               OpBranchConditional %20102 %10659 %14537\n      %10659 = OpLabel\n      %17676 = OpBitwiseAnd %uint %19681 %uint_1170\n      %23967 = OpBitwiseAnd %uint %19681 %uint_2340\n      %21864 = OpShiftRightLogical %uint %23967 %uint_1\n       %8152 = OpBitwiseAnd %uint %17676 %21864\n      %24628 = OpShiftLeftLogical %uint %8152 %uint_1\n      %22975 = OpShiftRightLogical %uint %8152 %uint_1\n      %18823 = OpBitwiseOr %uint %24628 %22975\n      %15925 = OpBitwiseOr %uint %8152 %18823\n       %8470 = OpNot %uint %15925\n      %10093 = OpBitwiseAnd %uint %19681 %8470\n      %16311 = OpISub %uint %uint_2925 %10093\n      %17431 = OpBitwiseAnd %uint %16311 %8470\n      %17002 = OpBitwiseAnd %uint %17431 %uint_7\n      %13688 = OpIMul %uint %12931 %17002\n      %22004 = OpBitwiseAnd %uint %10093 %uint_7\n      %20430 = OpIMul %uint %13107 %22004\n      %19865 = OpIAdd %uint %13688 %20430\n      %13023 = OpUDiv %uint %19865 %uint_5\n      %23045 = OpShiftRightLogical %uint %17431 %uint_3\n       %8775 = OpBitwiseAnd %uint %23045 %uint_7\n      %15078 = OpIMul %uint %12931 %8775\n      %13350 = OpShiftRightLogical %uint %10093 %uint_3\n      %25023 = OpBitwiseAnd %uint %13350 %uint_7\n      %25260 = OpIMul %uint %13107 %25023\n      %19946 = OpIAdd %uint %15078 %25260\n      %12682 = OpUDiv %uint %19946 %uint_5\n       %8204 = OpShiftLeftLogical %uint %12682 %uint_8\n       %7597 = OpBitwiseOr %uint %13023 %8204\n      %22005 = OpShiftRightLogical %uint %17431 %uint_6\n      %17637 = OpBitwiseAnd %uint %22005 %uint_7\n      %15079 = OpIMul %uint %12931 %17637\n      %13351 = OpShiftRightLogical %uint %10093 %uint_6\n      %25024 = OpBitwiseAnd %uint %13351 %uint_7\n      %25261 = OpIMul %uint %13107 %25024\n      %19947 = OpIAdd %uint %15079 %25261\n      %12683 = OpUDiv %uint %19947 %uint_5\n       %8205 = OpShiftLeftLogical %uint %12683 %uint_16\n       %7598 = OpBitwiseOr %uint %7597 %8205\n      %22006 = OpShiftRightLogical %uint %17431 %uint_9\n      %17638 = OpBitwiseAnd %uint %22006 %uint_7\n      %15080 = OpIMul %uint %12931 %17638\n      %13352 = OpShiftRightLogical %uint %10093 %uint_9\n      %25025 = OpBitwiseAnd %uint %13352 %uint_7\n      %25262 = OpIMul %uint %13107 %25025\n      %19948 = OpIAdd %uint %15080 %25262\n      %12684 = OpUDiv %uint %19948 %uint_5\n       %8267 = OpShiftLeftLogical %uint %12684 %uint_24\n       %6699 = OpBitwiseOr %uint %7598 %8267\n      %20431 = OpBitwiseAnd %uint %19681 %15925\n      %17432 = OpBitwiseAnd %uint %20431 %uint_1\n      %19570 = OpBitwiseAnd %uint %20431 %uint_8\n      %24943 = OpShiftLeftLogical %uint %19570 %uint_5\n      %17106 = OpBitwiseOr %uint %17432 %24943\n      %20888 = OpBitwiseAnd %uint %20431 %uint_64\n      %23330 = OpShiftLeftLogical %uint %20888 %uint_10\n      %17107 = OpBitwiseOr %uint %17106 %23330\n      %20889 = OpBitwiseAnd %uint %20431 %uint_512\n      %22057 = OpShiftLeftLogical %uint %20889 %uint_15\n       %8322 = OpBitwiseOr %uint %17107 %22057\n      %10431 = OpIMul %uint %8322 %uint_255\n      %18443 = OpIAdd %uint %6699 %10431\n               OpBranch %11705\n      %14537 = OpLabel\n      %10719 = OpNot %uint %19681\n      %15373 = OpBitwiseAnd %uint %10719 %uint_7\n      %17723 = OpIMul %uint %12931 %15373\n      %22007 = OpBitwiseAnd %uint %19681 %uint_7\n      %20432 = OpIMul %uint %13107 %22007\n      %19866 = OpIAdd %uint %17723 %20432\n      %13024 = OpUDiv %uint %19866 %uint_7\n      %23046 = OpShiftRightLogical %uint %10719 %uint_3\n       %8776 = OpBitwiseAnd %uint %23046 %uint_7\n      %15081 = OpIMul %uint %12931 %8776\n      %13353 = OpShiftRightLogical %uint %19681 %uint_3\n      %25026 = OpBitwiseAnd %uint %13353 %uint_7\n      %25263 = OpIMul %uint %13107 %25026\n      %19949 = OpIAdd %uint %15081 %25263\n      %12685 = OpUDiv %uint %19949 %uint_7\n       %8206 = OpShiftLeftLogical %uint %12685 %uint_8\n       %7599 = OpBitwiseOr %uint %13024 %8206\n      %22008 = OpShiftRightLogical %uint %10719 %uint_6\n      %17639 = OpBitwiseAnd %uint %22008 %uint_7\n      %15082 = OpIMul %uint %12931 %17639\n      %13354 = OpShiftRightLogical %uint %19681 %uint_6\n      %25027 = OpBitwiseAnd %uint %13354 %uint_7\n      %25264 = OpIMul %uint %13107 %25027\n      %19950 = OpIAdd %uint %15082 %25264\n      %12686 = OpUDiv %uint %19950 %uint_7\n       %8207 = OpShiftLeftLogical %uint %12686 %uint_16\n       %7600 = OpBitwiseOr %uint %7599 %8207\n      %22009 = OpShiftRightLogical %uint %10719 %uint_9\n      %17640 = OpBitwiseAnd %uint %22009 %uint_7\n      %15083 = OpIMul %uint %12931 %17640\n      %13355 = OpShiftRightLogical %uint %19681 %uint_9\n      %25028 = OpBitwiseAnd %uint %13355 %uint_7\n      %25265 = OpIMul %uint %13107 %25028\n      %19951 = OpIAdd %uint %15083 %25265\n      %12687 = OpUDiv %uint %19951 %uint_7\n       %9216 = OpShiftLeftLogical %uint %12687 %uint_24\n      %18051 = OpBitwiseOr %uint %7600 %9216\n               OpBranch %11705\n      %11705 = OpLabel\n      %17231 = OpPhi %uint %18443 %10659 %18051 %14537\n      %14585 = OpCompositeConstruct %v4uint %10929 %10930 %10931 %17231\n      %13109 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %7113\n               OpStore %13109 %14585\n      %14841 = OpIAdd %uint %12832 %int_3\n      %11788 = OpULessThan %bool %14841 %6594\n               OpSelectionMerge %18021 DontFlatten\n               OpBranchConditional %11788 %22830 %18021\n      %22830 = OpLabel\n      %15482 = OpIAdd %uint %13334 %22412\n      %12024 = OpShiftRightLogical %v4uint %14853 %533\n      %23047 = OpShiftRightLogical %uint %15482 %int_4\n      %19252 = OpCompositeExtract %uint %12024 0\n               OpSelectionMerge %11729 None\n               OpBranchConditional %20099 %10660 %14538\n      %10660 = OpLabel\n      %17677 = OpBitwiseAnd %uint %19252 %uint_1170\n      %23968 = OpBitwiseAnd %uint %19252 %uint_2340\n      %21865 = OpShiftRightLogical %uint %23968 %uint_1\n       %8153 = OpBitwiseAnd %uint %17677 %21865\n      %24629 = OpShiftLeftLogical %uint %8153 %uint_1\n      %22976 = OpShiftRightLogical %uint %8153 %uint_1\n      %18824 = OpBitwiseOr %uint %24629 %22976\n      %15926 = OpBitwiseOr %uint %8153 %18824\n       %8471 = OpNot %uint %15926\n      %10094 = OpBitwiseAnd %uint %19252 %8471\n      %16312 = OpISub %uint %uint_2925 %10094\n      %17433 = OpBitwiseAnd %uint %16312 %8471\n      %17003 = OpBitwiseAnd %uint %17433 %uint_7\n      %13689 = OpIMul %uint %6502 %17003\n      %22010 = OpBitwiseAnd %uint %10094 %uint_7\n      %20433 = OpIMul %uint %13104 %22010\n      %19867 = OpIAdd %uint %13689 %20433\n      %13025 = OpUDiv %uint %19867 %uint_5\n      %23048 = OpShiftRightLogical %uint %17433 %uint_3\n       %8777 = OpBitwiseAnd %uint %23048 %uint_7\n      %15084 = OpIMul %uint %6502 %8777\n      %13356 = OpShiftRightLogical %uint %10094 %uint_3\n      %25029 = OpBitwiseAnd %uint %13356 %uint_7\n      %25266 = OpIMul %uint %13104 %25029\n      %19952 = OpIAdd %uint %15084 %25266\n      %12688 = OpUDiv %uint %19952 %uint_5\n       %8208 = OpShiftLeftLogical %uint %12688 %uint_8\n       %7601 = OpBitwiseOr %uint %13025 %8208\n      %22011 = OpShiftRightLogical %uint %17433 %uint_6\n      %17641 = OpBitwiseAnd %uint %22011 %uint_7\n      %15085 = OpIMul %uint %6502 %17641\n      %13357 = OpShiftRightLogical %uint %10094 %uint_6\n      %25030 = OpBitwiseAnd %uint %13357 %uint_7\n      %25267 = OpIMul %uint %13104 %25030\n      %19953 = OpIAdd %uint %15085 %25267\n      %12689 = OpUDiv %uint %19953 %uint_5\n       %8209 = OpShiftLeftLogical %uint %12689 %uint_16\n       %7602 = OpBitwiseOr %uint %7601 %8209\n      %22012 = OpShiftRightLogical %uint %17433 %uint_9\n      %17642 = OpBitwiseAnd %uint %22012 %uint_7\n      %15086 = OpIMul %uint %6502 %17642\n      %13358 = OpShiftRightLogical %uint %10094 %uint_9\n      %25031 = OpBitwiseAnd %uint %13358 %uint_7\n      %25268 = OpIMul %uint %13104 %25031\n      %19954 = OpIAdd %uint %15086 %25268\n      %12690 = OpUDiv %uint %19954 %uint_5\n       %8268 = OpShiftLeftLogical %uint %12690 %uint_24\n       %6700 = OpBitwiseOr %uint %7602 %8268\n      %20434 = OpBitwiseAnd %uint %19252 %15926\n      %17434 = OpBitwiseAnd %uint %20434 %uint_1\n      %19571 = OpBitwiseAnd %uint %20434 %uint_8\n      %24944 = OpShiftLeftLogical %uint %19571 %uint_5\n      %17108 = OpBitwiseOr %uint %17434 %24944\n      %20890 = OpBitwiseAnd %uint %20434 %uint_64\n      %23331 = OpShiftLeftLogical %uint %20890 %uint_10\n      %17109 = OpBitwiseOr %uint %17108 %23331\n      %20891 = OpBitwiseAnd %uint %20434 %uint_512\n      %22058 = OpShiftLeftLogical %uint %20891 %uint_15\n       %8323 = OpBitwiseOr %uint %17109 %22058\n      %10432 = OpIMul %uint %8323 %uint_255\n      %18444 = OpIAdd %uint %6700 %10432\n               OpBranch %11729\n      %14538 = OpLabel\n      %10720 = OpNot %uint %19252\n      %15374 = OpBitwiseAnd %uint %10720 %uint_7\n      %17724 = OpIMul %uint %6502 %15374\n      %22013 = OpBitwiseAnd %uint %19252 %uint_7\n      %20435 = OpIMul %uint %13104 %22013\n      %19868 = OpIAdd %uint %17724 %20435\n      %13026 = OpUDiv %uint %19868 %uint_7\n      %23049 = OpShiftRightLogical %uint %10720 %uint_3\n       %8778 = OpBitwiseAnd %uint %23049 %uint_7\n      %15087 = OpIMul %uint %6502 %8778\n      %13359 = OpShiftRightLogical %uint %19252 %uint_3\n      %25032 = OpBitwiseAnd %uint %13359 %uint_7\n      %25269 = OpIMul %uint %13104 %25032\n      %19955 = OpIAdd %uint %15087 %25269\n      %12691 = OpUDiv %uint %19955 %uint_7\n       %8210 = OpShiftLeftLogical %uint %12691 %uint_8\n       %7603 = OpBitwiseOr %uint %13026 %8210\n      %22014 = OpShiftRightLogical %uint %10720 %uint_6\n      %17643 = OpBitwiseAnd %uint %22014 %uint_7\n      %15088 = OpIMul %uint %6502 %17643\n      %13360 = OpShiftRightLogical %uint %19252 %uint_6\n      %25033 = OpBitwiseAnd %uint %13360 %uint_7\n      %25270 = OpIMul %uint %13104 %25033\n      %19956 = OpIAdd %uint %15088 %25270\n      %12692 = OpUDiv %uint %19956 %uint_7\n       %8211 = OpShiftLeftLogical %uint %12692 %uint_16\n       %7604 = OpBitwiseOr %uint %7603 %8211\n      %22015 = OpShiftRightLogical %uint %10720 %uint_9\n      %17644 = OpBitwiseAnd %uint %22015 %uint_7\n      %15089 = OpIMul %uint %6502 %17644\n      %13361 = OpShiftRightLogical %uint %19252 %uint_9\n      %25034 = OpBitwiseAnd %uint %13361 %uint_7\n      %25271 = OpIMul %uint %13104 %25034\n      %19957 = OpIAdd %uint %15089 %25271\n      %12693 = OpUDiv %uint %19957 %uint_7\n       %9217 = OpShiftLeftLogical %uint %12693 %uint_24\n      %18052 = OpBitwiseOr %uint %7604 %9217\n               OpBranch %11729\n      %11729 = OpLabel\n      %20520 = OpPhi %uint %18444 %10660 %18052 %14538\n      %16624 = OpCompositeExtract %uint %12024 1\n               OpSelectionMerge %11730 None\n               OpBranchConditional %20100 %10661 %14539\n      %10661 = OpLabel\n      %17678 = OpBitwiseAnd %uint %16624 %uint_1170\n      %23969 = OpBitwiseAnd %uint %16624 %uint_2340\n      %21866 = OpShiftRightLogical %uint %23969 %uint_1\n       %8154 = OpBitwiseAnd %uint %17678 %21866\n      %24630 = OpShiftLeftLogical %uint %8154 %uint_1\n      %22977 = OpShiftRightLogical %uint %8154 %uint_1\n      %18825 = OpBitwiseOr %uint %24630 %22977\n      %15927 = OpBitwiseOr %uint %8154 %18825\n       %8472 = OpNot %uint %15927\n      %10095 = OpBitwiseAnd %uint %16624 %8472\n      %16313 = OpISub %uint %uint_2925 %10095\n      %17435 = OpBitwiseAnd %uint %16313 %8472\n      %17004 = OpBitwiseAnd %uint %17435 %uint_7\n      %13690 = OpIMul %uint %12929 %17004\n      %22016 = OpBitwiseAnd %uint %10095 %uint_7\n      %20436 = OpIMul %uint %13105 %22016\n      %19869 = OpIAdd %uint %13690 %20436\n      %13027 = OpUDiv %uint %19869 %uint_5\n      %23050 = OpShiftRightLogical %uint %17435 %uint_3\n       %8779 = OpBitwiseAnd %uint %23050 %uint_7\n      %15090 = OpIMul %uint %12929 %8779\n      %13362 = OpShiftRightLogical %uint %10095 %uint_3\n      %25035 = OpBitwiseAnd %uint %13362 %uint_7\n      %25272 = OpIMul %uint %13105 %25035\n      %19958 = OpIAdd %uint %15090 %25272\n      %12694 = OpUDiv %uint %19958 %uint_5\n       %8212 = OpShiftLeftLogical %uint %12694 %uint_8\n       %7605 = OpBitwiseOr %uint %13027 %8212\n      %22017 = OpShiftRightLogical %uint %17435 %uint_6\n      %17645 = OpBitwiseAnd %uint %22017 %uint_7\n      %15091 = OpIMul %uint %12929 %17645\n      %13363 = OpShiftRightLogical %uint %10095 %uint_6\n      %25036 = OpBitwiseAnd %uint %13363 %uint_7\n      %25273 = OpIMul %uint %13105 %25036\n      %19959 = OpIAdd %uint %15091 %25273\n      %12695 = OpUDiv %uint %19959 %uint_5\n       %8213 = OpShiftLeftLogical %uint %12695 %uint_16\n       %7606 = OpBitwiseOr %uint %7605 %8213\n      %22018 = OpShiftRightLogical %uint %17435 %uint_9\n      %17646 = OpBitwiseAnd %uint %22018 %uint_7\n      %15092 = OpIMul %uint %12929 %17646\n      %13364 = OpShiftRightLogical %uint %10095 %uint_9\n      %25037 = OpBitwiseAnd %uint %13364 %uint_7\n      %25274 = OpIMul %uint %13105 %25037\n      %19960 = OpIAdd %uint %15092 %25274\n      %12696 = OpUDiv %uint %19960 %uint_5\n       %8269 = OpShiftLeftLogical %uint %12696 %uint_24\n       %6701 = OpBitwiseOr %uint %7606 %8269\n      %20437 = OpBitwiseAnd %uint %16624 %15927\n      %17436 = OpBitwiseAnd %uint %20437 %uint_1\n      %19572 = OpBitwiseAnd %uint %20437 %uint_8\n      %24945 = OpShiftLeftLogical %uint %19572 %uint_5\n      %17110 = OpBitwiseOr %uint %17436 %24945\n      %20892 = OpBitwiseAnd %uint %20437 %uint_64\n      %23332 = OpShiftLeftLogical %uint %20892 %uint_10\n      %17111 = OpBitwiseOr %uint %17110 %23332\n      %20893 = OpBitwiseAnd %uint %20437 %uint_512\n      %22059 = OpShiftLeftLogical %uint %20893 %uint_15\n       %8324 = OpBitwiseOr %uint %17111 %22059\n      %10433 = OpIMul %uint %8324 %uint_255\n      %18445 = OpIAdd %uint %6701 %10433\n               OpBranch %11730\n      %14539 = OpLabel\n      %10721 = OpNot %uint %16624\n      %15376 = OpBitwiseAnd %uint %10721 %uint_7\n      %17725 = OpIMul %uint %12929 %15376\n      %22019 = OpBitwiseAnd %uint %16624 %uint_7\n      %20438 = OpIMul %uint %13105 %22019\n      %19870 = OpIAdd %uint %17725 %20438\n      %13028 = OpUDiv %uint %19870 %uint_7\n      %23051 = OpShiftRightLogical %uint %10721 %uint_3\n       %8780 = OpBitwiseAnd %uint %23051 %uint_7\n      %15093 = OpIMul %uint %12929 %8780\n      %13365 = OpShiftRightLogical %uint %16624 %uint_3\n      %25038 = OpBitwiseAnd %uint %13365 %uint_7\n      %25275 = OpIMul %uint %13105 %25038\n      %19961 = OpIAdd %uint %15093 %25275\n      %12697 = OpUDiv %uint %19961 %uint_7\n       %8214 = OpShiftLeftLogical %uint %12697 %uint_8\n       %7607 = OpBitwiseOr %uint %13028 %8214\n      %22020 = OpShiftRightLogical %uint %10721 %uint_6\n      %17647 = OpBitwiseAnd %uint %22020 %uint_7\n      %15094 = OpIMul %uint %12929 %17647\n      %13366 = OpShiftRightLogical %uint %16624 %uint_6\n      %25039 = OpBitwiseAnd %uint %13366 %uint_7\n      %25276 = OpIMul %uint %13105 %25039\n      %19962 = OpIAdd %uint %15094 %25276\n      %12698 = OpUDiv %uint %19962 %uint_7\n       %8215 = OpShiftLeftLogical %uint %12698 %uint_16\n       %7608 = OpBitwiseOr %uint %7607 %8215\n      %22021 = OpShiftRightLogical %uint %10721 %uint_9\n      %17648 = OpBitwiseAnd %uint %22021 %uint_7\n      %15095 = OpIMul %uint %12929 %17648\n      %13367 = OpShiftRightLogical %uint %16624 %uint_9\n      %25040 = OpBitwiseAnd %uint %13367 %uint_7\n      %25277 = OpIMul %uint %13105 %25040\n      %19963 = OpIAdd %uint %15095 %25277\n      %12699 = OpUDiv %uint %19963 %uint_7\n       %9218 = OpShiftLeftLogical %uint %12699 %uint_24\n      %18053 = OpBitwiseOr %uint %7608 %9218\n               OpBranch %11730\n      %11730 = OpLabel\n      %20521 = OpPhi %uint %18445 %10661 %18053 %14539\n      %16625 = OpCompositeExtract %uint %12024 2\n               OpSelectionMerge %11731 None\n               OpBranchConditional %20101 %10662 %14540\n      %10662 = OpLabel\n      %17679 = OpBitwiseAnd %uint %16625 %uint_1170\n      %23970 = OpBitwiseAnd %uint %16625 %uint_2340\n      %21867 = OpShiftRightLogical %uint %23970 %uint_1\n       %8155 = OpBitwiseAnd %uint %17679 %21867\n      %24631 = OpShiftLeftLogical %uint %8155 %uint_1\n      %22978 = OpShiftRightLogical %uint %8155 %uint_1\n      %18826 = OpBitwiseOr %uint %24631 %22978\n      %15928 = OpBitwiseOr %uint %8155 %18826\n       %8473 = OpNot %uint %15928\n      %10096 = OpBitwiseAnd %uint %16625 %8473\n      %16314 = OpISub %uint %uint_2925 %10096\n      %17437 = OpBitwiseAnd %uint %16314 %8473\n      %17005 = OpBitwiseAnd %uint %17437 %uint_7\n      %13691 = OpIMul %uint %12930 %17005\n      %22022 = OpBitwiseAnd %uint %10096 %uint_7\n      %20439 = OpIMul %uint %13106 %22022\n      %19871 = OpIAdd %uint %13691 %20439\n      %13029 = OpUDiv %uint %19871 %uint_5\n      %23052 = OpShiftRightLogical %uint %17437 %uint_3\n       %8781 = OpBitwiseAnd %uint %23052 %uint_7\n      %15096 = OpIMul %uint %12930 %8781\n      %13368 = OpShiftRightLogical %uint %10096 %uint_3\n      %25041 = OpBitwiseAnd %uint %13368 %uint_7\n      %25278 = OpIMul %uint %13106 %25041\n      %19964 = OpIAdd %uint %15096 %25278\n      %12700 = OpUDiv %uint %19964 %uint_5\n       %8216 = OpShiftLeftLogical %uint %12700 %uint_8\n       %7609 = OpBitwiseOr %uint %13029 %8216\n      %22023 = OpShiftRightLogical %uint %17437 %uint_6\n      %17649 = OpBitwiseAnd %uint %22023 %uint_7\n      %15097 = OpIMul %uint %12930 %17649\n      %13369 = OpShiftRightLogical %uint %10096 %uint_6\n      %25042 = OpBitwiseAnd %uint %13369 %uint_7\n      %25279 = OpIMul %uint %13106 %25042\n      %19965 = OpIAdd %uint %15097 %25279\n      %12701 = OpUDiv %uint %19965 %uint_5\n       %8217 = OpShiftLeftLogical %uint %12701 %uint_16\n       %7610 = OpBitwiseOr %uint %7609 %8217\n      %22024 = OpShiftRightLogical %uint %17437 %uint_9\n      %17650 = OpBitwiseAnd %uint %22024 %uint_7\n      %15098 = OpIMul %uint %12930 %17650\n      %13370 = OpShiftRightLogical %uint %10096 %uint_9\n      %25043 = OpBitwiseAnd %uint %13370 %uint_7\n      %25280 = OpIMul %uint %13106 %25043\n      %19966 = OpIAdd %uint %15098 %25280\n      %12702 = OpUDiv %uint %19966 %uint_5\n       %8270 = OpShiftLeftLogical %uint %12702 %uint_24\n       %6702 = OpBitwiseOr %uint %7610 %8270\n      %20440 = OpBitwiseAnd %uint %16625 %15928\n      %17438 = OpBitwiseAnd %uint %20440 %uint_1\n      %19573 = OpBitwiseAnd %uint %20440 %uint_8\n      %24946 = OpShiftLeftLogical %uint %19573 %uint_5\n      %17112 = OpBitwiseOr %uint %17438 %24946\n      %20894 = OpBitwiseAnd %uint %20440 %uint_64\n      %23333 = OpShiftLeftLogical %uint %20894 %uint_10\n      %17113 = OpBitwiseOr %uint %17112 %23333\n      %20895 = OpBitwiseAnd %uint %20440 %uint_512\n      %22060 = OpShiftLeftLogical %uint %20895 %uint_15\n       %8325 = OpBitwiseOr %uint %17113 %22060\n      %10434 = OpIMul %uint %8325 %uint_255\n      %18446 = OpIAdd %uint %6702 %10434\n               OpBranch %11731\n      %14540 = OpLabel\n      %10722 = OpNot %uint %16625\n      %15377 = OpBitwiseAnd %uint %10722 %uint_7\n      %17726 = OpIMul %uint %12930 %15377\n      %22025 = OpBitwiseAnd %uint %16625 %uint_7\n      %20441 = OpIMul %uint %13106 %22025\n      %19872 = OpIAdd %uint %17726 %20441\n      %13030 = OpUDiv %uint %19872 %uint_7\n      %23053 = OpShiftRightLogical %uint %10722 %uint_3\n       %8782 = OpBitwiseAnd %uint %23053 %uint_7\n      %15099 = OpIMul %uint %12930 %8782\n      %13371 = OpShiftRightLogical %uint %16625 %uint_3\n      %25044 = OpBitwiseAnd %uint %13371 %uint_7\n      %25281 = OpIMul %uint %13106 %25044\n      %19967 = OpIAdd %uint %15099 %25281\n      %12703 = OpUDiv %uint %19967 %uint_7\n       %8218 = OpShiftLeftLogical %uint %12703 %uint_8\n       %7611 = OpBitwiseOr %uint %13030 %8218\n      %22026 = OpShiftRightLogical %uint %10722 %uint_6\n      %17651 = OpBitwiseAnd %uint %22026 %uint_7\n      %15100 = OpIMul %uint %12930 %17651\n      %13372 = OpShiftRightLogical %uint %16625 %uint_6\n      %25045 = OpBitwiseAnd %uint %13372 %uint_7\n      %25282 = OpIMul %uint %13106 %25045\n      %19968 = OpIAdd %uint %15100 %25282\n      %12704 = OpUDiv %uint %19968 %uint_7\n       %8219 = OpShiftLeftLogical %uint %12704 %uint_16\n       %7612 = OpBitwiseOr %uint %7611 %8219\n      %22027 = OpShiftRightLogical %uint %10722 %uint_9\n      %17652 = OpBitwiseAnd %uint %22027 %uint_7\n      %15101 = OpIMul %uint %12930 %17652\n      %13373 = OpShiftRightLogical %uint %16625 %uint_9\n      %25046 = OpBitwiseAnd %uint %13373 %uint_7\n      %25283 = OpIMul %uint %13106 %25046\n      %19969 = OpIAdd %uint %15101 %25283\n      %12705 = OpUDiv %uint %19969 %uint_7\n       %9219 = OpShiftLeftLogical %uint %12705 %uint_24\n      %18054 = OpBitwiseOr %uint %7612 %9219\n               OpBranch %11731\n      %11731 = OpLabel\n      %20522 = OpPhi %uint %18446 %10662 %18054 %14540\n      %16626 = OpCompositeExtract %uint %12024 3\n               OpSelectionMerge %11706 None\n               OpBranchConditional %20102 %10663 %14541\n      %10663 = OpLabel\n      %17680 = OpBitwiseAnd %uint %16626 %uint_1170\n      %23971 = OpBitwiseAnd %uint %16626 %uint_2340\n      %21868 = OpShiftRightLogical %uint %23971 %uint_1\n       %8156 = OpBitwiseAnd %uint %17680 %21868\n      %24632 = OpShiftLeftLogical %uint %8156 %uint_1\n      %22979 = OpShiftRightLogical %uint %8156 %uint_1\n      %18827 = OpBitwiseOr %uint %24632 %22979\n      %15929 = OpBitwiseOr %uint %8156 %18827\n       %8474 = OpNot %uint %15929\n      %10097 = OpBitwiseAnd %uint %16626 %8474\n      %16315 = OpISub %uint %uint_2925 %10097\n      %17439 = OpBitwiseAnd %uint %16315 %8474\n      %17006 = OpBitwiseAnd %uint %17439 %uint_7\n      %13692 = OpIMul %uint %12931 %17006\n      %22028 = OpBitwiseAnd %uint %10097 %uint_7\n      %20442 = OpIMul %uint %13107 %22028\n      %19873 = OpIAdd %uint %13692 %20442\n      %13031 = OpUDiv %uint %19873 %uint_5\n      %23057 = OpShiftRightLogical %uint %17439 %uint_3\n       %8783 = OpBitwiseAnd %uint %23057 %uint_7\n      %15102 = OpIMul %uint %12931 %8783\n      %13374 = OpShiftRightLogical %uint %10097 %uint_3\n      %25047 = OpBitwiseAnd %uint %13374 %uint_7\n      %25284 = OpIMul %uint %13107 %25047\n      %19970 = OpIAdd %uint %15102 %25284\n      %12706 = OpUDiv %uint %19970 %uint_5\n       %8220 = OpShiftLeftLogical %uint %12706 %uint_8\n       %7613 = OpBitwiseOr %uint %13031 %8220\n      %22029 = OpShiftRightLogical %uint %17439 %uint_6\n      %17653 = OpBitwiseAnd %uint %22029 %uint_7\n      %15103 = OpIMul %uint %12931 %17653\n      %13375 = OpShiftRightLogical %uint %10097 %uint_6\n      %25048 = OpBitwiseAnd %uint %13375 %uint_7\n      %25285 = OpIMul %uint %13107 %25048\n      %19971 = OpIAdd %uint %15103 %25285\n      %12707 = OpUDiv %uint %19971 %uint_5\n       %8221 = OpShiftLeftLogical %uint %12707 %uint_16\n       %7614 = OpBitwiseOr %uint %7613 %8221\n      %22030 = OpShiftRightLogical %uint %17439 %uint_9\n      %17654 = OpBitwiseAnd %uint %22030 %uint_7\n      %15104 = OpIMul %uint %12931 %17654\n      %13376 = OpShiftRightLogical %uint %10097 %uint_9\n      %25049 = OpBitwiseAnd %uint %13376 %uint_7\n      %25286 = OpIMul %uint %13107 %25049\n      %19972 = OpIAdd %uint %15104 %25286\n      %12708 = OpUDiv %uint %19972 %uint_5\n       %8271 = OpShiftLeftLogical %uint %12708 %uint_24\n       %6703 = OpBitwiseOr %uint %7614 %8271\n      %20443 = OpBitwiseAnd %uint %16626 %15929\n      %17440 = OpBitwiseAnd %uint %20443 %uint_1\n      %19574 = OpBitwiseAnd %uint %20443 %uint_8\n      %24947 = OpShiftLeftLogical %uint %19574 %uint_5\n      %17114 = OpBitwiseOr %uint %17440 %24947\n      %20896 = OpBitwiseAnd %uint %20443 %uint_64\n      %23334 = OpShiftLeftLogical %uint %20896 %uint_10\n      %17115 = OpBitwiseOr %uint %17114 %23334\n      %20897 = OpBitwiseAnd %uint %20443 %uint_512\n      %22061 = OpShiftLeftLogical %uint %20897 %uint_15\n       %8326 = OpBitwiseOr %uint %17115 %22061\n      %10435 = OpIMul %uint %8326 %uint_255\n      %18447 = OpIAdd %uint %6703 %10435\n               OpBranch %11706\n      %14541 = OpLabel\n      %10723 = OpNot %uint %16626\n      %15378 = OpBitwiseAnd %uint %10723 %uint_7\n      %17727 = OpIMul %uint %12931 %15378\n      %22031 = OpBitwiseAnd %uint %16626 %uint_7\n      %20444 = OpIMul %uint %13107 %22031\n      %19874 = OpIAdd %uint %17727 %20444\n      %13032 = OpUDiv %uint %19874 %uint_7\n      %23058 = OpShiftRightLogical %uint %10723 %uint_3\n       %8784 = OpBitwiseAnd %uint %23058 %uint_7\n      %15105 = OpIMul %uint %12931 %8784\n      %13377 = OpShiftRightLogical %uint %16626 %uint_3\n      %25050 = OpBitwiseAnd %uint %13377 %uint_7\n      %25287 = OpIMul %uint %13107 %25050\n      %19973 = OpIAdd %uint %15105 %25287\n      %12709 = OpUDiv %uint %19973 %uint_7\n       %8222 = OpShiftLeftLogical %uint %12709 %uint_8\n       %7615 = OpBitwiseOr %uint %13032 %8222\n      %22032 = OpShiftRightLogical %uint %10723 %uint_6\n      %17655 = OpBitwiseAnd %uint %22032 %uint_7\n      %15106 = OpIMul %uint %12931 %17655\n      %13378 = OpShiftRightLogical %uint %16626 %uint_6\n      %25051 = OpBitwiseAnd %uint %13378 %uint_7\n      %25288 = OpIMul %uint %13107 %25051\n      %19974 = OpIAdd %uint %15106 %25288\n      %12710 = OpUDiv %uint %19974 %uint_7\n       %8223 = OpShiftLeftLogical %uint %12710 %uint_16\n       %7616 = OpBitwiseOr %uint %7615 %8223\n      %22033 = OpShiftRightLogical %uint %10723 %uint_9\n      %17656 = OpBitwiseAnd %uint %22033 %uint_7\n      %15107 = OpIMul %uint %12931 %17656\n      %13379 = OpShiftRightLogical %uint %16626 %uint_9\n      %25052 = OpBitwiseAnd %uint %13379 %uint_7\n      %25289 = OpIMul %uint %13107 %25052\n      %19975 = OpIAdd %uint %15107 %25289\n      %12711 = OpUDiv %uint %19975 %uint_7\n       %9220 = OpShiftLeftLogical %uint %12711 %uint_24\n      %18055 = OpBitwiseOr %uint %7616 %9220\n               OpBranch %11706\n      %11706 = OpLabel\n      %17232 = OpPhi %uint %18447 %10663 %18055 %14541\n      %14586 = OpCompositeConstruct %v4uint %20520 %20521 %20522 %17232\n      %15405 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %23047\n               OpStore %15405 %14586\n               OpBranch %18021\n      %18021 = OpLabel\n               OpBranch %7206\n       %7206 = OpLabel\n               OpBranch %7207\n       %7207 = OpLabel\n               OpBranch %14903\n      %14903 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_dxt5a_r8_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x000062CA, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000017,\n    0x0000000B, 0x00000004, 0x00040015, 0x0000000C, 0x00000020, 0x00000001,\n    0x00040017, 0x00000012, 0x0000000C, 0x00000002, 0x00040017, 0x00000016,\n    0x0000000C, 0x00000003, 0x00020014, 0x00000009, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x0004002B, 0x0000000B, 0x000009E9, 0x00249249,\n    0x0004002B, 0x0000000B, 0x000009C8, 0x00492492, 0x0004002B, 0x0000000B,\n    0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B, 0x00000986, 0x00924924,\n    0x0004002B, 0x0000000B, 0x00000A10, 0x00000002, 0x0004002B, 0x0000000B,\n    0x00000944, 0x00DB6DB6, 0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000,\n    0x0004002B, 0x0000000B, 0x00000A1F, 0x00000007, 0x0004002B, 0x0000000B,\n    0x00000A13, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A22, 0x00000008,\n    0x0004002B, 0x0000000B, 0x00000A1C, 0x00000006, 0x0004002B, 0x0000000B,\n    0x00000A3A, 0x00000010, 0x0004002B, 0x0000000B, 0x00000A25, 0x00000009,\n    0x0004002B, 0x0000000B, 0x00000A52, 0x00000018, 0x0004002B, 0x0000000B,\n    0x0000003A, 0x00000492, 0x0004002B, 0x0000000B, 0x0000022D, 0x00000924,\n    0x0004002B, 0x0000000B, 0x00000908, 0x00000B6D, 0x0004002B, 0x0000000B,\n    0x00000A19, 0x00000005, 0x0004002B, 0x0000000B, 0x00000ACA, 0x00000040,\n    0x0004002B, 0x0000000B, 0x00000A28, 0x0000000A, 0x0004002B, 0x0000000B,\n    0x00000447, 0x00000200, 0x0004002B, 0x0000000B, 0x00000A37, 0x0000000F,\n    0x0004002B, 0x0000000B, 0x00000144, 0x000000FF, 0x0004002B, 0x0000000B,\n    0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00,\n    0x0004002B, 0x0000000C, 0x00000A17, 0x00000004, 0x0004002B, 0x0000000C,\n    0x00000A1D, 0x00000006, 0x0004002B, 0x0000000C, 0x00000A2C, 0x0000000B,\n    0x0004002B, 0x0000000C, 0x00000A38, 0x0000000F, 0x0004002B, 0x0000000C,\n    0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C, 0x00000A1A, 0x00000005,\n    0x0004002B, 0x0000000C, 0x00000A20, 0x00000007, 0x0004002B, 0x0000000C,\n    0x00000A23, 0x00000008, 0x0004002B, 0x0000000C, 0x00000A2F, 0x0000000C,\n    0x0004002B, 0x0000000C, 0x00000A14, 0x00000003, 0x0004002B, 0x0000000C,\n    0x00000A11, 0x00000002, 0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000,\n    0x000A001E, 0x00000489, 0x0000000B, 0x0000000B, 0x0000000B, 0x0000000B,\n    0x00000014, 0x0000000B, 0x0000000B, 0x0000000B, 0x00040020, 0x00000706,\n    0x00000009, 0x00000489, 0x0004003B, 0x00000706, 0x00000CE9, 0x00000009,\n    0x00040020, 0x00000288, 0x00000009, 0x0000000B, 0x00040020, 0x00000291,\n    0x00000009, 0x00000014, 0x00040020, 0x00000292, 0x00000001, 0x00000014,\n    0x0004003B, 0x00000292, 0x00000F48, 0x00000001, 0x0006002C, 0x00000014,\n    0x00000A24, 0x00000A10, 0x00000A0A, 0x00000A0A, 0x00040017, 0x0000000F,\n    0x00000009, 0x00000002, 0x0006002C, 0x00000014, 0x00000A3B, 0x00000A10,\n    0x00000A10, 0x00000A0A, 0x0003001D, 0x000007DC, 0x00000017, 0x0003001E,\n    0x000007B4, 0x000007DC, 0x00040020, 0x00000A31, 0x00000002, 0x000007B4,\n    0x0004003B, 0x00000A31, 0x0000107A, 0x00000002, 0x00040020, 0x00000294,\n    0x00000002, 0x00000017, 0x0007002C, 0x00000017, 0x0000007D, 0x00000A0A,\n    0x00000A22, 0x00000A0A, 0x00000A22, 0x0003001D, 0x000007DD, 0x00000017,\n    0x0003001E, 0x000007B5, 0x000007DD, 0x00040020, 0x00000A32, 0x00000002,\n    0x000007B5, 0x0004003B, 0x00000A32, 0x0000140E, 0x00000002, 0x0004002B,\n    0x0000000B, 0x00000A2E, 0x0000000C, 0x0004002B, 0x0000000B, 0x00000A16,\n    0x00000004, 0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020, 0x0006002C,\n    0x00000014, 0x00000BC3, 0x00000A16, 0x00000A6A, 0x00000A0D, 0x0007002C,\n    0x00000017, 0x000009CE, 0x000008A6, 0x000008A6, 0x000008A6, 0x000008A6,\n    0x0007002C, 0x00000017, 0x0000013D, 0x00000A22, 0x00000A22, 0x00000A22,\n    0x00000A22, 0x0007002C, 0x00000017, 0x0000072E, 0x000005FD, 0x000005FD,\n    0x000005FD, 0x000005FD, 0x0007002C, 0x00000017, 0x000002ED, 0x00000A3A,\n    0x00000A3A, 0x00000A3A, 0x00000A3A, 0x0007002C, 0x00000017, 0x0000064B,\n    0x00000144, 0x00000144, 0x00000144, 0x00000144, 0x0007002C, 0x00000017,\n    0x00000215, 0x00000A2E, 0x00000A2E, 0x00000A2E, 0x00000A2E, 0x00050036,\n    0x00000008, 0x0000161F, 0x00000000, 0x00000502, 0x000200F8, 0x00003B06,\n    0x000300F7, 0x00003A37, 0x00000000, 0x000300FB, 0x00000A0A, 0x00002E68,\n    0x000200F8, 0x00002E68, 0x00050041, 0x00000288, 0x000060D7, 0x00000CE9,\n    0x00000A0B, 0x0004003D, 0x0000000B, 0x00003526, 0x000060D7, 0x000500C7,\n    0x0000000B, 0x00005FDC, 0x00003526, 0x00000A0D, 0x000500AB, 0x00000009,\n    0x00004376, 0x00005FDC, 0x00000A0A, 0x000500C7, 0x0000000B, 0x00003028,\n    0x00003526, 0x00000A10, 0x000500AB, 0x00000009, 0x00004384, 0x00003028,\n    0x00000A0A, 0x000500C2, 0x0000000B, 0x00001EB0, 0x00003526, 0x00000A10,\n    0x000500C7, 0x0000000B, 0x000061E2, 0x00001EB0, 0x00000A13, 0x00050041,\n    0x00000288, 0x0000492C, 0x00000CE9, 0x00000A0E, 0x0004003D, 0x0000000B,\n    0x00005EAC, 0x0000492C, 0x00050041, 0x00000288, 0x00004EBA, 0x00000CE9,\n    0x00000A11, 0x0004003D, 0x0000000B, 0x00005788, 0x00004EBA, 0x00050041,\n    0x00000288, 0x00004EBB, 0x00000CE9, 0x00000A14, 0x0004003D, 0x0000000B,\n    0x00005789, 0x00004EBB, 0x00050041, 0x00000291, 0x00004EBC, 0x00000CE9,\n    0x00000A17, 0x0004003D, 0x00000014, 0x0000578A, 0x00004EBC, 0x00050041,\n    0x00000288, 0x00004EBD, 0x00000CE9, 0x00000A1A, 0x0004003D, 0x0000000B,\n    0x0000578B, 0x00004EBD, 0x00050041, 0x00000288, 0x00004EBE, 0x00000CE9,\n    0x00000A1D, 0x0004003D, 0x0000000B, 0x0000578C, 0x00004EBE, 0x00050041,\n    0x00000288, 0x00004E6E, 0x00000CE9, 0x00000A20, 0x0004003D, 0x0000000B,\n    0x000019C2, 0x00004E6E, 0x0004003D, 0x00000014, 0x00002A0E, 0x00000F48,\n    0x000500C4, 0x00000014, 0x0000538B, 0x00002A0E, 0x00000A24, 0x0007004F,\n    0x00000011, 0x000042F0, 0x0000538B, 0x0000538B, 0x00000000, 0x00000001,\n    0x0007004F, 0x00000011, 0x0000242F, 0x0000578A, 0x0000578A, 0x00000000,\n    0x00000001, 0x000500AE, 0x0000000F, 0x00004288, 0x000042F0, 0x0000242F,\n    0x0004009A, 0x00000009, 0x00006067, 0x00004288, 0x000300F7, 0x000036C2,\n    0x00000002, 0x000400FA, 0x00006067, 0x000055E8, 0x000036C2, 0x000200F8,\n    0x000055E8, 0x000200F9, 0x00003A37, 0x000200F8, 0x000036C2, 0x000500C4,\n    0x00000014, 0x000043C0, 0x0000538B, 0x00000A3B, 0x0004007C, 0x00000016,\n    0x000038B8, 0x000043C0, 0x00050051, 0x0000000C, 0x000022C9, 0x000038B8,\n    0x00000000, 0x00050051, 0x0000000C, 0x00001A9D, 0x000038B8, 0x00000002,\n    0x0004007C, 0x0000000C, 0x000053FD, 0x000019C2, 0x00050084, 0x0000000C,\n    0x00002C0F, 0x00001A9D, 0x000053FD, 0x00050051, 0x0000000C, 0x000044BE,\n    0x000038B8, 0x00000001, 0x00050080, 0x0000000C, 0x000056D4, 0x00002C0F,\n    0x000044BE, 0x0004007C, 0x0000000C, 0x00005785, 0x0000578C, 0x00050084,\n    0x0000000C, 0x00005FD7, 0x000056D4, 0x00005785, 0x00050080, 0x0000000C,\n    0x00002042, 0x000022C9, 0x00005FD7, 0x0004007C, 0x0000000B, 0x000028A4,\n    0x00002042, 0x00050080, 0x0000000B, 0x000038F6, 0x0000578B, 0x000028A4,\n    0x000400A8, 0x00000009, 0x00003014, 0x00004376, 0x000300F7, 0x00004A60,\n    0x00000002, 0x000400FA, 0x00003014, 0x0000260D, 0x0000426F, 0x000200F8,\n    0x0000260D, 0x00050051, 0x0000000B, 0x00004437, 0x0000538B, 0x00000000,\n    0x00050051, 0x0000000B, 0x00002BEE, 0x0000538B, 0x00000001, 0x00050051,\n    0x0000000B, 0x00004971, 0x0000538B, 0x00000002, 0x00050084, 0x0000000B,\n    0x000039EF, 0x00005789, 0x00004971, 0x00050080, 0x0000000B, 0x00004F62,\n    0x00002BEE, 0x000039EF, 0x00050084, 0x0000000B, 0x000054AC, 0x00005788,\n    0x00004F62, 0x00050080, 0x0000000B, 0x00004FAE, 0x00004437, 0x000054AC,\n    0x000500C4, 0x0000000B, 0x00002C67, 0x00004FAE, 0x00000A13, 0x000200F9,\n    0x00004A60, 0x000200F8, 0x0000426F, 0x000300F7, 0x00005BF0, 0x00000002,\n    0x000400FA, 0x00004384, 0x00005BE0, 0x00005F21, 0x000200F8, 0x00005BE0,\n    0x0004007C, 0x00000016, 0x0000277F, 0x0000538B, 0x000500C2, 0x0000000B,\n    0x00004C14, 0x00005788, 0x00000A1A, 0x000500C2, 0x0000000B, 0x0000497A,\n    0x00005789, 0x00000A17, 0x00050051, 0x0000000C, 0x00001A7E, 0x0000277F,\n    0x00000002, 0x000500C3, 0x0000000C, 0x00002F39, 0x00001A7E, 0x00000A11,\n    0x0004007C, 0x0000000C, 0x00005780, 0x0000497A, 0x00050084, 0x0000000C,\n    0x00001F02, 0x00002F39, 0x00005780, 0x00050051, 0x0000000C, 0x00006242,\n    0x0000277F, 0x00000001, 0x000500C3, 0x0000000C, 0x00004A6F, 0x00006242,\n    0x00000A17, 0x00050080, 0x0000000C, 0x00002B2C, 0x00001F02, 0x00004A6F,\n    0x0004007C, 0x0000000C, 0x00004202, 0x00004C14, 0x00050084, 0x0000000C,\n    0x00003A60, 0x00002B2C, 0x00004202, 0x00050051, 0x0000000C, 0x00006243,\n    0x0000277F, 0x00000000, 0x000500C3, 0x0000000C, 0x00004FC7, 0x00006243,\n    0x00000A1A, 0x00050080, 0x0000000C, 0x000049FC, 0x00003A60, 0x00004FC7,\n    0x000500C4, 0x0000000C, 0x0000225D, 0x000049FC, 0x00000A20, 0x000500C7,\n    0x0000000C, 0x00002CAA, 0x00001A7E, 0x00000A14, 0x000500C4, 0x0000000C,\n    0x00004CAE, 0x00002CAA, 0x00000A1A, 0x000500C3, 0x0000000C, 0x0000383E,\n    0x00006242, 0x00000A0E, 0x000500C7, 0x0000000C, 0x00005374, 0x0000383E,\n    0x00000A14, 0x000500C4, 0x0000000C, 0x000054CA, 0x00005374, 0x00000A14,\n    0x000500C5, 0x0000000C, 0x000042CE, 0x00004CAE, 0x000054CA, 0x000500C7,\n    0x0000000C, 0x000050D5, 0x00006243, 0x00000A20, 0x000500C5, 0x0000000C,\n    0x00003ADD, 0x000042CE, 0x000050D5, 0x000500C5, 0x0000000C, 0x000043B6,\n    0x0000225D, 0x00003ADD, 0x000500C4, 0x0000000C, 0x00005E50, 0x000043B6,\n    0x00000A13, 0x000500C3, 0x0000000C, 0x000032D7, 0x00006242, 0x00000A14,\n    0x000500C6, 0x0000000C, 0x000026C9, 0x000032D7, 0x00002F39, 0x000500C7,\n    0x0000000C, 0x00004199, 0x000026C9, 0x00000A0E, 0x000500C3, 0x0000000C,\n    0x00002590, 0x00006243, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000505E,\n    0x00002590, 0x00000A14, 0x000500C4, 0x0000000C, 0x0000541D, 0x00004199,\n    0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BA, 0x0000505E, 0x0000541D,\n    0x000500C7, 0x0000000C, 0x00005076, 0x00006242, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x00005228, 0x00005076, 0x00000A17, 0x000500C4, 0x0000000C,\n    0x00001997, 0x000022BA, 0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FE,\n    0x00005228, 0x00001997, 0x000500C4, 0x0000000C, 0x00001C00, 0x00004199,\n    0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C81, 0x000047FE, 0x00001C00,\n    0x000500C7, 0x0000000C, 0x000050AF, 0x00005E50, 0x00000A38, 0x000500C5,\n    0x0000000C, 0x00003C70, 0x00003C81, 0x000050AF, 0x000500C3, 0x0000000C,\n    0x00003745, 0x00005E50, 0x00000A17, 0x000500C7, 0x0000000C, 0x000018B8,\n    0x00003745, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000547E, 0x000018B8,\n    0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A8, 0x00003C70, 0x0000547E,\n    0x000500C3, 0x0000000C, 0x00003A6E, 0x00005E50, 0x00000A1A, 0x000500C7,\n    0x0000000C, 0x000018B9, 0x00003A6E, 0x00000A20, 0x000500C4, 0x0000000C,\n    0x0000547F, 0x000018B9, 0x00000A23, 0x000500C5, 0x0000000C, 0x0000456F,\n    0x000045A8, 0x0000547F, 0x000500C3, 0x0000000C, 0x00003C88, 0x00005E50,\n    0x00000A23, 0x000500C4, 0x0000000C, 0x00002824, 0x00003C88, 0x00000A2F,\n    0x000500C5, 0x0000000C, 0x00003B79, 0x0000456F, 0x00002824, 0x0004007C,\n    0x0000000B, 0x000041E5, 0x00003B79, 0x000200F9, 0x00005BF0, 0x000200F8,\n    0x00005F21, 0x0004007C, 0x00000012, 0x000059D8, 0x000042F0, 0x000500C2,\n    0x0000000B, 0x00005668, 0x00005788, 0x00000A1A, 0x00050051, 0x0000000C,\n    0x00003905, 0x000059D8, 0x00000001, 0x000500C3, 0x0000000C, 0x00002F3A,\n    0x00003905, 0x00000A1A, 0x0004007C, 0x0000000C, 0x00005781, 0x00005668,\n    0x00050084, 0x0000000C, 0x00001F03, 0x00002F3A, 0x00005781, 0x00050051,\n    0x0000000C, 0x00006244, 0x000059D8, 0x00000000, 0x000500C3, 0x0000000C,\n    0x00004FC8, 0x00006244, 0x00000A1A, 0x00050080, 0x0000000C, 0x000049B0,\n    0x00001F03, 0x00004FC8, 0x000500C4, 0x0000000C, 0x0000254A, 0x000049B0,\n    0x00000A1D, 0x000500C3, 0x0000000C, 0x0000603B, 0x00003905, 0x00000A0E,\n    0x000500C7, 0x0000000C, 0x0000539A, 0x0000603B, 0x00000A20, 0x000500C4,\n    0x0000000C, 0x0000534A, 0x0000539A, 0x00000A14, 0x000500C7, 0x0000000C,\n    0x00004EA5, 0x00006244, 0x00000A20, 0x000500C5, 0x0000000C, 0x00002B1A,\n    0x0000534A, 0x00004EA5, 0x000500C5, 0x0000000C, 0x000043B7, 0x0000254A,\n    0x00002B1A, 0x000500C4, 0x0000000C, 0x00005E63, 0x000043B7, 0x00000A13,\n    0x000500C3, 0x0000000C, 0x000031DE, 0x00003905, 0x00000A17, 0x000500C7,\n    0x0000000C, 0x00005447, 0x000031DE, 0x00000A0E, 0x000500C3, 0x0000000C,\n    0x000028A6, 0x00006244, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000511E,\n    0x000028A6, 0x00000A14, 0x000500C3, 0x0000000C, 0x000028B9, 0x00003905,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x0000505F, 0x000028B9, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x0000541E, 0x0000505F, 0x00000A0E, 0x000500C6,\n    0x0000000C, 0x000022BB, 0x0000511E, 0x0000541E, 0x000500C7, 0x0000000C,\n    0x00005077, 0x00003905, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005229,\n    0x00005077, 0x00000A17, 0x000500C4, 0x0000000C, 0x00001998, 0x000022BB,\n    0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FF, 0x00005229, 0x00001998,\n    0x000500C4, 0x0000000C, 0x00001C01, 0x00005447, 0x00000A2C, 0x000500C5,\n    0x0000000C, 0x00003C82, 0x000047FF, 0x00001C01, 0x000500C7, 0x0000000C,\n    0x000050B0, 0x00005E63, 0x00000A38, 0x000500C5, 0x0000000C, 0x00003C71,\n    0x00003C82, 0x000050B0, 0x000500C3, 0x0000000C, 0x00003746, 0x00005E63,\n    0x00000A17, 0x000500C7, 0x0000000C, 0x000018BA, 0x00003746, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x00005480, 0x000018BA, 0x00000A1A, 0x000500C5,\n    0x0000000C, 0x000045A9, 0x00003C71, 0x00005480, 0x000500C3, 0x0000000C,\n    0x00003A6F, 0x00005E63, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018BB,\n    0x00003A6F, 0x00000A20, 0x000500C4, 0x0000000C, 0x00005481, 0x000018BB,\n    0x00000A23, 0x000500C5, 0x0000000C, 0x00004570, 0x000045A9, 0x00005481,\n    0x000500C3, 0x0000000C, 0x00003C89, 0x00005E63, 0x00000A23, 0x000500C4,\n    0x0000000C, 0x00002825, 0x00003C89, 0x00000A2F, 0x000500C5, 0x0000000C,\n    0x00003B7A, 0x00004570, 0x00002825, 0x0004007C, 0x0000000B, 0x000041E6,\n    0x00003B7A, 0x000200F9, 0x00005BF0, 0x000200F8, 0x00005BF0, 0x000700F5,\n    0x0000000B, 0x0000292C, 0x000041E5, 0x00005BE0, 0x000041E6, 0x00005F21,\n    0x000200F9, 0x00004A60, 0x000200F8, 0x00004A60, 0x000700F5, 0x0000000B,\n    0x00002C70, 0x00002C67, 0x0000260D, 0x0000292C, 0x00005BF0, 0x00050080,\n    0x0000000B, 0x000048BD, 0x00002C70, 0x00005EAC, 0x000500C2, 0x0000000B,\n    0x00003D52, 0x000048BD, 0x00000A17, 0x00060041, 0x00000294, 0x00004FAF,\n    0x0000107A, 0x00000A0B, 0x00003D52, 0x0004003D, 0x00000017, 0x00001CAA,\n    0x00004FAF, 0x000500AA, 0x00000009, 0x000035C0, 0x000061E2, 0x00000A0D,\n    0x000500AA, 0x00000009, 0x00005376, 0x000061E2, 0x00000A10, 0x000500A6,\n    0x00000009, 0x00005686, 0x000035C0, 0x00005376, 0x000300F7, 0x00003463,\n    0x00000000, 0x000400FA, 0x00005686, 0x00002957, 0x00003463, 0x000200F8,\n    0x00002957, 0x000500C7, 0x00000017, 0x0000475F, 0x00001CAA, 0x000009CE,\n    0x000500C4, 0x00000017, 0x000024D1, 0x0000475F, 0x0000013D, 0x000500C7,\n    0x00000017, 0x000050AC, 0x00001CAA, 0x0000072E, 0x000500C2, 0x00000017,\n    0x0000448D, 0x000050AC, 0x0000013D, 0x000500C5, 0x00000017, 0x00003FF8,\n    0x000024D1, 0x0000448D, 0x000200F9, 0x00003463, 0x000200F8, 0x00003463,\n    0x000700F5, 0x00000017, 0x00005879, 0x00001CAA, 0x00004A60, 0x00003FF8,\n    0x00002957, 0x000500AA, 0x00000009, 0x00004CB6, 0x000061E2, 0x00000A13,\n    0x000500A6, 0x00000009, 0x00003B23, 0x00005376, 0x00004CB6, 0x000300F7,\n    0x00003A1A, 0x00000000, 0x000400FA, 0x00003B23, 0x00002B38, 0x00003A1A,\n    0x000200F8, 0x00002B38, 0x000500C4, 0x00000017, 0x00005E17, 0x00005879,\n    0x000002ED, 0x000500C2, 0x00000017, 0x00003BE7, 0x00005879, 0x000002ED,\n    0x000500C5, 0x00000017, 0x000029E8, 0x00005E17, 0x00003BE7, 0x000200F9,\n    0x00003A1A, 0x000200F8, 0x00003A1A, 0x000700F5, 0x00000017, 0x00002AAC,\n    0x00005879, 0x00003463, 0x000029E8, 0x00002B38, 0x000300F7, 0x00006070,\n    0x00000002, 0x000400FA, 0x00004376, 0x000055E9, 0x00001C25, 0x000200F8,\n    0x000055E9, 0x000200F9, 0x00006070, 0x000200F8, 0x00001C25, 0x000200F9,\n    0x00006070, 0x000200F8, 0x00006070, 0x000700F5, 0x0000000B, 0x00002C71,\n    0x00000A6A, 0x000055E9, 0x00000A3A, 0x00001C25, 0x00050080, 0x0000000B,\n    0x000048BE, 0x000048BD, 0x00002C71, 0x000500C2, 0x0000000B, 0x00003D53,\n    0x000048BE, 0x00000A17, 0x00060041, 0x00000294, 0x00005566, 0x0000107A,\n    0x00000A0B, 0x00003D53, 0x0004003D, 0x00000017, 0x00003910, 0x00005566,\n    0x000300F7, 0x00003A1B, 0x00000000, 0x000400FA, 0x00005686, 0x00002958,\n    0x00003A1B, 0x000200F8, 0x00002958, 0x000500C7, 0x00000017, 0x00004760,\n    0x00003910, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D2, 0x00004760,\n    0x0000013D, 0x000500C7, 0x00000017, 0x000050AD, 0x00003910, 0x0000072E,\n    0x000500C2, 0x00000017, 0x0000448E, 0x000050AD, 0x0000013D, 0x000500C5,\n    0x00000017, 0x00003FF9, 0x000024D2, 0x0000448E, 0x000200F9, 0x00003A1B,\n    0x000200F8, 0x00003A1B, 0x000700F5, 0x00000017, 0x00002AAD, 0x00003910,\n    0x00006070, 0x00003FF9, 0x00002958, 0x000300F7, 0x00002DA2, 0x00000000,\n    0x000400FA, 0x00003B23, 0x00002B39, 0x00002DA2, 0x000200F8, 0x00002B39,\n    0x000500C4, 0x00000017, 0x00005E18, 0x00002AAD, 0x000002ED, 0x000500C2,\n    0x00000017, 0x00003BE8, 0x00002AAD, 0x000002ED, 0x000500C5, 0x00000017,\n    0x000029E9, 0x00005E18, 0x00003BE8, 0x000200F9, 0x00002DA2, 0x000200F8,\n    0x00002DA2, 0x000700F5, 0x00000017, 0x00004D8D, 0x00002AAD, 0x00003A1B,\n    0x000029E9, 0x00002B39, 0x0009004F, 0x00000017, 0x00005675, 0x00002AAC,\n    0x00002AAC, 0x00000000, 0x00000000, 0x00000002, 0x00000002, 0x000500C2,\n    0x00000017, 0x00003080, 0x00005675, 0x0000007D, 0x000500C7, 0x00000017,\n    0x00002376, 0x00003080, 0x0000064B, 0x0009004F, 0x00000017, 0x000042A8,\n    0x00004D8D, 0x00004D8D, 0x00000000, 0x00000000, 0x00000002, 0x00000002,\n    0x000500C2, 0x00000017, 0x00001DD8, 0x000042A8, 0x0000007D, 0x000500C7,\n    0x00000017, 0x000019B9, 0x00001DD8, 0x0000064B, 0x00050051, 0x0000000B,\n    0x00004641, 0x00002AAC, 0x00000000, 0x00050051, 0x0000000B, 0x00001880,\n    0x00002AAC, 0x00000002, 0x00050051, 0x0000000B, 0x00001DD9, 0x00004D8D,\n    0x00000000, 0x00050051, 0x0000000B, 0x000026FC, 0x00004D8D, 0x00000002,\n    0x00070050, 0x00000017, 0x00003C0F, 0x00004641, 0x00001880, 0x00001DD9,\n    0x000026FC, 0x000500C2, 0x00000017, 0x0000278A, 0x00003C0F, 0x000002ED,\n    0x00050051, 0x0000000B, 0x00005D24, 0x00002AAC, 0x00000001, 0x00050051,\n    0x0000000B, 0x00005FDB, 0x00002AAC, 0x00000003, 0x00050051, 0x0000000B,\n    0x00001DDA, 0x00004D8D, 0x00000001, 0x00050051, 0x0000000B, 0x0000275B,\n    0x00004D8D, 0x00000003, 0x00070050, 0x00000017, 0x00004137, 0x00005D24,\n    0x00005FDB, 0x00001DDA, 0x0000275B, 0x000500C7, 0x00000017, 0x000021E7,\n    0x00004137, 0x0000064B, 0x000500C4, 0x00000017, 0x00004E4B, 0x000021E7,\n    0x000002ED, 0x000500C5, 0x00000017, 0x00003F71, 0x0000278A, 0x00004E4B,\n    0x00050051, 0x0000000B, 0x00004E80, 0x00003F71, 0x00000000, 0x00050051,\n    0x0000000B, 0x00001966, 0x00002376, 0x00000000, 0x00050051, 0x0000000B,\n    0x00003330, 0x00002376, 0x00000001, 0x000500B2, 0x00000009, 0x00004E83,\n    0x00001966, 0x00003330, 0x000300F7, 0x00002DC8, 0x00000000, 0x000400FA,\n    0x00004E83, 0x00002990, 0x000055A0, 0x000200F8, 0x00002990, 0x000500C7,\n    0x0000000B, 0x000044F9, 0x00004E80, 0x000009C8, 0x000500C7, 0x0000000B,\n    0x00005D8C, 0x00004E80, 0x00000986, 0x000500C2, 0x0000000B, 0x00005554,\n    0x00005D8C, 0x00000A0D, 0x000500C7, 0x0000000B, 0x00001FC5, 0x000044F9,\n    0x00005554, 0x000500C4, 0x0000000B, 0x00006021, 0x00001FC5, 0x00000A0D,\n    0x000500C2, 0x0000000B, 0x000059AC, 0x00001FC5, 0x00000A0D, 0x000500C5,\n    0x0000000B, 0x00004969, 0x00006021, 0x000059AC, 0x000500C5, 0x0000000B,\n    0x00003EB1, 0x00001FC5, 0x00004969, 0x000500C7, 0x0000000B, 0x00004785,\n    0x00004E80, 0x000009E9, 0x000500C5, 0x0000000B, 0x0000395D, 0x00004785,\n    0x00000944, 0x000500C7, 0x0000000B, 0x00004FB3, 0x0000395D, 0x00003EB1,\n    0x000500C2, 0x0000000B, 0x0000503B, 0x000044F9, 0x00000A0D, 0x000500C5,\n    0x0000000B, 0x0000615A, 0x00004785, 0x0000503B, 0x000500C2, 0x0000000B,\n    0x000055A2, 0x00005D8C, 0x00000A10, 0x000500C5, 0x0000000B, 0x00005892,\n    0x0000615A, 0x000055A2, 0x000500C6, 0x0000000B, 0x00001E29, 0x00005892,\n    0x000009E9, 0x000400C8, 0x0000000B, 0x00002544, 0x0000503B, 0x000500C7,\n    0x0000000B, 0x0000391D, 0x00004785, 0x00002544, 0x000400C8, 0x0000000B,\n    0x000020E9, 0x000055A2, 0x000500C7, 0x0000000B, 0x00002C8F, 0x0000391D,\n    0x000020E9, 0x000500C5, 0x0000000B, 0x00001A8F, 0x00004E80, 0x00001E29,\n    0x00050082, 0x0000000B, 0x00004C35, 0x00001A8F, 0x000009E9, 0x000500C5,\n    0x0000000B, 0x00003A17, 0x00004C35, 0x00002C8F, 0x000500C4, 0x0000000B,\n    0x00004734, 0x00002C8F, 0x00000A10, 0x000500C5, 0x0000000B, 0x00003BFA,\n    0x00003A17, 0x00004734, 0x000400C8, 0x0000000B, 0x00002F7A, 0x00003EB1,\n    0x000500C7, 0x0000000B, 0x00004850, 0x00003BFA, 0x00002F7A, 0x000500C5,\n    0x0000000B, 0x0000186C, 0x00004850, 0x00004FB3, 0x000200F9, 0x00002DC8,\n    0x000200F8, 0x000055A0, 0x000500C7, 0x0000000B, 0x00004E6F, 0x00004E80,\n    0x000009E9, 0x000500C7, 0x0000000B, 0x00005D66, 0x00004E80, 0x000009C8,\n    0x000500C2, 0x0000000B, 0x000056E7, 0x00005D66, 0x00000A0D, 0x000500C5,\n    0x0000000B, 0x00005DC0, 0x00004E6F, 0x000056E7, 0x000500C7, 0x0000000B,\n    0x00004C8F, 0x00004E80, 0x00000986, 0x000500C2, 0x0000000B, 0x00005087,\n    0x00004C8F, 0x00000A10, 0x000500C5, 0x0000000B, 0x00005EDF, 0x00005DC0,\n    0x00005087, 0x000500C6, 0x0000000B, 0x00001E2A, 0x00005EDF, 0x000009E9,\n    0x000400C8, 0x0000000B, 0x00002545, 0x000056E7, 0x000500C7, 0x0000000B,\n    0x0000391E, 0x00004E6F, 0x00002545, 0x000400C8, 0x0000000B, 0x000020EA,\n    0x00005087, 0x000500C7, 0x0000000B, 0x00002C90, 0x0000391E, 0x000020EA,\n    0x000500C5, 0x0000000B, 0x00001A90, 0x00004E80, 0x00001E2A, 0x00050082,\n    0x0000000B, 0x00004C36, 0x00001A90, 0x000009E9, 0x000500C5, 0x0000000B,\n    0x00003A18, 0x00004C36, 0x00002C90, 0x000500C4, 0x0000000B, 0x000046E8,\n    0x00002C90, 0x00000A0D, 0x000500C5, 0x0000000B, 0x00003E88, 0x00003A18,\n    0x000046E8, 0x000500C4, 0x0000000B, 0x00001FB6, 0x00002C90, 0x00000A10,\n    0x000500C5, 0x0000000B, 0x00001E80, 0x00003E88, 0x00001FB6, 0x000200F9,\n    0x00002DC8, 0x000200F8, 0x00002DC8, 0x000700F5, 0x0000000B, 0x000043D0,\n    0x0000186C, 0x00002990, 0x00001E80, 0x000055A0, 0x00050051, 0x0000000B,\n    0x00005A0E, 0x00003F71, 0x00000001, 0x00050051, 0x0000000B, 0x00003281,\n    0x00002376, 0x00000002, 0x00050051, 0x0000000B, 0x00003331, 0x00002376,\n    0x00000003, 0x000500B2, 0x00000009, 0x00004E84, 0x00003281, 0x00003331,\n    0x000300F7, 0x00002DC9, 0x00000000, 0x000400FA, 0x00004E84, 0x00002991,\n    0x000055A1, 0x000200F8, 0x00002991, 0x000500C7, 0x0000000B, 0x000044FA,\n    0x00005A0E, 0x000009C8, 0x000500C7, 0x0000000B, 0x00005D8D, 0x00005A0E,\n    0x00000986, 0x000500C2, 0x0000000B, 0x00005555, 0x00005D8D, 0x00000A0D,\n    0x000500C7, 0x0000000B, 0x00001FC6, 0x000044FA, 0x00005555, 0x000500C4,\n    0x0000000B, 0x00006022, 0x00001FC6, 0x00000A0D, 0x000500C2, 0x0000000B,\n    0x000059AD, 0x00001FC6, 0x00000A0D, 0x000500C5, 0x0000000B, 0x0000496A,\n    0x00006022, 0x000059AD, 0x000500C5, 0x0000000B, 0x00003EB2, 0x00001FC6,\n    0x0000496A, 0x000500C7, 0x0000000B, 0x00004786, 0x00005A0E, 0x000009E9,\n    0x000500C5, 0x0000000B, 0x0000395E, 0x00004786, 0x00000944, 0x000500C7,\n    0x0000000B, 0x00004FB4, 0x0000395E, 0x00003EB2, 0x000500C2, 0x0000000B,\n    0x0000503C, 0x000044FA, 0x00000A0D, 0x000500C5, 0x0000000B, 0x0000615B,\n    0x00004786, 0x0000503C, 0x000500C2, 0x0000000B, 0x000055A3, 0x00005D8D,\n    0x00000A10, 0x000500C5, 0x0000000B, 0x00005893, 0x0000615B, 0x000055A3,\n    0x000500C6, 0x0000000B, 0x00001E2B, 0x00005893, 0x000009E9, 0x000400C8,\n    0x0000000B, 0x00002546, 0x0000503C, 0x000500C7, 0x0000000B, 0x0000391F,\n    0x00004786, 0x00002546, 0x000400C8, 0x0000000B, 0x000020EB, 0x000055A3,\n    0x000500C7, 0x0000000B, 0x00002C91, 0x0000391F, 0x000020EB, 0x000500C5,\n    0x0000000B, 0x00001A91, 0x00005A0E, 0x00001E2B, 0x00050082, 0x0000000B,\n    0x00004C37, 0x00001A91, 0x000009E9, 0x000500C5, 0x0000000B, 0x00003A19,\n    0x00004C37, 0x00002C91, 0x000500C4, 0x0000000B, 0x00004735, 0x00002C91,\n    0x00000A10, 0x000500C5, 0x0000000B, 0x00003BFB, 0x00003A19, 0x00004735,\n    0x000400C8, 0x0000000B, 0x00002F7B, 0x00003EB2, 0x000500C7, 0x0000000B,\n    0x00004851, 0x00003BFB, 0x00002F7B, 0x000500C5, 0x0000000B, 0x0000186D,\n    0x00004851, 0x00004FB4, 0x000200F9, 0x00002DC9, 0x000200F8, 0x000055A1,\n    0x000500C7, 0x0000000B, 0x00004E70, 0x00005A0E, 0x000009E9, 0x000500C7,\n    0x0000000B, 0x00005D67, 0x00005A0E, 0x000009C8, 0x000500C2, 0x0000000B,\n    0x000056E8, 0x00005D67, 0x00000A0D, 0x000500C5, 0x0000000B, 0x00005DC1,\n    0x00004E70, 0x000056E8, 0x000500C7, 0x0000000B, 0x00004C90, 0x00005A0E,\n    0x00000986, 0x000500C2, 0x0000000B, 0x00005088, 0x00004C90, 0x00000A10,\n    0x000500C5, 0x0000000B, 0x00005EE0, 0x00005DC1, 0x00005088, 0x000500C6,\n    0x0000000B, 0x00001E2C, 0x00005EE0, 0x000009E9, 0x000400C8, 0x0000000B,\n    0x00002547, 0x000056E8, 0x000500C7, 0x0000000B, 0x00003920, 0x00004E70,\n    0x00002547, 0x000400C8, 0x0000000B, 0x000020EC, 0x00005088, 0x000500C7,\n    0x0000000B, 0x00002C92, 0x00003920, 0x000020EC, 0x000500C5, 0x0000000B,\n    0x00001A92, 0x00005A0E, 0x00001E2C, 0x00050082, 0x0000000B, 0x00004C38,\n    0x00001A92, 0x000009E9, 0x000500C5, 0x0000000B, 0x00003A1C, 0x00004C38,\n    0x00002C92, 0x000500C4, 0x0000000B, 0x000046E9, 0x00002C92, 0x00000A0D,\n    0x000500C5, 0x0000000B, 0x00003E89, 0x00003A1C, 0x000046E9, 0x000500C4,\n    0x0000000B, 0x00001FB7, 0x00002C92, 0x00000A10, 0x000500C5, 0x0000000B,\n    0x00001E81, 0x00003E89, 0x00001FB7, 0x000200F9, 0x00002DC9, 0x000200F8,\n    0x00002DC9, 0x000700F5, 0x0000000B, 0x000043D1, 0x0000186D, 0x00002991,\n    0x00001E81, 0x000055A1, 0x00050051, 0x0000000B, 0x00005A0F, 0x00003F71,\n    0x00000002, 0x00050051, 0x0000000B, 0x00003282, 0x000019B9, 0x00000000,\n    0x00050051, 0x0000000B, 0x00003332, 0x000019B9, 0x00000001, 0x000500B2,\n    0x00000009, 0x00004E85, 0x00003282, 0x00003332, 0x000300F7, 0x00002DCA,\n    0x00000000, 0x000400FA, 0x00004E85, 0x00002992, 0x000055A5, 0x000200F8,\n    0x00002992, 0x000500C7, 0x0000000B, 0x000044FB, 0x00005A0F, 0x000009C8,\n    0x000500C7, 0x0000000B, 0x00005D8E, 0x00005A0F, 0x00000986, 0x000500C2,\n    0x0000000B, 0x00005556, 0x00005D8E, 0x00000A0D, 0x000500C7, 0x0000000B,\n    0x00001FC7, 0x000044FB, 0x00005556, 0x000500C4, 0x0000000B, 0x00006023,\n    0x00001FC7, 0x00000A0D, 0x000500C2, 0x0000000B, 0x000059AE, 0x00001FC7,\n    0x00000A0D, 0x000500C5, 0x0000000B, 0x0000496B, 0x00006023, 0x000059AE,\n    0x000500C5, 0x0000000B, 0x00003EB3, 0x00001FC7, 0x0000496B, 0x000500C7,\n    0x0000000B, 0x00004787, 0x00005A0F, 0x000009E9, 0x000500C5, 0x0000000B,\n    0x0000395F, 0x00004787, 0x00000944, 0x000500C7, 0x0000000B, 0x00004FB5,\n    0x0000395F, 0x00003EB3, 0x000500C2, 0x0000000B, 0x0000503D, 0x000044FB,\n    0x00000A0D, 0x000500C5, 0x0000000B, 0x0000615C, 0x00004787, 0x0000503D,\n    0x000500C2, 0x0000000B, 0x000055A4, 0x00005D8E, 0x00000A10, 0x000500C5,\n    0x0000000B, 0x00005894, 0x0000615C, 0x000055A4, 0x000500C6, 0x0000000B,\n    0x00001E2D, 0x00005894, 0x000009E9, 0x000400C8, 0x0000000B, 0x00002548,\n    0x0000503D, 0x000500C7, 0x0000000B, 0x00003921, 0x00004787, 0x00002548,\n    0x000400C8, 0x0000000B, 0x000020ED, 0x000055A4, 0x000500C7, 0x0000000B,\n    0x00002C93, 0x00003921, 0x000020ED, 0x000500C5, 0x0000000B, 0x00001A93,\n    0x00005A0F, 0x00001E2D, 0x00050082, 0x0000000B, 0x00004C39, 0x00001A93,\n    0x000009E9, 0x000500C5, 0x0000000B, 0x00003A1D, 0x00004C39, 0x00002C93,\n    0x000500C4, 0x0000000B, 0x00004736, 0x00002C93, 0x00000A10, 0x000500C5,\n    0x0000000B, 0x00003BFC, 0x00003A1D, 0x00004736, 0x000400C8, 0x0000000B,\n    0x00002F7C, 0x00003EB3, 0x000500C7, 0x0000000B, 0x00004852, 0x00003BFC,\n    0x00002F7C, 0x000500C5, 0x0000000B, 0x0000186E, 0x00004852, 0x00004FB5,\n    0x000200F9, 0x00002DCA, 0x000200F8, 0x000055A5, 0x000500C7, 0x0000000B,\n    0x00004E71, 0x00005A0F, 0x000009E9, 0x000500C7, 0x0000000B, 0x00005D68,\n    0x00005A0F, 0x000009C8, 0x000500C2, 0x0000000B, 0x000056E9, 0x00005D68,\n    0x00000A0D, 0x000500C5, 0x0000000B, 0x00005DC2, 0x00004E71, 0x000056E9,\n    0x000500C7, 0x0000000B, 0x00004C91, 0x00005A0F, 0x00000986, 0x000500C2,\n    0x0000000B, 0x00005089, 0x00004C91, 0x00000A10, 0x000500C5, 0x0000000B,\n    0x00005EE1, 0x00005DC2, 0x00005089, 0x000500C6, 0x0000000B, 0x00001E2E,\n    0x00005EE1, 0x000009E9, 0x000400C8, 0x0000000B, 0x00002549, 0x000056E9,\n    0x000500C7, 0x0000000B, 0x00003922, 0x00004E71, 0x00002549, 0x000400C8,\n    0x0000000B, 0x000020EE, 0x00005089, 0x000500C7, 0x0000000B, 0x00002C94,\n    0x00003922, 0x000020EE, 0x000500C5, 0x0000000B, 0x00001A94, 0x00005A0F,\n    0x00001E2E, 0x00050082, 0x0000000B, 0x00004C3A, 0x00001A94, 0x000009E9,\n    0x000500C5, 0x0000000B, 0x00003A1E, 0x00004C3A, 0x00002C94, 0x000500C4,\n    0x0000000B, 0x000046EA, 0x00002C94, 0x00000A0D, 0x000500C5, 0x0000000B,\n    0x00003E8A, 0x00003A1E, 0x000046EA, 0x000500C4, 0x0000000B, 0x00001FB8,\n    0x00002C94, 0x00000A10, 0x000500C5, 0x0000000B, 0x00001E82, 0x00003E8A,\n    0x00001FB8, 0x000200F9, 0x00002DCA, 0x000200F8, 0x00002DCA, 0x000700F5,\n    0x0000000B, 0x000043D2, 0x0000186E, 0x00002992, 0x00001E82, 0x000055A5,\n    0x00050051, 0x0000000B, 0x00005A10, 0x00003F71, 0x00000003, 0x00050051,\n    0x0000000B, 0x00003283, 0x000019B9, 0x00000002, 0x00050051, 0x0000000B,\n    0x00003333, 0x000019B9, 0x00000003, 0x000500B2, 0x00000009, 0x00004E86,\n    0x00003283, 0x00003333, 0x000300F7, 0x00002DB5, 0x00000000, 0x000400FA,\n    0x00004E86, 0x00002993, 0x000055A7, 0x000200F8, 0x00002993, 0x000500C7,\n    0x0000000B, 0x000044FC, 0x00005A10, 0x000009C8, 0x000500C7, 0x0000000B,\n    0x00005D8F, 0x00005A10, 0x00000986, 0x000500C2, 0x0000000B, 0x00005557,\n    0x00005D8F, 0x00000A0D, 0x000500C7, 0x0000000B, 0x00001FC8, 0x000044FC,\n    0x00005557, 0x000500C4, 0x0000000B, 0x00006024, 0x00001FC8, 0x00000A0D,\n    0x000500C2, 0x0000000B, 0x000059AF, 0x00001FC8, 0x00000A0D, 0x000500C5,\n    0x0000000B, 0x0000496C, 0x00006024, 0x000059AF, 0x000500C5, 0x0000000B,\n    0x00003EB4, 0x00001FC8, 0x0000496C, 0x000500C7, 0x0000000B, 0x00004788,\n    0x00005A10, 0x000009E9, 0x000500C5, 0x0000000B, 0x00003960, 0x00004788,\n    0x00000944, 0x000500C7, 0x0000000B, 0x00004FB6, 0x00003960, 0x00003EB4,\n    0x000500C2, 0x0000000B, 0x0000503E, 0x000044FC, 0x00000A0D, 0x000500C5,\n    0x0000000B, 0x0000615D, 0x00004788, 0x0000503E, 0x000500C2, 0x0000000B,\n    0x000055A6, 0x00005D8F, 0x00000A10, 0x000500C5, 0x0000000B, 0x00005895,\n    0x0000615D, 0x000055A6, 0x000500C6, 0x0000000B, 0x00001E2F, 0x00005895,\n    0x000009E9, 0x000400C8, 0x0000000B, 0x0000254B, 0x0000503E, 0x000500C7,\n    0x0000000B, 0x00003923, 0x00004788, 0x0000254B, 0x000400C8, 0x0000000B,\n    0x000020EF, 0x000055A6, 0x000500C7, 0x0000000B, 0x00002C95, 0x00003923,\n    0x000020EF, 0x000500C5, 0x0000000B, 0x00001A95, 0x00005A10, 0x00001E2F,\n    0x00050082, 0x0000000B, 0x00004C3B, 0x00001A95, 0x000009E9, 0x000500C5,\n    0x0000000B, 0x00003A1F, 0x00004C3B, 0x00002C95, 0x000500C4, 0x0000000B,\n    0x00004737, 0x00002C95, 0x00000A10, 0x000500C5, 0x0000000B, 0x00003BFD,\n    0x00003A1F, 0x00004737, 0x000400C8, 0x0000000B, 0x00002F7D, 0x00003EB4,\n    0x000500C7, 0x0000000B, 0x00004853, 0x00003BFD, 0x00002F7D, 0x000500C5,\n    0x0000000B, 0x0000186F, 0x00004853, 0x00004FB6, 0x000200F9, 0x00002DB5,\n    0x000200F8, 0x000055A7, 0x000500C7, 0x0000000B, 0x00004E72, 0x00005A10,\n    0x000009E9, 0x000500C7, 0x0000000B, 0x00005D69, 0x00005A10, 0x000009C8,\n    0x000500C2, 0x0000000B, 0x000056EA, 0x00005D69, 0x00000A0D, 0x000500C5,\n    0x0000000B, 0x00005DC3, 0x00004E72, 0x000056EA, 0x000500C7, 0x0000000B,\n    0x00004C92, 0x00005A10, 0x00000986, 0x000500C2, 0x0000000B, 0x0000508A,\n    0x00004C92, 0x00000A10, 0x000500C5, 0x0000000B, 0x00005EE2, 0x00005DC3,\n    0x0000508A, 0x000500C6, 0x0000000B, 0x00001E30, 0x00005EE2, 0x000009E9,\n    0x000400C8, 0x0000000B, 0x0000254C, 0x000056EA, 0x000500C7, 0x0000000B,\n    0x00003924, 0x00004E72, 0x0000254C, 0x000400C8, 0x0000000B, 0x000020F0,\n    0x0000508A, 0x000500C7, 0x0000000B, 0x00002C96, 0x00003924, 0x000020F0,\n    0x000500C5, 0x0000000B, 0x00001A96, 0x00005A10, 0x00001E30, 0x00050082,\n    0x0000000B, 0x00004C3C, 0x00001A96, 0x000009E9, 0x000500C5, 0x0000000B,\n    0x00003A20, 0x00004C3C, 0x00002C96, 0x000500C4, 0x0000000B, 0x000046EB,\n    0x00002C96, 0x00000A0D, 0x000500C5, 0x0000000B, 0x00003E8B, 0x00003A20,\n    0x000046EB, 0x000500C4, 0x0000000B, 0x00001FB9, 0x00002C96, 0x00000A10,\n    0x000500C5, 0x0000000B, 0x00001E83, 0x00003E8B, 0x00001FB9, 0x000200F9,\n    0x00002DB5, 0x000200F8, 0x00002DB5, 0x000700F5, 0x0000000B, 0x00004CE0,\n    0x0000186F, 0x00002993, 0x00001E83, 0x000055A7, 0x00070050, 0x00000017,\n    0x00003A04, 0x000043D0, 0x000043D1, 0x000043D2, 0x00004CE0, 0x000500C2,\n    0x0000000B, 0x00001BC8, 0x000038F6, 0x00000A17, 0x000300F7, 0x00003A21,\n    0x00000000, 0x000400FA, 0x00004E83, 0x00002994, 0x000038BE, 0x000200F8,\n    0x00002994, 0x000500C7, 0x0000000B, 0x000044FD, 0x000043D0, 0x0000003A,\n    0x000500C7, 0x0000000B, 0x00005D90, 0x000043D0, 0x0000022D, 0x000500C2,\n    0x0000000B, 0x00005558, 0x00005D90, 0x00000A0D, 0x000500C7, 0x0000000B,\n    0x00001FC9, 0x000044FD, 0x00005558, 0x000500C4, 0x0000000B, 0x00006025,\n    0x00001FC9, 0x00000A0D, 0x000500C2, 0x0000000B, 0x000059B0, 0x00001FC9,\n    0x00000A0D, 0x000500C5, 0x0000000B, 0x0000497C, 0x00006025, 0x000059B0,\n    0x000500C5, 0x0000000B, 0x00003E2A, 0x00001FC9, 0x0000497C, 0x000400C8,\n    0x0000000B, 0x0000210B, 0x00003E2A, 0x000500C7, 0x0000000B, 0x00002762,\n    0x000043D0, 0x0000210B, 0x00050082, 0x0000000B, 0x00003FAC, 0x00000908,\n    0x00002762, 0x000500C7, 0x0000000B, 0x00004407, 0x00003FAC, 0x0000210B,\n    0x000500C7, 0x0000000B, 0x0000425F, 0x00004407, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x0000356D, 0x00001966, 0x0000425F, 0x000500C7, 0x0000000B,\n    0x000055D7, 0x00002762, 0x00000A1F, 0x00050084, 0x0000000B, 0x00004FA6,\n    0x00003330, 0x000055D7, 0x00050080, 0x0000000B, 0x00004D82, 0x0000356D,\n    0x00004FA6, 0x00050086, 0x0000000B, 0x000032C8, 0x00004D82, 0x00000A19,\n    0x000500C2, 0x0000000B, 0x000059EE, 0x00004407, 0x00000A13, 0x000500C7,\n    0x0000000B, 0x00002231, 0x000059EE, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00003AA3, 0x00001966, 0x00002231, 0x000500C2, 0x0000000B, 0x000033E3,\n    0x00002762, 0x00000A13, 0x000500C7, 0x0000000B, 0x0000617D, 0x000033E3,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x0000626A, 0x00003330, 0x0000617D,\n    0x00050080, 0x0000000B, 0x00004DA8, 0x00003AA3, 0x0000626A, 0x00050086,\n    0x0000000B, 0x00003148, 0x00004DA8, 0x00000A19, 0x000500C4, 0x0000000B,\n    0x00001FE0, 0x00003148, 0x00000A22, 0x000500C5, 0x0000000B, 0x00001D81,\n    0x000032C8, 0x00001FE0, 0x000500C2, 0x0000000B, 0x000055AF, 0x00004407,\n    0x00000A1C, 0x000500C7, 0x0000000B, 0x000044B8, 0x000055AF, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00003AA4, 0x00001966, 0x000044B8, 0x000500C2,\n    0x0000000B, 0x000033E4, 0x00002762, 0x00000A1C, 0x000500C7, 0x0000000B,\n    0x0000617E, 0x000033E4, 0x00000A1F, 0x00050084, 0x0000000B, 0x0000626B,\n    0x00003330, 0x0000617E, 0x00050080, 0x0000000B, 0x00004DA9, 0x00003AA4,\n    0x0000626B, 0x00050086, 0x0000000B, 0x00003149, 0x00004DA9, 0x00000A19,\n    0x000500C4, 0x0000000B, 0x00001FE1, 0x00003149, 0x00000A3A, 0x000500C5,\n    0x0000000B, 0x00001D82, 0x00001D81, 0x00001FE1, 0x000500C2, 0x0000000B,\n    0x000055B0, 0x00004407, 0x00000A25, 0x000500C7, 0x0000000B, 0x000044B9,\n    0x000055B0, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AA5, 0x00001966,\n    0x000044B9, 0x000500C2, 0x0000000B, 0x000033E5, 0x00002762, 0x00000A25,\n    0x000500C7, 0x0000000B, 0x0000617F, 0x000033E5, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x0000626C, 0x00003330, 0x0000617F, 0x00050080, 0x0000000B,\n    0x00004DAA, 0x00003AA5, 0x0000626C, 0x00050086, 0x0000000B, 0x0000314A,\n    0x00004DAA, 0x00000A19, 0x000500C4, 0x0000000B, 0x0000203F, 0x0000314A,\n    0x00000A52, 0x000500C5, 0x0000000B, 0x00001A20, 0x00001D82, 0x0000203F,\n    0x000500C7, 0x0000000B, 0x00004FA1, 0x000043D0, 0x00003E2A, 0x000500C7,\n    0x0000000B, 0x00004400, 0x00004FA1, 0x00000A0D, 0x000500C7, 0x0000000B,\n    0x00004C67, 0x00004FA1, 0x00000A22, 0x000500C4, 0x0000000B, 0x00006164,\n    0x00004C67, 0x00000A19, 0x000500C5, 0x0000000B, 0x000042BB, 0x00004400,\n    0x00006164, 0x000500C7, 0x0000000B, 0x00005182, 0x00004FA1, 0x00000ACA,\n    0x000500C4, 0x0000000B, 0x00005B17, 0x00005182, 0x00000A28, 0x000500C5,\n    0x0000000B, 0x000042BC, 0x000042BB, 0x00005B17, 0x000500C7, 0x0000000B,\n    0x00005183, 0x00004FA1, 0x00000447, 0x000500C4, 0x0000000B, 0x0000561E,\n    0x00005183, 0x00000A37, 0x000500C5, 0x0000000B, 0x00002077, 0x000042BC,\n    0x0000561E, 0x00050084, 0x0000000B, 0x000028B3, 0x00002077, 0x00000144,\n    0x00050080, 0x0000000B, 0x00004800, 0x00001A20, 0x000028B3, 0x000200F9,\n    0x00003A21, 0x000200F8, 0x000038BE, 0x000400C8, 0x0000000B, 0x000029D4,\n    0x000043D0, 0x000500C7, 0x0000000B, 0x00003BFE, 0x000029D4, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00004530, 0x00001966, 0x00003BFE, 0x000500C7,\n    0x0000000B, 0x000055D8, 0x000043D0, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00004FA7, 0x00003330, 0x000055D8, 0x00050080, 0x0000000B, 0x00004D83,\n    0x00004530, 0x00004FA7, 0x00050086, 0x0000000B, 0x000032C9, 0x00004D83,\n    0x00000A1F, 0x000500C2, 0x0000000B, 0x000059EF, 0x000029D4, 0x00000A13,\n    0x000500C7, 0x0000000B, 0x00002232, 0x000059EF, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00003AA6, 0x00001966, 0x00002232, 0x000500C2, 0x0000000B,\n    0x000033E6, 0x000043D0, 0x00000A13, 0x000500C7, 0x0000000B, 0x00006180,\n    0x000033E6, 0x00000A1F, 0x00050084, 0x0000000B, 0x0000626D, 0x00003330,\n    0x00006180, 0x00050080, 0x0000000B, 0x00004DAB, 0x00003AA6, 0x0000626D,\n    0x00050086, 0x0000000B, 0x0000314B, 0x00004DAB, 0x00000A1F, 0x000500C4,\n    0x0000000B, 0x00001FE2, 0x0000314B, 0x00000A22, 0x000500C5, 0x0000000B,\n    0x00001D83, 0x000032C9, 0x00001FE2, 0x000500C2, 0x0000000B, 0x000055B1,\n    0x000029D4, 0x00000A1C, 0x000500C7, 0x0000000B, 0x000044BA, 0x000055B1,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00003AA7, 0x00001966, 0x000044BA,\n    0x000500C2, 0x0000000B, 0x000033E7, 0x000043D0, 0x00000A1C, 0x000500C7,\n    0x0000000B, 0x00006181, 0x000033E7, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x0000626E, 0x00003330, 0x00006181, 0x00050080, 0x0000000B, 0x00004DAC,\n    0x00003AA7, 0x0000626E, 0x00050086, 0x0000000B, 0x0000314C, 0x00004DAC,\n    0x00000A1F, 0x000500C4, 0x0000000B, 0x00001FE3, 0x0000314C, 0x00000A3A,\n    0x000500C5, 0x0000000B, 0x00001D84, 0x00001D83, 0x00001FE3, 0x000500C2,\n    0x0000000B, 0x000055B2, 0x000029D4, 0x00000A25, 0x000500C7, 0x0000000B,\n    0x000044BB, 0x000055B2, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AA8,\n    0x00001966, 0x000044BB, 0x000500C2, 0x0000000B, 0x000033E8, 0x000043D0,\n    0x00000A25, 0x000500C7, 0x0000000B, 0x00006182, 0x000033E8, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x0000626F, 0x00003330, 0x00006182, 0x00050080,\n    0x0000000B, 0x00004DAD, 0x00003AA8, 0x0000626F, 0x00050086, 0x0000000B,\n    0x0000314D, 0x00004DAD, 0x00000A1F, 0x000500C4, 0x0000000B, 0x000023F5,\n    0x0000314D, 0x00000A52, 0x000500C5, 0x0000000B, 0x00004678, 0x00001D84,\n    0x000023F5, 0x000200F9, 0x00003A21, 0x000200F8, 0x00003A21, 0x000700F5,\n    0x0000000B, 0x00002AAE, 0x00004800, 0x00002994, 0x00004678, 0x000038BE,\n    0x000300F7, 0x00003A22, 0x00000000, 0x000400FA, 0x00004E84, 0x00002995,\n    0x000038BF, 0x000200F8, 0x00002995, 0x000500C7, 0x0000000B, 0x000044FE,\n    0x000043D1, 0x0000003A, 0x000500C7, 0x0000000B, 0x00005D91, 0x000043D1,\n    0x0000022D, 0x000500C2, 0x0000000B, 0x00005559, 0x00005D91, 0x00000A0D,\n    0x000500C7, 0x0000000B, 0x00001FCA, 0x000044FE, 0x00005559, 0x000500C4,\n    0x0000000B, 0x00006026, 0x00001FCA, 0x00000A0D, 0x000500C2, 0x0000000B,\n    0x000059B1, 0x00001FCA, 0x00000A0D, 0x000500C5, 0x0000000B, 0x0000497D,\n    0x00006026, 0x000059B1, 0x000500C5, 0x0000000B, 0x00003E2B, 0x00001FCA,\n    0x0000497D, 0x000400C8, 0x0000000B, 0x0000210C, 0x00003E2B, 0x000500C7,\n    0x0000000B, 0x00002763, 0x000043D1, 0x0000210C, 0x00050082, 0x0000000B,\n    0x00003FAD, 0x00000908, 0x00002763, 0x000500C7, 0x0000000B, 0x00004408,\n    0x00003FAD, 0x0000210C, 0x000500C7, 0x0000000B, 0x00004260, 0x00004408,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x0000356E, 0x00003281, 0x00004260,\n    0x000500C7, 0x0000000B, 0x000055D9, 0x00002763, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00004FA8, 0x00003331, 0x000055D9, 0x00050080, 0x0000000B,\n    0x00004D84, 0x0000356E, 0x00004FA8, 0x00050086, 0x0000000B, 0x000032CA,\n    0x00004D84, 0x00000A19, 0x000500C2, 0x0000000B, 0x000059F0, 0x00004408,\n    0x00000A13, 0x000500C7, 0x0000000B, 0x00002233, 0x000059F0, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00003AA9, 0x00003281, 0x00002233, 0x000500C2,\n    0x0000000B, 0x000033E9, 0x00002763, 0x00000A13, 0x000500C7, 0x0000000B,\n    0x00006183, 0x000033E9, 0x00000A1F, 0x00050084, 0x0000000B, 0x00006270,\n    0x00003331, 0x00006183, 0x00050080, 0x0000000B, 0x00004DAE, 0x00003AA9,\n    0x00006270, 0x00050086, 0x0000000B, 0x0000314E, 0x00004DAE, 0x00000A19,\n    0x000500C4, 0x0000000B, 0x00001FE4, 0x0000314E, 0x00000A22, 0x000500C5,\n    0x0000000B, 0x00001D85, 0x000032CA, 0x00001FE4, 0x000500C2, 0x0000000B,\n    0x000055B3, 0x00004408, 0x00000A1C, 0x000500C7, 0x0000000B, 0x000044BC,\n    0x000055B3, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AAA, 0x00003281,\n    0x000044BC, 0x000500C2, 0x0000000B, 0x000033EA, 0x00002763, 0x00000A1C,\n    0x000500C7, 0x0000000B, 0x00006184, 0x000033EA, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00006271, 0x00003331, 0x00006184, 0x00050080, 0x0000000B,\n    0x00004DAF, 0x00003AAA, 0x00006271, 0x00050086, 0x0000000B, 0x0000314F,\n    0x00004DAF, 0x00000A19, 0x000500C4, 0x0000000B, 0x00001FE5, 0x0000314F,\n    0x00000A3A, 0x000500C5, 0x0000000B, 0x00001D86, 0x00001D85, 0x00001FE5,\n    0x000500C2, 0x0000000B, 0x000055B4, 0x00004408, 0x00000A25, 0x000500C7,\n    0x0000000B, 0x000044BD, 0x000055B4, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00003AAB, 0x00003281, 0x000044BD, 0x000500C2, 0x0000000B, 0x000033EB,\n    0x00002763, 0x00000A25, 0x000500C7, 0x0000000B, 0x00006185, 0x000033EB,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00006272, 0x00003331, 0x00006185,\n    0x00050080, 0x0000000B, 0x00004DB0, 0x00003AAB, 0x00006272, 0x00050086,\n    0x0000000B, 0x00003150, 0x00004DB0, 0x00000A19, 0x000500C4, 0x0000000B,\n    0x00002040, 0x00003150, 0x00000A52, 0x000500C5, 0x0000000B, 0x00001A21,\n    0x00001D86, 0x00002040, 0x000500C7, 0x0000000B, 0x00004FA2, 0x000043D1,\n    0x00003E2B, 0x000500C7, 0x0000000B, 0x00004401, 0x00004FA2, 0x00000A0D,\n    0x000500C7, 0x0000000B, 0x00004C68, 0x00004FA2, 0x00000A22, 0x000500C4,\n    0x0000000B, 0x00006165, 0x00004C68, 0x00000A19, 0x000500C5, 0x0000000B,\n    0x000042BD, 0x00004401, 0x00006165, 0x000500C7, 0x0000000B, 0x00005184,\n    0x00004FA2, 0x00000ACA, 0x000500C4, 0x0000000B, 0x00005B18, 0x00005184,\n    0x00000A28, 0x000500C5, 0x0000000B, 0x000042BE, 0x000042BD, 0x00005B18,\n    0x000500C7, 0x0000000B, 0x00005185, 0x00004FA2, 0x00000447, 0x000500C4,\n    0x0000000B, 0x0000561F, 0x00005185, 0x00000A37, 0x000500C5, 0x0000000B,\n    0x00002078, 0x000042BE, 0x0000561F, 0x00050084, 0x0000000B, 0x000028B4,\n    0x00002078, 0x00000144, 0x00050080, 0x0000000B, 0x00004801, 0x00001A21,\n    0x000028B4, 0x000200F9, 0x00003A22, 0x000200F8, 0x000038BF, 0x000400C8,\n    0x0000000B, 0x000029D5, 0x000043D1, 0x000500C7, 0x0000000B, 0x00003BFF,\n    0x000029D5, 0x00000A1F, 0x00050084, 0x0000000B, 0x00004531, 0x00003281,\n    0x00003BFF, 0x000500C7, 0x0000000B, 0x000055DA, 0x000043D1, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00004FA9, 0x00003331, 0x000055DA, 0x00050080,\n    0x0000000B, 0x00004D85, 0x00004531, 0x00004FA9, 0x00050086, 0x0000000B,\n    0x000032CB, 0x00004D85, 0x00000A1F, 0x000500C2, 0x0000000B, 0x000059F1,\n    0x000029D5, 0x00000A13, 0x000500C7, 0x0000000B, 0x00002234, 0x000059F1,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00003AAC, 0x00003281, 0x00002234,\n    0x000500C2, 0x0000000B, 0x000033EC, 0x000043D1, 0x00000A13, 0x000500C7,\n    0x0000000B, 0x00006186, 0x000033EC, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00006273, 0x00003331, 0x00006186, 0x00050080, 0x0000000B, 0x00004DB1,\n    0x00003AAC, 0x00006273, 0x00050086, 0x0000000B, 0x00003151, 0x00004DB1,\n    0x00000A1F, 0x000500C4, 0x0000000B, 0x00001FE6, 0x00003151, 0x00000A22,\n    0x000500C5, 0x0000000B, 0x00001D87, 0x000032CB, 0x00001FE6, 0x000500C2,\n    0x0000000B, 0x000055B5, 0x000029D5, 0x00000A1C, 0x000500C7, 0x0000000B,\n    0x000044BF, 0x000055B5, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AAD,\n    0x00003281, 0x000044BF, 0x000500C2, 0x0000000B, 0x000033ED, 0x000043D1,\n    0x00000A1C, 0x000500C7, 0x0000000B, 0x00006187, 0x000033ED, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00006274, 0x00003331, 0x00006187, 0x00050080,\n    0x0000000B, 0x00004DB2, 0x00003AAD, 0x00006274, 0x00050086, 0x0000000B,\n    0x00003152, 0x00004DB2, 0x00000A1F, 0x000500C4, 0x0000000B, 0x00001FE7,\n    0x00003152, 0x00000A3A, 0x000500C5, 0x0000000B, 0x00001D88, 0x00001D87,\n    0x00001FE7, 0x000500C2, 0x0000000B, 0x000055B6, 0x000029D5, 0x00000A25,\n    0x000500C7, 0x0000000B, 0x000044C0, 0x000055B6, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00003AAE, 0x00003281, 0x000044C0, 0x000500C2, 0x0000000B,\n    0x000033EE, 0x000043D1, 0x00000A25, 0x000500C7, 0x0000000B, 0x00006188,\n    0x000033EE, 0x00000A1F, 0x00050084, 0x0000000B, 0x00006275, 0x00003331,\n    0x00006188, 0x00050080, 0x0000000B, 0x00004DB3, 0x00003AAE, 0x00006275,\n    0x00050086, 0x0000000B, 0x00003153, 0x00004DB3, 0x00000A1F, 0x000500C4,\n    0x0000000B, 0x000023F6, 0x00003153, 0x00000A52, 0x000500C5, 0x0000000B,\n    0x00004679, 0x00001D88, 0x000023F6, 0x000200F9, 0x00003A22, 0x000200F8,\n    0x00003A22, 0x000700F5, 0x0000000B, 0x00002AAF, 0x00004801, 0x00002995,\n    0x00004679, 0x000038BF, 0x000300F7, 0x00003A23, 0x00000000, 0x000400FA,\n    0x00004E85, 0x00002996, 0x000038C0, 0x000200F8, 0x00002996, 0x000500C7,\n    0x0000000B, 0x000044FF, 0x000043D2, 0x0000003A, 0x000500C7, 0x0000000B,\n    0x00005D92, 0x000043D2, 0x0000022D, 0x000500C2, 0x0000000B, 0x0000555A,\n    0x00005D92, 0x00000A0D, 0x000500C7, 0x0000000B, 0x00001FCB, 0x000044FF,\n    0x0000555A, 0x000500C4, 0x0000000B, 0x00006027, 0x00001FCB, 0x00000A0D,\n    0x000500C2, 0x0000000B, 0x000059B2, 0x00001FCB, 0x00000A0D, 0x000500C5,\n    0x0000000B, 0x0000497E, 0x00006027, 0x000059B2, 0x000500C5, 0x0000000B,\n    0x00003E2C, 0x00001FCB, 0x0000497E, 0x000400C8, 0x0000000B, 0x0000210D,\n    0x00003E2C, 0x000500C7, 0x0000000B, 0x00002764, 0x000043D2, 0x0000210D,\n    0x00050082, 0x0000000B, 0x00003FAE, 0x00000908, 0x00002764, 0x000500C7,\n    0x0000000B, 0x00004409, 0x00003FAE, 0x0000210D, 0x000500C7, 0x0000000B,\n    0x00004261, 0x00004409, 0x00000A1F, 0x00050084, 0x0000000B, 0x0000356F,\n    0x00003282, 0x00004261, 0x000500C7, 0x0000000B, 0x000055DB, 0x00002764,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00004FAA, 0x00003332, 0x000055DB,\n    0x00050080, 0x0000000B, 0x00004D86, 0x0000356F, 0x00004FAA, 0x00050086,\n    0x0000000B, 0x000032CC, 0x00004D86, 0x00000A19, 0x000500C2, 0x0000000B,\n    0x000059F2, 0x00004409, 0x00000A13, 0x000500C7, 0x0000000B, 0x00002235,\n    0x000059F2, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AAF, 0x00003282,\n    0x00002235, 0x000500C2, 0x0000000B, 0x000033EF, 0x00002764, 0x00000A13,\n    0x000500C7, 0x0000000B, 0x00006189, 0x000033EF, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00006276, 0x00003332, 0x00006189, 0x00050080, 0x0000000B,\n    0x00004DB4, 0x00003AAF, 0x00006276, 0x00050086, 0x0000000B, 0x00003154,\n    0x00004DB4, 0x00000A19, 0x000500C4, 0x0000000B, 0x00001FE8, 0x00003154,\n    0x00000A22, 0x000500C5, 0x0000000B, 0x00001D89, 0x000032CC, 0x00001FE8,\n    0x000500C2, 0x0000000B, 0x000055B7, 0x00004409, 0x00000A1C, 0x000500C7,\n    0x0000000B, 0x000044C1, 0x000055B7, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00003AB0, 0x00003282, 0x000044C1, 0x000500C2, 0x0000000B, 0x000033F0,\n    0x00002764, 0x00000A1C, 0x000500C7, 0x0000000B, 0x0000618A, 0x000033F0,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00006277, 0x00003332, 0x0000618A,\n    0x00050080, 0x0000000B, 0x00004DB5, 0x00003AB0, 0x00006277, 0x00050086,\n    0x0000000B, 0x00003155, 0x00004DB5, 0x00000A19, 0x000500C4, 0x0000000B,\n    0x00001FE9, 0x00003155, 0x00000A3A, 0x000500C5, 0x0000000B, 0x00001D8A,\n    0x00001D89, 0x00001FE9, 0x000500C2, 0x0000000B, 0x000055B8, 0x00004409,\n    0x00000A25, 0x000500C7, 0x0000000B, 0x000044C2, 0x000055B8, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00003AB1, 0x00003282, 0x000044C2, 0x000500C2,\n    0x0000000B, 0x000033F1, 0x00002764, 0x00000A25, 0x000500C7, 0x0000000B,\n    0x0000618B, 0x000033F1, 0x00000A1F, 0x00050084, 0x0000000B, 0x00006278,\n    0x00003332, 0x0000618B, 0x00050080, 0x0000000B, 0x00004DB6, 0x00003AB1,\n    0x00006278, 0x00050086, 0x0000000B, 0x00003156, 0x00004DB6, 0x00000A19,\n    0x000500C4, 0x0000000B, 0x00002041, 0x00003156, 0x00000A52, 0x000500C5,\n    0x0000000B, 0x00001A22, 0x00001D8A, 0x00002041, 0x000500C7, 0x0000000B,\n    0x00004FA3, 0x000043D2, 0x00003E2C, 0x000500C7, 0x0000000B, 0x00004402,\n    0x00004FA3, 0x00000A0D, 0x000500C7, 0x0000000B, 0x00004C69, 0x00004FA3,\n    0x00000A22, 0x000500C4, 0x0000000B, 0x00006166, 0x00004C69, 0x00000A19,\n    0x000500C5, 0x0000000B, 0x000042BF, 0x00004402, 0x00006166, 0x000500C7,\n    0x0000000B, 0x00005186, 0x00004FA3, 0x00000ACA, 0x000500C4, 0x0000000B,\n    0x00005B19, 0x00005186, 0x00000A28, 0x000500C5, 0x0000000B, 0x000042C0,\n    0x000042BF, 0x00005B19, 0x000500C7, 0x0000000B, 0x00005187, 0x00004FA3,\n    0x00000447, 0x000500C4, 0x0000000B, 0x00005620, 0x00005187, 0x00000A37,\n    0x000500C5, 0x0000000B, 0x00002079, 0x000042C0, 0x00005620, 0x00050084,\n    0x0000000B, 0x000028B5, 0x00002079, 0x00000144, 0x00050080, 0x0000000B,\n    0x00004802, 0x00001A22, 0x000028B5, 0x000200F9, 0x00003A23, 0x000200F8,\n    0x000038C0, 0x000400C8, 0x0000000B, 0x000029D6, 0x000043D2, 0x000500C7,\n    0x0000000B, 0x00003C00, 0x000029D6, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00004532, 0x00003282, 0x00003C00, 0x000500C7, 0x0000000B, 0x000055DC,\n    0x000043D2, 0x00000A1F, 0x00050084, 0x0000000B, 0x00004FAB, 0x00003332,\n    0x000055DC, 0x00050080, 0x0000000B, 0x00004D87, 0x00004532, 0x00004FAB,\n    0x00050086, 0x0000000B, 0x000032CD, 0x00004D87, 0x00000A1F, 0x000500C2,\n    0x0000000B, 0x000059F3, 0x000029D6, 0x00000A13, 0x000500C7, 0x0000000B,\n    0x00002236, 0x000059F3, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AB2,\n    0x00003282, 0x00002236, 0x000500C2, 0x0000000B, 0x000033F2, 0x000043D2,\n    0x00000A13, 0x000500C7, 0x0000000B, 0x0000618C, 0x000033F2, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00006279, 0x00003332, 0x0000618C, 0x00050080,\n    0x0000000B, 0x00004DB7, 0x00003AB2, 0x00006279, 0x00050086, 0x0000000B,\n    0x00003157, 0x00004DB7, 0x00000A1F, 0x000500C4, 0x0000000B, 0x00001FEA,\n    0x00003157, 0x00000A22, 0x000500C5, 0x0000000B, 0x00001D8B, 0x000032CD,\n    0x00001FEA, 0x000500C2, 0x0000000B, 0x000055B9, 0x000029D6, 0x00000A1C,\n    0x000500C7, 0x0000000B, 0x000044C3, 0x000055B9, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00003AB3, 0x00003282, 0x000044C3, 0x000500C2, 0x0000000B,\n    0x000033F3, 0x000043D2, 0x00000A1C, 0x000500C7, 0x0000000B, 0x0000618D,\n    0x000033F3, 0x00000A1F, 0x00050084, 0x0000000B, 0x0000627A, 0x00003332,\n    0x0000618D, 0x00050080, 0x0000000B, 0x00004DB8, 0x00003AB3, 0x0000627A,\n    0x00050086, 0x0000000B, 0x00003158, 0x00004DB8, 0x00000A1F, 0x000500C4,\n    0x0000000B, 0x00001FEB, 0x00003158, 0x00000A3A, 0x000500C5, 0x0000000B,\n    0x00001D8C, 0x00001D8B, 0x00001FEB, 0x000500C2, 0x0000000B, 0x000055BA,\n    0x000029D6, 0x00000A25, 0x000500C7, 0x0000000B, 0x000044C4, 0x000055BA,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00003AB4, 0x00003282, 0x000044C4,\n    0x000500C2, 0x0000000B, 0x000033F4, 0x000043D2, 0x00000A25, 0x000500C7,\n    0x0000000B, 0x0000618E, 0x000033F4, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x0000627B, 0x00003332, 0x0000618E, 0x00050080, 0x0000000B, 0x00004DB9,\n    0x00003AB4, 0x0000627B, 0x00050086, 0x0000000B, 0x00003159, 0x00004DB9,\n    0x00000A1F, 0x000500C4, 0x0000000B, 0x000023F7, 0x00003159, 0x00000A52,\n    0x000500C5, 0x0000000B, 0x0000467A, 0x00001D8C, 0x000023F7, 0x000200F9,\n    0x00003A23, 0x000200F8, 0x00003A23, 0x000700F5, 0x0000000B, 0x00002AB0,\n    0x00004802, 0x00002996, 0x0000467A, 0x000038C0, 0x000300F7, 0x00002DB6,\n    0x00000000, 0x000400FA, 0x00004E86, 0x00002997, 0x000038C1, 0x000200F8,\n    0x00002997, 0x000500C7, 0x0000000B, 0x00004500, 0x00004CE0, 0x0000003A,\n    0x000500C7, 0x0000000B, 0x00005D93, 0x00004CE0, 0x0000022D, 0x000500C2,\n    0x0000000B, 0x0000555B, 0x00005D93, 0x00000A0D, 0x000500C7, 0x0000000B,\n    0x00001FCC, 0x00004500, 0x0000555B, 0x000500C4, 0x0000000B, 0x00006028,\n    0x00001FCC, 0x00000A0D, 0x000500C2, 0x0000000B, 0x000059B3, 0x00001FCC,\n    0x00000A0D, 0x000500C5, 0x0000000B, 0x0000497F, 0x00006028, 0x000059B3,\n    0x000500C5, 0x0000000B, 0x00003E2D, 0x00001FCC, 0x0000497F, 0x000400C8,\n    0x0000000B, 0x0000210E, 0x00003E2D, 0x000500C7, 0x0000000B, 0x00002765,\n    0x00004CE0, 0x0000210E, 0x00050082, 0x0000000B, 0x00003FAF, 0x00000908,\n    0x00002765, 0x000500C7, 0x0000000B, 0x0000440A, 0x00003FAF, 0x0000210E,\n    0x000500C7, 0x0000000B, 0x00004262, 0x0000440A, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00003570, 0x00003283, 0x00004262, 0x000500C7, 0x0000000B,\n    0x000055DD, 0x00002765, 0x00000A1F, 0x00050084, 0x0000000B, 0x00004FAC,\n    0x00003333, 0x000055DD, 0x00050080, 0x0000000B, 0x00004D88, 0x00003570,\n    0x00004FAC, 0x00050086, 0x0000000B, 0x000032CE, 0x00004D88, 0x00000A19,\n    0x000500C2, 0x0000000B, 0x000059F4, 0x0000440A, 0x00000A13, 0x000500C7,\n    0x0000000B, 0x00002237, 0x000059F4, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00003AB5, 0x00003283, 0x00002237, 0x000500C2, 0x0000000B, 0x000033F5,\n    0x00002765, 0x00000A13, 0x000500C7, 0x0000000B, 0x0000618F, 0x000033F5,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x0000627C, 0x00003333, 0x0000618F,\n    0x00050080, 0x0000000B, 0x00004DBA, 0x00003AB5, 0x0000627C, 0x00050086,\n    0x0000000B, 0x0000315A, 0x00004DBA, 0x00000A19, 0x000500C4, 0x0000000B,\n    0x00001FEC, 0x0000315A, 0x00000A22, 0x000500C5, 0x0000000B, 0x00001D8D,\n    0x000032CE, 0x00001FEC, 0x000500C2, 0x0000000B, 0x000055BB, 0x0000440A,\n    0x00000A1C, 0x000500C7, 0x0000000B, 0x000044C5, 0x000055BB, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00003AB6, 0x00003283, 0x000044C5, 0x000500C2,\n    0x0000000B, 0x000033F6, 0x00002765, 0x00000A1C, 0x000500C7, 0x0000000B,\n    0x00006190, 0x000033F6, 0x00000A1F, 0x00050084, 0x0000000B, 0x0000627D,\n    0x00003333, 0x00006190, 0x00050080, 0x0000000B, 0x00004DBB, 0x00003AB6,\n    0x0000627D, 0x00050086, 0x0000000B, 0x0000315B, 0x00004DBB, 0x00000A19,\n    0x000500C4, 0x0000000B, 0x00001FED, 0x0000315B, 0x00000A3A, 0x000500C5,\n    0x0000000B, 0x00001D8E, 0x00001D8D, 0x00001FED, 0x000500C2, 0x0000000B,\n    0x000055BC, 0x0000440A, 0x00000A25, 0x000500C7, 0x0000000B, 0x000044C6,\n    0x000055BC, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AB7, 0x00003283,\n    0x000044C6, 0x000500C2, 0x0000000B, 0x000033F7, 0x00002765, 0x00000A25,\n    0x000500C7, 0x0000000B, 0x00006191, 0x000033F7, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x0000627E, 0x00003333, 0x00006191, 0x00050080, 0x0000000B,\n    0x00004DBC, 0x00003AB7, 0x0000627E, 0x00050086, 0x0000000B, 0x0000315C,\n    0x00004DBC, 0x00000A19, 0x000500C4, 0x0000000B, 0x00002043, 0x0000315C,\n    0x00000A52, 0x000500C5, 0x0000000B, 0x00001A23, 0x00001D8E, 0x00002043,\n    0x000500C7, 0x0000000B, 0x00004FA4, 0x00004CE0, 0x00003E2D, 0x000500C7,\n    0x0000000B, 0x00004403, 0x00004FA4, 0x00000A0D, 0x000500C7, 0x0000000B,\n    0x00004C6A, 0x00004FA4, 0x00000A22, 0x000500C4, 0x0000000B, 0x00006167,\n    0x00004C6A, 0x00000A19, 0x000500C5, 0x0000000B, 0x000042C1, 0x00004403,\n    0x00006167, 0x000500C7, 0x0000000B, 0x00005188, 0x00004FA4, 0x00000ACA,\n    0x000500C4, 0x0000000B, 0x00005B1A, 0x00005188, 0x00000A28, 0x000500C5,\n    0x0000000B, 0x000042C2, 0x000042C1, 0x00005B1A, 0x000500C7, 0x0000000B,\n    0x00005189, 0x00004FA4, 0x00000447, 0x000500C4, 0x0000000B, 0x00005621,\n    0x00005189, 0x00000A37, 0x000500C5, 0x0000000B, 0x0000207A, 0x000042C2,\n    0x00005621, 0x00050084, 0x0000000B, 0x000028B6, 0x0000207A, 0x00000144,\n    0x00050080, 0x0000000B, 0x00004803, 0x00001A23, 0x000028B6, 0x000200F9,\n    0x00002DB6, 0x000200F8, 0x000038C1, 0x000400C8, 0x0000000B, 0x000029D7,\n    0x00004CE0, 0x000500C7, 0x0000000B, 0x00003C01, 0x000029D7, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00004533, 0x00003283, 0x00003C01, 0x000500C7,\n    0x0000000B, 0x000055DE, 0x00004CE0, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00004FAD, 0x00003333, 0x000055DE, 0x00050080, 0x0000000B, 0x00004D89,\n    0x00004533, 0x00004FAD, 0x00050086, 0x0000000B, 0x000032CF, 0x00004D89,\n    0x00000A1F, 0x000500C2, 0x0000000B, 0x000059F5, 0x000029D7, 0x00000A13,\n    0x000500C7, 0x0000000B, 0x00002238, 0x000059F5, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00003AB8, 0x00003283, 0x00002238, 0x000500C2, 0x0000000B,\n    0x000033F8, 0x00004CE0, 0x00000A13, 0x000500C7, 0x0000000B, 0x00006192,\n    0x000033F8, 0x00000A1F, 0x00050084, 0x0000000B, 0x0000627F, 0x00003333,\n    0x00006192, 0x00050080, 0x0000000B, 0x00004DBD, 0x00003AB8, 0x0000627F,\n    0x00050086, 0x0000000B, 0x0000315D, 0x00004DBD, 0x00000A1F, 0x000500C4,\n    0x0000000B, 0x00001FEE, 0x0000315D, 0x00000A22, 0x000500C5, 0x0000000B,\n    0x00001D8F, 0x000032CF, 0x00001FEE, 0x000500C2, 0x0000000B, 0x000055BD,\n    0x000029D7, 0x00000A1C, 0x000500C7, 0x0000000B, 0x000044C7, 0x000055BD,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00003AB9, 0x00003283, 0x000044C7,\n    0x000500C2, 0x0000000B, 0x000033F9, 0x00004CE0, 0x00000A1C, 0x000500C7,\n    0x0000000B, 0x00006193, 0x000033F9, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00006280, 0x00003333, 0x00006193, 0x00050080, 0x0000000B, 0x00004DBE,\n    0x00003AB9, 0x00006280, 0x00050086, 0x0000000B, 0x0000315E, 0x00004DBE,\n    0x00000A1F, 0x000500C4, 0x0000000B, 0x00001FEF, 0x0000315E, 0x00000A3A,\n    0x000500C5, 0x0000000B, 0x00001D90, 0x00001D8F, 0x00001FEF, 0x000500C2,\n    0x0000000B, 0x000055BE, 0x000029D7, 0x00000A25, 0x000500C7, 0x0000000B,\n    0x000044C8, 0x000055BE, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003ABA,\n    0x00003283, 0x000044C8, 0x000500C2, 0x0000000B, 0x000033FA, 0x00004CE0,\n    0x00000A25, 0x000500C7, 0x0000000B, 0x00006194, 0x000033FA, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00006281, 0x00003333, 0x00006194, 0x00050080,\n    0x0000000B, 0x00004DBF, 0x00003ABA, 0x00006281, 0x00050086, 0x0000000B,\n    0x0000315F, 0x00004DBF, 0x00000A1F, 0x000500C4, 0x0000000B, 0x000023F8,\n    0x0000315F, 0x00000A52, 0x000500C5, 0x0000000B, 0x0000467B, 0x00001D90,\n    0x000023F8, 0x000200F9, 0x00002DB6, 0x000200F8, 0x00002DB6, 0x000700F5,\n    0x0000000B, 0x0000434D, 0x00004803, 0x00002997, 0x0000467B, 0x000038C1,\n    0x00070050, 0x00000017, 0x000038F7, 0x00002AAE, 0x00002AAF, 0x00002AB0,\n    0x0000434D, 0x00060041, 0x00000294, 0x00002FB5, 0x0000140E, 0x00000A0B,\n    0x00001BC8, 0x0003003E, 0x00002FB5, 0x000038F7, 0x00050051, 0x0000000B,\n    0x00003220, 0x000043C0, 0x00000001, 0x00050080, 0x0000000B, 0x00005AC0,\n    0x00003220, 0x00000A0E, 0x000500B0, 0x00000009, 0x00004411, 0x00005AC0,\n    0x000019C2, 0x000300F7, 0x00001C27, 0x00000002, 0x000400FA, 0x00004411,\n    0x0000592C, 0x00001C27, 0x000200F8, 0x0000592C, 0x00050080, 0x0000000B,\n    0x00003C79, 0x000038F6, 0x0000578C, 0x000500C2, 0x00000017, 0x00002EF7,\n    0x00003A04, 0x00000215, 0x000500C2, 0x0000000B, 0x000059F6, 0x00003C79,\n    0x00000A17, 0x00050051, 0x0000000B, 0x00004B33, 0x00002EF7, 0x00000000,\n    0x000300F7, 0x00002DCB, 0x00000000, 0x000400FA, 0x00004E83, 0x00002998,\n    0x000038C2, 0x000200F8, 0x00002998, 0x000500C7, 0x0000000B, 0x00004501,\n    0x00004B33, 0x0000003A, 0x000500C7, 0x0000000B, 0x00005D94, 0x00004B33,\n    0x0000022D, 0x000500C2, 0x0000000B, 0x0000555C, 0x00005D94, 0x00000A0D,\n    0x000500C7, 0x0000000B, 0x00001FCD, 0x00004501, 0x0000555C, 0x000500C4,\n    0x0000000B, 0x00006029, 0x00001FCD, 0x00000A0D, 0x000500C2, 0x0000000B,\n    0x000059B4, 0x00001FCD, 0x00000A0D, 0x000500C5, 0x0000000B, 0x00004980,\n    0x00006029, 0x000059B4, 0x000500C5, 0x0000000B, 0x00003E2E, 0x00001FCD,\n    0x00004980, 0x000400C8, 0x0000000B, 0x0000210F, 0x00003E2E, 0x000500C7,\n    0x0000000B, 0x00002766, 0x00004B33, 0x0000210F, 0x00050082, 0x0000000B,\n    0x00003FB0, 0x00000908, 0x00002766, 0x000500C7, 0x0000000B, 0x0000440B,\n    0x00003FB0, 0x0000210F, 0x000500C7, 0x0000000B, 0x00004263, 0x0000440B,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00003571, 0x00001966, 0x00004263,\n    0x000500C7, 0x0000000B, 0x000055DF, 0x00002766, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00004FB0, 0x00003330, 0x000055DF, 0x00050080, 0x0000000B,\n    0x00004D8A, 0x00003571, 0x00004FB0, 0x00050086, 0x0000000B, 0x000032D0,\n    0x00004D8A, 0x00000A19, 0x000500C2, 0x0000000B, 0x000059F7, 0x0000440B,\n    0x00000A13, 0x000500C7, 0x0000000B, 0x00002239, 0x000059F7, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00003ABB, 0x00001966, 0x00002239, 0x000500C2,\n    0x0000000B, 0x000033FB, 0x00002766, 0x00000A13, 0x000500C7, 0x0000000B,\n    0x00006195, 0x000033FB, 0x00000A1F, 0x00050084, 0x0000000B, 0x00006282,\n    0x00003330, 0x00006195, 0x00050080, 0x0000000B, 0x00004DC0, 0x00003ABB,\n    0x00006282, 0x00050086, 0x0000000B, 0x00003160, 0x00004DC0, 0x00000A19,\n    0x000500C4, 0x0000000B, 0x00001FF0, 0x00003160, 0x00000A22, 0x000500C5,\n    0x0000000B, 0x00001D91, 0x000032D0, 0x00001FF0, 0x000500C2, 0x0000000B,\n    0x000055BF, 0x0000440B, 0x00000A1C, 0x000500C7, 0x0000000B, 0x000044C9,\n    0x000055BF, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003ABC, 0x00001966,\n    0x000044C9, 0x000500C2, 0x0000000B, 0x000033FC, 0x00002766, 0x00000A1C,\n    0x000500C7, 0x0000000B, 0x00006196, 0x000033FC, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00006283, 0x00003330, 0x00006196, 0x00050080, 0x0000000B,\n    0x00004DC1, 0x00003ABC, 0x00006283, 0x00050086, 0x0000000B, 0x00003161,\n    0x00004DC1, 0x00000A19, 0x000500C4, 0x0000000B, 0x00001FF1, 0x00003161,\n    0x00000A3A, 0x000500C5, 0x0000000B, 0x00001D92, 0x00001D91, 0x00001FF1,\n    0x000500C2, 0x0000000B, 0x000055C0, 0x0000440B, 0x00000A25, 0x000500C7,\n    0x0000000B, 0x000044CA, 0x000055C0, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00003ABD, 0x00001966, 0x000044CA, 0x000500C2, 0x0000000B, 0x000033FD,\n    0x00002766, 0x00000A25, 0x000500C7, 0x0000000B, 0x00006197, 0x000033FD,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00006284, 0x00003330, 0x00006197,\n    0x00050080, 0x0000000B, 0x00004DC2, 0x00003ABD, 0x00006284, 0x00050086,\n    0x0000000B, 0x00003162, 0x00004DC2, 0x00000A19, 0x000500C4, 0x0000000B,\n    0x00002044, 0x00003162, 0x00000A52, 0x000500C5, 0x0000000B, 0x00001A24,\n    0x00001D92, 0x00002044, 0x000500C7, 0x0000000B, 0x00004FA5, 0x00004B33,\n    0x00003E2E, 0x000500C7, 0x0000000B, 0x00004404, 0x00004FA5, 0x00000A0D,\n    0x000500C7, 0x0000000B, 0x00004C6B, 0x00004FA5, 0x00000A22, 0x000500C4,\n    0x0000000B, 0x00006168, 0x00004C6B, 0x00000A19, 0x000500C5, 0x0000000B,\n    0x000042C3, 0x00004404, 0x00006168, 0x000500C7, 0x0000000B, 0x0000518A,\n    0x00004FA5, 0x00000ACA, 0x000500C4, 0x0000000B, 0x00005B1B, 0x0000518A,\n    0x00000A28, 0x000500C5, 0x0000000B, 0x000042C4, 0x000042C3, 0x00005B1B,\n    0x000500C7, 0x0000000B, 0x0000518B, 0x00004FA5, 0x00000447, 0x000500C4,\n    0x0000000B, 0x00005622, 0x0000518B, 0x00000A37, 0x000500C5, 0x0000000B,\n    0x0000207B, 0x000042C4, 0x00005622, 0x00050084, 0x0000000B, 0x000028B7,\n    0x0000207B, 0x00000144, 0x00050080, 0x0000000B, 0x00004804, 0x00001A24,\n    0x000028B7, 0x000200F9, 0x00002DCB, 0x000200F8, 0x000038C2, 0x000400C8,\n    0x0000000B, 0x000029D8, 0x00004B33, 0x000500C7, 0x0000000B, 0x00003C02,\n    0x000029D8, 0x00000A1F, 0x00050084, 0x0000000B, 0x00004534, 0x00001966,\n    0x00003C02, 0x000500C7, 0x0000000B, 0x000055E0, 0x00004B33, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00004FB1, 0x00003330, 0x000055E0, 0x00050080,\n    0x0000000B, 0x00004D8B, 0x00004534, 0x00004FB1, 0x00050086, 0x0000000B,\n    0x000032D1, 0x00004D8B, 0x00000A1F, 0x000500C2, 0x0000000B, 0x000059F8,\n    0x000029D8, 0x00000A13, 0x000500C7, 0x0000000B, 0x0000223A, 0x000059F8,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00003ABE, 0x00001966, 0x0000223A,\n    0x000500C2, 0x0000000B, 0x000033FE, 0x00004B33, 0x00000A13, 0x000500C7,\n    0x0000000B, 0x00006198, 0x000033FE, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00006285, 0x00003330, 0x00006198, 0x00050080, 0x0000000B, 0x00004DC3,\n    0x00003ABE, 0x00006285, 0x00050086, 0x0000000B, 0x00003163, 0x00004DC3,\n    0x00000A1F, 0x000500C4, 0x0000000B, 0x00001FF2, 0x00003163, 0x00000A22,\n    0x000500C5, 0x0000000B, 0x00001D93, 0x000032D1, 0x00001FF2, 0x000500C2,\n    0x0000000B, 0x000055C1, 0x000029D8, 0x00000A1C, 0x000500C7, 0x0000000B,\n    0x000044CB, 0x000055C1, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003ABF,\n    0x00001966, 0x000044CB, 0x000500C2, 0x0000000B, 0x000033FF, 0x00004B33,\n    0x00000A1C, 0x000500C7, 0x0000000B, 0x00006199, 0x000033FF, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00006286, 0x00003330, 0x00006199, 0x00050080,\n    0x0000000B, 0x00004DC4, 0x00003ABF, 0x00006286, 0x00050086, 0x0000000B,\n    0x00003164, 0x00004DC4, 0x00000A1F, 0x000500C4, 0x0000000B, 0x00001FF3,\n    0x00003164, 0x00000A3A, 0x000500C5, 0x0000000B, 0x00001D94, 0x00001D93,\n    0x00001FF3, 0x000500C2, 0x0000000B, 0x000055C2, 0x000029D8, 0x00000A25,\n    0x000500C7, 0x0000000B, 0x000044CC, 0x000055C2, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00003AC0, 0x00001966, 0x000044CC, 0x000500C2, 0x0000000B,\n    0x00003400, 0x00004B33, 0x00000A25, 0x000500C7, 0x0000000B, 0x0000619A,\n    0x00003400, 0x00000A1F, 0x00050084, 0x0000000B, 0x00006287, 0x00003330,\n    0x0000619A, 0x00050080, 0x0000000B, 0x00004DC5, 0x00003AC0, 0x00006287,\n    0x00050086, 0x0000000B, 0x00003165, 0x00004DC5, 0x00000A1F, 0x000500C4,\n    0x0000000B, 0x000023F9, 0x00003165, 0x00000A52, 0x000500C5, 0x0000000B,\n    0x0000467C, 0x00001D94, 0x000023F9, 0x000200F9, 0x00002DCB, 0x000200F8,\n    0x00002DCB, 0x000700F5, 0x0000000B, 0x00005022, 0x00004804, 0x00002998,\n    0x0000467C, 0x000038C2, 0x00050051, 0x0000000B, 0x000040EA, 0x00002EF7,\n    0x00000001, 0x000300F7, 0x00002DCC, 0x00000000, 0x000400FA, 0x00004E84,\n    0x00002999, 0x000038C3, 0x000200F8, 0x00002999, 0x000500C7, 0x0000000B,\n    0x00004502, 0x000040EA, 0x0000003A, 0x000500C7, 0x0000000B, 0x00005D95,\n    0x000040EA, 0x0000022D, 0x000500C2, 0x0000000B, 0x0000555D, 0x00005D95,\n    0x00000A0D, 0x000500C7, 0x0000000B, 0x00001FCE, 0x00004502, 0x0000555D,\n    0x000500C4, 0x0000000B, 0x0000602A, 0x00001FCE, 0x00000A0D, 0x000500C2,\n    0x0000000B, 0x000059B5, 0x00001FCE, 0x00000A0D, 0x000500C5, 0x0000000B,\n    0x00004981, 0x0000602A, 0x000059B5, 0x000500C5, 0x0000000B, 0x00003E2F,\n    0x00001FCE, 0x00004981, 0x000400C8, 0x0000000B, 0x00002110, 0x00003E2F,\n    0x000500C7, 0x0000000B, 0x00002767, 0x000040EA, 0x00002110, 0x00050082,\n    0x0000000B, 0x00003FB1, 0x00000908, 0x00002767, 0x000500C7, 0x0000000B,\n    0x0000440C, 0x00003FB1, 0x00002110, 0x000500C7, 0x0000000B, 0x00004264,\n    0x0000440C, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003572, 0x00003281,\n    0x00004264, 0x000500C7, 0x0000000B, 0x000055E1, 0x00002767, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00004FB2, 0x00003331, 0x000055E1, 0x00050080,\n    0x0000000B, 0x00004D8C, 0x00003572, 0x00004FB2, 0x00050086, 0x0000000B,\n    0x000032D2, 0x00004D8C, 0x00000A19, 0x000500C2, 0x0000000B, 0x000059F9,\n    0x0000440C, 0x00000A13, 0x000500C7, 0x0000000B, 0x0000223B, 0x000059F9,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00003AC1, 0x00003281, 0x0000223B,\n    0x000500C2, 0x0000000B, 0x00003401, 0x00002767, 0x00000A13, 0x000500C7,\n    0x0000000B, 0x0000619B, 0x00003401, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00006288, 0x00003331, 0x0000619B, 0x00050080, 0x0000000B, 0x00004DC6,\n    0x00003AC1, 0x00006288, 0x00050086, 0x0000000B, 0x00003166, 0x00004DC6,\n    0x00000A19, 0x000500C4, 0x0000000B, 0x00001FF4, 0x00003166, 0x00000A22,\n    0x000500C5, 0x0000000B, 0x00001D95, 0x000032D2, 0x00001FF4, 0x000500C2,\n    0x0000000B, 0x000055C3, 0x0000440C, 0x00000A1C, 0x000500C7, 0x0000000B,\n    0x000044CD, 0x000055C3, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AC2,\n    0x00003281, 0x000044CD, 0x000500C2, 0x0000000B, 0x00003402, 0x00002767,\n    0x00000A1C, 0x000500C7, 0x0000000B, 0x0000619C, 0x00003402, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00006289, 0x00003331, 0x0000619C, 0x00050080,\n    0x0000000B, 0x00004DC7, 0x00003AC2, 0x00006289, 0x00050086, 0x0000000B,\n    0x00003167, 0x00004DC7, 0x00000A19, 0x000500C4, 0x0000000B, 0x00001FF5,\n    0x00003167, 0x00000A3A, 0x000500C5, 0x0000000B, 0x00001D96, 0x00001D95,\n    0x00001FF5, 0x000500C2, 0x0000000B, 0x000055C4, 0x0000440C, 0x00000A25,\n    0x000500C7, 0x0000000B, 0x000044CE, 0x000055C4, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00003AC3, 0x00003281, 0x000044CE, 0x000500C2, 0x0000000B,\n    0x00003403, 0x00002767, 0x00000A25, 0x000500C7, 0x0000000B, 0x0000619D,\n    0x00003403, 0x00000A1F, 0x00050084, 0x0000000B, 0x0000628A, 0x00003331,\n    0x0000619D, 0x00050080, 0x0000000B, 0x00004DC8, 0x00003AC3, 0x0000628A,\n    0x00050086, 0x0000000B, 0x00003168, 0x00004DC8, 0x00000A19, 0x000500C4,\n    0x0000000B, 0x00002045, 0x00003168, 0x00000A52, 0x000500C5, 0x0000000B,\n    0x00001A25, 0x00001D96, 0x00002045, 0x000500C7, 0x0000000B, 0x00004FB7,\n    0x000040EA, 0x00003E2F, 0x000500C7, 0x0000000B, 0x00004405, 0x00004FB7,\n    0x00000A0D, 0x000500C7, 0x0000000B, 0x00004C6C, 0x00004FB7, 0x00000A22,\n    0x000500C4, 0x0000000B, 0x00006169, 0x00004C6C, 0x00000A19, 0x000500C5,\n    0x0000000B, 0x000042C5, 0x00004405, 0x00006169, 0x000500C7, 0x0000000B,\n    0x0000518C, 0x00004FB7, 0x00000ACA, 0x000500C4, 0x0000000B, 0x00005B1C,\n    0x0000518C, 0x00000A28, 0x000500C5, 0x0000000B, 0x000042C6, 0x000042C5,\n    0x00005B1C, 0x000500C7, 0x0000000B, 0x0000518D, 0x00004FB7, 0x00000447,\n    0x000500C4, 0x0000000B, 0x00005623, 0x0000518D, 0x00000A37, 0x000500C5,\n    0x0000000B, 0x0000207C, 0x000042C6, 0x00005623, 0x00050084, 0x0000000B,\n    0x000028B8, 0x0000207C, 0x00000144, 0x00050080, 0x0000000B, 0x00004805,\n    0x00001A25, 0x000028B8, 0x000200F9, 0x00002DCC, 0x000200F8, 0x000038C3,\n    0x000400C8, 0x0000000B, 0x000029D9, 0x000040EA, 0x000500C7, 0x0000000B,\n    0x00003C03, 0x000029D9, 0x00000A1F, 0x00050084, 0x0000000B, 0x00004535,\n    0x00003281, 0x00003C03, 0x000500C7, 0x0000000B, 0x000055E2, 0x000040EA,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00004FB8, 0x00003331, 0x000055E2,\n    0x00050080, 0x0000000B, 0x00004D8E, 0x00004535, 0x00004FB8, 0x00050086,\n    0x0000000B, 0x000032D3, 0x00004D8E, 0x00000A1F, 0x000500C2, 0x0000000B,\n    0x000059FA, 0x000029D9, 0x00000A13, 0x000500C7, 0x0000000B, 0x0000223C,\n    0x000059FA, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AC4, 0x00003281,\n    0x0000223C, 0x000500C2, 0x0000000B, 0x00003404, 0x000040EA, 0x00000A13,\n    0x000500C7, 0x0000000B, 0x0000619E, 0x00003404, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x0000628B, 0x00003331, 0x0000619E, 0x00050080, 0x0000000B,\n    0x00004DC9, 0x00003AC4, 0x0000628B, 0x00050086, 0x0000000B, 0x00003169,\n    0x00004DC9, 0x00000A1F, 0x000500C4, 0x0000000B, 0x00001FF6, 0x00003169,\n    0x00000A22, 0x000500C5, 0x0000000B, 0x00001D97, 0x000032D3, 0x00001FF6,\n    0x000500C2, 0x0000000B, 0x000055C5, 0x000029D9, 0x00000A1C, 0x000500C7,\n    0x0000000B, 0x000044CF, 0x000055C5, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00003AC5, 0x00003281, 0x000044CF, 0x000500C2, 0x0000000B, 0x00003405,\n    0x000040EA, 0x00000A1C, 0x000500C7, 0x0000000B, 0x0000619F, 0x00003405,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x0000628C, 0x00003331, 0x0000619F,\n    0x00050080, 0x0000000B, 0x00004DCA, 0x00003AC5, 0x0000628C, 0x00050086,\n    0x0000000B, 0x0000316A, 0x00004DCA, 0x00000A1F, 0x000500C4, 0x0000000B,\n    0x00001FF7, 0x0000316A, 0x00000A3A, 0x000500C5, 0x0000000B, 0x00001D98,\n    0x00001D97, 0x00001FF7, 0x000500C2, 0x0000000B, 0x000055C6, 0x000029D9,\n    0x00000A25, 0x000500C7, 0x0000000B, 0x000044D0, 0x000055C6, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00003AC6, 0x00003281, 0x000044D0, 0x000500C2,\n    0x0000000B, 0x00003406, 0x000040EA, 0x00000A25, 0x000500C7, 0x0000000B,\n    0x000061A0, 0x00003406, 0x00000A1F, 0x00050084, 0x0000000B, 0x0000628D,\n    0x00003331, 0x000061A0, 0x00050080, 0x0000000B, 0x00004DCB, 0x00003AC6,\n    0x0000628D, 0x00050086, 0x0000000B, 0x0000316B, 0x00004DCB, 0x00000A1F,\n    0x000500C4, 0x0000000B, 0x000023FA, 0x0000316B, 0x00000A52, 0x000500C5,\n    0x0000000B, 0x0000467D, 0x00001D98, 0x000023FA, 0x000200F9, 0x00002DCC,\n    0x000200F8, 0x00002DCC, 0x000700F5, 0x0000000B, 0x00005023, 0x00004805,\n    0x00002999, 0x0000467D, 0x000038C3, 0x00050051, 0x0000000B, 0x000040EB,\n    0x00002EF7, 0x00000002, 0x000300F7, 0x00002DCD, 0x00000000, 0x000400FA,\n    0x00004E85, 0x0000299A, 0x000038C4, 0x000200F8, 0x0000299A, 0x000500C7,\n    0x0000000B, 0x00004503, 0x000040EB, 0x0000003A, 0x000500C7, 0x0000000B,\n    0x00005D96, 0x000040EB, 0x0000022D, 0x000500C2, 0x0000000B, 0x0000555E,\n    0x00005D96, 0x00000A0D, 0x000500C7, 0x0000000B, 0x00001FCF, 0x00004503,\n    0x0000555E, 0x000500C4, 0x0000000B, 0x0000602B, 0x00001FCF, 0x00000A0D,\n    0x000500C2, 0x0000000B, 0x000059B6, 0x00001FCF, 0x00000A0D, 0x000500C5,\n    0x0000000B, 0x00004982, 0x0000602B, 0x000059B6, 0x000500C5, 0x0000000B,\n    0x00003E30, 0x00001FCF, 0x00004982, 0x000400C8, 0x0000000B, 0x00002111,\n    0x00003E30, 0x000500C7, 0x0000000B, 0x00002768, 0x000040EB, 0x00002111,\n    0x00050082, 0x0000000B, 0x00003FB2, 0x00000908, 0x00002768, 0x000500C7,\n    0x0000000B, 0x0000440D, 0x00003FB2, 0x00002111, 0x000500C7, 0x0000000B,\n    0x00004265, 0x0000440D, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003573,\n    0x00003282, 0x00004265, 0x000500C7, 0x0000000B, 0x000055E3, 0x00002768,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00004FB9, 0x00003332, 0x000055E3,\n    0x00050080, 0x0000000B, 0x00004D8F, 0x00003573, 0x00004FB9, 0x00050086,\n    0x0000000B, 0x000032D4, 0x00004D8F, 0x00000A19, 0x000500C2, 0x0000000B,\n    0x000059FB, 0x0000440D, 0x00000A13, 0x000500C7, 0x0000000B, 0x0000223D,\n    0x000059FB, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AC7, 0x00003282,\n    0x0000223D, 0x000500C2, 0x0000000B, 0x00003407, 0x00002768, 0x00000A13,\n    0x000500C7, 0x0000000B, 0x000061A1, 0x00003407, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x0000628E, 0x00003332, 0x000061A1, 0x00050080, 0x0000000B,\n    0x00004DCC, 0x00003AC7, 0x0000628E, 0x00050086, 0x0000000B, 0x0000316C,\n    0x00004DCC, 0x00000A19, 0x000500C4, 0x0000000B, 0x00001FF8, 0x0000316C,\n    0x00000A22, 0x000500C5, 0x0000000B, 0x00001D99, 0x000032D4, 0x00001FF8,\n    0x000500C2, 0x0000000B, 0x000055C7, 0x0000440D, 0x00000A1C, 0x000500C7,\n    0x0000000B, 0x000044D1, 0x000055C7, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00003AC8, 0x00003282, 0x000044D1, 0x000500C2, 0x0000000B, 0x00003408,\n    0x00002768, 0x00000A1C, 0x000500C7, 0x0000000B, 0x000061A2, 0x00003408,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x0000628F, 0x00003332, 0x000061A2,\n    0x00050080, 0x0000000B, 0x00004DCD, 0x00003AC8, 0x0000628F, 0x00050086,\n    0x0000000B, 0x0000316D, 0x00004DCD, 0x00000A19, 0x000500C4, 0x0000000B,\n    0x00001FF9, 0x0000316D, 0x00000A3A, 0x000500C5, 0x0000000B, 0x00001D9A,\n    0x00001D99, 0x00001FF9, 0x000500C2, 0x0000000B, 0x000055C8, 0x0000440D,\n    0x00000A25, 0x000500C7, 0x0000000B, 0x000044D2, 0x000055C8, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00003AC9, 0x00003282, 0x000044D2, 0x000500C2,\n    0x0000000B, 0x00003409, 0x00002768, 0x00000A25, 0x000500C7, 0x0000000B,\n    0x000061A3, 0x00003409, 0x00000A1F, 0x00050084, 0x0000000B, 0x00006290,\n    0x00003332, 0x000061A3, 0x00050080, 0x0000000B, 0x00004DCE, 0x00003AC9,\n    0x00006290, 0x00050086, 0x0000000B, 0x0000316E, 0x00004DCE, 0x00000A19,\n    0x000500C4, 0x0000000B, 0x00002046, 0x0000316E, 0x00000A52, 0x000500C5,\n    0x0000000B, 0x00001A26, 0x00001D9A, 0x00002046, 0x000500C7, 0x0000000B,\n    0x00004FBA, 0x000040EB, 0x00003E30, 0x000500C7, 0x0000000B, 0x00004406,\n    0x00004FBA, 0x00000A0D, 0x000500C7, 0x0000000B, 0x00004C6D, 0x00004FBA,\n    0x00000A22, 0x000500C4, 0x0000000B, 0x0000616A, 0x00004C6D, 0x00000A19,\n    0x000500C5, 0x0000000B, 0x000042C7, 0x00004406, 0x0000616A, 0x000500C7,\n    0x0000000B, 0x0000518E, 0x00004FBA, 0x00000ACA, 0x000500C4, 0x0000000B,\n    0x00005B1D, 0x0000518E, 0x00000A28, 0x000500C5, 0x0000000B, 0x000042C8,\n    0x000042C7, 0x00005B1D, 0x000500C7, 0x0000000B, 0x0000518F, 0x00004FBA,\n    0x00000447, 0x000500C4, 0x0000000B, 0x00005624, 0x0000518F, 0x00000A37,\n    0x000500C5, 0x0000000B, 0x0000207D, 0x000042C8, 0x00005624, 0x00050084,\n    0x0000000B, 0x000028BA, 0x0000207D, 0x00000144, 0x00050080, 0x0000000B,\n    0x00004806, 0x00001A26, 0x000028BA, 0x000200F9, 0x00002DCD, 0x000200F8,\n    0x000038C4, 0x000400C8, 0x0000000B, 0x000029DA, 0x000040EB, 0x000500C7,\n    0x0000000B, 0x00003C04, 0x000029DA, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00004536, 0x00003282, 0x00003C04, 0x000500C7, 0x0000000B, 0x000055E4,\n    0x000040EB, 0x00000A1F, 0x00050084, 0x0000000B, 0x00004FBB, 0x00003332,\n    0x000055E4, 0x00050080, 0x0000000B, 0x00004D90, 0x00004536, 0x00004FBB,\n    0x00050086, 0x0000000B, 0x000032D5, 0x00004D90, 0x00000A1F, 0x000500C2,\n    0x0000000B, 0x000059FC, 0x000029DA, 0x00000A13, 0x000500C7, 0x0000000B,\n    0x0000223E, 0x000059FC, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003ACA,\n    0x00003282, 0x0000223E, 0x000500C2, 0x0000000B, 0x0000340A, 0x000040EB,\n    0x00000A13, 0x000500C7, 0x0000000B, 0x000061A4, 0x0000340A, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00006291, 0x00003332, 0x000061A4, 0x00050080,\n    0x0000000B, 0x00004DCF, 0x00003ACA, 0x00006291, 0x00050086, 0x0000000B,\n    0x0000316F, 0x00004DCF, 0x00000A1F, 0x000500C4, 0x0000000B, 0x00001FFA,\n    0x0000316F, 0x00000A22, 0x000500C5, 0x0000000B, 0x00001D9B, 0x000032D5,\n    0x00001FFA, 0x000500C2, 0x0000000B, 0x000055C9, 0x000029DA, 0x00000A1C,\n    0x000500C7, 0x0000000B, 0x000044D3, 0x000055C9, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00003ACB, 0x00003282, 0x000044D3, 0x000500C2, 0x0000000B,\n    0x0000340B, 0x000040EB, 0x00000A1C, 0x000500C7, 0x0000000B, 0x000061A5,\n    0x0000340B, 0x00000A1F, 0x00050084, 0x0000000B, 0x00006292, 0x00003332,\n    0x000061A5, 0x00050080, 0x0000000B, 0x00004DD0, 0x00003ACB, 0x00006292,\n    0x00050086, 0x0000000B, 0x00003170, 0x00004DD0, 0x00000A1F, 0x000500C4,\n    0x0000000B, 0x00001FFB, 0x00003170, 0x00000A3A, 0x000500C5, 0x0000000B,\n    0x00001D9C, 0x00001D9B, 0x00001FFB, 0x000500C2, 0x0000000B, 0x000055CA,\n    0x000029DA, 0x00000A25, 0x000500C7, 0x0000000B, 0x000044D4, 0x000055CA,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00003ACC, 0x00003282, 0x000044D4,\n    0x000500C2, 0x0000000B, 0x0000340C, 0x000040EB, 0x00000A25, 0x000500C7,\n    0x0000000B, 0x000061A6, 0x0000340C, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00006293, 0x00003332, 0x000061A6, 0x00050080, 0x0000000B, 0x00004DD1,\n    0x00003ACC, 0x00006293, 0x00050086, 0x0000000B, 0x00003171, 0x00004DD1,\n    0x00000A1F, 0x000500C4, 0x0000000B, 0x000023FB, 0x00003171, 0x00000A52,\n    0x000500C5, 0x0000000B, 0x0000467E, 0x00001D9C, 0x000023FB, 0x000200F9,\n    0x00002DCD, 0x000200F8, 0x00002DCD, 0x000700F5, 0x0000000B, 0x00005024,\n    0x00004806, 0x0000299A, 0x0000467E, 0x000038C4, 0x00050051, 0x0000000B,\n    0x000040EC, 0x00002EF7, 0x00000003, 0x000300F7, 0x00002DB7, 0x00000000,\n    0x000400FA, 0x00004E86, 0x0000299B, 0x000038C5, 0x000200F8, 0x0000299B,\n    0x000500C7, 0x0000000B, 0x00004504, 0x000040EC, 0x0000003A, 0x000500C7,\n    0x0000000B, 0x00005D97, 0x000040EC, 0x0000022D, 0x000500C2, 0x0000000B,\n    0x0000555F, 0x00005D97, 0x00000A0D, 0x000500C7, 0x0000000B, 0x00001FD0,\n    0x00004504, 0x0000555F, 0x000500C4, 0x0000000B, 0x0000602C, 0x00001FD0,\n    0x00000A0D, 0x000500C2, 0x0000000B, 0x000059B7, 0x00001FD0, 0x00000A0D,\n    0x000500C5, 0x0000000B, 0x00004983, 0x0000602C, 0x000059B7, 0x000500C5,\n    0x0000000B, 0x00003E31, 0x00001FD0, 0x00004983, 0x000400C8, 0x0000000B,\n    0x00002112, 0x00003E31, 0x000500C7, 0x0000000B, 0x00002769, 0x000040EC,\n    0x00002112, 0x00050082, 0x0000000B, 0x00003FB3, 0x00000908, 0x00002769,\n    0x000500C7, 0x0000000B, 0x0000440E, 0x00003FB3, 0x00002112, 0x000500C7,\n    0x0000000B, 0x00004266, 0x0000440E, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00003574, 0x00003283, 0x00004266, 0x000500C7, 0x0000000B, 0x000055E5,\n    0x00002769, 0x00000A1F, 0x00050084, 0x0000000B, 0x00004FBC, 0x00003333,\n    0x000055E5, 0x00050080, 0x0000000B, 0x00004D91, 0x00003574, 0x00004FBC,\n    0x00050086, 0x0000000B, 0x000032D6, 0x00004D91, 0x00000A19, 0x000500C2,\n    0x0000000B, 0x000059FD, 0x0000440E, 0x00000A13, 0x000500C7, 0x0000000B,\n    0x0000223F, 0x000059FD, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003ACD,\n    0x00003283, 0x0000223F, 0x000500C2, 0x0000000B, 0x0000340D, 0x00002769,\n    0x00000A13, 0x000500C7, 0x0000000B, 0x000061A7, 0x0000340D, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00006294, 0x00003333, 0x000061A7, 0x00050080,\n    0x0000000B, 0x00004DD2, 0x00003ACD, 0x00006294, 0x00050086, 0x0000000B,\n    0x00003172, 0x00004DD2, 0x00000A19, 0x000500C4, 0x0000000B, 0x00001FFC,\n    0x00003172, 0x00000A22, 0x000500C5, 0x0000000B, 0x00001D9D, 0x000032D6,\n    0x00001FFC, 0x000500C2, 0x0000000B, 0x000055CB, 0x0000440E, 0x00000A1C,\n    0x000500C7, 0x0000000B, 0x000044D5, 0x000055CB, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00003ACE, 0x00003283, 0x000044D5, 0x000500C2, 0x0000000B,\n    0x0000340E, 0x00002769, 0x00000A1C, 0x000500C7, 0x0000000B, 0x000061A8,\n    0x0000340E, 0x00000A1F, 0x00050084, 0x0000000B, 0x00006295, 0x00003333,\n    0x000061A8, 0x00050080, 0x0000000B, 0x00004DD3, 0x00003ACE, 0x00006295,\n    0x00050086, 0x0000000B, 0x00003173, 0x00004DD3, 0x00000A19, 0x000500C4,\n    0x0000000B, 0x00001FFD, 0x00003173, 0x00000A3A, 0x000500C5, 0x0000000B,\n    0x00001D9E, 0x00001D9D, 0x00001FFD, 0x000500C2, 0x0000000B, 0x000055CC,\n    0x0000440E, 0x00000A25, 0x000500C7, 0x0000000B, 0x000044D6, 0x000055CC,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00003ACF, 0x00003283, 0x000044D6,\n    0x000500C2, 0x0000000B, 0x0000340F, 0x00002769, 0x00000A25, 0x000500C7,\n    0x0000000B, 0x000061A9, 0x0000340F, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00006296, 0x00003333, 0x000061A9, 0x00050080, 0x0000000B, 0x00004DD4,\n    0x00003ACF, 0x00006296, 0x00050086, 0x0000000B, 0x00003174, 0x00004DD4,\n    0x00000A19, 0x000500C4, 0x0000000B, 0x00002047, 0x00003174, 0x00000A52,\n    0x000500C5, 0x0000000B, 0x00001A27, 0x00001D9E, 0x00002047, 0x000500C7,\n    0x0000000B, 0x00004FBD, 0x000040EC, 0x00003E31, 0x000500C7, 0x0000000B,\n    0x0000440F, 0x00004FBD, 0x00000A0D, 0x000500C7, 0x0000000B, 0x00004C6E,\n    0x00004FBD, 0x00000A22, 0x000500C4, 0x0000000B, 0x0000616B, 0x00004C6E,\n    0x00000A19, 0x000500C5, 0x0000000B, 0x000042C9, 0x0000440F, 0x0000616B,\n    0x000500C7, 0x0000000B, 0x00005190, 0x00004FBD, 0x00000ACA, 0x000500C4,\n    0x0000000B, 0x00005B1E, 0x00005190, 0x00000A28, 0x000500C5, 0x0000000B,\n    0x000042CA, 0x000042C9, 0x00005B1E, 0x000500C7, 0x0000000B, 0x00005191,\n    0x00004FBD, 0x00000447, 0x000500C4, 0x0000000B, 0x00005625, 0x00005191,\n    0x00000A37, 0x000500C5, 0x0000000B, 0x0000207E, 0x000042CA, 0x00005625,\n    0x00050084, 0x0000000B, 0x000028BB, 0x0000207E, 0x00000144, 0x00050080,\n    0x0000000B, 0x00004807, 0x00001A27, 0x000028BB, 0x000200F9, 0x00002DB7,\n    0x000200F8, 0x000038C5, 0x000400C8, 0x0000000B, 0x000029DB, 0x000040EC,\n    0x000500C7, 0x0000000B, 0x00003C05, 0x000029DB, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00004537, 0x00003283, 0x00003C05, 0x000500C7, 0x0000000B,\n    0x000055E6, 0x000040EC, 0x00000A1F, 0x00050084, 0x0000000B, 0x00004FBE,\n    0x00003333, 0x000055E6, 0x00050080, 0x0000000B, 0x00004D92, 0x00004537,\n    0x00004FBE, 0x00050086, 0x0000000B, 0x000032D8, 0x00004D92, 0x00000A1F,\n    0x000500C2, 0x0000000B, 0x000059FE, 0x000029DB, 0x00000A13, 0x000500C7,\n    0x0000000B, 0x00002240, 0x000059FE, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00003AD0, 0x00003283, 0x00002240, 0x000500C2, 0x0000000B, 0x00003410,\n    0x000040EC, 0x00000A13, 0x000500C7, 0x0000000B, 0x000061AA, 0x00003410,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00006297, 0x00003333, 0x000061AA,\n    0x00050080, 0x0000000B, 0x00004DD5, 0x00003AD0, 0x00006297, 0x00050086,\n    0x0000000B, 0x00003175, 0x00004DD5, 0x00000A1F, 0x000500C4, 0x0000000B,\n    0x00001FFE, 0x00003175, 0x00000A22, 0x000500C5, 0x0000000B, 0x00001D9F,\n    0x000032D8, 0x00001FFE, 0x000500C2, 0x0000000B, 0x000055CD, 0x000029DB,\n    0x00000A1C, 0x000500C7, 0x0000000B, 0x000044D7, 0x000055CD, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00003AD1, 0x00003283, 0x000044D7, 0x000500C2,\n    0x0000000B, 0x00003411, 0x000040EC, 0x00000A1C, 0x000500C7, 0x0000000B,\n    0x000061AB, 0x00003411, 0x00000A1F, 0x00050084, 0x0000000B, 0x00006298,\n    0x00003333, 0x000061AB, 0x00050080, 0x0000000B, 0x00004DD6, 0x00003AD1,\n    0x00006298, 0x00050086, 0x0000000B, 0x00003176, 0x00004DD6, 0x00000A1F,\n    0x000500C4, 0x0000000B, 0x00001FFF, 0x00003176, 0x00000A3A, 0x000500C5,\n    0x0000000B, 0x00001DA0, 0x00001D9F, 0x00001FFF, 0x000500C2, 0x0000000B,\n    0x000055CE, 0x000029DB, 0x00000A25, 0x000500C7, 0x0000000B, 0x000044D8,\n    0x000055CE, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AD2, 0x00003283,\n    0x000044D8, 0x000500C2, 0x0000000B, 0x00003412, 0x000040EC, 0x00000A25,\n    0x000500C7, 0x0000000B, 0x000061AC, 0x00003412, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00006299, 0x00003333, 0x000061AC, 0x00050080, 0x0000000B,\n    0x00004DD7, 0x00003AD2, 0x00006299, 0x00050086, 0x0000000B, 0x00003177,\n    0x00004DD7, 0x00000A1F, 0x000500C4, 0x0000000B, 0x000023FC, 0x00003177,\n    0x00000A52, 0x000500C5, 0x0000000B, 0x0000467F, 0x00001DA0, 0x000023FC,\n    0x000200F9, 0x00002DB7, 0x000200F8, 0x00002DB7, 0x000700F5, 0x0000000B,\n    0x0000434E, 0x00004807, 0x0000299B, 0x0000467F, 0x000038C5, 0x00070050,\n    0x00000017, 0x000038F8, 0x00005022, 0x00005023, 0x00005024, 0x0000434E,\n    0x00060041, 0x00000294, 0x00003334, 0x0000140E, 0x00000A0B, 0x000059F6,\n    0x0003003E, 0x00003334, 0x000038F8, 0x00050080, 0x0000000B, 0x000039F8,\n    0x00003220, 0x00000A11, 0x000500B0, 0x00000009, 0x00002E0B, 0x000039F8,\n    0x000019C2, 0x000300F7, 0x00001C26, 0x00000002, 0x000400FA, 0x00002E0B,\n    0x0000592D, 0x00001C26, 0x000200F8, 0x0000592D, 0x00050080, 0x0000000B,\n    0x00003416, 0x00003C79, 0x0000578C, 0x000500C2, 0x00000017, 0x00003D27,\n    0x00004137, 0x0000013D, 0x00050051, 0x0000000B, 0x00005D1B, 0x00003D27,\n    0x00000000, 0x000300F7, 0x00002DCE, 0x00000000, 0x000400FA, 0x00004E83,\n    0x0000299C, 0x000055A9, 0x000200F8, 0x0000299C, 0x000500C7, 0x0000000B,\n    0x00004505, 0x00005D1B, 0x000009C8, 0x000500C7, 0x0000000B, 0x00005D98,\n    0x00005D1B, 0x00000986, 0x000500C2, 0x0000000B, 0x00005560, 0x00005D98,\n    0x00000A0D, 0x000500C7, 0x0000000B, 0x00001FD1, 0x00004505, 0x00005560,\n    0x000500C4, 0x0000000B, 0x0000602D, 0x00001FD1, 0x00000A0D, 0x000500C2,\n    0x0000000B, 0x000059B8, 0x00001FD1, 0x00000A0D, 0x000500C5, 0x0000000B,\n    0x0000496D, 0x0000602D, 0x000059B8, 0x000500C5, 0x0000000B, 0x00003EB5,\n    0x00001FD1, 0x0000496D, 0x000500C7, 0x0000000B, 0x00004789, 0x00005D1B,\n    0x000009E9, 0x000500C5, 0x0000000B, 0x00003961, 0x00004789, 0x00000944,\n    0x000500C7, 0x0000000B, 0x00004FBF, 0x00003961, 0x00003EB5, 0x000500C2,\n    0x0000000B, 0x0000503F, 0x00004505, 0x00000A0D, 0x000500C5, 0x0000000B,\n    0x0000615E, 0x00004789, 0x0000503F, 0x000500C2, 0x0000000B, 0x000055A8,\n    0x00005D98, 0x00000A10, 0x000500C5, 0x0000000B, 0x00005896, 0x0000615E,\n    0x000055A8, 0x000500C6, 0x0000000B, 0x00001E31, 0x00005896, 0x000009E9,\n    0x000400C8, 0x0000000B, 0x0000254D, 0x0000503F, 0x000500C7, 0x0000000B,\n    0x00003925, 0x00004789, 0x0000254D, 0x000400C8, 0x0000000B, 0x000020F1,\n    0x000055A8, 0x000500C7, 0x0000000B, 0x00002C97, 0x00003925, 0x000020F1,\n    0x000500C5, 0x0000000B, 0x00001A97, 0x00005D1B, 0x00001E31, 0x00050082,\n    0x0000000B, 0x00004C3D, 0x00001A97, 0x000009E9, 0x000500C5, 0x0000000B,\n    0x00003A24, 0x00004C3D, 0x00002C97, 0x000500C4, 0x0000000B, 0x00004738,\n    0x00002C97, 0x00000A10, 0x000500C5, 0x0000000B, 0x00003C06, 0x00003A24,\n    0x00004738, 0x000400C8, 0x0000000B, 0x00002F7E, 0x00003EB5, 0x000500C7,\n    0x0000000B, 0x00004854, 0x00003C06, 0x00002F7E, 0x000500C5, 0x0000000B,\n    0x00001870, 0x00004854, 0x00004FBF, 0x000200F9, 0x00002DCE, 0x000200F8,\n    0x000055A9, 0x000500C7, 0x0000000B, 0x00004E73, 0x00005D1B, 0x000009E9,\n    0x000500C7, 0x0000000B, 0x00005D6A, 0x00005D1B, 0x000009C8, 0x000500C2,\n    0x0000000B, 0x000056EB, 0x00005D6A, 0x00000A0D, 0x000500C5, 0x0000000B,\n    0x00005DC4, 0x00004E73, 0x000056EB, 0x000500C7, 0x0000000B, 0x00004C93,\n    0x00005D1B, 0x00000986, 0x000500C2, 0x0000000B, 0x0000508B, 0x00004C93,\n    0x00000A10, 0x000500C5, 0x0000000B, 0x00005EE3, 0x00005DC4, 0x0000508B,\n    0x000500C6, 0x0000000B, 0x00001E32, 0x00005EE3, 0x000009E9, 0x000400C8,\n    0x0000000B, 0x0000254E, 0x000056EB, 0x000500C7, 0x0000000B, 0x00003926,\n    0x00004E73, 0x0000254E, 0x000400C8, 0x0000000B, 0x000020F2, 0x0000508B,\n    0x000500C7, 0x0000000B, 0x00002C98, 0x00003926, 0x000020F2, 0x000500C5,\n    0x0000000B, 0x00001A98, 0x00005D1B, 0x00001E32, 0x00050082, 0x0000000B,\n    0x00004C3E, 0x00001A98, 0x000009E9, 0x000500C5, 0x0000000B, 0x00003A25,\n    0x00004C3E, 0x00002C98, 0x000500C4, 0x0000000B, 0x000046EC, 0x00002C98,\n    0x00000A0D, 0x000500C5, 0x0000000B, 0x00003E8C, 0x00003A25, 0x000046EC,\n    0x000500C4, 0x0000000B, 0x00001FBA, 0x00002C98, 0x00000A10, 0x000500C5,\n    0x0000000B, 0x00001E84, 0x00003E8C, 0x00001FBA, 0x000200F9, 0x00002DCE,\n    0x000200F8, 0x00002DCE, 0x000700F5, 0x0000000B, 0x00005025, 0x00001870,\n    0x0000299C, 0x00001E84, 0x000055A9, 0x00050051, 0x0000000B, 0x000040ED,\n    0x00003D27, 0x00000001, 0x000300F7, 0x00002DCF, 0x00000000, 0x000400FA,\n    0x00004E84, 0x0000299D, 0x000055AB, 0x000200F8, 0x0000299D, 0x000500C7,\n    0x0000000B, 0x00004506, 0x000040ED, 0x000009C8, 0x000500C7, 0x0000000B,\n    0x00005D99, 0x000040ED, 0x00000986, 0x000500C2, 0x0000000B, 0x00005561,\n    0x00005D99, 0x00000A0D, 0x000500C7, 0x0000000B, 0x00001FD2, 0x00004506,\n    0x00005561, 0x000500C4, 0x0000000B, 0x0000602E, 0x00001FD2, 0x00000A0D,\n    0x000500C2, 0x0000000B, 0x000059B9, 0x00001FD2, 0x00000A0D, 0x000500C5,\n    0x0000000B, 0x0000496E, 0x0000602E, 0x000059B9, 0x000500C5, 0x0000000B,\n    0x00003EB6, 0x00001FD2, 0x0000496E, 0x000500C7, 0x0000000B, 0x0000478A,\n    0x000040ED, 0x000009E9, 0x000500C5, 0x0000000B, 0x00003962, 0x0000478A,\n    0x00000944, 0x000500C7, 0x0000000B, 0x00004FC0, 0x00003962, 0x00003EB6,\n    0x000500C2, 0x0000000B, 0x00005040, 0x00004506, 0x00000A0D, 0x000500C5,\n    0x0000000B, 0x0000615F, 0x0000478A, 0x00005040, 0x000500C2, 0x0000000B,\n    0x000055AA, 0x00005D99, 0x00000A10, 0x000500C5, 0x0000000B, 0x00005897,\n    0x0000615F, 0x000055AA, 0x000500C6, 0x0000000B, 0x00001E33, 0x00005897,\n    0x000009E9, 0x000400C8, 0x0000000B, 0x0000254F, 0x00005040, 0x000500C7,\n    0x0000000B, 0x00003927, 0x0000478A, 0x0000254F, 0x000400C8, 0x0000000B,\n    0x000020F3, 0x000055AA, 0x000500C7, 0x0000000B, 0x00002C99, 0x00003927,\n    0x000020F3, 0x000500C5, 0x0000000B, 0x00001A99, 0x000040ED, 0x00001E33,\n    0x00050082, 0x0000000B, 0x00004C3F, 0x00001A99, 0x000009E9, 0x000500C5,\n    0x0000000B, 0x00003A26, 0x00004C3F, 0x00002C99, 0x000500C4, 0x0000000B,\n    0x00004739, 0x00002C99, 0x00000A10, 0x000500C5, 0x0000000B, 0x00003C07,\n    0x00003A26, 0x00004739, 0x000400C8, 0x0000000B, 0x00002F7F, 0x00003EB6,\n    0x000500C7, 0x0000000B, 0x00004855, 0x00003C07, 0x00002F7F, 0x000500C5,\n    0x0000000B, 0x00001871, 0x00004855, 0x00004FC0, 0x000200F9, 0x00002DCF,\n    0x000200F8, 0x000055AB, 0x000500C7, 0x0000000B, 0x00004E74, 0x000040ED,\n    0x000009E9, 0x000500C7, 0x0000000B, 0x00005D6B, 0x000040ED, 0x000009C8,\n    0x000500C2, 0x0000000B, 0x000056EC, 0x00005D6B, 0x00000A0D, 0x000500C5,\n    0x0000000B, 0x00005DC5, 0x00004E74, 0x000056EC, 0x000500C7, 0x0000000B,\n    0x00004C94, 0x000040ED, 0x00000986, 0x000500C2, 0x0000000B, 0x0000508C,\n    0x00004C94, 0x00000A10, 0x000500C5, 0x0000000B, 0x00005EE4, 0x00005DC5,\n    0x0000508C, 0x000500C6, 0x0000000B, 0x00001E34, 0x00005EE4, 0x000009E9,\n    0x000400C8, 0x0000000B, 0x00002550, 0x000056EC, 0x000500C7, 0x0000000B,\n    0x00003928, 0x00004E74, 0x00002550, 0x000400C8, 0x0000000B, 0x000020F4,\n    0x0000508C, 0x000500C7, 0x0000000B, 0x00002C9A, 0x00003928, 0x000020F4,\n    0x000500C5, 0x0000000B, 0x00001A9A, 0x000040ED, 0x00001E34, 0x00050082,\n    0x0000000B, 0x00004C40, 0x00001A9A, 0x000009E9, 0x000500C5, 0x0000000B,\n    0x00003A27, 0x00004C40, 0x00002C9A, 0x000500C4, 0x0000000B, 0x000046ED,\n    0x00002C9A, 0x00000A0D, 0x000500C5, 0x0000000B, 0x00003E8D, 0x00003A27,\n    0x000046ED, 0x000500C4, 0x0000000B, 0x00001FBB, 0x00002C9A, 0x00000A10,\n    0x000500C5, 0x0000000B, 0x00001E85, 0x00003E8D, 0x00001FBB, 0x000200F9,\n    0x00002DCF, 0x000200F8, 0x00002DCF, 0x000700F5, 0x0000000B, 0x00005026,\n    0x00001871, 0x0000299D, 0x00001E85, 0x000055AB, 0x00050051, 0x0000000B,\n    0x000040EE, 0x00003D27, 0x00000002, 0x000300F7, 0x00002DD0, 0x00000000,\n    0x000400FA, 0x00004E85, 0x0000299E, 0x000055AD, 0x000200F8, 0x0000299E,\n    0x000500C7, 0x0000000B, 0x00004507, 0x000040EE, 0x000009C8, 0x000500C7,\n    0x0000000B, 0x00005D9A, 0x000040EE, 0x00000986, 0x000500C2, 0x0000000B,\n    0x00005562, 0x00005D9A, 0x00000A0D, 0x000500C7, 0x0000000B, 0x00001FD3,\n    0x00004507, 0x00005562, 0x000500C4, 0x0000000B, 0x0000602F, 0x00001FD3,\n    0x00000A0D, 0x000500C2, 0x0000000B, 0x000059BA, 0x00001FD3, 0x00000A0D,\n    0x000500C5, 0x0000000B, 0x0000496F, 0x0000602F, 0x000059BA, 0x000500C5,\n    0x0000000B, 0x00003EB7, 0x00001FD3, 0x0000496F, 0x000500C7, 0x0000000B,\n    0x0000478B, 0x000040EE, 0x000009E9, 0x000500C5, 0x0000000B, 0x00003963,\n    0x0000478B, 0x00000944, 0x000500C7, 0x0000000B, 0x00004FC1, 0x00003963,\n    0x00003EB7, 0x000500C2, 0x0000000B, 0x00005041, 0x00004507, 0x00000A0D,\n    0x000500C5, 0x0000000B, 0x00006160, 0x0000478B, 0x00005041, 0x000500C2,\n    0x0000000B, 0x000055AC, 0x00005D9A, 0x00000A10, 0x000500C5, 0x0000000B,\n    0x00005898, 0x00006160, 0x000055AC, 0x000500C6, 0x0000000B, 0x00001E35,\n    0x00005898, 0x000009E9, 0x000400C8, 0x0000000B, 0x00002551, 0x00005041,\n    0x000500C7, 0x0000000B, 0x00003929, 0x0000478B, 0x00002551, 0x000400C8,\n    0x0000000B, 0x000020F5, 0x000055AC, 0x000500C7, 0x0000000B, 0x00002C9B,\n    0x00003929, 0x000020F5, 0x000500C5, 0x0000000B, 0x00001A9B, 0x000040EE,\n    0x00001E35, 0x00050082, 0x0000000B, 0x00004C41, 0x00001A9B, 0x000009E9,\n    0x000500C5, 0x0000000B, 0x00003A28, 0x00004C41, 0x00002C9B, 0x000500C4,\n    0x0000000B, 0x0000473A, 0x00002C9B, 0x00000A10, 0x000500C5, 0x0000000B,\n    0x00003C08, 0x00003A28, 0x0000473A, 0x000400C8, 0x0000000B, 0x00002F80,\n    0x00003EB7, 0x000500C7, 0x0000000B, 0x00004856, 0x00003C08, 0x00002F80,\n    0x000500C5, 0x0000000B, 0x00001872, 0x00004856, 0x00004FC1, 0x000200F9,\n    0x00002DD0, 0x000200F8, 0x000055AD, 0x000500C7, 0x0000000B, 0x00004E75,\n    0x000040EE, 0x000009E9, 0x000500C7, 0x0000000B, 0x00005D6C, 0x000040EE,\n    0x000009C8, 0x000500C2, 0x0000000B, 0x000056ED, 0x00005D6C, 0x00000A0D,\n    0x000500C5, 0x0000000B, 0x00005DC6, 0x00004E75, 0x000056ED, 0x000500C7,\n    0x0000000B, 0x00004C95, 0x000040EE, 0x00000986, 0x000500C2, 0x0000000B,\n    0x0000508D, 0x00004C95, 0x00000A10, 0x000500C5, 0x0000000B, 0x00005EE5,\n    0x00005DC6, 0x0000508D, 0x000500C6, 0x0000000B, 0x00001E36, 0x00005EE5,\n    0x000009E9, 0x000400C8, 0x0000000B, 0x00002552, 0x000056ED, 0x000500C7,\n    0x0000000B, 0x0000392A, 0x00004E75, 0x00002552, 0x000400C8, 0x0000000B,\n    0x000020F6, 0x0000508D, 0x000500C7, 0x0000000B, 0x00002C9C, 0x0000392A,\n    0x000020F6, 0x000500C5, 0x0000000B, 0x00001A9C, 0x000040EE, 0x00001E36,\n    0x00050082, 0x0000000B, 0x00004C42, 0x00001A9C, 0x000009E9, 0x000500C5,\n    0x0000000B, 0x00003A29, 0x00004C42, 0x00002C9C, 0x000500C4, 0x0000000B,\n    0x000046EE, 0x00002C9C, 0x00000A0D, 0x000500C5, 0x0000000B, 0x00003E8E,\n    0x00003A29, 0x000046EE, 0x000500C4, 0x0000000B, 0x00001FBC, 0x00002C9C,\n    0x00000A10, 0x000500C5, 0x0000000B, 0x00001E86, 0x00003E8E, 0x00001FBC,\n    0x000200F9, 0x00002DD0, 0x000200F8, 0x00002DD0, 0x000700F5, 0x0000000B,\n    0x00005027, 0x00001872, 0x0000299E, 0x00001E86, 0x000055AD, 0x00050051,\n    0x0000000B, 0x000040EF, 0x00003D27, 0x00000003, 0x000300F7, 0x00002DB8,\n    0x00000000, 0x000400FA, 0x00004E86, 0x0000299F, 0x000055CF, 0x000200F8,\n    0x0000299F, 0x000500C7, 0x0000000B, 0x00004508, 0x000040EF, 0x000009C8,\n    0x000500C7, 0x0000000B, 0x00005D9B, 0x000040EF, 0x00000986, 0x000500C2,\n    0x0000000B, 0x00005563, 0x00005D9B, 0x00000A0D, 0x000500C7, 0x0000000B,\n    0x00001FD4, 0x00004508, 0x00005563, 0x000500C4, 0x0000000B, 0x00006030,\n    0x00001FD4, 0x00000A0D, 0x000500C2, 0x0000000B, 0x000059BB, 0x00001FD4,\n    0x00000A0D, 0x000500C5, 0x0000000B, 0x00004970, 0x00006030, 0x000059BB,\n    0x000500C5, 0x0000000B, 0x00003EB8, 0x00001FD4, 0x00004970, 0x000500C7,\n    0x0000000B, 0x0000478C, 0x000040EF, 0x000009E9, 0x000500C5, 0x0000000B,\n    0x00003964, 0x0000478C, 0x00000944, 0x000500C7, 0x0000000B, 0x00004FC2,\n    0x00003964, 0x00003EB8, 0x000500C2, 0x0000000B, 0x00005042, 0x00004508,\n    0x00000A0D, 0x000500C5, 0x0000000B, 0x00006161, 0x0000478C, 0x00005042,\n    0x000500C2, 0x0000000B, 0x000055AE, 0x00005D9B, 0x00000A10, 0x000500C5,\n    0x0000000B, 0x00005899, 0x00006161, 0x000055AE, 0x000500C6, 0x0000000B,\n    0x00001E37, 0x00005899, 0x000009E9, 0x000400C8, 0x0000000B, 0x00002553,\n    0x00005042, 0x000500C7, 0x0000000B, 0x0000392B, 0x0000478C, 0x00002553,\n    0x000400C8, 0x0000000B, 0x000020F7, 0x000055AE, 0x000500C7, 0x0000000B,\n    0x00002C9D, 0x0000392B, 0x000020F7, 0x000500C5, 0x0000000B, 0x00001A9E,\n    0x000040EF, 0x00001E37, 0x00050082, 0x0000000B, 0x00004C43, 0x00001A9E,\n    0x000009E9, 0x000500C5, 0x0000000B, 0x00003A2A, 0x00004C43, 0x00002C9D,\n    0x000500C4, 0x0000000B, 0x0000473B, 0x00002C9D, 0x00000A10, 0x000500C5,\n    0x0000000B, 0x00003C09, 0x00003A2A, 0x0000473B, 0x000400C8, 0x0000000B,\n    0x00002F81, 0x00003EB8, 0x000500C7, 0x0000000B, 0x00004857, 0x00003C09,\n    0x00002F81, 0x000500C5, 0x0000000B, 0x00001873, 0x00004857, 0x00004FC2,\n    0x000200F9, 0x00002DB8, 0x000200F8, 0x000055CF, 0x000500C7, 0x0000000B,\n    0x00004E76, 0x000040EF, 0x000009E9, 0x000500C7, 0x0000000B, 0x00005D6D,\n    0x000040EF, 0x000009C8, 0x000500C2, 0x0000000B, 0x000056EE, 0x00005D6D,\n    0x00000A0D, 0x000500C5, 0x0000000B, 0x00005DC7, 0x00004E76, 0x000056EE,\n    0x000500C7, 0x0000000B, 0x00004C96, 0x000040EF, 0x00000986, 0x000500C2,\n    0x0000000B, 0x0000508E, 0x00004C96, 0x00000A10, 0x000500C5, 0x0000000B,\n    0x00005EE6, 0x00005DC7, 0x0000508E, 0x000500C6, 0x0000000B, 0x00001E38,\n    0x00005EE6, 0x000009E9, 0x000400C8, 0x0000000B, 0x00002554, 0x000056EE,\n    0x000500C7, 0x0000000B, 0x0000392C, 0x00004E76, 0x00002554, 0x000400C8,\n    0x0000000B, 0x000020F8, 0x0000508E, 0x000500C7, 0x0000000B, 0x00002C9E,\n    0x0000392C, 0x000020F8, 0x000500C5, 0x0000000B, 0x00001A9F, 0x000040EF,\n    0x00001E38, 0x00050082, 0x0000000B, 0x00004C44, 0x00001A9F, 0x000009E9,\n    0x000500C5, 0x0000000B, 0x00003A2B, 0x00004C44, 0x00002C9E, 0x000500C4,\n    0x0000000B, 0x000046EF, 0x00002C9E, 0x00000A0D, 0x000500C5, 0x0000000B,\n    0x00003E8F, 0x00003A2B, 0x000046EF, 0x000500C4, 0x0000000B, 0x00001FBD,\n    0x00002C9E, 0x00000A10, 0x000500C5, 0x0000000B, 0x00001E87, 0x00003E8F,\n    0x00001FBD, 0x000200F9, 0x00002DB8, 0x000200F8, 0x00002DB8, 0x000700F5,\n    0x0000000B, 0x00004CE1, 0x00001873, 0x0000299F, 0x00001E87, 0x000055CF,\n    0x00070050, 0x00000017, 0x00003A05, 0x00005025, 0x00005026, 0x00005027,\n    0x00004CE1, 0x000500C2, 0x0000000B, 0x00001BC9, 0x00003416, 0x00000A17,\n    0x000300F7, 0x00003A2C, 0x00000000, 0x000400FA, 0x00004E83, 0x000029A0,\n    0x000038C6, 0x000200F8, 0x000029A0, 0x000500C7, 0x0000000B, 0x00004509,\n    0x00005025, 0x0000003A, 0x000500C7, 0x0000000B, 0x00005D9C, 0x00005025,\n    0x0000022D, 0x000500C2, 0x0000000B, 0x00005564, 0x00005D9C, 0x00000A0D,\n    0x000500C7, 0x0000000B, 0x00001FD5, 0x00004509, 0x00005564, 0x000500C4,\n    0x0000000B, 0x00006031, 0x00001FD5, 0x00000A0D, 0x000500C2, 0x0000000B,\n    0x000059BC, 0x00001FD5, 0x00000A0D, 0x000500C5, 0x0000000B, 0x00004984,\n    0x00006031, 0x000059BC, 0x000500C5, 0x0000000B, 0x00003E32, 0x00001FD5,\n    0x00004984, 0x000400C8, 0x0000000B, 0x00002113, 0x00003E32, 0x000500C7,\n    0x0000000B, 0x0000276A, 0x00005025, 0x00002113, 0x00050082, 0x0000000B,\n    0x00003FB4, 0x00000908, 0x0000276A, 0x000500C7, 0x0000000B, 0x00004410,\n    0x00003FB4, 0x00002113, 0x000500C7, 0x0000000B, 0x00004267, 0x00004410,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00003575, 0x00001966, 0x00004267,\n    0x000500C7, 0x0000000B, 0x000055E7, 0x0000276A, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00004FC3, 0x00003330, 0x000055E7, 0x00050080, 0x0000000B,\n    0x00004D93, 0x00003575, 0x00004FC3, 0x00050086, 0x0000000B, 0x000032D9,\n    0x00004D93, 0x00000A19, 0x000500C2, 0x0000000B, 0x000059FF, 0x00004410,\n    0x00000A13, 0x000500C7, 0x0000000B, 0x00002241, 0x000059FF, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00003AD3, 0x00001966, 0x00002241, 0x000500C2,\n    0x0000000B, 0x00003413, 0x0000276A, 0x00000A13, 0x000500C7, 0x0000000B,\n    0x000061AD, 0x00003413, 0x00000A1F, 0x00050084, 0x0000000B, 0x0000629A,\n    0x00003330, 0x000061AD, 0x00050080, 0x0000000B, 0x00004DD8, 0x00003AD3,\n    0x0000629A, 0x00050086, 0x0000000B, 0x00003178, 0x00004DD8, 0x00000A19,\n    0x000500C4, 0x0000000B, 0x00002000, 0x00003178, 0x00000A22, 0x000500C5,\n    0x0000000B, 0x00001DA1, 0x000032D9, 0x00002000, 0x000500C2, 0x0000000B,\n    0x000055D0, 0x00004410, 0x00000A1C, 0x000500C7, 0x0000000B, 0x000044D9,\n    0x000055D0, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AD4, 0x00001966,\n    0x000044D9, 0x000500C2, 0x0000000B, 0x00003414, 0x0000276A, 0x00000A1C,\n    0x000500C7, 0x0000000B, 0x000061AE, 0x00003414, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x0000629B, 0x00003330, 0x000061AE, 0x00050080, 0x0000000B,\n    0x00004DD9, 0x00003AD4, 0x0000629B, 0x00050086, 0x0000000B, 0x00003179,\n    0x00004DD9, 0x00000A19, 0x000500C4, 0x0000000B, 0x00002001, 0x00003179,\n    0x00000A3A, 0x000500C5, 0x0000000B, 0x00001DA2, 0x00001DA1, 0x00002001,\n    0x000500C2, 0x0000000B, 0x000055D1, 0x00004410, 0x00000A25, 0x000500C7,\n    0x0000000B, 0x000044DA, 0x000055D1, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00003AD5, 0x00001966, 0x000044DA, 0x000500C2, 0x0000000B, 0x00003415,\n    0x0000276A, 0x00000A25, 0x000500C7, 0x0000000B, 0x000061AF, 0x00003415,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x0000629C, 0x00003330, 0x000061AF,\n    0x00050080, 0x0000000B, 0x00004DDA, 0x00003AD5, 0x0000629C, 0x00050086,\n    0x0000000B, 0x0000317A, 0x00004DDA, 0x00000A19, 0x000500C4, 0x0000000B,\n    0x00002048, 0x0000317A, 0x00000A52, 0x000500C5, 0x0000000B, 0x00001A28,\n    0x00001DA2, 0x00002048, 0x000500C7, 0x0000000B, 0x00004FC4, 0x00005025,\n    0x00003E32, 0x000500C7, 0x0000000B, 0x00004412, 0x00004FC4, 0x00000A0D,\n    0x000500C7, 0x0000000B, 0x00004C6F, 0x00004FC4, 0x00000A22, 0x000500C4,\n    0x0000000B, 0x0000616C, 0x00004C6F, 0x00000A19, 0x000500C5, 0x0000000B,\n    0x000042CB, 0x00004412, 0x0000616C, 0x000500C7, 0x0000000B, 0x00005192,\n    0x00004FC4, 0x00000ACA, 0x000500C4, 0x0000000B, 0x00005B1F, 0x00005192,\n    0x00000A28, 0x000500C5, 0x0000000B, 0x000042CC, 0x000042CB, 0x00005B1F,\n    0x000500C7, 0x0000000B, 0x00005193, 0x00004FC4, 0x00000447, 0x000500C4,\n    0x0000000B, 0x00005626, 0x00005193, 0x00000A37, 0x000500C5, 0x0000000B,\n    0x0000207F, 0x000042CC, 0x00005626, 0x00050084, 0x0000000B, 0x000028BC,\n    0x0000207F, 0x00000144, 0x00050080, 0x0000000B, 0x00004808, 0x00001A28,\n    0x000028BC, 0x000200F9, 0x00003A2C, 0x000200F8, 0x000038C6, 0x000400C8,\n    0x0000000B, 0x000029DC, 0x00005025, 0x000500C7, 0x0000000B, 0x00003C0A,\n    0x000029DC, 0x00000A1F, 0x00050084, 0x0000000B, 0x00004538, 0x00001966,\n    0x00003C0A, 0x000500C7, 0x0000000B, 0x000055EA, 0x00005025, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00004FC5, 0x00003330, 0x000055EA, 0x00050080,\n    0x0000000B, 0x00004D94, 0x00004538, 0x00004FC5, 0x00050086, 0x0000000B,\n    0x000032DA, 0x00004D94, 0x00000A1F, 0x000500C2, 0x0000000B, 0x00005A00,\n    0x000029DC, 0x00000A13, 0x000500C7, 0x0000000B, 0x00002242, 0x00005A00,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00003AD6, 0x00001966, 0x00002242,\n    0x000500C2, 0x0000000B, 0x00003417, 0x00005025, 0x00000A13, 0x000500C7,\n    0x0000000B, 0x000061B0, 0x00003417, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x0000629D, 0x00003330, 0x000061B0, 0x00050080, 0x0000000B, 0x00004DDB,\n    0x00003AD6, 0x0000629D, 0x00050086, 0x0000000B, 0x0000317B, 0x00004DDB,\n    0x00000A1F, 0x000500C4, 0x0000000B, 0x00002002, 0x0000317B, 0x00000A22,\n    0x000500C5, 0x0000000B, 0x00001DA3, 0x000032DA, 0x00002002, 0x000500C2,\n    0x0000000B, 0x000055D2, 0x000029DC, 0x00000A1C, 0x000500C7, 0x0000000B,\n    0x000044DB, 0x000055D2, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AD7,\n    0x00001966, 0x000044DB, 0x000500C2, 0x0000000B, 0x00003418, 0x00005025,\n    0x00000A1C, 0x000500C7, 0x0000000B, 0x000061B1, 0x00003418, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x0000629E, 0x00003330, 0x000061B1, 0x00050080,\n    0x0000000B, 0x00004DDC, 0x00003AD7, 0x0000629E, 0x00050086, 0x0000000B,\n    0x0000317C, 0x00004DDC, 0x00000A1F, 0x000500C4, 0x0000000B, 0x00002003,\n    0x0000317C, 0x00000A3A, 0x000500C5, 0x0000000B, 0x00001DA4, 0x00001DA3,\n    0x00002003, 0x000500C2, 0x0000000B, 0x000055D3, 0x000029DC, 0x00000A25,\n    0x000500C7, 0x0000000B, 0x000044DC, 0x000055D3, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00003AD8, 0x00001966, 0x000044DC, 0x000500C2, 0x0000000B,\n    0x00003419, 0x00005025, 0x00000A25, 0x000500C7, 0x0000000B, 0x000061B2,\n    0x00003419, 0x00000A1F, 0x00050084, 0x0000000B, 0x0000629F, 0x00003330,\n    0x000061B2, 0x00050080, 0x0000000B, 0x00004DDD, 0x00003AD8, 0x0000629F,\n    0x00050086, 0x0000000B, 0x0000317D, 0x00004DDD, 0x00000A1F, 0x000500C4,\n    0x0000000B, 0x000023FD, 0x0000317D, 0x00000A52, 0x000500C5, 0x0000000B,\n    0x00004680, 0x00001DA4, 0x000023FD, 0x000200F9, 0x00003A2C, 0x000200F8,\n    0x00003A2C, 0x000700F5, 0x0000000B, 0x00002AB1, 0x00004808, 0x000029A0,\n    0x00004680, 0x000038C6, 0x000300F7, 0x00003A2D, 0x00000000, 0x000400FA,\n    0x00004E84, 0x000029A1, 0x000038C7, 0x000200F8, 0x000029A1, 0x000500C7,\n    0x0000000B, 0x0000450A, 0x00005026, 0x0000003A, 0x000500C7, 0x0000000B,\n    0x00005D9D, 0x00005026, 0x0000022D, 0x000500C2, 0x0000000B, 0x00005565,\n    0x00005D9D, 0x00000A0D, 0x000500C7, 0x0000000B, 0x00001FD6, 0x0000450A,\n    0x00005565, 0x000500C4, 0x0000000B, 0x00006032, 0x00001FD6, 0x00000A0D,\n    0x000500C2, 0x0000000B, 0x000059BD, 0x00001FD6, 0x00000A0D, 0x000500C5,\n    0x0000000B, 0x00004985, 0x00006032, 0x000059BD, 0x000500C5, 0x0000000B,\n    0x00003E33, 0x00001FD6, 0x00004985, 0x000400C8, 0x0000000B, 0x00002114,\n    0x00003E33, 0x000500C7, 0x0000000B, 0x0000276B, 0x00005026, 0x00002114,\n    0x00050082, 0x0000000B, 0x00003FB5, 0x00000908, 0x0000276B, 0x000500C7,\n    0x0000000B, 0x00004413, 0x00003FB5, 0x00002114, 0x000500C7, 0x0000000B,\n    0x00004268, 0x00004413, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003576,\n    0x00003281, 0x00004268, 0x000500C7, 0x0000000B, 0x000055EB, 0x0000276B,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00004FC6, 0x00003331, 0x000055EB,\n    0x00050080, 0x0000000B, 0x00004D95, 0x00003576, 0x00004FC6, 0x00050086,\n    0x0000000B, 0x000032DB, 0x00004D95, 0x00000A19, 0x000500C2, 0x0000000B,\n    0x00005A01, 0x00004413, 0x00000A13, 0x000500C7, 0x0000000B, 0x00002243,\n    0x00005A01, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AD9, 0x00003281,\n    0x00002243, 0x000500C2, 0x0000000B, 0x0000341A, 0x0000276B, 0x00000A13,\n    0x000500C7, 0x0000000B, 0x000061B3, 0x0000341A, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x000062A0, 0x00003331, 0x000061B3, 0x00050080, 0x0000000B,\n    0x00004DDE, 0x00003AD9, 0x000062A0, 0x00050086, 0x0000000B, 0x0000317E,\n    0x00004DDE, 0x00000A19, 0x000500C4, 0x0000000B, 0x00002004, 0x0000317E,\n    0x00000A22, 0x000500C5, 0x0000000B, 0x00001DA5, 0x000032DB, 0x00002004,\n    0x000500C2, 0x0000000B, 0x000055D4, 0x00004413, 0x00000A1C, 0x000500C7,\n    0x0000000B, 0x000044DD, 0x000055D4, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00003ADA, 0x00003281, 0x000044DD, 0x000500C2, 0x0000000B, 0x0000341B,\n    0x0000276B, 0x00000A1C, 0x000500C7, 0x0000000B, 0x000061B4, 0x0000341B,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x000062A1, 0x00003331, 0x000061B4,\n    0x00050080, 0x0000000B, 0x00004DDF, 0x00003ADA, 0x000062A1, 0x00050086,\n    0x0000000B, 0x0000317F, 0x00004DDF, 0x00000A19, 0x000500C4, 0x0000000B,\n    0x00002005, 0x0000317F, 0x00000A3A, 0x000500C5, 0x0000000B, 0x00001DA6,\n    0x00001DA5, 0x00002005, 0x000500C2, 0x0000000B, 0x000055D5, 0x00004413,\n    0x00000A25, 0x000500C7, 0x0000000B, 0x000044DE, 0x000055D5, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00003ADB, 0x00003281, 0x000044DE, 0x000500C2,\n    0x0000000B, 0x0000341C, 0x0000276B, 0x00000A25, 0x000500C7, 0x0000000B,\n    0x000061B5, 0x0000341C, 0x00000A1F, 0x00050084, 0x0000000B, 0x000062A2,\n    0x00003331, 0x000061B5, 0x00050080, 0x0000000B, 0x00004DE0, 0x00003ADB,\n    0x000062A2, 0x00050086, 0x0000000B, 0x00003180, 0x00004DE0, 0x00000A19,\n    0x000500C4, 0x0000000B, 0x00002049, 0x00003180, 0x00000A52, 0x000500C5,\n    0x0000000B, 0x00001A29, 0x00001DA6, 0x00002049, 0x000500C7, 0x0000000B,\n    0x00004FC9, 0x00005026, 0x00003E33, 0x000500C7, 0x0000000B, 0x00004414,\n    0x00004FC9, 0x00000A0D, 0x000500C7, 0x0000000B, 0x00004C70, 0x00004FC9,\n    0x00000A22, 0x000500C4, 0x0000000B, 0x0000616D, 0x00004C70, 0x00000A19,\n    0x000500C5, 0x0000000B, 0x000042CD, 0x00004414, 0x0000616D, 0x000500C7,\n    0x0000000B, 0x00005194, 0x00004FC9, 0x00000ACA, 0x000500C4, 0x0000000B,\n    0x00005B20, 0x00005194, 0x00000A28, 0x000500C5, 0x0000000B, 0x000042CF,\n    0x000042CD, 0x00005B20, 0x000500C7, 0x0000000B, 0x00005195, 0x00004FC9,\n    0x00000447, 0x000500C4, 0x0000000B, 0x00005627, 0x00005195, 0x00000A37,\n    0x000500C5, 0x0000000B, 0x00002080, 0x000042CF, 0x00005627, 0x00050084,\n    0x0000000B, 0x000028BD, 0x00002080, 0x00000144, 0x00050080, 0x0000000B,\n    0x00004809, 0x00001A29, 0x000028BD, 0x000200F9, 0x00003A2D, 0x000200F8,\n    0x000038C7, 0x000400C8, 0x0000000B, 0x000029DD, 0x00005026, 0x000500C7,\n    0x0000000B, 0x00003C0B, 0x000029DD, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00004539, 0x00003281, 0x00003C0B, 0x000500C7, 0x0000000B, 0x000055EC,\n    0x00005026, 0x00000A1F, 0x00050084, 0x0000000B, 0x00004FCA, 0x00003331,\n    0x000055EC, 0x00050080, 0x0000000B, 0x00004D96, 0x00004539, 0x00004FCA,\n    0x00050086, 0x0000000B, 0x000032DC, 0x00004D96, 0x00000A1F, 0x000500C2,\n    0x0000000B, 0x00005A02, 0x000029DD, 0x00000A13, 0x000500C7, 0x0000000B,\n    0x00002244, 0x00005A02, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003ADC,\n    0x00003281, 0x00002244, 0x000500C2, 0x0000000B, 0x0000341D, 0x00005026,\n    0x00000A13, 0x000500C7, 0x0000000B, 0x000061B6, 0x0000341D, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x000062A3, 0x00003331, 0x000061B6, 0x00050080,\n    0x0000000B, 0x00004DE1, 0x00003ADC, 0x000062A3, 0x00050086, 0x0000000B,\n    0x00003181, 0x00004DE1, 0x00000A1F, 0x000500C4, 0x0000000B, 0x00002006,\n    0x00003181, 0x00000A22, 0x000500C5, 0x0000000B, 0x00001DA7, 0x000032DC,\n    0x00002006, 0x000500C2, 0x0000000B, 0x000055D6, 0x000029DD, 0x00000A1C,\n    0x000500C7, 0x0000000B, 0x000044DF, 0x000055D6, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00003ADE, 0x00003281, 0x000044DF, 0x000500C2, 0x0000000B,\n    0x0000341E, 0x00005026, 0x00000A1C, 0x000500C7, 0x0000000B, 0x000061B7,\n    0x0000341E, 0x00000A1F, 0x00050084, 0x0000000B, 0x000062A4, 0x00003331,\n    0x000061B7, 0x00050080, 0x0000000B, 0x00004DE2, 0x00003ADE, 0x000062A4,\n    0x00050086, 0x0000000B, 0x00003182, 0x00004DE2, 0x00000A1F, 0x000500C4,\n    0x0000000B, 0x00002007, 0x00003182, 0x00000A3A, 0x000500C5, 0x0000000B,\n    0x00001DA8, 0x00001DA7, 0x00002007, 0x000500C2, 0x0000000B, 0x000055ED,\n    0x000029DD, 0x00000A25, 0x000500C7, 0x0000000B, 0x000044E0, 0x000055ED,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00003ADF, 0x00003281, 0x000044E0,\n    0x000500C2, 0x0000000B, 0x0000341F, 0x00005026, 0x00000A25, 0x000500C7,\n    0x0000000B, 0x000061B8, 0x0000341F, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x000062A5, 0x00003331, 0x000061B8, 0x00050080, 0x0000000B, 0x00004DE3,\n    0x00003ADF, 0x000062A5, 0x00050086, 0x0000000B, 0x00003183, 0x00004DE3,\n    0x00000A1F, 0x000500C4, 0x0000000B, 0x000023FE, 0x00003183, 0x00000A52,\n    0x000500C5, 0x0000000B, 0x00004681, 0x00001DA8, 0x000023FE, 0x000200F9,\n    0x00003A2D, 0x000200F8, 0x00003A2D, 0x000700F5, 0x0000000B, 0x00002AB2,\n    0x00004809, 0x000029A1, 0x00004681, 0x000038C7, 0x000300F7, 0x00003A2E,\n    0x00000000, 0x000400FA, 0x00004E85, 0x000029A2, 0x000038C8, 0x000200F8,\n    0x000029A2, 0x000500C7, 0x0000000B, 0x0000450B, 0x00005027, 0x0000003A,\n    0x000500C7, 0x0000000B, 0x00005D9E, 0x00005027, 0x0000022D, 0x000500C2,\n    0x0000000B, 0x00005567, 0x00005D9E, 0x00000A0D, 0x000500C7, 0x0000000B,\n    0x00001FD7, 0x0000450B, 0x00005567, 0x000500C4, 0x0000000B, 0x00006033,\n    0x00001FD7, 0x00000A0D, 0x000500C2, 0x0000000B, 0x000059BE, 0x00001FD7,\n    0x00000A0D, 0x000500C5, 0x0000000B, 0x00004986, 0x00006033, 0x000059BE,\n    0x000500C5, 0x0000000B, 0x00003E34, 0x00001FD7, 0x00004986, 0x000400C8,\n    0x0000000B, 0x00002115, 0x00003E34, 0x000500C7, 0x0000000B, 0x0000276C,\n    0x00005027, 0x00002115, 0x00050082, 0x0000000B, 0x00003FB6, 0x00000908,\n    0x0000276C, 0x000500C7, 0x0000000B, 0x00004415, 0x00003FB6, 0x00002115,\n    0x000500C7, 0x0000000B, 0x00004269, 0x00004415, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00003577, 0x00003282, 0x00004269, 0x000500C7, 0x0000000B,\n    0x000055EE, 0x0000276C, 0x00000A1F, 0x00050084, 0x0000000B, 0x00004FCB,\n    0x00003332, 0x000055EE, 0x00050080, 0x0000000B, 0x00004D97, 0x00003577,\n    0x00004FCB, 0x00050086, 0x0000000B, 0x000032DD, 0x00004D97, 0x00000A19,\n    0x000500C2, 0x0000000B, 0x00005A03, 0x00004415, 0x00000A13, 0x000500C7,\n    0x0000000B, 0x00002245, 0x00005A03, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00003AE0, 0x00003282, 0x00002245, 0x000500C2, 0x0000000B, 0x00003420,\n    0x0000276C, 0x00000A13, 0x000500C7, 0x0000000B, 0x000061B9, 0x00003420,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x000062A6, 0x00003332, 0x000061B9,\n    0x00050080, 0x0000000B, 0x00004DE4, 0x00003AE0, 0x000062A6, 0x00050086,\n    0x0000000B, 0x00003184, 0x00004DE4, 0x00000A19, 0x000500C4, 0x0000000B,\n    0x00002008, 0x00003184, 0x00000A22, 0x000500C5, 0x0000000B, 0x00001DA9,\n    0x000032DD, 0x00002008, 0x000500C2, 0x0000000B, 0x000055EF, 0x00004415,\n    0x00000A1C, 0x000500C7, 0x0000000B, 0x000044E1, 0x000055EF, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00003AE1, 0x00003282, 0x000044E1, 0x000500C2,\n    0x0000000B, 0x00003421, 0x0000276C, 0x00000A1C, 0x000500C7, 0x0000000B,\n    0x000061BA, 0x00003421, 0x00000A1F, 0x00050084, 0x0000000B, 0x000062A7,\n    0x00003332, 0x000061BA, 0x00050080, 0x0000000B, 0x00004DE5, 0x00003AE1,\n    0x000062A7, 0x00050086, 0x0000000B, 0x00003185, 0x00004DE5, 0x00000A19,\n    0x000500C4, 0x0000000B, 0x00002009, 0x00003185, 0x00000A3A, 0x000500C5,\n    0x0000000B, 0x00001DAA, 0x00001DA9, 0x00002009, 0x000500C2, 0x0000000B,\n    0x000055F0, 0x00004415, 0x00000A25, 0x000500C7, 0x0000000B, 0x000044E2,\n    0x000055F0, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AE2, 0x00003282,\n    0x000044E2, 0x000500C2, 0x0000000B, 0x00003422, 0x0000276C, 0x00000A25,\n    0x000500C7, 0x0000000B, 0x000061BB, 0x00003422, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x000062A8, 0x00003332, 0x000061BB, 0x00050080, 0x0000000B,\n    0x00004DE6, 0x00003AE2, 0x000062A8, 0x00050086, 0x0000000B, 0x00003186,\n    0x00004DE6, 0x00000A19, 0x000500C4, 0x0000000B, 0x0000204A, 0x00003186,\n    0x00000A52, 0x000500C5, 0x0000000B, 0x00001A2A, 0x00001DAA, 0x0000204A,\n    0x000500C7, 0x0000000B, 0x00004FCC, 0x00005027, 0x00003E34, 0x000500C7,\n    0x0000000B, 0x00004416, 0x00004FCC, 0x00000A0D, 0x000500C7, 0x0000000B,\n    0x00004C71, 0x00004FCC, 0x00000A22, 0x000500C4, 0x0000000B, 0x0000616E,\n    0x00004C71, 0x00000A19, 0x000500C5, 0x0000000B, 0x000042D0, 0x00004416,\n    0x0000616E, 0x000500C7, 0x0000000B, 0x00005196, 0x00004FCC, 0x00000ACA,\n    0x000500C4, 0x0000000B, 0x00005B21, 0x00005196, 0x00000A28, 0x000500C5,\n    0x0000000B, 0x000042D1, 0x000042D0, 0x00005B21, 0x000500C7, 0x0000000B,\n    0x00005197, 0x00004FCC, 0x00000447, 0x000500C4, 0x0000000B, 0x00005628,\n    0x00005197, 0x00000A37, 0x000500C5, 0x0000000B, 0x00002081, 0x000042D1,\n    0x00005628, 0x00050084, 0x0000000B, 0x000028BE, 0x00002081, 0x00000144,\n    0x00050080, 0x0000000B, 0x0000480A, 0x00001A2A, 0x000028BE, 0x000200F9,\n    0x00003A2E, 0x000200F8, 0x000038C8, 0x000400C8, 0x0000000B, 0x000029DE,\n    0x00005027, 0x000500C7, 0x0000000B, 0x00003C0C, 0x000029DE, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x0000453A, 0x00003282, 0x00003C0C, 0x000500C7,\n    0x0000000B, 0x000055F1, 0x00005027, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00004FCD, 0x00003332, 0x000055F1, 0x00050080, 0x0000000B, 0x00004D98,\n    0x0000453A, 0x00004FCD, 0x00050086, 0x0000000B, 0x000032DE, 0x00004D98,\n    0x00000A1F, 0x000500C2, 0x0000000B, 0x00005A04, 0x000029DE, 0x00000A13,\n    0x000500C7, 0x0000000B, 0x00002246, 0x00005A04, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00003AE3, 0x00003282, 0x00002246, 0x000500C2, 0x0000000B,\n    0x00003423, 0x00005027, 0x00000A13, 0x000500C7, 0x0000000B, 0x000061BC,\n    0x00003423, 0x00000A1F, 0x00050084, 0x0000000B, 0x000062A9, 0x00003332,\n    0x000061BC, 0x00050080, 0x0000000B, 0x00004DE7, 0x00003AE3, 0x000062A9,\n    0x00050086, 0x0000000B, 0x00003187, 0x00004DE7, 0x00000A1F, 0x000500C4,\n    0x0000000B, 0x0000200A, 0x00003187, 0x00000A22, 0x000500C5, 0x0000000B,\n    0x00001DAB, 0x000032DE, 0x0000200A, 0x000500C2, 0x0000000B, 0x000055F2,\n    0x000029DE, 0x00000A1C, 0x000500C7, 0x0000000B, 0x000044E3, 0x000055F2,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00003AE4, 0x00003282, 0x000044E3,\n    0x000500C2, 0x0000000B, 0x00003424, 0x00005027, 0x00000A1C, 0x000500C7,\n    0x0000000B, 0x000061BD, 0x00003424, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x000062AA, 0x00003332, 0x000061BD, 0x00050080, 0x0000000B, 0x00004DE8,\n    0x00003AE4, 0x000062AA, 0x00050086, 0x0000000B, 0x00003188, 0x00004DE8,\n    0x00000A1F, 0x000500C4, 0x0000000B, 0x0000200B, 0x00003188, 0x00000A3A,\n    0x000500C5, 0x0000000B, 0x00001DAC, 0x00001DAB, 0x0000200B, 0x000500C2,\n    0x0000000B, 0x000055F3, 0x000029DE, 0x00000A25, 0x000500C7, 0x0000000B,\n    0x000044E4, 0x000055F3, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AE5,\n    0x00003282, 0x000044E4, 0x000500C2, 0x0000000B, 0x00003425, 0x00005027,\n    0x00000A25, 0x000500C7, 0x0000000B, 0x000061BE, 0x00003425, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x000062AB, 0x00003332, 0x000061BE, 0x00050080,\n    0x0000000B, 0x00004DE9, 0x00003AE5, 0x000062AB, 0x00050086, 0x0000000B,\n    0x00003189, 0x00004DE9, 0x00000A1F, 0x000500C4, 0x0000000B, 0x000023FF,\n    0x00003189, 0x00000A52, 0x000500C5, 0x0000000B, 0x00004682, 0x00001DAC,\n    0x000023FF, 0x000200F9, 0x00003A2E, 0x000200F8, 0x00003A2E, 0x000700F5,\n    0x0000000B, 0x00002AB3, 0x0000480A, 0x000029A2, 0x00004682, 0x000038C8,\n    0x000300F7, 0x00002DB9, 0x00000000, 0x000400FA, 0x00004E86, 0x000029A3,\n    0x000038C9, 0x000200F8, 0x000029A3, 0x000500C7, 0x0000000B, 0x0000450C,\n    0x00004CE1, 0x0000003A, 0x000500C7, 0x0000000B, 0x00005D9F, 0x00004CE1,\n    0x0000022D, 0x000500C2, 0x0000000B, 0x00005568, 0x00005D9F, 0x00000A0D,\n    0x000500C7, 0x0000000B, 0x00001FD8, 0x0000450C, 0x00005568, 0x000500C4,\n    0x0000000B, 0x00006034, 0x00001FD8, 0x00000A0D, 0x000500C2, 0x0000000B,\n    0x000059BF, 0x00001FD8, 0x00000A0D, 0x000500C5, 0x0000000B, 0x00004987,\n    0x00006034, 0x000059BF, 0x000500C5, 0x0000000B, 0x00003E35, 0x00001FD8,\n    0x00004987, 0x000400C8, 0x0000000B, 0x00002116, 0x00003E35, 0x000500C7,\n    0x0000000B, 0x0000276D, 0x00004CE1, 0x00002116, 0x00050082, 0x0000000B,\n    0x00003FB7, 0x00000908, 0x0000276D, 0x000500C7, 0x0000000B, 0x00004417,\n    0x00003FB7, 0x00002116, 0x000500C7, 0x0000000B, 0x0000426A, 0x00004417,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00003578, 0x00003283, 0x0000426A,\n    0x000500C7, 0x0000000B, 0x000055F4, 0x0000276D, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00004FCE, 0x00003333, 0x000055F4, 0x00050080, 0x0000000B,\n    0x00004D99, 0x00003578, 0x00004FCE, 0x00050086, 0x0000000B, 0x000032DF,\n    0x00004D99, 0x00000A19, 0x000500C2, 0x0000000B, 0x00005A05, 0x00004417,\n    0x00000A13, 0x000500C7, 0x0000000B, 0x00002247, 0x00005A05, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00003AE6, 0x00003283, 0x00002247, 0x000500C2,\n    0x0000000B, 0x00003426, 0x0000276D, 0x00000A13, 0x000500C7, 0x0000000B,\n    0x000061BF, 0x00003426, 0x00000A1F, 0x00050084, 0x0000000B, 0x000062AC,\n    0x00003333, 0x000061BF, 0x00050080, 0x0000000B, 0x00004DEA, 0x00003AE6,\n    0x000062AC, 0x00050086, 0x0000000B, 0x0000318A, 0x00004DEA, 0x00000A19,\n    0x000500C4, 0x0000000B, 0x0000200C, 0x0000318A, 0x00000A22, 0x000500C5,\n    0x0000000B, 0x00001DAD, 0x000032DF, 0x0000200C, 0x000500C2, 0x0000000B,\n    0x000055F5, 0x00004417, 0x00000A1C, 0x000500C7, 0x0000000B, 0x000044E5,\n    0x000055F5, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AE7, 0x00003283,\n    0x000044E5, 0x000500C2, 0x0000000B, 0x00003427, 0x0000276D, 0x00000A1C,\n    0x000500C7, 0x0000000B, 0x000061C0, 0x00003427, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x000062AD, 0x00003333, 0x000061C0, 0x00050080, 0x0000000B,\n    0x00004DEB, 0x00003AE7, 0x000062AD, 0x00050086, 0x0000000B, 0x0000318B,\n    0x00004DEB, 0x00000A19, 0x000500C4, 0x0000000B, 0x0000200D, 0x0000318B,\n    0x00000A3A, 0x000500C5, 0x0000000B, 0x00001DAE, 0x00001DAD, 0x0000200D,\n    0x000500C2, 0x0000000B, 0x000055F6, 0x00004417, 0x00000A25, 0x000500C7,\n    0x0000000B, 0x000044E6, 0x000055F6, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00003AE8, 0x00003283, 0x000044E6, 0x000500C2, 0x0000000B, 0x00003428,\n    0x0000276D, 0x00000A25, 0x000500C7, 0x0000000B, 0x000061C1, 0x00003428,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x000062AE, 0x00003333, 0x000061C1,\n    0x00050080, 0x0000000B, 0x00004DEC, 0x00003AE8, 0x000062AE, 0x00050086,\n    0x0000000B, 0x0000318C, 0x00004DEC, 0x00000A19, 0x000500C4, 0x0000000B,\n    0x0000204B, 0x0000318C, 0x00000A52, 0x000500C5, 0x0000000B, 0x00001A2B,\n    0x00001DAE, 0x0000204B, 0x000500C7, 0x0000000B, 0x00004FCF, 0x00004CE1,\n    0x00003E35, 0x000500C7, 0x0000000B, 0x00004418, 0x00004FCF, 0x00000A0D,\n    0x000500C7, 0x0000000B, 0x00004C72, 0x00004FCF, 0x00000A22, 0x000500C4,\n    0x0000000B, 0x0000616F, 0x00004C72, 0x00000A19, 0x000500C5, 0x0000000B,\n    0x000042D2, 0x00004418, 0x0000616F, 0x000500C7, 0x0000000B, 0x00005198,\n    0x00004FCF, 0x00000ACA, 0x000500C4, 0x0000000B, 0x00005B22, 0x00005198,\n    0x00000A28, 0x000500C5, 0x0000000B, 0x000042D3, 0x000042D2, 0x00005B22,\n    0x000500C7, 0x0000000B, 0x00005199, 0x00004FCF, 0x00000447, 0x000500C4,\n    0x0000000B, 0x00005629, 0x00005199, 0x00000A37, 0x000500C5, 0x0000000B,\n    0x00002082, 0x000042D3, 0x00005629, 0x00050084, 0x0000000B, 0x000028BF,\n    0x00002082, 0x00000144, 0x00050080, 0x0000000B, 0x0000480B, 0x00001A2B,\n    0x000028BF, 0x000200F9, 0x00002DB9, 0x000200F8, 0x000038C9, 0x000400C8,\n    0x0000000B, 0x000029DF, 0x00004CE1, 0x000500C7, 0x0000000B, 0x00003C0D,\n    0x000029DF, 0x00000A1F, 0x00050084, 0x0000000B, 0x0000453B, 0x00003283,\n    0x00003C0D, 0x000500C7, 0x0000000B, 0x000055F7, 0x00004CE1, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00004FD0, 0x00003333, 0x000055F7, 0x00050080,\n    0x0000000B, 0x00004D9A, 0x0000453B, 0x00004FD0, 0x00050086, 0x0000000B,\n    0x000032E0, 0x00004D9A, 0x00000A1F, 0x000500C2, 0x0000000B, 0x00005A06,\n    0x000029DF, 0x00000A13, 0x000500C7, 0x0000000B, 0x00002248, 0x00005A06,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00003AE9, 0x00003283, 0x00002248,\n    0x000500C2, 0x0000000B, 0x00003429, 0x00004CE1, 0x00000A13, 0x000500C7,\n    0x0000000B, 0x000061C2, 0x00003429, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x000062AF, 0x00003333, 0x000061C2, 0x00050080, 0x0000000B, 0x00004DED,\n    0x00003AE9, 0x000062AF, 0x00050086, 0x0000000B, 0x0000318D, 0x00004DED,\n    0x00000A1F, 0x000500C4, 0x0000000B, 0x0000200E, 0x0000318D, 0x00000A22,\n    0x000500C5, 0x0000000B, 0x00001DAF, 0x000032E0, 0x0000200E, 0x000500C2,\n    0x0000000B, 0x000055F8, 0x000029DF, 0x00000A1C, 0x000500C7, 0x0000000B,\n    0x000044E7, 0x000055F8, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AEA,\n    0x00003283, 0x000044E7, 0x000500C2, 0x0000000B, 0x0000342A, 0x00004CE1,\n    0x00000A1C, 0x000500C7, 0x0000000B, 0x000061C3, 0x0000342A, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x000062B0, 0x00003333, 0x000061C3, 0x00050080,\n    0x0000000B, 0x00004DEE, 0x00003AEA, 0x000062B0, 0x00050086, 0x0000000B,\n    0x0000318E, 0x00004DEE, 0x00000A1F, 0x000500C4, 0x0000000B, 0x0000200F,\n    0x0000318E, 0x00000A3A, 0x000500C5, 0x0000000B, 0x00001DB0, 0x00001DAF,\n    0x0000200F, 0x000500C2, 0x0000000B, 0x000055F9, 0x000029DF, 0x00000A25,\n    0x000500C7, 0x0000000B, 0x000044E8, 0x000055F9, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00003AEB, 0x00003283, 0x000044E8, 0x000500C2, 0x0000000B,\n    0x0000342B, 0x00004CE1, 0x00000A25, 0x000500C7, 0x0000000B, 0x000061C4,\n    0x0000342B, 0x00000A1F, 0x00050084, 0x0000000B, 0x000062B1, 0x00003333,\n    0x000061C4, 0x00050080, 0x0000000B, 0x00004DEF, 0x00003AEB, 0x000062B1,\n    0x00050086, 0x0000000B, 0x0000318F, 0x00004DEF, 0x00000A1F, 0x000500C4,\n    0x0000000B, 0x00002400, 0x0000318F, 0x00000A52, 0x000500C5, 0x0000000B,\n    0x00004683, 0x00001DB0, 0x00002400, 0x000200F9, 0x00002DB9, 0x000200F8,\n    0x00002DB9, 0x000700F5, 0x0000000B, 0x0000434F, 0x0000480B, 0x000029A3,\n    0x00004683, 0x000038C9, 0x00070050, 0x00000017, 0x000038F9, 0x00002AB1,\n    0x00002AB2, 0x00002AB3, 0x0000434F, 0x00060041, 0x00000294, 0x00003335,\n    0x0000140E, 0x00000A0B, 0x00001BC9, 0x0003003E, 0x00003335, 0x000038F9,\n    0x00050080, 0x0000000B, 0x000039F9, 0x00003220, 0x00000A14, 0x000500B0,\n    0x00000009, 0x00002E0C, 0x000039F9, 0x000019C2, 0x000300F7, 0x00004665,\n    0x00000002, 0x000400FA, 0x00002E0C, 0x0000592E, 0x00004665, 0x000200F8,\n    0x0000592E, 0x00050080, 0x0000000B, 0x00003C7A, 0x00003416, 0x0000578C,\n    0x000500C2, 0x00000017, 0x00002EF8, 0x00003A05, 0x00000215, 0x000500C2,\n    0x0000000B, 0x00005A07, 0x00003C7A, 0x00000A17, 0x00050051, 0x0000000B,\n    0x00004B34, 0x00002EF8, 0x00000000, 0x000300F7, 0x00002DD1, 0x00000000,\n    0x000400FA, 0x00004E83, 0x000029A4, 0x000038CA, 0x000200F8, 0x000029A4,\n    0x000500C7, 0x0000000B, 0x0000450D, 0x00004B34, 0x0000003A, 0x000500C7,\n    0x0000000B, 0x00005DA0, 0x00004B34, 0x0000022D, 0x000500C2, 0x0000000B,\n    0x00005569, 0x00005DA0, 0x00000A0D, 0x000500C7, 0x0000000B, 0x00001FD9,\n    0x0000450D, 0x00005569, 0x000500C4, 0x0000000B, 0x00006035, 0x00001FD9,\n    0x00000A0D, 0x000500C2, 0x0000000B, 0x000059C0, 0x00001FD9, 0x00000A0D,\n    0x000500C5, 0x0000000B, 0x00004988, 0x00006035, 0x000059C0, 0x000500C5,\n    0x0000000B, 0x00003E36, 0x00001FD9, 0x00004988, 0x000400C8, 0x0000000B,\n    0x00002117, 0x00003E36, 0x000500C7, 0x0000000B, 0x0000276E, 0x00004B34,\n    0x00002117, 0x00050082, 0x0000000B, 0x00003FB8, 0x00000908, 0x0000276E,\n    0x000500C7, 0x0000000B, 0x00004419, 0x00003FB8, 0x00002117, 0x000500C7,\n    0x0000000B, 0x0000426B, 0x00004419, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00003579, 0x00001966, 0x0000426B, 0x000500C7, 0x0000000B, 0x000055FA,\n    0x0000276E, 0x00000A1F, 0x00050084, 0x0000000B, 0x00004FD1, 0x00003330,\n    0x000055FA, 0x00050080, 0x0000000B, 0x00004D9B, 0x00003579, 0x00004FD1,\n    0x00050086, 0x0000000B, 0x000032E1, 0x00004D9B, 0x00000A19, 0x000500C2,\n    0x0000000B, 0x00005A08, 0x00004419, 0x00000A13, 0x000500C7, 0x0000000B,\n    0x00002249, 0x00005A08, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AEC,\n    0x00001966, 0x00002249, 0x000500C2, 0x0000000B, 0x0000342C, 0x0000276E,\n    0x00000A13, 0x000500C7, 0x0000000B, 0x000061C5, 0x0000342C, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x000062B2, 0x00003330, 0x000061C5, 0x00050080,\n    0x0000000B, 0x00004DF0, 0x00003AEC, 0x000062B2, 0x00050086, 0x0000000B,\n    0x00003190, 0x00004DF0, 0x00000A19, 0x000500C4, 0x0000000B, 0x00002010,\n    0x00003190, 0x00000A22, 0x000500C5, 0x0000000B, 0x00001DB1, 0x000032E1,\n    0x00002010, 0x000500C2, 0x0000000B, 0x000055FB, 0x00004419, 0x00000A1C,\n    0x000500C7, 0x0000000B, 0x000044E9, 0x000055FB, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00003AED, 0x00001966, 0x000044E9, 0x000500C2, 0x0000000B,\n    0x0000342D, 0x0000276E, 0x00000A1C, 0x000500C7, 0x0000000B, 0x000061C6,\n    0x0000342D, 0x00000A1F, 0x00050084, 0x0000000B, 0x000062B3, 0x00003330,\n    0x000061C6, 0x00050080, 0x0000000B, 0x00004DF1, 0x00003AED, 0x000062B3,\n    0x00050086, 0x0000000B, 0x00003191, 0x00004DF1, 0x00000A19, 0x000500C4,\n    0x0000000B, 0x00002011, 0x00003191, 0x00000A3A, 0x000500C5, 0x0000000B,\n    0x00001DB2, 0x00001DB1, 0x00002011, 0x000500C2, 0x0000000B, 0x000055FC,\n    0x00004419, 0x00000A25, 0x000500C7, 0x0000000B, 0x000044EA, 0x000055FC,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00003AEE, 0x00001966, 0x000044EA,\n    0x000500C2, 0x0000000B, 0x0000342E, 0x0000276E, 0x00000A25, 0x000500C7,\n    0x0000000B, 0x000061C7, 0x0000342E, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x000062B4, 0x00003330, 0x000061C7, 0x00050080, 0x0000000B, 0x00004DF2,\n    0x00003AEE, 0x000062B4, 0x00050086, 0x0000000B, 0x00003192, 0x00004DF2,\n    0x00000A19, 0x000500C4, 0x0000000B, 0x0000204C, 0x00003192, 0x00000A52,\n    0x000500C5, 0x0000000B, 0x00001A2C, 0x00001DB2, 0x0000204C, 0x000500C7,\n    0x0000000B, 0x00004FD2, 0x00004B34, 0x00003E36, 0x000500C7, 0x0000000B,\n    0x0000441A, 0x00004FD2, 0x00000A0D, 0x000500C7, 0x0000000B, 0x00004C73,\n    0x00004FD2, 0x00000A22, 0x000500C4, 0x0000000B, 0x00006170, 0x00004C73,\n    0x00000A19, 0x000500C5, 0x0000000B, 0x000042D4, 0x0000441A, 0x00006170,\n    0x000500C7, 0x0000000B, 0x0000519A, 0x00004FD2, 0x00000ACA, 0x000500C4,\n    0x0000000B, 0x00005B23, 0x0000519A, 0x00000A28, 0x000500C5, 0x0000000B,\n    0x000042D5, 0x000042D4, 0x00005B23, 0x000500C7, 0x0000000B, 0x0000519B,\n    0x00004FD2, 0x00000447, 0x000500C4, 0x0000000B, 0x0000562A, 0x0000519B,\n    0x00000A37, 0x000500C5, 0x0000000B, 0x00002083, 0x000042D5, 0x0000562A,\n    0x00050084, 0x0000000B, 0x000028C0, 0x00002083, 0x00000144, 0x00050080,\n    0x0000000B, 0x0000480C, 0x00001A2C, 0x000028C0, 0x000200F9, 0x00002DD1,\n    0x000200F8, 0x000038CA, 0x000400C8, 0x0000000B, 0x000029E0, 0x00004B34,\n    0x000500C7, 0x0000000B, 0x00003C0E, 0x000029E0, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x0000453C, 0x00001966, 0x00003C0E, 0x000500C7, 0x0000000B,\n    0x000055FD, 0x00004B34, 0x00000A1F, 0x00050084, 0x0000000B, 0x00004FD3,\n    0x00003330, 0x000055FD, 0x00050080, 0x0000000B, 0x00004D9C, 0x0000453C,\n    0x00004FD3, 0x00050086, 0x0000000B, 0x000032E2, 0x00004D9C, 0x00000A1F,\n    0x000500C2, 0x0000000B, 0x00005A09, 0x000029E0, 0x00000A13, 0x000500C7,\n    0x0000000B, 0x0000224A, 0x00005A09, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00003AEF, 0x00001966, 0x0000224A, 0x000500C2, 0x0000000B, 0x0000342F,\n    0x00004B34, 0x00000A13, 0x000500C7, 0x0000000B, 0x000061C8, 0x0000342F,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x000062B5, 0x00003330, 0x000061C8,\n    0x00050080, 0x0000000B, 0x00004DF3, 0x00003AEF, 0x000062B5, 0x00050086,\n    0x0000000B, 0x00003193, 0x00004DF3, 0x00000A1F, 0x000500C4, 0x0000000B,\n    0x00002012, 0x00003193, 0x00000A22, 0x000500C5, 0x0000000B, 0x00001DB3,\n    0x000032E2, 0x00002012, 0x000500C2, 0x0000000B, 0x000055FE, 0x000029E0,\n    0x00000A1C, 0x000500C7, 0x0000000B, 0x000044EB, 0x000055FE, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00003AF0, 0x00001966, 0x000044EB, 0x000500C2,\n    0x0000000B, 0x00003430, 0x00004B34, 0x00000A1C, 0x000500C7, 0x0000000B,\n    0x000061C9, 0x00003430, 0x00000A1F, 0x00050084, 0x0000000B, 0x000062B6,\n    0x00003330, 0x000061C9, 0x00050080, 0x0000000B, 0x00004DF4, 0x00003AF0,\n    0x000062B6, 0x00050086, 0x0000000B, 0x00003194, 0x00004DF4, 0x00000A1F,\n    0x000500C4, 0x0000000B, 0x00002013, 0x00003194, 0x00000A3A, 0x000500C5,\n    0x0000000B, 0x00001DB4, 0x00001DB3, 0x00002013, 0x000500C2, 0x0000000B,\n    0x000055FF, 0x000029E0, 0x00000A25, 0x000500C7, 0x0000000B, 0x000044EC,\n    0x000055FF, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AF1, 0x00001966,\n    0x000044EC, 0x000500C2, 0x0000000B, 0x00003431, 0x00004B34, 0x00000A25,\n    0x000500C7, 0x0000000B, 0x000061CA, 0x00003431, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x000062B7, 0x00003330, 0x000061CA, 0x00050080, 0x0000000B,\n    0x00004DF5, 0x00003AF1, 0x000062B7, 0x00050086, 0x0000000B, 0x00003195,\n    0x00004DF5, 0x00000A1F, 0x000500C4, 0x0000000B, 0x00002401, 0x00003195,\n    0x00000A52, 0x000500C5, 0x0000000B, 0x00004684, 0x00001DB4, 0x00002401,\n    0x000200F9, 0x00002DD1, 0x000200F8, 0x00002DD1, 0x000700F5, 0x0000000B,\n    0x00005028, 0x0000480C, 0x000029A4, 0x00004684, 0x000038CA, 0x00050051,\n    0x0000000B, 0x000040F0, 0x00002EF8, 0x00000001, 0x000300F7, 0x00002DD2,\n    0x00000000, 0x000400FA, 0x00004E84, 0x000029A5, 0x000038CB, 0x000200F8,\n    0x000029A5, 0x000500C7, 0x0000000B, 0x0000450E, 0x000040F0, 0x0000003A,\n    0x000500C7, 0x0000000B, 0x00005DA1, 0x000040F0, 0x0000022D, 0x000500C2,\n    0x0000000B, 0x0000556A, 0x00005DA1, 0x00000A0D, 0x000500C7, 0x0000000B,\n    0x00001FDA, 0x0000450E, 0x0000556A, 0x000500C4, 0x0000000B, 0x00006036,\n    0x00001FDA, 0x00000A0D, 0x000500C2, 0x0000000B, 0x000059C1, 0x00001FDA,\n    0x00000A0D, 0x000500C5, 0x0000000B, 0x00004989, 0x00006036, 0x000059C1,\n    0x000500C5, 0x0000000B, 0x00003E37, 0x00001FDA, 0x00004989, 0x000400C8,\n    0x0000000B, 0x00002118, 0x00003E37, 0x000500C7, 0x0000000B, 0x0000276F,\n    0x000040F0, 0x00002118, 0x00050082, 0x0000000B, 0x00003FB9, 0x00000908,\n    0x0000276F, 0x000500C7, 0x0000000B, 0x0000441B, 0x00003FB9, 0x00002118,\n    0x000500C7, 0x0000000B, 0x0000426C, 0x0000441B, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x0000357A, 0x00003281, 0x0000426C, 0x000500C7, 0x0000000B,\n    0x00005600, 0x0000276F, 0x00000A1F, 0x00050084, 0x0000000B, 0x00004FD4,\n    0x00003331, 0x00005600, 0x00050080, 0x0000000B, 0x00004D9D, 0x0000357A,\n    0x00004FD4, 0x00050086, 0x0000000B, 0x000032E3, 0x00004D9D, 0x00000A19,\n    0x000500C2, 0x0000000B, 0x00005A0A, 0x0000441B, 0x00000A13, 0x000500C7,\n    0x0000000B, 0x0000224B, 0x00005A0A, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00003AF2, 0x00003281, 0x0000224B, 0x000500C2, 0x0000000B, 0x00003432,\n    0x0000276F, 0x00000A13, 0x000500C7, 0x0000000B, 0x000061CB, 0x00003432,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x000062B8, 0x00003331, 0x000061CB,\n    0x00050080, 0x0000000B, 0x00004DF6, 0x00003AF2, 0x000062B8, 0x00050086,\n    0x0000000B, 0x00003196, 0x00004DF6, 0x00000A19, 0x000500C4, 0x0000000B,\n    0x00002014, 0x00003196, 0x00000A22, 0x000500C5, 0x0000000B, 0x00001DB5,\n    0x000032E3, 0x00002014, 0x000500C2, 0x0000000B, 0x00005601, 0x0000441B,\n    0x00000A1C, 0x000500C7, 0x0000000B, 0x000044ED, 0x00005601, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00003AF3, 0x00003281, 0x000044ED, 0x000500C2,\n    0x0000000B, 0x00003433, 0x0000276F, 0x00000A1C, 0x000500C7, 0x0000000B,\n    0x000061CC, 0x00003433, 0x00000A1F, 0x00050084, 0x0000000B, 0x000062B9,\n    0x00003331, 0x000061CC, 0x00050080, 0x0000000B, 0x00004DF7, 0x00003AF3,\n    0x000062B9, 0x00050086, 0x0000000B, 0x00003197, 0x00004DF7, 0x00000A19,\n    0x000500C4, 0x0000000B, 0x00002015, 0x00003197, 0x00000A3A, 0x000500C5,\n    0x0000000B, 0x00001DB6, 0x00001DB5, 0x00002015, 0x000500C2, 0x0000000B,\n    0x00005602, 0x0000441B, 0x00000A25, 0x000500C7, 0x0000000B, 0x000044EE,\n    0x00005602, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AF4, 0x00003281,\n    0x000044EE, 0x000500C2, 0x0000000B, 0x00003434, 0x0000276F, 0x00000A25,\n    0x000500C7, 0x0000000B, 0x000061CD, 0x00003434, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x000062BA, 0x00003331, 0x000061CD, 0x00050080, 0x0000000B,\n    0x00004DF8, 0x00003AF4, 0x000062BA, 0x00050086, 0x0000000B, 0x00003198,\n    0x00004DF8, 0x00000A19, 0x000500C4, 0x0000000B, 0x0000204D, 0x00003198,\n    0x00000A52, 0x000500C5, 0x0000000B, 0x00001A2D, 0x00001DB6, 0x0000204D,\n    0x000500C7, 0x0000000B, 0x00004FD5, 0x000040F0, 0x00003E37, 0x000500C7,\n    0x0000000B, 0x0000441C, 0x00004FD5, 0x00000A0D, 0x000500C7, 0x0000000B,\n    0x00004C74, 0x00004FD5, 0x00000A22, 0x000500C4, 0x0000000B, 0x00006171,\n    0x00004C74, 0x00000A19, 0x000500C5, 0x0000000B, 0x000042D6, 0x0000441C,\n    0x00006171, 0x000500C7, 0x0000000B, 0x0000519C, 0x00004FD5, 0x00000ACA,\n    0x000500C4, 0x0000000B, 0x00005B24, 0x0000519C, 0x00000A28, 0x000500C5,\n    0x0000000B, 0x000042D7, 0x000042D6, 0x00005B24, 0x000500C7, 0x0000000B,\n    0x0000519D, 0x00004FD5, 0x00000447, 0x000500C4, 0x0000000B, 0x0000562B,\n    0x0000519D, 0x00000A37, 0x000500C5, 0x0000000B, 0x00002084, 0x000042D7,\n    0x0000562B, 0x00050084, 0x0000000B, 0x000028C1, 0x00002084, 0x00000144,\n    0x00050080, 0x0000000B, 0x0000480D, 0x00001A2D, 0x000028C1, 0x000200F9,\n    0x00002DD2, 0x000200F8, 0x000038CB, 0x000400C8, 0x0000000B, 0x000029E1,\n    0x000040F0, 0x000500C7, 0x0000000B, 0x00003C10, 0x000029E1, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x0000453D, 0x00003281, 0x00003C10, 0x000500C7,\n    0x0000000B, 0x00005603, 0x000040F0, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00004FD6, 0x00003331, 0x00005603, 0x00050080, 0x0000000B, 0x00004D9E,\n    0x0000453D, 0x00004FD6, 0x00050086, 0x0000000B, 0x000032E4, 0x00004D9E,\n    0x00000A1F, 0x000500C2, 0x0000000B, 0x00005A0B, 0x000029E1, 0x00000A13,\n    0x000500C7, 0x0000000B, 0x0000224C, 0x00005A0B, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00003AF5, 0x00003281, 0x0000224C, 0x000500C2, 0x0000000B,\n    0x00003435, 0x000040F0, 0x00000A13, 0x000500C7, 0x0000000B, 0x000061CE,\n    0x00003435, 0x00000A1F, 0x00050084, 0x0000000B, 0x000062BB, 0x00003331,\n    0x000061CE, 0x00050080, 0x0000000B, 0x00004DF9, 0x00003AF5, 0x000062BB,\n    0x00050086, 0x0000000B, 0x00003199, 0x00004DF9, 0x00000A1F, 0x000500C4,\n    0x0000000B, 0x00002016, 0x00003199, 0x00000A22, 0x000500C5, 0x0000000B,\n    0x00001DB7, 0x000032E4, 0x00002016, 0x000500C2, 0x0000000B, 0x00005604,\n    0x000029E1, 0x00000A1C, 0x000500C7, 0x0000000B, 0x000044EF, 0x00005604,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00003AF6, 0x00003281, 0x000044EF,\n    0x000500C2, 0x0000000B, 0x00003436, 0x000040F0, 0x00000A1C, 0x000500C7,\n    0x0000000B, 0x000061CF, 0x00003436, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x000062BC, 0x00003331, 0x000061CF, 0x00050080, 0x0000000B, 0x00004DFA,\n    0x00003AF6, 0x000062BC, 0x00050086, 0x0000000B, 0x0000319A, 0x00004DFA,\n    0x00000A1F, 0x000500C4, 0x0000000B, 0x00002017, 0x0000319A, 0x00000A3A,\n    0x000500C5, 0x0000000B, 0x00001DB8, 0x00001DB7, 0x00002017, 0x000500C2,\n    0x0000000B, 0x00005605, 0x000029E1, 0x00000A25, 0x000500C7, 0x0000000B,\n    0x000044F0, 0x00005605, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AF7,\n    0x00003281, 0x000044F0, 0x000500C2, 0x0000000B, 0x00003437, 0x000040F0,\n    0x00000A25, 0x000500C7, 0x0000000B, 0x000061D0, 0x00003437, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x000062BD, 0x00003331, 0x000061D0, 0x00050080,\n    0x0000000B, 0x00004DFB, 0x00003AF7, 0x000062BD, 0x00050086, 0x0000000B,\n    0x0000319B, 0x00004DFB, 0x00000A1F, 0x000500C4, 0x0000000B, 0x00002402,\n    0x0000319B, 0x00000A52, 0x000500C5, 0x0000000B, 0x00004685, 0x00001DB8,\n    0x00002402, 0x000200F9, 0x00002DD2, 0x000200F8, 0x00002DD2, 0x000700F5,\n    0x0000000B, 0x00005029, 0x0000480D, 0x000029A5, 0x00004685, 0x000038CB,\n    0x00050051, 0x0000000B, 0x000040F1, 0x00002EF8, 0x00000002, 0x000300F7,\n    0x00002DD3, 0x00000000, 0x000400FA, 0x00004E85, 0x000029A6, 0x000038CC,\n    0x000200F8, 0x000029A6, 0x000500C7, 0x0000000B, 0x0000450F, 0x000040F1,\n    0x0000003A, 0x000500C7, 0x0000000B, 0x00005DA2, 0x000040F1, 0x0000022D,\n    0x000500C2, 0x0000000B, 0x0000556B, 0x00005DA2, 0x00000A0D, 0x000500C7,\n    0x0000000B, 0x00001FDB, 0x0000450F, 0x0000556B, 0x000500C4, 0x0000000B,\n    0x00006037, 0x00001FDB, 0x00000A0D, 0x000500C2, 0x0000000B, 0x000059C2,\n    0x00001FDB, 0x00000A0D, 0x000500C5, 0x0000000B, 0x0000498A, 0x00006037,\n    0x000059C2, 0x000500C5, 0x0000000B, 0x00003E38, 0x00001FDB, 0x0000498A,\n    0x000400C8, 0x0000000B, 0x00002119, 0x00003E38, 0x000500C7, 0x0000000B,\n    0x00002770, 0x000040F1, 0x00002119, 0x00050082, 0x0000000B, 0x00003FBA,\n    0x00000908, 0x00002770, 0x000500C7, 0x0000000B, 0x0000441D, 0x00003FBA,\n    0x00002119, 0x000500C7, 0x0000000B, 0x0000426D, 0x0000441D, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x0000357B, 0x00003282, 0x0000426D, 0x000500C7,\n    0x0000000B, 0x00005606, 0x00002770, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00004FD7, 0x00003332, 0x00005606, 0x00050080, 0x0000000B, 0x00004D9F,\n    0x0000357B, 0x00004FD7, 0x00050086, 0x0000000B, 0x000032E5, 0x00004D9F,\n    0x00000A19, 0x000500C2, 0x0000000B, 0x00005A0C, 0x0000441D, 0x00000A13,\n    0x000500C7, 0x0000000B, 0x0000224D, 0x00005A0C, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00003AF8, 0x00003282, 0x0000224D, 0x000500C2, 0x0000000B,\n    0x00003438, 0x00002770, 0x00000A13, 0x000500C7, 0x0000000B, 0x000061D1,\n    0x00003438, 0x00000A1F, 0x00050084, 0x0000000B, 0x000062BE, 0x00003332,\n    0x000061D1, 0x00050080, 0x0000000B, 0x00004DFC, 0x00003AF8, 0x000062BE,\n    0x00050086, 0x0000000B, 0x0000319C, 0x00004DFC, 0x00000A19, 0x000500C4,\n    0x0000000B, 0x00002018, 0x0000319C, 0x00000A22, 0x000500C5, 0x0000000B,\n    0x00001DB9, 0x000032E5, 0x00002018, 0x000500C2, 0x0000000B, 0x00005607,\n    0x0000441D, 0x00000A1C, 0x000500C7, 0x0000000B, 0x000044F1, 0x00005607,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00003AF9, 0x00003282, 0x000044F1,\n    0x000500C2, 0x0000000B, 0x00003439, 0x00002770, 0x00000A1C, 0x000500C7,\n    0x0000000B, 0x000061D2, 0x00003439, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x000062BF, 0x00003332, 0x000061D2, 0x00050080, 0x0000000B, 0x00004DFD,\n    0x00003AF9, 0x000062BF, 0x00050086, 0x0000000B, 0x0000319D, 0x00004DFD,\n    0x00000A19, 0x000500C4, 0x0000000B, 0x00002019, 0x0000319D, 0x00000A3A,\n    0x000500C5, 0x0000000B, 0x00001DBA, 0x00001DB9, 0x00002019, 0x000500C2,\n    0x0000000B, 0x00005608, 0x0000441D, 0x00000A25, 0x000500C7, 0x0000000B,\n    0x000044F2, 0x00005608, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AFA,\n    0x00003282, 0x000044F2, 0x000500C2, 0x0000000B, 0x0000343A, 0x00002770,\n    0x00000A25, 0x000500C7, 0x0000000B, 0x000061D3, 0x0000343A, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x000062C0, 0x00003332, 0x000061D3, 0x00050080,\n    0x0000000B, 0x00004DFE, 0x00003AFA, 0x000062C0, 0x00050086, 0x0000000B,\n    0x0000319E, 0x00004DFE, 0x00000A19, 0x000500C4, 0x0000000B, 0x0000204E,\n    0x0000319E, 0x00000A52, 0x000500C5, 0x0000000B, 0x00001A2E, 0x00001DBA,\n    0x0000204E, 0x000500C7, 0x0000000B, 0x00004FD8, 0x000040F1, 0x00003E38,\n    0x000500C7, 0x0000000B, 0x0000441E, 0x00004FD8, 0x00000A0D, 0x000500C7,\n    0x0000000B, 0x00004C75, 0x00004FD8, 0x00000A22, 0x000500C4, 0x0000000B,\n    0x00006172, 0x00004C75, 0x00000A19, 0x000500C5, 0x0000000B, 0x000042D8,\n    0x0000441E, 0x00006172, 0x000500C7, 0x0000000B, 0x0000519E, 0x00004FD8,\n    0x00000ACA, 0x000500C4, 0x0000000B, 0x00005B25, 0x0000519E, 0x00000A28,\n    0x000500C5, 0x0000000B, 0x000042D9, 0x000042D8, 0x00005B25, 0x000500C7,\n    0x0000000B, 0x0000519F, 0x00004FD8, 0x00000447, 0x000500C4, 0x0000000B,\n    0x0000562C, 0x0000519F, 0x00000A37, 0x000500C5, 0x0000000B, 0x00002085,\n    0x000042D9, 0x0000562C, 0x00050084, 0x0000000B, 0x000028C2, 0x00002085,\n    0x00000144, 0x00050080, 0x0000000B, 0x0000480E, 0x00001A2E, 0x000028C2,\n    0x000200F9, 0x00002DD3, 0x000200F8, 0x000038CC, 0x000400C8, 0x0000000B,\n    0x000029E2, 0x000040F1, 0x000500C7, 0x0000000B, 0x00003C11, 0x000029E2,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x0000453E, 0x00003282, 0x00003C11,\n    0x000500C7, 0x0000000B, 0x00005609, 0x000040F1, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00004FD9, 0x00003332, 0x00005609, 0x00050080, 0x0000000B,\n    0x00004DA0, 0x0000453E, 0x00004FD9, 0x00050086, 0x0000000B, 0x000032E6,\n    0x00004DA0, 0x00000A1F, 0x000500C2, 0x0000000B, 0x00005A0D, 0x000029E2,\n    0x00000A13, 0x000500C7, 0x0000000B, 0x0000224E, 0x00005A0D, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00003AFB, 0x00003282, 0x0000224E, 0x000500C2,\n    0x0000000B, 0x0000343B, 0x000040F1, 0x00000A13, 0x000500C7, 0x0000000B,\n    0x000061D4, 0x0000343B, 0x00000A1F, 0x00050084, 0x0000000B, 0x000062C1,\n    0x00003332, 0x000061D4, 0x00050080, 0x0000000B, 0x00004DFF, 0x00003AFB,\n    0x000062C1, 0x00050086, 0x0000000B, 0x0000319F, 0x00004DFF, 0x00000A1F,\n    0x000500C4, 0x0000000B, 0x0000201A, 0x0000319F, 0x00000A22, 0x000500C5,\n    0x0000000B, 0x00001DBB, 0x000032E6, 0x0000201A, 0x000500C2, 0x0000000B,\n    0x0000560A, 0x000029E2, 0x00000A1C, 0x000500C7, 0x0000000B, 0x000044F3,\n    0x0000560A, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AFC, 0x00003282,\n    0x000044F3, 0x000500C2, 0x0000000B, 0x0000343C, 0x000040F1, 0x00000A1C,\n    0x000500C7, 0x0000000B, 0x000061D5, 0x0000343C, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x000062C2, 0x00003332, 0x000061D5, 0x00050080, 0x0000000B,\n    0x00004E00, 0x00003AFC, 0x000062C2, 0x00050086, 0x0000000B, 0x000031A0,\n    0x00004E00, 0x00000A1F, 0x000500C4, 0x0000000B, 0x0000201B, 0x000031A0,\n    0x00000A3A, 0x000500C5, 0x0000000B, 0x00001DBC, 0x00001DBB, 0x0000201B,\n    0x000500C2, 0x0000000B, 0x0000560B, 0x000029E2, 0x00000A25, 0x000500C7,\n    0x0000000B, 0x000044F4, 0x0000560B, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00003AFD, 0x00003282, 0x000044F4, 0x000500C2, 0x0000000B, 0x0000343D,\n    0x000040F1, 0x00000A25, 0x000500C7, 0x0000000B, 0x000061D6, 0x0000343D,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x000062C3, 0x00003332, 0x000061D6,\n    0x00050080, 0x0000000B, 0x00004E01, 0x00003AFD, 0x000062C3, 0x00050086,\n    0x0000000B, 0x000031A1, 0x00004E01, 0x00000A1F, 0x000500C4, 0x0000000B,\n    0x00002403, 0x000031A1, 0x00000A52, 0x000500C5, 0x0000000B, 0x00004686,\n    0x00001DBC, 0x00002403, 0x000200F9, 0x00002DD3, 0x000200F8, 0x00002DD3,\n    0x000700F5, 0x0000000B, 0x0000502A, 0x0000480E, 0x000029A6, 0x00004686,\n    0x000038CC, 0x00050051, 0x0000000B, 0x000040F2, 0x00002EF8, 0x00000003,\n    0x000300F7, 0x00002DBA, 0x00000000, 0x000400FA, 0x00004E86, 0x000029A7,\n    0x000038CD, 0x000200F8, 0x000029A7, 0x000500C7, 0x0000000B, 0x00004510,\n    0x000040F2, 0x0000003A, 0x000500C7, 0x0000000B, 0x00005DA3, 0x000040F2,\n    0x0000022D, 0x000500C2, 0x0000000B, 0x0000556C, 0x00005DA3, 0x00000A0D,\n    0x000500C7, 0x0000000B, 0x00001FDC, 0x00004510, 0x0000556C, 0x000500C4,\n    0x0000000B, 0x00006038, 0x00001FDC, 0x00000A0D, 0x000500C2, 0x0000000B,\n    0x000059C3, 0x00001FDC, 0x00000A0D, 0x000500C5, 0x0000000B, 0x0000498B,\n    0x00006038, 0x000059C3, 0x000500C5, 0x0000000B, 0x00003E39, 0x00001FDC,\n    0x0000498B, 0x000400C8, 0x0000000B, 0x0000211A, 0x00003E39, 0x000500C7,\n    0x0000000B, 0x00002771, 0x000040F2, 0x0000211A, 0x00050082, 0x0000000B,\n    0x00003FBB, 0x00000908, 0x00002771, 0x000500C7, 0x0000000B, 0x0000441F,\n    0x00003FBB, 0x0000211A, 0x000500C7, 0x0000000B, 0x0000426E, 0x0000441F,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x0000357C, 0x00003283, 0x0000426E,\n    0x000500C7, 0x0000000B, 0x0000560C, 0x00002771, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00004FDA, 0x00003333, 0x0000560C, 0x00050080, 0x0000000B,\n    0x00004DA1, 0x0000357C, 0x00004FDA, 0x00050086, 0x0000000B, 0x000032E7,\n    0x00004DA1, 0x00000A19, 0x000500C2, 0x0000000B, 0x00005A11, 0x0000441F,\n    0x00000A13, 0x000500C7, 0x0000000B, 0x0000224F, 0x00005A11, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00003AFE, 0x00003283, 0x0000224F, 0x000500C2,\n    0x0000000B, 0x0000343E, 0x00002771, 0x00000A13, 0x000500C7, 0x0000000B,\n    0x000061D7, 0x0000343E, 0x00000A1F, 0x00050084, 0x0000000B, 0x000062C4,\n    0x00003333, 0x000061D7, 0x00050080, 0x0000000B, 0x00004E02, 0x00003AFE,\n    0x000062C4, 0x00050086, 0x0000000B, 0x000031A2, 0x00004E02, 0x00000A19,\n    0x000500C4, 0x0000000B, 0x0000201C, 0x000031A2, 0x00000A22, 0x000500C5,\n    0x0000000B, 0x00001DBD, 0x000032E7, 0x0000201C, 0x000500C2, 0x0000000B,\n    0x0000560D, 0x0000441F, 0x00000A1C, 0x000500C7, 0x0000000B, 0x000044F5,\n    0x0000560D, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003AFF, 0x00003283,\n    0x000044F5, 0x000500C2, 0x0000000B, 0x0000343F, 0x00002771, 0x00000A1C,\n    0x000500C7, 0x0000000B, 0x000061D8, 0x0000343F, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x000062C5, 0x00003333, 0x000061D8, 0x00050080, 0x0000000B,\n    0x00004E03, 0x00003AFF, 0x000062C5, 0x00050086, 0x0000000B, 0x000031A3,\n    0x00004E03, 0x00000A19, 0x000500C4, 0x0000000B, 0x0000201D, 0x000031A3,\n    0x00000A3A, 0x000500C5, 0x0000000B, 0x00001DBE, 0x00001DBD, 0x0000201D,\n    0x000500C2, 0x0000000B, 0x0000560E, 0x0000441F, 0x00000A25, 0x000500C7,\n    0x0000000B, 0x000044F6, 0x0000560E, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x00003B00, 0x00003283, 0x000044F6, 0x000500C2, 0x0000000B, 0x00003440,\n    0x00002771, 0x00000A25, 0x000500C7, 0x0000000B, 0x000061D9, 0x00003440,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x000062C6, 0x00003333, 0x000061D9,\n    0x00050080, 0x0000000B, 0x00004E04, 0x00003B00, 0x000062C6, 0x00050086,\n    0x0000000B, 0x000031A4, 0x00004E04, 0x00000A19, 0x000500C4, 0x0000000B,\n    0x0000204F, 0x000031A4, 0x00000A52, 0x000500C5, 0x0000000B, 0x00001A2F,\n    0x00001DBE, 0x0000204F, 0x000500C7, 0x0000000B, 0x00004FDB, 0x000040F2,\n    0x00003E39, 0x000500C7, 0x0000000B, 0x00004420, 0x00004FDB, 0x00000A0D,\n    0x000500C7, 0x0000000B, 0x00004C76, 0x00004FDB, 0x00000A22, 0x000500C4,\n    0x0000000B, 0x00006173, 0x00004C76, 0x00000A19, 0x000500C5, 0x0000000B,\n    0x000042DA, 0x00004420, 0x00006173, 0x000500C7, 0x0000000B, 0x000051A0,\n    0x00004FDB, 0x00000ACA, 0x000500C4, 0x0000000B, 0x00005B26, 0x000051A0,\n    0x00000A28, 0x000500C5, 0x0000000B, 0x000042DB, 0x000042DA, 0x00005B26,\n    0x000500C7, 0x0000000B, 0x000051A1, 0x00004FDB, 0x00000447, 0x000500C4,\n    0x0000000B, 0x0000562D, 0x000051A1, 0x00000A37, 0x000500C5, 0x0000000B,\n    0x00002086, 0x000042DB, 0x0000562D, 0x00050084, 0x0000000B, 0x000028C3,\n    0x00002086, 0x00000144, 0x00050080, 0x0000000B, 0x0000480F, 0x00001A2F,\n    0x000028C3, 0x000200F9, 0x00002DBA, 0x000200F8, 0x000038CD, 0x000400C8,\n    0x0000000B, 0x000029E3, 0x000040F2, 0x000500C7, 0x0000000B, 0x00003C12,\n    0x000029E3, 0x00000A1F, 0x00050084, 0x0000000B, 0x0000453F, 0x00003283,\n    0x00003C12, 0x000500C7, 0x0000000B, 0x0000560F, 0x000040F2, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x00004FDC, 0x00003333, 0x0000560F, 0x00050080,\n    0x0000000B, 0x00004DA2, 0x0000453F, 0x00004FDC, 0x00050086, 0x0000000B,\n    0x000032E8, 0x00004DA2, 0x00000A1F, 0x000500C2, 0x0000000B, 0x00005A12,\n    0x000029E3, 0x00000A13, 0x000500C7, 0x0000000B, 0x00002250, 0x00005A12,\n    0x00000A1F, 0x00050084, 0x0000000B, 0x00003B01, 0x00003283, 0x00002250,\n    0x000500C2, 0x0000000B, 0x00003441, 0x000040F2, 0x00000A13, 0x000500C7,\n    0x0000000B, 0x000061DA, 0x00003441, 0x00000A1F, 0x00050084, 0x0000000B,\n    0x000062C7, 0x00003333, 0x000061DA, 0x00050080, 0x0000000B, 0x00004E05,\n    0x00003B01, 0x000062C7, 0x00050086, 0x0000000B, 0x000031A5, 0x00004E05,\n    0x00000A1F, 0x000500C4, 0x0000000B, 0x0000201E, 0x000031A5, 0x00000A22,\n    0x000500C5, 0x0000000B, 0x00001DBF, 0x000032E8, 0x0000201E, 0x000500C2,\n    0x0000000B, 0x00005610, 0x000029E3, 0x00000A1C, 0x000500C7, 0x0000000B,\n    0x000044F7, 0x00005610, 0x00000A1F, 0x00050084, 0x0000000B, 0x00003B02,\n    0x00003283, 0x000044F7, 0x000500C2, 0x0000000B, 0x00003442, 0x000040F2,\n    0x00000A1C, 0x000500C7, 0x0000000B, 0x000061DB, 0x00003442, 0x00000A1F,\n    0x00050084, 0x0000000B, 0x000062C8, 0x00003333, 0x000061DB, 0x00050080,\n    0x0000000B, 0x00004E06, 0x00003B02, 0x000062C8, 0x00050086, 0x0000000B,\n    0x000031A6, 0x00004E06, 0x00000A1F, 0x000500C4, 0x0000000B, 0x0000201F,\n    0x000031A6, 0x00000A3A, 0x000500C5, 0x0000000B, 0x00001DC0, 0x00001DBF,\n    0x0000201F, 0x000500C2, 0x0000000B, 0x00005611, 0x000029E3, 0x00000A25,\n    0x000500C7, 0x0000000B, 0x000044F8, 0x00005611, 0x00000A1F, 0x00050084,\n    0x0000000B, 0x00003B03, 0x00003283, 0x000044F8, 0x000500C2, 0x0000000B,\n    0x00003443, 0x000040F2, 0x00000A25, 0x000500C7, 0x0000000B, 0x000061DC,\n    0x00003443, 0x00000A1F, 0x00050084, 0x0000000B, 0x000062C9, 0x00003333,\n    0x000061DC, 0x00050080, 0x0000000B, 0x00004E07, 0x00003B03, 0x000062C9,\n    0x00050086, 0x0000000B, 0x000031A7, 0x00004E07, 0x00000A1F, 0x000500C4,\n    0x0000000B, 0x00002404, 0x000031A7, 0x00000A52, 0x000500C5, 0x0000000B,\n    0x00004687, 0x00001DC0, 0x00002404, 0x000200F9, 0x00002DBA, 0x000200F8,\n    0x00002DBA, 0x000700F5, 0x0000000B, 0x00004350, 0x0000480F, 0x000029A7,\n    0x00004687, 0x000038CD, 0x00070050, 0x00000017, 0x000038FA, 0x00005028,\n    0x00005029, 0x0000502A, 0x00004350, 0x00060041, 0x00000294, 0x00003C2D,\n    0x0000140E, 0x00000A0B, 0x00005A07, 0x0003003E, 0x00003C2D, 0x000038FA,\n    0x000200F9, 0x00004665, 0x000200F8, 0x00004665, 0x000200F9, 0x00001C26,\n    0x000200F8, 0x00001C26, 0x000200F9, 0x00001C27, 0x000200F8, 0x00001C27,\n    0x000200F9, 0x00003A37, 0x000200F8, 0x00003A37, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_gbgr8_grgb8_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25155\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v4uint = OpTypeVector %uint 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v2uint = OpTypeVector %uint 2\n     %v3uint = OpTypeVector %uint 3\n%uint_16711935 = OpConstant %uint 16711935\n %uint_65280 = OpConstant %uint 65280\n    %uint_16 = OpConstant %uint 16\n%uint_4278190080 = OpConstant %uint 4278190080\n     %uint_1 = OpConstant %uint 1\n     %uint_2 = OpConstant %uint 2\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n     %uint_3 = OpConstant %uint 3\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n     %uint_0 = OpConstant %uint 0\n      %int_3 = OpConstant %int 3\n      %int_2 = OpConstant %int 2\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %2603 = OpConstantComposite %v3uint %uint_3 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n     %uint_4 = OpConstant %uint 4\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n    %uint_32 = OpConstant %uint 32\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n       %2135 = OpConstantComposite %v4uint %uint_65280 %uint_65280 %uint_65280 %uint_65280\n       %2599 = OpConstantComposite %v4uint %uint_4278190080 %uint_4278190080 %uint_4278190080 %uint_4278190080\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24540 = OpBitwiseAnd %uint %13606 %uint_1\n      %17270 = OpINotEqual %bool %24540 %uint_0\n      %12328 = OpBitwiseAnd %uint %13606 %uint_2\n      %17284 = OpINotEqual %bool %12328 %uint_0\n       %7856 = OpShiftRightLogical %uint %13606 %uint_2\n      %25058 = OpBitwiseAnd %uint %7856 %uint_3\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2603\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %6586 DontFlatten\n               OpBranchConditional %24679 %21992 %6586\n      %21992 = OpLabel\n               OpBranch %19578\n       %6586 = OpLabel\n      %23478 = OpBitcast %v3int %21387\n      %18710 = OpCompositeExtract %uint %22410 1\n      %23531 = OpCompositeExtract %int %23478 0\n      %22810 = OpIMul %int %23531 %int_4\n       %6362 = OpCompositeExtract %int %23478 2\n      %14505 = OpBitcast %int %18710\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %23478 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %6594\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %22810 %24535\n      %10404 = OpBitcast %uint %8258\n      %14582 = OpIAdd %uint %22411 %10404\n      %12308 = OpLogicalNot %bool %17270\n               OpSelectionMerge %19040 DontFlatten\n               OpBranchConditional %12308 %9741 %17007\n       %9741 = OpLabel\n      %17463 = OpCompositeExtract %uint %21387 0\n      %11246 = OpCompositeExtract %uint %21387 1\n      %18801 = OpCompositeExtract %uint %21387 2\n      %14831 = OpIMul %uint %22409 %18801\n      %20322 = OpIAdd %uint %11246 %14831\n      %21676 = OpIMul %uint %22408 %20322\n      %20398 = OpIAdd %uint %17463 %21676\n      %11367 = OpShiftLeftLogical %uint %20398 %uint_2\n               OpBranch %19040\n      %17007 = OpLabel\n               OpSelectionMerge %23536 DontFlatten\n               OpBranchConditional %17284 %11410 %24353\n      %11410 = OpLabel\n      %21364 = OpShiftRightLogical %uint %22408 %int_5\n      %13804 = OpShiftRightLogical %uint %22409 %int_4\n      %13237 = OpShiftRightArithmetic %int %6362 %int_2\n      %22374 = OpBitcast %int %13804\n      %25085 = OpIMul %int %13237 %22374\n      %11618 = OpShiftRightArithmetic %int %17598 %int_4\n      %16670 = OpIAdd %int %25085 %11618\n      %19064 = OpBitcast %int %21364\n      %13020 = OpIMul %int %16670 %19064\n      %12986 = OpShiftRightArithmetic %int %23531 %int_5\n      %24558 = OpIAdd %int %13020 %12986\n       %8797 = OpShiftLeftLogical %int %24558 %int_7\n      %11434 = OpBitwiseAnd %int %6362 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %17598 %int_1\n      %21365 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21365 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %23531 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17334 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17334 %uint_2\n      %13015 = OpShiftRightArithmetic %int %17598 %int_3\n       %9929 = OpBitwiseXor %int %13015 %13237\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %23531 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %17598 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6551\n       %7168 = OpShiftLeftLogical %int %16793 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24144 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24144 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24144 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24144 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %23536\n      %24353 = OpLabel\n      %23000 = OpBitcast %v2int %17136\n      %22120 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %23000 1\n      %12089 = OpShiftRightArithmetic %int %14597 %int_5\n      %22400 = OpBitcast %int %22120\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %23000 0\n      %20423 = OpShiftRightArithmetic %int %25154 %int_5\n      %18864 = OpIAdd %int %7938 %20423\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25154 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17335 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17335 %uint_2\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25154 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6552\n       %7169 = OpShiftLeftLogical %int %21575 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24163 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24163 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24163 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %23536\n      %23536 = OpLabel\n      %10540 = OpPhi %uint %16869 %11410 %16870 %24353\n               OpBranch %19040\n      %19040 = OpLabel\n      %11376 = OpPhi %uint %11367 %9741 %10540 %23536\n      %18621 = OpIAdd %uint %11376 %24236\n      %15698 = OpShiftRightLogical %uint %18621 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15698\n       %7338 = OpLoad %v4uint %20399\n      %13760 = OpIEqual %bool %25058 %uint_1\n      %21366 = OpIEqual %bool %25058 %uint_2\n      %22150 = OpLogicalOr %bool %13760 %21366\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %7338 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %7338 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22649 = OpPhi %v4uint %7338 %19040 %16376 %10583\n      %19638 = OpIEqual %bool %25058 %uint_3\n      %15139 = OpLogicalOr %bool %21366 %19638\n               OpSelectionMerge %13867 None\n               OpBranchConditional %15139 %11064 %13867\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22649 %749\n      %15335 = OpShiftRightLogical %v4uint %22649 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %13867\n      %13867 = OpLabel\n      %19124 = OpPhi %v4uint %22649 %13411 %10728 %11064\n       %7095 = OpShiftRightLogical %uint %14582 %int_4\n      %12466 = OpBitwiseAnd %v4uint %19124 %2510\n      %18755 = OpBitwiseAnd %v4uint %19124 %2135\n      %24932 = OpShiftLeftLogical %v4uint %18755 %749\n      %17045 = OpBitwiseOr %v4uint %12466 %24932\n      %21212 = OpBitwiseAnd %v4uint %19124 %2599\n      %18088 = OpShiftRightLogical %v4uint %21212 %749\n       %6532 = OpBitwiseOr %v4uint %17045 %18088\n      %20254 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %7095\n               OpStore %20254 %6532\n      %21685 = OpIAdd %uint %14582 %uint_16\n               OpSelectionMerge %24688 DontFlatten\n               OpBranchConditional %17270 %21993 %7205\n      %21993 = OpLabel\n               OpBranch %24688\n       %7205 = OpLabel\n               OpBranch %24688\n      %24688 = OpLabel\n      %11377 = OpPhi %uint %uint_32 %21993 %uint_16 %7205\n      %18622 = OpIAdd %uint %18621 %11377\n      %15699 = OpShiftRightLogical %uint %18622 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15699\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %14874 None\n               OpBranchConditional %22150 %10584 %14874\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %14874\n      %14874 = OpLabel\n      %10924 = OpPhi %v4uint %14608 %24688 %16377 %10584\n               OpSelectionMerge %13868 None\n               OpBranchConditional %15139 %11065 %13868\n      %11065 = OpLabel\n      %24088 = OpShiftLeftLogical %v4uint %10924 %749\n      %15336 = OpShiftRightLogical %v4uint %10924 %749\n      %10729 = OpBitwiseOr %v4uint %24088 %15336\n               OpBranch %13868\n      %13868 = OpLabel\n      %19125 = OpPhi %v4uint %10924 %14874 %10729 %11065\n       %7096 = OpShiftRightLogical %uint %21685 %int_4\n      %12467 = OpBitwiseAnd %v4uint %19125 %2510\n      %18756 = OpBitwiseAnd %v4uint %19125 %2135\n      %24933 = OpShiftLeftLogical %v4uint %18756 %749\n      %17046 = OpBitwiseOr %v4uint %12467 %24933\n      %21213 = OpBitwiseAnd %v4uint %19125 %2599\n      %18089 = OpShiftRightLogical %v4uint %21213 %749\n       %6533 = OpBitwiseOr %v4uint %17046 %18089\n      %22553 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %7096\n               OpStore %22553 %6533\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_gbgr8_grgb8_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006243, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000017, 0x0000000B, 0x00000004, 0x00040015, 0x0000000C,\n    0x00000020, 0x00000001, 0x00040017, 0x00000012, 0x0000000C, 0x00000002,\n    0x00040017, 0x00000016, 0x0000000C, 0x00000003, 0x00020014, 0x00000009,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x0004002B, 0x0000000B, 0x000008A6, 0x00FF00FF,\n    0x0004002B, 0x0000000B, 0x00000A87, 0x0000FF00, 0x0004002B, 0x0000000B,\n    0x00000A3A, 0x00000010, 0x0004002B, 0x0000000B, 0x00000580, 0xFF000000,\n    0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B,\n    0x00000A10, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A22, 0x00000008,\n    0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00, 0x0004002B, 0x0000000B,\n    0x00000A13, 0x00000003, 0x0004002B, 0x0000000C, 0x00000A17, 0x00000004,\n    0x0004002B, 0x0000000C, 0x00000A1D, 0x00000006, 0x0004002B, 0x0000000C,\n    0x00000A2C, 0x0000000B, 0x0004002B, 0x0000000C, 0x00000A38, 0x0000000F,\n    0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C,\n    0x00000A1A, 0x00000005, 0x0004002B, 0x0000000C, 0x00000A20, 0x00000007,\n    0x0004002B, 0x0000000C, 0x00000A23, 0x00000008, 0x0004002B, 0x0000000C,\n    0x00000A2F, 0x0000000C, 0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000,\n    0x0004002B, 0x0000000C, 0x00000A14, 0x00000003, 0x0004002B, 0x0000000C,\n    0x00000A11, 0x00000002, 0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000,\n    0x000A001E, 0x00000489, 0x0000000B, 0x0000000B, 0x0000000B, 0x0000000B,\n    0x00000014, 0x0000000B, 0x0000000B, 0x0000000B, 0x00040020, 0x00000706,\n    0x00000009, 0x00000489, 0x0004003B, 0x00000706, 0x00000CE9, 0x00000009,\n    0x00040020, 0x00000288, 0x00000009, 0x0000000B, 0x00040020, 0x00000291,\n    0x00000009, 0x00000014, 0x00040020, 0x00000292, 0x00000001, 0x00000014,\n    0x0004003B, 0x00000292, 0x00000F48, 0x00000001, 0x0006002C, 0x00000014,\n    0x00000A2B, 0x00000A13, 0x00000A0A, 0x00000A0A, 0x00040017, 0x0000000F,\n    0x00000009, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A16, 0x00000004,\n    0x0003001D, 0x000007DC, 0x00000017, 0x0003001E, 0x000007B4, 0x000007DC,\n    0x00040020, 0x00000A31, 0x00000002, 0x000007B4, 0x0004003B, 0x00000A31,\n    0x0000107A, 0x00000002, 0x00040020, 0x00000294, 0x00000002, 0x00000017,\n    0x0003001D, 0x000007DD, 0x00000017, 0x0003001E, 0x000007B5, 0x000007DD,\n    0x00040020, 0x00000A32, 0x00000002, 0x000007B5, 0x0004003B, 0x00000A32,\n    0x0000140E, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020,\n    0x0006002C, 0x00000014, 0x00000BC3, 0x00000A16, 0x00000A6A, 0x00000A0D,\n    0x0007002C, 0x00000017, 0x000009CE, 0x000008A6, 0x000008A6, 0x000008A6,\n    0x000008A6, 0x0007002C, 0x00000017, 0x0000013D, 0x00000A22, 0x00000A22,\n    0x00000A22, 0x00000A22, 0x0007002C, 0x00000017, 0x0000072E, 0x000005FD,\n    0x000005FD, 0x000005FD, 0x000005FD, 0x0007002C, 0x00000017, 0x000002ED,\n    0x00000A3A, 0x00000A3A, 0x00000A3A, 0x00000A3A, 0x0007002C, 0x00000017,\n    0x00000857, 0x00000A87, 0x00000A87, 0x00000A87, 0x00000A87, 0x0007002C,\n    0x00000017, 0x00000A27, 0x00000580, 0x00000580, 0x00000580, 0x00000580,\n    0x00050036, 0x00000008, 0x0000161F, 0x00000000, 0x00000502, 0x000200F8,\n    0x00003B06, 0x000300F7, 0x00004C7A, 0x00000000, 0x000300FB, 0x00000A0A,\n    0x00002E68, 0x000200F8, 0x00002E68, 0x00050041, 0x00000288, 0x000060D7,\n    0x00000CE9, 0x00000A0B, 0x0004003D, 0x0000000B, 0x00003526, 0x000060D7,\n    0x000500C7, 0x0000000B, 0x00005FDC, 0x00003526, 0x00000A0D, 0x000500AB,\n    0x00000009, 0x00004376, 0x00005FDC, 0x00000A0A, 0x000500C7, 0x0000000B,\n    0x00003028, 0x00003526, 0x00000A10, 0x000500AB, 0x00000009, 0x00004384,\n    0x00003028, 0x00000A0A, 0x000500C2, 0x0000000B, 0x00001EB0, 0x00003526,\n    0x00000A10, 0x000500C7, 0x0000000B, 0x000061E2, 0x00001EB0, 0x00000A13,\n    0x00050041, 0x00000288, 0x0000492C, 0x00000CE9, 0x00000A0E, 0x0004003D,\n    0x0000000B, 0x00005EAC, 0x0000492C, 0x00050041, 0x00000288, 0x00004EBA,\n    0x00000CE9, 0x00000A11, 0x0004003D, 0x0000000B, 0x00005788, 0x00004EBA,\n    0x00050041, 0x00000288, 0x00004EBB, 0x00000CE9, 0x00000A14, 0x0004003D,\n    0x0000000B, 0x00005789, 0x00004EBB, 0x00050041, 0x00000291, 0x00004EBC,\n    0x00000CE9, 0x00000A17, 0x0004003D, 0x00000014, 0x0000578A, 0x00004EBC,\n    0x00050041, 0x00000288, 0x00004EBD, 0x00000CE9, 0x00000A1A, 0x0004003D,\n    0x0000000B, 0x0000578B, 0x00004EBD, 0x00050041, 0x00000288, 0x00004E6E,\n    0x00000CE9, 0x00000A1D, 0x0004003D, 0x0000000B, 0x000019C2, 0x00004E6E,\n    0x0004003D, 0x00000014, 0x00002A0E, 0x00000F48, 0x000500C4, 0x00000014,\n    0x0000538B, 0x00002A0E, 0x00000A2B, 0x0007004F, 0x00000011, 0x000042F0,\n    0x0000538B, 0x0000538B, 0x00000000, 0x00000001, 0x0007004F, 0x00000011,\n    0x0000242F, 0x0000578A, 0x0000578A, 0x00000000, 0x00000001, 0x000500AE,\n    0x0000000F, 0x00004288, 0x000042F0, 0x0000242F, 0x0004009A, 0x00000009,\n    0x00006067, 0x00004288, 0x000300F7, 0x000019BA, 0x00000002, 0x000400FA,\n    0x00006067, 0x000055E8, 0x000019BA, 0x000200F8, 0x000055E8, 0x000200F9,\n    0x00004C7A, 0x000200F8, 0x000019BA, 0x0004007C, 0x00000016, 0x00005BB6,\n    0x0000538B, 0x00050051, 0x0000000B, 0x00004916, 0x0000578A, 0x00000001,\n    0x00050051, 0x0000000C, 0x00005BEB, 0x00005BB6, 0x00000000, 0x00050084,\n    0x0000000C, 0x0000591A, 0x00005BEB, 0x00000A17, 0x00050051, 0x0000000C,\n    0x000018DA, 0x00005BB6, 0x00000002, 0x0004007C, 0x0000000C, 0x000038A9,\n    0x00004916, 0x00050084, 0x0000000C, 0x00002C0F, 0x000018DA, 0x000038A9,\n    0x00050051, 0x0000000C, 0x000044BE, 0x00005BB6, 0x00000001, 0x00050080,\n    0x0000000C, 0x000056D4, 0x00002C0F, 0x000044BE, 0x0004007C, 0x0000000C,\n    0x00005785, 0x000019C2, 0x00050084, 0x0000000C, 0x00005FD7, 0x000056D4,\n    0x00005785, 0x00050080, 0x0000000C, 0x00002042, 0x0000591A, 0x00005FD7,\n    0x0004007C, 0x0000000B, 0x000028A4, 0x00002042, 0x00050080, 0x0000000B,\n    0x000038F6, 0x0000578B, 0x000028A4, 0x000400A8, 0x00000009, 0x00003014,\n    0x00004376, 0x000300F7, 0x00004A60, 0x00000002, 0x000400FA, 0x00003014,\n    0x0000260D, 0x0000426F, 0x000200F8, 0x0000260D, 0x00050051, 0x0000000B,\n    0x00004437, 0x0000538B, 0x00000000, 0x00050051, 0x0000000B, 0x00002BEE,\n    0x0000538B, 0x00000001, 0x00050051, 0x0000000B, 0x00004971, 0x0000538B,\n    0x00000002, 0x00050084, 0x0000000B, 0x000039EF, 0x00005789, 0x00004971,\n    0x00050080, 0x0000000B, 0x00004F62, 0x00002BEE, 0x000039EF, 0x00050084,\n    0x0000000B, 0x000054AC, 0x00005788, 0x00004F62, 0x00050080, 0x0000000B,\n    0x00004FAE, 0x00004437, 0x000054AC, 0x000500C4, 0x0000000B, 0x00002C67,\n    0x00004FAE, 0x00000A10, 0x000200F9, 0x00004A60, 0x000200F8, 0x0000426F,\n    0x000300F7, 0x00005BF0, 0x00000002, 0x000400FA, 0x00004384, 0x00002C92,\n    0x00005F21, 0x000200F8, 0x00002C92, 0x000500C2, 0x0000000B, 0x00005374,\n    0x00005788, 0x00000A1A, 0x000500C2, 0x0000000B, 0x000035EC, 0x00005789,\n    0x00000A17, 0x000500C3, 0x0000000C, 0x000033B5, 0x000018DA, 0x00000A11,\n    0x0004007C, 0x0000000C, 0x00005766, 0x000035EC, 0x00050084, 0x0000000C,\n    0x000061FD, 0x000033B5, 0x00005766, 0x000500C3, 0x0000000C, 0x00002D62,\n    0x000044BE, 0x00000A17, 0x00050080, 0x0000000C, 0x0000411E, 0x000061FD,\n    0x00002D62, 0x0004007C, 0x0000000C, 0x00004A78, 0x00005374, 0x00050084,\n    0x0000000C, 0x000032DC, 0x0000411E, 0x00004A78, 0x000500C3, 0x0000000C,\n    0x000032BA, 0x00005BEB, 0x00000A1A, 0x00050080, 0x0000000C, 0x00005FEE,\n    0x000032DC, 0x000032BA, 0x000500C4, 0x0000000C, 0x0000225D, 0x00005FEE,\n    0x00000A20, 0x000500C7, 0x0000000C, 0x00002CAA, 0x000018DA, 0x00000A14,\n    0x000500C4, 0x0000000C, 0x00004CAE, 0x00002CAA, 0x00000A1A, 0x000500C3,\n    0x0000000C, 0x0000383E, 0x000044BE, 0x00000A0E, 0x000500C7, 0x0000000C,\n    0x00005375, 0x0000383E, 0x00000A14, 0x000500C4, 0x0000000C, 0x000054CA,\n    0x00005375, 0x00000A14, 0x000500C5, 0x0000000C, 0x000042CE, 0x00004CAE,\n    0x000054CA, 0x000500C7, 0x0000000C, 0x000050D5, 0x00005BEB, 0x00000A20,\n    0x000500C5, 0x0000000C, 0x00003ADD, 0x000042CE, 0x000050D5, 0x000500C5,\n    0x0000000C, 0x000043B6, 0x0000225D, 0x00003ADD, 0x000500C4, 0x0000000C,\n    0x00005E50, 0x000043B6, 0x00000A10, 0x000500C3, 0x0000000C, 0x000032D7,\n    0x000044BE, 0x00000A14, 0x000500C6, 0x0000000C, 0x000026C9, 0x000032D7,\n    0x000033B5, 0x000500C7, 0x0000000C, 0x00004199, 0x000026C9, 0x00000A0E,\n    0x000500C3, 0x0000000C, 0x00002590, 0x00005BEB, 0x00000A14, 0x000500C7,\n    0x0000000C, 0x0000505E, 0x00002590, 0x00000A14, 0x000500C4, 0x0000000C,\n    0x0000541D, 0x00004199, 0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BA,\n    0x0000505E, 0x0000541D, 0x000500C7, 0x0000000C, 0x00005076, 0x000044BE,\n    0x00000A0E, 0x000500C4, 0x0000000C, 0x00005228, 0x00005076, 0x00000A17,\n    0x000500C4, 0x0000000C, 0x00001997, 0x000022BA, 0x00000A1D, 0x000500C5,\n    0x0000000C, 0x000047FE, 0x00005228, 0x00001997, 0x000500C4, 0x0000000C,\n    0x00001C00, 0x00004199, 0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C81,\n    0x000047FE, 0x00001C00, 0x000500C7, 0x0000000C, 0x000050AF, 0x00005E50,\n    0x00000A38, 0x000500C5, 0x0000000C, 0x00003C70, 0x00003C81, 0x000050AF,\n    0x000500C3, 0x0000000C, 0x00003745, 0x00005E50, 0x00000A17, 0x000500C7,\n    0x0000000C, 0x000018B8, 0x00003745, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x0000547E, 0x000018B8, 0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A8,\n    0x00003C70, 0x0000547E, 0x000500C3, 0x0000000C, 0x00003A6E, 0x00005E50,\n    0x00000A1A, 0x000500C7, 0x0000000C, 0x000018B9, 0x00003A6E, 0x00000A20,\n    0x000500C4, 0x0000000C, 0x0000547F, 0x000018B9, 0x00000A23, 0x000500C5,\n    0x0000000C, 0x0000456F, 0x000045A8, 0x0000547F, 0x000500C3, 0x0000000C,\n    0x00003C88, 0x00005E50, 0x00000A23, 0x000500C4, 0x0000000C, 0x00002824,\n    0x00003C88, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B79, 0x0000456F,\n    0x00002824, 0x0004007C, 0x0000000B, 0x000041E5, 0x00003B79, 0x000200F9,\n    0x00005BF0, 0x000200F8, 0x00005F21, 0x0004007C, 0x00000012, 0x000059D8,\n    0x000042F0, 0x000500C2, 0x0000000B, 0x00005668, 0x00005788, 0x00000A1A,\n    0x00050051, 0x0000000C, 0x00003905, 0x000059D8, 0x00000001, 0x000500C3,\n    0x0000000C, 0x00002F39, 0x00003905, 0x00000A1A, 0x0004007C, 0x0000000C,\n    0x00005780, 0x00005668, 0x00050084, 0x0000000C, 0x00001F02, 0x00002F39,\n    0x00005780, 0x00050051, 0x0000000C, 0x00006242, 0x000059D8, 0x00000000,\n    0x000500C3, 0x0000000C, 0x00004FC7, 0x00006242, 0x00000A1A, 0x00050080,\n    0x0000000C, 0x000049B0, 0x00001F02, 0x00004FC7, 0x000500C4, 0x0000000C,\n    0x0000254A, 0x000049B0, 0x00000A1D, 0x000500C3, 0x0000000C, 0x0000603B,\n    0x00003905, 0x00000A0E, 0x000500C7, 0x0000000C, 0x0000539A, 0x0000603B,\n    0x00000A20, 0x000500C4, 0x0000000C, 0x0000534A, 0x0000539A, 0x00000A14,\n    0x000500C7, 0x0000000C, 0x00004EA5, 0x00006242, 0x00000A20, 0x000500C5,\n    0x0000000C, 0x00002B1A, 0x0000534A, 0x00004EA5, 0x000500C5, 0x0000000C,\n    0x000043B7, 0x0000254A, 0x00002B1A, 0x000500C4, 0x0000000C, 0x00005E63,\n    0x000043B7, 0x00000A10, 0x000500C3, 0x0000000C, 0x000031DE, 0x00003905,\n    0x00000A17, 0x000500C7, 0x0000000C, 0x00005447, 0x000031DE, 0x00000A0E,\n    0x000500C3, 0x0000000C, 0x000028A6, 0x00006242, 0x00000A14, 0x000500C7,\n    0x0000000C, 0x0000511E, 0x000028A6, 0x00000A14, 0x000500C3, 0x0000000C,\n    0x000028B9, 0x00003905, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000505F,\n    0x000028B9, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000541E, 0x0000505F,\n    0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BB, 0x0000511E, 0x0000541E,\n    0x000500C7, 0x0000000C, 0x00005077, 0x00003905, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x00005229, 0x00005077, 0x00000A17, 0x000500C4, 0x0000000C,\n    0x00001998, 0x000022BB, 0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FF,\n    0x00005229, 0x00001998, 0x000500C4, 0x0000000C, 0x00001C01, 0x00005447,\n    0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C82, 0x000047FF, 0x00001C01,\n    0x000500C7, 0x0000000C, 0x000050B0, 0x00005E63, 0x00000A38, 0x000500C5,\n    0x0000000C, 0x00003C71, 0x00003C82, 0x000050B0, 0x000500C3, 0x0000000C,\n    0x00003746, 0x00005E63, 0x00000A17, 0x000500C7, 0x0000000C, 0x000018BA,\n    0x00003746, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005480, 0x000018BA,\n    0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A9, 0x00003C71, 0x00005480,\n    0x000500C3, 0x0000000C, 0x00003A6F, 0x00005E63, 0x00000A1A, 0x000500C7,\n    0x0000000C, 0x000018BB, 0x00003A6F, 0x00000A20, 0x000500C4, 0x0000000C,\n    0x00005481, 0x000018BB, 0x00000A23, 0x000500C5, 0x0000000C, 0x00004570,\n    0x000045A9, 0x00005481, 0x000500C3, 0x0000000C, 0x00003C89, 0x00005E63,\n    0x00000A23, 0x000500C4, 0x0000000C, 0x00002825, 0x00003C89, 0x00000A2F,\n    0x000500C5, 0x0000000C, 0x00003B7A, 0x00004570, 0x00002825, 0x0004007C,\n    0x0000000B, 0x000041E6, 0x00003B7A, 0x000200F9, 0x00005BF0, 0x000200F8,\n    0x00005BF0, 0x000700F5, 0x0000000B, 0x0000292C, 0x000041E5, 0x00002C92,\n    0x000041E6, 0x00005F21, 0x000200F9, 0x00004A60, 0x000200F8, 0x00004A60,\n    0x000700F5, 0x0000000B, 0x00002C70, 0x00002C67, 0x0000260D, 0x0000292C,\n    0x00005BF0, 0x00050080, 0x0000000B, 0x000048BD, 0x00002C70, 0x00005EAC,\n    0x000500C2, 0x0000000B, 0x00003D52, 0x000048BD, 0x00000A17, 0x00060041,\n    0x00000294, 0x00004FAF, 0x0000107A, 0x00000A0B, 0x00003D52, 0x0004003D,\n    0x00000017, 0x00001CAA, 0x00004FAF, 0x000500AA, 0x00000009, 0x000035C0,\n    0x000061E2, 0x00000A0D, 0x000500AA, 0x00000009, 0x00005376, 0x000061E2,\n    0x00000A10, 0x000500A6, 0x00000009, 0x00005686, 0x000035C0, 0x00005376,\n    0x000300F7, 0x00003463, 0x00000000, 0x000400FA, 0x00005686, 0x00002957,\n    0x00003463, 0x000200F8, 0x00002957, 0x000500C7, 0x00000017, 0x0000475F,\n    0x00001CAA, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D1, 0x0000475F,\n    0x0000013D, 0x000500C7, 0x00000017, 0x000050AC, 0x00001CAA, 0x0000072E,\n    0x000500C2, 0x00000017, 0x0000448D, 0x000050AC, 0x0000013D, 0x000500C5,\n    0x00000017, 0x00003FF8, 0x000024D1, 0x0000448D, 0x000200F9, 0x00003463,\n    0x000200F8, 0x00003463, 0x000700F5, 0x00000017, 0x00005879, 0x00001CAA,\n    0x00004A60, 0x00003FF8, 0x00002957, 0x000500AA, 0x00000009, 0x00004CB6,\n    0x000061E2, 0x00000A13, 0x000500A6, 0x00000009, 0x00003B23, 0x00005376,\n    0x00004CB6, 0x000300F7, 0x0000362B, 0x00000000, 0x000400FA, 0x00003B23,\n    0x00002B38, 0x0000362B, 0x000200F8, 0x00002B38, 0x000500C4, 0x00000017,\n    0x00005E17, 0x00005879, 0x000002ED, 0x000500C2, 0x00000017, 0x00003BE7,\n    0x00005879, 0x000002ED, 0x000500C5, 0x00000017, 0x000029E8, 0x00005E17,\n    0x00003BE7, 0x000200F9, 0x0000362B, 0x000200F8, 0x0000362B, 0x000700F5,\n    0x00000017, 0x00004AB4, 0x00005879, 0x00003463, 0x000029E8, 0x00002B38,\n    0x000500C2, 0x0000000B, 0x00001BB7, 0x000038F6, 0x00000A17, 0x000500C7,\n    0x00000017, 0x000030B2, 0x00004AB4, 0x000009CE, 0x000500C7, 0x00000017,\n    0x00004943, 0x00004AB4, 0x00000857, 0x000500C4, 0x00000017, 0x00006164,\n    0x00004943, 0x000002ED, 0x000500C5, 0x00000017, 0x00004295, 0x000030B2,\n    0x00006164, 0x000500C7, 0x00000017, 0x000052DC, 0x00004AB4, 0x00000A27,\n    0x000500C2, 0x00000017, 0x000046A8, 0x000052DC, 0x000002ED, 0x000500C5,\n    0x00000017, 0x00001984, 0x00004295, 0x000046A8, 0x00060041, 0x00000294,\n    0x00004F1E, 0x0000140E, 0x00000A0B, 0x00001BB7, 0x0003003E, 0x00004F1E,\n    0x00001984, 0x00050080, 0x0000000B, 0x000054B5, 0x000038F6, 0x00000A3A,\n    0x000300F7, 0x00006070, 0x00000002, 0x000400FA, 0x00004376, 0x000055E9,\n    0x00001C25, 0x000200F8, 0x000055E9, 0x000200F9, 0x00006070, 0x000200F8,\n    0x00001C25, 0x000200F9, 0x00006070, 0x000200F8, 0x00006070, 0x000700F5,\n    0x0000000B, 0x00002C71, 0x00000A6A, 0x000055E9, 0x00000A3A, 0x00001C25,\n    0x00050080, 0x0000000B, 0x000048BE, 0x000048BD, 0x00002C71, 0x000500C2,\n    0x0000000B, 0x00003D53, 0x000048BE, 0x00000A17, 0x00060041, 0x00000294,\n    0x00005566, 0x0000107A, 0x00000A0B, 0x00003D53, 0x0004003D, 0x00000017,\n    0x00003910, 0x00005566, 0x000300F7, 0x00003A1A, 0x00000000, 0x000400FA,\n    0x00005686, 0x00002958, 0x00003A1A, 0x000200F8, 0x00002958, 0x000500C7,\n    0x00000017, 0x00004760, 0x00003910, 0x000009CE, 0x000500C4, 0x00000017,\n    0x000024D2, 0x00004760, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AD,\n    0x00003910, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448E, 0x000050AD,\n    0x0000013D, 0x000500C5, 0x00000017, 0x00003FF9, 0x000024D2, 0x0000448E,\n    0x000200F9, 0x00003A1A, 0x000200F8, 0x00003A1A, 0x000700F5, 0x00000017,\n    0x00002AAC, 0x00003910, 0x00006070, 0x00003FF9, 0x00002958, 0x000300F7,\n    0x0000362C, 0x00000000, 0x000400FA, 0x00003B23, 0x00002B39, 0x0000362C,\n    0x000200F8, 0x00002B39, 0x000500C4, 0x00000017, 0x00005E18, 0x00002AAC,\n    0x000002ED, 0x000500C2, 0x00000017, 0x00003BE8, 0x00002AAC, 0x000002ED,\n    0x000500C5, 0x00000017, 0x000029E9, 0x00005E18, 0x00003BE8, 0x000200F9,\n    0x0000362C, 0x000200F8, 0x0000362C, 0x000700F5, 0x00000017, 0x00004AB5,\n    0x00002AAC, 0x00003A1A, 0x000029E9, 0x00002B39, 0x000500C2, 0x0000000B,\n    0x00001BB8, 0x000054B5, 0x00000A17, 0x000500C7, 0x00000017, 0x000030B3,\n    0x00004AB5, 0x000009CE, 0x000500C7, 0x00000017, 0x00004944, 0x00004AB5,\n    0x00000857, 0x000500C4, 0x00000017, 0x00006165, 0x00004944, 0x000002ED,\n    0x000500C5, 0x00000017, 0x00004296, 0x000030B3, 0x00006165, 0x000500C7,\n    0x00000017, 0x000052DD, 0x00004AB5, 0x00000A27, 0x000500C2, 0x00000017,\n    0x000046A9, 0x000052DD, 0x000002ED, 0x000500C5, 0x00000017, 0x00001985,\n    0x00004296, 0x000046A9, 0x00060041, 0x00000294, 0x00005819, 0x0000140E,\n    0x00000A0B, 0x00001BB8, 0x0003003E, 0x00005819, 0x00001985, 0x000200F9,\n    0x00004C7A, 0x000200F8, 0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_gbgr8_rgb8_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25155\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n     %v4uint = OpTypeVector %uint 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v3uint = OpTypeVector %uint 3\n    %uint_24 = OpConstant %uint 24\n %uint_65280 = OpConstant %uint 65280\n     %uint_8 = OpConstant %uint 8\n   %uint_257 = OpConstant %uint 257\n   %uint_255 = OpConstant %uint 255\n%uint_16711680 = OpConstant %uint 16711680\n     %uint_1 = OpConstant %uint 1\n     %uint_2 = OpConstant %uint 2\n%uint_16711935 = OpConstant %uint 16711935\n%uint_4278255360 = OpConstant %uint 4278255360\n     %uint_3 = OpConstant %uint 3\n    %uint_16 = OpConstant %uint 16\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n     %uint_0 = OpConstant %uint 0\n      %int_3 = OpConstant %int 3\n      %int_2 = OpConstant %int 2\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %2603 = OpConstantComposite %v3uint %uint_3 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n     %uint_4 = OpConstant %uint 4\n    %uint_32 = OpConstant %uint 32\n    %uint_48 = OpConstant %uint 48\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n       %2311 = OpConstantComposite %v2uint %uint_24 %uint_24\n       %2682 = OpConstantComposite %v2uint %uint_65280 %uint_65280\n       %1975 = OpConstantComposite %v2uint %uint_8 %uint_8\n       %1182 = OpConstantComposite %v2uint %uint_257 %uint_257\n       %1140 = OpConstantComposite %v2uint %uint_255 %uint_255\n       %2993 = OpConstantComposite %v2uint %uint_16711680 %uint_16711680\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24540 = OpBitwiseAnd %uint %13606 %uint_1\n      %17270 = OpINotEqual %bool %24540 %uint_0\n      %12328 = OpBitwiseAnd %uint %13606 %uint_2\n      %17284 = OpINotEqual %bool %12328 %uint_0\n       %7856 = OpShiftRightLogical %uint %13606 %uint_2\n      %25058 = OpBitwiseAnd %uint %7856 %uint_3\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2603\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %6586 DontFlatten\n               OpBranchConditional %24679 %21992 %6586\n      %21992 = OpLabel\n               OpBranch %19578\n       %6586 = OpLabel\n      %23478 = OpBitcast %v3int %21387\n      %18710 = OpCompositeExtract %uint %22410 1\n      %23531 = OpCompositeExtract %int %23478 0\n      %22810 = OpIMul %int %23531 %int_8\n       %6362 = OpCompositeExtract %int %23478 2\n      %14505 = OpBitcast %int %18710\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %23478 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %6594\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %22810 %24535\n      %10404 = OpBitcast %uint %8258\n      %14582 = OpIAdd %uint %22411 %10404\n      %12308 = OpLogicalNot %bool %17270\n               OpSelectionMerge %19040 DontFlatten\n               OpBranchConditional %12308 %9741 %17007\n       %9741 = OpLabel\n      %17463 = OpCompositeExtract %uint %21387 0\n      %11246 = OpCompositeExtract %uint %21387 1\n      %18801 = OpCompositeExtract %uint %21387 2\n      %14831 = OpIMul %uint %22409 %18801\n      %20322 = OpIAdd %uint %11246 %14831\n      %21676 = OpIMul %uint %22408 %20322\n      %20398 = OpIAdd %uint %17463 %21676\n      %11367 = OpShiftLeftLogical %uint %20398 %uint_2\n               OpBranch %19040\n      %17007 = OpLabel\n               OpSelectionMerge %23536 DontFlatten\n               OpBranchConditional %17284 %11410 %24353\n      %11410 = OpLabel\n      %21364 = OpShiftRightLogical %uint %22408 %int_5\n      %13804 = OpShiftRightLogical %uint %22409 %int_4\n      %13237 = OpShiftRightArithmetic %int %6362 %int_2\n      %22374 = OpBitcast %int %13804\n      %25085 = OpIMul %int %13237 %22374\n      %11618 = OpShiftRightArithmetic %int %17598 %int_4\n      %16670 = OpIAdd %int %25085 %11618\n      %19064 = OpBitcast %int %21364\n      %13020 = OpIMul %int %16670 %19064\n      %12986 = OpShiftRightArithmetic %int %23531 %int_5\n      %24558 = OpIAdd %int %13020 %12986\n       %8797 = OpShiftLeftLogical %int %24558 %int_7\n      %11434 = OpBitwiseAnd %int %6362 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %17598 %int_1\n      %21365 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21365 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %23531 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17334 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17334 %uint_2\n      %13015 = OpShiftRightArithmetic %int %17598 %int_3\n       %9929 = OpBitwiseXor %int %13015 %13237\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %23531 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %17598 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6551\n       %7168 = OpShiftLeftLogical %int %16793 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24144 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24144 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24144 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24144 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %23536\n      %24353 = OpLabel\n      %23000 = OpBitcast %v2int %17136\n      %22120 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %23000 1\n      %12089 = OpShiftRightArithmetic %int %14597 %int_5\n      %22400 = OpBitcast %int %22120\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %23000 0\n      %20423 = OpShiftRightArithmetic %int %25154 %int_5\n      %18864 = OpIAdd %int %7938 %20423\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25154 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17335 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17335 %uint_2\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25154 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6552\n       %7169 = OpShiftLeftLogical %int %21575 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24163 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24163 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24163 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %23536\n      %23536 = OpLabel\n      %10540 = OpPhi %uint %16869 %11410 %16870 %24353\n               OpBranch %19040\n      %19040 = OpLabel\n      %11376 = OpPhi %uint %11367 %9741 %10540 %23536\n      %18621 = OpIAdd %uint %11376 %24236\n      %15698 = OpShiftRightLogical %uint %18621 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15698\n       %7338 = OpLoad %v4uint %20399\n      %13760 = OpIEqual %bool %25058 %uint_1\n      %21366 = OpIEqual %bool %25058 %uint_2\n      %22150 = OpLogicalOr %bool %13760 %21366\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %7338 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %7338 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22649 = OpPhi %v4uint %7338 %19040 %16376 %10583\n      %19638 = OpIEqual %bool %25058 %uint_3\n      %15139 = OpLogicalOr %bool %21366 %19638\n               OpSelectionMerge %11682 None\n               OpBranchConditional %15139 %11064 %11682\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22649 %749\n      %15335 = OpShiftRightLogical %v4uint %22649 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %11682\n      %11682 = OpLabel\n      %19853 = OpPhi %v4uint %22649 %13411 %10728 %11064\n      %22133 = OpVectorShuffle %v2uint %19853 %19853 0 1\n      %14639 = OpShiftRightLogical %v2uint %22133 %2311\n       %6730 = OpBitwiseAnd %v2uint %22133 %2682\n      %16264 = OpShiftLeftLogical %v2uint %6730 %1975\n      %22500 = OpIMul %v2uint %16264 %1182\n       %9800 = OpBitwiseOr %v2uint %14639 %22500\n       %8030 = OpBitwiseAnd %v2uint %22133 %1140\n      %22878 = OpShiftLeftLogical %v2uint %8030 %1975\n      %18448 = OpBitwiseAnd %v2uint %22133 %2993\n      %15354 = OpShiftRightLogical %v2uint %18448 %1975\n       %7420 = OpCompositeExtract %uint %22878 0\n      %24539 = OpCompositeExtract %uint %22878 1\n       %7641 = OpCompositeExtract %uint %15354 0\n       %7795 = OpCompositeExtract %uint %15354 1\n      %16161 = OpCompositeConstruct %v4uint %7420 %24539 %7641 %7795\n       %7774 = OpVectorShuffle %v4uint %16161 %16161 0 2 1 3\n       %6860 = OpVectorShuffle %v4uint %9800 %9800 0 0 1 1\n      %24814 = OpBitwiseOr %v4uint %6860 %7774\n      %18141 = OpVectorShuffle %v2uint %19853 %19853 2 3\n       %8212 = OpShiftRightLogical %v2uint %18141 %2311\n       %6731 = OpBitwiseAnd %v2uint %18141 %2682\n      %16265 = OpShiftLeftLogical %v2uint %6731 %1975\n      %22501 = OpIMul %v2uint %16265 %1182\n       %9801 = OpBitwiseOr %v2uint %8212 %22501\n       %8031 = OpBitwiseAnd %v2uint %18141 %1140\n      %22879 = OpShiftLeftLogical %v2uint %8031 %1975\n      %18449 = OpBitwiseAnd %v2uint %18141 %2993\n      %15355 = OpShiftRightLogical %v2uint %18449 %1975\n       %7421 = OpCompositeExtract %uint %22879 0\n      %24541 = OpCompositeExtract %uint %22879 1\n       %7642 = OpCompositeExtract %uint %15355 0\n       %7796 = OpCompositeExtract %uint %15355 1\n      %16162 = OpCompositeConstruct %v4uint %7421 %24541 %7642 %7796\n       %7775 = OpVectorShuffle %v4uint %16162 %16162 0 2 1 3\n       %9045 = OpVectorShuffle %v4uint %9801 %9801 0 0 1 1\n      %21539 = OpBitwiseOr %v4uint %9045 %7775\n      %23682 = OpShiftRightLogical %uint %14582 %int_4\n       %7578 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %23682\n               OpStore %7578 %24814\n       %8268 = OpIAdd %uint %14582 %uint_16\n       %6653 = OpShiftRightLogical %uint %8268 %int_4\n      %21689 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %6653\n               OpStore %21689 %21539\n               OpSelectionMerge %24688 DontFlatten\n               OpBranchConditional %17270 %21993 %7205\n      %21993 = OpLabel\n               OpBranch %24688\n       %7205 = OpLabel\n               OpBranch %24688\n      %24688 = OpLabel\n      %11377 = OpPhi %uint %uint_32 %21993 %uint_16 %7205\n      %18622 = OpIAdd %uint %18621 %11377\n      %15699 = OpShiftRightLogical %uint %18622 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15699\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %14874 None\n               OpBranchConditional %22150 %10584 %14874\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %14874\n      %14874 = OpLabel\n      %10924 = OpPhi %v4uint %14608 %24688 %16377 %10584\n               OpSelectionMerge %11683 None\n               OpBranchConditional %15139 %11065 %11683\n      %11065 = OpLabel\n      %24088 = OpShiftLeftLogical %v4uint %10924 %749\n      %15336 = OpShiftRightLogical %v4uint %10924 %749\n      %10729 = OpBitwiseOr %v4uint %24088 %15336\n               OpBranch %11683\n      %11683 = OpLabel\n      %19854 = OpPhi %v4uint %10924 %14874 %10729 %11065\n      %22134 = OpVectorShuffle %v2uint %19854 %19854 0 1\n      %14640 = OpShiftRightLogical %v2uint %22134 %2311\n       %6732 = OpBitwiseAnd %v2uint %22134 %2682\n      %16266 = OpShiftLeftLogical %v2uint %6732 %1975\n      %22502 = OpIMul %v2uint %16266 %1182\n       %9802 = OpBitwiseOr %v2uint %14640 %22502\n       %8032 = OpBitwiseAnd %v2uint %22134 %1140\n      %22880 = OpShiftLeftLogical %v2uint %8032 %1975\n      %18450 = OpBitwiseAnd %v2uint %22134 %2993\n      %15356 = OpShiftRightLogical %v2uint %18450 %1975\n       %7422 = OpCompositeExtract %uint %22880 0\n      %24542 = OpCompositeExtract %uint %22880 1\n       %7643 = OpCompositeExtract %uint %15356 0\n       %7797 = OpCompositeExtract %uint %15356 1\n      %16163 = OpCompositeConstruct %v4uint %7422 %24542 %7643 %7797\n       %7776 = OpVectorShuffle %v4uint %16163 %16163 0 2 1 3\n       %6861 = OpVectorShuffle %v4uint %9802 %9802 0 0 1 1\n      %24815 = OpBitwiseOr %v4uint %6861 %7776\n      %18142 = OpVectorShuffle %v2uint %19854 %19854 2 3\n       %8213 = OpShiftRightLogical %v2uint %18142 %2311\n       %6733 = OpBitwiseAnd %v2uint %18142 %2682\n      %16267 = OpShiftLeftLogical %v2uint %6733 %1975\n      %22503 = OpIMul %v2uint %16267 %1182\n       %9803 = OpBitwiseOr %v2uint %8213 %22503\n       %8033 = OpBitwiseAnd %v2uint %18142 %1140\n      %22881 = OpShiftLeftLogical %v2uint %8033 %1975\n      %18451 = OpBitwiseAnd %v2uint %18142 %2993\n      %15357 = OpShiftRightLogical %v2uint %18451 %1975\n       %7423 = OpCompositeExtract %uint %22881 0\n      %24543 = OpCompositeExtract %uint %22881 1\n       %7644 = OpCompositeExtract %uint %15357 0\n       %7798 = OpCompositeExtract %uint %15357 1\n      %16164 = OpCompositeConstruct %v4uint %7423 %24543 %7644 %7798\n       %7777 = OpVectorShuffle %v4uint %16164 %16164 0 2 1 3\n       %7791 = OpVectorShuffle %v4uint %9803 %9803 0 0 1 1\n      %16337 = OpBitwiseOr %v4uint %7791 %7777\n      %14629 = OpIAdd %uint %14582 %uint_32\n      %21904 = OpShiftRightLogical %uint %14629 %int_4\n      %19428 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %21904\n               OpStore %19428 %24815\n       %8269 = OpIAdd %uint %14582 %uint_48\n       %6654 = OpShiftRightLogical %uint %8269 %int_4\n      %21727 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %6654\n               OpStore %21727 %16337\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_gbgr8_rgb8_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006243, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000017,\n    0x0000000B, 0x00000004, 0x00040015, 0x0000000C, 0x00000020, 0x00000001,\n    0x00040017, 0x00000012, 0x0000000C, 0x00000002, 0x00040017, 0x00000016,\n    0x0000000C, 0x00000003, 0x00020014, 0x00000009, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A52, 0x00000018,\n    0x0004002B, 0x0000000B, 0x00000A87, 0x0000FF00, 0x0004002B, 0x0000000B,\n    0x00000A22, 0x00000008, 0x0004002B, 0x0000000B, 0x0000014A, 0x00000101,\n    0x0004002B, 0x0000000B, 0x00000144, 0x000000FF, 0x0004002B, 0x0000000B,\n    0x000005A9, 0x00FF0000, 0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001,\n    0x0004002B, 0x0000000B, 0x00000A10, 0x00000002, 0x0004002B, 0x0000000B,\n    0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00,\n    0x0004002B, 0x0000000B, 0x00000A13, 0x00000003, 0x0004002B, 0x0000000B,\n    0x00000A3A, 0x00000010, 0x0004002B, 0x0000000C, 0x00000A17, 0x00000004,\n    0x0004002B, 0x0000000C, 0x00000A1D, 0x00000006, 0x0004002B, 0x0000000C,\n    0x00000A2C, 0x0000000B, 0x0004002B, 0x0000000C, 0x00000A38, 0x0000000F,\n    0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C,\n    0x00000A1A, 0x00000005, 0x0004002B, 0x0000000C, 0x00000A20, 0x00000007,\n    0x0004002B, 0x0000000C, 0x00000A23, 0x00000008, 0x0004002B, 0x0000000C,\n    0x00000A2F, 0x0000000C, 0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000,\n    0x0004002B, 0x0000000C, 0x00000A14, 0x00000003, 0x0004002B, 0x0000000C,\n    0x00000A11, 0x00000002, 0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000,\n    0x000A001E, 0x00000489, 0x0000000B, 0x0000000B, 0x0000000B, 0x0000000B,\n    0x00000014, 0x0000000B, 0x0000000B, 0x0000000B, 0x00040020, 0x00000706,\n    0x00000009, 0x00000489, 0x0004003B, 0x00000706, 0x00000CE9, 0x00000009,\n    0x00040020, 0x00000288, 0x00000009, 0x0000000B, 0x00040020, 0x00000291,\n    0x00000009, 0x00000014, 0x00040020, 0x00000292, 0x00000001, 0x00000014,\n    0x0004003B, 0x00000292, 0x00000F48, 0x00000001, 0x0006002C, 0x00000014,\n    0x00000A2B, 0x00000A13, 0x00000A0A, 0x00000A0A, 0x00040017, 0x0000000F,\n    0x00000009, 0x00000002, 0x0003001D, 0x000007DC, 0x00000017, 0x0003001E,\n    0x000007B4, 0x000007DC, 0x00040020, 0x00000A31, 0x00000002, 0x000007B4,\n    0x0004003B, 0x00000A31, 0x0000107A, 0x00000002, 0x00040020, 0x00000294,\n    0x00000002, 0x00000017, 0x0003001D, 0x000007DD, 0x00000017, 0x0003001E,\n    0x000007B5, 0x000007DD, 0x00040020, 0x00000A32, 0x00000002, 0x000007B5,\n    0x0004003B, 0x00000A32, 0x0000140E, 0x00000002, 0x0004002B, 0x0000000B,\n    0x00000A16, 0x00000004, 0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020,\n    0x0004002B, 0x0000000B, 0x00000A9A, 0x00000030, 0x0006002C, 0x00000014,\n    0x00000BC3, 0x00000A16, 0x00000A6A, 0x00000A0D, 0x0007002C, 0x00000017,\n    0x000009CE, 0x000008A6, 0x000008A6, 0x000008A6, 0x000008A6, 0x0007002C,\n    0x00000017, 0x0000013D, 0x00000A22, 0x00000A22, 0x00000A22, 0x00000A22,\n    0x0007002C, 0x00000017, 0x0000072E, 0x000005FD, 0x000005FD, 0x000005FD,\n    0x000005FD, 0x0007002C, 0x00000017, 0x000002ED, 0x00000A3A, 0x00000A3A,\n    0x00000A3A, 0x00000A3A, 0x0005002C, 0x00000011, 0x00000907, 0x00000A52,\n    0x00000A52, 0x0005002C, 0x00000011, 0x00000A7A, 0x00000A87, 0x00000A87,\n    0x0005002C, 0x00000011, 0x000007B7, 0x00000A22, 0x00000A22, 0x0005002C,\n    0x00000011, 0x0000049E, 0x0000014A, 0x0000014A, 0x0005002C, 0x00000011,\n    0x00000474, 0x00000144, 0x00000144, 0x0005002C, 0x00000011, 0x00000BB1,\n    0x000005A9, 0x000005A9, 0x00050036, 0x00000008, 0x0000161F, 0x00000000,\n    0x00000502, 0x000200F8, 0x00003B06, 0x000300F7, 0x00004C7A, 0x00000000,\n    0x000300FB, 0x00000A0A, 0x00002E68, 0x000200F8, 0x00002E68, 0x00050041,\n    0x00000288, 0x000060D7, 0x00000CE9, 0x00000A0B, 0x0004003D, 0x0000000B,\n    0x00003526, 0x000060D7, 0x000500C7, 0x0000000B, 0x00005FDC, 0x00003526,\n    0x00000A0D, 0x000500AB, 0x00000009, 0x00004376, 0x00005FDC, 0x00000A0A,\n    0x000500C7, 0x0000000B, 0x00003028, 0x00003526, 0x00000A10, 0x000500AB,\n    0x00000009, 0x00004384, 0x00003028, 0x00000A0A, 0x000500C2, 0x0000000B,\n    0x00001EB0, 0x00003526, 0x00000A10, 0x000500C7, 0x0000000B, 0x000061E2,\n    0x00001EB0, 0x00000A13, 0x00050041, 0x00000288, 0x0000492C, 0x00000CE9,\n    0x00000A0E, 0x0004003D, 0x0000000B, 0x00005EAC, 0x0000492C, 0x00050041,\n    0x00000288, 0x00004EBA, 0x00000CE9, 0x00000A11, 0x0004003D, 0x0000000B,\n    0x00005788, 0x00004EBA, 0x00050041, 0x00000288, 0x00004EBB, 0x00000CE9,\n    0x00000A14, 0x0004003D, 0x0000000B, 0x00005789, 0x00004EBB, 0x00050041,\n    0x00000291, 0x00004EBC, 0x00000CE9, 0x00000A17, 0x0004003D, 0x00000014,\n    0x0000578A, 0x00004EBC, 0x00050041, 0x00000288, 0x00004EBD, 0x00000CE9,\n    0x00000A1A, 0x0004003D, 0x0000000B, 0x0000578B, 0x00004EBD, 0x00050041,\n    0x00000288, 0x00004E6E, 0x00000CE9, 0x00000A1D, 0x0004003D, 0x0000000B,\n    0x000019C2, 0x00004E6E, 0x0004003D, 0x00000014, 0x00002A0E, 0x00000F48,\n    0x000500C4, 0x00000014, 0x0000538B, 0x00002A0E, 0x00000A2B, 0x0007004F,\n    0x00000011, 0x000042F0, 0x0000538B, 0x0000538B, 0x00000000, 0x00000001,\n    0x0007004F, 0x00000011, 0x0000242F, 0x0000578A, 0x0000578A, 0x00000000,\n    0x00000001, 0x000500AE, 0x0000000F, 0x00004288, 0x000042F0, 0x0000242F,\n    0x0004009A, 0x00000009, 0x00006067, 0x00004288, 0x000300F7, 0x000019BA,\n    0x00000002, 0x000400FA, 0x00006067, 0x000055E8, 0x000019BA, 0x000200F8,\n    0x000055E8, 0x000200F9, 0x00004C7A, 0x000200F8, 0x000019BA, 0x0004007C,\n    0x00000016, 0x00005BB6, 0x0000538B, 0x00050051, 0x0000000B, 0x00004916,\n    0x0000578A, 0x00000001, 0x00050051, 0x0000000C, 0x00005BEB, 0x00005BB6,\n    0x00000000, 0x00050084, 0x0000000C, 0x0000591A, 0x00005BEB, 0x00000A23,\n    0x00050051, 0x0000000C, 0x000018DA, 0x00005BB6, 0x00000002, 0x0004007C,\n    0x0000000C, 0x000038A9, 0x00004916, 0x00050084, 0x0000000C, 0x00002C0F,\n    0x000018DA, 0x000038A9, 0x00050051, 0x0000000C, 0x000044BE, 0x00005BB6,\n    0x00000001, 0x00050080, 0x0000000C, 0x000056D4, 0x00002C0F, 0x000044BE,\n    0x0004007C, 0x0000000C, 0x00005785, 0x000019C2, 0x00050084, 0x0000000C,\n    0x00005FD7, 0x000056D4, 0x00005785, 0x00050080, 0x0000000C, 0x00002042,\n    0x0000591A, 0x00005FD7, 0x0004007C, 0x0000000B, 0x000028A4, 0x00002042,\n    0x00050080, 0x0000000B, 0x000038F6, 0x0000578B, 0x000028A4, 0x000400A8,\n    0x00000009, 0x00003014, 0x00004376, 0x000300F7, 0x00004A60, 0x00000002,\n    0x000400FA, 0x00003014, 0x0000260D, 0x0000426F, 0x000200F8, 0x0000260D,\n    0x00050051, 0x0000000B, 0x00004437, 0x0000538B, 0x00000000, 0x00050051,\n    0x0000000B, 0x00002BEE, 0x0000538B, 0x00000001, 0x00050051, 0x0000000B,\n    0x00004971, 0x0000538B, 0x00000002, 0x00050084, 0x0000000B, 0x000039EF,\n    0x00005789, 0x00004971, 0x00050080, 0x0000000B, 0x00004F62, 0x00002BEE,\n    0x000039EF, 0x00050084, 0x0000000B, 0x000054AC, 0x00005788, 0x00004F62,\n    0x00050080, 0x0000000B, 0x00004FAE, 0x00004437, 0x000054AC, 0x000500C4,\n    0x0000000B, 0x00002C67, 0x00004FAE, 0x00000A10, 0x000200F9, 0x00004A60,\n    0x000200F8, 0x0000426F, 0x000300F7, 0x00005BF0, 0x00000002, 0x000400FA,\n    0x00004384, 0x00002C92, 0x00005F21, 0x000200F8, 0x00002C92, 0x000500C2,\n    0x0000000B, 0x00005374, 0x00005788, 0x00000A1A, 0x000500C2, 0x0000000B,\n    0x000035EC, 0x00005789, 0x00000A17, 0x000500C3, 0x0000000C, 0x000033B5,\n    0x000018DA, 0x00000A11, 0x0004007C, 0x0000000C, 0x00005766, 0x000035EC,\n    0x00050084, 0x0000000C, 0x000061FD, 0x000033B5, 0x00005766, 0x000500C3,\n    0x0000000C, 0x00002D62, 0x000044BE, 0x00000A17, 0x00050080, 0x0000000C,\n    0x0000411E, 0x000061FD, 0x00002D62, 0x0004007C, 0x0000000C, 0x00004A78,\n    0x00005374, 0x00050084, 0x0000000C, 0x000032DC, 0x0000411E, 0x00004A78,\n    0x000500C3, 0x0000000C, 0x000032BA, 0x00005BEB, 0x00000A1A, 0x00050080,\n    0x0000000C, 0x00005FEE, 0x000032DC, 0x000032BA, 0x000500C4, 0x0000000C,\n    0x0000225D, 0x00005FEE, 0x00000A20, 0x000500C7, 0x0000000C, 0x00002CAA,\n    0x000018DA, 0x00000A14, 0x000500C4, 0x0000000C, 0x00004CAE, 0x00002CAA,\n    0x00000A1A, 0x000500C3, 0x0000000C, 0x0000383E, 0x000044BE, 0x00000A0E,\n    0x000500C7, 0x0000000C, 0x00005375, 0x0000383E, 0x00000A14, 0x000500C4,\n    0x0000000C, 0x000054CA, 0x00005375, 0x00000A14, 0x000500C5, 0x0000000C,\n    0x000042CE, 0x00004CAE, 0x000054CA, 0x000500C7, 0x0000000C, 0x000050D5,\n    0x00005BEB, 0x00000A20, 0x000500C5, 0x0000000C, 0x00003ADD, 0x000042CE,\n    0x000050D5, 0x000500C5, 0x0000000C, 0x000043B6, 0x0000225D, 0x00003ADD,\n    0x000500C4, 0x0000000C, 0x00005E50, 0x000043B6, 0x00000A10, 0x000500C3,\n    0x0000000C, 0x000032D7, 0x000044BE, 0x00000A14, 0x000500C6, 0x0000000C,\n    0x000026C9, 0x000032D7, 0x000033B5, 0x000500C7, 0x0000000C, 0x00004199,\n    0x000026C9, 0x00000A0E, 0x000500C3, 0x0000000C, 0x00002590, 0x00005BEB,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x0000505E, 0x00002590, 0x00000A14,\n    0x000500C4, 0x0000000C, 0x0000541D, 0x00004199, 0x00000A0E, 0x000500C6,\n    0x0000000C, 0x000022BA, 0x0000505E, 0x0000541D, 0x000500C7, 0x0000000C,\n    0x00005076, 0x000044BE, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005228,\n    0x00005076, 0x00000A17, 0x000500C4, 0x0000000C, 0x00001997, 0x000022BA,\n    0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FE, 0x00005228, 0x00001997,\n    0x000500C4, 0x0000000C, 0x00001C00, 0x00004199, 0x00000A2C, 0x000500C5,\n    0x0000000C, 0x00003C81, 0x000047FE, 0x00001C00, 0x000500C7, 0x0000000C,\n    0x000050AF, 0x00005E50, 0x00000A38, 0x000500C5, 0x0000000C, 0x00003C70,\n    0x00003C81, 0x000050AF, 0x000500C3, 0x0000000C, 0x00003745, 0x00005E50,\n    0x00000A17, 0x000500C7, 0x0000000C, 0x000018B8, 0x00003745, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x0000547E, 0x000018B8, 0x00000A1A, 0x000500C5,\n    0x0000000C, 0x000045A8, 0x00003C70, 0x0000547E, 0x000500C3, 0x0000000C,\n    0x00003A6E, 0x00005E50, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018B9,\n    0x00003A6E, 0x00000A20, 0x000500C4, 0x0000000C, 0x0000547F, 0x000018B9,\n    0x00000A23, 0x000500C5, 0x0000000C, 0x0000456F, 0x000045A8, 0x0000547F,\n    0x000500C3, 0x0000000C, 0x00003C88, 0x00005E50, 0x00000A23, 0x000500C4,\n    0x0000000C, 0x00002824, 0x00003C88, 0x00000A2F, 0x000500C5, 0x0000000C,\n    0x00003B79, 0x0000456F, 0x00002824, 0x0004007C, 0x0000000B, 0x000041E5,\n    0x00003B79, 0x000200F9, 0x00005BF0, 0x000200F8, 0x00005F21, 0x0004007C,\n    0x00000012, 0x000059D8, 0x000042F0, 0x000500C2, 0x0000000B, 0x00005668,\n    0x00005788, 0x00000A1A, 0x00050051, 0x0000000C, 0x00003905, 0x000059D8,\n    0x00000001, 0x000500C3, 0x0000000C, 0x00002F39, 0x00003905, 0x00000A1A,\n    0x0004007C, 0x0000000C, 0x00005780, 0x00005668, 0x00050084, 0x0000000C,\n    0x00001F02, 0x00002F39, 0x00005780, 0x00050051, 0x0000000C, 0x00006242,\n    0x000059D8, 0x00000000, 0x000500C3, 0x0000000C, 0x00004FC7, 0x00006242,\n    0x00000A1A, 0x00050080, 0x0000000C, 0x000049B0, 0x00001F02, 0x00004FC7,\n    0x000500C4, 0x0000000C, 0x0000254A, 0x000049B0, 0x00000A1D, 0x000500C3,\n    0x0000000C, 0x0000603B, 0x00003905, 0x00000A0E, 0x000500C7, 0x0000000C,\n    0x0000539A, 0x0000603B, 0x00000A20, 0x000500C4, 0x0000000C, 0x0000534A,\n    0x0000539A, 0x00000A14, 0x000500C7, 0x0000000C, 0x00004EA5, 0x00006242,\n    0x00000A20, 0x000500C5, 0x0000000C, 0x00002B1A, 0x0000534A, 0x00004EA5,\n    0x000500C5, 0x0000000C, 0x000043B7, 0x0000254A, 0x00002B1A, 0x000500C4,\n    0x0000000C, 0x00005E63, 0x000043B7, 0x00000A10, 0x000500C3, 0x0000000C,\n    0x000031DE, 0x00003905, 0x00000A17, 0x000500C7, 0x0000000C, 0x00005447,\n    0x000031DE, 0x00000A0E, 0x000500C3, 0x0000000C, 0x000028A6, 0x00006242,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x0000511E, 0x000028A6, 0x00000A14,\n    0x000500C3, 0x0000000C, 0x000028B9, 0x00003905, 0x00000A14, 0x000500C7,\n    0x0000000C, 0x0000505F, 0x000028B9, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x0000541E, 0x0000505F, 0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BB,\n    0x0000511E, 0x0000541E, 0x000500C7, 0x0000000C, 0x00005077, 0x00003905,\n    0x00000A0E, 0x000500C4, 0x0000000C, 0x00005229, 0x00005077, 0x00000A17,\n    0x000500C4, 0x0000000C, 0x00001998, 0x000022BB, 0x00000A1D, 0x000500C5,\n    0x0000000C, 0x000047FF, 0x00005229, 0x00001998, 0x000500C4, 0x0000000C,\n    0x00001C01, 0x00005447, 0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C82,\n    0x000047FF, 0x00001C01, 0x000500C7, 0x0000000C, 0x000050B0, 0x00005E63,\n    0x00000A38, 0x000500C5, 0x0000000C, 0x00003C71, 0x00003C82, 0x000050B0,\n    0x000500C3, 0x0000000C, 0x00003746, 0x00005E63, 0x00000A17, 0x000500C7,\n    0x0000000C, 0x000018BA, 0x00003746, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x00005480, 0x000018BA, 0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A9,\n    0x00003C71, 0x00005480, 0x000500C3, 0x0000000C, 0x00003A6F, 0x00005E63,\n    0x00000A1A, 0x000500C7, 0x0000000C, 0x000018BB, 0x00003A6F, 0x00000A20,\n    0x000500C4, 0x0000000C, 0x00005481, 0x000018BB, 0x00000A23, 0x000500C5,\n    0x0000000C, 0x00004570, 0x000045A9, 0x00005481, 0x000500C3, 0x0000000C,\n    0x00003C89, 0x00005E63, 0x00000A23, 0x000500C4, 0x0000000C, 0x00002825,\n    0x00003C89, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B7A, 0x00004570,\n    0x00002825, 0x0004007C, 0x0000000B, 0x000041E6, 0x00003B7A, 0x000200F9,\n    0x00005BF0, 0x000200F8, 0x00005BF0, 0x000700F5, 0x0000000B, 0x0000292C,\n    0x000041E5, 0x00002C92, 0x000041E6, 0x00005F21, 0x000200F9, 0x00004A60,\n    0x000200F8, 0x00004A60, 0x000700F5, 0x0000000B, 0x00002C70, 0x00002C67,\n    0x0000260D, 0x0000292C, 0x00005BF0, 0x00050080, 0x0000000B, 0x000048BD,\n    0x00002C70, 0x00005EAC, 0x000500C2, 0x0000000B, 0x00003D52, 0x000048BD,\n    0x00000A17, 0x00060041, 0x00000294, 0x00004FAF, 0x0000107A, 0x00000A0B,\n    0x00003D52, 0x0004003D, 0x00000017, 0x00001CAA, 0x00004FAF, 0x000500AA,\n    0x00000009, 0x000035C0, 0x000061E2, 0x00000A0D, 0x000500AA, 0x00000009,\n    0x00005376, 0x000061E2, 0x00000A10, 0x000500A6, 0x00000009, 0x00005686,\n    0x000035C0, 0x00005376, 0x000300F7, 0x00003463, 0x00000000, 0x000400FA,\n    0x00005686, 0x00002957, 0x00003463, 0x000200F8, 0x00002957, 0x000500C7,\n    0x00000017, 0x0000475F, 0x00001CAA, 0x000009CE, 0x000500C4, 0x00000017,\n    0x000024D1, 0x0000475F, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AC,\n    0x00001CAA, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448D, 0x000050AC,\n    0x0000013D, 0x000500C5, 0x00000017, 0x00003FF8, 0x000024D1, 0x0000448D,\n    0x000200F9, 0x00003463, 0x000200F8, 0x00003463, 0x000700F5, 0x00000017,\n    0x00005879, 0x00001CAA, 0x00004A60, 0x00003FF8, 0x00002957, 0x000500AA,\n    0x00000009, 0x00004CB6, 0x000061E2, 0x00000A13, 0x000500A6, 0x00000009,\n    0x00003B23, 0x00005376, 0x00004CB6, 0x000300F7, 0x00002DA2, 0x00000000,\n    0x000400FA, 0x00003B23, 0x00002B38, 0x00002DA2, 0x000200F8, 0x00002B38,\n    0x000500C4, 0x00000017, 0x00005E17, 0x00005879, 0x000002ED, 0x000500C2,\n    0x00000017, 0x00003BE7, 0x00005879, 0x000002ED, 0x000500C5, 0x00000017,\n    0x000029E8, 0x00005E17, 0x00003BE7, 0x000200F9, 0x00002DA2, 0x000200F8,\n    0x00002DA2, 0x000700F5, 0x00000017, 0x00004D8D, 0x00005879, 0x00003463,\n    0x000029E8, 0x00002B38, 0x0007004F, 0x00000011, 0x00005675, 0x00004D8D,\n    0x00004D8D, 0x00000000, 0x00000001, 0x000500C2, 0x00000011, 0x0000392F,\n    0x00005675, 0x00000907, 0x000500C7, 0x00000011, 0x00001A4A, 0x00005675,\n    0x00000A7A, 0x000500C4, 0x00000011, 0x00003F88, 0x00001A4A, 0x000007B7,\n    0x00050084, 0x00000011, 0x000057E4, 0x00003F88, 0x0000049E, 0x000500C5,\n    0x00000011, 0x00002648, 0x0000392F, 0x000057E4, 0x000500C7, 0x00000011,\n    0x00001F5E, 0x00005675, 0x00000474, 0x000500C4, 0x00000011, 0x0000595E,\n    0x00001F5E, 0x000007B7, 0x000500C7, 0x00000011, 0x00004810, 0x00005675,\n    0x00000BB1, 0x000500C2, 0x00000011, 0x00003BFA, 0x00004810, 0x000007B7,\n    0x00050051, 0x0000000B, 0x00001CFC, 0x0000595E, 0x00000000, 0x00050051,\n    0x0000000B, 0x00005FDB, 0x0000595E, 0x00000001, 0x00050051, 0x0000000B,\n    0x00001DD9, 0x00003BFA, 0x00000000, 0x00050051, 0x0000000B, 0x00001E73,\n    0x00003BFA, 0x00000001, 0x00070050, 0x00000017, 0x00003F21, 0x00001CFC,\n    0x00005FDB, 0x00001DD9, 0x00001E73, 0x0009004F, 0x00000017, 0x00001E5E,\n    0x00003F21, 0x00003F21, 0x00000000, 0x00000002, 0x00000001, 0x00000003,\n    0x0009004F, 0x00000017, 0x00001ACC, 0x00002648, 0x00002648, 0x00000000,\n    0x00000000, 0x00000001, 0x00000001, 0x000500C5, 0x00000017, 0x000060EE,\n    0x00001ACC, 0x00001E5E, 0x0007004F, 0x00000011, 0x000046DD, 0x00004D8D,\n    0x00004D8D, 0x00000002, 0x00000003, 0x000500C2, 0x00000011, 0x00002014,\n    0x000046DD, 0x00000907, 0x000500C7, 0x00000011, 0x00001A4B, 0x000046DD,\n    0x00000A7A, 0x000500C4, 0x00000011, 0x00003F89, 0x00001A4B, 0x000007B7,\n    0x00050084, 0x00000011, 0x000057E5, 0x00003F89, 0x0000049E, 0x000500C5,\n    0x00000011, 0x00002649, 0x00002014, 0x000057E5, 0x000500C7, 0x00000011,\n    0x00001F5F, 0x000046DD, 0x00000474, 0x000500C4, 0x00000011, 0x0000595F,\n    0x00001F5F, 0x000007B7, 0x000500C7, 0x00000011, 0x00004811, 0x000046DD,\n    0x00000BB1, 0x000500C2, 0x00000011, 0x00003BFB, 0x00004811, 0x000007B7,\n    0x00050051, 0x0000000B, 0x00001CFD, 0x0000595F, 0x00000000, 0x00050051,\n    0x0000000B, 0x00005FDD, 0x0000595F, 0x00000001, 0x00050051, 0x0000000B,\n    0x00001DDA, 0x00003BFB, 0x00000000, 0x00050051, 0x0000000B, 0x00001E74,\n    0x00003BFB, 0x00000001, 0x00070050, 0x00000017, 0x00003F22, 0x00001CFD,\n    0x00005FDD, 0x00001DDA, 0x00001E74, 0x0009004F, 0x00000017, 0x00001E5F,\n    0x00003F22, 0x00003F22, 0x00000000, 0x00000002, 0x00000001, 0x00000003,\n    0x0009004F, 0x00000017, 0x00002355, 0x00002649, 0x00002649, 0x00000000,\n    0x00000000, 0x00000001, 0x00000001, 0x000500C5, 0x00000017, 0x00005423,\n    0x00002355, 0x00001E5F, 0x000500C2, 0x0000000B, 0x00005C82, 0x000038F6,\n    0x00000A17, 0x00060041, 0x00000294, 0x00001D9A, 0x0000140E, 0x00000A0B,\n    0x00005C82, 0x0003003E, 0x00001D9A, 0x000060EE, 0x00050080, 0x0000000B,\n    0x0000204C, 0x000038F6, 0x00000A3A, 0x000500C2, 0x0000000B, 0x000019FD,\n    0x0000204C, 0x00000A17, 0x00060041, 0x00000294, 0x000054B9, 0x0000140E,\n    0x00000A0B, 0x000019FD, 0x0003003E, 0x000054B9, 0x00005423, 0x000300F7,\n    0x00006070, 0x00000002, 0x000400FA, 0x00004376, 0x000055E9, 0x00001C25,\n    0x000200F8, 0x000055E9, 0x000200F9, 0x00006070, 0x000200F8, 0x00001C25,\n    0x000200F9, 0x00006070, 0x000200F8, 0x00006070, 0x000700F5, 0x0000000B,\n    0x00002C71, 0x00000A6A, 0x000055E9, 0x00000A3A, 0x00001C25, 0x00050080,\n    0x0000000B, 0x000048BE, 0x000048BD, 0x00002C71, 0x000500C2, 0x0000000B,\n    0x00003D53, 0x000048BE, 0x00000A17, 0x00060041, 0x00000294, 0x00005566,\n    0x0000107A, 0x00000A0B, 0x00003D53, 0x0004003D, 0x00000017, 0x00003910,\n    0x00005566, 0x000300F7, 0x00003A1A, 0x00000000, 0x000400FA, 0x00005686,\n    0x00002958, 0x00003A1A, 0x000200F8, 0x00002958, 0x000500C7, 0x00000017,\n    0x00004760, 0x00003910, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D2,\n    0x00004760, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AD, 0x00003910,\n    0x0000072E, 0x000500C2, 0x00000017, 0x0000448E, 0x000050AD, 0x0000013D,\n    0x000500C5, 0x00000017, 0x00003FF9, 0x000024D2, 0x0000448E, 0x000200F9,\n    0x00003A1A, 0x000200F8, 0x00003A1A, 0x000700F5, 0x00000017, 0x00002AAC,\n    0x00003910, 0x00006070, 0x00003FF9, 0x00002958, 0x000300F7, 0x00002DA3,\n    0x00000000, 0x000400FA, 0x00003B23, 0x00002B39, 0x00002DA3, 0x000200F8,\n    0x00002B39, 0x000500C4, 0x00000017, 0x00005E18, 0x00002AAC, 0x000002ED,\n    0x000500C2, 0x00000017, 0x00003BE8, 0x00002AAC, 0x000002ED, 0x000500C5,\n    0x00000017, 0x000029E9, 0x00005E18, 0x00003BE8, 0x000200F9, 0x00002DA3,\n    0x000200F8, 0x00002DA3, 0x000700F5, 0x00000017, 0x00004D8E, 0x00002AAC,\n    0x00003A1A, 0x000029E9, 0x00002B39, 0x0007004F, 0x00000011, 0x00005676,\n    0x00004D8E, 0x00004D8E, 0x00000000, 0x00000001, 0x000500C2, 0x00000011,\n    0x00003930, 0x00005676, 0x00000907, 0x000500C7, 0x00000011, 0x00001A4C,\n    0x00005676, 0x00000A7A, 0x000500C4, 0x00000011, 0x00003F8A, 0x00001A4C,\n    0x000007B7, 0x00050084, 0x00000011, 0x000057E6, 0x00003F8A, 0x0000049E,\n    0x000500C5, 0x00000011, 0x0000264A, 0x00003930, 0x000057E6, 0x000500C7,\n    0x00000011, 0x00001F60, 0x00005676, 0x00000474, 0x000500C4, 0x00000011,\n    0x00005960, 0x00001F60, 0x000007B7, 0x000500C7, 0x00000011, 0x00004812,\n    0x00005676, 0x00000BB1, 0x000500C2, 0x00000011, 0x00003BFC, 0x00004812,\n    0x000007B7, 0x00050051, 0x0000000B, 0x00001CFE, 0x00005960, 0x00000000,\n    0x00050051, 0x0000000B, 0x00005FDE, 0x00005960, 0x00000001, 0x00050051,\n    0x0000000B, 0x00001DDB, 0x00003BFC, 0x00000000, 0x00050051, 0x0000000B,\n    0x00001E75, 0x00003BFC, 0x00000001, 0x00070050, 0x00000017, 0x00003F23,\n    0x00001CFE, 0x00005FDE, 0x00001DDB, 0x00001E75, 0x0009004F, 0x00000017,\n    0x00001E60, 0x00003F23, 0x00003F23, 0x00000000, 0x00000002, 0x00000001,\n    0x00000003, 0x0009004F, 0x00000017, 0x00001ACD, 0x0000264A, 0x0000264A,\n    0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x000500C5, 0x00000017,\n    0x000060EF, 0x00001ACD, 0x00001E60, 0x0007004F, 0x00000011, 0x000046DE,\n    0x00004D8E, 0x00004D8E, 0x00000002, 0x00000003, 0x000500C2, 0x00000011,\n    0x00002015, 0x000046DE, 0x00000907, 0x000500C7, 0x00000011, 0x00001A4D,\n    0x000046DE, 0x00000A7A, 0x000500C4, 0x00000011, 0x00003F8B, 0x00001A4D,\n    0x000007B7, 0x00050084, 0x00000011, 0x000057E7, 0x00003F8B, 0x0000049E,\n    0x000500C5, 0x00000011, 0x0000264B, 0x00002015, 0x000057E7, 0x000500C7,\n    0x00000011, 0x00001F61, 0x000046DE, 0x00000474, 0x000500C4, 0x00000011,\n    0x00005961, 0x00001F61, 0x000007B7, 0x000500C7, 0x00000011, 0x00004813,\n    0x000046DE, 0x00000BB1, 0x000500C2, 0x00000011, 0x00003BFD, 0x00004813,\n    0x000007B7, 0x00050051, 0x0000000B, 0x00001CFF, 0x00005961, 0x00000000,\n    0x00050051, 0x0000000B, 0x00005FDF, 0x00005961, 0x00000001, 0x00050051,\n    0x0000000B, 0x00001DDC, 0x00003BFD, 0x00000000, 0x00050051, 0x0000000B,\n    0x00001E76, 0x00003BFD, 0x00000001, 0x00070050, 0x00000017, 0x00003F24,\n    0x00001CFF, 0x00005FDF, 0x00001DDC, 0x00001E76, 0x0009004F, 0x00000017,\n    0x00001E61, 0x00003F24, 0x00003F24, 0x00000000, 0x00000002, 0x00000001,\n    0x00000003, 0x0009004F, 0x00000017, 0x00001E6F, 0x0000264B, 0x0000264B,\n    0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x000500C5, 0x00000017,\n    0x00003FD1, 0x00001E6F, 0x00001E61, 0x00050080, 0x0000000B, 0x00003925,\n    0x000038F6, 0x00000A6A, 0x000500C2, 0x0000000B, 0x00005590, 0x00003925,\n    0x00000A17, 0x00060041, 0x00000294, 0x00004BE4, 0x0000140E, 0x00000A0B,\n    0x00005590, 0x0003003E, 0x00004BE4, 0x000060EF, 0x00050080, 0x0000000B,\n    0x0000204D, 0x000038F6, 0x00000A9A, 0x000500C2, 0x0000000B, 0x000019FE,\n    0x0000204D, 0x00000A17, 0x00060041, 0x00000294, 0x000054DF, 0x0000140E,\n    0x00000A0B, 0x000019FE, 0x0003003E, 0x000054DF, 0x00003FD1, 0x000200F9,\n    0x00004C7A, 0x000200F8, 0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_r10g11b11_rgba16_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25155\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n     %v4uint = OpTypeVector %uint 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v3uint = OpTypeVector %uint 3\n     %uint_0 = OpConstant %uint 0\n    %uint_21 = OpConstant %uint 21\n        %515 = OpConstantComposite %v4uint %uint_0 %uint_21 %uint_0 %uint_21\n  %uint_1023 = OpConstant %uint 1023\n  %uint_2047 = OpConstant %uint 2047\n       %1539 = OpConstantComposite %v4uint %uint_1023 %uint_2047 %uint_1023 %uint_2047\n     %uint_6 = OpConstant %uint 6\n     %uint_5 = OpConstant %uint 5\n        %179 = OpConstantComposite %v4uint %uint_6 %uint_5 %uint_6 %uint_5\n     %uint_4 = OpConstant %uint 4\n    %uint_27 = OpConstant %uint 27\n        %791 = OpConstantComposite %v4uint %uint_4 %uint_27 %uint_4 %uint_27\n    %uint_63 = OpConstant %uint 63\n    %uint_31 = OpConstant %uint 31\n       %2327 = OpConstantComposite %v4uint %uint_63 %uint_31 %uint_63 %uint_31\n%uint_2096128 = OpConstant %uint 2096128\n    %uint_11 = OpConstant %uint 11\n%uint_2031616 = OpConstant %uint 2031616\n     %uint_2 = OpConstant %uint 2\n%uint_4294901760 = OpConstant %uint 4294901760\n     %uint_1 = OpConstant %uint 1\n     %uint_3 = OpConstant %uint 3\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n    %uint_16 = OpConstant %uint 16\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n      %int_3 = OpConstant %int 3\n      %int_2 = OpConstant %int 2\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %2605 = OpConstantComposite %v3uint %uint_3 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n    %uint_32 = OpConstant %uint 32\n    %uint_48 = OpConstant %uint 48\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n       %2686 = OpConstantComposite %v2uint %uint_2096128 %uint_2096128\n       %2038 = OpConstantComposite %v2uint %uint_11 %uint_11\n       %2884 = OpConstantComposite %v2uint %uint_2031616 %uint_2031616\n       %1578 = OpConstantComposite %v2uint %uint_4294901760 %uint_4294901760\n        %200 = OpConstantNull %v2uint\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24540 = OpBitwiseAnd %uint %13606 %uint_1\n      %17270 = OpINotEqual %bool %24540 %uint_0\n      %12328 = OpBitwiseAnd %uint %13606 %uint_2\n      %17284 = OpINotEqual %bool %12328 %uint_0\n       %7856 = OpShiftRightLogical %uint %13606 %uint_2\n      %25058 = OpBitwiseAnd %uint %7856 %uint_3\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2605\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %6586 DontFlatten\n               OpBranchConditional %24679 %21992 %6586\n      %21992 = OpLabel\n               OpBranch %19578\n       %6586 = OpLabel\n      %23478 = OpBitcast %v3int %21387\n      %18710 = OpCompositeExtract %uint %22410 1\n      %23531 = OpCompositeExtract %int %23478 0\n      %22810 = OpIMul %int %23531 %int_8\n       %6362 = OpCompositeExtract %int %23478 2\n      %14505 = OpBitcast %int %18710\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %23478 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %6594\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %22810 %24535\n      %10404 = OpBitcast %uint %8258\n      %14582 = OpIAdd %uint %22411 %10404\n      %12308 = OpLogicalNot %bool %17270\n               OpSelectionMerge %19040 DontFlatten\n               OpBranchConditional %12308 %9741 %17007\n       %9741 = OpLabel\n      %17463 = OpCompositeExtract %uint %21387 0\n      %11246 = OpCompositeExtract %uint %21387 1\n      %18801 = OpCompositeExtract %uint %21387 2\n      %14831 = OpIMul %uint %22409 %18801\n      %20322 = OpIAdd %uint %11246 %14831\n      %21676 = OpIMul %uint %22408 %20322\n      %20398 = OpIAdd %uint %17463 %21676\n      %11367 = OpShiftLeftLogical %uint %20398 %uint_2\n               OpBranch %19040\n      %17007 = OpLabel\n               OpSelectionMerge %23536 DontFlatten\n               OpBranchConditional %17284 %11410 %24353\n      %11410 = OpLabel\n      %21364 = OpShiftRightLogical %uint %22408 %int_5\n      %13804 = OpShiftRightLogical %uint %22409 %int_4\n      %13237 = OpShiftRightArithmetic %int %6362 %int_2\n      %22374 = OpBitcast %int %13804\n      %25085 = OpIMul %int %13237 %22374\n      %11618 = OpShiftRightArithmetic %int %17598 %int_4\n      %16670 = OpIAdd %int %25085 %11618\n      %19064 = OpBitcast %int %21364\n      %13020 = OpIMul %int %16670 %19064\n      %12986 = OpShiftRightArithmetic %int %23531 %int_5\n      %24558 = OpIAdd %int %13020 %12986\n       %8797 = OpShiftLeftLogical %int %24558 %int_7\n      %11434 = OpBitwiseAnd %int %6362 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %17598 %int_1\n      %21365 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21365 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %23531 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17334 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17334 %uint_2\n      %13015 = OpShiftRightArithmetic %int %17598 %int_3\n       %9929 = OpBitwiseXor %int %13015 %13237\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %23531 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %17598 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6551\n       %7168 = OpShiftLeftLogical %int %16793 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24144 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24144 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24144 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24144 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %23536\n      %24353 = OpLabel\n      %23000 = OpBitcast %v2int %17136\n      %22120 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %23000 1\n      %12089 = OpShiftRightArithmetic %int %14597 %int_5\n      %22400 = OpBitcast %int %22120\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %23000 0\n      %20423 = OpShiftRightArithmetic %int %25154 %int_5\n      %18864 = OpIAdd %int %7938 %20423\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25154 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17335 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17335 %uint_2\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25154 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6552\n       %7169 = OpShiftLeftLogical %int %21575 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24163 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24163 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24163 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %23536\n      %23536 = OpLabel\n      %10540 = OpPhi %uint %16869 %11410 %16870 %24353\n               OpBranch %19040\n      %19040 = OpLabel\n      %11376 = OpPhi %uint %11367 %9741 %10540 %23536\n      %18621 = OpIAdd %uint %11376 %24236\n      %15698 = OpShiftRightLogical %uint %18621 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15698\n       %7338 = OpLoad %v4uint %20399\n      %13760 = OpIEqual %bool %25058 %uint_1\n      %21366 = OpIEqual %bool %25058 %uint_2\n      %22150 = OpLogicalOr %bool %13760 %21366\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %7338 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %7338 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22649 = OpPhi %v4uint %7338 %19040 %16376 %10583\n      %19638 = OpIEqual %bool %25058 %uint_3\n      %15139 = OpLogicalOr %bool %21366 %19638\n               OpSelectionMerge %11682 None\n               OpBranchConditional %15139 %11064 %11682\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22649 %749\n      %15335 = OpShiftRightLogical %v4uint %22649 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %11682\n      %11682 = OpLabel\n      %17668 = OpPhi %v4uint %22649 %13411 %10728 %11064\n      %22862 = OpVectorShuffle %v2uint %17668 %17668 0 1\n      %10663 = OpVectorShuffle %v4uint %17668 %200 0 0 1 1\n       %9600 = OpShiftRightLogical %v4uint %10663 %515\n       %7908 = OpBitwiseAnd %v4uint %9600 %1539\n      %24647 = OpShiftLeftLogical %v4uint %7908 %179\n      %22610 = OpShiftRightLogical %v4uint %10663 %791\n      %21478 = OpBitwiseAnd %v4uint %22610 %2327\n      %15532 = OpBitwiseOr %v4uint %24647 %21478\n      %20095 = OpBitwiseAnd %v2uint %22862 %2686\n      %22935 = OpShiftLeftLogical %v2uint %20095 %2038\n      %17891 = OpBitwiseAnd %v2uint %22862 %2884\n      %12396 = OpBitwiseOr %v2uint %22935 %17891\n      %15605 = OpVectorShuffle %v2uint %15532 %15532 0 2\n      %20933 = OpBitwiseOr %v2uint %15605 %12396\n      %19024 = OpCompositeExtract %uint %20933 0\n       %7209 = OpCompositeExtract %uint %20933 1\n      %23049 = OpVectorShuffle %v2uint %15532 %15532 1 3\n      %23934 = OpBitwiseOr %v2uint %23049 %1578\n      %19043 = OpCompositeExtract %uint %23934 0\n      %23865 = OpCompositeExtract %uint %23934 1\n      %16161 = OpCompositeConstruct %v4uint %19024 %19043 %7209 %23865\n       %7717 = OpVectorShuffle %v2uint %17668 %17668 2 3\n       %9659 = OpVectorShuffle %v4uint %17668 %200 2 2 3 3\n       %9601 = OpShiftRightLogical %v4uint %9659 %515\n       %7909 = OpBitwiseAnd %v4uint %9601 %1539\n      %24648 = OpShiftLeftLogical %v4uint %7909 %179\n      %22611 = OpShiftRightLogical %v4uint %9659 %791\n      %21479 = OpBitwiseAnd %v4uint %22611 %2327\n      %15533 = OpBitwiseOr %v4uint %24648 %21479\n      %20096 = OpBitwiseAnd %v2uint %7717 %2686\n      %22936 = OpShiftLeftLogical %v2uint %20096 %2038\n      %17892 = OpBitwiseAnd %v2uint %7717 %2884\n      %12397 = OpBitwiseOr %v2uint %22936 %17892\n      %15606 = OpVectorShuffle %v2uint %15533 %15533 0 2\n      %20934 = OpBitwiseOr %v2uint %15606 %12397\n      %19025 = OpCompositeExtract %uint %20934 0\n       %7210 = OpCompositeExtract %uint %20934 1\n      %23050 = OpVectorShuffle %v2uint %15533 %15533 1 3\n      %23935 = OpBitwiseOr %v2uint %23050 %1578\n      %19044 = OpCompositeExtract %uint %23935 0\n       %6979 = OpCompositeExtract %uint %23935 1\n      %15071 = OpCompositeConstruct %v4uint %19025 %19044 %7210 %6979\n      %12529 = OpShiftRightLogical %uint %14582 %int_4\n      %13001 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %12529\n               OpStore %13001 %16161\n       %8268 = OpIAdd %uint %14582 %uint_16\n       %6653 = OpShiftRightLogical %uint %8268 %int_4\n      %21689 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %6653\n               OpStore %21689 %15071\n               OpSelectionMerge %24688 DontFlatten\n               OpBranchConditional %17270 %21993 %7205\n      %21993 = OpLabel\n               OpBranch %24688\n       %7205 = OpLabel\n               OpBranch %24688\n      %24688 = OpLabel\n      %11377 = OpPhi %uint %uint_32 %21993 %uint_16 %7205\n      %18622 = OpIAdd %uint %18621 %11377\n      %15699 = OpShiftRightLogical %uint %18622 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15699\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %14874 None\n               OpBranchConditional %22150 %10584 %14874\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %14874\n      %14874 = OpLabel\n      %10924 = OpPhi %v4uint %14608 %24688 %16377 %10584\n               OpSelectionMerge %11683 None\n               OpBranchConditional %15139 %11065 %11683\n      %11065 = OpLabel\n      %24088 = OpShiftLeftLogical %v4uint %10924 %749\n      %15336 = OpShiftRightLogical %v4uint %10924 %749\n      %10729 = OpBitwiseOr %v4uint %24088 %15336\n               OpBranch %11683\n      %11683 = OpLabel\n      %17669 = OpPhi %v4uint %10924 %14874 %10729 %11065\n      %22863 = OpVectorShuffle %v2uint %17669 %17669 0 1\n      %10664 = OpVectorShuffle %v4uint %17669 %200 0 0 1 1\n       %9602 = OpShiftRightLogical %v4uint %10664 %515\n       %7910 = OpBitwiseAnd %v4uint %9602 %1539\n      %24649 = OpShiftLeftLogical %v4uint %7910 %179\n      %22612 = OpShiftRightLogical %v4uint %10664 %791\n      %21480 = OpBitwiseAnd %v4uint %22612 %2327\n      %15534 = OpBitwiseOr %v4uint %24649 %21480\n      %20097 = OpBitwiseAnd %v2uint %22863 %2686\n      %22937 = OpShiftLeftLogical %v2uint %20097 %2038\n      %17893 = OpBitwiseAnd %v2uint %22863 %2884\n      %12398 = OpBitwiseOr %v2uint %22937 %17893\n      %15607 = OpVectorShuffle %v2uint %15534 %15534 0 2\n      %20935 = OpBitwiseOr %v2uint %15607 %12398\n      %19026 = OpCompositeExtract %uint %20935 0\n       %7211 = OpCompositeExtract %uint %20935 1\n      %23051 = OpVectorShuffle %v2uint %15534 %15534 1 3\n      %23936 = OpBitwiseOr %v2uint %23051 %1578\n      %19045 = OpCompositeExtract %uint %23936 0\n      %23866 = OpCompositeExtract %uint %23936 1\n      %16162 = OpCompositeConstruct %v4uint %19026 %19045 %7211 %23866\n       %7718 = OpVectorShuffle %v2uint %17669 %17669 2 3\n       %9660 = OpVectorShuffle %v4uint %17669 %200 2 2 3 3\n       %9603 = OpShiftRightLogical %v4uint %9660 %515\n       %7911 = OpBitwiseAnd %v4uint %9603 %1539\n      %24650 = OpShiftLeftLogical %v4uint %7911 %179\n      %22613 = OpShiftRightLogical %v4uint %9660 %791\n      %21481 = OpBitwiseAnd %v4uint %22613 %2327\n      %15535 = OpBitwiseOr %v4uint %24650 %21481\n      %20098 = OpBitwiseAnd %v2uint %7718 %2686\n      %22938 = OpShiftLeftLogical %v2uint %20098 %2038\n      %17894 = OpBitwiseAnd %v2uint %7718 %2884\n      %12399 = OpBitwiseOr %v2uint %22938 %17894\n      %15608 = OpVectorShuffle %v2uint %15535 %15535 0 2\n      %20936 = OpBitwiseOr %v2uint %15608 %12399\n      %19027 = OpCompositeExtract %uint %20936 0\n       %7212 = OpCompositeExtract %uint %20936 1\n      %23052 = OpVectorShuffle %v2uint %15535 %15535 1 3\n      %23937 = OpBitwiseOr %v2uint %23052 %1578\n      %19046 = OpCompositeExtract %uint %23937 0\n      %24796 = OpCompositeExtract %uint %23937 1\n       %9869 = OpCompositeConstruct %v4uint %19027 %19046 %7212 %24796\n      %16090 = OpIAdd %uint %14582 %uint_32\n       %8256 = OpShiftRightLogical %uint %16090 %int_4\n      %19428 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %8256\n               OpStore %19428 %16162\n       %8269 = OpIAdd %uint %14582 %uint_48\n       %6654 = OpShiftRightLogical %uint %8269 %int_4\n      %21727 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %6654\n               OpStore %21727 %9869\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_r10g11b11_rgba16_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006243, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000017,\n    0x0000000B, 0x00000004, 0x00040015, 0x0000000C, 0x00000020, 0x00000001,\n    0x00040017, 0x00000012, 0x0000000C, 0x00000002, 0x00040017, 0x00000016,\n    0x0000000C, 0x00000003, 0x00020014, 0x00000009, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000,\n    0x0004002B, 0x0000000B, 0x00000A49, 0x00000015, 0x0007002C, 0x00000017,\n    0x00000203, 0x00000A0A, 0x00000A49, 0x00000A0A, 0x00000A49, 0x0004002B,\n    0x0000000B, 0x00000A44, 0x000003FF, 0x0004002B, 0x0000000B, 0x00000A81,\n    0x000007FF, 0x0007002C, 0x00000017, 0x00000603, 0x00000A44, 0x00000A81,\n    0x00000A44, 0x00000A81, 0x0004002B, 0x0000000B, 0x00000A1C, 0x00000006,\n    0x0004002B, 0x0000000B, 0x00000A19, 0x00000005, 0x0007002C, 0x00000017,\n    0x000000B3, 0x00000A1C, 0x00000A19, 0x00000A1C, 0x00000A19, 0x0004002B,\n    0x0000000B, 0x00000A16, 0x00000004, 0x0004002B, 0x0000000B, 0x00000A5B,\n    0x0000001B, 0x0007002C, 0x00000017, 0x00000317, 0x00000A16, 0x00000A5B,\n    0x00000A16, 0x00000A5B, 0x0004002B, 0x0000000B, 0x00000AC7, 0x0000003F,\n    0x0004002B, 0x0000000B, 0x00000A67, 0x0000001F, 0x0007002C, 0x00000017,\n    0x00000917, 0x00000AC7, 0x00000A67, 0x00000AC7, 0x00000A67, 0x0004002B,\n    0x0000000B, 0x000003CF, 0x001FFC00, 0x0004002B, 0x0000000B, 0x00000A2B,\n    0x0000000B, 0x0004002B, 0x0000000B, 0x0000008F, 0x001F0000, 0x0004002B,\n    0x0000000B, 0x00000A10, 0x00000002, 0x0004002B, 0x0000000B, 0x0000068D,\n    0xFFFF0000, 0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001, 0x0004002B,\n    0x0000000B, 0x00000A13, 0x00000003, 0x0004002B, 0x0000000B, 0x000008A6,\n    0x00FF00FF, 0x0004002B, 0x0000000B, 0x00000A22, 0x00000008, 0x0004002B,\n    0x0000000B, 0x000005FD, 0xFF00FF00, 0x0004002B, 0x0000000B, 0x00000A3A,\n    0x00000010, 0x0004002B, 0x0000000C, 0x00000A17, 0x00000004, 0x0004002B,\n    0x0000000C, 0x00000A1D, 0x00000006, 0x0004002B, 0x0000000C, 0x00000A2C,\n    0x0000000B, 0x0004002B, 0x0000000C, 0x00000A38, 0x0000000F, 0x0004002B,\n    0x0000000C, 0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C, 0x00000A1A,\n    0x00000005, 0x0004002B, 0x0000000C, 0x00000A20, 0x00000007, 0x0004002B,\n    0x0000000C, 0x00000A23, 0x00000008, 0x0004002B, 0x0000000C, 0x00000A2F,\n    0x0000000C, 0x0004002B, 0x0000000C, 0x00000A14, 0x00000003, 0x0004002B,\n    0x0000000C, 0x00000A11, 0x00000002, 0x0004002B, 0x0000000C, 0x00000A0B,\n    0x00000000, 0x000A001E, 0x00000489, 0x0000000B, 0x0000000B, 0x0000000B,\n    0x0000000B, 0x00000014, 0x0000000B, 0x0000000B, 0x0000000B, 0x00040020,\n    0x00000706, 0x00000009, 0x00000489, 0x0004003B, 0x00000706, 0x00000CE9,\n    0x00000009, 0x00040020, 0x00000288, 0x00000009, 0x0000000B, 0x00040020,\n    0x00000291, 0x00000009, 0x00000014, 0x00040020, 0x00000292, 0x00000001,\n    0x00000014, 0x0004003B, 0x00000292, 0x00000F48, 0x00000001, 0x0006002C,\n    0x00000014, 0x00000A2D, 0x00000A13, 0x00000A0A, 0x00000A0A, 0x00040017,\n    0x0000000F, 0x00000009, 0x00000002, 0x0003001D, 0x000007DC, 0x00000017,\n    0x0003001E, 0x000007B4, 0x000007DC, 0x00040020, 0x00000A31, 0x00000002,\n    0x000007B4, 0x0004003B, 0x00000A31, 0x0000107A, 0x00000002, 0x00040020,\n    0x00000294, 0x00000002, 0x00000017, 0x0003001D, 0x000007DD, 0x00000017,\n    0x0003001E, 0x000007B5, 0x000007DD, 0x00040020, 0x00000A32, 0x00000002,\n    0x000007B5, 0x0004003B, 0x00000A32, 0x0000140E, 0x00000002, 0x0004002B,\n    0x0000000B, 0x00000A6A, 0x00000020, 0x0004002B, 0x0000000B, 0x00000A9A,\n    0x00000030, 0x0006002C, 0x00000014, 0x00000BC3, 0x00000A16, 0x00000A6A,\n    0x00000A0D, 0x0007002C, 0x00000017, 0x000009CE, 0x000008A6, 0x000008A6,\n    0x000008A6, 0x000008A6, 0x0007002C, 0x00000017, 0x0000013D, 0x00000A22,\n    0x00000A22, 0x00000A22, 0x00000A22, 0x0007002C, 0x00000017, 0x0000072E,\n    0x000005FD, 0x000005FD, 0x000005FD, 0x000005FD, 0x0007002C, 0x00000017,\n    0x000002ED, 0x00000A3A, 0x00000A3A, 0x00000A3A, 0x00000A3A, 0x0005002C,\n    0x00000011, 0x00000A7E, 0x000003CF, 0x000003CF, 0x0005002C, 0x00000011,\n    0x000007F6, 0x00000A2B, 0x00000A2B, 0x0005002C, 0x00000011, 0x00000B44,\n    0x0000008F, 0x0000008F, 0x0005002C, 0x00000011, 0x0000062A, 0x0000068D,\n    0x0000068D, 0x0003002E, 0x00000011, 0x000000C8, 0x00050036, 0x00000008,\n    0x0000161F, 0x00000000, 0x00000502, 0x000200F8, 0x00003B06, 0x000300F7,\n    0x00004C7A, 0x00000000, 0x000300FB, 0x00000A0A, 0x00002E68, 0x000200F8,\n    0x00002E68, 0x00050041, 0x00000288, 0x000060D7, 0x00000CE9, 0x00000A0B,\n    0x0004003D, 0x0000000B, 0x00003526, 0x000060D7, 0x000500C7, 0x0000000B,\n    0x00005FDC, 0x00003526, 0x00000A0D, 0x000500AB, 0x00000009, 0x00004376,\n    0x00005FDC, 0x00000A0A, 0x000500C7, 0x0000000B, 0x00003028, 0x00003526,\n    0x00000A10, 0x000500AB, 0x00000009, 0x00004384, 0x00003028, 0x00000A0A,\n    0x000500C2, 0x0000000B, 0x00001EB0, 0x00003526, 0x00000A10, 0x000500C7,\n    0x0000000B, 0x000061E2, 0x00001EB0, 0x00000A13, 0x00050041, 0x00000288,\n    0x0000492C, 0x00000CE9, 0x00000A0E, 0x0004003D, 0x0000000B, 0x00005EAC,\n    0x0000492C, 0x00050041, 0x00000288, 0x00004EBA, 0x00000CE9, 0x00000A11,\n    0x0004003D, 0x0000000B, 0x00005788, 0x00004EBA, 0x00050041, 0x00000288,\n    0x00004EBB, 0x00000CE9, 0x00000A14, 0x0004003D, 0x0000000B, 0x00005789,\n    0x00004EBB, 0x00050041, 0x00000291, 0x00004EBC, 0x00000CE9, 0x00000A17,\n    0x0004003D, 0x00000014, 0x0000578A, 0x00004EBC, 0x00050041, 0x00000288,\n    0x00004EBD, 0x00000CE9, 0x00000A1A, 0x0004003D, 0x0000000B, 0x0000578B,\n    0x00004EBD, 0x00050041, 0x00000288, 0x00004E6E, 0x00000CE9, 0x00000A1D,\n    0x0004003D, 0x0000000B, 0x000019C2, 0x00004E6E, 0x0004003D, 0x00000014,\n    0x00002A0E, 0x00000F48, 0x000500C4, 0x00000014, 0x0000538B, 0x00002A0E,\n    0x00000A2D, 0x0007004F, 0x00000011, 0x000042F0, 0x0000538B, 0x0000538B,\n    0x00000000, 0x00000001, 0x0007004F, 0x00000011, 0x0000242F, 0x0000578A,\n    0x0000578A, 0x00000000, 0x00000001, 0x000500AE, 0x0000000F, 0x00004288,\n    0x000042F0, 0x0000242F, 0x0004009A, 0x00000009, 0x00006067, 0x00004288,\n    0x000300F7, 0x000019BA, 0x00000002, 0x000400FA, 0x00006067, 0x000055E8,\n    0x000019BA, 0x000200F8, 0x000055E8, 0x000200F9, 0x00004C7A, 0x000200F8,\n    0x000019BA, 0x0004007C, 0x00000016, 0x00005BB6, 0x0000538B, 0x00050051,\n    0x0000000B, 0x00004916, 0x0000578A, 0x00000001, 0x00050051, 0x0000000C,\n    0x00005BEB, 0x00005BB6, 0x00000000, 0x00050084, 0x0000000C, 0x0000591A,\n    0x00005BEB, 0x00000A23, 0x00050051, 0x0000000C, 0x000018DA, 0x00005BB6,\n    0x00000002, 0x0004007C, 0x0000000C, 0x000038A9, 0x00004916, 0x00050084,\n    0x0000000C, 0x00002C0F, 0x000018DA, 0x000038A9, 0x00050051, 0x0000000C,\n    0x000044BE, 0x00005BB6, 0x00000001, 0x00050080, 0x0000000C, 0x000056D4,\n    0x00002C0F, 0x000044BE, 0x0004007C, 0x0000000C, 0x00005785, 0x000019C2,\n    0x00050084, 0x0000000C, 0x00005FD7, 0x000056D4, 0x00005785, 0x00050080,\n    0x0000000C, 0x00002042, 0x0000591A, 0x00005FD7, 0x0004007C, 0x0000000B,\n    0x000028A4, 0x00002042, 0x00050080, 0x0000000B, 0x000038F6, 0x0000578B,\n    0x000028A4, 0x000400A8, 0x00000009, 0x00003014, 0x00004376, 0x000300F7,\n    0x00004A60, 0x00000002, 0x000400FA, 0x00003014, 0x0000260D, 0x0000426F,\n    0x000200F8, 0x0000260D, 0x00050051, 0x0000000B, 0x00004437, 0x0000538B,\n    0x00000000, 0x00050051, 0x0000000B, 0x00002BEE, 0x0000538B, 0x00000001,\n    0x00050051, 0x0000000B, 0x00004971, 0x0000538B, 0x00000002, 0x00050084,\n    0x0000000B, 0x000039EF, 0x00005789, 0x00004971, 0x00050080, 0x0000000B,\n    0x00004F62, 0x00002BEE, 0x000039EF, 0x00050084, 0x0000000B, 0x000054AC,\n    0x00005788, 0x00004F62, 0x00050080, 0x0000000B, 0x00004FAE, 0x00004437,\n    0x000054AC, 0x000500C4, 0x0000000B, 0x00002C67, 0x00004FAE, 0x00000A10,\n    0x000200F9, 0x00004A60, 0x000200F8, 0x0000426F, 0x000300F7, 0x00005BF0,\n    0x00000002, 0x000400FA, 0x00004384, 0x00002C92, 0x00005F21, 0x000200F8,\n    0x00002C92, 0x000500C2, 0x0000000B, 0x00005374, 0x00005788, 0x00000A1A,\n    0x000500C2, 0x0000000B, 0x000035EC, 0x00005789, 0x00000A17, 0x000500C3,\n    0x0000000C, 0x000033B5, 0x000018DA, 0x00000A11, 0x0004007C, 0x0000000C,\n    0x00005766, 0x000035EC, 0x00050084, 0x0000000C, 0x000061FD, 0x000033B5,\n    0x00005766, 0x000500C3, 0x0000000C, 0x00002D62, 0x000044BE, 0x00000A17,\n    0x00050080, 0x0000000C, 0x0000411E, 0x000061FD, 0x00002D62, 0x0004007C,\n    0x0000000C, 0x00004A78, 0x00005374, 0x00050084, 0x0000000C, 0x000032DC,\n    0x0000411E, 0x00004A78, 0x000500C3, 0x0000000C, 0x000032BA, 0x00005BEB,\n    0x00000A1A, 0x00050080, 0x0000000C, 0x00005FEE, 0x000032DC, 0x000032BA,\n    0x000500C4, 0x0000000C, 0x0000225D, 0x00005FEE, 0x00000A20, 0x000500C7,\n    0x0000000C, 0x00002CAA, 0x000018DA, 0x00000A14, 0x000500C4, 0x0000000C,\n    0x00004CAE, 0x00002CAA, 0x00000A1A, 0x000500C3, 0x0000000C, 0x0000383E,\n    0x000044BE, 0x00000A0E, 0x000500C7, 0x0000000C, 0x00005375, 0x0000383E,\n    0x00000A14, 0x000500C4, 0x0000000C, 0x000054CA, 0x00005375, 0x00000A14,\n    0x000500C5, 0x0000000C, 0x000042CE, 0x00004CAE, 0x000054CA, 0x000500C7,\n    0x0000000C, 0x000050D5, 0x00005BEB, 0x00000A20, 0x000500C5, 0x0000000C,\n    0x00003ADD, 0x000042CE, 0x000050D5, 0x000500C5, 0x0000000C, 0x000043B6,\n    0x0000225D, 0x00003ADD, 0x000500C4, 0x0000000C, 0x00005E50, 0x000043B6,\n    0x00000A10, 0x000500C3, 0x0000000C, 0x000032D7, 0x000044BE, 0x00000A14,\n    0x000500C6, 0x0000000C, 0x000026C9, 0x000032D7, 0x000033B5, 0x000500C7,\n    0x0000000C, 0x00004199, 0x000026C9, 0x00000A0E, 0x000500C3, 0x0000000C,\n    0x00002590, 0x00005BEB, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000505E,\n    0x00002590, 0x00000A14, 0x000500C4, 0x0000000C, 0x0000541D, 0x00004199,\n    0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BA, 0x0000505E, 0x0000541D,\n    0x000500C7, 0x0000000C, 0x00005076, 0x000044BE, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x00005228, 0x00005076, 0x00000A17, 0x000500C4, 0x0000000C,\n    0x00001997, 0x000022BA, 0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FE,\n    0x00005228, 0x00001997, 0x000500C4, 0x0000000C, 0x00001C00, 0x00004199,\n    0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C81, 0x000047FE, 0x00001C00,\n    0x000500C7, 0x0000000C, 0x000050AF, 0x00005E50, 0x00000A38, 0x000500C5,\n    0x0000000C, 0x00003C70, 0x00003C81, 0x000050AF, 0x000500C3, 0x0000000C,\n    0x00003745, 0x00005E50, 0x00000A17, 0x000500C7, 0x0000000C, 0x000018B8,\n    0x00003745, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000547E, 0x000018B8,\n    0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A8, 0x00003C70, 0x0000547E,\n    0x000500C3, 0x0000000C, 0x00003A6E, 0x00005E50, 0x00000A1A, 0x000500C7,\n    0x0000000C, 0x000018B9, 0x00003A6E, 0x00000A20, 0x000500C4, 0x0000000C,\n    0x0000547F, 0x000018B9, 0x00000A23, 0x000500C5, 0x0000000C, 0x0000456F,\n    0x000045A8, 0x0000547F, 0x000500C3, 0x0000000C, 0x00003C88, 0x00005E50,\n    0x00000A23, 0x000500C4, 0x0000000C, 0x00002824, 0x00003C88, 0x00000A2F,\n    0x000500C5, 0x0000000C, 0x00003B79, 0x0000456F, 0x00002824, 0x0004007C,\n    0x0000000B, 0x000041E5, 0x00003B79, 0x000200F9, 0x00005BF0, 0x000200F8,\n    0x00005F21, 0x0004007C, 0x00000012, 0x000059D8, 0x000042F0, 0x000500C2,\n    0x0000000B, 0x00005668, 0x00005788, 0x00000A1A, 0x00050051, 0x0000000C,\n    0x00003905, 0x000059D8, 0x00000001, 0x000500C3, 0x0000000C, 0x00002F39,\n    0x00003905, 0x00000A1A, 0x0004007C, 0x0000000C, 0x00005780, 0x00005668,\n    0x00050084, 0x0000000C, 0x00001F02, 0x00002F39, 0x00005780, 0x00050051,\n    0x0000000C, 0x00006242, 0x000059D8, 0x00000000, 0x000500C3, 0x0000000C,\n    0x00004FC7, 0x00006242, 0x00000A1A, 0x00050080, 0x0000000C, 0x000049B0,\n    0x00001F02, 0x00004FC7, 0x000500C4, 0x0000000C, 0x0000254A, 0x000049B0,\n    0x00000A1D, 0x000500C3, 0x0000000C, 0x0000603B, 0x00003905, 0x00000A0E,\n    0x000500C7, 0x0000000C, 0x0000539A, 0x0000603B, 0x00000A20, 0x000500C4,\n    0x0000000C, 0x0000534A, 0x0000539A, 0x00000A14, 0x000500C7, 0x0000000C,\n    0x00004EA5, 0x00006242, 0x00000A20, 0x000500C5, 0x0000000C, 0x00002B1A,\n    0x0000534A, 0x00004EA5, 0x000500C5, 0x0000000C, 0x000043B7, 0x0000254A,\n    0x00002B1A, 0x000500C4, 0x0000000C, 0x00005E63, 0x000043B7, 0x00000A10,\n    0x000500C3, 0x0000000C, 0x000031DE, 0x00003905, 0x00000A17, 0x000500C7,\n    0x0000000C, 0x00005447, 0x000031DE, 0x00000A0E, 0x000500C3, 0x0000000C,\n    0x000028A6, 0x00006242, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000511E,\n    0x000028A6, 0x00000A14, 0x000500C3, 0x0000000C, 0x000028B9, 0x00003905,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x0000505F, 0x000028B9, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x0000541E, 0x0000505F, 0x00000A0E, 0x000500C6,\n    0x0000000C, 0x000022BB, 0x0000511E, 0x0000541E, 0x000500C7, 0x0000000C,\n    0x00005077, 0x00003905, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005229,\n    0x00005077, 0x00000A17, 0x000500C4, 0x0000000C, 0x00001998, 0x000022BB,\n    0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FF, 0x00005229, 0x00001998,\n    0x000500C4, 0x0000000C, 0x00001C01, 0x00005447, 0x00000A2C, 0x000500C5,\n    0x0000000C, 0x00003C82, 0x000047FF, 0x00001C01, 0x000500C7, 0x0000000C,\n    0x000050B0, 0x00005E63, 0x00000A38, 0x000500C5, 0x0000000C, 0x00003C71,\n    0x00003C82, 0x000050B0, 0x000500C3, 0x0000000C, 0x00003746, 0x00005E63,\n    0x00000A17, 0x000500C7, 0x0000000C, 0x000018BA, 0x00003746, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x00005480, 0x000018BA, 0x00000A1A, 0x000500C5,\n    0x0000000C, 0x000045A9, 0x00003C71, 0x00005480, 0x000500C3, 0x0000000C,\n    0x00003A6F, 0x00005E63, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018BB,\n    0x00003A6F, 0x00000A20, 0x000500C4, 0x0000000C, 0x00005481, 0x000018BB,\n    0x00000A23, 0x000500C5, 0x0000000C, 0x00004570, 0x000045A9, 0x00005481,\n    0x000500C3, 0x0000000C, 0x00003C89, 0x00005E63, 0x00000A23, 0x000500C4,\n    0x0000000C, 0x00002825, 0x00003C89, 0x00000A2F, 0x000500C5, 0x0000000C,\n    0x00003B7A, 0x00004570, 0x00002825, 0x0004007C, 0x0000000B, 0x000041E6,\n    0x00003B7A, 0x000200F9, 0x00005BF0, 0x000200F8, 0x00005BF0, 0x000700F5,\n    0x0000000B, 0x0000292C, 0x000041E5, 0x00002C92, 0x000041E6, 0x00005F21,\n    0x000200F9, 0x00004A60, 0x000200F8, 0x00004A60, 0x000700F5, 0x0000000B,\n    0x00002C70, 0x00002C67, 0x0000260D, 0x0000292C, 0x00005BF0, 0x00050080,\n    0x0000000B, 0x000048BD, 0x00002C70, 0x00005EAC, 0x000500C2, 0x0000000B,\n    0x00003D52, 0x000048BD, 0x00000A17, 0x00060041, 0x00000294, 0x00004FAF,\n    0x0000107A, 0x00000A0B, 0x00003D52, 0x0004003D, 0x00000017, 0x00001CAA,\n    0x00004FAF, 0x000500AA, 0x00000009, 0x000035C0, 0x000061E2, 0x00000A0D,\n    0x000500AA, 0x00000009, 0x00005376, 0x000061E2, 0x00000A10, 0x000500A6,\n    0x00000009, 0x00005686, 0x000035C0, 0x00005376, 0x000300F7, 0x00003463,\n    0x00000000, 0x000400FA, 0x00005686, 0x00002957, 0x00003463, 0x000200F8,\n    0x00002957, 0x000500C7, 0x00000017, 0x0000475F, 0x00001CAA, 0x000009CE,\n    0x000500C4, 0x00000017, 0x000024D1, 0x0000475F, 0x0000013D, 0x000500C7,\n    0x00000017, 0x000050AC, 0x00001CAA, 0x0000072E, 0x000500C2, 0x00000017,\n    0x0000448D, 0x000050AC, 0x0000013D, 0x000500C5, 0x00000017, 0x00003FF8,\n    0x000024D1, 0x0000448D, 0x000200F9, 0x00003463, 0x000200F8, 0x00003463,\n    0x000700F5, 0x00000017, 0x00005879, 0x00001CAA, 0x00004A60, 0x00003FF8,\n    0x00002957, 0x000500AA, 0x00000009, 0x00004CB6, 0x000061E2, 0x00000A13,\n    0x000500A6, 0x00000009, 0x00003B23, 0x00005376, 0x00004CB6, 0x000300F7,\n    0x00002DA2, 0x00000000, 0x000400FA, 0x00003B23, 0x00002B38, 0x00002DA2,\n    0x000200F8, 0x00002B38, 0x000500C4, 0x00000017, 0x00005E17, 0x00005879,\n    0x000002ED, 0x000500C2, 0x00000017, 0x00003BE7, 0x00005879, 0x000002ED,\n    0x000500C5, 0x00000017, 0x000029E8, 0x00005E17, 0x00003BE7, 0x000200F9,\n    0x00002DA2, 0x000200F8, 0x00002DA2, 0x000700F5, 0x00000017, 0x00004504,\n    0x00005879, 0x00003463, 0x000029E8, 0x00002B38, 0x0007004F, 0x00000011,\n    0x0000594E, 0x00004504, 0x00004504, 0x00000000, 0x00000001, 0x0009004F,\n    0x00000017, 0x000029A7, 0x00004504, 0x000000C8, 0x00000000, 0x00000000,\n    0x00000001, 0x00000001, 0x000500C2, 0x00000017, 0x00002580, 0x000029A7,\n    0x00000203, 0x000500C7, 0x00000017, 0x00001EE4, 0x00002580, 0x00000603,\n    0x000500C4, 0x00000017, 0x00006047, 0x00001EE4, 0x000000B3, 0x000500C2,\n    0x00000017, 0x00005852, 0x000029A7, 0x00000317, 0x000500C7, 0x00000017,\n    0x000053E6, 0x00005852, 0x00000917, 0x000500C5, 0x00000017, 0x00003CAC,\n    0x00006047, 0x000053E6, 0x000500C7, 0x00000011, 0x00004E7F, 0x0000594E,\n    0x00000A7E, 0x000500C4, 0x00000011, 0x00005997, 0x00004E7F, 0x000007F6,\n    0x000500C7, 0x00000011, 0x000045E3, 0x0000594E, 0x00000B44, 0x000500C5,\n    0x00000011, 0x0000306C, 0x00005997, 0x000045E3, 0x0007004F, 0x00000011,\n    0x00003CF5, 0x00003CAC, 0x00003CAC, 0x00000000, 0x00000002, 0x000500C5,\n    0x00000011, 0x000051C5, 0x00003CF5, 0x0000306C, 0x00050051, 0x0000000B,\n    0x00004A50, 0x000051C5, 0x00000000, 0x00050051, 0x0000000B, 0x00001C29,\n    0x000051C5, 0x00000001, 0x0007004F, 0x00000011, 0x00005A09, 0x00003CAC,\n    0x00003CAC, 0x00000001, 0x00000003, 0x000500C5, 0x00000011, 0x00005D7E,\n    0x00005A09, 0x0000062A, 0x00050051, 0x0000000B, 0x00004A63, 0x00005D7E,\n    0x00000000, 0x00050051, 0x0000000B, 0x00005D39, 0x00005D7E, 0x00000001,\n    0x00070050, 0x00000017, 0x00003F21, 0x00004A50, 0x00004A63, 0x00001C29,\n    0x00005D39, 0x0007004F, 0x00000011, 0x00001E25, 0x00004504, 0x00004504,\n    0x00000002, 0x00000003, 0x0009004F, 0x00000017, 0x000025BB, 0x00004504,\n    0x000000C8, 0x00000002, 0x00000002, 0x00000003, 0x00000003, 0x000500C2,\n    0x00000017, 0x00002581, 0x000025BB, 0x00000203, 0x000500C7, 0x00000017,\n    0x00001EE5, 0x00002581, 0x00000603, 0x000500C4, 0x00000017, 0x00006048,\n    0x00001EE5, 0x000000B3, 0x000500C2, 0x00000017, 0x00005853, 0x000025BB,\n    0x00000317, 0x000500C7, 0x00000017, 0x000053E7, 0x00005853, 0x00000917,\n    0x000500C5, 0x00000017, 0x00003CAD, 0x00006048, 0x000053E7, 0x000500C7,\n    0x00000011, 0x00004E80, 0x00001E25, 0x00000A7E, 0x000500C4, 0x00000011,\n    0x00005998, 0x00004E80, 0x000007F6, 0x000500C7, 0x00000011, 0x000045E4,\n    0x00001E25, 0x00000B44, 0x000500C5, 0x00000011, 0x0000306D, 0x00005998,\n    0x000045E4, 0x0007004F, 0x00000011, 0x00003CF6, 0x00003CAD, 0x00003CAD,\n    0x00000000, 0x00000002, 0x000500C5, 0x00000011, 0x000051C6, 0x00003CF6,\n    0x0000306D, 0x00050051, 0x0000000B, 0x00004A51, 0x000051C6, 0x00000000,\n    0x00050051, 0x0000000B, 0x00001C2A, 0x000051C6, 0x00000001, 0x0007004F,\n    0x00000011, 0x00005A0A, 0x00003CAD, 0x00003CAD, 0x00000001, 0x00000003,\n    0x000500C5, 0x00000011, 0x00005D7F, 0x00005A0A, 0x0000062A, 0x00050051,\n    0x0000000B, 0x00004A64, 0x00005D7F, 0x00000000, 0x00050051, 0x0000000B,\n    0x00001B43, 0x00005D7F, 0x00000001, 0x00070050, 0x00000017, 0x00003ADF,\n    0x00004A51, 0x00004A64, 0x00001C2A, 0x00001B43, 0x000500C2, 0x0000000B,\n    0x000030F1, 0x000038F6, 0x00000A17, 0x00060041, 0x00000294, 0x000032C9,\n    0x0000140E, 0x00000A0B, 0x000030F1, 0x0003003E, 0x000032C9, 0x00003F21,\n    0x00050080, 0x0000000B, 0x0000204C, 0x000038F6, 0x00000A3A, 0x000500C2,\n    0x0000000B, 0x000019FD, 0x0000204C, 0x00000A17, 0x00060041, 0x00000294,\n    0x000054B9, 0x0000140E, 0x00000A0B, 0x000019FD, 0x0003003E, 0x000054B9,\n    0x00003ADF, 0x000300F7, 0x00006070, 0x00000002, 0x000400FA, 0x00004376,\n    0x000055E9, 0x00001C25, 0x000200F8, 0x000055E9, 0x000200F9, 0x00006070,\n    0x000200F8, 0x00001C25, 0x000200F9, 0x00006070, 0x000200F8, 0x00006070,\n    0x000700F5, 0x0000000B, 0x00002C71, 0x00000A6A, 0x000055E9, 0x00000A3A,\n    0x00001C25, 0x00050080, 0x0000000B, 0x000048BE, 0x000048BD, 0x00002C71,\n    0x000500C2, 0x0000000B, 0x00003D53, 0x000048BE, 0x00000A17, 0x00060041,\n    0x00000294, 0x00005566, 0x0000107A, 0x00000A0B, 0x00003D53, 0x0004003D,\n    0x00000017, 0x00003910, 0x00005566, 0x000300F7, 0x00003A1A, 0x00000000,\n    0x000400FA, 0x00005686, 0x00002958, 0x00003A1A, 0x000200F8, 0x00002958,\n    0x000500C7, 0x00000017, 0x00004760, 0x00003910, 0x000009CE, 0x000500C4,\n    0x00000017, 0x000024D2, 0x00004760, 0x0000013D, 0x000500C7, 0x00000017,\n    0x000050AD, 0x00003910, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448E,\n    0x000050AD, 0x0000013D, 0x000500C5, 0x00000017, 0x00003FF9, 0x000024D2,\n    0x0000448E, 0x000200F9, 0x00003A1A, 0x000200F8, 0x00003A1A, 0x000700F5,\n    0x00000017, 0x00002AAC, 0x00003910, 0x00006070, 0x00003FF9, 0x00002958,\n    0x000300F7, 0x00002DA3, 0x00000000, 0x000400FA, 0x00003B23, 0x00002B39,\n    0x00002DA3, 0x000200F8, 0x00002B39, 0x000500C4, 0x00000017, 0x00005E18,\n    0x00002AAC, 0x000002ED, 0x000500C2, 0x00000017, 0x00003BE8, 0x00002AAC,\n    0x000002ED, 0x000500C5, 0x00000017, 0x000029E9, 0x00005E18, 0x00003BE8,\n    0x000200F9, 0x00002DA3, 0x000200F8, 0x00002DA3, 0x000700F5, 0x00000017,\n    0x00004505, 0x00002AAC, 0x00003A1A, 0x000029E9, 0x00002B39, 0x0007004F,\n    0x00000011, 0x0000594F, 0x00004505, 0x00004505, 0x00000000, 0x00000001,\n    0x0009004F, 0x00000017, 0x000029A8, 0x00004505, 0x000000C8, 0x00000000,\n    0x00000000, 0x00000001, 0x00000001, 0x000500C2, 0x00000017, 0x00002582,\n    0x000029A8, 0x00000203, 0x000500C7, 0x00000017, 0x00001EE6, 0x00002582,\n    0x00000603, 0x000500C4, 0x00000017, 0x00006049, 0x00001EE6, 0x000000B3,\n    0x000500C2, 0x00000017, 0x00005854, 0x000029A8, 0x00000317, 0x000500C7,\n    0x00000017, 0x000053E8, 0x00005854, 0x00000917, 0x000500C5, 0x00000017,\n    0x00003CAE, 0x00006049, 0x000053E8, 0x000500C7, 0x00000011, 0x00004E81,\n    0x0000594F, 0x00000A7E, 0x000500C4, 0x00000011, 0x00005999, 0x00004E81,\n    0x000007F6, 0x000500C7, 0x00000011, 0x000045E5, 0x0000594F, 0x00000B44,\n    0x000500C5, 0x00000011, 0x0000306E, 0x00005999, 0x000045E5, 0x0007004F,\n    0x00000011, 0x00003CF7, 0x00003CAE, 0x00003CAE, 0x00000000, 0x00000002,\n    0x000500C5, 0x00000011, 0x000051C7, 0x00003CF7, 0x0000306E, 0x00050051,\n    0x0000000B, 0x00004A52, 0x000051C7, 0x00000000, 0x00050051, 0x0000000B,\n    0x00001C2B, 0x000051C7, 0x00000001, 0x0007004F, 0x00000011, 0x00005A0B,\n    0x00003CAE, 0x00003CAE, 0x00000001, 0x00000003, 0x000500C5, 0x00000011,\n    0x00005D80, 0x00005A0B, 0x0000062A, 0x00050051, 0x0000000B, 0x00004A65,\n    0x00005D80, 0x00000000, 0x00050051, 0x0000000B, 0x00005D3A, 0x00005D80,\n    0x00000001, 0x00070050, 0x00000017, 0x00003F22, 0x00004A52, 0x00004A65,\n    0x00001C2B, 0x00005D3A, 0x0007004F, 0x00000011, 0x00001E26, 0x00004505,\n    0x00004505, 0x00000002, 0x00000003, 0x0009004F, 0x00000017, 0x000025BC,\n    0x00004505, 0x000000C8, 0x00000002, 0x00000002, 0x00000003, 0x00000003,\n    0x000500C2, 0x00000017, 0x00002583, 0x000025BC, 0x00000203, 0x000500C7,\n    0x00000017, 0x00001EE7, 0x00002583, 0x00000603, 0x000500C4, 0x00000017,\n    0x0000604A, 0x00001EE7, 0x000000B3, 0x000500C2, 0x00000017, 0x00005855,\n    0x000025BC, 0x00000317, 0x000500C7, 0x00000017, 0x000053E9, 0x00005855,\n    0x00000917, 0x000500C5, 0x00000017, 0x00003CAF, 0x0000604A, 0x000053E9,\n    0x000500C7, 0x00000011, 0x00004E82, 0x00001E26, 0x00000A7E, 0x000500C4,\n    0x00000011, 0x0000599A, 0x00004E82, 0x000007F6, 0x000500C7, 0x00000011,\n    0x000045E6, 0x00001E26, 0x00000B44, 0x000500C5, 0x00000011, 0x0000306F,\n    0x0000599A, 0x000045E6, 0x0007004F, 0x00000011, 0x00003CF8, 0x00003CAF,\n    0x00003CAF, 0x00000000, 0x00000002, 0x000500C5, 0x00000011, 0x000051C8,\n    0x00003CF8, 0x0000306F, 0x00050051, 0x0000000B, 0x00004A53, 0x000051C8,\n    0x00000000, 0x00050051, 0x0000000B, 0x00001C2C, 0x000051C8, 0x00000001,\n    0x0007004F, 0x00000011, 0x00005A0C, 0x00003CAF, 0x00003CAF, 0x00000001,\n    0x00000003, 0x000500C5, 0x00000011, 0x00005D81, 0x00005A0C, 0x0000062A,\n    0x00050051, 0x0000000B, 0x00004A66, 0x00005D81, 0x00000000, 0x00050051,\n    0x0000000B, 0x000060DC, 0x00005D81, 0x00000001, 0x00070050, 0x00000017,\n    0x0000268D, 0x00004A53, 0x00004A66, 0x00001C2C, 0x000060DC, 0x00050080,\n    0x0000000B, 0x00003EDA, 0x000038F6, 0x00000A6A, 0x000500C2, 0x0000000B,\n    0x00002040, 0x00003EDA, 0x00000A17, 0x00060041, 0x00000294, 0x00004BE4,\n    0x0000140E, 0x00000A0B, 0x00002040, 0x0003003E, 0x00004BE4, 0x00003F22,\n    0x00050080, 0x0000000B, 0x0000204D, 0x000038F6, 0x00000A9A, 0x000500C2,\n    0x0000000B, 0x000019FE, 0x0000204D, 0x00000A17, 0x00060041, 0x00000294,\n    0x000054DF, 0x0000140E, 0x00000A0B, 0x000019FE, 0x0003003E, 0x000054DF,\n    0x0000268D, 0x000200F9, 0x00004C7A, 0x000200F8, 0x00004C7A, 0x000100FD,\n    0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_r10g11b11_rgba16_scaled_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25157\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n     %v4uint = OpTypeVector %uint 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v3uint = OpTypeVector %uint 3\n     %uint_0 = OpConstant %uint 0\n    %uint_21 = OpConstant %uint 21\n        %515 = OpConstantComposite %v4uint %uint_0 %uint_21 %uint_0 %uint_21\n  %uint_1023 = OpConstant %uint 1023\n  %uint_2047 = OpConstant %uint 2047\n       %1539 = OpConstantComposite %v4uint %uint_1023 %uint_2047 %uint_1023 %uint_2047\n     %uint_6 = OpConstant %uint 6\n     %uint_5 = OpConstant %uint 5\n        %179 = OpConstantComposite %v4uint %uint_6 %uint_5 %uint_6 %uint_5\n     %uint_4 = OpConstant %uint 4\n    %uint_27 = OpConstant %uint 27\n        %791 = OpConstantComposite %v4uint %uint_4 %uint_27 %uint_4 %uint_27\n    %uint_63 = OpConstant %uint 63\n    %uint_31 = OpConstant %uint 31\n       %2327 = OpConstantComposite %v4uint %uint_63 %uint_31 %uint_63 %uint_31\n%uint_2096128 = OpConstant %uint 2096128\n    %uint_11 = OpConstant %uint 11\n%uint_2031616 = OpConstant %uint 2031616\n     %uint_2 = OpConstant %uint 2\n%uint_4294901760 = OpConstant %uint 4294901760\n     %uint_1 = OpConstant %uint 1\n     %uint_3 = OpConstant %uint 3\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n    %uint_16 = OpConstant %uint 16\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n      %int_3 = OpConstant %int 3\n      %int_2 = OpConstant %int 2\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n     %uint_7 = OpConstant %uint 7\n       %1927 = OpConstantComposite %v2uint %uint_4 %uint_7\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %2605 = OpConstantComposite %v3uint %uint_3 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n    %uint_32 = OpConstant %uint 32\n    %uint_48 = OpConstant %uint 48\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %1954 = OpConstantComposite %v2uint %uint_7 %uint_7\n       %1855 = OpConstantComposite %v2uint %uint_4 %uint_1\n    %uint_15 = OpConstant %uint 15\n       %1955 = OpConstantComposite %v2uint %uint_15 %uint_1\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n       %2686 = OpConstantComposite %v2uint %uint_2096128 %uint_2096128\n       %2038 = OpConstantComposite %v2uint %uint_11 %uint_11\n       %2884 = OpConstantComposite %v2uint %uint_2031616 %uint_2031616\n       %1578 = OpConstantComposite %v2uint %uint_4294901760 %uint_4294901760\n        %200 = OpConstantNull %v2uint\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24445 = OpBitwiseAnd %uint %13606 %uint_2\n      %18667 = OpINotEqual %bool %24445 %uint_0\n       %8141 = OpShiftRightLogical %uint %13606 %uint_2\n      %24990 = OpBitwiseAnd %uint %8141 %uint_3\n       %8871 = OpCompositeConstruct %v2uint %13606 %13606\n       %7087 = OpShiftRightLogical %v2uint %8871 %1927\n       %6551 = OpBitwiseAnd %v2uint %7087 %1954\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2605\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %6586 DontFlatten\n               OpBranchConditional %24679 %21992 %6586\n      %21992 = OpLabel\n               OpBranch %19578\n       %6586 = OpLabel\n      %23478 = OpBitcast %v3int %21387\n      %18710 = OpCompositeExtract %uint %22410 1\n      %23531 = OpCompositeExtract %int %23478 0\n      %22810 = OpIMul %int %23531 %int_8\n       %6362 = OpCompositeExtract %int %23478 2\n      %14505 = OpBitcast %int %18710\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %23478 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %6594\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %22810 %24535\n      %10898 = OpBitcast %uint %8258\n       %7937 = OpIAdd %uint %22411 %10898\n      %19921 = OpShiftRightLogical %v2uint %17136 %1855\n       %7712 = OpUDiv %v2uint %19921 %6551\n      %18183 = OpIMul %v2uint %6551 %7712\n      %18273 = OpISub %v2uint %19921 %18183\n      %11232 = OpShiftLeftLogical %v2uint %7712 %1855\n      %13284 = OpCompositeExtract %uint %18273 0\n      %10872 = OpCompositeExtract %uint %6551 1\n      %22886 = OpIMul %uint %13284 %10872\n       %6943 = OpCompositeExtract %uint %18273 1\n      %10469 = OpIAdd %uint %22886 %6943\n      %18851 = OpBitwiseAnd %v2uint %17136 %1955\n      %10581 = OpShiftLeftLogical %uint %10469 %uint_7\n      %20916 = OpCompositeExtract %uint %18851 1\n      %23596 = OpShiftLeftLogical %uint %20916 %uint_6\n      %19814 = OpBitwiseOr %uint %10581 %23596\n      %21476 = OpCompositeExtract %uint %18851 0\n       %8560 = OpShiftLeftLogical %uint %21476 %uint_2\n      %17648 = OpBitwiseOr %uint %19814 %8560\n      %19923 = OpCompositeExtract %uint %11232 0\n      %15556 = OpCompositeInsert %v3uint %19923 %21387 0\n      %23006 = OpCompositeExtract %uint %11232 1\n       %9680 = OpCompositeInsert %v3uint %23006 %15556 1\n               OpSelectionMerge %20344 DontFlatten\n               OpBranchConditional %18667 %23520 %11737\n      %23520 = OpLabel\n      %10111 = OpBitcast %v3int %9680\n      %19476 = OpShiftRightLogical %uint %22408 %int_5\n      %18810 = OpShiftRightLogical %uint %22409 %int_4\n       %6782 = OpCompositeExtract %int %10111 2\n      %12089 = OpShiftRightArithmetic %int %6782 %int_2\n      %22400 = OpBitcast %int %18810\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %10111 1\n      %19055 = OpShiftRightArithmetic %int %25154 %int_4\n      %11052 = OpIAdd %int %7938 %19055\n      %16898 = OpBitcast %int %19476\n      %14944 = OpIMul %int %11052 %16898\n      %25155 = OpCompositeExtract %int %10111 0\n      %20423 = OpShiftRightArithmetic %int %25155 %int_5\n      %18940 = OpIAdd %int %14944 %20423\n       %8797 = OpShiftLeftLogical %int %18940 %int_7\n      %11434 = OpBitwiseAnd %int %6782 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %25154 %int_1\n      %21364 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21364 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %25155 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17334 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17334 %uint_2\n      %13015 = OpShiftRightArithmetic %int %25154 %int_3\n       %9929 = OpBitwiseXor %int %13015 %12089\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %25155 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %25154 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6552 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6552\n       %7168 = OpShiftLeftLogical %int %16793 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24144 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24144 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24144 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24144 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %20344\n      %11737 = OpLabel\n      %11908 = OpVectorShuffle %v2uint %9680 %9680 0 1\n      %20347 = OpBitcast %v2int %11908\n      %11433 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %20347 1\n      %12090 = OpShiftRightArithmetic %int %14597 %int_5\n      %22401 = OpBitcast %int %11433\n       %7939 = OpIMul %int %12090 %22401\n      %25156 = OpCompositeExtract %int %20347 0\n      %20424 = OpShiftRightArithmetic %int %25156 %int_5\n      %18864 = OpIAdd %int %7939 %20424\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25156 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17335 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17335 %uint_2\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25156 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6553 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6553\n       %7169 = OpShiftLeftLogical %int %21575 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24163 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24163 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24163 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %20344\n      %20344 = OpLabel\n      %18329 = OpPhi %uint %16869 %23520 %16870 %11737\n      %15200 = OpCompositeExtract %uint %6551 0\n      %17489 = OpIMul %uint %15200 %10872\n       %7313 = OpIMul %uint %18329 %17489\n       %8815 = OpIAdd %uint %7313 %17648\n      %21470 = OpIAdd %uint %8815 %24236\n      %14664 = OpShiftRightLogical %uint %21470 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %14664\n       %7338 = OpLoad %v4uint %20399\n      %13760 = OpIEqual %bool %24990 %uint_1\n      %21366 = OpIEqual %bool %24990 %uint_2\n      %22150 = OpLogicalOr %bool %13760 %21366\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %7338 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %7338 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22649 = OpPhi %v4uint %7338 %20344 %16376 %10583\n      %19638 = OpIEqual %bool %24990 %uint_3\n      %15139 = OpLogicalOr %bool %21366 %19638\n               OpSelectionMerge %11682 None\n               OpBranchConditional %15139 %11064 %11682\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22649 %749\n      %15335 = OpShiftRightLogical %v4uint %22649 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %11682\n      %11682 = OpLabel\n      %17668 = OpPhi %v4uint %22649 %13411 %10728 %11064\n      %22862 = OpVectorShuffle %v2uint %17668 %17668 0 1\n      %10663 = OpVectorShuffle %v4uint %17668 %200 0 0 1 1\n       %9600 = OpShiftRightLogical %v4uint %10663 %515\n       %7908 = OpBitwiseAnd %v4uint %9600 %1539\n      %24647 = OpShiftLeftLogical %v4uint %7908 %179\n      %22610 = OpShiftRightLogical %v4uint %10663 %791\n      %21478 = OpBitwiseAnd %v4uint %22610 %2327\n      %15532 = OpBitwiseOr %v4uint %24647 %21478\n      %20095 = OpBitwiseAnd %v2uint %22862 %2686\n      %22935 = OpShiftLeftLogical %v2uint %20095 %2038\n      %17891 = OpBitwiseAnd %v2uint %22862 %2884\n      %12396 = OpBitwiseOr %v2uint %22935 %17891\n      %15605 = OpVectorShuffle %v2uint %15532 %15532 0 2\n      %20933 = OpBitwiseOr %v2uint %15605 %12396\n      %19024 = OpCompositeExtract %uint %20933 0\n       %7209 = OpCompositeExtract %uint %20933 1\n      %23049 = OpVectorShuffle %v2uint %15532 %15532 1 3\n      %23934 = OpBitwiseOr %v2uint %23049 %1578\n      %19043 = OpCompositeExtract %uint %23934 0\n      %23865 = OpCompositeExtract %uint %23934 1\n      %16161 = OpCompositeConstruct %v4uint %19024 %19043 %7209 %23865\n       %7717 = OpVectorShuffle %v2uint %17668 %17668 2 3\n       %9659 = OpVectorShuffle %v4uint %17668 %200 2 2 3 3\n       %9601 = OpShiftRightLogical %v4uint %9659 %515\n       %7909 = OpBitwiseAnd %v4uint %9601 %1539\n      %24648 = OpShiftLeftLogical %v4uint %7909 %179\n      %22611 = OpShiftRightLogical %v4uint %9659 %791\n      %21479 = OpBitwiseAnd %v4uint %22611 %2327\n      %15533 = OpBitwiseOr %v4uint %24648 %21479\n      %20096 = OpBitwiseAnd %v2uint %7717 %2686\n      %22936 = OpShiftLeftLogical %v2uint %20096 %2038\n      %17892 = OpBitwiseAnd %v2uint %7717 %2884\n      %12397 = OpBitwiseOr %v2uint %22936 %17892\n      %15606 = OpVectorShuffle %v2uint %15533 %15533 0 2\n      %20934 = OpBitwiseOr %v2uint %15606 %12397\n      %19025 = OpCompositeExtract %uint %20934 0\n       %7210 = OpCompositeExtract %uint %20934 1\n      %23050 = OpVectorShuffle %v2uint %15533 %15533 1 3\n      %23935 = OpBitwiseOr %v2uint %23050 %1578\n      %19044 = OpCompositeExtract %uint %23935 0\n       %6979 = OpCompositeExtract %uint %23935 1\n      %15071 = OpCompositeConstruct %v4uint %19025 %19044 %7210 %6979\n      %12529 = OpShiftRightLogical %uint %7937 %int_4\n      %13001 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %12529\n               OpStore %13001 %16161\n       %8268 = OpIAdd %uint %7937 %uint_16\n       %6653 = OpShiftRightLogical %uint %8268 %int_4\n      %19428 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %6653\n               OpStore %19428 %15071\n       %8269 = OpIAdd %uint %21470 %uint_16\n       %6634 = OpShiftRightLogical %uint %8269 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %6634\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %14874 None\n               OpBranchConditional %22150 %10584 %14874\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %14874\n      %14874 = OpLabel\n      %10924 = OpPhi %v4uint %14608 %11682 %16377 %10584\n               OpSelectionMerge %11683 None\n               OpBranchConditional %15139 %11065 %11683\n      %11065 = OpLabel\n      %24088 = OpShiftLeftLogical %v4uint %10924 %749\n      %15336 = OpShiftRightLogical %v4uint %10924 %749\n      %10729 = OpBitwiseOr %v4uint %24088 %15336\n               OpBranch %11683\n      %11683 = OpLabel\n      %17669 = OpPhi %v4uint %10924 %14874 %10729 %11065\n      %22863 = OpVectorShuffle %v2uint %17669 %17669 0 1\n      %10664 = OpVectorShuffle %v4uint %17669 %200 0 0 1 1\n       %9602 = OpShiftRightLogical %v4uint %10664 %515\n       %7910 = OpBitwiseAnd %v4uint %9602 %1539\n      %24649 = OpShiftLeftLogical %v4uint %7910 %179\n      %22612 = OpShiftRightLogical %v4uint %10664 %791\n      %21480 = OpBitwiseAnd %v4uint %22612 %2327\n      %15534 = OpBitwiseOr %v4uint %24649 %21480\n      %20097 = OpBitwiseAnd %v2uint %22863 %2686\n      %22937 = OpShiftLeftLogical %v2uint %20097 %2038\n      %17893 = OpBitwiseAnd %v2uint %22863 %2884\n      %12398 = OpBitwiseOr %v2uint %22937 %17893\n      %15607 = OpVectorShuffle %v2uint %15534 %15534 0 2\n      %20935 = OpBitwiseOr %v2uint %15607 %12398\n      %19026 = OpCompositeExtract %uint %20935 0\n       %7211 = OpCompositeExtract %uint %20935 1\n      %23051 = OpVectorShuffle %v2uint %15534 %15534 1 3\n      %23936 = OpBitwiseOr %v2uint %23051 %1578\n      %19045 = OpCompositeExtract %uint %23936 0\n      %23866 = OpCompositeExtract %uint %23936 1\n      %16162 = OpCompositeConstruct %v4uint %19026 %19045 %7211 %23866\n       %7718 = OpVectorShuffle %v2uint %17669 %17669 2 3\n       %9660 = OpVectorShuffle %v4uint %17669 %200 2 2 3 3\n       %9603 = OpShiftRightLogical %v4uint %9660 %515\n       %7911 = OpBitwiseAnd %v4uint %9603 %1539\n      %24650 = OpShiftLeftLogical %v4uint %7911 %179\n      %22613 = OpShiftRightLogical %v4uint %9660 %791\n      %21481 = OpBitwiseAnd %v4uint %22613 %2327\n      %15535 = OpBitwiseOr %v4uint %24650 %21481\n      %20098 = OpBitwiseAnd %v2uint %7718 %2686\n      %22938 = OpShiftLeftLogical %v2uint %20098 %2038\n      %17894 = OpBitwiseAnd %v2uint %7718 %2884\n      %12399 = OpBitwiseOr %v2uint %22938 %17894\n      %15608 = OpVectorShuffle %v2uint %15535 %15535 0 2\n      %20936 = OpBitwiseOr %v2uint %15608 %12399\n      %19027 = OpCompositeExtract %uint %20936 0\n       %7212 = OpCompositeExtract %uint %20936 1\n      %23052 = OpVectorShuffle %v2uint %15535 %15535 1 3\n      %23937 = OpBitwiseOr %v2uint %23052 %1578\n      %19046 = OpCompositeExtract %uint %23937 0\n      %24796 = OpCompositeExtract %uint %23937 1\n       %9869 = OpCompositeConstruct %v4uint %19027 %19046 %7212 %24796\n      %16090 = OpIAdd %uint %7937 %uint_32\n       %8256 = OpShiftRightLogical %uint %16090 %int_4\n      %19429 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %8256\n               OpStore %19429 %16162\n       %8270 = OpIAdd %uint %7937 %uint_48\n       %6654 = OpShiftRightLogical %uint %8270 %int_4\n      %21727 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %6654\n               OpStore %21727 %9869\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_r10g11b11_rgba16_scaled_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006245, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000017,\n    0x0000000B, 0x00000004, 0x00040015, 0x0000000C, 0x00000020, 0x00000001,\n    0x00040017, 0x00000012, 0x0000000C, 0x00000002, 0x00040017, 0x00000016,\n    0x0000000C, 0x00000003, 0x00020014, 0x00000009, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000,\n    0x0004002B, 0x0000000B, 0x00000A49, 0x00000015, 0x0007002C, 0x00000017,\n    0x00000203, 0x00000A0A, 0x00000A49, 0x00000A0A, 0x00000A49, 0x0004002B,\n    0x0000000B, 0x00000A44, 0x000003FF, 0x0004002B, 0x0000000B, 0x00000A81,\n    0x000007FF, 0x0007002C, 0x00000017, 0x00000603, 0x00000A44, 0x00000A81,\n    0x00000A44, 0x00000A81, 0x0004002B, 0x0000000B, 0x00000A1C, 0x00000006,\n    0x0004002B, 0x0000000B, 0x00000A19, 0x00000005, 0x0007002C, 0x00000017,\n    0x000000B3, 0x00000A1C, 0x00000A19, 0x00000A1C, 0x00000A19, 0x0004002B,\n    0x0000000B, 0x00000A16, 0x00000004, 0x0004002B, 0x0000000B, 0x00000A5B,\n    0x0000001B, 0x0007002C, 0x00000017, 0x00000317, 0x00000A16, 0x00000A5B,\n    0x00000A16, 0x00000A5B, 0x0004002B, 0x0000000B, 0x00000AC7, 0x0000003F,\n    0x0004002B, 0x0000000B, 0x00000A67, 0x0000001F, 0x0007002C, 0x00000017,\n    0x00000917, 0x00000AC7, 0x00000A67, 0x00000AC7, 0x00000A67, 0x0004002B,\n    0x0000000B, 0x000003CF, 0x001FFC00, 0x0004002B, 0x0000000B, 0x00000A2B,\n    0x0000000B, 0x0004002B, 0x0000000B, 0x0000008F, 0x001F0000, 0x0004002B,\n    0x0000000B, 0x00000A10, 0x00000002, 0x0004002B, 0x0000000B, 0x0000068D,\n    0xFFFF0000, 0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001, 0x0004002B,\n    0x0000000B, 0x00000A13, 0x00000003, 0x0004002B, 0x0000000B, 0x000008A6,\n    0x00FF00FF, 0x0004002B, 0x0000000B, 0x00000A22, 0x00000008, 0x0004002B,\n    0x0000000B, 0x000005FD, 0xFF00FF00, 0x0004002B, 0x0000000B, 0x00000A3A,\n    0x00000010, 0x0004002B, 0x0000000C, 0x00000A17, 0x00000004, 0x0004002B,\n    0x0000000C, 0x00000A1D, 0x00000006, 0x0004002B, 0x0000000C, 0x00000A2C,\n    0x0000000B, 0x0004002B, 0x0000000C, 0x00000A38, 0x0000000F, 0x0004002B,\n    0x0000000C, 0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C, 0x00000A1A,\n    0x00000005, 0x0004002B, 0x0000000C, 0x00000A20, 0x00000007, 0x0004002B,\n    0x0000000C, 0x00000A23, 0x00000008, 0x0004002B, 0x0000000C, 0x00000A2F,\n    0x0000000C, 0x0004002B, 0x0000000C, 0x00000A14, 0x00000003, 0x0004002B,\n    0x0000000C, 0x00000A11, 0x00000002, 0x0004002B, 0x0000000C, 0x00000A0B,\n    0x00000000, 0x000A001E, 0x00000489, 0x0000000B, 0x0000000B, 0x0000000B,\n    0x0000000B, 0x00000014, 0x0000000B, 0x0000000B, 0x0000000B, 0x00040020,\n    0x00000706, 0x00000009, 0x00000489, 0x0004003B, 0x00000706, 0x00000CE9,\n    0x00000009, 0x00040020, 0x00000288, 0x00000009, 0x0000000B, 0x0004002B,\n    0x0000000B, 0x00000A1F, 0x00000007, 0x0005002C, 0x00000011, 0x00000787,\n    0x00000A16, 0x00000A1F, 0x00040020, 0x00000291, 0x00000009, 0x00000014,\n    0x00040020, 0x00000292, 0x00000001, 0x00000014, 0x0004003B, 0x00000292,\n    0x00000F48, 0x00000001, 0x0006002C, 0x00000014, 0x00000A2D, 0x00000A13,\n    0x00000A0A, 0x00000A0A, 0x00040017, 0x0000000F, 0x00000009, 0x00000002,\n    0x0003001D, 0x000007DC, 0x00000017, 0x0003001E, 0x000007B4, 0x000007DC,\n    0x00040020, 0x00000A31, 0x00000002, 0x000007B4, 0x0004003B, 0x00000A31,\n    0x0000107A, 0x00000002, 0x00040020, 0x00000294, 0x00000002, 0x00000017,\n    0x0003001D, 0x000007DD, 0x00000017, 0x0003001E, 0x000007B5, 0x000007DD,\n    0x00040020, 0x00000A32, 0x00000002, 0x000007B5, 0x0004003B, 0x00000A32,\n    0x0000140E, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020,\n    0x0004002B, 0x0000000B, 0x00000A9A, 0x00000030, 0x0006002C, 0x00000014,\n    0x00000BC3, 0x00000A16, 0x00000A6A, 0x00000A0D, 0x0005002C, 0x00000011,\n    0x000007A2, 0x00000A1F, 0x00000A1F, 0x0005002C, 0x00000011, 0x0000073F,\n    0x00000A16, 0x00000A0D, 0x0004002B, 0x0000000B, 0x00000A37, 0x0000000F,\n    0x0005002C, 0x00000011, 0x000007A3, 0x00000A37, 0x00000A0D, 0x0007002C,\n    0x00000017, 0x000009CE, 0x000008A6, 0x000008A6, 0x000008A6, 0x000008A6,\n    0x0007002C, 0x00000017, 0x0000013D, 0x00000A22, 0x00000A22, 0x00000A22,\n    0x00000A22, 0x0007002C, 0x00000017, 0x0000072E, 0x000005FD, 0x000005FD,\n    0x000005FD, 0x000005FD, 0x0007002C, 0x00000017, 0x000002ED, 0x00000A3A,\n    0x00000A3A, 0x00000A3A, 0x00000A3A, 0x0005002C, 0x00000011, 0x00000A7E,\n    0x000003CF, 0x000003CF, 0x0005002C, 0x00000011, 0x000007F6, 0x00000A2B,\n    0x00000A2B, 0x0005002C, 0x00000011, 0x00000B44, 0x0000008F, 0x0000008F,\n    0x0005002C, 0x00000011, 0x0000062A, 0x0000068D, 0x0000068D, 0x0003002E,\n    0x00000011, 0x000000C8, 0x00050036, 0x00000008, 0x0000161F, 0x00000000,\n    0x00000502, 0x000200F8, 0x00003B06, 0x000300F7, 0x00004C7A, 0x00000000,\n    0x000300FB, 0x00000A0A, 0x00002E68, 0x000200F8, 0x00002E68, 0x00050041,\n    0x00000288, 0x000060D7, 0x00000CE9, 0x00000A0B, 0x0004003D, 0x0000000B,\n    0x00003526, 0x000060D7, 0x000500C7, 0x0000000B, 0x00005F7D, 0x00003526,\n    0x00000A10, 0x000500AB, 0x00000009, 0x000048EB, 0x00005F7D, 0x00000A0A,\n    0x000500C2, 0x0000000B, 0x00001FCD, 0x00003526, 0x00000A10, 0x000500C7,\n    0x0000000B, 0x0000619E, 0x00001FCD, 0x00000A13, 0x00050050, 0x00000011,\n    0x000022A7, 0x00003526, 0x00003526, 0x000500C2, 0x00000011, 0x00001BAF,\n    0x000022A7, 0x00000787, 0x000500C7, 0x00000011, 0x00001997, 0x00001BAF,\n    0x000007A2, 0x00050041, 0x00000288, 0x0000492C, 0x00000CE9, 0x00000A0E,\n    0x0004003D, 0x0000000B, 0x00005EAC, 0x0000492C, 0x00050041, 0x00000288,\n    0x00004EBA, 0x00000CE9, 0x00000A11, 0x0004003D, 0x0000000B, 0x00005788,\n    0x00004EBA, 0x00050041, 0x00000288, 0x00004EBB, 0x00000CE9, 0x00000A14,\n    0x0004003D, 0x0000000B, 0x00005789, 0x00004EBB, 0x00050041, 0x00000291,\n    0x00004EBC, 0x00000CE9, 0x00000A17, 0x0004003D, 0x00000014, 0x0000578A,\n    0x00004EBC, 0x00050041, 0x00000288, 0x00004EBD, 0x00000CE9, 0x00000A1A,\n    0x0004003D, 0x0000000B, 0x0000578B, 0x00004EBD, 0x00050041, 0x00000288,\n    0x00004E6E, 0x00000CE9, 0x00000A1D, 0x0004003D, 0x0000000B, 0x000019C2,\n    0x00004E6E, 0x0004003D, 0x00000014, 0x00002A0E, 0x00000F48, 0x000500C4,\n    0x00000014, 0x0000538B, 0x00002A0E, 0x00000A2D, 0x0007004F, 0x00000011,\n    0x000042F0, 0x0000538B, 0x0000538B, 0x00000000, 0x00000001, 0x0007004F,\n    0x00000011, 0x0000242F, 0x0000578A, 0x0000578A, 0x00000000, 0x00000001,\n    0x000500AE, 0x0000000F, 0x00004288, 0x000042F0, 0x0000242F, 0x0004009A,\n    0x00000009, 0x00006067, 0x00004288, 0x000300F7, 0x000019BA, 0x00000002,\n    0x000400FA, 0x00006067, 0x000055E8, 0x000019BA, 0x000200F8, 0x000055E8,\n    0x000200F9, 0x00004C7A, 0x000200F8, 0x000019BA, 0x0004007C, 0x00000016,\n    0x00005BB6, 0x0000538B, 0x00050051, 0x0000000B, 0x00004916, 0x0000578A,\n    0x00000001, 0x00050051, 0x0000000C, 0x00005BEB, 0x00005BB6, 0x00000000,\n    0x00050084, 0x0000000C, 0x0000591A, 0x00005BEB, 0x00000A23, 0x00050051,\n    0x0000000C, 0x000018DA, 0x00005BB6, 0x00000002, 0x0004007C, 0x0000000C,\n    0x000038A9, 0x00004916, 0x00050084, 0x0000000C, 0x00002C0F, 0x000018DA,\n    0x000038A9, 0x00050051, 0x0000000C, 0x000044BE, 0x00005BB6, 0x00000001,\n    0x00050080, 0x0000000C, 0x000056D4, 0x00002C0F, 0x000044BE, 0x0004007C,\n    0x0000000C, 0x00005785, 0x000019C2, 0x00050084, 0x0000000C, 0x00005FD7,\n    0x000056D4, 0x00005785, 0x00050080, 0x0000000C, 0x00002042, 0x0000591A,\n    0x00005FD7, 0x0004007C, 0x0000000B, 0x00002A92, 0x00002042, 0x00050080,\n    0x0000000B, 0x00001F01, 0x0000578B, 0x00002A92, 0x000500C2, 0x00000011,\n    0x00004DD1, 0x000042F0, 0x0000073F, 0x00050086, 0x00000011, 0x00001E20,\n    0x00004DD1, 0x00001997, 0x00050084, 0x00000011, 0x00004707, 0x00001997,\n    0x00001E20, 0x00050082, 0x00000011, 0x00004761, 0x00004DD1, 0x00004707,\n    0x000500C4, 0x00000011, 0x00002BE0, 0x00001E20, 0x0000073F, 0x00050051,\n    0x0000000B, 0x000033E4, 0x00004761, 0x00000000, 0x00050051, 0x0000000B,\n    0x00002A78, 0x00001997, 0x00000001, 0x00050084, 0x0000000B, 0x00005966,\n    0x000033E4, 0x00002A78, 0x00050051, 0x0000000B, 0x00001B1F, 0x00004761,\n    0x00000001, 0x00050080, 0x0000000B, 0x000028E5, 0x00005966, 0x00001B1F,\n    0x000500C7, 0x00000011, 0x000049A3, 0x000042F0, 0x000007A3, 0x000500C4,\n    0x0000000B, 0x00002955, 0x000028E5, 0x00000A1F, 0x00050051, 0x0000000B,\n    0x000051B4, 0x000049A3, 0x00000001, 0x000500C4, 0x0000000B, 0x00005C2C,\n    0x000051B4, 0x00000A1C, 0x000500C5, 0x0000000B, 0x00004D66, 0x00002955,\n    0x00005C2C, 0x00050051, 0x0000000B, 0x000053E4, 0x000049A3, 0x00000000,\n    0x000500C4, 0x0000000B, 0x00002170, 0x000053E4, 0x00000A10, 0x000500C5,\n    0x0000000B, 0x000044F0, 0x00004D66, 0x00002170, 0x00050051, 0x0000000B,\n    0x00004DD3, 0x00002BE0, 0x00000000, 0x00060052, 0x00000014, 0x00003CC4,\n    0x00004DD3, 0x0000538B, 0x00000000, 0x00050051, 0x0000000B, 0x000059DE,\n    0x00002BE0, 0x00000001, 0x00060052, 0x00000014, 0x000025D0, 0x000059DE,\n    0x00003CC4, 0x00000001, 0x000300F7, 0x00004F78, 0x00000002, 0x000400FA,\n    0x000048EB, 0x00005BE0, 0x00002DD9, 0x000200F8, 0x00005BE0, 0x0004007C,\n    0x00000016, 0x0000277F, 0x000025D0, 0x000500C2, 0x0000000B, 0x00004C14,\n    0x00005788, 0x00000A1A, 0x000500C2, 0x0000000B, 0x0000497A, 0x00005789,\n    0x00000A17, 0x00050051, 0x0000000C, 0x00001A7E, 0x0000277F, 0x00000002,\n    0x000500C3, 0x0000000C, 0x00002F39, 0x00001A7E, 0x00000A11, 0x0004007C,\n    0x0000000C, 0x00005780, 0x0000497A, 0x00050084, 0x0000000C, 0x00001F02,\n    0x00002F39, 0x00005780, 0x00050051, 0x0000000C, 0x00006242, 0x0000277F,\n    0x00000001, 0x000500C3, 0x0000000C, 0x00004A6F, 0x00006242, 0x00000A17,\n    0x00050080, 0x0000000C, 0x00002B2C, 0x00001F02, 0x00004A6F, 0x0004007C,\n    0x0000000C, 0x00004202, 0x00004C14, 0x00050084, 0x0000000C, 0x00003A60,\n    0x00002B2C, 0x00004202, 0x00050051, 0x0000000C, 0x00006243, 0x0000277F,\n    0x00000000, 0x000500C3, 0x0000000C, 0x00004FC7, 0x00006243, 0x00000A1A,\n    0x00050080, 0x0000000C, 0x000049FC, 0x00003A60, 0x00004FC7, 0x000500C4,\n    0x0000000C, 0x0000225D, 0x000049FC, 0x00000A20, 0x000500C7, 0x0000000C,\n    0x00002CAA, 0x00001A7E, 0x00000A14, 0x000500C4, 0x0000000C, 0x00004CAE,\n    0x00002CAA, 0x00000A1A, 0x000500C3, 0x0000000C, 0x0000383E, 0x00006242,\n    0x00000A0E, 0x000500C7, 0x0000000C, 0x00005374, 0x0000383E, 0x00000A14,\n    0x000500C4, 0x0000000C, 0x000054CA, 0x00005374, 0x00000A14, 0x000500C5,\n    0x0000000C, 0x000042CE, 0x00004CAE, 0x000054CA, 0x000500C7, 0x0000000C,\n    0x000050D5, 0x00006243, 0x00000A20, 0x000500C5, 0x0000000C, 0x00003ADD,\n    0x000042CE, 0x000050D5, 0x000500C5, 0x0000000C, 0x000043B6, 0x0000225D,\n    0x00003ADD, 0x000500C4, 0x0000000C, 0x00005E50, 0x000043B6, 0x00000A10,\n    0x000500C3, 0x0000000C, 0x000032D7, 0x00006242, 0x00000A14, 0x000500C6,\n    0x0000000C, 0x000026C9, 0x000032D7, 0x00002F39, 0x000500C7, 0x0000000C,\n    0x00004199, 0x000026C9, 0x00000A0E, 0x000500C3, 0x0000000C, 0x00002590,\n    0x00006243, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000505E, 0x00002590,\n    0x00000A14, 0x000500C4, 0x0000000C, 0x0000541D, 0x00004199, 0x00000A0E,\n    0x000500C6, 0x0000000C, 0x000022BA, 0x0000505E, 0x0000541D, 0x000500C7,\n    0x0000000C, 0x00005076, 0x00006242, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x00005228, 0x00005076, 0x00000A17, 0x000500C4, 0x0000000C, 0x00001998,\n    0x000022BA, 0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FE, 0x00005228,\n    0x00001998, 0x000500C4, 0x0000000C, 0x00001C00, 0x00004199, 0x00000A2C,\n    0x000500C5, 0x0000000C, 0x00003C81, 0x000047FE, 0x00001C00, 0x000500C7,\n    0x0000000C, 0x000050AF, 0x00005E50, 0x00000A38, 0x000500C5, 0x0000000C,\n    0x00003C70, 0x00003C81, 0x000050AF, 0x000500C3, 0x0000000C, 0x00003745,\n    0x00005E50, 0x00000A17, 0x000500C7, 0x0000000C, 0x000018B8, 0x00003745,\n    0x00000A0E, 0x000500C4, 0x0000000C, 0x0000547E, 0x000018B8, 0x00000A1A,\n    0x000500C5, 0x0000000C, 0x000045A8, 0x00003C70, 0x0000547E, 0x000500C3,\n    0x0000000C, 0x00003A6E, 0x00005E50, 0x00000A1A, 0x000500C7, 0x0000000C,\n    0x000018B9, 0x00003A6E, 0x00000A20, 0x000500C4, 0x0000000C, 0x0000547F,\n    0x000018B9, 0x00000A23, 0x000500C5, 0x0000000C, 0x0000456F, 0x000045A8,\n    0x0000547F, 0x000500C3, 0x0000000C, 0x00003C88, 0x00005E50, 0x00000A23,\n    0x000500C4, 0x0000000C, 0x00002824, 0x00003C88, 0x00000A2F, 0x000500C5,\n    0x0000000C, 0x00003B79, 0x0000456F, 0x00002824, 0x0004007C, 0x0000000B,\n    0x000041E5, 0x00003B79, 0x000200F9, 0x00004F78, 0x000200F8, 0x00002DD9,\n    0x0007004F, 0x00000011, 0x00002E84, 0x000025D0, 0x000025D0, 0x00000000,\n    0x00000001, 0x0004007C, 0x00000012, 0x00004F7B, 0x00002E84, 0x000500C2,\n    0x0000000B, 0x00002CA9, 0x00005788, 0x00000A1A, 0x00050051, 0x0000000C,\n    0x00003905, 0x00004F7B, 0x00000001, 0x000500C3, 0x0000000C, 0x00002F3A,\n    0x00003905, 0x00000A1A, 0x0004007C, 0x0000000C, 0x00005781, 0x00002CA9,\n    0x00050084, 0x0000000C, 0x00001F03, 0x00002F3A, 0x00005781, 0x00050051,\n    0x0000000C, 0x00006244, 0x00004F7B, 0x00000000, 0x000500C3, 0x0000000C,\n    0x00004FC8, 0x00006244, 0x00000A1A, 0x00050080, 0x0000000C, 0x000049B0,\n    0x00001F03, 0x00004FC8, 0x000500C4, 0x0000000C, 0x0000254A, 0x000049B0,\n    0x00000A1D, 0x000500C3, 0x0000000C, 0x0000603B, 0x00003905, 0x00000A0E,\n    0x000500C7, 0x0000000C, 0x0000539A, 0x0000603B, 0x00000A20, 0x000500C4,\n    0x0000000C, 0x0000534A, 0x0000539A, 0x00000A14, 0x000500C7, 0x0000000C,\n    0x00004EA5, 0x00006244, 0x00000A20, 0x000500C5, 0x0000000C, 0x00002B1A,\n    0x0000534A, 0x00004EA5, 0x000500C5, 0x0000000C, 0x000043B7, 0x0000254A,\n    0x00002B1A, 0x000500C4, 0x0000000C, 0x00005E63, 0x000043B7, 0x00000A10,\n    0x000500C3, 0x0000000C, 0x000031DE, 0x00003905, 0x00000A17, 0x000500C7,\n    0x0000000C, 0x00005447, 0x000031DE, 0x00000A0E, 0x000500C3, 0x0000000C,\n    0x000028A6, 0x00006244, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000511E,\n    0x000028A6, 0x00000A14, 0x000500C3, 0x0000000C, 0x000028B9, 0x00003905,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x0000505F, 0x000028B9, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x0000541E, 0x0000505F, 0x00000A0E, 0x000500C6,\n    0x0000000C, 0x000022BB, 0x0000511E, 0x0000541E, 0x000500C7, 0x0000000C,\n    0x00005077, 0x00003905, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005229,\n    0x00005077, 0x00000A17, 0x000500C4, 0x0000000C, 0x00001999, 0x000022BB,\n    0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FF, 0x00005229, 0x00001999,\n    0x000500C4, 0x0000000C, 0x00001C01, 0x00005447, 0x00000A2C, 0x000500C5,\n    0x0000000C, 0x00003C82, 0x000047FF, 0x00001C01, 0x000500C7, 0x0000000C,\n    0x000050B0, 0x00005E63, 0x00000A38, 0x000500C5, 0x0000000C, 0x00003C71,\n    0x00003C82, 0x000050B0, 0x000500C3, 0x0000000C, 0x00003746, 0x00005E63,\n    0x00000A17, 0x000500C7, 0x0000000C, 0x000018BA, 0x00003746, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x00005480, 0x000018BA, 0x00000A1A, 0x000500C5,\n    0x0000000C, 0x000045A9, 0x00003C71, 0x00005480, 0x000500C3, 0x0000000C,\n    0x00003A6F, 0x00005E63, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018BB,\n    0x00003A6F, 0x00000A20, 0x000500C4, 0x0000000C, 0x00005481, 0x000018BB,\n    0x00000A23, 0x000500C5, 0x0000000C, 0x00004570, 0x000045A9, 0x00005481,\n    0x000500C3, 0x0000000C, 0x00003C89, 0x00005E63, 0x00000A23, 0x000500C4,\n    0x0000000C, 0x00002825, 0x00003C89, 0x00000A2F, 0x000500C5, 0x0000000C,\n    0x00003B7A, 0x00004570, 0x00002825, 0x0004007C, 0x0000000B, 0x000041E6,\n    0x00003B7A, 0x000200F9, 0x00004F78, 0x000200F8, 0x00004F78, 0x000700F5,\n    0x0000000B, 0x00004799, 0x000041E5, 0x00005BE0, 0x000041E6, 0x00002DD9,\n    0x00050051, 0x0000000B, 0x00003B60, 0x00001997, 0x00000000, 0x00050084,\n    0x0000000B, 0x00004451, 0x00003B60, 0x00002A78, 0x00050084, 0x0000000B,\n    0x00001C91, 0x00004799, 0x00004451, 0x00050080, 0x0000000B, 0x0000226F,\n    0x00001C91, 0x000044F0, 0x00050080, 0x0000000B, 0x000053DE, 0x0000226F,\n    0x00005EAC, 0x000500C2, 0x0000000B, 0x00003948, 0x000053DE, 0x00000A17,\n    0x00060041, 0x00000294, 0x00004FAF, 0x0000107A, 0x00000A0B, 0x00003948,\n    0x0004003D, 0x00000017, 0x00001CAA, 0x00004FAF, 0x000500AA, 0x00000009,\n    0x000035C0, 0x0000619E, 0x00000A0D, 0x000500AA, 0x00000009, 0x00005376,\n    0x0000619E, 0x00000A10, 0x000500A6, 0x00000009, 0x00005686, 0x000035C0,\n    0x00005376, 0x000300F7, 0x00003463, 0x00000000, 0x000400FA, 0x00005686,\n    0x00002957, 0x00003463, 0x000200F8, 0x00002957, 0x000500C7, 0x00000017,\n    0x0000475F, 0x00001CAA, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D1,\n    0x0000475F, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AC, 0x00001CAA,\n    0x0000072E, 0x000500C2, 0x00000017, 0x0000448D, 0x000050AC, 0x0000013D,\n    0x000500C5, 0x00000017, 0x00003FF8, 0x000024D1, 0x0000448D, 0x000200F9,\n    0x00003463, 0x000200F8, 0x00003463, 0x000700F5, 0x00000017, 0x00005879,\n    0x00001CAA, 0x00004F78, 0x00003FF8, 0x00002957, 0x000500AA, 0x00000009,\n    0x00004CB6, 0x0000619E, 0x00000A13, 0x000500A6, 0x00000009, 0x00003B23,\n    0x00005376, 0x00004CB6, 0x000300F7, 0x00002DA2, 0x00000000, 0x000400FA,\n    0x00003B23, 0x00002B38, 0x00002DA2, 0x000200F8, 0x00002B38, 0x000500C4,\n    0x00000017, 0x00005E17, 0x00005879, 0x000002ED, 0x000500C2, 0x00000017,\n    0x00003BE7, 0x00005879, 0x000002ED, 0x000500C5, 0x00000017, 0x000029E8,\n    0x00005E17, 0x00003BE7, 0x000200F9, 0x00002DA2, 0x000200F8, 0x00002DA2,\n    0x000700F5, 0x00000017, 0x00004504, 0x00005879, 0x00003463, 0x000029E8,\n    0x00002B38, 0x0007004F, 0x00000011, 0x0000594E, 0x00004504, 0x00004504,\n    0x00000000, 0x00000001, 0x0009004F, 0x00000017, 0x000029A7, 0x00004504,\n    0x000000C8, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x000500C2,\n    0x00000017, 0x00002580, 0x000029A7, 0x00000203, 0x000500C7, 0x00000017,\n    0x00001EE4, 0x00002580, 0x00000603, 0x000500C4, 0x00000017, 0x00006047,\n    0x00001EE4, 0x000000B3, 0x000500C2, 0x00000017, 0x00005852, 0x000029A7,\n    0x00000317, 0x000500C7, 0x00000017, 0x000053E6, 0x00005852, 0x00000917,\n    0x000500C5, 0x00000017, 0x00003CAC, 0x00006047, 0x000053E6, 0x000500C7,\n    0x00000011, 0x00004E7F, 0x0000594E, 0x00000A7E, 0x000500C4, 0x00000011,\n    0x00005997, 0x00004E7F, 0x000007F6, 0x000500C7, 0x00000011, 0x000045E3,\n    0x0000594E, 0x00000B44, 0x000500C5, 0x00000011, 0x0000306C, 0x00005997,\n    0x000045E3, 0x0007004F, 0x00000011, 0x00003CF5, 0x00003CAC, 0x00003CAC,\n    0x00000000, 0x00000002, 0x000500C5, 0x00000011, 0x000051C5, 0x00003CF5,\n    0x0000306C, 0x00050051, 0x0000000B, 0x00004A50, 0x000051C5, 0x00000000,\n    0x00050051, 0x0000000B, 0x00001C29, 0x000051C5, 0x00000001, 0x0007004F,\n    0x00000011, 0x00005A09, 0x00003CAC, 0x00003CAC, 0x00000001, 0x00000003,\n    0x000500C5, 0x00000011, 0x00005D7E, 0x00005A09, 0x0000062A, 0x00050051,\n    0x0000000B, 0x00004A63, 0x00005D7E, 0x00000000, 0x00050051, 0x0000000B,\n    0x00005D39, 0x00005D7E, 0x00000001, 0x00070050, 0x00000017, 0x00003F21,\n    0x00004A50, 0x00004A63, 0x00001C29, 0x00005D39, 0x0007004F, 0x00000011,\n    0x00001E25, 0x00004504, 0x00004504, 0x00000002, 0x00000003, 0x0009004F,\n    0x00000017, 0x000025BB, 0x00004504, 0x000000C8, 0x00000002, 0x00000002,\n    0x00000003, 0x00000003, 0x000500C2, 0x00000017, 0x00002581, 0x000025BB,\n    0x00000203, 0x000500C7, 0x00000017, 0x00001EE5, 0x00002581, 0x00000603,\n    0x000500C4, 0x00000017, 0x00006048, 0x00001EE5, 0x000000B3, 0x000500C2,\n    0x00000017, 0x00005853, 0x000025BB, 0x00000317, 0x000500C7, 0x00000017,\n    0x000053E7, 0x00005853, 0x00000917, 0x000500C5, 0x00000017, 0x00003CAD,\n    0x00006048, 0x000053E7, 0x000500C7, 0x00000011, 0x00004E80, 0x00001E25,\n    0x00000A7E, 0x000500C4, 0x00000011, 0x00005998, 0x00004E80, 0x000007F6,\n    0x000500C7, 0x00000011, 0x000045E4, 0x00001E25, 0x00000B44, 0x000500C5,\n    0x00000011, 0x0000306D, 0x00005998, 0x000045E4, 0x0007004F, 0x00000011,\n    0x00003CF6, 0x00003CAD, 0x00003CAD, 0x00000000, 0x00000002, 0x000500C5,\n    0x00000011, 0x000051C6, 0x00003CF6, 0x0000306D, 0x00050051, 0x0000000B,\n    0x00004A51, 0x000051C6, 0x00000000, 0x00050051, 0x0000000B, 0x00001C2A,\n    0x000051C6, 0x00000001, 0x0007004F, 0x00000011, 0x00005A0A, 0x00003CAD,\n    0x00003CAD, 0x00000001, 0x00000003, 0x000500C5, 0x00000011, 0x00005D7F,\n    0x00005A0A, 0x0000062A, 0x00050051, 0x0000000B, 0x00004A64, 0x00005D7F,\n    0x00000000, 0x00050051, 0x0000000B, 0x00001B43, 0x00005D7F, 0x00000001,\n    0x00070050, 0x00000017, 0x00003ADF, 0x00004A51, 0x00004A64, 0x00001C2A,\n    0x00001B43, 0x000500C2, 0x0000000B, 0x000030F1, 0x00001F01, 0x00000A17,\n    0x00060041, 0x00000294, 0x000032C9, 0x0000140E, 0x00000A0B, 0x000030F1,\n    0x0003003E, 0x000032C9, 0x00003F21, 0x00050080, 0x0000000B, 0x0000204C,\n    0x00001F01, 0x00000A3A, 0x000500C2, 0x0000000B, 0x000019FD, 0x0000204C,\n    0x00000A17, 0x00060041, 0x00000294, 0x00004BE4, 0x0000140E, 0x00000A0B,\n    0x000019FD, 0x0003003E, 0x00004BE4, 0x00003ADF, 0x00050080, 0x0000000B,\n    0x0000204D, 0x000053DE, 0x00000A3A, 0x000500C2, 0x0000000B, 0x000019EA,\n    0x0000204D, 0x00000A17, 0x00060041, 0x00000294, 0x00005566, 0x0000107A,\n    0x00000A0B, 0x000019EA, 0x0004003D, 0x00000017, 0x00003910, 0x00005566,\n    0x000300F7, 0x00003A1A, 0x00000000, 0x000400FA, 0x00005686, 0x00002958,\n    0x00003A1A, 0x000200F8, 0x00002958, 0x000500C7, 0x00000017, 0x00004760,\n    0x00003910, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D2, 0x00004760,\n    0x0000013D, 0x000500C7, 0x00000017, 0x000050AD, 0x00003910, 0x0000072E,\n    0x000500C2, 0x00000017, 0x0000448E, 0x000050AD, 0x0000013D, 0x000500C5,\n    0x00000017, 0x00003FF9, 0x000024D2, 0x0000448E, 0x000200F9, 0x00003A1A,\n    0x000200F8, 0x00003A1A, 0x000700F5, 0x00000017, 0x00002AAC, 0x00003910,\n    0x00002DA2, 0x00003FF9, 0x00002958, 0x000300F7, 0x00002DA3, 0x00000000,\n    0x000400FA, 0x00003B23, 0x00002B39, 0x00002DA3, 0x000200F8, 0x00002B39,\n    0x000500C4, 0x00000017, 0x00005E18, 0x00002AAC, 0x000002ED, 0x000500C2,\n    0x00000017, 0x00003BE8, 0x00002AAC, 0x000002ED, 0x000500C5, 0x00000017,\n    0x000029E9, 0x00005E18, 0x00003BE8, 0x000200F9, 0x00002DA3, 0x000200F8,\n    0x00002DA3, 0x000700F5, 0x00000017, 0x00004505, 0x00002AAC, 0x00003A1A,\n    0x000029E9, 0x00002B39, 0x0007004F, 0x00000011, 0x0000594F, 0x00004505,\n    0x00004505, 0x00000000, 0x00000001, 0x0009004F, 0x00000017, 0x000029A8,\n    0x00004505, 0x000000C8, 0x00000000, 0x00000000, 0x00000001, 0x00000001,\n    0x000500C2, 0x00000017, 0x00002582, 0x000029A8, 0x00000203, 0x000500C7,\n    0x00000017, 0x00001EE6, 0x00002582, 0x00000603, 0x000500C4, 0x00000017,\n    0x00006049, 0x00001EE6, 0x000000B3, 0x000500C2, 0x00000017, 0x00005854,\n    0x000029A8, 0x00000317, 0x000500C7, 0x00000017, 0x000053E8, 0x00005854,\n    0x00000917, 0x000500C5, 0x00000017, 0x00003CAE, 0x00006049, 0x000053E8,\n    0x000500C7, 0x00000011, 0x00004E81, 0x0000594F, 0x00000A7E, 0x000500C4,\n    0x00000011, 0x00005999, 0x00004E81, 0x000007F6, 0x000500C7, 0x00000011,\n    0x000045E5, 0x0000594F, 0x00000B44, 0x000500C5, 0x00000011, 0x0000306E,\n    0x00005999, 0x000045E5, 0x0007004F, 0x00000011, 0x00003CF7, 0x00003CAE,\n    0x00003CAE, 0x00000000, 0x00000002, 0x000500C5, 0x00000011, 0x000051C7,\n    0x00003CF7, 0x0000306E, 0x00050051, 0x0000000B, 0x00004A52, 0x000051C7,\n    0x00000000, 0x00050051, 0x0000000B, 0x00001C2B, 0x000051C7, 0x00000001,\n    0x0007004F, 0x00000011, 0x00005A0B, 0x00003CAE, 0x00003CAE, 0x00000001,\n    0x00000003, 0x000500C5, 0x00000011, 0x00005D80, 0x00005A0B, 0x0000062A,\n    0x00050051, 0x0000000B, 0x00004A65, 0x00005D80, 0x00000000, 0x00050051,\n    0x0000000B, 0x00005D3A, 0x00005D80, 0x00000001, 0x00070050, 0x00000017,\n    0x00003F22, 0x00004A52, 0x00004A65, 0x00001C2B, 0x00005D3A, 0x0007004F,\n    0x00000011, 0x00001E26, 0x00004505, 0x00004505, 0x00000002, 0x00000003,\n    0x0009004F, 0x00000017, 0x000025BC, 0x00004505, 0x000000C8, 0x00000002,\n    0x00000002, 0x00000003, 0x00000003, 0x000500C2, 0x00000017, 0x00002583,\n    0x000025BC, 0x00000203, 0x000500C7, 0x00000017, 0x00001EE7, 0x00002583,\n    0x00000603, 0x000500C4, 0x00000017, 0x0000604A, 0x00001EE7, 0x000000B3,\n    0x000500C2, 0x00000017, 0x00005855, 0x000025BC, 0x00000317, 0x000500C7,\n    0x00000017, 0x000053E9, 0x00005855, 0x00000917, 0x000500C5, 0x00000017,\n    0x00003CAF, 0x0000604A, 0x000053E9, 0x000500C7, 0x00000011, 0x00004E82,\n    0x00001E26, 0x00000A7E, 0x000500C4, 0x00000011, 0x0000599A, 0x00004E82,\n    0x000007F6, 0x000500C7, 0x00000011, 0x000045E6, 0x00001E26, 0x00000B44,\n    0x000500C5, 0x00000011, 0x0000306F, 0x0000599A, 0x000045E6, 0x0007004F,\n    0x00000011, 0x00003CF8, 0x00003CAF, 0x00003CAF, 0x00000000, 0x00000002,\n    0x000500C5, 0x00000011, 0x000051C8, 0x00003CF8, 0x0000306F, 0x00050051,\n    0x0000000B, 0x00004A53, 0x000051C8, 0x00000000, 0x00050051, 0x0000000B,\n    0x00001C2C, 0x000051C8, 0x00000001, 0x0007004F, 0x00000011, 0x00005A0C,\n    0x00003CAF, 0x00003CAF, 0x00000001, 0x00000003, 0x000500C5, 0x00000011,\n    0x00005D81, 0x00005A0C, 0x0000062A, 0x00050051, 0x0000000B, 0x00004A66,\n    0x00005D81, 0x00000000, 0x00050051, 0x0000000B, 0x000060DC, 0x00005D81,\n    0x00000001, 0x00070050, 0x00000017, 0x0000268D, 0x00004A53, 0x00004A66,\n    0x00001C2C, 0x000060DC, 0x00050080, 0x0000000B, 0x00003EDA, 0x00001F01,\n    0x00000A6A, 0x000500C2, 0x0000000B, 0x00002040, 0x00003EDA, 0x00000A17,\n    0x00060041, 0x00000294, 0x00004BE5, 0x0000140E, 0x00000A0B, 0x00002040,\n    0x0003003E, 0x00004BE5, 0x00003F22, 0x00050080, 0x0000000B, 0x0000204E,\n    0x00001F01, 0x00000A9A, 0x000500C2, 0x0000000B, 0x000019FE, 0x0000204E,\n    0x00000A17, 0x00060041, 0x00000294, 0x000054DF, 0x0000140E, 0x00000A0B,\n    0x000019FE, 0x0003003E, 0x000054DF, 0x0000268D, 0x000200F9, 0x00004C7A,\n    0x000200F8, 0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_r10g11b11_rgba16_snorm_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25155\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n     %v4uint = OpTypeVector %uint 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v3uint = OpTypeVector %uint 3\n     %uint_9 = OpConstant %uint 9\n     %v2bool = OpTypeVector %bool 2\n     %uint_0 = OpConstant %uint 0\n   %uint_513 = OpConstant %uint 513\n   %uint_512 = OpConstant %uint 512\n  %uint_1023 = OpConstant %uint 1023\n     %uint_6 = OpConstant %uint 6\n     %uint_3 = OpConstant %uint 3\n %uint_65535 = OpConstant %uint 65535\n    %uint_10 = OpConstant %uint 10\n  %uint_1025 = OpConstant %uint 1025\n  %uint_1024 = OpConstant %uint 1024\n  %uint_2047 = OpConstant %uint 2047\n     %uint_5 = OpConstant %uint 5\n    %uint_16 = OpConstant %uint 16\n    %uint_21 = OpConstant %uint 21\n%uint_2147418112 = OpConstant %uint 2147418112\n     %uint_1 = OpConstant %uint 1\n     %uint_2 = OpConstant %uint 2\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n      %int_3 = OpConstant %int 3\n      %int_2 = OpConstant %int 2\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %2603 = OpConstantComposite %v3uint %uint_3 %uint_0 %uint_0\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n     %uint_4 = OpConstant %uint 4\n    %uint_32 = OpConstant %uint 32\n    %uint_48 = OpConstant %uint 48\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n       %2213 = OpConstantComposite %v2uint %uint_1023 %uint_1023\n       %1996 = OpConstantComposite %v2uint %uint_9 %uint_9\n       %1807 = OpConstantComposite %v2uint %uint_0 %uint_0\n        %536 = OpConstantComposite %v2uint %uint_513 %uint_513\n        %515 = OpConstantComposite %v2uint %uint_512 %uint_512\n       %1933 = OpConstantComposite %v2uint %uint_6 %uint_6\n       %1870 = OpConstantComposite %v2uint %uint_3 %uint_3\n       %2015 = OpConstantComposite %v2uint %uint_65535 %uint_65535\n       %2017 = OpConstantComposite %v2uint %uint_10 %uint_10\n       %2640 = OpConstantComposite %v2uint %uint_2047 %uint_2047\n       %2255 = OpConstantComposite %v2uint %uint_1025 %uint_1025\n       %2234 = OpConstantComposite %v2uint %uint_1024 %uint_1024\n       %1912 = OpConstantComposite %v2uint %uint_5 %uint_5\n       %2143 = OpConstantComposite %v2uint %uint_16 %uint_16\n       %2248 = OpConstantComposite %v2uint %uint_21 %uint_21\n        %883 = OpConstantComposite %v2uint %uint_2147418112 %uint_2147418112\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24540 = OpBitwiseAnd %uint %13606 %uint_1\n      %17270 = OpINotEqual %bool %24540 %uint_0\n      %12328 = OpBitwiseAnd %uint %13606 %uint_2\n      %17284 = OpINotEqual %bool %12328 %uint_0\n       %7856 = OpShiftRightLogical %uint %13606 %uint_2\n      %25058 = OpBitwiseAnd %uint %7856 %uint_3\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2603\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %6586 DontFlatten\n               OpBranchConditional %24679 %21992 %6586\n      %21992 = OpLabel\n               OpBranch %19578\n       %6586 = OpLabel\n      %23478 = OpBitcast %v3int %21387\n      %18710 = OpCompositeExtract %uint %22410 1\n      %23531 = OpCompositeExtract %int %23478 0\n      %22810 = OpIMul %int %23531 %int_8\n       %6362 = OpCompositeExtract %int %23478 2\n      %14505 = OpBitcast %int %18710\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %23478 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %6594\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %22810 %24535\n      %10404 = OpBitcast %uint %8258\n      %14582 = OpIAdd %uint %22411 %10404\n      %12308 = OpLogicalNot %bool %17270\n               OpSelectionMerge %19040 DontFlatten\n               OpBranchConditional %12308 %9741 %17007\n       %9741 = OpLabel\n      %17463 = OpCompositeExtract %uint %21387 0\n      %11246 = OpCompositeExtract %uint %21387 1\n      %18801 = OpCompositeExtract %uint %21387 2\n      %14831 = OpIMul %uint %22409 %18801\n      %20322 = OpIAdd %uint %11246 %14831\n      %21676 = OpIMul %uint %22408 %20322\n      %20398 = OpIAdd %uint %17463 %21676\n      %11367 = OpShiftLeftLogical %uint %20398 %uint_2\n               OpBranch %19040\n      %17007 = OpLabel\n               OpSelectionMerge %23536 DontFlatten\n               OpBranchConditional %17284 %11410 %24353\n      %11410 = OpLabel\n      %21364 = OpShiftRightLogical %uint %22408 %int_5\n      %13804 = OpShiftRightLogical %uint %22409 %int_4\n      %13237 = OpShiftRightArithmetic %int %6362 %int_2\n      %22374 = OpBitcast %int %13804\n      %25085 = OpIMul %int %13237 %22374\n      %11618 = OpShiftRightArithmetic %int %17598 %int_4\n      %16670 = OpIAdd %int %25085 %11618\n      %19064 = OpBitcast %int %21364\n      %13020 = OpIMul %int %16670 %19064\n      %12986 = OpShiftRightArithmetic %int %23531 %int_5\n      %24558 = OpIAdd %int %13020 %12986\n       %8797 = OpShiftLeftLogical %int %24558 %int_7\n      %11434 = OpBitwiseAnd %int %6362 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %17598 %int_1\n      %21365 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21365 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %23531 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17334 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17334 %uint_2\n      %13015 = OpShiftRightArithmetic %int %17598 %int_3\n       %9929 = OpBitwiseXor %int %13015 %13237\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %23531 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %17598 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6551\n       %7168 = OpShiftLeftLogical %int %16793 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24144 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24144 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24144 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24144 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %23536\n      %24353 = OpLabel\n      %23000 = OpBitcast %v2int %17136\n      %22120 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %23000 1\n      %12089 = OpShiftRightArithmetic %int %14597 %int_5\n      %22400 = OpBitcast %int %22120\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %23000 0\n      %20423 = OpShiftRightArithmetic %int %25154 %int_5\n      %18864 = OpIAdd %int %7938 %20423\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25154 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17335 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17335 %uint_2\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25154 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6552\n       %7169 = OpShiftLeftLogical %int %21575 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24163 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24163 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24163 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %23536\n      %23536 = OpLabel\n      %10540 = OpPhi %uint %16869 %11410 %16870 %24353\n               OpBranch %19040\n      %19040 = OpLabel\n      %11376 = OpPhi %uint %11367 %9741 %10540 %23536\n      %18621 = OpIAdd %uint %11376 %24236\n      %15698 = OpShiftRightLogical %uint %18621 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15698\n       %7338 = OpLoad %v4uint %20399\n      %13760 = OpIEqual %bool %25058 %uint_1\n      %21366 = OpIEqual %bool %25058 %uint_2\n      %22150 = OpLogicalOr %bool %13760 %21366\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %7338 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %7338 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22649 = OpPhi %v4uint %7338 %19040 %16376 %10583\n      %19638 = OpIEqual %bool %25058 %uint_3\n      %15139 = OpLogicalOr %bool %21366 %19638\n               OpSelectionMerge %11682 None\n               OpBranchConditional %15139 %11064 %11682\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22649 %749\n      %15335 = OpShiftRightLogical %v4uint %22649 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %11682\n      %11682 = OpLabel\n      %19948 = OpPhi %v4uint %22649 %13411 %10728 %11064\n      %21173 = OpVectorShuffle %v2uint %19948 %19948 0 1\n      %12206 = OpBitwiseAnd %v2uint %21173 %2213\n       %6898 = OpShiftRightLogical %v2uint %12206 %1996\n      %12708 = OpINotEqual %v2bool %6898 %1807\n      %20140 = OpIEqual %v2bool %12206 %515\n       %7655 = OpSelect %v2uint %20140 %536 %12206\n      %23050 = OpSelect %v2uint %12708 %2213 %1807\n      %23672 = OpBitwiseXor %v2uint %7655 %23050\n      %24500 = OpIAdd %v2uint %23672 %6898\n       %8872 = OpShiftLeftLogical %v2uint %24500 %1933\n      %13590 = OpShiftRightLogical %v2uint %24500 %1870\n      %23618 = OpBitwiseOr %v2uint %8872 %13590\n      %15463 = OpSelect %v2uint %12708 %2015 %1807\n       %7774 = OpBitwiseXor %v2uint %23618 %15463\n      %24941 = OpIAdd %v2uint %7774 %6898\n      %24336 = OpShiftRightLogical %v2uint %21173 %2017\n      %11822 = OpBitwiseAnd %v2uint %24336 %2640\n       %6319 = OpShiftRightLogical %v2uint %11822 %2017\n      %12709 = OpINotEqual %v2bool %6319 %1807\n      %20141 = OpIEqual %v2bool %11822 %2234\n       %7656 = OpSelect %v2uint %20141 %2255 %11822\n      %23051 = OpSelect %v2uint %12709 %2640 %1807\n      %23673 = OpBitwiseXor %v2uint %7656 %23051\n      %24501 = OpIAdd %v2uint %23673 %6319\n       %8873 = OpShiftLeftLogical %v2uint %24501 %1912\n      %13591 = OpShiftRightLogical %v2uint %24501 %1912\n      %23619 = OpBitwiseOr %v2uint %8873 %13591\n      %15464 = OpSelect %v2uint %12709 %2015 %1807\n       %7812 = OpBitwiseXor %v2uint %23619 %15464\n      %24557 = OpIAdd %v2uint %7812 %6319\n       %8296 = OpShiftLeftLogical %v2uint %24557 %2143\n       %9076 = OpBitwiseOr %v2uint %24941 %8296\n      %23541 = OpShiftRightLogical %v2uint %21173 %2248\n      %13212 = OpShiftRightLogical %v2uint %23541 %2017\n      %11904 = OpINotEqual %v2bool %13212 %1807\n      %20142 = OpIEqual %v2bool %23541 %2234\n       %7657 = OpSelect %v2uint %20142 %2255 %23541\n      %23052 = OpSelect %v2uint %11904 %2640 %1807\n      %23674 = OpBitwiseXor %v2uint %7657 %23052\n      %24502 = OpIAdd %v2uint %23674 %13212\n       %8874 = OpShiftLeftLogical %v2uint %24502 %1912\n      %13592 = OpShiftRightLogical %v2uint %24502 %1912\n      %23620 = OpBitwiseOr %v2uint %8874 %13592\n      %15465 = OpSelect %v2uint %11904 %2015 %1807\n       %7831 = OpBitwiseXor %v2uint %23620 %15465\n      %22180 = OpIAdd %v2uint %7831 %13212\n      %18024 = OpBitwiseOr %v2uint %22180 %883\n      %10453 = OpCompositeExtract %uint %9076 0\n      %23730 = OpCompositeExtract %uint %9076 1\n       %7641 = OpCompositeExtract %uint %18024 0\n       %7795 = OpCompositeExtract %uint %18024 1\n      %16161 = OpCompositeConstruct %v4uint %10453 %23730 %7641 %7795\n       %7813 = OpVectorShuffle %v4uint %16161 %16161 0 2 1 3\n       %8699 = OpVectorShuffle %v2uint %19948 %19948 2 3\n       %7167 = OpBitwiseAnd %v2uint %8699 %2213\n       %6899 = OpShiftRightLogical %v2uint %7167 %1996\n      %12710 = OpINotEqual %v2bool %6899 %1807\n      %20143 = OpIEqual %v2bool %7167 %515\n       %7658 = OpSelect %v2uint %20143 %536 %7167\n      %23053 = OpSelect %v2uint %12710 %2213 %1807\n      %23675 = OpBitwiseXor %v2uint %7658 %23053\n      %24503 = OpIAdd %v2uint %23675 %6899\n       %8875 = OpShiftLeftLogical %v2uint %24503 %1933\n      %13593 = OpShiftRightLogical %v2uint %24503 %1870\n      %23621 = OpBitwiseOr %v2uint %8875 %13593\n      %15466 = OpSelect %v2uint %12710 %2015 %1807\n       %7775 = OpBitwiseXor %v2uint %23621 %15466\n      %24942 = OpIAdd %v2uint %7775 %6899\n      %24337 = OpShiftRightLogical %v2uint %8699 %2017\n      %11823 = OpBitwiseAnd %v2uint %24337 %2640\n       %6320 = OpShiftRightLogical %v2uint %11823 %2017\n      %12711 = OpINotEqual %v2bool %6320 %1807\n      %20144 = OpIEqual %v2bool %11823 %2234\n       %7659 = OpSelect %v2uint %20144 %2255 %11823\n      %23054 = OpSelect %v2uint %12711 %2640 %1807\n      %23676 = OpBitwiseXor %v2uint %7659 %23054\n      %24504 = OpIAdd %v2uint %23676 %6320\n       %8876 = OpShiftLeftLogical %v2uint %24504 %1912\n      %13594 = OpShiftRightLogical %v2uint %24504 %1912\n      %23622 = OpBitwiseOr %v2uint %8876 %13594\n      %15467 = OpSelect %v2uint %12711 %2015 %1807\n       %7814 = OpBitwiseXor %v2uint %23622 %15467\n      %24559 = OpIAdd %v2uint %7814 %6320\n       %8297 = OpShiftLeftLogical %v2uint %24559 %2143\n       %9077 = OpBitwiseOr %v2uint %24942 %8297\n      %23542 = OpShiftRightLogical %v2uint %8699 %2248\n      %13213 = OpShiftRightLogical %v2uint %23542 %2017\n      %11905 = OpINotEqual %v2bool %13213 %1807\n      %20145 = OpIEqual %v2bool %23542 %2234\n       %7660 = OpSelect %v2uint %20145 %2255 %23542\n      %23055 = OpSelect %v2uint %11905 %2640 %1807\n      %23677 = OpBitwiseXor %v2uint %7660 %23055\n      %24505 = OpIAdd %v2uint %23677 %13213\n       %8877 = OpShiftLeftLogical %v2uint %24505 %1912\n      %13595 = OpShiftRightLogical %v2uint %24505 %1912\n      %23623 = OpBitwiseOr %v2uint %8877 %13595\n      %15468 = OpSelect %v2uint %11905 %2015 %1807\n       %7832 = OpBitwiseXor %v2uint %23623 %15468\n      %22181 = OpIAdd %v2uint %7832 %13213\n      %18025 = OpBitwiseOr %v2uint %22181 %883\n      %10454 = OpCompositeExtract %uint %9077 0\n      %23731 = OpCompositeExtract %uint %9077 1\n       %7642 = OpCompositeExtract %uint %18025 0\n       %7796 = OpCompositeExtract %uint %18025 1\n      %18346 = OpCompositeConstruct %v4uint %10454 %23731 %7642 %7796\n      %23513 = OpVectorShuffle %v4uint %18346 %18346 0 2 1 3\n      %15200 = OpShiftRightLogical %uint %14582 %int_4\n       %8966 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %15200\n               OpStore %8966 %7813\n       %8268 = OpIAdd %uint %14582 %uint_16\n       %6653 = OpShiftRightLogical %uint %8268 %int_4\n      %21689 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %6653\n               OpStore %21689 %23513\n               OpSelectionMerge %24688 DontFlatten\n               OpBranchConditional %17270 %21993 %7205\n      %21993 = OpLabel\n               OpBranch %24688\n       %7205 = OpLabel\n               OpBranch %24688\n      %24688 = OpLabel\n      %11377 = OpPhi %uint %uint_32 %21993 %uint_16 %7205\n      %18622 = OpIAdd %uint %18621 %11377\n      %15699 = OpShiftRightLogical %uint %18622 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15699\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %14874 None\n               OpBranchConditional %22150 %10584 %14874\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %14874\n      %14874 = OpLabel\n      %10924 = OpPhi %v4uint %14608 %24688 %16377 %10584\n               OpSelectionMerge %11683 None\n               OpBranchConditional %15139 %11065 %11683\n      %11065 = OpLabel\n      %24088 = OpShiftLeftLogical %v4uint %10924 %749\n      %15336 = OpShiftRightLogical %v4uint %10924 %749\n      %10729 = OpBitwiseOr %v4uint %24088 %15336\n               OpBranch %11683\n      %11683 = OpLabel\n      %19949 = OpPhi %v4uint %10924 %14874 %10729 %11065\n      %21174 = OpVectorShuffle %v2uint %19949 %19949 0 1\n      %12207 = OpBitwiseAnd %v2uint %21174 %2213\n       %6900 = OpShiftRightLogical %v2uint %12207 %1996\n      %12712 = OpINotEqual %v2bool %6900 %1807\n      %20146 = OpIEqual %v2bool %12207 %515\n       %7661 = OpSelect %v2uint %20146 %536 %12207\n      %23056 = OpSelect %v2uint %12712 %2213 %1807\n      %23678 = OpBitwiseXor %v2uint %7661 %23056\n      %24506 = OpIAdd %v2uint %23678 %6900\n       %8878 = OpShiftLeftLogical %v2uint %24506 %1933\n      %13596 = OpShiftRightLogical %v2uint %24506 %1870\n      %23624 = OpBitwiseOr %v2uint %8878 %13596\n      %15469 = OpSelect %v2uint %12712 %2015 %1807\n       %7776 = OpBitwiseXor %v2uint %23624 %15469\n      %24943 = OpIAdd %v2uint %7776 %6900\n      %24338 = OpShiftRightLogical %v2uint %21174 %2017\n      %11824 = OpBitwiseAnd %v2uint %24338 %2640\n       %6321 = OpShiftRightLogical %v2uint %11824 %2017\n      %12713 = OpINotEqual %v2bool %6321 %1807\n      %20147 = OpIEqual %v2bool %11824 %2234\n       %7662 = OpSelect %v2uint %20147 %2255 %11824\n      %23057 = OpSelect %v2uint %12713 %2640 %1807\n      %23679 = OpBitwiseXor %v2uint %7662 %23057\n      %24507 = OpIAdd %v2uint %23679 %6321\n       %8879 = OpShiftLeftLogical %v2uint %24507 %1912\n      %13597 = OpShiftRightLogical %v2uint %24507 %1912\n      %23625 = OpBitwiseOr %v2uint %8879 %13597\n      %15470 = OpSelect %v2uint %12713 %2015 %1807\n       %7815 = OpBitwiseXor %v2uint %23625 %15470\n      %24560 = OpIAdd %v2uint %7815 %6321\n       %8298 = OpShiftLeftLogical %v2uint %24560 %2143\n       %9078 = OpBitwiseOr %v2uint %24943 %8298\n      %23543 = OpShiftRightLogical %v2uint %21174 %2248\n      %13214 = OpShiftRightLogical %v2uint %23543 %2017\n      %11906 = OpINotEqual %v2bool %13214 %1807\n      %20148 = OpIEqual %v2bool %23543 %2234\n       %7663 = OpSelect %v2uint %20148 %2255 %23543\n      %23058 = OpSelect %v2uint %11906 %2640 %1807\n      %23680 = OpBitwiseXor %v2uint %7663 %23058\n      %24508 = OpIAdd %v2uint %23680 %13214\n       %8880 = OpShiftLeftLogical %v2uint %24508 %1912\n      %13598 = OpShiftRightLogical %v2uint %24508 %1912\n      %23626 = OpBitwiseOr %v2uint %8880 %13598\n      %15471 = OpSelect %v2uint %11906 %2015 %1807\n       %7833 = OpBitwiseXor %v2uint %23626 %15471\n      %22182 = OpIAdd %v2uint %7833 %13214\n      %18026 = OpBitwiseOr %v2uint %22182 %883\n      %10455 = OpCompositeExtract %uint %9078 0\n      %23732 = OpCompositeExtract %uint %9078 1\n       %7643 = OpCompositeExtract %uint %18026 0\n       %7797 = OpCompositeExtract %uint %18026 1\n      %16162 = OpCompositeConstruct %v4uint %10455 %23732 %7643 %7797\n       %7816 = OpVectorShuffle %v4uint %16162 %16162 0 2 1 3\n       %8700 = OpVectorShuffle %v2uint %19949 %19949 2 3\n       %7170 = OpBitwiseAnd %v2uint %8700 %2213\n       %6901 = OpShiftRightLogical %v2uint %7170 %1996\n      %12714 = OpINotEqual %v2bool %6901 %1807\n      %20149 = OpIEqual %v2bool %7170 %515\n       %7664 = OpSelect %v2uint %20149 %536 %7170\n      %23059 = OpSelect %v2uint %12714 %2213 %1807\n      %23681 = OpBitwiseXor %v2uint %7664 %23059\n      %24509 = OpIAdd %v2uint %23681 %6901\n       %8881 = OpShiftLeftLogical %v2uint %24509 %1933\n      %13599 = OpShiftRightLogical %v2uint %24509 %1870\n      %23627 = OpBitwiseOr %v2uint %8881 %13599\n      %15474 = OpSelect %v2uint %12714 %2015 %1807\n       %7777 = OpBitwiseXor %v2uint %23627 %15474\n      %24944 = OpIAdd %v2uint %7777 %6901\n      %24339 = OpShiftRightLogical %v2uint %8700 %2017\n      %11825 = OpBitwiseAnd %v2uint %24339 %2640\n       %6322 = OpShiftRightLogical %v2uint %11825 %2017\n      %12715 = OpINotEqual %v2bool %6322 %1807\n      %20150 = OpIEqual %v2bool %11825 %2234\n       %7665 = OpSelect %v2uint %20150 %2255 %11825\n      %23060 = OpSelect %v2uint %12715 %2640 %1807\n      %23682 = OpBitwiseXor %v2uint %7665 %23060\n      %24510 = OpIAdd %v2uint %23682 %6322\n       %8882 = OpShiftLeftLogical %v2uint %24510 %1912\n      %13600 = OpShiftRightLogical %v2uint %24510 %1912\n      %23628 = OpBitwiseOr %v2uint %8882 %13600\n      %15475 = OpSelect %v2uint %12715 %2015 %1807\n       %7817 = OpBitwiseXor %v2uint %23628 %15475\n      %24561 = OpIAdd %v2uint %7817 %6322\n       %8299 = OpShiftLeftLogical %v2uint %24561 %2143\n       %9079 = OpBitwiseOr %v2uint %24944 %8299\n      %23544 = OpShiftRightLogical %v2uint %8700 %2248\n      %13215 = OpShiftRightLogical %v2uint %23544 %2017\n      %11907 = OpINotEqual %v2bool %13215 %1807\n      %20151 = OpIEqual %v2bool %23544 %2234\n       %7666 = OpSelect %v2uint %20151 %2255 %23544\n      %23061 = OpSelect %v2uint %11907 %2640 %1807\n      %23683 = OpBitwiseXor %v2uint %7666 %23061\n      %24511 = OpIAdd %v2uint %23683 %13215\n       %8883 = OpShiftLeftLogical %v2uint %24511 %1912\n      %13601 = OpShiftRightLogical %v2uint %24511 %1912\n      %23629 = OpBitwiseOr %v2uint %8883 %13601\n      %15476 = OpSelect %v2uint %11907 %2015 %1807\n       %7834 = OpBitwiseXor %v2uint %23629 %15476\n      %22183 = OpIAdd %v2uint %7834 %13215\n      %18027 = OpBitwiseOr %v2uint %22183 %883\n      %10456 = OpCompositeExtract %uint %9079 0\n      %23733 = OpCompositeExtract %uint %9079 1\n       %7644 = OpCompositeExtract %uint %18027 0\n       %7798 = OpCompositeExtract %uint %18027 1\n      %17092 = OpCompositeConstruct %v4uint %10456 %23733 %7644 %7798\n      %18311 = OpVectorShuffle %v4uint %17092 %17092 0 2 1 3\n      %18761 = OpIAdd %uint %14582 %uint_32\n      %10678 = OpShiftRightLogical %uint %18761 %int_4\n      %19428 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %10678\n               OpStore %19428 %7816\n       %8269 = OpIAdd %uint %14582 %uint_48\n       %6654 = OpShiftRightLogical %uint %8269 %int_4\n      %21727 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %6654\n               OpStore %21727 %18311\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_r10g11b11_rgba16_snorm_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006243, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000017,\n    0x0000000B, 0x00000004, 0x00040015, 0x0000000C, 0x00000020, 0x00000001,\n    0x00040017, 0x00000012, 0x0000000C, 0x00000002, 0x00040017, 0x00000016,\n    0x0000000C, 0x00000003, 0x00020014, 0x00000009, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A25, 0x00000009,\n    0x00040017, 0x0000000F, 0x00000009, 0x00000002, 0x0004002B, 0x0000000B,\n    0x00000A0A, 0x00000000, 0x0004002B, 0x0000000B, 0x0000044A, 0x00000201,\n    0x0004002B, 0x0000000B, 0x00000447, 0x00000200, 0x0004002B, 0x0000000B,\n    0x00000A44, 0x000003FF, 0x0004002B, 0x0000000B, 0x00000A1C, 0x00000006,\n    0x0004002B, 0x0000000B, 0x00000A13, 0x00000003, 0x0004002B, 0x0000000B,\n    0x000001C1, 0x0000FFFF, 0x0004002B, 0x0000000B, 0x00000A28, 0x0000000A,\n    0x0004002B, 0x0000000B, 0x00000A4A, 0x00000401, 0x0004002B, 0x0000000B,\n    0x00000A47, 0x00000400, 0x0004002B, 0x0000000B, 0x00000A81, 0x000007FF,\n    0x0004002B, 0x0000000B, 0x00000A19, 0x00000005, 0x0004002B, 0x0000000B,\n    0x00000A3A, 0x00000010, 0x0004002B, 0x0000000B, 0x00000A49, 0x00000015,\n    0x0004002B, 0x0000000B, 0x000003D6, 0x7FFF0000, 0x0004002B, 0x0000000B,\n    0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B, 0x00000A10, 0x00000002,\n    0x0004002B, 0x0000000B, 0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B,\n    0x00000A22, 0x00000008, 0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00,\n    0x0004002B, 0x0000000C, 0x00000A17, 0x00000004, 0x0004002B, 0x0000000C,\n    0x00000A1D, 0x00000006, 0x0004002B, 0x0000000C, 0x00000A2C, 0x0000000B,\n    0x0004002B, 0x0000000C, 0x00000A38, 0x0000000F, 0x0004002B, 0x0000000C,\n    0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C, 0x00000A1A, 0x00000005,\n    0x0004002B, 0x0000000C, 0x00000A20, 0x00000007, 0x0004002B, 0x0000000C,\n    0x00000A23, 0x00000008, 0x0004002B, 0x0000000C, 0x00000A2F, 0x0000000C,\n    0x0004002B, 0x0000000C, 0x00000A14, 0x00000003, 0x0004002B, 0x0000000C,\n    0x00000A11, 0x00000002, 0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000,\n    0x000A001E, 0x00000489, 0x0000000B, 0x0000000B, 0x0000000B, 0x0000000B,\n    0x00000014, 0x0000000B, 0x0000000B, 0x0000000B, 0x00040020, 0x00000706,\n    0x00000009, 0x00000489, 0x0004003B, 0x00000706, 0x00000CE9, 0x00000009,\n    0x00040020, 0x00000288, 0x00000009, 0x0000000B, 0x00040020, 0x00000291,\n    0x00000009, 0x00000014, 0x00040020, 0x00000292, 0x00000001, 0x00000014,\n    0x0004003B, 0x00000292, 0x00000F48, 0x00000001, 0x0006002C, 0x00000014,\n    0x00000A2B, 0x00000A13, 0x00000A0A, 0x00000A0A, 0x0003001D, 0x000007DC,\n    0x00000017, 0x0003001E, 0x000007B4, 0x000007DC, 0x00040020, 0x00000A31,\n    0x00000002, 0x000007B4, 0x0004003B, 0x00000A31, 0x0000107A, 0x00000002,\n    0x00040020, 0x00000294, 0x00000002, 0x00000017, 0x0003001D, 0x000007DD,\n    0x00000017, 0x0003001E, 0x000007B5, 0x000007DD, 0x00040020, 0x00000A32,\n    0x00000002, 0x000007B5, 0x0004003B, 0x00000A32, 0x0000140E, 0x00000002,\n    0x0004002B, 0x0000000B, 0x00000A16, 0x00000004, 0x0004002B, 0x0000000B,\n    0x00000A6A, 0x00000020, 0x0004002B, 0x0000000B, 0x00000A9A, 0x00000030,\n    0x0006002C, 0x00000014, 0x00000BC3, 0x00000A16, 0x00000A6A, 0x00000A0D,\n    0x0007002C, 0x00000017, 0x000009CE, 0x000008A6, 0x000008A6, 0x000008A6,\n    0x000008A6, 0x0007002C, 0x00000017, 0x0000013D, 0x00000A22, 0x00000A22,\n    0x00000A22, 0x00000A22, 0x0007002C, 0x00000017, 0x0000072E, 0x000005FD,\n    0x000005FD, 0x000005FD, 0x000005FD, 0x0007002C, 0x00000017, 0x000002ED,\n    0x00000A3A, 0x00000A3A, 0x00000A3A, 0x00000A3A, 0x0005002C, 0x00000011,\n    0x000008A5, 0x00000A44, 0x00000A44, 0x0005002C, 0x00000011, 0x000007CC,\n    0x00000A25, 0x00000A25, 0x0005002C, 0x00000011, 0x0000070F, 0x00000A0A,\n    0x00000A0A, 0x0005002C, 0x00000011, 0x00000218, 0x0000044A, 0x0000044A,\n    0x0005002C, 0x00000011, 0x00000203, 0x00000447, 0x00000447, 0x0005002C,\n    0x00000011, 0x0000078D, 0x00000A1C, 0x00000A1C, 0x0005002C, 0x00000011,\n    0x0000074E, 0x00000A13, 0x00000A13, 0x0005002C, 0x00000011, 0x000007DF,\n    0x000001C1, 0x000001C1, 0x0005002C, 0x00000011, 0x000007E1, 0x00000A28,\n    0x00000A28, 0x0005002C, 0x00000011, 0x00000A50, 0x00000A81, 0x00000A81,\n    0x0005002C, 0x00000011, 0x000008CF, 0x00000A4A, 0x00000A4A, 0x0005002C,\n    0x00000011, 0x000008BA, 0x00000A47, 0x00000A47, 0x0005002C, 0x00000011,\n    0x00000778, 0x00000A19, 0x00000A19, 0x0005002C, 0x00000011, 0x0000085F,\n    0x00000A3A, 0x00000A3A, 0x0005002C, 0x00000011, 0x000008C8, 0x00000A49,\n    0x00000A49, 0x0005002C, 0x00000011, 0x00000373, 0x000003D6, 0x000003D6,\n    0x00050036, 0x00000008, 0x0000161F, 0x00000000, 0x00000502, 0x000200F8,\n    0x00003B06, 0x000300F7, 0x00004C7A, 0x00000000, 0x000300FB, 0x00000A0A,\n    0x00002E68, 0x000200F8, 0x00002E68, 0x00050041, 0x00000288, 0x000060D7,\n    0x00000CE9, 0x00000A0B, 0x0004003D, 0x0000000B, 0x00003526, 0x000060D7,\n    0x000500C7, 0x0000000B, 0x00005FDC, 0x00003526, 0x00000A0D, 0x000500AB,\n    0x00000009, 0x00004376, 0x00005FDC, 0x00000A0A, 0x000500C7, 0x0000000B,\n    0x00003028, 0x00003526, 0x00000A10, 0x000500AB, 0x00000009, 0x00004384,\n    0x00003028, 0x00000A0A, 0x000500C2, 0x0000000B, 0x00001EB0, 0x00003526,\n    0x00000A10, 0x000500C7, 0x0000000B, 0x000061E2, 0x00001EB0, 0x00000A13,\n    0x00050041, 0x00000288, 0x0000492C, 0x00000CE9, 0x00000A0E, 0x0004003D,\n    0x0000000B, 0x00005EAC, 0x0000492C, 0x00050041, 0x00000288, 0x00004EBA,\n    0x00000CE9, 0x00000A11, 0x0004003D, 0x0000000B, 0x00005788, 0x00004EBA,\n    0x00050041, 0x00000288, 0x00004EBB, 0x00000CE9, 0x00000A14, 0x0004003D,\n    0x0000000B, 0x00005789, 0x00004EBB, 0x00050041, 0x00000291, 0x00004EBC,\n    0x00000CE9, 0x00000A17, 0x0004003D, 0x00000014, 0x0000578A, 0x00004EBC,\n    0x00050041, 0x00000288, 0x00004EBD, 0x00000CE9, 0x00000A1A, 0x0004003D,\n    0x0000000B, 0x0000578B, 0x00004EBD, 0x00050041, 0x00000288, 0x00004E6E,\n    0x00000CE9, 0x00000A1D, 0x0004003D, 0x0000000B, 0x000019C2, 0x00004E6E,\n    0x0004003D, 0x00000014, 0x00002A0E, 0x00000F48, 0x000500C4, 0x00000014,\n    0x0000538B, 0x00002A0E, 0x00000A2B, 0x0007004F, 0x00000011, 0x000042F0,\n    0x0000538B, 0x0000538B, 0x00000000, 0x00000001, 0x0007004F, 0x00000011,\n    0x0000242F, 0x0000578A, 0x0000578A, 0x00000000, 0x00000001, 0x000500AE,\n    0x0000000F, 0x00004288, 0x000042F0, 0x0000242F, 0x0004009A, 0x00000009,\n    0x00006067, 0x00004288, 0x000300F7, 0x000019BA, 0x00000002, 0x000400FA,\n    0x00006067, 0x000055E8, 0x000019BA, 0x000200F8, 0x000055E8, 0x000200F9,\n    0x00004C7A, 0x000200F8, 0x000019BA, 0x0004007C, 0x00000016, 0x00005BB6,\n    0x0000538B, 0x00050051, 0x0000000B, 0x00004916, 0x0000578A, 0x00000001,\n    0x00050051, 0x0000000C, 0x00005BEB, 0x00005BB6, 0x00000000, 0x00050084,\n    0x0000000C, 0x0000591A, 0x00005BEB, 0x00000A23, 0x00050051, 0x0000000C,\n    0x000018DA, 0x00005BB6, 0x00000002, 0x0004007C, 0x0000000C, 0x000038A9,\n    0x00004916, 0x00050084, 0x0000000C, 0x00002C0F, 0x000018DA, 0x000038A9,\n    0x00050051, 0x0000000C, 0x000044BE, 0x00005BB6, 0x00000001, 0x00050080,\n    0x0000000C, 0x000056D4, 0x00002C0F, 0x000044BE, 0x0004007C, 0x0000000C,\n    0x00005785, 0x000019C2, 0x00050084, 0x0000000C, 0x00005FD7, 0x000056D4,\n    0x00005785, 0x00050080, 0x0000000C, 0x00002042, 0x0000591A, 0x00005FD7,\n    0x0004007C, 0x0000000B, 0x000028A4, 0x00002042, 0x00050080, 0x0000000B,\n    0x000038F6, 0x0000578B, 0x000028A4, 0x000400A8, 0x00000009, 0x00003014,\n    0x00004376, 0x000300F7, 0x00004A60, 0x00000002, 0x000400FA, 0x00003014,\n    0x0000260D, 0x0000426F, 0x000200F8, 0x0000260D, 0x00050051, 0x0000000B,\n    0x00004437, 0x0000538B, 0x00000000, 0x00050051, 0x0000000B, 0x00002BEE,\n    0x0000538B, 0x00000001, 0x00050051, 0x0000000B, 0x00004971, 0x0000538B,\n    0x00000002, 0x00050084, 0x0000000B, 0x000039EF, 0x00005789, 0x00004971,\n    0x00050080, 0x0000000B, 0x00004F62, 0x00002BEE, 0x000039EF, 0x00050084,\n    0x0000000B, 0x000054AC, 0x00005788, 0x00004F62, 0x00050080, 0x0000000B,\n    0x00004FAE, 0x00004437, 0x000054AC, 0x000500C4, 0x0000000B, 0x00002C67,\n    0x00004FAE, 0x00000A10, 0x000200F9, 0x00004A60, 0x000200F8, 0x0000426F,\n    0x000300F7, 0x00005BF0, 0x00000002, 0x000400FA, 0x00004384, 0x00002C92,\n    0x00005F21, 0x000200F8, 0x00002C92, 0x000500C2, 0x0000000B, 0x00005374,\n    0x00005788, 0x00000A1A, 0x000500C2, 0x0000000B, 0x000035EC, 0x00005789,\n    0x00000A17, 0x000500C3, 0x0000000C, 0x000033B5, 0x000018DA, 0x00000A11,\n    0x0004007C, 0x0000000C, 0x00005766, 0x000035EC, 0x00050084, 0x0000000C,\n    0x000061FD, 0x000033B5, 0x00005766, 0x000500C3, 0x0000000C, 0x00002D62,\n    0x000044BE, 0x00000A17, 0x00050080, 0x0000000C, 0x0000411E, 0x000061FD,\n    0x00002D62, 0x0004007C, 0x0000000C, 0x00004A78, 0x00005374, 0x00050084,\n    0x0000000C, 0x000032DC, 0x0000411E, 0x00004A78, 0x000500C3, 0x0000000C,\n    0x000032BA, 0x00005BEB, 0x00000A1A, 0x00050080, 0x0000000C, 0x00005FEE,\n    0x000032DC, 0x000032BA, 0x000500C4, 0x0000000C, 0x0000225D, 0x00005FEE,\n    0x00000A20, 0x000500C7, 0x0000000C, 0x00002CAA, 0x000018DA, 0x00000A14,\n    0x000500C4, 0x0000000C, 0x00004CAE, 0x00002CAA, 0x00000A1A, 0x000500C3,\n    0x0000000C, 0x0000383E, 0x000044BE, 0x00000A0E, 0x000500C7, 0x0000000C,\n    0x00005375, 0x0000383E, 0x00000A14, 0x000500C4, 0x0000000C, 0x000054CA,\n    0x00005375, 0x00000A14, 0x000500C5, 0x0000000C, 0x000042CE, 0x00004CAE,\n    0x000054CA, 0x000500C7, 0x0000000C, 0x000050D5, 0x00005BEB, 0x00000A20,\n    0x000500C5, 0x0000000C, 0x00003ADD, 0x000042CE, 0x000050D5, 0x000500C5,\n    0x0000000C, 0x000043B6, 0x0000225D, 0x00003ADD, 0x000500C4, 0x0000000C,\n    0x00005E50, 0x000043B6, 0x00000A10, 0x000500C3, 0x0000000C, 0x000032D7,\n    0x000044BE, 0x00000A14, 0x000500C6, 0x0000000C, 0x000026C9, 0x000032D7,\n    0x000033B5, 0x000500C7, 0x0000000C, 0x00004199, 0x000026C9, 0x00000A0E,\n    0x000500C3, 0x0000000C, 0x00002590, 0x00005BEB, 0x00000A14, 0x000500C7,\n    0x0000000C, 0x0000505E, 0x00002590, 0x00000A14, 0x000500C4, 0x0000000C,\n    0x0000541D, 0x00004199, 0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BA,\n    0x0000505E, 0x0000541D, 0x000500C7, 0x0000000C, 0x00005076, 0x000044BE,\n    0x00000A0E, 0x000500C4, 0x0000000C, 0x00005228, 0x00005076, 0x00000A17,\n    0x000500C4, 0x0000000C, 0x00001997, 0x000022BA, 0x00000A1D, 0x000500C5,\n    0x0000000C, 0x000047FE, 0x00005228, 0x00001997, 0x000500C4, 0x0000000C,\n    0x00001C00, 0x00004199, 0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C81,\n    0x000047FE, 0x00001C00, 0x000500C7, 0x0000000C, 0x000050AF, 0x00005E50,\n    0x00000A38, 0x000500C5, 0x0000000C, 0x00003C70, 0x00003C81, 0x000050AF,\n    0x000500C3, 0x0000000C, 0x00003745, 0x00005E50, 0x00000A17, 0x000500C7,\n    0x0000000C, 0x000018B8, 0x00003745, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x0000547E, 0x000018B8, 0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A8,\n    0x00003C70, 0x0000547E, 0x000500C3, 0x0000000C, 0x00003A6E, 0x00005E50,\n    0x00000A1A, 0x000500C7, 0x0000000C, 0x000018B9, 0x00003A6E, 0x00000A20,\n    0x000500C4, 0x0000000C, 0x0000547F, 0x000018B9, 0x00000A23, 0x000500C5,\n    0x0000000C, 0x0000456F, 0x000045A8, 0x0000547F, 0x000500C3, 0x0000000C,\n    0x00003C88, 0x00005E50, 0x00000A23, 0x000500C4, 0x0000000C, 0x00002824,\n    0x00003C88, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B79, 0x0000456F,\n    0x00002824, 0x0004007C, 0x0000000B, 0x000041E5, 0x00003B79, 0x000200F9,\n    0x00005BF0, 0x000200F8, 0x00005F21, 0x0004007C, 0x00000012, 0x000059D8,\n    0x000042F0, 0x000500C2, 0x0000000B, 0x00005668, 0x00005788, 0x00000A1A,\n    0x00050051, 0x0000000C, 0x00003905, 0x000059D8, 0x00000001, 0x000500C3,\n    0x0000000C, 0x00002F39, 0x00003905, 0x00000A1A, 0x0004007C, 0x0000000C,\n    0x00005780, 0x00005668, 0x00050084, 0x0000000C, 0x00001F02, 0x00002F39,\n    0x00005780, 0x00050051, 0x0000000C, 0x00006242, 0x000059D8, 0x00000000,\n    0x000500C3, 0x0000000C, 0x00004FC7, 0x00006242, 0x00000A1A, 0x00050080,\n    0x0000000C, 0x000049B0, 0x00001F02, 0x00004FC7, 0x000500C4, 0x0000000C,\n    0x0000254A, 0x000049B0, 0x00000A1D, 0x000500C3, 0x0000000C, 0x0000603B,\n    0x00003905, 0x00000A0E, 0x000500C7, 0x0000000C, 0x0000539A, 0x0000603B,\n    0x00000A20, 0x000500C4, 0x0000000C, 0x0000534A, 0x0000539A, 0x00000A14,\n    0x000500C7, 0x0000000C, 0x00004EA5, 0x00006242, 0x00000A20, 0x000500C5,\n    0x0000000C, 0x00002B1A, 0x0000534A, 0x00004EA5, 0x000500C5, 0x0000000C,\n    0x000043B7, 0x0000254A, 0x00002B1A, 0x000500C4, 0x0000000C, 0x00005E63,\n    0x000043B7, 0x00000A10, 0x000500C3, 0x0000000C, 0x000031DE, 0x00003905,\n    0x00000A17, 0x000500C7, 0x0000000C, 0x00005447, 0x000031DE, 0x00000A0E,\n    0x000500C3, 0x0000000C, 0x000028A6, 0x00006242, 0x00000A14, 0x000500C7,\n    0x0000000C, 0x0000511E, 0x000028A6, 0x00000A14, 0x000500C3, 0x0000000C,\n    0x000028B9, 0x00003905, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000505F,\n    0x000028B9, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000541E, 0x0000505F,\n    0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BB, 0x0000511E, 0x0000541E,\n    0x000500C7, 0x0000000C, 0x00005077, 0x00003905, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x00005229, 0x00005077, 0x00000A17, 0x000500C4, 0x0000000C,\n    0x00001998, 0x000022BB, 0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FF,\n    0x00005229, 0x00001998, 0x000500C4, 0x0000000C, 0x00001C01, 0x00005447,\n    0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C82, 0x000047FF, 0x00001C01,\n    0x000500C7, 0x0000000C, 0x000050B0, 0x00005E63, 0x00000A38, 0x000500C5,\n    0x0000000C, 0x00003C71, 0x00003C82, 0x000050B0, 0x000500C3, 0x0000000C,\n    0x00003746, 0x00005E63, 0x00000A17, 0x000500C7, 0x0000000C, 0x000018BA,\n    0x00003746, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005480, 0x000018BA,\n    0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A9, 0x00003C71, 0x00005480,\n    0x000500C3, 0x0000000C, 0x00003A6F, 0x00005E63, 0x00000A1A, 0x000500C7,\n    0x0000000C, 0x000018BB, 0x00003A6F, 0x00000A20, 0x000500C4, 0x0000000C,\n    0x00005481, 0x000018BB, 0x00000A23, 0x000500C5, 0x0000000C, 0x00004570,\n    0x000045A9, 0x00005481, 0x000500C3, 0x0000000C, 0x00003C89, 0x00005E63,\n    0x00000A23, 0x000500C4, 0x0000000C, 0x00002825, 0x00003C89, 0x00000A2F,\n    0x000500C5, 0x0000000C, 0x00003B7A, 0x00004570, 0x00002825, 0x0004007C,\n    0x0000000B, 0x000041E6, 0x00003B7A, 0x000200F9, 0x00005BF0, 0x000200F8,\n    0x00005BF0, 0x000700F5, 0x0000000B, 0x0000292C, 0x000041E5, 0x00002C92,\n    0x000041E6, 0x00005F21, 0x000200F9, 0x00004A60, 0x000200F8, 0x00004A60,\n    0x000700F5, 0x0000000B, 0x00002C70, 0x00002C67, 0x0000260D, 0x0000292C,\n    0x00005BF0, 0x00050080, 0x0000000B, 0x000048BD, 0x00002C70, 0x00005EAC,\n    0x000500C2, 0x0000000B, 0x00003D52, 0x000048BD, 0x00000A17, 0x00060041,\n    0x00000294, 0x00004FAF, 0x0000107A, 0x00000A0B, 0x00003D52, 0x0004003D,\n    0x00000017, 0x00001CAA, 0x00004FAF, 0x000500AA, 0x00000009, 0x000035C0,\n    0x000061E2, 0x00000A0D, 0x000500AA, 0x00000009, 0x00005376, 0x000061E2,\n    0x00000A10, 0x000500A6, 0x00000009, 0x00005686, 0x000035C0, 0x00005376,\n    0x000300F7, 0x00003463, 0x00000000, 0x000400FA, 0x00005686, 0x00002957,\n    0x00003463, 0x000200F8, 0x00002957, 0x000500C7, 0x00000017, 0x0000475F,\n    0x00001CAA, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D1, 0x0000475F,\n    0x0000013D, 0x000500C7, 0x00000017, 0x000050AC, 0x00001CAA, 0x0000072E,\n    0x000500C2, 0x00000017, 0x0000448D, 0x000050AC, 0x0000013D, 0x000500C5,\n    0x00000017, 0x00003FF8, 0x000024D1, 0x0000448D, 0x000200F9, 0x00003463,\n    0x000200F8, 0x00003463, 0x000700F5, 0x00000017, 0x00005879, 0x00001CAA,\n    0x00004A60, 0x00003FF8, 0x00002957, 0x000500AA, 0x00000009, 0x00004CB6,\n    0x000061E2, 0x00000A13, 0x000500A6, 0x00000009, 0x00003B23, 0x00005376,\n    0x00004CB6, 0x000300F7, 0x00002DA2, 0x00000000, 0x000400FA, 0x00003B23,\n    0x00002B38, 0x00002DA2, 0x000200F8, 0x00002B38, 0x000500C4, 0x00000017,\n    0x00005E17, 0x00005879, 0x000002ED, 0x000500C2, 0x00000017, 0x00003BE7,\n    0x00005879, 0x000002ED, 0x000500C5, 0x00000017, 0x000029E8, 0x00005E17,\n    0x00003BE7, 0x000200F9, 0x00002DA2, 0x000200F8, 0x00002DA2, 0x000700F5,\n    0x00000017, 0x00004DEC, 0x00005879, 0x00003463, 0x000029E8, 0x00002B38,\n    0x0007004F, 0x00000011, 0x000052B5, 0x00004DEC, 0x00004DEC, 0x00000000,\n    0x00000001, 0x000500C7, 0x00000011, 0x00002FAE, 0x000052B5, 0x000008A5,\n    0x000500C2, 0x00000011, 0x00001AF2, 0x00002FAE, 0x000007CC, 0x000500AB,\n    0x0000000F, 0x000031A4, 0x00001AF2, 0x0000070F, 0x000500AA, 0x0000000F,\n    0x00004EAC, 0x00002FAE, 0x00000203, 0x000600A9, 0x00000011, 0x00001DE7,\n    0x00004EAC, 0x00000218, 0x00002FAE, 0x000600A9, 0x00000011, 0x00005A0A,\n    0x000031A4, 0x000008A5, 0x0000070F, 0x000500C6, 0x00000011, 0x00005C78,\n    0x00001DE7, 0x00005A0A, 0x00050080, 0x00000011, 0x00005FB4, 0x00005C78,\n    0x00001AF2, 0x000500C4, 0x00000011, 0x000022A8, 0x00005FB4, 0x0000078D,\n    0x000500C2, 0x00000011, 0x00003516, 0x00005FB4, 0x0000074E, 0x000500C5,\n    0x00000011, 0x00005C42, 0x000022A8, 0x00003516, 0x000600A9, 0x00000011,\n    0x00003C67, 0x000031A4, 0x000007DF, 0x0000070F, 0x000500C6, 0x00000011,\n    0x00001E5E, 0x00005C42, 0x00003C67, 0x00050080, 0x00000011, 0x0000616D,\n    0x00001E5E, 0x00001AF2, 0x000500C2, 0x00000011, 0x00005F10, 0x000052B5,\n    0x000007E1, 0x000500C7, 0x00000011, 0x00002E2E, 0x00005F10, 0x00000A50,\n    0x000500C2, 0x00000011, 0x000018AF, 0x00002E2E, 0x000007E1, 0x000500AB,\n    0x0000000F, 0x000031A5, 0x000018AF, 0x0000070F, 0x000500AA, 0x0000000F,\n    0x00004EAD, 0x00002E2E, 0x000008BA, 0x000600A9, 0x00000011, 0x00001DE8,\n    0x00004EAD, 0x000008CF, 0x00002E2E, 0x000600A9, 0x00000011, 0x00005A0B,\n    0x000031A5, 0x00000A50, 0x0000070F, 0x000500C6, 0x00000011, 0x00005C79,\n    0x00001DE8, 0x00005A0B, 0x00050080, 0x00000011, 0x00005FB5, 0x00005C79,\n    0x000018AF, 0x000500C4, 0x00000011, 0x000022A9, 0x00005FB5, 0x00000778,\n    0x000500C2, 0x00000011, 0x00003517, 0x00005FB5, 0x00000778, 0x000500C5,\n    0x00000011, 0x00005C43, 0x000022A9, 0x00003517, 0x000600A9, 0x00000011,\n    0x00003C68, 0x000031A5, 0x000007DF, 0x0000070F, 0x000500C6, 0x00000011,\n    0x00001E84, 0x00005C43, 0x00003C68, 0x00050080, 0x00000011, 0x00005FED,\n    0x00001E84, 0x000018AF, 0x000500C4, 0x00000011, 0x00002068, 0x00005FED,\n    0x0000085F, 0x000500C5, 0x00000011, 0x00002374, 0x0000616D, 0x00002068,\n    0x000500C2, 0x00000011, 0x00005BF5, 0x000052B5, 0x000008C8, 0x000500C2,\n    0x00000011, 0x0000339C, 0x00005BF5, 0x000007E1, 0x000500AB, 0x0000000F,\n    0x00002E80, 0x0000339C, 0x0000070F, 0x000500AA, 0x0000000F, 0x00004EAE,\n    0x00005BF5, 0x000008BA, 0x000600A9, 0x00000011, 0x00001DE9, 0x00004EAE,\n    0x000008CF, 0x00005BF5, 0x000600A9, 0x00000011, 0x00005A0C, 0x00002E80,\n    0x00000A50, 0x0000070F, 0x000500C6, 0x00000011, 0x00005C7A, 0x00001DE9,\n    0x00005A0C, 0x00050080, 0x00000011, 0x00005FB6, 0x00005C7A, 0x0000339C,\n    0x000500C4, 0x00000011, 0x000022AA, 0x00005FB6, 0x00000778, 0x000500C2,\n    0x00000011, 0x00003518, 0x00005FB6, 0x00000778, 0x000500C5, 0x00000011,\n    0x00005C44, 0x000022AA, 0x00003518, 0x000600A9, 0x00000011, 0x00003C69,\n    0x00002E80, 0x000007DF, 0x0000070F, 0x000500C6, 0x00000011, 0x00001E97,\n    0x00005C44, 0x00003C69, 0x00050080, 0x00000011, 0x000056A4, 0x00001E97,\n    0x0000339C, 0x000500C5, 0x00000011, 0x00004668, 0x000056A4, 0x00000373,\n    0x00050051, 0x0000000B, 0x000028D5, 0x00002374, 0x00000000, 0x00050051,\n    0x0000000B, 0x00005CB2, 0x00002374, 0x00000001, 0x00050051, 0x0000000B,\n    0x00001DD9, 0x00004668, 0x00000000, 0x00050051, 0x0000000B, 0x00001E73,\n    0x00004668, 0x00000001, 0x00070050, 0x00000017, 0x00003F21, 0x000028D5,\n    0x00005CB2, 0x00001DD9, 0x00001E73, 0x0009004F, 0x00000017, 0x00001E85,\n    0x00003F21, 0x00003F21, 0x00000000, 0x00000002, 0x00000001, 0x00000003,\n    0x0007004F, 0x00000011, 0x000021FB, 0x00004DEC, 0x00004DEC, 0x00000002,\n    0x00000003, 0x000500C7, 0x00000011, 0x00001BFF, 0x000021FB, 0x000008A5,\n    0x000500C2, 0x00000011, 0x00001AF3, 0x00001BFF, 0x000007CC, 0x000500AB,\n    0x0000000F, 0x000031A6, 0x00001AF3, 0x0000070F, 0x000500AA, 0x0000000F,\n    0x00004EAF, 0x00001BFF, 0x00000203, 0x000600A9, 0x00000011, 0x00001DEA,\n    0x00004EAF, 0x00000218, 0x00001BFF, 0x000600A9, 0x00000011, 0x00005A0D,\n    0x000031A6, 0x000008A5, 0x0000070F, 0x000500C6, 0x00000011, 0x00005C7B,\n    0x00001DEA, 0x00005A0D, 0x00050080, 0x00000011, 0x00005FB7, 0x00005C7B,\n    0x00001AF3, 0x000500C4, 0x00000011, 0x000022AB, 0x00005FB7, 0x0000078D,\n    0x000500C2, 0x00000011, 0x00003519, 0x00005FB7, 0x0000074E, 0x000500C5,\n    0x00000011, 0x00005C45, 0x000022AB, 0x00003519, 0x000600A9, 0x00000011,\n    0x00003C6A, 0x000031A6, 0x000007DF, 0x0000070F, 0x000500C6, 0x00000011,\n    0x00001E5F, 0x00005C45, 0x00003C6A, 0x00050080, 0x00000011, 0x0000616E,\n    0x00001E5F, 0x00001AF3, 0x000500C2, 0x00000011, 0x00005F11, 0x000021FB,\n    0x000007E1, 0x000500C7, 0x00000011, 0x00002E2F, 0x00005F11, 0x00000A50,\n    0x000500C2, 0x00000011, 0x000018B0, 0x00002E2F, 0x000007E1, 0x000500AB,\n    0x0000000F, 0x000031A7, 0x000018B0, 0x0000070F, 0x000500AA, 0x0000000F,\n    0x00004EB0, 0x00002E2F, 0x000008BA, 0x000600A9, 0x00000011, 0x00001DEB,\n    0x00004EB0, 0x000008CF, 0x00002E2F, 0x000600A9, 0x00000011, 0x00005A0E,\n    0x000031A7, 0x00000A50, 0x0000070F, 0x000500C6, 0x00000011, 0x00005C7C,\n    0x00001DEB, 0x00005A0E, 0x00050080, 0x00000011, 0x00005FB8, 0x00005C7C,\n    0x000018B0, 0x000500C4, 0x00000011, 0x000022AC, 0x00005FB8, 0x00000778,\n    0x000500C2, 0x00000011, 0x0000351A, 0x00005FB8, 0x00000778, 0x000500C5,\n    0x00000011, 0x00005C46, 0x000022AC, 0x0000351A, 0x000600A9, 0x00000011,\n    0x00003C6B, 0x000031A7, 0x000007DF, 0x0000070F, 0x000500C6, 0x00000011,\n    0x00001E86, 0x00005C46, 0x00003C6B, 0x00050080, 0x00000011, 0x00005FEF,\n    0x00001E86, 0x000018B0, 0x000500C4, 0x00000011, 0x00002069, 0x00005FEF,\n    0x0000085F, 0x000500C5, 0x00000011, 0x00002375, 0x0000616E, 0x00002069,\n    0x000500C2, 0x00000011, 0x00005BF6, 0x000021FB, 0x000008C8, 0x000500C2,\n    0x00000011, 0x0000339D, 0x00005BF6, 0x000007E1, 0x000500AB, 0x0000000F,\n    0x00002E81, 0x0000339D, 0x0000070F, 0x000500AA, 0x0000000F, 0x00004EB1,\n    0x00005BF6, 0x000008BA, 0x000600A9, 0x00000011, 0x00001DEC, 0x00004EB1,\n    0x000008CF, 0x00005BF6, 0x000600A9, 0x00000011, 0x00005A0F, 0x00002E81,\n    0x00000A50, 0x0000070F, 0x000500C6, 0x00000011, 0x00005C7D, 0x00001DEC,\n    0x00005A0F, 0x00050080, 0x00000011, 0x00005FB9, 0x00005C7D, 0x0000339D,\n    0x000500C4, 0x00000011, 0x000022AD, 0x00005FB9, 0x00000778, 0x000500C2,\n    0x00000011, 0x0000351B, 0x00005FB9, 0x00000778, 0x000500C5, 0x00000011,\n    0x00005C47, 0x000022AD, 0x0000351B, 0x000600A9, 0x00000011, 0x00003C6C,\n    0x00002E81, 0x000007DF, 0x0000070F, 0x000500C6, 0x00000011, 0x00001E98,\n    0x00005C47, 0x00003C6C, 0x00050080, 0x00000011, 0x000056A5, 0x00001E98,\n    0x0000339D, 0x000500C5, 0x00000011, 0x00004669, 0x000056A5, 0x00000373,\n    0x00050051, 0x0000000B, 0x000028D6, 0x00002375, 0x00000000, 0x00050051,\n    0x0000000B, 0x00005CB3, 0x00002375, 0x00000001, 0x00050051, 0x0000000B,\n    0x00001DDA, 0x00004669, 0x00000000, 0x00050051, 0x0000000B, 0x00001E74,\n    0x00004669, 0x00000001, 0x00070050, 0x00000017, 0x000047AA, 0x000028D6,\n    0x00005CB3, 0x00001DDA, 0x00001E74, 0x0009004F, 0x00000017, 0x00005BD9,\n    0x000047AA, 0x000047AA, 0x00000000, 0x00000002, 0x00000001, 0x00000003,\n    0x000500C2, 0x0000000B, 0x00003B60, 0x000038F6, 0x00000A17, 0x00060041,\n    0x00000294, 0x00002306, 0x0000140E, 0x00000A0B, 0x00003B60, 0x0003003E,\n    0x00002306, 0x00001E85, 0x00050080, 0x0000000B, 0x0000204C, 0x000038F6,\n    0x00000A3A, 0x000500C2, 0x0000000B, 0x000019FD, 0x0000204C, 0x00000A17,\n    0x00060041, 0x00000294, 0x000054B9, 0x0000140E, 0x00000A0B, 0x000019FD,\n    0x0003003E, 0x000054B9, 0x00005BD9, 0x000300F7, 0x00006070, 0x00000002,\n    0x000400FA, 0x00004376, 0x000055E9, 0x00001C25, 0x000200F8, 0x000055E9,\n    0x000200F9, 0x00006070, 0x000200F8, 0x00001C25, 0x000200F9, 0x00006070,\n    0x000200F8, 0x00006070, 0x000700F5, 0x0000000B, 0x00002C71, 0x00000A6A,\n    0x000055E9, 0x00000A3A, 0x00001C25, 0x00050080, 0x0000000B, 0x000048BE,\n    0x000048BD, 0x00002C71, 0x000500C2, 0x0000000B, 0x00003D53, 0x000048BE,\n    0x00000A17, 0x00060041, 0x00000294, 0x00005566, 0x0000107A, 0x00000A0B,\n    0x00003D53, 0x0004003D, 0x00000017, 0x00003910, 0x00005566, 0x000300F7,\n    0x00003A1A, 0x00000000, 0x000400FA, 0x00005686, 0x00002958, 0x00003A1A,\n    0x000200F8, 0x00002958, 0x000500C7, 0x00000017, 0x00004760, 0x00003910,\n    0x000009CE, 0x000500C4, 0x00000017, 0x000024D2, 0x00004760, 0x0000013D,\n    0x000500C7, 0x00000017, 0x000050AD, 0x00003910, 0x0000072E, 0x000500C2,\n    0x00000017, 0x0000448E, 0x000050AD, 0x0000013D, 0x000500C5, 0x00000017,\n    0x00003FF9, 0x000024D2, 0x0000448E, 0x000200F9, 0x00003A1A, 0x000200F8,\n    0x00003A1A, 0x000700F5, 0x00000017, 0x00002AAC, 0x00003910, 0x00006070,\n    0x00003FF9, 0x00002958, 0x000300F7, 0x00002DA3, 0x00000000, 0x000400FA,\n    0x00003B23, 0x00002B39, 0x00002DA3, 0x000200F8, 0x00002B39, 0x000500C4,\n    0x00000017, 0x00005E18, 0x00002AAC, 0x000002ED, 0x000500C2, 0x00000017,\n    0x00003BE8, 0x00002AAC, 0x000002ED, 0x000500C5, 0x00000017, 0x000029E9,\n    0x00005E18, 0x00003BE8, 0x000200F9, 0x00002DA3, 0x000200F8, 0x00002DA3,\n    0x000700F5, 0x00000017, 0x00004DED, 0x00002AAC, 0x00003A1A, 0x000029E9,\n    0x00002B39, 0x0007004F, 0x00000011, 0x000052B6, 0x00004DED, 0x00004DED,\n    0x00000000, 0x00000001, 0x000500C7, 0x00000011, 0x00002FAF, 0x000052B6,\n    0x000008A5, 0x000500C2, 0x00000011, 0x00001AF4, 0x00002FAF, 0x000007CC,\n    0x000500AB, 0x0000000F, 0x000031A8, 0x00001AF4, 0x0000070F, 0x000500AA,\n    0x0000000F, 0x00004EB2, 0x00002FAF, 0x00000203, 0x000600A9, 0x00000011,\n    0x00001DED, 0x00004EB2, 0x00000218, 0x00002FAF, 0x000600A9, 0x00000011,\n    0x00005A10, 0x000031A8, 0x000008A5, 0x0000070F, 0x000500C6, 0x00000011,\n    0x00005C7E, 0x00001DED, 0x00005A10, 0x00050080, 0x00000011, 0x00005FBA,\n    0x00005C7E, 0x00001AF4, 0x000500C4, 0x00000011, 0x000022AE, 0x00005FBA,\n    0x0000078D, 0x000500C2, 0x00000011, 0x0000351C, 0x00005FBA, 0x0000074E,\n    0x000500C5, 0x00000011, 0x00005C48, 0x000022AE, 0x0000351C, 0x000600A9,\n    0x00000011, 0x00003C6D, 0x000031A8, 0x000007DF, 0x0000070F, 0x000500C6,\n    0x00000011, 0x00001E60, 0x00005C48, 0x00003C6D, 0x00050080, 0x00000011,\n    0x0000616F, 0x00001E60, 0x00001AF4, 0x000500C2, 0x00000011, 0x00005F12,\n    0x000052B6, 0x000007E1, 0x000500C7, 0x00000011, 0x00002E30, 0x00005F12,\n    0x00000A50, 0x000500C2, 0x00000011, 0x000018B1, 0x00002E30, 0x000007E1,\n    0x000500AB, 0x0000000F, 0x000031A9, 0x000018B1, 0x0000070F, 0x000500AA,\n    0x0000000F, 0x00004EB3, 0x00002E30, 0x000008BA, 0x000600A9, 0x00000011,\n    0x00001DEE, 0x00004EB3, 0x000008CF, 0x00002E30, 0x000600A9, 0x00000011,\n    0x00005A11, 0x000031A9, 0x00000A50, 0x0000070F, 0x000500C6, 0x00000011,\n    0x00005C7F, 0x00001DEE, 0x00005A11, 0x00050080, 0x00000011, 0x00005FBB,\n    0x00005C7F, 0x000018B1, 0x000500C4, 0x00000011, 0x000022AF, 0x00005FBB,\n    0x00000778, 0x000500C2, 0x00000011, 0x0000351D, 0x00005FBB, 0x00000778,\n    0x000500C5, 0x00000011, 0x00005C49, 0x000022AF, 0x0000351D, 0x000600A9,\n    0x00000011, 0x00003C6E, 0x000031A9, 0x000007DF, 0x0000070F, 0x000500C6,\n    0x00000011, 0x00001E87, 0x00005C49, 0x00003C6E, 0x00050080, 0x00000011,\n    0x00005FF0, 0x00001E87, 0x000018B1, 0x000500C4, 0x00000011, 0x0000206A,\n    0x00005FF0, 0x0000085F, 0x000500C5, 0x00000011, 0x00002376, 0x0000616F,\n    0x0000206A, 0x000500C2, 0x00000011, 0x00005BF7, 0x000052B6, 0x000008C8,\n    0x000500C2, 0x00000011, 0x0000339E, 0x00005BF7, 0x000007E1, 0x000500AB,\n    0x0000000F, 0x00002E82, 0x0000339E, 0x0000070F, 0x000500AA, 0x0000000F,\n    0x00004EB4, 0x00005BF7, 0x000008BA, 0x000600A9, 0x00000011, 0x00001DEF,\n    0x00004EB4, 0x000008CF, 0x00005BF7, 0x000600A9, 0x00000011, 0x00005A12,\n    0x00002E82, 0x00000A50, 0x0000070F, 0x000500C6, 0x00000011, 0x00005C80,\n    0x00001DEF, 0x00005A12, 0x00050080, 0x00000011, 0x00005FBC, 0x00005C80,\n    0x0000339E, 0x000500C4, 0x00000011, 0x000022B0, 0x00005FBC, 0x00000778,\n    0x000500C2, 0x00000011, 0x0000351E, 0x00005FBC, 0x00000778, 0x000500C5,\n    0x00000011, 0x00005C4A, 0x000022B0, 0x0000351E, 0x000600A9, 0x00000011,\n    0x00003C6F, 0x00002E82, 0x000007DF, 0x0000070F, 0x000500C6, 0x00000011,\n    0x00001E99, 0x00005C4A, 0x00003C6F, 0x00050080, 0x00000011, 0x000056A6,\n    0x00001E99, 0x0000339E, 0x000500C5, 0x00000011, 0x0000466A, 0x000056A6,\n    0x00000373, 0x00050051, 0x0000000B, 0x000028D7, 0x00002376, 0x00000000,\n    0x00050051, 0x0000000B, 0x00005CB4, 0x00002376, 0x00000001, 0x00050051,\n    0x0000000B, 0x00001DDB, 0x0000466A, 0x00000000, 0x00050051, 0x0000000B,\n    0x00001E75, 0x0000466A, 0x00000001, 0x00070050, 0x00000017, 0x00003F22,\n    0x000028D7, 0x00005CB4, 0x00001DDB, 0x00001E75, 0x0009004F, 0x00000017,\n    0x00001E88, 0x00003F22, 0x00003F22, 0x00000000, 0x00000002, 0x00000001,\n    0x00000003, 0x0007004F, 0x00000011, 0x000021FC, 0x00004DED, 0x00004DED,\n    0x00000002, 0x00000003, 0x000500C7, 0x00000011, 0x00001C02, 0x000021FC,\n    0x000008A5, 0x000500C2, 0x00000011, 0x00001AF5, 0x00001C02, 0x000007CC,\n    0x000500AB, 0x0000000F, 0x000031AA, 0x00001AF5, 0x0000070F, 0x000500AA,\n    0x0000000F, 0x00004EB5, 0x00001C02, 0x00000203, 0x000600A9, 0x00000011,\n    0x00001DF0, 0x00004EB5, 0x00000218, 0x00001C02, 0x000600A9, 0x00000011,\n    0x00005A13, 0x000031AA, 0x000008A5, 0x0000070F, 0x000500C6, 0x00000011,\n    0x00005C81, 0x00001DF0, 0x00005A13, 0x00050080, 0x00000011, 0x00005FBD,\n    0x00005C81, 0x00001AF5, 0x000500C4, 0x00000011, 0x000022B1, 0x00005FBD,\n    0x0000078D, 0x000500C2, 0x00000011, 0x0000351F, 0x00005FBD, 0x0000074E,\n    0x000500C5, 0x00000011, 0x00005C4B, 0x000022B1, 0x0000351F, 0x000600A9,\n    0x00000011, 0x00003C72, 0x000031AA, 0x000007DF, 0x0000070F, 0x000500C6,\n    0x00000011, 0x00001E61, 0x00005C4B, 0x00003C72, 0x00050080, 0x00000011,\n    0x00006170, 0x00001E61, 0x00001AF5, 0x000500C2, 0x00000011, 0x00005F13,\n    0x000021FC, 0x000007E1, 0x000500C7, 0x00000011, 0x00002E31, 0x00005F13,\n    0x00000A50, 0x000500C2, 0x00000011, 0x000018B2, 0x00002E31, 0x000007E1,\n    0x000500AB, 0x0000000F, 0x000031AB, 0x000018B2, 0x0000070F, 0x000500AA,\n    0x0000000F, 0x00004EB6, 0x00002E31, 0x000008BA, 0x000600A9, 0x00000011,\n    0x00001DF1, 0x00004EB6, 0x000008CF, 0x00002E31, 0x000600A9, 0x00000011,\n    0x00005A14, 0x000031AB, 0x00000A50, 0x0000070F, 0x000500C6, 0x00000011,\n    0x00005C82, 0x00001DF1, 0x00005A14, 0x00050080, 0x00000011, 0x00005FBE,\n    0x00005C82, 0x000018B2, 0x000500C4, 0x00000011, 0x000022B2, 0x00005FBE,\n    0x00000778, 0x000500C2, 0x00000011, 0x00003520, 0x00005FBE, 0x00000778,\n    0x000500C5, 0x00000011, 0x00005C4C, 0x000022B2, 0x00003520, 0x000600A9,\n    0x00000011, 0x00003C73, 0x000031AB, 0x000007DF, 0x0000070F, 0x000500C6,\n    0x00000011, 0x00001E89, 0x00005C4C, 0x00003C73, 0x00050080, 0x00000011,\n    0x00005FF1, 0x00001E89, 0x000018B2, 0x000500C4, 0x00000011, 0x0000206B,\n    0x00005FF1, 0x0000085F, 0x000500C5, 0x00000011, 0x00002377, 0x00006170,\n    0x0000206B, 0x000500C2, 0x00000011, 0x00005BF8, 0x000021FC, 0x000008C8,\n    0x000500C2, 0x00000011, 0x0000339F, 0x00005BF8, 0x000007E1, 0x000500AB,\n    0x0000000F, 0x00002E83, 0x0000339F, 0x0000070F, 0x000500AA, 0x0000000F,\n    0x00004EB7, 0x00005BF8, 0x000008BA, 0x000600A9, 0x00000011, 0x00001DF2,\n    0x00004EB7, 0x000008CF, 0x00005BF8, 0x000600A9, 0x00000011, 0x00005A15,\n    0x00002E83, 0x00000A50, 0x0000070F, 0x000500C6, 0x00000011, 0x00005C83,\n    0x00001DF2, 0x00005A15, 0x00050080, 0x00000011, 0x00005FBF, 0x00005C83,\n    0x0000339F, 0x000500C4, 0x00000011, 0x000022B3, 0x00005FBF, 0x00000778,\n    0x000500C2, 0x00000011, 0x00003521, 0x00005FBF, 0x00000778, 0x000500C5,\n    0x00000011, 0x00005C4D, 0x000022B3, 0x00003521, 0x000600A9, 0x00000011,\n    0x00003C74, 0x00002E83, 0x000007DF, 0x0000070F, 0x000500C6, 0x00000011,\n    0x00001E9A, 0x00005C4D, 0x00003C74, 0x00050080, 0x00000011, 0x000056A7,\n    0x00001E9A, 0x0000339F, 0x000500C5, 0x00000011, 0x0000466B, 0x000056A7,\n    0x00000373, 0x00050051, 0x0000000B, 0x000028D8, 0x00002377, 0x00000000,\n    0x00050051, 0x0000000B, 0x00005CB5, 0x00002377, 0x00000001, 0x00050051,\n    0x0000000B, 0x00001DDC, 0x0000466B, 0x00000000, 0x00050051, 0x0000000B,\n    0x00001E76, 0x0000466B, 0x00000001, 0x00070050, 0x00000017, 0x000042C4,\n    0x000028D8, 0x00005CB5, 0x00001DDC, 0x00001E76, 0x0009004F, 0x00000017,\n    0x00004787, 0x000042C4, 0x000042C4, 0x00000000, 0x00000002, 0x00000001,\n    0x00000003, 0x00050080, 0x0000000B, 0x00004949, 0x000038F6, 0x00000A6A,\n    0x000500C2, 0x0000000B, 0x000029B6, 0x00004949, 0x00000A17, 0x00060041,\n    0x00000294, 0x00004BE4, 0x0000140E, 0x00000A0B, 0x000029B6, 0x0003003E,\n    0x00004BE4, 0x00001E88, 0x00050080, 0x0000000B, 0x0000204D, 0x000038F6,\n    0x00000A9A, 0x000500C2, 0x0000000B, 0x000019FE, 0x0000204D, 0x00000A17,\n    0x00060041, 0x00000294, 0x000054DF, 0x0000140E, 0x00000A0B, 0x000019FE,\n    0x0003003E, 0x000054DF, 0x00004787, 0x000200F9, 0x00004C7A, 0x000200F8,\n    0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_r10g11b11_rgba16_snorm_scaled_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25157\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n     %v4uint = OpTypeVector %uint 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v3uint = OpTypeVector %uint 3\n     %uint_9 = OpConstant %uint 9\n     %v2bool = OpTypeVector %bool 2\n     %uint_0 = OpConstant %uint 0\n   %uint_513 = OpConstant %uint 513\n   %uint_512 = OpConstant %uint 512\n  %uint_1023 = OpConstant %uint 1023\n     %uint_6 = OpConstant %uint 6\n     %uint_3 = OpConstant %uint 3\n %uint_65535 = OpConstant %uint 65535\n    %uint_10 = OpConstant %uint 10\n  %uint_1025 = OpConstant %uint 1025\n  %uint_1024 = OpConstant %uint 1024\n  %uint_2047 = OpConstant %uint 2047\n     %uint_5 = OpConstant %uint 5\n    %uint_16 = OpConstant %uint 16\n    %uint_21 = OpConstant %uint 21\n%uint_2147418112 = OpConstant %uint 2147418112\n     %uint_1 = OpConstant %uint 1\n     %uint_2 = OpConstant %uint 2\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n      %int_3 = OpConstant %int 3\n      %int_2 = OpConstant %int 2\n     %uint_4 = OpConstant %uint 4\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n     %uint_7 = OpConstant %uint 7\n       %1927 = OpConstantComposite %v2uint %uint_4 %uint_7\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %2603 = OpConstantComposite %v3uint %uint_3 %uint_0 %uint_0\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n    %uint_32 = OpConstant %uint 32\n    %uint_48 = OpConstant %uint 48\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %1954 = OpConstantComposite %v2uint %uint_7 %uint_7\n       %1855 = OpConstantComposite %v2uint %uint_4 %uint_1\n    %uint_15 = OpConstant %uint 15\n       %1955 = OpConstantComposite %v2uint %uint_15 %uint_1\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n       %2213 = OpConstantComposite %v2uint %uint_1023 %uint_1023\n       %1996 = OpConstantComposite %v2uint %uint_9 %uint_9\n       %1807 = OpConstantComposite %v2uint %uint_0 %uint_0\n        %536 = OpConstantComposite %v2uint %uint_513 %uint_513\n        %515 = OpConstantComposite %v2uint %uint_512 %uint_512\n       %1933 = OpConstantComposite %v2uint %uint_6 %uint_6\n       %1870 = OpConstantComposite %v2uint %uint_3 %uint_3\n       %2015 = OpConstantComposite %v2uint %uint_65535 %uint_65535\n       %2017 = OpConstantComposite %v2uint %uint_10 %uint_10\n       %2640 = OpConstantComposite %v2uint %uint_2047 %uint_2047\n       %2255 = OpConstantComposite %v2uint %uint_1025 %uint_1025\n       %2234 = OpConstantComposite %v2uint %uint_1024 %uint_1024\n       %1912 = OpConstantComposite %v2uint %uint_5 %uint_5\n       %2143 = OpConstantComposite %v2uint %uint_16 %uint_16\n       %2248 = OpConstantComposite %v2uint %uint_21 %uint_21\n        %883 = OpConstantComposite %v2uint %uint_2147418112 %uint_2147418112\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24445 = OpBitwiseAnd %uint %13606 %uint_2\n      %18667 = OpINotEqual %bool %24445 %uint_0\n       %8141 = OpShiftRightLogical %uint %13606 %uint_2\n      %24990 = OpBitwiseAnd %uint %8141 %uint_3\n       %8871 = OpCompositeConstruct %v2uint %13606 %13606\n       %7087 = OpShiftRightLogical %v2uint %8871 %1927\n       %6551 = OpBitwiseAnd %v2uint %7087 %1954\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2603\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %6586 DontFlatten\n               OpBranchConditional %24679 %21992 %6586\n      %21992 = OpLabel\n               OpBranch %19578\n       %6586 = OpLabel\n      %23478 = OpBitcast %v3int %21387\n      %18710 = OpCompositeExtract %uint %22410 1\n      %23531 = OpCompositeExtract %int %23478 0\n      %22810 = OpIMul %int %23531 %int_8\n       %6362 = OpCompositeExtract %int %23478 2\n      %14505 = OpBitcast %int %18710\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %23478 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %6594\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %22810 %24535\n      %10898 = OpBitcast %uint %8258\n       %7937 = OpIAdd %uint %22411 %10898\n      %19921 = OpShiftRightLogical %v2uint %17136 %1855\n       %7712 = OpUDiv %v2uint %19921 %6551\n      %18183 = OpIMul %v2uint %6551 %7712\n      %18273 = OpISub %v2uint %19921 %18183\n      %11232 = OpShiftLeftLogical %v2uint %7712 %1855\n      %13284 = OpCompositeExtract %uint %18273 0\n      %10872 = OpCompositeExtract %uint %6551 1\n      %22886 = OpIMul %uint %13284 %10872\n       %6943 = OpCompositeExtract %uint %18273 1\n      %10469 = OpIAdd %uint %22886 %6943\n      %18851 = OpBitwiseAnd %v2uint %17136 %1955\n      %10581 = OpShiftLeftLogical %uint %10469 %uint_7\n      %20916 = OpCompositeExtract %uint %18851 1\n      %23596 = OpShiftLeftLogical %uint %20916 %uint_6\n      %19814 = OpBitwiseOr %uint %10581 %23596\n      %21476 = OpCompositeExtract %uint %18851 0\n       %8560 = OpShiftLeftLogical %uint %21476 %uint_2\n      %17648 = OpBitwiseOr %uint %19814 %8560\n      %19923 = OpCompositeExtract %uint %11232 0\n      %15556 = OpCompositeInsert %v3uint %19923 %21387 0\n      %23006 = OpCompositeExtract %uint %11232 1\n       %9680 = OpCompositeInsert %v3uint %23006 %15556 1\n               OpSelectionMerge %20344 DontFlatten\n               OpBranchConditional %18667 %23520 %11737\n      %23520 = OpLabel\n      %10111 = OpBitcast %v3int %9680\n      %19476 = OpShiftRightLogical %uint %22408 %int_5\n      %18810 = OpShiftRightLogical %uint %22409 %int_4\n       %6782 = OpCompositeExtract %int %10111 2\n      %12089 = OpShiftRightArithmetic %int %6782 %int_2\n      %22400 = OpBitcast %int %18810\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %10111 1\n      %19055 = OpShiftRightArithmetic %int %25154 %int_4\n      %11052 = OpIAdd %int %7938 %19055\n      %16898 = OpBitcast %int %19476\n      %14944 = OpIMul %int %11052 %16898\n      %25155 = OpCompositeExtract %int %10111 0\n      %20423 = OpShiftRightArithmetic %int %25155 %int_5\n      %18940 = OpIAdd %int %14944 %20423\n       %8797 = OpShiftLeftLogical %int %18940 %int_7\n      %11434 = OpBitwiseAnd %int %6782 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %25154 %int_1\n      %21364 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21364 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %25155 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17334 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17334 %uint_2\n      %13015 = OpShiftRightArithmetic %int %25154 %int_3\n       %9929 = OpBitwiseXor %int %13015 %12089\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %25155 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %25154 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6552 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6552\n       %7168 = OpShiftLeftLogical %int %16793 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24144 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24144 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24144 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24144 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %20344\n      %11737 = OpLabel\n      %11908 = OpVectorShuffle %v2uint %9680 %9680 0 1\n      %20347 = OpBitcast %v2int %11908\n      %11433 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %20347 1\n      %12090 = OpShiftRightArithmetic %int %14597 %int_5\n      %22401 = OpBitcast %int %11433\n       %7939 = OpIMul %int %12090 %22401\n      %25156 = OpCompositeExtract %int %20347 0\n      %20424 = OpShiftRightArithmetic %int %25156 %int_5\n      %18864 = OpIAdd %int %7939 %20424\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25156 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17335 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17335 %uint_2\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25156 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6553 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6553\n       %7169 = OpShiftLeftLogical %int %21575 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24163 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24163 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24163 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %20344\n      %20344 = OpLabel\n      %18329 = OpPhi %uint %16869 %23520 %16870 %11737\n      %15200 = OpCompositeExtract %uint %6551 0\n      %17489 = OpIMul %uint %15200 %10872\n       %7313 = OpIMul %uint %18329 %17489\n       %8815 = OpIAdd %uint %7313 %17648\n      %21470 = OpIAdd %uint %8815 %24236\n      %14664 = OpShiftRightLogical %uint %21470 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %14664\n       %7338 = OpLoad %v4uint %20399\n      %13760 = OpIEqual %bool %24990 %uint_1\n      %21366 = OpIEqual %bool %24990 %uint_2\n      %22150 = OpLogicalOr %bool %13760 %21366\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %7338 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %7338 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22649 = OpPhi %v4uint %7338 %20344 %16376 %10583\n      %19638 = OpIEqual %bool %24990 %uint_3\n      %15139 = OpLogicalOr %bool %21366 %19638\n               OpSelectionMerge %11682 None\n               OpBranchConditional %15139 %11064 %11682\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22649 %749\n      %15335 = OpShiftRightLogical %v4uint %22649 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %11682\n      %11682 = OpLabel\n      %19948 = OpPhi %v4uint %22649 %13411 %10728 %11064\n      %21173 = OpVectorShuffle %v2uint %19948 %19948 0 1\n      %12206 = OpBitwiseAnd %v2uint %21173 %2213\n       %6898 = OpShiftRightLogical %v2uint %12206 %1996\n      %12708 = OpINotEqual %v2bool %6898 %1807\n      %20140 = OpIEqual %v2bool %12206 %515\n       %7655 = OpSelect %v2uint %20140 %536 %12206\n      %23050 = OpSelect %v2uint %12708 %2213 %1807\n      %23672 = OpBitwiseXor %v2uint %7655 %23050\n      %24500 = OpIAdd %v2uint %23672 %6898\n       %8872 = OpShiftLeftLogical %v2uint %24500 %1933\n      %13590 = OpShiftRightLogical %v2uint %24500 %1870\n      %23618 = OpBitwiseOr %v2uint %8872 %13590\n      %15463 = OpSelect %v2uint %12708 %2015 %1807\n       %7774 = OpBitwiseXor %v2uint %23618 %15463\n      %24941 = OpIAdd %v2uint %7774 %6898\n      %24336 = OpShiftRightLogical %v2uint %21173 %2017\n      %11822 = OpBitwiseAnd %v2uint %24336 %2640\n       %6319 = OpShiftRightLogical %v2uint %11822 %2017\n      %12709 = OpINotEqual %v2bool %6319 %1807\n      %20141 = OpIEqual %v2bool %11822 %2234\n       %7656 = OpSelect %v2uint %20141 %2255 %11822\n      %23051 = OpSelect %v2uint %12709 %2640 %1807\n      %23673 = OpBitwiseXor %v2uint %7656 %23051\n      %24501 = OpIAdd %v2uint %23673 %6319\n       %8873 = OpShiftLeftLogical %v2uint %24501 %1912\n      %13591 = OpShiftRightLogical %v2uint %24501 %1912\n      %23619 = OpBitwiseOr %v2uint %8873 %13591\n      %15464 = OpSelect %v2uint %12709 %2015 %1807\n       %7812 = OpBitwiseXor %v2uint %23619 %15464\n      %24557 = OpIAdd %v2uint %7812 %6319\n       %8296 = OpShiftLeftLogical %v2uint %24557 %2143\n       %9076 = OpBitwiseOr %v2uint %24941 %8296\n      %23541 = OpShiftRightLogical %v2uint %21173 %2248\n      %13212 = OpShiftRightLogical %v2uint %23541 %2017\n      %11904 = OpINotEqual %v2bool %13212 %1807\n      %20142 = OpIEqual %v2bool %23541 %2234\n       %7657 = OpSelect %v2uint %20142 %2255 %23541\n      %23052 = OpSelect %v2uint %11904 %2640 %1807\n      %23674 = OpBitwiseXor %v2uint %7657 %23052\n      %24502 = OpIAdd %v2uint %23674 %13212\n       %8874 = OpShiftLeftLogical %v2uint %24502 %1912\n      %13592 = OpShiftRightLogical %v2uint %24502 %1912\n      %23620 = OpBitwiseOr %v2uint %8874 %13592\n      %15465 = OpSelect %v2uint %11904 %2015 %1807\n       %7831 = OpBitwiseXor %v2uint %23620 %15465\n      %22180 = OpIAdd %v2uint %7831 %13212\n      %18024 = OpBitwiseOr %v2uint %22180 %883\n      %10453 = OpCompositeExtract %uint %9076 0\n      %23730 = OpCompositeExtract %uint %9076 1\n       %7641 = OpCompositeExtract %uint %18024 0\n       %7795 = OpCompositeExtract %uint %18024 1\n      %16161 = OpCompositeConstruct %v4uint %10453 %23730 %7641 %7795\n       %7813 = OpVectorShuffle %v4uint %16161 %16161 0 2 1 3\n       %8699 = OpVectorShuffle %v2uint %19948 %19948 2 3\n       %7167 = OpBitwiseAnd %v2uint %8699 %2213\n       %6899 = OpShiftRightLogical %v2uint %7167 %1996\n      %12710 = OpINotEqual %v2bool %6899 %1807\n      %20143 = OpIEqual %v2bool %7167 %515\n       %7658 = OpSelect %v2uint %20143 %536 %7167\n      %23053 = OpSelect %v2uint %12710 %2213 %1807\n      %23675 = OpBitwiseXor %v2uint %7658 %23053\n      %24503 = OpIAdd %v2uint %23675 %6899\n       %8875 = OpShiftLeftLogical %v2uint %24503 %1933\n      %13593 = OpShiftRightLogical %v2uint %24503 %1870\n      %23621 = OpBitwiseOr %v2uint %8875 %13593\n      %15466 = OpSelect %v2uint %12710 %2015 %1807\n       %7775 = OpBitwiseXor %v2uint %23621 %15466\n      %24942 = OpIAdd %v2uint %7775 %6899\n      %24337 = OpShiftRightLogical %v2uint %8699 %2017\n      %11823 = OpBitwiseAnd %v2uint %24337 %2640\n       %6320 = OpShiftRightLogical %v2uint %11823 %2017\n      %12711 = OpINotEqual %v2bool %6320 %1807\n      %20144 = OpIEqual %v2bool %11823 %2234\n       %7659 = OpSelect %v2uint %20144 %2255 %11823\n      %23054 = OpSelect %v2uint %12711 %2640 %1807\n      %23676 = OpBitwiseXor %v2uint %7659 %23054\n      %24504 = OpIAdd %v2uint %23676 %6320\n       %8876 = OpShiftLeftLogical %v2uint %24504 %1912\n      %13594 = OpShiftRightLogical %v2uint %24504 %1912\n      %23622 = OpBitwiseOr %v2uint %8876 %13594\n      %15467 = OpSelect %v2uint %12711 %2015 %1807\n       %7814 = OpBitwiseXor %v2uint %23622 %15467\n      %24558 = OpIAdd %v2uint %7814 %6320\n       %8297 = OpShiftLeftLogical %v2uint %24558 %2143\n       %9077 = OpBitwiseOr %v2uint %24942 %8297\n      %23542 = OpShiftRightLogical %v2uint %8699 %2248\n      %13213 = OpShiftRightLogical %v2uint %23542 %2017\n      %11905 = OpINotEqual %v2bool %13213 %1807\n      %20145 = OpIEqual %v2bool %23542 %2234\n       %7660 = OpSelect %v2uint %20145 %2255 %23542\n      %23055 = OpSelect %v2uint %11905 %2640 %1807\n      %23677 = OpBitwiseXor %v2uint %7660 %23055\n      %24505 = OpIAdd %v2uint %23677 %13213\n       %8877 = OpShiftLeftLogical %v2uint %24505 %1912\n      %13595 = OpShiftRightLogical %v2uint %24505 %1912\n      %23623 = OpBitwiseOr %v2uint %8877 %13595\n      %15468 = OpSelect %v2uint %11905 %2015 %1807\n       %7832 = OpBitwiseXor %v2uint %23623 %15468\n      %22181 = OpIAdd %v2uint %7832 %13213\n      %18025 = OpBitwiseOr %v2uint %22181 %883\n      %10454 = OpCompositeExtract %uint %9077 0\n      %23731 = OpCompositeExtract %uint %9077 1\n       %7642 = OpCompositeExtract %uint %18025 0\n       %7796 = OpCompositeExtract %uint %18025 1\n      %18346 = OpCompositeConstruct %v4uint %10454 %23731 %7642 %7796\n      %23513 = OpVectorShuffle %v4uint %18346 %18346 0 2 1 3\n      %15201 = OpShiftRightLogical %uint %7937 %int_4\n       %8966 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %15201\n               OpStore %8966 %7813\n       %8268 = OpIAdd %uint %7937 %uint_16\n       %6653 = OpShiftRightLogical %uint %8268 %int_4\n      %19428 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %6653\n               OpStore %19428 %23513\n       %8269 = OpIAdd %uint %21470 %uint_16\n       %6634 = OpShiftRightLogical %uint %8269 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %6634\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %14874 None\n               OpBranchConditional %22150 %10584 %14874\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %14874\n      %14874 = OpLabel\n      %10924 = OpPhi %v4uint %14608 %11682 %16377 %10584\n               OpSelectionMerge %11683 None\n               OpBranchConditional %15139 %11065 %11683\n      %11065 = OpLabel\n      %24088 = OpShiftLeftLogical %v4uint %10924 %749\n      %15336 = OpShiftRightLogical %v4uint %10924 %749\n      %10729 = OpBitwiseOr %v4uint %24088 %15336\n               OpBranch %11683\n      %11683 = OpLabel\n      %19949 = OpPhi %v4uint %10924 %14874 %10729 %11065\n      %21174 = OpVectorShuffle %v2uint %19949 %19949 0 1\n      %12207 = OpBitwiseAnd %v2uint %21174 %2213\n       %6900 = OpShiftRightLogical %v2uint %12207 %1996\n      %12712 = OpINotEqual %v2bool %6900 %1807\n      %20146 = OpIEqual %v2bool %12207 %515\n       %7661 = OpSelect %v2uint %20146 %536 %12207\n      %23056 = OpSelect %v2uint %12712 %2213 %1807\n      %23678 = OpBitwiseXor %v2uint %7661 %23056\n      %24506 = OpIAdd %v2uint %23678 %6900\n       %8878 = OpShiftLeftLogical %v2uint %24506 %1933\n      %13596 = OpShiftRightLogical %v2uint %24506 %1870\n      %23624 = OpBitwiseOr %v2uint %8878 %13596\n      %15469 = OpSelect %v2uint %12712 %2015 %1807\n       %7776 = OpBitwiseXor %v2uint %23624 %15469\n      %24943 = OpIAdd %v2uint %7776 %6900\n      %24338 = OpShiftRightLogical %v2uint %21174 %2017\n      %11824 = OpBitwiseAnd %v2uint %24338 %2640\n       %6321 = OpShiftRightLogical %v2uint %11824 %2017\n      %12713 = OpINotEqual %v2bool %6321 %1807\n      %20147 = OpIEqual %v2bool %11824 %2234\n       %7662 = OpSelect %v2uint %20147 %2255 %11824\n      %23057 = OpSelect %v2uint %12713 %2640 %1807\n      %23679 = OpBitwiseXor %v2uint %7662 %23057\n      %24507 = OpIAdd %v2uint %23679 %6321\n       %8879 = OpShiftLeftLogical %v2uint %24507 %1912\n      %13597 = OpShiftRightLogical %v2uint %24507 %1912\n      %23625 = OpBitwiseOr %v2uint %8879 %13597\n      %15470 = OpSelect %v2uint %12713 %2015 %1807\n       %7815 = OpBitwiseXor %v2uint %23625 %15470\n      %24559 = OpIAdd %v2uint %7815 %6321\n       %8298 = OpShiftLeftLogical %v2uint %24559 %2143\n       %9078 = OpBitwiseOr %v2uint %24943 %8298\n      %23543 = OpShiftRightLogical %v2uint %21174 %2248\n      %13214 = OpShiftRightLogical %v2uint %23543 %2017\n      %11906 = OpINotEqual %v2bool %13214 %1807\n      %20148 = OpIEqual %v2bool %23543 %2234\n       %7663 = OpSelect %v2uint %20148 %2255 %23543\n      %23058 = OpSelect %v2uint %11906 %2640 %1807\n      %23680 = OpBitwiseXor %v2uint %7663 %23058\n      %24508 = OpIAdd %v2uint %23680 %13214\n       %8880 = OpShiftLeftLogical %v2uint %24508 %1912\n      %13598 = OpShiftRightLogical %v2uint %24508 %1912\n      %23626 = OpBitwiseOr %v2uint %8880 %13598\n      %15471 = OpSelect %v2uint %11906 %2015 %1807\n       %7833 = OpBitwiseXor %v2uint %23626 %15471\n      %22182 = OpIAdd %v2uint %7833 %13214\n      %18026 = OpBitwiseOr %v2uint %22182 %883\n      %10455 = OpCompositeExtract %uint %9078 0\n      %23732 = OpCompositeExtract %uint %9078 1\n       %7643 = OpCompositeExtract %uint %18026 0\n       %7797 = OpCompositeExtract %uint %18026 1\n      %16162 = OpCompositeConstruct %v4uint %10455 %23732 %7643 %7797\n       %7816 = OpVectorShuffle %v4uint %16162 %16162 0 2 1 3\n       %8700 = OpVectorShuffle %v2uint %19949 %19949 2 3\n       %7170 = OpBitwiseAnd %v2uint %8700 %2213\n       %6901 = OpShiftRightLogical %v2uint %7170 %1996\n      %12714 = OpINotEqual %v2bool %6901 %1807\n      %20149 = OpIEqual %v2bool %7170 %515\n       %7664 = OpSelect %v2uint %20149 %536 %7170\n      %23059 = OpSelect %v2uint %12714 %2213 %1807\n      %23681 = OpBitwiseXor %v2uint %7664 %23059\n      %24509 = OpIAdd %v2uint %23681 %6901\n       %8881 = OpShiftLeftLogical %v2uint %24509 %1933\n      %13599 = OpShiftRightLogical %v2uint %24509 %1870\n      %23627 = OpBitwiseOr %v2uint %8881 %13599\n      %15474 = OpSelect %v2uint %12714 %2015 %1807\n       %7777 = OpBitwiseXor %v2uint %23627 %15474\n      %24944 = OpIAdd %v2uint %7777 %6901\n      %24339 = OpShiftRightLogical %v2uint %8700 %2017\n      %11825 = OpBitwiseAnd %v2uint %24339 %2640\n       %6322 = OpShiftRightLogical %v2uint %11825 %2017\n      %12715 = OpINotEqual %v2bool %6322 %1807\n      %20150 = OpIEqual %v2bool %11825 %2234\n       %7665 = OpSelect %v2uint %20150 %2255 %11825\n      %23060 = OpSelect %v2uint %12715 %2640 %1807\n      %23682 = OpBitwiseXor %v2uint %7665 %23060\n      %24510 = OpIAdd %v2uint %23682 %6322\n       %8882 = OpShiftLeftLogical %v2uint %24510 %1912\n      %13600 = OpShiftRightLogical %v2uint %24510 %1912\n      %23628 = OpBitwiseOr %v2uint %8882 %13600\n      %15475 = OpSelect %v2uint %12715 %2015 %1807\n       %7817 = OpBitwiseXor %v2uint %23628 %15475\n      %24560 = OpIAdd %v2uint %7817 %6322\n       %8299 = OpShiftLeftLogical %v2uint %24560 %2143\n       %9079 = OpBitwiseOr %v2uint %24944 %8299\n      %23544 = OpShiftRightLogical %v2uint %8700 %2248\n      %13215 = OpShiftRightLogical %v2uint %23544 %2017\n      %11907 = OpINotEqual %v2bool %13215 %1807\n      %20151 = OpIEqual %v2bool %23544 %2234\n       %7666 = OpSelect %v2uint %20151 %2255 %23544\n      %23061 = OpSelect %v2uint %11907 %2640 %1807\n      %23683 = OpBitwiseXor %v2uint %7666 %23061\n      %24511 = OpIAdd %v2uint %23683 %13215\n       %8883 = OpShiftLeftLogical %v2uint %24511 %1912\n      %13601 = OpShiftRightLogical %v2uint %24511 %1912\n      %23629 = OpBitwiseOr %v2uint %8883 %13601\n      %15476 = OpSelect %v2uint %11907 %2015 %1807\n       %7834 = OpBitwiseXor %v2uint %23629 %15476\n      %22183 = OpIAdd %v2uint %7834 %13215\n      %18027 = OpBitwiseOr %v2uint %22183 %883\n      %10456 = OpCompositeExtract %uint %9079 0\n      %23733 = OpCompositeExtract %uint %9079 1\n       %7644 = OpCompositeExtract %uint %18027 0\n       %7798 = OpCompositeExtract %uint %18027 1\n      %17092 = OpCompositeConstruct %v4uint %10456 %23733 %7644 %7798\n      %18311 = OpVectorShuffle %v4uint %17092 %17092 0 2 1 3\n      %18761 = OpIAdd %uint %7937 %uint_32\n      %10678 = OpShiftRightLogical %uint %18761 %int_4\n      %19429 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %10678\n               OpStore %19429 %7816\n       %8270 = OpIAdd %uint %7937 %uint_48\n       %6654 = OpShiftRightLogical %uint %8270 %int_4\n      %21727 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %6654\n               OpStore %21727 %18311\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_r10g11b11_rgba16_snorm_scaled_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006245, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000017,\n    0x0000000B, 0x00000004, 0x00040015, 0x0000000C, 0x00000020, 0x00000001,\n    0x00040017, 0x00000012, 0x0000000C, 0x00000002, 0x00040017, 0x00000016,\n    0x0000000C, 0x00000003, 0x00020014, 0x00000009, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A25, 0x00000009,\n    0x00040017, 0x0000000F, 0x00000009, 0x00000002, 0x0004002B, 0x0000000B,\n    0x00000A0A, 0x00000000, 0x0004002B, 0x0000000B, 0x0000044A, 0x00000201,\n    0x0004002B, 0x0000000B, 0x00000447, 0x00000200, 0x0004002B, 0x0000000B,\n    0x00000A44, 0x000003FF, 0x0004002B, 0x0000000B, 0x00000A1C, 0x00000006,\n    0x0004002B, 0x0000000B, 0x00000A13, 0x00000003, 0x0004002B, 0x0000000B,\n    0x000001C1, 0x0000FFFF, 0x0004002B, 0x0000000B, 0x00000A28, 0x0000000A,\n    0x0004002B, 0x0000000B, 0x00000A4A, 0x00000401, 0x0004002B, 0x0000000B,\n    0x00000A47, 0x00000400, 0x0004002B, 0x0000000B, 0x00000A81, 0x000007FF,\n    0x0004002B, 0x0000000B, 0x00000A19, 0x00000005, 0x0004002B, 0x0000000B,\n    0x00000A3A, 0x00000010, 0x0004002B, 0x0000000B, 0x00000A49, 0x00000015,\n    0x0004002B, 0x0000000B, 0x000003D6, 0x7FFF0000, 0x0004002B, 0x0000000B,\n    0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B, 0x00000A10, 0x00000002,\n    0x0004002B, 0x0000000B, 0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B,\n    0x00000A22, 0x00000008, 0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00,\n    0x0004002B, 0x0000000C, 0x00000A17, 0x00000004, 0x0004002B, 0x0000000C,\n    0x00000A1D, 0x00000006, 0x0004002B, 0x0000000C, 0x00000A2C, 0x0000000B,\n    0x0004002B, 0x0000000C, 0x00000A38, 0x0000000F, 0x0004002B, 0x0000000C,\n    0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C, 0x00000A1A, 0x00000005,\n    0x0004002B, 0x0000000C, 0x00000A20, 0x00000007, 0x0004002B, 0x0000000C,\n    0x00000A23, 0x00000008, 0x0004002B, 0x0000000C, 0x00000A2F, 0x0000000C,\n    0x0004002B, 0x0000000C, 0x00000A14, 0x00000003, 0x0004002B, 0x0000000C,\n    0x00000A11, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A16, 0x00000004,\n    0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000, 0x000A001E, 0x00000489,\n    0x0000000B, 0x0000000B, 0x0000000B, 0x0000000B, 0x00000014, 0x0000000B,\n    0x0000000B, 0x0000000B, 0x00040020, 0x00000706, 0x00000009, 0x00000489,\n    0x0004003B, 0x00000706, 0x00000CE9, 0x00000009, 0x00040020, 0x00000288,\n    0x00000009, 0x0000000B, 0x0004002B, 0x0000000B, 0x00000A1F, 0x00000007,\n    0x0005002C, 0x00000011, 0x00000787, 0x00000A16, 0x00000A1F, 0x00040020,\n    0x00000291, 0x00000009, 0x00000014, 0x00040020, 0x00000292, 0x00000001,\n    0x00000014, 0x0004003B, 0x00000292, 0x00000F48, 0x00000001, 0x0006002C,\n    0x00000014, 0x00000A2B, 0x00000A13, 0x00000A0A, 0x00000A0A, 0x0003001D,\n    0x000007DC, 0x00000017, 0x0003001E, 0x000007B4, 0x000007DC, 0x00040020,\n    0x00000A31, 0x00000002, 0x000007B4, 0x0004003B, 0x00000A31, 0x0000107A,\n    0x00000002, 0x00040020, 0x00000294, 0x00000002, 0x00000017, 0x0003001D,\n    0x000007DD, 0x00000017, 0x0003001E, 0x000007B5, 0x000007DD, 0x00040020,\n    0x00000A32, 0x00000002, 0x000007B5, 0x0004003B, 0x00000A32, 0x0000140E,\n    0x00000002, 0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020, 0x0004002B,\n    0x0000000B, 0x00000A9A, 0x00000030, 0x0006002C, 0x00000014, 0x00000BC3,\n    0x00000A16, 0x00000A6A, 0x00000A0D, 0x0005002C, 0x00000011, 0x000007A2,\n    0x00000A1F, 0x00000A1F, 0x0005002C, 0x00000011, 0x0000073F, 0x00000A16,\n    0x00000A0D, 0x0004002B, 0x0000000B, 0x00000A37, 0x0000000F, 0x0005002C,\n    0x00000011, 0x000007A3, 0x00000A37, 0x00000A0D, 0x0007002C, 0x00000017,\n    0x000009CE, 0x000008A6, 0x000008A6, 0x000008A6, 0x000008A6, 0x0007002C,\n    0x00000017, 0x0000013D, 0x00000A22, 0x00000A22, 0x00000A22, 0x00000A22,\n    0x0007002C, 0x00000017, 0x0000072E, 0x000005FD, 0x000005FD, 0x000005FD,\n    0x000005FD, 0x0007002C, 0x00000017, 0x000002ED, 0x00000A3A, 0x00000A3A,\n    0x00000A3A, 0x00000A3A, 0x0005002C, 0x00000011, 0x000008A5, 0x00000A44,\n    0x00000A44, 0x0005002C, 0x00000011, 0x000007CC, 0x00000A25, 0x00000A25,\n    0x0005002C, 0x00000011, 0x0000070F, 0x00000A0A, 0x00000A0A, 0x0005002C,\n    0x00000011, 0x00000218, 0x0000044A, 0x0000044A, 0x0005002C, 0x00000011,\n    0x00000203, 0x00000447, 0x00000447, 0x0005002C, 0x00000011, 0x0000078D,\n    0x00000A1C, 0x00000A1C, 0x0005002C, 0x00000011, 0x0000074E, 0x00000A13,\n    0x00000A13, 0x0005002C, 0x00000011, 0x000007DF, 0x000001C1, 0x000001C1,\n    0x0005002C, 0x00000011, 0x000007E1, 0x00000A28, 0x00000A28, 0x0005002C,\n    0x00000011, 0x00000A50, 0x00000A81, 0x00000A81, 0x0005002C, 0x00000011,\n    0x000008CF, 0x00000A4A, 0x00000A4A, 0x0005002C, 0x00000011, 0x000008BA,\n    0x00000A47, 0x00000A47, 0x0005002C, 0x00000011, 0x00000778, 0x00000A19,\n    0x00000A19, 0x0005002C, 0x00000011, 0x0000085F, 0x00000A3A, 0x00000A3A,\n    0x0005002C, 0x00000011, 0x000008C8, 0x00000A49, 0x00000A49, 0x0005002C,\n    0x00000011, 0x00000373, 0x000003D6, 0x000003D6, 0x00050036, 0x00000008,\n    0x0000161F, 0x00000000, 0x00000502, 0x000200F8, 0x00003B06, 0x000300F7,\n    0x00004C7A, 0x00000000, 0x000300FB, 0x00000A0A, 0x00002E68, 0x000200F8,\n    0x00002E68, 0x00050041, 0x00000288, 0x000060D7, 0x00000CE9, 0x00000A0B,\n    0x0004003D, 0x0000000B, 0x00003526, 0x000060D7, 0x000500C7, 0x0000000B,\n    0x00005F7D, 0x00003526, 0x00000A10, 0x000500AB, 0x00000009, 0x000048EB,\n    0x00005F7D, 0x00000A0A, 0x000500C2, 0x0000000B, 0x00001FCD, 0x00003526,\n    0x00000A10, 0x000500C7, 0x0000000B, 0x0000619E, 0x00001FCD, 0x00000A13,\n    0x00050050, 0x00000011, 0x000022A7, 0x00003526, 0x00003526, 0x000500C2,\n    0x00000011, 0x00001BAF, 0x000022A7, 0x00000787, 0x000500C7, 0x00000011,\n    0x00001997, 0x00001BAF, 0x000007A2, 0x00050041, 0x00000288, 0x0000492C,\n    0x00000CE9, 0x00000A0E, 0x0004003D, 0x0000000B, 0x00005EAC, 0x0000492C,\n    0x00050041, 0x00000288, 0x00004EBA, 0x00000CE9, 0x00000A11, 0x0004003D,\n    0x0000000B, 0x00005788, 0x00004EBA, 0x00050041, 0x00000288, 0x00004EBB,\n    0x00000CE9, 0x00000A14, 0x0004003D, 0x0000000B, 0x00005789, 0x00004EBB,\n    0x00050041, 0x00000291, 0x00004EBC, 0x00000CE9, 0x00000A17, 0x0004003D,\n    0x00000014, 0x0000578A, 0x00004EBC, 0x00050041, 0x00000288, 0x00004EBD,\n    0x00000CE9, 0x00000A1A, 0x0004003D, 0x0000000B, 0x0000578B, 0x00004EBD,\n    0x00050041, 0x00000288, 0x00004E6E, 0x00000CE9, 0x00000A1D, 0x0004003D,\n    0x0000000B, 0x000019C2, 0x00004E6E, 0x0004003D, 0x00000014, 0x00002A0E,\n    0x00000F48, 0x000500C4, 0x00000014, 0x0000538B, 0x00002A0E, 0x00000A2B,\n    0x0007004F, 0x00000011, 0x000042F0, 0x0000538B, 0x0000538B, 0x00000000,\n    0x00000001, 0x0007004F, 0x00000011, 0x0000242F, 0x0000578A, 0x0000578A,\n    0x00000000, 0x00000001, 0x000500AE, 0x0000000F, 0x00004288, 0x000042F0,\n    0x0000242F, 0x0004009A, 0x00000009, 0x00006067, 0x00004288, 0x000300F7,\n    0x000019BA, 0x00000002, 0x000400FA, 0x00006067, 0x000055E8, 0x000019BA,\n    0x000200F8, 0x000055E8, 0x000200F9, 0x00004C7A, 0x000200F8, 0x000019BA,\n    0x0004007C, 0x00000016, 0x00005BB6, 0x0000538B, 0x00050051, 0x0000000B,\n    0x00004916, 0x0000578A, 0x00000001, 0x00050051, 0x0000000C, 0x00005BEB,\n    0x00005BB6, 0x00000000, 0x00050084, 0x0000000C, 0x0000591A, 0x00005BEB,\n    0x00000A23, 0x00050051, 0x0000000C, 0x000018DA, 0x00005BB6, 0x00000002,\n    0x0004007C, 0x0000000C, 0x000038A9, 0x00004916, 0x00050084, 0x0000000C,\n    0x00002C0F, 0x000018DA, 0x000038A9, 0x00050051, 0x0000000C, 0x000044BE,\n    0x00005BB6, 0x00000001, 0x00050080, 0x0000000C, 0x000056D4, 0x00002C0F,\n    0x000044BE, 0x0004007C, 0x0000000C, 0x00005785, 0x000019C2, 0x00050084,\n    0x0000000C, 0x00005FD7, 0x000056D4, 0x00005785, 0x00050080, 0x0000000C,\n    0x00002042, 0x0000591A, 0x00005FD7, 0x0004007C, 0x0000000B, 0x00002A92,\n    0x00002042, 0x00050080, 0x0000000B, 0x00001F01, 0x0000578B, 0x00002A92,\n    0x000500C2, 0x00000011, 0x00004DD1, 0x000042F0, 0x0000073F, 0x00050086,\n    0x00000011, 0x00001E20, 0x00004DD1, 0x00001997, 0x00050084, 0x00000011,\n    0x00004707, 0x00001997, 0x00001E20, 0x00050082, 0x00000011, 0x00004761,\n    0x00004DD1, 0x00004707, 0x000500C4, 0x00000011, 0x00002BE0, 0x00001E20,\n    0x0000073F, 0x00050051, 0x0000000B, 0x000033E4, 0x00004761, 0x00000000,\n    0x00050051, 0x0000000B, 0x00002A78, 0x00001997, 0x00000001, 0x00050084,\n    0x0000000B, 0x00005966, 0x000033E4, 0x00002A78, 0x00050051, 0x0000000B,\n    0x00001B1F, 0x00004761, 0x00000001, 0x00050080, 0x0000000B, 0x000028E5,\n    0x00005966, 0x00001B1F, 0x000500C7, 0x00000011, 0x000049A3, 0x000042F0,\n    0x000007A3, 0x000500C4, 0x0000000B, 0x00002955, 0x000028E5, 0x00000A1F,\n    0x00050051, 0x0000000B, 0x000051B4, 0x000049A3, 0x00000001, 0x000500C4,\n    0x0000000B, 0x00005C2C, 0x000051B4, 0x00000A1C, 0x000500C5, 0x0000000B,\n    0x00004D66, 0x00002955, 0x00005C2C, 0x00050051, 0x0000000B, 0x000053E4,\n    0x000049A3, 0x00000000, 0x000500C4, 0x0000000B, 0x00002170, 0x000053E4,\n    0x00000A10, 0x000500C5, 0x0000000B, 0x000044F0, 0x00004D66, 0x00002170,\n    0x00050051, 0x0000000B, 0x00004DD3, 0x00002BE0, 0x00000000, 0x00060052,\n    0x00000014, 0x00003CC4, 0x00004DD3, 0x0000538B, 0x00000000, 0x00050051,\n    0x0000000B, 0x000059DE, 0x00002BE0, 0x00000001, 0x00060052, 0x00000014,\n    0x000025D0, 0x000059DE, 0x00003CC4, 0x00000001, 0x000300F7, 0x00004F78,\n    0x00000002, 0x000400FA, 0x000048EB, 0x00005BE0, 0x00002DD9, 0x000200F8,\n    0x00005BE0, 0x0004007C, 0x00000016, 0x0000277F, 0x000025D0, 0x000500C2,\n    0x0000000B, 0x00004C14, 0x00005788, 0x00000A1A, 0x000500C2, 0x0000000B,\n    0x0000497A, 0x00005789, 0x00000A17, 0x00050051, 0x0000000C, 0x00001A7E,\n    0x0000277F, 0x00000002, 0x000500C3, 0x0000000C, 0x00002F39, 0x00001A7E,\n    0x00000A11, 0x0004007C, 0x0000000C, 0x00005780, 0x0000497A, 0x00050084,\n    0x0000000C, 0x00001F02, 0x00002F39, 0x00005780, 0x00050051, 0x0000000C,\n    0x00006242, 0x0000277F, 0x00000001, 0x000500C3, 0x0000000C, 0x00004A6F,\n    0x00006242, 0x00000A17, 0x00050080, 0x0000000C, 0x00002B2C, 0x00001F02,\n    0x00004A6F, 0x0004007C, 0x0000000C, 0x00004202, 0x00004C14, 0x00050084,\n    0x0000000C, 0x00003A60, 0x00002B2C, 0x00004202, 0x00050051, 0x0000000C,\n    0x00006243, 0x0000277F, 0x00000000, 0x000500C3, 0x0000000C, 0x00004FC7,\n    0x00006243, 0x00000A1A, 0x00050080, 0x0000000C, 0x000049FC, 0x00003A60,\n    0x00004FC7, 0x000500C4, 0x0000000C, 0x0000225D, 0x000049FC, 0x00000A20,\n    0x000500C7, 0x0000000C, 0x00002CAA, 0x00001A7E, 0x00000A14, 0x000500C4,\n    0x0000000C, 0x00004CAE, 0x00002CAA, 0x00000A1A, 0x000500C3, 0x0000000C,\n    0x0000383E, 0x00006242, 0x00000A0E, 0x000500C7, 0x0000000C, 0x00005374,\n    0x0000383E, 0x00000A14, 0x000500C4, 0x0000000C, 0x000054CA, 0x00005374,\n    0x00000A14, 0x000500C5, 0x0000000C, 0x000042CE, 0x00004CAE, 0x000054CA,\n    0x000500C7, 0x0000000C, 0x000050D5, 0x00006243, 0x00000A20, 0x000500C5,\n    0x0000000C, 0x00003ADD, 0x000042CE, 0x000050D5, 0x000500C5, 0x0000000C,\n    0x000043B6, 0x0000225D, 0x00003ADD, 0x000500C4, 0x0000000C, 0x00005E50,\n    0x000043B6, 0x00000A10, 0x000500C3, 0x0000000C, 0x000032D7, 0x00006242,\n    0x00000A14, 0x000500C6, 0x0000000C, 0x000026C9, 0x000032D7, 0x00002F39,\n    0x000500C7, 0x0000000C, 0x00004199, 0x000026C9, 0x00000A0E, 0x000500C3,\n    0x0000000C, 0x00002590, 0x00006243, 0x00000A14, 0x000500C7, 0x0000000C,\n    0x0000505E, 0x00002590, 0x00000A14, 0x000500C4, 0x0000000C, 0x0000541D,\n    0x00004199, 0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BA, 0x0000505E,\n    0x0000541D, 0x000500C7, 0x0000000C, 0x00005076, 0x00006242, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x00005228, 0x00005076, 0x00000A17, 0x000500C4,\n    0x0000000C, 0x00001998, 0x000022BA, 0x00000A1D, 0x000500C5, 0x0000000C,\n    0x000047FE, 0x00005228, 0x00001998, 0x000500C4, 0x0000000C, 0x00001C00,\n    0x00004199, 0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C81, 0x000047FE,\n    0x00001C00, 0x000500C7, 0x0000000C, 0x000050AF, 0x00005E50, 0x00000A38,\n    0x000500C5, 0x0000000C, 0x00003C70, 0x00003C81, 0x000050AF, 0x000500C3,\n    0x0000000C, 0x00003745, 0x00005E50, 0x00000A17, 0x000500C7, 0x0000000C,\n    0x000018B8, 0x00003745, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000547E,\n    0x000018B8, 0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A8, 0x00003C70,\n    0x0000547E, 0x000500C3, 0x0000000C, 0x00003A6E, 0x00005E50, 0x00000A1A,\n    0x000500C7, 0x0000000C, 0x000018B9, 0x00003A6E, 0x00000A20, 0x000500C4,\n    0x0000000C, 0x0000547F, 0x000018B9, 0x00000A23, 0x000500C5, 0x0000000C,\n    0x0000456F, 0x000045A8, 0x0000547F, 0x000500C3, 0x0000000C, 0x00003C88,\n    0x00005E50, 0x00000A23, 0x000500C4, 0x0000000C, 0x00002824, 0x00003C88,\n    0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B79, 0x0000456F, 0x00002824,\n    0x0004007C, 0x0000000B, 0x000041E5, 0x00003B79, 0x000200F9, 0x00004F78,\n    0x000200F8, 0x00002DD9, 0x0007004F, 0x00000011, 0x00002E84, 0x000025D0,\n    0x000025D0, 0x00000000, 0x00000001, 0x0004007C, 0x00000012, 0x00004F7B,\n    0x00002E84, 0x000500C2, 0x0000000B, 0x00002CA9, 0x00005788, 0x00000A1A,\n    0x00050051, 0x0000000C, 0x00003905, 0x00004F7B, 0x00000001, 0x000500C3,\n    0x0000000C, 0x00002F3A, 0x00003905, 0x00000A1A, 0x0004007C, 0x0000000C,\n    0x00005781, 0x00002CA9, 0x00050084, 0x0000000C, 0x00001F03, 0x00002F3A,\n    0x00005781, 0x00050051, 0x0000000C, 0x00006244, 0x00004F7B, 0x00000000,\n    0x000500C3, 0x0000000C, 0x00004FC8, 0x00006244, 0x00000A1A, 0x00050080,\n    0x0000000C, 0x000049B0, 0x00001F03, 0x00004FC8, 0x000500C4, 0x0000000C,\n    0x0000254A, 0x000049B0, 0x00000A1D, 0x000500C3, 0x0000000C, 0x0000603B,\n    0x00003905, 0x00000A0E, 0x000500C7, 0x0000000C, 0x0000539A, 0x0000603B,\n    0x00000A20, 0x000500C4, 0x0000000C, 0x0000534A, 0x0000539A, 0x00000A14,\n    0x000500C7, 0x0000000C, 0x00004EA5, 0x00006244, 0x00000A20, 0x000500C5,\n    0x0000000C, 0x00002B1A, 0x0000534A, 0x00004EA5, 0x000500C5, 0x0000000C,\n    0x000043B7, 0x0000254A, 0x00002B1A, 0x000500C4, 0x0000000C, 0x00005E63,\n    0x000043B7, 0x00000A10, 0x000500C3, 0x0000000C, 0x000031DE, 0x00003905,\n    0x00000A17, 0x000500C7, 0x0000000C, 0x00005447, 0x000031DE, 0x00000A0E,\n    0x000500C3, 0x0000000C, 0x000028A6, 0x00006244, 0x00000A14, 0x000500C7,\n    0x0000000C, 0x0000511E, 0x000028A6, 0x00000A14, 0x000500C3, 0x0000000C,\n    0x000028B9, 0x00003905, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000505F,\n    0x000028B9, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000541E, 0x0000505F,\n    0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BB, 0x0000511E, 0x0000541E,\n    0x000500C7, 0x0000000C, 0x00005077, 0x00003905, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x00005229, 0x00005077, 0x00000A17, 0x000500C4, 0x0000000C,\n    0x00001999, 0x000022BB, 0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FF,\n    0x00005229, 0x00001999, 0x000500C4, 0x0000000C, 0x00001C01, 0x00005447,\n    0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C82, 0x000047FF, 0x00001C01,\n    0x000500C7, 0x0000000C, 0x000050B0, 0x00005E63, 0x00000A38, 0x000500C5,\n    0x0000000C, 0x00003C71, 0x00003C82, 0x000050B0, 0x000500C3, 0x0000000C,\n    0x00003746, 0x00005E63, 0x00000A17, 0x000500C7, 0x0000000C, 0x000018BA,\n    0x00003746, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005480, 0x000018BA,\n    0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A9, 0x00003C71, 0x00005480,\n    0x000500C3, 0x0000000C, 0x00003A6F, 0x00005E63, 0x00000A1A, 0x000500C7,\n    0x0000000C, 0x000018BB, 0x00003A6F, 0x00000A20, 0x000500C4, 0x0000000C,\n    0x00005481, 0x000018BB, 0x00000A23, 0x000500C5, 0x0000000C, 0x00004570,\n    0x000045A9, 0x00005481, 0x000500C3, 0x0000000C, 0x00003C89, 0x00005E63,\n    0x00000A23, 0x000500C4, 0x0000000C, 0x00002825, 0x00003C89, 0x00000A2F,\n    0x000500C5, 0x0000000C, 0x00003B7A, 0x00004570, 0x00002825, 0x0004007C,\n    0x0000000B, 0x000041E6, 0x00003B7A, 0x000200F9, 0x00004F78, 0x000200F8,\n    0x00004F78, 0x000700F5, 0x0000000B, 0x00004799, 0x000041E5, 0x00005BE0,\n    0x000041E6, 0x00002DD9, 0x00050051, 0x0000000B, 0x00003B60, 0x00001997,\n    0x00000000, 0x00050084, 0x0000000B, 0x00004451, 0x00003B60, 0x00002A78,\n    0x00050084, 0x0000000B, 0x00001C91, 0x00004799, 0x00004451, 0x00050080,\n    0x0000000B, 0x0000226F, 0x00001C91, 0x000044F0, 0x00050080, 0x0000000B,\n    0x000053DE, 0x0000226F, 0x00005EAC, 0x000500C2, 0x0000000B, 0x00003948,\n    0x000053DE, 0x00000A17, 0x00060041, 0x00000294, 0x00004FAF, 0x0000107A,\n    0x00000A0B, 0x00003948, 0x0004003D, 0x00000017, 0x00001CAA, 0x00004FAF,\n    0x000500AA, 0x00000009, 0x000035C0, 0x0000619E, 0x00000A0D, 0x000500AA,\n    0x00000009, 0x00005376, 0x0000619E, 0x00000A10, 0x000500A6, 0x00000009,\n    0x00005686, 0x000035C0, 0x00005376, 0x000300F7, 0x00003463, 0x00000000,\n    0x000400FA, 0x00005686, 0x00002957, 0x00003463, 0x000200F8, 0x00002957,\n    0x000500C7, 0x00000017, 0x0000475F, 0x00001CAA, 0x000009CE, 0x000500C4,\n    0x00000017, 0x000024D1, 0x0000475F, 0x0000013D, 0x000500C7, 0x00000017,\n    0x000050AC, 0x00001CAA, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448D,\n    0x000050AC, 0x0000013D, 0x000500C5, 0x00000017, 0x00003FF8, 0x000024D1,\n    0x0000448D, 0x000200F9, 0x00003463, 0x000200F8, 0x00003463, 0x000700F5,\n    0x00000017, 0x00005879, 0x00001CAA, 0x00004F78, 0x00003FF8, 0x00002957,\n    0x000500AA, 0x00000009, 0x00004CB6, 0x0000619E, 0x00000A13, 0x000500A6,\n    0x00000009, 0x00003B23, 0x00005376, 0x00004CB6, 0x000300F7, 0x00002DA2,\n    0x00000000, 0x000400FA, 0x00003B23, 0x00002B38, 0x00002DA2, 0x000200F8,\n    0x00002B38, 0x000500C4, 0x00000017, 0x00005E17, 0x00005879, 0x000002ED,\n    0x000500C2, 0x00000017, 0x00003BE7, 0x00005879, 0x000002ED, 0x000500C5,\n    0x00000017, 0x000029E8, 0x00005E17, 0x00003BE7, 0x000200F9, 0x00002DA2,\n    0x000200F8, 0x00002DA2, 0x000700F5, 0x00000017, 0x00004DEC, 0x00005879,\n    0x00003463, 0x000029E8, 0x00002B38, 0x0007004F, 0x00000011, 0x000052B5,\n    0x00004DEC, 0x00004DEC, 0x00000000, 0x00000001, 0x000500C7, 0x00000011,\n    0x00002FAE, 0x000052B5, 0x000008A5, 0x000500C2, 0x00000011, 0x00001AF2,\n    0x00002FAE, 0x000007CC, 0x000500AB, 0x0000000F, 0x000031A4, 0x00001AF2,\n    0x0000070F, 0x000500AA, 0x0000000F, 0x00004EAC, 0x00002FAE, 0x00000203,\n    0x000600A9, 0x00000011, 0x00001DE7, 0x00004EAC, 0x00000218, 0x00002FAE,\n    0x000600A9, 0x00000011, 0x00005A0A, 0x000031A4, 0x000008A5, 0x0000070F,\n    0x000500C6, 0x00000011, 0x00005C78, 0x00001DE7, 0x00005A0A, 0x00050080,\n    0x00000011, 0x00005FB4, 0x00005C78, 0x00001AF2, 0x000500C4, 0x00000011,\n    0x000022A8, 0x00005FB4, 0x0000078D, 0x000500C2, 0x00000011, 0x00003516,\n    0x00005FB4, 0x0000074E, 0x000500C5, 0x00000011, 0x00005C42, 0x000022A8,\n    0x00003516, 0x000600A9, 0x00000011, 0x00003C67, 0x000031A4, 0x000007DF,\n    0x0000070F, 0x000500C6, 0x00000011, 0x00001E5E, 0x00005C42, 0x00003C67,\n    0x00050080, 0x00000011, 0x0000616D, 0x00001E5E, 0x00001AF2, 0x000500C2,\n    0x00000011, 0x00005F10, 0x000052B5, 0x000007E1, 0x000500C7, 0x00000011,\n    0x00002E2E, 0x00005F10, 0x00000A50, 0x000500C2, 0x00000011, 0x000018AF,\n    0x00002E2E, 0x000007E1, 0x000500AB, 0x0000000F, 0x000031A5, 0x000018AF,\n    0x0000070F, 0x000500AA, 0x0000000F, 0x00004EAD, 0x00002E2E, 0x000008BA,\n    0x000600A9, 0x00000011, 0x00001DE8, 0x00004EAD, 0x000008CF, 0x00002E2E,\n    0x000600A9, 0x00000011, 0x00005A0B, 0x000031A5, 0x00000A50, 0x0000070F,\n    0x000500C6, 0x00000011, 0x00005C79, 0x00001DE8, 0x00005A0B, 0x00050080,\n    0x00000011, 0x00005FB5, 0x00005C79, 0x000018AF, 0x000500C4, 0x00000011,\n    0x000022A9, 0x00005FB5, 0x00000778, 0x000500C2, 0x00000011, 0x00003517,\n    0x00005FB5, 0x00000778, 0x000500C5, 0x00000011, 0x00005C43, 0x000022A9,\n    0x00003517, 0x000600A9, 0x00000011, 0x00003C68, 0x000031A5, 0x000007DF,\n    0x0000070F, 0x000500C6, 0x00000011, 0x00001E84, 0x00005C43, 0x00003C68,\n    0x00050080, 0x00000011, 0x00005FED, 0x00001E84, 0x000018AF, 0x000500C4,\n    0x00000011, 0x00002068, 0x00005FED, 0x0000085F, 0x000500C5, 0x00000011,\n    0x00002374, 0x0000616D, 0x00002068, 0x000500C2, 0x00000011, 0x00005BF5,\n    0x000052B5, 0x000008C8, 0x000500C2, 0x00000011, 0x0000339C, 0x00005BF5,\n    0x000007E1, 0x000500AB, 0x0000000F, 0x00002E80, 0x0000339C, 0x0000070F,\n    0x000500AA, 0x0000000F, 0x00004EAE, 0x00005BF5, 0x000008BA, 0x000600A9,\n    0x00000011, 0x00001DE9, 0x00004EAE, 0x000008CF, 0x00005BF5, 0x000600A9,\n    0x00000011, 0x00005A0C, 0x00002E80, 0x00000A50, 0x0000070F, 0x000500C6,\n    0x00000011, 0x00005C7A, 0x00001DE9, 0x00005A0C, 0x00050080, 0x00000011,\n    0x00005FB6, 0x00005C7A, 0x0000339C, 0x000500C4, 0x00000011, 0x000022AA,\n    0x00005FB6, 0x00000778, 0x000500C2, 0x00000011, 0x00003518, 0x00005FB6,\n    0x00000778, 0x000500C5, 0x00000011, 0x00005C44, 0x000022AA, 0x00003518,\n    0x000600A9, 0x00000011, 0x00003C69, 0x00002E80, 0x000007DF, 0x0000070F,\n    0x000500C6, 0x00000011, 0x00001E97, 0x00005C44, 0x00003C69, 0x00050080,\n    0x00000011, 0x000056A4, 0x00001E97, 0x0000339C, 0x000500C5, 0x00000011,\n    0x00004668, 0x000056A4, 0x00000373, 0x00050051, 0x0000000B, 0x000028D5,\n    0x00002374, 0x00000000, 0x00050051, 0x0000000B, 0x00005CB2, 0x00002374,\n    0x00000001, 0x00050051, 0x0000000B, 0x00001DD9, 0x00004668, 0x00000000,\n    0x00050051, 0x0000000B, 0x00001E73, 0x00004668, 0x00000001, 0x00070050,\n    0x00000017, 0x00003F21, 0x000028D5, 0x00005CB2, 0x00001DD9, 0x00001E73,\n    0x0009004F, 0x00000017, 0x00001E85, 0x00003F21, 0x00003F21, 0x00000000,\n    0x00000002, 0x00000001, 0x00000003, 0x0007004F, 0x00000011, 0x000021FB,\n    0x00004DEC, 0x00004DEC, 0x00000002, 0x00000003, 0x000500C7, 0x00000011,\n    0x00001BFF, 0x000021FB, 0x000008A5, 0x000500C2, 0x00000011, 0x00001AF3,\n    0x00001BFF, 0x000007CC, 0x000500AB, 0x0000000F, 0x000031A6, 0x00001AF3,\n    0x0000070F, 0x000500AA, 0x0000000F, 0x00004EAF, 0x00001BFF, 0x00000203,\n    0x000600A9, 0x00000011, 0x00001DEA, 0x00004EAF, 0x00000218, 0x00001BFF,\n    0x000600A9, 0x00000011, 0x00005A0D, 0x000031A6, 0x000008A5, 0x0000070F,\n    0x000500C6, 0x00000011, 0x00005C7B, 0x00001DEA, 0x00005A0D, 0x00050080,\n    0x00000011, 0x00005FB7, 0x00005C7B, 0x00001AF3, 0x000500C4, 0x00000011,\n    0x000022AB, 0x00005FB7, 0x0000078D, 0x000500C2, 0x00000011, 0x00003519,\n    0x00005FB7, 0x0000074E, 0x000500C5, 0x00000011, 0x00005C45, 0x000022AB,\n    0x00003519, 0x000600A9, 0x00000011, 0x00003C6A, 0x000031A6, 0x000007DF,\n    0x0000070F, 0x000500C6, 0x00000011, 0x00001E5F, 0x00005C45, 0x00003C6A,\n    0x00050080, 0x00000011, 0x0000616E, 0x00001E5F, 0x00001AF3, 0x000500C2,\n    0x00000011, 0x00005F11, 0x000021FB, 0x000007E1, 0x000500C7, 0x00000011,\n    0x00002E2F, 0x00005F11, 0x00000A50, 0x000500C2, 0x00000011, 0x000018B0,\n    0x00002E2F, 0x000007E1, 0x000500AB, 0x0000000F, 0x000031A7, 0x000018B0,\n    0x0000070F, 0x000500AA, 0x0000000F, 0x00004EB0, 0x00002E2F, 0x000008BA,\n    0x000600A9, 0x00000011, 0x00001DEB, 0x00004EB0, 0x000008CF, 0x00002E2F,\n    0x000600A9, 0x00000011, 0x00005A0E, 0x000031A7, 0x00000A50, 0x0000070F,\n    0x000500C6, 0x00000011, 0x00005C7C, 0x00001DEB, 0x00005A0E, 0x00050080,\n    0x00000011, 0x00005FB8, 0x00005C7C, 0x000018B0, 0x000500C4, 0x00000011,\n    0x000022AC, 0x00005FB8, 0x00000778, 0x000500C2, 0x00000011, 0x0000351A,\n    0x00005FB8, 0x00000778, 0x000500C5, 0x00000011, 0x00005C46, 0x000022AC,\n    0x0000351A, 0x000600A9, 0x00000011, 0x00003C6B, 0x000031A7, 0x000007DF,\n    0x0000070F, 0x000500C6, 0x00000011, 0x00001E86, 0x00005C46, 0x00003C6B,\n    0x00050080, 0x00000011, 0x00005FEE, 0x00001E86, 0x000018B0, 0x000500C4,\n    0x00000011, 0x00002069, 0x00005FEE, 0x0000085F, 0x000500C5, 0x00000011,\n    0x00002375, 0x0000616E, 0x00002069, 0x000500C2, 0x00000011, 0x00005BF6,\n    0x000021FB, 0x000008C8, 0x000500C2, 0x00000011, 0x0000339D, 0x00005BF6,\n    0x000007E1, 0x000500AB, 0x0000000F, 0x00002E81, 0x0000339D, 0x0000070F,\n    0x000500AA, 0x0000000F, 0x00004EB1, 0x00005BF6, 0x000008BA, 0x000600A9,\n    0x00000011, 0x00001DEC, 0x00004EB1, 0x000008CF, 0x00005BF6, 0x000600A9,\n    0x00000011, 0x00005A0F, 0x00002E81, 0x00000A50, 0x0000070F, 0x000500C6,\n    0x00000011, 0x00005C7D, 0x00001DEC, 0x00005A0F, 0x00050080, 0x00000011,\n    0x00005FB9, 0x00005C7D, 0x0000339D, 0x000500C4, 0x00000011, 0x000022AD,\n    0x00005FB9, 0x00000778, 0x000500C2, 0x00000011, 0x0000351B, 0x00005FB9,\n    0x00000778, 0x000500C5, 0x00000011, 0x00005C47, 0x000022AD, 0x0000351B,\n    0x000600A9, 0x00000011, 0x00003C6C, 0x00002E81, 0x000007DF, 0x0000070F,\n    0x000500C6, 0x00000011, 0x00001E98, 0x00005C47, 0x00003C6C, 0x00050080,\n    0x00000011, 0x000056A5, 0x00001E98, 0x0000339D, 0x000500C5, 0x00000011,\n    0x00004669, 0x000056A5, 0x00000373, 0x00050051, 0x0000000B, 0x000028D6,\n    0x00002375, 0x00000000, 0x00050051, 0x0000000B, 0x00005CB3, 0x00002375,\n    0x00000001, 0x00050051, 0x0000000B, 0x00001DDA, 0x00004669, 0x00000000,\n    0x00050051, 0x0000000B, 0x00001E74, 0x00004669, 0x00000001, 0x00070050,\n    0x00000017, 0x000047AA, 0x000028D6, 0x00005CB3, 0x00001DDA, 0x00001E74,\n    0x0009004F, 0x00000017, 0x00005BD9, 0x000047AA, 0x000047AA, 0x00000000,\n    0x00000002, 0x00000001, 0x00000003, 0x000500C2, 0x0000000B, 0x00003B61,\n    0x00001F01, 0x00000A17, 0x00060041, 0x00000294, 0x00002306, 0x0000140E,\n    0x00000A0B, 0x00003B61, 0x0003003E, 0x00002306, 0x00001E85, 0x00050080,\n    0x0000000B, 0x0000204C, 0x00001F01, 0x00000A3A, 0x000500C2, 0x0000000B,\n    0x000019FD, 0x0000204C, 0x00000A17, 0x00060041, 0x00000294, 0x00004BE4,\n    0x0000140E, 0x00000A0B, 0x000019FD, 0x0003003E, 0x00004BE4, 0x00005BD9,\n    0x00050080, 0x0000000B, 0x0000204D, 0x000053DE, 0x00000A3A, 0x000500C2,\n    0x0000000B, 0x000019EA, 0x0000204D, 0x00000A17, 0x00060041, 0x00000294,\n    0x00005566, 0x0000107A, 0x00000A0B, 0x000019EA, 0x0004003D, 0x00000017,\n    0x00003910, 0x00005566, 0x000300F7, 0x00003A1A, 0x00000000, 0x000400FA,\n    0x00005686, 0x00002958, 0x00003A1A, 0x000200F8, 0x00002958, 0x000500C7,\n    0x00000017, 0x00004760, 0x00003910, 0x000009CE, 0x000500C4, 0x00000017,\n    0x000024D2, 0x00004760, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AD,\n    0x00003910, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448E, 0x000050AD,\n    0x0000013D, 0x000500C5, 0x00000017, 0x00003FF9, 0x000024D2, 0x0000448E,\n    0x000200F9, 0x00003A1A, 0x000200F8, 0x00003A1A, 0x000700F5, 0x00000017,\n    0x00002AAC, 0x00003910, 0x00002DA2, 0x00003FF9, 0x00002958, 0x000300F7,\n    0x00002DA3, 0x00000000, 0x000400FA, 0x00003B23, 0x00002B39, 0x00002DA3,\n    0x000200F8, 0x00002B39, 0x000500C4, 0x00000017, 0x00005E18, 0x00002AAC,\n    0x000002ED, 0x000500C2, 0x00000017, 0x00003BE8, 0x00002AAC, 0x000002ED,\n    0x000500C5, 0x00000017, 0x000029E9, 0x00005E18, 0x00003BE8, 0x000200F9,\n    0x00002DA3, 0x000200F8, 0x00002DA3, 0x000700F5, 0x00000017, 0x00004DED,\n    0x00002AAC, 0x00003A1A, 0x000029E9, 0x00002B39, 0x0007004F, 0x00000011,\n    0x000052B6, 0x00004DED, 0x00004DED, 0x00000000, 0x00000001, 0x000500C7,\n    0x00000011, 0x00002FAF, 0x000052B6, 0x000008A5, 0x000500C2, 0x00000011,\n    0x00001AF4, 0x00002FAF, 0x000007CC, 0x000500AB, 0x0000000F, 0x000031A8,\n    0x00001AF4, 0x0000070F, 0x000500AA, 0x0000000F, 0x00004EB2, 0x00002FAF,\n    0x00000203, 0x000600A9, 0x00000011, 0x00001DED, 0x00004EB2, 0x00000218,\n    0x00002FAF, 0x000600A9, 0x00000011, 0x00005A10, 0x000031A8, 0x000008A5,\n    0x0000070F, 0x000500C6, 0x00000011, 0x00005C7E, 0x00001DED, 0x00005A10,\n    0x00050080, 0x00000011, 0x00005FBA, 0x00005C7E, 0x00001AF4, 0x000500C4,\n    0x00000011, 0x000022AE, 0x00005FBA, 0x0000078D, 0x000500C2, 0x00000011,\n    0x0000351C, 0x00005FBA, 0x0000074E, 0x000500C5, 0x00000011, 0x00005C48,\n    0x000022AE, 0x0000351C, 0x000600A9, 0x00000011, 0x00003C6D, 0x000031A8,\n    0x000007DF, 0x0000070F, 0x000500C6, 0x00000011, 0x00001E60, 0x00005C48,\n    0x00003C6D, 0x00050080, 0x00000011, 0x0000616F, 0x00001E60, 0x00001AF4,\n    0x000500C2, 0x00000011, 0x00005F12, 0x000052B6, 0x000007E1, 0x000500C7,\n    0x00000011, 0x00002E30, 0x00005F12, 0x00000A50, 0x000500C2, 0x00000011,\n    0x000018B1, 0x00002E30, 0x000007E1, 0x000500AB, 0x0000000F, 0x000031A9,\n    0x000018B1, 0x0000070F, 0x000500AA, 0x0000000F, 0x00004EB3, 0x00002E30,\n    0x000008BA, 0x000600A9, 0x00000011, 0x00001DEE, 0x00004EB3, 0x000008CF,\n    0x00002E30, 0x000600A9, 0x00000011, 0x00005A11, 0x000031A9, 0x00000A50,\n    0x0000070F, 0x000500C6, 0x00000011, 0x00005C7F, 0x00001DEE, 0x00005A11,\n    0x00050080, 0x00000011, 0x00005FBB, 0x00005C7F, 0x000018B1, 0x000500C4,\n    0x00000011, 0x000022AF, 0x00005FBB, 0x00000778, 0x000500C2, 0x00000011,\n    0x0000351D, 0x00005FBB, 0x00000778, 0x000500C5, 0x00000011, 0x00005C49,\n    0x000022AF, 0x0000351D, 0x000600A9, 0x00000011, 0x00003C6E, 0x000031A9,\n    0x000007DF, 0x0000070F, 0x000500C6, 0x00000011, 0x00001E87, 0x00005C49,\n    0x00003C6E, 0x00050080, 0x00000011, 0x00005FEF, 0x00001E87, 0x000018B1,\n    0x000500C4, 0x00000011, 0x0000206A, 0x00005FEF, 0x0000085F, 0x000500C5,\n    0x00000011, 0x00002376, 0x0000616F, 0x0000206A, 0x000500C2, 0x00000011,\n    0x00005BF7, 0x000052B6, 0x000008C8, 0x000500C2, 0x00000011, 0x0000339E,\n    0x00005BF7, 0x000007E1, 0x000500AB, 0x0000000F, 0x00002E82, 0x0000339E,\n    0x0000070F, 0x000500AA, 0x0000000F, 0x00004EB4, 0x00005BF7, 0x000008BA,\n    0x000600A9, 0x00000011, 0x00001DEF, 0x00004EB4, 0x000008CF, 0x00005BF7,\n    0x000600A9, 0x00000011, 0x00005A12, 0x00002E82, 0x00000A50, 0x0000070F,\n    0x000500C6, 0x00000011, 0x00005C80, 0x00001DEF, 0x00005A12, 0x00050080,\n    0x00000011, 0x00005FBC, 0x00005C80, 0x0000339E, 0x000500C4, 0x00000011,\n    0x000022B0, 0x00005FBC, 0x00000778, 0x000500C2, 0x00000011, 0x0000351E,\n    0x00005FBC, 0x00000778, 0x000500C5, 0x00000011, 0x00005C4A, 0x000022B0,\n    0x0000351E, 0x000600A9, 0x00000011, 0x00003C6F, 0x00002E82, 0x000007DF,\n    0x0000070F, 0x000500C6, 0x00000011, 0x00001E99, 0x00005C4A, 0x00003C6F,\n    0x00050080, 0x00000011, 0x000056A6, 0x00001E99, 0x0000339E, 0x000500C5,\n    0x00000011, 0x0000466A, 0x000056A6, 0x00000373, 0x00050051, 0x0000000B,\n    0x000028D7, 0x00002376, 0x00000000, 0x00050051, 0x0000000B, 0x00005CB4,\n    0x00002376, 0x00000001, 0x00050051, 0x0000000B, 0x00001DDB, 0x0000466A,\n    0x00000000, 0x00050051, 0x0000000B, 0x00001E75, 0x0000466A, 0x00000001,\n    0x00070050, 0x00000017, 0x00003F22, 0x000028D7, 0x00005CB4, 0x00001DDB,\n    0x00001E75, 0x0009004F, 0x00000017, 0x00001E88, 0x00003F22, 0x00003F22,\n    0x00000000, 0x00000002, 0x00000001, 0x00000003, 0x0007004F, 0x00000011,\n    0x000021FC, 0x00004DED, 0x00004DED, 0x00000002, 0x00000003, 0x000500C7,\n    0x00000011, 0x00001C02, 0x000021FC, 0x000008A5, 0x000500C2, 0x00000011,\n    0x00001AF5, 0x00001C02, 0x000007CC, 0x000500AB, 0x0000000F, 0x000031AA,\n    0x00001AF5, 0x0000070F, 0x000500AA, 0x0000000F, 0x00004EB5, 0x00001C02,\n    0x00000203, 0x000600A9, 0x00000011, 0x00001DF0, 0x00004EB5, 0x00000218,\n    0x00001C02, 0x000600A9, 0x00000011, 0x00005A13, 0x000031AA, 0x000008A5,\n    0x0000070F, 0x000500C6, 0x00000011, 0x00005C81, 0x00001DF0, 0x00005A13,\n    0x00050080, 0x00000011, 0x00005FBD, 0x00005C81, 0x00001AF5, 0x000500C4,\n    0x00000011, 0x000022B1, 0x00005FBD, 0x0000078D, 0x000500C2, 0x00000011,\n    0x0000351F, 0x00005FBD, 0x0000074E, 0x000500C5, 0x00000011, 0x00005C4B,\n    0x000022B1, 0x0000351F, 0x000600A9, 0x00000011, 0x00003C72, 0x000031AA,\n    0x000007DF, 0x0000070F, 0x000500C6, 0x00000011, 0x00001E61, 0x00005C4B,\n    0x00003C72, 0x00050080, 0x00000011, 0x00006170, 0x00001E61, 0x00001AF5,\n    0x000500C2, 0x00000011, 0x00005F13, 0x000021FC, 0x000007E1, 0x000500C7,\n    0x00000011, 0x00002E31, 0x00005F13, 0x00000A50, 0x000500C2, 0x00000011,\n    0x000018B2, 0x00002E31, 0x000007E1, 0x000500AB, 0x0000000F, 0x000031AB,\n    0x000018B2, 0x0000070F, 0x000500AA, 0x0000000F, 0x00004EB6, 0x00002E31,\n    0x000008BA, 0x000600A9, 0x00000011, 0x00001DF1, 0x00004EB6, 0x000008CF,\n    0x00002E31, 0x000600A9, 0x00000011, 0x00005A14, 0x000031AB, 0x00000A50,\n    0x0000070F, 0x000500C6, 0x00000011, 0x00005C82, 0x00001DF1, 0x00005A14,\n    0x00050080, 0x00000011, 0x00005FBE, 0x00005C82, 0x000018B2, 0x000500C4,\n    0x00000011, 0x000022B2, 0x00005FBE, 0x00000778, 0x000500C2, 0x00000011,\n    0x00003520, 0x00005FBE, 0x00000778, 0x000500C5, 0x00000011, 0x00005C4C,\n    0x000022B2, 0x00003520, 0x000600A9, 0x00000011, 0x00003C73, 0x000031AB,\n    0x000007DF, 0x0000070F, 0x000500C6, 0x00000011, 0x00001E89, 0x00005C4C,\n    0x00003C73, 0x00050080, 0x00000011, 0x00005FF0, 0x00001E89, 0x000018B2,\n    0x000500C4, 0x00000011, 0x0000206B, 0x00005FF0, 0x0000085F, 0x000500C5,\n    0x00000011, 0x00002377, 0x00006170, 0x0000206B, 0x000500C2, 0x00000011,\n    0x00005BF8, 0x000021FC, 0x000008C8, 0x000500C2, 0x00000011, 0x0000339F,\n    0x00005BF8, 0x000007E1, 0x000500AB, 0x0000000F, 0x00002E83, 0x0000339F,\n    0x0000070F, 0x000500AA, 0x0000000F, 0x00004EB7, 0x00005BF8, 0x000008BA,\n    0x000600A9, 0x00000011, 0x00001DF2, 0x00004EB7, 0x000008CF, 0x00005BF8,\n    0x000600A9, 0x00000011, 0x00005A15, 0x00002E83, 0x00000A50, 0x0000070F,\n    0x000500C6, 0x00000011, 0x00005C83, 0x00001DF2, 0x00005A15, 0x00050080,\n    0x00000011, 0x00005FBF, 0x00005C83, 0x0000339F, 0x000500C4, 0x00000011,\n    0x000022B3, 0x00005FBF, 0x00000778, 0x000500C2, 0x00000011, 0x00003521,\n    0x00005FBF, 0x00000778, 0x000500C5, 0x00000011, 0x00005C4D, 0x000022B3,\n    0x00003521, 0x000600A9, 0x00000011, 0x00003C74, 0x00002E83, 0x000007DF,\n    0x0000070F, 0x000500C6, 0x00000011, 0x00001E9A, 0x00005C4D, 0x00003C74,\n    0x00050080, 0x00000011, 0x000056A7, 0x00001E9A, 0x0000339F, 0x000500C5,\n    0x00000011, 0x0000466B, 0x000056A7, 0x00000373, 0x00050051, 0x0000000B,\n    0x000028D8, 0x00002377, 0x00000000, 0x00050051, 0x0000000B, 0x00005CB5,\n    0x00002377, 0x00000001, 0x00050051, 0x0000000B, 0x00001DDC, 0x0000466B,\n    0x00000000, 0x00050051, 0x0000000B, 0x00001E76, 0x0000466B, 0x00000001,\n    0x00070050, 0x00000017, 0x000042C4, 0x000028D8, 0x00005CB5, 0x00001DDC,\n    0x00001E76, 0x0009004F, 0x00000017, 0x00004787, 0x000042C4, 0x000042C4,\n    0x00000000, 0x00000002, 0x00000001, 0x00000003, 0x00050080, 0x0000000B,\n    0x00004949, 0x00001F01, 0x00000A6A, 0x000500C2, 0x0000000B, 0x000029B6,\n    0x00004949, 0x00000A17, 0x00060041, 0x00000294, 0x00004BE5, 0x0000140E,\n    0x00000A0B, 0x000029B6, 0x0003003E, 0x00004BE5, 0x00001E88, 0x00050080,\n    0x0000000B, 0x0000204E, 0x00001F01, 0x00000A9A, 0x000500C2, 0x0000000B,\n    0x000019FE, 0x0000204E, 0x00000A17, 0x00060041, 0x00000294, 0x000054DF,\n    0x0000140E, 0x00000A0B, 0x000019FE, 0x0003003E, 0x000054DF, 0x00004787,\n    0x000200F9, 0x00004C7A, 0x000200F8, 0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_r11g11b10_rgba16_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25155\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n     %v4uint = OpTypeVector %uint 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v3uint = OpTypeVector %uint 3\n     %uint_0 = OpConstant %uint 0\n    %uint_22 = OpConstant %uint 22\n        %545 = OpConstantComposite %v4uint %uint_0 %uint_22 %uint_0 %uint_22\n  %uint_2047 = OpConstant %uint 2047\n  %uint_1023 = OpConstant %uint 1023\n       %1417 = OpConstantComposite %v4uint %uint_2047 %uint_1023 %uint_2047 %uint_1023\n     %uint_5 = OpConstant %uint 5\n     %uint_6 = OpConstant %uint 6\n        %185 = OpConstantComposite %v4uint %uint_5 %uint_6 %uint_5 %uint_6\n    %uint_26 = OpConstant %uint 26\n        %809 = OpConstantComposite %v4uint %uint_6 %uint_26 %uint_6 %uint_26\n    %uint_31 = OpConstant %uint 31\n    %uint_63 = OpConstant %uint 63\n       %2519 = OpConstantComposite %v4uint %uint_31 %uint_63 %uint_31 %uint_63\n%uint_4192256 = OpConstant %uint 4192256\n    %uint_10 = OpConstant %uint 10\n%uint_4063232 = OpConstant %uint 4063232\n     %uint_1 = OpConstant %uint 1\n     %uint_2 = OpConstant %uint 2\n%uint_4294901760 = OpConstant %uint 4294901760\n     %uint_3 = OpConstant %uint 3\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n    %uint_16 = OpConstant %uint 16\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n      %int_3 = OpConstant %int 3\n      %int_2 = OpConstant %int 2\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n       %1828 = OpConstantComposite %v2uint %uint_1 %uint_1\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %2603 = OpConstantComposite %v3uint %uint_3 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n     %uint_4 = OpConstant %uint 4\n    %uint_32 = OpConstant %uint 32\n    %uint_48 = OpConstant %uint 48\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n        %554 = OpConstantComposite %v2uint %uint_4192256 %uint_4192256\n       %2017 = OpConstantComposite %v2uint %uint_10 %uint_10\n        %950 = OpConstantComposite %v2uint %uint_4063232 %uint_4063232\n       %1578 = OpConstantComposite %v2uint %uint_4294901760 %uint_4294901760\n        %200 = OpConstantNull %v2uint\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24540 = OpBitwiseAnd %uint %13606 %uint_1\n      %17270 = OpINotEqual %bool %24540 %uint_0\n      %12328 = OpBitwiseAnd %uint %13606 %uint_2\n      %17284 = OpINotEqual %bool %12328 %uint_0\n       %7856 = OpShiftRightLogical %uint %13606 %uint_2\n      %25058 = OpBitwiseAnd %uint %7856 %uint_3\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2603\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %6586 DontFlatten\n               OpBranchConditional %24679 %21992 %6586\n      %21992 = OpLabel\n               OpBranch %19578\n       %6586 = OpLabel\n      %23478 = OpBitcast %v3int %21387\n      %18710 = OpCompositeExtract %uint %22410 1\n      %23531 = OpCompositeExtract %int %23478 0\n      %22810 = OpIMul %int %23531 %int_8\n       %6362 = OpCompositeExtract %int %23478 2\n      %14505 = OpBitcast %int %18710\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %23478 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %6594\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %22810 %24535\n      %10404 = OpBitcast %uint %8258\n      %14582 = OpIAdd %uint %22411 %10404\n      %12308 = OpLogicalNot %bool %17270\n               OpSelectionMerge %19040 DontFlatten\n               OpBranchConditional %12308 %9741 %17007\n       %9741 = OpLabel\n      %17463 = OpCompositeExtract %uint %21387 0\n      %11246 = OpCompositeExtract %uint %21387 1\n      %18801 = OpCompositeExtract %uint %21387 2\n      %14831 = OpIMul %uint %22409 %18801\n      %20322 = OpIAdd %uint %11246 %14831\n      %21676 = OpIMul %uint %22408 %20322\n      %20398 = OpIAdd %uint %17463 %21676\n      %11367 = OpShiftLeftLogical %uint %20398 %uint_2\n               OpBranch %19040\n      %17007 = OpLabel\n               OpSelectionMerge %23536 DontFlatten\n               OpBranchConditional %17284 %11410 %24353\n      %11410 = OpLabel\n      %21364 = OpShiftRightLogical %uint %22408 %int_5\n      %13804 = OpShiftRightLogical %uint %22409 %int_4\n      %13237 = OpShiftRightArithmetic %int %6362 %int_2\n      %22374 = OpBitcast %int %13804\n      %25085 = OpIMul %int %13237 %22374\n      %11618 = OpShiftRightArithmetic %int %17598 %int_4\n      %16670 = OpIAdd %int %25085 %11618\n      %19064 = OpBitcast %int %21364\n      %13020 = OpIMul %int %16670 %19064\n      %12986 = OpShiftRightArithmetic %int %23531 %int_5\n      %24558 = OpIAdd %int %13020 %12986\n       %8797 = OpShiftLeftLogical %int %24558 %int_7\n      %11434 = OpBitwiseAnd %int %6362 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %17598 %int_1\n      %21365 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21365 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %23531 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17334 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17334 %uint_2\n      %13015 = OpShiftRightArithmetic %int %17598 %int_3\n       %9929 = OpBitwiseXor %int %13015 %13237\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %23531 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %17598 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6551\n       %7168 = OpShiftLeftLogical %int %16793 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24144 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24144 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24144 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24144 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %23536\n      %24353 = OpLabel\n      %23000 = OpBitcast %v2int %17136\n      %22120 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %23000 1\n      %12089 = OpShiftRightArithmetic %int %14597 %int_5\n      %22400 = OpBitcast %int %22120\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %23000 0\n      %20423 = OpShiftRightArithmetic %int %25154 %int_5\n      %18864 = OpIAdd %int %7938 %20423\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25154 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17335 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17335 %uint_2\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25154 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6552\n       %7169 = OpShiftLeftLogical %int %21575 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24163 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24163 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24163 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %23536\n      %23536 = OpLabel\n      %10540 = OpPhi %uint %16869 %11410 %16870 %24353\n               OpBranch %19040\n      %19040 = OpLabel\n      %11376 = OpPhi %uint %11367 %9741 %10540 %23536\n      %18621 = OpIAdd %uint %11376 %24236\n      %15698 = OpShiftRightLogical %uint %18621 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15698\n       %7338 = OpLoad %v4uint %20399\n      %13760 = OpIEqual %bool %25058 %uint_1\n      %21366 = OpIEqual %bool %25058 %uint_2\n      %22150 = OpLogicalOr %bool %13760 %21366\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %7338 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %7338 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22649 = OpPhi %v4uint %7338 %19040 %16376 %10583\n      %19638 = OpIEqual %bool %25058 %uint_3\n      %15139 = OpLogicalOr %bool %21366 %19638\n               OpSelectionMerge %11682 None\n               OpBranchConditional %15139 %11064 %11682\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22649 %749\n      %15335 = OpShiftRightLogical %v4uint %22649 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %11682\n      %11682 = OpLabel\n      %17668 = OpPhi %v4uint %22649 %13411 %10728 %11064\n      %22862 = OpVectorShuffle %v2uint %17668 %17668 0 1\n      %10663 = OpVectorShuffle %v4uint %17668 %200 0 0 1 1\n       %9600 = OpShiftRightLogical %v4uint %10663 %545\n       %7908 = OpBitwiseAnd %v4uint %9600 %1417\n      %24647 = OpShiftLeftLogical %v4uint %7908 %185\n      %22610 = OpShiftRightLogical %v4uint %10663 %809\n      %21478 = OpBitwiseAnd %v4uint %22610 %2519\n      %15532 = OpBitwiseOr %v4uint %24647 %21478\n      %20095 = OpBitwiseAnd %v2uint %22862 %554\n      %22878 = OpShiftLeftLogical %v2uint %20095 %2017\n      %20653 = OpBitwiseAnd %v2uint %22862 %950\n      %14319 = OpShiftRightLogical %v2uint %20653 %1828\n       %6675 = OpBitwiseOr %v2uint %22878 %14319\n      %14801 = OpVectorShuffle %v2uint %15532 %15532 0 2\n      %20933 = OpBitwiseOr %v2uint %14801 %6675\n      %19024 = OpCompositeExtract %uint %20933 0\n       %7209 = OpCompositeExtract %uint %20933 1\n      %23049 = OpVectorShuffle %v2uint %15532 %15532 1 3\n      %23934 = OpBitwiseOr %v2uint %23049 %1578\n      %19043 = OpCompositeExtract %uint %23934 0\n      %23865 = OpCompositeExtract %uint %23934 1\n      %16161 = OpCompositeConstruct %v4uint %19024 %19043 %7209 %23865\n       %7717 = OpVectorShuffle %v2uint %17668 %17668 2 3\n       %9659 = OpVectorShuffle %v4uint %17668 %200 2 2 3 3\n       %9601 = OpShiftRightLogical %v4uint %9659 %545\n       %7909 = OpBitwiseAnd %v4uint %9601 %1417\n      %24648 = OpShiftLeftLogical %v4uint %7909 %185\n      %22611 = OpShiftRightLogical %v4uint %9659 %809\n      %21479 = OpBitwiseAnd %v4uint %22611 %2519\n      %15533 = OpBitwiseOr %v4uint %24648 %21479\n      %20096 = OpBitwiseAnd %v2uint %7717 %554\n      %22879 = OpShiftLeftLogical %v2uint %20096 %2017\n      %20654 = OpBitwiseAnd %v2uint %7717 %950\n      %14320 = OpShiftRightLogical %v2uint %20654 %1828\n       %6676 = OpBitwiseOr %v2uint %22879 %14320\n      %14802 = OpVectorShuffle %v2uint %15533 %15533 0 2\n      %20934 = OpBitwiseOr %v2uint %14802 %6676\n      %19025 = OpCompositeExtract %uint %20934 0\n       %7210 = OpCompositeExtract %uint %20934 1\n      %23050 = OpVectorShuffle %v2uint %15533 %15533 1 3\n      %23935 = OpBitwiseOr %v2uint %23050 %1578\n      %19044 = OpCompositeExtract %uint %23935 0\n       %6979 = OpCompositeExtract %uint %23935 1\n      %15071 = OpCompositeConstruct %v4uint %19025 %19044 %7210 %6979\n      %12529 = OpShiftRightLogical %uint %14582 %int_4\n      %13001 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %12529\n               OpStore %13001 %16161\n       %8268 = OpIAdd %uint %14582 %uint_16\n       %6653 = OpShiftRightLogical %uint %8268 %int_4\n      %21689 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %6653\n               OpStore %21689 %15071\n               OpSelectionMerge %24688 DontFlatten\n               OpBranchConditional %17270 %21993 %7205\n      %21993 = OpLabel\n               OpBranch %24688\n       %7205 = OpLabel\n               OpBranch %24688\n      %24688 = OpLabel\n      %11377 = OpPhi %uint %uint_32 %21993 %uint_16 %7205\n      %18622 = OpIAdd %uint %18621 %11377\n      %15699 = OpShiftRightLogical %uint %18622 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15699\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %14874 None\n               OpBranchConditional %22150 %10584 %14874\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20657 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20657 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %14874\n      %14874 = OpLabel\n      %10924 = OpPhi %v4uint %14608 %24688 %16377 %10584\n               OpSelectionMerge %11683 None\n               OpBranchConditional %15139 %11065 %11683\n      %11065 = OpLabel\n      %24088 = OpShiftLeftLogical %v4uint %10924 %749\n      %15336 = OpShiftRightLogical %v4uint %10924 %749\n      %10729 = OpBitwiseOr %v4uint %24088 %15336\n               OpBranch %11683\n      %11683 = OpLabel\n      %17669 = OpPhi %v4uint %10924 %14874 %10729 %11065\n      %22863 = OpVectorShuffle %v2uint %17669 %17669 0 1\n      %10664 = OpVectorShuffle %v4uint %17669 %200 0 0 1 1\n       %9602 = OpShiftRightLogical %v4uint %10664 %545\n       %7910 = OpBitwiseAnd %v4uint %9602 %1417\n      %24649 = OpShiftLeftLogical %v4uint %7910 %185\n      %22612 = OpShiftRightLogical %v4uint %10664 %809\n      %21480 = OpBitwiseAnd %v4uint %22612 %2519\n      %15534 = OpBitwiseOr %v4uint %24649 %21480\n      %20097 = OpBitwiseAnd %v2uint %22863 %554\n      %22880 = OpShiftLeftLogical %v2uint %20097 %2017\n      %20658 = OpBitwiseAnd %v2uint %22863 %950\n      %14321 = OpShiftRightLogical %v2uint %20658 %1828\n       %6677 = OpBitwiseOr %v2uint %22880 %14321\n      %14803 = OpVectorShuffle %v2uint %15534 %15534 0 2\n      %20935 = OpBitwiseOr %v2uint %14803 %6677\n      %19026 = OpCompositeExtract %uint %20935 0\n       %7211 = OpCompositeExtract %uint %20935 1\n      %23051 = OpVectorShuffle %v2uint %15534 %15534 1 3\n      %23936 = OpBitwiseOr %v2uint %23051 %1578\n      %19045 = OpCompositeExtract %uint %23936 0\n      %23866 = OpCompositeExtract %uint %23936 1\n      %16162 = OpCompositeConstruct %v4uint %19026 %19045 %7211 %23866\n       %7718 = OpVectorShuffle %v2uint %17669 %17669 2 3\n       %9660 = OpVectorShuffle %v4uint %17669 %200 2 2 3 3\n       %9603 = OpShiftRightLogical %v4uint %9660 %545\n       %7911 = OpBitwiseAnd %v4uint %9603 %1417\n      %24650 = OpShiftLeftLogical %v4uint %7911 %185\n      %22613 = OpShiftRightLogical %v4uint %9660 %809\n      %21481 = OpBitwiseAnd %v4uint %22613 %2519\n      %15535 = OpBitwiseOr %v4uint %24650 %21481\n      %20098 = OpBitwiseAnd %v2uint %7718 %554\n      %22881 = OpShiftLeftLogical %v2uint %20098 %2017\n      %20659 = OpBitwiseAnd %v2uint %7718 %950\n      %14322 = OpShiftRightLogical %v2uint %20659 %1828\n       %6678 = OpBitwiseOr %v2uint %22881 %14322\n      %14804 = OpVectorShuffle %v2uint %15535 %15535 0 2\n      %20936 = OpBitwiseOr %v2uint %14804 %6678\n      %19027 = OpCompositeExtract %uint %20936 0\n       %7212 = OpCompositeExtract %uint %20936 1\n      %23052 = OpVectorShuffle %v2uint %15535 %15535 1 3\n      %23937 = OpBitwiseOr %v2uint %23052 %1578\n      %19046 = OpCompositeExtract %uint %23937 0\n      %24796 = OpCompositeExtract %uint %23937 1\n       %9869 = OpCompositeConstruct %v4uint %19027 %19046 %7212 %24796\n      %16090 = OpIAdd %uint %14582 %uint_32\n       %8256 = OpShiftRightLogical %uint %16090 %int_4\n      %19428 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %8256\n               OpStore %19428 %16162\n       %8269 = OpIAdd %uint %14582 %uint_48\n       %6654 = OpShiftRightLogical %uint %8269 %int_4\n      %21727 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %6654\n               OpStore %21727 %9869\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_r11g11b10_rgba16_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006243, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000017,\n    0x0000000B, 0x00000004, 0x00040015, 0x0000000C, 0x00000020, 0x00000001,\n    0x00040017, 0x00000012, 0x0000000C, 0x00000002, 0x00040017, 0x00000016,\n    0x0000000C, 0x00000003, 0x00020014, 0x00000009, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000,\n    0x0004002B, 0x0000000B, 0x00000A4C, 0x00000016, 0x0007002C, 0x00000017,\n    0x00000221, 0x00000A0A, 0x00000A4C, 0x00000A0A, 0x00000A4C, 0x0004002B,\n    0x0000000B, 0x00000A81, 0x000007FF, 0x0004002B, 0x0000000B, 0x00000A44,\n    0x000003FF, 0x0007002C, 0x00000017, 0x00000589, 0x00000A81, 0x00000A44,\n    0x00000A81, 0x00000A44, 0x0004002B, 0x0000000B, 0x00000A19, 0x00000005,\n    0x0004002B, 0x0000000B, 0x00000A1C, 0x00000006, 0x0007002C, 0x00000017,\n    0x000000B9, 0x00000A19, 0x00000A1C, 0x00000A19, 0x00000A1C, 0x0004002B,\n    0x0000000B, 0x00000A58, 0x0000001A, 0x0007002C, 0x00000017, 0x00000329,\n    0x00000A1C, 0x00000A58, 0x00000A1C, 0x00000A58, 0x0004002B, 0x0000000B,\n    0x00000A67, 0x0000001F, 0x0004002B, 0x0000000B, 0x00000AC7, 0x0000003F,\n    0x0007002C, 0x00000017, 0x000009D7, 0x00000A67, 0x00000AC7, 0x00000A67,\n    0x00000AC7, 0x0004002B, 0x0000000B, 0x00000957, 0x003FF800, 0x0004002B,\n    0x0000000B, 0x00000A28, 0x0000000A, 0x0004002B, 0x0000000B, 0x000002D7,\n    0x003E0000, 0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001, 0x0004002B,\n    0x0000000B, 0x00000A10, 0x00000002, 0x0004002B, 0x0000000B, 0x0000068D,\n    0xFFFF0000, 0x0004002B, 0x0000000B, 0x00000A13, 0x00000003, 0x0004002B,\n    0x0000000B, 0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B, 0x00000A22,\n    0x00000008, 0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00, 0x0004002B,\n    0x0000000B, 0x00000A3A, 0x00000010, 0x0004002B, 0x0000000C, 0x00000A17,\n    0x00000004, 0x0004002B, 0x0000000C, 0x00000A1D, 0x00000006, 0x0004002B,\n    0x0000000C, 0x00000A2C, 0x0000000B, 0x0004002B, 0x0000000C, 0x00000A38,\n    0x0000000F, 0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001, 0x0004002B,\n    0x0000000C, 0x00000A1A, 0x00000005, 0x0004002B, 0x0000000C, 0x00000A20,\n    0x00000007, 0x0004002B, 0x0000000C, 0x00000A23, 0x00000008, 0x0004002B,\n    0x0000000C, 0x00000A2F, 0x0000000C, 0x0004002B, 0x0000000C, 0x00000A14,\n    0x00000003, 0x0004002B, 0x0000000C, 0x00000A11, 0x00000002, 0x0004002B,\n    0x0000000C, 0x00000A0B, 0x00000000, 0x000A001E, 0x00000489, 0x0000000B,\n    0x0000000B, 0x0000000B, 0x0000000B, 0x00000014, 0x0000000B, 0x0000000B,\n    0x0000000B, 0x00040020, 0x00000706, 0x00000009, 0x00000489, 0x0004003B,\n    0x00000706, 0x00000CE9, 0x00000009, 0x00040020, 0x00000288, 0x00000009,\n    0x0000000B, 0x0005002C, 0x00000011, 0x00000724, 0x00000A0D, 0x00000A0D,\n    0x00040020, 0x00000291, 0x00000009, 0x00000014, 0x00040020, 0x00000292,\n    0x00000001, 0x00000014, 0x0004003B, 0x00000292, 0x00000F48, 0x00000001,\n    0x0006002C, 0x00000014, 0x00000A2B, 0x00000A13, 0x00000A0A, 0x00000A0A,\n    0x00040017, 0x0000000F, 0x00000009, 0x00000002, 0x0003001D, 0x000007DC,\n    0x00000017, 0x0003001E, 0x000007B4, 0x000007DC, 0x00040020, 0x00000A31,\n    0x00000002, 0x000007B4, 0x0004003B, 0x00000A31, 0x0000107A, 0x00000002,\n    0x00040020, 0x00000294, 0x00000002, 0x00000017, 0x0003001D, 0x000007DD,\n    0x00000017, 0x0003001E, 0x000007B5, 0x000007DD, 0x00040020, 0x00000A32,\n    0x00000002, 0x000007B5, 0x0004003B, 0x00000A32, 0x0000140E, 0x00000002,\n    0x0004002B, 0x0000000B, 0x00000A16, 0x00000004, 0x0004002B, 0x0000000B,\n    0x00000A6A, 0x00000020, 0x0004002B, 0x0000000B, 0x00000A9A, 0x00000030,\n    0x0006002C, 0x00000014, 0x00000BC3, 0x00000A16, 0x00000A6A, 0x00000A0D,\n    0x0007002C, 0x00000017, 0x000009CE, 0x000008A6, 0x000008A6, 0x000008A6,\n    0x000008A6, 0x0007002C, 0x00000017, 0x0000013D, 0x00000A22, 0x00000A22,\n    0x00000A22, 0x00000A22, 0x0007002C, 0x00000017, 0x0000072E, 0x000005FD,\n    0x000005FD, 0x000005FD, 0x000005FD, 0x0007002C, 0x00000017, 0x000002ED,\n    0x00000A3A, 0x00000A3A, 0x00000A3A, 0x00000A3A, 0x0005002C, 0x00000011,\n    0x0000022A, 0x00000957, 0x00000957, 0x0005002C, 0x00000011, 0x000007E1,\n    0x00000A28, 0x00000A28, 0x0005002C, 0x00000011, 0x000003B6, 0x000002D7,\n    0x000002D7, 0x0005002C, 0x00000011, 0x0000062A, 0x0000068D, 0x0000068D,\n    0x0003002E, 0x00000011, 0x000000C8, 0x00050036, 0x00000008, 0x0000161F,\n    0x00000000, 0x00000502, 0x000200F8, 0x00003B06, 0x000300F7, 0x00004C7A,\n    0x00000000, 0x000300FB, 0x00000A0A, 0x00002E68, 0x000200F8, 0x00002E68,\n    0x00050041, 0x00000288, 0x000060D7, 0x00000CE9, 0x00000A0B, 0x0004003D,\n    0x0000000B, 0x00003526, 0x000060D7, 0x000500C7, 0x0000000B, 0x00005FDC,\n    0x00003526, 0x00000A0D, 0x000500AB, 0x00000009, 0x00004376, 0x00005FDC,\n    0x00000A0A, 0x000500C7, 0x0000000B, 0x00003028, 0x00003526, 0x00000A10,\n    0x000500AB, 0x00000009, 0x00004384, 0x00003028, 0x00000A0A, 0x000500C2,\n    0x0000000B, 0x00001EB0, 0x00003526, 0x00000A10, 0x000500C7, 0x0000000B,\n    0x000061E2, 0x00001EB0, 0x00000A13, 0x00050041, 0x00000288, 0x0000492C,\n    0x00000CE9, 0x00000A0E, 0x0004003D, 0x0000000B, 0x00005EAC, 0x0000492C,\n    0x00050041, 0x00000288, 0x00004EBA, 0x00000CE9, 0x00000A11, 0x0004003D,\n    0x0000000B, 0x00005788, 0x00004EBA, 0x00050041, 0x00000288, 0x00004EBB,\n    0x00000CE9, 0x00000A14, 0x0004003D, 0x0000000B, 0x00005789, 0x00004EBB,\n    0x00050041, 0x00000291, 0x00004EBC, 0x00000CE9, 0x00000A17, 0x0004003D,\n    0x00000014, 0x0000578A, 0x00004EBC, 0x00050041, 0x00000288, 0x00004EBD,\n    0x00000CE9, 0x00000A1A, 0x0004003D, 0x0000000B, 0x0000578B, 0x00004EBD,\n    0x00050041, 0x00000288, 0x00004E6E, 0x00000CE9, 0x00000A1D, 0x0004003D,\n    0x0000000B, 0x000019C2, 0x00004E6E, 0x0004003D, 0x00000014, 0x00002A0E,\n    0x00000F48, 0x000500C4, 0x00000014, 0x0000538B, 0x00002A0E, 0x00000A2B,\n    0x0007004F, 0x00000011, 0x000042F0, 0x0000538B, 0x0000538B, 0x00000000,\n    0x00000001, 0x0007004F, 0x00000011, 0x0000242F, 0x0000578A, 0x0000578A,\n    0x00000000, 0x00000001, 0x000500AE, 0x0000000F, 0x00004288, 0x000042F0,\n    0x0000242F, 0x0004009A, 0x00000009, 0x00006067, 0x00004288, 0x000300F7,\n    0x000019BA, 0x00000002, 0x000400FA, 0x00006067, 0x000055E8, 0x000019BA,\n    0x000200F8, 0x000055E8, 0x000200F9, 0x00004C7A, 0x000200F8, 0x000019BA,\n    0x0004007C, 0x00000016, 0x00005BB6, 0x0000538B, 0x00050051, 0x0000000B,\n    0x00004916, 0x0000578A, 0x00000001, 0x00050051, 0x0000000C, 0x00005BEB,\n    0x00005BB6, 0x00000000, 0x00050084, 0x0000000C, 0x0000591A, 0x00005BEB,\n    0x00000A23, 0x00050051, 0x0000000C, 0x000018DA, 0x00005BB6, 0x00000002,\n    0x0004007C, 0x0000000C, 0x000038A9, 0x00004916, 0x00050084, 0x0000000C,\n    0x00002C0F, 0x000018DA, 0x000038A9, 0x00050051, 0x0000000C, 0x000044BE,\n    0x00005BB6, 0x00000001, 0x00050080, 0x0000000C, 0x000056D4, 0x00002C0F,\n    0x000044BE, 0x0004007C, 0x0000000C, 0x00005785, 0x000019C2, 0x00050084,\n    0x0000000C, 0x00005FD7, 0x000056D4, 0x00005785, 0x00050080, 0x0000000C,\n    0x00002042, 0x0000591A, 0x00005FD7, 0x0004007C, 0x0000000B, 0x000028A4,\n    0x00002042, 0x00050080, 0x0000000B, 0x000038F6, 0x0000578B, 0x000028A4,\n    0x000400A8, 0x00000009, 0x00003014, 0x00004376, 0x000300F7, 0x00004A60,\n    0x00000002, 0x000400FA, 0x00003014, 0x0000260D, 0x0000426F, 0x000200F8,\n    0x0000260D, 0x00050051, 0x0000000B, 0x00004437, 0x0000538B, 0x00000000,\n    0x00050051, 0x0000000B, 0x00002BEE, 0x0000538B, 0x00000001, 0x00050051,\n    0x0000000B, 0x00004971, 0x0000538B, 0x00000002, 0x00050084, 0x0000000B,\n    0x000039EF, 0x00005789, 0x00004971, 0x00050080, 0x0000000B, 0x00004F62,\n    0x00002BEE, 0x000039EF, 0x00050084, 0x0000000B, 0x000054AC, 0x00005788,\n    0x00004F62, 0x00050080, 0x0000000B, 0x00004FAE, 0x00004437, 0x000054AC,\n    0x000500C4, 0x0000000B, 0x00002C67, 0x00004FAE, 0x00000A10, 0x000200F9,\n    0x00004A60, 0x000200F8, 0x0000426F, 0x000300F7, 0x00005BF0, 0x00000002,\n    0x000400FA, 0x00004384, 0x00002C92, 0x00005F21, 0x000200F8, 0x00002C92,\n    0x000500C2, 0x0000000B, 0x00005374, 0x00005788, 0x00000A1A, 0x000500C2,\n    0x0000000B, 0x000035EC, 0x00005789, 0x00000A17, 0x000500C3, 0x0000000C,\n    0x000033B5, 0x000018DA, 0x00000A11, 0x0004007C, 0x0000000C, 0x00005766,\n    0x000035EC, 0x00050084, 0x0000000C, 0x000061FD, 0x000033B5, 0x00005766,\n    0x000500C3, 0x0000000C, 0x00002D62, 0x000044BE, 0x00000A17, 0x00050080,\n    0x0000000C, 0x0000411E, 0x000061FD, 0x00002D62, 0x0004007C, 0x0000000C,\n    0x00004A78, 0x00005374, 0x00050084, 0x0000000C, 0x000032DC, 0x0000411E,\n    0x00004A78, 0x000500C3, 0x0000000C, 0x000032BA, 0x00005BEB, 0x00000A1A,\n    0x00050080, 0x0000000C, 0x00005FEE, 0x000032DC, 0x000032BA, 0x000500C4,\n    0x0000000C, 0x0000225D, 0x00005FEE, 0x00000A20, 0x000500C7, 0x0000000C,\n    0x00002CAA, 0x000018DA, 0x00000A14, 0x000500C4, 0x0000000C, 0x00004CAE,\n    0x00002CAA, 0x00000A1A, 0x000500C3, 0x0000000C, 0x0000383E, 0x000044BE,\n    0x00000A0E, 0x000500C7, 0x0000000C, 0x00005375, 0x0000383E, 0x00000A14,\n    0x000500C4, 0x0000000C, 0x000054CA, 0x00005375, 0x00000A14, 0x000500C5,\n    0x0000000C, 0x000042CE, 0x00004CAE, 0x000054CA, 0x000500C7, 0x0000000C,\n    0x000050D5, 0x00005BEB, 0x00000A20, 0x000500C5, 0x0000000C, 0x00003ADD,\n    0x000042CE, 0x000050D5, 0x000500C5, 0x0000000C, 0x000043B6, 0x0000225D,\n    0x00003ADD, 0x000500C4, 0x0000000C, 0x00005E50, 0x000043B6, 0x00000A10,\n    0x000500C3, 0x0000000C, 0x000032D7, 0x000044BE, 0x00000A14, 0x000500C6,\n    0x0000000C, 0x000026C9, 0x000032D7, 0x000033B5, 0x000500C7, 0x0000000C,\n    0x00004199, 0x000026C9, 0x00000A0E, 0x000500C3, 0x0000000C, 0x00002590,\n    0x00005BEB, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000505E, 0x00002590,\n    0x00000A14, 0x000500C4, 0x0000000C, 0x0000541D, 0x00004199, 0x00000A0E,\n    0x000500C6, 0x0000000C, 0x000022BA, 0x0000505E, 0x0000541D, 0x000500C7,\n    0x0000000C, 0x00005076, 0x000044BE, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x00005228, 0x00005076, 0x00000A17, 0x000500C4, 0x0000000C, 0x00001997,\n    0x000022BA, 0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FE, 0x00005228,\n    0x00001997, 0x000500C4, 0x0000000C, 0x00001C00, 0x00004199, 0x00000A2C,\n    0x000500C5, 0x0000000C, 0x00003C81, 0x000047FE, 0x00001C00, 0x000500C7,\n    0x0000000C, 0x000050AF, 0x00005E50, 0x00000A38, 0x000500C5, 0x0000000C,\n    0x00003C70, 0x00003C81, 0x000050AF, 0x000500C3, 0x0000000C, 0x00003745,\n    0x00005E50, 0x00000A17, 0x000500C7, 0x0000000C, 0x000018B8, 0x00003745,\n    0x00000A0E, 0x000500C4, 0x0000000C, 0x0000547E, 0x000018B8, 0x00000A1A,\n    0x000500C5, 0x0000000C, 0x000045A8, 0x00003C70, 0x0000547E, 0x000500C3,\n    0x0000000C, 0x00003A6E, 0x00005E50, 0x00000A1A, 0x000500C7, 0x0000000C,\n    0x000018B9, 0x00003A6E, 0x00000A20, 0x000500C4, 0x0000000C, 0x0000547F,\n    0x000018B9, 0x00000A23, 0x000500C5, 0x0000000C, 0x0000456F, 0x000045A8,\n    0x0000547F, 0x000500C3, 0x0000000C, 0x00003C88, 0x00005E50, 0x00000A23,\n    0x000500C4, 0x0000000C, 0x00002824, 0x00003C88, 0x00000A2F, 0x000500C5,\n    0x0000000C, 0x00003B79, 0x0000456F, 0x00002824, 0x0004007C, 0x0000000B,\n    0x000041E5, 0x00003B79, 0x000200F9, 0x00005BF0, 0x000200F8, 0x00005F21,\n    0x0004007C, 0x00000012, 0x000059D8, 0x000042F0, 0x000500C2, 0x0000000B,\n    0x00005668, 0x00005788, 0x00000A1A, 0x00050051, 0x0000000C, 0x00003905,\n    0x000059D8, 0x00000001, 0x000500C3, 0x0000000C, 0x00002F39, 0x00003905,\n    0x00000A1A, 0x0004007C, 0x0000000C, 0x00005780, 0x00005668, 0x00050084,\n    0x0000000C, 0x00001F02, 0x00002F39, 0x00005780, 0x00050051, 0x0000000C,\n    0x00006242, 0x000059D8, 0x00000000, 0x000500C3, 0x0000000C, 0x00004FC7,\n    0x00006242, 0x00000A1A, 0x00050080, 0x0000000C, 0x000049B0, 0x00001F02,\n    0x00004FC7, 0x000500C4, 0x0000000C, 0x0000254A, 0x000049B0, 0x00000A1D,\n    0x000500C3, 0x0000000C, 0x0000603B, 0x00003905, 0x00000A0E, 0x000500C7,\n    0x0000000C, 0x0000539A, 0x0000603B, 0x00000A20, 0x000500C4, 0x0000000C,\n    0x0000534A, 0x0000539A, 0x00000A14, 0x000500C7, 0x0000000C, 0x00004EA5,\n    0x00006242, 0x00000A20, 0x000500C5, 0x0000000C, 0x00002B1A, 0x0000534A,\n    0x00004EA5, 0x000500C5, 0x0000000C, 0x000043B7, 0x0000254A, 0x00002B1A,\n    0x000500C4, 0x0000000C, 0x00005E63, 0x000043B7, 0x00000A10, 0x000500C3,\n    0x0000000C, 0x000031DE, 0x00003905, 0x00000A17, 0x000500C7, 0x0000000C,\n    0x00005447, 0x000031DE, 0x00000A0E, 0x000500C3, 0x0000000C, 0x000028A6,\n    0x00006242, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000511E, 0x000028A6,\n    0x00000A14, 0x000500C3, 0x0000000C, 0x000028B9, 0x00003905, 0x00000A14,\n    0x000500C7, 0x0000000C, 0x0000505F, 0x000028B9, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x0000541E, 0x0000505F, 0x00000A0E, 0x000500C6, 0x0000000C,\n    0x000022BB, 0x0000511E, 0x0000541E, 0x000500C7, 0x0000000C, 0x00005077,\n    0x00003905, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005229, 0x00005077,\n    0x00000A17, 0x000500C4, 0x0000000C, 0x00001998, 0x000022BB, 0x00000A1D,\n    0x000500C5, 0x0000000C, 0x000047FF, 0x00005229, 0x00001998, 0x000500C4,\n    0x0000000C, 0x00001C01, 0x00005447, 0x00000A2C, 0x000500C5, 0x0000000C,\n    0x00003C82, 0x000047FF, 0x00001C01, 0x000500C7, 0x0000000C, 0x000050B0,\n    0x00005E63, 0x00000A38, 0x000500C5, 0x0000000C, 0x00003C71, 0x00003C82,\n    0x000050B0, 0x000500C3, 0x0000000C, 0x00003746, 0x00005E63, 0x00000A17,\n    0x000500C7, 0x0000000C, 0x000018BA, 0x00003746, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x00005480, 0x000018BA, 0x00000A1A, 0x000500C5, 0x0000000C,\n    0x000045A9, 0x00003C71, 0x00005480, 0x000500C3, 0x0000000C, 0x00003A6F,\n    0x00005E63, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018BB, 0x00003A6F,\n    0x00000A20, 0x000500C4, 0x0000000C, 0x00005481, 0x000018BB, 0x00000A23,\n    0x000500C5, 0x0000000C, 0x00004570, 0x000045A9, 0x00005481, 0x000500C3,\n    0x0000000C, 0x00003C89, 0x00005E63, 0x00000A23, 0x000500C4, 0x0000000C,\n    0x00002825, 0x00003C89, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B7A,\n    0x00004570, 0x00002825, 0x0004007C, 0x0000000B, 0x000041E6, 0x00003B7A,\n    0x000200F9, 0x00005BF0, 0x000200F8, 0x00005BF0, 0x000700F5, 0x0000000B,\n    0x0000292C, 0x000041E5, 0x00002C92, 0x000041E6, 0x00005F21, 0x000200F9,\n    0x00004A60, 0x000200F8, 0x00004A60, 0x000700F5, 0x0000000B, 0x00002C70,\n    0x00002C67, 0x0000260D, 0x0000292C, 0x00005BF0, 0x00050080, 0x0000000B,\n    0x000048BD, 0x00002C70, 0x00005EAC, 0x000500C2, 0x0000000B, 0x00003D52,\n    0x000048BD, 0x00000A17, 0x00060041, 0x00000294, 0x00004FAF, 0x0000107A,\n    0x00000A0B, 0x00003D52, 0x0004003D, 0x00000017, 0x00001CAA, 0x00004FAF,\n    0x000500AA, 0x00000009, 0x000035C0, 0x000061E2, 0x00000A0D, 0x000500AA,\n    0x00000009, 0x00005376, 0x000061E2, 0x00000A10, 0x000500A6, 0x00000009,\n    0x00005686, 0x000035C0, 0x00005376, 0x000300F7, 0x00003463, 0x00000000,\n    0x000400FA, 0x00005686, 0x00002957, 0x00003463, 0x000200F8, 0x00002957,\n    0x000500C7, 0x00000017, 0x0000475F, 0x00001CAA, 0x000009CE, 0x000500C4,\n    0x00000017, 0x000024D1, 0x0000475F, 0x0000013D, 0x000500C7, 0x00000017,\n    0x000050AC, 0x00001CAA, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448D,\n    0x000050AC, 0x0000013D, 0x000500C5, 0x00000017, 0x00003FF8, 0x000024D1,\n    0x0000448D, 0x000200F9, 0x00003463, 0x000200F8, 0x00003463, 0x000700F5,\n    0x00000017, 0x00005879, 0x00001CAA, 0x00004A60, 0x00003FF8, 0x00002957,\n    0x000500AA, 0x00000009, 0x00004CB6, 0x000061E2, 0x00000A13, 0x000500A6,\n    0x00000009, 0x00003B23, 0x00005376, 0x00004CB6, 0x000300F7, 0x00002DA2,\n    0x00000000, 0x000400FA, 0x00003B23, 0x00002B38, 0x00002DA2, 0x000200F8,\n    0x00002B38, 0x000500C4, 0x00000017, 0x00005E17, 0x00005879, 0x000002ED,\n    0x000500C2, 0x00000017, 0x00003BE7, 0x00005879, 0x000002ED, 0x000500C5,\n    0x00000017, 0x000029E8, 0x00005E17, 0x00003BE7, 0x000200F9, 0x00002DA2,\n    0x000200F8, 0x00002DA2, 0x000700F5, 0x00000017, 0x00004504, 0x00005879,\n    0x00003463, 0x000029E8, 0x00002B38, 0x0007004F, 0x00000011, 0x0000594E,\n    0x00004504, 0x00004504, 0x00000000, 0x00000001, 0x0009004F, 0x00000017,\n    0x000029A7, 0x00004504, 0x000000C8, 0x00000000, 0x00000000, 0x00000001,\n    0x00000001, 0x000500C2, 0x00000017, 0x00002580, 0x000029A7, 0x00000221,\n    0x000500C7, 0x00000017, 0x00001EE4, 0x00002580, 0x00000589, 0x000500C4,\n    0x00000017, 0x00006047, 0x00001EE4, 0x000000B9, 0x000500C2, 0x00000017,\n    0x00005852, 0x000029A7, 0x00000329, 0x000500C7, 0x00000017, 0x000053E6,\n    0x00005852, 0x000009D7, 0x000500C5, 0x00000017, 0x00003CAC, 0x00006047,\n    0x000053E6, 0x000500C7, 0x00000011, 0x00004E7F, 0x0000594E, 0x0000022A,\n    0x000500C4, 0x00000011, 0x0000595E, 0x00004E7F, 0x000007E1, 0x000500C7,\n    0x00000011, 0x000050AD, 0x0000594E, 0x000003B6, 0x000500C2, 0x00000011,\n    0x000037EF, 0x000050AD, 0x00000724, 0x000500C5, 0x00000011, 0x00001A13,\n    0x0000595E, 0x000037EF, 0x0007004F, 0x00000011, 0x000039D1, 0x00003CAC,\n    0x00003CAC, 0x00000000, 0x00000002, 0x000500C5, 0x00000011, 0x000051C5,\n    0x000039D1, 0x00001A13, 0x00050051, 0x0000000B, 0x00004A50, 0x000051C5,\n    0x00000000, 0x00050051, 0x0000000B, 0x00001C29, 0x000051C5, 0x00000001,\n    0x0007004F, 0x00000011, 0x00005A09, 0x00003CAC, 0x00003CAC, 0x00000001,\n    0x00000003, 0x000500C5, 0x00000011, 0x00005D7E, 0x00005A09, 0x0000062A,\n    0x00050051, 0x0000000B, 0x00004A63, 0x00005D7E, 0x00000000, 0x00050051,\n    0x0000000B, 0x00005D39, 0x00005D7E, 0x00000001, 0x00070050, 0x00000017,\n    0x00003F21, 0x00004A50, 0x00004A63, 0x00001C29, 0x00005D39, 0x0007004F,\n    0x00000011, 0x00001E25, 0x00004504, 0x00004504, 0x00000002, 0x00000003,\n    0x0009004F, 0x00000017, 0x000025BB, 0x00004504, 0x000000C8, 0x00000002,\n    0x00000002, 0x00000003, 0x00000003, 0x000500C2, 0x00000017, 0x00002581,\n    0x000025BB, 0x00000221, 0x000500C7, 0x00000017, 0x00001EE5, 0x00002581,\n    0x00000589, 0x000500C4, 0x00000017, 0x00006048, 0x00001EE5, 0x000000B9,\n    0x000500C2, 0x00000017, 0x00005853, 0x000025BB, 0x00000329, 0x000500C7,\n    0x00000017, 0x000053E7, 0x00005853, 0x000009D7, 0x000500C5, 0x00000017,\n    0x00003CAD, 0x00006048, 0x000053E7, 0x000500C7, 0x00000011, 0x00004E80,\n    0x00001E25, 0x0000022A, 0x000500C4, 0x00000011, 0x0000595F, 0x00004E80,\n    0x000007E1, 0x000500C7, 0x00000011, 0x000050AE, 0x00001E25, 0x000003B6,\n    0x000500C2, 0x00000011, 0x000037F0, 0x000050AE, 0x00000724, 0x000500C5,\n    0x00000011, 0x00001A14, 0x0000595F, 0x000037F0, 0x0007004F, 0x00000011,\n    0x000039D2, 0x00003CAD, 0x00003CAD, 0x00000000, 0x00000002, 0x000500C5,\n    0x00000011, 0x000051C6, 0x000039D2, 0x00001A14, 0x00050051, 0x0000000B,\n    0x00004A51, 0x000051C6, 0x00000000, 0x00050051, 0x0000000B, 0x00001C2A,\n    0x000051C6, 0x00000001, 0x0007004F, 0x00000011, 0x00005A0A, 0x00003CAD,\n    0x00003CAD, 0x00000001, 0x00000003, 0x000500C5, 0x00000011, 0x00005D7F,\n    0x00005A0A, 0x0000062A, 0x00050051, 0x0000000B, 0x00004A64, 0x00005D7F,\n    0x00000000, 0x00050051, 0x0000000B, 0x00001B43, 0x00005D7F, 0x00000001,\n    0x00070050, 0x00000017, 0x00003ADF, 0x00004A51, 0x00004A64, 0x00001C2A,\n    0x00001B43, 0x000500C2, 0x0000000B, 0x000030F1, 0x000038F6, 0x00000A17,\n    0x00060041, 0x00000294, 0x000032C9, 0x0000140E, 0x00000A0B, 0x000030F1,\n    0x0003003E, 0x000032C9, 0x00003F21, 0x00050080, 0x0000000B, 0x0000204C,\n    0x000038F6, 0x00000A3A, 0x000500C2, 0x0000000B, 0x000019FD, 0x0000204C,\n    0x00000A17, 0x00060041, 0x00000294, 0x000054B9, 0x0000140E, 0x00000A0B,\n    0x000019FD, 0x0003003E, 0x000054B9, 0x00003ADF, 0x000300F7, 0x00006070,\n    0x00000002, 0x000400FA, 0x00004376, 0x000055E9, 0x00001C25, 0x000200F8,\n    0x000055E9, 0x000200F9, 0x00006070, 0x000200F8, 0x00001C25, 0x000200F9,\n    0x00006070, 0x000200F8, 0x00006070, 0x000700F5, 0x0000000B, 0x00002C71,\n    0x00000A6A, 0x000055E9, 0x00000A3A, 0x00001C25, 0x00050080, 0x0000000B,\n    0x000048BE, 0x000048BD, 0x00002C71, 0x000500C2, 0x0000000B, 0x00003D53,\n    0x000048BE, 0x00000A17, 0x00060041, 0x00000294, 0x00005566, 0x0000107A,\n    0x00000A0B, 0x00003D53, 0x0004003D, 0x00000017, 0x00003910, 0x00005566,\n    0x000300F7, 0x00003A1A, 0x00000000, 0x000400FA, 0x00005686, 0x00002958,\n    0x00003A1A, 0x000200F8, 0x00002958, 0x000500C7, 0x00000017, 0x00004760,\n    0x00003910, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D2, 0x00004760,\n    0x0000013D, 0x000500C7, 0x00000017, 0x000050B1, 0x00003910, 0x0000072E,\n    0x000500C2, 0x00000017, 0x0000448E, 0x000050B1, 0x0000013D, 0x000500C5,\n    0x00000017, 0x00003FF9, 0x000024D2, 0x0000448E, 0x000200F9, 0x00003A1A,\n    0x000200F8, 0x00003A1A, 0x000700F5, 0x00000017, 0x00002AAC, 0x00003910,\n    0x00006070, 0x00003FF9, 0x00002958, 0x000300F7, 0x00002DA3, 0x00000000,\n    0x000400FA, 0x00003B23, 0x00002B39, 0x00002DA3, 0x000200F8, 0x00002B39,\n    0x000500C4, 0x00000017, 0x00005E18, 0x00002AAC, 0x000002ED, 0x000500C2,\n    0x00000017, 0x00003BE8, 0x00002AAC, 0x000002ED, 0x000500C5, 0x00000017,\n    0x000029E9, 0x00005E18, 0x00003BE8, 0x000200F9, 0x00002DA3, 0x000200F8,\n    0x00002DA3, 0x000700F5, 0x00000017, 0x00004505, 0x00002AAC, 0x00003A1A,\n    0x000029E9, 0x00002B39, 0x0007004F, 0x00000011, 0x0000594F, 0x00004505,\n    0x00004505, 0x00000000, 0x00000001, 0x0009004F, 0x00000017, 0x000029A8,\n    0x00004505, 0x000000C8, 0x00000000, 0x00000000, 0x00000001, 0x00000001,\n    0x000500C2, 0x00000017, 0x00002582, 0x000029A8, 0x00000221, 0x000500C7,\n    0x00000017, 0x00001EE6, 0x00002582, 0x00000589, 0x000500C4, 0x00000017,\n    0x00006049, 0x00001EE6, 0x000000B9, 0x000500C2, 0x00000017, 0x00005854,\n    0x000029A8, 0x00000329, 0x000500C7, 0x00000017, 0x000053E8, 0x00005854,\n    0x000009D7, 0x000500C5, 0x00000017, 0x00003CAE, 0x00006049, 0x000053E8,\n    0x000500C7, 0x00000011, 0x00004E81, 0x0000594F, 0x0000022A, 0x000500C4,\n    0x00000011, 0x00005960, 0x00004E81, 0x000007E1, 0x000500C7, 0x00000011,\n    0x000050B2, 0x0000594F, 0x000003B6, 0x000500C2, 0x00000011, 0x000037F1,\n    0x000050B2, 0x00000724, 0x000500C5, 0x00000011, 0x00001A15, 0x00005960,\n    0x000037F1, 0x0007004F, 0x00000011, 0x000039D3, 0x00003CAE, 0x00003CAE,\n    0x00000000, 0x00000002, 0x000500C5, 0x00000011, 0x000051C7, 0x000039D3,\n    0x00001A15, 0x00050051, 0x0000000B, 0x00004A52, 0x000051C7, 0x00000000,\n    0x00050051, 0x0000000B, 0x00001C2B, 0x000051C7, 0x00000001, 0x0007004F,\n    0x00000011, 0x00005A0B, 0x00003CAE, 0x00003CAE, 0x00000001, 0x00000003,\n    0x000500C5, 0x00000011, 0x00005D80, 0x00005A0B, 0x0000062A, 0x00050051,\n    0x0000000B, 0x00004A65, 0x00005D80, 0x00000000, 0x00050051, 0x0000000B,\n    0x00005D3A, 0x00005D80, 0x00000001, 0x00070050, 0x00000017, 0x00003F22,\n    0x00004A52, 0x00004A65, 0x00001C2B, 0x00005D3A, 0x0007004F, 0x00000011,\n    0x00001E26, 0x00004505, 0x00004505, 0x00000002, 0x00000003, 0x0009004F,\n    0x00000017, 0x000025BC, 0x00004505, 0x000000C8, 0x00000002, 0x00000002,\n    0x00000003, 0x00000003, 0x000500C2, 0x00000017, 0x00002583, 0x000025BC,\n    0x00000221, 0x000500C7, 0x00000017, 0x00001EE7, 0x00002583, 0x00000589,\n    0x000500C4, 0x00000017, 0x0000604A, 0x00001EE7, 0x000000B9, 0x000500C2,\n    0x00000017, 0x00005855, 0x000025BC, 0x00000329, 0x000500C7, 0x00000017,\n    0x000053E9, 0x00005855, 0x000009D7, 0x000500C5, 0x00000017, 0x00003CAF,\n    0x0000604A, 0x000053E9, 0x000500C7, 0x00000011, 0x00004E82, 0x00001E26,\n    0x0000022A, 0x000500C4, 0x00000011, 0x00005961, 0x00004E82, 0x000007E1,\n    0x000500C7, 0x00000011, 0x000050B3, 0x00001E26, 0x000003B6, 0x000500C2,\n    0x00000011, 0x000037F2, 0x000050B3, 0x00000724, 0x000500C5, 0x00000011,\n    0x00001A16, 0x00005961, 0x000037F2, 0x0007004F, 0x00000011, 0x000039D4,\n    0x00003CAF, 0x00003CAF, 0x00000000, 0x00000002, 0x000500C5, 0x00000011,\n    0x000051C8, 0x000039D4, 0x00001A16, 0x00050051, 0x0000000B, 0x00004A53,\n    0x000051C8, 0x00000000, 0x00050051, 0x0000000B, 0x00001C2C, 0x000051C8,\n    0x00000001, 0x0007004F, 0x00000011, 0x00005A0C, 0x00003CAF, 0x00003CAF,\n    0x00000001, 0x00000003, 0x000500C5, 0x00000011, 0x00005D81, 0x00005A0C,\n    0x0000062A, 0x00050051, 0x0000000B, 0x00004A66, 0x00005D81, 0x00000000,\n    0x00050051, 0x0000000B, 0x000060DC, 0x00005D81, 0x00000001, 0x00070050,\n    0x00000017, 0x0000268D, 0x00004A53, 0x00004A66, 0x00001C2C, 0x000060DC,\n    0x00050080, 0x0000000B, 0x00003EDA, 0x000038F6, 0x00000A6A, 0x000500C2,\n    0x0000000B, 0x00002040, 0x00003EDA, 0x00000A17, 0x00060041, 0x00000294,\n    0x00004BE4, 0x0000140E, 0x00000A0B, 0x00002040, 0x0003003E, 0x00004BE4,\n    0x00003F22, 0x00050080, 0x0000000B, 0x0000204D, 0x000038F6, 0x00000A9A,\n    0x000500C2, 0x0000000B, 0x000019FE, 0x0000204D, 0x00000A17, 0x00060041,\n    0x00000294, 0x000054DF, 0x0000140E, 0x00000A0B, 0x000019FE, 0x0003003E,\n    0x000054DF, 0x0000268D, 0x000200F9, 0x00004C7A, 0x000200F8, 0x00004C7A,\n    0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_r11g11b10_rgba16_scaled_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25157\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n     %v4uint = OpTypeVector %uint 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v3uint = OpTypeVector %uint 3\n     %uint_0 = OpConstant %uint 0\n    %uint_22 = OpConstant %uint 22\n        %545 = OpConstantComposite %v4uint %uint_0 %uint_22 %uint_0 %uint_22\n  %uint_2047 = OpConstant %uint 2047\n  %uint_1023 = OpConstant %uint 1023\n       %1417 = OpConstantComposite %v4uint %uint_2047 %uint_1023 %uint_2047 %uint_1023\n     %uint_5 = OpConstant %uint 5\n     %uint_6 = OpConstant %uint 6\n        %185 = OpConstantComposite %v4uint %uint_5 %uint_6 %uint_5 %uint_6\n    %uint_26 = OpConstant %uint 26\n        %809 = OpConstantComposite %v4uint %uint_6 %uint_26 %uint_6 %uint_26\n    %uint_31 = OpConstant %uint 31\n    %uint_63 = OpConstant %uint 63\n       %2519 = OpConstantComposite %v4uint %uint_31 %uint_63 %uint_31 %uint_63\n%uint_4192256 = OpConstant %uint 4192256\n    %uint_10 = OpConstant %uint 10\n%uint_4063232 = OpConstant %uint 4063232\n     %uint_1 = OpConstant %uint 1\n     %uint_2 = OpConstant %uint 2\n%uint_4294901760 = OpConstant %uint 4294901760\n     %uint_3 = OpConstant %uint 3\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n    %uint_16 = OpConstant %uint 16\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n      %int_3 = OpConstant %int 3\n      %int_2 = OpConstant %int 2\n     %uint_4 = OpConstant %uint 4\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n     %uint_7 = OpConstant %uint 7\n       %1927 = OpConstantComposite %v2uint %uint_4 %uint_7\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %2603 = OpConstantComposite %v3uint %uint_3 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n    %uint_32 = OpConstant %uint 32\n    %uint_48 = OpConstant %uint 48\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %1954 = OpConstantComposite %v2uint %uint_7 %uint_7\n       %1855 = OpConstantComposite %v2uint %uint_4 %uint_1\n       %1828 = OpConstantComposite %v2uint %uint_1 %uint_1\n    %uint_15 = OpConstant %uint 15\n       %1955 = OpConstantComposite %v2uint %uint_15 %uint_1\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n        %554 = OpConstantComposite %v2uint %uint_4192256 %uint_4192256\n       %2017 = OpConstantComposite %v2uint %uint_10 %uint_10\n        %950 = OpConstantComposite %v2uint %uint_4063232 %uint_4063232\n       %1578 = OpConstantComposite %v2uint %uint_4294901760 %uint_4294901760\n        %200 = OpConstantNull %v2uint\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24445 = OpBitwiseAnd %uint %13606 %uint_2\n      %18667 = OpINotEqual %bool %24445 %uint_0\n       %8141 = OpShiftRightLogical %uint %13606 %uint_2\n      %24990 = OpBitwiseAnd %uint %8141 %uint_3\n       %8871 = OpCompositeConstruct %v2uint %13606 %13606\n       %7087 = OpShiftRightLogical %v2uint %8871 %1927\n       %6551 = OpBitwiseAnd %v2uint %7087 %1954\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2603\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %6586 DontFlatten\n               OpBranchConditional %24679 %21992 %6586\n      %21992 = OpLabel\n               OpBranch %19578\n       %6586 = OpLabel\n      %23478 = OpBitcast %v3int %21387\n      %18710 = OpCompositeExtract %uint %22410 1\n      %23531 = OpCompositeExtract %int %23478 0\n      %22810 = OpIMul %int %23531 %int_8\n       %6362 = OpCompositeExtract %int %23478 2\n      %14505 = OpBitcast %int %18710\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %23478 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %6594\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %22810 %24535\n      %10898 = OpBitcast %uint %8258\n       %7937 = OpIAdd %uint %22411 %10898\n      %19921 = OpShiftRightLogical %v2uint %17136 %1855\n       %7712 = OpUDiv %v2uint %19921 %6551\n      %18183 = OpIMul %v2uint %6551 %7712\n      %18273 = OpISub %v2uint %19921 %18183\n      %11232 = OpShiftLeftLogical %v2uint %7712 %1855\n      %13284 = OpCompositeExtract %uint %18273 0\n      %10872 = OpCompositeExtract %uint %6551 1\n      %22886 = OpIMul %uint %13284 %10872\n       %6943 = OpCompositeExtract %uint %18273 1\n      %10469 = OpIAdd %uint %22886 %6943\n      %18851 = OpBitwiseAnd %v2uint %17136 %1955\n      %10581 = OpShiftLeftLogical %uint %10469 %uint_7\n      %20916 = OpCompositeExtract %uint %18851 1\n      %23596 = OpShiftLeftLogical %uint %20916 %uint_6\n      %19814 = OpBitwiseOr %uint %10581 %23596\n      %21476 = OpCompositeExtract %uint %18851 0\n       %8560 = OpShiftLeftLogical %uint %21476 %uint_2\n      %17648 = OpBitwiseOr %uint %19814 %8560\n      %19923 = OpCompositeExtract %uint %11232 0\n      %15556 = OpCompositeInsert %v3uint %19923 %21387 0\n      %23006 = OpCompositeExtract %uint %11232 1\n       %9680 = OpCompositeInsert %v3uint %23006 %15556 1\n               OpSelectionMerge %20344 DontFlatten\n               OpBranchConditional %18667 %23520 %11737\n      %23520 = OpLabel\n      %10111 = OpBitcast %v3int %9680\n      %19476 = OpShiftRightLogical %uint %22408 %int_5\n      %18810 = OpShiftRightLogical %uint %22409 %int_4\n       %6782 = OpCompositeExtract %int %10111 2\n      %12089 = OpShiftRightArithmetic %int %6782 %int_2\n      %22400 = OpBitcast %int %18810\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %10111 1\n      %19055 = OpShiftRightArithmetic %int %25154 %int_4\n      %11052 = OpIAdd %int %7938 %19055\n      %16898 = OpBitcast %int %19476\n      %14944 = OpIMul %int %11052 %16898\n      %25155 = OpCompositeExtract %int %10111 0\n      %20423 = OpShiftRightArithmetic %int %25155 %int_5\n      %18940 = OpIAdd %int %14944 %20423\n       %8797 = OpShiftLeftLogical %int %18940 %int_7\n      %11434 = OpBitwiseAnd %int %6782 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %25154 %int_1\n      %21364 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21364 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %25155 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17334 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17334 %uint_2\n      %13015 = OpShiftRightArithmetic %int %25154 %int_3\n       %9929 = OpBitwiseXor %int %13015 %12089\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %25155 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %25154 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6552 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6552\n       %7168 = OpShiftLeftLogical %int %16793 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24144 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24144 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24144 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24144 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %20344\n      %11737 = OpLabel\n      %11908 = OpVectorShuffle %v2uint %9680 %9680 0 1\n      %20347 = OpBitcast %v2int %11908\n      %11433 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %20347 1\n      %12090 = OpShiftRightArithmetic %int %14597 %int_5\n      %22401 = OpBitcast %int %11433\n       %7939 = OpIMul %int %12090 %22401\n      %25156 = OpCompositeExtract %int %20347 0\n      %20424 = OpShiftRightArithmetic %int %25156 %int_5\n      %18864 = OpIAdd %int %7939 %20424\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25156 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17335 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17335 %uint_2\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25156 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6553 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6553\n       %7169 = OpShiftLeftLogical %int %21575 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24163 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24163 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24163 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %20344\n      %20344 = OpLabel\n      %18329 = OpPhi %uint %16869 %23520 %16870 %11737\n      %15200 = OpCompositeExtract %uint %6551 0\n      %17489 = OpIMul %uint %15200 %10872\n       %7313 = OpIMul %uint %18329 %17489\n       %8815 = OpIAdd %uint %7313 %17648\n      %21470 = OpIAdd %uint %8815 %24236\n      %14664 = OpShiftRightLogical %uint %21470 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %14664\n       %7338 = OpLoad %v4uint %20399\n      %13760 = OpIEqual %bool %24990 %uint_1\n      %21366 = OpIEqual %bool %24990 %uint_2\n      %22150 = OpLogicalOr %bool %13760 %21366\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %7338 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %7338 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22649 = OpPhi %v4uint %7338 %20344 %16376 %10583\n      %19638 = OpIEqual %bool %24990 %uint_3\n      %15139 = OpLogicalOr %bool %21366 %19638\n               OpSelectionMerge %11682 None\n               OpBranchConditional %15139 %11064 %11682\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22649 %749\n      %15335 = OpShiftRightLogical %v4uint %22649 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %11682\n      %11682 = OpLabel\n      %17668 = OpPhi %v4uint %22649 %13411 %10728 %11064\n      %22862 = OpVectorShuffle %v2uint %17668 %17668 0 1\n      %10663 = OpVectorShuffle %v4uint %17668 %200 0 0 1 1\n       %9600 = OpShiftRightLogical %v4uint %10663 %545\n       %7908 = OpBitwiseAnd %v4uint %9600 %1417\n      %24647 = OpShiftLeftLogical %v4uint %7908 %185\n      %22610 = OpShiftRightLogical %v4uint %10663 %809\n      %21478 = OpBitwiseAnd %v4uint %22610 %2519\n      %15532 = OpBitwiseOr %v4uint %24647 %21478\n      %20095 = OpBitwiseAnd %v2uint %22862 %554\n      %22878 = OpShiftLeftLogical %v2uint %20095 %2017\n      %20653 = OpBitwiseAnd %v2uint %22862 %950\n      %14319 = OpShiftRightLogical %v2uint %20653 %1828\n       %6675 = OpBitwiseOr %v2uint %22878 %14319\n      %14801 = OpVectorShuffle %v2uint %15532 %15532 0 2\n      %20933 = OpBitwiseOr %v2uint %14801 %6675\n      %19024 = OpCompositeExtract %uint %20933 0\n       %7209 = OpCompositeExtract %uint %20933 1\n      %23049 = OpVectorShuffle %v2uint %15532 %15532 1 3\n      %23934 = OpBitwiseOr %v2uint %23049 %1578\n      %19043 = OpCompositeExtract %uint %23934 0\n      %23865 = OpCompositeExtract %uint %23934 1\n      %16161 = OpCompositeConstruct %v4uint %19024 %19043 %7209 %23865\n       %7717 = OpVectorShuffle %v2uint %17668 %17668 2 3\n       %9659 = OpVectorShuffle %v4uint %17668 %200 2 2 3 3\n       %9601 = OpShiftRightLogical %v4uint %9659 %545\n       %7909 = OpBitwiseAnd %v4uint %9601 %1417\n      %24648 = OpShiftLeftLogical %v4uint %7909 %185\n      %22611 = OpShiftRightLogical %v4uint %9659 %809\n      %21479 = OpBitwiseAnd %v4uint %22611 %2519\n      %15533 = OpBitwiseOr %v4uint %24648 %21479\n      %20096 = OpBitwiseAnd %v2uint %7717 %554\n      %22879 = OpShiftLeftLogical %v2uint %20096 %2017\n      %20654 = OpBitwiseAnd %v2uint %7717 %950\n      %14320 = OpShiftRightLogical %v2uint %20654 %1828\n       %6676 = OpBitwiseOr %v2uint %22879 %14320\n      %14802 = OpVectorShuffle %v2uint %15533 %15533 0 2\n      %20934 = OpBitwiseOr %v2uint %14802 %6676\n      %19025 = OpCompositeExtract %uint %20934 0\n       %7210 = OpCompositeExtract %uint %20934 1\n      %23050 = OpVectorShuffle %v2uint %15533 %15533 1 3\n      %23935 = OpBitwiseOr %v2uint %23050 %1578\n      %19044 = OpCompositeExtract %uint %23935 0\n       %6979 = OpCompositeExtract %uint %23935 1\n      %15071 = OpCompositeConstruct %v4uint %19025 %19044 %7210 %6979\n      %12529 = OpShiftRightLogical %uint %7937 %int_4\n      %13001 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %12529\n               OpStore %13001 %16161\n       %8268 = OpIAdd %uint %7937 %uint_16\n       %6653 = OpShiftRightLogical %uint %8268 %int_4\n      %19428 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %6653\n               OpStore %19428 %15071\n       %8269 = OpIAdd %uint %21470 %uint_16\n       %6634 = OpShiftRightLogical %uint %8269 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %6634\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %14874 None\n               OpBranchConditional %22150 %10584 %14874\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20657 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20657 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %14874\n      %14874 = OpLabel\n      %10924 = OpPhi %v4uint %14608 %11682 %16377 %10584\n               OpSelectionMerge %11683 None\n               OpBranchConditional %15139 %11065 %11683\n      %11065 = OpLabel\n      %24088 = OpShiftLeftLogical %v4uint %10924 %749\n      %15336 = OpShiftRightLogical %v4uint %10924 %749\n      %10729 = OpBitwiseOr %v4uint %24088 %15336\n               OpBranch %11683\n      %11683 = OpLabel\n      %17669 = OpPhi %v4uint %10924 %14874 %10729 %11065\n      %22863 = OpVectorShuffle %v2uint %17669 %17669 0 1\n      %10664 = OpVectorShuffle %v4uint %17669 %200 0 0 1 1\n       %9602 = OpShiftRightLogical %v4uint %10664 %545\n       %7910 = OpBitwiseAnd %v4uint %9602 %1417\n      %24649 = OpShiftLeftLogical %v4uint %7910 %185\n      %22612 = OpShiftRightLogical %v4uint %10664 %809\n      %21480 = OpBitwiseAnd %v4uint %22612 %2519\n      %15534 = OpBitwiseOr %v4uint %24649 %21480\n      %20097 = OpBitwiseAnd %v2uint %22863 %554\n      %22880 = OpShiftLeftLogical %v2uint %20097 %2017\n      %20658 = OpBitwiseAnd %v2uint %22863 %950\n      %14321 = OpShiftRightLogical %v2uint %20658 %1828\n       %6677 = OpBitwiseOr %v2uint %22880 %14321\n      %14803 = OpVectorShuffle %v2uint %15534 %15534 0 2\n      %20935 = OpBitwiseOr %v2uint %14803 %6677\n      %19026 = OpCompositeExtract %uint %20935 0\n       %7211 = OpCompositeExtract %uint %20935 1\n      %23051 = OpVectorShuffle %v2uint %15534 %15534 1 3\n      %23936 = OpBitwiseOr %v2uint %23051 %1578\n      %19045 = OpCompositeExtract %uint %23936 0\n      %23866 = OpCompositeExtract %uint %23936 1\n      %16162 = OpCompositeConstruct %v4uint %19026 %19045 %7211 %23866\n       %7718 = OpVectorShuffle %v2uint %17669 %17669 2 3\n       %9660 = OpVectorShuffle %v4uint %17669 %200 2 2 3 3\n       %9603 = OpShiftRightLogical %v4uint %9660 %545\n       %7911 = OpBitwiseAnd %v4uint %9603 %1417\n      %24650 = OpShiftLeftLogical %v4uint %7911 %185\n      %22613 = OpShiftRightLogical %v4uint %9660 %809\n      %21481 = OpBitwiseAnd %v4uint %22613 %2519\n      %15535 = OpBitwiseOr %v4uint %24650 %21481\n      %20098 = OpBitwiseAnd %v2uint %7718 %554\n      %22881 = OpShiftLeftLogical %v2uint %20098 %2017\n      %20659 = OpBitwiseAnd %v2uint %7718 %950\n      %14322 = OpShiftRightLogical %v2uint %20659 %1828\n       %6678 = OpBitwiseOr %v2uint %22881 %14322\n      %14804 = OpVectorShuffle %v2uint %15535 %15535 0 2\n      %20936 = OpBitwiseOr %v2uint %14804 %6678\n      %19027 = OpCompositeExtract %uint %20936 0\n       %7212 = OpCompositeExtract %uint %20936 1\n      %23052 = OpVectorShuffle %v2uint %15535 %15535 1 3\n      %23937 = OpBitwiseOr %v2uint %23052 %1578\n      %19046 = OpCompositeExtract %uint %23937 0\n      %24796 = OpCompositeExtract %uint %23937 1\n       %9869 = OpCompositeConstruct %v4uint %19027 %19046 %7212 %24796\n      %16090 = OpIAdd %uint %7937 %uint_32\n       %8256 = OpShiftRightLogical %uint %16090 %int_4\n      %19429 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %8256\n               OpStore %19429 %16162\n       %8270 = OpIAdd %uint %7937 %uint_48\n       %6654 = OpShiftRightLogical %uint %8270 %int_4\n      %21727 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %6654\n               OpStore %21727 %9869\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_r11g11b10_rgba16_scaled_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006245, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000017,\n    0x0000000B, 0x00000004, 0x00040015, 0x0000000C, 0x00000020, 0x00000001,\n    0x00040017, 0x00000012, 0x0000000C, 0x00000002, 0x00040017, 0x00000016,\n    0x0000000C, 0x00000003, 0x00020014, 0x00000009, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000,\n    0x0004002B, 0x0000000B, 0x00000A4C, 0x00000016, 0x0007002C, 0x00000017,\n    0x00000221, 0x00000A0A, 0x00000A4C, 0x00000A0A, 0x00000A4C, 0x0004002B,\n    0x0000000B, 0x00000A81, 0x000007FF, 0x0004002B, 0x0000000B, 0x00000A44,\n    0x000003FF, 0x0007002C, 0x00000017, 0x00000589, 0x00000A81, 0x00000A44,\n    0x00000A81, 0x00000A44, 0x0004002B, 0x0000000B, 0x00000A19, 0x00000005,\n    0x0004002B, 0x0000000B, 0x00000A1C, 0x00000006, 0x0007002C, 0x00000017,\n    0x000000B9, 0x00000A19, 0x00000A1C, 0x00000A19, 0x00000A1C, 0x0004002B,\n    0x0000000B, 0x00000A58, 0x0000001A, 0x0007002C, 0x00000017, 0x00000329,\n    0x00000A1C, 0x00000A58, 0x00000A1C, 0x00000A58, 0x0004002B, 0x0000000B,\n    0x00000A67, 0x0000001F, 0x0004002B, 0x0000000B, 0x00000AC7, 0x0000003F,\n    0x0007002C, 0x00000017, 0x000009D7, 0x00000A67, 0x00000AC7, 0x00000A67,\n    0x00000AC7, 0x0004002B, 0x0000000B, 0x00000957, 0x003FF800, 0x0004002B,\n    0x0000000B, 0x00000A28, 0x0000000A, 0x0004002B, 0x0000000B, 0x000002D7,\n    0x003E0000, 0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001, 0x0004002B,\n    0x0000000B, 0x00000A10, 0x00000002, 0x0004002B, 0x0000000B, 0x0000068D,\n    0xFFFF0000, 0x0004002B, 0x0000000B, 0x00000A13, 0x00000003, 0x0004002B,\n    0x0000000B, 0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B, 0x00000A22,\n    0x00000008, 0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00, 0x0004002B,\n    0x0000000B, 0x00000A3A, 0x00000010, 0x0004002B, 0x0000000C, 0x00000A17,\n    0x00000004, 0x0004002B, 0x0000000C, 0x00000A1D, 0x00000006, 0x0004002B,\n    0x0000000C, 0x00000A2C, 0x0000000B, 0x0004002B, 0x0000000C, 0x00000A38,\n    0x0000000F, 0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001, 0x0004002B,\n    0x0000000C, 0x00000A1A, 0x00000005, 0x0004002B, 0x0000000C, 0x00000A20,\n    0x00000007, 0x0004002B, 0x0000000C, 0x00000A23, 0x00000008, 0x0004002B,\n    0x0000000C, 0x00000A2F, 0x0000000C, 0x0004002B, 0x0000000C, 0x00000A14,\n    0x00000003, 0x0004002B, 0x0000000C, 0x00000A11, 0x00000002, 0x0004002B,\n    0x0000000B, 0x00000A16, 0x00000004, 0x0004002B, 0x0000000C, 0x00000A0B,\n    0x00000000, 0x000A001E, 0x00000489, 0x0000000B, 0x0000000B, 0x0000000B,\n    0x0000000B, 0x00000014, 0x0000000B, 0x0000000B, 0x0000000B, 0x00040020,\n    0x00000706, 0x00000009, 0x00000489, 0x0004003B, 0x00000706, 0x00000CE9,\n    0x00000009, 0x00040020, 0x00000288, 0x00000009, 0x0000000B, 0x0004002B,\n    0x0000000B, 0x00000A1F, 0x00000007, 0x0005002C, 0x00000011, 0x00000787,\n    0x00000A16, 0x00000A1F, 0x00040020, 0x00000291, 0x00000009, 0x00000014,\n    0x00040020, 0x00000292, 0x00000001, 0x00000014, 0x0004003B, 0x00000292,\n    0x00000F48, 0x00000001, 0x0006002C, 0x00000014, 0x00000A2B, 0x00000A13,\n    0x00000A0A, 0x00000A0A, 0x00040017, 0x0000000F, 0x00000009, 0x00000002,\n    0x0003001D, 0x000007DC, 0x00000017, 0x0003001E, 0x000007B4, 0x000007DC,\n    0x00040020, 0x00000A31, 0x00000002, 0x000007B4, 0x0004003B, 0x00000A31,\n    0x0000107A, 0x00000002, 0x00040020, 0x00000294, 0x00000002, 0x00000017,\n    0x0003001D, 0x000007DD, 0x00000017, 0x0003001E, 0x000007B5, 0x000007DD,\n    0x00040020, 0x00000A32, 0x00000002, 0x000007B5, 0x0004003B, 0x00000A32,\n    0x0000140E, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020,\n    0x0004002B, 0x0000000B, 0x00000A9A, 0x00000030, 0x0006002C, 0x00000014,\n    0x00000BC3, 0x00000A16, 0x00000A6A, 0x00000A0D, 0x0005002C, 0x00000011,\n    0x000007A2, 0x00000A1F, 0x00000A1F, 0x0005002C, 0x00000011, 0x0000073F,\n    0x00000A16, 0x00000A0D, 0x0005002C, 0x00000011, 0x00000724, 0x00000A0D,\n    0x00000A0D, 0x0004002B, 0x0000000B, 0x00000A37, 0x0000000F, 0x0005002C,\n    0x00000011, 0x000007A3, 0x00000A37, 0x00000A0D, 0x0007002C, 0x00000017,\n    0x000009CE, 0x000008A6, 0x000008A6, 0x000008A6, 0x000008A6, 0x0007002C,\n    0x00000017, 0x0000013D, 0x00000A22, 0x00000A22, 0x00000A22, 0x00000A22,\n    0x0007002C, 0x00000017, 0x0000072E, 0x000005FD, 0x000005FD, 0x000005FD,\n    0x000005FD, 0x0007002C, 0x00000017, 0x000002ED, 0x00000A3A, 0x00000A3A,\n    0x00000A3A, 0x00000A3A, 0x0005002C, 0x00000011, 0x0000022A, 0x00000957,\n    0x00000957, 0x0005002C, 0x00000011, 0x000007E1, 0x00000A28, 0x00000A28,\n    0x0005002C, 0x00000011, 0x000003B6, 0x000002D7, 0x000002D7, 0x0005002C,\n    0x00000011, 0x0000062A, 0x0000068D, 0x0000068D, 0x0003002E, 0x00000011,\n    0x000000C8, 0x00050036, 0x00000008, 0x0000161F, 0x00000000, 0x00000502,\n    0x000200F8, 0x00003B06, 0x000300F7, 0x00004C7A, 0x00000000, 0x000300FB,\n    0x00000A0A, 0x00002E68, 0x000200F8, 0x00002E68, 0x00050041, 0x00000288,\n    0x000060D7, 0x00000CE9, 0x00000A0B, 0x0004003D, 0x0000000B, 0x00003526,\n    0x000060D7, 0x000500C7, 0x0000000B, 0x00005F7D, 0x00003526, 0x00000A10,\n    0x000500AB, 0x00000009, 0x000048EB, 0x00005F7D, 0x00000A0A, 0x000500C2,\n    0x0000000B, 0x00001FCD, 0x00003526, 0x00000A10, 0x000500C7, 0x0000000B,\n    0x0000619E, 0x00001FCD, 0x00000A13, 0x00050050, 0x00000011, 0x000022A7,\n    0x00003526, 0x00003526, 0x000500C2, 0x00000011, 0x00001BAF, 0x000022A7,\n    0x00000787, 0x000500C7, 0x00000011, 0x00001997, 0x00001BAF, 0x000007A2,\n    0x00050041, 0x00000288, 0x0000492C, 0x00000CE9, 0x00000A0E, 0x0004003D,\n    0x0000000B, 0x00005EAC, 0x0000492C, 0x00050041, 0x00000288, 0x00004EBA,\n    0x00000CE9, 0x00000A11, 0x0004003D, 0x0000000B, 0x00005788, 0x00004EBA,\n    0x00050041, 0x00000288, 0x00004EBB, 0x00000CE9, 0x00000A14, 0x0004003D,\n    0x0000000B, 0x00005789, 0x00004EBB, 0x00050041, 0x00000291, 0x00004EBC,\n    0x00000CE9, 0x00000A17, 0x0004003D, 0x00000014, 0x0000578A, 0x00004EBC,\n    0x00050041, 0x00000288, 0x00004EBD, 0x00000CE9, 0x00000A1A, 0x0004003D,\n    0x0000000B, 0x0000578B, 0x00004EBD, 0x00050041, 0x00000288, 0x00004E6E,\n    0x00000CE9, 0x00000A1D, 0x0004003D, 0x0000000B, 0x000019C2, 0x00004E6E,\n    0x0004003D, 0x00000014, 0x00002A0E, 0x00000F48, 0x000500C4, 0x00000014,\n    0x0000538B, 0x00002A0E, 0x00000A2B, 0x0007004F, 0x00000011, 0x000042F0,\n    0x0000538B, 0x0000538B, 0x00000000, 0x00000001, 0x0007004F, 0x00000011,\n    0x0000242F, 0x0000578A, 0x0000578A, 0x00000000, 0x00000001, 0x000500AE,\n    0x0000000F, 0x00004288, 0x000042F0, 0x0000242F, 0x0004009A, 0x00000009,\n    0x00006067, 0x00004288, 0x000300F7, 0x000019BA, 0x00000002, 0x000400FA,\n    0x00006067, 0x000055E8, 0x000019BA, 0x000200F8, 0x000055E8, 0x000200F9,\n    0x00004C7A, 0x000200F8, 0x000019BA, 0x0004007C, 0x00000016, 0x00005BB6,\n    0x0000538B, 0x00050051, 0x0000000B, 0x00004916, 0x0000578A, 0x00000001,\n    0x00050051, 0x0000000C, 0x00005BEB, 0x00005BB6, 0x00000000, 0x00050084,\n    0x0000000C, 0x0000591A, 0x00005BEB, 0x00000A23, 0x00050051, 0x0000000C,\n    0x000018DA, 0x00005BB6, 0x00000002, 0x0004007C, 0x0000000C, 0x000038A9,\n    0x00004916, 0x00050084, 0x0000000C, 0x00002C0F, 0x000018DA, 0x000038A9,\n    0x00050051, 0x0000000C, 0x000044BE, 0x00005BB6, 0x00000001, 0x00050080,\n    0x0000000C, 0x000056D4, 0x00002C0F, 0x000044BE, 0x0004007C, 0x0000000C,\n    0x00005785, 0x000019C2, 0x00050084, 0x0000000C, 0x00005FD7, 0x000056D4,\n    0x00005785, 0x00050080, 0x0000000C, 0x00002042, 0x0000591A, 0x00005FD7,\n    0x0004007C, 0x0000000B, 0x00002A92, 0x00002042, 0x00050080, 0x0000000B,\n    0x00001F01, 0x0000578B, 0x00002A92, 0x000500C2, 0x00000011, 0x00004DD1,\n    0x000042F0, 0x0000073F, 0x00050086, 0x00000011, 0x00001E20, 0x00004DD1,\n    0x00001997, 0x00050084, 0x00000011, 0x00004707, 0x00001997, 0x00001E20,\n    0x00050082, 0x00000011, 0x00004761, 0x00004DD1, 0x00004707, 0x000500C4,\n    0x00000011, 0x00002BE0, 0x00001E20, 0x0000073F, 0x00050051, 0x0000000B,\n    0x000033E4, 0x00004761, 0x00000000, 0x00050051, 0x0000000B, 0x00002A78,\n    0x00001997, 0x00000001, 0x00050084, 0x0000000B, 0x00005966, 0x000033E4,\n    0x00002A78, 0x00050051, 0x0000000B, 0x00001B1F, 0x00004761, 0x00000001,\n    0x00050080, 0x0000000B, 0x000028E5, 0x00005966, 0x00001B1F, 0x000500C7,\n    0x00000011, 0x000049A3, 0x000042F0, 0x000007A3, 0x000500C4, 0x0000000B,\n    0x00002955, 0x000028E5, 0x00000A1F, 0x00050051, 0x0000000B, 0x000051B4,\n    0x000049A3, 0x00000001, 0x000500C4, 0x0000000B, 0x00005C2C, 0x000051B4,\n    0x00000A1C, 0x000500C5, 0x0000000B, 0x00004D66, 0x00002955, 0x00005C2C,\n    0x00050051, 0x0000000B, 0x000053E4, 0x000049A3, 0x00000000, 0x000500C4,\n    0x0000000B, 0x00002170, 0x000053E4, 0x00000A10, 0x000500C5, 0x0000000B,\n    0x000044F0, 0x00004D66, 0x00002170, 0x00050051, 0x0000000B, 0x00004DD3,\n    0x00002BE0, 0x00000000, 0x00060052, 0x00000014, 0x00003CC4, 0x00004DD3,\n    0x0000538B, 0x00000000, 0x00050051, 0x0000000B, 0x000059DE, 0x00002BE0,\n    0x00000001, 0x00060052, 0x00000014, 0x000025D0, 0x000059DE, 0x00003CC4,\n    0x00000001, 0x000300F7, 0x00004F78, 0x00000002, 0x000400FA, 0x000048EB,\n    0x00005BE0, 0x00002DD9, 0x000200F8, 0x00005BE0, 0x0004007C, 0x00000016,\n    0x0000277F, 0x000025D0, 0x000500C2, 0x0000000B, 0x00004C14, 0x00005788,\n    0x00000A1A, 0x000500C2, 0x0000000B, 0x0000497A, 0x00005789, 0x00000A17,\n    0x00050051, 0x0000000C, 0x00001A7E, 0x0000277F, 0x00000002, 0x000500C3,\n    0x0000000C, 0x00002F39, 0x00001A7E, 0x00000A11, 0x0004007C, 0x0000000C,\n    0x00005780, 0x0000497A, 0x00050084, 0x0000000C, 0x00001F02, 0x00002F39,\n    0x00005780, 0x00050051, 0x0000000C, 0x00006242, 0x0000277F, 0x00000001,\n    0x000500C3, 0x0000000C, 0x00004A6F, 0x00006242, 0x00000A17, 0x00050080,\n    0x0000000C, 0x00002B2C, 0x00001F02, 0x00004A6F, 0x0004007C, 0x0000000C,\n    0x00004202, 0x00004C14, 0x00050084, 0x0000000C, 0x00003A60, 0x00002B2C,\n    0x00004202, 0x00050051, 0x0000000C, 0x00006243, 0x0000277F, 0x00000000,\n    0x000500C3, 0x0000000C, 0x00004FC7, 0x00006243, 0x00000A1A, 0x00050080,\n    0x0000000C, 0x000049FC, 0x00003A60, 0x00004FC7, 0x000500C4, 0x0000000C,\n    0x0000225D, 0x000049FC, 0x00000A20, 0x000500C7, 0x0000000C, 0x00002CAA,\n    0x00001A7E, 0x00000A14, 0x000500C4, 0x0000000C, 0x00004CAE, 0x00002CAA,\n    0x00000A1A, 0x000500C3, 0x0000000C, 0x0000383E, 0x00006242, 0x00000A0E,\n    0x000500C7, 0x0000000C, 0x00005374, 0x0000383E, 0x00000A14, 0x000500C4,\n    0x0000000C, 0x000054CA, 0x00005374, 0x00000A14, 0x000500C5, 0x0000000C,\n    0x000042CE, 0x00004CAE, 0x000054CA, 0x000500C7, 0x0000000C, 0x000050D5,\n    0x00006243, 0x00000A20, 0x000500C5, 0x0000000C, 0x00003ADD, 0x000042CE,\n    0x000050D5, 0x000500C5, 0x0000000C, 0x000043B6, 0x0000225D, 0x00003ADD,\n    0x000500C4, 0x0000000C, 0x00005E50, 0x000043B6, 0x00000A10, 0x000500C3,\n    0x0000000C, 0x000032D7, 0x00006242, 0x00000A14, 0x000500C6, 0x0000000C,\n    0x000026C9, 0x000032D7, 0x00002F39, 0x000500C7, 0x0000000C, 0x00004199,\n    0x000026C9, 0x00000A0E, 0x000500C3, 0x0000000C, 0x00002590, 0x00006243,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x0000505E, 0x00002590, 0x00000A14,\n    0x000500C4, 0x0000000C, 0x0000541D, 0x00004199, 0x00000A0E, 0x000500C6,\n    0x0000000C, 0x000022BA, 0x0000505E, 0x0000541D, 0x000500C7, 0x0000000C,\n    0x00005076, 0x00006242, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005228,\n    0x00005076, 0x00000A17, 0x000500C4, 0x0000000C, 0x00001998, 0x000022BA,\n    0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FE, 0x00005228, 0x00001998,\n    0x000500C4, 0x0000000C, 0x00001C00, 0x00004199, 0x00000A2C, 0x000500C5,\n    0x0000000C, 0x00003C81, 0x000047FE, 0x00001C00, 0x000500C7, 0x0000000C,\n    0x000050AF, 0x00005E50, 0x00000A38, 0x000500C5, 0x0000000C, 0x00003C70,\n    0x00003C81, 0x000050AF, 0x000500C3, 0x0000000C, 0x00003745, 0x00005E50,\n    0x00000A17, 0x000500C7, 0x0000000C, 0x000018B8, 0x00003745, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x0000547E, 0x000018B8, 0x00000A1A, 0x000500C5,\n    0x0000000C, 0x000045A8, 0x00003C70, 0x0000547E, 0x000500C3, 0x0000000C,\n    0x00003A6E, 0x00005E50, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018B9,\n    0x00003A6E, 0x00000A20, 0x000500C4, 0x0000000C, 0x0000547F, 0x000018B9,\n    0x00000A23, 0x000500C5, 0x0000000C, 0x0000456F, 0x000045A8, 0x0000547F,\n    0x000500C3, 0x0000000C, 0x00003C88, 0x00005E50, 0x00000A23, 0x000500C4,\n    0x0000000C, 0x00002824, 0x00003C88, 0x00000A2F, 0x000500C5, 0x0000000C,\n    0x00003B79, 0x0000456F, 0x00002824, 0x0004007C, 0x0000000B, 0x000041E5,\n    0x00003B79, 0x000200F9, 0x00004F78, 0x000200F8, 0x00002DD9, 0x0007004F,\n    0x00000011, 0x00002E84, 0x000025D0, 0x000025D0, 0x00000000, 0x00000001,\n    0x0004007C, 0x00000012, 0x00004F7B, 0x00002E84, 0x000500C2, 0x0000000B,\n    0x00002CA9, 0x00005788, 0x00000A1A, 0x00050051, 0x0000000C, 0x00003905,\n    0x00004F7B, 0x00000001, 0x000500C3, 0x0000000C, 0x00002F3A, 0x00003905,\n    0x00000A1A, 0x0004007C, 0x0000000C, 0x00005781, 0x00002CA9, 0x00050084,\n    0x0000000C, 0x00001F03, 0x00002F3A, 0x00005781, 0x00050051, 0x0000000C,\n    0x00006244, 0x00004F7B, 0x00000000, 0x000500C3, 0x0000000C, 0x00004FC8,\n    0x00006244, 0x00000A1A, 0x00050080, 0x0000000C, 0x000049B0, 0x00001F03,\n    0x00004FC8, 0x000500C4, 0x0000000C, 0x0000254A, 0x000049B0, 0x00000A1D,\n    0x000500C3, 0x0000000C, 0x0000603B, 0x00003905, 0x00000A0E, 0x000500C7,\n    0x0000000C, 0x0000539A, 0x0000603B, 0x00000A20, 0x000500C4, 0x0000000C,\n    0x0000534A, 0x0000539A, 0x00000A14, 0x000500C7, 0x0000000C, 0x00004EA5,\n    0x00006244, 0x00000A20, 0x000500C5, 0x0000000C, 0x00002B1A, 0x0000534A,\n    0x00004EA5, 0x000500C5, 0x0000000C, 0x000043B7, 0x0000254A, 0x00002B1A,\n    0x000500C4, 0x0000000C, 0x00005E63, 0x000043B7, 0x00000A10, 0x000500C3,\n    0x0000000C, 0x000031DE, 0x00003905, 0x00000A17, 0x000500C7, 0x0000000C,\n    0x00005447, 0x000031DE, 0x00000A0E, 0x000500C3, 0x0000000C, 0x000028A6,\n    0x00006244, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000511E, 0x000028A6,\n    0x00000A14, 0x000500C3, 0x0000000C, 0x000028B9, 0x00003905, 0x00000A14,\n    0x000500C7, 0x0000000C, 0x0000505F, 0x000028B9, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x0000541E, 0x0000505F, 0x00000A0E, 0x000500C6, 0x0000000C,\n    0x000022BB, 0x0000511E, 0x0000541E, 0x000500C7, 0x0000000C, 0x00005077,\n    0x00003905, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005229, 0x00005077,\n    0x00000A17, 0x000500C4, 0x0000000C, 0x00001999, 0x000022BB, 0x00000A1D,\n    0x000500C5, 0x0000000C, 0x000047FF, 0x00005229, 0x00001999, 0x000500C4,\n    0x0000000C, 0x00001C01, 0x00005447, 0x00000A2C, 0x000500C5, 0x0000000C,\n    0x00003C82, 0x000047FF, 0x00001C01, 0x000500C7, 0x0000000C, 0x000050B0,\n    0x00005E63, 0x00000A38, 0x000500C5, 0x0000000C, 0x00003C71, 0x00003C82,\n    0x000050B0, 0x000500C3, 0x0000000C, 0x00003746, 0x00005E63, 0x00000A17,\n    0x000500C7, 0x0000000C, 0x000018BA, 0x00003746, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x00005480, 0x000018BA, 0x00000A1A, 0x000500C5, 0x0000000C,\n    0x000045A9, 0x00003C71, 0x00005480, 0x000500C3, 0x0000000C, 0x00003A6F,\n    0x00005E63, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018BB, 0x00003A6F,\n    0x00000A20, 0x000500C4, 0x0000000C, 0x00005481, 0x000018BB, 0x00000A23,\n    0x000500C5, 0x0000000C, 0x00004570, 0x000045A9, 0x00005481, 0x000500C3,\n    0x0000000C, 0x00003C89, 0x00005E63, 0x00000A23, 0x000500C4, 0x0000000C,\n    0x00002825, 0x00003C89, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B7A,\n    0x00004570, 0x00002825, 0x0004007C, 0x0000000B, 0x000041E6, 0x00003B7A,\n    0x000200F9, 0x00004F78, 0x000200F8, 0x00004F78, 0x000700F5, 0x0000000B,\n    0x00004799, 0x000041E5, 0x00005BE0, 0x000041E6, 0x00002DD9, 0x00050051,\n    0x0000000B, 0x00003B60, 0x00001997, 0x00000000, 0x00050084, 0x0000000B,\n    0x00004451, 0x00003B60, 0x00002A78, 0x00050084, 0x0000000B, 0x00001C91,\n    0x00004799, 0x00004451, 0x00050080, 0x0000000B, 0x0000226F, 0x00001C91,\n    0x000044F0, 0x00050080, 0x0000000B, 0x000053DE, 0x0000226F, 0x00005EAC,\n    0x000500C2, 0x0000000B, 0x00003948, 0x000053DE, 0x00000A17, 0x00060041,\n    0x00000294, 0x00004FAF, 0x0000107A, 0x00000A0B, 0x00003948, 0x0004003D,\n    0x00000017, 0x00001CAA, 0x00004FAF, 0x000500AA, 0x00000009, 0x000035C0,\n    0x0000619E, 0x00000A0D, 0x000500AA, 0x00000009, 0x00005376, 0x0000619E,\n    0x00000A10, 0x000500A6, 0x00000009, 0x00005686, 0x000035C0, 0x00005376,\n    0x000300F7, 0x00003463, 0x00000000, 0x000400FA, 0x00005686, 0x00002957,\n    0x00003463, 0x000200F8, 0x00002957, 0x000500C7, 0x00000017, 0x0000475F,\n    0x00001CAA, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D1, 0x0000475F,\n    0x0000013D, 0x000500C7, 0x00000017, 0x000050AC, 0x00001CAA, 0x0000072E,\n    0x000500C2, 0x00000017, 0x0000448D, 0x000050AC, 0x0000013D, 0x000500C5,\n    0x00000017, 0x00003FF8, 0x000024D1, 0x0000448D, 0x000200F9, 0x00003463,\n    0x000200F8, 0x00003463, 0x000700F5, 0x00000017, 0x00005879, 0x00001CAA,\n    0x00004F78, 0x00003FF8, 0x00002957, 0x000500AA, 0x00000009, 0x00004CB6,\n    0x0000619E, 0x00000A13, 0x000500A6, 0x00000009, 0x00003B23, 0x00005376,\n    0x00004CB6, 0x000300F7, 0x00002DA2, 0x00000000, 0x000400FA, 0x00003B23,\n    0x00002B38, 0x00002DA2, 0x000200F8, 0x00002B38, 0x000500C4, 0x00000017,\n    0x00005E17, 0x00005879, 0x000002ED, 0x000500C2, 0x00000017, 0x00003BE7,\n    0x00005879, 0x000002ED, 0x000500C5, 0x00000017, 0x000029E8, 0x00005E17,\n    0x00003BE7, 0x000200F9, 0x00002DA2, 0x000200F8, 0x00002DA2, 0x000700F5,\n    0x00000017, 0x00004504, 0x00005879, 0x00003463, 0x000029E8, 0x00002B38,\n    0x0007004F, 0x00000011, 0x0000594E, 0x00004504, 0x00004504, 0x00000000,\n    0x00000001, 0x0009004F, 0x00000017, 0x000029A7, 0x00004504, 0x000000C8,\n    0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x000500C2, 0x00000017,\n    0x00002580, 0x000029A7, 0x00000221, 0x000500C7, 0x00000017, 0x00001EE4,\n    0x00002580, 0x00000589, 0x000500C4, 0x00000017, 0x00006047, 0x00001EE4,\n    0x000000B9, 0x000500C2, 0x00000017, 0x00005852, 0x000029A7, 0x00000329,\n    0x000500C7, 0x00000017, 0x000053E6, 0x00005852, 0x000009D7, 0x000500C5,\n    0x00000017, 0x00003CAC, 0x00006047, 0x000053E6, 0x000500C7, 0x00000011,\n    0x00004E7F, 0x0000594E, 0x0000022A, 0x000500C4, 0x00000011, 0x0000595E,\n    0x00004E7F, 0x000007E1, 0x000500C7, 0x00000011, 0x000050AD, 0x0000594E,\n    0x000003B6, 0x000500C2, 0x00000011, 0x000037EF, 0x000050AD, 0x00000724,\n    0x000500C5, 0x00000011, 0x00001A13, 0x0000595E, 0x000037EF, 0x0007004F,\n    0x00000011, 0x000039D1, 0x00003CAC, 0x00003CAC, 0x00000000, 0x00000002,\n    0x000500C5, 0x00000011, 0x000051C5, 0x000039D1, 0x00001A13, 0x00050051,\n    0x0000000B, 0x00004A50, 0x000051C5, 0x00000000, 0x00050051, 0x0000000B,\n    0x00001C29, 0x000051C5, 0x00000001, 0x0007004F, 0x00000011, 0x00005A09,\n    0x00003CAC, 0x00003CAC, 0x00000001, 0x00000003, 0x000500C5, 0x00000011,\n    0x00005D7E, 0x00005A09, 0x0000062A, 0x00050051, 0x0000000B, 0x00004A63,\n    0x00005D7E, 0x00000000, 0x00050051, 0x0000000B, 0x00005D39, 0x00005D7E,\n    0x00000001, 0x00070050, 0x00000017, 0x00003F21, 0x00004A50, 0x00004A63,\n    0x00001C29, 0x00005D39, 0x0007004F, 0x00000011, 0x00001E25, 0x00004504,\n    0x00004504, 0x00000002, 0x00000003, 0x0009004F, 0x00000017, 0x000025BB,\n    0x00004504, 0x000000C8, 0x00000002, 0x00000002, 0x00000003, 0x00000003,\n    0x000500C2, 0x00000017, 0x00002581, 0x000025BB, 0x00000221, 0x000500C7,\n    0x00000017, 0x00001EE5, 0x00002581, 0x00000589, 0x000500C4, 0x00000017,\n    0x00006048, 0x00001EE5, 0x000000B9, 0x000500C2, 0x00000017, 0x00005853,\n    0x000025BB, 0x00000329, 0x000500C7, 0x00000017, 0x000053E7, 0x00005853,\n    0x000009D7, 0x000500C5, 0x00000017, 0x00003CAD, 0x00006048, 0x000053E7,\n    0x000500C7, 0x00000011, 0x00004E80, 0x00001E25, 0x0000022A, 0x000500C4,\n    0x00000011, 0x0000595F, 0x00004E80, 0x000007E1, 0x000500C7, 0x00000011,\n    0x000050AE, 0x00001E25, 0x000003B6, 0x000500C2, 0x00000011, 0x000037F0,\n    0x000050AE, 0x00000724, 0x000500C5, 0x00000011, 0x00001A14, 0x0000595F,\n    0x000037F0, 0x0007004F, 0x00000011, 0x000039D2, 0x00003CAD, 0x00003CAD,\n    0x00000000, 0x00000002, 0x000500C5, 0x00000011, 0x000051C6, 0x000039D2,\n    0x00001A14, 0x00050051, 0x0000000B, 0x00004A51, 0x000051C6, 0x00000000,\n    0x00050051, 0x0000000B, 0x00001C2A, 0x000051C6, 0x00000001, 0x0007004F,\n    0x00000011, 0x00005A0A, 0x00003CAD, 0x00003CAD, 0x00000001, 0x00000003,\n    0x000500C5, 0x00000011, 0x00005D7F, 0x00005A0A, 0x0000062A, 0x00050051,\n    0x0000000B, 0x00004A64, 0x00005D7F, 0x00000000, 0x00050051, 0x0000000B,\n    0x00001B43, 0x00005D7F, 0x00000001, 0x00070050, 0x00000017, 0x00003ADF,\n    0x00004A51, 0x00004A64, 0x00001C2A, 0x00001B43, 0x000500C2, 0x0000000B,\n    0x000030F1, 0x00001F01, 0x00000A17, 0x00060041, 0x00000294, 0x000032C9,\n    0x0000140E, 0x00000A0B, 0x000030F1, 0x0003003E, 0x000032C9, 0x00003F21,\n    0x00050080, 0x0000000B, 0x0000204C, 0x00001F01, 0x00000A3A, 0x000500C2,\n    0x0000000B, 0x000019FD, 0x0000204C, 0x00000A17, 0x00060041, 0x00000294,\n    0x00004BE4, 0x0000140E, 0x00000A0B, 0x000019FD, 0x0003003E, 0x00004BE4,\n    0x00003ADF, 0x00050080, 0x0000000B, 0x0000204D, 0x000053DE, 0x00000A3A,\n    0x000500C2, 0x0000000B, 0x000019EA, 0x0000204D, 0x00000A17, 0x00060041,\n    0x00000294, 0x00005566, 0x0000107A, 0x00000A0B, 0x000019EA, 0x0004003D,\n    0x00000017, 0x00003910, 0x00005566, 0x000300F7, 0x00003A1A, 0x00000000,\n    0x000400FA, 0x00005686, 0x00002958, 0x00003A1A, 0x000200F8, 0x00002958,\n    0x000500C7, 0x00000017, 0x00004760, 0x00003910, 0x000009CE, 0x000500C4,\n    0x00000017, 0x000024D2, 0x00004760, 0x0000013D, 0x000500C7, 0x00000017,\n    0x000050B1, 0x00003910, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448E,\n    0x000050B1, 0x0000013D, 0x000500C5, 0x00000017, 0x00003FF9, 0x000024D2,\n    0x0000448E, 0x000200F9, 0x00003A1A, 0x000200F8, 0x00003A1A, 0x000700F5,\n    0x00000017, 0x00002AAC, 0x00003910, 0x00002DA2, 0x00003FF9, 0x00002958,\n    0x000300F7, 0x00002DA3, 0x00000000, 0x000400FA, 0x00003B23, 0x00002B39,\n    0x00002DA3, 0x000200F8, 0x00002B39, 0x000500C4, 0x00000017, 0x00005E18,\n    0x00002AAC, 0x000002ED, 0x000500C2, 0x00000017, 0x00003BE8, 0x00002AAC,\n    0x000002ED, 0x000500C5, 0x00000017, 0x000029E9, 0x00005E18, 0x00003BE8,\n    0x000200F9, 0x00002DA3, 0x000200F8, 0x00002DA3, 0x000700F5, 0x00000017,\n    0x00004505, 0x00002AAC, 0x00003A1A, 0x000029E9, 0x00002B39, 0x0007004F,\n    0x00000011, 0x0000594F, 0x00004505, 0x00004505, 0x00000000, 0x00000001,\n    0x0009004F, 0x00000017, 0x000029A8, 0x00004505, 0x000000C8, 0x00000000,\n    0x00000000, 0x00000001, 0x00000001, 0x000500C2, 0x00000017, 0x00002582,\n    0x000029A8, 0x00000221, 0x000500C7, 0x00000017, 0x00001EE6, 0x00002582,\n    0x00000589, 0x000500C4, 0x00000017, 0x00006049, 0x00001EE6, 0x000000B9,\n    0x000500C2, 0x00000017, 0x00005854, 0x000029A8, 0x00000329, 0x000500C7,\n    0x00000017, 0x000053E8, 0x00005854, 0x000009D7, 0x000500C5, 0x00000017,\n    0x00003CAE, 0x00006049, 0x000053E8, 0x000500C7, 0x00000011, 0x00004E81,\n    0x0000594F, 0x0000022A, 0x000500C4, 0x00000011, 0x00005960, 0x00004E81,\n    0x000007E1, 0x000500C7, 0x00000011, 0x000050B2, 0x0000594F, 0x000003B6,\n    0x000500C2, 0x00000011, 0x000037F1, 0x000050B2, 0x00000724, 0x000500C5,\n    0x00000011, 0x00001A15, 0x00005960, 0x000037F1, 0x0007004F, 0x00000011,\n    0x000039D3, 0x00003CAE, 0x00003CAE, 0x00000000, 0x00000002, 0x000500C5,\n    0x00000011, 0x000051C7, 0x000039D3, 0x00001A15, 0x00050051, 0x0000000B,\n    0x00004A52, 0x000051C7, 0x00000000, 0x00050051, 0x0000000B, 0x00001C2B,\n    0x000051C7, 0x00000001, 0x0007004F, 0x00000011, 0x00005A0B, 0x00003CAE,\n    0x00003CAE, 0x00000001, 0x00000003, 0x000500C5, 0x00000011, 0x00005D80,\n    0x00005A0B, 0x0000062A, 0x00050051, 0x0000000B, 0x00004A65, 0x00005D80,\n    0x00000000, 0x00050051, 0x0000000B, 0x00005D3A, 0x00005D80, 0x00000001,\n    0x00070050, 0x00000017, 0x00003F22, 0x00004A52, 0x00004A65, 0x00001C2B,\n    0x00005D3A, 0x0007004F, 0x00000011, 0x00001E26, 0x00004505, 0x00004505,\n    0x00000002, 0x00000003, 0x0009004F, 0x00000017, 0x000025BC, 0x00004505,\n    0x000000C8, 0x00000002, 0x00000002, 0x00000003, 0x00000003, 0x000500C2,\n    0x00000017, 0x00002583, 0x000025BC, 0x00000221, 0x000500C7, 0x00000017,\n    0x00001EE7, 0x00002583, 0x00000589, 0x000500C4, 0x00000017, 0x0000604A,\n    0x00001EE7, 0x000000B9, 0x000500C2, 0x00000017, 0x00005855, 0x000025BC,\n    0x00000329, 0x000500C7, 0x00000017, 0x000053E9, 0x00005855, 0x000009D7,\n    0x000500C5, 0x00000017, 0x00003CAF, 0x0000604A, 0x000053E9, 0x000500C7,\n    0x00000011, 0x00004E82, 0x00001E26, 0x0000022A, 0x000500C4, 0x00000011,\n    0x00005961, 0x00004E82, 0x000007E1, 0x000500C7, 0x00000011, 0x000050B3,\n    0x00001E26, 0x000003B6, 0x000500C2, 0x00000011, 0x000037F2, 0x000050B3,\n    0x00000724, 0x000500C5, 0x00000011, 0x00001A16, 0x00005961, 0x000037F2,\n    0x0007004F, 0x00000011, 0x000039D4, 0x00003CAF, 0x00003CAF, 0x00000000,\n    0x00000002, 0x000500C5, 0x00000011, 0x000051C8, 0x000039D4, 0x00001A16,\n    0x00050051, 0x0000000B, 0x00004A53, 0x000051C8, 0x00000000, 0x00050051,\n    0x0000000B, 0x00001C2C, 0x000051C8, 0x00000001, 0x0007004F, 0x00000011,\n    0x00005A0C, 0x00003CAF, 0x00003CAF, 0x00000001, 0x00000003, 0x000500C5,\n    0x00000011, 0x00005D81, 0x00005A0C, 0x0000062A, 0x00050051, 0x0000000B,\n    0x00004A66, 0x00005D81, 0x00000000, 0x00050051, 0x0000000B, 0x000060DC,\n    0x00005D81, 0x00000001, 0x00070050, 0x00000017, 0x0000268D, 0x00004A53,\n    0x00004A66, 0x00001C2C, 0x000060DC, 0x00050080, 0x0000000B, 0x00003EDA,\n    0x00001F01, 0x00000A6A, 0x000500C2, 0x0000000B, 0x00002040, 0x00003EDA,\n    0x00000A17, 0x00060041, 0x00000294, 0x00004BE5, 0x0000140E, 0x00000A0B,\n    0x00002040, 0x0003003E, 0x00004BE5, 0x00003F22, 0x00050080, 0x0000000B,\n    0x0000204E, 0x00001F01, 0x00000A9A, 0x000500C2, 0x0000000B, 0x000019FE,\n    0x0000204E, 0x00000A17, 0x00060041, 0x00000294, 0x000054DF, 0x0000140E,\n    0x00000A0B, 0x000019FE, 0x0003003E, 0x000054DF, 0x0000268D, 0x000200F9,\n    0x00004C7A, 0x000200F8, 0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_r11g11b10_rgba16_snorm_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25155\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n     %v4uint = OpTypeVector %uint 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v3uint = OpTypeVector %uint 3\n     %uint_9 = OpConstant %uint 9\n     %v2bool = OpTypeVector %bool 2\n     %uint_0 = OpConstant %uint 0\n   %uint_513 = OpConstant %uint 513\n   %uint_512 = OpConstant %uint 512\n  %uint_1023 = OpConstant %uint 1023\n     %uint_6 = OpConstant %uint 6\n     %uint_3 = OpConstant %uint 3\n %uint_65535 = OpConstant %uint 65535\n    %uint_10 = OpConstant %uint 10\n  %uint_1025 = OpConstant %uint 1025\n  %uint_1024 = OpConstant %uint 1024\n  %uint_2047 = OpConstant %uint 2047\n     %uint_5 = OpConstant %uint 5\n    %uint_11 = OpConstant %uint 11\n    %uint_16 = OpConstant %uint 16\n    %uint_22 = OpConstant %uint 22\n%uint_2147418112 = OpConstant %uint 2147418112\n     %uint_1 = OpConstant %uint 1\n     %uint_2 = OpConstant %uint 2\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n      %int_3 = OpConstant %int 3\n      %int_2 = OpConstant %int 2\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %2605 = OpConstantComposite %v3uint %uint_3 %uint_0 %uint_0\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n     %uint_4 = OpConstant %uint 4\n    %uint_32 = OpConstant %uint 32\n    %uint_48 = OpConstant %uint 48\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n       %2640 = OpConstantComposite %v2uint %uint_2047 %uint_2047\n       %2017 = OpConstantComposite %v2uint %uint_10 %uint_10\n       %1807 = OpConstantComposite %v2uint %uint_0 %uint_0\n       %2255 = OpConstantComposite %v2uint %uint_1025 %uint_1025\n       %2234 = OpConstantComposite %v2uint %uint_1024 %uint_1024\n       %1912 = OpConstantComposite %v2uint %uint_5 %uint_5\n       %2015 = OpConstantComposite %v2uint %uint_65535 %uint_65535\n       %2038 = OpConstantComposite %v2uint %uint_11 %uint_11\n       %2143 = OpConstantComposite %v2uint %uint_16 %uint_16\n       %2269 = OpConstantComposite %v2uint %uint_22 %uint_22\n       %1996 = OpConstantComposite %v2uint %uint_9 %uint_9\n        %536 = OpConstantComposite %v2uint %uint_513 %uint_513\n        %515 = OpConstantComposite %v2uint %uint_512 %uint_512\n       %2213 = OpConstantComposite %v2uint %uint_1023 %uint_1023\n       %1933 = OpConstantComposite %v2uint %uint_6 %uint_6\n       %1870 = OpConstantComposite %v2uint %uint_3 %uint_3\n        %883 = OpConstantComposite %v2uint %uint_2147418112 %uint_2147418112\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24540 = OpBitwiseAnd %uint %13606 %uint_1\n      %17270 = OpINotEqual %bool %24540 %uint_0\n      %12328 = OpBitwiseAnd %uint %13606 %uint_2\n      %17284 = OpINotEqual %bool %12328 %uint_0\n       %7856 = OpShiftRightLogical %uint %13606 %uint_2\n      %25058 = OpBitwiseAnd %uint %7856 %uint_3\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2605\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %6586 DontFlatten\n               OpBranchConditional %24679 %21992 %6586\n      %21992 = OpLabel\n               OpBranch %19578\n       %6586 = OpLabel\n      %23478 = OpBitcast %v3int %21387\n      %18710 = OpCompositeExtract %uint %22410 1\n      %23531 = OpCompositeExtract %int %23478 0\n      %22810 = OpIMul %int %23531 %int_8\n       %6362 = OpCompositeExtract %int %23478 2\n      %14505 = OpBitcast %int %18710\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %23478 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %6594\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %22810 %24535\n      %10404 = OpBitcast %uint %8258\n      %14582 = OpIAdd %uint %22411 %10404\n      %12308 = OpLogicalNot %bool %17270\n               OpSelectionMerge %19040 DontFlatten\n               OpBranchConditional %12308 %9741 %17007\n       %9741 = OpLabel\n      %17463 = OpCompositeExtract %uint %21387 0\n      %11246 = OpCompositeExtract %uint %21387 1\n      %18801 = OpCompositeExtract %uint %21387 2\n      %14831 = OpIMul %uint %22409 %18801\n      %20322 = OpIAdd %uint %11246 %14831\n      %21676 = OpIMul %uint %22408 %20322\n      %20398 = OpIAdd %uint %17463 %21676\n      %11367 = OpShiftLeftLogical %uint %20398 %uint_2\n               OpBranch %19040\n      %17007 = OpLabel\n               OpSelectionMerge %23536 DontFlatten\n               OpBranchConditional %17284 %11410 %24353\n      %11410 = OpLabel\n      %21364 = OpShiftRightLogical %uint %22408 %int_5\n      %13804 = OpShiftRightLogical %uint %22409 %int_4\n      %13237 = OpShiftRightArithmetic %int %6362 %int_2\n      %22374 = OpBitcast %int %13804\n      %25085 = OpIMul %int %13237 %22374\n      %11618 = OpShiftRightArithmetic %int %17598 %int_4\n      %16670 = OpIAdd %int %25085 %11618\n      %19064 = OpBitcast %int %21364\n      %13020 = OpIMul %int %16670 %19064\n      %12986 = OpShiftRightArithmetic %int %23531 %int_5\n      %24558 = OpIAdd %int %13020 %12986\n       %8797 = OpShiftLeftLogical %int %24558 %int_7\n      %11434 = OpBitwiseAnd %int %6362 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %17598 %int_1\n      %21365 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21365 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %23531 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17334 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17334 %uint_2\n      %13015 = OpShiftRightArithmetic %int %17598 %int_3\n       %9929 = OpBitwiseXor %int %13015 %13237\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %23531 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %17598 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6551\n       %7168 = OpShiftLeftLogical %int %16793 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24144 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24144 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24144 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24144 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %23536\n      %24353 = OpLabel\n      %23000 = OpBitcast %v2int %17136\n      %22120 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %23000 1\n      %12089 = OpShiftRightArithmetic %int %14597 %int_5\n      %22400 = OpBitcast %int %22120\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %23000 0\n      %20423 = OpShiftRightArithmetic %int %25154 %int_5\n      %18864 = OpIAdd %int %7938 %20423\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25154 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17335 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17335 %uint_2\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25154 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6552\n       %7169 = OpShiftLeftLogical %int %21575 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24163 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24163 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24163 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %23536\n      %23536 = OpLabel\n      %10540 = OpPhi %uint %16869 %11410 %16870 %24353\n               OpBranch %19040\n      %19040 = OpLabel\n      %11376 = OpPhi %uint %11367 %9741 %10540 %23536\n      %18621 = OpIAdd %uint %11376 %24236\n      %15698 = OpShiftRightLogical %uint %18621 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15698\n       %7338 = OpLoad %v4uint %20399\n      %13760 = OpIEqual %bool %25058 %uint_1\n      %21366 = OpIEqual %bool %25058 %uint_2\n      %22150 = OpLogicalOr %bool %13760 %21366\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %7338 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %7338 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22649 = OpPhi %v4uint %7338 %19040 %16376 %10583\n      %19638 = OpIEqual %bool %25058 %uint_3\n      %15139 = OpLogicalOr %bool %21366 %19638\n               OpSelectionMerge %11682 None\n               OpBranchConditional %15139 %11064 %11682\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22649 %749\n      %15335 = OpShiftRightLogical %v4uint %22649 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %11682\n      %11682 = OpLabel\n      %19948 = OpPhi %v4uint %22649 %13411 %10728 %11064\n      %21173 = OpVectorShuffle %v2uint %19948 %19948 0 1\n      %12206 = OpBitwiseAnd %v2uint %21173 %2640\n       %6898 = OpShiftRightLogical %v2uint %12206 %2017\n      %12708 = OpINotEqual %v2bool %6898 %1807\n      %20140 = OpIEqual %v2bool %12206 %2234\n       %7655 = OpSelect %v2uint %20140 %2255 %12206\n      %23050 = OpSelect %v2uint %12708 %2640 %1807\n      %23672 = OpBitwiseXor %v2uint %7655 %23050\n      %24500 = OpIAdd %v2uint %23672 %6898\n       %8872 = OpShiftLeftLogical %v2uint %24500 %1912\n      %13590 = OpShiftRightLogical %v2uint %24500 %1912\n      %23618 = OpBitwiseOr %v2uint %8872 %13590\n      %15463 = OpSelect %v2uint %12708 %2015 %1807\n       %7774 = OpBitwiseXor %v2uint %23618 %15463\n      %24941 = OpIAdd %v2uint %7774 %6898\n      %24336 = OpShiftRightLogical %v2uint %21173 %2038\n      %11822 = OpBitwiseAnd %v2uint %24336 %2640\n       %6319 = OpShiftRightLogical %v2uint %11822 %2017\n      %12709 = OpINotEqual %v2bool %6319 %1807\n      %20141 = OpIEqual %v2bool %11822 %2234\n       %7656 = OpSelect %v2uint %20141 %2255 %11822\n      %23051 = OpSelect %v2uint %12709 %2640 %1807\n      %23673 = OpBitwiseXor %v2uint %7656 %23051\n      %24501 = OpIAdd %v2uint %23673 %6319\n       %8873 = OpShiftLeftLogical %v2uint %24501 %1912\n      %13591 = OpShiftRightLogical %v2uint %24501 %1912\n      %23619 = OpBitwiseOr %v2uint %8873 %13591\n      %15464 = OpSelect %v2uint %12709 %2015 %1807\n       %7812 = OpBitwiseXor %v2uint %23619 %15464\n      %24557 = OpIAdd %v2uint %7812 %6319\n       %8296 = OpShiftLeftLogical %v2uint %24557 %2143\n       %9076 = OpBitwiseOr %v2uint %24941 %8296\n      %23541 = OpShiftRightLogical %v2uint %21173 %2269\n      %13212 = OpShiftRightLogical %v2uint %23541 %1996\n      %11904 = OpINotEqual %v2bool %13212 %1807\n      %20142 = OpIEqual %v2bool %23541 %515\n       %7657 = OpSelect %v2uint %20142 %536 %23541\n      %23052 = OpSelect %v2uint %11904 %2213 %1807\n      %23674 = OpBitwiseXor %v2uint %7657 %23052\n      %24502 = OpIAdd %v2uint %23674 %13212\n       %8874 = OpShiftLeftLogical %v2uint %24502 %1933\n      %13592 = OpShiftRightLogical %v2uint %24502 %1870\n      %23620 = OpBitwiseOr %v2uint %8874 %13592\n      %15465 = OpSelect %v2uint %11904 %2015 %1807\n       %7831 = OpBitwiseXor %v2uint %23620 %15465\n      %22180 = OpIAdd %v2uint %7831 %13212\n      %18024 = OpBitwiseOr %v2uint %22180 %883\n      %10453 = OpCompositeExtract %uint %9076 0\n      %23730 = OpCompositeExtract %uint %9076 1\n       %7641 = OpCompositeExtract %uint %18024 0\n       %7795 = OpCompositeExtract %uint %18024 1\n      %16161 = OpCompositeConstruct %v4uint %10453 %23730 %7641 %7795\n       %7813 = OpVectorShuffle %v4uint %16161 %16161 0 2 1 3\n       %8699 = OpVectorShuffle %v2uint %19948 %19948 2 3\n       %7167 = OpBitwiseAnd %v2uint %8699 %2640\n       %6899 = OpShiftRightLogical %v2uint %7167 %2017\n      %12710 = OpINotEqual %v2bool %6899 %1807\n      %20143 = OpIEqual %v2bool %7167 %2234\n       %7658 = OpSelect %v2uint %20143 %2255 %7167\n      %23053 = OpSelect %v2uint %12710 %2640 %1807\n      %23675 = OpBitwiseXor %v2uint %7658 %23053\n      %24503 = OpIAdd %v2uint %23675 %6899\n       %8875 = OpShiftLeftLogical %v2uint %24503 %1912\n      %13593 = OpShiftRightLogical %v2uint %24503 %1912\n      %23621 = OpBitwiseOr %v2uint %8875 %13593\n      %15466 = OpSelect %v2uint %12710 %2015 %1807\n       %7775 = OpBitwiseXor %v2uint %23621 %15466\n      %24942 = OpIAdd %v2uint %7775 %6899\n      %24337 = OpShiftRightLogical %v2uint %8699 %2038\n      %11823 = OpBitwiseAnd %v2uint %24337 %2640\n       %6320 = OpShiftRightLogical %v2uint %11823 %2017\n      %12711 = OpINotEqual %v2bool %6320 %1807\n      %20144 = OpIEqual %v2bool %11823 %2234\n       %7659 = OpSelect %v2uint %20144 %2255 %11823\n      %23054 = OpSelect %v2uint %12711 %2640 %1807\n      %23676 = OpBitwiseXor %v2uint %7659 %23054\n      %24504 = OpIAdd %v2uint %23676 %6320\n       %8876 = OpShiftLeftLogical %v2uint %24504 %1912\n      %13594 = OpShiftRightLogical %v2uint %24504 %1912\n      %23622 = OpBitwiseOr %v2uint %8876 %13594\n      %15467 = OpSelect %v2uint %12711 %2015 %1807\n       %7814 = OpBitwiseXor %v2uint %23622 %15467\n      %24559 = OpIAdd %v2uint %7814 %6320\n       %8297 = OpShiftLeftLogical %v2uint %24559 %2143\n       %9077 = OpBitwiseOr %v2uint %24942 %8297\n      %23542 = OpShiftRightLogical %v2uint %8699 %2269\n      %13213 = OpShiftRightLogical %v2uint %23542 %1996\n      %11905 = OpINotEqual %v2bool %13213 %1807\n      %20145 = OpIEqual %v2bool %23542 %515\n       %7660 = OpSelect %v2uint %20145 %536 %23542\n      %23055 = OpSelect %v2uint %11905 %2213 %1807\n      %23677 = OpBitwiseXor %v2uint %7660 %23055\n      %24505 = OpIAdd %v2uint %23677 %13213\n       %8877 = OpShiftLeftLogical %v2uint %24505 %1933\n      %13595 = OpShiftRightLogical %v2uint %24505 %1870\n      %23623 = OpBitwiseOr %v2uint %8877 %13595\n      %15468 = OpSelect %v2uint %11905 %2015 %1807\n       %7832 = OpBitwiseXor %v2uint %23623 %15468\n      %22181 = OpIAdd %v2uint %7832 %13213\n      %18025 = OpBitwiseOr %v2uint %22181 %883\n      %10454 = OpCompositeExtract %uint %9077 0\n      %23731 = OpCompositeExtract %uint %9077 1\n       %7642 = OpCompositeExtract %uint %18025 0\n       %7796 = OpCompositeExtract %uint %18025 1\n      %18346 = OpCompositeConstruct %v4uint %10454 %23731 %7642 %7796\n      %23513 = OpVectorShuffle %v4uint %18346 %18346 0 2 1 3\n      %15200 = OpShiftRightLogical %uint %14582 %int_4\n       %8966 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %15200\n               OpStore %8966 %7813\n       %8268 = OpIAdd %uint %14582 %uint_16\n       %6653 = OpShiftRightLogical %uint %8268 %int_4\n      %21689 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %6653\n               OpStore %21689 %23513\n               OpSelectionMerge %24688 DontFlatten\n               OpBranchConditional %17270 %21993 %7205\n      %21993 = OpLabel\n               OpBranch %24688\n       %7205 = OpLabel\n               OpBranch %24688\n      %24688 = OpLabel\n      %11377 = OpPhi %uint %uint_32 %21993 %uint_16 %7205\n      %18622 = OpIAdd %uint %18621 %11377\n      %15699 = OpShiftRightLogical %uint %18622 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15699\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %14874 None\n               OpBranchConditional %22150 %10584 %14874\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %14874\n      %14874 = OpLabel\n      %10924 = OpPhi %v4uint %14608 %24688 %16377 %10584\n               OpSelectionMerge %11683 None\n               OpBranchConditional %15139 %11065 %11683\n      %11065 = OpLabel\n      %24088 = OpShiftLeftLogical %v4uint %10924 %749\n      %15336 = OpShiftRightLogical %v4uint %10924 %749\n      %10729 = OpBitwiseOr %v4uint %24088 %15336\n               OpBranch %11683\n      %11683 = OpLabel\n      %19949 = OpPhi %v4uint %10924 %14874 %10729 %11065\n      %21174 = OpVectorShuffle %v2uint %19949 %19949 0 1\n      %12207 = OpBitwiseAnd %v2uint %21174 %2640\n       %6900 = OpShiftRightLogical %v2uint %12207 %2017\n      %12712 = OpINotEqual %v2bool %6900 %1807\n      %20146 = OpIEqual %v2bool %12207 %2234\n       %7661 = OpSelect %v2uint %20146 %2255 %12207\n      %23056 = OpSelect %v2uint %12712 %2640 %1807\n      %23678 = OpBitwiseXor %v2uint %7661 %23056\n      %24506 = OpIAdd %v2uint %23678 %6900\n       %8878 = OpShiftLeftLogical %v2uint %24506 %1912\n      %13596 = OpShiftRightLogical %v2uint %24506 %1912\n      %23624 = OpBitwiseOr %v2uint %8878 %13596\n      %15469 = OpSelect %v2uint %12712 %2015 %1807\n       %7776 = OpBitwiseXor %v2uint %23624 %15469\n      %24943 = OpIAdd %v2uint %7776 %6900\n      %24338 = OpShiftRightLogical %v2uint %21174 %2038\n      %11824 = OpBitwiseAnd %v2uint %24338 %2640\n       %6321 = OpShiftRightLogical %v2uint %11824 %2017\n      %12713 = OpINotEqual %v2bool %6321 %1807\n      %20147 = OpIEqual %v2bool %11824 %2234\n       %7662 = OpSelect %v2uint %20147 %2255 %11824\n      %23057 = OpSelect %v2uint %12713 %2640 %1807\n      %23679 = OpBitwiseXor %v2uint %7662 %23057\n      %24507 = OpIAdd %v2uint %23679 %6321\n       %8879 = OpShiftLeftLogical %v2uint %24507 %1912\n      %13597 = OpShiftRightLogical %v2uint %24507 %1912\n      %23625 = OpBitwiseOr %v2uint %8879 %13597\n      %15470 = OpSelect %v2uint %12713 %2015 %1807\n       %7815 = OpBitwiseXor %v2uint %23625 %15470\n      %24560 = OpIAdd %v2uint %7815 %6321\n       %8298 = OpShiftLeftLogical %v2uint %24560 %2143\n       %9078 = OpBitwiseOr %v2uint %24943 %8298\n      %23543 = OpShiftRightLogical %v2uint %21174 %2269\n      %13214 = OpShiftRightLogical %v2uint %23543 %1996\n      %11906 = OpINotEqual %v2bool %13214 %1807\n      %20148 = OpIEqual %v2bool %23543 %515\n       %7663 = OpSelect %v2uint %20148 %536 %23543\n      %23058 = OpSelect %v2uint %11906 %2213 %1807\n      %23680 = OpBitwiseXor %v2uint %7663 %23058\n      %24508 = OpIAdd %v2uint %23680 %13214\n       %8880 = OpShiftLeftLogical %v2uint %24508 %1933\n      %13598 = OpShiftRightLogical %v2uint %24508 %1870\n      %23626 = OpBitwiseOr %v2uint %8880 %13598\n      %15471 = OpSelect %v2uint %11906 %2015 %1807\n       %7833 = OpBitwiseXor %v2uint %23626 %15471\n      %22182 = OpIAdd %v2uint %7833 %13214\n      %18026 = OpBitwiseOr %v2uint %22182 %883\n      %10455 = OpCompositeExtract %uint %9078 0\n      %23732 = OpCompositeExtract %uint %9078 1\n       %7643 = OpCompositeExtract %uint %18026 0\n       %7797 = OpCompositeExtract %uint %18026 1\n      %16162 = OpCompositeConstruct %v4uint %10455 %23732 %7643 %7797\n       %7816 = OpVectorShuffle %v4uint %16162 %16162 0 2 1 3\n       %8700 = OpVectorShuffle %v2uint %19949 %19949 2 3\n       %7170 = OpBitwiseAnd %v2uint %8700 %2640\n       %6901 = OpShiftRightLogical %v2uint %7170 %2017\n      %12714 = OpINotEqual %v2bool %6901 %1807\n      %20149 = OpIEqual %v2bool %7170 %2234\n       %7664 = OpSelect %v2uint %20149 %2255 %7170\n      %23059 = OpSelect %v2uint %12714 %2640 %1807\n      %23681 = OpBitwiseXor %v2uint %7664 %23059\n      %24509 = OpIAdd %v2uint %23681 %6901\n       %8881 = OpShiftLeftLogical %v2uint %24509 %1912\n      %13599 = OpShiftRightLogical %v2uint %24509 %1912\n      %23627 = OpBitwiseOr %v2uint %8881 %13599\n      %15474 = OpSelect %v2uint %12714 %2015 %1807\n       %7777 = OpBitwiseXor %v2uint %23627 %15474\n      %24944 = OpIAdd %v2uint %7777 %6901\n      %24339 = OpShiftRightLogical %v2uint %8700 %2038\n      %11825 = OpBitwiseAnd %v2uint %24339 %2640\n       %6322 = OpShiftRightLogical %v2uint %11825 %2017\n      %12715 = OpINotEqual %v2bool %6322 %1807\n      %20150 = OpIEqual %v2bool %11825 %2234\n       %7665 = OpSelect %v2uint %20150 %2255 %11825\n      %23060 = OpSelect %v2uint %12715 %2640 %1807\n      %23682 = OpBitwiseXor %v2uint %7665 %23060\n      %24510 = OpIAdd %v2uint %23682 %6322\n       %8882 = OpShiftLeftLogical %v2uint %24510 %1912\n      %13600 = OpShiftRightLogical %v2uint %24510 %1912\n      %23628 = OpBitwiseOr %v2uint %8882 %13600\n      %15475 = OpSelect %v2uint %12715 %2015 %1807\n       %7817 = OpBitwiseXor %v2uint %23628 %15475\n      %24561 = OpIAdd %v2uint %7817 %6322\n       %8299 = OpShiftLeftLogical %v2uint %24561 %2143\n       %9079 = OpBitwiseOr %v2uint %24944 %8299\n      %23544 = OpShiftRightLogical %v2uint %8700 %2269\n      %13215 = OpShiftRightLogical %v2uint %23544 %1996\n      %11907 = OpINotEqual %v2bool %13215 %1807\n      %20151 = OpIEqual %v2bool %23544 %515\n       %7666 = OpSelect %v2uint %20151 %536 %23544\n      %23061 = OpSelect %v2uint %11907 %2213 %1807\n      %23683 = OpBitwiseXor %v2uint %7666 %23061\n      %24511 = OpIAdd %v2uint %23683 %13215\n       %8883 = OpShiftLeftLogical %v2uint %24511 %1933\n      %13601 = OpShiftRightLogical %v2uint %24511 %1870\n      %23629 = OpBitwiseOr %v2uint %8883 %13601\n      %15476 = OpSelect %v2uint %11907 %2015 %1807\n       %7834 = OpBitwiseXor %v2uint %23629 %15476\n      %22183 = OpIAdd %v2uint %7834 %13215\n      %18027 = OpBitwiseOr %v2uint %22183 %883\n      %10456 = OpCompositeExtract %uint %9079 0\n      %23733 = OpCompositeExtract %uint %9079 1\n       %7644 = OpCompositeExtract %uint %18027 0\n       %7798 = OpCompositeExtract %uint %18027 1\n      %17092 = OpCompositeConstruct %v4uint %10456 %23733 %7644 %7798\n      %18311 = OpVectorShuffle %v4uint %17092 %17092 0 2 1 3\n      %18761 = OpIAdd %uint %14582 %uint_32\n      %10678 = OpShiftRightLogical %uint %18761 %int_4\n      %19428 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %10678\n               OpStore %19428 %7816\n       %8269 = OpIAdd %uint %14582 %uint_48\n       %6654 = OpShiftRightLogical %uint %8269 %int_4\n      %21727 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %6654\n               OpStore %21727 %18311\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_r11g11b10_rgba16_snorm_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006243, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000017,\n    0x0000000B, 0x00000004, 0x00040015, 0x0000000C, 0x00000020, 0x00000001,\n    0x00040017, 0x00000012, 0x0000000C, 0x00000002, 0x00040017, 0x00000016,\n    0x0000000C, 0x00000003, 0x00020014, 0x00000009, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A25, 0x00000009,\n    0x00040017, 0x0000000F, 0x00000009, 0x00000002, 0x0004002B, 0x0000000B,\n    0x00000A0A, 0x00000000, 0x0004002B, 0x0000000B, 0x0000044A, 0x00000201,\n    0x0004002B, 0x0000000B, 0x00000447, 0x00000200, 0x0004002B, 0x0000000B,\n    0x00000A44, 0x000003FF, 0x0004002B, 0x0000000B, 0x00000A1C, 0x00000006,\n    0x0004002B, 0x0000000B, 0x00000A13, 0x00000003, 0x0004002B, 0x0000000B,\n    0x000001C1, 0x0000FFFF, 0x0004002B, 0x0000000B, 0x00000A28, 0x0000000A,\n    0x0004002B, 0x0000000B, 0x00000A4A, 0x00000401, 0x0004002B, 0x0000000B,\n    0x00000A47, 0x00000400, 0x0004002B, 0x0000000B, 0x00000A81, 0x000007FF,\n    0x0004002B, 0x0000000B, 0x00000A19, 0x00000005, 0x0004002B, 0x0000000B,\n    0x00000A2B, 0x0000000B, 0x0004002B, 0x0000000B, 0x00000A3A, 0x00000010,\n    0x0004002B, 0x0000000B, 0x00000A4C, 0x00000016, 0x0004002B, 0x0000000B,\n    0x000003D6, 0x7FFF0000, 0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001,\n    0x0004002B, 0x0000000B, 0x00000A10, 0x00000002, 0x0004002B, 0x0000000B,\n    0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B, 0x00000A22, 0x00000008,\n    0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00, 0x0004002B, 0x0000000C,\n    0x00000A17, 0x00000004, 0x0004002B, 0x0000000C, 0x00000A1D, 0x00000006,\n    0x0004002B, 0x0000000C, 0x00000A2C, 0x0000000B, 0x0004002B, 0x0000000C,\n    0x00000A38, 0x0000000F, 0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001,\n    0x0004002B, 0x0000000C, 0x00000A1A, 0x00000005, 0x0004002B, 0x0000000C,\n    0x00000A20, 0x00000007, 0x0004002B, 0x0000000C, 0x00000A23, 0x00000008,\n    0x0004002B, 0x0000000C, 0x00000A2F, 0x0000000C, 0x0004002B, 0x0000000C,\n    0x00000A14, 0x00000003, 0x0004002B, 0x0000000C, 0x00000A11, 0x00000002,\n    0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000, 0x000A001E, 0x00000489,\n    0x0000000B, 0x0000000B, 0x0000000B, 0x0000000B, 0x00000014, 0x0000000B,\n    0x0000000B, 0x0000000B, 0x00040020, 0x00000706, 0x00000009, 0x00000489,\n    0x0004003B, 0x00000706, 0x00000CE9, 0x00000009, 0x00040020, 0x00000288,\n    0x00000009, 0x0000000B, 0x00040020, 0x00000291, 0x00000009, 0x00000014,\n    0x00040020, 0x00000292, 0x00000001, 0x00000014, 0x0004003B, 0x00000292,\n    0x00000F48, 0x00000001, 0x0006002C, 0x00000014, 0x00000A2D, 0x00000A13,\n    0x00000A0A, 0x00000A0A, 0x0003001D, 0x000007DC, 0x00000017, 0x0003001E,\n    0x000007B4, 0x000007DC, 0x00040020, 0x00000A31, 0x00000002, 0x000007B4,\n    0x0004003B, 0x00000A31, 0x0000107A, 0x00000002, 0x00040020, 0x00000294,\n    0x00000002, 0x00000017, 0x0003001D, 0x000007DD, 0x00000017, 0x0003001E,\n    0x000007B5, 0x000007DD, 0x00040020, 0x00000A32, 0x00000002, 0x000007B5,\n    0x0004003B, 0x00000A32, 0x0000140E, 0x00000002, 0x0004002B, 0x0000000B,\n    0x00000A16, 0x00000004, 0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020,\n    0x0004002B, 0x0000000B, 0x00000A9A, 0x00000030, 0x0006002C, 0x00000014,\n    0x00000BC3, 0x00000A16, 0x00000A6A, 0x00000A0D, 0x0007002C, 0x00000017,\n    0x000009CE, 0x000008A6, 0x000008A6, 0x000008A6, 0x000008A6, 0x0007002C,\n    0x00000017, 0x0000013D, 0x00000A22, 0x00000A22, 0x00000A22, 0x00000A22,\n    0x0007002C, 0x00000017, 0x0000072E, 0x000005FD, 0x000005FD, 0x000005FD,\n    0x000005FD, 0x0007002C, 0x00000017, 0x000002ED, 0x00000A3A, 0x00000A3A,\n    0x00000A3A, 0x00000A3A, 0x0005002C, 0x00000011, 0x00000A50, 0x00000A81,\n    0x00000A81, 0x0005002C, 0x00000011, 0x000007E1, 0x00000A28, 0x00000A28,\n    0x0005002C, 0x00000011, 0x0000070F, 0x00000A0A, 0x00000A0A, 0x0005002C,\n    0x00000011, 0x000008CF, 0x00000A4A, 0x00000A4A, 0x0005002C, 0x00000011,\n    0x000008BA, 0x00000A47, 0x00000A47, 0x0005002C, 0x00000011, 0x00000778,\n    0x00000A19, 0x00000A19, 0x0005002C, 0x00000011, 0x000007DF, 0x000001C1,\n    0x000001C1, 0x0005002C, 0x00000011, 0x000007F6, 0x00000A2B, 0x00000A2B,\n    0x0005002C, 0x00000011, 0x0000085F, 0x00000A3A, 0x00000A3A, 0x0005002C,\n    0x00000011, 0x000008DD, 0x00000A4C, 0x00000A4C, 0x0005002C, 0x00000011,\n    0x000007CC, 0x00000A25, 0x00000A25, 0x0005002C, 0x00000011, 0x00000218,\n    0x0000044A, 0x0000044A, 0x0005002C, 0x00000011, 0x00000203, 0x00000447,\n    0x00000447, 0x0005002C, 0x00000011, 0x000008A5, 0x00000A44, 0x00000A44,\n    0x0005002C, 0x00000011, 0x0000078D, 0x00000A1C, 0x00000A1C, 0x0005002C,\n    0x00000011, 0x0000074E, 0x00000A13, 0x00000A13, 0x0005002C, 0x00000011,\n    0x00000373, 0x000003D6, 0x000003D6, 0x00050036, 0x00000008, 0x0000161F,\n    0x00000000, 0x00000502, 0x000200F8, 0x00003B06, 0x000300F7, 0x00004C7A,\n    0x00000000, 0x000300FB, 0x00000A0A, 0x00002E68, 0x000200F8, 0x00002E68,\n    0x00050041, 0x00000288, 0x000060D7, 0x00000CE9, 0x00000A0B, 0x0004003D,\n    0x0000000B, 0x00003526, 0x000060D7, 0x000500C7, 0x0000000B, 0x00005FDC,\n    0x00003526, 0x00000A0D, 0x000500AB, 0x00000009, 0x00004376, 0x00005FDC,\n    0x00000A0A, 0x000500C7, 0x0000000B, 0x00003028, 0x00003526, 0x00000A10,\n    0x000500AB, 0x00000009, 0x00004384, 0x00003028, 0x00000A0A, 0x000500C2,\n    0x0000000B, 0x00001EB0, 0x00003526, 0x00000A10, 0x000500C7, 0x0000000B,\n    0x000061E2, 0x00001EB0, 0x00000A13, 0x00050041, 0x00000288, 0x0000492C,\n    0x00000CE9, 0x00000A0E, 0x0004003D, 0x0000000B, 0x00005EAC, 0x0000492C,\n    0x00050041, 0x00000288, 0x00004EBA, 0x00000CE9, 0x00000A11, 0x0004003D,\n    0x0000000B, 0x00005788, 0x00004EBA, 0x00050041, 0x00000288, 0x00004EBB,\n    0x00000CE9, 0x00000A14, 0x0004003D, 0x0000000B, 0x00005789, 0x00004EBB,\n    0x00050041, 0x00000291, 0x00004EBC, 0x00000CE9, 0x00000A17, 0x0004003D,\n    0x00000014, 0x0000578A, 0x00004EBC, 0x00050041, 0x00000288, 0x00004EBD,\n    0x00000CE9, 0x00000A1A, 0x0004003D, 0x0000000B, 0x0000578B, 0x00004EBD,\n    0x00050041, 0x00000288, 0x00004E6E, 0x00000CE9, 0x00000A1D, 0x0004003D,\n    0x0000000B, 0x000019C2, 0x00004E6E, 0x0004003D, 0x00000014, 0x00002A0E,\n    0x00000F48, 0x000500C4, 0x00000014, 0x0000538B, 0x00002A0E, 0x00000A2D,\n    0x0007004F, 0x00000011, 0x000042F0, 0x0000538B, 0x0000538B, 0x00000000,\n    0x00000001, 0x0007004F, 0x00000011, 0x0000242F, 0x0000578A, 0x0000578A,\n    0x00000000, 0x00000001, 0x000500AE, 0x0000000F, 0x00004288, 0x000042F0,\n    0x0000242F, 0x0004009A, 0x00000009, 0x00006067, 0x00004288, 0x000300F7,\n    0x000019BA, 0x00000002, 0x000400FA, 0x00006067, 0x000055E8, 0x000019BA,\n    0x000200F8, 0x000055E8, 0x000200F9, 0x00004C7A, 0x000200F8, 0x000019BA,\n    0x0004007C, 0x00000016, 0x00005BB6, 0x0000538B, 0x00050051, 0x0000000B,\n    0x00004916, 0x0000578A, 0x00000001, 0x00050051, 0x0000000C, 0x00005BEB,\n    0x00005BB6, 0x00000000, 0x00050084, 0x0000000C, 0x0000591A, 0x00005BEB,\n    0x00000A23, 0x00050051, 0x0000000C, 0x000018DA, 0x00005BB6, 0x00000002,\n    0x0004007C, 0x0000000C, 0x000038A9, 0x00004916, 0x00050084, 0x0000000C,\n    0x00002C0F, 0x000018DA, 0x000038A9, 0x00050051, 0x0000000C, 0x000044BE,\n    0x00005BB6, 0x00000001, 0x00050080, 0x0000000C, 0x000056D4, 0x00002C0F,\n    0x000044BE, 0x0004007C, 0x0000000C, 0x00005785, 0x000019C2, 0x00050084,\n    0x0000000C, 0x00005FD7, 0x000056D4, 0x00005785, 0x00050080, 0x0000000C,\n    0x00002042, 0x0000591A, 0x00005FD7, 0x0004007C, 0x0000000B, 0x000028A4,\n    0x00002042, 0x00050080, 0x0000000B, 0x000038F6, 0x0000578B, 0x000028A4,\n    0x000400A8, 0x00000009, 0x00003014, 0x00004376, 0x000300F7, 0x00004A60,\n    0x00000002, 0x000400FA, 0x00003014, 0x0000260D, 0x0000426F, 0x000200F8,\n    0x0000260D, 0x00050051, 0x0000000B, 0x00004437, 0x0000538B, 0x00000000,\n    0x00050051, 0x0000000B, 0x00002BEE, 0x0000538B, 0x00000001, 0x00050051,\n    0x0000000B, 0x00004971, 0x0000538B, 0x00000002, 0x00050084, 0x0000000B,\n    0x000039EF, 0x00005789, 0x00004971, 0x00050080, 0x0000000B, 0x00004F62,\n    0x00002BEE, 0x000039EF, 0x00050084, 0x0000000B, 0x000054AC, 0x00005788,\n    0x00004F62, 0x00050080, 0x0000000B, 0x00004FAE, 0x00004437, 0x000054AC,\n    0x000500C4, 0x0000000B, 0x00002C67, 0x00004FAE, 0x00000A10, 0x000200F9,\n    0x00004A60, 0x000200F8, 0x0000426F, 0x000300F7, 0x00005BF0, 0x00000002,\n    0x000400FA, 0x00004384, 0x00002C92, 0x00005F21, 0x000200F8, 0x00002C92,\n    0x000500C2, 0x0000000B, 0x00005374, 0x00005788, 0x00000A1A, 0x000500C2,\n    0x0000000B, 0x000035EC, 0x00005789, 0x00000A17, 0x000500C3, 0x0000000C,\n    0x000033B5, 0x000018DA, 0x00000A11, 0x0004007C, 0x0000000C, 0x00005766,\n    0x000035EC, 0x00050084, 0x0000000C, 0x000061FD, 0x000033B5, 0x00005766,\n    0x000500C3, 0x0000000C, 0x00002D62, 0x000044BE, 0x00000A17, 0x00050080,\n    0x0000000C, 0x0000411E, 0x000061FD, 0x00002D62, 0x0004007C, 0x0000000C,\n    0x00004A78, 0x00005374, 0x00050084, 0x0000000C, 0x000032DC, 0x0000411E,\n    0x00004A78, 0x000500C3, 0x0000000C, 0x000032BA, 0x00005BEB, 0x00000A1A,\n    0x00050080, 0x0000000C, 0x00005FEE, 0x000032DC, 0x000032BA, 0x000500C4,\n    0x0000000C, 0x0000225D, 0x00005FEE, 0x00000A20, 0x000500C7, 0x0000000C,\n    0x00002CAA, 0x000018DA, 0x00000A14, 0x000500C4, 0x0000000C, 0x00004CAE,\n    0x00002CAA, 0x00000A1A, 0x000500C3, 0x0000000C, 0x0000383E, 0x000044BE,\n    0x00000A0E, 0x000500C7, 0x0000000C, 0x00005375, 0x0000383E, 0x00000A14,\n    0x000500C4, 0x0000000C, 0x000054CA, 0x00005375, 0x00000A14, 0x000500C5,\n    0x0000000C, 0x000042CE, 0x00004CAE, 0x000054CA, 0x000500C7, 0x0000000C,\n    0x000050D5, 0x00005BEB, 0x00000A20, 0x000500C5, 0x0000000C, 0x00003ADD,\n    0x000042CE, 0x000050D5, 0x000500C5, 0x0000000C, 0x000043B6, 0x0000225D,\n    0x00003ADD, 0x000500C4, 0x0000000C, 0x00005E50, 0x000043B6, 0x00000A10,\n    0x000500C3, 0x0000000C, 0x000032D7, 0x000044BE, 0x00000A14, 0x000500C6,\n    0x0000000C, 0x000026C9, 0x000032D7, 0x000033B5, 0x000500C7, 0x0000000C,\n    0x00004199, 0x000026C9, 0x00000A0E, 0x000500C3, 0x0000000C, 0x00002590,\n    0x00005BEB, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000505E, 0x00002590,\n    0x00000A14, 0x000500C4, 0x0000000C, 0x0000541D, 0x00004199, 0x00000A0E,\n    0x000500C6, 0x0000000C, 0x000022BA, 0x0000505E, 0x0000541D, 0x000500C7,\n    0x0000000C, 0x00005076, 0x000044BE, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x00005228, 0x00005076, 0x00000A17, 0x000500C4, 0x0000000C, 0x00001997,\n    0x000022BA, 0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FE, 0x00005228,\n    0x00001997, 0x000500C4, 0x0000000C, 0x00001C00, 0x00004199, 0x00000A2C,\n    0x000500C5, 0x0000000C, 0x00003C81, 0x000047FE, 0x00001C00, 0x000500C7,\n    0x0000000C, 0x000050AF, 0x00005E50, 0x00000A38, 0x000500C5, 0x0000000C,\n    0x00003C70, 0x00003C81, 0x000050AF, 0x000500C3, 0x0000000C, 0x00003745,\n    0x00005E50, 0x00000A17, 0x000500C7, 0x0000000C, 0x000018B8, 0x00003745,\n    0x00000A0E, 0x000500C4, 0x0000000C, 0x0000547E, 0x000018B8, 0x00000A1A,\n    0x000500C5, 0x0000000C, 0x000045A8, 0x00003C70, 0x0000547E, 0x000500C3,\n    0x0000000C, 0x00003A6E, 0x00005E50, 0x00000A1A, 0x000500C7, 0x0000000C,\n    0x000018B9, 0x00003A6E, 0x00000A20, 0x000500C4, 0x0000000C, 0x0000547F,\n    0x000018B9, 0x00000A23, 0x000500C5, 0x0000000C, 0x0000456F, 0x000045A8,\n    0x0000547F, 0x000500C3, 0x0000000C, 0x00003C88, 0x00005E50, 0x00000A23,\n    0x000500C4, 0x0000000C, 0x00002824, 0x00003C88, 0x00000A2F, 0x000500C5,\n    0x0000000C, 0x00003B79, 0x0000456F, 0x00002824, 0x0004007C, 0x0000000B,\n    0x000041E5, 0x00003B79, 0x000200F9, 0x00005BF0, 0x000200F8, 0x00005F21,\n    0x0004007C, 0x00000012, 0x000059D8, 0x000042F0, 0x000500C2, 0x0000000B,\n    0x00005668, 0x00005788, 0x00000A1A, 0x00050051, 0x0000000C, 0x00003905,\n    0x000059D8, 0x00000001, 0x000500C3, 0x0000000C, 0x00002F39, 0x00003905,\n    0x00000A1A, 0x0004007C, 0x0000000C, 0x00005780, 0x00005668, 0x00050084,\n    0x0000000C, 0x00001F02, 0x00002F39, 0x00005780, 0x00050051, 0x0000000C,\n    0x00006242, 0x000059D8, 0x00000000, 0x000500C3, 0x0000000C, 0x00004FC7,\n    0x00006242, 0x00000A1A, 0x00050080, 0x0000000C, 0x000049B0, 0x00001F02,\n    0x00004FC7, 0x000500C4, 0x0000000C, 0x0000254A, 0x000049B0, 0x00000A1D,\n    0x000500C3, 0x0000000C, 0x0000603B, 0x00003905, 0x00000A0E, 0x000500C7,\n    0x0000000C, 0x0000539A, 0x0000603B, 0x00000A20, 0x000500C4, 0x0000000C,\n    0x0000534A, 0x0000539A, 0x00000A14, 0x000500C7, 0x0000000C, 0x00004EA5,\n    0x00006242, 0x00000A20, 0x000500C5, 0x0000000C, 0x00002B1A, 0x0000534A,\n    0x00004EA5, 0x000500C5, 0x0000000C, 0x000043B7, 0x0000254A, 0x00002B1A,\n    0x000500C4, 0x0000000C, 0x00005E63, 0x000043B7, 0x00000A10, 0x000500C3,\n    0x0000000C, 0x000031DE, 0x00003905, 0x00000A17, 0x000500C7, 0x0000000C,\n    0x00005447, 0x000031DE, 0x00000A0E, 0x000500C3, 0x0000000C, 0x000028A6,\n    0x00006242, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000511E, 0x000028A6,\n    0x00000A14, 0x000500C3, 0x0000000C, 0x000028B9, 0x00003905, 0x00000A14,\n    0x000500C7, 0x0000000C, 0x0000505F, 0x000028B9, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x0000541E, 0x0000505F, 0x00000A0E, 0x000500C6, 0x0000000C,\n    0x000022BB, 0x0000511E, 0x0000541E, 0x000500C7, 0x0000000C, 0x00005077,\n    0x00003905, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005229, 0x00005077,\n    0x00000A17, 0x000500C4, 0x0000000C, 0x00001998, 0x000022BB, 0x00000A1D,\n    0x000500C5, 0x0000000C, 0x000047FF, 0x00005229, 0x00001998, 0x000500C4,\n    0x0000000C, 0x00001C01, 0x00005447, 0x00000A2C, 0x000500C5, 0x0000000C,\n    0x00003C82, 0x000047FF, 0x00001C01, 0x000500C7, 0x0000000C, 0x000050B0,\n    0x00005E63, 0x00000A38, 0x000500C5, 0x0000000C, 0x00003C71, 0x00003C82,\n    0x000050B0, 0x000500C3, 0x0000000C, 0x00003746, 0x00005E63, 0x00000A17,\n    0x000500C7, 0x0000000C, 0x000018BA, 0x00003746, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x00005480, 0x000018BA, 0x00000A1A, 0x000500C5, 0x0000000C,\n    0x000045A9, 0x00003C71, 0x00005480, 0x000500C3, 0x0000000C, 0x00003A6F,\n    0x00005E63, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018BB, 0x00003A6F,\n    0x00000A20, 0x000500C4, 0x0000000C, 0x00005481, 0x000018BB, 0x00000A23,\n    0x000500C5, 0x0000000C, 0x00004570, 0x000045A9, 0x00005481, 0x000500C3,\n    0x0000000C, 0x00003C89, 0x00005E63, 0x00000A23, 0x000500C4, 0x0000000C,\n    0x00002825, 0x00003C89, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B7A,\n    0x00004570, 0x00002825, 0x0004007C, 0x0000000B, 0x000041E6, 0x00003B7A,\n    0x000200F9, 0x00005BF0, 0x000200F8, 0x00005BF0, 0x000700F5, 0x0000000B,\n    0x0000292C, 0x000041E5, 0x00002C92, 0x000041E6, 0x00005F21, 0x000200F9,\n    0x00004A60, 0x000200F8, 0x00004A60, 0x000700F5, 0x0000000B, 0x00002C70,\n    0x00002C67, 0x0000260D, 0x0000292C, 0x00005BF0, 0x00050080, 0x0000000B,\n    0x000048BD, 0x00002C70, 0x00005EAC, 0x000500C2, 0x0000000B, 0x00003D52,\n    0x000048BD, 0x00000A17, 0x00060041, 0x00000294, 0x00004FAF, 0x0000107A,\n    0x00000A0B, 0x00003D52, 0x0004003D, 0x00000017, 0x00001CAA, 0x00004FAF,\n    0x000500AA, 0x00000009, 0x000035C0, 0x000061E2, 0x00000A0D, 0x000500AA,\n    0x00000009, 0x00005376, 0x000061E2, 0x00000A10, 0x000500A6, 0x00000009,\n    0x00005686, 0x000035C0, 0x00005376, 0x000300F7, 0x00003463, 0x00000000,\n    0x000400FA, 0x00005686, 0x00002957, 0x00003463, 0x000200F8, 0x00002957,\n    0x000500C7, 0x00000017, 0x0000475F, 0x00001CAA, 0x000009CE, 0x000500C4,\n    0x00000017, 0x000024D1, 0x0000475F, 0x0000013D, 0x000500C7, 0x00000017,\n    0x000050AC, 0x00001CAA, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448D,\n    0x000050AC, 0x0000013D, 0x000500C5, 0x00000017, 0x00003FF8, 0x000024D1,\n    0x0000448D, 0x000200F9, 0x00003463, 0x000200F8, 0x00003463, 0x000700F5,\n    0x00000017, 0x00005879, 0x00001CAA, 0x00004A60, 0x00003FF8, 0x00002957,\n    0x000500AA, 0x00000009, 0x00004CB6, 0x000061E2, 0x00000A13, 0x000500A6,\n    0x00000009, 0x00003B23, 0x00005376, 0x00004CB6, 0x000300F7, 0x00002DA2,\n    0x00000000, 0x000400FA, 0x00003B23, 0x00002B38, 0x00002DA2, 0x000200F8,\n    0x00002B38, 0x000500C4, 0x00000017, 0x00005E17, 0x00005879, 0x000002ED,\n    0x000500C2, 0x00000017, 0x00003BE7, 0x00005879, 0x000002ED, 0x000500C5,\n    0x00000017, 0x000029E8, 0x00005E17, 0x00003BE7, 0x000200F9, 0x00002DA2,\n    0x000200F8, 0x00002DA2, 0x000700F5, 0x00000017, 0x00004DEC, 0x00005879,\n    0x00003463, 0x000029E8, 0x00002B38, 0x0007004F, 0x00000011, 0x000052B5,\n    0x00004DEC, 0x00004DEC, 0x00000000, 0x00000001, 0x000500C7, 0x00000011,\n    0x00002FAE, 0x000052B5, 0x00000A50, 0x000500C2, 0x00000011, 0x00001AF2,\n    0x00002FAE, 0x000007E1, 0x000500AB, 0x0000000F, 0x000031A4, 0x00001AF2,\n    0x0000070F, 0x000500AA, 0x0000000F, 0x00004EAC, 0x00002FAE, 0x000008BA,\n    0x000600A9, 0x00000011, 0x00001DE7, 0x00004EAC, 0x000008CF, 0x00002FAE,\n    0x000600A9, 0x00000011, 0x00005A0A, 0x000031A4, 0x00000A50, 0x0000070F,\n    0x000500C6, 0x00000011, 0x00005C78, 0x00001DE7, 0x00005A0A, 0x00050080,\n    0x00000011, 0x00005FB4, 0x00005C78, 0x00001AF2, 0x000500C4, 0x00000011,\n    0x000022A8, 0x00005FB4, 0x00000778, 0x000500C2, 0x00000011, 0x00003516,\n    0x00005FB4, 0x00000778, 0x000500C5, 0x00000011, 0x00005C42, 0x000022A8,\n    0x00003516, 0x000600A9, 0x00000011, 0x00003C67, 0x000031A4, 0x000007DF,\n    0x0000070F, 0x000500C6, 0x00000011, 0x00001E5E, 0x00005C42, 0x00003C67,\n    0x00050080, 0x00000011, 0x0000616D, 0x00001E5E, 0x00001AF2, 0x000500C2,\n    0x00000011, 0x00005F10, 0x000052B5, 0x000007F6, 0x000500C7, 0x00000011,\n    0x00002E2E, 0x00005F10, 0x00000A50, 0x000500C2, 0x00000011, 0x000018AF,\n    0x00002E2E, 0x000007E1, 0x000500AB, 0x0000000F, 0x000031A5, 0x000018AF,\n    0x0000070F, 0x000500AA, 0x0000000F, 0x00004EAD, 0x00002E2E, 0x000008BA,\n    0x000600A9, 0x00000011, 0x00001DE8, 0x00004EAD, 0x000008CF, 0x00002E2E,\n    0x000600A9, 0x00000011, 0x00005A0B, 0x000031A5, 0x00000A50, 0x0000070F,\n    0x000500C6, 0x00000011, 0x00005C79, 0x00001DE8, 0x00005A0B, 0x00050080,\n    0x00000011, 0x00005FB5, 0x00005C79, 0x000018AF, 0x000500C4, 0x00000011,\n    0x000022A9, 0x00005FB5, 0x00000778, 0x000500C2, 0x00000011, 0x00003517,\n    0x00005FB5, 0x00000778, 0x000500C5, 0x00000011, 0x00005C43, 0x000022A9,\n    0x00003517, 0x000600A9, 0x00000011, 0x00003C68, 0x000031A5, 0x000007DF,\n    0x0000070F, 0x000500C6, 0x00000011, 0x00001E84, 0x00005C43, 0x00003C68,\n    0x00050080, 0x00000011, 0x00005FED, 0x00001E84, 0x000018AF, 0x000500C4,\n    0x00000011, 0x00002068, 0x00005FED, 0x0000085F, 0x000500C5, 0x00000011,\n    0x00002374, 0x0000616D, 0x00002068, 0x000500C2, 0x00000011, 0x00005BF5,\n    0x000052B5, 0x000008DD, 0x000500C2, 0x00000011, 0x0000339C, 0x00005BF5,\n    0x000007CC, 0x000500AB, 0x0000000F, 0x00002E80, 0x0000339C, 0x0000070F,\n    0x000500AA, 0x0000000F, 0x00004EAE, 0x00005BF5, 0x00000203, 0x000600A9,\n    0x00000011, 0x00001DE9, 0x00004EAE, 0x00000218, 0x00005BF5, 0x000600A9,\n    0x00000011, 0x00005A0C, 0x00002E80, 0x000008A5, 0x0000070F, 0x000500C6,\n    0x00000011, 0x00005C7A, 0x00001DE9, 0x00005A0C, 0x00050080, 0x00000011,\n    0x00005FB6, 0x00005C7A, 0x0000339C, 0x000500C4, 0x00000011, 0x000022AA,\n    0x00005FB6, 0x0000078D, 0x000500C2, 0x00000011, 0x00003518, 0x00005FB6,\n    0x0000074E, 0x000500C5, 0x00000011, 0x00005C44, 0x000022AA, 0x00003518,\n    0x000600A9, 0x00000011, 0x00003C69, 0x00002E80, 0x000007DF, 0x0000070F,\n    0x000500C6, 0x00000011, 0x00001E97, 0x00005C44, 0x00003C69, 0x00050080,\n    0x00000011, 0x000056A4, 0x00001E97, 0x0000339C, 0x000500C5, 0x00000011,\n    0x00004668, 0x000056A4, 0x00000373, 0x00050051, 0x0000000B, 0x000028D5,\n    0x00002374, 0x00000000, 0x00050051, 0x0000000B, 0x00005CB2, 0x00002374,\n    0x00000001, 0x00050051, 0x0000000B, 0x00001DD9, 0x00004668, 0x00000000,\n    0x00050051, 0x0000000B, 0x00001E73, 0x00004668, 0x00000001, 0x00070050,\n    0x00000017, 0x00003F21, 0x000028D5, 0x00005CB2, 0x00001DD9, 0x00001E73,\n    0x0009004F, 0x00000017, 0x00001E85, 0x00003F21, 0x00003F21, 0x00000000,\n    0x00000002, 0x00000001, 0x00000003, 0x0007004F, 0x00000011, 0x000021FB,\n    0x00004DEC, 0x00004DEC, 0x00000002, 0x00000003, 0x000500C7, 0x00000011,\n    0x00001BFF, 0x000021FB, 0x00000A50, 0x000500C2, 0x00000011, 0x00001AF3,\n    0x00001BFF, 0x000007E1, 0x000500AB, 0x0000000F, 0x000031A6, 0x00001AF3,\n    0x0000070F, 0x000500AA, 0x0000000F, 0x00004EAF, 0x00001BFF, 0x000008BA,\n    0x000600A9, 0x00000011, 0x00001DEA, 0x00004EAF, 0x000008CF, 0x00001BFF,\n    0x000600A9, 0x00000011, 0x00005A0D, 0x000031A6, 0x00000A50, 0x0000070F,\n    0x000500C6, 0x00000011, 0x00005C7B, 0x00001DEA, 0x00005A0D, 0x00050080,\n    0x00000011, 0x00005FB7, 0x00005C7B, 0x00001AF3, 0x000500C4, 0x00000011,\n    0x000022AB, 0x00005FB7, 0x00000778, 0x000500C2, 0x00000011, 0x00003519,\n    0x00005FB7, 0x00000778, 0x000500C5, 0x00000011, 0x00005C45, 0x000022AB,\n    0x00003519, 0x000600A9, 0x00000011, 0x00003C6A, 0x000031A6, 0x000007DF,\n    0x0000070F, 0x000500C6, 0x00000011, 0x00001E5F, 0x00005C45, 0x00003C6A,\n    0x00050080, 0x00000011, 0x0000616E, 0x00001E5F, 0x00001AF3, 0x000500C2,\n    0x00000011, 0x00005F11, 0x000021FB, 0x000007F6, 0x000500C7, 0x00000011,\n    0x00002E2F, 0x00005F11, 0x00000A50, 0x000500C2, 0x00000011, 0x000018B0,\n    0x00002E2F, 0x000007E1, 0x000500AB, 0x0000000F, 0x000031A7, 0x000018B0,\n    0x0000070F, 0x000500AA, 0x0000000F, 0x00004EB0, 0x00002E2F, 0x000008BA,\n    0x000600A9, 0x00000011, 0x00001DEB, 0x00004EB0, 0x000008CF, 0x00002E2F,\n    0x000600A9, 0x00000011, 0x00005A0E, 0x000031A7, 0x00000A50, 0x0000070F,\n    0x000500C6, 0x00000011, 0x00005C7C, 0x00001DEB, 0x00005A0E, 0x00050080,\n    0x00000011, 0x00005FB8, 0x00005C7C, 0x000018B0, 0x000500C4, 0x00000011,\n    0x000022AC, 0x00005FB8, 0x00000778, 0x000500C2, 0x00000011, 0x0000351A,\n    0x00005FB8, 0x00000778, 0x000500C5, 0x00000011, 0x00005C46, 0x000022AC,\n    0x0000351A, 0x000600A9, 0x00000011, 0x00003C6B, 0x000031A7, 0x000007DF,\n    0x0000070F, 0x000500C6, 0x00000011, 0x00001E86, 0x00005C46, 0x00003C6B,\n    0x00050080, 0x00000011, 0x00005FEF, 0x00001E86, 0x000018B0, 0x000500C4,\n    0x00000011, 0x00002069, 0x00005FEF, 0x0000085F, 0x000500C5, 0x00000011,\n    0x00002375, 0x0000616E, 0x00002069, 0x000500C2, 0x00000011, 0x00005BF6,\n    0x000021FB, 0x000008DD, 0x000500C2, 0x00000011, 0x0000339D, 0x00005BF6,\n    0x000007CC, 0x000500AB, 0x0000000F, 0x00002E81, 0x0000339D, 0x0000070F,\n    0x000500AA, 0x0000000F, 0x00004EB1, 0x00005BF6, 0x00000203, 0x000600A9,\n    0x00000011, 0x00001DEC, 0x00004EB1, 0x00000218, 0x00005BF6, 0x000600A9,\n    0x00000011, 0x00005A0F, 0x00002E81, 0x000008A5, 0x0000070F, 0x000500C6,\n    0x00000011, 0x00005C7D, 0x00001DEC, 0x00005A0F, 0x00050080, 0x00000011,\n    0x00005FB9, 0x00005C7D, 0x0000339D, 0x000500C4, 0x00000011, 0x000022AD,\n    0x00005FB9, 0x0000078D, 0x000500C2, 0x00000011, 0x0000351B, 0x00005FB9,\n    0x0000074E, 0x000500C5, 0x00000011, 0x00005C47, 0x000022AD, 0x0000351B,\n    0x000600A9, 0x00000011, 0x00003C6C, 0x00002E81, 0x000007DF, 0x0000070F,\n    0x000500C6, 0x00000011, 0x00001E98, 0x00005C47, 0x00003C6C, 0x00050080,\n    0x00000011, 0x000056A5, 0x00001E98, 0x0000339D, 0x000500C5, 0x00000011,\n    0x00004669, 0x000056A5, 0x00000373, 0x00050051, 0x0000000B, 0x000028D6,\n    0x00002375, 0x00000000, 0x00050051, 0x0000000B, 0x00005CB3, 0x00002375,\n    0x00000001, 0x00050051, 0x0000000B, 0x00001DDA, 0x00004669, 0x00000000,\n    0x00050051, 0x0000000B, 0x00001E74, 0x00004669, 0x00000001, 0x00070050,\n    0x00000017, 0x000047AA, 0x000028D6, 0x00005CB3, 0x00001DDA, 0x00001E74,\n    0x0009004F, 0x00000017, 0x00005BD9, 0x000047AA, 0x000047AA, 0x00000000,\n    0x00000002, 0x00000001, 0x00000003, 0x000500C2, 0x0000000B, 0x00003B60,\n    0x000038F6, 0x00000A17, 0x00060041, 0x00000294, 0x00002306, 0x0000140E,\n    0x00000A0B, 0x00003B60, 0x0003003E, 0x00002306, 0x00001E85, 0x00050080,\n    0x0000000B, 0x0000204C, 0x000038F6, 0x00000A3A, 0x000500C2, 0x0000000B,\n    0x000019FD, 0x0000204C, 0x00000A17, 0x00060041, 0x00000294, 0x000054B9,\n    0x0000140E, 0x00000A0B, 0x000019FD, 0x0003003E, 0x000054B9, 0x00005BD9,\n    0x000300F7, 0x00006070, 0x00000002, 0x000400FA, 0x00004376, 0x000055E9,\n    0x00001C25, 0x000200F8, 0x000055E9, 0x000200F9, 0x00006070, 0x000200F8,\n    0x00001C25, 0x000200F9, 0x00006070, 0x000200F8, 0x00006070, 0x000700F5,\n    0x0000000B, 0x00002C71, 0x00000A6A, 0x000055E9, 0x00000A3A, 0x00001C25,\n    0x00050080, 0x0000000B, 0x000048BE, 0x000048BD, 0x00002C71, 0x000500C2,\n    0x0000000B, 0x00003D53, 0x000048BE, 0x00000A17, 0x00060041, 0x00000294,\n    0x00005566, 0x0000107A, 0x00000A0B, 0x00003D53, 0x0004003D, 0x00000017,\n    0x00003910, 0x00005566, 0x000300F7, 0x00003A1A, 0x00000000, 0x000400FA,\n    0x00005686, 0x00002958, 0x00003A1A, 0x000200F8, 0x00002958, 0x000500C7,\n    0x00000017, 0x00004760, 0x00003910, 0x000009CE, 0x000500C4, 0x00000017,\n    0x000024D2, 0x00004760, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AD,\n    0x00003910, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448E, 0x000050AD,\n    0x0000013D, 0x000500C5, 0x00000017, 0x00003FF9, 0x000024D2, 0x0000448E,\n    0x000200F9, 0x00003A1A, 0x000200F8, 0x00003A1A, 0x000700F5, 0x00000017,\n    0x00002AAC, 0x00003910, 0x00006070, 0x00003FF9, 0x00002958, 0x000300F7,\n    0x00002DA3, 0x00000000, 0x000400FA, 0x00003B23, 0x00002B39, 0x00002DA3,\n    0x000200F8, 0x00002B39, 0x000500C4, 0x00000017, 0x00005E18, 0x00002AAC,\n    0x000002ED, 0x000500C2, 0x00000017, 0x00003BE8, 0x00002AAC, 0x000002ED,\n    0x000500C5, 0x00000017, 0x000029E9, 0x00005E18, 0x00003BE8, 0x000200F9,\n    0x00002DA3, 0x000200F8, 0x00002DA3, 0x000700F5, 0x00000017, 0x00004DED,\n    0x00002AAC, 0x00003A1A, 0x000029E9, 0x00002B39, 0x0007004F, 0x00000011,\n    0x000052B6, 0x00004DED, 0x00004DED, 0x00000000, 0x00000001, 0x000500C7,\n    0x00000011, 0x00002FAF, 0x000052B6, 0x00000A50, 0x000500C2, 0x00000011,\n    0x00001AF4, 0x00002FAF, 0x000007E1, 0x000500AB, 0x0000000F, 0x000031A8,\n    0x00001AF4, 0x0000070F, 0x000500AA, 0x0000000F, 0x00004EB2, 0x00002FAF,\n    0x000008BA, 0x000600A9, 0x00000011, 0x00001DED, 0x00004EB2, 0x000008CF,\n    0x00002FAF, 0x000600A9, 0x00000011, 0x00005A10, 0x000031A8, 0x00000A50,\n    0x0000070F, 0x000500C6, 0x00000011, 0x00005C7E, 0x00001DED, 0x00005A10,\n    0x00050080, 0x00000011, 0x00005FBA, 0x00005C7E, 0x00001AF4, 0x000500C4,\n    0x00000011, 0x000022AE, 0x00005FBA, 0x00000778, 0x000500C2, 0x00000011,\n    0x0000351C, 0x00005FBA, 0x00000778, 0x000500C5, 0x00000011, 0x00005C48,\n    0x000022AE, 0x0000351C, 0x000600A9, 0x00000011, 0x00003C6D, 0x000031A8,\n    0x000007DF, 0x0000070F, 0x000500C6, 0x00000011, 0x00001E60, 0x00005C48,\n    0x00003C6D, 0x00050080, 0x00000011, 0x0000616F, 0x00001E60, 0x00001AF4,\n    0x000500C2, 0x00000011, 0x00005F12, 0x000052B6, 0x000007F6, 0x000500C7,\n    0x00000011, 0x00002E30, 0x00005F12, 0x00000A50, 0x000500C2, 0x00000011,\n    0x000018B1, 0x00002E30, 0x000007E1, 0x000500AB, 0x0000000F, 0x000031A9,\n    0x000018B1, 0x0000070F, 0x000500AA, 0x0000000F, 0x00004EB3, 0x00002E30,\n    0x000008BA, 0x000600A9, 0x00000011, 0x00001DEE, 0x00004EB3, 0x000008CF,\n    0x00002E30, 0x000600A9, 0x00000011, 0x00005A11, 0x000031A9, 0x00000A50,\n    0x0000070F, 0x000500C6, 0x00000011, 0x00005C7F, 0x00001DEE, 0x00005A11,\n    0x00050080, 0x00000011, 0x00005FBB, 0x00005C7F, 0x000018B1, 0x000500C4,\n    0x00000011, 0x000022AF, 0x00005FBB, 0x00000778, 0x000500C2, 0x00000011,\n    0x0000351D, 0x00005FBB, 0x00000778, 0x000500C5, 0x00000011, 0x00005C49,\n    0x000022AF, 0x0000351D, 0x000600A9, 0x00000011, 0x00003C6E, 0x000031A9,\n    0x000007DF, 0x0000070F, 0x000500C6, 0x00000011, 0x00001E87, 0x00005C49,\n    0x00003C6E, 0x00050080, 0x00000011, 0x00005FF0, 0x00001E87, 0x000018B1,\n    0x000500C4, 0x00000011, 0x0000206A, 0x00005FF0, 0x0000085F, 0x000500C5,\n    0x00000011, 0x00002376, 0x0000616F, 0x0000206A, 0x000500C2, 0x00000011,\n    0x00005BF7, 0x000052B6, 0x000008DD, 0x000500C2, 0x00000011, 0x0000339E,\n    0x00005BF7, 0x000007CC, 0x000500AB, 0x0000000F, 0x00002E82, 0x0000339E,\n    0x0000070F, 0x000500AA, 0x0000000F, 0x00004EB4, 0x00005BF7, 0x00000203,\n    0x000600A9, 0x00000011, 0x00001DEF, 0x00004EB4, 0x00000218, 0x00005BF7,\n    0x000600A9, 0x00000011, 0x00005A12, 0x00002E82, 0x000008A5, 0x0000070F,\n    0x000500C6, 0x00000011, 0x00005C80, 0x00001DEF, 0x00005A12, 0x00050080,\n    0x00000011, 0x00005FBC, 0x00005C80, 0x0000339E, 0x000500C4, 0x00000011,\n    0x000022B0, 0x00005FBC, 0x0000078D, 0x000500C2, 0x00000011, 0x0000351E,\n    0x00005FBC, 0x0000074E, 0x000500C5, 0x00000011, 0x00005C4A, 0x000022B0,\n    0x0000351E, 0x000600A9, 0x00000011, 0x00003C6F, 0x00002E82, 0x000007DF,\n    0x0000070F, 0x000500C6, 0x00000011, 0x00001E99, 0x00005C4A, 0x00003C6F,\n    0x00050080, 0x00000011, 0x000056A6, 0x00001E99, 0x0000339E, 0x000500C5,\n    0x00000011, 0x0000466A, 0x000056A6, 0x00000373, 0x00050051, 0x0000000B,\n    0x000028D7, 0x00002376, 0x00000000, 0x00050051, 0x0000000B, 0x00005CB4,\n    0x00002376, 0x00000001, 0x00050051, 0x0000000B, 0x00001DDB, 0x0000466A,\n    0x00000000, 0x00050051, 0x0000000B, 0x00001E75, 0x0000466A, 0x00000001,\n    0x00070050, 0x00000017, 0x00003F22, 0x000028D7, 0x00005CB4, 0x00001DDB,\n    0x00001E75, 0x0009004F, 0x00000017, 0x00001E88, 0x00003F22, 0x00003F22,\n    0x00000000, 0x00000002, 0x00000001, 0x00000003, 0x0007004F, 0x00000011,\n    0x000021FC, 0x00004DED, 0x00004DED, 0x00000002, 0x00000003, 0x000500C7,\n    0x00000011, 0x00001C02, 0x000021FC, 0x00000A50, 0x000500C2, 0x00000011,\n    0x00001AF5, 0x00001C02, 0x000007E1, 0x000500AB, 0x0000000F, 0x000031AA,\n    0x00001AF5, 0x0000070F, 0x000500AA, 0x0000000F, 0x00004EB5, 0x00001C02,\n    0x000008BA, 0x000600A9, 0x00000011, 0x00001DF0, 0x00004EB5, 0x000008CF,\n    0x00001C02, 0x000600A9, 0x00000011, 0x00005A13, 0x000031AA, 0x00000A50,\n    0x0000070F, 0x000500C6, 0x00000011, 0x00005C81, 0x00001DF0, 0x00005A13,\n    0x00050080, 0x00000011, 0x00005FBD, 0x00005C81, 0x00001AF5, 0x000500C4,\n    0x00000011, 0x000022B1, 0x00005FBD, 0x00000778, 0x000500C2, 0x00000011,\n    0x0000351F, 0x00005FBD, 0x00000778, 0x000500C5, 0x00000011, 0x00005C4B,\n    0x000022B1, 0x0000351F, 0x000600A9, 0x00000011, 0x00003C72, 0x000031AA,\n    0x000007DF, 0x0000070F, 0x000500C6, 0x00000011, 0x00001E61, 0x00005C4B,\n    0x00003C72, 0x00050080, 0x00000011, 0x00006170, 0x00001E61, 0x00001AF5,\n    0x000500C2, 0x00000011, 0x00005F13, 0x000021FC, 0x000007F6, 0x000500C7,\n    0x00000011, 0x00002E31, 0x00005F13, 0x00000A50, 0x000500C2, 0x00000011,\n    0x000018B2, 0x00002E31, 0x000007E1, 0x000500AB, 0x0000000F, 0x000031AB,\n    0x000018B2, 0x0000070F, 0x000500AA, 0x0000000F, 0x00004EB6, 0x00002E31,\n    0x000008BA, 0x000600A9, 0x00000011, 0x00001DF1, 0x00004EB6, 0x000008CF,\n    0x00002E31, 0x000600A9, 0x00000011, 0x00005A14, 0x000031AB, 0x00000A50,\n    0x0000070F, 0x000500C6, 0x00000011, 0x00005C82, 0x00001DF1, 0x00005A14,\n    0x00050080, 0x00000011, 0x00005FBE, 0x00005C82, 0x000018B2, 0x000500C4,\n    0x00000011, 0x000022B2, 0x00005FBE, 0x00000778, 0x000500C2, 0x00000011,\n    0x00003520, 0x00005FBE, 0x00000778, 0x000500C5, 0x00000011, 0x00005C4C,\n    0x000022B2, 0x00003520, 0x000600A9, 0x00000011, 0x00003C73, 0x000031AB,\n    0x000007DF, 0x0000070F, 0x000500C6, 0x00000011, 0x00001E89, 0x00005C4C,\n    0x00003C73, 0x00050080, 0x00000011, 0x00005FF1, 0x00001E89, 0x000018B2,\n    0x000500C4, 0x00000011, 0x0000206B, 0x00005FF1, 0x0000085F, 0x000500C5,\n    0x00000011, 0x00002377, 0x00006170, 0x0000206B, 0x000500C2, 0x00000011,\n    0x00005BF8, 0x000021FC, 0x000008DD, 0x000500C2, 0x00000011, 0x0000339F,\n    0x00005BF8, 0x000007CC, 0x000500AB, 0x0000000F, 0x00002E83, 0x0000339F,\n    0x0000070F, 0x000500AA, 0x0000000F, 0x00004EB7, 0x00005BF8, 0x00000203,\n    0x000600A9, 0x00000011, 0x00001DF2, 0x00004EB7, 0x00000218, 0x00005BF8,\n    0x000600A9, 0x00000011, 0x00005A15, 0x00002E83, 0x000008A5, 0x0000070F,\n    0x000500C6, 0x00000011, 0x00005C83, 0x00001DF2, 0x00005A15, 0x00050080,\n    0x00000011, 0x00005FBF, 0x00005C83, 0x0000339F, 0x000500C4, 0x00000011,\n    0x000022B3, 0x00005FBF, 0x0000078D, 0x000500C2, 0x00000011, 0x00003521,\n    0x00005FBF, 0x0000074E, 0x000500C5, 0x00000011, 0x00005C4D, 0x000022B3,\n    0x00003521, 0x000600A9, 0x00000011, 0x00003C74, 0x00002E83, 0x000007DF,\n    0x0000070F, 0x000500C6, 0x00000011, 0x00001E9A, 0x00005C4D, 0x00003C74,\n    0x00050080, 0x00000011, 0x000056A7, 0x00001E9A, 0x0000339F, 0x000500C5,\n    0x00000011, 0x0000466B, 0x000056A7, 0x00000373, 0x00050051, 0x0000000B,\n    0x000028D8, 0x00002377, 0x00000000, 0x00050051, 0x0000000B, 0x00005CB5,\n    0x00002377, 0x00000001, 0x00050051, 0x0000000B, 0x00001DDC, 0x0000466B,\n    0x00000000, 0x00050051, 0x0000000B, 0x00001E76, 0x0000466B, 0x00000001,\n    0x00070050, 0x00000017, 0x000042C4, 0x000028D8, 0x00005CB5, 0x00001DDC,\n    0x00001E76, 0x0009004F, 0x00000017, 0x00004787, 0x000042C4, 0x000042C4,\n    0x00000000, 0x00000002, 0x00000001, 0x00000003, 0x00050080, 0x0000000B,\n    0x00004949, 0x000038F6, 0x00000A6A, 0x000500C2, 0x0000000B, 0x000029B6,\n    0x00004949, 0x00000A17, 0x00060041, 0x00000294, 0x00004BE4, 0x0000140E,\n    0x00000A0B, 0x000029B6, 0x0003003E, 0x00004BE4, 0x00001E88, 0x00050080,\n    0x0000000B, 0x0000204D, 0x000038F6, 0x00000A9A, 0x000500C2, 0x0000000B,\n    0x000019FE, 0x0000204D, 0x00000A17, 0x00060041, 0x00000294, 0x000054DF,\n    0x0000140E, 0x00000A0B, 0x000019FE, 0x0003003E, 0x000054DF, 0x00004787,\n    0x000200F9, 0x00004C7A, 0x000200F8, 0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_r11g11b10_rgba16_snorm_scaled_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25157\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n     %v4uint = OpTypeVector %uint 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v3uint = OpTypeVector %uint 3\n     %uint_9 = OpConstant %uint 9\n     %v2bool = OpTypeVector %bool 2\n     %uint_0 = OpConstant %uint 0\n   %uint_513 = OpConstant %uint 513\n   %uint_512 = OpConstant %uint 512\n  %uint_1023 = OpConstant %uint 1023\n     %uint_6 = OpConstant %uint 6\n     %uint_3 = OpConstant %uint 3\n %uint_65535 = OpConstant %uint 65535\n    %uint_10 = OpConstant %uint 10\n  %uint_1025 = OpConstant %uint 1025\n  %uint_1024 = OpConstant %uint 1024\n  %uint_2047 = OpConstant %uint 2047\n     %uint_5 = OpConstant %uint 5\n    %uint_11 = OpConstant %uint 11\n    %uint_16 = OpConstant %uint 16\n    %uint_22 = OpConstant %uint 22\n%uint_2147418112 = OpConstant %uint 2147418112\n     %uint_1 = OpConstant %uint 1\n     %uint_2 = OpConstant %uint 2\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n      %int_3 = OpConstant %int 3\n      %int_2 = OpConstant %int 2\n     %uint_4 = OpConstant %uint 4\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n     %uint_7 = OpConstant %uint 7\n       %1927 = OpConstantComposite %v2uint %uint_4 %uint_7\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %2605 = OpConstantComposite %v3uint %uint_3 %uint_0 %uint_0\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n    %uint_32 = OpConstant %uint 32\n    %uint_48 = OpConstant %uint 48\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %1954 = OpConstantComposite %v2uint %uint_7 %uint_7\n       %1855 = OpConstantComposite %v2uint %uint_4 %uint_1\n    %uint_15 = OpConstant %uint 15\n       %1955 = OpConstantComposite %v2uint %uint_15 %uint_1\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n       %2640 = OpConstantComposite %v2uint %uint_2047 %uint_2047\n       %2017 = OpConstantComposite %v2uint %uint_10 %uint_10\n       %1807 = OpConstantComposite %v2uint %uint_0 %uint_0\n       %2255 = OpConstantComposite %v2uint %uint_1025 %uint_1025\n       %2234 = OpConstantComposite %v2uint %uint_1024 %uint_1024\n       %1912 = OpConstantComposite %v2uint %uint_5 %uint_5\n       %2015 = OpConstantComposite %v2uint %uint_65535 %uint_65535\n       %2038 = OpConstantComposite %v2uint %uint_11 %uint_11\n       %2143 = OpConstantComposite %v2uint %uint_16 %uint_16\n       %2269 = OpConstantComposite %v2uint %uint_22 %uint_22\n       %1996 = OpConstantComposite %v2uint %uint_9 %uint_9\n        %536 = OpConstantComposite %v2uint %uint_513 %uint_513\n        %515 = OpConstantComposite %v2uint %uint_512 %uint_512\n       %2213 = OpConstantComposite %v2uint %uint_1023 %uint_1023\n       %1933 = OpConstantComposite %v2uint %uint_6 %uint_6\n       %1870 = OpConstantComposite %v2uint %uint_3 %uint_3\n        %883 = OpConstantComposite %v2uint %uint_2147418112 %uint_2147418112\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24445 = OpBitwiseAnd %uint %13606 %uint_2\n      %18667 = OpINotEqual %bool %24445 %uint_0\n       %8141 = OpShiftRightLogical %uint %13606 %uint_2\n      %24990 = OpBitwiseAnd %uint %8141 %uint_3\n       %8871 = OpCompositeConstruct %v2uint %13606 %13606\n       %7087 = OpShiftRightLogical %v2uint %8871 %1927\n       %6551 = OpBitwiseAnd %v2uint %7087 %1954\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2605\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %6586 DontFlatten\n               OpBranchConditional %24679 %21992 %6586\n      %21992 = OpLabel\n               OpBranch %19578\n       %6586 = OpLabel\n      %23478 = OpBitcast %v3int %21387\n      %18710 = OpCompositeExtract %uint %22410 1\n      %23531 = OpCompositeExtract %int %23478 0\n      %22810 = OpIMul %int %23531 %int_8\n       %6362 = OpCompositeExtract %int %23478 2\n      %14505 = OpBitcast %int %18710\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %23478 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %6594\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %22810 %24535\n      %10898 = OpBitcast %uint %8258\n       %7937 = OpIAdd %uint %22411 %10898\n      %19921 = OpShiftRightLogical %v2uint %17136 %1855\n       %7712 = OpUDiv %v2uint %19921 %6551\n      %18183 = OpIMul %v2uint %6551 %7712\n      %18273 = OpISub %v2uint %19921 %18183\n      %11232 = OpShiftLeftLogical %v2uint %7712 %1855\n      %13284 = OpCompositeExtract %uint %18273 0\n      %10872 = OpCompositeExtract %uint %6551 1\n      %22886 = OpIMul %uint %13284 %10872\n       %6943 = OpCompositeExtract %uint %18273 1\n      %10469 = OpIAdd %uint %22886 %6943\n      %18851 = OpBitwiseAnd %v2uint %17136 %1955\n      %10581 = OpShiftLeftLogical %uint %10469 %uint_7\n      %20916 = OpCompositeExtract %uint %18851 1\n      %23596 = OpShiftLeftLogical %uint %20916 %uint_6\n      %19814 = OpBitwiseOr %uint %10581 %23596\n      %21476 = OpCompositeExtract %uint %18851 0\n       %8560 = OpShiftLeftLogical %uint %21476 %uint_2\n      %17648 = OpBitwiseOr %uint %19814 %8560\n      %19923 = OpCompositeExtract %uint %11232 0\n      %15556 = OpCompositeInsert %v3uint %19923 %21387 0\n      %23006 = OpCompositeExtract %uint %11232 1\n       %9680 = OpCompositeInsert %v3uint %23006 %15556 1\n               OpSelectionMerge %20344 DontFlatten\n               OpBranchConditional %18667 %23520 %11737\n      %23520 = OpLabel\n      %10111 = OpBitcast %v3int %9680\n      %19476 = OpShiftRightLogical %uint %22408 %int_5\n      %18810 = OpShiftRightLogical %uint %22409 %int_4\n       %6782 = OpCompositeExtract %int %10111 2\n      %12089 = OpShiftRightArithmetic %int %6782 %int_2\n      %22400 = OpBitcast %int %18810\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %10111 1\n      %19055 = OpShiftRightArithmetic %int %25154 %int_4\n      %11052 = OpIAdd %int %7938 %19055\n      %16898 = OpBitcast %int %19476\n      %14944 = OpIMul %int %11052 %16898\n      %25155 = OpCompositeExtract %int %10111 0\n      %20423 = OpShiftRightArithmetic %int %25155 %int_5\n      %18940 = OpIAdd %int %14944 %20423\n       %8797 = OpShiftLeftLogical %int %18940 %int_7\n      %11434 = OpBitwiseAnd %int %6782 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %25154 %int_1\n      %21364 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21364 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %25155 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17334 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17334 %uint_2\n      %13015 = OpShiftRightArithmetic %int %25154 %int_3\n       %9929 = OpBitwiseXor %int %13015 %12089\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %25155 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %25154 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6552 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6552\n       %7168 = OpShiftLeftLogical %int %16793 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24144 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24144 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24144 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24144 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %20344\n      %11737 = OpLabel\n      %11908 = OpVectorShuffle %v2uint %9680 %9680 0 1\n      %20347 = OpBitcast %v2int %11908\n      %11433 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %20347 1\n      %12090 = OpShiftRightArithmetic %int %14597 %int_5\n      %22401 = OpBitcast %int %11433\n       %7939 = OpIMul %int %12090 %22401\n      %25156 = OpCompositeExtract %int %20347 0\n      %20424 = OpShiftRightArithmetic %int %25156 %int_5\n      %18864 = OpIAdd %int %7939 %20424\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25156 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17335 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17335 %uint_2\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25156 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6553 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6553\n       %7169 = OpShiftLeftLogical %int %21575 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24163 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24163 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24163 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %20344\n      %20344 = OpLabel\n      %18329 = OpPhi %uint %16869 %23520 %16870 %11737\n      %15200 = OpCompositeExtract %uint %6551 0\n      %17489 = OpIMul %uint %15200 %10872\n       %7313 = OpIMul %uint %18329 %17489\n       %8815 = OpIAdd %uint %7313 %17648\n      %21470 = OpIAdd %uint %8815 %24236\n      %14664 = OpShiftRightLogical %uint %21470 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %14664\n       %7338 = OpLoad %v4uint %20399\n      %13760 = OpIEqual %bool %24990 %uint_1\n      %21366 = OpIEqual %bool %24990 %uint_2\n      %22150 = OpLogicalOr %bool %13760 %21366\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %7338 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %7338 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22649 = OpPhi %v4uint %7338 %20344 %16376 %10583\n      %19638 = OpIEqual %bool %24990 %uint_3\n      %15139 = OpLogicalOr %bool %21366 %19638\n               OpSelectionMerge %11682 None\n               OpBranchConditional %15139 %11064 %11682\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22649 %749\n      %15335 = OpShiftRightLogical %v4uint %22649 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %11682\n      %11682 = OpLabel\n      %19948 = OpPhi %v4uint %22649 %13411 %10728 %11064\n      %21173 = OpVectorShuffle %v2uint %19948 %19948 0 1\n      %12206 = OpBitwiseAnd %v2uint %21173 %2640\n       %6898 = OpShiftRightLogical %v2uint %12206 %2017\n      %12708 = OpINotEqual %v2bool %6898 %1807\n      %20140 = OpIEqual %v2bool %12206 %2234\n       %7655 = OpSelect %v2uint %20140 %2255 %12206\n      %23050 = OpSelect %v2uint %12708 %2640 %1807\n      %23672 = OpBitwiseXor %v2uint %7655 %23050\n      %24500 = OpIAdd %v2uint %23672 %6898\n       %8872 = OpShiftLeftLogical %v2uint %24500 %1912\n      %13590 = OpShiftRightLogical %v2uint %24500 %1912\n      %23618 = OpBitwiseOr %v2uint %8872 %13590\n      %15463 = OpSelect %v2uint %12708 %2015 %1807\n       %7774 = OpBitwiseXor %v2uint %23618 %15463\n      %24941 = OpIAdd %v2uint %7774 %6898\n      %24336 = OpShiftRightLogical %v2uint %21173 %2038\n      %11822 = OpBitwiseAnd %v2uint %24336 %2640\n       %6319 = OpShiftRightLogical %v2uint %11822 %2017\n      %12709 = OpINotEqual %v2bool %6319 %1807\n      %20141 = OpIEqual %v2bool %11822 %2234\n       %7656 = OpSelect %v2uint %20141 %2255 %11822\n      %23051 = OpSelect %v2uint %12709 %2640 %1807\n      %23673 = OpBitwiseXor %v2uint %7656 %23051\n      %24501 = OpIAdd %v2uint %23673 %6319\n       %8873 = OpShiftLeftLogical %v2uint %24501 %1912\n      %13591 = OpShiftRightLogical %v2uint %24501 %1912\n      %23619 = OpBitwiseOr %v2uint %8873 %13591\n      %15464 = OpSelect %v2uint %12709 %2015 %1807\n       %7812 = OpBitwiseXor %v2uint %23619 %15464\n      %24557 = OpIAdd %v2uint %7812 %6319\n       %8296 = OpShiftLeftLogical %v2uint %24557 %2143\n       %9076 = OpBitwiseOr %v2uint %24941 %8296\n      %23541 = OpShiftRightLogical %v2uint %21173 %2269\n      %13212 = OpShiftRightLogical %v2uint %23541 %1996\n      %11904 = OpINotEqual %v2bool %13212 %1807\n      %20142 = OpIEqual %v2bool %23541 %515\n       %7657 = OpSelect %v2uint %20142 %536 %23541\n      %23052 = OpSelect %v2uint %11904 %2213 %1807\n      %23674 = OpBitwiseXor %v2uint %7657 %23052\n      %24502 = OpIAdd %v2uint %23674 %13212\n       %8874 = OpShiftLeftLogical %v2uint %24502 %1933\n      %13592 = OpShiftRightLogical %v2uint %24502 %1870\n      %23620 = OpBitwiseOr %v2uint %8874 %13592\n      %15465 = OpSelect %v2uint %11904 %2015 %1807\n       %7831 = OpBitwiseXor %v2uint %23620 %15465\n      %22180 = OpIAdd %v2uint %7831 %13212\n      %18024 = OpBitwiseOr %v2uint %22180 %883\n      %10453 = OpCompositeExtract %uint %9076 0\n      %23730 = OpCompositeExtract %uint %9076 1\n       %7641 = OpCompositeExtract %uint %18024 0\n       %7795 = OpCompositeExtract %uint %18024 1\n      %16161 = OpCompositeConstruct %v4uint %10453 %23730 %7641 %7795\n       %7813 = OpVectorShuffle %v4uint %16161 %16161 0 2 1 3\n       %8699 = OpVectorShuffle %v2uint %19948 %19948 2 3\n       %7167 = OpBitwiseAnd %v2uint %8699 %2640\n       %6899 = OpShiftRightLogical %v2uint %7167 %2017\n      %12710 = OpINotEqual %v2bool %6899 %1807\n      %20143 = OpIEqual %v2bool %7167 %2234\n       %7658 = OpSelect %v2uint %20143 %2255 %7167\n      %23053 = OpSelect %v2uint %12710 %2640 %1807\n      %23675 = OpBitwiseXor %v2uint %7658 %23053\n      %24503 = OpIAdd %v2uint %23675 %6899\n       %8875 = OpShiftLeftLogical %v2uint %24503 %1912\n      %13593 = OpShiftRightLogical %v2uint %24503 %1912\n      %23621 = OpBitwiseOr %v2uint %8875 %13593\n      %15466 = OpSelect %v2uint %12710 %2015 %1807\n       %7775 = OpBitwiseXor %v2uint %23621 %15466\n      %24942 = OpIAdd %v2uint %7775 %6899\n      %24337 = OpShiftRightLogical %v2uint %8699 %2038\n      %11823 = OpBitwiseAnd %v2uint %24337 %2640\n       %6320 = OpShiftRightLogical %v2uint %11823 %2017\n      %12711 = OpINotEqual %v2bool %6320 %1807\n      %20144 = OpIEqual %v2bool %11823 %2234\n       %7659 = OpSelect %v2uint %20144 %2255 %11823\n      %23054 = OpSelect %v2uint %12711 %2640 %1807\n      %23676 = OpBitwiseXor %v2uint %7659 %23054\n      %24504 = OpIAdd %v2uint %23676 %6320\n       %8876 = OpShiftLeftLogical %v2uint %24504 %1912\n      %13594 = OpShiftRightLogical %v2uint %24504 %1912\n      %23622 = OpBitwiseOr %v2uint %8876 %13594\n      %15467 = OpSelect %v2uint %12711 %2015 %1807\n       %7814 = OpBitwiseXor %v2uint %23622 %15467\n      %24558 = OpIAdd %v2uint %7814 %6320\n       %8297 = OpShiftLeftLogical %v2uint %24558 %2143\n       %9077 = OpBitwiseOr %v2uint %24942 %8297\n      %23542 = OpShiftRightLogical %v2uint %8699 %2269\n      %13213 = OpShiftRightLogical %v2uint %23542 %1996\n      %11905 = OpINotEqual %v2bool %13213 %1807\n      %20145 = OpIEqual %v2bool %23542 %515\n       %7660 = OpSelect %v2uint %20145 %536 %23542\n      %23055 = OpSelect %v2uint %11905 %2213 %1807\n      %23677 = OpBitwiseXor %v2uint %7660 %23055\n      %24505 = OpIAdd %v2uint %23677 %13213\n       %8877 = OpShiftLeftLogical %v2uint %24505 %1933\n      %13595 = OpShiftRightLogical %v2uint %24505 %1870\n      %23623 = OpBitwiseOr %v2uint %8877 %13595\n      %15468 = OpSelect %v2uint %11905 %2015 %1807\n       %7832 = OpBitwiseXor %v2uint %23623 %15468\n      %22181 = OpIAdd %v2uint %7832 %13213\n      %18025 = OpBitwiseOr %v2uint %22181 %883\n      %10454 = OpCompositeExtract %uint %9077 0\n      %23731 = OpCompositeExtract %uint %9077 1\n       %7642 = OpCompositeExtract %uint %18025 0\n       %7796 = OpCompositeExtract %uint %18025 1\n      %18346 = OpCompositeConstruct %v4uint %10454 %23731 %7642 %7796\n      %23513 = OpVectorShuffle %v4uint %18346 %18346 0 2 1 3\n      %15201 = OpShiftRightLogical %uint %7937 %int_4\n       %8966 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %15201\n               OpStore %8966 %7813\n       %8268 = OpIAdd %uint %7937 %uint_16\n       %6653 = OpShiftRightLogical %uint %8268 %int_4\n      %19428 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %6653\n               OpStore %19428 %23513\n       %8269 = OpIAdd %uint %21470 %uint_16\n       %6634 = OpShiftRightLogical %uint %8269 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %6634\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %14874 None\n               OpBranchConditional %22150 %10584 %14874\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %14874\n      %14874 = OpLabel\n      %10924 = OpPhi %v4uint %14608 %11682 %16377 %10584\n               OpSelectionMerge %11683 None\n               OpBranchConditional %15139 %11065 %11683\n      %11065 = OpLabel\n      %24088 = OpShiftLeftLogical %v4uint %10924 %749\n      %15336 = OpShiftRightLogical %v4uint %10924 %749\n      %10729 = OpBitwiseOr %v4uint %24088 %15336\n               OpBranch %11683\n      %11683 = OpLabel\n      %19949 = OpPhi %v4uint %10924 %14874 %10729 %11065\n      %21174 = OpVectorShuffle %v2uint %19949 %19949 0 1\n      %12207 = OpBitwiseAnd %v2uint %21174 %2640\n       %6900 = OpShiftRightLogical %v2uint %12207 %2017\n      %12712 = OpINotEqual %v2bool %6900 %1807\n      %20146 = OpIEqual %v2bool %12207 %2234\n       %7661 = OpSelect %v2uint %20146 %2255 %12207\n      %23056 = OpSelect %v2uint %12712 %2640 %1807\n      %23678 = OpBitwiseXor %v2uint %7661 %23056\n      %24506 = OpIAdd %v2uint %23678 %6900\n       %8878 = OpShiftLeftLogical %v2uint %24506 %1912\n      %13596 = OpShiftRightLogical %v2uint %24506 %1912\n      %23624 = OpBitwiseOr %v2uint %8878 %13596\n      %15469 = OpSelect %v2uint %12712 %2015 %1807\n       %7776 = OpBitwiseXor %v2uint %23624 %15469\n      %24943 = OpIAdd %v2uint %7776 %6900\n      %24338 = OpShiftRightLogical %v2uint %21174 %2038\n      %11824 = OpBitwiseAnd %v2uint %24338 %2640\n       %6321 = OpShiftRightLogical %v2uint %11824 %2017\n      %12713 = OpINotEqual %v2bool %6321 %1807\n      %20147 = OpIEqual %v2bool %11824 %2234\n       %7662 = OpSelect %v2uint %20147 %2255 %11824\n      %23057 = OpSelect %v2uint %12713 %2640 %1807\n      %23679 = OpBitwiseXor %v2uint %7662 %23057\n      %24507 = OpIAdd %v2uint %23679 %6321\n       %8879 = OpShiftLeftLogical %v2uint %24507 %1912\n      %13597 = OpShiftRightLogical %v2uint %24507 %1912\n      %23625 = OpBitwiseOr %v2uint %8879 %13597\n      %15470 = OpSelect %v2uint %12713 %2015 %1807\n       %7815 = OpBitwiseXor %v2uint %23625 %15470\n      %24559 = OpIAdd %v2uint %7815 %6321\n       %8298 = OpShiftLeftLogical %v2uint %24559 %2143\n       %9078 = OpBitwiseOr %v2uint %24943 %8298\n      %23543 = OpShiftRightLogical %v2uint %21174 %2269\n      %13214 = OpShiftRightLogical %v2uint %23543 %1996\n      %11906 = OpINotEqual %v2bool %13214 %1807\n      %20148 = OpIEqual %v2bool %23543 %515\n       %7663 = OpSelect %v2uint %20148 %536 %23543\n      %23058 = OpSelect %v2uint %11906 %2213 %1807\n      %23680 = OpBitwiseXor %v2uint %7663 %23058\n      %24508 = OpIAdd %v2uint %23680 %13214\n       %8880 = OpShiftLeftLogical %v2uint %24508 %1933\n      %13598 = OpShiftRightLogical %v2uint %24508 %1870\n      %23626 = OpBitwiseOr %v2uint %8880 %13598\n      %15471 = OpSelect %v2uint %11906 %2015 %1807\n       %7833 = OpBitwiseXor %v2uint %23626 %15471\n      %22182 = OpIAdd %v2uint %7833 %13214\n      %18026 = OpBitwiseOr %v2uint %22182 %883\n      %10455 = OpCompositeExtract %uint %9078 0\n      %23732 = OpCompositeExtract %uint %9078 1\n       %7643 = OpCompositeExtract %uint %18026 0\n       %7797 = OpCompositeExtract %uint %18026 1\n      %16162 = OpCompositeConstruct %v4uint %10455 %23732 %7643 %7797\n       %7816 = OpVectorShuffle %v4uint %16162 %16162 0 2 1 3\n       %8700 = OpVectorShuffle %v2uint %19949 %19949 2 3\n       %7170 = OpBitwiseAnd %v2uint %8700 %2640\n       %6901 = OpShiftRightLogical %v2uint %7170 %2017\n      %12714 = OpINotEqual %v2bool %6901 %1807\n      %20149 = OpIEqual %v2bool %7170 %2234\n       %7664 = OpSelect %v2uint %20149 %2255 %7170\n      %23059 = OpSelect %v2uint %12714 %2640 %1807\n      %23681 = OpBitwiseXor %v2uint %7664 %23059\n      %24509 = OpIAdd %v2uint %23681 %6901\n       %8881 = OpShiftLeftLogical %v2uint %24509 %1912\n      %13599 = OpShiftRightLogical %v2uint %24509 %1912\n      %23627 = OpBitwiseOr %v2uint %8881 %13599\n      %15474 = OpSelect %v2uint %12714 %2015 %1807\n       %7777 = OpBitwiseXor %v2uint %23627 %15474\n      %24944 = OpIAdd %v2uint %7777 %6901\n      %24339 = OpShiftRightLogical %v2uint %8700 %2038\n      %11825 = OpBitwiseAnd %v2uint %24339 %2640\n       %6322 = OpShiftRightLogical %v2uint %11825 %2017\n      %12715 = OpINotEqual %v2bool %6322 %1807\n      %20150 = OpIEqual %v2bool %11825 %2234\n       %7665 = OpSelect %v2uint %20150 %2255 %11825\n      %23060 = OpSelect %v2uint %12715 %2640 %1807\n      %23682 = OpBitwiseXor %v2uint %7665 %23060\n      %24510 = OpIAdd %v2uint %23682 %6322\n       %8882 = OpShiftLeftLogical %v2uint %24510 %1912\n      %13600 = OpShiftRightLogical %v2uint %24510 %1912\n      %23628 = OpBitwiseOr %v2uint %8882 %13600\n      %15475 = OpSelect %v2uint %12715 %2015 %1807\n       %7817 = OpBitwiseXor %v2uint %23628 %15475\n      %24560 = OpIAdd %v2uint %7817 %6322\n       %8299 = OpShiftLeftLogical %v2uint %24560 %2143\n       %9079 = OpBitwiseOr %v2uint %24944 %8299\n      %23544 = OpShiftRightLogical %v2uint %8700 %2269\n      %13215 = OpShiftRightLogical %v2uint %23544 %1996\n      %11907 = OpINotEqual %v2bool %13215 %1807\n      %20151 = OpIEqual %v2bool %23544 %515\n       %7666 = OpSelect %v2uint %20151 %536 %23544\n      %23061 = OpSelect %v2uint %11907 %2213 %1807\n      %23683 = OpBitwiseXor %v2uint %7666 %23061\n      %24511 = OpIAdd %v2uint %23683 %13215\n       %8883 = OpShiftLeftLogical %v2uint %24511 %1933\n      %13601 = OpShiftRightLogical %v2uint %24511 %1870\n      %23629 = OpBitwiseOr %v2uint %8883 %13601\n      %15476 = OpSelect %v2uint %11907 %2015 %1807\n       %7834 = OpBitwiseXor %v2uint %23629 %15476\n      %22183 = OpIAdd %v2uint %7834 %13215\n      %18027 = OpBitwiseOr %v2uint %22183 %883\n      %10456 = OpCompositeExtract %uint %9079 0\n      %23733 = OpCompositeExtract %uint %9079 1\n       %7644 = OpCompositeExtract %uint %18027 0\n       %7798 = OpCompositeExtract %uint %18027 1\n      %17092 = OpCompositeConstruct %v4uint %10456 %23733 %7644 %7798\n      %18311 = OpVectorShuffle %v4uint %17092 %17092 0 2 1 3\n      %18761 = OpIAdd %uint %7937 %uint_32\n      %10678 = OpShiftRightLogical %uint %18761 %int_4\n      %19429 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %10678\n               OpStore %19429 %7816\n       %8270 = OpIAdd %uint %7937 %uint_48\n       %6654 = OpShiftRightLogical %uint %8270 %int_4\n      %21727 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %6654\n               OpStore %21727 %18311\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_r11g11b10_rgba16_snorm_scaled_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006245, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000017,\n    0x0000000B, 0x00000004, 0x00040015, 0x0000000C, 0x00000020, 0x00000001,\n    0x00040017, 0x00000012, 0x0000000C, 0x00000002, 0x00040017, 0x00000016,\n    0x0000000C, 0x00000003, 0x00020014, 0x00000009, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A25, 0x00000009,\n    0x00040017, 0x0000000F, 0x00000009, 0x00000002, 0x0004002B, 0x0000000B,\n    0x00000A0A, 0x00000000, 0x0004002B, 0x0000000B, 0x0000044A, 0x00000201,\n    0x0004002B, 0x0000000B, 0x00000447, 0x00000200, 0x0004002B, 0x0000000B,\n    0x00000A44, 0x000003FF, 0x0004002B, 0x0000000B, 0x00000A1C, 0x00000006,\n    0x0004002B, 0x0000000B, 0x00000A13, 0x00000003, 0x0004002B, 0x0000000B,\n    0x000001C1, 0x0000FFFF, 0x0004002B, 0x0000000B, 0x00000A28, 0x0000000A,\n    0x0004002B, 0x0000000B, 0x00000A4A, 0x00000401, 0x0004002B, 0x0000000B,\n    0x00000A47, 0x00000400, 0x0004002B, 0x0000000B, 0x00000A81, 0x000007FF,\n    0x0004002B, 0x0000000B, 0x00000A19, 0x00000005, 0x0004002B, 0x0000000B,\n    0x00000A2B, 0x0000000B, 0x0004002B, 0x0000000B, 0x00000A3A, 0x00000010,\n    0x0004002B, 0x0000000B, 0x00000A4C, 0x00000016, 0x0004002B, 0x0000000B,\n    0x000003D6, 0x7FFF0000, 0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001,\n    0x0004002B, 0x0000000B, 0x00000A10, 0x00000002, 0x0004002B, 0x0000000B,\n    0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B, 0x00000A22, 0x00000008,\n    0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00, 0x0004002B, 0x0000000C,\n    0x00000A17, 0x00000004, 0x0004002B, 0x0000000C, 0x00000A1D, 0x00000006,\n    0x0004002B, 0x0000000C, 0x00000A2C, 0x0000000B, 0x0004002B, 0x0000000C,\n    0x00000A38, 0x0000000F, 0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001,\n    0x0004002B, 0x0000000C, 0x00000A1A, 0x00000005, 0x0004002B, 0x0000000C,\n    0x00000A20, 0x00000007, 0x0004002B, 0x0000000C, 0x00000A23, 0x00000008,\n    0x0004002B, 0x0000000C, 0x00000A2F, 0x0000000C, 0x0004002B, 0x0000000C,\n    0x00000A14, 0x00000003, 0x0004002B, 0x0000000C, 0x00000A11, 0x00000002,\n    0x0004002B, 0x0000000B, 0x00000A16, 0x00000004, 0x0004002B, 0x0000000C,\n    0x00000A0B, 0x00000000, 0x000A001E, 0x00000489, 0x0000000B, 0x0000000B,\n    0x0000000B, 0x0000000B, 0x00000014, 0x0000000B, 0x0000000B, 0x0000000B,\n    0x00040020, 0x00000706, 0x00000009, 0x00000489, 0x0004003B, 0x00000706,\n    0x00000CE9, 0x00000009, 0x00040020, 0x00000288, 0x00000009, 0x0000000B,\n    0x0004002B, 0x0000000B, 0x00000A1F, 0x00000007, 0x0005002C, 0x00000011,\n    0x00000787, 0x00000A16, 0x00000A1F, 0x00040020, 0x00000291, 0x00000009,\n    0x00000014, 0x00040020, 0x00000292, 0x00000001, 0x00000014, 0x0004003B,\n    0x00000292, 0x00000F48, 0x00000001, 0x0006002C, 0x00000014, 0x00000A2D,\n    0x00000A13, 0x00000A0A, 0x00000A0A, 0x0003001D, 0x000007DC, 0x00000017,\n    0x0003001E, 0x000007B4, 0x000007DC, 0x00040020, 0x00000A31, 0x00000002,\n    0x000007B4, 0x0004003B, 0x00000A31, 0x0000107A, 0x00000002, 0x00040020,\n    0x00000294, 0x00000002, 0x00000017, 0x0003001D, 0x000007DD, 0x00000017,\n    0x0003001E, 0x000007B5, 0x000007DD, 0x00040020, 0x00000A32, 0x00000002,\n    0x000007B5, 0x0004003B, 0x00000A32, 0x0000140E, 0x00000002, 0x0004002B,\n    0x0000000B, 0x00000A6A, 0x00000020, 0x0004002B, 0x0000000B, 0x00000A9A,\n    0x00000030, 0x0006002C, 0x00000014, 0x00000BC3, 0x00000A16, 0x00000A6A,\n    0x00000A0D, 0x0005002C, 0x00000011, 0x000007A2, 0x00000A1F, 0x00000A1F,\n    0x0005002C, 0x00000011, 0x0000073F, 0x00000A16, 0x00000A0D, 0x0004002B,\n    0x0000000B, 0x00000A37, 0x0000000F, 0x0005002C, 0x00000011, 0x000007A3,\n    0x00000A37, 0x00000A0D, 0x0007002C, 0x00000017, 0x000009CE, 0x000008A6,\n    0x000008A6, 0x000008A6, 0x000008A6, 0x0007002C, 0x00000017, 0x0000013D,\n    0x00000A22, 0x00000A22, 0x00000A22, 0x00000A22, 0x0007002C, 0x00000017,\n    0x0000072E, 0x000005FD, 0x000005FD, 0x000005FD, 0x000005FD, 0x0007002C,\n    0x00000017, 0x000002ED, 0x00000A3A, 0x00000A3A, 0x00000A3A, 0x00000A3A,\n    0x0005002C, 0x00000011, 0x00000A50, 0x00000A81, 0x00000A81, 0x0005002C,\n    0x00000011, 0x000007E1, 0x00000A28, 0x00000A28, 0x0005002C, 0x00000011,\n    0x0000070F, 0x00000A0A, 0x00000A0A, 0x0005002C, 0x00000011, 0x000008CF,\n    0x00000A4A, 0x00000A4A, 0x0005002C, 0x00000011, 0x000008BA, 0x00000A47,\n    0x00000A47, 0x0005002C, 0x00000011, 0x00000778, 0x00000A19, 0x00000A19,\n    0x0005002C, 0x00000011, 0x000007DF, 0x000001C1, 0x000001C1, 0x0005002C,\n    0x00000011, 0x000007F6, 0x00000A2B, 0x00000A2B, 0x0005002C, 0x00000011,\n    0x0000085F, 0x00000A3A, 0x00000A3A, 0x0005002C, 0x00000011, 0x000008DD,\n    0x00000A4C, 0x00000A4C, 0x0005002C, 0x00000011, 0x000007CC, 0x00000A25,\n    0x00000A25, 0x0005002C, 0x00000011, 0x00000218, 0x0000044A, 0x0000044A,\n    0x0005002C, 0x00000011, 0x00000203, 0x00000447, 0x00000447, 0x0005002C,\n    0x00000011, 0x000008A5, 0x00000A44, 0x00000A44, 0x0005002C, 0x00000011,\n    0x0000078D, 0x00000A1C, 0x00000A1C, 0x0005002C, 0x00000011, 0x0000074E,\n    0x00000A13, 0x00000A13, 0x0005002C, 0x00000011, 0x00000373, 0x000003D6,\n    0x000003D6, 0x00050036, 0x00000008, 0x0000161F, 0x00000000, 0x00000502,\n    0x000200F8, 0x00003B06, 0x000300F7, 0x00004C7A, 0x00000000, 0x000300FB,\n    0x00000A0A, 0x00002E68, 0x000200F8, 0x00002E68, 0x00050041, 0x00000288,\n    0x000060D7, 0x00000CE9, 0x00000A0B, 0x0004003D, 0x0000000B, 0x00003526,\n    0x000060D7, 0x000500C7, 0x0000000B, 0x00005F7D, 0x00003526, 0x00000A10,\n    0x000500AB, 0x00000009, 0x000048EB, 0x00005F7D, 0x00000A0A, 0x000500C2,\n    0x0000000B, 0x00001FCD, 0x00003526, 0x00000A10, 0x000500C7, 0x0000000B,\n    0x0000619E, 0x00001FCD, 0x00000A13, 0x00050050, 0x00000011, 0x000022A7,\n    0x00003526, 0x00003526, 0x000500C2, 0x00000011, 0x00001BAF, 0x000022A7,\n    0x00000787, 0x000500C7, 0x00000011, 0x00001997, 0x00001BAF, 0x000007A2,\n    0x00050041, 0x00000288, 0x0000492C, 0x00000CE9, 0x00000A0E, 0x0004003D,\n    0x0000000B, 0x00005EAC, 0x0000492C, 0x00050041, 0x00000288, 0x00004EBA,\n    0x00000CE9, 0x00000A11, 0x0004003D, 0x0000000B, 0x00005788, 0x00004EBA,\n    0x00050041, 0x00000288, 0x00004EBB, 0x00000CE9, 0x00000A14, 0x0004003D,\n    0x0000000B, 0x00005789, 0x00004EBB, 0x00050041, 0x00000291, 0x00004EBC,\n    0x00000CE9, 0x00000A17, 0x0004003D, 0x00000014, 0x0000578A, 0x00004EBC,\n    0x00050041, 0x00000288, 0x00004EBD, 0x00000CE9, 0x00000A1A, 0x0004003D,\n    0x0000000B, 0x0000578B, 0x00004EBD, 0x00050041, 0x00000288, 0x00004E6E,\n    0x00000CE9, 0x00000A1D, 0x0004003D, 0x0000000B, 0x000019C2, 0x00004E6E,\n    0x0004003D, 0x00000014, 0x00002A0E, 0x00000F48, 0x000500C4, 0x00000014,\n    0x0000538B, 0x00002A0E, 0x00000A2D, 0x0007004F, 0x00000011, 0x000042F0,\n    0x0000538B, 0x0000538B, 0x00000000, 0x00000001, 0x0007004F, 0x00000011,\n    0x0000242F, 0x0000578A, 0x0000578A, 0x00000000, 0x00000001, 0x000500AE,\n    0x0000000F, 0x00004288, 0x000042F0, 0x0000242F, 0x0004009A, 0x00000009,\n    0x00006067, 0x00004288, 0x000300F7, 0x000019BA, 0x00000002, 0x000400FA,\n    0x00006067, 0x000055E8, 0x000019BA, 0x000200F8, 0x000055E8, 0x000200F9,\n    0x00004C7A, 0x000200F8, 0x000019BA, 0x0004007C, 0x00000016, 0x00005BB6,\n    0x0000538B, 0x00050051, 0x0000000B, 0x00004916, 0x0000578A, 0x00000001,\n    0x00050051, 0x0000000C, 0x00005BEB, 0x00005BB6, 0x00000000, 0x00050084,\n    0x0000000C, 0x0000591A, 0x00005BEB, 0x00000A23, 0x00050051, 0x0000000C,\n    0x000018DA, 0x00005BB6, 0x00000002, 0x0004007C, 0x0000000C, 0x000038A9,\n    0x00004916, 0x00050084, 0x0000000C, 0x00002C0F, 0x000018DA, 0x000038A9,\n    0x00050051, 0x0000000C, 0x000044BE, 0x00005BB6, 0x00000001, 0x00050080,\n    0x0000000C, 0x000056D4, 0x00002C0F, 0x000044BE, 0x0004007C, 0x0000000C,\n    0x00005785, 0x000019C2, 0x00050084, 0x0000000C, 0x00005FD7, 0x000056D4,\n    0x00005785, 0x00050080, 0x0000000C, 0x00002042, 0x0000591A, 0x00005FD7,\n    0x0004007C, 0x0000000B, 0x00002A92, 0x00002042, 0x00050080, 0x0000000B,\n    0x00001F01, 0x0000578B, 0x00002A92, 0x000500C2, 0x00000011, 0x00004DD1,\n    0x000042F0, 0x0000073F, 0x00050086, 0x00000011, 0x00001E20, 0x00004DD1,\n    0x00001997, 0x00050084, 0x00000011, 0x00004707, 0x00001997, 0x00001E20,\n    0x00050082, 0x00000011, 0x00004761, 0x00004DD1, 0x00004707, 0x000500C4,\n    0x00000011, 0x00002BE0, 0x00001E20, 0x0000073F, 0x00050051, 0x0000000B,\n    0x000033E4, 0x00004761, 0x00000000, 0x00050051, 0x0000000B, 0x00002A78,\n    0x00001997, 0x00000001, 0x00050084, 0x0000000B, 0x00005966, 0x000033E4,\n    0x00002A78, 0x00050051, 0x0000000B, 0x00001B1F, 0x00004761, 0x00000001,\n    0x00050080, 0x0000000B, 0x000028E5, 0x00005966, 0x00001B1F, 0x000500C7,\n    0x00000011, 0x000049A3, 0x000042F0, 0x000007A3, 0x000500C4, 0x0000000B,\n    0x00002955, 0x000028E5, 0x00000A1F, 0x00050051, 0x0000000B, 0x000051B4,\n    0x000049A3, 0x00000001, 0x000500C4, 0x0000000B, 0x00005C2C, 0x000051B4,\n    0x00000A1C, 0x000500C5, 0x0000000B, 0x00004D66, 0x00002955, 0x00005C2C,\n    0x00050051, 0x0000000B, 0x000053E4, 0x000049A3, 0x00000000, 0x000500C4,\n    0x0000000B, 0x00002170, 0x000053E4, 0x00000A10, 0x000500C5, 0x0000000B,\n    0x000044F0, 0x00004D66, 0x00002170, 0x00050051, 0x0000000B, 0x00004DD3,\n    0x00002BE0, 0x00000000, 0x00060052, 0x00000014, 0x00003CC4, 0x00004DD3,\n    0x0000538B, 0x00000000, 0x00050051, 0x0000000B, 0x000059DE, 0x00002BE0,\n    0x00000001, 0x00060052, 0x00000014, 0x000025D0, 0x000059DE, 0x00003CC4,\n    0x00000001, 0x000300F7, 0x00004F78, 0x00000002, 0x000400FA, 0x000048EB,\n    0x00005BE0, 0x00002DD9, 0x000200F8, 0x00005BE0, 0x0004007C, 0x00000016,\n    0x0000277F, 0x000025D0, 0x000500C2, 0x0000000B, 0x00004C14, 0x00005788,\n    0x00000A1A, 0x000500C2, 0x0000000B, 0x0000497A, 0x00005789, 0x00000A17,\n    0x00050051, 0x0000000C, 0x00001A7E, 0x0000277F, 0x00000002, 0x000500C3,\n    0x0000000C, 0x00002F39, 0x00001A7E, 0x00000A11, 0x0004007C, 0x0000000C,\n    0x00005780, 0x0000497A, 0x00050084, 0x0000000C, 0x00001F02, 0x00002F39,\n    0x00005780, 0x00050051, 0x0000000C, 0x00006242, 0x0000277F, 0x00000001,\n    0x000500C3, 0x0000000C, 0x00004A6F, 0x00006242, 0x00000A17, 0x00050080,\n    0x0000000C, 0x00002B2C, 0x00001F02, 0x00004A6F, 0x0004007C, 0x0000000C,\n    0x00004202, 0x00004C14, 0x00050084, 0x0000000C, 0x00003A60, 0x00002B2C,\n    0x00004202, 0x00050051, 0x0000000C, 0x00006243, 0x0000277F, 0x00000000,\n    0x000500C3, 0x0000000C, 0x00004FC7, 0x00006243, 0x00000A1A, 0x00050080,\n    0x0000000C, 0x000049FC, 0x00003A60, 0x00004FC7, 0x000500C4, 0x0000000C,\n    0x0000225D, 0x000049FC, 0x00000A20, 0x000500C7, 0x0000000C, 0x00002CAA,\n    0x00001A7E, 0x00000A14, 0x000500C4, 0x0000000C, 0x00004CAE, 0x00002CAA,\n    0x00000A1A, 0x000500C3, 0x0000000C, 0x0000383E, 0x00006242, 0x00000A0E,\n    0x000500C7, 0x0000000C, 0x00005374, 0x0000383E, 0x00000A14, 0x000500C4,\n    0x0000000C, 0x000054CA, 0x00005374, 0x00000A14, 0x000500C5, 0x0000000C,\n    0x000042CE, 0x00004CAE, 0x000054CA, 0x000500C7, 0x0000000C, 0x000050D5,\n    0x00006243, 0x00000A20, 0x000500C5, 0x0000000C, 0x00003ADD, 0x000042CE,\n    0x000050D5, 0x000500C5, 0x0000000C, 0x000043B6, 0x0000225D, 0x00003ADD,\n    0x000500C4, 0x0000000C, 0x00005E50, 0x000043B6, 0x00000A10, 0x000500C3,\n    0x0000000C, 0x000032D7, 0x00006242, 0x00000A14, 0x000500C6, 0x0000000C,\n    0x000026C9, 0x000032D7, 0x00002F39, 0x000500C7, 0x0000000C, 0x00004199,\n    0x000026C9, 0x00000A0E, 0x000500C3, 0x0000000C, 0x00002590, 0x00006243,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x0000505E, 0x00002590, 0x00000A14,\n    0x000500C4, 0x0000000C, 0x0000541D, 0x00004199, 0x00000A0E, 0x000500C6,\n    0x0000000C, 0x000022BA, 0x0000505E, 0x0000541D, 0x000500C7, 0x0000000C,\n    0x00005076, 0x00006242, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005228,\n    0x00005076, 0x00000A17, 0x000500C4, 0x0000000C, 0x00001998, 0x000022BA,\n    0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FE, 0x00005228, 0x00001998,\n    0x000500C4, 0x0000000C, 0x00001C00, 0x00004199, 0x00000A2C, 0x000500C5,\n    0x0000000C, 0x00003C81, 0x000047FE, 0x00001C00, 0x000500C7, 0x0000000C,\n    0x000050AF, 0x00005E50, 0x00000A38, 0x000500C5, 0x0000000C, 0x00003C70,\n    0x00003C81, 0x000050AF, 0x000500C3, 0x0000000C, 0x00003745, 0x00005E50,\n    0x00000A17, 0x000500C7, 0x0000000C, 0x000018B8, 0x00003745, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x0000547E, 0x000018B8, 0x00000A1A, 0x000500C5,\n    0x0000000C, 0x000045A8, 0x00003C70, 0x0000547E, 0x000500C3, 0x0000000C,\n    0x00003A6E, 0x00005E50, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018B9,\n    0x00003A6E, 0x00000A20, 0x000500C4, 0x0000000C, 0x0000547F, 0x000018B9,\n    0x00000A23, 0x000500C5, 0x0000000C, 0x0000456F, 0x000045A8, 0x0000547F,\n    0x000500C3, 0x0000000C, 0x00003C88, 0x00005E50, 0x00000A23, 0x000500C4,\n    0x0000000C, 0x00002824, 0x00003C88, 0x00000A2F, 0x000500C5, 0x0000000C,\n    0x00003B79, 0x0000456F, 0x00002824, 0x0004007C, 0x0000000B, 0x000041E5,\n    0x00003B79, 0x000200F9, 0x00004F78, 0x000200F8, 0x00002DD9, 0x0007004F,\n    0x00000011, 0x00002E84, 0x000025D0, 0x000025D0, 0x00000000, 0x00000001,\n    0x0004007C, 0x00000012, 0x00004F7B, 0x00002E84, 0x000500C2, 0x0000000B,\n    0x00002CA9, 0x00005788, 0x00000A1A, 0x00050051, 0x0000000C, 0x00003905,\n    0x00004F7B, 0x00000001, 0x000500C3, 0x0000000C, 0x00002F3A, 0x00003905,\n    0x00000A1A, 0x0004007C, 0x0000000C, 0x00005781, 0x00002CA9, 0x00050084,\n    0x0000000C, 0x00001F03, 0x00002F3A, 0x00005781, 0x00050051, 0x0000000C,\n    0x00006244, 0x00004F7B, 0x00000000, 0x000500C3, 0x0000000C, 0x00004FC8,\n    0x00006244, 0x00000A1A, 0x00050080, 0x0000000C, 0x000049B0, 0x00001F03,\n    0x00004FC8, 0x000500C4, 0x0000000C, 0x0000254A, 0x000049B0, 0x00000A1D,\n    0x000500C3, 0x0000000C, 0x0000603B, 0x00003905, 0x00000A0E, 0x000500C7,\n    0x0000000C, 0x0000539A, 0x0000603B, 0x00000A20, 0x000500C4, 0x0000000C,\n    0x0000534A, 0x0000539A, 0x00000A14, 0x000500C7, 0x0000000C, 0x00004EA5,\n    0x00006244, 0x00000A20, 0x000500C5, 0x0000000C, 0x00002B1A, 0x0000534A,\n    0x00004EA5, 0x000500C5, 0x0000000C, 0x000043B7, 0x0000254A, 0x00002B1A,\n    0x000500C4, 0x0000000C, 0x00005E63, 0x000043B7, 0x00000A10, 0x000500C3,\n    0x0000000C, 0x000031DE, 0x00003905, 0x00000A17, 0x000500C7, 0x0000000C,\n    0x00005447, 0x000031DE, 0x00000A0E, 0x000500C3, 0x0000000C, 0x000028A6,\n    0x00006244, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000511E, 0x000028A6,\n    0x00000A14, 0x000500C3, 0x0000000C, 0x000028B9, 0x00003905, 0x00000A14,\n    0x000500C7, 0x0000000C, 0x0000505F, 0x000028B9, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x0000541E, 0x0000505F, 0x00000A0E, 0x000500C6, 0x0000000C,\n    0x000022BB, 0x0000511E, 0x0000541E, 0x000500C7, 0x0000000C, 0x00005077,\n    0x00003905, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005229, 0x00005077,\n    0x00000A17, 0x000500C4, 0x0000000C, 0x00001999, 0x000022BB, 0x00000A1D,\n    0x000500C5, 0x0000000C, 0x000047FF, 0x00005229, 0x00001999, 0x000500C4,\n    0x0000000C, 0x00001C01, 0x00005447, 0x00000A2C, 0x000500C5, 0x0000000C,\n    0x00003C82, 0x000047FF, 0x00001C01, 0x000500C7, 0x0000000C, 0x000050B0,\n    0x00005E63, 0x00000A38, 0x000500C5, 0x0000000C, 0x00003C71, 0x00003C82,\n    0x000050B0, 0x000500C3, 0x0000000C, 0x00003746, 0x00005E63, 0x00000A17,\n    0x000500C7, 0x0000000C, 0x000018BA, 0x00003746, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x00005480, 0x000018BA, 0x00000A1A, 0x000500C5, 0x0000000C,\n    0x000045A9, 0x00003C71, 0x00005480, 0x000500C3, 0x0000000C, 0x00003A6F,\n    0x00005E63, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018BB, 0x00003A6F,\n    0x00000A20, 0x000500C4, 0x0000000C, 0x00005481, 0x000018BB, 0x00000A23,\n    0x000500C5, 0x0000000C, 0x00004570, 0x000045A9, 0x00005481, 0x000500C3,\n    0x0000000C, 0x00003C89, 0x00005E63, 0x00000A23, 0x000500C4, 0x0000000C,\n    0x00002825, 0x00003C89, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B7A,\n    0x00004570, 0x00002825, 0x0004007C, 0x0000000B, 0x000041E6, 0x00003B7A,\n    0x000200F9, 0x00004F78, 0x000200F8, 0x00004F78, 0x000700F5, 0x0000000B,\n    0x00004799, 0x000041E5, 0x00005BE0, 0x000041E6, 0x00002DD9, 0x00050051,\n    0x0000000B, 0x00003B60, 0x00001997, 0x00000000, 0x00050084, 0x0000000B,\n    0x00004451, 0x00003B60, 0x00002A78, 0x00050084, 0x0000000B, 0x00001C91,\n    0x00004799, 0x00004451, 0x00050080, 0x0000000B, 0x0000226F, 0x00001C91,\n    0x000044F0, 0x00050080, 0x0000000B, 0x000053DE, 0x0000226F, 0x00005EAC,\n    0x000500C2, 0x0000000B, 0x00003948, 0x000053DE, 0x00000A17, 0x00060041,\n    0x00000294, 0x00004FAF, 0x0000107A, 0x00000A0B, 0x00003948, 0x0004003D,\n    0x00000017, 0x00001CAA, 0x00004FAF, 0x000500AA, 0x00000009, 0x000035C0,\n    0x0000619E, 0x00000A0D, 0x000500AA, 0x00000009, 0x00005376, 0x0000619E,\n    0x00000A10, 0x000500A6, 0x00000009, 0x00005686, 0x000035C0, 0x00005376,\n    0x000300F7, 0x00003463, 0x00000000, 0x000400FA, 0x00005686, 0x00002957,\n    0x00003463, 0x000200F8, 0x00002957, 0x000500C7, 0x00000017, 0x0000475F,\n    0x00001CAA, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D1, 0x0000475F,\n    0x0000013D, 0x000500C7, 0x00000017, 0x000050AC, 0x00001CAA, 0x0000072E,\n    0x000500C2, 0x00000017, 0x0000448D, 0x000050AC, 0x0000013D, 0x000500C5,\n    0x00000017, 0x00003FF8, 0x000024D1, 0x0000448D, 0x000200F9, 0x00003463,\n    0x000200F8, 0x00003463, 0x000700F5, 0x00000017, 0x00005879, 0x00001CAA,\n    0x00004F78, 0x00003FF8, 0x00002957, 0x000500AA, 0x00000009, 0x00004CB6,\n    0x0000619E, 0x00000A13, 0x000500A6, 0x00000009, 0x00003B23, 0x00005376,\n    0x00004CB6, 0x000300F7, 0x00002DA2, 0x00000000, 0x000400FA, 0x00003B23,\n    0x00002B38, 0x00002DA2, 0x000200F8, 0x00002B38, 0x000500C4, 0x00000017,\n    0x00005E17, 0x00005879, 0x000002ED, 0x000500C2, 0x00000017, 0x00003BE7,\n    0x00005879, 0x000002ED, 0x000500C5, 0x00000017, 0x000029E8, 0x00005E17,\n    0x00003BE7, 0x000200F9, 0x00002DA2, 0x000200F8, 0x00002DA2, 0x000700F5,\n    0x00000017, 0x00004DEC, 0x00005879, 0x00003463, 0x000029E8, 0x00002B38,\n    0x0007004F, 0x00000011, 0x000052B5, 0x00004DEC, 0x00004DEC, 0x00000000,\n    0x00000001, 0x000500C7, 0x00000011, 0x00002FAE, 0x000052B5, 0x00000A50,\n    0x000500C2, 0x00000011, 0x00001AF2, 0x00002FAE, 0x000007E1, 0x000500AB,\n    0x0000000F, 0x000031A4, 0x00001AF2, 0x0000070F, 0x000500AA, 0x0000000F,\n    0x00004EAC, 0x00002FAE, 0x000008BA, 0x000600A9, 0x00000011, 0x00001DE7,\n    0x00004EAC, 0x000008CF, 0x00002FAE, 0x000600A9, 0x00000011, 0x00005A0A,\n    0x000031A4, 0x00000A50, 0x0000070F, 0x000500C6, 0x00000011, 0x00005C78,\n    0x00001DE7, 0x00005A0A, 0x00050080, 0x00000011, 0x00005FB4, 0x00005C78,\n    0x00001AF2, 0x000500C4, 0x00000011, 0x000022A8, 0x00005FB4, 0x00000778,\n    0x000500C2, 0x00000011, 0x00003516, 0x00005FB4, 0x00000778, 0x000500C5,\n    0x00000011, 0x00005C42, 0x000022A8, 0x00003516, 0x000600A9, 0x00000011,\n    0x00003C67, 0x000031A4, 0x000007DF, 0x0000070F, 0x000500C6, 0x00000011,\n    0x00001E5E, 0x00005C42, 0x00003C67, 0x00050080, 0x00000011, 0x0000616D,\n    0x00001E5E, 0x00001AF2, 0x000500C2, 0x00000011, 0x00005F10, 0x000052B5,\n    0x000007F6, 0x000500C7, 0x00000011, 0x00002E2E, 0x00005F10, 0x00000A50,\n    0x000500C2, 0x00000011, 0x000018AF, 0x00002E2E, 0x000007E1, 0x000500AB,\n    0x0000000F, 0x000031A5, 0x000018AF, 0x0000070F, 0x000500AA, 0x0000000F,\n    0x00004EAD, 0x00002E2E, 0x000008BA, 0x000600A9, 0x00000011, 0x00001DE8,\n    0x00004EAD, 0x000008CF, 0x00002E2E, 0x000600A9, 0x00000011, 0x00005A0B,\n    0x000031A5, 0x00000A50, 0x0000070F, 0x000500C6, 0x00000011, 0x00005C79,\n    0x00001DE8, 0x00005A0B, 0x00050080, 0x00000011, 0x00005FB5, 0x00005C79,\n    0x000018AF, 0x000500C4, 0x00000011, 0x000022A9, 0x00005FB5, 0x00000778,\n    0x000500C2, 0x00000011, 0x00003517, 0x00005FB5, 0x00000778, 0x000500C5,\n    0x00000011, 0x00005C43, 0x000022A9, 0x00003517, 0x000600A9, 0x00000011,\n    0x00003C68, 0x000031A5, 0x000007DF, 0x0000070F, 0x000500C6, 0x00000011,\n    0x00001E84, 0x00005C43, 0x00003C68, 0x00050080, 0x00000011, 0x00005FED,\n    0x00001E84, 0x000018AF, 0x000500C4, 0x00000011, 0x00002068, 0x00005FED,\n    0x0000085F, 0x000500C5, 0x00000011, 0x00002374, 0x0000616D, 0x00002068,\n    0x000500C2, 0x00000011, 0x00005BF5, 0x000052B5, 0x000008DD, 0x000500C2,\n    0x00000011, 0x0000339C, 0x00005BF5, 0x000007CC, 0x000500AB, 0x0000000F,\n    0x00002E80, 0x0000339C, 0x0000070F, 0x000500AA, 0x0000000F, 0x00004EAE,\n    0x00005BF5, 0x00000203, 0x000600A9, 0x00000011, 0x00001DE9, 0x00004EAE,\n    0x00000218, 0x00005BF5, 0x000600A9, 0x00000011, 0x00005A0C, 0x00002E80,\n    0x000008A5, 0x0000070F, 0x000500C6, 0x00000011, 0x00005C7A, 0x00001DE9,\n    0x00005A0C, 0x00050080, 0x00000011, 0x00005FB6, 0x00005C7A, 0x0000339C,\n    0x000500C4, 0x00000011, 0x000022AA, 0x00005FB6, 0x0000078D, 0x000500C2,\n    0x00000011, 0x00003518, 0x00005FB6, 0x0000074E, 0x000500C5, 0x00000011,\n    0x00005C44, 0x000022AA, 0x00003518, 0x000600A9, 0x00000011, 0x00003C69,\n    0x00002E80, 0x000007DF, 0x0000070F, 0x000500C6, 0x00000011, 0x00001E97,\n    0x00005C44, 0x00003C69, 0x00050080, 0x00000011, 0x000056A4, 0x00001E97,\n    0x0000339C, 0x000500C5, 0x00000011, 0x00004668, 0x000056A4, 0x00000373,\n    0x00050051, 0x0000000B, 0x000028D5, 0x00002374, 0x00000000, 0x00050051,\n    0x0000000B, 0x00005CB2, 0x00002374, 0x00000001, 0x00050051, 0x0000000B,\n    0x00001DD9, 0x00004668, 0x00000000, 0x00050051, 0x0000000B, 0x00001E73,\n    0x00004668, 0x00000001, 0x00070050, 0x00000017, 0x00003F21, 0x000028D5,\n    0x00005CB2, 0x00001DD9, 0x00001E73, 0x0009004F, 0x00000017, 0x00001E85,\n    0x00003F21, 0x00003F21, 0x00000000, 0x00000002, 0x00000001, 0x00000003,\n    0x0007004F, 0x00000011, 0x000021FB, 0x00004DEC, 0x00004DEC, 0x00000002,\n    0x00000003, 0x000500C7, 0x00000011, 0x00001BFF, 0x000021FB, 0x00000A50,\n    0x000500C2, 0x00000011, 0x00001AF3, 0x00001BFF, 0x000007E1, 0x000500AB,\n    0x0000000F, 0x000031A6, 0x00001AF3, 0x0000070F, 0x000500AA, 0x0000000F,\n    0x00004EAF, 0x00001BFF, 0x000008BA, 0x000600A9, 0x00000011, 0x00001DEA,\n    0x00004EAF, 0x000008CF, 0x00001BFF, 0x000600A9, 0x00000011, 0x00005A0D,\n    0x000031A6, 0x00000A50, 0x0000070F, 0x000500C6, 0x00000011, 0x00005C7B,\n    0x00001DEA, 0x00005A0D, 0x00050080, 0x00000011, 0x00005FB7, 0x00005C7B,\n    0x00001AF3, 0x000500C4, 0x00000011, 0x000022AB, 0x00005FB7, 0x00000778,\n    0x000500C2, 0x00000011, 0x00003519, 0x00005FB7, 0x00000778, 0x000500C5,\n    0x00000011, 0x00005C45, 0x000022AB, 0x00003519, 0x000600A9, 0x00000011,\n    0x00003C6A, 0x000031A6, 0x000007DF, 0x0000070F, 0x000500C6, 0x00000011,\n    0x00001E5F, 0x00005C45, 0x00003C6A, 0x00050080, 0x00000011, 0x0000616E,\n    0x00001E5F, 0x00001AF3, 0x000500C2, 0x00000011, 0x00005F11, 0x000021FB,\n    0x000007F6, 0x000500C7, 0x00000011, 0x00002E2F, 0x00005F11, 0x00000A50,\n    0x000500C2, 0x00000011, 0x000018B0, 0x00002E2F, 0x000007E1, 0x000500AB,\n    0x0000000F, 0x000031A7, 0x000018B0, 0x0000070F, 0x000500AA, 0x0000000F,\n    0x00004EB0, 0x00002E2F, 0x000008BA, 0x000600A9, 0x00000011, 0x00001DEB,\n    0x00004EB0, 0x000008CF, 0x00002E2F, 0x000600A9, 0x00000011, 0x00005A0E,\n    0x000031A7, 0x00000A50, 0x0000070F, 0x000500C6, 0x00000011, 0x00005C7C,\n    0x00001DEB, 0x00005A0E, 0x00050080, 0x00000011, 0x00005FB8, 0x00005C7C,\n    0x000018B0, 0x000500C4, 0x00000011, 0x000022AC, 0x00005FB8, 0x00000778,\n    0x000500C2, 0x00000011, 0x0000351A, 0x00005FB8, 0x00000778, 0x000500C5,\n    0x00000011, 0x00005C46, 0x000022AC, 0x0000351A, 0x000600A9, 0x00000011,\n    0x00003C6B, 0x000031A7, 0x000007DF, 0x0000070F, 0x000500C6, 0x00000011,\n    0x00001E86, 0x00005C46, 0x00003C6B, 0x00050080, 0x00000011, 0x00005FEE,\n    0x00001E86, 0x000018B0, 0x000500C4, 0x00000011, 0x00002069, 0x00005FEE,\n    0x0000085F, 0x000500C5, 0x00000011, 0x00002375, 0x0000616E, 0x00002069,\n    0x000500C2, 0x00000011, 0x00005BF6, 0x000021FB, 0x000008DD, 0x000500C2,\n    0x00000011, 0x0000339D, 0x00005BF6, 0x000007CC, 0x000500AB, 0x0000000F,\n    0x00002E81, 0x0000339D, 0x0000070F, 0x000500AA, 0x0000000F, 0x00004EB1,\n    0x00005BF6, 0x00000203, 0x000600A9, 0x00000011, 0x00001DEC, 0x00004EB1,\n    0x00000218, 0x00005BF6, 0x000600A9, 0x00000011, 0x00005A0F, 0x00002E81,\n    0x000008A5, 0x0000070F, 0x000500C6, 0x00000011, 0x00005C7D, 0x00001DEC,\n    0x00005A0F, 0x00050080, 0x00000011, 0x00005FB9, 0x00005C7D, 0x0000339D,\n    0x000500C4, 0x00000011, 0x000022AD, 0x00005FB9, 0x0000078D, 0x000500C2,\n    0x00000011, 0x0000351B, 0x00005FB9, 0x0000074E, 0x000500C5, 0x00000011,\n    0x00005C47, 0x000022AD, 0x0000351B, 0x000600A9, 0x00000011, 0x00003C6C,\n    0x00002E81, 0x000007DF, 0x0000070F, 0x000500C6, 0x00000011, 0x00001E98,\n    0x00005C47, 0x00003C6C, 0x00050080, 0x00000011, 0x000056A5, 0x00001E98,\n    0x0000339D, 0x000500C5, 0x00000011, 0x00004669, 0x000056A5, 0x00000373,\n    0x00050051, 0x0000000B, 0x000028D6, 0x00002375, 0x00000000, 0x00050051,\n    0x0000000B, 0x00005CB3, 0x00002375, 0x00000001, 0x00050051, 0x0000000B,\n    0x00001DDA, 0x00004669, 0x00000000, 0x00050051, 0x0000000B, 0x00001E74,\n    0x00004669, 0x00000001, 0x00070050, 0x00000017, 0x000047AA, 0x000028D6,\n    0x00005CB3, 0x00001DDA, 0x00001E74, 0x0009004F, 0x00000017, 0x00005BD9,\n    0x000047AA, 0x000047AA, 0x00000000, 0x00000002, 0x00000001, 0x00000003,\n    0x000500C2, 0x0000000B, 0x00003B61, 0x00001F01, 0x00000A17, 0x00060041,\n    0x00000294, 0x00002306, 0x0000140E, 0x00000A0B, 0x00003B61, 0x0003003E,\n    0x00002306, 0x00001E85, 0x00050080, 0x0000000B, 0x0000204C, 0x00001F01,\n    0x00000A3A, 0x000500C2, 0x0000000B, 0x000019FD, 0x0000204C, 0x00000A17,\n    0x00060041, 0x00000294, 0x00004BE4, 0x0000140E, 0x00000A0B, 0x000019FD,\n    0x0003003E, 0x00004BE4, 0x00005BD9, 0x00050080, 0x0000000B, 0x0000204D,\n    0x000053DE, 0x00000A3A, 0x000500C2, 0x0000000B, 0x000019EA, 0x0000204D,\n    0x00000A17, 0x00060041, 0x00000294, 0x00005566, 0x0000107A, 0x00000A0B,\n    0x000019EA, 0x0004003D, 0x00000017, 0x00003910, 0x00005566, 0x000300F7,\n    0x00003A1A, 0x00000000, 0x000400FA, 0x00005686, 0x00002958, 0x00003A1A,\n    0x000200F8, 0x00002958, 0x000500C7, 0x00000017, 0x00004760, 0x00003910,\n    0x000009CE, 0x000500C4, 0x00000017, 0x000024D2, 0x00004760, 0x0000013D,\n    0x000500C7, 0x00000017, 0x000050AD, 0x00003910, 0x0000072E, 0x000500C2,\n    0x00000017, 0x0000448E, 0x000050AD, 0x0000013D, 0x000500C5, 0x00000017,\n    0x00003FF9, 0x000024D2, 0x0000448E, 0x000200F9, 0x00003A1A, 0x000200F8,\n    0x00003A1A, 0x000700F5, 0x00000017, 0x00002AAC, 0x00003910, 0x00002DA2,\n    0x00003FF9, 0x00002958, 0x000300F7, 0x00002DA3, 0x00000000, 0x000400FA,\n    0x00003B23, 0x00002B39, 0x00002DA3, 0x000200F8, 0x00002B39, 0x000500C4,\n    0x00000017, 0x00005E18, 0x00002AAC, 0x000002ED, 0x000500C2, 0x00000017,\n    0x00003BE8, 0x00002AAC, 0x000002ED, 0x000500C5, 0x00000017, 0x000029E9,\n    0x00005E18, 0x00003BE8, 0x000200F9, 0x00002DA3, 0x000200F8, 0x00002DA3,\n    0x000700F5, 0x00000017, 0x00004DED, 0x00002AAC, 0x00003A1A, 0x000029E9,\n    0x00002B39, 0x0007004F, 0x00000011, 0x000052B6, 0x00004DED, 0x00004DED,\n    0x00000000, 0x00000001, 0x000500C7, 0x00000011, 0x00002FAF, 0x000052B6,\n    0x00000A50, 0x000500C2, 0x00000011, 0x00001AF4, 0x00002FAF, 0x000007E1,\n    0x000500AB, 0x0000000F, 0x000031A8, 0x00001AF4, 0x0000070F, 0x000500AA,\n    0x0000000F, 0x00004EB2, 0x00002FAF, 0x000008BA, 0x000600A9, 0x00000011,\n    0x00001DED, 0x00004EB2, 0x000008CF, 0x00002FAF, 0x000600A9, 0x00000011,\n    0x00005A10, 0x000031A8, 0x00000A50, 0x0000070F, 0x000500C6, 0x00000011,\n    0x00005C7E, 0x00001DED, 0x00005A10, 0x00050080, 0x00000011, 0x00005FBA,\n    0x00005C7E, 0x00001AF4, 0x000500C4, 0x00000011, 0x000022AE, 0x00005FBA,\n    0x00000778, 0x000500C2, 0x00000011, 0x0000351C, 0x00005FBA, 0x00000778,\n    0x000500C5, 0x00000011, 0x00005C48, 0x000022AE, 0x0000351C, 0x000600A9,\n    0x00000011, 0x00003C6D, 0x000031A8, 0x000007DF, 0x0000070F, 0x000500C6,\n    0x00000011, 0x00001E60, 0x00005C48, 0x00003C6D, 0x00050080, 0x00000011,\n    0x0000616F, 0x00001E60, 0x00001AF4, 0x000500C2, 0x00000011, 0x00005F12,\n    0x000052B6, 0x000007F6, 0x000500C7, 0x00000011, 0x00002E30, 0x00005F12,\n    0x00000A50, 0x000500C2, 0x00000011, 0x000018B1, 0x00002E30, 0x000007E1,\n    0x000500AB, 0x0000000F, 0x000031A9, 0x000018B1, 0x0000070F, 0x000500AA,\n    0x0000000F, 0x00004EB3, 0x00002E30, 0x000008BA, 0x000600A9, 0x00000011,\n    0x00001DEE, 0x00004EB3, 0x000008CF, 0x00002E30, 0x000600A9, 0x00000011,\n    0x00005A11, 0x000031A9, 0x00000A50, 0x0000070F, 0x000500C6, 0x00000011,\n    0x00005C7F, 0x00001DEE, 0x00005A11, 0x00050080, 0x00000011, 0x00005FBB,\n    0x00005C7F, 0x000018B1, 0x000500C4, 0x00000011, 0x000022AF, 0x00005FBB,\n    0x00000778, 0x000500C2, 0x00000011, 0x0000351D, 0x00005FBB, 0x00000778,\n    0x000500C5, 0x00000011, 0x00005C49, 0x000022AF, 0x0000351D, 0x000600A9,\n    0x00000011, 0x00003C6E, 0x000031A9, 0x000007DF, 0x0000070F, 0x000500C6,\n    0x00000011, 0x00001E87, 0x00005C49, 0x00003C6E, 0x00050080, 0x00000011,\n    0x00005FEF, 0x00001E87, 0x000018B1, 0x000500C4, 0x00000011, 0x0000206A,\n    0x00005FEF, 0x0000085F, 0x000500C5, 0x00000011, 0x00002376, 0x0000616F,\n    0x0000206A, 0x000500C2, 0x00000011, 0x00005BF7, 0x000052B6, 0x000008DD,\n    0x000500C2, 0x00000011, 0x0000339E, 0x00005BF7, 0x000007CC, 0x000500AB,\n    0x0000000F, 0x00002E82, 0x0000339E, 0x0000070F, 0x000500AA, 0x0000000F,\n    0x00004EB4, 0x00005BF7, 0x00000203, 0x000600A9, 0x00000011, 0x00001DEF,\n    0x00004EB4, 0x00000218, 0x00005BF7, 0x000600A9, 0x00000011, 0x00005A12,\n    0x00002E82, 0x000008A5, 0x0000070F, 0x000500C6, 0x00000011, 0x00005C80,\n    0x00001DEF, 0x00005A12, 0x00050080, 0x00000011, 0x00005FBC, 0x00005C80,\n    0x0000339E, 0x000500C4, 0x00000011, 0x000022B0, 0x00005FBC, 0x0000078D,\n    0x000500C2, 0x00000011, 0x0000351E, 0x00005FBC, 0x0000074E, 0x000500C5,\n    0x00000011, 0x00005C4A, 0x000022B0, 0x0000351E, 0x000600A9, 0x00000011,\n    0x00003C6F, 0x00002E82, 0x000007DF, 0x0000070F, 0x000500C6, 0x00000011,\n    0x00001E99, 0x00005C4A, 0x00003C6F, 0x00050080, 0x00000011, 0x000056A6,\n    0x00001E99, 0x0000339E, 0x000500C5, 0x00000011, 0x0000466A, 0x000056A6,\n    0x00000373, 0x00050051, 0x0000000B, 0x000028D7, 0x00002376, 0x00000000,\n    0x00050051, 0x0000000B, 0x00005CB4, 0x00002376, 0x00000001, 0x00050051,\n    0x0000000B, 0x00001DDB, 0x0000466A, 0x00000000, 0x00050051, 0x0000000B,\n    0x00001E75, 0x0000466A, 0x00000001, 0x00070050, 0x00000017, 0x00003F22,\n    0x000028D7, 0x00005CB4, 0x00001DDB, 0x00001E75, 0x0009004F, 0x00000017,\n    0x00001E88, 0x00003F22, 0x00003F22, 0x00000000, 0x00000002, 0x00000001,\n    0x00000003, 0x0007004F, 0x00000011, 0x000021FC, 0x00004DED, 0x00004DED,\n    0x00000002, 0x00000003, 0x000500C7, 0x00000011, 0x00001C02, 0x000021FC,\n    0x00000A50, 0x000500C2, 0x00000011, 0x00001AF5, 0x00001C02, 0x000007E1,\n    0x000500AB, 0x0000000F, 0x000031AA, 0x00001AF5, 0x0000070F, 0x000500AA,\n    0x0000000F, 0x00004EB5, 0x00001C02, 0x000008BA, 0x000600A9, 0x00000011,\n    0x00001DF0, 0x00004EB5, 0x000008CF, 0x00001C02, 0x000600A9, 0x00000011,\n    0x00005A13, 0x000031AA, 0x00000A50, 0x0000070F, 0x000500C6, 0x00000011,\n    0x00005C81, 0x00001DF0, 0x00005A13, 0x00050080, 0x00000011, 0x00005FBD,\n    0x00005C81, 0x00001AF5, 0x000500C4, 0x00000011, 0x000022B1, 0x00005FBD,\n    0x00000778, 0x000500C2, 0x00000011, 0x0000351F, 0x00005FBD, 0x00000778,\n    0x000500C5, 0x00000011, 0x00005C4B, 0x000022B1, 0x0000351F, 0x000600A9,\n    0x00000011, 0x00003C72, 0x000031AA, 0x000007DF, 0x0000070F, 0x000500C6,\n    0x00000011, 0x00001E61, 0x00005C4B, 0x00003C72, 0x00050080, 0x00000011,\n    0x00006170, 0x00001E61, 0x00001AF5, 0x000500C2, 0x00000011, 0x00005F13,\n    0x000021FC, 0x000007F6, 0x000500C7, 0x00000011, 0x00002E31, 0x00005F13,\n    0x00000A50, 0x000500C2, 0x00000011, 0x000018B2, 0x00002E31, 0x000007E1,\n    0x000500AB, 0x0000000F, 0x000031AB, 0x000018B2, 0x0000070F, 0x000500AA,\n    0x0000000F, 0x00004EB6, 0x00002E31, 0x000008BA, 0x000600A9, 0x00000011,\n    0x00001DF1, 0x00004EB6, 0x000008CF, 0x00002E31, 0x000600A9, 0x00000011,\n    0x00005A14, 0x000031AB, 0x00000A50, 0x0000070F, 0x000500C6, 0x00000011,\n    0x00005C82, 0x00001DF1, 0x00005A14, 0x00050080, 0x00000011, 0x00005FBE,\n    0x00005C82, 0x000018B2, 0x000500C4, 0x00000011, 0x000022B2, 0x00005FBE,\n    0x00000778, 0x000500C2, 0x00000011, 0x00003520, 0x00005FBE, 0x00000778,\n    0x000500C5, 0x00000011, 0x00005C4C, 0x000022B2, 0x00003520, 0x000600A9,\n    0x00000011, 0x00003C73, 0x000031AB, 0x000007DF, 0x0000070F, 0x000500C6,\n    0x00000011, 0x00001E89, 0x00005C4C, 0x00003C73, 0x00050080, 0x00000011,\n    0x00005FF0, 0x00001E89, 0x000018B2, 0x000500C4, 0x00000011, 0x0000206B,\n    0x00005FF0, 0x0000085F, 0x000500C5, 0x00000011, 0x00002377, 0x00006170,\n    0x0000206B, 0x000500C2, 0x00000011, 0x00005BF8, 0x000021FC, 0x000008DD,\n    0x000500C2, 0x00000011, 0x0000339F, 0x00005BF8, 0x000007CC, 0x000500AB,\n    0x0000000F, 0x00002E83, 0x0000339F, 0x0000070F, 0x000500AA, 0x0000000F,\n    0x00004EB7, 0x00005BF8, 0x00000203, 0x000600A9, 0x00000011, 0x00001DF2,\n    0x00004EB7, 0x00000218, 0x00005BF8, 0x000600A9, 0x00000011, 0x00005A15,\n    0x00002E83, 0x000008A5, 0x0000070F, 0x000500C6, 0x00000011, 0x00005C83,\n    0x00001DF2, 0x00005A15, 0x00050080, 0x00000011, 0x00005FBF, 0x00005C83,\n    0x0000339F, 0x000500C4, 0x00000011, 0x000022B3, 0x00005FBF, 0x0000078D,\n    0x000500C2, 0x00000011, 0x00003521, 0x00005FBF, 0x0000074E, 0x000500C5,\n    0x00000011, 0x00005C4D, 0x000022B3, 0x00003521, 0x000600A9, 0x00000011,\n    0x00003C74, 0x00002E83, 0x000007DF, 0x0000070F, 0x000500C6, 0x00000011,\n    0x00001E9A, 0x00005C4D, 0x00003C74, 0x00050080, 0x00000011, 0x000056A7,\n    0x00001E9A, 0x0000339F, 0x000500C5, 0x00000011, 0x0000466B, 0x000056A7,\n    0x00000373, 0x00050051, 0x0000000B, 0x000028D8, 0x00002377, 0x00000000,\n    0x00050051, 0x0000000B, 0x00005CB5, 0x00002377, 0x00000001, 0x00050051,\n    0x0000000B, 0x00001DDC, 0x0000466B, 0x00000000, 0x00050051, 0x0000000B,\n    0x00001E76, 0x0000466B, 0x00000001, 0x00070050, 0x00000017, 0x000042C4,\n    0x000028D8, 0x00005CB5, 0x00001DDC, 0x00001E76, 0x0009004F, 0x00000017,\n    0x00004787, 0x000042C4, 0x000042C4, 0x00000000, 0x00000002, 0x00000001,\n    0x00000003, 0x00050080, 0x0000000B, 0x00004949, 0x00001F01, 0x00000A6A,\n    0x000500C2, 0x0000000B, 0x000029B6, 0x00004949, 0x00000A17, 0x00060041,\n    0x00000294, 0x00004BE5, 0x0000140E, 0x00000A0B, 0x000029B6, 0x0003003E,\n    0x00004BE5, 0x00001E88, 0x00050080, 0x0000000B, 0x0000204E, 0x00001F01,\n    0x00000A9A, 0x000500C2, 0x0000000B, 0x000019FE, 0x0000204E, 0x00000A17,\n    0x00060041, 0x00000294, 0x000054DF, 0x0000140E, 0x00000A0B, 0x000019FE,\n    0x0003003E, 0x000054DF, 0x00004787, 0x000200F9, 0x00004C7A, 0x000200F8,\n    0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_r16_snorm_float_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25155\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n      %float = OpTypeFloat 32\n    %v4float = OpTypeVector %float 4\n       %uint = OpTypeInt 32 0\n     %v4uint = OpTypeVector %uint 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v2uint = OpTypeVector %uint 2\n     %v3uint = OpTypeVector %uint 3\n   %float_n1 = OpConstant %float -1\n      %v4int = OpTypeVector %int 4\n     %int_16 = OpConstant %int 16\n%float_3_05185094en05 = OpConstant %float 3.05185094e-05\n     %uint_0 = OpConstant %uint 0\n    %v2float = OpTypeVector %float 2\n     %uint_1 = OpConstant %uint 1\n     %uint_2 = OpConstant %uint 2\n     %uint_3 = OpConstant %uint 3\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n      %int_3 = OpConstant %int 3\n      %int_2 = OpConstant %int 2\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n     %uint_4 = OpConstant %uint 4\n       %2612 = OpConstantComposite %v3uint %uint_4 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n    %uint_16 = OpConstant %uint 16\n    %uint_32 = OpConstant %uint 32\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n       %1284 = OpConstantComposite %v4float %float_n1 %float_n1 %float_n1 %float_n1\n        %770 = OpConstantComposite %v4int %int_16 %int_16 %int_16 %int_16\n    %uint_64 = OpConstant %uint 64\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24540 = OpBitwiseAnd %uint %13606 %uint_1\n      %17270 = OpINotEqual %bool %24540 %uint_0\n      %12328 = OpBitwiseAnd %uint %13606 %uint_2\n      %17284 = OpINotEqual %bool %12328 %uint_0\n       %7856 = OpShiftRightLogical %uint %13606 %uint_2\n      %25058 = OpBitwiseAnd %uint %7856 %uint_3\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2612\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %6586 DontFlatten\n               OpBranchConditional %24679 %21992 %6586\n      %21992 = OpLabel\n               OpBranch %19578\n       %6586 = OpLabel\n      %23478 = OpBitcast %v3int %21387\n      %18710 = OpCompositeExtract %uint %22410 1\n      %23531 = OpCompositeExtract %int %23478 0\n      %22810 = OpIMul %int %23531 %int_2\n       %6362 = OpCompositeExtract %int %23478 2\n      %14505 = OpBitcast %int %18710\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %23478 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %6594\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %22810 %24535\n      %10404 = OpBitcast %uint %8258\n      %14582 = OpIAdd %uint %22411 %10404\n      %12308 = OpLogicalNot %bool %17270\n               OpSelectionMerge %19040 DontFlatten\n               OpBranchConditional %12308 %9741 %17007\n       %9741 = OpLabel\n      %17463 = OpCompositeExtract %uint %21387 0\n      %11246 = OpCompositeExtract %uint %21387 1\n      %18801 = OpCompositeExtract %uint %21387 2\n      %14831 = OpIMul %uint %22409 %18801\n      %20322 = OpIAdd %uint %11246 %14831\n      %21676 = OpIMul %uint %22408 %20322\n      %20398 = OpIAdd %uint %17463 %21676\n      %11367 = OpShiftLeftLogical %uint %20398 %uint_1\n               OpBranch %19040\n      %17007 = OpLabel\n               OpSelectionMerge %23536 DontFlatten\n               OpBranchConditional %17284 %11410 %24353\n      %11410 = OpLabel\n      %21364 = OpShiftRightLogical %uint %22408 %int_5\n      %13804 = OpShiftRightLogical %uint %22409 %int_4\n      %13237 = OpShiftRightArithmetic %int %6362 %int_2\n      %22374 = OpBitcast %int %13804\n      %25085 = OpIMul %int %13237 %22374\n      %11618 = OpShiftRightArithmetic %int %17598 %int_4\n      %16670 = OpIAdd %int %25085 %11618\n      %19064 = OpBitcast %int %21364\n      %13020 = OpIMul %int %16670 %19064\n      %12986 = OpShiftRightArithmetic %int %23531 %int_5\n      %24558 = OpIAdd %int %13020 %12986\n       %8797 = OpShiftLeftLogical %int %24558 %int_7\n      %11434 = OpBitwiseAnd %int %6362 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %17598 %int_1\n      %21365 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21365 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %23531 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17334 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17334 %uint_1\n      %13015 = OpShiftRightArithmetic %int %17598 %int_3\n       %9929 = OpBitwiseXor %int %13015 %13237\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %23531 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %17598 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6551\n       %7168 = OpShiftLeftLogical %int %16793 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24144 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24144 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24144 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24144 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %23536\n      %24353 = OpLabel\n      %23000 = OpBitcast %v2int %17136\n      %22120 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %23000 1\n      %12089 = OpShiftRightArithmetic %int %14597 %int_5\n      %22400 = OpBitcast %int %22120\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %23000 0\n      %20423 = OpShiftRightArithmetic %int %25154 %int_5\n      %18864 = OpIAdd %int %7938 %20423\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25154 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17335 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17335 %uint_1\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25154 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6552\n       %7169 = OpShiftLeftLogical %int %21575 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24163 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24163 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24163 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %23536\n      %23536 = OpLabel\n      %10540 = OpPhi %uint %16869 %11410 %16870 %24353\n               OpBranch %19040\n      %19040 = OpLabel\n      %11376 = OpPhi %uint %11367 %9741 %10540 %23536\n      %18621 = OpIAdd %uint %11376 %24236\n      %15698 = OpShiftRightLogical %uint %18621 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15698\n       %8801 = OpLoad %v4uint %20399\n      %21106 = OpIEqual %bool %25058 %uint_1\n               OpSelectionMerge %13867 None\n               OpBranchConditional %21106 %10583 %13867\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %8801 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %8801 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13867\n      %13867 = OpLabel\n      %17699 = OpPhi %v4uint %8801 %19040 %16376 %10583\n      %20013 = OpShiftRightLogical %uint %14582 %int_4\n      %23626 = OpBitcast %v4int %17699\n      %11292 = OpShiftLeftLogical %v4int %23626 %770\n      %16536 = OpShiftRightArithmetic %v4int %11292 %770\n      %10903 = OpConvertSToF %v4float %16536\n      %20413 = OpVectorTimesScalar %v4float %10903 %float_3_05185094en05\n      %23989 = OpExtInst %v4float %1 FMax %1284 %20413\n      %14338 = OpShiftRightArithmetic %v4int %23626 %770\n       %6607 = OpConvertSToF %v4float %14338\n      %18247 = OpVectorTimesScalar %v4float %6607 %float_3_05185094en05\n      %24070 = OpExtInst %v4float %1 FMax %1284 %18247\n      %24330 = OpCompositeExtract %float %23989 0\n      %14319 = OpCompositeExtract %float %24070 0\n      %19232 = OpCompositeConstruct %v2float %24330 %14319\n       %8561 = OpExtInst %uint %1 PackHalf2x16 %19232\n      %23487 = OpCompositeExtract %float %23989 1\n      %14759 = OpCompositeExtract %float %24070 1\n      %19233 = OpCompositeConstruct %v2float %23487 %14759\n       %8562 = OpExtInst %uint %1 PackHalf2x16 %19233\n      %23488 = OpCompositeExtract %float %23989 2\n      %14760 = OpCompositeExtract %float %24070 2\n      %19234 = OpCompositeConstruct %v2float %23488 %14760\n       %8563 = OpExtInst %uint %1 PackHalf2x16 %19234\n      %23489 = OpCompositeExtract %float %23989 3\n      %14761 = OpCompositeExtract %float %24070 3\n      %19213 = OpCompositeConstruct %v2float %23489 %14761\n       %8430 = OpExtInst %uint %1 PackHalf2x16 %19213\n      %15035 = OpCompositeConstruct %v4uint %8561 %8562 %8563 %8430\n      %17859 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %20013\n               OpStore %17859 %15035\n      %21685 = OpIAdd %uint %14582 %uint_16\n               OpSelectionMerge %24688 DontFlatten\n               OpBranchConditional %17270 %21993 %7205\n      %21993 = OpLabel\n               OpBranch %24688\n       %7205 = OpLabel\n               OpBranch %24688\n      %24688 = OpLabel\n      %11377 = OpPhi %uint %uint_64 %21993 %uint_16 %7205\n      %18622 = OpIAdd %uint %18621 %11377\n      %15699 = OpShiftRightLogical %uint %18622 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15699\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %13868 None\n               OpBranchConditional %21106 %10584 %13868\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %13868\n      %13868 = OpLabel\n      %17700 = OpPhi %v4uint %14608 %24688 %16377 %10584\n      %20014 = OpShiftRightLogical %uint %21685 %int_4\n      %23627 = OpBitcast %v4int %17700\n      %11293 = OpShiftLeftLogical %v4int %23627 %770\n      %16537 = OpShiftRightArithmetic %v4int %11293 %770\n      %10904 = OpConvertSToF %v4float %16537\n      %20414 = OpVectorTimesScalar %v4float %10904 %float_3_05185094en05\n      %23990 = OpExtInst %v4float %1 FMax %1284 %20414\n      %14339 = OpShiftRightArithmetic %v4int %23627 %770\n       %6608 = OpConvertSToF %v4float %14339\n      %18248 = OpVectorTimesScalar %v4float %6608 %float_3_05185094en05\n      %24071 = OpExtInst %v4float %1 FMax %1284 %18248\n      %24331 = OpCompositeExtract %float %23990 0\n      %14320 = OpCompositeExtract %float %24071 0\n      %19235 = OpCompositeConstruct %v2float %24331 %14320\n       %8564 = OpExtInst %uint %1 PackHalf2x16 %19235\n      %23490 = OpCompositeExtract %float %23990 1\n      %14762 = OpCompositeExtract %float %24071 1\n      %19236 = OpCompositeConstruct %v2float %23490 %14762\n       %8565 = OpExtInst %uint %1 PackHalf2x16 %19236\n      %23491 = OpCompositeExtract %float %23990 2\n      %14763 = OpCompositeExtract %float %24071 2\n      %19237 = OpCompositeConstruct %v2float %23491 %14763\n       %8566 = OpExtInst %uint %1 PackHalf2x16 %19237\n      %23492 = OpCompositeExtract %float %23990 3\n      %14764 = OpCompositeExtract %float %24071 3\n      %19214 = OpCompositeConstruct %v2float %23492 %14764\n       %8431 = OpExtInst %uint %1 PackHalf2x16 %19214\n      %15036 = OpCompositeConstruct %v4uint %8564 %8565 %8566 %8431\n      %20158 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %20014\n               OpStore %20158 %15036\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_r16_snorm_float_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006243, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00030016, 0x0000000D, 0x00000020, 0x00040017,\n    0x0000001D, 0x0000000D, 0x00000004, 0x00040015, 0x0000000B, 0x00000020,\n    0x00000000, 0x00040017, 0x00000017, 0x0000000B, 0x00000004, 0x00040015,\n    0x0000000C, 0x00000020, 0x00000001, 0x00040017, 0x00000012, 0x0000000C,\n    0x00000002, 0x00040017, 0x00000016, 0x0000000C, 0x00000003, 0x00020014,\n    0x00000009, 0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017,\n    0x00000014, 0x0000000B, 0x00000003, 0x0004002B, 0x0000000D, 0x00000341,\n    0xBF800000, 0x00040017, 0x0000001A, 0x0000000C, 0x00000004, 0x0004002B,\n    0x0000000C, 0x00000A3B, 0x00000010, 0x0004002B, 0x0000000D, 0x00000A38,\n    0x38000100, 0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000, 0x00040017,\n    0x00000013, 0x0000000D, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A0D,\n    0x00000001, 0x0004002B, 0x0000000B, 0x00000A10, 0x00000002, 0x0004002B,\n    0x0000000B, 0x00000A13, 0x00000003, 0x0004002B, 0x0000000B, 0x000008A6,\n    0x00FF00FF, 0x0004002B, 0x0000000B, 0x00000A22, 0x00000008, 0x0004002B,\n    0x0000000B, 0x000005FD, 0xFF00FF00, 0x0004002B, 0x0000000C, 0x00000A17,\n    0x00000004, 0x0004002B, 0x0000000C, 0x00000A1D, 0x00000006, 0x0004002B,\n    0x0000000C, 0x00000A2C, 0x0000000B, 0x0004002B, 0x0000000C, 0x00000A39,\n    0x0000000F, 0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001, 0x0004002B,\n    0x0000000C, 0x00000A1A, 0x00000005, 0x0004002B, 0x0000000C, 0x00000A20,\n    0x00000007, 0x0004002B, 0x0000000C, 0x00000A23, 0x00000008, 0x0004002B,\n    0x0000000C, 0x00000A2F, 0x0000000C, 0x0004002B, 0x0000000C, 0x00000A14,\n    0x00000003, 0x0004002B, 0x0000000C, 0x00000A11, 0x00000002, 0x0004002B,\n    0x0000000C, 0x00000A0B, 0x00000000, 0x000A001E, 0x00000489, 0x0000000B,\n    0x0000000B, 0x0000000B, 0x0000000B, 0x00000014, 0x0000000B, 0x0000000B,\n    0x0000000B, 0x00040020, 0x00000706, 0x00000009, 0x00000489, 0x0004003B,\n    0x00000706, 0x00000CE9, 0x00000009, 0x00040020, 0x00000288, 0x00000009,\n    0x0000000B, 0x00040020, 0x00000291, 0x00000009, 0x00000014, 0x00040020,\n    0x00000292, 0x00000001, 0x00000014, 0x0004003B, 0x00000292, 0x00000F48,\n    0x00000001, 0x0004002B, 0x0000000B, 0x00000A16, 0x00000004, 0x0006002C,\n    0x00000014, 0x00000A34, 0x00000A16, 0x00000A0A, 0x00000A0A, 0x00040017,\n    0x0000000F, 0x00000009, 0x00000002, 0x0003001D, 0x000007DC, 0x00000017,\n    0x0003001E, 0x000007B4, 0x000007DC, 0x00040020, 0x00000A31, 0x00000002,\n    0x000007B4, 0x0004003B, 0x00000A31, 0x0000107A, 0x00000002, 0x00040020,\n    0x00000294, 0x00000002, 0x00000017, 0x0003001D, 0x000007DD, 0x00000017,\n    0x0003001E, 0x000007B5, 0x000007DD, 0x00040020, 0x00000A32, 0x00000002,\n    0x000007B5, 0x0004003B, 0x00000A32, 0x0000140E, 0x00000002, 0x0004002B,\n    0x0000000B, 0x00000A3A, 0x00000010, 0x0004002B, 0x0000000B, 0x00000A6A,\n    0x00000020, 0x0006002C, 0x00000014, 0x00000BC3, 0x00000A16, 0x00000A6A,\n    0x00000A0D, 0x0007002C, 0x00000017, 0x000009CE, 0x000008A6, 0x000008A6,\n    0x000008A6, 0x000008A6, 0x0007002C, 0x00000017, 0x0000013D, 0x00000A22,\n    0x00000A22, 0x00000A22, 0x00000A22, 0x0007002C, 0x00000017, 0x0000072E,\n    0x000005FD, 0x000005FD, 0x000005FD, 0x000005FD, 0x0007002C, 0x0000001D,\n    0x00000504, 0x00000341, 0x00000341, 0x00000341, 0x00000341, 0x0007002C,\n    0x0000001A, 0x00000302, 0x00000A3B, 0x00000A3B, 0x00000A3B, 0x00000A3B,\n    0x0004002B, 0x0000000B, 0x00000ACA, 0x00000040, 0x00050036, 0x00000008,\n    0x0000161F, 0x00000000, 0x00000502, 0x000200F8, 0x00003B06, 0x000300F7,\n    0x00004C7A, 0x00000000, 0x000300FB, 0x00000A0A, 0x00002E68, 0x000200F8,\n    0x00002E68, 0x00050041, 0x00000288, 0x000060D7, 0x00000CE9, 0x00000A0B,\n    0x0004003D, 0x0000000B, 0x00003526, 0x000060D7, 0x000500C7, 0x0000000B,\n    0x00005FDC, 0x00003526, 0x00000A0D, 0x000500AB, 0x00000009, 0x00004376,\n    0x00005FDC, 0x00000A0A, 0x000500C7, 0x0000000B, 0x00003028, 0x00003526,\n    0x00000A10, 0x000500AB, 0x00000009, 0x00004384, 0x00003028, 0x00000A0A,\n    0x000500C2, 0x0000000B, 0x00001EB0, 0x00003526, 0x00000A10, 0x000500C7,\n    0x0000000B, 0x000061E2, 0x00001EB0, 0x00000A13, 0x00050041, 0x00000288,\n    0x0000492C, 0x00000CE9, 0x00000A0E, 0x0004003D, 0x0000000B, 0x00005EAC,\n    0x0000492C, 0x00050041, 0x00000288, 0x00004EBA, 0x00000CE9, 0x00000A11,\n    0x0004003D, 0x0000000B, 0x00005788, 0x00004EBA, 0x00050041, 0x00000288,\n    0x00004EBB, 0x00000CE9, 0x00000A14, 0x0004003D, 0x0000000B, 0x00005789,\n    0x00004EBB, 0x00050041, 0x00000291, 0x00004EBC, 0x00000CE9, 0x00000A17,\n    0x0004003D, 0x00000014, 0x0000578A, 0x00004EBC, 0x00050041, 0x00000288,\n    0x00004EBD, 0x00000CE9, 0x00000A1A, 0x0004003D, 0x0000000B, 0x0000578B,\n    0x00004EBD, 0x00050041, 0x00000288, 0x00004E6E, 0x00000CE9, 0x00000A1D,\n    0x0004003D, 0x0000000B, 0x000019C2, 0x00004E6E, 0x0004003D, 0x00000014,\n    0x00002A0E, 0x00000F48, 0x000500C4, 0x00000014, 0x0000538B, 0x00002A0E,\n    0x00000A34, 0x0007004F, 0x00000011, 0x000042F0, 0x0000538B, 0x0000538B,\n    0x00000000, 0x00000001, 0x0007004F, 0x00000011, 0x0000242F, 0x0000578A,\n    0x0000578A, 0x00000000, 0x00000001, 0x000500AE, 0x0000000F, 0x00004288,\n    0x000042F0, 0x0000242F, 0x0004009A, 0x00000009, 0x00006067, 0x00004288,\n    0x000300F7, 0x000019BA, 0x00000002, 0x000400FA, 0x00006067, 0x000055E8,\n    0x000019BA, 0x000200F8, 0x000055E8, 0x000200F9, 0x00004C7A, 0x000200F8,\n    0x000019BA, 0x0004007C, 0x00000016, 0x00005BB6, 0x0000538B, 0x00050051,\n    0x0000000B, 0x00004916, 0x0000578A, 0x00000001, 0x00050051, 0x0000000C,\n    0x00005BEB, 0x00005BB6, 0x00000000, 0x00050084, 0x0000000C, 0x0000591A,\n    0x00005BEB, 0x00000A11, 0x00050051, 0x0000000C, 0x000018DA, 0x00005BB6,\n    0x00000002, 0x0004007C, 0x0000000C, 0x000038A9, 0x00004916, 0x00050084,\n    0x0000000C, 0x00002C0F, 0x000018DA, 0x000038A9, 0x00050051, 0x0000000C,\n    0x000044BE, 0x00005BB6, 0x00000001, 0x00050080, 0x0000000C, 0x000056D4,\n    0x00002C0F, 0x000044BE, 0x0004007C, 0x0000000C, 0x00005785, 0x000019C2,\n    0x00050084, 0x0000000C, 0x00005FD7, 0x000056D4, 0x00005785, 0x00050080,\n    0x0000000C, 0x00002042, 0x0000591A, 0x00005FD7, 0x0004007C, 0x0000000B,\n    0x000028A4, 0x00002042, 0x00050080, 0x0000000B, 0x000038F6, 0x0000578B,\n    0x000028A4, 0x000400A8, 0x00000009, 0x00003014, 0x00004376, 0x000300F7,\n    0x00004A60, 0x00000002, 0x000400FA, 0x00003014, 0x0000260D, 0x0000426F,\n    0x000200F8, 0x0000260D, 0x00050051, 0x0000000B, 0x00004437, 0x0000538B,\n    0x00000000, 0x00050051, 0x0000000B, 0x00002BEE, 0x0000538B, 0x00000001,\n    0x00050051, 0x0000000B, 0x00004971, 0x0000538B, 0x00000002, 0x00050084,\n    0x0000000B, 0x000039EF, 0x00005789, 0x00004971, 0x00050080, 0x0000000B,\n    0x00004F62, 0x00002BEE, 0x000039EF, 0x00050084, 0x0000000B, 0x000054AC,\n    0x00005788, 0x00004F62, 0x00050080, 0x0000000B, 0x00004FAE, 0x00004437,\n    0x000054AC, 0x000500C4, 0x0000000B, 0x00002C67, 0x00004FAE, 0x00000A0D,\n    0x000200F9, 0x00004A60, 0x000200F8, 0x0000426F, 0x000300F7, 0x00005BF0,\n    0x00000002, 0x000400FA, 0x00004384, 0x00002C92, 0x00005F21, 0x000200F8,\n    0x00002C92, 0x000500C2, 0x0000000B, 0x00005374, 0x00005788, 0x00000A1A,\n    0x000500C2, 0x0000000B, 0x000035EC, 0x00005789, 0x00000A17, 0x000500C3,\n    0x0000000C, 0x000033B5, 0x000018DA, 0x00000A11, 0x0004007C, 0x0000000C,\n    0x00005766, 0x000035EC, 0x00050084, 0x0000000C, 0x000061FD, 0x000033B5,\n    0x00005766, 0x000500C3, 0x0000000C, 0x00002D62, 0x000044BE, 0x00000A17,\n    0x00050080, 0x0000000C, 0x0000411E, 0x000061FD, 0x00002D62, 0x0004007C,\n    0x0000000C, 0x00004A78, 0x00005374, 0x00050084, 0x0000000C, 0x000032DC,\n    0x0000411E, 0x00004A78, 0x000500C3, 0x0000000C, 0x000032BA, 0x00005BEB,\n    0x00000A1A, 0x00050080, 0x0000000C, 0x00005FEE, 0x000032DC, 0x000032BA,\n    0x000500C4, 0x0000000C, 0x0000225D, 0x00005FEE, 0x00000A20, 0x000500C7,\n    0x0000000C, 0x00002CAA, 0x000018DA, 0x00000A14, 0x000500C4, 0x0000000C,\n    0x00004CAE, 0x00002CAA, 0x00000A1A, 0x000500C3, 0x0000000C, 0x0000383E,\n    0x000044BE, 0x00000A0E, 0x000500C7, 0x0000000C, 0x00005375, 0x0000383E,\n    0x00000A14, 0x000500C4, 0x0000000C, 0x000054CA, 0x00005375, 0x00000A14,\n    0x000500C5, 0x0000000C, 0x000042CE, 0x00004CAE, 0x000054CA, 0x000500C7,\n    0x0000000C, 0x000050D5, 0x00005BEB, 0x00000A20, 0x000500C5, 0x0000000C,\n    0x00003ADD, 0x000042CE, 0x000050D5, 0x000500C5, 0x0000000C, 0x000043B6,\n    0x0000225D, 0x00003ADD, 0x000500C4, 0x0000000C, 0x00005E50, 0x000043B6,\n    0x00000A0D, 0x000500C3, 0x0000000C, 0x000032D7, 0x000044BE, 0x00000A14,\n    0x000500C6, 0x0000000C, 0x000026C9, 0x000032D7, 0x000033B5, 0x000500C7,\n    0x0000000C, 0x00004199, 0x000026C9, 0x00000A0E, 0x000500C3, 0x0000000C,\n    0x00002590, 0x00005BEB, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000505E,\n    0x00002590, 0x00000A14, 0x000500C4, 0x0000000C, 0x0000541D, 0x00004199,\n    0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BA, 0x0000505E, 0x0000541D,\n    0x000500C7, 0x0000000C, 0x00005076, 0x000044BE, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x00005228, 0x00005076, 0x00000A17, 0x000500C4, 0x0000000C,\n    0x00001997, 0x000022BA, 0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FE,\n    0x00005228, 0x00001997, 0x000500C4, 0x0000000C, 0x00001C00, 0x00004199,\n    0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C81, 0x000047FE, 0x00001C00,\n    0x000500C7, 0x0000000C, 0x000050AF, 0x00005E50, 0x00000A39, 0x000500C5,\n    0x0000000C, 0x00003C70, 0x00003C81, 0x000050AF, 0x000500C3, 0x0000000C,\n    0x00003745, 0x00005E50, 0x00000A17, 0x000500C7, 0x0000000C, 0x000018B8,\n    0x00003745, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000547E, 0x000018B8,\n    0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A8, 0x00003C70, 0x0000547E,\n    0x000500C3, 0x0000000C, 0x00003A6E, 0x00005E50, 0x00000A1A, 0x000500C7,\n    0x0000000C, 0x000018B9, 0x00003A6E, 0x00000A20, 0x000500C4, 0x0000000C,\n    0x0000547F, 0x000018B9, 0x00000A23, 0x000500C5, 0x0000000C, 0x0000456F,\n    0x000045A8, 0x0000547F, 0x000500C3, 0x0000000C, 0x00003C88, 0x00005E50,\n    0x00000A23, 0x000500C4, 0x0000000C, 0x00002824, 0x00003C88, 0x00000A2F,\n    0x000500C5, 0x0000000C, 0x00003B79, 0x0000456F, 0x00002824, 0x0004007C,\n    0x0000000B, 0x000041E5, 0x00003B79, 0x000200F9, 0x00005BF0, 0x000200F8,\n    0x00005F21, 0x0004007C, 0x00000012, 0x000059D8, 0x000042F0, 0x000500C2,\n    0x0000000B, 0x00005668, 0x00005788, 0x00000A1A, 0x00050051, 0x0000000C,\n    0x00003905, 0x000059D8, 0x00000001, 0x000500C3, 0x0000000C, 0x00002F39,\n    0x00003905, 0x00000A1A, 0x0004007C, 0x0000000C, 0x00005780, 0x00005668,\n    0x00050084, 0x0000000C, 0x00001F02, 0x00002F39, 0x00005780, 0x00050051,\n    0x0000000C, 0x00006242, 0x000059D8, 0x00000000, 0x000500C3, 0x0000000C,\n    0x00004FC7, 0x00006242, 0x00000A1A, 0x00050080, 0x0000000C, 0x000049B0,\n    0x00001F02, 0x00004FC7, 0x000500C4, 0x0000000C, 0x0000254A, 0x000049B0,\n    0x00000A1D, 0x000500C3, 0x0000000C, 0x0000603B, 0x00003905, 0x00000A0E,\n    0x000500C7, 0x0000000C, 0x0000539A, 0x0000603B, 0x00000A20, 0x000500C4,\n    0x0000000C, 0x0000534A, 0x0000539A, 0x00000A14, 0x000500C7, 0x0000000C,\n    0x00004EA5, 0x00006242, 0x00000A20, 0x000500C5, 0x0000000C, 0x00002B1A,\n    0x0000534A, 0x00004EA5, 0x000500C5, 0x0000000C, 0x000043B7, 0x0000254A,\n    0x00002B1A, 0x000500C4, 0x0000000C, 0x00005E63, 0x000043B7, 0x00000A0D,\n    0x000500C3, 0x0000000C, 0x000031DE, 0x00003905, 0x00000A17, 0x000500C7,\n    0x0000000C, 0x00005447, 0x000031DE, 0x00000A0E, 0x000500C3, 0x0000000C,\n    0x000028A6, 0x00006242, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000511E,\n    0x000028A6, 0x00000A14, 0x000500C3, 0x0000000C, 0x000028B9, 0x00003905,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x0000505F, 0x000028B9, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x0000541E, 0x0000505F, 0x00000A0E, 0x000500C6,\n    0x0000000C, 0x000022BB, 0x0000511E, 0x0000541E, 0x000500C7, 0x0000000C,\n    0x00005077, 0x00003905, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005229,\n    0x00005077, 0x00000A17, 0x000500C4, 0x0000000C, 0x00001998, 0x000022BB,\n    0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FF, 0x00005229, 0x00001998,\n    0x000500C4, 0x0000000C, 0x00001C01, 0x00005447, 0x00000A2C, 0x000500C5,\n    0x0000000C, 0x00003C82, 0x000047FF, 0x00001C01, 0x000500C7, 0x0000000C,\n    0x000050B0, 0x00005E63, 0x00000A39, 0x000500C5, 0x0000000C, 0x00003C71,\n    0x00003C82, 0x000050B0, 0x000500C3, 0x0000000C, 0x00003746, 0x00005E63,\n    0x00000A17, 0x000500C7, 0x0000000C, 0x000018BA, 0x00003746, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x00005480, 0x000018BA, 0x00000A1A, 0x000500C5,\n    0x0000000C, 0x000045A9, 0x00003C71, 0x00005480, 0x000500C3, 0x0000000C,\n    0x00003A6F, 0x00005E63, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018BB,\n    0x00003A6F, 0x00000A20, 0x000500C4, 0x0000000C, 0x00005481, 0x000018BB,\n    0x00000A23, 0x000500C5, 0x0000000C, 0x00004570, 0x000045A9, 0x00005481,\n    0x000500C3, 0x0000000C, 0x00003C89, 0x00005E63, 0x00000A23, 0x000500C4,\n    0x0000000C, 0x00002825, 0x00003C89, 0x00000A2F, 0x000500C5, 0x0000000C,\n    0x00003B7A, 0x00004570, 0x00002825, 0x0004007C, 0x0000000B, 0x000041E6,\n    0x00003B7A, 0x000200F9, 0x00005BF0, 0x000200F8, 0x00005BF0, 0x000700F5,\n    0x0000000B, 0x0000292C, 0x000041E5, 0x00002C92, 0x000041E6, 0x00005F21,\n    0x000200F9, 0x00004A60, 0x000200F8, 0x00004A60, 0x000700F5, 0x0000000B,\n    0x00002C70, 0x00002C67, 0x0000260D, 0x0000292C, 0x00005BF0, 0x00050080,\n    0x0000000B, 0x000048BD, 0x00002C70, 0x00005EAC, 0x000500C2, 0x0000000B,\n    0x00003D52, 0x000048BD, 0x00000A17, 0x00060041, 0x00000294, 0x00004FAF,\n    0x0000107A, 0x00000A0B, 0x00003D52, 0x0004003D, 0x00000017, 0x00002261,\n    0x00004FAF, 0x000500AA, 0x00000009, 0x00005272, 0x000061E2, 0x00000A0D,\n    0x000300F7, 0x0000362B, 0x00000000, 0x000400FA, 0x00005272, 0x00002957,\n    0x0000362B, 0x000200F8, 0x00002957, 0x000500C7, 0x00000017, 0x0000475F,\n    0x00002261, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D1, 0x0000475F,\n    0x0000013D, 0x000500C7, 0x00000017, 0x000050AC, 0x00002261, 0x0000072E,\n    0x000500C2, 0x00000017, 0x0000448D, 0x000050AC, 0x0000013D, 0x000500C5,\n    0x00000017, 0x00003FF8, 0x000024D1, 0x0000448D, 0x000200F9, 0x0000362B,\n    0x000200F8, 0x0000362B, 0x000700F5, 0x00000017, 0x00004523, 0x00002261,\n    0x00004A60, 0x00003FF8, 0x00002957, 0x000500C2, 0x0000000B, 0x00004E2D,\n    0x000038F6, 0x00000A17, 0x0004007C, 0x0000001A, 0x00005C4A, 0x00004523,\n    0x000500C4, 0x0000001A, 0x00002C1C, 0x00005C4A, 0x00000302, 0x000500C3,\n    0x0000001A, 0x00004098, 0x00002C1C, 0x00000302, 0x0004006F, 0x0000001D,\n    0x00002A97, 0x00004098, 0x0005008E, 0x0000001D, 0x00004FBD, 0x00002A97,\n    0x00000A38, 0x0007000C, 0x0000001D, 0x00005DB5, 0x00000001, 0x00000028,\n    0x00000504, 0x00004FBD, 0x000500C3, 0x0000001A, 0x00003802, 0x00005C4A,\n    0x00000302, 0x0004006F, 0x0000001D, 0x000019CF, 0x00003802, 0x0005008E,\n    0x0000001D, 0x00004747, 0x000019CF, 0x00000A38, 0x0007000C, 0x0000001D,\n    0x00005E06, 0x00000001, 0x00000028, 0x00000504, 0x00004747, 0x00050051,\n    0x0000000D, 0x00005F0A, 0x00005DB5, 0x00000000, 0x00050051, 0x0000000D,\n    0x000037EF, 0x00005E06, 0x00000000, 0x00050050, 0x00000013, 0x00004B20,\n    0x00005F0A, 0x000037EF, 0x0006000C, 0x0000000B, 0x00002171, 0x00000001,\n    0x0000003A, 0x00004B20, 0x00050051, 0x0000000D, 0x00005BBF, 0x00005DB5,\n    0x00000001, 0x00050051, 0x0000000D, 0x000039A7, 0x00005E06, 0x00000001,\n    0x00050050, 0x00000013, 0x00004B21, 0x00005BBF, 0x000039A7, 0x0006000C,\n    0x0000000B, 0x00002172, 0x00000001, 0x0000003A, 0x00004B21, 0x00050051,\n    0x0000000D, 0x00005BC0, 0x00005DB5, 0x00000002, 0x00050051, 0x0000000D,\n    0x000039A8, 0x00005E06, 0x00000002, 0x00050050, 0x00000013, 0x00004B22,\n    0x00005BC0, 0x000039A8, 0x0006000C, 0x0000000B, 0x00002173, 0x00000001,\n    0x0000003A, 0x00004B22, 0x00050051, 0x0000000D, 0x00005BC1, 0x00005DB5,\n    0x00000003, 0x00050051, 0x0000000D, 0x000039A9, 0x00005E06, 0x00000003,\n    0x00050050, 0x00000013, 0x00004B0D, 0x00005BC1, 0x000039A9, 0x0006000C,\n    0x0000000B, 0x000020EE, 0x00000001, 0x0000003A, 0x00004B0D, 0x00070050,\n    0x00000017, 0x00003ABB, 0x00002171, 0x00002172, 0x00002173, 0x000020EE,\n    0x00060041, 0x00000294, 0x000045C3, 0x0000140E, 0x00000A0B, 0x00004E2D,\n    0x0003003E, 0x000045C3, 0x00003ABB, 0x00050080, 0x0000000B, 0x000054B5,\n    0x000038F6, 0x00000A3A, 0x000300F7, 0x00006070, 0x00000002, 0x000400FA,\n    0x00004376, 0x000055E9, 0x00001C25, 0x000200F8, 0x000055E9, 0x000200F9,\n    0x00006070, 0x000200F8, 0x00001C25, 0x000200F9, 0x00006070, 0x000200F8,\n    0x00006070, 0x000700F5, 0x0000000B, 0x00002C71, 0x00000ACA, 0x000055E9,\n    0x00000A3A, 0x00001C25, 0x00050080, 0x0000000B, 0x000048BE, 0x000048BD,\n    0x00002C71, 0x000500C2, 0x0000000B, 0x00003D53, 0x000048BE, 0x00000A17,\n    0x00060041, 0x00000294, 0x00005566, 0x0000107A, 0x00000A0B, 0x00003D53,\n    0x0004003D, 0x00000017, 0x00003910, 0x00005566, 0x000300F7, 0x0000362C,\n    0x00000000, 0x000400FA, 0x00005272, 0x00002958, 0x0000362C, 0x000200F8,\n    0x00002958, 0x000500C7, 0x00000017, 0x00004760, 0x00003910, 0x000009CE,\n    0x000500C4, 0x00000017, 0x000024D2, 0x00004760, 0x0000013D, 0x000500C7,\n    0x00000017, 0x000050AD, 0x00003910, 0x0000072E, 0x000500C2, 0x00000017,\n    0x0000448E, 0x000050AD, 0x0000013D, 0x000500C5, 0x00000017, 0x00003FF9,\n    0x000024D2, 0x0000448E, 0x000200F9, 0x0000362C, 0x000200F8, 0x0000362C,\n    0x000700F5, 0x00000017, 0x00004524, 0x00003910, 0x00006070, 0x00003FF9,\n    0x00002958, 0x000500C2, 0x0000000B, 0x00004E2E, 0x000054B5, 0x00000A17,\n    0x0004007C, 0x0000001A, 0x00005C4B, 0x00004524, 0x000500C4, 0x0000001A,\n    0x00002C1D, 0x00005C4B, 0x00000302, 0x000500C3, 0x0000001A, 0x00004099,\n    0x00002C1D, 0x00000302, 0x0004006F, 0x0000001D, 0x00002A98, 0x00004099,\n    0x0005008E, 0x0000001D, 0x00004FBE, 0x00002A98, 0x00000A38, 0x0007000C,\n    0x0000001D, 0x00005DB6, 0x00000001, 0x00000028, 0x00000504, 0x00004FBE,\n    0x000500C3, 0x0000001A, 0x00003803, 0x00005C4B, 0x00000302, 0x0004006F,\n    0x0000001D, 0x000019D0, 0x00003803, 0x0005008E, 0x0000001D, 0x00004748,\n    0x000019D0, 0x00000A38, 0x0007000C, 0x0000001D, 0x00005E07, 0x00000001,\n    0x00000028, 0x00000504, 0x00004748, 0x00050051, 0x0000000D, 0x00005F0B,\n    0x00005DB6, 0x00000000, 0x00050051, 0x0000000D, 0x000037F0, 0x00005E07,\n    0x00000000, 0x00050050, 0x00000013, 0x00004B23, 0x00005F0B, 0x000037F0,\n    0x0006000C, 0x0000000B, 0x00002174, 0x00000001, 0x0000003A, 0x00004B23,\n    0x00050051, 0x0000000D, 0x00005BC2, 0x00005DB6, 0x00000001, 0x00050051,\n    0x0000000D, 0x000039AA, 0x00005E07, 0x00000001, 0x00050050, 0x00000013,\n    0x00004B24, 0x00005BC2, 0x000039AA, 0x0006000C, 0x0000000B, 0x00002175,\n    0x00000001, 0x0000003A, 0x00004B24, 0x00050051, 0x0000000D, 0x00005BC3,\n    0x00005DB6, 0x00000002, 0x00050051, 0x0000000D, 0x000039AB, 0x00005E07,\n    0x00000002, 0x00050050, 0x00000013, 0x00004B25, 0x00005BC3, 0x000039AB,\n    0x0006000C, 0x0000000B, 0x00002176, 0x00000001, 0x0000003A, 0x00004B25,\n    0x00050051, 0x0000000D, 0x00005BC4, 0x00005DB6, 0x00000003, 0x00050051,\n    0x0000000D, 0x000039AC, 0x00005E07, 0x00000003, 0x00050050, 0x00000013,\n    0x00004B0E, 0x00005BC4, 0x000039AC, 0x0006000C, 0x0000000B, 0x000020EF,\n    0x00000001, 0x0000003A, 0x00004B0E, 0x00070050, 0x00000017, 0x00003ABC,\n    0x00002174, 0x00002175, 0x00002176, 0x000020EF, 0x00060041, 0x00000294,\n    0x00004EBE, 0x0000140E, 0x00000A0B, 0x00004E2E, 0x0003003E, 0x00004EBE,\n    0x00003ABC, 0x000200F9, 0x00004C7A, 0x000200F8, 0x00004C7A, 0x000100FD,\n    0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_r16_snorm_float_scaled_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25157\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n      %float = OpTypeFloat 32\n    %v4float = OpTypeVector %float 4\n     %v4uint = OpTypeVector %uint 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v3uint = OpTypeVector %uint 3\n   %float_n1 = OpConstant %float -1\n      %v4int = OpTypeVector %int 4\n     %int_16 = OpConstant %int 16\n%float_3_05185094en05 = OpConstant %float 3.05185094e-05\n     %uint_0 = OpConstant %uint 0\n    %v2float = OpTypeVector %float 2\n     %uint_1 = OpConstant %uint 1\n     %uint_2 = OpConstant %uint 2\n     %uint_3 = OpConstant %uint 3\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n      %int_3 = OpConstant %int 3\n      %int_2 = OpConstant %int 2\n     %uint_5 = OpConstant %uint 5\n     %uint_4 = OpConstant %uint 4\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n     %uint_7 = OpConstant %uint 7\n       %1927 = OpConstantComposite %v2uint %uint_4 %uint_7\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %2612 = OpConstantComposite %v3uint %uint_4 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n    %uint_16 = OpConstant %uint 16\n    %uint_32 = OpConstant %uint 32\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %1954 = OpConstantComposite %v2uint %uint_7 %uint_7\n       %1867 = OpConstantComposite %v2uint %uint_4 %uint_2\n    %uint_15 = OpConstant %uint 15\n       %1978 = OpConstantComposite %v2uint %uint_15 %uint_3\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n       %1284 = OpConstantComposite %v4float %float_n1 %float_n1 %float_n1 %float_n1\n        %770 = OpConstantComposite %v4int %int_16 %int_16 %int_16 %int_16\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24445 = OpBitwiseAnd %uint %13606 %uint_2\n      %18667 = OpINotEqual %bool %24445 %uint_0\n       %8141 = OpShiftRightLogical %uint %13606 %uint_2\n      %24990 = OpBitwiseAnd %uint %8141 %uint_3\n       %8871 = OpCompositeConstruct %v2uint %13606 %13606\n       %7087 = OpShiftRightLogical %v2uint %8871 %1927\n       %6551 = OpBitwiseAnd %v2uint %7087 %1954\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2612\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %6586 DontFlatten\n               OpBranchConditional %24679 %21992 %6586\n      %21992 = OpLabel\n               OpBranch %19578\n       %6586 = OpLabel\n      %23478 = OpBitcast %v3int %21387\n      %18710 = OpCompositeExtract %uint %22410 1\n      %23531 = OpCompositeExtract %int %23478 0\n      %22810 = OpIMul %int %23531 %int_2\n       %6362 = OpCompositeExtract %int %23478 2\n      %14505 = OpBitcast %int %18710\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %23478 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %6594\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %22810 %24535\n      %10898 = OpBitcast %uint %8258\n       %7937 = OpIAdd %uint %22411 %10898\n      %19921 = OpShiftRightLogical %v2uint %17136 %1867\n       %7712 = OpUDiv %v2uint %19921 %6551\n      %18183 = OpIMul %v2uint %6551 %7712\n      %18273 = OpISub %v2uint %19921 %18183\n      %11232 = OpShiftLeftLogical %v2uint %7712 %1867\n      %13284 = OpCompositeExtract %uint %18273 0\n      %10872 = OpCompositeExtract %uint %6551 1\n      %22886 = OpIMul %uint %13284 %10872\n       %6943 = OpCompositeExtract %uint %18273 1\n      %10469 = OpIAdd %uint %22886 %6943\n      %18851 = OpBitwiseAnd %v2uint %17136 %1978\n      %10581 = OpShiftLeftLogical %uint %10469 %uint_7\n      %20916 = OpCompositeExtract %uint %18851 1\n      %23596 = OpShiftLeftLogical %uint %20916 %uint_5\n      %19814 = OpBitwiseOr %uint %10581 %23596\n      %21476 = OpCompositeExtract %uint %18851 0\n       %8560 = OpShiftLeftLogical %uint %21476 %uint_1\n      %17648 = OpBitwiseOr %uint %19814 %8560\n      %19923 = OpCompositeExtract %uint %11232 0\n      %15556 = OpCompositeInsert %v3uint %19923 %21387 0\n      %23006 = OpCompositeExtract %uint %11232 1\n       %9680 = OpCompositeInsert %v3uint %23006 %15556 1\n               OpSelectionMerge %20344 DontFlatten\n               OpBranchConditional %18667 %23520 %11737\n      %23520 = OpLabel\n      %10111 = OpBitcast %v3int %9680\n      %19476 = OpShiftRightLogical %uint %22408 %int_5\n      %18810 = OpShiftRightLogical %uint %22409 %int_4\n       %6782 = OpCompositeExtract %int %10111 2\n      %12089 = OpShiftRightArithmetic %int %6782 %int_2\n      %22400 = OpBitcast %int %18810\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %10111 1\n      %19055 = OpShiftRightArithmetic %int %25154 %int_4\n      %11052 = OpIAdd %int %7938 %19055\n      %16898 = OpBitcast %int %19476\n      %14944 = OpIMul %int %11052 %16898\n      %25155 = OpCompositeExtract %int %10111 0\n      %20423 = OpShiftRightArithmetic %int %25155 %int_5\n      %18940 = OpIAdd %int %14944 %20423\n       %8797 = OpShiftLeftLogical %int %18940 %int_7\n      %11434 = OpBitwiseAnd %int %6782 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %25154 %int_1\n      %21364 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21364 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %25155 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17334 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17334 %uint_1\n      %13015 = OpShiftRightArithmetic %int %25154 %int_3\n       %9929 = OpBitwiseXor %int %13015 %12089\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %25155 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %25154 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6552 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6552\n       %7168 = OpShiftLeftLogical %int %16793 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24144 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24144 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24144 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24144 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %20344\n      %11737 = OpLabel\n      %11908 = OpVectorShuffle %v2uint %9680 %9680 0 1\n      %20347 = OpBitcast %v2int %11908\n      %11433 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %20347 1\n      %12090 = OpShiftRightArithmetic %int %14597 %int_5\n      %22401 = OpBitcast %int %11433\n       %7939 = OpIMul %int %12090 %22401\n      %25156 = OpCompositeExtract %int %20347 0\n      %20424 = OpShiftRightArithmetic %int %25156 %int_5\n      %18864 = OpIAdd %int %7939 %20424\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25156 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17335 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17335 %uint_1\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25156 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6553 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6553\n       %7169 = OpShiftLeftLogical %int %21575 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24163 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24163 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24163 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %20344\n      %20344 = OpLabel\n      %18329 = OpPhi %uint %16869 %23520 %16870 %11737\n      %15200 = OpCompositeExtract %uint %6551 0\n      %17489 = OpIMul %uint %15200 %10872\n       %7313 = OpIMul %uint %18329 %17489\n       %8815 = OpIAdd %uint %7313 %17648\n      %21470 = OpIAdd %uint %8815 %24236\n      %14664 = OpShiftRightLogical %uint %21470 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %14664\n       %8801 = OpLoad %v4uint %20399\n      %21106 = OpIEqual %bool %24990 %uint_1\n               OpSelectionMerge %13867 None\n               OpBranchConditional %21106 %10583 %13867\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %8801 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %8801 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13867\n      %13867 = OpLabel\n      %17699 = OpPhi %v4uint %8801 %20344 %16376 %10583\n      %20013 = OpShiftRightLogical %uint %7937 %int_4\n      %23626 = OpBitcast %v4int %17699\n      %11292 = OpShiftLeftLogical %v4int %23626 %770\n      %16536 = OpShiftRightArithmetic %v4int %11292 %770\n      %10903 = OpConvertSToF %v4float %16536\n      %20413 = OpVectorTimesScalar %v4float %10903 %float_3_05185094en05\n      %23989 = OpExtInst %v4float %1 FMax %1284 %20413\n      %14338 = OpShiftRightArithmetic %v4int %23626 %770\n       %6607 = OpConvertSToF %v4float %14338\n      %18247 = OpVectorTimesScalar %v4float %6607 %float_3_05185094en05\n      %24070 = OpExtInst %v4float %1 FMax %1284 %18247\n      %24330 = OpCompositeExtract %float %23989 0\n      %14319 = OpCompositeExtract %float %24070 0\n      %19232 = OpCompositeConstruct %v2float %24330 %14319\n       %8561 = OpExtInst %uint %1 PackHalf2x16 %19232\n      %23487 = OpCompositeExtract %float %23989 1\n      %14759 = OpCompositeExtract %float %24070 1\n      %19233 = OpCompositeConstruct %v2float %23487 %14759\n       %8562 = OpExtInst %uint %1 PackHalf2x16 %19233\n      %23488 = OpCompositeExtract %float %23989 2\n      %14760 = OpCompositeExtract %float %24070 2\n      %19234 = OpCompositeConstruct %v2float %23488 %14760\n       %8563 = OpExtInst %uint %1 PackHalf2x16 %19234\n      %23489 = OpCompositeExtract %float %23989 3\n      %14761 = OpCompositeExtract %float %24070 3\n      %19213 = OpCompositeConstruct %v2float %23489 %14761\n       %8430 = OpExtInst %uint %1 PackHalf2x16 %19213\n      %15035 = OpCompositeConstruct %v4uint %8561 %8562 %8563 %8430\n      %17859 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %20013\n               OpStore %17859 %15035\n      %22137 = OpIAdd %uint %7937 %uint_16\n      %10214 = OpIAdd %uint %21470 %uint_16\n      %14665 = OpShiftRightLogical %uint %10214 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %14665\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %13868 None\n               OpBranchConditional %21106 %10584 %13868\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %13868\n      %13868 = OpLabel\n      %17700 = OpPhi %v4uint %14608 %13867 %16377 %10584\n      %20014 = OpShiftRightLogical %uint %22137 %int_4\n      %23627 = OpBitcast %v4int %17700\n      %11293 = OpShiftLeftLogical %v4int %23627 %770\n      %16537 = OpShiftRightArithmetic %v4int %11293 %770\n      %10904 = OpConvertSToF %v4float %16537\n      %20414 = OpVectorTimesScalar %v4float %10904 %float_3_05185094en05\n      %23990 = OpExtInst %v4float %1 FMax %1284 %20414\n      %14339 = OpShiftRightArithmetic %v4int %23627 %770\n       %6608 = OpConvertSToF %v4float %14339\n      %18248 = OpVectorTimesScalar %v4float %6608 %float_3_05185094en05\n      %24071 = OpExtInst %v4float %1 FMax %1284 %18248\n      %24331 = OpCompositeExtract %float %23990 0\n      %14320 = OpCompositeExtract %float %24071 0\n      %19235 = OpCompositeConstruct %v2float %24331 %14320\n       %8564 = OpExtInst %uint %1 PackHalf2x16 %19235\n      %23490 = OpCompositeExtract %float %23990 1\n      %14762 = OpCompositeExtract %float %24071 1\n      %19236 = OpCompositeConstruct %v2float %23490 %14762\n       %8565 = OpExtInst %uint %1 PackHalf2x16 %19236\n      %23491 = OpCompositeExtract %float %23990 2\n      %14763 = OpCompositeExtract %float %24071 2\n      %19237 = OpCompositeConstruct %v2float %23491 %14763\n       %8566 = OpExtInst %uint %1 PackHalf2x16 %19237\n      %23492 = OpCompositeExtract %float %23990 3\n      %14764 = OpCompositeExtract %float %24071 3\n      %19214 = OpCompositeConstruct %v2float %23492 %14764\n       %8431 = OpExtInst %uint %1 PackHalf2x16 %19214\n      %15036 = OpCompositeConstruct %v4uint %8564 %8565 %8566 %8431\n      %20158 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %20014\n               OpStore %20158 %15036\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_r16_snorm_float_scaled_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006245, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00030016, 0x0000000D,\n    0x00000020, 0x00040017, 0x0000001D, 0x0000000D, 0x00000004, 0x00040017,\n    0x00000017, 0x0000000B, 0x00000004, 0x00040015, 0x0000000C, 0x00000020,\n    0x00000001, 0x00040017, 0x00000012, 0x0000000C, 0x00000002, 0x00040017,\n    0x00000016, 0x0000000C, 0x00000003, 0x00020014, 0x00000009, 0x00040017,\n    0x00000014, 0x0000000B, 0x00000003, 0x0004002B, 0x0000000D, 0x00000341,\n    0xBF800000, 0x00040017, 0x0000001A, 0x0000000C, 0x00000004, 0x0004002B,\n    0x0000000C, 0x00000A3B, 0x00000010, 0x0004002B, 0x0000000D, 0x00000A38,\n    0x38000100, 0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000, 0x00040017,\n    0x00000013, 0x0000000D, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A0D,\n    0x00000001, 0x0004002B, 0x0000000B, 0x00000A10, 0x00000002, 0x0004002B,\n    0x0000000B, 0x00000A13, 0x00000003, 0x0004002B, 0x0000000B, 0x000008A6,\n    0x00FF00FF, 0x0004002B, 0x0000000B, 0x00000A22, 0x00000008, 0x0004002B,\n    0x0000000B, 0x000005FD, 0xFF00FF00, 0x0004002B, 0x0000000C, 0x00000A17,\n    0x00000004, 0x0004002B, 0x0000000C, 0x00000A1D, 0x00000006, 0x0004002B,\n    0x0000000C, 0x00000A2C, 0x0000000B, 0x0004002B, 0x0000000C, 0x00000A39,\n    0x0000000F, 0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001, 0x0004002B,\n    0x0000000C, 0x00000A1A, 0x00000005, 0x0004002B, 0x0000000C, 0x00000A20,\n    0x00000007, 0x0004002B, 0x0000000C, 0x00000A23, 0x00000008, 0x0004002B,\n    0x0000000C, 0x00000A2F, 0x0000000C, 0x0004002B, 0x0000000C, 0x00000A14,\n    0x00000003, 0x0004002B, 0x0000000C, 0x00000A11, 0x00000002, 0x0004002B,\n    0x0000000B, 0x00000A19, 0x00000005, 0x0004002B, 0x0000000B, 0x00000A16,\n    0x00000004, 0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000, 0x000A001E,\n    0x00000489, 0x0000000B, 0x0000000B, 0x0000000B, 0x0000000B, 0x00000014,\n    0x0000000B, 0x0000000B, 0x0000000B, 0x00040020, 0x00000706, 0x00000009,\n    0x00000489, 0x0004003B, 0x00000706, 0x00000CE9, 0x00000009, 0x00040020,\n    0x00000288, 0x00000009, 0x0000000B, 0x0004002B, 0x0000000B, 0x00000A1F,\n    0x00000007, 0x0005002C, 0x00000011, 0x00000787, 0x00000A16, 0x00000A1F,\n    0x00040020, 0x00000291, 0x00000009, 0x00000014, 0x00040020, 0x00000292,\n    0x00000001, 0x00000014, 0x0004003B, 0x00000292, 0x00000F48, 0x00000001,\n    0x0006002C, 0x00000014, 0x00000A34, 0x00000A16, 0x00000A0A, 0x00000A0A,\n    0x00040017, 0x0000000F, 0x00000009, 0x00000002, 0x0003001D, 0x000007DC,\n    0x00000017, 0x0003001E, 0x000007B4, 0x000007DC, 0x00040020, 0x00000A31,\n    0x00000002, 0x000007B4, 0x0004003B, 0x00000A31, 0x0000107A, 0x00000002,\n    0x00040020, 0x00000294, 0x00000002, 0x00000017, 0x0003001D, 0x000007DD,\n    0x00000017, 0x0003001E, 0x000007B5, 0x000007DD, 0x00040020, 0x00000A32,\n    0x00000002, 0x000007B5, 0x0004003B, 0x00000A32, 0x0000140E, 0x00000002,\n    0x0004002B, 0x0000000B, 0x00000A3A, 0x00000010, 0x0004002B, 0x0000000B,\n    0x00000A6A, 0x00000020, 0x0006002C, 0x00000014, 0x00000BC3, 0x00000A16,\n    0x00000A6A, 0x00000A0D, 0x0005002C, 0x00000011, 0x000007A2, 0x00000A1F,\n    0x00000A1F, 0x0005002C, 0x00000011, 0x0000074B, 0x00000A16, 0x00000A10,\n    0x0004002B, 0x0000000B, 0x00000A37, 0x0000000F, 0x0005002C, 0x00000011,\n    0x000007BA, 0x00000A37, 0x00000A13, 0x0007002C, 0x00000017, 0x000009CE,\n    0x000008A6, 0x000008A6, 0x000008A6, 0x000008A6, 0x0007002C, 0x00000017,\n    0x0000013D, 0x00000A22, 0x00000A22, 0x00000A22, 0x00000A22, 0x0007002C,\n    0x00000017, 0x0000072E, 0x000005FD, 0x000005FD, 0x000005FD, 0x000005FD,\n    0x0007002C, 0x0000001D, 0x00000504, 0x00000341, 0x00000341, 0x00000341,\n    0x00000341, 0x0007002C, 0x0000001A, 0x00000302, 0x00000A3B, 0x00000A3B,\n    0x00000A3B, 0x00000A3B, 0x00050036, 0x00000008, 0x0000161F, 0x00000000,\n    0x00000502, 0x000200F8, 0x00003B06, 0x000300F7, 0x00004C7A, 0x00000000,\n    0x000300FB, 0x00000A0A, 0x00002E68, 0x000200F8, 0x00002E68, 0x00050041,\n    0x00000288, 0x000060D7, 0x00000CE9, 0x00000A0B, 0x0004003D, 0x0000000B,\n    0x00003526, 0x000060D7, 0x000500C7, 0x0000000B, 0x00005F7D, 0x00003526,\n    0x00000A10, 0x000500AB, 0x00000009, 0x000048EB, 0x00005F7D, 0x00000A0A,\n    0x000500C2, 0x0000000B, 0x00001FCD, 0x00003526, 0x00000A10, 0x000500C7,\n    0x0000000B, 0x0000619E, 0x00001FCD, 0x00000A13, 0x00050050, 0x00000011,\n    0x000022A7, 0x00003526, 0x00003526, 0x000500C2, 0x00000011, 0x00001BAF,\n    0x000022A7, 0x00000787, 0x000500C7, 0x00000011, 0x00001997, 0x00001BAF,\n    0x000007A2, 0x00050041, 0x00000288, 0x0000492C, 0x00000CE9, 0x00000A0E,\n    0x0004003D, 0x0000000B, 0x00005EAC, 0x0000492C, 0x00050041, 0x00000288,\n    0x00004EBA, 0x00000CE9, 0x00000A11, 0x0004003D, 0x0000000B, 0x00005788,\n    0x00004EBA, 0x00050041, 0x00000288, 0x00004EBB, 0x00000CE9, 0x00000A14,\n    0x0004003D, 0x0000000B, 0x00005789, 0x00004EBB, 0x00050041, 0x00000291,\n    0x00004EBC, 0x00000CE9, 0x00000A17, 0x0004003D, 0x00000014, 0x0000578A,\n    0x00004EBC, 0x00050041, 0x00000288, 0x00004EBD, 0x00000CE9, 0x00000A1A,\n    0x0004003D, 0x0000000B, 0x0000578B, 0x00004EBD, 0x00050041, 0x00000288,\n    0x00004E6E, 0x00000CE9, 0x00000A1D, 0x0004003D, 0x0000000B, 0x000019C2,\n    0x00004E6E, 0x0004003D, 0x00000014, 0x00002A0E, 0x00000F48, 0x000500C4,\n    0x00000014, 0x0000538B, 0x00002A0E, 0x00000A34, 0x0007004F, 0x00000011,\n    0x000042F0, 0x0000538B, 0x0000538B, 0x00000000, 0x00000001, 0x0007004F,\n    0x00000011, 0x0000242F, 0x0000578A, 0x0000578A, 0x00000000, 0x00000001,\n    0x000500AE, 0x0000000F, 0x00004288, 0x000042F0, 0x0000242F, 0x0004009A,\n    0x00000009, 0x00006067, 0x00004288, 0x000300F7, 0x000019BA, 0x00000002,\n    0x000400FA, 0x00006067, 0x000055E8, 0x000019BA, 0x000200F8, 0x000055E8,\n    0x000200F9, 0x00004C7A, 0x000200F8, 0x000019BA, 0x0004007C, 0x00000016,\n    0x00005BB6, 0x0000538B, 0x00050051, 0x0000000B, 0x00004916, 0x0000578A,\n    0x00000001, 0x00050051, 0x0000000C, 0x00005BEB, 0x00005BB6, 0x00000000,\n    0x00050084, 0x0000000C, 0x0000591A, 0x00005BEB, 0x00000A11, 0x00050051,\n    0x0000000C, 0x000018DA, 0x00005BB6, 0x00000002, 0x0004007C, 0x0000000C,\n    0x000038A9, 0x00004916, 0x00050084, 0x0000000C, 0x00002C0F, 0x000018DA,\n    0x000038A9, 0x00050051, 0x0000000C, 0x000044BE, 0x00005BB6, 0x00000001,\n    0x00050080, 0x0000000C, 0x000056D4, 0x00002C0F, 0x000044BE, 0x0004007C,\n    0x0000000C, 0x00005785, 0x000019C2, 0x00050084, 0x0000000C, 0x00005FD7,\n    0x000056D4, 0x00005785, 0x00050080, 0x0000000C, 0x00002042, 0x0000591A,\n    0x00005FD7, 0x0004007C, 0x0000000B, 0x00002A92, 0x00002042, 0x00050080,\n    0x0000000B, 0x00001F01, 0x0000578B, 0x00002A92, 0x000500C2, 0x00000011,\n    0x00004DD1, 0x000042F0, 0x0000074B, 0x00050086, 0x00000011, 0x00001E20,\n    0x00004DD1, 0x00001997, 0x00050084, 0x00000011, 0x00004707, 0x00001997,\n    0x00001E20, 0x00050082, 0x00000011, 0x00004761, 0x00004DD1, 0x00004707,\n    0x000500C4, 0x00000011, 0x00002BE0, 0x00001E20, 0x0000074B, 0x00050051,\n    0x0000000B, 0x000033E4, 0x00004761, 0x00000000, 0x00050051, 0x0000000B,\n    0x00002A78, 0x00001997, 0x00000001, 0x00050084, 0x0000000B, 0x00005966,\n    0x000033E4, 0x00002A78, 0x00050051, 0x0000000B, 0x00001B1F, 0x00004761,\n    0x00000001, 0x00050080, 0x0000000B, 0x000028E5, 0x00005966, 0x00001B1F,\n    0x000500C7, 0x00000011, 0x000049A3, 0x000042F0, 0x000007BA, 0x000500C4,\n    0x0000000B, 0x00002955, 0x000028E5, 0x00000A1F, 0x00050051, 0x0000000B,\n    0x000051B4, 0x000049A3, 0x00000001, 0x000500C4, 0x0000000B, 0x00005C2C,\n    0x000051B4, 0x00000A19, 0x000500C5, 0x0000000B, 0x00004D66, 0x00002955,\n    0x00005C2C, 0x00050051, 0x0000000B, 0x000053E4, 0x000049A3, 0x00000000,\n    0x000500C4, 0x0000000B, 0x00002170, 0x000053E4, 0x00000A0D, 0x000500C5,\n    0x0000000B, 0x000044F0, 0x00004D66, 0x00002170, 0x00050051, 0x0000000B,\n    0x00004DD3, 0x00002BE0, 0x00000000, 0x00060052, 0x00000014, 0x00003CC4,\n    0x00004DD3, 0x0000538B, 0x00000000, 0x00050051, 0x0000000B, 0x000059DE,\n    0x00002BE0, 0x00000001, 0x00060052, 0x00000014, 0x000025D0, 0x000059DE,\n    0x00003CC4, 0x00000001, 0x000300F7, 0x00004F78, 0x00000002, 0x000400FA,\n    0x000048EB, 0x00005BE0, 0x00002DD9, 0x000200F8, 0x00005BE0, 0x0004007C,\n    0x00000016, 0x0000277F, 0x000025D0, 0x000500C2, 0x0000000B, 0x00004C14,\n    0x00005788, 0x00000A1A, 0x000500C2, 0x0000000B, 0x0000497A, 0x00005789,\n    0x00000A17, 0x00050051, 0x0000000C, 0x00001A7E, 0x0000277F, 0x00000002,\n    0x000500C3, 0x0000000C, 0x00002F39, 0x00001A7E, 0x00000A11, 0x0004007C,\n    0x0000000C, 0x00005780, 0x0000497A, 0x00050084, 0x0000000C, 0x00001F02,\n    0x00002F39, 0x00005780, 0x00050051, 0x0000000C, 0x00006242, 0x0000277F,\n    0x00000001, 0x000500C3, 0x0000000C, 0x00004A6F, 0x00006242, 0x00000A17,\n    0x00050080, 0x0000000C, 0x00002B2C, 0x00001F02, 0x00004A6F, 0x0004007C,\n    0x0000000C, 0x00004202, 0x00004C14, 0x00050084, 0x0000000C, 0x00003A60,\n    0x00002B2C, 0x00004202, 0x00050051, 0x0000000C, 0x00006243, 0x0000277F,\n    0x00000000, 0x000500C3, 0x0000000C, 0x00004FC7, 0x00006243, 0x00000A1A,\n    0x00050080, 0x0000000C, 0x000049FC, 0x00003A60, 0x00004FC7, 0x000500C4,\n    0x0000000C, 0x0000225D, 0x000049FC, 0x00000A20, 0x000500C7, 0x0000000C,\n    0x00002CAA, 0x00001A7E, 0x00000A14, 0x000500C4, 0x0000000C, 0x00004CAE,\n    0x00002CAA, 0x00000A1A, 0x000500C3, 0x0000000C, 0x0000383E, 0x00006242,\n    0x00000A0E, 0x000500C7, 0x0000000C, 0x00005374, 0x0000383E, 0x00000A14,\n    0x000500C4, 0x0000000C, 0x000054CA, 0x00005374, 0x00000A14, 0x000500C5,\n    0x0000000C, 0x000042CE, 0x00004CAE, 0x000054CA, 0x000500C7, 0x0000000C,\n    0x000050D5, 0x00006243, 0x00000A20, 0x000500C5, 0x0000000C, 0x00003ADD,\n    0x000042CE, 0x000050D5, 0x000500C5, 0x0000000C, 0x000043B6, 0x0000225D,\n    0x00003ADD, 0x000500C4, 0x0000000C, 0x00005E50, 0x000043B6, 0x00000A0D,\n    0x000500C3, 0x0000000C, 0x000032D7, 0x00006242, 0x00000A14, 0x000500C6,\n    0x0000000C, 0x000026C9, 0x000032D7, 0x00002F39, 0x000500C7, 0x0000000C,\n    0x00004199, 0x000026C9, 0x00000A0E, 0x000500C3, 0x0000000C, 0x00002590,\n    0x00006243, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000505E, 0x00002590,\n    0x00000A14, 0x000500C4, 0x0000000C, 0x0000541D, 0x00004199, 0x00000A0E,\n    0x000500C6, 0x0000000C, 0x000022BA, 0x0000505E, 0x0000541D, 0x000500C7,\n    0x0000000C, 0x00005076, 0x00006242, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x00005228, 0x00005076, 0x00000A17, 0x000500C4, 0x0000000C, 0x00001998,\n    0x000022BA, 0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FE, 0x00005228,\n    0x00001998, 0x000500C4, 0x0000000C, 0x00001C00, 0x00004199, 0x00000A2C,\n    0x000500C5, 0x0000000C, 0x00003C81, 0x000047FE, 0x00001C00, 0x000500C7,\n    0x0000000C, 0x000050AF, 0x00005E50, 0x00000A39, 0x000500C5, 0x0000000C,\n    0x00003C70, 0x00003C81, 0x000050AF, 0x000500C3, 0x0000000C, 0x00003745,\n    0x00005E50, 0x00000A17, 0x000500C7, 0x0000000C, 0x000018B8, 0x00003745,\n    0x00000A0E, 0x000500C4, 0x0000000C, 0x0000547E, 0x000018B8, 0x00000A1A,\n    0x000500C5, 0x0000000C, 0x000045A8, 0x00003C70, 0x0000547E, 0x000500C3,\n    0x0000000C, 0x00003A6E, 0x00005E50, 0x00000A1A, 0x000500C7, 0x0000000C,\n    0x000018B9, 0x00003A6E, 0x00000A20, 0x000500C4, 0x0000000C, 0x0000547F,\n    0x000018B9, 0x00000A23, 0x000500C5, 0x0000000C, 0x0000456F, 0x000045A8,\n    0x0000547F, 0x000500C3, 0x0000000C, 0x00003C88, 0x00005E50, 0x00000A23,\n    0x000500C4, 0x0000000C, 0x00002824, 0x00003C88, 0x00000A2F, 0x000500C5,\n    0x0000000C, 0x00003B79, 0x0000456F, 0x00002824, 0x0004007C, 0x0000000B,\n    0x000041E5, 0x00003B79, 0x000200F9, 0x00004F78, 0x000200F8, 0x00002DD9,\n    0x0007004F, 0x00000011, 0x00002E84, 0x000025D0, 0x000025D0, 0x00000000,\n    0x00000001, 0x0004007C, 0x00000012, 0x00004F7B, 0x00002E84, 0x000500C2,\n    0x0000000B, 0x00002CA9, 0x00005788, 0x00000A1A, 0x00050051, 0x0000000C,\n    0x00003905, 0x00004F7B, 0x00000001, 0x000500C3, 0x0000000C, 0x00002F3A,\n    0x00003905, 0x00000A1A, 0x0004007C, 0x0000000C, 0x00005781, 0x00002CA9,\n    0x00050084, 0x0000000C, 0x00001F03, 0x00002F3A, 0x00005781, 0x00050051,\n    0x0000000C, 0x00006244, 0x00004F7B, 0x00000000, 0x000500C3, 0x0000000C,\n    0x00004FC8, 0x00006244, 0x00000A1A, 0x00050080, 0x0000000C, 0x000049B0,\n    0x00001F03, 0x00004FC8, 0x000500C4, 0x0000000C, 0x0000254A, 0x000049B0,\n    0x00000A1D, 0x000500C3, 0x0000000C, 0x0000603B, 0x00003905, 0x00000A0E,\n    0x000500C7, 0x0000000C, 0x0000539A, 0x0000603B, 0x00000A20, 0x000500C4,\n    0x0000000C, 0x0000534A, 0x0000539A, 0x00000A14, 0x000500C7, 0x0000000C,\n    0x00004EA5, 0x00006244, 0x00000A20, 0x000500C5, 0x0000000C, 0x00002B1A,\n    0x0000534A, 0x00004EA5, 0x000500C5, 0x0000000C, 0x000043B7, 0x0000254A,\n    0x00002B1A, 0x000500C4, 0x0000000C, 0x00005E63, 0x000043B7, 0x00000A0D,\n    0x000500C3, 0x0000000C, 0x000031DE, 0x00003905, 0x00000A17, 0x000500C7,\n    0x0000000C, 0x00005447, 0x000031DE, 0x00000A0E, 0x000500C3, 0x0000000C,\n    0x000028A6, 0x00006244, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000511E,\n    0x000028A6, 0x00000A14, 0x000500C3, 0x0000000C, 0x000028B9, 0x00003905,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x0000505F, 0x000028B9, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x0000541E, 0x0000505F, 0x00000A0E, 0x000500C6,\n    0x0000000C, 0x000022BB, 0x0000511E, 0x0000541E, 0x000500C7, 0x0000000C,\n    0x00005077, 0x00003905, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005229,\n    0x00005077, 0x00000A17, 0x000500C4, 0x0000000C, 0x00001999, 0x000022BB,\n    0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FF, 0x00005229, 0x00001999,\n    0x000500C4, 0x0000000C, 0x00001C01, 0x00005447, 0x00000A2C, 0x000500C5,\n    0x0000000C, 0x00003C82, 0x000047FF, 0x00001C01, 0x000500C7, 0x0000000C,\n    0x000050B0, 0x00005E63, 0x00000A39, 0x000500C5, 0x0000000C, 0x00003C71,\n    0x00003C82, 0x000050B0, 0x000500C3, 0x0000000C, 0x00003746, 0x00005E63,\n    0x00000A17, 0x000500C7, 0x0000000C, 0x000018BA, 0x00003746, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x00005480, 0x000018BA, 0x00000A1A, 0x000500C5,\n    0x0000000C, 0x000045A9, 0x00003C71, 0x00005480, 0x000500C3, 0x0000000C,\n    0x00003A6F, 0x00005E63, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018BB,\n    0x00003A6F, 0x00000A20, 0x000500C4, 0x0000000C, 0x00005481, 0x000018BB,\n    0x00000A23, 0x000500C5, 0x0000000C, 0x00004570, 0x000045A9, 0x00005481,\n    0x000500C3, 0x0000000C, 0x00003C89, 0x00005E63, 0x00000A23, 0x000500C4,\n    0x0000000C, 0x00002825, 0x00003C89, 0x00000A2F, 0x000500C5, 0x0000000C,\n    0x00003B7A, 0x00004570, 0x00002825, 0x0004007C, 0x0000000B, 0x000041E6,\n    0x00003B7A, 0x000200F9, 0x00004F78, 0x000200F8, 0x00004F78, 0x000700F5,\n    0x0000000B, 0x00004799, 0x000041E5, 0x00005BE0, 0x000041E6, 0x00002DD9,\n    0x00050051, 0x0000000B, 0x00003B60, 0x00001997, 0x00000000, 0x00050084,\n    0x0000000B, 0x00004451, 0x00003B60, 0x00002A78, 0x00050084, 0x0000000B,\n    0x00001C91, 0x00004799, 0x00004451, 0x00050080, 0x0000000B, 0x0000226F,\n    0x00001C91, 0x000044F0, 0x00050080, 0x0000000B, 0x000053DE, 0x0000226F,\n    0x00005EAC, 0x000500C2, 0x0000000B, 0x00003948, 0x000053DE, 0x00000A17,\n    0x00060041, 0x00000294, 0x00004FAF, 0x0000107A, 0x00000A0B, 0x00003948,\n    0x0004003D, 0x00000017, 0x00002261, 0x00004FAF, 0x000500AA, 0x00000009,\n    0x00005272, 0x0000619E, 0x00000A0D, 0x000300F7, 0x0000362B, 0x00000000,\n    0x000400FA, 0x00005272, 0x00002957, 0x0000362B, 0x000200F8, 0x00002957,\n    0x000500C7, 0x00000017, 0x0000475F, 0x00002261, 0x000009CE, 0x000500C4,\n    0x00000017, 0x000024D1, 0x0000475F, 0x0000013D, 0x000500C7, 0x00000017,\n    0x000050AC, 0x00002261, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448D,\n    0x000050AC, 0x0000013D, 0x000500C5, 0x00000017, 0x00003FF8, 0x000024D1,\n    0x0000448D, 0x000200F9, 0x0000362B, 0x000200F8, 0x0000362B, 0x000700F5,\n    0x00000017, 0x00004523, 0x00002261, 0x00004F78, 0x00003FF8, 0x00002957,\n    0x000500C2, 0x0000000B, 0x00004E2D, 0x00001F01, 0x00000A17, 0x0004007C,\n    0x0000001A, 0x00005C4A, 0x00004523, 0x000500C4, 0x0000001A, 0x00002C1C,\n    0x00005C4A, 0x00000302, 0x000500C3, 0x0000001A, 0x00004098, 0x00002C1C,\n    0x00000302, 0x0004006F, 0x0000001D, 0x00002A97, 0x00004098, 0x0005008E,\n    0x0000001D, 0x00004FBD, 0x00002A97, 0x00000A38, 0x0007000C, 0x0000001D,\n    0x00005DB5, 0x00000001, 0x00000028, 0x00000504, 0x00004FBD, 0x000500C3,\n    0x0000001A, 0x00003802, 0x00005C4A, 0x00000302, 0x0004006F, 0x0000001D,\n    0x000019CF, 0x00003802, 0x0005008E, 0x0000001D, 0x00004747, 0x000019CF,\n    0x00000A38, 0x0007000C, 0x0000001D, 0x00005E06, 0x00000001, 0x00000028,\n    0x00000504, 0x00004747, 0x00050051, 0x0000000D, 0x00005F0A, 0x00005DB5,\n    0x00000000, 0x00050051, 0x0000000D, 0x000037EF, 0x00005E06, 0x00000000,\n    0x00050050, 0x00000013, 0x00004B20, 0x00005F0A, 0x000037EF, 0x0006000C,\n    0x0000000B, 0x00002171, 0x00000001, 0x0000003A, 0x00004B20, 0x00050051,\n    0x0000000D, 0x00005BBF, 0x00005DB5, 0x00000001, 0x00050051, 0x0000000D,\n    0x000039A7, 0x00005E06, 0x00000001, 0x00050050, 0x00000013, 0x00004B21,\n    0x00005BBF, 0x000039A7, 0x0006000C, 0x0000000B, 0x00002172, 0x00000001,\n    0x0000003A, 0x00004B21, 0x00050051, 0x0000000D, 0x00005BC0, 0x00005DB5,\n    0x00000002, 0x00050051, 0x0000000D, 0x000039A8, 0x00005E06, 0x00000002,\n    0x00050050, 0x00000013, 0x00004B22, 0x00005BC0, 0x000039A8, 0x0006000C,\n    0x0000000B, 0x00002173, 0x00000001, 0x0000003A, 0x00004B22, 0x00050051,\n    0x0000000D, 0x00005BC1, 0x00005DB5, 0x00000003, 0x00050051, 0x0000000D,\n    0x000039A9, 0x00005E06, 0x00000003, 0x00050050, 0x00000013, 0x00004B0D,\n    0x00005BC1, 0x000039A9, 0x0006000C, 0x0000000B, 0x000020EE, 0x00000001,\n    0x0000003A, 0x00004B0D, 0x00070050, 0x00000017, 0x00003ABB, 0x00002171,\n    0x00002172, 0x00002173, 0x000020EE, 0x00060041, 0x00000294, 0x000045C3,\n    0x0000140E, 0x00000A0B, 0x00004E2D, 0x0003003E, 0x000045C3, 0x00003ABB,\n    0x00050080, 0x0000000B, 0x00005679, 0x00001F01, 0x00000A3A, 0x00050080,\n    0x0000000B, 0x000027E6, 0x000053DE, 0x00000A3A, 0x000500C2, 0x0000000B,\n    0x00003949, 0x000027E6, 0x00000A17, 0x00060041, 0x00000294, 0x00005566,\n    0x0000107A, 0x00000A0B, 0x00003949, 0x0004003D, 0x00000017, 0x00003910,\n    0x00005566, 0x000300F7, 0x0000362C, 0x00000000, 0x000400FA, 0x00005272,\n    0x00002958, 0x0000362C, 0x000200F8, 0x00002958, 0x000500C7, 0x00000017,\n    0x00004760, 0x00003910, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D2,\n    0x00004760, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AD, 0x00003910,\n    0x0000072E, 0x000500C2, 0x00000017, 0x0000448E, 0x000050AD, 0x0000013D,\n    0x000500C5, 0x00000017, 0x00003FF9, 0x000024D2, 0x0000448E, 0x000200F9,\n    0x0000362C, 0x000200F8, 0x0000362C, 0x000700F5, 0x00000017, 0x00004524,\n    0x00003910, 0x0000362B, 0x00003FF9, 0x00002958, 0x000500C2, 0x0000000B,\n    0x00004E2E, 0x00005679, 0x00000A17, 0x0004007C, 0x0000001A, 0x00005C4B,\n    0x00004524, 0x000500C4, 0x0000001A, 0x00002C1D, 0x00005C4B, 0x00000302,\n    0x000500C3, 0x0000001A, 0x00004099, 0x00002C1D, 0x00000302, 0x0004006F,\n    0x0000001D, 0x00002A98, 0x00004099, 0x0005008E, 0x0000001D, 0x00004FBE,\n    0x00002A98, 0x00000A38, 0x0007000C, 0x0000001D, 0x00005DB6, 0x00000001,\n    0x00000028, 0x00000504, 0x00004FBE, 0x000500C3, 0x0000001A, 0x00003803,\n    0x00005C4B, 0x00000302, 0x0004006F, 0x0000001D, 0x000019D0, 0x00003803,\n    0x0005008E, 0x0000001D, 0x00004748, 0x000019D0, 0x00000A38, 0x0007000C,\n    0x0000001D, 0x00005E07, 0x00000001, 0x00000028, 0x00000504, 0x00004748,\n    0x00050051, 0x0000000D, 0x00005F0B, 0x00005DB6, 0x00000000, 0x00050051,\n    0x0000000D, 0x000037F0, 0x00005E07, 0x00000000, 0x00050050, 0x00000013,\n    0x00004B23, 0x00005F0B, 0x000037F0, 0x0006000C, 0x0000000B, 0x00002174,\n    0x00000001, 0x0000003A, 0x00004B23, 0x00050051, 0x0000000D, 0x00005BC2,\n    0x00005DB6, 0x00000001, 0x00050051, 0x0000000D, 0x000039AA, 0x00005E07,\n    0x00000001, 0x00050050, 0x00000013, 0x00004B24, 0x00005BC2, 0x000039AA,\n    0x0006000C, 0x0000000B, 0x00002175, 0x00000001, 0x0000003A, 0x00004B24,\n    0x00050051, 0x0000000D, 0x00005BC3, 0x00005DB6, 0x00000002, 0x00050051,\n    0x0000000D, 0x000039AB, 0x00005E07, 0x00000002, 0x00050050, 0x00000013,\n    0x00004B25, 0x00005BC3, 0x000039AB, 0x0006000C, 0x0000000B, 0x00002176,\n    0x00000001, 0x0000003A, 0x00004B25, 0x00050051, 0x0000000D, 0x00005BC4,\n    0x00005DB6, 0x00000003, 0x00050051, 0x0000000D, 0x000039AC, 0x00005E07,\n    0x00000003, 0x00050050, 0x00000013, 0x00004B0E, 0x00005BC4, 0x000039AC,\n    0x0006000C, 0x0000000B, 0x000020EF, 0x00000001, 0x0000003A, 0x00004B0E,\n    0x00070050, 0x00000017, 0x00003ABC, 0x00002174, 0x00002175, 0x00002176,\n    0x000020EF, 0x00060041, 0x00000294, 0x00004EBE, 0x0000140E, 0x00000A0B,\n    0x00004E2E, 0x0003003E, 0x00004EBE, 0x00003ABC, 0x000200F9, 0x00004C7A,\n    0x000200F8, 0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_r16_unorm_float_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25155\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v4uint = OpTypeVector %uint 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v2uint = OpTypeVector %uint 2\n     %v3uint = OpTypeVector %uint 3\n      %float = OpTypeFloat 32\n    %v4float = OpTypeVector %float 4\n %uint_65535 = OpConstant %uint 65535\n%float_1_52590219en05 = OpConstant %float 1.52590219e-05\n    %uint_16 = OpConstant %uint 16\n     %uint_0 = OpConstant %uint 0\n    %v2float = OpTypeVector %float 2\n     %uint_1 = OpConstant %uint 1\n     %uint_2 = OpConstant %uint 2\n     %uint_3 = OpConstant %uint 3\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n      %int_3 = OpConstant %int 3\n      %int_2 = OpConstant %int 2\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n     %uint_4 = OpConstant %uint 4\n       %2612 = OpConstantComposite %v3uint %uint_4 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n    %uint_32 = OpConstant %uint 32\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %850 = OpConstantComposite %v4uint %uint_65535 %uint_65535 %uint_65535 %uint_65535\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n    %uint_64 = OpConstant %uint 64\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24540 = OpBitwiseAnd %uint %13606 %uint_1\n      %17270 = OpINotEqual %bool %24540 %uint_0\n      %12328 = OpBitwiseAnd %uint %13606 %uint_2\n      %17284 = OpINotEqual %bool %12328 %uint_0\n       %7856 = OpShiftRightLogical %uint %13606 %uint_2\n      %25058 = OpBitwiseAnd %uint %7856 %uint_3\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2612\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %6586 DontFlatten\n               OpBranchConditional %24679 %21992 %6586\n      %21992 = OpLabel\n               OpBranch %19578\n       %6586 = OpLabel\n      %23478 = OpBitcast %v3int %21387\n      %18710 = OpCompositeExtract %uint %22410 1\n      %23531 = OpCompositeExtract %int %23478 0\n      %22810 = OpIMul %int %23531 %int_2\n       %6362 = OpCompositeExtract %int %23478 2\n      %14505 = OpBitcast %int %18710\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %23478 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %6594\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %22810 %24535\n      %10404 = OpBitcast %uint %8258\n      %14582 = OpIAdd %uint %22411 %10404\n      %12308 = OpLogicalNot %bool %17270\n               OpSelectionMerge %19040 DontFlatten\n               OpBranchConditional %12308 %9741 %17007\n       %9741 = OpLabel\n      %17463 = OpCompositeExtract %uint %21387 0\n      %11246 = OpCompositeExtract %uint %21387 1\n      %18801 = OpCompositeExtract %uint %21387 2\n      %14831 = OpIMul %uint %22409 %18801\n      %20322 = OpIAdd %uint %11246 %14831\n      %21676 = OpIMul %uint %22408 %20322\n      %20398 = OpIAdd %uint %17463 %21676\n      %11367 = OpShiftLeftLogical %uint %20398 %uint_1\n               OpBranch %19040\n      %17007 = OpLabel\n               OpSelectionMerge %23536 DontFlatten\n               OpBranchConditional %17284 %11410 %24353\n      %11410 = OpLabel\n      %21364 = OpShiftRightLogical %uint %22408 %int_5\n      %13804 = OpShiftRightLogical %uint %22409 %int_4\n      %13237 = OpShiftRightArithmetic %int %6362 %int_2\n      %22374 = OpBitcast %int %13804\n      %25085 = OpIMul %int %13237 %22374\n      %11618 = OpShiftRightArithmetic %int %17598 %int_4\n      %16670 = OpIAdd %int %25085 %11618\n      %19064 = OpBitcast %int %21364\n      %13020 = OpIMul %int %16670 %19064\n      %12986 = OpShiftRightArithmetic %int %23531 %int_5\n      %24558 = OpIAdd %int %13020 %12986\n       %8797 = OpShiftLeftLogical %int %24558 %int_7\n      %11434 = OpBitwiseAnd %int %6362 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %17598 %int_1\n      %21365 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21365 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %23531 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17334 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17334 %uint_1\n      %13015 = OpShiftRightArithmetic %int %17598 %int_3\n       %9929 = OpBitwiseXor %int %13015 %13237\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %23531 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %17598 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6551\n       %7168 = OpShiftLeftLogical %int %16793 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24144 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24144 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24144 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24144 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %23536\n      %24353 = OpLabel\n      %23000 = OpBitcast %v2int %17136\n      %22120 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %23000 1\n      %12089 = OpShiftRightArithmetic %int %14597 %int_5\n      %22400 = OpBitcast %int %22120\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %23000 0\n      %20423 = OpShiftRightArithmetic %int %25154 %int_5\n      %18864 = OpIAdd %int %7938 %20423\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25154 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17335 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17335 %uint_1\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25154 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6552\n       %7169 = OpShiftLeftLogical %int %21575 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24163 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24163 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24163 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %23536\n      %23536 = OpLabel\n      %10540 = OpPhi %uint %16869 %11410 %16870 %24353\n               OpBranch %19040\n      %19040 = OpLabel\n      %11376 = OpPhi %uint %11367 %9741 %10540 %23536\n      %18621 = OpIAdd %uint %11376 %24236\n      %15698 = OpShiftRightLogical %uint %18621 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15698\n       %8801 = OpLoad %v4uint %20399\n      %21106 = OpIEqual %bool %25058 %uint_1\n               OpSelectionMerge %13867 None\n               OpBranchConditional %21106 %10583 %13867\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %8801 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %8801 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13867\n      %13867 = OpLabel\n      %19124 = OpPhi %v4uint %8801 %19040 %16376 %10583\n      %24513 = OpShiftRightLogical %uint %14582 %int_4\n       %7420 = OpBitwiseAnd %v4uint %19124 %850\n      %16133 = OpConvertUToF %v4float %7420\n      %19365 = OpVectorTimesScalar %v4float %16133 %float_1_52590219en05\n      %23367 = OpShiftRightLogical %v4uint %19124 %749\n      %18492 = OpConvertUToF %v4float %23367\n      %18450 = OpVectorTimesScalar %v4float %18492 %float_1_52590219en05\n       %6268 = OpCompositeExtract %float %19365 0\n      %13806 = OpCompositeExtract %float %18450 0\n      %19232 = OpCompositeConstruct %v2float %6268 %13806\n       %8561 = OpExtInst %uint %1 PackHalf2x16 %19232\n      %23487 = OpCompositeExtract %float %19365 1\n      %14759 = OpCompositeExtract %float %18450 1\n      %19233 = OpCompositeConstruct %v2float %23487 %14759\n       %8562 = OpExtInst %uint %1 PackHalf2x16 %19233\n      %23488 = OpCompositeExtract %float %19365 2\n      %14760 = OpCompositeExtract %float %18450 2\n      %19234 = OpCompositeConstruct %v2float %23488 %14760\n       %8563 = OpExtInst %uint %1 PackHalf2x16 %19234\n      %23489 = OpCompositeExtract %float %19365 3\n      %14761 = OpCompositeExtract %float %18450 3\n      %19213 = OpCompositeConstruct %v2float %23489 %14761\n       %8430 = OpExtInst %uint %1 PackHalf2x16 %19213\n      %15035 = OpCompositeConstruct %v4uint %8561 %8562 %8563 %8430\n      %17859 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %24513\n               OpStore %17859 %15035\n      %21685 = OpIAdd %uint %14582 %uint_16\n               OpSelectionMerge %24688 DontFlatten\n               OpBranchConditional %17270 %21993 %7205\n      %21993 = OpLabel\n               OpBranch %24688\n       %7205 = OpLabel\n               OpBranch %24688\n      %24688 = OpLabel\n      %11377 = OpPhi %uint %uint_64 %21993 %uint_16 %7205\n      %18622 = OpIAdd %uint %18621 %11377\n      %15699 = OpShiftRightLogical %uint %18622 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15699\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %13868 None\n               OpBranchConditional %21106 %10584 %13868\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %13868\n      %13868 = OpLabel\n      %19125 = OpPhi %v4uint %14608 %24688 %16377 %10584\n      %24514 = OpShiftRightLogical %uint %21685 %int_4\n       %7421 = OpBitwiseAnd %v4uint %19125 %850\n      %16134 = OpConvertUToF %v4float %7421\n      %19366 = OpVectorTimesScalar %v4float %16134 %float_1_52590219en05\n      %23368 = OpShiftRightLogical %v4uint %19125 %749\n      %18493 = OpConvertUToF %v4float %23368\n      %18451 = OpVectorTimesScalar %v4float %18493 %float_1_52590219en05\n       %6269 = OpCompositeExtract %float %19366 0\n      %13807 = OpCompositeExtract %float %18451 0\n      %19235 = OpCompositeConstruct %v2float %6269 %13807\n       %8564 = OpExtInst %uint %1 PackHalf2x16 %19235\n      %23490 = OpCompositeExtract %float %19366 1\n      %14762 = OpCompositeExtract %float %18451 1\n      %19236 = OpCompositeConstruct %v2float %23490 %14762\n       %8565 = OpExtInst %uint %1 PackHalf2x16 %19236\n      %23491 = OpCompositeExtract %float %19366 2\n      %14763 = OpCompositeExtract %float %18451 2\n      %19237 = OpCompositeConstruct %v2float %23491 %14763\n       %8566 = OpExtInst %uint %1 PackHalf2x16 %19237\n      %23492 = OpCompositeExtract %float %19366 3\n      %14764 = OpCompositeExtract %float %18451 3\n      %19214 = OpCompositeConstruct %v2float %23492 %14764\n       %8431 = OpExtInst %uint %1 PackHalf2x16 %19214\n      %15036 = OpCompositeConstruct %v4uint %8564 %8565 %8566 %8431\n      %20158 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %24514\n               OpStore %20158 %15036\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_r16_unorm_float_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006243, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000017, 0x0000000B, 0x00000004, 0x00040015, 0x0000000C,\n    0x00000020, 0x00000001, 0x00040017, 0x00000012, 0x0000000C, 0x00000002,\n    0x00040017, 0x00000016, 0x0000000C, 0x00000003, 0x00020014, 0x00000009,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x00030016, 0x0000000D, 0x00000020, 0x00040017,\n    0x0000001D, 0x0000000D, 0x00000004, 0x0004002B, 0x0000000B, 0x000001C1,\n    0x0000FFFF, 0x0004002B, 0x0000000D, 0x0000092A, 0x37800080, 0x0004002B,\n    0x0000000B, 0x00000A3A, 0x00000010, 0x0004002B, 0x0000000B, 0x00000A0A,\n    0x00000000, 0x00040017, 0x00000013, 0x0000000D, 0x00000002, 0x0004002B,\n    0x0000000B, 0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B, 0x00000A10,\n    0x00000002, 0x0004002B, 0x0000000B, 0x00000A13, 0x00000003, 0x0004002B,\n    0x0000000B, 0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B, 0x00000A22,\n    0x00000008, 0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00, 0x0004002B,\n    0x0000000C, 0x00000A17, 0x00000004, 0x0004002B, 0x0000000C, 0x00000A1D,\n    0x00000006, 0x0004002B, 0x0000000C, 0x00000A2C, 0x0000000B, 0x0004002B,\n    0x0000000C, 0x00000A38, 0x0000000F, 0x0004002B, 0x0000000C, 0x00000A0E,\n    0x00000001, 0x0004002B, 0x0000000C, 0x00000A1A, 0x00000005, 0x0004002B,\n    0x0000000C, 0x00000A20, 0x00000007, 0x0004002B, 0x0000000C, 0x00000A23,\n    0x00000008, 0x0004002B, 0x0000000C, 0x00000A2F, 0x0000000C, 0x0004002B,\n    0x0000000C, 0x00000A14, 0x00000003, 0x0004002B, 0x0000000C, 0x00000A11,\n    0x00000002, 0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000, 0x000A001E,\n    0x00000489, 0x0000000B, 0x0000000B, 0x0000000B, 0x0000000B, 0x00000014,\n    0x0000000B, 0x0000000B, 0x0000000B, 0x00040020, 0x00000706, 0x00000009,\n    0x00000489, 0x0004003B, 0x00000706, 0x00000CE9, 0x00000009, 0x00040020,\n    0x00000288, 0x00000009, 0x0000000B, 0x00040020, 0x00000291, 0x00000009,\n    0x00000014, 0x00040020, 0x00000292, 0x00000001, 0x00000014, 0x0004003B,\n    0x00000292, 0x00000F48, 0x00000001, 0x0004002B, 0x0000000B, 0x00000A16,\n    0x00000004, 0x0006002C, 0x00000014, 0x00000A34, 0x00000A16, 0x00000A0A,\n    0x00000A0A, 0x00040017, 0x0000000F, 0x00000009, 0x00000002, 0x0003001D,\n    0x000007DC, 0x00000017, 0x0003001E, 0x000007B4, 0x000007DC, 0x00040020,\n    0x00000A31, 0x00000002, 0x000007B4, 0x0004003B, 0x00000A31, 0x0000107A,\n    0x00000002, 0x00040020, 0x00000294, 0x00000002, 0x00000017, 0x0003001D,\n    0x000007DD, 0x00000017, 0x0003001E, 0x000007B5, 0x000007DD, 0x00040020,\n    0x00000A32, 0x00000002, 0x000007B5, 0x0004003B, 0x00000A32, 0x0000140E,\n    0x00000002, 0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020, 0x0006002C,\n    0x00000014, 0x00000BC3, 0x00000A16, 0x00000A6A, 0x00000A0D, 0x0007002C,\n    0x00000017, 0x000009CE, 0x000008A6, 0x000008A6, 0x000008A6, 0x000008A6,\n    0x0007002C, 0x00000017, 0x0000013D, 0x00000A22, 0x00000A22, 0x00000A22,\n    0x00000A22, 0x0007002C, 0x00000017, 0x0000072E, 0x000005FD, 0x000005FD,\n    0x000005FD, 0x000005FD, 0x0007002C, 0x00000017, 0x00000352, 0x000001C1,\n    0x000001C1, 0x000001C1, 0x000001C1, 0x0007002C, 0x00000017, 0x000002ED,\n    0x00000A3A, 0x00000A3A, 0x00000A3A, 0x00000A3A, 0x0004002B, 0x0000000B,\n    0x00000ACA, 0x00000040, 0x00050036, 0x00000008, 0x0000161F, 0x00000000,\n    0x00000502, 0x000200F8, 0x00003B06, 0x000300F7, 0x00004C7A, 0x00000000,\n    0x000300FB, 0x00000A0A, 0x00002E68, 0x000200F8, 0x00002E68, 0x00050041,\n    0x00000288, 0x000060D7, 0x00000CE9, 0x00000A0B, 0x0004003D, 0x0000000B,\n    0x00003526, 0x000060D7, 0x000500C7, 0x0000000B, 0x00005FDC, 0x00003526,\n    0x00000A0D, 0x000500AB, 0x00000009, 0x00004376, 0x00005FDC, 0x00000A0A,\n    0x000500C7, 0x0000000B, 0x00003028, 0x00003526, 0x00000A10, 0x000500AB,\n    0x00000009, 0x00004384, 0x00003028, 0x00000A0A, 0x000500C2, 0x0000000B,\n    0x00001EB0, 0x00003526, 0x00000A10, 0x000500C7, 0x0000000B, 0x000061E2,\n    0x00001EB0, 0x00000A13, 0x00050041, 0x00000288, 0x0000492C, 0x00000CE9,\n    0x00000A0E, 0x0004003D, 0x0000000B, 0x00005EAC, 0x0000492C, 0x00050041,\n    0x00000288, 0x00004EBA, 0x00000CE9, 0x00000A11, 0x0004003D, 0x0000000B,\n    0x00005788, 0x00004EBA, 0x00050041, 0x00000288, 0x00004EBB, 0x00000CE9,\n    0x00000A14, 0x0004003D, 0x0000000B, 0x00005789, 0x00004EBB, 0x00050041,\n    0x00000291, 0x00004EBC, 0x00000CE9, 0x00000A17, 0x0004003D, 0x00000014,\n    0x0000578A, 0x00004EBC, 0x00050041, 0x00000288, 0x00004EBD, 0x00000CE9,\n    0x00000A1A, 0x0004003D, 0x0000000B, 0x0000578B, 0x00004EBD, 0x00050041,\n    0x00000288, 0x00004E6E, 0x00000CE9, 0x00000A1D, 0x0004003D, 0x0000000B,\n    0x000019C2, 0x00004E6E, 0x0004003D, 0x00000014, 0x00002A0E, 0x00000F48,\n    0x000500C4, 0x00000014, 0x0000538B, 0x00002A0E, 0x00000A34, 0x0007004F,\n    0x00000011, 0x000042F0, 0x0000538B, 0x0000538B, 0x00000000, 0x00000001,\n    0x0007004F, 0x00000011, 0x0000242F, 0x0000578A, 0x0000578A, 0x00000000,\n    0x00000001, 0x000500AE, 0x0000000F, 0x00004288, 0x000042F0, 0x0000242F,\n    0x0004009A, 0x00000009, 0x00006067, 0x00004288, 0x000300F7, 0x000019BA,\n    0x00000002, 0x000400FA, 0x00006067, 0x000055E8, 0x000019BA, 0x000200F8,\n    0x000055E8, 0x000200F9, 0x00004C7A, 0x000200F8, 0x000019BA, 0x0004007C,\n    0x00000016, 0x00005BB6, 0x0000538B, 0x00050051, 0x0000000B, 0x00004916,\n    0x0000578A, 0x00000001, 0x00050051, 0x0000000C, 0x00005BEB, 0x00005BB6,\n    0x00000000, 0x00050084, 0x0000000C, 0x0000591A, 0x00005BEB, 0x00000A11,\n    0x00050051, 0x0000000C, 0x000018DA, 0x00005BB6, 0x00000002, 0x0004007C,\n    0x0000000C, 0x000038A9, 0x00004916, 0x00050084, 0x0000000C, 0x00002C0F,\n    0x000018DA, 0x000038A9, 0x00050051, 0x0000000C, 0x000044BE, 0x00005BB6,\n    0x00000001, 0x00050080, 0x0000000C, 0x000056D4, 0x00002C0F, 0x000044BE,\n    0x0004007C, 0x0000000C, 0x00005785, 0x000019C2, 0x00050084, 0x0000000C,\n    0x00005FD7, 0x000056D4, 0x00005785, 0x00050080, 0x0000000C, 0x00002042,\n    0x0000591A, 0x00005FD7, 0x0004007C, 0x0000000B, 0x000028A4, 0x00002042,\n    0x00050080, 0x0000000B, 0x000038F6, 0x0000578B, 0x000028A4, 0x000400A8,\n    0x00000009, 0x00003014, 0x00004376, 0x000300F7, 0x00004A60, 0x00000002,\n    0x000400FA, 0x00003014, 0x0000260D, 0x0000426F, 0x000200F8, 0x0000260D,\n    0x00050051, 0x0000000B, 0x00004437, 0x0000538B, 0x00000000, 0x00050051,\n    0x0000000B, 0x00002BEE, 0x0000538B, 0x00000001, 0x00050051, 0x0000000B,\n    0x00004971, 0x0000538B, 0x00000002, 0x00050084, 0x0000000B, 0x000039EF,\n    0x00005789, 0x00004971, 0x00050080, 0x0000000B, 0x00004F62, 0x00002BEE,\n    0x000039EF, 0x00050084, 0x0000000B, 0x000054AC, 0x00005788, 0x00004F62,\n    0x00050080, 0x0000000B, 0x00004FAE, 0x00004437, 0x000054AC, 0x000500C4,\n    0x0000000B, 0x00002C67, 0x00004FAE, 0x00000A0D, 0x000200F9, 0x00004A60,\n    0x000200F8, 0x0000426F, 0x000300F7, 0x00005BF0, 0x00000002, 0x000400FA,\n    0x00004384, 0x00002C92, 0x00005F21, 0x000200F8, 0x00002C92, 0x000500C2,\n    0x0000000B, 0x00005374, 0x00005788, 0x00000A1A, 0x000500C2, 0x0000000B,\n    0x000035EC, 0x00005789, 0x00000A17, 0x000500C3, 0x0000000C, 0x000033B5,\n    0x000018DA, 0x00000A11, 0x0004007C, 0x0000000C, 0x00005766, 0x000035EC,\n    0x00050084, 0x0000000C, 0x000061FD, 0x000033B5, 0x00005766, 0x000500C3,\n    0x0000000C, 0x00002D62, 0x000044BE, 0x00000A17, 0x00050080, 0x0000000C,\n    0x0000411E, 0x000061FD, 0x00002D62, 0x0004007C, 0x0000000C, 0x00004A78,\n    0x00005374, 0x00050084, 0x0000000C, 0x000032DC, 0x0000411E, 0x00004A78,\n    0x000500C3, 0x0000000C, 0x000032BA, 0x00005BEB, 0x00000A1A, 0x00050080,\n    0x0000000C, 0x00005FEE, 0x000032DC, 0x000032BA, 0x000500C4, 0x0000000C,\n    0x0000225D, 0x00005FEE, 0x00000A20, 0x000500C7, 0x0000000C, 0x00002CAA,\n    0x000018DA, 0x00000A14, 0x000500C4, 0x0000000C, 0x00004CAE, 0x00002CAA,\n    0x00000A1A, 0x000500C3, 0x0000000C, 0x0000383E, 0x000044BE, 0x00000A0E,\n    0x000500C7, 0x0000000C, 0x00005375, 0x0000383E, 0x00000A14, 0x000500C4,\n    0x0000000C, 0x000054CA, 0x00005375, 0x00000A14, 0x000500C5, 0x0000000C,\n    0x000042CE, 0x00004CAE, 0x000054CA, 0x000500C7, 0x0000000C, 0x000050D5,\n    0x00005BEB, 0x00000A20, 0x000500C5, 0x0000000C, 0x00003ADD, 0x000042CE,\n    0x000050D5, 0x000500C5, 0x0000000C, 0x000043B6, 0x0000225D, 0x00003ADD,\n    0x000500C4, 0x0000000C, 0x00005E50, 0x000043B6, 0x00000A0D, 0x000500C3,\n    0x0000000C, 0x000032D7, 0x000044BE, 0x00000A14, 0x000500C6, 0x0000000C,\n    0x000026C9, 0x000032D7, 0x000033B5, 0x000500C7, 0x0000000C, 0x00004199,\n    0x000026C9, 0x00000A0E, 0x000500C3, 0x0000000C, 0x00002590, 0x00005BEB,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x0000505E, 0x00002590, 0x00000A14,\n    0x000500C4, 0x0000000C, 0x0000541D, 0x00004199, 0x00000A0E, 0x000500C6,\n    0x0000000C, 0x000022BA, 0x0000505E, 0x0000541D, 0x000500C7, 0x0000000C,\n    0x00005076, 0x000044BE, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005228,\n    0x00005076, 0x00000A17, 0x000500C4, 0x0000000C, 0x00001997, 0x000022BA,\n    0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FE, 0x00005228, 0x00001997,\n    0x000500C4, 0x0000000C, 0x00001C00, 0x00004199, 0x00000A2C, 0x000500C5,\n    0x0000000C, 0x00003C81, 0x000047FE, 0x00001C00, 0x000500C7, 0x0000000C,\n    0x000050AF, 0x00005E50, 0x00000A38, 0x000500C5, 0x0000000C, 0x00003C70,\n    0x00003C81, 0x000050AF, 0x000500C3, 0x0000000C, 0x00003745, 0x00005E50,\n    0x00000A17, 0x000500C7, 0x0000000C, 0x000018B8, 0x00003745, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x0000547E, 0x000018B8, 0x00000A1A, 0x000500C5,\n    0x0000000C, 0x000045A8, 0x00003C70, 0x0000547E, 0x000500C3, 0x0000000C,\n    0x00003A6E, 0x00005E50, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018B9,\n    0x00003A6E, 0x00000A20, 0x000500C4, 0x0000000C, 0x0000547F, 0x000018B9,\n    0x00000A23, 0x000500C5, 0x0000000C, 0x0000456F, 0x000045A8, 0x0000547F,\n    0x000500C3, 0x0000000C, 0x00003C88, 0x00005E50, 0x00000A23, 0x000500C4,\n    0x0000000C, 0x00002824, 0x00003C88, 0x00000A2F, 0x000500C5, 0x0000000C,\n    0x00003B79, 0x0000456F, 0x00002824, 0x0004007C, 0x0000000B, 0x000041E5,\n    0x00003B79, 0x000200F9, 0x00005BF0, 0x000200F8, 0x00005F21, 0x0004007C,\n    0x00000012, 0x000059D8, 0x000042F0, 0x000500C2, 0x0000000B, 0x00005668,\n    0x00005788, 0x00000A1A, 0x00050051, 0x0000000C, 0x00003905, 0x000059D8,\n    0x00000001, 0x000500C3, 0x0000000C, 0x00002F39, 0x00003905, 0x00000A1A,\n    0x0004007C, 0x0000000C, 0x00005780, 0x00005668, 0x00050084, 0x0000000C,\n    0x00001F02, 0x00002F39, 0x00005780, 0x00050051, 0x0000000C, 0x00006242,\n    0x000059D8, 0x00000000, 0x000500C3, 0x0000000C, 0x00004FC7, 0x00006242,\n    0x00000A1A, 0x00050080, 0x0000000C, 0x000049B0, 0x00001F02, 0x00004FC7,\n    0x000500C4, 0x0000000C, 0x0000254A, 0x000049B0, 0x00000A1D, 0x000500C3,\n    0x0000000C, 0x0000603B, 0x00003905, 0x00000A0E, 0x000500C7, 0x0000000C,\n    0x0000539A, 0x0000603B, 0x00000A20, 0x000500C4, 0x0000000C, 0x0000534A,\n    0x0000539A, 0x00000A14, 0x000500C7, 0x0000000C, 0x00004EA5, 0x00006242,\n    0x00000A20, 0x000500C5, 0x0000000C, 0x00002B1A, 0x0000534A, 0x00004EA5,\n    0x000500C5, 0x0000000C, 0x000043B7, 0x0000254A, 0x00002B1A, 0x000500C4,\n    0x0000000C, 0x00005E63, 0x000043B7, 0x00000A0D, 0x000500C3, 0x0000000C,\n    0x000031DE, 0x00003905, 0x00000A17, 0x000500C7, 0x0000000C, 0x00005447,\n    0x000031DE, 0x00000A0E, 0x000500C3, 0x0000000C, 0x000028A6, 0x00006242,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x0000511E, 0x000028A6, 0x00000A14,\n    0x000500C3, 0x0000000C, 0x000028B9, 0x00003905, 0x00000A14, 0x000500C7,\n    0x0000000C, 0x0000505F, 0x000028B9, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x0000541E, 0x0000505F, 0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BB,\n    0x0000511E, 0x0000541E, 0x000500C7, 0x0000000C, 0x00005077, 0x00003905,\n    0x00000A0E, 0x000500C4, 0x0000000C, 0x00005229, 0x00005077, 0x00000A17,\n    0x000500C4, 0x0000000C, 0x00001998, 0x000022BB, 0x00000A1D, 0x000500C5,\n    0x0000000C, 0x000047FF, 0x00005229, 0x00001998, 0x000500C4, 0x0000000C,\n    0x00001C01, 0x00005447, 0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C82,\n    0x000047FF, 0x00001C01, 0x000500C7, 0x0000000C, 0x000050B0, 0x00005E63,\n    0x00000A38, 0x000500C5, 0x0000000C, 0x00003C71, 0x00003C82, 0x000050B0,\n    0x000500C3, 0x0000000C, 0x00003746, 0x00005E63, 0x00000A17, 0x000500C7,\n    0x0000000C, 0x000018BA, 0x00003746, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x00005480, 0x000018BA, 0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A9,\n    0x00003C71, 0x00005480, 0x000500C3, 0x0000000C, 0x00003A6F, 0x00005E63,\n    0x00000A1A, 0x000500C7, 0x0000000C, 0x000018BB, 0x00003A6F, 0x00000A20,\n    0x000500C4, 0x0000000C, 0x00005481, 0x000018BB, 0x00000A23, 0x000500C5,\n    0x0000000C, 0x00004570, 0x000045A9, 0x00005481, 0x000500C3, 0x0000000C,\n    0x00003C89, 0x00005E63, 0x00000A23, 0x000500C4, 0x0000000C, 0x00002825,\n    0x00003C89, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B7A, 0x00004570,\n    0x00002825, 0x0004007C, 0x0000000B, 0x000041E6, 0x00003B7A, 0x000200F9,\n    0x00005BF0, 0x000200F8, 0x00005BF0, 0x000700F5, 0x0000000B, 0x0000292C,\n    0x000041E5, 0x00002C92, 0x000041E6, 0x00005F21, 0x000200F9, 0x00004A60,\n    0x000200F8, 0x00004A60, 0x000700F5, 0x0000000B, 0x00002C70, 0x00002C67,\n    0x0000260D, 0x0000292C, 0x00005BF0, 0x00050080, 0x0000000B, 0x000048BD,\n    0x00002C70, 0x00005EAC, 0x000500C2, 0x0000000B, 0x00003D52, 0x000048BD,\n    0x00000A17, 0x00060041, 0x00000294, 0x00004FAF, 0x0000107A, 0x00000A0B,\n    0x00003D52, 0x0004003D, 0x00000017, 0x00002261, 0x00004FAF, 0x000500AA,\n    0x00000009, 0x00005272, 0x000061E2, 0x00000A0D, 0x000300F7, 0x0000362B,\n    0x00000000, 0x000400FA, 0x00005272, 0x00002957, 0x0000362B, 0x000200F8,\n    0x00002957, 0x000500C7, 0x00000017, 0x0000475F, 0x00002261, 0x000009CE,\n    0x000500C4, 0x00000017, 0x000024D1, 0x0000475F, 0x0000013D, 0x000500C7,\n    0x00000017, 0x000050AC, 0x00002261, 0x0000072E, 0x000500C2, 0x00000017,\n    0x0000448D, 0x000050AC, 0x0000013D, 0x000500C5, 0x00000017, 0x00003FF8,\n    0x000024D1, 0x0000448D, 0x000200F9, 0x0000362B, 0x000200F8, 0x0000362B,\n    0x000700F5, 0x00000017, 0x00004AB4, 0x00002261, 0x00004A60, 0x00003FF8,\n    0x00002957, 0x000500C2, 0x0000000B, 0x00005FC1, 0x000038F6, 0x00000A17,\n    0x000500C7, 0x00000017, 0x00001CFC, 0x00004AB4, 0x00000352, 0x00040070,\n    0x0000001D, 0x00003F05, 0x00001CFC, 0x0005008E, 0x0000001D, 0x00004BA5,\n    0x00003F05, 0x0000092A, 0x000500C2, 0x00000017, 0x00005B47, 0x00004AB4,\n    0x000002ED, 0x00040070, 0x0000001D, 0x0000483C, 0x00005B47, 0x0005008E,\n    0x0000001D, 0x00004812, 0x0000483C, 0x0000092A, 0x00050051, 0x0000000D,\n    0x0000187C, 0x00004BA5, 0x00000000, 0x00050051, 0x0000000D, 0x000035EE,\n    0x00004812, 0x00000000, 0x00050050, 0x00000013, 0x00004B20, 0x0000187C,\n    0x000035EE, 0x0006000C, 0x0000000B, 0x00002171, 0x00000001, 0x0000003A,\n    0x00004B20, 0x00050051, 0x0000000D, 0x00005BBF, 0x00004BA5, 0x00000001,\n    0x00050051, 0x0000000D, 0x000039A7, 0x00004812, 0x00000001, 0x00050050,\n    0x00000013, 0x00004B21, 0x00005BBF, 0x000039A7, 0x0006000C, 0x0000000B,\n    0x00002172, 0x00000001, 0x0000003A, 0x00004B21, 0x00050051, 0x0000000D,\n    0x00005BC0, 0x00004BA5, 0x00000002, 0x00050051, 0x0000000D, 0x000039A8,\n    0x00004812, 0x00000002, 0x00050050, 0x00000013, 0x00004B22, 0x00005BC0,\n    0x000039A8, 0x0006000C, 0x0000000B, 0x00002173, 0x00000001, 0x0000003A,\n    0x00004B22, 0x00050051, 0x0000000D, 0x00005BC1, 0x00004BA5, 0x00000003,\n    0x00050051, 0x0000000D, 0x000039A9, 0x00004812, 0x00000003, 0x00050050,\n    0x00000013, 0x00004B0D, 0x00005BC1, 0x000039A9, 0x0006000C, 0x0000000B,\n    0x000020EE, 0x00000001, 0x0000003A, 0x00004B0D, 0x00070050, 0x00000017,\n    0x00003ABB, 0x00002171, 0x00002172, 0x00002173, 0x000020EE, 0x00060041,\n    0x00000294, 0x000045C3, 0x0000140E, 0x00000A0B, 0x00005FC1, 0x0003003E,\n    0x000045C3, 0x00003ABB, 0x00050080, 0x0000000B, 0x000054B5, 0x000038F6,\n    0x00000A3A, 0x000300F7, 0x00006070, 0x00000002, 0x000400FA, 0x00004376,\n    0x000055E9, 0x00001C25, 0x000200F8, 0x000055E9, 0x000200F9, 0x00006070,\n    0x000200F8, 0x00001C25, 0x000200F9, 0x00006070, 0x000200F8, 0x00006070,\n    0x000700F5, 0x0000000B, 0x00002C71, 0x00000ACA, 0x000055E9, 0x00000A3A,\n    0x00001C25, 0x00050080, 0x0000000B, 0x000048BE, 0x000048BD, 0x00002C71,\n    0x000500C2, 0x0000000B, 0x00003D53, 0x000048BE, 0x00000A17, 0x00060041,\n    0x00000294, 0x00005566, 0x0000107A, 0x00000A0B, 0x00003D53, 0x0004003D,\n    0x00000017, 0x00003910, 0x00005566, 0x000300F7, 0x0000362C, 0x00000000,\n    0x000400FA, 0x00005272, 0x00002958, 0x0000362C, 0x000200F8, 0x00002958,\n    0x000500C7, 0x00000017, 0x00004760, 0x00003910, 0x000009CE, 0x000500C4,\n    0x00000017, 0x000024D2, 0x00004760, 0x0000013D, 0x000500C7, 0x00000017,\n    0x000050AD, 0x00003910, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448E,\n    0x000050AD, 0x0000013D, 0x000500C5, 0x00000017, 0x00003FF9, 0x000024D2,\n    0x0000448E, 0x000200F9, 0x0000362C, 0x000200F8, 0x0000362C, 0x000700F5,\n    0x00000017, 0x00004AB5, 0x00003910, 0x00006070, 0x00003FF9, 0x00002958,\n    0x000500C2, 0x0000000B, 0x00005FC2, 0x000054B5, 0x00000A17, 0x000500C7,\n    0x00000017, 0x00001CFD, 0x00004AB5, 0x00000352, 0x00040070, 0x0000001D,\n    0x00003F06, 0x00001CFD, 0x0005008E, 0x0000001D, 0x00004BA6, 0x00003F06,\n    0x0000092A, 0x000500C2, 0x00000017, 0x00005B48, 0x00004AB5, 0x000002ED,\n    0x00040070, 0x0000001D, 0x0000483D, 0x00005B48, 0x0005008E, 0x0000001D,\n    0x00004813, 0x0000483D, 0x0000092A, 0x00050051, 0x0000000D, 0x0000187D,\n    0x00004BA6, 0x00000000, 0x00050051, 0x0000000D, 0x000035EF, 0x00004813,\n    0x00000000, 0x00050050, 0x00000013, 0x00004B23, 0x0000187D, 0x000035EF,\n    0x0006000C, 0x0000000B, 0x00002174, 0x00000001, 0x0000003A, 0x00004B23,\n    0x00050051, 0x0000000D, 0x00005BC2, 0x00004BA6, 0x00000001, 0x00050051,\n    0x0000000D, 0x000039AA, 0x00004813, 0x00000001, 0x00050050, 0x00000013,\n    0x00004B24, 0x00005BC2, 0x000039AA, 0x0006000C, 0x0000000B, 0x00002175,\n    0x00000001, 0x0000003A, 0x00004B24, 0x00050051, 0x0000000D, 0x00005BC3,\n    0x00004BA6, 0x00000002, 0x00050051, 0x0000000D, 0x000039AB, 0x00004813,\n    0x00000002, 0x00050050, 0x00000013, 0x00004B25, 0x00005BC3, 0x000039AB,\n    0x0006000C, 0x0000000B, 0x00002176, 0x00000001, 0x0000003A, 0x00004B25,\n    0x00050051, 0x0000000D, 0x00005BC4, 0x00004BA6, 0x00000003, 0x00050051,\n    0x0000000D, 0x000039AC, 0x00004813, 0x00000003, 0x00050050, 0x00000013,\n    0x00004B0E, 0x00005BC4, 0x000039AC, 0x0006000C, 0x0000000B, 0x000020EF,\n    0x00000001, 0x0000003A, 0x00004B0E, 0x00070050, 0x00000017, 0x00003ABC,\n    0x00002174, 0x00002175, 0x00002176, 0x000020EF, 0x00060041, 0x00000294,\n    0x00004EBE, 0x0000140E, 0x00000A0B, 0x00005FC2, 0x0003003E, 0x00004EBE,\n    0x00003ABC, 0x000200F9, 0x00004C7A, 0x000200F8, 0x00004C7A, 0x000100FD,\n    0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_r16_unorm_float_scaled_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25157\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n     %v4uint = OpTypeVector %uint 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v3uint = OpTypeVector %uint 3\n      %float = OpTypeFloat 32\n    %v4float = OpTypeVector %float 4\n %uint_65535 = OpConstant %uint 65535\n%float_1_52590219en05 = OpConstant %float 1.52590219e-05\n    %uint_16 = OpConstant %uint 16\n     %uint_0 = OpConstant %uint 0\n    %v2float = OpTypeVector %float 2\n     %uint_1 = OpConstant %uint 1\n     %uint_2 = OpConstant %uint 2\n     %uint_3 = OpConstant %uint 3\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n      %int_3 = OpConstant %int 3\n      %int_2 = OpConstant %int 2\n     %uint_5 = OpConstant %uint 5\n     %uint_4 = OpConstant %uint 4\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n     %uint_7 = OpConstant %uint 7\n       %1927 = OpConstantComposite %v2uint %uint_4 %uint_7\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %2612 = OpConstantComposite %v3uint %uint_4 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n    %uint_32 = OpConstant %uint 32\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %1954 = OpConstantComposite %v2uint %uint_7 %uint_7\n       %1867 = OpConstantComposite %v2uint %uint_4 %uint_2\n    %uint_15 = OpConstant %uint 15\n       %1978 = OpConstantComposite %v2uint %uint_15 %uint_3\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %850 = OpConstantComposite %v4uint %uint_65535 %uint_65535 %uint_65535 %uint_65535\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24445 = OpBitwiseAnd %uint %13606 %uint_2\n      %18667 = OpINotEqual %bool %24445 %uint_0\n       %8141 = OpShiftRightLogical %uint %13606 %uint_2\n      %24990 = OpBitwiseAnd %uint %8141 %uint_3\n       %8871 = OpCompositeConstruct %v2uint %13606 %13606\n       %7087 = OpShiftRightLogical %v2uint %8871 %1927\n       %6551 = OpBitwiseAnd %v2uint %7087 %1954\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2612\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %6586 DontFlatten\n               OpBranchConditional %24679 %21992 %6586\n      %21992 = OpLabel\n               OpBranch %19578\n       %6586 = OpLabel\n      %23478 = OpBitcast %v3int %21387\n      %18710 = OpCompositeExtract %uint %22410 1\n      %23531 = OpCompositeExtract %int %23478 0\n      %22810 = OpIMul %int %23531 %int_2\n       %6362 = OpCompositeExtract %int %23478 2\n      %14505 = OpBitcast %int %18710\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %23478 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %6594\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %22810 %24535\n      %10898 = OpBitcast %uint %8258\n       %7937 = OpIAdd %uint %22411 %10898\n      %19921 = OpShiftRightLogical %v2uint %17136 %1867\n       %7712 = OpUDiv %v2uint %19921 %6551\n      %18183 = OpIMul %v2uint %6551 %7712\n      %18273 = OpISub %v2uint %19921 %18183\n      %11232 = OpShiftLeftLogical %v2uint %7712 %1867\n      %13284 = OpCompositeExtract %uint %18273 0\n      %10872 = OpCompositeExtract %uint %6551 1\n      %22886 = OpIMul %uint %13284 %10872\n       %6943 = OpCompositeExtract %uint %18273 1\n      %10469 = OpIAdd %uint %22886 %6943\n      %18851 = OpBitwiseAnd %v2uint %17136 %1978\n      %10581 = OpShiftLeftLogical %uint %10469 %uint_7\n      %20916 = OpCompositeExtract %uint %18851 1\n      %23596 = OpShiftLeftLogical %uint %20916 %uint_5\n      %19814 = OpBitwiseOr %uint %10581 %23596\n      %21476 = OpCompositeExtract %uint %18851 0\n       %8560 = OpShiftLeftLogical %uint %21476 %uint_1\n      %17648 = OpBitwiseOr %uint %19814 %8560\n      %19923 = OpCompositeExtract %uint %11232 0\n      %15556 = OpCompositeInsert %v3uint %19923 %21387 0\n      %23006 = OpCompositeExtract %uint %11232 1\n       %9680 = OpCompositeInsert %v3uint %23006 %15556 1\n               OpSelectionMerge %20344 DontFlatten\n               OpBranchConditional %18667 %23520 %11737\n      %23520 = OpLabel\n      %10111 = OpBitcast %v3int %9680\n      %19476 = OpShiftRightLogical %uint %22408 %int_5\n      %18810 = OpShiftRightLogical %uint %22409 %int_4\n       %6782 = OpCompositeExtract %int %10111 2\n      %12089 = OpShiftRightArithmetic %int %6782 %int_2\n      %22400 = OpBitcast %int %18810\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %10111 1\n      %19055 = OpShiftRightArithmetic %int %25154 %int_4\n      %11052 = OpIAdd %int %7938 %19055\n      %16898 = OpBitcast %int %19476\n      %14944 = OpIMul %int %11052 %16898\n      %25155 = OpCompositeExtract %int %10111 0\n      %20423 = OpShiftRightArithmetic %int %25155 %int_5\n      %18940 = OpIAdd %int %14944 %20423\n       %8797 = OpShiftLeftLogical %int %18940 %int_7\n      %11434 = OpBitwiseAnd %int %6782 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %25154 %int_1\n      %21364 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21364 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %25155 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17334 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17334 %uint_1\n      %13015 = OpShiftRightArithmetic %int %25154 %int_3\n       %9929 = OpBitwiseXor %int %13015 %12089\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %25155 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %25154 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6552 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6552\n       %7168 = OpShiftLeftLogical %int %16793 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24144 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24144 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24144 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24144 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %20344\n      %11737 = OpLabel\n      %11908 = OpVectorShuffle %v2uint %9680 %9680 0 1\n      %20347 = OpBitcast %v2int %11908\n      %11433 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %20347 1\n      %12090 = OpShiftRightArithmetic %int %14597 %int_5\n      %22401 = OpBitcast %int %11433\n       %7939 = OpIMul %int %12090 %22401\n      %25156 = OpCompositeExtract %int %20347 0\n      %20424 = OpShiftRightArithmetic %int %25156 %int_5\n      %18864 = OpIAdd %int %7939 %20424\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25156 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17335 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17335 %uint_1\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25156 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6553 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6553\n       %7169 = OpShiftLeftLogical %int %21575 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24163 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24163 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24163 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %20344\n      %20344 = OpLabel\n      %18329 = OpPhi %uint %16869 %23520 %16870 %11737\n      %15200 = OpCompositeExtract %uint %6551 0\n      %17489 = OpIMul %uint %15200 %10872\n       %7313 = OpIMul %uint %18329 %17489\n       %8815 = OpIAdd %uint %7313 %17648\n      %21470 = OpIAdd %uint %8815 %24236\n      %14664 = OpShiftRightLogical %uint %21470 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %14664\n       %8801 = OpLoad %v4uint %20399\n      %21106 = OpIEqual %bool %24990 %uint_1\n               OpSelectionMerge %13867 None\n               OpBranchConditional %21106 %10583 %13867\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %8801 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %8801 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13867\n      %13867 = OpLabel\n      %19124 = OpPhi %v4uint %8801 %20344 %16376 %10583\n      %24513 = OpShiftRightLogical %uint %7937 %int_4\n       %7420 = OpBitwiseAnd %v4uint %19124 %850\n      %16133 = OpConvertUToF %v4float %7420\n      %19365 = OpVectorTimesScalar %v4float %16133 %float_1_52590219en05\n      %23367 = OpShiftRightLogical %v4uint %19124 %749\n      %18492 = OpConvertUToF %v4float %23367\n      %18450 = OpVectorTimesScalar %v4float %18492 %float_1_52590219en05\n       %6268 = OpCompositeExtract %float %19365 0\n      %13806 = OpCompositeExtract %float %18450 0\n      %19232 = OpCompositeConstruct %v2float %6268 %13806\n       %8561 = OpExtInst %uint %1 PackHalf2x16 %19232\n      %23487 = OpCompositeExtract %float %19365 1\n      %14759 = OpCompositeExtract %float %18450 1\n      %19233 = OpCompositeConstruct %v2float %23487 %14759\n       %8562 = OpExtInst %uint %1 PackHalf2x16 %19233\n      %23488 = OpCompositeExtract %float %19365 2\n      %14760 = OpCompositeExtract %float %18450 2\n      %19234 = OpCompositeConstruct %v2float %23488 %14760\n       %8563 = OpExtInst %uint %1 PackHalf2x16 %19234\n      %23489 = OpCompositeExtract %float %19365 3\n      %14761 = OpCompositeExtract %float %18450 3\n      %19213 = OpCompositeConstruct %v2float %23489 %14761\n       %8430 = OpExtInst %uint %1 PackHalf2x16 %19213\n      %15035 = OpCompositeConstruct %v4uint %8561 %8562 %8563 %8430\n      %17859 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %24513\n               OpStore %17859 %15035\n      %22137 = OpIAdd %uint %7937 %uint_16\n      %10214 = OpIAdd %uint %21470 %uint_16\n      %14665 = OpShiftRightLogical %uint %10214 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %14665\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %13868 None\n               OpBranchConditional %21106 %10584 %13868\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %13868\n      %13868 = OpLabel\n      %19125 = OpPhi %v4uint %14608 %13867 %16377 %10584\n      %24514 = OpShiftRightLogical %uint %22137 %int_4\n       %7421 = OpBitwiseAnd %v4uint %19125 %850\n      %16134 = OpConvertUToF %v4float %7421\n      %19366 = OpVectorTimesScalar %v4float %16134 %float_1_52590219en05\n      %23368 = OpShiftRightLogical %v4uint %19125 %749\n      %18493 = OpConvertUToF %v4float %23368\n      %18451 = OpVectorTimesScalar %v4float %18493 %float_1_52590219en05\n       %6269 = OpCompositeExtract %float %19366 0\n      %13807 = OpCompositeExtract %float %18451 0\n      %19235 = OpCompositeConstruct %v2float %6269 %13807\n       %8564 = OpExtInst %uint %1 PackHalf2x16 %19235\n      %23490 = OpCompositeExtract %float %19366 1\n      %14762 = OpCompositeExtract %float %18451 1\n      %19236 = OpCompositeConstruct %v2float %23490 %14762\n       %8565 = OpExtInst %uint %1 PackHalf2x16 %19236\n      %23491 = OpCompositeExtract %float %19366 2\n      %14763 = OpCompositeExtract %float %18451 2\n      %19237 = OpCompositeConstruct %v2float %23491 %14763\n       %8566 = OpExtInst %uint %1 PackHalf2x16 %19237\n      %23492 = OpCompositeExtract %float %19366 3\n      %14764 = OpCompositeExtract %float %18451 3\n      %19214 = OpCompositeConstruct %v2float %23492 %14764\n       %8431 = OpExtInst %uint %1 PackHalf2x16 %19214\n      %15036 = OpCompositeConstruct %v4uint %8564 %8565 %8566 %8431\n      %20158 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %24514\n               OpStore %20158 %15036\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_r16_unorm_float_scaled_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006245, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000017,\n    0x0000000B, 0x00000004, 0x00040015, 0x0000000C, 0x00000020, 0x00000001,\n    0x00040017, 0x00000012, 0x0000000C, 0x00000002, 0x00040017, 0x00000016,\n    0x0000000C, 0x00000003, 0x00020014, 0x00000009, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x00030016, 0x0000000D, 0x00000020, 0x00040017,\n    0x0000001D, 0x0000000D, 0x00000004, 0x0004002B, 0x0000000B, 0x000001C1,\n    0x0000FFFF, 0x0004002B, 0x0000000D, 0x0000092A, 0x37800080, 0x0004002B,\n    0x0000000B, 0x00000A3A, 0x00000010, 0x0004002B, 0x0000000B, 0x00000A0A,\n    0x00000000, 0x00040017, 0x00000013, 0x0000000D, 0x00000002, 0x0004002B,\n    0x0000000B, 0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B, 0x00000A10,\n    0x00000002, 0x0004002B, 0x0000000B, 0x00000A13, 0x00000003, 0x0004002B,\n    0x0000000B, 0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B, 0x00000A22,\n    0x00000008, 0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00, 0x0004002B,\n    0x0000000C, 0x00000A17, 0x00000004, 0x0004002B, 0x0000000C, 0x00000A1D,\n    0x00000006, 0x0004002B, 0x0000000C, 0x00000A2C, 0x0000000B, 0x0004002B,\n    0x0000000C, 0x00000A38, 0x0000000F, 0x0004002B, 0x0000000C, 0x00000A0E,\n    0x00000001, 0x0004002B, 0x0000000C, 0x00000A1A, 0x00000005, 0x0004002B,\n    0x0000000C, 0x00000A20, 0x00000007, 0x0004002B, 0x0000000C, 0x00000A23,\n    0x00000008, 0x0004002B, 0x0000000C, 0x00000A2F, 0x0000000C, 0x0004002B,\n    0x0000000C, 0x00000A14, 0x00000003, 0x0004002B, 0x0000000C, 0x00000A11,\n    0x00000002, 0x0004002B, 0x0000000B, 0x00000A19, 0x00000005, 0x0004002B,\n    0x0000000B, 0x00000A16, 0x00000004, 0x0004002B, 0x0000000C, 0x00000A0B,\n    0x00000000, 0x000A001E, 0x00000489, 0x0000000B, 0x0000000B, 0x0000000B,\n    0x0000000B, 0x00000014, 0x0000000B, 0x0000000B, 0x0000000B, 0x00040020,\n    0x00000706, 0x00000009, 0x00000489, 0x0004003B, 0x00000706, 0x00000CE9,\n    0x00000009, 0x00040020, 0x00000288, 0x00000009, 0x0000000B, 0x0004002B,\n    0x0000000B, 0x00000A1F, 0x00000007, 0x0005002C, 0x00000011, 0x00000787,\n    0x00000A16, 0x00000A1F, 0x00040020, 0x00000291, 0x00000009, 0x00000014,\n    0x00040020, 0x00000292, 0x00000001, 0x00000014, 0x0004003B, 0x00000292,\n    0x00000F48, 0x00000001, 0x0006002C, 0x00000014, 0x00000A34, 0x00000A16,\n    0x00000A0A, 0x00000A0A, 0x00040017, 0x0000000F, 0x00000009, 0x00000002,\n    0x0003001D, 0x000007DC, 0x00000017, 0x0003001E, 0x000007B4, 0x000007DC,\n    0x00040020, 0x00000A31, 0x00000002, 0x000007B4, 0x0004003B, 0x00000A31,\n    0x0000107A, 0x00000002, 0x00040020, 0x00000294, 0x00000002, 0x00000017,\n    0x0003001D, 0x000007DD, 0x00000017, 0x0003001E, 0x000007B5, 0x000007DD,\n    0x00040020, 0x00000A32, 0x00000002, 0x000007B5, 0x0004003B, 0x00000A32,\n    0x0000140E, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020,\n    0x0006002C, 0x00000014, 0x00000BC3, 0x00000A16, 0x00000A6A, 0x00000A0D,\n    0x0005002C, 0x00000011, 0x000007A2, 0x00000A1F, 0x00000A1F, 0x0005002C,\n    0x00000011, 0x0000074B, 0x00000A16, 0x00000A10, 0x0004002B, 0x0000000B,\n    0x00000A37, 0x0000000F, 0x0005002C, 0x00000011, 0x000007BA, 0x00000A37,\n    0x00000A13, 0x0007002C, 0x00000017, 0x000009CE, 0x000008A6, 0x000008A6,\n    0x000008A6, 0x000008A6, 0x0007002C, 0x00000017, 0x0000013D, 0x00000A22,\n    0x00000A22, 0x00000A22, 0x00000A22, 0x0007002C, 0x00000017, 0x0000072E,\n    0x000005FD, 0x000005FD, 0x000005FD, 0x000005FD, 0x0007002C, 0x00000017,\n    0x00000352, 0x000001C1, 0x000001C1, 0x000001C1, 0x000001C1, 0x0007002C,\n    0x00000017, 0x000002ED, 0x00000A3A, 0x00000A3A, 0x00000A3A, 0x00000A3A,\n    0x00050036, 0x00000008, 0x0000161F, 0x00000000, 0x00000502, 0x000200F8,\n    0x00003B06, 0x000300F7, 0x00004C7A, 0x00000000, 0x000300FB, 0x00000A0A,\n    0x00002E68, 0x000200F8, 0x00002E68, 0x00050041, 0x00000288, 0x000060D7,\n    0x00000CE9, 0x00000A0B, 0x0004003D, 0x0000000B, 0x00003526, 0x000060D7,\n    0x000500C7, 0x0000000B, 0x00005F7D, 0x00003526, 0x00000A10, 0x000500AB,\n    0x00000009, 0x000048EB, 0x00005F7D, 0x00000A0A, 0x000500C2, 0x0000000B,\n    0x00001FCD, 0x00003526, 0x00000A10, 0x000500C7, 0x0000000B, 0x0000619E,\n    0x00001FCD, 0x00000A13, 0x00050050, 0x00000011, 0x000022A7, 0x00003526,\n    0x00003526, 0x000500C2, 0x00000011, 0x00001BAF, 0x000022A7, 0x00000787,\n    0x000500C7, 0x00000011, 0x00001997, 0x00001BAF, 0x000007A2, 0x00050041,\n    0x00000288, 0x0000492C, 0x00000CE9, 0x00000A0E, 0x0004003D, 0x0000000B,\n    0x00005EAC, 0x0000492C, 0x00050041, 0x00000288, 0x00004EBA, 0x00000CE9,\n    0x00000A11, 0x0004003D, 0x0000000B, 0x00005788, 0x00004EBA, 0x00050041,\n    0x00000288, 0x00004EBB, 0x00000CE9, 0x00000A14, 0x0004003D, 0x0000000B,\n    0x00005789, 0x00004EBB, 0x00050041, 0x00000291, 0x00004EBC, 0x00000CE9,\n    0x00000A17, 0x0004003D, 0x00000014, 0x0000578A, 0x00004EBC, 0x00050041,\n    0x00000288, 0x00004EBD, 0x00000CE9, 0x00000A1A, 0x0004003D, 0x0000000B,\n    0x0000578B, 0x00004EBD, 0x00050041, 0x00000288, 0x00004E6E, 0x00000CE9,\n    0x00000A1D, 0x0004003D, 0x0000000B, 0x000019C2, 0x00004E6E, 0x0004003D,\n    0x00000014, 0x00002A0E, 0x00000F48, 0x000500C4, 0x00000014, 0x0000538B,\n    0x00002A0E, 0x00000A34, 0x0007004F, 0x00000011, 0x000042F0, 0x0000538B,\n    0x0000538B, 0x00000000, 0x00000001, 0x0007004F, 0x00000011, 0x0000242F,\n    0x0000578A, 0x0000578A, 0x00000000, 0x00000001, 0x000500AE, 0x0000000F,\n    0x00004288, 0x000042F0, 0x0000242F, 0x0004009A, 0x00000009, 0x00006067,\n    0x00004288, 0x000300F7, 0x000019BA, 0x00000002, 0x000400FA, 0x00006067,\n    0x000055E8, 0x000019BA, 0x000200F8, 0x000055E8, 0x000200F9, 0x00004C7A,\n    0x000200F8, 0x000019BA, 0x0004007C, 0x00000016, 0x00005BB6, 0x0000538B,\n    0x00050051, 0x0000000B, 0x00004916, 0x0000578A, 0x00000001, 0x00050051,\n    0x0000000C, 0x00005BEB, 0x00005BB6, 0x00000000, 0x00050084, 0x0000000C,\n    0x0000591A, 0x00005BEB, 0x00000A11, 0x00050051, 0x0000000C, 0x000018DA,\n    0x00005BB6, 0x00000002, 0x0004007C, 0x0000000C, 0x000038A9, 0x00004916,\n    0x00050084, 0x0000000C, 0x00002C0F, 0x000018DA, 0x000038A9, 0x00050051,\n    0x0000000C, 0x000044BE, 0x00005BB6, 0x00000001, 0x00050080, 0x0000000C,\n    0x000056D4, 0x00002C0F, 0x000044BE, 0x0004007C, 0x0000000C, 0x00005785,\n    0x000019C2, 0x00050084, 0x0000000C, 0x00005FD7, 0x000056D4, 0x00005785,\n    0x00050080, 0x0000000C, 0x00002042, 0x0000591A, 0x00005FD7, 0x0004007C,\n    0x0000000B, 0x00002A92, 0x00002042, 0x00050080, 0x0000000B, 0x00001F01,\n    0x0000578B, 0x00002A92, 0x000500C2, 0x00000011, 0x00004DD1, 0x000042F0,\n    0x0000074B, 0x00050086, 0x00000011, 0x00001E20, 0x00004DD1, 0x00001997,\n    0x00050084, 0x00000011, 0x00004707, 0x00001997, 0x00001E20, 0x00050082,\n    0x00000011, 0x00004761, 0x00004DD1, 0x00004707, 0x000500C4, 0x00000011,\n    0x00002BE0, 0x00001E20, 0x0000074B, 0x00050051, 0x0000000B, 0x000033E4,\n    0x00004761, 0x00000000, 0x00050051, 0x0000000B, 0x00002A78, 0x00001997,\n    0x00000001, 0x00050084, 0x0000000B, 0x00005966, 0x000033E4, 0x00002A78,\n    0x00050051, 0x0000000B, 0x00001B1F, 0x00004761, 0x00000001, 0x00050080,\n    0x0000000B, 0x000028E5, 0x00005966, 0x00001B1F, 0x000500C7, 0x00000011,\n    0x000049A3, 0x000042F0, 0x000007BA, 0x000500C4, 0x0000000B, 0x00002955,\n    0x000028E5, 0x00000A1F, 0x00050051, 0x0000000B, 0x000051B4, 0x000049A3,\n    0x00000001, 0x000500C4, 0x0000000B, 0x00005C2C, 0x000051B4, 0x00000A19,\n    0x000500C5, 0x0000000B, 0x00004D66, 0x00002955, 0x00005C2C, 0x00050051,\n    0x0000000B, 0x000053E4, 0x000049A3, 0x00000000, 0x000500C4, 0x0000000B,\n    0x00002170, 0x000053E4, 0x00000A0D, 0x000500C5, 0x0000000B, 0x000044F0,\n    0x00004D66, 0x00002170, 0x00050051, 0x0000000B, 0x00004DD3, 0x00002BE0,\n    0x00000000, 0x00060052, 0x00000014, 0x00003CC4, 0x00004DD3, 0x0000538B,\n    0x00000000, 0x00050051, 0x0000000B, 0x000059DE, 0x00002BE0, 0x00000001,\n    0x00060052, 0x00000014, 0x000025D0, 0x000059DE, 0x00003CC4, 0x00000001,\n    0x000300F7, 0x00004F78, 0x00000002, 0x000400FA, 0x000048EB, 0x00005BE0,\n    0x00002DD9, 0x000200F8, 0x00005BE0, 0x0004007C, 0x00000016, 0x0000277F,\n    0x000025D0, 0x000500C2, 0x0000000B, 0x00004C14, 0x00005788, 0x00000A1A,\n    0x000500C2, 0x0000000B, 0x0000497A, 0x00005789, 0x00000A17, 0x00050051,\n    0x0000000C, 0x00001A7E, 0x0000277F, 0x00000002, 0x000500C3, 0x0000000C,\n    0x00002F39, 0x00001A7E, 0x00000A11, 0x0004007C, 0x0000000C, 0x00005780,\n    0x0000497A, 0x00050084, 0x0000000C, 0x00001F02, 0x00002F39, 0x00005780,\n    0x00050051, 0x0000000C, 0x00006242, 0x0000277F, 0x00000001, 0x000500C3,\n    0x0000000C, 0x00004A6F, 0x00006242, 0x00000A17, 0x00050080, 0x0000000C,\n    0x00002B2C, 0x00001F02, 0x00004A6F, 0x0004007C, 0x0000000C, 0x00004202,\n    0x00004C14, 0x00050084, 0x0000000C, 0x00003A60, 0x00002B2C, 0x00004202,\n    0x00050051, 0x0000000C, 0x00006243, 0x0000277F, 0x00000000, 0x000500C3,\n    0x0000000C, 0x00004FC7, 0x00006243, 0x00000A1A, 0x00050080, 0x0000000C,\n    0x000049FC, 0x00003A60, 0x00004FC7, 0x000500C4, 0x0000000C, 0x0000225D,\n    0x000049FC, 0x00000A20, 0x000500C7, 0x0000000C, 0x00002CAA, 0x00001A7E,\n    0x00000A14, 0x000500C4, 0x0000000C, 0x00004CAE, 0x00002CAA, 0x00000A1A,\n    0x000500C3, 0x0000000C, 0x0000383E, 0x00006242, 0x00000A0E, 0x000500C7,\n    0x0000000C, 0x00005374, 0x0000383E, 0x00000A14, 0x000500C4, 0x0000000C,\n    0x000054CA, 0x00005374, 0x00000A14, 0x000500C5, 0x0000000C, 0x000042CE,\n    0x00004CAE, 0x000054CA, 0x000500C7, 0x0000000C, 0x000050D5, 0x00006243,\n    0x00000A20, 0x000500C5, 0x0000000C, 0x00003ADD, 0x000042CE, 0x000050D5,\n    0x000500C5, 0x0000000C, 0x000043B6, 0x0000225D, 0x00003ADD, 0x000500C4,\n    0x0000000C, 0x00005E50, 0x000043B6, 0x00000A0D, 0x000500C3, 0x0000000C,\n    0x000032D7, 0x00006242, 0x00000A14, 0x000500C6, 0x0000000C, 0x000026C9,\n    0x000032D7, 0x00002F39, 0x000500C7, 0x0000000C, 0x00004199, 0x000026C9,\n    0x00000A0E, 0x000500C3, 0x0000000C, 0x00002590, 0x00006243, 0x00000A14,\n    0x000500C7, 0x0000000C, 0x0000505E, 0x00002590, 0x00000A14, 0x000500C4,\n    0x0000000C, 0x0000541D, 0x00004199, 0x00000A0E, 0x000500C6, 0x0000000C,\n    0x000022BA, 0x0000505E, 0x0000541D, 0x000500C7, 0x0000000C, 0x00005076,\n    0x00006242, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005228, 0x00005076,\n    0x00000A17, 0x000500C4, 0x0000000C, 0x00001998, 0x000022BA, 0x00000A1D,\n    0x000500C5, 0x0000000C, 0x000047FE, 0x00005228, 0x00001998, 0x000500C4,\n    0x0000000C, 0x00001C00, 0x00004199, 0x00000A2C, 0x000500C5, 0x0000000C,\n    0x00003C81, 0x000047FE, 0x00001C00, 0x000500C7, 0x0000000C, 0x000050AF,\n    0x00005E50, 0x00000A38, 0x000500C5, 0x0000000C, 0x00003C70, 0x00003C81,\n    0x000050AF, 0x000500C3, 0x0000000C, 0x00003745, 0x00005E50, 0x00000A17,\n    0x000500C7, 0x0000000C, 0x000018B8, 0x00003745, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x0000547E, 0x000018B8, 0x00000A1A, 0x000500C5, 0x0000000C,\n    0x000045A8, 0x00003C70, 0x0000547E, 0x000500C3, 0x0000000C, 0x00003A6E,\n    0x00005E50, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018B9, 0x00003A6E,\n    0x00000A20, 0x000500C4, 0x0000000C, 0x0000547F, 0x000018B9, 0x00000A23,\n    0x000500C5, 0x0000000C, 0x0000456F, 0x000045A8, 0x0000547F, 0x000500C3,\n    0x0000000C, 0x00003C88, 0x00005E50, 0x00000A23, 0x000500C4, 0x0000000C,\n    0x00002824, 0x00003C88, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B79,\n    0x0000456F, 0x00002824, 0x0004007C, 0x0000000B, 0x000041E5, 0x00003B79,\n    0x000200F9, 0x00004F78, 0x000200F8, 0x00002DD9, 0x0007004F, 0x00000011,\n    0x00002E84, 0x000025D0, 0x000025D0, 0x00000000, 0x00000001, 0x0004007C,\n    0x00000012, 0x00004F7B, 0x00002E84, 0x000500C2, 0x0000000B, 0x00002CA9,\n    0x00005788, 0x00000A1A, 0x00050051, 0x0000000C, 0x00003905, 0x00004F7B,\n    0x00000001, 0x000500C3, 0x0000000C, 0x00002F3A, 0x00003905, 0x00000A1A,\n    0x0004007C, 0x0000000C, 0x00005781, 0x00002CA9, 0x00050084, 0x0000000C,\n    0x00001F03, 0x00002F3A, 0x00005781, 0x00050051, 0x0000000C, 0x00006244,\n    0x00004F7B, 0x00000000, 0x000500C3, 0x0000000C, 0x00004FC8, 0x00006244,\n    0x00000A1A, 0x00050080, 0x0000000C, 0x000049B0, 0x00001F03, 0x00004FC8,\n    0x000500C4, 0x0000000C, 0x0000254A, 0x000049B0, 0x00000A1D, 0x000500C3,\n    0x0000000C, 0x0000603B, 0x00003905, 0x00000A0E, 0x000500C7, 0x0000000C,\n    0x0000539A, 0x0000603B, 0x00000A20, 0x000500C4, 0x0000000C, 0x0000534A,\n    0x0000539A, 0x00000A14, 0x000500C7, 0x0000000C, 0x00004EA5, 0x00006244,\n    0x00000A20, 0x000500C5, 0x0000000C, 0x00002B1A, 0x0000534A, 0x00004EA5,\n    0x000500C5, 0x0000000C, 0x000043B7, 0x0000254A, 0x00002B1A, 0x000500C4,\n    0x0000000C, 0x00005E63, 0x000043B7, 0x00000A0D, 0x000500C3, 0x0000000C,\n    0x000031DE, 0x00003905, 0x00000A17, 0x000500C7, 0x0000000C, 0x00005447,\n    0x000031DE, 0x00000A0E, 0x000500C3, 0x0000000C, 0x000028A6, 0x00006244,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x0000511E, 0x000028A6, 0x00000A14,\n    0x000500C3, 0x0000000C, 0x000028B9, 0x00003905, 0x00000A14, 0x000500C7,\n    0x0000000C, 0x0000505F, 0x000028B9, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x0000541E, 0x0000505F, 0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BB,\n    0x0000511E, 0x0000541E, 0x000500C7, 0x0000000C, 0x00005077, 0x00003905,\n    0x00000A0E, 0x000500C4, 0x0000000C, 0x00005229, 0x00005077, 0x00000A17,\n    0x000500C4, 0x0000000C, 0x00001999, 0x000022BB, 0x00000A1D, 0x000500C5,\n    0x0000000C, 0x000047FF, 0x00005229, 0x00001999, 0x000500C4, 0x0000000C,\n    0x00001C01, 0x00005447, 0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C82,\n    0x000047FF, 0x00001C01, 0x000500C7, 0x0000000C, 0x000050B0, 0x00005E63,\n    0x00000A38, 0x000500C5, 0x0000000C, 0x00003C71, 0x00003C82, 0x000050B0,\n    0x000500C3, 0x0000000C, 0x00003746, 0x00005E63, 0x00000A17, 0x000500C7,\n    0x0000000C, 0x000018BA, 0x00003746, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x00005480, 0x000018BA, 0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A9,\n    0x00003C71, 0x00005480, 0x000500C3, 0x0000000C, 0x00003A6F, 0x00005E63,\n    0x00000A1A, 0x000500C7, 0x0000000C, 0x000018BB, 0x00003A6F, 0x00000A20,\n    0x000500C4, 0x0000000C, 0x00005481, 0x000018BB, 0x00000A23, 0x000500C5,\n    0x0000000C, 0x00004570, 0x000045A9, 0x00005481, 0x000500C3, 0x0000000C,\n    0x00003C89, 0x00005E63, 0x00000A23, 0x000500C4, 0x0000000C, 0x00002825,\n    0x00003C89, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B7A, 0x00004570,\n    0x00002825, 0x0004007C, 0x0000000B, 0x000041E6, 0x00003B7A, 0x000200F9,\n    0x00004F78, 0x000200F8, 0x00004F78, 0x000700F5, 0x0000000B, 0x00004799,\n    0x000041E5, 0x00005BE0, 0x000041E6, 0x00002DD9, 0x00050051, 0x0000000B,\n    0x00003B60, 0x00001997, 0x00000000, 0x00050084, 0x0000000B, 0x00004451,\n    0x00003B60, 0x00002A78, 0x00050084, 0x0000000B, 0x00001C91, 0x00004799,\n    0x00004451, 0x00050080, 0x0000000B, 0x0000226F, 0x00001C91, 0x000044F0,\n    0x00050080, 0x0000000B, 0x000053DE, 0x0000226F, 0x00005EAC, 0x000500C2,\n    0x0000000B, 0x00003948, 0x000053DE, 0x00000A17, 0x00060041, 0x00000294,\n    0x00004FAF, 0x0000107A, 0x00000A0B, 0x00003948, 0x0004003D, 0x00000017,\n    0x00002261, 0x00004FAF, 0x000500AA, 0x00000009, 0x00005272, 0x0000619E,\n    0x00000A0D, 0x000300F7, 0x0000362B, 0x00000000, 0x000400FA, 0x00005272,\n    0x00002957, 0x0000362B, 0x000200F8, 0x00002957, 0x000500C7, 0x00000017,\n    0x0000475F, 0x00002261, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D1,\n    0x0000475F, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AC, 0x00002261,\n    0x0000072E, 0x000500C2, 0x00000017, 0x0000448D, 0x000050AC, 0x0000013D,\n    0x000500C5, 0x00000017, 0x00003FF8, 0x000024D1, 0x0000448D, 0x000200F9,\n    0x0000362B, 0x000200F8, 0x0000362B, 0x000700F5, 0x00000017, 0x00004AB4,\n    0x00002261, 0x00004F78, 0x00003FF8, 0x00002957, 0x000500C2, 0x0000000B,\n    0x00005FC1, 0x00001F01, 0x00000A17, 0x000500C7, 0x00000017, 0x00001CFC,\n    0x00004AB4, 0x00000352, 0x00040070, 0x0000001D, 0x00003F05, 0x00001CFC,\n    0x0005008E, 0x0000001D, 0x00004BA5, 0x00003F05, 0x0000092A, 0x000500C2,\n    0x00000017, 0x00005B47, 0x00004AB4, 0x000002ED, 0x00040070, 0x0000001D,\n    0x0000483C, 0x00005B47, 0x0005008E, 0x0000001D, 0x00004812, 0x0000483C,\n    0x0000092A, 0x00050051, 0x0000000D, 0x0000187C, 0x00004BA5, 0x00000000,\n    0x00050051, 0x0000000D, 0x000035EE, 0x00004812, 0x00000000, 0x00050050,\n    0x00000013, 0x00004B20, 0x0000187C, 0x000035EE, 0x0006000C, 0x0000000B,\n    0x00002171, 0x00000001, 0x0000003A, 0x00004B20, 0x00050051, 0x0000000D,\n    0x00005BBF, 0x00004BA5, 0x00000001, 0x00050051, 0x0000000D, 0x000039A7,\n    0x00004812, 0x00000001, 0x00050050, 0x00000013, 0x00004B21, 0x00005BBF,\n    0x000039A7, 0x0006000C, 0x0000000B, 0x00002172, 0x00000001, 0x0000003A,\n    0x00004B21, 0x00050051, 0x0000000D, 0x00005BC0, 0x00004BA5, 0x00000002,\n    0x00050051, 0x0000000D, 0x000039A8, 0x00004812, 0x00000002, 0x00050050,\n    0x00000013, 0x00004B22, 0x00005BC0, 0x000039A8, 0x0006000C, 0x0000000B,\n    0x00002173, 0x00000001, 0x0000003A, 0x00004B22, 0x00050051, 0x0000000D,\n    0x00005BC1, 0x00004BA5, 0x00000003, 0x00050051, 0x0000000D, 0x000039A9,\n    0x00004812, 0x00000003, 0x00050050, 0x00000013, 0x00004B0D, 0x00005BC1,\n    0x000039A9, 0x0006000C, 0x0000000B, 0x000020EE, 0x00000001, 0x0000003A,\n    0x00004B0D, 0x00070050, 0x00000017, 0x00003ABB, 0x00002171, 0x00002172,\n    0x00002173, 0x000020EE, 0x00060041, 0x00000294, 0x000045C3, 0x0000140E,\n    0x00000A0B, 0x00005FC1, 0x0003003E, 0x000045C3, 0x00003ABB, 0x00050080,\n    0x0000000B, 0x00005679, 0x00001F01, 0x00000A3A, 0x00050080, 0x0000000B,\n    0x000027E6, 0x000053DE, 0x00000A3A, 0x000500C2, 0x0000000B, 0x00003949,\n    0x000027E6, 0x00000A17, 0x00060041, 0x00000294, 0x00005566, 0x0000107A,\n    0x00000A0B, 0x00003949, 0x0004003D, 0x00000017, 0x00003910, 0x00005566,\n    0x000300F7, 0x0000362C, 0x00000000, 0x000400FA, 0x00005272, 0x00002958,\n    0x0000362C, 0x000200F8, 0x00002958, 0x000500C7, 0x00000017, 0x00004760,\n    0x00003910, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D2, 0x00004760,\n    0x0000013D, 0x000500C7, 0x00000017, 0x000050AD, 0x00003910, 0x0000072E,\n    0x000500C2, 0x00000017, 0x0000448E, 0x000050AD, 0x0000013D, 0x000500C5,\n    0x00000017, 0x00003FF9, 0x000024D2, 0x0000448E, 0x000200F9, 0x0000362C,\n    0x000200F8, 0x0000362C, 0x000700F5, 0x00000017, 0x00004AB5, 0x00003910,\n    0x0000362B, 0x00003FF9, 0x00002958, 0x000500C2, 0x0000000B, 0x00005FC2,\n    0x00005679, 0x00000A17, 0x000500C7, 0x00000017, 0x00001CFD, 0x00004AB5,\n    0x00000352, 0x00040070, 0x0000001D, 0x00003F06, 0x00001CFD, 0x0005008E,\n    0x0000001D, 0x00004BA6, 0x00003F06, 0x0000092A, 0x000500C2, 0x00000017,\n    0x00005B48, 0x00004AB5, 0x000002ED, 0x00040070, 0x0000001D, 0x0000483D,\n    0x00005B48, 0x0005008E, 0x0000001D, 0x00004813, 0x0000483D, 0x0000092A,\n    0x00050051, 0x0000000D, 0x0000187D, 0x00004BA6, 0x00000000, 0x00050051,\n    0x0000000D, 0x000035EF, 0x00004813, 0x00000000, 0x00050050, 0x00000013,\n    0x00004B23, 0x0000187D, 0x000035EF, 0x0006000C, 0x0000000B, 0x00002174,\n    0x00000001, 0x0000003A, 0x00004B23, 0x00050051, 0x0000000D, 0x00005BC2,\n    0x00004BA6, 0x00000001, 0x00050051, 0x0000000D, 0x000039AA, 0x00004813,\n    0x00000001, 0x00050050, 0x00000013, 0x00004B24, 0x00005BC2, 0x000039AA,\n    0x0006000C, 0x0000000B, 0x00002175, 0x00000001, 0x0000003A, 0x00004B24,\n    0x00050051, 0x0000000D, 0x00005BC3, 0x00004BA6, 0x00000002, 0x00050051,\n    0x0000000D, 0x000039AB, 0x00004813, 0x00000002, 0x00050050, 0x00000013,\n    0x00004B25, 0x00005BC3, 0x000039AB, 0x0006000C, 0x0000000B, 0x00002176,\n    0x00000001, 0x0000003A, 0x00004B25, 0x00050051, 0x0000000D, 0x00005BC4,\n    0x00004BA6, 0x00000003, 0x00050051, 0x0000000D, 0x000039AC, 0x00004813,\n    0x00000003, 0x00050050, 0x00000013, 0x00004B0E, 0x00005BC4, 0x000039AC,\n    0x0006000C, 0x0000000B, 0x000020EF, 0x00000001, 0x0000003A, 0x00004B0E,\n    0x00070050, 0x00000017, 0x00003ABC, 0x00002174, 0x00002175, 0x00002176,\n    0x000020EF, 0x00060041, 0x00000294, 0x00004EBE, 0x0000140E, 0x00000A0B,\n    0x00005FC2, 0x0003003E, 0x00004EBE, 0x00003ABC, 0x000200F9, 0x00004C7A,\n    0x000200F8, 0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_r4g4b4a4_a4r4g4b4_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25155\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v4uint = OpTypeVector %uint 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v2uint = OpTypeVector %uint 2\n     %v3uint = OpTypeVector %uint 3\n%uint_268374015 = OpConstant %uint 268374015\n     %uint_4 = OpConstant %uint 4\n%uint_4026593280 = OpConstant %uint 4026593280\n    %uint_12 = OpConstant %uint 12\n     %uint_1 = OpConstant %uint 1\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n     %uint_0 = OpConstant %uint 0\n      %int_3 = OpConstant %int 3\n     %uint_2 = OpConstant %uint 2\n      %int_2 = OpConstant %int 2\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n     %uint_3 = OpConstant %uint 3\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %2612 = OpConstantComposite %v3uint %uint_4 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n    %uint_16 = OpConstant %uint 16\n    %uint_32 = OpConstant %uint 32\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n       %1930 = OpConstantComposite %v4uint %uint_268374015 %uint_268374015 %uint_268374015 %uint_268374015\n        %101 = OpConstantComposite %v4uint %uint_4 %uint_4 %uint_4 %uint_4\n       %2418 = OpConstantComposite %v4uint %uint_4026593280 %uint_4026593280 %uint_4026593280 %uint_4026593280\n        %533 = OpConstantComposite %v4uint %uint_12 %uint_12 %uint_12 %uint_12\n    %uint_64 = OpConstant %uint 64\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24540 = OpBitwiseAnd %uint %13606 %uint_1\n      %17270 = OpINotEqual %bool %24540 %uint_0\n      %12328 = OpBitwiseAnd %uint %13606 %uint_2\n      %17284 = OpINotEqual %bool %12328 %uint_0\n       %7856 = OpShiftRightLogical %uint %13606 %uint_2\n      %25058 = OpBitwiseAnd %uint %7856 %uint_3\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2612\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %6586 DontFlatten\n               OpBranchConditional %24679 %21992 %6586\n      %21992 = OpLabel\n               OpBranch %19578\n       %6586 = OpLabel\n      %23478 = OpBitcast %v3int %21387\n      %18710 = OpCompositeExtract %uint %22410 1\n      %23531 = OpCompositeExtract %int %23478 0\n      %22810 = OpIMul %int %23531 %int_2\n       %6362 = OpCompositeExtract %int %23478 2\n      %14505 = OpBitcast %int %18710\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %23478 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %6594\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %22810 %24535\n      %10404 = OpBitcast %uint %8258\n      %14582 = OpIAdd %uint %22411 %10404\n      %12308 = OpLogicalNot %bool %17270\n               OpSelectionMerge %19040 DontFlatten\n               OpBranchConditional %12308 %9741 %17007\n       %9741 = OpLabel\n      %17463 = OpCompositeExtract %uint %21387 0\n      %11246 = OpCompositeExtract %uint %21387 1\n      %18801 = OpCompositeExtract %uint %21387 2\n      %14831 = OpIMul %uint %22409 %18801\n      %20322 = OpIAdd %uint %11246 %14831\n      %21676 = OpIMul %uint %22408 %20322\n      %20398 = OpIAdd %uint %17463 %21676\n      %11367 = OpShiftLeftLogical %uint %20398 %uint_1\n               OpBranch %19040\n      %17007 = OpLabel\n               OpSelectionMerge %23536 DontFlatten\n               OpBranchConditional %17284 %11410 %24353\n      %11410 = OpLabel\n      %21364 = OpShiftRightLogical %uint %22408 %int_5\n      %13804 = OpShiftRightLogical %uint %22409 %int_4\n      %13237 = OpShiftRightArithmetic %int %6362 %int_2\n      %22374 = OpBitcast %int %13804\n      %25085 = OpIMul %int %13237 %22374\n      %11618 = OpShiftRightArithmetic %int %17598 %int_4\n      %16670 = OpIAdd %int %25085 %11618\n      %19064 = OpBitcast %int %21364\n      %13020 = OpIMul %int %16670 %19064\n      %12986 = OpShiftRightArithmetic %int %23531 %int_5\n      %24558 = OpIAdd %int %13020 %12986\n       %8797 = OpShiftLeftLogical %int %24558 %int_7\n      %11434 = OpBitwiseAnd %int %6362 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %17598 %int_1\n      %21365 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21365 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %23531 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17334 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17334 %uint_1\n      %13015 = OpShiftRightArithmetic %int %17598 %int_3\n       %9929 = OpBitwiseXor %int %13015 %13237\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %23531 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %17598 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6551\n       %7168 = OpShiftLeftLogical %int %16793 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24144 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24144 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24144 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24144 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %23536\n      %24353 = OpLabel\n      %23000 = OpBitcast %v2int %17136\n      %22120 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %23000 1\n      %12089 = OpShiftRightArithmetic %int %14597 %int_5\n      %22400 = OpBitcast %int %22120\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %23000 0\n      %20423 = OpShiftRightArithmetic %int %25154 %int_5\n      %18864 = OpIAdd %int %7938 %20423\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25154 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17335 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17335 %uint_1\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25154 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6552\n       %7169 = OpShiftLeftLogical %int %21575 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24163 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24163 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24163 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %23536\n      %23536 = OpLabel\n      %10540 = OpPhi %uint %16869 %11410 %16870 %24353\n               OpBranch %19040\n      %19040 = OpLabel\n      %11376 = OpPhi %uint %11367 %9741 %10540 %23536\n      %18621 = OpIAdd %uint %11376 %24236\n      %15698 = OpShiftRightLogical %uint %18621 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15698\n       %8801 = OpLoad %v4uint %20399\n      %21106 = OpIEqual %bool %25058 %uint_1\n               OpSelectionMerge %13867 None\n               OpBranchConditional %21106 %10583 %13867\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %8801 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %8801 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13867\n      %13867 = OpLabel\n      %19124 = OpPhi %v4uint %8801 %19040 %16376 %10583\n       %7038 = OpShiftRightLogical %uint %14582 %int_4\n      %13042 = OpBitwiseAnd %v4uint %19124 %1930\n      %23687 = OpShiftLeftLogical %v4uint %13042 %101\n      %20653 = OpBitwiseAnd %v4uint %19124 %2418\n      %14053 = OpShiftRightLogical %v4uint %20653 %533\n       %6532 = OpBitwiseOr %v4uint %23687 %14053\n      %20254 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %7038\n               OpStore %20254 %6532\n      %21685 = OpIAdd %uint %14582 %uint_16\n               OpSelectionMerge %24688 DontFlatten\n               OpBranchConditional %17270 %21993 %7205\n      %21993 = OpLabel\n               OpBranch %24688\n       %7205 = OpLabel\n               OpBranch %24688\n      %24688 = OpLabel\n      %11377 = OpPhi %uint %uint_64 %21993 %uint_16 %7205\n      %18622 = OpIAdd %uint %18621 %11377\n      %15699 = OpShiftRightLogical %uint %18622 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15699\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %13868 None\n               OpBranchConditional %21106 %10584 %13868\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20654 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20654 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %13868\n      %13868 = OpLabel\n      %19125 = OpPhi %v4uint %14608 %24688 %16377 %10584\n       %7039 = OpShiftRightLogical %uint %21685 %int_4\n      %13043 = OpBitwiseAnd %v4uint %19125 %1930\n      %23688 = OpShiftLeftLogical %v4uint %13043 %101\n      %20657 = OpBitwiseAnd %v4uint %19125 %2418\n      %14054 = OpShiftRightLogical %v4uint %20657 %533\n       %6533 = OpBitwiseOr %v4uint %23688 %14054\n      %22553 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %7039\n               OpStore %22553 %6533\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_r4g4b4a4_a4r4g4b4_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006243, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000017, 0x0000000B, 0x00000004, 0x00040015, 0x0000000C,\n    0x00000020, 0x00000001, 0x00040017, 0x00000012, 0x0000000C, 0x00000002,\n    0x00040017, 0x00000016, 0x0000000C, 0x00000003, 0x00020014, 0x00000009,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x0004002B, 0x0000000B, 0x00000501, 0x0FFF0FFF,\n    0x0004002B, 0x0000000B, 0x00000A16, 0x00000004, 0x0004002B, 0x0000000B,\n    0x000009A2, 0xF000F000, 0x0004002B, 0x0000000B, 0x00000A2E, 0x0000000C,\n    0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B,\n    0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B, 0x00000A22, 0x00000008,\n    0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00, 0x0004002B, 0x0000000C,\n    0x00000A17, 0x00000004, 0x0004002B, 0x0000000C, 0x00000A1D, 0x00000006,\n    0x0004002B, 0x0000000C, 0x00000A2C, 0x0000000B, 0x0004002B, 0x0000000C,\n    0x00000A38, 0x0000000F, 0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001,\n    0x0004002B, 0x0000000C, 0x00000A1A, 0x00000005, 0x0004002B, 0x0000000C,\n    0x00000A20, 0x00000007, 0x0004002B, 0x0000000C, 0x00000A23, 0x00000008,\n    0x0004002B, 0x0000000C, 0x00000A2F, 0x0000000C, 0x0004002B, 0x0000000B,\n    0x00000A0A, 0x00000000, 0x0004002B, 0x0000000C, 0x00000A14, 0x00000003,\n    0x0004002B, 0x0000000B, 0x00000A10, 0x00000002, 0x0004002B, 0x0000000C,\n    0x00000A11, 0x00000002, 0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000,\n    0x000A001E, 0x00000489, 0x0000000B, 0x0000000B, 0x0000000B, 0x0000000B,\n    0x00000014, 0x0000000B, 0x0000000B, 0x0000000B, 0x00040020, 0x00000706,\n    0x00000009, 0x00000489, 0x0004003B, 0x00000706, 0x00000CE9, 0x00000009,\n    0x00040020, 0x00000288, 0x00000009, 0x0000000B, 0x0004002B, 0x0000000B,\n    0x00000A13, 0x00000003, 0x00040020, 0x00000291, 0x00000009, 0x00000014,\n    0x00040020, 0x00000292, 0x00000001, 0x00000014, 0x0004003B, 0x00000292,\n    0x00000F48, 0x00000001, 0x0006002C, 0x00000014, 0x00000A34, 0x00000A16,\n    0x00000A0A, 0x00000A0A, 0x00040017, 0x0000000F, 0x00000009, 0x00000002,\n    0x0003001D, 0x000007DC, 0x00000017, 0x0003001E, 0x000007B4, 0x000007DC,\n    0x00040020, 0x00000A31, 0x00000002, 0x000007B4, 0x0004003B, 0x00000A31,\n    0x0000107A, 0x00000002, 0x00040020, 0x00000294, 0x00000002, 0x00000017,\n    0x0003001D, 0x000007DD, 0x00000017, 0x0003001E, 0x000007B5, 0x000007DD,\n    0x00040020, 0x00000A32, 0x00000002, 0x000007B5, 0x0004003B, 0x00000A32,\n    0x0000140E, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A3A, 0x00000010,\n    0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020, 0x0006002C, 0x00000014,\n    0x00000BC3, 0x00000A16, 0x00000A6A, 0x00000A0D, 0x0007002C, 0x00000017,\n    0x000009CE, 0x000008A6, 0x000008A6, 0x000008A6, 0x000008A6, 0x0007002C,\n    0x00000017, 0x0000013D, 0x00000A22, 0x00000A22, 0x00000A22, 0x00000A22,\n    0x0007002C, 0x00000017, 0x0000072E, 0x000005FD, 0x000005FD, 0x000005FD,\n    0x000005FD, 0x0007002C, 0x00000017, 0x0000078A, 0x00000501, 0x00000501,\n    0x00000501, 0x00000501, 0x0007002C, 0x00000017, 0x00000065, 0x00000A16,\n    0x00000A16, 0x00000A16, 0x00000A16, 0x0007002C, 0x00000017, 0x00000972,\n    0x000009A2, 0x000009A2, 0x000009A2, 0x000009A2, 0x0007002C, 0x00000017,\n    0x00000215, 0x00000A2E, 0x00000A2E, 0x00000A2E, 0x00000A2E, 0x0004002B,\n    0x0000000B, 0x00000ACA, 0x00000040, 0x00050036, 0x00000008, 0x0000161F,\n    0x00000000, 0x00000502, 0x000200F8, 0x00003B06, 0x000300F7, 0x00004C7A,\n    0x00000000, 0x000300FB, 0x00000A0A, 0x00002E68, 0x000200F8, 0x00002E68,\n    0x00050041, 0x00000288, 0x000060D7, 0x00000CE9, 0x00000A0B, 0x0004003D,\n    0x0000000B, 0x00003526, 0x000060D7, 0x000500C7, 0x0000000B, 0x00005FDC,\n    0x00003526, 0x00000A0D, 0x000500AB, 0x00000009, 0x00004376, 0x00005FDC,\n    0x00000A0A, 0x000500C7, 0x0000000B, 0x00003028, 0x00003526, 0x00000A10,\n    0x000500AB, 0x00000009, 0x00004384, 0x00003028, 0x00000A0A, 0x000500C2,\n    0x0000000B, 0x00001EB0, 0x00003526, 0x00000A10, 0x000500C7, 0x0000000B,\n    0x000061E2, 0x00001EB0, 0x00000A13, 0x00050041, 0x00000288, 0x0000492C,\n    0x00000CE9, 0x00000A0E, 0x0004003D, 0x0000000B, 0x00005EAC, 0x0000492C,\n    0x00050041, 0x00000288, 0x00004EBA, 0x00000CE9, 0x00000A11, 0x0004003D,\n    0x0000000B, 0x00005788, 0x00004EBA, 0x00050041, 0x00000288, 0x00004EBB,\n    0x00000CE9, 0x00000A14, 0x0004003D, 0x0000000B, 0x00005789, 0x00004EBB,\n    0x00050041, 0x00000291, 0x00004EBC, 0x00000CE9, 0x00000A17, 0x0004003D,\n    0x00000014, 0x0000578A, 0x00004EBC, 0x00050041, 0x00000288, 0x00004EBD,\n    0x00000CE9, 0x00000A1A, 0x0004003D, 0x0000000B, 0x0000578B, 0x00004EBD,\n    0x00050041, 0x00000288, 0x00004E6E, 0x00000CE9, 0x00000A1D, 0x0004003D,\n    0x0000000B, 0x000019C2, 0x00004E6E, 0x0004003D, 0x00000014, 0x00002A0E,\n    0x00000F48, 0x000500C4, 0x00000014, 0x0000538B, 0x00002A0E, 0x00000A34,\n    0x0007004F, 0x00000011, 0x000042F0, 0x0000538B, 0x0000538B, 0x00000000,\n    0x00000001, 0x0007004F, 0x00000011, 0x0000242F, 0x0000578A, 0x0000578A,\n    0x00000000, 0x00000001, 0x000500AE, 0x0000000F, 0x00004288, 0x000042F0,\n    0x0000242F, 0x0004009A, 0x00000009, 0x00006067, 0x00004288, 0x000300F7,\n    0x000019BA, 0x00000002, 0x000400FA, 0x00006067, 0x000055E8, 0x000019BA,\n    0x000200F8, 0x000055E8, 0x000200F9, 0x00004C7A, 0x000200F8, 0x000019BA,\n    0x0004007C, 0x00000016, 0x00005BB6, 0x0000538B, 0x00050051, 0x0000000B,\n    0x00004916, 0x0000578A, 0x00000001, 0x00050051, 0x0000000C, 0x00005BEB,\n    0x00005BB6, 0x00000000, 0x00050084, 0x0000000C, 0x0000591A, 0x00005BEB,\n    0x00000A11, 0x00050051, 0x0000000C, 0x000018DA, 0x00005BB6, 0x00000002,\n    0x0004007C, 0x0000000C, 0x000038A9, 0x00004916, 0x00050084, 0x0000000C,\n    0x00002C0F, 0x000018DA, 0x000038A9, 0x00050051, 0x0000000C, 0x000044BE,\n    0x00005BB6, 0x00000001, 0x00050080, 0x0000000C, 0x000056D4, 0x00002C0F,\n    0x000044BE, 0x0004007C, 0x0000000C, 0x00005785, 0x000019C2, 0x00050084,\n    0x0000000C, 0x00005FD7, 0x000056D4, 0x00005785, 0x00050080, 0x0000000C,\n    0x00002042, 0x0000591A, 0x00005FD7, 0x0004007C, 0x0000000B, 0x000028A4,\n    0x00002042, 0x00050080, 0x0000000B, 0x000038F6, 0x0000578B, 0x000028A4,\n    0x000400A8, 0x00000009, 0x00003014, 0x00004376, 0x000300F7, 0x00004A60,\n    0x00000002, 0x000400FA, 0x00003014, 0x0000260D, 0x0000426F, 0x000200F8,\n    0x0000260D, 0x00050051, 0x0000000B, 0x00004437, 0x0000538B, 0x00000000,\n    0x00050051, 0x0000000B, 0x00002BEE, 0x0000538B, 0x00000001, 0x00050051,\n    0x0000000B, 0x00004971, 0x0000538B, 0x00000002, 0x00050084, 0x0000000B,\n    0x000039EF, 0x00005789, 0x00004971, 0x00050080, 0x0000000B, 0x00004F62,\n    0x00002BEE, 0x000039EF, 0x00050084, 0x0000000B, 0x000054AC, 0x00005788,\n    0x00004F62, 0x00050080, 0x0000000B, 0x00004FAE, 0x00004437, 0x000054AC,\n    0x000500C4, 0x0000000B, 0x00002C67, 0x00004FAE, 0x00000A0D, 0x000200F9,\n    0x00004A60, 0x000200F8, 0x0000426F, 0x000300F7, 0x00005BF0, 0x00000002,\n    0x000400FA, 0x00004384, 0x00002C92, 0x00005F21, 0x000200F8, 0x00002C92,\n    0x000500C2, 0x0000000B, 0x00005374, 0x00005788, 0x00000A1A, 0x000500C2,\n    0x0000000B, 0x000035EC, 0x00005789, 0x00000A17, 0x000500C3, 0x0000000C,\n    0x000033B5, 0x000018DA, 0x00000A11, 0x0004007C, 0x0000000C, 0x00005766,\n    0x000035EC, 0x00050084, 0x0000000C, 0x000061FD, 0x000033B5, 0x00005766,\n    0x000500C3, 0x0000000C, 0x00002D62, 0x000044BE, 0x00000A17, 0x00050080,\n    0x0000000C, 0x0000411E, 0x000061FD, 0x00002D62, 0x0004007C, 0x0000000C,\n    0x00004A78, 0x00005374, 0x00050084, 0x0000000C, 0x000032DC, 0x0000411E,\n    0x00004A78, 0x000500C3, 0x0000000C, 0x000032BA, 0x00005BEB, 0x00000A1A,\n    0x00050080, 0x0000000C, 0x00005FEE, 0x000032DC, 0x000032BA, 0x000500C4,\n    0x0000000C, 0x0000225D, 0x00005FEE, 0x00000A20, 0x000500C7, 0x0000000C,\n    0x00002CAA, 0x000018DA, 0x00000A14, 0x000500C4, 0x0000000C, 0x00004CAE,\n    0x00002CAA, 0x00000A1A, 0x000500C3, 0x0000000C, 0x0000383E, 0x000044BE,\n    0x00000A0E, 0x000500C7, 0x0000000C, 0x00005375, 0x0000383E, 0x00000A14,\n    0x000500C4, 0x0000000C, 0x000054CA, 0x00005375, 0x00000A14, 0x000500C5,\n    0x0000000C, 0x000042CE, 0x00004CAE, 0x000054CA, 0x000500C7, 0x0000000C,\n    0x000050D5, 0x00005BEB, 0x00000A20, 0x000500C5, 0x0000000C, 0x00003ADD,\n    0x000042CE, 0x000050D5, 0x000500C5, 0x0000000C, 0x000043B6, 0x0000225D,\n    0x00003ADD, 0x000500C4, 0x0000000C, 0x00005E50, 0x000043B6, 0x00000A0D,\n    0x000500C3, 0x0000000C, 0x000032D7, 0x000044BE, 0x00000A14, 0x000500C6,\n    0x0000000C, 0x000026C9, 0x000032D7, 0x000033B5, 0x000500C7, 0x0000000C,\n    0x00004199, 0x000026C9, 0x00000A0E, 0x000500C3, 0x0000000C, 0x00002590,\n    0x00005BEB, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000505E, 0x00002590,\n    0x00000A14, 0x000500C4, 0x0000000C, 0x0000541D, 0x00004199, 0x00000A0E,\n    0x000500C6, 0x0000000C, 0x000022BA, 0x0000505E, 0x0000541D, 0x000500C7,\n    0x0000000C, 0x00005076, 0x000044BE, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x00005228, 0x00005076, 0x00000A17, 0x000500C4, 0x0000000C, 0x00001997,\n    0x000022BA, 0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FE, 0x00005228,\n    0x00001997, 0x000500C4, 0x0000000C, 0x00001C00, 0x00004199, 0x00000A2C,\n    0x000500C5, 0x0000000C, 0x00003C81, 0x000047FE, 0x00001C00, 0x000500C7,\n    0x0000000C, 0x000050AF, 0x00005E50, 0x00000A38, 0x000500C5, 0x0000000C,\n    0x00003C70, 0x00003C81, 0x000050AF, 0x000500C3, 0x0000000C, 0x00003745,\n    0x00005E50, 0x00000A17, 0x000500C7, 0x0000000C, 0x000018B8, 0x00003745,\n    0x00000A0E, 0x000500C4, 0x0000000C, 0x0000547E, 0x000018B8, 0x00000A1A,\n    0x000500C5, 0x0000000C, 0x000045A8, 0x00003C70, 0x0000547E, 0x000500C3,\n    0x0000000C, 0x00003A6E, 0x00005E50, 0x00000A1A, 0x000500C7, 0x0000000C,\n    0x000018B9, 0x00003A6E, 0x00000A20, 0x000500C4, 0x0000000C, 0x0000547F,\n    0x000018B9, 0x00000A23, 0x000500C5, 0x0000000C, 0x0000456F, 0x000045A8,\n    0x0000547F, 0x000500C3, 0x0000000C, 0x00003C88, 0x00005E50, 0x00000A23,\n    0x000500C4, 0x0000000C, 0x00002824, 0x00003C88, 0x00000A2F, 0x000500C5,\n    0x0000000C, 0x00003B79, 0x0000456F, 0x00002824, 0x0004007C, 0x0000000B,\n    0x000041E5, 0x00003B79, 0x000200F9, 0x00005BF0, 0x000200F8, 0x00005F21,\n    0x0004007C, 0x00000012, 0x000059D8, 0x000042F0, 0x000500C2, 0x0000000B,\n    0x00005668, 0x00005788, 0x00000A1A, 0x00050051, 0x0000000C, 0x00003905,\n    0x000059D8, 0x00000001, 0x000500C3, 0x0000000C, 0x00002F39, 0x00003905,\n    0x00000A1A, 0x0004007C, 0x0000000C, 0x00005780, 0x00005668, 0x00050084,\n    0x0000000C, 0x00001F02, 0x00002F39, 0x00005780, 0x00050051, 0x0000000C,\n    0x00006242, 0x000059D8, 0x00000000, 0x000500C3, 0x0000000C, 0x00004FC7,\n    0x00006242, 0x00000A1A, 0x00050080, 0x0000000C, 0x000049B0, 0x00001F02,\n    0x00004FC7, 0x000500C4, 0x0000000C, 0x0000254A, 0x000049B0, 0x00000A1D,\n    0x000500C3, 0x0000000C, 0x0000603B, 0x00003905, 0x00000A0E, 0x000500C7,\n    0x0000000C, 0x0000539A, 0x0000603B, 0x00000A20, 0x000500C4, 0x0000000C,\n    0x0000534A, 0x0000539A, 0x00000A14, 0x000500C7, 0x0000000C, 0x00004EA5,\n    0x00006242, 0x00000A20, 0x000500C5, 0x0000000C, 0x00002B1A, 0x0000534A,\n    0x00004EA5, 0x000500C5, 0x0000000C, 0x000043B7, 0x0000254A, 0x00002B1A,\n    0x000500C4, 0x0000000C, 0x00005E63, 0x000043B7, 0x00000A0D, 0x000500C3,\n    0x0000000C, 0x000031DE, 0x00003905, 0x00000A17, 0x000500C7, 0x0000000C,\n    0x00005447, 0x000031DE, 0x00000A0E, 0x000500C3, 0x0000000C, 0x000028A6,\n    0x00006242, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000511E, 0x000028A6,\n    0x00000A14, 0x000500C3, 0x0000000C, 0x000028B9, 0x00003905, 0x00000A14,\n    0x000500C7, 0x0000000C, 0x0000505F, 0x000028B9, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x0000541E, 0x0000505F, 0x00000A0E, 0x000500C6, 0x0000000C,\n    0x000022BB, 0x0000511E, 0x0000541E, 0x000500C7, 0x0000000C, 0x00005077,\n    0x00003905, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005229, 0x00005077,\n    0x00000A17, 0x000500C4, 0x0000000C, 0x00001998, 0x000022BB, 0x00000A1D,\n    0x000500C5, 0x0000000C, 0x000047FF, 0x00005229, 0x00001998, 0x000500C4,\n    0x0000000C, 0x00001C01, 0x00005447, 0x00000A2C, 0x000500C5, 0x0000000C,\n    0x00003C82, 0x000047FF, 0x00001C01, 0x000500C7, 0x0000000C, 0x000050B0,\n    0x00005E63, 0x00000A38, 0x000500C5, 0x0000000C, 0x00003C71, 0x00003C82,\n    0x000050B0, 0x000500C3, 0x0000000C, 0x00003746, 0x00005E63, 0x00000A17,\n    0x000500C7, 0x0000000C, 0x000018BA, 0x00003746, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x00005480, 0x000018BA, 0x00000A1A, 0x000500C5, 0x0000000C,\n    0x000045A9, 0x00003C71, 0x00005480, 0x000500C3, 0x0000000C, 0x00003A6F,\n    0x00005E63, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018BB, 0x00003A6F,\n    0x00000A20, 0x000500C4, 0x0000000C, 0x00005481, 0x000018BB, 0x00000A23,\n    0x000500C5, 0x0000000C, 0x00004570, 0x000045A9, 0x00005481, 0x000500C3,\n    0x0000000C, 0x00003C89, 0x00005E63, 0x00000A23, 0x000500C4, 0x0000000C,\n    0x00002825, 0x00003C89, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B7A,\n    0x00004570, 0x00002825, 0x0004007C, 0x0000000B, 0x000041E6, 0x00003B7A,\n    0x000200F9, 0x00005BF0, 0x000200F8, 0x00005BF0, 0x000700F5, 0x0000000B,\n    0x0000292C, 0x000041E5, 0x00002C92, 0x000041E6, 0x00005F21, 0x000200F9,\n    0x00004A60, 0x000200F8, 0x00004A60, 0x000700F5, 0x0000000B, 0x00002C70,\n    0x00002C67, 0x0000260D, 0x0000292C, 0x00005BF0, 0x00050080, 0x0000000B,\n    0x000048BD, 0x00002C70, 0x00005EAC, 0x000500C2, 0x0000000B, 0x00003D52,\n    0x000048BD, 0x00000A17, 0x00060041, 0x00000294, 0x00004FAF, 0x0000107A,\n    0x00000A0B, 0x00003D52, 0x0004003D, 0x00000017, 0x00002261, 0x00004FAF,\n    0x000500AA, 0x00000009, 0x00005272, 0x000061E2, 0x00000A0D, 0x000300F7,\n    0x0000362B, 0x00000000, 0x000400FA, 0x00005272, 0x00002957, 0x0000362B,\n    0x000200F8, 0x00002957, 0x000500C7, 0x00000017, 0x0000475F, 0x00002261,\n    0x000009CE, 0x000500C4, 0x00000017, 0x000024D1, 0x0000475F, 0x0000013D,\n    0x000500C7, 0x00000017, 0x000050AC, 0x00002261, 0x0000072E, 0x000500C2,\n    0x00000017, 0x0000448D, 0x000050AC, 0x0000013D, 0x000500C5, 0x00000017,\n    0x00003FF8, 0x000024D1, 0x0000448D, 0x000200F9, 0x0000362B, 0x000200F8,\n    0x0000362B, 0x000700F5, 0x00000017, 0x00004AB4, 0x00002261, 0x00004A60,\n    0x00003FF8, 0x00002957, 0x000500C2, 0x0000000B, 0x00001B7E, 0x000038F6,\n    0x00000A17, 0x000500C7, 0x00000017, 0x000032F2, 0x00004AB4, 0x0000078A,\n    0x000500C4, 0x00000017, 0x00005C87, 0x000032F2, 0x00000065, 0x000500C7,\n    0x00000017, 0x000050AD, 0x00004AB4, 0x00000972, 0x000500C2, 0x00000017,\n    0x000036E5, 0x000050AD, 0x00000215, 0x000500C5, 0x00000017, 0x00001984,\n    0x00005C87, 0x000036E5, 0x00060041, 0x00000294, 0x00004F1E, 0x0000140E,\n    0x00000A0B, 0x00001B7E, 0x0003003E, 0x00004F1E, 0x00001984, 0x00050080,\n    0x0000000B, 0x000054B5, 0x000038F6, 0x00000A3A, 0x000300F7, 0x00006070,\n    0x00000002, 0x000400FA, 0x00004376, 0x000055E9, 0x00001C25, 0x000200F8,\n    0x000055E9, 0x000200F9, 0x00006070, 0x000200F8, 0x00001C25, 0x000200F9,\n    0x00006070, 0x000200F8, 0x00006070, 0x000700F5, 0x0000000B, 0x00002C71,\n    0x00000ACA, 0x000055E9, 0x00000A3A, 0x00001C25, 0x00050080, 0x0000000B,\n    0x000048BE, 0x000048BD, 0x00002C71, 0x000500C2, 0x0000000B, 0x00003D53,\n    0x000048BE, 0x00000A17, 0x00060041, 0x00000294, 0x00005566, 0x0000107A,\n    0x00000A0B, 0x00003D53, 0x0004003D, 0x00000017, 0x00003910, 0x00005566,\n    0x000300F7, 0x0000362C, 0x00000000, 0x000400FA, 0x00005272, 0x00002958,\n    0x0000362C, 0x000200F8, 0x00002958, 0x000500C7, 0x00000017, 0x00004760,\n    0x00003910, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D2, 0x00004760,\n    0x0000013D, 0x000500C7, 0x00000017, 0x000050AE, 0x00003910, 0x0000072E,\n    0x000500C2, 0x00000017, 0x0000448E, 0x000050AE, 0x0000013D, 0x000500C5,\n    0x00000017, 0x00003FF9, 0x000024D2, 0x0000448E, 0x000200F9, 0x0000362C,\n    0x000200F8, 0x0000362C, 0x000700F5, 0x00000017, 0x00004AB5, 0x00003910,\n    0x00006070, 0x00003FF9, 0x00002958, 0x000500C2, 0x0000000B, 0x00001B7F,\n    0x000054B5, 0x00000A17, 0x000500C7, 0x00000017, 0x000032F3, 0x00004AB5,\n    0x0000078A, 0x000500C4, 0x00000017, 0x00005C88, 0x000032F3, 0x00000065,\n    0x000500C7, 0x00000017, 0x000050B1, 0x00004AB5, 0x00000972, 0x000500C2,\n    0x00000017, 0x000036E6, 0x000050B1, 0x00000215, 0x000500C5, 0x00000017,\n    0x00001985, 0x00005C88, 0x000036E6, 0x00060041, 0x00000294, 0x00005819,\n    0x0000140E, 0x00000A0B, 0x00001B7F, 0x0003003E, 0x00005819, 0x00001985,\n    0x000200F9, 0x00004C7A, 0x000200F8, 0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_r4g4b4a4_a4r4g4b4_scaled_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25157\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n     %v4uint = OpTypeVector %uint 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v3uint = OpTypeVector %uint 3\n%uint_268374015 = OpConstant %uint 268374015\n     %uint_4 = OpConstant %uint 4\n%uint_4026593280 = OpConstant %uint 4026593280\n    %uint_12 = OpConstant %uint 12\n     %uint_1 = OpConstant %uint 1\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n     %uint_0 = OpConstant %uint 0\n      %int_3 = OpConstant %int 3\n     %uint_2 = OpConstant %uint 2\n      %int_2 = OpConstant %int 2\n     %uint_3 = OpConstant %uint 3\n     %uint_5 = OpConstant %uint 5\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n     %uint_7 = OpConstant %uint 7\n       %1927 = OpConstantComposite %v2uint %uint_4 %uint_7\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %2612 = OpConstantComposite %v3uint %uint_4 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n    %uint_16 = OpConstant %uint 16\n    %uint_32 = OpConstant %uint 32\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %1954 = OpConstantComposite %v2uint %uint_7 %uint_7\n       %1867 = OpConstantComposite %v2uint %uint_4 %uint_2\n    %uint_15 = OpConstant %uint 15\n       %1978 = OpConstantComposite %v2uint %uint_15 %uint_3\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n       %1930 = OpConstantComposite %v4uint %uint_268374015 %uint_268374015 %uint_268374015 %uint_268374015\n        %101 = OpConstantComposite %v4uint %uint_4 %uint_4 %uint_4 %uint_4\n       %2418 = OpConstantComposite %v4uint %uint_4026593280 %uint_4026593280 %uint_4026593280 %uint_4026593280\n        %533 = OpConstantComposite %v4uint %uint_12 %uint_12 %uint_12 %uint_12\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24445 = OpBitwiseAnd %uint %13606 %uint_2\n      %18667 = OpINotEqual %bool %24445 %uint_0\n       %8141 = OpShiftRightLogical %uint %13606 %uint_2\n      %24990 = OpBitwiseAnd %uint %8141 %uint_3\n       %8871 = OpCompositeConstruct %v2uint %13606 %13606\n       %7087 = OpShiftRightLogical %v2uint %8871 %1927\n       %6551 = OpBitwiseAnd %v2uint %7087 %1954\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2612\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %6586 DontFlatten\n               OpBranchConditional %24679 %21992 %6586\n      %21992 = OpLabel\n               OpBranch %19578\n       %6586 = OpLabel\n      %23478 = OpBitcast %v3int %21387\n      %18710 = OpCompositeExtract %uint %22410 1\n      %23531 = OpCompositeExtract %int %23478 0\n      %22810 = OpIMul %int %23531 %int_2\n       %6362 = OpCompositeExtract %int %23478 2\n      %14505 = OpBitcast %int %18710\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %23478 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %6594\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %22810 %24535\n      %10898 = OpBitcast %uint %8258\n       %7937 = OpIAdd %uint %22411 %10898\n      %19921 = OpShiftRightLogical %v2uint %17136 %1867\n       %7712 = OpUDiv %v2uint %19921 %6551\n      %18183 = OpIMul %v2uint %6551 %7712\n      %18273 = OpISub %v2uint %19921 %18183\n      %11232 = OpShiftLeftLogical %v2uint %7712 %1867\n      %13284 = OpCompositeExtract %uint %18273 0\n      %10872 = OpCompositeExtract %uint %6551 1\n      %22886 = OpIMul %uint %13284 %10872\n       %6943 = OpCompositeExtract %uint %18273 1\n      %10469 = OpIAdd %uint %22886 %6943\n      %18851 = OpBitwiseAnd %v2uint %17136 %1978\n      %10581 = OpShiftLeftLogical %uint %10469 %uint_7\n      %20916 = OpCompositeExtract %uint %18851 1\n      %23596 = OpShiftLeftLogical %uint %20916 %uint_5\n      %19814 = OpBitwiseOr %uint %10581 %23596\n      %21476 = OpCompositeExtract %uint %18851 0\n       %8560 = OpShiftLeftLogical %uint %21476 %uint_1\n      %17648 = OpBitwiseOr %uint %19814 %8560\n      %19923 = OpCompositeExtract %uint %11232 0\n      %15556 = OpCompositeInsert %v3uint %19923 %21387 0\n      %23006 = OpCompositeExtract %uint %11232 1\n       %9680 = OpCompositeInsert %v3uint %23006 %15556 1\n               OpSelectionMerge %20344 DontFlatten\n               OpBranchConditional %18667 %23520 %11737\n      %23520 = OpLabel\n      %10111 = OpBitcast %v3int %9680\n      %19476 = OpShiftRightLogical %uint %22408 %int_5\n      %18810 = OpShiftRightLogical %uint %22409 %int_4\n       %6782 = OpCompositeExtract %int %10111 2\n      %12089 = OpShiftRightArithmetic %int %6782 %int_2\n      %22400 = OpBitcast %int %18810\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %10111 1\n      %19055 = OpShiftRightArithmetic %int %25154 %int_4\n      %11052 = OpIAdd %int %7938 %19055\n      %16898 = OpBitcast %int %19476\n      %14944 = OpIMul %int %11052 %16898\n      %25155 = OpCompositeExtract %int %10111 0\n      %20423 = OpShiftRightArithmetic %int %25155 %int_5\n      %18940 = OpIAdd %int %14944 %20423\n       %8797 = OpShiftLeftLogical %int %18940 %int_7\n      %11434 = OpBitwiseAnd %int %6782 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %25154 %int_1\n      %21364 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21364 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %25155 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17334 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17334 %uint_1\n      %13015 = OpShiftRightArithmetic %int %25154 %int_3\n       %9929 = OpBitwiseXor %int %13015 %12089\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %25155 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %25154 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6552 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6552\n       %7168 = OpShiftLeftLogical %int %16793 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24144 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24144 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24144 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24144 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %20344\n      %11737 = OpLabel\n      %11908 = OpVectorShuffle %v2uint %9680 %9680 0 1\n      %20347 = OpBitcast %v2int %11908\n      %11433 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %20347 1\n      %12090 = OpShiftRightArithmetic %int %14597 %int_5\n      %22401 = OpBitcast %int %11433\n       %7939 = OpIMul %int %12090 %22401\n      %25156 = OpCompositeExtract %int %20347 0\n      %20424 = OpShiftRightArithmetic %int %25156 %int_5\n      %18864 = OpIAdd %int %7939 %20424\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25156 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17335 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17335 %uint_1\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25156 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6553 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6553\n       %7169 = OpShiftLeftLogical %int %21575 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24163 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24163 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24163 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %20344\n      %20344 = OpLabel\n      %18329 = OpPhi %uint %16869 %23520 %16870 %11737\n      %15200 = OpCompositeExtract %uint %6551 0\n      %17489 = OpIMul %uint %15200 %10872\n       %7313 = OpIMul %uint %18329 %17489\n       %8815 = OpIAdd %uint %7313 %17648\n      %21470 = OpIAdd %uint %8815 %24236\n      %14664 = OpShiftRightLogical %uint %21470 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %14664\n       %8801 = OpLoad %v4uint %20399\n      %21106 = OpIEqual %bool %24990 %uint_1\n               OpSelectionMerge %13867 None\n               OpBranchConditional %21106 %10583 %13867\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %8801 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %8801 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13867\n      %13867 = OpLabel\n      %19124 = OpPhi %v4uint %8801 %20344 %16376 %10583\n       %7038 = OpShiftRightLogical %uint %7937 %int_4\n      %13042 = OpBitwiseAnd %v4uint %19124 %1930\n      %23687 = OpShiftLeftLogical %v4uint %13042 %101\n      %20653 = OpBitwiseAnd %v4uint %19124 %2418\n      %14053 = OpShiftRightLogical %v4uint %20653 %533\n       %6532 = OpBitwiseOr %v4uint %23687 %14053\n      %20254 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %7038\n               OpStore %20254 %6532\n      %22137 = OpIAdd %uint %7937 %uint_16\n      %10214 = OpIAdd %uint %21470 %uint_16\n      %14665 = OpShiftRightLogical %uint %10214 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %14665\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %13868 None\n               OpBranchConditional %21106 %10584 %13868\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20654 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20654 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %13868\n      %13868 = OpLabel\n      %19125 = OpPhi %v4uint %14608 %13867 %16377 %10584\n       %7039 = OpShiftRightLogical %uint %22137 %int_4\n      %13043 = OpBitwiseAnd %v4uint %19125 %1930\n      %23688 = OpShiftLeftLogical %v4uint %13043 %101\n      %20657 = OpBitwiseAnd %v4uint %19125 %2418\n      %14054 = OpShiftRightLogical %v4uint %20657 %533\n       %6533 = OpBitwiseOr %v4uint %23688 %14054\n      %22553 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %7039\n               OpStore %22553 %6533\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_r4g4b4a4_a4r4g4b4_scaled_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006245, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000017,\n    0x0000000B, 0x00000004, 0x00040015, 0x0000000C, 0x00000020, 0x00000001,\n    0x00040017, 0x00000012, 0x0000000C, 0x00000002, 0x00040017, 0x00000016,\n    0x0000000C, 0x00000003, 0x00020014, 0x00000009, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x0004002B, 0x0000000B, 0x00000501, 0x0FFF0FFF,\n    0x0004002B, 0x0000000B, 0x00000A16, 0x00000004, 0x0004002B, 0x0000000B,\n    0x000009A2, 0xF000F000, 0x0004002B, 0x0000000B, 0x00000A2E, 0x0000000C,\n    0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B,\n    0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B, 0x00000A22, 0x00000008,\n    0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00, 0x0004002B, 0x0000000C,\n    0x00000A17, 0x00000004, 0x0004002B, 0x0000000C, 0x00000A1D, 0x00000006,\n    0x0004002B, 0x0000000C, 0x00000A2C, 0x0000000B, 0x0004002B, 0x0000000C,\n    0x00000A38, 0x0000000F, 0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001,\n    0x0004002B, 0x0000000C, 0x00000A1A, 0x00000005, 0x0004002B, 0x0000000C,\n    0x00000A20, 0x00000007, 0x0004002B, 0x0000000C, 0x00000A23, 0x00000008,\n    0x0004002B, 0x0000000C, 0x00000A2F, 0x0000000C, 0x0004002B, 0x0000000B,\n    0x00000A0A, 0x00000000, 0x0004002B, 0x0000000C, 0x00000A14, 0x00000003,\n    0x0004002B, 0x0000000B, 0x00000A10, 0x00000002, 0x0004002B, 0x0000000C,\n    0x00000A11, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A13, 0x00000003,\n    0x0004002B, 0x0000000B, 0x00000A19, 0x00000005, 0x0004002B, 0x0000000C,\n    0x00000A0B, 0x00000000, 0x000A001E, 0x00000489, 0x0000000B, 0x0000000B,\n    0x0000000B, 0x0000000B, 0x00000014, 0x0000000B, 0x0000000B, 0x0000000B,\n    0x00040020, 0x00000706, 0x00000009, 0x00000489, 0x0004003B, 0x00000706,\n    0x00000CE9, 0x00000009, 0x00040020, 0x00000288, 0x00000009, 0x0000000B,\n    0x0004002B, 0x0000000B, 0x00000A1F, 0x00000007, 0x0005002C, 0x00000011,\n    0x00000787, 0x00000A16, 0x00000A1F, 0x00040020, 0x00000291, 0x00000009,\n    0x00000014, 0x00040020, 0x00000292, 0x00000001, 0x00000014, 0x0004003B,\n    0x00000292, 0x00000F48, 0x00000001, 0x0006002C, 0x00000014, 0x00000A34,\n    0x00000A16, 0x00000A0A, 0x00000A0A, 0x00040017, 0x0000000F, 0x00000009,\n    0x00000002, 0x0003001D, 0x000007DC, 0x00000017, 0x0003001E, 0x000007B4,\n    0x000007DC, 0x00040020, 0x00000A31, 0x00000002, 0x000007B4, 0x0004003B,\n    0x00000A31, 0x0000107A, 0x00000002, 0x00040020, 0x00000294, 0x00000002,\n    0x00000017, 0x0003001D, 0x000007DD, 0x00000017, 0x0003001E, 0x000007B5,\n    0x000007DD, 0x00040020, 0x00000A32, 0x00000002, 0x000007B5, 0x0004003B,\n    0x00000A32, 0x0000140E, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A3A,\n    0x00000010, 0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020, 0x0006002C,\n    0x00000014, 0x00000BC3, 0x00000A16, 0x00000A6A, 0x00000A0D, 0x0005002C,\n    0x00000011, 0x000007A2, 0x00000A1F, 0x00000A1F, 0x0005002C, 0x00000011,\n    0x0000074B, 0x00000A16, 0x00000A10, 0x0004002B, 0x0000000B, 0x00000A37,\n    0x0000000F, 0x0005002C, 0x00000011, 0x000007BA, 0x00000A37, 0x00000A13,\n    0x0007002C, 0x00000017, 0x000009CE, 0x000008A6, 0x000008A6, 0x000008A6,\n    0x000008A6, 0x0007002C, 0x00000017, 0x0000013D, 0x00000A22, 0x00000A22,\n    0x00000A22, 0x00000A22, 0x0007002C, 0x00000017, 0x0000072E, 0x000005FD,\n    0x000005FD, 0x000005FD, 0x000005FD, 0x0007002C, 0x00000017, 0x0000078A,\n    0x00000501, 0x00000501, 0x00000501, 0x00000501, 0x0007002C, 0x00000017,\n    0x00000065, 0x00000A16, 0x00000A16, 0x00000A16, 0x00000A16, 0x0007002C,\n    0x00000017, 0x00000972, 0x000009A2, 0x000009A2, 0x000009A2, 0x000009A2,\n    0x0007002C, 0x00000017, 0x00000215, 0x00000A2E, 0x00000A2E, 0x00000A2E,\n    0x00000A2E, 0x00050036, 0x00000008, 0x0000161F, 0x00000000, 0x00000502,\n    0x000200F8, 0x00003B06, 0x000300F7, 0x00004C7A, 0x00000000, 0x000300FB,\n    0x00000A0A, 0x00002E68, 0x000200F8, 0x00002E68, 0x00050041, 0x00000288,\n    0x000060D7, 0x00000CE9, 0x00000A0B, 0x0004003D, 0x0000000B, 0x00003526,\n    0x000060D7, 0x000500C7, 0x0000000B, 0x00005F7D, 0x00003526, 0x00000A10,\n    0x000500AB, 0x00000009, 0x000048EB, 0x00005F7D, 0x00000A0A, 0x000500C2,\n    0x0000000B, 0x00001FCD, 0x00003526, 0x00000A10, 0x000500C7, 0x0000000B,\n    0x0000619E, 0x00001FCD, 0x00000A13, 0x00050050, 0x00000011, 0x000022A7,\n    0x00003526, 0x00003526, 0x000500C2, 0x00000011, 0x00001BAF, 0x000022A7,\n    0x00000787, 0x000500C7, 0x00000011, 0x00001997, 0x00001BAF, 0x000007A2,\n    0x00050041, 0x00000288, 0x0000492C, 0x00000CE9, 0x00000A0E, 0x0004003D,\n    0x0000000B, 0x00005EAC, 0x0000492C, 0x00050041, 0x00000288, 0x00004EBA,\n    0x00000CE9, 0x00000A11, 0x0004003D, 0x0000000B, 0x00005788, 0x00004EBA,\n    0x00050041, 0x00000288, 0x00004EBB, 0x00000CE9, 0x00000A14, 0x0004003D,\n    0x0000000B, 0x00005789, 0x00004EBB, 0x00050041, 0x00000291, 0x00004EBC,\n    0x00000CE9, 0x00000A17, 0x0004003D, 0x00000014, 0x0000578A, 0x00004EBC,\n    0x00050041, 0x00000288, 0x00004EBD, 0x00000CE9, 0x00000A1A, 0x0004003D,\n    0x0000000B, 0x0000578B, 0x00004EBD, 0x00050041, 0x00000288, 0x00004E6E,\n    0x00000CE9, 0x00000A1D, 0x0004003D, 0x0000000B, 0x000019C2, 0x00004E6E,\n    0x0004003D, 0x00000014, 0x00002A0E, 0x00000F48, 0x000500C4, 0x00000014,\n    0x0000538B, 0x00002A0E, 0x00000A34, 0x0007004F, 0x00000011, 0x000042F0,\n    0x0000538B, 0x0000538B, 0x00000000, 0x00000001, 0x0007004F, 0x00000011,\n    0x0000242F, 0x0000578A, 0x0000578A, 0x00000000, 0x00000001, 0x000500AE,\n    0x0000000F, 0x00004288, 0x000042F0, 0x0000242F, 0x0004009A, 0x00000009,\n    0x00006067, 0x00004288, 0x000300F7, 0x000019BA, 0x00000002, 0x000400FA,\n    0x00006067, 0x000055E8, 0x000019BA, 0x000200F8, 0x000055E8, 0x000200F9,\n    0x00004C7A, 0x000200F8, 0x000019BA, 0x0004007C, 0x00000016, 0x00005BB6,\n    0x0000538B, 0x00050051, 0x0000000B, 0x00004916, 0x0000578A, 0x00000001,\n    0x00050051, 0x0000000C, 0x00005BEB, 0x00005BB6, 0x00000000, 0x00050084,\n    0x0000000C, 0x0000591A, 0x00005BEB, 0x00000A11, 0x00050051, 0x0000000C,\n    0x000018DA, 0x00005BB6, 0x00000002, 0x0004007C, 0x0000000C, 0x000038A9,\n    0x00004916, 0x00050084, 0x0000000C, 0x00002C0F, 0x000018DA, 0x000038A9,\n    0x00050051, 0x0000000C, 0x000044BE, 0x00005BB6, 0x00000001, 0x00050080,\n    0x0000000C, 0x000056D4, 0x00002C0F, 0x000044BE, 0x0004007C, 0x0000000C,\n    0x00005785, 0x000019C2, 0x00050084, 0x0000000C, 0x00005FD7, 0x000056D4,\n    0x00005785, 0x00050080, 0x0000000C, 0x00002042, 0x0000591A, 0x00005FD7,\n    0x0004007C, 0x0000000B, 0x00002A92, 0x00002042, 0x00050080, 0x0000000B,\n    0x00001F01, 0x0000578B, 0x00002A92, 0x000500C2, 0x00000011, 0x00004DD1,\n    0x000042F0, 0x0000074B, 0x00050086, 0x00000011, 0x00001E20, 0x00004DD1,\n    0x00001997, 0x00050084, 0x00000011, 0x00004707, 0x00001997, 0x00001E20,\n    0x00050082, 0x00000011, 0x00004761, 0x00004DD1, 0x00004707, 0x000500C4,\n    0x00000011, 0x00002BE0, 0x00001E20, 0x0000074B, 0x00050051, 0x0000000B,\n    0x000033E4, 0x00004761, 0x00000000, 0x00050051, 0x0000000B, 0x00002A78,\n    0x00001997, 0x00000001, 0x00050084, 0x0000000B, 0x00005966, 0x000033E4,\n    0x00002A78, 0x00050051, 0x0000000B, 0x00001B1F, 0x00004761, 0x00000001,\n    0x00050080, 0x0000000B, 0x000028E5, 0x00005966, 0x00001B1F, 0x000500C7,\n    0x00000011, 0x000049A3, 0x000042F0, 0x000007BA, 0x000500C4, 0x0000000B,\n    0x00002955, 0x000028E5, 0x00000A1F, 0x00050051, 0x0000000B, 0x000051B4,\n    0x000049A3, 0x00000001, 0x000500C4, 0x0000000B, 0x00005C2C, 0x000051B4,\n    0x00000A19, 0x000500C5, 0x0000000B, 0x00004D66, 0x00002955, 0x00005C2C,\n    0x00050051, 0x0000000B, 0x000053E4, 0x000049A3, 0x00000000, 0x000500C4,\n    0x0000000B, 0x00002170, 0x000053E4, 0x00000A0D, 0x000500C5, 0x0000000B,\n    0x000044F0, 0x00004D66, 0x00002170, 0x00050051, 0x0000000B, 0x00004DD3,\n    0x00002BE0, 0x00000000, 0x00060052, 0x00000014, 0x00003CC4, 0x00004DD3,\n    0x0000538B, 0x00000000, 0x00050051, 0x0000000B, 0x000059DE, 0x00002BE0,\n    0x00000001, 0x00060052, 0x00000014, 0x000025D0, 0x000059DE, 0x00003CC4,\n    0x00000001, 0x000300F7, 0x00004F78, 0x00000002, 0x000400FA, 0x000048EB,\n    0x00005BE0, 0x00002DD9, 0x000200F8, 0x00005BE0, 0x0004007C, 0x00000016,\n    0x0000277F, 0x000025D0, 0x000500C2, 0x0000000B, 0x00004C14, 0x00005788,\n    0x00000A1A, 0x000500C2, 0x0000000B, 0x0000497A, 0x00005789, 0x00000A17,\n    0x00050051, 0x0000000C, 0x00001A7E, 0x0000277F, 0x00000002, 0x000500C3,\n    0x0000000C, 0x00002F39, 0x00001A7E, 0x00000A11, 0x0004007C, 0x0000000C,\n    0x00005780, 0x0000497A, 0x00050084, 0x0000000C, 0x00001F02, 0x00002F39,\n    0x00005780, 0x00050051, 0x0000000C, 0x00006242, 0x0000277F, 0x00000001,\n    0x000500C3, 0x0000000C, 0x00004A6F, 0x00006242, 0x00000A17, 0x00050080,\n    0x0000000C, 0x00002B2C, 0x00001F02, 0x00004A6F, 0x0004007C, 0x0000000C,\n    0x00004202, 0x00004C14, 0x00050084, 0x0000000C, 0x00003A60, 0x00002B2C,\n    0x00004202, 0x00050051, 0x0000000C, 0x00006243, 0x0000277F, 0x00000000,\n    0x000500C3, 0x0000000C, 0x00004FC7, 0x00006243, 0x00000A1A, 0x00050080,\n    0x0000000C, 0x000049FC, 0x00003A60, 0x00004FC7, 0x000500C4, 0x0000000C,\n    0x0000225D, 0x000049FC, 0x00000A20, 0x000500C7, 0x0000000C, 0x00002CAA,\n    0x00001A7E, 0x00000A14, 0x000500C4, 0x0000000C, 0x00004CAE, 0x00002CAA,\n    0x00000A1A, 0x000500C3, 0x0000000C, 0x0000383E, 0x00006242, 0x00000A0E,\n    0x000500C7, 0x0000000C, 0x00005374, 0x0000383E, 0x00000A14, 0x000500C4,\n    0x0000000C, 0x000054CA, 0x00005374, 0x00000A14, 0x000500C5, 0x0000000C,\n    0x000042CE, 0x00004CAE, 0x000054CA, 0x000500C7, 0x0000000C, 0x000050D5,\n    0x00006243, 0x00000A20, 0x000500C5, 0x0000000C, 0x00003ADD, 0x000042CE,\n    0x000050D5, 0x000500C5, 0x0000000C, 0x000043B6, 0x0000225D, 0x00003ADD,\n    0x000500C4, 0x0000000C, 0x00005E50, 0x000043B6, 0x00000A0D, 0x000500C3,\n    0x0000000C, 0x000032D7, 0x00006242, 0x00000A14, 0x000500C6, 0x0000000C,\n    0x000026C9, 0x000032D7, 0x00002F39, 0x000500C7, 0x0000000C, 0x00004199,\n    0x000026C9, 0x00000A0E, 0x000500C3, 0x0000000C, 0x00002590, 0x00006243,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x0000505E, 0x00002590, 0x00000A14,\n    0x000500C4, 0x0000000C, 0x0000541D, 0x00004199, 0x00000A0E, 0x000500C6,\n    0x0000000C, 0x000022BA, 0x0000505E, 0x0000541D, 0x000500C7, 0x0000000C,\n    0x00005076, 0x00006242, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005228,\n    0x00005076, 0x00000A17, 0x000500C4, 0x0000000C, 0x00001998, 0x000022BA,\n    0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FE, 0x00005228, 0x00001998,\n    0x000500C4, 0x0000000C, 0x00001C00, 0x00004199, 0x00000A2C, 0x000500C5,\n    0x0000000C, 0x00003C81, 0x000047FE, 0x00001C00, 0x000500C7, 0x0000000C,\n    0x000050AF, 0x00005E50, 0x00000A38, 0x000500C5, 0x0000000C, 0x00003C70,\n    0x00003C81, 0x000050AF, 0x000500C3, 0x0000000C, 0x00003745, 0x00005E50,\n    0x00000A17, 0x000500C7, 0x0000000C, 0x000018B8, 0x00003745, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x0000547E, 0x000018B8, 0x00000A1A, 0x000500C5,\n    0x0000000C, 0x000045A8, 0x00003C70, 0x0000547E, 0x000500C3, 0x0000000C,\n    0x00003A6E, 0x00005E50, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018B9,\n    0x00003A6E, 0x00000A20, 0x000500C4, 0x0000000C, 0x0000547F, 0x000018B9,\n    0x00000A23, 0x000500C5, 0x0000000C, 0x0000456F, 0x000045A8, 0x0000547F,\n    0x000500C3, 0x0000000C, 0x00003C88, 0x00005E50, 0x00000A23, 0x000500C4,\n    0x0000000C, 0x00002824, 0x00003C88, 0x00000A2F, 0x000500C5, 0x0000000C,\n    0x00003B79, 0x0000456F, 0x00002824, 0x0004007C, 0x0000000B, 0x000041E5,\n    0x00003B79, 0x000200F9, 0x00004F78, 0x000200F8, 0x00002DD9, 0x0007004F,\n    0x00000011, 0x00002E84, 0x000025D0, 0x000025D0, 0x00000000, 0x00000001,\n    0x0004007C, 0x00000012, 0x00004F7B, 0x00002E84, 0x000500C2, 0x0000000B,\n    0x00002CA9, 0x00005788, 0x00000A1A, 0x00050051, 0x0000000C, 0x00003905,\n    0x00004F7B, 0x00000001, 0x000500C3, 0x0000000C, 0x00002F3A, 0x00003905,\n    0x00000A1A, 0x0004007C, 0x0000000C, 0x00005781, 0x00002CA9, 0x00050084,\n    0x0000000C, 0x00001F03, 0x00002F3A, 0x00005781, 0x00050051, 0x0000000C,\n    0x00006244, 0x00004F7B, 0x00000000, 0x000500C3, 0x0000000C, 0x00004FC8,\n    0x00006244, 0x00000A1A, 0x00050080, 0x0000000C, 0x000049B0, 0x00001F03,\n    0x00004FC8, 0x000500C4, 0x0000000C, 0x0000254A, 0x000049B0, 0x00000A1D,\n    0x000500C3, 0x0000000C, 0x0000603B, 0x00003905, 0x00000A0E, 0x000500C7,\n    0x0000000C, 0x0000539A, 0x0000603B, 0x00000A20, 0x000500C4, 0x0000000C,\n    0x0000534A, 0x0000539A, 0x00000A14, 0x000500C7, 0x0000000C, 0x00004EA5,\n    0x00006244, 0x00000A20, 0x000500C5, 0x0000000C, 0x00002B1A, 0x0000534A,\n    0x00004EA5, 0x000500C5, 0x0000000C, 0x000043B7, 0x0000254A, 0x00002B1A,\n    0x000500C4, 0x0000000C, 0x00005E63, 0x000043B7, 0x00000A0D, 0x000500C3,\n    0x0000000C, 0x000031DE, 0x00003905, 0x00000A17, 0x000500C7, 0x0000000C,\n    0x00005447, 0x000031DE, 0x00000A0E, 0x000500C3, 0x0000000C, 0x000028A6,\n    0x00006244, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000511E, 0x000028A6,\n    0x00000A14, 0x000500C3, 0x0000000C, 0x000028B9, 0x00003905, 0x00000A14,\n    0x000500C7, 0x0000000C, 0x0000505F, 0x000028B9, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x0000541E, 0x0000505F, 0x00000A0E, 0x000500C6, 0x0000000C,\n    0x000022BB, 0x0000511E, 0x0000541E, 0x000500C7, 0x0000000C, 0x00005077,\n    0x00003905, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005229, 0x00005077,\n    0x00000A17, 0x000500C4, 0x0000000C, 0x00001999, 0x000022BB, 0x00000A1D,\n    0x000500C5, 0x0000000C, 0x000047FF, 0x00005229, 0x00001999, 0x000500C4,\n    0x0000000C, 0x00001C01, 0x00005447, 0x00000A2C, 0x000500C5, 0x0000000C,\n    0x00003C82, 0x000047FF, 0x00001C01, 0x000500C7, 0x0000000C, 0x000050B0,\n    0x00005E63, 0x00000A38, 0x000500C5, 0x0000000C, 0x00003C71, 0x00003C82,\n    0x000050B0, 0x000500C3, 0x0000000C, 0x00003746, 0x00005E63, 0x00000A17,\n    0x000500C7, 0x0000000C, 0x000018BA, 0x00003746, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x00005480, 0x000018BA, 0x00000A1A, 0x000500C5, 0x0000000C,\n    0x000045A9, 0x00003C71, 0x00005480, 0x000500C3, 0x0000000C, 0x00003A6F,\n    0x00005E63, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018BB, 0x00003A6F,\n    0x00000A20, 0x000500C4, 0x0000000C, 0x00005481, 0x000018BB, 0x00000A23,\n    0x000500C5, 0x0000000C, 0x00004570, 0x000045A9, 0x00005481, 0x000500C3,\n    0x0000000C, 0x00003C89, 0x00005E63, 0x00000A23, 0x000500C4, 0x0000000C,\n    0x00002825, 0x00003C89, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B7A,\n    0x00004570, 0x00002825, 0x0004007C, 0x0000000B, 0x000041E6, 0x00003B7A,\n    0x000200F9, 0x00004F78, 0x000200F8, 0x00004F78, 0x000700F5, 0x0000000B,\n    0x00004799, 0x000041E5, 0x00005BE0, 0x000041E6, 0x00002DD9, 0x00050051,\n    0x0000000B, 0x00003B60, 0x00001997, 0x00000000, 0x00050084, 0x0000000B,\n    0x00004451, 0x00003B60, 0x00002A78, 0x00050084, 0x0000000B, 0x00001C91,\n    0x00004799, 0x00004451, 0x00050080, 0x0000000B, 0x0000226F, 0x00001C91,\n    0x000044F0, 0x00050080, 0x0000000B, 0x000053DE, 0x0000226F, 0x00005EAC,\n    0x000500C2, 0x0000000B, 0x00003948, 0x000053DE, 0x00000A17, 0x00060041,\n    0x00000294, 0x00004FAF, 0x0000107A, 0x00000A0B, 0x00003948, 0x0004003D,\n    0x00000017, 0x00002261, 0x00004FAF, 0x000500AA, 0x00000009, 0x00005272,\n    0x0000619E, 0x00000A0D, 0x000300F7, 0x0000362B, 0x00000000, 0x000400FA,\n    0x00005272, 0x00002957, 0x0000362B, 0x000200F8, 0x00002957, 0x000500C7,\n    0x00000017, 0x0000475F, 0x00002261, 0x000009CE, 0x000500C4, 0x00000017,\n    0x000024D1, 0x0000475F, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AC,\n    0x00002261, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448D, 0x000050AC,\n    0x0000013D, 0x000500C5, 0x00000017, 0x00003FF8, 0x000024D1, 0x0000448D,\n    0x000200F9, 0x0000362B, 0x000200F8, 0x0000362B, 0x000700F5, 0x00000017,\n    0x00004AB4, 0x00002261, 0x00004F78, 0x00003FF8, 0x00002957, 0x000500C2,\n    0x0000000B, 0x00001B7E, 0x00001F01, 0x00000A17, 0x000500C7, 0x00000017,\n    0x000032F2, 0x00004AB4, 0x0000078A, 0x000500C4, 0x00000017, 0x00005C87,\n    0x000032F2, 0x00000065, 0x000500C7, 0x00000017, 0x000050AD, 0x00004AB4,\n    0x00000972, 0x000500C2, 0x00000017, 0x000036E5, 0x000050AD, 0x00000215,\n    0x000500C5, 0x00000017, 0x00001984, 0x00005C87, 0x000036E5, 0x00060041,\n    0x00000294, 0x00004F1E, 0x0000140E, 0x00000A0B, 0x00001B7E, 0x0003003E,\n    0x00004F1E, 0x00001984, 0x00050080, 0x0000000B, 0x00005679, 0x00001F01,\n    0x00000A3A, 0x00050080, 0x0000000B, 0x000027E6, 0x000053DE, 0x00000A3A,\n    0x000500C2, 0x0000000B, 0x00003949, 0x000027E6, 0x00000A17, 0x00060041,\n    0x00000294, 0x00005566, 0x0000107A, 0x00000A0B, 0x00003949, 0x0004003D,\n    0x00000017, 0x00003910, 0x00005566, 0x000300F7, 0x0000362C, 0x00000000,\n    0x000400FA, 0x00005272, 0x00002958, 0x0000362C, 0x000200F8, 0x00002958,\n    0x000500C7, 0x00000017, 0x00004760, 0x00003910, 0x000009CE, 0x000500C4,\n    0x00000017, 0x000024D2, 0x00004760, 0x0000013D, 0x000500C7, 0x00000017,\n    0x000050AE, 0x00003910, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448E,\n    0x000050AE, 0x0000013D, 0x000500C5, 0x00000017, 0x00003FF9, 0x000024D2,\n    0x0000448E, 0x000200F9, 0x0000362C, 0x000200F8, 0x0000362C, 0x000700F5,\n    0x00000017, 0x00004AB5, 0x00003910, 0x0000362B, 0x00003FF9, 0x00002958,\n    0x000500C2, 0x0000000B, 0x00001B7F, 0x00005679, 0x00000A17, 0x000500C7,\n    0x00000017, 0x000032F3, 0x00004AB5, 0x0000078A, 0x000500C4, 0x00000017,\n    0x00005C88, 0x000032F3, 0x00000065, 0x000500C7, 0x00000017, 0x000050B1,\n    0x00004AB5, 0x00000972, 0x000500C2, 0x00000017, 0x000036E6, 0x000050B1,\n    0x00000215, 0x000500C5, 0x00000017, 0x00001985, 0x00005C88, 0x000036E6,\n    0x00060041, 0x00000294, 0x00005819, 0x0000140E, 0x00000A0B, 0x00001B7F,\n    0x0003003E, 0x00005819, 0x00001985, 0x000200F9, 0x00004C7A, 0x000200F8,\n    0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_r4g4b4a4_b4g4r4a4_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25155\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v4uint = OpTypeVector %uint 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v2uint = OpTypeVector %uint 2\n     %v3uint = OpTypeVector %uint 3\n%uint_4042322160 = OpConstant %uint 4042322160\n%uint_983055 = OpConstant %uint 983055\n     %uint_8 = OpConstant %uint 8\n%uint_251662080 = OpConstant %uint 251662080\n     %uint_1 = OpConstant %uint 1\n%uint_16711935 = OpConstant %uint 16711935\n%uint_4278255360 = OpConstant %uint 4278255360\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n     %uint_0 = OpConstant %uint 0\n      %int_3 = OpConstant %int 3\n     %uint_2 = OpConstant %uint 2\n      %int_2 = OpConstant %int 2\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n     %uint_3 = OpConstant %uint 3\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n     %uint_4 = OpConstant %uint 4\n       %2612 = OpConstantComposite %v3uint %uint_4 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n    %uint_16 = OpConstant %uint 16\n    %uint_32 = OpConstant %uint 32\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %992 = OpConstantComposite %v4uint %uint_4042322160 %uint_4042322160 %uint_4042322160 %uint_4042322160\n        %925 = OpConstantComposite %v4uint %uint_983055 %uint_983055 %uint_983055 %uint_983055\n       %2316 = OpConstantComposite %v4uint %uint_251662080 %uint_251662080 %uint_251662080 %uint_251662080\n    %uint_64 = OpConstant %uint 64\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24540 = OpBitwiseAnd %uint %13606 %uint_1\n      %17270 = OpINotEqual %bool %24540 %uint_0\n      %12328 = OpBitwiseAnd %uint %13606 %uint_2\n      %17284 = OpINotEqual %bool %12328 %uint_0\n       %7856 = OpShiftRightLogical %uint %13606 %uint_2\n      %25058 = OpBitwiseAnd %uint %7856 %uint_3\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2612\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %6586 DontFlatten\n               OpBranchConditional %24679 %21992 %6586\n      %21992 = OpLabel\n               OpBranch %19578\n       %6586 = OpLabel\n      %23478 = OpBitcast %v3int %21387\n      %18710 = OpCompositeExtract %uint %22410 1\n      %23531 = OpCompositeExtract %int %23478 0\n      %22810 = OpIMul %int %23531 %int_2\n       %6362 = OpCompositeExtract %int %23478 2\n      %14505 = OpBitcast %int %18710\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %23478 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %6594\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %22810 %24535\n      %10404 = OpBitcast %uint %8258\n      %14582 = OpIAdd %uint %22411 %10404\n      %12308 = OpLogicalNot %bool %17270\n               OpSelectionMerge %19040 DontFlatten\n               OpBranchConditional %12308 %9741 %17007\n       %9741 = OpLabel\n      %17463 = OpCompositeExtract %uint %21387 0\n      %11246 = OpCompositeExtract %uint %21387 1\n      %18801 = OpCompositeExtract %uint %21387 2\n      %14831 = OpIMul %uint %22409 %18801\n      %20322 = OpIAdd %uint %11246 %14831\n      %21676 = OpIMul %uint %22408 %20322\n      %20398 = OpIAdd %uint %17463 %21676\n      %11367 = OpShiftLeftLogical %uint %20398 %uint_1\n               OpBranch %19040\n      %17007 = OpLabel\n               OpSelectionMerge %23536 DontFlatten\n               OpBranchConditional %17284 %11410 %24353\n      %11410 = OpLabel\n      %21364 = OpShiftRightLogical %uint %22408 %int_5\n      %13804 = OpShiftRightLogical %uint %22409 %int_4\n      %13237 = OpShiftRightArithmetic %int %6362 %int_2\n      %22374 = OpBitcast %int %13804\n      %25085 = OpIMul %int %13237 %22374\n      %11618 = OpShiftRightArithmetic %int %17598 %int_4\n      %16670 = OpIAdd %int %25085 %11618\n      %19064 = OpBitcast %int %21364\n      %13020 = OpIMul %int %16670 %19064\n      %12986 = OpShiftRightArithmetic %int %23531 %int_5\n      %24558 = OpIAdd %int %13020 %12986\n       %8797 = OpShiftLeftLogical %int %24558 %int_7\n      %11434 = OpBitwiseAnd %int %6362 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %17598 %int_1\n      %21365 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21365 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %23531 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17334 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17334 %uint_1\n      %13015 = OpShiftRightArithmetic %int %17598 %int_3\n       %9929 = OpBitwiseXor %int %13015 %13237\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %23531 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %17598 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6551\n       %7168 = OpShiftLeftLogical %int %16793 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24144 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24144 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24144 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24144 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %23536\n      %24353 = OpLabel\n      %23000 = OpBitcast %v2int %17136\n      %22120 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %23000 1\n      %12089 = OpShiftRightArithmetic %int %14597 %int_5\n      %22400 = OpBitcast %int %22120\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %23000 0\n      %20423 = OpShiftRightArithmetic %int %25154 %int_5\n      %18864 = OpIAdd %int %7938 %20423\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25154 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17335 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17335 %uint_1\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25154 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6552\n       %7169 = OpShiftLeftLogical %int %21575 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24163 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24163 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24163 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %23536\n      %23536 = OpLabel\n      %10540 = OpPhi %uint %16869 %11410 %16870 %24353\n               OpBranch %19040\n      %19040 = OpLabel\n      %11376 = OpPhi %uint %11367 %9741 %10540 %23536\n      %18621 = OpIAdd %uint %11376 %24236\n      %15698 = OpShiftRightLogical %uint %18621 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15698\n       %8801 = OpLoad %v4uint %20399\n      %21106 = OpIEqual %bool %25058 %uint_1\n               OpSelectionMerge %13867 None\n               OpBranchConditional %21106 %10583 %13867\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %8801 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %8801 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13867\n      %13867 = OpLabel\n      %19124 = OpPhi %v4uint %8801 %19040 %16376 %10583\n       %7095 = OpShiftRightLogical %uint %14582 %int_4\n      %12466 = OpBitwiseAnd %v4uint %19124 %992\n      %18755 = OpBitwiseAnd %v4uint %19124 %925\n      %24932 = OpShiftLeftLogical %v4uint %18755 %317\n      %17045 = OpBitwiseOr %v4uint %12466 %24932\n      %21212 = OpBitwiseAnd %v4uint %19124 %2316\n      %18088 = OpShiftRightLogical %v4uint %21212 %317\n       %6532 = OpBitwiseOr %v4uint %17045 %18088\n      %20254 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %7095\n               OpStore %20254 %6532\n      %21685 = OpIAdd %uint %14582 %uint_16\n               OpSelectionMerge %24688 DontFlatten\n               OpBranchConditional %17270 %21993 %7205\n      %21993 = OpLabel\n               OpBranch %24688\n       %7205 = OpLabel\n               OpBranch %24688\n      %24688 = OpLabel\n      %11377 = OpPhi %uint %uint_64 %21993 %uint_16 %7205\n      %18622 = OpIAdd %uint %18621 %11377\n      %15699 = OpShiftRightLogical %uint %18622 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15699\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %13868 None\n               OpBranchConditional %21106 %10584 %13868\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %13868\n      %13868 = OpLabel\n      %19125 = OpPhi %v4uint %14608 %24688 %16377 %10584\n       %7096 = OpShiftRightLogical %uint %21685 %int_4\n      %12467 = OpBitwiseAnd %v4uint %19125 %992\n      %18756 = OpBitwiseAnd %v4uint %19125 %925\n      %24933 = OpShiftLeftLogical %v4uint %18756 %317\n      %17046 = OpBitwiseOr %v4uint %12467 %24933\n      %21213 = OpBitwiseAnd %v4uint %19125 %2316\n      %18089 = OpShiftRightLogical %v4uint %21213 %317\n       %6533 = OpBitwiseOr %v4uint %17046 %18089\n      %22553 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %7096\n               OpStore %22553 %6533\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_r4g4b4a4_b4g4r4a4_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006243, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000017, 0x0000000B, 0x00000004, 0x00040015, 0x0000000C,\n    0x00000020, 0x00000001, 0x00040017, 0x00000012, 0x0000000C, 0x00000002,\n    0x00040017, 0x00000016, 0x0000000C, 0x00000003, 0x00020014, 0x00000009,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x0004002B, 0x0000000B, 0x000002CA, 0xF0F0F0F0,\n    0x0004002B, 0x0000000B, 0x000003BB, 0x000F000F, 0x0004002B, 0x0000000B,\n    0x00000A22, 0x00000008, 0x0004002B, 0x0000000B, 0x00000665, 0x0F000F00,\n    0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B,\n    0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00,\n    0x0004002B, 0x0000000C, 0x00000A17, 0x00000004, 0x0004002B, 0x0000000C,\n    0x00000A1D, 0x00000006, 0x0004002B, 0x0000000C, 0x00000A2C, 0x0000000B,\n    0x0004002B, 0x0000000C, 0x00000A38, 0x0000000F, 0x0004002B, 0x0000000C,\n    0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C, 0x00000A1A, 0x00000005,\n    0x0004002B, 0x0000000C, 0x00000A20, 0x00000007, 0x0004002B, 0x0000000C,\n    0x00000A23, 0x00000008, 0x0004002B, 0x0000000C, 0x00000A2F, 0x0000000C,\n    0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000, 0x0004002B, 0x0000000C,\n    0x00000A14, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A10, 0x00000002,\n    0x0004002B, 0x0000000C, 0x00000A11, 0x00000002, 0x0004002B, 0x0000000C,\n    0x00000A0B, 0x00000000, 0x000A001E, 0x00000489, 0x0000000B, 0x0000000B,\n    0x0000000B, 0x0000000B, 0x00000014, 0x0000000B, 0x0000000B, 0x0000000B,\n    0x00040020, 0x00000706, 0x00000009, 0x00000489, 0x0004003B, 0x00000706,\n    0x00000CE9, 0x00000009, 0x00040020, 0x00000288, 0x00000009, 0x0000000B,\n    0x0004002B, 0x0000000B, 0x00000A13, 0x00000003, 0x00040020, 0x00000291,\n    0x00000009, 0x00000014, 0x00040020, 0x00000292, 0x00000001, 0x00000014,\n    0x0004003B, 0x00000292, 0x00000F48, 0x00000001, 0x0004002B, 0x0000000B,\n    0x00000A16, 0x00000004, 0x0006002C, 0x00000014, 0x00000A34, 0x00000A16,\n    0x00000A0A, 0x00000A0A, 0x00040017, 0x0000000F, 0x00000009, 0x00000002,\n    0x0003001D, 0x000007DC, 0x00000017, 0x0003001E, 0x000007B4, 0x000007DC,\n    0x00040020, 0x00000A31, 0x00000002, 0x000007B4, 0x0004003B, 0x00000A31,\n    0x0000107A, 0x00000002, 0x00040020, 0x00000294, 0x00000002, 0x00000017,\n    0x0003001D, 0x000007DD, 0x00000017, 0x0003001E, 0x000007B5, 0x000007DD,\n    0x00040020, 0x00000A32, 0x00000002, 0x000007B5, 0x0004003B, 0x00000A32,\n    0x0000140E, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A3A, 0x00000010,\n    0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020, 0x0006002C, 0x00000014,\n    0x00000BC3, 0x00000A16, 0x00000A6A, 0x00000A0D, 0x0007002C, 0x00000017,\n    0x000009CE, 0x000008A6, 0x000008A6, 0x000008A6, 0x000008A6, 0x0007002C,\n    0x00000017, 0x0000013D, 0x00000A22, 0x00000A22, 0x00000A22, 0x00000A22,\n    0x0007002C, 0x00000017, 0x0000072E, 0x000005FD, 0x000005FD, 0x000005FD,\n    0x000005FD, 0x0007002C, 0x00000017, 0x000003E0, 0x000002CA, 0x000002CA,\n    0x000002CA, 0x000002CA, 0x0007002C, 0x00000017, 0x0000039D, 0x000003BB,\n    0x000003BB, 0x000003BB, 0x000003BB, 0x0007002C, 0x00000017, 0x0000090C,\n    0x00000665, 0x00000665, 0x00000665, 0x00000665, 0x0004002B, 0x0000000B,\n    0x00000ACA, 0x00000040, 0x00050036, 0x00000008, 0x0000161F, 0x00000000,\n    0x00000502, 0x000200F8, 0x00003B06, 0x000300F7, 0x00004C7A, 0x00000000,\n    0x000300FB, 0x00000A0A, 0x00002E68, 0x000200F8, 0x00002E68, 0x00050041,\n    0x00000288, 0x000060D7, 0x00000CE9, 0x00000A0B, 0x0004003D, 0x0000000B,\n    0x00003526, 0x000060D7, 0x000500C7, 0x0000000B, 0x00005FDC, 0x00003526,\n    0x00000A0D, 0x000500AB, 0x00000009, 0x00004376, 0x00005FDC, 0x00000A0A,\n    0x000500C7, 0x0000000B, 0x00003028, 0x00003526, 0x00000A10, 0x000500AB,\n    0x00000009, 0x00004384, 0x00003028, 0x00000A0A, 0x000500C2, 0x0000000B,\n    0x00001EB0, 0x00003526, 0x00000A10, 0x000500C7, 0x0000000B, 0x000061E2,\n    0x00001EB0, 0x00000A13, 0x00050041, 0x00000288, 0x0000492C, 0x00000CE9,\n    0x00000A0E, 0x0004003D, 0x0000000B, 0x00005EAC, 0x0000492C, 0x00050041,\n    0x00000288, 0x00004EBA, 0x00000CE9, 0x00000A11, 0x0004003D, 0x0000000B,\n    0x00005788, 0x00004EBA, 0x00050041, 0x00000288, 0x00004EBB, 0x00000CE9,\n    0x00000A14, 0x0004003D, 0x0000000B, 0x00005789, 0x00004EBB, 0x00050041,\n    0x00000291, 0x00004EBC, 0x00000CE9, 0x00000A17, 0x0004003D, 0x00000014,\n    0x0000578A, 0x00004EBC, 0x00050041, 0x00000288, 0x00004EBD, 0x00000CE9,\n    0x00000A1A, 0x0004003D, 0x0000000B, 0x0000578B, 0x00004EBD, 0x00050041,\n    0x00000288, 0x00004E6E, 0x00000CE9, 0x00000A1D, 0x0004003D, 0x0000000B,\n    0x000019C2, 0x00004E6E, 0x0004003D, 0x00000014, 0x00002A0E, 0x00000F48,\n    0x000500C4, 0x00000014, 0x0000538B, 0x00002A0E, 0x00000A34, 0x0007004F,\n    0x00000011, 0x000042F0, 0x0000538B, 0x0000538B, 0x00000000, 0x00000001,\n    0x0007004F, 0x00000011, 0x0000242F, 0x0000578A, 0x0000578A, 0x00000000,\n    0x00000001, 0x000500AE, 0x0000000F, 0x00004288, 0x000042F0, 0x0000242F,\n    0x0004009A, 0x00000009, 0x00006067, 0x00004288, 0x000300F7, 0x000019BA,\n    0x00000002, 0x000400FA, 0x00006067, 0x000055E8, 0x000019BA, 0x000200F8,\n    0x000055E8, 0x000200F9, 0x00004C7A, 0x000200F8, 0x000019BA, 0x0004007C,\n    0x00000016, 0x00005BB6, 0x0000538B, 0x00050051, 0x0000000B, 0x00004916,\n    0x0000578A, 0x00000001, 0x00050051, 0x0000000C, 0x00005BEB, 0x00005BB6,\n    0x00000000, 0x00050084, 0x0000000C, 0x0000591A, 0x00005BEB, 0x00000A11,\n    0x00050051, 0x0000000C, 0x000018DA, 0x00005BB6, 0x00000002, 0x0004007C,\n    0x0000000C, 0x000038A9, 0x00004916, 0x00050084, 0x0000000C, 0x00002C0F,\n    0x000018DA, 0x000038A9, 0x00050051, 0x0000000C, 0x000044BE, 0x00005BB6,\n    0x00000001, 0x00050080, 0x0000000C, 0x000056D4, 0x00002C0F, 0x000044BE,\n    0x0004007C, 0x0000000C, 0x00005785, 0x000019C2, 0x00050084, 0x0000000C,\n    0x00005FD7, 0x000056D4, 0x00005785, 0x00050080, 0x0000000C, 0x00002042,\n    0x0000591A, 0x00005FD7, 0x0004007C, 0x0000000B, 0x000028A4, 0x00002042,\n    0x00050080, 0x0000000B, 0x000038F6, 0x0000578B, 0x000028A4, 0x000400A8,\n    0x00000009, 0x00003014, 0x00004376, 0x000300F7, 0x00004A60, 0x00000002,\n    0x000400FA, 0x00003014, 0x0000260D, 0x0000426F, 0x000200F8, 0x0000260D,\n    0x00050051, 0x0000000B, 0x00004437, 0x0000538B, 0x00000000, 0x00050051,\n    0x0000000B, 0x00002BEE, 0x0000538B, 0x00000001, 0x00050051, 0x0000000B,\n    0x00004971, 0x0000538B, 0x00000002, 0x00050084, 0x0000000B, 0x000039EF,\n    0x00005789, 0x00004971, 0x00050080, 0x0000000B, 0x00004F62, 0x00002BEE,\n    0x000039EF, 0x00050084, 0x0000000B, 0x000054AC, 0x00005788, 0x00004F62,\n    0x00050080, 0x0000000B, 0x00004FAE, 0x00004437, 0x000054AC, 0x000500C4,\n    0x0000000B, 0x00002C67, 0x00004FAE, 0x00000A0D, 0x000200F9, 0x00004A60,\n    0x000200F8, 0x0000426F, 0x000300F7, 0x00005BF0, 0x00000002, 0x000400FA,\n    0x00004384, 0x00002C92, 0x00005F21, 0x000200F8, 0x00002C92, 0x000500C2,\n    0x0000000B, 0x00005374, 0x00005788, 0x00000A1A, 0x000500C2, 0x0000000B,\n    0x000035EC, 0x00005789, 0x00000A17, 0x000500C3, 0x0000000C, 0x000033B5,\n    0x000018DA, 0x00000A11, 0x0004007C, 0x0000000C, 0x00005766, 0x000035EC,\n    0x00050084, 0x0000000C, 0x000061FD, 0x000033B5, 0x00005766, 0x000500C3,\n    0x0000000C, 0x00002D62, 0x000044BE, 0x00000A17, 0x00050080, 0x0000000C,\n    0x0000411E, 0x000061FD, 0x00002D62, 0x0004007C, 0x0000000C, 0x00004A78,\n    0x00005374, 0x00050084, 0x0000000C, 0x000032DC, 0x0000411E, 0x00004A78,\n    0x000500C3, 0x0000000C, 0x000032BA, 0x00005BEB, 0x00000A1A, 0x00050080,\n    0x0000000C, 0x00005FEE, 0x000032DC, 0x000032BA, 0x000500C4, 0x0000000C,\n    0x0000225D, 0x00005FEE, 0x00000A20, 0x000500C7, 0x0000000C, 0x00002CAA,\n    0x000018DA, 0x00000A14, 0x000500C4, 0x0000000C, 0x00004CAE, 0x00002CAA,\n    0x00000A1A, 0x000500C3, 0x0000000C, 0x0000383E, 0x000044BE, 0x00000A0E,\n    0x000500C7, 0x0000000C, 0x00005375, 0x0000383E, 0x00000A14, 0x000500C4,\n    0x0000000C, 0x000054CA, 0x00005375, 0x00000A14, 0x000500C5, 0x0000000C,\n    0x000042CE, 0x00004CAE, 0x000054CA, 0x000500C7, 0x0000000C, 0x000050D5,\n    0x00005BEB, 0x00000A20, 0x000500C5, 0x0000000C, 0x00003ADD, 0x000042CE,\n    0x000050D5, 0x000500C5, 0x0000000C, 0x000043B6, 0x0000225D, 0x00003ADD,\n    0x000500C4, 0x0000000C, 0x00005E50, 0x000043B6, 0x00000A0D, 0x000500C3,\n    0x0000000C, 0x000032D7, 0x000044BE, 0x00000A14, 0x000500C6, 0x0000000C,\n    0x000026C9, 0x000032D7, 0x000033B5, 0x000500C7, 0x0000000C, 0x00004199,\n    0x000026C9, 0x00000A0E, 0x000500C3, 0x0000000C, 0x00002590, 0x00005BEB,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x0000505E, 0x00002590, 0x00000A14,\n    0x000500C4, 0x0000000C, 0x0000541D, 0x00004199, 0x00000A0E, 0x000500C6,\n    0x0000000C, 0x000022BA, 0x0000505E, 0x0000541D, 0x000500C7, 0x0000000C,\n    0x00005076, 0x000044BE, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005228,\n    0x00005076, 0x00000A17, 0x000500C4, 0x0000000C, 0x00001997, 0x000022BA,\n    0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FE, 0x00005228, 0x00001997,\n    0x000500C4, 0x0000000C, 0x00001C00, 0x00004199, 0x00000A2C, 0x000500C5,\n    0x0000000C, 0x00003C81, 0x000047FE, 0x00001C00, 0x000500C7, 0x0000000C,\n    0x000050AF, 0x00005E50, 0x00000A38, 0x000500C5, 0x0000000C, 0x00003C70,\n    0x00003C81, 0x000050AF, 0x000500C3, 0x0000000C, 0x00003745, 0x00005E50,\n    0x00000A17, 0x000500C7, 0x0000000C, 0x000018B8, 0x00003745, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x0000547E, 0x000018B8, 0x00000A1A, 0x000500C5,\n    0x0000000C, 0x000045A8, 0x00003C70, 0x0000547E, 0x000500C3, 0x0000000C,\n    0x00003A6E, 0x00005E50, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018B9,\n    0x00003A6E, 0x00000A20, 0x000500C4, 0x0000000C, 0x0000547F, 0x000018B9,\n    0x00000A23, 0x000500C5, 0x0000000C, 0x0000456F, 0x000045A8, 0x0000547F,\n    0x000500C3, 0x0000000C, 0x00003C88, 0x00005E50, 0x00000A23, 0x000500C4,\n    0x0000000C, 0x00002824, 0x00003C88, 0x00000A2F, 0x000500C5, 0x0000000C,\n    0x00003B79, 0x0000456F, 0x00002824, 0x0004007C, 0x0000000B, 0x000041E5,\n    0x00003B79, 0x000200F9, 0x00005BF0, 0x000200F8, 0x00005F21, 0x0004007C,\n    0x00000012, 0x000059D8, 0x000042F0, 0x000500C2, 0x0000000B, 0x00005668,\n    0x00005788, 0x00000A1A, 0x00050051, 0x0000000C, 0x00003905, 0x000059D8,\n    0x00000001, 0x000500C3, 0x0000000C, 0x00002F39, 0x00003905, 0x00000A1A,\n    0x0004007C, 0x0000000C, 0x00005780, 0x00005668, 0x00050084, 0x0000000C,\n    0x00001F02, 0x00002F39, 0x00005780, 0x00050051, 0x0000000C, 0x00006242,\n    0x000059D8, 0x00000000, 0x000500C3, 0x0000000C, 0x00004FC7, 0x00006242,\n    0x00000A1A, 0x00050080, 0x0000000C, 0x000049B0, 0x00001F02, 0x00004FC7,\n    0x000500C4, 0x0000000C, 0x0000254A, 0x000049B0, 0x00000A1D, 0x000500C3,\n    0x0000000C, 0x0000603B, 0x00003905, 0x00000A0E, 0x000500C7, 0x0000000C,\n    0x0000539A, 0x0000603B, 0x00000A20, 0x000500C4, 0x0000000C, 0x0000534A,\n    0x0000539A, 0x00000A14, 0x000500C7, 0x0000000C, 0x00004EA5, 0x00006242,\n    0x00000A20, 0x000500C5, 0x0000000C, 0x00002B1A, 0x0000534A, 0x00004EA5,\n    0x000500C5, 0x0000000C, 0x000043B7, 0x0000254A, 0x00002B1A, 0x000500C4,\n    0x0000000C, 0x00005E63, 0x000043B7, 0x00000A0D, 0x000500C3, 0x0000000C,\n    0x000031DE, 0x00003905, 0x00000A17, 0x000500C7, 0x0000000C, 0x00005447,\n    0x000031DE, 0x00000A0E, 0x000500C3, 0x0000000C, 0x000028A6, 0x00006242,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x0000511E, 0x000028A6, 0x00000A14,\n    0x000500C3, 0x0000000C, 0x000028B9, 0x00003905, 0x00000A14, 0x000500C7,\n    0x0000000C, 0x0000505F, 0x000028B9, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x0000541E, 0x0000505F, 0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BB,\n    0x0000511E, 0x0000541E, 0x000500C7, 0x0000000C, 0x00005077, 0x00003905,\n    0x00000A0E, 0x000500C4, 0x0000000C, 0x00005229, 0x00005077, 0x00000A17,\n    0x000500C4, 0x0000000C, 0x00001998, 0x000022BB, 0x00000A1D, 0x000500C5,\n    0x0000000C, 0x000047FF, 0x00005229, 0x00001998, 0x000500C4, 0x0000000C,\n    0x00001C01, 0x00005447, 0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C82,\n    0x000047FF, 0x00001C01, 0x000500C7, 0x0000000C, 0x000050B0, 0x00005E63,\n    0x00000A38, 0x000500C5, 0x0000000C, 0x00003C71, 0x00003C82, 0x000050B0,\n    0x000500C3, 0x0000000C, 0x00003746, 0x00005E63, 0x00000A17, 0x000500C7,\n    0x0000000C, 0x000018BA, 0x00003746, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x00005480, 0x000018BA, 0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A9,\n    0x00003C71, 0x00005480, 0x000500C3, 0x0000000C, 0x00003A6F, 0x00005E63,\n    0x00000A1A, 0x000500C7, 0x0000000C, 0x000018BB, 0x00003A6F, 0x00000A20,\n    0x000500C4, 0x0000000C, 0x00005481, 0x000018BB, 0x00000A23, 0x000500C5,\n    0x0000000C, 0x00004570, 0x000045A9, 0x00005481, 0x000500C3, 0x0000000C,\n    0x00003C89, 0x00005E63, 0x00000A23, 0x000500C4, 0x0000000C, 0x00002825,\n    0x00003C89, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B7A, 0x00004570,\n    0x00002825, 0x0004007C, 0x0000000B, 0x000041E6, 0x00003B7A, 0x000200F9,\n    0x00005BF0, 0x000200F8, 0x00005BF0, 0x000700F5, 0x0000000B, 0x0000292C,\n    0x000041E5, 0x00002C92, 0x000041E6, 0x00005F21, 0x000200F9, 0x00004A60,\n    0x000200F8, 0x00004A60, 0x000700F5, 0x0000000B, 0x00002C70, 0x00002C67,\n    0x0000260D, 0x0000292C, 0x00005BF0, 0x00050080, 0x0000000B, 0x000048BD,\n    0x00002C70, 0x00005EAC, 0x000500C2, 0x0000000B, 0x00003D52, 0x000048BD,\n    0x00000A17, 0x00060041, 0x00000294, 0x00004FAF, 0x0000107A, 0x00000A0B,\n    0x00003D52, 0x0004003D, 0x00000017, 0x00002261, 0x00004FAF, 0x000500AA,\n    0x00000009, 0x00005272, 0x000061E2, 0x00000A0D, 0x000300F7, 0x0000362B,\n    0x00000000, 0x000400FA, 0x00005272, 0x00002957, 0x0000362B, 0x000200F8,\n    0x00002957, 0x000500C7, 0x00000017, 0x0000475F, 0x00002261, 0x000009CE,\n    0x000500C4, 0x00000017, 0x000024D1, 0x0000475F, 0x0000013D, 0x000500C7,\n    0x00000017, 0x000050AC, 0x00002261, 0x0000072E, 0x000500C2, 0x00000017,\n    0x0000448D, 0x000050AC, 0x0000013D, 0x000500C5, 0x00000017, 0x00003FF8,\n    0x000024D1, 0x0000448D, 0x000200F9, 0x0000362B, 0x000200F8, 0x0000362B,\n    0x000700F5, 0x00000017, 0x00004AB4, 0x00002261, 0x00004A60, 0x00003FF8,\n    0x00002957, 0x000500C2, 0x0000000B, 0x00001BB7, 0x000038F6, 0x00000A17,\n    0x000500C7, 0x00000017, 0x000030B2, 0x00004AB4, 0x000003E0, 0x000500C7,\n    0x00000017, 0x00004943, 0x00004AB4, 0x0000039D, 0x000500C4, 0x00000017,\n    0x00006164, 0x00004943, 0x0000013D, 0x000500C5, 0x00000017, 0x00004295,\n    0x000030B2, 0x00006164, 0x000500C7, 0x00000017, 0x000052DC, 0x00004AB4,\n    0x0000090C, 0x000500C2, 0x00000017, 0x000046A8, 0x000052DC, 0x0000013D,\n    0x000500C5, 0x00000017, 0x00001984, 0x00004295, 0x000046A8, 0x00060041,\n    0x00000294, 0x00004F1E, 0x0000140E, 0x00000A0B, 0x00001BB7, 0x0003003E,\n    0x00004F1E, 0x00001984, 0x00050080, 0x0000000B, 0x000054B5, 0x000038F6,\n    0x00000A3A, 0x000300F7, 0x00006070, 0x00000002, 0x000400FA, 0x00004376,\n    0x000055E9, 0x00001C25, 0x000200F8, 0x000055E9, 0x000200F9, 0x00006070,\n    0x000200F8, 0x00001C25, 0x000200F9, 0x00006070, 0x000200F8, 0x00006070,\n    0x000700F5, 0x0000000B, 0x00002C71, 0x00000ACA, 0x000055E9, 0x00000A3A,\n    0x00001C25, 0x00050080, 0x0000000B, 0x000048BE, 0x000048BD, 0x00002C71,\n    0x000500C2, 0x0000000B, 0x00003D53, 0x000048BE, 0x00000A17, 0x00060041,\n    0x00000294, 0x00005566, 0x0000107A, 0x00000A0B, 0x00003D53, 0x0004003D,\n    0x00000017, 0x00003910, 0x00005566, 0x000300F7, 0x0000362C, 0x00000000,\n    0x000400FA, 0x00005272, 0x00002958, 0x0000362C, 0x000200F8, 0x00002958,\n    0x000500C7, 0x00000017, 0x00004760, 0x00003910, 0x000009CE, 0x000500C4,\n    0x00000017, 0x000024D2, 0x00004760, 0x0000013D, 0x000500C7, 0x00000017,\n    0x000050AD, 0x00003910, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448E,\n    0x000050AD, 0x0000013D, 0x000500C5, 0x00000017, 0x00003FF9, 0x000024D2,\n    0x0000448E, 0x000200F9, 0x0000362C, 0x000200F8, 0x0000362C, 0x000700F5,\n    0x00000017, 0x00004AB5, 0x00003910, 0x00006070, 0x00003FF9, 0x00002958,\n    0x000500C2, 0x0000000B, 0x00001BB8, 0x000054B5, 0x00000A17, 0x000500C7,\n    0x00000017, 0x000030B3, 0x00004AB5, 0x000003E0, 0x000500C7, 0x00000017,\n    0x00004944, 0x00004AB5, 0x0000039D, 0x000500C4, 0x00000017, 0x00006165,\n    0x00004944, 0x0000013D, 0x000500C5, 0x00000017, 0x00004296, 0x000030B3,\n    0x00006165, 0x000500C7, 0x00000017, 0x000052DD, 0x00004AB5, 0x0000090C,\n    0x000500C2, 0x00000017, 0x000046A9, 0x000052DD, 0x0000013D, 0x000500C5,\n    0x00000017, 0x00001985, 0x00004296, 0x000046A9, 0x00060041, 0x00000294,\n    0x00005819, 0x0000140E, 0x00000A0B, 0x00001BB8, 0x0003003E, 0x00005819,\n    0x00001985, 0x000200F9, 0x00004C7A, 0x000200F8, 0x00004C7A, 0x000100FD,\n    0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_r4g4b4a4_b4g4r4a4_scaled_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25157\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n     %v4uint = OpTypeVector %uint 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v3uint = OpTypeVector %uint 3\n%uint_4042322160 = OpConstant %uint 4042322160\n%uint_983055 = OpConstant %uint 983055\n     %uint_8 = OpConstant %uint 8\n%uint_251662080 = OpConstant %uint 251662080\n     %uint_1 = OpConstant %uint 1\n%uint_16711935 = OpConstant %uint 16711935\n%uint_4278255360 = OpConstant %uint 4278255360\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n     %uint_0 = OpConstant %uint 0\n      %int_3 = OpConstant %int 3\n     %uint_2 = OpConstant %uint 2\n      %int_2 = OpConstant %int 2\n     %uint_3 = OpConstant %uint 3\n     %uint_5 = OpConstant %uint 5\n     %uint_4 = OpConstant %uint 4\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n     %uint_7 = OpConstant %uint 7\n       %1927 = OpConstantComposite %v2uint %uint_4 %uint_7\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %2612 = OpConstantComposite %v3uint %uint_4 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n    %uint_16 = OpConstant %uint 16\n    %uint_32 = OpConstant %uint 32\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %1954 = OpConstantComposite %v2uint %uint_7 %uint_7\n       %1867 = OpConstantComposite %v2uint %uint_4 %uint_2\n    %uint_15 = OpConstant %uint 15\n       %1978 = OpConstantComposite %v2uint %uint_15 %uint_3\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %992 = OpConstantComposite %v4uint %uint_4042322160 %uint_4042322160 %uint_4042322160 %uint_4042322160\n        %925 = OpConstantComposite %v4uint %uint_983055 %uint_983055 %uint_983055 %uint_983055\n       %2316 = OpConstantComposite %v4uint %uint_251662080 %uint_251662080 %uint_251662080 %uint_251662080\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24445 = OpBitwiseAnd %uint %13606 %uint_2\n      %18667 = OpINotEqual %bool %24445 %uint_0\n       %8141 = OpShiftRightLogical %uint %13606 %uint_2\n      %24990 = OpBitwiseAnd %uint %8141 %uint_3\n       %8871 = OpCompositeConstruct %v2uint %13606 %13606\n       %7087 = OpShiftRightLogical %v2uint %8871 %1927\n       %6551 = OpBitwiseAnd %v2uint %7087 %1954\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2612\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %6586 DontFlatten\n               OpBranchConditional %24679 %21992 %6586\n      %21992 = OpLabel\n               OpBranch %19578\n       %6586 = OpLabel\n      %23478 = OpBitcast %v3int %21387\n      %18710 = OpCompositeExtract %uint %22410 1\n      %23531 = OpCompositeExtract %int %23478 0\n      %22810 = OpIMul %int %23531 %int_2\n       %6362 = OpCompositeExtract %int %23478 2\n      %14505 = OpBitcast %int %18710\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %23478 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %6594\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %22810 %24535\n      %10898 = OpBitcast %uint %8258\n       %7937 = OpIAdd %uint %22411 %10898\n      %19921 = OpShiftRightLogical %v2uint %17136 %1867\n       %7712 = OpUDiv %v2uint %19921 %6551\n      %18183 = OpIMul %v2uint %6551 %7712\n      %18273 = OpISub %v2uint %19921 %18183\n      %11232 = OpShiftLeftLogical %v2uint %7712 %1867\n      %13284 = OpCompositeExtract %uint %18273 0\n      %10872 = OpCompositeExtract %uint %6551 1\n      %22886 = OpIMul %uint %13284 %10872\n       %6943 = OpCompositeExtract %uint %18273 1\n      %10469 = OpIAdd %uint %22886 %6943\n      %18851 = OpBitwiseAnd %v2uint %17136 %1978\n      %10581 = OpShiftLeftLogical %uint %10469 %uint_7\n      %20916 = OpCompositeExtract %uint %18851 1\n      %23596 = OpShiftLeftLogical %uint %20916 %uint_5\n      %19814 = OpBitwiseOr %uint %10581 %23596\n      %21476 = OpCompositeExtract %uint %18851 0\n       %8560 = OpShiftLeftLogical %uint %21476 %uint_1\n      %17648 = OpBitwiseOr %uint %19814 %8560\n      %19923 = OpCompositeExtract %uint %11232 0\n      %15556 = OpCompositeInsert %v3uint %19923 %21387 0\n      %23006 = OpCompositeExtract %uint %11232 1\n       %9680 = OpCompositeInsert %v3uint %23006 %15556 1\n               OpSelectionMerge %20344 DontFlatten\n               OpBranchConditional %18667 %23520 %11737\n      %23520 = OpLabel\n      %10111 = OpBitcast %v3int %9680\n      %19476 = OpShiftRightLogical %uint %22408 %int_5\n      %18810 = OpShiftRightLogical %uint %22409 %int_4\n       %6782 = OpCompositeExtract %int %10111 2\n      %12089 = OpShiftRightArithmetic %int %6782 %int_2\n      %22400 = OpBitcast %int %18810\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %10111 1\n      %19055 = OpShiftRightArithmetic %int %25154 %int_4\n      %11052 = OpIAdd %int %7938 %19055\n      %16898 = OpBitcast %int %19476\n      %14944 = OpIMul %int %11052 %16898\n      %25155 = OpCompositeExtract %int %10111 0\n      %20423 = OpShiftRightArithmetic %int %25155 %int_5\n      %18940 = OpIAdd %int %14944 %20423\n       %8797 = OpShiftLeftLogical %int %18940 %int_7\n      %11434 = OpBitwiseAnd %int %6782 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %25154 %int_1\n      %21364 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21364 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %25155 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17334 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17334 %uint_1\n      %13015 = OpShiftRightArithmetic %int %25154 %int_3\n       %9929 = OpBitwiseXor %int %13015 %12089\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %25155 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %25154 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6552 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6552\n       %7168 = OpShiftLeftLogical %int %16793 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24144 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24144 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24144 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24144 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %20344\n      %11737 = OpLabel\n      %11908 = OpVectorShuffle %v2uint %9680 %9680 0 1\n      %20347 = OpBitcast %v2int %11908\n      %11433 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %20347 1\n      %12090 = OpShiftRightArithmetic %int %14597 %int_5\n      %22401 = OpBitcast %int %11433\n       %7939 = OpIMul %int %12090 %22401\n      %25156 = OpCompositeExtract %int %20347 0\n      %20424 = OpShiftRightArithmetic %int %25156 %int_5\n      %18864 = OpIAdd %int %7939 %20424\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25156 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17335 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17335 %uint_1\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25156 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6553 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6553\n       %7169 = OpShiftLeftLogical %int %21575 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24163 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24163 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24163 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %20344\n      %20344 = OpLabel\n      %18329 = OpPhi %uint %16869 %23520 %16870 %11737\n      %15200 = OpCompositeExtract %uint %6551 0\n      %17489 = OpIMul %uint %15200 %10872\n       %7313 = OpIMul %uint %18329 %17489\n       %8815 = OpIAdd %uint %7313 %17648\n      %21470 = OpIAdd %uint %8815 %24236\n      %14664 = OpShiftRightLogical %uint %21470 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %14664\n       %8801 = OpLoad %v4uint %20399\n      %21106 = OpIEqual %bool %24990 %uint_1\n               OpSelectionMerge %13867 None\n               OpBranchConditional %21106 %10583 %13867\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %8801 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %8801 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13867\n      %13867 = OpLabel\n      %19124 = OpPhi %v4uint %8801 %20344 %16376 %10583\n       %7095 = OpShiftRightLogical %uint %7937 %int_4\n      %12466 = OpBitwiseAnd %v4uint %19124 %992\n      %18755 = OpBitwiseAnd %v4uint %19124 %925\n      %24932 = OpShiftLeftLogical %v4uint %18755 %317\n      %17045 = OpBitwiseOr %v4uint %12466 %24932\n      %21212 = OpBitwiseAnd %v4uint %19124 %2316\n      %18088 = OpShiftRightLogical %v4uint %21212 %317\n       %6532 = OpBitwiseOr %v4uint %17045 %18088\n      %20254 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %7095\n               OpStore %20254 %6532\n      %22137 = OpIAdd %uint %7937 %uint_16\n      %10214 = OpIAdd %uint %21470 %uint_16\n      %14665 = OpShiftRightLogical %uint %10214 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %14665\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %13868 None\n               OpBranchConditional %21106 %10584 %13868\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %13868\n      %13868 = OpLabel\n      %19125 = OpPhi %v4uint %14608 %13867 %16377 %10584\n       %7096 = OpShiftRightLogical %uint %22137 %int_4\n      %12467 = OpBitwiseAnd %v4uint %19125 %992\n      %18756 = OpBitwiseAnd %v4uint %19125 %925\n      %24933 = OpShiftLeftLogical %v4uint %18756 %317\n      %17046 = OpBitwiseOr %v4uint %12467 %24933\n      %21213 = OpBitwiseAnd %v4uint %19125 %2316\n      %18089 = OpShiftRightLogical %v4uint %21213 %317\n       %6533 = OpBitwiseOr %v4uint %17046 %18089\n      %22553 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %7096\n               OpStore %22553 %6533\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_r4g4b4a4_b4g4r4a4_scaled_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006245, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000017,\n    0x0000000B, 0x00000004, 0x00040015, 0x0000000C, 0x00000020, 0x00000001,\n    0x00040017, 0x00000012, 0x0000000C, 0x00000002, 0x00040017, 0x00000016,\n    0x0000000C, 0x00000003, 0x00020014, 0x00000009, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x0004002B, 0x0000000B, 0x000002CA, 0xF0F0F0F0,\n    0x0004002B, 0x0000000B, 0x000003BB, 0x000F000F, 0x0004002B, 0x0000000B,\n    0x00000A22, 0x00000008, 0x0004002B, 0x0000000B, 0x00000665, 0x0F000F00,\n    0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B,\n    0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00,\n    0x0004002B, 0x0000000C, 0x00000A17, 0x00000004, 0x0004002B, 0x0000000C,\n    0x00000A1D, 0x00000006, 0x0004002B, 0x0000000C, 0x00000A2C, 0x0000000B,\n    0x0004002B, 0x0000000C, 0x00000A38, 0x0000000F, 0x0004002B, 0x0000000C,\n    0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C, 0x00000A1A, 0x00000005,\n    0x0004002B, 0x0000000C, 0x00000A20, 0x00000007, 0x0004002B, 0x0000000C,\n    0x00000A23, 0x00000008, 0x0004002B, 0x0000000C, 0x00000A2F, 0x0000000C,\n    0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000, 0x0004002B, 0x0000000C,\n    0x00000A14, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A10, 0x00000002,\n    0x0004002B, 0x0000000C, 0x00000A11, 0x00000002, 0x0004002B, 0x0000000B,\n    0x00000A13, 0x00000003, 0x0004002B, 0x0000000B, 0x00000A19, 0x00000005,\n    0x0004002B, 0x0000000B, 0x00000A16, 0x00000004, 0x0004002B, 0x0000000C,\n    0x00000A0B, 0x00000000, 0x000A001E, 0x00000489, 0x0000000B, 0x0000000B,\n    0x0000000B, 0x0000000B, 0x00000014, 0x0000000B, 0x0000000B, 0x0000000B,\n    0x00040020, 0x00000706, 0x00000009, 0x00000489, 0x0004003B, 0x00000706,\n    0x00000CE9, 0x00000009, 0x00040020, 0x00000288, 0x00000009, 0x0000000B,\n    0x0004002B, 0x0000000B, 0x00000A1F, 0x00000007, 0x0005002C, 0x00000011,\n    0x00000787, 0x00000A16, 0x00000A1F, 0x00040020, 0x00000291, 0x00000009,\n    0x00000014, 0x00040020, 0x00000292, 0x00000001, 0x00000014, 0x0004003B,\n    0x00000292, 0x00000F48, 0x00000001, 0x0006002C, 0x00000014, 0x00000A34,\n    0x00000A16, 0x00000A0A, 0x00000A0A, 0x00040017, 0x0000000F, 0x00000009,\n    0x00000002, 0x0003001D, 0x000007DC, 0x00000017, 0x0003001E, 0x000007B4,\n    0x000007DC, 0x00040020, 0x00000A31, 0x00000002, 0x000007B4, 0x0004003B,\n    0x00000A31, 0x0000107A, 0x00000002, 0x00040020, 0x00000294, 0x00000002,\n    0x00000017, 0x0003001D, 0x000007DD, 0x00000017, 0x0003001E, 0x000007B5,\n    0x000007DD, 0x00040020, 0x00000A32, 0x00000002, 0x000007B5, 0x0004003B,\n    0x00000A32, 0x0000140E, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A3A,\n    0x00000010, 0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020, 0x0006002C,\n    0x00000014, 0x00000BC3, 0x00000A16, 0x00000A6A, 0x00000A0D, 0x0005002C,\n    0x00000011, 0x000007A2, 0x00000A1F, 0x00000A1F, 0x0005002C, 0x00000011,\n    0x0000074B, 0x00000A16, 0x00000A10, 0x0004002B, 0x0000000B, 0x00000A37,\n    0x0000000F, 0x0005002C, 0x00000011, 0x000007BA, 0x00000A37, 0x00000A13,\n    0x0007002C, 0x00000017, 0x000009CE, 0x000008A6, 0x000008A6, 0x000008A6,\n    0x000008A6, 0x0007002C, 0x00000017, 0x0000013D, 0x00000A22, 0x00000A22,\n    0x00000A22, 0x00000A22, 0x0007002C, 0x00000017, 0x0000072E, 0x000005FD,\n    0x000005FD, 0x000005FD, 0x000005FD, 0x0007002C, 0x00000017, 0x000003E0,\n    0x000002CA, 0x000002CA, 0x000002CA, 0x000002CA, 0x0007002C, 0x00000017,\n    0x0000039D, 0x000003BB, 0x000003BB, 0x000003BB, 0x000003BB, 0x0007002C,\n    0x00000017, 0x0000090C, 0x00000665, 0x00000665, 0x00000665, 0x00000665,\n    0x00050036, 0x00000008, 0x0000161F, 0x00000000, 0x00000502, 0x000200F8,\n    0x00003B06, 0x000300F7, 0x00004C7A, 0x00000000, 0x000300FB, 0x00000A0A,\n    0x00002E68, 0x000200F8, 0x00002E68, 0x00050041, 0x00000288, 0x000060D7,\n    0x00000CE9, 0x00000A0B, 0x0004003D, 0x0000000B, 0x00003526, 0x000060D7,\n    0x000500C7, 0x0000000B, 0x00005F7D, 0x00003526, 0x00000A10, 0x000500AB,\n    0x00000009, 0x000048EB, 0x00005F7D, 0x00000A0A, 0x000500C2, 0x0000000B,\n    0x00001FCD, 0x00003526, 0x00000A10, 0x000500C7, 0x0000000B, 0x0000619E,\n    0x00001FCD, 0x00000A13, 0x00050050, 0x00000011, 0x000022A7, 0x00003526,\n    0x00003526, 0x000500C2, 0x00000011, 0x00001BAF, 0x000022A7, 0x00000787,\n    0x000500C7, 0x00000011, 0x00001997, 0x00001BAF, 0x000007A2, 0x00050041,\n    0x00000288, 0x0000492C, 0x00000CE9, 0x00000A0E, 0x0004003D, 0x0000000B,\n    0x00005EAC, 0x0000492C, 0x00050041, 0x00000288, 0x00004EBA, 0x00000CE9,\n    0x00000A11, 0x0004003D, 0x0000000B, 0x00005788, 0x00004EBA, 0x00050041,\n    0x00000288, 0x00004EBB, 0x00000CE9, 0x00000A14, 0x0004003D, 0x0000000B,\n    0x00005789, 0x00004EBB, 0x00050041, 0x00000291, 0x00004EBC, 0x00000CE9,\n    0x00000A17, 0x0004003D, 0x00000014, 0x0000578A, 0x00004EBC, 0x00050041,\n    0x00000288, 0x00004EBD, 0x00000CE9, 0x00000A1A, 0x0004003D, 0x0000000B,\n    0x0000578B, 0x00004EBD, 0x00050041, 0x00000288, 0x00004E6E, 0x00000CE9,\n    0x00000A1D, 0x0004003D, 0x0000000B, 0x000019C2, 0x00004E6E, 0x0004003D,\n    0x00000014, 0x00002A0E, 0x00000F48, 0x000500C4, 0x00000014, 0x0000538B,\n    0x00002A0E, 0x00000A34, 0x0007004F, 0x00000011, 0x000042F0, 0x0000538B,\n    0x0000538B, 0x00000000, 0x00000001, 0x0007004F, 0x00000011, 0x0000242F,\n    0x0000578A, 0x0000578A, 0x00000000, 0x00000001, 0x000500AE, 0x0000000F,\n    0x00004288, 0x000042F0, 0x0000242F, 0x0004009A, 0x00000009, 0x00006067,\n    0x00004288, 0x000300F7, 0x000019BA, 0x00000002, 0x000400FA, 0x00006067,\n    0x000055E8, 0x000019BA, 0x000200F8, 0x000055E8, 0x000200F9, 0x00004C7A,\n    0x000200F8, 0x000019BA, 0x0004007C, 0x00000016, 0x00005BB6, 0x0000538B,\n    0x00050051, 0x0000000B, 0x00004916, 0x0000578A, 0x00000001, 0x00050051,\n    0x0000000C, 0x00005BEB, 0x00005BB6, 0x00000000, 0x00050084, 0x0000000C,\n    0x0000591A, 0x00005BEB, 0x00000A11, 0x00050051, 0x0000000C, 0x000018DA,\n    0x00005BB6, 0x00000002, 0x0004007C, 0x0000000C, 0x000038A9, 0x00004916,\n    0x00050084, 0x0000000C, 0x00002C0F, 0x000018DA, 0x000038A9, 0x00050051,\n    0x0000000C, 0x000044BE, 0x00005BB6, 0x00000001, 0x00050080, 0x0000000C,\n    0x000056D4, 0x00002C0F, 0x000044BE, 0x0004007C, 0x0000000C, 0x00005785,\n    0x000019C2, 0x00050084, 0x0000000C, 0x00005FD7, 0x000056D4, 0x00005785,\n    0x00050080, 0x0000000C, 0x00002042, 0x0000591A, 0x00005FD7, 0x0004007C,\n    0x0000000B, 0x00002A92, 0x00002042, 0x00050080, 0x0000000B, 0x00001F01,\n    0x0000578B, 0x00002A92, 0x000500C2, 0x00000011, 0x00004DD1, 0x000042F0,\n    0x0000074B, 0x00050086, 0x00000011, 0x00001E20, 0x00004DD1, 0x00001997,\n    0x00050084, 0x00000011, 0x00004707, 0x00001997, 0x00001E20, 0x00050082,\n    0x00000011, 0x00004761, 0x00004DD1, 0x00004707, 0x000500C4, 0x00000011,\n    0x00002BE0, 0x00001E20, 0x0000074B, 0x00050051, 0x0000000B, 0x000033E4,\n    0x00004761, 0x00000000, 0x00050051, 0x0000000B, 0x00002A78, 0x00001997,\n    0x00000001, 0x00050084, 0x0000000B, 0x00005966, 0x000033E4, 0x00002A78,\n    0x00050051, 0x0000000B, 0x00001B1F, 0x00004761, 0x00000001, 0x00050080,\n    0x0000000B, 0x000028E5, 0x00005966, 0x00001B1F, 0x000500C7, 0x00000011,\n    0x000049A3, 0x000042F0, 0x000007BA, 0x000500C4, 0x0000000B, 0x00002955,\n    0x000028E5, 0x00000A1F, 0x00050051, 0x0000000B, 0x000051B4, 0x000049A3,\n    0x00000001, 0x000500C4, 0x0000000B, 0x00005C2C, 0x000051B4, 0x00000A19,\n    0x000500C5, 0x0000000B, 0x00004D66, 0x00002955, 0x00005C2C, 0x00050051,\n    0x0000000B, 0x000053E4, 0x000049A3, 0x00000000, 0x000500C4, 0x0000000B,\n    0x00002170, 0x000053E4, 0x00000A0D, 0x000500C5, 0x0000000B, 0x000044F0,\n    0x00004D66, 0x00002170, 0x00050051, 0x0000000B, 0x00004DD3, 0x00002BE0,\n    0x00000000, 0x00060052, 0x00000014, 0x00003CC4, 0x00004DD3, 0x0000538B,\n    0x00000000, 0x00050051, 0x0000000B, 0x000059DE, 0x00002BE0, 0x00000001,\n    0x00060052, 0x00000014, 0x000025D0, 0x000059DE, 0x00003CC4, 0x00000001,\n    0x000300F7, 0x00004F78, 0x00000002, 0x000400FA, 0x000048EB, 0x00005BE0,\n    0x00002DD9, 0x000200F8, 0x00005BE0, 0x0004007C, 0x00000016, 0x0000277F,\n    0x000025D0, 0x000500C2, 0x0000000B, 0x00004C14, 0x00005788, 0x00000A1A,\n    0x000500C2, 0x0000000B, 0x0000497A, 0x00005789, 0x00000A17, 0x00050051,\n    0x0000000C, 0x00001A7E, 0x0000277F, 0x00000002, 0x000500C3, 0x0000000C,\n    0x00002F39, 0x00001A7E, 0x00000A11, 0x0004007C, 0x0000000C, 0x00005780,\n    0x0000497A, 0x00050084, 0x0000000C, 0x00001F02, 0x00002F39, 0x00005780,\n    0x00050051, 0x0000000C, 0x00006242, 0x0000277F, 0x00000001, 0x000500C3,\n    0x0000000C, 0x00004A6F, 0x00006242, 0x00000A17, 0x00050080, 0x0000000C,\n    0x00002B2C, 0x00001F02, 0x00004A6F, 0x0004007C, 0x0000000C, 0x00004202,\n    0x00004C14, 0x00050084, 0x0000000C, 0x00003A60, 0x00002B2C, 0x00004202,\n    0x00050051, 0x0000000C, 0x00006243, 0x0000277F, 0x00000000, 0x000500C3,\n    0x0000000C, 0x00004FC7, 0x00006243, 0x00000A1A, 0x00050080, 0x0000000C,\n    0x000049FC, 0x00003A60, 0x00004FC7, 0x000500C4, 0x0000000C, 0x0000225D,\n    0x000049FC, 0x00000A20, 0x000500C7, 0x0000000C, 0x00002CAA, 0x00001A7E,\n    0x00000A14, 0x000500C4, 0x0000000C, 0x00004CAE, 0x00002CAA, 0x00000A1A,\n    0x000500C3, 0x0000000C, 0x0000383E, 0x00006242, 0x00000A0E, 0x000500C7,\n    0x0000000C, 0x00005374, 0x0000383E, 0x00000A14, 0x000500C4, 0x0000000C,\n    0x000054CA, 0x00005374, 0x00000A14, 0x000500C5, 0x0000000C, 0x000042CE,\n    0x00004CAE, 0x000054CA, 0x000500C7, 0x0000000C, 0x000050D5, 0x00006243,\n    0x00000A20, 0x000500C5, 0x0000000C, 0x00003ADD, 0x000042CE, 0x000050D5,\n    0x000500C5, 0x0000000C, 0x000043B6, 0x0000225D, 0x00003ADD, 0x000500C4,\n    0x0000000C, 0x00005E50, 0x000043B6, 0x00000A0D, 0x000500C3, 0x0000000C,\n    0x000032D7, 0x00006242, 0x00000A14, 0x000500C6, 0x0000000C, 0x000026C9,\n    0x000032D7, 0x00002F39, 0x000500C7, 0x0000000C, 0x00004199, 0x000026C9,\n    0x00000A0E, 0x000500C3, 0x0000000C, 0x00002590, 0x00006243, 0x00000A14,\n    0x000500C7, 0x0000000C, 0x0000505E, 0x00002590, 0x00000A14, 0x000500C4,\n    0x0000000C, 0x0000541D, 0x00004199, 0x00000A0E, 0x000500C6, 0x0000000C,\n    0x000022BA, 0x0000505E, 0x0000541D, 0x000500C7, 0x0000000C, 0x00005076,\n    0x00006242, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005228, 0x00005076,\n    0x00000A17, 0x000500C4, 0x0000000C, 0x00001998, 0x000022BA, 0x00000A1D,\n    0x000500C5, 0x0000000C, 0x000047FE, 0x00005228, 0x00001998, 0x000500C4,\n    0x0000000C, 0x00001C00, 0x00004199, 0x00000A2C, 0x000500C5, 0x0000000C,\n    0x00003C81, 0x000047FE, 0x00001C00, 0x000500C7, 0x0000000C, 0x000050AF,\n    0x00005E50, 0x00000A38, 0x000500C5, 0x0000000C, 0x00003C70, 0x00003C81,\n    0x000050AF, 0x000500C3, 0x0000000C, 0x00003745, 0x00005E50, 0x00000A17,\n    0x000500C7, 0x0000000C, 0x000018B8, 0x00003745, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x0000547E, 0x000018B8, 0x00000A1A, 0x000500C5, 0x0000000C,\n    0x000045A8, 0x00003C70, 0x0000547E, 0x000500C3, 0x0000000C, 0x00003A6E,\n    0x00005E50, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018B9, 0x00003A6E,\n    0x00000A20, 0x000500C4, 0x0000000C, 0x0000547F, 0x000018B9, 0x00000A23,\n    0x000500C5, 0x0000000C, 0x0000456F, 0x000045A8, 0x0000547F, 0x000500C3,\n    0x0000000C, 0x00003C88, 0x00005E50, 0x00000A23, 0x000500C4, 0x0000000C,\n    0x00002824, 0x00003C88, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B79,\n    0x0000456F, 0x00002824, 0x0004007C, 0x0000000B, 0x000041E5, 0x00003B79,\n    0x000200F9, 0x00004F78, 0x000200F8, 0x00002DD9, 0x0007004F, 0x00000011,\n    0x00002E84, 0x000025D0, 0x000025D0, 0x00000000, 0x00000001, 0x0004007C,\n    0x00000012, 0x00004F7B, 0x00002E84, 0x000500C2, 0x0000000B, 0x00002CA9,\n    0x00005788, 0x00000A1A, 0x00050051, 0x0000000C, 0x00003905, 0x00004F7B,\n    0x00000001, 0x000500C3, 0x0000000C, 0x00002F3A, 0x00003905, 0x00000A1A,\n    0x0004007C, 0x0000000C, 0x00005781, 0x00002CA9, 0x00050084, 0x0000000C,\n    0x00001F03, 0x00002F3A, 0x00005781, 0x00050051, 0x0000000C, 0x00006244,\n    0x00004F7B, 0x00000000, 0x000500C3, 0x0000000C, 0x00004FC8, 0x00006244,\n    0x00000A1A, 0x00050080, 0x0000000C, 0x000049B0, 0x00001F03, 0x00004FC8,\n    0x000500C4, 0x0000000C, 0x0000254A, 0x000049B0, 0x00000A1D, 0x000500C3,\n    0x0000000C, 0x0000603B, 0x00003905, 0x00000A0E, 0x000500C7, 0x0000000C,\n    0x0000539A, 0x0000603B, 0x00000A20, 0x000500C4, 0x0000000C, 0x0000534A,\n    0x0000539A, 0x00000A14, 0x000500C7, 0x0000000C, 0x00004EA5, 0x00006244,\n    0x00000A20, 0x000500C5, 0x0000000C, 0x00002B1A, 0x0000534A, 0x00004EA5,\n    0x000500C5, 0x0000000C, 0x000043B7, 0x0000254A, 0x00002B1A, 0x000500C4,\n    0x0000000C, 0x00005E63, 0x000043B7, 0x00000A0D, 0x000500C3, 0x0000000C,\n    0x000031DE, 0x00003905, 0x00000A17, 0x000500C7, 0x0000000C, 0x00005447,\n    0x000031DE, 0x00000A0E, 0x000500C3, 0x0000000C, 0x000028A6, 0x00006244,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x0000511E, 0x000028A6, 0x00000A14,\n    0x000500C3, 0x0000000C, 0x000028B9, 0x00003905, 0x00000A14, 0x000500C7,\n    0x0000000C, 0x0000505F, 0x000028B9, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x0000541E, 0x0000505F, 0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BB,\n    0x0000511E, 0x0000541E, 0x000500C7, 0x0000000C, 0x00005077, 0x00003905,\n    0x00000A0E, 0x000500C4, 0x0000000C, 0x00005229, 0x00005077, 0x00000A17,\n    0x000500C4, 0x0000000C, 0x00001999, 0x000022BB, 0x00000A1D, 0x000500C5,\n    0x0000000C, 0x000047FF, 0x00005229, 0x00001999, 0x000500C4, 0x0000000C,\n    0x00001C01, 0x00005447, 0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C82,\n    0x000047FF, 0x00001C01, 0x000500C7, 0x0000000C, 0x000050B0, 0x00005E63,\n    0x00000A38, 0x000500C5, 0x0000000C, 0x00003C71, 0x00003C82, 0x000050B0,\n    0x000500C3, 0x0000000C, 0x00003746, 0x00005E63, 0x00000A17, 0x000500C7,\n    0x0000000C, 0x000018BA, 0x00003746, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x00005480, 0x000018BA, 0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A9,\n    0x00003C71, 0x00005480, 0x000500C3, 0x0000000C, 0x00003A6F, 0x00005E63,\n    0x00000A1A, 0x000500C7, 0x0000000C, 0x000018BB, 0x00003A6F, 0x00000A20,\n    0x000500C4, 0x0000000C, 0x00005481, 0x000018BB, 0x00000A23, 0x000500C5,\n    0x0000000C, 0x00004570, 0x000045A9, 0x00005481, 0x000500C3, 0x0000000C,\n    0x00003C89, 0x00005E63, 0x00000A23, 0x000500C4, 0x0000000C, 0x00002825,\n    0x00003C89, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B7A, 0x00004570,\n    0x00002825, 0x0004007C, 0x0000000B, 0x000041E6, 0x00003B7A, 0x000200F9,\n    0x00004F78, 0x000200F8, 0x00004F78, 0x000700F5, 0x0000000B, 0x00004799,\n    0x000041E5, 0x00005BE0, 0x000041E6, 0x00002DD9, 0x00050051, 0x0000000B,\n    0x00003B60, 0x00001997, 0x00000000, 0x00050084, 0x0000000B, 0x00004451,\n    0x00003B60, 0x00002A78, 0x00050084, 0x0000000B, 0x00001C91, 0x00004799,\n    0x00004451, 0x00050080, 0x0000000B, 0x0000226F, 0x00001C91, 0x000044F0,\n    0x00050080, 0x0000000B, 0x000053DE, 0x0000226F, 0x00005EAC, 0x000500C2,\n    0x0000000B, 0x00003948, 0x000053DE, 0x00000A17, 0x00060041, 0x00000294,\n    0x00004FAF, 0x0000107A, 0x00000A0B, 0x00003948, 0x0004003D, 0x00000017,\n    0x00002261, 0x00004FAF, 0x000500AA, 0x00000009, 0x00005272, 0x0000619E,\n    0x00000A0D, 0x000300F7, 0x0000362B, 0x00000000, 0x000400FA, 0x00005272,\n    0x00002957, 0x0000362B, 0x000200F8, 0x00002957, 0x000500C7, 0x00000017,\n    0x0000475F, 0x00002261, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D1,\n    0x0000475F, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AC, 0x00002261,\n    0x0000072E, 0x000500C2, 0x00000017, 0x0000448D, 0x000050AC, 0x0000013D,\n    0x000500C5, 0x00000017, 0x00003FF8, 0x000024D1, 0x0000448D, 0x000200F9,\n    0x0000362B, 0x000200F8, 0x0000362B, 0x000700F5, 0x00000017, 0x00004AB4,\n    0x00002261, 0x00004F78, 0x00003FF8, 0x00002957, 0x000500C2, 0x0000000B,\n    0x00001BB7, 0x00001F01, 0x00000A17, 0x000500C7, 0x00000017, 0x000030B2,\n    0x00004AB4, 0x000003E0, 0x000500C7, 0x00000017, 0x00004943, 0x00004AB4,\n    0x0000039D, 0x000500C4, 0x00000017, 0x00006164, 0x00004943, 0x0000013D,\n    0x000500C5, 0x00000017, 0x00004295, 0x000030B2, 0x00006164, 0x000500C7,\n    0x00000017, 0x000052DC, 0x00004AB4, 0x0000090C, 0x000500C2, 0x00000017,\n    0x000046A8, 0x000052DC, 0x0000013D, 0x000500C5, 0x00000017, 0x00001984,\n    0x00004295, 0x000046A8, 0x00060041, 0x00000294, 0x00004F1E, 0x0000140E,\n    0x00000A0B, 0x00001BB7, 0x0003003E, 0x00004F1E, 0x00001984, 0x00050080,\n    0x0000000B, 0x00005679, 0x00001F01, 0x00000A3A, 0x00050080, 0x0000000B,\n    0x000027E6, 0x000053DE, 0x00000A3A, 0x000500C2, 0x0000000B, 0x00003949,\n    0x000027E6, 0x00000A17, 0x00060041, 0x00000294, 0x00005566, 0x0000107A,\n    0x00000A0B, 0x00003949, 0x0004003D, 0x00000017, 0x00003910, 0x00005566,\n    0x000300F7, 0x0000362C, 0x00000000, 0x000400FA, 0x00005272, 0x00002958,\n    0x0000362C, 0x000200F8, 0x00002958, 0x000500C7, 0x00000017, 0x00004760,\n    0x00003910, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D2, 0x00004760,\n    0x0000013D, 0x000500C7, 0x00000017, 0x000050AD, 0x00003910, 0x0000072E,\n    0x000500C2, 0x00000017, 0x0000448E, 0x000050AD, 0x0000013D, 0x000500C5,\n    0x00000017, 0x00003FF9, 0x000024D2, 0x0000448E, 0x000200F9, 0x0000362C,\n    0x000200F8, 0x0000362C, 0x000700F5, 0x00000017, 0x00004AB5, 0x00003910,\n    0x0000362B, 0x00003FF9, 0x00002958, 0x000500C2, 0x0000000B, 0x00001BB8,\n    0x00005679, 0x00000A17, 0x000500C7, 0x00000017, 0x000030B3, 0x00004AB5,\n    0x000003E0, 0x000500C7, 0x00000017, 0x00004944, 0x00004AB5, 0x0000039D,\n    0x000500C4, 0x00000017, 0x00006165, 0x00004944, 0x0000013D, 0x000500C5,\n    0x00000017, 0x00004296, 0x000030B3, 0x00006165, 0x000500C7, 0x00000017,\n    0x000052DD, 0x00004AB5, 0x0000090C, 0x000500C2, 0x00000017, 0x000046A9,\n    0x000052DD, 0x0000013D, 0x000500C5, 0x00000017, 0x00001985, 0x00004296,\n    0x000046A9, 0x00060041, 0x00000294, 0x00005819, 0x0000140E, 0x00000A0B,\n    0x00001BB8, 0x0003003E, 0x00005819, 0x00001985, 0x000200F9, 0x00004C7A,\n    0x000200F8, 0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_r5g5b5a1_b5g5r5a1_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25155\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v4uint = OpTypeVector %uint 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v2uint = OpTypeVector %uint 2\n     %v3uint = OpTypeVector %uint 3\n%uint_2212529120 = OpConstant %uint 2212529120\n%uint_2031647 = OpConstant %uint 2031647\n    %uint_10 = OpConstant %uint 10\n%uint_2080406528 = OpConstant %uint 2080406528\n     %uint_1 = OpConstant %uint 1\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n     %uint_0 = OpConstant %uint 0\n      %int_3 = OpConstant %int 3\n     %uint_2 = OpConstant %uint 2\n      %int_2 = OpConstant %int 2\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n     %uint_3 = OpConstant %uint 3\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n     %uint_4 = OpConstant %uint 4\n       %2612 = OpConstantComposite %v3uint %uint_4 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n    %uint_16 = OpConstant %uint 16\n    %uint_32 = OpConstant %uint 32\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %422 = OpConstantComposite %v4uint %uint_2212529120 %uint_2212529120 %uint_2212529120 %uint_2212529120\n         %27 = OpConstantComposite %v4uint %uint_2031647 %uint_2031647 %uint_2031647 %uint_2031647\n        %425 = OpConstantComposite %v4uint %uint_10 %uint_10 %uint_10 %uint_10\n        %773 = OpConstantComposite %v4uint %uint_2080406528 %uint_2080406528 %uint_2080406528 %uint_2080406528\n    %uint_64 = OpConstant %uint 64\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24540 = OpBitwiseAnd %uint %13606 %uint_1\n      %17270 = OpINotEqual %bool %24540 %uint_0\n      %12328 = OpBitwiseAnd %uint %13606 %uint_2\n      %17284 = OpINotEqual %bool %12328 %uint_0\n       %7856 = OpShiftRightLogical %uint %13606 %uint_2\n      %25058 = OpBitwiseAnd %uint %7856 %uint_3\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2612\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %6586 DontFlatten\n               OpBranchConditional %24679 %21992 %6586\n      %21992 = OpLabel\n               OpBranch %19578\n       %6586 = OpLabel\n      %23478 = OpBitcast %v3int %21387\n      %18710 = OpCompositeExtract %uint %22410 1\n      %23531 = OpCompositeExtract %int %23478 0\n      %22810 = OpIMul %int %23531 %int_2\n       %6362 = OpCompositeExtract %int %23478 2\n      %14505 = OpBitcast %int %18710\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %23478 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %6594\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %22810 %24535\n      %10404 = OpBitcast %uint %8258\n      %14582 = OpIAdd %uint %22411 %10404\n      %12308 = OpLogicalNot %bool %17270\n               OpSelectionMerge %19040 DontFlatten\n               OpBranchConditional %12308 %9741 %17007\n       %9741 = OpLabel\n      %17463 = OpCompositeExtract %uint %21387 0\n      %11246 = OpCompositeExtract %uint %21387 1\n      %18801 = OpCompositeExtract %uint %21387 2\n      %14831 = OpIMul %uint %22409 %18801\n      %20322 = OpIAdd %uint %11246 %14831\n      %21676 = OpIMul %uint %22408 %20322\n      %20398 = OpIAdd %uint %17463 %21676\n      %11367 = OpShiftLeftLogical %uint %20398 %uint_1\n               OpBranch %19040\n      %17007 = OpLabel\n               OpSelectionMerge %23536 DontFlatten\n               OpBranchConditional %17284 %11410 %24353\n      %11410 = OpLabel\n      %21364 = OpShiftRightLogical %uint %22408 %int_5\n      %13804 = OpShiftRightLogical %uint %22409 %int_4\n      %13237 = OpShiftRightArithmetic %int %6362 %int_2\n      %22374 = OpBitcast %int %13804\n      %25085 = OpIMul %int %13237 %22374\n      %11618 = OpShiftRightArithmetic %int %17598 %int_4\n      %16670 = OpIAdd %int %25085 %11618\n      %19064 = OpBitcast %int %21364\n      %13020 = OpIMul %int %16670 %19064\n      %12986 = OpShiftRightArithmetic %int %23531 %int_5\n      %24558 = OpIAdd %int %13020 %12986\n       %8797 = OpShiftLeftLogical %int %24558 %int_7\n      %11434 = OpBitwiseAnd %int %6362 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %17598 %int_1\n      %21365 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21365 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %23531 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17334 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17334 %uint_1\n      %13015 = OpShiftRightArithmetic %int %17598 %int_3\n       %9929 = OpBitwiseXor %int %13015 %13237\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %23531 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %17598 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6551\n       %7168 = OpShiftLeftLogical %int %16793 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24144 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24144 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24144 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24144 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %23536\n      %24353 = OpLabel\n      %23000 = OpBitcast %v2int %17136\n      %22120 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %23000 1\n      %12089 = OpShiftRightArithmetic %int %14597 %int_5\n      %22400 = OpBitcast %int %22120\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %23000 0\n      %20423 = OpShiftRightArithmetic %int %25154 %int_5\n      %18864 = OpIAdd %int %7938 %20423\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25154 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17335 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17335 %uint_1\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25154 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6552\n       %7169 = OpShiftLeftLogical %int %21575 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24163 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24163 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24163 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %23536\n      %23536 = OpLabel\n      %10540 = OpPhi %uint %16869 %11410 %16870 %24353\n               OpBranch %19040\n      %19040 = OpLabel\n      %11376 = OpPhi %uint %11367 %9741 %10540 %23536\n      %18621 = OpIAdd %uint %11376 %24236\n      %15698 = OpShiftRightLogical %uint %18621 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15698\n       %8801 = OpLoad %v4uint %20399\n      %21106 = OpIEqual %bool %25058 %uint_1\n               OpSelectionMerge %13867 None\n               OpBranchConditional %21106 %10583 %13867\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %8801 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %8801 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13867\n      %13867 = OpLabel\n      %19124 = OpPhi %v4uint %8801 %19040 %16376 %10583\n       %7095 = OpShiftRightLogical %uint %14582 %int_4\n      %12466 = OpBitwiseAnd %v4uint %19124 %422\n      %18755 = OpBitwiseAnd %v4uint %19124 %27\n      %24932 = OpShiftLeftLogical %v4uint %18755 %425\n      %17045 = OpBitwiseOr %v4uint %12466 %24932\n      %21212 = OpBitwiseAnd %v4uint %19124 %773\n      %18088 = OpShiftRightLogical %v4uint %21212 %425\n       %6532 = OpBitwiseOr %v4uint %17045 %18088\n      %20254 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %7095\n               OpStore %20254 %6532\n      %21685 = OpIAdd %uint %14582 %uint_16\n               OpSelectionMerge %24688 DontFlatten\n               OpBranchConditional %17270 %21993 %7205\n      %21993 = OpLabel\n               OpBranch %24688\n       %7205 = OpLabel\n               OpBranch %24688\n      %24688 = OpLabel\n      %11377 = OpPhi %uint %uint_64 %21993 %uint_16 %7205\n      %18622 = OpIAdd %uint %18621 %11377\n      %15699 = OpShiftRightLogical %uint %18622 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15699\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %13868 None\n               OpBranchConditional %21106 %10584 %13868\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %13868\n      %13868 = OpLabel\n      %19125 = OpPhi %v4uint %14608 %24688 %16377 %10584\n       %7096 = OpShiftRightLogical %uint %21685 %int_4\n      %12467 = OpBitwiseAnd %v4uint %19125 %422\n      %18756 = OpBitwiseAnd %v4uint %19125 %27\n      %24933 = OpShiftLeftLogical %v4uint %18756 %425\n      %17046 = OpBitwiseOr %v4uint %12467 %24933\n      %21213 = OpBitwiseAnd %v4uint %19125 %773\n      %18089 = OpShiftRightLogical %v4uint %21213 %425\n       %6533 = OpBitwiseOr %v4uint %17046 %18089\n      %22553 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %7096\n               OpStore %22553 %6533\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_r5g5b5a1_b5g5r5a1_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006243, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000017, 0x0000000B, 0x00000004, 0x00040015, 0x0000000C,\n    0x00000020, 0x00000001, 0x00040017, 0x00000012, 0x0000000C, 0x00000002,\n    0x00040017, 0x00000016, 0x0000000C, 0x00000003, 0x00020014, 0x00000009,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x0004002B, 0x0000000B, 0x0000057B, 0x83E083E0,\n    0x0004002B, 0x0000000B, 0x000000EC, 0x001F001F, 0x0004002B, 0x0000000B,\n    0x00000A28, 0x0000000A, 0x0004002B, 0x0000000B, 0x00000683, 0x7C007C00,\n    0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B,\n    0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B, 0x00000A22, 0x00000008,\n    0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00, 0x0004002B, 0x0000000C,\n    0x00000A17, 0x00000004, 0x0004002B, 0x0000000C, 0x00000A1D, 0x00000006,\n    0x0004002B, 0x0000000C, 0x00000A2C, 0x0000000B, 0x0004002B, 0x0000000C,\n    0x00000A38, 0x0000000F, 0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001,\n    0x0004002B, 0x0000000C, 0x00000A1A, 0x00000005, 0x0004002B, 0x0000000C,\n    0x00000A20, 0x00000007, 0x0004002B, 0x0000000C, 0x00000A23, 0x00000008,\n    0x0004002B, 0x0000000C, 0x00000A2F, 0x0000000C, 0x0004002B, 0x0000000B,\n    0x00000A0A, 0x00000000, 0x0004002B, 0x0000000C, 0x00000A14, 0x00000003,\n    0x0004002B, 0x0000000B, 0x00000A10, 0x00000002, 0x0004002B, 0x0000000C,\n    0x00000A11, 0x00000002, 0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000,\n    0x000A001E, 0x00000489, 0x0000000B, 0x0000000B, 0x0000000B, 0x0000000B,\n    0x00000014, 0x0000000B, 0x0000000B, 0x0000000B, 0x00040020, 0x00000706,\n    0x00000009, 0x00000489, 0x0004003B, 0x00000706, 0x00000CE9, 0x00000009,\n    0x00040020, 0x00000288, 0x00000009, 0x0000000B, 0x0004002B, 0x0000000B,\n    0x00000A13, 0x00000003, 0x00040020, 0x00000291, 0x00000009, 0x00000014,\n    0x00040020, 0x00000292, 0x00000001, 0x00000014, 0x0004003B, 0x00000292,\n    0x00000F48, 0x00000001, 0x0004002B, 0x0000000B, 0x00000A16, 0x00000004,\n    0x0006002C, 0x00000014, 0x00000A34, 0x00000A16, 0x00000A0A, 0x00000A0A,\n    0x00040017, 0x0000000F, 0x00000009, 0x00000002, 0x0003001D, 0x000007DC,\n    0x00000017, 0x0003001E, 0x000007B4, 0x000007DC, 0x00040020, 0x00000A31,\n    0x00000002, 0x000007B4, 0x0004003B, 0x00000A31, 0x0000107A, 0x00000002,\n    0x00040020, 0x00000294, 0x00000002, 0x00000017, 0x0003001D, 0x000007DD,\n    0x00000017, 0x0003001E, 0x000007B5, 0x000007DD, 0x00040020, 0x00000A32,\n    0x00000002, 0x000007B5, 0x0004003B, 0x00000A32, 0x0000140E, 0x00000002,\n    0x0004002B, 0x0000000B, 0x00000A3A, 0x00000010, 0x0004002B, 0x0000000B,\n    0x00000A6A, 0x00000020, 0x0006002C, 0x00000014, 0x00000BC3, 0x00000A16,\n    0x00000A6A, 0x00000A0D, 0x0007002C, 0x00000017, 0x000009CE, 0x000008A6,\n    0x000008A6, 0x000008A6, 0x000008A6, 0x0007002C, 0x00000017, 0x0000013D,\n    0x00000A22, 0x00000A22, 0x00000A22, 0x00000A22, 0x0007002C, 0x00000017,\n    0x0000072E, 0x000005FD, 0x000005FD, 0x000005FD, 0x000005FD, 0x0007002C,\n    0x00000017, 0x000001A6, 0x0000057B, 0x0000057B, 0x0000057B, 0x0000057B,\n    0x0007002C, 0x00000017, 0x0000001B, 0x000000EC, 0x000000EC, 0x000000EC,\n    0x000000EC, 0x0007002C, 0x00000017, 0x000001A9, 0x00000A28, 0x00000A28,\n    0x00000A28, 0x00000A28, 0x0007002C, 0x00000017, 0x00000305, 0x00000683,\n    0x00000683, 0x00000683, 0x00000683, 0x0004002B, 0x0000000B, 0x00000ACA,\n    0x00000040, 0x00050036, 0x00000008, 0x0000161F, 0x00000000, 0x00000502,\n    0x000200F8, 0x00003B06, 0x000300F7, 0x00004C7A, 0x00000000, 0x000300FB,\n    0x00000A0A, 0x00002E68, 0x000200F8, 0x00002E68, 0x00050041, 0x00000288,\n    0x000060D7, 0x00000CE9, 0x00000A0B, 0x0004003D, 0x0000000B, 0x00003526,\n    0x000060D7, 0x000500C7, 0x0000000B, 0x00005FDC, 0x00003526, 0x00000A0D,\n    0x000500AB, 0x00000009, 0x00004376, 0x00005FDC, 0x00000A0A, 0x000500C7,\n    0x0000000B, 0x00003028, 0x00003526, 0x00000A10, 0x000500AB, 0x00000009,\n    0x00004384, 0x00003028, 0x00000A0A, 0x000500C2, 0x0000000B, 0x00001EB0,\n    0x00003526, 0x00000A10, 0x000500C7, 0x0000000B, 0x000061E2, 0x00001EB0,\n    0x00000A13, 0x00050041, 0x00000288, 0x0000492C, 0x00000CE9, 0x00000A0E,\n    0x0004003D, 0x0000000B, 0x00005EAC, 0x0000492C, 0x00050041, 0x00000288,\n    0x00004EBA, 0x00000CE9, 0x00000A11, 0x0004003D, 0x0000000B, 0x00005788,\n    0x00004EBA, 0x00050041, 0x00000288, 0x00004EBB, 0x00000CE9, 0x00000A14,\n    0x0004003D, 0x0000000B, 0x00005789, 0x00004EBB, 0x00050041, 0x00000291,\n    0x00004EBC, 0x00000CE9, 0x00000A17, 0x0004003D, 0x00000014, 0x0000578A,\n    0x00004EBC, 0x00050041, 0x00000288, 0x00004EBD, 0x00000CE9, 0x00000A1A,\n    0x0004003D, 0x0000000B, 0x0000578B, 0x00004EBD, 0x00050041, 0x00000288,\n    0x00004E6E, 0x00000CE9, 0x00000A1D, 0x0004003D, 0x0000000B, 0x000019C2,\n    0x00004E6E, 0x0004003D, 0x00000014, 0x00002A0E, 0x00000F48, 0x000500C4,\n    0x00000014, 0x0000538B, 0x00002A0E, 0x00000A34, 0x0007004F, 0x00000011,\n    0x000042F0, 0x0000538B, 0x0000538B, 0x00000000, 0x00000001, 0x0007004F,\n    0x00000011, 0x0000242F, 0x0000578A, 0x0000578A, 0x00000000, 0x00000001,\n    0x000500AE, 0x0000000F, 0x00004288, 0x000042F0, 0x0000242F, 0x0004009A,\n    0x00000009, 0x00006067, 0x00004288, 0x000300F7, 0x000019BA, 0x00000002,\n    0x000400FA, 0x00006067, 0x000055E8, 0x000019BA, 0x000200F8, 0x000055E8,\n    0x000200F9, 0x00004C7A, 0x000200F8, 0x000019BA, 0x0004007C, 0x00000016,\n    0x00005BB6, 0x0000538B, 0x00050051, 0x0000000B, 0x00004916, 0x0000578A,\n    0x00000001, 0x00050051, 0x0000000C, 0x00005BEB, 0x00005BB6, 0x00000000,\n    0x00050084, 0x0000000C, 0x0000591A, 0x00005BEB, 0x00000A11, 0x00050051,\n    0x0000000C, 0x000018DA, 0x00005BB6, 0x00000002, 0x0004007C, 0x0000000C,\n    0x000038A9, 0x00004916, 0x00050084, 0x0000000C, 0x00002C0F, 0x000018DA,\n    0x000038A9, 0x00050051, 0x0000000C, 0x000044BE, 0x00005BB6, 0x00000001,\n    0x00050080, 0x0000000C, 0x000056D4, 0x00002C0F, 0x000044BE, 0x0004007C,\n    0x0000000C, 0x00005785, 0x000019C2, 0x00050084, 0x0000000C, 0x00005FD7,\n    0x000056D4, 0x00005785, 0x00050080, 0x0000000C, 0x00002042, 0x0000591A,\n    0x00005FD7, 0x0004007C, 0x0000000B, 0x000028A4, 0x00002042, 0x00050080,\n    0x0000000B, 0x000038F6, 0x0000578B, 0x000028A4, 0x000400A8, 0x00000009,\n    0x00003014, 0x00004376, 0x000300F7, 0x00004A60, 0x00000002, 0x000400FA,\n    0x00003014, 0x0000260D, 0x0000426F, 0x000200F8, 0x0000260D, 0x00050051,\n    0x0000000B, 0x00004437, 0x0000538B, 0x00000000, 0x00050051, 0x0000000B,\n    0x00002BEE, 0x0000538B, 0x00000001, 0x00050051, 0x0000000B, 0x00004971,\n    0x0000538B, 0x00000002, 0x00050084, 0x0000000B, 0x000039EF, 0x00005789,\n    0x00004971, 0x00050080, 0x0000000B, 0x00004F62, 0x00002BEE, 0x000039EF,\n    0x00050084, 0x0000000B, 0x000054AC, 0x00005788, 0x00004F62, 0x00050080,\n    0x0000000B, 0x00004FAE, 0x00004437, 0x000054AC, 0x000500C4, 0x0000000B,\n    0x00002C67, 0x00004FAE, 0x00000A0D, 0x000200F9, 0x00004A60, 0x000200F8,\n    0x0000426F, 0x000300F7, 0x00005BF0, 0x00000002, 0x000400FA, 0x00004384,\n    0x00002C92, 0x00005F21, 0x000200F8, 0x00002C92, 0x000500C2, 0x0000000B,\n    0x00005374, 0x00005788, 0x00000A1A, 0x000500C2, 0x0000000B, 0x000035EC,\n    0x00005789, 0x00000A17, 0x000500C3, 0x0000000C, 0x000033B5, 0x000018DA,\n    0x00000A11, 0x0004007C, 0x0000000C, 0x00005766, 0x000035EC, 0x00050084,\n    0x0000000C, 0x000061FD, 0x000033B5, 0x00005766, 0x000500C3, 0x0000000C,\n    0x00002D62, 0x000044BE, 0x00000A17, 0x00050080, 0x0000000C, 0x0000411E,\n    0x000061FD, 0x00002D62, 0x0004007C, 0x0000000C, 0x00004A78, 0x00005374,\n    0x00050084, 0x0000000C, 0x000032DC, 0x0000411E, 0x00004A78, 0x000500C3,\n    0x0000000C, 0x000032BA, 0x00005BEB, 0x00000A1A, 0x00050080, 0x0000000C,\n    0x00005FEE, 0x000032DC, 0x000032BA, 0x000500C4, 0x0000000C, 0x0000225D,\n    0x00005FEE, 0x00000A20, 0x000500C7, 0x0000000C, 0x00002CAA, 0x000018DA,\n    0x00000A14, 0x000500C4, 0x0000000C, 0x00004CAE, 0x00002CAA, 0x00000A1A,\n    0x000500C3, 0x0000000C, 0x0000383E, 0x000044BE, 0x00000A0E, 0x000500C7,\n    0x0000000C, 0x00005375, 0x0000383E, 0x00000A14, 0x000500C4, 0x0000000C,\n    0x000054CA, 0x00005375, 0x00000A14, 0x000500C5, 0x0000000C, 0x000042CE,\n    0x00004CAE, 0x000054CA, 0x000500C7, 0x0000000C, 0x000050D5, 0x00005BEB,\n    0x00000A20, 0x000500C5, 0x0000000C, 0x00003ADD, 0x000042CE, 0x000050D5,\n    0x000500C5, 0x0000000C, 0x000043B6, 0x0000225D, 0x00003ADD, 0x000500C4,\n    0x0000000C, 0x00005E50, 0x000043B6, 0x00000A0D, 0x000500C3, 0x0000000C,\n    0x000032D7, 0x000044BE, 0x00000A14, 0x000500C6, 0x0000000C, 0x000026C9,\n    0x000032D7, 0x000033B5, 0x000500C7, 0x0000000C, 0x00004199, 0x000026C9,\n    0x00000A0E, 0x000500C3, 0x0000000C, 0x00002590, 0x00005BEB, 0x00000A14,\n    0x000500C7, 0x0000000C, 0x0000505E, 0x00002590, 0x00000A14, 0x000500C4,\n    0x0000000C, 0x0000541D, 0x00004199, 0x00000A0E, 0x000500C6, 0x0000000C,\n    0x000022BA, 0x0000505E, 0x0000541D, 0x000500C7, 0x0000000C, 0x00005076,\n    0x000044BE, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005228, 0x00005076,\n    0x00000A17, 0x000500C4, 0x0000000C, 0x00001997, 0x000022BA, 0x00000A1D,\n    0x000500C5, 0x0000000C, 0x000047FE, 0x00005228, 0x00001997, 0x000500C4,\n    0x0000000C, 0x00001C00, 0x00004199, 0x00000A2C, 0x000500C5, 0x0000000C,\n    0x00003C81, 0x000047FE, 0x00001C00, 0x000500C7, 0x0000000C, 0x000050AF,\n    0x00005E50, 0x00000A38, 0x000500C5, 0x0000000C, 0x00003C70, 0x00003C81,\n    0x000050AF, 0x000500C3, 0x0000000C, 0x00003745, 0x00005E50, 0x00000A17,\n    0x000500C7, 0x0000000C, 0x000018B8, 0x00003745, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x0000547E, 0x000018B8, 0x00000A1A, 0x000500C5, 0x0000000C,\n    0x000045A8, 0x00003C70, 0x0000547E, 0x000500C3, 0x0000000C, 0x00003A6E,\n    0x00005E50, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018B9, 0x00003A6E,\n    0x00000A20, 0x000500C4, 0x0000000C, 0x0000547F, 0x000018B9, 0x00000A23,\n    0x000500C5, 0x0000000C, 0x0000456F, 0x000045A8, 0x0000547F, 0x000500C3,\n    0x0000000C, 0x00003C88, 0x00005E50, 0x00000A23, 0x000500C4, 0x0000000C,\n    0x00002824, 0x00003C88, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B79,\n    0x0000456F, 0x00002824, 0x0004007C, 0x0000000B, 0x000041E5, 0x00003B79,\n    0x000200F9, 0x00005BF0, 0x000200F8, 0x00005F21, 0x0004007C, 0x00000012,\n    0x000059D8, 0x000042F0, 0x000500C2, 0x0000000B, 0x00005668, 0x00005788,\n    0x00000A1A, 0x00050051, 0x0000000C, 0x00003905, 0x000059D8, 0x00000001,\n    0x000500C3, 0x0000000C, 0x00002F39, 0x00003905, 0x00000A1A, 0x0004007C,\n    0x0000000C, 0x00005780, 0x00005668, 0x00050084, 0x0000000C, 0x00001F02,\n    0x00002F39, 0x00005780, 0x00050051, 0x0000000C, 0x00006242, 0x000059D8,\n    0x00000000, 0x000500C3, 0x0000000C, 0x00004FC7, 0x00006242, 0x00000A1A,\n    0x00050080, 0x0000000C, 0x000049B0, 0x00001F02, 0x00004FC7, 0x000500C4,\n    0x0000000C, 0x0000254A, 0x000049B0, 0x00000A1D, 0x000500C3, 0x0000000C,\n    0x0000603B, 0x00003905, 0x00000A0E, 0x000500C7, 0x0000000C, 0x0000539A,\n    0x0000603B, 0x00000A20, 0x000500C4, 0x0000000C, 0x0000534A, 0x0000539A,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x00004EA5, 0x00006242, 0x00000A20,\n    0x000500C5, 0x0000000C, 0x00002B1A, 0x0000534A, 0x00004EA5, 0x000500C5,\n    0x0000000C, 0x000043B7, 0x0000254A, 0x00002B1A, 0x000500C4, 0x0000000C,\n    0x00005E63, 0x000043B7, 0x00000A0D, 0x000500C3, 0x0000000C, 0x000031DE,\n    0x00003905, 0x00000A17, 0x000500C7, 0x0000000C, 0x00005447, 0x000031DE,\n    0x00000A0E, 0x000500C3, 0x0000000C, 0x000028A6, 0x00006242, 0x00000A14,\n    0x000500C7, 0x0000000C, 0x0000511E, 0x000028A6, 0x00000A14, 0x000500C3,\n    0x0000000C, 0x000028B9, 0x00003905, 0x00000A14, 0x000500C7, 0x0000000C,\n    0x0000505F, 0x000028B9, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000541E,\n    0x0000505F, 0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BB, 0x0000511E,\n    0x0000541E, 0x000500C7, 0x0000000C, 0x00005077, 0x00003905, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x00005229, 0x00005077, 0x00000A17, 0x000500C4,\n    0x0000000C, 0x00001998, 0x000022BB, 0x00000A1D, 0x000500C5, 0x0000000C,\n    0x000047FF, 0x00005229, 0x00001998, 0x000500C4, 0x0000000C, 0x00001C01,\n    0x00005447, 0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C82, 0x000047FF,\n    0x00001C01, 0x000500C7, 0x0000000C, 0x000050B0, 0x00005E63, 0x00000A38,\n    0x000500C5, 0x0000000C, 0x00003C71, 0x00003C82, 0x000050B0, 0x000500C3,\n    0x0000000C, 0x00003746, 0x00005E63, 0x00000A17, 0x000500C7, 0x0000000C,\n    0x000018BA, 0x00003746, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005480,\n    0x000018BA, 0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A9, 0x00003C71,\n    0x00005480, 0x000500C3, 0x0000000C, 0x00003A6F, 0x00005E63, 0x00000A1A,\n    0x000500C7, 0x0000000C, 0x000018BB, 0x00003A6F, 0x00000A20, 0x000500C4,\n    0x0000000C, 0x00005481, 0x000018BB, 0x00000A23, 0x000500C5, 0x0000000C,\n    0x00004570, 0x000045A9, 0x00005481, 0x000500C3, 0x0000000C, 0x00003C89,\n    0x00005E63, 0x00000A23, 0x000500C4, 0x0000000C, 0x00002825, 0x00003C89,\n    0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B7A, 0x00004570, 0x00002825,\n    0x0004007C, 0x0000000B, 0x000041E6, 0x00003B7A, 0x000200F9, 0x00005BF0,\n    0x000200F8, 0x00005BF0, 0x000700F5, 0x0000000B, 0x0000292C, 0x000041E5,\n    0x00002C92, 0x000041E6, 0x00005F21, 0x000200F9, 0x00004A60, 0x000200F8,\n    0x00004A60, 0x000700F5, 0x0000000B, 0x00002C70, 0x00002C67, 0x0000260D,\n    0x0000292C, 0x00005BF0, 0x00050080, 0x0000000B, 0x000048BD, 0x00002C70,\n    0x00005EAC, 0x000500C2, 0x0000000B, 0x00003D52, 0x000048BD, 0x00000A17,\n    0x00060041, 0x00000294, 0x00004FAF, 0x0000107A, 0x00000A0B, 0x00003D52,\n    0x0004003D, 0x00000017, 0x00002261, 0x00004FAF, 0x000500AA, 0x00000009,\n    0x00005272, 0x000061E2, 0x00000A0D, 0x000300F7, 0x0000362B, 0x00000000,\n    0x000400FA, 0x00005272, 0x00002957, 0x0000362B, 0x000200F8, 0x00002957,\n    0x000500C7, 0x00000017, 0x0000475F, 0x00002261, 0x000009CE, 0x000500C4,\n    0x00000017, 0x000024D1, 0x0000475F, 0x0000013D, 0x000500C7, 0x00000017,\n    0x000050AC, 0x00002261, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448D,\n    0x000050AC, 0x0000013D, 0x000500C5, 0x00000017, 0x00003FF8, 0x000024D1,\n    0x0000448D, 0x000200F9, 0x0000362B, 0x000200F8, 0x0000362B, 0x000700F5,\n    0x00000017, 0x00004AB4, 0x00002261, 0x00004A60, 0x00003FF8, 0x00002957,\n    0x000500C2, 0x0000000B, 0x00001BB7, 0x000038F6, 0x00000A17, 0x000500C7,\n    0x00000017, 0x000030B2, 0x00004AB4, 0x000001A6, 0x000500C7, 0x00000017,\n    0x00004943, 0x00004AB4, 0x0000001B, 0x000500C4, 0x00000017, 0x00006164,\n    0x00004943, 0x000001A9, 0x000500C5, 0x00000017, 0x00004295, 0x000030B2,\n    0x00006164, 0x000500C7, 0x00000017, 0x000052DC, 0x00004AB4, 0x00000305,\n    0x000500C2, 0x00000017, 0x000046A8, 0x000052DC, 0x000001A9, 0x000500C5,\n    0x00000017, 0x00001984, 0x00004295, 0x000046A8, 0x00060041, 0x00000294,\n    0x00004F1E, 0x0000140E, 0x00000A0B, 0x00001BB7, 0x0003003E, 0x00004F1E,\n    0x00001984, 0x00050080, 0x0000000B, 0x000054B5, 0x000038F6, 0x00000A3A,\n    0x000300F7, 0x00006070, 0x00000002, 0x000400FA, 0x00004376, 0x000055E9,\n    0x00001C25, 0x000200F8, 0x000055E9, 0x000200F9, 0x00006070, 0x000200F8,\n    0x00001C25, 0x000200F9, 0x00006070, 0x000200F8, 0x00006070, 0x000700F5,\n    0x0000000B, 0x00002C71, 0x00000ACA, 0x000055E9, 0x00000A3A, 0x00001C25,\n    0x00050080, 0x0000000B, 0x000048BE, 0x000048BD, 0x00002C71, 0x000500C2,\n    0x0000000B, 0x00003D53, 0x000048BE, 0x00000A17, 0x00060041, 0x00000294,\n    0x00005566, 0x0000107A, 0x00000A0B, 0x00003D53, 0x0004003D, 0x00000017,\n    0x00003910, 0x00005566, 0x000300F7, 0x0000362C, 0x00000000, 0x000400FA,\n    0x00005272, 0x00002958, 0x0000362C, 0x000200F8, 0x00002958, 0x000500C7,\n    0x00000017, 0x00004760, 0x00003910, 0x000009CE, 0x000500C4, 0x00000017,\n    0x000024D2, 0x00004760, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AD,\n    0x00003910, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448E, 0x000050AD,\n    0x0000013D, 0x000500C5, 0x00000017, 0x00003FF9, 0x000024D2, 0x0000448E,\n    0x000200F9, 0x0000362C, 0x000200F8, 0x0000362C, 0x000700F5, 0x00000017,\n    0x00004AB5, 0x00003910, 0x00006070, 0x00003FF9, 0x00002958, 0x000500C2,\n    0x0000000B, 0x00001BB8, 0x000054B5, 0x00000A17, 0x000500C7, 0x00000017,\n    0x000030B3, 0x00004AB5, 0x000001A6, 0x000500C7, 0x00000017, 0x00004944,\n    0x00004AB5, 0x0000001B, 0x000500C4, 0x00000017, 0x00006165, 0x00004944,\n    0x000001A9, 0x000500C5, 0x00000017, 0x00004296, 0x000030B3, 0x00006165,\n    0x000500C7, 0x00000017, 0x000052DD, 0x00004AB5, 0x00000305, 0x000500C2,\n    0x00000017, 0x000046A9, 0x000052DD, 0x000001A9, 0x000500C5, 0x00000017,\n    0x00001985, 0x00004296, 0x000046A9, 0x00060041, 0x00000294, 0x00005819,\n    0x0000140E, 0x00000A0B, 0x00001BB8, 0x0003003E, 0x00005819, 0x00001985,\n    0x000200F9, 0x00004C7A, 0x000200F8, 0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_r5g5b5a1_b5g5r5a1_scaled_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25157\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n     %v4uint = OpTypeVector %uint 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v3uint = OpTypeVector %uint 3\n%uint_2212529120 = OpConstant %uint 2212529120\n%uint_2031647 = OpConstant %uint 2031647\n    %uint_10 = OpConstant %uint 10\n%uint_2080406528 = OpConstant %uint 2080406528\n     %uint_1 = OpConstant %uint 1\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n     %uint_0 = OpConstant %uint 0\n      %int_3 = OpConstant %int 3\n     %uint_2 = OpConstant %uint 2\n      %int_2 = OpConstant %int 2\n     %uint_3 = OpConstant %uint 3\n     %uint_5 = OpConstant %uint 5\n     %uint_4 = OpConstant %uint 4\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n     %uint_7 = OpConstant %uint 7\n       %1927 = OpConstantComposite %v2uint %uint_4 %uint_7\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %2612 = OpConstantComposite %v3uint %uint_4 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n    %uint_16 = OpConstant %uint 16\n    %uint_32 = OpConstant %uint 32\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %1954 = OpConstantComposite %v2uint %uint_7 %uint_7\n       %1867 = OpConstantComposite %v2uint %uint_4 %uint_2\n    %uint_15 = OpConstant %uint 15\n       %1978 = OpConstantComposite %v2uint %uint_15 %uint_3\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %422 = OpConstantComposite %v4uint %uint_2212529120 %uint_2212529120 %uint_2212529120 %uint_2212529120\n         %27 = OpConstantComposite %v4uint %uint_2031647 %uint_2031647 %uint_2031647 %uint_2031647\n        %425 = OpConstantComposite %v4uint %uint_10 %uint_10 %uint_10 %uint_10\n        %773 = OpConstantComposite %v4uint %uint_2080406528 %uint_2080406528 %uint_2080406528 %uint_2080406528\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24445 = OpBitwiseAnd %uint %13606 %uint_2\n      %18667 = OpINotEqual %bool %24445 %uint_0\n       %8141 = OpShiftRightLogical %uint %13606 %uint_2\n      %24990 = OpBitwiseAnd %uint %8141 %uint_3\n       %8871 = OpCompositeConstruct %v2uint %13606 %13606\n       %7087 = OpShiftRightLogical %v2uint %8871 %1927\n       %6551 = OpBitwiseAnd %v2uint %7087 %1954\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2612\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %6586 DontFlatten\n               OpBranchConditional %24679 %21992 %6586\n      %21992 = OpLabel\n               OpBranch %19578\n       %6586 = OpLabel\n      %23478 = OpBitcast %v3int %21387\n      %18710 = OpCompositeExtract %uint %22410 1\n      %23531 = OpCompositeExtract %int %23478 0\n      %22810 = OpIMul %int %23531 %int_2\n       %6362 = OpCompositeExtract %int %23478 2\n      %14505 = OpBitcast %int %18710\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %23478 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %6594\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %22810 %24535\n      %10898 = OpBitcast %uint %8258\n       %7937 = OpIAdd %uint %22411 %10898\n      %19921 = OpShiftRightLogical %v2uint %17136 %1867\n       %7712 = OpUDiv %v2uint %19921 %6551\n      %18183 = OpIMul %v2uint %6551 %7712\n      %18273 = OpISub %v2uint %19921 %18183\n      %11232 = OpShiftLeftLogical %v2uint %7712 %1867\n      %13284 = OpCompositeExtract %uint %18273 0\n      %10872 = OpCompositeExtract %uint %6551 1\n      %22886 = OpIMul %uint %13284 %10872\n       %6943 = OpCompositeExtract %uint %18273 1\n      %10469 = OpIAdd %uint %22886 %6943\n      %18851 = OpBitwiseAnd %v2uint %17136 %1978\n      %10581 = OpShiftLeftLogical %uint %10469 %uint_7\n      %20916 = OpCompositeExtract %uint %18851 1\n      %23596 = OpShiftLeftLogical %uint %20916 %uint_5\n      %19814 = OpBitwiseOr %uint %10581 %23596\n      %21476 = OpCompositeExtract %uint %18851 0\n       %8560 = OpShiftLeftLogical %uint %21476 %uint_1\n      %17648 = OpBitwiseOr %uint %19814 %8560\n      %19923 = OpCompositeExtract %uint %11232 0\n      %15556 = OpCompositeInsert %v3uint %19923 %21387 0\n      %23006 = OpCompositeExtract %uint %11232 1\n       %9680 = OpCompositeInsert %v3uint %23006 %15556 1\n               OpSelectionMerge %20344 DontFlatten\n               OpBranchConditional %18667 %23520 %11737\n      %23520 = OpLabel\n      %10111 = OpBitcast %v3int %9680\n      %19476 = OpShiftRightLogical %uint %22408 %int_5\n      %18810 = OpShiftRightLogical %uint %22409 %int_4\n       %6782 = OpCompositeExtract %int %10111 2\n      %12089 = OpShiftRightArithmetic %int %6782 %int_2\n      %22400 = OpBitcast %int %18810\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %10111 1\n      %19055 = OpShiftRightArithmetic %int %25154 %int_4\n      %11052 = OpIAdd %int %7938 %19055\n      %16898 = OpBitcast %int %19476\n      %14944 = OpIMul %int %11052 %16898\n      %25155 = OpCompositeExtract %int %10111 0\n      %20423 = OpShiftRightArithmetic %int %25155 %int_5\n      %18940 = OpIAdd %int %14944 %20423\n       %8797 = OpShiftLeftLogical %int %18940 %int_7\n      %11434 = OpBitwiseAnd %int %6782 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %25154 %int_1\n      %21364 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21364 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %25155 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17334 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17334 %uint_1\n      %13015 = OpShiftRightArithmetic %int %25154 %int_3\n       %9929 = OpBitwiseXor %int %13015 %12089\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %25155 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %25154 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6552 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6552\n       %7168 = OpShiftLeftLogical %int %16793 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24144 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24144 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24144 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24144 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %20344\n      %11737 = OpLabel\n      %11908 = OpVectorShuffle %v2uint %9680 %9680 0 1\n      %20347 = OpBitcast %v2int %11908\n      %11433 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %20347 1\n      %12090 = OpShiftRightArithmetic %int %14597 %int_5\n      %22401 = OpBitcast %int %11433\n       %7939 = OpIMul %int %12090 %22401\n      %25156 = OpCompositeExtract %int %20347 0\n      %20424 = OpShiftRightArithmetic %int %25156 %int_5\n      %18864 = OpIAdd %int %7939 %20424\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25156 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17335 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17335 %uint_1\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25156 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6553 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6553\n       %7169 = OpShiftLeftLogical %int %21575 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24163 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24163 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24163 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %20344\n      %20344 = OpLabel\n      %18329 = OpPhi %uint %16869 %23520 %16870 %11737\n      %15200 = OpCompositeExtract %uint %6551 0\n      %17489 = OpIMul %uint %15200 %10872\n       %7313 = OpIMul %uint %18329 %17489\n       %8815 = OpIAdd %uint %7313 %17648\n      %21470 = OpIAdd %uint %8815 %24236\n      %14664 = OpShiftRightLogical %uint %21470 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %14664\n       %8801 = OpLoad %v4uint %20399\n      %21106 = OpIEqual %bool %24990 %uint_1\n               OpSelectionMerge %13867 None\n               OpBranchConditional %21106 %10583 %13867\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %8801 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %8801 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13867\n      %13867 = OpLabel\n      %19124 = OpPhi %v4uint %8801 %20344 %16376 %10583\n       %7095 = OpShiftRightLogical %uint %7937 %int_4\n      %12466 = OpBitwiseAnd %v4uint %19124 %422\n      %18755 = OpBitwiseAnd %v4uint %19124 %27\n      %24932 = OpShiftLeftLogical %v4uint %18755 %425\n      %17045 = OpBitwiseOr %v4uint %12466 %24932\n      %21212 = OpBitwiseAnd %v4uint %19124 %773\n      %18088 = OpShiftRightLogical %v4uint %21212 %425\n       %6532 = OpBitwiseOr %v4uint %17045 %18088\n      %20254 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %7095\n               OpStore %20254 %6532\n      %22137 = OpIAdd %uint %7937 %uint_16\n      %10214 = OpIAdd %uint %21470 %uint_16\n      %14665 = OpShiftRightLogical %uint %10214 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %14665\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %13868 None\n               OpBranchConditional %21106 %10584 %13868\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %13868\n      %13868 = OpLabel\n      %19125 = OpPhi %v4uint %14608 %13867 %16377 %10584\n       %7096 = OpShiftRightLogical %uint %22137 %int_4\n      %12467 = OpBitwiseAnd %v4uint %19125 %422\n      %18756 = OpBitwiseAnd %v4uint %19125 %27\n      %24933 = OpShiftLeftLogical %v4uint %18756 %425\n      %17046 = OpBitwiseOr %v4uint %12467 %24933\n      %21213 = OpBitwiseAnd %v4uint %19125 %773\n      %18089 = OpShiftRightLogical %v4uint %21213 %425\n       %6533 = OpBitwiseOr %v4uint %17046 %18089\n      %22553 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %7096\n               OpStore %22553 %6533\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_r5g5b5a1_b5g5r5a1_scaled_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006245, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000017,\n    0x0000000B, 0x00000004, 0x00040015, 0x0000000C, 0x00000020, 0x00000001,\n    0x00040017, 0x00000012, 0x0000000C, 0x00000002, 0x00040017, 0x00000016,\n    0x0000000C, 0x00000003, 0x00020014, 0x00000009, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x0004002B, 0x0000000B, 0x0000057B, 0x83E083E0,\n    0x0004002B, 0x0000000B, 0x000000EC, 0x001F001F, 0x0004002B, 0x0000000B,\n    0x00000A28, 0x0000000A, 0x0004002B, 0x0000000B, 0x00000683, 0x7C007C00,\n    0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B,\n    0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B, 0x00000A22, 0x00000008,\n    0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00, 0x0004002B, 0x0000000C,\n    0x00000A17, 0x00000004, 0x0004002B, 0x0000000C, 0x00000A1D, 0x00000006,\n    0x0004002B, 0x0000000C, 0x00000A2C, 0x0000000B, 0x0004002B, 0x0000000C,\n    0x00000A38, 0x0000000F, 0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001,\n    0x0004002B, 0x0000000C, 0x00000A1A, 0x00000005, 0x0004002B, 0x0000000C,\n    0x00000A20, 0x00000007, 0x0004002B, 0x0000000C, 0x00000A23, 0x00000008,\n    0x0004002B, 0x0000000C, 0x00000A2F, 0x0000000C, 0x0004002B, 0x0000000B,\n    0x00000A0A, 0x00000000, 0x0004002B, 0x0000000C, 0x00000A14, 0x00000003,\n    0x0004002B, 0x0000000B, 0x00000A10, 0x00000002, 0x0004002B, 0x0000000C,\n    0x00000A11, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A13, 0x00000003,\n    0x0004002B, 0x0000000B, 0x00000A19, 0x00000005, 0x0004002B, 0x0000000B,\n    0x00000A16, 0x00000004, 0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000,\n    0x000A001E, 0x00000489, 0x0000000B, 0x0000000B, 0x0000000B, 0x0000000B,\n    0x00000014, 0x0000000B, 0x0000000B, 0x0000000B, 0x00040020, 0x00000706,\n    0x00000009, 0x00000489, 0x0004003B, 0x00000706, 0x00000CE9, 0x00000009,\n    0x00040020, 0x00000288, 0x00000009, 0x0000000B, 0x0004002B, 0x0000000B,\n    0x00000A1F, 0x00000007, 0x0005002C, 0x00000011, 0x00000787, 0x00000A16,\n    0x00000A1F, 0x00040020, 0x00000291, 0x00000009, 0x00000014, 0x00040020,\n    0x00000292, 0x00000001, 0x00000014, 0x0004003B, 0x00000292, 0x00000F48,\n    0x00000001, 0x0006002C, 0x00000014, 0x00000A34, 0x00000A16, 0x00000A0A,\n    0x00000A0A, 0x00040017, 0x0000000F, 0x00000009, 0x00000002, 0x0003001D,\n    0x000007DC, 0x00000017, 0x0003001E, 0x000007B4, 0x000007DC, 0x00040020,\n    0x00000A31, 0x00000002, 0x000007B4, 0x0004003B, 0x00000A31, 0x0000107A,\n    0x00000002, 0x00040020, 0x00000294, 0x00000002, 0x00000017, 0x0003001D,\n    0x000007DD, 0x00000017, 0x0003001E, 0x000007B5, 0x000007DD, 0x00040020,\n    0x00000A32, 0x00000002, 0x000007B5, 0x0004003B, 0x00000A32, 0x0000140E,\n    0x00000002, 0x0004002B, 0x0000000B, 0x00000A3A, 0x00000010, 0x0004002B,\n    0x0000000B, 0x00000A6A, 0x00000020, 0x0006002C, 0x00000014, 0x00000BC3,\n    0x00000A16, 0x00000A6A, 0x00000A0D, 0x0005002C, 0x00000011, 0x000007A2,\n    0x00000A1F, 0x00000A1F, 0x0005002C, 0x00000011, 0x0000074B, 0x00000A16,\n    0x00000A10, 0x0004002B, 0x0000000B, 0x00000A37, 0x0000000F, 0x0005002C,\n    0x00000011, 0x000007BA, 0x00000A37, 0x00000A13, 0x0007002C, 0x00000017,\n    0x000009CE, 0x000008A6, 0x000008A6, 0x000008A6, 0x000008A6, 0x0007002C,\n    0x00000017, 0x0000013D, 0x00000A22, 0x00000A22, 0x00000A22, 0x00000A22,\n    0x0007002C, 0x00000017, 0x0000072E, 0x000005FD, 0x000005FD, 0x000005FD,\n    0x000005FD, 0x0007002C, 0x00000017, 0x000001A6, 0x0000057B, 0x0000057B,\n    0x0000057B, 0x0000057B, 0x0007002C, 0x00000017, 0x0000001B, 0x000000EC,\n    0x000000EC, 0x000000EC, 0x000000EC, 0x0007002C, 0x00000017, 0x000001A9,\n    0x00000A28, 0x00000A28, 0x00000A28, 0x00000A28, 0x0007002C, 0x00000017,\n    0x00000305, 0x00000683, 0x00000683, 0x00000683, 0x00000683, 0x00050036,\n    0x00000008, 0x0000161F, 0x00000000, 0x00000502, 0x000200F8, 0x00003B06,\n    0x000300F7, 0x00004C7A, 0x00000000, 0x000300FB, 0x00000A0A, 0x00002E68,\n    0x000200F8, 0x00002E68, 0x00050041, 0x00000288, 0x000060D7, 0x00000CE9,\n    0x00000A0B, 0x0004003D, 0x0000000B, 0x00003526, 0x000060D7, 0x000500C7,\n    0x0000000B, 0x00005F7D, 0x00003526, 0x00000A10, 0x000500AB, 0x00000009,\n    0x000048EB, 0x00005F7D, 0x00000A0A, 0x000500C2, 0x0000000B, 0x00001FCD,\n    0x00003526, 0x00000A10, 0x000500C7, 0x0000000B, 0x0000619E, 0x00001FCD,\n    0x00000A13, 0x00050050, 0x00000011, 0x000022A7, 0x00003526, 0x00003526,\n    0x000500C2, 0x00000011, 0x00001BAF, 0x000022A7, 0x00000787, 0x000500C7,\n    0x00000011, 0x00001997, 0x00001BAF, 0x000007A2, 0x00050041, 0x00000288,\n    0x0000492C, 0x00000CE9, 0x00000A0E, 0x0004003D, 0x0000000B, 0x00005EAC,\n    0x0000492C, 0x00050041, 0x00000288, 0x00004EBA, 0x00000CE9, 0x00000A11,\n    0x0004003D, 0x0000000B, 0x00005788, 0x00004EBA, 0x00050041, 0x00000288,\n    0x00004EBB, 0x00000CE9, 0x00000A14, 0x0004003D, 0x0000000B, 0x00005789,\n    0x00004EBB, 0x00050041, 0x00000291, 0x00004EBC, 0x00000CE9, 0x00000A17,\n    0x0004003D, 0x00000014, 0x0000578A, 0x00004EBC, 0x00050041, 0x00000288,\n    0x00004EBD, 0x00000CE9, 0x00000A1A, 0x0004003D, 0x0000000B, 0x0000578B,\n    0x00004EBD, 0x00050041, 0x00000288, 0x00004E6E, 0x00000CE9, 0x00000A1D,\n    0x0004003D, 0x0000000B, 0x000019C2, 0x00004E6E, 0x0004003D, 0x00000014,\n    0x00002A0E, 0x00000F48, 0x000500C4, 0x00000014, 0x0000538B, 0x00002A0E,\n    0x00000A34, 0x0007004F, 0x00000011, 0x000042F0, 0x0000538B, 0x0000538B,\n    0x00000000, 0x00000001, 0x0007004F, 0x00000011, 0x0000242F, 0x0000578A,\n    0x0000578A, 0x00000000, 0x00000001, 0x000500AE, 0x0000000F, 0x00004288,\n    0x000042F0, 0x0000242F, 0x0004009A, 0x00000009, 0x00006067, 0x00004288,\n    0x000300F7, 0x000019BA, 0x00000002, 0x000400FA, 0x00006067, 0x000055E8,\n    0x000019BA, 0x000200F8, 0x000055E8, 0x000200F9, 0x00004C7A, 0x000200F8,\n    0x000019BA, 0x0004007C, 0x00000016, 0x00005BB6, 0x0000538B, 0x00050051,\n    0x0000000B, 0x00004916, 0x0000578A, 0x00000001, 0x00050051, 0x0000000C,\n    0x00005BEB, 0x00005BB6, 0x00000000, 0x00050084, 0x0000000C, 0x0000591A,\n    0x00005BEB, 0x00000A11, 0x00050051, 0x0000000C, 0x000018DA, 0x00005BB6,\n    0x00000002, 0x0004007C, 0x0000000C, 0x000038A9, 0x00004916, 0x00050084,\n    0x0000000C, 0x00002C0F, 0x000018DA, 0x000038A9, 0x00050051, 0x0000000C,\n    0x000044BE, 0x00005BB6, 0x00000001, 0x00050080, 0x0000000C, 0x000056D4,\n    0x00002C0F, 0x000044BE, 0x0004007C, 0x0000000C, 0x00005785, 0x000019C2,\n    0x00050084, 0x0000000C, 0x00005FD7, 0x000056D4, 0x00005785, 0x00050080,\n    0x0000000C, 0x00002042, 0x0000591A, 0x00005FD7, 0x0004007C, 0x0000000B,\n    0x00002A92, 0x00002042, 0x00050080, 0x0000000B, 0x00001F01, 0x0000578B,\n    0x00002A92, 0x000500C2, 0x00000011, 0x00004DD1, 0x000042F0, 0x0000074B,\n    0x00050086, 0x00000011, 0x00001E20, 0x00004DD1, 0x00001997, 0x00050084,\n    0x00000011, 0x00004707, 0x00001997, 0x00001E20, 0x00050082, 0x00000011,\n    0x00004761, 0x00004DD1, 0x00004707, 0x000500C4, 0x00000011, 0x00002BE0,\n    0x00001E20, 0x0000074B, 0x00050051, 0x0000000B, 0x000033E4, 0x00004761,\n    0x00000000, 0x00050051, 0x0000000B, 0x00002A78, 0x00001997, 0x00000001,\n    0x00050084, 0x0000000B, 0x00005966, 0x000033E4, 0x00002A78, 0x00050051,\n    0x0000000B, 0x00001B1F, 0x00004761, 0x00000001, 0x00050080, 0x0000000B,\n    0x000028E5, 0x00005966, 0x00001B1F, 0x000500C7, 0x00000011, 0x000049A3,\n    0x000042F0, 0x000007BA, 0x000500C4, 0x0000000B, 0x00002955, 0x000028E5,\n    0x00000A1F, 0x00050051, 0x0000000B, 0x000051B4, 0x000049A3, 0x00000001,\n    0x000500C4, 0x0000000B, 0x00005C2C, 0x000051B4, 0x00000A19, 0x000500C5,\n    0x0000000B, 0x00004D66, 0x00002955, 0x00005C2C, 0x00050051, 0x0000000B,\n    0x000053E4, 0x000049A3, 0x00000000, 0x000500C4, 0x0000000B, 0x00002170,\n    0x000053E4, 0x00000A0D, 0x000500C5, 0x0000000B, 0x000044F0, 0x00004D66,\n    0x00002170, 0x00050051, 0x0000000B, 0x00004DD3, 0x00002BE0, 0x00000000,\n    0x00060052, 0x00000014, 0x00003CC4, 0x00004DD3, 0x0000538B, 0x00000000,\n    0x00050051, 0x0000000B, 0x000059DE, 0x00002BE0, 0x00000001, 0x00060052,\n    0x00000014, 0x000025D0, 0x000059DE, 0x00003CC4, 0x00000001, 0x000300F7,\n    0x00004F78, 0x00000002, 0x000400FA, 0x000048EB, 0x00005BE0, 0x00002DD9,\n    0x000200F8, 0x00005BE0, 0x0004007C, 0x00000016, 0x0000277F, 0x000025D0,\n    0x000500C2, 0x0000000B, 0x00004C14, 0x00005788, 0x00000A1A, 0x000500C2,\n    0x0000000B, 0x0000497A, 0x00005789, 0x00000A17, 0x00050051, 0x0000000C,\n    0x00001A7E, 0x0000277F, 0x00000002, 0x000500C3, 0x0000000C, 0x00002F39,\n    0x00001A7E, 0x00000A11, 0x0004007C, 0x0000000C, 0x00005780, 0x0000497A,\n    0x00050084, 0x0000000C, 0x00001F02, 0x00002F39, 0x00005780, 0x00050051,\n    0x0000000C, 0x00006242, 0x0000277F, 0x00000001, 0x000500C3, 0x0000000C,\n    0x00004A6F, 0x00006242, 0x00000A17, 0x00050080, 0x0000000C, 0x00002B2C,\n    0x00001F02, 0x00004A6F, 0x0004007C, 0x0000000C, 0x00004202, 0x00004C14,\n    0x00050084, 0x0000000C, 0x00003A60, 0x00002B2C, 0x00004202, 0x00050051,\n    0x0000000C, 0x00006243, 0x0000277F, 0x00000000, 0x000500C3, 0x0000000C,\n    0x00004FC7, 0x00006243, 0x00000A1A, 0x00050080, 0x0000000C, 0x000049FC,\n    0x00003A60, 0x00004FC7, 0x000500C4, 0x0000000C, 0x0000225D, 0x000049FC,\n    0x00000A20, 0x000500C7, 0x0000000C, 0x00002CAA, 0x00001A7E, 0x00000A14,\n    0x000500C4, 0x0000000C, 0x00004CAE, 0x00002CAA, 0x00000A1A, 0x000500C3,\n    0x0000000C, 0x0000383E, 0x00006242, 0x00000A0E, 0x000500C7, 0x0000000C,\n    0x00005374, 0x0000383E, 0x00000A14, 0x000500C4, 0x0000000C, 0x000054CA,\n    0x00005374, 0x00000A14, 0x000500C5, 0x0000000C, 0x000042CE, 0x00004CAE,\n    0x000054CA, 0x000500C7, 0x0000000C, 0x000050D5, 0x00006243, 0x00000A20,\n    0x000500C5, 0x0000000C, 0x00003ADD, 0x000042CE, 0x000050D5, 0x000500C5,\n    0x0000000C, 0x000043B6, 0x0000225D, 0x00003ADD, 0x000500C4, 0x0000000C,\n    0x00005E50, 0x000043B6, 0x00000A0D, 0x000500C3, 0x0000000C, 0x000032D7,\n    0x00006242, 0x00000A14, 0x000500C6, 0x0000000C, 0x000026C9, 0x000032D7,\n    0x00002F39, 0x000500C7, 0x0000000C, 0x00004199, 0x000026C9, 0x00000A0E,\n    0x000500C3, 0x0000000C, 0x00002590, 0x00006243, 0x00000A14, 0x000500C7,\n    0x0000000C, 0x0000505E, 0x00002590, 0x00000A14, 0x000500C4, 0x0000000C,\n    0x0000541D, 0x00004199, 0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BA,\n    0x0000505E, 0x0000541D, 0x000500C7, 0x0000000C, 0x00005076, 0x00006242,\n    0x00000A0E, 0x000500C4, 0x0000000C, 0x00005228, 0x00005076, 0x00000A17,\n    0x000500C4, 0x0000000C, 0x00001998, 0x000022BA, 0x00000A1D, 0x000500C5,\n    0x0000000C, 0x000047FE, 0x00005228, 0x00001998, 0x000500C4, 0x0000000C,\n    0x00001C00, 0x00004199, 0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C81,\n    0x000047FE, 0x00001C00, 0x000500C7, 0x0000000C, 0x000050AF, 0x00005E50,\n    0x00000A38, 0x000500C5, 0x0000000C, 0x00003C70, 0x00003C81, 0x000050AF,\n    0x000500C3, 0x0000000C, 0x00003745, 0x00005E50, 0x00000A17, 0x000500C7,\n    0x0000000C, 0x000018B8, 0x00003745, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x0000547E, 0x000018B8, 0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A8,\n    0x00003C70, 0x0000547E, 0x000500C3, 0x0000000C, 0x00003A6E, 0x00005E50,\n    0x00000A1A, 0x000500C7, 0x0000000C, 0x000018B9, 0x00003A6E, 0x00000A20,\n    0x000500C4, 0x0000000C, 0x0000547F, 0x000018B9, 0x00000A23, 0x000500C5,\n    0x0000000C, 0x0000456F, 0x000045A8, 0x0000547F, 0x000500C3, 0x0000000C,\n    0x00003C88, 0x00005E50, 0x00000A23, 0x000500C4, 0x0000000C, 0x00002824,\n    0x00003C88, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B79, 0x0000456F,\n    0x00002824, 0x0004007C, 0x0000000B, 0x000041E5, 0x00003B79, 0x000200F9,\n    0x00004F78, 0x000200F8, 0x00002DD9, 0x0007004F, 0x00000011, 0x00002E84,\n    0x000025D0, 0x000025D0, 0x00000000, 0x00000001, 0x0004007C, 0x00000012,\n    0x00004F7B, 0x00002E84, 0x000500C2, 0x0000000B, 0x00002CA9, 0x00005788,\n    0x00000A1A, 0x00050051, 0x0000000C, 0x00003905, 0x00004F7B, 0x00000001,\n    0x000500C3, 0x0000000C, 0x00002F3A, 0x00003905, 0x00000A1A, 0x0004007C,\n    0x0000000C, 0x00005781, 0x00002CA9, 0x00050084, 0x0000000C, 0x00001F03,\n    0x00002F3A, 0x00005781, 0x00050051, 0x0000000C, 0x00006244, 0x00004F7B,\n    0x00000000, 0x000500C3, 0x0000000C, 0x00004FC8, 0x00006244, 0x00000A1A,\n    0x00050080, 0x0000000C, 0x000049B0, 0x00001F03, 0x00004FC8, 0x000500C4,\n    0x0000000C, 0x0000254A, 0x000049B0, 0x00000A1D, 0x000500C3, 0x0000000C,\n    0x0000603B, 0x00003905, 0x00000A0E, 0x000500C7, 0x0000000C, 0x0000539A,\n    0x0000603B, 0x00000A20, 0x000500C4, 0x0000000C, 0x0000534A, 0x0000539A,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x00004EA5, 0x00006244, 0x00000A20,\n    0x000500C5, 0x0000000C, 0x00002B1A, 0x0000534A, 0x00004EA5, 0x000500C5,\n    0x0000000C, 0x000043B7, 0x0000254A, 0x00002B1A, 0x000500C4, 0x0000000C,\n    0x00005E63, 0x000043B7, 0x00000A0D, 0x000500C3, 0x0000000C, 0x000031DE,\n    0x00003905, 0x00000A17, 0x000500C7, 0x0000000C, 0x00005447, 0x000031DE,\n    0x00000A0E, 0x000500C3, 0x0000000C, 0x000028A6, 0x00006244, 0x00000A14,\n    0x000500C7, 0x0000000C, 0x0000511E, 0x000028A6, 0x00000A14, 0x000500C3,\n    0x0000000C, 0x000028B9, 0x00003905, 0x00000A14, 0x000500C7, 0x0000000C,\n    0x0000505F, 0x000028B9, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000541E,\n    0x0000505F, 0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BB, 0x0000511E,\n    0x0000541E, 0x000500C7, 0x0000000C, 0x00005077, 0x00003905, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x00005229, 0x00005077, 0x00000A17, 0x000500C4,\n    0x0000000C, 0x00001999, 0x000022BB, 0x00000A1D, 0x000500C5, 0x0000000C,\n    0x000047FF, 0x00005229, 0x00001999, 0x000500C4, 0x0000000C, 0x00001C01,\n    0x00005447, 0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C82, 0x000047FF,\n    0x00001C01, 0x000500C7, 0x0000000C, 0x000050B0, 0x00005E63, 0x00000A38,\n    0x000500C5, 0x0000000C, 0x00003C71, 0x00003C82, 0x000050B0, 0x000500C3,\n    0x0000000C, 0x00003746, 0x00005E63, 0x00000A17, 0x000500C7, 0x0000000C,\n    0x000018BA, 0x00003746, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005480,\n    0x000018BA, 0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A9, 0x00003C71,\n    0x00005480, 0x000500C3, 0x0000000C, 0x00003A6F, 0x00005E63, 0x00000A1A,\n    0x000500C7, 0x0000000C, 0x000018BB, 0x00003A6F, 0x00000A20, 0x000500C4,\n    0x0000000C, 0x00005481, 0x000018BB, 0x00000A23, 0x000500C5, 0x0000000C,\n    0x00004570, 0x000045A9, 0x00005481, 0x000500C3, 0x0000000C, 0x00003C89,\n    0x00005E63, 0x00000A23, 0x000500C4, 0x0000000C, 0x00002825, 0x00003C89,\n    0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B7A, 0x00004570, 0x00002825,\n    0x0004007C, 0x0000000B, 0x000041E6, 0x00003B7A, 0x000200F9, 0x00004F78,\n    0x000200F8, 0x00004F78, 0x000700F5, 0x0000000B, 0x00004799, 0x000041E5,\n    0x00005BE0, 0x000041E6, 0x00002DD9, 0x00050051, 0x0000000B, 0x00003B60,\n    0x00001997, 0x00000000, 0x00050084, 0x0000000B, 0x00004451, 0x00003B60,\n    0x00002A78, 0x00050084, 0x0000000B, 0x00001C91, 0x00004799, 0x00004451,\n    0x00050080, 0x0000000B, 0x0000226F, 0x00001C91, 0x000044F0, 0x00050080,\n    0x0000000B, 0x000053DE, 0x0000226F, 0x00005EAC, 0x000500C2, 0x0000000B,\n    0x00003948, 0x000053DE, 0x00000A17, 0x00060041, 0x00000294, 0x00004FAF,\n    0x0000107A, 0x00000A0B, 0x00003948, 0x0004003D, 0x00000017, 0x00002261,\n    0x00004FAF, 0x000500AA, 0x00000009, 0x00005272, 0x0000619E, 0x00000A0D,\n    0x000300F7, 0x0000362B, 0x00000000, 0x000400FA, 0x00005272, 0x00002957,\n    0x0000362B, 0x000200F8, 0x00002957, 0x000500C7, 0x00000017, 0x0000475F,\n    0x00002261, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D1, 0x0000475F,\n    0x0000013D, 0x000500C7, 0x00000017, 0x000050AC, 0x00002261, 0x0000072E,\n    0x000500C2, 0x00000017, 0x0000448D, 0x000050AC, 0x0000013D, 0x000500C5,\n    0x00000017, 0x00003FF8, 0x000024D1, 0x0000448D, 0x000200F9, 0x0000362B,\n    0x000200F8, 0x0000362B, 0x000700F5, 0x00000017, 0x00004AB4, 0x00002261,\n    0x00004F78, 0x00003FF8, 0x00002957, 0x000500C2, 0x0000000B, 0x00001BB7,\n    0x00001F01, 0x00000A17, 0x000500C7, 0x00000017, 0x000030B2, 0x00004AB4,\n    0x000001A6, 0x000500C7, 0x00000017, 0x00004943, 0x00004AB4, 0x0000001B,\n    0x000500C4, 0x00000017, 0x00006164, 0x00004943, 0x000001A9, 0x000500C5,\n    0x00000017, 0x00004295, 0x000030B2, 0x00006164, 0x000500C7, 0x00000017,\n    0x000052DC, 0x00004AB4, 0x00000305, 0x000500C2, 0x00000017, 0x000046A8,\n    0x000052DC, 0x000001A9, 0x000500C5, 0x00000017, 0x00001984, 0x00004295,\n    0x000046A8, 0x00060041, 0x00000294, 0x00004F1E, 0x0000140E, 0x00000A0B,\n    0x00001BB7, 0x0003003E, 0x00004F1E, 0x00001984, 0x00050080, 0x0000000B,\n    0x00005679, 0x00001F01, 0x00000A3A, 0x00050080, 0x0000000B, 0x000027E6,\n    0x000053DE, 0x00000A3A, 0x000500C2, 0x0000000B, 0x00003949, 0x000027E6,\n    0x00000A17, 0x00060041, 0x00000294, 0x00005566, 0x0000107A, 0x00000A0B,\n    0x00003949, 0x0004003D, 0x00000017, 0x00003910, 0x00005566, 0x000300F7,\n    0x0000362C, 0x00000000, 0x000400FA, 0x00005272, 0x00002958, 0x0000362C,\n    0x000200F8, 0x00002958, 0x000500C7, 0x00000017, 0x00004760, 0x00003910,\n    0x000009CE, 0x000500C4, 0x00000017, 0x000024D2, 0x00004760, 0x0000013D,\n    0x000500C7, 0x00000017, 0x000050AD, 0x00003910, 0x0000072E, 0x000500C2,\n    0x00000017, 0x0000448E, 0x000050AD, 0x0000013D, 0x000500C5, 0x00000017,\n    0x00003FF9, 0x000024D2, 0x0000448E, 0x000200F9, 0x0000362C, 0x000200F8,\n    0x0000362C, 0x000700F5, 0x00000017, 0x00004AB5, 0x00003910, 0x0000362B,\n    0x00003FF9, 0x00002958, 0x000500C2, 0x0000000B, 0x00001BB8, 0x00005679,\n    0x00000A17, 0x000500C7, 0x00000017, 0x000030B3, 0x00004AB5, 0x000001A6,\n    0x000500C7, 0x00000017, 0x00004944, 0x00004AB5, 0x0000001B, 0x000500C4,\n    0x00000017, 0x00006165, 0x00004944, 0x000001A9, 0x000500C5, 0x00000017,\n    0x00004296, 0x000030B3, 0x00006165, 0x000500C7, 0x00000017, 0x000052DD,\n    0x00004AB5, 0x00000305, 0x000500C2, 0x00000017, 0x000046A9, 0x000052DD,\n    0x000001A9, 0x000500C5, 0x00000017, 0x00001985, 0x00004296, 0x000046A9,\n    0x00060041, 0x00000294, 0x00005819, 0x0000140E, 0x00000A0B, 0x00001BB8,\n    0x0003003E, 0x00005819, 0x00001985, 0x000200F9, 0x00004C7A, 0x000200F8,\n    0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_r5g5b6_b5g6r5_swizzle_rbga_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25155\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v4uint = OpTypeVector %uint 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v2uint = OpTypeVector %uint 2\n     %v3uint = OpTypeVector %uint 3\n%uint_2031647 = OpConstant %uint 2031647\n    %uint_11 = OpConstant %uint 11\n%uint_4292935648 = OpConstant %uint 4292935648\n     %uint_5 = OpConstant %uint 5\n     %uint_1 = OpConstant %uint 1\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n     %uint_0 = OpConstant %uint 0\n      %int_3 = OpConstant %int 3\n     %uint_2 = OpConstant %uint 2\n      %int_2 = OpConstant %int 2\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n     %uint_3 = OpConstant %uint 3\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n     %uint_4 = OpConstant %uint 4\n       %2612 = OpConstantComposite %v3uint %uint_4 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n    %uint_16 = OpConstant %uint 16\n    %uint_32 = OpConstant %uint 32\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n         %27 = OpConstantComposite %v4uint %uint_2031647 %uint_2031647 %uint_2031647 %uint_2031647\n        %479 = OpConstantComposite %v4uint %uint_11 %uint_11 %uint_11 %uint_11\n       %1310 = OpConstantComposite %v4uint %uint_4292935648 %uint_4292935648 %uint_4292935648 %uint_4292935648\n        %155 = OpConstantComposite %v4uint %uint_5 %uint_5 %uint_5 %uint_5\n    %uint_64 = OpConstant %uint 64\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24540 = OpBitwiseAnd %uint %13606 %uint_1\n      %17270 = OpINotEqual %bool %24540 %uint_0\n      %12328 = OpBitwiseAnd %uint %13606 %uint_2\n      %17284 = OpINotEqual %bool %12328 %uint_0\n       %7856 = OpShiftRightLogical %uint %13606 %uint_2\n      %25058 = OpBitwiseAnd %uint %7856 %uint_3\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2612\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %6586 DontFlatten\n               OpBranchConditional %24679 %21992 %6586\n      %21992 = OpLabel\n               OpBranch %19578\n       %6586 = OpLabel\n      %23478 = OpBitcast %v3int %21387\n      %18710 = OpCompositeExtract %uint %22410 1\n      %23531 = OpCompositeExtract %int %23478 0\n      %22810 = OpIMul %int %23531 %int_2\n       %6362 = OpCompositeExtract %int %23478 2\n      %14505 = OpBitcast %int %18710\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %23478 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %6594\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %22810 %24535\n      %10404 = OpBitcast %uint %8258\n      %14582 = OpIAdd %uint %22411 %10404\n      %12308 = OpLogicalNot %bool %17270\n               OpSelectionMerge %19040 DontFlatten\n               OpBranchConditional %12308 %9741 %17007\n       %9741 = OpLabel\n      %17463 = OpCompositeExtract %uint %21387 0\n      %11246 = OpCompositeExtract %uint %21387 1\n      %18801 = OpCompositeExtract %uint %21387 2\n      %14831 = OpIMul %uint %22409 %18801\n      %20322 = OpIAdd %uint %11246 %14831\n      %21676 = OpIMul %uint %22408 %20322\n      %20398 = OpIAdd %uint %17463 %21676\n      %11367 = OpShiftLeftLogical %uint %20398 %uint_1\n               OpBranch %19040\n      %17007 = OpLabel\n               OpSelectionMerge %23536 DontFlatten\n               OpBranchConditional %17284 %11410 %24353\n      %11410 = OpLabel\n      %21364 = OpShiftRightLogical %uint %22408 %int_5\n      %13804 = OpShiftRightLogical %uint %22409 %int_4\n      %13237 = OpShiftRightArithmetic %int %6362 %int_2\n      %22374 = OpBitcast %int %13804\n      %25085 = OpIMul %int %13237 %22374\n      %11618 = OpShiftRightArithmetic %int %17598 %int_4\n      %16670 = OpIAdd %int %25085 %11618\n      %19064 = OpBitcast %int %21364\n      %13020 = OpIMul %int %16670 %19064\n      %12986 = OpShiftRightArithmetic %int %23531 %int_5\n      %24558 = OpIAdd %int %13020 %12986\n       %8797 = OpShiftLeftLogical %int %24558 %int_7\n      %11434 = OpBitwiseAnd %int %6362 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %17598 %int_1\n      %21365 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21365 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %23531 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17334 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17334 %uint_1\n      %13015 = OpShiftRightArithmetic %int %17598 %int_3\n       %9929 = OpBitwiseXor %int %13015 %13237\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %23531 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %17598 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6551\n       %7168 = OpShiftLeftLogical %int %16793 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24144 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24144 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24144 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24144 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %23536\n      %24353 = OpLabel\n      %23000 = OpBitcast %v2int %17136\n      %22120 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %23000 1\n      %12089 = OpShiftRightArithmetic %int %14597 %int_5\n      %22400 = OpBitcast %int %22120\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %23000 0\n      %20423 = OpShiftRightArithmetic %int %25154 %int_5\n      %18864 = OpIAdd %int %7938 %20423\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25154 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17335 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17335 %uint_1\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25154 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6552\n       %7169 = OpShiftLeftLogical %int %21575 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24163 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24163 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24163 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %23536\n      %23536 = OpLabel\n      %10540 = OpPhi %uint %16869 %11410 %16870 %24353\n               OpBranch %19040\n      %19040 = OpLabel\n      %11376 = OpPhi %uint %11367 %9741 %10540 %23536\n      %18621 = OpIAdd %uint %11376 %24236\n      %15698 = OpShiftRightLogical %uint %18621 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15698\n       %8801 = OpLoad %v4uint %20399\n      %21106 = OpIEqual %bool %25058 %uint_1\n               OpSelectionMerge %13867 None\n               OpBranchConditional %21106 %10583 %13867\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %8801 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %8801 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13867\n      %13867 = OpLabel\n      %19124 = OpPhi %v4uint %8801 %19040 %16376 %10583\n       %7038 = OpShiftRightLogical %uint %14582 %int_4\n      %13042 = OpBitwiseAnd %v4uint %19124 %27\n      %23687 = OpShiftLeftLogical %v4uint %13042 %479\n      %20653 = OpBitwiseAnd %v4uint %19124 %1310\n      %14053 = OpShiftRightLogical %v4uint %20653 %155\n       %6532 = OpBitwiseOr %v4uint %23687 %14053\n      %20254 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %7038\n               OpStore %20254 %6532\n      %21685 = OpIAdd %uint %14582 %uint_16\n               OpSelectionMerge %24688 DontFlatten\n               OpBranchConditional %17270 %21993 %7205\n      %21993 = OpLabel\n               OpBranch %24688\n       %7205 = OpLabel\n               OpBranch %24688\n      %24688 = OpLabel\n      %11377 = OpPhi %uint %uint_64 %21993 %uint_16 %7205\n      %18622 = OpIAdd %uint %18621 %11377\n      %15699 = OpShiftRightLogical %uint %18622 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15699\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %13868 None\n               OpBranchConditional %21106 %10584 %13868\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20654 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20654 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %13868\n      %13868 = OpLabel\n      %19125 = OpPhi %v4uint %14608 %24688 %16377 %10584\n       %7039 = OpShiftRightLogical %uint %21685 %int_4\n      %13043 = OpBitwiseAnd %v4uint %19125 %27\n      %23688 = OpShiftLeftLogical %v4uint %13043 %479\n      %20657 = OpBitwiseAnd %v4uint %19125 %1310\n      %14054 = OpShiftRightLogical %v4uint %20657 %155\n       %6533 = OpBitwiseOr %v4uint %23688 %14054\n      %22553 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %7039\n               OpStore %22553 %6533\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_r5g5b6_b5g6r5_swizzle_rbga_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006243, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000017, 0x0000000B, 0x00000004, 0x00040015, 0x0000000C,\n    0x00000020, 0x00000001, 0x00040017, 0x00000012, 0x0000000C, 0x00000002,\n    0x00040017, 0x00000016, 0x0000000C, 0x00000003, 0x00020014, 0x00000009,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x0004002B, 0x0000000B, 0x000000EC, 0x001F001F,\n    0x0004002B, 0x0000000B, 0x00000A2B, 0x0000000B, 0x0004002B, 0x0000000B,\n    0x000001F4, 0xFFE0FFE0, 0x0004002B, 0x0000000B, 0x00000A19, 0x00000005,\n    0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B,\n    0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B, 0x00000A22, 0x00000008,\n    0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00, 0x0004002B, 0x0000000C,\n    0x00000A17, 0x00000004, 0x0004002B, 0x0000000C, 0x00000A1D, 0x00000006,\n    0x0004002B, 0x0000000C, 0x00000A2C, 0x0000000B, 0x0004002B, 0x0000000C,\n    0x00000A38, 0x0000000F, 0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001,\n    0x0004002B, 0x0000000C, 0x00000A1A, 0x00000005, 0x0004002B, 0x0000000C,\n    0x00000A20, 0x00000007, 0x0004002B, 0x0000000C, 0x00000A23, 0x00000008,\n    0x0004002B, 0x0000000C, 0x00000A2F, 0x0000000C, 0x0004002B, 0x0000000B,\n    0x00000A0A, 0x00000000, 0x0004002B, 0x0000000C, 0x00000A14, 0x00000003,\n    0x0004002B, 0x0000000B, 0x00000A10, 0x00000002, 0x0004002B, 0x0000000C,\n    0x00000A11, 0x00000002, 0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000,\n    0x000A001E, 0x00000489, 0x0000000B, 0x0000000B, 0x0000000B, 0x0000000B,\n    0x00000014, 0x0000000B, 0x0000000B, 0x0000000B, 0x00040020, 0x00000706,\n    0x00000009, 0x00000489, 0x0004003B, 0x00000706, 0x00000CE9, 0x00000009,\n    0x00040020, 0x00000288, 0x00000009, 0x0000000B, 0x0004002B, 0x0000000B,\n    0x00000A13, 0x00000003, 0x00040020, 0x00000291, 0x00000009, 0x00000014,\n    0x00040020, 0x00000292, 0x00000001, 0x00000014, 0x0004003B, 0x00000292,\n    0x00000F48, 0x00000001, 0x0004002B, 0x0000000B, 0x00000A16, 0x00000004,\n    0x0006002C, 0x00000014, 0x00000A34, 0x00000A16, 0x00000A0A, 0x00000A0A,\n    0x00040017, 0x0000000F, 0x00000009, 0x00000002, 0x0003001D, 0x000007DC,\n    0x00000017, 0x0003001E, 0x000007B4, 0x000007DC, 0x00040020, 0x00000A31,\n    0x00000002, 0x000007B4, 0x0004003B, 0x00000A31, 0x0000107A, 0x00000002,\n    0x00040020, 0x00000294, 0x00000002, 0x00000017, 0x0003001D, 0x000007DD,\n    0x00000017, 0x0003001E, 0x000007B5, 0x000007DD, 0x00040020, 0x00000A32,\n    0x00000002, 0x000007B5, 0x0004003B, 0x00000A32, 0x0000140E, 0x00000002,\n    0x0004002B, 0x0000000B, 0x00000A3A, 0x00000010, 0x0004002B, 0x0000000B,\n    0x00000A6A, 0x00000020, 0x0006002C, 0x00000014, 0x00000BC3, 0x00000A16,\n    0x00000A6A, 0x00000A0D, 0x0007002C, 0x00000017, 0x000009CE, 0x000008A6,\n    0x000008A6, 0x000008A6, 0x000008A6, 0x0007002C, 0x00000017, 0x0000013D,\n    0x00000A22, 0x00000A22, 0x00000A22, 0x00000A22, 0x0007002C, 0x00000017,\n    0x0000072E, 0x000005FD, 0x000005FD, 0x000005FD, 0x000005FD, 0x0007002C,\n    0x00000017, 0x0000001B, 0x000000EC, 0x000000EC, 0x000000EC, 0x000000EC,\n    0x0007002C, 0x00000017, 0x000001DF, 0x00000A2B, 0x00000A2B, 0x00000A2B,\n    0x00000A2B, 0x0007002C, 0x00000017, 0x0000051E, 0x000001F4, 0x000001F4,\n    0x000001F4, 0x000001F4, 0x0007002C, 0x00000017, 0x0000009B, 0x00000A19,\n    0x00000A19, 0x00000A19, 0x00000A19, 0x0004002B, 0x0000000B, 0x00000ACA,\n    0x00000040, 0x00050036, 0x00000008, 0x0000161F, 0x00000000, 0x00000502,\n    0x000200F8, 0x00003B06, 0x000300F7, 0x00004C7A, 0x00000000, 0x000300FB,\n    0x00000A0A, 0x00002E68, 0x000200F8, 0x00002E68, 0x00050041, 0x00000288,\n    0x000060D7, 0x00000CE9, 0x00000A0B, 0x0004003D, 0x0000000B, 0x00003526,\n    0x000060D7, 0x000500C7, 0x0000000B, 0x00005FDC, 0x00003526, 0x00000A0D,\n    0x000500AB, 0x00000009, 0x00004376, 0x00005FDC, 0x00000A0A, 0x000500C7,\n    0x0000000B, 0x00003028, 0x00003526, 0x00000A10, 0x000500AB, 0x00000009,\n    0x00004384, 0x00003028, 0x00000A0A, 0x000500C2, 0x0000000B, 0x00001EB0,\n    0x00003526, 0x00000A10, 0x000500C7, 0x0000000B, 0x000061E2, 0x00001EB0,\n    0x00000A13, 0x00050041, 0x00000288, 0x0000492C, 0x00000CE9, 0x00000A0E,\n    0x0004003D, 0x0000000B, 0x00005EAC, 0x0000492C, 0x00050041, 0x00000288,\n    0x00004EBA, 0x00000CE9, 0x00000A11, 0x0004003D, 0x0000000B, 0x00005788,\n    0x00004EBA, 0x00050041, 0x00000288, 0x00004EBB, 0x00000CE9, 0x00000A14,\n    0x0004003D, 0x0000000B, 0x00005789, 0x00004EBB, 0x00050041, 0x00000291,\n    0x00004EBC, 0x00000CE9, 0x00000A17, 0x0004003D, 0x00000014, 0x0000578A,\n    0x00004EBC, 0x00050041, 0x00000288, 0x00004EBD, 0x00000CE9, 0x00000A1A,\n    0x0004003D, 0x0000000B, 0x0000578B, 0x00004EBD, 0x00050041, 0x00000288,\n    0x00004E6E, 0x00000CE9, 0x00000A1D, 0x0004003D, 0x0000000B, 0x000019C2,\n    0x00004E6E, 0x0004003D, 0x00000014, 0x00002A0E, 0x00000F48, 0x000500C4,\n    0x00000014, 0x0000538B, 0x00002A0E, 0x00000A34, 0x0007004F, 0x00000011,\n    0x000042F0, 0x0000538B, 0x0000538B, 0x00000000, 0x00000001, 0x0007004F,\n    0x00000011, 0x0000242F, 0x0000578A, 0x0000578A, 0x00000000, 0x00000001,\n    0x000500AE, 0x0000000F, 0x00004288, 0x000042F0, 0x0000242F, 0x0004009A,\n    0x00000009, 0x00006067, 0x00004288, 0x000300F7, 0x000019BA, 0x00000002,\n    0x000400FA, 0x00006067, 0x000055E8, 0x000019BA, 0x000200F8, 0x000055E8,\n    0x000200F9, 0x00004C7A, 0x000200F8, 0x000019BA, 0x0004007C, 0x00000016,\n    0x00005BB6, 0x0000538B, 0x00050051, 0x0000000B, 0x00004916, 0x0000578A,\n    0x00000001, 0x00050051, 0x0000000C, 0x00005BEB, 0x00005BB6, 0x00000000,\n    0x00050084, 0x0000000C, 0x0000591A, 0x00005BEB, 0x00000A11, 0x00050051,\n    0x0000000C, 0x000018DA, 0x00005BB6, 0x00000002, 0x0004007C, 0x0000000C,\n    0x000038A9, 0x00004916, 0x00050084, 0x0000000C, 0x00002C0F, 0x000018DA,\n    0x000038A9, 0x00050051, 0x0000000C, 0x000044BE, 0x00005BB6, 0x00000001,\n    0x00050080, 0x0000000C, 0x000056D4, 0x00002C0F, 0x000044BE, 0x0004007C,\n    0x0000000C, 0x00005785, 0x000019C2, 0x00050084, 0x0000000C, 0x00005FD7,\n    0x000056D4, 0x00005785, 0x00050080, 0x0000000C, 0x00002042, 0x0000591A,\n    0x00005FD7, 0x0004007C, 0x0000000B, 0x000028A4, 0x00002042, 0x00050080,\n    0x0000000B, 0x000038F6, 0x0000578B, 0x000028A4, 0x000400A8, 0x00000009,\n    0x00003014, 0x00004376, 0x000300F7, 0x00004A60, 0x00000002, 0x000400FA,\n    0x00003014, 0x0000260D, 0x0000426F, 0x000200F8, 0x0000260D, 0x00050051,\n    0x0000000B, 0x00004437, 0x0000538B, 0x00000000, 0x00050051, 0x0000000B,\n    0x00002BEE, 0x0000538B, 0x00000001, 0x00050051, 0x0000000B, 0x00004971,\n    0x0000538B, 0x00000002, 0x00050084, 0x0000000B, 0x000039EF, 0x00005789,\n    0x00004971, 0x00050080, 0x0000000B, 0x00004F62, 0x00002BEE, 0x000039EF,\n    0x00050084, 0x0000000B, 0x000054AC, 0x00005788, 0x00004F62, 0x00050080,\n    0x0000000B, 0x00004FAE, 0x00004437, 0x000054AC, 0x000500C4, 0x0000000B,\n    0x00002C67, 0x00004FAE, 0x00000A0D, 0x000200F9, 0x00004A60, 0x000200F8,\n    0x0000426F, 0x000300F7, 0x00005BF0, 0x00000002, 0x000400FA, 0x00004384,\n    0x00002C92, 0x00005F21, 0x000200F8, 0x00002C92, 0x000500C2, 0x0000000B,\n    0x00005374, 0x00005788, 0x00000A1A, 0x000500C2, 0x0000000B, 0x000035EC,\n    0x00005789, 0x00000A17, 0x000500C3, 0x0000000C, 0x000033B5, 0x000018DA,\n    0x00000A11, 0x0004007C, 0x0000000C, 0x00005766, 0x000035EC, 0x00050084,\n    0x0000000C, 0x000061FD, 0x000033B5, 0x00005766, 0x000500C3, 0x0000000C,\n    0x00002D62, 0x000044BE, 0x00000A17, 0x00050080, 0x0000000C, 0x0000411E,\n    0x000061FD, 0x00002D62, 0x0004007C, 0x0000000C, 0x00004A78, 0x00005374,\n    0x00050084, 0x0000000C, 0x000032DC, 0x0000411E, 0x00004A78, 0x000500C3,\n    0x0000000C, 0x000032BA, 0x00005BEB, 0x00000A1A, 0x00050080, 0x0000000C,\n    0x00005FEE, 0x000032DC, 0x000032BA, 0x000500C4, 0x0000000C, 0x0000225D,\n    0x00005FEE, 0x00000A20, 0x000500C7, 0x0000000C, 0x00002CAA, 0x000018DA,\n    0x00000A14, 0x000500C4, 0x0000000C, 0x00004CAE, 0x00002CAA, 0x00000A1A,\n    0x000500C3, 0x0000000C, 0x0000383E, 0x000044BE, 0x00000A0E, 0x000500C7,\n    0x0000000C, 0x00005375, 0x0000383E, 0x00000A14, 0x000500C4, 0x0000000C,\n    0x000054CA, 0x00005375, 0x00000A14, 0x000500C5, 0x0000000C, 0x000042CE,\n    0x00004CAE, 0x000054CA, 0x000500C7, 0x0000000C, 0x000050D5, 0x00005BEB,\n    0x00000A20, 0x000500C5, 0x0000000C, 0x00003ADD, 0x000042CE, 0x000050D5,\n    0x000500C5, 0x0000000C, 0x000043B6, 0x0000225D, 0x00003ADD, 0x000500C4,\n    0x0000000C, 0x00005E50, 0x000043B6, 0x00000A0D, 0x000500C3, 0x0000000C,\n    0x000032D7, 0x000044BE, 0x00000A14, 0x000500C6, 0x0000000C, 0x000026C9,\n    0x000032D7, 0x000033B5, 0x000500C7, 0x0000000C, 0x00004199, 0x000026C9,\n    0x00000A0E, 0x000500C3, 0x0000000C, 0x00002590, 0x00005BEB, 0x00000A14,\n    0x000500C7, 0x0000000C, 0x0000505E, 0x00002590, 0x00000A14, 0x000500C4,\n    0x0000000C, 0x0000541D, 0x00004199, 0x00000A0E, 0x000500C6, 0x0000000C,\n    0x000022BA, 0x0000505E, 0x0000541D, 0x000500C7, 0x0000000C, 0x00005076,\n    0x000044BE, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005228, 0x00005076,\n    0x00000A17, 0x000500C4, 0x0000000C, 0x00001997, 0x000022BA, 0x00000A1D,\n    0x000500C5, 0x0000000C, 0x000047FE, 0x00005228, 0x00001997, 0x000500C4,\n    0x0000000C, 0x00001C00, 0x00004199, 0x00000A2C, 0x000500C5, 0x0000000C,\n    0x00003C81, 0x000047FE, 0x00001C00, 0x000500C7, 0x0000000C, 0x000050AF,\n    0x00005E50, 0x00000A38, 0x000500C5, 0x0000000C, 0x00003C70, 0x00003C81,\n    0x000050AF, 0x000500C3, 0x0000000C, 0x00003745, 0x00005E50, 0x00000A17,\n    0x000500C7, 0x0000000C, 0x000018B8, 0x00003745, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x0000547E, 0x000018B8, 0x00000A1A, 0x000500C5, 0x0000000C,\n    0x000045A8, 0x00003C70, 0x0000547E, 0x000500C3, 0x0000000C, 0x00003A6E,\n    0x00005E50, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018B9, 0x00003A6E,\n    0x00000A20, 0x000500C4, 0x0000000C, 0x0000547F, 0x000018B9, 0x00000A23,\n    0x000500C5, 0x0000000C, 0x0000456F, 0x000045A8, 0x0000547F, 0x000500C3,\n    0x0000000C, 0x00003C88, 0x00005E50, 0x00000A23, 0x000500C4, 0x0000000C,\n    0x00002824, 0x00003C88, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B79,\n    0x0000456F, 0x00002824, 0x0004007C, 0x0000000B, 0x000041E5, 0x00003B79,\n    0x000200F9, 0x00005BF0, 0x000200F8, 0x00005F21, 0x0004007C, 0x00000012,\n    0x000059D8, 0x000042F0, 0x000500C2, 0x0000000B, 0x00005668, 0x00005788,\n    0x00000A1A, 0x00050051, 0x0000000C, 0x00003905, 0x000059D8, 0x00000001,\n    0x000500C3, 0x0000000C, 0x00002F39, 0x00003905, 0x00000A1A, 0x0004007C,\n    0x0000000C, 0x00005780, 0x00005668, 0x00050084, 0x0000000C, 0x00001F02,\n    0x00002F39, 0x00005780, 0x00050051, 0x0000000C, 0x00006242, 0x000059D8,\n    0x00000000, 0x000500C3, 0x0000000C, 0x00004FC7, 0x00006242, 0x00000A1A,\n    0x00050080, 0x0000000C, 0x000049B0, 0x00001F02, 0x00004FC7, 0x000500C4,\n    0x0000000C, 0x0000254A, 0x000049B0, 0x00000A1D, 0x000500C3, 0x0000000C,\n    0x0000603B, 0x00003905, 0x00000A0E, 0x000500C7, 0x0000000C, 0x0000539A,\n    0x0000603B, 0x00000A20, 0x000500C4, 0x0000000C, 0x0000534A, 0x0000539A,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x00004EA5, 0x00006242, 0x00000A20,\n    0x000500C5, 0x0000000C, 0x00002B1A, 0x0000534A, 0x00004EA5, 0x000500C5,\n    0x0000000C, 0x000043B7, 0x0000254A, 0x00002B1A, 0x000500C4, 0x0000000C,\n    0x00005E63, 0x000043B7, 0x00000A0D, 0x000500C3, 0x0000000C, 0x000031DE,\n    0x00003905, 0x00000A17, 0x000500C7, 0x0000000C, 0x00005447, 0x000031DE,\n    0x00000A0E, 0x000500C3, 0x0000000C, 0x000028A6, 0x00006242, 0x00000A14,\n    0x000500C7, 0x0000000C, 0x0000511E, 0x000028A6, 0x00000A14, 0x000500C3,\n    0x0000000C, 0x000028B9, 0x00003905, 0x00000A14, 0x000500C7, 0x0000000C,\n    0x0000505F, 0x000028B9, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000541E,\n    0x0000505F, 0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BB, 0x0000511E,\n    0x0000541E, 0x000500C7, 0x0000000C, 0x00005077, 0x00003905, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x00005229, 0x00005077, 0x00000A17, 0x000500C4,\n    0x0000000C, 0x00001998, 0x000022BB, 0x00000A1D, 0x000500C5, 0x0000000C,\n    0x000047FF, 0x00005229, 0x00001998, 0x000500C4, 0x0000000C, 0x00001C01,\n    0x00005447, 0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C82, 0x000047FF,\n    0x00001C01, 0x000500C7, 0x0000000C, 0x000050B0, 0x00005E63, 0x00000A38,\n    0x000500C5, 0x0000000C, 0x00003C71, 0x00003C82, 0x000050B0, 0x000500C3,\n    0x0000000C, 0x00003746, 0x00005E63, 0x00000A17, 0x000500C7, 0x0000000C,\n    0x000018BA, 0x00003746, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005480,\n    0x000018BA, 0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A9, 0x00003C71,\n    0x00005480, 0x000500C3, 0x0000000C, 0x00003A6F, 0x00005E63, 0x00000A1A,\n    0x000500C7, 0x0000000C, 0x000018BB, 0x00003A6F, 0x00000A20, 0x000500C4,\n    0x0000000C, 0x00005481, 0x000018BB, 0x00000A23, 0x000500C5, 0x0000000C,\n    0x00004570, 0x000045A9, 0x00005481, 0x000500C3, 0x0000000C, 0x00003C89,\n    0x00005E63, 0x00000A23, 0x000500C4, 0x0000000C, 0x00002825, 0x00003C89,\n    0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B7A, 0x00004570, 0x00002825,\n    0x0004007C, 0x0000000B, 0x000041E6, 0x00003B7A, 0x000200F9, 0x00005BF0,\n    0x000200F8, 0x00005BF0, 0x000700F5, 0x0000000B, 0x0000292C, 0x000041E5,\n    0x00002C92, 0x000041E6, 0x00005F21, 0x000200F9, 0x00004A60, 0x000200F8,\n    0x00004A60, 0x000700F5, 0x0000000B, 0x00002C70, 0x00002C67, 0x0000260D,\n    0x0000292C, 0x00005BF0, 0x00050080, 0x0000000B, 0x000048BD, 0x00002C70,\n    0x00005EAC, 0x000500C2, 0x0000000B, 0x00003D52, 0x000048BD, 0x00000A17,\n    0x00060041, 0x00000294, 0x00004FAF, 0x0000107A, 0x00000A0B, 0x00003D52,\n    0x0004003D, 0x00000017, 0x00002261, 0x00004FAF, 0x000500AA, 0x00000009,\n    0x00005272, 0x000061E2, 0x00000A0D, 0x000300F7, 0x0000362B, 0x00000000,\n    0x000400FA, 0x00005272, 0x00002957, 0x0000362B, 0x000200F8, 0x00002957,\n    0x000500C7, 0x00000017, 0x0000475F, 0x00002261, 0x000009CE, 0x000500C4,\n    0x00000017, 0x000024D1, 0x0000475F, 0x0000013D, 0x000500C7, 0x00000017,\n    0x000050AC, 0x00002261, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448D,\n    0x000050AC, 0x0000013D, 0x000500C5, 0x00000017, 0x00003FF8, 0x000024D1,\n    0x0000448D, 0x000200F9, 0x0000362B, 0x000200F8, 0x0000362B, 0x000700F5,\n    0x00000017, 0x00004AB4, 0x00002261, 0x00004A60, 0x00003FF8, 0x00002957,\n    0x000500C2, 0x0000000B, 0x00001B7E, 0x000038F6, 0x00000A17, 0x000500C7,\n    0x00000017, 0x000032F2, 0x00004AB4, 0x0000001B, 0x000500C4, 0x00000017,\n    0x00005C87, 0x000032F2, 0x000001DF, 0x000500C7, 0x00000017, 0x000050AD,\n    0x00004AB4, 0x0000051E, 0x000500C2, 0x00000017, 0x000036E5, 0x000050AD,\n    0x0000009B, 0x000500C5, 0x00000017, 0x00001984, 0x00005C87, 0x000036E5,\n    0x00060041, 0x00000294, 0x00004F1E, 0x0000140E, 0x00000A0B, 0x00001B7E,\n    0x0003003E, 0x00004F1E, 0x00001984, 0x00050080, 0x0000000B, 0x000054B5,\n    0x000038F6, 0x00000A3A, 0x000300F7, 0x00006070, 0x00000002, 0x000400FA,\n    0x00004376, 0x000055E9, 0x00001C25, 0x000200F8, 0x000055E9, 0x000200F9,\n    0x00006070, 0x000200F8, 0x00001C25, 0x000200F9, 0x00006070, 0x000200F8,\n    0x00006070, 0x000700F5, 0x0000000B, 0x00002C71, 0x00000ACA, 0x000055E9,\n    0x00000A3A, 0x00001C25, 0x00050080, 0x0000000B, 0x000048BE, 0x000048BD,\n    0x00002C71, 0x000500C2, 0x0000000B, 0x00003D53, 0x000048BE, 0x00000A17,\n    0x00060041, 0x00000294, 0x00005566, 0x0000107A, 0x00000A0B, 0x00003D53,\n    0x0004003D, 0x00000017, 0x00003910, 0x00005566, 0x000300F7, 0x0000362C,\n    0x00000000, 0x000400FA, 0x00005272, 0x00002958, 0x0000362C, 0x000200F8,\n    0x00002958, 0x000500C7, 0x00000017, 0x00004760, 0x00003910, 0x000009CE,\n    0x000500C4, 0x00000017, 0x000024D2, 0x00004760, 0x0000013D, 0x000500C7,\n    0x00000017, 0x000050AE, 0x00003910, 0x0000072E, 0x000500C2, 0x00000017,\n    0x0000448E, 0x000050AE, 0x0000013D, 0x000500C5, 0x00000017, 0x00003FF9,\n    0x000024D2, 0x0000448E, 0x000200F9, 0x0000362C, 0x000200F8, 0x0000362C,\n    0x000700F5, 0x00000017, 0x00004AB5, 0x00003910, 0x00006070, 0x00003FF9,\n    0x00002958, 0x000500C2, 0x0000000B, 0x00001B7F, 0x000054B5, 0x00000A17,\n    0x000500C7, 0x00000017, 0x000032F3, 0x00004AB5, 0x0000001B, 0x000500C4,\n    0x00000017, 0x00005C88, 0x000032F3, 0x000001DF, 0x000500C7, 0x00000017,\n    0x000050B1, 0x00004AB5, 0x0000051E, 0x000500C2, 0x00000017, 0x000036E6,\n    0x000050B1, 0x0000009B, 0x000500C5, 0x00000017, 0x00001985, 0x00005C88,\n    0x000036E6, 0x00060041, 0x00000294, 0x00005819, 0x0000140E, 0x00000A0B,\n    0x00001B7F, 0x0003003E, 0x00005819, 0x00001985, 0x000200F9, 0x00004C7A,\n    0x000200F8, 0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_r5g5b6_b5g6r5_swizzle_rbga_scaled_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25157\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n     %v4uint = OpTypeVector %uint 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v3uint = OpTypeVector %uint 3\n%uint_2031647 = OpConstant %uint 2031647\n    %uint_11 = OpConstant %uint 11\n%uint_4292935648 = OpConstant %uint 4292935648\n     %uint_5 = OpConstant %uint 5\n     %uint_1 = OpConstant %uint 1\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n     %uint_0 = OpConstant %uint 0\n      %int_3 = OpConstant %int 3\n     %uint_2 = OpConstant %uint 2\n      %int_2 = OpConstant %int 2\n     %uint_3 = OpConstant %uint 3\n     %uint_4 = OpConstant %uint 4\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n     %uint_7 = OpConstant %uint 7\n       %1927 = OpConstantComposite %v2uint %uint_4 %uint_7\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %2612 = OpConstantComposite %v3uint %uint_4 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n    %uint_16 = OpConstant %uint 16\n    %uint_32 = OpConstant %uint 32\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %1954 = OpConstantComposite %v2uint %uint_7 %uint_7\n       %1867 = OpConstantComposite %v2uint %uint_4 %uint_2\n    %uint_15 = OpConstant %uint 15\n       %1978 = OpConstantComposite %v2uint %uint_15 %uint_3\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n         %27 = OpConstantComposite %v4uint %uint_2031647 %uint_2031647 %uint_2031647 %uint_2031647\n        %479 = OpConstantComposite %v4uint %uint_11 %uint_11 %uint_11 %uint_11\n       %1310 = OpConstantComposite %v4uint %uint_4292935648 %uint_4292935648 %uint_4292935648 %uint_4292935648\n        %155 = OpConstantComposite %v4uint %uint_5 %uint_5 %uint_5 %uint_5\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24445 = OpBitwiseAnd %uint %13606 %uint_2\n      %18667 = OpINotEqual %bool %24445 %uint_0\n       %8141 = OpShiftRightLogical %uint %13606 %uint_2\n      %24990 = OpBitwiseAnd %uint %8141 %uint_3\n       %8871 = OpCompositeConstruct %v2uint %13606 %13606\n       %7087 = OpShiftRightLogical %v2uint %8871 %1927\n       %6551 = OpBitwiseAnd %v2uint %7087 %1954\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2612\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %6586 DontFlatten\n               OpBranchConditional %24679 %21992 %6586\n      %21992 = OpLabel\n               OpBranch %19578\n       %6586 = OpLabel\n      %23478 = OpBitcast %v3int %21387\n      %18710 = OpCompositeExtract %uint %22410 1\n      %23531 = OpCompositeExtract %int %23478 0\n      %22810 = OpIMul %int %23531 %int_2\n       %6362 = OpCompositeExtract %int %23478 2\n      %14505 = OpBitcast %int %18710\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %23478 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %6594\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %22810 %24535\n      %10898 = OpBitcast %uint %8258\n       %7937 = OpIAdd %uint %22411 %10898\n      %19921 = OpShiftRightLogical %v2uint %17136 %1867\n       %7712 = OpUDiv %v2uint %19921 %6551\n      %18183 = OpIMul %v2uint %6551 %7712\n      %18273 = OpISub %v2uint %19921 %18183\n      %11232 = OpShiftLeftLogical %v2uint %7712 %1867\n      %13284 = OpCompositeExtract %uint %18273 0\n      %10872 = OpCompositeExtract %uint %6551 1\n      %22886 = OpIMul %uint %13284 %10872\n       %6943 = OpCompositeExtract %uint %18273 1\n      %10469 = OpIAdd %uint %22886 %6943\n      %18851 = OpBitwiseAnd %v2uint %17136 %1978\n      %10581 = OpShiftLeftLogical %uint %10469 %uint_7\n      %20916 = OpCompositeExtract %uint %18851 1\n      %23596 = OpShiftLeftLogical %uint %20916 %uint_5\n      %19814 = OpBitwiseOr %uint %10581 %23596\n      %21476 = OpCompositeExtract %uint %18851 0\n       %8560 = OpShiftLeftLogical %uint %21476 %uint_1\n      %17648 = OpBitwiseOr %uint %19814 %8560\n      %19923 = OpCompositeExtract %uint %11232 0\n      %15556 = OpCompositeInsert %v3uint %19923 %21387 0\n      %23006 = OpCompositeExtract %uint %11232 1\n       %9680 = OpCompositeInsert %v3uint %23006 %15556 1\n               OpSelectionMerge %20344 DontFlatten\n               OpBranchConditional %18667 %23520 %11737\n      %23520 = OpLabel\n      %10111 = OpBitcast %v3int %9680\n      %19476 = OpShiftRightLogical %uint %22408 %int_5\n      %18810 = OpShiftRightLogical %uint %22409 %int_4\n       %6782 = OpCompositeExtract %int %10111 2\n      %12089 = OpShiftRightArithmetic %int %6782 %int_2\n      %22400 = OpBitcast %int %18810\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %10111 1\n      %19055 = OpShiftRightArithmetic %int %25154 %int_4\n      %11052 = OpIAdd %int %7938 %19055\n      %16898 = OpBitcast %int %19476\n      %14944 = OpIMul %int %11052 %16898\n      %25155 = OpCompositeExtract %int %10111 0\n      %20423 = OpShiftRightArithmetic %int %25155 %int_5\n      %18940 = OpIAdd %int %14944 %20423\n       %8797 = OpShiftLeftLogical %int %18940 %int_7\n      %11434 = OpBitwiseAnd %int %6782 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %25154 %int_1\n      %21364 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21364 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %25155 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17334 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17334 %uint_1\n      %13015 = OpShiftRightArithmetic %int %25154 %int_3\n       %9929 = OpBitwiseXor %int %13015 %12089\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %25155 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %25154 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6552 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6552\n       %7168 = OpShiftLeftLogical %int %16793 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24144 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24144 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24144 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24144 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %20344\n      %11737 = OpLabel\n      %11908 = OpVectorShuffle %v2uint %9680 %9680 0 1\n      %20347 = OpBitcast %v2int %11908\n      %11433 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %20347 1\n      %12090 = OpShiftRightArithmetic %int %14597 %int_5\n      %22401 = OpBitcast %int %11433\n       %7939 = OpIMul %int %12090 %22401\n      %25156 = OpCompositeExtract %int %20347 0\n      %20424 = OpShiftRightArithmetic %int %25156 %int_5\n      %18864 = OpIAdd %int %7939 %20424\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25156 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17335 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17335 %uint_1\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25156 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6553 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6553\n       %7169 = OpShiftLeftLogical %int %21575 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24163 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24163 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24163 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %20344\n      %20344 = OpLabel\n      %18329 = OpPhi %uint %16869 %23520 %16870 %11737\n      %15200 = OpCompositeExtract %uint %6551 0\n      %17489 = OpIMul %uint %15200 %10872\n       %7313 = OpIMul %uint %18329 %17489\n       %8815 = OpIAdd %uint %7313 %17648\n      %21470 = OpIAdd %uint %8815 %24236\n      %14664 = OpShiftRightLogical %uint %21470 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %14664\n       %8801 = OpLoad %v4uint %20399\n      %21106 = OpIEqual %bool %24990 %uint_1\n               OpSelectionMerge %13867 None\n               OpBranchConditional %21106 %10583 %13867\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %8801 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %8801 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13867\n      %13867 = OpLabel\n      %19124 = OpPhi %v4uint %8801 %20344 %16376 %10583\n       %7038 = OpShiftRightLogical %uint %7937 %int_4\n      %13042 = OpBitwiseAnd %v4uint %19124 %27\n      %23687 = OpShiftLeftLogical %v4uint %13042 %479\n      %20653 = OpBitwiseAnd %v4uint %19124 %1310\n      %14053 = OpShiftRightLogical %v4uint %20653 %155\n       %6532 = OpBitwiseOr %v4uint %23687 %14053\n      %20254 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %7038\n               OpStore %20254 %6532\n      %22137 = OpIAdd %uint %7937 %uint_16\n      %10214 = OpIAdd %uint %21470 %uint_16\n      %14665 = OpShiftRightLogical %uint %10214 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %14665\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %13868 None\n               OpBranchConditional %21106 %10584 %13868\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20654 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20654 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %13868\n      %13868 = OpLabel\n      %19125 = OpPhi %v4uint %14608 %13867 %16377 %10584\n       %7039 = OpShiftRightLogical %uint %22137 %int_4\n      %13043 = OpBitwiseAnd %v4uint %19125 %27\n      %23688 = OpShiftLeftLogical %v4uint %13043 %479\n      %20657 = OpBitwiseAnd %v4uint %19125 %1310\n      %14054 = OpShiftRightLogical %v4uint %20657 %155\n       %6533 = OpBitwiseOr %v4uint %23688 %14054\n      %22553 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %7039\n               OpStore %22553 %6533\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_r5g5b6_b5g6r5_swizzle_rbga_scaled_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006245, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000017,\n    0x0000000B, 0x00000004, 0x00040015, 0x0000000C, 0x00000020, 0x00000001,\n    0x00040017, 0x00000012, 0x0000000C, 0x00000002, 0x00040017, 0x00000016,\n    0x0000000C, 0x00000003, 0x00020014, 0x00000009, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x0004002B, 0x0000000B, 0x000000EC, 0x001F001F,\n    0x0004002B, 0x0000000B, 0x00000A2B, 0x0000000B, 0x0004002B, 0x0000000B,\n    0x000001F4, 0xFFE0FFE0, 0x0004002B, 0x0000000B, 0x00000A19, 0x00000005,\n    0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B,\n    0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B, 0x00000A22, 0x00000008,\n    0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00, 0x0004002B, 0x0000000C,\n    0x00000A17, 0x00000004, 0x0004002B, 0x0000000C, 0x00000A1D, 0x00000006,\n    0x0004002B, 0x0000000C, 0x00000A2C, 0x0000000B, 0x0004002B, 0x0000000C,\n    0x00000A38, 0x0000000F, 0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001,\n    0x0004002B, 0x0000000C, 0x00000A1A, 0x00000005, 0x0004002B, 0x0000000C,\n    0x00000A20, 0x00000007, 0x0004002B, 0x0000000C, 0x00000A23, 0x00000008,\n    0x0004002B, 0x0000000C, 0x00000A2F, 0x0000000C, 0x0004002B, 0x0000000B,\n    0x00000A0A, 0x00000000, 0x0004002B, 0x0000000C, 0x00000A14, 0x00000003,\n    0x0004002B, 0x0000000B, 0x00000A10, 0x00000002, 0x0004002B, 0x0000000C,\n    0x00000A11, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A13, 0x00000003,\n    0x0004002B, 0x0000000B, 0x00000A16, 0x00000004, 0x0004002B, 0x0000000C,\n    0x00000A0B, 0x00000000, 0x000A001E, 0x00000489, 0x0000000B, 0x0000000B,\n    0x0000000B, 0x0000000B, 0x00000014, 0x0000000B, 0x0000000B, 0x0000000B,\n    0x00040020, 0x00000706, 0x00000009, 0x00000489, 0x0004003B, 0x00000706,\n    0x00000CE9, 0x00000009, 0x00040020, 0x00000288, 0x00000009, 0x0000000B,\n    0x0004002B, 0x0000000B, 0x00000A1F, 0x00000007, 0x0005002C, 0x00000011,\n    0x00000787, 0x00000A16, 0x00000A1F, 0x00040020, 0x00000291, 0x00000009,\n    0x00000014, 0x00040020, 0x00000292, 0x00000001, 0x00000014, 0x0004003B,\n    0x00000292, 0x00000F48, 0x00000001, 0x0006002C, 0x00000014, 0x00000A34,\n    0x00000A16, 0x00000A0A, 0x00000A0A, 0x00040017, 0x0000000F, 0x00000009,\n    0x00000002, 0x0003001D, 0x000007DC, 0x00000017, 0x0003001E, 0x000007B4,\n    0x000007DC, 0x00040020, 0x00000A31, 0x00000002, 0x000007B4, 0x0004003B,\n    0x00000A31, 0x0000107A, 0x00000002, 0x00040020, 0x00000294, 0x00000002,\n    0x00000017, 0x0003001D, 0x000007DD, 0x00000017, 0x0003001E, 0x000007B5,\n    0x000007DD, 0x00040020, 0x00000A32, 0x00000002, 0x000007B5, 0x0004003B,\n    0x00000A32, 0x0000140E, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A3A,\n    0x00000010, 0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020, 0x0006002C,\n    0x00000014, 0x00000BC3, 0x00000A16, 0x00000A6A, 0x00000A0D, 0x0005002C,\n    0x00000011, 0x000007A2, 0x00000A1F, 0x00000A1F, 0x0005002C, 0x00000011,\n    0x0000074B, 0x00000A16, 0x00000A10, 0x0004002B, 0x0000000B, 0x00000A37,\n    0x0000000F, 0x0005002C, 0x00000011, 0x000007BA, 0x00000A37, 0x00000A13,\n    0x0007002C, 0x00000017, 0x000009CE, 0x000008A6, 0x000008A6, 0x000008A6,\n    0x000008A6, 0x0007002C, 0x00000017, 0x0000013D, 0x00000A22, 0x00000A22,\n    0x00000A22, 0x00000A22, 0x0007002C, 0x00000017, 0x0000072E, 0x000005FD,\n    0x000005FD, 0x000005FD, 0x000005FD, 0x0007002C, 0x00000017, 0x0000001B,\n    0x000000EC, 0x000000EC, 0x000000EC, 0x000000EC, 0x0007002C, 0x00000017,\n    0x000001DF, 0x00000A2B, 0x00000A2B, 0x00000A2B, 0x00000A2B, 0x0007002C,\n    0x00000017, 0x0000051E, 0x000001F4, 0x000001F4, 0x000001F4, 0x000001F4,\n    0x0007002C, 0x00000017, 0x0000009B, 0x00000A19, 0x00000A19, 0x00000A19,\n    0x00000A19, 0x00050036, 0x00000008, 0x0000161F, 0x00000000, 0x00000502,\n    0x000200F8, 0x00003B06, 0x000300F7, 0x00004C7A, 0x00000000, 0x000300FB,\n    0x00000A0A, 0x00002E68, 0x000200F8, 0x00002E68, 0x00050041, 0x00000288,\n    0x000060D7, 0x00000CE9, 0x00000A0B, 0x0004003D, 0x0000000B, 0x00003526,\n    0x000060D7, 0x000500C7, 0x0000000B, 0x00005F7D, 0x00003526, 0x00000A10,\n    0x000500AB, 0x00000009, 0x000048EB, 0x00005F7D, 0x00000A0A, 0x000500C2,\n    0x0000000B, 0x00001FCD, 0x00003526, 0x00000A10, 0x000500C7, 0x0000000B,\n    0x0000619E, 0x00001FCD, 0x00000A13, 0x00050050, 0x00000011, 0x000022A7,\n    0x00003526, 0x00003526, 0x000500C2, 0x00000011, 0x00001BAF, 0x000022A7,\n    0x00000787, 0x000500C7, 0x00000011, 0x00001997, 0x00001BAF, 0x000007A2,\n    0x00050041, 0x00000288, 0x0000492C, 0x00000CE9, 0x00000A0E, 0x0004003D,\n    0x0000000B, 0x00005EAC, 0x0000492C, 0x00050041, 0x00000288, 0x00004EBA,\n    0x00000CE9, 0x00000A11, 0x0004003D, 0x0000000B, 0x00005788, 0x00004EBA,\n    0x00050041, 0x00000288, 0x00004EBB, 0x00000CE9, 0x00000A14, 0x0004003D,\n    0x0000000B, 0x00005789, 0x00004EBB, 0x00050041, 0x00000291, 0x00004EBC,\n    0x00000CE9, 0x00000A17, 0x0004003D, 0x00000014, 0x0000578A, 0x00004EBC,\n    0x00050041, 0x00000288, 0x00004EBD, 0x00000CE9, 0x00000A1A, 0x0004003D,\n    0x0000000B, 0x0000578B, 0x00004EBD, 0x00050041, 0x00000288, 0x00004E6E,\n    0x00000CE9, 0x00000A1D, 0x0004003D, 0x0000000B, 0x000019C2, 0x00004E6E,\n    0x0004003D, 0x00000014, 0x00002A0E, 0x00000F48, 0x000500C4, 0x00000014,\n    0x0000538B, 0x00002A0E, 0x00000A34, 0x0007004F, 0x00000011, 0x000042F0,\n    0x0000538B, 0x0000538B, 0x00000000, 0x00000001, 0x0007004F, 0x00000011,\n    0x0000242F, 0x0000578A, 0x0000578A, 0x00000000, 0x00000001, 0x000500AE,\n    0x0000000F, 0x00004288, 0x000042F0, 0x0000242F, 0x0004009A, 0x00000009,\n    0x00006067, 0x00004288, 0x000300F7, 0x000019BA, 0x00000002, 0x000400FA,\n    0x00006067, 0x000055E8, 0x000019BA, 0x000200F8, 0x000055E8, 0x000200F9,\n    0x00004C7A, 0x000200F8, 0x000019BA, 0x0004007C, 0x00000016, 0x00005BB6,\n    0x0000538B, 0x00050051, 0x0000000B, 0x00004916, 0x0000578A, 0x00000001,\n    0x00050051, 0x0000000C, 0x00005BEB, 0x00005BB6, 0x00000000, 0x00050084,\n    0x0000000C, 0x0000591A, 0x00005BEB, 0x00000A11, 0x00050051, 0x0000000C,\n    0x000018DA, 0x00005BB6, 0x00000002, 0x0004007C, 0x0000000C, 0x000038A9,\n    0x00004916, 0x00050084, 0x0000000C, 0x00002C0F, 0x000018DA, 0x000038A9,\n    0x00050051, 0x0000000C, 0x000044BE, 0x00005BB6, 0x00000001, 0x00050080,\n    0x0000000C, 0x000056D4, 0x00002C0F, 0x000044BE, 0x0004007C, 0x0000000C,\n    0x00005785, 0x000019C2, 0x00050084, 0x0000000C, 0x00005FD7, 0x000056D4,\n    0x00005785, 0x00050080, 0x0000000C, 0x00002042, 0x0000591A, 0x00005FD7,\n    0x0004007C, 0x0000000B, 0x00002A92, 0x00002042, 0x00050080, 0x0000000B,\n    0x00001F01, 0x0000578B, 0x00002A92, 0x000500C2, 0x00000011, 0x00004DD1,\n    0x000042F0, 0x0000074B, 0x00050086, 0x00000011, 0x00001E20, 0x00004DD1,\n    0x00001997, 0x00050084, 0x00000011, 0x00004707, 0x00001997, 0x00001E20,\n    0x00050082, 0x00000011, 0x00004761, 0x00004DD1, 0x00004707, 0x000500C4,\n    0x00000011, 0x00002BE0, 0x00001E20, 0x0000074B, 0x00050051, 0x0000000B,\n    0x000033E4, 0x00004761, 0x00000000, 0x00050051, 0x0000000B, 0x00002A78,\n    0x00001997, 0x00000001, 0x00050084, 0x0000000B, 0x00005966, 0x000033E4,\n    0x00002A78, 0x00050051, 0x0000000B, 0x00001B1F, 0x00004761, 0x00000001,\n    0x00050080, 0x0000000B, 0x000028E5, 0x00005966, 0x00001B1F, 0x000500C7,\n    0x00000011, 0x000049A3, 0x000042F0, 0x000007BA, 0x000500C4, 0x0000000B,\n    0x00002955, 0x000028E5, 0x00000A1F, 0x00050051, 0x0000000B, 0x000051B4,\n    0x000049A3, 0x00000001, 0x000500C4, 0x0000000B, 0x00005C2C, 0x000051B4,\n    0x00000A19, 0x000500C5, 0x0000000B, 0x00004D66, 0x00002955, 0x00005C2C,\n    0x00050051, 0x0000000B, 0x000053E4, 0x000049A3, 0x00000000, 0x000500C4,\n    0x0000000B, 0x00002170, 0x000053E4, 0x00000A0D, 0x000500C5, 0x0000000B,\n    0x000044F0, 0x00004D66, 0x00002170, 0x00050051, 0x0000000B, 0x00004DD3,\n    0x00002BE0, 0x00000000, 0x00060052, 0x00000014, 0x00003CC4, 0x00004DD3,\n    0x0000538B, 0x00000000, 0x00050051, 0x0000000B, 0x000059DE, 0x00002BE0,\n    0x00000001, 0x00060052, 0x00000014, 0x000025D0, 0x000059DE, 0x00003CC4,\n    0x00000001, 0x000300F7, 0x00004F78, 0x00000002, 0x000400FA, 0x000048EB,\n    0x00005BE0, 0x00002DD9, 0x000200F8, 0x00005BE0, 0x0004007C, 0x00000016,\n    0x0000277F, 0x000025D0, 0x000500C2, 0x0000000B, 0x00004C14, 0x00005788,\n    0x00000A1A, 0x000500C2, 0x0000000B, 0x0000497A, 0x00005789, 0x00000A17,\n    0x00050051, 0x0000000C, 0x00001A7E, 0x0000277F, 0x00000002, 0x000500C3,\n    0x0000000C, 0x00002F39, 0x00001A7E, 0x00000A11, 0x0004007C, 0x0000000C,\n    0x00005780, 0x0000497A, 0x00050084, 0x0000000C, 0x00001F02, 0x00002F39,\n    0x00005780, 0x00050051, 0x0000000C, 0x00006242, 0x0000277F, 0x00000001,\n    0x000500C3, 0x0000000C, 0x00004A6F, 0x00006242, 0x00000A17, 0x00050080,\n    0x0000000C, 0x00002B2C, 0x00001F02, 0x00004A6F, 0x0004007C, 0x0000000C,\n    0x00004202, 0x00004C14, 0x00050084, 0x0000000C, 0x00003A60, 0x00002B2C,\n    0x00004202, 0x00050051, 0x0000000C, 0x00006243, 0x0000277F, 0x00000000,\n    0x000500C3, 0x0000000C, 0x00004FC7, 0x00006243, 0x00000A1A, 0x00050080,\n    0x0000000C, 0x000049FC, 0x00003A60, 0x00004FC7, 0x000500C4, 0x0000000C,\n    0x0000225D, 0x000049FC, 0x00000A20, 0x000500C7, 0x0000000C, 0x00002CAA,\n    0x00001A7E, 0x00000A14, 0x000500C4, 0x0000000C, 0x00004CAE, 0x00002CAA,\n    0x00000A1A, 0x000500C3, 0x0000000C, 0x0000383E, 0x00006242, 0x00000A0E,\n    0x000500C7, 0x0000000C, 0x00005374, 0x0000383E, 0x00000A14, 0x000500C4,\n    0x0000000C, 0x000054CA, 0x00005374, 0x00000A14, 0x000500C5, 0x0000000C,\n    0x000042CE, 0x00004CAE, 0x000054CA, 0x000500C7, 0x0000000C, 0x000050D5,\n    0x00006243, 0x00000A20, 0x000500C5, 0x0000000C, 0x00003ADD, 0x000042CE,\n    0x000050D5, 0x000500C5, 0x0000000C, 0x000043B6, 0x0000225D, 0x00003ADD,\n    0x000500C4, 0x0000000C, 0x00005E50, 0x000043B6, 0x00000A0D, 0x000500C3,\n    0x0000000C, 0x000032D7, 0x00006242, 0x00000A14, 0x000500C6, 0x0000000C,\n    0x000026C9, 0x000032D7, 0x00002F39, 0x000500C7, 0x0000000C, 0x00004199,\n    0x000026C9, 0x00000A0E, 0x000500C3, 0x0000000C, 0x00002590, 0x00006243,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x0000505E, 0x00002590, 0x00000A14,\n    0x000500C4, 0x0000000C, 0x0000541D, 0x00004199, 0x00000A0E, 0x000500C6,\n    0x0000000C, 0x000022BA, 0x0000505E, 0x0000541D, 0x000500C7, 0x0000000C,\n    0x00005076, 0x00006242, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005228,\n    0x00005076, 0x00000A17, 0x000500C4, 0x0000000C, 0x00001998, 0x000022BA,\n    0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FE, 0x00005228, 0x00001998,\n    0x000500C4, 0x0000000C, 0x00001C00, 0x00004199, 0x00000A2C, 0x000500C5,\n    0x0000000C, 0x00003C81, 0x000047FE, 0x00001C00, 0x000500C7, 0x0000000C,\n    0x000050AF, 0x00005E50, 0x00000A38, 0x000500C5, 0x0000000C, 0x00003C70,\n    0x00003C81, 0x000050AF, 0x000500C3, 0x0000000C, 0x00003745, 0x00005E50,\n    0x00000A17, 0x000500C7, 0x0000000C, 0x000018B8, 0x00003745, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x0000547E, 0x000018B8, 0x00000A1A, 0x000500C5,\n    0x0000000C, 0x000045A8, 0x00003C70, 0x0000547E, 0x000500C3, 0x0000000C,\n    0x00003A6E, 0x00005E50, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018B9,\n    0x00003A6E, 0x00000A20, 0x000500C4, 0x0000000C, 0x0000547F, 0x000018B9,\n    0x00000A23, 0x000500C5, 0x0000000C, 0x0000456F, 0x000045A8, 0x0000547F,\n    0x000500C3, 0x0000000C, 0x00003C88, 0x00005E50, 0x00000A23, 0x000500C4,\n    0x0000000C, 0x00002824, 0x00003C88, 0x00000A2F, 0x000500C5, 0x0000000C,\n    0x00003B79, 0x0000456F, 0x00002824, 0x0004007C, 0x0000000B, 0x000041E5,\n    0x00003B79, 0x000200F9, 0x00004F78, 0x000200F8, 0x00002DD9, 0x0007004F,\n    0x00000011, 0x00002E84, 0x000025D0, 0x000025D0, 0x00000000, 0x00000001,\n    0x0004007C, 0x00000012, 0x00004F7B, 0x00002E84, 0x000500C2, 0x0000000B,\n    0x00002CA9, 0x00005788, 0x00000A1A, 0x00050051, 0x0000000C, 0x00003905,\n    0x00004F7B, 0x00000001, 0x000500C3, 0x0000000C, 0x00002F3A, 0x00003905,\n    0x00000A1A, 0x0004007C, 0x0000000C, 0x00005781, 0x00002CA9, 0x00050084,\n    0x0000000C, 0x00001F03, 0x00002F3A, 0x00005781, 0x00050051, 0x0000000C,\n    0x00006244, 0x00004F7B, 0x00000000, 0x000500C3, 0x0000000C, 0x00004FC8,\n    0x00006244, 0x00000A1A, 0x00050080, 0x0000000C, 0x000049B0, 0x00001F03,\n    0x00004FC8, 0x000500C4, 0x0000000C, 0x0000254A, 0x000049B0, 0x00000A1D,\n    0x000500C3, 0x0000000C, 0x0000603B, 0x00003905, 0x00000A0E, 0x000500C7,\n    0x0000000C, 0x0000539A, 0x0000603B, 0x00000A20, 0x000500C4, 0x0000000C,\n    0x0000534A, 0x0000539A, 0x00000A14, 0x000500C7, 0x0000000C, 0x00004EA5,\n    0x00006244, 0x00000A20, 0x000500C5, 0x0000000C, 0x00002B1A, 0x0000534A,\n    0x00004EA5, 0x000500C5, 0x0000000C, 0x000043B7, 0x0000254A, 0x00002B1A,\n    0x000500C4, 0x0000000C, 0x00005E63, 0x000043B7, 0x00000A0D, 0x000500C3,\n    0x0000000C, 0x000031DE, 0x00003905, 0x00000A17, 0x000500C7, 0x0000000C,\n    0x00005447, 0x000031DE, 0x00000A0E, 0x000500C3, 0x0000000C, 0x000028A6,\n    0x00006244, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000511E, 0x000028A6,\n    0x00000A14, 0x000500C3, 0x0000000C, 0x000028B9, 0x00003905, 0x00000A14,\n    0x000500C7, 0x0000000C, 0x0000505F, 0x000028B9, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x0000541E, 0x0000505F, 0x00000A0E, 0x000500C6, 0x0000000C,\n    0x000022BB, 0x0000511E, 0x0000541E, 0x000500C7, 0x0000000C, 0x00005077,\n    0x00003905, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005229, 0x00005077,\n    0x00000A17, 0x000500C4, 0x0000000C, 0x00001999, 0x000022BB, 0x00000A1D,\n    0x000500C5, 0x0000000C, 0x000047FF, 0x00005229, 0x00001999, 0x000500C4,\n    0x0000000C, 0x00001C01, 0x00005447, 0x00000A2C, 0x000500C5, 0x0000000C,\n    0x00003C82, 0x000047FF, 0x00001C01, 0x000500C7, 0x0000000C, 0x000050B0,\n    0x00005E63, 0x00000A38, 0x000500C5, 0x0000000C, 0x00003C71, 0x00003C82,\n    0x000050B0, 0x000500C3, 0x0000000C, 0x00003746, 0x00005E63, 0x00000A17,\n    0x000500C7, 0x0000000C, 0x000018BA, 0x00003746, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x00005480, 0x000018BA, 0x00000A1A, 0x000500C5, 0x0000000C,\n    0x000045A9, 0x00003C71, 0x00005480, 0x000500C3, 0x0000000C, 0x00003A6F,\n    0x00005E63, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018BB, 0x00003A6F,\n    0x00000A20, 0x000500C4, 0x0000000C, 0x00005481, 0x000018BB, 0x00000A23,\n    0x000500C5, 0x0000000C, 0x00004570, 0x000045A9, 0x00005481, 0x000500C3,\n    0x0000000C, 0x00003C89, 0x00005E63, 0x00000A23, 0x000500C4, 0x0000000C,\n    0x00002825, 0x00003C89, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B7A,\n    0x00004570, 0x00002825, 0x0004007C, 0x0000000B, 0x000041E6, 0x00003B7A,\n    0x000200F9, 0x00004F78, 0x000200F8, 0x00004F78, 0x000700F5, 0x0000000B,\n    0x00004799, 0x000041E5, 0x00005BE0, 0x000041E6, 0x00002DD9, 0x00050051,\n    0x0000000B, 0x00003B60, 0x00001997, 0x00000000, 0x00050084, 0x0000000B,\n    0x00004451, 0x00003B60, 0x00002A78, 0x00050084, 0x0000000B, 0x00001C91,\n    0x00004799, 0x00004451, 0x00050080, 0x0000000B, 0x0000226F, 0x00001C91,\n    0x000044F0, 0x00050080, 0x0000000B, 0x000053DE, 0x0000226F, 0x00005EAC,\n    0x000500C2, 0x0000000B, 0x00003948, 0x000053DE, 0x00000A17, 0x00060041,\n    0x00000294, 0x00004FAF, 0x0000107A, 0x00000A0B, 0x00003948, 0x0004003D,\n    0x00000017, 0x00002261, 0x00004FAF, 0x000500AA, 0x00000009, 0x00005272,\n    0x0000619E, 0x00000A0D, 0x000300F7, 0x0000362B, 0x00000000, 0x000400FA,\n    0x00005272, 0x00002957, 0x0000362B, 0x000200F8, 0x00002957, 0x000500C7,\n    0x00000017, 0x0000475F, 0x00002261, 0x000009CE, 0x000500C4, 0x00000017,\n    0x000024D1, 0x0000475F, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AC,\n    0x00002261, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448D, 0x000050AC,\n    0x0000013D, 0x000500C5, 0x00000017, 0x00003FF8, 0x000024D1, 0x0000448D,\n    0x000200F9, 0x0000362B, 0x000200F8, 0x0000362B, 0x000700F5, 0x00000017,\n    0x00004AB4, 0x00002261, 0x00004F78, 0x00003FF8, 0x00002957, 0x000500C2,\n    0x0000000B, 0x00001B7E, 0x00001F01, 0x00000A17, 0x000500C7, 0x00000017,\n    0x000032F2, 0x00004AB4, 0x0000001B, 0x000500C4, 0x00000017, 0x00005C87,\n    0x000032F2, 0x000001DF, 0x000500C7, 0x00000017, 0x000050AD, 0x00004AB4,\n    0x0000051E, 0x000500C2, 0x00000017, 0x000036E5, 0x000050AD, 0x0000009B,\n    0x000500C5, 0x00000017, 0x00001984, 0x00005C87, 0x000036E5, 0x00060041,\n    0x00000294, 0x00004F1E, 0x0000140E, 0x00000A0B, 0x00001B7E, 0x0003003E,\n    0x00004F1E, 0x00001984, 0x00050080, 0x0000000B, 0x00005679, 0x00001F01,\n    0x00000A3A, 0x00050080, 0x0000000B, 0x000027E6, 0x000053DE, 0x00000A3A,\n    0x000500C2, 0x0000000B, 0x00003949, 0x000027E6, 0x00000A17, 0x00060041,\n    0x00000294, 0x00005566, 0x0000107A, 0x00000A0B, 0x00003949, 0x0004003D,\n    0x00000017, 0x00003910, 0x00005566, 0x000300F7, 0x0000362C, 0x00000000,\n    0x000400FA, 0x00005272, 0x00002958, 0x0000362C, 0x000200F8, 0x00002958,\n    0x000500C7, 0x00000017, 0x00004760, 0x00003910, 0x000009CE, 0x000500C4,\n    0x00000017, 0x000024D2, 0x00004760, 0x0000013D, 0x000500C7, 0x00000017,\n    0x000050AE, 0x00003910, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448E,\n    0x000050AE, 0x0000013D, 0x000500C5, 0x00000017, 0x00003FF9, 0x000024D2,\n    0x0000448E, 0x000200F9, 0x0000362C, 0x000200F8, 0x0000362C, 0x000700F5,\n    0x00000017, 0x00004AB5, 0x00003910, 0x0000362B, 0x00003FF9, 0x00002958,\n    0x000500C2, 0x0000000B, 0x00001B7F, 0x00005679, 0x00000A17, 0x000500C7,\n    0x00000017, 0x000032F3, 0x00004AB5, 0x0000001B, 0x000500C4, 0x00000017,\n    0x00005C88, 0x000032F3, 0x000001DF, 0x000500C7, 0x00000017, 0x000050B1,\n    0x00004AB5, 0x0000051E, 0x000500C2, 0x00000017, 0x000036E6, 0x000050B1,\n    0x0000009B, 0x000500C5, 0x00000017, 0x00001985, 0x00005C88, 0x000036E6,\n    0x00060041, 0x00000294, 0x00005819, 0x0000140E, 0x00000A0B, 0x00001B7F,\n    0x0003003E, 0x00005819, 0x00001985, 0x000200F9, 0x00004C7A, 0x000200F8,\n    0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_r5g6b5_b5g6r5_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25155\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v4uint = OpTypeVector %uint 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v2uint = OpTypeVector %uint 2\n     %v3uint = OpTypeVector %uint 3\n%uint_132122592 = OpConstant %uint 132122592\n%uint_2031647 = OpConstant %uint 2031647\n    %uint_11 = OpConstant %uint 11\n%uint_4160813056 = OpConstant %uint 4160813056\n     %uint_1 = OpConstant %uint 1\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n     %uint_0 = OpConstant %uint 0\n      %int_3 = OpConstant %int 3\n     %uint_2 = OpConstant %uint 2\n      %int_2 = OpConstant %int 2\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n     %uint_3 = OpConstant %uint 3\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n     %uint_4 = OpConstant %uint 4\n       %2612 = OpConstantComposite %v3uint %uint_4 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n    %uint_16 = OpConstant %uint 16\n    %uint_32 = OpConstant %uint 32\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n       %2545 = OpConstantComposite %v4uint %uint_132122592 %uint_132122592 %uint_132122592 %uint_132122592\n         %27 = OpConstantComposite %v4uint %uint_2031647 %uint_2031647 %uint_2031647 %uint_2031647\n        %479 = OpConstantComposite %v4uint %uint_11 %uint_11 %uint_11 %uint_11\n       %1661 = OpConstantComposite %v4uint %uint_4160813056 %uint_4160813056 %uint_4160813056 %uint_4160813056\n    %uint_64 = OpConstant %uint 64\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24540 = OpBitwiseAnd %uint %13606 %uint_1\n      %17270 = OpINotEqual %bool %24540 %uint_0\n      %12328 = OpBitwiseAnd %uint %13606 %uint_2\n      %17284 = OpINotEqual %bool %12328 %uint_0\n       %7856 = OpShiftRightLogical %uint %13606 %uint_2\n      %25058 = OpBitwiseAnd %uint %7856 %uint_3\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2612\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %6586 DontFlatten\n               OpBranchConditional %24679 %21992 %6586\n      %21992 = OpLabel\n               OpBranch %19578\n       %6586 = OpLabel\n      %23478 = OpBitcast %v3int %21387\n      %18710 = OpCompositeExtract %uint %22410 1\n      %23531 = OpCompositeExtract %int %23478 0\n      %22810 = OpIMul %int %23531 %int_2\n       %6362 = OpCompositeExtract %int %23478 2\n      %14505 = OpBitcast %int %18710\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %23478 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %6594\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %22810 %24535\n      %10404 = OpBitcast %uint %8258\n      %14582 = OpIAdd %uint %22411 %10404\n      %12308 = OpLogicalNot %bool %17270\n               OpSelectionMerge %19040 DontFlatten\n               OpBranchConditional %12308 %9741 %17007\n       %9741 = OpLabel\n      %17463 = OpCompositeExtract %uint %21387 0\n      %11246 = OpCompositeExtract %uint %21387 1\n      %18801 = OpCompositeExtract %uint %21387 2\n      %14831 = OpIMul %uint %22409 %18801\n      %20322 = OpIAdd %uint %11246 %14831\n      %21676 = OpIMul %uint %22408 %20322\n      %20398 = OpIAdd %uint %17463 %21676\n      %11367 = OpShiftLeftLogical %uint %20398 %uint_1\n               OpBranch %19040\n      %17007 = OpLabel\n               OpSelectionMerge %23536 DontFlatten\n               OpBranchConditional %17284 %11410 %24353\n      %11410 = OpLabel\n      %21364 = OpShiftRightLogical %uint %22408 %int_5\n      %13804 = OpShiftRightLogical %uint %22409 %int_4\n      %13237 = OpShiftRightArithmetic %int %6362 %int_2\n      %22374 = OpBitcast %int %13804\n      %25085 = OpIMul %int %13237 %22374\n      %11618 = OpShiftRightArithmetic %int %17598 %int_4\n      %16670 = OpIAdd %int %25085 %11618\n      %19064 = OpBitcast %int %21364\n      %13020 = OpIMul %int %16670 %19064\n      %12986 = OpShiftRightArithmetic %int %23531 %int_5\n      %24558 = OpIAdd %int %13020 %12986\n       %8797 = OpShiftLeftLogical %int %24558 %int_7\n      %11434 = OpBitwiseAnd %int %6362 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %17598 %int_1\n      %21365 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21365 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %23531 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17334 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17334 %uint_1\n      %13015 = OpShiftRightArithmetic %int %17598 %int_3\n       %9929 = OpBitwiseXor %int %13015 %13237\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %23531 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %17598 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6551\n       %7168 = OpShiftLeftLogical %int %16793 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24144 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24144 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24144 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24144 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %23536\n      %24353 = OpLabel\n      %23000 = OpBitcast %v2int %17136\n      %22120 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %23000 1\n      %12089 = OpShiftRightArithmetic %int %14597 %int_5\n      %22400 = OpBitcast %int %22120\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %23000 0\n      %20423 = OpShiftRightArithmetic %int %25154 %int_5\n      %18864 = OpIAdd %int %7938 %20423\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25154 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17335 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17335 %uint_1\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25154 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6552\n       %7169 = OpShiftLeftLogical %int %21575 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24163 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24163 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24163 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %23536\n      %23536 = OpLabel\n      %10540 = OpPhi %uint %16869 %11410 %16870 %24353\n               OpBranch %19040\n      %19040 = OpLabel\n      %11376 = OpPhi %uint %11367 %9741 %10540 %23536\n      %18621 = OpIAdd %uint %11376 %24236\n      %15698 = OpShiftRightLogical %uint %18621 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15698\n       %8801 = OpLoad %v4uint %20399\n      %21106 = OpIEqual %bool %25058 %uint_1\n               OpSelectionMerge %13867 None\n               OpBranchConditional %21106 %10583 %13867\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %8801 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %8801 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13867\n      %13867 = OpLabel\n      %19124 = OpPhi %v4uint %8801 %19040 %16376 %10583\n       %7095 = OpShiftRightLogical %uint %14582 %int_4\n      %12466 = OpBitwiseAnd %v4uint %19124 %2545\n      %18755 = OpBitwiseAnd %v4uint %19124 %27\n      %24932 = OpShiftLeftLogical %v4uint %18755 %479\n      %17045 = OpBitwiseOr %v4uint %12466 %24932\n      %21212 = OpBitwiseAnd %v4uint %19124 %1661\n      %18088 = OpShiftRightLogical %v4uint %21212 %479\n       %6532 = OpBitwiseOr %v4uint %17045 %18088\n      %20254 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %7095\n               OpStore %20254 %6532\n      %21685 = OpIAdd %uint %14582 %uint_16\n               OpSelectionMerge %24688 DontFlatten\n               OpBranchConditional %17270 %21993 %7205\n      %21993 = OpLabel\n               OpBranch %24688\n       %7205 = OpLabel\n               OpBranch %24688\n      %24688 = OpLabel\n      %11377 = OpPhi %uint %uint_64 %21993 %uint_16 %7205\n      %18622 = OpIAdd %uint %18621 %11377\n      %15699 = OpShiftRightLogical %uint %18622 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15699\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %13868 None\n               OpBranchConditional %21106 %10584 %13868\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %13868\n      %13868 = OpLabel\n      %19125 = OpPhi %v4uint %14608 %24688 %16377 %10584\n       %7096 = OpShiftRightLogical %uint %21685 %int_4\n      %12467 = OpBitwiseAnd %v4uint %19125 %2545\n      %18756 = OpBitwiseAnd %v4uint %19125 %27\n      %24933 = OpShiftLeftLogical %v4uint %18756 %479\n      %17046 = OpBitwiseOr %v4uint %12467 %24933\n      %21213 = OpBitwiseAnd %v4uint %19125 %1661\n      %18089 = OpShiftRightLogical %v4uint %21213 %479\n       %6533 = OpBitwiseOr %v4uint %17046 %18089\n      %22553 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %7096\n               OpStore %22553 %6533\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_r5g6b5_b5g6r5_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006243, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000017, 0x0000000B, 0x00000004, 0x00040015, 0x0000000C,\n    0x00000020, 0x00000001, 0x00040017, 0x00000012, 0x0000000C, 0x00000002,\n    0x00040017, 0x00000016, 0x0000000C, 0x00000003, 0x00020014, 0x00000009,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x0004002B, 0x0000000B, 0x00000902, 0x07E007E0,\n    0x0004002B, 0x0000000B, 0x000000EC, 0x001F001F, 0x0004002B, 0x0000000B,\n    0x00000A2B, 0x0000000B, 0x0004002B, 0x0000000B, 0x000002FC, 0xF800F800,\n    0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B,\n    0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B, 0x00000A22, 0x00000008,\n    0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00, 0x0004002B, 0x0000000C,\n    0x00000A17, 0x00000004, 0x0004002B, 0x0000000C, 0x00000A1D, 0x00000006,\n    0x0004002B, 0x0000000C, 0x00000A2C, 0x0000000B, 0x0004002B, 0x0000000C,\n    0x00000A38, 0x0000000F, 0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001,\n    0x0004002B, 0x0000000C, 0x00000A1A, 0x00000005, 0x0004002B, 0x0000000C,\n    0x00000A20, 0x00000007, 0x0004002B, 0x0000000C, 0x00000A23, 0x00000008,\n    0x0004002B, 0x0000000C, 0x00000A2F, 0x0000000C, 0x0004002B, 0x0000000B,\n    0x00000A0A, 0x00000000, 0x0004002B, 0x0000000C, 0x00000A14, 0x00000003,\n    0x0004002B, 0x0000000B, 0x00000A10, 0x00000002, 0x0004002B, 0x0000000C,\n    0x00000A11, 0x00000002, 0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000,\n    0x000A001E, 0x00000489, 0x0000000B, 0x0000000B, 0x0000000B, 0x0000000B,\n    0x00000014, 0x0000000B, 0x0000000B, 0x0000000B, 0x00040020, 0x00000706,\n    0x00000009, 0x00000489, 0x0004003B, 0x00000706, 0x00000CE9, 0x00000009,\n    0x00040020, 0x00000288, 0x00000009, 0x0000000B, 0x0004002B, 0x0000000B,\n    0x00000A13, 0x00000003, 0x00040020, 0x00000291, 0x00000009, 0x00000014,\n    0x00040020, 0x00000292, 0x00000001, 0x00000014, 0x0004003B, 0x00000292,\n    0x00000F48, 0x00000001, 0x0004002B, 0x0000000B, 0x00000A16, 0x00000004,\n    0x0006002C, 0x00000014, 0x00000A34, 0x00000A16, 0x00000A0A, 0x00000A0A,\n    0x00040017, 0x0000000F, 0x00000009, 0x00000002, 0x0003001D, 0x000007DC,\n    0x00000017, 0x0003001E, 0x000007B4, 0x000007DC, 0x00040020, 0x00000A31,\n    0x00000002, 0x000007B4, 0x0004003B, 0x00000A31, 0x0000107A, 0x00000002,\n    0x00040020, 0x00000294, 0x00000002, 0x00000017, 0x0003001D, 0x000007DD,\n    0x00000017, 0x0003001E, 0x000007B5, 0x000007DD, 0x00040020, 0x00000A32,\n    0x00000002, 0x000007B5, 0x0004003B, 0x00000A32, 0x0000140E, 0x00000002,\n    0x0004002B, 0x0000000B, 0x00000A3A, 0x00000010, 0x0004002B, 0x0000000B,\n    0x00000A6A, 0x00000020, 0x0006002C, 0x00000014, 0x00000BC3, 0x00000A16,\n    0x00000A6A, 0x00000A0D, 0x0007002C, 0x00000017, 0x000009CE, 0x000008A6,\n    0x000008A6, 0x000008A6, 0x000008A6, 0x0007002C, 0x00000017, 0x0000013D,\n    0x00000A22, 0x00000A22, 0x00000A22, 0x00000A22, 0x0007002C, 0x00000017,\n    0x0000072E, 0x000005FD, 0x000005FD, 0x000005FD, 0x000005FD, 0x0007002C,\n    0x00000017, 0x000009F1, 0x00000902, 0x00000902, 0x00000902, 0x00000902,\n    0x0007002C, 0x00000017, 0x0000001B, 0x000000EC, 0x000000EC, 0x000000EC,\n    0x000000EC, 0x0007002C, 0x00000017, 0x000001DF, 0x00000A2B, 0x00000A2B,\n    0x00000A2B, 0x00000A2B, 0x0007002C, 0x00000017, 0x0000067D, 0x000002FC,\n    0x000002FC, 0x000002FC, 0x000002FC, 0x0004002B, 0x0000000B, 0x00000ACA,\n    0x00000040, 0x00050036, 0x00000008, 0x0000161F, 0x00000000, 0x00000502,\n    0x000200F8, 0x00003B06, 0x000300F7, 0x00004C7A, 0x00000000, 0x000300FB,\n    0x00000A0A, 0x00002E68, 0x000200F8, 0x00002E68, 0x00050041, 0x00000288,\n    0x000060D7, 0x00000CE9, 0x00000A0B, 0x0004003D, 0x0000000B, 0x00003526,\n    0x000060D7, 0x000500C7, 0x0000000B, 0x00005FDC, 0x00003526, 0x00000A0D,\n    0x000500AB, 0x00000009, 0x00004376, 0x00005FDC, 0x00000A0A, 0x000500C7,\n    0x0000000B, 0x00003028, 0x00003526, 0x00000A10, 0x000500AB, 0x00000009,\n    0x00004384, 0x00003028, 0x00000A0A, 0x000500C2, 0x0000000B, 0x00001EB0,\n    0x00003526, 0x00000A10, 0x000500C7, 0x0000000B, 0x000061E2, 0x00001EB0,\n    0x00000A13, 0x00050041, 0x00000288, 0x0000492C, 0x00000CE9, 0x00000A0E,\n    0x0004003D, 0x0000000B, 0x00005EAC, 0x0000492C, 0x00050041, 0x00000288,\n    0x00004EBA, 0x00000CE9, 0x00000A11, 0x0004003D, 0x0000000B, 0x00005788,\n    0x00004EBA, 0x00050041, 0x00000288, 0x00004EBB, 0x00000CE9, 0x00000A14,\n    0x0004003D, 0x0000000B, 0x00005789, 0x00004EBB, 0x00050041, 0x00000291,\n    0x00004EBC, 0x00000CE9, 0x00000A17, 0x0004003D, 0x00000014, 0x0000578A,\n    0x00004EBC, 0x00050041, 0x00000288, 0x00004EBD, 0x00000CE9, 0x00000A1A,\n    0x0004003D, 0x0000000B, 0x0000578B, 0x00004EBD, 0x00050041, 0x00000288,\n    0x00004E6E, 0x00000CE9, 0x00000A1D, 0x0004003D, 0x0000000B, 0x000019C2,\n    0x00004E6E, 0x0004003D, 0x00000014, 0x00002A0E, 0x00000F48, 0x000500C4,\n    0x00000014, 0x0000538B, 0x00002A0E, 0x00000A34, 0x0007004F, 0x00000011,\n    0x000042F0, 0x0000538B, 0x0000538B, 0x00000000, 0x00000001, 0x0007004F,\n    0x00000011, 0x0000242F, 0x0000578A, 0x0000578A, 0x00000000, 0x00000001,\n    0x000500AE, 0x0000000F, 0x00004288, 0x000042F0, 0x0000242F, 0x0004009A,\n    0x00000009, 0x00006067, 0x00004288, 0x000300F7, 0x000019BA, 0x00000002,\n    0x000400FA, 0x00006067, 0x000055E8, 0x000019BA, 0x000200F8, 0x000055E8,\n    0x000200F9, 0x00004C7A, 0x000200F8, 0x000019BA, 0x0004007C, 0x00000016,\n    0x00005BB6, 0x0000538B, 0x00050051, 0x0000000B, 0x00004916, 0x0000578A,\n    0x00000001, 0x00050051, 0x0000000C, 0x00005BEB, 0x00005BB6, 0x00000000,\n    0x00050084, 0x0000000C, 0x0000591A, 0x00005BEB, 0x00000A11, 0x00050051,\n    0x0000000C, 0x000018DA, 0x00005BB6, 0x00000002, 0x0004007C, 0x0000000C,\n    0x000038A9, 0x00004916, 0x00050084, 0x0000000C, 0x00002C0F, 0x000018DA,\n    0x000038A9, 0x00050051, 0x0000000C, 0x000044BE, 0x00005BB6, 0x00000001,\n    0x00050080, 0x0000000C, 0x000056D4, 0x00002C0F, 0x000044BE, 0x0004007C,\n    0x0000000C, 0x00005785, 0x000019C2, 0x00050084, 0x0000000C, 0x00005FD7,\n    0x000056D4, 0x00005785, 0x00050080, 0x0000000C, 0x00002042, 0x0000591A,\n    0x00005FD7, 0x0004007C, 0x0000000B, 0x000028A4, 0x00002042, 0x00050080,\n    0x0000000B, 0x000038F6, 0x0000578B, 0x000028A4, 0x000400A8, 0x00000009,\n    0x00003014, 0x00004376, 0x000300F7, 0x00004A60, 0x00000002, 0x000400FA,\n    0x00003014, 0x0000260D, 0x0000426F, 0x000200F8, 0x0000260D, 0x00050051,\n    0x0000000B, 0x00004437, 0x0000538B, 0x00000000, 0x00050051, 0x0000000B,\n    0x00002BEE, 0x0000538B, 0x00000001, 0x00050051, 0x0000000B, 0x00004971,\n    0x0000538B, 0x00000002, 0x00050084, 0x0000000B, 0x000039EF, 0x00005789,\n    0x00004971, 0x00050080, 0x0000000B, 0x00004F62, 0x00002BEE, 0x000039EF,\n    0x00050084, 0x0000000B, 0x000054AC, 0x00005788, 0x00004F62, 0x00050080,\n    0x0000000B, 0x00004FAE, 0x00004437, 0x000054AC, 0x000500C4, 0x0000000B,\n    0x00002C67, 0x00004FAE, 0x00000A0D, 0x000200F9, 0x00004A60, 0x000200F8,\n    0x0000426F, 0x000300F7, 0x00005BF0, 0x00000002, 0x000400FA, 0x00004384,\n    0x00002C92, 0x00005F21, 0x000200F8, 0x00002C92, 0x000500C2, 0x0000000B,\n    0x00005374, 0x00005788, 0x00000A1A, 0x000500C2, 0x0000000B, 0x000035EC,\n    0x00005789, 0x00000A17, 0x000500C3, 0x0000000C, 0x000033B5, 0x000018DA,\n    0x00000A11, 0x0004007C, 0x0000000C, 0x00005766, 0x000035EC, 0x00050084,\n    0x0000000C, 0x000061FD, 0x000033B5, 0x00005766, 0x000500C3, 0x0000000C,\n    0x00002D62, 0x000044BE, 0x00000A17, 0x00050080, 0x0000000C, 0x0000411E,\n    0x000061FD, 0x00002D62, 0x0004007C, 0x0000000C, 0x00004A78, 0x00005374,\n    0x00050084, 0x0000000C, 0x000032DC, 0x0000411E, 0x00004A78, 0x000500C3,\n    0x0000000C, 0x000032BA, 0x00005BEB, 0x00000A1A, 0x00050080, 0x0000000C,\n    0x00005FEE, 0x000032DC, 0x000032BA, 0x000500C4, 0x0000000C, 0x0000225D,\n    0x00005FEE, 0x00000A20, 0x000500C7, 0x0000000C, 0x00002CAA, 0x000018DA,\n    0x00000A14, 0x000500C4, 0x0000000C, 0x00004CAE, 0x00002CAA, 0x00000A1A,\n    0x000500C3, 0x0000000C, 0x0000383E, 0x000044BE, 0x00000A0E, 0x000500C7,\n    0x0000000C, 0x00005375, 0x0000383E, 0x00000A14, 0x000500C4, 0x0000000C,\n    0x000054CA, 0x00005375, 0x00000A14, 0x000500C5, 0x0000000C, 0x000042CE,\n    0x00004CAE, 0x000054CA, 0x000500C7, 0x0000000C, 0x000050D5, 0x00005BEB,\n    0x00000A20, 0x000500C5, 0x0000000C, 0x00003ADD, 0x000042CE, 0x000050D5,\n    0x000500C5, 0x0000000C, 0x000043B6, 0x0000225D, 0x00003ADD, 0x000500C4,\n    0x0000000C, 0x00005E50, 0x000043B6, 0x00000A0D, 0x000500C3, 0x0000000C,\n    0x000032D7, 0x000044BE, 0x00000A14, 0x000500C6, 0x0000000C, 0x000026C9,\n    0x000032D7, 0x000033B5, 0x000500C7, 0x0000000C, 0x00004199, 0x000026C9,\n    0x00000A0E, 0x000500C3, 0x0000000C, 0x00002590, 0x00005BEB, 0x00000A14,\n    0x000500C7, 0x0000000C, 0x0000505E, 0x00002590, 0x00000A14, 0x000500C4,\n    0x0000000C, 0x0000541D, 0x00004199, 0x00000A0E, 0x000500C6, 0x0000000C,\n    0x000022BA, 0x0000505E, 0x0000541D, 0x000500C7, 0x0000000C, 0x00005076,\n    0x000044BE, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005228, 0x00005076,\n    0x00000A17, 0x000500C4, 0x0000000C, 0x00001997, 0x000022BA, 0x00000A1D,\n    0x000500C5, 0x0000000C, 0x000047FE, 0x00005228, 0x00001997, 0x000500C4,\n    0x0000000C, 0x00001C00, 0x00004199, 0x00000A2C, 0x000500C5, 0x0000000C,\n    0x00003C81, 0x000047FE, 0x00001C00, 0x000500C7, 0x0000000C, 0x000050AF,\n    0x00005E50, 0x00000A38, 0x000500C5, 0x0000000C, 0x00003C70, 0x00003C81,\n    0x000050AF, 0x000500C3, 0x0000000C, 0x00003745, 0x00005E50, 0x00000A17,\n    0x000500C7, 0x0000000C, 0x000018B8, 0x00003745, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x0000547E, 0x000018B8, 0x00000A1A, 0x000500C5, 0x0000000C,\n    0x000045A8, 0x00003C70, 0x0000547E, 0x000500C3, 0x0000000C, 0x00003A6E,\n    0x00005E50, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018B9, 0x00003A6E,\n    0x00000A20, 0x000500C4, 0x0000000C, 0x0000547F, 0x000018B9, 0x00000A23,\n    0x000500C5, 0x0000000C, 0x0000456F, 0x000045A8, 0x0000547F, 0x000500C3,\n    0x0000000C, 0x00003C88, 0x00005E50, 0x00000A23, 0x000500C4, 0x0000000C,\n    0x00002824, 0x00003C88, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B79,\n    0x0000456F, 0x00002824, 0x0004007C, 0x0000000B, 0x000041E5, 0x00003B79,\n    0x000200F9, 0x00005BF0, 0x000200F8, 0x00005F21, 0x0004007C, 0x00000012,\n    0x000059D8, 0x000042F0, 0x000500C2, 0x0000000B, 0x00005668, 0x00005788,\n    0x00000A1A, 0x00050051, 0x0000000C, 0x00003905, 0x000059D8, 0x00000001,\n    0x000500C3, 0x0000000C, 0x00002F39, 0x00003905, 0x00000A1A, 0x0004007C,\n    0x0000000C, 0x00005780, 0x00005668, 0x00050084, 0x0000000C, 0x00001F02,\n    0x00002F39, 0x00005780, 0x00050051, 0x0000000C, 0x00006242, 0x000059D8,\n    0x00000000, 0x000500C3, 0x0000000C, 0x00004FC7, 0x00006242, 0x00000A1A,\n    0x00050080, 0x0000000C, 0x000049B0, 0x00001F02, 0x00004FC7, 0x000500C4,\n    0x0000000C, 0x0000254A, 0x000049B0, 0x00000A1D, 0x000500C3, 0x0000000C,\n    0x0000603B, 0x00003905, 0x00000A0E, 0x000500C7, 0x0000000C, 0x0000539A,\n    0x0000603B, 0x00000A20, 0x000500C4, 0x0000000C, 0x0000534A, 0x0000539A,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x00004EA5, 0x00006242, 0x00000A20,\n    0x000500C5, 0x0000000C, 0x00002B1A, 0x0000534A, 0x00004EA5, 0x000500C5,\n    0x0000000C, 0x000043B7, 0x0000254A, 0x00002B1A, 0x000500C4, 0x0000000C,\n    0x00005E63, 0x000043B7, 0x00000A0D, 0x000500C3, 0x0000000C, 0x000031DE,\n    0x00003905, 0x00000A17, 0x000500C7, 0x0000000C, 0x00005447, 0x000031DE,\n    0x00000A0E, 0x000500C3, 0x0000000C, 0x000028A6, 0x00006242, 0x00000A14,\n    0x000500C7, 0x0000000C, 0x0000511E, 0x000028A6, 0x00000A14, 0x000500C3,\n    0x0000000C, 0x000028B9, 0x00003905, 0x00000A14, 0x000500C7, 0x0000000C,\n    0x0000505F, 0x000028B9, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000541E,\n    0x0000505F, 0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BB, 0x0000511E,\n    0x0000541E, 0x000500C7, 0x0000000C, 0x00005077, 0x00003905, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x00005229, 0x00005077, 0x00000A17, 0x000500C4,\n    0x0000000C, 0x00001998, 0x000022BB, 0x00000A1D, 0x000500C5, 0x0000000C,\n    0x000047FF, 0x00005229, 0x00001998, 0x000500C4, 0x0000000C, 0x00001C01,\n    0x00005447, 0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C82, 0x000047FF,\n    0x00001C01, 0x000500C7, 0x0000000C, 0x000050B0, 0x00005E63, 0x00000A38,\n    0x000500C5, 0x0000000C, 0x00003C71, 0x00003C82, 0x000050B0, 0x000500C3,\n    0x0000000C, 0x00003746, 0x00005E63, 0x00000A17, 0x000500C7, 0x0000000C,\n    0x000018BA, 0x00003746, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005480,\n    0x000018BA, 0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A9, 0x00003C71,\n    0x00005480, 0x000500C3, 0x0000000C, 0x00003A6F, 0x00005E63, 0x00000A1A,\n    0x000500C7, 0x0000000C, 0x000018BB, 0x00003A6F, 0x00000A20, 0x000500C4,\n    0x0000000C, 0x00005481, 0x000018BB, 0x00000A23, 0x000500C5, 0x0000000C,\n    0x00004570, 0x000045A9, 0x00005481, 0x000500C3, 0x0000000C, 0x00003C89,\n    0x00005E63, 0x00000A23, 0x000500C4, 0x0000000C, 0x00002825, 0x00003C89,\n    0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B7A, 0x00004570, 0x00002825,\n    0x0004007C, 0x0000000B, 0x000041E6, 0x00003B7A, 0x000200F9, 0x00005BF0,\n    0x000200F8, 0x00005BF0, 0x000700F5, 0x0000000B, 0x0000292C, 0x000041E5,\n    0x00002C92, 0x000041E6, 0x00005F21, 0x000200F9, 0x00004A60, 0x000200F8,\n    0x00004A60, 0x000700F5, 0x0000000B, 0x00002C70, 0x00002C67, 0x0000260D,\n    0x0000292C, 0x00005BF0, 0x00050080, 0x0000000B, 0x000048BD, 0x00002C70,\n    0x00005EAC, 0x000500C2, 0x0000000B, 0x00003D52, 0x000048BD, 0x00000A17,\n    0x00060041, 0x00000294, 0x00004FAF, 0x0000107A, 0x00000A0B, 0x00003D52,\n    0x0004003D, 0x00000017, 0x00002261, 0x00004FAF, 0x000500AA, 0x00000009,\n    0x00005272, 0x000061E2, 0x00000A0D, 0x000300F7, 0x0000362B, 0x00000000,\n    0x000400FA, 0x00005272, 0x00002957, 0x0000362B, 0x000200F8, 0x00002957,\n    0x000500C7, 0x00000017, 0x0000475F, 0x00002261, 0x000009CE, 0x000500C4,\n    0x00000017, 0x000024D1, 0x0000475F, 0x0000013D, 0x000500C7, 0x00000017,\n    0x000050AC, 0x00002261, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448D,\n    0x000050AC, 0x0000013D, 0x000500C5, 0x00000017, 0x00003FF8, 0x000024D1,\n    0x0000448D, 0x000200F9, 0x0000362B, 0x000200F8, 0x0000362B, 0x000700F5,\n    0x00000017, 0x00004AB4, 0x00002261, 0x00004A60, 0x00003FF8, 0x00002957,\n    0x000500C2, 0x0000000B, 0x00001BB7, 0x000038F6, 0x00000A17, 0x000500C7,\n    0x00000017, 0x000030B2, 0x00004AB4, 0x000009F1, 0x000500C7, 0x00000017,\n    0x00004943, 0x00004AB4, 0x0000001B, 0x000500C4, 0x00000017, 0x00006164,\n    0x00004943, 0x000001DF, 0x000500C5, 0x00000017, 0x00004295, 0x000030B2,\n    0x00006164, 0x000500C7, 0x00000017, 0x000052DC, 0x00004AB4, 0x0000067D,\n    0x000500C2, 0x00000017, 0x000046A8, 0x000052DC, 0x000001DF, 0x000500C5,\n    0x00000017, 0x00001984, 0x00004295, 0x000046A8, 0x00060041, 0x00000294,\n    0x00004F1E, 0x0000140E, 0x00000A0B, 0x00001BB7, 0x0003003E, 0x00004F1E,\n    0x00001984, 0x00050080, 0x0000000B, 0x000054B5, 0x000038F6, 0x00000A3A,\n    0x000300F7, 0x00006070, 0x00000002, 0x000400FA, 0x00004376, 0x000055E9,\n    0x00001C25, 0x000200F8, 0x000055E9, 0x000200F9, 0x00006070, 0x000200F8,\n    0x00001C25, 0x000200F9, 0x00006070, 0x000200F8, 0x00006070, 0x000700F5,\n    0x0000000B, 0x00002C71, 0x00000ACA, 0x000055E9, 0x00000A3A, 0x00001C25,\n    0x00050080, 0x0000000B, 0x000048BE, 0x000048BD, 0x00002C71, 0x000500C2,\n    0x0000000B, 0x00003D53, 0x000048BE, 0x00000A17, 0x00060041, 0x00000294,\n    0x00005566, 0x0000107A, 0x00000A0B, 0x00003D53, 0x0004003D, 0x00000017,\n    0x00003910, 0x00005566, 0x000300F7, 0x0000362C, 0x00000000, 0x000400FA,\n    0x00005272, 0x00002958, 0x0000362C, 0x000200F8, 0x00002958, 0x000500C7,\n    0x00000017, 0x00004760, 0x00003910, 0x000009CE, 0x000500C4, 0x00000017,\n    0x000024D2, 0x00004760, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AD,\n    0x00003910, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448E, 0x000050AD,\n    0x0000013D, 0x000500C5, 0x00000017, 0x00003FF9, 0x000024D2, 0x0000448E,\n    0x000200F9, 0x0000362C, 0x000200F8, 0x0000362C, 0x000700F5, 0x00000017,\n    0x00004AB5, 0x00003910, 0x00006070, 0x00003FF9, 0x00002958, 0x000500C2,\n    0x0000000B, 0x00001BB8, 0x000054B5, 0x00000A17, 0x000500C7, 0x00000017,\n    0x000030B3, 0x00004AB5, 0x000009F1, 0x000500C7, 0x00000017, 0x00004944,\n    0x00004AB5, 0x0000001B, 0x000500C4, 0x00000017, 0x00006165, 0x00004944,\n    0x000001DF, 0x000500C5, 0x00000017, 0x00004296, 0x000030B3, 0x00006165,\n    0x000500C7, 0x00000017, 0x000052DD, 0x00004AB5, 0x0000067D, 0x000500C2,\n    0x00000017, 0x000046A9, 0x000052DD, 0x000001DF, 0x000500C5, 0x00000017,\n    0x00001985, 0x00004296, 0x000046A9, 0x00060041, 0x00000294, 0x00005819,\n    0x0000140E, 0x00000A0B, 0x00001BB8, 0x0003003E, 0x00005819, 0x00001985,\n    0x000200F9, 0x00004C7A, 0x000200F8, 0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_r5g6b5_b5g6r5_scaled_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25157\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n     %v4uint = OpTypeVector %uint 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v3uint = OpTypeVector %uint 3\n%uint_132122592 = OpConstant %uint 132122592\n%uint_2031647 = OpConstant %uint 2031647\n    %uint_11 = OpConstant %uint 11\n%uint_4160813056 = OpConstant %uint 4160813056\n     %uint_1 = OpConstant %uint 1\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n     %uint_0 = OpConstant %uint 0\n      %int_3 = OpConstant %int 3\n     %uint_2 = OpConstant %uint 2\n      %int_2 = OpConstant %int 2\n     %uint_3 = OpConstant %uint 3\n     %uint_5 = OpConstant %uint 5\n     %uint_4 = OpConstant %uint 4\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n     %uint_7 = OpConstant %uint 7\n       %1927 = OpConstantComposite %v2uint %uint_4 %uint_7\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %2612 = OpConstantComposite %v3uint %uint_4 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n    %uint_16 = OpConstant %uint 16\n    %uint_32 = OpConstant %uint 32\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %1954 = OpConstantComposite %v2uint %uint_7 %uint_7\n       %1867 = OpConstantComposite %v2uint %uint_4 %uint_2\n    %uint_15 = OpConstant %uint 15\n       %1978 = OpConstantComposite %v2uint %uint_15 %uint_3\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n       %2545 = OpConstantComposite %v4uint %uint_132122592 %uint_132122592 %uint_132122592 %uint_132122592\n         %27 = OpConstantComposite %v4uint %uint_2031647 %uint_2031647 %uint_2031647 %uint_2031647\n        %479 = OpConstantComposite %v4uint %uint_11 %uint_11 %uint_11 %uint_11\n       %1661 = OpConstantComposite %v4uint %uint_4160813056 %uint_4160813056 %uint_4160813056 %uint_4160813056\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24445 = OpBitwiseAnd %uint %13606 %uint_2\n      %18667 = OpINotEqual %bool %24445 %uint_0\n       %8141 = OpShiftRightLogical %uint %13606 %uint_2\n      %24990 = OpBitwiseAnd %uint %8141 %uint_3\n       %8871 = OpCompositeConstruct %v2uint %13606 %13606\n       %7087 = OpShiftRightLogical %v2uint %8871 %1927\n       %6551 = OpBitwiseAnd %v2uint %7087 %1954\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2612\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %6586 DontFlatten\n               OpBranchConditional %24679 %21992 %6586\n      %21992 = OpLabel\n               OpBranch %19578\n       %6586 = OpLabel\n      %23478 = OpBitcast %v3int %21387\n      %18710 = OpCompositeExtract %uint %22410 1\n      %23531 = OpCompositeExtract %int %23478 0\n      %22810 = OpIMul %int %23531 %int_2\n       %6362 = OpCompositeExtract %int %23478 2\n      %14505 = OpBitcast %int %18710\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %23478 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %6594\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %22810 %24535\n      %10898 = OpBitcast %uint %8258\n       %7937 = OpIAdd %uint %22411 %10898\n      %19921 = OpShiftRightLogical %v2uint %17136 %1867\n       %7712 = OpUDiv %v2uint %19921 %6551\n      %18183 = OpIMul %v2uint %6551 %7712\n      %18273 = OpISub %v2uint %19921 %18183\n      %11232 = OpShiftLeftLogical %v2uint %7712 %1867\n      %13284 = OpCompositeExtract %uint %18273 0\n      %10872 = OpCompositeExtract %uint %6551 1\n      %22886 = OpIMul %uint %13284 %10872\n       %6943 = OpCompositeExtract %uint %18273 1\n      %10469 = OpIAdd %uint %22886 %6943\n      %18851 = OpBitwiseAnd %v2uint %17136 %1978\n      %10581 = OpShiftLeftLogical %uint %10469 %uint_7\n      %20916 = OpCompositeExtract %uint %18851 1\n      %23596 = OpShiftLeftLogical %uint %20916 %uint_5\n      %19814 = OpBitwiseOr %uint %10581 %23596\n      %21476 = OpCompositeExtract %uint %18851 0\n       %8560 = OpShiftLeftLogical %uint %21476 %uint_1\n      %17648 = OpBitwiseOr %uint %19814 %8560\n      %19923 = OpCompositeExtract %uint %11232 0\n      %15556 = OpCompositeInsert %v3uint %19923 %21387 0\n      %23006 = OpCompositeExtract %uint %11232 1\n       %9680 = OpCompositeInsert %v3uint %23006 %15556 1\n               OpSelectionMerge %20344 DontFlatten\n               OpBranchConditional %18667 %23520 %11737\n      %23520 = OpLabel\n      %10111 = OpBitcast %v3int %9680\n      %19476 = OpShiftRightLogical %uint %22408 %int_5\n      %18810 = OpShiftRightLogical %uint %22409 %int_4\n       %6782 = OpCompositeExtract %int %10111 2\n      %12089 = OpShiftRightArithmetic %int %6782 %int_2\n      %22400 = OpBitcast %int %18810\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %10111 1\n      %19055 = OpShiftRightArithmetic %int %25154 %int_4\n      %11052 = OpIAdd %int %7938 %19055\n      %16898 = OpBitcast %int %19476\n      %14944 = OpIMul %int %11052 %16898\n      %25155 = OpCompositeExtract %int %10111 0\n      %20423 = OpShiftRightArithmetic %int %25155 %int_5\n      %18940 = OpIAdd %int %14944 %20423\n       %8797 = OpShiftLeftLogical %int %18940 %int_7\n      %11434 = OpBitwiseAnd %int %6782 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %25154 %int_1\n      %21364 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21364 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %25155 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17334 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17334 %uint_1\n      %13015 = OpShiftRightArithmetic %int %25154 %int_3\n       %9929 = OpBitwiseXor %int %13015 %12089\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %25155 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %25154 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6552 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6552\n       %7168 = OpShiftLeftLogical %int %16793 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24144 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24144 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24144 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24144 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %20344\n      %11737 = OpLabel\n      %11908 = OpVectorShuffle %v2uint %9680 %9680 0 1\n      %20347 = OpBitcast %v2int %11908\n      %11433 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %20347 1\n      %12090 = OpShiftRightArithmetic %int %14597 %int_5\n      %22401 = OpBitcast %int %11433\n       %7939 = OpIMul %int %12090 %22401\n      %25156 = OpCompositeExtract %int %20347 0\n      %20424 = OpShiftRightArithmetic %int %25156 %int_5\n      %18864 = OpIAdd %int %7939 %20424\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25156 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17335 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17335 %uint_1\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25156 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6553 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6553\n       %7169 = OpShiftLeftLogical %int %21575 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24163 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24163 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24163 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %20344\n      %20344 = OpLabel\n      %18329 = OpPhi %uint %16869 %23520 %16870 %11737\n      %15200 = OpCompositeExtract %uint %6551 0\n      %17489 = OpIMul %uint %15200 %10872\n       %7313 = OpIMul %uint %18329 %17489\n       %8815 = OpIAdd %uint %7313 %17648\n      %21470 = OpIAdd %uint %8815 %24236\n      %14664 = OpShiftRightLogical %uint %21470 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %14664\n       %8801 = OpLoad %v4uint %20399\n      %21106 = OpIEqual %bool %24990 %uint_1\n               OpSelectionMerge %13867 None\n               OpBranchConditional %21106 %10583 %13867\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %8801 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %8801 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13867\n      %13867 = OpLabel\n      %19124 = OpPhi %v4uint %8801 %20344 %16376 %10583\n       %7095 = OpShiftRightLogical %uint %7937 %int_4\n      %12466 = OpBitwiseAnd %v4uint %19124 %2545\n      %18755 = OpBitwiseAnd %v4uint %19124 %27\n      %24932 = OpShiftLeftLogical %v4uint %18755 %479\n      %17045 = OpBitwiseOr %v4uint %12466 %24932\n      %21212 = OpBitwiseAnd %v4uint %19124 %1661\n      %18088 = OpShiftRightLogical %v4uint %21212 %479\n       %6532 = OpBitwiseOr %v4uint %17045 %18088\n      %20254 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %7095\n               OpStore %20254 %6532\n      %22137 = OpIAdd %uint %7937 %uint_16\n      %10214 = OpIAdd %uint %21470 %uint_16\n      %14665 = OpShiftRightLogical %uint %10214 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %14665\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %13868 None\n               OpBranchConditional %21106 %10584 %13868\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %13868\n      %13868 = OpLabel\n      %19125 = OpPhi %v4uint %14608 %13867 %16377 %10584\n       %7096 = OpShiftRightLogical %uint %22137 %int_4\n      %12467 = OpBitwiseAnd %v4uint %19125 %2545\n      %18756 = OpBitwiseAnd %v4uint %19125 %27\n      %24933 = OpShiftLeftLogical %v4uint %18756 %479\n      %17046 = OpBitwiseOr %v4uint %12467 %24933\n      %21213 = OpBitwiseAnd %v4uint %19125 %1661\n      %18089 = OpShiftRightLogical %v4uint %21213 %479\n       %6533 = OpBitwiseOr %v4uint %17046 %18089\n      %22553 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %7096\n               OpStore %22553 %6533\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_r5g6b5_b5g6r5_scaled_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006245, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000017,\n    0x0000000B, 0x00000004, 0x00040015, 0x0000000C, 0x00000020, 0x00000001,\n    0x00040017, 0x00000012, 0x0000000C, 0x00000002, 0x00040017, 0x00000016,\n    0x0000000C, 0x00000003, 0x00020014, 0x00000009, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x0004002B, 0x0000000B, 0x00000902, 0x07E007E0,\n    0x0004002B, 0x0000000B, 0x000000EC, 0x001F001F, 0x0004002B, 0x0000000B,\n    0x00000A2B, 0x0000000B, 0x0004002B, 0x0000000B, 0x000002FC, 0xF800F800,\n    0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B,\n    0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B, 0x00000A22, 0x00000008,\n    0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00, 0x0004002B, 0x0000000C,\n    0x00000A17, 0x00000004, 0x0004002B, 0x0000000C, 0x00000A1D, 0x00000006,\n    0x0004002B, 0x0000000C, 0x00000A2C, 0x0000000B, 0x0004002B, 0x0000000C,\n    0x00000A38, 0x0000000F, 0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001,\n    0x0004002B, 0x0000000C, 0x00000A1A, 0x00000005, 0x0004002B, 0x0000000C,\n    0x00000A20, 0x00000007, 0x0004002B, 0x0000000C, 0x00000A23, 0x00000008,\n    0x0004002B, 0x0000000C, 0x00000A2F, 0x0000000C, 0x0004002B, 0x0000000B,\n    0x00000A0A, 0x00000000, 0x0004002B, 0x0000000C, 0x00000A14, 0x00000003,\n    0x0004002B, 0x0000000B, 0x00000A10, 0x00000002, 0x0004002B, 0x0000000C,\n    0x00000A11, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A13, 0x00000003,\n    0x0004002B, 0x0000000B, 0x00000A19, 0x00000005, 0x0004002B, 0x0000000B,\n    0x00000A16, 0x00000004, 0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000,\n    0x000A001E, 0x00000489, 0x0000000B, 0x0000000B, 0x0000000B, 0x0000000B,\n    0x00000014, 0x0000000B, 0x0000000B, 0x0000000B, 0x00040020, 0x00000706,\n    0x00000009, 0x00000489, 0x0004003B, 0x00000706, 0x00000CE9, 0x00000009,\n    0x00040020, 0x00000288, 0x00000009, 0x0000000B, 0x0004002B, 0x0000000B,\n    0x00000A1F, 0x00000007, 0x0005002C, 0x00000011, 0x00000787, 0x00000A16,\n    0x00000A1F, 0x00040020, 0x00000291, 0x00000009, 0x00000014, 0x00040020,\n    0x00000292, 0x00000001, 0x00000014, 0x0004003B, 0x00000292, 0x00000F48,\n    0x00000001, 0x0006002C, 0x00000014, 0x00000A34, 0x00000A16, 0x00000A0A,\n    0x00000A0A, 0x00040017, 0x0000000F, 0x00000009, 0x00000002, 0x0003001D,\n    0x000007DC, 0x00000017, 0x0003001E, 0x000007B4, 0x000007DC, 0x00040020,\n    0x00000A31, 0x00000002, 0x000007B4, 0x0004003B, 0x00000A31, 0x0000107A,\n    0x00000002, 0x00040020, 0x00000294, 0x00000002, 0x00000017, 0x0003001D,\n    0x000007DD, 0x00000017, 0x0003001E, 0x000007B5, 0x000007DD, 0x00040020,\n    0x00000A32, 0x00000002, 0x000007B5, 0x0004003B, 0x00000A32, 0x0000140E,\n    0x00000002, 0x0004002B, 0x0000000B, 0x00000A3A, 0x00000010, 0x0004002B,\n    0x0000000B, 0x00000A6A, 0x00000020, 0x0006002C, 0x00000014, 0x00000BC3,\n    0x00000A16, 0x00000A6A, 0x00000A0D, 0x0005002C, 0x00000011, 0x000007A2,\n    0x00000A1F, 0x00000A1F, 0x0005002C, 0x00000011, 0x0000074B, 0x00000A16,\n    0x00000A10, 0x0004002B, 0x0000000B, 0x00000A37, 0x0000000F, 0x0005002C,\n    0x00000011, 0x000007BA, 0x00000A37, 0x00000A13, 0x0007002C, 0x00000017,\n    0x000009CE, 0x000008A6, 0x000008A6, 0x000008A6, 0x000008A6, 0x0007002C,\n    0x00000017, 0x0000013D, 0x00000A22, 0x00000A22, 0x00000A22, 0x00000A22,\n    0x0007002C, 0x00000017, 0x0000072E, 0x000005FD, 0x000005FD, 0x000005FD,\n    0x000005FD, 0x0007002C, 0x00000017, 0x000009F1, 0x00000902, 0x00000902,\n    0x00000902, 0x00000902, 0x0007002C, 0x00000017, 0x0000001B, 0x000000EC,\n    0x000000EC, 0x000000EC, 0x000000EC, 0x0007002C, 0x00000017, 0x000001DF,\n    0x00000A2B, 0x00000A2B, 0x00000A2B, 0x00000A2B, 0x0007002C, 0x00000017,\n    0x0000067D, 0x000002FC, 0x000002FC, 0x000002FC, 0x000002FC, 0x00050036,\n    0x00000008, 0x0000161F, 0x00000000, 0x00000502, 0x000200F8, 0x00003B06,\n    0x000300F7, 0x00004C7A, 0x00000000, 0x000300FB, 0x00000A0A, 0x00002E68,\n    0x000200F8, 0x00002E68, 0x00050041, 0x00000288, 0x000060D7, 0x00000CE9,\n    0x00000A0B, 0x0004003D, 0x0000000B, 0x00003526, 0x000060D7, 0x000500C7,\n    0x0000000B, 0x00005F7D, 0x00003526, 0x00000A10, 0x000500AB, 0x00000009,\n    0x000048EB, 0x00005F7D, 0x00000A0A, 0x000500C2, 0x0000000B, 0x00001FCD,\n    0x00003526, 0x00000A10, 0x000500C7, 0x0000000B, 0x0000619E, 0x00001FCD,\n    0x00000A13, 0x00050050, 0x00000011, 0x000022A7, 0x00003526, 0x00003526,\n    0x000500C2, 0x00000011, 0x00001BAF, 0x000022A7, 0x00000787, 0x000500C7,\n    0x00000011, 0x00001997, 0x00001BAF, 0x000007A2, 0x00050041, 0x00000288,\n    0x0000492C, 0x00000CE9, 0x00000A0E, 0x0004003D, 0x0000000B, 0x00005EAC,\n    0x0000492C, 0x00050041, 0x00000288, 0x00004EBA, 0x00000CE9, 0x00000A11,\n    0x0004003D, 0x0000000B, 0x00005788, 0x00004EBA, 0x00050041, 0x00000288,\n    0x00004EBB, 0x00000CE9, 0x00000A14, 0x0004003D, 0x0000000B, 0x00005789,\n    0x00004EBB, 0x00050041, 0x00000291, 0x00004EBC, 0x00000CE9, 0x00000A17,\n    0x0004003D, 0x00000014, 0x0000578A, 0x00004EBC, 0x00050041, 0x00000288,\n    0x00004EBD, 0x00000CE9, 0x00000A1A, 0x0004003D, 0x0000000B, 0x0000578B,\n    0x00004EBD, 0x00050041, 0x00000288, 0x00004E6E, 0x00000CE9, 0x00000A1D,\n    0x0004003D, 0x0000000B, 0x000019C2, 0x00004E6E, 0x0004003D, 0x00000014,\n    0x00002A0E, 0x00000F48, 0x000500C4, 0x00000014, 0x0000538B, 0x00002A0E,\n    0x00000A34, 0x0007004F, 0x00000011, 0x000042F0, 0x0000538B, 0x0000538B,\n    0x00000000, 0x00000001, 0x0007004F, 0x00000011, 0x0000242F, 0x0000578A,\n    0x0000578A, 0x00000000, 0x00000001, 0x000500AE, 0x0000000F, 0x00004288,\n    0x000042F0, 0x0000242F, 0x0004009A, 0x00000009, 0x00006067, 0x00004288,\n    0x000300F7, 0x000019BA, 0x00000002, 0x000400FA, 0x00006067, 0x000055E8,\n    0x000019BA, 0x000200F8, 0x000055E8, 0x000200F9, 0x00004C7A, 0x000200F8,\n    0x000019BA, 0x0004007C, 0x00000016, 0x00005BB6, 0x0000538B, 0x00050051,\n    0x0000000B, 0x00004916, 0x0000578A, 0x00000001, 0x00050051, 0x0000000C,\n    0x00005BEB, 0x00005BB6, 0x00000000, 0x00050084, 0x0000000C, 0x0000591A,\n    0x00005BEB, 0x00000A11, 0x00050051, 0x0000000C, 0x000018DA, 0x00005BB6,\n    0x00000002, 0x0004007C, 0x0000000C, 0x000038A9, 0x00004916, 0x00050084,\n    0x0000000C, 0x00002C0F, 0x000018DA, 0x000038A9, 0x00050051, 0x0000000C,\n    0x000044BE, 0x00005BB6, 0x00000001, 0x00050080, 0x0000000C, 0x000056D4,\n    0x00002C0F, 0x000044BE, 0x0004007C, 0x0000000C, 0x00005785, 0x000019C2,\n    0x00050084, 0x0000000C, 0x00005FD7, 0x000056D4, 0x00005785, 0x00050080,\n    0x0000000C, 0x00002042, 0x0000591A, 0x00005FD7, 0x0004007C, 0x0000000B,\n    0x00002A92, 0x00002042, 0x00050080, 0x0000000B, 0x00001F01, 0x0000578B,\n    0x00002A92, 0x000500C2, 0x00000011, 0x00004DD1, 0x000042F0, 0x0000074B,\n    0x00050086, 0x00000011, 0x00001E20, 0x00004DD1, 0x00001997, 0x00050084,\n    0x00000011, 0x00004707, 0x00001997, 0x00001E20, 0x00050082, 0x00000011,\n    0x00004761, 0x00004DD1, 0x00004707, 0x000500C4, 0x00000011, 0x00002BE0,\n    0x00001E20, 0x0000074B, 0x00050051, 0x0000000B, 0x000033E4, 0x00004761,\n    0x00000000, 0x00050051, 0x0000000B, 0x00002A78, 0x00001997, 0x00000001,\n    0x00050084, 0x0000000B, 0x00005966, 0x000033E4, 0x00002A78, 0x00050051,\n    0x0000000B, 0x00001B1F, 0x00004761, 0x00000001, 0x00050080, 0x0000000B,\n    0x000028E5, 0x00005966, 0x00001B1F, 0x000500C7, 0x00000011, 0x000049A3,\n    0x000042F0, 0x000007BA, 0x000500C4, 0x0000000B, 0x00002955, 0x000028E5,\n    0x00000A1F, 0x00050051, 0x0000000B, 0x000051B4, 0x000049A3, 0x00000001,\n    0x000500C4, 0x0000000B, 0x00005C2C, 0x000051B4, 0x00000A19, 0x000500C5,\n    0x0000000B, 0x00004D66, 0x00002955, 0x00005C2C, 0x00050051, 0x0000000B,\n    0x000053E4, 0x000049A3, 0x00000000, 0x000500C4, 0x0000000B, 0x00002170,\n    0x000053E4, 0x00000A0D, 0x000500C5, 0x0000000B, 0x000044F0, 0x00004D66,\n    0x00002170, 0x00050051, 0x0000000B, 0x00004DD3, 0x00002BE0, 0x00000000,\n    0x00060052, 0x00000014, 0x00003CC4, 0x00004DD3, 0x0000538B, 0x00000000,\n    0x00050051, 0x0000000B, 0x000059DE, 0x00002BE0, 0x00000001, 0x00060052,\n    0x00000014, 0x000025D0, 0x000059DE, 0x00003CC4, 0x00000001, 0x000300F7,\n    0x00004F78, 0x00000002, 0x000400FA, 0x000048EB, 0x00005BE0, 0x00002DD9,\n    0x000200F8, 0x00005BE0, 0x0004007C, 0x00000016, 0x0000277F, 0x000025D0,\n    0x000500C2, 0x0000000B, 0x00004C14, 0x00005788, 0x00000A1A, 0x000500C2,\n    0x0000000B, 0x0000497A, 0x00005789, 0x00000A17, 0x00050051, 0x0000000C,\n    0x00001A7E, 0x0000277F, 0x00000002, 0x000500C3, 0x0000000C, 0x00002F39,\n    0x00001A7E, 0x00000A11, 0x0004007C, 0x0000000C, 0x00005780, 0x0000497A,\n    0x00050084, 0x0000000C, 0x00001F02, 0x00002F39, 0x00005780, 0x00050051,\n    0x0000000C, 0x00006242, 0x0000277F, 0x00000001, 0x000500C3, 0x0000000C,\n    0x00004A6F, 0x00006242, 0x00000A17, 0x00050080, 0x0000000C, 0x00002B2C,\n    0x00001F02, 0x00004A6F, 0x0004007C, 0x0000000C, 0x00004202, 0x00004C14,\n    0x00050084, 0x0000000C, 0x00003A60, 0x00002B2C, 0x00004202, 0x00050051,\n    0x0000000C, 0x00006243, 0x0000277F, 0x00000000, 0x000500C3, 0x0000000C,\n    0x00004FC7, 0x00006243, 0x00000A1A, 0x00050080, 0x0000000C, 0x000049FC,\n    0x00003A60, 0x00004FC7, 0x000500C4, 0x0000000C, 0x0000225D, 0x000049FC,\n    0x00000A20, 0x000500C7, 0x0000000C, 0x00002CAA, 0x00001A7E, 0x00000A14,\n    0x000500C4, 0x0000000C, 0x00004CAE, 0x00002CAA, 0x00000A1A, 0x000500C3,\n    0x0000000C, 0x0000383E, 0x00006242, 0x00000A0E, 0x000500C7, 0x0000000C,\n    0x00005374, 0x0000383E, 0x00000A14, 0x000500C4, 0x0000000C, 0x000054CA,\n    0x00005374, 0x00000A14, 0x000500C5, 0x0000000C, 0x000042CE, 0x00004CAE,\n    0x000054CA, 0x000500C7, 0x0000000C, 0x000050D5, 0x00006243, 0x00000A20,\n    0x000500C5, 0x0000000C, 0x00003ADD, 0x000042CE, 0x000050D5, 0x000500C5,\n    0x0000000C, 0x000043B6, 0x0000225D, 0x00003ADD, 0x000500C4, 0x0000000C,\n    0x00005E50, 0x000043B6, 0x00000A0D, 0x000500C3, 0x0000000C, 0x000032D7,\n    0x00006242, 0x00000A14, 0x000500C6, 0x0000000C, 0x000026C9, 0x000032D7,\n    0x00002F39, 0x000500C7, 0x0000000C, 0x00004199, 0x000026C9, 0x00000A0E,\n    0x000500C3, 0x0000000C, 0x00002590, 0x00006243, 0x00000A14, 0x000500C7,\n    0x0000000C, 0x0000505E, 0x00002590, 0x00000A14, 0x000500C4, 0x0000000C,\n    0x0000541D, 0x00004199, 0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BA,\n    0x0000505E, 0x0000541D, 0x000500C7, 0x0000000C, 0x00005076, 0x00006242,\n    0x00000A0E, 0x000500C4, 0x0000000C, 0x00005228, 0x00005076, 0x00000A17,\n    0x000500C4, 0x0000000C, 0x00001998, 0x000022BA, 0x00000A1D, 0x000500C5,\n    0x0000000C, 0x000047FE, 0x00005228, 0x00001998, 0x000500C4, 0x0000000C,\n    0x00001C00, 0x00004199, 0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C81,\n    0x000047FE, 0x00001C00, 0x000500C7, 0x0000000C, 0x000050AF, 0x00005E50,\n    0x00000A38, 0x000500C5, 0x0000000C, 0x00003C70, 0x00003C81, 0x000050AF,\n    0x000500C3, 0x0000000C, 0x00003745, 0x00005E50, 0x00000A17, 0x000500C7,\n    0x0000000C, 0x000018B8, 0x00003745, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x0000547E, 0x000018B8, 0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A8,\n    0x00003C70, 0x0000547E, 0x000500C3, 0x0000000C, 0x00003A6E, 0x00005E50,\n    0x00000A1A, 0x000500C7, 0x0000000C, 0x000018B9, 0x00003A6E, 0x00000A20,\n    0x000500C4, 0x0000000C, 0x0000547F, 0x000018B9, 0x00000A23, 0x000500C5,\n    0x0000000C, 0x0000456F, 0x000045A8, 0x0000547F, 0x000500C3, 0x0000000C,\n    0x00003C88, 0x00005E50, 0x00000A23, 0x000500C4, 0x0000000C, 0x00002824,\n    0x00003C88, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B79, 0x0000456F,\n    0x00002824, 0x0004007C, 0x0000000B, 0x000041E5, 0x00003B79, 0x000200F9,\n    0x00004F78, 0x000200F8, 0x00002DD9, 0x0007004F, 0x00000011, 0x00002E84,\n    0x000025D0, 0x000025D0, 0x00000000, 0x00000001, 0x0004007C, 0x00000012,\n    0x00004F7B, 0x00002E84, 0x000500C2, 0x0000000B, 0x00002CA9, 0x00005788,\n    0x00000A1A, 0x00050051, 0x0000000C, 0x00003905, 0x00004F7B, 0x00000001,\n    0x000500C3, 0x0000000C, 0x00002F3A, 0x00003905, 0x00000A1A, 0x0004007C,\n    0x0000000C, 0x00005781, 0x00002CA9, 0x00050084, 0x0000000C, 0x00001F03,\n    0x00002F3A, 0x00005781, 0x00050051, 0x0000000C, 0x00006244, 0x00004F7B,\n    0x00000000, 0x000500C3, 0x0000000C, 0x00004FC8, 0x00006244, 0x00000A1A,\n    0x00050080, 0x0000000C, 0x000049B0, 0x00001F03, 0x00004FC8, 0x000500C4,\n    0x0000000C, 0x0000254A, 0x000049B0, 0x00000A1D, 0x000500C3, 0x0000000C,\n    0x0000603B, 0x00003905, 0x00000A0E, 0x000500C7, 0x0000000C, 0x0000539A,\n    0x0000603B, 0x00000A20, 0x000500C4, 0x0000000C, 0x0000534A, 0x0000539A,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x00004EA5, 0x00006244, 0x00000A20,\n    0x000500C5, 0x0000000C, 0x00002B1A, 0x0000534A, 0x00004EA5, 0x000500C5,\n    0x0000000C, 0x000043B7, 0x0000254A, 0x00002B1A, 0x000500C4, 0x0000000C,\n    0x00005E63, 0x000043B7, 0x00000A0D, 0x000500C3, 0x0000000C, 0x000031DE,\n    0x00003905, 0x00000A17, 0x000500C7, 0x0000000C, 0x00005447, 0x000031DE,\n    0x00000A0E, 0x000500C3, 0x0000000C, 0x000028A6, 0x00006244, 0x00000A14,\n    0x000500C7, 0x0000000C, 0x0000511E, 0x000028A6, 0x00000A14, 0x000500C3,\n    0x0000000C, 0x000028B9, 0x00003905, 0x00000A14, 0x000500C7, 0x0000000C,\n    0x0000505F, 0x000028B9, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000541E,\n    0x0000505F, 0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BB, 0x0000511E,\n    0x0000541E, 0x000500C7, 0x0000000C, 0x00005077, 0x00003905, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x00005229, 0x00005077, 0x00000A17, 0x000500C4,\n    0x0000000C, 0x00001999, 0x000022BB, 0x00000A1D, 0x000500C5, 0x0000000C,\n    0x000047FF, 0x00005229, 0x00001999, 0x000500C4, 0x0000000C, 0x00001C01,\n    0x00005447, 0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C82, 0x000047FF,\n    0x00001C01, 0x000500C7, 0x0000000C, 0x000050B0, 0x00005E63, 0x00000A38,\n    0x000500C5, 0x0000000C, 0x00003C71, 0x00003C82, 0x000050B0, 0x000500C3,\n    0x0000000C, 0x00003746, 0x00005E63, 0x00000A17, 0x000500C7, 0x0000000C,\n    0x000018BA, 0x00003746, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005480,\n    0x000018BA, 0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A9, 0x00003C71,\n    0x00005480, 0x000500C3, 0x0000000C, 0x00003A6F, 0x00005E63, 0x00000A1A,\n    0x000500C7, 0x0000000C, 0x000018BB, 0x00003A6F, 0x00000A20, 0x000500C4,\n    0x0000000C, 0x00005481, 0x000018BB, 0x00000A23, 0x000500C5, 0x0000000C,\n    0x00004570, 0x000045A9, 0x00005481, 0x000500C3, 0x0000000C, 0x00003C89,\n    0x00005E63, 0x00000A23, 0x000500C4, 0x0000000C, 0x00002825, 0x00003C89,\n    0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B7A, 0x00004570, 0x00002825,\n    0x0004007C, 0x0000000B, 0x000041E6, 0x00003B7A, 0x000200F9, 0x00004F78,\n    0x000200F8, 0x00004F78, 0x000700F5, 0x0000000B, 0x00004799, 0x000041E5,\n    0x00005BE0, 0x000041E6, 0x00002DD9, 0x00050051, 0x0000000B, 0x00003B60,\n    0x00001997, 0x00000000, 0x00050084, 0x0000000B, 0x00004451, 0x00003B60,\n    0x00002A78, 0x00050084, 0x0000000B, 0x00001C91, 0x00004799, 0x00004451,\n    0x00050080, 0x0000000B, 0x0000226F, 0x00001C91, 0x000044F0, 0x00050080,\n    0x0000000B, 0x000053DE, 0x0000226F, 0x00005EAC, 0x000500C2, 0x0000000B,\n    0x00003948, 0x000053DE, 0x00000A17, 0x00060041, 0x00000294, 0x00004FAF,\n    0x0000107A, 0x00000A0B, 0x00003948, 0x0004003D, 0x00000017, 0x00002261,\n    0x00004FAF, 0x000500AA, 0x00000009, 0x00005272, 0x0000619E, 0x00000A0D,\n    0x000300F7, 0x0000362B, 0x00000000, 0x000400FA, 0x00005272, 0x00002957,\n    0x0000362B, 0x000200F8, 0x00002957, 0x000500C7, 0x00000017, 0x0000475F,\n    0x00002261, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D1, 0x0000475F,\n    0x0000013D, 0x000500C7, 0x00000017, 0x000050AC, 0x00002261, 0x0000072E,\n    0x000500C2, 0x00000017, 0x0000448D, 0x000050AC, 0x0000013D, 0x000500C5,\n    0x00000017, 0x00003FF8, 0x000024D1, 0x0000448D, 0x000200F9, 0x0000362B,\n    0x000200F8, 0x0000362B, 0x000700F5, 0x00000017, 0x00004AB4, 0x00002261,\n    0x00004F78, 0x00003FF8, 0x00002957, 0x000500C2, 0x0000000B, 0x00001BB7,\n    0x00001F01, 0x00000A17, 0x000500C7, 0x00000017, 0x000030B2, 0x00004AB4,\n    0x000009F1, 0x000500C7, 0x00000017, 0x00004943, 0x00004AB4, 0x0000001B,\n    0x000500C4, 0x00000017, 0x00006164, 0x00004943, 0x000001DF, 0x000500C5,\n    0x00000017, 0x00004295, 0x000030B2, 0x00006164, 0x000500C7, 0x00000017,\n    0x000052DC, 0x00004AB4, 0x0000067D, 0x000500C2, 0x00000017, 0x000046A8,\n    0x000052DC, 0x000001DF, 0x000500C5, 0x00000017, 0x00001984, 0x00004295,\n    0x000046A8, 0x00060041, 0x00000294, 0x00004F1E, 0x0000140E, 0x00000A0B,\n    0x00001BB7, 0x0003003E, 0x00004F1E, 0x00001984, 0x00050080, 0x0000000B,\n    0x00005679, 0x00001F01, 0x00000A3A, 0x00050080, 0x0000000B, 0x000027E6,\n    0x000053DE, 0x00000A3A, 0x000500C2, 0x0000000B, 0x00003949, 0x000027E6,\n    0x00000A17, 0x00060041, 0x00000294, 0x00005566, 0x0000107A, 0x00000A0B,\n    0x00003949, 0x0004003D, 0x00000017, 0x00003910, 0x00005566, 0x000300F7,\n    0x0000362C, 0x00000000, 0x000400FA, 0x00005272, 0x00002958, 0x0000362C,\n    0x000200F8, 0x00002958, 0x000500C7, 0x00000017, 0x00004760, 0x00003910,\n    0x000009CE, 0x000500C4, 0x00000017, 0x000024D2, 0x00004760, 0x0000013D,\n    0x000500C7, 0x00000017, 0x000050AD, 0x00003910, 0x0000072E, 0x000500C2,\n    0x00000017, 0x0000448E, 0x000050AD, 0x0000013D, 0x000500C5, 0x00000017,\n    0x00003FF9, 0x000024D2, 0x0000448E, 0x000200F9, 0x0000362C, 0x000200F8,\n    0x0000362C, 0x000700F5, 0x00000017, 0x00004AB5, 0x00003910, 0x0000362B,\n    0x00003FF9, 0x00002958, 0x000500C2, 0x0000000B, 0x00001BB8, 0x00005679,\n    0x00000A17, 0x000500C7, 0x00000017, 0x000030B3, 0x00004AB5, 0x000009F1,\n    0x000500C7, 0x00000017, 0x00004944, 0x00004AB5, 0x0000001B, 0x000500C4,\n    0x00000017, 0x00006165, 0x00004944, 0x000001DF, 0x000500C5, 0x00000017,\n    0x00004296, 0x000030B3, 0x00006165, 0x000500C7, 0x00000017, 0x000052DD,\n    0x00004AB5, 0x0000067D, 0x000500C2, 0x00000017, 0x000046A9, 0x000052DD,\n    0x000001DF, 0x000500C5, 0x00000017, 0x00001985, 0x00004296, 0x000046A9,\n    0x00060041, 0x00000294, 0x00005819, 0x0000140E, 0x00000A0B, 0x00001BB8,\n    0x0003003E, 0x00005819, 0x00001985, 0x000200F9, 0x00004C7A, 0x000200F8,\n    0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_rg16_snorm_float_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25155\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n      %float = OpTypeFloat 32\n    %v4float = OpTypeVector %float 4\n       %uint = OpTypeInt 32 0\n     %v4uint = OpTypeVector %uint 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v2uint = OpTypeVector %uint 2\n     %v3uint = OpTypeVector %uint 3\n   %float_n1 = OpConstant %float -1\n      %v4int = OpTypeVector %int 4\n     %int_16 = OpConstant %int 16\n%float_3_05185094en05 = OpConstant %float 3.05185094e-05\n     %uint_0 = OpConstant %uint 0\n    %v2float = OpTypeVector %float 2\n     %uint_1 = OpConstant %uint 1\n     %uint_2 = OpConstant %uint 2\n     %uint_3 = OpConstant %uint 3\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n    %uint_16 = OpConstant %uint 16\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n      %int_3 = OpConstant %int 3\n      %int_2 = OpConstant %int 2\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %2603 = OpConstantComposite %v3uint %uint_3 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n     %uint_4 = OpConstant %uint 4\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n    %uint_32 = OpConstant %uint 32\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n       %1284 = OpConstantComposite %v4float %float_n1 %float_n1 %float_n1 %float_n1\n        %770 = OpConstantComposite %v4int %int_16 %int_16 %int_16 %int_16\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24540 = OpBitwiseAnd %uint %13606 %uint_1\n      %17270 = OpINotEqual %bool %24540 %uint_0\n      %12328 = OpBitwiseAnd %uint %13606 %uint_2\n      %17284 = OpINotEqual %bool %12328 %uint_0\n       %7856 = OpShiftRightLogical %uint %13606 %uint_2\n      %25058 = OpBitwiseAnd %uint %7856 %uint_3\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2603\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %6586 DontFlatten\n               OpBranchConditional %24679 %21992 %6586\n      %21992 = OpLabel\n               OpBranch %19578\n       %6586 = OpLabel\n      %23478 = OpBitcast %v3int %21387\n      %18710 = OpCompositeExtract %uint %22410 1\n      %23531 = OpCompositeExtract %int %23478 0\n      %22810 = OpIMul %int %23531 %int_4\n       %6362 = OpCompositeExtract %int %23478 2\n      %14505 = OpBitcast %int %18710\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %23478 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %6594\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %22810 %24535\n      %10404 = OpBitcast %uint %8258\n      %14582 = OpIAdd %uint %22411 %10404\n      %12308 = OpLogicalNot %bool %17270\n               OpSelectionMerge %19040 DontFlatten\n               OpBranchConditional %12308 %9741 %17007\n       %9741 = OpLabel\n      %17463 = OpCompositeExtract %uint %21387 0\n      %11246 = OpCompositeExtract %uint %21387 1\n      %18801 = OpCompositeExtract %uint %21387 2\n      %14831 = OpIMul %uint %22409 %18801\n      %20322 = OpIAdd %uint %11246 %14831\n      %21676 = OpIMul %uint %22408 %20322\n      %20398 = OpIAdd %uint %17463 %21676\n      %11367 = OpShiftLeftLogical %uint %20398 %uint_2\n               OpBranch %19040\n      %17007 = OpLabel\n               OpSelectionMerge %23536 DontFlatten\n               OpBranchConditional %17284 %11410 %24353\n      %11410 = OpLabel\n      %21364 = OpShiftRightLogical %uint %22408 %int_5\n      %13804 = OpShiftRightLogical %uint %22409 %int_4\n      %13237 = OpShiftRightArithmetic %int %6362 %int_2\n      %22374 = OpBitcast %int %13804\n      %25085 = OpIMul %int %13237 %22374\n      %11618 = OpShiftRightArithmetic %int %17598 %int_4\n      %16670 = OpIAdd %int %25085 %11618\n      %19064 = OpBitcast %int %21364\n      %13020 = OpIMul %int %16670 %19064\n      %12986 = OpShiftRightArithmetic %int %23531 %int_5\n      %24558 = OpIAdd %int %13020 %12986\n       %8797 = OpShiftLeftLogical %int %24558 %int_7\n      %11434 = OpBitwiseAnd %int %6362 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %17598 %int_1\n      %21365 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21365 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %23531 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17334 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17334 %uint_2\n      %13015 = OpShiftRightArithmetic %int %17598 %int_3\n       %9929 = OpBitwiseXor %int %13015 %13237\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %23531 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %17598 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6551\n       %7168 = OpShiftLeftLogical %int %16793 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24144 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24144 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24144 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24144 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %23536\n      %24353 = OpLabel\n      %23000 = OpBitcast %v2int %17136\n      %22120 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %23000 1\n      %12089 = OpShiftRightArithmetic %int %14597 %int_5\n      %22400 = OpBitcast %int %22120\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %23000 0\n      %20423 = OpShiftRightArithmetic %int %25154 %int_5\n      %18864 = OpIAdd %int %7938 %20423\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25154 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17335 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17335 %uint_2\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25154 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6552\n       %7169 = OpShiftLeftLogical %int %21575 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24163 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24163 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24163 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %23536\n      %23536 = OpLabel\n      %10540 = OpPhi %uint %16869 %11410 %16870 %24353\n               OpBranch %19040\n      %19040 = OpLabel\n      %11376 = OpPhi %uint %11367 %9741 %10540 %23536\n      %18621 = OpIAdd %uint %11376 %24236\n      %15698 = OpShiftRightLogical %uint %18621 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15698\n       %7338 = OpLoad %v4uint %20399\n      %13760 = OpIEqual %bool %25058 %uint_1\n      %21366 = OpIEqual %bool %25058 %uint_2\n      %22150 = OpLogicalOr %bool %13760 %21366\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %7338 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %7338 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22649 = OpPhi %v4uint %7338 %19040 %16376 %10583\n      %19638 = OpIEqual %bool %25058 %uint_3\n      %15139 = OpLogicalOr %bool %21366 %19638\n               OpSelectionMerge %13867 None\n               OpBranchConditional %15139 %11064 %13867\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22649 %749\n      %15335 = OpShiftRightLogical %v4uint %22649 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %13867\n      %13867 = OpLabel\n      %17699 = OpPhi %v4uint %22649 %13411 %10728 %11064\n      %20013 = OpShiftRightLogical %uint %14582 %int_4\n      %23626 = OpBitcast %v4int %17699\n      %11292 = OpShiftLeftLogical %v4int %23626 %770\n      %16536 = OpShiftRightArithmetic %v4int %11292 %770\n      %10903 = OpConvertSToF %v4float %16536\n      %20413 = OpVectorTimesScalar %v4float %10903 %float_3_05185094en05\n      %23989 = OpExtInst %v4float %1 FMax %1284 %20413\n      %14338 = OpShiftRightArithmetic %v4int %23626 %770\n       %6607 = OpConvertSToF %v4float %14338\n      %18247 = OpVectorTimesScalar %v4float %6607 %float_3_05185094en05\n      %24070 = OpExtInst %v4float %1 FMax %1284 %18247\n      %24330 = OpCompositeExtract %float %23989 0\n      %14319 = OpCompositeExtract %float %24070 0\n      %19232 = OpCompositeConstruct %v2float %24330 %14319\n       %8561 = OpExtInst %uint %1 PackHalf2x16 %19232\n      %23487 = OpCompositeExtract %float %23989 1\n      %14759 = OpCompositeExtract %float %24070 1\n      %19233 = OpCompositeConstruct %v2float %23487 %14759\n       %8562 = OpExtInst %uint %1 PackHalf2x16 %19233\n      %23488 = OpCompositeExtract %float %23989 2\n      %14760 = OpCompositeExtract %float %24070 2\n      %19234 = OpCompositeConstruct %v2float %23488 %14760\n       %8563 = OpExtInst %uint %1 PackHalf2x16 %19234\n      %23489 = OpCompositeExtract %float %23989 3\n      %14761 = OpCompositeExtract %float %24070 3\n      %19213 = OpCompositeConstruct %v2float %23489 %14761\n       %8430 = OpExtInst %uint %1 PackHalf2x16 %19213\n      %15035 = OpCompositeConstruct %v4uint %8561 %8562 %8563 %8430\n      %17859 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %20013\n               OpStore %17859 %15035\n      %21685 = OpIAdd %uint %14582 %uint_16\n               OpSelectionMerge %24688 DontFlatten\n               OpBranchConditional %17270 %21993 %7205\n      %21993 = OpLabel\n               OpBranch %24688\n       %7205 = OpLabel\n               OpBranch %24688\n      %24688 = OpLabel\n      %11377 = OpPhi %uint %uint_32 %21993 %uint_16 %7205\n      %18622 = OpIAdd %uint %18621 %11377\n      %15699 = OpShiftRightLogical %uint %18622 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15699\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %14874 None\n               OpBranchConditional %22150 %10584 %14874\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %14874\n      %14874 = OpLabel\n      %10924 = OpPhi %v4uint %14608 %24688 %16377 %10584\n               OpSelectionMerge %13868 None\n               OpBranchConditional %15139 %11065 %13868\n      %11065 = OpLabel\n      %24088 = OpShiftLeftLogical %v4uint %10924 %749\n      %15336 = OpShiftRightLogical %v4uint %10924 %749\n      %10729 = OpBitwiseOr %v4uint %24088 %15336\n               OpBranch %13868\n      %13868 = OpLabel\n      %17700 = OpPhi %v4uint %10924 %14874 %10729 %11065\n      %20014 = OpShiftRightLogical %uint %21685 %int_4\n      %23627 = OpBitcast %v4int %17700\n      %11293 = OpShiftLeftLogical %v4int %23627 %770\n      %16537 = OpShiftRightArithmetic %v4int %11293 %770\n      %10904 = OpConvertSToF %v4float %16537\n      %20414 = OpVectorTimesScalar %v4float %10904 %float_3_05185094en05\n      %23990 = OpExtInst %v4float %1 FMax %1284 %20414\n      %14339 = OpShiftRightArithmetic %v4int %23627 %770\n       %6608 = OpConvertSToF %v4float %14339\n      %18248 = OpVectorTimesScalar %v4float %6608 %float_3_05185094en05\n      %24071 = OpExtInst %v4float %1 FMax %1284 %18248\n      %24331 = OpCompositeExtract %float %23990 0\n      %14320 = OpCompositeExtract %float %24071 0\n      %19235 = OpCompositeConstruct %v2float %24331 %14320\n       %8564 = OpExtInst %uint %1 PackHalf2x16 %19235\n      %23490 = OpCompositeExtract %float %23990 1\n      %14762 = OpCompositeExtract %float %24071 1\n      %19236 = OpCompositeConstruct %v2float %23490 %14762\n       %8565 = OpExtInst %uint %1 PackHalf2x16 %19236\n      %23491 = OpCompositeExtract %float %23990 2\n      %14763 = OpCompositeExtract %float %24071 2\n      %19237 = OpCompositeConstruct %v2float %23491 %14763\n       %8566 = OpExtInst %uint %1 PackHalf2x16 %19237\n      %23492 = OpCompositeExtract %float %23990 3\n      %14764 = OpCompositeExtract %float %24071 3\n      %19214 = OpCompositeConstruct %v2float %23492 %14764\n       %8431 = OpExtInst %uint %1 PackHalf2x16 %19214\n      %15036 = OpCompositeConstruct %v4uint %8564 %8565 %8566 %8431\n      %20158 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %20014\n               OpStore %20158 %15036\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_rg16_snorm_float_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006243, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00030016, 0x0000000D, 0x00000020, 0x00040017,\n    0x0000001D, 0x0000000D, 0x00000004, 0x00040015, 0x0000000B, 0x00000020,\n    0x00000000, 0x00040017, 0x00000017, 0x0000000B, 0x00000004, 0x00040015,\n    0x0000000C, 0x00000020, 0x00000001, 0x00040017, 0x00000012, 0x0000000C,\n    0x00000002, 0x00040017, 0x00000016, 0x0000000C, 0x00000003, 0x00020014,\n    0x00000009, 0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017,\n    0x00000014, 0x0000000B, 0x00000003, 0x0004002B, 0x0000000D, 0x00000341,\n    0xBF800000, 0x00040017, 0x0000001A, 0x0000000C, 0x00000004, 0x0004002B,\n    0x0000000C, 0x00000A3B, 0x00000010, 0x0004002B, 0x0000000D, 0x00000A38,\n    0x38000100, 0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000, 0x00040017,\n    0x00000013, 0x0000000D, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A0D,\n    0x00000001, 0x0004002B, 0x0000000B, 0x00000A10, 0x00000002, 0x0004002B,\n    0x0000000B, 0x00000A13, 0x00000003, 0x0004002B, 0x0000000B, 0x000008A6,\n    0x00FF00FF, 0x0004002B, 0x0000000B, 0x00000A22, 0x00000008, 0x0004002B,\n    0x0000000B, 0x000005FD, 0xFF00FF00, 0x0004002B, 0x0000000B, 0x00000A3A,\n    0x00000010, 0x0004002B, 0x0000000C, 0x00000A17, 0x00000004, 0x0004002B,\n    0x0000000C, 0x00000A1D, 0x00000006, 0x0004002B, 0x0000000C, 0x00000A2C,\n    0x0000000B, 0x0004002B, 0x0000000C, 0x00000A39, 0x0000000F, 0x0004002B,\n    0x0000000C, 0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C, 0x00000A1A,\n    0x00000005, 0x0004002B, 0x0000000C, 0x00000A20, 0x00000007, 0x0004002B,\n    0x0000000C, 0x00000A23, 0x00000008, 0x0004002B, 0x0000000C, 0x00000A2F,\n    0x0000000C, 0x0004002B, 0x0000000C, 0x00000A14, 0x00000003, 0x0004002B,\n    0x0000000C, 0x00000A11, 0x00000002, 0x0004002B, 0x0000000C, 0x00000A0B,\n    0x00000000, 0x000A001E, 0x00000489, 0x0000000B, 0x0000000B, 0x0000000B,\n    0x0000000B, 0x00000014, 0x0000000B, 0x0000000B, 0x0000000B, 0x00040020,\n    0x00000706, 0x00000009, 0x00000489, 0x0004003B, 0x00000706, 0x00000CE9,\n    0x00000009, 0x00040020, 0x00000288, 0x00000009, 0x0000000B, 0x00040020,\n    0x00000291, 0x00000009, 0x00000014, 0x00040020, 0x00000292, 0x00000001,\n    0x00000014, 0x0004003B, 0x00000292, 0x00000F48, 0x00000001, 0x0006002C,\n    0x00000014, 0x00000A2B, 0x00000A13, 0x00000A0A, 0x00000A0A, 0x00040017,\n    0x0000000F, 0x00000009, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A16,\n    0x00000004, 0x0003001D, 0x000007DC, 0x00000017, 0x0003001E, 0x000007B4,\n    0x000007DC, 0x00040020, 0x00000A31, 0x00000002, 0x000007B4, 0x0004003B,\n    0x00000A31, 0x0000107A, 0x00000002, 0x00040020, 0x00000294, 0x00000002,\n    0x00000017, 0x0003001D, 0x000007DD, 0x00000017, 0x0003001E, 0x000007B5,\n    0x000007DD, 0x00040020, 0x00000A32, 0x00000002, 0x000007B5, 0x0004003B,\n    0x00000A32, 0x0000140E, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A6A,\n    0x00000020, 0x0006002C, 0x00000014, 0x00000BC3, 0x00000A16, 0x00000A6A,\n    0x00000A0D, 0x0007002C, 0x00000017, 0x000009CE, 0x000008A6, 0x000008A6,\n    0x000008A6, 0x000008A6, 0x0007002C, 0x00000017, 0x0000013D, 0x00000A22,\n    0x00000A22, 0x00000A22, 0x00000A22, 0x0007002C, 0x00000017, 0x0000072E,\n    0x000005FD, 0x000005FD, 0x000005FD, 0x000005FD, 0x0007002C, 0x00000017,\n    0x000002ED, 0x00000A3A, 0x00000A3A, 0x00000A3A, 0x00000A3A, 0x0007002C,\n    0x0000001D, 0x00000504, 0x00000341, 0x00000341, 0x00000341, 0x00000341,\n    0x0007002C, 0x0000001A, 0x00000302, 0x00000A3B, 0x00000A3B, 0x00000A3B,\n    0x00000A3B, 0x00050036, 0x00000008, 0x0000161F, 0x00000000, 0x00000502,\n    0x000200F8, 0x00003B06, 0x000300F7, 0x00004C7A, 0x00000000, 0x000300FB,\n    0x00000A0A, 0x00002E68, 0x000200F8, 0x00002E68, 0x00050041, 0x00000288,\n    0x000060D7, 0x00000CE9, 0x00000A0B, 0x0004003D, 0x0000000B, 0x00003526,\n    0x000060D7, 0x000500C7, 0x0000000B, 0x00005FDC, 0x00003526, 0x00000A0D,\n    0x000500AB, 0x00000009, 0x00004376, 0x00005FDC, 0x00000A0A, 0x000500C7,\n    0x0000000B, 0x00003028, 0x00003526, 0x00000A10, 0x000500AB, 0x00000009,\n    0x00004384, 0x00003028, 0x00000A0A, 0x000500C2, 0x0000000B, 0x00001EB0,\n    0x00003526, 0x00000A10, 0x000500C7, 0x0000000B, 0x000061E2, 0x00001EB0,\n    0x00000A13, 0x00050041, 0x00000288, 0x0000492C, 0x00000CE9, 0x00000A0E,\n    0x0004003D, 0x0000000B, 0x00005EAC, 0x0000492C, 0x00050041, 0x00000288,\n    0x00004EBA, 0x00000CE9, 0x00000A11, 0x0004003D, 0x0000000B, 0x00005788,\n    0x00004EBA, 0x00050041, 0x00000288, 0x00004EBB, 0x00000CE9, 0x00000A14,\n    0x0004003D, 0x0000000B, 0x00005789, 0x00004EBB, 0x00050041, 0x00000291,\n    0x00004EBC, 0x00000CE9, 0x00000A17, 0x0004003D, 0x00000014, 0x0000578A,\n    0x00004EBC, 0x00050041, 0x00000288, 0x00004EBD, 0x00000CE9, 0x00000A1A,\n    0x0004003D, 0x0000000B, 0x0000578B, 0x00004EBD, 0x00050041, 0x00000288,\n    0x00004E6E, 0x00000CE9, 0x00000A1D, 0x0004003D, 0x0000000B, 0x000019C2,\n    0x00004E6E, 0x0004003D, 0x00000014, 0x00002A0E, 0x00000F48, 0x000500C4,\n    0x00000014, 0x0000538B, 0x00002A0E, 0x00000A2B, 0x0007004F, 0x00000011,\n    0x000042F0, 0x0000538B, 0x0000538B, 0x00000000, 0x00000001, 0x0007004F,\n    0x00000011, 0x0000242F, 0x0000578A, 0x0000578A, 0x00000000, 0x00000001,\n    0x000500AE, 0x0000000F, 0x00004288, 0x000042F0, 0x0000242F, 0x0004009A,\n    0x00000009, 0x00006067, 0x00004288, 0x000300F7, 0x000019BA, 0x00000002,\n    0x000400FA, 0x00006067, 0x000055E8, 0x000019BA, 0x000200F8, 0x000055E8,\n    0x000200F9, 0x00004C7A, 0x000200F8, 0x000019BA, 0x0004007C, 0x00000016,\n    0x00005BB6, 0x0000538B, 0x00050051, 0x0000000B, 0x00004916, 0x0000578A,\n    0x00000001, 0x00050051, 0x0000000C, 0x00005BEB, 0x00005BB6, 0x00000000,\n    0x00050084, 0x0000000C, 0x0000591A, 0x00005BEB, 0x00000A17, 0x00050051,\n    0x0000000C, 0x000018DA, 0x00005BB6, 0x00000002, 0x0004007C, 0x0000000C,\n    0x000038A9, 0x00004916, 0x00050084, 0x0000000C, 0x00002C0F, 0x000018DA,\n    0x000038A9, 0x00050051, 0x0000000C, 0x000044BE, 0x00005BB6, 0x00000001,\n    0x00050080, 0x0000000C, 0x000056D4, 0x00002C0F, 0x000044BE, 0x0004007C,\n    0x0000000C, 0x00005785, 0x000019C2, 0x00050084, 0x0000000C, 0x00005FD7,\n    0x000056D4, 0x00005785, 0x00050080, 0x0000000C, 0x00002042, 0x0000591A,\n    0x00005FD7, 0x0004007C, 0x0000000B, 0x000028A4, 0x00002042, 0x00050080,\n    0x0000000B, 0x000038F6, 0x0000578B, 0x000028A4, 0x000400A8, 0x00000009,\n    0x00003014, 0x00004376, 0x000300F7, 0x00004A60, 0x00000002, 0x000400FA,\n    0x00003014, 0x0000260D, 0x0000426F, 0x000200F8, 0x0000260D, 0x00050051,\n    0x0000000B, 0x00004437, 0x0000538B, 0x00000000, 0x00050051, 0x0000000B,\n    0x00002BEE, 0x0000538B, 0x00000001, 0x00050051, 0x0000000B, 0x00004971,\n    0x0000538B, 0x00000002, 0x00050084, 0x0000000B, 0x000039EF, 0x00005789,\n    0x00004971, 0x00050080, 0x0000000B, 0x00004F62, 0x00002BEE, 0x000039EF,\n    0x00050084, 0x0000000B, 0x000054AC, 0x00005788, 0x00004F62, 0x00050080,\n    0x0000000B, 0x00004FAE, 0x00004437, 0x000054AC, 0x000500C4, 0x0000000B,\n    0x00002C67, 0x00004FAE, 0x00000A10, 0x000200F9, 0x00004A60, 0x000200F8,\n    0x0000426F, 0x000300F7, 0x00005BF0, 0x00000002, 0x000400FA, 0x00004384,\n    0x00002C92, 0x00005F21, 0x000200F8, 0x00002C92, 0x000500C2, 0x0000000B,\n    0x00005374, 0x00005788, 0x00000A1A, 0x000500C2, 0x0000000B, 0x000035EC,\n    0x00005789, 0x00000A17, 0x000500C3, 0x0000000C, 0x000033B5, 0x000018DA,\n    0x00000A11, 0x0004007C, 0x0000000C, 0x00005766, 0x000035EC, 0x00050084,\n    0x0000000C, 0x000061FD, 0x000033B5, 0x00005766, 0x000500C3, 0x0000000C,\n    0x00002D62, 0x000044BE, 0x00000A17, 0x00050080, 0x0000000C, 0x0000411E,\n    0x000061FD, 0x00002D62, 0x0004007C, 0x0000000C, 0x00004A78, 0x00005374,\n    0x00050084, 0x0000000C, 0x000032DC, 0x0000411E, 0x00004A78, 0x000500C3,\n    0x0000000C, 0x000032BA, 0x00005BEB, 0x00000A1A, 0x00050080, 0x0000000C,\n    0x00005FEE, 0x000032DC, 0x000032BA, 0x000500C4, 0x0000000C, 0x0000225D,\n    0x00005FEE, 0x00000A20, 0x000500C7, 0x0000000C, 0x00002CAA, 0x000018DA,\n    0x00000A14, 0x000500C4, 0x0000000C, 0x00004CAE, 0x00002CAA, 0x00000A1A,\n    0x000500C3, 0x0000000C, 0x0000383E, 0x000044BE, 0x00000A0E, 0x000500C7,\n    0x0000000C, 0x00005375, 0x0000383E, 0x00000A14, 0x000500C4, 0x0000000C,\n    0x000054CA, 0x00005375, 0x00000A14, 0x000500C5, 0x0000000C, 0x000042CE,\n    0x00004CAE, 0x000054CA, 0x000500C7, 0x0000000C, 0x000050D5, 0x00005BEB,\n    0x00000A20, 0x000500C5, 0x0000000C, 0x00003ADD, 0x000042CE, 0x000050D5,\n    0x000500C5, 0x0000000C, 0x000043B6, 0x0000225D, 0x00003ADD, 0x000500C4,\n    0x0000000C, 0x00005E50, 0x000043B6, 0x00000A10, 0x000500C3, 0x0000000C,\n    0x000032D7, 0x000044BE, 0x00000A14, 0x000500C6, 0x0000000C, 0x000026C9,\n    0x000032D7, 0x000033B5, 0x000500C7, 0x0000000C, 0x00004199, 0x000026C9,\n    0x00000A0E, 0x000500C3, 0x0000000C, 0x00002590, 0x00005BEB, 0x00000A14,\n    0x000500C7, 0x0000000C, 0x0000505E, 0x00002590, 0x00000A14, 0x000500C4,\n    0x0000000C, 0x0000541D, 0x00004199, 0x00000A0E, 0x000500C6, 0x0000000C,\n    0x000022BA, 0x0000505E, 0x0000541D, 0x000500C7, 0x0000000C, 0x00005076,\n    0x000044BE, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005228, 0x00005076,\n    0x00000A17, 0x000500C4, 0x0000000C, 0x00001997, 0x000022BA, 0x00000A1D,\n    0x000500C5, 0x0000000C, 0x000047FE, 0x00005228, 0x00001997, 0x000500C4,\n    0x0000000C, 0x00001C00, 0x00004199, 0x00000A2C, 0x000500C5, 0x0000000C,\n    0x00003C81, 0x000047FE, 0x00001C00, 0x000500C7, 0x0000000C, 0x000050AF,\n    0x00005E50, 0x00000A39, 0x000500C5, 0x0000000C, 0x00003C70, 0x00003C81,\n    0x000050AF, 0x000500C3, 0x0000000C, 0x00003745, 0x00005E50, 0x00000A17,\n    0x000500C7, 0x0000000C, 0x000018B8, 0x00003745, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x0000547E, 0x000018B8, 0x00000A1A, 0x000500C5, 0x0000000C,\n    0x000045A8, 0x00003C70, 0x0000547E, 0x000500C3, 0x0000000C, 0x00003A6E,\n    0x00005E50, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018B9, 0x00003A6E,\n    0x00000A20, 0x000500C4, 0x0000000C, 0x0000547F, 0x000018B9, 0x00000A23,\n    0x000500C5, 0x0000000C, 0x0000456F, 0x000045A8, 0x0000547F, 0x000500C3,\n    0x0000000C, 0x00003C88, 0x00005E50, 0x00000A23, 0x000500C4, 0x0000000C,\n    0x00002824, 0x00003C88, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B79,\n    0x0000456F, 0x00002824, 0x0004007C, 0x0000000B, 0x000041E5, 0x00003B79,\n    0x000200F9, 0x00005BF0, 0x000200F8, 0x00005F21, 0x0004007C, 0x00000012,\n    0x000059D8, 0x000042F0, 0x000500C2, 0x0000000B, 0x00005668, 0x00005788,\n    0x00000A1A, 0x00050051, 0x0000000C, 0x00003905, 0x000059D8, 0x00000001,\n    0x000500C3, 0x0000000C, 0x00002F39, 0x00003905, 0x00000A1A, 0x0004007C,\n    0x0000000C, 0x00005780, 0x00005668, 0x00050084, 0x0000000C, 0x00001F02,\n    0x00002F39, 0x00005780, 0x00050051, 0x0000000C, 0x00006242, 0x000059D8,\n    0x00000000, 0x000500C3, 0x0000000C, 0x00004FC7, 0x00006242, 0x00000A1A,\n    0x00050080, 0x0000000C, 0x000049B0, 0x00001F02, 0x00004FC7, 0x000500C4,\n    0x0000000C, 0x0000254A, 0x000049B0, 0x00000A1D, 0x000500C3, 0x0000000C,\n    0x0000603B, 0x00003905, 0x00000A0E, 0x000500C7, 0x0000000C, 0x0000539A,\n    0x0000603B, 0x00000A20, 0x000500C4, 0x0000000C, 0x0000534A, 0x0000539A,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x00004EA5, 0x00006242, 0x00000A20,\n    0x000500C5, 0x0000000C, 0x00002B1A, 0x0000534A, 0x00004EA5, 0x000500C5,\n    0x0000000C, 0x000043B7, 0x0000254A, 0x00002B1A, 0x000500C4, 0x0000000C,\n    0x00005E63, 0x000043B7, 0x00000A10, 0x000500C3, 0x0000000C, 0x000031DE,\n    0x00003905, 0x00000A17, 0x000500C7, 0x0000000C, 0x00005447, 0x000031DE,\n    0x00000A0E, 0x000500C3, 0x0000000C, 0x000028A6, 0x00006242, 0x00000A14,\n    0x000500C7, 0x0000000C, 0x0000511E, 0x000028A6, 0x00000A14, 0x000500C3,\n    0x0000000C, 0x000028B9, 0x00003905, 0x00000A14, 0x000500C7, 0x0000000C,\n    0x0000505F, 0x000028B9, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000541E,\n    0x0000505F, 0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BB, 0x0000511E,\n    0x0000541E, 0x000500C7, 0x0000000C, 0x00005077, 0x00003905, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x00005229, 0x00005077, 0x00000A17, 0x000500C4,\n    0x0000000C, 0x00001998, 0x000022BB, 0x00000A1D, 0x000500C5, 0x0000000C,\n    0x000047FF, 0x00005229, 0x00001998, 0x000500C4, 0x0000000C, 0x00001C01,\n    0x00005447, 0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C82, 0x000047FF,\n    0x00001C01, 0x000500C7, 0x0000000C, 0x000050B0, 0x00005E63, 0x00000A39,\n    0x000500C5, 0x0000000C, 0x00003C71, 0x00003C82, 0x000050B0, 0x000500C3,\n    0x0000000C, 0x00003746, 0x00005E63, 0x00000A17, 0x000500C7, 0x0000000C,\n    0x000018BA, 0x00003746, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005480,\n    0x000018BA, 0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A9, 0x00003C71,\n    0x00005480, 0x000500C3, 0x0000000C, 0x00003A6F, 0x00005E63, 0x00000A1A,\n    0x000500C7, 0x0000000C, 0x000018BB, 0x00003A6F, 0x00000A20, 0x000500C4,\n    0x0000000C, 0x00005481, 0x000018BB, 0x00000A23, 0x000500C5, 0x0000000C,\n    0x00004570, 0x000045A9, 0x00005481, 0x000500C3, 0x0000000C, 0x00003C89,\n    0x00005E63, 0x00000A23, 0x000500C4, 0x0000000C, 0x00002825, 0x00003C89,\n    0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B7A, 0x00004570, 0x00002825,\n    0x0004007C, 0x0000000B, 0x000041E6, 0x00003B7A, 0x000200F9, 0x00005BF0,\n    0x000200F8, 0x00005BF0, 0x000700F5, 0x0000000B, 0x0000292C, 0x000041E5,\n    0x00002C92, 0x000041E6, 0x00005F21, 0x000200F9, 0x00004A60, 0x000200F8,\n    0x00004A60, 0x000700F5, 0x0000000B, 0x00002C70, 0x00002C67, 0x0000260D,\n    0x0000292C, 0x00005BF0, 0x00050080, 0x0000000B, 0x000048BD, 0x00002C70,\n    0x00005EAC, 0x000500C2, 0x0000000B, 0x00003D52, 0x000048BD, 0x00000A17,\n    0x00060041, 0x00000294, 0x00004FAF, 0x0000107A, 0x00000A0B, 0x00003D52,\n    0x0004003D, 0x00000017, 0x00001CAA, 0x00004FAF, 0x000500AA, 0x00000009,\n    0x000035C0, 0x000061E2, 0x00000A0D, 0x000500AA, 0x00000009, 0x00005376,\n    0x000061E2, 0x00000A10, 0x000500A6, 0x00000009, 0x00005686, 0x000035C0,\n    0x00005376, 0x000300F7, 0x00003463, 0x00000000, 0x000400FA, 0x00005686,\n    0x00002957, 0x00003463, 0x000200F8, 0x00002957, 0x000500C7, 0x00000017,\n    0x0000475F, 0x00001CAA, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D1,\n    0x0000475F, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AC, 0x00001CAA,\n    0x0000072E, 0x000500C2, 0x00000017, 0x0000448D, 0x000050AC, 0x0000013D,\n    0x000500C5, 0x00000017, 0x00003FF8, 0x000024D1, 0x0000448D, 0x000200F9,\n    0x00003463, 0x000200F8, 0x00003463, 0x000700F5, 0x00000017, 0x00005879,\n    0x00001CAA, 0x00004A60, 0x00003FF8, 0x00002957, 0x000500AA, 0x00000009,\n    0x00004CB6, 0x000061E2, 0x00000A13, 0x000500A6, 0x00000009, 0x00003B23,\n    0x00005376, 0x00004CB6, 0x000300F7, 0x0000362B, 0x00000000, 0x000400FA,\n    0x00003B23, 0x00002B38, 0x0000362B, 0x000200F8, 0x00002B38, 0x000500C4,\n    0x00000017, 0x00005E17, 0x00005879, 0x000002ED, 0x000500C2, 0x00000017,\n    0x00003BE7, 0x00005879, 0x000002ED, 0x000500C5, 0x00000017, 0x000029E8,\n    0x00005E17, 0x00003BE7, 0x000200F9, 0x0000362B, 0x000200F8, 0x0000362B,\n    0x000700F5, 0x00000017, 0x00004523, 0x00005879, 0x00003463, 0x000029E8,\n    0x00002B38, 0x000500C2, 0x0000000B, 0x00004E2D, 0x000038F6, 0x00000A17,\n    0x0004007C, 0x0000001A, 0x00005C4A, 0x00004523, 0x000500C4, 0x0000001A,\n    0x00002C1C, 0x00005C4A, 0x00000302, 0x000500C3, 0x0000001A, 0x00004098,\n    0x00002C1C, 0x00000302, 0x0004006F, 0x0000001D, 0x00002A97, 0x00004098,\n    0x0005008E, 0x0000001D, 0x00004FBD, 0x00002A97, 0x00000A38, 0x0007000C,\n    0x0000001D, 0x00005DB5, 0x00000001, 0x00000028, 0x00000504, 0x00004FBD,\n    0x000500C3, 0x0000001A, 0x00003802, 0x00005C4A, 0x00000302, 0x0004006F,\n    0x0000001D, 0x000019CF, 0x00003802, 0x0005008E, 0x0000001D, 0x00004747,\n    0x000019CF, 0x00000A38, 0x0007000C, 0x0000001D, 0x00005E06, 0x00000001,\n    0x00000028, 0x00000504, 0x00004747, 0x00050051, 0x0000000D, 0x00005F0A,\n    0x00005DB5, 0x00000000, 0x00050051, 0x0000000D, 0x000037EF, 0x00005E06,\n    0x00000000, 0x00050050, 0x00000013, 0x00004B20, 0x00005F0A, 0x000037EF,\n    0x0006000C, 0x0000000B, 0x00002171, 0x00000001, 0x0000003A, 0x00004B20,\n    0x00050051, 0x0000000D, 0x00005BBF, 0x00005DB5, 0x00000001, 0x00050051,\n    0x0000000D, 0x000039A7, 0x00005E06, 0x00000001, 0x00050050, 0x00000013,\n    0x00004B21, 0x00005BBF, 0x000039A7, 0x0006000C, 0x0000000B, 0x00002172,\n    0x00000001, 0x0000003A, 0x00004B21, 0x00050051, 0x0000000D, 0x00005BC0,\n    0x00005DB5, 0x00000002, 0x00050051, 0x0000000D, 0x000039A8, 0x00005E06,\n    0x00000002, 0x00050050, 0x00000013, 0x00004B22, 0x00005BC0, 0x000039A8,\n    0x0006000C, 0x0000000B, 0x00002173, 0x00000001, 0x0000003A, 0x00004B22,\n    0x00050051, 0x0000000D, 0x00005BC1, 0x00005DB5, 0x00000003, 0x00050051,\n    0x0000000D, 0x000039A9, 0x00005E06, 0x00000003, 0x00050050, 0x00000013,\n    0x00004B0D, 0x00005BC1, 0x000039A9, 0x0006000C, 0x0000000B, 0x000020EE,\n    0x00000001, 0x0000003A, 0x00004B0D, 0x00070050, 0x00000017, 0x00003ABB,\n    0x00002171, 0x00002172, 0x00002173, 0x000020EE, 0x00060041, 0x00000294,\n    0x000045C3, 0x0000140E, 0x00000A0B, 0x00004E2D, 0x0003003E, 0x000045C3,\n    0x00003ABB, 0x00050080, 0x0000000B, 0x000054B5, 0x000038F6, 0x00000A3A,\n    0x000300F7, 0x00006070, 0x00000002, 0x000400FA, 0x00004376, 0x000055E9,\n    0x00001C25, 0x000200F8, 0x000055E9, 0x000200F9, 0x00006070, 0x000200F8,\n    0x00001C25, 0x000200F9, 0x00006070, 0x000200F8, 0x00006070, 0x000700F5,\n    0x0000000B, 0x00002C71, 0x00000A6A, 0x000055E9, 0x00000A3A, 0x00001C25,\n    0x00050080, 0x0000000B, 0x000048BE, 0x000048BD, 0x00002C71, 0x000500C2,\n    0x0000000B, 0x00003D53, 0x000048BE, 0x00000A17, 0x00060041, 0x00000294,\n    0x00005566, 0x0000107A, 0x00000A0B, 0x00003D53, 0x0004003D, 0x00000017,\n    0x00003910, 0x00005566, 0x000300F7, 0x00003A1A, 0x00000000, 0x000400FA,\n    0x00005686, 0x00002958, 0x00003A1A, 0x000200F8, 0x00002958, 0x000500C7,\n    0x00000017, 0x00004760, 0x00003910, 0x000009CE, 0x000500C4, 0x00000017,\n    0x000024D2, 0x00004760, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AD,\n    0x00003910, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448E, 0x000050AD,\n    0x0000013D, 0x000500C5, 0x00000017, 0x00003FF9, 0x000024D2, 0x0000448E,\n    0x000200F9, 0x00003A1A, 0x000200F8, 0x00003A1A, 0x000700F5, 0x00000017,\n    0x00002AAC, 0x00003910, 0x00006070, 0x00003FF9, 0x00002958, 0x000300F7,\n    0x0000362C, 0x00000000, 0x000400FA, 0x00003B23, 0x00002B39, 0x0000362C,\n    0x000200F8, 0x00002B39, 0x000500C4, 0x00000017, 0x00005E18, 0x00002AAC,\n    0x000002ED, 0x000500C2, 0x00000017, 0x00003BE8, 0x00002AAC, 0x000002ED,\n    0x000500C5, 0x00000017, 0x000029E9, 0x00005E18, 0x00003BE8, 0x000200F9,\n    0x0000362C, 0x000200F8, 0x0000362C, 0x000700F5, 0x00000017, 0x00004524,\n    0x00002AAC, 0x00003A1A, 0x000029E9, 0x00002B39, 0x000500C2, 0x0000000B,\n    0x00004E2E, 0x000054B5, 0x00000A17, 0x0004007C, 0x0000001A, 0x00005C4B,\n    0x00004524, 0x000500C4, 0x0000001A, 0x00002C1D, 0x00005C4B, 0x00000302,\n    0x000500C3, 0x0000001A, 0x00004099, 0x00002C1D, 0x00000302, 0x0004006F,\n    0x0000001D, 0x00002A98, 0x00004099, 0x0005008E, 0x0000001D, 0x00004FBE,\n    0x00002A98, 0x00000A38, 0x0007000C, 0x0000001D, 0x00005DB6, 0x00000001,\n    0x00000028, 0x00000504, 0x00004FBE, 0x000500C3, 0x0000001A, 0x00003803,\n    0x00005C4B, 0x00000302, 0x0004006F, 0x0000001D, 0x000019D0, 0x00003803,\n    0x0005008E, 0x0000001D, 0x00004748, 0x000019D0, 0x00000A38, 0x0007000C,\n    0x0000001D, 0x00005E07, 0x00000001, 0x00000028, 0x00000504, 0x00004748,\n    0x00050051, 0x0000000D, 0x00005F0B, 0x00005DB6, 0x00000000, 0x00050051,\n    0x0000000D, 0x000037F0, 0x00005E07, 0x00000000, 0x00050050, 0x00000013,\n    0x00004B23, 0x00005F0B, 0x000037F0, 0x0006000C, 0x0000000B, 0x00002174,\n    0x00000001, 0x0000003A, 0x00004B23, 0x00050051, 0x0000000D, 0x00005BC2,\n    0x00005DB6, 0x00000001, 0x00050051, 0x0000000D, 0x000039AA, 0x00005E07,\n    0x00000001, 0x00050050, 0x00000013, 0x00004B24, 0x00005BC2, 0x000039AA,\n    0x0006000C, 0x0000000B, 0x00002175, 0x00000001, 0x0000003A, 0x00004B24,\n    0x00050051, 0x0000000D, 0x00005BC3, 0x00005DB6, 0x00000002, 0x00050051,\n    0x0000000D, 0x000039AB, 0x00005E07, 0x00000002, 0x00050050, 0x00000013,\n    0x00004B25, 0x00005BC3, 0x000039AB, 0x0006000C, 0x0000000B, 0x00002176,\n    0x00000001, 0x0000003A, 0x00004B25, 0x00050051, 0x0000000D, 0x00005BC4,\n    0x00005DB6, 0x00000003, 0x00050051, 0x0000000D, 0x000039AC, 0x00005E07,\n    0x00000003, 0x00050050, 0x00000013, 0x00004B0E, 0x00005BC4, 0x000039AC,\n    0x0006000C, 0x0000000B, 0x000020EF, 0x00000001, 0x0000003A, 0x00004B0E,\n    0x00070050, 0x00000017, 0x00003ABC, 0x00002174, 0x00002175, 0x00002176,\n    0x000020EF, 0x00060041, 0x00000294, 0x00004EBE, 0x0000140E, 0x00000A0B,\n    0x00004E2E, 0x0003003E, 0x00004EBE, 0x00003ABC, 0x000200F9, 0x00004C7A,\n    0x000200F8, 0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_rg16_snorm_float_scaled_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25157\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n      %float = OpTypeFloat 32\n    %v4float = OpTypeVector %float 4\n     %v4uint = OpTypeVector %uint 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v3uint = OpTypeVector %uint 3\n   %float_n1 = OpConstant %float -1\n      %v4int = OpTypeVector %int 4\n     %int_16 = OpConstant %int 16\n%float_3_05185094en05 = OpConstant %float 3.05185094e-05\n     %uint_0 = OpConstant %uint 0\n    %v2float = OpTypeVector %float 2\n     %uint_1 = OpConstant %uint 1\n     %uint_2 = OpConstant %uint 2\n     %uint_3 = OpConstant %uint 3\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n    %uint_16 = OpConstant %uint 16\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n      %int_3 = OpConstant %int 3\n      %int_2 = OpConstant %int 2\n     %uint_4 = OpConstant %uint 4\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n     %uint_7 = OpConstant %uint 7\n       %1927 = OpConstantComposite %v2uint %uint_4 %uint_7\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %2603 = OpConstantComposite %v3uint %uint_3 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n    %uint_32 = OpConstant %uint 32\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %1954 = OpConstantComposite %v2uint %uint_7 %uint_7\n       %1855 = OpConstantComposite %v2uint %uint_4 %uint_1\n     %uint_6 = OpConstant %uint 6\n    %uint_15 = OpConstant %uint 15\n       %1955 = OpConstantComposite %v2uint %uint_15 %uint_1\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n       %1284 = OpConstantComposite %v4float %float_n1 %float_n1 %float_n1 %float_n1\n        %770 = OpConstantComposite %v4int %int_16 %int_16 %int_16 %int_16\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24445 = OpBitwiseAnd %uint %13606 %uint_2\n      %18667 = OpINotEqual %bool %24445 %uint_0\n       %8141 = OpShiftRightLogical %uint %13606 %uint_2\n      %24990 = OpBitwiseAnd %uint %8141 %uint_3\n       %8871 = OpCompositeConstruct %v2uint %13606 %13606\n       %7087 = OpShiftRightLogical %v2uint %8871 %1927\n       %6551 = OpBitwiseAnd %v2uint %7087 %1954\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2603\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %6586 DontFlatten\n               OpBranchConditional %24679 %21992 %6586\n      %21992 = OpLabel\n               OpBranch %19578\n       %6586 = OpLabel\n      %23478 = OpBitcast %v3int %21387\n      %18710 = OpCompositeExtract %uint %22410 1\n      %23531 = OpCompositeExtract %int %23478 0\n      %22810 = OpIMul %int %23531 %int_4\n       %6362 = OpCompositeExtract %int %23478 2\n      %14505 = OpBitcast %int %18710\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %23478 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %6594\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %22810 %24535\n      %10898 = OpBitcast %uint %8258\n       %7937 = OpIAdd %uint %22411 %10898\n      %19921 = OpShiftRightLogical %v2uint %17136 %1855\n       %7712 = OpUDiv %v2uint %19921 %6551\n      %18183 = OpIMul %v2uint %6551 %7712\n      %18273 = OpISub %v2uint %19921 %18183\n      %11232 = OpShiftLeftLogical %v2uint %7712 %1855\n      %13284 = OpCompositeExtract %uint %18273 0\n      %10872 = OpCompositeExtract %uint %6551 1\n      %22886 = OpIMul %uint %13284 %10872\n       %6943 = OpCompositeExtract %uint %18273 1\n      %10469 = OpIAdd %uint %22886 %6943\n      %18851 = OpBitwiseAnd %v2uint %17136 %1955\n      %10581 = OpShiftLeftLogical %uint %10469 %uint_7\n      %20916 = OpCompositeExtract %uint %18851 1\n      %23596 = OpShiftLeftLogical %uint %20916 %uint_6\n      %19814 = OpBitwiseOr %uint %10581 %23596\n      %21476 = OpCompositeExtract %uint %18851 0\n       %8560 = OpShiftLeftLogical %uint %21476 %uint_2\n      %17648 = OpBitwiseOr %uint %19814 %8560\n      %19923 = OpCompositeExtract %uint %11232 0\n      %15556 = OpCompositeInsert %v3uint %19923 %21387 0\n      %23006 = OpCompositeExtract %uint %11232 1\n       %9680 = OpCompositeInsert %v3uint %23006 %15556 1\n               OpSelectionMerge %20344 DontFlatten\n               OpBranchConditional %18667 %23520 %11737\n      %23520 = OpLabel\n      %10111 = OpBitcast %v3int %9680\n      %19476 = OpShiftRightLogical %uint %22408 %int_5\n      %18810 = OpShiftRightLogical %uint %22409 %int_4\n       %6782 = OpCompositeExtract %int %10111 2\n      %12089 = OpShiftRightArithmetic %int %6782 %int_2\n      %22400 = OpBitcast %int %18810\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %10111 1\n      %19055 = OpShiftRightArithmetic %int %25154 %int_4\n      %11052 = OpIAdd %int %7938 %19055\n      %16898 = OpBitcast %int %19476\n      %14944 = OpIMul %int %11052 %16898\n      %25155 = OpCompositeExtract %int %10111 0\n      %20423 = OpShiftRightArithmetic %int %25155 %int_5\n      %18940 = OpIAdd %int %14944 %20423\n       %8797 = OpShiftLeftLogical %int %18940 %int_7\n      %11434 = OpBitwiseAnd %int %6782 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %25154 %int_1\n      %21364 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21364 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %25155 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17334 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17334 %uint_2\n      %13015 = OpShiftRightArithmetic %int %25154 %int_3\n       %9929 = OpBitwiseXor %int %13015 %12089\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %25155 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %25154 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6552 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6552\n       %7168 = OpShiftLeftLogical %int %16793 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24144 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24144 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24144 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24144 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %20344\n      %11737 = OpLabel\n      %11908 = OpVectorShuffle %v2uint %9680 %9680 0 1\n      %20347 = OpBitcast %v2int %11908\n      %11433 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %20347 1\n      %12090 = OpShiftRightArithmetic %int %14597 %int_5\n      %22401 = OpBitcast %int %11433\n       %7939 = OpIMul %int %12090 %22401\n      %25156 = OpCompositeExtract %int %20347 0\n      %20424 = OpShiftRightArithmetic %int %25156 %int_5\n      %18864 = OpIAdd %int %7939 %20424\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25156 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17335 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17335 %uint_2\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25156 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6553 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6553\n       %7169 = OpShiftLeftLogical %int %21575 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24163 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24163 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24163 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %20344\n      %20344 = OpLabel\n      %18329 = OpPhi %uint %16869 %23520 %16870 %11737\n      %15200 = OpCompositeExtract %uint %6551 0\n      %17489 = OpIMul %uint %15200 %10872\n       %7313 = OpIMul %uint %18329 %17489\n       %8815 = OpIAdd %uint %7313 %17648\n      %21470 = OpIAdd %uint %8815 %24236\n      %14664 = OpShiftRightLogical %uint %21470 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %14664\n       %7338 = OpLoad %v4uint %20399\n      %13760 = OpIEqual %bool %24990 %uint_1\n      %21366 = OpIEqual %bool %24990 %uint_2\n      %22150 = OpLogicalOr %bool %13760 %21366\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %7338 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %7338 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22649 = OpPhi %v4uint %7338 %20344 %16376 %10583\n      %19638 = OpIEqual %bool %24990 %uint_3\n      %15139 = OpLogicalOr %bool %21366 %19638\n               OpSelectionMerge %13867 None\n               OpBranchConditional %15139 %11064 %13867\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22649 %749\n      %15335 = OpShiftRightLogical %v4uint %22649 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %13867\n      %13867 = OpLabel\n      %17699 = OpPhi %v4uint %22649 %13411 %10728 %11064\n      %20013 = OpShiftRightLogical %uint %7937 %int_4\n      %23626 = OpBitcast %v4int %17699\n      %11292 = OpShiftLeftLogical %v4int %23626 %770\n      %16536 = OpShiftRightArithmetic %v4int %11292 %770\n      %10903 = OpConvertSToF %v4float %16536\n      %20413 = OpVectorTimesScalar %v4float %10903 %float_3_05185094en05\n      %23989 = OpExtInst %v4float %1 FMax %1284 %20413\n      %14338 = OpShiftRightArithmetic %v4int %23626 %770\n       %6607 = OpConvertSToF %v4float %14338\n      %18247 = OpVectorTimesScalar %v4float %6607 %float_3_05185094en05\n      %24070 = OpExtInst %v4float %1 FMax %1284 %18247\n      %24330 = OpCompositeExtract %float %23989 0\n      %14319 = OpCompositeExtract %float %24070 0\n      %19232 = OpCompositeConstruct %v2float %24330 %14319\n       %8561 = OpExtInst %uint %1 PackHalf2x16 %19232\n      %23487 = OpCompositeExtract %float %23989 1\n      %14759 = OpCompositeExtract %float %24070 1\n      %19233 = OpCompositeConstruct %v2float %23487 %14759\n       %8562 = OpExtInst %uint %1 PackHalf2x16 %19233\n      %23488 = OpCompositeExtract %float %23989 2\n      %14760 = OpCompositeExtract %float %24070 2\n      %19234 = OpCompositeConstruct %v2float %23488 %14760\n       %8563 = OpExtInst %uint %1 PackHalf2x16 %19234\n      %23489 = OpCompositeExtract %float %23989 3\n      %14761 = OpCompositeExtract %float %24070 3\n      %19213 = OpCompositeConstruct %v2float %23489 %14761\n       %8430 = OpExtInst %uint %1 PackHalf2x16 %19213\n      %15035 = OpCompositeConstruct %v4uint %8561 %8562 %8563 %8430\n      %17859 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %20013\n               OpStore %17859 %15035\n      %22137 = OpIAdd %uint %7937 %uint_16\n      %10214 = OpIAdd %uint %21470 %uint_16\n      %14665 = OpShiftRightLogical %uint %10214 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %14665\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %14874 None\n               OpBranchConditional %22150 %10584 %14874\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %14874\n      %14874 = OpLabel\n      %10924 = OpPhi %v4uint %14608 %13867 %16377 %10584\n               OpSelectionMerge %13868 None\n               OpBranchConditional %15139 %11065 %13868\n      %11065 = OpLabel\n      %24088 = OpShiftLeftLogical %v4uint %10924 %749\n      %15336 = OpShiftRightLogical %v4uint %10924 %749\n      %10729 = OpBitwiseOr %v4uint %24088 %15336\n               OpBranch %13868\n      %13868 = OpLabel\n      %17700 = OpPhi %v4uint %10924 %14874 %10729 %11065\n      %20014 = OpShiftRightLogical %uint %22137 %int_4\n      %23627 = OpBitcast %v4int %17700\n      %11293 = OpShiftLeftLogical %v4int %23627 %770\n      %16537 = OpShiftRightArithmetic %v4int %11293 %770\n      %10904 = OpConvertSToF %v4float %16537\n      %20414 = OpVectorTimesScalar %v4float %10904 %float_3_05185094en05\n      %23990 = OpExtInst %v4float %1 FMax %1284 %20414\n      %14339 = OpShiftRightArithmetic %v4int %23627 %770\n       %6608 = OpConvertSToF %v4float %14339\n      %18248 = OpVectorTimesScalar %v4float %6608 %float_3_05185094en05\n      %24071 = OpExtInst %v4float %1 FMax %1284 %18248\n      %24331 = OpCompositeExtract %float %23990 0\n      %14320 = OpCompositeExtract %float %24071 0\n      %19235 = OpCompositeConstruct %v2float %24331 %14320\n       %8564 = OpExtInst %uint %1 PackHalf2x16 %19235\n      %23490 = OpCompositeExtract %float %23990 1\n      %14762 = OpCompositeExtract %float %24071 1\n      %19236 = OpCompositeConstruct %v2float %23490 %14762\n       %8565 = OpExtInst %uint %1 PackHalf2x16 %19236\n      %23491 = OpCompositeExtract %float %23990 2\n      %14763 = OpCompositeExtract %float %24071 2\n      %19237 = OpCompositeConstruct %v2float %23491 %14763\n       %8566 = OpExtInst %uint %1 PackHalf2x16 %19237\n      %23492 = OpCompositeExtract %float %23990 3\n      %14764 = OpCompositeExtract %float %24071 3\n      %19214 = OpCompositeConstruct %v2float %23492 %14764\n       %8431 = OpExtInst %uint %1 PackHalf2x16 %19214\n      %15036 = OpCompositeConstruct %v4uint %8564 %8565 %8566 %8431\n      %20158 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %20014\n               OpStore %20158 %15036\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_rg16_snorm_float_scaled_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006245, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00030016, 0x0000000D,\n    0x00000020, 0x00040017, 0x0000001D, 0x0000000D, 0x00000004, 0x00040017,\n    0x00000017, 0x0000000B, 0x00000004, 0x00040015, 0x0000000C, 0x00000020,\n    0x00000001, 0x00040017, 0x00000012, 0x0000000C, 0x00000002, 0x00040017,\n    0x00000016, 0x0000000C, 0x00000003, 0x00020014, 0x00000009, 0x00040017,\n    0x00000014, 0x0000000B, 0x00000003, 0x0004002B, 0x0000000D, 0x00000341,\n    0xBF800000, 0x00040017, 0x0000001A, 0x0000000C, 0x00000004, 0x0004002B,\n    0x0000000C, 0x00000A3B, 0x00000010, 0x0004002B, 0x0000000D, 0x00000A38,\n    0x38000100, 0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000, 0x00040017,\n    0x00000013, 0x0000000D, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A0D,\n    0x00000001, 0x0004002B, 0x0000000B, 0x00000A10, 0x00000002, 0x0004002B,\n    0x0000000B, 0x00000A13, 0x00000003, 0x0004002B, 0x0000000B, 0x000008A6,\n    0x00FF00FF, 0x0004002B, 0x0000000B, 0x00000A22, 0x00000008, 0x0004002B,\n    0x0000000B, 0x000005FD, 0xFF00FF00, 0x0004002B, 0x0000000B, 0x00000A3A,\n    0x00000010, 0x0004002B, 0x0000000C, 0x00000A17, 0x00000004, 0x0004002B,\n    0x0000000C, 0x00000A1D, 0x00000006, 0x0004002B, 0x0000000C, 0x00000A2C,\n    0x0000000B, 0x0004002B, 0x0000000C, 0x00000A39, 0x0000000F, 0x0004002B,\n    0x0000000C, 0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C, 0x00000A1A,\n    0x00000005, 0x0004002B, 0x0000000C, 0x00000A20, 0x00000007, 0x0004002B,\n    0x0000000C, 0x00000A23, 0x00000008, 0x0004002B, 0x0000000C, 0x00000A2F,\n    0x0000000C, 0x0004002B, 0x0000000C, 0x00000A14, 0x00000003, 0x0004002B,\n    0x0000000C, 0x00000A11, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A16,\n    0x00000004, 0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000, 0x000A001E,\n    0x00000489, 0x0000000B, 0x0000000B, 0x0000000B, 0x0000000B, 0x00000014,\n    0x0000000B, 0x0000000B, 0x0000000B, 0x00040020, 0x00000706, 0x00000009,\n    0x00000489, 0x0004003B, 0x00000706, 0x00000CE9, 0x00000009, 0x00040020,\n    0x00000288, 0x00000009, 0x0000000B, 0x0004002B, 0x0000000B, 0x00000A1F,\n    0x00000007, 0x0005002C, 0x00000011, 0x00000787, 0x00000A16, 0x00000A1F,\n    0x00040020, 0x00000291, 0x00000009, 0x00000014, 0x00040020, 0x00000292,\n    0x00000001, 0x00000014, 0x0004003B, 0x00000292, 0x00000F48, 0x00000001,\n    0x0006002C, 0x00000014, 0x00000A2B, 0x00000A13, 0x00000A0A, 0x00000A0A,\n    0x00040017, 0x0000000F, 0x00000009, 0x00000002, 0x0003001D, 0x000007DC,\n    0x00000017, 0x0003001E, 0x000007B4, 0x000007DC, 0x00040020, 0x00000A31,\n    0x00000002, 0x000007B4, 0x0004003B, 0x00000A31, 0x0000107A, 0x00000002,\n    0x00040020, 0x00000294, 0x00000002, 0x00000017, 0x0003001D, 0x000007DD,\n    0x00000017, 0x0003001E, 0x000007B5, 0x000007DD, 0x00040020, 0x00000A32,\n    0x00000002, 0x000007B5, 0x0004003B, 0x00000A32, 0x0000140E, 0x00000002,\n    0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020, 0x0006002C, 0x00000014,\n    0x00000BC3, 0x00000A16, 0x00000A6A, 0x00000A0D, 0x0005002C, 0x00000011,\n    0x000007A2, 0x00000A1F, 0x00000A1F, 0x0005002C, 0x00000011, 0x0000073F,\n    0x00000A16, 0x00000A0D, 0x0004002B, 0x0000000B, 0x00000A1C, 0x00000006,\n    0x0004002B, 0x0000000B, 0x00000A37, 0x0000000F, 0x0005002C, 0x00000011,\n    0x000007A3, 0x00000A37, 0x00000A0D, 0x0007002C, 0x00000017, 0x000009CE,\n    0x000008A6, 0x000008A6, 0x000008A6, 0x000008A6, 0x0007002C, 0x00000017,\n    0x0000013D, 0x00000A22, 0x00000A22, 0x00000A22, 0x00000A22, 0x0007002C,\n    0x00000017, 0x0000072E, 0x000005FD, 0x000005FD, 0x000005FD, 0x000005FD,\n    0x0007002C, 0x00000017, 0x000002ED, 0x00000A3A, 0x00000A3A, 0x00000A3A,\n    0x00000A3A, 0x0007002C, 0x0000001D, 0x00000504, 0x00000341, 0x00000341,\n    0x00000341, 0x00000341, 0x0007002C, 0x0000001A, 0x00000302, 0x00000A3B,\n    0x00000A3B, 0x00000A3B, 0x00000A3B, 0x00050036, 0x00000008, 0x0000161F,\n    0x00000000, 0x00000502, 0x000200F8, 0x00003B06, 0x000300F7, 0x00004C7A,\n    0x00000000, 0x000300FB, 0x00000A0A, 0x00002E68, 0x000200F8, 0x00002E68,\n    0x00050041, 0x00000288, 0x000060D7, 0x00000CE9, 0x00000A0B, 0x0004003D,\n    0x0000000B, 0x00003526, 0x000060D7, 0x000500C7, 0x0000000B, 0x00005F7D,\n    0x00003526, 0x00000A10, 0x000500AB, 0x00000009, 0x000048EB, 0x00005F7D,\n    0x00000A0A, 0x000500C2, 0x0000000B, 0x00001FCD, 0x00003526, 0x00000A10,\n    0x000500C7, 0x0000000B, 0x0000619E, 0x00001FCD, 0x00000A13, 0x00050050,\n    0x00000011, 0x000022A7, 0x00003526, 0x00003526, 0x000500C2, 0x00000011,\n    0x00001BAF, 0x000022A7, 0x00000787, 0x000500C7, 0x00000011, 0x00001997,\n    0x00001BAF, 0x000007A2, 0x00050041, 0x00000288, 0x0000492C, 0x00000CE9,\n    0x00000A0E, 0x0004003D, 0x0000000B, 0x00005EAC, 0x0000492C, 0x00050041,\n    0x00000288, 0x00004EBA, 0x00000CE9, 0x00000A11, 0x0004003D, 0x0000000B,\n    0x00005788, 0x00004EBA, 0x00050041, 0x00000288, 0x00004EBB, 0x00000CE9,\n    0x00000A14, 0x0004003D, 0x0000000B, 0x00005789, 0x00004EBB, 0x00050041,\n    0x00000291, 0x00004EBC, 0x00000CE9, 0x00000A17, 0x0004003D, 0x00000014,\n    0x0000578A, 0x00004EBC, 0x00050041, 0x00000288, 0x00004EBD, 0x00000CE9,\n    0x00000A1A, 0x0004003D, 0x0000000B, 0x0000578B, 0x00004EBD, 0x00050041,\n    0x00000288, 0x00004E6E, 0x00000CE9, 0x00000A1D, 0x0004003D, 0x0000000B,\n    0x000019C2, 0x00004E6E, 0x0004003D, 0x00000014, 0x00002A0E, 0x00000F48,\n    0x000500C4, 0x00000014, 0x0000538B, 0x00002A0E, 0x00000A2B, 0x0007004F,\n    0x00000011, 0x000042F0, 0x0000538B, 0x0000538B, 0x00000000, 0x00000001,\n    0x0007004F, 0x00000011, 0x0000242F, 0x0000578A, 0x0000578A, 0x00000000,\n    0x00000001, 0x000500AE, 0x0000000F, 0x00004288, 0x000042F0, 0x0000242F,\n    0x0004009A, 0x00000009, 0x00006067, 0x00004288, 0x000300F7, 0x000019BA,\n    0x00000002, 0x000400FA, 0x00006067, 0x000055E8, 0x000019BA, 0x000200F8,\n    0x000055E8, 0x000200F9, 0x00004C7A, 0x000200F8, 0x000019BA, 0x0004007C,\n    0x00000016, 0x00005BB6, 0x0000538B, 0x00050051, 0x0000000B, 0x00004916,\n    0x0000578A, 0x00000001, 0x00050051, 0x0000000C, 0x00005BEB, 0x00005BB6,\n    0x00000000, 0x00050084, 0x0000000C, 0x0000591A, 0x00005BEB, 0x00000A17,\n    0x00050051, 0x0000000C, 0x000018DA, 0x00005BB6, 0x00000002, 0x0004007C,\n    0x0000000C, 0x000038A9, 0x00004916, 0x00050084, 0x0000000C, 0x00002C0F,\n    0x000018DA, 0x000038A9, 0x00050051, 0x0000000C, 0x000044BE, 0x00005BB6,\n    0x00000001, 0x00050080, 0x0000000C, 0x000056D4, 0x00002C0F, 0x000044BE,\n    0x0004007C, 0x0000000C, 0x00005785, 0x000019C2, 0x00050084, 0x0000000C,\n    0x00005FD7, 0x000056D4, 0x00005785, 0x00050080, 0x0000000C, 0x00002042,\n    0x0000591A, 0x00005FD7, 0x0004007C, 0x0000000B, 0x00002A92, 0x00002042,\n    0x00050080, 0x0000000B, 0x00001F01, 0x0000578B, 0x00002A92, 0x000500C2,\n    0x00000011, 0x00004DD1, 0x000042F0, 0x0000073F, 0x00050086, 0x00000011,\n    0x00001E20, 0x00004DD1, 0x00001997, 0x00050084, 0x00000011, 0x00004707,\n    0x00001997, 0x00001E20, 0x00050082, 0x00000011, 0x00004761, 0x00004DD1,\n    0x00004707, 0x000500C4, 0x00000011, 0x00002BE0, 0x00001E20, 0x0000073F,\n    0x00050051, 0x0000000B, 0x000033E4, 0x00004761, 0x00000000, 0x00050051,\n    0x0000000B, 0x00002A78, 0x00001997, 0x00000001, 0x00050084, 0x0000000B,\n    0x00005966, 0x000033E4, 0x00002A78, 0x00050051, 0x0000000B, 0x00001B1F,\n    0x00004761, 0x00000001, 0x00050080, 0x0000000B, 0x000028E5, 0x00005966,\n    0x00001B1F, 0x000500C7, 0x00000011, 0x000049A3, 0x000042F0, 0x000007A3,\n    0x000500C4, 0x0000000B, 0x00002955, 0x000028E5, 0x00000A1F, 0x00050051,\n    0x0000000B, 0x000051B4, 0x000049A3, 0x00000001, 0x000500C4, 0x0000000B,\n    0x00005C2C, 0x000051B4, 0x00000A1C, 0x000500C5, 0x0000000B, 0x00004D66,\n    0x00002955, 0x00005C2C, 0x00050051, 0x0000000B, 0x000053E4, 0x000049A3,\n    0x00000000, 0x000500C4, 0x0000000B, 0x00002170, 0x000053E4, 0x00000A10,\n    0x000500C5, 0x0000000B, 0x000044F0, 0x00004D66, 0x00002170, 0x00050051,\n    0x0000000B, 0x00004DD3, 0x00002BE0, 0x00000000, 0x00060052, 0x00000014,\n    0x00003CC4, 0x00004DD3, 0x0000538B, 0x00000000, 0x00050051, 0x0000000B,\n    0x000059DE, 0x00002BE0, 0x00000001, 0x00060052, 0x00000014, 0x000025D0,\n    0x000059DE, 0x00003CC4, 0x00000001, 0x000300F7, 0x00004F78, 0x00000002,\n    0x000400FA, 0x000048EB, 0x00005BE0, 0x00002DD9, 0x000200F8, 0x00005BE0,\n    0x0004007C, 0x00000016, 0x0000277F, 0x000025D0, 0x000500C2, 0x0000000B,\n    0x00004C14, 0x00005788, 0x00000A1A, 0x000500C2, 0x0000000B, 0x0000497A,\n    0x00005789, 0x00000A17, 0x00050051, 0x0000000C, 0x00001A7E, 0x0000277F,\n    0x00000002, 0x000500C3, 0x0000000C, 0x00002F39, 0x00001A7E, 0x00000A11,\n    0x0004007C, 0x0000000C, 0x00005780, 0x0000497A, 0x00050084, 0x0000000C,\n    0x00001F02, 0x00002F39, 0x00005780, 0x00050051, 0x0000000C, 0x00006242,\n    0x0000277F, 0x00000001, 0x000500C3, 0x0000000C, 0x00004A6F, 0x00006242,\n    0x00000A17, 0x00050080, 0x0000000C, 0x00002B2C, 0x00001F02, 0x00004A6F,\n    0x0004007C, 0x0000000C, 0x00004202, 0x00004C14, 0x00050084, 0x0000000C,\n    0x00003A60, 0x00002B2C, 0x00004202, 0x00050051, 0x0000000C, 0x00006243,\n    0x0000277F, 0x00000000, 0x000500C3, 0x0000000C, 0x00004FC7, 0x00006243,\n    0x00000A1A, 0x00050080, 0x0000000C, 0x000049FC, 0x00003A60, 0x00004FC7,\n    0x000500C4, 0x0000000C, 0x0000225D, 0x000049FC, 0x00000A20, 0x000500C7,\n    0x0000000C, 0x00002CAA, 0x00001A7E, 0x00000A14, 0x000500C4, 0x0000000C,\n    0x00004CAE, 0x00002CAA, 0x00000A1A, 0x000500C3, 0x0000000C, 0x0000383E,\n    0x00006242, 0x00000A0E, 0x000500C7, 0x0000000C, 0x00005374, 0x0000383E,\n    0x00000A14, 0x000500C4, 0x0000000C, 0x000054CA, 0x00005374, 0x00000A14,\n    0x000500C5, 0x0000000C, 0x000042CE, 0x00004CAE, 0x000054CA, 0x000500C7,\n    0x0000000C, 0x000050D5, 0x00006243, 0x00000A20, 0x000500C5, 0x0000000C,\n    0x00003ADD, 0x000042CE, 0x000050D5, 0x000500C5, 0x0000000C, 0x000043B6,\n    0x0000225D, 0x00003ADD, 0x000500C4, 0x0000000C, 0x00005E50, 0x000043B6,\n    0x00000A10, 0x000500C3, 0x0000000C, 0x000032D7, 0x00006242, 0x00000A14,\n    0x000500C6, 0x0000000C, 0x000026C9, 0x000032D7, 0x00002F39, 0x000500C7,\n    0x0000000C, 0x00004199, 0x000026C9, 0x00000A0E, 0x000500C3, 0x0000000C,\n    0x00002590, 0x00006243, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000505E,\n    0x00002590, 0x00000A14, 0x000500C4, 0x0000000C, 0x0000541D, 0x00004199,\n    0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BA, 0x0000505E, 0x0000541D,\n    0x000500C7, 0x0000000C, 0x00005076, 0x00006242, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x00005228, 0x00005076, 0x00000A17, 0x000500C4, 0x0000000C,\n    0x00001998, 0x000022BA, 0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FE,\n    0x00005228, 0x00001998, 0x000500C4, 0x0000000C, 0x00001C00, 0x00004199,\n    0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C81, 0x000047FE, 0x00001C00,\n    0x000500C7, 0x0000000C, 0x000050AF, 0x00005E50, 0x00000A39, 0x000500C5,\n    0x0000000C, 0x00003C70, 0x00003C81, 0x000050AF, 0x000500C3, 0x0000000C,\n    0x00003745, 0x00005E50, 0x00000A17, 0x000500C7, 0x0000000C, 0x000018B8,\n    0x00003745, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000547E, 0x000018B8,\n    0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A8, 0x00003C70, 0x0000547E,\n    0x000500C3, 0x0000000C, 0x00003A6E, 0x00005E50, 0x00000A1A, 0x000500C7,\n    0x0000000C, 0x000018B9, 0x00003A6E, 0x00000A20, 0x000500C4, 0x0000000C,\n    0x0000547F, 0x000018B9, 0x00000A23, 0x000500C5, 0x0000000C, 0x0000456F,\n    0x000045A8, 0x0000547F, 0x000500C3, 0x0000000C, 0x00003C88, 0x00005E50,\n    0x00000A23, 0x000500C4, 0x0000000C, 0x00002824, 0x00003C88, 0x00000A2F,\n    0x000500C5, 0x0000000C, 0x00003B79, 0x0000456F, 0x00002824, 0x0004007C,\n    0x0000000B, 0x000041E5, 0x00003B79, 0x000200F9, 0x00004F78, 0x000200F8,\n    0x00002DD9, 0x0007004F, 0x00000011, 0x00002E84, 0x000025D0, 0x000025D0,\n    0x00000000, 0x00000001, 0x0004007C, 0x00000012, 0x00004F7B, 0x00002E84,\n    0x000500C2, 0x0000000B, 0x00002CA9, 0x00005788, 0x00000A1A, 0x00050051,\n    0x0000000C, 0x00003905, 0x00004F7B, 0x00000001, 0x000500C3, 0x0000000C,\n    0x00002F3A, 0x00003905, 0x00000A1A, 0x0004007C, 0x0000000C, 0x00005781,\n    0x00002CA9, 0x00050084, 0x0000000C, 0x00001F03, 0x00002F3A, 0x00005781,\n    0x00050051, 0x0000000C, 0x00006244, 0x00004F7B, 0x00000000, 0x000500C3,\n    0x0000000C, 0x00004FC8, 0x00006244, 0x00000A1A, 0x00050080, 0x0000000C,\n    0x000049B0, 0x00001F03, 0x00004FC8, 0x000500C4, 0x0000000C, 0x0000254A,\n    0x000049B0, 0x00000A1D, 0x000500C3, 0x0000000C, 0x0000603B, 0x00003905,\n    0x00000A0E, 0x000500C7, 0x0000000C, 0x0000539A, 0x0000603B, 0x00000A20,\n    0x000500C4, 0x0000000C, 0x0000534A, 0x0000539A, 0x00000A14, 0x000500C7,\n    0x0000000C, 0x00004EA5, 0x00006244, 0x00000A20, 0x000500C5, 0x0000000C,\n    0x00002B1A, 0x0000534A, 0x00004EA5, 0x000500C5, 0x0000000C, 0x000043B7,\n    0x0000254A, 0x00002B1A, 0x000500C4, 0x0000000C, 0x00005E63, 0x000043B7,\n    0x00000A10, 0x000500C3, 0x0000000C, 0x000031DE, 0x00003905, 0x00000A17,\n    0x000500C7, 0x0000000C, 0x00005447, 0x000031DE, 0x00000A0E, 0x000500C3,\n    0x0000000C, 0x000028A6, 0x00006244, 0x00000A14, 0x000500C7, 0x0000000C,\n    0x0000511E, 0x000028A6, 0x00000A14, 0x000500C3, 0x0000000C, 0x000028B9,\n    0x00003905, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000505F, 0x000028B9,\n    0x00000A0E, 0x000500C4, 0x0000000C, 0x0000541E, 0x0000505F, 0x00000A0E,\n    0x000500C6, 0x0000000C, 0x000022BB, 0x0000511E, 0x0000541E, 0x000500C7,\n    0x0000000C, 0x00005077, 0x00003905, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x00005229, 0x00005077, 0x00000A17, 0x000500C4, 0x0000000C, 0x00001999,\n    0x000022BB, 0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FF, 0x00005229,\n    0x00001999, 0x000500C4, 0x0000000C, 0x00001C01, 0x00005447, 0x00000A2C,\n    0x000500C5, 0x0000000C, 0x00003C82, 0x000047FF, 0x00001C01, 0x000500C7,\n    0x0000000C, 0x000050B0, 0x00005E63, 0x00000A39, 0x000500C5, 0x0000000C,\n    0x00003C71, 0x00003C82, 0x000050B0, 0x000500C3, 0x0000000C, 0x00003746,\n    0x00005E63, 0x00000A17, 0x000500C7, 0x0000000C, 0x000018BA, 0x00003746,\n    0x00000A0E, 0x000500C4, 0x0000000C, 0x00005480, 0x000018BA, 0x00000A1A,\n    0x000500C5, 0x0000000C, 0x000045A9, 0x00003C71, 0x00005480, 0x000500C3,\n    0x0000000C, 0x00003A6F, 0x00005E63, 0x00000A1A, 0x000500C7, 0x0000000C,\n    0x000018BB, 0x00003A6F, 0x00000A20, 0x000500C4, 0x0000000C, 0x00005481,\n    0x000018BB, 0x00000A23, 0x000500C5, 0x0000000C, 0x00004570, 0x000045A9,\n    0x00005481, 0x000500C3, 0x0000000C, 0x00003C89, 0x00005E63, 0x00000A23,\n    0x000500C4, 0x0000000C, 0x00002825, 0x00003C89, 0x00000A2F, 0x000500C5,\n    0x0000000C, 0x00003B7A, 0x00004570, 0x00002825, 0x0004007C, 0x0000000B,\n    0x000041E6, 0x00003B7A, 0x000200F9, 0x00004F78, 0x000200F8, 0x00004F78,\n    0x000700F5, 0x0000000B, 0x00004799, 0x000041E5, 0x00005BE0, 0x000041E6,\n    0x00002DD9, 0x00050051, 0x0000000B, 0x00003B60, 0x00001997, 0x00000000,\n    0x00050084, 0x0000000B, 0x00004451, 0x00003B60, 0x00002A78, 0x00050084,\n    0x0000000B, 0x00001C91, 0x00004799, 0x00004451, 0x00050080, 0x0000000B,\n    0x0000226F, 0x00001C91, 0x000044F0, 0x00050080, 0x0000000B, 0x000053DE,\n    0x0000226F, 0x00005EAC, 0x000500C2, 0x0000000B, 0x00003948, 0x000053DE,\n    0x00000A17, 0x00060041, 0x00000294, 0x00004FAF, 0x0000107A, 0x00000A0B,\n    0x00003948, 0x0004003D, 0x00000017, 0x00001CAA, 0x00004FAF, 0x000500AA,\n    0x00000009, 0x000035C0, 0x0000619E, 0x00000A0D, 0x000500AA, 0x00000009,\n    0x00005376, 0x0000619E, 0x00000A10, 0x000500A6, 0x00000009, 0x00005686,\n    0x000035C0, 0x00005376, 0x000300F7, 0x00003463, 0x00000000, 0x000400FA,\n    0x00005686, 0x00002957, 0x00003463, 0x000200F8, 0x00002957, 0x000500C7,\n    0x00000017, 0x0000475F, 0x00001CAA, 0x000009CE, 0x000500C4, 0x00000017,\n    0x000024D1, 0x0000475F, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AC,\n    0x00001CAA, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448D, 0x000050AC,\n    0x0000013D, 0x000500C5, 0x00000017, 0x00003FF8, 0x000024D1, 0x0000448D,\n    0x000200F9, 0x00003463, 0x000200F8, 0x00003463, 0x000700F5, 0x00000017,\n    0x00005879, 0x00001CAA, 0x00004F78, 0x00003FF8, 0x00002957, 0x000500AA,\n    0x00000009, 0x00004CB6, 0x0000619E, 0x00000A13, 0x000500A6, 0x00000009,\n    0x00003B23, 0x00005376, 0x00004CB6, 0x000300F7, 0x0000362B, 0x00000000,\n    0x000400FA, 0x00003B23, 0x00002B38, 0x0000362B, 0x000200F8, 0x00002B38,\n    0x000500C4, 0x00000017, 0x00005E17, 0x00005879, 0x000002ED, 0x000500C2,\n    0x00000017, 0x00003BE7, 0x00005879, 0x000002ED, 0x000500C5, 0x00000017,\n    0x000029E8, 0x00005E17, 0x00003BE7, 0x000200F9, 0x0000362B, 0x000200F8,\n    0x0000362B, 0x000700F5, 0x00000017, 0x00004523, 0x00005879, 0x00003463,\n    0x000029E8, 0x00002B38, 0x000500C2, 0x0000000B, 0x00004E2D, 0x00001F01,\n    0x00000A17, 0x0004007C, 0x0000001A, 0x00005C4A, 0x00004523, 0x000500C4,\n    0x0000001A, 0x00002C1C, 0x00005C4A, 0x00000302, 0x000500C3, 0x0000001A,\n    0x00004098, 0x00002C1C, 0x00000302, 0x0004006F, 0x0000001D, 0x00002A97,\n    0x00004098, 0x0005008E, 0x0000001D, 0x00004FBD, 0x00002A97, 0x00000A38,\n    0x0007000C, 0x0000001D, 0x00005DB5, 0x00000001, 0x00000028, 0x00000504,\n    0x00004FBD, 0x000500C3, 0x0000001A, 0x00003802, 0x00005C4A, 0x00000302,\n    0x0004006F, 0x0000001D, 0x000019CF, 0x00003802, 0x0005008E, 0x0000001D,\n    0x00004747, 0x000019CF, 0x00000A38, 0x0007000C, 0x0000001D, 0x00005E06,\n    0x00000001, 0x00000028, 0x00000504, 0x00004747, 0x00050051, 0x0000000D,\n    0x00005F0A, 0x00005DB5, 0x00000000, 0x00050051, 0x0000000D, 0x000037EF,\n    0x00005E06, 0x00000000, 0x00050050, 0x00000013, 0x00004B20, 0x00005F0A,\n    0x000037EF, 0x0006000C, 0x0000000B, 0x00002171, 0x00000001, 0x0000003A,\n    0x00004B20, 0x00050051, 0x0000000D, 0x00005BBF, 0x00005DB5, 0x00000001,\n    0x00050051, 0x0000000D, 0x000039A7, 0x00005E06, 0x00000001, 0x00050050,\n    0x00000013, 0x00004B21, 0x00005BBF, 0x000039A7, 0x0006000C, 0x0000000B,\n    0x00002172, 0x00000001, 0x0000003A, 0x00004B21, 0x00050051, 0x0000000D,\n    0x00005BC0, 0x00005DB5, 0x00000002, 0x00050051, 0x0000000D, 0x000039A8,\n    0x00005E06, 0x00000002, 0x00050050, 0x00000013, 0x00004B22, 0x00005BC0,\n    0x000039A8, 0x0006000C, 0x0000000B, 0x00002173, 0x00000001, 0x0000003A,\n    0x00004B22, 0x00050051, 0x0000000D, 0x00005BC1, 0x00005DB5, 0x00000003,\n    0x00050051, 0x0000000D, 0x000039A9, 0x00005E06, 0x00000003, 0x00050050,\n    0x00000013, 0x00004B0D, 0x00005BC1, 0x000039A9, 0x0006000C, 0x0000000B,\n    0x000020EE, 0x00000001, 0x0000003A, 0x00004B0D, 0x00070050, 0x00000017,\n    0x00003ABB, 0x00002171, 0x00002172, 0x00002173, 0x000020EE, 0x00060041,\n    0x00000294, 0x000045C3, 0x0000140E, 0x00000A0B, 0x00004E2D, 0x0003003E,\n    0x000045C3, 0x00003ABB, 0x00050080, 0x0000000B, 0x00005679, 0x00001F01,\n    0x00000A3A, 0x00050080, 0x0000000B, 0x000027E6, 0x000053DE, 0x00000A3A,\n    0x000500C2, 0x0000000B, 0x00003949, 0x000027E6, 0x00000A17, 0x00060041,\n    0x00000294, 0x00005566, 0x0000107A, 0x00000A0B, 0x00003949, 0x0004003D,\n    0x00000017, 0x00003910, 0x00005566, 0x000300F7, 0x00003A1A, 0x00000000,\n    0x000400FA, 0x00005686, 0x00002958, 0x00003A1A, 0x000200F8, 0x00002958,\n    0x000500C7, 0x00000017, 0x00004760, 0x00003910, 0x000009CE, 0x000500C4,\n    0x00000017, 0x000024D2, 0x00004760, 0x0000013D, 0x000500C7, 0x00000017,\n    0x000050AD, 0x00003910, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448E,\n    0x000050AD, 0x0000013D, 0x000500C5, 0x00000017, 0x00003FF9, 0x000024D2,\n    0x0000448E, 0x000200F9, 0x00003A1A, 0x000200F8, 0x00003A1A, 0x000700F5,\n    0x00000017, 0x00002AAC, 0x00003910, 0x0000362B, 0x00003FF9, 0x00002958,\n    0x000300F7, 0x0000362C, 0x00000000, 0x000400FA, 0x00003B23, 0x00002B39,\n    0x0000362C, 0x000200F8, 0x00002B39, 0x000500C4, 0x00000017, 0x00005E18,\n    0x00002AAC, 0x000002ED, 0x000500C2, 0x00000017, 0x00003BE8, 0x00002AAC,\n    0x000002ED, 0x000500C5, 0x00000017, 0x000029E9, 0x00005E18, 0x00003BE8,\n    0x000200F9, 0x0000362C, 0x000200F8, 0x0000362C, 0x000700F5, 0x00000017,\n    0x00004524, 0x00002AAC, 0x00003A1A, 0x000029E9, 0x00002B39, 0x000500C2,\n    0x0000000B, 0x00004E2E, 0x00005679, 0x00000A17, 0x0004007C, 0x0000001A,\n    0x00005C4B, 0x00004524, 0x000500C4, 0x0000001A, 0x00002C1D, 0x00005C4B,\n    0x00000302, 0x000500C3, 0x0000001A, 0x00004099, 0x00002C1D, 0x00000302,\n    0x0004006F, 0x0000001D, 0x00002A98, 0x00004099, 0x0005008E, 0x0000001D,\n    0x00004FBE, 0x00002A98, 0x00000A38, 0x0007000C, 0x0000001D, 0x00005DB6,\n    0x00000001, 0x00000028, 0x00000504, 0x00004FBE, 0x000500C3, 0x0000001A,\n    0x00003803, 0x00005C4B, 0x00000302, 0x0004006F, 0x0000001D, 0x000019D0,\n    0x00003803, 0x0005008E, 0x0000001D, 0x00004748, 0x000019D0, 0x00000A38,\n    0x0007000C, 0x0000001D, 0x00005E07, 0x00000001, 0x00000028, 0x00000504,\n    0x00004748, 0x00050051, 0x0000000D, 0x00005F0B, 0x00005DB6, 0x00000000,\n    0x00050051, 0x0000000D, 0x000037F0, 0x00005E07, 0x00000000, 0x00050050,\n    0x00000013, 0x00004B23, 0x00005F0B, 0x000037F0, 0x0006000C, 0x0000000B,\n    0x00002174, 0x00000001, 0x0000003A, 0x00004B23, 0x00050051, 0x0000000D,\n    0x00005BC2, 0x00005DB6, 0x00000001, 0x00050051, 0x0000000D, 0x000039AA,\n    0x00005E07, 0x00000001, 0x00050050, 0x00000013, 0x00004B24, 0x00005BC2,\n    0x000039AA, 0x0006000C, 0x0000000B, 0x00002175, 0x00000001, 0x0000003A,\n    0x00004B24, 0x00050051, 0x0000000D, 0x00005BC3, 0x00005DB6, 0x00000002,\n    0x00050051, 0x0000000D, 0x000039AB, 0x00005E07, 0x00000002, 0x00050050,\n    0x00000013, 0x00004B25, 0x00005BC3, 0x000039AB, 0x0006000C, 0x0000000B,\n    0x00002176, 0x00000001, 0x0000003A, 0x00004B25, 0x00050051, 0x0000000D,\n    0x00005BC4, 0x00005DB6, 0x00000003, 0x00050051, 0x0000000D, 0x000039AC,\n    0x00005E07, 0x00000003, 0x00050050, 0x00000013, 0x00004B0E, 0x00005BC4,\n    0x000039AC, 0x0006000C, 0x0000000B, 0x000020EF, 0x00000001, 0x0000003A,\n    0x00004B0E, 0x00070050, 0x00000017, 0x00003ABC, 0x00002174, 0x00002175,\n    0x00002176, 0x000020EF, 0x00060041, 0x00000294, 0x00004EBE, 0x0000140E,\n    0x00000A0B, 0x00004E2E, 0x0003003E, 0x00004EBE, 0x00003ABC, 0x000200F9,\n    0x00004C7A, 0x000200F8, 0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_rg16_unorm_float_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25155\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v4uint = OpTypeVector %uint 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v2uint = OpTypeVector %uint 2\n     %v3uint = OpTypeVector %uint 3\n      %float = OpTypeFloat 32\n    %v4float = OpTypeVector %float 4\n %uint_65535 = OpConstant %uint 65535\n%float_1_52590219en05 = OpConstant %float 1.52590219e-05\n    %uint_16 = OpConstant %uint 16\n     %uint_0 = OpConstant %uint 0\n    %v2float = OpTypeVector %float 2\n     %uint_1 = OpConstant %uint 1\n     %uint_2 = OpConstant %uint 2\n     %uint_3 = OpConstant %uint 3\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n      %int_3 = OpConstant %int 3\n      %int_2 = OpConstant %int 2\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %2603 = OpConstantComposite %v3uint %uint_3 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n     %uint_4 = OpConstant %uint 4\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n    %uint_32 = OpConstant %uint 32\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n        %850 = OpConstantComposite %v4uint %uint_65535 %uint_65535 %uint_65535 %uint_65535\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24540 = OpBitwiseAnd %uint %13606 %uint_1\n      %17270 = OpINotEqual %bool %24540 %uint_0\n      %12328 = OpBitwiseAnd %uint %13606 %uint_2\n      %17284 = OpINotEqual %bool %12328 %uint_0\n       %7856 = OpShiftRightLogical %uint %13606 %uint_2\n      %25058 = OpBitwiseAnd %uint %7856 %uint_3\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2603\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %6586 DontFlatten\n               OpBranchConditional %24679 %21992 %6586\n      %21992 = OpLabel\n               OpBranch %19578\n       %6586 = OpLabel\n      %23478 = OpBitcast %v3int %21387\n      %18710 = OpCompositeExtract %uint %22410 1\n      %23531 = OpCompositeExtract %int %23478 0\n      %22810 = OpIMul %int %23531 %int_4\n       %6362 = OpCompositeExtract %int %23478 2\n      %14505 = OpBitcast %int %18710\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %23478 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %6594\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %22810 %24535\n      %10404 = OpBitcast %uint %8258\n      %14582 = OpIAdd %uint %22411 %10404\n      %12308 = OpLogicalNot %bool %17270\n               OpSelectionMerge %19040 DontFlatten\n               OpBranchConditional %12308 %9741 %17007\n       %9741 = OpLabel\n      %17463 = OpCompositeExtract %uint %21387 0\n      %11246 = OpCompositeExtract %uint %21387 1\n      %18801 = OpCompositeExtract %uint %21387 2\n      %14831 = OpIMul %uint %22409 %18801\n      %20322 = OpIAdd %uint %11246 %14831\n      %21676 = OpIMul %uint %22408 %20322\n      %20398 = OpIAdd %uint %17463 %21676\n      %11367 = OpShiftLeftLogical %uint %20398 %uint_2\n               OpBranch %19040\n      %17007 = OpLabel\n               OpSelectionMerge %23536 DontFlatten\n               OpBranchConditional %17284 %11410 %24353\n      %11410 = OpLabel\n      %21364 = OpShiftRightLogical %uint %22408 %int_5\n      %13804 = OpShiftRightLogical %uint %22409 %int_4\n      %13237 = OpShiftRightArithmetic %int %6362 %int_2\n      %22374 = OpBitcast %int %13804\n      %25085 = OpIMul %int %13237 %22374\n      %11618 = OpShiftRightArithmetic %int %17598 %int_4\n      %16670 = OpIAdd %int %25085 %11618\n      %19064 = OpBitcast %int %21364\n      %13020 = OpIMul %int %16670 %19064\n      %12986 = OpShiftRightArithmetic %int %23531 %int_5\n      %24558 = OpIAdd %int %13020 %12986\n       %8797 = OpShiftLeftLogical %int %24558 %int_7\n      %11434 = OpBitwiseAnd %int %6362 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %17598 %int_1\n      %21365 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21365 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %23531 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17334 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17334 %uint_2\n      %13015 = OpShiftRightArithmetic %int %17598 %int_3\n       %9929 = OpBitwiseXor %int %13015 %13237\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %23531 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %17598 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6551\n       %7168 = OpShiftLeftLogical %int %16793 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24144 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24144 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24144 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24144 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %23536\n      %24353 = OpLabel\n      %23000 = OpBitcast %v2int %17136\n      %22120 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %23000 1\n      %12089 = OpShiftRightArithmetic %int %14597 %int_5\n      %22400 = OpBitcast %int %22120\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %23000 0\n      %20423 = OpShiftRightArithmetic %int %25154 %int_5\n      %18864 = OpIAdd %int %7938 %20423\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25154 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17335 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17335 %uint_2\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25154 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6552\n       %7169 = OpShiftLeftLogical %int %21575 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24163 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24163 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24163 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %23536\n      %23536 = OpLabel\n      %10540 = OpPhi %uint %16869 %11410 %16870 %24353\n               OpBranch %19040\n      %19040 = OpLabel\n      %11376 = OpPhi %uint %11367 %9741 %10540 %23536\n      %18621 = OpIAdd %uint %11376 %24236\n      %15698 = OpShiftRightLogical %uint %18621 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15698\n       %7338 = OpLoad %v4uint %20399\n      %13760 = OpIEqual %bool %25058 %uint_1\n      %21366 = OpIEqual %bool %25058 %uint_2\n      %22150 = OpLogicalOr %bool %13760 %21366\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %7338 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %7338 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22649 = OpPhi %v4uint %7338 %19040 %16376 %10583\n      %19638 = OpIEqual %bool %25058 %uint_3\n      %15139 = OpLogicalOr %bool %21366 %19638\n               OpSelectionMerge %13867 None\n               OpBranchConditional %15139 %11064 %13867\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22649 %749\n      %15335 = OpShiftRightLogical %v4uint %22649 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %13867\n      %13867 = OpLabel\n      %19124 = OpPhi %v4uint %22649 %13411 %10728 %11064\n      %24513 = OpShiftRightLogical %uint %14582 %int_4\n       %7420 = OpBitwiseAnd %v4uint %19124 %850\n      %16133 = OpConvertUToF %v4float %7420\n      %19365 = OpVectorTimesScalar %v4float %16133 %float_1_52590219en05\n      %23367 = OpShiftRightLogical %v4uint %19124 %749\n      %18492 = OpConvertUToF %v4float %23367\n      %18450 = OpVectorTimesScalar %v4float %18492 %float_1_52590219en05\n       %6268 = OpCompositeExtract %float %19365 0\n      %13806 = OpCompositeExtract %float %18450 0\n      %19232 = OpCompositeConstruct %v2float %6268 %13806\n       %8561 = OpExtInst %uint %1 PackHalf2x16 %19232\n      %23487 = OpCompositeExtract %float %19365 1\n      %14759 = OpCompositeExtract %float %18450 1\n      %19233 = OpCompositeConstruct %v2float %23487 %14759\n       %8562 = OpExtInst %uint %1 PackHalf2x16 %19233\n      %23488 = OpCompositeExtract %float %19365 2\n      %14760 = OpCompositeExtract %float %18450 2\n      %19234 = OpCompositeConstruct %v2float %23488 %14760\n       %8563 = OpExtInst %uint %1 PackHalf2x16 %19234\n      %23489 = OpCompositeExtract %float %19365 3\n      %14761 = OpCompositeExtract %float %18450 3\n      %19213 = OpCompositeConstruct %v2float %23489 %14761\n       %8430 = OpExtInst %uint %1 PackHalf2x16 %19213\n      %15035 = OpCompositeConstruct %v4uint %8561 %8562 %8563 %8430\n      %17859 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %24513\n               OpStore %17859 %15035\n      %21685 = OpIAdd %uint %14582 %uint_16\n               OpSelectionMerge %24688 DontFlatten\n               OpBranchConditional %17270 %21993 %7205\n      %21993 = OpLabel\n               OpBranch %24688\n       %7205 = OpLabel\n               OpBranch %24688\n      %24688 = OpLabel\n      %11377 = OpPhi %uint %uint_32 %21993 %uint_16 %7205\n      %18622 = OpIAdd %uint %18621 %11377\n      %15699 = OpShiftRightLogical %uint %18622 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15699\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %14874 None\n               OpBranchConditional %22150 %10584 %14874\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %14874\n      %14874 = OpLabel\n      %10924 = OpPhi %v4uint %14608 %24688 %16377 %10584\n               OpSelectionMerge %13868 None\n               OpBranchConditional %15139 %11065 %13868\n      %11065 = OpLabel\n      %24088 = OpShiftLeftLogical %v4uint %10924 %749\n      %15336 = OpShiftRightLogical %v4uint %10924 %749\n      %10729 = OpBitwiseOr %v4uint %24088 %15336\n               OpBranch %13868\n      %13868 = OpLabel\n      %19125 = OpPhi %v4uint %10924 %14874 %10729 %11065\n      %24514 = OpShiftRightLogical %uint %21685 %int_4\n       %7421 = OpBitwiseAnd %v4uint %19125 %850\n      %16134 = OpConvertUToF %v4float %7421\n      %19366 = OpVectorTimesScalar %v4float %16134 %float_1_52590219en05\n      %23368 = OpShiftRightLogical %v4uint %19125 %749\n      %18493 = OpConvertUToF %v4float %23368\n      %18451 = OpVectorTimesScalar %v4float %18493 %float_1_52590219en05\n       %6269 = OpCompositeExtract %float %19366 0\n      %13807 = OpCompositeExtract %float %18451 0\n      %19235 = OpCompositeConstruct %v2float %6269 %13807\n       %8564 = OpExtInst %uint %1 PackHalf2x16 %19235\n      %23490 = OpCompositeExtract %float %19366 1\n      %14762 = OpCompositeExtract %float %18451 1\n      %19236 = OpCompositeConstruct %v2float %23490 %14762\n       %8565 = OpExtInst %uint %1 PackHalf2x16 %19236\n      %23491 = OpCompositeExtract %float %19366 2\n      %14763 = OpCompositeExtract %float %18451 2\n      %19237 = OpCompositeConstruct %v2float %23491 %14763\n       %8566 = OpExtInst %uint %1 PackHalf2x16 %19237\n      %23492 = OpCompositeExtract %float %19366 3\n      %14764 = OpCompositeExtract %float %18451 3\n      %19214 = OpCompositeConstruct %v2float %23492 %14764\n       %8431 = OpExtInst %uint %1 PackHalf2x16 %19214\n      %15036 = OpCompositeConstruct %v4uint %8564 %8565 %8566 %8431\n      %20158 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %24514\n               OpStore %20158 %15036\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_rg16_unorm_float_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006243, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000017, 0x0000000B, 0x00000004, 0x00040015, 0x0000000C,\n    0x00000020, 0x00000001, 0x00040017, 0x00000012, 0x0000000C, 0x00000002,\n    0x00040017, 0x00000016, 0x0000000C, 0x00000003, 0x00020014, 0x00000009,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x00030016, 0x0000000D, 0x00000020, 0x00040017,\n    0x0000001D, 0x0000000D, 0x00000004, 0x0004002B, 0x0000000B, 0x000001C1,\n    0x0000FFFF, 0x0004002B, 0x0000000D, 0x0000092A, 0x37800080, 0x0004002B,\n    0x0000000B, 0x00000A3A, 0x00000010, 0x0004002B, 0x0000000B, 0x00000A0A,\n    0x00000000, 0x00040017, 0x00000013, 0x0000000D, 0x00000002, 0x0004002B,\n    0x0000000B, 0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B, 0x00000A10,\n    0x00000002, 0x0004002B, 0x0000000B, 0x00000A13, 0x00000003, 0x0004002B,\n    0x0000000B, 0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B, 0x00000A22,\n    0x00000008, 0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00, 0x0004002B,\n    0x0000000C, 0x00000A17, 0x00000004, 0x0004002B, 0x0000000C, 0x00000A1D,\n    0x00000006, 0x0004002B, 0x0000000C, 0x00000A2C, 0x0000000B, 0x0004002B,\n    0x0000000C, 0x00000A38, 0x0000000F, 0x0004002B, 0x0000000C, 0x00000A0E,\n    0x00000001, 0x0004002B, 0x0000000C, 0x00000A1A, 0x00000005, 0x0004002B,\n    0x0000000C, 0x00000A20, 0x00000007, 0x0004002B, 0x0000000C, 0x00000A23,\n    0x00000008, 0x0004002B, 0x0000000C, 0x00000A2F, 0x0000000C, 0x0004002B,\n    0x0000000C, 0x00000A14, 0x00000003, 0x0004002B, 0x0000000C, 0x00000A11,\n    0x00000002, 0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000, 0x000A001E,\n    0x00000489, 0x0000000B, 0x0000000B, 0x0000000B, 0x0000000B, 0x00000014,\n    0x0000000B, 0x0000000B, 0x0000000B, 0x00040020, 0x00000706, 0x00000009,\n    0x00000489, 0x0004003B, 0x00000706, 0x00000CE9, 0x00000009, 0x00040020,\n    0x00000288, 0x00000009, 0x0000000B, 0x00040020, 0x00000291, 0x00000009,\n    0x00000014, 0x00040020, 0x00000292, 0x00000001, 0x00000014, 0x0004003B,\n    0x00000292, 0x00000F48, 0x00000001, 0x0006002C, 0x00000014, 0x00000A2B,\n    0x00000A13, 0x00000A0A, 0x00000A0A, 0x00040017, 0x0000000F, 0x00000009,\n    0x00000002, 0x0004002B, 0x0000000B, 0x00000A16, 0x00000004, 0x0003001D,\n    0x000007DC, 0x00000017, 0x0003001E, 0x000007B4, 0x000007DC, 0x00040020,\n    0x00000A31, 0x00000002, 0x000007B4, 0x0004003B, 0x00000A31, 0x0000107A,\n    0x00000002, 0x00040020, 0x00000294, 0x00000002, 0x00000017, 0x0003001D,\n    0x000007DD, 0x00000017, 0x0003001E, 0x000007B5, 0x000007DD, 0x00040020,\n    0x00000A32, 0x00000002, 0x000007B5, 0x0004003B, 0x00000A32, 0x0000140E,\n    0x00000002, 0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020, 0x0006002C,\n    0x00000014, 0x00000BC3, 0x00000A16, 0x00000A6A, 0x00000A0D, 0x0007002C,\n    0x00000017, 0x000009CE, 0x000008A6, 0x000008A6, 0x000008A6, 0x000008A6,\n    0x0007002C, 0x00000017, 0x0000013D, 0x00000A22, 0x00000A22, 0x00000A22,\n    0x00000A22, 0x0007002C, 0x00000017, 0x0000072E, 0x000005FD, 0x000005FD,\n    0x000005FD, 0x000005FD, 0x0007002C, 0x00000017, 0x000002ED, 0x00000A3A,\n    0x00000A3A, 0x00000A3A, 0x00000A3A, 0x0007002C, 0x00000017, 0x00000352,\n    0x000001C1, 0x000001C1, 0x000001C1, 0x000001C1, 0x00050036, 0x00000008,\n    0x0000161F, 0x00000000, 0x00000502, 0x000200F8, 0x00003B06, 0x000300F7,\n    0x00004C7A, 0x00000000, 0x000300FB, 0x00000A0A, 0x00002E68, 0x000200F8,\n    0x00002E68, 0x00050041, 0x00000288, 0x000060D7, 0x00000CE9, 0x00000A0B,\n    0x0004003D, 0x0000000B, 0x00003526, 0x000060D7, 0x000500C7, 0x0000000B,\n    0x00005FDC, 0x00003526, 0x00000A0D, 0x000500AB, 0x00000009, 0x00004376,\n    0x00005FDC, 0x00000A0A, 0x000500C7, 0x0000000B, 0x00003028, 0x00003526,\n    0x00000A10, 0x000500AB, 0x00000009, 0x00004384, 0x00003028, 0x00000A0A,\n    0x000500C2, 0x0000000B, 0x00001EB0, 0x00003526, 0x00000A10, 0x000500C7,\n    0x0000000B, 0x000061E2, 0x00001EB0, 0x00000A13, 0x00050041, 0x00000288,\n    0x0000492C, 0x00000CE9, 0x00000A0E, 0x0004003D, 0x0000000B, 0x00005EAC,\n    0x0000492C, 0x00050041, 0x00000288, 0x00004EBA, 0x00000CE9, 0x00000A11,\n    0x0004003D, 0x0000000B, 0x00005788, 0x00004EBA, 0x00050041, 0x00000288,\n    0x00004EBB, 0x00000CE9, 0x00000A14, 0x0004003D, 0x0000000B, 0x00005789,\n    0x00004EBB, 0x00050041, 0x00000291, 0x00004EBC, 0x00000CE9, 0x00000A17,\n    0x0004003D, 0x00000014, 0x0000578A, 0x00004EBC, 0x00050041, 0x00000288,\n    0x00004EBD, 0x00000CE9, 0x00000A1A, 0x0004003D, 0x0000000B, 0x0000578B,\n    0x00004EBD, 0x00050041, 0x00000288, 0x00004E6E, 0x00000CE9, 0x00000A1D,\n    0x0004003D, 0x0000000B, 0x000019C2, 0x00004E6E, 0x0004003D, 0x00000014,\n    0x00002A0E, 0x00000F48, 0x000500C4, 0x00000014, 0x0000538B, 0x00002A0E,\n    0x00000A2B, 0x0007004F, 0x00000011, 0x000042F0, 0x0000538B, 0x0000538B,\n    0x00000000, 0x00000001, 0x0007004F, 0x00000011, 0x0000242F, 0x0000578A,\n    0x0000578A, 0x00000000, 0x00000001, 0x000500AE, 0x0000000F, 0x00004288,\n    0x000042F0, 0x0000242F, 0x0004009A, 0x00000009, 0x00006067, 0x00004288,\n    0x000300F7, 0x000019BA, 0x00000002, 0x000400FA, 0x00006067, 0x000055E8,\n    0x000019BA, 0x000200F8, 0x000055E8, 0x000200F9, 0x00004C7A, 0x000200F8,\n    0x000019BA, 0x0004007C, 0x00000016, 0x00005BB6, 0x0000538B, 0x00050051,\n    0x0000000B, 0x00004916, 0x0000578A, 0x00000001, 0x00050051, 0x0000000C,\n    0x00005BEB, 0x00005BB6, 0x00000000, 0x00050084, 0x0000000C, 0x0000591A,\n    0x00005BEB, 0x00000A17, 0x00050051, 0x0000000C, 0x000018DA, 0x00005BB6,\n    0x00000002, 0x0004007C, 0x0000000C, 0x000038A9, 0x00004916, 0x00050084,\n    0x0000000C, 0x00002C0F, 0x000018DA, 0x000038A9, 0x00050051, 0x0000000C,\n    0x000044BE, 0x00005BB6, 0x00000001, 0x00050080, 0x0000000C, 0x000056D4,\n    0x00002C0F, 0x000044BE, 0x0004007C, 0x0000000C, 0x00005785, 0x000019C2,\n    0x00050084, 0x0000000C, 0x00005FD7, 0x000056D4, 0x00005785, 0x00050080,\n    0x0000000C, 0x00002042, 0x0000591A, 0x00005FD7, 0x0004007C, 0x0000000B,\n    0x000028A4, 0x00002042, 0x00050080, 0x0000000B, 0x000038F6, 0x0000578B,\n    0x000028A4, 0x000400A8, 0x00000009, 0x00003014, 0x00004376, 0x000300F7,\n    0x00004A60, 0x00000002, 0x000400FA, 0x00003014, 0x0000260D, 0x0000426F,\n    0x000200F8, 0x0000260D, 0x00050051, 0x0000000B, 0x00004437, 0x0000538B,\n    0x00000000, 0x00050051, 0x0000000B, 0x00002BEE, 0x0000538B, 0x00000001,\n    0x00050051, 0x0000000B, 0x00004971, 0x0000538B, 0x00000002, 0x00050084,\n    0x0000000B, 0x000039EF, 0x00005789, 0x00004971, 0x00050080, 0x0000000B,\n    0x00004F62, 0x00002BEE, 0x000039EF, 0x00050084, 0x0000000B, 0x000054AC,\n    0x00005788, 0x00004F62, 0x00050080, 0x0000000B, 0x00004FAE, 0x00004437,\n    0x000054AC, 0x000500C4, 0x0000000B, 0x00002C67, 0x00004FAE, 0x00000A10,\n    0x000200F9, 0x00004A60, 0x000200F8, 0x0000426F, 0x000300F7, 0x00005BF0,\n    0x00000002, 0x000400FA, 0x00004384, 0x00002C92, 0x00005F21, 0x000200F8,\n    0x00002C92, 0x000500C2, 0x0000000B, 0x00005374, 0x00005788, 0x00000A1A,\n    0x000500C2, 0x0000000B, 0x000035EC, 0x00005789, 0x00000A17, 0x000500C3,\n    0x0000000C, 0x000033B5, 0x000018DA, 0x00000A11, 0x0004007C, 0x0000000C,\n    0x00005766, 0x000035EC, 0x00050084, 0x0000000C, 0x000061FD, 0x000033B5,\n    0x00005766, 0x000500C3, 0x0000000C, 0x00002D62, 0x000044BE, 0x00000A17,\n    0x00050080, 0x0000000C, 0x0000411E, 0x000061FD, 0x00002D62, 0x0004007C,\n    0x0000000C, 0x00004A78, 0x00005374, 0x00050084, 0x0000000C, 0x000032DC,\n    0x0000411E, 0x00004A78, 0x000500C3, 0x0000000C, 0x000032BA, 0x00005BEB,\n    0x00000A1A, 0x00050080, 0x0000000C, 0x00005FEE, 0x000032DC, 0x000032BA,\n    0x000500C4, 0x0000000C, 0x0000225D, 0x00005FEE, 0x00000A20, 0x000500C7,\n    0x0000000C, 0x00002CAA, 0x000018DA, 0x00000A14, 0x000500C4, 0x0000000C,\n    0x00004CAE, 0x00002CAA, 0x00000A1A, 0x000500C3, 0x0000000C, 0x0000383E,\n    0x000044BE, 0x00000A0E, 0x000500C7, 0x0000000C, 0x00005375, 0x0000383E,\n    0x00000A14, 0x000500C4, 0x0000000C, 0x000054CA, 0x00005375, 0x00000A14,\n    0x000500C5, 0x0000000C, 0x000042CE, 0x00004CAE, 0x000054CA, 0x000500C7,\n    0x0000000C, 0x000050D5, 0x00005BEB, 0x00000A20, 0x000500C5, 0x0000000C,\n    0x00003ADD, 0x000042CE, 0x000050D5, 0x000500C5, 0x0000000C, 0x000043B6,\n    0x0000225D, 0x00003ADD, 0x000500C4, 0x0000000C, 0x00005E50, 0x000043B6,\n    0x00000A10, 0x000500C3, 0x0000000C, 0x000032D7, 0x000044BE, 0x00000A14,\n    0x000500C6, 0x0000000C, 0x000026C9, 0x000032D7, 0x000033B5, 0x000500C7,\n    0x0000000C, 0x00004199, 0x000026C9, 0x00000A0E, 0x000500C3, 0x0000000C,\n    0x00002590, 0x00005BEB, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000505E,\n    0x00002590, 0x00000A14, 0x000500C4, 0x0000000C, 0x0000541D, 0x00004199,\n    0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BA, 0x0000505E, 0x0000541D,\n    0x000500C7, 0x0000000C, 0x00005076, 0x000044BE, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x00005228, 0x00005076, 0x00000A17, 0x000500C4, 0x0000000C,\n    0x00001997, 0x000022BA, 0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FE,\n    0x00005228, 0x00001997, 0x000500C4, 0x0000000C, 0x00001C00, 0x00004199,\n    0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C81, 0x000047FE, 0x00001C00,\n    0x000500C7, 0x0000000C, 0x000050AF, 0x00005E50, 0x00000A38, 0x000500C5,\n    0x0000000C, 0x00003C70, 0x00003C81, 0x000050AF, 0x000500C3, 0x0000000C,\n    0x00003745, 0x00005E50, 0x00000A17, 0x000500C7, 0x0000000C, 0x000018B8,\n    0x00003745, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000547E, 0x000018B8,\n    0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A8, 0x00003C70, 0x0000547E,\n    0x000500C3, 0x0000000C, 0x00003A6E, 0x00005E50, 0x00000A1A, 0x000500C7,\n    0x0000000C, 0x000018B9, 0x00003A6E, 0x00000A20, 0x000500C4, 0x0000000C,\n    0x0000547F, 0x000018B9, 0x00000A23, 0x000500C5, 0x0000000C, 0x0000456F,\n    0x000045A8, 0x0000547F, 0x000500C3, 0x0000000C, 0x00003C88, 0x00005E50,\n    0x00000A23, 0x000500C4, 0x0000000C, 0x00002824, 0x00003C88, 0x00000A2F,\n    0x000500C5, 0x0000000C, 0x00003B79, 0x0000456F, 0x00002824, 0x0004007C,\n    0x0000000B, 0x000041E5, 0x00003B79, 0x000200F9, 0x00005BF0, 0x000200F8,\n    0x00005F21, 0x0004007C, 0x00000012, 0x000059D8, 0x000042F0, 0x000500C2,\n    0x0000000B, 0x00005668, 0x00005788, 0x00000A1A, 0x00050051, 0x0000000C,\n    0x00003905, 0x000059D8, 0x00000001, 0x000500C3, 0x0000000C, 0x00002F39,\n    0x00003905, 0x00000A1A, 0x0004007C, 0x0000000C, 0x00005780, 0x00005668,\n    0x00050084, 0x0000000C, 0x00001F02, 0x00002F39, 0x00005780, 0x00050051,\n    0x0000000C, 0x00006242, 0x000059D8, 0x00000000, 0x000500C3, 0x0000000C,\n    0x00004FC7, 0x00006242, 0x00000A1A, 0x00050080, 0x0000000C, 0x000049B0,\n    0x00001F02, 0x00004FC7, 0x000500C4, 0x0000000C, 0x0000254A, 0x000049B0,\n    0x00000A1D, 0x000500C3, 0x0000000C, 0x0000603B, 0x00003905, 0x00000A0E,\n    0x000500C7, 0x0000000C, 0x0000539A, 0x0000603B, 0x00000A20, 0x000500C4,\n    0x0000000C, 0x0000534A, 0x0000539A, 0x00000A14, 0x000500C7, 0x0000000C,\n    0x00004EA5, 0x00006242, 0x00000A20, 0x000500C5, 0x0000000C, 0x00002B1A,\n    0x0000534A, 0x00004EA5, 0x000500C5, 0x0000000C, 0x000043B7, 0x0000254A,\n    0x00002B1A, 0x000500C4, 0x0000000C, 0x00005E63, 0x000043B7, 0x00000A10,\n    0x000500C3, 0x0000000C, 0x000031DE, 0x00003905, 0x00000A17, 0x000500C7,\n    0x0000000C, 0x00005447, 0x000031DE, 0x00000A0E, 0x000500C3, 0x0000000C,\n    0x000028A6, 0x00006242, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000511E,\n    0x000028A6, 0x00000A14, 0x000500C3, 0x0000000C, 0x000028B9, 0x00003905,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x0000505F, 0x000028B9, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x0000541E, 0x0000505F, 0x00000A0E, 0x000500C6,\n    0x0000000C, 0x000022BB, 0x0000511E, 0x0000541E, 0x000500C7, 0x0000000C,\n    0x00005077, 0x00003905, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005229,\n    0x00005077, 0x00000A17, 0x000500C4, 0x0000000C, 0x00001998, 0x000022BB,\n    0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FF, 0x00005229, 0x00001998,\n    0x000500C4, 0x0000000C, 0x00001C01, 0x00005447, 0x00000A2C, 0x000500C5,\n    0x0000000C, 0x00003C82, 0x000047FF, 0x00001C01, 0x000500C7, 0x0000000C,\n    0x000050B0, 0x00005E63, 0x00000A38, 0x000500C5, 0x0000000C, 0x00003C71,\n    0x00003C82, 0x000050B0, 0x000500C3, 0x0000000C, 0x00003746, 0x00005E63,\n    0x00000A17, 0x000500C7, 0x0000000C, 0x000018BA, 0x00003746, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x00005480, 0x000018BA, 0x00000A1A, 0x000500C5,\n    0x0000000C, 0x000045A9, 0x00003C71, 0x00005480, 0x000500C3, 0x0000000C,\n    0x00003A6F, 0x00005E63, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018BB,\n    0x00003A6F, 0x00000A20, 0x000500C4, 0x0000000C, 0x00005481, 0x000018BB,\n    0x00000A23, 0x000500C5, 0x0000000C, 0x00004570, 0x000045A9, 0x00005481,\n    0x000500C3, 0x0000000C, 0x00003C89, 0x00005E63, 0x00000A23, 0x000500C4,\n    0x0000000C, 0x00002825, 0x00003C89, 0x00000A2F, 0x000500C5, 0x0000000C,\n    0x00003B7A, 0x00004570, 0x00002825, 0x0004007C, 0x0000000B, 0x000041E6,\n    0x00003B7A, 0x000200F9, 0x00005BF0, 0x000200F8, 0x00005BF0, 0x000700F5,\n    0x0000000B, 0x0000292C, 0x000041E5, 0x00002C92, 0x000041E6, 0x00005F21,\n    0x000200F9, 0x00004A60, 0x000200F8, 0x00004A60, 0x000700F5, 0x0000000B,\n    0x00002C70, 0x00002C67, 0x0000260D, 0x0000292C, 0x00005BF0, 0x00050080,\n    0x0000000B, 0x000048BD, 0x00002C70, 0x00005EAC, 0x000500C2, 0x0000000B,\n    0x00003D52, 0x000048BD, 0x00000A17, 0x00060041, 0x00000294, 0x00004FAF,\n    0x0000107A, 0x00000A0B, 0x00003D52, 0x0004003D, 0x00000017, 0x00001CAA,\n    0x00004FAF, 0x000500AA, 0x00000009, 0x000035C0, 0x000061E2, 0x00000A0D,\n    0x000500AA, 0x00000009, 0x00005376, 0x000061E2, 0x00000A10, 0x000500A6,\n    0x00000009, 0x00005686, 0x000035C0, 0x00005376, 0x000300F7, 0x00003463,\n    0x00000000, 0x000400FA, 0x00005686, 0x00002957, 0x00003463, 0x000200F8,\n    0x00002957, 0x000500C7, 0x00000017, 0x0000475F, 0x00001CAA, 0x000009CE,\n    0x000500C4, 0x00000017, 0x000024D1, 0x0000475F, 0x0000013D, 0x000500C7,\n    0x00000017, 0x000050AC, 0x00001CAA, 0x0000072E, 0x000500C2, 0x00000017,\n    0x0000448D, 0x000050AC, 0x0000013D, 0x000500C5, 0x00000017, 0x00003FF8,\n    0x000024D1, 0x0000448D, 0x000200F9, 0x00003463, 0x000200F8, 0x00003463,\n    0x000700F5, 0x00000017, 0x00005879, 0x00001CAA, 0x00004A60, 0x00003FF8,\n    0x00002957, 0x000500AA, 0x00000009, 0x00004CB6, 0x000061E2, 0x00000A13,\n    0x000500A6, 0x00000009, 0x00003B23, 0x00005376, 0x00004CB6, 0x000300F7,\n    0x0000362B, 0x00000000, 0x000400FA, 0x00003B23, 0x00002B38, 0x0000362B,\n    0x000200F8, 0x00002B38, 0x000500C4, 0x00000017, 0x00005E17, 0x00005879,\n    0x000002ED, 0x000500C2, 0x00000017, 0x00003BE7, 0x00005879, 0x000002ED,\n    0x000500C5, 0x00000017, 0x000029E8, 0x00005E17, 0x00003BE7, 0x000200F9,\n    0x0000362B, 0x000200F8, 0x0000362B, 0x000700F5, 0x00000017, 0x00004AB4,\n    0x00005879, 0x00003463, 0x000029E8, 0x00002B38, 0x000500C2, 0x0000000B,\n    0x00005FC1, 0x000038F6, 0x00000A17, 0x000500C7, 0x00000017, 0x00001CFC,\n    0x00004AB4, 0x00000352, 0x00040070, 0x0000001D, 0x00003F05, 0x00001CFC,\n    0x0005008E, 0x0000001D, 0x00004BA5, 0x00003F05, 0x0000092A, 0x000500C2,\n    0x00000017, 0x00005B47, 0x00004AB4, 0x000002ED, 0x00040070, 0x0000001D,\n    0x0000483C, 0x00005B47, 0x0005008E, 0x0000001D, 0x00004812, 0x0000483C,\n    0x0000092A, 0x00050051, 0x0000000D, 0x0000187C, 0x00004BA5, 0x00000000,\n    0x00050051, 0x0000000D, 0x000035EE, 0x00004812, 0x00000000, 0x00050050,\n    0x00000013, 0x00004B20, 0x0000187C, 0x000035EE, 0x0006000C, 0x0000000B,\n    0x00002171, 0x00000001, 0x0000003A, 0x00004B20, 0x00050051, 0x0000000D,\n    0x00005BBF, 0x00004BA5, 0x00000001, 0x00050051, 0x0000000D, 0x000039A7,\n    0x00004812, 0x00000001, 0x00050050, 0x00000013, 0x00004B21, 0x00005BBF,\n    0x000039A7, 0x0006000C, 0x0000000B, 0x00002172, 0x00000001, 0x0000003A,\n    0x00004B21, 0x00050051, 0x0000000D, 0x00005BC0, 0x00004BA5, 0x00000002,\n    0x00050051, 0x0000000D, 0x000039A8, 0x00004812, 0x00000002, 0x00050050,\n    0x00000013, 0x00004B22, 0x00005BC0, 0x000039A8, 0x0006000C, 0x0000000B,\n    0x00002173, 0x00000001, 0x0000003A, 0x00004B22, 0x00050051, 0x0000000D,\n    0x00005BC1, 0x00004BA5, 0x00000003, 0x00050051, 0x0000000D, 0x000039A9,\n    0x00004812, 0x00000003, 0x00050050, 0x00000013, 0x00004B0D, 0x00005BC1,\n    0x000039A9, 0x0006000C, 0x0000000B, 0x000020EE, 0x00000001, 0x0000003A,\n    0x00004B0D, 0x00070050, 0x00000017, 0x00003ABB, 0x00002171, 0x00002172,\n    0x00002173, 0x000020EE, 0x00060041, 0x00000294, 0x000045C3, 0x0000140E,\n    0x00000A0B, 0x00005FC1, 0x0003003E, 0x000045C3, 0x00003ABB, 0x00050080,\n    0x0000000B, 0x000054B5, 0x000038F6, 0x00000A3A, 0x000300F7, 0x00006070,\n    0x00000002, 0x000400FA, 0x00004376, 0x000055E9, 0x00001C25, 0x000200F8,\n    0x000055E9, 0x000200F9, 0x00006070, 0x000200F8, 0x00001C25, 0x000200F9,\n    0x00006070, 0x000200F8, 0x00006070, 0x000700F5, 0x0000000B, 0x00002C71,\n    0x00000A6A, 0x000055E9, 0x00000A3A, 0x00001C25, 0x00050080, 0x0000000B,\n    0x000048BE, 0x000048BD, 0x00002C71, 0x000500C2, 0x0000000B, 0x00003D53,\n    0x000048BE, 0x00000A17, 0x00060041, 0x00000294, 0x00005566, 0x0000107A,\n    0x00000A0B, 0x00003D53, 0x0004003D, 0x00000017, 0x00003910, 0x00005566,\n    0x000300F7, 0x00003A1A, 0x00000000, 0x000400FA, 0x00005686, 0x00002958,\n    0x00003A1A, 0x000200F8, 0x00002958, 0x000500C7, 0x00000017, 0x00004760,\n    0x00003910, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D2, 0x00004760,\n    0x0000013D, 0x000500C7, 0x00000017, 0x000050AD, 0x00003910, 0x0000072E,\n    0x000500C2, 0x00000017, 0x0000448E, 0x000050AD, 0x0000013D, 0x000500C5,\n    0x00000017, 0x00003FF9, 0x000024D2, 0x0000448E, 0x000200F9, 0x00003A1A,\n    0x000200F8, 0x00003A1A, 0x000700F5, 0x00000017, 0x00002AAC, 0x00003910,\n    0x00006070, 0x00003FF9, 0x00002958, 0x000300F7, 0x0000362C, 0x00000000,\n    0x000400FA, 0x00003B23, 0x00002B39, 0x0000362C, 0x000200F8, 0x00002B39,\n    0x000500C4, 0x00000017, 0x00005E18, 0x00002AAC, 0x000002ED, 0x000500C2,\n    0x00000017, 0x00003BE8, 0x00002AAC, 0x000002ED, 0x000500C5, 0x00000017,\n    0x000029E9, 0x00005E18, 0x00003BE8, 0x000200F9, 0x0000362C, 0x000200F8,\n    0x0000362C, 0x000700F5, 0x00000017, 0x00004AB5, 0x00002AAC, 0x00003A1A,\n    0x000029E9, 0x00002B39, 0x000500C2, 0x0000000B, 0x00005FC2, 0x000054B5,\n    0x00000A17, 0x000500C7, 0x00000017, 0x00001CFD, 0x00004AB5, 0x00000352,\n    0x00040070, 0x0000001D, 0x00003F06, 0x00001CFD, 0x0005008E, 0x0000001D,\n    0x00004BA6, 0x00003F06, 0x0000092A, 0x000500C2, 0x00000017, 0x00005B48,\n    0x00004AB5, 0x000002ED, 0x00040070, 0x0000001D, 0x0000483D, 0x00005B48,\n    0x0005008E, 0x0000001D, 0x00004813, 0x0000483D, 0x0000092A, 0x00050051,\n    0x0000000D, 0x0000187D, 0x00004BA6, 0x00000000, 0x00050051, 0x0000000D,\n    0x000035EF, 0x00004813, 0x00000000, 0x00050050, 0x00000013, 0x00004B23,\n    0x0000187D, 0x000035EF, 0x0006000C, 0x0000000B, 0x00002174, 0x00000001,\n    0x0000003A, 0x00004B23, 0x00050051, 0x0000000D, 0x00005BC2, 0x00004BA6,\n    0x00000001, 0x00050051, 0x0000000D, 0x000039AA, 0x00004813, 0x00000001,\n    0x00050050, 0x00000013, 0x00004B24, 0x00005BC2, 0x000039AA, 0x0006000C,\n    0x0000000B, 0x00002175, 0x00000001, 0x0000003A, 0x00004B24, 0x00050051,\n    0x0000000D, 0x00005BC3, 0x00004BA6, 0x00000002, 0x00050051, 0x0000000D,\n    0x000039AB, 0x00004813, 0x00000002, 0x00050050, 0x00000013, 0x00004B25,\n    0x00005BC3, 0x000039AB, 0x0006000C, 0x0000000B, 0x00002176, 0x00000001,\n    0x0000003A, 0x00004B25, 0x00050051, 0x0000000D, 0x00005BC4, 0x00004BA6,\n    0x00000003, 0x00050051, 0x0000000D, 0x000039AC, 0x00004813, 0x00000003,\n    0x00050050, 0x00000013, 0x00004B0E, 0x00005BC4, 0x000039AC, 0x0006000C,\n    0x0000000B, 0x000020EF, 0x00000001, 0x0000003A, 0x00004B0E, 0x00070050,\n    0x00000017, 0x00003ABC, 0x00002174, 0x00002175, 0x00002176, 0x000020EF,\n    0x00060041, 0x00000294, 0x00004EBE, 0x0000140E, 0x00000A0B, 0x00005FC2,\n    0x0003003E, 0x00004EBE, 0x00003ABC, 0x000200F9, 0x00004C7A, 0x000200F8,\n    0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_rg16_unorm_float_scaled_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25157\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n     %v4uint = OpTypeVector %uint 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v3uint = OpTypeVector %uint 3\n      %float = OpTypeFloat 32\n    %v4float = OpTypeVector %float 4\n %uint_65535 = OpConstant %uint 65535\n%float_1_52590219en05 = OpConstant %float 1.52590219e-05\n    %uint_16 = OpConstant %uint 16\n     %uint_0 = OpConstant %uint 0\n    %v2float = OpTypeVector %float 2\n     %uint_1 = OpConstant %uint 1\n     %uint_2 = OpConstant %uint 2\n     %uint_3 = OpConstant %uint 3\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n      %int_3 = OpConstant %int 3\n      %int_2 = OpConstant %int 2\n     %uint_4 = OpConstant %uint 4\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n     %uint_7 = OpConstant %uint 7\n       %1927 = OpConstantComposite %v2uint %uint_4 %uint_7\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %2603 = OpConstantComposite %v3uint %uint_3 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n    %uint_32 = OpConstant %uint 32\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %1954 = OpConstantComposite %v2uint %uint_7 %uint_7\n       %1855 = OpConstantComposite %v2uint %uint_4 %uint_1\n     %uint_6 = OpConstant %uint 6\n    %uint_15 = OpConstant %uint 15\n       %1955 = OpConstantComposite %v2uint %uint_15 %uint_1\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n        %850 = OpConstantComposite %v4uint %uint_65535 %uint_65535 %uint_65535 %uint_65535\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24445 = OpBitwiseAnd %uint %13606 %uint_2\n      %18667 = OpINotEqual %bool %24445 %uint_0\n       %8141 = OpShiftRightLogical %uint %13606 %uint_2\n      %24990 = OpBitwiseAnd %uint %8141 %uint_3\n       %8871 = OpCompositeConstruct %v2uint %13606 %13606\n       %7087 = OpShiftRightLogical %v2uint %8871 %1927\n       %6551 = OpBitwiseAnd %v2uint %7087 %1954\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2603\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %6586 DontFlatten\n               OpBranchConditional %24679 %21992 %6586\n      %21992 = OpLabel\n               OpBranch %19578\n       %6586 = OpLabel\n      %23478 = OpBitcast %v3int %21387\n      %18710 = OpCompositeExtract %uint %22410 1\n      %23531 = OpCompositeExtract %int %23478 0\n      %22810 = OpIMul %int %23531 %int_4\n       %6362 = OpCompositeExtract %int %23478 2\n      %14505 = OpBitcast %int %18710\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %23478 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %6594\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %22810 %24535\n      %10898 = OpBitcast %uint %8258\n       %7937 = OpIAdd %uint %22411 %10898\n      %19921 = OpShiftRightLogical %v2uint %17136 %1855\n       %7712 = OpUDiv %v2uint %19921 %6551\n      %18183 = OpIMul %v2uint %6551 %7712\n      %18273 = OpISub %v2uint %19921 %18183\n      %11232 = OpShiftLeftLogical %v2uint %7712 %1855\n      %13284 = OpCompositeExtract %uint %18273 0\n      %10872 = OpCompositeExtract %uint %6551 1\n      %22886 = OpIMul %uint %13284 %10872\n       %6943 = OpCompositeExtract %uint %18273 1\n      %10469 = OpIAdd %uint %22886 %6943\n      %18851 = OpBitwiseAnd %v2uint %17136 %1955\n      %10581 = OpShiftLeftLogical %uint %10469 %uint_7\n      %20916 = OpCompositeExtract %uint %18851 1\n      %23596 = OpShiftLeftLogical %uint %20916 %uint_6\n      %19814 = OpBitwiseOr %uint %10581 %23596\n      %21476 = OpCompositeExtract %uint %18851 0\n       %8560 = OpShiftLeftLogical %uint %21476 %uint_2\n      %17648 = OpBitwiseOr %uint %19814 %8560\n      %19923 = OpCompositeExtract %uint %11232 0\n      %15556 = OpCompositeInsert %v3uint %19923 %21387 0\n      %23006 = OpCompositeExtract %uint %11232 1\n       %9680 = OpCompositeInsert %v3uint %23006 %15556 1\n               OpSelectionMerge %20344 DontFlatten\n               OpBranchConditional %18667 %23520 %11737\n      %23520 = OpLabel\n      %10111 = OpBitcast %v3int %9680\n      %19476 = OpShiftRightLogical %uint %22408 %int_5\n      %18810 = OpShiftRightLogical %uint %22409 %int_4\n       %6782 = OpCompositeExtract %int %10111 2\n      %12089 = OpShiftRightArithmetic %int %6782 %int_2\n      %22400 = OpBitcast %int %18810\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %10111 1\n      %19055 = OpShiftRightArithmetic %int %25154 %int_4\n      %11052 = OpIAdd %int %7938 %19055\n      %16898 = OpBitcast %int %19476\n      %14944 = OpIMul %int %11052 %16898\n      %25155 = OpCompositeExtract %int %10111 0\n      %20423 = OpShiftRightArithmetic %int %25155 %int_5\n      %18940 = OpIAdd %int %14944 %20423\n       %8797 = OpShiftLeftLogical %int %18940 %int_7\n      %11434 = OpBitwiseAnd %int %6782 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %25154 %int_1\n      %21364 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21364 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %25155 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17334 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17334 %uint_2\n      %13015 = OpShiftRightArithmetic %int %25154 %int_3\n       %9929 = OpBitwiseXor %int %13015 %12089\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %25155 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %25154 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6552 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6552\n       %7168 = OpShiftLeftLogical %int %16793 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24144 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24144 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24144 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24144 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %20344\n      %11737 = OpLabel\n      %11908 = OpVectorShuffle %v2uint %9680 %9680 0 1\n      %20347 = OpBitcast %v2int %11908\n      %11433 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %20347 1\n      %12090 = OpShiftRightArithmetic %int %14597 %int_5\n      %22401 = OpBitcast %int %11433\n       %7939 = OpIMul %int %12090 %22401\n      %25156 = OpCompositeExtract %int %20347 0\n      %20424 = OpShiftRightArithmetic %int %25156 %int_5\n      %18864 = OpIAdd %int %7939 %20424\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25156 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17335 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17335 %uint_2\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25156 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6553 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6553\n       %7169 = OpShiftLeftLogical %int %21575 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24163 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24163 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24163 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %20344\n      %20344 = OpLabel\n      %18329 = OpPhi %uint %16869 %23520 %16870 %11737\n      %15200 = OpCompositeExtract %uint %6551 0\n      %17489 = OpIMul %uint %15200 %10872\n       %7313 = OpIMul %uint %18329 %17489\n       %8815 = OpIAdd %uint %7313 %17648\n      %21470 = OpIAdd %uint %8815 %24236\n      %14664 = OpShiftRightLogical %uint %21470 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %14664\n       %7338 = OpLoad %v4uint %20399\n      %13760 = OpIEqual %bool %24990 %uint_1\n      %21366 = OpIEqual %bool %24990 %uint_2\n      %22150 = OpLogicalOr %bool %13760 %21366\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %7338 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %7338 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22649 = OpPhi %v4uint %7338 %20344 %16376 %10583\n      %19638 = OpIEqual %bool %24990 %uint_3\n      %15139 = OpLogicalOr %bool %21366 %19638\n               OpSelectionMerge %13867 None\n               OpBranchConditional %15139 %11064 %13867\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22649 %749\n      %15335 = OpShiftRightLogical %v4uint %22649 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %13867\n      %13867 = OpLabel\n      %19124 = OpPhi %v4uint %22649 %13411 %10728 %11064\n      %24513 = OpShiftRightLogical %uint %7937 %int_4\n       %7420 = OpBitwiseAnd %v4uint %19124 %850\n      %16133 = OpConvertUToF %v4float %7420\n      %19365 = OpVectorTimesScalar %v4float %16133 %float_1_52590219en05\n      %23367 = OpShiftRightLogical %v4uint %19124 %749\n      %18492 = OpConvertUToF %v4float %23367\n      %18450 = OpVectorTimesScalar %v4float %18492 %float_1_52590219en05\n       %6268 = OpCompositeExtract %float %19365 0\n      %13806 = OpCompositeExtract %float %18450 0\n      %19232 = OpCompositeConstruct %v2float %6268 %13806\n       %8561 = OpExtInst %uint %1 PackHalf2x16 %19232\n      %23487 = OpCompositeExtract %float %19365 1\n      %14759 = OpCompositeExtract %float %18450 1\n      %19233 = OpCompositeConstruct %v2float %23487 %14759\n       %8562 = OpExtInst %uint %1 PackHalf2x16 %19233\n      %23488 = OpCompositeExtract %float %19365 2\n      %14760 = OpCompositeExtract %float %18450 2\n      %19234 = OpCompositeConstruct %v2float %23488 %14760\n       %8563 = OpExtInst %uint %1 PackHalf2x16 %19234\n      %23489 = OpCompositeExtract %float %19365 3\n      %14761 = OpCompositeExtract %float %18450 3\n      %19213 = OpCompositeConstruct %v2float %23489 %14761\n       %8430 = OpExtInst %uint %1 PackHalf2x16 %19213\n      %15035 = OpCompositeConstruct %v4uint %8561 %8562 %8563 %8430\n      %17859 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %24513\n               OpStore %17859 %15035\n      %22137 = OpIAdd %uint %7937 %uint_16\n      %10214 = OpIAdd %uint %21470 %uint_16\n      %14665 = OpShiftRightLogical %uint %10214 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %14665\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %14874 None\n               OpBranchConditional %22150 %10584 %14874\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %14874\n      %14874 = OpLabel\n      %10924 = OpPhi %v4uint %14608 %13867 %16377 %10584\n               OpSelectionMerge %13868 None\n               OpBranchConditional %15139 %11065 %13868\n      %11065 = OpLabel\n      %24088 = OpShiftLeftLogical %v4uint %10924 %749\n      %15336 = OpShiftRightLogical %v4uint %10924 %749\n      %10729 = OpBitwiseOr %v4uint %24088 %15336\n               OpBranch %13868\n      %13868 = OpLabel\n      %19125 = OpPhi %v4uint %10924 %14874 %10729 %11065\n      %24514 = OpShiftRightLogical %uint %22137 %int_4\n       %7421 = OpBitwiseAnd %v4uint %19125 %850\n      %16134 = OpConvertUToF %v4float %7421\n      %19366 = OpVectorTimesScalar %v4float %16134 %float_1_52590219en05\n      %23368 = OpShiftRightLogical %v4uint %19125 %749\n      %18493 = OpConvertUToF %v4float %23368\n      %18451 = OpVectorTimesScalar %v4float %18493 %float_1_52590219en05\n       %6269 = OpCompositeExtract %float %19366 0\n      %13807 = OpCompositeExtract %float %18451 0\n      %19235 = OpCompositeConstruct %v2float %6269 %13807\n       %8564 = OpExtInst %uint %1 PackHalf2x16 %19235\n      %23490 = OpCompositeExtract %float %19366 1\n      %14762 = OpCompositeExtract %float %18451 1\n      %19236 = OpCompositeConstruct %v2float %23490 %14762\n       %8565 = OpExtInst %uint %1 PackHalf2x16 %19236\n      %23491 = OpCompositeExtract %float %19366 2\n      %14763 = OpCompositeExtract %float %18451 2\n      %19237 = OpCompositeConstruct %v2float %23491 %14763\n       %8566 = OpExtInst %uint %1 PackHalf2x16 %19237\n      %23492 = OpCompositeExtract %float %19366 3\n      %14764 = OpCompositeExtract %float %18451 3\n      %19214 = OpCompositeConstruct %v2float %23492 %14764\n       %8431 = OpExtInst %uint %1 PackHalf2x16 %19214\n      %15036 = OpCompositeConstruct %v4uint %8564 %8565 %8566 %8431\n      %20158 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %24514\n               OpStore %20158 %15036\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_rg16_unorm_float_scaled_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006245, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000017,\n    0x0000000B, 0x00000004, 0x00040015, 0x0000000C, 0x00000020, 0x00000001,\n    0x00040017, 0x00000012, 0x0000000C, 0x00000002, 0x00040017, 0x00000016,\n    0x0000000C, 0x00000003, 0x00020014, 0x00000009, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x00030016, 0x0000000D, 0x00000020, 0x00040017,\n    0x0000001D, 0x0000000D, 0x00000004, 0x0004002B, 0x0000000B, 0x000001C1,\n    0x0000FFFF, 0x0004002B, 0x0000000D, 0x0000092A, 0x37800080, 0x0004002B,\n    0x0000000B, 0x00000A3A, 0x00000010, 0x0004002B, 0x0000000B, 0x00000A0A,\n    0x00000000, 0x00040017, 0x00000013, 0x0000000D, 0x00000002, 0x0004002B,\n    0x0000000B, 0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B, 0x00000A10,\n    0x00000002, 0x0004002B, 0x0000000B, 0x00000A13, 0x00000003, 0x0004002B,\n    0x0000000B, 0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B, 0x00000A22,\n    0x00000008, 0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00, 0x0004002B,\n    0x0000000C, 0x00000A17, 0x00000004, 0x0004002B, 0x0000000C, 0x00000A1D,\n    0x00000006, 0x0004002B, 0x0000000C, 0x00000A2C, 0x0000000B, 0x0004002B,\n    0x0000000C, 0x00000A38, 0x0000000F, 0x0004002B, 0x0000000C, 0x00000A0E,\n    0x00000001, 0x0004002B, 0x0000000C, 0x00000A1A, 0x00000005, 0x0004002B,\n    0x0000000C, 0x00000A20, 0x00000007, 0x0004002B, 0x0000000C, 0x00000A23,\n    0x00000008, 0x0004002B, 0x0000000C, 0x00000A2F, 0x0000000C, 0x0004002B,\n    0x0000000C, 0x00000A14, 0x00000003, 0x0004002B, 0x0000000C, 0x00000A11,\n    0x00000002, 0x0004002B, 0x0000000B, 0x00000A16, 0x00000004, 0x0004002B,\n    0x0000000C, 0x00000A0B, 0x00000000, 0x000A001E, 0x00000489, 0x0000000B,\n    0x0000000B, 0x0000000B, 0x0000000B, 0x00000014, 0x0000000B, 0x0000000B,\n    0x0000000B, 0x00040020, 0x00000706, 0x00000009, 0x00000489, 0x0004003B,\n    0x00000706, 0x00000CE9, 0x00000009, 0x00040020, 0x00000288, 0x00000009,\n    0x0000000B, 0x0004002B, 0x0000000B, 0x00000A1F, 0x00000007, 0x0005002C,\n    0x00000011, 0x00000787, 0x00000A16, 0x00000A1F, 0x00040020, 0x00000291,\n    0x00000009, 0x00000014, 0x00040020, 0x00000292, 0x00000001, 0x00000014,\n    0x0004003B, 0x00000292, 0x00000F48, 0x00000001, 0x0006002C, 0x00000014,\n    0x00000A2B, 0x00000A13, 0x00000A0A, 0x00000A0A, 0x00040017, 0x0000000F,\n    0x00000009, 0x00000002, 0x0003001D, 0x000007DC, 0x00000017, 0x0003001E,\n    0x000007B4, 0x000007DC, 0x00040020, 0x00000A31, 0x00000002, 0x000007B4,\n    0x0004003B, 0x00000A31, 0x0000107A, 0x00000002, 0x00040020, 0x00000294,\n    0x00000002, 0x00000017, 0x0003001D, 0x000007DD, 0x00000017, 0x0003001E,\n    0x000007B5, 0x000007DD, 0x00040020, 0x00000A32, 0x00000002, 0x000007B5,\n    0x0004003B, 0x00000A32, 0x0000140E, 0x00000002, 0x0004002B, 0x0000000B,\n    0x00000A6A, 0x00000020, 0x0006002C, 0x00000014, 0x00000BC3, 0x00000A16,\n    0x00000A6A, 0x00000A0D, 0x0005002C, 0x00000011, 0x000007A2, 0x00000A1F,\n    0x00000A1F, 0x0005002C, 0x00000011, 0x0000073F, 0x00000A16, 0x00000A0D,\n    0x0004002B, 0x0000000B, 0x00000A1C, 0x00000006, 0x0004002B, 0x0000000B,\n    0x00000A37, 0x0000000F, 0x0005002C, 0x00000011, 0x000007A3, 0x00000A37,\n    0x00000A0D, 0x0007002C, 0x00000017, 0x000009CE, 0x000008A6, 0x000008A6,\n    0x000008A6, 0x000008A6, 0x0007002C, 0x00000017, 0x0000013D, 0x00000A22,\n    0x00000A22, 0x00000A22, 0x00000A22, 0x0007002C, 0x00000017, 0x0000072E,\n    0x000005FD, 0x000005FD, 0x000005FD, 0x000005FD, 0x0007002C, 0x00000017,\n    0x000002ED, 0x00000A3A, 0x00000A3A, 0x00000A3A, 0x00000A3A, 0x0007002C,\n    0x00000017, 0x00000352, 0x000001C1, 0x000001C1, 0x000001C1, 0x000001C1,\n    0x00050036, 0x00000008, 0x0000161F, 0x00000000, 0x00000502, 0x000200F8,\n    0x00003B06, 0x000300F7, 0x00004C7A, 0x00000000, 0x000300FB, 0x00000A0A,\n    0x00002E68, 0x000200F8, 0x00002E68, 0x00050041, 0x00000288, 0x000060D7,\n    0x00000CE9, 0x00000A0B, 0x0004003D, 0x0000000B, 0x00003526, 0x000060D7,\n    0x000500C7, 0x0000000B, 0x00005F7D, 0x00003526, 0x00000A10, 0x000500AB,\n    0x00000009, 0x000048EB, 0x00005F7D, 0x00000A0A, 0x000500C2, 0x0000000B,\n    0x00001FCD, 0x00003526, 0x00000A10, 0x000500C7, 0x0000000B, 0x0000619E,\n    0x00001FCD, 0x00000A13, 0x00050050, 0x00000011, 0x000022A7, 0x00003526,\n    0x00003526, 0x000500C2, 0x00000011, 0x00001BAF, 0x000022A7, 0x00000787,\n    0x000500C7, 0x00000011, 0x00001997, 0x00001BAF, 0x000007A2, 0x00050041,\n    0x00000288, 0x0000492C, 0x00000CE9, 0x00000A0E, 0x0004003D, 0x0000000B,\n    0x00005EAC, 0x0000492C, 0x00050041, 0x00000288, 0x00004EBA, 0x00000CE9,\n    0x00000A11, 0x0004003D, 0x0000000B, 0x00005788, 0x00004EBA, 0x00050041,\n    0x00000288, 0x00004EBB, 0x00000CE9, 0x00000A14, 0x0004003D, 0x0000000B,\n    0x00005789, 0x00004EBB, 0x00050041, 0x00000291, 0x00004EBC, 0x00000CE9,\n    0x00000A17, 0x0004003D, 0x00000014, 0x0000578A, 0x00004EBC, 0x00050041,\n    0x00000288, 0x00004EBD, 0x00000CE9, 0x00000A1A, 0x0004003D, 0x0000000B,\n    0x0000578B, 0x00004EBD, 0x00050041, 0x00000288, 0x00004E6E, 0x00000CE9,\n    0x00000A1D, 0x0004003D, 0x0000000B, 0x000019C2, 0x00004E6E, 0x0004003D,\n    0x00000014, 0x00002A0E, 0x00000F48, 0x000500C4, 0x00000014, 0x0000538B,\n    0x00002A0E, 0x00000A2B, 0x0007004F, 0x00000011, 0x000042F0, 0x0000538B,\n    0x0000538B, 0x00000000, 0x00000001, 0x0007004F, 0x00000011, 0x0000242F,\n    0x0000578A, 0x0000578A, 0x00000000, 0x00000001, 0x000500AE, 0x0000000F,\n    0x00004288, 0x000042F0, 0x0000242F, 0x0004009A, 0x00000009, 0x00006067,\n    0x00004288, 0x000300F7, 0x000019BA, 0x00000002, 0x000400FA, 0x00006067,\n    0x000055E8, 0x000019BA, 0x000200F8, 0x000055E8, 0x000200F9, 0x00004C7A,\n    0x000200F8, 0x000019BA, 0x0004007C, 0x00000016, 0x00005BB6, 0x0000538B,\n    0x00050051, 0x0000000B, 0x00004916, 0x0000578A, 0x00000001, 0x00050051,\n    0x0000000C, 0x00005BEB, 0x00005BB6, 0x00000000, 0x00050084, 0x0000000C,\n    0x0000591A, 0x00005BEB, 0x00000A17, 0x00050051, 0x0000000C, 0x000018DA,\n    0x00005BB6, 0x00000002, 0x0004007C, 0x0000000C, 0x000038A9, 0x00004916,\n    0x00050084, 0x0000000C, 0x00002C0F, 0x000018DA, 0x000038A9, 0x00050051,\n    0x0000000C, 0x000044BE, 0x00005BB6, 0x00000001, 0x00050080, 0x0000000C,\n    0x000056D4, 0x00002C0F, 0x000044BE, 0x0004007C, 0x0000000C, 0x00005785,\n    0x000019C2, 0x00050084, 0x0000000C, 0x00005FD7, 0x000056D4, 0x00005785,\n    0x00050080, 0x0000000C, 0x00002042, 0x0000591A, 0x00005FD7, 0x0004007C,\n    0x0000000B, 0x00002A92, 0x00002042, 0x00050080, 0x0000000B, 0x00001F01,\n    0x0000578B, 0x00002A92, 0x000500C2, 0x00000011, 0x00004DD1, 0x000042F0,\n    0x0000073F, 0x00050086, 0x00000011, 0x00001E20, 0x00004DD1, 0x00001997,\n    0x00050084, 0x00000011, 0x00004707, 0x00001997, 0x00001E20, 0x00050082,\n    0x00000011, 0x00004761, 0x00004DD1, 0x00004707, 0x000500C4, 0x00000011,\n    0x00002BE0, 0x00001E20, 0x0000073F, 0x00050051, 0x0000000B, 0x000033E4,\n    0x00004761, 0x00000000, 0x00050051, 0x0000000B, 0x00002A78, 0x00001997,\n    0x00000001, 0x00050084, 0x0000000B, 0x00005966, 0x000033E4, 0x00002A78,\n    0x00050051, 0x0000000B, 0x00001B1F, 0x00004761, 0x00000001, 0x00050080,\n    0x0000000B, 0x000028E5, 0x00005966, 0x00001B1F, 0x000500C7, 0x00000011,\n    0x000049A3, 0x000042F0, 0x000007A3, 0x000500C4, 0x0000000B, 0x00002955,\n    0x000028E5, 0x00000A1F, 0x00050051, 0x0000000B, 0x000051B4, 0x000049A3,\n    0x00000001, 0x000500C4, 0x0000000B, 0x00005C2C, 0x000051B4, 0x00000A1C,\n    0x000500C5, 0x0000000B, 0x00004D66, 0x00002955, 0x00005C2C, 0x00050051,\n    0x0000000B, 0x000053E4, 0x000049A3, 0x00000000, 0x000500C4, 0x0000000B,\n    0x00002170, 0x000053E4, 0x00000A10, 0x000500C5, 0x0000000B, 0x000044F0,\n    0x00004D66, 0x00002170, 0x00050051, 0x0000000B, 0x00004DD3, 0x00002BE0,\n    0x00000000, 0x00060052, 0x00000014, 0x00003CC4, 0x00004DD3, 0x0000538B,\n    0x00000000, 0x00050051, 0x0000000B, 0x000059DE, 0x00002BE0, 0x00000001,\n    0x00060052, 0x00000014, 0x000025D0, 0x000059DE, 0x00003CC4, 0x00000001,\n    0x000300F7, 0x00004F78, 0x00000002, 0x000400FA, 0x000048EB, 0x00005BE0,\n    0x00002DD9, 0x000200F8, 0x00005BE0, 0x0004007C, 0x00000016, 0x0000277F,\n    0x000025D0, 0x000500C2, 0x0000000B, 0x00004C14, 0x00005788, 0x00000A1A,\n    0x000500C2, 0x0000000B, 0x0000497A, 0x00005789, 0x00000A17, 0x00050051,\n    0x0000000C, 0x00001A7E, 0x0000277F, 0x00000002, 0x000500C3, 0x0000000C,\n    0x00002F39, 0x00001A7E, 0x00000A11, 0x0004007C, 0x0000000C, 0x00005780,\n    0x0000497A, 0x00050084, 0x0000000C, 0x00001F02, 0x00002F39, 0x00005780,\n    0x00050051, 0x0000000C, 0x00006242, 0x0000277F, 0x00000001, 0x000500C3,\n    0x0000000C, 0x00004A6F, 0x00006242, 0x00000A17, 0x00050080, 0x0000000C,\n    0x00002B2C, 0x00001F02, 0x00004A6F, 0x0004007C, 0x0000000C, 0x00004202,\n    0x00004C14, 0x00050084, 0x0000000C, 0x00003A60, 0x00002B2C, 0x00004202,\n    0x00050051, 0x0000000C, 0x00006243, 0x0000277F, 0x00000000, 0x000500C3,\n    0x0000000C, 0x00004FC7, 0x00006243, 0x00000A1A, 0x00050080, 0x0000000C,\n    0x000049FC, 0x00003A60, 0x00004FC7, 0x000500C4, 0x0000000C, 0x0000225D,\n    0x000049FC, 0x00000A20, 0x000500C7, 0x0000000C, 0x00002CAA, 0x00001A7E,\n    0x00000A14, 0x000500C4, 0x0000000C, 0x00004CAE, 0x00002CAA, 0x00000A1A,\n    0x000500C3, 0x0000000C, 0x0000383E, 0x00006242, 0x00000A0E, 0x000500C7,\n    0x0000000C, 0x00005374, 0x0000383E, 0x00000A14, 0x000500C4, 0x0000000C,\n    0x000054CA, 0x00005374, 0x00000A14, 0x000500C5, 0x0000000C, 0x000042CE,\n    0x00004CAE, 0x000054CA, 0x000500C7, 0x0000000C, 0x000050D5, 0x00006243,\n    0x00000A20, 0x000500C5, 0x0000000C, 0x00003ADD, 0x000042CE, 0x000050D5,\n    0x000500C5, 0x0000000C, 0x000043B6, 0x0000225D, 0x00003ADD, 0x000500C4,\n    0x0000000C, 0x00005E50, 0x000043B6, 0x00000A10, 0x000500C3, 0x0000000C,\n    0x000032D7, 0x00006242, 0x00000A14, 0x000500C6, 0x0000000C, 0x000026C9,\n    0x000032D7, 0x00002F39, 0x000500C7, 0x0000000C, 0x00004199, 0x000026C9,\n    0x00000A0E, 0x000500C3, 0x0000000C, 0x00002590, 0x00006243, 0x00000A14,\n    0x000500C7, 0x0000000C, 0x0000505E, 0x00002590, 0x00000A14, 0x000500C4,\n    0x0000000C, 0x0000541D, 0x00004199, 0x00000A0E, 0x000500C6, 0x0000000C,\n    0x000022BA, 0x0000505E, 0x0000541D, 0x000500C7, 0x0000000C, 0x00005076,\n    0x00006242, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005228, 0x00005076,\n    0x00000A17, 0x000500C4, 0x0000000C, 0x00001998, 0x000022BA, 0x00000A1D,\n    0x000500C5, 0x0000000C, 0x000047FE, 0x00005228, 0x00001998, 0x000500C4,\n    0x0000000C, 0x00001C00, 0x00004199, 0x00000A2C, 0x000500C5, 0x0000000C,\n    0x00003C81, 0x000047FE, 0x00001C00, 0x000500C7, 0x0000000C, 0x000050AF,\n    0x00005E50, 0x00000A38, 0x000500C5, 0x0000000C, 0x00003C70, 0x00003C81,\n    0x000050AF, 0x000500C3, 0x0000000C, 0x00003745, 0x00005E50, 0x00000A17,\n    0x000500C7, 0x0000000C, 0x000018B8, 0x00003745, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x0000547E, 0x000018B8, 0x00000A1A, 0x000500C5, 0x0000000C,\n    0x000045A8, 0x00003C70, 0x0000547E, 0x000500C3, 0x0000000C, 0x00003A6E,\n    0x00005E50, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018B9, 0x00003A6E,\n    0x00000A20, 0x000500C4, 0x0000000C, 0x0000547F, 0x000018B9, 0x00000A23,\n    0x000500C5, 0x0000000C, 0x0000456F, 0x000045A8, 0x0000547F, 0x000500C3,\n    0x0000000C, 0x00003C88, 0x00005E50, 0x00000A23, 0x000500C4, 0x0000000C,\n    0x00002824, 0x00003C88, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B79,\n    0x0000456F, 0x00002824, 0x0004007C, 0x0000000B, 0x000041E5, 0x00003B79,\n    0x000200F9, 0x00004F78, 0x000200F8, 0x00002DD9, 0x0007004F, 0x00000011,\n    0x00002E84, 0x000025D0, 0x000025D0, 0x00000000, 0x00000001, 0x0004007C,\n    0x00000012, 0x00004F7B, 0x00002E84, 0x000500C2, 0x0000000B, 0x00002CA9,\n    0x00005788, 0x00000A1A, 0x00050051, 0x0000000C, 0x00003905, 0x00004F7B,\n    0x00000001, 0x000500C3, 0x0000000C, 0x00002F3A, 0x00003905, 0x00000A1A,\n    0x0004007C, 0x0000000C, 0x00005781, 0x00002CA9, 0x00050084, 0x0000000C,\n    0x00001F03, 0x00002F3A, 0x00005781, 0x00050051, 0x0000000C, 0x00006244,\n    0x00004F7B, 0x00000000, 0x000500C3, 0x0000000C, 0x00004FC8, 0x00006244,\n    0x00000A1A, 0x00050080, 0x0000000C, 0x000049B0, 0x00001F03, 0x00004FC8,\n    0x000500C4, 0x0000000C, 0x0000254A, 0x000049B0, 0x00000A1D, 0x000500C3,\n    0x0000000C, 0x0000603B, 0x00003905, 0x00000A0E, 0x000500C7, 0x0000000C,\n    0x0000539A, 0x0000603B, 0x00000A20, 0x000500C4, 0x0000000C, 0x0000534A,\n    0x0000539A, 0x00000A14, 0x000500C7, 0x0000000C, 0x00004EA5, 0x00006244,\n    0x00000A20, 0x000500C5, 0x0000000C, 0x00002B1A, 0x0000534A, 0x00004EA5,\n    0x000500C5, 0x0000000C, 0x000043B7, 0x0000254A, 0x00002B1A, 0x000500C4,\n    0x0000000C, 0x00005E63, 0x000043B7, 0x00000A10, 0x000500C3, 0x0000000C,\n    0x000031DE, 0x00003905, 0x00000A17, 0x000500C7, 0x0000000C, 0x00005447,\n    0x000031DE, 0x00000A0E, 0x000500C3, 0x0000000C, 0x000028A6, 0x00006244,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x0000511E, 0x000028A6, 0x00000A14,\n    0x000500C3, 0x0000000C, 0x000028B9, 0x00003905, 0x00000A14, 0x000500C7,\n    0x0000000C, 0x0000505F, 0x000028B9, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x0000541E, 0x0000505F, 0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BB,\n    0x0000511E, 0x0000541E, 0x000500C7, 0x0000000C, 0x00005077, 0x00003905,\n    0x00000A0E, 0x000500C4, 0x0000000C, 0x00005229, 0x00005077, 0x00000A17,\n    0x000500C4, 0x0000000C, 0x00001999, 0x000022BB, 0x00000A1D, 0x000500C5,\n    0x0000000C, 0x000047FF, 0x00005229, 0x00001999, 0x000500C4, 0x0000000C,\n    0x00001C01, 0x00005447, 0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C82,\n    0x000047FF, 0x00001C01, 0x000500C7, 0x0000000C, 0x000050B0, 0x00005E63,\n    0x00000A38, 0x000500C5, 0x0000000C, 0x00003C71, 0x00003C82, 0x000050B0,\n    0x000500C3, 0x0000000C, 0x00003746, 0x00005E63, 0x00000A17, 0x000500C7,\n    0x0000000C, 0x000018BA, 0x00003746, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x00005480, 0x000018BA, 0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A9,\n    0x00003C71, 0x00005480, 0x000500C3, 0x0000000C, 0x00003A6F, 0x00005E63,\n    0x00000A1A, 0x000500C7, 0x0000000C, 0x000018BB, 0x00003A6F, 0x00000A20,\n    0x000500C4, 0x0000000C, 0x00005481, 0x000018BB, 0x00000A23, 0x000500C5,\n    0x0000000C, 0x00004570, 0x000045A9, 0x00005481, 0x000500C3, 0x0000000C,\n    0x00003C89, 0x00005E63, 0x00000A23, 0x000500C4, 0x0000000C, 0x00002825,\n    0x00003C89, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B7A, 0x00004570,\n    0x00002825, 0x0004007C, 0x0000000B, 0x000041E6, 0x00003B7A, 0x000200F9,\n    0x00004F78, 0x000200F8, 0x00004F78, 0x000700F5, 0x0000000B, 0x00004799,\n    0x000041E5, 0x00005BE0, 0x000041E6, 0x00002DD9, 0x00050051, 0x0000000B,\n    0x00003B60, 0x00001997, 0x00000000, 0x00050084, 0x0000000B, 0x00004451,\n    0x00003B60, 0x00002A78, 0x00050084, 0x0000000B, 0x00001C91, 0x00004799,\n    0x00004451, 0x00050080, 0x0000000B, 0x0000226F, 0x00001C91, 0x000044F0,\n    0x00050080, 0x0000000B, 0x000053DE, 0x0000226F, 0x00005EAC, 0x000500C2,\n    0x0000000B, 0x00003948, 0x000053DE, 0x00000A17, 0x00060041, 0x00000294,\n    0x00004FAF, 0x0000107A, 0x00000A0B, 0x00003948, 0x0004003D, 0x00000017,\n    0x00001CAA, 0x00004FAF, 0x000500AA, 0x00000009, 0x000035C0, 0x0000619E,\n    0x00000A0D, 0x000500AA, 0x00000009, 0x00005376, 0x0000619E, 0x00000A10,\n    0x000500A6, 0x00000009, 0x00005686, 0x000035C0, 0x00005376, 0x000300F7,\n    0x00003463, 0x00000000, 0x000400FA, 0x00005686, 0x00002957, 0x00003463,\n    0x000200F8, 0x00002957, 0x000500C7, 0x00000017, 0x0000475F, 0x00001CAA,\n    0x000009CE, 0x000500C4, 0x00000017, 0x000024D1, 0x0000475F, 0x0000013D,\n    0x000500C7, 0x00000017, 0x000050AC, 0x00001CAA, 0x0000072E, 0x000500C2,\n    0x00000017, 0x0000448D, 0x000050AC, 0x0000013D, 0x000500C5, 0x00000017,\n    0x00003FF8, 0x000024D1, 0x0000448D, 0x000200F9, 0x00003463, 0x000200F8,\n    0x00003463, 0x000700F5, 0x00000017, 0x00005879, 0x00001CAA, 0x00004F78,\n    0x00003FF8, 0x00002957, 0x000500AA, 0x00000009, 0x00004CB6, 0x0000619E,\n    0x00000A13, 0x000500A6, 0x00000009, 0x00003B23, 0x00005376, 0x00004CB6,\n    0x000300F7, 0x0000362B, 0x00000000, 0x000400FA, 0x00003B23, 0x00002B38,\n    0x0000362B, 0x000200F8, 0x00002B38, 0x000500C4, 0x00000017, 0x00005E17,\n    0x00005879, 0x000002ED, 0x000500C2, 0x00000017, 0x00003BE7, 0x00005879,\n    0x000002ED, 0x000500C5, 0x00000017, 0x000029E8, 0x00005E17, 0x00003BE7,\n    0x000200F9, 0x0000362B, 0x000200F8, 0x0000362B, 0x000700F5, 0x00000017,\n    0x00004AB4, 0x00005879, 0x00003463, 0x000029E8, 0x00002B38, 0x000500C2,\n    0x0000000B, 0x00005FC1, 0x00001F01, 0x00000A17, 0x000500C7, 0x00000017,\n    0x00001CFC, 0x00004AB4, 0x00000352, 0x00040070, 0x0000001D, 0x00003F05,\n    0x00001CFC, 0x0005008E, 0x0000001D, 0x00004BA5, 0x00003F05, 0x0000092A,\n    0x000500C2, 0x00000017, 0x00005B47, 0x00004AB4, 0x000002ED, 0x00040070,\n    0x0000001D, 0x0000483C, 0x00005B47, 0x0005008E, 0x0000001D, 0x00004812,\n    0x0000483C, 0x0000092A, 0x00050051, 0x0000000D, 0x0000187C, 0x00004BA5,\n    0x00000000, 0x00050051, 0x0000000D, 0x000035EE, 0x00004812, 0x00000000,\n    0x00050050, 0x00000013, 0x00004B20, 0x0000187C, 0x000035EE, 0x0006000C,\n    0x0000000B, 0x00002171, 0x00000001, 0x0000003A, 0x00004B20, 0x00050051,\n    0x0000000D, 0x00005BBF, 0x00004BA5, 0x00000001, 0x00050051, 0x0000000D,\n    0x000039A7, 0x00004812, 0x00000001, 0x00050050, 0x00000013, 0x00004B21,\n    0x00005BBF, 0x000039A7, 0x0006000C, 0x0000000B, 0x00002172, 0x00000001,\n    0x0000003A, 0x00004B21, 0x00050051, 0x0000000D, 0x00005BC0, 0x00004BA5,\n    0x00000002, 0x00050051, 0x0000000D, 0x000039A8, 0x00004812, 0x00000002,\n    0x00050050, 0x00000013, 0x00004B22, 0x00005BC0, 0x000039A8, 0x0006000C,\n    0x0000000B, 0x00002173, 0x00000001, 0x0000003A, 0x00004B22, 0x00050051,\n    0x0000000D, 0x00005BC1, 0x00004BA5, 0x00000003, 0x00050051, 0x0000000D,\n    0x000039A9, 0x00004812, 0x00000003, 0x00050050, 0x00000013, 0x00004B0D,\n    0x00005BC1, 0x000039A9, 0x0006000C, 0x0000000B, 0x000020EE, 0x00000001,\n    0x0000003A, 0x00004B0D, 0x00070050, 0x00000017, 0x00003ABB, 0x00002171,\n    0x00002172, 0x00002173, 0x000020EE, 0x00060041, 0x00000294, 0x000045C3,\n    0x0000140E, 0x00000A0B, 0x00005FC1, 0x0003003E, 0x000045C3, 0x00003ABB,\n    0x00050080, 0x0000000B, 0x00005679, 0x00001F01, 0x00000A3A, 0x00050080,\n    0x0000000B, 0x000027E6, 0x000053DE, 0x00000A3A, 0x000500C2, 0x0000000B,\n    0x00003949, 0x000027E6, 0x00000A17, 0x00060041, 0x00000294, 0x00005566,\n    0x0000107A, 0x00000A0B, 0x00003949, 0x0004003D, 0x00000017, 0x00003910,\n    0x00005566, 0x000300F7, 0x00003A1A, 0x00000000, 0x000400FA, 0x00005686,\n    0x00002958, 0x00003A1A, 0x000200F8, 0x00002958, 0x000500C7, 0x00000017,\n    0x00004760, 0x00003910, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D2,\n    0x00004760, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AD, 0x00003910,\n    0x0000072E, 0x000500C2, 0x00000017, 0x0000448E, 0x000050AD, 0x0000013D,\n    0x000500C5, 0x00000017, 0x00003FF9, 0x000024D2, 0x0000448E, 0x000200F9,\n    0x00003A1A, 0x000200F8, 0x00003A1A, 0x000700F5, 0x00000017, 0x00002AAC,\n    0x00003910, 0x0000362B, 0x00003FF9, 0x00002958, 0x000300F7, 0x0000362C,\n    0x00000000, 0x000400FA, 0x00003B23, 0x00002B39, 0x0000362C, 0x000200F8,\n    0x00002B39, 0x000500C4, 0x00000017, 0x00005E18, 0x00002AAC, 0x000002ED,\n    0x000500C2, 0x00000017, 0x00003BE8, 0x00002AAC, 0x000002ED, 0x000500C5,\n    0x00000017, 0x000029E9, 0x00005E18, 0x00003BE8, 0x000200F9, 0x0000362C,\n    0x000200F8, 0x0000362C, 0x000700F5, 0x00000017, 0x00004AB5, 0x00002AAC,\n    0x00003A1A, 0x000029E9, 0x00002B39, 0x000500C2, 0x0000000B, 0x00005FC2,\n    0x00005679, 0x00000A17, 0x000500C7, 0x00000017, 0x00001CFD, 0x00004AB5,\n    0x00000352, 0x00040070, 0x0000001D, 0x00003F06, 0x00001CFD, 0x0005008E,\n    0x0000001D, 0x00004BA6, 0x00003F06, 0x0000092A, 0x000500C2, 0x00000017,\n    0x00005B48, 0x00004AB5, 0x000002ED, 0x00040070, 0x0000001D, 0x0000483D,\n    0x00005B48, 0x0005008E, 0x0000001D, 0x00004813, 0x0000483D, 0x0000092A,\n    0x00050051, 0x0000000D, 0x0000187D, 0x00004BA6, 0x00000000, 0x00050051,\n    0x0000000D, 0x000035EF, 0x00004813, 0x00000000, 0x00050050, 0x00000013,\n    0x00004B23, 0x0000187D, 0x000035EF, 0x0006000C, 0x0000000B, 0x00002174,\n    0x00000001, 0x0000003A, 0x00004B23, 0x00050051, 0x0000000D, 0x00005BC2,\n    0x00004BA6, 0x00000001, 0x00050051, 0x0000000D, 0x000039AA, 0x00004813,\n    0x00000001, 0x00050050, 0x00000013, 0x00004B24, 0x00005BC2, 0x000039AA,\n    0x0006000C, 0x0000000B, 0x00002175, 0x00000001, 0x0000003A, 0x00004B24,\n    0x00050051, 0x0000000D, 0x00005BC3, 0x00004BA6, 0x00000002, 0x00050051,\n    0x0000000D, 0x000039AB, 0x00004813, 0x00000002, 0x00050050, 0x00000013,\n    0x00004B25, 0x00005BC3, 0x000039AB, 0x0006000C, 0x0000000B, 0x00002176,\n    0x00000001, 0x0000003A, 0x00004B25, 0x00050051, 0x0000000D, 0x00005BC4,\n    0x00004BA6, 0x00000003, 0x00050051, 0x0000000D, 0x000039AC, 0x00004813,\n    0x00000003, 0x00050050, 0x00000013, 0x00004B0E, 0x00005BC4, 0x000039AC,\n    0x0006000C, 0x0000000B, 0x000020EF, 0x00000001, 0x0000003A, 0x00004B0E,\n    0x00070050, 0x00000017, 0x00003ABC, 0x00002174, 0x00002175, 0x00002176,\n    0x000020EF, 0x00060041, 0x00000294, 0x00004EBE, 0x0000140E, 0x00000A0B,\n    0x00005FC2, 0x0003003E, 0x00004EBE, 0x00003ABC, 0x000200F9, 0x00004C7A,\n    0x000200F8, 0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_rgba16_snorm_float_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25155\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n      %float = OpTypeFloat 32\n    %v4float = OpTypeVector %float 4\n       %uint = OpTypeInt 32 0\n     %v4uint = OpTypeVector %uint 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v2uint = OpTypeVector %uint 2\n     %v3uint = OpTypeVector %uint 3\n   %float_n1 = OpConstant %float -1\n      %v4int = OpTypeVector %int 4\n     %int_16 = OpConstant %int 16\n%float_3_05185094en05 = OpConstant %float 3.05185094e-05\n     %uint_0 = OpConstant %uint 0\n    %v2float = OpTypeVector %float 2\n     %uint_1 = OpConstant %uint 1\n     %uint_2 = OpConstant %uint 2\n     %uint_3 = OpConstant %uint 3\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n    %uint_16 = OpConstant %uint 16\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n      %int_3 = OpConstant %int 3\n      %int_2 = OpConstant %int 2\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %2596 = OpConstantComposite %v3uint %uint_2 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n     %uint_4 = OpConstant %uint 4\n    %uint_32 = OpConstant %uint 32\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n       %1284 = OpConstantComposite %v4float %float_n1 %float_n1 %float_n1 %float_n1\n        %770 = OpConstantComposite %v4int %int_16 %int_16 %int_16 %int_16\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24540 = OpBitwiseAnd %uint %13606 %uint_1\n      %17270 = OpINotEqual %bool %24540 %uint_0\n      %12328 = OpBitwiseAnd %uint %13606 %uint_2\n      %17284 = OpINotEqual %bool %12328 %uint_0\n       %7856 = OpShiftRightLogical %uint %13606 %uint_2\n      %25058 = OpBitwiseAnd %uint %7856 %uint_3\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2596\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %6586 DontFlatten\n               OpBranchConditional %24679 %21992 %6586\n      %21992 = OpLabel\n               OpBranch %19578\n       %6586 = OpLabel\n      %23478 = OpBitcast %v3int %21387\n      %18710 = OpCompositeExtract %uint %22410 1\n      %23531 = OpCompositeExtract %int %23478 0\n      %22810 = OpIMul %int %23531 %int_8\n       %6362 = OpCompositeExtract %int %23478 2\n      %14505 = OpBitcast %int %18710\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %23478 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %6594\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %22810 %24535\n      %10404 = OpBitcast %uint %8258\n      %14582 = OpIAdd %uint %22411 %10404\n      %12308 = OpLogicalNot %bool %17270\n               OpSelectionMerge %19040 DontFlatten\n               OpBranchConditional %12308 %9741 %17007\n       %9741 = OpLabel\n      %17463 = OpCompositeExtract %uint %21387 0\n      %11246 = OpCompositeExtract %uint %21387 1\n      %18801 = OpCompositeExtract %uint %21387 2\n      %14831 = OpIMul %uint %22409 %18801\n      %20322 = OpIAdd %uint %11246 %14831\n      %21676 = OpIMul %uint %22408 %20322\n      %20398 = OpIAdd %uint %17463 %21676\n      %11367 = OpShiftLeftLogical %uint %20398 %uint_3\n               OpBranch %19040\n      %17007 = OpLabel\n               OpSelectionMerge %23536 DontFlatten\n               OpBranchConditional %17284 %11410 %24353\n      %11410 = OpLabel\n      %21364 = OpShiftRightLogical %uint %22408 %int_5\n      %13804 = OpShiftRightLogical %uint %22409 %int_4\n      %13237 = OpShiftRightArithmetic %int %6362 %int_2\n      %22374 = OpBitcast %int %13804\n      %25085 = OpIMul %int %13237 %22374\n      %11618 = OpShiftRightArithmetic %int %17598 %int_4\n      %16670 = OpIAdd %int %25085 %11618\n      %19064 = OpBitcast %int %21364\n      %13020 = OpIMul %int %16670 %19064\n      %12986 = OpShiftRightArithmetic %int %23531 %int_5\n      %24558 = OpIAdd %int %13020 %12986\n       %8797 = OpShiftLeftLogical %int %24558 %int_7\n      %11434 = OpBitwiseAnd %int %6362 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %17598 %int_1\n      %21365 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21365 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %23531 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17334 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17334 %uint_3\n      %13015 = OpShiftRightArithmetic %int %17598 %int_3\n       %9929 = OpBitwiseXor %int %13015 %13237\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %23531 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %17598 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6551\n       %7168 = OpShiftLeftLogical %int %16793 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24144 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24144 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24144 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24144 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %23536\n      %24353 = OpLabel\n      %23000 = OpBitcast %v2int %17136\n      %22120 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %23000 1\n      %12089 = OpShiftRightArithmetic %int %14597 %int_5\n      %22400 = OpBitcast %int %22120\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %23000 0\n      %20423 = OpShiftRightArithmetic %int %25154 %int_5\n      %18864 = OpIAdd %int %7938 %20423\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25154 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17335 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17335 %uint_3\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25154 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6552\n       %7169 = OpShiftLeftLogical %int %21575 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24163 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24163 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24163 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %23536\n      %23536 = OpLabel\n      %10540 = OpPhi %uint %16869 %11410 %16870 %24353\n               OpBranch %19040\n      %19040 = OpLabel\n      %11376 = OpPhi %uint %11367 %9741 %10540 %23536\n      %18621 = OpIAdd %uint %11376 %24236\n      %15698 = OpShiftRightLogical %uint %18621 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15698\n       %7338 = OpLoad %v4uint %20399\n      %13760 = OpIEqual %bool %25058 %uint_1\n      %21366 = OpIEqual %bool %25058 %uint_2\n      %22150 = OpLogicalOr %bool %13760 %21366\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %7338 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %7338 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22649 = OpPhi %v4uint %7338 %19040 %16376 %10583\n      %19638 = OpIEqual %bool %25058 %uint_3\n      %15139 = OpLogicalOr %bool %21366 %19638\n               OpSelectionMerge %13867 None\n               OpBranchConditional %15139 %11064 %13867\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22649 %749\n      %15335 = OpShiftRightLogical %v4uint %22649 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %13867\n      %13867 = OpLabel\n      %17699 = OpPhi %v4uint %22649 %13411 %10728 %11064\n      %20013 = OpShiftRightLogical %uint %14582 %int_4\n      %23626 = OpBitcast %v4int %17699\n      %11292 = OpShiftLeftLogical %v4int %23626 %770\n      %16536 = OpShiftRightArithmetic %v4int %11292 %770\n      %10903 = OpConvertSToF %v4float %16536\n      %20413 = OpVectorTimesScalar %v4float %10903 %float_3_05185094en05\n      %23989 = OpExtInst %v4float %1 FMax %1284 %20413\n      %14338 = OpShiftRightArithmetic %v4int %23626 %770\n       %6607 = OpConvertSToF %v4float %14338\n      %18247 = OpVectorTimesScalar %v4float %6607 %float_3_05185094en05\n      %24070 = OpExtInst %v4float %1 FMax %1284 %18247\n      %24330 = OpCompositeExtract %float %23989 0\n      %14319 = OpCompositeExtract %float %24070 0\n      %19232 = OpCompositeConstruct %v2float %24330 %14319\n       %8561 = OpExtInst %uint %1 PackHalf2x16 %19232\n      %23487 = OpCompositeExtract %float %23989 1\n      %14759 = OpCompositeExtract %float %24070 1\n      %19233 = OpCompositeConstruct %v2float %23487 %14759\n       %8562 = OpExtInst %uint %1 PackHalf2x16 %19233\n      %23488 = OpCompositeExtract %float %23989 2\n      %14760 = OpCompositeExtract %float %24070 2\n      %19234 = OpCompositeConstruct %v2float %23488 %14760\n       %8563 = OpExtInst %uint %1 PackHalf2x16 %19234\n      %23489 = OpCompositeExtract %float %23989 3\n      %14761 = OpCompositeExtract %float %24070 3\n      %19213 = OpCompositeConstruct %v2float %23489 %14761\n       %8430 = OpExtInst %uint %1 PackHalf2x16 %19213\n      %15035 = OpCompositeConstruct %v4uint %8561 %8562 %8563 %8430\n      %17859 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %20013\n               OpStore %17859 %15035\n      %21685 = OpIAdd %uint %14582 %uint_16\n               OpSelectionMerge %24688 DontFlatten\n               OpBranchConditional %17270 %21993 %7205\n      %21993 = OpLabel\n               OpBranch %24688\n       %7205 = OpLabel\n               OpBranch %24688\n      %24688 = OpLabel\n      %11377 = OpPhi %uint %uint_32 %21993 %uint_16 %7205\n      %18622 = OpIAdd %uint %18621 %11377\n      %15699 = OpShiftRightLogical %uint %18622 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15699\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %14874 None\n               OpBranchConditional %22150 %10584 %14874\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %14874\n      %14874 = OpLabel\n      %10924 = OpPhi %v4uint %14608 %24688 %16377 %10584\n               OpSelectionMerge %13868 None\n               OpBranchConditional %15139 %11065 %13868\n      %11065 = OpLabel\n      %24088 = OpShiftLeftLogical %v4uint %10924 %749\n      %15336 = OpShiftRightLogical %v4uint %10924 %749\n      %10729 = OpBitwiseOr %v4uint %24088 %15336\n               OpBranch %13868\n      %13868 = OpLabel\n      %17700 = OpPhi %v4uint %10924 %14874 %10729 %11065\n      %20014 = OpShiftRightLogical %uint %21685 %int_4\n      %23627 = OpBitcast %v4int %17700\n      %11293 = OpShiftLeftLogical %v4int %23627 %770\n      %16537 = OpShiftRightArithmetic %v4int %11293 %770\n      %10904 = OpConvertSToF %v4float %16537\n      %20414 = OpVectorTimesScalar %v4float %10904 %float_3_05185094en05\n      %23990 = OpExtInst %v4float %1 FMax %1284 %20414\n      %14339 = OpShiftRightArithmetic %v4int %23627 %770\n       %6608 = OpConvertSToF %v4float %14339\n      %18248 = OpVectorTimesScalar %v4float %6608 %float_3_05185094en05\n      %24071 = OpExtInst %v4float %1 FMax %1284 %18248\n      %24331 = OpCompositeExtract %float %23990 0\n      %14320 = OpCompositeExtract %float %24071 0\n      %19235 = OpCompositeConstruct %v2float %24331 %14320\n       %8564 = OpExtInst %uint %1 PackHalf2x16 %19235\n      %23490 = OpCompositeExtract %float %23990 1\n      %14762 = OpCompositeExtract %float %24071 1\n      %19236 = OpCompositeConstruct %v2float %23490 %14762\n       %8565 = OpExtInst %uint %1 PackHalf2x16 %19236\n      %23491 = OpCompositeExtract %float %23990 2\n      %14763 = OpCompositeExtract %float %24071 2\n      %19237 = OpCompositeConstruct %v2float %23491 %14763\n       %8566 = OpExtInst %uint %1 PackHalf2x16 %19237\n      %23492 = OpCompositeExtract %float %23990 3\n      %14764 = OpCompositeExtract %float %24071 3\n      %19214 = OpCompositeConstruct %v2float %23492 %14764\n       %8431 = OpExtInst %uint %1 PackHalf2x16 %19214\n      %15036 = OpCompositeConstruct %v4uint %8564 %8565 %8566 %8431\n      %20158 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %20014\n               OpStore %20158 %15036\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_rgba16_snorm_float_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006243, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00030016, 0x0000000D, 0x00000020, 0x00040017,\n    0x0000001D, 0x0000000D, 0x00000004, 0x00040015, 0x0000000B, 0x00000020,\n    0x00000000, 0x00040017, 0x00000017, 0x0000000B, 0x00000004, 0x00040015,\n    0x0000000C, 0x00000020, 0x00000001, 0x00040017, 0x00000012, 0x0000000C,\n    0x00000002, 0x00040017, 0x00000016, 0x0000000C, 0x00000003, 0x00020014,\n    0x00000009, 0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017,\n    0x00000014, 0x0000000B, 0x00000003, 0x0004002B, 0x0000000D, 0x00000341,\n    0xBF800000, 0x00040017, 0x0000001A, 0x0000000C, 0x00000004, 0x0004002B,\n    0x0000000C, 0x00000A3B, 0x00000010, 0x0004002B, 0x0000000D, 0x00000A38,\n    0x38000100, 0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000, 0x00040017,\n    0x00000013, 0x0000000D, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A0D,\n    0x00000001, 0x0004002B, 0x0000000B, 0x00000A10, 0x00000002, 0x0004002B,\n    0x0000000B, 0x00000A13, 0x00000003, 0x0004002B, 0x0000000B, 0x000008A6,\n    0x00FF00FF, 0x0004002B, 0x0000000B, 0x00000A22, 0x00000008, 0x0004002B,\n    0x0000000B, 0x000005FD, 0xFF00FF00, 0x0004002B, 0x0000000B, 0x00000A3A,\n    0x00000010, 0x0004002B, 0x0000000C, 0x00000A17, 0x00000004, 0x0004002B,\n    0x0000000C, 0x00000A1D, 0x00000006, 0x0004002B, 0x0000000C, 0x00000A2C,\n    0x0000000B, 0x0004002B, 0x0000000C, 0x00000A39, 0x0000000F, 0x0004002B,\n    0x0000000C, 0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C, 0x00000A1A,\n    0x00000005, 0x0004002B, 0x0000000C, 0x00000A20, 0x00000007, 0x0004002B,\n    0x0000000C, 0x00000A23, 0x00000008, 0x0004002B, 0x0000000C, 0x00000A2F,\n    0x0000000C, 0x0004002B, 0x0000000C, 0x00000A14, 0x00000003, 0x0004002B,\n    0x0000000C, 0x00000A11, 0x00000002, 0x0004002B, 0x0000000C, 0x00000A0B,\n    0x00000000, 0x000A001E, 0x00000489, 0x0000000B, 0x0000000B, 0x0000000B,\n    0x0000000B, 0x00000014, 0x0000000B, 0x0000000B, 0x0000000B, 0x00040020,\n    0x00000706, 0x00000009, 0x00000489, 0x0004003B, 0x00000706, 0x00000CE9,\n    0x00000009, 0x00040020, 0x00000288, 0x00000009, 0x0000000B, 0x00040020,\n    0x00000291, 0x00000009, 0x00000014, 0x00040020, 0x00000292, 0x00000001,\n    0x00000014, 0x0004003B, 0x00000292, 0x00000F48, 0x00000001, 0x0006002C,\n    0x00000014, 0x00000A24, 0x00000A10, 0x00000A0A, 0x00000A0A, 0x00040017,\n    0x0000000F, 0x00000009, 0x00000002, 0x0003001D, 0x000007DC, 0x00000017,\n    0x0003001E, 0x000007B4, 0x000007DC, 0x00040020, 0x00000A31, 0x00000002,\n    0x000007B4, 0x0004003B, 0x00000A31, 0x0000107A, 0x00000002, 0x00040020,\n    0x00000294, 0x00000002, 0x00000017, 0x0003001D, 0x000007DD, 0x00000017,\n    0x0003001E, 0x000007B5, 0x000007DD, 0x00040020, 0x00000A32, 0x00000002,\n    0x000007B5, 0x0004003B, 0x00000A32, 0x0000140E, 0x00000002, 0x0004002B,\n    0x0000000B, 0x00000A16, 0x00000004, 0x0004002B, 0x0000000B, 0x00000A6A,\n    0x00000020, 0x0006002C, 0x00000014, 0x00000BC3, 0x00000A16, 0x00000A6A,\n    0x00000A0D, 0x0007002C, 0x00000017, 0x000009CE, 0x000008A6, 0x000008A6,\n    0x000008A6, 0x000008A6, 0x0007002C, 0x00000017, 0x0000013D, 0x00000A22,\n    0x00000A22, 0x00000A22, 0x00000A22, 0x0007002C, 0x00000017, 0x0000072E,\n    0x000005FD, 0x000005FD, 0x000005FD, 0x000005FD, 0x0007002C, 0x00000017,\n    0x000002ED, 0x00000A3A, 0x00000A3A, 0x00000A3A, 0x00000A3A, 0x0007002C,\n    0x0000001D, 0x00000504, 0x00000341, 0x00000341, 0x00000341, 0x00000341,\n    0x0007002C, 0x0000001A, 0x00000302, 0x00000A3B, 0x00000A3B, 0x00000A3B,\n    0x00000A3B, 0x00050036, 0x00000008, 0x0000161F, 0x00000000, 0x00000502,\n    0x000200F8, 0x00003B06, 0x000300F7, 0x00004C7A, 0x00000000, 0x000300FB,\n    0x00000A0A, 0x00002E68, 0x000200F8, 0x00002E68, 0x00050041, 0x00000288,\n    0x000060D7, 0x00000CE9, 0x00000A0B, 0x0004003D, 0x0000000B, 0x00003526,\n    0x000060D7, 0x000500C7, 0x0000000B, 0x00005FDC, 0x00003526, 0x00000A0D,\n    0x000500AB, 0x00000009, 0x00004376, 0x00005FDC, 0x00000A0A, 0x000500C7,\n    0x0000000B, 0x00003028, 0x00003526, 0x00000A10, 0x000500AB, 0x00000009,\n    0x00004384, 0x00003028, 0x00000A0A, 0x000500C2, 0x0000000B, 0x00001EB0,\n    0x00003526, 0x00000A10, 0x000500C7, 0x0000000B, 0x000061E2, 0x00001EB0,\n    0x00000A13, 0x00050041, 0x00000288, 0x0000492C, 0x00000CE9, 0x00000A0E,\n    0x0004003D, 0x0000000B, 0x00005EAC, 0x0000492C, 0x00050041, 0x00000288,\n    0x00004EBA, 0x00000CE9, 0x00000A11, 0x0004003D, 0x0000000B, 0x00005788,\n    0x00004EBA, 0x00050041, 0x00000288, 0x00004EBB, 0x00000CE9, 0x00000A14,\n    0x0004003D, 0x0000000B, 0x00005789, 0x00004EBB, 0x00050041, 0x00000291,\n    0x00004EBC, 0x00000CE9, 0x00000A17, 0x0004003D, 0x00000014, 0x0000578A,\n    0x00004EBC, 0x00050041, 0x00000288, 0x00004EBD, 0x00000CE9, 0x00000A1A,\n    0x0004003D, 0x0000000B, 0x0000578B, 0x00004EBD, 0x00050041, 0x00000288,\n    0x00004E6E, 0x00000CE9, 0x00000A1D, 0x0004003D, 0x0000000B, 0x000019C2,\n    0x00004E6E, 0x0004003D, 0x00000014, 0x00002A0E, 0x00000F48, 0x000500C4,\n    0x00000014, 0x0000538B, 0x00002A0E, 0x00000A24, 0x0007004F, 0x00000011,\n    0x000042F0, 0x0000538B, 0x0000538B, 0x00000000, 0x00000001, 0x0007004F,\n    0x00000011, 0x0000242F, 0x0000578A, 0x0000578A, 0x00000000, 0x00000001,\n    0x000500AE, 0x0000000F, 0x00004288, 0x000042F0, 0x0000242F, 0x0004009A,\n    0x00000009, 0x00006067, 0x00004288, 0x000300F7, 0x000019BA, 0x00000002,\n    0x000400FA, 0x00006067, 0x000055E8, 0x000019BA, 0x000200F8, 0x000055E8,\n    0x000200F9, 0x00004C7A, 0x000200F8, 0x000019BA, 0x0004007C, 0x00000016,\n    0x00005BB6, 0x0000538B, 0x00050051, 0x0000000B, 0x00004916, 0x0000578A,\n    0x00000001, 0x00050051, 0x0000000C, 0x00005BEB, 0x00005BB6, 0x00000000,\n    0x00050084, 0x0000000C, 0x0000591A, 0x00005BEB, 0x00000A23, 0x00050051,\n    0x0000000C, 0x000018DA, 0x00005BB6, 0x00000002, 0x0004007C, 0x0000000C,\n    0x000038A9, 0x00004916, 0x00050084, 0x0000000C, 0x00002C0F, 0x000018DA,\n    0x000038A9, 0x00050051, 0x0000000C, 0x000044BE, 0x00005BB6, 0x00000001,\n    0x00050080, 0x0000000C, 0x000056D4, 0x00002C0F, 0x000044BE, 0x0004007C,\n    0x0000000C, 0x00005785, 0x000019C2, 0x00050084, 0x0000000C, 0x00005FD7,\n    0x000056D4, 0x00005785, 0x00050080, 0x0000000C, 0x00002042, 0x0000591A,\n    0x00005FD7, 0x0004007C, 0x0000000B, 0x000028A4, 0x00002042, 0x00050080,\n    0x0000000B, 0x000038F6, 0x0000578B, 0x000028A4, 0x000400A8, 0x00000009,\n    0x00003014, 0x00004376, 0x000300F7, 0x00004A60, 0x00000002, 0x000400FA,\n    0x00003014, 0x0000260D, 0x0000426F, 0x000200F8, 0x0000260D, 0x00050051,\n    0x0000000B, 0x00004437, 0x0000538B, 0x00000000, 0x00050051, 0x0000000B,\n    0x00002BEE, 0x0000538B, 0x00000001, 0x00050051, 0x0000000B, 0x00004971,\n    0x0000538B, 0x00000002, 0x00050084, 0x0000000B, 0x000039EF, 0x00005789,\n    0x00004971, 0x00050080, 0x0000000B, 0x00004F62, 0x00002BEE, 0x000039EF,\n    0x00050084, 0x0000000B, 0x000054AC, 0x00005788, 0x00004F62, 0x00050080,\n    0x0000000B, 0x00004FAE, 0x00004437, 0x000054AC, 0x000500C4, 0x0000000B,\n    0x00002C67, 0x00004FAE, 0x00000A13, 0x000200F9, 0x00004A60, 0x000200F8,\n    0x0000426F, 0x000300F7, 0x00005BF0, 0x00000002, 0x000400FA, 0x00004384,\n    0x00002C92, 0x00005F21, 0x000200F8, 0x00002C92, 0x000500C2, 0x0000000B,\n    0x00005374, 0x00005788, 0x00000A1A, 0x000500C2, 0x0000000B, 0x000035EC,\n    0x00005789, 0x00000A17, 0x000500C3, 0x0000000C, 0x000033B5, 0x000018DA,\n    0x00000A11, 0x0004007C, 0x0000000C, 0x00005766, 0x000035EC, 0x00050084,\n    0x0000000C, 0x000061FD, 0x000033B5, 0x00005766, 0x000500C3, 0x0000000C,\n    0x00002D62, 0x000044BE, 0x00000A17, 0x00050080, 0x0000000C, 0x0000411E,\n    0x000061FD, 0x00002D62, 0x0004007C, 0x0000000C, 0x00004A78, 0x00005374,\n    0x00050084, 0x0000000C, 0x000032DC, 0x0000411E, 0x00004A78, 0x000500C3,\n    0x0000000C, 0x000032BA, 0x00005BEB, 0x00000A1A, 0x00050080, 0x0000000C,\n    0x00005FEE, 0x000032DC, 0x000032BA, 0x000500C4, 0x0000000C, 0x0000225D,\n    0x00005FEE, 0x00000A20, 0x000500C7, 0x0000000C, 0x00002CAA, 0x000018DA,\n    0x00000A14, 0x000500C4, 0x0000000C, 0x00004CAE, 0x00002CAA, 0x00000A1A,\n    0x000500C3, 0x0000000C, 0x0000383E, 0x000044BE, 0x00000A0E, 0x000500C7,\n    0x0000000C, 0x00005375, 0x0000383E, 0x00000A14, 0x000500C4, 0x0000000C,\n    0x000054CA, 0x00005375, 0x00000A14, 0x000500C5, 0x0000000C, 0x000042CE,\n    0x00004CAE, 0x000054CA, 0x000500C7, 0x0000000C, 0x000050D5, 0x00005BEB,\n    0x00000A20, 0x000500C5, 0x0000000C, 0x00003ADD, 0x000042CE, 0x000050D5,\n    0x000500C5, 0x0000000C, 0x000043B6, 0x0000225D, 0x00003ADD, 0x000500C4,\n    0x0000000C, 0x00005E50, 0x000043B6, 0x00000A13, 0x000500C3, 0x0000000C,\n    0x000032D7, 0x000044BE, 0x00000A14, 0x000500C6, 0x0000000C, 0x000026C9,\n    0x000032D7, 0x000033B5, 0x000500C7, 0x0000000C, 0x00004199, 0x000026C9,\n    0x00000A0E, 0x000500C3, 0x0000000C, 0x00002590, 0x00005BEB, 0x00000A14,\n    0x000500C7, 0x0000000C, 0x0000505E, 0x00002590, 0x00000A14, 0x000500C4,\n    0x0000000C, 0x0000541D, 0x00004199, 0x00000A0E, 0x000500C6, 0x0000000C,\n    0x000022BA, 0x0000505E, 0x0000541D, 0x000500C7, 0x0000000C, 0x00005076,\n    0x000044BE, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005228, 0x00005076,\n    0x00000A17, 0x000500C4, 0x0000000C, 0x00001997, 0x000022BA, 0x00000A1D,\n    0x000500C5, 0x0000000C, 0x000047FE, 0x00005228, 0x00001997, 0x000500C4,\n    0x0000000C, 0x00001C00, 0x00004199, 0x00000A2C, 0x000500C5, 0x0000000C,\n    0x00003C81, 0x000047FE, 0x00001C00, 0x000500C7, 0x0000000C, 0x000050AF,\n    0x00005E50, 0x00000A39, 0x000500C5, 0x0000000C, 0x00003C70, 0x00003C81,\n    0x000050AF, 0x000500C3, 0x0000000C, 0x00003745, 0x00005E50, 0x00000A17,\n    0x000500C7, 0x0000000C, 0x000018B8, 0x00003745, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x0000547E, 0x000018B8, 0x00000A1A, 0x000500C5, 0x0000000C,\n    0x000045A8, 0x00003C70, 0x0000547E, 0x000500C3, 0x0000000C, 0x00003A6E,\n    0x00005E50, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018B9, 0x00003A6E,\n    0x00000A20, 0x000500C4, 0x0000000C, 0x0000547F, 0x000018B9, 0x00000A23,\n    0x000500C5, 0x0000000C, 0x0000456F, 0x000045A8, 0x0000547F, 0x000500C3,\n    0x0000000C, 0x00003C88, 0x00005E50, 0x00000A23, 0x000500C4, 0x0000000C,\n    0x00002824, 0x00003C88, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B79,\n    0x0000456F, 0x00002824, 0x0004007C, 0x0000000B, 0x000041E5, 0x00003B79,\n    0x000200F9, 0x00005BF0, 0x000200F8, 0x00005F21, 0x0004007C, 0x00000012,\n    0x000059D8, 0x000042F0, 0x000500C2, 0x0000000B, 0x00005668, 0x00005788,\n    0x00000A1A, 0x00050051, 0x0000000C, 0x00003905, 0x000059D8, 0x00000001,\n    0x000500C3, 0x0000000C, 0x00002F39, 0x00003905, 0x00000A1A, 0x0004007C,\n    0x0000000C, 0x00005780, 0x00005668, 0x00050084, 0x0000000C, 0x00001F02,\n    0x00002F39, 0x00005780, 0x00050051, 0x0000000C, 0x00006242, 0x000059D8,\n    0x00000000, 0x000500C3, 0x0000000C, 0x00004FC7, 0x00006242, 0x00000A1A,\n    0x00050080, 0x0000000C, 0x000049B0, 0x00001F02, 0x00004FC7, 0x000500C4,\n    0x0000000C, 0x0000254A, 0x000049B0, 0x00000A1D, 0x000500C3, 0x0000000C,\n    0x0000603B, 0x00003905, 0x00000A0E, 0x000500C7, 0x0000000C, 0x0000539A,\n    0x0000603B, 0x00000A20, 0x000500C4, 0x0000000C, 0x0000534A, 0x0000539A,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x00004EA5, 0x00006242, 0x00000A20,\n    0x000500C5, 0x0000000C, 0x00002B1A, 0x0000534A, 0x00004EA5, 0x000500C5,\n    0x0000000C, 0x000043B7, 0x0000254A, 0x00002B1A, 0x000500C4, 0x0000000C,\n    0x00005E63, 0x000043B7, 0x00000A13, 0x000500C3, 0x0000000C, 0x000031DE,\n    0x00003905, 0x00000A17, 0x000500C7, 0x0000000C, 0x00005447, 0x000031DE,\n    0x00000A0E, 0x000500C3, 0x0000000C, 0x000028A6, 0x00006242, 0x00000A14,\n    0x000500C7, 0x0000000C, 0x0000511E, 0x000028A6, 0x00000A14, 0x000500C3,\n    0x0000000C, 0x000028B9, 0x00003905, 0x00000A14, 0x000500C7, 0x0000000C,\n    0x0000505F, 0x000028B9, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000541E,\n    0x0000505F, 0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BB, 0x0000511E,\n    0x0000541E, 0x000500C7, 0x0000000C, 0x00005077, 0x00003905, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x00005229, 0x00005077, 0x00000A17, 0x000500C4,\n    0x0000000C, 0x00001998, 0x000022BB, 0x00000A1D, 0x000500C5, 0x0000000C,\n    0x000047FF, 0x00005229, 0x00001998, 0x000500C4, 0x0000000C, 0x00001C01,\n    0x00005447, 0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C82, 0x000047FF,\n    0x00001C01, 0x000500C7, 0x0000000C, 0x000050B0, 0x00005E63, 0x00000A39,\n    0x000500C5, 0x0000000C, 0x00003C71, 0x00003C82, 0x000050B0, 0x000500C3,\n    0x0000000C, 0x00003746, 0x00005E63, 0x00000A17, 0x000500C7, 0x0000000C,\n    0x000018BA, 0x00003746, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005480,\n    0x000018BA, 0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A9, 0x00003C71,\n    0x00005480, 0x000500C3, 0x0000000C, 0x00003A6F, 0x00005E63, 0x00000A1A,\n    0x000500C7, 0x0000000C, 0x000018BB, 0x00003A6F, 0x00000A20, 0x000500C4,\n    0x0000000C, 0x00005481, 0x000018BB, 0x00000A23, 0x000500C5, 0x0000000C,\n    0x00004570, 0x000045A9, 0x00005481, 0x000500C3, 0x0000000C, 0x00003C89,\n    0x00005E63, 0x00000A23, 0x000500C4, 0x0000000C, 0x00002825, 0x00003C89,\n    0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B7A, 0x00004570, 0x00002825,\n    0x0004007C, 0x0000000B, 0x000041E6, 0x00003B7A, 0x000200F9, 0x00005BF0,\n    0x000200F8, 0x00005BF0, 0x000700F5, 0x0000000B, 0x0000292C, 0x000041E5,\n    0x00002C92, 0x000041E6, 0x00005F21, 0x000200F9, 0x00004A60, 0x000200F8,\n    0x00004A60, 0x000700F5, 0x0000000B, 0x00002C70, 0x00002C67, 0x0000260D,\n    0x0000292C, 0x00005BF0, 0x00050080, 0x0000000B, 0x000048BD, 0x00002C70,\n    0x00005EAC, 0x000500C2, 0x0000000B, 0x00003D52, 0x000048BD, 0x00000A17,\n    0x00060041, 0x00000294, 0x00004FAF, 0x0000107A, 0x00000A0B, 0x00003D52,\n    0x0004003D, 0x00000017, 0x00001CAA, 0x00004FAF, 0x000500AA, 0x00000009,\n    0x000035C0, 0x000061E2, 0x00000A0D, 0x000500AA, 0x00000009, 0x00005376,\n    0x000061E2, 0x00000A10, 0x000500A6, 0x00000009, 0x00005686, 0x000035C0,\n    0x00005376, 0x000300F7, 0x00003463, 0x00000000, 0x000400FA, 0x00005686,\n    0x00002957, 0x00003463, 0x000200F8, 0x00002957, 0x000500C7, 0x00000017,\n    0x0000475F, 0x00001CAA, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D1,\n    0x0000475F, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AC, 0x00001CAA,\n    0x0000072E, 0x000500C2, 0x00000017, 0x0000448D, 0x000050AC, 0x0000013D,\n    0x000500C5, 0x00000017, 0x00003FF8, 0x000024D1, 0x0000448D, 0x000200F9,\n    0x00003463, 0x000200F8, 0x00003463, 0x000700F5, 0x00000017, 0x00005879,\n    0x00001CAA, 0x00004A60, 0x00003FF8, 0x00002957, 0x000500AA, 0x00000009,\n    0x00004CB6, 0x000061E2, 0x00000A13, 0x000500A6, 0x00000009, 0x00003B23,\n    0x00005376, 0x00004CB6, 0x000300F7, 0x0000362B, 0x00000000, 0x000400FA,\n    0x00003B23, 0x00002B38, 0x0000362B, 0x000200F8, 0x00002B38, 0x000500C4,\n    0x00000017, 0x00005E17, 0x00005879, 0x000002ED, 0x000500C2, 0x00000017,\n    0x00003BE7, 0x00005879, 0x000002ED, 0x000500C5, 0x00000017, 0x000029E8,\n    0x00005E17, 0x00003BE7, 0x000200F9, 0x0000362B, 0x000200F8, 0x0000362B,\n    0x000700F5, 0x00000017, 0x00004523, 0x00005879, 0x00003463, 0x000029E8,\n    0x00002B38, 0x000500C2, 0x0000000B, 0x00004E2D, 0x000038F6, 0x00000A17,\n    0x0004007C, 0x0000001A, 0x00005C4A, 0x00004523, 0x000500C4, 0x0000001A,\n    0x00002C1C, 0x00005C4A, 0x00000302, 0x000500C3, 0x0000001A, 0x00004098,\n    0x00002C1C, 0x00000302, 0x0004006F, 0x0000001D, 0x00002A97, 0x00004098,\n    0x0005008E, 0x0000001D, 0x00004FBD, 0x00002A97, 0x00000A38, 0x0007000C,\n    0x0000001D, 0x00005DB5, 0x00000001, 0x00000028, 0x00000504, 0x00004FBD,\n    0x000500C3, 0x0000001A, 0x00003802, 0x00005C4A, 0x00000302, 0x0004006F,\n    0x0000001D, 0x000019CF, 0x00003802, 0x0005008E, 0x0000001D, 0x00004747,\n    0x000019CF, 0x00000A38, 0x0007000C, 0x0000001D, 0x00005E06, 0x00000001,\n    0x00000028, 0x00000504, 0x00004747, 0x00050051, 0x0000000D, 0x00005F0A,\n    0x00005DB5, 0x00000000, 0x00050051, 0x0000000D, 0x000037EF, 0x00005E06,\n    0x00000000, 0x00050050, 0x00000013, 0x00004B20, 0x00005F0A, 0x000037EF,\n    0x0006000C, 0x0000000B, 0x00002171, 0x00000001, 0x0000003A, 0x00004B20,\n    0x00050051, 0x0000000D, 0x00005BBF, 0x00005DB5, 0x00000001, 0x00050051,\n    0x0000000D, 0x000039A7, 0x00005E06, 0x00000001, 0x00050050, 0x00000013,\n    0x00004B21, 0x00005BBF, 0x000039A7, 0x0006000C, 0x0000000B, 0x00002172,\n    0x00000001, 0x0000003A, 0x00004B21, 0x00050051, 0x0000000D, 0x00005BC0,\n    0x00005DB5, 0x00000002, 0x00050051, 0x0000000D, 0x000039A8, 0x00005E06,\n    0x00000002, 0x00050050, 0x00000013, 0x00004B22, 0x00005BC0, 0x000039A8,\n    0x0006000C, 0x0000000B, 0x00002173, 0x00000001, 0x0000003A, 0x00004B22,\n    0x00050051, 0x0000000D, 0x00005BC1, 0x00005DB5, 0x00000003, 0x00050051,\n    0x0000000D, 0x000039A9, 0x00005E06, 0x00000003, 0x00050050, 0x00000013,\n    0x00004B0D, 0x00005BC1, 0x000039A9, 0x0006000C, 0x0000000B, 0x000020EE,\n    0x00000001, 0x0000003A, 0x00004B0D, 0x00070050, 0x00000017, 0x00003ABB,\n    0x00002171, 0x00002172, 0x00002173, 0x000020EE, 0x00060041, 0x00000294,\n    0x000045C3, 0x0000140E, 0x00000A0B, 0x00004E2D, 0x0003003E, 0x000045C3,\n    0x00003ABB, 0x00050080, 0x0000000B, 0x000054B5, 0x000038F6, 0x00000A3A,\n    0x000300F7, 0x00006070, 0x00000002, 0x000400FA, 0x00004376, 0x000055E9,\n    0x00001C25, 0x000200F8, 0x000055E9, 0x000200F9, 0x00006070, 0x000200F8,\n    0x00001C25, 0x000200F9, 0x00006070, 0x000200F8, 0x00006070, 0x000700F5,\n    0x0000000B, 0x00002C71, 0x00000A6A, 0x000055E9, 0x00000A3A, 0x00001C25,\n    0x00050080, 0x0000000B, 0x000048BE, 0x000048BD, 0x00002C71, 0x000500C2,\n    0x0000000B, 0x00003D53, 0x000048BE, 0x00000A17, 0x00060041, 0x00000294,\n    0x00005566, 0x0000107A, 0x00000A0B, 0x00003D53, 0x0004003D, 0x00000017,\n    0x00003910, 0x00005566, 0x000300F7, 0x00003A1A, 0x00000000, 0x000400FA,\n    0x00005686, 0x00002958, 0x00003A1A, 0x000200F8, 0x00002958, 0x000500C7,\n    0x00000017, 0x00004760, 0x00003910, 0x000009CE, 0x000500C4, 0x00000017,\n    0x000024D2, 0x00004760, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AD,\n    0x00003910, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448E, 0x000050AD,\n    0x0000013D, 0x000500C5, 0x00000017, 0x00003FF9, 0x000024D2, 0x0000448E,\n    0x000200F9, 0x00003A1A, 0x000200F8, 0x00003A1A, 0x000700F5, 0x00000017,\n    0x00002AAC, 0x00003910, 0x00006070, 0x00003FF9, 0x00002958, 0x000300F7,\n    0x0000362C, 0x00000000, 0x000400FA, 0x00003B23, 0x00002B39, 0x0000362C,\n    0x000200F8, 0x00002B39, 0x000500C4, 0x00000017, 0x00005E18, 0x00002AAC,\n    0x000002ED, 0x000500C2, 0x00000017, 0x00003BE8, 0x00002AAC, 0x000002ED,\n    0x000500C5, 0x00000017, 0x000029E9, 0x00005E18, 0x00003BE8, 0x000200F9,\n    0x0000362C, 0x000200F8, 0x0000362C, 0x000700F5, 0x00000017, 0x00004524,\n    0x00002AAC, 0x00003A1A, 0x000029E9, 0x00002B39, 0x000500C2, 0x0000000B,\n    0x00004E2E, 0x000054B5, 0x00000A17, 0x0004007C, 0x0000001A, 0x00005C4B,\n    0x00004524, 0x000500C4, 0x0000001A, 0x00002C1D, 0x00005C4B, 0x00000302,\n    0x000500C3, 0x0000001A, 0x00004099, 0x00002C1D, 0x00000302, 0x0004006F,\n    0x0000001D, 0x00002A98, 0x00004099, 0x0005008E, 0x0000001D, 0x00004FBE,\n    0x00002A98, 0x00000A38, 0x0007000C, 0x0000001D, 0x00005DB6, 0x00000001,\n    0x00000028, 0x00000504, 0x00004FBE, 0x000500C3, 0x0000001A, 0x00003803,\n    0x00005C4B, 0x00000302, 0x0004006F, 0x0000001D, 0x000019D0, 0x00003803,\n    0x0005008E, 0x0000001D, 0x00004748, 0x000019D0, 0x00000A38, 0x0007000C,\n    0x0000001D, 0x00005E07, 0x00000001, 0x00000028, 0x00000504, 0x00004748,\n    0x00050051, 0x0000000D, 0x00005F0B, 0x00005DB6, 0x00000000, 0x00050051,\n    0x0000000D, 0x000037F0, 0x00005E07, 0x00000000, 0x00050050, 0x00000013,\n    0x00004B23, 0x00005F0B, 0x000037F0, 0x0006000C, 0x0000000B, 0x00002174,\n    0x00000001, 0x0000003A, 0x00004B23, 0x00050051, 0x0000000D, 0x00005BC2,\n    0x00005DB6, 0x00000001, 0x00050051, 0x0000000D, 0x000039AA, 0x00005E07,\n    0x00000001, 0x00050050, 0x00000013, 0x00004B24, 0x00005BC2, 0x000039AA,\n    0x0006000C, 0x0000000B, 0x00002175, 0x00000001, 0x0000003A, 0x00004B24,\n    0x00050051, 0x0000000D, 0x00005BC3, 0x00005DB6, 0x00000002, 0x00050051,\n    0x0000000D, 0x000039AB, 0x00005E07, 0x00000002, 0x00050050, 0x00000013,\n    0x00004B25, 0x00005BC3, 0x000039AB, 0x0006000C, 0x0000000B, 0x00002176,\n    0x00000001, 0x0000003A, 0x00004B25, 0x00050051, 0x0000000D, 0x00005BC4,\n    0x00005DB6, 0x00000003, 0x00050051, 0x0000000D, 0x000039AC, 0x00005E07,\n    0x00000003, 0x00050050, 0x00000013, 0x00004B0E, 0x00005BC4, 0x000039AC,\n    0x0006000C, 0x0000000B, 0x000020EF, 0x00000001, 0x0000003A, 0x00004B0E,\n    0x00070050, 0x00000017, 0x00003ABC, 0x00002174, 0x00002175, 0x00002176,\n    0x000020EF, 0x00060041, 0x00000294, 0x00004EBE, 0x0000140E, 0x00000A0B,\n    0x00004E2E, 0x0003003E, 0x00004EBE, 0x00003ABC, 0x000200F9, 0x00004C7A,\n    0x000200F8, 0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_rgba16_snorm_float_scaled_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25157\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n      %float = OpTypeFloat 32\n    %v4float = OpTypeVector %float 4\n     %v4uint = OpTypeVector %uint 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v3uint = OpTypeVector %uint 3\n   %float_n1 = OpConstant %float -1\n      %v4int = OpTypeVector %int 4\n     %int_16 = OpConstant %int 16\n%float_3_05185094en05 = OpConstant %float 3.05185094e-05\n     %uint_0 = OpConstant %uint 0\n    %v2float = OpTypeVector %float 2\n     %uint_1 = OpConstant %uint 1\n     %uint_2 = OpConstant %uint 2\n     %uint_3 = OpConstant %uint 3\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n    %uint_16 = OpConstant %uint 16\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n      %int_3 = OpConstant %int 3\n      %int_2 = OpConstant %int 2\n     %uint_5 = OpConstant %uint 5\n     %uint_4 = OpConstant %uint 4\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n     %uint_7 = OpConstant %uint 7\n       %1927 = OpConstantComposite %v2uint %uint_4 %uint_7\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %2596 = OpConstantComposite %v3uint %uint_2 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n    %uint_32 = OpConstant %uint 32\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %1954 = OpConstantComposite %v2uint %uint_7 %uint_7\n       %1837 = OpConstantComposite %v2uint %uint_2 %uint_1\n       %1846 = OpConstantComposite %v2uint %uint_3 %uint_1\n     %uint_6 = OpConstant %uint 6\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n       %1284 = OpConstantComposite %v4float %float_n1 %float_n1 %float_n1 %float_n1\n        %770 = OpConstantComposite %v4int %int_16 %int_16 %int_16 %int_16\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24445 = OpBitwiseAnd %uint %13606 %uint_2\n      %18667 = OpINotEqual %bool %24445 %uint_0\n       %8141 = OpShiftRightLogical %uint %13606 %uint_2\n      %24990 = OpBitwiseAnd %uint %8141 %uint_3\n       %8871 = OpCompositeConstruct %v2uint %13606 %13606\n       %7087 = OpShiftRightLogical %v2uint %8871 %1927\n       %6551 = OpBitwiseAnd %v2uint %7087 %1954\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2596\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %6586 DontFlatten\n               OpBranchConditional %24679 %21992 %6586\n      %21992 = OpLabel\n               OpBranch %19578\n       %6586 = OpLabel\n      %23478 = OpBitcast %v3int %21387\n      %18710 = OpCompositeExtract %uint %22410 1\n      %23531 = OpCompositeExtract %int %23478 0\n      %22810 = OpIMul %int %23531 %int_8\n       %6362 = OpCompositeExtract %int %23478 2\n      %14505 = OpBitcast %int %18710\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %23478 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %6594\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %22810 %24535\n      %10898 = OpBitcast %uint %8258\n       %7937 = OpIAdd %uint %22411 %10898\n      %19921 = OpShiftRightLogical %v2uint %17136 %1837\n       %7712 = OpUDiv %v2uint %19921 %6551\n      %18183 = OpIMul %v2uint %6551 %7712\n      %18273 = OpISub %v2uint %19921 %18183\n      %11232 = OpShiftLeftLogical %v2uint %7712 %1837\n      %13284 = OpCompositeExtract %uint %18273 0\n      %10872 = OpCompositeExtract %uint %6551 1\n      %22886 = OpIMul %uint %13284 %10872\n       %6943 = OpCompositeExtract %uint %18273 1\n      %10469 = OpIAdd %uint %22886 %6943\n      %18851 = OpBitwiseAnd %v2uint %17136 %1846\n      %10581 = OpShiftLeftLogical %uint %10469 %uint_6\n      %20916 = OpCompositeExtract %uint %18851 1\n      %23596 = OpShiftLeftLogical %uint %20916 %uint_5\n      %19814 = OpBitwiseOr %uint %10581 %23596\n      %21476 = OpCompositeExtract %uint %18851 0\n       %8560 = OpShiftLeftLogical %uint %21476 %uint_3\n      %17648 = OpBitwiseOr %uint %19814 %8560\n      %19923 = OpCompositeExtract %uint %11232 0\n      %15556 = OpCompositeInsert %v3uint %19923 %21387 0\n      %23006 = OpCompositeExtract %uint %11232 1\n       %9680 = OpCompositeInsert %v3uint %23006 %15556 1\n               OpSelectionMerge %20344 DontFlatten\n               OpBranchConditional %18667 %23520 %11737\n      %23520 = OpLabel\n      %10111 = OpBitcast %v3int %9680\n      %19476 = OpShiftRightLogical %uint %22408 %int_5\n      %18810 = OpShiftRightLogical %uint %22409 %int_4\n       %6782 = OpCompositeExtract %int %10111 2\n      %12089 = OpShiftRightArithmetic %int %6782 %int_2\n      %22400 = OpBitcast %int %18810\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %10111 1\n      %19055 = OpShiftRightArithmetic %int %25154 %int_4\n      %11052 = OpIAdd %int %7938 %19055\n      %16898 = OpBitcast %int %19476\n      %14944 = OpIMul %int %11052 %16898\n      %25155 = OpCompositeExtract %int %10111 0\n      %20423 = OpShiftRightArithmetic %int %25155 %int_5\n      %18940 = OpIAdd %int %14944 %20423\n       %8797 = OpShiftLeftLogical %int %18940 %int_7\n      %11434 = OpBitwiseAnd %int %6782 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %25154 %int_1\n      %21364 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21364 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %25155 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17334 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17334 %uint_3\n      %13015 = OpShiftRightArithmetic %int %25154 %int_3\n       %9929 = OpBitwiseXor %int %13015 %12089\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %25155 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %25154 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6552 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6552\n       %7168 = OpShiftLeftLogical %int %16793 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24144 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24144 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24144 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24144 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %20344\n      %11737 = OpLabel\n      %11908 = OpVectorShuffle %v2uint %9680 %9680 0 1\n      %20347 = OpBitcast %v2int %11908\n      %11433 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %20347 1\n      %12090 = OpShiftRightArithmetic %int %14597 %int_5\n      %22401 = OpBitcast %int %11433\n       %7939 = OpIMul %int %12090 %22401\n      %25156 = OpCompositeExtract %int %20347 0\n      %20424 = OpShiftRightArithmetic %int %25156 %int_5\n      %18864 = OpIAdd %int %7939 %20424\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25156 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17335 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17335 %uint_3\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25156 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6553 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6553\n       %7169 = OpShiftLeftLogical %int %21575 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24163 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24163 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24163 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %20344\n      %20344 = OpLabel\n      %18329 = OpPhi %uint %16869 %23520 %16870 %11737\n      %15200 = OpCompositeExtract %uint %6551 0\n      %17489 = OpIMul %uint %15200 %10872\n       %7313 = OpIMul %uint %18329 %17489\n       %8815 = OpIAdd %uint %7313 %17648\n      %21470 = OpIAdd %uint %8815 %24236\n      %14664 = OpShiftRightLogical %uint %21470 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %14664\n       %7338 = OpLoad %v4uint %20399\n      %13760 = OpIEqual %bool %24990 %uint_1\n      %21366 = OpIEqual %bool %24990 %uint_2\n      %22150 = OpLogicalOr %bool %13760 %21366\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %7338 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %7338 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22649 = OpPhi %v4uint %7338 %20344 %16376 %10583\n      %19638 = OpIEqual %bool %24990 %uint_3\n      %15139 = OpLogicalOr %bool %21366 %19638\n               OpSelectionMerge %13867 None\n               OpBranchConditional %15139 %11064 %13867\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22649 %749\n      %15335 = OpShiftRightLogical %v4uint %22649 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %13867\n      %13867 = OpLabel\n      %17699 = OpPhi %v4uint %22649 %13411 %10728 %11064\n      %20013 = OpShiftRightLogical %uint %7937 %int_4\n      %23626 = OpBitcast %v4int %17699\n      %11292 = OpShiftLeftLogical %v4int %23626 %770\n      %16536 = OpShiftRightArithmetic %v4int %11292 %770\n      %10903 = OpConvertSToF %v4float %16536\n      %20413 = OpVectorTimesScalar %v4float %10903 %float_3_05185094en05\n      %23989 = OpExtInst %v4float %1 FMax %1284 %20413\n      %14338 = OpShiftRightArithmetic %v4int %23626 %770\n       %6607 = OpConvertSToF %v4float %14338\n      %18247 = OpVectorTimesScalar %v4float %6607 %float_3_05185094en05\n      %24070 = OpExtInst %v4float %1 FMax %1284 %18247\n      %24330 = OpCompositeExtract %float %23989 0\n      %14319 = OpCompositeExtract %float %24070 0\n      %19232 = OpCompositeConstruct %v2float %24330 %14319\n       %8561 = OpExtInst %uint %1 PackHalf2x16 %19232\n      %23487 = OpCompositeExtract %float %23989 1\n      %14759 = OpCompositeExtract %float %24070 1\n      %19233 = OpCompositeConstruct %v2float %23487 %14759\n       %8562 = OpExtInst %uint %1 PackHalf2x16 %19233\n      %23488 = OpCompositeExtract %float %23989 2\n      %14760 = OpCompositeExtract %float %24070 2\n      %19234 = OpCompositeConstruct %v2float %23488 %14760\n       %8563 = OpExtInst %uint %1 PackHalf2x16 %19234\n      %23489 = OpCompositeExtract %float %23989 3\n      %14761 = OpCompositeExtract %float %24070 3\n      %19213 = OpCompositeConstruct %v2float %23489 %14761\n       %8430 = OpExtInst %uint %1 PackHalf2x16 %19213\n      %15035 = OpCompositeConstruct %v4uint %8561 %8562 %8563 %8430\n      %17859 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %20013\n               OpStore %17859 %15035\n      %22137 = OpIAdd %uint %7937 %uint_16\n      %10214 = OpIAdd %uint %21470 %uint_16\n      %14665 = OpShiftRightLogical %uint %10214 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %14665\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %14874 None\n               OpBranchConditional %22150 %10584 %14874\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %14874\n      %14874 = OpLabel\n      %10924 = OpPhi %v4uint %14608 %13867 %16377 %10584\n               OpSelectionMerge %13868 None\n               OpBranchConditional %15139 %11065 %13868\n      %11065 = OpLabel\n      %24088 = OpShiftLeftLogical %v4uint %10924 %749\n      %15336 = OpShiftRightLogical %v4uint %10924 %749\n      %10729 = OpBitwiseOr %v4uint %24088 %15336\n               OpBranch %13868\n      %13868 = OpLabel\n      %17700 = OpPhi %v4uint %10924 %14874 %10729 %11065\n      %20014 = OpShiftRightLogical %uint %22137 %int_4\n      %23627 = OpBitcast %v4int %17700\n      %11293 = OpShiftLeftLogical %v4int %23627 %770\n      %16537 = OpShiftRightArithmetic %v4int %11293 %770\n      %10904 = OpConvertSToF %v4float %16537\n      %20414 = OpVectorTimesScalar %v4float %10904 %float_3_05185094en05\n      %23990 = OpExtInst %v4float %1 FMax %1284 %20414\n      %14339 = OpShiftRightArithmetic %v4int %23627 %770\n       %6608 = OpConvertSToF %v4float %14339\n      %18248 = OpVectorTimesScalar %v4float %6608 %float_3_05185094en05\n      %24071 = OpExtInst %v4float %1 FMax %1284 %18248\n      %24331 = OpCompositeExtract %float %23990 0\n      %14320 = OpCompositeExtract %float %24071 0\n      %19235 = OpCompositeConstruct %v2float %24331 %14320\n       %8564 = OpExtInst %uint %1 PackHalf2x16 %19235\n      %23490 = OpCompositeExtract %float %23990 1\n      %14762 = OpCompositeExtract %float %24071 1\n      %19236 = OpCompositeConstruct %v2float %23490 %14762\n       %8565 = OpExtInst %uint %1 PackHalf2x16 %19236\n      %23491 = OpCompositeExtract %float %23990 2\n      %14763 = OpCompositeExtract %float %24071 2\n      %19237 = OpCompositeConstruct %v2float %23491 %14763\n       %8566 = OpExtInst %uint %1 PackHalf2x16 %19237\n      %23492 = OpCompositeExtract %float %23990 3\n      %14764 = OpCompositeExtract %float %24071 3\n      %19214 = OpCompositeConstruct %v2float %23492 %14764\n       %8431 = OpExtInst %uint %1 PackHalf2x16 %19214\n      %15036 = OpCompositeConstruct %v4uint %8564 %8565 %8566 %8431\n      %20158 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %20014\n               OpStore %20158 %15036\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_rgba16_snorm_float_scaled_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006245, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00030016, 0x0000000D,\n    0x00000020, 0x00040017, 0x0000001D, 0x0000000D, 0x00000004, 0x00040017,\n    0x00000017, 0x0000000B, 0x00000004, 0x00040015, 0x0000000C, 0x00000020,\n    0x00000001, 0x00040017, 0x00000012, 0x0000000C, 0x00000002, 0x00040017,\n    0x00000016, 0x0000000C, 0x00000003, 0x00020014, 0x00000009, 0x00040017,\n    0x00000014, 0x0000000B, 0x00000003, 0x0004002B, 0x0000000D, 0x00000341,\n    0xBF800000, 0x00040017, 0x0000001A, 0x0000000C, 0x00000004, 0x0004002B,\n    0x0000000C, 0x00000A3B, 0x00000010, 0x0004002B, 0x0000000D, 0x00000A38,\n    0x38000100, 0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000, 0x00040017,\n    0x00000013, 0x0000000D, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A0D,\n    0x00000001, 0x0004002B, 0x0000000B, 0x00000A10, 0x00000002, 0x0004002B,\n    0x0000000B, 0x00000A13, 0x00000003, 0x0004002B, 0x0000000B, 0x000008A6,\n    0x00FF00FF, 0x0004002B, 0x0000000B, 0x00000A22, 0x00000008, 0x0004002B,\n    0x0000000B, 0x000005FD, 0xFF00FF00, 0x0004002B, 0x0000000B, 0x00000A3A,\n    0x00000010, 0x0004002B, 0x0000000C, 0x00000A17, 0x00000004, 0x0004002B,\n    0x0000000C, 0x00000A1D, 0x00000006, 0x0004002B, 0x0000000C, 0x00000A2C,\n    0x0000000B, 0x0004002B, 0x0000000C, 0x00000A39, 0x0000000F, 0x0004002B,\n    0x0000000C, 0x00000A0E, 0x00000001, 0x0004002B, 0x0000000C, 0x00000A1A,\n    0x00000005, 0x0004002B, 0x0000000C, 0x00000A20, 0x00000007, 0x0004002B,\n    0x0000000C, 0x00000A23, 0x00000008, 0x0004002B, 0x0000000C, 0x00000A2F,\n    0x0000000C, 0x0004002B, 0x0000000C, 0x00000A14, 0x00000003, 0x0004002B,\n    0x0000000C, 0x00000A11, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A19,\n    0x00000005, 0x0004002B, 0x0000000B, 0x00000A16, 0x00000004, 0x0004002B,\n    0x0000000C, 0x00000A0B, 0x00000000, 0x000A001E, 0x00000489, 0x0000000B,\n    0x0000000B, 0x0000000B, 0x0000000B, 0x00000014, 0x0000000B, 0x0000000B,\n    0x0000000B, 0x00040020, 0x00000706, 0x00000009, 0x00000489, 0x0004003B,\n    0x00000706, 0x00000CE9, 0x00000009, 0x00040020, 0x00000288, 0x00000009,\n    0x0000000B, 0x0004002B, 0x0000000B, 0x00000A1F, 0x00000007, 0x0005002C,\n    0x00000011, 0x00000787, 0x00000A16, 0x00000A1F, 0x00040020, 0x00000291,\n    0x00000009, 0x00000014, 0x00040020, 0x00000292, 0x00000001, 0x00000014,\n    0x0004003B, 0x00000292, 0x00000F48, 0x00000001, 0x0006002C, 0x00000014,\n    0x00000A24, 0x00000A10, 0x00000A0A, 0x00000A0A, 0x00040017, 0x0000000F,\n    0x00000009, 0x00000002, 0x0003001D, 0x000007DC, 0x00000017, 0x0003001E,\n    0x000007B4, 0x000007DC, 0x00040020, 0x00000A31, 0x00000002, 0x000007B4,\n    0x0004003B, 0x00000A31, 0x0000107A, 0x00000002, 0x00040020, 0x00000294,\n    0x00000002, 0x00000017, 0x0003001D, 0x000007DD, 0x00000017, 0x0003001E,\n    0x000007B5, 0x000007DD, 0x00040020, 0x00000A32, 0x00000002, 0x000007B5,\n    0x0004003B, 0x00000A32, 0x0000140E, 0x00000002, 0x0004002B, 0x0000000B,\n    0x00000A6A, 0x00000020, 0x0006002C, 0x00000014, 0x00000BC3, 0x00000A16,\n    0x00000A6A, 0x00000A0D, 0x0005002C, 0x00000011, 0x000007A2, 0x00000A1F,\n    0x00000A1F, 0x0005002C, 0x00000011, 0x0000072D, 0x00000A10, 0x00000A0D,\n    0x0005002C, 0x00000011, 0x00000736, 0x00000A13, 0x00000A0D, 0x0004002B,\n    0x0000000B, 0x00000A1C, 0x00000006, 0x0007002C, 0x00000017, 0x000009CE,\n    0x000008A6, 0x000008A6, 0x000008A6, 0x000008A6, 0x0007002C, 0x00000017,\n    0x0000013D, 0x00000A22, 0x00000A22, 0x00000A22, 0x00000A22, 0x0007002C,\n    0x00000017, 0x0000072E, 0x000005FD, 0x000005FD, 0x000005FD, 0x000005FD,\n    0x0007002C, 0x00000017, 0x000002ED, 0x00000A3A, 0x00000A3A, 0x00000A3A,\n    0x00000A3A, 0x0007002C, 0x0000001D, 0x00000504, 0x00000341, 0x00000341,\n    0x00000341, 0x00000341, 0x0007002C, 0x0000001A, 0x00000302, 0x00000A3B,\n    0x00000A3B, 0x00000A3B, 0x00000A3B, 0x00050036, 0x00000008, 0x0000161F,\n    0x00000000, 0x00000502, 0x000200F8, 0x00003B06, 0x000300F7, 0x00004C7A,\n    0x00000000, 0x000300FB, 0x00000A0A, 0x00002E68, 0x000200F8, 0x00002E68,\n    0x00050041, 0x00000288, 0x000060D7, 0x00000CE9, 0x00000A0B, 0x0004003D,\n    0x0000000B, 0x00003526, 0x000060D7, 0x000500C7, 0x0000000B, 0x00005F7D,\n    0x00003526, 0x00000A10, 0x000500AB, 0x00000009, 0x000048EB, 0x00005F7D,\n    0x00000A0A, 0x000500C2, 0x0000000B, 0x00001FCD, 0x00003526, 0x00000A10,\n    0x000500C7, 0x0000000B, 0x0000619E, 0x00001FCD, 0x00000A13, 0x00050050,\n    0x00000011, 0x000022A7, 0x00003526, 0x00003526, 0x000500C2, 0x00000011,\n    0x00001BAF, 0x000022A7, 0x00000787, 0x000500C7, 0x00000011, 0x00001997,\n    0x00001BAF, 0x000007A2, 0x00050041, 0x00000288, 0x0000492C, 0x00000CE9,\n    0x00000A0E, 0x0004003D, 0x0000000B, 0x00005EAC, 0x0000492C, 0x00050041,\n    0x00000288, 0x00004EBA, 0x00000CE9, 0x00000A11, 0x0004003D, 0x0000000B,\n    0x00005788, 0x00004EBA, 0x00050041, 0x00000288, 0x00004EBB, 0x00000CE9,\n    0x00000A14, 0x0004003D, 0x0000000B, 0x00005789, 0x00004EBB, 0x00050041,\n    0x00000291, 0x00004EBC, 0x00000CE9, 0x00000A17, 0x0004003D, 0x00000014,\n    0x0000578A, 0x00004EBC, 0x00050041, 0x00000288, 0x00004EBD, 0x00000CE9,\n    0x00000A1A, 0x0004003D, 0x0000000B, 0x0000578B, 0x00004EBD, 0x00050041,\n    0x00000288, 0x00004E6E, 0x00000CE9, 0x00000A1D, 0x0004003D, 0x0000000B,\n    0x000019C2, 0x00004E6E, 0x0004003D, 0x00000014, 0x00002A0E, 0x00000F48,\n    0x000500C4, 0x00000014, 0x0000538B, 0x00002A0E, 0x00000A24, 0x0007004F,\n    0x00000011, 0x000042F0, 0x0000538B, 0x0000538B, 0x00000000, 0x00000001,\n    0x0007004F, 0x00000011, 0x0000242F, 0x0000578A, 0x0000578A, 0x00000000,\n    0x00000001, 0x000500AE, 0x0000000F, 0x00004288, 0x000042F0, 0x0000242F,\n    0x0004009A, 0x00000009, 0x00006067, 0x00004288, 0x000300F7, 0x000019BA,\n    0x00000002, 0x000400FA, 0x00006067, 0x000055E8, 0x000019BA, 0x000200F8,\n    0x000055E8, 0x000200F9, 0x00004C7A, 0x000200F8, 0x000019BA, 0x0004007C,\n    0x00000016, 0x00005BB6, 0x0000538B, 0x00050051, 0x0000000B, 0x00004916,\n    0x0000578A, 0x00000001, 0x00050051, 0x0000000C, 0x00005BEB, 0x00005BB6,\n    0x00000000, 0x00050084, 0x0000000C, 0x0000591A, 0x00005BEB, 0x00000A23,\n    0x00050051, 0x0000000C, 0x000018DA, 0x00005BB6, 0x00000002, 0x0004007C,\n    0x0000000C, 0x000038A9, 0x00004916, 0x00050084, 0x0000000C, 0x00002C0F,\n    0x000018DA, 0x000038A9, 0x00050051, 0x0000000C, 0x000044BE, 0x00005BB6,\n    0x00000001, 0x00050080, 0x0000000C, 0x000056D4, 0x00002C0F, 0x000044BE,\n    0x0004007C, 0x0000000C, 0x00005785, 0x000019C2, 0x00050084, 0x0000000C,\n    0x00005FD7, 0x000056D4, 0x00005785, 0x00050080, 0x0000000C, 0x00002042,\n    0x0000591A, 0x00005FD7, 0x0004007C, 0x0000000B, 0x00002A92, 0x00002042,\n    0x00050080, 0x0000000B, 0x00001F01, 0x0000578B, 0x00002A92, 0x000500C2,\n    0x00000011, 0x00004DD1, 0x000042F0, 0x0000072D, 0x00050086, 0x00000011,\n    0x00001E20, 0x00004DD1, 0x00001997, 0x00050084, 0x00000011, 0x00004707,\n    0x00001997, 0x00001E20, 0x00050082, 0x00000011, 0x00004761, 0x00004DD1,\n    0x00004707, 0x000500C4, 0x00000011, 0x00002BE0, 0x00001E20, 0x0000072D,\n    0x00050051, 0x0000000B, 0x000033E4, 0x00004761, 0x00000000, 0x00050051,\n    0x0000000B, 0x00002A78, 0x00001997, 0x00000001, 0x00050084, 0x0000000B,\n    0x00005966, 0x000033E4, 0x00002A78, 0x00050051, 0x0000000B, 0x00001B1F,\n    0x00004761, 0x00000001, 0x00050080, 0x0000000B, 0x000028E5, 0x00005966,\n    0x00001B1F, 0x000500C7, 0x00000011, 0x000049A3, 0x000042F0, 0x00000736,\n    0x000500C4, 0x0000000B, 0x00002955, 0x000028E5, 0x00000A1C, 0x00050051,\n    0x0000000B, 0x000051B4, 0x000049A3, 0x00000001, 0x000500C4, 0x0000000B,\n    0x00005C2C, 0x000051B4, 0x00000A19, 0x000500C5, 0x0000000B, 0x00004D66,\n    0x00002955, 0x00005C2C, 0x00050051, 0x0000000B, 0x000053E4, 0x000049A3,\n    0x00000000, 0x000500C4, 0x0000000B, 0x00002170, 0x000053E4, 0x00000A13,\n    0x000500C5, 0x0000000B, 0x000044F0, 0x00004D66, 0x00002170, 0x00050051,\n    0x0000000B, 0x00004DD3, 0x00002BE0, 0x00000000, 0x00060052, 0x00000014,\n    0x00003CC4, 0x00004DD3, 0x0000538B, 0x00000000, 0x00050051, 0x0000000B,\n    0x000059DE, 0x00002BE0, 0x00000001, 0x00060052, 0x00000014, 0x000025D0,\n    0x000059DE, 0x00003CC4, 0x00000001, 0x000300F7, 0x00004F78, 0x00000002,\n    0x000400FA, 0x000048EB, 0x00005BE0, 0x00002DD9, 0x000200F8, 0x00005BE0,\n    0x0004007C, 0x00000016, 0x0000277F, 0x000025D0, 0x000500C2, 0x0000000B,\n    0x00004C14, 0x00005788, 0x00000A1A, 0x000500C2, 0x0000000B, 0x0000497A,\n    0x00005789, 0x00000A17, 0x00050051, 0x0000000C, 0x00001A7E, 0x0000277F,\n    0x00000002, 0x000500C3, 0x0000000C, 0x00002F39, 0x00001A7E, 0x00000A11,\n    0x0004007C, 0x0000000C, 0x00005780, 0x0000497A, 0x00050084, 0x0000000C,\n    0x00001F02, 0x00002F39, 0x00005780, 0x00050051, 0x0000000C, 0x00006242,\n    0x0000277F, 0x00000001, 0x000500C3, 0x0000000C, 0x00004A6F, 0x00006242,\n    0x00000A17, 0x00050080, 0x0000000C, 0x00002B2C, 0x00001F02, 0x00004A6F,\n    0x0004007C, 0x0000000C, 0x00004202, 0x00004C14, 0x00050084, 0x0000000C,\n    0x00003A60, 0x00002B2C, 0x00004202, 0x00050051, 0x0000000C, 0x00006243,\n    0x0000277F, 0x00000000, 0x000500C3, 0x0000000C, 0x00004FC7, 0x00006243,\n    0x00000A1A, 0x00050080, 0x0000000C, 0x000049FC, 0x00003A60, 0x00004FC7,\n    0x000500C4, 0x0000000C, 0x0000225D, 0x000049FC, 0x00000A20, 0x000500C7,\n    0x0000000C, 0x00002CAA, 0x00001A7E, 0x00000A14, 0x000500C4, 0x0000000C,\n    0x00004CAE, 0x00002CAA, 0x00000A1A, 0x000500C3, 0x0000000C, 0x0000383E,\n    0x00006242, 0x00000A0E, 0x000500C7, 0x0000000C, 0x00005374, 0x0000383E,\n    0x00000A14, 0x000500C4, 0x0000000C, 0x000054CA, 0x00005374, 0x00000A14,\n    0x000500C5, 0x0000000C, 0x000042CE, 0x00004CAE, 0x000054CA, 0x000500C7,\n    0x0000000C, 0x000050D5, 0x00006243, 0x00000A20, 0x000500C5, 0x0000000C,\n    0x00003ADD, 0x000042CE, 0x000050D5, 0x000500C5, 0x0000000C, 0x000043B6,\n    0x0000225D, 0x00003ADD, 0x000500C4, 0x0000000C, 0x00005E50, 0x000043B6,\n    0x00000A13, 0x000500C3, 0x0000000C, 0x000032D7, 0x00006242, 0x00000A14,\n    0x000500C6, 0x0000000C, 0x000026C9, 0x000032D7, 0x00002F39, 0x000500C7,\n    0x0000000C, 0x00004199, 0x000026C9, 0x00000A0E, 0x000500C3, 0x0000000C,\n    0x00002590, 0x00006243, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000505E,\n    0x00002590, 0x00000A14, 0x000500C4, 0x0000000C, 0x0000541D, 0x00004199,\n    0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BA, 0x0000505E, 0x0000541D,\n    0x000500C7, 0x0000000C, 0x00005076, 0x00006242, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x00005228, 0x00005076, 0x00000A17, 0x000500C4, 0x0000000C,\n    0x00001998, 0x000022BA, 0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FE,\n    0x00005228, 0x00001998, 0x000500C4, 0x0000000C, 0x00001C00, 0x00004199,\n    0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C81, 0x000047FE, 0x00001C00,\n    0x000500C7, 0x0000000C, 0x000050AF, 0x00005E50, 0x00000A39, 0x000500C5,\n    0x0000000C, 0x00003C70, 0x00003C81, 0x000050AF, 0x000500C3, 0x0000000C,\n    0x00003745, 0x00005E50, 0x00000A17, 0x000500C7, 0x0000000C, 0x000018B8,\n    0x00003745, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000547E, 0x000018B8,\n    0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A8, 0x00003C70, 0x0000547E,\n    0x000500C3, 0x0000000C, 0x00003A6E, 0x00005E50, 0x00000A1A, 0x000500C7,\n    0x0000000C, 0x000018B9, 0x00003A6E, 0x00000A20, 0x000500C4, 0x0000000C,\n    0x0000547F, 0x000018B9, 0x00000A23, 0x000500C5, 0x0000000C, 0x0000456F,\n    0x000045A8, 0x0000547F, 0x000500C3, 0x0000000C, 0x00003C88, 0x00005E50,\n    0x00000A23, 0x000500C4, 0x0000000C, 0x00002824, 0x00003C88, 0x00000A2F,\n    0x000500C5, 0x0000000C, 0x00003B79, 0x0000456F, 0x00002824, 0x0004007C,\n    0x0000000B, 0x000041E5, 0x00003B79, 0x000200F9, 0x00004F78, 0x000200F8,\n    0x00002DD9, 0x0007004F, 0x00000011, 0x00002E84, 0x000025D0, 0x000025D0,\n    0x00000000, 0x00000001, 0x0004007C, 0x00000012, 0x00004F7B, 0x00002E84,\n    0x000500C2, 0x0000000B, 0x00002CA9, 0x00005788, 0x00000A1A, 0x00050051,\n    0x0000000C, 0x00003905, 0x00004F7B, 0x00000001, 0x000500C3, 0x0000000C,\n    0x00002F3A, 0x00003905, 0x00000A1A, 0x0004007C, 0x0000000C, 0x00005781,\n    0x00002CA9, 0x00050084, 0x0000000C, 0x00001F03, 0x00002F3A, 0x00005781,\n    0x00050051, 0x0000000C, 0x00006244, 0x00004F7B, 0x00000000, 0x000500C3,\n    0x0000000C, 0x00004FC8, 0x00006244, 0x00000A1A, 0x00050080, 0x0000000C,\n    0x000049B0, 0x00001F03, 0x00004FC8, 0x000500C4, 0x0000000C, 0x0000254A,\n    0x000049B0, 0x00000A1D, 0x000500C3, 0x0000000C, 0x0000603B, 0x00003905,\n    0x00000A0E, 0x000500C7, 0x0000000C, 0x0000539A, 0x0000603B, 0x00000A20,\n    0x000500C4, 0x0000000C, 0x0000534A, 0x0000539A, 0x00000A14, 0x000500C7,\n    0x0000000C, 0x00004EA5, 0x00006244, 0x00000A20, 0x000500C5, 0x0000000C,\n    0x00002B1A, 0x0000534A, 0x00004EA5, 0x000500C5, 0x0000000C, 0x000043B7,\n    0x0000254A, 0x00002B1A, 0x000500C4, 0x0000000C, 0x00005E63, 0x000043B7,\n    0x00000A13, 0x000500C3, 0x0000000C, 0x000031DE, 0x00003905, 0x00000A17,\n    0x000500C7, 0x0000000C, 0x00005447, 0x000031DE, 0x00000A0E, 0x000500C3,\n    0x0000000C, 0x000028A6, 0x00006244, 0x00000A14, 0x000500C7, 0x0000000C,\n    0x0000511E, 0x000028A6, 0x00000A14, 0x000500C3, 0x0000000C, 0x000028B9,\n    0x00003905, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000505F, 0x000028B9,\n    0x00000A0E, 0x000500C4, 0x0000000C, 0x0000541E, 0x0000505F, 0x00000A0E,\n    0x000500C6, 0x0000000C, 0x000022BB, 0x0000511E, 0x0000541E, 0x000500C7,\n    0x0000000C, 0x00005077, 0x00003905, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x00005229, 0x00005077, 0x00000A17, 0x000500C4, 0x0000000C, 0x00001999,\n    0x000022BB, 0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FF, 0x00005229,\n    0x00001999, 0x000500C4, 0x0000000C, 0x00001C01, 0x00005447, 0x00000A2C,\n    0x000500C5, 0x0000000C, 0x00003C82, 0x000047FF, 0x00001C01, 0x000500C7,\n    0x0000000C, 0x000050B0, 0x00005E63, 0x00000A39, 0x000500C5, 0x0000000C,\n    0x00003C71, 0x00003C82, 0x000050B0, 0x000500C3, 0x0000000C, 0x00003746,\n    0x00005E63, 0x00000A17, 0x000500C7, 0x0000000C, 0x000018BA, 0x00003746,\n    0x00000A0E, 0x000500C4, 0x0000000C, 0x00005480, 0x000018BA, 0x00000A1A,\n    0x000500C5, 0x0000000C, 0x000045A9, 0x00003C71, 0x00005480, 0x000500C3,\n    0x0000000C, 0x00003A6F, 0x00005E63, 0x00000A1A, 0x000500C7, 0x0000000C,\n    0x000018BB, 0x00003A6F, 0x00000A20, 0x000500C4, 0x0000000C, 0x00005481,\n    0x000018BB, 0x00000A23, 0x000500C5, 0x0000000C, 0x00004570, 0x000045A9,\n    0x00005481, 0x000500C3, 0x0000000C, 0x00003C89, 0x00005E63, 0x00000A23,\n    0x000500C4, 0x0000000C, 0x00002825, 0x00003C89, 0x00000A2F, 0x000500C5,\n    0x0000000C, 0x00003B7A, 0x00004570, 0x00002825, 0x0004007C, 0x0000000B,\n    0x000041E6, 0x00003B7A, 0x000200F9, 0x00004F78, 0x000200F8, 0x00004F78,\n    0x000700F5, 0x0000000B, 0x00004799, 0x000041E5, 0x00005BE0, 0x000041E6,\n    0x00002DD9, 0x00050051, 0x0000000B, 0x00003B60, 0x00001997, 0x00000000,\n    0x00050084, 0x0000000B, 0x00004451, 0x00003B60, 0x00002A78, 0x00050084,\n    0x0000000B, 0x00001C91, 0x00004799, 0x00004451, 0x00050080, 0x0000000B,\n    0x0000226F, 0x00001C91, 0x000044F0, 0x00050080, 0x0000000B, 0x000053DE,\n    0x0000226F, 0x00005EAC, 0x000500C2, 0x0000000B, 0x00003948, 0x000053DE,\n    0x00000A17, 0x00060041, 0x00000294, 0x00004FAF, 0x0000107A, 0x00000A0B,\n    0x00003948, 0x0004003D, 0x00000017, 0x00001CAA, 0x00004FAF, 0x000500AA,\n    0x00000009, 0x000035C0, 0x0000619E, 0x00000A0D, 0x000500AA, 0x00000009,\n    0x00005376, 0x0000619E, 0x00000A10, 0x000500A6, 0x00000009, 0x00005686,\n    0x000035C0, 0x00005376, 0x000300F7, 0x00003463, 0x00000000, 0x000400FA,\n    0x00005686, 0x00002957, 0x00003463, 0x000200F8, 0x00002957, 0x000500C7,\n    0x00000017, 0x0000475F, 0x00001CAA, 0x000009CE, 0x000500C4, 0x00000017,\n    0x000024D1, 0x0000475F, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AC,\n    0x00001CAA, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448D, 0x000050AC,\n    0x0000013D, 0x000500C5, 0x00000017, 0x00003FF8, 0x000024D1, 0x0000448D,\n    0x000200F9, 0x00003463, 0x000200F8, 0x00003463, 0x000700F5, 0x00000017,\n    0x00005879, 0x00001CAA, 0x00004F78, 0x00003FF8, 0x00002957, 0x000500AA,\n    0x00000009, 0x00004CB6, 0x0000619E, 0x00000A13, 0x000500A6, 0x00000009,\n    0x00003B23, 0x00005376, 0x00004CB6, 0x000300F7, 0x0000362B, 0x00000000,\n    0x000400FA, 0x00003B23, 0x00002B38, 0x0000362B, 0x000200F8, 0x00002B38,\n    0x000500C4, 0x00000017, 0x00005E17, 0x00005879, 0x000002ED, 0x000500C2,\n    0x00000017, 0x00003BE7, 0x00005879, 0x000002ED, 0x000500C5, 0x00000017,\n    0x000029E8, 0x00005E17, 0x00003BE7, 0x000200F9, 0x0000362B, 0x000200F8,\n    0x0000362B, 0x000700F5, 0x00000017, 0x00004523, 0x00005879, 0x00003463,\n    0x000029E8, 0x00002B38, 0x000500C2, 0x0000000B, 0x00004E2D, 0x00001F01,\n    0x00000A17, 0x0004007C, 0x0000001A, 0x00005C4A, 0x00004523, 0x000500C4,\n    0x0000001A, 0x00002C1C, 0x00005C4A, 0x00000302, 0x000500C3, 0x0000001A,\n    0x00004098, 0x00002C1C, 0x00000302, 0x0004006F, 0x0000001D, 0x00002A97,\n    0x00004098, 0x0005008E, 0x0000001D, 0x00004FBD, 0x00002A97, 0x00000A38,\n    0x0007000C, 0x0000001D, 0x00005DB5, 0x00000001, 0x00000028, 0x00000504,\n    0x00004FBD, 0x000500C3, 0x0000001A, 0x00003802, 0x00005C4A, 0x00000302,\n    0x0004006F, 0x0000001D, 0x000019CF, 0x00003802, 0x0005008E, 0x0000001D,\n    0x00004747, 0x000019CF, 0x00000A38, 0x0007000C, 0x0000001D, 0x00005E06,\n    0x00000001, 0x00000028, 0x00000504, 0x00004747, 0x00050051, 0x0000000D,\n    0x00005F0A, 0x00005DB5, 0x00000000, 0x00050051, 0x0000000D, 0x000037EF,\n    0x00005E06, 0x00000000, 0x00050050, 0x00000013, 0x00004B20, 0x00005F0A,\n    0x000037EF, 0x0006000C, 0x0000000B, 0x00002171, 0x00000001, 0x0000003A,\n    0x00004B20, 0x00050051, 0x0000000D, 0x00005BBF, 0x00005DB5, 0x00000001,\n    0x00050051, 0x0000000D, 0x000039A7, 0x00005E06, 0x00000001, 0x00050050,\n    0x00000013, 0x00004B21, 0x00005BBF, 0x000039A7, 0x0006000C, 0x0000000B,\n    0x00002172, 0x00000001, 0x0000003A, 0x00004B21, 0x00050051, 0x0000000D,\n    0x00005BC0, 0x00005DB5, 0x00000002, 0x00050051, 0x0000000D, 0x000039A8,\n    0x00005E06, 0x00000002, 0x00050050, 0x00000013, 0x00004B22, 0x00005BC0,\n    0x000039A8, 0x0006000C, 0x0000000B, 0x00002173, 0x00000001, 0x0000003A,\n    0x00004B22, 0x00050051, 0x0000000D, 0x00005BC1, 0x00005DB5, 0x00000003,\n    0x00050051, 0x0000000D, 0x000039A9, 0x00005E06, 0x00000003, 0x00050050,\n    0x00000013, 0x00004B0D, 0x00005BC1, 0x000039A9, 0x0006000C, 0x0000000B,\n    0x000020EE, 0x00000001, 0x0000003A, 0x00004B0D, 0x00070050, 0x00000017,\n    0x00003ABB, 0x00002171, 0x00002172, 0x00002173, 0x000020EE, 0x00060041,\n    0x00000294, 0x000045C3, 0x0000140E, 0x00000A0B, 0x00004E2D, 0x0003003E,\n    0x000045C3, 0x00003ABB, 0x00050080, 0x0000000B, 0x00005679, 0x00001F01,\n    0x00000A3A, 0x00050080, 0x0000000B, 0x000027E6, 0x000053DE, 0x00000A3A,\n    0x000500C2, 0x0000000B, 0x00003949, 0x000027E6, 0x00000A17, 0x00060041,\n    0x00000294, 0x00005566, 0x0000107A, 0x00000A0B, 0x00003949, 0x0004003D,\n    0x00000017, 0x00003910, 0x00005566, 0x000300F7, 0x00003A1A, 0x00000000,\n    0x000400FA, 0x00005686, 0x00002958, 0x00003A1A, 0x000200F8, 0x00002958,\n    0x000500C7, 0x00000017, 0x00004760, 0x00003910, 0x000009CE, 0x000500C4,\n    0x00000017, 0x000024D2, 0x00004760, 0x0000013D, 0x000500C7, 0x00000017,\n    0x000050AD, 0x00003910, 0x0000072E, 0x000500C2, 0x00000017, 0x0000448E,\n    0x000050AD, 0x0000013D, 0x000500C5, 0x00000017, 0x00003FF9, 0x000024D2,\n    0x0000448E, 0x000200F9, 0x00003A1A, 0x000200F8, 0x00003A1A, 0x000700F5,\n    0x00000017, 0x00002AAC, 0x00003910, 0x0000362B, 0x00003FF9, 0x00002958,\n    0x000300F7, 0x0000362C, 0x00000000, 0x000400FA, 0x00003B23, 0x00002B39,\n    0x0000362C, 0x000200F8, 0x00002B39, 0x000500C4, 0x00000017, 0x00005E18,\n    0x00002AAC, 0x000002ED, 0x000500C2, 0x00000017, 0x00003BE8, 0x00002AAC,\n    0x000002ED, 0x000500C5, 0x00000017, 0x000029E9, 0x00005E18, 0x00003BE8,\n    0x000200F9, 0x0000362C, 0x000200F8, 0x0000362C, 0x000700F5, 0x00000017,\n    0x00004524, 0x00002AAC, 0x00003A1A, 0x000029E9, 0x00002B39, 0x000500C2,\n    0x0000000B, 0x00004E2E, 0x00005679, 0x00000A17, 0x0004007C, 0x0000001A,\n    0x00005C4B, 0x00004524, 0x000500C4, 0x0000001A, 0x00002C1D, 0x00005C4B,\n    0x00000302, 0x000500C3, 0x0000001A, 0x00004099, 0x00002C1D, 0x00000302,\n    0x0004006F, 0x0000001D, 0x00002A98, 0x00004099, 0x0005008E, 0x0000001D,\n    0x00004FBE, 0x00002A98, 0x00000A38, 0x0007000C, 0x0000001D, 0x00005DB6,\n    0x00000001, 0x00000028, 0x00000504, 0x00004FBE, 0x000500C3, 0x0000001A,\n    0x00003803, 0x00005C4B, 0x00000302, 0x0004006F, 0x0000001D, 0x000019D0,\n    0x00003803, 0x0005008E, 0x0000001D, 0x00004748, 0x000019D0, 0x00000A38,\n    0x0007000C, 0x0000001D, 0x00005E07, 0x00000001, 0x00000028, 0x00000504,\n    0x00004748, 0x00050051, 0x0000000D, 0x00005F0B, 0x00005DB6, 0x00000000,\n    0x00050051, 0x0000000D, 0x000037F0, 0x00005E07, 0x00000000, 0x00050050,\n    0x00000013, 0x00004B23, 0x00005F0B, 0x000037F0, 0x0006000C, 0x0000000B,\n    0x00002174, 0x00000001, 0x0000003A, 0x00004B23, 0x00050051, 0x0000000D,\n    0x00005BC2, 0x00005DB6, 0x00000001, 0x00050051, 0x0000000D, 0x000039AA,\n    0x00005E07, 0x00000001, 0x00050050, 0x00000013, 0x00004B24, 0x00005BC2,\n    0x000039AA, 0x0006000C, 0x0000000B, 0x00002175, 0x00000001, 0x0000003A,\n    0x00004B24, 0x00050051, 0x0000000D, 0x00005BC3, 0x00005DB6, 0x00000002,\n    0x00050051, 0x0000000D, 0x000039AB, 0x00005E07, 0x00000002, 0x00050050,\n    0x00000013, 0x00004B25, 0x00005BC3, 0x000039AB, 0x0006000C, 0x0000000B,\n    0x00002176, 0x00000001, 0x0000003A, 0x00004B25, 0x00050051, 0x0000000D,\n    0x00005BC4, 0x00005DB6, 0x00000003, 0x00050051, 0x0000000D, 0x000039AC,\n    0x00005E07, 0x00000003, 0x00050050, 0x00000013, 0x00004B0E, 0x00005BC4,\n    0x000039AC, 0x0006000C, 0x0000000B, 0x000020EF, 0x00000001, 0x0000003A,\n    0x00004B0E, 0x00070050, 0x00000017, 0x00003ABC, 0x00002174, 0x00002175,\n    0x00002176, 0x000020EF, 0x00060041, 0x00000294, 0x00004EBE, 0x0000140E,\n    0x00000A0B, 0x00004E2E, 0x0003003E, 0x00004EBE, 0x00003ABC, 0x000200F9,\n    0x00004C7A, 0x000200F8, 0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_rgba16_unorm_float_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25155\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v4uint = OpTypeVector %uint 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v2uint = OpTypeVector %uint 2\n     %v3uint = OpTypeVector %uint 3\n      %float = OpTypeFloat 32\n    %v4float = OpTypeVector %float 4\n %uint_65535 = OpConstant %uint 65535\n%float_1_52590219en05 = OpConstant %float 1.52590219e-05\n    %uint_16 = OpConstant %uint 16\n     %uint_0 = OpConstant %uint 0\n    %v2float = OpTypeVector %float 2\n     %uint_1 = OpConstant %uint 1\n     %uint_2 = OpConstant %uint 2\n     %uint_3 = OpConstant %uint 3\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n      %int_3 = OpConstant %int 3\n      %int_2 = OpConstant %int 2\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %2596 = OpConstantComposite %v3uint %uint_2 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n     %uint_4 = OpConstant %uint 4\n    %uint_32 = OpConstant %uint 32\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n        %850 = OpConstantComposite %v4uint %uint_65535 %uint_65535 %uint_65535 %uint_65535\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24540 = OpBitwiseAnd %uint %13606 %uint_1\n      %17270 = OpINotEqual %bool %24540 %uint_0\n      %12328 = OpBitwiseAnd %uint %13606 %uint_2\n      %17284 = OpINotEqual %bool %12328 %uint_0\n       %7856 = OpShiftRightLogical %uint %13606 %uint_2\n      %25058 = OpBitwiseAnd %uint %7856 %uint_3\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2596\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %6586 DontFlatten\n               OpBranchConditional %24679 %21992 %6586\n      %21992 = OpLabel\n               OpBranch %19578\n       %6586 = OpLabel\n      %23478 = OpBitcast %v3int %21387\n      %18710 = OpCompositeExtract %uint %22410 1\n      %23531 = OpCompositeExtract %int %23478 0\n      %22810 = OpIMul %int %23531 %int_8\n       %6362 = OpCompositeExtract %int %23478 2\n      %14505 = OpBitcast %int %18710\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %23478 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %6594\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %22810 %24535\n      %10404 = OpBitcast %uint %8258\n      %14582 = OpIAdd %uint %22411 %10404\n      %12308 = OpLogicalNot %bool %17270\n               OpSelectionMerge %19040 DontFlatten\n               OpBranchConditional %12308 %9741 %17007\n       %9741 = OpLabel\n      %17463 = OpCompositeExtract %uint %21387 0\n      %11246 = OpCompositeExtract %uint %21387 1\n      %18801 = OpCompositeExtract %uint %21387 2\n      %14831 = OpIMul %uint %22409 %18801\n      %20322 = OpIAdd %uint %11246 %14831\n      %21676 = OpIMul %uint %22408 %20322\n      %20398 = OpIAdd %uint %17463 %21676\n      %11367 = OpShiftLeftLogical %uint %20398 %uint_3\n               OpBranch %19040\n      %17007 = OpLabel\n               OpSelectionMerge %23536 DontFlatten\n               OpBranchConditional %17284 %11410 %24353\n      %11410 = OpLabel\n      %21364 = OpShiftRightLogical %uint %22408 %int_5\n      %13804 = OpShiftRightLogical %uint %22409 %int_4\n      %13237 = OpShiftRightArithmetic %int %6362 %int_2\n      %22374 = OpBitcast %int %13804\n      %25085 = OpIMul %int %13237 %22374\n      %11618 = OpShiftRightArithmetic %int %17598 %int_4\n      %16670 = OpIAdd %int %25085 %11618\n      %19064 = OpBitcast %int %21364\n      %13020 = OpIMul %int %16670 %19064\n      %12986 = OpShiftRightArithmetic %int %23531 %int_5\n      %24558 = OpIAdd %int %13020 %12986\n       %8797 = OpShiftLeftLogical %int %24558 %int_7\n      %11434 = OpBitwiseAnd %int %6362 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %17598 %int_1\n      %21365 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21365 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %23531 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17334 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17334 %uint_3\n      %13015 = OpShiftRightArithmetic %int %17598 %int_3\n       %9929 = OpBitwiseXor %int %13015 %13237\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %23531 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %17598 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6551 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6551\n       %7168 = OpShiftLeftLogical %int %16793 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24144 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24144 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24144 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24144 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %23536\n      %24353 = OpLabel\n      %23000 = OpBitcast %v2int %17136\n      %22120 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %23000 1\n      %12089 = OpShiftRightArithmetic %int %14597 %int_5\n      %22400 = OpBitcast %int %22120\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %23000 0\n      %20423 = OpShiftRightArithmetic %int %25154 %int_5\n      %18864 = OpIAdd %int %7938 %20423\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25154 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17335 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17335 %uint_3\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25154 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6552 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6552\n       %7169 = OpShiftLeftLogical %int %21575 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24163 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24163 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24163 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %23536\n      %23536 = OpLabel\n      %10540 = OpPhi %uint %16869 %11410 %16870 %24353\n               OpBranch %19040\n      %19040 = OpLabel\n      %11376 = OpPhi %uint %11367 %9741 %10540 %23536\n      %18621 = OpIAdd %uint %11376 %24236\n      %15698 = OpShiftRightLogical %uint %18621 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15698\n       %7338 = OpLoad %v4uint %20399\n      %13760 = OpIEqual %bool %25058 %uint_1\n      %21366 = OpIEqual %bool %25058 %uint_2\n      %22150 = OpLogicalOr %bool %13760 %21366\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %7338 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %7338 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22649 = OpPhi %v4uint %7338 %19040 %16376 %10583\n      %19638 = OpIEqual %bool %25058 %uint_3\n      %15139 = OpLogicalOr %bool %21366 %19638\n               OpSelectionMerge %13867 None\n               OpBranchConditional %15139 %11064 %13867\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22649 %749\n      %15335 = OpShiftRightLogical %v4uint %22649 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %13867\n      %13867 = OpLabel\n      %19124 = OpPhi %v4uint %22649 %13411 %10728 %11064\n      %24513 = OpShiftRightLogical %uint %14582 %int_4\n       %7420 = OpBitwiseAnd %v4uint %19124 %850\n      %16133 = OpConvertUToF %v4float %7420\n      %19365 = OpVectorTimesScalar %v4float %16133 %float_1_52590219en05\n      %23367 = OpShiftRightLogical %v4uint %19124 %749\n      %18492 = OpConvertUToF %v4float %23367\n      %18450 = OpVectorTimesScalar %v4float %18492 %float_1_52590219en05\n       %6268 = OpCompositeExtract %float %19365 0\n      %13806 = OpCompositeExtract %float %18450 0\n      %19232 = OpCompositeConstruct %v2float %6268 %13806\n       %8561 = OpExtInst %uint %1 PackHalf2x16 %19232\n      %23487 = OpCompositeExtract %float %19365 1\n      %14759 = OpCompositeExtract %float %18450 1\n      %19233 = OpCompositeConstruct %v2float %23487 %14759\n       %8562 = OpExtInst %uint %1 PackHalf2x16 %19233\n      %23488 = OpCompositeExtract %float %19365 2\n      %14760 = OpCompositeExtract %float %18450 2\n      %19234 = OpCompositeConstruct %v2float %23488 %14760\n       %8563 = OpExtInst %uint %1 PackHalf2x16 %19234\n      %23489 = OpCompositeExtract %float %19365 3\n      %14761 = OpCompositeExtract %float %18450 3\n      %19213 = OpCompositeConstruct %v2float %23489 %14761\n       %8430 = OpExtInst %uint %1 PackHalf2x16 %19213\n      %15035 = OpCompositeConstruct %v4uint %8561 %8562 %8563 %8430\n      %17859 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %24513\n               OpStore %17859 %15035\n      %21685 = OpIAdd %uint %14582 %uint_16\n               OpSelectionMerge %24688 DontFlatten\n               OpBranchConditional %17270 %21993 %7205\n      %21993 = OpLabel\n               OpBranch %24688\n       %7205 = OpLabel\n               OpBranch %24688\n      %24688 = OpLabel\n      %11377 = OpPhi %uint %uint_32 %21993 %uint_16 %7205\n      %18622 = OpIAdd %uint %18621 %11377\n      %15699 = OpShiftRightLogical %uint %18622 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %15699\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %14874 None\n               OpBranchConditional %22150 %10584 %14874\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %14874\n      %14874 = OpLabel\n      %10924 = OpPhi %v4uint %14608 %24688 %16377 %10584\n               OpSelectionMerge %13868 None\n               OpBranchConditional %15139 %11065 %13868\n      %11065 = OpLabel\n      %24088 = OpShiftLeftLogical %v4uint %10924 %749\n      %15336 = OpShiftRightLogical %v4uint %10924 %749\n      %10729 = OpBitwiseOr %v4uint %24088 %15336\n               OpBranch %13868\n      %13868 = OpLabel\n      %19125 = OpPhi %v4uint %10924 %14874 %10729 %11065\n      %24514 = OpShiftRightLogical %uint %21685 %int_4\n       %7421 = OpBitwiseAnd %v4uint %19125 %850\n      %16134 = OpConvertUToF %v4float %7421\n      %19366 = OpVectorTimesScalar %v4float %16134 %float_1_52590219en05\n      %23368 = OpShiftRightLogical %v4uint %19125 %749\n      %18493 = OpConvertUToF %v4float %23368\n      %18451 = OpVectorTimesScalar %v4float %18493 %float_1_52590219en05\n       %6269 = OpCompositeExtract %float %19366 0\n      %13807 = OpCompositeExtract %float %18451 0\n      %19235 = OpCompositeConstruct %v2float %6269 %13807\n       %8564 = OpExtInst %uint %1 PackHalf2x16 %19235\n      %23490 = OpCompositeExtract %float %19366 1\n      %14762 = OpCompositeExtract %float %18451 1\n      %19236 = OpCompositeConstruct %v2float %23490 %14762\n       %8565 = OpExtInst %uint %1 PackHalf2x16 %19236\n      %23491 = OpCompositeExtract %float %19366 2\n      %14763 = OpCompositeExtract %float %18451 2\n      %19237 = OpCompositeConstruct %v2float %23491 %14763\n       %8566 = OpExtInst %uint %1 PackHalf2x16 %19237\n      %23492 = OpCompositeExtract %float %19366 3\n      %14764 = OpCompositeExtract %float %18451 3\n      %19214 = OpCompositeConstruct %v2float %23492 %14764\n       %8431 = OpExtInst %uint %1 PackHalf2x16 %19214\n      %15036 = OpCompositeConstruct %v4uint %8564 %8565 %8566 %8431\n      %20158 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %24514\n               OpStore %20158 %15036\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_rgba16_unorm_float_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006243, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000017, 0x0000000B, 0x00000004, 0x00040015, 0x0000000C,\n    0x00000020, 0x00000001, 0x00040017, 0x00000012, 0x0000000C, 0x00000002,\n    0x00040017, 0x00000016, 0x0000000C, 0x00000003, 0x00020014, 0x00000009,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x00030016, 0x0000000D, 0x00000020, 0x00040017,\n    0x0000001D, 0x0000000D, 0x00000004, 0x0004002B, 0x0000000B, 0x000001C1,\n    0x0000FFFF, 0x0004002B, 0x0000000D, 0x0000092A, 0x37800080, 0x0004002B,\n    0x0000000B, 0x00000A3A, 0x00000010, 0x0004002B, 0x0000000B, 0x00000A0A,\n    0x00000000, 0x00040017, 0x00000013, 0x0000000D, 0x00000002, 0x0004002B,\n    0x0000000B, 0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B, 0x00000A10,\n    0x00000002, 0x0004002B, 0x0000000B, 0x00000A13, 0x00000003, 0x0004002B,\n    0x0000000B, 0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B, 0x00000A22,\n    0x00000008, 0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00, 0x0004002B,\n    0x0000000C, 0x00000A17, 0x00000004, 0x0004002B, 0x0000000C, 0x00000A1D,\n    0x00000006, 0x0004002B, 0x0000000C, 0x00000A2C, 0x0000000B, 0x0004002B,\n    0x0000000C, 0x00000A38, 0x0000000F, 0x0004002B, 0x0000000C, 0x00000A0E,\n    0x00000001, 0x0004002B, 0x0000000C, 0x00000A1A, 0x00000005, 0x0004002B,\n    0x0000000C, 0x00000A20, 0x00000007, 0x0004002B, 0x0000000C, 0x00000A23,\n    0x00000008, 0x0004002B, 0x0000000C, 0x00000A2F, 0x0000000C, 0x0004002B,\n    0x0000000C, 0x00000A14, 0x00000003, 0x0004002B, 0x0000000C, 0x00000A11,\n    0x00000002, 0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000, 0x000A001E,\n    0x00000489, 0x0000000B, 0x0000000B, 0x0000000B, 0x0000000B, 0x00000014,\n    0x0000000B, 0x0000000B, 0x0000000B, 0x00040020, 0x00000706, 0x00000009,\n    0x00000489, 0x0004003B, 0x00000706, 0x00000CE9, 0x00000009, 0x00040020,\n    0x00000288, 0x00000009, 0x0000000B, 0x00040020, 0x00000291, 0x00000009,\n    0x00000014, 0x00040020, 0x00000292, 0x00000001, 0x00000014, 0x0004003B,\n    0x00000292, 0x00000F48, 0x00000001, 0x0006002C, 0x00000014, 0x00000A24,\n    0x00000A10, 0x00000A0A, 0x00000A0A, 0x00040017, 0x0000000F, 0x00000009,\n    0x00000002, 0x0003001D, 0x000007DC, 0x00000017, 0x0003001E, 0x000007B4,\n    0x000007DC, 0x00040020, 0x00000A31, 0x00000002, 0x000007B4, 0x0004003B,\n    0x00000A31, 0x0000107A, 0x00000002, 0x00040020, 0x00000294, 0x00000002,\n    0x00000017, 0x0003001D, 0x000007DD, 0x00000017, 0x0003001E, 0x000007B5,\n    0x000007DD, 0x00040020, 0x00000A32, 0x00000002, 0x000007B5, 0x0004003B,\n    0x00000A32, 0x0000140E, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A16,\n    0x00000004, 0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020, 0x0006002C,\n    0x00000014, 0x00000BC3, 0x00000A16, 0x00000A6A, 0x00000A0D, 0x0007002C,\n    0x00000017, 0x000009CE, 0x000008A6, 0x000008A6, 0x000008A6, 0x000008A6,\n    0x0007002C, 0x00000017, 0x0000013D, 0x00000A22, 0x00000A22, 0x00000A22,\n    0x00000A22, 0x0007002C, 0x00000017, 0x0000072E, 0x000005FD, 0x000005FD,\n    0x000005FD, 0x000005FD, 0x0007002C, 0x00000017, 0x000002ED, 0x00000A3A,\n    0x00000A3A, 0x00000A3A, 0x00000A3A, 0x0007002C, 0x00000017, 0x00000352,\n    0x000001C1, 0x000001C1, 0x000001C1, 0x000001C1, 0x00050036, 0x00000008,\n    0x0000161F, 0x00000000, 0x00000502, 0x000200F8, 0x00003B06, 0x000300F7,\n    0x00004C7A, 0x00000000, 0x000300FB, 0x00000A0A, 0x00002E68, 0x000200F8,\n    0x00002E68, 0x00050041, 0x00000288, 0x000060D7, 0x00000CE9, 0x00000A0B,\n    0x0004003D, 0x0000000B, 0x00003526, 0x000060D7, 0x000500C7, 0x0000000B,\n    0x00005FDC, 0x00003526, 0x00000A0D, 0x000500AB, 0x00000009, 0x00004376,\n    0x00005FDC, 0x00000A0A, 0x000500C7, 0x0000000B, 0x00003028, 0x00003526,\n    0x00000A10, 0x000500AB, 0x00000009, 0x00004384, 0x00003028, 0x00000A0A,\n    0x000500C2, 0x0000000B, 0x00001EB0, 0x00003526, 0x00000A10, 0x000500C7,\n    0x0000000B, 0x000061E2, 0x00001EB0, 0x00000A13, 0x00050041, 0x00000288,\n    0x0000492C, 0x00000CE9, 0x00000A0E, 0x0004003D, 0x0000000B, 0x00005EAC,\n    0x0000492C, 0x00050041, 0x00000288, 0x00004EBA, 0x00000CE9, 0x00000A11,\n    0x0004003D, 0x0000000B, 0x00005788, 0x00004EBA, 0x00050041, 0x00000288,\n    0x00004EBB, 0x00000CE9, 0x00000A14, 0x0004003D, 0x0000000B, 0x00005789,\n    0x00004EBB, 0x00050041, 0x00000291, 0x00004EBC, 0x00000CE9, 0x00000A17,\n    0x0004003D, 0x00000014, 0x0000578A, 0x00004EBC, 0x00050041, 0x00000288,\n    0x00004EBD, 0x00000CE9, 0x00000A1A, 0x0004003D, 0x0000000B, 0x0000578B,\n    0x00004EBD, 0x00050041, 0x00000288, 0x00004E6E, 0x00000CE9, 0x00000A1D,\n    0x0004003D, 0x0000000B, 0x000019C2, 0x00004E6E, 0x0004003D, 0x00000014,\n    0x00002A0E, 0x00000F48, 0x000500C4, 0x00000014, 0x0000538B, 0x00002A0E,\n    0x00000A24, 0x0007004F, 0x00000011, 0x000042F0, 0x0000538B, 0x0000538B,\n    0x00000000, 0x00000001, 0x0007004F, 0x00000011, 0x0000242F, 0x0000578A,\n    0x0000578A, 0x00000000, 0x00000001, 0x000500AE, 0x0000000F, 0x00004288,\n    0x000042F0, 0x0000242F, 0x0004009A, 0x00000009, 0x00006067, 0x00004288,\n    0x000300F7, 0x000019BA, 0x00000002, 0x000400FA, 0x00006067, 0x000055E8,\n    0x000019BA, 0x000200F8, 0x000055E8, 0x000200F9, 0x00004C7A, 0x000200F8,\n    0x000019BA, 0x0004007C, 0x00000016, 0x00005BB6, 0x0000538B, 0x00050051,\n    0x0000000B, 0x00004916, 0x0000578A, 0x00000001, 0x00050051, 0x0000000C,\n    0x00005BEB, 0x00005BB6, 0x00000000, 0x00050084, 0x0000000C, 0x0000591A,\n    0x00005BEB, 0x00000A23, 0x00050051, 0x0000000C, 0x000018DA, 0x00005BB6,\n    0x00000002, 0x0004007C, 0x0000000C, 0x000038A9, 0x00004916, 0x00050084,\n    0x0000000C, 0x00002C0F, 0x000018DA, 0x000038A9, 0x00050051, 0x0000000C,\n    0x000044BE, 0x00005BB6, 0x00000001, 0x00050080, 0x0000000C, 0x000056D4,\n    0x00002C0F, 0x000044BE, 0x0004007C, 0x0000000C, 0x00005785, 0x000019C2,\n    0x00050084, 0x0000000C, 0x00005FD7, 0x000056D4, 0x00005785, 0x00050080,\n    0x0000000C, 0x00002042, 0x0000591A, 0x00005FD7, 0x0004007C, 0x0000000B,\n    0x000028A4, 0x00002042, 0x00050080, 0x0000000B, 0x000038F6, 0x0000578B,\n    0x000028A4, 0x000400A8, 0x00000009, 0x00003014, 0x00004376, 0x000300F7,\n    0x00004A60, 0x00000002, 0x000400FA, 0x00003014, 0x0000260D, 0x0000426F,\n    0x000200F8, 0x0000260D, 0x00050051, 0x0000000B, 0x00004437, 0x0000538B,\n    0x00000000, 0x00050051, 0x0000000B, 0x00002BEE, 0x0000538B, 0x00000001,\n    0x00050051, 0x0000000B, 0x00004971, 0x0000538B, 0x00000002, 0x00050084,\n    0x0000000B, 0x000039EF, 0x00005789, 0x00004971, 0x00050080, 0x0000000B,\n    0x00004F62, 0x00002BEE, 0x000039EF, 0x00050084, 0x0000000B, 0x000054AC,\n    0x00005788, 0x00004F62, 0x00050080, 0x0000000B, 0x00004FAE, 0x00004437,\n    0x000054AC, 0x000500C4, 0x0000000B, 0x00002C67, 0x00004FAE, 0x00000A13,\n    0x000200F9, 0x00004A60, 0x000200F8, 0x0000426F, 0x000300F7, 0x00005BF0,\n    0x00000002, 0x000400FA, 0x00004384, 0x00002C92, 0x00005F21, 0x000200F8,\n    0x00002C92, 0x000500C2, 0x0000000B, 0x00005374, 0x00005788, 0x00000A1A,\n    0x000500C2, 0x0000000B, 0x000035EC, 0x00005789, 0x00000A17, 0x000500C3,\n    0x0000000C, 0x000033B5, 0x000018DA, 0x00000A11, 0x0004007C, 0x0000000C,\n    0x00005766, 0x000035EC, 0x00050084, 0x0000000C, 0x000061FD, 0x000033B5,\n    0x00005766, 0x000500C3, 0x0000000C, 0x00002D62, 0x000044BE, 0x00000A17,\n    0x00050080, 0x0000000C, 0x0000411E, 0x000061FD, 0x00002D62, 0x0004007C,\n    0x0000000C, 0x00004A78, 0x00005374, 0x00050084, 0x0000000C, 0x000032DC,\n    0x0000411E, 0x00004A78, 0x000500C3, 0x0000000C, 0x000032BA, 0x00005BEB,\n    0x00000A1A, 0x00050080, 0x0000000C, 0x00005FEE, 0x000032DC, 0x000032BA,\n    0x000500C4, 0x0000000C, 0x0000225D, 0x00005FEE, 0x00000A20, 0x000500C7,\n    0x0000000C, 0x00002CAA, 0x000018DA, 0x00000A14, 0x000500C4, 0x0000000C,\n    0x00004CAE, 0x00002CAA, 0x00000A1A, 0x000500C3, 0x0000000C, 0x0000383E,\n    0x000044BE, 0x00000A0E, 0x000500C7, 0x0000000C, 0x00005375, 0x0000383E,\n    0x00000A14, 0x000500C4, 0x0000000C, 0x000054CA, 0x00005375, 0x00000A14,\n    0x000500C5, 0x0000000C, 0x000042CE, 0x00004CAE, 0x000054CA, 0x000500C7,\n    0x0000000C, 0x000050D5, 0x00005BEB, 0x00000A20, 0x000500C5, 0x0000000C,\n    0x00003ADD, 0x000042CE, 0x000050D5, 0x000500C5, 0x0000000C, 0x000043B6,\n    0x0000225D, 0x00003ADD, 0x000500C4, 0x0000000C, 0x00005E50, 0x000043B6,\n    0x00000A13, 0x000500C3, 0x0000000C, 0x000032D7, 0x000044BE, 0x00000A14,\n    0x000500C6, 0x0000000C, 0x000026C9, 0x000032D7, 0x000033B5, 0x000500C7,\n    0x0000000C, 0x00004199, 0x000026C9, 0x00000A0E, 0x000500C3, 0x0000000C,\n    0x00002590, 0x00005BEB, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000505E,\n    0x00002590, 0x00000A14, 0x000500C4, 0x0000000C, 0x0000541D, 0x00004199,\n    0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BA, 0x0000505E, 0x0000541D,\n    0x000500C7, 0x0000000C, 0x00005076, 0x000044BE, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x00005228, 0x00005076, 0x00000A17, 0x000500C4, 0x0000000C,\n    0x00001997, 0x000022BA, 0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FE,\n    0x00005228, 0x00001997, 0x000500C4, 0x0000000C, 0x00001C00, 0x00004199,\n    0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C81, 0x000047FE, 0x00001C00,\n    0x000500C7, 0x0000000C, 0x000050AF, 0x00005E50, 0x00000A38, 0x000500C5,\n    0x0000000C, 0x00003C70, 0x00003C81, 0x000050AF, 0x000500C3, 0x0000000C,\n    0x00003745, 0x00005E50, 0x00000A17, 0x000500C7, 0x0000000C, 0x000018B8,\n    0x00003745, 0x00000A0E, 0x000500C4, 0x0000000C, 0x0000547E, 0x000018B8,\n    0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A8, 0x00003C70, 0x0000547E,\n    0x000500C3, 0x0000000C, 0x00003A6E, 0x00005E50, 0x00000A1A, 0x000500C7,\n    0x0000000C, 0x000018B9, 0x00003A6E, 0x00000A20, 0x000500C4, 0x0000000C,\n    0x0000547F, 0x000018B9, 0x00000A23, 0x000500C5, 0x0000000C, 0x0000456F,\n    0x000045A8, 0x0000547F, 0x000500C3, 0x0000000C, 0x00003C88, 0x00005E50,\n    0x00000A23, 0x000500C4, 0x0000000C, 0x00002824, 0x00003C88, 0x00000A2F,\n    0x000500C5, 0x0000000C, 0x00003B79, 0x0000456F, 0x00002824, 0x0004007C,\n    0x0000000B, 0x000041E5, 0x00003B79, 0x000200F9, 0x00005BF0, 0x000200F8,\n    0x00005F21, 0x0004007C, 0x00000012, 0x000059D8, 0x000042F0, 0x000500C2,\n    0x0000000B, 0x00005668, 0x00005788, 0x00000A1A, 0x00050051, 0x0000000C,\n    0x00003905, 0x000059D8, 0x00000001, 0x000500C3, 0x0000000C, 0x00002F39,\n    0x00003905, 0x00000A1A, 0x0004007C, 0x0000000C, 0x00005780, 0x00005668,\n    0x00050084, 0x0000000C, 0x00001F02, 0x00002F39, 0x00005780, 0x00050051,\n    0x0000000C, 0x00006242, 0x000059D8, 0x00000000, 0x000500C3, 0x0000000C,\n    0x00004FC7, 0x00006242, 0x00000A1A, 0x00050080, 0x0000000C, 0x000049B0,\n    0x00001F02, 0x00004FC7, 0x000500C4, 0x0000000C, 0x0000254A, 0x000049B0,\n    0x00000A1D, 0x000500C3, 0x0000000C, 0x0000603B, 0x00003905, 0x00000A0E,\n    0x000500C7, 0x0000000C, 0x0000539A, 0x0000603B, 0x00000A20, 0x000500C4,\n    0x0000000C, 0x0000534A, 0x0000539A, 0x00000A14, 0x000500C7, 0x0000000C,\n    0x00004EA5, 0x00006242, 0x00000A20, 0x000500C5, 0x0000000C, 0x00002B1A,\n    0x0000534A, 0x00004EA5, 0x000500C5, 0x0000000C, 0x000043B7, 0x0000254A,\n    0x00002B1A, 0x000500C4, 0x0000000C, 0x00005E63, 0x000043B7, 0x00000A13,\n    0x000500C3, 0x0000000C, 0x000031DE, 0x00003905, 0x00000A17, 0x000500C7,\n    0x0000000C, 0x00005447, 0x000031DE, 0x00000A0E, 0x000500C3, 0x0000000C,\n    0x000028A6, 0x00006242, 0x00000A14, 0x000500C7, 0x0000000C, 0x0000511E,\n    0x000028A6, 0x00000A14, 0x000500C3, 0x0000000C, 0x000028B9, 0x00003905,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x0000505F, 0x000028B9, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x0000541E, 0x0000505F, 0x00000A0E, 0x000500C6,\n    0x0000000C, 0x000022BB, 0x0000511E, 0x0000541E, 0x000500C7, 0x0000000C,\n    0x00005077, 0x00003905, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005229,\n    0x00005077, 0x00000A17, 0x000500C4, 0x0000000C, 0x00001998, 0x000022BB,\n    0x00000A1D, 0x000500C5, 0x0000000C, 0x000047FF, 0x00005229, 0x00001998,\n    0x000500C4, 0x0000000C, 0x00001C01, 0x00005447, 0x00000A2C, 0x000500C5,\n    0x0000000C, 0x00003C82, 0x000047FF, 0x00001C01, 0x000500C7, 0x0000000C,\n    0x000050B0, 0x00005E63, 0x00000A38, 0x000500C5, 0x0000000C, 0x00003C71,\n    0x00003C82, 0x000050B0, 0x000500C3, 0x0000000C, 0x00003746, 0x00005E63,\n    0x00000A17, 0x000500C7, 0x0000000C, 0x000018BA, 0x00003746, 0x00000A0E,\n    0x000500C4, 0x0000000C, 0x00005480, 0x000018BA, 0x00000A1A, 0x000500C5,\n    0x0000000C, 0x000045A9, 0x00003C71, 0x00005480, 0x000500C3, 0x0000000C,\n    0x00003A6F, 0x00005E63, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018BB,\n    0x00003A6F, 0x00000A20, 0x000500C4, 0x0000000C, 0x00005481, 0x000018BB,\n    0x00000A23, 0x000500C5, 0x0000000C, 0x00004570, 0x000045A9, 0x00005481,\n    0x000500C3, 0x0000000C, 0x00003C89, 0x00005E63, 0x00000A23, 0x000500C4,\n    0x0000000C, 0x00002825, 0x00003C89, 0x00000A2F, 0x000500C5, 0x0000000C,\n    0x00003B7A, 0x00004570, 0x00002825, 0x0004007C, 0x0000000B, 0x000041E6,\n    0x00003B7A, 0x000200F9, 0x00005BF0, 0x000200F8, 0x00005BF0, 0x000700F5,\n    0x0000000B, 0x0000292C, 0x000041E5, 0x00002C92, 0x000041E6, 0x00005F21,\n    0x000200F9, 0x00004A60, 0x000200F8, 0x00004A60, 0x000700F5, 0x0000000B,\n    0x00002C70, 0x00002C67, 0x0000260D, 0x0000292C, 0x00005BF0, 0x00050080,\n    0x0000000B, 0x000048BD, 0x00002C70, 0x00005EAC, 0x000500C2, 0x0000000B,\n    0x00003D52, 0x000048BD, 0x00000A17, 0x00060041, 0x00000294, 0x00004FAF,\n    0x0000107A, 0x00000A0B, 0x00003D52, 0x0004003D, 0x00000017, 0x00001CAA,\n    0x00004FAF, 0x000500AA, 0x00000009, 0x000035C0, 0x000061E2, 0x00000A0D,\n    0x000500AA, 0x00000009, 0x00005376, 0x000061E2, 0x00000A10, 0x000500A6,\n    0x00000009, 0x00005686, 0x000035C0, 0x00005376, 0x000300F7, 0x00003463,\n    0x00000000, 0x000400FA, 0x00005686, 0x00002957, 0x00003463, 0x000200F8,\n    0x00002957, 0x000500C7, 0x00000017, 0x0000475F, 0x00001CAA, 0x000009CE,\n    0x000500C4, 0x00000017, 0x000024D1, 0x0000475F, 0x0000013D, 0x000500C7,\n    0x00000017, 0x000050AC, 0x00001CAA, 0x0000072E, 0x000500C2, 0x00000017,\n    0x0000448D, 0x000050AC, 0x0000013D, 0x000500C5, 0x00000017, 0x00003FF8,\n    0x000024D1, 0x0000448D, 0x000200F9, 0x00003463, 0x000200F8, 0x00003463,\n    0x000700F5, 0x00000017, 0x00005879, 0x00001CAA, 0x00004A60, 0x00003FF8,\n    0x00002957, 0x000500AA, 0x00000009, 0x00004CB6, 0x000061E2, 0x00000A13,\n    0x000500A6, 0x00000009, 0x00003B23, 0x00005376, 0x00004CB6, 0x000300F7,\n    0x0000362B, 0x00000000, 0x000400FA, 0x00003B23, 0x00002B38, 0x0000362B,\n    0x000200F8, 0x00002B38, 0x000500C4, 0x00000017, 0x00005E17, 0x00005879,\n    0x000002ED, 0x000500C2, 0x00000017, 0x00003BE7, 0x00005879, 0x000002ED,\n    0x000500C5, 0x00000017, 0x000029E8, 0x00005E17, 0x00003BE7, 0x000200F9,\n    0x0000362B, 0x000200F8, 0x0000362B, 0x000700F5, 0x00000017, 0x00004AB4,\n    0x00005879, 0x00003463, 0x000029E8, 0x00002B38, 0x000500C2, 0x0000000B,\n    0x00005FC1, 0x000038F6, 0x00000A17, 0x000500C7, 0x00000017, 0x00001CFC,\n    0x00004AB4, 0x00000352, 0x00040070, 0x0000001D, 0x00003F05, 0x00001CFC,\n    0x0005008E, 0x0000001D, 0x00004BA5, 0x00003F05, 0x0000092A, 0x000500C2,\n    0x00000017, 0x00005B47, 0x00004AB4, 0x000002ED, 0x00040070, 0x0000001D,\n    0x0000483C, 0x00005B47, 0x0005008E, 0x0000001D, 0x00004812, 0x0000483C,\n    0x0000092A, 0x00050051, 0x0000000D, 0x0000187C, 0x00004BA5, 0x00000000,\n    0x00050051, 0x0000000D, 0x000035EE, 0x00004812, 0x00000000, 0x00050050,\n    0x00000013, 0x00004B20, 0x0000187C, 0x000035EE, 0x0006000C, 0x0000000B,\n    0x00002171, 0x00000001, 0x0000003A, 0x00004B20, 0x00050051, 0x0000000D,\n    0x00005BBF, 0x00004BA5, 0x00000001, 0x00050051, 0x0000000D, 0x000039A7,\n    0x00004812, 0x00000001, 0x00050050, 0x00000013, 0x00004B21, 0x00005BBF,\n    0x000039A7, 0x0006000C, 0x0000000B, 0x00002172, 0x00000001, 0x0000003A,\n    0x00004B21, 0x00050051, 0x0000000D, 0x00005BC0, 0x00004BA5, 0x00000002,\n    0x00050051, 0x0000000D, 0x000039A8, 0x00004812, 0x00000002, 0x00050050,\n    0x00000013, 0x00004B22, 0x00005BC0, 0x000039A8, 0x0006000C, 0x0000000B,\n    0x00002173, 0x00000001, 0x0000003A, 0x00004B22, 0x00050051, 0x0000000D,\n    0x00005BC1, 0x00004BA5, 0x00000003, 0x00050051, 0x0000000D, 0x000039A9,\n    0x00004812, 0x00000003, 0x00050050, 0x00000013, 0x00004B0D, 0x00005BC1,\n    0x000039A9, 0x0006000C, 0x0000000B, 0x000020EE, 0x00000001, 0x0000003A,\n    0x00004B0D, 0x00070050, 0x00000017, 0x00003ABB, 0x00002171, 0x00002172,\n    0x00002173, 0x000020EE, 0x00060041, 0x00000294, 0x000045C3, 0x0000140E,\n    0x00000A0B, 0x00005FC1, 0x0003003E, 0x000045C3, 0x00003ABB, 0x00050080,\n    0x0000000B, 0x000054B5, 0x000038F6, 0x00000A3A, 0x000300F7, 0x00006070,\n    0x00000002, 0x000400FA, 0x00004376, 0x000055E9, 0x00001C25, 0x000200F8,\n    0x000055E9, 0x000200F9, 0x00006070, 0x000200F8, 0x00001C25, 0x000200F9,\n    0x00006070, 0x000200F8, 0x00006070, 0x000700F5, 0x0000000B, 0x00002C71,\n    0x00000A6A, 0x000055E9, 0x00000A3A, 0x00001C25, 0x00050080, 0x0000000B,\n    0x000048BE, 0x000048BD, 0x00002C71, 0x000500C2, 0x0000000B, 0x00003D53,\n    0x000048BE, 0x00000A17, 0x00060041, 0x00000294, 0x00005566, 0x0000107A,\n    0x00000A0B, 0x00003D53, 0x0004003D, 0x00000017, 0x00003910, 0x00005566,\n    0x000300F7, 0x00003A1A, 0x00000000, 0x000400FA, 0x00005686, 0x00002958,\n    0x00003A1A, 0x000200F8, 0x00002958, 0x000500C7, 0x00000017, 0x00004760,\n    0x00003910, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D2, 0x00004760,\n    0x0000013D, 0x000500C7, 0x00000017, 0x000050AD, 0x00003910, 0x0000072E,\n    0x000500C2, 0x00000017, 0x0000448E, 0x000050AD, 0x0000013D, 0x000500C5,\n    0x00000017, 0x00003FF9, 0x000024D2, 0x0000448E, 0x000200F9, 0x00003A1A,\n    0x000200F8, 0x00003A1A, 0x000700F5, 0x00000017, 0x00002AAC, 0x00003910,\n    0x00006070, 0x00003FF9, 0x00002958, 0x000300F7, 0x0000362C, 0x00000000,\n    0x000400FA, 0x00003B23, 0x00002B39, 0x0000362C, 0x000200F8, 0x00002B39,\n    0x000500C4, 0x00000017, 0x00005E18, 0x00002AAC, 0x000002ED, 0x000500C2,\n    0x00000017, 0x00003BE8, 0x00002AAC, 0x000002ED, 0x000500C5, 0x00000017,\n    0x000029E9, 0x00005E18, 0x00003BE8, 0x000200F9, 0x0000362C, 0x000200F8,\n    0x0000362C, 0x000700F5, 0x00000017, 0x00004AB5, 0x00002AAC, 0x00003A1A,\n    0x000029E9, 0x00002B39, 0x000500C2, 0x0000000B, 0x00005FC2, 0x000054B5,\n    0x00000A17, 0x000500C7, 0x00000017, 0x00001CFD, 0x00004AB5, 0x00000352,\n    0x00040070, 0x0000001D, 0x00003F06, 0x00001CFD, 0x0005008E, 0x0000001D,\n    0x00004BA6, 0x00003F06, 0x0000092A, 0x000500C2, 0x00000017, 0x00005B48,\n    0x00004AB5, 0x000002ED, 0x00040070, 0x0000001D, 0x0000483D, 0x00005B48,\n    0x0005008E, 0x0000001D, 0x00004813, 0x0000483D, 0x0000092A, 0x00050051,\n    0x0000000D, 0x0000187D, 0x00004BA6, 0x00000000, 0x00050051, 0x0000000D,\n    0x000035EF, 0x00004813, 0x00000000, 0x00050050, 0x00000013, 0x00004B23,\n    0x0000187D, 0x000035EF, 0x0006000C, 0x0000000B, 0x00002174, 0x00000001,\n    0x0000003A, 0x00004B23, 0x00050051, 0x0000000D, 0x00005BC2, 0x00004BA6,\n    0x00000001, 0x00050051, 0x0000000D, 0x000039AA, 0x00004813, 0x00000001,\n    0x00050050, 0x00000013, 0x00004B24, 0x00005BC2, 0x000039AA, 0x0006000C,\n    0x0000000B, 0x00002175, 0x00000001, 0x0000003A, 0x00004B24, 0x00050051,\n    0x0000000D, 0x00005BC3, 0x00004BA6, 0x00000002, 0x00050051, 0x0000000D,\n    0x000039AB, 0x00004813, 0x00000002, 0x00050050, 0x00000013, 0x00004B25,\n    0x00005BC3, 0x000039AB, 0x0006000C, 0x0000000B, 0x00002176, 0x00000001,\n    0x0000003A, 0x00004B25, 0x00050051, 0x0000000D, 0x00005BC4, 0x00004BA6,\n    0x00000003, 0x00050051, 0x0000000D, 0x000039AC, 0x00004813, 0x00000003,\n    0x00050050, 0x00000013, 0x00004B0E, 0x00005BC4, 0x000039AC, 0x0006000C,\n    0x0000000B, 0x000020EF, 0x00000001, 0x0000003A, 0x00004B0E, 0x00070050,\n    0x00000017, 0x00003ABC, 0x00002174, 0x00002175, 0x00002176, 0x000020EF,\n    0x00060041, 0x00000294, 0x00004EBE, 0x0000140E, 0x00000A0B, 0x00005FC2,\n    0x0003003E, 0x00004EBE, 0x00003ABC, 0x000200F9, 0x00004C7A, 0x000200F8,\n    0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_rgba16_unorm_float_scaled_cs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25157\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint GLCompute %main \"main\" %gl_GlobalInvocationID\n               OpExecutionMode %main LocalSize 4 32 1\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_texture_load_is_tiled_3d_endian_scale\"\n               OpMemberName %push_const_block_xe 1 \"xe_texture_load_guest_offset\"\n               OpMemberName %push_const_block_xe 2 \"xe_texture_load_guest_pitch_aligned\"\n               OpMemberName %push_const_block_xe 3 \"xe_texture_load_guest_z_stride_block_rows_aligned\"\n               OpMemberName %push_const_block_xe 4 \"xe_texture_load_size_blocks\"\n               OpMemberName %push_const_block_xe 5 \"xe_texture_load_host_offset\"\n               OpMemberName %push_const_block_xe 6 \"xe_texture_load_host_pitch\"\n               OpMemberName %push_const_block_xe 7 \"xe_texture_load_height_texels\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_GlobalInvocationID \"gl_GlobalInvocationID\"\n               OpName %xe_texture_load_source_xe_block \"xe_texture_load_source_xe_block\"\n               OpMemberName %xe_texture_load_source_xe_block 0 \"data\"\n               OpName %xe_texture_load_source \"xe_texture_load_source\"\n               OpName %xe_texture_load_dest_xe_block \"xe_texture_load_dest_xe_block\"\n               OpMemberName %xe_texture_load_dest_xe_block 0 \"data\"\n               OpName %xe_texture_load_dest \"xe_texture_load_dest\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 4\n               OpMemberDecorate %push_const_block_xe 2 Offset 8\n               OpMemberDecorate %push_const_block_xe 3 Offset 12\n               OpMemberDecorate %push_const_block_xe 4 Offset 16\n               OpMemberDecorate %push_const_block_xe 5 Offset 28\n               OpMemberDecorate %push_const_block_xe 6 Offset 32\n               OpMemberDecorate %push_const_block_xe 7 Offset 36\n               OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId\n               OpDecorate %_runtimearr_v4uint ArrayStride 16\n               OpDecorate %xe_texture_load_source_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 NonWritable\n               OpMemberDecorate %xe_texture_load_source_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_source NonWritable\n               OpDecorate %xe_texture_load_source Binding 0\n               OpDecorate %xe_texture_load_source DescriptorSet 1\n               OpDecorate %_runtimearr_v4uint_0 ArrayStride 16\n               OpDecorate %xe_texture_load_dest_xe_block BufferBlock\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 NonReadable\n               OpMemberDecorate %xe_texture_load_dest_xe_block 0 Offset 0\n               OpDecorate %xe_texture_load_dest NonReadable\n               OpDecorate %xe_texture_load_dest Binding 0\n               OpDecorate %xe_texture_load_dest DescriptorSet 0\n               OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n     %v4uint = OpTypeVector %uint 4\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n      %v3int = OpTypeVector %int 3\n       %bool = OpTypeBool\n     %v3uint = OpTypeVector %uint 3\n      %float = OpTypeFloat 32\n    %v4float = OpTypeVector %float 4\n %uint_65535 = OpConstant %uint 65535\n%float_1_52590219en05 = OpConstant %float 1.52590219e-05\n    %uint_16 = OpConstant %uint 16\n     %uint_0 = OpConstant %uint 0\n    %v2float = OpTypeVector %float 2\n     %uint_1 = OpConstant %uint 1\n     %uint_2 = OpConstant %uint 2\n     %uint_3 = OpConstant %uint 3\n%uint_16711935 = OpConstant %uint 16711935\n     %uint_8 = OpConstant %uint 8\n%uint_4278255360 = OpConstant %uint 4278255360\n      %int_4 = OpConstant %int 4\n      %int_6 = OpConstant %int 6\n     %int_11 = OpConstant %int 11\n     %int_15 = OpConstant %int 15\n      %int_1 = OpConstant %int 1\n      %int_5 = OpConstant %int 5\n      %int_7 = OpConstant %int 7\n      %int_8 = OpConstant %int 8\n     %int_12 = OpConstant %int 12\n      %int_3 = OpConstant %int 3\n      %int_2 = OpConstant %int 2\n     %uint_5 = OpConstant %uint 5\n     %uint_4 = OpConstant %uint 4\n      %int_0 = OpConstant %int 0\n%push_const_block_xe = OpTypeStruct %uint %uint %uint %uint %v3uint %uint %uint %uint\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint\n     %uint_7 = OpConstant %uint 7\n       %1927 = OpConstantComposite %v2uint %uint_4 %uint_7\n%_ptr_PushConstant_v3uint = OpTypePointer PushConstant %v3uint\n%_ptr_Input_v3uint = OpTypePointer Input %v3uint\n%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input\n       %2596 = OpConstantComposite %v3uint %uint_2 %uint_0 %uint_0\n     %v2bool = OpTypeVector %bool 2\n%_runtimearr_v4uint = OpTypeRuntimeArray %v4uint\n%xe_texture_load_source_xe_block = OpTypeStruct %_runtimearr_v4uint\n%_ptr_Uniform_xe_texture_load_source_xe_block = OpTypePointer Uniform %xe_texture_load_source_xe_block\n%xe_texture_load_source = OpVariable %_ptr_Uniform_xe_texture_load_source_xe_block Uniform\n%_ptr_Uniform_v4uint = OpTypePointer Uniform %v4uint\n%_runtimearr_v4uint_0 = OpTypeRuntimeArray %v4uint\n%xe_texture_load_dest_xe_block = OpTypeStruct %_runtimearr_v4uint_0\n%_ptr_Uniform_xe_texture_load_dest_xe_block = OpTypePointer Uniform %xe_texture_load_dest_xe_block\n%xe_texture_load_dest = OpVariable %_ptr_Uniform_xe_texture_load_dest_xe_block Uniform\n    %uint_32 = OpConstant %uint 32\n%gl_WorkGroupSize = OpConstantComposite %v3uint %uint_4 %uint_32 %uint_1\n       %1954 = OpConstantComposite %v2uint %uint_7 %uint_7\n       %1837 = OpConstantComposite %v2uint %uint_2 %uint_1\n       %1846 = OpConstantComposite %v2uint %uint_3 %uint_1\n     %uint_6 = OpConstant %uint 6\n       %2510 = OpConstantComposite %v4uint %uint_16711935 %uint_16711935 %uint_16711935 %uint_16711935\n        %317 = OpConstantComposite %v4uint %uint_8 %uint_8 %uint_8 %uint_8\n       %1838 = OpConstantComposite %v4uint %uint_4278255360 %uint_4278255360 %uint_4278255360 %uint_4278255360\n        %749 = OpConstantComposite %v4uint %uint_16 %uint_16 %uint_16 %uint_16\n        %850 = OpConstantComposite %v4uint %uint_65535 %uint_65535 %uint_65535 %uint_65535\n       %main = OpFunction %void None %1282\n      %15110 = OpLabel\n               OpSelectionMerge %19578 None\n               OpSwitch %uint_0 %11880\n      %11880 = OpLabel\n      %24791 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_0\n      %13606 = OpLoad %uint %24791\n      %24445 = OpBitwiseAnd %uint %13606 %uint_2\n      %18667 = OpINotEqual %bool %24445 %uint_0\n       %8141 = OpShiftRightLogical %uint %13606 %uint_2\n      %24990 = OpBitwiseAnd %uint %8141 %uint_3\n       %8871 = OpCompositeConstruct %v2uint %13606 %13606\n       %7087 = OpShiftRightLogical %v2uint %8871 %1927\n       %6551 = OpBitwiseAnd %v2uint %7087 %1954\n      %18732 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_1\n      %24236 = OpLoad %uint %18732\n      %20154 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_2\n      %22408 = OpLoad %uint %20154\n      %20155 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_3\n      %22409 = OpLoad %uint %20155\n      %20156 = OpAccessChain %_ptr_PushConstant_v3uint %push_consts_xe %int_4\n      %22410 = OpLoad %v3uint %20156\n      %20157 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_5\n      %22411 = OpLoad %uint %20157\n      %20078 = OpAccessChain %_ptr_PushConstant_uint %push_consts_xe %int_6\n       %6594 = OpLoad %uint %20078\n      %10766 = OpLoad %v3uint %gl_GlobalInvocationID\n      %21387 = OpShiftLeftLogical %v3uint %10766 %2596\n      %17136 = OpVectorShuffle %v2uint %21387 %21387 0 1\n       %9263 = OpVectorShuffle %v2uint %22410 %22410 0 1\n      %17032 = OpUGreaterThanEqual %v2bool %17136 %9263\n      %24679 = OpAny %bool %17032\n               OpSelectionMerge %6586 DontFlatten\n               OpBranchConditional %24679 %21992 %6586\n      %21992 = OpLabel\n               OpBranch %19578\n       %6586 = OpLabel\n      %23478 = OpBitcast %v3int %21387\n      %18710 = OpCompositeExtract %uint %22410 1\n      %23531 = OpCompositeExtract %int %23478 0\n      %22810 = OpIMul %int %23531 %int_8\n       %6362 = OpCompositeExtract %int %23478 2\n      %14505 = OpBitcast %int %18710\n      %11279 = OpIMul %int %6362 %14505\n      %17598 = OpCompositeExtract %int %23478 1\n      %22228 = OpIAdd %int %11279 %17598\n      %22405 = OpBitcast %int %6594\n      %24535 = OpIMul %int %22228 %22405\n       %8258 = OpIAdd %int %22810 %24535\n      %10898 = OpBitcast %uint %8258\n       %7937 = OpIAdd %uint %22411 %10898\n      %19921 = OpShiftRightLogical %v2uint %17136 %1837\n       %7712 = OpUDiv %v2uint %19921 %6551\n      %18183 = OpIMul %v2uint %6551 %7712\n      %18273 = OpISub %v2uint %19921 %18183\n      %11232 = OpShiftLeftLogical %v2uint %7712 %1837\n      %13284 = OpCompositeExtract %uint %18273 0\n      %10872 = OpCompositeExtract %uint %6551 1\n      %22886 = OpIMul %uint %13284 %10872\n       %6943 = OpCompositeExtract %uint %18273 1\n      %10469 = OpIAdd %uint %22886 %6943\n      %18851 = OpBitwiseAnd %v2uint %17136 %1846\n      %10581 = OpShiftLeftLogical %uint %10469 %uint_6\n      %20916 = OpCompositeExtract %uint %18851 1\n      %23596 = OpShiftLeftLogical %uint %20916 %uint_5\n      %19814 = OpBitwiseOr %uint %10581 %23596\n      %21476 = OpCompositeExtract %uint %18851 0\n       %8560 = OpShiftLeftLogical %uint %21476 %uint_3\n      %17648 = OpBitwiseOr %uint %19814 %8560\n      %19923 = OpCompositeExtract %uint %11232 0\n      %15556 = OpCompositeInsert %v3uint %19923 %21387 0\n      %23006 = OpCompositeExtract %uint %11232 1\n       %9680 = OpCompositeInsert %v3uint %23006 %15556 1\n               OpSelectionMerge %20344 DontFlatten\n               OpBranchConditional %18667 %23520 %11737\n      %23520 = OpLabel\n      %10111 = OpBitcast %v3int %9680\n      %19476 = OpShiftRightLogical %uint %22408 %int_5\n      %18810 = OpShiftRightLogical %uint %22409 %int_4\n       %6782 = OpCompositeExtract %int %10111 2\n      %12089 = OpShiftRightArithmetic %int %6782 %int_2\n      %22400 = OpBitcast %int %18810\n       %7938 = OpIMul %int %12089 %22400\n      %25154 = OpCompositeExtract %int %10111 1\n      %19055 = OpShiftRightArithmetic %int %25154 %int_4\n      %11052 = OpIAdd %int %7938 %19055\n      %16898 = OpBitcast %int %19476\n      %14944 = OpIMul %int %11052 %16898\n      %25155 = OpCompositeExtract %int %10111 0\n      %20423 = OpShiftRightArithmetic %int %25155 %int_5\n      %18940 = OpIAdd %int %14944 %20423\n       %8797 = OpShiftLeftLogical %int %18940 %int_7\n      %11434 = OpBitwiseAnd %int %6782 %int_3\n      %19630 = OpShiftLeftLogical %int %11434 %int_5\n      %14398 = OpShiftRightArithmetic %int %25154 %int_1\n      %21364 = OpBitwiseAnd %int %14398 %int_3\n      %21706 = OpShiftLeftLogical %int %21364 %int_3\n      %17102 = OpBitwiseOr %int %19630 %21706\n      %20693 = OpBitwiseAnd %int %25155 %int_7\n      %15069 = OpBitwiseOr %int %17102 %20693\n      %17334 = OpBitwiseOr %int %8797 %15069\n      %24144 = OpShiftLeftLogical %int %17334 %uint_3\n      %13015 = OpShiftRightArithmetic %int %25154 %int_3\n       %9929 = OpBitwiseXor %int %13015 %12089\n      %16793 = OpBitwiseAnd %int %9929 %int_1\n       %9616 = OpShiftRightArithmetic %int %25155 %int_3\n      %20574 = OpBitwiseAnd %int %9616 %int_3\n      %21533 = OpShiftLeftLogical %int %16793 %int_1\n       %8890 = OpBitwiseXor %int %20574 %21533\n      %20598 = OpBitwiseAnd %int %25154 %int_1\n      %21032 = OpShiftLeftLogical %int %20598 %int_4\n       %6552 = OpShiftLeftLogical %int %8890 %int_6\n      %18430 = OpBitwiseOr %int %21032 %6552\n       %7168 = OpShiftLeftLogical %int %16793 %int_11\n      %15489 = OpBitwiseOr %int %18430 %7168\n      %20655 = OpBitwiseAnd %int %24144 %int_15\n      %15472 = OpBitwiseOr %int %15489 %20655\n      %14149 = OpShiftRightArithmetic %int %24144 %int_4\n       %6328 = OpBitwiseAnd %int %14149 %int_1\n      %21630 = OpShiftLeftLogical %int %6328 %int_5\n      %17832 = OpBitwiseOr %int %15472 %21630\n      %14958 = OpShiftRightArithmetic %int %24144 %int_5\n       %6329 = OpBitwiseAnd %int %14958 %int_7\n      %21631 = OpShiftLeftLogical %int %6329 %int_8\n      %17775 = OpBitwiseOr %int %17832 %21631\n      %15496 = OpShiftRightArithmetic %int %24144 %int_8\n      %10276 = OpShiftLeftLogical %int %15496 %int_12\n      %15225 = OpBitwiseOr %int %17775 %10276\n      %16869 = OpBitcast %uint %15225\n               OpBranch %20344\n      %11737 = OpLabel\n      %11908 = OpVectorShuffle %v2uint %9680 %9680 0 1\n      %20347 = OpBitcast %v2int %11908\n      %11433 = OpShiftRightLogical %uint %22408 %int_5\n      %14597 = OpCompositeExtract %int %20347 1\n      %12090 = OpShiftRightArithmetic %int %14597 %int_5\n      %22401 = OpBitcast %int %11433\n       %7939 = OpIMul %int %12090 %22401\n      %25156 = OpCompositeExtract %int %20347 0\n      %20424 = OpShiftRightArithmetic %int %25156 %int_5\n      %18864 = OpIAdd %int %7939 %20424\n       %9546 = OpShiftLeftLogical %int %18864 %int_6\n      %24635 = OpShiftRightArithmetic %int %14597 %int_1\n      %21402 = OpBitwiseAnd %int %24635 %int_7\n      %21322 = OpShiftLeftLogical %int %21402 %int_3\n      %20133 = OpBitwiseAnd %int %25156 %int_7\n      %11034 = OpBitwiseOr %int %21322 %20133\n      %17335 = OpBitwiseOr %int %9546 %11034\n      %24163 = OpShiftLeftLogical %int %17335 %uint_3\n      %12766 = OpShiftRightArithmetic %int %14597 %int_4\n      %21575 = OpBitwiseAnd %int %12766 %int_1\n      %10406 = OpShiftRightArithmetic %int %25156 %int_3\n      %20766 = OpBitwiseAnd %int %10406 %int_3\n      %10425 = OpShiftRightArithmetic %int %14597 %int_3\n      %20575 = OpBitwiseAnd %int %10425 %int_1\n      %21534 = OpShiftLeftLogical %int %20575 %int_1\n       %8891 = OpBitwiseXor %int %20766 %21534\n      %20599 = OpBitwiseAnd %int %14597 %int_1\n      %21033 = OpShiftLeftLogical %int %20599 %int_4\n       %6553 = OpShiftLeftLogical %int %8891 %int_6\n      %18431 = OpBitwiseOr %int %21033 %6553\n       %7169 = OpShiftLeftLogical %int %21575 %int_11\n      %15490 = OpBitwiseOr %int %18431 %7169\n      %20656 = OpBitwiseAnd %int %24163 %int_15\n      %15473 = OpBitwiseOr %int %15490 %20656\n      %14150 = OpShiftRightArithmetic %int %24163 %int_4\n       %6330 = OpBitwiseAnd %int %14150 %int_1\n      %21632 = OpShiftLeftLogical %int %6330 %int_5\n      %17833 = OpBitwiseOr %int %15473 %21632\n      %14959 = OpShiftRightArithmetic %int %24163 %int_5\n       %6331 = OpBitwiseAnd %int %14959 %int_7\n      %21633 = OpShiftLeftLogical %int %6331 %int_8\n      %17776 = OpBitwiseOr %int %17833 %21633\n      %15497 = OpShiftRightArithmetic %int %24163 %int_8\n      %10277 = OpShiftLeftLogical %int %15497 %int_12\n      %15226 = OpBitwiseOr %int %17776 %10277\n      %16870 = OpBitcast %uint %15226\n               OpBranch %20344\n      %20344 = OpLabel\n      %18329 = OpPhi %uint %16869 %23520 %16870 %11737\n      %15200 = OpCompositeExtract %uint %6551 0\n      %17489 = OpIMul %uint %15200 %10872\n       %7313 = OpIMul %uint %18329 %17489\n       %8815 = OpIAdd %uint %7313 %17648\n      %21470 = OpIAdd %uint %8815 %24236\n      %14664 = OpShiftRightLogical %uint %21470 %int_4\n      %20399 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %14664\n       %7338 = OpLoad %v4uint %20399\n      %13760 = OpIEqual %bool %24990 %uint_1\n      %21366 = OpIEqual %bool %24990 %uint_2\n      %22150 = OpLogicalOr %bool %13760 %21366\n               OpSelectionMerge %13411 None\n               OpBranchConditional %22150 %10583 %13411\n      %10583 = OpLabel\n      %18271 = OpBitwiseAnd %v4uint %7338 %2510\n       %9425 = OpShiftLeftLogical %v4uint %18271 %317\n      %20652 = OpBitwiseAnd %v4uint %7338 %1838\n      %17549 = OpShiftRightLogical %v4uint %20652 %317\n      %16376 = OpBitwiseOr %v4uint %9425 %17549\n               OpBranch %13411\n      %13411 = OpLabel\n      %22649 = OpPhi %v4uint %7338 %20344 %16376 %10583\n      %19638 = OpIEqual %bool %24990 %uint_3\n      %15139 = OpLogicalOr %bool %21366 %19638\n               OpSelectionMerge %13867 None\n               OpBranchConditional %15139 %11064 %13867\n      %11064 = OpLabel\n      %24087 = OpShiftLeftLogical %v4uint %22649 %749\n      %15335 = OpShiftRightLogical %v4uint %22649 %749\n      %10728 = OpBitwiseOr %v4uint %24087 %15335\n               OpBranch %13867\n      %13867 = OpLabel\n      %19124 = OpPhi %v4uint %22649 %13411 %10728 %11064\n      %24513 = OpShiftRightLogical %uint %7937 %int_4\n       %7420 = OpBitwiseAnd %v4uint %19124 %850\n      %16133 = OpConvertUToF %v4float %7420\n      %19365 = OpVectorTimesScalar %v4float %16133 %float_1_52590219en05\n      %23367 = OpShiftRightLogical %v4uint %19124 %749\n      %18492 = OpConvertUToF %v4float %23367\n      %18450 = OpVectorTimesScalar %v4float %18492 %float_1_52590219en05\n       %6268 = OpCompositeExtract %float %19365 0\n      %13806 = OpCompositeExtract %float %18450 0\n      %19232 = OpCompositeConstruct %v2float %6268 %13806\n       %8561 = OpExtInst %uint %1 PackHalf2x16 %19232\n      %23487 = OpCompositeExtract %float %19365 1\n      %14759 = OpCompositeExtract %float %18450 1\n      %19233 = OpCompositeConstruct %v2float %23487 %14759\n       %8562 = OpExtInst %uint %1 PackHalf2x16 %19233\n      %23488 = OpCompositeExtract %float %19365 2\n      %14760 = OpCompositeExtract %float %18450 2\n      %19234 = OpCompositeConstruct %v2float %23488 %14760\n       %8563 = OpExtInst %uint %1 PackHalf2x16 %19234\n      %23489 = OpCompositeExtract %float %19365 3\n      %14761 = OpCompositeExtract %float %18450 3\n      %19213 = OpCompositeConstruct %v2float %23489 %14761\n       %8430 = OpExtInst %uint %1 PackHalf2x16 %19213\n      %15035 = OpCompositeConstruct %v4uint %8561 %8562 %8563 %8430\n      %17859 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %24513\n               OpStore %17859 %15035\n      %22137 = OpIAdd %uint %7937 %uint_16\n      %10214 = OpIAdd %uint %21470 %uint_16\n      %14665 = OpShiftRightLogical %uint %10214 %int_4\n      %21862 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_source %int_0 %14665\n      %14608 = OpLoad %v4uint %21862\n               OpSelectionMerge %14874 None\n               OpBranchConditional %22150 %10584 %14874\n      %10584 = OpLabel\n      %18272 = OpBitwiseAnd %v4uint %14608 %2510\n       %9426 = OpShiftLeftLogical %v4uint %18272 %317\n      %20653 = OpBitwiseAnd %v4uint %14608 %1838\n      %17550 = OpShiftRightLogical %v4uint %20653 %317\n      %16377 = OpBitwiseOr %v4uint %9426 %17550\n               OpBranch %14874\n      %14874 = OpLabel\n      %10924 = OpPhi %v4uint %14608 %13867 %16377 %10584\n               OpSelectionMerge %13868 None\n               OpBranchConditional %15139 %11065 %13868\n      %11065 = OpLabel\n      %24088 = OpShiftLeftLogical %v4uint %10924 %749\n      %15336 = OpShiftRightLogical %v4uint %10924 %749\n      %10729 = OpBitwiseOr %v4uint %24088 %15336\n               OpBranch %13868\n      %13868 = OpLabel\n      %19125 = OpPhi %v4uint %10924 %14874 %10729 %11065\n      %24514 = OpShiftRightLogical %uint %22137 %int_4\n       %7421 = OpBitwiseAnd %v4uint %19125 %850\n      %16134 = OpConvertUToF %v4float %7421\n      %19366 = OpVectorTimesScalar %v4float %16134 %float_1_52590219en05\n      %23368 = OpShiftRightLogical %v4uint %19125 %749\n      %18493 = OpConvertUToF %v4float %23368\n      %18451 = OpVectorTimesScalar %v4float %18493 %float_1_52590219en05\n       %6269 = OpCompositeExtract %float %19366 0\n      %13807 = OpCompositeExtract %float %18451 0\n      %19235 = OpCompositeConstruct %v2float %6269 %13807\n       %8564 = OpExtInst %uint %1 PackHalf2x16 %19235\n      %23490 = OpCompositeExtract %float %19366 1\n      %14762 = OpCompositeExtract %float %18451 1\n      %19236 = OpCompositeConstruct %v2float %23490 %14762\n       %8565 = OpExtInst %uint %1 PackHalf2x16 %19236\n      %23491 = OpCompositeExtract %float %19366 2\n      %14763 = OpCompositeExtract %float %18451 2\n      %19237 = OpCompositeConstruct %v2float %23491 %14763\n       %8566 = OpExtInst %uint %1 PackHalf2x16 %19237\n      %23492 = OpCompositeExtract %float %19366 3\n      %14764 = OpCompositeExtract %float %18451 3\n      %19214 = OpCompositeConstruct %v2float %23492 %14764\n       %8431 = OpExtInst %uint %1 PackHalf2x16 %19214\n      %15036 = OpCompositeConstruct %v4uint %8564 %8565 %8566 %8431\n      %20158 = OpAccessChain %_ptr_Uniform_v4uint %xe_texture_load_dest %int_0 %24514\n               OpStore %20158 %15036\n               OpBranch %19578\n      %19578 = OpLabel\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t texture_load_rgba16_unorm_float_scaled_cs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006245, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0006000F, 0x00000005,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000F48, 0x00060010, 0x0000161F,\n    0x00000011, 0x00000004, 0x00000020, 0x00000001, 0x00030003, 0x00000002,\n    0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F,\n    0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47,\n    0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572,\n    0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F,\n    0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365,\n    0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63,\n    0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D,\n    0x00000000, 0x00070005, 0x00000489, 0x68737570, 0x6E6F635F, 0x625F7473,\n    0x6B636F6C, 0x0065785F, 0x000E0006, 0x00000489, 0x00000000, 0x745F6578,\n    0x75747865, 0x6C5F6572, 0x5F64616F, 0x745F7369, 0x64656C69, 0x5F64335F,\n    0x69646E65, 0x735F6E61, 0x656C6163, 0x00000000, 0x000B0006, 0x00000489,\n    0x00000001, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000C0006, 0x00000489, 0x00000002,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x69705F74,\n    0x5F686374, 0x67696C61, 0x0064656E, 0x00100006, 0x00000489, 0x00000003,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x73657567, 0x5F7A5F74,\n    0x69727473, 0x625F6564, 0x6B636F6C, 0x776F725F, 0x6C615F73, 0x656E6769,\n    0x00000064, 0x000A0006, 0x00000489, 0x00000004, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x657A6973, 0x6F6C625F, 0x00736B63, 0x000A0006,\n    0x00000489, 0x00000005, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F,\n    0x74736F68, 0x66666F5F, 0x00746573, 0x000A0006, 0x00000489, 0x00000006,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736F68, 0x7469705F,\n    0x00006863, 0x000B0006, 0x00000489, 0x00000007, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x67696568, 0x745F7468, 0x6C657865, 0x00000073,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00080005, 0x00000F48, 0x475F6C67, 0x61626F6C, 0x766E496C, 0x7461636F,\n    0x496E6F69, 0x00000044, 0x000A0005, 0x000007B4, 0x745F6578, 0x75747865,\n    0x6C5F6572, 0x5F64616F, 0x72756F73, 0x785F6563, 0x6C625F65, 0x006B636F,\n    0x00050006, 0x000007B4, 0x00000000, 0x61746164, 0x00000000, 0x00080005,\n    0x0000107A, 0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x72756F73,\n    0x00006563, 0x000A0005, 0x000007B5, 0x745F6578, 0x75747865, 0x6C5F6572,\n    0x5F64616F, 0x74736564, 0x5F65785F, 0x636F6C62, 0x0000006B, 0x00050006,\n    0x000007B5, 0x00000000, 0x61746164, 0x00000000, 0x00080005, 0x0000140E,\n    0x745F6578, 0x75747865, 0x6C5F6572, 0x5F64616F, 0x74736564, 0x00000000,\n    0x00030047, 0x00000489, 0x00000002, 0x00050048, 0x00000489, 0x00000000,\n    0x00000023, 0x00000000, 0x00050048, 0x00000489, 0x00000001, 0x00000023,\n    0x00000004, 0x00050048, 0x00000489, 0x00000002, 0x00000023, 0x00000008,\n    0x00050048, 0x00000489, 0x00000003, 0x00000023, 0x0000000C, 0x00050048,\n    0x00000489, 0x00000004, 0x00000023, 0x00000010, 0x00050048, 0x00000489,\n    0x00000005, 0x00000023, 0x0000001C, 0x00050048, 0x00000489, 0x00000006,\n    0x00000023, 0x00000020, 0x00050048, 0x00000489, 0x00000007, 0x00000023,\n    0x00000024, 0x00040047, 0x00000F48, 0x0000000B, 0x0000001C, 0x00040047,\n    0x000007DC, 0x00000006, 0x00000010, 0x00030047, 0x000007B4, 0x00000003,\n    0x00040048, 0x000007B4, 0x00000000, 0x00000018, 0x00050048, 0x000007B4,\n    0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000107A, 0x00000018,\n    0x00040047, 0x0000107A, 0x00000021, 0x00000000, 0x00040047, 0x0000107A,\n    0x00000022, 0x00000001, 0x00040047, 0x000007DD, 0x00000006, 0x00000010,\n    0x00030047, 0x000007B5, 0x00000003, 0x00040048, 0x000007B5, 0x00000000,\n    0x00000019, 0x00050048, 0x000007B5, 0x00000000, 0x00000023, 0x00000000,\n    0x00030047, 0x0000140E, 0x00000019, 0x00040047, 0x0000140E, 0x00000021,\n    0x00000000, 0x00040047, 0x0000140E, 0x00000022, 0x00000000, 0x00040047,\n    0x00000BC3, 0x0000000B, 0x00000019, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x00000017,\n    0x0000000B, 0x00000004, 0x00040015, 0x0000000C, 0x00000020, 0x00000001,\n    0x00040017, 0x00000012, 0x0000000C, 0x00000002, 0x00040017, 0x00000016,\n    0x0000000C, 0x00000003, 0x00020014, 0x00000009, 0x00040017, 0x00000014,\n    0x0000000B, 0x00000003, 0x00030016, 0x0000000D, 0x00000020, 0x00040017,\n    0x0000001D, 0x0000000D, 0x00000004, 0x0004002B, 0x0000000B, 0x000001C1,\n    0x0000FFFF, 0x0004002B, 0x0000000D, 0x0000092A, 0x37800080, 0x0004002B,\n    0x0000000B, 0x00000A3A, 0x00000010, 0x0004002B, 0x0000000B, 0x00000A0A,\n    0x00000000, 0x00040017, 0x00000013, 0x0000000D, 0x00000002, 0x0004002B,\n    0x0000000B, 0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B, 0x00000A10,\n    0x00000002, 0x0004002B, 0x0000000B, 0x00000A13, 0x00000003, 0x0004002B,\n    0x0000000B, 0x000008A6, 0x00FF00FF, 0x0004002B, 0x0000000B, 0x00000A22,\n    0x00000008, 0x0004002B, 0x0000000B, 0x000005FD, 0xFF00FF00, 0x0004002B,\n    0x0000000C, 0x00000A17, 0x00000004, 0x0004002B, 0x0000000C, 0x00000A1D,\n    0x00000006, 0x0004002B, 0x0000000C, 0x00000A2C, 0x0000000B, 0x0004002B,\n    0x0000000C, 0x00000A38, 0x0000000F, 0x0004002B, 0x0000000C, 0x00000A0E,\n    0x00000001, 0x0004002B, 0x0000000C, 0x00000A1A, 0x00000005, 0x0004002B,\n    0x0000000C, 0x00000A20, 0x00000007, 0x0004002B, 0x0000000C, 0x00000A23,\n    0x00000008, 0x0004002B, 0x0000000C, 0x00000A2F, 0x0000000C, 0x0004002B,\n    0x0000000C, 0x00000A14, 0x00000003, 0x0004002B, 0x0000000C, 0x00000A11,\n    0x00000002, 0x0004002B, 0x0000000B, 0x00000A19, 0x00000005, 0x0004002B,\n    0x0000000B, 0x00000A16, 0x00000004, 0x0004002B, 0x0000000C, 0x00000A0B,\n    0x00000000, 0x000A001E, 0x00000489, 0x0000000B, 0x0000000B, 0x0000000B,\n    0x0000000B, 0x00000014, 0x0000000B, 0x0000000B, 0x0000000B, 0x00040020,\n    0x00000706, 0x00000009, 0x00000489, 0x0004003B, 0x00000706, 0x00000CE9,\n    0x00000009, 0x00040020, 0x00000288, 0x00000009, 0x0000000B, 0x0004002B,\n    0x0000000B, 0x00000A1F, 0x00000007, 0x0005002C, 0x00000011, 0x00000787,\n    0x00000A16, 0x00000A1F, 0x00040020, 0x00000291, 0x00000009, 0x00000014,\n    0x00040020, 0x00000292, 0x00000001, 0x00000014, 0x0004003B, 0x00000292,\n    0x00000F48, 0x00000001, 0x0006002C, 0x00000014, 0x00000A24, 0x00000A10,\n    0x00000A0A, 0x00000A0A, 0x00040017, 0x0000000F, 0x00000009, 0x00000002,\n    0x0003001D, 0x000007DC, 0x00000017, 0x0003001E, 0x000007B4, 0x000007DC,\n    0x00040020, 0x00000A31, 0x00000002, 0x000007B4, 0x0004003B, 0x00000A31,\n    0x0000107A, 0x00000002, 0x00040020, 0x00000294, 0x00000002, 0x00000017,\n    0x0003001D, 0x000007DD, 0x00000017, 0x0003001E, 0x000007B5, 0x000007DD,\n    0x00040020, 0x00000A32, 0x00000002, 0x000007B5, 0x0004003B, 0x00000A32,\n    0x0000140E, 0x00000002, 0x0004002B, 0x0000000B, 0x00000A6A, 0x00000020,\n    0x0006002C, 0x00000014, 0x00000BC3, 0x00000A16, 0x00000A6A, 0x00000A0D,\n    0x0005002C, 0x00000011, 0x000007A2, 0x00000A1F, 0x00000A1F, 0x0005002C,\n    0x00000011, 0x0000072D, 0x00000A10, 0x00000A0D, 0x0005002C, 0x00000011,\n    0x00000736, 0x00000A13, 0x00000A0D, 0x0004002B, 0x0000000B, 0x00000A1C,\n    0x00000006, 0x0007002C, 0x00000017, 0x000009CE, 0x000008A6, 0x000008A6,\n    0x000008A6, 0x000008A6, 0x0007002C, 0x00000017, 0x0000013D, 0x00000A22,\n    0x00000A22, 0x00000A22, 0x00000A22, 0x0007002C, 0x00000017, 0x0000072E,\n    0x000005FD, 0x000005FD, 0x000005FD, 0x000005FD, 0x0007002C, 0x00000017,\n    0x000002ED, 0x00000A3A, 0x00000A3A, 0x00000A3A, 0x00000A3A, 0x0007002C,\n    0x00000017, 0x00000352, 0x000001C1, 0x000001C1, 0x000001C1, 0x000001C1,\n    0x00050036, 0x00000008, 0x0000161F, 0x00000000, 0x00000502, 0x000200F8,\n    0x00003B06, 0x000300F7, 0x00004C7A, 0x00000000, 0x000300FB, 0x00000A0A,\n    0x00002E68, 0x000200F8, 0x00002E68, 0x00050041, 0x00000288, 0x000060D7,\n    0x00000CE9, 0x00000A0B, 0x0004003D, 0x0000000B, 0x00003526, 0x000060D7,\n    0x000500C7, 0x0000000B, 0x00005F7D, 0x00003526, 0x00000A10, 0x000500AB,\n    0x00000009, 0x000048EB, 0x00005F7D, 0x00000A0A, 0x000500C2, 0x0000000B,\n    0x00001FCD, 0x00003526, 0x00000A10, 0x000500C7, 0x0000000B, 0x0000619E,\n    0x00001FCD, 0x00000A13, 0x00050050, 0x00000011, 0x000022A7, 0x00003526,\n    0x00003526, 0x000500C2, 0x00000011, 0x00001BAF, 0x000022A7, 0x00000787,\n    0x000500C7, 0x00000011, 0x00001997, 0x00001BAF, 0x000007A2, 0x00050041,\n    0x00000288, 0x0000492C, 0x00000CE9, 0x00000A0E, 0x0004003D, 0x0000000B,\n    0x00005EAC, 0x0000492C, 0x00050041, 0x00000288, 0x00004EBA, 0x00000CE9,\n    0x00000A11, 0x0004003D, 0x0000000B, 0x00005788, 0x00004EBA, 0x00050041,\n    0x00000288, 0x00004EBB, 0x00000CE9, 0x00000A14, 0x0004003D, 0x0000000B,\n    0x00005789, 0x00004EBB, 0x00050041, 0x00000291, 0x00004EBC, 0x00000CE9,\n    0x00000A17, 0x0004003D, 0x00000014, 0x0000578A, 0x00004EBC, 0x00050041,\n    0x00000288, 0x00004EBD, 0x00000CE9, 0x00000A1A, 0x0004003D, 0x0000000B,\n    0x0000578B, 0x00004EBD, 0x00050041, 0x00000288, 0x00004E6E, 0x00000CE9,\n    0x00000A1D, 0x0004003D, 0x0000000B, 0x000019C2, 0x00004E6E, 0x0004003D,\n    0x00000014, 0x00002A0E, 0x00000F48, 0x000500C4, 0x00000014, 0x0000538B,\n    0x00002A0E, 0x00000A24, 0x0007004F, 0x00000011, 0x000042F0, 0x0000538B,\n    0x0000538B, 0x00000000, 0x00000001, 0x0007004F, 0x00000011, 0x0000242F,\n    0x0000578A, 0x0000578A, 0x00000000, 0x00000001, 0x000500AE, 0x0000000F,\n    0x00004288, 0x000042F0, 0x0000242F, 0x0004009A, 0x00000009, 0x00006067,\n    0x00004288, 0x000300F7, 0x000019BA, 0x00000002, 0x000400FA, 0x00006067,\n    0x000055E8, 0x000019BA, 0x000200F8, 0x000055E8, 0x000200F9, 0x00004C7A,\n    0x000200F8, 0x000019BA, 0x0004007C, 0x00000016, 0x00005BB6, 0x0000538B,\n    0x00050051, 0x0000000B, 0x00004916, 0x0000578A, 0x00000001, 0x00050051,\n    0x0000000C, 0x00005BEB, 0x00005BB6, 0x00000000, 0x00050084, 0x0000000C,\n    0x0000591A, 0x00005BEB, 0x00000A23, 0x00050051, 0x0000000C, 0x000018DA,\n    0x00005BB6, 0x00000002, 0x0004007C, 0x0000000C, 0x000038A9, 0x00004916,\n    0x00050084, 0x0000000C, 0x00002C0F, 0x000018DA, 0x000038A9, 0x00050051,\n    0x0000000C, 0x000044BE, 0x00005BB6, 0x00000001, 0x00050080, 0x0000000C,\n    0x000056D4, 0x00002C0F, 0x000044BE, 0x0004007C, 0x0000000C, 0x00005785,\n    0x000019C2, 0x00050084, 0x0000000C, 0x00005FD7, 0x000056D4, 0x00005785,\n    0x00050080, 0x0000000C, 0x00002042, 0x0000591A, 0x00005FD7, 0x0004007C,\n    0x0000000B, 0x00002A92, 0x00002042, 0x00050080, 0x0000000B, 0x00001F01,\n    0x0000578B, 0x00002A92, 0x000500C2, 0x00000011, 0x00004DD1, 0x000042F0,\n    0x0000072D, 0x00050086, 0x00000011, 0x00001E20, 0x00004DD1, 0x00001997,\n    0x00050084, 0x00000011, 0x00004707, 0x00001997, 0x00001E20, 0x00050082,\n    0x00000011, 0x00004761, 0x00004DD1, 0x00004707, 0x000500C4, 0x00000011,\n    0x00002BE0, 0x00001E20, 0x0000072D, 0x00050051, 0x0000000B, 0x000033E4,\n    0x00004761, 0x00000000, 0x00050051, 0x0000000B, 0x00002A78, 0x00001997,\n    0x00000001, 0x00050084, 0x0000000B, 0x00005966, 0x000033E4, 0x00002A78,\n    0x00050051, 0x0000000B, 0x00001B1F, 0x00004761, 0x00000001, 0x00050080,\n    0x0000000B, 0x000028E5, 0x00005966, 0x00001B1F, 0x000500C7, 0x00000011,\n    0x000049A3, 0x000042F0, 0x00000736, 0x000500C4, 0x0000000B, 0x00002955,\n    0x000028E5, 0x00000A1C, 0x00050051, 0x0000000B, 0x000051B4, 0x000049A3,\n    0x00000001, 0x000500C4, 0x0000000B, 0x00005C2C, 0x000051B4, 0x00000A19,\n    0x000500C5, 0x0000000B, 0x00004D66, 0x00002955, 0x00005C2C, 0x00050051,\n    0x0000000B, 0x000053E4, 0x000049A3, 0x00000000, 0x000500C4, 0x0000000B,\n    0x00002170, 0x000053E4, 0x00000A13, 0x000500C5, 0x0000000B, 0x000044F0,\n    0x00004D66, 0x00002170, 0x00050051, 0x0000000B, 0x00004DD3, 0x00002BE0,\n    0x00000000, 0x00060052, 0x00000014, 0x00003CC4, 0x00004DD3, 0x0000538B,\n    0x00000000, 0x00050051, 0x0000000B, 0x000059DE, 0x00002BE0, 0x00000001,\n    0x00060052, 0x00000014, 0x000025D0, 0x000059DE, 0x00003CC4, 0x00000001,\n    0x000300F7, 0x00004F78, 0x00000002, 0x000400FA, 0x000048EB, 0x00005BE0,\n    0x00002DD9, 0x000200F8, 0x00005BE0, 0x0004007C, 0x00000016, 0x0000277F,\n    0x000025D0, 0x000500C2, 0x0000000B, 0x00004C14, 0x00005788, 0x00000A1A,\n    0x000500C2, 0x0000000B, 0x0000497A, 0x00005789, 0x00000A17, 0x00050051,\n    0x0000000C, 0x00001A7E, 0x0000277F, 0x00000002, 0x000500C3, 0x0000000C,\n    0x00002F39, 0x00001A7E, 0x00000A11, 0x0004007C, 0x0000000C, 0x00005780,\n    0x0000497A, 0x00050084, 0x0000000C, 0x00001F02, 0x00002F39, 0x00005780,\n    0x00050051, 0x0000000C, 0x00006242, 0x0000277F, 0x00000001, 0x000500C3,\n    0x0000000C, 0x00004A6F, 0x00006242, 0x00000A17, 0x00050080, 0x0000000C,\n    0x00002B2C, 0x00001F02, 0x00004A6F, 0x0004007C, 0x0000000C, 0x00004202,\n    0x00004C14, 0x00050084, 0x0000000C, 0x00003A60, 0x00002B2C, 0x00004202,\n    0x00050051, 0x0000000C, 0x00006243, 0x0000277F, 0x00000000, 0x000500C3,\n    0x0000000C, 0x00004FC7, 0x00006243, 0x00000A1A, 0x00050080, 0x0000000C,\n    0x000049FC, 0x00003A60, 0x00004FC7, 0x000500C4, 0x0000000C, 0x0000225D,\n    0x000049FC, 0x00000A20, 0x000500C7, 0x0000000C, 0x00002CAA, 0x00001A7E,\n    0x00000A14, 0x000500C4, 0x0000000C, 0x00004CAE, 0x00002CAA, 0x00000A1A,\n    0x000500C3, 0x0000000C, 0x0000383E, 0x00006242, 0x00000A0E, 0x000500C7,\n    0x0000000C, 0x00005374, 0x0000383E, 0x00000A14, 0x000500C4, 0x0000000C,\n    0x000054CA, 0x00005374, 0x00000A14, 0x000500C5, 0x0000000C, 0x000042CE,\n    0x00004CAE, 0x000054CA, 0x000500C7, 0x0000000C, 0x000050D5, 0x00006243,\n    0x00000A20, 0x000500C5, 0x0000000C, 0x00003ADD, 0x000042CE, 0x000050D5,\n    0x000500C5, 0x0000000C, 0x000043B6, 0x0000225D, 0x00003ADD, 0x000500C4,\n    0x0000000C, 0x00005E50, 0x000043B6, 0x00000A13, 0x000500C3, 0x0000000C,\n    0x000032D7, 0x00006242, 0x00000A14, 0x000500C6, 0x0000000C, 0x000026C9,\n    0x000032D7, 0x00002F39, 0x000500C7, 0x0000000C, 0x00004199, 0x000026C9,\n    0x00000A0E, 0x000500C3, 0x0000000C, 0x00002590, 0x00006243, 0x00000A14,\n    0x000500C7, 0x0000000C, 0x0000505E, 0x00002590, 0x00000A14, 0x000500C4,\n    0x0000000C, 0x0000541D, 0x00004199, 0x00000A0E, 0x000500C6, 0x0000000C,\n    0x000022BA, 0x0000505E, 0x0000541D, 0x000500C7, 0x0000000C, 0x00005076,\n    0x00006242, 0x00000A0E, 0x000500C4, 0x0000000C, 0x00005228, 0x00005076,\n    0x00000A17, 0x000500C4, 0x0000000C, 0x00001998, 0x000022BA, 0x00000A1D,\n    0x000500C5, 0x0000000C, 0x000047FE, 0x00005228, 0x00001998, 0x000500C4,\n    0x0000000C, 0x00001C00, 0x00004199, 0x00000A2C, 0x000500C5, 0x0000000C,\n    0x00003C81, 0x000047FE, 0x00001C00, 0x000500C7, 0x0000000C, 0x000050AF,\n    0x00005E50, 0x00000A38, 0x000500C5, 0x0000000C, 0x00003C70, 0x00003C81,\n    0x000050AF, 0x000500C3, 0x0000000C, 0x00003745, 0x00005E50, 0x00000A17,\n    0x000500C7, 0x0000000C, 0x000018B8, 0x00003745, 0x00000A0E, 0x000500C4,\n    0x0000000C, 0x0000547E, 0x000018B8, 0x00000A1A, 0x000500C5, 0x0000000C,\n    0x000045A8, 0x00003C70, 0x0000547E, 0x000500C3, 0x0000000C, 0x00003A6E,\n    0x00005E50, 0x00000A1A, 0x000500C7, 0x0000000C, 0x000018B9, 0x00003A6E,\n    0x00000A20, 0x000500C4, 0x0000000C, 0x0000547F, 0x000018B9, 0x00000A23,\n    0x000500C5, 0x0000000C, 0x0000456F, 0x000045A8, 0x0000547F, 0x000500C3,\n    0x0000000C, 0x00003C88, 0x00005E50, 0x00000A23, 0x000500C4, 0x0000000C,\n    0x00002824, 0x00003C88, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B79,\n    0x0000456F, 0x00002824, 0x0004007C, 0x0000000B, 0x000041E5, 0x00003B79,\n    0x000200F9, 0x00004F78, 0x000200F8, 0x00002DD9, 0x0007004F, 0x00000011,\n    0x00002E84, 0x000025D0, 0x000025D0, 0x00000000, 0x00000001, 0x0004007C,\n    0x00000012, 0x00004F7B, 0x00002E84, 0x000500C2, 0x0000000B, 0x00002CA9,\n    0x00005788, 0x00000A1A, 0x00050051, 0x0000000C, 0x00003905, 0x00004F7B,\n    0x00000001, 0x000500C3, 0x0000000C, 0x00002F3A, 0x00003905, 0x00000A1A,\n    0x0004007C, 0x0000000C, 0x00005781, 0x00002CA9, 0x00050084, 0x0000000C,\n    0x00001F03, 0x00002F3A, 0x00005781, 0x00050051, 0x0000000C, 0x00006244,\n    0x00004F7B, 0x00000000, 0x000500C3, 0x0000000C, 0x00004FC8, 0x00006244,\n    0x00000A1A, 0x00050080, 0x0000000C, 0x000049B0, 0x00001F03, 0x00004FC8,\n    0x000500C4, 0x0000000C, 0x0000254A, 0x000049B0, 0x00000A1D, 0x000500C3,\n    0x0000000C, 0x0000603B, 0x00003905, 0x00000A0E, 0x000500C7, 0x0000000C,\n    0x0000539A, 0x0000603B, 0x00000A20, 0x000500C4, 0x0000000C, 0x0000534A,\n    0x0000539A, 0x00000A14, 0x000500C7, 0x0000000C, 0x00004EA5, 0x00006244,\n    0x00000A20, 0x000500C5, 0x0000000C, 0x00002B1A, 0x0000534A, 0x00004EA5,\n    0x000500C5, 0x0000000C, 0x000043B7, 0x0000254A, 0x00002B1A, 0x000500C4,\n    0x0000000C, 0x00005E63, 0x000043B7, 0x00000A13, 0x000500C3, 0x0000000C,\n    0x000031DE, 0x00003905, 0x00000A17, 0x000500C7, 0x0000000C, 0x00005447,\n    0x000031DE, 0x00000A0E, 0x000500C3, 0x0000000C, 0x000028A6, 0x00006244,\n    0x00000A14, 0x000500C7, 0x0000000C, 0x0000511E, 0x000028A6, 0x00000A14,\n    0x000500C3, 0x0000000C, 0x000028B9, 0x00003905, 0x00000A14, 0x000500C7,\n    0x0000000C, 0x0000505F, 0x000028B9, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x0000541E, 0x0000505F, 0x00000A0E, 0x000500C6, 0x0000000C, 0x000022BB,\n    0x0000511E, 0x0000541E, 0x000500C7, 0x0000000C, 0x00005077, 0x00003905,\n    0x00000A0E, 0x000500C4, 0x0000000C, 0x00005229, 0x00005077, 0x00000A17,\n    0x000500C4, 0x0000000C, 0x00001999, 0x000022BB, 0x00000A1D, 0x000500C5,\n    0x0000000C, 0x000047FF, 0x00005229, 0x00001999, 0x000500C4, 0x0000000C,\n    0x00001C01, 0x00005447, 0x00000A2C, 0x000500C5, 0x0000000C, 0x00003C82,\n    0x000047FF, 0x00001C01, 0x000500C7, 0x0000000C, 0x000050B0, 0x00005E63,\n    0x00000A38, 0x000500C5, 0x0000000C, 0x00003C71, 0x00003C82, 0x000050B0,\n    0x000500C3, 0x0000000C, 0x00003746, 0x00005E63, 0x00000A17, 0x000500C7,\n    0x0000000C, 0x000018BA, 0x00003746, 0x00000A0E, 0x000500C4, 0x0000000C,\n    0x00005480, 0x000018BA, 0x00000A1A, 0x000500C5, 0x0000000C, 0x000045A9,\n    0x00003C71, 0x00005480, 0x000500C3, 0x0000000C, 0x00003A6F, 0x00005E63,\n    0x00000A1A, 0x000500C7, 0x0000000C, 0x000018BB, 0x00003A6F, 0x00000A20,\n    0x000500C4, 0x0000000C, 0x00005481, 0x000018BB, 0x00000A23, 0x000500C5,\n    0x0000000C, 0x00004570, 0x000045A9, 0x00005481, 0x000500C3, 0x0000000C,\n    0x00003C89, 0x00005E63, 0x00000A23, 0x000500C4, 0x0000000C, 0x00002825,\n    0x00003C89, 0x00000A2F, 0x000500C5, 0x0000000C, 0x00003B7A, 0x00004570,\n    0x00002825, 0x0004007C, 0x0000000B, 0x000041E6, 0x00003B7A, 0x000200F9,\n    0x00004F78, 0x000200F8, 0x00004F78, 0x000700F5, 0x0000000B, 0x00004799,\n    0x000041E5, 0x00005BE0, 0x000041E6, 0x00002DD9, 0x00050051, 0x0000000B,\n    0x00003B60, 0x00001997, 0x00000000, 0x00050084, 0x0000000B, 0x00004451,\n    0x00003B60, 0x00002A78, 0x00050084, 0x0000000B, 0x00001C91, 0x00004799,\n    0x00004451, 0x00050080, 0x0000000B, 0x0000226F, 0x00001C91, 0x000044F0,\n    0x00050080, 0x0000000B, 0x000053DE, 0x0000226F, 0x00005EAC, 0x000500C2,\n    0x0000000B, 0x00003948, 0x000053DE, 0x00000A17, 0x00060041, 0x00000294,\n    0x00004FAF, 0x0000107A, 0x00000A0B, 0x00003948, 0x0004003D, 0x00000017,\n    0x00001CAA, 0x00004FAF, 0x000500AA, 0x00000009, 0x000035C0, 0x0000619E,\n    0x00000A0D, 0x000500AA, 0x00000009, 0x00005376, 0x0000619E, 0x00000A10,\n    0x000500A6, 0x00000009, 0x00005686, 0x000035C0, 0x00005376, 0x000300F7,\n    0x00003463, 0x00000000, 0x000400FA, 0x00005686, 0x00002957, 0x00003463,\n    0x000200F8, 0x00002957, 0x000500C7, 0x00000017, 0x0000475F, 0x00001CAA,\n    0x000009CE, 0x000500C4, 0x00000017, 0x000024D1, 0x0000475F, 0x0000013D,\n    0x000500C7, 0x00000017, 0x000050AC, 0x00001CAA, 0x0000072E, 0x000500C2,\n    0x00000017, 0x0000448D, 0x000050AC, 0x0000013D, 0x000500C5, 0x00000017,\n    0x00003FF8, 0x000024D1, 0x0000448D, 0x000200F9, 0x00003463, 0x000200F8,\n    0x00003463, 0x000700F5, 0x00000017, 0x00005879, 0x00001CAA, 0x00004F78,\n    0x00003FF8, 0x00002957, 0x000500AA, 0x00000009, 0x00004CB6, 0x0000619E,\n    0x00000A13, 0x000500A6, 0x00000009, 0x00003B23, 0x00005376, 0x00004CB6,\n    0x000300F7, 0x0000362B, 0x00000000, 0x000400FA, 0x00003B23, 0x00002B38,\n    0x0000362B, 0x000200F8, 0x00002B38, 0x000500C4, 0x00000017, 0x00005E17,\n    0x00005879, 0x000002ED, 0x000500C2, 0x00000017, 0x00003BE7, 0x00005879,\n    0x000002ED, 0x000500C5, 0x00000017, 0x000029E8, 0x00005E17, 0x00003BE7,\n    0x000200F9, 0x0000362B, 0x000200F8, 0x0000362B, 0x000700F5, 0x00000017,\n    0x00004AB4, 0x00005879, 0x00003463, 0x000029E8, 0x00002B38, 0x000500C2,\n    0x0000000B, 0x00005FC1, 0x00001F01, 0x00000A17, 0x000500C7, 0x00000017,\n    0x00001CFC, 0x00004AB4, 0x00000352, 0x00040070, 0x0000001D, 0x00003F05,\n    0x00001CFC, 0x0005008E, 0x0000001D, 0x00004BA5, 0x00003F05, 0x0000092A,\n    0x000500C2, 0x00000017, 0x00005B47, 0x00004AB4, 0x000002ED, 0x00040070,\n    0x0000001D, 0x0000483C, 0x00005B47, 0x0005008E, 0x0000001D, 0x00004812,\n    0x0000483C, 0x0000092A, 0x00050051, 0x0000000D, 0x0000187C, 0x00004BA5,\n    0x00000000, 0x00050051, 0x0000000D, 0x000035EE, 0x00004812, 0x00000000,\n    0x00050050, 0x00000013, 0x00004B20, 0x0000187C, 0x000035EE, 0x0006000C,\n    0x0000000B, 0x00002171, 0x00000001, 0x0000003A, 0x00004B20, 0x00050051,\n    0x0000000D, 0x00005BBF, 0x00004BA5, 0x00000001, 0x00050051, 0x0000000D,\n    0x000039A7, 0x00004812, 0x00000001, 0x00050050, 0x00000013, 0x00004B21,\n    0x00005BBF, 0x000039A7, 0x0006000C, 0x0000000B, 0x00002172, 0x00000001,\n    0x0000003A, 0x00004B21, 0x00050051, 0x0000000D, 0x00005BC0, 0x00004BA5,\n    0x00000002, 0x00050051, 0x0000000D, 0x000039A8, 0x00004812, 0x00000002,\n    0x00050050, 0x00000013, 0x00004B22, 0x00005BC0, 0x000039A8, 0x0006000C,\n    0x0000000B, 0x00002173, 0x00000001, 0x0000003A, 0x00004B22, 0x00050051,\n    0x0000000D, 0x00005BC1, 0x00004BA5, 0x00000003, 0x00050051, 0x0000000D,\n    0x000039A9, 0x00004812, 0x00000003, 0x00050050, 0x00000013, 0x00004B0D,\n    0x00005BC1, 0x000039A9, 0x0006000C, 0x0000000B, 0x000020EE, 0x00000001,\n    0x0000003A, 0x00004B0D, 0x00070050, 0x00000017, 0x00003ABB, 0x00002171,\n    0x00002172, 0x00002173, 0x000020EE, 0x00060041, 0x00000294, 0x000045C3,\n    0x0000140E, 0x00000A0B, 0x00005FC1, 0x0003003E, 0x000045C3, 0x00003ABB,\n    0x00050080, 0x0000000B, 0x00005679, 0x00001F01, 0x00000A3A, 0x00050080,\n    0x0000000B, 0x000027E6, 0x000053DE, 0x00000A3A, 0x000500C2, 0x0000000B,\n    0x00003949, 0x000027E6, 0x00000A17, 0x00060041, 0x00000294, 0x00005566,\n    0x0000107A, 0x00000A0B, 0x00003949, 0x0004003D, 0x00000017, 0x00003910,\n    0x00005566, 0x000300F7, 0x00003A1A, 0x00000000, 0x000400FA, 0x00005686,\n    0x00002958, 0x00003A1A, 0x000200F8, 0x00002958, 0x000500C7, 0x00000017,\n    0x00004760, 0x00003910, 0x000009CE, 0x000500C4, 0x00000017, 0x000024D2,\n    0x00004760, 0x0000013D, 0x000500C7, 0x00000017, 0x000050AD, 0x00003910,\n    0x0000072E, 0x000500C2, 0x00000017, 0x0000448E, 0x000050AD, 0x0000013D,\n    0x000500C5, 0x00000017, 0x00003FF9, 0x000024D2, 0x0000448E, 0x000200F9,\n    0x00003A1A, 0x000200F8, 0x00003A1A, 0x000700F5, 0x00000017, 0x00002AAC,\n    0x00003910, 0x0000362B, 0x00003FF9, 0x00002958, 0x000300F7, 0x0000362C,\n    0x00000000, 0x000400FA, 0x00003B23, 0x00002B39, 0x0000362C, 0x000200F8,\n    0x00002B39, 0x000500C4, 0x00000017, 0x00005E18, 0x00002AAC, 0x000002ED,\n    0x000500C2, 0x00000017, 0x00003BE8, 0x00002AAC, 0x000002ED, 0x000500C5,\n    0x00000017, 0x000029E9, 0x00005E18, 0x00003BE8, 0x000200F9, 0x0000362C,\n    0x000200F8, 0x0000362C, 0x000700F5, 0x00000017, 0x00004AB5, 0x00002AAC,\n    0x00003A1A, 0x000029E9, 0x00002B39, 0x000500C2, 0x0000000B, 0x00005FC2,\n    0x00005679, 0x00000A17, 0x000500C7, 0x00000017, 0x00001CFD, 0x00004AB5,\n    0x00000352, 0x00040070, 0x0000001D, 0x00003F06, 0x00001CFD, 0x0005008E,\n    0x0000001D, 0x00004BA6, 0x00003F06, 0x0000092A, 0x000500C2, 0x00000017,\n    0x00005B48, 0x00004AB5, 0x000002ED, 0x00040070, 0x0000001D, 0x0000483D,\n    0x00005B48, 0x0005008E, 0x0000001D, 0x00004813, 0x0000483D, 0x0000092A,\n    0x00050051, 0x0000000D, 0x0000187D, 0x00004BA6, 0x00000000, 0x00050051,\n    0x0000000D, 0x000035EF, 0x00004813, 0x00000000, 0x00050050, 0x00000013,\n    0x00004B23, 0x0000187D, 0x000035EF, 0x0006000C, 0x0000000B, 0x00002174,\n    0x00000001, 0x0000003A, 0x00004B23, 0x00050051, 0x0000000D, 0x00005BC2,\n    0x00004BA6, 0x00000001, 0x00050051, 0x0000000D, 0x000039AA, 0x00004813,\n    0x00000001, 0x00050050, 0x00000013, 0x00004B24, 0x00005BC2, 0x000039AA,\n    0x0006000C, 0x0000000B, 0x00002175, 0x00000001, 0x0000003A, 0x00004B24,\n    0x00050051, 0x0000000D, 0x00005BC3, 0x00004BA6, 0x00000002, 0x00050051,\n    0x0000000D, 0x000039AB, 0x00004813, 0x00000002, 0x00050050, 0x00000013,\n    0x00004B25, 0x00005BC3, 0x000039AB, 0x0006000C, 0x0000000B, 0x00002176,\n    0x00000001, 0x0000003A, 0x00004B25, 0x00050051, 0x0000000D, 0x00005BC4,\n    0x00004BA6, 0x00000003, 0x00050051, 0x0000000D, 0x000039AC, 0x00004813,\n    0x00000003, 0x00050050, 0x00000013, 0x00004B0E, 0x00005BC4, 0x000039AC,\n    0x0006000C, 0x0000000B, 0x000020EF, 0x00000001, 0x0000003A, 0x00004B0E,\n    0x00070050, 0x00000017, 0x00003ABC, 0x00002174, 0x00002175, 0x00002176,\n    0x000020EF, 0x00060041, 0x00000294, 0x00004EBE, 0x0000140E, 0x00000A0B,\n    0x00005FC2, 0x0003003E, 0x00004EBE, 0x00003ABC, 0x000200F9, 0x00004C7A,\n    0x000200F8, 0x00004C7A, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/gpu/shaders/clear_uint2.ps.hlsl",
    "content": "cbuffer XeClearConstants : register(b0) {\n  uint2 xe_clear_value;\n};\n\nuint2 main() : SV_Target {\n  return xe_clear_value;\n}\n"
  },
  {
    "path": "src/xenia/gpu/shaders/continuous_quad.hlsli",
    "content": "#include \"xenos_draw.hlsli\"\n\nstruct XeHSConstantDataOutput {\n  float edges[4] : SV_TessFactor;\n  float inside[2] : SV_InsideTessFactor;\n};\n\nXeHSConstantDataOutput XePatchConstant() {\n  XeHSConstantDataOutput output = (XeHSConstantDataOutput)0;\n  uint i;\n\n  // 1.0 already added to the factor on the CPU, according to the images in\n  // https://www.slideshare.net/blackdevilvikas/next-generation-graphics-programming-on-xbox-360\n  // (fractional_even also requires a factor of at least 2.0).\n\n  // Don't calculate any variables for SV_TessFactor outside of this loop, or\n  // everything will be broken - FXC will add code to make it calculated only\n  // once for all 4 fork instances, but doesn't do it properly.\n  [unroll] for (i = 0u; i < 4u; ++i) {\n    output.edges[i] = xe_tessellation_factor_range.y;\n  }\n\n  // Don't calculate any variables for SV_InsideTessFactor outside of this loop,\n  // or everything will be broken - FXC will add code to make it calculated only\n  // once for all 2 fork instances, but doesn't do it properly.\n  [unroll] for (i = 0u; i < 2u; ++i) {\n    output.inside[i] = xe_tessellation_factor_range.y;\n  }\n\n  return output;\n}\n\n[domain(\"quad\")]\n[partitioning(\"fractional_even\")]\n[outputtopology(\"triangle_cw\")]\n[outputcontrolpoints(XE_TESSELLATION_CONTROL_POINT_COUNT)]\n[patchconstantfunc(\"XePatchConstant\")]\nXeHSControlPointOutput main(\n    InputPatch<XeHSControlPointInputIndexed,\n               XE_TESSELLATION_CONTROL_POINT_COUNT> xe_input_patch,\n    uint xe_control_point_id : SV_OutputControlPointID) {\n  XeHSControlPointOutput output;\n  output.index = xe_input_patch[xe_control_point_id].index;\n  return output;\n}\n"
  },
  {
    "path": "src/xenia/gpu/shaders/continuous_quad_1cp.hs.hlsl",
    "content": "#define XE_TESSELLATION_CONTROL_POINT_COUNT 1\n#include \"continuous_quad.hlsli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/continuous_quad_4cp.hs.hlsl",
    "content": "#define XE_TESSELLATION_CONTROL_POINT_COUNT 4\n#include \"continuous_quad.hlsli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/continuous_triangle.hlsli",
    "content": "#include \"xenos_draw.hlsli\"\n\nstruct XeHSConstantDataOutput {\n  float edges[3] : SV_TessFactor;\n  float inside : SV_InsideTessFactor;\n};\n\nXeHSConstantDataOutput XePatchConstant() {\n  XeHSConstantDataOutput output = (XeHSConstantDataOutput)0;\n  uint i;\n\n  // 1.0 already added to the factor on the CPU, according to the images in\n  // https://www.slideshare.net/blackdevilvikas/next-generation-graphics-programming-on-xbox-360\n  // (fractional_even also requires a factor of at least 2.0).\n\n  // Don't calculate any variables for SV_TessFactor outside of this loop, or\n  // everything will be broken - FXC will add code to make it calculated only\n  // once for all 3 fork instances, but doesn't do it properly.\n  [unroll] for (i = 0u; i < 3u; ++i) {\n    output.edges[i] = xe_tessellation_factor_range.y;\n  }\n\n  output.inside = xe_tessellation_factor_range.y;\n\n  return output;\n}\n\n[domain(\"tri\")]\n[partitioning(\"fractional_even\")]\n[outputtopology(\"triangle_cw\")]\n[outputcontrolpoints(XE_TESSELLATION_CONTROL_POINT_COUNT)]\n[patchconstantfunc(\"XePatchConstant\")]\nXeHSControlPointOutput main(\n    InputPatch<XeHSControlPointInputIndexed,\n               XE_TESSELLATION_CONTROL_POINT_COUNT> xe_input_patch,\n    uint xe_control_point_id : SV_OutputControlPointID) {\n  XeHSControlPointOutput output;\n  output.index = xe_input_patch[xe_control_point_id].index;\n  return output;\n}\n"
  },
  {
    "path": "src/xenia/gpu/shaders/continuous_triangle_1cp.hs.hlsl",
    "content": "#define XE_TESSELLATION_CONTROL_POINT_COUNT 1\n#include \"continuous_triangle.hlsli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/continuous_triangle_3cp.hs.hlsl",
    "content": "#define XE_TESSELLATION_CONTROL_POINT_COUNT 3\n#include \"continuous_triangle.hlsli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/discrete_quad.hlsli",
    "content": "#include \"xenos_draw.hlsli\"\n\nstruct XeHSConstantDataOutput {\n  float edges[4] : SV_TessFactor;\n  float inside[2] : SV_InsideTessFactor;\n};\n\nXeHSConstantDataOutput XePatchConstant() {\n  XeHSConstantDataOutput output = (XeHSConstantDataOutput)0;\n  uint i;\n\n  // 1.0 already added to the factor on the CPU, according to the images in\n  // https://www.slideshare.net/blackdevilvikas/next-generation-graphics-programming-on-xbox-360\n  // (fractional_even also requires a factor of at least 2.0).\n\n  // Don't calculate any variables for SV_TessFactor outside of this loop, or\n  // everything will be broken - FXC will add code to make it calculated only\n  // once for all 4 fork instances, but doesn't do it properly.\n  [unroll] for (i = 0u; i < 4u; ++i) {\n    output.edges[i] = xe_tessellation_factor_range.y;\n  }\n\n  // Don't calculate any variables for SV_InsideTessFactor outside of this loop,\n  // or everything will be broken - FXC will add code to make it calculated only\n  // once for all 2 fork instances, but doesn't do it properly.\n  [unroll] for (i = 0u; i < 2u; ++i) {\n    output.inside[i] = xe_tessellation_factor_range.y;\n  }\n\n  return output;\n}\n\n[domain(\"quad\")]\n[partitioning(\"integer\")]\n[outputtopology(\"triangle_cw\")]\n[outputcontrolpoints(XE_TESSELLATION_CONTROL_POINT_COUNT)]\n[patchconstantfunc(\"XePatchConstant\")]\nXeHSControlPointOutput main(\n    InputPatch<XeHSControlPointInputIndexed,\n               XE_TESSELLATION_CONTROL_POINT_COUNT> xe_input_patch,\n    uint xe_control_point_id : SV_OutputControlPointID) {\n  XeHSControlPointOutput output;\n  output.index = xe_input_patch[xe_control_point_id].index;\n  return output;\n}\n"
  },
  {
    "path": "src/xenia/gpu/shaders/discrete_quad_1cp.hs.hlsl",
    "content": "#define XE_TESSELLATION_CONTROL_POINT_COUNT 1\n#include \"discrete_quad.hlsli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/discrete_quad_4cp.hs.hlsl",
    "content": "#define XE_TESSELLATION_CONTROL_POINT_COUNT 4\n#include \"discrete_quad.hlsli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/discrete_triangle.hlsli",
    "content": "#include \"xenos_draw.hlsli\"\n\nstruct XeHSConstantDataOutput {\n  float edges[3] : SV_TessFactor;\n  float inside : SV_InsideTessFactor;\n};\n\nXeHSConstantDataOutput XePatchConstant() {\n  XeHSConstantDataOutput output = (XeHSConstantDataOutput)0;\n  uint i;\n\n  // Xenos creates a uniform grid for triangles, but this can't be reproduced\n  // using the tessellator on the PC, so just use what has the closest level of\n  // detail.\n  // https://www.slideshare.net/blackdevilvikas/next-generation-graphics-programming-on-xbox-360\n\n  // 1.0 already added to the factor on the CPU, according to the images in the\n  // slides above.\n\n  // Don't calculate any variables for SV_TessFactor outside of this loop, or\n  // everything will be broken - FXC will add code to make it calculated only\n  // once for all 3 fork instances, but doesn't do it properly.\n  [unroll] for (i = 0u; i < 3u; ++i) {\n    output.edges[i] = xe_tessellation_factor_range.y;\n  }\n\n  output.inside = xe_tessellation_factor_range.y;\n\n  return output;\n}\n\n[domain(\"tri\")]\n[partitioning(\"integer\")]\n[outputtopology(\"triangle_cw\")]\n[outputcontrolpoints(XE_TESSELLATION_CONTROL_POINT_COUNT)]\n[patchconstantfunc(\"XePatchConstant\")]\nXeHSControlPointOutput main(\n    InputPatch<XeHSControlPointInputIndexed,\n               XE_TESSELLATION_CONTROL_POINT_COUNT> xe_input_patch,\n    uint xe_control_point_id : SV_OutputControlPointID) {\n  XeHSControlPointOutput output;\n  output.index = xe_input_patch[xe_control_point_id].index;\n  return output;\n}\n"
  },
  {
    "path": "src/xenia/gpu/shaders/discrete_triangle_1cp.hs.hlsl",
    "content": "#define XE_TESSELLATION_CONTROL_POINT_COUNT 1\n#include \"discrete_triangle.hlsli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/discrete_triangle_3cp.hs.hlsl",
    "content": "#define XE_TESSELLATION_CONTROL_POINT_COUNT 3\n#include \"discrete_triangle.hlsli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/edram.xesli",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_SHADERS_EDRAM_XESLI_\n#define XENIA_GPU_SHADERS_EDRAM_XESLI_\n\n#include \"pixel_formats.xesli\"\n\n#define kXenosMsaaSamples_1X 0u\n#define kXenosMsaaSamples_2X 1u\n#define kXenosMsaaSamples_4X 2u\n\n// `wrap = false` can be used if it's known that the resulting tile indices\n// can't exceed 11 bits, and the modulo operator doesn't need to be performed to\n// access the data in the render targets that are located in both ends of the\n// EDRAM at the same time.\nuint XeEdramOffsetBytes(uint2_xe pixel_index, uint base_tiles, bool wrap,\n                        uint pitch_tiles, uint msaa_samples, bool is_depth,\n                        uint format_ints_log2, uint pixel_sample_index,\n                        uint2_xe resolution_scale) {\n  uint2_xe rt_sample_index =\n      pixel_index <<\n      uint2_xe(greater_than_equal_xe(\n          uint_x2_xe(msaa_samples),\n          uint2_xe(kXenosMsaaSamples_4X, kXenosMsaaSamples_2X)));\n  rt_sample_index += (uint_x2_xe(pixel_sample_index) >> uint2_xe(1u, 0u)) & 1u;\n  // For now, while the actual storage of 64bpp render targets in comparison to\n  // 32bpp is not known, storing 40x16 64bpp samples per tile for simplicity of\n  // addressing in different scenarios.\n  uint2_xe tile_size_at_32bpp = uint2_xe(80u, 16u) * resolution_scale;\n  uint2_xe tile_size_samples =\n      tile_size_at_32bpp >> uint2_xe(format_ints_log2, 0u);\n  uint2_xe tile_offset_xy = rt_sample_index / tile_size_samples;\n  base_tiles += tile_offset_xy.y * pitch_tiles + tile_offset_xy.x;\n  rt_sample_index -= tile_offset_xy * tile_size_samples;\n  if (is_depth) {\n    uint tile_width_half = tile_size_samples.x >> 1u;\n    rt_sample_index.x =\n        uint(int(rt_sample_index.x) +\n             ((rt_sample_index.x >= tile_width_half) ? -int(tile_width_half)\n                                                     : int(tile_width_half)));\n  }\n  uint address =\n      base_tiles * (tile_size_at_32bpp.x * tile_size_at_32bpp.y) +\n      ((rt_sample_index.y * tile_size_samples.x + rt_sample_index.x) <<\n       format_ints_log2);\n  if (wrap) {\n    // EDRAM addressing is periodic (modulo the EDRAM size).\n    address %= tile_size_at_32bpp.x * tile_size_at_32bpp.y * 2048u;\n  }\n  return address << 2;\n}\n\n#endif  // XENIA_GPU_SHADERS_EDRAM_XESLI_\n"
  },
  {
    "path": "src/xenia/gpu/shaders/endian.xesli",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_SHADERS_ENDIAN_XESLI_\n#define XENIA_GPU_SHADERS_ENDIAN_XESLI_\n\n#include \"../../ui/shaders/xesl.xesli\"\n\n// 2-bit (xenos::Endian) and 3-bit (xenos::Endian128).\n#define kXenosEndian_None 0u\n#define kXenosEndian_8in16 1u\n#define kXenosEndian_8in32 2u\n#define kXenosEndian_16in32 3u\n// 3-bit only.\n#define kXenosEndian_8in64 4u\n#define kXenosEndian_8in128 5u\n\n// Can also swap two packed 16-bit values.\n#define XE_ENDIAN_SWAP_16_OVERLOAD(XeEndianSwapType) \\\nXeEndianSwapType XeEndianSwap16(XeEndianSwapType value, uint endian) { \\\n  if (endian == kXenosEndian_8in16) { \\\n    value = ((value & 0x00FF00FFu) << 8u) | ((value & 0xFF00FF00u) >> 8u); \\\n  } \\\n  return value; \\\n}\nXE_ENDIAN_SWAP_16_OVERLOAD(uint)\nXE_ENDIAN_SWAP_16_OVERLOAD(uint2_xe)\nXE_ENDIAN_SWAP_16_OVERLOAD(uint3_xe)\nXE_ENDIAN_SWAP_16_OVERLOAD(uint4_xe)\n\n#define XE_ENDIAN_SWAP_32_OVERLOAD(XeEndianSwapType) \\\nXeEndianSwapType XeEndianSwap32(XeEndianSwapType value, uint endian) { \\\n  if (endian == kXenosEndian_8in16 || endian == kXenosEndian_8in32) { \\\n    value = ((value & 0x00FF00FFu) << 8u) | ((value & 0xFF00FF00u) >> 8u); \\\n  } \\\n  if (endian == kXenosEndian_8in32 || endian == kXenosEndian_16in32) { \\\n    value = (value << 16u) | (value >> 16u); \\\n  } \\\n  return value; \\\n}\nXE_ENDIAN_SWAP_32_OVERLOAD(uint)\nXE_ENDIAN_SWAP_32_OVERLOAD(uint2_xe)\nXE_ENDIAN_SWAP_32_OVERLOAD(uint3_xe)\nXE_ENDIAN_SWAP_32_OVERLOAD(uint4_xe)\n\nuint2_xe XeEndianSwap64(uint2_xe value, uint endian) {\n  if (endian == kXenosEndian_8in64) {\n    value = value.yx;\n    endian = kXenosEndian_8in32;\n  }\n  return XeEndianSwap32(value, endian);\n}\n\nuint4_xe XeEndianSwap64(uint4_xe value, uint endian) {\n  if (endian == kXenosEndian_8in64) {\n    value = value.yxwz;\n    endian = kXenosEndian_8in32;\n  }\n  return XeEndianSwap32(value, endian);\n}\n\nuint4_xe XeEndianSwap128(uint4_xe value, uint endian) {\n  if (endian == kXenosEndian_8in128) {\n    value = value.wzyx;\n    endian = kXenosEndian_8in32;\n  }\n  return XeEndianSwap64(value, endian);\n}\n\n#endif  // XENIA_GPU_SHADERS_ENDIAN_XESLI_\n"
  },
  {
    "path": "src/xenia/gpu/shaders/float24_round.ps.hlsl",
    "content": "#include \"pixel_formats.xesli\"\n#include \"xenos_draw.hlsli\"\n\nstruct XePSInput {\n  XeVertexPrePS pre_ps;\n  sample float4 position : SV_Position;\n};\n\nprecise float main(XePSInput xe_input) : SV_Depth {\n  // Input Z may be outside the viewport range (it's clamped after the shader).\n  // Assuming that 0...0.5 on the host corresponds to 0...1 on the guest, to\n  // allow for safe reinterpretation of any 24-bit value to and from float24\n  // depth using depth output without unrestricted depth range.\n  return asfloat(XeFloat20e4To32(\n      XeFloat32To20e4(asuint(saturate(xe_input.position.z * 2.0f)), true),\n      true));\n}\n"
  },
  {
    "path": "src/xenia/gpu/shaders/float24_truncate.ps.hlsl",
    "content": "#include \"pixel_formats.xesli\"\n#include \"xenos_draw.hlsli\"\n\nstruct XePSInput {\n  XeVertexPrePS pre_ps;\n  sample float4 position : SV_Position;\n};\n\nprecise float main(XePSInput xe_input) : SV_DepthLessEqual {\n  // Simplified conversion, always less than or equal to the original value -\n  // just drop the lower bits.\n  // The float32 exponent bias is 127.\n  // After saturating, the exponent range is -127...0.\n  // The smallest normalized 20e4 exponent is -14 - should drop 3 mantissa bits\n  // at -14 or above.\n  // The smallest denormalized 20e4 number is -34 - should drop 23 mantissa bits\n  // at -34.\n  // Anything smaller than 2^-34 becomes 0.\n  // Input Z may be outside the viewport range (it's clamped after the shader).\n  // Assuming that 0...0.5 on the host corresponds to 0...1 on the guest, to\n  // allow for safe reinterpretation of any 24-bit value to and from float24\n  // depth using depth output without unrestricted depth range.\n  precise uint depth = asuint(saturate(xe_input.position.z * 2.0f));\n  // Check if the number is representable as a float24 after truncation - the\n  // exponent is at least -34.\n  if (depth >= 0x2E800000u) {\n    // Extract the biased float32 exponent:\n    // 113+ at exponent -14+.\n    // 93 at exponent -34.\n    uint exponent = (depth >> 23u) & 0xFFu;\n    // Convert exponent to the shift amount.\n    // 116 - 113 = 3.\n    // 116 - 93 = 23.\n    uint shift = asuint(max(116 - asint(exponent), 3));\n    depth = depth >> shift << shift;\n  } else {\n    // The number is not representable as float24 after truncation - zero.\n    depth = 0u;\n  }\n  return asfloat(depth) * 0.5f;\n}\n"
  },
  {
    "path": "src/xenia/gpu/shaders/fullscreen_cw.vs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"../../ui/shaders/xesl.xesli\"\n\n// A clockwise triangle covering the whole viewport.\n\nentry_outputs_begin_xe\n  entry_out_position_xe\nentry_outputs_end_stage_inputs_begin_xe\nentry_stage_inputs_end_bindings_begin_vertex_xe\nentry_bindings_empty_end_inputs_begin_xe\n  entry_in_vertex_id_xe\nentry_inputs_end_code_begin_xe\n{\n  out_position_xe = float4_xe(\n      float2_xe((uint_x2_xe(in_vertex_id_xe) >> uint2_xe(0u, 1u)) & 1u) *\n          float2_xe(4.0f, 4.0f * NDC_DIRECTION_Y_XE) +\n          float2_xe(-1.0f, -NDC_DIRECTION_Y_XE),\n      0.0f, 1.0f);\n}\nentry_code_end_xe\n"
  },
  {
    "path": "src/xenia/gpu/shaders/fxaa.cs.hlsl",
    "content": "#define FXAA_QUALITY__PRESET 12\n#define FXAA_QUALITY__SUBPIX 0.75f\n#define FXAA_QUALITY__EDGE_THRESHOLD 0.166f\n#define FXAA_QUALITY__EDGE_THRESHOLD_MIN 0.0833f\n#include \"fxaa.hlsli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/fxaa.hlsli",
    "content": "// Inputs:\n// - FXAA_QUALITY__PRESET\n// - FXAA_QUALITY__SUBPIX\n// - FXAA_QUALITY__EDGE_THRESHOLD\n// - FXAA_QUALITY__EDGE_THRESHOLD_MIN\n\n// \"use of potentially uninitialized variable\" in FxaaPixelShader due to the\n// early exit with a `return` in the beginning of the function, caused by a bug\n// in FXC (the warning is common for early exiting in HLSL in general).\n#pragma warning(disable: 4000)\n\ncbuffer XeApplyGammaRampConstants : register(b0) {\n  uint2 xe_fxaa_size;\n  float2 xe_fxaa_size_inv;\n};\n\nRWTexture2D<unorm float4> xe_fxaa_dest : register(u0);\nTexture2D<float4> xe_fxaa_source : register(t0);\nSamplerState xe_sampler_linear_clamp : register(s0);\n\n#define FXAA_PC 1\n#define FXAA_HLSL_5 1\n#include \"../../../../third_party/fxaa/FXAA3_11.h\"\n\n[numthreads(16, 8, 1)]\nvoid main(uint3 xe_thread_id : SV_DispatchThreadID) {\n  [branch] if (any(xe_thread_id.xy >= xe_fxaa_size)) {\n    return;\n  }\n  FxaaTex fxaa_texture;\n  fxaa_texture.smpl = xe_sampler_linear_clamp;\n  fxaa_texture.tex = xe_fxaa_source;\n  // Force alpha to 1 to simplify calculations, won't need it anymore anyway.\n  xe_fxaa_dest[xe_thread_id.xy] =\n      float4(\n          FxaaPixelShader(\n              (float2(xe_thread_id.xy) + 0.5f) * xe_fxaa_size_inv,\n              (float2(xe_thread_id.xy).xyxy + float2(0.0f, 1.0f).xxyy) *\n                  xe_fxaa_size_inv.xyxy,\n              fxaa_texture, fxaa_texture, fxaa_texture, xe_fxaa_size_inv,\n              float2(-0.5f, 0.5f).xxyy * xe_fxaa_size_inv.xyxy,\n              float2(-2.0f, 2.0f).xxyy * xe_fxaa_size_inv.xyxy,\n              float2(8.0f, -4.0f).xxyy * xe_fxaa_size_inv.xyxy,\n              FXAA_QUALITY__SUBPIX, FXAA_QUALITY__EDGE_THRESHOLD,\n              FXAA_QUALITY__EDGE_THRESHOLD_MIN, 8.0f, 0.125f, 0.05f,\n              float4(1.0f, -1.0f, 0.25f, -0.25f)).rgb,\n          1.0f);\n}\n"
  },
  {
    "path": "src/xenia/gpu/shaders/fxaa_extreme.cs.hlsl",
    "content": "#define FXAA_QUALITY__PRESET 39\n#define FXAA_QUALITY__SUBPIX 1.0f\n#define FXAA_QUALITY__EDGE_THRESHOLD 0.063f\n#define FXAA_QUALITY__EDGE_THRESHOLD_MIN 0.0312f\n#include \"fxaa.hlsli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/host_depth_store.xesli",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_SHADERS_HOST_DEPTH_STORE_XESLI_\n#define XENIA_GPU_SHADERS_HOST_DEPTH_STORE_XESLI_\n\n#include \"../../ui/shaders/xesl.xesli\"\n\npush_const_begin_xe(b0, space0)\n  uint xe_host_depth_store_rectangle;\n  uint xe_host_depth_store_render_target;\npush_const_end_xe\n\n#define XE_HOST_DEPTH_STORE_PUSH_CONSTANTS_BINDING \\\n    push_const_binding_xe(buffer(0))\n\nuint2_xe XeHostDepthStoreRectUnscaledOrigin(uint rect_constant) {\n  return ((uint_x2_xe(rect_constant) >> uint2_xe(0u, 10u)) & 0x3FFu) << 3u;\n}\n\nuint XeHostDepthStoreRectUnscaledWidthDiv8(uint rect_constant) {\n  // The width divided by 8 minus 1 is stored.\n  return ((rect_constant >> 20u) & 0x3FFu) + 1u;\n}\n\nuint2_xe XeHostDepthStoreRTResolutionScale(uint rt_constant) {\n  return (uint_x2_xe(rt_constant) >> uint2_xe(10u, 13u)) & 0x7u;\n}\n\n// As host depth is needed for at most one transfer destination per update, base\n// is not passed to the shader - (0, 0) of the render target is at 0 of the\n// destination buffer.\n\nuint XeHostDepthStoreRTPitchTiles(uint rt_constant) {\n  return rt_constant & 0x3FFu;\n}\n\nbool XeHostDepthStoreRTMsaa2xSupported(uint rt_constant) {\n  return bool((rt_constant >> 16u) & 0x1u);\n}\n\n// 40-sample columns are not swapped for addressing simplicity (because this is\n// used for depth -> depth transfers, where swapping isn't needed).\n\n#endif  // XENIA_GPU_SHADERS_HOST_DEPTH_STORE_XESLI_\n"
  },
  {
    "path": "src/xenia/gpu/shaders/host_depth_store_1xmsaa.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"edram.xesli\"\n#include \"host_depth_store.xesli\"\n\nbyte_buffer_align16_wo_declare_xe(xe_host_depth_store_dest, set=0, binding=0,\n                                  u0, space0)\n#define LOCAL_SIZE_X_XE 8\n#define LOCAL_SIZE_Y_XE 8\n#define LOCAL_SIZE_Z_XE 1\nentry_bindings_begin_compute_xe\n  XE_HOST_DEPTH_STORE_PUSH_CONSTANTS_BINDING\n  entry_binding_next_xe\n  byte_buffer_wo_binding_xe(xe_host_depth_store_dest, buffer(1))\n  entry_binding_next_xe\n  texture_xe(texture_2d_xe, xe_host_depth_store_source, set=1, binding=0, t0,\n             space0, texture(0))\nentry_bindings_end_inputs_begin_compute_xe\n  entry_in_global_thread_id_xe\nentry_inputs_end_code_begin_compute_xe\n{\n  // 1 thread = 8 samples (same as resolve granularity).\n  uint rect_constant = push_const_xe(xe_host_depth_store_rectangle);\n  uint rt_constant = push_const_xe(xe_host_depth_store_render_target);\n  uint2_xe resolution_scale = XeHostDepthStoreRTResolutionScale(rt_constant);\n  // Group height can't cross resolve granularity, Y overflow check not needed.\n  dont_flatten_xe\n  if (in_global_thread_id_xe.x >=\n      (XeHostDepthStoreRectUnscaledWidthDiv8(rect_constant) *\n       resolution_scale.x)) {\n    return;\n  }\n  int2_xe pixel_index = int2_xe(\n      XeHostDepthStoreRectUnscaledOrigin(rect_constant) * resolution_scale +\n      (in_global_thread_id_xe.xy << uint2_xe(3u, 0u)));\n  uint edram_address = XeEdramOffsetBytes(\n      uint2_xe(pixel_index), 0u, false,\n      XeHostDepthStoreRTPitchTiles(rt_constant), kXenosMsaaSamples_1X, false,\n      0u, 0u, resolution_scale);\n  byte_buffer_align16_store16_xe(\n      xe_host_depth_store_dest, edram_address,\n      float_bits_to_uint_xe(float4_xe(\n          texel_fetch_2d_xe(xe_host_depth_store_source, pixel_index, 0).r,\n          texel_fetch_2d_xe(xe_host_depth_store_source,\n                            pixel_index + int2_xe(1, 0), 0).r,\n          texel_fetch_2d_xe(xe_host_depth_store_source,\n                            pixel_index + int2_xe(2, 0), 0).r,\n          texel_fetch_2d_xe(xe_host_depth_store_source,\n                            pixel_index + int2_xe(3, 0), 0).r)));\n  byte_buffer_align16_store16_xe(\n      xe_host_depth_store_dest, edram_address + 16u,\n      float_bits_to_uint_xe(float4_xe(\n          texel_fetch_2d_xe(xe_host_depth_store_source,\n                            pixel_index + int2_xe(4, 0), 0).r,\n          texel_fetch_2d_xe(xe_host_depth_store_source,\n                            pixel_index + int2_xe(5, 0), 0).r,\n          texel_fetch_2d_xe(xe_host_depth_store_source,\n                            pixel_index + int2_xe(6, 0), 0).r,\n          texel_fetch_2d_xe(xe_host_depth_store_source,\n                            pixel_index + int2_xe(7, 0), 0).r)));\n}\nentry_code_end_compute_xe\n"
  },
  {
    "path": "src/xenia/gpu/shaders/host_depth_store_2xmsaa.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"edram.xesli\"\n#include \"host_depth_store.xesli\"\n\nbyte_buffer_align16_wo_declare_xe(xe_host_depth_store_dest, set=0, binding=0,\n                                  u0, space0)\n#define LOCAL_SIZE_X_XE 8\n#define LOCAL_SIZE_Y_XE 8\n#define LOCAL_SIZE_Z_XE 1\nentry_bindings_begin_compute_xe\n  XE_HOST_DEPTH_STORE_PUSH_CONSTANTS_BINDING\n  entry_binding_next_xe\n  byte_buffer_wo_binding_xe(xe_host_depth_store_dest, buffer(1))\n  entry_binding_next_xe\n  texture_xe(texture_2d_ms_xe, xe_host_depth_store_source, set=1, binding=0,\n             t0, space0, texture(0))\nentry_bindings_end_inputs_begin_compute_xe\n  entry_in_global_thread_id_xe\nentry_inputs_end_code_begin_compute_xe\n{\n  // 1 thread = 8 samples (8x0.5 pixels, resolve granularity is 8 pixels).\n  uint rect_constant = push_const_xe(xe_host_depth_store_rectangle);\n  uint rt_constant = push_const_xe(xe_host_depth_store_render_target);\n  uint2_xe resolution_scale = XeHostDepthStoreRTResolutionScale(rt_constant);\n  // Group height can't cross resolve granularity, Y overflow check not needed.\n  dont_flatten_xe\n  if (in_global_thread_id_xe.x >=\n      (XeHostDepthStoreRectUnscaledWidthDiv8(rect_constant) *\n       resolution_scale.x)) {\n    return;\n  }\n  int2_xe pixel_index = int2_xe(\n      XeHostDepthStoreRectUnscaledOrigin(rect_constant) * resolution_scale +\n      uint2_xe(in_global_thread_id_xe.x << 3u, in_global_thread_id_xe.y >> 1u));\n  uint dest_sample_index = in_global_thread_id_xe.y & 1u;\n  uint edram_address = XeEdramOffsetBytes(\n      uint2_xe(pixel_index), 0u, false,\n      XeHostDepthStoreRTPitchTiles(rt_constant), kXenosMsaaSamples_2X, false,\n      0u, dest_sample_index, resolution_scale);\n  // Top and bottom to Direct3D 10.1+ and Vulkan top 1 and bottom 0 (for 2x) or\n  // top-left 0 and bottom-right 3 (for 4x).\n  int source_sample_index =\n      XeHostDepthStoreRTMsaa2xSupported(rt_constant)\n          ? (bool(dest_sample_index) ? 0 : 1)\n          : (bool(dest_sample_index) ? 3 : 0);\n  byte_buffer_align16_store16_xe(\n      xe_host_depth_store_dest, edram_address,\n      float_bits_to_uint_xe(float4_xe(\n          texel_fetch_2d_ms_xe(xe_host_depth_store_source, pixel_index,\n                               source_sample_index).r,\n          texel_fetch_2d_ms_xe(xe_host_depth_store_source,\n                               pixel_index + int2_xe(1, 0),\n                               source_sample_index).r,\n          texel_fetch_2d_ms_xe(xe_host_depth_store_source,\n                               pixel_index + int2_xe(2, 0),\n                               source_sample_index).r,\n          texel_fetch_2d_ms_xe(xe_host_depth_store_source,\n                               pixel_index + int2_xe(3, 0),\n                               source_sample_index).r)));\n  byte_buffer_align16_store16_xe(\n      xe_host_depth_store_dest, edram_address + 16u,\n      float_bits_to_uint_xe(float4_xe(\n          texel_fetch_2d_ms_xe(xe_host_depth_store_source,\n                               pixel_index + int2_xe(4, 0),\n                               source_sample_index).r,\n          texel_fetch_2d_ms_xe(xe_host_depth_store_source,\n                               pixel_index + int2_xe(5, 0),\n                               source_sample_index).r,\n          texel_fetch_2d_ms_xe(xe_host_depth_store_source,\n                               pixel_index + int2_xe(6, 0),\n                               source_sample_index).r,\n          texel_fetch_2d_ms_xe(xe_host_depth_store_source,\n                               pixel_index + int2_xe(7, 0),\n                               source_sample_index).r)));\n}\nentry_code_end_compute_xe\n"
  },
  {
    "path": "src/xenia/gpu/shaders/host_depth_store_4xmsaa.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"edram.xesli\"\n#include \"host_depth_store.xesli\"\n\nbyte_buffer_align16_wo_declare_xe(xe_host_depth_store_dest, set=0, binding=0,\n                                  u0, space0)\n#define LOCAL_SIZE_X_XE 8\n#define LOCAL_SIZE_Y_XE 8\n#define LOCAL_SIZE_Z_XE 1\nentry_bindings_begin_compute_xe\n  XE_HOST_DEPTH_STORE_PUSH_CONSTANTS_BINDING\n  entry_binding_next_xe\n  byte_buffer_wo_binding_xe(xe_host_depth_store_dest, buffer(1))\n  entry_binding_next_xe\n  texture_xe(texture_2d_ms_xe, xe_host_depth_store_source, set=1, binding=0,\n             t0, space0, texture(0))\nentry_bindings_end_inputs_begin_compute_xe\n  entry_in_global_thread_id_xe\nentry_inputs_end_code_begin_compute_xe\n{\n  // 1 thread = 8 samples (4x0.5 pixels, resolve granularity is 8 pixels).\n  uint rect_constant = push_const_xe(xe_host_depth_store_rectangle);\n  uint rt_constant = push_const_xe(xe_host_depth_store_render_target);\n  uint2_xe resolution_scale = XeHostDepthStoreRTResolutionScale(rt_constant);\n  // Group height can't cross resolve granularity, Y overflow check not needed.\n  dont_flatten_xe\n  if ((in_global_thread_id_xe.x >> 1u) >=\n      (XeHostDepthStoreRectUnscaledWidthDiv8(rect_constant) *\n       resolution_scale.x)) {\n    return;\n  }\n  int2_xe pixel_index = int2_xe(\n      XeHostDepthStoreRectUnscaledOrigin(rect_constant) * resolution_scale +\n      uint2_xe(in_global_thread_id_xe.x << 2u, in_global_thread_id_xe.y >> 1u));\n  // For simplicity, passing samples directly, not pixels, to\n  // XeEdramOffsetBytes.\n  uint edram_address = XeEdramOffsetBytes(\n      (uint2_xe(pixel_index) << 1u) | (in_global_thread_id_xe.xy & 1u), 0u,\n      false, XeHostDepthStoreRTPitchTiles(rt_constant), kXenosMsaaSamples_1X,\n      false, 0u, 0u, resolution_scale);\n  // Render target horizontal sample in bit 0, vertical sample in bit 1.\n  int source_sample_left = int((in_global_thread_id_xe.y & 1u) << 1u);\n  int source_sample_right = source_sample_left + 1;\n  byte_buffer_align16_store16_xe(\n      xe_host_depth_store_dest, edram_address,\n      float_bits_to_uint_xe(float4_xe(\n          texel_fetch_2d_ms_xe(xe_host_depth_store_source, pixel_index,\n                               source_sample_left).r,\n          texel_fetch_2d_ms_xe(xe_host_depth_store_source, pixel_index,\n                               source_sample_right).r,\n          texel_fetch_2d_ms_xe(xe_host_depth_store_source,\n                               pixel_index + int2_xe(1, 0),\n                               source_sample_left).r,\n          texel_fetch_2d_ms_xe(xe_host_depth_store_source,\n                               pixel_index + int2_xe(1, 0),\n                               source_sample_right).r)));\n  byte_buffer_align16_store16_xe(\n      xe_host_depth_store_dest, edram_address + 16u,\n      float_bits_to_uint_xe(float4_xe(\n          texel_fetch_2d_ms_xe(xe_host_depth_store_source,\n                               pixel_index + int2_xe(2, 0),\n                               source_sample_left).r,\n          texel_fetch_2d_ms_xe(xe_host_depth_store_source,\n                               pixel_index + int2_xe(2, 0),\n                               source_sample_right).r,\n          texel_fetch_2d_ms_xe(xe_host_depth_store_source,\n                               pixel_index + int2_xe(3, 0),\n                               source_sample_left).r,\n          texel_fetch_2d_ms_xe(xe_host_depth_store_source,\n                               pixel_index + int2_xe(3, 0),\n                               source_sample_right).r)));\n}\nentry_code_end_compute_xe\n"
  },
  {
    "path": "src/xenia/gpu/shaders/passthrough_position_xy.vs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"../../ui/shaders/xesl.xesli\"\n\nentry_outputs_begin_xe\n  entry_out_position_xe\nentry_outputs_end_stage_inputs_begin_xe\n  entry_in_stage_vertex_xe(float2_xe, xe_in_position, 0, POSITION)\nentry_stage_inputs_end_bindings_begin_vertex_xe\nentry_bindings_empty_end_inputs_begin_xe\n  entry_in_stage_inputs_xe\nentry_inputs_end_code_begin_xe\n{\n  out_position_xe = float4_xe(in_xe(xe_in_position), 0.0f, 1.0f);\n}\nentry_code_end_xe\n"
  },
  {
    "path": "src/xenia/gpu/shaders/pixel_formats.xesli",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_SHADERS_PIXEL_FORMATS_XESLI_\n#define XENIA_GPU_SHADERS_PIXEL_FORMATS_XESLI_\n\n#include \"../../ui/shaders/xesl.xesli\"\n\n#define kXenosFormat_1_REVERSE 0u\n#define kXenosFormat_1 1u\n#define kXenosFormat_8 2u\n#define kXenosFormat_1_5_5_5 3u\n#define kXenosFormat_5_6_5 4u\n#define kXenosFormat_6_5_5 5u\n#define kXenosFormat_8_8_8_8 6u\n#define kXenosFormat_2_10_10_10 7u\n#define kXenosFormat_8_A 8u\n#define kXenosFormat_8_B 9u\n#define kXenosFormat_8_8 10u\n#define kXenosFormat_Cr_Y1_Cb_Y0_REP 11u\n#define kXenosFormat_Y1_Cr_Y0_Cb_REP 12u\n#define kXenosFormat_16_16_EDRAM 13u\n#define kXenosFormat_8_8_8_8_A 14u\n#define kXenosFormat_4_4_4_4 15u\n#define kXenosFormat_10_11_11 16u\n#define kXenosFormat_11_11_10 17u\n#define kXenosFormat_DXT1 18u\n#define kXenosFormat_DXT2_3 19u\n#define kXenosFormat_DXT4_5 20u\n#define kXenosFormat_16_16_16_16_EDRAM 21u\n#define kXenosFormat_24_8 22u\n#define kXenosFormat_24_8_FLOAT 23u\n#define kXenosFormat_16 24u\n#define kXenosFormat_16_16 25u\n#define kXenosFormat_16_16_16_16 26u\n#define kXenosFormat_16_EXPAND 27u\n#define kXenosFormat_16_16_EXPAND 28u\n#define kXenosFormat_16_16_16_16_EXPAND 29u\n#define kXenosFormat_16_FLOAT 30u\n#define kXenosFormat_16_16_FLOAT 31u\n#define kXenosFormat_16_16_16_16_FLOAT 32u\n#define kXenosFormat_32 33u\n#define kXenosFormat_32_32 34u\n#define kXenosFormat_32_32_32_32 35u\n#define kXenosFormat_32_FLOAT 36u\n#define kXenosFormat_32_32_FLOAT 37u\n#define kXenosFormat_32_32_32_32_FLOAT 38u\n#define kXenosFormat_32_AS_8 39u\n#define kXenosFormat_32_AS_8_8 40u\n#define kXenosFormat_16_MPEG 41u\n#define kXenosFormat_16_16_MPEG 42u\n#define kXenosFormat_8_INTERLACED 43u\n#define kXenosFormat_32_AS_8_INTERLACED 44u\n#define kXenosFormat_32_AS_8_8_INTERLACED 45u\n#define kXenosFormat_16_INTERLACED 46u\n#define kXenosFormat_16_MPEG_INTERLACED 47u\n#define kXenosFormat_16_16_MPEG_INTERLACED 48u\n#define kXenosFormat_DXN 49u\n#define kXenosFormat_8_8_8_8_AS_16_16_16_16 50u\n#define kXenosFormat_DXT1_AS_16_16_16_16 51u\n#define kXenosFormat_DXT2_3_AS_16_16_16_16 52u\n#define kXenosFormat_DXT4_5_AS_16_16_16_16 53u\n#define kXenosFormat_2_10_10_10_AS_16_16_16_16 54u\n#define kXenosFormat_10_11_11_AS_16_16_16_16 55u\n#define kXenosFormat_11_11_10_AS_16_16_16_16 56u\n#define kXenosFormat_32_32_32_FLOAT 57u\n#define kXenosFormat_DXT3A 58u\n#define kXenosFormat_DXT5A 59u\n#define kXenosFormat_CTX1 60u\n#define kXenosFormat_DXT3A_AS_1_1_1_1 61u\n#define kXenosFormat_8_8_8_8_GAMMA_EDRAM 62u\n#define kXenosFormat_2_10_10_10_FLOAT_EDRAM 63u\n\n#define kXenosColorRenderTargetFormat_8_8_8_8 0u\n#define kXenosColorRenderTargetFormat_8_8_8_8_GAMMA 1u\n#define kXenosColorRenderTargetFormat_2_10_10_10 2u\n#define kXenosColorRenderTargetFormat_2_10_10_10_FLOAT 3u\n#define kXenosColorRenderTargetFormat_16_16 4u\n#define kXenosColorRenderTargetFormat_16_16_16_16 5u\n#define kXenosColorRenderTargetFormat_16_16_FLOAT 6u\n#define kXenosColorRenderTargetFormat_16_16_16_16_FLOAT 7u\n#define kXenosColorRenderTargetFormat_2_10_10_10_AS_10_10_10_10 10u\n#define kXenosColorRenderTargetFormat_2_10_10_10_FLOAT_AS_16_16_16_16 12u\n#define kXenosColorRenderTargetFormat_32_FLOAT 14u\n#define kXenosColorRenderTargetFormat_32_32_FLOAT 15u\n\n#define kXenosDepthRenderTargetFormat_D24S8 0u\n#define kXenosDepthRenderTargetFormat_D24FS8 1u\n\n// ColorFormat packing, according to the Direct3D 11.3 functional specification.\n\nuint XePackR5G5B5A1UNorm(float4_xe f) {\n  uint4_xe n = uint4_xe(saturate_xe(f) * float2_xe(31.0f, 1.0f).xxxy + 0.5f);\n  return n.r | (n.g << 5) | (n.b << 10) | (n.a << 15);\n}\n\nuint XePackR5G6B5UNorm(float3_xe f) {\n  uint3_xe n = uint3_xe(saturate_xe(f) * float3_xe(31.0f, 63.0f, 31.0f) + 0.5f);\n  return n.r | (n.g << 5) | (n.b << 11);\n}\n\nuint XePackR5G5B6UNorm(float3_xe f) {\n  uint3_xe n = uint3_xe(saturate_xe(f) * float3_xe(31.0f, 31.0f, 63.0f) + 0.5f);\n  return n.r | (n.g << 5) | (n.b << 10);\n}\n\nuint XePackR8G8B8A8UNorm(float4_xe f) {\n  uint4_xe n = uint4_xe(saturate_xe(f) * 255.0f + 0.5f);\n  return n.r | (n.g << 8) | (n.b << 16) | (n.a << 24);\n}\n\nuint XePackR10G10B10A2UNorm(float4_xe f) {\n  uint4_xe n = uint4_xe(saturate_xe(f) * float2_xe(1023.0f, 3.0f).xxxy + 0.5f);\n  return n.r | (n.g << 10) | (n.b << 20) | (n.a << 30);\n}\n\nuint XePackR4G4B4A4UNorm(float4_xe f) {\n  uint4_xe n = uint4_xe(saturate_xe(f) * 15.0f + 0.5f);\n  return n.r | (n.g << 4) | (n.b << 8) | (n.a << 12);\n}\n\nuint XePackR11G11B10UNorm(float3_xe f) {\n  uint3_xe n =\n      uint3_xe(saturate_xe(f) * float3_xe(2047.0f, 2047.0f, 1023.0f) + 0.5);\n  return n.r | (n.g << 11) | (n.b << 22);\n}\n\nuint XePackR10G11B11UNorm(float3_xe f) {\n  uint3_xe n =\n      uint3_xe(saturate_xe(f) * float3_xe(1023.0f, 2047.0f, 2047.0f) + 0.5f);\n  return n.r | (n.g << 10) | (n.b << 21);\n}\n\nuint XePackR16G16UNorm(float2_xe f) {\n  uint2_xe n = uint2_xe(saturate_xe(f) * 65535.0f + 0.5f);\n  return n.r | (n.g << 16);\n}\n\nuint2_xe XePackR16G16B16A16UNorm(float4_xe f) {\n  uint4_xe n = uint4_xe(saturate_xe(f) * 65535.0f + 0.5f);\n  return n.rb | (n.ga << 16);\n}\n\nuint2_xe XePack16bpp4PixelsInUInt2(float4_xe pixel_0, float4_xe pixel_1,\n                                   float4_xe pixel_2, float4_xe pixel_3,\n                                   uint format) {\n  uint2_xe packed;\n  switch (format) {\n    case kXenosFormat_1_5_5_5:\n      packed.x = XePackR5G5B5A1UNorm(pixel_0) |\n                 (XePackR5G5B5A1UNorm(pixel_1) << 16u);\n      packed.y = XePackR5G5B5A1UNorm(pixel_2) |\n                 (XePackR5G5B5A1UNorm(pixel_3) << 16u);\n      break;\n    case kXenosFormat_5_6_5:\n      packed.x = XePackR5G6B5UNorm(pixel_0.rgb) |\n                 (XePackR5G6B5UNorm(pixel_1.rgb) << 16u);\n      packed.y = XePackR5G6B5UNorm(pixel_2.rgb) |\n                 (XePackR5G6B5UNorm(pixel_3.rgb) << 16u);\n      break;\n    case kXenosFormat_6_5_5:\n      packed.x = XePackR5G5B6UNorm(pixel_0.rgb) |\n                 (XePackR5G5B6UNorm(pixel_1.rgb) << 16u);\n      packed.y = XePackR5G5B6UNorm(pixel_2.rgb) |\n                 (XePackR5G5B6UNorm(pixel_3.rgb) << 16u);\n      break;\n    case kXenosFormat_8_8:\n      packed.x = XePackR8G8B8A8UNorm(float4_xe(pixel_0.rg, pixel_1.rg));\n      packed.y = XePackR8G8B8A8UNorm(float4_xe(pixel_2.rg, pixel_3.rg));\n      break;\n    case kXenosFormat_4_4_4_4:\n      packed.x = XePackR4G4B4A4UNorm(pixel_0) |\n                 (XePackR4G4B4A4UNorm(pixel_1) << 16u);\n      packed.y = XePackR4G4B4A4UNorm(pixel_2) |\n                 (XePackR4G4B4A4UNorm(pixel_3) << 16u);\n      break;\n    case kXenosFormat_16:\n      packed = XePackR16G16B16A16UNorm(float4_xe(pixel_0.r, pixel_1.r,\n                                                 pixel_2.r, pixel_3.r));\n      break;\n    default:\n      // Treat as something (16_FLOAT).\n      packed.x = pack_half_2x16_xe(float2_xe(pixel_0.r, pixel_1.r));\n      packed.y = pack_half_2x16_xe(float2_xe(pixel_2.r, pixel_3.r));\n      break;\n  }\n  return packed;\n}\n\nuint4_xe XePack32bpp4Pixels(float4_xe pixel_0, float4_xe pixel_1,\n                            float4_xe pixel_2, float4_xe pixel_3,\n                            uint format) {\n  uint4_xe packed;\n  switch (format) {\n    case kXenosFormat_8_8_8_8:\n    // TODO(Triang3l): Investigate 8_8_8_8_A.\n    case kXenosFormat_8_8_8_8_A:\n    case kXenosFormat_8_8_8_8_AS_16_16_16_16:\n      packed.x = XePackR8G8B8A8UNorm(pixel_0);\n      packed.y = XePackR8G8B8A8UNorm(pixel_1);\n      packed.z = XePackR8G8B8A8UNorm(pixel_2);\n      packed.w = XePackR8G8B8A8UNorm(pixel_3);\n      break;\n    case kXenosFormat_2_10_10_10:\n    case kXenosFormat_2_10_10_10_AS_16_16_16_16:\n      packed.x = XePackR10G10B10A2UNorm(pixel_0);\n      packed.y = XePackR10G10B10A2UNorm(pixel_1);\n      packed.z = XePackR10G10B10A2UNorm(pixel_2);\n      packed.w = XePackR10G10B10A2UNorm(pixel_3);\n      break;\n    case kXenosFormat_10_11_11:\n    case kXenosFormat_10_11_11_AS_16_16_16_16:\n      packed.x = XePackR11G11B10UNorm(pixel_0.rgb);\n      packed.y = XePackR11G11B10UNorm(pixel_1.rgb);\n      packed.z = XePackR11G11B10UNorm(pixel_2.rgb);\n      packed.w = XePackR11G11B10UNorm(pixel_3.rgb);\n      break;\n    case kXenosFormat_11_11_10:\n    case kXenosFormat_11_11_10_AS_16_16_16_16:\n      packed.x = XePackR10G11B11UNorm(pixel_0.rgb);\n      packed.y = XePackR10G11B11UNorm(pixel_1.rgb);\n      packed.z = XePackR10G11B11UNorm(pixel_2.rgb);\n      packed.w = XePackR10G11B11UNorm(pixel_3.rgb);\n      break;\n    case kXenosFormat_16_16:\n      packed.x = XePackR16G16UNorm(pixel_0.rg);\n      packed.y = XePackR16G16UNorm(pixel_1.rg);\n      packed.z = XePackR16G16UNorm(pixel_2.rg);\n      packed.w = XePackR16G16UNorm(pixel_3.rg);\n      break;\n    case kXenosFormat_16_16_FLOAT:\n      packed.x = pack_half_2x16_xe(float2_xe(pixel_0.r, pixel_0.g));\n      packed.y = pack_half_2x16_xe(float2_xe(pixel_1.r, pixel_1.g));\n      packed.z = pack_half_2x16_xe(float2_xe(pixel_2.r, pixel_2.g));\n      packed.w = pack_half_2x16_xe(float2_xe(pixel_3.r, pixel_3.g));\n      break;\n    default:\n      // Treat as 32_FLOAT.\n      packed.x = float_bits_to_uint_xe(pixel_0.r);\n      packed.y = float_bits_to_uint_xe(pixel_1.r);\n      packed.z = float_bits_to_uint_xe(pixel_2.r);\n      packed.w = float_bits_to_uint_xe(pixel_3.r);\n      break;\n  }\n  return packed;\n}\n\nvoid XePack64bpp4Pixels(float4_xe pixel_0, float4_xe pixel_1,\n                        float4_xe pixel_2, float4_xe pixel_3, uint format,\n                        out_param_xe(uint4_xe, packed_01),\n                        out_param_xe(uint4_xe, packed_23)) {\n  switch (format) {\n    case kXenosFormat_16_16_16_16:\n      packed_01.xy = XePackR16G16B16A16UNorm(pixel_0);\n      packed_01.zw = XePackR16G16B16A16UNorm(pixel_1);\n      packed_23.xy = XePackR16G16B16A16UNorm(pixel_2);\n      packed_23.zw = XePackR16G16B16A16UNorm(pixel_3);\n      break;\n    case kXenosFormat_16_16_16_16_FLOAT:\n      packed_01.x = pack_half_2x16_xe(float2_xe(pixel_0.r, pixel_0.g));\n      packed_01.y = pack_half_2x16_xe(float2_xe(pixel_0.b, pixel_0.a));\n      packed_01.z = pack_half_2x16_xe(float2_xe(pixel_1.r, pixel_1.g));\n      packed_01.w = pack_half_2x16_xe(float2_xe(pixel_1.b, pixel_1.a));\n      packed_23.x = pack_half_2x16_xe(float2_xe(pixel_2.r, pixel_2.g));\n      packed_23.y = pack_half_2x16_xe(float2_xe(pixel_2.b, pixel_2.a));\n      packed_23.z = pack_half_2x16_xe(float2_xe(pixel_3.r, pixel_3.g));\n      packed_23.w = pack_half_2x16_xe(float2_xe(pixel_3.b, pixel_3.a));\n      break;\n    default:\n      // Treat as 32_32_FLOAT.\n      packed_01 = float_bits_to_uint_xe(float4_xe(pixel_0.rg, pixel_1.rg));\n      packed_23 = float_bits_to_uint_xe(float4_xe(pixel_2.rg, pixel_3.rg));\n      break;\n  }\n}\n\n// EDRAM color format unpacking.\n\nfloat4_xe XeUnpackR8UNormX4(uint4_xe p) {\n  return float4_xe(p & 255u) * (1.0f / 255.0f);\n}\n\nfloat4_xe XeUnpackR8G8B8A8UNorm(uint p) {\n  return float4_xe((uint_x4_xe(p) >> uint4_xe(0u, 8u, 16u, 24u)) & 255u) *\n         (1.0f / 255.0f);\n}\n\nfloat4_xe XeUnpackR10UNormX4(uint4_xe p) {\n  return float4_xe(p & 1023u) * (1.0f / 1023.0f);\n}\n\nfloat4_xe XeUnpackR10G10B10A2UNorm(uint p) {\n  return float4_xe((uint_x4_xe(p) >> uint4_xe(0u, 10u, 20u, 30u)) &\n                      uint2_xe(1023u, 3u).xxxy) *\n         float2_xe(1.0f / 1023.0f, 1.0f / 3.0f).xxxy;\n}\n\nfloat4_xe XeUnpackR10FloatX4(uint4_xe p) {\n  // https://github.com/Microsoft/DirectXTex/blob/master/DirectXTex/DirectXTexConvert.cpp\n  uint4_xe f10u32 = p & 0x3FFu;\n  uint4_xe mantissa = f10u32 & 0x7Fu;\n  uint4_xe exponent = f10u32 >> 7u;\n  // Normalize the values for the denormalized components.\n  // Exponent = 1;\n  // do { Exponent--; Mantissa <<= 1; } while ((Mantissa & 0x80) == 0);\n  bool4_xe is_denormalized = equal_xe(exponent, uint_x4_xe(0u));\n  uint4_xe mantissa_lzcnt = uint_x4_xe(7u) - first_one_bit_high_xe(mantissa);\n  exponent = select_xe(is_denormalized, (uint_x4_xe(1u) - mantissa_lzcnt),\n                       exponent);\n  mantissa = select_xe(is_denormalized, ((mantissa << mantissa_lzcnt) & 0x7Fu),\n                       mantissa);\n  // Combine into 32-bit float bits and clear zeros.\n  return uint_bits_to_float_xe(select_xe(\n      equal_xe(f10u32, uint_x4_xe(0u)), uint_x4_xe(0u),\n      ((exponent + 124u) << 23u) | (mantissa << 16u)));\n}\n\nfloat4_xe XeUnpackR10G10B10A2Float(uint p) {\n  // https://github.com/Microsoft/DirectXTex/blob/master/DirectXTex/DirectXTexConvert.cpp\n  uint3_xe rgb_f10u32 = (uint_x3_xe(p) >> uint3_xe(0u, 10u, 20u)) & 0x3FFu;\n  uint3_xe mantissa = rgb_f10u32 & 0x7Fu;\n  uint3_xe exponent = rgb_f10u32 >> 7u;\n  // Normalize the values for the denormalized components.\n  // Exponent = 1;\n  // do { Exponent--; Mantissa <<= 1; } while ((Mantissa & 0x80) == 0);\n  bool3_xe is_denormalized = equal_xe(exponent, uint_x3_xe(0u));\n  uint3_xe mantissa_lzcnt = uint_x3_xe(7u) - first_one_bit_high_xe(mantissa);\n  exponent = select_xe(is_denormalized, (uint_x3_xe(1u) - mantissa_lzcnt),\n                       exponent);\n  mantissa = select_xe(is_denormalized, ((mantissa << mantissa_lzcnt) & 0x7Fu),\n                       mantissa);\n  // Combine into 32-bit float bits and clear zeros.\n  uint3_xe rgb_f32u32 = select_xe(\n      equal_xe(rgb_f10u32, uint_x3_xe(0u)), uint_x3_xe(0u),\n      ((exponent + 124u) << 23u) | (mantissa << 16u));\n  return float4_xe(uint_bits_to_float_xe(rgb_f32u32),\n                   float(p >> 30u) * (1.0f / 3.0f));\n}\n\n// http://web.archive.org/web/20180826210254/https://www.students.science.uu.nl/~3220516/advancedgraphics/papers/inferred_lighting.pdf\n// \"The format of the DSF buffer (two 16 bit channels) in EDRAM is fixed point\n//  with a range of -32 to 32. The corresponding texture format is fixed point\n//  with a range of 0 to 1. This requires the shader to scale the shader output\n//  of 0 to 1 to -32 to 32. To maintain 16 bit precision, the texture used for\n//  the resolve needs to be created with a custom format that has a range of -1\n//  to 1. When sampling from this texture in a shader, the results must be\n//  scaled to a 0 to 1 range.\"\n\n// Upper 16 bits are ignored by XeUnpackR16EdramX4.\n\nfloat4_xe XeUnpackR16EdramX4(uint4_xe p) {\n  return max(float_x4_xe(-1.0f),\n             float4_xe(int4_xe(p) << 16 >> 16) * (32.0f / 32767.0f));\n}\n\nfloat2_xe XeUnpackR16G16Edram(uint p) {\n  return max(float_x2_xe(-1.0f),\n             float2_xe(int_x2_xe(int(p)) << int2_xe(16, 0) >> 16) *\n                 (32.0f / 32767.0f));\n}\n\nfloat4_xe XeUnpackR16G16B16A16Edram(uint2_xe p) {\n  return max(float_x4_xe(-1.0f),\n             float4_xe(int2_xe(p).xxyy << int2_xe(16, 0).xyxy >> 16) *\n                 (32.0f / 32767.0f));\n}\n\n// Xenos 16-bit packed textures are RGBA, but in Direct3D 12 they are BGRA.\n\nuint4_xe XeR5G5B5A1ToB5G5R5A1(uint4_xe packed_texels) {\n  return (packed_texels & 0x83E083E0u) |\n         ((packed_texels & 0x001F001Fu) << 10u) |\n         ((packed_texels & 0x7C007C00u) >> 10u);\n}\n\nuint4_xe XeR5G6B5ToB5G6R5(uint4_xe packed_texels) {\n  return (packed_texels & 0x07E007E0u) |\n         ((packed_texels & 0x001F001Fu) << 11u) |\n         ((packed_texels & 0xF800F800u) >> 11u);\n}\n\nuint4_xe XeR4G4B4A4ToB4G4R4A4(uint4_xe packed_texels) {\n  return (packed_texels & 0xF0F0F0F0u) | ((packed_texels & 0x000F000Fu) << 8u) |\n         ((packed_texels & 0x0F000F00u) >> 8u);\n}\n\nuint4_xe XeR4G4B4A4ToA4R4G4B4(uint4_xe packed_texels) {\n  return ((packed_texels & 0x0FFF0FFFu) << 4u) |\n         ((packed_texels & 0xF000F000u) >> 12u);\n}\n\n// RRRRR GGGGG BBBBBB to GGGGG BBBBBB RRRRR (use RBGA swizzle when reading).\nuint4_xe XeR5G5B6ToB5G6R5WithRBGASwizzle(uint4_xe packed_texels) {\n  return ((packed_texels & 0x001F001Fu) << 11u) |\n         ((packed_texels & 0xFFE0FFE0u) >> 5u);\n}\n\nuint4_xe XeGBGR8ToGRGB8(uint4_xe packed_texels) {\n  return (packed_texels & 0x00FF00FFu) |\n         ((packed_texels & 0x0000FF00u) << 16u) |\n         ((packed_texels & 0xFF000000u) >> 16u);\n}\n\n// Also usable for BGRA8 <> RGBA8, but that's not needed for texture loading.\nuint4_xe XeBGRG8ToRGBG8(uint4_xe packed_texels) {\n  return (packed_texels & 0xFF00FF00u) |\n         ((packed_texels & 0x000000FFu) << 16u) |\n         ((packed_texels & 0x00FF0000u) >> 16u);\n}\n\n// On the Xenos, it appears that the last existing component of a texture is\n// replicated into the missing components. Writing blue directly to the alpha\n// instead of 1 also makes this conversion correct for both unsigned and signed\n// data.\n\nuint4_xe XeGBGR8ToRGB8WithRGBBSwizzle(uint2_xe packed_texels) {\n  uint2_xe rba = (packed_texels >> 24u) |\n                 (((packed_texels & 0x0000FF00u) << 8u) * 0x101u);\n  uint4_xe g = uint4_xe((packed_texels & 0x000000FFu) << 8u,\n                        (packed_texels & 0x00FF0000u) >> 8u).xzyw;\n  return rba.xxyy | g;\n}\nvoid XeGBGR8ToRGB8WithRGBBSwizzle(uint4_xe packed_texels,\n                                  out_param_xe(uint4_xe, out_01),\n                                  out_param_xe(uint4_xe, out_23)) {\n  out_01 = XeGBGR8ToRGB8WithRGBBSwizzle(packed_texels.xy);\n  out_23 = XeGBGR8ToRGB8WithRGBBSwizzle(packed_texels.zw);\n}\n\nuint4_xe XeBGRG8ToRGB8WithRGBBSwizzle(uint2_xe packed_texels) {\n  uint2_xe rba = ((packed_texels & 0x00FF0000u) >> 16u) |\n                 (((packed_texels & 0x000000FFu) << 16u) * 0x101u);\n  uint4_xe g = uint4_xe(packed_texels & 0x0000FF00u,\n                        (packed_texels & 0xFF000000u) >> 16u).xzyw;\n  return rba.xxyy | g;\n}\nvoid XeBGRG8ToRGB8WithRGBBSwizzle(uint4_xe packed_texels,\n                                  out_param_xe(uint4_xe, out_01),\n                                  out_param_xe(uint4_xe, out_23)) {\n  out_01 = XeBGRG8ToRGB8WithRGBBSwizzle(packed_texels.xy);\n  out_23 = XeBGRG8ToRGB8WithRGBBSwizzle(packed_texels.zw);\n}\n\nuint4_xe XeR10G11B11UNormToRGBA16(uint2_xe packed_texels) {\n  // Red and blue.\n  uint4_xe result =\n      (((packed_texels.xxyy >> uint2_xe(0u, 21u).xyxy) &\n        uint2_xe(1023u, 2047u).xyxy) <<\n       uint2_xe(6u, 5u).xyxy) |\n      ((packed_texels.xxyy >> uint2_xe(4u, 27u).xyxy) &\n       uint2_xe(63u, 31u).xyxy);\n  // Green. The 5 bits to be duplicated to the bottom are already at 16.\n  result.xz |= ((packed_texels & (2047u << 10u)) << (21u - 10u)) |\n               (packed_texels & (31u << 16u));\n  // Alpha.\n  result.yw |= 0xFFFF0000u;\n  return result;\n}\nvoid XeR10G11B11UNormToRGBA16(uint4_xe packed_texels,\n                              out_param_xe(uint4_xe, out_01),\n                              out_param_xe(uint4_xe, out_23)) {\n  out_01 = XeR10G11B11UNormToRGBA16(packed_texels.xy);\n  out_23 = XeR10G11B11UNormToRGBA16(packed_texels.zw);\n}\n\nuint4_xe XeR11G11B10UNormToRGBA16(uint2_xe packed_texels) {\n  // Red and blue.\n  uint4_xe result =\n      (((packed_texels.xxyy >> uint2_xe(0u, 22u).xyxy) &\n        uint2_xe(2047u, 1023u).xyxy) <<\n       uint2_xe(5u, 6u).xyxy) |\n      ((packed_texels.xxyy >> uint2_xe(6u, 26u).xyxy) &\n       uint2_xe(31u, 63u).xyxy);\n  // Green.\n  result.xz |= ((packed_texels & (2047u << 11u)) << (21u - 11u)) |\n               ((packed_texels & (31u << 17u)) >> (17u - 16u));\n  // Alpha.\n  result.yw |= 0xFFFF0000u;\n  return result;\n}\nvoid XeR11G11B10UNormToRGBA16(uint4_xe packed_texels,\n                              out_param_xe(uint4_xe, out_01),\n                              out_param_xe(uint4_xe, out_23)) {\n  out_01 = XeR11G11B10UNormToRGBA16(packed_texels.xy);\n  out_23 = XeR11G11B10UNormToRGBA16(packed_texels.zw);\n}\n\n// Assuming the original number has only 10 bits.\nuint2_xe XeSNorm10To16(uint2_xe s10) {\n  uint2_xe signs = s10 >> 9u;\n  bool2_xe is_negative = not_equal_xe(signs, uint_x2_xe(0u));\n  // -512 and -511 are both -1.0, but with -512 the conversion will overflow.\n  s10 = select_xe(equal_xe(s10, uint_x2_xe(0x200u)), uint_x2_xe(0x201u), s10);\n  // Take the absolute value.\n  s10 = (s10 ^ select_xe(is_negative, uint_x2_xe(0x3FFu), uint_x2_xe(0u))) +\n        signs;\n  // Expand the 9-bit absolute value to 15 bits like unorm.\n  s10 = (s10 << 6u) | (s10 >> 3u);\n  // Apply the sign.\n  return (s10 ^ select_xe(is_negative, uint_x2_xe(0xFFFFu), uint_x2_xe(0u))) +\n         signs;\n}\n\n// Assuming the original number has only 11 bits.\nuint2_xe XeSNorm11To16(uint2_xe s11) {\n  uint2_xe signs = s11 >> 10u;\n  bool2_xe is_negative = not_equal_xe(signs, uint_x2_xe(0u));\n  // -1024 and -1023 are both -1.0, but with -1024 the conversion will overflow.\n  s11 = select_xe(equal_xe(s11, uint_x2_xe(0x400u)), uint_x2_xe(0x401u), s11);\n  // Take the absolute value.\n  s11 = (s11 ^ select_xe(is_negative, uint_x2_xe(0x7FFu), uint_x2_xe(0u))) +\n        signs;\n  // Expand the 10-bit absolute value to 15 bits like unorm.\n  s11 = (s11 << 5u) | (s11 >> 5u);\n  // Apply the sign.\n  return (s11 ^ select_xe(is_negative, uint_x2_xe(0xFFFFu), uint_x2_xe(0u))) +\n         signs;\n}\n\nuint4_xe XeR10G11B11SNormToRGBA16(uint2_xe packed_texels) {\n  // uint4(RG0, RG1, BA0, BA1).xzyw == uint4(RG0, BA0, RG1, BA1).\n  return uint4_xe(XeSNorm10To16(packed_texels & 1023u) |\n                      (XeSNorm11To16((packed_texels >> 10u) & 2047u) << 16u),\n                  XeSNorm11To16(packed_texels >> 21u) | 0x7FFF0000u).xzyw;\n}\nvoid XeR10G11B11SNormToRGBA16(uint4_xe packed_texels,\n                              out_param_xe(uint4_xe, out_01),\n                              out_param_xe(uint4_xe, out_23)) {\n  out_01 = XeR10G11B11SNormToRGBA16(packed_texels.xy);\n  out_23 = XeR10G11B11SNormToRGBA16(packed_texels.zw);\n}\n\nuint4_xe XeR11G11B10SNormToRGBA16(uint2_xe packed_texels) {\n  // uint4(RG0, RG1, BA0, BA1).xzyw == uint4(RG0, BA0, RG1, BA1).\n  return uint4_xe(XeSNorm11To16(packed_texels & 2047u) |\n                        (XeSNorm11To16((packed_texels >> 11u) & 2047u) << 16u),\n                    XeSNorm10To16(packed_texels >> 22u) | 0x7FFF0000u).xzyw;\n}\nvoid XeR11G11B10SNormToRGBA16(uint4_xe packed_texels,\n                              out_param_xe(uint4_xe, out_01),\n                              out_param_xe(uint4_xe, out_23)) {\n  out_01 = XeR11G11B10SNormToRGBA16(packed_texels.xy);\n  out_23 = XeR11G11B10SNormToRGBA16(packed_texels.zw);\n}\n\nuint4_xe XeRG16UNormToRG16Float(uint4_xe packed_texels) {\n  float4_xe r = float4_xe(packed_texels & 0xFFFFu) * (1.0f / 65535.0f);\n  float4_xe g = float4_xe(packed_texels >> 16u) * (1.0f / 65535.0f);\n  return uint4_xe(pack_half_2x16_xe(float2_xe(r.x, g.x)),\n                  pack_half_2x16_xe(float2_xe(r.y, g.y)),\n                  pack_half_2x16_xe(float2_xe(r.z, g.z)),\n                  pack_half_2x16_xe(float2_xe(r.w, g.w)));\n}\n\nuint4_xe XeRG16SNormToRG16Float(uint4_xe packed_texels) {\n  float4_xe r =\n      max(float_x4_xe(-1.0f),\n          float4_xe(int4_xe(packed_texels) << 16 >> 16) * (1.0f / 32767.0f));\n  float4_xe g =\n      max(float_x4_xe(-1.0f),\n          float4_xe(int4_xe(packed_texels) >> 16) * (1.0f / 32767.0f));\n  return uint4_xe(pack_half_2x16_xe(float2_xe(r.x, g.x)),\n                  pack_half_2x16_xe(float2_xe(r.y, g.y)),\n                  pack_half_2x16_xe(float2_xe(r.z, g.z)),\n                  pack_half_2x16_xe(float2_xe(r.w, g.w)));\n}\n\n// Based on CFloat24 from d3dref9.dll and the 6e4 code from:\n// https://github.com/Microsoft/DirectXTex/blob/master/DirectXTex/DirectXTexConvert.cpp\n// 6e4 has a different exponent bias allowing [0,512) values, 20e4 allows [0,2).\n// We also can't clamp the stored value to 1 as load->store->load must be exact.\n\nuint XeFloat32To20e4(uint f32u32, bool round_to_nearest_even) {\n  // Keep only positive (high bit set means negative for both float and int) and\n  // saturate to the maximum representable value near 2 (also dropping NaNs).\n  f32u32 = min((f32u32 <= 0x7FFFFFFFu) ? f32u32 : 0u, 0x3FFFFFF8u);\n  uint denormalized =\n      ((f32u32 & 0x7FFFFFu) | 0x800000u) >> min(113u - (f32u32 >> 23u), 24u);\n  uint f24u32 = (f32u32 < 0x38800000u) ? denormalized : (f32u32 + 0xC8000000u);\n  if (round_to_nearest_even) {\n    f24u32 += 3u + ((f24u32 >> 3u) & 1u);\n  }\n  return (f24u32 >> 3u) & 0xFFFFFFu;\n}\n\nuint XeFloat20e4To32(uint f24u32, bool remap_to_0_to_0_5) {\n  uint mantissa = f24u32 & 0xFFFFFu;\n  uint exponent = f24u32 >> 20u;\n  // Normalize the values for the denormalized components.\n  // Exponent = 1;\n  // do { Exponent--; Mantissa <<= 1; } while ((Mantissa & 0x100000) == 0);\n  bool is_denormalized = exponent == 0u;\n  uint mantissa_lzcnt = 20u - first_one_bit_high_xe(mantissa);\n  exponent = is_denormalized ? (1u - mantissa_lzcnt) : exponent;\n  mantissa =\n      is_denormalized ? ((mantissa << mantissa_lzcnt) & 0xFFFFFu) : mantissa;\n  // Combine into 32-bit float bits and clear zeros and, if needed, bias the\n  // exponent.\n  return (f24u32 != 0u)\n             ? ((exponent + (112u - uint(remap_to_0_to_0_5))) << 23u) |\n                (mantissa << 3u)\n             : 0u;\n}\n\nuint4_xe XeFloat20e4To32(uint4_xe f24u32) {\n  uint4_xe mantissa = f24u32 & 0xFFFFFu;\n  uint4_xe exponent = f24u32 >> 20u;\n  // Normalize the values for the denormalized components.\n  // Exponent = 1;\n  // do { Exponent--; Mantissa <<= 1; } while ((Mantissa & 0x100000) == 0);\n  bool4_xe is_denormalized = equal_xe(exponent, uint_x4_xe(0u));\n  uint4_xe mantissa_lzcnt = uint_x4_xe(20u) - first_one_bit_high_xe(mantissa);\n  exponent =\n      select_xe(is_denormalized, uint_x4_xe(1u) - mantissa_lzcnt, exponent);\n  mantissa = select_xe(\n      is_denormalized, (mantissa << mantissa_lzcnt) & 0xFFFFFu, mantissa);\n  // Combine into 32-bit float bits and clear zeros.\n  return select_xe(equal_xe(f24u32, uint_x4_xe(0u)), uint_x4_xe(0u),\n                   ((exponent + 112u) << 23u) | (mantissa << 3u));\n}\n\nuint2_xe XeFloat20e4To32(uint2_xe f24u32) {\n  return XeFloat20e4To32(f24u32.xyxx).xy;\n}\n\nfloat4_xe XeUNorm24To32(uint4_xe n24) {\n  // Not 1.0f / 16777215.0f as that gives an incorrect result (like for a very\n  // common 0xC00000 which clears 2_10_10_10 to 0001). Division by 2^24 is just\n  // an exponent shift though, thus exact.\n  // Division by 16777215.0f behaves this way.\n  return float4_xe(n24 + (n24 >> 23u)) * (1.0f / 16777216.0f);\n}\n\nfloat2_xe XeUNorm24To32(uint2_xe n24) {\n  return XeUNorm24To32(n24.xyxx).xy;\n}\n\n// Converts endpoint BGR (first - X of the return value - in the low 16 bits,\n// second - Y of the return value - in the high) of a DXT blocks to 8-bit, with\n// 2 unused bits between each component to allow for overflow when multiplying\n// by values up to 3 (so multiplication can be done for all components at once).\n// Relative ordering between endpoints is preserved, so result.x > result.y\n// (color0 > color1) and result.x <= result.y (color0 <= color1) can be used for\n// choosing the DXT1 mode.\nuint2_xe XeDXTColorEndpointsToBGR8In10(uint bgr_end_565) {\n  // Converting 5:6:5 to 8:8:8 similar to how Compressonator does that.\n  // https://github.com/GPUOpen-Tools/compressonator/blob/master/CMP_CompressonatorLib/DXTC/Codec_DXTC_RGBA.cpp#L340\n  uint2_xe bgr_end_8in10 =\n      // Blue in 0:4 and 16:20 - to 3:7.\n      (uint2_xe(bgr_end_565 << 3u, bgr_end_565 >> (16u - 3u)) & (31u << 3u)) |\n      // Green in 5:10 and 21:26 - to 12:17.\n      (uint2_xe(bgr_end_565 << (12u - 5u), bgr_end_565 >> (21u - 12u)) &\n       (63u << 12u)) |\n      // Red in 11:15 and 27:31 - to 23:27.\n      (uint2_xe(bgr_end_565 << (23u - 11u), bgr_end_565 >> (27u - 23u)) &\n       (31u << 23u));\n   // Apply the lower bit replication to give full dynamic range.\n   // Blue and red.\n   bgr_end_8in10 |= (bgr_end_8in10 >> 5u) & (7u | (7u << 20u));\n   // Green.\n   bgr_end_8in10 |= (bgr_end_8in10 >> 6u) & (3u << 10u);\n   return bgr_end_8in10;\n}\n\n// Sorts the color indices of a DXT3/DXT5 or a DXT1 opaque block so they can be\n// used as the weights for the second endpoint, from 0 to 3. To get the weights\n// for the first endpoint, apply bitwise NOT to the result.\nuint4_xe XeDXTHighColorWeights(uint4_xe codes) {\n  // Initially 00 = 3:0, 01 = 0:3, 10 = 2:1, 11 = 1:2.\n  // Swap bits. 00 = 3:0, 01 = 2:1, 10 = 0:3, 11 = 1:2.\n  codes = ((codes & 0x55555555u) << 1u) | ((codes & 0xAAAAAAAAu) >> 1u);\n  // Swap 10 and 11. 00 = 3:0, 01 = 2:1, 10 = 1:2, 11 = 0:3.\n  return codes ^ ((codes & 0xAAAAAAAAu) >> 1u);\n}\nuint2_xe XeDXTHighColorWeights(uint2_xe codes) {\n  return XeDXTHighColorWeights(codes.xyxx).xy;\n}\nuint XeDXTHighColorWeights(uint codes) {\n  return XeDXTHighColorWeights(uint_x2_xe(codes)).x;\n}\n\n// Get the RGB colors of one row of a DXT opaque block. Endpoint colors can be\n// obtained using XeDXTColorEndpointsToBGR8In10 (8 bits with 2 bits of free\n// space between each), weights can be obtained using XeDXTHighColorWeights.\n// Alpha is set to 0 in the result. Weights must be shifted right by 8 * row\n// index before calling.\nuint4_xe XeDXTOpaqueRowToRGB8(uint2_xe bgr_end_8in10, uint weights_high) {\n  const uint4_xe weights_shifts = uint4_xe(0u, 2u, 4u, 6u);\n  uint4_xe bgr_row_8in10_3x =\n      ((uint_x4_xe(~weights_high) >> weights_shifts) & 3u) * bgr_end_8in10.x +\n      ((uint_x4_xe(weights_high) >> weights_shifts) & 3u) * bgr_end_8in10.y;\n  return (((bgr_row_8in10_3x & 1023u) / 3u) << 16u) |\n         ((((bgr_row_8in10_3x >> 10u) & 1023u) / 3u) << 8u) |\n         ((bgr_row_8in10_3x >> 20u) / 3u);\n}\n\n// Sort the color indices of four transparent DXT1 blocks so bits of them can be\n// used as endpoint weights (lower bit for the low endpoint, upper bit for the\n// high endpoint, and both bits for 1/2 of each, AND of those bits can be used\n// as the right shift amount for mixing the two colors in the punchthrough\n// mode). Zero for the punchthrough alpha texels.\nuint4_xe XeDXT1TransWeights(uint4_xe codes) {\n  // Initially 00 = 1:0, 01 = 0:1, 10 = 1:1, 11 = 0:0.\n  // 00 = 0:0, 01 = 1:1, 10 = 0:1, 11 = 1:0.\n  codes = ~codes;\n  // 00 = 0:0, 01 = 1:0, 10 = 0:1, 11 = 1:1.\n  return codes ^ ((codes & 0x55555555u) << 1u);\n}\n\n// Gets the RGBA colors of one row of a DXT1 punchthrough block. Endpoint colors\n// can be obtained using XeDXTColorEndpointsToBGR8In10 (8 bits with 2 bits of\n// free space between each), weights can be obtained using XeDXT1TransWeights\n// and must be shifted right by 8 * row index before calling.\nuint4_xe XeDXT1TransRowToRGBA8(uint2_xe bgr_end_8in10, uint weights) {\n  const uint4_xe weights_shifts_low = uint4_xe(0u, 2u, 4u, 6u);\n  const uint4_xe weights_shifts_high = uint4_xe(1u, 3u, 5u, 7u);\n  uint4_xe bgr_row_8in10_scaled =\n      ((uint_x4_xe(weights) >> weights_shifts_low) & 1u) * bgr_end_8in10.x +\n      ((uint_x4_xe(weights) >> weights_shifts_high) & 1u) * bgr_end_8in10.y;\n  // Whether the texel is (RGB0+RGB1)/2 - divide the weighted sum by 2 (shift\n  // right by 1) if it is.\n  uint weights_sums_log2 = weights & ((weights & 0xAAAAAAAAu) >> 1u);\n  uint4_xe bgr_shift =\n      (uint_x4_xe(weights_sums_log2) >> weights_shifts_low) & 1u;\n  // Whether the texel is opaque.\n  uint weights_alpha =\n      (weights & 0x55555555u) | ((weights & 0xAAAAAAAAu) >> 1u);\n  return (((bgr_row_8in10_scaled & 1023u) >> bgr_shift) << 16u) +\n         ((((bgr_row_8in10_scaled >> 10u) & 1023u) >> bgr_shift) << 8u) +\n         ((bgr_row_8in10_scaled >> 20u) >> bgr_shift) +\n         (((uint_x4_xe(weights_alpha) >> weights_shifts_low) & 1u) *\n          0xFF000000u);\n}\n\n// Converts one row of four DXT3 alpha blocks to 16 packed R8 texels, useful for\n// converting DXT3A. Only 16 bits of alpha half-blocks are used. Alpha is from\n// word 0 for rows 0 and 1, from word 1 for rows 2 and 3, must be shifted right\n// by 16 * (row index & 1) before calling.\nuint4_xe XeDXT3FourBlocksRowToA8(uint4_xe alphas) {\n  // (alphas & 0xFu) | ((alphas & 0xFu) << 4u) |\n  // ((alphas & 0xF0u) << (8u - 4u)) | ((alphas & 0xF0u) << (12u - 4u)) |\n  // ((alphas & 0xF00u) << (16u - 8u)) | ((alphas & 0xF00u) << (20u - 8u)) |\n  // ((alphas & 0xF000u) << (24u - 12u)) | ((alphas & 0xF000u) << (28u - 12u))\n  return (alphas & 0xFu) | ((alphas & 0xFFu) << 4u) |\n         ((alphas & 0xFF0u) << 8u) | ((alphas & 0xFF00u) << 12u) |\n         ((alphas & 0xF000u) << 16u);\n}\n\nuint4_xe XeDXT3AAs1111TwoBlocksRowToBGRA4(uint2_xe halfblocks) {\n  // Only 16 bits of half-blocks are used. X contains pixels 0123, Y - 4567 (in\n  // the image, halfblocks.y is halfblocks.x + 8).\n  // In the row, X contains pixels 01, Y - 23, Z - 45, W - 67.\n  // Assuming alpha in LSB and red in MSB, because it's consistent with how\n  // DXT1/DXT3/DXT5 color components and CTX1 X/Y are ordered in:\n  // http://fileadmin.cs.lth.se/cs/Personal/Michael_Doggett/talks/unc-xenos-doggett.pdf\n  // (LSB on the right, MSB on the left.)\n  // TODO(Triang3l): Investigate this better, 4D53085B is the only known game\n  // that uses it (for lighting in certain places - one of easy to notice usages\n  // is the T-shaped (or somewhat H-shaped) metal beams in the beginning of the\n  // first mission), however the contents don't say anything about the channel\n  // order.\n  uint4_xe row =\n      (((halfblocks.xxyy >> uint2_xe(3u, 11u).xyxy) & 1u) << 8u) |\n      (((halfblocks.xxyy >> uint2_xe(7u, 15u).xyxy) & 1u) << 24u) |\n      (((halfblocks.xxyy >> uint2_xe(2u, 10u).xyxy) & 1u) << 4u) |\n      (((halfblocks.xxyy >> uint2_xe(6u, 14u).xyxy) & 1u) << 20u) |\n      ((halfblocks.xxyy >> uint2_xe(1u, 9u).xyxy) & 1u) |\n      (((halfblocks.xxyy >> uint2_xe(5u, 13u).xyxy) & 1u) << 16u) |\n      (((halfblocks.xxyy >> uint2_xe(0u, 8u).xyxy) & 1u) << 12u) |\n      (((halfblocks.xxyy >> uint2_xe(4u, 12u).xyxy) & 1u) << 28u);\n  row |= row << 1u;\n  row |= row << 2u;\n  return row;\n}\n\nuint4_xe XeDXT3AAs1111TwoBlocksRowToARGB4(uint2_xe halfblocks) {\n  // Only 16 bits of half-blocks are used. X contains pixels 0123, Y - 4567 (in\n  // the image, halfblocks.y is halfblocks.x + 8).\n  // In the row, X contains pixels 01, Y - 23, Z - 45, W - 67.\n  // Assuming alpha in LSB and red in MSB, because it's consistent with how\n  // DXT1/DXT3/DXT5 color components and CTX1 X/Y are ordered in:\n  // http://fileadmin.cs.lth.se/cs/Personal/Michael_Doggett/talks/unc-xenos-doggett.pdf\n  // (LSB on the right, MSB on the left.)\n  // TODO(Triang3l): Investigate this better, 4D53085B is the only known game\n  // that uses it (for lighting in certain places - one of easy to notice usages\n  // is the T-shaped (or somewhat H-shaped) metal beams in the beginning of the\n  // first mission), however the contents don't say anything about the channel\n  // order.\n  uint4_xe row =\n      (((halfblocks.xxyy >> uint2_xe(3u, 11u).xyxy) & 1u) << 4u) |\n      (((halfblocks.xxyy >> uint2_xe(7u, 15u).xyxy) & 1u) << 20u) |\n      (((halfblocks.xxyy >> uint2_xe(2u, 10u).xyxy) & 1u) << 8u) |\n      (((halfblocks.xxyy >> uint2_xe(6u, 14u).xyxy) & 1u) << 24u) |\n      (((halfblocks.xxyy >> uint2_xe(1u, 9u).xyxy) & 1u) << 12u) |\n      (((halfblocks.xxyy >> uint2_xe(5u, 13u).xyxy) & 1u) << 28u) |\n      ((halfblocks.xxyy >> uint2_xe(0u, 8u).xyxy) & 1u) |\n      (((halfblocks.xxyy >> uint2_xe(4u, 12u).xyxy) & 1u) << 16u);\n  row |= row << 1u;\n  row |= row << 2u;\n  return row;\n}\n\n// & 0x249249 = bits 0 of 24 bits of DXT5 alpha codes.\n// & 0x492492 = bits 1 of 24 bits of DXT5 alpha codes.\n// & 0x924924 = bits 2 of 24 bits of DXT5 alpha codes.\n\n// Sorts half (24 bits) of the codes of a DXT5 alpha block so they can be used\n// as weights for the second endpoint, from 0 to 7, in alpha0 > alpha1 mode.\nuint XeDXT5High8StepAlphaWeights(uint codes_24b) {\n  // Initially 000 - first endpoint, 001 - second endpoint, 010 and above -\n  // weights from 6:1 to 1:6. Need to make 001 111, and subtract 1 from 010 and\n  // above.\n  // Whether the bits are 000 (the first endpoint only).\n  uint is_first = ((codes_24b & 0x249249u) | ((codes_24b & 0x492492u) >> 1u) |\n                   ((codes_24b & 0x924924u) >> 2u)) ^ 0x249249u;\n  // Whether the bits are 001 (the second endpoint only).\n  uint is_second = (codes_24b & 0x249249u) & ~((codes_24b & 0x492492u) >> 1u) &\n                   ~((codes_24b & 0x924924u) >> 2u);\n  // Change 000 to 001 so subtracting 1 will result in 0 (and there will never\n  // be overflow), subtract 1, and if the code was originally 001 (the second\n  // endpoint only), make it 111.\n  return ((codes_24b | is_first) - 0x249249u) |\n         is_second | (is_second << 1u) | (is_second << 2u);\n}\n\n// Sorts half (24 bits) of the codes of a DXT5 alpha block so they can be used\n// as weights for the second endpoint, from 0 to 5, in alpha0 <= alpha1 mode,\n// except for 110 and 111 which represent 0 and 1 constants.\nuint XeDXT5High6StepAlphaWeights(uint codes_24b) {\n  // Initially:\n  // 000 - first endpoint.\n  // 001 - second endpoint.\n  // 010 - 4:1.\n  // 011 - 3:2.\n  // 100 - 2:3.\n  // 101 - 1:4.\n  // 110 - constant 0.\n  // 111 - constant 1.\n  // Create 3-bit masks (111 or 000) of whether the codes represent 0 or 1\n  // constants to keep them 110 and 111 later.\n  uint is_constant = codes_24b & 0x492492u & ((codes_24b & 0x924924u) >> 1u);\n  is_constant |= (is_constant << 1u) | (is_constant >> 1u);\n  // Store the codes for the constants (110 or 111), or 0 if not a constant.\n  uint constant_values =\n      ((codes_24b & 0x249249u) | (0x492492u | 0x924924u)) & is_constant;\n  // Need to make 001 101, and subtract 1 from 010 and above (constants will be\n  // handled separately later).\n  // Whether the bits are 000 (the first endpoint only).\n  uint is_first = ((codes_24b & 0x249249u) | ((codes_24b & 0x492492u) >> 1u) |\n                   ((codes_24b & 0x924924u) >> 2u)) ^ 0x249249u;\n  // Whether the bits are 001 (the second endpoint only).\n  uint is_second = (codes_24b & 0x249249u) & ~((codes_24b & 0x492492u) >> 1u) &\n                   ~((codes_24b & 0x924924u) >> 2u);\n  // Change 000 to 001 so subtracting 1 will result in 0 (and there will never\n  // be overflow), subtract 1, and if the code was originally 001 (the second\n  // endpoint only), make it 101.\n  codes_24b =\n      ((codes_24b | is_first) - 0x249249u) | is_second | (is_second << 2u);\n  // Make constants 110 and 111 again (they are 101 and 110 now).\n  return (codes_24b & ~is_constant) | constant_values;\n}\n\n// Sorts half (24 bits) of the codes of a DXT5 alpha block so they can be used\n// as weights for XeDXT5RowToA8.\nuint XeDXT5HighAlphaWeights(uint2_xe end, uint codes_24b) {\n  return (end.x <= end.y) ? XeDXT5High6StepAlphaWeights(codes_24b)\n                          : XeDXT5High8StepAlphaWeights(codes_24b);\n}\n\n// Get alphas of a DXT5 alpha row in alpha0 > alpha1 mode. Endpoint alphas are\n// in bits 0:7 and 8:15 of the first dword, weights can be obtained using\n// XeDXT5High8StepAlphaWeights and must be shifted right by 12 * (row index & 1)\n// before calling.\nuint XeDXT58StepRowToA8(uint2_xe end, uint weights_high) {\n  uint weights_low = ~weights_high;\n  return\n      ((end.x * (weights_low & 7u) + end.y * (weights_high & 7u)) / 7u) |\n      (((end.x * ((weights_low >> 3u) & 7u) +\n         end.y * ((weights_high >> 3u) & 7u)) / 7u) << 8u) |\n      (((end.x * ((weights_low >> 6u) & 7u) +\n         end.y * ((weights_high >> 6u) & 7u)) / 7u) << 16u) |\n      (((end.x * ((weights_low >> 9u) & 7u) +\n         end.y * ((weights_high >> 9u) & 7u)) / 7u) << 24u);\n}\n\n// Version of XeDXT58StepRowToA8 that returns values packed in low 8 bits of\n// 16-bit parts, for DXN decompression.\nuint2_xe XeDXT58StepRowToA8In16(uint2_xe end, uint weights_high) {\n  uint weights_low = ~weights_high;\n  return uint2_xe(\n      ((end.x * (weights_low & 7u) + end.y * (weights_high & 7u)) / 7u) |\n      (((end.x * ((weights_low >> 3u) & 7u) +\n         end.y * ((weights_high >> 3u) & 7u)) / 7u) << 16u),\n      ((end.x * ((weights_low >> 6u) & 7u) +\n        end.y * ((weights_high >> 6u) & 7u)) / 7u) |\n      (((end.x * ((weights_low >> 9u) & 7u) +\n         end.y * ((weights_high >> 9u) & 7u)) / 7u) << 16u));\n}\n\n// Get alphas of a DXT5 alpha row in alpha0 <= alpha1 mode. Endpoint alphas are\n// in bits 0:7 and 8:15 of the first dword, weights can be obtained using\n// XeDXT5High6StepAlphaWeights and must be shifted right by 12 * (row index & 1)\n// before calling.\nuint XeDXT56StepRowToA8(uint2_xe end, uint weights_6step) {\n  // Make a mask for whether the weights are constants.\n  uint is_constant = weights_6step & 0x492u & ((weights_6step & 0x924u) >> 1u);\n  is_constant |= (is_constant << 1u) | (is_constant >> 1u);\n  // Get the weights for the first endpoint and remove constant from the\n  // interpolation (set weights of the endpoints to 0 for them). First need to\n  // zero the weights of the second endpoint so 6 or 7 won't be subtracted from\n  // 5 while getting the weights of the first endpoint.\n  uint weights_high = weights_6step & ~is_constant;\n  uint weights_low = ((5u * 0x249u) - weights_high) & ~is_constant;\n  // Interpolate.\n  uint row =\n      ((end.x * (weights_low & 7u) + end.y * (weights_high & 7u)) / 5u) |\n      (((end.x * ((weights_low >> 3u) & 7u) +\n         end.y * ((weights_high >> 3u) & 7u)) / 5u) << 8u) |\n      (((end.x * ((weights_low >> 6u) & 7u) +\n         end.y * ((weights_high >> 6u) & 7u)) / 5u) << 16u) |\n      (((end.x * ((weights_low >> 9u) & 7u) +\n         end.y * ((weights_high >> 9u) & 7u)) / 5u) << 24u);\n  // Get the constant values as 1 bit per pixel separated by 7 bits.\n  uint constant_values = weights_6step & is_constant;\n  constant_values = (constant_values & 1u) |\n                    ((constant_values & (1u << 3u)) << (8u - 3u)) |\n                    ((constant_values & (1u << 6u)) << (16u - 6u)) |\n                    ((constant_values & (1u << 9u)) << (24u - 9u));\n  // Add constant 1 where needed.\n  return row + constant_values * 0xFFu;\n}\n\n// Version of XeDXT56StepRowToA8 that returns values packed in low 8 bits of\n// 16-bit parts, for DXN decompression.\nuint2_xe XeDXT56StepRowToA8In16(uint2_xe end, uint weights_6step) {\n  // Make a mask for whether the weights are constants.\n  uint is_constant = weights_6step & 0x492u & ((weights_6step & 0x924u) >> 1u);\n  is_constant |= (is_constant << 1u) | (is_constant >> 1u);\n  // Get the weights for the first endpoint and remove constant from the\n  // interpolation (set weights of the endpoints to 0 for them). First need to\n  // zero the weights of the second endpoint so 6 or 7 won't be subtracted from\n  // 5 while getting the weights of the first endpoint.\n  uint weights_high = weights_6step & ~is_constant;\n  uint weights_low = ((5u * 0x249u) - weights_high) & ~is_constant;\n  // Interpolate.\n  uint2_xe row = uint2_xe(\n      ((end.x * (weights_low & 7u) + end.y * (weights_high & 7u)) / 5u) |\n      (((end.x * ((weights_low >> 3u) & 7u) +\n         end.y * ((weights_high >> 3u) & 7u)) / 5u) << 16u),\n      ((end.x * ((weights_low >> 6u) & 7u) +\n        end.y * ((weights_high >> 6u) & 7u)) / 5u) |\n      (((end.x * ((weights_low >> 9u) & 7u) +\n         end.y * ((weights_high >> 9u) & 7u)) / 5u) << 16u));\n  // Get the constant values as 1 bit per pixel separated by 7 bits.\n  uint constant_weights = weights_6step & is_constant;\n  uint2_xe constant_values = uint2_xe(\n      (constant_weights & 1u) | ((constant_weights & (1u << 3u)) << (16u - 3u)),\n      ((constant_weights >> 6u) & 1u) |\n          ((constant_weights & (1u << 9u)) << (16u - 9u)));\n  // Add constant 1 where needed.\n  return row + constant_values * 0xFFu;\n}\n\n// Get alphas of a DXT5 alpha row. Endpoint alphas are in bits 0:7 and 8:15 of\n// the first dword, weights can be obtained using XeDXT5HighAlphaWeights and\n// must be shifted right by 12 * (row index & 1) before calling.\nuint XeDXT5RowToA8(uint2_xe end, uint weights) {\n  return (end.x <= end.y) ? XeDXT56StepRowToA8(end, weights)\n                          : XeDXT58StepRowToA8(end, weights);\n}\n\n// Version of XeDXT5RowToA8 that returns values packed in low 8 bits of 16-bit\n// parts, for DXN decompression.\nuint2_xe XeDXT5RowToA8In16(uint2_xe end, uint weights) {\n  return (end.x <= end.y) ? XeDXT56StepRowToA8In16(end, weights)\n                          : XeDXT58StepRowToA8In16(end, weights);\n}\n\n// Converts one row of two CTX1 blocks to R8G8. Endpoints of block 0 in XY and\n// of block 1 in ZW must be unpacked from 0xRRGGrrgg to 0x00gg00rr 0x00GG00RR so\n// they can be multiplied by weights with room for overflow. Weights can be\n// obtained using XeDXTHighColorWeights and must be shifted right by 8 * row\n// index before calling.\nuint4_xe XeCTX1TwoBlocksRowToR8G8(uint4_xe end_8in16, uint2_xe weights_high) {\n  uint2_xe weights_low = ~weights_high;\n  const uint4_xe weights_shifts = uint4_xe(0u, 2u, 4u, 6u);\n  uint4_xe row_8in16 =\n      ((weights_low.xxxx >> weights_shifts) & 3u) * end_8in16.x +\n      ((weights_high.xxxx >> weights_shifts) & 3u) * end_8in16.y;\n  uint4_xe result;\n  result.xy = ((row_8in16.xz & 0xFFFFu) / 3u) |\n              (((row_8in16.xz >> 16u) / 3u) << 8u) |\n              (((row_8in16.yw & 0xFFFFu) / 3u) << 16u) |\n              (((row_8in16.yw >> 16u) / 3u) << 24u);\n  row_8in16 = ((weights_low.yyyy >> weights_shifts) & 3u) * end_8in16.z +\n              ((weights_high.yyyy >> weights_shifts) & 3u) * end_8in16.w;\n  result.zw = ((row_8in16.xz & 0xFFFFu) / 3u) |\n              (((row_8in16.xz >> 16u) / 3u) << 8u) |\n              (((row_8in16.yw & 0xFFFFu) / 3u) << 16u) |\n              (((row_8in16.yw >> 16u) / 3u) << 24u);\n  return result;\n}\n\n#endif  // XENIA_GPU_SHADERS_PIXEL_FORMATS_XESLI_\n"
  },
  {
    "path": "src/xenia/gpu/shaders/resolve.xesli",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_SHADERS_RESOLVE_XESLI_\n#define XENIA_GPU_SHADERS_RESOLVE_XESLI_\n\n#include \"edram.xesli\"\n#include \"pixel_formats.xesli\"\n#include \"texture_address.xesli\"\n\n#define kXenosCopySampleSelect_0 0u\n#define kXenosCopySampleSelect_1 1u\n#define kXenosCopySampleSelect_2 2u\n#define kXenosCopySampleSelect_3 3u\n#define kXenosCopySampleSelect_01 4u\n#define kXenosCopySampleSelect_23 5u\n#define kXenosCopySampleSelect_0123 6u\n\npush_const_begin_xe(b0, space0)\n  #ifdef XE_RESOLVE_CLEAR\n    uint2_xe xe_resolve_clear_value;\n  #endif\n  // xe::gpu::draw_util::ResolveEdramInfo.\n  uint xe_resolve_edram_info;\n  // xe::gpu::draw_util::ResolveCoordinateInfo.\n  uint xe_resolve_coordinate_info;\n  #ifndef XE_RESOLVE_CLEAR\n    // Sanitized RB_COPY_DEST_INFO.\n    uint xe_resolve_dest_info;\n    // xe::gpu::draw_util::ResolveCopyDestCoordinateInfo.\n    uint xe_resolve_dest_coordinate_info;\n    #ifndef XE_RESOLVE_RESOLUTION_SCALED\n      uint xe_resolve_dest_base;\n    #endif\n  #endif\npush_const_end_xe\n\n#define XE_RESOLVE_PUSH_CONST_BINDING push_const_binding_xe(buffer(0))\n\n#ifndef XE_RESOLVE_CLEAR\n  #if XE_RESOLVE_COPY_EDRAM_BYTE_BUFFER_ALIGNMENT == 4\n    #define XE_RESOLVE_COPY_EDRAM_BYTE_BUFFER_DECLARE_MACRO \\\n        byte_buffer_align4_declare_xe\n  #elif XE_RESOLVE_COPY_EDRAM_BYTE_BUFFER_ALIGNMENT == 8\n    #define XE_RESOLVE_COPY_EDRAM_BYTE_BUFFER_DECLARE_MACRO \\\n        byte_buffer_align8_declare_xe\n  #elif XE_RESOLVE_COPY_EDRAM_BYTE_BUFFER_ALIGNMENT == 16\n    #define XE_RESOLVE_COPY_EDRAM_BYTE_BUFFER_DECLARE_MACRO \\\n        byte_buffer_align16_declare_xe\n  #endif\n  #ifdef XE_RESOLVE_COPY_EDRAM_BYTE_BUFFER_DECLARE_MACRO\n    XE_RESOLVE_COPY_EDRAM_BYTE_BUFFER_DECLARE_MACRO(xe_resolve_edram, set=0,\n                                                    binding=0, t0, space0)\n  #endif\n  #define XE_RESOLVE_COPY_EDRAM_BINDING \\\n      byte_buffer_binding_xe(xe_resolve_edram, buffer(2))\n#endif\n\nstruct XeResolveInfo {\n  uint edram_pitch_tiles;\n  uint edram_msaa_samples;\n  // Always false for non-one-to-one resolve.\n  bool edram_is_depth;\n  uint edram_base_tiles;\n  uint edram_format;\n  uint edram_format_ints_log2;\n  uint2_xe resolution_scale;\n  uint2_xe half_pixel_offset_fill_source;\n  uint2_xe edram_offset_scaled;\n  uint width_div_8_scaled;\n  #ifdef XE_RESOLVE_CLEAR\n    uint2_xe clear_value;\n  #else\n    uint dest_endian_128;\n    bool dest_is_array;\n    uint dest_slice;\n    uint dest_format;\n    float dest_exp_bias_factor;\n    bool dest_swap;\n    uint dest_row_pitch_macro_tiles;\n    uint dest_slice_pitch_3d_macro_tiles;\n    uint2_xe dest_xy_offset_scaled;\n    uint sample_select;\n    uint dest_base;\n  #endif  // XE_RESOLVE_CLEAR\n};\n\nXeResolveInfo XeResolveGetInfo(param_push_consts_xe) {\n  XeResolveInfo resolve_info;\n  uint edram_info = push_const_xe(xe_resolve_edram_info);\n  uint coordinate_info = push_const_xe(xe_resolve_coordinate_info);\n  resolve_info.edram_pitch_tiles = edram_info & ((1u << 10u) - 1u);\n  resolve_info.edram_msaa_samples = (edram_info >> 10u) & ((1u << 2u) - 1u);\n  resolve_info.edram_is_depth = (edram_info & (1u << 12u)) != 0u;\n  resolve_info.edram_base_tiles = (edram_info >> 13u) & ((1u << 11u) - 1u);\n  resolve_info.edram_format = (edram_info >> 24u) & ((1u << 4u) - 1u);\n  resolve_info.edram_format_ints_log2 = (edram_info >> 28u) & 1u;\n  #ifdef XE_RESOLVE_RESOLUTION_SCALED\n    resolve_info.resolution_scale =\n        (uint_x2_xe(coordinate_info) >> uint2_xe(16u, 19u)) & 7u;\n    if ((edram_info & (1u << 29u)) != 0u) {\n      resolve_info.half_pixel_offset_fill_source =\n          resolve_info.resolution_scale >> 1u;\n    } else {\n      resolve_info.half_pixel_offset_fill_source = uint_x2_xe(0u);\n    }\n  #else\n    resolve_info.resolution_scale = uint_x2_xe(1u);\n    resolve_info.half_pixel_offset_fill_source = uint_x2_xe(0u);\n  #endif\n  resolve_info.edram_offset_scaled =\n      (((uint_x2_xe(coordinate_info) >> uint2_xe(0u, 4u)) &\n        ((uint_x2_xe(1u) << uint2_xe(4u, 1u)) - 1u)) <<\n       3u) *\n      resolve_info.resolution_scale;\n  resolve_info.width_div_8_scaled =\n      ((coordinate_info >> 5u) & ((1u << 11u) - 1u)) *\n      resolve_info.resolution_scale.x;\n  #ifdef XE_RESOLVE_CLEAR\n    resolve_info.clear_value = push_const_xe(xe_resolve_clear_value);\n  #else\n    uint dest_info = push_const_xe(xe_resolve_dest_info);\n    uint dest_coordinate_info =\n        push_const_xe(xe_resolve_dest_coordinate_info);\n    resolve_info.dest_endian_128 = dest_info & ((1u << 3u) - 1u);\n    resolve_info.dest_is_array = (dest_info & (1u << 3u)) != 0u;\n    resolve_info.dest_slice = (dest_info >> 4u) & ((1u << 3u) - 1u);\n    resolve_info.dest_format = (dest_info >> 7u) & ((1u << 6u) - 1u);\n    resolve_info.dest_exp_bias_factor = int_bits_to_float_xe(\n        (int(dest_info) << (32 - (16 + 6)) >> (32 - 6) << 23) +\n        float_bits_to_int_xe(1.0f));\n    resolve_info.dest_swap = (dest_info & (1u << 24u)) != 0u;\n    resolve_info.dest_row_pitch_macro_tiles =\n        dest_coordinate_info & ((1u << 10u) - 1u);\n    resolve_info.dest_slice_pitch_3d_macro_tiles =\n        ((dest_coordinate_info >> 10u) & ((1u << 10u) - 1u)) <<\n        (5 - XENOS_TEXTURE_MACRO_TILE_HEIGHT_3D_LOG2);\n    resolve_info.dest_xy_offset_scaled =\n        (((uint_x2_xe(dest_coordinate_info) >> uint2_xe(20u, 24u)) &\n          ((1u << 4u) - 1u)) <<\n         3u) *\n        resolve_info.resolution_scale;\n    resolve_info.sample_select =\n        (dest_coordinate_info >> 28u) & ((1u << 3u) - 1u);\n    #ifndef XE_RESOLVE_RESOLUTION_SCALED\n      resolve_info.dest_base = push_const_xe(xe_resolve_dest_base);\n    #else\n      resolve_info.dest_base = 0;\n    #endif\n  #endif  // XE_RESOLVE_CLEAR\n  return resolve_info;\n}\n\nuint XeResolveEdramPixelStrideBytes(XeResolveInfo resolve_info) {\n  return 4u << (resolve_info.edram_format_ints_log2 +\n                uint(resolve_info.edram_msaa_samples >= kXenosMsaaSamples_4X));\n}\n\n#ifndef XE_RESOLVE_CLEAR\n  uint XeResolveDestPixelAddress(const XeResolveInfo resolve_info,\n                                 uint2_xe host_position,\n                                 const uint bytes_per_block_log2) {\n    host_position += resolve_info.dest_xy_offset_scaled;\n    uint address;\n    uint2_xe guest_position = host_position;\n    #ifdef XE_RESOLVE_RESOLUTION_SCALED\n      const XeniaTextureResolutionScaledAddressing\n          resolution_scaled_addressing =\n              XeniaTextureGetResolutionScaledAddressing(\n                  host_position.xy, resolve_info.resolution_scale,\n                  bytes_per_block_log2);\n      guest_position = resolution_scaled_addressing.guest_group_origin;\n    #endif\n    dont_flatten_xe if (resolve_info.dest_is_array) {\n      address = uint(XenosTextureTiledAddress3D(\n          int3_xe(uint3_xe(guest_position, resolve_info.dest_slice)),\n          resolve_info.dest_row_pitch_macro_tiles,\n          resolve_info.dest_slice_pitch_3d_macro_tiles, bytes_per_block_log2));\n    } else {\n      address = uint(XenosTextureTiledAddress2D(\n          int2_xe(guest_position), resolve_info.dest_row_pitch_macro_tiles,\n          bytes_per_block_log2));\n    }\n    #ifdef XE_RESOLVE_RESOLUTION_SCALED\n      address = address * (resolve_info.resolution_scale.x *\n                           resolve_info.resolution_scale.y) +\n                resolution_scaled_addressing.host_byte_offset_in_guest_group;\n    #endif\n    address += resolve_info.dest_base;\n    return address;\n  }\n\n  // XOR to apply to the byte address to flip the bits corresponding to the\n  // given X coordinate bits within the macro tile width, or with resolution\n  // scaling, within XeniaTextureResolutionScaledGroupBlocks.x.\n  // Addition is recommended instead of XOR if the bits are known to be 0 in the\n  // original address, so the host GPU driver can optimize it into a constant\n  // store offset if available in the host hardware shader instruction set\n  // architecture.\n  uint XeResolveLocalXAddressXor(const uint x,\n                                 const uint bytes_per_block_log2) {\n    #ifdef XE_RESOLVE_RESOLUTION_SCALED\n      return x << bytes_per_block_log2;\n    #else\n      return uint(XenosTextureTiledAddressXInMacroXor(int(x),\n                                                      bytes_per_block_log2));\n    #endif\n  }\n\n  #define kXenosCopySampleSelect_0 0u\n  #define kXenosCopySampleSelect_1 1u\n  #define kXenosCopySampleSelect_2 2u\n  #define kXenosCopySampleSelect_3 3u\n  #define kXenosCopySampleSelect_01 4u\n  #define kXenosCopySampleSelect_23 5u\n  #define kXenosCopySampleSelect_0123 6u\n\n  uint XeResolveFirstSampleIndex(uint sample_select) {\n    uint sample_index;\n    if (sample_select <= kXenosCopySampleSelect_3) {\n      sample_index = sample_select;\n    } else if (sample_select == kXenosCopySampleSelect_23) {\n      sample_index = 2u;\n    } else {\n      sample_index = 0u;\n    }\n    return sample_index;\n  }\n\n  // Offset to the first sample to participate in averaging (or the sample to be\n  // copied if not averaging).\n  uint XeResolveColorCopySourcePixelAddressBytesYHalfPixelOffsetFilling(\n      XeResolveInfo resolve_info, uint2_xe pixel_index) {\n    return XeEdramOffsetBytes(\n        uint2_xe(pixel_index.x,\n                 max(pixel_index.y,\n                     resolve_info.half_pixel_offset_fill_source.y)) +\n            resolve_info.edram_offset_scaled,\n        resolve_info.edram_base_tiles, true, resolve_info.edram_pitch_tiles,\n        resolve_info.edram_msaa_samples, false,\n        resolve_info.edram_format_ints_log2,\n        XeResolveFirstSampleIndex(resolve_info.sample_select),\n        resolve_info.resolution_scale);\n  }\n\n  // Not using arrays for multi-pixel function arguments because indexable temps\n  // are generated for them by FXC, that may be compiled unoptimally by the host\n  // GPU driver.\n\n  void XeResolveUnpack32bpp2Samples(\n      uint2_xe packed, uint format, out_param_xe(float4_xe, sample_0),\n      out_param_xe(float4_xe, sample_1)) {\n    switch (format) {\n      case kXenosColorRenderTargetFormat_8_8_8_8:\n      case kXenosColorRenderTargetFormat_8_8_8_8_GAMMA:\n        sample_0 = XeUnpackR8G8B8A8UNorm(packed.x);\n        sample_1 = XeUnpackR8G8B8A8UNorm(packed.y);\n        break;\n      case kXenosColorRenderTargetFormat_2_10_10_10:\n      case kXenosColorRenderTargetFormat_2_10_10_10_AS_10_10_10_10:\n        sample_0 = XeUnpackR10G10B10A2UNorm(packed.x);\n        sample_1 = XeUnpackR10G10B10A2UNorm(packed.y);\n        break;\n      case kXenosColorRenderTargetFormat_2_10_10_10_FLOAT:\n      case kXenosColorRenderTargetFormat_2_10_10_10_FLOAT_AS_16_16_16_16:\n        sample_0 = XeUnpackR10G10B10A2Float(packed.x);\n        sample_1 = XeUnpackR10G10B10A2Float(packed.y);\n        break;\n      case kXenosColorRenderTargetFormat_16_16:\n        sample_0 = float4_xe(XeUnpackR16G16Edram(packed.x), 0.0f, 0.0f);\n        sample_1 = float4_xe(XeUnpackR16G16Edram(packed.y), 0.0f, 0.0f);\n        break;\n      case kXenosColorRenderTargetFormat_16_16_FLOAT:\n        sample_0 = float4_xe(unpack_half_2x16_xe(packed.x), 0.0f, 0.0f);\n        sample_1 = float4_xe(unpack_half_2x16_xe(packed.y), 0.0f, 0.0f);\n        break;\n      default:\n        // Treat as 32_FLOAT.\n        sample_0 = float2_xe(uint_bits_to_float_xe(packed.x), 0.0f).xyyy;\n        sample_1 = float2_xe(uint_bits_to_float_xe(packed.y), 0.0f).xyyy;\n        break;\n    }\n  }\n\n  void XeResolveUnpack32bpp4Samples(\n      uint4_xe packed, uint format, out_param_xe(float4_xe, sample_0),\n      out_param_xe(float4_xe, sample_1), out_param_xe(float4_xe, sample_2),\n      out_param_xe(float4_xe, sample_3)) {\n    switch (format) {\n      case kXenosColorRenderTargetFormat_8_8_8_8:\n      case kXenosColorRenderTargetFormat_8_8_8_8_GAMMA:\n        sample_0 = XeUnpackR8G8B8A8UNorm(packed.x);\n        sample_1 = XeUnpackR8G8B8A8UNorm(packed.y);\n        sample_2 = XeUnpackR8G8B8A8UNorm(packed.z);\n        sample_3 = XeUnpackR8G8B8A8UNorm(packed.w);\n        break;\n      case kXenosColorRenderTargetFormat_2_10_10_10:\n      case kXenosColorRenderTargetFormat_2_10_10_10_AS_10_10_10_10:\n        sample_0 = XeUnpackR10G10B10A2UNorm(packed.x);\n        sample_1 = XeUnpackR10G10B10A2UNorm(packed.y);\n        sample_2 = XeUnpackR10G10B10A2UNorm(packed.z);\n        sample_3 = XeUnpackR10G10B10A2UNorm(packed.w);\n        break;\n      case kXenosColorRenderTargetFormat_2_10_10_10_FLOAT:\n      case kXenosColorRenderTargetFormat_2_10_10_10_FLOAT_AS_16_16_16_16:\n        sample_0 = XeUnpackR10G10B10A2Float(packed.x);\n        sample_1 = XeUnpackR10G10B10A2Float(packed.y);\n        sample_2 = XeUnpackR10G10B10A2Float(packed.z);\n        sample_3 = XeUnpackR10G10B10A2Float(packed.w);\n        break;\n      case kXenosColorRenderTargetFormat_16_16:\n        sample_0 = float4_xe(XeUnpackR16G16Edram(packed.x), 0.0f, 0.0f);\n        sample_1 = float4_xe(XeUnpackR16G16Edram(packed.y), 0.0f, 0.0f);\n        sample_2 = float4_xe(XeUnpackR16G16Edram(packed.z), 0.0f, 0.0f);\n        sample_3 = float4_xe(XeUnpackR16G16Edram(packed.w), 0.0f, 0.0f);\n        break;\n      case kXenosColorRenderTargetFormat_16_16_FLOAT:\n        sample_0 = float4_xe(unpack_half_2x16_xe(packed.x), 0.0f, 0.0f);\n        sample_1 = float4_xe(unpack_half_2x16_xe(packed.y), 0.0f, 0.0f);\n        sample_2 = float4_xe(unpack_half_2x16_xe(packed.z), 0.0f, 0.0f);\n        sample_3 = float4_xe(unpack_half_2x16_xe(packed.w), 0.0f, 0.0f);\n        break;\n      default:\n        // Treat as 32_FLOAT.\n        sample_0 = float2_xe(uint_bits_to_float_xe(packed.x), 0.0f).xyyy;\n        sample_1 = float2_xe(uint_bits_to_float_xe(packed.y), 0.0f).xyyy;\n        sample_2 = float2_xe(uint_bits_to_float_xe(packed.z), 0.0f).xyyy;\n        sample_3 = float2_xe(uint_bits_to_float_xe(packed.w), 0.0f).xyyy;\n        break;\n    }\n  }\n\n  void XeResolveUnpack32bpp8RedSamples(\n      uint4_xe packed_0123, uint4_xe packed_4567, uint format, bool swap,\n      out_param_xe(float4_xe, samples_0123),\n      out_param_xe(float4_xe, samples_4567)) {\n    switch (format) {\n      case kXenosColorRenderTargetFormat_8_8_8_8:\n      case kXenosColorRenderTargetFormat_8_8_8_8_GAMMA: {\n        uint shift = swap ? 16u : 0u;\n        samples_0123 = XeUnpackR8UNormX4(packed_0123 >> shift);\n        samples_4567 = XeUnpackR8UNormX4(packed_4567 >> shift);\n      } break;\n      case kXenosColorRenderTargetFormat_2_10_10_10:\n      case kXenosColorRenderTargetFormat_2_10_10_10_AS_10_10_10_10: {\n        uint shift = swap ? 20u : 0u;\n        samples_0123 = XeUnpackR10UNormX4(packed_0123 >> shift);\n        samples_4567 = XeUnpackR10UNormX4(packed_4567 >> shift);\n      } break;\n      case kXenosColorRenderTargetFormat_2_10_10_10_FLOAT:\n      case kXenosColorRenderTargetFormat_2_10_10_10_FLOAT_AS_16_16_16_16: {\n        uint shift = swap ? 20u : 0u;\n        samples_0123 = XeUnpackR10FloatX4(packed_0123 >> shift);\n        samples_4567 = XeUnpackR10FloatX4(packed_4567 >> shift);\n      } break;\n      case kXenosColorRenderTargetFormat_16_16:\n        samples_0123 = XeUnpackR16EdramX4(packed_0123);\n        samples_4567 = XeUnpackR16EdramX4(packed_4567);\n        break;\n      case kXenosColorRenderTargetFormat_16_16_FLOAT:\n        samples_0123.x = unpack_half_2x16_xe(packed_0123.x).x;\n        samples_0123.y = unpack_half_2x16_xe(packed_0123.y).x;\n        samples_0123.z = unpack_half_2x16_xe(packed_0123.z).x;\n        samples_0123.w = unpack_half_2x16_xe(packed_0123.w).x;\n        samples_4567.x = unpack_half_2x16_xe(packed_4567.x).x;\n        samples_4567.y = unpack_half_2x16_xe(packed_4567.y).x;\n        samples_4567.z = unpack_half_2x16_xe(packed_4567.z).x;\n        samples_4567.w = unpack_half_2x16_xe(packed_4567.w).x;\n        break;\n      default:\n        // Treat as 32_FLOAT.\n        samples_0123 = uint_bits_to_float_xe(packed_0123);\n        samples_4567 = uint_bits_to_float_xe(packed_4567);\n        break;\n    }\n  }\n\n  void XeResolveUnpack64bpp2Samples(\n      uint4_xe packed, uint format, out_param_xe(float4_xe, sample_0),\n      out_param_xe(float4_xe, sample_1)) {\n    switch (format) {\n      case kXenosColorRenderTargetFormat_16_16_16_16:\n        sample_0 = XeUnpackR16G16B16A16Edram(packed.xy);\n        sample_1 = XeUnpackR16G16B16A16Edram(packed.zw);\n        break;\n      case kXenosColorRenderTargetFormat_16_16_16_16_FLOAT:\n        sample_0.xy = unpack_half_2x16_xe(packed.x);\n        sample_0.zw = unpack_half_2x16_xe(packed.y);\n        sample_1.xy = unpack_half_2x16_xe(packed.z);\n        sample_1.zw = unpack_half_2x16_xe(packed.w);\n        break;\n      default:\n        // Treat as 32_32_FLOAT.\n        sample_0 = float4_xe(uint_bits_to_float_xe(packed.xy), 0.0f, 0.0f);\n        sample_1 = float4_xe(uint_bits_to_float_xe(packed.zw), 0.0f, 0.0f);\n        break;\n    }\n  }\n\n  void XeResolveUnpack64bpp4Samples(\n      uint4_xe packed_01, uint4_xe packed_23, uint format,\n      out_param_xe(float4_xe, sample_0), out_param_xe(float4_xe, sample_1),\n      out_param_xe(float4_xe, sample_2), out_param_xe(float4_xe, sample_3)) {\n    switch (format) {\n      case kXenosColorRenderTargetFormat_16_16_16_16:\n        sample_0 = XeUnpackR16G16B16A16Edram(packed_01.xy);\n        sample_1 = XeUnpackR16G16B16A16Edram(packed_01.zw);\n        sample_2 = XeUnpackR16G16B16A16Edram(packed_23.xy);\n        sample_3 = XeUnpackR16G16B16A16Edram(packed_23.zw);\n        break;\n      case kXenosColorRenderTargetFormat_16_16_16_16_FLOAT:\n        sample_0.xy = unpack_half_2x16_xe(packed_01.x);\n        sample_0.zw = unpack_half_2x16_xe(packed_01.y);\n        sample_1.xy = unpack_half_2x16_xe(packed_01.z);\n        sample_1.zw = unpack_half_2x16_xe(packed_01.w);\n        sample_2.xy = unpack_half_2x16_xe(packed_23.x);\n        sample_2.zw = unpack_half_2x16_xe(packed_23.y);\n        sample_3.xy = unpack_half_2x16_xe(packed_23.z);\n        sample_3.zw = unpack_half_2x16_xe(packed_23.w);\n        break;\n      default:\n        // Treat as 32_32_FLOAT.\n        sample_0 = float4_xe(uint_bits_to_float_xe(packed_01.xy), 0.0f, 0.0f);\n        sample_1 = float4_xe(uint_bits_to_float_xe(packed_01.zw), 0.0f, 0.0f);\n        sample_2 = float4_xe(uint_bits_to_float_xe(packed_23.xy), 0.0f, 0.0f);\n        sample_3 = float4_xe(uint_bits_to_float_xe(packed_23.zw), 0.0f, 0.0f);\n        break;\n    }\n  }\n\n  void XeResolveUnpack64bpp8RedUnswappedSamples(\n      uint4_xe packed_0123, uint4_xe packed_4567, uint format,\n      out_param_xe(float4_xe, samples_0123),\n      out_param_xe(float4_xe, samples_4567)) {\n    switch (format) {\n      case kXenosColorRenderTargetFormat_16_16_16_16:\n        samples_0123 = XeUnpackR16EdramX4(packed_0123);\n        samples_4567 = XeUnpackR16EdramX4(packed_4567);\n        break;\n      case kXenosColorRenderTargetFormat_16_16_16_16_FLOAT:\n        samples_0123.x = unpack_half_2x16_xe(packed_0123.x).x;\n        samples_0123.y = unpack_half_2x16_xe(packed_0123.y).x;\n        samples_0123.z = unpack_half_2x16_xe(packed_0123.z).x;\n        samples_0123.w = unpack_half_2x16_xe(packed_0123.w).x;\n        samples_4567.x = unpack_half_2x16_xe(packed_4567.x).x;\n        samples_4567.y = unpack_half_2x16_xe(packed_4567.y).x;\n        samples_4567.z = unpack_half_2x16_xe(packed_4567.z).x;\n        samples_4567.w = unpack_half_2x16_xe(packed_4567.w).x;\n        break;\n      default:\n        // Treat as 32_32_FLOAT.\n        samples_0123 = uint_bits_to_float_xe(packed_0123);\n        samples_4567 = uint_bits_to_float_xe(packed_4567);\n        break;\n    }\n  }\n\n  #if XE_RESOLVE_COPY_EDRAM_BYTE_BUFFER_ALIGNMENT == 4\n    void XeResolveLoad2RGBAUnswappedPixelSamplesFromRaw(\n        param_byte_buffer_xe(xe_resolve_edram) param_next_after_byte_buffer_xe\n        uint sample_address_bytes, uint pixel_stride_bytes,\n        uint format_ints_log2, uint format, out_param_xe(float4_xe, pixel_0),\n        out_param_xe(float4_xe, pixel_1)) {\n      dont_flatten_xe if (format_ints_log2 != 0u) {\n        uint4_xe packed;\n        dont_flatten_xe if (pixel_stride_bytes == 8u) {\n          packed = byte_buffer_align4_load16u_xe(\n              xe_resolve_edram, sample_address_bytes);\n        } else {\n          packed.xy = byte_buffer_align4_load8u_xe(\n              xe_resolve_edram, sample_address_bytes);\n          packed.zw = byte_buffer_align4_load8u_xe(\n              xe_resolve_edram, sample_address_bytes + pixel_stride_bytes);\n        }\n        XeResolveUnpack64bpp2Samples(packed, format, pixel_0, pixel_1);\n      } else {\n        uint2_xe packed;\n        dont_flatten_xe if (pixel_stride_bytes == 4u) {\n          packed = byte_buffer_align4_load8u_xe(\n              xe_resolve_edram, sample_address_bytes);\n        } else {\n          packed.x = byte_buffer_align4_load4_xe(\n              xe_resolve_edram, sample_address_bytes);\n          packed.y = byte_buffer_align4_load4_xe(\n              xe_resolve_edram, sample_address_bytes + pixel_stride_bytes);\n        }\n        XeResolveUnpack32bpp2Samples(packed, format, pixel_0, pixel_1);\n      }\n    }\n\n    void XeResolveLoad4RGBAUnswappedPixelSamplesFromRaw(\n        param_byte_buffer_xe(xe_resolve_edram) param_next_after_byte_buffer_xe\n        uint sample_address_bytes, uint pixel_stride_bytes,\n        uint format_ints_log2, uint format, out_param_xe(float4_xe, pixel_0),\n        out_param_xe(float4_xe, pixel_1), out_param_xe(float4_xe, pixel_2),\n        out_param_xe(float4_xe, pixel_3)) {\n      dont_flatten_xe if (format_ints_log2 != 0u) {\n        uint4_xe packed_01, packed_23;\n        dont_flatten_xe if (pixel_stride_bytes == 8u) {\n          packed_01 = byte_buffer_align4_load16u_xe(\n              xe_resolve_edram, sample_address_bytes);\n          packed_23 = byte_buffer_align4_load16u_xe(\n              xe_resolve_edram, sample_address_bytes + 16u);\n        } else {\n          packed_01.xy = byte_buffer_align4_load8u_xe(\n              xe_resolve_edram, sample_address_bytes);\n          packed_01.zw = byte_buffer_align4_load8u_xe(\n              xe_resolve_edram, sample_address_bytes + pixel_stride_bytes);\n          packed_23.xy = byte_buffer_align4_load8u_xe(\n              xe_resolve_edram, sample_address_bytes + 2u * pixel_stride_bytes);\n          packed_23.zw = byte_buffer_align4_load8u_xe(\n              xe_resolve_edram, sample_address_bytes + 3u * pixel_stride_bytes);\n        }\n        XeResolveUnpack64bpp4Samples(packed_01, packed_23, format, pixel_0,\n                                     pixel_1, pixel_2, pixel_3);\n      } else {\n        uint4_xe packed;\n        dont_flatten_xe if (pixel_stride_bytes == 4u) {\n          packed = byte_buffer_align4_load16u_xe(\n              xe_resolve_edram, sample_address_bytes);\n        } else {\n          packed.x = byte_buffer_align4_load4_xe(\n              xe_resolve_edram, sample_address_bytes);\n          packed.y = byte_buffer_align4_load4_xe(\n              xe_resolve_edram, sample_address_bytes + pixel_stride_bytes);\n          packed.z = byte_buffer_align4_load4_xe(\n              xe_resolve_edram, sample_address_bytes + 2u * pixel_stride_bytes);\n          packed.w = byte_buffer_align4_load4_xe(\n              xe_resolve_edram, sample_address_bytes + 3u * pixel_stride_bytes);\n        }\n        XeResolveUnpack32bpp4Samples(packed, format, pixel_0, pixel_1, pixel_2,\n                                     pixel_3);\n      }\n    }\n\n    // For red/blue swapping for 64bpp, pre-add 4 to sample_address_bytes.\n    void XeResolveLoad8RedPixelSamplesFromRaw(\n        param_byte_buffer_xe(xe_resolve_edram) param_next_after_byte_buffer_xe\n        uint sample_address_bytes, uint pixel_stride_bytes,\n        uint format_ints_log2, uint format, bool swap_32bpp,\n        out_param_xe(float4_xe, pixels_0123),\n        out_param_xe(float4_xe, pixels_4567)) {\n      uint4_xe packed_0123, packed_4567;\n      dont_flatten_xe if (pixel_stride_bytes == 4u) {\n        packed_0123 = byte_buffer_align4_load16u_xe(\n            xe_resolve_edram, sample_address_bytes);\n        packed_4567 = byte_buffer_align4_load16u_xe(\n            xe_resolve_edram, sample_address_bytes + 16u);\n      } else {\n        packed_0123.x = byte_buffer_align4_load4_xe(\n            xe_resolve_edram, sample_address_bytes);\n        packed_0123.y = byte_buffer_align4_load4_xe(\n            xe_resolve_edram, sample_address_bytes + pixel_stride_bytes);\n        packed_0123.z = byte_buffer_align4_load4_xe(\n            xe_resolve_edram, sample_address_bytes + 2u * pixel_stride_bytes);\n        packed_0123.w = byte_buffer_align4_load4_xe(\n            xe_resolve_edram, sample_address_bytes + 3u * pixel_stride_bytes);\n        packed_4567.x = byte_buffer_align4_load4_xe(\n            xe_resolve_edram, sample_address_bytes + 4u * pixel_stride_bytes);\n        packed_4567.y = byte_buffer_align4_load4_xe(\n            xe_resolve_edram, sample_address_bytes + 5u * pixel_stride_bytes);\n        packed_4567.z = byte_buffer_align4_load4_xe(\n            xe_resolve_edram, sample_address_bytes + 6u * pixel_stride_bytes);\n        packed_4567.w = byte_buffer_align4_load4_xe(\n            xe_resolve_edram, sample_address_bytes + 7u * pixel_stride_bytes);\n      }\n      dont_flatten_xe if (format_ints_log2 != 0u) {\n        XeResolveUnpack64bpp8RedUnswappedSamples(packed_0123, packed_4567,\n                                                 format, pixels_0123,\n                                                 pixels_4567);\n      } else {\n        XeResolveUnpack32bpp8RedSamples(packed_0123, packed_4567, format,\n                                        swap_32bpp, pixels_0123, pixels_4567);\n      }\n    }\n\n    void XeResolveLoad2RGBAColors(\n        param_byte_buffer_xe(xe_resolve_edram) param_next_after_byte_buffer_xe\n        XeResolveInfo resolve_info, uint address_bytes,\n        out_param_xe(float4_xe, pixel_0), out_param_xe(float4_xe, pixel_1)) {\n      uint pixel_stride_bytes = XeResolveEdramPixelStrideBytes(resolve_info);\n      XeResolveLoad2RGBAUnswappedPixelSamplesFromRaw(\n          pass_byte_buffer_xe(xe_resolve_edram) pass_next_after_byte_buffer_xe\n          address_bytes, pixel_stride_bytes,\n          resolve_info.edram_format_ints_log2, resolve_info.edram_format,\n          pixel_0, pixel_1);\n      float exp_bias = resolve_info.dest_exp_bias_factor;\n      dont_flatten_xe\n      if (resolve_info.sample_select >= kXenosCopySampleSelect_01) {\n        uint tile_row_stride_bytes = 4u * 80u * resolve_info.resolution_scale.x;\n        // TODO(Triang3l): Gamma-correct resolve for 8_8_8_8_GAMMA.\n        exp_bias *= 0.5f;\n        float4_xe msaa_resolve_pixel_0, msaa_resolve_pixel_1;\n        XeResolveLoad2RGBAUnswappedPixelSamplesFromRaw(\n            pass_byte_buffer_xe(xe_resolve_edram) pass_next_after_byte_buffer_xe\n            address_bytes + tile_row_stride_bytes, pixel_stride_bytes,\n            resolve_info.edram_format_ints_log2, resolve_info.edram_format,\n            msaa_resolve_pixel_0, msaa_resolve_pixel_1);\n        pixel_0 += msaa_resolve_pixel_0;\n        pixel_1 += msaa_resolve_pixel_1;\n        dont_flatten_xe\n        if (resolve_info.sample_select >= kXenosCopySampleSelect_0123) {\n          uint sample_stride_bytes = 4u << resolve_info.edram_format_ints_log2;\n          exp_bias *= 0.5f;\n          XeResolveLoad2RGBAUnswappedPixelSamplesFromRaw(\n              pass_byte_buffer_xe(xe_resolve_edram)\n              pass_next_after_byte_buffer_xe\n              address_bytes + sample_stride_bytes, pixel_stride_bytes,\n              resolve_info.edram_format_ints_log2, resolve_info.edram_format,\n              msaa_resolve_pixel_0, msaa_resolve_pixel_1);\n          pixel_0 += msaa_resolve_pixel_0;\n          pixel_1 += msaa_resolve_pixel_1;\n          XeResolveLoad2RGBAUnswappedPixelSamplesFromRaw(\n              pass_byte_buffer_xe(xe_resolve_edram)\n              pass_next_after_byte_buffer_xe\n              address_bytes + tile_row_stride_bytes + sample_stride_bytes,\n              pixel_stride_bytes, resolve_info.edram_format_ints_log2,\n              resolve_info.edram_format, msaa_resolve_pixel_0,\n              msaa_resolve_pixel_1);\n          pixel_0 += msaa_resolve_pixel_0;\n          pixel_1 += msaa_resolve_pixel_1;\n        }\n      }\n      pixel_0 *= exp_bias;\n      pixel_1 *= exp_bias;\n      dont_flatten_xe if (resolve_info.dest_swap) {\n        pixel_0 = pixel_0.bgra;\n        pixel_1 = pixel_1.bgra;\n      }\n    }\n\n    void XeResolveLoad4RGBAColors(\n        param_byte_buffer_xe(xe_resolve_edram) param_next_after_byte_buffer_xe\n        XeResolveInfo resolve_info, uint address_bytes,\n        out_param_xe(float4_xe, pixel_0), out_param_xe(float4_xe, pixel_1),\n        out_param_xe(float4_xe, pixel_2), out_param_xe(float4_xe, pixel_3)) {\n      uint pixel_stride_bytes = XeResolveEdramPixelStrideBytes(resolve_info);\n      XeResolveLoad4RGBAUnswappedPixelSamplesFromRaw(\n          pass_byte_buffer_xe(xe_resolve_edram) pass_next_after_byte_buffer_xe\n          address_bytes, pixel_stride_bytes,\n          resolve_info.edram_format_ints_log2, resolve_info.edram_format,\n          pixel_0, pixel_1, pixel_2, pixel_3);\n      float exp_bias = resolve_info.dest_exp_bias_factor;\n      dont_flatten_xe\n      if (resolve_info.sample_select >= kXenosCopySampleSelect_01) {\n        uint tile_row_stride_bytes = 4u * 80u * resolve_info.resolution_scale.x;\n        // TODO(Triang3l): Gamma-correct resolve for 8_8_8_8_GAMMA.\n        exp_bias *= 0.5f;\n        float4_xe msaa_resolve_pixel_0;\n        float4_xe msaa_resolve_pixel_1;\n        float4_xe msaa_resolve_pixel_2;\n        float4_xe msaa_resolve_pixel_3;\n        XeResolveLoad4RGBAUnswappedPixelSamplesFromRaw(\n            pass_byte_buffer_xe(xe_resolve_edram) pass_next_after_byte_buffer_xe\n            address_bytes + tile_row_stride_bytes, pixel_stride_bytes,\n            resolve_info.edram_format_ints_log2, resolve_info.edram_format,\n            msaa_resolve_pixel_0, msaa_resolve_pixel_1, msaa_resolve_pixel_2,\n            msaa_resolve_pixel_3);\n        pixel_0 += msaa_resolve_pixel_0;\n        pixel_1 += msaa_resolve_pixel_1;\n        pixel_2 += msaa_resolve_pixel_2;\n        pixel_3 += msaa_resolve_pixel_3;\n        dont_flatten_xe\n        if (resolve_info.sample_select >= kXenosCopySampleSelect_0123) {\n          uint sample_stride_bytes = 4u << resolve_info.edram_format_ints_log2;\n          exp_bias *= 0.5f;\n          XeResolveLoad4RGBAUnswappedPixelSamplesFromRaw(\n              pass_byte_buffer_xe(xe_resolve_edram)\n              pass_next_after_byte_buffer_xe\n              address_bytes + sample_stride_bytes, pixel_stride_bytes,\n              resolve_info.edram_format_ints_log2, resolve_info.edram_format,\n              msaa_resolve_pixel_0, msaa_resolve_pixel_1, msaa_resolve_pixel_2,\n              msaa_resolve_pixel_3);\n          pixel_0 += msaa_resolve_pixel_0;\n          pixel_1 += msaa_resolve_pixel_1;\n          pixel_2 += msaa_resolve_pixel_2;\n          pixel_3 += msaa_resolve_pixel_3;\n          XeResolveLoad4RGBAUnswappedPixelSamplesFromRaw(\n              pass_byte_buffer_xe(xe_resolve_edram)\n              pass_next_after_byte_buffer_xe\n              address_bytes + tile_row_stride_bytes + sample_stride_bytes,\n              pixel_stride_bytes, resolve_info.edram_format_ints_log2,\n              resolve_info.edram_format, msaa_resolve_pixel_0,\n              msaa_resolve_pixel_1, msaa_resolve_pixel_2, msaa_resolve_pixel_3);\n          pixel_0 += msaa_resolve_pixel_0;\n          pixel_1 += msaa_resolve_pixel_1;\n          pixel_2 += msaa_resolve_pixel_2;\n          pixel_3 += msaa_resolve_pixel_3;\n        }\n      }\n      pixel_0 *= exp_bias;\n      pixel_1 *= exp_bias;\n      pixel_2 *= exp_bias;\n      pixel_3 *= exp_bias;\n      dont_flatten_xe if (resolve_info.dest_swap) {\n        pixel_0 = pixel_0.bgra;\n        pixel_1 = pixel_1.bgra;\n        pixel_2 = pixel_2.bgra;\n        pixel_3 = pixel_3.bgra;\n      }\n    }\n\n    void XeResolveLoad8RedColors(\n        param_byte_buffer_xe(xe_resolve_edram) param_next_after_byte_buffer_xe\n        XeResolveInfo resolve_info, uint address_bytes,\n        out_param_xe(float4_xe, pixels_0123),\n        out_param_xe(float4_xe, pixels_4567)) {\n      uint pixel_stride_bytes = XeResolveEdramPixelStrideBytes(resolve_info);\n      if (resolve_info.dest_swap && resolve_info.edram_format_ints_log2 != 0u) {\n        // Likely want to load the blue part from the right half for 64bpp.\n        address_bytes += 4u;\n      }\n      XeResolveLoad8RedPixelSamplesFromRaw(\n          pass_byte_buffer_xe(xe_resolve_edram) pass_next_after_byte_buffer_xe\n          address_bytes, pixel_stride_bytes,\n          resolve_info.edram_format_ints_log2, resolve_info.edram_format,\n          resolve_info.dest_swap, pixels_0123, pixels_4567);\n      float exp_bias = resolve_info.dest_exp_bias_factor;\n      dont_flatten_xe\n      if (resolve_info.sample_select >= kXenosCopySampleSelect_01) {\n        uint tile_row_stride_bytes = 4u * 80u * resolve_info.resolution_scale.x;\n        // TODO(Triang3l): Gamma-correct resolve for 8_8_8_8_GAMMA.\n        exp_bias *= 0.5f;\n        float4_xe msaa_resolve_pixels_0123, msaa_resolve_pixels_4567;\n        XeResolveLoad8RedPixelSamplesFromRaw(\n            pass_byte_buffer_xe(xe_resolve_edram) pass_next_after_byte_buffer_xe\n            address_bytes + tile_row_stride_bytes, pixel_stride_bytes,\n            resolve_info.edram_format_ints_log2, resolve_info.edram_format,\n            resolve_info.dest_swap, msaa_resolve_pixels_0123,\n            msaa_resolve_pixels_4567);\n        pixels_0123 += msaa_resolve_pixels_0123;\n        pixels_4567 += msaa_resolve_pixels_4567;\n        dont_flatten_xe\n        if (resolve_info.sample_select >= kXenosCopySampleSelect_0123) {\n          uint sample_stride_bytes = 4u << resolve_info.edram_format_ints_log2;\n          exp_bias *= 0.5f;\n          XeResolveLoad8RedPixelSamplesFromRaw(\n              pass_byte_buffer_xe(xe_resolve_edram)\n              pass_next_after_byte_buffer_xe\n              address_bytes + sample_stride_bytes, pixel_stride_bytes,\n              resolve_info.edram_format_ints_log2, resolve_info.edram_format,\n              resolve_info.dest_swap, msaa_resolve_pixels_0123,\n              msaa_resolve_pixels_4567);\n          pixels_0123 += msaa_resolve_pixels_0123;\n          pixels_4567 += msaa_resolve_pixels_4567;\n          XeResolveLoad8RedPixelSamplesFromRaw(\n              pass_byte_buffer_xe(xe_resolve_edram)\n              pass_next_after_byte_buffer_xe\n              address_bytes + tile_row_stride_bytes + sample_stride_bytes,\n              pixel_stride_bytes, resolve_info.edram_format_ints_log2,\n              resolve_info.edram_format, resolve_info.dest_swap,\n              msaa_resolve_pixels_0123, msaa_resolve_pixels_4567);\n          pixels_0123 += msaa_resolve_pixels_0123;\n          pixels_4567 += msaa_resolve_pixels_4567;\n        }\n      }\n      pixels_0123 *= exp_bias;\n      pixels_4567 *= exp_bias;\n    }\n  #endif  // XE_RESOLVE_COPY_EDRAM_BYTE_BUFFER_ALIGNMENT == 4\n\n  uint4_xe XeResolveSwapRedBlue_8_8_8_8(uint4_xe pixels) {\n    return (pixels & ~0xFF00FFu) | ((pixels & 0xFFu) << 16u) |\n           ((pixels >> 16u) & 0xFFu);\n  }\n\n  uint4_xe XeResolveSwapRedBlue_2_10_10_10(uint4_xe pixels) {\n    return (pixels & ~0x3FF003FF) | ((pixels & 0x3FFu) << 20u) |\n           ((pixels >> 20u) & 0x3FFu);\n  }\n\n  void XeResolveSwap8PixelsRedBlue32bpp(\n      XeResolveInfo resolve_info, inout_param_xe(uint4_xe, pixels_0123),\n      inout_param_xe(uint4_xe, pixels_4567)) {\n    dont_flatten_xe if (resolve_info.dest_swap) {\n      switch (resolve_info.edram_format) {\n        case kXenosColorRenderTargetFormat_8_8_8_8:\n        case kXenosColorRenderTargetFormat_8_8_8_8_GAMMA:\n          pixels_0123 = XeResolveSwapRedBlue_8_8_8_8(pixels_0123);\n          pixels_4567 = XeResolveSwapRedBlue_8_8_8_8(pixels_4567);\n          break;\n        case kXenosColorRenderTargetFormat_2_10_10_10:\n        case kXenosColorRenderTargetFormat_2_10_10_10_FLOAT:\n        case kXenosColorRenderTargetFormat_2_10_10_10_AS_10_10_10_10:\n        case kXenosColorRenderTargetFormat_2_10_10_10_FLOAT_AS_16_16_16_16:\n          pixels_0123 = XeResolveSwapRedBlue_2_10_10_10(pixels_0123);\n          pixels_4567 = XeResolveSwapRedBlue_2_10_10_10(pixels_4567);\n          break;\n      }\n    }\n  }\n\n  void XeResolveSwap4PixelsRedBlue64bpp(\n      XeResolveInfo resolve_info, inout_param_xe(uint4_xe, pixels_01),\n      inout_param_xe(uint4_xe, pixels_23)) {\n    dont_flatten_xe if (resolve_info.dest_swap) {\n      dont_flatten_xe\n      if (resolve_info.edram_format ==\n              kXenosColorRenderTargetFormat_16_16_16_16 ||\n          resolve_info.edram_format ==\n              kXenosColorRenderTargetFormat_16_16_16_16_FLOAT) {\n        pixels_01 = (pixels_01 & ~0xFFFFu) | (pixels_01.yxwz & 0xFFFFu);\n        pixels_23 = (pixels_23 & ~0xFFFFu) | (pixels_23.yxwz & 0xFFFFu);\n      }\n    }\n  }\n#endif\n\n#endif  // XENIA_GPU_SHADERS_RESOLVE_XESLI_\n"
  },
  {
    "path": "src/xenia/gpu/shaders/resolve_clear_32bpp.cs.xesl",
    "content": "#include \"resolve_clear_32bpp.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/resolve_clear_32bpp.xesli",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#define XE_RESOLVE_CLEAR\n#include \"resolve.xesli\"\n\nbyte_buffer_align16_wo_declare_xe(xe_resolve_edram, set=0, binding=0, u0,\n                                  space0)\n#define LOCAL_SIZE_X_XE 8\n#define LOCAL_SIZE_Y_XE 8\n#define LOCAL_SIZE_Z_XE 1\nentry_bindings_begin_compute_xe\n  XE_RESOLVE_PUSH_CONST_BINDING\n  entry_binding_next_xe\n  byte_buffer_wo_binding_xe(xe_resolve_edram, buffer(1))\nentry_bindings_end_inputs_begin_compute_xe\n  entry_in_global_thread_id_xe\nentry_inputs_end_code_begin_compute_xe\n{\n  // 1 thread = 8 host samples (same as the resolve granularity at 1x1 scale).\n  XeResolveInfo resolve_info = XeResolveGetInfo(pass_push_consts_xe);\n  uint2_xe extent_scale = uint2_xe(greater_than_equal_xe(\n      uint_x2_xe(resolve_info.edram_msaa_samples),\n      uint2_xe(kXenosMsaaSamples_4X, kXenosMsaaSamples_2X)));\n  // Group height can't cross resolve granularity, Y overflow check not needed.\n  dont_flatten_xe\n  if (in_global_thread_id_xe.x >=\n      resolve_info.width_div_8_scaled << extent_scale.x) {\n    return;\n  }\n  uint address = XeEdramOffsetBytes(\n      (in_global_thread_id_xe.xy << uint2_xe(3u, 0u)) +\n          (resolve_info.edram_offset_scaled << extent_scale),\n      resolve_info.edram_base_tiles, true, resolve_info.edram_pitch_tiles,\n      kXenosMsaaSamples_1X, resolve_info.edram_is_depth, 0u, 0u,\n      resolve_info.resolution_scale);\n  byte_buffer_align16_store16_xe(xe_resolve_edram, address,\n                                 resolve_info.clear_value.xxxx);\n  byte_buffer_align16_store16_xe(xe_resolve_edram, address + 16u,\n                                 resolve_info.clear_value.xxxx);\n}\nentry_code_end_compute_xe\n"
  },
  {
    "path": "src/xenia/gpu/shaders/resolve_clear_32bpp_scaled.cs.xesl",
    "content": "#define XE_RESOLVE_RESOLUTION_SCALED\n#include \"resolve_clear_32bpp.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/resolve_clear_64bpp.cs.xesl",
    "content": "#include \"resolve_clear_64bpp.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/resolve_clear_64bpp.xesli",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#define XE_RESOLVE_CLEAR\n#include \"resolve.xesli\"\n\nbyte_buffer_align16_wo_declare_xe(xe_resolve_edram, set=0, binding=0, u0,\n                                  space0)\n#define LOCAL_SIZE_X_XE 8\n#define LOCAL_SIZE_Y_XE 8\n#define LOCAL_SIZE_Z_XE 1\nentry_bindings_begin_compute_xe\n  XE_RESOLVE_PUSH_CONST_BINDING\n  entry_binding_next_xe\n  byte_buffer_wo_binding_xe(xe_resolve_edram, buffer(1))\nentry_bindings_end_inputs_begin_compute_xe\n  entry_in_global_thread_id_xe\nentry_inputs_end_code_begin_compute_xe\n{\n  // 1 thread = 8 host samples (same as the resolve granularity at 1x1 scale).\n  XeResolveInfo resolve_info = XeResolveGetInfo(pass_push_consts_xe);\n  uint2_xe extent_scale = uint2_xe(greater_than_equal_xe(\n      uint_x2_xe(resolve_info.edram_msaa_samples),\n      uint2_xe(kXenosMsaaSamples_4X, kXenosMsaaSamples_2X)));\n  // Group height can't cross resolve granularity, Y overflow check not needed.\n  dont_flatten_xe\n  if (in_global_thread_id_xe.x >=\n      resolve_info.width_div_8_scaled << extent_scale.x) {\n    return;\n  }\n  uint address = XeEdramOffsetBytes(\n      (in_global_thread_id_xe.xy << uint2_xe(3u, 0u)) +\n          (resolve_info.edram_offset_scaled << extent_scale),\n      resolve_info.edram_base_tiles, true, resolve_info.edram_pitch_tiles,\n      kXenosMsaaSamples_1X, false, 1u, 0u, resolve_info.resolution_scale);\n  uint i;\n  unroll_xe for (i = 0u; i < 4u; ++i) {\n    byte_buffer_align16_store16_xe(xe_resolve_edram, address + (i << 4),\n                                   resolve_info.clear_value.xyxy);\n  }\n}\nentry_code_end_compute_xe\n"
  },
  {
    "path": "src/xenia/gpu/shaders/resolve_clear_64bpp_scaled.cs.xesl",
    "content": "#define XE_RESOLVE_RESOLUTION_SCALED\n#include \"resolve_clear_64bpp.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/resolve_fast_32bpp_1x2xmsaa.cs.xesl",
    "content": "#include \"resolve_fast_32bpp_1x2xmsaa.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/resolve_fast_32bpp_1x2xmsaa.xesli",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"endian.xesli\"\n#define XE_RESOLVE_COPY_EDRAM_BYTE_BUFFER_ALIGNMENT 16\n#include \"resolve.xesli\"\n\nbyte_buffer_align16_wo_declare_xe(xe_resolve_dest, set=1, binding=0, u0, space0)\n#define LOCAL_SIZE_X_XE 8\n#define LOCAL_SIZE_Y_XE 8\n#define LOCAL_SIZE_Z_XE 1\nentry_bindings_begin_compute_xe\n  XE_RESOLVE_PUSH_CONST_BINDING\n  entry_binding_next_xe\n  byte_buffer_wo_binding_xe(xe_resolve_dest, buffer(1))\n  entry_binding_next_xe\n  XE_RESOLVE_COPY_EDRAM_BINDING\nentry_bindings_end_inputs_begin_compute_xe\n  entry_in_global_thread_id_xe\nentry_inputs_end_code_begin_compute_xe\n{\n  // 1 thread = 8 host pixels.\n  XeResolveInfo resolve_info = XeResolveGetInfo(pass_push_consts_xe);\n  // Group height can't cross resolve granularity, Y overflow check not needed.\n  dont_flatten_xe\n  if (in_global_thread_id_xe.x >= resolve_info.width_div_8_scaled) {\n    return;\n  }\n  uint2_xe pixel_index = in_global_thread_id_xe.xy << uint2_xe(3u, 0u);\n  uint source_address = XeEdramOffsetBytes(\n      uint2_xe(pixel_index.x,\n               max(pixel_index.y,\n                   resolve_info.half_pixel_offset_fill_source.y)) +\n          resolve_info.edram_offset_scaled,\n      resolve_info.edram_base_tiles, true, resolve_info.edram_pitch_tiles,\n      resolve_info.edram_msaa_samples, resolve_info.edram_is_depth, 0u,\n      XeResolveFirstSampleIndex(resolve_info.sample_select),\n      resolve_info.resolution_scale);\n  uint4_xe pixels_0123 = byte_buffer_align16_load16_xe(xe_resolve_edram,\n                                                       source_address);\n  uint4_xe pixels_4567 = byte_buffer_align16_load16_xe(xe_resolve_edram,\n                                                       source_address + 16u);\n  dont_flatten_xe\n  if (pixel_index.x == 0u &&\n      resolve_info.half_pixel_offset_fill_source.x != 0u) {\n    if (resolve_info.half_pixel_offset_fill_source.x >= 2u) {\n      if (resolve_info.half_pixel_offset_fill_source.x >= 3u) {\n        pixels_0123.z = pixels_0123.w;\n      }\n      pixels_0123.y = pixels_0123.z;\n    }\n    pixels_0123.x = pixels_0123.y;\n  }\n  XeResolveSwap8PixelsRedBlue32bpp(resolve_info, pixels_0123, pixels_4567);\n  uint dest_address = XeResolveDestPixelAddress(resolve_info, pixel_index, 2u);\n  byte_buffer_align16_store16_xe(\n      xe_resolve_dest, dest_address,\n      XeEndianSwap32(pixels_0123, resolve_info.dest_endian_128));\n  dest_address += XeResolveLocalXAddressXor(4u, 2u);\n  byte_buffer_align16_store16_xe(\n      xe_resolve_dest, dest_address,\n      XeEndianSwap32(pixels_4567, resolve_info.dest_endian_128));\n}\nentry_code_end_compute_xe\n"
  },
  {
    "path": "src/xenia/gpu/shaders/resolve_fast_32bpp_1x2xmsaa_scaled.cs.xesl",
    "content": "#define XE_RESOLVE_RESOLUTION_SCALED\n#include \"resolve_fast_32bpp_1x2xmsaa.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/resolve_fast_32bpp_4xmsaa.cs.xesl",
    "content": "#include \"resolve_fast_32bpp_4xmsaa.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/resolve_fast_32bpp_4xmsaa.xesli",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"endian.xesli\"\n#define XE_RESOLVE_COPY_EDRAM_BYTE_BUFFER_ALIGNMENT 16\n#include \"resolve.xesli\"\n\nbyte_buffer_align16_wo_declare_xe(xe_resolve_dest, set=1, binding=0, u0, space0)\n#define LOCAL_SIZE_X_XE 8\n#define LOCAL_SIZE_Y_XE 8\n#define LOCAL_SIZE_Z_XE 1\nentry_bindings_begin_compute_xe\n  XE_RESOLVE_PUSH_CONST_BINDING\n  entry_binding_next_xe\n  byte_buffer_wo_binding_xe(xe_resolve_dest, buffer(1))\n  entry_binding_next_xe\n  XE_RESOLVE_COPY_EDRAM_BINDING\nentry_bindings_end_inputs_begin_compute_xe\n  entry_in_global_thread_id_xe\nentry_inputs_end_code_begin_compute_xe\n{\n  // 1 thread = 8 host pixels.\n  XeResolveInfo resolve_info = XeResolveGetInfo(pass_push_consts_xe);\n  // Group height can't cross resolve granularity, Y overflow check not needed.\n  dont_flatten_xe\n  if (in_global_thread_id_xe.x >= resolve_info.width_div_8_scaled) {\n    return;\n  }\n  uint2_xe pixel_index = in_global_thread_id_xe.xy << uint2_xe(3u, 0u);\n  uint source_address = XeEdramOffsetBytes(\n      uint2_xe(pixel_index.x,\n               max(pixel_index.y,\n                   resolve_info.half_pixel_offset_fill_source.y)) +\n          resolve_info.edram_offset_scaled,\n      resolve_info.edram_base_tiles, true, resolve_info.edram_pitch_tiles,\n      kXenosMsaaSamples_4X, resolve_info.edram_is_depth, 0u,\n      XeResolveFirstSampleIndex(resolve_info.sample_select),\n      resolve_info.resolution_scale);\n  uint4_xe pixels_0123, pixels_4567;\n  dont_flatten_xe\n  if (resolve_info.sample_select != kXenosCopySampleSelect_2 &&\n      resolve_info.sample_select != kXenosCopySampleSelect_3) {\n    pixels_0123.xy = byte_buffer_align16_load16_xe(xe_resolve_edram,\n                                                   source_address).xz;\n    pixels_0123.zw = byte_buffer_align16_load16_xe(xe_resolve_edram,\n                                                   source_address + 0x10u).xz;\n    pixels_4567.xy = byte_buffer_align16_load16_xe(xe_resolve_edram,\n                                                   source_address + 0x20u).xz;\n    pixels_4567.zw = byte_buffer_align16_load16_xe(xe_resolve_edram,\n                                                   source_address + 0x30u).xz;\n  } else {\n    pixels_0123.xy = byte_buffer_align16_load16_xe(xe_resolve_edram,\n                                                   source_address).yw;\n    pixels_0123.zw = byte_buffer_align16_load16_xe(xe_resolve_edram,\n                                                   source_address + 0x10u).yw;\n    pixels_4567.xy = byte_buffer_align16_load16_xe(xe_resolve_edram,\n                                                   source_address + 0x20u).yw;\n    pixels_4567.zw = byte_buffer_align16_load16_xe(xe_resolve_edram,\n                                                   source_address + 0x30u).yw;\n  }\n  dont_flatten_xe\n  if (pixel_index.x == 0u &&\n      resolve_info.half_pixel_offset_fill_source.x != 0u) {\n    if (resolve_info.half_pixel_offset_fill_source.x >= 2u) {\n      if (resolve_info.half_pixel_offset_fill_source.x >= 3u) {\n        pixels_0123.z = pixels_0123.w;\n      }\n      pixels_0123.y = pixels_0123.z;\n    }\n    pixels_0123.x = pixels_0123.y;\n  }\n  XeResolveSwap8PixelsRedBlue32bpp(resolve_info, pixels_0123, pixels_4567);\n  uint dest_address = XeResolveDestPixelAddress(resolve_info, pixel_index, 2u);\n  byte_buffer_align16_store16_xe(\n      xe_resolve_dest, dest_address,\n      XeEndianSwap32(pixels_0123, resolve_info.dest_endian_128));\n  dest_address += XeResolveLocalXAddressXor(4u, 2u);\n  byte_buffer_align16_store16_xe(\n      xe_resolve_dest, dest_address,\n      XeEndianSwap32(pixels_4567, resolve_info.dest_endian_128));\n}\nentry_code_end_compute_xe\n"
  },
  {
    "path": "src/xenia/gpu/shaders/resolve_fast_32bpp_4xmsaa_scaled.cs.xesl",
    "content": "#define XE_RESOLVE_RESOLUTION_SCALED\n#include \"resolve_fast_32bpp_4xmsaa.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/resolve_fast_64bpp_1x2xmsaa.cs.xesl",
    "content": "#include \"resolve_fast_64bpp_1x2xmsaa.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/resolve_fast_64bpp_1x2xmsaa.xesli",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"endian.xesli\"\n#define XE_RESOLVE_COPY_EDRAM_BYTE_BUFFER_ALIGNMENT 16\n#include \"resolve.xesli\"\n\nbyte_buffer_align16_wo_declare_xe(xe_resolve_dest, set=1, binding=0, u0, space0)\n#define LOCAL_SIZE_X_XE 8\n#define LOCAL_SIZE_Y_XE 8\n#define LOCAL_SIZE_Z_XE 1\nentry_bindings_begin_compute_xe\n  XE_RESOLVE_PUSH_CONST_BINDING\n  entry_binding_next_xe\n  byte_buffer_wo_binding_xe(xe_resolve_dest, buffer(1))\n  entry_binding_next_xe\n  XE_RESOLVE_COPY_EDRAM_BINDING\nentry_bindings_end_inputs_begin_compute_xe\n  entry_in_global_thread_id_xe\nentry_inputs_end_code_begin_compute_xe\n{\n  // 1 thread = 4 host pixels.\n  XeResolveInfo resolve_info = XeResolveGetInfo(pass_push_consts_xe);\n  uint2_xe pixel_index = in_global_thread_id_xe.xy << uint2_xe(2u, 0u);\n  // Group height can't cross resolve granularity, Y overflow check not needed.\n  dont_flatten_xe\n  if (pixel_index.x >= resolve_info.width_div_8_scaled << 3u) {\n    return;\n  }\n  uint source_address = XeEdramOffsetBytes(\n      uint2_xe(pixel_index.x,\n               max(pixel_index.y,\n                   resolve_info.half_pixel_offset_fill_source.y)) +\n          resolve_info.edram_offset_scaled,\n      resolve_info.edram_base_tiles, true, resolve_info.edram_pitch_tiles,\n      resolve_info.edram_msaa_samples, false, 1u,\n      XeResolveFirstSampleIndex(resolve_info.sample_select),\n      resolve_info.resolution_scale);\n  uint4_xe pixels_01 = byte_buffer_align16_load16_xe(xe_resolve_edram,\n                                                     source_address);\n  uint4_xe pixels_23 = byte_buffer_align16_load16_xe(xe_resolve_edram,\n                                                     source_address + 16u);\n  dont_flatten_xe\n  if (pixel_index.x == 0u &&\n      resolve_info.half_pixel_offset_fill_source.x != 0u) {\n    if (resolve_info.half_pixel_offset_fill_source.x >= 2u) {\n      if (resolve_info.half_pixel_offset_fill_source.x >= 3u) {\n        pixels_23.xy = pixels_23.zw;\n      }\n      pixels_01.zw = pixels_23.xy;\n    }\n    pixels_01.xy = pixels_01.zw;\n  }\n  XeResolveSwap4PixelsRedBlue64bpp(resolve_info, pixels_01, pixels_23);\n  uint dest_address = XeResolveDestPixelAddress(resolve_info, pixel_index, 3u);\n  byte_buffer_align16_store16_xe(\n      xe_resolve_dest, dest_address,\n      XeEndianSwap64(pixels_01, resolve_info.dest_endian_128));\n  dest_address += XeResolveLocalXAddressXor(2u, 3u);\n  byte_buffer_align16_store16_xe(\n      xe_resolve_dest, dest_address,\n      XeEndianSwap64(pixels_23, resolve_info.dest_endian_128));\n}\nentry_code_end_compute_xe\n"
  },
  {
    "path": "src/xenia/gpu/shaders/resolve_fast_64bpp_1x2xmsaa_scaled.cs.xesl",
    "content": "#define XE_RESOLVE_RESOLUTION_SCALED\n#include \"resolve_fast_64bpp_1x2xmsaa.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/resolve_fast_64bpp_4xmsaa.cs.xesl",
    "content": "#include \"resolve_fast_64bpp_4xmsaa.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/resolve_fast_64bpp_4xmsaa.xesli",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"endian.xesli\"\n#define XE_RESOLVE_COPY_EDRAM_BYTE_BUFFER_ALIGNMENT 8\n#include \"resolve.xesli\"\n\nbyte_buffer_align16_wo_declare_xe(xe_resolve_dest, set=1, binding=0, u0, space0)\n#define LOCAL_SIZE_X_XE 8\n#define LOCAL_SIZE_Y_XE 8\n#define LOCAL_SIZE_Z_XE 1\nentry_bindings_begin_compute_xe\n  XE_RESOLVE_PUSH_CONST_BINDING\n  entry_binding_next_xe\n  byte_buffer_wo_binding_xe(xe_resolve_dest, buffer(1))\n  entry_binding_next_xe\n  XE_RESOLVE_COPY_EDRAM_BINDING\nentry_bindings_end_inputs_begin_compute_xe\n  entry_in_global_thread_id_xe\nentry_inputs_end_code_begin_compute_xe\n{\n  // 1 thread = 4 host pixels.\n  XeResolveInfo resolve_info = XeResolveGetInfo(pass_push_consts_xe);\n  uint2_xe pixel_index = in_global_thread_id_xe.xy << uint2_xe(2u, 0u);\n  // Group height can't cross resolve granularity, Y overflow check not needed.\n  dont_flatten_xe\n  if (pixel_index.x >= resolve_info.width_div_8_scaled << 3u) {\n    return;\n  }\n  uint source_address = XeEdramOffsetBytes(\n      uint2_xe(pixel_index.x,\n               max(pixel_index.y,\n                   resolve_info.half_pixel_offset_fill_source.y)) +\n          resolve_info.edram_offset_scaled,\n      resolve_info.edram_base_tiles, true, resolve_info.edram_pitch_tiles,\n      kXenosMsaaSamples_4X, false, 1u,\n      XeResolveFirstSampleIndex(resolve_info.sample_select),\n      resolve_info.resolution_scale);\n  uint4_xe pixels_01, pixels_23;\n  pixels_01.xy = byte_buffer_align8_load8_xe(xe_resolve_edram, source_address);\n  pixels_01.zw = byte_buffer_align8_load8_xe(xe_resolve_edram,\n                                             source_address + 0x10u);\n  pixels_23.xy = byte_buffer_align8_load8_xe(xe_resolve_edram,\n                                             source_address + 0x20u);\n  pixels_23.zw = byte_buffer_align8_load8_xe(xe_resolve_edram,\n                                             source_address + 0x30u);\n  dont_flatten_xe\n  if (pixel_index.x == 0u &&\n      resolve_info.half_pixel_offset_fill_source.x != 0u) {\n    if (resolve_info.half_pixel_offset_fill_source.x >= 2u) {\n      if (resolve_info.half_pixel_offset_fill_source.x >= 3u) {\n        pixels_23.xy = pixels_23.zw;\n      }\n      pixels_01.zw = pixels_23.xy;\n    }\n    pixels_01.xy = pixels_01.zw;\n  }\n  XeResolveSwap4PixelsRedBlue64bpp(resolve_info, pixels_01, pixels_23);\n  uint dest_address = XeResolveDestPixelAddress(resolve_info, pixel_index, 3u);\n  byte_buffer_align16_store16_xe(\n      xe_resolve_dest, dest_address,\n      XeEndianSwap64(pixels_01, resolve_info.dest_endian_128));\n  dest_address += XeResolveLocalXAddressXor(2u, 3u);\n  byte_buffer_align16_store16_xe(\n      xe_resolve_dest, dest_address,\n      XeEndianSwap64(pixels_23, resolve_info.dest_endian_128));\n}\nentry_code_end_compute_xe\n"
  },
  {
    "path": "src/xenia/gpu/shaders/resolve_fast_64bpp_4xmsaa_scaled.cs.xesl",
    "content": "#define XE_RESOLVE_RESOLUTION_SCALED\n#include \"resolve_fast_64bpp_4xmsaa.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/resolve_full_128bpp.cs.xesl",
    "content": "#include \"resolve_full_128bpp.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/resolve_full_128bpp.xesli",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"endian.xesli\"\n#define XE_RESOLVE_COPY_EDRAM_BYTE_BUFFER_ALIGNMENT 4\n#include \"resolve.xesli\"\n\nbyte_buffer_align16_wo_declare_xe(xe_resolve_dest, set=1, binding=0, u0, space0)\n#define LOCAL_SIZE_X_XE 8\n#define LOCAL_SIZE_Y_XE 8\n#define LOCAL_SIZE_Z_XE 1\nentry_bindings_begin_compute_xe\n  XE_RESOLVE_PUSH_CONST_BINDING\n  entry_binding_next_xe\n  byte_buffer_wo_binding_xe(xe_resolve_dest, buffer(1))\n  entry_binding_next_xe\n  XE_RESOLVE_COPY_EDRAM_BINDING\nentry_bindings_end_inputs_begin_compute_xe\n  entry_in_global_thread_id_xe\nentry_inputs_end_code_begin_compute_xe\n{\n  // 1 thread = 2 host pixels.\n  XeResolveInfo resolve_info = XeResolveGetInfo(pass_push_consts_xe);\n  uint2_xe pixel_index = in_global_thread_id_xe.xy << uint2_xe(1u, 0u);\n  // Group height can't cross resolve granularity, Y overflow check not needed.\n  dont_flatten_xe\n  if (pixel_index.x >= resolve_info.width_div_8_scaled << 3u) {\n    return;\n  }\n  float4_xe pixel_0, pixel_1;\n  XeResolveLoad2RGBAColors(\n      pass_byte_buffer_xe(xe_resolve_edram) pass_next_after_byte_buffer_xe\n      resolve_info,\n      XeResolveColorCopySourcePixelAddressBytesYHalfPixelOffsetFilling(\n          resolve_info,\n          uint2_xe(max(pixel_index.x,\n                       resolve_info.half_pixel_offset_fill_source.x),\n                   pixel_index.y)),\n      pixel_0, pixel_1);\n  // Inside the half-pixel offset filling columns, pixel_0 now contains the\n  // pixel to stretch, pixel_1 contains the pixel after it. However, this means\n  // that the pixel offset is not aligned to 2 anymore. If 1 is the pixel to\n  // stretch, the two pixels will be 1 and 2 for pixel_index.x == 0. If 3 is,\n  // they will be 3 and 4 for pixel_index.x == 0 and 2. However, in the former\n  // case, they should be 1 and 1, and in the latter, 3 and 3.\n  dont_flatten_xe\n  if (pixel_index.x < resolve_info.half_pixel_offset_fill_source.x) {\n    pixel_1 = pixel_0;\n  }\n  // Only 32_32_32_32_FLOAT color format is 128bpp.\n  uint dest_address = XeResolveDestPixelAddress(resolve_info, pixel_index, 4u);\n  byte_buffer_align16_store16_xe(\n      xe_resolve_dest, dest_address,\n      XeEndianSwap128(float_bits_to_uint_xe(pixel_0),\n                      resolve_info.dest_endian_128));\n  dest_address += XeResolveLocalXAddressXor(1u, 4u);\n  byte_buffer_align16_store16_xe(\n      xe_resolve_dest, dest_address,\n      XeEndianSwap128(float_bits_to_uint_xe(pixel_1),\n                      resolve_info.dest_endian_128));\n}\nentry_code_end_compute_xe\n"
  },
  {
    "path": "src/xenia/gpu/shaders/resolve_full_128bpp_scaled.cs.xesl",
    "content": "#define XE_RESOLVE_RESOLUTION_SCALED\n#include \"resolve_full_128bpp.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/resolve_full_16bpp.cs.xesl",
    "content": "#include \"resolve_full_16bpp.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/resolve_full_16bpp.xesli",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"endian.xesli\"\n#include \"pixel_formats.xesli\"\n#define XE_RESOLVE_COPY_EDRAM_BYTE_BUFFER_ALIGNMENT 4\n#include \"resolve.xesli\"\n\nbyte_buffer_align8_wo_declare_xe(xe_resolve_dest, set=1, binding=0, u0, space0)\n#define LOCAL_SIZE_X_XE 8\n#define LOCAL_SIZE_Y_XE 8\n#define LOCAL_SIZE_Z_XE 1\nentry_bindings_begin_compute_xe\n  XE_RESOLVE_PUSH_CONST_BINDING\n  entry_binding_next_xe\n  byte_buffer_wo_binding_xe(xe_resolve_dest, buffer(1))\n  entry_binding_next_xe\n  XE_RESOLVE_COPY_EDRAM_BINDING\nentry_bindings_end_inputs_begin_compute_xe\n  entry_in_global_thread_id_xe\nentry_inputs_end_code_begin_compute_xe\n{\n  // 1 thread = 4 host pixels.\n  XeResolveInfo resolve_info = XeResolveGetInfo(pass_push_consts_xe);\n  uint2_xe pixel_index = in_global_thread_id_xe.xy << uint2_xe(2u, 0u);\n  // Group height can't cross resolve granularity, Y overflow check not needed.\n  dont_flatten_xe\n  if (pixel_index.x >= resolve_info.width_div_8_scaled << 3u) {\n    return;\n  }\n  float4_xe pixel_0, pixel_1, pixel_2, pixel_3;\n  XeResolveLoad4RGBAColors(\n      pass_byte_buffer_xe(xe_resolve_edram) pass_next_after_byte_buffer_xe\n      resolve_info,\n      XeResolveColorCopySourcePixelAddressBytesYHalfPixelOffsetFilling(\n          resolve_info, pixel_index),\n      pixel_0, pixel_1, pixel_2, pixel_3);\n  uint2_xe packed = XePack16bpp4PixelsInUInt2(\n      pixel_0, pixel_1, pixel_2, pixel_3, resolve_info.dest_format);\n  dont_flatten_xe\n  if (pixel_index.x == 0u &&\n      resolve_info.half_pixel_offset_fill_source.x != 0u) {\n    if (resolve_info.half_pixel_offset_fill_source.x >= 2u) {\n      if (resolve_info.half_pixel_offset_fill_source.x >= 3u) {\n        packed.y = (packed.y >> 16u) | (packed.y & 0xFFFF0000u);\n      }\n      packed.x = (packed.x & 0xFFFFu) | (packed.y << 16u);\n    }\n    packed.x = (packed.x >> 16u) | (packed.x & 0xFFFF0000u);\n  }\n  byte_buffer_align8_store8_xe(\n      xe_resolve_dest, XeResolveDestPixelAddress(resolve_info, pixel_index, 1u),\n      XeEndianSwap16(packed, resolve_info.dest_endian_128));\n}\nentry_code_end_compute_xe\n"
  },
  {
    "path": "src/xenia/gpu/shaders/resolve_full_16bpp_scaled.cs.xesl",
    "content": "#define XE_RESOLVE_RESOLUTION_SCALED\n#include \"resolve_full_16bpp.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/resolve_full_32bpp.cs.xesl",
    "content": "#include \"resolve_full_32bpp.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/resolve_full_32bpp.xesli",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"endian.xesli\"\n#include \"pixel_formats.xesli\"\n#define XE_RESOLVE_COPY_EDRAM_BYTE_BUFFER_ALIGNMENT 4\n#include \"resolve.xesli\"\n\nbyte_buffer_align16_wo_declare_xe(xe_resolve_dest, set=1, binding=0, u0, space0)\n#define LOCAL_SIZE_X_XE 8\n#define LOCAL_SIZE_Y_XE 8\n#define LOCAL_SIZE_Z_XE 1\nentry_bindings_begin_compute_xe\n  XE_RESOLVE_PUSH_CONST_BINDING\n  entry_binding_next_xe\n  byte_buffer_wo_binding_xe(xe_resolve_dest, buffer(1))\n  entry_binding_next_xe\n  XE_RESOLVE_COPY_EDRAM_BINDING\nentry_bindings_end_inputs_begin_compute_xe\n  entry_in_global_thread_id_xe\nentry_inputs_end_code_begin_compute_xe\n{\n  // 1 thread = 4 host pixels.\n  // 1 pixel per thread is 160% as slow on Nvidia Pascal, 8 pixels per thread is\n  // 115% as slow.\n  XeResolveInfo resolve_info = XeResolveGetInfo(pass_push_consts_xe);\n  uint2_xe pixel_index = in_global_thread_id_xe.xy << uint2_xe(2u, 0u);\n  // Group height can't cross resolve granularity, Y overflow check not needed.\n  dont_flatten_xe\n  if (pixel_index.x >= resolve_info.width_div_8_scaled << 3u) {\n    return;\n  }\n  float4_xe pixel_0, pixel_1, pixel_2, pixel_3;\n  XeResolveLoad4RGBAColors(\n      pass_byte_buffer_xe(xe_resolve_edram) pass_next_after_byte_buffer_xe\n      resolve_info,\n      XeResolveColorCopySourcePixelAddressBytesYHalfPixelOffsetFilling(\n          resolve_info, pixel_index),\n      pixel_0, pixel_1, pixel_2, pixel_3);\n  uint4_xe packed = XePack32bpp4Pixels(pixel_0, pixel_1, pixel_2, pixel_3,\n                                       resolve_info.dest_format);\n  dont_flatten_xe\n  if (pixel_index.x == 0u &&\n      resolve_info.half_pixel_offset_fill_source.x != 0u) {\n    if (resolve_info.half_pixel_offset_fill_source.x >= 2u) {\n      if (resolve_info.half_pixel_offset_fill_source.x >= 3u) {\n        packed.z = packed.w;\n      }\n      packed.y = packed.z;\n    }\n    packed.x = packed.y;\n  }\n  byte_buffer_align16_store16_xe(\n      xe_resolve_dest, XeResolveDestPixelAddress(resolve_info, pixel_index, 2u),\n      XeEndianSwap32(packed, resolve_info.dest_endian_128));\n}\nentry_code_end_compute_xe\n"
  },
  {
    "path": "src/xenia/gpu/shaders/resolve_full_32bpp_scaled.cs.xesl",
    "content": "#define XE_RESOLVE_RESOLUTION_SCALED\n#include \"resolve_full_32bpp.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/resolve_full_64bpp.cs.xesl",
    "content": "#include \"resolve_full_64bpp.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/resolve_full_64bpp.xesli",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"endian.xesli\"\n#include \"pixel_formats.xesli\"\n#define XE_RESOLVE_COPY_EDRAM_BYTE_BUFFER_ALIGNMENT 4\n#include \"resolve.xesli\"\n\nbyte_buffer_align16_wo_declare_xe(xe_resolve_dest, set=1, binding=0, u0, space0)\n#define LOCAL_SIZE_X_XE 8\n#define LOCAL_SIZE_Y_XE 8\n#define LOCAL_SIZE_Z_XE 1\nentry_bindings_begin_compute_xe\n  XE_RESOLVE_PUSH_CONST_BINDING\n  entry_binding_next_xe\n  byte_buffer_wo_binding_xe(xe_resolve_dest, buffer(1))\n  entry_binding_next_xe\n  XE_RESOLVE_COPY_EDRAM_BINDING\nentry_bindings_end_inputs_begin_compute_xe\n  entry_in_global_thread_id_xe\nentry_inputs_end_code_begin_compute_xe\n{\n  // 1 thread = 4 host pixels.\n  XeResolveInfo resolve_info = XeResolveGetInfo(pass_push_consts_xe);\n  uint2_xe pixel_index = in_global_thread_id_xe.xy << uint2_xe(2u, 0u);\n  // Group height can't cross resolve granularity, Y overflow check not needed.\n  dont_flatten_xe\n  if (pixel_index.x >= resolve_info.width_div_8_scaled << 3u) {\n    return;\n  }\n  float4_xe pixel_0, pixel_1, pixel_2, pixel_3;\n  XeResolveLoad4RGBAColors(\n      pass_byte_buffer_xe(xe_resolve_edram) pass_next_after_byte_buffer_xe\n      resolve_info,\n      XeResolveColorCopySourcePixelAddressBytesYHalfPixelOffsetFilling(\n          resolve_info, pixel_index),\n      pixel_0, pixel_1, pixel_2, pixel_3);\n  uint4_xe packed_01, packed_23;\n  XePack64bpp4Pixels(pixel_0, pixel_1, pixel_2, pixel_3,\n                     resolve_info.dest_format, packed_01, packed_23);\n  dont_flatten_xe\n  if (pixel_index.x == 0u &&\n      resolve_info.half_pixel_offset_fill_source.x != 0u) {\n    if (resolve_info.half_pixel_offset_fill_source.x >= 2u) {\n      if (resolve_info.half_pixel_offset_fill_source.x >= 3u) {\n        packed_23.xy = packed_23.zw;\n      }\n      packed_01.zw = packed_23.xy;\n    }\n    packed_01.xy = packed_01.zw;\n  }\n  uint dest_address = XeResolveDestPixelAddress(resolve_info, pixel_index, 3u);\n  byte_buffer_align16_store16_xe(\n      xe_resolve_dest, dest_address,\n      XeEndianSwap64(packed_01, resolve_info.dest_endian_128));\n  dest_address += XeResolveLocalXAddressXor(2u, 3u);\n  byte_buffer_align16_store16_xe(\n      xe_resolve_dest, dest_address,\n      XeEndianSwap64(packed_23, resolve_info.dest_endian_128));\n}\nentry_code_end_compute_xe\n"
  },
  {
    "path": "src/xenia/gpu/shaders/resolve_full_64bpp_scaled.cs.xesl",
    "content": "#define XE_RESOLVE_RESOLUTION_SCALED\n#include \"resolve_full_64bpp.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/resolve_full_8bpp.cs.xesl",
    "content": "#include \"resolve_full_8bpp.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/resolve_full_8bpp.xesli",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"endian.xesli\"\n#include \"pixel_formats.xesli\"\n#define XE_RESOLVE_COPY_EDRAM_BYTE_BUFFER_ALIGNMENT 4\n#include \"resolve.xesli\"\n\nbyte_buffer_align8_wo_declare_xe(xe_resolve_dest, set=1, binding=0, u0, space0)\n#define LOCAL_SIZE_X_XE 8\n#define LOCAL_SIZE_Y_XE 8\n#define LOCAL_SIZE_Z_XE 1\nentry_bindings_begin_compute_xe\n  XE_RESOLVE_PUSH_CONST_BINDING\n  entry_binding_next_xe\n  byte_buffer_wo_binding_xe(xe_resolve_dest, buffer(1))\n  entry_binding_next_xe\n  XE_RESOLVE_COPY_EDRAM_BINDING\nentry_bindings_end_inputs_begin_compute_xe\n  entry_in_global_thread_id_xe\nentry_inputs_end_code_begin_compute_xe\n{\n  // 1 thread = 8 host pixels.\n  XeResolveInfo resolve_info = XeResolveGetInfo(pass_push_consts_xe);\n  // Group height can't cross resolve granularity, Y overflow check not needed.\n  dont_flatten_xe\n  if (in_global_thread_id_xe.x >= resolve_info.width_div_8_scaled) {\n    return;\n  }\n  uint2_xe pixel_index = in_global_thread_id_xe.xy << uint2_xe(3u, 0u);\n  float4_xe pixels_0123, pixels_4567;\n  XeResolveLoad8RedColors(\n      pass_byte_buffer_xe(xe_resolve_edram) pass_next_after_byte_buffer_xe\n      resolve_info,\n      XeResolveColorCopySourcePixelAddressBytesYHalfPixelOffsetFilling(\n          resolve_info, pixel_index),\n      pixels_0123, pixels_4567);\n  dont_flatten_xe\n  if (pixel_index.x == 0u &&\n      resolve_info.half_pixel_offset_fill_source.x != 0u) {\n    if (resolve_info.half_pixel_offset_fill_source.x >= 2u) {\n      if (resolve_info.half_pixel_offset_fill_source.x >= 3u) {\n        pixels_0123.z = pixels_0123.w;\n      }\n      pixels_0123.y = pixels_0123.z;\n    }\n    pixels_0123.x = pixels_0123.y;\n  }\n  // Convert to R8.\n  // TODO(Triang3l): Investigate formats 8_A and 8_B.\n  byte_buffer_align8_store8_xe(\n      xe_resolve_dest, XeResolveDestPixelAddress(resolve_info, pixel_index, 0u),\n      uint2_xe(XePackR8G8B8A8UNorm(pixels_0123),\n               XePackR8G8B8A8UNorm(pixels_4567)));\n}\nentry_code_end_compute_xe\n"
  },
  {
    "path": "src/xenia/gpu/shaders/resolve_full_8bpp_scaled.cs.xesl",
    "content": "#define XE_RESOLVE_RESOLUTION_SCALED\n#include \"resolve_full_8bpp.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/tessellation_adaptive.vs.hlsl",
    "content": "#include \"endian.xesli\"\n#include \"xenos_draw.hlsli\"\n\nXeHSControlPointInputAdaptive main(uint xe_edge_factor : SV_VertexID) {\n  XeHSControlPointInputAdaptive output;\n  // The Xbox 360's GPU accepts the float32 tessellation factors for edges\n  // through a special kind of an index buffer.\n  // While 4D5307F2 sets the factors to 0 for frustum-culled (quad) patches, in\n  // 4D5307E6 only allowing patches with factors above 0 makes distant\n  // (triangle) patches disappear - it appears that there are no special values\n  // for culled patches on the Xbox 360 (unlike zero, negative and NaN on\n  // Direct3D 11).\n  output.edge_factor = clamp(\n      asfloat(XeEndianSwap32(xe_edge_factor, xe_vertex_index_endian)) + 1.0f,\n      xe_tessellation_factor_range.x, xe_tessellation_factor_range.y);\n  return output;\n}\n"
  },
  {
    "path": "src/xenia/gpu/shaders/tessellation_indexed.vs.hlsl",
    "content": "#include \"endian.xesli\"\n#include \"xenos_draw.hlsli\"\n\nXeHSControlPointInputIndexed main(uint xe_vertex_id : SV_VertexID) {\n  XeHSControlPointInputIndexed output;\n  // Only the lower 24 bits of the vertex index are used (tested on an Adreno\n  // 200 phone). `((index & 0xFFFFFF) + offset) & 0xFFFFFF` is the same as\n  // `(index + offset) & 0xFFFFFF`.\n  output.index =\n      float(clamp((XeEndianSwap32(xe_vertex_id, xe_vertex_index_endian) +\n                   xe_vertex_index_offset) &\n                  0xFFFFFFu,\n                  xe_vertex_index_min_max.x, xe_vertex_index_min_max.y));\n  return output;\n}\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_address.xesli",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_SHADERS_TEXTURE_ADDRESS_XESLI_\n#define XENIA_GPU_SHADERS_TEXTURE_ADDRESS_XESLI_\n\n#include \"../../ui/shaders/xesl.xesli\"\n\n#define XENOS_TEXTURE_MACRO_TILE_WIDTH_LOG2 5\n#define XENOS_TEXTURE_MACRO_TILE_HEIGHT_2D_LOG2 5\n#define XENOS_TEXTURE_MACRO_TILE_HEIGHT_3D_LOG2 4\n#define XENOS_TEXTURE_MACRO_TILE_DEPTH_LOG2 2\n\nint XenosTextureTiledAddressCombine(const int outer_inner_bytes, const int bank,\n                                    const int pipe, const int y_lsb) {\n  return (y_lsb << 4) | (pipe << 6) | (bank << 11) | (outer_inner_bytes & 0xF) |\n         (((outer_inner_bytes >> 4) & 0x1) << 5) |\n         (((outer_inner_bytes >> 5) & 0x7) << 8) |\n         (outer_inner_bytes >> 8 << 12);\n}\n\nint XenosTextureTiledAddress2D(const int2_xe p, const uint pitch_macro_tiles,\n                               const uint bytes_per_block_log2) {\n  const int outer_blocks =\n      ((p.y >> XENOS_TEXTURE_MACRO_TILE_HEIGHT_2D_LOG2) *\n           int(pitch_macro_tiles) +\n       (p.x >> XENOS_TEXTURE_MACRO_TILE_WIDTH_LOG2))\n      << 6;\n  const int inner_blocks = (((p.y >> 1) & 0x7) << 3) | (p.x & 0x7);\n  const int outer_inner_bytes = (outer_blocks | inner_blocks)\n                                << bytes_per_block_log2;\n  const int bank = (p.y >> 4) & 0x1;\n  const int pipe = ((p.x >> 3) & 0x3) ^ (((p.y >> 3) & 0x1) << 1);\n  return XenosTextureTiledAddressCombine(outer_inner_bytes, bank, pipe,\n                                         p.y & 1);\n}\n\nint XenosTextureTiledAddress3D(const int3_xe p, const uint pitch_macro_tiles,\n                               const uint height_macro_tiles,\n                               const uint bytes_per_block_log2) {\n  const int outer_blocks =\n      ((((p.z >> XENOS_TEXTURE_MACRO_TILE_DEPTH_LOG2) *\n             int(height_macro_tiles) +\n         (p.y >> XENOS_TEXTURE_MACRO_TILE_HEIGHT_3D_LOG2)) *\n        int(pitch_macro_tiles)) +\n       (p.x >> XENOS_TEXTURE_MACRO_TILE_WIDTH_LOG2))\n      << 7;\n  const int inner_blocks =\n      ((p.z & 0x3) << 5) | (((p.y >> 1) & 0x3) << 3) | (p.x & 0x7);\n  const int outer_inner_bytes = (outer_blocks | inner_blocks)\n                                << bytes_per_block_log2;\n  const int bank = ((p.y >> 3) ^ (p.z >> 2)) & 0x1;\n  const int pipe = ((p.x >> 3) & 0x3) ^ (bank << 1);\n  return XenosTextureTiledAddressCombine(outer_inner_bytes, bank, pipe,\n                                         p.y & 1);\n}\n\n// XOR to apply to the tiled address to flip the bits corresponding to the given\n// X coordinate bits within the width of a macro tile.\n// Note that in a tiled address, bit 7 is X[4] ^ Y[3] ^ Z[2], not X[4] alone.\nint XenosTextureTiledAddressXInMacroXor(const int x,\n                                        const uint bytes_per_block_log2) {\n  return XenosTextureTiledAddressCombine((x & 0x7) << bytes_per_block_log2,\n                                         0, (x >> 3) & 0x3, 0);\n}\n\n// The lowest bits of an block index within a micro tile are X[2:0].\n// In a tiled address, the bit 4 is always Y[0].\n// However, the bits [3:0] are the lower bits of the micro tile block index\n// times the number of bytes per block.\n// Because of this, a number of blocks, that depends on the count of bytes per\n// block, along the X axis (aligned to this amount) is stored consecutively in\n// guest memory:\n// - 1bpb: 8 blocks (8 bytes - limited by address bit 3 being Y[1] for 1bpb).\n// - 2bpb: 8 blocks (16 bytes - limited by address bit 4 always being Y[0]).\n// - 4bpb: 4 blocks.\n// - 8bpb: 2 blocks.\n// - 16bpb: 1 block.\n// This makes it possible to access multiple blocks in a single row using 8-byte\n// or (for >= 2bpb) 16-byte loads and stores, and that's particularly useful\n// when transferring texture data between tiled and linear storage.\n\n// With resolution scaling, one scaled group of bytes in guest addresses\n// corresponds to `scale.x * scale.y` groups of the same size on the host.\n//\n// A single group contains a full rectangular region of blocks. This means that,\n// for instance, if the Y[1] tiled address bit is within the group size, Y[0]\n// must be within it too, so division is enough to go from host to guest\n// coordinates for the origin of the group.\n//\n// The address of the guest group on the host is the guest tiled address of its\n// origin in guest coordinates multiplied by `scale.x * scale.y`.\n//\n// Within a guest group, the addressing of blocks is controlled by the host.\n// Specifically, host groups are arranged in a guest group as group-linear\n// column-major (for storage locality along both axes), and blocks in a host\n// group are laid out as linear row-major (guest tiling therefore is applied\n// only to whole guest groups, not within them, for simplicity).\n//\n// Addressing with resolution scaling is not intended to allow for\n// reinterpretation of resolution-scaled data between different numbers of bytes\n// per block. Rather, it's designed for simple and efficient access on the host,\n// primarily when copying between tiled and linear storage, and to reduce the\n// differences in shader logic between unscaled and scaled data.\n//\n// However, the groups are still small enough to preserve most of the tiling\n// properties on a macro level, most importantly the possibility to resolve\n// EDRAM render target regions to textures at different destination offsets.\n//\n// Also, the group sizes are selected to make resolution scaling calculations\n// work the same for 2D and 3D textures, and also mostly position-independent -\n// in particular, the bit 7 of a tiled address, which depends on Y[3] and Z[2],\n// is never within the group size. This allows, for example, for downsampling of\n// resolution-scaled data in a memory range to be done with the number of bytes\n// per pixel being the only needed metadata.\n//\n// A common pattern in Xenia is copying multiple 8-byte or (for >= 2bpb) 16-byte\n// sequences of consecutive blocks along the X axis in a single shader\n// invocation, by computing the tiled address once and merely flipping X bits in\n// it.\n//\n// With the resolution scaling group size being no larger than 2^7 bytes, it may\n// contain guest X bits [3:0] for <= 4bpb, [1:0] for 8bpb, and [0] for 16bpb\n// (note that though X[3] always goes to address[6], for 8bpb, X[2] is\n// address[8], so a group can't be wider than 4 blocks, and similarly for X[1]\n// for 16bpb).\n//\n// Given these requirements, the group sizes are chosen as follows:\n// - 1bpb - lower 7 bits of an unscaled address are X0, X1, X2, Y1, Y0, Y2, X3:\n//   - Group width: 2^4 blocks (maximum within 7 bits), or 2^4 bytes.\n//   - Group height: 2^3 blocks (Y[2:0] between X[3:0]).\n// - 2bpb - lower 7 bits of an unscaled address are 0, X0, X1, X2, Y0, Y1, X3:\n//   - Group width: 2^4 blocks (maximum within 7 bits), or 2^5 bytes.\n//   - Group height: 2^2 blocks (Y[1:0] between X[3:0]).\n// - 4bpb - lower 7 bits of an unscaled address are 0, 0, X0, X1, Y0, X2, X3:\n//   - Group width: 2^4 blocks (maximum within 7 bits), or 2^6 bytes.\n//   - Group height: 2^1 blocks (Y[0] between X[3:0]).\n// - 8bpb - lower 7 bits of an unscaled address are 0, 0, 0, X0, Y0, X1, X3:\n//   - Group width: 2^2 blocks (X[2] is beyond 7 bits), or 2^5 bytes.\n//   - Group height: 2^1 blocks (Y[0] between X[1:0]).\n// - 16bpb - lower 7 bits of an unscaled address are 0, 0, 0, 0, Y0, X0, X3:\n//   - Group width: 2^1 blocks (X[2:1] is beyond 7 bits), or 2^5 bytes.\n//   - Group height: 2^1 blocks (Y[0] below X[0]).\n//\n// 2^6 bytes copied per invocation is likely to be optimal, as that consumes 16\n// 32-bit VGPRs, out of a total of 24 (1024 / 40 rounded down to 4) available\n// without VGPR usage becoming a theoretical occupancy limit on AMD GCN\n// (although the occupancy of copy shaders is likely to be limited by memory\n// accesses instead anyway).\n//\n// Note that with the given group sizes, as well as with blocks in a host group\n// stored as row-major, for 1bpb, 16x1 host blocks are stored consecutively with\n// resolution scaling (even though in guest tiling, only 8x1 blocks are), so\n// they can be accessed via one 16-byte operation rather than two 8-byte ones.\n\n// Expected to be called for a compile-time constant.\nuint2_xe XeniaTextureResolutionScaledGroupBlocksLog2(\n    const uint bytes_per_block_log2) {\n  // Based on the tiled address properties, see the comment above for details.\n  return uint2_xe(bytes_per_block_log2 >= 3u ? 5u - bytes_per_block_log2 : 4u,\n                  3u - min(bytes_per_block_log2, 2u));\n}\n\nstruct XeniaTextureResolutionScaledAddressing {\n  uint2_xe guest_group_origin;\n  uint host_byte_offset_in_guest_group;\n};\n\nXeniaTextureResolutionScaledAddressing\nXeniaTextureGetResolutionScaledAddressing(const uint2_xe position,\n                                          const uint2_xe resolution_scale,\n                                          const uint bytes_per_block_log2) {\n  XeniaTextureResolutionScaledAddressing addressing;\n\n  const uint2_xe group_blocks_log2 =\n      XeniaTextureResolutionScaledGroupBlocksLog2(bytes_per_block_log2);\n\n  const uint2_xe host_group_id_in_texture = position >> group_blocks_log2;\n  const uint2_xe guest_group_id_in_texture =\n      host_group_id_in_texture / resolution_scale;\n  const uint2_xe host_group_id_in_guest_group =\n      host_group_id_in_texture - resolution_scale * guest_group_id_in_texture;\n\n  addressing.guest_group_origin =\n      guest_group_id_in_texture << group_blocks_log2;\n\n  // Host groups are stored as column-major in a guest group, but this can be\n  // changed freely.\n  const uint host_group_index_in_guest_group =\n      host_group_id_in_guest_group.x * resolution_scale.y +\n      host_group_id_in_guest_group.y;\n  // Shifts are expanded rather than chained because the number of bytes per\n  // block, and thus also the group size, are expected to be compile-time\n  // constants, so this is expected to be combined using GPU bitfield insert\n  // instructions.\n  const uint group_width_bytes_log2 =\n      group_blocks_log2.x + bytes_per_block_log2;\n  const uint2_xe position_in_host_group =\n      position & ((uint_x2_xe(1u) << group_blocks_log2) - 1u);\n  addressing.host_byte_offset_in_guest_group =\n      (host_group_index_in_guest_group <<\n           (group_width_bytes_log2 + group_blocks_log2.y)) |\n      (position_in_host_group.y << group_width_bytes_log2) |\n      (position_in_host_group.x << bytes_per_block_log2);\n\n  return addressing;\n}\n\nint XeTextureHostLinearOffset(int3_xe p, uint pitch, uint height, uint bpb) {\n  return p.x * int(bpb) + (p.z * int(height) + p.y) * int(pitch);\n}\n\n#endif  // XENIA_GPU_SHADERS_TEXTURE_ADDRESS_XESLI_\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load.xesli",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_SHADERS_TEXTURE_LOAD_XESLI_\n#define XENIA_GPU_SHADERS_TEXTURE_LOAD_XESLI_\n\n#include \"endian.xesli\"\n#include \"texture_address.xesli\"\n\n// 128 threads per group (the maximum wave size supported by DXIL and SPIR-V,\n// and the minimum required number of threads per group on Vulkan), laid out as\n// 4x32 (32 texels along Y per group - one guest tile) - starting with 64x32\n// blocks (2x1 guest tiles) per group for 8bpb / 16bpb, and smaller for larger\n// block sizes. Since the mip tail is packed in 32x / x32 storage, there's no\n// need for the Y group size smaller than 32 - 8x16, for instance, would result\n// in 128x16 blocks per group for 8bpb / 16bpb, and for a 32x32 mip tail, there\n// would be two groups rather than one, for a total of 128x32 blocks - 75% of\n// the work will be wasted rather than 50% with one 64x32-block group.\n#define LOCAL_SIZE_X_XE 4\n#define LOCAL_SIZE_Y_XE 32\n#define LOCAL_SIZE_Z_XE 1\n\npush_const_begin_xe(b0, space0)\n  uint xe_texture_load_is_tiled_3d_endian_scale;\n  // Base offset in bytes, resolution-scaled.\n  uint xe_texture_load_guest_offset;\n  // Unscaled.\n  uint xe_texture_load_guest_pitch_aligned;\n  // For 3D textures only (ignored otherwise) - aligned to 32, unscaled.\n  uint xe_texture_load_guest_z_stride_block_rows_aligned;\n\n  // - std140 vector boundary -\n\n  // If this is a packed mip tail, this is aligned to tile dimensions.\n  // Resolution-scaled.\n  uint3_xe xe_texture_load_size_blocks;\n  // Base offset in bytes.\n  uint xe_texture_load_host_offset;\n\n  // - std140 vector boundary -\n\n  uint xe_texture_load_host_pitch;\n  uint xe_texture_load_height_texels;\npush_const_end_xe\n\n#define XE_TEXTURE_LOAD_ENTRY(source_byte_buffer_alignment)                 \\\n  byte_buffer_align16_wo_declare_xe(xe_texture_load_dest, set=0, binding=0, \\\n                                    u0, space0)                             \\\n  byte_buffer_align##source_byte_buffer_alignment##_declare_xe(             \\\n      xe_texture_load_source, set=1, binding=0, t0, space0)                 \\\n  entry_bindings_begin_compute_xe                                           \\\n    XE_TEXTURE_LOAD_PUSH_CONST_BINDING                                      \\\n    entry_binding_next_xe                                                   \\\n    byte_buffer_wo_binding_xe(xe_texture_load_dest, buffer(1))              \\\n    entry_binding_next_xe                                                   \\\n    byte_buffer_binding_xe(xe_texture_load_source, buffer(2))               \\\n  entry_bindings_end_inputs_begin_compute_xe                                \\\n    entry_in_global_thread_id_xe                                            \\\n  entry_inputs_end_code_begin_compute_xe\n\n#define XE_TEXTURE_LOAD_PUSH_CONST_BINDING push_const_binding_xe(buffer(0))\n\nstruct XeTextureLoadInfo {\n  bool is_tiled;\n  bool is_3d;\n  uint endian_32;\n  uint2_xe resolution_scale;\n  uint guest_offset;\n  uint guest_pitch_aligned;\n  uint guest_z_stride_block_rows_aligned;\n  uint3_xe size_blocks;\n  uint host_offset;\n  uint host_pitch;\n  uint height_texels;\n};\n\nXeTextureLoadInfo XeTextureLoadGetInfo(param_push_consts_xe) {\n  XeTextureLoadInfo load_info;\n  uint is_tiled_3d_endian_scale =\n      push_const_xe(xe_texture_load_is_tiled_3d_endian_scale);\n  #ifdef XE_TEXTURE_LOAD_RESOLUTION_SCALED\n    // Only resolved textures can be resolution-scaled, and resolving is only\n    // possible to a tiled destination.\n    load_info.is_tiled = true;\n  #else\n    load_info.is_tiled = (is_tiled_3d_endian_scale & 1u) != 0u;\n  #endif\n  load_info.is_3d = (is_tiled_3d_endian_scale & (1u << 1u)) != 0u;\n  load_info.endian_32 = (is_tiled_3d_endian_scale >> 2u) & 3u;\n  #ifdef XE_TEXTURE_LOAD_RESOLUTION_SCALED\n    load_info.resolution_scale =\n        ((uint_x2_xe(is_tiled_3d_endian_scale)) >> uint2_xe(4u, 7u)) & 7u;\n  #else\n    load_info.resolution_scale = uint2_xe(1u, 1u);\n  #endif\n  load_info.guest_offset = push_const_xe(xe_texture_load_guest_offset);\n  load_info.guest_pitch_aligned =\n      push_const_xe(xe_texture_load_guest_pitch_aligned);\n  load_info.guest_z_stride_block_rows_aligned =\n      push_const_xe(xe_texture_load_guest_z_stride_block_rows_aligned);\n  load_info.size_blocks = push_const_xe(xe_texture_load_size_blocks);\n  load_info.host_offset = push_const_xe(xe_texture_load_host_offset);\n  load_info.host_pitch = push_const_xe(xe_texture_load_host_pitch);\n  load_info.height_texels = push_const_xe(xe_texture_load_height_texels);\n  return load_info;\n}\n\nuint XeTextureLoadSourceAddress(const XeTextureLoadInfo load_info,\n                                const uint3_xe host_position,\n                                const uint bytes_per_block_log2) {\n  uint address;\n  uint3_xe guest_position = host_position;\n#ifdef XE_TEXTURE_LOAD_RESOLUTION_SCALED\n  const XeniaTextureResolutionScaledAddressing resolution_scaled_addressing =\n      XeniaTextureGetResolutionScaledAddressing(host_position.xy,\n                                                load_info.resolution_scale,\n                                                bytes_per_block_log2);\n  guest_position.xy = resolution_scaled_addressing.guest_group_origin;\n#else\n  dont_flatten_xe if (!load_info.is_tiled) {\n    address = (guest_position.x +\n               load_info.guest_pitch_aligned *\n                   (guest_position.y +\n                    load_info.guest_z_stride_block_rows_aligned *\n                        guest_position.z)) <<\n              bytes_per_block_log2;\n  } else\n#endif\n  {\n    dont_flatten_xe if (load_info.is_3d) {\n      address = uint(XenosTextureTiledAddress3D(\n          int3_xe(guest_position),\n          load_info.guest_pitch_aligned >> XENOS_TEXTURE_MACRO_TILE_WIDTH_LOG2,\n          load_info.guest_z_stride_block_rows_aligned >>\n              XENOS_TEXTURE_MACRO_TILE_HEIGHT_3D_LOG2,\n          bytes_per_block_log2));\n    } else {\n      address = uint(XenosTextureTiledAddress2D(\n          int2_xe(guest_position.xy),\n          load_info.guest_pitch_aligned >> XENOS_TEXTURE_MACRO_TILE_WIDTH_LOG2,\n          bytes_per_block_log2));\n    }\n  }\n#ifdef XE_TEXTURE_LOAD_RESOLUTION_SCALED\n  address =\n      address * (load_info.resolution_scale.x * load_info.resolution_scale.y) +\n      resolution_scaled_addressing.host_byte_offset_in_guest_group;\n#endif\n  address += load_info.guest_offset;\n  return address;\n}\n\n// XOR to apply to the byte address to flip the bits corresponding to the given\n// X coordinate bits within:\n// - Resolution-scaled tiled: XeniaTextureResolutionScaledGroupBlocks.x;\n// - Unscaled tiled: macro tile width;\n// - Linear: 256 bytes.\n// Addition is recommended instead of XOR if the bits are known to be 0 in the\n// original address, so the host GPU driver can optimize it into a constant load\n// offset if available in the host hardware shader instruction set architecture.\nuint XeTextureLoadLocalXAddressXor(const uint x,\n                                   const uint bytes_per_block_log2,\n                                   const bool is_tiled) {\n  uint x_address_xor;\n#ifndef XE_TEXTURE_LOAD_RESOLUTION_SCALED\n  dont_flatten_xe if (is_tiled) {\n    x_address_xor = uint(\n        XenosTextureTiledAddressXInMacroXor(int(x), bytes_per_block_log2));\n  } else\n#endif\n  {\n    x_address_xor = x << bytes_per_block_log2;\n  }\n  return x_address_xor;\n}\n\n#endif  // XENIA_GPU_SHADERS_TEXTURE_LOAD_XESLI_\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_128bpb.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"texture_load_128bpb.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_128bpb.xesli",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"texture_load.xesli\"\n\nXE_TEXTURE_LOAD_ENTRY(16)\n{\n  // 1 thread = 2 blocks.\n  XeTextureLoadInfo load_info = XeTextureLoadGetInfo(pass_push_consts_xe);\n  uint3_xe block_index = in_global_thread_id_xe << uint3_xe(1u, 0u, 0u);\n  dont_flatten_xe\n  if (any(greater_than_equal_xe(block_index.xy, load_info.size_blocks.xy))) {\n    return;\n  }\n  uint block_offset_host =\n      load_info.host_offset +\n      uint(XeTextureHostLinearOffset(int3_xe(block_index), load_info.host_pitch,\n                                     load_info.size_blocks.y, 16u));\n  uint block_offset_guest =\n      XeTextureLoadSourceAddress(load_info, block_index, 4u);\n  byte_buffer_align16_store16_xe(\n      xe_texture_load_dest, block_offset_host,\n      XeEndianSwap32(byte_buffer_align16_load16_xe(xe_texture_load_source,\n                                                   block_offset_guest),\n                     load_info.endian_32));\n  block_offset_host += 16u;\n  block_offset_guest +=\n      XeTextureLoadLocalXAddressXor(1u, 4u, load_info.is_tiled);\n  byte_buffer_align16_store16_xe(\n      xe_texture_load_dest, block_offset_host,\n      XeEndianSwap32(byte_buffer_align16_load16_xe(xe_texture_load_source,\n                                                   block_offset_guest),\n                     load_info.endian_32));\n}\nentry_code_end_compute_xe\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_128bpb_scaled.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#define XE_TEXTURE_LOAD_RESOLUTION_SCALED\n#include \"texture_load_128bpb.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_16bpb.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#define XE_TEXTURE_LOAD_16BPB_TRANSFORM(blocks) (blocks)\n#include \"texture_load_16bpb.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_16bpb.xesli",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"texture_load.xesli\"\n\nXE_TEXTURE_LOAD_ENTRY(16)\n{\n  // 1 thread = 16 blocks passed through an externally provided\n  // uint4 transformation function (XE_TEXTURE_LOAD_16BPB_TRANSFORM).\n  XeTextureLoadInfo load_info = XeTextureLoadGetInfo(pass_push_consts_xe);\n  uint3_xe block_index = in_global_thread_id_xe << uint3_xe(4u, 0u, 0u);\n  dont_flatten_xe\n  if (any(greater_than_equal_xe(block_index.xy, load_info.size_blocks.xy))) {\n    return;\n  }\n  uint block_offset_host =\n      load_info.host_offset +\n      uint(XeTextureHostLinearOffset(int3_xe(block_index), load_info.host_pitch,\n                                     load_info.size_blocks.y, 2u));\n  uint block_offset_guest =\n      XeTextureLoadSourceAddress(load_info, block_index, 1u);\n  uint4_xe guest_blocks = XeEndianSwap16(\n      byte_buffer_align16_load16_xe(xe_texture_load_source, block_offset_guest),\n      load_info.endian_32);\n  byte_buffer_align16_store16_xe(xe_texture_load_dest, block_offset_host,\n                                 XE_TEXTURE_LOAD_16BPB_TRANSFORM(guest_blocks));\n  block_offset_host += 16u;\n  block_offset_guest +=\n      XeTextureLoadLocalXAddressXor(8u, 1u, load_info.is_tiled);\n  guest_blocks = XeEndianSwap16(\n      byte_buffer_align16_load16_xe(xe_texture_load_source, block_offset_guest),\n      load_info.endian_32);\n  byte_buffer_align16_store16_xe(xe_texture_load_dest, block_offset_host,\n                                 XE_TEXTURE_LOAD_16BPB_TRANSFORM(guest_blocks));\n}\nentry_code_end_compute_xe\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_16bpb_scaled.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#define XE_TEXTURE_LOAD_RESOLUTION_SCALED\n#define XE_TEXTURE_LOAD_16BPB_TRANSFORM(blocks) (blocks)\n#include \"texture_load_16bpb.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_32bpb.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#define XE_TEXTURE_LOAD_32BPB_TRANSFORM(blocks) (blocks)\n#include \"texture_load_32bpb.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_32bpb.xesli",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"texture_load.xesli\"\n\nXE_TEXTURE_LOAD_ENTRY(16)\n{\n  // 1 thread = 8 blocks passed through an externally provided\n  // uint4 transformation function (XE_TEXTURE_LOAD_32BPB_TRANSFORM).\n  XeTextureLoadInfo load_info = XeTextureLoadGetInfo(pass_push_consts_xe);\n  uint3_xe block_index = in_global_thread_id_xe << uint3_xe(3u, 0u, 0u);\n  dont_flatten_xe\n  if (any(greater_than_equal_xe(block_index.xy, load_info.size_blocks.xy))) {\n    return;\n  }\n  uint block_offset_host =\n      load_info.host_offset +\n      uint(XeTextureHostLinearOffset(int3_xe(block_index), load_info.host_pitch,\n                                     load_info.size_blocks.y, 4u));\n  uint block_offset_guest =\n      XeTextureLoadSourceAddress(load_info, block_index, 2u);\n  uint4_xe guest_blocks = XeEndianSwap32(\n      byte_buffer_align16_load16_xe(xe_texture_load_source, block_offset_guest),\n      load_info.endian_32);\n  byte_buffer_align16_store16_xe(xe_texture_load_dest, block_offset_host,\n                                 XE_TEXTURE_LOAD_32BPB_TRANSFORM(guest_blocks));\n  block_offset_host += 16u;\n  block_offset_guest +=\n      XeTextureLoadLocalXAddressXor(4u, 2u, load_info.is_tiled);\n  guest_blocks = XeEndianSwap32(\n      byte_buffer_align16_load16_xe(xe_texture_load_source, block_offset_guest),\n      load_info.endian_32);\n  byte_buffer_align16_store16_xe(xe_texture_load_dest, block_offset_host,\n                                 XE_TEXTURE_LOAD_32BPB_TRANSFORM(guest_blocks));\n}\nentry_code_end_compute_xe\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_32bpb_64bpb.xesli",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"texture_load.xesli\"\n\nXE_TEXTURE_LOAD_ENTRY(16)\n{\n  // 1 thread = 8 packed 32-bit texels with the externally provided uint4 -> 2x\n  // uint4 function (XE_TEXTURE_LOAD_32BPB_TO_64BPB) for converting to 64bpb -\n  // useful for expansion of hendeca (10:11:11 or 11:11:10) to unorm16/snorm16.\n  XeTextureLoadInfo load_info = XeTextureLoadGetInfo(pass_push_consts_xe);\n  uint3_xe block_index = in_global_thread_id_xe << uint3_xe(3u, 0u, 0u);\n  dont_flatten_xe\n  if (any(greater_than_equal_xe(block_index.xy, load_info.size_blocks.xy))) {\n    return;\n  }\n  uint block_offset_host =\n      load_info.host_offset +\n      uint(XeTextureHostLinearOffset(int3_xe(block_index), load_info.host_pitch,\n                                     load_info.size_blocks.y, 8u));\n  uint block_offset_guest =\n      XeTextureLoadSourceAddress(load_info, block_index, 2u);\n  uint4_xe guest_blocks = XeEndianSwap32(\n      byte_buffer_align16_load16_xe(xe_texture_load_source, block_offset_guest),\n      load_info.endian_32);\n  uint4_xe block_0, block_1;\n  XE_TEXTURE_LOAD_32BPB_TO_64BPB(guest_blocks, block_0, block_1);\n  byte_buffer_align16_store16_xe(xe_texture_load_dest, block_offset_host,\n                                 block_0);\n  byte_buffer_align16_store16_xe(xe_texture_load_dest,\n                                 block_offset_host + 0x10u, block_1);\n  block_offset_guest +=\n      XeTextureLoadLocalXAddressXor(4u, 2u, load_info.is_tiled);\n  guest_blocks = XeEndianSwap32(\n      byte_buffer_align16_load16_xe(xe_texture_load_source, block_offset_guest),\n      load_info.endian_32);\n  XE_TEXTURE_LOAD_32BPB_TO_64BPB(guest_blocks, block_0, block_1);\n  byte_buffer_align16_store16_xe(xe_texture_load_dest,\n                                 block_offset_host + 0x20u, block_0);\n  byte_buffer_align16_store16_xe(xe_texture_load_dest,\n                                 block_offset_host + 0x30u, block_1);\n}\nentry_code_end_compute_xe\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_32bpb_scaled.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#define XE_TEXTURE_LOAD_RESOLUTION_SCALED\n#define XE_TEXTURE_LOAD_32BPB_TRANSFORM(blocks) (blocks)\n#include \"texture_load_32bpb.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_64bpb.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#define XE_TEXTURE_LOAD_64BPB_TRANSFORM(blocks) (blocks)\n#include \"texture_load_64bpb.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_64bpb.xesli",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"texture_load.xesli\"\n\nXE_TEXTURE_LOAD_ENTRY(16)\n{\n  // 1 thread = 4 blocks passed through an externally provided\n  // uint4 transformation function (XE_TEXTURE_LOAD_64BPB_TRANSFORM).\n  XeTextureLoadInfo load_info = XeTextureLoadGetInfo(pass_push_consts_xe);\n  uint3_xe block_index = in_global_thread_id_xe << uint3_xe(2u, 0u, 0u);\n  dont_flatten_xe\n  if (any(greater_than_equal_xe(block_index.xy, load_info.size_blocks.xy))) {\n    return;\n  }\n  uint block_offset_host =\n      load_info.host_offset +\n      uint(XeTextureHostLinearOffset(int3_xe(block_index), load_info.host_pitch,\n                                     load_info.size_blocks.y, 8u));\n  uint block_offset_guest =\n      XeTextureLoadSourceAddress(load_info, block_index, 3u);\n  uint4_xe guest_blocks = XeEndianSwap32(\n      byte_buffer_align16_load16_xe(xe_texture_load_source, block_offset_guest),\n      load_info.endian_32);\n  byte_buffer_align16_store16_xe(xe_texture_load_dest, block_offset_host,\n                                 XE_TEXTURE_LOAD_64BPB_TRANSFORM(guest_blocks));\n  block_offset_host += 16u;\n  block_offset_guest +=\n      XeTextureLoadLocalXAddressXor(2u, 3u, load_info.is_tiled);\n  guest_blocks = XeEndianSwap32(\n      byte_buffer_align16_load16_xe(xe_texture_load_source, block_offset_guest),\n      load_info.endian_32);\n  byte_buffer_align16_store16_xe(xe_texture_load_dest, block_offset_host,\n                                 XE_TEXTURE_LOAD_64BPB_TRANSFORM(guest_blocks));\n}\nentry_code_end_compute_xe\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_64bpb_scaled.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#define XE_TEXTURE_LOAD_RESOLUTION_SCALED\n#define XE_TEXTURE_LOAD_64BPB_TRANSFORM(blocks) (blocks)\n#include \"texture_load_64bpb.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_8bpb.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"texture_load_8bpb.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_8bpb.xesli",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"texture_load.xesli\"\n\nXE_TEXTURE_LOAD_ENTRY(8)\n{\n  // 1 thread = 16 blocks.\n  XeTextureLoadInfo load_info = XeTextureLoadGetInfo(pass_push_consts_xe);\n  uint3_xe block_index = in_global_thread_id_xe << uint3_xe(4u, 0u, 0u);\n  dont_flatten_xe\n  if (any(greater_than_equal_xe(block_index.xy, load_info.size_blocks.xy))) {\n    return;\n  }\n  uint block_offset_host =\n      load_info.host_offset +\n      uint(XeTextureHostLinearOffset(int3_xe(block_index), load_info.host_pitch,\n                                     load_info.size_blocks.y, 1u));\n  uint block_offset_guest =\n      XeTextureLoadSourceAddress(load_info, block_index, 0u);\n  byte_buffer_align16_store16_xe(\n      xe_texture_load_dest, block_offset_host,\n      uint4_xe(\n          byte_buffer_align8_load8_xe(xe_texture_load_source,\n                                      block_offset_guest),\n          byte_buffer_align8_load8_xe(\n              xe_texture_load_source,\n              block_offset_guest +\n                  XeTextureLoadLocalXAddressXor(8u, 0u, load_info.is_tiled))));\n}\nentry_code_end_compute_xe\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_8bpb_scaled.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#define XE_TEXTURE_LOAD_RESOLUTION_SCALED\n#include \"texture_load_8bpb.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_bgrg8_rgb8.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"pixel_formats.xesli\"\n#define XE_TEXTURE_LOAD_32BPB_TO_64BPB XeBGRG8ToRGB8WithRGBBSwizzle\n#include \"texture_load_32bpb_64bpb.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_bgrg8_rgbg8.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"pixel_formats.xesli\"\n#define XE_TEXTURE_LOAD_32BPB_TRANSFORM XeBGRG8ToRGBG8\n#include \"texture_load_32bpb.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_ctx1.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"pixel_formats.xesli\"\n#include \"texture_load.xesli\"\n\n// http://fileadmin.cs.lth.se/cs/Personal/Michael_Doggett/talks/unc-xenos-doggett.pdf\n// CXT1 is like DXT3/5 color, but 2-component and with 8:8 endpoints rather than\n// 5:6:5.\n//\n// Dword 1:\n// rrrrrrrrgggggggg\n// RRRRRRRRGGGGGGGG\n// (R is in the higher bits, according to how this format is used in 4D5307E6).\n// Dword 2:\n// AA BB CC DD\n// EE FF GG HH\n// II JJ KK LL\n// MM NN OO PP\n\nXE_TEXTURE_LOAD_ENTRY(16)\n{\n  // 1 thread = 4 CTX1 blocks to 16x4 R8G8 texels.\n  XeTextureLoadInfo load_info = XeTextureLoadGetInfo(pass_push_consts_xe);\n  uint3_xe block_index = in_global_thread_id_xe << uint3_xe(2u, 0u, 0u);\n  dont_flatten_xe\n  if (any(greater_than_equal_xe(block_index.xy, load_info.size_blocks.xy))) {\n    return;\n  }\n  uint3_xe texel_index_host = block_index << uint3_xe(2u, 2u, 0u);\n  uint block_offset_host =\n      load_info.host_offset +\n      uint(XeTextureHostLinearOffset(int3_xe(texel_index_host),\n                                     load_info.host_pitch,\n                                     load_info.height_texels, 2u));\n  uint block_offset_guest =\n      XeTextureLoadSourceAddress(load_info, block_index, 3u);\n  uint i;\n  unroll_xe for (i = 0u; i < 2u; ++i) {\n    if (i != 0u) {\n      block_offset_host += 16u;\n      block_offset_guest += XeTextureLoadLocalXAddressXor(2u, 3u,\n                                                          load_info.is_tiled);\n    }\n    // Two blocks.\n    uint4_xe blocks = XeEndianSwap32(\n        byte_buffer_align16_load16_xe(xe_texture_load_source,\n                                      block_offset_guest),\n        load_info.endian_32);\n    // Unpack the endpoints as 0x00g000r0 0x00G000R0 0x00g100r1 0x00G100R1 so\n    // they can be multiplied by their weights allowing overflow.\n    uint4_xe end_8in16;\n    end_8in16.xz = ((blocks.xz >> 8u) & 0xFFu) | ((blocks.xz & 0xFFu) << 16u);\n    end_8in16.yw = (blocks.xz >> 24u) | (blocks.xz & 0xFF0000u);\n    uint2_xe weights_high = XeDXTHighColorWeights(blocks.yw);\n    byte_buffer_align16_store16_xe(\n        xe_texture_load_dest, block_offset_host,\n        XeCTX1TwoBlocksRowToR8G8(end_8in16, weights_high));\n    dont_flatten_xe if (texel_index_host.y + 1u < load_info.height_texels) {\n      byte_buffer_align16_store16_xe(\n          xe_texture_load_dest, block_offset_host + load_info.host_pitch,\n          XeCTX1TwoBlocksRowToR8G8(end_8in16, weights_high >> 8u));\n      dont_flatten_xe if (texel_index_host.y + 2u < load_info.height_texels) {\n        byte_buffer_align16_store16_xe(\n            xe_texture_load_dest, block_offset_host + 2u * load_info.host_pitch,\n            XeCTX1TwoBlocksRowToR8G8(end_8in16, weights_high >> 16u));\n        dont_flatten_xe\n        if (texel_index_host.y + 3u < load_info.height_texels) {\n          byte_buffer_align16_store16_xe(\n              xe_texture_load_dest,\n              block_offset_host + 3u * load_info.host_pitch,\n              XeCTX1TwoBlocksRowToR8G8(end_8in16, weights_high >> 24u));\n        }\n      }\n    }\n  }\n}\nentry_code_end_compute_xe\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_depth_float.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"pixel_formats.xesli\"\n#define XE_TEXTURE_LOAD_32BPB_TRANSFORM(blocks) \\\n  (XeFloat20e4To32((blocks) >> 8u))\n#include \"texture_load_32bpb.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_depth_float_scaled.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#define XE_TEXTURE_LOAD_RESOLUTION_SCALED\n#include \"pixel_formats.xesli\"\n#define XE_TEXTURE_LOAD_32BPB_TRANSFORM(blocks) \\\n  (XeFloat20e4To32((blocks) >> 8u))\n#include \"texture_load_32bpb.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_depth_unorm.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"pixel_formats.xesli\"\n#define XE_TEXTURE_LOAD_32BPB_TRANSFORM(blocks) \\\n  (float_bits_to_uint_xe(XeUNorm24To32((blocks) >> 8u)))\n#include \"texture_load_32bpb.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_depth_unorm_scaled.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#define XE_TEXTURE_LOAD_RESOLUTION_SCALED\n#include \"pixel_formats.xesli\"\n#define XE_TEXTURE_LOAD_32BPB_TRANSFORM(blocks) \\\n  (float_bits_to_uint_xe(XeUNorm24To32((blocks) >> 8u)))\n#include \"texture_load_32bpb.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_dxn_rg8.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"pixel_formats.xesli\"\n#include \"texture_load.xesli\"\n\nXE_TEXTURE_LOAD_ENTRY(16)\n{\n  // 1 thread = 2 DXN blocks to 8x4 R8G8 texels.\n  XeTextureLoadInfo load_info = XeTextureLoadGetInfo(pass_push_consts_xe);\n  uint3_xe block_index = in_global_thread_id_xe << uint3_xe(1u, 0u, 0u);\n  dont_flatten_xe\n  if (any(greater_than_equal_xe(block_index.xy, load_info.size_blocks.xy))) {\n    return;\n  }\n  uint3_xe texel_index_host = block_index << uint3_xe(2u, 2u, 0u);\n  uint block_offset_host =\n      load_info.host_offset +\n      uint(XeTextureHostLinearOffset(int3_xe(texel_index_host),\n                                     load_info.host_pitch,\n                                     load_info.height_texels, 2u));\n  uint block_offset_guest =\n      XeTextureLoadSourceAddress(load_info, block_index, 4u);\n  uint4_xe block_0 = XeEndianSwap32(\n      byte_buffer_align16_load16_xe(xe_texture_load_source, block_offset_guest),\n      load_info.endian_32);\n  block_offset_guest += XeTextureLoadLocalXAddressXor(1u, 4u,\n                                                      load_info.is_tiled);\n  uint4_xe block_1 = XeEndianSwap32(\n      byte_buffer_align16_load16_xe(xe_texture_load_source, block_offset_guest),\n      load_info.endian_32);\n  uint4_xe end_0 = (block_0.xxzz >> uint4_xe(0u, 8u, 0u, 8u)) & 0xFFu;\n  uint4_xe end_1 = (block_1.xxzz >> uint4_xe(0u, 8u, 0u, 8u)) & 0xFFu;\n  uint4_xe weights = (uint4_xe(block_0.xz, block_1.xz) >> 16u) |\n                     ((uint4_xe(block_0.yw, block_1.yw) & 0xFFu) << 16u);\n  weights = uint4_xe(XeDXT5HighAlphaWeights(end_0.xy, weights.x),\n                     XeDXT5HighAlphaWeights(end_0.zw, weights.y),\n                     XeDXT5HighAlphaWeights(end_1.xy, weights.z),\n                     XeDXT5HighAlphaWeights(end_1.zw, weights.w));\n  byte_buffer_align16_store16_xe(\n      xe_texture_load_dest, block_offset_host,\n      uint4_xe(XeDXT5RowToA8In16(end_0.xy, weights.x) |\n                   (XeDXT5RowToA8In16(end_0.zw, weights.y) << 8u),\n               XeDXT5RowToA8In16(end_1.xy, weights.z) |\n                   (XeDXT5RowToA8In16(end_1.zw, weights.w) << 8u)));\n  dont_flatten_xe if (++texel_index_host.y < load_info.height_texels) {\n    block_offset_host += load_info.host_pitch;\n    weights >>= 12u;\n    byte_buffer_align16_store16_xe(\n        xe_texture_load_dest, block_offset_host,\n        uint4_xe(XeDXT5RowToA8In16(end_0.xy, weights.x) |\n                     (XeDXT5RowToA8In16(end_0.zw, weights.y) << 8u),\n                 XeDXT5RowToA8In16(end_1.xy, weights.z) |\n                     (XeDXT5RowToA8In16(end_1.zw, weights.w) << 8u)));\n    dont_flatten_xe if (++texel_index_host.y < load_info.height_texels) {\n      block_offset_host += load_info.host_pitch;\n      weights = uint4_xe(block_0.yw, block_1.yw) >> 8u;\n      weights = uint4_xe(XeDXT5HighAlphaWeights(end_0.xy, weights.x),\n                         XeDXT5HighAlphaWeights(end_0.zw, weights.y),\n                         XeDXT5HighAlphaWeights(end_1.xy, weights.z),\n                         XeDXT5HighAlphaWeights(end_1.zw, weights.w));\n      byte_buffer_align16_store16_xe(\n          xe_texture_load_dest, block_offset_host,\n          uint4_xe(XeDXT5RowToA8In16(end_0.xy, weights.x) |\n                       (XeDXT5RowToA8In16(end_0.zw, weights.y) << 8u),\n                   XeDXT5RowToA8In16(end_1.xy, weights.z) |\n                       (XeDXT5RowToA8In16(end_1.zw, weights.w) << 8u)));\n      dont_flatten_xe if (++texel_index_host.y < load_info.height_texels) {\n        block_offset_host += load_info.host_pitch;\n        weights >>= 12u;\n        byte_buffer_align16_store16_xe(\n            xe_texture_load_dest, block_offset_host,\n            uint4_xe(XeDXT5RowToA8In16(end_0.xy, weights.x) |\n                         (XeDXT5RowToA8In16(end_0.zw, weights.y) << 8u),\n                     XeDXT5RowToA8In16(end_1.xy, weights.z) |\n                         (XeDXT5RowToA8In16(end_1.zw, weights.w) << 8u)));\n      }\n    }\n  }\n}\nentry_code_end_compute_xe\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_dxt1_rgba8.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"pixel_formats.xesli\"\n#include \"texture_load.xesli\"\n\nXE_TEXTURE_LOAD_ENTRY(16)\n{\n  // 1 thread = 4 DXT1 blocks to 16x4 R8G8B8A8 texels.\n  XeTextureLoadInfo load_info = XeTextureLoadGetInfo(pass_push_consts_xe);\n  uint3_xe block_index = in_global_thread_id_xe << uint3_xe(2u, 0u, 0u);\n  dont_flatten_xe\n  if (any(greater_than_equal_xe(block_index.xy, load_info.size_blocks.xy))) {\n    return;\n  }\n  uint3_xe texel_index_host = block_index << uint3_xe(2u, 2u, 0u);\n  uint block_offset_host =\n      load_info.host_offset +\n      uint(XeTextureHostLinearOffset(int3_xe(texel_index_host),\n                                     load_info.host_pitch,\n                                     load_info.height_texels, 4u));\n  uint block_offset_guest =\n      XeTextureLoadSourceAddress(load_info, block_index, 3u);\n  uint4_xe blocks_01 = XeEndianSwap32(\n      byte_buffer_align16_load16_xe(xe_texture_load_source, block_offset_guest),\n      load_info.endian_32);\n  block_offset_guest += XeTextureLoadLocalXAddressXor(2u, 3u,\n                                                      load_info.is_tiled);\n  uint4_xe blocks_23 = XeEndianSwap32(\n      byte_buffer_align16_load16_xe(xe_texture_load_source, block_offset_guest),\n      load_info.endian_32);\n  uint4_xe end_8in10_01 =\n      uint4_xe(XeDXTColorEndpointsToBGR8In10(blocks_01.x),\n               XeDXTColorEndpointsToBGR8In10(blocks_01.z));\n  uint4_xe end_8in10_23 =\n      uint4_xe(XeDXTColorEndpointsToBGR8In10(blocks_23.x),\n               XeDXTColorEndpointsToBGR8In10(blocks_23.z));\n  bool4_xe is_trans =\n      less_than_equal_xe(uint4_xe(end_8in10_01.xz, end_8in10_23.xz),\n                         uint4_xe(end_8in10_01.yw, end_8in10_23.yw));\n  uint4_xe weights = uint4_xe(blocks_01.yw, blocks_23.yw);\n  weights = select_xe(is_trans, XeDXT1TransWeights(weights),\n                      XeDXTHighColorWeights(weights));\n  uint i;\n  unroll_xe for (i = 0u; i < 4u; ++i) {\n    if (i != 0u) {\n      if (texel_index_host.y + i >= load_info.height_texels) {\n        break;\n      }\n      block_offset_host += load_info.host_pitch;\n      weights >>= 8u;\n    }\n    byte_buffer_align16_store16_xe(\n        xe_texture_load_dest, block_offset_host,\n        is_trans.x ? XeDXT1TransRowToRGBA8(end_8in10_01.xy, weights.x)\n                   : (XeDXTOpaqueRowToRGB8(end_8in10_01.xy, weights.x) |\n                      0xFF000000u));\n    byte_buffer_align16_store16_xe(\n        xe_texture_load_dest, block_offset_host + 0x10u,\n        is_trans.y ? XeDXT1TransRowToRGBA8(end_8in10_01.zw, weights.y)\n                   : (XeDXTOpaqueRowToRGB8(end_8in10_01.zw, weights.y) |\n                      0xFF000000u));\n    byte_buffer_align16_store16_xe(\n        xe_texture_load_dest, block_offset_host + 0x20u,\n        is_trans.z ? XeDXT1TransRowToRGBA8(end_8in10_23.xy, weights.z)\n                   : (XeDXTOpaqueRowToRGB8(end_8in10_23.xy, weights.z) |\n                      0xFF000000u));\n    byte_buffer_align16_store16_xe(\n        xe_texture_load_dest, block_offset_host + 0x30u,\n        is_trans.w ? XeDXT1TransRowToRGBA8(end_8in10_23.zw, weights.w)\n                   : (XeDXTOpaqueRowToRGB8(end_8in10_23.zw, weights.w) |\n                      0xFF000000u));\n  }\n}\nentry_code_end_compute_xe\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_dxt3_rgba8.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"pixel_formats.xesli\"\n#include \"texture_load.xesli\"\n\nXE_TEXTURE_LOAD_ENTRY(16)\n{\n  // 1 thread = 2 DXT3 blocks to 8x4 R8G8B8A8 texels.\n  XeTextureLoadInfo load_info = XeTextureLoadGetInfo(pass_push_consts_xe);\n  uint3_xe block_index = in_global_thread_id_xe << uint3_xe(1u, 0u, 0u);\n  dont_flatten_xe\n  if (any(greater_than_equal_xe(block_index.xy, load_info.size_blocks.xy))) {\n    return;\n  }\n  uint3_xe texel_index_host = block_index << uint3_xe(2u, 2u, 0u);\n  uint block_offset_host =\n      load_info.host_offset +\n      uint(XeTextureHostLinearOffset(int3_xe(texel_index_host),\n                                     load_info.host_pitch,\n                                     load_info.height_texels, 4u));\n  uint block_offset_guest =\n      XeTextureLoadSourceAddress(load_info, block_index, 4u);\n  uint i;\n  unroll_xe for (i = 0u; i < 2u; ++i) {\n    if (i != 0u) {\n      block_offset_host += 16u;\n      block_offset_guest += XeTextureLoadLocalXAddressXor(1u, 4u,\n                                                          load_info.is_tiled);\n    }\n    uint4_xe block = XeEndianSwap32(\n        byte_buffer_align16_load16_xe(xe_texture_load_source,\n                                      block_offset_guest),\n        load_info.endian_32);\n    uint2_xe bgr_end_8in10 = XeDXTColorEndpointsToBGR8In10(block.z);\n    // Sort the color indices so they can be used as weights for the second\n    // endpoint.\n    uint bgr_weights = XeDXTHighColorWeights(block.w);\n    byte_buffer_align16_store16_xe(\n        xe_texture_load_dest, block_offset_host,\n        XeDXTOpaqueRowToRGB8(bgr_end_8in10, bgr_weights) +\n            ((block.xxxx >> uint4_xe(0u, 4u, 8u, 12u)) & 0xFu) * 0x11000000u);\n    dont_flatten_xe if (texel_index_host.y + 1u < load_info.height_texels) {\n      byte_buffer_align16_store16_xe(\n          xe_texture_load_dest, block_offset_host + load_info.host_pitch,\n          XeDXTOpaqueRowToRGB8(bgr_end_8in10, bgr_weights >> 8u) +\n              ((block.xxxx >> uint4_xe(16u, 20u, 24u, 28u)) & 0xFu) *\n              0x11000000u);\n      dont_flatten_xe if (texel_index_host.y + 2u < load_info.height_texels) {\n        byte_buffer_align16_store16_xe(\n            xe_texture_load_dest, block_offset_host + 2u * load_info.host_pitch,\n            XeDXTOpaqueRowToRGB8(bgr_end_8in10, bgr_weights >> 16u) +\n                ((block.yyyy >> uint4_xe(0u, 4u, 8u, 12u)) & 0xFu) *\n                0x11000000u);\n        dont_flatten_xe\n        if (texel_index_host.y + 3u < load_info.height_texels) {\n          byte_buffer_align16_store16_xe(\n              xe_texture_load_dest,\n              block_offset_host + 3u * load_info.host_pitch,\n              XeDXTOpaqueRowToRGB8(bgr_end_8in10, bgr_weights >> 24u) +\n                  ((block.yyyy >> uint4_xe(16u, 20u, 24u, 28u)) & 0xFu) *\n                  0x11000000u);\n        }\n      }\n    }\n  }\n}\nentry_code_end_compute_xe\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_dxt3a.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"pixel_formats.xesli\"\n#include \"texture_load.xesli\"\n\nXE_TEXTURE_LOAD_ENTRY(16)\n{\n  // 1 thread = 4 DXT3A blocks to 16x4 R8 texels (no need to convert to DXT3\n  // because the overhead is the same, 2x, but the size must be 4-aligned on\n  // Direct3D 12).\n  XeTextureLoadInfo load_info = XeTextureLoadGetInfo(pass_push_consts_xe);\n  uint3_xe block_index = in_global_thread_id_xe << uint3_xe(2u, 0u, 0u);\n  dont_flatten_xe\n  if (any(greater_than_equal_xe(block_index.xy, load_info.size_blocks.xy))) {\n    return;\n  }\n  uint3_xe texel_index_host = block_index << uint3_xe(2u, 2u, 0u);\n  uint block_offset_host =\n      load_info.host_offset +\n      uint(XeTextureHostLinearOffset(int3_xe(texel_index_host),\n                                     load_info.host_pitch,\n                                     load_info.height_texels, 1u));\n  uint block_offset_guest =\n      XeTextureLoadSourceAddress(load_info, block_index, 3u);\n  uint4_xe blocks_01 = XeEndianSwap32(\n      byte_buffer_align16_load16_xe(xe_texture_load_source, block_offset_guest),\n      load_info.endian_32);\n  block_offset_guest += XeTextureLoadLocalXAddressXor(2u, 3u,\n                                                      load_info.is_tiled);\n  uint4_xe blocks_23 = XeEndianSwap32(\n      byte_buffer_align16_load16_xe(xe_texture_load_source, block_offset_guest),\n      load_info.endian_32);\n  byte_buffer_align16_store16_xe(\n      xe_texture_load_dest, block_offset_host,\n      XeDXT3FourBlocksRowToA8(uint4_xe(blocks_01.xz, blocks_23.xz)));\n  dont_flatten_xe if (++texel_index_host.y < load_info.height_texels) {\n    block_offset_host += load_info.host_pitch;\n    byte_buffer_align16_store16_xe(\n        xe_texture_load_dest, block_offset_host,\n        XeDXT3FourBlocksRowToA8(uint4_xe(blocks_01.xz, blocks_23.xz) >> 16u));\n    dont_flatten_xe if (++texel_index_host.y < load_info.height_texels) {\n      block_offset_host += load_info.host_pitch;\n      byte_buffer_align16_store16_xe(\n          xe_texture_load_dest, block_offset_host,\n          XeDXT3FourBlocksRowToA8(uint4_xe(blocks_01.yw, blocks_23.yw)));\n      dont_flatten_xe if (++texel_index_host.y < load_info.height_texels) {\n        block_offset_host += load_info.host_pitch;\n        byte_buffer_align16_store16_xe(\n            xe_texture_load_dest, block_offset_host,\n            XeDXT3FourBlocksRowToA8(\n                uint4_xe(blocks_01.yw, blocks_23.yw) >> 16u));\n      }\n    }\n  }\n}\nentry_code_end_compute_xe\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_dxt3aas1111.xesli",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"texture_load.xesli\"\n\nXE_TEXTURE_LOAD_ENTRY(16)\n{\n  // 1 thread = 4 DXT3A-as-1111 blocks to 16x4 16bpp texels passed through an\n  // externally provided\n  // `uint4 XE_TEXTURE_LOAD_DXT3A_AS_1_1_1_1_TO_16BPP(uint2 halfblocks)`\n  // conversion function.\n  XeTextureLoadInfo load_info = XeTextureLoadGetInfo(pass_push_consts_xe);\n  uint3_xe block_index = in_global_thread_id_xe << uint3_xe(2u, 0u, 0u);\n  dont_flatten_xe\n  if (any(greater_than_equal_xe(block_index.xy, load_info.size_blocks.xy))) {\n    return;\n  }\n  uint3_xe texel_index_host = block_index << uint3_xe(2u, 2u, 0u);\n  uint block_offset_host =\n      load_info.host_offset +\n      uint(XeTextureHostLinearOffset(int3_xe(texel_index_host),\n                                     load_info.host_pitch,\n                                     load_info.height_texels, 2u));\n  uint block_offset_guest =\n      XeTextureLoadSourceAddress(load_info, block_index, 3u);\n  uint4_xe blocks_01 = XeEndianSwap32(\n      byte_buffer_align16_load16_xe(xe_texture_load_source, block_offset_guest),\n      load_info.endian_32);\n  block_offset_guest += XeTextureLoadLocalXAddressXor(2u, 3u,\n                                                      load_info.is_tiled);\n  uint4_xe blocks_23 = XeEndianSwap32(\n      byte_buffer_align16_load16_xe(xe_texture_load_source, block_offset_guest),\n      load_info.endian_32);\n  byte_buffer_align16_store16_xe(\n      xe_texture_load_dest, block_offset_host,\n      XE_TEXTURE_LOAD_DXT3A_AS_1_1_1_1_TO_16BPP(blocks_01.xz));\n  byte_buffer_align16_store16_xe(\n      xe_texture_load_dest, block_offset_host + 16u,\n      XE_TEXTURE_LOAD_DXT3A_AS_1_1_1_1_TO_16BPP(blocks_23.xz));\n  dont_flatten_xe if (++texel_index_host.y < load_info.height_texels) {\n    block_offset_host += load_info.host_pitch;\n    uint4_xe high_halfblocks = uint4_xe(blocks_01.xz, blocks_23.xz) >> 16u;\n    byte_buffer_align16_store16_xe(\n        xe_texture_load_dest, block_offset_host,\n        XE_TEXTURE_LOAD_DXT3A_AS_1_1_1_1_TO_16BPP(high_halfblocks.xy));\n    byte_buffer_align16_store16_xe(\n        xe_texture_load_dest, block_offset_host + 16u,\n        XE_TEXTURE_LOAD_DXT3A_AS_1_1_1_1_TO_16BPP(high_halfblocks.zw));\n    dont_flatten_xe if (++texel_index_host.y < load_info.height_texels) {\n      block_offset_host += load_info.host_pitch;\n      byte_buffer_align16_store16_xe(\n          xe_texture_load_dest, block_offset_host,\n          XE_TEXTURE_LOAD_DXT3A_AS_1_1_1_1_TO_16BPP(blocks_01.yw));\n      byte_buffer_align16_store16_xe(\n          xe_texture_load_dest, block_offset_host + 16u,\n          XE_TEXTURE_LOAD_DXT3A_AS_1_1_1_1_TO_16BPP(blocks_23.yw));\n      dont_flatten_xe if (++texel_index_host.y < load_info.height_texels) {\n        block_offset_host += load_info.host_pitch;\n        high_halfblocks = uint4_xe(blocks_01.yw, blocks_23.yw) >> 16u;\n        byte_buffer_align16_store16_xe(\n            xe_texture_load_dest, block_offset_host,\n            XE_TEXTURE_LOAD_DXT3A_AS_1_1_1_1_TO_16BPP(high_halfblocks.xy));\n        byte_buffer_align16_store16_xe(\n            xe_texture_load_dest, block_offset_host + 16u,\n            XE_TEXTURE_LOAD_DXT3A_AS_1_1_1_1_TO_16BPP(high_halfblocks.zw));\n      }\n    }\n  }\n}\nentry_code_end_compute_xe\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_dxt3aas1111_argb4.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"pixel_formats.xesli\"\n#define XE_TEXTURE_LOAD_DXT3A_AS_1_1_1_1_TO_16BPP \\\n    XeDXT3AAs1111TwoBlocksRowToARGB4\n#include \"texture_load_dxt3aas1111.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_dxt3aas1111_bgra4.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"pixel_formats.xesli\"\n#define XE_TEXTURE_LOAD_DXT3A_AS_1_1_1_1_TO_16BPP \\\n    XeDXT3AAs1111TwoBlocksRowToBGRA4\n#include \"texture_load_dxt3aas1111.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_dxt5_rgba8.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"pixel_formats.xesli\"\n#include \"texture_load.xesli\"\n\nXE_TEXTURE_LOAD_ENTRY(16)\n{\n  // 1 thread = 2 DXT5 blocks to 8x4 R8G8B8A8 texels.\n  XeTextureLoadInfo load_info = XeTextureLoadGetInfo(pass_push_consts_xe);\n  uint3_xe block_index = in_global_thread_id_xe << uint3_xe(1u, 0u, 0u);\n  dont_flatten_xe\n  if (any(greater_than_equal_xe(block_index.xy, load_info.size_blocks.xy))) {\n    return;\n  }\n  uint3_xe texel_index_host = block_index << uint3_xe(2u, 2u, 0u);\n  uint block_offset_host =\n      load_info.host_offset +\n      uint(XeTextureHostLinearOffset(int3_xe(texel_index_host),\n                                     load_info.host_pitch,\n                                     load_info.height_texels, 4u));\n  uint block_offset_guest =\n      XeTextureLoadSourceAddress(load_info, block_index, 4u);\n  uint i;\n  unroll_xe for (i = 0u; i < 2u; ++i) {\n    if (i != 0u) {\n      block_offset_host += 16u;\n      block_offset_guest += XeTextureLoadLocalXAddressXor(1u, 4u,\n                                                          load_info.is_tiled);\n    }\n    uint4_xe block = XeEndianSwap32(\n        byte_buffer_align16_load16_xe(xe_texture_load_source,\n                                      block_offset_guest),\n        load_info.endian_32);\n    uint2_xe bgr_end_8in10 = XeDXTColorEndpointsToBGR8In10(block.z);\n    // Sort the color indices so they can be used as weights for the second\n    // endpoint.\n    uint bgr_weights = XeDXTHighColorWeights(block.w);\n    uint2_xe alpha_end = (block.xx >> uint2_xe(0u, 8u)) & 0xFFu;\n    uint alpha_weights = XeDXT5HighAlphaWeights(\n        alpha_end, (block.x >> 16u) | ((block.y & 0xFFu) << 16u));\n    byte_buffer_align16_store16_xe(\n        xe_texture_load_dest, block_offset_host,\n        XeDXTOpaqueRowToRGB8(bgr_end_8in10, bgr_weights) |\n        ((uint_x4_xe(XeDXT5RowToA8(alpha_end, alpha_weights)) <<\n              uint4_xe(24u, 16u, 8u, 0u))\n             & 0xFF000000u));\n    dont_flatten_xe if (texel_index_host.y + 1u < load_info.height_texels) {\n      byte_buffer_align16_store16_xe(\n          xe_texture_load_dest, block_offset_host + load_info.host_pitch,\n          XeDXTOpaqueRowToRGB8(bgr_end_8in10, bgr_weights >> 8u) |\n          ((uint_x4_xe(XeDXT5RowToA8(alpha_end, alpha_weights >> 12u)) <<\n                uint4_xe(24u, 16u, 8u, 0u))\n               & 0xFF000000u));\n      dont_flatten_xe if (texel_index_host.y + 2u < load_info.height_texels) {\n        alpha_weights = XeDXT5HighAlphaWeights(alpha_end, block.y >> 8u);\n        byte_buffer_align16_store16_xe(\n            xe_texture_load_dest, block_offset_host + 2u * load_info.host_pitch,\n            XeDXTOpaqueRowToRGB8(bgr_end_8in10, bgr_weights >> 16u) |\n            ((uint_x4_xe(XeDXT5RowToA8(alpha_end, alpha_weights)) <<\n                  uint4_xe(24u, 16u, 8u, 0u))\n                 & 0xFF000000u));\n        dont_flatten_xe\n        if (texel_index_host.y + 3u < load_info.height_texels) {\n          byte_buffer_align16_store16_xe(\n              xe_texture_load_dest,\n              block_offset_host + 3u * load_info.host_pitch,\n              XeDXTOpaqueRowToRGB8(bgr_end_8in10, bgr_weights >> 24u) |\n              ((uint_x4_xe(XeDXT5RowToA8(alpha_end, alpha_weights >> 12u)) <<\n                    uint4_xe(24u, 16u, 8u, 0u))\n                   & 0xFF000000u));\n        }\n      }\n    }\n  }\n}\nentry_code_end_compute_xe\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_dxt5a_r8.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"pixel_formats.xesli\"\n#include \"texture_load.xesli\"\n\nXE_TEXTURE_LOAD_ENTRY(16)\n{\n  // 1 thread = 4 DXT5A blocks to 16x4 R8 texels.\n  XeTextureLoadInfo load_info = XeTextureLoadGetInfo(pass_push_consts_xe);\n  uint3_xe block_index = in_global_thread_id_xe << uint3_xe(2u, 0u, 0u);\n  dont_flatten_xe\n  if (any(greater_than_equal_xe(block_index.xy, load_info.size_blocks.xy))) {\n    return;\n  }\n  uint3_xe texel_index_host = block_index << uint3_xe(2u, 2u, 0u);\n  uint block_offset_host =\n      load_info.host_offset +\n      uint(XeTextureHostLinearOffset(int3_xe(texel_index_host),\n                                     load_info.host_pitch,\n                                     load_info.height_texels, 1u));\n  uint block_offset_guest =\n      XeTextureLoadSourceAddress(load_info, block_index, 3u);\n  uint4_xe blocks_01 = XeEndianSwap32(\n      byte_buffer_align16_load16_xe(xe_texture_load_source, block_offset_guest),\n      load_info.endian_32);\n  block_offset_guest += XeTextureLoadLocalXAddressXor(2u, 3u,\n                                                      load_info.is_tiled);\n  uint4_xe blocks_23 = XeEndianSwap32(\n      byte_buffer_align16_load16_xe(xe_texture_load_source, block_offset_guest),\n      load_info.endian_32);\n  uint4_xe end_01 = (blocks_01.xxzz >> uint4_xe(0u, 8u, 0u, 8u)) & 0xFFu;\n  uint4_xe end_23 = (blocks_23.xxzz >> uint4_xe(0u, 8u, 0u, 8u)) & 0xFFu;\n  uint4_xe weights =\n      (uint4_xe(blocks_01.xz, blocks_23.xz) >> 16u) |\n      ((uint4_xe(blocks_01.yw, blocks_23.yw) & 0xFFu) << 16u);\n  weights = uint4_xe(XeDXT5HighAlphaWeights(end_01.xy, weights.x),\n                     XeDXT5HighAlphaWeights(end_01.zw, weights.y),\n                     XeDXT5HighAlphaWeights(end_23.xy, weights.z),\n                     XeDXT5HighAlphaWeights(end_23.zw, weights.w));\n  byte_buffer_align16_store16_xe(\n      xe_texture_load_dest, block_offset_host,\n      uint4_xe(XeDXT5RowToA8(end_01.xy, weights.x),\n               XeDXT5RowToA8(end_01.zw, weights.y),\n               XeDXT5RowToA8(end_23.xy, weights.z),\n               XeDXT5RowToA8(end_23.zw, weights.w)));\n  dont_flatten_xe if (++texel_index_host.y < load_info.height_texels) {\n    block_offset_host += load_info.host_pitch;\n    weights >>= 12u;\n    byte_buffer_align16_store16_xe(\n        xe_texture_load_dest, block_offset_host,\n        uint4_xe(XeDXT5RowToA8(end_01.xy, weights.x),\n                 XeDXT5RowToA8(end_01.zw, weights.y),\n                 XeDXT5RowToA8(end_23.xy, weights.z),\n                 XeDXT5RowToA8(end_23.zw, weights.w)));\n    dont_flatten_xe if (++texel_index_host.y < load_info.height_texels) {\n      block_offset_host += load_info.host_pitch;\n      weights = uint4_xe(blocks_01.yw, blocks_23.yw) >> 8u;\n      weights = uint4_xe(XeDXT5HighAlphaWeights(end_01.xy, weights.x),\n                         XeDXT5HighAlphaWeights(end_01.zw, weights.y),\n                         XeDXT5HighAlphaWeights(end_23.xy, weights.z),\n                         XeDXT5HighAlphaWeights(end_23.zw, weights.w));\n      byte_buffer_align16_store16_xe(\n          xe_texture_load_dest, block_offset_host,\n          uint4_xe(XeDXT5RowToA8(end_01.xy, weights.x),\n                   XeDXT5RowToA8(end_01.zw, weights.y),\n                   XeDXT5RowToA8(end_23.xy, weights.z),\n                   XeDXT5RowToA8(end_23.zw, weights.w)));\n      dont_flatten_xe if (++texel_index_host.y < load_info.height_texels) {\n        block_offset_host += load_info.host_pitch;\n        weights >>= 12u;\n        byte_buffer_align16_store16_xe(\n            xe_texture_load_dest, block_offset_host,\n            uint4_xe(XeDXT5RowToA8(end_01.xy, weights.x),\n                     XeDXT5RowToA8(end_01.zw, weights.y),\n                     XeDXT5RowToA8(end_23.xy, weights.z),\n                     XeDXT5RowToA8(end_23.zw, weights.w)));\n      }\n    }\n  }\n}\nentry_code_end_compute_xe\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_gbgr8_grgb8.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"pixel_formats.xesli\"\n#define XE_TEXTURE_LOAD_32BPB_TRANSFORM XeGBGR8ToGRGB8\n#include \"texture_load_32bpb.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_gbgr8_rgb8.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"pixel_formats.xesli\"\n#define XE_TEXTURE_LOAD_32BPB_TO_64BPB XeGBGR8ToRGB8WithRGBBSwizzle\n#include \"texture_load_32bpb_64bpb.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_r10g11b11_rgba16.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"pixel_formats.xesli\"\n#define XE_TEXTURE_LOAD_32BPB_TO_64BPB XeR10G11B11UNormToRGBA16\n#include \"texture_load_32bpb_64bpb.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_r10g11b11_rgba16_scaled.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#define XE_TEXTURE_LOAD_RESOLUTION_SCALED\n#include \"pixel_formats.xesli\"\n#define XE_TEXTURE_LOAD_32BPB_TO_64BPB XeR10G11B11UNormToRGBA16\n#include \"texture_load_32bpb_64bpb.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_r10g11b11_rgba16_snorm.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"pixel_formats.xesli\"\n#define XE_TEXTURE_LOAD_32BPB_TO_64BPB XeR10G11B11SNormToRGBA16\n#include \"texture_load_32bpb_64bpb.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_r10g11b11_rgba16_snorm_scaled.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#define XE_TEXTURE_LOAD_RESOLUTION_SCALED\n#include \"pixel_formats.xesli\"\n#define XE_TEXTURE_LOAD_32BPB_TO_64BPB XeR10G11B11SNormToRGBA16\n#include \"texture_load_32bpb_64bpb.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_r11g11b10_rgba16.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"pixel_formats.xesli\"\n#define XE_TEXTURE_LOAD_32BPB_TO_64BPB XeR11G11B10UNormToRGBA16\n#include \"texture_load_32bpb_64bpb.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_r11g11b10_rgba16_scaled.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#define XE_TEXTURE_LOAD_RESOLUTION_SCALED\n#include \"pixel_formats.xesli\"\n#define XE_TEXTURE_LOAD_32BPB_TO_64BPB XeR11G11B10UNormToRGBA16\n#include \"texture_load_32bpb_64bpb.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_r11g11b10_rgba16_snorm.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"pixel_formats.xesli\"\n#define XE_TEXTURE_LOAD_32BPB_TO_64BPB XeR11G11B10SNormToRGBA16\n#include \"texture_load_32bpb_64bpb.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_r11g11b10_rgba16_snorm_scaled.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#define XE_TEXTURE_LOAD_RESOLUTION_SCALED\n#include \"pixel_formats.xesli\"\n#define XE_TEXTURE_LOAD_32BPB_TO_64BPB XeR11G11B10SNormToRGBA16\n#include \"texture_load_32bpb_64bpb.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_r16_snorm_float.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"pixel_formats.xesli\"\n#define XE_TEXTURE_LOAD_16BPB_TRANSFORM XeRG16SNormToRG16Float\n#include \"texture_load_16bpb.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_r16_snorm_float_scaled.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#define XE_TEXTURE_LOAD_RESOLUTION_SCALED\n#include \"pixel_formats.xesli\"\n#define XE_TEXTURE_LOAD_16BPB_TRANSFORM XeRG16SNormToRG16Float\n#include \"texture_load_16bpb.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_r16_unorm_float.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"pixel_formats.xesli\"\n#define XE_TEXTURE_LOAD_16BPB_TRANSFORM XeRG16UNormToRG16Float\n#include \"texture_load_16bpb.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_r16_unorm_float_scaled.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#define XE_TEXTURE_LOAD_RESOLUTION_SCALED\n#include \"pixel_formats.xesli\"\n#define XE_TEXTURE_LOAD_16BPB_TRANSFORM XeRG16UNormToRG16Float\n#include \"texture_load_16bpb.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_r4g4b4a4_a4r4g4b4.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"pixel_formats.xesli\"\n#define XE_TEXTURE_LOAD_16BPB_TRANSFORM XeR4G4B4A4ToA4R4G4B4\n#include \"texture_load_16bpb.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_r4g4b4a4_a4r4g4b4_scaled.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#define XE_TEXTURE_LOAD_RESOLUTION_SCALED\n#include \"pixel_formats.xesli\"\n#define XE_TEXTURE_LOAD_16BPB_TRANSFORM XeR4G4B4A4ToA4R4G4B4\n#include \"texture_load_16bpb.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_r4g4b4a4_b4g4r4a4.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"pixel_formats.xesli\"\n#define XE_TEXTURE_LOAD_16BPB_TRANSFORM XeR4G4B4A4ToB4G4R4A4\n#include \"texture_load_16bpb.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_r4g4b4a4_b4g4r4a4_scaled.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#define XE_TEXTURE_LOAD_RESOLUTION_SCALED\n#include \"pixel_formats.xesli\"\n#define XE_TEXTURE_LOAD_16BPB_TRANSFORM XeR4G4B4A4ToB4G4R4A4\n#include \"texture_load_16bpb.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_r5g5b5a1_b5g5r5a1.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"pixel_formats.xesli\"\n#define XE_TEXTURE_LOAD_16BPB_TRANSFORM XeR5G5B5A1ToB5G5R5A1\n#include \"texture_load_16bpb.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_r5g5b5a1_b5g5r5a1_scaled.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#define XE_TEXTURE_LOAD_RESOLUTION_SCALED\n#include \"pixel_formats.xesli\"\n#define XE_TEXTURE_LOAD_16BPB_TRANSFORM XeR5G5B5A1ToB5G5R5A1\n#include \"texture_load_16bpb.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_r5g5b6_b5g6r5_swizzle_rbga.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"pixel_formats.xesli\"\n#define XE_TEXTURE_LOAD_16BPB_TRANSFORM XeR5G5B6ToB5G6R5WithRBGASwizzle\n#include \"texture_load_16bpb.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_r5g5b6_b5g6r5_swizzle_rbga_scaled.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#define XE_TEXTURE_LOAD_RESOLUTION_SCALED\n#include \"pixel_formats.xesli\"\n#define XE_TEXTURE_LOAD_16BPB_TRANSFORM XeR5G5B6ToB5G6R5WithRBGASwizzle\n#include \"texture_load_16bpb.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_r5g6b5_b5g6r5.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"pixel_formats.xesli\"\n#define XE_TEXTURE_LOAD_16BPB_TRANSFORM XeR5G6B5ToB5G6R5\n#include \"texture_load_16bpb.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_r5g6b5_b5g6r5_scaled.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#define XE_TEXTURE_LOAD_RESOLUTION_SCALED\n#include \"pixel_formats.xesli\"\n#define XE_TEXTURE_LOAD_16BPB_TRANSFORM XeR5G6B5ToB5G6R5\n#include \"texture_load_16bpb.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_rg16_snorm_float.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"pixel_formats.xesli\"\n#define XE_TEXTURE_LOAD_32BPB_TRANSFORM XeRG16SNormToRG16Float\n#include \"texture_load_32bpb.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_rg16_snorm_float_scaled.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#define XE_TEXTURE_LOAD_RESOLUTION_SCALED\n#include \"pixel_formats.xesli\"\n#define XE_TEXTURE_LOAD_32BPB_TRANSFORM XeRG16SNormToRG16Float\n#include \"texture_load_32bpb.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_rg16_unorm_float.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"pixel_formats.xesli\"\n#define XE_TEXTURE_LOAD_32BPB_TRANSFORM XeRG16UNormToRG16Float\n#include \"texture_load_32bpb.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_rg16_unorm_float_scaled.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#define XE_TEXTURE_LOAD_RESOLUTION_SCALED\n#include \"pixel_formats.xesli\"\n#define XE_TEXTURE_LOAD_32BPB_TRANSFORM XeRG16UNormToRG16Float\n#include \"texture_load_32bpb.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_rgba16_snorm_float.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"pixel_formats.xesli\"\n#define XE_TEXTURE_LOAD_64BPB_TRANSFORM XeRG16SNormToRG16Float\n#include \"texture_load_64bpb.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_rgba16_snorm_float_scaled.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#define XE_TEXTURE_LOAD_RESOLUTION_SCALED\n#include \"pixel_formats.xesli\"\n#define XE_TEXTURE_LOAD_64BPB_TRANSFORM XeRG16SNormToRG16Float\n#include \"texture_load_64bpb.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_rgba16_unorm_float.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"pixel_formats.xesli\"\n#define XE_TEXTURE_LOAD_64BPB_TRANSFORM XeRG16UNormToRG16Float\n#include \"texture_load_64bpb.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/texture_load_rgba16_unorm_float_scaled.cs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#define XE_TEXTURE_LOAD_RESOLUTION_SCALED\n#include \"pixel_formats.xesli\"\n#define XE_TEXTURE_LOAD_64BPB_TRANSFORM XeRG16UNormToRG16Float\n#include \"texture_load_64bpb.xesli\"\n"
  },
  {
    "path": "src/xenia/gpu/shaders/xenos_draw.hlsli",
    "content": "#ifndef XENIA_GPU_D3D12_SHADERS_XENOS_DRAW_HLSLI_\n#define XENIA_GPU_D3D12_SHADERS_XENOS_DRAW_HLSLI_\n\ncbuffer xe_system_cbuffer : register(b0) {\n  uint xe_flags;\n  float2 xe_tessellation_factor_range;\n  uint xe_line_loop_closing_index;\n\n  uint xe_vertex_index_endian;\n  uint xe_vertex_index_offset;\n  uint2 xe_vertex_index_min_max;\n\n  float4 xe_user_clip_planes[6];\n\n  float3 xe_ndc_scale;\n  float xe_point_vertex_diameter_min;\n\n  float3 xe_ndc_offset;\n  float xe_point_vertex_diameter_max;\n\n  float2 xe_point_constant_diameter;\n  float2 xe_point_screen_diameter_to_ndc_radius;\n\n  uint4 xe_texture_swizzled_signs[2];\n\n  uint xe_textures_resolution_scaled;\n  uint2 xe_sample_count_log2;\n  float xe_alpha_test_reference;\n\n  uint xe_alpha_to_mask;\n  uint xe_edram_32bpp_tile_pitch_dwords_scaled;\n  uint xe_edram_depth_base_dwords_scaled;\n\n  float4 xe_color_exp_bias;\n\n  float2 xe_edram_poly_offset_front;\n  float2 xe_edram_poly_offset_back;\n\n  uint4 xe_edram_stencil[2];\n\n  uint4 xe_edram_rt_base_dwords_scaled;\n\n  uint4 xe_edram_rt_format_flags;\n\n  float4 xe_edram_rt_clamp[4];\n\n  uint4 xe_edram_rt_keep_mask[2];\n\n  uint4 xe_edram_rt_blend_factors_ops;\n\n  float4 xe_edram_blend_constant;\n};\n\nstruct XeHSControlPointInputIndexed {\n  float index : XEVERTEXID;\n};\n\nstruct XeHSControlPointInputAdaptive {\n  // 1.0 added in the vertex shader to convert to Direct3D 11+, and clamped to\n  // the factor range in the vertex shader.\n  float edge_factor : XETESSFACTOR;\n};\n\nstruct XeHSControlPointOutput {\n  float index : XEVERTEXID;\n};\n\nstruct XeVertexPrePS {\n  float4 interpolators[16] : TEXCOORD0;\n  float3 point_parameters : TEXCOORD16;\n};\n\nstruct XeVertexPostGS {\n  XeVertexPrePS pre_ps;\n  // Precise needed to preserve NaN - guest primitives may be converted to more\n  // than 1 triangle, so need to kill them entirely manually in GS if any vertex\n  // is NaN.\n  precise float4 position : SV_Position;\n  float4 clip_distance_0123 : SV_ClipDistance0;\n  float2 clip_distance_45 : SV_ClipDistance1;\n};\n\nstruct XeVertexPreGS {\n  XeVertexPostGS post_gs;\n  // Guest primitives may be converted to more than 1 triangle, so need to kill\n  // them entirely manually in GS - must kill if all guest primitive vertices\n  // have negative cull distance.\n  float cull_distance : SV_CullDistance;\n};\n\n#endif  // XENIA_GPU_D3D12_SHADERS_XENOS_DRAW_HLSLI_\n"
  },
  {
    "path": "src/xenia/gpu/shared_memory.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/shared_memory.h\"\n\n#include <algorithm>\n#include <utility>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/bit_range.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/memory.h\"\n#include \"xenia/base/profiling.h\"\n#include \"xenia/memory.h\"\n\nnamespace xe {\nnamespace gpu {\n\nSharedMemory::SharedMemory(Memory& memory) : memory_(memory) {\n  page_size_log2_ = xe::log2_ceil(uint32_t(xe::memory::page_size()));\n}\n\nSharedMemory::~SharedMemory() { ShutdownCommon(); }\n\nvoid SharedMemory::InitializeCommon() {\n  system_page_flags_.clear();\n  system_page_flags_.resize(((kBufferSize >> page_size_log2_) + 63) / 64);\n\n  memory_invalidation_callback_handle_ =\n      memory_.RegisterPhysicalMemoryInvalidationCallback(\n          MemoryInvalidationCallbackThunk, this);\n}\n\nvoid SharedMemory::InitializeSparseHostGpuMemory(uint32_t granularity_log2) {\n  assert_true(granularity_log2 <= kBufferSizeLog2);\n  assert_true(host_gpu_memory_sparse_granularity_log2_ == UINT32_MAX);\n  host_gpu_memory_sparse_granularity_log2_ = granularity_log2;\n  host_gpu_memory_sparse_allocated_.resize(\n      size_t(1) << (std::max(kBufferSizeLog2 - granularity_log2, uint32_t(6)) -\n                    6));\n}\n\nvoid SharedMemory::ShutdownCommon() {\n  ReleaseTraceDownloadRanges();\n\n  FireWatches(0, (kBufferSize - 1) >> page_size_log2_, false);\n  assert_true(global_watches_.empty());\n  // No watches now, so no references to the pools accessible by guest threads -\n  // safe not to enter the global critical region.\n  watch_node_first_free_ = nullptr;\n  watch_node_current_pool_allocated_ = 0;\n  for (WatchNode* pool : watch_node_pools_) {\n    delete[] pool;\n  }\n  watch_node_pools_.clear();\n  watch_range_first_free_ = nullptr;\n  watch_range_current_pool_allocated_ = 0;\n  for (WatchRange* pool : watch_range_pools_) {\n    delete[] pool;\n  }\n  watch_range_pools_.clear();\n\n  if (memory_invalidation_callback_handle_ != nullptr) {\n    memory_.UnregisterPhysicalMemoryInvalidationCallback(\n        memory_invalidation_callback_handle_);\n    memory_invalidation_callback_handle_ = nullptr;\n  }\n\n  if (host_gpu_memory_sparse_used_bytes_) {\n    host_gpu_memory_sparse_used_bytes_ = 0;\n    COUNT_profile_set(\"gpu/shared_memory/host_gpu_memory_sparse_used_mb\", 0);\n  }\n  if (host_gpu_memory_sparse_allocations_) {\n    host_gpu_memory_sparse_allocations_ = 0;\n    COUNT_profile_set(\"gpu/shared_memory/host_gpu_memory_sparse_allocations\",\n                      0);\n  }\n  host_gpu_memory_sparse_allocated_.clear();\n  host_gpu_memory_sparse_allocated_.shrink_to_fit();\n  host_gpu_memory_sparse_granularity_log2_ = UINT32_MAX;\n}\n\nvoid SharedMemory::ClearCache() {\n  // Keeping GPU-written data, so \"invalidated by GPU\".\n  FireWatches(0, (kBufferSize - 1) >> page_size_log2_, true);\n  // No watches now, so no references to the pools accessible by guest threads -\n  // safe not to enter the global critical region.\n  watch_node_first_free_ = nullptr;\n  watch_node_current_pool_allocated_ = 0;\n  for (WatchNode* pool : watch_node_pools_) {\n    delete[] pool;\n  }\n  watch_node_pools_.clear();\n  watch_range_first_free_ = nullptr;\n  watch_range_current_pool_allocated_ = 0;\n  for (WatchRange* pool : watch_range_pools_) {\n    delete[] pool;\n  }\n  watch_range_pools_.clear();\n\n  {\n    auto global_lock = global_critical_region_.Acquire();\n    for (SystemPageFlagsBlock& block : system_page_flags_) {\n      block.valid = block.valid_and_gpu_written;\n    }\n  }\n}\n\nSharedMemory::GlobalWatchHandle SharedMemory::RegisterGlobalWatch(\n    GlobalWatchCallback callback, void* callback_context) {\n  GlobalWatch* watch = new GlobalWatch;\n  watch->callback = callback;\n  watch->callback_context = callback_context;\n\n  auto global_lock = global_critical_region_.Acquire();\n  global_watches_.push_back(watch);\n\n  return reinterpret_cast<GlobalWatchHandle>(watch);\n}\n\nvoid SharedMemory::UnregisterGlobalWatch(GlobalWatchHandle handle) {\n  auto watch = reinterpret_cast<GlobalWatch*>(handle);\n\n  {\n    auto global_lock = global_critical_region_.Acquire();\n    auto it = std::find(global_watches_.begin(), global_watches_.end(), watch);\n    assert_false(it == global_watches_.end());\n    if (it != global_watches_.end()) {\n      global_watches_.erase(it);\n    }\n  }\n\n  delete watch;\n}\n\nSharedMemory::WatchHandle SharedMemory::WatchMemoryRange(\n    uint32_t start, uint32_t length, WatchCallback callback,\n    void* callback_context, void* callback_data, uint64_t callback_argument) {\n  if (length == 0 || start >= kBufferSize) {\n    return nullptr;\n  }\n  length = std::min(length, kBufferSize - start);\n  uint32_t watch_page_first = start >> page_size_log2_;\n  uint32_t watch_page_last = (start + length - 1) >> page_size_log2_;\n  uint32_t bucket_first =\n      watch_page_first << page_size_log2_ >> kWatchBucketSizeLog2;\n  uint32_t bucket_last =\n      watch_page_last << page_size_log2_ >> kWatchBucketSizeLog2;\n\n  auto global_lock = global_critical_region_.Acquire();\n\n  // Allocate the range.\n  WatchRange* range = watch_range_first_free_;\n  if (range != nullptr) {\n    watch_range_first_free_ = range->next_free;\n  } else {\n    if (watch_range_pools_.empty() ||\n        watch_range_current_pool_allocated_ >= kWatchRangePoolSize) {\n      watch_range_pools_.push_back(new WatchRange[kWatchRangePoolSize]);\n      watch_range_current_pool_allocated_ = 0;\n    }\n    range = &(watch_range_pools_.back()[watch_range_current_pool_allocated_++]);\n  }\n  range->callback = callback;\n  range->callback_context = callback_context;\n  range->callback_data = callback_data;\n  range->callback_argument = callback_argument;\n  range->page_first = watch_page_first;\n  range->page_last = watch_page_last;\n\n  // Allocate and link the nodes.\n  WatchNode* node_previous = nullptr;\n  for (uint32_t i = bucket_first; i <= bucket_last; ++i) {\n    WatchNode* node = watch_node_first_free_;\n    if (node != nullptr) {\n      watch_node_first_free_ = node->next_free;\n    } else {\n      if (watch_node_pools_.empty() ||\n          watch_node_current_pool_allocated_ >= kWatchNodePoolSize) {\n        watch_node_pools_.push_back(new WatchNode[kWatchNodePoolSize]);\n        watch_node_current_pool_allocated_ = 0;\n      }\n      node = &(watch_node_pools_.back()[watch_node_current_pool_allocated_++]);\n    }\n    node->range = range;\n    node->range_node_next = nullptr;\n    if (node_previous != nullptr) {\n      node_previous->range_node_next = node;\n    } else {\n      range->node_first = node;\n    }\n    node_previous = node;\n    node->bucket_node_previous = nullptr;\n    node->bucket_node_next = watch_buckets_[i];\n    if (watch_buckets_[i] != nullptr) {\n      watch_buckets_[i]->bucket_node_previous = node;\n    }\n    watch_buckets_[i] = node;\n  }\n\n  return reinterpret_cast<WatchHandle>(range);\n}\n\nvoid SharedMemory::UnwatchMemoryRange(WatchHandle handle) {\n  auto global_lock = global_critical_region_.Acquire();\n  UnlinkWatchRange(reinterpret_cast<WatchRange*>(handle));\n}\n\nvoid SharedMemory::FireWatches(uint32_t page_first, uint32_t page_last,\n                               bool invalidated_by_gpu) {\n  uint32_t address_first = page_first << page_size_log2_;\n  uint32_t address_last =\n      (page_last << page_size_log2_) + ((1 << page_size_log2_) - 1);\n  uint32_t bucket_first = address_first >> kWatchBucketSizeLog2;\n  uint32_t bucket_last = address_last >> kWatchBucketSizeLog2;\n\n  auto global_lock = global_critical_region_.Acquire();\n\n  // Fire global watches.\n  for (const auto global_watch : global_watches_) {\n    global_watch->callback(global_lock, global_watch->callback_context,\n                           address_first, address_last, invalidated_by_gpu);\n  }\n\n  // Fire per-range watches.\n  for (uint32_t i = bucket_first; i <= bucket_last; ++i) {\n    WatchNode* node = watch_buckets_[i];\n    while (node != nullptr) {\n      WatchRange* range = node->range;\n      // Store the next node now since when the callback is triggered, the links\n      // will be broken.\n      node = node->bucket_node_next;\n      if (page_first <= range->page_last && page_last >= range->page_first) {\n        range->callback(global_lock, range->callback_context,\n                        range->callback_data, range->callback_argument,\n                        invalidated_by_gpu);\n        UnlinkWatchRange(range);\n      }\n    }\n  }\n}\n\nvoid SharedMemory::RangeWrittenByGpu(uint32_t start, uint32_t length) {\n  if (length == 0 || start >= kBufferSize) {\n    return;\n  }\n  length = std::min(length, kBufferSize - start);\n  uint32_t end = start + length - 1;\n  uint32_t page_first = start >> page_size_log2_;\n  uint32_t page_last = end >> page_size_log2_;\n\n  // Trigger modification callbacks so, for instance, resolved data is loaded to\n  // the texture.\n  FireWatches(page_first, page_last, true);\n\n  // Mark the range as valid (so pages are not reuploaded until modified by the\n  // CPU) and watch it so the CPU can reuse it and this will be caught.\n  MakeRangeValid(start, length, true);\n}\n\nbool SharedMemory::AllocateSparseHostGpuMemoryRange(\n    uint32_t offset_allocations, uint32_t length_allocations) {\n  assert_always(\n      \"Sparse host GPU memory allocation has been initialized, but the \"\n      \"implementation doesn't provide AllocateSparseHostGpuMemoryRange\");\n  return false;\n}\n\nvoid SharedMemory::MakeRangeValid(uint32_t start, uint32_t length,\n                                  bool written_by_gpu) {\n  if (length == 0 || start >= kBufferSize) {\n    return;\n  }\n  length = std::min(length, kBufferSize - start);\n  uint32_t last = start + length - 1;\n  uint32_t valid_page_first = start >> page_size_log2_;\n  uint32_t valid_page_last = last >> page_size_log2_;\n  uint32_t valid_block_first = valid_page_first >> 6;\n  uint32_t valid_block_last = valid_page_last >> 6;\n\n  {\n    auto global_lock = global_critical_region_.Acquire();\n\n    for (uint32_t i = valid_block_first; i <= valid_block_last; ++i) {\n      uint64_t valid_bits = UINT64_MAX;\n      if (i == valid_block_first) {\n        valid_bits &= ~((uint64_t(1) << (valid_page_first & 63)) - 1);\n      }\n      if (i == valid_block_last && (valid_page_last & 63) != 63) {\n        valid_bits &= (uint64_t(1) << ((valid_page_last & 63) + 1)) - 1;\n      }\n      SystemPageFlagsBlock& block = system_page_flags_[i];\n      block.valid |= valid_bits;\n      if (written_by_gpu) {\n        block.valid_and_gpu_written |= valid_bits;\n      } else {\n        block.valid_and_gpu_written &= ~valid_bits;\n      }\n    }\n  }\n\n  if (memory_invalidation_callback_handle_) {\n    memory().EnablePhysicalMemoryAccessCallbacks(\n        valid_page_first << page_size_log2_,\n        (valid_page_last - valid_page_first + 1) << page_size_log2_, true,\n        false);\n  }\n}\n\nvoid SharedMemory::UnlinkWatchRange(WatchRange* range) {\n  uint32_t bucket =\n      range->page_first << page_size_log2_ >> kWatchBucketSizeLog2;\n  WatchNode* node = range->node_first;\n  while (node != nullptr) {\n    WatchNode* node_next = node->range_node_next;\n    if (node->bucket_node_previous != nullptr) {\n      node->bucket_node_previous->bucket_node_next = node->bucket_node_next;\n    } else {\n      watch_buckets_[bucket] = node->bucket_node_next;\n    }\n    if (node->bucket_node_next != nullptr) {\n      node->bucket_node_next->bucket_node_previous = node->bucket_node_previous;\n    }\n    node->next_free = watch_node_first_free_;\n    watch_node_first_free_ = node;\n    node = node_next;\n    ++bucket;\n  }\n  range->next_free = watch_range_first_free_;\n  watch_range_first_free_ = range;\n}\n\nbool SharedMemory::RequestRange(uint32_t start, uint32_t length) {\n  if (!length) {\n    // Some texture or buffer is empty, for example - safe to draw in this case.\n    return true;\n  }\n  if (start > kBufferSize || (kBufferSize - start) < length) {\n    return false;\n  }\n\n  SCOPE_profile_cpu_f(\"gpu\");\n\n  if (!EnsureHostGpuMemoryAllocated(start, length)) {\n    return false;\n  }\n\n  uint32_t page_first = start >> page_size_log2_;\n  uint32_t page_last = (start + length - 1) >> page_size_log2_;\n\n  upload_ranges_.clear();\n  bool any_data_resolved = false;\n  uint32_t block_first = page_first >> 6;\n  uint32_t block_last = page_last >> 6;\n  uint32_t range_start = UINT32_MAX;\n  {\n    auto global_lock = global_critical_region_.Acquire();\n    for (uint32_t i = block_first; i <= block_last; ++i) {\n      const SystemPageFlagsBlock& block = system_page_flags_[i];\n      uint64_t block_valid = block.valid;\n      // Consider pages in the block outside the requested range valid.\n      if (i == block_first) {\n        uint64_t block_before = (uint64_t(1) << (page_first & 63)) - 1;\n        block_valid |= block_before;\n      }\n      if (i == block_last && (page_last & 63) != 63) {\n        uint64_t block_inside = (uint64_t(1) << ((page_last & 63) + 1)) - 1;\n        block_valid |= ~block_inside;\n      }\n\n      while (true) {\n        uint32_t block_page;\n        if (range_start == UINT32_MAX) {\n          // Check if need to open a new range.\n          if (!xe::bit_scan_forward(~block_valid, &block_page)) {\n            break;\n          }\n          range_start = (i << 6) + block_page;\n        } else {\n          // Check if need to close the range.\n          // Ignore the valid pages before the beginning of the range.\n          uint64_t block_valid_from_start = block_valid;\n          if (i == (range_start >> 6)) {\n            block_valid_from_start &=\n                ~((uint64_t(1) << (range_start & 63)) - 1);\n          }\n          if (!xe::bit_scan_forward(block_valid_from_start, &block_page)) {\n            break;\n          }\n          upload_ranges_.push_back(\n              std::make_pair(range_start, (i << 6) + block_page - range_start));\n          // In the next iteration within this block, consider this range valid\n          // since it has been queued for upload.\n          block_valid |= (uint64_t(1) << block_page) - 1;\n          range_start = UINT32_MAX;\n        }\n      }\n    }\n  }\n  if (range_start != UINT32_MAX) {\n    upload_ranges_.push_back(\n        std::make_pair(range_start, page_last + 1 - range_start));\n  }\n  if (upload_ranges_.empty()) {\n    return true;\n  }\n\n  return UploadRanges(upload_ranges_);\n}\n\nstd::pair<uint32_t, uint32_t> SharedMemory::MemoryInvalidationCallbackThunk(\n    void* context_ptr, uint32_t physical_address_start, uint32_t length,\n    bool exact_range) {\n  return reinterpret_cast<SharedMemory*>(context_ptr)\n      ->MemoryInvalidationCallback(physical_address_start, length, exact_range);\n}\n\nstd::pair<uint32_t, uint32_t> SharedMemory::MemoryInvalidationCallback(\n    uint32_t physical_address_start, uint32_t length, bool exact_range) {\n  if (length == 0 || physical_address_start >= kBufferSize) {\n    return std::make_pair(uint32_t(0), UINT32_MAX);\n  }\n  length = std::min(length, kBufferSize - physical_address_start);\n  uint32_t physical_address_last = physical_address_start + (length - 1);\n\n  uint32_t page_first = physical_address_start >> page_size_log2_;\n  uint32_t page_last = physical_address_last >> page_size_log2_;\n  uint32_t block_first = page_first >> 6;\n  uint32_t block_last = page_last >> 6;\n\n  auto global_lock = global_critical_region_.Acquire();\n\n  if (!exact_range) {\n    // Check if a somewhat wider range (up to 256 KB with 4 KB pages) can be\n    // invalidated - if no GPU-written data nearby that was not intended to be\n    // invalidated since it's not in sync with CPU memory and can't be\n    // reuploaded. It's a lot cheaper to upload some excess data than to catch\n    // access violations - with 4 KB callbacks, 58410824 (being a\n    // software-rendered game) runs at 4 FPS on Intel Core i7-3770, with 64 KB,\n    // the CPU game code takes 3 ms to run per frame, but with 256 KB, it's\n    // 0.7 ms.\n    if (page_first & 63) {\n      uint64_t gpu_written_start =\n          system_page_flags_[block_first].valid_and_gpu_written;\n      gpu_written_start &= (uint64_t(1) << (page_first & 63)) - 1;\n      page_first =\n          (page_first & ~uint32_t(63)) + (64 - xe::lzcnt(gpu_written_start));\n    }\n    if ((page_last & 63) != 63) {\n      uint64_t gpu_written_end =\n          system_page_flags_[block_last].valid_and_gpu_written;\n      gpu_written_end &= ~((uint64_t(1) << ((page_last & 63) + 1)) - 1);\n      page_last = (page_last & ~uint32_t(63)) +\n                  (std::max(xe::tzcnt(gpu_written_end), uint8_t(1)) - 1);\n    }\n  }\n\n  for (uint32_t i = block_first; i <= block_last; ++i) {\n    uint64_t invalidate_bits = UINT64_MAX;\n    if (i == block_first) {\n      invalidate_bits &= ~((uint64_t(1) << (page_first & 63)) - 1);\n    }\n    if (i == block_last && (page_last & 63) != 63) {\n      invalidate_bits &= (uint64_t(1) << ((page_last & 63) + 1)) - 1;\n    }\n    SystemPageFlagsBlock& block = system_page_flags_[i];\n    block.valid &= ~invalidate_bits;\n    block.valid_and_gpu_written &= ~invalidate_bits;\n  }\n\n  FireWatches(page_first, page_last, false);\n\n  return std::make_pair(page_first << page_size_log2_,\n                        (page_last - page_first + 1) << page_size_log2_);\n}\n\nvoid SharedMemory::PrepareForTraceDownload() {\n  ReleaseTraceDownloadRanges();\n  assert_true(trace_download_ranges_.empty());\n  assert_zero(trace_download_page_count_);\n\n  // Invalidate the entire memory CPU->GPU memory copy so all the history\n  // doesn't have to be written into every frame trace, and collect the list of\n  // ranges with data modified on the GPU.\n\n  uint32_t fire_watches_range_start = UINT32_MAX;\n  uint32_t gpu_written_range_start = UINT32_MAX;\n  auto global_lock = global_critical_region_.Acquire();\n  for (uint32_t i = 0; i < system_page_flags_.size(); ++i) {\n    SystemPageFlagsBlock& page_flags_block = system_page_flags_[i];\n    uint64_t previously_valid_block = page_flags_block.valid;\n    uint64_t gpu_written_block = page_flags_block.valid_and_gpu_written;\n    page_flags_block.valid = gpu_written_block;\n\n    // Fire watches on the invalidated pages.\n    uint64_t fire_watches_block = previously_valid_block & ~gpu_written_block;\n    uint64_t fire_watches_break_block = ~fire_watches_block;\n    while (true) {\n      uint32_t fire_watches_block_page;\n      if (!xe::bit_scan_forward(fire_watches_range_start == UINT32_MAX\n                                    ? fire_watches_block\n                                    : fire_watches_break_block,\n                                &fire_watches_block_page)) {\n        break;\n      }\n      uint32_t fire_watches_page = (i << 6) + fire_watches_block_page;\n      if (fire_watches_range_start == UINT32_MAX) {\n        fire_watches_range_start = fire_watches_page;\n      } else {\n        FireWatches(fire_watches_range_start, fire_watches_page - 1, false);\n        fire_watches_range_start = UINT32_MAX;\n      }\n      uint64_t fire_watches_block_mask =\n          ~((uint64_t(1) << fire_watches_block_page) - 1);\n      fire_watches_block &= fire_watches_block_mask;\n      fire_watches_break_block &= fire_watches_block_mask;\n    }\n\n    // Add to the GPU-written ranges.\n    uint64_t gpu_written_break_block = ~gpu_written_block;\n    while (true) {\n      uint32_t gpu_written_block_page;\n      if (!xe::bit_scan_forward(gpu_written_range_start == UINT32_MAX\n                                    ? gpu_written_block\n                                    : gpu_written_break_block,\n                                &gpu_written_block_page)) {\n        break;\n      }\n      uint32_t gpu_written_page = (i << 6) + gpu_written_block_page;\n      if (gpu_written_range_start == UINT32_MAX) {\n        gpu_written_range_start = gpu_written_page;\n      } else {\n        uint32_t gpu_written_range_length =\n            gpu_written_page - gpu_written_range_start;\n        // Call EnsureHostGpuMemoryAllocated in case the page was marked as\n        // GPU-written not as a result to an actual write to the shared memory\n        // buffer, but, for instance, by resolving with resolution scaling (to a\n        // separate buffer).\n        if (EnsureHostGpuMemoryAllocated(\n                gpu_written_range_start << page_size_log2_,\n                gpu_written_range_length << page_size_log2_)) {\n          trace_download_ranges_.push_back(\n              std::make_pair(gpu_written_range_start << page_size_log2_,\n                             gpu_written_range_length << page_size_log2_));\n          trace_download_page_count_ += gpu_written_range_length;\n        }\n        gpu_written_range_start = UINT32_MAX;\n      }\n      uint64_t gpu_written_block_mask =\n          ~((uint64_t(1) << gpu_written_block_page) - 1);\n      gpu_written_block &= gpu_written_block_mask;\n      gpu_written_break_block &= gpu_written_block_mask;\n    }\n  }\n  uint32_t page_count = kBufferSize >> page_size_log2_;\n  if (fire_watches_range_start != UINT32_MAX) {\n    FireWatches(fire_watches_range_start, page_count - 1, false);\n  }\n  if (gpu_written_range_start != UINT32_MAX) {\n    uint32_t gpu_written_range_length = page_count - gpu_written_range_start;\n    if (EnsureHostGpuMemoryAllocated(\n            gpu_written_range_start << page_size_log2_,\n            gpu_written_range_length << page_size_log2_)) {\n      trace_download_ranges_.push_back(\n          std::make_pair(gpu_written_range_start << page_size_log2_,\n                         gpu_written_range_length << page_size_log2_));\n      trace_download_page_count_ += gpu_written_range_length;\n    }\n  }\n}\n\nvoid SharedMemory::ReleaseTraceDownloadRanges() {\n  trace_download_ranges_.clear();\n  trace_download_ranges_.shrink_to_fit();\n  trace_download_page_count_ = 0;\n}\n\nbool SharedMemory::EnsureHostGpuMemoryAllocated(uint32_t start,\n                                                uint32_t length) {\n  if (host_gpu_memory_sparse_granularity_log2_ == UINT32_MAX) {\n    return true;\n  }\n  if (!length) {\n    return true;\n  }\n  if (start > kBufferSize || (kBufferSize - start) < length) {\n    return false;\n  }\n  uint32_t page_first = start >> page_size_log2_;\n  uint32_t page_last = (start + length - 1) >> page_size_log2_;\n  uint32_t allocation_first =\n      page_first << page_size_log2_ >> host_gpu_memory_sparse_granularity_log2_;\n  uint32_t allocation_last =\n      page_last << page_size_log2_ >> host_gpu_memory_sparse_granularity_log2_;\n  while (true) {\n    std::pair<size_t, size_t> allocation_range = xe::bit_range::NextUnsetRange(\n        host_gpu_memory_sparse_allocated_.data(), allocation_first,\n        allocation_last - allocation_first + 1);\n    if (!allocation_range.second) {\n      break;\n    }\n    if (!AllocateSparseHostGpuMemoryRange(uint32_t(allocation_range.first),\n                                          uint32_t(allocation_range.second))) {\n      return false;\n    }\n    xe::bit_range::SetRange(host_gpu_memory_sparse_allocated_.data(),\n                            allocation_range.first, allocation_range.second);\n    ++host_gpu_memory_sparse_allocations_;\n    COUNT_profile_set(\"gpu/shared_memory/host_gpu_memory_sparse_allocations\",\n                      host_gpu_memory_sparse_allocations_);\n    host_gpu_memory_sparse_used_bytes_ +=\n        uint32_t(allocation_range.second)\n        << host_gpu_memory_sparse_granularity_log2_;\n    COUNT_profile_set(\n        \"gpu/shared_memory/host_gpu_memory_sparse_used_mb\",\n        (host_gpu_memory_sparse_used_bytes_ + ((1 << 20) - 1)) >> 20);\n    allocation_first =\n        uint32_t(allocation_range.first + allocation_range.second);\n  }\n  return true;\n}\n\n}  // namespace gpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/shared_memory.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_SHARED_MEMORY_H_\n#define XENIA_GPU_SHARED_MEMORY_H_\n\n#include <cstdint>\n#include <mutex>\n#include <utility>\n#include <vector>\n\n#include \"xenia/base/mutex.h\"\n#include \"xenia/memory.h\"\n\nnamespace xe {\nnamespace gpu {\n\n// Manages memory for unconverted textures, resolve targets, vertex and index\n// buffers that can be accessed from shaders with Xenon physical addresses, with\n// system page size granularity.\nclass SharedMemory {\n public:\n  static constexpr uint32_t kBufferSizeLog2 = 29;\n  static constexpr uint32_t kBufferSize = 1 << kBufferSizeLog2;\n\n  virtual ~SharedMemory();\n  // Call in the implementation-specific ClearCache.\n  virtual void ClearCache();\n\n  typedef void (*GlobalWatchCallback)(\n      const std::unique_lock<std::recursive_mutex>& global_lock, void* context,\n      uint32_t address_first, uint32_t address_last, bool invalidated_by_gpu);\n  typedef void* GlobalWatchHandle;\n  // Registers a callback invoked when something is invalidated in the GPU\n  // memory copy by the CPU or (if triggered explicitly - such as by a resolve)\n  // by the GPU. It will be fired for writes to pages previously requested, but\n  // may also be fired regardless of whether it was used by GPU emulation - for\n  // example, if the game changes protection level of a memory range containing\n  // the watched range.\n  //\n  // The callback is called within the global critical region.\n  GlobalWatchHandle RegisterGlobalWatch(GlobalWatchCallback callback,\n                                        void* callback_context);\n  void UnregisterGlobalWatch(GlobalWatchHandle handle);\n  typedef void (*WatchCallback)(\n      const std::unique_lock<std::recursive_mutex>& global_lock, void* context,\n      void* data, uint64_t argument, bool invalidated_by_gpu);\n  typedef void* WatchHandle;\n  // Registers a callback invoked when the specified memory range is invalidated\n  // in the GPU memory copy by the CPU or (if triggered explicitly - such as by\n  // a resolve) by the GPU. It will be fired for writes to pages previously\n  // requested, but may also be fired regardless of whether it was used by GPU\n  // emulation - for example, if the game changes protection level of a memory\n  // range containing the watched range.\n  //\n  // Generally the context is the subsystem pointer (for example, the texture\n  // cache), the data is the object (such as a texture), and the argument is\n  // additional subsystem/object-specific data (such as whether the range\n  // belongs to the base mip level or to the rest of the mips).\n  //\n  // Called with the global critical region locked. Do NOT watch or unwatch\n  // ranges from within it! The watch for the callback is cancelled after the\n  // callback - the handle becomes invalid.\n  WatchHandle WatchMemoryRange(uint32_t start, uint32_t length,\n                               WatchCallback callback, void* callback_context,\n                               void* callback_data, uint64_t callback_argument);\n  // Unregisters previously registered watched memory range.\n  void UnwatchMemoryRange(WatchHandle handle);\n\n  // Checks if the range has been updated, uploads new data if needed and\n  // ensures the host GPU memory backing the range are resident. Returns true if\n  // the range has been fully updated and is usable.\n  bool RequestRange(uint32_t start, uint32_t length);\n\n  // Marks the range and, if not exact_range, potentially its surroundings\n  // (to up to the first GPU-written page, as an access violation exception\n  // count optimization) as modified by the CPU, also invalidating GPU-written\n  // pages directly in the range.\n  std::pair<uint32_t, uint32_t> MemoryInvalidationCallback(\n      uint32_t physical_address_start, uint32_t length, bool exact_range);\n\n  // Marks the range as containing GPU-generated data (such as resolves),\n  // triggering modification callbacks, making it valid (so pages are not\n  // copied from the main memory until they're modified by the CPU) and\n  // protecting it. Before writing anything from the GPU side, RequestRange must\n  // be called, to make sure, if the GPU writes don't overwrite *everything* in\n  // the pages they touch, the CPU data is properly loaded to the unmodified\n  // regions in those pages.\n  void RangeWrittenByGpu(uint32_t start, uint32_t length);\n\n protected:\n  SharedMemory(Memory& memory);\n  // Call in implementation-specific initialization.\n  void InitializeCommon();\n  void InitializeSparseHostGpuMemory(uint32_t granularity_log2);\n  // Call last in implementation-specific shutdown, also callable from the\n  // destructor.\n  void ShutdownCommon();\n\n  // Sparse allocations are 4 MB, so not too many of them are allocated, but\n  // also not to waste too much memory for padding (with 16 MB there's too\n  // much).\n  static constexpr uint32_t kHostGpuMemoryOptimalSparseAllocationLog2 = 22;\n  static_assert(kHostGpuMemoryOptimalSparseAllocationLog2 <= kBufferSizeLog2);\n\n  Memory& memory() const { return memory_; }\n\n  uint32_t page_size_log2() const { return page_size_log2_; }\n\n  uint32_t host_gpu_memory_sparse_granularity_log2() const {\n    return host_gpu_memory_sparse_granularity_log2_;\n  }\n\n  // Allocations in the host buffer are aligned the same way as in the guest\n  // physical memory (for instance, if an allocation is 64 KB, it can represent\n  // 0-64 KB, 64-128 KB, 128-192 KB in the guest memory, and so on, but not\n  // something like 16-80 KB. This is assumed by the rules for texture data\n  // access in the texture cache.\n  virtual bool AllocateSparseHostGpuMemoryRange(uint32_t offset_allocations,\n                                                uint32_t length_allocations);\n\n  // Mark the memory range as updated and protect it.\n  void MakeRangeValid(uint32_t start, uint32_t length, bool written_by_gpu);\n\n  // Uploads a range of host pages - only called if host GPU sparse memory\n  // allocation succeeded if needed. While uploading, MakeRangeValid must be\n  // called for each successfully uploaded range as early as possible, before\n  // the memcpy, to make sure invalidation that happened during the CPU -> GPU\n  // memcpy isn't missed (upload_page_ranges is in pages because of this -\n  // MakeRangeValid has page granularity). upload_page_ranges are sorted in\n  // ascending address order, so front and back can be used to determine the\n  // overall bounds of pages to be uploaded.\n  virtual bool UploadRanges(\n      const std::vector<std::pair<uint32_t, uint32_t>>& upload_page_ranges) = 0;\n\n  const std::vector<std::pair<uint32_t, uint32_t>>& trace_download_ranges() {\n    return trace_download_ranges_;\n  }\n  uint32_t trace_download_page_count() const {\n    return trace_download_page_count_;\n  }\n  // Fills trace_download_ranges() and trace_download_page_count() with\n  // GPU-written ranges that need to be downloaded, and also invalidates\n  // non-GPU-written ranges so only the needed data - not the all the collected\n  // data - will be written in the trace. trace_download_page_count() will be 0\n  // if nothing to download.\n  void PrepareForTraceDownload();\n  // Release memory used for trace download ranges, to be called after\n  // downloading or in cases when download is dropped.\n  void ReleaseTraceDownloadRanges();\n\n private:\n  Memory& memory_;\n\n  // Log2 of invalidation granularity (the system page size, but the dependency\n  // on it is not hard - the access callback takes a range as an argument, and\n  // touched pages of the buffer of this size will be invalidated).\n  uint32_t page_size_log2_;\n\n  bool EnsureHostGpuMemoryAllocated(uint32_t start, uint32_t length);\n  uint32_t host_gpu_memory_sparse_granularity_log2_ = UINT32_MAX;\n  std::vector<uint64_t> host_gpu_memory_sparse_allocated_;\n  uint32_t host_gpu_memory_sparse_allocations_ = 0;\n  uint32_t host_gpu_memory_sparse_used_bytes_ = 0;\n\n  void* memory_invalidation_callback_handle_ = nullptr;\n  void* memory_data_provider_handle_ = nullptr;\n\n  // Ranges that need to be uploaded, generated by GetRangesToUpload (a\n  // persistently allocated vector).\n  std::vector<std::pair<uint32_t, uint32_t>> upload_ranges_;\n\n  // GPU-written memory downloading for traces. <Start address, length>.\n  std::vector<std::pair<uint32_t, uint32_t>> trace_download_ranges_;\n  uint32_t trace_download_page_count_ = 0;\n\n  // Mutex between the guest memory subsystem and the command processor, to be\n  // locked when checking or updating validity of pages/ranges and when firing\n  // watches.\n  xe::global_critical_region global_critical_region_;\n\n  // ***************************************************************************\n  // Things below should be fully protected by global_critical_region.\n  // ***************************************************************************\n\n  struct SystemPageFlagsBlock {\n    // Whether each page is up to date in the GPU buffer.\n    uint64_t valid;\n    // Subset of valid pages - whether each page in the GPU buffer contains data\n    // that was written on the GPU, thus should not be invalidated spuriously.\n    uint64_t valid_and_gpu_written;\n  };\n  // Flags for each 64 system pages, interleaved as blocks, so bit scan can be\n  // used to quickly extract ranges.\n  std::vector<SystemPageFlagsBlock> system_page_flags_;\n\n  static std::pair<uint32_t, uint32_t> MemoryInvalidationCallbackThunk(\n      void* context_ptr, uint32_t physical_address_start, uint32_t length,\n      bool exact_range);\n\n  struct GlobalWatch {\n    GlobalWatchCallback callback;\n    void* callback_context;\n  };\n  std::vector<GlobalWatch*> global_watches_;\n  struct WatchNode;\n  // Watched range placed by other GPU subsystems.\n  struct WatchRange {\n    union {\n      struct {\n        WatchCallback callback;\n        void* callback_context;\n        void* callback_data;\n        uint64_t callback_argument;\n        WatchNode* node_first;\n        uint32_t page_first;\n        uint32_t page_last;\n      };\n      WatchRange* next_free;\n    };\n  };\n  // Node for faster checking of watches when pages have been written to - all\n  // 512 MB are split into smaller equally sized buckets, and then ranges are\n  // linearly checked.\n  struct WatchNode {\n    union {\n      struct {\n        WatchRange* range;\n        // Link to another node of this watched range in the next bucket.\n        WatchNode* range_node_next;\n        // Links to nodes belonging to other watched ranges in the bucket.\n        WatchNode* bucket_node_previous;\n        WatchNode* bucket_node_next;\n      };\n      WatchNode* next_free;\n    };\n  };\n  static constexpr uint32_t kWatchBucketSizeLog2 = 22;\n  static constexpr uint32_t kWatchBucketCount =\n      1 << (kBufferSizeLog2 - kWatchBucketSizeLog2);\n  WatchNode* watch_buckets_[kWatchBucketCount] = {};\n  // Allocation from pools - taking new WatchRanges and WatchNodes from the free\n  // list, and if there are none, creating a pool if the current one is fully\n  // used, and linearly allocating from the current pool.\n  static constexpr uint32_t kWatchRangePoolSize = 8192;\n  static constexpr uint32_t kWatchNodePoolSize = 8192;\n  std::vector<WatchRange*> watch_range_pools_;\n  std::vector<WatchNode*> watch_node_pools_;\n  uint32_t watch_range_current_pool_allocated_ = 0;\n  uint32_t watch_node_current_pool_allocated_ = 0;\n  WatchRange* watch_range_first_free_ = nullptr;\n  WatchNode* watch_node_first_free_ = nullptr;\n  // Triggers the watches (global and per-range), removing triggered range\n  // watches.\n  void FireWatches(uint32_t page_first, uint32_t page_last,\n                   bool invalidated_by_gpu);\n  // Unlinks and frees the range and its nodes. Call this in the global critical\n  // region.\n  void UnlinkWatchRange(WatchRange* range);\n};\n\n}  // namespace gpu\n}  // namespace xe\n\n#endif  // XENIA_GPU_SHARED_MEMORY_H_\n"
  },
  {
    "path": "src/xenia/gpu/spirv_builder.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2023 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/spirv_builder.h\"\n\n#include <memory>\n#include <utility>\n#include <vector>\n\n#include \"xenia/base/assert.h\"\n\nnamespace xe {\nnamespace gpu {\n\nspv::Id SpirvBuilder::createQuadOp(spv::Op op_code, spv::Id type_id,\n                                   spv::Id operand1, spv::Id operand2,\n                                   spv::Id operand3, spv::Id operand4) {\n  if (generatingOpCodeForSpecConst) {\n    std::vector<spv::Id> operands(4);\n    operands[0] = operand1;\n    operands[1] = operand2;\n    operands[2] = operand3;\n    operands[3] = operand4;\n    return createSpecConstantOp(op_code, type_id, operands,\n                                std::vector<spv::Id>());\n  }\n  std::unique_ptr<spv::Instruction> op =\n      std::make_unique<spv::Instruction>(getUniqueId(), type_id, op_code);\n  op->addIdOperand(operand1);\n  op->addIdOperand(operand2);\n  op->addIdOperand(operand3);\n  op->addIdOperand(operand4);\n  spv::Id result = op->getResultId();\n  buildPoint->addInstruction(std::move(op));\n  return result;\n}\n\nspv::Id SpirvBuilder::createNoContractionUnaryOp(spv::Op op_code,\n                                                 spv::Id type_id,\n                                                 spv::Id operand) {\n  spv::Id result = createUnaryOp(op_code, type_id, operand);\n  addDecoration(result, spv::DecorationNoContraction);\n  return result;\n}\n\nspv::Id SpirvBuilder::createNoContractionBinOp(spv::Op op_code, spv::Id type_id,\n                                               spv::Id operand1,\n                                               spv::Id operand2) {\n  spv::Id result = createBinOp(op_code, type_id, operand1, operand2);\n  addDecoration(result, spv::DecorationNoContraction);\n  return result;\n}\n\nspv::Id SpirvBuilder::createUnaryBuiltinCall(spv::Id result_type,\n                                             spv::Id builtins, int entry_point,\n                                             spv::Id operand) {\n  std::unique_ptr<spv::Instruction> instruction =\n      std::make_unique<spv::Instruction>(getUniqueId(), result_type,\n                                         spv::OpExtInst);\n  instruction->addIdOperand(builtins);\n  instruction->addImmediateOperand(entry_point);\n  instruction->addIdOperand(operand);\n  spv::Id result = instruction->getResultId();\n  getBuildPoint()->addInstruction(std::move(instruction));\n  return result;\n}\n\nspv::Id SpirvBuilder::createBinBuiltinCall(spv::Id result_type,\n                                           spv::Id builtins, int entry_point,\n                                           spv::Id operand1, spv::Id operand2) {\n  std::unique_ptr<spv::Instruction> instruction =\n      std::make_unique<spv::Instruction>(getUniqueId(), result_type,\n                                         spv::OpExtInst);\n  instruction->addIdOperand(builtins);\n  instruction->addImmediateOperand(entry_point);\n  instruction->addIdOperand(operand1);\n  instruction->addIdOperand(operand2);\n  spv::Id result = instruction->getResultId();\n  getBuildPoint()->addInstruction(std::move(instruction));\n  return result;\n}\n\nspv::Id SpirvBuilder::createTriBuiltinCall(spv::Id result_type,\n                                           spv::Id builtins, int entry_point,\n                                           spv::Id operand1, spv::Id operand2,\n                                           spv::Id operand3) {\n  std::unique_ptr<spv::Instruction> instruction =\n      std::make_unique<spv::Instruction>(getUniqueId(), result_type,\n                                         spv::OpExtInst);\n  instruction->addIdOperand(builtins);\n  instruction->addImmediateOperand(entry_point);\n  instruction->addIdOperand(operand1);\n  instruction->addIdOperand(operand2);\n  instruction->addIdOperand(operand3);\n  spv::Id result = instruction->getResultId();\n  getBuildPoint()->addInstruction(std::move(instruction));\n  return result;\n}\n\nSpirvBuilder::IfBuilder::IfBuilder(spv::Id condition, unsigned int control,\n                                   SpirvBuilder& builder,\n                                   unsigned int thenWeight,\n                                   unsigned int elseWeight)\n    : builder(builder),\n      condition(condition),\n      control(control),\n      thenWeight(thenWeight),\n      elseWeight(elseWeight),\n      function(builder.getBuildPoint()->getParent()) {\n  // Make the blocks, but only put the then-block into the function, the\n  // else-block and merge-block will be added later, in order, after earlier\n  // code is emitted.\n  thenBlock = new spv::Block(builder.getUniqueId(), function);\n  elseBlock = nullptr;\n  mergeBlock = new spv::Block(builder.getUniqueId(), function);\n\n  // Save the current block, so that we can add in the flow control split when\n  // makeEndIf is called.\n  headerBlock = builder.getBuildPoint();\n\n  spv::Id headerBlockId = headerBlock->getId();\n  thenPhiParent = headerBlockId;\n  elsePhiParent = headerBlockId;\n\n  function.addBlock(thenBlock);\n  builder.setBuildPoint(thenBlock);\n}\n\nvoid SpirvBuilder::IfBuilder::makeBeginElse(bool branchToMerge) {\n#ifndef NDEBUG\n  assert_true(currentBranch == Branch::kThen);\n#endif\n\n  if (branchToMerge) {\n    // Close out the \"then\" by having it jump to the mergeBlock.\n    thenPhiParent = builder.getBuildPoint()->getId();\n    builder.createBranch(mergeBlock);\n  }\n\n  // Make the first else block and add it to the function.\n  elseBlock = new spv::Block(builder.getUniqueId(), function);\n  function.addBlock(elseBlock);\n\n  // Start building the else block.\n  builder.setBuildPoint(elseBlock);\n\n#ifndef NDEBUG\n  currentBranch = Branch::kElse;\n#endif\n}\n\nvoid SpirvBuilder::IfBuilder::makeEndIf(bool branchToMerge) {\n#ifndef NDEBUG\n  assert_true(currentBranch == Branch::kThen || currentBranch == Branch::kElse);\n#endif\n\n  if (branchToMerge) {\n    // Jump to the merge block.\n    (elseBlock ? elsePhiParent : thenPhiParent) =\n        builder.getBuildPoint()->getId();\n    builder.createBranch(mergeBlock);\n  }\n\n  // Go back to the headerBlock and make the flow control split.\n  builder.setBuildPoint(headerBlock);\n  builder.createSelectionMerge(mergeBlock, control);\n  {\n    spv::Block* falseBlock = elseBlock ? elseBlock : mergeBlock;\n    std::unique_ptr<spv::Instruction> branch =\n        std::make_unique<spv::Instruction>(spv::OpBranchConditional);\n    branch->addIdOperand(condition);\n    branch->addIdOperand(thenBlock->getId());\n    branch->addIdOperand(falseBlock->getId());\n    if (thenWeight || elseWeight) {\n      branch->addImmediateOperand(thenWeight);\n      branch->addImmediateOperand(elseWeight);\n    }\n    builder.getBuildPoint()->addInstruction(std::move(branch));\n    thenBlock->addPredecessor(builder.getBuildPoint());\n    falseBlock->addPredecessor(builder.getBuildPoint());\n  }\n\n  // Add the merge block to the function.\n  function.addBlock(mergeBlock);\n  builder.setBuildPoint(mergeBlock);\n\n#ifndef NDEBUG\n  currentBranch = Branch::kMerge;\n#endif\n}\n\nspv::Id SpirvBuilder::IfBuilder::createMergePhi(spv::Id then_variable,\n                                                spv::Id else_variable) const {\n  assert_true(builder.getBuildPoint() == mergeBlock);\n  return builder.createQuadOp(spv::OpPhi, builder.getTypeId(then_variable),\n                              then_variable, getThenPhiParent(), else_variable,\n                              getElsePhiParent());\n}\n\nSpirvBuilder::SwitchBuilder::SwitchBuilder(spv::Id selector,\n                                           unsigned int selection_control,\n                                           SpirvBuilder& builder)\n    : builder_(builder),\n      selector_(selector),\n      selection_control_(selection_control),\n      function_(builder.getBuildPoint()->getParent()),\n      header_block_(builder.getBuildPoint()),\n      default_phi_parent_(builder.getBuildPoint()->getId()) {\n  merge_block_ = new spv::Block(builder_.getUniqueId(), function_);\n}\n\nvoid SpirvBuilder::SwitchBuilder::makeBeginDefault() {\n  assert_null(default_block_);\n\n  endSegment();\n\n  default_block_ = new spv::Block(builder_.getUniqueId(), function_);\n  function_.addBlock(default_block_);\n  default_block_->addPredecessor(header_block_);\n  builder_.setBuildPoint(default_block_);\n\n  current_branch_ = Branch::kDefault;\n}\n\nvoid SpirvBuilder::SwitchBuilder::makeBeginCase(unsigned int literal) {\n  endSegment();\n\n  auto case_block = new spv::Block(builder_.getUniqueId(), function_);\n  function_.addBlock(case_block);\n  cases_.emplace_back(literal, case_block->getId());\n  case_block->addPredecessor(header_block_);\n  builder_.setBuildPoint(case_block);\n\n  current_branch_ = Branch::kCase;\n}\n\nvoid SpirvBuilder::SwitchBuilder::addCurrentCaseLiteral(unsigned int literal) {\n  assert_true(current_branch_ == Branch::kCase);\n\n  cases_.emplace_back(literal, cases_.back().second);\n}\n\nvoid SpirvBuilder::SwitchBuilder::makeEndSwitch() {\n  endSegment();\n\n  builder_.setBuildPoint(header_block_);\n\n  builder_.createSelectionMerge(merge_block_, selection_control_);\n\n  std::unique_ptr<spv::Instruction> switch_instruction =\n      std::make_unique<spv::Instruction>(spv::OpSwitch);\n  switch_instruction->addIdOperand(selector_);\n  if (default_block_) {\n    switch_instruction->addIdOperand(default_block_->getId());\n  } else {\n    switch_instruction->addIdOperand(merge_block_->getId());\n    merge_block_->addPredecessor(header_block_);\n  }\n  for (const std::pair<unsigned int, spv::Id>& case_pair : cases_) {\n    switch_instruction->addImmediateOperand(case_pair.first);\n    switch_instruction->addIdOperand(case_pair.second);\n  }\n  builder_.getBuildPoint()->addInstruction(std::move(switch_instruction));\n\n  function_.addBlock(merge_block_);\n  builder_.setBuildPoint(merge_block_);\n\n  current_branch_ = Branch::kMerge;\n}\n\nvoid SpirvBuilder::SwitchBuilder::endSegment() {\n  assert_true(current_branch_ == Branch::kSelection ||\n              current_branch_ == Branch::kDefault ||\n              current_branch_ == Branch::kCase);\n\n  if (current_branch_ == Branch::kSelection) {\n    return;\n  }\n\n  if (!builder_.getBuildPoint()->isTerminated()) {\n    builder_.createBranch(merge_block_);\n    if (current_branch_ == Branch::kDefault) {\n      default_phi_parent_ = builder_.getBuildPoint()->getId();\n    }\n  }\n\n  current_branch_ = Branch::kSelection;\n}\n\n}  // namespace gpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/spirv_builder.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2023 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_SPIRV_BUILDER_H_\n#define XENIA_GPU_SPIRV_BUILDER_H_\n\n#include <memory>\n#include <optional>\n#include <utility>\n#include <vector>\n\n#include \"third_party/glslang/SPIRV/SpvBuilder.h\"\n#include \"xenia/base/assert.h\"\n\nnamespace xe {\nnamespace gpu {\n\n// SpvBuilder with extra helpers.\n\nclass SpirvBuilder : public spv::Builder {\n public:\n  SpirvBuilder(unsigned int spv_version, unsigned int user_number,\n               spv::SpvBuildLogger* logger)\n      : spv::Builder(spv_version, user_number, logger) {}\n\n  // Make public rather than protected.\n  using spv::Builder::createSelectionMerge;\n\n  spv::Id createQuadOp(spv::Op op_code, spv::Id type_id, spv::Id operand1,\n                       spv::Id operand2, spv::Id operand3, spv::Id operand4);\n\n  spv::Id createNoContractionUnaryOp(spv::Op op_code, spv::Id type_id,\n                                     spv::Id operand);\n  spv::Id createNoContractionBinOp(spv::Op op_code, spv::Id type_id,\n                                   spv::Id operand1, spv::Id operand2);\n\n  spv::Id createUnaryBuiltinCall(spv::Id result_type, spv::Id builtins,\n                                 int entry_point, spv::Id operand);\n  spv::Id createBinBuiltinCall(spv::Id result_type, spv::Id builtins,\n                               int entry_point, spv::Id operand1,\n                               spv::Id operand2);\n  spv::Id createTriBuiltinCall(spv::Id result_type, spv::Id builtins,\n                               int entry_point, spv::Id operand1,\n                               spv::Id operand2, spv::Id operand3);\n\n  // Helper to use for building nested control flow with if-then-else with\n  // additions over SpvBuilder::If.\n  class IfBuilder {\n   public:\n    IfBuilder(spv::Id condition, unsigned int control, SpirvBuilder& builder,\n              unsigned int thenWeight = 0, unsigned int elseWeight = 0);\n\n    ~IfBuilder() {\n#ifndef NDEBUG\n      assert_true(currentBranch == Branch::kMerge);\n#endif\n    }\n\n    void makeBeginElse(bool branchToMerge = true);\n    void makeEndIf(bool branchToMerge = true);\n\n    // If there's no then/else block that branches to the merge block, the phi\n    // parent is the header block - this simplifies then-only usage.\n    spv::Id getThenPhiParent() const { return thenPhiParent; }\n    spv::Id getElsePhiParent() const { return elsePhiParent; }\n\n    spv::Id createMergePhi(spv::Id then_variable, spv::Id else_variable) const;\n\n   private:\n    enum class Branch {\n      kThen,\n      kElse,\n      kMerge,\n    };\n\n    IfBuilder(const IfBuilder& ifBuilder) = delete;\n    IfBuilder& operator=(const IfBuilder& ifBuilder) = delete;\n\n    SpirvBuilder& builder;\n    spv::Id condition;\n    unsigned int control;\n    unsigned int thenWeight;\n    unsigned int elseWeight;\n\n    spv::Function& function;\n\n    spv::Block* headerBlock;\n    spv::Block* thenBlock;\n    spv::Block* elseBlock;\n    spv::Block* mergeBlock;\n\n    spv::Id thenPhiParent;\n    spv::Id elsePhiParent;\n\n#ifndef NDEBUG\n    Branch currentBranch = Branch::kThen;\n#endif\n  };\n\n  // Simpler and more flexible (such as multiple cases pointing to the same\n  // block) compared to makeSwitch.\n  class SwitchBuilder {\n   public:\n    SwitchBuilder(spv::Id selector, unsigned int selection_control,\n                  SpirvBuilder& builder);\n    ~SwitchBuilder() { assert_true(current_branch_ == Branch::kMerge); }\n\n    void makeBeginDefault();\n    void makeBeginCase(unsigned int literal);\n    void addCurrentCaseLiteral(unsigned int literal);\n    void makeEndSwitch();\n\n    // If there's no default block that branches to the merge block, the phi\n    // parent is the header block - this simplifies case-only usage.\n    spv::Id getDefaultPhiParent() const { return default_phi_parent_; }\n\n   private:\n    enum class Branch {\n      kSelection,\n      kDefault,\n      kCase,\n      kMerge,\n    };\n\n    void endSegment();\n\n    SpirvBuilder& builder_;\n    spv::Id selector_;\n    unsigned int selection_control_;\n\n    spv::Function& function_;\n\n    spv::Block* header_block_;\n    spv::Block* merge_block_;\n    spv::Block* default_block_ = nullptr;\n\n    std::vector<std::pair<unsigned int, spv::Id>> cases_;\n\n    spv::Id default_phi_parent_;\n\n    Branch current_branch_ = Branch::kSelection;\n  };\n};\n\n}  // namespace gpu\n}  // namespace xe\n\n#endif  // XENIA_GPU_SPIRV_BUILDER_H_\n"
  },
  {
    "path": "src/xenia/gpu/spirv_shader.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/spirv_shader.h\"\n\n#include <cstring>\n\nnamespace xe {\nnamespace gpu {\n\nSpirvShader::SpirvShader(xenos::ShaderType shader_type,\n                         uint64_t ucode_data_hash, const uint32_t* ucode_dwords,\n                         size_t ucode_dword_count,\n                         std::endian ucode_source_endian)\n    : Shader(shader_type, ucode_data_hash, ucode_dwords, ucode_dword_count,\n             ucode_source_endian) {}\n\nShader::Translation* SpirvShader::CreateTranslationInstance(\n    uint64_t modification) {\n  return new SpirvTranslation(*this, modification);\n}\n\n}  // namespace gpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/spirv_shader.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_SPIRV_SHADER_H_\n#define XENIA_GPU_SPIRV_SHADER_H_\n\n#include <atomic>\n#include <vector>\n\n#include \"xenia/gpu/shader.h\"\n#include \"xenia/gpu/spirv_shader_translator.h\"\n#include \"xenia/gpu/xenos.h\"\n\nnamespace xe {\nnamespace gpu {\n\nclass SpirvShader : public Shader {\n public:\n  class SpirvTranslation : public Translation {\n   public:\n    explicit SpirvTranslation(SpirvShader& shader, uint64_t modification)\n        : Translation(shader, modification) {}\n  };\n\n  explicit SpirvShader(xenos::ShaderType shader_type, uint64_t ucode_data_hash,\n                       const uint32_t* ucode_dwords, size_t ucode_dword_count,\n                       std::endian ucode_source_endian = std::endian::big);\n\n  // Resource bindings are gathered after the successful translation of any\n  // modification for simplicity of translation (and they don't depend on\n  // modification bits).\n\n  struct TextureBinding {\n    uint32_t fetch_constant : 5;\n    // Stacked and 3D are separate TextureBindings.\n    xenos::FetchOpDimension dimension : 2;\n    uint32_t is_signed : 1;\n  };\n  // Safe to hash and compare with memcmp for layout hashing.\n  const std::vector<TextureBinding>& GetTextureBindingsAfterTranslation()\n      const {\n    return texture_bindings_;\n  }\n  const uint32_t GetUsedTextureMaskAfterTranslation() const {\n    return used_texture_mask_;\n  }\n\n  struct SamplerBinding {\n    uint32_t fetch_constant : 5;\n    xenos::TextureFilter mag_filter : 2;\n    xenos::TextureFilter min_filter : 2;\n    xenos::TextureFilter mip_filter : 2;\n    xenos::AnisoFilter aniso_filter : 3;\n  };\n  const std::vector<SamplerBinding>& GetSamplerBindingsAfterTranslation()\n      const {\n    return sampler_bindings_;\n  }\n\n protected:\n  Translation* CreateTranslationInstance(uint64_t modification) override;\n\n private:\n  friend class SpirvShaderTranslator;\n\n  std::atomic_flag bindings_setup_entered_ = ATOMIC_FLAG_INIT;\n  std::vector<TextureBinding> texture_bindings_;\n  std::vector<SamplerBinding> sampler_bindings_;\n  uint32_t used_texture_mask_ = 0;\n};\n\n}  // namespace gpu\n}  // namespace xe\n\n#endif  // XENIA_GPU_SPIRV_SHADER_H_\n"
  },
  {
    "path": "src/xenia/gpu/spirv_shader_translator.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/spirv_shader_translator.h\"\n\n#include <algorithm>\n#include <cstddef>\n#include <cstdint>\n#include <memory>\n#include <string>\n#include <utility>\n#include <vector>\n\n#include \"third_party/fmt/include/fmt/format.h\"\n#include \"third_party/glslang/SPIRV/GLSL.std.450.h\"\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/string_buffer.h\"\n#include \"xenia/gpu/spirv_shader.h\"\n\nnamespace xe {\nnamespace gpu {\n\nSpirvShaderTranslator::Features::Features(bool all)\n    : spirv_version(all ? spv::Spv_1_5 : spv::Spv_1_0),\n      max_storage_buffer_range(all ? UINT32_MAX : (128 * 1024 * 1024)),\n      full_draw_index_uint32(all),\n      vertex_pipeline_stores_and_atomics(all),\n      fragment_stores_and_atomics(all),\n      clip_distance(all),\n      cull_distance(all),\n      image_view_format_swizzle(all),\n      signed_zero_inf_nan_preserve_float32(all),\n      denorm_flush_to_zero_float32(all),\n      rounding_mode_rte_float32(all),\n      fragment_shader_sample_interlock(all),\n      demote_to_helper_invocation(all) {}\n\nSpirvShaderTranslator::Features::Features(\n    const ui::vulkan::VulkanDevice* const vulkan_device)\n    : max_storage_buffer_range(\n          vulkan_device->properties().maxStorageBufferRange),\n      full_draw_index_uint32(vulkan_device->properties().fullDrawIndexUint32),\n      vertex_pipeline_stores_and_atomics(\n          vulkan_device->properties().vertexPipelineStoresAndAtomics),\n      fragment_stores_and_atomics(\n          vulkan_device->properties().fragmentStoresAndAtomics),\n      clip_distance(vulkan_device->properties().shaderClipDistance),\n      cull_distance(vulkan_device->properties().shaderCullDistance),\n      image_view_format_swizzle(\n          vulkan_device->properties().imageViewFormatSwizzle),\n      signed_zero_inf_nan_preserve_float32(\n          vulkan_device->properties().shaderSignedZeroInfNanPreserveFloat32),\n      denorm_flush_to_zero_float32(\n          vulkan_device->properties().shaderDenormFlushToZeroFloat32),\n      rounding_mode_rte_float32(\n          vulkan_device->properties().shaderRoundingModeRTEFloat32),\n      fragment_shader_sample_interlock(\n          vulkan_device->properties().fragmentShaderSampleInterlock),\n      demote_to_helper_invocation(\n          vulkan_device->properties().shaderDemoteToHelperInvocation) {\n  const uint32_t vulkan_api_version = vulkan_device->properties().apiVersion;\n  if (vulkan_api_version >= VK_MAKE_API_VERSION(0, 1, 2, 0)) {\n    spirv_version = spv::Spv_1_5;\n  } else if (vulkan_device->extensions().ext_1_2_KHR_spirv_1_4) {\n    spirv_version = spv::Spv_1_4;\n  } else if (vulkan_api_version >= VK_MAKE_API_VERSION(0, 1, 1, 0)) {\n    spirv_version = spv::Spv_1_3;\n  } else {\n    spirv_version = spv::Spv_1_0;\n  }\n}\n\nuint64_t SpirvShaderTranslator::GetDefaultVertexShaderModification(\n    uint32_t dynamic_addressable_register_count,\n    Shader::HostVertexShaderType host_vertex_shader_type) const {\n  Modification shader_modification;\n  shader_modification.vertex.dynamic_addressable_register_count =\n      dynamic_addressable_register_count;\n  shader_modification.vertex.host_vertex_shader_type = host_vertex_shader_type;\n  return shader_modification.value;\n}\n\nuint64_t SpirvShaderTranslator::GetDefaultPixelShaderModification(\n    uint32_t dynamic_addressable_register_count) const {\n  Modification shader_modification;\n  shader_modification.pixel.dynamic_addressable_register_count =\n      dynamic_addressable_register_count;\n  return shader_modification.value;\n}\n\nstd::vector<uint8_t> SpirvShaderTranslator::CreateDepthOnlyFragmentShader() {\n  is_depth_only_fragment_shader_ = true;\n  // TODO(Triang3l): Handle in a nicer way (is_depth_only_fragment_shader_ is a\n  // leftover from when a Shader object wasn't used during translation).\n  Shader shader(xenos::ShaderType::kPixel, 0, nullptr, 0);\n  StringBuffer instruction_disassembly_buffer;\n  shader.AnalyzeUcode(instruction_disassembly_buffer);\n  Shader::Translation& translation = *shader.GetOrCreateTranslation(0);\n  TranslateAnalyzedShader(translation);\n  is_depth_only_fragment_shader_ = false;\n  return translation.translated_binary();\n}\n\nvoid SpirvShaderTranslator::Reset() {\n  ShaderTranslator::Reset();\n\n  builder_.reset();\n\n  uniform_float_constants_ = spv::NoResult;\n\n  input_point_coordinates_ = spv::NoResult;\n  input_fragment_coordinates_ = spv::NoResult;\n  input_front_facing_ = spv::NoResult;\n  input_sample_mask_ = spv::NoResult;\n  std::fill(input_output_interpolators_.begin(),\n            input_output_interpolators_.end(), spv::NoResult);\n  output_point_coordinates_ = spv::NoResult;\n  output_point_size_ = spv::NoResult;\n\n  sampler_bindings_.clear();\n  texture_bindings_.clear();\n\n  main_interface_.clear();\n  var_main_registers_ = spv::NoResult;\n  var_main_memexport_address_ = spv::NoResult;\n  for (size_t memexport_eM_index = 0;\n       memexport_eM_index < xe::countof(var_main_memexport_data_);\n       ++memexport_eM_index) {\n    var_main_memexport_data_[memexport_eM_index] = spv::NoResult;\n  }\n  var_main_memexport_data_written_ = spv::NoResult;\n  main_memexport_allowed_ = spv::NoResult;\n  var_main_point_size_edge_flag_kill_vertex_ = spv::NoResult;\n  var_main_kill_pixel_ = spv::NoResult;\n  var_main_fsi_color_written_ = spv::NoResult;\n\n  main_switch_op_.reset();\n  main_switch_next_pc_phi_operands_.clear();\n\n  cf_exec_conditional_merge_ = nullptr;\n  cf_instruction_predicate_merge_ = nullptr;\n}\n\nuint32_t SpirvShaderTranslator::GetModificationRegisterCount() const {\n  Modification modification = GetSpirvShaderModification();\n  return is_vertex_shader()\n             ? modification.vertex.dynamic_addressable_register_count\n             : modification.pixel.dynamic_addressable_register_count;\n}\n\nvoid SpirvShaderTranslator::StartTranslation() {\n  // TODO(Triang3l): Logger.\n  builder_ = std::make_unique<SpirvBuilder>(\n      features_.spirv_version, (kSpirvMagicToolId << 16) | 1, nullptr);\n\n  builder_->addCapability(IsSpirvTessEvalShader() ? spv::CapabilityTessellation\n                                                  : spv::CapabilityShader);\n  if (features_.spirv_version < spv::Spv_1_4) {\n    if (features_.signed_zero_inf_nan_preserve_float32 ||\n        features_.denorm_flush_to_zero_float32 ||\n        features_.rounding_mode_rte_float32) {\n      builder_->addExtension(\"SPV_KHR_float_controls\");\n    }\n  }\n  ext_inst_glsl_std_450_ = builder_->import(\"GLSL.std.450\");\n  builder_->setMemoryModel(spv::AddressingModelLogical,\n                           spv::MemoryModelGLSL450);\n  builder_->setSource(spv::SourceLanguageUnknown, 0);\n\n  type_void_ = builder_->makeVoidType();\n  type_bool_ = builder_->makeBoolType();\n  type_bool2_ = builder_->makeVectorType(type_bool_, 2);\n  type_bool3_ = builder_->makeVectorType(type_bool_, 3);\n  type_bool4_ = builder_->makeVectorType(type_bool_, 4);\n  type_int_ = builder_->makeIntType(32);\n  type_int2_ = builder_->makeVectorType(type_int_, 2);\n  type_int3_ = builder_->makeVectorType(type_int_, 3);\n  type_int4_ = builder_->makeVectorType(type_int_, 4);\n  type_uint_ = builder_->makeUintType(32);\n  type_uint2_ = builder_->makeVectorType(type_uint_, 2);\n  type_uint3_ = builder_->makeVectorType(type_uint_, 3);\n  type_uint4_ = builder_->makeVectorType(type_uint_, 4);\n  type_float_ = builder_->makeFloatType(32);\n  type_float2_ = builder_->makeVectorType(type_float_, 2);\n  type_float3_ = builder_->makeVectorType(type_float_, 3);\n  type_float4_ = builder_->makeVectorType(type_float_, 4);\n\n  const_int_0_ = builder_->makeIntConstant(0);\n  id_vector_temp_.clear();\n  for (uint32_t i = 0; i < 4; ++i) {\n    id_vector_temp_.push_back(const_int_0_);\n  }\n  const_int4_0_ = builder_->makeCompositeConstant(type_int4_, id_vector_temp_);\n  const_uint_0_ = builder_->makeUintConstant(0);\n  id_vector_temp_.clear();\n  for (uint32_t i = 0; i < 4; ++i) {\n    id_vector_temp_.push_back(const_uint_0_);\n  }\n  const_uint4_0_ =\n      builder_->makeCompositeConstant(type_uint4_, id_vector_temp_);\n  const_float_0_ = builder_->makeFloatConstant(0.0f);\n  id_vector_temp_.clear();\n  id_vector_temp_.push_back(const_float_0_);\n  for (uint32_t i = 1; i < 4; ++i) {\n    id_vector_temp_.push_back(const_float_0_);\n    const_float_vectors_0_[i] = builder_->makeCompositeConstant(\n        type_float_vectors_[i], id_vector_temp_);\n  }\n  const_float_1_ = builder_->makeFloatConstant(1.0f);\n  id_vector_temp_.clear();\n  id_vector_temp_.push_back(const_float_1_);\n  for (uint32_t i = 1; i < 4; ++i) {\n    id_vector_temp_.push_back(const_float_1_);\n    const_float_vectors_1_[i] = builder_->makeCompositeConstant(\n        type_float_vectors_[i], id_vector_temp_);\n  }\n  id_vector_temp_.clear();\n  id_vector_temp_.push_back(const_float_0_);\n  id_vector_temp_.push_back(const_float_1_);\n  const_float2_0_1_ =\n      builder_->makeCompositeConstant(type_float2_, id_vector_temp_);\n\n  // Common uniform buffer - system constants.\n  struct SystemConstant {\n    const char* name;\n    size_t offset;\n    spv::Id type;\n  };\n  spv::Id type_float4_array_4 = builder_->makeArrayType(\n      type_float4_, builder_->makeUintConstant(4), sizeof(float) * 4);\n  builder_->addDecoration(type_float4_array_4, spv::DecorationArrayStride,\n                          sizeof(float) * 4);\n  spv::Id type_uint4_array_2 = builder_->makeArrayType(\n      type_uint4_, builder_->makeUintConstant(2), sizeof(uint32_t) * 4);\n  builder_->addDecoration(type_uint4_array_2, spv::DecorationArrayStride,\n                          sizeof(uint32_t) * 4);\n  spv::Id type_uint4_array_4 = builder_->makeArrayType(\n      type_uint4_, builder_->makeUintConstant(4), sizeof(uint32_t) * 4);\n  builder_->addDecoration(type_uint4_array_4, spv::DecorationArrayStride,\n                          sizeof(uint32_t) * 4);\n  const SystemConstant system_constants[] = {\n      {\"flags\", offsetof(SystemConstants, flags), type_uint_},\n      {\"vertex_index_load_address\",\n       offsetof(SystemConstants, vertex_index_load_address), type_uint_},\n      {\"vertex_index_endian\", offsetof(SystemConstants, vertex_index_endian),\n       type_uint_},\n      {\"vertex_base_index\", offsetof(SystemConstants, vertex_base_index),\n       type_int_},\n      {\"ndc_scale\", offsetof(SystemConstants, ndc_scale), type_float3_},\n      {\"point_vertex_diameter_min\",\n       offsetof(SystemConstants, point_vertex_diameter_min), type_float_},\n      {\"ndc_offset\", offsetof(SystemConstants, ndc_offset), type_float3_},\n      {\"point_vertex_diameter_max\",\n       offsetof(SystemConstants, point_vertex_diameter_max), type_float_},\n      {\"point_constant_diameter\",\n       offsetof(SystemConstants, point_constant_diameter), type_float2_},\n      {\"point_screen_diameter_to_ndc_radius\",\n       offsetof(SystemConstants, point_screen_diameter_to_ndc_radius),\n       type_float2_},\n      {\"texture_swizzled_signs\",\n       offsetof(SystemConstants, texture_swizzled_signs), type_uint4_array_2},\n      {\"texture_swizzles\", offsetof(SystemConstants, texture_swizzles),\n       type_uint4_array_4},\n      {\"alpha_test_reference\", offsetof(SystemConstants, alpha_test_reference),\n       type_float_},\n      {\"edram_32bpp_tile_pitch_dwords_scaled\",\n       offsetof(SystemConstants, edram_32bpp_tile_pitch_dwords_scaled),\n       type_uint_},\n      {\"edram_depth_base_dwords_scaled\",\n       offsetof(SystemConstants, edram_depth_base_dwords_scaled), type_uint_},\n      {\"color_exp_bias\", offsetof(SystemConstants, color_exp_bias),\n       type_float4_},\n      {\"edram_poly_offset_front_scale\",\n       offsetof(SystemConstants, edram_poly_offset_front_scale), type_float_},\n      {\"edram_poly_offset_back_scale\",\n       offsetof(SystemConstants, edram_poly_offset_back_scale), type_float_},\n      {\"edram_poly_offset_front_offset\",\n       offsetof(SystemConstants, edram_poly_offset_front_offset), type_float_},\n      {\"edram_poly_offset_back_offset\",\n       offsetof(SystemConstants, edram_poly_offset_back_offset), type_float_},\n      {\"edram_stencil_front\", offsetof(SystemConstants, edram_stencil_front),\n       type_uint2_},\n      {\"edram_stencil_back\", offsetof(SystemConstants, edram_stencil_back),\n       type_uint2_},\n      {\"edram_rt_base_dwords_scaled\",\n       offsetof(SystemConstants, edram_rt_base_dwords_scaled), type_uint4_},\n      {\"edram_rt_format_flags\",\n       offsetof(SystemConstants, edram_rt_format_flags), type_uint4_},\n      {\"edram_rt_blend_factors_ops\",\n       offsetof(SystemConstants, edram_rt_blend_factors_ops), type_uint4_},\n      {\"edram_rt_keep_mask\", offsetof(SystemConstants, edram_rt_keep_mask),\n       type_uint4_array_2},\n      {\"edram_rt_clamp\", offsetof(SystemConstants, edram_rt_clamp),\n       type_float4_array_4},\n      {\"edram_blend_constant\", offsetof(SystemConstants, edram_blend_constant),\n       type_float4_},\n  };\n  id_vector_temp_.clear();\n  id_vector_temp_.reserve(xe::countof(system_constants));\n  for (size_t i = 0; i < xe::countof(system_constants); ++i) {\n    id_vector_temp_.push_back(system_constants[i].type);\n  }\n  spv::Id type_system_constants =\n      builder_->makeStructType(id_vector_temp_, \"XeSystemConstants\");\n  for (size_t i = 0; i < xe::countof(system_constants); ++i) {\n    const SystemConstant& system_constant = system_constants[i];\n    builder_->addMemberName(type_system_constants, static_cast<unsigned int>(i),\n                            system_constant.name);\n    builder_->addMemberDecoration(\n        type_system_constants, static_cast<unsigned int>(i),\n        spv::DecorationOffset, int(system_constant.offset));\n  }\n  builder_->addDecoration(type_system_constants, spv::DecorationBlock);\n  uniform_system_constants_ = builder_->createVariable(\n      spv::NoPrecision, spv::StorageClassUniform, type_system_constants,\n      \"xe_uniform_system_constants\");\n  builder_->addDecoration(uniform_system_constants_,\n                          spv::DecorationDescriptorSet,\n                          int(kDescriptorSetConstants));\n  builder_->addDecoration(uniform_system_constants_, spv::DecorationBinding,\n                          int(kConstantBufferSystem));\n  if (features_.spirv_version >= spv::Spv_1_4) {\n    main_interface_.push_back(uniform_system_constants_);\n  }\n\n  bool memexport_used = IsMemoryExportUsed();\n\n  if (!is_depth_only_fragment_shader_) {\n    // Common uniform buffer - float constants.\n    uint32_t float_constant_count =\n        current_shader().constant_register_map().float_count;\n    if (float_constant_count) {\n      id_vector_temp_.clear();\n      id_vector_temp_.push_back(builder_->makeArrayType(\n          type_float4_, builder_->makeUintConstant(float_constant_count),\n          sizeof(float) * 4));\n      // Currently (as of October 24, 2020) makeArrayType only uses the stride\n      // to check if deduplication can be done - the array stride decoration\n      // needs to be applied explicitly.\n      builder_->addDecoration(id_vector_temp_.back(),\n                              spv::DecorationArrayStride, sizeof(float) * 4);\n      spv::Id type_float_constants =\n          builder_->makeStructType(id_vector_temp_, \"XeFloatConstants\");\n      builder_->addMemberName(type_float_constants, 0, \"float_constants\");\n      builder_->addMemberDecoration(type_float_constants, 0,\n                                    spv::DecorationOffset, 0);\n      builder_->addDecoration(type_float_constants, spv::DecorationBlock);\n      uniform_float_constants_ = builder_->createVariable(\n          spv::NoPrecision, spv::StorageClassUniform, type_float_constants,\n          \"xe_uniform_float_constants\");\n      builder_->addDecoration(uniform_float_constants_,\n                              spv::DecorationDescriptorSet,\n                              int(kDescriptorSetConstants));\n      builder_->addDecoration(\n          uniform_float_constants_, spv::DecorationBinding,\n          int(is_pixel_shader() ? kConstantBufferFloatPixel\n                                : kConstantBufferFloatVertex));\n      if (features_.spirv_version >= spv::Spv_1_4) {\n        main_interface_.push_back(uniform_float_constants_);\n      }\n    }\n\n    // Common uniform buffer - bool and loop constants.\n    // Uniform buffers must have std140 packing, so using arrays of 4-component\n    // vectors instead of scalar arrays because the latter would have padding to\n    // 16 bytes in each element.\n    id_vector_temp_.clear();\n    // 256 bool constants.\n    id_vector_temp_.push_back(builder_->makeArrayType(\n        type_uint4_, builder_->makeUintConstant(2), sizeof(uint32_t) * 4));\n    builder_->addDecoration(id_vector_temp_.back(), spv::DecorationArrayStride,\n                            sizeof(uint32_t) * 4);\n    // 32 loop constants.\n    id_vector_temp_.push_back(builder_->makeArrayType(\n        type_uint4_, builder_->makeUintConstant(8), sizeof(uint32_t) * 4));\n    builder_->addDecoration(id_vector_temp_.back(), spv::DecorationArrayStride,\n                            sizeof(uint32_t) * 4);\n    spv::Id type_bool_loop_constants =\n        builder_->makeStructType(id_vector_temp_, \"XeBoolLoopConstants\");\n    builder_->addMemberName(type_bool_loop_constants, 0, \"bool_constants\");\n    builder_->addMemberDecoration(type_bool_loop_constants, 0,\n                                  spv::DecorationOffset, 0);\n    builder_->addMemberName(type_bool_loop_constants, 1, \"loop_constants\");\n    builder_->addMemberDecoration(type_bool_loop_constants, 1,\n                                  spv::DecorationOffset, sizeof(uint32_t) * 8);\n    builder_->addDecoration(type_bool_loop_constants, spv::DecorationBlock);\n    uniform_bool_loop_constants_ = builder_->createVariable(\n        spv::NoPrecision, spv::StorageClassUniform, type_bool_loop_constants,\n        \"xe_uniform_bool_loop_constants\");\n    builder_->addDecoration(uniform_bool_loop_constants_,\n                            spv::DecorationDescriptorSet,\n                            int(kDescriptorSetConstants));\n    builder_->addDecoration(uniform_bool_loop_constants_,\n                            spv::DecorationBinding,\n                            int(kConstantBufferBoolLoop));\n    if (features_.spirv_version >= spv::Spv_1_4) {\n      main_interface_.push_back(uniform_bool_loop_constants_);\n    }\n\n    // Common uniform buffer - fetch constants (32 x 6 uints packed in std140 as\n    // 4-component vectors).\n    id_vector_temp_.clear();\n    id_vector_temp_.push_back(builder_->makeArrayType(\n        type_uint4_, builder_->makeUintConstant(32 * 6 / 4),\n        sizeof(uint32_t) * 4));\n    builder_->addDecoration(id_vector_temp_.back(), spv::DecorationArrayStride,\n                            sizeof(uint32_t) * 4);\n    spv::Id type_fetch_constants =\n        builder_->makeStructType(id_vector_temp_, \"XeFetchConstants\");\n    builder_->addMemberName(type_fetch_constants, 0, \"fetch_constants\");\n    builder_->addMemberDecoration(type_fetch_constants, 0,\n                                  spv::DecorationOffset, 0);\n    builder_->addDecoration(type_fetch_constants, spv::DecorationBlock);\n    uniform_fetch_constants_ = builder_->createVariable(\n        spv::NoPrecision, spv::StorageClassUniform, type_fetch_constants,\n        \"xe_uniform_fetch_constants\");\n    builder_->addDecoration(uniform_fetch_constants_,\n                            spv::DecorationDescriptorSet,\n                            int(kDescriptorSetConstants));\n    builder_->addDecoration(uniform_fetch_constants_, spv::DecorationBinding,\n                            int(kConstantBufferFetch));\n    if (features_.spirv_version >= spv::Spv_1_4) {\n      main_interface_.push_back(uniform_fetch_constants_);\n    }\n\n    // Common storage buffers - shared memory uint[], each 128 MB or larger,\n    // depending on what's possible on the device.\n    id_vector_temp_.clear();\n    id_vector_temp_.push_back(builder_->makeRuntimeArray(type_uint_));\n    // Storage buffers have std430 packing, no padding to 4-component vectors.\n    builder_->addDecoration(id_vector_temp_.back(), spv::DecorationArrayStride,\n                            sizeof(uint32_t));\n    spv::Id type_shared_memory =\n        builder_->makeStructType(id_vector_temp_, \"XeSharedMemory\");\n    builder_->addMemberName(type_shared_memory, 0, \"shared_memory\");\n    builder_->addMemberDecoration(type_shared_memory, 0,\n                                  spv::DecorationRestrict);\n    if (!memexport_used) {\n      builder_->addMemberDecoration(type_shared_memory, 0,\n                                    spv::DecorationNonWritable);\n    }\n    builder_->addMemberDecoration(type_shared_memory, 0, spv::DecorationOffset,\n                                  0);\n    builder_->addDecoration(type_shared_memory,\n                            features_.spirv_version >= spv::Spv_1_3\n                                ? spv::DecorationBlock\n                                : spv::DecorationBufferBlock);\n    unsigned int shared_memory_binding_count =\n        1 << GetSharedMemoryStorageBufferCountLog2();\n    if (shared_memory_binding_count > 1) {\n      type_shared_memory = builder_->makeArrayType(\n          type_shared_memory,\n          builder_->makeUintConstant(shared_memory_binding_count), 0);\n    }\n    buffers_shared_memory_ = builder_->createVariable(\n        spv::NoPrecision,\n        features_.spirv_version >= spv::Spv_1_3 ? spv::StorageClassStorageBuffer\n                                                : spv::StorageClassUniform,\n        type_shared_memory, \"xe_shared_memory\");\n    builder_->addDecoration(buffers_shared_memory_,\n                            spv::DecorationDescriptorSet,\n                            int(kDescriptorSetSharedMemoryAndEdram));\n    builder_->addDecoration(buffers_shared_memory_, spv::DecorationBinding, 0);\n    if (features_.spirv_version >= spv::Spv_1_4) {\n      main_interface_.push_back(buffers_shared_memory_);\n    }\n  }\n\n  if (is_vertex_shader()) {\n    StartVertexOrTessEvalShaderBeforeMain();\n  } else if (is_pixel_shader()) {\n    StartFragmentShaderBeforeMain();\n  }\n\n  // Begin the main function.\n  std::vector<spv::Id> main_param_types;\n  std::vector<std::vector<spv::Decoration>> main_precisions;\n  spv::Block* function_main_entry;\n  function_main_ = builder_->makeFunctionEntry(\n      spv::NoPrecision, type_void_, \"main\", main_param_types, main_precisions,\n      &function_main_entry);\n\n  // Load the flags system constant since it may be used in many places.\n  id_vector_temp_.clear();\n  id_vector_temp_.push_back(builder_->makeIntConstant(kSystemConstantFlags));\n  main_system_constant_flags_ = builder_->createLoad(\n      builder_->createAccessChain(spv::StorageClassUniform,\n                                  uniform_system_constants_, id_vector_temp_),\n      spv::NoPrecision);\n\n  if (!is_depth_only_fragment_shader_) {\n    // Begin ucode translation. Initialize everything, even without defined\n    // defaults, for safety.\n    var_main_predicate_ = builder_->createVariable(\n        spv::NoPrecision, spv::StorageClassFunction, type_bool_,\n        \"xe_var_predicate\", builder_->makeBoolConstant(false));\n    var_main_loop_count_ = builder_->createVariable(\n        spv::NoPrecision, spv::StorageClassFunction, type_uint4_,\n        \"xe_var_loop_count\", const_uint4_0_);\n    var_main_address_register_ = builder_->createVariable(\n        spv::NoPrecision, spv::StorageClassFunction, type_int_,\n        \"xe_var_address_register\", const_int_0_);\n    var_main_loop_address_ = builder_->createVariable(\n        spv::NoPrecision, spv::StorageClassFunction, type_int4_,\n        \"xe_var_loop_address\", const_int4_0_);\n    var_main_previous_scalar_ = builder_->createVariable(\n        spv::NoPrecision, spv::StorageClassFunction, type_float_,\n        \"xe_var_previous_scalar\", const_float_0_);\n    var_main_vfetch_address_ = builder_->createVariable(\n        spv::NoPrecision, spv::StorageClassFunction, type_int_,\n        \"xe_var_vfetch_address\", const_int_0_);\n    var_main_tfetch_lod_ = builder_->createVariable(\n        spv::NoPrecision, spv::StorageClassFunction, type_float_,\n        \"xe_var_tfetch_lod\", const_float_0_);\n    var_main_tfetch_gradients_h_ = builder_->createVariable(\n        spv::NoPrecision, spv::StorageClassFunction, type_float3_,\n        \"xe_var_tfetch_gradients_h\", const_float3_0_);\n    var_main_tfetch_gradients_v_ = builder_->createVariable(\n        spv::NoPrecision, spv::StorageClassFunction, type_float3_,\n        \"xe_var_tfetch_gradients_v\", const_float3_0_);\n    if (register_count()) {\n      spv::Id type_register_array = builder_->makeArrayType(\n          type_float4_, builder_->makeUintConstant(register_count()), 0);\n      var_main_registers_ =\n          builder_->createVariable(spv::NoPrecision, spv::StorageClassFunction,\n                                   type_register_array, \"xe_var_registers\");\n    }\n    if (memexport_used) {\n      var_main_memexport_address_ = builder_->createVariable(\n          spv::NoPrecision, spv::StorageClassFunction, type_float4_,\n          \"xe_var_memexport_address\", const_float4_0_);\n      uint8_t memexport_eM_remaining = current_shader().memexport_eM_written();\n      uint32_t memexport_eM_index;\n      while (\n          xe::bit_scan_forward(memexport_eM_remaining, &memexport_eM_index)) {\n        memexport_eM_remaining &= ~(uint8_t(1) << memexport_eM_index);\n        var_main_memexport_data_[memexport_eM_index] = builder_->createVariable(\n            spv::NoPrecision, spv::StorageClassFunction, type_float4_,\n            fmt::format(\"xe_var_memexport_data_{}\", memexport_eM_index).c_str(),\n            const_float4_0_);\n      }\n      var_main_memexport_data_written_ = builder_->createVariable(\n          spv::NoPrecision, spv::StorageClassFunction, type_uint_,\n          \"xe_var_memexport_data_written\", const_uint_0_);\n    }\n  }\n\n  // Write the execution model-specific prologue with access to variables in the\n  // main function.\n  if (is_vertex_shader()) {\n    StartVertexOrTessEvalShaderInMain();\n  } else if (is_pixel_shader()) {\n    StartFragmentShaderInMain();\n  }\n\n  if (is_depth_only_fragment_shader_) {\n    return;\n  }\n\n  // Open the main loop.\n  spv::Block& main_loop_pre_header = *builder_->getBuildPoint();\n  main_loop_header_ = &builder_->makeNewBlock();\n  spv::Block& main_loop_body = builder_->makeNewBlock();\n  // Added later because the body has nested control flow, but according to the\n  // specification:\n  // \"The order of blocks in a function must satisfy the rule that blocks appear\n  //  before all blocks they dominate.\"\n  main_loop_continue_ =\n      new spv::Block(builder_->getUniqueId(), *function_main_);\n  main_loop_merge_ = new spv::Block(builder_->getUniqueId(), *function_main_);\n  builder_->createBranch(main_loop_header_);\n\n  // If no jumps, don't create a switch, but still create a loop so exece can\n  // break.\n  bool has_main_switch = !current_shader().label_addresses().empty();\n\n  // Main loop header - based on whether it's the first iteration (entered from\n  // the function or from the continuation), choose the program counter.\n  builder_->setBuildPoint(main_loop_header_);\n  spv::Id main_loop_pc_current = spv::NoResult;\n  if (has_main_switch) {\n    // OpPhi must be the first in the block.\n    id_vector_temp_.clear();\n    id_vector_temp_.push_back(const_int_0_);\n    id_vector_temp_.push_back(main_loop_pre_header.getId());\n    main_loop_pc_next_ = builder_->getUniqueId();\n    id_vector_temp_.push_back(main_loop_pc_next_);\n    id_vector_temp_.push_back(main_loop_continue_->getId());\n    main_loop_pc_current =\n        builder_->createOp(spv::OpPhi, type_int_, id_vector_temp_);\n  }\n  uint_vector_temp_.clear();\n  builder_->createLoopMerge(main_loop_merge_, main_loop_continue_,\n                            spv::LoopControlDontUnrollMask, uint_vector_temp_);\n  builder_->createBranch(&main_loop_body);\n\n  // Main loop body.\n  builder_->setBuildPoint(&main_loop_body);\n  if (has_main_switch) {\n    // Create the program counter switch with cases for every label and for\n    // label 0.\n    main_switch_header_ = builder_->getBuildPoint();\n    main_switch_merge_ =\n        new spv::Block(builder_->getUniqueId(), *function_main_);\n    builder_->createSelectionMerge(main_switch_merge_,\n                                   spv::SelectionControlDontFlattenMask);\n    main_switch_op_ = std::make_unique<spv::Instruction>(spv::OpSwitch);\n    main_switch_op_->addIdOperand(main_loop_pc_current);\n    main_switch_op_->addIdOperand(main_switch_merge_->getId());\n    // The default case (the merge here) must have the header as a predecessor.\n    main_switch_merge_->addPredecessor(main_switch_header_);\n    // The instruction will be inserted later, when all cases are filled.\n    // Insert and enter case 0.\n    spv::Block* main_switch_case_0_block =\n        new spv::Block(builder_->getUniqueId(), *function_main_);\n    main_switch_op_->addImmediateOperand(0);\n    main_switch_op_->addIdOperand(main_switch_case_0_block->getId());\n    // Every switch case must have the OpSelectionMerge/OpSwitch block as a\n    // predecessor.\n    main_switch_case_0_block->addPredecessor(main_switch_header_);\n    function_main_->addBlock(main_switch_case_0_block);\n    builder_->setBuildPoint(main_switch_case_0_block);\n  }\n}\n\nstd::vector<uint8_t> SpirvShaderTranslator::CompleteTranslation() {\n  if (!is_depth_only_fragment_shader_) {\n    // Close flow control within the last switch case.\n    CloseExecConditionals();\n    bool has_main_switch = !current_shader().label_addresses().empty();\n    // After the final exec (if it happened to be not exece, which would already\n    // have a break branch), break from the switch if it exists, or from the\n    // loop it doesn't.\n    if (!builder_->getBuildPoint()->isTerminated()) {\n      builder_->createBranch(has_main_switch ? main_switch_merge_\n                                             : main_loop_merge_);\n    }\n    if (has_main_switch) {\n      // Insert the switch instruction with all cases added as operands.\n      builder_->setBuildPoint(main_switch_header_);\n      builder_->getBuildPoint()->addInstruction(std::move(main_switch_op_));\n      // Build the main switch merge, breaking out of the loop after falling\n      // through the end or breaking from exece (only continuing if a jump -\n      // from a guest loop or from jmp/call - was made).\n      function_main_->addBlock(main_switch_merge_);\n      builder_->setBuildPoint(main_switch_merge_);\n      builder_->createBranch(main_loop_merge_);\n    }\n\n    // Main loop continuation - choose the program counter based on the path\n    // taken (-1 if not from a jump as a safe fallback, which would result in\n    // not hitting any switch case and reaching the final break in the body).\n    function_main_->addBlock(main_loop_continue_);\n    builder_->setBuildPoint(main_loop_continue_);\n    if (has_main_switch) {\n      // OpPhi, if added, must be the first in the block.\n      // If labels were added, but not jumps (for example, due to the call\n      // instruction not being implemented as of October 18, 2020), send an\n      // impossible program counter value (-1) to the OpPhi at the next\n      // iteration.\n      if (main_switch_next_pc_phi_operands_.empty()) {\n        main_switch_next_pc_phi_operands_.push_back(\n            builder_->makeIntConstant(-1));\n      }\n      std::unique_ptr<spv::Instruction> main_loop_pc_next_op =\n          std::make_unique<spv::Instruction>(\n              main_loop_pc_next_, type_int_,\n              main_switch_next_pc_phi_operands_.size() >= 2\n                  ? spv::OpPhi\n                  : spv::OpCopyObject);\n      for (spv::Id operand : main_switch_next_pc_phi_operands_) {\n        main_loop_pc_next_op->addIdOperand(operand);\n      }\n      builder_->getBuildPoint()->addInstruction(\n          std::move(main_loop_pc_next_op));\n    }\n    builder_->createBranch(main_loop_header_);\n\n    // Add the main loop merge block and go back to the function.\n    function_main_->addBlock(main_loop_merge_);\n    builder_->setBuildPoint(main_loop_merge_);\n  }\n\n  // Write data for the last memexport.\n  ExportToMemory(\n      current_shader().memexport_eM_potentially_written_before_end());\n\n  if (is_vertex_shader()) {\n    CompleteVertexOrTessEvalShaderInMain();\n  } else if (is_pixel_shader()) {\n    CompleteFragmentShaderInMain();\n  }\n\n  // End the main function.\n  builder_->leaveFunction();\n\n  // Make the main function the entry point.\n  spv::ExecutionModel execution_model;\n  if (is_pixel_shader()) {\n    execution_model = spv::ExecutionModelFragment;\n    builder_->addExecutionMode(function_main_,\n                               spv::ExecutionModeOriginUpperLeft);\n    if (IsExecutionModeEarlyFragmentTests()) {\n      builder_->addExecutionMode(function_main_,\n                                 spv::ExecutionModeEarlyFragmentTests);\n    }\n    if (edram_fragment_shader_interlock_) {\n      // Accessing per-sample values, so interlocking just when there's common\n      // coverage is enough if the device exposes that.\n      if (features_.fragment_shader_sample_interlock) {\n        builder_->addCapability(\n            spv::CapabilityFragmentShaderSampleInterlockEXT);\n        builder_->addExecutionMode(function_main_,\n                                   spv::ExecutionModeSampleInterlockOrderedEXT);\n      } else {\n        builder_->addCapability(spv::CapabilityFragmentShaderPixelInterlockEXT);\n        builder_->addExecutionMode(function_main_,\n                                   spv::ExecutionModePixelInterlockOrderedEXT);\n      }\n    }\n  } else {\n    assert_true(is_vertex_shader());\n    execution_model = IsSpirvTessEvalShader()\n                          ? spv::ExecutionModelTessellationEvaluation\n                          : spv::ExecutionModelVertex;\n  }\n  if (features_.denorm_flush_to_zero_float32) {\n    // Flush to zero, similar to the real hardware, also for things like Shader\n    // Model 3 multiplication emulation.\n    builder_->addCapability(spv::CapabilityDenormFlushToZero);\n    builder_->addExecutionMode(function_main_,\n                               spv::ExecutionModeDenormFlushToZero, 32);\n  }\n  if (features_.signed_zero_inf_nan_preserve_float32) {\n    // Signed zero used to get VFACE from ps_param_gen, also special behavior\n    // for infinity in certain instructions (such as logarithm, reciprocal,\n    // muls_prev2).\n    builder_->addCapability(spv::CapabilitySignedZeroInfNanPreserve);\n    builder_->addExecutionMode(function_main_,\n                               spv::ExecutionModeSignedZeroInfNanPreserve, 32);\n  }\n  if (features_.rounding_mode_rte_float32) {\n    builder_->addCapability(spv::CapabilityRoundingModeRTE);\n    builder_->addExecutionMode(function_main_,\n                               spv::ExecutionModeRoundingModeRTE, 32);\n  }\n  spv::Instruction* entry_point =\n      builder_->addEntryPoint(execution_model, function_main_, \"main\");\n  for (spv::Id interface_id : main_interface_) {\n    entry_point->addIdOperand(interface_id);\n  }\n\n  if (!is_depth_only_fragment_shader_) {\n    // Specify the binding indices for samplers when the number of textures is\n    // known, as samplers are located after images in the texture descriptor\n    // set.\n    size_t texture_binding_count = texture_bindings_.size();\n    size_t sampler_binding_count = sampler_bindings_.size();\n    for (size_t i = 0; i < sampler_binding_count; ++i) {\n      builder_->addDecoration(sampler_bindings_[i].variable,\n                              spv::DecorationBinding,\n                              int(texture_binding_count + i));\n    }\n  }\n\n  // TODO(Triang3l): Avoid copy?\n  std::vector<unsigned int> module_uints;\n  builder_->dump(module_uints);\n  std::vector<uint8_t> module_bytes;\n  module_bytes.reserve(sizeof(unsigned int) * module_uints.size());\n  module_bytes.insert(module_bytes.cend(),\n                      reinterpret_cast<const uint8_t*>(module_uints.data()),\n                      reinterpret_cast<const uint8_t*>(module_uints.data()) +\n                          sizeof(unsigned int) * module_uints.size());\n  return module_bytes;\n}\n\nvoid SpirvShaderTranslator::PostTranslation() {\n  Shader::Translation& translation = current_translation();\n  if (!translation.is_valid()) {\n    return;\n  }\n  SpirvShader* spirv_shader = dynamic_cast<SpirvShader*>(&translation.shader());\n  if (spirv_shader && !spirv_shader->bindings_setup_entered_.test_and_set(\n                          std::memory_order_relaxed)) {\n    spirv_shader->texture_bindings_.clear();\n    spirv_shader->texture_bindings_.reserve(texture_bindings_.size());\n    for (const TextureBinding& translator_binding : texture_bindings_) {\n      SpirvShader::TextureBinding& shader_binding =\n          spirv_shader->texture_bindings_.emplace_back();\n      // For a stable hash.\n      std::memset(&shader_binding, 0, sizeof(shader_binding));\n      shader_binding.fetch_constant = translator_binding.fetch_constant;\n      shader_binding.dimension = translator_binding.dimension;\n      shader_binding.is_signed = translator_binding.is_signed;\n      spirv_shader->used_texture_mask_ |= UINT32_C(1)\n                                          << translator_binding.fetch_constant;\n    }\n    spirv_shader->sampler_bindings_.clear();\n    spirv_shader->sampler_bindings_.reserve(sampler_bindings_.size());\n    for (const SamplerBinding& translator_binding : sampler_bindings_) {\n      SpirvShader::SamplerBinding& shader_binding =\n          spirv_shader->sampler_bindings_.emplace_back();\n      shader_binding.fetch_constant = translator_binding.fetch_constant;\n      shader_binding.mag_filter = translator_binding.mag_filter;\n      shader_binding.min_filter = translator_binding.min_filter;\n      shader_binding.mip_filter = translator_binding.mip_filter;\n      shader_binding.aniso_filter = translator_binding.aniso_filter;\n    }\n  }\n}\n\nvoid SpirvShaderTranslator::ProcessLabel(uint32_t cf_index) {\n  if (cf_index == 0) {\n    // 0 already added in the beginning.\n    return;\n  }\n\n  assert_false(current_shader().label_addresses().empty());\n\n  // Close flow control within the previous switch case.\n  CloseExecConditionals();\n\n  spv::Function& function = builder_->getBuildPoint()->getParent();\n  // Create the next switch case and fallthrough to it.\n  spv::Block* new_case = new spv::Block(builder_->getUniqueId(), function);\n  main_switch_op_->addImmediateOperand(cf_index);\n  main_switch_op_->addIdOperand(new_case->getId());\n  // Every switch case must have the OpSelectionMerge/OpSwitch block as a\n  // predecessor.\n  new_case->addPredecessor(main_switch_header_);\n  // The previous block may have already been terminated if was exece.\n  if (!builder_->getBuildPoint()->isTerminated()) {\n    builder_->createBranch(new_case);\n  }\n  function.addBlock(new_case);\n  builder_->setBuildPoint(new_case);\n}\n\nvoid SpirvShaderTranslator::ProcessExecInstructionBegin(\n    const ParsedExecInstruction& instr) {\n  UpdateExecConditionals(instr.type, instr.bool_constant_index,\n                         instr.condition);\n}\n\nvoid SpirvShaderTranslator::ProcessExecInstructionEnd(\n    const ParsedExecInstruction& instr) {\n  if (instr.is_end) {\n    // Break out of the main switch (if exists) and the main loop.\n    CloseInstructionPredication();\n    if (!builder_->getBuildPoint()->isTerminated()) {\n      builder_->createBranch(current_shader().label_addresses().empty()\n                                 ? main_loop_merge_\n                                 : main_switch_merge_);\n    }\n  }\n  UpdateExecConditionals(instr.type, instr.bool_constant_index,\n                         instr.condition);\n}\n\nvoid SpirvShaderTranslator::ProcessLoopStartInstruction(\n    const ParsedLoopStartInstruction& instr) {\n  // loop il<idx>, L<idx> - loop with loop data il<idx>, end @ L<idx>\n\n  // Loop control is outside execs - actually close the last exec.\n  CloseExecConditionals();\n\n  EnsureBuildPointAvailable();\n\n  id_vector_temp_.clear();\n  // Loop constants (member 1).\n  id_vector_temp_.push_back(builder_->makeIntConstant(1));\n  // 4-component vector.\n  id_vector_temp_.push_back(\n      builder_->makeIntConstant(int(instr.loop_constant_index >> 2)));\n  // Scalar within the vector.\n  id_vector_temp_.push_back(\n      builder_->makeIntConstant(int(instr.loop_constant_index & 3)));\n  // Count (unsigned) in bits 0:7 of the loop constant (struct member 1),\n  // initial aL (unsigned) in 8:15.\n  spv::Id loop_constant =\n      builder_->createLoad(builder_->createAccessChain(\n                               spv::StorageClassUniform,\n                               uniform_bool_loop_constants_, id_vector_temp_),\n                           spv::NoPrecision);\n\n  spv::Id const_int_8 = builder_->makeIntConstant(8);\n\n  // Push the count to the loop count stack - move XYZ to YZW and set X to the\n  // new iteration count (swizzling the way glslang does it for similar GLSL).\n  spv::Id loop_count_stack_old =\n      builder_->createLoad(var_main_loop_count_, spv::NoPrecision);\n  spv::Id loop_count_new =\n      builder_->createTriOp(spv::OpBitFieldUExtract, type_uint_, loop_constant,\n                            const_int_0_, const_int_8);\n  id_vector_temp_.clear();\n  id_vector_temp_.push_back(loop_count_new);\n  for (unsigned int i = 0; i < 3; ++i) {\n    id_vector_temp_.push_back(\n        builder_->createCompositeExtract(loop_count_stack_old, type_uint_, i));\n  }\n  builder_->createStore(\n      builder_->createCompositeConstruct(type_uint4_, id_vector_temp_),\n      var_main_loop_count_);\n\n  // Push aL - keep the same value as in the previous loop if repeating, or the\n  // new one otherwise.\n  spv::Id address_relative_stack_old =\n      builder_->createLoad(var_main_loop_address_, spv::NoPrecision);\n  id_vector_temp_.clear();\n  if (instr.is_repeat) {\n    id_vector_temp_.emplace_back();\n  } else {\n    id_vector_temp_.push_back(builder_->createUnaryOp(\n        spv::OpBitcast, type_int_,\n        builder_->createTriOp(spv::OpBitFieldUExtract, type_uint_,\n                              loop_constant, const_int_8, const_int_8)));\n  }\n  for (unsigned int i = 0; i < 3; ++i) {\n    id_vector_temp_.push_back(builder_->createCompositeExtract(\n        address_relative_stack_old, type_int_, i));\n  }\n  if (instr.is_repeat) {\n    id_vector_temp_[0] = id_vector_temp_[1];\n  }\n  builder_->createStore(\n      builder_->createCompositeConstruct(type_int4_, id_vector_temp_),\n      var_main_loop_address_);\n\n  // Break (jump to the skip label) if the loop counter is 0 (since the\n  // condition is checked in the end).\n  spv::Block& head_block = *builder_->getBuildPoint();\n  spv::Id loop_count_zero = builder_->createBinOp(\n      spv::OpIEqual, type_bool_, loop_count_new, const_uint_0_);\n  spv::Block& skip_block = builder_->makeNewBlock();\n  spv::Block& body_block = builder_->makeNewBlock();\n  builder_->createSelectionMerge(&body_block, spv::SelectionControlMaskNone);\n  {\n    std::unique_ptr<spv::Instruction> branch_conditional_op =\n        std::make_unique<spv::Instruction>(spv::OpBranchConditional);\n    branch_conditional_op->addIdOperand(loop_count_zero);\n    branch_conditional_op->addIdOperand(skip_block.getId());\n    branch_conditional_op->addIdOperand(body_block.getId());\n    // More likely to enter than to skip.\n    branch_conditional_op->addImmediateOperand(1);\n    branch_conditional_op->addImmediateOperand(2);\n    head_block.addInstruction(std::move(branch_conditional_op));\n  }\n  skip_block.addPredecessor(&head_block);\n  body_block.addPredecessor(&head_block);\n  builder_->setBuildPoint(&skip_block);\n  main_switch_next_pc_phi_operands_.push_back(\n      builder_->makeIntConstant(int(instr.loop_skip_address)));\n  main_switch_next_pc_phi_operands_.push_back(\n      builder_->getBuildPoint()->getId());\n  builder_->createBranch(main_loop_continue_);\n  builder_->setBuildPoint(&body_block);\n}\n\nvoid SpirvShaderTranslator::ProcessLoopEndInstruction(\n    const ParsedLoopEndInstruction& instr) {\n  // endloop il<idx>, L<idx> - end loop w/ data il<idx>, head @ L<idx>\n\n  // Loop control is outside execs - actually close the last exec.\n  CloseExecConditionals();\n\n  EnsureBuildPointAvailable();\n\n  // Subtract 1 from the loop counter (will store later).\n  spv::Id loop_count_stack_old =\n      builder_->createLoad(var_main_loop_count_, spv::NoPrecision);\n  spv::Id loop_count = builder_->createBinOp(\n      spv::OpISub, type_uint_,\n      builder_->createCompositeExtract(loop_count_stack_old, type_uint_, 0),\n      builder_->makeUintConstant(1));\n  spv::Id address_relative_stack_old =\n      builder_->createLoad(var_main_loop_address_, spv::NoPrecision);\n\n  // Predicated break works like break if (loop_count == 0 || [!]p0).\n  // Three options, due to logical operations usage (so OpLogicalNot is not\n  // required):\n  // - Continue if (loop_count != 0).\n  // - Continue if (loop_count != 0 && p0), if breaking if !p0.\n  // - Break if (loop_count == 0 || p0), if breaking if p0.\n  bool break_is_true = instr.is_predicated_break && instr.predicate_condition;\n  spv::Id condition =\n      builder_->createBinOp(break_is_true ? spv::OpIEqual : spv::OpINotEqual,\n                            type_bool_, loop_count, const_uint_0_);\n  if (instr.is_predicated_break) {\n    condition = builder_->createBinOp(\n        instr.predicate_condition ? spv::OpLogicalOr : spv::OpLogicalAnd,\n        type_bool_, condition,\n        builder_->createLoad(var_main_predicate_, spv::NoPrecision));\n  }\n\n  spv::Block& body_block = *builder_->getBuildPoint();\n  spv::Block& continue_block = builder_->makeNewBlock();\n  spv::Block& break_block = builder_->makeNewBlock();\n  builder_->createSelectionMerge(&break_block, spv::SelectionControlMaskNone);\n  {\n    std::unique_ptr<spv::Instruction> branch_conditional_op =\n        std::make_unique<spv::Instruction>(spv::OpBranchConditional);\n    branch_conditional_op->addIdOperand(condition);\n    // More likely to continue than to break.\n    if (break_is_true) {\n      branch_conditional_op->addIdOperand(break_block.getId());\n      branch_conditional_op->addIdOperand(continue_block.getId());\n      branch_conditional_op->addImmediateOperand(1);\n      branch_conditional_op->addImmediateOperand(2);\n    } else {\n      branch_conditional_op->addIdOperand(continue_block.getId());\n      branch_conditional_op->addIdOperand(break_block.getId());\n      branch_conditional_op->addImmediateOperand(2);\n      branch_conditional_op->addImmediateOperand(1);\n    }\n    body_block.addInstruction(std::move(branch_conditional_op));\n  }\n  continue_block.addPredecessor(&body_block);\n  break_block.addPredecessor(&body_block);\n\n  // Continue case.\n  builder_->setBuildPoint(&continue_block);\n  // Store the loop count with 1 subtracted.\n  builder_->createStore(builder_->createCompositeInsert(\n                            loop_count, loop_count_stack_old, type_uint4_, 0),\n                        var_main_loop_count_);\n  // Extract the value to add to aL (signed, in bits 16:23 of the loop\n  // constant).\n  id_vector_temp_.clear();\n  // Loop constants (member 1).\n  id_vector_temp_.push_back(builder_->makeIntConstant(1));\n  // 4-component vector.\n  id_vector_temp_.push_back(\n      builder_->makeIntConstant(int(instr.loop_constant_index >> 2)));\n  // Scalar within the vector.\n  id_vector_temp_.push_back(\n      builder_->makeIntConstant(int(instr.loop_constant_index & 3)));\n  spv::Id loop_constant =\n      builder_->createLoad(builder_->createAccessChain(\n                               spv::StorageClassUniform,\n                               uniform_bool_loop_constants_, id_vector_temp_),\n                           spv::NoPrecision);\n  spv::Id address_relative_old = builder_->createCompositeExtract(\n      address_relative_stack_old, type_int_, 0);\n  builder_->createStore(\n      builder_->createCompositeInsert(\n          builder_->createBinOp(\n              spv::OpIAdd, type_int_, address_relative_old,\n              builder_->createTriOp(\n                  spv::OpBitFieldSExtract, type_int_,\n                  builder_->createUnaryOp(spv::OpBitcast, type_int_,\n                                          loop_constant),\n                  builder_->makeIntConstant(16), builder_->makeIntConstant(8))),\n          address_relative_stack_old, type_int4_, 0),\n      var_main_loop_address_);\n  // Jump back to the beginning of the loop body.\n  main_switch_next_pc_phi_operands_.push_back(\n      builder_->makeIntConstant(int(instr.loop_body_address)));\n  main_switch_next_pc_phi_operands_.push_back(\n      builder_->getBuildPoint()->getId());\n  builder_->createBranch(main_loop_continue_);\n\n  // Break case.\n  builder_->setBuildPoint(&break_block);\n  // Pop the current loop off the loop counter and the relative address stacks -\n  // move YZW to XYZ and set W to 0.\n  id_vector_temp_.clear();\n  for (unsigned int i = 1; i < 4; ++i) {\n    id_vector_temp_.push_back(\n        builder_->createCompositeExtract(loop_count_stack_old, type_uint_, i));\n  }\n  id_vector_temp_.push_back(const_uint_0_);\n  builder_->createStore(\n      builder_->createCompositeConstruct(type_uint4_, id_vector_temp_),\n      var_main_loop_count_);\n  id_vector_temp_.clear();\n  for (unsigned int i = 1; i < 4; ++i) {\n    id_vector_temp_.push_back(builder_->createCompositeExtract(\n        address_relative_stack_old, type_int_, i));\n  }\n  id_vector_temp_.push_back(const_int_0_);\n  builder_->createStore(\n      builder_->createCompositeConstruct(type_int4_, id_vector_temp_),\n      var_main_loop_address_);\n  // Now going to fall through to the next control flow instruction.\n}\n\nvoid SpirvShaderTranslator::ProcessJumpInstruction(\n    const ParsedJumpInstruction& instr) {\n  // Treat like exec, merge with execs if possible, since it's an if too.\n  ParsedExecInstruction::Type type;\n  if (instr.type == ParsedJumpInstruction::Type::kConditional) {\n    type = ParsedExecInstruction::Type::kConditional;\n  } else if (instr.type == ParsedJumpInstruction::Type::kPredicated) {\n    type = ParsedExecInstruction::Type::kPredicated;\n  } else {\n    type = ParsedExecInstruction::Type::kUnconditional;\n  }\n  UpdateExecConditionals(type, instr.bool_constant_index, instr.condition);\n\n  // UpdateExecConditionals may not necessarily close the instruction-level\n  // predicate check (it's not necessary if the execs are merged), but here the\n  // instruction itself is on the control flow level, so the predicate check is\n  // on the control flow level too.\n  CloseInstructionPredication();\n\n  if (builder_->getBuildPoint()->isTerminated()) {\n    // Unreachable for some reason.\n    return;\n  }\n  main_switch_next_pc_phi_operands_.push_back(\n      builder_->makeIntConstant(int(instr.target_address)));\n  main_switch_next_pc_phi_operands_.push_back(\n      builder_->getBuildPoint()->getId());\n  builder_->createBranch(main_loop_continue_);\n}\n\nvoid SpirvShaderTranslator::ProcessAllocInstruction(\n    const ParsedAllocInstruction& instr, uint8_t export_eM) {\n  bool start_memexport = instr.type == ucode::AllocType::kMemory &&\n                         current_shader().memexport_eM_written();\n  if (export_eM || start_memexport) {\n    CloseExecConditionals();\n  }\n\n  if (export_eM) {\n    ExportToMemory(export_eM);\n    // Reset which eM# elements have been written.\n    builder_->createStore(const_uint_0_, var_main_memexport_data_written_);\n    // Break dependencies from the previous memexport.\n    uint8_t export_eM_remaining = export_eM;\n    uint32_t eM_index;\n    while (xe::bit_scan_forward(export_eM_remaining, &eM_index)) {\n      export_eM_remaining &= ~(uint8_t(1) << eM_index);\n      builder_->createStore(const_float4_0_,\n                            var_main_memexport_data_[eM_index]);\n    }\n  }\n\n  if (start_memexport) {\n    // Initialize eA to an invalid address.\n    builder_->createStore(const_float4_0_, var_main_memexport_address_);\n  }\n}\n\nspv::Id SpirvShaderTranslator::SpirvSmearScalarResultOrConstant(\n    spv::Id scalar, spv::Id vector_type) {\n  bool is_constant = builder_->isConstant(scalar);\n  bool is_spec_constant = builder_->isSpecConstant(scalar);\n  if (!is_constant && !is_spec_constant) {\n    return builder_->smearScalar(spv::NoPrecision, scalar, vector_type);\n  }\n  assert_true(builder_->getTypeClass(builder_->getTypeId(scalar)) ==\n              builder_->getTypeClass(builder_->getScalarTypeId(vector_type)));\n  if (!builder_->isVectorType(vector_type)) {\n    assert_true(builder_->isScalarType(vector_type));\n    return scalar;\n  }\n  int num_components = builder_->getNumTypeComponents(vector_type);\n  id_vector_temp_util_.clear();\n  for (int i = 0; i < num_components; ++i) {\n    id_vector_temp_util_.push_back(scalar);\n  }\n  return builder_->makeCompositeConstant(vector_type, id_vector_temp_util_,\n                                         is_spec_constant);\n}\n\nuint32_t SpirvShaderTranslator::GetPsParamGenInterpolator() const {\n  assert_true(is_pixel_shader());\n  Modification modification = GetSpirvShaderModification();\n  // param_gen_interpolator is already 4 bits, no need for an interpolator count\n  // safety check.\n  return (modification.pixel.param_gen_enable &&\n          modification.pixel.param_gen_interpolator < register_count())\n             ? modification.pixel.param_gen_interpolator\n             : UINT32_MAX;\n}\n\nvoid SpirvShaderTranslator::EnsureBuildPointAvailable() {\n  if (!builder_->getBuildPoint()->isTerminated()) {\n    return;\n  }\n  spv::Block& new_block = builder_->makeNewBlock();\n  new_block.setUnreachable();\n  builder_->setBuildPoint(&new_block);\n}\n\nvoid SpirvShaderTranslator::StartVertexOrTessEvalShaderBeforeMain() {\n  // Create the inputs.\n  if (IsSpirvTessEvalShader()) {\n    input_primitive_id_ = builder_->createVariable(\n        spv::NoPrecision, spv::StorageClassInput, type_int_, \"gl_PrimitiveID\");\n    builder_->addDecoration(input_primitive_id_, spv::DecorationBuiltIn,\n                            spv::BuiltInPrimitiveId);\n    main_interface_.push_back(input_primitive_id_);\n  } else {\n    input_vertex_index_ = builder_->createVariable(\n        spv::NoPrecision, spv::StorageClassInput, type_int_, \"gl_VertexIndex\");\n    builder_->addDecoration(input_vertex_index_, spv::DecorationBuiltIn,\n                            spv::BuiltInVertexIndex);\n    main_interface_.push_back(input_vertex_index_);\n  }\n\n  uint32_t output_location = 0;\n\n  // Create the interpolator outputs.\n  {\n    uint32_t interpolators_remaining = GetModificationInterpolatorMask();\n    uint32_t interpolator_index;\n    while (xe::bit_scan_forward(interpolators_remaining, &interpolator_index)) {\n      interpolators_remaining &= ~(UINT32_C(1) << interpolator_index);\n      spv::Id interpolator = builder_->createVariable(\n          spv::NoPrecision, spv::StorageClassOutput, type_float4_,\n          fmt::format(\"xe_out_interpolator_{}\", interpolator_index).c_str());\n      input_output_interpolators_[interpolator_index] = interpolator;\n      builder_->addDecoration(interpolator, spv::DecorationLocation,\n                              int(output_location));\n      builder_->addDecoration(interpolator, spv::DecorationInvariant);\n      main_interface_.push_back(interpolator);\n      ++output_location;\n    }\n  }\n\n  Modification shader_modification = GetSpirvShaderModification();\n\n  if (shader_modification.vertex.output_point_parameters) {\n    if (shader_modification.vertex.host_vertex_shader_type ==\n        Shader::HostVertexShaderType::kPointListAsTriangleStrip) {\n      // Create the point coordinates output.\n      output_point_coordinates_ =\n          builder_->createVariable(spv::NoPrecision, spv::StorageClassOutput,\n                                   type_float2_, \"xe_out_point_coordinates\");\n      builder_->addDecoration(output_point_coordinates_,\n                              spv::DecorationLocation, int(output_location));\n      builder_->addDecoration(output_point_coordinates_,\n                              spv::DecorationInvariant);\n      main_interface_.push_back(output_point_coordinates_);\n      ++output_location;\n    } else {\n      // Create the point size output. Not using gl_PointSize from gl_PerVertex\n      // not to rely on the shaderTessellationAndGeometryPointSize feature, and\n      // also because the value written to gl_PointSize must be greater than\n      // zero.\n      output_point_size_ =\n          builder_->createVariable(spv::NoPrecision, spv::StorageClassOutput,\n                                   type_float_, \"xe_out_point_size\");\n      builder_->addDecoration(output_point_size_, spv::DecorationLocation,\n                              int(output_location));\n      builder_->addDecoration(output_point_size_, spv::DecorationInvariant);\n      main_interface_.push_back(output_point_size_);\n      ++output_location;\n    }\n  }\n\n  // Create the gl_PerVertex output for used system outputs.\n  std::vector<spv::Id> struct_per_vertex_members;\n  struct_per_vertex_members.reserve(kOutputPerVertexMemberCount);\n  struct_per_vertex_members.push_back(type_float4_);\n  spv::Id type_struct_per_vertex =\n      builder_->makeStructType(struct_per_vertex_members, \"gl_PerVertex\");\n  builder_->addMemberName(type_struct_per_vertex,\n                          kOutputPerVertexMemberPosition, \"gl_Position\");\n  builder_->addMemberDecoration(type_struct_per_vertex,\n                                kOutputPerVertexMemberPosition,\n                                spv::DecorationBuiltIn, spv::BuiltInPosition);\n  builder_->addDecoration(type_struct_per_vertex, spv::DecorationBlock);\n  output_per_vertex_ = builder_->createVariable(\n      spv::NoPrecision, spv::StorageClassOutput, type_struct_per_vertex, \"\");\n  builder_->addDecoration(output_per_vertex_, spv::DecorationInvariant);\n  main_interface_.push_back(output_per_vertex_);\n}\n\nvoid SpirvShaderTranslator::StartVertexOrTessEvalShaderInMain() {\n  Modification shader_modification = GetSpirvShaderModification();\n\n  // The edge flag isn't used for any purpose by the translator.\n  if (current_shader().writes_point_size_edge_flag_kill_vertex() & 0b101) {\n    id_vector_temp_.clear();\n    // Set the point size to a negative value to tell the point sprite expansion\n    // that it should use the default point size if the vertex shader does not\n    // override it.\n    id_vector_temp_.push_back(builder_->makeFloatConstant(-1.0f));\n    // The edge flag is ignored.\n    id_vector_temp_.push_back(const_float_0_);\n    // Don't kill by default (zero bits 0:30).\n    id_vector_temp_.push_back(const_float_0_);\n    var_main_point_size_edge_flag_kill_vertex_ = builder_->createVariable(\n        spv::NoPrecision, spv::StorageClassFunction, type_float3_,\n        \"xe_var_point_size_edge_flag_kill_vertex\",\n        builder_->makeCompositeConstant(type_float3_, id_vector_temp_));\n  }\n\n  // Zero general-purpose registers to prevent crashes when the game\n  // references them after only initializing them conditionally.\n  for (uint32_t i = 0; i < register_count(); ++i) {\n    id_vector_temp_.clear();\n    id_vector_temp_.push_back(builder_->makeIntConstant(int(i)));\n    builder_->createStore(\n        const_float4_0_,\n        builder_->createAccessChain(spv::StorageClassFunction,\n                                    var_main_registers_, id_vector_temp_));\n  }\n\n  // Zero the interpolators.\n  {\n    uint32_t interpolators_remaining = GetModificationInterpolatorMask();\n    uint32_t interpolator_index;\n    while (xe::bit_scan_forward(interpolators_remaining, &interpolator_index)) {\n      interpolators_remaining &= ~(UINT32_C(1) << interpolator_index);\n      builder_->createStore(const_float4_0_,\n                            input_output_interpolators_[interpolator_index]);\n    }\n  }\n\n  // TODO(Triang3l): For HostVertexShaderType::kRectangeListAsTriangleStrip,\n  // start the vertex loop, and load the index there.\n\n  // Check if memory export should be allowed for this host vertex of the guest\n  // primitive to make sure export is done only once for each guest vertex.\n  if (IsMemoryExportUsed()) {\n    spv::Id memexport_allowed_for_host_vertex_of_guest_primitive =\n        spv::NoResult;\n    if (shader_modification.vertex.host_vertex_shader_type ==\n        Shader::HostVertexShaderType::kPointListAsTriangleStrip) {\n      // Only for one host vertex for the point.\n      memexport_allowed_for_host_vertex_of_guest_primitive =\n          builder_->createBinOp(\n              spv::OpIEqual, type_bool_,\n              builder_->createBinOp(\n                  spv::OpBitwiseAnd, type_uint_,\n                  builder_->createUnaryOp(\n                      spv::OpBitcast, type_uint_,\n                      builder_->createLoad(input_vertex_index_,\n                                           spv::NoPrecision)),\n                  builder_->makeUintConstant(3)),\n              const_uint_0_);\n    }\n\n    if (memexport_allowed_for_host_vertex_of_guest_primitive != spv::NoResult) {\n      main_memexport_allowed_ =\n          main_memexport_allowed_ != spv::NoResult\n              ? builder_->createBinOp(\n                    spv::OpLogicalAnd, type_bool_, main_memexport_allowed_,\n                    memexport_allowed_for_host_vertex_of_guest_primitive)\n              : memexport_allowed_for_host_vertex_of_guest_primitive;\n    }\n  }\n\n  // Load the vertex index or the tessellation parameters.\n  if (register_count()) {\n    // TODO(Triang3l): Barycentric coordinates and patch index.\n    if (IsSpirvVertexShader()) {\n      spv::Id vertex_index = builder_->createUnaryOp(\n          spv::OpBitcast, type_uint_,\n          builder_->createLoad(input_vertex_index_, spv::NoPrecision));\n      if (shader_modification.vertex.host_vertex_shader_type ==\n          Shader::HostVertexShaderType::kPointListAsTriangleStrip) {\n        // Load the point index, autogenerated or indirectly from the index\n        // buffer.\n        // Extract the primitive index from the two-triangle strip vertex index.\n        spv::Id const_uint_2 = builder_->makeUintConstant(2);\n        vertex_index = builder_->createBinOp(\n            spv::OpShiftRightLogical, type_uint_, vertex_index, const_uint_2);\n        // Check if the index needs to be loaded from the index buffer.\n        spv::Id load_vertex_index = builder_->createBinOp(\n            spv::OpINotEqual, type_bool_,\n            builder_->createBinOp(\n                spv::OpBitwiseAnd, type_uint_, main_system_constant_flags_,\n                builder_->makeUintConstant(static_cast<unsigned int>(\n                    kSysFlag_ComputeOrPrimitiveVertexIndexLoad))),\n            const_uint_0_);\n        SpirvBuilder::IfBuilder load_vertex_index_if(\n            load_vertex_index, spv::SelectionControlDontFlattenMask, *builder_);\n        spv::Id loaded_vertex_index;\n        {\n          // Check if the index is 32-bit.\n          spv::Id vertex_index_is_32bit = builder_->createBinOp(\n              spv::OpINotEqual, type_bool_,\n              builder_->createBinOp(\n                  spv::OpBitwiseAnd, type_uint_, main_system_constant_flags_,\n                  builder_->makeUintConstant(static_cast<unsigned int>(\n                      kSysFlag_ComputeOrPrimitiveVertexIndexLoad32Bit))),\n              const_uint_0_);\n          // Calculate the vertex index address in the shared memory.\n          id_vector_temp_.clear();\n          id_vector_temp_.push_back(\n              builder_->makeIntConstant(kSystemConstantVertexIndexLoadAddress));\n          spv::Id vertex_index_address = builder_->createBinOp(\n              spv::OpIAdd, type_uint_,\n              builder_->createLoad(\n                  builder_->createAccessChain(spv::StorageClassUniform,\n                                              uniform_system_constants_,\n                                              id_vector_temp_),\n                  spv::NoPrecision),\n              builder_->createBinOp(\n                  spv::OpShiftLeftLogical, type_uint_, vertex_index,\n                  builder_->createTriOp(spv::OpSelect, type_uint_,\n                                        vertex_index_is_32bit, const_uint_2,\n                                        builder_->makeUintConstant(1))));\n          // Load the 32 bits containing the whole vertex index or two 16-bit\n          // vertex indices.\n          // TODO(Triang3l): Bounds checking.\n          loaded_vertex_index =\n              LoadUint32FromSharedMemory(builder_->createUnaryOp(\n                  spv::OpBitcast, type_int_,\n                  builder_->createBinOp(spv::OpShiftRightLogical, type_uint_,\n                                        vertex_index_address, const_uint_2)));\n          // Extract the 16-bit index from the loaded 32 bits if needed.\n          loaded_vertex_index = builder_->createTriOp(\n              spv::OpSelect, type_uint_, vertex_index_is_32bit,\n              loaded_vertex_index,\n              builder_->createTriOp(\n                  spv::OpBitFieldUExtract, type_uint_, loaded_vertex_index,\n                  builder_->createBinOp(\n                      spv::OpShiftLeftLogical, type_uint_,\n                      builder_->createBinOp(spv::OpBitwiseAnd, type_uint_,\n                                            vertex_index_address, const_uint_2),\n                      builder_->makeUintConstant(4 - 1)),\n                  builder_->makeUintConstant(16)));\n          // Endian-swap the loaded index.\n          id_vector_temp_.clear();\n          id_vector_temp_.push_back(\n              builder_->makeIntConstant(kSystemConstantVertexIndexEndian));\n          loaded_vertex_index = EndianSwap32Uint(\n              loaded_vertex_index,\n              builder_->createLoad(\n                  builder_->createAccessChain(spv::StorageClassUniform,\n                                              uniform_system_constants_,\n                                              id_vector_temp_),\n                  spv::NoPrecision));\n        }\n        load_vertex_index_if.makeEndIf();\n        // Select between the loaded index and the original index from Vulkan.\n        vertex_index = load_vertex_index_if.createMergePhi(loaded_vertex_index,\n                                                           vertex_index);\n      } else {\n        // TODO(Triang3l): Close line loop primitive.\n        // Load the unswapped index as uint for swapping, or for indirect\n        // loading if needed.\n        if (!features_.full_draw_index_uint32) {\n          // Check if the full 32-bit index needs to be loaded indirectly.\n          spv::Id load_vertex_index = builder_->createBinOp(\n              spv::OpINotEqual, type_bool_,\n              builder_->createBinOp(\n                  spv::OpBitwiseAnd, type_uint_, main_system_constant_flags_,\n                  builder_->makeUintConstant(\n                      static_cast<unsigned int>(kSysFlag_VertexIndexLoad))),\n              const_uint_0_);\n          SpirvBuilder::IfBuilder load_vertex_index_if(\n              load_vertex_index, spv::SelectionControlDontFlattenMask,\n              *builder_);\n          spv::Id loaded_vertex_index;\n          {\n            // Load the 32-bit index.\n            // TODO(Triang3l): Bounds checking.\n            id_vector_temp_.clear();\n            id_vector_temp_.push_back(builder_->makeIntConstant(\n                kSystemConstantVertexIndexLoadAddress));\n            loaded_vertex_index =\n                LoadUint32FromSharedMemory(builder_->createUnaryOp(\n                    spv::OpBitcast, type_int_,\n                    builder_->createBinOp(\n                        spv::OpIAdd, type_uint_,\n                        builder_->createBinOp(\n                            spv::OpShiftRightLogical, type_uint_,\n                            builder_->createLoad(\n                                builder_->createAccessChain(\n                                    spv::StorageClassUniform,\n                                    uniform_system_constants_, id_vector_temp_),\n                                spv::NoPrecision),\n                            builder_->makeUintConstant(2)),\n                        vertex_index)));\n          }\n          load_vertex_index_if.makeEndIf();\n          // Select between the loaded index and the original index from Vulkan.\n          vertex_index = load_vertex_index_if.createMergePhi(\n              loaded_vertex_index, vertex_index);\n        }\n        // Endian-swap the index.\n        id_vector_temp_.clear();\n        id_vector_temp_.push_back(\n            builder_->makeIntConstant(kSystemConstantVertexIndexEndian));\n        vertex_index = EndianSwap32Uint(\n            vertex_index, builder_->createLoad(\n                              builder_->createAccessChain(\n                                  spv::StorageClassUniform,\n                                  uniform_system_constants_, id_vector_temp_),\n                              spv::NoPrecision));\n      }\n      // Convert the index to a signed integer.\n      vertex_index =\n          builder_->createUnaryOp(spv::OpBitcast, type_int_, vertex_index);\n      // Add the base to the index.\n      id_vector_temp_.clear();\n      id_vector_temp_.push_back(\n          builder_->makeIntConstant(kSystemConstantVertexBaseIndex));\n      vertex_index = builder_->createBinOp(\n          spv::OpIAdd, type_int_, vertex_index,\n          builder_->createLoad(builder_->createAccessChain(\n                                   spv::StorageClassUniform,\n                                   uniform_system_constants_, id_vector_temp_),\n                               spv::NoPrecision));\n      // Write the index to r0.x as float.\n      id_vector_temp_.clear();\n      id_vector_temp_.push_back(const_int_0_);\n      id_vector_temp_.push_back(const_int_0_);\n      builder_->createStore(\n          builder_->createUnaryOp(spv::OpConvertSToF, type_float_,\n                                  vertex_index),\n          builder_->createAccessChain(spv::StorageClassFunction,\n                                      var_main_registers_, id_vector_temp_));\n    }\n  }\n}\n\nvoid SpirvShaderTranslator::CompleteVertexOrTessEvalShaderInMain() {\n  id_vector_temp_.clear();\n  id_vector_temp_.push_back(\n      builder_->makeIntConstant(kOutputPerVertexMemberPosition));\n  spv::Id position_ptr = builder_->createAccessChain(\n      spv::StorageClassOutput, output_per_vertex_, id_vector_temp_);\n  spv::Id guest_position = builder_->createLoad(position_ptr, spv::NoPrecision);\n\n  // Check if the shader already returns W, not 1/W, and if it doesn't, turn 1/W\n  // into W.\n  spv::Id position_w =\n      builder_->createCompositeExtract(guest_position, type_float_, 3);\n  spv::Id is_w_not_reciprocal = builder_->createBinOp(\n      spv::OpINotEqual, type_bool_,\n      builder_->createBinOp(\n          spv::OpBitwiseAnd, type_uint_, main_system_constant_flags_,\n          builder_->makeUintConstant(\n              static_cast<unsigned int>(kSysFlag_WNotReciprocal))),\n      const_uint_0_);\n  spv::Id guest_position_w_inv = builder_->createNoContractionBinOp(\n      spv::OpFDiv, type_float_, const_float_1_, position_w);\n  position_w =\n      builder_->createTriOp(spv::OpSelect, type_float_, is_w_not_reciprocal,\n                            position_w, guest_position_w_inv);\n\n  spv::Id position_xyz;\n\n  // Open a scope since position_xy and position_z won't be synchronized anymore\n  // after position_xyz is built and modified later.\n  {\n    // Check if the shader returns XY/W rather than XY, and if it does, revert\n    // that.\n    uint_vector_temp_.clear();\n    uint_vector_temp_.push_back(0);\n    uint_vector_temp_.push_back(1);\n    spv::Id position_xy = builder_->createRvalueSwizzle(\n        spv::NoPrecision, type_float2_, guest_position, uint_vector_temp_);\n    spv::Id is_xy_divided_by_w = builder_->createBinOp(\n        spv::OpINotEqual, type_bool_,\n        builder_->createBinOp(\n            spv::OpBitwiseAnd, type_uint_, main_system_constant_flags_,\n            builder_->makeUintConstant(\n                static_cast<unsigned int>(kSysFlag_XYDividedByW))),\n        const_uint_0_);\n    spv::Id guest_position_xy_mul_w = builder_->createNoContractionBinOp(\n        spv::OpVectorTimesScalar, type_float2_, position_xy, position_w);\n    position_xy = builder_->createTriOp(\n        spv::OpSelect, type_float2_,\n        builder_->smearScalar(spv::NoPrecision, is_xy_divided_by_w,\n                              type_bool2_),\n        guest_position_xy_mul_w, position_xy);\n\n    // Check if the shader returns Z/W rather than Z, and if it does, revert\n    // that.\n    spv::Id position_z =\n        builder_->createCompositeExtract(guest_position, type_float_, 2);\n    spv::Id is_z_divided_by_w = builder_->createBinOp(\n        spv::OpINotEqual, type_bool_,\n        builder_->createBinOp(\n            spv::OpBitwiseAnd, type_uint_, main_system_constant_flags_,\n            builder_->makeUintConstant(\n                static_cast<unsigned int>(kSysFlag_ZDividedByW))),\n        const_uint_0_);\n    spv::Id guest_position_z_mul_w = builder_->createNoContractionBinOp(\n        spv::OpFMul, type_float_, position_z, position_w);\n    position_z =\n        builder_->createTriOp(spv::OpSelect, type_float_, is_z_divided_by_w,\n                              guest_position_z_mul_w, position_z);\n\n    // Build XYZ of the position with W format handled.\n    {\n      std::unique_ptr<spv::Instruction> composite_construct_op =\n          std::make_unique<spv::Instruction>(\n              builder_->getUniqueId(), type_float3_, spv::OpCompositeConstruct);\n      composite_construct_op->addIdOperand(position_xy);\n      composite_construct_op->addIdOperand(position_z);\n      position_xyz = composite_construct_op->getResultId();\n      builder_->getBuildPoint()->addInstruction(\n          std::move(composite_construct_op));\n    }\n  }\n\n  // Apply the NDC scale and offset for guest to host viewport transformation.\n  id_vector_temp_.clear();\n  id_vector_temp_.push_back(builder_->makeIntConstant(kSystemConstantNdcScale));\n  spv::Id ndc_scale = builder_->createLoad(\n      builder_->createAccessChain(spv::StorageClassUniform,\n                                  uniform_system_constants_, id_vector_temp_),\n      spv::NoPrecision);\n  position_xyz = builder_->createNoContractionBinOp(spv::OpFMul, type_float3_,\n                                                    position_xyz, ndc_scale);\n  id_vector_temp_.clear();\n  id_vector_temp_.push_back(\n      builder_->makeIntConstant(kSystemConstantNdcOffset));\n  spv::Id ndc_offset = builder_->createLoad(\n      builder_->createAccessChain(spv::StorageClassUniform,\n                                  uniform_system_constants_, id_vector_temp_),\n      spv::NoPrecision);\n  spv::Id ndc_offset_mul_w = builder_->createNoContractionBinOp(\n      spv::OpVectorTimesScalar, type_float3_, ndc_offset, position_w);\n  position_xyz = builder_->createNoContractionBinOp(\n      spv::OpFAdd, type_float3_, position_xyz, ndc_offset_mul_w);\n\n  // Write the point size.\n  if (output_point_size_ != spv::NoResult) {\n    spv::Id point_size;\n    if (current_shader().writes_point_size_edge_flag_kill_vertex() & 0b001) {\n      assert_true(var_main_point_size_edge_flag_kill_vertex_ != spv::NoResult);\n      id_vector_temp_.clear();\n      // X vector component.\n      id_vector_temp_.push_back(const_int_0_);\n      point_size = builder_->createLoad(\n          builder_->createAccessChain(\n              spv::StorageClassFunction,\n              var_main_point_size_edge_flag_kill_vertex_, id_vector_temp_),\n          spv::NoPrecision);\n    } else {\n      // Not statically overridden - write a negative value.\n      point_size = builder_->makeFloatConstant(-1.0f);\n    }\n    builder_->createStore(point_size, output_point_size_);\n  }\n\n  Modification shader_modification = GetSpirvShaderModification();\n\n  // Expand the point sprite.\n  if (shader_modification.vertex.host_vertex_shader_type ==\n      Shader::HostVertexShaderType::kPointListAsTriangleStrip) {\n    // Top-left, bottom-left, top-right, bottom-right order (chosen arbitrarily,\n    // simply based on counterclockwise meaning front with\n    // frontFace = VkFrontFace(0), but faceness is ignored for non-polygon\n    // primitive types).\n    id_vector_temp_.clear();\n    id_vector_temp_.push_back(builder_->makeUintConstant(0b10));\n    id_vector_temp_.push_back(builder_->makeUintConstant(0b01));\n    spv::Id point_vertex_positive = builder_->createBinOp(\n        spv::OpINotEqual, type_bool2_,\n        builder_->createBinOp(\n            spv::OpBitwiseAnd, type_uint2_,\n            builder_->smearScalar(spv::NoPrecision,\n                                  builder_->createUnaryOp(\n                                      spv::OpBitcast, type_uint_,\n                                      builder_->createLoad(input_vertex_index_,\n                                                           spv::NoPrecision)),\n                                  type_uint2_),\n            builder_->createCompositeConstruct(type_uint2_, id_vector_temp_)),\n        SpirvSmearScalarResultOrConstant(const_uint_0_, type_uint2_));\n\n    // Load the point diameter in guest pixels, with the override from the\n    // vertex shader if provided.\n    id_vector_temp_.clear();\n    id_vector_temp_.push_back(\n        builder_->makeIntConstant(kSystemConstantPointConstantDiameter));\n    spv::Id point_guest_diameter = builder_->createLoad(\n        builder_->createAccessChain(spv::StorageClassUniform,\n                                    uniform_system_constants_, id_vector_temp_),\n        spv::NoPrecision);\n    if (current_shader().writes_point_size_edge_flag_kill_vertex() & 0b001) {\n      assert_true(var_main_point_size_edge_flag_kill_vertex_ != spv::NoResult);\n      id_vector_temp_.clear();\n      id_vector_temp_.push_back(const_int_0_);\n      spv::Id point_vertex_diameter = builder_->createLoad(\n          builder_->createAccessChain(\n              spv::StorageClassFunction,\n              var_main_point_size_edge_flag_kill_vertex_, id_vector_temp_),\n          spv::NoPrecision);\n      // The vertex shader's header writes -1.0 to point_size by default, so any\n      // non-negative value means that it was overwritten by the translated\n      // vertex shader, and needs to be used instead of the constant size. The\n      // per-vertex diameter has already been clamped earlier in translation\n      // (combined with making it non-negative).\n      point_guest_diameter = builder_->createTriOp(\n          spv::OpSelect, type_float2_,\n          builder_->smearScalar(\n              spv::NoPrecision,\n              builder_->createBinOp(spv::OpFOrdGreaterThanEqual, type_bool_,\n                                    point_vertex_diameter, const_float_0_),\n              type_bool2_),\n          builder_->smearScalar(spv::NoPrecision, point_vertex_diameter,\n                                type_float2_),\n          point_guest_diameter);\n    }\n    // Transform the diameter in the guest screen coordinates to radius in the\n    // normalized device coordinates.\n    id_vector_temp_.clear();\n    id_vector_temp_.push_back(builder_->makeIntConstant(\n        kSystemConstantPointScreenDiameterToNdcRadius));\n    spv::Id point_radius = builder_->createNoContractionBinOp(\n        spv::OpFMul, type_float2_, point_guest_diameter,\n        builder_->createLoad(builder_->createAccessChain(\n                                 spv::StorageClassUniform,\n                                 uniform_system_constants_, id_vector_temp_),\n                             spv::NoPrecision));\n    // Transform the radius from the normalized device coordinates to the clip\n    // space.\n    point_radius = builder_->createNoContractionBinOp(\n        spv::OpVectorTimesScalar, type_float2_, point_radius, position_w);\n\n    // Expand the point sprite in the direction for the current host vertex.\n    uint_vector_temp_.clear();\n    uint_vector_temp_.push_back(0);\n    uint_vector_temp_.push_back(1);\n    spv::Id point_position_xy = builder_->createNoContractionBinOp(\n        spv::OpFAdd, type_float2_,\n        builder_->createRvalueSwizzle(spv::NoPrecision, type_float2_,\n                                      position_xyz, uint_vector_temp_),\n        builder_->createTriOp(spv::OpSelect, type_float2_,\n                              point_vertex_positive, point_radius,\n                              builder_->createNoContractionUnaryOp(\n                                  spv::OpFNegate, type_float2_, point_radius)));\n    // Store the position.\n    spv::Id position;\n    {\n      // Bypass the `getNumTypeConstituents(typeId) == (int)constituents.size()`\n      // assertion in createCompositeConstruct, OpCompositeConstruct can\n      // construct vectors not only from scalars, but also from other vectors.\n      std::unique_ptr<spv::Instruction> composite_construct_op =\n          std::make_unique<spv::Instruction>(\n              builder_->getUniqueId(), type_float4_, spv::OpCompositeConstruct);\n      composite_construct_op->addIdOperand(point_position_xy);\n      composite_construct_op->addIdOperand(\n          builder_->createCompositeExtract(position_xyz, type_float_, 2));\n      composite_construct_op->addIdOperand(position_w);\n      position = composite_construct_op->getResultId();\n      builder_->getBuildPoint()->addInstruction(\n          std::move(composite_construct_op));\n    }\n    builder_->createStore(position, position_ptr);\n\n    // Write the point coordinates.\n    if (output_point_coordinates_ != spv::NoResult) {\n      builder_->createStore(\n          builder_->createTriOp(spv::OpSelect, type_float2_,\n                                point_vertex_positive, const_float2_1_,\n                                const_float2_0_),\n          output_point_coordinates_);\n    }\n\n    // TODO(Triang3l): For points, handle ps_ucp_mode (take the guest clip space\n    // coordinates instead of the host ones, calculate the distances to the user\n    // clip planes, cull using the distance from the center for modes 0, 1 and\n    // 2, cull and clip per-vertex for modes 2 and 3) in clip and cull\n    // distances.\n  } else {\n    // Store the position converted to the host.\n    spv::Id position;\n    {\n      // Bypass the `getNumTypeConstituents(typeId) == (int)constituents.size()`\n      // assertion in createCompositeConstruct, OpCompositeConstruct can\n      // construct vectors not only from scalars, but also from other vectors.\n      std::unique_ptr<spv::Instruction> composite_construct_op =\n          std::make_unique<spv::Instruction>(\n              builder_->getUniqueId(), type_float4_, spv::OpCompositeConstruct);\n      composite_construct_op->addIdOperand(position_xyz);\n      composite_construct_op->addIdOperand(position_w);\n      position = composite_construct_op->getResultId();\n      builder_->getBuildPoint()->addInstruction(\n          std::move(composite_construct_op));\n    }\n    builder_->createStore(position, position_ptr);\n  }\n}\n\nvoid SpirvShaderTranslator::StartFragmentShaderBeforeMain() {\n  Modification shader_modification = GetSpirvShaderModification();\n\n  if (edram_fragment_shader_interlock_) {\n    builder_->addExtension(\"SPV_EXT_fragment_shader_interlock\");\n\n    // EDRAM buffer uint[].\n    id_vector_temp_.clear();\n    id_vector_temp_.push_back(builder_->makeRuntimeArray(type_uint_));\n    // Storage buffers have std430 packing, no padding to 4-component vectors.\n    builder_->addDecoration(id_vector_temp_.back(), spv::DecorationArrayStride,\n                            sizeof(uint32_t));\n    spv::Id type_edram = builder_->makeStructType(id_vector_temp_, \"XeEdram\");\n    builder_->addMemberName(type_edram, 0, \"edram\");\n    builder_->addMemberDecoration(type_edram, 0, spv::DecorationCoherent);\n    builder_->addMemberDecoration(type_edram, 0, spv::DecorationRestrict);\n    builder_->addMemberDecoration(type_edram, 0, spv::DecorationOffset, 0);\n    builder_->addDecoration(type_edram, features_.spirv_version >= spv::Spv_1_3\n                                            ? spv::DecorationBlock\n                                            : spv::DecorationBufferBlock);\n    buffer_edram_ = builder_->createVariable(\n        spv::NoPrecision,\n        features_.spirv_version >= spv::Spv_1_3 ? spv::StorageClassStorageBuffer\n                                                : spv::StorageClassUniform,\n        type_edram, \"xe_edram\");\n    builder_->addDecoration(buffer_edram_, spv::DecorationDescriptorSet,\n                            int(kDescriptorSetSharedMemoryAndEdram));\n    builder_->addDecoration(buffer_edram_, spv::DecorationBinding, 1);\n    if (features_.spirv_version >= spv::Spv_1_4) {\n      main_interface_.push_back(buffer_edram_);\n    }\n  }\n\n  bool param_gen_needed = !is_depth_only_fragment_shader_ &&\n                          GetPsParamGenInterpolator() != UINT32_MAX;\n\n  if (!is_depth_only_fragment_shader_) {\n    uint32_t input_location = 0;\n\n    // Interpolator inputs.\n    {\n      uint32_t interpolators_remaining = GetModificationInterpolatorMask();\n      uint32_t interpolator_index;\n      while (\n          xe::bit_scan_forward(interpolators_remaining, &interpolator_index)) {\n        interpolators_remaining &= ~(UINT32_C(1) << interpolator_index);\n        spv::Id interpolator = builder_->createVariable(\n            spv::NoPrecision, spv::StorageClassInput, type_float4_,\n            fmt::format(\"xe_in_interpolator_{}\", interpolator_index).c_str());\n        input_output_interpolators_[interpolator_index] = interpolator;\n        builder_->addDecoration(interpolator, spv::DecorationLocation,\n                                int(input_location));\n        if (shader_modification.pixel.interpolators_centroid &\n            (UINT32_C(1) << interpolator_index)) {\n          builder_->addDecoration(interpolator, spv::DecorationCentroid);\n        }\n        main_interface_.push_back(interpolator);\n        ++input_location;\n      }\n    }\n\n    // Point coordinate input.\n    if (shader_modification.pixel.param_gen_point) {\n      if (param_gen_needed) {\n        input_point_coordinates_ =\n            builder_->createVariable(spv::NoPrecision, spv::StorageClassInput,\n                                     type_float2_, \"xe_in_point_coordinates\");\n        builder_->addDecoration(input_point_coordinates_,\n                                spv::DecorationLocation, int(input_location));\n        main_interface_.push_back(input_point_coordinates_);\n      }\n      ++input_location;\n    }\n  }\n\n  // Fragment coordinates.\n  // TODO(Triang3l): More conditions - alpha to coverage (if RT 0 is written,\n  // and there's no early depth / stencil), depth writing in the fragment shader\n  // (per-sample if supported).\n  if (edram_fragment_shader_interlock_ || param_gen_needed) {\n    input_fragment_coordinates_ = builder_->createVariable(\n        spv::NoPrecision, spv::StorageClassInput, type_float4_, \"gl_FragCoord\");\n    builder_->addDecoration(input_fragment_coordinates_, spv::DecorationBuiltIn,\n                            spv::BuiltInFragCoord);\n    main_interface_.push_back(input_fragment_coordinates_);\n  }\n\n  // Is front facing.\n  if (edram_fragment_shader_interlock_ ||\n      (param_gen_needed &&\n       !GetSpirvShaderModification().pixel.param_gen_point)) {\n    input_front_facing_ = builder_->createVariable(\n        spv::NoPrecision, spv::StorageClassInput, type_bool_, \"gl_FrontFacing\");\n    builder_->addDecoration(input_front_facing_, spv::DecorationBuiltIn,\n                            spv::BuiltInFrontFacing);\n    main_interface_.push_back(input_front_facing_);\n  }\n\n  // Sample mask input.\n  if (edram_fragment_shader_interlock_) {\n    // SampleMask depends on SampleRateShading in some SPIR-V revisions.\n    builder_->addCapability(spv::CapabilitySampleRateShading);\n    input_sample_mask_ = builder_->createVariable(\n        spv::NoPrecision, spv::StorageClassInput,\n        builder_->makeArrayType(type_int_, builder_->makeUintConstant(1), 0),\n        \"gl_SampleMaskIn\");\n    builder_->addDecoration(input_sample_mask_, spv::DecorationFlat);\n    builder_->addDecoration(input_sample_mask_, spv::DecorationBuiltIn,\n                            spv::BuiltInSampleMask);\n    main_interface_.push_back(input_sample_mask_);\n  }\n\n  if (!is_depth_only_fragment_shader_) {\n    // Framebuffer color attachment outputs.\n    if (!edram_fragment_shader_interlock_) {\n      std::fill(output_or_var_fragment_data_.begin(),\n                output_or_var_fragment_data_.end(), spv::NoResult);\n      static const char* const kFragmentDataOutputNames[] = {\n          \"xe_out_fragment_data_0\",\n          \"xe_out_fragment_data_1\",\n          \"xe_out_fragment_data_2\",\n          \"xe_out_fragment_data_3\",\n      };\n      uint32_t color_targets_remaining =\n          current_shader().writes_color_targets();\n      uint32_t color_target_index;\n      while (\n          xe::bit_scan_forward(color_targets_remaining, &color_target_index)) {\n        color_targets_remaining &= ~(UINT32_C(1) << color_target_index);\n        spv::Id output_fragment_data_rt = builder_->createVariable(\n            spv::NoPrecision, spv::StorageClassOutput, type_float4_,\n            kFragmentDataOutputNames[color_target_index]);\n        output_or_var_fragment_data_[color_target_index] =\n            output_fragment_data_rt;\n        builder_->addDecoration(output_fragment_data_rt,\n                                spv::DecorationLocation,\n                                int(color_target_index));\n        // Make invariant as pixel shaders may be used for various precise\n        // computations.\n        builder_->addDecoration(output_fragment_data_rt,\n                                spv::DecorationInvariant);\n        main_interface_.push_back(output_fragment_data_rt);\n      }\n    }\n  }\n}\n\nvoid SpirvShaderTranslator::StartFragmentShaderInMain() {\n  // TODO(Triang3l): Allow memory export with resolution scaling only for the\n  // center host pixel, with sample shading (for depth format conversion) only\n  // for the bottom-right sample (unlike in Direct3D, the sample mask input\n  // doesn't include covered samples of the primitive that correspond to other\n  // invocations, so use the sample that's the most friendly to the half-pixel\n  // offset).\n\n  // Set up pixel killing from within the translated shader without affecting\n  // the control flow (unlike with OpKill), similarly to how pixel killing works\n  // on the Xenos, and also keeping a single critical section exit and return\n  // for safety across different Vulkan implementations with fragment shader\n  // interlock.\n  if (current_shader().kills_pixels()) {\n    if (features_.demote_to_helper_invocation) {\n      // TODO(Triang3l): Promoted to SPIR-V 1.6 - don't add the extension there.\n      builder_->addExtension(\"SPV_EXT_demote_to_helper_invocation\");\n      builder_->addCapability(spv::CapabilityDemoteToHelperInvocationEXT);\n    } else {\n      var_main_kill_pixel_ = builder_->createVariable(\n          spv::NoPrecision, spv::StorageClassFunction, type_bool_,\n          \"xe_var_kill_pixel\", builder_->makeBoolConstant(false));\n    }\n    // For killing with fragment shader interlock when demotion is supported,\n    // using OpIsHelperInvocationEXT to avoid allocating a variable in addition\n    // to the execution mask GPUs naturally have.\n  }\n\n  if (edram_fragment_shader_interlock_) {\n    // Initialize color output variables with fragment shader interlock.\n    std::fill(output_or_var_fragment_data_.begin(),\n              output_or_var_fragment_data_.end(), spv::NoResult);\n    var_main_fsi_color_written_ = spv::NoResult;\n    uint32_t color_targets_written = current_shader().writes_color_targets();\n    if (color_targets_written) {\n      static const char* const kFragmentDataVariableNames[] = {\n          \"xe_var_fragment_data_0\",\n          \"xe_var_fragment_data_1\",\n          \"xe_var_fragment_data_2\",\n          \"xe_var_fragment_data_3\",\n      };\n      uint32_t color_targets_remaining = color_targets_written;\n      uint32_t color_target_index;\n      while (\n          xe::bit_scan_forward(color_targets_remaining, &color_target_index)) {\n        color_targets_remaining &= ~(UINT32_C(1) << color_target_index);\n        output_or_var_fragment_data_[color_target_index] =\n            builder_->createVariable(\n                spv::NoPrecision, spv::StorageClassFunction, type_float4_,\n                kFragmentDataVariableNames[color_target_index],\n                const_float4_0_);\n      }\n      var_main_fsi_color_written_ = builder_->createVariable(\n          spv::NoPrecision, spv::StorageClassFunction, type_uint_,\n          \"xe_var_fsi_color_written\", const_uint_0_);\n    }\n  }\n\n  if (edram_fragment_shader_interlock_ && FSI_IsDepthStencilEarly()) {\n    spv::Id msaa_samples = LoadMsaaSamplesFromFlags();\n    FSI_LoadSampleMask(msaa_samples);\n    FSI_LoadEdramOffsets(msaa_samples);\n    builder_->createNoResultOp(spv::OpBeginInvocationInterlockEXT);\n    FSI_DepthStencilTest(msaa_samples, false);\n    if (!is_depth_only_fragment_shader_) {\n      // Skip the rest of the shader if the whole quad (due to derivatives) has\n      // failed the depth / stencil test, and there are no depth and stencil\n      // values to conditionally write after running the shader to check if\n      // samples don't additionally need to be discarded.\n      spv::Id quad_needs_execution = builder_->createBinOp(\n          spv::OpINotEqual, type_bool_, main_fsi_sample_mask_, const_uint_0_);\n      // TODO(Triang3l): Use GroupNonUniformQuad operations where supported.\n      // If none of the pixels in the quad passed the depth / stencil test, the\n      // value of (any samples covered ? 1.0f : 0.0f) for the current pixel will\n      // be 0.0f, and since it will be 0.0f in other pixels too, the derivatives\n      // will be zero as well.\n      builder_->addCapability(spv::CapabilityDerivativeControl);\n      // Query the horizontally adjacent pixel.\n      quad_needs_execution = builder_->createBinOp(\n          spv::OpLogicalOr, type_bool_, quad_needs_execution,\n          builder_->createBinOp(\n              spv::OpFOrdNotEqual, type_bool_,\n              builder_->createUnaryOp(\n                  spv::OpDPdxFine, type_float_,\n                  builder_->createTriOp(spv::OpSelect, type_float_,\n                                        quad_needs_execution, const_float_1_,\n                                        const_float_0_)),\n              const_float_0_));\n      // Query the vertically adjacent pair of pixels.\n      quad_needs_execution = builder_->createBinOp(\n          spv::OpLogicalOr, type_bool_, quad_needs_execution,\n          builder_->createBinOp(\n              spv::OpFOrdNotEqual, type_bool_,\n              builder_->createUnaryOp(\n                  spv::OpDPdyCoarse, type_float_,\n                  builder_->createTriOp(spv::OpSelect, type_float_,\n                                        quad_needs_execution, const_float_1_,\n                                        const_float_0_)),\n              const_float_0_));\n      spv::Block& main_fsi_early_depth_stencil_execute_quad =\n          builder_->makeNewBlock();\n      main_fsi_early_depth_stencil_execute_quad_merge_ =\n          &builder_->makeNewBlock();\n      builder_->createSelectionMerge(\n          main_fsi_early_depth_stencil_execute_quad_merge_,\n          spv::SelectionControlDontFlattenMask);\n      builder_->createConditionalBranch(\n          quad_needs_execution, &main_fsi_early_depth_stencil_execute_quad,\n          main_fsi_early_depth_stencil_execute_quad_merge_);\n      builder_->setBuildPoint(&main_fsi_early_depth_stencil_execute_quad);\n    }\n  }\n\n  if (is_depth_only_fragment_shader_) {\n    return;\n  }\n\n  uint32_t param_gen_interpolator = GetPsParamGenInterpolator();\n\n  // Zero general-purpose registers to prevent crashes when the game\n  // references them after only initializing them conditionally, and copy\n  // interpolants to GPRs.\n  uint32_t interpolator_mask = GetModificationInterpolatorMask();\n  for (uint32_t i = 0; i < register_count(); ++i) {\n    if (i == param_gen_interpolator) {\n      continue;\n    }\n    id_vector_temp_.clear();\n    id_vector_temp_.push_back(builder_->makeIntConstant(int(i)));\n    builder_->createStore(\n        (i < xenos::kMaxInterpolators &&\n         (interpolator_mask & (UINT32_C(1) << i)))\n            ? builder_->createLoad(input_output_interpolators_[i],\n                                   spv::NoPrecision)\n            : const_float4_0_,\n        builder_->createAccessChain(spv::StorageClassFunction,\n                                    var_main_registers_, id_vector_temp_));\n  }\n\n  // Pixel parameters.\n  if (param_gen_interpolator != UINT32_MAX) {\n    Modification modification = GetSpirvShaderModification();\n    // Rounding the position down, and taking the absolute value, so in case the\n    // host GPU for some reason has quads used for derivative calculation at odd\n    // locations, the left and top edges will have correct derivative magnitude\n    // and LODs.\n    // Assuming that if PsParamGen is needed at all, param_gen_point is always\n    // set for point primitives, and is always disabled for other primitive\n    // types.\n    // OpFNegate requires sign bit flipping even for 0.0 (in this case, the\n    // first column or row of pixels) only since SPIR-V 1.5 revision 2 (not the\n    // base 1.5).\n    // TODO(Triang3l): When SPIR-V 1.6 is used in Xenia, see if OpFNegate can be\n    // used there, should be cheaper because it may be implemented as a hardware\n    // instruction modifier, though it respects the rule for subnormal numbers -\n    // see the actual hardware instructions in both OpBitwiseXor and OpFNegate\n    // cases.\n    spv::Id const_sign_bit = builder_->makeUintConstant(UINT32_C(1) << 31);\n    // TODO(Triang3l): Resolution scale inversion.\n    // X - pixel X .0 in the magnitude, is back-facing in the sign bit.\n    assert_true(input_fragment_coordinates_ != spv::NoResult);\n    id_vector_temp_.clear();\n    id_vector_temp_.push_back(const_int_0_);\n    spv::Id param_gen_x = builder_->createUnaryBuiltinCall(\n        type_float_, ext_inst_glsl_std_450_, GLSLstd450FAbs,\n        builder_->createUnaryBuiltinCall(\n            type_float_, ext_inst_glsl_std_450_, GLSLstd450Floor,\n            builder_->createLoad(\n                builder_->createAccessChain(spv::StorageClassInput,\n                                            input_fragment_coordinates_,\n                                            id_vector_temp_),\n                spv::NoPrecision)));\n    if (!modification.pixel.param_gen_point) {\n      assert_true(input_front_facing_ != spv::NoResult);\n      param_gen_x = builder_->createTriOp(\n          spv::OpSelect, type_float_,\n          builder_->createBinOp(\n              spv::OpLogicalOr, type_bool_,\n              builder_->createBinOp(\n                  spv::OpIEqual, type_bool_,\n                  builder_->createBinOp(\n                      spv::OpBitwiseAnd, type_uint_,\n                      main_system_constant_flags_,\n                      builder_->makeUintConstant(kSysFlag_PrimitivePolygonal)),\n                  const_uint_0_),\n              builder_->createLoad(input_front_facing_, spv::NoPrecision)),\n          param_gen_x,\n          builder_->createUnaryOp(\n              spv::OpBitcast, type_float_,\n              builder_->createBinOp(\n                  spv::OpBitwiseXor, type_uint_,\n                  builder_->createUnaryOp(spv::OpBitcast, type_uint_,\n                                          param_gen_x),\n                  const_sign_bit)));\n    }\n    // Y - pixel Y .0 in the magnitude, is point in the sign bit.\n    id_vector_temp_.clear();\n    id_vector_temp_.push_back(builder_->makeIntConstant(1));\n    spv::Id param_gen_y = builder_->createUnaryBuiltinCall(\n        type_float_, ext_inst_glsl_std_450_, GLSLstd450FAbs,\n        builder_->createUnaryBuiltinCall(\n            type_float_, ext_inst_glsl_std_450_, GLSLstd450Floor,\n            builder_->createLoad(\n                builder_->createAccessChain(spv::StorageClassInput,\n                                            input_fragment_coordinates_,\n                                            id_vector_temp_),\n                spv::NoPrecision)));\n    if (modification.pixel.param_gen_point) {\n      param_gen_y = builder_->createUnaryOp(\n          spv::OpBitcast, type_float_,\n          builder_->createBinOp(\n              spv::OpBitwiseXor, type_uint_,\n              builder_->createUnaryOp(spv::OpBitcast, type_uint_, param_gen_y),\n              const_sign_bit));\n    }\n    // Z - point S in the magnitude, is line in the sign bit.\n    // W - point T in the magnitude.\n    spv::Id param_gen_z, param_gen_w;\n    if (modification.pixel.param_gen_point) {\n      assert_true(input_point_coordinates_ != spv::NoResult);\n      // Saturate to avoid negative point coordinates if the center of the pixel\n      // is not covered, and extrapolation is done.\n      spv::Id param_gen_point_coordinates = builder_->createTriBuiltinCall(\n          type_float2_, ext_inst_glsl_std_450_, GLSLstd450NClamp,\n          builder_->createLoad(input_point_coordinates_, spv::NoPrecision),\n          const_float2_0_, const_float2_1_);\n      param_gen_z = builder_->createCompositeExtract(\n          param_gen_point_coordinates, type_float_, 0);\n      param_gen_w = builder_->createCompositeExtract(\n          param_gen_point_coordinates, type_float_, 1);\n    } else {\n      param_gen_z = builder_->createUnaryOp(\n          spv::OpBitcast, type_float_,\n          builder_->createTriOp(\n              spv::OpSelect, type_uint_,\n              builder_->createBinOp(\n                  spv::OpINotEqual, type_bool_,\n                  builder_->createBinOp(\n                      spv::OpBitwiseAnd, type_uint_,\n                      main_system_constant_flags_,\n                      builder_->makeUintConstant(kSysFlag_PrimitiveLine)),\n                  const_uint_0_),\n              const_sign_bit, const_uint_0_));\n      param_gen_w = const_float_0_;\n    }\n    // Store the pixel parameters.\n    id_vector_temp_.clear();\n    id_vector_temp_.push_back(param_gen_x);\n    id_vector_temp_.push_back(param_gen_y);\n    id_vector_temp_.push_back(param_gen_z);\n    id_vector_temp_.push_back(param_gen_w);\n    spv::Id param_gen =\n        builder_->createCompositeConstruct(type_float4_, id_vector_temp_);\n    id_vector_temp_.clear();\n    id_vector_temp_.push_back(\n        builder_->makeIntConstant(int(param_gen_interpolator)));\n    builder_->createStore(param_gen, builder_->createAccessChain(\n                                         spv::StorageClassFunction,\n                                         var_main_registers_, id_vector_temp_));\n  }\n\n  if (!edram_fragment_shader_interlock_) {\n    // Initialize the colors for safety.\n    for (uint32_t i = 0; i < xenos::kMaxColorRenderTargets; ++i) {\n      spv::Id output_fragment_data_rt = output_or_var_fragment_data_[i];\n      if (output_fragment_data_rt != spv::NoResult) {\n        builder_->createStore(const_float4_0_, output_fragment_data_rt);\n      }\n    }\n  }\n}\n\nvoid SpirvShaderTranslator::UpdateExecConditionals(\n    ParsedExecInstruction::Type type, uint32_t bool_constant_index,\n    bool condition) {\n  // Check if we can merge the new exec with the previous one, or the jump with\n  // the previous exec. The instruction-level predicate check is also merged in\n  // this case.\n  if (type == ParsedExecInstruction::Type::kConditional) {\n    // Can merge conditional with conditional, as long as the bool constant and\n    // the expected values are the same.\n    if (cf_exec_conditional_merge_ &&\n        cf_exec_bool_constant_or_predicate_ == bool_constant_index &&\n        cf_exec_condition_ == condition) {\n      return;\n    }\n  } else if (type == ParsedExecInstruction::Type::kPredicated) {\n    // Can merge predicated with predicated if the conditions are the same and\n    // the previous exec hasn't modified the predicate register.\n    if (!cf_exec_predicate_written_ && cf_exec_conditional_merge_ &&\n        cf_exec_bool_constant_or_predicate_ == kCfExecBoolConstantPredicate &&\n        cf_exec_condition_ == condition) {\n      return;\n    }\n  } else {\n    // Can merge unconditional with unconditional.\n    assert_true(type == ParsedExecInstruction::Type::kUnconditional);\n    if (!cf_exec_conditional_merge_) {\n      return;\n    }\n  }\n\n  CloseExecConditionals();\n\n  if (type == ParsedExecInstruction::Type::kUnconditional) {\n    return;\n  }\n\n  EnsureBuildPointAvailable();\n  spv::Id condition_id;\n  if (type == ParsedExecInstruction::Type::kConditional) {\n    id_vector_temp_.clear();\n    // Bool constants (member 0).\n    id_vector_temp_.push_back(const_int_0_);\n    // 128-bit vector.\n    id_vector_temp_.push_back(\n        builder_->makeIntConstant(int(bool_constant_index >> 7)));\n    // 32-bit scalar of a 128-bit vector.\n    id_vector_temp_.push_back(\n        builder_->makeIntConstant(int((bool_constant_index >> 5) & 3)));\n    spv::Id bool_constant_scalar =\n        builder_->createLoad(builder_->createAccessChain(\n                                 spv::StorageClassUniform,\n                                 uniform_bool_loop_constants_, id_vector_temp_),\n                             spv::NoPrecision);\n    condition_id = builder_->createBinOp(\n        spv::OpINotEqual, type_bool_,\n        builder_->createBinOp(\n            spv::OpBitwiseAnd, type_uint_, bool_constant_scalar,\n            builder_->makeUintConstant(uint32_t(1)\n                                       << (bool_constant_index & 31))),\n        const_uint_0_);\n    cf_exec_bool_constant_or_predicate_ = bool_constant_index;\n  } else if (type == ParsedExecInstruction::Type::kPredicated) {\n    condition_id = builder_->createLoad(var_main_predicate_, spv::NoPrecision);\n    cf_exec_bool_constant_or_predicate_ = kCfExecBoolConstantPredicate;\n  } else {\n    assert_unhandled_case(type);\n    return;\n  }\n  cf_exec_condition_ = condition;\n  cf_exec_conditional_merge_ = new spv::Block(\n      builder_->getUniqueId(), builder_->getBuildPoint()->getParent());\n  builder_->createSelectionMerge(cf_exec_conditional_merge_,\n                                 spv::SelectionControlDontFlattenMask);\n  spv::Block& inner_block = builder_->makeNewBlock();\n  builder_->createConditionalBranch(\n      condition_id, condition ? &inner_block : cf_exec_conditional_merge_,\n      condition ? cf_exec_conditional_merge_ : &inner_block);\n  builder_->setBuildPoint(&inner_block);\n}\n\nvoid SpirvShaderTranslator::UpdateInstructionPredication(bool predicated,\n                                                         bool condition) {\n  if (!predicated) {\n    CloseInstructionPredication();\n    return;\n  }\n\n  if (cf_instruction_predicate_merge_) {\n    if (cf_instruction_predicate_condition_ == condition) {\n      // Already in the needed instruction-level conditional.\n      return;\n    }\n    CloseInstructionPredication();\n  }\n\n  // If the instruction predicate condition is the same as the exec predicate\n  // condition, no need to open a check. However, if there was a `setp` prior\n  // to this instruction, the predicate value now may be different than it was\n  // in the beginning of the exec.\n  if (!cf_exec_predicate_written_ && cf_exec_conditional_merge_ &&\n      cf_exec_bool_constant_or_predicate_ == kCfExecBoolConstantPredicate &&\n      cf_exec_condition_ == condition) {\n    return;\n  }\n\n  cf_instruction_predicate_condition_ = condition;\n  EnsureBuildPointAvailable();\n  spv::Id predicate_id =\n      builder_->createLoad(var_main_predicate_, spv::NoPrecision);\n  spv::Block& predicated_block = builder_->makeNewBlock();\n  cf_instruction_predicate_merge_ = new spv::Block(\n      builder_->getUniqueId(), builder_->getBuildPoint()->getParent());\n  builder_->createSelectionMerge(cf_instruction_predicate_merge_,\n                                 spv::SelectionControlMaskNone);\n  builder_->createConditionalBranch(\n      predicate_id,\n      condition ? &predicated_block : cf_instruction_predicate_merge_,\n      condition ? cf_instruction_predicate_merge_ : &predicated_block);\n  builder_->setBuildPoint(&predicated_block);\n}\n\nvoid SpirvShaderTranslator::CloseInstructionPredication() {\n  if (!cf_instruction_predicate_merge_) {\n    return;\n  }\n  spv::Block& inner_block = *builder_->getBuildPoint();\n  if (!inner_block.isTerminated()) {\n    builder_->createBranch(cf_instruction_predicate_merge_);\n  }\n  inner_block.getParent().addBlock(cf_instruction_predicate_merge_);\n  builder_->setBuildPoint(cf_instruction_predicate_merge_);\n  cf_instruction_predicate_merge_ = nullptr;\n}\n\nvoid SpirvShaderTranslator::CloseExecConditionals() {\n  // Within the exec - instruction-level predicate check.\n  CloseInstructionPredication();\n  // Exec level.\n  if (cf_exec_conditional_merge_) {\n    spv::Block& inner_block = *builder_->getBuildPoint();\n    if (!inner_block.isTerminated()) {\n      builder_->createBranch(cf_exec_conditional_merge_);\n    }\n    inner_block.getParent().addBlock(cf_exec_conditional_merge_);\n    builder_->setBuildPoint(cf_exec_conditional_merge_);\n    cf_exec_conditional_merge_ = nullptr;\n  }\n  // Nothing relies on the predicate value being unchanged now.\n  cf_exec_predicate_written_ = false;\n}\n\nspv::Id SpirvShaderTranslator::GetStorageAddressingIndex(\n    InstructionStorageAddressingMode addressing_mode, uint32_t storage_index,\n    bool is_float_constant) {\n  const Shader::ConstantRegisterMap& constant_register_map =\n      current_shader().constant_register_map();\n  EnsureBuildPointAvailable();\n  spv::Id base_pointer = spv::NoResult;\n  switch (addressing_mode) {\n    case InstructionStorageAddressingMode::kAbsolute: {\n      uint32_t static_storage_index = storage_index;\n      if (is_float_constant) {\n        static_storage_index =\n            constant_register_map.GetPackedFloatConstantIndex(storage_index);\n        assert_true(static_storage_index != UINT32_MAX);\n        if (static_storage_index == UINT32_MAX) {\n          static_storage_index = 0;\n        }\n      }\n      return builder_->makeIntConstant(int(static_storage_index));\n    }\n    case InstructionStorageAddressingMode::kAddressRegisterRelative:\n      base_pointer = var_main_address_register_;\n      break;\n    case InstructionStorageAddressingMode::kLoopRelative:\n      // Load X component.\n      id_vector_temp_util_.clear();\n      id_vector_temp_util_.push_back(const_int_0_);\n      base_pointer = builder_->createAccessChain(spv::StorageClassFunction,\n                                                 var_main_loop_address_,\n                                                 id_vector_temp_util_);\n      break;\n  }\n  assert_true(!is_float_constant ||\n              constant_register_map.float_dynamic_addressing);\n  assert_true(base_pointer != spv::NoResult);\n  spv::Id index = builder_->createLoad(base_pointer, spv::NoPrecision);\n  if (storage_index) {\n    index =\n        builder_->createBinOp(spv::OpIAdd, type_int_, index,\n                              builder_->makeIntConstant(int(storage_index)));\n  }\n  return index;\n}\n\nspv::Id SpirvShaderTranslator::LoadOperandStorage(\n    const InstructionOperand& operand) {\n  spv::Id index = GetStorageAddressingIndex(\n      operand.storage_addressing_mode, operand.storage_index,\n      operand.storage_source == InstructionStorageSource::kConstantFloat);\n  EnsureBuildPointAvailable();\n  spv::Id vec4_pointer = spv::NoResult;\n  switch (operand.storage_source) {\n    case InstructionStorageSource::kRegister:\n      assert_true(var_main_registers_ != spv::NoResult);\n      id_vector_temp_util_.clear();\n      // Array element.\n      id_vector_temp_util_.push_back(index);\n      vec4_pointer = builder_->createAccessChain(\n          spv::StorageClassFunction, var_main_registers_, id_vector_temp_util_);\n      break;\n    case InstructionStorageSource::kConstantFloat:\n      assert_true(uniform_float_constants_ != spv::NoResult);\n      id_vector_temp_util_.clear();\n      // The first and the only structure member.\n      id_vector_temp_util_.push_back(const_int_0_);\n      // Array element.\n      id_vector_temp_util_.push_back(index);\n      vec4_pointer = builder_->createAccessChain(spv::StorageClassUniform,\n                                                 uniform_float_constants_,\n                                                 id_vector_temp_util_);\n      break;\n    default:\n      assert_unhandled_case(operand.storage_source);\n  }\n  assert_true(vec4_pointer != spv::NoResult);\n  return builder_->createLoad(vec4_pointer, spv::NoPrecision);\n}\n\nspv::Id SpirvShaderTranslator::ApplyOperandModifiers(\n    spv::Id operand_value, const InstructionOperand& original_operand,\n    bool invert_negate, bool force_absolute) {\n  spv::Id type = builder_->getTypeId(operand_value);\n  assert_true(type != spv::NoType);\n  if (type == spv::NoType) {\n    return operand_value;\n  }\n  if (original_operand.is_absolute_value || force_absolute) {\n    EnsureBuildPointAvailable();\n    operand_value = builder_->createUnaryBuiltinCall(\n        type, ext_inst_glsl_std_450_, GLSLstd450FAbs, operand_value);\n  }\n  if (original_operand.is_negated != invert_negate) {\n    EnsureBuildPointAvailable();\n    operand_value = builder_->createNoContractionUnaryOp(spv::OpFNegate, type,\n                                                         operand_value);\n  }\n  return operand_value;\n}\n\nspv::Id SpirvShaderTranslator::GetUnmodifiedOperandComponents(\n    spv::Id operand_storage, const InstructionOperand& original_operand,\n    uint32_t components) {\n  assert_not_zero(components);\n  if (!components) {\n    return spv::NoResult;\n  }\n  assert_true(components <= 0b1111);\n  if (components == 0b1111 && original_operand.IsStandardSwizzle()) {\n    return operand_storage;\n  }\n  EnsureBuildPointAvailable();\n  uint32_t component_count = xe::bit_count(components);\n  if (component_count == 1) {\n    uint32_t scalar_index;\n    xe::bit_scan_forward(components, &scalar_index);\n    return builder_->createCompositeExtract(\n        operand_storage, type_float_,\n        static_cast<unsigned int>(original_operand.GetComponent(scalar_index)) -\n            static_cast<unsigned int>(SwizzleSource::kX));\n  }\n  uint_vector_temp_util_.clear();\n  uint32_t components_remaining = components;\n  uint32_t component_index;\n  while (xe::bit_scan_forward(components_remaining, &component_index)) {\n    components_remaining &= ~(uint32_t(1) << component_index);\n    uint_vector_temp_util_.push_back(\n        static_cast<unsigned int>(\n            original_operand.GetComponent(component_index)) -\n        static_cast<unsigned int>(SwizzleSource::kX));\n  }\n  return builder_->createRvalueSwizzle(spv::NoPrecision,\n                                       type_float_vectors_[component_count - 1],\n                                       operand_storage, uint_vector_temp_util_);\n}\n\nvoid SpirvShaderTranslator::GetOperandScalarXY(\n    spv::Id operand_storage, const InstructionOperand& original_operand,\n    spv::Id& a_out, spv::Id& b_out, bool invert_negate, bool force_absolute) {\n  spv::Id a = GetOperandComponents(operand_storage, original_operand, 0b0001,\n                                   invert_negate, force_absolute);\n  a_out = a;\n  b_out = original_operand.GetComponent(0) != original_operand.GetComponent(1)\n              ? GetOperandComponents(operand_storage, original_operand, 0b0010,\n                                     invert_negate, force_absolute)\n              : a;\n}\n\nspv::Id SpirvShaderTranslator::GetAbsoluteOperand(\n    spv::Id operand_storage, const InstructionOperand& original_operand) {\n  if (original_operand.is_absolute_value && !original_operand.is_negated) {\n    return operand_storage;\n  }\n  EnsureBuildPointAvailable();\n  return builder_->createUnaryBuiltinCall(builder_->getTypeId(operand_storage),\n                                          ext_inst_glsl_std_450_,\n                                          GLSLstd450FAbs, operand_storage);\n}\n\nvoid SpirvShaderTranslator::StoreResult(const InstructionResult& result,\n                                        spv::Id value) {\n  uint32_t used_write_mask = result.GetUsedWriteMask();\n  if (!used_write_mask) {\n    return;\n  }\n\n  EnsureBuildPointAvailable();\n\n  spv::Id target_pointer = spv::NoResult;\n  switch (result.storage_target) {\n    case InstructionStorageTarget::kNone:\n      break;\n    case InstructionStorageTarget::kRegister: {\n      assert_true(var_main_registers_ != spv::NoResult);\n      // Must call GetStorageAddressingIndex first because of\n      // id_vector_temp_util_ usage in it.\n      spv::Id register_index = GetStorageAddressingIndex(\n          result.storage_addressing_mode, result.storage_index);\n      id_vector_temp_util_.clear();\n      // Array element.\n      id_vector_temp_util_.push_back(register_index);\n      target_pointer = builder_->createAccessChain(\n          spv::StorageClassFunction, var_main_registers_, id_vector_temp_util_);\n    } break;\n    case InstructionStorageTarget::kInterpolator: {\n      assert_true(is_vertex_shader());\n      target_pointer = input_output_interpolators_[result.storage_index];\n      // Unused interpolators are spv::NoResult in input_output_interpolators_.\n    } break;\n    case InstructionStorageTarget::kPosition: {\n      assert_true(is_vertex_shader());\n      id_vector_temp_util_.clear();\n      id_vector_temp_util_.push_back(\n          builder_->makeIntConstant(kOutputPerVertexMemberPosition));\n      target_pointer = builder_->createAccessChain(\n          spv::StorageClassOutput, output_per_vertex_, id_vector_temp_util_);\n    } break;\n    case InstructionStorageTarget::kPointSizeEdgeFlagKillVertex: {\n      assert_true(is_vertex_shader());\n      assert_zero(used_write_mask & 0b1000);\n      target_pointer = var_main_point_size_edge_flag_kill_vertex_;\n    } break;\n    case InstructionStorageTarget::kColor: {\n      assert_true(is_pixel_shader());\n      assert_not_zero(used_write_mask);\n      assert_true(current_shader().writes_color_target(result.storage_index));\n      target_pointer = output_or_var_fragment_data_[result.storage_index];\n      if (edram_fragment_shader_interlock_) {\n        assert_true(var_main_fsi_color_written_ != spv::NoResult);\n        builder_->createStore(\n            builder_->createBinOp(\n                spv::OpBitwiseOr, type_uint_,\n                builder_->createLoad(var_main_fsi_color_written_,\n                                     spv::NoPrecision),\n                builder_->makeUintConstant(uint32_t(1)\n                                           << result.storage_index)),\n            var_main_fsi_color_written_);\n      }\n    } break;\n    case InstructionStorageTarget::kExportAddress: {\n      // spv::NoResult if memory export usage is unsupported or invalid.\n      target_pointer = var_main_memexport_address_;\n    } break;\n    case InstructionStorageTarget::kExportData: {\n      // spv::NoResult if memory export usage is unsupported or invalid.\n      target_pointer = var_main_memexport_data_[result.storage_index];\n      if (target_pointer != spv::NoResult) {\n        // Mark that the eM# has been written to and needs to be exported.\n        assert_true(var_main_memexport_data_written_ != spv::NoResult);\n        builder_->createStore(\n            builder_->createBinOp(\n                spv::OpBitwiseOr, type_uint_,\n                builder_->createLoad(var_main_memexport_data_written_,\n                                     spv::NoPrecision),\n                builder_->makeUintConstant(uint32_t(1)\n                                           << result.storage_index)),\n            var_main_memexport_data_written_);\n      }\n    } break;\n    default:\n      // TODO(Triang3l): All storage targets.\n      break;\n  }\n  if (target_pointer == spv::NoResult) {\n    return;\n  }\n\n  uint32_t constant_values;\n  uint32_t constant_components =\n      result.GetUsedConstantComponents(constant_values);\n  if (value == spv::NoResult) {\n    // The instruction processing function decided that nothing useful needs to\n    // be stored for some reason, however, some components still need to be\n    // written on the guest side - fill them with zeros.\n    constant_components = used_write_mask;\n  }\n  uint32_t non_constant_components = used_write_mask & ~constant_components;\n\n  unsigned int value_num_components =\n      value != spv::NoResult\n          ? static_cast<unsigned int>(builder_->getNumComponents(value))\n          : 0;\n\n  if (result.is_clamped && non_constant_components) {\n    // Apply the saturation modifier to the result.\n    value = builder_->createTriBuiltinCall(\n        type_float_vectors_[value_num_components - 1], ext_inst_glsl_std_450_,\n        GLSLstd450NClamp, value,\n        const_float_vectors_0_[value_num_components - 1],\n        const_float_vectors_1_[value_num_components - 1]);\n  }\n\n  // The value contains either result.GetUsedResultComponents() in a condensed\n  // way, or a scalar to be replicated. Decompress them to create a mapping from\n  // guest result components to the ones in the value vector.\n  uint32_t used_result_components = result.GetUsedResultComponents();\n  unsigned int result_unswizzled_value_components[4] = {};\n  if (value_num_components > 1) {\n    unsigned int value_component = 0;\n    uint32_t used_result_components_remaining = used_result_components;\n    uint32_t result_component;\n    while (xe::bit_scan_forward(used_result_components_remaining,\n                                &result_component)) {\n      used_result_components_remaining &= ~(uint32_t(1) << result_component);\n      result_unswizzled_value_components[result_component] =\n          std::min(value_component++, value_num_components - 1);\n    }\n  }\n\n  // Get swizzled mapping of non-constant components to the components of\n  // `value`.\n  unsigned int result_swizzled_value_components[4] = {};\n  for (uint32_t i = 0; i < 4; ++i) {\n    if (!(non_constant_components & (1 << i))) {\n      continue;\n    }\n    SwizzleSource swizzle = result.components[i];\n    assert_true(swizzle >= SwizzleSource::kX && swizzle <= SwizzleSource::kW);\n    result_swizzled_value_components[i] =\n        result_unswizzled_value_components[uint32_t(swizzle) -\n                                           uint32_t(SwizzleSource::kX)];\n  }\n\n  spv::Id target_type = builder_->getDerefTypeId(target_pointer);\n  unsigned int target_num_components =\n      builder_->getNumTypeComponents(target_type);\n  assert_true(\n      target_num_components ==\n      GetInstructionStorageTargetUsedComponentCount(result.storage_target));\n  uint32_t target_component_mask = (1 << target_num_components) - 1;\n  assert_zero(used_write_mask & ~target_component_mask);\n\n  spv::Id value_to_store;\n  if (target_component_mask == used_write_mask) {\n    // All components are overwritten - no need to load the original value.\n    // Possible cases:\n    // * Non-constants only.\n    //   * Vector target.\n    //     * Vector source.\n    //       * Identity swizzle - store directly.\n    //       * Non-identity swizzle - shuffle.\n    //     * Scalar source - smear.\n    //   * Scalar target.\n    //     * Vector source - extract.\n    //     * Scalar source - store directly.\n    // * Constants only.\n    //   * Vector target - make composite constant.\n    //   * Scalar target - store directly.\n    // * Mixed non-constants and constants (only for vector targets - scalar\n    //   targets fully covered by the previous cases).\n    //   * Vector source - shuffle with {0, 1} also applying swizzle.\n    //   * Scalar source - construct composite.\n    if (!constant_components) {\n      if (target_num_components > 1) {\n        if (value_num_components > 1) {\n          // Non-constants only - vector target, vector source.\n          bool is_identity_swizzle =\n              target_num_components == value_num_components;\n          for (uint32_t i = 0; is_identity_swizzle && i < target_num_components;\n               ++i) {\n            is_identity_swizzle &= result_swizzled_value_components[i] == i;\n          }\n          if (is_identity_swizzle) {\n            value_to_store = value;\n          } else {\n            uint_vector_temp_util_.clear();\n            uint_vector_temp_util_.insert(\n                uint_vector_temp_util_.cend(), result_swizzled_value_components,\n                result_swizzled_value_components + target_num_components);\n            value_to_store = builder_->createRvalueSwizzle(\n                spv::NoPrecision, target_type, value, uint_vector_temp_util_);\n          }\n        } else {\n          // Non-constants only - vector target, scalar source.\n          value_to_store =\n              builder_->smearScalar(spv::NoPrecision, value, target_type);\n        }\n      } else {\n        if (value_num_components > 1) {\n          // Non-constants only - scalar target, vector source.\n          value_to_store = builder_->createCompositeExtract(\n              value, type_float_, result_swizzled_value_components[0]);\n        } else {\n          // Non-constants only - scalar target, scalar source.\n          value_to_store = value;\n        }\n      }\n    } else if (!non_constant_components) {\n      if (target_num_components > 1) {\n        // Constants only - vector target.\n        id_vector_temp_util_.clear();\n        for (uint32_t i = 0; i < target_num_components; ++i) {\n          id_vector_temp_util_.push_back(\n              (constant_values & (1 << i)) ? const_float_1_ : const_float_0_);\n        }\n        value_to_store =\n            builder_->makeCompositeConstant(target_type, id_vector_temp_util_);\n      } else {\n        // Constants only - scalar target.\n        value_to_store =\n            (constant_values & 0b0001) ? const_float_1_ : const_float_0_;\n      }\n    } else {\n      assert_true(target_num_components > 1);\n      if (value_num_components > 1) {\n        // Mixed non-constants and constants - vector source.\n        std::unique_ptr<spv::Instruction> shuffle_op =\n            std::make_unique<spv::Instruction>(\n                builder_->getUniqueId(), target_type, spv::OpVectorShuffle);\n        shuffle_op->addIdOperand(value);\n        shuffle_op->addIdOperand(const_float2_0_1_);\n        for (uint32_t i = 0; i < target_num_components; ++i) {\n          shuffle_op->addImmediateOperand(\n              (constant_components & (1 << i))\n                  ? value_num_components + ((constant_values >> i) & 1)\n                  : result_swizzled_value_components[i]);\n        }\n        value_to_store = shuffle_op->getResultId();\n        builder_->getBuildPoint()->addInstruction(std::move(shuffle_op));\n      } else {\n        // Mixed non-constants and constants - scalar source.\n        id_vector_temp_util_.clear();\n        for (uint32_t i = 0; i < target_num_components; ++i) {\n          if (constant_components & (1 << i)) {\n            id_vector_temp_util_.push_back(\n                (constant_values & (1 << i)) ? const_float_1_ : const_float_0_);\n          } else {\n            id_vector_temp_util_.push_back(value);\n          }\n        }\n        value_to_store = builder_->createCompositeConstruct(\n            target_type, id_vector_temp_util_);\n      }\n    }\n  } else {\n    // Only certain components are overwritten.\n    // Scalar targets are always overwritten fully, can't reach this case for\n    // them.\n    assert_true(target_num_components > 1);\n    value_to_store = builder_->createLoad(target_pointer, spv::NoPrecision);\n    // Two steps:\n    // 1) Insert constants by shuffling (first so dependency chain of step 2 is\n    //    simpler if constants are written first).\n    // 2) Insert value components - via shuffling for vector source, via\n    //    composite inserts for scalar value.\n    if (constant_components) {\n      std::unique_ptr<spv::Instruction> shuffle_op =\n          std::make_unique<spv::Instruction>(builder_->getUniqueId(),\n                                             target_type, spv::OpVectorShuffle);\n      shuffle_op->addIdOperand(value_to_store);\n      shuffle_op->addIdOperand(const_float2_0_1_);\n      for (uint32_t i = 0; i < target_num_components; ++i) {\n        shuffle_op->addImmediateOperand((constant_components & (1 << i))\n                                            ? target_num_components +\n                                                  ((constant_values >> i) & 1)\n                                            : i);\n      }\n      value_to_store = shuffle_op->getResultId();\n      builder_->getBuildPoint()->addInstruction(std::move(shuffle_op));\n    }\n    if (non_constant_components) {\n      if (value_num_components > 1) {\n        std::unique_ptr<spv::Instruction> shuffle_op =\n            std::make_unique<spv::Instruction>(\n                builder_->getUniqueId(), target_type, spv::OpVectorShuffle);\n        shuffle_op->addIdOperand(value_to_store);\n        shuffle_op->addIdOperand(value);\n        for (uint32_t i = 0; i < target_num_components; ++i) {\n          shuffle_op->addImmediateOperand(\n              (non_constant_components & (1 << i))\n                  ? target_num_components + result_swizzled_value_components[i]\n                  : i);\n        }\n        value_to_store = shuffle_op->getResultId();\n        builder_->getBuildPoint()->addInstruction(std::move(shuffle_op));\n      } else {\n        for (uint32_t i = 0; i < target_num_components; ++i) {\n          if (non_constant_components & (1 << i)) {\n            value_to_store = builder_->createCompositeInsert(\n                value, value_to_store, target_type, i);\n          }\n        }\n      }\n    }\n  }\n\n  if (result.storage_target ==\n          InstructionStorageTarget::kPointSizeEdgeFlagKillVertex &&\n      used_write_mask & 0b001) {\n    // Make the point size non-negative as negative is used to indicate that the\n    // default size must be used, and also clamp it to the bounds the way the\n    // R400 (Adreno 200, to be more precise) hardware clamps it (functionally\n    // like a signed 32-bit integer, -NaN and -Infinity...-0 to the minimum,\n    // +NaN to the maximum).\n    spv::Id point_size = builder_->createUnaryOp(\n        spv::OpBitcast, type_int_,\n        builder_->createCompositeExtract(value_to_store, type_float_, 0));\n    id_vector_temp_util_.clear();\n    id_vector_temp_util_.push_back(\n        builder_->makeIntConstant(kSystemConstantPointVertexDiameterMin));\n    spv::Id point_vertex_diameter_min = builder_->createUnaryOp(\n        spv::OpBitcast, type_int_,\n        builder_->createLoad(\n            builder_->createAccessChain(spv::StorageClassUniform,\n                                        uniform_system_constants_,\n                                        id_vector_temp_util_),\n            spv::NoPrecision));\n    point_size = builder_->createBinBuiltinCall(\n        type_int_, ext_inst_glsl_std_450_, GLSLstd450SMax,\n        point_vertex_diameter_min, point_size);\n    id_vector_temp_util_.clear();\n    id_vector_temp_util_.push_back(\n        builder_->makeIntConstant(kSystemConstantPointVertexDiameterMax));\n    spv::Id point_vertex_diameter_max = builder_->createUnaryOp(\n        spv::OpBitcast, type_int_,\n        builder_->createLoad(\n            builder_->createAccessChain(spv::StorageClassUniform,\n                                        uniform_system_constants_,\n                                        id_vector_temp_util_),\n            spv::NoPrecision));\n    point_size = builder_->createBinBuiltinCall(\n        type_int_, ext_inst_glsl_std_450_, GLSLstd450SMin,\n        point_vertex_diameter_max, point_size);\n    value_to_store = builder_->createCompositeInsert(\n        builder_->createUnaryOp(spv::OpBitcast, type_float_, point_size),\n        value_to_store, type_float3_, 0);\n  }\n\n  builder_->createStore(value_to_store, target_pointer);\n}\n\nspv::Id SpirvShaderTranslator::EndianSwap32Uint(spv::Id value, spv::Id endian) {\n  spv::Id type = builder_->getTypeId(value);\n  spv::Id const_uint_8_scalar = builder_->makeUintConstant(8);\n  spv::Id const_uint_00ff00ff_scalar = builder_->makeUintConstant(0x00FF00FF);\n  spv::Id const_uint_16_scalar = builder_->makeUintConstant(16);\n  spv::Id const_uint_8_typed, const_uint_00ff00ff_typed, const_uint_16_typed;\n  int num_components = builder_->getNumTypeComponents(type);\n  if (num_components > 1) {\n    id_vector_temp_.clear();\n    id_vector_temp_.insert(id_vector_temp_.cend(), num_components,\n                           const_uint_8_scalar);\n    const_uint_8_typed = builder_->makeCompositeConstant(type, id_vector_temp_);\n    id_vector_temp_.clear();\n    id_vector_temp_.insert(id_vector_temp_.cend(), num_components,\n                           const_uint_00ff00ff_scalar);\n    const_uint_00ff00ff_typed =\n        builder_->makeCompositeConstant(type, id_vector_temp_);\n    id_vector_temp_.clear();\n    id_vector_temp_.insert(id_vector_temp_.cend(), num_components,\n                           const_uint_16_scalar);\n    const_uint_16_typed =\n        builder_->makeCompositeConstant(type, id_vector_temp_);\n  } else {\n    const_uint_8_typed = const_uint_8_scalar;\n    const_uint_00ff00ff_typed = const_uint_00ff00ff_scalar;\n    const_uint_16_typed = const_uint_16_scalar;\n  }\n\n  // 8-in-16 or one half of 8-in-32 (doing 8-in-16 swap).\n  spv::Id is_8in16 = builder_->createBinOp(\n      spv::OpIEqual, type_bool_, endian,\n      builder_->makeUintConstant(\n          static_cast<unsigned int>(xenos::Endian::k8in16)));\n  spv::Id is_8in32 = builder_->createBinOp(\n      spv::OpIEqual, type_bool_, endian,\n      builder_->makeUintConstant(\n          static_cast<unsigned int>(xenos::Endian::k8in32)));\n  spv::Id is_8in16_or_8in32 =\n      builder_->createBinOp(spv::OpLogicalOr, type_bool_, is_8in16, is_8in32);\n  SpirvBuilder::IfBuilder if_8in16(is_8in16_or_8in32,\n                                   spv::SelectionControlMaskNone, *builder_);\n  spv::Id swapped_8in16;\n  {\n    swapped_8in16 = builder_->createBinOp(\n        spv::OpBitwiseOr, type,\n        builder_->createBinOp(\n            spv::OpBitwiseAnd, type,\n            builder_->createBinOp(spv::OpShiftRightLogical, type, value,\n                                  const_uint_8_typed),\n            const_uint_00ff00ff_typed),\n        builder_->createBinOp(\n            spv::OpShiftLeftLogical, type,\n            builder_->createBinOp(spv::OpBitwiseAnd, type, value,\n                                  const_uint_00ff00ff_typed),\n            const_uint_8_typed));\n  }\n  if_8in16.makeEndIf();\n  value = if_8in16.createMergePhi(swapped_8in16, value);\n\n  // 16-in-32 or another half of 8-in-32 (doing 16-in-32 swap).\n  spv::Id is_16in32 = builder_->createBinOp(\n      spv::OpIEqual, type_bool_, endian,\n      builder_->makeUintConstant(\n          static_cast<unsigned int>(xenos::Endian::k16in32)));\n  spv::Id is_8in32_or_16in32 =\n      builder_->createBinOp(spv::OpLogicalOr, type_bool_, is_8in32, is_16in32);\n  SpirvBuilder::IfBuilder if_16in32(is_8in32_or_16in32,\n                                    spv::SelectionControlMaskNone, *builder_);\n  spv::Id swapped_16in32;\n  {\n    swapped_16in32 = builder_->createQuadOp(\n        spv::OpBitFieldInsert, type,\n        builder_->createBinOp(spv::OpShiftRightLogical, type, value,\n                              const_uint_16_typed),\n        value, builder_->makeIntConstant(16), builder_->makeIntConstant(16));\n  }\n  if_16in32.makeEndIf();\n  value = if_16in32.createMergePhi(swapped_16in32, value);\n\n  return value;\n}\n\nspv::Id SpirvShaderTranslator::EndianSwap128Uint4(spv::Id value,\n                                                  spv::Id endian) {\n  // Change 8-in-64 and 8-in-128 to 8-in-32, and then swap within 32 bits.\n\n  spv::Id is_8in64 = builder_->createBinOp(\n      spv::OpIEqual, type_bool_, endian,\n      builder_->makeUintConstant(\n          static_cast<unsigned int>(xenos::Endian128::k8in64)));\n  uint_vector_temp_.clear();\n  uint_vector_temp_.push_back(1);\n  uint_vector_temp_.push_back(0);\n  uint_vector_temp_.push_back(3);\n  uint_vector_temp_.push_back(2);\n  value = builder_->createTriOp(\n      spv::OpSelect, type_uint4_, is_8in64,\n      builder_->createRvalueSwizzle(spv::NoPrecision, type_uint4_, value,\n                                    uint_vector_temp_),\n      value);\n\n  spv::Id is_8in128 = builder_->createBinOp(\n      spv::OpIEqual, type_bool_, endian,\n      builder_->makeUintConstant(\n          static_cast<unsigned int>(xenos::Endian128::k8in128)));\n  uint_vector_temp_.clear();\n  uint_vector_temp_.push_back(3);\n  uint_vector_temp_.push_back(2);\n  uint_vector_temp_.push_back(1);\n  uint_vector_temp_.push_back(0);\n  value = builder_->createTriOp(\n      spv::OpSelect, type_uint4_, is_8in128,\n      builder_->createRvalueSwizzle(spv::NoPrecision, type_uint4_, value,\n                                    uint_vector_temp_),\n      value);\n\n  endian = builder_->createTriOp(\n      spv::OpSelect, type_uint_,\n      builder_->createBinOp(spv::OpLogicalOr, type_bool_, is_8in64, is_8in128),\n      builder_->makeUintConstant(\n          static_cast<unsigned int>(xenos::Endian128::k8in32)),\n      endian);\n\n  return EndianSwap32Uint(value, endian);\n}\n\nspv::Id SpirvShaderTranslator::LoadUint32FromSharedMemory(\n    spv::Id address_dwords_int) {\n  spv::StorageClass storage_class = features_.spirv_version >= spv::Spv_1_3\n                                        ? spv::StorageClassStorageBuffer\n                                        : spv::StorageClassUniform;\n\n  uint32_t binding_count_log2 = GetSharedMemoryStorageBufferCountLog2();\n\n  if (!binding_count_log2) {\n    // Single binding - load directly.\n    id_vector_temp_.clear();\n    // The only SSBO struct member.\n    id_vector_temp_.push_back(const_int_0_);\n    id_vector_temp_.push_back(address_dwords_int);\n    return builder_->createLoad(\n        builder_->createAccessChain(storage_class, buffers_shared_memory_,\n                                    id_vector_temp_),\n        spv::NoPrecision);\n  }\n\n  // The memory is split into multiple bindings - check which binding to load\n  // from. 29 is log2(512 MB), but addressing in dwords (4 B). Not indexing the\n  // array with the variable itself because it needs non-uniform storage buffer\n  // indexing.\n\n  uint32_t binding_address_bits = (29 - 2) - binding_count_log2;\n  spv::Id binding_index = builder_->createBinOp(\n      spv::OpShiftRightLogical, type_uint_,\n      builder_->createUnaryOp(spv::OpBitcast, type_uint_, address_dwords_int),\n      builder_->makeUintConstant(binding_address_bits));\n  spv::Id binding_address = builder_->createBinOp(\n      spv::OpBitwiseAnd, type_int_, address_dwords_int,\n      builder_->makeIntConstant(\n          int((uint32_t(1) << binding_address_bits) - 1)));\n\n  auto value_phi_op = std::make_unique<spv::Instruction>(\n      builder_->getUniqueId(), type_uint_, spv::OpPhi);\n  // Zero if out of bounds.\n  value_phi_op->addIdOperand(const_uint_0_);\n  value_phi_op->addIdOperand(builder_->getBuildPoint()->getId());\n\n  SpirvBuilder::SwitchBuilder binding_switch(\n      binding_index, spv::SelectionControlDontFlattenMask, *builder_);\n  uint32_t binding_count = uint32_t(1) << binding_count_log2;\n\n  id_vector_temp_.clear();\n  id_vector_temp_.push_back(spv::NoResult);\n  // The only SSBO struct member.\n  id_vector_temp_.push_back(const_int_0_);\n  id_vector_temp_.push_back(binding_address);\n\n  for (uint32_t i = 0; i < binding_count; ++i) {\n    binding_switch.makeBeginCase(i);\n    id_vector_temp_[0] = builder_->makeIntConstant(int(i));\n    value_phi_op->addIdOperand(builder_->createLoad(\n        builder_->createAccessChain(storage_class, buffers_shared_memory_,\n                                    id_vector_temp_),\n        spv::NoPrecision));\n    value_phi_op->addIdOperand(builder_->getBuildPoint()->getId());\n  }\n\n  binding_switch.makeEndSwitch();\n\n  spv::Id value_phi_result = value_phi_op->getResultId();\n  builder_->getBuildPoint()->addInstruction(std::move(value_phi_op));\n  return value_phi_result;\n}\n\nvoid SpirvShaderTranslator::StoreUint32ToSharedMemory(\n    spv::Id value, spv::Id address_dwords_int, spv::Id replace_mask) {\n  spv::StorageClass storage_class = features_.spirv_version >= spv::Spv_1_3\n                                        ? spv::StorageClassStorageBuffer\n                                        : spv::StorageClassUniform;\n\n  spv::Id keep_mask = spv::NoResult;\n  if (replace_mask != spv::NoResult) {\n    keep_mask = builder_->createUnaryOp(spv::OpNot, type_uint_, replace_mask);\n    value = builder_->createBinOp(spv::OpBitwiseAnd, type_uint_, value,\n                                  replace_mask);\n  }\n\n  auto store = [&](spv::Id pointer) {\n    if (replace_mask != spv::NoResult) {\n      // Don't touch the other bits in the buffer, just modify the needed bits\n      // in the most up to date uint32 at the address.\n      spv::Id const_scope_device = builder_->makeUintConstant(\n          static_cast<unsigned int>(spv::ScopeDevice));\n      spv::Id const_semantics_relaxed = const_uint_0_;\n      builder_->createQuadOp(spv::OpAtomicAnd, type_uint_, pointer,\n                             const_scope_device, const_semantics_relaxed,\n                             keep_mask);\n      builder_->createQuadOp(spv::OpAtomicOr, type_uint_, pointer,\n                             const_scope_device, const_semantics_relaxed,\n                             value);\n    } else {\n      builder_->createStore(value, pointer);\n    }\n  };\n\n  uint32_t binding_count_log2 = GetSharedMemoryStorageBufferCountLog2();\n\n  if (!binding_count_log2) {\n    // Single binding - store directly.\n    id_vector_temp_.clear();\n    // The only SSBO struct member.\n    id_vector_temp_.push_back(const_int_0_);\n    id_vector_temp_.push_back(address_dwords_int);\n    store(builder_->createAccessChain(storage_class, buffers_shared_memory_,\n                                      id_vector_temp_));\n    return;\n  }\n\n  // The memory is split into multiple bindings - check which binding to store\n  // to. 29 is log2(512 MB), but addressing in dwords (4 B). Not indexing the\n  // array with the variable itself because it needs non-uniform storage buffer\n  // indexing.\n\n  uint32_t binding_address_bits = (29 - 2) - binding_count_log2;\n  spv::Id binding_index = builder_->createBinOp(\n      spv::OpShiftRightLogical, type_uint_,\n      builder_->createUnaryOp(spv::OpBitcast, type_uint_, address_dwords_int),\n      builder_->makeUintConstant(binding_address_bits));\n  spv::Id binding_address = builder_->createBinOp(\n      spv::OpBitwiseAnd, type_int_, address_dwords_int,\n      builder_->makeIntConstant(\n          int((uint32_t(1) << binding_address_bits) - 1)));\n\n  SpirvBuilder::SwitchBuilder binding_switch(\n      binding_index, spv::SelectionControlDontFlattenMask, *builder_);\n  uint32_t binding_count = uint32_t(1) << binding_count_log2;\n\n  id_vector_temp_.clear();\n  id_vector_temp_.push_back(spv::NoResult);\n  // The only SSBO struct member.\n  id_vector_temp_.push_back(const_int_0_);\n  id_vector_temp_.push_back(binding_address);\n\n  for (uint32_t i = 0; i < binding_count; ++i) {\n    binding_switch.makeBeginCase(i);\n    id_vector_temp_[0] = builder_->makeIntConstant(int(i));\n    store(builder_->createAccessChain(storage_class, buffers_shared_memory_,\n                                      id_vector_temp_));\n  }\n\n  binding_switch.makeEndSwitch();\n}\n\nspv::Id SpirvShaderTranslator::PWLGammaToLinear(spv::Id gamma,\n                                                bool gamma_pre_saturated) {\n  spv::Id value_type = builder_->getTypeId(gamma);\n  assert_true(builder_->isFloatType(builder_->getScalarTypeId(value_type)));\n  bool is_vector = builder_->isVectorType(value_type);\n  assert_true(is_vector || builder_->isFloatType(value_type));\n  int num_components = builder_->getNumTypeComponents(value_type);\n  assert_true(num_components < 4);\n  spv::Id bool_type = type_bool_vectors_[num_components - 1];\n\n  spv::Id const_vector_0 = const_float_vectors_0_[num_components - 1];\n  spv::Id const_vector_1 = SpirvSmearScalarResultOrConstant(\n      builder_->makeFloatConstant(1.0f), value_type);\n\n  if (!gamma_pre_saturated) {\n    // Saturate, flushing NaN to 0.\n    gamma = builder_->createTriBuiltinCall(value_type, ext_inst_glsl_std_450_,\n                                           GLSLstd450NClamp, gamma,\n                                           const_vector_0, const_vector_1);\n  }\n\n  spv::Id is_piece_at_least_3 = builder_->createBinOp(\n      spv::OpFOrdGreaterThanEqual, bool_type, gamma,\n      SpirvSmearScalarResultOrConstant(\n          builder_->makeFloatConstant(192.0f / 255.0f), value_type));\n  spv::Id scale_3_or_2 = builder_->createTriOp(\n      spv::OpSelect, value_type, is_piece_at_least_3,\n      SpirvSmearScalarResultOrConstant(\n          builder_->makeFloatConstant(8.0f / 1024.0f), value_type),\n      SpirvSmearScalarResultOrConstant(\n          builder_->makeFloatConstant(4.0f / 1024.0f), value_type));\n  spv::Id offset_3_or_2 = builder_->createTriOp(\n      spv::OpSelect, value_type, is_piece_at_least_3,\n      SpirvSmearScalarResultOrConstant(builder_->makeFloatConstant(-1024.0f),\n                                       value_type),\n      SpirvSmearScalarResultOrConstant(builder_->makeFloatConstant(-256.0f),\n                                       value_type));\n\n  spv::Id is_piece_at_least_1 = builder_->createBinOp(\n      spv::OpFOrdGreaterThanEqual, bool_type, gamma,\n      SpirvSmearScalarResultOrConstant(\n          builder_->makeFloatConstant(64.0f / 255.0f), value_type));\n  spv::Id scale_1_or_0 = builder_->createTriOp(\n      spv::OpSelect, value_type, is_piece_at_least_1,\n      SpirvSmearScalarResultOrConstant(\n          builder_->makeFloatConstant(2.0f / 1024.0f), value_type),\n      SpirvSmearScalarResultOrConstant(\n          builder_->makeFloatConstant(1.0f / 1024.0f), value_type));\n  spv::Id offset_1_or_0 = builder_->createTriOp(\n      spv::OpSelect, value_type, is_piece_at_least_1,\n      SpirvSmearScalarResultOrConstant(builder_->makeFloatConstant(-64.0f),\n                                       value_type),\n      const_vector_0);\n\n  spv::Id is_piece_at_least_2 = builder_->createBinOp(\n      spv::OpFOrdGreaterThanEqual, bool_type, gamma,\n      SpirvSmearScalarResultOrConstant(\n          builder_->makeFloatConstant(96.0f / 255.0f), value_type));\n  spv::Id scale =\n      builder_->createTriOp(spv::OpSelect, value_type, is_piece_at_least_2,\n                            scale_3_or_2, scale_1_or_0);\n  spv::Id offset =\n      builder_->createTriOp(spv::OpSelect, value_type, is_piece_at_least_2,\n                            offset_3_or_2, offset_1_or_0);\n\n  spv::Op value_times_scalar_opcode =\n      is_vector ? spv::OpVectorTimesScalar : spv::OpFMul;\n  // linear = gamma * (255.0f * 1024.0f) * scale + offset\n  spv::Id linear = builder_->createNoContractionBinOp(\n      spv::OpFAdd, value_type,\n      builder_->createNoContractionBinOp(\n          spv::OpFMul, value_type,\n          builder_->createNoContractionBinOp(\n              value_times_scalar_opcode, value_type, gamma,\n              builder_->makeFloatConstant(255.0f * 1024.0f)),\n          scale),\n      offset);\n  // linear += trunc(linear * scale)\n  linear = builder_->createNoContractionBinOp(\n      spv::OpFAdd, value_type, linear,\n      builder_->createUnaryBuiltinCall(\n          value_type, ext_inst_glsl_std_450_, GLSLstd450Trunc,\n          builder_->createNoContractionBinOp(spv::OpFMul, value_type, linear,\n                                             scale)));\n  // linear *= 1.0f / 1023.0f\n  linear = builder_->createNoContractionBinOp(\n      value_times_scalar_opcode, value_type, linear,\n      builder_->makeFloatConstant(1.0f / 1023.0f));\n  return linear;\n}\n\nspv::Id SpirvShaderTranslator::LinearToPWLGamma(spv::Id linear,\n                                                bool linear_pre_saturated) {\n  spv::Id value_type = builder_->getTypeId(linear);\n  assert_true(builder_->isFloatType(builder_->getScalarTypeId(value_type)));\n  bool is_vector = builder_->isVectorType(value_type);\n  assert_true(is_vector || builder_->isFloatType(value_type));\n  int num_components = builder_->getNumTypeComponents(value_type);\n  assert_true(num_components < 4);\n  spv::Id bool_type = type_bool_vectors_[num_components - 1];\n\n  spv::Id const_vector_0 = const_float_vectors_0_[num_components - 1];\n  spv::Id const_vector_1 = SpirvSmearScalarResultOrConstant(\n      builder_->makeFloatConstant(1.0f), value_type);\n\n  if (!linear_pre_saturated) {\n    // Saturate, flushing NaN to 0.\n    linear = builder_->createTriBuiltinCall(value_type, ext_inst_glsl_std_450_,\n                                            GLSLstd450NClamp, linear,\n                                            const_vector_0, const_vector_1);\n  }\n\n  spv::Id is_piece_at_least_3 = builder_->createBinOp(\n      spv::OpFOrdGreaterThanEqual, bool_type, linear,\n      SpirvSmearScalarResultOrConstant(\n          builder_->makeFloatConstant(512.0f / 1023.0f), value_type));\n  spv::Id scale_3_or_2 = builder_->createTriOp(\n      spv::OpSelect, value_type, is_piece_at_least_3,\n      SpirvSmearScalarResultOrConstant(\n          builder_->makeFloatConstant(1023.0f / 8.0f), value_type),\n      SpirvSmearScalarResultOrConstant(\n          builder_->makeFloatConstant(1023.0f / 4.0f), value_type));\n  spv::Id offset_3_or_2 = builder_->createTriOp(\n      spv::OpSelect, value_type, is_piece_at_least_3,\n      SpirvSmearScalarResultOrConstant(\n          builder_->makeFloatConstant(128.0f / 255.0f), value_type),\n      SpirvSmearScalarResultOrConstant(\n          builder_->makeFloatConstant(64.0f / 255.0f), value_type));\n\n  spv::Id is_piece_at_least_1 = builder_->createBinOp(\n      spv::OpFOrdGreaterThanEqual, bool_type, linear,\n      SpirvSmearScalarResultOrConstant(\n          builder_->makeFloatConstant(64.0f / 1023.0f), value_type));\n  spv::Id scale_1_or_0 = builder_->createTriOp(\n      spv::OpSelect, value_type, is_piece_at_least_1,\n      SpirvSmearScalarResultOrConstant(\n          builder_->makeFloatConstant(1023.0f / 2.0f), value_type),\n      SpirvSmearScalarResultOrConstant(builder_->makeFloatConstant(1023.0f),\n                                       value_type));\n  spv::Id offset_1_or_0 = builder_->createTriOp(\n      spv::OpSelect, value_type, is_piece_at_least_1,\n      SpirvSmearScalarResultOrConstant(\n          builder_->makeFloatConstant(32.0f / 255.0f), value_type),\n      const_vector_0);\n\n  spv::Id is_piece_at_least_2 = builder_->createBinOp(\n      spv::OpFOrdGreaterThanEqual, bool_type, linear,\n      SpirvSmearScalarResultOrConstant(\n          builder_->makeFloatConstant(128.0f / 1023.0f), value_type));\n  spv::Id scale =\n      builder_->createTriOp(spv::OpSelect, value_type, is_piece_at_least_2,\n                            scale_3_or_2, scale_1_or_0);\n  spv::Id offset =\n      builder_->createTriOp(spv::OpSelect, value_type, is_piece_at_least_2,\n                            offset_3_or_2, offset_1_or_0);\n\n  // gamma = trunc(linear * scale) * (1.0f / 255.0f) + offset\n  return builder_->createNoContractionBinOp(\n      spv::OpFAdd, value_type,\n      builder_->createNoContractionBinOp(\n          is_vector ? spv::OpVectorTimesScalar : spv::OpFMul, value_type,\n          builder_->createUnaryBuiltinCall(\n              value_type, ext_inst_glsl_std_450_, GLSLstd450Trunc,\n              builder_->createNoContractionBinOp(spv::OpFMul, value_type,\n                                                 linear, scale)),\n          builder_->makeFloatConstant(1.0f / 255.0f)),\n      offset);\n}\n\n}  // namespace gpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/spirv_shader_translator.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_SPIRV_SHADER_TRANSLATOR_H_\n#define XENIA_GPU_SPIRV_SHADER_TRANSLATOR_H_\n\n#include <array>\n#include <cstdint>\n#include <memory>\n#include <string>\n#include <utility>\n#include <vector>\n\n#include \"xenia/gpu/shader_translator.h\"\n#include \"xenia/gpu/spirv_builder.h\"\n#include \"xenia/gpu/xenos.h\"\n#include \"xenia/ui/vulkan/vulkan_device.h\"\n\nnamespace xe {\nnamespace gpu {\n\nclass SpirvShaderTranslator : public ShaderTranslator {\n public:\n  union Modification {\n    // If anything in this is structure is changed in a way not compatible with\n    // the previous layout, invalidate the pipeline storages by increasing this\n    // version number (0xYYYYMMDD)!\n    // TODO(Triang3l): Change to 0xYYYYMMDD once it's out of the rapid\n    // prototyping stage (easier to do small granular updates with an\n    // incremental counter).\n    static constexpr uint32_t kVersion = 6;\n\n    enum class DepthStencilMode : uint32_t {\n      kNoModifiers,\n      // Early fragment tests - enable if alpha test and alpha to coverage are\n      // disabled; ignored if anything in the shader blocks early Z writing.\n      kEarlyHint,\n      // TODO(Triang3l): Unorm24 (rounding) and float24 (truncating and\n      // rounding) output modes.\n    };\n\n    struct {\n      // uint32_t 0.\n      // Interpolators written by the vertex shader and needed by the pixel\n      // shader.\n      uint32_t interpolator_mask : xenos::kMaxInterpolators;\n      // For HostVertexShaderType kPointListAsTriangleStrip, whether to output\n      // the point coordinates.\n      // For other HostVertexShaderTypes (though truly reachable only for\n      // kVertex), whether to output the point size.\n      uint32_t output_point_parameters : 1;\n      // Dynamically indexable register count from SQ_PROGRAM_CNTL.\n      uint32_t dynamic_addressable_register_count : 8;\n      // Pipeline stage and input configuration.\n      Shader::HostVertexShaderType host_vertex_shader_type\n          : Shader::kHostVertexShaderTypeBitCount;\n    } vertex;\n    struct PixelShaderModification {\n      // uint32_t 0.\n      // Interpolators written by the vertex shader and needed by the pixel\n      // shader.\n      uint32_t interpolator_mask : xenos::kMaxInterpolators;\n      uint32_t interpolators_centroid : xenos::kMaxInterpolators;\n      // uint32_t 1.\n      // Dynamically indexable register count from SQ_PROGRAM_CNTL.\n      uint32_t dynamic_addressable_register_count : 8;\n      uint32_t param_gen_enable : 1;\n      uint32_t param_gen_interpolator : 4;\n      // If param_gen_enable is set, this must be set for point primitives, and\n      // must not be set for other primitive types - enables the point sprite\n      // coordinates input, and also effects the flag bits in PsParamGen.\n      uint32_t param_gen_point : 1;\n      // For host render targets - depth / stencil output mode.\n      DepthStencilMode depth_stencil_mode : 3;\n    } pixel;\n    uint64_t value = 0;\n\n    explicit Modification(uint64_t modification_value = 0)\n        : value(modification_value) {\n      static_assert_size(*this, sizeof(value));\n    }\n  };\n\n  enum : uint32_t {\n    kSysFlag_VertexIndexLoad_Shift,\n    kSysFlag_ComputeOrPrimitiveVertexIndexLoad_Shift,\n    kSysFlag_ComputeOrPrimitiveVertexIndexLoad32Bit_Shift,\n    kSysFlag_XYDividedByW_Shift,\n    kSysFlag_ZDividedByW_Shift,\n    kSysFlag_WNotReciprocal_Shift,\n    kSysFlag_PrimitivePolygonal_Shift,\n    kSysFlag_PrimitiveLine_Shift,\n    kSysFlag_MsaaSamples_Shift,\n    kSysFlag_DepthFloat24_Shift =\n        kSysFlag_MsaaSamples_Shift + xenos::kMsaaSamplesBits,\n    kSysFlag_AlphaPassIfLess_Shift,\n    kSysFlag_AlphaPassIfEqual_Shift,\n    kSysFlag_AlphaPassIfGreater_Shift,\n    kSysFlag_ConvertColor0ToGamma_Shift,\n    kSysFlag_ConvertColor1ToGamma_Shift,\n    kSysFlag_ConvertColor2ToGamma_Shift,\n    kSysFlag_ConvertColor3ToGamma_Shift,\n\n    kSysFlag_FSIDepthStencil_Shift,\n    kSysFlag_FSIDepthPassIfLess_Shift,\n    kSysFlag_FSIDepthPassIfEqual_Shift,\n    kSysFlag_FSIDepthPassIfGreater_Shift,\n    // 1 to write new depth to the depth buffer, 0 to keep the old one if the\n    // depth test passes.\n    kSysFlag_FSIDepthWrite_Shift,\n    kSysFlag_FSIStencilTest_Shift,\n    // If the depth / stencil test has failed, but resulted in a stencil value\n    // that is different than the one currently in the depth buffer, write it\n    // anyway and don't run the rest of the shader (to check if the sample may\n    // be discarded some way) - use when alpha test and alpha to coverage are\n    // disabled. Ignored by the shader if not applicable to it (like if it has\n    // kill instructions or writes the depth output).\n    // TODO(Triang3l): Investigate replacement with an alpha-to-mask flag,\n    // checking `(flags & (alpha test | alpha to mask)) == (always | disabled)`,\n    // taking into account the potential relation with occlusion queries (but\n    // should be safe at least temporarily).\n    kSysFlag_FSIDepthStencilEarlyWrite_Shift,\n\n    kSysFlag_Count,\n\n    // For HostVertexShaderType kVertex, if fullDrawIndexUint32 is not\n    // supported (ignored otherwise), whether to fetch the index manually\n    // (32-bit only - 16-bit indices are always fetched via the Vulkan index\n    // buffer).\n    kSysFlag_VertexIndexLoad = 1u << kSysFlag_VertexIndexLoad_Shift,\n    // For HostVertexShaderTypes kMemExportCompute, kPointListAsTriangleStrip,\n    // kRectangleListAsTriangleStrip, whether the vertex index needs to be\n    // loaded from the index buffer (rather than using autogenerated indices),\n    // and whether it's 32-bit. This is separate from kSysFlag_VertexIndexLoad\n    // because the same system constants may be used for the memexporting\n    // compute shader and the vertex shader for the same draw, but\n    // kSysFlag_VertexIndexLoad may be not needed.\n    kSysFlag_ComputeOrPrimitiveVertexIndexLoad =\n        1u << kSysFlag_ComputeOrPrimitiveVertexIndexLoad_Shift,\n    kSysFlag_ComputeOrPrimitiveVertexIndexLoad32Bit =\n        1u << kSysFlag_ComputeOrPrimitiveVertexIndexLoad32Bit_Shift,\n    kSysFlag_XYDividedByW = 1u << kSysFlag_XYDividedByW_Shift,\n    kSysFlag_ZDividedByW = 1u << kSysFlag_ZDividedByW_Shift,\n    kSysFlag_WNotReciprocal = 1u << kSysFlag_WNotReciprocal_Shift,\n    kSysFlag_PrimitivePolygonal = 1u << kSysFlag_PrimitivePolygonal_Shift,\n    kSysFlag_PrimitiveLine = 1u << kSysFlag_PrimitiveLine_Shift,\n    kSysFlag_DepthFloat24 = 1u << kSysFlag_DepthFloat24_Shift,\n    kSysFlag_AlphaPassIfLess = 1u << kSysFlag_AlphaPassIfLess_Shift,\n    kSysFlag_AlphaPassIfEqual = 1u << kSysFlag_AlphaPassIfEqual_Shift,\n    kSysFlag_AlphaPassIfGreater = 1u << kSysFlag_AlphaPassIfGreater_Shift,\n    kSysFlag_ConvertColor0ToGamma = 1u << kSysFlag_ConvertColor0ToGamma_Shift,\n    kSysFlag_ConvertColor1ToGamma = 1u << kSysFlag_ConvertColor1ToGamma_Shift,\n    kSysFlag_ConvertColor2ToGamma = 1u << kSysFlag_ConvertColor2ToGamma_Shift,\n    kSysFlag_ConvertColor3ToGamma = 1u << kSysFlag_ConvertColor3ToGamma_Shift,\n    kSysFlag_FSIDepthStencil = 1u << kSysFlag_FSIDepthStencil_Shift,\n    kSysFlag_FSIDepthPassIfLess = 1u << kSysFlag_FSIDepthPassIfLess_Shift,\n    kSysFlag_FSIDepthPassIfEqual = 1u << kSysFlag_FSIDepthPassIfEqual_Shift,\n    kSysFlag_FSIDepthPassIfGreater = 1u << kSysFlag_FSIDepthPassIfGreater_Shift,\n    kSysFlag_FSIDepthWrite = 1u << kSysFlag_FSIDepthWrite_Shift,\n    kSysFlag_FSIStencilTest = 1u << kSysFlag_FSIStencilTest_Shift,\n    kSysFlag_FSIDepthStencilEarlyWrite =\n        1u << kSysFlag_FSIDepthStencilEarlyWrite_Shift,\n  };\n  static_assert(kSysFlag_Count <= 32, \"Too many flags in the system constants\");\n\n  // IF SYSTEM CONSTANTS ARE CHANGED OR ADDED, THE FOLLOWING MUST BE UPDATED:\n  // - SystemConstantIndex enum.\n  // - Structure members in BeginTranslation.\n  //\n  // Using the std140 layout - vec2 must be aligned to 8 bytes, vec3 and vec4 to\n  // 16 bytes.\n  struct SystemConstants {\n    uint32_t flags;\n    uint32_t vertex_index_load_address;\n    xenos::Endian vertex_index_endian;\n    int32_t vertex_base_index;\n\n    float ndc_scale[3];\n    float point_vertex_diameter_min;\n\n    float ndc_offset[3];\n    float point_vertex_diameter_max;\n\n    float point_constant_diameter[2];\n    // Diameter in guest screen coordinates > radius (0.5 * diameter) in the NDC\n    // for the host viewport.\n    float point_screen_diameter_to_ndc_radius[2];\n\n    // Each byte contains post-swizzle TextureSign values for each of the needed\n    // components of each of the 32 used texture fetch constants.\n    uint32_t texture_swizzled_signs[8];\n\n    // If the imageViewFormatSwizzle portability subset is not supported, the\n    // component swizzle (taking both guest and host swizzles into account) to\n    // apply to the result directly in the shader code. In each uint32_t,\n    // swizzles for 2 texture fetch constants (in bits 0:11 and 12:23).\n    uint32_t texture_swizzles[16];\n\n    float alpha_test_reference;\n    uint32_t edram_32bpp_tile_pitch_dwords_scaled;\n    uint32_t edram_depth_base_dwords_scaled;\n    float padding_edram_depth_base_dwords_scaled;\n\n    float color_exp_bias[4];\n\n    float edram_poly_offset_front_scale;\n    float edram_poly_offset_back_scale;\n    float edram_poly_offset_front_offset;\n    float edram_poly_offset_back_offset;\n\n    union {\n      struct {\n        uint32_t edram_stencil_front_reference_masks;\n        uint32_t edram_stencil_front_func_ops;\n\n        uint32_t edram_stencil_back_reference_masks;\n        uint32_t edram_stencil_back_func_ops;\n      };\n      struct {\n        uint32_t edram_stencil_front[2];\n        uint32_t edram_stencil_back[2];\n      };\n    };\n\n    uint32_t edram_rt_base_dwords_scaled[4];\n\n    // RT format combined with RenderTargetCache::kPSIColorFormatFlag values\n    // (pass via RenderTargetCache::AddPSIColorFormatFlags).\n    uint32_t edram_rt_format_flags[4];\n\n    // Render target blending options - RB_BLENDCONTROL, with only the relevant\n    // options (factors and operations - AND 0x1FFF1FFF). If 0x00010001\n    // (1 * src + 0 * dst), blending is disabled for the render target.\n    uint32_t edram_rt_blend_factors_ops[4];\n\n    // Format info - mask to apply to the old packed RT data, and to apply as\n    // inverted to the new packed data, before storing (more or less the inverse\n    // of the write mask packed like render target channels). This can be used\n    // to bypass unpacking if blending is not used. If 0 and not blending,\n    // reading the old data from the EDRAM buffer is not required.\n    uint32_t edram_rt_keep_mask[4][2];\n\n    // Format info - values to clamp the color to before blending or storing.\n    // Low color, low alpha, high color, high alpha.\n    float edram_rt_clamp[4][4];\n\n    // The constant blend factor for the respective modes.\n    float edram_blend_constant[4];\n  };\n\n  enum ConstantBuffer : uint32_t {\n    kConstantBufferSystem,\n    kConstantBufferFloatVertex,\n    kConstantBufferFloatPixel,\n    kConstantBufferBoolLoop,\n    kConstantBufferFetch,\n\n    kConstantBufferCount,\n  };\n\n  // The minimum limit for maxPerStageDescriptorStorageBuffers is 4, and for\n  // maxStorageBufferRange it's 128 MB. These are the values of those limits on\n  // Arm Mali as of November 2020. Xenia needs 512 MB shared memory to be bound,\n  // therefore SSBOs must only be used for shared memory - all other storage\n  // resources must be images or texel buffers.\n  enum DescriptorSet : uint32_t {\n    // According to the \"Pipeline Layout Compatibility\" section of the Vulkan\n    // specification:\n    // \"Two pipeline layouts are defined to be \"compatible for set N\" if they\n    //  were created with identically defined descriptor set layouts for sets\n    //  zero through N, and if they were created with identical push constant\n    //  ranges.\"\n    // \"Place the least frequently changing descriptor sets near the start of\n    //  the pipeline layout, and place the descriptor sets representing the most\n    //  frequently changing resources near the end. When pipelines are switched,\n    //  only the descriptor set bindings that have been invalidated will need to\n    //  be updated and the remainder of the descriptor set bindings will remain\n    //  in place.\"\n    // This is partially the reverse of the Direct3D 12's rule of placing the\n    // most frequently changed descriptor sets in the beginning. Here all\n    // descriptor sets with an immutable layout are placed first, in reverse\n    // frequency of changing, and sets that may be different for different\n    // pipeline states last.\n\n    // Always the same descriptor set layouts for all pipeline layouts:\n\n    // Never changed.\n    kDescriptorSetSharedMemoryAndEdram,\n    // Changed in case of changes in the data.\n    kDescriptorSetConstants,\n\n    // Mutable part of the pipeline layout:\n    kDescriptorSetMutableLayoutsStart,\n\n    // Rarely used at all, but may be changed at an unpredictable rate when\n    // vertex textures are used (for example, for bones of an object, which may\n    // consist of multiple draw commands with different materials).\n    kDescriptorSetTexturesVertex = kDescriptorSetMutableLayoutsStart,\n    // Per-material textures.\n    kDescriptorSetTexturesPixel,\n\n    kDescriptorSetCount,\n  };\n  static_assert(\n      kDescriptorSetCount <= 4,\n      \"The number of descriptor sets used by translated shaders must be within \"\n      \"the minimum Vulkan maxBoundDescriptorSets requirement of 4, which is \"\n      \"the limit on most GPUs used in Android devices - Arm Mali, Imagination \"\n      \"PowerVR, Qualcomm Adreno 6xx and older, as well as on old PC Nvidia \"\n      \"drivers\");\n\n  // \"Xenia Emulator Microcode Translator\".\n  // https://github.com/KhronosGroup/SPIRV-Headers/blob/c43a43c7cc3af55910b9bec2a71e3e8a622443cf/include/spirv/spir-v.xml#L79\n  static constexpr uint32_t kSpirvMagicToolId = 26;\n\n  struct Features {\n    explicit Features(const ui::vulkan::VulkanDevice* vulkan_device);\n    explicit Features(bool all = false);\n\n    unsigned int spirv_version;\n\n    uint32_t max_storage_buffer_range;\n\n    bool full_draw_index_uint32;\n\n    bool vertex_pipeline_stores_and_atomics;\n    bool fragment_stores_and_atomics;\n\n    bool clip_distance;\n    bool cull_distance;\n\n    bool image_view_format_swizzle;\n\n    bool signed_zero_inf_nan_preserve_float32;\n    bool denorm_flush_to_zero_float32;\n    bool rounding_mode_rte_float32;\n\n    bool fragment_shader_sample_interlock;\n\n    bool demote_to_helper_invocation;\n  };\n\n  SpirvShaderTranslator(const Features& features,\n                        bool native_2x_msaa_with_attachments,\n                        bool native_2x_msaa_no_attachments,\n                        bool edram_fragment_shader_interlock)\n      : features_(features),\n        native_2x_msaa_with_attachments_(native_2x_msaa_with_attachments),\n        native_2x_msaa_no_attachments_(native_2x_msaa_no_attachments),\n        edram_fragment_shader_interlock_(edram_fragment_shader_interlock) {}\n\n  uint64_t GetDefaultVertexShaderModification(\n      uint32_t dynamic_addressable_register_count,\n      Shader::HostVertexShaderType host_vertex_shader_type =\n          Shader::HostVertexShaderType::kVertex) const override;\n  uint64_t GetDefaultPixelShaderModification(\n      uint32_t dynamic_addressable_register_count) const override;\n\n  static constexpr uint32_t GetSharedMemoryStorageBufferCountLog2(\n      uint32_t max_storage_buffer_range) {\n    if (max_storage_buffer_range >= 512 * 1024 * 1024) {\n      return 0;\n    }\n    if (max_storage_buffer_range >= 256 * 1024 * 1024) {\n      return 1;\n    }\n    return 2;\n  }\n  uint32_t GetSharedMemoryStorageBufferCountLog2() const {\n    return GetSharedMemoryStorageBufferCountLog2(\n        features_.max_storage_buffer_range);\n  }\n\n  // Creates a special fragment shader without color outputs - this resets the\n  // state of the translator.\n  std::vector<uint8_t> CreateDepthOnlyFragmentShader();\n\n  // Common functions useful not only for the translator, but also for EDRAM\n  // emulation via conventional render targets.\n\n  // Converts the color value externally clamped to [0, 31.875] to 7e3 floating\n  // point, with zeros in bits 10:31, rounding to the nearest even.\n  static spv::Id PreClampedFloat32To7e3(SpirvBuilder& builder,\n                                        spv::Id f32_scalar,\n                                        spv::Id ext_inst_glsl_std_450);\n  // Same as PreClampedFloat32To7e3, but clamps the input to [0, 31.875].\n  static spv::Id UnclampedFloat32To7e3(SpirvBuilder& builder,\n                                       spv::Id f32_scalar,\n                                       spv::Id ext_inst_glsl_std_450);\n  // Converts the 7e3 number in bits [f10_shift, f10_shift + 10) to a 32-bit\n  // float.\n  static spv::Id Float7e3To32(SpirvBuilder& builder, spv::Id f10_uint_scalar,\n                              uint32_t f10_shift, bool result_as_uint,\n                              spv::Id ext_inst_glsl_std_450);\n  // Converts the depth value externally clamped to the representable [0, 2)\n  // range to 20e4 floating point, with zeros in bits 24:31, rounding to the\n  // nearest even or towards zero. If remap_from_0_to_0_5 is true, it's assumed\n  // that 0...1 is pre-remapped to 0...0.5 in the input.\n  static spv::Id PreClampedDepthTo20e4(SpirvBuilder& builder,\n                                       spv::Id f32_scalar,\n                                       bool round_to_nearest_even,\n                                       bool remap_from_0_to_0_5,\n                                       spv::Id ext_inst_glsl_std_450);\n  // Converts the 20e4 number in bits [f24_shift, f24_shift + 10) to a 32-bit\n  // float.\n  static spv::Id Depth20e4To32(SpirvBuilder& builder, spv::Id f24_uint_scalar,\n                               uint32_t f24_shift, bool remap_to_0_to_0_5,\n                               bool result_as_uint,\n                               spv::Id ext_inst_glsl_std_450);\n\n protected:\n  void Reset() override;\n\n  uint32_t GetModificationRegisterCount() const override;\n\n  void StartTranslation() override;\n\n  std::vector<uint8_t> CompleteTranslation() override;\n\n  void PostTranslation() override;\n\n  void ProcessLabel(uint32_t cf_index) override;\n\n  void ProcessExecInstructionBegin(const ParsedExecInstruction& instr) override;\n  void ProcessExecInstructionEnd(const ParsedExecInstruction& instr) override;\n  void ProcessLoopStartInstruction(\n      const ParsedLoopStartInstruction& instr) override;\n  void ProcessLoopEndInstruction(\n      const ParsedLoopEndInstruction& instr) override;\n  void ProcessJumpInstruction(const ParsedJumpInstruction& instr) override;\n  void ProcessAllocInstruction(const ParsedAllocInstruction& instr,\n                               uint8_t export_eM) override;\n\n  void ProcessVertexFetchInstruction(\n      const ParsedVertexFetchInstruction& instr) override;\n  void ProcessTextureFetchInstruction(\n      const ParsedTextureFetchInstruction& instr) override;\n  void ProcessAluInstruction(\n      const ParsedAluInstruction& instr,\n      uint8_t memexport_eM_potentially_written_before) override;\n\n private:\n  struct TextureBinding {\n    uint32_t fetch_constant;\n    // Stacked and 3D are separate TextureBindings.\n    xenos::FetchOpDimension dimension;\n    bool is_signed;\n\n    spv::Id variable;\n  };\n\n  struct SamplerBinding {\n    uint32_t fetch_constant;\n    xenos::TextureFilter mag_filter;\n    xenos::TextureFilter min_filter;\n    xenos::TextureFilter mip_filter;\n    xenos::AnisoFilter aniso_filter;\n\n    spv::Id variable;\n  };\n\n  // Builder helpers.\n  spv::Id SpirvSmearScalarResultOrConstant(spv::Id scalar, spv::Id vector_type);\n\n  Modification GetSpirvShaderModification() const {\n    return Modification(current_translation().modification());\n  }\n\n  bool IsSpirvVertexShader() const {\n    return is_vertex_shader() &&\n           !Shader::IsHostVertexShaderTypeDomain(\n               GetSpirvShaderModification().vertex.host_vertex_shader_type);\n  }\n  bool IsSpirvTessEvalShader() const {\n    return is_vertex_shader() &&\n           Shader::IsHostVertexShaderTypeDomain(\n               GetSpirvShaderModification().vertex.host_vertex_shader_type);\n  }\n  bool IsSpirvComputeShader() const {\n    return is_vertex_shader() &&\n           GetSpirvShaderModification().vertex.host_vertex_shader_type ==\n               Shader::HostVertexShaderType::kMemExportCompute;\n  }\n\n  bool IsExecutionModeEarlyFragmentTests() const {\n    return is_pixel_shader() &&\n           GetSpirvShaderModification().pixel.depth_stencil_mode ==\n               Modification::DepthStencilMode::kEarlyHint &&\n           !edram_fragment_shader_interlock_ &&\n           current_shader().implicit_early_z_write_allowed();\n  }\n\n  uint32_t GetModificationInterpolatorMask() const {\n    Modification modification = GetSpirvShaderModification();\n    return is_vertex_shader() ? modification.vertex.interpolator_mask\n                              : modification.pixel.interpolator_mask;\n  }\n\n  // Returns UINT32_MAX if PsParamGen doesn't need to be written.\n  uint32_t GetPsParamGenInterpolator() const;\n\n  // Must be called before emitting any SPIR-V operations that must be in a\n  // block in translator callbacks to ensure that if the last instruction added\n  // was something like OpBranch - in this case, an unreachable block is\n  // created.\n  void EnsureBuildPointAvailable();\n\n  void StartVertexOrTessEvalShaderBeforeMain();\n  void StartVertexOrTessEvalShaderInMain();\n  void CompleteVertexOrTessEvalShaderInMain();\n\n  void StartFragmentShaderBeforeMain();\n  void StartFragmentShaderInMain();\n  void CompleteFragmentShaderInMain();\n\n  // Updates the current flow control condition (to be called in the beginning\n  // of exec and in jumps), closing the previous conditionals if needed.\n  // However, if the condition is not different, the instruction-level predicate\n  // conditional also won't be closed - this must be checked separately if\n  // needed (for example, in jumps).\n  void UpdateExecConditionals(ParsedExecInstruction::Type type,\n                              uint32_t bool_constant_index, bool condition);\n  // Opens or reopens the predicate check conditional for the instruction.\n  // Should be called before processing a non-control-flow instruction.\n  void UpdateInstructionPredication(bool predicated, bool condition);\n  // Closes the instruction-level predicate conditional if it's open, useful if\n  // a control flow instruction needs to do some code which needs to respect the\n  // current exec conditional, but can't itself be predicated.\n  void CloseInstructionPredication();\n  // Closes conditionals opened by exec and instructions within them (but not by\n  // labels) and updates the state accordingly.\n  void CloseExecConditionals();\n\n  spv::Id GetStorageAddressingIndex(\n      InstructionStorageAddressingMode addressing_mode, uint32_t storage_index,\n      bool is_float_constant = false);\n  // Loads unswizzled operand without sign modifiers as float4.\n  spv::Id LoadOperandStorage(const InstructionOperand& operand);\n  spv::Id ApplyOperandModifiers(spv::Id operand_value,\n                                const InstructionOperand& original_operand,\n                                bool invert_negate = false,\n                                bool force_absolute = false);\n  // Returns the requested components, with the operand's swizzle applied, in a\n  // condensed form, but without negation / absolute value modifiers. The\n  // storage is float4, no matter what the component count of original_operand\n  // is (the storage will be either r# or c#, but the instruction may be\n  // scalar).\n  spv::Id GetUnmodifiedOperandComponents(\n      spv::Id operand_storage, const InstructionOperand& original_operand,\n      uint32_t components);\n  spv::Id GetOperandComponents(spv::Id operand_storage,\n                               const InstructionOperand& original_operand,\n                               uint32_t components, bool invert_negate = false,\n                               bool force_absolute = false) {\n    return ApplyOperandModifiers(\n        GetUnmodifiedOperandComponents(operand_storage, original_operand,\n                                       components),\n        original_operand, invert_negate, force_absolute);\n  }\n  // If components are identical, the same Id will be written to both outputs.\n  void GetOperandScalarXY(spv::Id operand_storage,\n                          const InstructionOperand& original_operand,\n                          spv::Id& a_out, spv::Id& b_out,\n                          bool invert_negate = false,\n                          bool force_absolute = false);\n  // Gets the absolute value of the loaded operand if it's not absolute already.\n  spv::Id GetAbsoluteOperand(spv::Id operand_storage,\n                             const InstructionOperand& original_operand);\n  // The type of the value must be a float vector consisting of\n  // xe::bit_count(result.GetUsedResultComponents()) elements, or (to replicate\n  // a scalar into all used components) float, or the value can be spv::NoResult\n  // if there's no result to store (like constants only).\n  void StoreResult(const InstructionResult& result, spv::Id value);\n\n  // For Shader Model 3 multiplication (+-0 or denormal * anything = +0),\n  // replaces the value with +0 if the minimum of the two operands is 0. This\n  // must be called with absolute values of operands - use GetAbsoluteOperand!\n  spv::Id ZeroIfAnyOperandIsZero(spv::Id value, spv::Id operand_0_abs,\n                                 spv::Id operand_1_abs);\n  // Conditionally discard the current fragment. Changes the build point.\n  void KillPixel(spv::Id condition,\n                 uint8_t memexport_eM_potentially_written_before);\n  // Return type is a xe::bit_count(result.GetUsedResultComponents())-component\n  // float vector or a single float, depending on whether it's a reduction\n  // instruction (check getTypeId of the result), or returns spv::NoResult if\n  // nothing to store.\n  spv::Id ProcessVectorAluOperation(\n      const ParsedAluInstruction& instr,\n      uint8_t memexport_eM_potentially_written_before, bool& predicate_written);\n  // Returns a float value to write to the previous scalar register and to the\n  // destination. If the return value is ps itself (in the retain_prev case),\n  // returns spv::NoResult (handled as a special case, so if it's retain_prev,\n  // but don't need to write to anywhere, no OpLoad(ps) will be done).\n  spv::Id ProcessScalarAluOperation(\n      const ParsedAluInstruction& instr,\n      uint8_t memexport_eM_potentially_written_before, bool& predicate_written);\n\n  // Perform endian swap of a uint scalar or vector.\n  spv::Id EndianSwap32Uint(spv::Id value, spv::Id endian);\n  // Perform endian swap of a uint4 vector.\n  spv::Id EndianSwap128Uint4(spv::Id value, spv::Id endian);\n\n  spv::Id LoadUint32FromSharedMemory(spv::Id address_dwords_int);\n  // If `replace_mask` is provided, the bits specified in the mask will be\n  // replaced with those from the value via OpAtomicAnd/Or.\n  // Bits of `value` not in `replace_mask` will be ignored.\n  void StoreUint32ToSharedMemory(spv::Id value, spv::Id address_dwords_int,\n                                 spv::Id replace_mask = spv::NoResult);\n\n  bool IsMemoryExportSupported() const {\n    if (is_pixel_shader()) {\n      return features_.fragment_stores_and_atomics;\n    }\n    return features_.vertex_pipeline_stores_and_atomics ||\n           IsSpirvComputeShader();\n  }\n\n  bool IsMemoryExportUsed() const {\n    return current_shader().memexport_eM_written() && IsMemoryExportSupported();\n  }\n\n  void ExportToMemory(uint8_t export_eM);\n\n  // The source may be a floating-point scalar or a vector.\n  spv::Id PWLGammaToLinear(spv::Id gamma, bool gamma_pre_saturated);\n  spv::Id LinearToPWLGamma(spv::Id linear, bool linear_pre_saturated);\n\n  size_t FindOrAddTextureBinding(uint32_t fetch_constant,\n                                 xenos::FetchOpDimension dimension,\n                                 bool is_signed);\n  size_t FindOrAddSamplerBinding(uint32_t fetch_constant,\n                                 xenos::TextureFilter mag_filter,\n                                 xenos::TextureFilter min_filter,\n                                 xenos::TextureFilter mip_filter,\n                                 xenos::AnisoFilter aniso_filter);\n  // `texture_parameters` need to be set up except for `sampler`, which will be\n  // set internally, optionally doing linear interpolation between the an\n  // existing value and the new one (the result location may be the same as for\n  // the first lerp endpoint, but not across signedness).\n  void SampleTexture(spv::Builder::TextureParameters& texture_parameters,\n                     spv::ImageOperandsMask image_operands_mask,\n                     spv::Id image_unsigned, spv::Id image_signed,\n                     spv::Id sampler, spv::Id is_any_unsigned,\n                     spv::Id is_any_signed, spv::Id& result_unsigned_out,\n                     spv::Id& result_signed_out,\n                     spv::Id lerp_factor = spv::NoResult,\n                     spv::Id lerp_first_unsigned = spv::NoResult,\n                     spv::Id lerp_first_signed = spv::NoResult);\n  // `texture_parameters` need to be set up except for `sampler`, which will be\n  // set internally.\n  spv::Id QueryTextureLod(spv::Builder::TextureParameters& texture_parameters,\n                          spv::Id image_unsigned, spv::Id image_signed,\n                          spv::Id sampler, spv::Id is_all_signed);\n\n  spv::Id LoadMsaaSamplesFromFlags();\n  // Whether it's possible and worth skipping running the translated shader for\n  // 2x2 quads.\n  bool FSI_IsDepthStencilEarly() const {\n    assert_true(edram_fragment_shader_interlock_);\n    return !is_depth_only_fragment_shader_ &&\n           !current_shader().writes_depth() &&\n           !current_shader().memexport_eM_written();\n  }\n  void FSI_LoadSampleMask(spv::Id msaa_samples);\n  void FSI_LoadEdramOffsets(spv::Id msaa_samples);\n  // The address must be a signed int. Whether the render target is 64bpp, if\n  // present at all, must be a bool (if it's NoResult, 32bpp will be assumed).\n  spv::Id FSI_AddSampleOffset(spv::Id sample_0_address, uint32_t sample_index,\n                              spv::Id is_64bpp = spv::NoResult);\n  // Updates main_fsi_sample_mask_. Must be called outside non-uniform control\n  // flow because of taking derivatives of the fragment depth.\n  void FSI_DepthStencilTest(spv::Id msaa_samples,\n                            bool sample_mask_potentially_narrowed_previouly);\n  // Returns the first and the second 32 bits as two uints.\n  std::array<spv::Id, 2> FSI_ClampAndPackColor(spv::Id color_float4,\n                                               spv::Id format_with_flags);\n  std::array<spv::Id, 4> FSI_UnpackColor(std::array<spv::Id, 2> color_packed,\n                                         spv::Id format_with_flags);\n  // The bounds must have the same number of components as the color or alpha.\n  spv::Id FSI_FlushNaNClampAndInBlending(spv::Id color_or_alpha,\n                                         spv::Id is_fixed_point,\n                                         spv::Id min_value, spv::Id max_value);\n  spv::Id FSI_ApplyColorBlendFactor(spv::Id value, spv::Id is_fixed_point,\n                                    spv::Id clamp_min_value,\n                                    spv::Id clamp_max_value, spv::Id factor,\n                                    spv::Id source_color, spv::Id source_alpha,\n                                    spv::Id dest_color, spv::Id dest_alpha,\n                                    spv::Id constant_color,\n                                    spv::Id constant_alpha);\n  spv::Id FSI_ApplyAlphaBlendFactor(spv::Id value, spv::Id is_fixed_point,\n                                    spv::Id clamp_min_value,\n                                    spv::Id clamp_max_value, spv::Id factor,\n                                    spv::Id source_alpha, spv::Id dest_alpha,\n                                    spv::Id constant_alpha);\n  // If source_color_clamped, dest_color, constant_color_clamped are\n  // spv::NoResult, will blend the alpha. Otherwise, will blend the color.\n  // The result will be unclamped (color packing is supposed to clamp it).\n  spv::Id FSI_BlendColorOrAlphaWithUnclampedResult(\n      spv::Id is_fixed_point, spv::Id clamp_min_value, spv::Id clamp_max_value,\n      spv::Id source_color_clamped, spv::Id source_alpha_clamped,\n      spv::Id dest_color, spv::Id dest_alpha, spv::Id constant_color_clamped,\n      spv::Id constant_alpha_clamped, spv::Id equation, spv::Id source_factor,\n      spv::Id dest_factor);\n\n  Features features_;\n  bool native_2x_msaa_with_attachments_;\n  bool native_2x_msaa_no_attachments_;\n\n  // For safety with different drivers (even though fragment shader interlock in\n  // SPIR-V only has one control flow requirement - that both begin and end must\n  // be dynamically executed exactly once in this order), adhering to the more\n  // strict control flow limitations of OpenGL (GLSL) fragment shader interlock,\n  // that begin and end are called only on the outermost level of the control\n  // flow of the main function, and that there are no returns before either\n  // (there's a single return from the shader).\n  bool edram_fragment_shader_interlock_;\n\n  // Is currently writing the empty depth-only pixel shader, such as for depth\n  // and stencil testing with fragment shader interlock.\n  bool is_depth_only_fragment_shader_ = false;\n\n  std::unique_ptr<SpirvBuilder> builder_;\n\n  std::vector<spv::Id> id_vector_temp_;\n  // For helper functions like operand loading, so they don't conflict with\n  // id_vector_temp_ usage in bigger callbacks.\n  std::vector<spv::Id> id_vector_temp_util_;\n  std::vector<unsigned int> uint_vector_temp_;\n  std::vector<unsigned int> uint_vector_temp_util_;\n\n  spv::Id ext_inst_glsl_std_450_;\n\n  spv::Id type_void_;\n\n  union {\n    struct {\n      spv::Id type_bool_;\n      spv::Id type_bool2_;\n      spv::Id type_bool3_;\n      spv::Id type_bool4_;\n    };\n    // Index = component count - 1.\n    spv::Id type_bool_vectors_[4];\n  };\n  union {\n    struct {\n      spv::Id type_int_;\n      spv::Id type_int2_;\n      spv::Id type_int3_;\n      spv::Id type_int4_;\n    };\n    spv::Id type_int_vectors_[4];\n  };\n  union {\n    struct {\n      spv::Id type_uint_;\n      spv::Id type_uint2_;\n      spv::Id type_uint3_;\n      spv::Id type_uint4_;\n    };\n    spv::Id type_uint_vectors_[4];\n  };\n  union {\n    struct {\n      spv::Id type_float_;\n      spv::Id type_float2_;\n      spv::Id type_float3_;\n      spv::Id type_float4_;\n    };\n    spv::Id type_float_vectors_[4];\n  };\n\n  spv::Id const_int_0_;\n  spv::Id const_int4_0_;\n  spv::Id const_uint_0_;\n  spv::Id const_uint4_0_;\n  union {\n    struct {\n      spv::Id const_float_0_;\n      spv::Id const_float2_0_;\n      spv::Id const_float3_0_;\n      spv::Id const_float4_0_;\n    };\n    spv::Id const_float_vectors_0_[4];\n  };\n  union {\n    struct {\n      spv::Id const_float_1_;\n      spv::Id const_float2_1_;\n      spv::Id const_float3_1_;\n      spv::Id const_float4_1_;\n    };\n    spv::Id const_float_vectors_1_[4];\n  };\n  // vec2(0.0, 1.0), to arbitrarily VectorShuffle non-constant and constant\n  // components.\n  spv::Id const_float2_0_1_;\n\n  enum SystemConstantIndex : unsigned int {\n    kSystemConstantFlags,\n    kSystemConstantVertexIndexLoadAddress,\n    kSystemConstantVertexIndexEndian,\n    kSystemConstantVertexBaseIndex,\n    kSystemConstantNdcScale,\n    kSystemConstantPointVertexDiameterMin,\n    kSystemConstantNdcOffset,\n    kSystemConstantPointVertexDiameterMax,\n    kSystemConstantPointConstantDiameter,\n    kSystemConstantPointScreenDiameterToNdcRadius,\n    kSystemConstantTextureSwizzledSigns,\n    kSystemConstantTextureSwizzles,\n    kSystemConstantAlphaTestReference,\n    kSystemConstantEdram32bppTilePitchDwordsScaled,\n    kSystemConstantEdramDepthBaseDwordsScaled,\n    kSystemConstantColorExpBias,\n    kSystemConstantEdramPolyOffsetFrontScale,\n    kSystemConstantEdramPolyOffsetBackScale,\n    kSystemConstantEdramPolyOffsetFrontOffset,\n    kSystemConstantEdramPolyOffsetBackOffset,\n    kSystemConstantEdramStencilFront,\n    kSystemConstantEdramStencilBack,\n    kSystemConstantEdramRTBaseDwordsScaled,\n    kSystemConstantEdramRTFormatFlags,\n    kSystemConstantEdramRTBlendFactorsOps,\n    // Accessed as float4[2], not float2[4], due to std140 array stride\n    // alignment.\n    kSystemConstantEdramRTKeepMask,\n    kSystemConstantEdramRTClamp,\n    kSystemConstantEdramBlendConstant,\n  };\n  spv::Id uniform_system_constants_;\n  spv::Id uniform_float_constants_;\n  spv::Id uniform_bool_loop_constants_;\n  spv::Id uniform_fetch_constants_;\n\n  spv::Id buffers_shared_memory_;\n  spv::Id buffer_edram_;\n\n  // Not using combined images and samplers because\n  // maxPerStageDescriptorSamplers is often lower than\n  // maxPerStageDescriptorSampledImages, and for every fetch constant, there\n  // are, for regular fetches, two bindings (unsigned and signed).\n  std::vector<TextureBinding> texture_bindings_;\n  std::vector<SamplerBinding> sampler_bindings_;\n\n  // VS as VS only - int.\n  spv::Id input_vertex_index_;\n  // VS as TES only - int.\n  spv::Id input_primitive_id_;\n  // PS, only when needed - float2.\n  spv::Id input_point_coordinates_;\n  // PS, only when needed - float4.\n  spv::Id input_fragment_coordinates_;\n  // PS, only when needed - bool.\n  spv::Id input_front_facing_;\n  // PS, only when needed - int[1].\n  spv::Id input_sample_mask_;\n\n  // VS output or PS input, only the ones that are needed (spv::NoResult for the\n  // unneeded interpolators), indexed by the guest interpolator index - float4.\n  // The Qualcomm Adreno driver has strict requirements for stage linkage - as\n  // Xenia uses separate variables, not an array (so the interpolation\n  // qualifiers can be applied to each element separately), the interpolators\n  // must also be separate variables in the other stage, including the geometry\n  // shader (not just an array assuming that consecutive locations will be\n  // linked as consecutive array elements, on Qualcomm, they won't be linked at\n  // all).\n  std::array<spv::Id, xenos::kMaxInterpolators> input_output_interpolators_;\n\n  // VS, only for HostVertexShaderType::kPointListAsTriangleStrip when needed\n  // for the PS - float2.\n  spv::Id output_point_coordinates_;\n  // VS, only when needed - float.\n  spv::Id output_point_size_;\n\n  enum OutputPerVertexMember : unsigned int {\n    kOutputPerVertexMemberPosition,\n    kOutputPerVertexMemberCount,\n  };\n  spv::Id output_per_vertex_;\n\n  // With fragment shader interlock, variables in the main function.\n  // Otherwise, framebuffer color attachment outputs.\n  std::array<spv::Id, xenos::kMaxColorRenderTargets>\n      output_or_var_fragment_data_;\n\n  std::vector<spv::Id> main_interface_;\n  spv::Function* function_main_;\n  spv::Id main_system_constant_flags_;\n  // bool.\n  spv::Id var_main_predicate_;\n  // uint4.\n  spv::Id var_main_loop_count_;\n  // int4.\n  spv::Id var_main_loop_address_;\n  // int.\n  spv::Id var_main_address_register_;\n  // float.\n  spv::Id var_main_previous_scalar_;\n  // `base + index * stride` in dwords from the last vfetch_full as it may be\n  // needed by vfetch_mini - int.\n  spv::Id var_main_vfetch_address_;\n  // float.\n  spv::Id var_main_tfetch_lod_;\n  // float3.\n  spv::Id var_main_tfetch_gradients_h_;\n  spv::Id var_main_tfetch_gradients_v_;\n  // float4[register_count()].\n  spv::Id var_main_registers_;\n  // Memory export variables are created only when needed.\n  // float4.\n  spv::Id var_main_memexport_address_;\n  // Each is float4.\n  spv::Id var_main_memexport_data_[ucode::kMaxMemExportElementCount];\n  // Bit field of which eM# elements have been written so far by the invocation\n  // since the last memory write - uint.\n  spv::Id var_main_memexport_data_written_;\n  // If memory export is disabled in certain invocations or (if emulating some\n  // primitive types without a geometry shader) at specific guest vertex loop\n  // iterations because the translated shader is executed multiple times for the\n  // same guest vertex or pixel, this contains whether memory export is allowed\n  // in the current execution of the translated code.\n  // bool.\n  spv::Id main_memexport_allowed_;\n  // VS only - float3 (special exports).\n  spv::Id var_main_point_size_edge_flag_kill_vertex_;\n  // PS, only when needed - bool.\n  spv::Id var_main_kill_pixel_;\n  // PS, only when writing to color render targets with fragment shader\n  // interlock - uint.\n  // Whether color buffers have been written to, if not written on the taken\n  // execution path, don't export according to Direct3D 9 register documentation\n  // (some games rely on this behavior).\n  spv::Id var_main_fsi_color_written_;\n  // Loaded by FSI_LoadSampleMask.\n  // Can be modified on the outermost control flow level in the main function.\n  // 0:3 - Per-sample coverage at the current stage of the shader's execution.\n  //       Affected by things like gl_SampleMaskIn, early or late depth /\n  //       stencil (always resets bits for failing, no matter if need to defer\n  //       writing), alpha to coverage.\n  // 4:7 - Depth write deferred mask - when early depth / stencil resulted in a\n  //       different value for the sample (like different stencil if the test\n  //       failed), but can't write it before running the shader because it's\n  //       not known if the sample will be discarded by the shader, alphatest or\n  //       AtoC.\n  // Early depth / stencil rejection of the pixel is possible when both 0:3 and\n  // 4:7 are zero.\n  spv::Id main_fsi_sample_mask_;\n  // Loaded by FSI_LoadEdramOffsets.\n  // Including the depth render target base.\n  spv::Id main_fsi_address_depth_;\n  // Not including the render target base.\n  spv::Id main_fsi_offset_32bpp_;\n  spv::Id main_fsi_offset_64bpp_;\n  // Loaded by FSI_DepthStencilTest for early depth / stencil, the depth /\n  // stencil values to write at the end of the shader if the specified in\n  // main_fsi_sample_mask_ and if the samples were not discarded later after the\n  // early test.\n  std::array<spv::Id, 4> main_fsi_late_write_depth_stencil_;\n  spv::Block* main_fsi_early_depth_stencil_execute_quad_merge_;\n  spv::Block* main_loop_header_;\n  spv::Block* main_loop_continue_;\n  spv::Block* main_loop_merge_;\n  spv::Id main_loop_pc_next_;\n  spv::Block* main_switch_header_;\n  std::unique_ptr<spv::Instruction> main_switch_op_;\n  spv::Block* main_switch_merge_;\n  std::vector<spv::Id> main_switch_next_pc_phi_operands_;\n\n  // If the exec bool constant / predicate conditional is open, block after it\n  // (not added to the function yet).\n  spv::Block* cf_exec_conditional_merge_;\n  // If the instruction-level predicate conditional is open, block after it (not\n  // added to the function yet).\n  spv::Block* cf_instruction_predicate_merge_;\n  // When cf_exec_conditional_merge_ is not null:\n  // If the current exec conditional is based on a bool constant: the number of\n  // the bool constant.\n  // If it's based on the predicate value: kCfExecBoolConstantPredicate.\n  uint32_t cf_exec_bool_constant_or_predicate_;\n  static constexpr uint32_t kCfExecBoolConstantPredicate = UINT32_MAX;\n  // When cf_exec_conditional_merge_ is not null, the expected bool constant or\n  // predicate value for the current exec conditional.\n  bool cf_exec_condition_;\n  // When cf_instruction_predicate_merge_ is not null, the expected predicate\n  // value for the current or the last instruction.\n  bool cf_instruction_predicate_condition_;\n  // Whether there was a `setp` in the current exec before the current\n  // instruction, thus instruction-level predicate value can be different than\n  // the exec-level predicate value, and can't merge two execs with the same\n  // predicate condition anymore.\n  bool cf_exec_predicate_written_;\n};\n\n}  // namespace gpu\n}  // namespace xe\n\n#endif  // XENIA_GPU_SPIRV_SHADER_TRANSLATOR_H_\n"
  },
  {
    "path": "src/xenia/gpu/spirv_shader_translator_alu.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/spirv_shader_translator.h\"\n\n#include <cfloat>\n#include <cmath>\n#include <cstdint>\n#include <memory>\n\n#include \"third_party/glslang/SPIRV/GLSL.std.450.h\"\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/math.h\"\n\nnamespace xe {\nnamespace gpu {\n\nspv::Id SpirvShaderTranslator::ZeroIfAnyOperandIsZero(spv::Id value,\n                                                      spv::Id operand_0_abs,\n                                                      spv::Id operand_1_abs) {\n  EnsureBuildPointAvailable();\n  int num_components = builder_->getNumComponents(value);\n  assert_true(builder_->getNumComponents(operand_0_abs) == num_components);\n  assert_true(builder_->getNumComponents(operand_1_abs) == num_components);\n  return builder_->createTriOp(\n      spv::OpSelect, type_float_,\n      builder_->createBinOp(\n          spv::OpFOrdEqual, type_bool_vectors_[num_components - 1],\n          builder_->createBinBuiltinCall(\n              type_float_vectors_[num_components - 1], ext_inst_glsl_std_450_,\n              GLSLstd450NMin, operand_0_abs, operand_1_abs),\n          const_float_vectors_0_[num_components - 1]),\n      const_float_vectors_0_[num_components - 1], value);\n}\n\nvoid SpirvShaderTranslator::KillPixel(\n    spv::Id condition, uint8_t memexport_eM_potentially_written_before) {\n  SpirvBuilder::IfBuilder kill_if(condition, spv::SelectionControlMaskNone,\n                                  *builder_);\n  {\n    // Perform outstanding memory exports before the invocation becomes inactive\n    // and storage writes are disabled.\n    ExportToMemory(memexport_eM_potentially_written_before);\n    if (var_main_kill_pixel_ != spv::NoResult) {\n      builder_->createStore(builder_->makeBoolConstant(true),\n                            var_main_kill_pixel_);\n    }\n    if (features_.demote_to_helper_invocation) {\n      builder_->createNoResultOp(spv::OpDemoteToHelperInvocationEXT);\n    }\n  }\n  kill_if.makeEndIf();\n}\n\nvoid SpirvShaderTranslator::ProcessAluInstruction(\n    const ParsedAluInstruction& instr,\n    uint8_t memexport_eM_potentially_written_before) {\n  if (instr.IsNop()) {\n    // Don't even disassemble or update predication.\n    return;\n  }\n\n  UpdateInstructionPredication(instr.is_predicated, instr.predicate_condition);\n\n  // Floating-point arithmetic operations (addition, subtraction, negation,\n  // multiplication, division, modulo - see isArithmeticOperation in\n  // propagateNoContraction of glslang; though for some reason it's not applied\n  // to SPIR-V OpDot, at least in the February 16, 2020 version installed on\n  // http://shader-playground.timjones.io/) must have the NoContraction\n  // decoration to prevent reordering to make sure floating-point calculations\n  // are optimized predictably and exactly the same in different shaders to\n  // allow for multipass rendering (in addition to the Invariant decoration on\n  // outputs).\n\n  // Whether the instruction has changed the predicate, and it needs to be\n  // checked again later.\n  bool predicate_written_vector = false;\n  spv::Id vector_result = ProcessVectorAluOperation(\n      instr, memexport_eM_potentially_written_before, predicate_written_vector);\n\n  bool predicate_written_scalar = false;\n  spv::Id scalar_result = ProcessScalarAluOperation(\n      instr, memexport_eM_potentially_written_before, predicate_written_scalar);\n  if (scalar_result != spv::NoResult) {\n    EnsureBuildPointAvailable();\n    builder_->createStore(scalar_result, var_main_previous_scalar_);\n  } else {\n    // Special retain_prev case - load ps only if needed and don't store the\n    // same value back to ps.\n    if (instr.scalar_result.GetUsedWriteMask()) {\n      EnsureBuildPointAvailable();\n      scalar_result =\n          builder_->createLoad(var_main_previous_scalar_, spv::NoPrecision);\n    }\n  }\n\n  StoreResult(instr.vector_and_constant_result, vector_result);\n  StoreResult(instr.scalar_result, scalar_result);\n\n  if (predicate_written_vector || predicate_written_scalar) {\n    cf_exec_predicate_written_ = true;\n    CloseInstructionPredication();\n  }\n}\n\nspv::Id SpirvShaderTranslator::ProcessVectorAluOperation(\n    const ParsedAluInstruction& instr,\n    uint8_t memexport_eM_potentially_written_before, bool& predicate_written) {\n  predicate_written = false;\n\n  uint32_t used_result_components =\n      instr.vector_and_constant_result.GetUsedResultComponents();\n  if (!used_result_components &&\n      !ucode::GetAluVectorOpcodeInfo(instr.vector_opcode).changed_state) {\n    return spv::NoResult;\n  }\n  uint32_t used_result_component_count = xe::bit_count(used_result_components);\n\n  // Load operand storage without swizzle and sign modifiers.\n  // A small shortcut, operands of cube are the same, but swizzled.\n  uint32_t operand_count;\n  if (instr.vector_opcode == ucode::AluVectorOpcode::kCube) {\n    operand_count = 1;\n  } else {\n    operand_count = instr.vector_operand_count;\n  }\n  spv::Id operand_storage[3] = {};\n  for (uint32_t i = 0; i < operand_count; ++i) {\n    operand_storage[i] = LoadOperandStorage(instr.vector_operands[i]);\n  }\n  spv::Id result_type =\n      used_result_component_count\n          ? type_float_vectors_[used_result_component_count - 1]\n          : spv::NoType;\n\n  // In case the paired scalar instruction (if processed first) terminates the\n  // block.\n  EnsureBuildPointAvailable();\n\n  // Lookup table for variants of instructions with similar structure.\n  static const unsigned int kOps[] = {\n      static_cast<unsigned int>(spv::OpNop),                   // kAdd\n      static_cast<unsigned int>(spv::OpNop),                   // kMul\n      static_cast<unsigned int>(spv::OpFOrdGreaterThanEqual),  // kMax\n      static_cast<unsigned int>(spv::OpFOrdLessThan),          // kMin\n      static_cast<unsigned int>(spv::OpFOrdEqual),             // kSeq\n      static_cast<unsigned int>(spv::OpFOrdGreaterThan),       // kSgt\n      static_cast<unsigned int>(spv::OpFOrdGreaterThanEqual),  // kSge\n      static_cast<unsigned int>(spv::OpFUnordNotEqual),        // kSne\n      static_cast<unsigned int>(GLSLstd450Fract),              // kFrc\n      static_cast<unsigned int>(GLSLstd450Trunc),              // kTrunc\n      static_cast<unsigned int>(GLSLstd450Floor),              // kFloor\n      static_cast<unsigned int>(spv::OpNop),                   // kMad\n      static_cast<unsigned int>(spv::OpFOrdEqual),             // kCndEq\n      static_cast<unsigned int>(spv::OpFOrdGreaterThanEqual),  // kCndGe\n      static_cast<unsigned int>(spv::OpFOrdGreaterThan),       // kCndGt\n      static_cast<unsigned int>(spv::OpNop),                   // kDp4\n      static_cast<unsigned int>(spv::OpNop),                   // kDp3\n      static_cast<unsigned int>(spv::OpNop),                   // kDp2Add\n      static_cast<unsigned int>(spv::OpNop),                   // kCube\n      static_cast<unsigned int>(spv::OpNop),                   // kMax4\n      static_cast<unsigned int>(spv::OpFOrdEqual),             // kSetpEqPush\n      static_cast<unsigned int>(spv::OpFUnordNotEqual),        // kSetpNePush\n      static_cast<unsigned int>(spv::OpFOrdGreaterThan),       // kSetpGtPush\n      static_cast<unsigned int>(spv::OpFOrdGreaterThanEqual),  // kSetpGePush\n      static_cast<unsigned int>(spv::OpFOrdEqual),             // kKillEq\n      static_cast<unsigned int>(spv::OpFOrdGreaterThan),       // kKillGt\n      static_cast<unsigned int>(spv::OpFOrdGreaterThanEqual),  // kKillGe\n      static_cast<unsigned int>(spv::OpFUnordNotEqual),        // kKillNe\n      static_cast<unsigned int>(spv::OpNop),                   // kDst\n      static_cast<unsigned int>(spv::OpFOrdGreaterThanEqual),  // kMaxA\n  };\n\n  switch (instr.vector_opcode) {\n    case ucode::AluVectorOpcode::kAdd: {\n      return builder_->createNoContractionBinOp(\n          spv::OpFAdd, result_type,\n          GetOperandComponents(operand_storage[0], instr.vector_operands[0],\n                               used_result_components),\n          GetOperandComponents(operand_storage[1], instr.vector_operands[1],\n                               used_result_components));\n    }\n    case ucode::AluVectorOpcode::kMul:\n    case ucode::AluVectorOpcode::kMad: {\n      spv::Id multiplicands[2];\n      for (uint32_t i = 0; i < 2; ++i) {\n        multiplicands[i] =\n            GetOperandComponents(operand_storage[i], instr.vector_operands[i],\n                                 used_result_components);\n      }\n      spv::Id result = builder_->createNoContractionBinOp(\n          spv::OpFMul, result_type, multiplicands[0], multiplicands[1]);\n      uint32_t multiplicands_different =\n          used_result_components &\n          ~instr.vector_operands[0].GetIdenticalComponents(\n              instr.vector_operands[1]);\n      if (multiplicands_different) {\n        // Shader Model 3: +0 or denormal * anything = +-0.\n        spv::Id different_operands[2] = {multiplicands[0], multiplicands[1]};\n        spv::Id different_result = result;\n        uint32_t different_count = xe::bit_count(multiplicands_different);\n        spv::Id different_type = type_float_vectors_[different_count - 1];\n        // Extract the different components, if not all are different.\n        if (multiplicands_different != used_result_components) {\n          uint_vector_temp_.clear();\n          uint32_t components_remaining = used_result_components;\n          for (uint32_t i = 0; i < used_result_component_count; ++i) {\n            uint32_t component;\n            xe::bit_scan_forward(components_remaining, &component);\n            components_remaining &= ~(uint32_t(1) << component);\n            if (multiplicands_different & (1 << component)) {\n              uint_vector_temp_.push_back(i);\n            }\n          }\n          assert_true(uint_vector_temp_.size() == different_count);\n          if (different_count > 1) {\n            for (uint32_t i = 0; i < 2; ++i) {\n              different_operands[i] = builder_->createRvalueSwizzle(\n                  spv::NoPrecision, different_type, different_operands[i],\n                  uint_vector_temp_);\n            }\n            different_result = builder_->createRvalueSwizzle(\n                spv::NoPrecision, different_type, different_result,\n                uint_vector_temp_);\n          } else {\n            for (uint32_t i = 0; i < 2; ++i) {\n              different_operands[i] = builder_->createCompositeExtract(\n                  different_operands[i], different_type, uint_vector_temp_[0]);\n            }\n            different_result = builder_->createCompositeExtract(\n                different_result, different_type, uint_vector_temp_[0]);\n          }\n        }\n        // Check if the different components in any of the operands are zero,\n        // even if the other is NaN - if min(|a|, |b|) is 0.\n        for (uint32_t i = 0; i < 2; ++i) {\n          different_operands[i] = GetAbsoluteOperand(different_operands[i],\n                                                     instr.vector_operands[i]);\n        }\n        spv::Id different_zero = builder_->createBinOp(\n            spv::OpFOrdEqual, type_bool_vectors_[different_count - 1],\n            builder_->createBinBuiltinCall(\n                different_type, ext_inst_glsl_std_450_, GLSLstd450NMin,\n                different_operands[0], different_operands[1]),\n            const_float_vectors_0_[different_count - 1]);\n        // Replace with +0.\n        different_result = builder_->createTriOp(\n            spv::OpSelect, different_type, different_zero,\n            const_float_vectors_0_[different_count - 1], different_result);\n        // Insert the different components back to the result.\n        if (multiplicands_different != used_result_components) {\n          if (different_count > 1) {\n            std::unique_ptr<spv::Instruction> shuffle_op =\n                std::make_unique<spv::Instruction>(\n                    builder_->getUniqueId(), result_type, spv::OpVectorShuffle);\n            shuffle_op->addIdOperand(result);\n            shuffle_op->addIdOperand(different_result);\n            uint32_t components_remaining = used_result_components;\n            unsigned int different_shuffle_index = used_result_component_count;\n            for (uint32_t i = 0; i < used_result_component_count; ++i) {\n              uint32_t component;\n              xe::bit_scan_forward(components_remaining, &component);\n              components_remaining &= ~(uint32_t(1) << component);\n              shuffle_op->addImmediateOperand(\n                  (multiplicands_different & (1 << component))\n                      ? different_shuffle_index++\n                      : i);\n            }\n            result = shuffle_op->getResultId();\n            builder_->getBuildPoint()->addInstruction(std::move(shuffle_op));\n          } else {\n            result = builder_->createCompositeInsert(\n                different_result, result, result_type,\n                xe::bit_count(used_result_components &\n                              (multiplicands_different - 1)));\n          }\n        } else {\n          result = different_result;\n        }\n      }\n      if (instr.vector_opcode == ucode::AluVectorOpcode::kMad) {\n        // Not replacing true `0 + term` with conditional selection of the term\n        // because +0 + -0 should result in +0, not -0.\n        result = builder_->createNoContractionBinOp(\n            spv::OpFAdd, result_type, result,\n            GetOperandComponents(operand_storage[2], instr.vector_operands[2],\n                                 used_result_components));\n      }\n      return result;\n    }\n\n    case ucode::AluVectorOpcode::kMax:\n    case ucode::AluVectorOpcode::kMin:\n    case ucode::AluVectorOpcode::kMaxA: {\n      bool is_maxa = instr.vector_opcode == ucode::AluVectorOpcode::kMaxA;\n      spv::Id operand_0 = GetOperandComponents(\n          operand_storage[0], instr.vector_operands[0],\n          used_result_components | (is_maxa ? 0b1000 : 0b0000));\n      spv::Id maxa_operand_0_w = spv::NoResult;\n      if (is_maxa) {\n        // a0 = (int)clamp(floor(src0.w + 0.5), -256.0, 255.0)\n        int operand_0_num_components = builder_->getNumComponents(operand_0);\n        if (operand_0_num_components > 1) {\n          maxa_operand_0_w = builder_->createCompositeExtract(\n              operand_0, type_float_,\n              static_cast<unsigned int>(operand_0_num_components - 1));\n        } else {\n          maxa_operand_0_w = operand_0;\n        }\n        builder_->createStore(\n            builder_->createUnaryOp(\n                spv::OpConvertFToS, type_int_,\n                builder_->createTriBuiltinCall(\n                    type_float_, ext_inst_glsl_std_450_, GLSLstd450NClamp,\n                    builder_->createUnaryBuiltinCall(\n                        type_float_, ext_inst_glsl_std_450_, GLSLstd450Floor,\n                        builder_->createNoContractionBinOp(\n                            spv::OpFAdd, type_float_, maxa_operand_0_w,\n                            builder_->makeFloatConstant(0.5f))),\n                    builder_->makeFloatConstant(-256.0f),\n                    builder_->makeFloatConstant(255.0f))),\n            var_main_address_register_);\n      }\n      if (!used_result_components) {\n        // maxa returning nothing - can't load src1.\n        return spv::NoResult;\n      }\n      // max is commonly used as mov.\n      uint32_t identical = instr.vector_operands[0].GetIdenticalComponents(\n                               instr.vector_operands[1]) &\n                           used_result_components;\n      spv::Id operand_0_per_component;\n      if (is_maxa && !(used_result_components & 0b1000) &&\n          (identical == used_result_components || !identical)) {\n        // operand_0 and operand_1 have different lengths though if src0.w is\n        // forced without W being in the write mask for maxa purposes -\n        // shuffle/extract the needed part if src0.w is only needed for setting\n        // a0.\n        // This is only needed for cases without mixed identical and different\n        // components - the mixed case uses CompositeExtract, which works fine.\n        if (used_result_component_count > 1) {\n          // Need all but the last (W) element of operand_0 as a vector.\n          uint_vector_temp_.clear();\n          for (unsigned int i = 0; i < used_result_component_count; ++i) {\n            uint_vector_temp_.push_back(i);\n          }\n          operand_0_per_component = builder_->createRvalueSwizzle(\n              spv::NoPrecision,\n              type_float_vectors_[used_result_component_count - 1], operand_0,\n              uint_vector_temp_);\n        } else {\n          // Need the non-W component as scalar.\n          operand_0_per_component =\n              builder_->createCompositeExtract(operand_0, type_float_, 0);\n        }\n      } else {\n        operand_0_per_component = operand_0;\n      }\n      if (identical == used_result_components) {\n        // All components are identical - mov (with the correct length in case\n        // of maxa). Don't access operand_1 at all in this case (operand_0 is\n        // already accessed for W in case of maxa).\n        assert_true(builder_->getNumComponents(operand_0_per_component) ==\n                    used_result_component_count);\n        return operand_0_per_component;\n      }\n      spv::Id operand_1 = GetOperandComponents(\n          operand_storage[1], instr.vector_operands[1], used_result_components);\n      // Shader Model 3 NaN behavior (a op b ? a : b, not SPIR-V FMax/FMin which\n      // are undefined for NaN or NMax/NMin which return the non-NaN operand).\n      spv::Op op = spv::Op(kOps[size_t(instr.vector_opcode)]);\n      if (!identical) {\n        // All components are different - max/min of the scalars or the entire\n        // vectors (with the correct length in case of maxa).\n        assert_true(builder_->getNumComponents(operand_0_per_component) ==\n                    used_result_component_count);\n        return builder_->createTriOp(\n            spv::OpSelect, result_type,\n            builder_->createBinOp(\n                op, type_bool_vectors_[used_result_component_count - 1],\n                operand_0_per_component, operand_1),\n            operand_0_per_component, operand_1);\n      }\n      // Mixed identical and different components.\n      assert_true(used_result_component_count > 1);\n      id_vector_temp_.clear();\n      uint32_t components_remaining = used_result_components;\n      for (uint32_t i = 0; i < used_result_component_count; ++i) {\n        // Composite extraction of operand_0[i] works fine even it's maxa with\n        // src0.w forced without W being in the write mask - src0.w would be the\n        // last, so all indices before it are still valid. Don't extract twice\n        // if already extracted though.\n        spv::Id result_component =\n            ((used_result_components & 0b1000) &&\n             i + 1 >= used_result_component_count &&\n             maxa_operand_0_w != spv::NoResult)\n                ? maxa_operand_0_w\n                : builder_->createCompositeExtract(operand_0, type_float_, i);\n        uint32_t component_index;\n        xe::bit_scan_forward(components_remaining, &component_index);\n        components_remaining &= ~(uint32_t(1) << component_index);\n        if (!(identical & (1 << component_index))) {\n          spv::Id operand_1_component =\n              builder_->createCompositeExtract(operand_1, type_float_, i);\n          result_component = builder_->createTriOp(\n              spv::OpSelect, type_float_,\n              builder_->createBinOp(op, type_bool_, result_component,\n                                    operand_1_component),\n              result_component, operand_1_component);\n        }\n        id_vector_temp_.push_back(result_component);\n      }\n      return builder_->createCompositeConstruct(result_type, id_vector_temp_);\n    }\n\n    case ucode::AluVectorOpcode::kSeq:\n    case ucode::AluVectorOpcode::kSgt:\n    case ucode::AluVectorOpcode::kSge:\n    case ucode::AluVectorOpcode::kSne:\n      return builder_->createTriOp(\n          spv::OpSelect, result_type,\n          builder_->createBinOp(\n              spv::Op(kOps[size_t(instr.vector_opcode)]),\n              type_bool_vectors_[used_result_component_count - 1],\n              GetOperandComponents(operand_storage[0], instr.vector_operands[0],\n                                   used_result_components),\n              GetOperandComponents(operand_storage[1], instr.vector_operands[1],\n                                   used_result_components)),\n          const_float_vectors_1_[used_result_component_count - 1],\n          const_float_vectors_0_[used_result_component_count - 1]);\n\n    case ucode::AluVectorOpcode::kFrc:\n    case ucode::AluVectorOpcode::kTrunc:\n    case ucode::AluVectorOpcode::kFloor:\n      return builder_->createUnaryBuiltinCall(\n          result_type, ext_inst_glsl_std_450_,\n          GLSLstd450(kOps[size_t(instr.vector_opcode)]),\n          GetOperandComponents(operand_storage[0], instr.vector_operands[0],\n                               used_result_components));\n\n    case ucode::AluVectorOpcode::kCndEq:\n    case ucode::AluVectorOpcode::kCndGe:\n    case ucode::AluVectorOpcode::kCndGt:\n      return builder_->createTriOp(\n          spv::OpSelect, result_type,\n          builder_->createBinOp(\n              spv::Op(kOps[size_t(instr.vector_opcode)]),\n              type_bool_vectors_[used_result_component_count - 1],\n              GetOperandComponents(operand_storage[0], instr.vector_operands[0],\n                                   used_result_components),\n              const_float_vectors_0_[used_result_component_count - 1]),\n          GetOperandComponents(operand_storage[1], instr.vector_operands[1],\n                               used_result_components),\n          GetOperandComponents(operand_storage[2], instr.vector_operands[2],\n                               used_result_components));\n\n    case ucode::AluVectorOpcode::kDp4:\n    case ucode::AluVectorOpcode::kDp3:\n    case ucode::AluVectorOpcode::kDp2Add: {\n      // Not using OpDot for predictable optimization (especially addition\n      // order) and NoContraction (which, for some reason, isn't placed on dot\n      // in glslang as of the February 16, 2020 version).\n      uint32_t component_count;\n      if (instr.vector_opcode == ucode::AluVectorOpcode::kDp2Add) {\n        component_count = 2;\n      } else if (instr.vector_opcode == ucode::AluVectorOpcode::kDp3) {\n        component_count = 3;\n      } else {\n        component_count = 4;\n      }\n      uint32_t component_mask = (1 << component_count) - 1;\n      spv::Id operands[2];\n      for (uint32_t i = 0; i < 2; ++i) {\n        operands[i] = GetOperandComponents(\n            operand_storage[i], instr.vector_operands[i], component_mask);\n      }\n      uint32_t different =\n          component_mask & ~instr.vector_operands[0].GetIdenticalComponents(\n                               instr.vector_operands[1]);\n      spv::Id result = spv::NoResult;\n      for (uint32_t i = 0; i < component_count; ++i) {\n        spv::Id operand_components[2];\n        for (unsigned int j = 0; j < 2; ++j) {\n          operand_components[j] =\n              builder_->createCompositeExtract(operands[j], type_float_, i);\n        }\n        spv::Id product = builder_->createNoContractionBinOp(\n            spv::OpFMul, type_float_, operand_components[0],\n            operand_components[1]);\n        if (different & (1 << i)) {\n          // Shader Model 3: +0 or denormal * anything = +-0.\n          product = ZeroIfAnyOperandIsZero(\n              product,\n              GetAbsoluteOperand(operand_components[0],\n                                 instr.vector_operands[0]),\n              GetAbsoluteOperand(operand_components[1],\n                                 instr.vector_operands[1]));\n        }\n        if (!i) {\n          result = product;\n          continue;\n        }\n        result = builder_->createNoContractionBinOp(spv::OpFAdd, type_float_,\n                                                    result, product);\n      }\n      if (instr.vector_opcode == ucode::AluVectorOpcode::kDp2Add) {\n        result = builder_->createNoContractionBinOp(\n            spv::OpFAdd, type_float_, result,\n            GetOperandComponents(operand_storage[2], instr.vector_operands[2],\n                                 0b0001));\n      }\n      return result;\n    }\n\n    case ucode::AluVectorOpcode::kCube: {\n      // operands[0] is .z_xy.\n      // Result is T coordinate, S coordinate, 2 * major axis, face ID.\n      // Skipping the second component of the operand, so 120, not 230.\n      spv::Id operand_vector = GetOperandComponents(\n          operand_storage[0], instr.vector_operands[0], 0b1101);\n      // Remapped from ZXY (Z_XY without the skipped component) to XYZ.\n      spv::Id operand[3];\n      for (unsigned int i = 0; i < 3; ++i) {\n        operand[i] = builder_->createCompositeExtract(operand_vector,\n                                                      type_float_, (i + 1) % 3);\n      }\n      spv::Id operand_abs[3];\n      if (!instr.vector_operands[0].is_absolute_value ||\n          instr.vector_operands[0].is_negated) {\n        for (unsigned int i = 0; i < 3; ++i) {\n          operand_abs[i] = builder_->createUnaryBuiltinCall(\n              type_float_, ext_inst_glsl_std_450_, GLSLstd450FAbs, operand[i]);\n        }\n      } else {\n        for (unsigned int i = 0; i < 3; ++i) {\n          operand_abs[i] = operand[i];\n        }\n      }\n      spv::Id operand_neg[3] = {};\n      if (used_result_components & 0b0001) {\n        operand_neg[1] = builder_->createNoContractionUnaryOp(\n            spv::OpFNegate, type_float_, operand[1]);\n      }\n      if (used_result_components & 0b0010) {\n        operand_neg[0] = builder_->createNoContractionUnaryOp(\n            spv::OpFNegate, type_float_, operand[0]);\n        operand_neg[2] = builder_->createNoContractionUnaryOp(\n            spv::OpFNegate, type_float_, operand[2]);\n      }\n\n      spv::Id ma_z_result[4] = {}, ma_yx_result[4] = {};\n\n      // Check if the major axis is Z (abs(z) >= abs(x) && abs(z) >= abs(y)).\n      SpirvBuilder::IfBuilder ma_z_if(\n          builder_->createBinOp(\n              spv::OpLogicalAnd, type_bool_,\n              builder_->createBinOp(spv::OpFOrdGreaterThanEqual, type_bool_,\n                                    operand_abs[2], operand_abs[0]),\n              builder_->createBinOp(spv::OpFOrdGreaterThanEqual, type_bool_,\n                                    operand_abs[2], operand_abs[1])),\n          spv::SelectionControlMaskNone, *builder_);\n      {\n        // The major axis is Z.\n        // tc = -y\n        ma_z_result[0] = operand_neg[1];\n        // ma/2 = z\n        ma_z_result[2] = operand[2];\n        if (used_result_components & 0b1010) {\n          spv::Id z_is_neg = builder_->createBinOp(\n              spv::OpFOrdLessThan, type_bool_, operand[2], const_float_0_);\n          if (used_result_components & 0b0010) {\n            // sc = z < 0.0 ? -x : x\n            ma_z_result[1] =\n                builder_->createTriOp(spv::OpSelect, type_float_, z_is_neg,\n                                      operand_neg[0], operand[0]);\n          }\n          if (used_result_components & 0b1000) {\n            // id = z < 0.0 ? 5.0 : 4.0\n            ma_z_result[3] =\n                builder_->createTriOp(spv::OpSelect, type_float_, z_is_neg,\n                                      builder_->makeFloatConstant(5.0f),\n                                      builder_->makeFloatConstant(4.0f));\n          }\n        }\n      }\n      ma_z_if.makeBeginElse();\n      {\n        spv::Id ma_y_result[4] = {}, ma_x_result[4] = {};\n\n        // The major axis is not Z - create an inner conditional to check if the\n        // major axis is Y (abs(y) >= abs(x)).\n        SpirvBuilder::IfBuilder ma_y_if(\n            builder_->createBinOp(spv::OpFOrdGreaterThanEqual, type_bool_,\n                                  operand_abs[1], operand_abs[0]),\n            spv::SelectionControlMaskNone, *builder_);\n        {\n          // The major axis is Y.\n          // sc = x\n          ma_y_result[1] = operand[0];\n          // ma/2 = y\n          ma_y_result[2] = operand[1];\n          if (used_result_components & 0b1001) {\n            spv::Id y_is_neg = builder_->createBinOp(\n                spv::OpFOrdLessThan, type_bool_, operand[1], const_float_0_);\n            if (used_result_components & 0b0001) {\n              // tc = y < 0.0 ? -z : z\n              ma_y_result[0] =\n                  builder_->createTriOp(spv::OpSelect, type_float_, y_is_neg,\n                                        operand_neg[2], operand[2]);\n              // id = y < 0.0 ? 3.0 : 2.0\n              ma_y_result[3] =\n                  builder_->createTriOp(spv::OpSelect, type_float_, y_is_neg,\n                                        builder_->makeFloatConstant(3.0f),\n                                        builder_->makeFloatConstant(2.0f));\n            }\n          }\n        }\n        ma_y_if.makeBeginElse();\n        {\n          // The major axis is X.\n          // tc = -y\n          ma_x_result[0] = operand_neg[1];\n          // ma/2 = x\n          ma_x_result[2] = operand[0];\n          if (used_result_components & 0b1010) {\n            spv::Id x_is_neg = builder_->createBinOp(\n                spv::OpFOrdLessThan, type_bool_, operand[0], const_float_0_);\n            if (used_result_components & 0b0010) {\n              // sc = x < 0.0 ? z : -z\n              ma_x_result[1] =\n                  builder_->createTriOp(spv::OpSelect, type_float_, x_is_neg,\n                                        operand[2], operand_neg[2]);\n            }\n            if (used_result_components & 0b1000) {\n              // id = x < 0.0 ? 1.0 : 0.0\n              ma_x_result[3] =\n                  builder_->createTriOp(spv::OpSelect, type_float_, x_is_neg,\n                                        const_float_1_, const_float_0_);\n            }\n          }\n        }\n        ma_y_if.makeEndIf();\n\n        // The major axis is Y or X - choose the options of the result from Y\n        // and X.\n        for (uint32_t i = 0; i < 4; ++i) {\n          if (!(used_result_components & (1 << i))) {\n            continue;\n          }\n          ma_yx_result[i] =\n              ma_y_if.createMergePhi(ma_y_result[i], ma_x_result[i]);\n        }\n      }\n      ma_z_if.makeEndIf();\n\n      // Choose the result options from Z and YX cases.\n      id_vector_temp_.clear();\n      for (uint32_t i = 0; i < 4; ++i) {\n        if (!(used_result_components & (1 << i))) {\n          continue;\n        }\n        id_vector_temp_.push_back(\n            ma_z_if.createMergePhi(ma_z_result[i], ma_yx_result[i]));\n      }\n      assert_true(id_vector_temp_.size() == used_result_component_count);\n      if (used_result_components & 0b0100) {\n        // Multiply the major axis by 2.\n        spv::Id& ma2 = id_vector_temp_[xe::bit_count(used_result_components &\n                                                     ((1 << 2) - 1))];\n        ma2 = builder_->createNoContractionBinOp(\n            spv::OpFMul, type_float_, builder_->makeFloatConstant(2.0f), ma2);\n      }\n      if (used_result_component_count == 1) {\n        // Only one component - not composite.\n        return id_vector_temp_[0];\n      }\n      return builder_->createCompositeConstruct(\n          type_float_vectors_[used_result_component_count - 1],\n          id_vector_temp_);\n    }\n\n    case ucode::AluVectorOpcode::kMax4: {\n      // Find max of all different components of the first operand.\n      // FIXME(Triang3l): Not caring about NaN because no info about the\n      // correct order, just using NMax here, which replaces them with the\n      // non-NaN component (however, there's one nice thing about it is that it\n      // may be compiled into max3 + max on GCN).\n      uint32_t components_remaining = 0b0000;\n      for (uint32_t i = 0; i < 4; ++i) {\n        SwizzleSource swizzle_source = instr.vector_operands[0].GetComponent(i);\n        assert_true(swizzle_source >= SwizzleSource::kX &&\n                    swizzle_source <= SwizzleSource::kW);\n        components_remaining |=\n            1 << (uint32_t(swizzle_source) - uint32_t(SwizzleSource::kX));\n      }\n      assert_not_zero(components_remaining);\n      spv::Id operand =\n          ApplyOperandModifiers(operand_storage[0], instr.vector_operands[0]);\n      uint32_t component;\n      xe::bit_scan_forward(components_remaining, &component);\n      components_remaining &= ~(uint32_t(1) << component);\n      spv::Id result = builder_->createCompositeExtract(\n          operand, type_float_, static_cast<unsigned int>(component));\n      while (xe::bit_scan_forward(components_remaining, &component)) {\n        components_remaining &= ~(uint32_t(1) << component);\n        result = builder_->createBinBuiltinCall(\n            type_float_, ext_inst_glsl_std_450_, GLSLstd450NMax, result,\n            builder_->createCompositeExtract(\n                operand, type_float_, static_cast<unsigned int>(component)));\n      }\n      return result;\n    }\n\n    case ucode::AluVectorOpcode::kSetpEqPush:\n    case ucode::AluVectorOpcode::kSetpNePush:\n    case ucode::AluVectorOpcode::kSetpGtPush:\n    case ucode::AluVectorOpcode::kSetpGePush: {\n      // X is only needed for the result, W is needed for the predicate.\n      spv::Id operands[2];\n      spv::Id operands_w[2];\n      for (uint32_t i = 0; i < 2; ++i) {\n        operands[i] =\n            GetOperandComponents(operand_storage[i], instr.vector_operands[i],\n                                 used_result_components ? 0b1001 : 0b1000);\n        if (used_result_components) {\n          operands_w[i] =\n              builder_->createCompositeExtract(operands[i], type_float_, 1);\n        } else {\n          operands_w[i] = operands[i];\n        }\n      }\n      spv::Op op = spv::Op(kOps[size_t(instr.vector_opcode)]);\n      // p0 = src0.w == 0.0 && src1.w op 0.0\n      builder_->createStore(\n          builder_->createBinOp(\n              spv::OpLogicalAnd, type_bool_,\n              builder_->createBinOp(spv::OpFOrdEqual, type_bool_, operands_w[0],\n                                    const_float_0_),\n              builder_->createBinOp(op, type_bool_, operands_w[1],\n                                    const_float_0_)),\n          var_main_predicate_);\n      predicate_written = true;\n      if (!used_result_components) {\n        return spv::NoResult;\n      }\n      // result = (src0.x == 0.0 && src1.x op 0.0) ? 0.0 : src0.x + 1.0\n      // Or:\n      // result = ((src0.x == 0.0 && src1.x op 0.0) ? -1.0 : src0.x) + 1.0\n      spv::Id operands_x[2];\n      for (uint32_t i = 0; i < 2; ++i) {\n        operands_x[i] =\n            builder_->createCompositeExtract(operands[i], type_float_, 0);\n      }\n      spv::Id condition = builder_->createBinOp(\n          spv::OpLogicalAnd, type_bool_,\n          builder_->createBinOp(spv::OpFOrdEqual, type_bool_, operands_x[0],\n                                const_float_0_),\n          builder_->createBinOp(op, type_bool_, operands_x[1], const_float_0_));\n      return builder_->createNoContractionBinOp(\n          spv::OpFAdd, type_float_,\n          builder_->createTriOp(spv::OpSelect, type_float_, condition,\n                                builder_->makeFloatConstant(-1.0f),\n                                operands_x[0]),\n          const_float_1_);\n    }\n\n    case ucode::AluVectorOpcode::kKillEq:\n    case ucode::AluVectorOpcode::kKillGt:\n    case ucode::AluVectorOpcode::kKillGe:\n    case ucode::AluVectorOpcode::kKillNe: {\n      KillPixel(\n          builder_->createUnaryOp(\n              spv::OpAny, type_bool_,\n              builder_->createBinOp(\n                  spv::Op(kOps[size_t(instr.vector_opcode)]), type_bool4_,\n                  GetOperandComponents(operand_storage[0],\n                                       instr.vector_operands[0], 0b1111),\n                  GetOperandComponents(operand_storage[1],\n                                       instr.vector_operands[1], 0b1111))),\n          memexport_eM_potentially_written_before);\n      return const_float_0_;\n    }\n\n    case ucode::AluVectorOpcode::kDst: {\n      spv::Id operands[2] = {};\n      if (used_result_components & 0b0110) {\n        // result.yz is needed: [0] = y, [1] = z.\n        // resuly.y is needed: scalar = y.\n        // resuly.z is needed: scalar = z.\n        operands[0] =\n            GetOperandComponents(operand_storage[0], instr.vector_operands[0],\n                                 used_result_components & 0b0110);\n      }\n      if (used_result_components & 0b1010) {\n        // result.yw is needed: [0] = y, [1] = w.\n        // resuly.y is needed: scalar = y.\n        // resuly.w is needed: scalar = w.\n        operands[1] =\n            GetOperandComponents(operand_storage[1], instr.vector_operands[1],\n                                 used_result_components & 0b1010);\n      }\n      // y = src0.y * src1.y\n      spv::Id result_y = spv::NoResult;\n      if (used_result_components & 0b0010) {\n        spv::Id operands_y[2];\n        operands_y[0] =\n            (used_result_components & 0b0100)\n                ? builder_->createCompositeExtract(operands[0], type_float_, 0)\n                : operands[0];\n        operands_y[1] =\n            (used_result_components & 0b1000)\n                ? builder_->createCompositeExtract(operands[1], type_float_, 0)\n                : operands[1];\n        result_y = builder_->createNoContractionBinOp(\n            spv::OpFMul, type_float_, operands_y[0], operands_y[1]);\n        if (!(instr.vector_operands[0].GetIdenticalComponents(\n                  instr.vector_operands[1]) &\n              0b0010)) {\n          // Shader Model 3: +0 or denormal * anything = +-0.\n          result_y = ZeroIfAnyOperandIsZero(\n              result_y,\n              GetAbsoluteOperand(operands_y[0], instr.vector_operands[0]),\n              GetAbsoluteOperand(operands_y[1], instr.vector_operands[1]));\n        }\n      }\n      id_vector_temp_.clear();\n      if (used_result_components & 0b0001) {\n        // x = 1.0\n        id_vector_temp_.push_back(const_float_1_);\n      }\n      if (used_result_components & 0b0010) {\n        // y = src0.y * src1.y\n        id_vector_temp_.push_back(result_y);\n      }\n      if (used_result_components & 0b0100) {\n        // z = src0.z\n        id_vector_temp_.push_back(\n            (used_result_components & 0b0010)\n                ? builder_->createCompositeExtract(operands[0], type_float_, 1)\n                : operands[0]);\n      }\n      if (used_result_components & 0b1000) {\n        // w = src1.w\n        id_vector_temp_.push_back(\n            (used_result_components & 0b0010)\n                ? builder_->createCompositeExtract(operands[1], type_float_, 1)\n                : operands[1]);\n      }\n      assert_true(id_vector_temp_.size() == used_result_component_count);\n      if (used_result_component_count == 1) {\n        // Only one component - not composite.\n        return id_vector_temp_[0];\n      }\n      return builder_->createCompositeConstruct(\n          type_float_vectors_[used_result_component_count - 1],\n          id_vector_temp_);\n    }\n  }\n\n  assert_unhandled_case(instr.vector_opcode);\n  EmitTranslationError(\"Unknown ALU vector operation\");\n  return spv::NoResult;\n}\n\nspv::Id SpirvShaderTranslator::ProcessScalarAluOperation(\n    const ParsedAluInstruction& instr,\n    uint8_t memexport_eM_potentially_written_before, bool& predicate_written) {\n  predicate_written = false;\n\n  spv::Id operand_storage[2] = {};\n  for (uint32_t i = 0; i < instr.scalar_operand_count; ++i) {\n    operand_storage[i] = LoadOperandStorage(instr.scalar_operands[i]);\n  }\n\n  // In case the paired vector instruction (if processed first) terminates the\n  // block.\n  EnsureBuildPointAvailable();\n\n  // Lookup table for variants of instructions with similar structure.\n  static const unsigned int kOps[] = {\n      static_cast<unsigned int>(spv::OpFAdd),                  // kAdds\n      static_cast<unsigned int>(spv::OpFAdd),                  // kAddsPrev\n      static_cast<unsigned int>(spv::OpNop),                   // kMuls\n      static_cast<unsigned int>(spv::OpNop),                   // kMulsPrev\n      static_cast<unsigned int>(spv::OpNop),                   // kMulsPrev2\n      static_cast<unsigned int>(spv::OpFOrdGreaterThanEqual),  // kMaxs\n      static_cast<unsigned int>(spv::OpFOrdLessThan),          // kMins\n      static_cast<unsigned int>(spv::OpFOrdEqual),             // kSeqs\n      static_cast<unsigned int>(spv::OpFOrdGreaterThan),       // kSgts\n      static_cast<unsigned int>(spv::OpFOrdGreaterThanEqual),  // kSges\n      static_cast<unsigned int>(spv::OpFUnordNotEqual),        // kSnes\n      static_cast<unsigned int>(GLSLstd450Fract),              // kFrcs\n      static_cast<unsigned int>(GLSLstd450Trunc),              // kTruncs\n      static_cast<unsigned int>(GLSLstd450Floor),              // kFloors\n      static_cast<unsigned int>(GLSLstd450Exp2),               // kExp\n      static_cast<unsigned int>(spv::OpNop),                   // kLogc\n      static_cast<unsigned int>(GLSLstd450Log2),               // kLog\n      static_cast<unsigned int>(spv::OpNop),                   // kRcpc\n      static_cast<unsigned int>(spv::OpNop),                   // kRcpf\n      static_cast<unsigned int>(spv::OpNop),                   // kRcp\n      static_cast<unsigned int>(spv::OpNop),                   // kRsqc\n      static_cast<unsigned int>(spv::OpNop),                   // kRsqf\n      static_cast<unsigned int>(GLSLstd450InverseSqrt),        // kRsq\n      static_cast<unsigned int>(spv::OpFOrdGreaterThanEqual),  // kMaxAs\n      static_cast<unsigned int>(spv::OpFOrdGreaterThanEqual),  // kMaxAsf\n      static_cast<unsigned int>(spv::OpFSub),                  // kSubs\n      static_cast<unsigned int>(spv::OpFSub),                  // kSubsPrev\n      static_cast<unsigned int>(spv::OpFOrdEqual),             // kSetpEq\n      static_cast<unsigned int>(spv::OpFUnordNotEqual),        // kSetpNe\n      static_cast<unsigned int>(spv::OpFOrdGreaterThan),       // kSetpGt\n      static_cast<unsigned int>(spv::OpFOrdGreaterThanEqual),  // kSetpGe\n      static_cast<unsigned int>(spv::OpNop),                   // kSetpInv\n      static_cast<unsigned int>(spv::OpNop),                   // kSetpPop\n      static_cast<unsigned int>(spv::OpNop),                   // kSetpClr\n      static_cast<unsigned int>(spv::OpNop),                   // kSetpRstr\n      static_cast<unsigned int>(spv::OpFOrdEqual),             // kKillsEq\n      static_cast<unsigned int>(spv::OpFOrdGreaterThan),       // kKillsGt\n      static_cast<unsigned int>(spv::OpFOrdGreaterThanEqual),  // kKillsGe\n      static_cast<unsigned int>(spv::OpFUnordNotEqual),        // kKillsNe\n      static_cast<unsigned int>(spv::OpFOrdEqual),             // kKillsOne\n      static_cast<unsigned int>(GLSLstd450Sqrt),               // kSqrt\n      static_cast<unsigned int>(spv::OpNop),                   // Invalid\n      static_cast<unsigned int>(spv::OpNop),                   // kMulsc0\n      static_cast<unsigned int>(spv::OpNop),                   // kMulsc1\n      static_cast<unsigned int>(spv::OpFAdd),                  // kAddsc0\n      static_cast<unsigned int>(spv::OpFAdd),                  // kAddsc1\n      static_cast<unsigned int>(spv::OpFSub),                  // kSubsc0\n      static_cast<unsigned int>(spv::OpFSub),                  // kSubsc1\n      static_cast<unsigned int>(GLSLstd450Sin),                // kSin\n      static_cast<unsigned int>(GLSLstd450Cos),                // kCos\n      static_cast<unsigned int>(spv::OpNop),                   // kRetainPrev\n  };\n\n  switch (instr.scalar_opcode) {\n    case ucode::AluScalarOpcode::kAdds:\n    case ucode::AluScalarOpcode::kSubs: {\n      spv::Id a, b;\n      GetOperandScalarXY(operand_storage[0], instr.scalar_operands[0], a, b);\n      return builder_->createNoContractionBinOp(\n          spv::Op(kOps[size_t(instr.scalar_opcode)]), type_float_, a, b);\n    }\n    case ucode::AluScalarOpcode::kAddsPrev:\n    case ucode::AluScalarOpcode::kSubsPrev: {\n      return builder_->createNoContractionBinOp(\n          spv::Op(kOps[size_t(instr.scalar_opcode)]), type_float_,\n          GetOperandComponents(operand_storage[0], instr.scalar_operands[0],\n                               0b0001),\n          builder_->createLoad(var_main_previous_scalar_, spv::NoPrecision));\n    }\n    case ucode::AluScalarOpcode::kMuls: {\n      spv::Id a, b;\n      GetOperandScalarXY(operand_storage[0], instr.scalar_operands[0], a, b);\n      spv::Id result =\n          builder_->createNoContractionBinOp(spv::OpFMul, type_float_, a, b);\n      if (a != b) {\n        // Shader Model 3: +0 or denormal * anything = +-0.\n        result = ZeroIfAnyOperandIsZero(\n            result, GetAbsoluteOperand(a, instr.scalar_operands[0]),\n            GetAbsoluteOperand(b, instr.scalar_operands[0]));\n      }\n      return result;\n    }\n    case ucode::AluScalarOpcode::kMulsPrev: {\n      spv::Id a = GetOperandComponents(operand_storage[0],\n                                       instr.scalar_operands[0], 0b0001);\n      spv::Id ps =\n          builder_->createLoad(var_main_previous_scalar_, spv::NoPrecision);\n      spv::Id result =\n          builder_->createNoContractionBinOp(spv::OpFMul, type_float_, a, ps);\n      // Shader Model 3: +0 or denormal * anything = +-0.\n      return ZeroIfAnyOperandIsZero(\n          result, GetAbsoluteOperand(a, instr.scalar_operands[0]),\n          builder_->createUnaryBuiltinCall(type_float_, ext_inst_glsl_std_450_,\n                                           GLSLstd450FAbs, ps));\n    }\n    case ucode::AluScalarOpcode::kMulsPrev2: {\n      // Check if need to select the src0.a * ps case.\n      // Selection merge must be the penultimate instruction in the block, check\n      // the condition before it.\n      spv::Id ps =\n          builder_->createLoad(var_main_previous_scalar_, spv::NoPrecision);\n      // ps != -FLT_MAX.\n      spv::Id const_float_max_neg = builder_->makeFloatConstant(-FLT_MAX);\n      spv::Id condition = builder_->createBinOp(\n          spv::OpFUnordNotEqual, type_bool_, ps, const_float_max_neg);\n      // isfinite(ps), or |ps| <= FLT_MAX, or -|ps| >= -FLT_MAX, since -FLT_MAX\n      // is already loaded to an SGPR, this is also false if it's NaN.\n      spv::Id ps_abs = builder_->createUnaryBuiltinCall(\n          type_float_, ext_inst_glsl_std_450_, GLSLstd450FAbs, ps);\n      spv::Id ps_abs_neg = builder_->createNoContractionUnaryOp(\n          spv::OpFNegate, type_float_, ps_abs);\n      condition = builder_->createBinOp(\n          spv::OpLogicalAnd, type_bool_, condition,\n          builder_->createBinOp(spv::OpFOrdGreaterThanEqual, type_bool_,\n                                ps_abs_neg, const_float_max_neg));\n      // isfinite(src0.b), or -|src0.b| >= -FLT_MAX for the same reason.\n      spv::Id b = GetOperandComponents(operand_storage[0],\n                                       instr.scalar_operands[0], 0b0010);\n      spv::Id b_abs_neg = b;\n      if (!instr.scalar_operands[0].is_absolute_value) {\n        b_abs_neg = builder_->createUnaryBuiltinCall(\n            type_float_, ext_inst_glsl_std_450_, GLSLstd450FAbs, b_abs_neg);\n      }\n      if (!instr.scalar_operands[0].is_absolute_value ||\n          !instr.scalar_operands[0].is_negated) {\n        b_abs_neg = builder_->createNoContractionUnaryOp(\n            spv::OpFNegate, type_float_, b_abs_neg);\n      }\n      condition = builder_->createBinOp(\n          spv::OpLogicalAnd, type_bool_, condition,\n          builder_->createBinOp(spv::OpFOrdGreaterThanEqual, type_bool_,\n                                b_abs_neg, const_float_max_neg));\n      // src0.b > 0 (need !(src0.b <= 0), but src0.b has already been checked\n      // for NaN).\n      condition = builder_->createBinOp(\n          spv::OpLogicalAnd, type_bool_, condition,\n          builder_->createBinOp(spv::OpFOrdGreaterThan, type_bool_, b,\n                                const_float_0_));\n      SpirvBuilder::IfBuilder multiply_if(\n          condition, spv::SelectionControlMaskNone, *builder_);\n      spv::Id product;\n      {\n        // Multiplication case.\n        spv::Id a = instr.scalar_operands[0].GetComponent(0) !=\n                            instr.scalar_operands[0].GetComponent(1)\n                        ? GetOperandComponents(operand_storage[0],\n                                               instr.scalar_operands[0], 0b0001)\n                        : b;\n        product =\n            builder_->createNoContractionBinOp(spv::OpFMul, type_float_, a, ps);\n        // Shader Model 3: +0 or denormal * anything = +-0.\n        product = ZeroIfAnyOperandIsZero(\n            product, GetAbsoluteOperand(a, instr.scalar_operands[0]), ps_abs);\n      }\n      multiply_if.makeEndIf();\n      // Merge - choose between the product and -FLT_MAX.\n      return multiply_if.createMergePhi(product, const_float_max_neg);\n    }\n\n    case ucode::AluScalarOpcode::kMaxs:\n    case ucode::AluScalarOpcode::kMins:\n    case ucode::AluScalarOpcode::kMaxAs:\n    case ucode::AluScalarOpcode::kMaxAsf: {\n      spv::Id a, b;\n      GetOperandScalarXY(operand_storage[0], instr.scalar_operands[0], a, b);\n      if (instr.scalar_opcode == ucode::AluScalarOpcode::kMaxAs ||\n          instr.scalar_opcode == ucode::AluScalarOpcode::kMaxAsf) {\n        // maxas: a0 = (int)clamp(floor(src0.a + 0.5), -256.0, 255.0)\n        // maxasf: a0 = (int)clamp(floor(src0.a), -256.0, 255.0)\n        spv::Id maxa_address;\n        if (instr.scalar_opcode == ucode::AluScalarOpcode::kMaxAs) {\n          maxa_address = builder_->createNoContractionBinOp(\n              spv::OpFAdd, type_float_, a, builder_->makeFloatConstant(0.5f));\n        } else {\n          maxa_address = a;\n        }\n        builder_->createStore(\n            builder_->createUnaryOp(\n                spv::OpConvertFToS, type_int_,\n                builder_->createTriBuiltinCall(\n                    type_float_, ext_inst_glsl_std_450_, GLSLstd450NClamp,\n                    builder_->createUnaryBuiltinCall(\n                        type_float_, ext_inst_glsl_std_450_, GLSLstd450Floor,\n                        maxa_address),\n                    builder_->makeFloatConstant(-256.0f),\n                    builder_->makeFloatConstant(255.0f))),\n            var_main_address_register_);\n      }\n      if (a == b) {\n        // max is commonly used as mov.\n        return a;\n      }\n      // Shader Model 3 NaN behavior (a op b ? a : b, not SPIR-V FMax/FMin which\n      // are undefined for NaN or NMax/NMin which return the non-NaN operand).\n      return builder_->createTriOp(\n          spv::OpSelect, type_float_,\n          builder_->createBinOp(spv::Op(kOps[size_t(instr.scalar_opcode)]),\n                                type_bool_, a, b),\n          a, b);\n    }\n\n    case ucode::AluScalarOpcode::kSeqs:\n    case ucode::AluScalarOpcode::kSgts:\n    case ucode::AluScalarOpcode::kSges:\n    case ucode::AluScalarOpcode::kSnes:\n      return builder_->createTriOp(\n          spv::OpSelect, type_float_,\n          builder_->createBinOp(\n              spv::Op(kOps[size_t(instr.scalar_opcode)]), type_bool_,\n              GetOperandComponents(operand_storage[0], instr.scalar_operands[0],\n                                   0b0001),\n              const_float_0_),\n          const_float_1_, const_float_0_);\n\n    case ucode::AluScalarOpcode::kFrcs:\n    case ucode::AluScalarOpcode::kTruncs:\n    case ucode::AluScalarOpcode::kFloors:\n    case ucode::AluScalarOpcode::kExp:\n    case ucode::AluScalarOpcode::kLog:\n    case ucode::AluScalarOpcode::kRsq:\n    case ucode::AluScalarOpcode::kSqrt:\n    case ucode::AluScalarOpcode::kSin:\n    case ucode::AluScalarOpcode::kCos:\n      return builder_->createUnaryBuiltinCall(\n          type_float_, ext_inst_glsl_std_450_,\n          GLSLstd450(kOps[size_t(instr.scalar_opcode)]),\n          GetOperandComponents(operand_storage[0], instr.scalar_operands[0],\n                               0b0001));\n    case ucode::AluScalarOpcode::kLogc: {\n      spv::Id result = builder_->createUnaryBuiltinCall(\n          type_float_, ext_inst_glsl_std_450_, GLSLstd450Log2,\n          GetOperandComponents(operand_storage[0], instr.scalar_operands[0],\n                               0b0001));\n      return builder_->createTriOp(\n          spv::OpSelect, type_float_,\n          builder_->createBinOp(spv::OpFOrdEqual, type_bool_, result,\n                                builder_->makeFloatConstant(-INFINITY)),\n          builder_->makeFloatConstant(-FLT_MAX), result);\n    }\n    case ucode::AluScalarOpcode::kRcpc: {\n      spv::Id result = builder_->createNoContractionBinOp(\n          spv::OpFDiv, type_float_, const_float_1_,\n          GetOperandComponents(operand_storage[0], instr.scalar_operands[0],\n                               0b0001));\n      result = builder_->createTriOp(\n          spv::OpSelect, type_float_,\n          builder_->createBinOp(spv::OpFOrdEqual, type_bool_, result,\n                                builder_->makeFloatConstant(-INFINITY)),\n          builder_->makeFloatConstant(-FLT_MAX), result);\n      return builder_->createTriOp(\n          spv::OpSelect, type_float_,\n          builder_->createBinOp(spv::OpFOrdEqual, type_bool_, result,\n                                builder_->makeFloatConstant(INFINITY)),\n          builder_->makeFloatConstant(FLT_MAX), result);\n    }\n    case ucode::AluScalarOpcode::kRcpf: {\n      spv::Id result = builder_->createNoContractionBinOp(\n          spv::OpFDiv, type_float_, const_float_1_,\n          GetOperandComponents(operand_storage[0], instr.scalar_operands[0],\n                               0b0001));\n      result = builder_->createTriOp(\n          spv::OpSelect, type_float_,\n          builder_->createBinOp(spv::OpFOrdEqual, type_bool_, result,\n                                builder_->makeFloatConstant(INFINITY)),\n          const_float_0_, result);\n      // Can't create -0.0f with makeFloatConstant due to float comparison\n      // internally, cast to bit pattern.\n      result = builder_->createTriOp(\n          spv::OpSelect, type_uint_,\n          builder_->createBinOp(spv::OpFOrdEqual, type_bool_, result,\n                                builder_->makeFloatConstant(-INFINITY)),\n          builder_->makeUintConstant(uint32_t(INT32_MIN)),\n          builder_->createUnaryOp(spv::OpBitcast, type_uint_, result));\n      return builder_->createUnaryOp(spv::OpBitcast, type_float_, result);\n    }\n    case ucode::AluScalarOpcode::kRcp: {\n      return builder_->createNoContractionBinOp(\n          spv::OpFDiv, type_float_, const_float_1_,\n          GetOperandComponents(operand_storage[0], instr.scalar_operands[0],\n                               0b0001));\n    }\n    case ucode::AluScalarOpcode::kRsqc: {\n      spv::Id result = builder_->createUnaryBuiltinCall(\n          type_float_, ext_inst_glsl_std_450_, GLSLstd450InverseSqrt,\n          GetOperandComponents(operand_storage[0], instr.scalar_operands[0],\n                               0b0001));\n      result = builder_->createTriOp(\n          spv::OpSelect, type_float_,\n          builder_->createBinOp(spv::OpFOrdEqual, type_bool_, result,\n                                builder_->makeFloatConstant(-INFINITY)),\n          builder_->makeFloatConstant(-FLT_MAX), result);\n      return builder_->createTriOp(\n          spv::OpSelect, type_float_,\n          builder_->createBinOp(spv::OpFOrdEqual, type_bool_, result,\n                                builder_->makeFloatConstant(INFINITY)),\n          builder_->makeFloatConstant(FLT_MAX), result);\n    }\n    case ucode::AluScalarOpcode::kRsqf: {\n      spv::Id result = builder_->createUnaryBuiltinCall(\n          type_float_, ext_inst_glsl_std_450_, GLSLstd450InverseSqrt,\n          GetOperandComponents(operand_storage[0], instr.scalar_operands[0],\n                               0b0001));\n      result = builder_->createTriOp(\n          spv::OpSelect, type_float_,\n          builder_->createBinOp(spv::OpFOrdEqual, type_bool_, result,\n                                builder_->makeFloatConstant(INFINITY)),\n          const_float_0_, result);\n      // Can't create -0.0f with makeFloatConstant due to float comparison\n      // internally, cast to bit pattern.\n      result = builder_->createTriOp(\n          spv::OpSelect, type_uint_,\n          builder_->createBinOp(spv::OpFOrdEqual, type_bool_, result,\n                                builder_->makeFloatConstant(-INFINITY)),\n          builder_->makeUintConstant(uint32_t(INT32_MIN)),\n          builder_->createUnaryOp(spv::OpBitcast, type_uint_, result));\n      return builder_->createUnaryOp(spv::OpBitcast, type_float_, result);\n    }\n\n    case ucode::AluScalarOpcode::kSetpEq:\n    case ucode::AluScalarOpcode::kSetpNe:\n    case ucode::AluScalarOpcode::kSetpGt:\n    case ucode::AluScalarOpcode::kSetpGe: {\n      spv::Id predicate = builder_->createBinOp(\n          spv::Op(kOps[size_t(instr.scalar_opcode)]), type_bool_,\n          GetOperandComponents(operand_storage[0], instr.scalar_operands[0],\n                               0b0001),\n          const_float_0_);\n      builder_->createStore(predicate, var_main_predicate_);\n      predicate_written = true;\n      return builder_->createTriOp(spv::OpSelect, type_float_, predicate,\n                                   const_float_0_, const_float_1_);\n    }\n    case ucode::AluScalarOpcode::kSetpInv: {\n      spv::Id a = GetOperandComponents(operand_storage[0],\n                                       instr.scalar_operands[0], 0b0001);\n      spv::Id predicate = builder_->createBinOp(spv::OpFOrdEqual, type_bool_, a,\n                                                const_float_1_);\n      builder_->createStore(predicate, var_main_predicate_);\n      predicate_written = true;\n      return builder_->createTriOp(\n          spv::OpSelect, type_float_, predicate, const_float_0_,\n          builder_->createTriOp(\n              spv::OpSelect, type_float_,\n              builder_->createBinOp(spv::OpFOrdEqual, type_bool_, a,\n                                    const_float_0_),\n              const_float_1_, a));\n    }\n    case ucode::AluScalarOpcode::kSetpPop: {\n      spv::Id a_minus_1 = builder_->createNoContractionBinOp(\n          spv::OpFSub, type_float_,\n          GetOperandComponents(operand_storage[0], instr.scalar_operands[0],\n                               0b0001),\n          const_float_1_);\n      spv::Id predicate = builder_->createBinOp(\n          spv::OpFOrdLessThanEqual, type_bool_, a_minus_1, const_float_0_);\n      builder_->createStore(predicate, var_main_predicate_);\n      predicate_written = true;\n      return builder_->createTriOp(spv::OpSelect, type_float_, predicate,\n                                   const_float_0_, a_minus_1);\n    }\n    case ucode::AluScalarOpcode::kSetpClr:\n      builder_->createStore(builder_->makeBoolConstant(false),\n                            var_main_predicate_);\n      return builder_->makeFloatConstant(FLT_MAX);\n    case ucode::AluScalarOpcode::kSetpRstr: {\n      spv::Id a = GetOperandComponents(operand_storage[0],\n                                       instr.scalar_operands[0], 0b0001);\n      spv::Id predicate = builder_->createBinOp(spv::OpFOrdEqual, type_bool_, a,\n                                                const_float_0_);\n      builder_->createStore(predicate, var_main_predicate_);\n      predicate_written = true;\n      return builder_->createTriOp(spv::OpSelect, type_float_, predicate,\n                                   const_float_0_, a);\n    }\n\n    case ucode::AluScalarOpcode::kKillsEq:\n    case ucode::AluScalarOpcode::kKillsGt:\n    case ucode::AluScalarOpcode::kKillsGe:\n    case ucode::AluScalarOpcode::kKillsNe:\n    case ucode::AluScalarOpcode::kKillsOne: {\n      KillPixel(builder_->createBinOp(\n                    spv::Op(kOps[size_t(instr.scalar_opcode)]), type_bool_,\n                    GetOperandComponents(operand_storage[0],\n                                         instr.scalar_operands[0], 0b0001),\n                    instr.scalar_opcode == ucode::AluScalarOpcode::kKillsOne\n                        ? const_float_1_\n                        : const_float_0_),\n                memexport_eM_potentially_written_before);\n      return const_float_0_;\n    }\n\n    case ucode::AluScalarOpcode::kMulsc0:\n    case ucode::AluScalarOpcode::kMulsc1: {\n      spv::Id operand_0 = GetOperandComponents(\n          operand_storage[0], instr.scalar_operands[0], 0b0001);\n      spv::Id operand_1 = GetOperandComponents(\n          operand_storage[1], instr.scalar_operands[1], 0b0001);\n      spv::Id result = builder_->createNoContractionBinOp(\n          spv::OpFMul, type_float_, operand_0, operand_1);\n      if (!(instr.scalar_operands[0].GetIdenticalComponents(\n                instr.scalar_operands[1]) &\n            0b0001)) {\n        // Shader Model 3: +0 or denormal * anything = +-0.\n        result = ZeroIfAnyOperandIsZero(\n            result, GetAbsoluteOperand(operand_0, instr.scalar_operands[0]),\n            GetAbsoluteOperand(operand_1, instr.scalar_operands[1]));\n      }\n      return result;\n    }\n    case ucode::AluScalarOpcode::kAddsc0:\n    case ucode::AluScalarOpcode::kAddsc1:\n    case ucode::AluScalarOpcode::kSubsc0:\n    case ucode::AluScalarOpcode::kSubsc1: {\n      return builder_->createNoContractionBinOp(\n          spv::Op(kOps[size_t(instr.scalar_opcode)]), type_float_,\n          GetOperandComponents(operand_storage[0], instr.scalar_operands[0],\n                               0b0001),\n          GetOperandComponents(operand_storage[1], instr.scalar_operands[1],\n                               0b0001));\n    }\n\n    case ucode::AluScalarOpcode::kRetainPrev:\n      // Special case in ProcessAluInstruction - loading ps only if writing to\n      // anywhere.\n      return spv::NoResult;\n  }\n\n  assert_unhandled_case(instr.scalar_opcode);\n  EmitTranslationError(\"Unknown ALU scalar operation\");\n  return spv::NoResult;\n}\n\n}  // namespace gpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/spirv_shader_translator_fetch.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/spirv_shader_translator.h\"\n\n#include <climits>\n#include <cmath>\n#include <memory>\n#include <sstream>\n#include <utility>\n\n#include \"third_party/fmt/include/fmt/format.h\"\n#include \"third_party/glslang/SPIRV/GLSL.std.450.h\"\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/math.h\"\n\nnamespace xe {\nnamespace gpu {\n\nvoid SpirvShaderTranslator::ProcessVertexFetchInstruction(\n    const ParsedVertexFetchInstruction& instr) {\n  UpdateInstructionPredication(instr.is_predicated, instr.predicate_condition);\n\n  uint32_t used_result_components = instr.result.GetUsedResultComponents();\n  uint32_t needed_words = xenos::GetVertexFormatNeededWords(\n      instr.attributes.data_format, used_result_components);\n  // If this is vfetch_full, the address may still be needed for vfetch_mini -\n  // don't exit before calculating the address.\n  if (!needed_words && instr.is_mini_fetch) {\n    // Nothing to load - just constant 0/1 writes, or the swizzle includes only\n    // components that don't exist in the format (writing zero instead of them).\n    // Unpacking assumes at least some word is needed.\n    StoreResult(instr.result, spv::NoResult);\n    return;\n  }\n\n  EnsureBuildPointAvailable();\n\n  uint32_t fetch_constant_word_0_index = instr.operands[1].storage_index << 1;\n\n  spv::Id address;\n  if (instr.is_mini_fetch) {\n    // `base + index * stride` loaded by vfetch_full.\n    address = builder_->createLoad(var_main_vfetch_address_, spv::NoPrecision);\n  } else {\n    // Get the base address in dwords from the bits 2:31 of the first fetch\n    // constant word.\n    id_vector_temp_.clear();\n    // The only element of the fetch constant buffer.\n    id_vector_temp_.push_back(const_int_0_);\n    // Vector index.\n    id_vector_temp_.push_back(\n        builder_->makeIntConstant(int(fetch_constant_word_0_index >> 2)));\n    // Component index.\n    id_vector_temp_.push_back(\n        builder_->makeIntConstant(int(fetch_constant_word_0_index & 3)));\n    spv::Id fetch_constant_word_0 = builder_->createLoad(\n        builder_->createAccessChain(spv::StorageClassUniform,\n                                    uniform_fetch_constants_, id_vector_temp_),\n        spv::NoPrecision);\n    // TODO(Triang3l): Verify the fetch constant type (that it's a vertex fetch,\n    // not a texture fetch) here instead of dropping draws with invalid vertex\n    // fetch constants on the CPU when proper bound checks are added - vfetch\n    // may be conditional, so fetch constants may also be used conditionally.\n    address = builder_->createUnaryOp(\n        spv::OpBitcast, type_int_,\n        builder_->createBinOp(spv::OpShiftRightLogical, type_uint_,\n                              fetch_constant_word_0,\n                              builder_->makeUintConstant(2)));\n    if (instr.attributes.stride) {\n      // Convert the index to an integer by flooring or by rounding to the\n      // nearest (as floor(index + 0.5) because rounding to the nearest even\n      // makes no sense for addressing, both 1.5 and 2.5 would be 2).\n      spv::Id index = GetOperandComponents(\n          LoadOperandStorage(instr.operands[0]), instr.operands[0], 0b0001);\n      if (instr.attributes.is_index_rounded) {\n        index = builder_->createNoContractionBinOp(\n            spv::OpFAdd, type_float_, index, builder_->makeFloatConstant(0.5f));\n      }\n      index = builder_->createUnaryOp(\n          spv::OpConvertFToS, type_int_,\n          builder_->createUnaryBuiltinCall(type_float_, ext_inst_glsl_std_450_,\n                                           GLSLstd450Floor, index));\n      if (instr.attributes.stride > 1) {\n        index = builder_->createBinOp(\n            spv::OpIMul, type_int_, index,\n            builder_->makeIntConstant(int(instr.attributes.stride)));\n      }\n      address = builder_->createBinOp(spv::OpIAdd, type_int_, address, index);\n    }\n    // Store the address for the subsequent vfetch_mini.\n    builder_->createStore(address, var_main_vfetch_address_);\n  }\n\n  if (!needed_words) {\n    // The vfetch_full address has been loaded for the subsequent vfetch_mini,\n    // but there's no data to load.\n    StoreResult(instr.result, spv::NoResult);\n    return;\n  }\n\n  // Load the needed words.\n  unsigned int word_composite_indices[4] = {};\n  spv::Id word_composite_constituents[4];\n  uint32_t word_count = 0;\n  uint32_t words_remaining = needed_words;\n  uint32_t word_index;\n  while (xe::bit_scan_forward(words_remaining, &word_index)) {\n    words_remaining &= ~(1 << word_index);\n    spv::Id word_address = address;\n    // Add the word offset from the instruction (signed), plus the offset of the\n    // word within the element.\n    int32_t word_offset = instr.attributes.offset + word_index;\n    if (word_offset) {\n      word_address =\n          builder_->createBinOp(spv::OpIAdd, type_int_, word_address,\n                                builder_->makeIntConstant(int(word_offset)));\n    }\n    word_composite_indices[word_index] = word_count;\n    // FIXME(Triang3l): Bound checking is not done here, but haven't encountered\n    // any games relying on out-of-bounds access. On Adreno 200 on Android (LG\n    // P705), however, words (not full elements) out of glBufferData bounds\n    // contain 0.\n    word_composite_constituents[word_count++] =\n        LoadUint32FromSharedMemory(word_address);\n  }\n  spv::Id words;\n  if (word_count > 1) {\n    // Copying from the array to id_vector_temp_ now, not in the loop above,\n    // because of the LoadUint32FromSharedMemory call (potentially using\n    // id_vector_temp_ internally).\n    id_vector_temp_.clear();\n    id_vector_temp_.insert(id_vector_temp_.cend(), word_composite_constituents,\n                           word_composite_constituents + word_count);\n    words = builder_->createCompositeConstruct(\n        type_uint_vectors_[word_count - 1], id_vector_temp_);\n  } else {\n    words = word_composite_constituents[0];\n  }\n\n  // Endian swap the words, getting the endianness from bits 0:1 of the second\n  // fetch constant word.\n  uint32_t fetch_constant_word_1_index = fetch_constant_word_0_index + 1;\n  id_vector_temp_.clear();\n  // The only element of the fetch constant buffer.\n  id_vector_temp_.push_back(const_int_0_);\n  // Vector index.\n  id_vector_temp_.push_back(\n      builder_->makeIntConstant(int(fetch_constant_word_1_index >> 2)));\n  // Component index.\n  id_vector_temp_.push_back(\n      builder_->makeIntConstant(int(fetch_constant_word_1_index & 3)));\n  spv::Id fetch_constant_word_1 = builder_->createLoad(\n      builder_->createAccessChain(spv::StorageClassUniform,\n                                  uniform_fetch_constants_, id_vector_temp_),\n      spv::NoPrecision);\n  words = EndianSwap32Uint(\n      words, builder_->createBinOp(spv::OpBitwiseAnd, type_uint_,\n                                   fetch_constant_word_1,\n                                   builder_->makeUintConstant(0b11)));\n\n  spv::Id result = spv::NoResult;\n\n  // Convert the format.\n  uint32_t used_format_components =\n      used_result_components & ((1 << xenos::GetVertexFormatComponentCount(\n                                     instr.attributes.data_format)) -\n                                1);\n  // If needed_words is not zero (checked in the beginning), this must not be\n  // zero too. For simplicity, it's assumed that something will be unpacked\n  // here.\n  assert_not_zero(used_format_components);\n  uint32_t used_format_component_count = xe::bit_count(used_format_components);\n  spv::Id result_type = type_float_vectors_[used_format_component_count - 1];\n  bool format_is_packed = false;\n  int packed_widths[4] = {}, packed_offsets[4] = {};\n  uint32_t packed_words[4] = {};\n  switch (instr.attributes.data_format) {\n    case xenos::VertexFormat::k_8_8_8_8:\n      format_is_packed = true;\n      packed_widths[0] = packed_widths[1] = packed_widths[2] =\n          packed_widths[3] = 8;\n      packed_offsets[1] = 8;\n      packed_offsets[2] = 16;\n      packed_offsets[3] = 24;\n      break;\n    case xenos::VertexFormat::k_2_10_10_10:\n      format_is_packed = true;\n      packed_widths[0] = packed_widths[1] = packed_widths[2] = 10;\n      packed_widths[3] = 2;\n      packed_offsets[1] = 10;\n      packed_offsets[2] = 20;\n      packed_offsets[3] = 30;\n      break;\n    case xenos::VertexFormat::k_10_11_11:\n      format_is_packed = true;\n      packed_widths[0] = packed_widths[1] = 11;\n      packed_widths[2] = 10;\n      packed_offsets[1] = 11;\n      packed_offsets[2] = 22;\n      break;\n    case xenos::VertexFormat::k_11_11_10:\n      format_is_packed = true;\n      packed_widths[0] = 10;\n      packed_widths[1] = packed_widths[2] = 11;\n      packed_offsets[1] = 10;\n      packed_offsets[2] = 21;\n      break;\n    case xenos::VertexFormat::k_16_16:\n      format_is_packed = true;\n      packed_widths[0] = packed_widths[1] = 16;\n      packed_offsets[1] = 16;\n      break;\n    case xenos::VertexFormat::k_16_16_16_16:\n      format_is_packed = true;\n      packed_widths[0] = packed_widths[1] = packed_widths[2] =\n          packed_widths[3] = 16;\n      packed_offsets[1] = packed_offsets[3] = 16;\n      packed_words[2] = packed_words[3] = 1;\n      break;\n\n    case xenos::VertexFormat::k_16_16_FLOAT:\n    case xenos::VertexFormat::k_16_16_16_16_FLOAT: {\n      // FIXME(Triang3l): This converts from GLSL float16 with NaNs instead of\n      // Xbox 360 float16 with extended range. However, haven't encountered\n      // games relying on that yet.\n      spv::Id word_needed_component_values[2] = {};\n      for (uint32_t i = 0; i < 2; ++i) {\n        uint32_t word_needed_components =\n            (used_format_components >> (i * 2)) & 0b11;\n        if (!word_needed_components) {\n          continue;\n        }\n        spv::Id word;\n        if (word_count > 1) {\n          word = builder_->createCompositeExtract(words, type_uint_,\n                                                  word_composite_indices[i]);\n        } else {\n          word = words;\n        }\n        word = builder_->createUnaryBuiltinCall(type_float2_,\n                                                ext_inst_glsl_std_450_,\n                                                GLSLstd450UnpackHalf2x16, word);\n        if (word_needed_components != 0b11) {\n          // If only one of two components is needed, extract it.\n          word = builder_->createCompositeExtract(\n              word, type_float_, (word_needed_components & 0b01) ? 0 : 1);\n        }\n        word_needed_component_values[i] = word;\n      }\n      if (word_needed_component_values[1] == spv::NoResult) {\n        result = word_needed_component_values[0];\n      } else if (word_needed_component_values[0] == spv::NoResult) {\n        result = word_needed_component_values[1];\n      } else {\n        // Bypassing the assertion in spv::Builder::createCompositeConstruct as\n        // of November 5, 2020 - can construct vectors by concatenating vectors,\n        // not just from individual scalars.\n        std::unique_ptr<spv::Instruction> composite_construct_op =\n            std::make_unique<spv::Instruction>(builder_->getUniqueId(),\n                                               result_type,\n                                               spv::OpCompositeConstruct);\n        composite_construct_op->addIdOperand(word_needed_component_values[0]);\n        composite_construct_op->addIdOperand(word_needed_component_values[1]);\n        result = composite_construct_op->getResultId();\n        builder_->getBuildPoint()->addInstruction(\n            std::move(composite_construct_op));\n      }\n    } break;\n\n    case xenos::VertexFormat::k_32:\n    case xenos::VertexFormat::k_32_32:\n    case xenos::VertexFormat::k_32_32_32_32:\n      assert_true(used_format_components == needed_words);\n      if (instr.attributes.is_signed) {\n        result = builder_->createUnaryOp(\n            spv::OpBitcast, type_int_vectors_[used_format_component_count - 1],\n            words);\n        result =\n            builder_->createUnaryOp(spv::OpConvertSToF, result_type, result);\n      } else {\n        result =\n            builder_->createUnaryOp(spv::OpConvertUToF, result_type, words);\n      }\n      if (!instr.attributes.is_integer) {\n        if (instr.attributes.is_signed) {\n          switch (instr.attributes.signed_rf_mode) {\n            case xenos::SignedRepeatingFractionMode::kZeroClampMinusOne:\n              result = builder_->createNoContractionBinOp(\n                  spv::OpVectorTimesScalar, result_type, result,\n                  builder_->makeFloatConstant(1.0f / 2147483647.0f));\n              // No need to clamp to -1 if signed - 1/(2^31-1) is rounded to\n              // 1/(2^31) as float32.\n              break;\n            case xenos::SignedRepeatingFractionMode::kNoZero: {\n              result = builder_->createNoContractionBinOp(\n                  spv::OpVectorTimesScalar, result_type, result,\n                  builder_->makeFloatConstant(1.0f / 2147483647.5f));\n              spv::Id const_no_zero =\n                  builder_->makeFloatConstant(0.5f / 2147483647.5f);\n              if (used_format_component_count > 1) {\n                id_vector_temp_.clear();\n                id_vector_temp_.insert(id_vector_temp_.cend(),\n                                       used_format_component_count,\n                                       const_no_zero);\n                const_no_zero = builder_->makeCompositeConstant(\n                    result_type, id_vector_temp_);\n              }\n              result = builder_->createNoContractionBinOp(\n                  spv::OpFAdd, result_type, result, const_no_zero);\n            } break;\n            default:\n              assert_unhandled_case(instr.attributes.signed_rf_mode);\n          }\n        } else {\n          result = builder_->createNoContractionBinOp(\n              spv::OpVectorTimesScalar, result_type, result,\n              builder_->makeFloatConstant(1.0f / 4294967295.0f));\n        }\n      }\n      break;\n\n    case xenos::VertexFormat::k_32_FLOAT:\n    case xenos::VertexFormat::k_32_32_FLOAT:\n    case xenos::VertexFormat::k_32_32_32_32_FLOAT:\n    case xenos::VertexFormat::k_32_32_32_FLOAT:\n      assert_true(used_format_components == needed_words);\n      result = builder_->createUnaryOp(\n          spv::OpBitcast, type_float_vectors_[word_count - 1], words);\n      break;\n\n    default:\n      assert_unhandled_case(instr.attributes.data_format);\n  }\n\n  if (format_is_packed) {\n    assert_true(result == spv::NoResult);\n    // Extract the components from the words as individual ints or uints.\n    if (instr.attributes.is_signed) {\n      // Sign-extending extraction - in GLSL the sign-extending overload accepts\n      // int.\n      words = builder_->createUnaryOp(spv::OpBitcast,\n                                      type_int_vectors_[word_count - 1], words);\n    }\n    int extracted_widths[4] = {};\n    spv::Id extracted_components[4] = {};\n    uint32_t extracted_component_count = 0;\n    unsigned int extraction_word_current_index = UINT_MAX;\n    // Default is `words` itself if 1 word loaded.\n    spv::Id extraction_word_current = words;\n    for (uint32_t i = 0; i < 4; ++i) {\n      if (!(used_format_components & (1 << i))) {\n        continue;\n      }\n      if (word_count > 1) {\n        unsigned int extraction_word_new_index =\n            word_composite_indices[packed_words[i]];\n        if (extraction_word_current_index != extraction_word_new_index) {\n          extraction_word_current_index = extraction_word_new_index;\n          extraction_word_current = builder_->createCompositeExtract(\n              words, instr.attributes.is_signed ? type_int_ : type_uint_,\n              extraction_word_new_index);\n        }\n      }\n      int extraction_width = packed_widths[i];\n      assert_not_zero(extraction_width);\n      extracted_widths[extracted_component_count] = extraction_width;\n      extracted_components[extracted_component_count] = builder_->createTriOp(\n          instr.attributes.is_signed ? spv::OpBitFieldSExtract\n                                     : spv::OpBitFieldUExtract,\n          instr.attributes.is_signed ? type_int_ : type_uint_,\n          extraction_word_current, builder_->makeIntConstant(packed_offsets[i]),\n          builder_->makeIntConstant(extraction_width));\n      ++extracted_component_count;\n    }\n    // Combine extracted components into a vector.\n    assert_true(extracted_component_count == used_format_component_count);\n    if (used_format_component_count > 1) {\n      id_vector_temp_.clear();\n      id_vector_temp_.insert(\n          id_vector_temp_.cend(), extracted_components,\n          extracted_components + used_format_component_count);\n      result = builder_->createCompositeConstruct(\n          instr.attributes.is_signed\n              ? type_int_vectors_[used_format_component_count - 1]\n              : type_uint_vectors_[used_format_component_count - 1],\n          id_vector_temp_);\n    } else {\n      result = extracted_components[0];\n    }\n    // Convert to floating-point.\n    result = builder_->createUnaryOp(\n        instr.attributes.is_signed ? spv::OpConvertSToF : spv::OpConvertUToF,\n        result_type, result);\n    // Normalize.\n    if (!instr.attributes.is_integer) {\n      float packed_scales[4];\n      bool packed_scales_same = true;\n      for (uint32_t i = 0; i < used_format_component_count; ++i) {\n        int extracted_width = extracted_widths[i];\n        // The signed case would result in 1.0 / 0.0 for 1-bit components, but\n        // there are no Xenos formats with them.\n        assert_true(extracted_width >= 2);\n        packed_scales_same &= extracted_width != extracted_widths[0];\n        float packed_scale_inv;\n        if (instr.attributes.is_signed) {\n          packed_scale_inv = float((uint32_t(1) << (extracted_width - 1)) - 1);\n          if (instr.attributes.signed_rf_mode ==\n              xenos::SignedRepeatingFractionMode::kNoZero) {\n            packed_scale_inv += 0.5f;\n          }\n        } else {\n          packed_scale_inv = float((uint32_t(1) << extracted_width) - 1);\n        }\n        packed_scales[i] = 1.0f / packed_scale_inv;\n      }\n      spv::Id const_packed_scale =\n          builder_->makeFloatConstant(packed_scales[0]);\n      spv::Op packed_scale_mul_op;\n      if (used_format_component_count > 1) {\n        if (packed_scales_same) {\n          packed_scale_mul_op = spv::OpVectorTimesScalar;\n        } else {\n          packed_scale_mul_op = spv::OpFMul;\n          id_vector_temp_.clear();\n          id_vector_temp_.push_back(const_packed_scale);\n          for (uint32_t i = 1; i < used_format_component_count; ++i) {\n            id_vector_temp_.push_back(\n                builder_->makeFloatConstant(packed_scales[i]));\n          }\n          const_packed_scale =\n              builder_->makeCompositeConstant(result_type, id_vector_temp_);\n        }\n      } else {\n        packed_scale_mul_op = spv::OpFMul;\n      }\n      result = builder_->createNoContractionBinOp(\n          packed_scale_mul_op, result_type, result, const_packed_scale);\n      if (instr.attributes.is_signed) {\n        switch (instr.attributes.signed_rf_mode) {\n          case xenos::SignedRepeatingFractionMode::kZeroClampMinusOne: {\n            // Treat both -(2^(n-1)) and -(2^(n-1)-1) as -1. Using regular FMax,\n            // not NMax, because the number is known not to be NaN.\n            spv::Id const_minus_1 = builder_->makeFloatConstant(-1.0f);\n            if (used_format_component_count > 1) {\n              id_vector_temp_.clear();\n              id_vector_temp_.resize(used_format_component_count,\n                                     const_minus_1);\n              const_minus_1 =\n                  builder_->makeCompositeConstant(result_type, id_vector_temp_);\n            }\n            result = builder_->createBinBuiltinCall(\n                result_type, ext_inst_glsl_std_450_, GLSLstd450FMax, result,\n                const_minus_1);\n          } break;\n          case xenos::SignedRepeatingFractionMode::kNoZero:\n            id_vector_temp_.clear();\n            for (uint32_t i = 0; i < used_format_component_count; ++i) {\n              id_vector_temp_.push_back(\n                  builder_->makeFloatConstant(0.5f * packed_scales[i]));\n            }\n            result = builder_->createNoContractionBinOp(\n                spv::OpFAdd, result_type, result,\n                used_format_component_count > 1\n                    ? builder_->makeCompositeConstant(result_type,\n                                                      id_vector_temp_)\n                    : id_vector_temp_[0]);\n            break;\n          default:\n            assert_unhandled_case(instr.attributes.signed_rf_mode);\n        }\n      }\n    }\n  }\n\n  if (result != spv::NoResult) {\n    // Apply the exponent bias.\n    if (instr.attributes.exp_adjust) {\n      result = builder_->createNoContractionBinOp(\n          spv::OpVectorTimesScalar, builder_->getTypeId(result), result,\n          builder_->makeFloatConstant(\n              std::ldexp(1.0f, instr.attributes.exp_adjust)));\n    }\n\n    // If any components not present in the format were requested, pad the\n    // resulting vector with zeros.\n    uint32_t used_missing_components =\n        used_result_components & ~used_format_components;\n    if (used_missing_components) {\n      // Bypassing the assertion in spv::Builder::createCompositeConstruct as of\n      // November 5, 2020 - can construct vectors by concatenating vectors, not\n      // just from individual scalars.\n      std::unique_ptr<spv::Instruction> composite_construct_op =\n          std::make_unique<spv::Instruction>(\n              builder_->getUniqueId(),\n              type_float_vectors_[xe::bit_count(used_result_components) - 1],\n              spv::OpCompositeConstruct);\n      composite_construct_op->addIdOperand(result);\n      composite_construct_op->addIdOperand(\n          const_float_vectors_0_[xe::bit_count(used_missing_components) - 1]);\n      result = composite_construct_op->getResultId();\n      builder_->getBuildPoint()->addInstruction(\n          std::move(composite_construct_op));\n    }\n  }\n  StoreResult(instr.result, result);\n}\n\nvoid SpirvShaderTranslator::ProcessTextureFetchInstruction(\n    const ParsedTextureFetchInstruction& instr) {\n  UpdateInstructionPredication(instr.is_predicated, instr.predicate_condition);\n\n  EnsureBuildPointAvailable();\n\n  // Handle the instructions for setting the register LOD.\n  switch (instr.opcode) {\n    case ucode::FetchOpcode::kSetTextureLod:\n      builder_->createStore(\n          GetOperandComponents(LoadOperandStorage(instr.operands[0]),\n                               instr.operands[0], 0b0001),\n          var_main_tfetch_lod_);\n      return;\n    case ucode::FetchOpcode::kSetTextureGradientsHorz:\n      builder_->createStore(\n          GetOperandComponents(LoadOperandStorage(instr.operands[0]),\n                               instr.operands[0], 0b0111),\n          var_main_tfetch_gradients_h_);\n      return;\n    case ucode::FetchOpcode::kSetTextureGradientsVert:\n      builder_->createStore(\n          GetOperandComponents(LoadOperandStorage(instr.operands[0]),\n                               instr.operands[0], 0b0111),\n          var_main_tfetch_gradients_v_);\n      return;\n    default:\n      break;\n  }\n\n  // Handle instructions that store something.\n  uint32_t used_result_components = instr.result.GetUsedResultComponents();\n  uint32_t used_result_nonzero_components = instr.GetNonZeroResultComponents();\n  switch (instr.opcode) {\n    case ucode::FetchOpcode::kTextureFetch:\n      break;\n    case ucode::FetchOpcode::kGetTextureBorderColorFrac:\n      // TODO(Triang3l): Bind a black texture with a white border to calculate\n      // the border color fraction (in the X component of the result).\n      assert_always();\n      EmitTranslationError(\"getBCF is unimplemented\", false);\n      used_result_nonzero_components = 0;\n      break;\n    case ucode::FetchOpcode::kGetTextureComputedLod:\n      break;\n    case ucode::FetchOpcode::kGetTextureGradients:\n      break;\n    case ucode::FetchOpcode::kGetTextureWeights:\n      // FIXME(Triang3l): Currently disregarding the LOD completely in\n      // getWeights because the needed code would be very complicated, while\n      // getWeights is mostly used for things like PCF of shadow maps, that\n      // don't have mips. The LOD would be needed for the mip lerp factor in W\n      // of the return value and to choose the LOD where interpolation would\n      // take place for XYZ. That would require either implementing the LOD\n      // calculation algorithm using the ALU (since the `lod` instruction is\n      // limited to pixel shaders and can't be used when there's control flow\n      // divergence, unlike explicit gradients), or sampling a texture filled\n      // with LOD numbers (easier and more consistent - unclamped LOD doesn't\n      // make sense for getWeights anyway). The same applies to offsets.\n      used_result_nonzero_components &= ~uint32_t(0b1000);\n      break;\n    default:\n      assert_unhandled_case(instr.opcode);\n      EmitTranslationError(\"Unknown texture fetch operation\");\n      used_result_nonzero_components = 0;\n  }\n  uint32_t used_result_component_count = xe::bit_count(used_result_components);\n  if (!used_result_nonzero_components) {\n    // Nothing to fetch, only constant 0/1 writes - simplify the rest of the\n    // function so it doesn't have to handle this case.\n    if (used_result_components) {\n      StoreResult(instr.result,\n                  const_float_vectors_0_[used_result_component_count - 1]);\n    }\n    return;\n  }\n\n  spv::Id result[] = {const_float_0_, const_float_0_, const_float_0_,\n                      const_float_0_};\n\n  if (instr.opcode == ucode::FetchOpcode::kGetTextureGradients) {\n    // Doesn't need the texture, handle separately.\n    spv::Id operand_0_storage = LoadOperandStorage(instr.operands[0]);\n    bool derivative_function_x_used =\n        (used_result_nonzero_components & 0b0011) != 0;\n    bool derivative_function_y_used =\n        (used_result_nonzero_components & 0b1100) != 0;\n    spv::Id derivative_function_x = spv::NoResult;\n    spv::Id derivative_function_y = spv::NoResult;\n    if (derivative_function_x_used && derivative_function_y_used) {\n      spv::Id derivative_function =\n          GetOperandComponents(operand_0_storage, instr.operands[0], 0b0011);\n      derivative_function_x =\n          builder_->createCompositeExtract(derivative_function, type_float_, 0);\n      derivative_function_y =\n          builder_->createCompositeExtract(derivative_function, type_float_, 1);\n    } else {\n      if (derivative_function_x_used) {\n        derivative_function_x =\n            GetOperandComponents(operand_0_storage, instr.operands[0], 0b0001);\n      }\n      if (derivative_function_y_used) {\n        derivative_function_y =\n            GetOperandComponents(operand_0_storage, instr.operands[0], 0b0010);\n      }\n    }\n    builder_->addCapability(spv::CapabilityDerivativeControl);\n    uint32_t derivative_components_remaining = used_result_nonzero_components;\n    uint32_t derivative_component_index;\n    while (xe::bit_scan_forward(derivative_components_remaining,\n                                &derivative_component_index)) {\n      derivative_components_remaining &=\n          ~(UINT32_C(1) << derivative_component_index);\n      result[derivative_component_index] = builder_->createUnaryOp(\n          (derivative_component_index & 0b01) ? spv::OpDPdyCoarse\n                                              : spv::OpDPdxCoarse,\n          type_float_,\n          (derivative_component_index & 0b10) ? derivative_function_y\n                                              : derivative_function_x);\n    }\n  } else {\n    // kTextureFetch, kGetTextureComputedLod or kGetTextureWeights.\n\n    // Whether to use gradients (implicit or explicit) for LOD calculation.\n    bool use_computed_lod =\n        instr.attributes.use_computed_lod &&\n        (is_pixel_shader() || instr.attributes.use_register_gradients);\n    if (instr.opcode == ucode::FetchOpcode::kGetTextureComputedLod &&\n        (!use_computed_lod || instr.attributes.use_register_gradients)) {\n      assert_always();\n      EmitTranslationError(\n          \"getCompTexLOD used with explicit LOD or gradients - contradicts \"\n          \"MSDN\",\n          false);\n      StoreResult(instr.result,\n                  const_float_vectors_0_[used_result_component_count - 1]);\n      return;\n    }\n\n    uint32_t fetch_constant_index = instr.operands[1].storage_index;\n    uint32_t fetch_constant_word_0_index = 6 * fetch_constant_index;\n\n    spv::Id sampler = spv::NoResult;\n    spv::Id image_2d_array_or_cube_unsigned = spv::NoResult;\n    spv::Id image_2d_array_or_cube_signed = spv::NoResult;\n    spv::Id image_3d_unsigned = spv::NoResult;\n    spv::Id image_3d_signed = spv::NoResult;\n    if (instr.opcode != ucode::FetchOpcode::kGetTextureWeights) {\n      bool bindings_set_up = true;\n      // While GL_ARB_texture_query_lod specifies the value for\n      // GL_NEAREST_MIPMAP_NEAREST and GL_LINEAR_MIPMAP_NEAREST minifying\n      // functions as rounded (unlike the `lod` instruction in Direct3D 10.1+,\n      // which is not defined for point sampling), the XNA assembler doesn't\n      // accept MipFilter overrides for getCompTexLOD - probably should be\n      // linear only, though not known exactly.\n      //\n      // 4D5307F2 uses vertex displacement map textures for tessellated models\n      // like the beehive tree with explicit LOD with point sampling (they store\n      // values packed in two components), however, the fetch constant has\n      // anisotropic filtering enabled. However, Direct3D 12 doesn't allow\n      // mixing anisotropic and point filtering. Possibly anistropic filtering\n      // should be disabled when explicit LOD is used - do this here.\n      size_t sampler_index = FindOrAddSamplerBinding(\n          fetch_constant_index, instr.attributes.mag_filter,\n          instr.attributes.min_filter,\n          instr.opcode == ucode::FetchOpcode::kGetTextureComputedLod\n              ? xenos::TextureFilter::kLinear\n              : instr.attributes.mip_filter,\n          use_computed_lod ? instr.attributes.aniso_filter\n                           : xenos::AnisoFilter::kDisabled);\n      xenos::FetchOpDimension dimension_2d_array_or_cube =\n          instr.dimension == xenos::FetchOpDimension::k3DOrStacked\n              ? xenos::FetchOpDimension::k2D\n              : instr.dimension;\n      size_t image_2d_array_or_cube_unsigned_index = FindOrAddTextureBinding(\n          fetch_constant_index, dimension_2d_array_or_cube, false);\n      size_t image_2d_array_or_cube_signed_index = FindOrAddTextureBinding(\n          fetch_constant_index, dimension_2d_array_or_cube, true);\n      if (sampler_index == SIZE_MAX ||\n          image_2d_array_or_cube_unsigned_index == SIZE_MAX ||\n          image_2d_array_or_cube_signed_index == SIZE_MAX) {\n        bindings_set_up = false;\n      }\n      size_t image_3d_unsigned_index = SIZE_MAX;\n      size_t image_3d_signed_index = SIZE_MAX;\n      if (instr.dimension == xenos::FetchOpDimension::k3DOrStacked) {\n        image_3d_unsigned_index = FindOrAddTextureBinding(\n            fetch_constant_index, xenos::FetchOpDimension::k3DOrStacked, false);\n        image_3d_signed_index = FindOrAddTextureBinding(\n            fetch_constant_index, xenos::FetchOpDimension::k3DOrStacked, true);\n        if (image_3d_unsigned_index == SIZE_MAX ||\n            image_3d_signed_index == SIZE_MAX) {\n          bindings_set_up = false;\n        }\n      }\n      if (!bindings_set_up) {\n        // Too many image or sampler bindings used.\n        StoreResult(instr.result,\n                    const_float_vectors_0_[used_result_component_count - 1]);\n        return;\n      }\n      sampler = builder_->createLoad(sampler_bindings_[sampler_index].variable,\n                                     spv::NoPrecision);\n      const TextureBinding& image_2d_array_or_cube_unsigned_binding =\n          texture_bindings_[image_2d_array_or_cube_unsigned_index];\n      image_2d_array_or_cube_unsigned = builder_->createLoad(\n          image_2d_array_or_cube_unsigned_binding.variable, spv::NoPrecision);\n      const TextureBinding& image_2d_array_or_cube_signed_binding =\n          texture_bindings_[image_2d_array_or_cube_signed_index];\n      image_2d_array_or_cube_signed = builder_->createLoad(\n          image_2d_array_or_cube_signed_binding.variable, spv::NoPrecision);\n      if (image_3d_unsigned_index != SIZE_MAX) {\n        const TextureBinding& image_3d_unsigned_binding =\n            texture_bindings_[image_3d_unsigned_index];\n        image_3d_unsigned = builder_->createLoad(\n            image_3d_unsigned_binding.variable, spv::NoPrecision);\n      }\n      if (image_3d_signed_index != SIZE_MAX) {\n        const TextureBinding& image_3d_signed_binding =\n            texture_bindings_[image_3d_signed_index];\n        image_3d_signed = builder_->createLoad(image_3d_signed_binding.variable,\n                                               spv::NoPrecision);\n      }\n    }\n\n    // Get offsets applied to the coordinates before sampling.\n    // FIXME(Triang3l): Offsets need to be applied at the LOD being fetched, not\n    // at LOD 0. However, since offsets have granularity of 0.5, not 1, on the\n    // Xenos, they can't be passed directly as ConstOffset to the image sample\n    // instruction (plus-minus 0.5 offsets are very common in games). But\n    // offsetting at mip levels is a rare usage case, mostly offsets are used\n    // for things like shadow maps and blur, where there are no mips.\n    float offset_values[3] = {};\n    // MSDN doesn't list offsets as getCompTexLOD parameters.\n    if (instr.opcode != ucode::FetchOpcode::kGetTextureComputedLod) {\n      // Add a small epsilon to the offset (1.5/4 the fixed-point texture\n      // coordinate ULP with 8-bit subtexel precision - shouldn't significantly\n      // effect the fixed-point conversion; 1/4 is also not enough with 3x\n      // resolution scaling very noticeably on the weapon in 4D5307E6, at least\n      // on the Direct3D 12 backend) to resolve ambiguity when fetching\n      // point-sampled textures between texels. This applies to both normalized\n      // (58410954 Xbox Live Arcade logo, coordinates interpolated between\n      // vertices with half-pixel offset) and unnormalized (4D5307E6 lighting\n      // G-buffer reading, ps_param_gen pixels) coordinates. On Nvidia Pascal,\n      // without this adjustment, blockiness is visible in both cases. Possibly\n      // there is a better way, however, an attempt was made to error-correct\n      // division by adding the difference between original and re-denormalized\n      // coordinates, but on Nvidia, `mul` (on Direct3D 12) and internal\n      // multiplication in texture sampling apparently round differently, so\n      // `mul` gives a value that would be floored as expected, but the\n      // left/upper pixel is still sampled instead.\n      const float kRoundingOffset = 1.5f / 1024.0f;\n      switch (instr.dimension) {\n        case xenos::FetchOpDimension::k1D:\n          offset_values[0] = instr.attributes.offset_x + kRoundingOffset;\n          if (instr.opcode == ucode::FetchOpcode::kGetTextureWeights) {\n            // For coordinate lerp factors. This needs to be done separately for\n            // point mag/min filters, but they're currently not handled here\n            // anyway.\n            offset_values[0] -= 0.5f;\n          }\n          break;\n        case xenos::FetchOpDimension::k2D:\n          offset_values[0] = instr.attributes.offset_x + kRoundingOffset;\n          offset_values[1] = instr.attributes.offset_y + kRoundingOffset;\n          if (instr.opcode == ucode::FetchOpcode::kGetTextureWeights) {\n            offset_values[0] -= 0.5f;\n            offset_values[1] -= 0.5f;\n          }\n          break;\n        case xenos::FetchOpDimension::k3DOrStacked:\n          offset_values[0] = instr.attributes.offset_x + kRoundingOffset;\n          offset_values[1] = instr.attributes.offset_y + kRoundingOffset;\n          offset_values[2] = instr.attributes.offset_z + kRoundingOffset;\n          if (instr.opcode == ucode::FetchOpcode::kGetTextureWeights) {\n            offset_values[0] -= 0.5f;\n            offset_values[1] -= 0.5f;\n            offset_values[2] -= 0.5f;\n          }\n          break;\n        case xenos::FetchOpDimension::kCube:\n          // Applying the rounding epsilon to cube maps too for potential game\n          // passes processing cube map faces themselves.\n          offset_values[0] = instr.attributes.offset_x + kRoundingOffset;\n          offset_values[1] = instr.attributes.offset_y + kRoundingOffset;\n          if (instr.opcode == ucode::FetchOpcode::kGetTextureWeights) {\n            offset_values[0] -= 0.5f;\n            offset_values[1] -= 0.5f;\n            // The logic for ST weights is the same for all faces.\n            // FIXME(Triang3l): If LOD calculation is added to getWeights, face\n            // offset probably will need to be handled too (if the hardware\n            // supports it at all, though MSDN lists OffsetZ in tfetchCube).\n          } else {\n            offset_values[2] = instr.attributes.offset_z;\n          }\n          break;\n      }\n    }\n    uint32_t offsets_not_zero = 0b000;\n    for (uint32_t i = 0; i < 3; ++i) {\n      if (offset_values[i]) {\n        offsets_not_zero |= 1 << i;\n      }\n    }\n\n    // Fetch constant word usage:\n    // - 2: Size (needed only once).\n    // - 3: Exponent adjustment (needed only once).\n    // - 4: Conditionally for 3D kTextureFetch: stacked texture filtering modes.\n    //      Unconditionally LOD kTextureFetch: LOD and gradient exponent bias,\n    //      result exponent bias.\n    // - 5: Dimensionality (3D or 2D stacked - needed only once).\n\n    // Load the texture size and whether it's 3D or stacked if needed.\n    // 1D: X - width.\n    // 2D, cube: X - width, Y - height (cube maps probably can be only square,\n    //           but for simplicity).\n    // 3D: X - width, Y - height, Z - depth.\n    uint32_t size_needed_components = 0b000;\n    bool data_is_3d_needed = false;\n    if (instr.opcode == ucode::FetchOpcode::kGetTextureWeights) {\n      // Size needed for denormalization for coordinate lerp factor.\n      // FIXME(Triang3l): Currently disregarding the LOD completely in\n      // getWeights. However, if the LOD lerp factor and the LOD where filtering\n      // would happen are ever calculated, all components of the size may be\n      // needed for ALU LOD calculation with normalized coordinates (or, if a\n      // texture filled with LOD indices is used, coordinates will need to be\n      // normalized as normally).\n      if (!instr.attributes.unnormalized_coordinates) {\n        switch (instr.dimension) {\n          case xenos::FetchOpDimension::k1D:\n            size_needed_components |= used_result_nonzero_components & 0b0001;\n            break;\n          case xenos::FetchOpDimension::k2D:\n          case xenos::FetchOpDimension::kCube:\n            size_needed_components |= used_result_nonzero_components & 0b0011;\n            break;\n          case xenos::FetchOpDimension::k3DOrStacked:\n            size_needed_components |= used_result_nonzero_components & 0b0111;\n            break;\n        }\n      }\n    } else {\n      // Size needed for normalization (or, for stacked texture layers,\n      // denormalization) and for offsets.\n      size_needed_components |= offsets_not_zero;\n      switch (instr.dimension) {\n        case xenos::FetchOpDimension::k1D:\n          if (instr.attributes.unnormalized_coordinates) {\n            size_needed_components |= 0b0001;\n          }\n          break;\n        case xenos::FetchOpDimension::k2D:\n          if (instr.attributes.unnormalized_coordinates) {\n            size_needed_components |= 0b0011;\n          }\n          break;\n        case xenos::FetchOpDimension::k3DOrStacked:\n          // Stacked and 3D textures are fetched from different bindings - the\n          // check is always needed.\n          data_is_3d_needed = true;\n          if (instr.attributes.unnormalized_coordinates) {\n            // Need to normalize all (if 3D).\n            size_needed_components |= 0b0111;\n          } else {\n            // Need to denormalize Z (if stacked).\n            size_needed_components |= 0b0100;\n          }\n          break;\n        case xenos::FetchOpDimension::kCube:\n          if (instr.attributes.unnormalized_coordinates) {\n            size_needed_components |= 0b0011;\n          }\n          // The size is not needed for face ID offset.\n          size_needed_components &= 0b0011;\n          break;\n      }\n    }\n    if (instr.dimension == xenos::FetchOpDimension::k3DOrStacked &&\n        size_needed_components) {\n      // Stacked and 3D textures have different size packing - need to get\n      // whether the texture is 3D unconditionally.\n      data_is_3d_needed = true;\n    }\n    spv::Id data_is_3d = spv::NoResult;\n    if (data_is_3d_needed) {\n      // Get the data dimensionality from the bits 9:10 of the fetch constant\n      // word 5.\n      id_vector_temp_.clear();\n      id_vector_temp_.push_back(const_int_0_);\n      id_vector_temp_.push_back(builder_->makeIntConstant(\n          int((fetch_constant_word_0_index + 5) >> 2)));\n      id_vector_temp_.push_back(builder_->makeIntConstant(\n          int((fetch_constant_word_0_index + 5) & 3)));\n      spv::Id fetch_constant_word_5 =\n          builder_->createLoad(builder_->createAccessChain(\n                                   spv::StorageClassUniform,\n                                   uniform_fetch_constants_, id_vector_temp_),\n                               spv::NoPrecision);\n      spv::Id data_dimension = builder_->createTriOp(\n          spv::OpBitFieldUExtract, type_uint_, fetch_constant_word_5,\n          builder_->makeUintConstant(9), builder_->makeUintConstant(2));\n      data_is_3d = builder_->createBinOp(\n          spv::OpIEqual, type_bool_, data_dimension,\n          builder_->makeUintConstant(\n              static_cast<unsigned int>(xenos::DataDimension::k3D)));\n    }\n    spv::Id size[3] = {};\n    if (size_needed_components) {\n      // Get the size from the fetch constant word 2.\n      id_vector_temp_.clear();\n      id_vector_temp_.push_back(const_int_0_);\n      id_vector_temp_.push_back(builder_->makeIntConstant(\n          int((fetch_constant_word_0_index + 2) >> 2)));\n      id_vector_temp_.push_back(builder_->makeIntConstant(\n          int((fetch_constant_word_0_index + 2) & 3)));\n      spv::Id fetch_constant_word_2 =\n          builder_->createLoad(builder_->createAccessChain(\n                                   spv::StorageClassUniform,\n                                   uniform_fetch_constants_, id_vector_temp_),\n                               spv::NoPrecision);\n      switch (instr.dimension) {\n        case xenos::FetchOpDimension::k1D: {\n          if (size_needed_components & 0b1) {\n            size[0] = builder_->createTriOp(\n                spv::OpBitFieldUExtract, type_uint_, fetch_constant_word_2,\n                const_uint_0_,\n                builder_->makeUintConstant(xenos::kTexture1DMaxWidthLog2));\n          }\n          assert_zero(size_needed_components & 0b110);\n        } break;\n        case xenos::FetchOpDimension::k2D:\n        case xenos::FetchOpDimension::kCube: {\n          if (size_needed_components & 0b1) {\n            size[0] = builder_->createTriOp(\n                spv::OpBitFieldUExtract, type_uint_, fetch_constant_word_2,\n                const_uint_0_,\n                builder_->makeUintConstant(\n                    xenos::kTexture2DCubeMaxWidthHeightLog2));\n          }\n          if (size_needed_components & 0b10) {\n            spv::Id width_height_bit_count = builder_->makeUintConstant(\n                xenos::kTexture2DCubeMaxWidthHeightLog2);\n            size[1] = builder_->createTriOp(\n                spv::OpBitFieldUExtract, type_uint_, fetch_constant_word_2,\n                width_height_bit_count, width_height_bit_count);\n          }\n          assert_zero(size_needed_components & 0b100);\n        } break;\n        case xenos::FetchOpDimension::k3DOrStacked: {\n          if (size_needed_components & 0b1) {\n            spv::Id size_3d =\n                builder_->createTriOp(spv::OpBitFieldUExtract, type_uint_,\n                                      fetch_constant_word_2, const_uint_0_,\n                                      builder_->makeUintConstant(\n                                          xenos::kTexture3DMaxWidthHeightLog2));\n            spv::Id size_2d = builder_->createTriOp(\n                spv::OpBitFieldUExtract, type_uint_, fetch_constant_word_2,\n                const_uint_0_,\n                builder_->makeUintConstant(\n                    xenos::kTexture2DCubeMaxWidthHeightLog2));\n            assert_true(data_is_3d != spv::NoResult);\n            size[0] = builder_->createTriOp(spv::OpSelect, type_uint_,\n                                            data_is_3d, size_3d, size_2d);\n          }\n          if (size_needed_components & 0b10) {\n            spv::Id width_height_bit_count_3d =\n                builder_->makeUintConstant(xenos::kTexture3DMaxWidthHeightLog2);\n            spv::Id size_3d = builder_->createTriOp(\n                spv::OpBitFieldUExtract, type_uint_, fetch_constant_word_2,\n                width_height_bit_count_3d, width_height_bit_count_3d);\n            spv::Id width_height_bit_count_2d = builder_->makeUintConstant(\n                xenos::kTexture2DCubeMaxWidthHeightLog2);\n            spv::Id size_2d = builder_->createTriOp(\n                spv::OpBitFieldUExtract, type_uint_, fetch_constant_word_2,\n                width_height_bit_count_2d, width_height_bit_count_2d);\n            assert_true(data_is_3d != spv::NoResult);\n            size[1] = builder_->createTriOp(spv::OpSelect, type_uint_,\n                                            data_is_3d, size_3d, size_2d);\n          }\n          if (size_needed_components & 0b100) {\n            spv::Id size_3d = builder_->createTriOp(\n                spv::OpBitFieldUExtract, type_uint_, fetch_constant_word_2,\n                builder_->makeUintConstant(xenos::kTexture3DMaxWidthHeightLog2 *\n                                           2),\n                builder_->makeUintConstant(xenos::kTexture3DMaxDepthLog2));\n            spv::Id size_2d = builder_->createTriOp(\n                spv::OpBitFieldUExtract, type_uint_, fetch_constant_word_2,\n                builder_->makeUintConstant(\n                    xenos::kTexture2DCubeMaxWidthHeightLog2 * 2),\n                builder_->makeUintConstant(xenos::kTexture2DMaxStackDepthLog2));\n            assert_true(data_is_3d != spv::NoResult);\n            size[2] = builder_->createTriOp(spv::OpSelect, type_uint_,\n                                            data_is_3d, size_3d, size_2d);\n          }\n        } break;\n      }\n      {\n        uint32_t size_remaining_components = size_needed_components;\n        uint32_t size_component_index;\n        while (xe::bit_scan_forward(size_remaining_components,\n                                    &size_component_index)) {\n          size_remaining_components &= ~(UINT32_C(1) << size_component_index);\n          spv::Id& size_component_ref = size[size_component_index];\n          // Fetch constants store size minus 1 - add 1.\n          size_component_ref =\n              builder_->createBinOp(spv::OpIAdd, type_uint_, size_component_ref,\n                                    builder_->makeUintConstant(1));\n          // Convert the size to float for multiplication or division.\n          size_component_ref = builder_->createUnaryOp(\n              spv::OpConvertUToF, type_float_, size_component_ref);\n        }\n      }\n    }\n\n    // FIXME(Triang3l): Mip lerp factor needs to be calculated, and the\n    // coordinate lerp factors should be calculated at the mip level texels\n    // would be sampled from. That would require some way of calculating the\n    // LOD that would be applicable to explicit gradients and vertex shaders.\n    // Also, with point sampling, possibly lerp factors need to be 0. W (mip\n    // lerp factor) should have been masked out previously because it's not\n    // supported currently.\n    assert_false(instr.opcode == ucode::FetchOpcode::kGetTextureWeights &&\n                 (used_result_nonzero_components & 0b1000));\n\n    // Load the needed original values of the coordinates operand.\n    uint32_t coordinates_needed_components =\n        instr.opcode == ucode::FetchOpcode::kGetTextureWeights\n            ? used_result_nonzero_components\n            : ((UINT32_C(1)\n                << xenos::GetFetchOpDimensionComponentCount(instr.dimension)) -\n               1);\n    assert_not_zero(coordinates_needed_components);\n    spv::Id coordinates_operand =\n        GetOperandComponents(LoadOperandStorage(instr.operands[0]),\n                             instr.operands[0], coordinates_needed_components);\n    spv::Id coordinates[] = {const_float_0_, const_float_0_, const_float_0_};\n    if (xe::bit_count(coordinates_needed_components) > 1) {\n      uint32_t coordinates_remaining_components = coordinates_needed_components;\n      uint32_t coordinate_component_index;\n      uint32_t coordinate_operand_component_index = 0;\n      while (xe::bit_scan_forward(coordinates_remaining_components,\n                                  &coordinate_component_index)) {\n        coordinates_remaining_components &=\n            ~(UINT32_C(1) << coordinate_component_index);\n        coordinates[coordinate_component_index] =\n            builder_->createCompositeExtract(\n                coordinates_operand, type_float_,\n                coordinate_operand_component_index++);\n      }\n    } else {\n      uint32_t coordinate_component_index;\n      xe::bit_scan_forward(coordinates_needed_components,\n                           &coordinate_component_index);\n      coordinates[coordinate_component_index] = coordinates_operand;\n    }\n\n    // TODO(Triang3l): Reverting the resolution scale.\n\n    if (instr.opcode == ucode::FetchOpcode::kGetTextureWeights) {\n      // FIXME(Triang3l): Filtering modes should possibly be taken into account,\n      // but for simplicity, not doing that - from a high level point of view,\n      // would be useless to get weights that will always be zero.\n      uint32_t coordinates_remaining_components = coordinates_needed_components;\n      uint32_t coordinate_component_index;\n      while (xe::bit_scan_forward(coordinates_remaining_components,\n                                  &coordinate_component_index)) {\n        coordinates_remaining_components &=\n            ~(UINT32_C(1) << coordinate_component_index);\n        spv::Id result_component = coordinates[coordinate_component_index];\n        // Need unnormalized coordinates.\n        if (!instr.attributes.unnormalized_coordinates) {\n          spv::Id size_component = size[coordinate_component_index];\n          assert_true(size_component != spv::NoResult);\n          result_component = builder_->createNoContractionBinOp(\n              spv::OpFMul, type_float_, result_component, size_component);\n        }\n        float component_offset = offset_values[coordinate_component_index];\n        if (component_offset) {\n          result_component = builder_->createNoContractionBinOp(\n              spv::OpFAdd, type_float_, result_component,\n              builder_->makeFloatConstant(component_offset));\n        }\n        // 0.5 has already been subtracted via offsets previously.\n        result_component = builder_->createUnaryBuiltinCall(\n            type_float_, ext_inst_glsl_std_450_, GLSLstd450Fract,\n            result_component);\n        result[coordinate_component_index] = result_component;\n      }\n    } else {\n      // kTextureFetch or kGetTextureComputedLod.\n\n      // Normalize the XY coordinates, and apply the offset.\n      for (uint32_t i = 0;\n           i <= uint32_t(instr.dimension != xenos::FetchOpDimension::k1D);\n           ++i) {\n        spv::Id& coordinate_ref = coordinates[i];\n        spv::Id component_offset =\n            offset_values[i] ? builder_->makeFloatConstant(offset_values[i])\n                             : spv::NoResult;\n        spv::Id size_component = size[i];\n        if (instr.attributes.unnormalized_coordinates) {\n          if (component_offset != spv::NoResult) {\n            coordinate_ref = builder_->createNoContractionBinOp(\n                spv::OpFAdd, type_float_, coordinate_ref, component_offset);\n          }\n          assert_true(size_component != spv::NoResult);\n          coordinate_ref = builder_->createNoContractionBinOp(\n              spv::OpFDiv, type_float_, coordinate_ref, size_component);\n        } else {\n          if (component_offset != spv::NoResult) {\n            assert_true(size_component != spv::NoResult);\n            spv::Id component_offset_normalized =\n                builder_->createNoContractionBinOp(\n                    spv::OpFDiv, type_float_, component_offset, size_component);\n            coordinate_ref = builder_->createNoContractionBinOp(\n                spv::OpFAdd, type_float_, coordinate_ref,\n                component_offset_normalized);\n          }\n        }\n      }\n      if (instr.dimension == xenos::FetchOpDimension::k3DOrStacked) {\n        spv::Id& z_coordinate_ref = coordinates[2];\n        spv::Id z_offset = offset_values[2]\n                               ? builder_->makeFloatConstant(offset_values[2])\n                               : spv::NoResult;\n        spv::Id z_size = size[2];\n        if (instr.attributes.unnormalized_coordinates) {\n          // Apply the offset, and normalize the Z coordinate for a 3D texture.\n          if (z_offset != spv::NoResult) {\n            z_coordinate_ref = builder_->createNoContractionBinOp(\n                spv::OpFAdd, type_float_, z_coordinate_ref, z_offset);\n          }\n          assert_true(data_is_3d != spv::NoResult);\n          SpirvBuilder::IfBuilder if_data_is_3d(\n              data_is_3d, spv::SelectionControlDontFlattenMask, *builder_);\n          spv::Id z_3d;\n          {\n            assert_true(z_size != spv::NoResult);\n            z_3d = builder_->createNoContractionBinOp(spv::OpFDiv, type_float_,\n                                                      z_coordinate_ref, z_size);\n          }\n          if_data_is_3d.makeEndIf();\n          z_coordinate_ref =\n              if_data_is_3d.createMergePhi(z_3d, z_coordinate_ref);\n        } else {\n          // Denormalize the Z coordinate for a stacked texture, and apply the\n          // offset.\n          spv::Block& block_dimension_head = *builder_->getBuildPoint();\n          spv::Block& block_dimension_merge = builder_->makeNewBlock();\n          spv::Block* block_dimension_3d =\n              z_offset != spv::NoResult ? &builder_->makeNewBlock() : nullptr;\n          spv::Block& block_dimension_stacked = builder_->makeNewBlock();\n          builder_->createSelectionMerge(&block_dimension_merge,\n                                         spv::SelectionControlDontFlattenMask);\n          assert_true(data_is_3d != spv::NoResult);\n          builder_->createConditionalBranch(\n              data_is_3d,\n              block_dimension_3d ? block_dimension_3d : &block_dimension_merge,\n              &block_dimension_stacked);\n          // 3D case.\n          spv::Id z_3d = z_coordinate_ref;\n          if (block_dimension_3d) {\n            builder_->setBuildPoint(block_dimension_3d);\n            if (z_offset != spv::NoResult) {\n              assert_true(z_size != spv::NoResult);\n              spv::Id z_offset_normalized = builder_->createNoContractionBinOp(\n                  spv::OpFDiv, type_float_, z_offset, z_size);\n              z_3d = builder_->createNoContractionBinOp(\n                  spv::OpFAdd, type_float_, z_3d, z_offset_normalized);\n            }\n            builder_->createBranch(&block_dimension_merge);\n          }\n          // Stacked case.\n          builder_->setBuildPoint(&block_dimension_stacked);\n          spv::Id z_stacked = z_coordinate_ref;\n          assert_true(z_size != spv::NoResult);\n          z_stacked = builder_->createNoContractionBinOp(\n              spv::OpFMul, type_float_, z_stacked, z_size);\n          if (z_offset != spv::NoResult) {\n            z_stacked = builder_->createNoContractionBinOp(\n                spv::OpFAdd, type_float_, z_stacked, z_offset);\n          }\n          builder_->createBranch(&block_dimension_merge);\n          // Select one of the two.\n          builder_->setBuildPoint(&block_dimension_merge);\n          {\n            std::unique_ptr<spv::Instruction> z_phi_op =\n                std::make_unique<spv::Instruction>(builder_->getUniqueId(),\n                                                   type_float_, spv::OpPhi);\n            z_phi_op->addIdOperand(z_3d);\n            z_phi_op->addIdOperand((block_dimension_3d ? *block_dimension_3d\n                                                       : block_dimension_head)\n                                       .getId());\n            z_phi_op->addIdOperand(z_stacked);\n            z_phi_op->addIdOperand(block_dimension_stacked.getId());\n            z_coordinate_ref = z_phi_op->getResultId();\n            builder_->getBuildPoint()->addInstruction(std::move(z_phi_op));\n          }\n        }\n      } else if (instr.dimension == xenos::FetchOpDimension::kCube) {\n        // Transform the cube coordinates from 2D to 3D.\n        // Move SC/TC from 1...2 to -1...1.\n        spv::Id const_float_2 = builder_->makeFloatConstant(2.0f);\n        spv::Id const_float_minus_3 = builder_->makeFloatConstant(-3.0f);\n        for (uint32_t i = 0; i < 2; ++i) {\n          coordinates[i] = builder_->createNoContractionBinOp(\n              spv::OpFAdd, type_float_,\n              builder_->createNoContractionBinOp(spv::OpFMul, type_float_,\n                                                 coordinates[i], const_float_2),\n              const_float_minus_3);\n        }\n        // Get the face index (floored, within 0...5 - OpConvertFToU is\n        // undefined for out-of-range values, so clamping from both sides\n        // manually).\n        spv::Id face = coordinates[2];\n        if (offset_values[2]) {\n          face = builder_->createNoContractionBinOp(\n              spv::OpFAdd, type_float_, face,\n              builder_->makeFloatConstant(offset_values[2]));\n        }\n        face = builder_->createUnaryOp(\n            spv::OpConvertFToU, type_uint_,\n            builder_->createTriBuiltinCall(\n                type_float_, ext_inst_glsl_std_450_, GLSLstd450NClamp, face,\n                const_float_0_, builder_->makeFloatConstant(5.0f)));\n        // Split the face index into the axis and the sign.\n        spv::Id const_uint_1 = builder_->makeUintConstant(1);\n        spv::Id face_axis = builder_->createBinOp(\n            spv::OpShiftRightLogical, type_uint_, face, const_uint_1);\n        spv::Id face_is_negative = builder_->createBinOp(\n            spv::OpINotEqual, type_bool_,\n            builder_->createBinOp(spv::OpBitwiseAnd, type_uint_, face,\n                                  const_uint_1),\n            const_uint_0_);\n        spv::Id face_sign =\n            builder_->createTriOp(spv::OpSelect, type_float_, face_is_negative,\n                                  builder_->makeFloatConstant(-1.0f),\n                                  builder_->makeFloatConstant(1.0f));\n        // Remap the axes in a way opposite to the ALU cube instruction.\n        spv::Id sc_negated = builder_->createNoContractionUnaryOp(\n            spv::OpFNegate, type_float_, coordinates[0]);\n        spv::Id tc_negated = builder_->createNoContractionUnaryOp(\n            spv::OpFNegate, type_float_, coordinates[1]);\n        spv::Block& block_ma_head = *builder_->getBuildPoint();\n        spv::Block& block_ma_x = builder_->makeNewBlock();\n        spv::Block& block_ma_y = builder_->makeNewBlock();\n        spv::Block& block_ma_z = builder_->makeNewBlock();\n        spv::Block& block_ma_merge = builder_->makeNewBlock();\n        builder_->createSelectionMerge(&block_ma_merge,\n                                       spv::SelectionControlMaskNone);\n        {\n          std::unique_ptr<spv::Instruction> ma_switch_op =\n              std::make_unique<spv::Instruction>(spv::OpSwitch);\n          ma_switch_op->addIdOperand(face_axis);\n          // Make Z the default.\n          ma_switch_op->addIdOperand(block_ma_z.getId());\n          ma_switch_op->addImmediateOperand(0);\n          ma_switch_op->addIdOperand(block_ma_x.getId());\n          ma_switch_op->addImmediateOperand(1);\n          ma_switch_op->addIdOperand(block_ma_y.getId());\n          builder_->getBuildPoint()->addInstruction(std::move(ma_switch_op));\n        }\n        block_ma_x.addPredecessor(&block_ma_head);\n        block_ma_y.addPredecessor(&block_ma_head);\n        block_ma_z.addPredecessor(&block_ma_head);\n        // X is the major axis case.\n        builder_->setBuildPoint(&block_ma_x);\n        spv::Id ma_x_y = tc_negated;\n        spv::Id ma_x_z =\n            builder_->createTriOp(spv::OpSelect, type_float_, face_is_negative,\n                                  coordinates[0], sc_negated);\n        builder_->createBranch(&block_ma_merge);\n        // Y is the major axis case.\n        builder_->setBuildPoint(&block_ma_y);\n        spv::Id ma_y_x = coordinates[0];\n        spv::Id ma_y_z =\n            builder_->createTriOp(spv::OpSelect, type_float_, face_is_negative,\n                                  tc_negated, coordinates[1]);\n        builder_->createBranch(&block_ma_merge);\n        // Z is the major axis case.\n        builder_->setBuildPoint(&block_ma_z);\n        spv::Id ma_z_x =\n            builder_->createTriOp(spv::OpSelect, type_float_, face_is_negative,\n                                  sc_negated, coordinates[0]);\n        spv::Id ma_z_y = tc_negated;\n        builder_->createBranch(&block_ma_merge);\n        // Gather the coordinate components from the branches.\n        builder_->setBuildPoint(&block_ma_merge);\n        {\n          std::unique_ptr<spv::Instruction> x_phi_op =\n              std::make_unique<spv::Instruction>(builder_->getUniqueId(),\n                                                 type_float_, spv::OpPhi);\n          x_phi_op->addIdOperand(face_sign);\n          x_phi_op->addIdOperand(block_ma_x.getId());\n          x_phi_op->addIdOperand(ma_y_x);\n          x_phi_op->addIdOperand(block_ma_y.getId());\n          x_phi_op->addIdOperand(ma_z_x);\n          x_phi_op->addIdOperand(block_ma_z.getId());\n          coordinates[0] = x_phi_op->getResultId();\n          builder_->getBuildPoint()->addInstruction(std::move(x_phi_op));\n        }\n        {\n          std::unique_ptr<spv::Instruction> y_phi_op =\n              std::make_unique<spv::Instruction>(builder_->getUniqueId(),\n                                                 type_float_, spv::OpPhi);\n          y_phi_op->addIdOperand(ma_x_y);\n          y_phi_op->addIdOperand(block_ma_x.getId());\n          y_phi_op->addIdOperand(face_sign);\n          y_phi_op->addIdOperand(block_ma_y.getId());\n          y_phi_op->addIdOperand(ma_z_y);\n          y_phi_op->addIdOperand(block_ma_z.getId());\n          coordinates[1] = y_phi_op->getResultId();\n          builder_->getBuildPoint()->addInstruction(std::move(y_phi_op));\n        }\n        {\n          std::unique_ptr<spv::Instruction> z_phi_op =\n              std::make_unique<spv::Instruction>(builder_->getUniqueId(),\n                                                 type_float_, spv::OpPhi);\n          z_phi_op->addIdOperand(ma_x_z);\n          z_phi_op->addIdOperand(block_ma_x.getId());\n          z_phi_op->addIdOperand(ma_y_z);\n          z_phi_op->addIdOperand(block_ma_y.getId());\n          z_phi_op->addIdOperand(face_sign);\n          z_phi_op->addIdOperand(block_ma_z.getId());\n          coordinates[2] = z_phi_op->getResultId();\n          builder_->getBuildPoint()->addInstruction(std::move(z_phi_op));\n        }\n      }\n\n      id_vector_temp_.clear();\n      id_vector_temp_.push_back(\n          builder_->makeIntConstant(kSystemConstantTextureSwizzledSigns));\n      id_vector_temp_.push_back(\n          builder_->makeIntConstant(fetch_constant_index >> 4));\n      id_vector_temp_.push_back(\n          builder_->makeIntConstant((fetch_constant_index >> 2) & 3));\n      // All 32 bits containing the values for 4 fetch constants (use\n      // OpBitFieldUExtract to get the signednesses for the specific components\n      // of this texture).\n      spv::Id swizzled_signs_word =\n          builder_->createLoad(builder_->createAccessChain(\n                                   spv::StorageClassUniform,\n                                   uniform_system_constants_, id_vector_temp_),\n                               spv::NoPrecision);\n      uint32_t swizzled_signs_word_offset = 8 * (fetch_constant_index & 3);\n\n      spv::Builder::TextureParameters texture_parameters = {};\n\n      if (instr.opcode == ucode::FetchOpcode::kGetTextureComputedLod) {\n        // kGetTextureComputedLod.\n\n        // Check if the signed binding is needs to be accessed rather than the\n        // unsigned (if all signednesses are signed).\n        spv::Id swizzled_signs_all_signed = builder_->createBinOp(\n            spv::OpIEqual, type_bool_,\n            builder_->createTriOp(\n                spv::OpBitFieldUExtract, type_uint_, swizzled_signs_word,\n                builder_->makeUintConstant(swizzled_signs_word_offset),\n                builder_->makeUintConstant(8)),\n            builder_->makeUintConstant(uint32_t(xenos::TextureSign::kSigned) *\n                                       0b01010101));\n\n        // OpImageQueryLod doesn't need the array layer component.\n        // So, 3 coordinate components for 3D cube, 2 in other cases (including\n        // 1D, which are emulated as 2D arrays).\n        // OpSampledImage must be in the same block as where its result is used.\n        if (instr.dimension == xenos::FetchOpDimension::k3DOrStacked) {\n          // Check if the texture is 3D or stacked.\n          assert_true(data_is_3d != spv::NoResult);\n          SpirvBuilder::IfBuilder if_data_is_3d(\n              data_is_3d, spv::SelectionControlDontFlattenMask, *builder_);\n          spv::Id lod_3d;\n          {\n            // 3D.\n            id_vector_temp_.clear();\n            for (uint32_t i = 0; i < 3; ++i) {\n              id_vector_temp_.push_back(coordinates[i]);\n            }\n            texture_parameters.coords = builder_->createCompositeConstruct(\n                type_float3_, id_vector_temp_);\n            lod_3d = QueryTextureLod(texture_parameters, image_3d_unsigned,\n                                     image_3d_signed, sampler,\n                                     swizzled_signs_all_signed);\n          }\n          if_data_is_3d.makeBeginElse();\n          spv::Id lod_stacked;\n          {\n            // 2D stacked.\n            id_vector_temp_.clear();\n            for (uint32_t i = 0; i < 2; ++i) {\n              id_vector_temp_.push_back(coordinates[i]);\n            }\n            texture_parameters.coords = builder_->createCompositeConstruct(\n                type_float2_, id_vector_temp_);\n            lod_stacked = QueryTextureLod(texture_parameters,\n                                          image_2d_array_or_cube_unsigned,\n                                          image_2d_array_or_cube_signed,\n                                          sampler, swizzled_signs_all_signed);\n          }\n          if_data_is_3d.makeEndIf();\n          result[0] = if_data_is_3d.createMergePhi(lod_3d, lod_stacked);\n        } else {\n          uint32_t lod_query_coordinate_component_count =\n              instr.dimension == xenos::FetchOpDimension::kCube ? 3 : 2;\n          id_vector_temp_.clear();\n          for (uint32_t i = 0; i < lod_query_coordinate_component_count; ++i) {\n            id_vector_temp_.push_back(coordinates[i]);\n          }\n          texture_parameters.coords = builder_->createCompositeConstruct(\n              type_float_vectors_[lod_query_coordinate_component_count - 1],\n              id_vector_temp_);\n          result[0] = QueryTextureLod(texture_parameters,\n                                      image_2d_array_or_cube_unsigned,\n                                      image_2d_array_or_cube_signed, sampler,\n                                      swizzled_signs_all_signed);\n        }\n      } else {\n        // kTextureFetch.\n        assert_true(instr.opcode == ucode::FetchOpcode::kTextureFetch);\n\n        // Extract the signedness for each component of the swizzled result, and\n        // get which bindings (unsigned and signed) are needed.\n        spv::Id swizzled_signs[4] = {};\n        spv::Id result_is_signed[4] = {};\n        spv::Id is_all_signed = spv::NoResult;\n        spv::Id is_any_signed = spv::NoResult;\n        spv::Id const_uint_2 = builder_->makeUintConstant(2);\n        spv::Id const_uint_sign_signed =\n            builder_->makeUintConstant(uint32_t(xenos::TextureSign::kSigned));\n        {\n          uint32_t result_remaining_components = used_result_nonzero_components;\n          uint32_t result_component_index;\n          while (xe::bit_scan_forward(result_remaining_components,\n                                      &result_component_index)) {\n            result_remaining_components &=\n                ~(UINT32_C(1) << result_component_index);\n            spv::Id result_component_sign = builder_->createTriOp(\n                spv::OpBitFieldUExtract, type_uint_, swizzled_signs_word,\n                builder_->makeUintConstant(swizzled_signs_word_offset +\n                                           2 * result_component_index),\n                const_uint_2);\n            swizzled_signs[result_component_index] = result_component_sign;\n            spv::Id is_component_signed = builder_->createBinOp(\n                spv::OpIEqual, type_bool_, result_component_sign,\n                const_uint_sign_signed);\n            result_is_signed[result_component_index] = is_component_signed;\n            if (is_all_signed != spv::NoResult) {\n              is_all_signed =\n                  builder_->createBinOp(spv::OpLogicalAnd, type_bool_,\n                                        is_all_signed, is_component_signed);\n            } else {\n              is_all_signed = is_component_signed;\n            }\n            if (is_any_signed != spv::NoResult) {\n              is_any_signed =\n                  builder_->createBinOp(spv::OpLogicalOr, type_bool_,\n                                        is_any_signed, is_component_signed);\n            } else {\n              is_any_signed = is_component_signed;\n            }\n          }\n        }\n        spv::Id is_any_unsigned = builder_->createUnaryOp(\n            spv::OpLogicalNot, type_bool_, is_all_signed);\n\n        // Load the fetch constant word 4, needed unconditionally for LOD\n        // biasing, for result exponent biasing, and conditionally for stacked\n        // texture filtering.\n        id_vector_temp_.clear();\n        id_vector_temp_.push_back(const_int_0_);\n        id_vector_temp_.push_back(builder_->makeIntConstant(\n            int((fetch_constant_word_0_index + 4) >> 2)));\n        id_vector_temp_.push_back(builder_->makeIntConstant(\n            int((fetch_constant_word_0_index + 4) & 3)));\n        spv::Id fetch_constant_word_4 =\n            builder_->createLoad(builder_->createAccessChain(\n                                     spv::StorageClassUniform,\n                                     uniform_fetch_constants_, id_vector_temp_),\n                                 spv::NoPrecision);\n        spv::Id fetch_constant_word_4_signed = builder_->createUnaryOp(\n            spv::OpBitcast, type_int_, fetch_constant_word_4);\n\n        // Accumulate the explicit LOD (or LOD bias) sources (in D3D11.3\n        // specification order: specified LOD + sampler LOD bias + instruction\n        // LOD bias).\n        // Fetch constant LOD (bits 12:21 of the word 4).\n        spv::Id lod = builder_->createNoContractionBinOp(\n            spv::OpFMul, type_float_,\n            builder_->createUnaryOp(\n                spv::OpConvertSToF, type_float_,\n                builder_->createTriOp(spv::OpBitFieldSExtract, type_int_,\n                                      fetch_constant_word_4_signed,\n                                      builder_->makeUintConstant(12),\n                                      builder_->makeUintConstant(10))),\n            builder_->makeFloatConstant(1.0f / 32.0f));\n        // Register LOD.\n        if (instr.attributes.use_register_lod) {\n          lod = builder_->createNoContractionBinOp(\n              spv::OpFAdd, type_float_,\n              builder_->createLoad(var_main_tfetch_lod_, spv::NoPrecision),\n              lod);\n        }\n        // Instruction LOD bias.\n        if (instr.attributes.lod_bias) {\n          lod = builder_->createNoContractionBinOp(\n              spv::OpFAdd, type_float_, lod,\n              builder_->makeFloatConstant(instr.attributes.lod_bias));\n        }\n\n        // Calculate the gradients for sampling the texture if needed.\n        // 2D vectors for k1D (because 1D images are emulated as 2D arrays),\n        // k2D.\n        // 3D vectors for k3DOrStacked, kCube.\n        spv::Id gradients_h = spv::NoResult, gradients_v = spv::NoResult;\n        if (use_computed_lod) {\n          // TODO(Triang3l): Gradient exponent adjustment is currently not done\n          // in getCompTexLOD, so not doing it here too for now. Apply the\n          // gradient exponent biases from the word 4 of the fetch constant in\n          // the future when it's handled in getCompTexLOD somehow.\n          spv::Id lod_gradient_scale = builder_->createUnaryBuiltinCall(\n              type_float_, ext_inst_glsl_std_450_, GLSLstd450Exp2, lod);\n          switch (instr.dimension) {\n            case xenos::FetchOpDimension::k1D: {\n              spv::Id gradient_h_1d, gradient_v_1d;\n              if (instr.attributes.use_register_gradients) {\n                id_vector_temp_.clear();\n                // First component.\n                id_vector_temp_.push_back(const_int_0_);\n                gradient_h_1d = builder_->createLoad(\n                    builder_->createAccessChain(spv::StorageClassFunction,\n                                                var_main_tfetch_gradients_h_,\n                                                id_vector_temp_),\n                    spv::NoPrecision);\n                gradient_v_1d = builder_->createLoad(\n                    builder_->createAccessChain(spv::StorageClassFunction,\n                                                var_main_tfetch_gradients_v_,\n                                                id_vector_temp_),\n                    spv::NoPrecision);\n                if (instr.attributes.unnormalized_coordinates) {\n                  // Normalize the gradients.\n                  assert_true(size[0] != spv::NoResult);\n                  gradient_h_1d = builder_->createNoContractionBinOp(\n                      spv::OpFDiv, type_float_, gradient_h_1d, size[0]);\n                  gradient_v_1d = builder_->createNoContractionBinOp(\n                      spv::OpFDiv, type_float_, gradient_v_1d, size[0]);\n                }\n              } else {\n                builder_->addCapability(spv::CapabilityDerivativeControl);\n                gradient_h_1d = builder_->createUnaryOp(\n                    spv::OpDPdxCoarse, type_float_, coordinates[0]);\n                gradient_v_1d = builder_->createUnaryOp(\n                    spv::OpDPdyCoarse, type_float_, coordinates[0]);\n              }\n              gradient_h_1d = builder_->createNoContractionBinOp(\n                  spv::OpFMul, type_float_, gradient_h_1d, lod_gradient_scale);\n              gradient_v_1d = builder_->createNoContractionBinOp(\n                  spv::OpFMul, type_float_, gradient_v_1d, lod_gradient_scale);\n              // 1D textures are sampled as 2D arrays - need 2-component\n              // gradients.\n              id_vector_temp_.clear();\n              id_vector_temp_.push_back(gradient_h_1d);\n              id_vector_temp_.push_back(const_float_0_);\n              gradients_h = builder_->createCompositeConstruct(type_float2_,\n                                                               id_vector_temp_);\n              id_vector_temp_[0] = gradient_v_1d;\n              gradients_v = builder_->createCompositeConstruct(type_float2_,\n                                                               id_vector_temp_);\n            } break;\n            case xenos::FetchOpDimension::k2D: {\n              if (instr.attributes.use_register_gradients) {\n                for (uint32_t i = 0; i < 2; ++i) {\n                  spv::Id register_gradient_3d =\n                      builder_->createLoad(i ? var_main_tfetch_gradients_h_\n                                             : var_main_tfetch_gradients_v_,\n                                           spv::NoPrecision);\n                  spv::Id register_gradient_x =\n                      builder_->createCompositeExtract(register_gradient_3d,\n                                                       type_float_, 0);\n                  spv::Id register_gradient_y =\n                      builder_->createCompositeExtract(register_gradient_3d,\n                                                       type_float_, 1);\n                  if (instr.attributes.unnormalized_coordinates) {\n                    // Normalize the gradients.\n                    assert_true(size[0] != spv::NoResult);\n                    register_gradient_x = builder_->createNoContractionBinOp(\n                        spv::OpFDiv, type_float_, register_gradient_x, size[0]);\n                    assert_true(size[1] != spv::NoResult);\n                    register_gradient_y = builder_->createNoContractionBinOp(\n                        spv::OpFDiv, type_float_, register_gradient_y, size[1]);\n                  }\n                  id_vector_temp_.clear();\n                  id_vector_temp_.push_back(register_gradient_x);\n                  id_vector_temp_.push_back(register_gradient_y);\n                  (i ? gradients_v : gradients_h) =\n                      builder_->createCompositeConstruct(type_float2_,\n                                                         id_vector_temp_);\n                }\n              } else {\n                id_vector_temp_.clear();\n                for (uint32_t i = 0; i < 2; ++i) {\n                  id_vector_temp_.push_back(coordinates[i]);\n                }\n                spv::Id gradient_coordinate_vector =\n                    builder_->createCompositeConstruct(type_float2_,\n                                                       id_vector_temp_);\n                builder_->addCapability(spv::CapabilityDerivativeControl);\n                gradients_h =\n                    builder_->createUnaryOp(spv::OpDPdxCoarse, type_float2_,\n                                            gradient_coordinate_vector);\n                gradients_v =\n                    builder_->createUnaryOp(spv::OpDPdyCoarse, type_float2_,\n                                            gradient_coordinate_vector);\n              }\n              gradients_h = builder_->createNoContractionBinOp(\n                  spv::OpVectorTimesScalar, type_float2_, gradients_h,\n                  lod_gradient_scale);\n              gradients_v = builder_->createNoContractionBinOp(\n                  spv::OpVectorTimesScalar, type_float2_, gradients_v,\n                  lod_gradient_scale);\n            } break;\n            case xenos::FetchOpDimension::k3DOrStacked: {\n              if (instr.attributes.use_register_gradients) {\n                gradients_h = builder_->createLoad(var_main_tfetch_gradients_h_,\n                                                   spv::NoPrecision);\n                gradients_v = builder_->createLoad(var_main_tfetch_gradients_v_,\n                                                   spv::NoPrecision);\n                if (instr.attributes.unnormalized_coordinates) {\n                  // Normalize the gradients.\n                  for (uint32_t i = 0; i < 2; ++i) {\n                    spv::Id& gradient_ref = i ? gradients_v : gradients_h;\n                    id_vector_temp_.clear();\n                    for (uint32_t j = 0; j < 3; ++j) {\n                      assert_true(size[j] != spv::NoResult);\n                      id_vector_temp_.push_back(\n                          builder_->createNoContractionBinOp(\n                              spv::OpFDiv, type_float_,\n                              builder_->createCompositeExtract(gradient_ref,\n                                                               type_float_, j),\n                              size[j]));\n                    }\n                    gradient_ref = builder_->createCompositeConstruct(\n                        type_float3_, id_vector_temp_);\n                  }\n                }\n              } else {\n                id_vector_temp_.clear();\n                for (uint32_t i = 0; i < 3; ++i) {\n                  id_vector_temp_.push_back(coordinates[i]);\n                }\n                spv::Id gradient_coordinate_vector =\n                    builder_->createCompositeConstruct(type_float3_,\n                                                       id_vector_temp_);\n                builder_->addCapability(spv::CapabilityDerivativeControl);\n                gradients_h =\n                    builder_->createUnaryOp(spv::OpDPdxCoarse, type_float3_,\n                                            gradient_coordinate_vector);\n                gradients_v =\n                    builder_->createUnaryOp(spv::OpDPdyCoarse, type_float3_,\n                                            gradient_coordinate_vector);\n              }\n              gradients_h = builder_->createNoContractionBinOp(\n                  spv::OpVectorTimesScalar, type_float3_, gradients_h,\n                  lod_gradient_scale);\n              gradients_v = builder_->createNoContractionBinOp(\n                  spv::OpVectorTimesScalar, type_float3_, gradients_v,\n                  lod_gradient_scale);\n            } break;\n            case xenos::FetchOpDimension::kCube: {\n              if (instr.attributes.use_register_gradients) {\n                // Register gradients are already in the cube space for cube\n                // maps.\n                // TODO(Triang3l): Are cube map register gradients unnormalized\n                // if the coordinates themselves are unnormalized?\n                gradients_h = builder_->createLoad(var_main_tfetch_gradients_h_,\n                                                   spv::NoPrecision);\n                gradients_v = builder_->createLoad(var_main_tfetch_gradients_v_,\n                                                   spv::NoPrecision);\n              } else {\n                id_vector_temp_.clear();\n                for (uint32_t i = 0; i < 3; ++i) {\n                  id_vector_temp_.push_back(coordinates[i]);\n                }\n                spv::Id gradient_coordinate_vector =\n                    builder_->createCompositeConstruct(type_float3_,\n                                                       id_vector_temp_);\n                builder_->addCapability(spv::CapabilityDerivativeControl);\n                gradients_h =\n                    builder_->createUnaryOp(spv::OpDPdxCoarse, type_float3_,\n                                            gradient_coordinate_vector);\n                gradients_v =\n                    builder_->createUnaryOp(spv::OpDPdyCoarse, type_float3_,\n                                            gradient_coordinate_vector);\n              }\n              gradients_h = builder_->createNoContractionBinOp(\n                  spv::OpVectorTimesScalar, type_float3_, gradients_h,\n                  lod_gradient_scale);\n              gradients_v = builder_->createNoContractionBinOp(\n                  spv::OpVectorTimesScalar, type_float3_, gradients_v,\n                  lod_gradient_scale);\n            } break;\n          }\n        }\n\n        // Sample the texture.\n        spv::ImageOperandsMask image_operands_mask =\n            use_computed_lod ? spv::ImageOperandsGradMask\n                             : spv::ImageOperandsLodMask;\n        spv::Id sample_result_unsigned, sample_result_signed;\n        if (!use_computed_lod) {\n          texture_parameters.lod = lod;\n        }\n        if (instr.dimension == xenos::FetchOpDimension::k3DOrStacked) {\n          // 3D (3 coordinate components, 3 gradient components, single fetch)\n          // or 2D stacked (2 coordinate components + 1 array layer coordinate\n          // component, 2 gradient components, two fetches if the Z axis is\n          // linear-filtered).\n\n          assert_true(data_is_3d != spv::NoResult);\n          SpirvBuilder::IfBuilder if_data_is_3d(\n              data_is_3d, spv::SelectionControlDontFlattenMask, *builder_);\n          spv::Id sample_result_unsigned_3d, sample_result_signed_3d;\n          {\n            // 3D.\n            if (use_computed_lod) {\n              texture_parameters.gradX = gradients_h;\n              texture_parameters.gradY = gradients_v;\n            }\n            id_vector_temp_.clear();\n            for (uint32_t i = 0; i < 3; ++i) {\n              id_vector_temp_.push_back(coordinates[i]);\n            }\n            texture_parameters.coords = builder_->createCompositeConstruct(\n                type_float3_, id_vector_temp_);\n            SampleTexture(texture_parameters, image_operands_mask,\n                          image_3d_unsigned, image_3d_signed, sampler,\n                          is_any_unsigned, is_any_signed,\n                          sample_result_unsigned_3d, sample_result_signed_3d);\n          }\n          if_data_is_3d.makeBeginElse();\n          spv::Id sample_result_unsigned_stacked, sample_result_signed_stacked;\n          {\n            // 2D stacked.\n            if (use_computed_lod) {\n              // Extract 2D gradients for stacked textures which are 2D arrays.\n              uint_vector_temp_.clear();\n              uint_vector_temp_.push_back(0);\n              uint_vector_temp_.push_back(1);\n              texture_parameters.gradX =\n                  builder_->createRvalueSwizzle(spv::NoPrecision, type_float2_,\n                                                gradients_h, uint_vector_temp_);\n              texture_parameters.gradY =\n                  builder_->createRvalueSwizzle(spv::NoPrecision, type_float2_,\n                                                gradients_v, uint_vector_temp_);\n            }\n            // Check if linear filtering is needed.\n            bool vol_mag_filter_is_fetch_const =\n                instr.attributes.vol_mag_filter ==\n                xenos::TextureFilter::kUseFetchConst;\n            bool vol_min_filter_is_fetch_const =\n                instr.attributes.vol_min_filter ==\n                xenos::TextureFilter::kUseFetchConst;\n            bool vol_mag_filter_is_linear = instr.attributes.vol_mag_filter ==\n                                            xenos::TextureFilter::kLinear;\n            bool vol_min_filter_is_linear = instr.attributes.vol_min_filter ==\n                                            xenos::TextureFilter::kLinear;\n            spv::Id vol_filter_is_linear = spv::NoResult;\n            if (use_computed_lod &&\n                (vol_mag_filter_is_fetch_const ||\n                 vol_min_filter_is_fetch_const ||\n                 vol_mag_filter_is_linear != vol_min_filter_is_linear)) {\n              // Check if minifying along layers (derivative > 1 along any\n              // axis).\n              spv::Id layer_max_gradient = builder_->createBinBuiltinCall(\n                  type_float_, ext_inst_glsl_std_450_, GLSLstd450NMax,\n                  builder_->createCompositeExtract(gradients_h, type_float_, 2),\n                  builder_->createCompositeExtract(gradients_v, type_float_,\n                                                   2));\n              if (!instr.attributes.unnormalized_coordinates) {\n                // Denormalize the gradient if provided as normalized.\n                assert_true(size[2] != spv::NoResult);\n                layer_max_gradient = builder_->createNoContractionBinOp(\n                    spv::OpFMul, type_float_, layer_max_gradient, size[2]);\n              }\n              // For NaN, considering that magnification is being done.\n              spv::Id is_minifying_z = builder_->createBinOp(\n                  spv::OpFOrdLessThan, type_bool_, layer_max_gradient,\n                  builder_->makeFloatConstant(1.0f));\n              // Choose what filter is actually used, the minification or the\n              // magnification one.\n              spv::Id vol_mag_filter_is_linear_loaded =\n                  vol_mag_filter_is_fetch_const\n                      ? builder_->createBinOp(\n                            spv::OpINotEqual, type_bool_,\n                            builder_->createBinOp(\n                                spv::OpBitwiseAnd, type_uint_,\n                                fetch_constant_word_4,\n                                builder_->makeUintConstant(UINT32_C(1) << 0)),\n                            const_uint_0_)\n                      : builder_->makeBoolConstant(vol_mag_filter_is_linear);\n              spv::Id vol_min_filter_is_linear_loaded =\n                  vol_min_filter_is_fetch_const\n                      ? builder_->createBinOp(\n                            spv::OpINotEqual, type_bool_,\n                            builder_->createBinOp(\n                                spv::OpBitwiseAnd, type_uint_,\n                                fetch_constant_word_4,\n                                builder_->makeUintConstant(UINT32_C(1) << 1)),\n                            const_uint_0_)\n                      : builder_->makeBoolConstant(vol_min_filter_is_linear);\n              vol_filter_is_linear = builder_->createTriOp(\n                  spv::OpSelect, type_bool_, is_minifying_z,\n                  vol_min_filter_is_linear_loaded,\n                  vol_mag_filter_is_linear_loaded);\n            } else {\n              // No gradients, or using the same filter overrides for magnifying\n              // and minifying. Assume always magnifying if no gradients (LOD 0,\n              // always <= 0). LOD is within 2D layers, not between them (unlike\n              // in 3D textures, which have mips with depth reduced), so it\n              // shouldn't have effect on filtering between layers.\n              if (vol_mag_filter_is_fetch_const) {\n                vol_filter_is_linear = builder_->createBinOp(\n                    spv::OpINotEqual, type_bool_,\n                    builder_->createBinOp(\n                        spv::OpBitwiseAnd, type_uint_, fetch_constant_word_4,\n                        builder_->makeUintConstant(UINT32_C(1) << 0)),\n                    const_uint_0_);\n              }\n            }\n            spv::Id layer_coordinate = coordinates[2];\n            // Linear filtering may be needed either based on a dynamic\n            // condition (the filtering mode is taken from the fetch constant,\n            // or it's different for magnification and minification), or on a\n            // static one (with gradients - specified in the instruction for\n            // both magnification and minification as linear, without\n            // gradients - specified for magnification as linear).\n            // If the filter is linear, subtract 0.5 from the Z coordinate of\n            // the first layer in filtering because 0.5 is in the middle of it.\n            if (vol_filter_is_linear != spv::NoResult) {\n              layer_coordinate = builder_->createTriOp(\n                  spv::OpSelect, type_float_, vol_filter_is_linear,\n                  builder_->createNoContractionBinOp(\n                      spv::OpFSub, type_float_, layer_coordinate,\n                      builder_->makeFloatConstant(0.5f)),\n                  layer_coordinate);\n            } else if (vol_mag_filter_is_linear) {\n              layer_coordinate = builder_->createNoContractionBinOp(\n                  spv::OpFSub, type_float_, layer_coordinate,\n                  builder_->makeFloatConstant(0.5f));\n            }\n            // Sample the first layer, needed regardless of whether filtering is\n            // needed.\n            // Floor the array layer (Vulkan does rounding to nearest or + 0.5\n            // and floor even for the layer index, but on the Xenos, addressing\n            // is similar to that of 3D textures). This is needed for both point\n            // and linear filtering (with linear, 0.5 was subtracted\n            // previously).\n            spv::Id layer_0_coordinate = builder_->createUnaryBuiltinCall(\n                type_float_, ext_inst_glsl_std_450_, GLSLstd450Floor,\n                layer_coordinate);\n            id_vector_temp_.clear();\n            id_vector_temp_.push_back(coordinates[0]);\n            id_vector_temp_.push_back(coordinates[1]);\n            id_vector_temp_.push_back(layer_0_coordinate);\n            texture_parameters.coords = builder_->createCompositeConstruct(\n                type_float3_, id_vector_temp_);\n            SampleTexture(\n                texture_parameters, image_operands_mask,\n                image_2d_array_or_cube_unsigned, image_2d_array_or_cube_signed,\n                sampler, is_any_unsigned, is_any_signed,\n                sample_result_unsigned_stacked, sample_result_signed_stacked);\n            // Sample the second layer if linear filtering is potentially needed\n            // (conditionally or unconditionally, depending on whether the\n            // filter needs to be chosen at runtime), and filter.\n            if (vol_filter_is_linear != spv::NoResult ||\n                vol_mag_filter_is_linear) {\n              spv::Block& block_z_head = *builder_->getBuildPoint();\n              spv::Block& block_z_linear =\n                  (vol_filter_is_linear != spv::NoResult)\n                      ? builder_->makeNewBlock()\n                      : block_z_head;\n              spv::Block& block_z_merge =\n                  (vol_filter_is_linear != spv::NoResult)\n                      ? builder_->makeNewBlock()\n                      : block_z_head;\n              if (vol_filter_is_linear != spv::NoResult) {\n                builder_->createSelectionMerge(\n                    &block_z_merge, spv::SelectionControlDontFlattenMask);\n                builder_->createConditionalBranch(\n                    vol_filter_is_linear, &block_z_linear, &block_z_merge);\n                builder_->setBuildPoint(&block_z_linear);\n              }\n              spv::Id layer_1_coordinate = builder_->createBinOp(\n                  spv::OpFAdd, type_float_, layer_0_coordinate,\n                  builder_->makeFloatConstant(1.0f));\n              id_vector_temp_.clear();\n              id_vector_temp_.push_back(coordinates[0]);\n              id_vector_temp_.push_back(coordinates[1]);\n              id_vector_temp_.push_back(layer_1_coordinate);\n              texture_parameters.coords = builder_->createCompositeConstruct(\n                  type_float3_, id_vector_temp_);\n              spv::Id layer_lerp_factor = builder_->createUnaryBuiltinCall(\n                  type_float_, ext_inst_glsl_std_450_, GLSLstd450Fract,\n                  layer_coordinate);\n              spv::Id sample_result_unsigned_stacked_filtered;\n              spv::Id sample_result_signed_stacked_filtered;\n              SampleTexture(\n                  texture_parameters, image_operands_mask,\n                  image_2d_array_or_cube_unsigned,\n                  image_2d_array_or_cube_signed, sampler, is_any_unsigned,\n                  is_any_signed, sample_result_unsigned_stacked_filtered,\n                  sample_result_signed_stacked_filtered, layer_lerp_factor,\n                  sample_result_unsigned_stacked, sample_result_signed_stacked);\n              if (vol_filter_is_linear != spv::NoResult) {\n                // Get the actual build point after the SampleTexture call for\n                // phi.\n                spv::Block& block_z_linear_end = *builder_->getBuildPoint();\n                builder_->createBranch(&block_z_merge);\n                builder_->setBuildPoint(&block_z_merge);\n                {\n                  std::unique_ptr<spv::Instruction> filter_phi_op =\n                      std::make_unique<spv::Instruction>(\n                          builder_->getUniqueId(), type_float4_, spv::OpPhi);\n                  filter_phi_op->addIdOperand(\n                      sample_result_unsigned_stacked_filtered);\n                  filter_phi_op->addIdOperand(block_z_linear_end.getId());\n                  filter_phi_op->addIdOperand(sample_result_unsigned_stacked);\n                  filter_phi_op->addIdOperand(block_z_head.getId());\n                  sample_result_unsigned_stacked = filter_phi_op->getResultId();\n                  builder_->getBuildPoint()->addInstruction(\n                      std::move(filter_phi_op));\n                }\n                {\n                  std::unique_ptr<spv::Instruction> filter_phi_op =\n                      std::make_unique<spv::Instruction>(\n                          builder_->getUniqueId(), type_float4_, spv::OpPhi);\n                  filter_phi_op->addIdOperand(\n                      sample_result_signed_stacked_filtered);\n                  filter_phi_op->addIdOperand(block_z_linear_end.getId());\n                  filter_phi_op->addIdOperand(sample_result_signed_stacked);\n                  filter_phi_op->addIdOperand(block_z_head.getId());\n                  sample_result_signed_stacked = filter_phi_op->getResultId();\n                  builder_->getBuildPoint()->addInstruction(\n                      std::move(filter_phi_op));\n                }\n              } else {\n                sample_result_unsigned_stacked =\n                    sample_result_unsigned_stacked_filtered;\n                sample_result_signed_stacked =\n                    sample_result_signed_stacked_filtered;\n              }\n            }\n          }\n          if_data_is_3d.makeEndIf();\n\n          sample_result_unsigned = if_data_is_3d.createMergePhi(\n              sample_result_unsigned_3d, sample_result_unsigned_stacked);\n          sample_result_signed = if_data_is_3d.createMergePhi(\n              sample_result_signed_3d, sample_result_signed_stacked);\n        } else {\n          if (use_computed_lod) {\n            texture_parameters.gradX = gradients_h;\n            texture_parameters.gradY = gradients_v;\n          }\n          id_vector_temp_.clear();\n          for (uint32_t i = 0; i < 3; ++i) {\n            id_vector_temp_.push_back(coordinates[i]);\n          }\n          texture_parameters.coords =\n              builder_->createCompositeConstruct(type_float3_, id_vector_temp_);\n          SampleTexture(texture_parameters, image_operands_mask,\n                        image_2d_array_or_cube_unsigned,\n                        image_2d_array_or_cube_signed, sampler, is_any_unsigned,\n                        is_any_signed, sample_result_unsigned,\n                        sample_result_signed);\n        }\n\n        // Swizzle the result components manually if needed, to `result`.\n        // Because the same host format component may be replicated into\n        // multiple guest components (such as for formats with less than 4\n        // components), yet the signedness is per-guest-component, it's not\n        // possible to apply the signedness to host components before swizzling,\n        // so doing it during (for unsigned vs. signed) and after (for biased\n        // and gamma) swizzling.\n        if (!features_.image_view_format_swizzle) {\n          id_vector_temp_.clear();\n          id_vector_temp_.push_back(\n              builder_->makeIntConstant(kSystemConstantTextureSwizzles));\n          id_vector_temp_.push_back(\n              builder_->makeIntConstant(fetch_constant_index >> 3));\n          id_vector_temp_.push_back(\n              builder_->makeIntConstant((fetch_constant_index >> 1) & 3));\n          // All 32 bits containing the values (24 bits) for 2 fetch constants.\n          spv::Id swizzle_word = builder_->createLoad(\n              builder_->createAccessChain(spv::StorageClassUniform,\n                                          uniform_system_constants_,\n                                          id_vector_temp_),\n              spv::NoPrecision);\n          uint32_t swizzle_word_offset = 3 * 4 * (fetch_constant_index & 1);\n          spv::Id const_float_1 = builder_->makeFloatConstant(1.0f);\n          uint32_t result_remaining_components = used_result_nonzero_components;\n          uint32_t result_component_index;\n          while (xe::bit_scan_forward(result_remaining_components,\n                                      &result_component_index)) {\n            result_remaining_components &=\n                ~(UINT32_C(1) << result_component_index);\n            uint32_t swizzle_bit_0_value =\n                UINT32_C(1)\n                << (swizzle_word_offset + 3 * result_component_index);\n            spv::Id swizzle_bit_0 = builder_->createBinOp(\n                spv::OpINotEqual, type_bool_,\n                builder_->createBinOp(\n                    spv::OpBitwiseAnd, type_uint_, swizzle_word,\n                    builder_->makeUintConstant(swizzle_bit_0_value)),\n                const_uint_0_);\n            // Bit 2 - X/Y/Z/W or 0/1.\n            spv::Id swizzle_bit_2 = builder_->createBinOp(\n                spv::OpINotEqual, type_bool_,\n                builder_->createBinOp(\n                    spv::OpBitwiseAnd, type_uint_, swizzle_word,\n                    builder_->makeUintConstant(swizzle_bit_0_value << 2)),\n                const_uint_0_);\n            SpirvBuilder::IfBuilder if_swizzle_constant(\n                swizzle_bit_2, spv::SelectionControlDontFlattenMask, *builder_);\n            spv::Id swizzle_result_constant;\n            {\n              // Constant values.\n              // Bit 0 - 0 or 1.\n              swizzle_result_constant = builder_->createTriOp(\n                  spv::OpSelect, type_float_, swizzle_bit_0, const_float_1,\n                  const_float_0_);\n            }\n            if_swizzle_constant.makeBeginElse();\n            spv::Id swizzle_result_component;\n            {\n              // Fetched components.\n              // Select whether the result is signed or unsigned (or biased or\n              // gamma-corrected) based on the post-swizzle signedness.\n              spv::Id swizzle_sample_result = builder_->createTriOp(\n                  spv::OpSelect, type_float4_,\n                  builder_->smearScalar(\n                      spv::NoPrecision,\n                      result_is_signed[result_component_index], type_bool4_),\n                  sample_result_signed, sample_result_unsigned);\n              // Bit 0 - X or Y, Z or W, 0 or 1.\n              spv::Id swizzle_x_or_y = builder_->createTriOp(\n                  spv::OpSelect, type_float_, swizzle_bit_0,\n                  builder_->createCompositeExtract(swizzle_sample_result,\n                                                   type_float_, 1),\n                  builder_->createCompositeExtract(swizzle_sample_result,\n                                                   type_float_, 0));\n              spv::Id swizzle_z_or_w = builder_->createTriOp(\n                  spv::OpSelect, type_float_, swizzle_bit_0,\n                  builder_->createCompositeExtract(swizzle_sample_result,\n                                                   type_float_, 3),\n                  builder_->createCompositeExtract(swizzle_sample_result,\n                                                   type_float_, 2));\n              // Bit 1 - X/Y or Z/W.\n              spv::Id swizzle_bit_1 = builder_->createBinOp(\n                  spv::OpINotEqual, type_bool_,\n                  builder_->createBinOp(\n                      spv::OpBitwiseAnd, type_uint_, swizzle_word,\n                      builder_->makeUintConstant(swizzle_bit_0_value << 1)),\n                  const_uint_0_);\n              swizzle_result_component = builder_->createTriOp(\n                  spv::OpSelect, type_float_, swizzle_bit_1, swizzle_z_or_w,\n                  swizzle_x_or_y);\n            }\n            if_swizzle_constant.makeEndIf();\n            // Select between the constants and the fetched components.\n            result[result_component_index] = if_swizzle_constant.createMergePhi(\n                swizzle_result_constant, swizzle_result_component);\n          }\n        }\n\n        // Apply the signednesses to all the needed components. If swizzling is\n        // done in the shader rather than via the image view, unsigned or signed\n        // source has already been selected into `result` - only need to bias or\n        // to gamma-correct.\n        spv::Id const_float_2 = builder_->makeFloatConstant(2.0f);\n        spv::Id const_float_minus_1 = builder_->makeFloatConstant(-1.0f);\n        {\n          uint32_t result_remaining_components = used_result_nonzero_components;\n          uint32_t result_component_index;\n          while (xe::bit_scan_forward(result_remaining_components,\n                                      &result_component_index)) {\n            result_remaining_components &=\n                ~(UINT32_C(1) << result_component_index);\n            spv::Id sample_result_component_unsigned =\n                features_.image_view_format_swizzle\n                    ? builder_->createCompositeExtract(sample_result_unsigned,\n                                                       type_float_,\n                                                       result_component_index)\n                    : result[result_component_index];\n            spv::Block& block_sign_head = *builder_->getBuildPoint();\n            spv::Block* block_sign_signed = features_.image_view_format_swizzle\n                                                ? &builder_->makeNewBlock()\n                                                : nullptr;\n            spv::Block& block_sign_unsigned_biased = builder_->makeNewBlock();\n            spv::Block& block_sign_gamma_start = builder_->makeNewBlock();\n            spv::Block& block_sign_merge = builder_->makeNewBlock();\n            builder_->createSelectionMerge(\n                &block_sign_merge, spv::SelectionControlDontFlattenMask);\n            {\n              std::unique_ptr<spv::Instruction> sign_switch_op =\n                  std::make_unique<spv::Instruction>(spv::OpSwitch);\n              sign_switch_op->addIdOperand(\n                  swizzled_signs[result_component_index]);\n              // Make unsigned (do nothing, take the unsigned component in the\n              // phi) the default, and also, if unsigned or signed has already\n              // been selected in swizzling, make signed the default to since\n              // it, just like unsigned, doesn't need any transformations.\n              sign_switch_op->addIdOperand(block_sign_merge.getId());\n              if (block_sign_signed) {\n                sign_switch_op->addImmediateOperand(\n                    uint32_t(xenos::TextureSign::kSigned));\n                sign_switch_op->addIdOperand(block_sign_signed->getId());\n              }\n              sign_switch_op->addImmediateOperand(\n                  uint32_t(xenos::TextureSign::kUnsignedBiased));\n              sign_switch_op->addIdOperand(block_sign_unsigned_biased.getId());\n              sign_switch_op->addImmediateOperand(\n                  uint32_t(xenos::TextureSign::kGamma));\n              sign_switch_op->addIdOperand(block_sign_gamma_start.getId());\n              builder_->getBuildPoint()->addInstruction(\n                  std::move(sign_switch_op));\n            }\n            if (block_sign_signed) {\n              block_sign_signed->addPredecessor(&block_sign_head);\n            }\n            block_sign_unsigned_biased.addPredecessor(&block_sign_head);\n            block_sign_gamma_start.addPredecessor(&block_sign_head);\n            block_sign_merge.addPredecessor(&block_sign_head);\n            // Signed.\n            spv::Id sample_result_component_signed =\n                sample_result_component_unsigned;\n            if (block_sign_signed) {\n              builder_->setBuildPoint(block_sign_signed);\n              sample_result_component_signed = builder_->createCompositeExtract(\n                  sample_result_signed, type_float_, result_component_index);\n              builder_->createBranch(&block_sign_merge);\n            }\n            // Unsigned biased.\n            builder_->setBuildPoint(&block_sign_unsigned_biased);\n            spv::Id sample_result_component_unsigned_biased =\n                builder_->createNoContractionBinOp(\n                    spv::OpFMul, type_float_, sample_result_component_unsigned,\n                    const_float_2);\n            sample_result_component_unsigned_biased =\n                builder_->createNoContractionBinOp(\n                    spv::OpFAdd, type_float_,\n                    sample_result_component_unsigned_biased,\n                    const_float_minus_1);\n            builder_->createBranch(&block_sign_merge);\n            // Gamma.\n            builder_->setBuildPoint(&block_sign_gamma_start);\n            spv::Id sample_result_component_gamma =\n                PWLGammaToLinear(sample_result_component_unsigned, false);\n            // Get the current build point for the phi operation not to assume\n            // that it will be the same as before PWLGammaToLinear.\n            spv::Block& block_sign_gamma_end = *builder_->getBuildPoint();\n            builder_->createBranch(&block_sign_merge);\n            // Merge.\n            builder_->setBuildPoint(&block_sign_merge);\n            {\n              std::unique_ptr<spv::Instruction> sign_phi_op =\n                  std::make_unique<spv::Instruction>(builder_->getUniqueId(),\n                                                     type_float_, spv::OpPhi);\n              if (block_sign_signed) {\n                sign_phi_op->addIdOperand(sample_result_component_signed);\n                sign_phi_op->addIdOperand(block_sign_signed->getId());\n              }\n              sign_phi_op->addIdOperand(\n                  sample_result_component_unsigned_biased);\n              sign_phi_op->addIdOperand(block_sign_unsigned_biased.getId());\n              sign_phi_op->addIdOperand(sample_result_component_gamma);\n              sign_phi_op->addIdOperand(block_sign_gamma_end.getId());\n              sign_phi_op->addIdOperand(sample_result_component_unsigned);\n              sign_phi_op->addIdOperand(block_sign_head.getId());\n              result[result_component_index] = sign_phi_op->getResultId();\n              builder_->getBuildPoint()->addInstruction(std::move(sign_phi_op));\n            }\n          }\n        }\n\n        // Apply the exponent bias from the bits 13:18 of the fetch constant\n        // word 4.\n        spv::Id result_exponent_bias = builder_->createBinBuiltinCall(\n            type_float_, ext_inst_glsl_std_450_, GLSLstd450Ldexp,\n            const_float_1_,\n            builder_->createTriOp(spv::OpBitFieldSExtract, type_int_,\n                                  fetch_constant_word_4_signed,\n                                  builder_->makeUintConstant(13),\n                                  builder_->makeUintConstant(6)));\n        {\n          uint32_t result_remaining_components = used_result_nonzero_components;\n          uint32_t result_component_index;\n          while (xe::bit_scan_forward(result_remaining_components,\n                                      &result_component_index)) {\n            result_remaining_components &=\n                ~(UINT32_C(1) << result_component_index);\n            result[result_component_index] = builder_->createNoContractionBinOp(\n                spv::OpFMul, type_float_, result[result_component_index],\n                result_exponent_bias);\n          }\n        }\n      }\n    }\n  }\n\n  // Store the needed components of the result.\n  spv::Id result_vector;\n  if (used_result_component_count > 1) {\n    id_vector_temp_.clear();\n    uint32_t result_components_remaining = used_result_components;\n    uint32_t result_component_index;\n    while (xe::bit_scan_forward(result_components_remaining,\n                                &result_component_index)) {\n      result_components_remaining &= ~(UINT32_C(1) << result_component_index);\n      id_vector_temp_.push_back(result[result_component_index]);\n    }\n    result_vector = builder_->createCompositeConstruct(\n        type_float_vectors_[used_result_component_count - 1], id_vector_temp_);\n  } else {\n    uint32_t result_component_index;\n    xe::bit_scan_forward(used_result_components, &result_component_index);\n    result_vector = result[result_component_index];\n  }\n  StoreResult(instr.result, result_vector);\n}\n\nsize_t SpirvShaderTranslator::FindOrAddTextureBinding(\n    uint32_t fetch_constant, xenos::FetchOpDimension dimension,\n    bool is_signed) {\n  // 1D and 2D textures (including stacked ones) are treated as 2D arrays for\n  // binding and coordinate simplicity.\n  if (dimension == xenos::FetchOpDimension::k1D) {\n    dimension = xenos::FetchOpDimension::k2D;\n  }\n  for (size_t i = 0; i < texture_bindings_.size(); ++i) {\n    const TextureBinding& texture_binding = texture_bindings_[i];\n    if (texture_binding.fetch_constant == fetch_constant &&\n        texture_binding.dimension == dimension &&\n        texture_binding.is_signed == is_signed) {\n      return i;\n    }\n  }\n  // TODO(Triang3l): Limit the total count to that actually supported by the\n  // implementation.\n  size_t new_texture_binding_index = texture_bindings_.size();\n  TextureBinding& new_texture_binding = texture_bindings_.emplace_back();\n  new_texture_binding.fetch_constant = fetch_constant;\n  new_texture_binding.dimension = dimension;\n  new_texture_binding.is_signed = is_signed;\n  spv::Dim type_dimension;\n  bool is_array;\n  const char* dimension_name;\n  switch (dimension) {\n    case xenos::FetchOpDimension::k3DOrStacked:\n      type_dimension = spv::Dim3D;\n      is_array = false;\n      dimension_name = \"3d\";\n      break;\n    case xenos::FetchOpDimension::kCube:\n      type_dimension = spv::DimCube;\n      is_array = false;\n      dimension_name = \"cube\";\n      break;\n    default:\n      type_dimension = spv::Dim2D;\n      is_array = true;\n      dimension_name = \"2d\";\n  }\n  new_texture_binding.variable = builder_->createVariable(\n      spv::NoPrecision, spv::StorageClassUniformConstant,\n      builder_->makeImageType(type_float_, type_dimension, false, is_array,\n                              false, 1, spv::ImageFormatUnknown),\n      fmt::format(\"xe_texture{}_{}_{}\", fetch_constant, dimension_name,\n                  is_signed ? 's' : 'u')\n          .c_str());\n  builder_->addDecoration(\n      new_texture_binding.variable, spv::DecorationDescriptorSet,\n      int(is_vertex_shader() ? kDescriptorSetTexturesVertex\n                             : kDescriptorSetTexturesPixel));\n  builder_->addDecoration(new_texture_binding.variable, spv::DecorationBinding,\n                          int(new_texture_binding_index));\n  if (features_.spirv_version >= spv::Spv_1_4) {\n    main_interface_.push_back(new_texture_binding.variable);\n  }\n  return new_texture_binding_index;\n}\n\nsize_t SpirvShaderTranslator::FindOrAddSamplerBinding(\n    uint32_t fetch_constant, xenos::TextureFilter mag_filter,\n    xenos::TextureFilter min_filter, xenos::TextureFilter mip_filter,\n    xenos::AnisoFilter aniso_filter) {\n  if (aniso_filter != xenos::AnisoFilter::kUseFetchConst) {\n    // TODO(Triang3l): Limit to what's actually supported by the implementation.\n    aniso_filter = std::min(aniso_filter, xenos::AnisoFilter::kMax_16_1);\n  }\n  for (size_t i = 0; i < sampler_bindings_.size(); ++i) {\n    const SamplerBinding& sampler_binding = sampler_bindings_[i];\n    if (sampler_binding.fetch_constant == fetch_constant &&\n        sampler_binding.mag_filter == mag_filter &&\n        sampler_binding.min_filter == min_filter &&\n        sampler_binding.mip_filter == mip_filter &&\n        sampler_binding.aniso_filter == aniso_filter) {\n      return i;\n    }\n  }\n  // TODO(Triang3l): Limit the total count to that actually supported by the\n  // implementation.\n  size_t new_sampler_binding_index = sampler_bindings_.size();\n  SamplerBinding& new_sampler_binding = sampler_bindings_.emplace_back();\n  new_sampler_binding.fetch_constant = fetch_constant;\n  new_sampler_binding.mag_filter = mag_filter;\n  new_sampler_binding.min_filter = min_filter;\n  new_sampler_binding.mip_filter = mip_filter;\n  new_sampler_binding.aniso_filter = aniso_filter;\n  std::ostringstream name;\n  static const char kFilterSuffixes[] = {'p', 'l', 'b', 'f'};\n  name << \"xe_sampler\" << fetch_constant << '_'\n       << kFilterSuffixes[uint32_t(mag_filter)]\n       << kFilterSuffixes[uint32_t(min_filter)]\n       << kFilterSuffixes[uint32_t(mip_filter)];\n  if (aniso_filter != xenos::AnisoFilter::kUseFetchConst) {\n    if (aniso_filter == xenos::AnisoFilter::kDisabled) {\n      name << \"_a0\";\n    } else {\n      name << \"_a\" << (UINT32_C(1) << (uint32_t(aniso_filter) - 1));\n    }\n  }\n  new_sampler_binding.variable = builder_->createVariable(\n      spv::NoPrecision, spv::StorageClassUniformConstant,\n      builder_->makeSamplerType(), name.str().c_str());\n  builder_->addDecoration(\n      new_sampler_binding.variable, spv::DecorationDescriptorSet,\n      int(is_vertex_shader() ? kDescriptorSetTexturesVertex\n                             : kDescriptorSetTexturesPixel));\n  // The binding indices will be specified later after all textures are added as\n  // samplers are located after images in the descriptor set.\n  if (features_.spirv_version >= spv::Spv_1_4) {\n    main_interface_.push_back(new_sampler_binding.variable);\n  }\n  return new_sampler_binding_index;\n}\n\nvoid SpirvShaderTranslator::SampleTexture(\n    spv::Builder::TextureParameters& texture_parameters,\n    spv::ImageOperandsMask image_operands_mask, spv::Id image_unsigned,\n    spv::Id image_signed, spv::Id sampler, spv::Id is_any_unsigned,\n    spv::Id is_any_signed, spv::Id& result_unsigned_out,\n    spv::Id& result_signed_out, spv::Id lerp_factor,\n    spv::Id lerp_first_unsigned, spv::Id lerp_first_signed) {\n  for (uint32_t i = 0; i < 2; ++i) {\n    SpirvBuilder::IfBuilder sign_if(i ? is_any_signed : is_any_unsigned,\n                                    spv::SelectionControlDontFlattenMask,\n                                    *builder_);\n    spv::Id sign_result;\n    {\n      spv::Id image = i ? image_signed : image_unsigned;\n      // OpSampledImage must be in the same block as where its result is used.\n      texture_parameters.sampler = builder_->createBinOp(\n          spv::OpSampledImage,\n          builder_->makeSampledImageType(builder_->getTypeId(image)), image,\n          sampler);\n      sign_result = builder_->createTextureCall(\n          spv::NoPrecision, type_float4_, false, false, false, false, false,\n          texture_parameters, image_operands_mask);\n      if (lerp_factor != spv::NoResult) {\n        spv::Id lerp_first = i ? lerp_first_signed : lerp_first_unsigned;\n        if (lerp_first != spv::NoResult) {\n          spv::Id lerp_difference = builder_->createNoContractionBinOp(\n              spv::OpVectorTimesScalar, type_float4_,\n              builder_->createNoContractionBinOp(spv::OpFSub, type_float4_,\n                                                 sign_result, lerp_first),\n              lerp_factor);\n          sign_result = builder_->createNoContractionBinOp(\n              spv::OpFAdd, type_float4_, sign_result, lerp_difference);\n        }\n      }\n    }\n    sign_if.makeEndIf();\n    // This may overwrite the first lerp endpoint for the sign (such usage of\n    // this function is allowed).\n    (i ? result_signed_out : result_unsigned_out) =\n        sign_if.createMergePhi(sign_result, const_float4_0_);\n  }\n}\n\nspv::Id SpirvShaderTranslator::QueryTextureLod(\n    spv::Builder::TextureParameters& texture_parameters, spv::Id image_unsigned,\n    spv::Id image_signed, spv::Id sampler, spv::Id is_all_signed) {\n  // OpSampledImage must be in the same block as where its result is used.\n  SpirvBuilder::IfBuilder if_signed(\n      is_all_signed, spv::SelectionControlDontFlattenMask, *builder_);\n  spv::Id lod_signed;\n  {\n    texture_parameters.sampler = builder_->createBinOp(\n        spv::OpSampledImage,\n        builder_->makeSampledImageType(builder_->getTypeId(image_signed)),\n        image_signed, sampler);\n    lod_signed = builder_->createCompositeExtract(\n        builder_->createTextureQueryCall(spv::OpImageQueryLod,\n                                         texture_parameters, false),\n        type_float_, 1);\n  }\n  if_signed.makeBeginElse();\n  spv::Id lod_unsigned;\n  {\n    texture_parameters.sampler = builder_->createBinOp(\n        spv::OpSampledImage,\n        builder_->makeSampledImageType(builder_->getTypeId(image_unsigned)),\n        image_unsigned, sampler);\n    lod_unsigned = builder_->createCompositeExtract(\n        builder_->createTextureQueryCall(spv::OpImageQueryLod,\n                                         texture_parameters, false),\n        type_float_, 1);\n  }\n  if_signed.makeEndIf();\n  return if_signed.createMergePhi(lod_signed, lod_unsigned);\n}\n\n}  // namespace gpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/spirv_shader_translator_memexport.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2024 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/spirv_shader_translator.h\"\n\n#include <array>\n#include <cstdint>\n#include <functional>\n#include <memory>\n#include <optional>\n#include <utility>\n\n#include \"third_party/glslang/SPIRV/GLSL.std.450.h\"\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/gpu/ucode.h\"\n\nnamespace xe {\nnamespace gpu {\n\nvoid SpirvShaderTranslator::ExportToMemory(uint8_t export_eM) {\n  if (!export_eM) {\n    return;\n  }\n\n  assert_zero(export_eM & ~current_shader().memexport_eM_written());\n\n  if (!IsMemoryExportSupported()) {\n    return;\n  }\n\n  // Check if memory export is allowed in this guest shader invocation.\n  std::optional<SpirvBuilder::IfBuilder> if_memexport_allowed;\n  if (main_memexport_allowed_ != spv::NoResult) {\n    if_memexport_allowed.emplace(main_memexport_allowed_,\n                                 spv::SelectionControlDontFlattenMask,\n                                 *builder_);\n  }\n\n  // If the pixel was killed (but the actual killing on the SPIR-V side has not\n  // been performed yet because the device doesn't support demotion to helper\n  // invocation that doesn't interfere with control flow), the current\n  // invocation is not considered active anymore.\n  std::optional<SpirvBuilder::IfBuilder> if_pixel_not_killed;\n  if (var_main_kill_pixel_ != spv::NoResult) {\n    if_pixel_not_killed.emplace(\n        builder_->createUnaryOp(\n            spv::OpLogicalNot, type_bool_,\n            builder_->createLoad(var_main_kill_pixel_, spv::NoPrecision)),\n        spv::SelectionControlDontFlattenMask, *builder_);\n  }\n\n  // Check if the address with the correct sign and exponent was written, and\n  // that the index doesn't overflow the mantissa bits.\n  // all((eA_vector >> uvec4(30, 23, 23, 23)) == uvec4(0x1, 0x96, 0x96, 0x96))\n  spv::Id eA_vector = builder_->createUnaryOp(\n      spv::OpBitcast, type_uint4_,\n      builder_->createLoad(var_main_memexport_address_, spv::NoPrecision));\n  id_vector_temp_.clear();\n  id_vector_temp_.push_back(builder_->makeUintConstant(30));\n  id_vector_temp_.push_back(builder_->makeUintConstant(23));\n  id_vector_temp_.push_back(id_vector_temp_.back());\n  id_vector_temp_.push_back(id_vector_temp_.back());\n  spv::Id address_validation_shift =\n      builder_->makeCompositeConstant(type_uint4_, id_vector_temp_);\n  id_vector_temp_.clear();\n  id_vector_temp_.push_back(builder_->makeUintConstant(0x1));\n  id_vector_temp_.push_back(builder_->makeUintConstant(0x96));\n  id_vector_temp_.push_back(id_vector_temp_.back());\n  id_vector_temp_.push_back(id_vector_temp_.back());\n  spv::Id address_validation_value =\n      builder_->makeCompositeConstant(type_uint4_, id_vector_temp_);\n  SpirvBuilder::IfBuilder if_address_valid(\n      builder_->createUnaryOp(\n          spv::OpAll, type_bool_,\n          builder_->createBinOp(\n              spv::OpIEqual, type_bool4_,\n              builder_->createBinOp(spv::OpShiftRightLogical, type_uint4_,\n                                    eA_vector, address_validation_shift),\n              address_validation_value)),\n      spv::SelectionControlDontFlattenMask, *builder_, 2, 1);\n\n  using EMIdArray = std::array<spv::Id, ucode::kMaxMemExportElementCount>;\n\n  auto for_each_eM = [&](std::function<void(uint32_t eM_index)> fn) {\n    uint8_t eM_remaining = export_eM;\n    uint32_t eM_index;\n    while (xe::bit_scan_forward(eM_remaining, &eM_index)) {\n      eM_remaining &= ~(uint8_t(1) << eM_index);\n      fn(eM_index);\n    }\n  };\n\n  // Load the original eM.\n  EMIdArray eM_original;\n  for_each_eM([&](uint32_t eM_index) {\n    eM_original[eM_index] = builder_->createLoad(\n        var_main_memexport_data_[eM_index], spv::NoPrecision);\n  });\n\n  // Swap red and blue if needed.\n  spv::Id format_info =\n      builder_->createCompositeExtract(eA_vector, type_uint_, 2);\n  spv::Id swap_red_blue = builder_->createBinOp(\n      spv::OpINotEqual, type_bool_,\n      builder_->createBinOp(spv::OpBitwiseAnd, type_uint_, format_info,\n                            builder_->makeUintConstant(uint32_t(1) << 19)),\n      const_uint_0_);\n  EMIdArray eM_swapped;\n  uint_vector_temp_.clear();\n  uint_vector_temp_.push_back(2);\n  uint_vector_temp_.push_back(1);\n  uint_vector_temp_.push_back(0);\n  uint_vector_temp_.push_back(3);\n  for_each_eM([&](uint32_t eM_index) {\n    eM_swapped[eM_index] = builder_->createTriOp(\n        spv::OpSelect, type_float4_, swap_red_blue,\n        builder_->createRvalueSwizzle(spv::NoPrecision, type_float4_,\n                                      eM_original[eM_index], uint_vector_temp_),\n        eM_original[eM_index]);\n  });\n\n  // Extract the numeric format.\n  spv::Id is_signed = builder_->createBinOp(\n      spv::OpINotEqual, type_bool_,\n      builder_->createBinOp(spv::OpBitwiseAnd, type_uint_, format_info,\n                            builder_->makeUintConstant(uint32_t(1) << 16)),\n      const_uint_0_);\n  spv::Id is_norm = builder_->createBinOp(\n      spv::OpIEqual, type_bool_,\n      builder_->createBinOp(spv::OpBitwiseAnd, type_uint_, format_info,\n                            builder_->makeUintConstant(uint32_t(1) << 17)),\n      const_uint_0_);\n\n  // Perform format packing.\n\n  auto flush_nan = [&](const EMIdArray& eM) -> EMIdArray {\n    EMIdArray eM_flushed;\n    for_each_eM([&](uint32_t eM_index) {\n      spv::Id element_unflushed = eM[eM_index];\n      unsigned int component_count =\n          builder_->getNumComponents(element_unflushed);\n      eM_flushed[eM_index] = builder_->createTriOp(\n          spv::OpSelect, type_float_vectors_[component_count - 1],\n          builder_->createUnaryOp(spv::OpIsNan,\n                                  type_bool_vectors_[component_count - 1],\n                                  element_unflushed),\n          const_float_vectors_0_[component_count - 1], element_unflushed);\n    });\n    return eM_flushed;\n  };\n\n  auto make_float_constant_vectors =\n      [&](float value) -> std::array<spv::Id, 4> {\n    std::array<spv::Id, 4> const_vectors;\n    const_vectors[0] = builder_->makeFloatConstant(value);\n    id_vector_temp_.clear();\n    id_vector_temp_.push_back(const_vectors[0]);\n    for (unsigned int component_count_minus_1 = 1; component_count_minus_1 < 4;\n         ++component_count_minus_1) {\n      id_vector_temp_.push_back(const_vectors[0]);\n      const_vectors[component_count_minus_1] = builder_->makeCompositeConstant(\n          type_float_vectors_[component_count_minus_1], id_vector_temp_);\n    }\n    return const_vectors;\n  };\n  std::array<spv::Id, 4> const_float_vectors_minus_1 =\n      make_float_constant_vectors(-1.0f);\n  std::array<spv::Id, 4> const_float_vectors_minus_0_5 =\n      make_float_constant_vectors(-0.5f);\n  std::array<spv::Id, 4> const_float_vectors_0_5 =\n      make_float_constant_vectors(0.5f);\n\n  // The widths must be without holes (R, RG, RGB, RGBA), and expecting the\n  // widths to add up to the size of the stored texel (8, 16 or 32 bits), as the\n  // unused upper bits will contain junk from the sign extension of X if the\n  // number is signed.\n  auto pack_8_16_32 = [&](std::array<uint32_t, 4> widths) -> EMIdArray {\n    unsigned int component_count;\n    std::array<uint32_t, 4> offsets{};\n    for (component_count = 0; component_count < widths.size();\n         ++component_count) {\n      if (!widths[component_count]) {\n        break;\n      }\n      // Only formats for which max + 0.5 can be represented exactly.\n      assert(widths[component_count] <= 23);\n      if (component_count) {\n        offsets[component_count] =\n            offsets[component_count - 1] + widths[component_count - 1];\n      }\n    }\n    assert_not_zero(component_count);\n\n    // Extract the needed components.\n    EMIdArray eM_unflushed = eM_swapped;\n    if (component_count < 4) {\n      if (component_count == 1) {\n        for_each_eM([&](uint32_t eM_index) {\n          eM_unflushed[eM_index] = builder_->createCompositeExtract(\n              eM_unflushed[eM_index], type_float_, 0);\n        });\n      } else {\n        uint_vector_temp_.clear();\n        for (unsigned int component_index = 0;\n             component_index < component_count; ++component_index) {\n          uint_vector_temp_.push_back(component_index);\n        }\n        for_each_eM([&](uint32_t eM_index) {\n          eM_unflushed[eM_index] = builder_->createRvalueSwizzle(\n              spv::NoPrecision, type_float_vectors_[component_count - 1],\n              eM_unflushed[eM_index], uint_vector_temp_);\n        });\n      }\n    }\n\n    // Flush NaNs.\n    EMIdArray eM_flushed = flush_nan(eM_unflushed);\n\n    // Convert to integers.\n    SpirvBuilder::IfBuilder if_signed(\n        is_signed, spv::SelectionControlDontFlattenMask, *builder_);\n    EMIdArray eM_signed;\n    {\n      // Signed.\n      SpirvBuilder::IfBuilder if_norm(\n          is_norm, spv::SelectionControlDontFlattenMask, *builder_);\n      EMIdArray eM_norm;\n      {\n        // Signed normalized.\n        id_vector_temp_.clear();\n        for (unsigned int component_index = 0;\n             component_index < component_count; ++component_index) {\n          id_vector_temp_.push_back(builder_->makeFloatConstant(\n              float((uint32_t(1) << (widths[component_index] - 1)) - 1)));\n        }\n        spv::Id const_max_value =\n            component_count > 1\n                ? builder_->makeCompositeConstant(\n                      type_float_vectors_[component_count - 1], id_vector_temp_)\n                : id_vector_temp_.front();\n        for_each_eM([&](uint32_t eM_index) {\n          eM_norm[eM_index] = builder_->createNoContractionBinOp(\n              spv::OpFMul, type_float_vectors_[component_count - 1],\n              builder_->createTriBuiltinCall(\n                  type_float_vectors_[component_count - 1],\n                  ext_inst_glsl_std_450_, GLSLstd450FClamp,\n                  eM_flushed[eM_index],\n                  const_float_vectors_minus_1[component_count - 1],\n                  const_float_vectors_1_[component_count - 1]),\n              const_max_value);\n        });\n      }\n      if_norm.makeEndIf();\n      // All phi instructions must be in the beginning of the block.\n      for_each_eM([&](uint32_t eM_index) {\n        eM_signed[eM_index] =\n            if_norm.createMergePhi(eM_norm[eM_index], eM_flushed[eM_index]);\n      });\n      // Convert to signed integer, adding plus/minus 0.5 before truncating\n      // according to the Direct3D format conversion rules.\n      for_each_eM([&](uint32_t eM_index) {\n        eM_signed[eM_index] = builder_->createUnaryOp(\n            spv::OpBitcast, type_uint_vectors_[component_count - 1],\n            builder_->createUnaryOp(\n                spv::OpConvertFToS, type_int_vectors_[component_count - 1],\n                builder_->createNoContractionBinOp(\n                    spv::OpFAdd, type_float_vectors_[component_count - 1],\n                    eM_signed[eM_index],\n                    builder_->createTriOp(\n                        spv::OpSelect, type_float_vectors_[component_count - 1],\n                        builder_->createBinOp(\n                            spv::OpFOrdLessThan,\n                            type_bool_vectors_[component_count - 1],\n                            eM_signed[eM_index],\n                            const_float_vectors_0_[component_count - 1]),\n                        const_float_vectors_minus_0_5[component_count - 1],\n                        const_float_vectors_0_5[component_count - 1]))));\n      });\n    }\n    if_signed.makeBeginElse();\n    EMIdArray eM_unsigned;\n    {\n      SpirvBuilder::IfBuilder if_norm(\n          is_norm, spv::SelectionControlDontFlattenMask, *builder_);\n      EMIdArray eM_norm;\n      {\n        // Unsigned normalized.\n        id_vector_temp_.clear();\n        for (unsigned int component_index = 0;\n             component_index < component_count; ++component_index) {\n          id_vector_temp_.push_back(builder_->makeFloatConstant(\n              float((uint32_t(1) << widths[component_index]) - 1)));\n        }\n        spv::Id const_max_value =\n            component_count > 1\n                ? builder_->makeCompositeConstant(\n                      type_float_vectors_[component_count - 1], id_vector_temp_)\n                : id_vector_temp_.front();\n        for_each_eM([&](uint32_t eM_index) {\n          eM_norm[eM_index] = builder_->createNoContractionBinOp(\n              spv::OpFMul, type_float_vectors_[component_count - 1],\n              builder_->createTriBuiltinCall(\n                  type_float_vectors_[component_count - 1],\n                  ext_inst_glsl_std_450_, GLSLstd450FClamp,\n                  eM_flushed[eM_index],\n                  const_float_vectors_0_[component_count - 1],\n                  const_float_vectors_1_[component_count - 1]),\n              const_max_value);\n        });\n      }\n      if_norm.makeEndIf();\n      // All phi instructions must be in the beginning of the block.\n      for_each_eM([&](uint32_t eM_index) {\n        eM_unsigned[eM_index] =\n            if_norm.createMergePhi(eM_norm[eM_index], eM_flushed[eM_index]);\n      });\n      // Convert to unsigned integer, adding 0.5 before truncating according to\n      // the Direct3D format conversion rules.\n      for_each_eM([&](uint32_t eM_index) {\n        eM_unsigned[eM_index] = builder_->createUnaryOp(\n            spv::OpConvertFToU, type_uint_vectors_[component_count - 1],\n            builder_->createNoContractionBinOp(\n                spv::OpFAdd, type_float_vectors_[component_count - 1],\n                eM_unsigned[eM_index],\n                const_float_vectors_0_5[component_count - 1]));\n      });\n    }\n    if_signed.makeEndIf();\n    EMIdArray eM_unpacked;\n    for_each_eM([&](uint32_t eM_index) {\n      eM_unpacked[eM_index] =\n          if_signed.createMergePhi(eM_signed[eM_index], eM_unsigned[eM_index]);\n    });\n\n    // Pack into a 32-bit value, and pad to a 4-component vector for the phi.\n    EMIdArray eM_packed;\n    for_each_eM([&](uint32_t eM_index) {\n      spv::Id element_unpacked = eM_unpacked[eM_index];\n      eM_packed[eM_index] = component_count > 1\n                                ? builder_->createCompositeExtract(\n                                      element_unpacked, type_uint_, 0)\n                                : element_unpacked;\n      for (unsigned int component_index = 1; component_index < component_count;\n           ++component_index) {\n        eM_packed[eM_index] = builder_->createQuadOp(\n            spv::OpBitFieldInsert, type_uint_, eM_packed[eM_index],\n            builder_->createCompositeExtract(element_unpacked, type_uint_,\n                                             component_index),\n            builder_->makeUintConstant(offsets[component_index]),\n            builder_->makeUintConstant(widths[component_index]));\n      }\n      id_vector_temp_.clear();\n      id_vector_temp_.resize(4, const_uint_0_);\n      id_vector_temp_.front() = eM_packed[eM_index];\n      eM_packed[eM_index] =\n          builder_->createCompositeConstruct(type_uint4_, id_vector_temp_);\n    });\n\n    return eM_packed;\n  };\n\n  SpirvBuilder::SwitchBuilder format_switch(\n      builder_->createTriOp(spv::OpBitFieldUExtract, type_uint_, format_info,\n                            builder_->makeUintConstant(8),\n                            builder_->makeUintConstant(6)),\n      spv::SelectionControlDontFlattenMask, *builder_);\n\n  struct FormatCase {\n    EMIdArray eM_packed;\n    uint32_t element_bytes_log2;\n    spv::Id phi_parent;\n  };\n  std::vector<FormatCase> format_cases;\n  // Must be called at the end of the switch case segment for the correct phi\n  // parent.\n  auto add_format_case = [&](const EMIdArray& eM_packed,\n                             uint32_t element_bytes_log2) {\n    FormatCase& format_case = format_cases.emplace_back();\n    format_case.eM_packed = eM_packed;\n    format_case.element_bytes_log2 = element_bytes_log2;\n    format_case.phi_parent = builder_->getBuildPoint()->getId();\n  };\n\n  // k_8, k_8_A, k_8_B\n  format_switch.makeBeginCase(\n      static_cast<unsigned int>(xenos::ColorFormat::k_8));\n  // TODO(Triang3l): Investigate how input should be treated for k_8_A, k_8_B.\n  format_switch.addCurrentCaseLiteral(\n      static_cast<unsigned int>(xenos::ColorFormat::k_8_A));\n  format_switch.addCurrentCaseLiteral(\n      static_cast<unsigned int>(xenos::ColorFormat::k_8_B));\n  add_format_case(pack_8_16_32({8}), 0);\n\n  // k_1_5_5_5\n  format_switch.makeBeginCase(\n      static_cast<unsigned int>(xenos::ColorFormat::k_1_5_5_5));\n  add_format_case(pack_8_16_32({5, 5, 5, 1}), 1);\n\n  // k_5_6_5\n  format_switch.makeBeginCase(\n      static_cast<unsigned int>(xenos::ColorFormat::k_5_6_5));\n  add_format_case(pack_8_16_32({5, 6, 5}), 1);\n\n  // k_6_5_5\n  format_switch.makeBeginCase(\n      static_cast<unsigned int>(xenos::ColorFormat::k_6_5_5));\n  add_format_case(pack_8_16_32({5, 5, 6}), 1);\n\n  // k_8_8_8_8, k_8_8_8_8_A, k_8_8_8_8_AS_16_16_16_16\n  format_switch.makeBeginCase(\n      static_cast<unsigned int>(xenos::ColorFormat::k_8_8_8_8));\n  // TODO(Triang3l): Investigate how input should be treated for k_8_8_8_8_A.\n  format_switch.addCurrentCaseLiteral(\n      static_cast<unsigned int>(xenos::ColorFormat::k_8_8_8_8_A));\n  format_switch.addCurrentCaseLiteral(\n      static_cast<unsigned int>(xenos::ColorFormat::k_8_8_8_8_AS_16_16_16_16));\n  add_format_case(pack_8_16_32({8, 8, 8, 8}), 2);\n\n  // k_2_10_10_10, k_2_10_10_10_AS_16_16_16_16\n  format_switch.makeBeginCase(\n      static_cast<unsigned int>(xenos::ColorFormat::k_2_10_10_10));\n  format_switch.addCurrentCaseLiteral(static_cast<unsigned int>(\n      xenos::ColorFormat::k_2_10_10_10_AS_16_16_16_16));\n  add_format_case(pack_8_16_32({10, 10, 10, 2}), 2);\n\n  // k_8_8\n  format_switch.makeBeginCase(\n      static_cast<unsigned int>(xenos::ColorFormat::k_8_8));\n  add_format_case(pack_8_16_32({8, 8}), 1);\n\n  // k_4_4_4_4\n  format_switch.makeBeginCase(\n      static_cast<unsigned int>(xenos::ColorFormat::k_4_4_4_4));\n  add_format_case(pack_8_16_32({4, 4, 4, 4}), 1);\n\n  // k_10_11_11, k_10_11_11_AS_16_16_16_16\n  format_switch.makeBeginCase(\n      static_cast<unsigned int>(xenos::ColorFormat::k_10_11_11));\n  format_switch.addCurrentCaseLiteral(\n      static_cast<unsigned int>(xenos::ColorFormat::k_10_11_11_AS_16_16_16_16));\n  add_format_case(pack_8_16_32({11, 11, 10}), 2);\n\n  // k_11_11_10, k_11_11_10_AS_16_16_16_16\n  format_switch.makeBeginCase(\n      static_cast<unsigned int>(xenos::ColorFormat::k_11_11_10));\n  format_switch.addCurrentCaseLiteral(\n      static_cast<unsigned int>(xenos::ColorFormat::k_11_11_10_AS_16_16_16_16));\n  add_format_case(pack_8_16_32({10, 11, 11}), 2);\n\n  // k_16\n  format_switch.makeBeginCase(\n      static_cast<unsigned int>(xenos::ColorFormat::k_16));\n  add_format_case(pack_8_16_32({16}), 1);\n\n  // k_16_16\n  format_switch.makeBeginCase(\n      static_cast<unsigned int>(xenos::ColorFormat::k_16_16));\n  add_format_case(pack_8_16_32({16, 16}), 2);\n\n  // k_16_16_16_16\n  format_switch.makeBeginCase(\n      static_cast<unsigned int>(xenos::ColorFormat::k_16_16_16_16));\n  {\n    // Flush NaNs.\n    EMIdArray fixed16_flushed = flush_nan(eM_swapped);\n\n    // Convert to integers.\n    SpirvBuilder::IfBuilder if_signed(\n        is_signed, spv::SelectionControlDontFlattenMask, *builder_);\n    EMIdArray fixed16_signed;\n    {\n      // Signed.\n      SpirvBuilder::IfBuilder if_norm(\n          is_norm, spv::SelectionControlDontFlattenMask, *builder_);\n      EMIdArray fixed16_norm;\n      {\n        // Signed normalized.\n        id_vector_temp_.clear();\n        id_vector_temp_.resize(4, builder_->makeFloatConstant(\n                                      float((uint32_t(1) << (16 - 1)) - 1)));\n        spv::Id const_snorm16_max_value =\n            builder_->makeCompositeConstant(type_float4_, id_vector_temp_);\n        for_each_eM([&](uint32_t eM_index) {\n          fixed16_norm[eM_index] = builder_->createNoContractionBinOp(\n              spv::OpFMul, type_float4_,\n              builder_->createTriBuiltinCall(\n                  type_float4_, ext_inst_glsl_std_450_, GLSLstd450FClamp,\n                  fixed16_flushed[eM_index], const_float_vectors_minus_1[3],\n                  const_float4_1_),\n              const_snorm16_max_value);\n        });\n      }\n      if_norm.makeEndIf();\n      // All phi instructions must be in the beginning of the block.\n      for_each_eM([&](uint32_t eM_index) {\n        fixed16_signed[eM_index] = if_norm.createMergePhi(\n            fixed16_norm[eM_index], fixed16_flushed[eM_index]);\n      });\n      // Convert to signed integer, adding plus/minus 0.5 before truncating\n      // according to the Direct3D format conversion rules.\n      for_each_eM([&](uint32_t eM_index) {\n        fixed16_signed[eM_index] = builder_->createUnaryOp(\n            spv::OpBitcast, type_uint4_,\n            builder_->createUnaryOp(\n                spv::OpConvertFToS, type_int4_,\n                builder_->createNoContractionBinOp(\n                    spv::OpFAdd, type_float4_, fixed16_signed[eM_index],\n                    builder_->createTriOp(\n                        spv::OpSelect, type_float4_,\n                        builder_->createBinOp(spv::OpFOrdLessThan, type_bool4_,\n                                              fixed16_signed[eM_index],\n                                              const_float4_0_),\n                        const_float_vectors_minus_0_5[3],\n                        const_float_vectors_0_5[3]))));\n      });\n    }\n    if_signed.makeBeginElse();\n    EMIdArray fixed16_unsigned;\n    {\n      // Unsigned.\n      SpirvBuilder::IfBuilder if_norm(\n          is_norm, spv::SelectionControlDontFlattenMask, *builder_);\n      EMIdArray fixed16_norm;\n      {\n        // Unsigned normalized.\n        id_vector_temp_.clear();\n        id_vector_temp_.resize(\n            4, builder_->makeFloatConstant(float((uint32_t(1) << 16) - 1)));\n        spv::Id const_unorm16_max_value =\n            builder_->makeCompositeConstant(type_float4_, id_vector_temp_);\n        for_each_eM([&](uint32_t eM_index) {\n          fixed16_norm[eM_index] = builder_->createNoContractionBinOp(\n              spv::OpFMul, type_float4_,\n              builder_->createTriBuiltinCall(\n                  type_float4_, ext_inst_glsl_std_450_, GLSLstd450FClamp,\n                  fixed16_flushed[eM_index], const_float4_0_, const_float4_1_),\n              const_unorm16_max_value);\n        });\n      }\n      if_norm.makeEndIf();\n      // All phi instructions must be in the beginning of the block.\n      for_each_eM([&](uint32_t eM_index) {\n        fixed16_unsigned[eM_index] = if_norm.createMergePhi(\n            fixed16_norm[eM_index], fixed16_flushed[eM_index]);\n      });\n      // Convert to unsigned integer, adding 0.5 before truncating according to\n      // the Direct3D format conversion rules.\n      for_each_eM([&](uint32_t eM_index) {\n        fixed16_unsigned[eM_index] = builder_->createUnaryOp(\n            spv::OpConvertFToU, type_uint4_,\n            builder_->createNoContractionBinOp(spv::OpFAdd, type_float4_,\n                                               fixed16_unsigned[eM_index],\n                                               const_float_vectors_0_5[3]));\n      });\n    }\n    if_signed.makeEndIf();\n    EMIdArray fixed16_unpacked;\n    for_each_eM([&](uint32_t eM_index) {\n      fixed16_unpacked[eM_index] = if_signed.createMergePhi(\n          fixed16_signed[eM_index], fixed16_unsigned[eM_index]);\n    });\n\n    // Pack into two 32-bit values, and pad to a 4-component vector for the phi.\n    EMIdArray fixed16_packed;\n    spv::Id const_uint_16 = builder_->makeUintConstant(16);\n    for_each_eM([&](uint32_t eM_index) {\n      spv::Id fixed16_element_unpacked = fixed16_unpacked[eM_index];\n      id_vector_temp_.clear();\n      for (uint32_t component_index = 0; component_index < 2;\n           ++component_index) {\n        id_vector_temp_.push_back(builder_->createQuadOp(\n            spv::OpBitFieldInsert, type_uint_,\n            builder_->createCompositeExtract(fixed16_element_unpacked,\n                                             type_uint_, 2 * component_index),\n            builder_->createCompositeExtract(\n                fixed16_element_unpacked, type_uint_, 2 * component_index + 1),\n            const_uint_16, const_uint_16));\n      }\n      for (uint32_t component_index = 2; component_index < 4;\n           ++component_index) {\n        id_vector_temp_.push_back(const_uint_0_);\n      }\n      fixed16_packed[eM_index] =\n          builder_->createCompositeConstruct(type_uint4_, id_vector_temp_);\n    });\n\n    add_format_case(fixed16_packed, 3);\n  }\n\n  // TODO(Triang3l): Use the extended range float16 conversion.\n\n  // k_16_FLOAT\n  format_switch.makeBeginCase(\n      static_cast<unsigned int>(xenos::ColorFormat::k_16_FLOAT));\n  {\n    EMIdArray format_packed_16_float;\n    for_each_eM([&](uint32_t eM_index) {\n      id_vector_temp_.clear();\n      id_vector_temp_.push_back(builder_->createCompositeExtract(\n          eM_swapped[eM_index], type_float_, 0));\n      id_vector_temp_.push_back(const_float_0_);\n      spv::Id format_packed_16_float_x = builder_->createUnaryBuiltinCall(\n          type_uint_, ext_inst_glsl_std_450_, GLSLstd450PackHalf2x16,\n          builder_->createCompositeConstruct(type_float2_, id_vector_temp_));\n      id_vector_temp_.clear();\n      id_vector_temp_.resize(4, const_uint_0_);\n      id_vector_temp_.front() = format_packed_16_float_x;\n      format_packed_16_float[eM_index] =\n          builder_->createCompositeConstruct(type_uint4_, id_vector_temp_);\n    });\n    add_format_case(format_packed_16_float, 1);\n  }\n\n  // k_16_16_FLOAT\n  format_switch.makeBeginCase(\n      static_cast<unsigned int>(xenos::ColorFormat::k_16_16_FLOAT));\n  {\n    EMIdArray format_packed_16_16_float;\n    for_each_eM([&](uint32_t eM_index) {\n      uint_vector_temp_.clear();\n      uint_vector_temp_.push_back(0);\n      uint_vector_temp_.push_back(1);\n      spv::Id format_packed_16_16_float_xy = builder_->createUnaryBuiltinCall(\n          type_uint_, ext_inst_glsl_std_450_, GLSLstd450PackHalf2x16,\n          builder_->createRvalueSwizzle(spv::NoPrecision, type_float2_,\n                                        eM_swapped[eM_index],\n                                        uint_vector_temp_));\n      id_vector_temp_.clear();\n      id_vector_temp_.resize(4, const_uint_0_);\n      id_vector_temp_.front() = format_packed_16_16_float_xy;\n      format_packed_16_16_float[eM_index] =\n          builder_->createCompositeConstruct(type_uint4_, id_vector_temp_);\n    });\n    add_format_case(format_packed_16_16_float, 2);\n  }\n\n  // k_16_16_16_16_FLOAT\n  format_switch.makeBeginCase(\n      static_cast<unsigned int>(xenos::ColorFormat::k_16_16_16_16_FLOAT));\n  {\n    EMIdArray format_packed_16_16_16_16_float;\n    for_each_eM([&](uint32_t eM_index) {\n      spv::Id format_packed_16_16_16_16_float_xy_zw[2];\n      for (uint32_t component_index = 0; component_index < 2;\n           ++component_index) {\n        uint_vector_temp_.clear();\n        uint_vector_temp_.push_back(2 * component_index);\n        uint_vector_temp_.push_back(2 * component_index + 1);\n        format_packed_16_16_16_16_float_xy_zw[component_index] =\n            builder_->createUnaryBuiltinCall(\n                type_uint_, ext_inst_glsl_std_450_, GLSLstd450PackHalf2x16,\n                builder_->createRvalueSwizzle(spv::NoPrecision, type_float2_,\n                                              eM_swapped[eM_index],\n                                              uint_vector_temp_));\n      }\n      id_vector_temp_.clear();\n      id_vector_temp_.push_back(format_packed_16_16_16_16_float_xy_zw[0]);\n      id_vector_temp_.push_back(format_packed_16_16_16_16_float_xy_zw[1]);\n      id_vector_temp_.push_back(const_uint_0_);\n      id_vector_temp_.push_back(const_uint_0_);\n      format_packed_16_16_16_16_float[eM_index] =\n          builder_->createCompositeConstruct(type_uint4_, id_vector_temp_);\n    });\n    add_format_case(format_packed_16_16_16_16_float, 3);\n  }\n\n  // k_32_FLOAT\n  format_switch.makeBeginCase(\n      static_cast<unsigned int>(xenos::ColorFormat::k_32_FLOAT));\n  {\n    EMIdArray format_packed_32_float;\n    for_each_eM([&](uint32_t eM_index) {\n      format_packed_32_float[eM_index] = builder_->createUnaryOp(\n          spv::OpBitcast, type_uint4_, eM_swapped[eM_index]);\n    });\n    add_format_case(format_packed_32_float, 2);\n  }\n\n  // k_32_32_FLOAT\n  format_switch.makeBeginCase(\n      static_cast<unsigned int>(xenos::ColorFormat::k_32_32_FLOAT));\n  {\n    EMIdArray format_packed_32_32_float;\n    for_each_eM([&](uint32_t eM_index) {\n      format_packed_32_32_float[eM_index] = builder_->createUnaryOp(\n          spv::OpBitcast, type_uint4_, eM_swapped[eM_index]);\n    });\n    add_format_case(format_packed_32_32_float, 3);\n  }\n\n  // k_32_32_32_32_FLOAT\n  format_switch.makeBeginCase(\n      static_cast<unsigned int>(xenos::ColorFormat::k_32_32_32_32_FLOAT));\n  {\n    EMIdArray format_packed_32_32_32_32_float;\n    for_each_eM([&](uint32_t eM_index) {\n      format_packed_32_32_32_32_float[eM_index] = builder_->createUnaryOp(\n          spv::OpBitcast, type_uint4_, eM_swapped[eM_index]);\n    });\n    add_format_case(format_packed_32_32_32_32_float, 4);\n  }\n\n  format_switch.makeEndSwitch();\n\n  // Select the result and the element size based on the format.\n  // Phi must be the first instructions in a block.\n  EMIdArray eM_packed;\n  for_each_eM([&](uint32_t eM_index) {\n    auto eM_packed_phi = std::make_unique<spv::Instruction>(\n        builder_->getUniqueId(), type_uint4_, spv::OpPhi);\n    // Default case for an invalid format.\n    eM_packed_phi->addIdOperand(const_uint4_0_);\n    eM_packed_phi->addIdOperand(format_switch.getDefaultPhiParent());\n    for (const FormatCase& format_case : format_cases) {\n      eM_packed_phi->addIdOperand(format_case.eM_packed[eM_index]);\n      eM_packed_phi->addIdOperand(format_case.phi_parent);\n    }\n    eM_packed[eM_index] = eM_packed_phi->getResultId();\n    builder_->getBuildPoint()->addInstruction(std::move(eM_packed_phi));\n  });\n  spv::Id element_bytes_log2;\n  {\n    auto element_bytes_log2_phi = std::make_unique<spv::Instruction>(\n        builder_->getUniqueId(), type_uint_, spv::OpPhi);\n    // Default case for an invalid format (doesn't enter any element size\n    // conditional, skipped).\n    element_bytes_log2_phi->addIdOperand(builder_->makeUintConstant(5));\n    element_bytes_log2_phi->addIdOperand(format_switch.getDefaultPhiParent());\n    for (const FormatCase& format_case : format_cases) {\n      element_bytes_log2_phi->addIdOperand(\n          builder_->makeUintConstant(format_case.element_bytes_log2));\n      element_bytes_log2_phi->addIdOperand(format_case.phi_parent);\n    }\n    element_bytes_log2 = element_bytes_log2_phi->getResultId();\n    builder_->getBuildPoint()->addInstruction(\n        std::move(element_bytes_log2_phi));\n  }\n\n  // Endian-swap.\n  spv::Id endian =\n      builder_->createTriOp(spv::OpBitFieldUExtract, type_uint_, format_info,\n                            const_uint_0_, builder_->makeUintConstant(3));\n  for_each_eM([&](uint32_t eM_index) {\n    eM_packed[eM_index] = EndianSwap128Uint4(eM_packed[eM_index], endian);\n  });\n\n  // Load the index of eM0 in the stream.\n  spv::Id eM0_index = builder_->createTriOp(\n      spv::OpBitFieldUExtract, type_uint_,\n      builder_->createCompositeExtract(eA_vector, type_uint_, 1), const_uint_0_,\n      builder_->makeUintConstant(23));\n\n  // Check how many elements starting from eM0 are within the bounds of the\n  // stream, and from the eM# that were written, exclude the out-of-bounds ones.\n  // The index can't be negative, and the index and the count are limited to 23\n  // bits, so it's safe to use 32-bit signed subtraction and clamping to get the\n  // remaining eM# count.\n  spv::Id eM_indices_to_store = builder_->createTriOp(\n      spv::OpBitFieldUExtract, type_uint_,\n      builder_->createLoad(var_main_memexport_data_written_, spv::NoPrecision),\n      const_uint_0_,\n      builder_->createUnaryOp(\n          spv::OpBitcast, type_uint_,\n          builder_->createTriBuiltinCall(\n              type_int_, ext_inst_glsl_std_450_, GLSLstd450SClamp,\n              builder_->createBinOp(\n                  spv::OpISub, type_int_,\n                  builder_->createUnaryOp(\n                      spv::OpBitcast, type_int_,\n                      builder_->createTriOp(spv::OpBitFieldUExtract, type_uint_,\n                                            builder_->createCompositeExtract(\n                                                eA_vector, type_uint_, 3),\n                                            const_uint_0_,\n                                            builder_->makeUintConstant(23))),\n                  builder_->createUnaryOp(spv::OpBitcast, type_int_,\n                                          eM0_index)),\n              const_int_0_,\n              builder_->makeIntConstant(ucode::kMaxMemExportElementCount))));\n\n  // Get the eM0 address in bytes.\n  // Left-shift the stream base address by 2 to both convert it from dwords to\n  // bytes and drop the upper bits.\n  spv::Id const_uint_2 = builder_->makeUintConstant(2);\n  spv::Id eM0_address_bytes = builder_->createBinOp(\n      spv::OpIAdd, type_uint_,\n      builder_->createBinOp(\n          spv::OpShiftLeftLogical, type_uint_,\n          builder_->createCompositeExtract(eA_vector, type_uint_, 0),\n          const_uint_2),\n      builder_->createBinOp(spv::OpShiftLeftLogical, type_uint_, eM0_index,\n                            element_bytes_log2));\n\n  // Store based on the element size.\n  auto store_needed_eM = [&](std::function<void(uint32_t eM_index)> fn) {\n    for_each_eM([&](uint32_t eM_index) {\n      SpirvBuilder::IfBuilder if_eM_needed(\n          builder_->createBinOp(\n              spv::OpINotEqual, type_bool_,\n              builder_->createBinOp(spv::OpBitwiseAnd, type_uint_,\n                                    eM_indices_to_store,\n                                    builder_->makeUintConstant(1u << eM_index)),\n              const_uint_0_),\n          spv::SelectionControlDontFlattenMask, *builder_, 2, 1);\n      fn(eM_index);\n      if_eM_needed.makeEndIf();\n    });\n  };\n  SpirvBuilder::SwitchBuilder element_size_switch(\n      element_bytes_log2, spv::SelectionControlDontFlattenMask, *builder_);\n  element_size_switch.makeBeginCase(0);\n  {\n    store_needed_eM([&](uint32_t eM_index) {\n      spv::Id element_address_bytes =\n          eM_index != 0 ? builder_->createBinOp(\n                              spv::OpIAdd, type_uint_, eM0_address_bytes,\n                              builder_->makeUintConstant(eM_index))\n                        : eM0_address_bytes;\n      // replace_shift = 8 * (element_address_bytes & 3)\n      spv::Id replace_shift = builder_->createQuadOp(\n          spv::OpBitFieldInsert, type_uint_, const_uint_0_,\n          element_address_bytes, builder_->makeUintConstant(3), const_uint_2);\n      StoreUint32ToSharedMemory(\n          builder_->createBinOp(spv::OpShiftLeftLogical, type_uint_,\n                                builder_->createCompositeExtract(\n                                    eM_packed[eM_index], type_uint_, 0),\n                                replace_shift),\n          builder_->createUnaryOp(\n              spv::OpBitcast, type_int_,\n              builder_->createBinOp(spv::OpShiftRightLogical, type_uint_,\n                                    element_address_bytes, const_uint_2)),\n          builder_->createBinOp(spv::OpShiftLeftLogical, type_uint_,\n                                builder_->makeUintConstant(0xFFu),\n                                replace_shift));\n    });\n  }\n  element_size_switch.makeBeginCase(1);\n  {\n    spv::Id const_uint_1 = builder_->makeUintConstant(1);\n    spv::Id eM0_address_words = builder_->createBinOp(\n        spv::OpShiftRightLogical, type_uint_, eM0_address_bytes, const_uint_1);\n    store_needed_eM([&](uint32_t eM_index) {\n      spv::Id element_address_words =\n          eM_index != 0 ? builder_->createBinOp(\n                              spv::OpIAdd, type_uint_, eM0_address_words,\n                              builder_->makeUintConstant(eM_index))\n                        : eM0_address_words;\n      // replace_shift = 16 * (element_address_words & 1)\n      spv::Id replace_shift = builder_->createQuadOp(\n          spv::OpBitFieldInsert, type_uint_, const_uint_0_,\n          element_address_words, builder_->makeUintConstant(4), const_uint_1);\n      StoreUint32ToSharedMemory(\n          builder_->createBinOp(spv::OpShiftLeftLogical, type_uint_,\n                                builder_->createCompositeExtract(\n                                    eM_packed[eM_index], type_uint_, 0),\n                                replace_shift),\n          builder_->createUnaryOp(\n              spv::OpBitcast, type_int_,\n              builder_->createBinOp(spv::OpShiftRightLogical, type_uint_,\n                                    element_address_words, const_uint_1)),\n          builder_->createBinOp(spv::OpShiftLeftLogical, type_uint_,\n                                builder_->makeUintConstant(0xFFFFu),\n                                replace_shift));\n    });\n  }\n  element_size_switch.makeBeginCase(2);\n  {\n    spv::Id eM0_address_dwords = builder_->createBinOp(\n        spv::OpShiftRightLogical, type_uint_, eM0_address_bytes, const_uint_2);\n    store_needed_eM([&](uint32_t eM_index) {\n      StoreUint32ToSharedMemory(\n          builder_->createCompositeExtract(eM_packed[eM_index], type_uint_, 0),\n          builder_->createUnaryOp(\n              spv::OpBitcast, type_int_,\n              eM_index != 0 ? builder_->createBinOp(\n                                  spv::OpIAdd, type_uint_, eM0_address_dwords,\n                                  builder_->makeUintConstant(eM_index))\n                            : eM0_address_dwords));\n    });\n  }\n  element_size_switch.makeBeginCase(3);\n  {\n    spv::Id eM0_address_dwords = builder_->createBinOp(\n        spv::OpShiftRightLogical, type_uint_, eM0_address_bytes, const_uint_2);\n    store_needed_eM([&](uint32_t eM_index) {\n      spv::Id element_value = eM_packed[eM_index];\n      spv::Id element_address_dwords_int = builder_->createUnaryOp(\n          spv::OpBitcast, type_int_,\n          eM_index != 0 ? builder_->createBinOp(\n                              spv::OpIAdd, type_uint_, eM0_address_dwords,\n                              builder_->makeUintConstant(2 * eM_index))\n                        : eM0_address_dwords);\n      StoreUint32ToSharedMemory(\n          builder_->createCompositeExtract(element_value, type_uint_, 0),\n          element_address_dwords_int);\n      StoreUint32ToSharedMemory(\n          builder_->createCompositeExtract(element_value, type_uint_, 1),\n          builder_->createBinOp(spv::OpIAdd, type_int_,\n                                element_address_dwords_int,\n                                builder_->makeIntConstant(1)));\n    });\n  }\n  element_size_switch.makeBeginCase(4);\n  {\n    spv::Id eM0_address_dwords = builder_->createBinOp(\n        spv::OpShiftRightLogical, type_uint_, eM0_address_bytes, const_uint_2);\n    store_needed_eM([&](uint32_t eM_index) {\n      spv::Id element_value = eM_packed[eM_index];\n      spv::Id element_address_dwords_int = builder_->createUnaryOp(\n          spv::OpBitcast, type_int_,\n          eM_index != 0 ? builder_->createBinOp(\n                              spv::OpIAdd, type_uint_, eM0_address_dwords,\n                              builder_->makeUintConstant(4 * eM_index))\n                        : eM0_address_dwords);\n      StoreUint32ToSharedMemory(\n          builder_->createCompositeExtract(element_value, type_uint_, 0),\n          element_address_dwords_int);\n      for (uint32_t element_dword_index = 1; element_dword_index < 4;\n           ++element_dword_index) {\n        StoreUint32ToSharedMemory(\n            builder_->createCompositeExtract(element_value, type_uint_,\n                                             element_dword_index),\n            builder_->createBinOp(spv::OpIAdd, type_int_,\n                                  element_address_dwords_int,\n                                  builder_->makeIntConstant(\n                                      static_cast<int>(element_dword_index))));\n      }\n    });\n  }\n  element_size_switch.makeEndSwitch();\n\n  // Close the conditionals for whether memory export is allowed in this\n  // invocation.\n  if_address_valid.makeEndIf();\n  if (if_pixel_not_killed.has_value()) {\n    if_pixel_not_killed->makeEndIf();\n  }\n  if (if_memexport_allowed.has_value()) {\n    if_memexport_allowed->makeEndIf();\n  }\n}\n\n}  // namespace gpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/spirv_shader_translator_rb.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/spirv_shader_translator.h\"\n\n#include <cstdint>\n#include <memory>\n#include <utility>\n\n#include \"third_party/glslang/SPIRV/GLSL.std.450.h\"\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/gpu/draw_util.h\"\n#include \"xenia/gpu/render_target_cache.h\"\n\nnamespace xe {\nnamespace gpu {\n\nspv::Id SpirvShaderTranslator::PreClampedFloat32To7e3(\n    SpirvBuilder& builder, spv::Id f32_scalar, spv::Id ext_inst_glsl_std_450) {\n  // https://github.com/Microsoft/DirectXTex/blob/master/DirectXTex/DirectXTexConvert.cpp\n  // Assuming the value is already clamped to [0, 31.875].\n\n  spv::Id type_uint = builder.makeUintType(32);\n\n  // Need the source as uint for bit operations.\n  {\n    spv::Id source_type = builder.getTypeId(f32_scalar);\n    assert_true(builder.isScalarType(source_type));\n    if (!builder.isUintType(source_type)) {\n      f32_scalar = builder.createUnaryOp(spv::OpBitcast, type_uint, f32_scalar);\n    }\n  }\n\n  // The denormal 7e3 case.\n  // denormal_biased_f32 = (f32 & 0x7FFFFF) | 0x800000\n  spv::Id denormal_biased_f32;\n  {\n    spv::Instruction* denormal_insert_instruction = new spv::Instruction(\n        builder.getUniqueId(), type_uint, spv::OpBitFieldInsert);\n    denormal_insert_instruction->addIdOperand(f32_scalar);\n    denormal_insert_instruction->addIdOperand(builder.makeUintConstant(1));\n    denormal_insert_instruction->addIdOperand(builder.makeUintConstant(23));\n    denormal_insert_instruction->addIdOperand(builder.makeUintConstant(9));\n    builder.getBuildPoint()->addInstruction(\n        std::unique_ptr<spv::Instruction>(denormal_insert_instruction));\n    denormal_biased_f32 = denormal_insert_instruction->getResultId();\n  }\n  // denormal_biased_f32_shift_amount = min(125 - (f32 >> 23), 24)\n  // Not allowing the shift to overflow as that's undefined in SPIR-V.\n  spv::Id denormal_biased_f32_shift_amount;\n  {\n    spv::Instruction* denormal_shift_amount_instruction =\n        new spv::Instruction(builder.getUniqueId(), type_uint, spv::OpExtInst);\n    denormal_shift_amount_instruction->addIdOperand(ext_inst_glsl_std_450);\n    denormal_shift_amount_instruction->addImmediateOperand(GLSLstd450UMin);\n    denormal_shift_amount_instruction->addIdOperand(builder.createBinOp(\n        spv::OpISub, type_uint, builder.makeUintConstant(125),\n        builder.createBinOp(spv::OpShiftRightLogical, type_uint, f32_scalar,\n                            builder.makeUintConstant(23))));\n    denormal_shift_amount_instruction->addIdOperand(\n        builder.makeUintConstant(24));\n    builder.getBuildPoint()->addInstruction(\n        std::unique_ptr<spv::Instruction>(denormal_shift_amount_instruction));\n    denormal_biased_f32_shift_amount =\n        denormal_shift_amount_instruction->getResultId();\n  }\n  // denormal_biased_f32 =\n  //     ((f32 & 0x7FFFFF) | 0x800000) >> min(125 - (f32 >> 23), 24)\n  denormal_biased_f32 = builder.createBinOp(spv::OpShiftRightLogical, type_uint,\n                                            denormal_biased_f32,\n                                            denormal_biased_f32_shift_amount);\n\n  // The normal 7e3 case.\n  // Bias the exponent.\n  // normal_biased_f32 = f32 - (124 << 23)\n  spv::Id normal_biased_f32 =\n      builder.createBinOp(spv::OpISub, type_uint, f32_scalar,\n                          builder.makeUintConstant(UINT32_C(124) << 23));\n\n  // Select the needed conversion depending on whether the number is too small\n  // to be represented as normalized 7e3.\n  spv::Id biased_f32 = builder.createTriOp(\n      spv::OpSelect, type_uint,\n      builder.createBinOp(spv::OpULessThan, builder.makeBoolType(), f32_scalar,\n                          builder.makeUintConstant(0x3E800000)),\n      denormal_biased_f32, normal_biased_f32);\n\n  // Build the 7e3 number rounding to the nearest even.\n  // ((biased_f32 + 0x7FFF + ((biased_f32 >> 16) & 1)) >> 16) & 0x3FF\n  return builder.createTriOp(\n      spv::OpBitFieldUExtract, type_uint,\n      builder.createBinOp(\n          spv::OpIAdd, type_uint,\n          builder.createBinOp(spv::OpIAdd, type_uint, biased_f32,\n                              builder.makeUintConstant(0x7FFF)),\n          builder.createTriOp(spv::OpBitFieldUExtract, type_uint, biased_f32,\n                              builder.makeUintConstant(16),\n                              builder.makeUintConstant(1))),\n      builder.makeUintConstant(16), builder.makeUintConstant(10));\n}\n\nspv::Id SpirvShaderTranslator::UnclampedFloat32To7e3(\n    SpirvBuilder& builder, spv::Id f32_scalar, spv::Id ext_inst_glsl_std_450) {\n  spv::Id type_float = builder.makeFloatType(32);\n\n  // Need the source as float for clamping.\n  {\n    spv::Id source_type = builder.getTypeId(f32_scalar);\n    assert_true(builder.isScalarType(source_type));\n    if (!builder.isFloatType(source_type)) {\n      f32_scalar =\n          builder.createUnaryOp(spv::OpBitcast, type_float, f32_scalar);\n    }\n  }\n\n  {\n    spv::Instruction* clamp_instruction =\n        new spv::Instruction(builder.getUniqueId(), type_float, spv::OpExtInst);\n    clamp_instruction->addIdOperand(ext_inst_glsl_std_450);\n    clamp_instruction->addImmediateOperand(GLSLstd450NClamp);\n    clamp_instruction->addIdOperand(f32_scalar);\n    clamp_instruction->addIdOperand(builder.makeFloatConstant(0.0f));\n    clamp_instruction->addIdOperand(builder.makeFloatConstant(31.875f));\n    builder.getBuildPoint()->addInstruction(\n        std::unique_ptr<spv::Instruction>(clamp_instruction));\n    f32_scalar = clamp_instruction->getResultId();\n  }\n\n  return PreClampedFloat32To7e3(builder, f32_scalar, ext_inst_glsl_std_450);\n}\n\nspv::Id SpirvShaderTranslator::Float7e3To32(SpirvBuilder& builder,\n                                            spv::Id f10_uint_scalar,\n                                            uint32_t f10_shift,\n                                            bool result_as_uint,\n                                            spv::Id ext_inst_glsl_std_450) {\n  // https://github.com/Microsoft/DirectXTex/blob/master/DirectXTex/DirectXTexConvert.cpp\n\n  assert_true(builder.isUintType(builder.getTypeId(f10_uint_scalar)));\n  assert_true(f10_shift <= (32 - 10));\n\n  spv::Id type_bool = builder.makeBoolType();\n  spv::Id type_int = builder.makeIntType(32);\n  spv::Id type_uint = builder.makeUintType(32);\n\n  spv::Id f10_unbiased_exponent = builder.createTriOp(\n      spv::OpBitFieldUExtract, type_uint, f10_uint_scalar,\n      builder.makeUintConstant(f10_shift + 7), builder.makeUintConstant(3));\n  spv::Id f10_mantissa = builder.createTriOp(\n      spv::OpBitFieldUExtract, type_uint, f10_uint_scalar,\n      builder.makeUintConstant(f10_shift), builder.makeUintConstant(7));\n\n  // The denormal nonzero 7e3 case.\n  // denormal_mantissa_msb = findMSB(f10_mantissa)\n  spv::Id denormal_mantissa_msb;\n  {\n    spv::Instruction* denormal_mantissa_msb_instruction =\n        new spv::Instruction(builder.getUniqueId(), type_int, spv::OpExtInst);\n    denormal_mantissa_msb_instruction->addIdOperand(ext_inst_glsl_std_450);\n    denormal_mantissa_msb_instruction->addImmediateOperand(GLSLstd450FindUMsb);\n    denormal_mantissa_msb_instruction->addIdOperand(f10_mantissa);\n    builder.getBuildPoint()->addInstruction(\n        std::unique_ptr<spv::Instruction>(denormal_mantissa_msb_instruction));\n    denormal_mantissa_msb = denormal_mantissa_msb_instruction->getResultId();\n  }\n  denormal_mantissa_msb =\n      builder.createUnaryOp(spv::OpBitcast, type_uint, denormal_mantissa_msb);\n  // denormal_f32_unbiased_exponent = 1 - (7 - findMSB(f10_mantissa))\n  // Or:\n  // denormal_f32_unbiased_exponent = findMSB(f10_mantissa) - 6\n  spv::Id denormal_f32_unbiased_exponent =\n      builder.createBinOp(spv::OpISub, type_uint, denormal_mantissa_msb,\n                          builder.makeUintConstant(6));\n  // Normalize the mantissa.\n  // denormal_f32_mantissa = f10_mantissa << (7 - findMSB(f10_mantissa))\n  spv::Id denormal_f32_mantissa = builder.createBinOp(\n      spv::OpShiftLeftLogical, type_uint, f10_mantissa,\n      builder.createBinOp(spv::OpISub, type_uint, builder.makeUintConstant(7),\n                          denormal_mantissa_msb));\n  // If the 7e3 number is zero, make sure the float32 number is zero too.\n  spv::Id f10_mantissa_is_nonzero = builder.createBinOp(\n      spv::OpINotEqual, type_bool, f10_mantissa, builder.makeUintConstant(0));\n  // Set the unbiased exponent to -124 for zero - 124 will be added later,\n  // resulting in zero float32.\n  denormal_f32_unbiased_exponent = builder.createTriOp(\n      spv::OpSelect, type_uint, f10_mantissa_is_nonzero,\n      denormal_f32_unbiased_exponent, builder.makeUintConstant(uint32_t(-124)));\n  denormal_f32_mantissa =\n      builder.createTriOp(spv::OpSelect, type_uint, f10_mantissa_is_nonzero,\n                          denormal_f32_mantissa, builder.makeUintConstant(0));\n\n  // Select the needed conversion depending on whether the number is normal.\n  spv::Id f10_is_normal =\n      builder.createBinOp(spv::OpINotEqual, type_bool, f10_unbiased_exponent,\n                          builder.makeUintConstant(0));\n  spv::Id f32_unbiased_exponent = builder.createTriOp(\n      spv::OpSelect, type_uint, f10_is_normal, f10_unbiased_exponent,\n      denormal_f32_unbiased_exponent);\n  spv::Id f32_mantissa =\n      builder.createTriOp(spv::OpSelect, type_uint, f10_is_normal, f10_mantissa,\n                          denormal_f32_mantissa);\n\n  // Bias the exponent and construct the build the float32 number.\n  spv::Id f32_shifted;\n  {\n    spv::Instruction* f32_insert_instruction = new spv::Instruction(\n        builder.getUniqueId(), type_uint, spv::OpBitFieldInsert);\n    f32_insert_instruction->addIdOperand(f32_mantissa);\n    f32_insert_instruction->addIdOperand(\n        builder.createBinOp(spv::OpIAdd, type_uint, f32_unbiased_exponent,\n                            builder.makeUintConstant(124)));\n    f32_insert_instruction->addIdOperand(builder.makeUintConstant(7));\n    f32_insert_instruction->addIdOperand(builder.makeUintConstant(8));\n    builder.getBuildPoint()->addInstruction(\n        std::unique_ptr<spv::Instruction>(f32_insert_instruction));\n    f32_shifted = f32_insert_instruction->getResultId();\n  }\n  spv::Id f32 =\n      builder.createBinOp(spv::OpShiftLeftLogical, type_uint, f32_shifted,\n                          builder.makeUintConstant(23 - 7));\n\n  if (!result_as_uint) {\n    f32 = builder.createUnaryOp(spv::OpBitcast, builder.makeFloatType(32), f32);\n  }\n\n  return f32;\n}\n\nspv::Id SpirvShaderTranslator::PreClampedDepthTo20e4(\n    SpirvBuilder& builder, spv::Id f32_scalar, bool round_to_nearest_even,\n    bool remap_from_0_to_0_5, spv::Id ext_inst_glsl_std_450) {\n  // CFloat24 from d3dref9.dll +\n  // https://github.com/Microsoft/DirectXTex/blob/master/DirectXTex/DirectXTexConvert.cpp\n  // Assuming the value is already clamped to [0, 2) (in all places, the depth\n  // is written with saturation).\n\n  uint32_t remap_bias = uint32_t(remap_from_0_to_0_5);\n\n  spv::Id type_uint = builder.makeUintType(32);\n\n  // Need the source as uint for bit operations.\n  {\n    spv::Id source_type = builder.getTypeId(f32_scalar);\n    assert_true(builder.isScalarType(source_type));\n    if (!builder.isUintType(source_type)) {\n      f32_scalar = builder.createUnaryOp(spv::OpBitcast, type_uint, f32_scalar);\n    }\n  }\n\n  // The denormal 20e4 case.\n  // denormal_biased_f32 = (f32 & 0x7FFFFF) | 0x800000\n  spv::Id denormal_biased_f32;\n  {\n    spv::Instruction* denormal_insert_instruction = new spv::Instruction(\n        builder.getUniqueId(), type_uint, spv::OpBitFieldInsert);\n    denormal_insert_instruction->addIdOperand(f32_scalar);\n    denormal_insert_instruction->addIdOperand(builder.makeUintConstant(1));\n    denormal_insert_instruction->addIdOperand(builder.makeUintConstant(23));\n    denormal_insert_instruction->addIdOperand(builder.makeUintConstant(9));\n    builder.getBuildPoint()->addInstruction(\n        std::unique_ptr<spv::Instruction>(denormal_insert_instruction));\n    denormal_biased_f32 = denormal_insert_instruction->getResultId();\n  }\n  // denormal_biased_f32_shift_amount = min(113 - (f32 >> 23), 24)\n  // Not allowing the shift to overflow as that's undefined in SPIR-V.\n  spv::Id denormal_biased_f32_shift_amount;\n  {\n    spv::Instruction* denormal_shift_amount_instruction =\n        new spv::Instruction(builder.getUniqueId(), type_uint, spv::OpExtInst);\n    denormal_shift_amount_instruction->addIdOperand(ext_inst_glsl_std_450);\n    denormal_shift_amount_instruction->addImmediateOperand(GLSLstd450UMin);\n    denormal_shift_amount_instruction->addIdOperand(builder.createBinOp(\n        spv::OpISub, type_uint, builder.makeUintConstant(113 - remap_bias),\n        builder.createBinOp(spv::OpShiftRightLogical, type_uint, f32_scalar,\n                            builder.makeUintConstant(23))));\n    denormal_shift_amount_instruction->addIdOperand(\n        builder.makeUintConstant(24));\n    builder.getBuildPoint()->addInstruction(\n        std::unique_ptr<spv::Instruction>(denormal_shift_amount_instruction));\n    denormal_biased_f32_shift_amount =\n        denormal_shift_amount_instruction->getResultId();\n  }\n  // denormal_biased_f32 =\n  //     ((f32 & 0x7FFFFF) | 0x800000) >> min(113 - (f32 >> 23), 24)\n  denormal_biased_f32 = builder.createBinOp(spv::OpShiftRightLogical, type_uint,\n                                            denormal_biased_f32,\n                                            denormal_biased_f32_shift_amount);\n\n  // The normal 20e4 case.\n  // Bias the exponent.\n  // normal_biased_f32 = f32 - (112 << 23)\n  spv::Id normal_biased_f32 = builder.createBinOp(\n      spv::OpISub, type_uint, f32_scalar,\n      builder.makeUintConstant((UINT32_C(112) - remap_bias) << 23));\n\n  // Select the needed conversion depending on whether the number is too small\n  // to be represented as normalized 20e4.\n  spv::Id biased_f32 = builder.createTriOp(\n      spv::OpSelect, type_uint,\n      builder.createBinOp(\n          spv::OpULessThan, builder.makeBoolType(), f32_scalar,\n          builder.makeUintConstant(0x38800000 - (remap_bias << 23))),\n      denormal_biased_f32, normal_biased_f32);\n\n  // Build the 20e4 number rounding to the nearest even or towards zero.\n  if (round_to_nearest_even) {\n    // biased_f32 += 3 + ((biased_f32 >> 3) & 1)\n    biased_f32 = builder.createBinOp(\n        spv::OpIAdd, type_uint,\n        builder.createBinOp(spv::OpIAdd, type_uint, biased_f32,\n                            builder.makeUintConstant(3)),\n        builder.createTriOp(spv::OpBitFieldUExtract, type_uint, biased_f32,\n                            builder.makeUintConstant(3),\n                            builder.makeUintConstant(1)));\n  }\n  return builder.createTriOp(spv::OpBitFieldUExtract, type_uint, biased_f32,\n                             builder.makeUintConstant(3),\n                             builder.makeUintConstant(24));\n}\n\nspv::Id SpirvShaderTranslator::Depth20e4To32(SpirvBuilder& builder,\n                                             spv::Id f24_uint_scalar,\n                                             uint32_t f24_shift,\n                                             bool remap_to_0_to_0_5,\n                                             bool result_as_uint,\n                                             spv::Id ext_inst_glsl_std_450) {\n  // CFloat24 from d3dref9.dll +\n  // https://github.com/Microsoft/DirectXTex/blob/master/DirectXTex/DirectXTexConvert.cpp\n\n  assert_true(builder.isUintType(builder.getTypeId(f24_uint_scalar)));\n  assert_true(f24_shift <= (32 - 24));\n\n  uint32_t remap_bias = uint32_t(remap_to_0_to_0_5);\n\n  spv::Id type_bool = builder.makeBoolType();\n  spv::Id type_int = builder.makeIntType(32);\n  spv::Id type_uint = builder.makeUintType(32);\n\n  spv::Id f24_unbiased_exponent = builder.createTriOp(\n      spv::OpBitFieldUExtract, type_uint, f24_uint_scalar,\n      builder.makeUintConstant(f24_shift + 20), builder.makeUintConstant(4));\n  spv::Id f24_mantissa = builder.createTriOp(\n      spv::OpBitFieldUExtract, type_uint, f24_uint_scalar,\n      builder.makeUintConstant(f24_shift), builder.makeUintConstant(20));\n\n  // The denormal nonzero 20e4 case.\n  // denormal_mantissa_msb = findMSB(f24_mantissa)\n  spv::Id denormal_mantissa_msb;\n  {\n    spv::Instruction* denormal_mantissa_msb_instruction =\n        new spv::Instruction(builder.getUniqueId(), type_int, spv::OpExtInst);\n    denormal_mantissa_msb_instruction->addIdOperand(ext_inst_glsl_std_450);\n    denormal_mantissa_msb_instruction->addImmediateOperand(GLSLstd450FindUMsb);\n    denormal_mantissa_msb_instruction->addIdOperand(f24_mantissa);\n    builder.getBuildPoint()->addInstruction(\n        std::unique_ptr<spv::Instruction>(denormal_mantissa_msb_instruction));\n    denormal_mantissa_msb = denormal_mantissa_msb_instruction->getResultId();\n  }\n  denormal_mantissa_msb =\n      builder.createUnaryOp(spv::OpBitcast, type_uint, denormal_mantissa_msb);\n  // denormal_f32_unbiased_exponent = 1 - (20 - findMSB(f24_mantissa))\n  // Or:\n  // denormal_f32_unbiased_exponent = findMSB(f24_mantissa) - 19\n  spv::Id denormal_f32_unbiased_exponent =\n      builder.createBinOp(spv::OpISub, type_uint, denormal_mantissa_msb,\n                          builder.makeUintConstant(19));\n  // Normalize the mantissa.\n  // denormal_f32_mantissa = f24_mantissa << (20 - findMSB(f24_mantissa))\n  spv::Id denormal_f32_mantissa = builder.createBinOp(\n      spv::OpShiftLeftLogical, type_uint, f24_mantissa,\n      builder.createBinOp(spv::OpISub, type_uint, builder.makeUintConstant(20),\n                          denormal_mantissa_msb));\n  // If the 20e4 number is zero, make sure the float32 number is zero too.\n  spv::Id f24_mantissa_is_nonzero = builder.createBinOp(\n      spv::OpINotEqual, type_bool, f24_mantissa, builder.makeUintConstant(0));\n  // Set the unbiased exponent to -112 for zero - 112 will be added later,\n  // resulting in zero float32.\n  denormal_f32_unbiased_exponent = builder.createTriOp(\n      spv::OpSelect, type_uint, f24_mantissa_is_nonzero,\n      denormal_f32_unbiased_exponent,\n      builder.makeUintConstant(uint32_t(-int32_t(112 - remap_bias))));\n  denormal_f32_mantissa =\n      builder.createTriOp(spv::OpSelect, type_uint, f24_mantissa_is_nonzero,\n                          denormal_f32_mantissa, builder.makeUintConstant(0));\n\n  // Select the needed conversion depending on whether the number is normal.\n  spv::Id f24_is_normal =\n      builder.createBinOp(spv::OpINotEqual, type_bool, f24_unbiased_exponent,\n                          builder.makeUintConstant(0));\n  spv::Id f32_unbiased_exponent = builder.createTriOp(\n      spv::OpSelect, type_uint, f24_is_normal, f24_unbiased_exponent,\n      denormal_f32_unbiased_exponent);\n  spv::Id f32_mantissa =\n      builder.createTriOp(spv::OpSelect, type_uint, f24_is_normal, f24_mantissa,\n                          denormal_f32_mantissa);\n\n  // Bias the exponent and construct the build the float32 number.\n  spv::Id f32_shifted;\n  {\n    spv::Instruction* f32_insert_instruction = new spv::Instruction(\n        builder.getUniqueId(), type_uint, spv::OpBitFieldInsert);\n    f32_insert_instruction->addIdOperand(f32_mantissa);\n    f32_insert_instruction->addIdOperand(\n        builder.createBinOp(spv::OpIAdd, type_uint, f32_unbiased_exponent,\n                            builder.makeUintConstant(112 - remap_bias)));\n    f32_insert_instruction->addIdOperand(builder.makeUintConstant(20));\n    f32_insert_instruction->addIdOperand(builder.makeUintConstant(8));\n    builder.getBuildPoint()->addInstruction(\n        std::unique_ptr<spv::Instruction>(f32_insert_instruction));\n    f32_shifted = f32_insert_instruction->getResultId();\n  }\n  spv::Id f32 =\n      builder.createBinOp(spv::OpShiftLeftLogical, type_uint, f32_shifted,\n                          builder.makeUintConstant(23 - 20));\n\n  if (!result_as_uint) {\n    f32 = builder.createUnaryOp(spv::OpBitcast, builder.makeFloatType(32), f32);\n  }\n\n  return f32;\n}\n\nvoid SpirvShaderTranslator::CompleteFragmentShaderInMain() {\n  // Loaded if needed.\n  spv::Id msaa_samples = spv::NoResult;\n\n  if (edram_fragment_shader_interlock_ && !FSI_IsDepthStencilEarly()) {\n    if (msaa_samples == spv::NoResult) {\n      msaa_samples = LoadMsaaSamplesFromFlags();\n    }\n    // Load the sample mask, which may be modified later by killing from\n    // different sources, if not loaded already.\n    FSI_LoadSampleMask(msaa_samples);\n  }\n\n  bool fsi_pixel_potentially_killed = false;\n\n  if (current_shader().kills_pixels()) {\n    if (edram_fragment_shader_interlock_) {\n      fsi_pixel_potentially_killed = true;\n      if (!features_.demote_to_helper_invocation) {\n        assert_true(var_main_kill_pixel_ != spv::NoResult);\n        main_fsi_sample_mask_ = builder_->createTriOp(\n            spv::OpSelect, type_uint_,\n            builder_->createLoad(var_main_kill_pixel_, spv::NoPrecision),\n            const_uint_0_, main_fsi_sample_mask_);\n      }\n    } else {\n      if (!features_.demote_to_helper_invocation) {\n        // Kill the pixel once the guest control flow and derivatives are not\n        // needed anymore.\n        assert_true(var_main_kill_pixel_ != spv::NoResult);\n        SpirvBuilder::IfBuilder kill_pixel_if(\n            builder_->createLoad(var_main_kill_pixel_, spv::NoPrecision),\n            spv::SelectionControlMaskNone, *builder_);\n        // TODO(Triang3l): Use OpTerminateInvocation when SPIR-V 1.6 is\n        // targeted.\n        builder_->createNoResultOp(spv::OpKill);\n        // OpKill terminates the block.\n        kill_pixel_if.makeEndIf(false);\n      }\n    }\n  }\n\n  uint32_t color_targets_written = current_shader().writes_color_targets();\n\n  if ((color_targets_written & 0b1) && !IsExecutionModeEarlyFragmentTests()) {\n    spv::Id fsi_sample_mask_in_rt_0_alpha_tests = spv::NoResult;\n    spv::Block* block_fsi_rt_0_alpha_tests_rt_written_head = nullptr;\n    spv::Block* block_fsi_rt_0_alpha_tests_rt_written_merge = nullptr;\n    builder_->makeNewBlock();\n    if (edram_fragment_shader_interlock_) {\n      // Skip the alpha test and alpha to coverage if the render target 0 is not\n      // written to dynamically.\n      fsi_sample_mask_in_rt_0_alpha_tests = main_fsi_sample_mask_;\n      spv::Id rt_0_written = builder_->createBinOp(\n          spv::OpINotEqual, type_bool_,\n          builder_->createBinOp(\n              spv::OpBitwiseAnd, type_uint_,\n              builder_->createLoad(var_main_fsi_color_written_,\n                                   spv::NoPrecision),\n              builder_->makeUintConstant(0b1)),\n          const_uint_0_);\n      block_fsi_rt_0_alpha_tests_rt_written_head = builder_->getBuildPoint();\n      spv::Block& block_fsi_rt_0_alpha_tests_rt_written =\n          builder_->makeNewBlock();\n      block_fsi_rt_0_alpha_tests_rt_written_merge = &builder_->makeNewBlock();\n      builder_->createSelectionMerge(\n          block_fsi_rt_0_alpha_tests_rt_written_merge,\n          spv::SelectionControlDontFlattenMask);\n      {\n        std::unique_ptr<spv::Instruction> rt_0_written_branch_conditional_op =\n            std::make_unique<spv::Instruction>(spv::OpBranchConditional);\n        rt_0_written_branch_conditional_op->addIdOperand(rt_0_written);\n        rt_0_written_branch_conditional_op->addIdOperand(\n            block_fsi_rt_0_alpha_tests_rt_written.getId());\n        rt_0_written_branch_conditional_op->addIdOperand(\n            block_fsi_rt_0_alpha_tests_rt_written_merge->getId());\n        // More likely to write to the render target 0 than not.\n        rt_0_written_branch_conditional_op->addImmediateOperand(2);\n        rt_0_written_branch_conditional_op->addImmediateOperand(1);\n        builder_->getBuildPoint()->addInstruction(\n            std::move(rt_0_written_branch_conditional_op));\n      }\n      block_fsi_rt_0_alpha_tests_rt_written.addPredecessor(\n          block_fsi_rt_0_alpha_tests_rt_written_head);\n      block_fsi_rt_0_alpha_tests_rt_written_merge->addPredecessor(\n          block_fsi_rt_0_alpha_tests_rt_written_head);\n      builder_->setBuildPoint(&block_fsi_rt_0_alpha_tests_rt_written);\n    }\n\n    // Alpha test.\n    // TODO(Triang3l): Check how alpha test works with NaN on Direct3D 9.\n    // Extract the comparison function (less, equal, greater bits).\n    spv::Id alpha_test_function = builder_->createTriOp(\n        spv::OpBitFieldUExtract, type_uint_, main_system_constant_flags_,\n        builder_->makeUintConstant(kSysFlag_AlphaPassIfLess_Shift),\n        builder_->makeUintConstant(3));\n    // Check if the comparison function is not \"always\" - that should pass even\n    // for NaN likely, unlike \"less, equal or greater\".\n    SpirvBuilder::IfBuilder if_alpha_test_function_is_non_always(\n        builder_->createBinOp(spv::OpINotEqual, type_bool_, alpha_test_function,\n                              builder_->makeUintConstant(\n                                  uint32_t(xenos::CompareFunction::kAlways))),\n        spv::SelectionControlDontFlattenMask, *builder_);\n    {\n      id_vector_temp_.clear();\n      id_vector_temp_.push_back(builder_->makeIntConstant(3));\n      spv::Id alpha_test_alpha = builder_->createLoad(\n          builder_->createAccessChain(\n              edram_fragment_shader_interlock_ ? spv::StorageClassFunction\n                                               : spv::StorageClassOutput,\n              output_or_var_fragment_data_[0], id_vector_temp_),\n          spv::NoPrecision);\n      id_vector_temp_.clear();\n      id_vector_temp_.push_back(\n          builder_->makeIntConstant(kSystemConstantAlphaTestReference));\n      spv::Id alpha_test_reference =\n          builder_->createLoad(builder_->createAccessChain(\n                                   spv::StorageClassUniform,\n                                   uniform_system_constants_, id_vector_temp_),\n                               spv::NoPrecision);\n      // The comparison function is not \"always\" - perform the alpha test.\n      // Handle \"not equal\" specially (specifically as \"not equal\" so it's true\n      // for NaN, not \"less or greater\" which is false for NaN).\n      SpirvBuilder::IfBuilder if_alpha_test_function_is_not_equal(\n          builder_->createBinOp(spv::OpIEqual, type_bool_, alpha_test_function,\n                                builder_->makeUintConstant(uint32_t(\n                                    xenos::CompareFunction::kNotEqual))),\n          spv::SelectionControlDontFlattenMask, *builder_, 1, 2);\n      spv::Id alpha_test_result_not_equal;\n      {\n        // \"Not equal\" function.\n        alpha_test_result_not_equal =\n            builder_->createBinOp(spv::OpFUnordNotEqual, type_bool_,\n                                  alpha_test_alpha, alpha_test_reference);\n      }\n      if_alpha_test_function_is_not_equal.makeBeginElse();\n      spv::Id alpha_test_result_non_not_equal;\n      {\n        // Function other than \"not equal\".\n        static const spv::Op kAlphaTestOps[] = {\n            spv::OpFOrdLessThan, spv::OpFOrdEqual, spv::OpFOrdGreaterThan};\n        for (uint32_t i = 0; i < 3; ++i) {\n          spv::Id alpha_test_comparison_result = builder_->createBinOp(\n              spv::OpLogicalAnd, type_bool_,\n              builder_->createBinOp(kAlphaTestOps[i], type_bool_,\n                                    alpha_test_alpha, alpha_test_reference),\n              builder_->createBinOp(\n                  spv::OpINotEqual, type_bool_,\n                  builder_->createBinOp(\n                      spv::OpBitwiseAnd, type_uint_, alpha_test_function,\n                      builder_->makeUintConstant(UINT32_C(1) << i)),\n                  const_uint_0_));\n          if (i) {\n            alpha_test_result_non_not_equal = builder_->createBinOp(\n                spv::OpLogicalOr, type_bool_, alpha_test_result_non_not_equal,\n                alpha_test_comparison_result);\n          } else {\n            alpha_test_result_non_not_equal = alpha_test_comparison_result;\n          }\n        }\n      }\n      if_alpha_test_function_is_not_equal.makeEndIf();\n      spv::Id alpha_test_result =\n          if_alpha_test_function_is_not_equal.createMergePhi(\n              alpha_test_result_not_equal, alpha_test_result_non_not_equal);\n      // Discard the pixel if the alpha test has failed.\n      if (edram_fragment_shader_interlock_ &&\n          !features_.demote_to_helper_invocation) {\n        fsi_pixel_potentially_killed = true;\n        fsi_sample_mask_in_rt_0_alpha_tests = builder_->createTriOp(\n            spv::OpSelect, type_uint_, alpha_test_result,\n            fsi_sample_mask_in_rt_0_alpha_tests, const_uint_0_);\n      } else {\n        SpirvBuilder::IfBuilder alpha_test_kill_if(\n            builder_->createUnaryOp(spv::OpLogicalNot, type_bool_,\n                                    alpha_test_result),\n            spv::SelectionControlDontFlattenMask, *builder_);\n        bool branch_to_alpha_test_kill_merge = true;\n        if (edram_fragment_shader_interlock_) {\n          assert_true(features_.demote_to_helper_invocation);\n          fsi_pixel_potentially_killed = true;\n          // TODO(Triang3l): Promoted to SPIR-V 1.6 - don't add the extension\n          // there.\n          builder_->addExtension(\"SPV_EXT_demote_to_helper_invocation\");\n          builder_->addCapability(spv::CapabilityDemoteToHelperInvocationEXT);\n          builder_->createNoResultOp(spv::OpDemoteToHelperInvocationEXT);\n        } else {\n          // TODO(Triang3l): Use OpTerminateInvocation when SPIR-V 1.6 is\n          // targeted.\n          builder_->createNoResultOp(spv::OpKill);\n          // OpKill terminates the block.\n          branch_to_alpha_test_kill_merge = false;\n        }\n        alpha_test_kill_if.makeEndIf(branch_to_alpha_test_kill_merge);\n      }\n    }\n    if_alpha_test_function_is_non_always.makeEndIf();\n\n    // TODO(Triang3l): Alpha to coverage.\n\n    if (edram_fragment_shader_interlock_) {\n      // Close the render target 0 written check.\n      builder_->createBranch(block_fsi_rt_0_alpha_tests_rt_written_merge);\n      spv::Block& block_fsi_rt_0_alpha_tests_rt_written_end =\n          *builder_->getBuildPoint();\n      builder_->setBuildPoint(block_fsi_rt_0_alpha_tests_rt_written_merge);\n      if (!features_.demote_to_helper_invocation) {\n        // The tests might have modified the sample mask via\n        // fsi_sample_mask_in_rt_0_alpha_tests.\n        id_vector_temp_.clear();\n        id_vector_temp_.push_back(fsi_sample_mask_in_rt_0_alpha_tests);\n        id_vector_temp_.push_back(\n            block_fsi_rt_0_alpha_tests_rt_written_end.getId());\n        id_vector_temp_.push_back(main_fsi_sample_mask_);\n        id_vector_temp_.push_back(\n            block_fsi_rt_0_alpha_tests_rt_written_head->getId());\n        main_fsi_sample_mask_ =\n            builder_->createOp(spv::OpPhi, type_uint_, id_vector_temp_);\n      }\n    }\n  }\n\n  spv::Block* block_fsi_if_after_kill = nullptr;\n  spv::Block* block_fsi_if_after_kill_merge = nullptr;\n\n  spv::Block* block_fsi_if_after_depth_stencil = nullptr;\n  spv::Block* block_fsi_if_after_depth_stencil_merge = nullptr;\n\n  if (edram_fragment_shader_interlock_) {\n    if (fsi_pixel_potentially_killed) {\n      if (features_.demote_to_helper_invocation) {\n        // Don't do anything related to writing to the EDRAM if the pixel was\n        // killed.\n        id_vector_temp_.clear();\n        // TODO(Triang3l): Use HelperInvocation volatile load on SPIR-V 1.6.\n        main_fsi_sample_mask_ = builder_->createTriOp(\n            spv::OpSelect, type_uint_,\n            builder_->createOp(spv::OpIsHelperInvocationEXT, type_bool_,\n                               id_vector_temp_),\n            const_uint_0_, main_fsi_sample_mask_);\n      }\n      // Check the condition before the OpSelectionMerge, which must be the\n      // penultimate instruction in a block.\n      spv::Id pixel_not_killed = builder_->createBinOp(\n          spv::OpINotEqual, type_bool_, main_fsi_sample_mask_, const_uint_0_);\n      block_fsi_if_after_kill = &builder_->makeNewBlock();\n      block_fsi_if_after_kill_merge = &builder_->makeNewBlock();\n      builder_->createSelectionMerge(block_fsi_if_after_kill_merge,\n                                     spv::SelectionControlDontFlattenMask);\n      builder_->createConditionalBranch(pixel_not_killed,\n                                        block_fsi_if_after_kill,\n                                        block_fsi_if_after_kill_merge);\n      builder_->setBuildPoint(block_fsi_if_after_kill);\n    }\n\n    spv::Id color_write_depth_stencil_condition = spv::NoResult;\n    if (FSI_IsDepthStencilEarly()) {\n      // Perform late depth / stencil writes for samples not discarded.\n      for (uint32_t i = 0; i < 4; ++i) {\n        spv::Id sample_late_depth_stencil_write_needed = builder_->createBinOp(\n            spv::OpINotEqual, type_bool_,\n            builder_->createBinOp(\n                spv::OpBitwiseAnd, type_uint_, main_fsi_sample_mask_,\n                builder_->makeUintConstant(uint32_t(1) << (4 + i))),\n            const_uint_0_);\n        SpirvBuilder::IfBuilder if_sample_late_depth_stencil_write_needed(\n            sample_late_depth_stencil_write_needed,\n            spv::SelectionControlDontFlattenMask, *builder_);\n        spv::Id depth_stencil_sample_address =\n            FSI_AddSampleOffset(main_fsi_address_depth_, i);\n        id_vector_temp_.clear();\n        // First SSBO structure element.\n        id_vector_temp_.push_back(const_int_0_);\n        id_vector_temp_.push_back(depth_stencil_sample_address);\n        builder_->createStore(\n            main_fsi_late_write_depth_stencil_[i],\n            builder_->createAccessChain(features_.spirv_version >= spv::Spv_1_3\n                                            ? spv::StorageClassStorageBuffer\n                                            : spv::StorageClassUniform,\n                                        buffer_edram_, id_vector_temp_));\n        if_sample_late_depth_stencil_write_needed.makeEndIf();\n      }\n      if (color_targets_written) {\n        // Only take the remaining coverage bits, not the late depth / stencil\n        // write bits, into account in the check whether anything needs to be\n        // done for the color targets.\n        color_write_depth_stencil_condition = builder_->createBinOp(\n            spv::OpINotEqual, type_bool_,\n            builder_->createBinOp(\n                spv::OpBitwiseAnd, type_uint_, main_fsi_sample_mask_,\n                builder_->makeUintConstant((uint32_t(1) << 4) - 1)),\n            const_uint_0_);\n      }\n    } else {\n      if (msaa_samples == spv::NoResult) {\n        msaa_samples = LoadMsaaSamplesFromFlags();\n      }\n      FSI_LoadEdramOffsets(msaa_samples);\n      // Begin the critical section on the outermost control flow level so it's\n      // entered exactly once on any control flow path as required by the SPIR-V\n      // extension specification.\n      builder_->createNoResultOp(spv::OpBeginInvocationInterlockEXT);\n      // Do the depth / stencil test.\n      // The sample mask might have been made narrower than the initially loaded\n      // mask by various conditions that discard the whole pixel, as well as by\n      // alpha to coverage.\n      FSI_DepthStencilTest(msaa_samples, fsi_pixel_potentially_killed ||\n                                             (color_targets_written & 0b1));\n      if (color_targets_written) {\n        // Only bits 0:3 of main_fsi_sample_mask_ are written by the late\n        // depth / stencil test.\n        color_write_depth_stencil_condition = builder_->createBinOp(\n            spv::OpINotEqual, type_bool_, main_fsi_sample_mask_, const_uint_0_);\n      }\n    }\n\n    if (color_write_depth_stencil_condition != spv::NoResult) {\n      // Skip all color operations if the pixel has failed the tests entirely.\n      block_fsi_if_after_depth_stencil = &builder_->makeNewBlock();\n      block_fsi_if_after_depth_stencil_merge = &builder_->makeNewBlock();\n      builder_->createSelectionMerge(block_fsi_if_after_depth_stencil_merge,\n                                     spv::SelectionControlDontFlattenMask);\n      builder_->createConditionalBranch(color_write_depth_stencil_condition,\n                                        block_fsi_if_after_depth_stencil,\n                                        block_fsi_if_after_depth_stencil_merge);\n      builder_->setBuildPoint(block_fsi_if_after_depth_stencil);\n    }\n  }\n\n  if (color_targets_written) {\n    spv::Id fsi_color_targets_written = spv::NoResult;\n    spv::Id fsi_const_int_1 = spv::NoResult;\n    spv::Id fsi_const_edram_size_dwords = spv::NoResult;\n    spv::Id fsi_samples_covered[4] = {};\n    if (edram_fragment_shader_interlock_) {\n      fsi_color_targets_written =\n          builder_->createLoad(var_main_fsi_color_written_, spv::NoPrecision);\n      fsi_const_int_1 = builder_->makeIntConstant(1);\n      // TODO(Triang3l): Resolution scaling.\n      fsi_const_edram_size_dwords = builder_->makeUintConstant(\n          xenos::kEdramTileWidthSamples * xenos::kEdramTileHeightSamples *\n          xenos::kEdramTileCount);\n      for (uint32_t i = 0; i < 4; ++i) {\n        fsi_samples_covered[i] = builder_->createBinOp(\n            spv::OpINotEqual, type_bool_,\n            builder_->createBinOp(spv::OpBitwiseAnd, type_uint_,\n                                  main_fsi_sample_mask_,\n                                  builder_->makeUintConstant(uint32_t(1) << i)),\n            const_uint_0_);\n      }\n    }\n    uint32_t color_targets_remaining = color_targets_written;\n    uint32_t color_target_index;\n    while (xe::bit_scan_forward(color_targets_remaining, &color_target_index)) {\n      color_targets_remaining &= ~(UINT32_C(1) << color_target_index);\n      spv::Id color_variable = output_or_var_fragment_data_[color_target_index];\n      spv::Id color = builder_->createLoad(color_variable, spv::NoPrecision);\n\n      // Apply the exponent bias after the alpha test and alpha to coverage\n      // because they need the unbiased alpha from the shader.\n      id_vector_temp_.clear();\n      id_vector_temp_.push_back(\n          builder_->makeIntConstant(kSystemConstantColorExpBias));\n      id_vector_temp_.push_back(\n          builder_->makeIntConstant(int32_t(color_target_index)));\n      color = builder_->createNoContractionBinOp(\n          spv::OpVectorTimesScalar, type_float4_, color,\n          builder_->createLoad(builder_->createAccessChain(\n                                   spv::StorageClassUniform,\n                                   uniform_system_constants_, id_vector_temp_),\n                               spv::NoPrecision));\n\n      if (edram_fragment_shader_interlock_) {\n        // Write the color to the target in the EDRAM only it was written on the\n        // shader's execution path, according to the Direct3D 9 rules that games\n        // rely on.\n        spv::Id fsi_color_written = builder_->createBinOp(\n            spv::OpINotEqual, type_bool_,\n            builder_->createBinOp(\n                spv::OpBitwiseAnd, type_uint_, fsi_color_targets_written,\n                builder_->makeUintConstant(uint32_t(1) << color_target_index)),\n            const_uint_0_);\n        // More likely to write to the render target than not.\n        SpirvBuilder::IfBuilder if_fsi_color_written(\n            fsi_color_written, spv::SelectionControlDontFlattenMask, *builder_,\n            2, 1);\n\n        // For accessing uint2 arrays of per-render-target data which are passed\n        // as uint4 arrays due to std140 array element alignment.\n        spv::Id rt_uint2_index_array =\n            builder_->makeIntConstant(color_target_index >> 1);\n        spv::Id rt_uint2_index_element[] = {\n            builder_->makeIntConstant((color_target_index & 1) << 1),\n            builder_->makeIntConstant(((color_target_index & 1) << 1) + 1),\n        };\n\n        // Load the mask of the bits of the destination color that should be\n        // preserved (in 32-bit halves), which are 0, 0 if the color is fully\n        // overwritten, or UINT32_MAX, UINT32_MAX if writing to the target is\n        // disabled completely.\n        id_vector_temp_.clear();\n        id_vector_temp_.push_back(\n            builder_->makeIntConstant(kSystemConstantEdramRTKeepMask));\n        id_vector_temp_.push_back(rt_uint2_index_array);\n        id_vector_temp_.push_back(rt_uint2_index_element[0]);\n        spv::Id rt_keep_mask[2];\n        rt_keep_mask[0] = builder_->createLoad(\n            builder_->createAccessChain(spv::StorageClassUniform,\n                                        uniform_system_constants_,\n                                        id_vector_temp_),\n            spv::NoPrecision);\n        id_vector_temp_.back() = rt_uint2_index_element[1];\n        rt_keep_mask[1] = builder_->createLoad(\n            builder_->createAccessChain(spv::StorageClassUniform,\n                                        uniform_system_constants_,\n                                        id_vector_temp_),\n            spv::NoPrecision);\n\n        // Check if writing to the render target is not disabled completely.\n        spv::Id const_uint32_max = builder_->makeUintConstant(UINT32_MAX);\n        spv::Id rt_write_mask_not_empty = builder_->createBinOp(\n            spv::OpLogicalOr, type_bool_,\n            builder_->createBinOp(spv::OpINotEqual, type_bool_, rt_keep_mask[0],\n                                  const_uint32_max),\n            builder_->createBinOp(spv::OpINotEqual, type_bool_, rt_keep_mask[1],\n                                  const_uint32_max));\n        SpirvBuilder::IfBuilder if_rt_write_mask_not_empty(\n            rt_write_mask_not_empty, spv::SelectionControlDontFlattenMask,\n            *builder_);\n\n        spv::Id const_int_rt_index =\n            builder_->makeIntConstant(color_target_index);\n\n        // Load the information about the render target.\n\n        id_vector_temp_.clear();\n        id_vector_temp_.push_back(\n            builder_->makeIntConstant(kSystemConstantEdramRTFormatFlags));\n        id_vector_temp_.push_back(const_int_rt_index);\n        spv::Id rt_format_with_flags = builder_->createLoad(\n            builder_->createAccessChain(spv::StorageClassUniform,\n                                        uniform_system_constants_,\n                                        id_vector_temp_),\n            spv::NoPrecision);\n\n        spv::Id rt_is_64bpp = builder_->createBinOp(\n            spv::OpINotEqual, type_bool_,\n            builder_->createBinOp(\n                spv::OpBitwiseAnd, type_uint_, rt_format_with_flags,\n                builder_->makeUintConstant(\n                    RenderTargetCache::kPSIColorFormatFlag_64bpp)),\n            const_uint_0_);\n\n        id_vector_temp_.clear();\n        id_vector_temp_.push_back(\n            builder_->makeIntConstant(kSystemConstantEdramRTBaseDwordsScaled));\n        id_vector_temp_.push_back(const_int_rt_index);\n        // EDRAM addresses are wrapped on the Xenos (modulo the EDRAM size).\n        spv::Id rt_sample_0_address = builder_->createUnaryOp(\n            spv::OpBitcast, type_int_,\n            builder_->createBinOp(\n                spv::OpUMod, type_uint_,\n                builder_->createBinOp(\n                    spv::OpIAdd, type_uint_,\n                    builder_->createLoad(\n                        builder_->createAccessChain(spv::StorageClassUniform,\n                                                    uniform_system_constants_,\n                                                    id_vector_temp_),\n                        spv::NoPrecision),\n                    builder_->createTriOp(spv::OpSelect, type_uint_,\n                                          rt_is_64bpp, main_fsi_offset_64bpp_,\n                                          main_fsi_offset_32bpp_)),\n                fsi_const_edram_size_dwords));\n\n        // Load the blending parameters for the render target.\n        id_vector_temp_.clear();\n        id_vector_temp_.push_back(\n            builder_->makeIntConstant(kSystemConstantEdramRTBlendFactorsOps));\n        id_vector_temp_.push_back(const_int_rt_index);\n        spv::Id rt_blend_factors_equations = builder_->createLoad(\n            builder_->createAccessChain(spv::StorageClassUniform,\n                                        uniform_system_constants_,\n                                        id_vector_temp_),\n            spv::NoPrecision);\n\n        // Check if blending (the blending is not 1 * source + 0 * destination).\n        spv::Id rt_blend_enabled = builder_->createBinOp(\n            spv::OpINotEqual, type_bool_, rt_blend_factors_equations,\n            builder_->makeUintConstant(0x00010001));\n        SpirvBuilder::IfBuilder if_rt_blend_enabled(\n            rt_blend_enabled, spv::SelectionControlDontFlattenMask, *builder_);\n        {\n          // Blending path.\n\n          // Get various parameters used in blending.\n          spv::Id rt_color_is_fixed_point = builder_->createBinOp(\n              spv::OpINotEqual, type_bool_,\n              builder_->createBinOp(\n                  spv::OpBitwiseAnd, type_uint_, rt_format_with_flags,\n                  builder_->makeUintConstant(\n                      RenderTargetCache::kPSIColorFormatFlag_FixedPointColor)),\n              const_uint_0_);\n          spv::Id rt_alpha_is_fixed_point = builder_->createBinOp(\n              spv::OpINotEqual, type_bool_,\n              builder_->createBinOp(\n                  spv::OpBitwiseAnd, type_uint_, rt_format_with_flags,\n                  builder_->makeUintConstant(\n                      RenderTargetCache::kPSIColorFormatFlag_FixedPointAlpha)),\n              const_uint_0_);\n          id_vector_temp_.clear();\n          id_vector_temp_.push_back(\n              builder_->makeIntConstant(kSystemConstantEdramRTClamp));\n          id_vector_temp_.push_back(const_int_rt_index);\n          spv::Id rt_clamp = builder_->createLoad(\n              builder_->createAccessChain(spv::StorageClassUniform,\n                                          uniform_system_constants_,\n                                          id_vector_temp_),\n              spv::NoPrecision);\n          spv::Id rt_clamp_color_min = builder_->smearScalar(\n              spv::NoPrecision,\n              builder_->createCompositeExtract(rt_clamp, type_float_, 0),\n              type_float3_);\n          spv::Id rt_clamp_alpha_min =\n              builder_->createCompositeExtract(rt_clamp, type_float_, 1);\n          spv::Id rt_clamp_color_max = builder_->smearScalar(\n              spv::NoPrecision,\n              builder_->createCompositeExtract(rt_clamp, type_float_, 2),\n              type_float3_);\n          spv::Id rt_clamp_alpha_max =\n              builder_->createCompositeExtract(rt_clamp, type_float_, 3);\n\n          spv::Id blend_factor_width = builder_->makeUintConstant(5);\n          spv::Id blend_equation_width = builder_->makeUintConstant(3);\n          spv::Id rt_color_source_factor = builder_->createTriOp(\n              spv::OpBitFieldUExtract, type_uint_, rt_blend_factors_equations,\n              const_uint_0_, blend_factor_width);\n          spv::Id rt_color_equation = builder_->createTriOp(\n              spv::OpBitFieldUExtract, type_uint_, rt_blend_factors_equations,\n              blend_factor_width, blend_equation_width);\n          spv::Id rt_color_dest_factor = builder_->createTriOp(\n              spv::OpBitFieldUExtract, type_uint_, rt_blend_factors_equations,\n              builder_->makeUintConstant(8), blend_factor_width);\n          spv::Id rt_alpha_source_factor = builder_->createTriOp(\n              spv::OpBitFieldUExtract, type_uint_, rt_blend_factors_equations,\n              builder_->makeUintConstant(16), blend_factor_width);\n          spv::Id rt_alpha_equation = builder_->createTriOp(\n              spv::OpBitFieldUExtract, type_uint_, rt_blend_factors_equations,\n              builder_->makeUintConstant(21), blend_equation_width);\n          spv::Id rt_alpha_dest_factor = builder_->createTriOp(\n              spv::OpBitFieldUExtract, type_uint_, rt_blend_factors_equations,\n              builder_->makeUintConstant(24), blend_factor_width);\n\n          id_vector_temp_.clear();\n          id_vector_temp_.push_back(\n              builder_->makeIntConstant(kSystemConstantEdramBlendConstant));\n          spv::Id blend_constant_unclamped = builder_->createLoad(\n              builder_->createAccessChain(spv::StorageClassUniform,\n                                          uniform_system_constants_,\n                                          id_vector_temp_),\n              spv::NoPrecision);\n          uint_vector_temp_.clear();\n          uint_vector_temp_.push_back(0);\n          uint_vector_temp_.push_back(1);\n          uint_vector_temp_.push_back(2);\n          spv::Id blend_constant_color_unclamped =\n              builder_->createRvalueSwizzle(spv::NoPrecision, type_float3_,\n                                            blend_constant_unclamped,\n                                            uint_vector_temp_);\n          spv::Id blend_constant_color_clamped = FSI_FlushNaNClampAndInBlending(\n              blend_constant_color_unclamped, rt_color_is_fixed_point,\n              rt_clamp_color_min, rt_clamp_color_max);\n          spv::Id blend_constant_alpha_clamped = FSI_FlushNaNClampAndInBlending(\n              builder_->createCompositeExtract(blend_constant_unclamped,\n                                               type_float_, 3),\n              rt_alpha_is_fixed_point, rt_clamp_alpha_min, rt_clamp_alpha_max);\n\n          uint_vector_temp_.clear();\n          uint_vector_temp_.push_back(0);\n          uint_vector_temp_.push_back(1);\n          uint_vector_temp_.push_back(2);\n          spv::Id source_color_unclamped = builder_->createRvalueSwizzle(\n              spv::NoPrecision, type_float3_, color, uint_vector_temp_);\n          spv::Id source_color_clamped = FSI_FlushNaNClampAndInBlending(\n              source_color_unclamped, rt_color_is_fixed_point,\n              rt_clamp_color_min, rt_clamp_color_max);\n          spv::Id source_alpha_clamped = FSI_FlushNaNClampAndInBlending(\n              builder_->createCompositeExtract(color, type_float_, 3),\n              rt_alpha_is_fixed_point, rt_clamp_alpha_min, rt_clamp_alpha_max);\n\n          std::array<spv::Id, 2> rt_replace_mask;\n          for (uint32_t i = 0; i < 2; ++i) {\n            rt_replace_mask[i] = builder_->createUnaryOp(spv::OpNot, type_uint_,\n                                                         rt_keep_mask[i]);\n          }\n\n          // Blend and mask each sample.\n          for (uint32_t i = 0; i < 4; ++i) {\n            SpirvBuilder::IfBuilder if_sample_covered(\n                fsi_samples_covered[i], spv::SelectionControlDontFlattenMask,\n                *builder_);\n\n            spv::Id rt_sample_address =\n                FSI_AddSampleOffset(rt_sample_0_address, i, rt_is_64bpp);\n            id_vector_temp_.clear();\n            // First SSBO structure element.\n            id_vector_temp_.push_back(const_int_0_);\n            id_vector_temp_.push_back(rt_sample_address);\n            spv::Id rt_access_chain_0 = builder_->createAccessChain(\n                features_.spirv_version >= spv::Spv_1_3\n                    ? spv::StorageClassStorageBuffer\n                    : spv::StorageClassUniform,\n                buffer_edram_, id_vector_temp_);\n            id_vector_temp_.back() = builder_->createBinOp(\n                spv::OpIAdd, type_int_, rt_sample_address, fsi_const_int_1);\n            spv::Id rt_access_chain_1 = builder_->createAccessChain(\n                features_.spirv_version >= spv::Spv_1_3\n                    ? spv::StorageClassStorageBuffer\n                    : spv::StorageClassUniform,\n                buffer_edram_, id_vector_temp_);\n\n            // Load the destination color.\n            std::array<spv::Id, 2> dest_packed;\n            dest_packed[0] =\n                builder_->createLoad(rt_access_chain_0, spv::NoPrecision);\n            {\n              SpirvBuilder::IfBuilder if_64bpp(\n                  rt_is_64bpp, spv::SelectionControlDontFlattenMask, *builder_);\n              spv::Id dest_packed_64bpp_high =\n                  builder_->createLoad(rt_access_chain_1, spv::NoPrecision);\n              if_64bpp.makeEndIf();\n              dest_packed[1] = if_64bpp.createMergePhi(dest_packed_64bpp_high,\n                                                       const_uint_0_);\n            }\n            std::array<spv::Id, 4> dest_unpacked =\n                FSI_UnpackColor(dest_packed, rt_format_with_flags);\n            id_vector_temp_.clear();\n            id_vector_temp_.push_back(dest_unpacked[0]);\n            id_vector_temp_.push_back(dest_unpacked[1]);\n            id_vector_temp_.push_back(dest_unpacked[2]);\n            spv::Id dest_color = builder_->createCompositeConstruct(\n                type_float3_, id_vector_temp_);\n\n            // Blend the components.\n            spv::Id result_color = FSI_BlendColorOrAlphaWithUnclampedResult(\n                rt_color_is_fixed_point, rt_clamp_color_min, rt_clamp_color_max,\n                source_color_clamped, source_alpha_clamped, dest_color,\n                dest_unpacked[3], blend_constant_color_clamped,\n                blend_constant_alpha_clamped, rt_color_equation,\n                rt_color_source_factor, rt_color_dest_factor);\n            spv::Id result_alpha = FSI_BlendColorOrAlphaWithUnclampedResult(\n                rt_alpha_is_fixed_point, rt_clamp_alpha_min, rt_clamp_alpha_max,\n                spv::NoResult, source_alpha_clamped, spv::NoResult,\n                dest_unpacked[3], spv::NoResult, blend_constant_alpha_clamped,\n                rt_alpha_equation, rt_alpha_source_factor,\n                rt_alpha_dest_factor);\n\n            // Pack and store the result.\n            // Bypass the `getNumTypeConstituents(typeId) ==\n            // (int)constituents.size()` assertion in createCompositeConstruct,\n            // OpCompositeConstruct can construct vectors not only from scalars,\n            // but also from other vectors.\n            spv::Id result_float4;\n            {\n              std::unique_ptr<spv::Instruction> result_composite_construct_op =\n                  std::make_unique<spv::Instruction>(builder_->getUniqueId(),\n                                                     type_float4_,\n                                                     spv::OpCompositeConstruct);\n              result_composite_construct_op->addIdOperand(result_color);\n              result_composite_construct_op->addIdOperand(result_alpha);\n              result_float4 = result_composite_construct_op->getResultId();\n              builder_->getBuildPoint()->addInstruction(\n                  std::move(result_composite_construct_op));\n            }\n            std::array<spv::Id, 2> result_packed =\n                FSI_ClampAndPackColor(result_float4, rt_format_with_flags);\n            builder_->createStore(\n                builder_->createBinOp(\n                    spv::OpBitwiseOr, type_uint_,\n                    builder_->createBinOp(spv::OpBitwiseAnd, type_uint_,\n                                          dest_packed[0], rt_keep_mask[0]),\n                    builder_->createBinOp(spv::OpBitwiseAnd, type_uint_,\n                                          result_packed[0],\n                                          rt_replace_mask[0])),\n                rt_access_chain_0);\n            SpirvBuilder::IfBuilder if_64bpp(\n                rt_is_64bpp, spv::SelectionControlDontFlattenMask, *builder_);\n            {\n              builder_->createStore(\n                  builder_->createBinOp(\n                      spv::OpBitwiseOr, type_uint_,\n                      builder_->createBinOp(spv::OpBitwiseAnd, type_uint_,\n                                            dest_packed[1], rt_keep_mask[1]),\n                      builder_->createBinOp(spv::OpBitwiseAnd, type_uint_,\n                                            result_packed[1],\n                                            rt_replace_mask[1])),\n                  rt_access_chain_1);\n            }\n            if_64bpp.makeEndIf();\n\n            if_sample_covered.makeEndIf();\n          }\n        }\n        if_rt_blend_enabled.makeBeginElse();\n        {\n          // Non-blending paths.\n\n          // Pack the new color for all samples.\n          std::array<spv::Id, 2> color_packed =\n              FSI_ClampAndPackColor(color, rt_format_with_flags);\n\n          // Check if need to load the original contents.\n          spv::Id rt_keep_mask_not_empty = builder_->createBinOp(\n              spv::OpLogicalOr, type_bool_,\n              builder_->createBinOp(spv::OpINotEqual, type_bool_,\n                                    rt_keep_mask[0], const_uint_0_),\n              builder_->createBinOp(spv::OpINotEqual, type_bool_,\n                                    rt_keep_mask[1], const_uint_0_));\n\n          SpirvBuilder::IfBuilder if_rt_keep_mask_not_empty(\n              rt_keep_mask_not_empty, spv::SelectionControlDontFlattenMask,\n              *builder_);\n          {\n            // Loading and masking path.\n            std::array<spv::Id, 2> color_packed_masked;\n            for (uint32_t i = 0; i < 2; ++i) {\n              color_packed_masked[i] = builder_->createBinOp(\n                  spv::OpBitwiseAnd, type_uint_, color_packed[i],\n                  builder_->createUnaryOp(spv::OpNot, type_uint_,\n                                          rt_keep_mask[i]));\n            }\n            for (uint32_t i = 0; i < 4; ++i) {\n              SpirvBuilder::IfBuilder if_sample_covered(\n                  fsi_samples_covered[i], spv::SelectionControlDontFlattenMask,\n                  *builder_);\n              spv::Id rt_sample_address =\n                  FSI_AddSampleOffset(rt_sample_0_address, i, rt_is_64bpp);\n              id_vector_temp_.clear();\n              // First SSBO structure element.\n              id_vector_temp_.push_back(const_int_0_);\n              id_vector_temp_.push_back(rt_sample_address);\n              spv::Id rt_access_chain_0 = builder_->createAccessChain(\n                  features_.spirv_version >= spv::Spv_1_3\n                      ? spv::StorageClassStorageBuffer\n                      : spv::StorageClassUniform,\n                  buffer_edram_, id_vector_temp_);\n              builder_->createStore(\n                  builder_->createBinOp(\n                      spv::OpBitwiseOr, type_uint_,\n                      builder_->createBinOp(\n                          spv::OpBitwiseAnd, type_uint_,\n                          builder_->createLoad(rt_access_chain_0,\n                                               spv::NoPrecision),\n                          rt_keep_mask[0]),\n                      color_packed_masked[0]),\n                  rt_access_chain_0);\n              SpirvBuilder::IfBuilder if_64bpp(\n                  rt_is_64bpp, spv::SelectionControlDontFlattenMask, *builder_);\n              {\n                id_vector_temp_.back() = builder_->createBinOp(\n                    spv::OpIAdd, type_int_, rt_sample_address, fsi_const_int_1);\n                spv::Id rt_access_chain_1 = builder_->createAccessChain(\n                    features_.spirv_version >= spv::Spv_1_3\n                        ? spv::StorageClassStorageBuffer\n                        : spv::StorageClassUniform,\n                    buffer_edram_, id_vector_temp_);\n                builder_->createStore(\n                    builder_->createBinOp(\n                        spv::OpBitwiseOr, type_uint_,\n                        builder_->createBinOp(\n                            spv::OpBitwiseAnd, type_uint_,\n                            builder_->createLoad(rt_access_chain_1,\n                                                 spv::NoPrecision),\n                            rt_keep_mask[1]),\n                        color_packed_masked[1]),\n                    rt_access_chain_1);\n              }\n              if_64bpp.makeEndIf();\n              if_sample_covered.makeEndIf();\n            }\n          }\n          if_rt_keep_mask_not_empty.makeBeginElse();\n          {\n            // Fully overwriting path.\n            for (uint32_t i = 0; i < 4; ++i) {\n              SpirvBuilder::IfBuilder if_sample_covered(\n                  fsi_samples_covered[i], spv::SelectionControlDontFlattenMask,\n                  *builder_);\n              spv::Id rt_sample_address =\n                  FSI_AddSampleOffset(rt_sample_0_address, i, rt_is_64bpp);\n              id_vector_temp_.clear();\n              // First SSBO structure element.\n              id_vector_temp_.push_back(const_int_0_);\n              id_vector_temp_.push_back(rt_sample_address);\n              builder_->createStore(color_packed[0],\n                                    builder_->createAccessChain(\n                                        features_.spirv_version >= spv::Spv_1_3\n                                            ? spv::StorageClassStorageBuffer\n                                            : spv::StorageClassUniform,\n                                        buffer_edram_, id_vector_temp_));\n              SpirvBuilder::IfBuilder if_64bpp(\n                  rt_is_64bpp, spv::SelectionControlDontFlattenMask, *builder_);\n              {\n                id_vector_temp_.back() = builder_->createBinOp(\n                    spv::OpIAdd, type_int_, id_vector_temp_.back(),\n                    fsi_const_int_1);\n                builder_->createStore(\n                    color_packed[1], builder_->createAccessChain(\n                                         features_.spirv_version >= spv::Spv_1_3\n                                             ? spv::StorageClassStorageBuffer\n                                             : spv::StorageClassUniform,\n                                         buffer_edram_, id_vector_temp_));\n              }\n              if_64bpp.makeEndIf();\n              if_sample_covered.makeEndIf();\n            }\n          }\n          if_rt_keep_mask_not_empty.makeEndIf();\n        }\n        if_rt_blend_enabled.makeEndIf();\n\n        if_rt_write_mask_not_empty.makeEndIf();\n        if_fsi_color_written.makeEndIf();\n      } else {\n        // Convert to gamma space - this is incorrect, since it must be done\n        // after blending on the Xbox 360, but this is just one of many blending\n        // issues in the host render target path.\n        // TODO(Triang3l): Gamma as unorm8 check.\n        uint_vector_temp_.clear();\n        uint_vector_temp_.push_back(0);\n        uint_vector_temp_.push_back(1);\n        uint_vector_temp_.push_back(2);\n        spv::Id color_rgb = builder_->createRvalueSwizzle(\n            spv::NoPrecision, type_float3_, color, uint_vector_temp_);\n        spv::Id is_gamma = builder_->createBinOp(\n            spv::OpINotEqual, type_bool_,\n            builder_->createBinOp(\n                spv::OpBitwiseAnd, type_uint_, main_system_constant_flags_,\n                builder_->makeUintConstant(kSysFlag_ConvertColor0ToGamma\n                                           << color_target_index)),\n            const_uint_0_);\n        SpirvBuilder::IfBuilder if_gamma(\n            is_gamma, spv::SelectionControlDontFlattenMask, *builder_);\n        spv::Id color_rgb_gamma = LinearToPWLGamma(color_rgb, false);\n        if_gamma.makeEndIf();\n        color_rgb = if_gamma.createMergePhi(color_rgb_gamma, color_rgb);\n        {\n          std::unique_ptr<spv::Instruction> color_rgba_shuffle_op =\n              std::make_unique<spv::Instruction>(\n                  builder_->getUniqueId(), type_float4_, spv::OpVectorShuffle);\n          color_rgba_shuffle_op->addIdOperand(color_rgb);\n          color_rgba_shuffle_op->addIdOperand(color);\n          color_rgba_shuffle_op->addImmediateOperand(0);\n          color_rgba_shuffle_op->addImmediateOperand(1);\n          color_rgba_shuffle_op->addImmediateOperand(2);\n          color_rgba_shuffle_op->addImmediateOperand(3 + 3);\n          color = color_rgba_shuffle_op->getResultId();\n          builder_->getBuildPoint()->addInstruction(\n              std::move(color_rgba_shuffle_op));\n        }\n\n        builder_->createStore(color, color_variable);\n      }\n    }\n  }\n\n  if (edram_fragment_shader_interlock_) {\n    if (block_fsi_if_after_depth_stencil_merge) {\n      builder_->createBranch(block_fsi_if_after_depth_stencil_merge);\n      builder_->setBuildPoint(block_fsi_if_after_depth_stencil_merge);\n    }\n\n    if (block_fsi_if_after_kill_merge) {\n      builder_->createBranch(block_fsi_if_after_kill_merge);\n      builder_->setBuildPoint(block_fsi_if_after_kill_merge);\n    }\n\n    if (FSI_IsDepthStencilEarly()) {\n      builder_->createBranch(main_fsi_early_depth_stencil_execute_quad_merge_);\n      builder_->setBuildPoint(main_fsi_early_depth_stencil_execute_quad_merge_);\n    }\n\n    builder_->createNoResultOp(spv::OpEndInvocationInterlockEXT);\n  }\n}\n\nspv::Id SpirvShaderTranslator::LoadMsaaSamplesFromFlags() {\n  return builder_->createTriOp(\n      spv::OpBitFieldUExtract, type_uint_, main_system_constant_flags_,\n      builder_->makeUintConstant(kSysFlag_MsaaSamples_Shift),\n      builder_->makeUintConstant(2));\n}\n\nvoid SpirvShaderTranslator::FSI_LoadSampleMask(spv::Id msaa_samples) {\n  // On the Xbox 360, 2x MSAA doubles the storage height, 4x MSAA doubles the\n  // storage width.\n  // Vulkan standard 2x samples are bottom, top.\n  // Vulkan standard 4x samples are TL, TR, BL, BR.\n  // Remap to T, B for 2x, and to TL, BL, TR, BR for 4x.\n  // 2x corresponds to 1, 0 with native 2x MSAA on Vulkan, 0, 3 with 2x as 4x.\n  // 4x corresponds to 0, 2, 1, 3 on Vulkan.\n\n  spv::Id const_uint_1 = builder_->makeUintConstant(1);\n  spv::Id const_uint_2 = builder_->makeUintConstant(2);\n\n  assert_true(input_sample_mask_ != spv::NoResult);\n  id_vector_temp_.clear();\n  id_vector_temp_.push_back(const_int_0_);\n  spv::Id input_sample_mask_value = builder_->createUnaryOp(\n      spv::OpBitcast, type_uint_,\n      builder_->createLoad(\n          builder_->createAccessChain(spv::StorageClassInput,\n                                      input_sample_mask_, id_vector_temp_),\n          spv::NoPrecision));\n\n  spv::Block& block_msaa_head = *builder_->getBuildPoint();\n  spv::Block& block_msaa_1x = builder_->makeNewBlock();\n  spv::Block& block_msaa_2x = builder_->makeNewBlock();\n  spv::Block& block_msaa_4x = builder_->makeNewBlock();\n  spv::Block& block_msaa_merge = builder_->makeNewBlock();\n  builder_->createSelectionMerge(&block_msaa_merge,\n                                 spv::SelectionControlDontFlattenMask);\n  {\n    std::unique_ptr<spv::Instruction> msaa_switch_op =\n        std::make_unique<spv::Instruction>(spv::OpSwitch);\n    msaa_switch_op->addIdOperand(msaa_samples);\n    // Make 1x the default.\n    msaa_switch_op->addIdOperand(block_msaa_1x.getId());\n    msaa_switch_op->addImmediateOperand(int32_t(xenos::MsaaSamples::k2X));\n    msaa_switch_op->addIdOperand(block_msaa_2x.getId());\n    msaa_switch_op->addImmediateOperand(int32_t(xenos::MsaaSamples::k4X));\n    msaa_switch_op->addIdOperand(block_msaa_4x.getId());\n    builder_->getBuildPoint()->addInstruction(std::move(msaa_switch_op));\n  }\n  block_msaa_1x.addPredecessor(&block_msaa_head);\n  block_msaa_2x.addPredecessor(&block_msaa_head);\n  block_msaa_4x.addPredecessor(&block_msaa_head);\n\n  // 1x MSAA - pass input_sample_mask_value through.\n  builder_->setBuildPoint(&block_msaa_1x);\n  builder_->createBranch(&block_msaa_merge);\n\n  // 2x MSAA.\n  builder_->setBuildPoint(&block_msaa_2x);\n  spv::Id sample_mask_2x;\n  if (native_2x_msaa_no_attachments_) {\n    // 1 and 0 to 0 and 1.\n    sample_mask_2x = builder_->createBinOp(\n        spv::OpShiftRightLogical, type_uint_,\n        builder_->createUnaryOp(spv::OpBitReverse, type_uint_,\n                                input_sample_mask_value),\n        builder_->makeUintConstant(32 - 2));\n  } else {\n    // 0 and 3 to 0 and 1.\n    sample_mask_2x = builder_->createQuadOp(\n        spv::OpBitFieldInsert, type_uint_, input_sample_mask_value,\n        builder_->createTriOp(spv::OpBitFieldUExtract, type_uint_,\n                              input_sample_mask_value, const_uint_2,\n                              const_uint_1),\n        const_uint_1, builder_->makeUintConstant(32 - 1));\n  }\n  builder_->createBranch(&block_msaa_merge);\n\n  // 4x MSAA.\n  builder_->setBuildPoint(&block_msaa_4x);\n  // Flip samples in bits 0:1 by reversing the whole coverage mask and inserting\n  // the reversing bits.\n  spv::Id sample_mask_4x = builder_->createQuadOp(\n      spv::OpBitFieldInsert, type_uint_, input_sample_mask_value,\n      builder_->createBinOp(\n          spv::OpShiftRightLogical, type_uint_,\n          builder_->createUnaryOp(spv::OpBitReverse, type_uint_,\n                                  input_sample_mask_value),\n          builder_->makeUintConstant(32 - 1 - 2)),\n      const_uint_1, const_uint_2);\n  builder_->createBranch(&block_msaa_merge);\n\n  // Select the result depending on the MSAA sample count.\n  builder_->setBuildPoint(&block_msaa_merge);\n  id_vector_temp_.clear();\n  id_vector_temp_.reserve(2 * 3);\n  id_vector_temp_.push_back(input_sample_mask_value);\n  id_vector_temp_.push_back(block_msaa_1x.getId());\n  id_vector_temp_.push_back(sample_mask_2x);\n  id_vector_temp_.push_back(block_msaa_2x.getId());\n  id_vector_temp_.push_back(sample_mask_4x);\n  id_vector_temp_.push_back(block_msaa_4x.getId());\n  main_fsi_sample_mask_ =\n      builder_->createOp(spv::OpPhi, type_uint_, id_vector_temp_);\n}\n\nvoid SpirvShaderTranslator::FSI_LoadEdramOffsets(spv::Id msaa_samples) {\n  // Convert the floating-point pixel coordinates to integer sample 0\n  // coordinates.\n  assert_true(input_fragment_coordinates_ != spv::NoResult);\n  spv::Id axes_have_two_msaa_samples[2];\n  spv::Id sample_coordinates[2];\n  spv::Id const_uint_1 = builder_->makeUintConstant(1);\n  for (uint32_t i = 0; i < 2; ++i) {\n    spv::Id axis_has_two_msaa_samples = builder_->createBinOp(\n        spv::OpUGreaterThanEqual, type_bool_, msaa_samples,\n        builder_->makeUintConstant(\n            uint32_t(i ? xenos::MsaaSamples::k2X : xenos::MsaaSamples::k4X)));\n    axes_have_two_msaa_samples[i] = axis_has_two_msaa_samples;\n    id_vector_temp_.clear();\n    id_vector_temp_.push_back(builder_->makeIntConstant(int32_t(i)));\n    sample_coordinates[i] = builder_->createBinOp(\n        spv::OpShiftLeftLogical, type_uint_,\n        builder_->createUnaryOp(\n            spv::OpConvertFToU, type_uint_,\n            builder_->createLoad(\n                builder_->createAccessChain(spv::StorageClassInput,\n                                            input_fragment_coordinates_,\n                                            id_vector_temp_),\n                spv::NoPrecision)),\n        builder_->createTriOp(spv::OpSelect, type_uint_,\n                              axis_has_two_msaa_samples, const_uint_1,\n                              const_uint_0_));\n  }\n\n  // Get 40 x 16 x resolution scale 32bpp half-tile or 40x16 64bpp tile index.\n  // Working with 40x16-sample portions for 64bpp and for swapping for depth -\n  // dividing by 40, not by 80.\n  // TODO(Triang3l): Resolution scaling.\n  uint32_t tile_width = xenos::kEdramTileWidthSamples;\n  spv::Id const_tile_half_width = builder_->makeUintConstant(tile_width >> 1);\n  uint32_t tile_height = xenos::kEdramTileHeightSamples;\n  spv::Id const_tile_height = builder_->makeUintConstant(tile_height);\n  spv::Id tile_half_index[2], tile_half_sample_coordinates[2];\n  for (uint32_t i = 0; i < 2; ++i) {\n    spv::Id sample_x_or_y = sample_coordinates[i];\n    spv::Id tile_half_width_or_height =\n        i ? const_tile_height : const_tile_half_width;\n    tile_half_index[i] = builder_->createBinOp(\n        spv::OpUDiv, type_uint_, sample_x_or_y, tile_half_width_or_height);\n    tile_half_sample_coordinates[i] = builder_->createBinOp(\n        spv::OpUMod, type_uint_, sample_x_or_y, tile_half_width_or_height);\n  }\n\n  // Convert the Y sample 0 position within the half-tile or tile to the dword\n  // offset of the row within a 80x16 32bpp tile or a 40x16 64bpp half-tile.\n  spv::Id const_tile_width = builder_->makeUintConstant(tile_width);\n  spv::Id row_offset_in_tile_at_32bpp =\n      builder_->createBinOp(spv::OpIMul, type_uint_,\n                            tile_half_sample_coordinates[1], const_tile_width);\n\n  // Multiply the Y tile position by the surface tile pitch in dwords at 32bpp\n  // to get the address of the origin of the row of tiles within a 32bpp surface\n  // in dwords (later it needs to be multiplied by 2 for 64bpp).\n  id_vector_temp_.clear();\n  id_vector_temp_.push_back(builder_->makeIntConstant(\n      kSystemConstantEdram32bppTilePitchDwordsScaled));\n  spv::Id tile_row_offset_at_32bpp = builder_->createBinOp(\n      spv::OpIMul, type_uint_,\n      builder_->createLoad(builder_->createAccessChain(\n                               spv::StorageClassUniform,\n                               uniform_system_constants_, id_vector_temp_),\n                           spv::NoPrecision),\n      tile_half_index[1]);\n\n  uint32_t tile_size = tile_width * tile_height;\n  spv::Id const_tile_size = builder_->makeUintConstant(tile_size);\n\n  // Get the dword offset of the sample 0 in the first half-tile in the tile\n  // within a 32bpp surface.\n  spv::Id offset_in_first_tile_half_at_32bpp = builder_->createBinOp(\n      spv::OpIAdd, type_uint_,\n      builder_->createBinOp(\n          spv::OpIAdd, type_uint_, tile_row_offset_at_32bpp,\n          builder_->createBinOp(\n              spv::OpIAdd, type_uint_,\n              builder_->createBinOp(\n                  spv::OpIMul, type_uint_, const_tile_size,\n                  builder_->createBinOp(spv::OpShiftRightLogical, type_uint_,\n                                        tile_half_index[0], const_uint_1)),\n              row_offset_in_tile_at_32bpp)),\n      tile_half_sample_coordinates[0]);\n\n  // Get whether the sample is in the second half-tile in a 32bpp surface.\n  spv::Id is_second_tile_half = builder_->createBinOp(\n      spv::OpINotEqual, type_bool_,\n      builder_->createBinOp(spv::OpBitwiseAnd, type_uint_, tile_half_index[0],\n                            const_uint_1),\n      const_uint_0_);\n\n  // Get the offset of the sample 0 within a depth / stencil surface, with\n  // samples 40...79 in the first half-tile, 0...39 in the second (flipped as\n  // opposed to color). Then add the EDRAM base for depth / stencil, and wrap\n  // addressing.\n  id_vector_temp_.clear();\n  id_vector_temp_.push_back(\n      builder_->makeIntConstant(kSystemConstantEdramDepthBaseDwordsScaled));\n  main_fsi_address_depth_ = builder_->createBinOp(\n      spv::OpUMod, type_uint_,\n      builder_->createBinOp(\n          spv::OpIAdd, type_uint_,\n          builder_->createLoad(builder_->createAccessChain(\n                                   spv::StorageClassUniform,\n                                   uniform_system_constants_, id_vector_temp_),\n                               spv::NoPrecision),\n          builder_->createBinOp(\n              spv::OpIAdd, type_uint_, offset_in_first_tile_half_at_32bpp,\n              builder_->createTriOp(spv::OpSelect, type_uint_,\n                                    is_second_tile_half, const_uint_0_,\n                                    const_tile_half_width))),\n      builder_->makeUintConstant(tile_size * xenos::kEdramTileCount));\n\n  if (current_shader().writes_color_targets()) {\n    // Get the offset of the sample 0 within a 32bpp surface, with samples\n    // 0...39 in the first half-tile, 40...79 in the second.\n    main_fsi_offset_32bpp_ = builder_->createBinOp(\n        spv::OpIAdd, type_uint_, offset_in_first_tile_half_at_32bpp,\n        builder_->createTriOp(spv::OpSelect, type_uint_, is_second_tile_half,\n                              const_tile_half_width, const_uint_0_));\n\n    // Get the offset of the sample 0 within a 64bpp surface.\n    main_fsi_offset_64bpp_ = builder_->createBinOp(\n        spv::OpIAdd, type_uint_,\n        builder_->createBinOp(\n            spv::OpIAdd, type_uint_,\n            builder_->createBinOp(spv::OpShiftLeftLogical, type_uint_,\n                                  tile_row_offset_at_32bpp, const_uint_1),\n            builder_->createBinOp(\n                spv::OpIAdd, type_uint_,\n                builder_->createBinOp(spv::OpIMul, type_uint_, const_tile_size,\n                                      tile_half_index[0]),\n                row_offset_in_tile_at_32bpp)),\n        builder_->createBinOp(spv::OpShiftLeftLogical, type_uint_,\n                              tile_half_sample_coordinates[0], const_uint_1));\n  }\n}\n\nspv::Id SpirvShaderTranslator::FSI_AddSampleOffset(spv::Id sample_0_address,\n                                                   uint32_t sample_index,\n                                                   spv::Id is_64bpp) {\n  if (!sample_index) {\n    return sample_0_address;\n  }\n  spv::Id sample_offset;\n  // TODO(Triang3l): Resolution scaling.\n  uint32_t tile_width = xenos::kEdramTileWidthSamples;\n  if (sample_index == 1) {\n    sample_offset = builder_->makeIntConstant(tile_width);\n  } else {\n    spv::Id sample_offset_32bpp = builder_->makeIntConstant(\n        tile_width * (sample_index & 1) + (sample_index >> 1));\n    if (is_64bpp != spv::NoResult) {\n      sample_offset = builder_->createTriOp(\n          spv::OpSelect, type_int_, is_64bpp,\n          builder_->makeIntConstant(tile_width * (sample_index & 1) +\n                                    2 * (sample_index >> 1)),\n          sample_offset_32bpp);\n    } else {\n      sample_offset = sample_offset_32bpp;\n    }\n  }\n  return builder_->createBinOp(spv::OpIAdd, type_int_, sample_0_address,\n                               sample_offset);\n}\n\nvoid SpirvShaderTranslator::FSI_DepthStencilTest(\n    spv::Id msaa_samples, bool sample_mask_potentially_narrowed_previouly) {\n  bool is_early = FSI_IsDepthStencilEarly();\n  bool implicit_early_z_write_allowed =\n      current_shader().implicit_early_z_write_allowed();\n  spv::Id const_uint_1 = builder_->makeUintConstant(1);\n  spv::Id const_uint_8 = builder_->makeUintConstant(8);\n\n  // Check if depth or stencil testing is needed.\n  spv::Id depth_stencil_enabled = builder_->createBinOp(\n      spv::OpINotEqual, type_bool_,\n      builder_->createBinOp(\n          spv::OpBitwiseAnd, type_uint_, main_system_constant_flags_,\n          builder_->makeUintConstant(kSysFlag_FSIDepthStencil)),\n      const_uint_0_);\n  SpirvBuilder::IfBuilder if_depth_stencil_enabled(\n      depth_stencil_enabled, spv::SelectionControlDontFlattenMask, *builder_);\n\n  // Load the depth in the center of the pixel and calculate the derivatives of\n  // the depth outside non-uniform control flow.\n  assert_true(input_fragment_coordinates_ != spv::NoResult);\n  id_vector_temp_.clear();\n  id_vector_temp_.push_back(builder_->makeIntConstant(2));\n  spv::Id center_depth32_unbiased = builder_->createLoad(\n      builder_->createAccessChain(spv::StorageClassInput,\n                                  input_fragment_coordinates_, id_vector_temp_),\n      spv::NoPrecision);\n  builder_->addCapability(spv::CapabilityDerivativeControl);\n  std::array<spv::Id, 2> depth_dxy;\n  depth_dxy[0] = builder_->createUnaryOp(spv::OpDPdxCoarse, type_float_,\n                                         center_depth32_unbiased);\n  depth_dxy[1] = builder_->createUnaryOp(spv::OpDPdyCoarse, type_float_,\n                                         center_depth32_unbiased);\n\n  // Skip everything if potentially discarded all the samples previously in the\n  // shader.\n  spv::Block* block_any_sample_covered_head = nullptr;\n  spv::Block* block_any_sample_covered = nullptr;\n  spv::Block* block_any_sample_covered_merge = nullptr;\n  if (sample_mask_potentially_narrowed_previouly) {\n    spv::Id any_sample_covered = builder_->createBinOp(\n        spv::OpINotEqual, type_bool_, main_fsi_sample_mask_, const_uint_0_);\n    block_any_sample_covered_head = builder_->getBuildPoint();\n    block_any_sample_covered = &builder_->makeNewBlock();\n    block_any_sample_covered_merge = &builder_->makeNewBlock();\n    builder_->createSelectionMerge(block_any_sample_covered_merge,\n                                   spv::SelectionControlDontFlattenMask);\n    builder_->createConditionalBranch(any_sample_covered,\n                                      block_any_sample_covered,\n                                      block_any_sample_covered_merge);\n    builder_->setBuildPoint(block_any_sample_covered);\n  }\n\n  // Load values involved in depth and stencil testing.\n  spv::Id msaa_is_2x_4x = builder_->createBinOp(\n      spv::OpUGreaterThanEqual, type_bool_, msaa_samples,\n      builder_->makeUintConstant(uint32_t(xenos::MsaaSamples::k2X)));\n  spv::Id msaa_is_4x = builder_->createBinOp(\n      spv::OpUGreaterThanEqual, type_bool_, msaa_samples,\n      builder_->makeUintConstant(uint32_t(xenos::MsaaSamples::k4X)));\n  spv::Id depth_is_float24 = builder_->createBinOp(\n      spv::OpINotEqual, type_bool_,\n      builder_->createBinOp(spv::OpBitwiseAnd, type_uint_,\n                            main_system_constant_flags_,\n                            builder_->makeUintConstant(kSysFlag_DepthFloat24)),\n      const_uint_0_);\n  spv::Id depth_pass_if_less = builder_->createBinOp(\n      spv::OpINotEqual, type_bool_,\n      builder_->createBinOp(\n          spv::OpBitwiseAnd, type_uint_, main_system_constant_flags_,\n          builder_->makeUintConstant(kSysFlag_FSIDepthPassIfLess)),\n      const_uint_0_);\n  spv::Id depth_pass_if_equal = builder_->createBinOp(\n      spv::OpINotEqual, type_bool_,\n      builder_->createBinOp(\n          spv::OpBitwiseAnd, type_uint_, main_system_constant_flags_,\n          builder_->makeUintConstant(kSysFlag_FSIDepthPassIfEqual)),\n      const_uint_0_);\n  spv::Id depth_pass_if_greater = builder_->createBinOp(\n      spv::OpINotEqual, type_bool_,\n      builder_->createBinOp(\n          spv::OpBitwiseAnd, type_uint_, main_system_constant_flags_,\n          builder_->makeUintConstant(kSysFlag_FSIDepthPassIfGreater)),\n      const_uint_0_);\n  spv::Id depth_write = builder_->createBinOp(\n      spv::OpINotEqual, type_bool_,\n      builder_->createBinOp(spv::OpBitwiseAnd, type_uint_,\n                            main_system_constant_flags_,\n                            builder_->makeUintConstant(kSysFlag_FSIDepthWrite)),\n      const_uint_0_);\n  spv::Id stencil_enabled = builder_->createBinOp(\n      spv::OpINotEqual, type_bool_,\n      builder_->createBinOp(\n          spv::OpBitwiseAnd, type_uint_, main_system_constant_flags_,\n          builder_->makeUintConstant(kSysFlag_FSIStencilTest)),\n      const_uint_0_);\n  spv::Id early_write =\n      (is_early && implicit_early_z_write_allowed)\n          ? builder_->createBinOp(\n                spv::OpINotEqual, type_bool_,\n                builder_->createBinOp(spv::OpBitwiseAnd, type_uint_,\n                                      main_system_constant_flags_,\n                                      builder_->makeUintConstant(\n                                          kSysFlag_FSIDepthStencilEarlyWrite)),\n                const_uint_0_)\n          : spv::NoResult;\n  spv::Id not_early_write =\n      (is_early && implicit_early_z_write_allowed)\n          ? builder_->createUnaryOp(spv::OpLogicalNot, type_bool_, early_write)\n          : spv::NoResult;\n  assert_true(input_front_facing_ != spv::NoResult);\n  spv::Id front_facing =\n      builder_->createLoad(input_front_facing_, spv::NoPrecision);\n  spv::Id poly_offset_scale, poly_offset_offset, stencil_parameters;\n  {\n    id_vector_temp_.clear();\n    id_vector_temp_.push_back(\n        builder_->makeIntConstant(kSystemConstantEdramPolyOffsetFrontScale));\n    spv::Id poly_offset_front_scale = builder_->createLoad(\n        builder_->createAccessChain(spv::StorageClassUniform,\n                                    uniform_system_constants_, id_vector_temp_),\n        spv::NoPrecision);\n    id_vector_temp_.clear();\n    id_vector_temp_.push_back(\n        builder_->makeIntConstant(kSystemConstantEdramPolyOffsetBackScale));\n    spv::Id poly_offset_back_scale = builder_->createLoad(\n        builder_->createAccessChain(spv::StorageClassUniform,\n                                    uniform_system_constants_, id_vector_temp_),\n        spv::NoPrecision);\n    poly_offset_scale =\n        builder_->createTriOp(spv::OpSelect, type_float_, front_facing,\n                              poly_offset_front_scale, poly_offset_back_scale);\n    id_vector_temp_.clear();\n    id_vector_temp_.push_back(\n        builder_->makeIntConstant(kSystemConstantEdramPolyOffsetFrontOffset));\n    spv::Id poly_offset_front_offset = builder_->createLoad(\n        builder_->createAccessChain(spv::StorageClassUniform,\n                                    uniform_system_constants_, id_vector_temp_),\n        spv::NoPrecision);\n    id_vector_temp_.clear();\n    id_vector_temp_.push_back(\n        builder_->makeIntConstant(kSystemConstantEdramPolyOffsetBackOffset));\n    spv::Id poly_offset_back_offset = builder_->createLoad(\n        builder_->createAccessChain(spv::StorageClassUniform,\n                                    uniform_system_constants_, id_vector_temp_),\n        spv::NoPrecision);\n    poly_offset_offset = builder_->createTriOp(\n        spv::OpSelect, type_float_, front_facing, poly_offset_front_offset,\n        poly_offset_back_offset);\n    id_vector_temp_.clear();\n    id_vector_temp_.push_back(\n        builder_->makeIntConstant(kSystemConstantEdramStencilFront));\n    spv::Id stencil_parameters_front = builder_->createLoad(\n        builder_->createAccessChain(spv::StorageClassUniform,\n                                    uniform_system_constants_, id_vector_temp_),\n        spv::NoPrecision);\n    id_vector_temp_.clear();\n    id_vector_temp_.push_back(\n        builder_->makeIntConstant(kSystemConstantEdramStencilBack));\n    spv::Id stencil_parameters_back = builder_->createLoad(\n        builder_->createAccessChain(spv::StorageClassUniform,\n                                    uniform_system_constants_, id_vector_temp_),\n        spv::NoPrecision);\n    stencil_parameters = builder_->createTriOp(\n        spv::OpSelect, type_uint2_,\n        builder_->smearScalar(spv::NoPrecision, front_facing, type_bool2_),\n        stencil_parameters_front, stencil_parameters_back);\n  }\n  spv::Id stencil_reference_masks =\n      builder_->createCompositeExtract(stencil_parameters, type_uint_, 0);\n  spv::Id stencil_reference = builder_->createTriOp(\n      spv::OpBitFieldUExtract, type_uint_, stencil_reference_masks,\n      const_uint_0_, const_uint_8);\n  spv::Id stencil_read_mask = builder_->createTriOp(\n      spv::OpBitFieldUExtract, type_uint_, stencil_reference_masks,\n      const_uint_8, const_uint_8);\n  spv::Id stencil_reference_read_masked = builder_->createBinOp(\n      spv::OpBitwiseAnd, type_uint_, stencil_reference, stencil_read_mask);\n  spv::Id stencil_write_mask = builder_->createTriOp(\n      spv::OpBitFieldUExtract, type_uint_, stencil_reference_masks,\n      builder_->makeUintConstant(16), const_uint_8);\n  spv::Id stencil_write_keep_mask =\n      builder_->createUnaryOp(spv::OpNot, type_uint_, stencil_write_mask);\n  spv::Id stencil_func_ops =\n      builder_->createCompositeExtract(stencil_parameters, type_uint_, 1);\n  spv::Id stencil_pass_if_less = builder_->createBinOp(\n      spv::OpINotEqual, type_bool_,\n      builder_->createBinOp(spv::OpBitwiseAnd, type_uint_, stencil_func_ops,\n                            builder_->makeUintConstant(uint32_t(1) << 0)),\n      const_uint_0_);\n  spv::Id stencil_pass_if_equal = builder_->createBinOp(\n      spv::OpINotEqual, type_bool_,\n      builder_->createBinOp(spv::OpBitwiseAnd, type_uint_, stencil_func_ops,\n                            builder_->makeUintConstant(uint32_t(1) << 1)),\n      const_uint_0_);\n  spv::Id stencil_pass_if_greater = builder_->createBinOp(\n      spv::OpINotEqual, type_bool_,\n      builder_->createBinOp(spv::OpBitwiseAnd, type_uint_, stencil_func_ops,\n                            builder_->makeUintConstant(uint32_t(1) << 2)),\n      const_uint_0_);\n\n  // Get the maximum depth slope for the polygon offset.\n  // https://docs.microsoft.com/en-us/windows/desktop/direct3d9/depth-bias\n  std::array<spv::Id, 2> depth_dxy_abs;\n  for (uint32_t i = 0; i < 2; ++i) {\n    depth_dxy_abs[i] = builder_->createUnaryBuiltinCall(\n        type_float_, ext_inst_glsl_std_450_, GLSLstd450FAbs, depth_dxy[i]);\n  }\n  spv::Id depth_max_slope = builder_->createBinBuiltinCall(\n      type_float_, ext_inst_glsl_std_450_, GLSLstd450FMax, depth_dxy_abs[0],\n      depth_dxy_abs[1]);\n  // Calculate the polygon offset.\n  spv::Id slope_scaled_poly_offset = builder_->createNoContractionBinOp(\n      spv::OpFMul, type_float_, poly_offset_scale, depth_max_slope);\n  spv::Id poly_offset = builder_->createNoContractionBinOp(\n      spv::OpFAdd, type_float_, slope_scaled_poly_offset, poly_offset_offset);\n  // Apply the post-clip and post-viewport polygon offset to the fragment's\n  // depth. Not clamping yet as this is at the center, which is not necessarily\n  // covered and not necessarily inside the bounds - derivatives scaled by\n  // sample locations will be added to this value, and it must be linear.\n  spv::Id center_depth32_biased = builder_->createNoContractionBinOp(\n      spv::OpFAdd, type_float_, center_depth32_unbiased, poly_offset);\n\n  // Perform depth and stencil testing for each covered sample.\n  spv::Id new_sample_mask = main_fsi_sample_mask_;\n  std::array<spv::Id, 4> late_write_depth_stencil{};\n  for (uint32_t i = 0; i < 4; ++i) {\n    spv::Id sample_covered = builder_->createBinOp(\n        spv::OpINotEqual, type_bool_,\n        builder_->createBinOp(spv::OpBitwiseAnd, type_uint_, new_sample_mask,\n                              builder_->makeUintConstant(uint32_t(1) << i)),\n        const_uint_0_);\n    SpirvBuilder::IfBuilder if_sample_covered(\n        sample_covered, spv::SelectionControlDontFlattenMask, *builder_);\n\n    // Load the original depth and stencil for the sample.\n    spv::Id sample_address = FSI_AddSampleOffset(main_fsi_address_depth_, i);\n    id_vector_temp_.clear();\n    // First SSBO structure element.\n    id_vector_temp_.push_back(const_int_0_);\n    id_vector_temp_.push_back(sample_address);\n    spv::Id sample_access_chain = builder_->createAccessChain(\n        features_.spirv_version >= spv::Spv_1_3 ? spv::StorageClassStorageBuffer\n                                                : spv::StorageClassUniform,\n        buffer_edram_, id_vector_temp_);\n    spv::Id old_depth_stencil =\n        builder_->createLoad(sample_access_chain, spv::NoPrecision);\n\n    // Calculate the new depth at the sample.\n    // interpolateAtSample(gl_FragCoord) is not valid in GLSL because\n    // gl_FragCoord is not an interpolator, calculating the depths at the\n    // samples manually.\n    std::array<spv::Id, 2> sample_location;\n    switch (i) {\n      case 0: {\n        // Center sample for no MSAA.\n        // Top-left sample for native 2x (top - 1 in Vulkan), 2x as 4x, 4x\n        // (0 in Vulkan).\n        // 4x on the host case.\n        for (uint32_t j = 0; j < 2; ++j) {\n          sample_location[j] = builder_->makeFloatConstant(\n              draw_util::kD3D10StandardSamplePositions4x[0][j] *\n              (1.0f / 16.0f));\n        }\n        if (native_2x_msaa_no_attachments_) {\n          // 2x on the host case.\n          for (uint32_t j = 0; j < 2; ++j) {\n            sample_location[j] = builder_->createTriOp(\n                spv::OpSelect, type_float_, msaa_is_4x, sample_location[j],\n                builder_->makeFloatConstant(\n                    draw_util::kD3D10StandardSamplePositions2x[1][j] *\n                    (1.0f / 16.0f)));\n          }\n        }\n        // 1x case.\n        for (uint32_t j = 0; j < 2; ++j) {\n          sample_location[j] =\n              builder_->createTriOp(spv::OpSelect, type_float_, msaa_is_2x_4x,\n                                    sample_location[j], const_float_0_);\n        }\n      } break;\n      case 1: {\n        // For guest 2x: bottom-right sample (bottom - 0 in Vulkan - for native\n        // 2x, bottom-right - 3 in Vulkan - for 2x as 4x).\n        // For guest 4x: bottom-left sample (2 in Vulkan).\n        for (uint32_t j = 0; j < 2; ++j) {\n          sample_location[j] = builder_->createTriOp(\n              spv::OpSelect, type_float_, msaa_is_4x,\n              builder_->makeFloatConstant(\n                  draw_util::kD3D10StandardSamplePositions4x[2][j] *\n                  (1.0f / 16.0f)),\n              builder_->makeFloatConstant(\n                  (native_2x_msaa_no_attachments_\n                       ? draw_util::kD3D10StandardSamplePositions2x[0][j]\n                       : draw_util::kD3D10StandardSamplePositions4x[3][j]) *\n                  (1.0f / 16.0f)));\n        }\n      } break;\n      default: {\n        // Xenia samples 2 and 3 (top-right and bottom-right) -> Vulkan samples\n        // 1 and 3.\n        const int8_t* sample_location_int = draw_util::\n            kD3D10StandardSamplePositions4x[i ^ (((i & 1) ^ (i >> 1)) * 0b11)];\n        for (uint32_t j = 0; j < 2; ++j) {\n          sample_location[j] = builder_->makeFloatConstant(\n              sample_location_int[j] * (1.0f / 16.0f));\n        }\n      } break;\n    }\n    std::array<spv::Id, 2> sample_depth_dxy;\n    for (uint32_t j = 0; j < 2; ++j) {\n      sample_depth_dxy[j] = builder_->createNoContractionBinOp(\n          spv::OpFMul, type_float_, sample_location[j], depth_dxy[j]);\n    }\n    spv::Id sample_depth32 = builder_->createTriBuiltinCall(\n        type_float_, ext_inst_glsl_std_450_, GLSLstd450NClamp,\n        builder_->createNoContractionBinOp(\n            spv::OpFAdd, type_float_, center_depth32_biased,\n            builder_->createNoContractionBinOp(spv::OpFAdd, type_float_,\n                                               sample_depth_dxy[0],\n                                               sample_depth_dxy[1])),\n        const_float_0_, const_float_1_);\n\n    // Convert the new depth to 24-bit.\n    SpirvBuilder::IfBuilder depth_format_if(\n        depth_is_float24, spv::SelectionControlDontFlattenMask, *builder_);\n    spv::Id sample_depth_float24 = SpirvShaderTranslator::PreClampedDepthTo20e4(\n        *builder_, sample_depth32, true, false, ext_inst_glsl_std_450_);\n    depth_format_if.makeBeginElse();\n    // Round to the nearest even integer. This seems to be the correct\n    // conversion, adding +0.5 and rounding towards zero results in red instead\n    // of black in the 4D5307E6 clear shader.\n    spv::Id sample_depth_unorm24 = builder_->createUnaryOp(\n        spv::OpConvertFToU, type_uint_,\n        builder_->createUnaryBuiltinCall(\n            type_float_, ext_inst_glsl_std_450_, GLSLstd450RoundEven,\n            builder_->createNoContractionBinOp(\n                spv::OpFMul, type_float_, sample_depth32,\n                builder_->makeFloatConstant(float(0xFFFFFF)))));\n    depth_format_if.makeEndIf();\n    // Merge between the two formats.\n    spv::Id sample_depth24 = depth_format_if.createMergePhi(\n        sample_depth_float24, sample_depth_unorm24);\n\n    // Perform the depth test.\n    spv::Id old_depth = builder_->createBinOp(\n        spv::OpShiftRightLogical, type_uint_, old_depth_stencil, const_uint_8);\n    spv::Id depth_passed = builder_->createBinOp(\n        spv::OpLogicalAnd, type_bool_, depth_pass_if_less,\n        builder_->createBinOp(spv::OpULessThan, type_bool_, sample_depth24,\n                              old_depth));\n    depth_passed = builder_->createBinOp(\n        spv::OpLogicalOr, type_bool_, depth_passed,\n        builder_->createBinOp(\n            spv::OpLogicalAnd, type_bool_, depth_pass_if_equal,\n            builder_->createBinOp(spv::OpIEqual, type_bool_, sample_depth24,\n                                  old_depth)));\n    depth_passed = builder_->createBinOp(\n        spv::OpLogicalOr, type_bool_, depth_passed,\n        builder_->createBinOp(\n            spv::OpLogicalAnd, type_bool_, depth_pass_if_greater,\n            builder_->createBinOp(spv::OpUGreaterThan, type_bool_,\n                                  sample_depth24, old_depth)));\n\n    // Perform the stencil test if enabled.\n    SpirvBuilder::IfBuilder stencil_if(\n        stencil_enabled, spv::SelectionControlDontFlattenMask, *builder_);\n    spv::Id stencil_passed_if_enabled;\n    spv::Id new_stencil_and_old_depth_if_stencil_enabled;\n    {\n      // The read mask has zeros in the upper bits, applying it to the combined\n      // stencil and depth will remove the depth part.\n      spv::Id old_stencil_read_masked = builder_->createBinOp(\n          spv::OpBitwiseAnd, type_uint_, old_depth_stencil, stencil_read_mask);\n      stencil_passed_if_enabled = builder_->createBinOp(\n          spv::OpLogicalAnd, type_bool_, stencil_pass_if_less,\n          builder_->createBinOp(spv::OpULessThan, type_bool_,\n                                stencil_reference_read_masked,\n                                old_stencil_read_masked));\n      stencil_passed_if_enabled = builder_->createBinOp(\n          spv::OpLogicalOr, type_bool_, stencil_passed_if_enabled,\n          builder_->createBinOp(\n              spv::OpLogicalAnd, type_bool_, stencil_pass_if_equal,\n              builder_->createBinOp(spv::OpIEqual, type_bool_,\n                                    stencil_reference_read_masked,\n                                    old_stencil_read_masked)));\n      stencil_passed_if_enabled = builder_->createBinOp(\n          spv::OpLogicalOr, type_bool_, stencil_passed_if_enabled,\n          builder_->createBinOp(\n              spv::OpLogicalAnd, type_bool_, stencil_pass_if_greater,\n              builder_->createBinOp(spv::OpUGreaterThan, type_bool_,\n                                    stencil_reference_read_masked,\n                                    old_stencil_read_masked)));\n      spv::Id stencil_op = builder_->createTriOp(\n          spv::OpBitFieldUExtract, type_uint_, stencil_func_ops,\n          builder_->createTriOp(\n              spv::OpSelect, type_uint_, stencil_passed_if_enabled,\n              builder_->createTriOp(spv::OpSelect, type_uint_, depth_passed,\n                                    builder_->makeUintConstant(6),\n                                    builder_->makeUintConstant(9)),\n              builder_->makeUintConstant(3)),\n          builder_->makeUintConstant(3));\n      spv::Block& block_stencil_op_head = *builder_->getBuildPoint();\n      spv::Block& block_stencil_op_keep = builder_->makeNewBlock();\n      spv::Block& block_stencil_op_zero = builder_->makeNewBlock();\n      spv::Block& block_stencil_op_replace = builder_->makeNewBlock();\n      spv::Block& block_stencil_op_increment_clamp = builder_->makeNewBlock();\n      spv::Block& block_stencil_op_decrement_clamp = builder_->makeNewBlock();\n      spv::Block& block_stencil_op_invert = builder_->makeNewBlock();\n      spv::Block& block_stencil_op_increment_wrap = builder_->makeNewBlock();\n      spv::Block& block_stencil_op_decrement_wrap = builder_->makeNewBlock();\n      spv::Block& block_stencil_op_merge = builder_->makeNewBlock();\n      builder_->createSelectionMerge(&block_stencil_op_merge,\n                                     spv::SelectionControlDontFlattenMask);\n      {\n        std::unique_ptr<spv::Instruction> stencil_op_switch_op =\n            std::make_unique<spv::Instruction>(spv::OpSwitch);\n        stencil_op_switch_op->addIdOperand(stencil_op);\n        // Make keep the default.\n        stencil_op_switch_op->addIdOperand(block_stencil_op_keep.getId());\n        stencil_op_switch_op->addImmediateOperand(\n            int32_t(xenos::StencilOp::kZero));\n        stencil_op_switch_op->addIdOperand(block_stencil_op_zero.getId());\n        stencil_op_switch_op->addImmediateOperand(\n            int32_t(xenos::StencilOp::kReplace));\n        stencil_op_switch_op->addIdOperand(block_stencil_op_replace.getId());\n        stencil_op_switch_op->addImmediateOperand(\n            int32_t(xenos::StencilOp::kIncrementClamp));\n        stencil_op_switch_op->addIdOperand(\n            block_stencil_op_increment_clamp.getId());\n        stencil_op_switch_op->addImmediateOperand(\n            int32_t(xenos::StencilOp::kDecrementClamp));\n        stencil_op_switch_op->addIdOperand(\n            block_stencil_op_decrement_clamp.getId());\n        stencil_op_switch_op->addImmediateOperand(\n            int32_t(xenos::StencilOp::kInvert));\n        stencil_op_switch_op->addIdOperand(block_stencil_op_invert.getId());\n        stencil_op_switch_op->addImmediateOperand(\n            int32_t(xenos::StencilOp::kIncrementWrap));\n        stencil_op_switch_op->addIdOperand(\n            block_stencil_op_increment_wrap.getId());\n        stencil_op_switch_op->addImmediateOperand(\n            int32_t(xenos::StencilOp::kDecrementWrap));\n        stencil_op_switch_op->addIdOperand(\n            block_stencil_op_decrement_wrap.getId());\n        builder_->getBuildPoint()->addInstruction(\n            std::move(stencil_op_switch_op));\n      }\n      block_stencil_op_keep.addPredecessor(&block_stencil_op_head);\n      block_stencil_op_zero.addPredecessor(&block_stencil_op_head);\n      block_stencil_op_replace.addPredecessor(&block_stencil_op_head);\n      block_stencil_op_increment_clamp.addPredecessor(&block_stencil_op_head);\n      block_stencil_op_decrement_clamp.addPredecessor(&block_stencil_op_head);\n      block_stencil_op_invert.addPredecessor(&block_stencil_op_head);\n      block_stencil_op_increment_wrap.addPredecessor(&block_stencil_op_head);\n      block_stencil_op_decrement_wrap.addPredecessor(&block_stencil_op_head);\n      // Keep - will use the old stencil in the phi.\n      builder_->setBuildPoint(&block_stencil_op_keep);\n      builder_->createBranch(&block_stencil_op_merge);\n      // Zero - will use the zero constant in the phi.\n      builder_->setBuildPoint(&block_stencil_op_zero);\n      builder_->createBranch(&block_stencil_op_merge);\n      // Replace - will use the stencil reference in the phi.\n      builder_->setBuildPoint(&block_stencil_op_replace);\n      builder_->createBranch(&block_stencil_op_merge);\n      // Increment and clamp.\n      builder_->setBuildPoint(&block_stencil_op_increment_clamp);\n      spv::Id new_stencil_in_low_bits_increment_clamp = builder_->createBinOp(\n          spv::OpIAdd, type_uint_,\n          builder_->createBinBuiltinCall(\n              type_uint_, ext_inst_glsl_std_450_, GLSLstd450UMin,\n              builder_->makeUintConstant(UINT8_MAX - 1),\n              builder_->createBinOp(spv::OpBitwiseAnd, type_uint_,\n                                    old_depth_stencil,\n                                    builder_->makeUintConstant(UINT8_MAX))),\n          const_uint_1);\n      builder_->createBranch(&block_stencil_op_merge);\n      // Decrement and clamp.\n      builder_->setBuildPoint(&block_stencil_op_decrement_clamp);\n      spv::Id new_stencil_in_low_bits_decrement_clamp = builder_->createBinOp(\n          spv::OpISub, type_uint_,\n          builder_->createBinBuiltinCall(\n              type_uint_, ext_inst_glsl_std_450_, GLSLstd450UMax, const_uint_1,\n              builder_->createBinOp(spv::OpBitwiseAnd, type_uint_,\n                                    old_depth_stencil,\n                                    builder_->makeUintConstant(UINT8_MAX))),\n          const_uint_1);\n      builder_->createBranch(&block_stencil_op_merge);\n      // Invert.\n      builder_->setBuildPoint(&block_stencil_op_invert);\n      spv::Id new_stencil_in_low_bits_invert =\n          builder_->createUnaryOp(spv::OpNot, type_uint_, old_depth_stencil);\n      builder_->createBranch(&block_stencil_op_merge);\n      // Increment and wrap.\n      // The upper bits containing the old depth have no effect on the behavior.\n      builder_->setBuildPoint(&block_stencil_op_increment_wrap);\n      spv::Id new_stencil_in_low_bits_increment_wrap = builder_->createBinOp(\n          spv::OpIAdd, type_uint_, old_depth_stencil, const_uint_1);\n      builder_->createBranch(&block_stencil_op_merge);\n      // Decrement and wrap.\n      // The upper bits containing the old depth have no effect on the behavior.\n      builder_->setBuildPoint(&block_stencil_op_decrement_wrap);\n      spv::Id new_stencil_in_low_bits_decrement_wrap = builder_->createBinOp(\n          spv::OpISub, type_uint_, old_depth_stencil, const_uint_1);\n      builder_->createBranch(&block_stencil_op_merge);\n      // Select the new stencil (with undefined data in bits starting from 8)\n      // based on the stencil operation.\n      builder_->setBuildPoint(&block_stencil_op_merge);\n      id_vector_temp_.clear();\n      id_vector_temp_.reserve(2 * 8);\n      id_vector_temp_.push_back(old_depth_stencil);\n      id_vector_temp_.push_back(block_stencil_op_keep.getId());\n      id_vector_temp_.push_back(const_uint_0_);\n      id_vector_temp_.push_back(block_stencil_op_zero.getId());\n      id_vector_temp_.push_back(stencil_reference);\n      id_vector_temp_.push_back(block_stencil_op_replace.getId());\n      id_vector_temp_.push_back(new_stencil_in_low_bits_increment_clamp);\n      id_vector_temp_.push_back(block_stencil_op_increment_clamp.getId());\n      id_vector_temp_.push_back(new_stencil_in_low_bits_decrement_clamp);\n      id_vector_temp_.push_back(block_stencil_op_decrement_clamp.getId());\n      id_vector_temp_.push_back(new_stencil_in_low_bits_invert);\n      id_vector_temp_.push_back(block_stencil_op_invert.getId());\n      id_vector_temp_.push_back(new_stencil_in_low_bits_increment_wrap);\n      id_vector_temp_.push_back(block_stencil_op_increment_wrap.getId());\n      id_vector_temp_.push_back(new_stencil_in_low_bits_decrement_wrap);\n      id_vector_temp_.push_back(block_stencil_op_decrement_wrap.getId());\n      spv::Id new_stencil_in_low_bits_if_enabled =\n          builder_->createOp(spv::OpPhi, type_uint_, id_vector_temp_);\n      // Merge the old depth / stencil (old depth kept from the old depth /\n      // stencil so the separate old depth register is not needed anymore after\n      // the depth test) and the new stencil based on the write mask.\n      new_stencil_and_old_depth_if_stencil_enabled = builder_->createBinOp(\n          spv::OpBitwiseOr, type_uint_,\n          builder_->createBinOp(spv::OpBitwiseAnd, type_uint_,\n                                old_depth_stencil, stencil_write_keep_mask),\n          builder_->createBinOp(spv::OpBitwiseAnd, type_uint_,\n                                new_stencil_in_low_bits_if_enabled,\n                                stencil_write_mask));\n    }\n    stencil_if.makeEndIf();\n    // Choose the result based on whether the stencil test was done.\n    // All phi operations must be the first in the block.\n    spv::Id stencil_passed = stencil_if.createMergePhi(\n        stencil_passed_if_enabled, builder_->makeBoolConstant(true));\n    spv::Id new_stencil_and_old_depth = stencil_if.createMergePhi(\n        new_stencil_and_old_depth_if_stencil_enabled, old_depth_stencil);\n\n    // Check whether the tests have passed, and exclude the bit from the\n    // coverage if not.\n    spv::Id depth_stencil_passed = builder_->createBinOp(\n        spv::OpLogicalAnd, type_bool_, depth_passed, stencil_passed);\n    spv::Id new_sample_mask_after_sample = builder_->createTriOp(\n        spv::OpSelect, type_uint_, depth_stencil_passed, new_sample_mask,\n        builder_->createBinOp(spv::OpBitwiseAnd, type_uint_, new_sample_mask,\n                              builder_->makeUintConstant(~(uint32_t(1) << i))));\n\n    // Combine the new depth and the new stencil taking into account whether the\n    // new depth should be written.\n    spv::Id new_stencil_and_unconditional_new_depth = builder_->createQuadOp(\n        spv::OpBitFieldInsert, type_uint_, new_stencil_and_old_depth,\n        sample_depth24, const_uint_8, builder_->makeUintConstant(24));\n    spv::Id new_depth_stencil = builder_->createTriOp(\n        spv::OpSelect, type_uint_,\n        builder_->createBinOp(spv::OpLogicalAnd, type_bool_,\n                              depth_stencil_passed, depth_write),\n        new_stencil_and_unconditional_new_depth, new_stencil_and_old_depth);\n\n    // Write (or defer writing if the test is early, but may discard samples\n    // later still) the new depth and stencil if they're different.\n    spv::Id new_depth_stencil_different = builder_->createBinOp(\n        spv::OpINotEqual, type_bool_, new_depth_stencil, old_depth_stencil);\n    spv::Id new_depth_stencil_write_condition = spv::NoResult;\n    if (is_early) {\n      if (implicit_early_z_write_allowed) {\n        new_sample_mask_after_sample = builder_->createTriOp(\n            spv::OpSelect, type_uint_,\n            builder_->createBinOp(spv::OpLogicalAnd, type_bool_,\n                                  new_depth_stencil_different, not_early_write),\n            builder_->createBinOp(\n                spv::OpBitwiseOr, type_uint_, new_sample_mask_after_sample,\n                builder_->makeUintConstant(uint32_t(1) << (4 + i))),\n            new_sample_mask_after_sample);\n        new_depth_stencil_write_condition =\n            builder_->createBinOp(spv::OpLogicalAnd, type_bool_,\n                                  new_depth_stencil_different, early_write);\n      } else {\n        // Always need to write late in this shader, as it may do something like\n        // explicitly killing pixels.\n        new_sample_mask_after_sample = builder_->createTriOp(\n            spv::OpSelect, type_uint_, new_depth_stencil_different,\n            builder_->createBinOp(\n                spv::OpBitwiseOr, type_uint_, new_sample_mask_after_sample,\n                builder_->makeUintConstant(uint32_t(1) << (4 + i))),\n            new_sample_mask_after_sample);\n      }\n    } else {\n      new_depth_stencil_write_condition = new_depth_stencil_different;\n    }\n    if (new_depth_stencil_write_condition != spv::NoResult) {\n      SpirvBuilder::IfBuilder new_depth_stencil_write_if(\n          new_depth_stencil_write_condition,\n          spv::SelectionControlDontFlattenMask, *builder_);\n      builder_->createStore(new_depth_stencil, sample_access_chain);\n      new_depth_stencil_write_if.makeEndIf();\n    }\n\n    if_sample_covered.makeEndIf();\n    new_sample_mask = if_sample_covered.createMergePhi(\n        new_sample_mask_after_sample, new_sample_mask);\n    if (is_early) {\n      late_write_depth_stencil[i] =\n          if_sample_covered.createMergePhi(new_depth_stencil, const_uint_0_);\n    }\n  }\n\n  // Close the conditionals for whether depth / stencil testing is needed.\n  if (block_any_sample_covered_merge) {\n    builder_->createBranch(block_any_sample_covered_merge);\n    spv::Block& block_any_sample_covered_end = *builder_->getBuildPoint();\n    builder_->setBuildPoint(block_any_sample_covered_merge);\n    id_vector_temp_.clear();\n    id_vector_temp_.push_back(new_sample_mask);\n    id_vector_temp_.push_back(block_any_sample_covered_end.getId());\n    id_vector_temp_.push_back(main_fsi_sample_mask_);\n    id_vector_temp_.push_back(block_any_sample_covered_head->getId());\n    new_sample_mask =\n        builder_->createOp(spv::OpPhi, type_uint_, id_vector_temp_);\n    if (is_early) {\n      for (uint32_t i = 0; i < 4; ++i) {\n        id_vector_temp_.clear();\n        id_vector_temp_.push_back(late_write_depth_stencil[i]);\n        id_vector_temp_.push_back(block_any_sample_covered_end.getId());\n        id_vector_temp_.push_back(const_uint_0_);\n        id_vector_temp_.push_back(block_any_sample_covered_head->getId());\n        late_write_depth_stencil[i] =\n            builder_->createOp(spv::OpPhi, type_uint_, id_vector_temp_);\n      }\n    }\n  }\n  if_depth_stencil_enabled.makeEndIf();\n  main_fsi_sample_mask_ = if_depth_stencil_enabled.createMergePhi(\n      new_sample_mask, main_fsi_sample_mask_);\n  if (is_early) {\n    for (uint32_t i = 0; i < 4; ++i) {\n      main_fsi_late_write_depth_stencil_[i] =\n          if_depth_stencil_enabled.createMergePhi(late_write_depth_stencil[i],\n                                                  const_uint_0_);\n    }\n  }\n}\n\nstd::array<spv::Id, 2> SpirvShaderTranslator::FSI_ClampAndPackColor(\n    spv::Id color_float4, spv::Id format_with_flags) {\n  spv::Block& block_format_head = *builder_->getBuildPoint();\n  spv::Block& block_format_8_8_8_8 = builder_->makeNewBlock();\n  spv::Block& block_format_8_8_8_8_gamma = builder_->makeNewBlock();\n  spv::Block& block_format_2_10_10_10 = builder_->makeNewBlock();\n  spv::Block& block_format_2_10_10_10_float = builder_->makeNewBlock();\n  spv::Block& block_format_16 = builder_->makeNewBlock();\n  spv::Block& block_format_16_float = builder_->makeNewBlock();\n  spv::Block& block_format_32_float = builder_->makeNewBlock();\n  spv::Block& block_format_merge = builder_->makeNewBlock();\n  builder_->createSelectionMerge(&block_format_merge,\n                                 spv::SelectionControlDontFlattenMask);\n  {\n    std::unique_ptr<spv::Instruction> format_switch_op =\n        std::make_unique<spv::Instruction>(spv::OpSwitch);\n    format_switch_op->addIdOperand(format_with_flags);\n    // Make k_32_FLOAT or k_32_32_FLOAT the default.\n    format_switch_op->addIdOperand(block_format_32_float.getId());\n    format_switch_op->addImmediateOperand(\n        int32_t(RenderTargetCache::AddPSIColorFormatFlags(\n            xenos::ColorRenderTargetFormat::k_8_8_8_8)));\n    format_switch_op->addIdOperand(block_format_8_8_8_8.getId());\n    format_switch_op->addImmediateOperand(\n        int32_t(RenderTargetCache::AddPSIColorFormatFlags(\n            xenos::ColorRenderTargetFormat::k_8_8_8_8_GAMMA)));\n    format_switch_op->addIdOperand(block_format_8_8_8_8_gamma.getId());\n    format_switch_op->addImmediateOperand(\n        int32_t(RenderTargetCache::AddPSIColorFormatFlags(\n            xenos::ColorRenderTargetFormat::k_2_10_10_10)));\n    format_switch_op->addIdOperand(block_format_2_10_10_10.getId());\n    format_switch_op->addImmediateOperand(\n        int32_t(RenderTargetCache::AddPSIColorFormatFlags(\n            xenos::ColorRenderTargetFormat::k_2_10_10_10_AS_10_10_10_10)));\n    format_switch_op->addIdOperand(block_format_2_10_10_10.getId());\n    format_switch_op->addImmediateOperand(\n        int32_t(RenderTargetCache::AddPSIColorFormatFlags(\n            xenos::ColorRenderTargetFormat::k_2_10_10_10_FLOAT)));\n    format_switch_op->addIdOperand(block_format_2_10_10_10_float.getId());\n    format_switch_op->addImmediateOperand(\n        int32_t(RenderTargetCache::AddPSIColorFormatFlags(\n            xenos::ColorRenderTargetFormat ::\n                k_2_10_10_10_FLOAT_AS_16_16_16_16)));\n    format_switch_op->addIdOperand(block_format_2_10_10_10_float.getId());\n    format_switch_op->addImmediateOperand(\n        int32_t(RenderTargetCache::AddPSIColorFormatFlags(\n            xenos::ColorRenderTargetFormat::k_16_16)));\n    format_switch_op->addIdOperand(block_format_16.getId());\n    format_switch_op->addImmediateOperand(\n        int32_t(RenderTargetCache::AddPSIColorFormatFlags(\n            xenos::ColorRenderTargetFormat::k_16_16_16_16)));\n    format_switch_op->addIdOperand(block_format_16.getId());\n    format_switch_op->addImmediateOperand(\n        int32_t(RenderTargetCache::AddPSIColorFormatFlags(\n            xenos::ColorRenderTargetFormat::k_16_16_FLOAT)));\n    format_switch_op->addIdOperand(block_format_16_float.getId());\n    format_switch_op->addImmediateOperand(\n        int32_t(RenderTargetCache::AddPSIColorFormatFlags(\n            xenos::ColorRenderTargetFormat::k_16_16_16_16_FLOAT)));\n    format_switch_op->addIdOperand(block_format_16_float.getId());\n    builder_->getBuildPoint()->addInstruction(std::move(format_switch_op));\n  }\n  block_format_8_8_8_8.addPredecessor(&block_format_head);\n  block_format_8_8_8_8_gamma.addPredecessor(&block_format_head);\n  block_format_2_10_10_10.addPredecessor(&block_format_head);\n  block_format_2_10_10_10_float.addPredecessor(&block_format_head);\n  block_format_16.addPredecessor(&block_format_head);\n  block_format_16_float.addPredecessor(&block_format_head);\n  block_format_32_float.addPredecessor(&block_format_head);\n\n  spv::Id unorm_round_offset_float = builder_->makeFloatConstant(0.5f);\n  id_vector_temp_.clear();\n  id_vector_temp_.resize(4, unorm_round_offset_float);\n  spv::Id unorm_round_offset_float4 =\n      builder_->makeCompositeConstant(type_float4_, id_vector_temp_);\n\n  // ***************************************************************************\n  // k_8_8_8_8\n  // ***************************************************************************\n  spv::Id packed_8_8_8_8;\n  {\n    builder_->setBuildPoint(&block_format_8_8_8_8);\n    spv::Id color_scaled = builder_->createNoContractionBinOp(\n        spv::OpVectorTimesScalar, type_float4_,\n        builder_->createTriBuiltinCall(type_float4_, ext_inst_glsl_std_450_,\n                                       GLSLstd450NClamp, color_float4,\n                                       const_float4_0_, const_float4_1_),\n        builder_->makeFloatConstant(255.0f));\n    spv::Id color_offset = builder_->createNoContractionBinOp(\n        spv::OpFAdd, type_float4_, color_scaled, unorm_round_offset_float4);\n    spv::Id color_uint4 =\n        builder_->createUnaryOp(spv::OpConvertFToU, type_uint4_, color_offset);\n    packed_8_8_8_8 =\n        builder_->createCompositeExtract(color_uint4, type_uint_, 0);\n    spv::Id component_width = builder_->makeUintConstant(8);\n    for (uint32_t i = 1; i < 4; ++i) {\n      packed_8_8_8_8 = builder_->createQuadOp(\n          spv::OpBitFieldInsert, type_uint_, packed_8_8_8_8,\n          builder_->createCompositeExtract(color_uint4, type_uint_, i),\n          builder_->makeUintConstant(8 * i), component_width);\n    }\n    builder_->createBranch(&block_format_merge);\n  }\n  spv::Block& block_format_8_8_8_8_end = *builder_->getBuildPoint();\n\n  // ***************************************************************************\n  // k_8_8_8_8_GAMMA\n  // ***************************************************************************\n  spv::Id packed_8_8_8_8_gamma;\n  {\n    builder_->setBuildPoint(&block_format_8_8_8_8_gamma);\n    uint_vector_temp_.clear();\n    uint_vector_temp_.push_back(0);\n    uint_vector_temp_.push_back(1);\n    uint_vector_temp_.push_back(2);\n    spv::Id color_rgb = builder_->createRvalueSwizzle(\n        spv::NoPrecision, type_float3_, color_float4, uint_vector_temp_);\n    spv::Id rgb_gamma = LinearToPWLGamma(\n        builder_->createRvalueSwizzle(spv::NoPrecision, type_float3_,\n                                      color_float4, uint_vector_temp_),\n        false);\n    spv::Id alpha_clamped = builder_->createTriBuiltinCall(\n        type_float_, ext_inst_glsl_std_450_, GLSLstd450NClamp,\n        builder_->createCompositeExtract(color_float4, type_float_, 3),\n        const_float_0_, const_float_1_);\n    // Bypass the `getNumTypeConstituents(typeId) == (int)constituents.size()`\n    // assertion in createCompositeConstruct, OpCompositeConstruct can\n    // construct vectors not only from scalars, but also from other vectors.\n    spv::Id color_gamma;\n    {\n      std::unique_ptr<spv::Instruction> color_gamma_composite_construct_op =\n          std::make_unique<spv::Instruction>(\n              builder_->getUniqueId(), type_float4_, spv::OpCompositeConstruct);\n      color_gamma_composite_construct_op->addIdOperand(rgb_gamma);\n      color_gamma_composite_construct_op->addIdOperand(alpha_clamped);\n      color_gamma = color_gamma_composite_construct_op->getResultId();\n      builder_->getBuildPoint()->addInstruction(\n          std::move(color_gamma_composite_construct_op));\n    }\n    spv::Id color_scaled = builder_->createNoContractionBinOp(\n        spv::OpVectorTimesScalar, type_float4_, color_gamma,\n        builder_->makeFloatConstant(255.0f));\n    spv::Id color_offset = builder_->createNoContractionBinOp(\n        spv::OpFAdd, type_float4_, color_scaled, unorm_round_offset_float4);\n    spv::Id color_uint4 =\n        builder_->createUnaryOp(spv::OpConvertFToU, type_uint4_, color_offset);\n    packed_8_8_8_8_gamma =\n        builder_->createCompositeExtract(color_uint4, type_uint_, 0);\n    spv::Id component_width = builder_->makeUintConstant(8);\n    for (uint32_t i = 1; i < 4; ++i) {\n      packed_8_8_8_8_gamma = builder_->createQuadOp(\n          spv::OpBitFieldInsert, type_uint_, packed_8_8_8_8_gamma,\n          builder_->createCompositeExtract(color_uint4, type_uint_, i),\n          builder_->makeUintConstant(8 * i), component_width);\n    }\n    builder_->createBranch(&block_format_merge);\n  }\n  spv::Block& block_format_8_8_8_8_gamma_end = *builder_->getBuildPoint();\n\n  // ***************************************************************************\n  // k_2_10_10_10\n  // k_2_10_10_10_AS_10_10_10_10\n  // ***************************************************************************\n  spv::Id packed_2_10_10_10;\n  {\n    builder_->setBuildPoint(&block_format_2_10_10_10);\n    spv::Id color_clamped = builder_->createTriBuiltinCall(\n        type_float4_, ext_inst_glsl_std_450_, GLSLstd450NClamp, color_float4,\n        const_float4_0_, const_float4_1_);\n    id_vector_temp_.clear();\n    id_vector_temp_.resize(3, builder_->makeFloatConstant(1023.0f));\n    id_vector_temp_.push_back(builder_->makeFloatConstant(3.0f));\n    spv::Id color_scaled = builder_->createNoContractionBinOp(\n        spv::OpFMul, type_float4_, color_clamped,\n        builder_->makeCompositeConstant(type_float4_, id_vector_temp_));\n    spv::Id color_offset = builder_->createNoContractionBinOp(\n        spv::OpFAdd, type_float4_, color_scaled, unorm_round_offset_float4);\n    spv::Id color_uint4 =\n        builder_->createUnaryOp(spv::OpConvertFToU, type_uint4_, color_offset);\n    packed_2_10_10_10 =\n        builder_->createCompositeExtract(color_uint4, type_uint_, 0);\n    spv::Id rgb_width = builder_->makeUintConstant(10);\n    spv::Id alpha_width = builder_->makeUintConstant(2);\n    for (uint32_t i = 1; i < 4; ++i) {\n      packed_2_10_10_10 = builder_->createQuadOp(\n          spv::OpBitFieldInsert, type_uint_, packed_2_10_10_10,\n          builder_->createCompositeExtract(color_uint4, type_uint_, i),\n          builder_->makeUintConstant(10 * i), i == 3 ? alpha_width : rgb_width);\n    }\n    builder_->createBranch(&block_format_merge);\n  }\n  spv::Block& block_format_2_10_10_10_end = *builder_->getBuildPoint();\n\n  // ***************************************************************************\n  // k_2_10_10_10_FLOAT\n  // k_2_10_10_10_FLOAT_AS_16_16_16_16\n  // ***************************************************************************\n  spv::Id packed_2_10_10_10_float;\n  {\n    builder_->setBuildPoint(&block_format_2_10_10_10_float);\n    std::array<spv::Id, 4> color_components;\n    // RGB.\n    for (uint32_t i = 0; i < 3; ++i) {\n      color_components[i] = UnclampedFloat32To7e3(\n          *builder_,\n          builder_->createCompositeExtract(color_float4, type_float_, i),\n          ext_inst_glsl_std_450_);\n    }\n    // Alpha.\n    spv::Id alpha_scaled = builder_->createNoContractionBinOp(\n        spv::OpFMul, type_float_,\n        builder_->createTriBuiltinCall(\n            type_float_, ext_inst_glsl_std_450_, GLSLstd450NClamp,\n            builder_->createCompositeExtract(color_float4, type_float_, 3),\n            const_float_0_, const_float_1_),\n        builder_->makeFloatConstant(3.0f));\n    spv::Id alpha_offset = builder_->createNoContractionBinOp(\n        spv::OpFAdd, type_float_, alpha_scaled, unorm_round_offset_float);\n    color_components[3] =\n        builder_->createUnaryOp(spv::OpConvertFToU, type_uint_, alpha_offset);\n    // Pack.\n    packed_2_10_10_10_float = color_components[0];\n    spv::Id rgb_width = builder_->makeUintConstant(10);\n    for (uint32_t i = 1; i < 3; ++i) {\n      packed_2_10_10_10_float = builder_->createQuadOp(\n          spv::OpBitFieldInsert, type_uint_, packed_2_10_10_10_float,\n          color_components[i], builder_->makeUintConstant(10 * i), rgb_width);\n    }\n    packed_2_10_10_10_float = builder_->createQuadOp(\n        spv::OpBitFieldInsert, type_uint_, packed_2_10_10_10_float,\n        color_components[3], builder_->makeUintConstant(30),\n        builder_->makeUintConstant(2));\n    builder_->createBranch(&block_format_merge);\n  }\n  spv::Block& block_format_2_10_10_10_float_end = *builder_->getBuildPoint();\n\n  // ***************************************************************************\n  // k_16_16\n  // k_16_16_16_16\n  // ***************************************************************************\n  std::array<spv::Id, 2> packed_16;\n  {\n    builder_->setBuildPoint(&block_format_16);\n    id_vector_temp_.clear();\n    id_vector_temp_.resize(4, builder_->makeFloatConstant(-32.0f));\n    spv::Id const_float4_minus_32 =\n        builder_->makeCompositeConstant(type_float4_, id_vector_temp_);\n    id_vector_temp_.clear();\n    id_vector_temp_.resize(4, builder_->makeFloatConstant(32.0f));\n    spv::Id const_float4_32 =\n        builder_->makeCompositeConstant(type_float4_, id_vector_temp_);\n    id_vector_temp_.clear();\n    // NaN to 0, not to -32.\n    spv::Id color_scaled = builder_->createNoContractionBinOp(\n        spv::OpVectorTimesScalar, type_float4_,\n        builder_->createTriBuiltinCall(\n            type_float4_, ext_inst_glsl_std_450_, GLSLstd450FClamp,\n            builder_->createTriOp(spv::OpSelect, type_float4_,\n                                  builder_->createUnaryOp(\n                                      spv::OpIsNan, type_bool4_, color_float4),\n                                  const_float4_0_, color_float4),\n            const_float4_minus_32, const_float4_32),\n        builder_->makeFloatConstant(32767.0f / 32.0f));\n    id_vector_temp_.clear();\n    id_vector_temp_.resize(4, builder_->makeFloatConstant(-0.5f));\n    spv::Id unorm_round_offset_negative_float4 =\n        builder_->makeCompositeConstant(type_float4_, id_vector_temp_);\n    spv::Id color_offset = builder_->createNoContractionBinOp(\n        spv::OpFAdd, type_float4_, color_scaled,\n        builder_->createTriOp(\n            spv::OpSelect, type_float4_,\n            builder_->createBinOp(spv::OpFOrdLessThan, type_bool4_,\n                                  color_scaled, const_float4_0_),\n            unorm_round_offset_negative_float4, unorm_round_offset_float4));\n    spv::Id color_uint4 = builder_->createUnaryOp(\n        spv::OpBitcast, type_uint4_,\n        builder_->createUnaryOp(spv::OpConvertFToS, type_int4_, color_offset));\n    spv::Id component_offset_width = builder_->makeUintConstant(16);\n    for (uint32_t i = 0; i < 2; ++i) {\n      packed_16[i] = builder_->createQuadOp(\n          spv::OpBitFieldInsert, type_uint_,\n          builder_->createCompositeExtract(color_uint4, type_uint_, 2 * i),\n          builder_->createCompositeExtract(color_uint4, type_uint_, 2 * i + 1),\n          component_offset_width, component_offset_width);\n    }\n    builder_->createBranch(&block_format_merge);\n  }\n  spv::Block& block_format_16_end = *builder_->getBuildPoint();\n\n  // ***************************************************************************\n  // k_16_16_FLOAT\n  // k_16_16_16_16_FLOAT\n  // ***************************************************************************\n  std::array<spv::Id, 2> packed_16_float;\n  {\n    builder_->setBuildPoint(&block_format_16_float);\n    // TODO(Triang3l): Xenos extended-range float16.\n    id_vector_temp_.clear();\n    id_vector_temp_.resize(4, builder_->makeFloatConstant(-65504.0f));\n    spv::Id const_float4_minus_float16_max =\n        builder_->makeCompositeConstant(type_float4_, id_vector_temp_);\n    id_vector_temp_.clear();\n    id_vector_temp_.resize(4, builder_->makeFloatConstant(65504.0f));\n    spv::Id const_float4_float16_max =\n        builder_->makeCompositeConstant(type_float4_, id_vector_temp_);\n    // NaN to 0, not to -max.\n    spv::Id color_clamped = builder_->createTriBuiltinCall(\n        type_float4_, ext_inst_glsl_std_450_, GLSLstd450FClamp,\n        builder_->createTriOp(\n            spv::OpSelect, type_float4_,\n            builder_->createUnaryOp(spv::OpIsNan, type_bool4_, color_float4),\n            const_float4_0_, color_float4),\n        const_float4_minus_float16_max, const_float4_float16_max);\n    for (uint32_t i = 0; i < 2; ++i) {\n      uint_vector_temp_.clear();\n      uint_vector_temp_.push_back(2 * i);\n      uint_vector_temp_.push_back(2 * i + 1);\n      packed_16_float[i] = builder_->createUnaryBuiltinCall(\n          type_uint_, ext_inst_glsl_std_450_, GLSLstd450PackHalf2x16,\n          builder_->createRvalueSwizzle(spv::NoPrecision, type_float2_,\n                                        color_clamped, uint_vector_temp_));\n    }\n    builder_->createBranch(&block_format_merge);\n  }\n  spv::Block& block_format_16_float_end = *builder_->getBuildPoint();\n\n  // ***************************************************************************\n  // k_32_FLOAT\n  // k_32_32_FLOAT\n  // ***************************************************************************\n  std::array<spv::Id, 2> packed_32_float;\n  {\n    builder_->setBuildPoint(&block_format_32_float);\n    for (uint32_t i = 0; i < 2; ++i) {\n      packed_32_float[i] = builder_->createUnaryOp(\n          spv::OpBitcast, type_uint_,\n          builder_->createCompositeExtract(color_float4, type_float_, i));\n    }\n    builder_->createBranch(&block_format_merge);\n  }\n  spv::Block& block_format_32_float_end = *builder_->getBuildPoint();\n\n  // ***************************************************************************\n  // Selection of the result depending on the format.\n  // ***************************************************************************\n\n  builder_->setBuildPoint(&block_format_merge);\n  std::array<spv::Id, 2> packed;\n  id_vector_temp_.reserve(2 * 7);\n  // Low 32 bits.\n  id_vector_temp_.clear();\n  id_vector_temp_.push_back(packed_8_8_8_8);\n  id_vector_temp_.push_back(block_format_8_8_8_8_end.getId());\n  id_vector_temp_.push_back(packed_8_8_8_8_gamma);\n  id_vector_temp_.push_back(block_format_8_8_8_8_gamma_end.getId());\n  id_vector_temp_.push_back(packed_2_10_10_10);\n  id_vector_temp_.push_back(block_format_2_10_10_10_end.getId());\n  id_vector_temp_.push_back(packed_2_10_10_10_float);\n  id_vector_temp_.push_back(block_format_2_10_10_10_float_end.getId());\n  id_vector_temp_.push_back(packed_16[0]);\n  id_vector_temp_.push_back(block_format_16_end.getId());\n  id_vector_temp_.push_back(packed_16_float[0]);\n  id_vector_temp_.push_back(block_format_16_float_end.getId());\n  id_vector_temp_.push_back(packed_32_float[0]);\n  id_vector_temp_.push_back(block_format_32_float_end.getId());\n  packed[0] = builder_->createOp(spv::OpPhi, type_uint_, id_vector_temp_);\n  // High 32 bits.\n  id_vector_temp_.clear();\n  id_vector_temp_.push_back(const_uint_0_);\n  id_vector_temp_.push_back(block_format_8_8_8_8_end.getId());\n  id_vector_temp_.push_back(const_uint_0_);\n  id_vector_temp_.push_back(block_format_8_8_8_8_gamma_end.getId());\n  id_vector_temp_.push_back(const_uint_0_);\n  id_vector_temp_.push_back(block_format_2_10_10_10_end.getId());\n  id_vector_temp_.push_back(const_uint_0_);\n  id_vector_temp_.push_back(block_format_2_10_10_10_float_end.getId());\n  id_vector_temp_.push_back(packed_16[1]);\n  id_vector_temp_.push_back(block_format_16_end.getId());\n  id_vector_temp_.push_back(packed_16_float[1]);\n  id_vector_temp_.push_back(block_format_16_float_end.getId());\n  id_vector_temp_.push_back(packed_32_float[1]);\n  id_vector_temp_.push_back(block_format_32_float_end.getId());\n  packed[1] = builder_->createOp(spv::OpPhi, type_uint_, id_vector_temp_);\n  return packed;\n}\n\nstd::array<spv::Id, 4> SpirvShaderTranslator::FSI_UnpackColor(\n    std::array<spv::Id, 2> color_packed, spv::Id format_with_flags) {\n  spv::Block& block_format_head = *builder_->getBuildPoint();\n  spv::Block& block_format_8_8_8_8 = builder_->makeNewBlock();\n  spv::Block& block_format_8_8_8_8_gamma = builder_->makeNewBlock();\n  spv::Block& block_format_2_10_10_10 = builder_->makeNewBlock();\n  spv::Block& block_format_2_10_10_10_float = builder_->makeNewBlock();\n  spv::Block& block_format_16_16 = builder_->makeNewBlock();\n  spv::Block& block_format_16_16_16_16 = builder_->makeNewBlock();\n  spv::Block& block_format_16_16_float = builder_->makeNewBlock();\n  spv::Block& block_format_16_16_16_16_float = builder_->makeNewBlock();\n  spv::Block& block_format_32_float = builder_->makeNewBlock();\n  spv::Block& block_format_32_32_float = builder_->makeNewBlock();\n  spv::Block& block_format_merge = builder_->makeNewBlock();\n  builder_->createSelectionMerge(&block_format_merge,\n                                 spv::SelectionControlDontFlattenMask);\n  {\n    std::unique_ptr<spv::Instruction> format_switch_op =\n        std::make_unique<spv::Instruction>(spv::OpSwitch);\n    format_switch_op->addIdOperand(format_with_flags);\n    // Make k_32_FLOAT the default.\n    format_switch_op->addIdOperand(block_format_32_float.getId());\n    format_switch_op->addImmediateOperand(\n        int32_t(RenderTargetCache::AddPSIColorFormatFlags(\n            xenos::ColorRenderTargetFormat::k_8_8_8_8)));\n    format_switch_op->addIdOperand(block_format_8_8_8_8.getId());\n    format_switch_op->addImmediateOperand(\n        int32_t(RenderTargetCache::AddPSIColorFormatFlags(\n            xenos::ColorRenderTargetFormat::k_8_8_8_8_GAMMA)));\n    format_switch_op->addIdOperand(block_format_8_8_8_8_gamma.getId());\n    format_switch_op->addImmediateOperand(\n        int32_t(RenderTargetCache::AddPSIColorFormatFlags(\n            xenos::ColorRenderTargetFormat::k_2_10_10_10)));\n    format_switch_op->addIdOperand(block_format_2_10_10_10.getId());\n    format_switch_op->addImmediateOperand(\n        int32_t(RenderTargetCache::AddPSIColorFormatFlags(\n            xenos::ColorRenderTargetFormat::k_2_10_10_10_AS_10_10_10_10)));\n    format_switch_op->addIdOperand(block_format_2_10_10_10.getId());\n    format_switch_op->addImmediateOperand(\n        int32_t(RenderTargetCache::AddPSIColorFormatFlags(\n            xenos::ColorRenderTargetFormat::k_2_10_10_10_FLOAT)));\n    format_switch_op->addIdOperand(block_format_2_10_10_10_float.getId());\n    format_switch_op->addImmediateOperand(\n        int32_t(RenderTargetCache::AddPSIColorFormatFlags(\n            xenos::ColorRenderTargetFormat ::\n                k_2_10_10_10_FLOAT_AS_16_16_16_16)));\n    format_switch_op->addIdOperand(block_format_2_10_10_10_float.getId());\n    format_switch_op->addImmediateOperand(\n        int32_t(RenderTargetCache::AddPSIColorFormatFlags(\n            xenos::ColorRenderTargetFormat::k_16_16)));\n    format_switch_op->addIdOperand(block_format_16_16.getId());\n    format_switch_op->addImmediateOperand(\n        int32_t(RenderTargetCache::AddPSIColorFormatFlags(\n            xenos::ColorRenderTargetFormat::k_16_16_16_16)));\n    format_switch_op->addIdOperand(block_format_16_16_16_16.getId());\n    format_switch_op->addImmediateOperand(\n        int32_t(RenderTargetCache::AddPSIColorFormatFlags(\n            xenos::ColorRenderTargetFormat::k_16_16_FLOAT)));\n    format_switch_op->addIdOperand(block_format_16_16_float.getId());\n    format_switch_op->addImmediateOperand(\n        int32_t(RenderTargetCache::AddPSIColorFormatFlags(\n            xenos::ColorRenderTargetFormat::k_16_16_16_16_FLOAT)));\n    format_switch_op->addIdOperand(block_format_16_16_16_16_float.getId());\n    format_switch_op->addImmediateOperand(\n        int32_t(RenderTargetCache::AddPSIColorFormatFlags(\n            xenos::ColorRenderTargetFormat::k_32_32_FLOAT)));\n    format_switch_op->addIdOperand(block_format_32_32_float.getId());\n    builder_->getBuildPoint()->addInstruction(std::move(format_switch_op));\n  }\n  block_format_8_8_8_8.addPredecessor(&block_format_head);\n  block_format_8_8_8_8_gamma.addPredecessor(&block_format_head);\n  block_format_2_10_10_10.addPredecessor(&block_format_head);\n  block_format_2_10_10_10_float.addPredecessor(&block_format_head);\n  block_format_16_16.addPredecessor(&block_format_head);\n  block_format_16_16_16_16.addPredecessor(&block_format_head);\n  block_format_16_16_float.addPredecessor(&block_format_head);\n  block_format_16_16_16_16_float.addPredecessor(&block_format_head);\n  block_format_32_float.addPredecessor(&block_format_head);\n  block_format_32_32_float.addPredecessor(&block_format_head);\n\n  // ***************************************************************************\n  // k_8_8_8_8\n  // k_8_8_8_8_GAMMA\n  // ***************************************************************************\n\n  std::array<std::array<spv::Id, 4>, 2> unpacked_8_8_8_8_and_gamma;\n  std::array<spv::Block*, 2> block_format_8_8_8_8_and_gamma_end;\n  {\n    spv::Id component_width = builder_->makeUintConstant(8);\n    spv::Id component_scale = builder_->makeFloatConstant(1.0f / 255.0f);\n    for (uint32_t i = 0; i < 2; ++i) {\n      builder_->setBuildPoint(i ? &block_format_8_8_8_8_gamma\n                                : &block_format_8_8_8_8);\n      for (uint32_t j = 0; j < 4; ++j) {\n        spv::Id component = builder_->createNoContractionBinOp(\n            spv::OpFMul, type_float_,\n            builder_->createUnaryOp(\n                spv::OpConvertUToF, type_float_,\n                builder_->createTriOp(\n                    spv::OpBitFieldUExtract, type_uint_, color_packed[0],\n                    builder_->makeUintConstant(8 * j), component_width)),\n            component_scale);\n        if (i && j <= 2) {\n          component = PWLGammaToLinear(component, true);\n        }\n        unpacked_8_8_8_8_and_gamma[i][j] = component;\n      }\n      builder_->createBranch(&block_format_merge);\n      block_format_8_8_8_8_and_gamma_end[i] = builder_->getBuildPoint();\n    }\n  }\n\n  // ***************************************************************************\n  // k_2_10_10_10\n  // k_2_10_10_10_AS_10_10_10_10\n  // ***************************************************************************\n\n  std::array<spv::Id, 4> unpacked_2_10_10_10;\n  {\n    builder_->setBuildPoint(&block_format_2_10_10_10);\n    spv::Id rgb_width = builder_->makeUintConstant(10);\n    spv::Id alpha_width = builder_->makeUintConstant(2);\n    spv::Id rgb_scale = builder_->makeFloatConstant(1.0f / 1023.0f);\n    spv::Id alpha_scale = builder_->makeFloatConstant(1.0f / 3.0f);\n    for (uint32_t i = 0; i < 4; ++i) {\n      unpacked_2_10_10_10[i] = builder_->createNoContractionBinOp(\n          spv::OpFMul, type_float_,\n          builder_->createUnaryOp(\n              spv::OpConvertUToF, type_float_,\n              builder_->createTriOp(spv::OpBitFieldUExtract, type_uint_,\n                                    color_packed[0],\n                                    builder_->makeUintConstant(10 * i),\n                                    i == 3 ? alpha_width : rgb_width)),\n          i == 3 ? alpha_scale : rgb_scale);\n    }\n    builder_->createBranch(&block_format_merge);\n  }\n  spv::Block& block_format_2_10_10_10_end = *builder_->getBuildPoint();\n\n  // ***************************************************************************\n  // k_2_10_10_10_FLOAT\n  // k_2_10_10_10_FLOAT_AS_16_16_16_16\n  // ***************************************************************************\n\n  std::array<spv::Id, 4> unpacked_2_10_10_10_float;\n  {\n    builder_->setBuildPoint(&block_format_2_10_10_10_float);\n    spv::Id rgb_width = builder_->makeUintConstant(10);\n    for (uint32_t i = 0; i < 3; ++i) {\n      unpacked_2_10_10_10_float[i] =\n          Float7e3To32(*builder_,\n                       builder_->createTriOp(\n                           spv::OpBitFieldUExtract, type_uint_, color_packed[0],\n                           builder_->makeUintConstant(10 * i), rgb_width),\n                       0, false, ext_inst_glsl_std_450_);\n    }\n    unpacked_2_10_10_10_float[3] = builder_->createNoContractionBinOp(\n        spv::OpFMul, type_float_,\n        builder_->createUnaryOp(\n            spv::OpConvertUToF, type_float_,\n            builder_->createTriOp(\n                spv::OpBitFieldUExtract, type_uint_, color_packed[0],\n                builder_->makeUintConstant(30), builder_->makeUintConstant(2))),\n        builder_->makeFloatConstant(1.0f / 3.0f));\n    builder_->createBranch(&block_format_merge);\n  }\n  spv::Block& block_format_2_10_10_10_float_end = *builder_->getBuildPoint();\n\n  // ***************************************************************************\n  // k_16_16\n  // k_16_16_16_16\n  // ***************************************************************************\n\n  std::array<std::array<spv::Id, 4>, 2> unpacked_16;\n  unpacked_16[0][2] = const_float_0_;\n  unpacked_16[0][3] = const_float_1_;\n  std::array<spv::Block*, 2> block_format_16_end;\n  {\n    spv::Id component_width = builder_->makeUintConstant(16);\n    spv::Id component_scale = builder_->makeFloatConstant(32.0f / 32767.0f);\n    spv::Id component_min = builder_->makeFloatConstant(-1.0f);\n    for (uint32_t i = 0; i < 2; ++i) {\n      builder_->setBuildPoint(i ? &block_format_16_16_16_16\n                                : &block_format_16_16);\n      std::array<spv::Id, 2> color_packed_signed;\n      for (uint32_t j = 0; j <= i; ++j) {\n        color_packed_signed[j] =\n            builder_->createUnaryOp(spv::OpBitcast, type_int_, color_packed[j]);\n      }\n      for (uint32_t j = 0; j < uint32_t(i ? 4 : 2); ++j) {\n        spv::Id component = builder_->createNoContractionBinOp(\n            spv::OpFMul, type_float_,\n            builder_->createUnaryOp(\n                spv::OpConvertSToF, type_float_,\n                builder_->createTriOp(spv::OpBitFieldSExtract, type_int_,\n                                      color_packed_signed[j >> 1],\n                                      builder_->makeUintConstant(16 * (j & 1)),\n                                      component_width)),\n            component_scale);\n        component = builder_->createBinBuiltinCall(\n            type_float_, ext_inst_glsl_std_450_, GLSLstd450FMax, component_min,\n            component);\n        unpacked_16[i][j] = component;\n      }\n      builder_->createBranch(&block_format_merge);\n      block_format_16_end[i] = builder_->getBuildPoint();\n    }\n  }\n\n  // ***************************************************************************\n  // k_16_16_FLOAT\n  // k_16_16_16_16_FLOAT\n  // ***************************************************************************\n\n  std::array<std::array<spv::Id, 4>, 2> unpacked_16_float;\n  unpacked_16_float[0][2] = const_float_0_;\n  unpacked_16_float[0][3] = const_float_1_;\n  std::array<spv::Block*, 2> block_format_16_float_end;\n  {\n    for (uint32_t i = 0; i < 2; ++i) {\n      builder_->setBuildPoint(i ? &block_format_16_16_16_16_float\n                                : &block_format_16_16_float);\n      // TODO(Triang3l): Xenos extended-range float16.\n      for (uint32_t j = 0; j <= i; ++j) {\n        spv::Id components_float2 = builder_->createUnaryBuiltinCall(\n            type_float2_, ext_inst_glsl_std_450_, GLSLstd450UnpackHalf2x16,\n            color_packed[j]);\n        for (uint32_t k = 0; k < 2; ++k) {\n          unpacked_16_float[i][2 * j + k] = builder_->createCompositeExtract(\n              components_float2, type_float_, k);\n        }\n      }\n      builder_->createBranch(&block_format_merge);\n      block_format_16_float_end[i] = builder_->getBuildPoint();\n    }\n  }\n\n  // ***************************************************************************\n  // k_32_FLOAT\n  // k_32_32_FLOAT\n  // ***************************************************************************\n\n  std::array<std::array<spv::Id, 4>, 2> unpacked_32_float;\n  unpacked_32_float[0][1] = const_float_0_;\n  unpacked_32_float[0][2] = const_float_0_;\n  unpacked_32_float[0][3] = const_float_1_;\n  unpacked_32_float[1][2] = const_float_0_;\n  unpacked_32_float[1][3] = const_float_1_;\n  std::array<spv::Block*, 2> block_format_32_float_end;\n  {\n    for (uint32_t i = 0; i < 2; ++i) {\n      builder_->setBuildPoint(i ? &block_format_32_32_float\n                                : &block_format_32_float);\n      for (uint32_t j = 0; j <= i; ++j) {\n        unpacked_32_float[i][j] = builder_->createUnaryOp(\n            spv::OpBitcast, type_float_, color_packed[j]);\n      }\n      builder_->createBranch(&block_format_merge);\n      block_format_32_float_end[i] = builder_->getBuildPoint();\n    }\n  }\n\n  // ***************************************************************************\n  // Selection of the result depending on the format.\n  // ***************************************************************************\n\n  builder_->setBuildPoint(&block_format_merge);\n  std::array<spv::Id, 4> unpacked;\n  id_vector_temp_.reserve(2 * 10);\n  for (uint32_t i = 0; i < 4; ++i) {\n    id_vector_temp_.clear();\n    id_vector_temp_.push_back(unpacked_8_8_8_8_and_gamma[0][i]);\n    id_vector_temp_.push_back(block_format_8_8_8_8_and_gamma_end[0]->getId());\n    id_vector_temp_.push_back(unpacked_8_8_8_8_and_gamma[1][i]);\n    id_vector_temp_.push_back(block_format_8_8_8_8_and_gamma_end[1]->getId());\n    id_vector_temp_.push_back(unpacked_2_10_10_10[i]);\n    id_vector_temp_.push_back(block_format_2_10_10_10_end.getId());\n    id_vector_temp_.push_back(unpacked_2_10_10_10_float[i]);\n    id_vector_temp_.push_back(block_format_2_10_10_10_float_end.getId());\n    id_vector_temp_.push_back(unpacked_16[0][i]);\n    id_vector_temp_.push_back(block_format_16_end[0]->getId());\n    id_vector_temp_.push_back(unpacked_16[1][i]);\n    id_vector_temp_.push_back(block_format_16_end[1]->getId());\n    id_vector_temp_.push_back(unpacked_16_float[0][i]);\n    id_vector_temp_.push_back(block_format_16_float_end[0]->getId());\n    id_vector_temp_.push_back(unpacked_16_float[1][i]);\n    id_vector_temp_.push_back(block_format_16_float_end[1]->getId());\n    id_vector_temp_.push_back(unpacked_32_float[0][i]);\n    id_vector_temp_.push_back(block_format_32_float_end[0]->getId());\n    id_vector_temp_.push_back(unpacked_32_float[1][i]);\n    id_vector_temp_.push_back(block_format_32_float_end[1]->getId());\n    unpacked[i] = builder_->createOp(spv::OpPhi, type_float_, id_vector_temp_);\n  }\n  return unpacked;\n}\n\nspv::Id SpirvShaderTranslator::FSI_FlushNaNClampAndInBlending(\n    spv::Id color_or_alpha, spv::Id is_fixed_point, spv::Id min_value,\n    spv::Id max_value) {\n  spv::Id color_or_alpha_type = builder_->getTypeId(color_or_alpha);\n  uint32_t component_count =\n      uint32_t(builder_->getNumTypeConstituents(color_or_alpha_type));\n  assert_true(builder_->isScalarType(color_or_alpha_type) ||\n              builder_->isVectorType(color_or_alpha_type));\n  assert_true(\n      builder_->isFloatType(builder_->getScalarTypeId(color_or_alpha_type)));\n  assert_true(builder_->getTypeId(min_value) == color_or_alpha_type);\n  assert_true(builder_->getTypeId(max_value) == color_or_alpha_type);\n\n  SpirvBuilder::IfBuilder if_fixed_point(\n      is_fixed_point, spv::SelectionControlDontFlattenMask, *builder_);\n  spv::Id color_or_alpha_clamped;\n  {\n    // Flush NaN to 0 even for signed (NMax would flush it to the minimum\n    // value).\n    color_or_alpha_clamped = builder_->createTriBuiltinCall(\n        color_or_alpha_type, ext_inst_glsl_std_450_, GLSLstd450FClamp,\n        builder_->createTriOp(\n            spv::OpSelect, color_or_alpha_type,\n            builder_->createUnaryOp(spv::OpIsNan,\n                                    type_bool_vectors_[component_count - 1],\n                                    color_or_alpha),\n            const_float_vectors_0_[component_count - 1], color_or_alpha),\n        min_value, max_value);\n  }\n  if_fixed_point.makeEndIf();\n\n  return if_fixed_point.createMergePhi(color_or_alpha_clamped, color_or_alpha);\n}\n\nspv::Id SpirvShaderTranslator::FSI_ApplyColorBlendFactor(\n    spv::Id value, spv::Id is_fixed_point, spv::Id clamp_min_value,\n    spv::Id clamp_max_value, spv::Id factor, spv::Id source_color,\n    spv::Id source_alpha, spv::Id dest_color, spv::Id dest_alpha,\n    spv::Id constant_color, spv::Id constant_alpha) {\n  // If the factor is zero, don't use it in the multiplication at all, so that\n  // infinity and NaN are not potentially involved in the multiplication.\n  // Calculate the condition before the selection merge, which must be the\n  // penultimate instruction in the block.\n  SpirvBuilder::IfBuilder factor_not_zero_if(\n      builder_->createBinOp(\n          spv::OpINotEqual, type_bool_, factor,\n          builder_->makeUintConstant(uint32_t(xenos::BlendFactor::kZero))),\n      spv::SelectionControlDontFlattenMask, *builder_);\n\n  // Non-zero factor case.\n\n  spv::Block& block_factor_head = *builder_->getBuildPoint();\n  spv::Block& block_factor_one = builder_->makeNewBlock();\n  std::array<spv::Block*, 3> color_factor_blocks;\n  std::array<spv::Block*, 3> one_minus_color_factor_blocks;\n  std::array<spv::Block*, 3> alpha_factor_blocks;\n  std::array<spv::Block*, 3> one_minus_alpha_factor_blocks;\n  color_factor_blocks[0] = &builder_->makeNewBlock();\n  one_minus_color_factor_blocks[0] = &builder_->makeNewBlock();\n  alpha_factor_blocks[0] = &builder_->makeNewBlock();\n  one_minus_alpha_factor_blocks[0] = &builder_->makeNewBlock();\n  color_factor_blocks[1] = &builder_->makeNewBlock();\n  one_minus_color_factor_blocks[1] = &builder_->makeNewBlock();\n  alpha_factor_blocks[1] = &builder_->makeNewBlock();\n  one_minus_alpha_factor_blocks[1] = &builder_->makeNewBlock();\n  color_factor_blocks[2] = &builder_->makeNewBlock();\n  one_minus_color_factor_blocks[2] = &builder_->makeNewBlock();\n  alpha_factor_blocks[2] = &builder_->makeNewBlock();\n  one_minus_alpha_factor_blocks[2] = &builder_->makeNewBlock();\n  spv::Block& block_factor_source_alpha_saturate = builder_->makeNewBlock();\n  spv::Block& block_factor_merge = builder_->makeNewBlock();\n  builder_->createSelectionMerge(&block_factor_merge,\n                                 spv::SelectionControlDontFlattenMask);\n  {\n    std::unique_ptr<spv::Instruction> factor_switch_op =\n        std::make_unique<spv::Instruction>(spv::OpSwitch);\n    factor_switch_op->addIdOperand(factor);\n    // Make one the default factor.\n    factor_switch_op->addIdOperand(block_factor_one.getId());\n    factor_switch_op->addImmediateOperand(\n        int32_t(xenos::BlendFactor::kSrcColor));\n    factor_switch_op->addIdOperand(color_factor_blocks[0]->getId());\n    factor_switch_op->addImmediateOperand(\n        int32_t(xenos::BlendFactor::kOneMinusSrcColor));\n    factor_switch_op->addIdOperand(one_minus_color_factor_blocks[0]->getId());\n    factor_switch_op->addImmediateOperand(\n        int32_t(xenos::BlendFactor::kSrcAlpha));\n    factor_switch_op->addIdOperand(alpha_factor_blocks[0]->getId());\n    factor_switch_op->addImmediateOperand(\n        int32_t(xenos::BlendFactor::kOneMinusSrcAlpha));\n    factor_switch_op->addIdOperand(one_minus_alpha_factor_blocks[0]->getId());\n    factor_switch_op->addImmediateOperand(\n        int32_t(xenos::BlendFactor::kDstColor));\n    factor_switch_op->addIdOperand(color_factor_blocks[1]->getId());\n    factor_switch_op->addImmediateOperand(\n        int32_t(xenos::BlendFactor::kOneMinusDstColor));\n    factor_switch_op->addIdOperand(one_minus_color_factor_blocks[1]->getId());\n    factor_switch_op->addImmediateOperand(\n        int32_t(xenos::BlendFactor::kDstAlpha));\n    factor_switch_op->addIdOperand(alpha_factor_blocks[1]->getId());\n    factor_switch_op->addImmediateOperand(\n        int32_t(xenos::BlendFactor::kOneMinusDstAlpha));\n    factor_switch_op->addIdOperand(one_minus_alpha_factor_blocks[1]->getId());\n    factor_switch_op->addImmediateOperand(\n        int32_t(xenos::BlendFactor::kConstantColor));\n    factor_switch_op->addIdOperand(color_factor_blocks[2]->getId());\n    factor_switch_op->addImmediateOperand(\n        int32_t(xenos::BlendFactor::kOneMinusConstantColor));\n    factor_switch_op->addIdOperand(one_minus_color_factor_blocks[2]->getId());\n    factor_switch_op->addImmediateOperand(\n        int32_t(xenos::BlendFactor::kConstantAlpha));\n    factor_switch_op->addIdOperand(alpha_factor_blocks[2]->getId());\n    factor_switch_op->addImmediateOperand(\n        int32_t(xenos::BlendFactor::kOneMinusConstantAlpha));\n    factor_switch_op->addIdOperand(one_minus_alpha_factor_blocks[2]->getId());\n    factor_switch_op->addImmediateOperand(\n        int32_t(xenos::BlendFactor::kSrcAlphaSaturate));\n    factor_switch_op->addIdOperand(block_factor_source_alpha_saturate.getId());\n    builder_->getBuildPoint()->addInstruction(std::move(factor_switch_op));\n  }\n  block_factor_one.addPredecessor(&block_factor_head);\n  for (uint32_t i = 0; i < 3; ++i) {\n    color_factor_blocks[i]->addPredecessor(&block_factor_head);\n    one_minus_color_factor_blocks[i]->addPredecessor(&block_factor_head);\n    alpha_factor_blocks[i]->addPredecessor(&block_factor_head);\n    one_minus_alpha_factor_blocks[i]->addPredecessor(&block_factor_head);\n  }\n  block_factor_source_alpha_saturate.addPredecessor(&block_factor_head);\n\n  // kOne\n  builder_->setBuildPoint(&block_factor_one);\n  // The result is the value itself.\n  builder_->createBranch(&block_factor_merge);\n\n  // k[OneMinus]Src/Dest/ConstantColor/Alpha\n  std::array<spv::Id, 3> color_factors = {\n      source_color,\n      dest_color,\n      constant_color,\n  };\n  std::array<spv::Id, 3> alpha_factors = {\n      source_alpha,\n      dest_alpha,\n      constant_alpha,\n  };\n  std::array<spv::Id, 3> color_factor_results;\n  std::array<spv::Id, 3> one_minus_color_factor_results;\n  std::array<spv::Id, 3> alpha_factor_results;\n  std::array<spv::Id, 3> one_minus_alpha_factor_results;\n  for (uint32_t i = 0; i < 3; ++i) {\n    spv::Id color_factor = color_factors[i];\n    spv::Id alpha_factor = alpha_factors[i];\n\n    // kSrc/Dst/ConstantColor\n    {\n      builder_->setBuildPoint(color_factor_blocks[i]);\n      color_factor_results[i] = builder_->createNoContractionBinOp(\n          spv::OpFMul, type_float3_, value, color_factor);\n      builder_->createBranch(&block_factor_merge);\n    }\n\n    // kOneMinusSrc/Dst/ConstantColor\n    {\n      builder_->setBuildPoint(one_minus_color_factor_blocks[i]);\n      one_minus_color_factor_results[i] = builder_->createNoContractionBinOp(\n          spv::OpFMul, type_float3_, value,\n          builder_->createNoContractionBinOp(spv::OpFSub, type_float3_,\n                                             const_float3_1_, color_factor));\n      builder_->createBranch(&block_factor_merge);\n    }\n\n    // kSrc/Dst/ConstantAlpha\n    {\n      builder_->setBuildPoint(alpha_factor_blocks[i]);\n      alpha_factor_results[i] = builder_->createNoContractionBinOp(\n          spv::OpVectorTimesScalar, type_float3_, value, alpha_factor);\n      builder_->createBranch(&block_factor_merge);\n    }\n\n    // kOneMinusSrc/Dst/ConstantAlpha\n    {\n      builder_->setBuildPoint(one_minus_alpha_factor_blocks[i]);\n      one_minus_alpha_factor_results[i] = builder_->createNoContractionBinOp(\n          spv::OpVectorTimesScalar, type_float3_, value,\n          builder_->createNoContractionBinOp(spv::OpFSub, type_float_,\n                                             const_float_1_, alpha_factor));\n      builder_->createBranch(&block_factor_merge);\n    }\n  }\n\n  // kSrcAlphaSaturate\n  spv::Id result_source_alpha_saturate;\n  {\n    builder_->setBuildPoint(&block_factor_source_alpha_saturate);\n    result_source_alpha_saturate = builder_->createNoContractionBinOp(\n        spv::OpVectorTimesScalar, type_float3_, value,\n        builder_->createBinBuiltinCall(\n            type_float_, ext_inst_glsl_std_450_, GLSLstd450NMin, source_alpha,\n            builder_->createNoContractionBinOp(spv::OpFSub, type_float_,\n                                               const_float_1_, dest_alpha)));\n    builder_->createBranch(&block_factor_merge);\n  }\n\n  // Select the term for the non-zero factor.\n  builder_->setBuildPoint(&block_factor_merge);\n  id_vector_temp_.clear();\n  id_vector_temp_.reserve(2 * 14);\n  id_vector_temp_.push_back(value);\n  id_vector_temp_.push_back(block_factor_one.getId());\n  for (uint32_t i = 0; i < 3; ++i) {\n    id_vector_temp_.push_back(color_factor_results[i]);\n    id_vector_temp_.push_back(color_factor_blocks[i]->getId());\n    id_vector_temp_.push_back(one_minus_color_factor_results[i]);\n    id_vector_temp_.push_back(one_minus_color_factor_blocks[i]->getId());\n    id_vector_temp_.push_back(alpha_factor_results[i]);\n    id_vector_temp_.push_back(alpha_factor_blocks[i]->getId());\n    id_vector_temp_.push_back(one_minus_alpha_factor_results[i]);\n    id_vector_temp_.push_back(one_minus_alpha_factor_blocks[i]->getId());\n  }\n  id_vector_temp_.push_back(result_source_alpha_saturate);\n  id_vector_temp_.push_back(block_factor_source_alpha_saturate.getId());\n  spv::Id result_unclamped =\n      builder_->createOp(spv::OpPhi, type_float3_, id_vector_temp_);\n  spv::Id result = FSI_FlushNaNClampAndInBlending(\n      result_unclamped, is_fixed_point, clamp_min_value, clamp_max_value);\n\n  factor_not_zero_if.makeEndIf();\n\n  // Make the result zero if the factor is zero.\n  return factor_not_zero_if.createMergePhi(result, const_float3_0_);\n}\n\nspv::Id SpirvShaderTranslator::FSI_ApplyAlphaBlendFactor(\n    spv::Id value, spv::Id is_fixed_point, spv::Id clamp_min_value,\n    spv::Id clamp_max_value, spv::Id factor, spv::Id source_alpha,\n    spv::Id dest_alpha, spv::Id constant_alpha) {\n  // If the factor is zero, don't use it in the multiplication at all, so that\n  // infinity and NaN are not potentially involved in the multiplication.\n  // Calculate the condition before the selection merge, which must be the\n  // penultimate instruction in the block.\n  SpirvBuilder::IfBuilder factor_not_zero_if(\n      builder_->createBinOp(\n          spv::OpINotEqual, type_bool_, factor,\n          builder_->makeUintConstant(uint32_t(xenos::BlendFactor::kZero))),\n      spv::SelectionControlDontFlattenMask, *builder_);\n\n  // Non-zero factor case.\n\n  spv::Block& block_factor_head = *builder_->getBuildPoint();\n  spv::Block& block_factor_one = builder_->makeNewBlock();\n  std::array<spv::Block*, 3> alpha_factor_blocks;\n  std::array<spv::Block*, 3> one_minus_alpha_factor_blocks;\n  alpha_factor_blocks[0] = &builder_->makeNewBlock();\n  one_minus_alpha_factor_blocks[0] = &builder_->makeNewBlock();\n  alpha_factor_blocks[1] = &builder_->makeNewBlock();\n  one_minus_alpha_factor_blocks[1] = &builder_->makeNewBlock();\n  alpha_factor_blocks[2] = &builder_->makeNewBlock();\n  one_minus_alpha_factor_blocks[2] = &builder_->makeNewBlock();\n  spv::Block& block_factor_source_alpha_saturate = builder_->makeNewBlock();\n  spv::Block& block_factor_merge = builder_->makeNewBlock();\n  builder_->createSelectionMerge(&block_factor_merge,\n                                 spv::SelectionControlDontFlattenMask);\n  {\n    std::unique_ptr<spv::Instruction> factor_switch_op =\n        std::make_unique<spv::Instruction>(spv::OpSwitch);\n    factor_switch_op->addIdOperand(factor);\n    // Make one the default factor.\n    factor_switch_op->addIdOperand(block_factor_one.getId());\n    factor_switch_op->addImmediateOperand(\n        int32_t(xenos::BlendFactor::kSrcColor));\n    factor_switch_op->addIdOperand(alpha_factor_blocks[0]->getId());\n    factor_switch_op->addImmediateOperand(\n        int32_t(xenos::BlendFactor::kOneMinusSrcColor));\n    factor_switch_op->addIdOperand(one_minus_alpha_factor_blocks[0]->getId());\n    factor_switch_op->addImmediateOperand(\n        int32_t(xenos::BlendFactor::kSrcAlpha));\n    factor_switch_op->addIdOperand(alpha_factor_blocks[0]->getId());\n    factor_switch_op->addImmediateOperand(\n        int32_t(xenos::BlendFactor::kOneMinusSrcAlpha));\n    factor_switch_op->addIdOperand(one_minus_alpha_factor_blocks[0]->getId());\n    factor_switch_op->addImmediateOperand(\n        int32_t(xenos::BlendFactor::kDstColor));\n    factor_switch_op->addIdOperand(alpha_factor_blocks[1]->getId());\n    factor_switch_op->addImmediateOperand(\n        int32_t(xenos::BlendFactor::kOneMinusDstColor));\n    factor_switch_op->addIdOperand(one_minus_alpha_factor_blocks[1]->getId());\n    factor_switch_op->addImmediateOperand(\n        int32_t(xenos::BlendFactor::kDstAlpha));\n    factor_switch_op->addIdOperand(alpha_factor_blocks[1]->getId());\n    factor_switch_op->addImmediateOperand(\n        int32_t(xenos::BlendFactor::kOneMinusDstAlpha));\n    factor_switch_op->addIdOperand(one_minus_alpha_factor_blocks[1]->getId());\n    factor_switch_op->addImmediateOperand(\n        int32_t(xenos::BlendFactor::kConstantColor));\n    factor_switch_op->addIdOperand(alpha_factor_blocks[2]->getId());\n    factor_switch_op->addImmediateOperand(\n        int32_t(xenos::BlendFactor::kOneMinusConstantColor));\n    factor_switch_op->addIdOperand(one_minus_alpha_factor_blocks[2]->getId());\n    factor_switch_op->addImmediateOperand(\n        int32_t(xenos::BlendFactor::kConstantAlpha));\n    factor_switch_op->addIdOperand(alpha_factor_blocks[2]->getId());\n    factor_switch_op->addImmediateOperand(\n        int32_t(xenos::BlendFactor::kOneMinusConstantAlpha));\n    factor_switch_op->addIdOperand(one_minus_alpha_factor_blocks[2]->getId());\n    factor_switch_op->addImmediateOperand(\n        int32_t(xenos::BlendFactor::kSrcAlphaSaturate));\n    factor_switch_op->addIdOperand(block_factor_source_alpha_saturate.getId());\n    builder_->getBuildPoint()->addInstruction(std::move(factor_switch_op));\n  }\n  block_factor_one.addPredecessor(&block_factor_head);\n  for (uint32_t i = 0; i < 3; ++i) {\n    alpha_factor_blocks[i]->addPredecessor(&block_factor_head);\n    one_minus_alpha_factor_blocks[i]->addPredecessor(&block_factor_head);\n  }\n  block_factor_source_alpha_saturate.addPredecessor(&block_factor_head);\n\n  // kOne\n  builder_->setBuildPoint(&block_factor_one);\n  // The result is the value itself.\n  builder_->createBranch(&block_factor_merge);\n\n  // k[OneMinus]Src/Dest/ConstantColor/Alpha\n  std::array<spv::Id, 3> alpha_factors = {\n      source_alpha,\n      dest_alpha,\n      constant_alpha,\n  };\n  std::array<spv::Id, 3> alpha_factor_results;\n  std::array<spv::Id, 3> one_minus_alpha_factor_results;\n  for (uint32_t i = 0; i < 3; ++i) {\n    spv::Id alpha_factor = alpha_factors[i];\n\n    // kSrc/Dst/ConstantColor/Alpha\n    {\n      builder_->setBuildPoint(alpha_factor_blocks[i]);\n      alpha_factor_results[i] = builder_->createNoContractionBinOp(\n          spv::OpFMul, type_float_, value, alpha_factor);\n      builder_->createBranch(&block_factor_merge);\n    }\n\n    // kOneMinusSrc/Dst/ConstantColor/Alpha\n    {\n      builder_->setBuildPoint(one_minus_alpha_factor_blocks[i]);\n      one_minus_alpha_factor_results[i] = builder_->createNoContractionBinOp(\n          spv::OpFMul, type_float_, value,\n          builder_->createNoContractionBinOp(spv::OpFSub, type_float_,\n                                             const_float_1_, alpha_factor));\n      builder_->createBranch(&block_factor_merge);\n    }\n  }\n\n  // kSrcAlphaSaturate\n  spv::Id result_source_alpha_saturate;\n  {\n    builder_->setBuildPoint(&block_factor_source_alpha_saturate);\n    result_source_alpha_saturate = builder_->createNoContractionBinOp(\n        spv::OpFMul, type_float_, value,\n        builder_->createBinBuiltinCall(\n            type_float_, ext_inst_glsl_std_450_, GLSLstd450NMin, source_alpha,\n            builder_->createNoContractionBinOp(spv::OpFSub, type_float_,\n                                               const_float_1_, dest_alpha)));\n    builder_->createBranch(&block_factor_merge);\n  }\n\n  // Select the term for the non-zero factor.\n  builder_->setBuildPoint(&block_factor_merge);\n  id_vector_temp_.clear();\n  id_vector_temp_.reserve(2 * 8);\n  id_vector_temp_.push_back(value);\n  id_vector_temp_.push_back(block_factor_one.getId());\n  for (uint32_t i = 0; i < 3; ++i) {\n    id_vector_temp_.push_back(alpha_factor_results[i]);\n    id_vector_temp_.push_back(alpha_factor_blocks[i]->getId());\n    id_vector_temp_.push_back(one_minus_alpha_factor_results[i]);\n    id_vector_temp_.push_back(one_minus_alpha_factor_blocks[i]->getId());\n  }\n  id_vector_temp_.push_back(result_source_alpha_saturate);\n  id_vector_temp_.push_back(block_factor_source_alpha_saturate.getId());\n  spv::Id result_unclamped =\n      builder_->createOp(spv::OpPhi, type_float_, id_vector_temp_);\n  spv::Id result = FSI_FlushNaNClampAndInBlending(\n      result_unclamped, is_fixed_point, clamp_min_value, clamp_max_value);\n\n  factor_not_zero_if.makeEndIf();\n\n  // Make the result zero if the factor is zero.\n  return factor_not_zero_if.createMergePhi(result, const_float_0_);\n}\n\nspv::Id SpirvShaderTranslator::FSI_BlendColorOrAlphaWithUnclampedResult(\n    spv::Id is_fixed_point, spv::Id clamp_min_value, spv::Id clamp_max_value,\n    spv::Id source_color_clamped, spv::Id source_alpha_clamped,\n    spv::Id dest_color, spv::Id dest_alpha, spv::Id constant_color_clamped,\n    spv::Id constant_alpha_clamped, spv::Id equation, spv::Id source_factor,\n    spv::Id dest_factor) {\n  bool is_alpha = source_color_clamped == spv::NoResult;\n  assert_false(!is_alpha && (dest_color == spv::NoResult ||\n                             constant_color_clamped == spv::NoResult));\n  assert_false(is_alpha && (dest_color != spv::NoResult ||\n                            constant_color_clamped != spv::NoResult));\n  spv::Id value_type = is_alpha ? type_float_ : type_float3_;\n\n  // Handle min and max blend operations, which don't involve the factors.\n  spv::Block& block_min_max_head = *builder_->getBuildPoint();\n  spv::Block& block_min_max_min = builder_->makeNewBlock();\n  spv::Block& block_min_max_max = builder_->makeNewBlock();\n  spv::Block& block_min_max_default = builder_->makeNewBlock();\n  spv::Block& block_min_max_merge = builder_->makeNewBlock();\n  builder_->createSelectionMerge(&block_min_max_merge,\n                                 spv::SelectionControlDontFlattenMask);\n  {\n    std::unique_ptr<spv::Instruction> min_max_switch_op =\n        std::make_unique<spv::Instruction>(spv::OpSwitch);\n    min_max_switch_op->addIdOperand(equation);\n    min_max_switch_op->addIdOperand(block_min_max_default.getId());\n    min_max_switch_op->addImmediateOperand(int32_t(xenos::BlendOp::kMin));\n    min_max_switch_op->addIdOperand(block_min_max_min.getId());\n    min_max_switch_op->addImmediateOperand(int32_t(xenos::BlendOp::kMax));\n    min_max_switch_op->addIdOperand(block_min_max_max.getId());\n    builder_->getBuildPoint()->addInstruction(std::move(min_max_switch_op));\n  }\n  block_min_max_default.addPredecessor(&block_min_max_head);\n  block_min_max_min.addPredecessor(&block_min_max_head);\n  block_min_max_max.addPredecessor(&block_min_max_head);\n\n  // Min case.\n  builder_->setBuildPoint(&block_min_max_min);\n  spv::Id result_min = builder_->createBinBuiltinCall(\n      value_type, ext_inst_glsl_std_450_, GLSLstd450FMin,\n      is_alpha ? source_alpha_clamped : source_color_clamped,\n      is_alpha ? dest_alpha : dest_color);\n  builder_->createBranch(&block_min_max_merge);\n\n  // Max case.\n  builder_->setBuildPoint(&block_min_max_max);\n  spv::Id result_max = builder_->createBinBuiltinCall(\n      value_type, ext_inst_glsl_std_450_, GLSLstd450FMax,\n      is_alpha ? source_alpha_clamped : source_color_clamped,\n      is_alpha ? dest_alpha : dest_color);\n  builder_->createBranch(&block_min_max_merge);\n\n  // Blending with factors.\n  spv::Id result_factors;\n  {\n    builder_->setBuildPoint(&block_min_max_default);\n\n    spv::Id term_source, term_dest;\n    if (is_alpha) {\n      term_source = FSI_ApplyAlphaBlendFactor(\n          source_alpha_clamped, is_fixed_point, clamp_min_value,\n          clamp_max_value, source_factor, source_alpha_clamped, dest_alpha,\n          constant_alpha_clamped);\n      term_dest = FSI_ApplyAlphaBlendFactor(dest_alpha, is_fixed_point,\n                                            clamp_min_value, clamp_max_value,\n                                            dest_factor, source_alpha_clamped,\n                                            dest_alpha, constant_alpha_clamped);\n    } else {\n      term_source = FSI_ApplyColorBlendFactor(\n          source_color_clamped, is_fixed_point, clamp_min_value,\n          clamp_max_value, source_factor, source_color_clamped,\n          source_alpha_clamped, dest_color, dest_alpha, constant_color_clamped,\n          constant_alpha_clamped);\n      term_dest = FSI_ApplyColorBlendFactor(\n          dest_color, is_fixed_point, clamp_min_value, clamp_max_value,\n          dest_factor, source_color_clamped, source_alpha_clamped, dest_color,\n          dest_alpha, constant_color_clamped, constant_alpha_clamped);\n    }\n\n    spv::Block& block_signs_head = *builder_->getBuildPoint();\n    spv::Block& block_signs_add = builder_->makeNewBlock();\n    spv::Block& block_signs_subtract = builder_->makeNewBlock();\n    spv::Block& block_signs_reverse_subtract = builder_->makeNewBlock();\n    spv::Block& block_signs_merge = builder_->makeNewBlock();\n    builder_->createSelectionMerge(&block_signs_merge,\n                                   spv::SelectionControlDontFlattenMask);\n    {\n      std::unique_ptr<spv::Instruction> signs_switch_op =\n          std::make_unique<spv::Instruction>(spv::OpSwitch);\n      signs_switch_op->addIdOperand(equation);\n      // Make addition the default.\n      signs_switch_op->addIdOperand(block_signs_add.getId());\n      signs_switch_op->addImmediateOperand(int32_t(xenos::BlendOp::kSubtract));\n      signs_switch_op->addIdOperand(block_signs_subtract.getId());\n      signs_switch_op->addImmediateOperand(\n          int32_t(xenos::BlendOp::kRevSubtract));\n      signs_switch_op->addIdOperand(block_signs_reverse_subtract.getId());\n      builder_->getBuildPoint()->addInstruction(std::move(signs_switch_op));\n    }\n    block_signs_add.addPredecessor(&block_signs_head);\n    block_signs_subtract.addPredecessor(&block_signs_head);\n    block_signs_reverse_subtract.addPredecessor(&block_signs_head);\n\n    // Addition case.\n    builder_->setBuildPoint(&block_signs_add);\n    spv::Id result_add = builder_->createNoContractionBinOp(\n        spv::OpFAdd, value_type, term_source, term_dest);\n    builder_->createBranch(&block_signs_merge);\n\n    // Subtraction case.\n    builder_->setBuildPoint(&block_signs_subtract);\n    spv::Id result_subtract = builder_->createNoContractionBinOp(\n        spv::OpFSub, value_type, term_source, term_dest);\n    builder_->createBranch(&block_signs_merge);\n\n    // Reverse subtraction case.\n    builder_->setBuildPoint(&block_signs_reverse_subtract);\n    spv::Id result_reverse_subtract = builder_->createNoContractionBinOp(\n        spv::OpFSub, value_type, term_dest, term_source);\n    builder_->createBranch(&block_signs_merge);\n\n    // Selection between the signs involved in the addition.\n    builder_->setBuildPoint(&block_signs_merge);\n    id_vector_temp_.clear();\n    id_vector_temp_.reserve(2 * 3);\n    id_vector_temp_.push_back(result_add);\n    id_vector_temp_.push_back(block_signs_add.getId());\n    id_vector_temp_.push_back(result_subtract);\n    id_vector_temp_.push_back(block_signs_subtract.getId());\n    id_vector_temp_.push_back(result_reverse_subtract);\n    id_vector_temp_.push_back(block_signs_reverse_subtract.getId());\n    result_factors =\n        builder_->createOp(spv::OpPhi, value_type, id_vector_temp_);\n    builder_->createBranch(&block_min_max_merge);\n  }\n  // Get the latest block for blending with factors after all the control flow.\n  spv::Block& block_min_max_default_end = *builder_->getBuildPoint();\n\n  builder_->setBuildPoint(&block_min_max_merge);\n  // Choose out of min, max, and blending with factors.\n  id_vector_temp_.clear();\n  id_vector_temp_.reserve(2 * 3);\n  id_vector_temp_.push_back(result_min);\n  id_vector_temp_.push_back(block_min_max_min.getId());\n  id_vector_temp_.push_back(result_max);\n  id_vector_temp_.push_back(block_min_max_max.getId());\n  id_vector_temp_.push_back(result_factors);\n  id_vector_temp_.push_back(block_min_max_default_end.getId());\n  return builder_->createOp(spv::OpPhi, value_type, id_vector_temp_);\n}\n\n}  // namespace gpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/texture_address.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2026 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_TEXTURE_ADDRESS_H_\n#define XENIA_GPU_TEXTURE_ADDRESS_H_\n\n#include <cstdint>\n\n#include \"xenia/base/assert.h\"\n\nnamespace xe {\nnamespace gpu {\nnamespace texture_address {\n\n// Cases for regression testing of specific details of texture addressing:\n// - 3D tiled textures:\n//   - 4E4D07E9: Font, can be seen in various places such as the subtitles for\n//     the intro, as well as the text in the continue menu. 512x512x16 DXT5,\n//     though in the English version, only the first 3 slices seem to contain\n//     glyphs.\n// - Cubemaps with mips:\n//   - 415607D1: Skybox.\n// - Linear textures with packed mips:\n//   - 545407E0: Many DXT-compressed textures. Includes examples of the base\n//     level itself being in the packed mip tail (the 8x8 DXT1 texture of the\n//     two orange lights on the game machines on the first level).\n// - Mismatching pitch and width:\n//   - 584109FF: 1280x menu background with a pitch of 1408.\n// - Tight memory allocation:\n//   - 4E4D083E: Memory allocated for a linear 1280x720 8_8_8_8 texture tightly,\n//     must not access the data in the padding after aligning to 32x32\n//     (resulting in 1280x736) via the guest CPU memory mappings.\n\n// Level pitch (or width for non-base mip levels), height, and depth (for 3D\n// textures - stacked 2D textures use the exact array layer count for the stride\n// at every level, and cubemaps are normally stored with a stride of 6 faces)\n// are rounded up by the hardware for the purposes of calculating strides of\n// subresources and of macro tiles within a subresource to:\n// - 32x32 (2D) or 32x32x4 (3D) blocks. This is applicable to both tiled and\n//   linear textures. Note that for 3D, this is larger than a macro tile\n//   (32x16x4).\n// - Power of two, for non-base mip levels.\n// - 256 bytes for rows of linear textures.\n//\n// Note that for estimating the upper bound of memory used by a texture, merely\n// multiplying the rounded pitch, height and depth is not enough. Sometimes,\n// especially for linear textures, aligning the dimensions to this amount\n// results in more memory pages assumed to be needed, and the game may not\n// always actually allocate the memory for that padding. An example is 4E4D083E,\n// which has a 1280x720 8_8_8_8 linear texture, and it only allocates memory for\n// exactly 1280x720 elements (900 pages). However, if the dimensions are aligned\n// (1280x736), the texture is assumed to take up 920 pages, and when accessing\n// its memory respecting guest allocations and protection, access violations\n// occur when those unallocated 20 pages are read.\n//\n// Another scenario where the product of the aligned dimensions may not be an\n// accurate estimate (but in this case too small rather than too large) is when\n// the width exceeds the pitch.\nconstexpr unsigned int kStoragePitchHeightAlignmentBlocksLog2 = 5;\nconstexpr uint32_t kStoragePitchHeightAlignmentBlocks =\n    uint32_t(1) << kStoragePitchHeightAlignmentBlocksLog2;\nconstexpr unsigned int kStorageDepthAlignmentBlocksLog2 = 2;\nconstexpr uint32_t kStorageDepthAlignmentBlocks =\n    uint32_t(1) << kStorageDepthAlignmentBlocksLog2;\n\n// 2D tiling from:\n// https://github.com/BinomialLLC/crunch/blob/36479bc697be19168daafbf15f47f3c60ccec004/inc/crn_decomp.h#L4107\n// 3D tiling differences discovered via game reverse engineering.\n//\n// For easier calculation of various properties of addresses, offsetting within\n// smaller regions, etc., the bits of a tiled address are decomposed into\n// logical parts in this code. The meanings of the bits may not be entirely\n// accurate, but they're based on the structure of a tiled address in AMD's\n// AddrLib:\n// https://github.com/GPUOpen-Drivers/pal/tree/7ce51b199c72021b8d027c50b55da515fd9b2e0b/src/core/imported/addrlib/src/r800\n// (see `EgBasedLib::ComputeSurfaceAddrFromCoordMacroTiled` primarily).\n//\n// Additional information about the memory layout of AMD/ATI GPUs, specifically\n// channels and banks, can be found in the AMD Accelerated Parallel Processing\n// SDK OpenCL Optimization Guide:\n// https://docs.amd.com/v/u/en-US/AMD_OpenCL_Programming_Optimization_Guide2\n//\n// In Xenia, the terminology differs from the AddrLib to avoid confusion with\n// other concepts under the same names in Xenia. With Xenia naming, a hardware\n// tiled address consists of:\n//\n//  [:12] = `outer_inner_bytes[:8]` (page)\n//   [11] = `bank`\n// [10:8] = `outer_inner_bytes[7:5]` (bank interleave upper bits)\n//  [7:6] = `pipe`\n//    [5] = `outer_inner_bytes[4]` (pipe interleave upper bit)\n//    [4] = `y & 1` (Y least significant bit)\n//  [3:0] = `outer_inner_bytes[3:0]` (pipe interleave lower bits)\n//\n// The \"outer_inner\" part is scaled by the number of bytes per block:\n// `outer_inner_bytes = outer_inner_blocks << log2(bytes_per_block)`\n// where `outer_inner_blocks` is a sum (or bitwise OR) of two terms:\n// - `outer_blocks`: Origin of the 32x32 (2D) or 32x16x4 (3D) macro tile within\n//   the subresource.\n//   Macro tiles are treated as laid out macro-tile-linearly in the calculation\n//   of this part, with Z being the most significant term, Y in between, and X\n//   being the least significant.\n//   2D:\n//   (x[:5] + ceil(pitch / 32) * y[:5]) << 6\n//   3D:\n//   (x[:5] + ceil(pitch / 32) * (y[:4] + 2 * ceil(height / 32) * z[:2])) << 7\n// - `inner_blocks`: Offset of 1x2x1 blocks within a 8x16 (2D) or 8x8x4 micro\n//   tile.\n//   Though the LSB of Y always goes to the bit 4 of the memory address, within\n//   a micro tile, {X, Y[:1], Z} can be treated as linear in the calculation of\n//   this part, with Z being the most significant, Y in between, and X being the\n//   least significant.\n//   2D:\n//   - inner_blocks[5:3] = y[3:1]\n//   - inner_blocks[2:0] = x[2:0]\n//   3D:\n//   - inner_blocks[6:5] = z[1:0]\n//   - inner_blocks[4:3] = y[2:1]\n//   - inner_blocks[2:0] = x[2:0]\n//\n// However, the \"outer/inner\" part doesn't include the offset of the micro tile\n// within the macro tile: X[4:3], and Y[4] (2D) or Y[3] (3D). These are encoded\n// in the pipe and bank selection bits (with certain bits flipped depending on\n// Y[3] and Z[2] to avoid access conflicts). According to the AMD APP SDK\n// programming guides, memory is split into banks, and banks have multiple\n// channels (also known as pipes in the AddrLib), and tiling is designed for\n// avoiding bank and channel conflicts during texture sampling.\n// 2D:\n// - bank = y[4]\n// - pipe[1] = x[4] ^ y[3]\n// - pipe[0] = x[3]\n// 3D:\n// - bank = y[3] ^ z[2]\n// - pipe[1] = x[4] ^ y[3] ^ z[2]\n// - pipe[0] = x[3]\n//\n// \"Page\" refers to a 4 KB RAM row. While it's not exactly a correct term, as\n// physical memory is non-paged, it was chosen to distinguish from rows in\n// general (such as rows of elements), and its size matches the small page size\n// on the CPU. Texture subresource base addresses are aligned to this amount,\n// and pipe and bank selection bits are below it. These bits are particularly\n// important for estimating the extent of the texture for the purposes of\n// synchronizing GPU resource memory on the host due to it matching the CPU page\n// size.\n//\n// The tiled address functions can be used in both positive and negative\n// directions. One example of negative offsetting done by Direct3D 9 itself on\n// the Xbox 360 is resolving EDRAM render target data to texture subregions,\n// primarily in tiled rendering. The GPU uses the same source EDRAM render\n// target and destination texture pixel coordinates while resolving, and to\n// resolve to a different location, Direct3D 9 adjusts the destination texture\n// base pointer, and it can do that in both directions. The granularity of such\n// offsetting is limited, however, by the requirement that relative memory\n// addresses for relative pixel coordinates must stay the same after the\n// offsetting - more specifically, it's limited by the page size and the macro\n// tile size, whichever is greater.\n\nconstexpr unsigned int kMacroTileWidthLog2 = 5;\nconstexpr uint32_t kMacroTileWidth = uint32_t(1) << kMacroTileWidthLog2;\nconstexpr unsigned int kMacroTileHeight2DLog2 = 5;\nconstexpr uint32_t kMacroTileHeight2D = uint32_t(1) << kMacroTileHeight2DLog2;\nconstexpr unsigned int kMacroTileHeight3DLog2 = 4;\nconstexpr uint32_t kMacroTileHeight3D = uint32_t(1) << kMacroTileHeight3DLog2;\nconstexpr unsigned int kMacroTileDepthLog2 = 2;\nconstexpr uint32_t kMacroTileDepth = uint32_t(1) << kMacroTileDepthLog2;\n\ntemplate <typename Address>\nAddress TiledCombine(const Address outer_inner_bytes, const uint32_t bank,\n                     const uint32_t pipe, const uint32_t y_lsb) {\n  assert_true(bank <= 0b1);\n  assert_true(pipe <= 0b11);\n  assert_true(y_lsb <= 0b1);\n  return int32_t((y_lsb << 4) | (pipe << 6) | (bank << 11)) |\n         (outer_inner_bytes & 0b1111) |\n         (((outer_inner_bytes >> 4) & 0b1) << 5) |\n         (((outer_inner_bytes >> 5) & 0b111) << 8) |\n         (outer_inner_bytes >> 8 << 12);\n}\n\n// The absolute of the return value is below 2^31 (for 16384x8192 with 16 bytes\n// per block, though it's not even clear if the hardware allows pitches greater\n// than 8192, the maximum texture size, but the pitch field in a texture fetch\n// constant is 14 bits wide).\ninline int32_t Tiled2D(const int32_t x, const int32_t y,\n                       const uint32_t pitch_aligned,\n                       const unsigned int bytes_per_block_log2) {\n  // Expecting that all the needed rounding (not only to 32x32, but also to a\n  // power of two for mips) is done before the call so this function works with\n  // the actual storage dimensions.\n  assert_zero(pitch_aligned & (kStoragePitchHeightAlignmentBlocks - 1));\n  const int32_t outer_blocks =\n      ((y >> kMacroTileHeight2DLog2) *\n           int32_t(pitch_aligned >> kMacroTileWidthLog2) +\n       (x >> kMacroTileWidthLog2))\n      << 6;\n  const int32_t inner_blocks = (((y >> 1) & 0b111) << 3) | (x & 0b111);\n  const int32_t outer_inner_bytes = (outer_blocks | inner_blocks)\n                                    << bytes_per_block_log2;\n  const uint32_t bank = (y >> 4) & 0b1;\n  const uint32_t pipe = ((x >> 3) & 0b11) ^ (((y >> 3) & 0b1) << 1);\n  return TiledCombine(outer_inner_bytes, bank, pipe, y & 1);\n}\n\n// The absolute of the return value is below 2^39 (for 16384x2048x1024 with 16\n// bytes per block). This also means that 32 (more precisely, 27) bits is always\n// enough for the page index within a subresource.\ninline int64_t Tiled3D(const int32_t x, const int32_t y, const int32_t z,\n                       const uint32_t pitch_aligned,\n                       const uint32_t height_aligned,\n                       const unsigned int bytes_per_block_log2) {\n  // Expecting that all the needed rounding (not only to 32x32x4, but also to a\n  // power of two for mips) is done before the call so this function works with\n  // the actual storage dimensions.\n  assert_zero(pitch_aligned & (kStoragePitchHeightAlignmentBlocks - 1));\n  assert_zero(height_aligned & (kStoragePitchHeightAlignmentBlocks - 1));\n  // The absolute of `outer_blocks` is below (1024 / 4) * (2048 / 16) *\n  // (16384 / 32) * 128 = 2^31.\n  const int32_t outer_blocks =\n      ((((z >> kMacroTileDepthLog2) *\n             (height_aligned >> kMacroTileHeight3DLog2) +\n         (y >> kMacroTileHeight3DLog2)) *\n        int32_t(pitch_aligned >> kMacroTileWidthLog2)) +\n       (x >> kMacroTileWidthLog2))\n      << 7;\n  const int32_t inner_blocks =\n      ((z & 0b11) << 5) | (((y >> 1) & 0b11) << 3) | (x & 0b111);\n  const int64_t outer_inner_bytes = int64_t(outer_blocks | inner_blocks)\n                                    << bytes_per_block_log2;\n  const uint32_t bank = ((y >> 3) ^ (z >> 2)) & 0b1;\n  const uint32_t pipe = ((x >> 3) & 0b11) ^ (bank << 1);\n  return TiledCombine(outer_inner_bytes, bank, pipe, y & 1);\n}\n\n}  // namespace texture_address\n}  // namespace gpu\n}  // namespace xe\n\n#endif  // XENIA_GPU_TEXTURE_ADDRESS_H_\n"
  },
  {
    "path": "src/xenia/gpu/texture_cache.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/texture_cache.h\"\n\n#include <algorithm>\n#include <cstdint>\n#include <utility>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/clock.h\"\n#include \"xenia/base/cvar.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/profiling.h\"\n#include \"xenia/gpu/gpu_flags.h\"\n#include \"xenia/gpu/register_file.h\"\n#include \"xenia/gpu/texture_info.h\"\n#include \"xenia/gpu/texture_util.h\"\n#include \"xenia/gpu/xenos.h\"\n\nDEFINE_int32(\n    draw_resolution_scale_x, 1,\n    \"Integer pixel width scale used for scaling the rendering resolution \"\n    \"opaquely to the game.\\n\"\n    \"1, 2 and 3 may be supported, but support of anything above 1 depends on \"\n    \"the device properties, such as whether it supports sparse binding / tiled \"\n    \"resources, the number of virtual address bits per resource, and other \"\n    \"factors.\\n\"\n    \"Various effects and parts of game rendering pipelines may work \"\n    \"incorrectly as pixels become ambiguous from the game's perspective and \"\n    \"because half-pixel offset (which normally doesn't affect coverage when \"\n    \"MSAA isn't used) becomes full-pixel.\",\n    \"GPU\");\nDEFINE_int32(\n    draw_resolution_scale_y, 1,\n    \"Integer pixel width scale used for scaling the rendering resolution \"\n    \"opaquely to the game.\\n\"\n    \"See draw_resolution_scale_x for more information.\",\n    \"GPU\");\nDEFINE_uint32(\n    texture_cache_memory_limit_soft, 384,\n    \"Maximum host texture memory usage (in megabytes) above which old textures \"\n    \"will be destroyed.\",\n    \"GPU\");\nDEFINE_uint32(\n    texture_cache_memory_limit_soft_lifetime, 30,\n    \"Seconds a texture should be unused to be considered old enough to be \"\n    \"deleted if texture memory usage exceeds texture_cache_memory_limit_soft.\",\n    \"GPU\");\nDEFINE_uint32(\n    texture_cache_memory_limit_hard, 768,\n    \"Maximum host texture memory usage (in megabytes) above which textures \"\n    \"will be destroyed as soon as possible.\",\n    \"GPU\");\nDEFINE_uint32(\n    texture_cache_memory_limit_render_to_texture, 24,\n    \"Part of the host texture memory budget (in megabytes) that will be scaled \"\n    \"by the current drawing resolution scale.\\n\"\n    \"If texture_cache_memory_limit_soft, for instance, is 384, and this is 24, \"\n    \"it will be assumed that the game will be using roughly 24 MB of \"\n    \"render-to-texture (resolve) targets and 384 - 24 = 360 MB of regular \"\n    \"textures - so with 2x2 resolution scaling, the soft limit will be 360 + \"\n    \"96 MB, and with 3x3, it will be 360 + 216 MB.\",\n    \"GPU\");\n\nnamespace xe {\nnamespace gpu {\n\nconst TextureCache::LoadShaderInfo\n    TextureCache::load_shader_info_[kLoadShaderCount] = {\n        {1, 4},   // k8bpb\n        {2, 4},   // k16bpb\n        {4, 3},   // k32bpb\n        {8, 2},   // k64bpb\n        {16, 1},  // k128bpb\n        {2, 4},   // kR5G5B5A1ToB5G5R5A1\n        {2, 4},   // kR5G6B5ToB5G6R5\n        {2, 4},   // kR5G5B6ToB5G6R5WithRBGASwizzle\n        {2, 4},   // kRGBA4ToBGRA4\n        {2, 4},   // kRGBA4ToARGB4\n        {4, 3},   // kGBGR8ToGRGB8\n        {8, 3},   // kGBGR8ToRGB8\n        {4, 3},   // kBGRG8ToRGBG8\n        {8, 3},   // kBGRG8ToRGB8\n        {8, 3},   // kR10G11B11ToRGBA16\n        {8, 3},   // kR10G11B11ToRGBA16SNorm\n        {8, 3},   // kR11G11B10ToRGBA16\n        {8, 3},   // kR11G11B10ToRGBA16SNorm\n        {2, 4},   // kR16UNormToFloat\n        {2, 4},   // kR16SNormToFloat\n        {4, 3},   // kRG16UNormToFloat\n        {4, 3},   // kRG16SNormToFloat\n        {8, 2},   // kRGBA16UNormToFloat\n        {8, 2},   // kRGBA16SNormToFloat\n        {4, 2},   // kDXT1ToRGBA8\n        {4, 1},   // kDXT3ToRGBA8\n        {4, 1},   // kDXT5ToRGBA8\n        {2, 1},   // kDXNToRG8\n        {1, 2},   // kDXT3A\n        {2, 2},   // kDXT3AAs1111ToBGRA4\n        {2, 2},   // kDXT3AAs1111ToARGB4\n        {1, 2},   // kDXT5AToR8\n        {2, 2},   // kCTX1\n        {4, 3},   // kDepthUnorm\n        {4, 3},   // kDepthFloat\n};\n\nTextureCache::TextureCache(const RegisterFile& register_file,\n                           SharedMemory& shared_memory,\n                           uint32_t draw_resolution_scale_x,\n                           uint32_t draw_resolution_scale_y)\n    : register_file_(register_file),\n      shared_memory_(shared_memory),\n      draw_resolution_scale_x_(draw_resolution_scale_x),\n      draw_resolution_scale_y_(draw_resolution_scale_y) {\n  assert_true(draw_resolution_scale_x >= 1);\n  assert_true(draw_resolution_scale_x <= kMaxDrawResolutionScaleAlongAxis);\n  assert_true(draw_resolution_scale_y >= 1);\n  assert_true(draw_resolution_scale_y <= kMaxDrawResolutionScaleAlongAxis);\n\n  if (draw_resolution_scale_x > 1 || draw_resolution_scale_y > 1) {\n    constexpr uint32_t kScaledResolvePageDwordCount =\n        SharedMemory::kBufferSize / 4096 / 32;\n    scaled_resolve_pages_ =\n        std::unique_ptr<uint32_t[]>(new uint32_t[kScaledResolvePageDwordCount]);\n    std::memset(scaled_resolve_pages_.get(), 0,\n                kScaledResolvePageDwordCount * sizeof(uint32_t));\n    std::memset(scaled_resolve_pages_l2_, 0, sizeof(scaled_resolve_pages_l2_));\n    scaled_resolve_global_watch_handle_ = shared_memory.RegisterGlobalWatch(\n        ScaledResolveGlobalWatchCallbackThunk, this);\n  }\n}\n\nTextureCache::~TextureCache() {\n  DestroyAllTextures(true);\n\n  if (scaled_resolve_global_watch_handle_) {\n    shared_memory().UnregisterGlobalWatch(scaled_resolve_global_watch_handle_);\n  }\n}\n\nbool TextureCache::GetConfigDrawResolutionScale(uint32_t& x_out,\n                                                uint32_t& y_out) {\n  uint32_t config_x =\n      uint32_t(std::max(INT32_C(1), cvars::draw_resolution_scale_x));\n  uint32_t config_y =\n      uint32_t(std::max(INT32_C(1), cvars::draw_resolution_scale_y));\n  uint32_t clamped_x = std::min(kMaxDrawResolutionScaleAlongAxis, config_x);\n  uint32_t clamped_y = std::min(kMaxDrawResolutionScaleAlongAxis, config_y);\n  x_out = clamped_x;\n  y_out = clamped_y;\n  return clamped_x == config_x && clamped_y == config_y;\n}\n\nvoid TextureCache::ClearCache() { DestroyAllTextures(); }\n\nvoid TextureCache::CompletedSubmissionUpdated(\n    uint64_t completed_submission_index) {\n  // If memory usage is too high, destroy unused textures.\n  uint64_t current_time = xe::Clock::QueryHostUptimeMillis();\n  // texture_cache_memory_limit_render_to_texture is assumed to be included in\n  // texture_cache_memory_limit_soft and texture_cache_memory_limit_hard, at 1x,\n  // so subtracting 1 from the scale.\n  uint32_t limit_scaled_resolve_add_mb =\n      cvars::texture_cache_memory_limit_render_to_texture *\n      (draw_resolution_scale_x() * draw_resolution_scale_y() - 1);\n  uint32_t limit_soft_mb =\n      cvars::texture_cache_memory_limit_soft + limit_scaled_resolve_add_mb;\n  uint32_t limit_hard_mb =\n      cvars::texture_cache_memory_limit_hard + limit_scaled_resolve_add_mb;\n  uint32_t limit_soft_lifetime =\n      cvars::texture_cache_memory_limit_soft_lifetime * 1000;\n  bool destroyed_any = false;\n  while (texture_used_first_ != nullptr) {\n    uint64_t total_host_memory_usage_mb =\n        (textures_total_host_memory_usage_ + ((UINT32_C(1) << 20) - 1)) >> 20;\n    bool limit_hard_exceeded = total_host_memory_usage_mb > limit_hard_mb;\n    if (total_host_memory_usage_mb <= limit_soft_mb && !limit_hard_exceeded) {\n      break;\n    }\n    Texture* texture = texture_used_first_;\n    if (texture->last_usage_submission_index() > completed_submission_index) {\n      break;\n    }\n    if (!limit_hard_exceeded &&\n        (texture->last_usage_time() + limit_soft_lifetime) > current_time) {\n      break;\n    }\n    if (!destroyed_any) {\n      destroyed_any = true;\n      // The texture being destroyed might have been bound in the previous\n      // submissions, and nothing has overwritten the binding yet, so completion\n      // of the submission where the texture was last actually used on the GPU\n      // doesn't imply that it's not bound currently. Reset bindings if\n      // any texture has been destroyed.\n      ResetTextureBindings();\n    }\n    // Remove the texture from the map and destroy it via its unique_ptr.\n    auto found_texture_it = textures_.find(texture->key());\n    assert_true(found_texture_it != textures_.end());\n    if (found_texture_it != textures_.end()) {\n      assert_true(found_texture_it->second.get() == texture);\n      textures_.erase(found_texture_it);\n      // `texture` is invalid now.\n    }\n  }\n  if (destroyed_any) {\n    COUNT_profile_set(\"gpu/texture_cache/textures\", textures_.size());\n  }\n}\n\nvoid TextureCache::BeginSubmission(uint64_t new_submission_index) {\n  assert_true(new_submission_index > current_submission_index_);\n  current_submission_index_ = new_submission_index;\n  current_submission_time_ = xe::Clock::QueryHostUptimeMillis();\n}\n\nvoid TextureCache::BeginFrame() {\n  // In case there was a failure to create something in the previous frame, make\n  // sure bindings are reset so a new attempt will surely be made if the texture\n  // is requested again.\n  ResetTextureBindings();\n}\n\nvoid TextureCache::MarkRangeAsResolved(uint32_t start_unscaled,\n                                       uint32_t length_unscaled) {\n  if (length_unscaled == 0) {\n    return;\n  }\n  start_unscaled &= 0x1FFFFFFF;\n  length_unscaled = std::min(length_unscaled, 0x20000000 - start_unscaled);\n\n  if (IsDrawResolutionScaled()) {\n    uint32_t page_first = start_unscaled >> 12;\n    uint32_t page_last = (start_unscaled + length_unscaled - 1) >> 12;\n    uint32_t block_first = page_first >> 5;\n    uint32_t block_last = page_last >> 5;\n    auto global_lock = global_critical_region_.Acquire();\n    for (uint32_t i = block_first; i <= block_last; ++i) {\n      uint32_t add_bits = UINT32_MAX;\n      if (i == block_first) {\n        add_bits &= ~((UINT32_C(1) << (page_first & 31)) - 1);\n      }\n      if (i == block_last && (page_last & 31) != 31) {\n        add_bits &= (UINT32_C(1) << ((page_last & 31) + 1)) - 1;\n      }\n      scaled_resolve_pages_[i] |= add_bits;\n      scaled_resolve_pages_l2_[i >> 6] |= UINT64_C(1) << (i & 63);\n    }\n  }\n\n  // Invalidate textures. Toggling individual textures between scaled and\n  // unscaled also relies on invalidation through shared memory.\n  shared_memory().RangeWrittenByGpu(start_unscaled, length_unscaled);\n}\n\nuint32_t TextureCache::GuestToHostSwizzle(uint32_t guest_swizzle,\n                                          uint32_t host_format_swizzle) {\n  uint32_t host_swizzle = 0;\n  for (uint32_t i = 0; i < 4; ++i) {\n    uint32_t guest_swizzle_component = (guest_swizzle >> (3 * i)) & 0b111;\n    uint32_t host_swizzle_component;\n    if (guest_swizzle_component >= xenos::XE_GPU_TEXTURE_SWIZZLE_0) {\n      // Get rid of 6 and 7 values (to prevent host GPU errors if the game has\n      // something broken) the simple way - by changing them to 4 (0) and 5 (1).\n      host_swizzle_component = guest_swizzle_component & 0b101;\n    } else {\n      host_swizzle_component =\n          (host_format_swizzle >> (3 * guest_swizzle_component)) & 0b111;\n    }\n    host_swizzle |= host_swizzle_component << (3 * i);\n  }\n  return host_swizzle;\n}\n\nvoid TextureCache::RequestTextures(uint32_t used_texture_mask) {\n  const auto& regs = register_file();\n\n  if (texture_became_outdated_.exchange(false, std::memory_order_acquire)) {\n    // A texture has become outdated - make sure whether textures are outdated\n    // is rechecked in this draw and in subsequent ones to reload the new data\n    // if needed.\n    ResetTextureBindings();\n  }\n\n  // Update the texture keys and the textures.\n  uint32_t bindings_changed = 0;\n  uint32_t textures_remaining = used_texture_mask & ~texture_bindings_in_sync_;\n  uint32_t index = 0;\n  while (xe::bit_scan_forward(textures_remaining, &index)) {\n    uint32_t index_bit = UINT32_C(1) << index;\n    textures_remaining &= ~index_bit;\n    TextureBinding& binding = texture_bindings_[index];\n    xenos::xe_gpu_texture_fetch_t fetch = regs.GetTextureFetch(index);\n    TextureKey old_key = binding.key;\n    uint8_t old_swizzled_signs = binding.swizzled_signs;\n    BindingInfoFromFetchConstant(fetch, binding.key, &binding.swizzled_signs);\n    texture_bindings_in_sync_ |= index_bit;\n    if (!binding.key.is_valid) {\n      if (old_key.is_valid) {\n        bindings_changed |= index_bit;\n      }\n      binding.Reset();\n      continue;\n    }\n    uint32_t old_host_swizzle = binding.host_swizzle;\n    binding.host_swizzle =\n        GuestToHostSwizzle(fetch.swizzle, GetHostFormatSwizzle(binding.key));\n\n    // Check if need to load the unsigned and the signed versions of the texture\n    // (if the format is emulated with different host bit representations for\n    // signed and unsigned - otherwise only the unsigned one is loaded).\n    bool key_changed = binding.key != old_key;\n    bool any_sign_was_not_signed =\n        texture_util::IsAnySignNotSigned(old_swizzled_signs);\n    bool any_sign_was_signed =\n        texture_util::IsAnySignSigned(old_swizzled_signs);\n    bool any_sign_is_not_signed =\n        texture_util::IsAnySignNotSigned(binding.swizzled_signs);\n    bool any_sign_is_signed =\n        texture_util::IsAnySignSigned(binding.swizzled_signs);\n    if (key_changed || binding.host_swizzle != old_host_swizzle ||\n        any_sign_is_not_signed != any_sign_was_not_signed ||\n        any_sign_is_signed != any_sign_was_signed) {\n      bindings_changed |= index_bit;\n    }\n    bool load_unsigned_data = false, load_signed_data = false;\n    if (IsSignedVersionSeparateForFormat(binding.key)) {\n      // Can reuse previously loaded unsigned/signed versions if the key is the\n      // same and the texture was previously bound as unsigned/signed\n      // respectively (checking the previous values of signedness rather than\n      // binding.texture != nullptr and binding.texture_signed != nullptr also\n      // prevents repeated attempts to load the texture if it has failed to\n      // load).\n      if (any_sign_is_not_signed) {\n        if (key_changed || !any_sign_was_not_signed) {\n          binding.texture = FindOrCreateTexture(binding.key);\n          load_unsigned_data = true;\n        }\n      } else {\n        binding.texture = nullptr;\n      }\n      if (any_sign_is_signed) {\n        if (key_changed || !any_sign_was_signed) {\n          TextureKey signed_key = binding.key;\n          signed_key.signed_separate = 1;\n          binding.texture_signed = FindOrCreateTexture(signed_key);\n          load_signed_data = true;\n        }\n      } else {\n        binding.texture_signed = nullptr;\n      }\n    } else {\n      // Same resource for both unsigned and signed, but descriptor formats may\n      // be different.\n      if (key_changed) {\n        binding.texture = FindOrCreateTexture(binding.key);\n        load_unsigned_data = true;\n      }\n      binding.texture_signed = nullptr;\n    }\n    if (load_unsigned_data && binding.texture != nullptr) {\n      LoadTextureData(*binding.texture);\n    }\n    if (load_signed_data && binding.texture_signed != nullptr) {\n      LoadTextureData(*binding.texture_signed);\n    }\n  }\n  if (bindings_changed) {\n    UpdateTextureBindingsImpl(bindings_changed);\n  }\n}\n\nconst char* TextureCache::TextureKey::GetLogDimensionName(\n    xenos::DataDimension dimension) {\n  switch (dimension) {\n    case xenos::DataDimension::k1D:\n      return \"1D\";\n    case xenos::DataDimension::k2DOrStacked:\n      return \"2D\";\n    case xenos::DataDimension::k3D:\n      return \"3D\";\n    case xenos::DataDimension::kCube:\n      return \"cube\";\n    default:\n      assert_unhandled_case(dimension);\n      return \"unknown\";\n  }\n}\n\nvoid TextureCache::TextureKey::LogAction(const char* action) const {\n  XELOGGPU(\n      \"{} {} {}{}x{}x{} {} {} texture with {} {}packed mip level{}, \"\n      \"base at 0x{:08X} (pitch {}), mips at 0x{:08X}\",\n      action, tiled ? \"tiled\" : \"linear\", scaled_resolve ? \"scaled \" : \"\",\n      GetWidth(), GetHeight(), GetDepthOrArraySize(), GetLogDimensionName(),\n      FormatInfo::Get(format)->name, mip_max_level + 1, packed_mips ? \"\" : \"un\",\n      mip_max_level != 0 ? \"s\" : \"\", base_page << 12, pitch << 5,\n      mip_page << 12);\n}\n\nvoid TextureCache::Texture::LogAction(const char* action) const {\n  XELOGGPU(\n      \"{} {} {}{}x{}x{} {} {} texture with {} {}packed mip level{}, \"\n      \"base at 0x{:08X} (pitch {}, size 0x{:08X}), mips at 0x{:08X} (size \"\n      \"0x{:08X})\",\n      action, key_.tiled ? \"tiled\" : \"linear\",\n      key_.scaled_resolve ? \"scaled \" : \"\", key_.GetWidth(), key_.GetHeight(),\n      key_.GetDepthOrArraySize(), key_.GetLogDimensionName(),\n      FormatInfo::Get(key_.format)->name, key_.mip_max_level + 1,\n      key_.packed_mips ? \"\" : \"un\", key_.mip_max_level != 0 ? \"s\" : \"\",\n      key_.base_page << 12, key_.pitch << 5, GetGuestBaseSize(),\n      key_.mip_page << 12, GetGuestMipsSize());\n}\n\n// The texture must be in the recent usage list. Place it in front now because\n// after creation, the texture will likely be used immediately, and it should\n// not be destroyed immediately after creation if dropping of old textures is\n// performed somehow. The list is maintained by the Texture, not the\n// TextureCache itself (unlike the `textures_` container).\nTextureCache::Texture::Texture(TextureCache& texture_cache,\n                               const TextureKey& key)\n    : texture_cache_(texture_cache),\n      key_(key),\n      guest_layout_(key.GetGuestLayout()),\n      last_usage_submission_index_(texture_cache.current_submission_index_),\n      last_usage_time_(texture_cache.current_submission_time_),\n      used_previous_(texture_cache.texture_used_last_),\n      used_next_(nullptr) {\n  if (texture_cache.texture_used_last_) {\n    texture_cache.texture_used_last_->used_next_ = this;\n  } else {\n    texture_cache.texture_used_first_ = this;\n  }\n  texture_cache.texture_used_last_ = this;\n\n  // Never try to upload data that doesn't exist.\n  base_outdated_ = guest_layout().base.level_data_extent_bytes != 0;\n  mips_outdated_ = guest_layout().mips_total_extent_bytes != 0;\n}\n\nTextureCache::Texture::~Texture() {\n  if (mips_watch_handle_) {\n    texture_cache().shared_memory().UnwatchMemoryRange(mips_watch_handle_);\n  }\n  if (base_watch_handle_) {\n    texture_cache().shared_memory().UnwatchMemoryRange(base_watch_handle_);\n  }\n\n  if (used_previous_) {\n    used_previous_->used_next_ = used_next_;\n  } else {\n    texture_cache_.texture_used_first_ = used_next_;\n  }\n  if (used_next_) {\n    used_next_->used_previous_ = used_previous_;\n  } else {\n    texture_cache_.texture_used_last_ = used_previous_;\n  }\n\n  texture_cache_.UpdateTexturesTotalHostMemoryUsage(0, host_memory_usage_);\n}\n\nvoid TextureCache::Texture::MakeUpToDateAndWatch(\n    const std::unique_lock<std::recursive_mutex>& global_lock) {\n  SharedMemory& shared_memory = texture_cache().shared_memory();\n  if (base_outdated_) {\n    assert_not_zero(GetGuestBaseSize());\n    base_outdated_ = false;\n    base_watch_handle_ = shared_memory.WatchMemoryRange(\n        key().base_page << 12, GetGuestBaseSize(), TextureCache::WatchCallback,\n        this, nullptr, 0);\n  }\n  if (mips_outdated_) {\n    assert_not_zero(GetGuestMipsSize());\n    mips_outdated_ = false;\n    mips_watch_handle_ = shared_memory.WatchMemoryRange(\n        key().mip_page << 12, GetGuestMipsSize(), TextureCache::WatchCallback,\n        this, nullptr, 1);\n  }\n}\n\nvoid TextureCache::Texture::MarkAsUsed() {\n  assert_true(last_usage_submission_index_ <=\n              texture_cache_.current_submission_index_);\n  // This is called very frequently, don't relink unless needed for caching.\n  if (last_usage_submission_index_ >=\n      texture_cache_.current_submission_index_) {\n    return;\n  }\n  last_usage_submission_index_ = texture_cache_.current_submission_index_;\n  last_usage_time_ = texture_cache_.current_submission_time_;\n  if (used_next_ == nullptr) {\n    // Already the most recently used.\n    return;\n  }\n  if (used_previous_ != nullptr) {\n    used_previous_->used_next_ = used_next_;\n  } else {\n    texture_cache_.texture_used_first_ = used_next_;\n  }\n  used_next_->used_previous_ = used_previous_;\n  used_previous_ = texture_cache_.texture_used_last_;\n  used_next_ = nullptr;\n  texture_cache_.texture_used_last_->used_next_ = this;\n  texture_cache_.texture_used_last_ = this;\n}\n\nvoid TextureCache::Texture::WatchCallback(\n    [[maybe_unused]] const std::unique_lock<std::recursive_mutex>& global_lock,\n    bool is_mip) {\n  if (is_mip) {\n    assert_not_zero(GetGuestMipsSize());\n    mips_outdated_ = true;\n    mips_watch_handle_ = nullptr;\n  } else {\n    assert_not_zero(GetGuestBaseSize());\n    base_outdated_ = true;\n    base_watch_handle_ = nullptr;\n  }\n}\n\nvoid TextureCache::WatchCallback(\n    const std::unique_lock<std::recursive_mutex>& global_lock, void* context,\n    void* data, uint64_t argument, bool invalidated_by_gpu) {\n  Texture& texture = *static_cast<Texture*>(context);\n  texture.WatchCallback(global_lock, argument != 0);\n  texture.texture_cache().texture_became_outdated_.store(\n      true, std::memory_order_release);\n}\n\nvoid TextureCache::DestroyAllTextures(bool from_destructor) {\n  ResetTextureBindings(from_destructor);\n  textures_.clear();\n  COUNT_profile_set(\"gpu/texture_cache/textures\", 0);\n}\n\nTextureCache::Texture* TextureCache::FindOrCreateTexture(TextureKey key) {\n  // Check if the texture is a scaled resolve texture.\n  if (IsDrawResolutionScaled() && key.tiled &&\n      IsScaledResolveSupportedForFormat(key)) {\n    texture_util::TextureGuestLayout scaled_resolve_guest_layout =\n        key.GetGuestLayout();\n    if ((scaled_resolve_guest_layout.base.level_data_extent_bytes &&\n         IsRangeScaledResolved(\n             key.base_page << 12,\n             scaled_resolve_guest_layout.base.level_data_extent_bytes)) ||\n        (scaled_resolve_guest_layout.mips_total_extent_bytes &&\n         IsRangeScaledResolved(\n             key.mip_page << 12,\n             scaled_resolve_guest_layout.mips_total_extent_bytes))) {\n      key.scaled_resolve = 1;\n    }\n  }\n\n  uint32_t host_width = key.GetWidth();\n  uint32_t host_height = key.GetHeight();\n  if (key.scaled_resolve) {\n    host_width *= draw_resolution_scale_x();\n    host_height *= draw_resolution_scale_y();\n  }\n  // With 3x resolution scaling, a 2D texture may become bigger than the\n  // Direct3D 11 limit, and with 2x, a 3D one as well.\n  // TODO(Triang3l): Skip mips on Vulkan in this case - the minimum requirement\n  // there is 4096, which is below the Xenos maximum texture size of 8192.\n  uint32_t max_host_width_height = GetMaxHostTextureWidthHeight(key.dimension);\n  uint32_t max_host_depth_or_array_size =\n      GetMaxHostTextureDepthOrArraySize(key.dimension);\n  if (host_width > max_host_width_height ||\n      host_height > max_host_width_height ||\n      key.GetDepthOrArraySize() > max_host_depth_or_array_size) {\n    return nullptr;\n  }\n\n  // Try to find an existing texture.\n  // TODO(Triang3l): Reuse a texture with mip_page unchanged, but base_page\n  // previously 0, now not 0, to save memory - common case in streaming.\n  auto found_texture_it = textures_.find(key);\n  if (found_texture_it != textures_.end()) {\n    return found_texture_it->second.get();\n  }\n\n  // Create the texture and add it to the map.\n  Texture* texture;\n  {\n    std::unique_ptr<Texture> new_texture = CreateTexture(key);\n    if (!new_texture) {\n      key.LogAction(\"Failed to create\");\n      return nullptr;\n    }\n    assert_true(new_texture->key() == key);\n    texture =\n        textures_.emplace(key, std::move(new_texture)).first->second.get();\n  }\n  COUNT_profile_set(\"gpu/texture_cache/textures\", textures_.size());\n  texture->LogAction(\"Created\");\n  return texture;\n}\n\nbool TextureCache::LoadTextureData(Texture& texture) {\n  // Check what needs to be uploaded.\n  bool base_outdated, mips_outdated;\n  {\n    auto global_lock = global_critical_region_.Acquire();\n    base_outdated = texture.base_outdated(global_lock);\n    mips_outdated = texture.mips_outdated(global_lock);\n  }\n  if (!base_outdated && !mips_outdated) {\n    return true;\n  }\n\n  TextureKey texture_key = texture.key();\n\n  // Implementation may load multiple blocks at once via accesses of up to 128\n  // bits (R32G32B32A32_UINT), so aligning the size to this value to make sure\n  // if the texture is small (especially if it's linear), the last blocks won't\n  // be cut off (hosts may return 0, 0, 0, 0 for the whole R32G32B32A32_UINT\n  // access for the non-16-aligned tail even if 1...15 bytes are actually\n  // provided for it).\n\n  // Request uploading of the texture data to the shared memory.\n  // This is also necessary when resolution scaling is used - the texture cache\n  // relies on shared memory for invalidation of both unscaled and scaled\n  // textures. Plus a texture may be unscaled partially, when only a portion of\n  // its pages is invalidated, in this case we'll need the texture from the\n  // shared memory to load the unscaled parts.\n  // TODO(Triang3l): Load unscaled parts.\n  if (base_outdated) {\n    if (!shared_memory().RequestRange(\n            texture_key.base_page << 12,\n            xe::align(texture.GetGuestBaseSize(), UINT32_C(16)))) {\n      return false;\n    }\n  }\n  if (mips_outdated) {\n    if (!shared_memory().RequestRange(\n            texture_key.mip_page << 12,\n            xe::align(texture.GetGuestMipsSize(), UINT32_C(16)))) {\n      return false;\n    }\n  }\n  if (texture_key.scaled_resolve) {\n    // Make sure all the scaled resolve memory is resident and accessible from\n    // the shader, including any possible padding that hasn't yet been touched\n    // by an actual resolve, but is still included in the texture size, so the\n    // GPU won't be trying to access unmapped memory.\n    if (!EnsureScaledResolveMemoryCommitted(texture_key.base_page << 12,\n                                            texture.GetGuestBaseSize(), 4)) {\n      return false;\n    }\n    if (!EnsureScaledResolveMemoryCommitted(texture_key.mip_page << 12,\n                                            texture.GetGuestMipsSize(), 4)) {\n      return false;\n    }\n  }\n\n  // Actually load the texture data.\n  if (!LoadTextureDataFromResidentMemoryImpl(texture, base_outdated,\n                                             mips_outdated)) {\n    return false;\n  }\n\n  // Mark the ranges as uploaded and watch them. This is needed for scaled\n  // resolves as well to detect when the CPU wants to reuse the memory for a\n  // regular texture or a vertex buffer, and thus the scaled resolve version is\n  // not up to date anymore.\n  texture.MakeUpToDateAndWatch(global_critical_region_.Acquire());\n\n  texture.LogAction(\"Loaded\");\n\n  return true;\n}\n\nvoid TextureCache::BindingInfoFromFetchConstant(\n    const xenos::xe_gpu_texture_fetch_t& fetch, TextureKey& key_out,\n    uint8_t* swizzled_signs_out) {\n  // Reset the key and the signedness.\n  key_out.MakeInvalid();\n  if (swizzled_signs_out != nullptr) {\n    *swizzled_signs_out =\n        uint8_t(xenos::TextureSign::kUnsigned) * uint8_t(0b01010101);\n  }\n\n  switch (fetch.type) {\n    case xenos::FetchConstantType::kTexture:\n      break;\n    case xenos::FetchConstantType::kInvalidTexture:\n      if (cvars::gpu_allow_invalid_fetch_constants) {\n        break;\n      }\n      XELOGW(\n          \"Texture fetch constant ({:08X} {:08X} {:08X} {:08X} {:08X} {:08X}) \"\n          \"has \\\"invalid\\\" type! This is incorrect behavior, but you can try \"\n          \"bypassing this by launching Xenia with \"\n          \"--gpu_allow_invalid_fetch_constants=true.\",\n          fetch.dword_0, fetch.dword_1, fetch.dword_2, fetch.dword_3,\n          fetch.dword_4, fetch.dword_5);\n      return;\n    default:\n      XELOGW(\n          \"Texture fetch constant ({:08X} {:08X} {:08X} {:08X} {:08X} {:08X}) \"\n          \"is completely invalid!\",\n          fetch.dword_0, fetch.dword_1, fetch.dword_2, fetch.dword_3,\n          fetch.dword_4, fetch.dword_5);\n      return;\n  }\n\n  uint32_t width_minus_1, height_minus_1, depth_or_array_size_minus_1;\n  uint32_t base_page, mip_page, mip_max_level;\n  texture_util::GetSubresourcesFromFetchConstant(\n      fetch, &width_minus_1, &height_minus_1, &depth_or_array_size_minus_1,\n      &base_page, &mip_page, nullptr, &mip_max_level);\n  if (base_page == 0 && mip_page == 0) {\n    // No texture data at all.\n    return;\n  }\n  if (fetch.dimension == xenos::DataDimension::k1D) {\n    bool is_invalid_1d = false;\n    // TODO(Triang3l): Support long 1D textures.\n    if (width_minus_1 >= xenos::kTexture2DCubeMaxWidthHeight) {\n      XELOGE(\n          \"1D texture is too wide ({}) - ignoring! Report the game to Xenia \"\n          \"developers\",\n          width_minus_1 + 1);\n      is_invalid_1d = true;\n    }\n    assert_false(fetch.tiled);\n    if (fetch.tiled) {\n      XELOGE(\n          \"1D texture has tiling enabled in the fetch constant, but this \"\n          \"appears to be completely wrong - ignoring! Report the game to Xenia \"\n          \"developers\");\n      is_invalid_1d = true;\n    }\n    assert_false(fetch.packed_mips);\n    if (fetch.packed_mips) {\n      XELOGE(\n          \"1D texture has packed mips enabled in the fetch constant, but this \"\n          \"appears to be completely wrong - ignoring! Report the game to Xenia \"\n          \"developers\");\n      is_invalid_1d = true;\n    }\n    if (is_invalid_1d) {\n      return;\n    }\n  }\n\n  xenos::TextureFormat format = GetBaseFormat(fetch.format);\n\n  key_out.base_page = base_page;\n  key_out.mip_page = mip_page;\n  key_out.dimension = fetch.dimension;\n  key_out.width_minus_1 = width_minus_1;\n  key_out.height_minus_1 = height_minus_1;\n  key_out.depth_or_array_size_minus_1 = depth_or_array_size_minus_1;\n  key_out.pitch = fetch.pitch;\n  key_out.mip_max_level = mip_max_level;\n  key_out.tiled = fetch.tiled;\n  key_out.packed_mips = fetch.packed_mips;\n  key_out.format = format;\n  key_out.endianness = fetch.endianness;\n\n  key_out.is_valid = 1;\n\n  if (swizzled_signs_out != nullptr) {\n    *swizzled_signs_out = texture_util::SwizzleSigns(fetch);\n  }\n}\n\nvoid TextureCache::ResetTextureBindings(bool from_destructor) {\n  uint32_t bindings_reset = 0;\n  for (size_t i = 0; i < texture_bindings_.size(); ++i) {\n    TextureBinding& binding = texture_bindings_[i];\n    if (!binding.key.is_valid) {\n      continue;\n    }\n    binding.Reset();\n    bindings_reset |= UINT32_C(1) << i;\n  }\n  texture_bindings_in_sync_ &= ~bindings_reset;\n  if (!from_destructor && bindings_reset) {\n    UpdateTextureBindingsImpl(bindings_reset);\n  }\n}\n\nvoid TextureCache::UpdateTexturesTotalHostMemoryUsage(uint64_t add,\n                                                      uint64_t subtract) {\n  textures_total_host_memory_usage_ =\n      textures_total_host_memory_usage_ - subtract + add;\n  COUNT_profile_set(\"gpu/texture_cache/total_host_memory_usage_mb\",\n                    uint32_t((textures_total_host_memory_usage_ +\n                              ((UINT32_C(1) << 20) - 1)) >>\n                             20));\n}\n\nbool TextureCache::IsRangeScaledResolved(uint32_t start_unscaled,\n                                         uint32_t length_unscaled) {\n  if (!IsDrawResolutionScaled()) {\n    return false;\n  }\n\n  start_unscaled = std::min(start_unscaled, SharedMemory::kBufferSize);\n  length_unscaled =\n      std::min(length_unscaled, SharedMemory::kBufferSize - start_unscaled);\n  if (!length_unscaled) {\n    return false;\n  }\n\n  // Two-level check for faster rejection since resolve targets are usually\n  // placed in relatively small and localized memory portions (confirmed by\n  // testing - pretty much all times the deeper level was entered, the texture\n  // was a resolve target).\n  uint32_t page_first = start_unscaled >> 12;\n  uint32_t page_last = (start_unscaled + length_unscaled - 1) >> 12;\n  uint32_t block_first = page_first >> 5;\n  uint32_t block_last = page_last >> 5;\n  uint32_t l2_block_first = block_first >> 6;\n  uint32_t l2_block_last = block_last >> 6;\n  auto global_lock = global_critical_region_.Acquire();\n  for (uint32_t i = l2_block_first; i <= l2_block_last; ++i) {\n    uint64_t l2_block = scaled_resolve_pages_l2_[i];\n    if (i == l2_block_first) {\n      l2_block &= ~((UINT64_C(1) << (block_first & 63)) - 1);\n    }\n    if (i == l2_block_last && (block_last & 63) != 63) {\n      l2_block &= (UINT64_C(1) << ((block_last & 63) + 1)) - 1;\n    }\n    uint32_t block_relative_index;\n    while (xe::bit_scan_forward(l2_block, &block_relative_index)) {\n      l2_block &= ~(UINT64_C(1) << block_relative_index);\n      uint32_t block_index = (i << 6) + block_relative_index;\n      uint32_t check_bits = UINT32_MAX;\n      if (block_index == block_first) {\n        check_bits &= ~((UINT32_C(1) << (page_first & 31)) - 1);\n      }\n      if (block_index == block_last && (page_last & 31) != 31) {\n        check_bits &= (UINT32_C(1) << ((page_last & 31) + 1)) - 1;\n      }\n      if (scaled_resolve_pages_[block_index] & check_bits) {\n        return true;\n      }\n    }\n  }\n  return false;\n}\n\nvoid TextureCache::ScaledResolveGlobalWatchCallbackThunk(\n    const std::unique_lock<std::recursive_mutex>& global_lock, void* context,\n    uint32_t address_first, uint32_t address_last, bool invalidated_by_gpu) {\n  TextureCache* texture_cache = reinterpret_cast<TextureCache*>(context);\n  texture_cache->ScaledResolveGlobalWatchCallback(\n      global_lock, address_first, address_last, invalidated_by_gpu);\n}\n\nvoid TextureCache::ScaledResolveGlobalWatchCallback(\n    const std::unique_lock<std::recursive_mutex>& global_lock,\n    uint32_t address_first, uint32_t address_last, bool invalidated_by_gpu) {\n  assert_true(IsDrawResolutionScaled());\n  if (invalidated_by_gpu) {\n    // Resolves themselves do exactly the opposite of what this should do.\n    return;\n  }\n  // Mark scaled resolve ranges as non-scaled. Textures themselves will be\n  // invalidated by their shared memory watches.\n  uint32_t resolve_page_first = address_first >> 12;\n  uint32_t resolve_page_last = address_last >> 12;\n  uint32_t resolve_block_first = resolve_page_first >> 5;\n  uint32_t resolve_block_last = resolve_page_last >> 5;\n  uint32_t resolve_l2_block_first = resolve_block_first >> 6;\n  uint32_t resolve_l2_block_last = resolve_block_last >> 6;\n  for (uint32_t i = resolve_l2_block_first; i <= resolve_l2_block_last; ++i) {\n    uint64_t resolve_l2_block = scaled_resolve_pages_l2_[i];\n    uint32_t resolve_block_relative_index;\n    while (\n        xe::bit_scan_forward(resolve_l2_block, &resolve_block_relative_index)) {\n      resolve_l2_block &= ~(UINT64_C(1) << resolve_block_relative_index);\n      uint32_t resolve_block_index = (i << 6) + resolve_block_relative_index;\n      uint32_t resolve_keep_bits = 0;\n      if (resolve_block_index == resolve_block_first) {\n        resolve_keep_bits |= (UINT32_C(1) << (resolve_page_first & 31)) - 1;\n      }\n      if (resolve_block_index == resolve_block_last &&\n          (resolve_page_last & 31) != 31) {\n        resolve_keep_bits |=\n            ~((UINT32_C(1) << ((resolve_page_last & 31) + 1)) - 1);\n      }\n      scaled_resolve_pages_[resolve_block_index] &= resolve_keep_bits;\n      if (scaled_resolve_pages_[resolve_block_index] == 0) {\n        scaled_resolve_pages_l2_[i] &=\n            ~(UINT64_C(1) << resolve_block_relative_index);\n      }\n    }\n  }\n}\n\n}  // namespace gpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/texture_cache.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_TEXTURE_CACHE_H_\n#define XENIA_GPU_TEXTURE_CACHE_H_\n\n#include <array>\n#include <atomic>\n#include <cstdint>\n#include <cstring>\n#include <memory>\n#include <unordered_map>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/hash.h\"\n#include \"xenia/base/mutex.h\"\n#include \"xenia/gpu/register_file.h\"\n#include \"xenia/gpu/shared_memory.h\"\n#include \"xenia/gpu/texture_util.h\"\n#include \"xenia/gpu/xenos.h\"\n\nnamespace xe {\nnamespace gpu {\n\n// Manages host copies of guest textures, performing untiling, format and endian\n// conversion of textures stored in the shared memory, and also handling\n// invalidation.\n//\n// Mipmaps are treated the following way, according to the GPU hang message\n// found in game executables explaining the valid usage of BaseAddress when\n// streaming the largest LOD (it says games should not use 0 as the base address\n// when the largest LOD isn't loaded, but rather, either allocate a valid\n// address for it or make it the same as mip_address):\n// - If the texture has a base address, but no mip address, it's not mipmapped -\n//   the host texture has only the largest level too.\n// - If the texture has different non-zero base address and mip address, a host\n//   texture with mip_max_level+1 mipmaps is created - mip_min_level is ignored\n//   and treated purely as sampler state because there are tfetch instructions\n//   working directly with LOD values - including fetching with an explicit LOD.\n//   However, the max level is not ignored because any mip count can be\n//   specified when creating a texture, and another texture may be placed after\n//   the last one.\n// - If the texture has a mip address, but the base address is 0 or the same as\n//   the mip address, a mipmapped texture is created, but min/max LOD is clamped\n//   to the lower bound of 1 - the game is expected to do that anyway until the\n//   largest LOD is loaded.\n// TODO(Triang3l): Attach the largest LOD to existing textures with a valid\n// mip_address but no base ever used yet (no base_address) to save memory\n// because textures are streamed this way anyway.\nclass TextureCache {\n public:\n  // Hard limit, originating from the half-pixel offset filling hack in the\n  // resolve shaders only filling up to 3 pixels, due to the bit counts used for\n  // passing the scale to shaders, and because the full 490 MB EDRAM buffer is\n  // within the minimum Direct3D 12 requirement of 128 * 2^20 texels in a single\n  // buffer binding (counted as R32 for a byte address buffer).\n  static constexpr uint32_t kMaxDrawResolutionScaleAlongAxis = 7;\n\n  TextureCache(const TextureCache& texture_cache) = delete;\n  TextureCache& operator=(const TextureCache& texture_cache) = delete;\n  virtual ~TextureCache();\n\n  // Returns whether the actual scale is not smaller than the requested one.\n  static bool GetConfigDrawResolutionScale(uint32_t& x_out, uint32_t& y_out);\n  uint32_t draw_resolution_scale_x() const { return draw_resolution_scale_x_; }\n  uint32_t draw_resolution_scale_y() const { return draw_resolution_scale_y_; }\n  bool IsDrawResolutionScaled() const {\n    return draw_resolution_scale_x_ > 1 || draw_resolution_scale_y_ > 1;\n  }\n\n  virtual void ClearCache();\n\n  virtual void CompletedSubmissionUpdated(uint64_t completed_submission_index);\n  virtual void BeginSubmission(uint64_t new_submission_index);\n  virtual void BeginFrame();\n\n  void MarkRangeAsResolved(uint32_t start_unscaled, uint32_t length_unscaled);\n  // Ensures the memory backing the range in the scaled resolve address space is\n  // allocated and returns whether it is.\n  virtual bool EnsureScaledResolveMemoryCommitted(\n      uint32_t start_unscaled, uint32_t length_unscaled,\n      uint32_t length_scaled_alignment_log2 = 0) {\n    return false;\n  }\n\n  static uint32_t GuestToHostSwizzle(uint32_t guest_swizzle,\n                                     uint32_t host_format_swizzle);\n\n  void TextureFetchConstantWritten(uint32_t index) {\n    texture_bindings_in_sync_ &= ~(UINT32_C(1) << index);\n  }\n\n  virtual void RequestTextures(uint32_t used_texture_mask);\n\n  // \"ActiveTexture\" means as of the latest RequestTextures call.\n\n  uint32_t GetActiveTextureHostSwizzle(uint32_t fetch_constant_index) const {\n    const TextureBinding* binding =\n        GetValidTextureBinding(fetch_constant_index);\n    return binding ? binding->host_swizzle : xenos::XE_GPU_TEXTURE_SWIZZLE_0000;\n  }\n  uint8_t GetActiveTextureSwizzledSigns(uint32_t fetch_constant_index) const {\n    const TextureBinding* binding =\n        GetValidTextureBinding(fetch_constant_index);\n    return binding ? binding->swizzled_signs : kSwizzledSignsUnsigned;\n  }\n  bool IsActiveTextureResolutionScaled(uint32_t fetch_constant_index) const {\n    const TextureBinding* binding =\n        GetValidTextureBinding(fetch_constant_index);\n    if (!binding) {\n      return false;\n    }\n    return (binding->texture && binding->texture->key().scaled_resolve) ||\n           (binding->texture_signed &&\n            binding->texture_signed->key().scaled_resolve);\n  }\n\n protected:\n  struct TextureKey {\n    // Dimensions minus 1 are stored similarly to how they're stored in fetch\n    // constants so fewer bits can be used, while the maximum size (8192 for 2D)\n    // can still be encoded (a 8192x sky texture is used in 4D530910).\n\n    // Physical 4 KB page with the base mip level, disregarding A/C/E address\n    // range prefix.\n    uint32_t base_page : 17;             // 17 total\n    xenos::DataDimension dimension : 2;  // 19\n    uint32_t width_minus_1 : 13;         // 32\n\n    uint32_t height_minus_1 : 13;  // 45\n    uint32_t tiled : 1;            // 46\n    uint32_t packed_mips : 1;      // 47\n    // Physical 4 KB page with mip 1 and smaller.\n    uint32_t mip_page : 17;  // 64\n\n    // (Layers for stacked and 3D, 6 for cube, 1 for other dimensions) - 1.\n    uint32_t depth_or_array_size_minus_1 : 10;  // 74\n    uint32_t pitch : 9;                         // 83\n    uint32_t mip_max_level : 4;                 // 87\n    xenos::TextureFormat format : 6;            // 93\n    xenos::Endian endianness : 2;               // 95\n    // Whether this texture is signed and has a different host representation\n    // than an unsigned view of the same guest texture.\n    uint32_t signed_separate : 1;  // 96\n\n    // Whether this texture is a resolution-scaled resolve target.\n    uint32_t scaled_resolve : 1;  // 97\n    // Least important in ==, so placed last.\n    uint32_t is_valid : 1;  // 98\n\n    TextureKey() { MakeInvalid(); }\n    TextureKey(const TextureKey& key) {\n      std::memcpy(this, &key, sizeof(*this));\n    }\n    TextureKey& operator=(const TextureKey& key) {\n      std::memcpy(this, &key, sizeof(*this));\n      return *this;\n    }\n    void MakeInvalid() {\n      // Zero everything, including the padding, for a stable hash.\n      std::memset(this, 0, sizeof(*this));\n    }\n\n    using Hasher = xe::hash::XXHasher<TextureKey>;\n    bool operator==(const TextureKey& key) const {\n      return !std::memcmp(this, &key, sizeof(*this));\n    }\n    bool operator!=(const TextureKey& key) const { return !(*this == key); }\n\n    uint32_t GetWidth() const { return width_minus_1 + 1; }\n    uint32_t GetHeight() const { return height_minus_1 + 1; }\n    uint32_t GetDepthOrArraySize() const {\n      return depth_or_array_size_minus_1 + 1;\n    }\n\n    texture_util::TextureGuestLayout GetGuestLayout() const {\n      return texture_util::GetGuestTextureLayout(\n          dimension, pitch, GetWidth(), GetHeight(), GetDepthOrArraySize(),\n          tiled, format, packed_mips, base_page != 0, mip_max_level);\n    }\n\n    static const char* GetLogDimensionName(xenos::DataDimension dimension);\n    const char* GetLogDimensionName() const {\n      return GetLogDimensionName(dimension);\n    }\n    void LogAction(const char* action) const;\n  };\n\n  class Texture {\n   public:\n    Texture(const Texture& texture) = delete;\n    Texture& operator=(const Texture& texture) = delete;\n    virtual ~Texture();\n\n    TextureCache& texture_cache() const { return texture_cache_; }\n\n    const TextureKey& key() const { return key_; }\n\n    const texture_util::TextureGuestLayout& guest_layout() const {\n      return guest_layout_;\n    }\n    uint32_t GetGuestBaseSize() const {\n      return guest_layout().base.level_data_extent_bytes;\n    }\n    uint32_t GetGuestMipsSize() const {\n      return guest_layout().mips_total_extent_bytes;\n    }\n\n    uint64_t GetHostMemoryUsage() const { return host_memory_usage_; }\n\n    uint64_t last_usage_submission_index() const {\n      return last_usage_submission_index_;\n    }\n    uint64_t last_usage_time() const { return last_usage_time_; }\n\n    bool base_outdated(\n        const std::unique_lock<std::recursive_mutex>& global_lock) const {\n      return base_outdated_;\n    }\n    bool mips_outdated(\n        const std::unique_lock<std::recursive_mutex>& global_lock) const {\n      return mips_outdated_;\n    }\n    void MakeUpToDateAndWatch(\n        const std::unique_lock<std::recursive_mutex>& global_lock);\n\n    void WatchCallback(\n        const std::unique_lock<std::recursive_mutex>& global_lock, bool is_mip);\n\n    // For LRU caching - updates the last usage frame and moves the texture to\n    // the end of the usage queue. Must be called any time the texture is\n    // referenced by any GPU work in the implementation to make sure it's not\n    // destroyed while still in use.\n    void MarkAsUsed();\n\n    void LogAction(const char* action) const;\n\n   protected:\n    explicit Texture(TextureCache& texture_cache, const TextureKey& key);\n\n    void SetHostMemoryUsage(uint64_t new_host_memory_usage) {\n      texture_cache_.UpdateTexturesTotalHostMemoryUsage(new_host_memory_usage,\n                                                        host_memory_usage_);\n      host_memory_usage_ = new_host_memory_usage;\n    }\n\n   private:\n    TextureCache& texture_cache_;\n\n    TextureKey key_;\n\n    texture_util::TextureGuestLayout guest_layout_;\n\n    uint64_t host_memory_usage_ = 0;\n\n    uint64_t last_usage_submission_index_;\n    uint64_t last_usage_time_;\n    Texture* used_previous_;\n    Texture* used_next_;\n\n    // These are to be accessed within the global critical region to synchronize\n    // with shared memory.\n    // Whether the recent base level data needs reloading from the memory.\n    bool base_outdated_ = false;\n    // Whether the recent mip data needs reloading from the memory.\n    bool mips_outdated_ = false;\n    // Watch handles for the memory ranges.\n    SharedMemory::WatchHandle base_watch_handle_ = nullptr;\n    SharedMemory::WatchHandle mips_watch_handle_ = nullptr;\n  };\n\n  // Rules of data access in load shaders:\n  // - Source reading (from the shared memory or the scaled resolve buffer):\n  //   - Guest data may be stored in a sparsely-allocated buffer, or, in\n  //     Direct3D 12 terms, a tiled buffer. This means that some regions of the\n  //     buffer may not be mapped. On tiled resources tier 1 hardware, accessing\n  //     unmapped tiles results in undefined behavior, including a GPU page\n  //     fault and device removal. So, shaders must not try to access\n  //     potentially unmapped regions (that are outside the texture memory\n  //     extents calculated on the CPU, taking into account that Xenia can't\n  //     overestimate texture sizes freely since it must not try to upload\n  //     unallocated pages on the CPU).\n  //   - Buffer tiles have 64 KB size on Direct3D 12. Vulkan has its own\n  //     alignment requirements for sparse binding. But overall, we're\n  //     allocating pretty large regions.\n  //   - Resolution scaling disabled:\n  //     - Shared memory allocates regions of power of two sizes that map\n  //       directly to the same portions of the 512 MB of the console's\n  //       physical memory. So, a 64 KB-aligned host buffer region is also 64\n  //       KB-aligned in the guest address space.\n  //     - Tiled textures: 32x32x4-block tiles are always resident each as a\n  //       whole. If the width is bigger than the pitch, the overflowing 32x32x4\n  //       tiles are also loaded as entire tiles. We do not have separate\n  //       shaders for 2D and 3D. So, for tiled textures, it's safe to consider\n  //       that if any location within a 32x32-aligned portion is within the\n  //       texture bounds, the entire 32x32 portion also can be read.\n  //     - Linear textures: Pitch is aligned to 256 bytes. Row count, however,\n  //       is not aligned to anything (unless the mip tail is being loaded). The\n  //       overflowing last row in case `width > pitch`, however, is made\n  //       resident up to the last texel in it. But row start alignment is 256,\n  //       which is a power of two, and is smaller than the Direct3D 12 tile\n  //       size of 64 KB. So, if any block within a 256-aligned region is within\n  //       the texture bounds, without resolution scaling, reading from any\n  //       location in that 256-aligned region is safe.\n  //     - Since we use the same shaders for tiled and linear textures (as well\n  //       as 1D textures), this means that without resolution scaling, it's\n  //       safe to access a min(256 bytes, 32 blocks)-aligned portion along X,\n  //       but only within the same row of blocks, with bounds checking only for\n  //       such portion as a whole, but without additional bounds checking\n  //       inside of it.\n  //     - Therefore, it's recommended that shaders read power-of-two amounts of\n  //       blocks (so there will naturally be some alignment to some power of\n  //       two), and this way, each thread may read at most 16 16bpb blocks or\n  //       at most 32 8bpb or smaller blocks with in a single `if (x < width)`\n  //       for the whole aligned range of the same length.\n  //   - Resolution scaling enabled:\n  //     - For simplicity, unlike in the shared memory, buffer tile boundaries\n  //       are not aligned to powers of 2 the same way as guest addresses are.\n  //       While for 2x2 resolution scaling it still happens to be the case\n  //       because `host scaling unit address = guest scaling unit address << 2`\n  //       (similarly for 2x1 and 1x2), for 3x or x3, it's not - a 64 KB host\n  //       tile would represent 7281.777 guest bytes with 3x3 (disregarding that\n  //       sequences of texels that are adjacent in memory alongside the\n  //       horizontal axis, not individual bytes, are scaled, but even in that\n  //       case it's not scaling by 2^n still).\n  //     - The above would affect the `width > pitch` case for linear textures,\n  //       requiring overestimating the width in calculation of the range of the\n  //       tiles to map, while not doing this overestimation on the guest memory\n  //       extent calculation side (otherwise it may result in attempting to\n  //       upload unallocated memory on the CPU). For example, let's take look\n  //       at an extreme case of a 369x28 k_8 texture with a pitch of 256 bytes.\n  //       The last row, in guest memory, would be loaded from the [7168, 7281)\n  //       range, or, with 3x3 resolution scaling, from bytes [64512, 65529).\n  //       However, if we try to unconditionally load 2 pixels, like the texture\n  //       is 370x28, we will be accessing the bytes [64512, 65538). But bytes\n  //       65536 and 65537 will be in another 64 KB tile, which may be not\n  //       mapped yet. However, none of this is an issue for one simple reason -\n  //       resolving is only possible to tiled textures, so linear textures will\n  //       never be resolution-scaled.\n  //     - Tiled textures have potentially referenced guest 32x32-block tiles\n  //       loaded in their entirety. So, just like for unscaled textures, if any\n  //       block within a tile is available, the entire tile is as well.\n  // - Destination writing (to the linear buffer):\n  //   - host_x_blocks_per_thread specifies how many pixels can be written\n  //     without bounds checking within increments of that amount - the pitch of\n  //     the destination buffer is manually overaligned if needed.\n\n  // In textures, resolution scaling is done for 8-byte portions of memory for\n  // 8bpp textures, and for 16-byte portions for textures of higher bit depths\n  // (these are the sizes of regions where contiguous texels in memory are also\n  // contiguous in the texture along the horizontal axis, so 64-bit and 128-bit\n  // loads / stores, for 8bpp and 16bpp+ respectively, can be used for untiling\n  // regardless of the resolution scale).\n\n  struct LoadConstants {\n    uint32_t is_tiled_3d_endian_scale;\n    // Base offset in bytes, resolution-scaled.\n    uint32_t guest_offset;\n    // Unscaled.\n    uint32_t guest_pitch_aligned;\n    // For 3D textures only (ignored otherwise) - aligned to 32, unscaled.\n    uint32_t guest_z_stride_block_rows_aligned;\n\n    // - std140 vector boundary -\n\n    // If this is a packed mip tail, this is aligned to tile dimensions.\n    // Resolution-scaled.\n    uint32_t size_blocks[3];\n    // Base offset in bytes.\n    uint32_t host_offset;\n\n    // - std140 vector boundary -\n\n    uint32_t host_pitch;\n    uint32_t height_texels;\n  };\n\n  static constexpr uint32_t kLoadGuestXThreadsPerGroupLog2 = 2;\n  static constexpr uint32_t kLoadGuestYBlocksPerGroupLog2 = 5;\n\n  enum LoadShaderIndex {\n    kLoadShaderIndex8bpb,\n    kLoadShaderIndex16bpb,\n    kLoadShaderIndex32bpb,\n    kLoadShaderIndex64bpb,\n    kLoadShaderIndex128bpb,\n    kLoadShaderIndexR5G5B5A1ToB5G5R5A1,\n    kLoadShaderIndexR5G6B5ToB5G6R5,\n    kLoadShaderIndexR5G5B6ToB5G6R5WithRBGASwizzle,\n    kLoadShaderIndexRGBA4ToBGRA4,\n    kLoadShaderIndexRGBA4ToARGB4,\n    kLoadShaderIndexGBGR8ToGRGB8,\n    kLoadShaderIndexGBGR8ToRGB8,\n    kLoadShaderIndexBGRG8ToRGBG8,\n    kLoadShaderIndexBGRG8ToRGB8,\n    kLoadShaderIndexR10G11B11ToRGBA16,\n    kLoadShaderIndexR10G11B11ToRGBA16SNorm,\n    kLoadShaderIndexR11G11B10ToRGBA16,\n    kLoadShaderIndexR11G11B10ToRGBA16SNorm,\n    kLoadShaderIndexR16UNormToFloat,\n    kLoadShaderIndexR16SNormToFloat,\n    kLoadShaderIndexRG16UNormToFloat,\n    kLoadShaderIndexRG16SNormToFloat,\n    kLoadShaderIndexRGBA16UNormToFloat,\n    kLoadShaderIndexRGBA16SNormToFloat,\n    kLoadShaderIndexDXT1ToRGBA8,\n    kLoadShaderIndexDXT3ToRGBA8,\n    kLoadShaderIndexDXT5ToRGBA8,\n    kLoadShaderIndexDXNToRG8,\n    kLoadShaderIndexDXT3A,\n    kLoadShaderIndexDXT3AAs1111ToBGRA4,\n    kLoadShaderIndexDXT3AAs1111ToARGB4,\n    kLoadShaderIndexDXT5AToR8,\n    kLoadShaderIndexCTX1,\n    kLoadShaderIndexDepthUnorm,\n    kLoadShaderIndexDepthFloat,\n\n    kLoadShaderCount,\n    kLoadShaderIndexUnknown = kLoadShaderCount,\n  };\n\n  struct LoadShaderInfo {\n    // Number of bytes in a host resolution-scaled block (corresponding to a\n    // guest block if not decompressing, or a host texel if decompressing)\n    // written by the shader.\n    uint32_t bytes_per_host_block;\n    // Log2 of the number of guest resolution-scaled blocks along the X axis\n    // loaded by a single thread shader group.\n    uint32_t guest_x_blocks_per_thread_log2;\n\n    uint32_t GetGuestXBlocksPerGroupLog2() const {\n      return kLoadGuestXThreadsPerGroupLog2 + guest_x_blocks_per_thread_log2;\n    }\n  };\n\n  static constexpr uint8_t kSwizzledSignsUnsigned =\n      uint8_t(xenos::TextureSign::kUnsigned) * uint8_t(0b01010101);\n\n  struct TextureBinding {\n    TextureKey key;\n    // Destination swizzle merged with guest to host format swizzle.\n    uint32_t host_swizzle;\n    // Packed TextureSign values, 2 bit per each component, with guest-side\n    // destination swizzle from the fetch constant applied to them.\n    uint8_t swizzled_signs;\n    // Unsigned version of the texture (or signed if they have the same data).\n    Texture* texture;\n    // Signed version of the texture if the data in the signed version is\n    // different on the host.\n    Texture* texture_signed;\n\n    TextureBinding() { Reset(); }\n\n    void Reset() {\n      std::memset(this, 0, sizeof(*this));\n      host_swizzle = xenos::XE_GPU_TEXTURE_SWIZZLE_0000;\n      swizzled_signs = kSwizzledSignsUnsigned;\n    }\n  };\n\n  explicit TextureCache(const RegisterFile& register_file,\n                        SharedMemory& shared_memory,\n                        uint32_t draw_resolution_scale_x,\n                        uint32_t draw_resolution_scale_y);\n\n  const RegisterFile& register_file() const { return register_file_; }\n  SharedMemory& shared_memory() const { return shared_memory_; }\n\n  // May be called for purposes like clearing the cache, as well as in the\n  // destructor of the implementation if textures, for instance, have references\n  // to the implementation that are used in their destructor, and will become\n  // invalid if the implementation is destroyed before the texture.\n  void DestroyAllTextures(bool from_destructor = false);\n\n  // Whether the signed version of the texture has a different representation on\n  // the host than its unsigned version (for example, if it's a fixed-point\n  // texture emulated with a larger host pixel format).\n  virtual bool IsSignedVersionSeparateForFormat(TextureKey key) const {\n    return false;\n  }\n  // Parameters like whether the texture is tiled and its dimensions are checked\n  // externally, the implementation should take only format-related parameters\n  // such as the format itself and the signedness into account.\n  virtual bool IsScaledResolveSupportedForFormat(TextureKey key) const {\n    return false;\n  }\n  // For formats with less than 4 components, implementations normally should\n  // replicate the last component into the non-existent ones, similar to what is\n  // done for unused components of operands in shaders by Microsoft's Xbox 360\n  // shader compiler (.xxxx, .xyyy, .xyzz, .xyzw).\n  // For DXT3A and DXT5A, RRRR swizzle is specified in:\n  // http://fileadmin.cs.lth.se/cs/Personal/Michael_Doggett/talks/unc-xenos-doggett.pdf\n  // 4D5307E6 also expects replicated components in k_8 sprites.\n  // DXN is read as RG in 4D5307E6, but as RA in 415607E6.\n  // TODO(Triang3l): Find out the correct contents of unused texture components.\n  virtual uint32_t GetHostFormatSwizzle(TextureKey key) const = 0;\n\n  virtual uint32_t GetMaxHostTextureWidthHeight(\n      xenos::DataDimension dimension) const = 0;\n  virtual uint32_t GetMaxHostTextureDepthOrArraySize(\n      xenos::DataDimension dimension) const = 0;\n\n  // The texture must be created exactly with this key (if the implementation\n  // supports the texture with this key, otherwise, or in case of a runtime\n  // failure, it should return nullptr), modifying it is not allowed.\n  virtual std::unique_ptr<Texture> CreateTexture(TextureKey key) = 0;\n\n  // Returns nullptr not only if the key is not supported, but also if couldn't\n  // create the texture - if it's nullptr, occasionally a recreation attempt\n  // should be made.\n  Texture* FindOrCreateTexture(TextureKey key);\n\n  static const LoadShaderInfo& GetLoadShaderInfo(\n      LoadShaderIndex load_shader_index) {\n    assert_true(load_shader_index < kLoadShaderCount);\n    return load_shader_info_[load_shader_index];\n  }\n  bool LoadTextureData(Texture& texture);\n  // Writes the texture data (for base, mips or both - but not neither) from the\n  // shared memory or the scaled resolve memory. The shared memory management is\n  // done outside this function, the implementation just needs to load the data\n  // into the texture object.\n  virtual bool LoadTextureDataFromResidentMemoryImpl(Texture& texture,\n                                                     bool load_base,\n                                                     bool load_mips) = 0;\n\n  // Converts a texture fetch constant to a texture key, normalizing and\n  // validating the values, or creating an invalid key, and also gets the\n  // post-guest-swizzle signedness.\n  static void BindingInfoFromFetchConstant(\n      const xenos::xe_gpu_texture_fetch_t& fetch, TextureKey& key_out,\n      uint8_t* swizzled_signs_out);\n\n  // Makes all texture bindings invalid. Also requesting textures after calling\n  // this will cause another attempt to create a texture or to untile it if\n  // there was an error.\n  void ResetTextureBindings(bool from_destructor = false);\n\n  const TextureBinding* GetValidTextureBinding(\n      uint32_t fetch_constant_index) const {\n    const TextureBinding& binding = texture_bindings_[fetch_constant_index];\n    return binding.key.is_valid ? &binding : nullptr;\n  }\n  // Called when something in a texture binding is changed for the\n  // implementation to update the internal dependencies of the binding.\n  virtual void UpdateTextureBindingsImpl(uint32_t fetch_constant_mask) {}\n\n private:\n  void UpdateTexturesTotalHostMemoryUsage(uint64_t add, uint64_t subtract);\n\n  // Shared memory callback for texture data invalidation.\n  static void WatchCallback(\n      const std::unique_lock<std::recursive_mutex>& global_lock, void* context,\n      void* data, uint64_t argument, bool invalidated_by_gpu);\n\n  // Checks if there are any pages that contain scaled resolve data within the\n  // range.\n  bool IsRangeScaledResolved(uint32_t start_unscaled, uint32_t length_unscaled);\n  // Global shared memory invalidation callback for invalidating scaled resolved\n  // texture data.\n  static void ScaledResolveGlobalWatchCallbackThunk(\n      const std::unique_lock<std::recursive_mutex>& global_lock, void* context,\n      uint32_t address_first, uint32_t address_last, bool invalidated_by_gpu);\n  void ScaledResolveGlobalWatchCallback(\n      const std::unique_lock<std::recursive_mutex>& global_lock,\n      uint32_t address_first, uint32_t address_last, bool invalidated_by_gpu);\n\n  const RegisterFile& register_file_;\n  SharedMemory& shared_memory_;\n  uint32_t draw_resolution_scale_x_;\n  uint32_t draw_resolution_scale_y_;\n\n  static const LoadShaderInfo load_shader_info_[kLoadShaderCount];\n\n  xe::global_critical_region global_critical_region_;\n  // Bit vector storing whether each 4 KB physical memory page contains scaled\n  // resolve data. uint32_t rather than uint64_t because parts of it can be sent\n  // to shaders.\n  std::unique_ptr<uint32_t[]> scaled_resolve_pages_;\n  // Second level of the bit vector for faster rejection of non-scaled textures.\n  // >> 12 for 4 KB pages, >> 5 for uint32_t level 1 bits, >> 6 for uint64_t\n  // level 2 bits.\n  uint64_t scaled_resolve_pages_l2_[SharedMemory::kBufferSize >> (12 + 5 + 6)];\n\n  // Global watch for scaled resolve data invalidation.\n  SharedMemory::GlobalWatchHandle scaled_resolve_global_watch_handle_ = nullptr;\n\n  uint64_t current_submission_index_ = 0;\n  uint64_t current_submission_time_ = 0;\n\n  std::unordered_map<TextureKey, std::unique_ptr<Texture>, TextureKey::Hasher>\n      textures_;\n\n  uint64_t textures_total_host_memory_usage_ = 0;\n\n  Texture* texture_used_first_ = nullptr;\n  Texture* texture_used_last_ = nullptr;\n\n  // Whether a texture has become outdated (a memory watch has been triggered),\n  // so need to recheck if textures aren't outdated, disregarding whether fetch\n  // constants have been changed.\n  std::atomic<bool> texture_became_outdated_{false};\n\n  std::array<TextureBinding, xenos::kTextureFetchConstantCount>\n      texture_bindings_;\n  // Bit vector with bits reset on fetch constant writes to avoid parsing fetch\n  // constants again and again.\n  uint32_t texture_bindings_in_sync_ = 0;\n};\n\n}  // namespace gpu\n}  // namespace xe\n\n#endif  // XENIA_GPU_TEXTURE_CACHE_H_\n"
  },
  {
    "path": "src/xenia/gpu/texture_dump.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2016 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/cvar.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/gpu/texture_info.h\"\n\nDEFINE_bool(texture_dump, false, \"Dump textures to DDS\", \"GPU\");\n\nnamespace xe {\nnamespace gpu {\n\nvoid TextureDump(const TextureInfo& src, void* buffer, size_t length) {\n  struct {\n    uint32_t size;\n    uint32_t flags;\n    uint32_t height;\n    uint32_t width;\n    uint32_t pitch_or_linear_size;\n    uint32_t depth;\n    uint32_t mip_levels;\n    uint32_t reserved1[11];\n    struct {\n      uint32_t size;\n      uint32_t flags;\n      be<fourcc_t> fourcc;\n      uint32_t rgb_bit_count;\n      uint32_t r_bit_mask;\n      uint32_t g_bit_mask;\n      uint32_t b_bit_mask;\n      uint32_t a_bit_mask;\n    } pixel_format;\n    uint32_t caps[4];\n    uint32_t reserved2;\n  } dds_header;\n\n  std::memset(&dds_header, 0, sizeof(dds_header));\n  dds_header.size = sizeof(dds_header);\n  dds_header.flags = 1u | 2u | 4u | 0x1000u | 0x20000u;\n  if (src.is_compressed()) {\n    dds_header.flags |= 0x80000u;\n  } else {\n    dds_header.flags |= 0x8u;\n  }\n  dds_header.height = std::max(1u, (src.height + 1) >> src.mip_min_level);\n  dds_header.width = std::max(1u, (src.width + 1) >> src.mip_min_level);\n  dds_header.pitch_or_linear_size = src.GetMipExtent(0, false).block_pitch_h *\n                                    src.format_info()->bytes_per_block();\n  dds_header.mip_levels = src.mip_levels();\n\n  dds_header.pixel_format.size = sizeof(dds_header.pixel_format);\n  switch (src.format) {\n    case xenos::TextureFormat::k_DXT1: {\n      dds_header.pixel_format.flags = 0x4u;\n      dds_header.pixel_format.fourcc = make_fourcc(\"DXT1\");\n      break;\n    }\n    case xenos::TextureFormat::k_DXT2_3: {\n      dds_header.pixel_format.flags = 0x4u;\n      dds_header.pixel_format.fourcc = make_fourcc(\"DXT3\");\n      break;\n    }\n    case xenos::TextureFormat::k_DXT4_5: {\n      dds_header.pixel_format.flags = 0x4u;\n      dds_header.pixel_format.fourcc = make_fourcc(\"DXT5\");\n      break;\n    }\n    case xenos::TextureFormat::k_8_8_8_8: {\n      dds_header.pixel_format.flags = 0x1u | 0x40u;\n      dds_header.pixel_format.rgb_bit_count = 32;\n      dds_header.pixel_format.r_bit_mask = 0x00FF0000u;\n      dds_header.pixel_format.g_bit_mask = 0x0000FF00u;\n      dds_header.pixel_format.b_bit_mask = 0x000000FFu;\n      dds_header.pixel_format.a_bit_mask = 0xFF000000u;\n      break;\n    }\n    default: {\n      assert_unhandled_case(src.format);\n      std::memset(&dds_header.pixel_format, 0xCD,\n                  sizeof(dds_header.pixel_format));\n      XELOGW(\"Skipping {} for texture dump.\", src.format_info()->name);\n      return;\n    }\n  }\n\n  dds_header.caps[0] = 8u | 0x1000u;\n\n  static int dump_counter = 0;\n  std::filesystem::path path = \"texture_dumps\";\n  path /= fmt::format(\"{:05d}_{:08X}_{:08X}_{:08X}.dds\", dump_counter++,\n                      src.memory.base_address, src.memory.mip_address,\n                      src.format_info()->name);\n\n  FILE* handle = filesystem::OpenFile(path, \"wb\");\n  if (handle) {\n    const char signature[4] = {'D', 'D', 'S', ' '};\n    fwrite(&signature, sizeof(signature), 1, handle);\n    fwrite(&dds_header, sizeof(dds_header), 1, handle);\n    fwrite(buffer, 1, length, handle);\n    fclose(handle);\n  }\n}\n\n}  // namespace gpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/texture_extent.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/texture_info.h\"\n\n#include <algorithm>\n#include <cmath>\n\n#include \"xenia/base/math.h\"\n\nnamespace xe {\nnamespace gpu {\n\nusing namespace xe::gpu::xenos;\n\nstatic TextureExtent CalculateExtent(const FormatInfo* format_info,\n                                     uint32_t pitch, uint32_t height,\n                                     uint32_t depth, bool is_tiled,\n                                     bool is_guest) {\n  TextureExtent extent;\n\n  extent.pitch = pitch;\n  extent.height = height;\n  extent.block_width = xe::round_up(extent.pitch, format_info->block_width) /\n                       format_info->block_width;\n  extent.block_height = xe::round_up(extent.height, format_info->block_height) /\n                        format_info->block_height;\n  extent.block_pitch_h = extent.block_width;\n  extent.block_pitch_v = extent.block_height;\n  extent.depth = depth;\n\n  if (is_guest) {\n    // Texture dimensions must be a multiple of tile\n    // dimensions (32x32 blocks).\n    extent.block_pitch_h = xe::round_up(extent.block_pitch_h, 32);\n    extent.block_pitch_v = xe::round_up(extent.block_pitch_v, 32);\n\n    extent.pitch = extent.block_pitch_h * format_info->block_width;\n    extent.height = extent.block_pitch_v * format_info->block_height;\n\n    uint32_t bytes_per_block = format_info->bytes_per_block();\n    uint32_t byte_pitch = extent.block_pitch_h * bytes_per_block;\n\n    if (!is_tiled) {\n      // Each row must be a multiple of 256 bytes in linear textures.\n      byte_pitch = xe::round_up(byte_pitch, 256);\n      extent.block_pitch_h = byte_pitch / bytes_per_block;\n      extent.pitch = extent.block_pitch_h * format_info->block_width;\n    }\n\n    // Is depth special?\n    extent.depth = extent.depth;\n  } else {\n    extent.pitch = extent.block_pitch_h * format_info->block_width;\n    extent.height = extent.block_pitch_v * format_info->block_height;\n  }\n\n  return extent;\n}\n\nTextureExtent TextureExtent::Calculate(const FormatInfo* format_info,\n                                       uint32_t pitch, uint32_t height,\n                                       uint32_t depth, bool is_tiled,\n                                       bool is_guest) {\n  return CalculateExtent(format_info, pitch, height, depth, is_tiled, is_guest);\n}\n\nTextureExtent TextureExtent::Calculate(const TextureInfo* info, bool is_guest) {\n  assert_not_null(info);\n  return CalculateExtent(info->format_info(), info->pitch, info->height + 1,\n                         info->depth + 1, info->is_tiled, is_guest);\n}\n\n}  //  namespace gpu\n}  //  namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/texture_info.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/texture_info.h\"\n\n#include <algorithm>\n#include <cmath>\n#include <cstring>\n\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/memory.h\"\n#include \"xenia/base/xxhash.h\"\n\nnamespace xe {\nnamespace gpu {\n\nusing namespace xe::gpu::xenos;\n\nbool TextureInfo::Prepare(const xe_gpu_texture_fetch_t& fetch,\n                          TextureInfo* out_info) {\n  // https://msdn.microsoft.com/en-us/library/windows/desktop/cc308051(v=vs.85).aspx\n  // a2xx_sq_surfaceformat\n\n  std::memset(out_info, 0, sizeof(TextureInfo));\n\n  auto& info = *out_info;\n\n  info.format = fetch.format;\n  info.endianness = fetch.endianness;\n\n  info.dimension = fetch.dimension;\n  info.width = info.height = info.depth = 0;\n  info.is_stacked = false;\n  switch (info.dimension) {\n    case xenos::DataDimension::k1D:\n      // we treat 1D textures as 2D\n      info.dimension = DataDimension::k2DOrStacked;\n      info.width = fetch.size_1d.width;\n      assert_true(!fetch.stacked);\n      break;\n    case xenos::DataDimension::k2DOrStacked:\n      info.width = fetch.size_2d.width;\n      info.height = fetch.size_2d.height;\n      if (fetch.stacked) {\n        info.depth = fetch.size_2d.stack_depth;\n        info.is_stacked = true;\n      }\n      break;\n    case xenos::DataDimension::k3D:\n      info.width = fetch.size_3d.width;\n      info.height = fetch.size_3d.height;\n      info.depth = fetch.size_3d.depth;\n      assert_true(!fetch.stacked);\n      break;\n    case xenos::DataDimension::kCube:\n      info.width = fetch.size_2d.width;\n      info.height = fetch.size_2d.height;\n      assert_true(fetch.size_2d.stack_depth == 5);\n      info.depth = fetch.size_2d.stack_depth;\n      assert_true(!fetch.stacked);\n      break;\n    default:\n      assert_unhandled_case(info.dimension);\n      break;\n  }\n  info.pitch = fetch.pitch << 5;\n\n  info.mip_min_level = fetch.mip_min_level;\n  info.mip_max_level =\n      std::max(uint32_t(fetch.mip_min_level), uint32_t(fetch.mip_max_level));\n\n  info.is_tiled = fetch.tiled;\n  info.has_packed_mips = fetch.packed_mips;\n\n  info.extent = TextureExtent::Calculate(out_info, true);\n  info.SetupMemoryInfo(fetch.base_address << 12, fetch.mip_address << 12);\n\n  // We've gotten this far and mip_address is zero, assume no extra mips.\n  if (info.mip_max_level > 0 && !info.memory.mip_address) {\n    info.mip_max_level = 0;\n  }\n\n  assert_true(info.mip_min_level <= info.mip_max_level);\n\n  return true;\n}\n\nbool TextureInfo::PrepareResolve(uint32_t physical_address,\n                                 xenos::TextureFormat format,\n                                 xenos::Endian endian, uint32_t pitch,\n                                 uint32_t width, uint32_t height,\n                                 uint32_t depth, TextureInfo* out_info) {\n  assert_true(width > 0);\n  assert_true(height > 0);\n\n  std::memset(out_info, 0, sizeof(TextureInfo));\n\n  auto& info = *out_info;\n  info.format = format;\n  info.endianness = endian;\n\n  info.dimension = xenos::DataDimension::k2DOrStacked;\n  info.width = width - 1;\n  info.height = height - 1;\n  info.depth = depth - 1;\n\n  info.pitch = pitch;\n  info.mip_min_level = 0;\n  info.mip_max_level = 0;\n\n  info.is_tiled = true;\n  info.has_packed_mips = false;\n\n  info.extent = TextureExtent::Calculate(out_info, true);\n  info.SetupMemoryInfo(physical_address, 0);\n  return true;\n}\n\nuint32_t TextureInfo::GetMaxMipLevels() const {\n  return 1 + xe::log2_floor(std::max({width + 1, height + 1, depth + 1}));\n}\n\nconst TextureExtent TextureInfo::GetMipExtent(uint32_t mip,\n                                              bool is_guest) const {\n  if (mip == 0) {\n    return extent;\n  }\n  uint32_t mip_width, mip_height;\n  if (is_guest) {\n    mip_width = xe::next_pow2(width + 1) >> mip;\n    mip_height = xe::next_pow2(height + 1) >> mip;\n  } else {\n    mip_width = std::max(1u, (width + 1) >> mip);\n    mip_height = std::max(1u, (height + 1) >> mip);\n  }\n  return TextureExtent::Calculate(format_info(), mip_width, mip_height,\n                                  depth + 1, is_tiled, is_guest);\n}\n\nvoid TextureInfo::GetMipSize(uint32_t mip, uint32_t* out_width,\n                             uint32_t* out_height) const {\n  assert_not_null(out_width);\n  assert_not_null(out_height);\n  if (mip == 0) {\n    *out_width = width + 1;\n    *out_height = height + 1;\n    return;\n  }\n  uint32_t width_pow2 = xe::next_pow2(width + 1);\n  uint32_t height_pow2 = xe::next_pow2(height + 1);\n  *out_width = std::max(width_pow2 >> mip, 1u);\n  *out_height = std::max(height_pow2 >> mip, 1u);\n}\n\nuint32_t TextureInfo::GetMipLocation(uint32_t mip, uint32_t* offset_x,\n                                     uint32_t* offset_y, bool is_guest) const {\n  if (mip == 0) {\n    // Short-circuit. Mip 0 is always stored in base_address.\n    if (!has_packed_mips) {\n      *offset_x = 0;\n      *offset_y = 0;\n    } else {\n      GetPackedTileOffset(0, offset_x, offset_y);\n    }\n    return memory.base_address;\n  }\n\n  if (!memory.mip_address) {\n    // Short-circuit. There is no mip data.\n    *offset_x = 0;\n    *offset_y = 0;\n    return 0;\n  }\n\n  uint32_t address_base, address_offset;\n  address_base = memory.mip_address;\n  address_offset = 0;\n\n  auto bytes_per_block = format_info()->bytes_per_block();\n\n  if (!has_packed_mips) {\n    for (uint32_t i = 1; i < mip; i++) {\n      address_offset +=\n          GetMipExtent(i, is_guest).all_blocks() * bytes_per_block;\n    }\n    *offset_x = 0;\n    *offset_y = 0;\n    return address_base + address_offset;\n  }\n\n  uint32_t width_pow2 = xe::next_pow2(width + 1);\n  uint32_t height_pow2 = xe::next_pow2(height + 1);\n\n  // Walk forward to find the address of the mip.\n  uint32_t packed_mip_base = 1;\n  for (uint32_t i = packed_mip_base; i < mip; i++, packed_mip_base++) {\n    uint32_t mip_width = std::max(width_pow2 >> i, 1u);\n    uint32_t mip_height = std::max(height_pow2 >> i, 1u);\n    if (std::min(mip_width, mip_height) <= 16) {\n      // We've reached the point where the mips are packed into a single tile.\n      break;\n    }\n    address_offset += GetMipExtent(i, is_guest).all_blocks() * bytes_per_block;\n  }\n\n  // Now, check if the mip is packed at an offset.\n  GetPackedTileOffset(width_pow2 >> mip, height_pow2 >> mip, format_info(),\n                      mip - packed_mip_base, offset_x, offset_y);\n  return address_base + address_offset;\n}\n\nbool TextureInfo::GetPackedTileOffset(uint32_t width, uint32_t height,\n                                      const FormatInfo* format_info,\n                                      int packed_tile, uint32_t* offset_x,\n                                      uint32_t* offset_y) {\n  // Tile size is 32x32, and once textures go <=16 they are packed into a\n  // single tile together. The math here is insane. Most sourced\n  // from graph paper and looking at dds dumps.\n  //   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n  // 0         +.4x4.+ +.....8x8.....+ +............16x16............+\n  // 1         +.4x4.+ +.....8x8.....+ +............16x16............+\n  // 2         +.4x4.+ +.....8x8.....+ +............16x16............+\n  // 3         +.4x4.+ +.....8x8.....+ +............16x16............+\n  // 4 x               +.....8x8.....+ +............16x16............+\n  // 5                 +.....8x8.....+ +............16x16............+\n  // 6                 +.....8x8.....+ +............16x16............+\n  // 7                 +.....8x8.....+ +............16x16............+\n  // 8 2x2                             +............16x16............+\n  // 9 2x2                             +............16x16............+\n  // 0                                 +............16x16............+\n  // ...                                            .....\n  // This only works for square textures, or textures that are some non-pot\n  // <= square. As soon as the aspect ratio goes weird, the textures start to\n  // stretch across tiles.\n  //\n  // The 2x2 and 1x1 squares are packed in their specific positions because\n  // each square is the size of at least one block (which is 4x4 pixels max)\n  //\n  // if (tile_aligned(w) > tile_aligned(h)) {\n  //   // wider than tall, so packed horizontally\n  // } else if (tile_aligned(w) < tile_aligned(h)) {\n  //   // taller than wide, so packed vertically\n  // } else {\n  //   square\n  // }\n  // It's important to use logical sizes here, as the input sizes will be\n  // for the entire packed tile set, not the actual texture.\n  // The minimum dimension is what matters most: if either width or height\n  // is <= 16 this mode kicks in.\n\n  uint32_t log2_width = xe::log2_ceil(width);\n  uint32_t log2_height = xe::log2_ceil(height);\n  if (std::min(log2_width, log2_height) > 4) {\n    // Too big, not packed.\n    *offset_x = 0;\n    *offset_y = 0;\n    return false;\n  }\n\n  // Find the block offset of the mip.\n  if (packed_tile < 3) {\n    if (log2_width > log2_height) {\n      // Wider than tall. Laid out vertically.\n      *offset_x = 0;\n      *offset_y = 16 >> packed_tile;\n    } else {\n      // Taller than wide. Laid out horizontally.\n      *offset_x = 16 >> packed_tile;\n      *offset_y = 0;\n    }\n  } else {\n    if (log2_width > log2_height) {\n      // Wider than tall. Laid out vertically.\n      *offset_x = 16 >> (packed_tile - 2);\n      *offset_y = 0;\n    } else {\n      // Taller than wide. Laid out horizontally.\n      *offset_x = 0;\n      *offset_y = 16 >> (packed_tile - 2);\n    }\n  }\n\n  *offset_x /= format_info->block_width;\n  *offset_y /= format_info->block_height;\n  return true;\n}\n\nbool TextureInfo::GetPackedTileOffset(int packed_tile, uint32_t* offset_x,\n                                      uint32_t* offset_y) const {\n  if (!has_packed_mips) {\n    *offset_x = 0;\n    *offset_y = 0;\n    return false;\n  }\n  return GetPackedTileOffset(xe::next_pow2(width + 1),\n                             xe::next_pow2(height + 1), format_info(),\n                             packed_tile, offset_x, offset_y);\n}\n\nuint64_t TextureInfo::hash() const {\n  return XXH3_64bits(this, sizeof(TextureInfo));\n}\n\nvoid TextureInfo::SetupMemoryInfo(uint32_t base_address, uint32_t mip_address) {\n  uint32_t bytes_per_block = format_info()->bytes_per_block();\n\n  memory.base_address = 0;\n  memory.base_size = 0;\n  memory.mip_address = 0;\n  memory.mip_size = 0;\n\n  if (mip_min_level == 0 && base_address) {\n    // There is a base mip level.\n    memory.base_address = base_address;\n    memory.base_size = GetMipExtent(0, true).visible_blocks() * bytes_per_block;\n  }\n\n  if (mip_min_level == 0 && mip_max_level == 0) {\n    // Sort circuit. Only one mip.\n    return;\n  }\n\n  if (mip_min_level == 0 && base_address == mip_address) {\n    // TODO(gibbed): This doesn't actually make any sense. Force only one mip.\n    // Offending title issues: #26, #45\n    return;\n  }\n\n  if (mip_min_level > 0) {\n    if ((base_address && !mip_address) || (base_address == mip_address)) {\n      // Mip data is actually at base address?\n      mip_address = base_address;\n      base_address = 0;\n    } else if (!base_address && mip_address) {\n      // Nothing needs to be done.\n    } else {\n      // WTF?\n      assert_always();\n    }\n  }\n\n  memory.mip_address = mip_address;\n\n  if (!has_packed_mips) {\n    for (uint32_t mip = std::max(1u, mip_min_level); mip < mip_max_level;\n         mip++) {\n      memory.mip_size += GetMipExtent(mip, true).all_blocks() * bytes_per_block;\n    }\n    memory.mip_size +=\n        GetMipExtent(mip_max_level, true).visible_blocks() * bytes_per_block;\n    return;\n  }\n\n  uint32_t width_pow2 = xe::next_pow2(width + 1);\n  uint32_t height_pow2 = xe::next_pow2(height + 1);\n\n  // Walk forward to find the address of the mip.\n  uint32_t packed_mip_base = std::max(1u, mip_min_level);\n  for (uint32_t mip = packed_mip_base; mip < mip_max_level;\n       mip++, packed_mip_base++) {\n    uint32_t mip_width = std::max(width_pow2 >> mip, 1u);\n    uint32_t mip_height = std::max(height_pow2 >> mip, 1u);\n    if (std::min(mip_width, mip_height) <= 16) {\n      // We've reached the point where the mips are packed into a single tile.\n      break;\n    }\n    memory.mip_size += GetMipExtent(mip, true).all_blocks() * bytes_per_block;\n  }\n}\n\n}  //  namespace gpu\n}  //  namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/texture_info.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_TEXTURE_INFO_H_\n#define XENIA_GPU_TEXTURE_INFO_H_\n\n#include <cstring>\n#include <memory>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/gpu/xenos.h\"\n\nnamespace xe {\nnamespace gpu {\n\ninline xenos::TextureFormat GetBaseFormat(xenos::TextureFormat texture_format) {\n  // These formats are used for resampling textures / gamma control.\n  switch (texture_format) {\n    case xenos::TextureFormat::k_16_EXPAND:\n      return xenos::TextureFormat::k_16_FLOAT;\n    case xenos::TextureFormat::k_16_16_EXPAND:\n      return xenos::TextureFormat::k_16_16_FLOAT;\n    case xenos::TextureFormat::k_16_16_16_16_EXPAND:\n      return xenos::TextureFormat::k_16_16_16_16_FLOAT;\n    case xenos::TextureFormat::k_8_8_8_8_AS_16_16_16_16:\n      return xenos::TextureFormat::k_8_8_8_8;\n    case xenos::TextureFormat::k_DXT1_AS_16_16_16_16:\n      return xenos::TextureFormat::k_DXT1;\n    case xenos::TextureFormat::k_DXT2_3_AS_16_16_16_16:\n      return xenos::TextureFormat::k_DXT2_3;\n    case xenos::TextureFormat::k_DXT4_5_AS_16_16_16_16:\n      return xenos::TextureFormat::k_DXT4_5;\n    case xenos::TextureFormat::k_2_10_10_10_AS_16_16_16_16:\n      return xenos::TextureFormat::k_2_10_10_10;\n    case xenos::TextureFormat::k_10_11_11_AS_16_16_16_16:\n      return xenos::TextureFormat::k_10_11_11;\n    case xenos::TextureFormat::k_11_11_10_AS_16_16_16_16:\n      return xenos::TextureFormat::k_11_11_10;\n    case xenos::TextureFormat::k_8_8_8_8_GAMMA_EDRAM:\n      return xenos::TextureFormat::k_8_8_8_8;\n    default:\n      break;\n  }\n\n  return texture_format;\n}\n\ninline size_t GetTexelSize(xenos::TextureFormat format) {\n  switch (format) {\n    case xenos::TextureFormat::k_1_5_5_5:\n      return 2;\n    case xenos::TextureFormat::k_2_10_10_10:\n      return 4;\n    case xenos::TextureFormat::k_4_4_4_4:\n      return 2;\n    case xenos::TextureFormat::k_5_6_5:\n      return 2;\n    case xenos::TextureFormat::k_8:\n      return 1;\n    case xenos::TextureFormat::k_8_8:\n      return 2;\n    case xenos::TextureFormat::k_8_8_8_8:\n      return 4;\n    case xenos::TextureFormat::k_16:\n      return 4;\n    case xenos::TextureFormat::k_16_FLOAT:\n      return 4;\n    case xenos::TextureFormat::k_16_16:\n      return 4;\n    case xenos::TextureFormat::k_16_16_FLOAT:\n      return 4;\n    case xenos::TextureFormat::k_16_16_16_16:\n      return 8;\n    case xenos::TextureFormat::k_16_16_16_16_FLOAT:\n      return 8;\n    case xenos::TextureFormat::k_32_FLOAT:\n      return 4;\n    case xenos::TextureFormat::k_32_32_FLOAT:\n      return 8;\n    case xenos::TextureFormat::k_32_32_32_32_FLOAT:\n      return 16;\n    case xenos::TextureFormat::k_10_11_11:\n    case xenos::TextureFormat::k_11_11_10:\n      return 4;\n    default:\n      assert_unhandled_case(format);\n      return 0;\n  }\n}\n\ninline xenos::TextureFormat ColorFormatToTextureFormat(\n    xenos::ColorFormat color_format) {\n  return static_cast<xenos::TextureFormat>(color_format);\n}\n\ninline xenos::TextureFormat DepthRenderTargetToTextureFormat(\n    xenos::DepthRenderTargetFormat depth_format) {\n  switch (depth_format) {\n    case xenos::DepthRenderTargetFormat::kD24S8:\n      return xenos::TextureFormat::k_24_8;\n    case xenos::DepthRenderTargetFormat::kD24FS8:\n      return xenos::TextureFormat::k_24_8_FLOAT;\n    default:\n      assert_unhandled_case(depth_format);\n      return xenos::TextureFormat(~0);\n  }\n}\n\nenum class FormatType {\n  // Uncompressed, and is also a ColorFormat.\n  kResolvable,\n  // Uncompressed, but resolve or memory export cannot be done to the format.\n  kUncompressed,\n  kCompressed,\n};\n\nstruct FormatInfo {\n  xenos::TextureFormat format;\n  const char* name;\n  FormatType type;\n  uint32_t block_width;\n  uint32_t block_height;\n  uint32_t bits_per_pixel;\n\n  uint32_t bytes_per_block() const {\n    return block_width * block_height * bits_per_pixel / 8;\n  }\n\n  static const FormatInfo* Get(uint32_t gpu_format);\n\n  static const FormatInfo* Get(xenos::TextureFormat format) {\n    return Get(static_cast<uint32_t>(format));\n  }\n};\n\nstruct TextureInfo;\n\nstruct TextureExtent {\n  uint32_t pitch;          // texel pitch\n  uint32_t height;         // texel height\n  uint32_t block_width;    // # of horizontal visible blocks\n  uint32_t block_height;   // # of vertical visible blocks\n  uint32_t block_pitch_h;  // # of horizontal pitch blocks\n  uint32_t block_pitch_v;  // # of vertical pitch blocks\n  uint32_t depth;\n\n  uint32_t all_blocks() const { return block_pitch_h * block_pitch_v * depth; }\n  uint32_t visible_blocks() const {\n    return block_pitch_h * block_height * depth;\n  }\n\n  static TextureExtent Calculate(const FormatInfo* format_info, uint32_t pitch,\n                                 uint32_t height, uint32_t depth, bool is_tiled,\n                                 bool is_guest);\n  static TextureExtent Calculate(const TextureInfo* texture_info,\n                                 bool is_guest);\n};\n\nstruct TextureMemoryInfo {\n  uint32_t base_address;\n  uint32_t base_size;\n  uint32_t mip_address;\n  uint32_t mip_size;\n};\n\nstruct TextureInfo {\n  xenos::TextureFormat format;\n  xenos::Endian endianness;\n\n  xenos::DataDimension dimension;\n  uint32_t width;   // width in pixels\n  uint32_t height;  // height in pixels\n  uint32_t depth;   // depth in layers\n  uint32_t pitch;   // pitch in blocks\n  uint32_t mip_min_level;\n  uint32_t mip_max_level;\n  bool is_stacked;\n  bool is_tiled;\n  bool has_packed_mips;\n\n  TextureMemoryInfo memory;\n  TextureExtent extent;\n\n  const FormatInfo* format_info() const {\n    return FormatInfo::Get(static_cast<uint32_t>(format));\n  }\n\n  bool is_compressed() const {\n    return format_info()->type == FormatType::kCompressed;\n  }\n\n  uint32_t mip_levels() const { return 1 + (mip_max_level - mip_min_level); }\n\n  static bool Prepare(const xenos::xe_gpu_texture_fetch_t& fetch,\n                      TextureInfo* out_info);\n\n  static bool PrepareResolve(uint32_t physical_address,\n                             xenos::TextureFormat texture_format,\n                             xenos::Endian endian, uint32_t pitch,\n                             uint32_t width, uint32_t height, uint32_t depth,\n                             TextureInfo* out_info);\n\n  uint32_t GetMaxMipLevels() const;\n\n  const TextureExtent GetMipExtent(uint32_t mip, bool is_guest) const;\n\n  void GetMipSize(uint32_t mip, uint32_t* width, uint32_t* height) const;\n\n  // Get the memory location of a mip. offset_x and offset_y are in blocks.\n  uint32_t GetMipLocation(uint32_t mip, uint32_t* offset_x, uint32_t* offset_y,\n                          bool is_guest) const;\n\n  static bool GetPackedTileOffset(uint32_t width, uint32_t height,\n                                  const FormatInfo* format_info,\n                                  int packed_tile, uint32_t* offset_x,\n                                  uint32_t* offset_y);\n\n  bool GetPackedTileOffset(int packed_tile, uint32_t* offset_x,\n                           uint32_t* offset_y) const;\n\n  uint64_t hash() const;\n  bool operator==(const TextureInfo& other) const {\n    return std::memcmp(this, &other, sizeof(TextureInfo)) == 0;\n  }\n\n private:\n  void SetupMemoryInfo(uint32_t base_address, uint32_t mip_address);\n};\n\n}  // namespace gpu\n}  // namespace xe\n\n#endif  // XENIA_GPU_TEXTURE_INFO_H_\n"
  },
  {
    "path": "src/xenia/gpu/texture_info_formats.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n// clang-format off\n\n#include \"xenia/gpu/texture_info.h\"\n\nnamespace xe {\nnamespace gpu {\n\nusing namespace xe::gpu::xenos;\n\n#define FORMAT_INFO(texture_format, format, block_width, block_height, bits_per_pixel) \\\n    {xenos::TextureFormat::texture_format, #texture_format, FormatType::format, block_width, block_height, bits_per_pixel}\nconst FormatInfo* FormatInfo::Get(uint32_t gpu_format) {\n  static const FormatInfo format_infos[64] = {\n      FORMAT_INFO(k_1_REVERSE                , kUncompressed, 1, 1, 1),\n      FORMAT_INFO(k_1                        , kUncompressed, 1, 1, 1),\n      FORMAT_INFO(k_8                        , kResolvable,   1, 1, 8),\n      FORMAT_INFO(k_1_5_5_5                  , kResolvable,   1, 1, 16),\n      FORMAT_INFO(k_5_6_5                    , kResolvable,   1, 1, 16),\n      FORMAT_INFO(k_6_5_5                    , kResolvable,   1, 1, 16),\n      FORMAT_INFO(k_8_8_8_8                  , kResolvable,   1, 1, 32),\n      FORMAT_INFO(k_2_10_10_10               , kResolvable,   1, 1, 32),\n      FORMAT_INFO(k_8_A                      , kResolvable,   1, 1, 8),\n      FORMAT_INFO(k_8_B                      , kResolvable,   1, 1, 8),\n      FORMAT_INFO(k_8_8                      , kResolvable,   1, 1, 16),\n      FORMAT_INFO(k_Cr_Y1_Cb_Y0_REP          , kCompressed,   2, 1, 16),\n      FORMAT_INFO(k_Y1_Cr_Y0_Cb_REP          , kCompressed,   2, 1, 16),\n      FORMAT_INFO(k_16_16_EDRAM              , kUncompressed, 1, 1, 32),\n      FORMAT_INFO(k_8_8_8_8_A                , kResolvable,   1, 1, 32),\n      FORMAT_INFO(k_4_4_4_4                  , kResolvable,   1, 1, 16),\n      FORMAT_INFO(k_10_11_11                 , kResolvable,   1, 1, 32),\n      FORMAT_INFO(k_11_11_10                 , kResolvable,   1, 1, 32),\n      FORMAT_INFO(k_DXT1                     , kCompressed,   4, 4, 4),\n      FORMAT_INFO(k_DXT2_3                   , kCompressed,   4, 4, 8),\n      FORMAT_INFO(k_DXT4_5                   , kCompressed,   4, 4, 8),\n      FORMAT_INFO(k_16_16_16_16_EDRAM        , kUncompressed, 1, 1, 64),\n      FORMAT_INFO(k_24_8                     , kUncompressed, 1, 1, 32),\n      FORMAT_INFO(k_24_8_FLOAT               , kUncompressed, 1, 1, 32),\n      FORMAT_INFO(k_16                       , kResolvable,   1, 1, 16),\n      FORMAT_INFO(k_16_16                    , kResolvable,   1, 1, 32),\n      FORMAT_INFO(k_16_16_16_16              , kResolvable,   1, 1, 64),\n      FORMAT_INFO(k_16_EXPAND                , kUncompressed, 1, 1, 16),\n      FORMAT_INFO(k_16_16_EXPAND             , kUncompressed, 1, 1, 32),\n      FORMAT_INFO(k_16_16_16_16_EXPAND       , kUncompressed, 1, 1, 64),\n      FORMAT_INFO(k_16_FLOAT                 , kResolvable,   1, 1, 16),\n      FORMAT_INFO(k_16_16_FLOAT              , kResolvable,   1, 1, 32),\n      FORMAT_INFO(k_16_16_16_16_FLOAT        , kResolvable,   1, 1, 64),\n      FORMAT_INFO(k_32                       , kUncompressed, 1, 1, 32),\n      FORMAT_INFO(k_32_32                    , kUncompressed, 1, 1, 64),\n      FORMAT_INFO(k_32_32_32_32              , kUncompressed, 1, 1, 128),\n      FORMAT_INFO(k_32_FLOAT                 , kResolvable,   1, 1, 32),\n      FORMAT_INFO(k_32_32_FLOAT              , kResolvable,   1, 1, 64),\n      FORMAT_INFO(k_32_32_32_32_FLOAT        , kResolvable,   1, 1, 128),\n      FORMAT_INFO(k_32_AS_8                  , kCompressed,   4, 1, 8),\n      FORMAT_INFO(k_32_AS_8_8                , kCompressed,   2, 1, 16),\n      FORMAT_INFO(k_16_MPEG                  , kUncompressed, 1, 1, 16),\n      FORMAT_INFO(k_16_16_MPEG               , kUncompressed, 1, 1, 32),\n      FORMAT_INFO(k_8_INTERLACED             , kUncompressed, 1, 1, 8),\n      FORMAT_INFO(k_32_AS_8_INTERLACED       , kCompressed,   4, 1, 8),\n      FORMAT_INFO(k_32_AS_8_8_INTERLACED     , kCompressed,   1, 1, 16),\n      FORMAT_INFO(k_16_INTERLACED            , kUncompressed, 1, 1, 16),\n      FORMAT_INFO(k_16_MPEG_INTERLACED       , kUncompressed, 1, 1, 16),\n      FORMAT_INFO(k_16_16_MPEG_INTERLACED    , kUncompressed, 1, 1, 32),\n      FORMAT_INFO(k_DXN                      , kCompressed,   4, 4, 8),\n      FORMAT_INFO(k_8_8_8_8_AS_16_16_16_16   , kResolvable,   1, 1, 32),\n      FORMAT_INFO(k_DXT1_AS_16_16_16_16      , kCompressed,   4, 4, 4),\n      FORMAT_INFO(k_DXT2_3_AS_16_16_16_16    , kCompressed,   4, 4, 8),\n      FORMAT_INFO(k_DXT4_5_AS_16_16_16_16    , kCompressed,   4, 4, 8),\n      FORMAT_INFO(k_2_10_10_10_AS_16_16_16_16, kResolvable,   1, 1, 32),\n      FORMAT_INFO(k_10_11_11_AS_16_16_16_16  , kResolvable,   1, 1, 32),\n      FORMAT_INFO(k_11_11_10_AS_16_16_16_16  , kResolvable,   1, 1, 32),\n      FORMAT_INFO(k_32_32_32_FLOAT           , kUncompressed, 1, 1, 96),\n      FORMAT_INFO(k_DXT3A                    , kCompressed,   4, 4, 4),\n      FORMAT_INFO(k_DXT5A                    , kCompressed,   4, 4, 4),\n      FORMAT_INFO(k_CTX1                     , kCompressed,   4, 4, 4),\n      FORMAT_INFO(k_DXT3A_AS_1_1_1_1         , kCompressed,   4, 4, 4),\n      FORMAT_INFO(k_8_8_8_8_GAMMA_EDRAM      , kUncompressed, 1, 1, 32),\n      FORMAT_INFO(k_2_10_10_10_FLOAT_EDRAM   , kUncompressed, 1, 1, 32),\n  };\n  return &format_infos[gpu_format];\n}\n#undef FORMAT_INFO\n\n}  //  namespace gpu\n}  //  namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/texture_util.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/texture_util.h\"\n\n#include <algorithm>\n#include <cstring>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/gpu/texture_address.h\"\n\nnamespace xe {\nnamespace gpu {\nnamespace texture_util {\n\nvoid GetSubresourcesFromFetchConstant(\n    const xenos::xe_gpu_texture_fetch_t& fetch, uint32_t* width_minus_1_out,\n    uint32_t* height_minus_1_out, uint32_t* depth_or_array_size_minus_1_out,\n    uint32_t* base_page_out, uint32_t* mip_page_out,\n    uint32_t* mip_min_level_out, uint32_t* mip_max_level_out) {\n  uint32_t width_minus_1 = 0;\n  uint32_t height_minus_1 = 0;\n  uint32_t depth_or_array_size_minus_1 = 0;\n  switch (fetch.dimension) {\n    case xenos::DataDimension::k1D:\n      assert_false(fetch.stacked);\n      assert_false(fetch.tiled);\n      assert_false(fetch.packed_mips);\n      width_minus_1 = fetch.size_1d.width;\n      break;\n    case xenos::DataDimension::k2DOrStacked:\n      width_minus_1 = fetch.size_2d.width;\n      height_minus_1 = fetch.size_2d.height;\n      depth_or_array_size_minus_1 =\n          fetch.stacked ? fetch.size_2d.stack_depth : 0;\n      break;\n    case xenos::DataDimension::k3D:\n      assert_false(fetch.stacked);\n      width_minus_1 = fetch.size_3d.width;\n      height_minus_1 = fetch.size_3d.height;\n      depth_or_array_size_minus_1 = fetch.size_3d.depth;\n      break;\n    case xenos::DataDimension::kCube:\n      assert_false(fetch.stacked);\n      assert_true(fetch.size_2d.stack_depth == 5);\n      width_minus_1 = fetch.size_2d.width;\n      height_minus_1 = fetch.size_2d.height;\n      depth_or_array_size_minus_1 = 5;\n      break;\n  }\n  if (width_minus_1_out) {\n    *width_minus_1_out = width_minus_1;\n  }\n  if (height_minus_1_out) {\n    *height_minus_1_out = height_minus_1;\n  }\n  if (depth_or_array_size_minus_1_out) {\n    *depth_or_array_size_minus_1_out = depth_or_array_size_minus_1;\n  }\n\n  uint32_t longest_axis_minus_1 = std::max(width_minus_1, height_minus_1);\n  if (fetch.dimension == xenos::DataDimension::k3D) {\n    longest_axis_minus_1 =\n        std::max(longest_axis_minus_1, depth_or_array_size_minus_1);\n  }\n  uint32_t size_mip_max_level =\n      xe::log2_floor(longest_axis_minus_1 + uint32_t(1));\n\n  uint32_t base_page = fetch.base_address & 0x1FFFF;\n  uint32_t mip_page = fetch.mip_address & 0x1FFFF;\n\n  uint32_t mip_min_level, mip_max_level;\n  // Not taking mip_filter == kBaseMap into account for mip_max_level because\n  // the mip filter may be overridden by shader fetch instructions.\n  if (mip_page == 0) {\n    mip_min_level = 0;\n    mip_max_level = 0;\n  } else {\n    mip_min_level = std::min(uint32_t(fetch.mip_min_level), size_mip_max_level);\n    mip_max_level =\n        std::max(std::min(uint32_t(fetch.mip_max_level), size_mip_max_level),\n                 mip_min_level);\n  }\n  if (mip_max_level != 0) {\n    if (base_page == 0) {\n      mip_min_level = std::max(mip_min_level, uint32_t(1));\n    }\n    if (mip_min_level != 0) {\n      base_page = 0;\n    }\n  } else {\n    mip_page = 0;\n  }\n\n  if (base_page_out) {\n    *base_page_out = base_page;\n  }\n  if (mip_page_out) {\n    *mip_page_out = mip_page;\n  }\n  if (mip_min_level_out) {\n    *mip_min_level_out = mip_min_level;\n  }\n  if (mip_max_level_out) {\n    *mip_max_level_out = mip_max_level;\n  }\n}\n\nbool GetPackedMipOffset(uint32_t width, uint32_t height, uint32_t depth,\n                        xenos::TextureFormat format, uint32_t mip,\n                        uint32_t& x_blocks, uint32_t& y_blocks,\n                        uint32_t& z_blocks) {\n  // Tile size is 32x32, and once textures go <=16 they are packed into a\n  // single tile together. The math here is insane. Most sourced from\n  // graph paper, looking at dds dumps and executable reverse engineering.\n  //   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n  // 0         +.4x4.+ +.....8x8.....+ +............16x16............+\n  // 1         +.4x4.+ +.....8x8.....+ +............16x16............+\n  // 2         +.4x4.+ +.....8x8.....+ +............16x16............+\n  // 3         +.4x4.+ +.....8x8.....+ +............16x16............+\n  // 4 x               +.....8x8.....+ +............16x16............+\n  // 5                 +.....8x8.....+ +............16x16............+\n  // 6                 +.....8x8.....+ +............16x16............+\n  // 7                 +.....8x8.....+ +............16x16............+\n  // 8 2x2                             +............16x16............+\n  // 9 2x2                             +............16x16............+\n  // 0                                 +............16x16............+\n  // ...                                            .....\n  //\n  // The 2x2 and 1x1 squares are packed in their specific positions because\n  // each square is the size of at least one block (which is 4x4 pixels max)\n  //\n  // if (tile_aligned(w) > tile_aligned(h)) {\n  //   // wider than tall, so packed horizontally\n  // } else if (tile_aligned(w) < tile_aligned(h)) {\n  //   // taller than wide, so packed vertically\n  // } else {\n  //   square\n  // }\n  // It's important to use logical sizes here, as the input sizes will be\n  // for the entire packed tile set, not the actual texture.\n  // The minimum dimension is what matters most: if either width or height\n  // is <= 16 this mode kicks in.\n\n  uint32_t log2_width = xe::log2_ceil(width);\n  uint32_t log2_height = xe::log2_ceil(height);\n  uint32_t log2_size = std::min(log2_width, log2_height);\n  if (log2_size > 4 + mip) {\n    // The shortest dimension is bigger than 16, not packed.\n    x_blocks = 0;\n    y_blocks = 0;\n    z_blocks = 0;\n    return false;\n  }\n  uint32_t packed_mip_base = (log2_size > 4) ? (log2_size - 4) : 0;\n  uint32_t packed_mip = mip - packed_mip_base;\n\n  // Find the block offset of the mip.\n  if (packed_mip < 3) {\n    if (log2_width > log2_height) {\n      // Wider than tall. Laid out vertically.\n      x_blocks = 0;\n      y_blocks = 16 >> packed_mip;\n    } else {\n      // Taller than wide. Laid out horizontally.\n      x_blocks = 16 >> packed_mip;\n      y_blocks = 0;\n    }\n    z_blocks = 0;\n  } else {\n    uint32_t offset;\n    if (log2_width > log2_height) {\n      // Wider than tall. Laid out horizontally.\n      offset = (1 << (log2_width - packed_mip_base)) >> (packed_mip - 2);\n      x_blocks = offset;\n      y_blocks = 0;\n    } else {\n      // Taller than wide. Laid out vertically.\n      x_blocks = 0;\n      offset = (1 << (log2_height - packed_mip_base)) >> (packed_mip - 2);\n      y_blocks = offset;\n    }\n    if (offset < 4) {\n      // Pack 1x1 Z mipmaps along Z - not reached for 2D.\n      uint32_t log2_depth = xe::log2_ceil(depth);\n      if (log2_depth > 1 + packed_mip) {\n        z_blocks = (log2_depth - packed_mip) * 4;\n      } else {\n        z_blocks = 4;\n      }\n    } else {\n      z_blocks = 0;\n    }\n  }\n\n  const FormatInfo* format_info = FormatInfo::Get(format);\n  x_blocks /= format_info->block_width;\n  y_blocks /= format_info->block_height;\n  return true;\n}\n\nTextureGuestLayout GetGuestTextureLayout(\n    xenos::DataDimension dimension, uint32_t base_pitch_texels_div_32,\n    uint32_t width_texels, uint32_t height_texels, uint32_t depth_or_array_size,\n    bool is_tiled, xenos::TextureFormat format, bool has_packed_levels,\n    bool has_base, uint32_t max_level) {\n  TextureGuestLayout layout;\n\n  if (dimension == xenos::DataDimension::k1D) {\n    assert_false(is_tiled);\n    // GetPackedMipOffset may result in packing along Y for `width > height`\n    // textures.\n    assert_false(has_packed_levels);\n    height_texels = 1;\n  }\n  uint32_t depth =\n      dimension == xenos::DataDimension::k3D ? depth_or_array_size : 1;\n  switch (dimension) {\n    case xenos::DataDimension::k2DOrStacked:\n      layout.array_size = depth_or_array_size;\n      break;\n    case xenos::DataDimension::kCube:\n      layout.array_size = 6;\n      break;\n    default:\n      layout.array_size = 1;\n  }\n\n  // For safety, for instance, with empty resolve regions (extents calculation\n  // may overflow otherwise due to the assumption of at least one row, for\n  // example, but an empty texture is empty anyway).\n  if (!width_texels || !height_texels || !depth || !layout.array_size) {\n    std::memset(&layout, 0, sizeof(layout));\n    return layout;\n  }\n\n  // For safety, clamp the maximum level.\n  uint32_t max_level_for_dimensions =\n      xe::log2_floor(std::max(std::max(width_texels, height_texels), depth));\n  assert_true(max_level <= max_level_for_dimensions);\n  max_level = std::min(max_level, max_level_for_dimensions);\n  layout.max_level = max_level;\n\n  layout.packed_level = has_packed_levels\n                            ? GetPackedMipLevel(width_texels, height_texels)\n                            : UINT32_MAX;\n\n  // Clear unused level layouts to zero strides/sizes.\n  if (!has_base) {\n    std::memset(&layout.base, 0, sizeof(layout.base));\n  }\n  if (layout.packed_level != 0) {\n    std::memset(&layout.mips[0], 0, sizeof(layout.mips[0]));\n  }\n  uint32_t max_stored_level =\n      std::min(max_level, uint32_t(layout.packed_level));\n  {\n    uint32_t mips_end = max_stored_level + 1;\n    assert_true(mips_end <= xe::countof(layout.mips));\n    uint32_t mips_unused_count = uint32_t(xe::countof(layout.mips)) - mips_end;\n    if (mips_unused_count) {\n      std::memset(&layout.mips[mips_end], 0,\n                  sizeof(layout.mips[0]) * mips_unused_count);\n      std::memset(&layout.mip_offsets_bytes[mips_end], 0,\n                  sizeof(layout.mip_offsets_bytes[0]) * mips_unused_count);\n    }\n  }\n  layout.mips_total_extent_bytes = 0;\n\n  const FormatInfo* format_info = FormatInfo::Get(format);\n  uint32_t bytes_per_block = format_info->bytes_per_block();\n\n  // The loop counter can mean two things depending on whether the packed mip\n  // tail is stored as mip 0, because in this case, it would be ambiguous since\n  // both the base and the mips would be on \"level 0\", but stored separately and\n  // possibly with a different layout.\n  uint32_t loop_level_last;\n  if (layout.packed_level == 0) {\n    // Packed mip tail is the level 0 - may need to load mip tails for the base,\n    // the mips, or both.\n    // Loop iteration 0 - base packed mip tail.\n    // Loop iteration 1 - mips packed mip tail.\n    loop_level_last = uint32_t(max_level != 0);\n  } else {\n    // Packed mip tail is not the level 0.\n    // Loop iteration is the actual level being loaded.\n    loop_level_last = max_stored_level;\n  }\n  uint32_t mip_offset_bytes = 0;\n  for (uint32_t loop_level = has_base ? 0 : 1; loop_level <= loop_level_last;\n       ++loop_level) {\n    bool is_base = loop_level == 0;\n    uint32_t level = (layout.packed_level == 0) ? 0 : loop_level;\n    TextureGuestLayout::Level& level_layout =\n        is_base ? layout.base : layout.mips[level];\n\n    // Calculate the strides.\n    // Mips have row / depth slice strides calculated from a mip of a texture\n    // whose base size is a power of two.\n    // The base mip has tightly packed depth slices, and takes the row pitch\n    // from the fetch constant.\n    // For stride calculation purposes, mip dimensions are always aligned to\n    // 32x32x4 blocks (or x1 for the missing dimensions), including for linear\n    // textures.\n    // Linear texture rows are 256-byte-aligned.\n    uint32_t row_pitch_texels_unaligned;\n    uint32_t z_slice_stride_texel_rows_unaligned;\n    if (is_base) {\n      row_pitch_texels_unaligned = base_pitch_texels_div_32 << 5;\n      z_slice_stride_texel_rows_unaligned = height_texels;\n    } else {\n      row_pitch_texels_unaligned =\n          std::max(xe::next_pow2(width_texels) >> level, uint32_t(1));\n      z_slice_stride_texel_rows_unaligned =\n          std::max(xe::next_pow2(height_texels) >> level, uint32_t(1));\n    }\n    uint32_t row_pitch_blocks_tile_aligned = xe::align(\n        xe::align(row_pitch_texels_unaligned, format_info->block_width) /\n            format_info->block_width,\n        xenos::kTextureTileWidthHeight);\n    level_layout.row_pitch_bytes =\n        row_pitch_blocks_tile_aligned * bytes_per_block;\n    // Assuming the provided pitch is already 256-byte-aligned for linear, but\n    // considering the guest-provided pitch more important (no information about\n    // how the GPU actually handles unaligned rows).\n    if (!is_tiled && !is_base) {\n      level_layout.row_pitch_bytes = xe::align(\n          level_layout.row_pitch_bytes, xenos::kTextureLinearRowAlignmentBytes);\n    }\n    level_layout.z_slice_stride_block_rows =\n        dimension != xenos::DataDimension::k1D\n            ? xe::align(xe::align(z_slice_stride_texel_rows_unaligned,\n                                  format_info->block_height) /\n                            format_info->block_height,\n                        xenos::kTextureTileWidthHeight)\n            : 1;\n    level_layout.array_slice_stride_bytes =\n        level_layout.row_pitch_bytes * level_layout.z_slice_stride_block_rows;\n    uint32_t z_stride_bytes = level_layout.array_slice_stride_bytes;\n    if (dimension == xenos::DataDimension::k3D) {\n      level_layout.array_slice_stride_bytes *=\n          xe::align(depth_or_array_size, xenos::kTextureTileDepth);\n    }\n    level_layout.array_slice_stride_bytes =\n        xe::align(level_layout.array_slice_stride_bytes,\n                  xenos::kTextureSubresourceAlignmentBytes);\n\n    // Estimate the memory amount actually referenced by the texture, which may\n    // be smaller (especially in the 1280x720 linear k_8_8_8_8 case in 4E4D083E,\n    // for which memory exactly for 1280x720 is allocated, and aligning the\n    // height to 32 would cause access of an unallocated page) or bigger than\n    // the stride.\n    if (level == layout.packed_level) {\n      // Calculate the portion of the mip tail actually used by the needed mips.\n      // The actually used region may be significantly smaller than the full\n      // 32x32-texel-aligned (and, for mips, calculated from the base dimensions\n      // rounded to powers of two - 58410A7A has an 80x260 tiled texture with\n      // packed mips at level 3 containing a mip ending at Y = 36, while\n      // 260 >> 3 == 32, but 512 >> 3 == 64) tail. A 2x2 texture (for example,\n      // in 494707D4, there's a 2x2 k_8_8_8_8 linear texture with packed mips),\n      // for instance, would have its 2x2 base at (16, 0) and its 1x1 mip at\n      // (8, 0) - and we need 2 or 1 rows in these cases, not 32 - the 32 rows\n      // in a linear texture (with 256-byte pitch alignment) would span two 4 KB\n      // pages rather than one.\n      level_layout.x_extent_blocks = 0;\n      level_layout.y_extent_blocks = 0;\n      level_layout.z_extent = 0;\n      uint32_t packed_sublevel_last = is_base ? 0 : max_level;\n      for (uint32_t packed_sublevel = layout.packed_level;\n           packed_sublevel <= packed_sublevel_last; ++packed_sublevel) {\n        uint32_t packed_sublevel_x_blocks;\n        uint32_t packed_sublevel_y_blocks;\n        uint32_t packed_sublevel_z;\n        GetPackedMipOffset(width_texels, height_texels, depth, format,\n                           packed_sublevel, packed_sublevel_x_blocks,\n                           packed_sublevel_y_blocks, packed_sublevel_z);\n        level_layout.x_extent_blocks = std::max(\n            level_layout.x_extent_blocks,\n            packed_sublevel_x_blocks +\n                xe::align(\n                    std::max(width_texels >> packed_sublevel, uint32_t(1)),\n                    format_info->block_width) /\n                    format_info->block_width);\n        level_layout.y_extent_blocks = std::max(\n            level_layout.y_extent_blocks,\n            packed_sublevel_y_blocks +\n                xe::align(\n                    std::max(height_texels >> packed_sublevel, uint32_t(1)),\n                    format_info->block_height) /\n                    format_info->block_height);\n        level_layout.z_extent =\n            std::max(level_layout.z_extent,\n                     packed_sublevel_z +\n                         std::max(depth >> packed_sublevel, uint32_t(1)));\n      }\n    } else {\n      level_layout.x_extent_blocks =\n          xe::align(std::max(width_texels >> level, uint32_t(1)),\n                    format_info->block_width) /\n          format_info->block_width;\n      level_layout.y_extent_blocks =\n          xe::align(std::max(height_texels >> level, uint32_t(1)),\n                    format_info->block_height) /\n          format_info->block_height;\n      level_layout.z_extent = std::max(depth >> level, uint32_t(1));\n    }\n    if (is_tiled) {\n      uint32_t bytes_per_block_log2 = xe::log2_floor(bytes_per_block);\n      if (dimension == xenos::DataDimension::k3D) {\n        level_layout.array_slice_data_extent_bytes =\n            uint32_t(GetTiledAddressUpperBound3D(\n                level_layout.x_extent_blocks, level_layout.y_extent_blocks,\n                level_layout.z_extent, row_pitch_blocks_tile_aligned,\n                level_layout.z_slice_stride_block_rows, bytes_per_block_log2));\n      } else {\n        level_layout.array_slice_data_extent_bytes =\n            GetTiledAddressUpperBound2D(\n                level_layout.x_extent_blocks, level_layout.y_extent_blocks,\n                row_pitch_blocks_tile_aligned, bytes_per_block_log2);\n      }\n    } else {\n      level_layout.array_slice_data_extent_bytes =\n          z_stride_bytes * (level_layout.z_extent - 1) +\n          level_layout.row_pitch_bytes * (level_layout.y_extent_blocks - 1) +\n          bytes_per_block * level_layout.x_extent_blocks;\n    }\n    level_layout.level_data_extent_bytes =\n        level_layout.array_slice_stride_bytes * (layout.array_size - 1) +\n        level_layout.array_slice_data_extent_bytes;\n\n    if (!is_base) {\n      layout.mip_offsets_bytes[level] = mip_offset_bytes;\n      layout.mips_total_extent_bytes =\n          std::max(layout.mips_total_extent_bytes,\n                   mip_offset_bytes + level_layout.level_data_extent_bytes);\n      mip_offset_bytes +=\n          level_layout.array_slice_stride_bytes * layout.array_size;\n    }\n  }\n\n  return layout;\n}\n\nuint32_t GetTiledAddressUpperBound2D(uint32_t right, uint32_t bottom,\n                                     uint32_t pitch_aligned,\n                                     uint32_t bytes_per_block_log2) {\n  if (!right || !bottom) {\n    return 0;\n  }\n  // Get the origin of the 32x32 tile containing the last texel.\n  uint32_t upper_bound = uint32_t(texture_address::Tiled2D(\n      int32_t((right - 1) & ~(xenos::kTextureTileWidthHeight - 1)),\n      int32_t((bottom - 1) & ~(xenos::kTextureTileWidthHeight - 1)),\n      pitch_aligned, bytes_per_block_log2));\n  switch (bytes_per_block_log2) {\n    case 0:\n      // Independent addressing within 128x128 portions, but the extent is 0xA00\n      // bytes from the 32x32 tile origin.\n      upper_bound += 0xA00;\n      break;\n    case 1:\n      // Independent addressing within 64x64 portions, but the extent is 0xC00\n      // bytes from the 32x32 tile origin.\n      upper_bound += 0xC00;\n      break;\n    default:\n      upper_bound += UINT32_C(0x400) << bytes_per_block_log2;\n      break;\n  }\n  return upper_bound;\n}\n\nuint64_t GetTiledAddressUpperBound3D(uint32_t right, uint32_t bottom,\n                                     uint32_t back, uint32_t pitch_aligned,\n                                     uint32_t height_aligned,\n                                     uint32_t bytes_per_block_log2) {\n  if (!right || !bottom || !back) {\n    return 0;\n  }\n  // Get the origin of the 32x32x4 tile containing the last texel.\n  uint64_t upper_bound = uint64_t(texture_address::Tiled3D(\n      int32_t((right - 1) & ~(xenos::kTextureTileWidthHeight - 1)),\n      int32_t((bottom - 1) & ~(xenos::kTextureTileWidthHeight - 1)),\n      int32_t((back - 1) & ~(xenos::kTextureTileDepth - 1)), pitch_aligned,\n      height_aligned, bytes_per_block_log2));\n  switch (bytes_per_block_log2) {\n    case 0:\n      // 64x32x8 portions have independent addressing.\n      // Extent relative to the 32x32x4 tile origin:\n      // - Pitch = 32, 96, 160...: (Pitch / 64) * 0x1000 + 0x1000\n      // - Pitch = 64, 128, 192...: (Pitch / 64) * 0x1000 + 0xC00\n      upper_bound += ((pitch_aligned >> 6) << 12) + 0xC00 +\n                     ((pitch_aligned & (1 << 5)) << (10 - 5));\n      break;\n    default:\n      // 32x32x8 portions have independent addressing.\n      // Extent: ((Pitch / 32) * 0x1000 + 0x1000) * (BPB / 2)\n      // Or: ((Pitch / 32) * 0x1000 / 2 + 0x1000 / 2) * BPB\n      upper_bound += ((pitch_aligned << (12 - 5 - 1)) + (0x1000 >> 1))\n                     << bytes_per_block_log2;\n      break;\n  }\n  return upper_bound;\n}\n\nuint8_t SwizzleSigns(const xenos::xe_gpu_texture_fetch_t& fetch) {\n  uint8_t signs = 0;\n  bool any_not_signed = false, any_signed = false;\n  // 0b00 or 0b01 for each component, whether it's constant 0/1.\n  uint8_t constant_mask = 0b00000000;\n  for (uint32_t i = 0; i < 4; ++i) {\n    uint32_t swizzle = (fetch.swizzle >> (i * 3)) & 0b111;\n    if (swizzle & 0b100) {\n      constant_mask |= uint8_t(1) << (i * 2);\n    } else {\n      xenos::TextureSign sign =\n          xenos::TextureSign((fetch.dword_0 >> (2 + swizzle * 2)) & 0b11);\n      signs |= uint8_t(sign) << (i * 2);\n      if (sign == xenos::TextureSign::kSigned) {\n        any_signed = true;\n      } else {\n        any_not_signed = true;\n      }\n    }\n  }\n  xenos::TextureSign constants_sign = xenos::TextureSign::kUnsigned;\n  if (constant_mask == 0b01010101) {\n    // If only constant components, choose according to the original format\n    // (what would more likely be loaded if there were non-constant components).\n    // If all components would be signed, use signed.\n    // Textures with only constant components must still be bound to shaders for\n    // various queries (such as filtering weights) not involving the color data\n    // itself.\n    if (((fetch.dword_0 >> 2) & 0b11111111) ==\n        uint32_t(xenos::TextureSign::kSigned) * 0b01010101) {\n      constants_sign = xenos::TextureSign::kSigned;\n    }\n  } else {\n    // If only signed and constant components, reading just from the signed host\n    // view is enough.\n    if (any_signed && !any_not_signed) {\n      constants_sign = xenos::TextureSign::kSigned;\n    }\n  }\n  signs |= uint8_t(constants_sign) * constant_mask;\n  return signs;\n}\n\nvoid GetClampModesForDimension(const xenos::xe_gpu_texture_fetch_t& fetch,\n                               xenos::ClampMode& clamp_x_out,\n                               xenos::ClampMode& clamp_y_out,\n                               xenos::ClampMode& clamp_z_out) {\n  clamp_x_out = xenos::ClampMode::kClampToEdge;\n  clamp_y_out = xenos::ClampMode::kClampToEdge;\n  clamp_z_out = xenos::ClampMode::kClampToEdge;\n  switch (fetch.dimension) {\n    case xenos::DataDimension::k3D:\n      clamp_z_out = fetch.clamp_z;\n      [[fallthrough]];\n    case xenos::DataDimension::k2DOrStacked:\n      clamp_y_out = fetch.clamp_y;\n      [[fallthrough]];\n    case xenos::DataDimension::k1D:\n      clamp_x_out = fetch.clamp_x;\n      break;\n    default:\n      // Not applicable to cube textures.\n      break;\n  }\n}\n\n}  // namespace texture_util\n}  // namespace gpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/texture_util.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_TEXTURE_UTIL_H_\n#define XENIA_GPU_TEXTURE_UTIL_H_\n\n#include <algorithm>\n\n#include \"xenia/base/math.h\"\n#include \"xenia/gpu/texture_address.h\"\n#include \"xenia/gpu/texture_info.h\"\n#include \"xenia/gpu/xenos.h\"\n\nnamespace xe {\nnamespace gpu {\nnamespace texture_util {\n\n// This namespace replaces texture_extent and most of texture_info for\n// simplicity.\n\n// TODO(Triang3l): Move most of the addressing calculations to\n// `texture_address.h` and clean them up based on the actual internals of the\n// tiling.\n\n// Extracts the size from the fetch constant, and also cleans up addresses and\n// mip range based on real presence of the base level and mips. Returns 6 faces\n// for cube textures.\nvoid GetSubresourcesFromFetchConstant(\n    const xenos::xe_gpu_texture_fetch_t& fetch, uint32_t* width_minus_1_out,\n    uint32_t* height_minus_1_out, uint32_t* depth_or_array_size_minus_1_out,\n    uint32_t* base_page_out, uint32_t* mip_page_out,\n    uint32_t* mip_min_level_out, uint32_t* mip_max_level_out);\n\n// Gets the number of the mipmap level where the packed mips are stored.\ninline uint32_t GetPackedMipLevel(uint32_t width, uint32_t height) {\n  uint32_t log2_size = xe::log2_ceil(std::min(width, height));\n  return log2_size > 4 ? log2_size - 4 : 0;\n}\n\n// Gets the offset of the mipmap within the tail in blocks, or zeros (and\n// returns false) if the mip level is not packed. Width, height and depth are in\n// texels. For non-3D textures, set depth to 1.\n// The offset is always within the dimensions of the image rounded to 32.\nbool GetPackedMipOffset(uint32_t width, uint32_t height, uint32_t depth,\n                        xenos::TextureFormat format, uint32_t mip,\n                        uint32_t& x_blocks, uint32_t& y_blocks,\n                        uint32_t& z_blocks);\n\n// Both tiled and linear textures, as it appears from Direct3D 9 texture\n// alignment disassembly (where the parameter indicating whether the texture is\n// tiled only has effect on aligning the width to max(256 / block size, 32)\n// rather than 32), are stored as tiles of 32x1x1 (for 1D), 32x32x1 (for 2D), or\n// 32x32x4 (for 3D) texels (or compression blocks for compressed textures) for\n// the purpose of calculation of the distance between subresources like array\n// slices, and between depth slices (especially for linear textures).\n//\n// Textures have the base level (level 0) stored under their base_address, and\n// mip levels (starting from 1) stored under their mip_address. There are\n// differences in how texture data is stored under base_address and mip_address:\n// - The base level uses the row pitch (specified in texels divided by 32 - thus\n//   implies 32-block alignment for both uncompressed and compressed textures)\n//   stored in the fetch constant, and height aligned to 32 blocks for Z slice\n//   and array layer stride calculation purposes. The pitch can be different\n//   from the actual width - an example is 584109FF, using 1408 pitch for a\n//   1280x menu background).\n// - The mip levels use `max(next_pow2(width or height in texels) >> level, 1)`\n//   aligned to 32 blocks for the same purpose, likely disregarding the pitch\n//   from the fetch constant.\n//\n// There is also mip tail packing if the fetch constant specifies that packed\n// mips are enabled, for both tiled and linear textures (545407E0 uses linear\n// DXT-compressed textures with packed mips very extensively for the game world\n// materials). In this case, mips with width or height of 16 or smaller are\n// stored not individually, but instead, in 32-texel (note: not 32-block - mip\n// tail calculations are done with texel units; but 32-block padding can only be\n// bigger than 32-texel padding for compressed textures) padding of the last\n// level before the packed one.\n//\n// Note that the mip tail can be used both for the base level and mips (1...) if\n// the entire texture has width or height of 16 or smaller. Therefore, both the\n// base and the mips would be loaded from a mip tail that would be stored like\n// the level 0 of the texture. But, in this case, under base_address and\n// mip_address there are two separate mip tails, and the former likely uses the\n// pitch from the fetch constant and no power of two size rounding, while for\n// the latter the strides are likely calculated like for usual mips. The same\n// applies to 17...32 texture sizes, though in this case the base is not packed\n// tail, but the mips are still packed within an image that's stored like the\n// level 0 of the texture. So, \"storage level 0\" is an ambiguous concept - host\n// texture loading code should distinguish between \"base level 0\" and \"mip tail\n// for the mips 1... stored like level 0\" and load the actual host level 0 from\n// base_address, with all the base addressing properties, and host levels 1...\n// from mip_address, with all the mips addressing properties. The base level\n// being packed is evident from the function that tiles textures in game\n// disassembly, which only checks the flag whether the data is packed passed to\n// it, not the level, to see if it needs to calculate the offset in the mip\n// tail, and the offset calculation function doesn't have level == 0 checks in\n// it, only early-out if level < packed tail level (which can be 0). There are\n// examples of textures with packed base, for example, in the intro level of\n// 545407E0 (8x8 linear DXT1 - pairs of orange lights in the bottom of gambling\n// machines).\n//\n// Linear texture rows are aligned to 256 bytes, for both the base and the mips\n// (for the base, Direct3D 9 writes an already 256-byte-aligned pitch to the\n// fetch constant).\n//\n// However, all the 32x32x4 padding, being just padding, is not necessarily\n// being actually accessed, especially for linear textures. 4E4D083E has a\n// 1280x720 k_8_8_8_8 linear texture, and allocates memory for exactly 1280x720,\n// so aligning the height to 32 to 1280x736 results in access violations. So,\n// while for stride calculations all the padding must be respected, for actual\n// memory loads it's better to avoid trying to access it when possible:\n// - If the pitch is bigger than the width, it's better to calculate the last\n//   row's length from the width rather than the pitch (this also possibly works\n//   in the other direction though - pitch < width is a weird situation, but\n//   probably legal, and may lead to reading data from beyond the calculated\n//   subresource stride).\n// - For linear textures (like that 1280x720 example from 4E4D083E), it's easy\n//   to calculate the exact memory extent that may be accessed knowing the\n//   dimensions (unlike for tiled textures with complex addressing within\n//   32x32x4-block tiles), so there's no need to align them to 32x32x4 for\n//   memory extent calculation.\n//   - For the linear packed mip tail, the extent can be calculated as max of\n//     (block offsets + block extents) of all levels stored in it.\n//\n// 1D textures are always linear and likely can't have packed mips (for `width >\n// height` textures, mip offset calculation may result in packing along Y).\n//\n// Array slices are stored within levels (this is different than how Direct3D\n// 10+ builds subresource indices, for instance). Each array slice or level is\n// aligned to 4 KB (but this doesn't apply to 3D texture slices within one\n// level).\n\nstruct TextureGuestLayout {\n  struct Level {\n    // Distance between each row of blocks in bytes, including all the needed\n    // power of two (for mips) and 256-byte (for linear textures) alignment.\n    uint32_t row_pitch_bytes;\n    // Distance between Z slices in block rows, aligned to power of two for\n    // mips, and to tile height.\n    uint32_t z_slice_stride_block_rows;\n    // Distance between each array slice within the level in bytes, aligned to\n    // kTextureSubresourceAlignmentBytes. The distance to the next level is this\n    // multiplied by the array slice count.\n    uint32_t array_slice_stride_bytes;\n\n    // The exclusive upper bound of blocks needed at this level (this level for\n    // non-packed levels, or all the packed levels for the packed mip tail).\n    uint32_t x_extent_blocks;\n    uint32_t y_extent_blocks;\n    uint32_t z_extent;\n    // Estimated amount of memory this level occupies. Not aligned to\n    // kTextureSubresourceAlignmentBytes. For tiled textures, this will be\n    // calculated for the extent rounded to 32x32x4 blocks (or 32x32x1 depending\n    // on the dimensionality), but for linear textures, as well as for mips of\n    // non-power-of-two tiled textures, this may be significantly (including\n    // less 4 KB pages) smaller than the aligned size (like for 4E4D083E where\n    // aligning the height of a 1280x720 linear texture results in access\n    // violations). For the linear mip tail, this includes all the mip levels\n    // stored in it. If the width is bigger than the pitch, this will also be\n    // taken into account for the last row so all memory actually used by the\n    // texture will be loaded, and may be bigger than the distance between array\n    // slices or levels. The purpose of this parameter is to make the memory\n    // amount that needs to be resident as close to the real amount as possible,\n    // to make sure all the needed data will be read, but also, if possible,\n    // unneeded memory pages won't be accessed (since that may trigger an access\n    // violation on the CPU).\n    uint32_t array_slice_data_extent_bytes;\n    // Including all array slices.\n    uint32_t level_data_extent_bytes;\n  };\n\n  Level base;\n  // If mip_max_level specified at calculation time is at least 1, the stored\n  // mips are min(1, packed_mip_level) through min(mip_max_level,\n  // packed_mip_level).\n  Level mips[xenos::kTextureMaxMips];\n  uint32_t mip_offsets_bytes[xenos::kTextureMaxMips];\n  uint32_t mips_total_extent_bytes;\n  uint32_t max_level;\n  // UINT32_MAX if there's no packed mip tail.\n  uint32_t packed_level;\n  uint32_t array_size;\n};\n\nTextureGuestLayout GetGuestTextureLayout(\n    xenos::DataDimension dimension, uint32_t base_pitch_texels_div_32,\n    uint32_t width_texels, uint32_t height_texels, uint32_t depth_or_array_size,\n    bool is_tiled, xenos::TextureFormat format, bool has_packed_levels,\n    bool has_base, uint32_t max_level);\n\n// Returns the total size of memory the texture uses starting from its base and\n// mip addresses, in bytes (both are optional).\nvoid GetTextureTotalSize(xenos::DataDimension dimension,\n                         uint32_t base_pitch_texels_div_32,\n                         uint32_t width_texels, uint32_t height_texels,\n                         uint32_t depth_or_array_size, bool is_tiled,\n                         xenos::TextureFormat format, uint32_t mip_max_level,\n                         bool has_packed_mips, uint32_t* base_size_out,\n                         uint32_t* mip_size_out);\n\n// Notes about tiled addresses:\n// - The tiled address calculation functions work for both positive and negative\n//   offsets, so they can be used to go both from the origin of the texture to a\n//   region inside it and back (as long as the coordinates are a multiple of the\n//   period of the tiled address function in each direction - depends on whether\n//   the texture is 2D or 3D, and on the number of bytes per block). This is, in\n//   particular, used by Direct3D 9 inside resolving to allow resolving with an\n//   offset in the texture, so the rectangle coordinates are relative to both\n//   the render target and the region (with the appropriate alignment) in the\n//   texture at the same time.\n// - 2D:\n//   - Origins of 32x32-block tiles grow monotonically as Y/32 (in blocks)\n//     increases, and in each tile row, as X/32 (in blocks) increases.\n//   - In each 32x32 tile, the block at (0, 0) within the tile has the address\n//     that matches the origin of the tile itself. This is not true for the\n//     block (31, 31), however - its address will be somewhere within the memory\n//     extent of the tile.\n//   - 1bpb:\n//     - The tiled address sequence repeats every 128 blocks along X or Y.\n//     - 32x32 tiles have their origins 0x200-bytes-aligned, and the addresses\n//       of the blocks within a 32x32 tile span 0xA00 bytes.\n//     - Note that 32x32x1bpb is 0x400 bytes, but addresses of blocks within a\n//       tile span the range of 0xA00 bytes - so 32x32 tiles are stored in\n//       memory ranges that may overlap (even across 128x128 - with the pitch of\n//       192 blocks, the tile at (96, 32)...(127, 63) spans 0x2200...0x2BFF,\n//       while the tile at (128, 32)...(159, 63) spans 0x2400...0x2DFF.\n//     - All blocks within a 32x32 tile are located in the same 4KB-aligned\n//       region.\n//   - 2bpb:\n//     - The approach to storage is conceptually similar to that of 1bpb, with\n//       some quantitative differences.\n//     - The tiled address sequence repeats every 64 blocks along X or Y.\n//     - 32x32 tiles have their origins 0x400-bytes-aligned, and the addresses\n//       of the blocks within a 32x32 tile span 0xC00 bytes.\n//   - 4bpb and larger:\n//     - 32x32 tiles (which themselves are 4 KB or larger in this case) are\n//       stored simply in a tile-row-major way, separately from each other in\n//       memory, with independent addressing within each tile.\n// - 3D:\n//   - Origins of 32x32x4-block tiles grow monotonically as Z/4 increases, and\n//     in each 4-slice portion, as Y/32 (in blocks) increases, and in each tile\n//     row, as X/32 (in blocks) increases.\n//   - Along Z, addressing repeats every 8 slices. Along Y, addressing repeats\n//     every 32 blocks regardless of the number of bytes per block.\n//   - 32-block-row x 4-slice portions are stored in disjoint 4KB-aligned ranges\n//     in memory (thus every 4 slices are also stored in disjoint ranges).\n//   - Addresses within a 32x32x4-block tile span widely throughout the X pitch,\n//     with a lot of overlap between 32x32x4 tiles with different X.\n//   - 1bpb:\n//     - The tiled address sequence repeats every 64 blocks along X.\n//     - Origins of 32x32x4-block tiles within 32-block-row x 4-slice portions:\n//       - X = 0, 64, 128...: (X / 64) * 0x1000\n//       - X = 32, 96, 160...: (X / 64) * 0x1000 + 0x400\n//       - Or: ((X >> 6) << 12) | (((X >> 5) & 1) << 10)\n//     - Span of the addresses within a 32x32x4-block tile:\n//       - Pitch = 32, 96, 160...: (Pitch / 64) * 0x1000 + 0x1000\n//       - Pitch = 64, 128, 192...: (Pitch / 64) * 0x1000 + 0xC00\n//     - Or: ((Pitch >> 6) << 12) + 0xC00 + (((Pitch >> 5) & 1) << 10)\n//     - Or: ((Pitch >> 6) << 12) + 0xC00 + ((Pitch & (1 << 5)) << (10 - 5))\n//   - 2bpb and larger:\n//     - The tiled address sequence repeats every 32 blocks along X.\n//     - Origins of 32x32x4-block tiles within 32-block-row x 4-slice portions:\n//       (X / 32) * 0x1000 * (BPB / 2)\n//     - Span of the addresses within a 32x32x4-block tile:\n//       ((Pitch / 32) * 0x1000 + 0x1000) * (BPB / 2)\n// - Addressing of blocks that are contiguous along X (for tiling/untiling of\n//   larger portions at once):\n//   - 1bpb - each 8 blocks are laid out sequentially, odd 8 blocks =\n//     even 8 blocks + 64 bytes (two R32G32_UINT tiled accesses for one\n//     R32G32B32A32_UINT linear access).\n//   - 2bpb, 4bpb, 8bpb, 16bpb - each 16 bytes contain blocks laid out\n//     sequentially (can tile/untile in R32G32B32A32_UINT portions).\n//   - 2bpb - odd 8 blocks = even 8 blocks + 64 bytes.\n//   - 4bpb - odd 4 blocks = even 4 blocks + 32 bytes.\n//   - 8bpb - odd 2 blocks = even 2 blocks + 32 bytes.\n//   - 16bpb - odd block = even block + 32 bytes.\n// - Resolve granularity for both offset and size is 8x8 pixels - see\n//   xenos::kResolveAlignmentPixels. So, multiple pixels can still be loaded and\n//   stored when resolving, taking the contiguous storage patterns described\n//   above into account.\n\n// bytes_per_block_log2 is log2_floor according to how Direct3D 9 calculates it,\n// but k_32_32_32 textures are never tiled anyway likely.\n\n// Because (0, 0, 0) within each 32x32x4-block tile is stored in memory first,\n// and the tiled address grows monotonically with Z/4, then Y/32, then X/32\n// blocks.\ninline uint32_t GetTiledAddressLowerBound2D(uint32_t left, uint32_t top,\n                                            uint32_t pitch_aligned,\n                                            uint32_t bytes_per_block_log2) {\n  return uint32_t(texture_address::Tiled2D(\n      int32_t(left & ~(xenos::kTextureTileWidthHeight - 1)),\n      int32_t(top & ~(xenos::kTextureTileWidthHeight - 1)), pitch_aligned,\n      bytes_per_block_log2));\n}\ninline uint64_t GetTiledAddressLowerBound3D(uint32_t left, uint32_t top,\n                                            uint32_t front,\n                                            uint32_t pitch_aligned,\n                                            uint32_t height_aligned,\n                                            uint32_t bytes_per_block_log2) {\n  return uint64_t(texture_address::Tiled3D(\n      int32_t(left & ~(xenos::kTextureTileWidthHeight - 1)),\n      int32_t(top & ~(xenos::kTextureTileWidthHeight - 1)),\n      int32_t(front & ~(xenos::kTextureTileDepth)), pitch_aligned,\n      height_aligned, bytes_per_block_log2));\n}\n// Supporting the right > pitch and bottom > height (in tiles) cases also, for\n// estimation how far addresses can actually go even potentially beyond the\n// subresource stride.\nuint32_t GetTiledAddressUpperBound2D(uint32_t right, uint32_t bottom,\n                                     uint32_t pitch_aligned,\n                                     uint32_t bytes_per_block_log2);\nuint64_t GetTiledAddressUpperBound3D(uint32_t right, uint32_t bottom,\n                                     uint32_t back, uint32_t pitch_aligned,\n                                     uint32_t height_aligned,\n                                     uint32_t bytes_per_block_log2);\n\n// Returns four packed TextureSign values swizzled according to the swizzle in\n// the fetch constant, so the shader can apply TextureSigns after reading a\n// pre-swizzled texture. 0/1 elements are considered unsigned (and not biased),\n// however, if all non-constant components are signed, 0/1 are considered signed\n// too (because in backends, unsigned and signed textures may use separate host\n// textures with different formats, so just one is used for both signed and\n// constant components).\nuint8_t SwizzleSigns(const xenos::xe_gpu_texture_fetch_t& fetch);\nconstexpr bool IsAnySignNotSigned(uint8_t packed_signs) {\n  return packed_signs != uint32_t(xenos::TextureSign::kSigned) * 0b01010101;\n}\nconstexpr bool IsAnySignSigned(uint8_t packed_signs) {\n  // Make signed 00 - check if all are 01, 10 or 11.\n  uint32_t xor_signed =\n      packed_signs ^ (uint32_t(xenos::TextureSign::kSigned) * 0b01010101);\n  return ((xor_signed | (xor_signed >> 1)) & 0b01010101) != 0b01010101;\n}\n\n// Returns normalized clamp modes specified in the fetch constant based on the\n// texture data dimension in it.\nvoid GetClampModesForDimension(const xenos::xe_gpu_texture_fetch_t& fetch,\n                               xenos::ClampMode& clamp_x_out,\n                               xenos::ClampMode& clamp_y_out,\n                               xenos::ClampMode& clamp_z_out);\n\n}  // namespace texture_util\n}  // namespace gpu\n}  // namespace xe\n\n#endif  // XENIA_GPU_TEXTURE_UTIL_H_\n"
  },
  {
    "path": "src/xenia/gpu/trace_dump.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/trace_dump.h\"\n\n#include \"third_party/stb/stb_image_write.h\"\n#include \"xenia/base/filesystem.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/profiling.h\"\n#include \"xenia/base/string.h\"\n#include \"xenia/base/threading.h\"\n#include \"xenia/gpu/command_processor.h\"\n#include \"xenia/gpu/graphics_system.h\"\n#include \"xenia/memory.h\"\n#include \"xenia/ui/file_picker.h\"\n#include \"xenia/ui/presenter.h\"\n#include \"xenia/ui/window.h\"\n#include \"xenia/xbox.h\"\n\n#define STB_IMAGE_WRITE_IMPLEMENTATION\n#undef _CRT_SECURE_NO_WARNINGS\n#undef _CRT_NONSTDC_NO_DEPRECATE\n#include \"third_party/stb/stb_image_write.h\"\n\nDEFINE_path(target_trace_file, \"\", \"Specifies the trace file to load.\", \"GPU\");\nDEFINE_path(trace_dump_path, \"\", \"Output path for dumped files.\", \"GPU\");\n\nnamespace xe {\nnamespace gpu {\n\nusing namespace xe::gpu::xenos;\n\nTraceDump::TraceDump() = default;\n\nTraceDump::~TraceDump() = default;\n\nint TraceDump::Main(const std::vector<std::string>& args) {\n  // Grab path from the flag or unnamed argument.\n  std::filesystem::path path;\n  std::filesystem::path output_path;\n  if (!cvars::target_trace_file.empty()) {\n    // Passed as a named argument.\n    // TODO(benvanik): find something better than gflags that supports\n    // unicode.\n    path = cvars::target_trace_file;\n  } else if (args.size() >= 2) {\n    // Passed as an unnamed argument.\n    path = xe::to_path(args[1]);\n\n    if (args.size() >= 3) {\n      output_path = xe::to_path(args[2]);\n    }\n  }\n\n  if (path.empty()) {\n    XELOGE(\"No trace file specified\");\n    return 5;\n  }\n\n  // Normalize the path and make absolute.\n  auto abs_path = std::filesystem::absolute(path);\n  XELOGI(\"Loading trace file {}...\", xe::path_to_utf8(abs_path));\n\n  if (!Setup()) {\n    XELOGE(\"Unable to setup trace dump tool\");\n    return 4;\n  }\n  if (!Load(std::move(abs_path))) {\n    XELOGE(\"Unable to load trace file; not found?\");\n    return 5;\n  }\n\n  // Root file name for outputs.\n  if (output_path.empty()) {\n    base_output_path_ = cvars::trace_dump_path;\n    auto output_name = path.filename().replace_extension();\n\n    base_output_path_ = base_output_path_ / output_name;\n  } else {\n    base_output_path_ = output_path;\n  }\n\n  // Ensure output path exists.\n  xe::filesystem::CreateParentFolder(base_output_path_);\n\n  return Run();\n}\n\nbool TraceDump::Setup() {\n  // Create the emulator but don't initialize so we can setup the window.\n  emulator_ = std::make_unique<Emulator>(\"\", \"\", \"\", \"\");\n  X_STATUS result = emulator_->Setup(\n      nullptr, nullptr, false, nullptr,\n      [this]() { return CreateGraphicsSystem(); }, nullptr);\n  if (XFAILED(result)) {\n    XELOGE(\"Failed to setup emulator: {:08X}\", result);\n    return false;\n  }\n  graphics_system_ = emulator_->graphics_system();\n  player_ = std::make_unique<TracePlayer>(graphics_system_);\n  return true;\n}\n\nbool TraceDump::Load(const std::filesystem::path& trace_file_path) {\n  trace_file_path_ = trace_file_path;\n\n  if (!player_->Open(xe::path_to_utf8(trace_file_path_))) {\n    XELOGE(\"Could not load trace file\");\n    return false;\n  }\n\n  return true;\n}\n\nint TraceDump::Run() {\n  BeginHostCapture();\n  player_->SeekFrame(0);\n  player_->SeekCommand(\n      static_cast<int>(player_->current_frame()->commands.size() - 1));\n  player_->WaitOnPlayback();\n  EndHostCapture();\n\n  // Capture.\n  int result = 0;\n  ui::Presenter* presenter = graphics_system_->presenter();\n  ui::RawImage raw_image;\n  if (presenter && presenter->CaptureGuestOutput(raw_image)) {\n    // Save framebuffer png.\n    auto png_path = base_output_path_.replace_extension(\".png\");\n    auto handle = filesystem::OpenFile(png_path, \"wb\");\n    auto callback = [](void* context, void* data, int size) {\n      fwrite(data, 1, size, (FILE*)context);\n    };\n    stbi_write_png_to_func(callback, handle, static_cast<int>(raw_image.width),\n                           static_cast<int>(raw_image.height), 4,\n                           raw_image.data.data(),\n                           static_cast<int>(raw_image.stride));\n    fclose(handle);\n  } else {\n    result = 1;\n  }\n\n  player_.reset();\n  emulator_.reset();\n  return result;\n}\n\n}  //  namespace gpu\n}  //  namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/trace_dump.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_TRACE_DUMP_H_\n#define XENIA_GPU_TRACE_DUMP_H_\n\n#include <string>\n\n#include \"xenia/emulator.h\"\n#include \"xenia/gpu/shader.h\"\n#include \"xenia/gpu/trace_player.h\"\n#include \"xenia/gpu/trace_protocol.h\"\n#include \"xenia/gpu/xenos.h\"\n#include \"xenia/memory.h\"\n\nnamespace xe {\nnamespace gpu {\n\nstruct SamplerInfo;\nstruct TextureInfo;\n\nclass TraceDump {\n public:\n  virtual ~TraceDump();\n\n  int Main(const std::vector<std::string>& args);\n\n protected:\n  TraceDump();\n\n  virtual std::unique_ptr<gpu::GraphicsSystem> CreateGraphicsSystem() = 0;\n\n  virtual void BeginHostCapture() = 0;\n  virtual void EndHostCapture() = 0;\n\n  std::unique_ptr<Emulator> emulator_;\n  GraphicsSystem* graphics_system_ = nullptr;\n  std::unique_ptr<TracePlayer> player_;\n\n private:\n  bool Setup();\n  bool Load(const std::filesystem::path& trace_file_path);\n  int Run();\n\n  std::filesystem::path trace_file_path_;\n  std::filesystem::path base_output_path_;\n};\n\n}  // namespace gpu\n}  // namespace xe\n\n#endif  // XENIA_GPU_TRACE_DUMP_H_\n"
  },
  {
    "path": "src/xenia/gpu/trace_player.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/trace_player.h\"\n\n#include <memory>\n\n#include \"xenia/gpu/command_processor.h\"\n#include \"xenia/gpu/graphics_system.h\"\n#include \"xenia/gpu/registers.h\"\n#include \"xenia/gpu/xenos.h\"\n#include \"xenia/memory.h\"\n\nnamespace xe {\nnamespace gpu {\n\nTracePlayer::TracePlayer(GraphicsSystem* graphics_system)\n    : graphics_system_(graphics_system),\n      current_frame_index_(0),\n      current_command_index_(-1) {\n  // Need to allocate all of physical memory so that we can write to it during\n  // playback. The 64 KB page heap is larger, covers the entire physical memory,\n  // so it is used instead of the 4 KB page one.\n  auto heap = graphics_system_->memory()->LookupHeapByType(true, 64 * 1024);\n  heap->AllocFixed(heap->heap_base(), heap->heap_size(), heap->page_size(),\n                   kMemoryAllocationReserve | kMemoryAllocationCommit,\n                   kMemoryProtectRead | kMemoryProtectWrite);\n\n  playback_event_ = xe::threading::Event::CreateAutoResetEvent(false);\n  assert_not_null(playback_event_);\n}\n\nconst TraceReader::Frame* TracePlayer::current_frame() const {\n  if (current_frame_index_ >= frame_count()) {\n    return nullptr;\n  }\n  return frame(current_frame_index_);\n}\n\nvoid TracePlayer::SeekFrame(int target_frame) {\n  if (current_frame_index_ == target_frame) {\n    return;\n  }\n  current_frame_index_ = target_frame;\n  auto frame = current_frame();\n  current_command_index_ = int(frame->commands.size()) - 1;\n\n  assert_true(frame->start_ptr <= frame->end_ptr);\n  PlayTrace(frame->start_ptr, frame->end_ptr - frame->start_ptr,\n            TracePlaybackMode::kBreakOnSwap, false);\n}\n\nvoid TracePlayer::SeekCommand(int target_command) {\n  if (current_command_index_ == target_command) {\n    return;\n  }\n  int previous_command_index = current_command_index_;\n  current_command_index_ = target_command;\n  if (current_command_index_ == -1) {\n    return;\n  }\n  auto frame = current_frame();\n  const auto& command = frame->commands[target_command];\n  assert_true(frame->start_ptr <= command.end_ptr);\n  if (previous_command_index != -1 && target_command > previous_command_index) {\n    // Seek forward.\n    const auto& previous_command = frame->commands[previous_command_index];\n    PlayTrace(previous_command.end_ptr,\n              command.end_ptr - previous_command.end_ptr,\n              TracePlaybackMode::kBreakOnSwap, false);\n  } else {\n    // Full playback from frame start.\n    PlayTrace(frame->start_ptr, command.end_ptr - frame->start_ptr,\n              TracePlaybackMode::kBreakOnSwap, true);\n  }\n}\n\nvoid TracePlayer::WaitOnPlayback() {\n  xe::threading::Wait(playback_event_.get(), true);\n}\n\nvoid TracePlayer::PlayTrace(const uint8_t* trace_data, size_t trace_size,\n                            TracePlaybackMode playback_mode,\n                            bool clear_caches) {\n  playing_trace_ = true;\n  graphics_system_->command_processor()->CallInThread([=]() {\n    PlayTraceOnThread(trace_data, trace_size, playback_mode, clear_caches);\n  });\n}\n\nvoid TracePlayer::PlayTraceOnThread(const uint8_t* trace_data,\n                                    size_t trace_size,\n                                    TracePlaybackMode playback_mode,\n                                    bool clear_caches) {\n  auto memory = graphics_system_->memory();\n  auto command_processor = graphics_system_->command_processor();\n\n  if (clear_caches) {\n    command_processor->ClearCaches();\n  }\n\n  playback_percent_ = 0;\n  auto trace_end = trace_data + trace_size;\n\n  playing_trace_ = true;\n  auto trace_ptr = trace_data;\n  bool pending_break = false;\n  const PacketStartCommand* pending_packet = nullptr;\n  while (trace_ptr < trace_data + trace_size) {\n    playback_percent_ = uint32_t(\n        (float(trace_ptr - trace_data) / float(trace_end - trace_data)) *\n        10000);\n\n    auto type = static_cast<TraceCommandType>(xe::load<uint32_t>(trace_ptr));\n    switch (type) {\n      case TraceCommandType::kPrimaryBufferStart: {\n        auto cmd =\n            reinterpret_cast<const PrimaryBufferStartCommand*>(trace_ptr);\n        //\n        trace_ptr += sizeof(*cmd) + cmd->count * 4;\n        break;\n      }\n      case TraceCommandType::kPrimaryBufferEnd: {\n        auto cmd = reinterpret_cast<const PrimaryBufferEndCommand*>(trace_ptr);\n        //\n        trace_ptr += sizeof(*cmd);\n        break;\n      }\n      case TraceCommandType::kIndirectBufferStart: {\n        auto cmd =\n            reinterpret_cast<const IndirectBufferStartCommand*>(trace_ptr);\n        //\n        trace_ptr += sizeof(*cmd) + cmd->count * 4;\n        break;\n      }\n      case TraceCommandType::kIndirectBufferEnd: {\n        auto cmd = reinterpret_cast<const IndirectBufferEndCommand*>(trace_ptr);\n        //\n        trace_ptr += sizeof(*cmd);\n        break;\n      }\n      case TraceCommandType::kPacketStart: {\n        auto cmd = reinterpret_cast<const PacketStartCommand*>(trace_ptr);\n        trace_ptr += sizeof(*cmd);\n        std::memcpy(memory->TranslatePhysical(cmd->base_ptr), trace_ptr,\n                    cmd->count * 4);\n        trace_ptr += cmd->count * 4;\n        pending_packet = cmd;\n        break;\n      }\n      case TraceCommandType::kPacketEnd: {\n        auto cmd = reinterpret_cast<const PacketEndCommand*>(trace_ptr);\n        trace_ptr += sizeof(*cmd);\n        if (pending_packet) {\n          command_processor->ExecutePacket(pending_packet->base_ptr,\n                                           pending_packet->count);\n          pending_packet = nullptr;\n        }\n        if (pending_break) {\n          playing_trace_ = false;\n          return;\n        }\n        break;\n      }\n      case TraceCommandType::kMemoryRead: {\n        auto cmd = reinterpret_cast<const MemoryCommand*>(trace_ptr);\n        trace_ptr += sizeof(*cmd);\n        DecompressMemory(cmd->encoding_format, trace_ptr, cmd->encoded_length,\n                         memory->TranslatePhysical(cmd->base_ptr),\n                         cmd->decoded_length);\n        trace_ptr += cmd->encoded_length;\n        command_processor->TracePlaybackWroteMemory(cmd->base_ptr,\n                                                    cmd->decoded_length);\n        break;\n      }\n      case TraceCommandType::kMemoryWrite: {\n        auto cmd = reinterpret_cast<const MemoryCommand*>(trace_ptr);\n        trace_ptr += sizeof(*cmd);\n        // ?\n        // Assuming the command processor will do the same write.\n        trace_ptr += cmd->encoded_length;\n        break;\n      }\n      case TraceCommandType::kEdramSnapshot: {\n        auto cmd = reinterpret_cast<const EdramSnapshotCommand*>(trace_ptr);\n        trace_ptr += sizeof(*cmd);\n        std::unique_ptr<uint8_t[]> edram_snapshot(\n            new uint8_t[xenos::kEdramSizeBytes]);\n        DecompressMemory(cmd->encoding_format, trace_ptr, cmd->encoded_length,\n                         edram_snapshot.get(), xenos::kEdramSizeBytes);\n        trace_ptr += cmd->encoded_length;\n        command_processor->RestoreEdramSnapshot(edram_snapshot.get());\n        break;\n      }\n      case TraceCommandType::kEvent: {\n        auto cmd = reinterpret_cast<const EventCommand*>(trace_ptr);\n        trace_ptr += sizeof(*cmd);\n        switch (cmd->event_type) {\n          case EventCommand::Type::kSwap: {\n            if (playback_mode == TracePlaybackMode::kBreakOnSwap) {\n              pending_break = true;\n            }\n            break;\n          }\n        }\n        break;\n      }\n      case TraceCommandType::kRegisters: {\n        auto cmd = reinterpret_cast<const RegistersCommand*>(trace_ptr);\n        trace_ptr += sizeof(*cmd);\n        std::unique_ptr<uint32_t[]> register_values(\n            new uint32_t[cmd->register_count]);\n        DecompressMemory(cmd->encoding_format, trace_ptr, cmd->encoded_length,\n                         register_values.get(),\n                         sizeof(uint32_t) * cmd->register_count);\n        trace_ptr += cmd->encoded_length;\n        command_processor->RestoreRegisters(\n            cmd->first_register, register_values.get(), cmd->register_count,\n            cmd->execute_callbacks);\n        break;\n      }\n      case TraceCommandType::kGammaRamp: {\n        auto cmd = reinterpret_cast<const GammaRampCommand*>(trace_ptr);\n        trace_ptr += sizeof(*cmd);\n        std::unique_ptr<uint32_t[]> gamma_ramps(new uint32_t[256 + 3 * 128]);\n        DecompressMemory(cmd->encoding_format, trace_ptr, cmd->encoded_length,\n                         gamma_ramps.get(), sizeof(uint32_t) * (256 + 3 * 128));\n        trace_ptr += cmd->encoded_length;\n        command_processor->RestoreGammaRamp(\n            reinterpret_cast<const reg::DC_LUT_30_COLOR*>(gamma_ramps.get()),\n            reinterpret_cast<const reg::DC_LUT_PWL_DATA*>(gamma_ramps.get() +\n                                                          256),\n            cmd->rw_component);\n        break;\n      }\n    }\n  }\n\n  playing_trace_ = false;\n\n  playback_event_->Set();\n}\n\n}  // namespace gpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/trace_player.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_TRACE_PLAYER_H_\n#define XENIA_GPU_TRACE_PLAYER_H_\n\n#include <atomic>\n#include <string>\n\n#include \"xenia/base/threading.h\"\n#include \"xenia/gpu/trace_protocol.h\"\n#include \"xenia/gpu/trace_reader.h\"\n\nnamespace xe {\nnamespace gpu {\n\nclass GraphicsSystem;\n\nenum class TracePlaybackMode {\n  kUntilEnd,\n  kBreakOnSwap,\n};\n\nclass TracePlayer : public TraceReader {\n public:\n  TracePlayer(GraphicsSystem* graphics_system);\n\n  GraphicsSystem* graphics_system() const { return graphics_system_; }\n  int current_frame_index() const { return current_frame_index_; }\n  int current_command_index() const { return current_command_index_; }\n  bool is_playing_trace() const { return playing_trace_; }\n  const Frame* current_frame() const;\n\n  // Only valid if playing_trace is true.\n  // Scalar from 0-10000\n  uint32_t playback_percent() const { return playback_percent_; }\n\n  void SeekFrame(int target_frame);\n  void SeekCommand(int target_command);\n\n  void WaitOnPlayback();\n\n private:\n  void PlayTrace(const uint8_t* trace_data, size_t trace_size,\n                 TracePlaybackMode playback_mode, bool clear_caches);\n  void PlayTraceOnThread(const uint8_t* trace_data, size_t trace_size,\n                         TracePlaybackMode playback_mode, bool clear_caches);\n\n  GraphicsSystem* graphics_system_;\n  int current_frame_index_;\n  int current_command_index_;\n  bool playing_trace_ = false;\n  std::atomic<uint32_t> playback_percent_ = {0};\n  std::unique_ptr<xe::threading::Event> playback_event_;\n};\n\n}  // namespace gpu\n}  // namespace xe\n\n#endif  // XENIA_GPU_TRACE_PLAYER_H_\n"
  },
  {
    "path": "src/xenia/gpu/trace_protocol.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_TRACE_PROTOCOL_H_\n#define XENIA_GPU_TRACE_PROTOCOL_H_\n\n#include <cstdint>\n\nnamespace xe {\nnamespace gpu {\n\n// Trace file extension.\nstatic const char kTraceExtension[] = \"xtr\";\n\n// Any byte changes to the files should bump this version.\n// Only builds with matching versions will work.\n// Other changes besides the file format may require bumps, such as\n// anything that changes what is recorded into the files (new GPU\n// command processor commands, etc).\nconstexpr uint32_t kTraceFormatVersion = 1;\n\n// Trace file header identifying information about the trace.\n// This must be positioned at the start of the file and must only occur once.\nstruct TraceHeader {\n  // Must be the first 4 bytes of the file.\n  // Set to kTraceFormatVersion.\n  uint32_t version;\n\n  // SHA1 of the commit used to record the trace.\n  char build_commit_sha[40];\n\n  // Title ID of game that was being recorded.\n  // May be 0 if not generated from a game or the ID could not be retrieved.\n  uint32_t title_id;\n};\n\n// Tags each command in the trace file stream as one of the *Command types.\n// Each command has this value as its first dword.\nenum class TraceCommandType : uint32_t {\n  kPrimaryBufferStart,\n  kPrimaryBufferEnd,\n  kIndirectBufferStart,\n  kIndirectBufferEnd,\n  kPacketStart,\n  kPacketEnd,\n  kMemoryRead,\n  kMemoryWrite,\n  kEdramSnapshot,\n  kEvent,\n  kRegisters,\n  kGammaRamp,\n};\n\nstruct PrimaryBufferStartCommand {\n  TraceCommandType type;\n  uint32_t base_ptr;\n  uint32_t count;\n};\n\nstruct PrimaryBufferEndCommand {\n  TraceCommandType type;\n};\n\nstruct IndirectBufferStartCommand {\n  TraceCommandType type;\n  uint32_t base_ptr;\n  uint32_t count;\n};\n\nstruct IndirectBufferEndCommand {\n  TraceCommandType type;\n};\n\nstruct PacketStartCommand {\n  TraceCommandType type;\n  uint32_t base_ptr;\n  uint32_t count;\n};\n\nstruct PacketEndCommand {\n  TraceCommandType type;\n};\n\n// The compression format used for memory read/write buffers.\n// Note that not every memory read/write will have compressed data\n// (as it's silly to compress 4 byte buffers).\nenum class MemoryEncodingFormat {\n  // Data is in its raw form. encoded_length == decoded_length.\n  kNone,\n  // Data is compressed with third_party/snappy.\n  kSnappy,\n};\n\n// Represents the GPU reading or writing data from or to memory.\n// Used for both TraceCommandType::kMemoryRead and kMemoryWrite.\nstruct MemoryCommand {\n  TraceCommandType type;\n\n  // Base physical memory pointer this read starts at.\n  uint32_t base_ptr;\n  // Encoding format of the data in the trace file.\n  MemoryEncodingFormat encoding_format;\n  // Number of bytes the data occupies in the trace file in its encoded form.\n  uint32_t encoded_length;\n  // Number of bytes the data occupies in memory after decoding.\n  // Note that if no encoding is used this will equal encoded_length.\n  uint32_t decoded_length;\n};\n\n// Represents a full 10 MB snapshot of EDRAM contents, for trace initialization\n// (since replaying the trace will reconstruct its state at any point later) as\n// a sequence of tiles with row-major samples (2x multisampling as 1x2 samples,\n// 4x as 2x2 samples).\nstruct EdramSnapshotCommand {\n  TraceCommandType type;\n  // Encoding format of the data in the trace file.\n  MemoryEncodingFormat encoding_format;\n  // Number of bytes the data occupies in the trace file in its encoded form.\n  uint32_t encoded_length;\n};\n\n// Represents a GPU event of EventCommand::Type.\nstruct EventCommand {\n  TraceCommandType type;\n\n  // Identifies the event that occurred.\n  enum class Type {\n    kSwap,\n  };\n  Type event_type;\n};\n\n// Represents a range of registers.\nstruct RegistersCommand {\n  TraceCommandType type;\n\n  uint32_t first_register;\n  uint32_t register_count;\n  // Whether to set the registers via WriteRegister, which may have side\n  // effects, rather than by copying them directly to the register file.\n  bool execute_callbacks;\n\n  // Encoding format of the values in the trace file.\n  MemoryEncodingFormat encoding_format;\n  // Number of bytes the values occupy in the trace file in their encoded form.\n  // If no encoding is used, this will be sizeof(uint32_t) * register_count.\n  uint32_t encoded_length;\n};\n\n// Represents a gamma ramp - encoded 256 DC_LUT_30_COLOR values and 128\n// interleaved RGB DC_LUT_PWL_DATA values.\n// Assuming that all other gamma ramp state is saved as plain registers.\nstruct GammaRampCommand {\n  TraceCommandType type;\n\n  // The component index (0 = red, 1 = green, 2 = blue) for the next\n  // DC_LUT_SEQ_COLOR or DC_LUT_PWL_DATA read or write.\n  uint8_t rw_component;\n\n  // Encoding format of the ramps in the trace file.\n  MemoryEncodingFormat encoding_format;\n  // Number of bytes the ramps occupy in the trace file in their encoded form.\n  // If no encoding is used, this will be sizeof(uint32_t) * (256 + 3 * 128).\n  uint32_t encoded_length;\n};\n\n}  // namespace gpu\n}  // namespace xe\n\n#endif  // XENIA_GPU_TRACE_PROTOCOL_H_\n"
  },
  {
    "path": "src/xenia/gpu/trace_reader.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/trace_reader.h\"\n\n#include <cinttypes>\n\n#include \"third_party/snappy/snappy.h\"\n#include \"xenia/base/filesystem.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/mapped_memory.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/platform.h\"\n#include \"xenia/gpu/packet_disassembler.h\"\n#include \"xenia/gpu/trace_protocol.h\"\n#include \"xenia/memory.h\"\n\nnamespace xe {\nnamespace gpu {\n\nbool TraceReader::Open(const std::string_view path) {\n  Close();\n\n  mmap_.reset();\n#if XE_PLATFORM_ANDROID\n  if (xe::filesystem::IsAndroidContentUri(path)) {\n    mmap_ =\n        MappedMemory::OpenForAndroidContentUri(path, MappedMemory::Mode::kRead);\n  }\n#endif  // XE_PLATFORM_ANDROID\n  if (!mmap_) {\n    mmap_ = MappedMemory::Open(xe::to_path(path), MappedMemory::Mode::kRead);\n  }\n  if (!mmap_) {\n    return false;\n  }\n\n  trace_data_ = reinterpret_cast<const uint8_t*>(mmap_->data());\n  trace_size_ = mmap_->size();\n\n  // Verify version.\n  auto header = reinterpret_cast<const TraceHeader*>(trace_data_);\n  if (header->version != kTraceFormatVersion) {\n    XELOGE(\"Trace format version mismatch, code has {}, file has {}\",\n           kTraceFormatVersion, header->version);\n    if (header->version < kTraceFormatVersion) {\n      XELOGE(\"You need to regenerate your trace for the latest version\");\n    }\n    return false;\n  }\n\n  XELOGI(\"Mapped {}b trace from {}\", trace_size_, xe::path_to_utf8(path));\n  XELOGI(\"   Version: {}\", header->version);\n  auto commit_str = std::string(header->build_commit_sha,\n                                xe::countof(header->build_commit_sha));\n  XELOGI(\"    Commit: {}\", commit_str);\n  XELOGI(\"  Title ID: {}\", header->title_id);\n\n  ParseTrace();\n\n  return true;\n}\n\nvoid TraceReader::Close() {\n  mmap_.reset();\n  trace_data_ = nullptr;\n  trace_size_ = 0;\n}\n\nvoid TraceReader::ParseTrace() {\n  // Skip file header.\n  auto trace_ptr = trace_data_;\n  trace_ptr += sizeof(TraceHeader);\n\n  Frame current_frame;\n  current_frame.start_ptr = trace_ptr;\n  const PacketStartCommand* packet_start = nullptr;\n  const uint8_t* packet_start_ptr = nullptr;\n  const uint8_t* last_ptr = trace_ptr;\n  bool pending_break = false;\n  auto current_command_buffer = new CommandBuffer();\n  current_frame.command_tree =\n      std::unique_ptr<CommandBuffer>(current_command_buffer);\n\n  while (trace_ptr < trace_data_ + trace_size_) {\n    ++current_frame.command_count;\n    auto type = static_cast<TraceCommandType>(xe::load<uint32_t>(trace_ptr));\n    switch (type) {\n      case TraceCommandType::kPrimaryBufferStart: {\n        auto cmd =\n            reinterpret_cast<const PrimaryBufferStartCommand*>(trace_ptr);\n        trace_ptr += sizeof(*cmd) + cmd->count * 4;\n        break;\n      }\n      case TraceCommandType::kPrimaryBufferEnd: {\n        auto cmd = reinterpret_cast<const PrimaryBufferEndCommand*>(trace_ptr);\n        trace_ptr += sizeof(*cmd);\n        break;\n      }\n      case TraceCommandType::kIndirectBufferStart: {\n        auto cmd =\n            reinterpret_cast<const IndirectBufferStartCommand*>(trace_ptr);\n        trace_ptr += sizeof(*cmd) + cmd->count * 4;\n\n        // Traverse down a level.\n        auto sub_command_buffer = new CommandBuffer();\n        sub_command_buffer->parent = current_command_buffer;\n        current_command_buffer->commands.push_back(\n            CommandBuffer::Command(sub_command_buffer));\n        current_command_buffer = sub_command_buffer;\n        break;\n      }\n      case TraceCommandType::kIndirectBufferEnd: {\n        auto cmd = reinterpret_cast<const IndirectBufferEndCommand*>(trace_ptr);\n        trace_ptr += sizeof(*cmd);\n\n        // IB packet is wrapped in a kPacketStart/kPacketEnd. Skip the end.\n        auto end_cmd = reinterpret_cast<const PacketEndCommand*>(trace_ptr);\n        assert_true(end_cmd->type == TraceCommandType::kPacketEnd);\n        trace_ptr += sizeof(*cmd);\n\n        // Go back up a level. If parent is null, this frame started in an\n        // indirect buffer.\n        if (current_command_buffer->parent) {\n          current_command_buffer = current_command_buffer->parent;\n        }\n        break;\n      }\n      case TraceCommandType::kPacketStart: {\n        auto cmd = reinterpret_cast<const PacketStartCommand*>(trace_ptr);\n        packet_start_ptr = trace_ptr;\n        packet_start = cmd;\n        trace_ptr += sizeof(*cmd) + cmd->count * 4;\n        break;\n      }\n      case TraceCommandType::kPacketEnd: {\n        auto cmd = reinterpret_cast<const PacketEndCommand*>(trace_ptr);\n        trace_ptr += sizeof(*cmd);\n        if (!packet_start_ptr) {\n          continue;\n        }\n        auto packet_category = PacketDisassembler::GetPacketCategory(\n            packet_start_ptr + sizeof(*packet_start));\n        switch (packet_category) {\n          case PacketCategory::kDraw: {\n            Frame::Command command;\n            command.type = Frame::Command::Type::kDraw;\n            command.head_ptr = packet_start_ptr;\n            command.start_ptr = last_ptr;\n            command.end_ptr = trace_ptr;\n            current_frame.commands.push_back(std::move(command));\n            last_ptr = trace_ptr;\n            current_command_buffer->commands.push_back(CommandBuffer::Command(\n                uint32_t(current_frame.commands.size() - 1)));\n            break;\n          }\n          case PacketCategory::kSwap: {\n            Frame::Command command;\n            command.type = Frame::Command::Type::kSwap;\n            command.head_ptr = packet_start_ptr;\n            command.start_ptr = last_ptr;\n            command.end_ptr = trace_ptr;\n            current_frame.commands.push_back(std::move(command));\n            last_ptr = trace_ptr;\n            current_command_buffer->commands.push_back(CommandBuffer::Command(\n                uint32_t(current_frame.commands.size() - 1)));\n          } break;\n          case PacketCategory::kGeneric: {\n            // Ignored.\n            break;\n          }\n        }\n        if (pending_break) {\n          current_frame.end_ptr = trace_ptr;\n          frames_.push_back(std::move(current_frame));\n          current_command_buffer = new CommandBuffer();\n          current_frame.command_tree =\n              std::unique_ptr<CommandBuffer>(current_command_buffer);\n          current_frame.start_ptr = trace_ptr;\n          current_frame.end_ptr = nullptr;\n          current_frame.command_count = 0;\n          pending_break = false;\n        }\n        break;\n      }\n      case TraceCommandType::kMemoryRead: {\n        auto cmd = reinterpret_cast<const MemoryCommand*>(trace_ptr);\n        trace_ptr += sizeof(*cmd) + cmd->encoded_length;\n        break;\n      }\n      case TraceCommandType::kMemoryWrite: {\n        auto cmd = reinterpret_cast<const MemoryCommand*>(trace_ptr);\n        trace_ptr += sizeof(*cmd) + cmd->encoded_length;\n        break;\n      }\n      case TraceCommandType::kEdramSnapshot: {\n        auto cmd = reinterpret_cast<const EdramSnapshotCommand*>(trace_ptr);\n        trace_ptr += sizeof(*cmd) + cmd->encoded_length;\n        break;\n      }\n      case TraceCommandType::kEvent: {\n        auto cmd = reinterpret_cast<const EventCommand*>(trace_ptr);\n        trace_ptr += sizeof(*cmd);\n        switch (cmd->event_type) {\n          case EventCommand::Type::kSwap: {\n            pending_break = true;\n            break;\n          }\n        }\n        break;\n      }\n      case TraceCommandType::kRegisters: {\n        auto cmd = reinterpret_cast<const RegistersCommand*>(trace_ptr);\n        trace_ptr += sizeof(*cmd) + cmd->encoded_length;\n        break;\n      }\n      case TraceCommandType::kGammaRamp: {\n        auto cmd = reinterpret_cast<const GammaRampCommand*>(trace_ptr);\n        trace_ptr += sizeof(*cmd) + cmd->encoded_length;\n        break;\n      }\n      default:\n        // Broken trace file?\n        assert_unhandled_case(type);\n        break;\n    }\n  }\n  if (pending_break || current_frame.command_count) {\n    current_frame.end_ptr = trace_ptr;\n    frames_.push_back(std::move(current_frame));\n  }\n}\n\nbool TraceReader::DecompressMemory(MemoryEncodingFormat encoding_format,\n                                   const void* src, size_t src_size, void* dest,\n                                   size_t dest_size) {\n  switch (encoding_format) {\n    case MemoryEncodingFormat::kNone:\n      assert_true(src_size == dest_size);\n      std::memcpy(dest, src, src_size);\n      return true;\n    case MemoryEncodingFormat::kSnappy:\n      return snappy::RawUncompress(reinterpret_cast<const char*>(src), src_size,\n                                   reinterpret_cast<char*>(dest));\n    default:\n      assert_unhandled_case(encoding_format);\n      return false;\n  }\n}\n\n}  // namespace gpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/trace_reader.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_TRACE_READER_H_\n#define XENIA_GPU_TRACE_READER_H_\n\n#include <string_view>\n#include <vector>\n\n#include \"xenia/base/mapped_memory.h\"\n#include \"xenia/gpu/trace_protocol.h\"\n#include \"xenia/memory.h\"\n\nnamespace xe {\nnamespace gpu {\n\nclass TraceReader {\n public:\n  struct CommandBuffer {\n    struct Command {\n      enum class Type {\n        kCommand,\n        kBuffer,\n      };\n\n      Command() {}\n      Command(Command&& other) {\n        type = other.type;\n        command_id = other.command_id;\n        command_subtree = std::move(other.command_subtree);\n      }\n      Command(CommandBuffer* buf) {\n        type = Type::kBuffer;\n        command_subtree = std::unique_ptr<CommandBuffer>(buf);\n      }\n      Command(uint32_t id) {\n        type = Type::kCommand;\n        command_id = id;\n      }\n      ~Command() = default;\n\n      Type type;\n      uint32_t command_id = -1;\n      std::unique_ptr<CommandBuffer> command_subtree = nullptr;\n    };\n\n    CommandBuffer() {}\n    ~CommandBuffer() {}\n\n    // Parent command buffer, if one exists.\n    CommandBuffer* parent = nullptr;\n    std::vector<Command> commands;\n  };\n\n  struct Frame {\n    struct Command {\n      enum class Type {\n        kDraw,\n        kSwap,\n      };\n      const uint8_t* head_ptr;\n      const uint8_t* start_ptr;\n      const uint8_t* end_ptr;\n      Type type;\n      union {\n        struct {\n          //\n        } draw;\n        struct {\n          //\n        } swap;\n      };\n    };\n\n    const uint8_t* start_ptr = nullptr;\n    const uint8_t* end_ptr = nullptr;\n    int command_count = 0;\n\n    // Flat list of all commands in this frame.\n    std::vector<Command> commands;\n\n    // Tree of all command buffers\n    std::unique_ptr<CommandBuffer> command_tree;\n  };\n\n  TraceReader() = default;\n  virtual ~TraceReader() = default;\n\n  const TraceHeader* header() const {\n    return reinterpret_cast<const TraceHeader*>(trace_data_);\n  }\n\n  const Frame* frame(int n) const { return &frames_[n]; }\n  int frame_count() const { return int(frames_.size()); }\n\n  bool Open(const std::string_view path);\n\n  void Close();\n\n protected:\n  void ParseTrace();\n  bool DecompressMemory(MemoryEncodingFormat encoding_format, const void* src,\n                        size_t src_size, void* dest, size_t dest_size);\n\n  std::unique_ptr<MappedMemory> mmap_;\n  const uint8_t* trace_data_ = nullptr;\n  size_t trace_size_ = 0;\n  std::vector<Frame> frames_;\n};\n\n}  // namespace gpu\n}  // namespace xe\n\n#endif  // XENIA_GPU_TRACE_READER_H_\n"
  },
  {
    "path": "src/xenia/gpu/trace_viewer.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/trace_viewer.h\"\n\n#include <cinttypes>\n#include <string>\n\n#include \"third_party/half/include/half.hpp\"\n#include \"third_party/imgui/imgui.h\"\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/clock.h\"\n#include \"xenia/base/filesystem.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/memory.h\"\n#include \"xenia/base/platform.h\"\n#include \"xenia/base/string.h\"\n#include \"xenia/base/system.h\"\n#include \"xenia/base/threading.h\"\n#include \"xenia/gpu/command_processor.h\"\n#include \"xenia/gpu/gpu_flags.h\"\n#include \"xenia/gpu/graphics_system.h\"\n#include \"xenia/gpu/packet_disassembler.h\"\n#include \"xenia/gpu/register_file.h\"\n#include \"xenia/gpu/sampler_info.h\"\n#include \"xenia/gpu/texture_info.h\"\n#include \"xenia/memory.h\"\n#include \"xenia/ui/file_picker.h\"\n#include \"xenia/ui/imgui_drawer.h\"\n#include \"xenia/ui/immediate_drawer.h\"\n#include \"xenia/ui/presenter.h\"\n#include \"xenia/ui/ui_event.h\"\n#include \"xenia/ui/virtual_key.h\"\n#include \"xenia/ui/window.h\"\n#include \"xenia/ui/windowed_app_context.h\"\n#include \"xenia/xbox.h\"\n\nDEFINE_string(target_trace_file, \"\", \"Specifies the trace file to load.\",\n              \"GPU\");\n\nnamespace xe {\nnamespace gpu {\n\nusing namespace xe::gpu::xenos;\n\nstatic const ImVec4 kColorError =\n    ImVec4(255 / 255.0f, 0 / 255.0f, 0 / 255.0f, 255 / 255.0f);\nstatic const ImVec4 kColorComment =\n    ImVec4(42 / 255.0f, 179 / 255.0f, 0 / 255.0f, 255 / 255.0f);\nstatic const ImVec4 kColorIgnored =\n    ImVec4(100 / 255.0f, 100 / 255.0f, 100 / 255.0f, 255 / 255.0f);\n\nTraceViewer::TraceViewer(xe::ui::WindowedAppContext& app_context,\n                         const std::string_view name)\n    : xe::ui::WindowedApp(app_context, name, \"some.trace\"),\n      window_listener_(*this) {\n  AddPositionalOption(\"target_trace_file\");\n}\n\nTraceViewer::~TraceViewer() = default;\n\nbool TraceViewer::OnInitialize() {\n  std::string path = cvars::target_trace_file;\n\n  // If no path passed, ask the user.\n  // On Android, however, there's no synchronous file picker, and the trace file\n  // must be picked externally and provided to the trace viewer activity via the\n  // intent.\n#if !XE_PLATFORM_ANDROID\n  if (path.empty()) {\n    auto file_picker = xe::ui::FilePicker::Create();\n    file_picker->set_mode(ui::FilePicker::Mode::kOpen);\n    file_picker->set_type(ui::FilePicker::Type::kFile);\n    file_picker->set_multi_selection(false);\n    file_picker->set_title(\"Select Trace File\");\n    file_picker->set_extensions({\n        {\"Supported Files\", \"*.xtr\"},\n        {\"All Files (*.*)\", \"*.*\"},\n    });\n    if (file_picker->Show()) {\n      auto selected_files = file_picker->selected_files();\n      if (!selected_files.empty()) {\n        path = xe::path_to_utf8(selected_files[0]);\n      }\n    }\n  }\n#endif  // !XE_PLATFORM_ANDROID\n\n  if (path.empty()) {\n    xe::ShowSimpleMessageBox(xe::SimpleMessageBoxType::Warning,\n                             \"No trace file specified\");\n    return false;\n  }\n\n  if (!Setup()) {\n    xe::ShowSimpleMessageBox(xe::SimpleMessageBoxType::Error,\n                             \"Unable to setup trace viewer\");\n    return false;\n  }\n  if (!Load(path)) {\n    xe::ShowSimpleMessageBox(xe::SimpleMessageBoxType::Error,\n                             \"Unable to load trace file; not found?\");\n    return false;\n  }\n  return true;\n}\n\nbool TraceViewer::Setup() {\n  enum : size_t {\n    kZOrderImGui,\n    kZOrderTraceViewerInput,\n  };\n\n  // Main display window.\n  assert_true(app_context().IsInUIThread());\n  window_ = xe::ui::Window::Create(app_context(), \"xenia-gpu-trace-viewer\",\n                                   1920, 1080);\n  window_->AddListener(&window_listener_);\n  window_->AddInputListener(&window_listener_, kZOrderTraceViewerInput);\n  if (!window_->Open()) {\n    XELOGE(\"Failed to open the main window\");\n    return false;\n  }\n\n  // Create the emulator but don't initialize so we can setup the window.\n  emulator_ = std::make_unique<Emulator>(\"\", \"\", \"\", \"\");\n  X_STATUS result = emulator_->Setup(\n      window_.get(), nullptr, false, nullptr,\n      [this]() { return CreateGraphicsSystem(); }, nullptr);\n  if (XFAILED(result)) {\n    XELOGE(\"Failed to setup emulator: {:08X}\", result);\n    return false;\n  }\n  memory_ = emulator_->memory();\n  graphics_system_ = emulator_->graphics_system();\n\n  player_ = std::make_unique<TracePlayer>(graphics_system_);\n\n  // Setup drawing to the window.\n  ui::Presenter* presenter = graphics_system_->presenter();\n  if (!presenter) {\n    XELOGE(\"Failed to initialize the presenter\");\n    return false;\n  }\n  xe::ui::GraphicsProvider& graphics_provider = *graphics_system_->provider();\n  immediate_drawer_ = graphics_provider.CreateImmediateDrawer();\n  if (!immediate_drawer_) {\n    XELOGE(\"Failed to initialize the immediate drawer\");\n    return false;\n  }\n  immediate_drawer_->SetPresenter(presenter);\n  imgui_drawer_ =\n      std::make_unique<xe::ui::ImGuiDrawer>(window_.get(), kZOrderImGui);\n  imgui_drawer_->SetPresenterAndImmediateDrawer(presenter,\n                                                immediate_drawer_.get());\n  trace_viewer_dialog_ = std::unique_ptr<TraceViewerDialog>(\n      new TraceViewerDialog(imgui_drawer_.get(), *this));\n  window_->SetPresenter(presenter);\n\n  return true;\n}\n\nvoid TraceViewer::TraceViewerWindowListener::OnClosing(xe::ui::UIEvent& e) {\n  trace_viewer_.app_context().QuitFromUIThread();\n}\n\nvoid TraceViewer::TraceViewerWindowListener::OnKeyDown(xe::ui::KeyEvent& e) {\n  switch (e.virtual_key()) {\n    case xe::ui::VirtualKey::kF5:\n      trace_viewer_.graphics_system_->ClearCaches();\n      break;\n    default:\n      return;\n  }\n  e.set_handled(true);\n}\n\nvoid TraceViewer::TraceViewerDialog::OnDraw(ImGuiIO& io) {\n  trace_viewer_.DrawUI();\n}\n\nbool TraceViewer::Load(const std::string_view trace_file_path) {\n  window_->SetTitle(\"Xenia GPU Trace Viewer: \" + std::string(trace_file_path));\n\n  if (!player_->Open(trace_file_path)) {\n    XELOGE(\"Could not load trace file\");\n    return false;\n  }\n\n  return true;\n}\n\nvoid TraceViewer::DrawMultilineString(const std::string_view str) {\n  size_t i = 0;\n  bool done = false;\n  while (!done && i < str.size()) {\n    size_t next_i = str.find('\\n', i);\n    if (next_i == std::string::npos) {\n      done = true;\n      next_i = str.size() - 1;\n    }\n    auto line = str.substr(i, next_i - i);\n    ImGui::Text(\"%s\", std::string(line).c_str());\n    i = next_i + 1;\n  }\n}\n\nvoid TraceViewer::DrawUI() {\n  // ImGui::ShowDemoWindow();\n\n  DrawControllerUI();\n  DrawCommandListUI();\n  DrawStateUI();\n  DrawPacketDisassemblerUI();\n}\n\nvoid TraceViewer::DrawControllerUI() {\n  ImGui::SetNextWindowPos(ImVec2(5, 5), ImGuiCond_FirstUseEver);\n  ImGui::SetNextWindowSize(ImVec2(340, 60));\n  ImGui::SetNextWindowBgAlpha(kWindowBgAlpha);\n  if (!ImGui::Begin(\"Controller\", nullptr)) {\n    ImGui::End();\n    return;\n  }\n\n  int target_frame = player_->current_frame_index();\n  if (ImGui::Button(\"|<<\")) {\n    target_frame = 0;\n  }\n  if (ImGui::IsItemHovered()) {\n    ImGui::SetTooltip(\"Reset to first frame\");\n  }\n  ImGui::SameLine();\n  ImGui::PushButtonRepeat(true);\n  if (ImGui::Button(\">>\", ImVec2(0, 0))) {\n    if (target_frame + 1 < player_->frame_count()) {\n      ++target_frame;\n    }\n  }\n  ImGui::PopButtonRepeat();\n  if (ImGui::IsItemHovered()) {\n    ImGui::SetTooltip(\"Next frame (hold for continuous)\");\n  }\n  ImGui::SameLine();\n  if (ImGui::Button(\">>|\")) {\n    target_frame = player_->frame_count() - 1;\n  }\n  if (ImGui::IsItemHovered()) {\n    ImGui::SetTooltip(\"Skip to last frame\");\n  }\n  if (player_->is_playing_trace()) {\n    // Don't allow the user to change the frame index just yet...\n    // TODO: Find a way to disable the slider below.\n    target_frame = player_->current_frame_index();\n  }\n\n  ImGui::SameLine();\n  ImGui::SliderInt(\"##\", &target_frame, 0, player_->frame_count() - 1);\n  if (target_frame != player_->current_frame_index() &&\n      !player_->is_playing_trace()) {\n    player_->SeekFrame(target_frame);\n  }\n  ImGui::End();\n}\n\nvoid TraceViewer::DrawPacketDisassemblerUI() {\n  ImGui::SetNextWindowCollapsed(true, ImGuiCond_FirstUseEver);\n  ImGui::SetNextWindowPos(\n      ImVec2(float(window_->GetActualLogicalWidth()) - 500 - 5, 5),\n      ImGuiCond_FirstUseEver);\n  ImGui::SetNextWindowSize(ImVec2(500, 300));\n  ImGui::SetNextWindowBgAlpha(kWindowBgAlpha);\n  if (!ImGui::Begin(\"Packet Disassembler\", nullptr)) {\n    ImGui::End();\n    return;\n  }\n  if (!player_->current_frame() || player_->current_command_index() == -1) {\n    ImGui::Text(\"No frame/command selected\");\n    ImGui::End();\n    return;\n  }\n\n  auto frame = player_->current_frame();\n  const auto& command = frame->commands[player_->current_command_index()];\n  const uint8_t* start_ptr = command.start_ptr;\n  const uint8_t* end_ptr = command.end_ptr;\n\n  ImGui::Text(\"Frame #%d, command %d\", player_->current_frame_index(),\n              player_->current_command_index());\n  ImGui::Separator();\n  ImGui::BeginChild(\"packet_disassembler_list\");\n  const PacketStartCommand* pending_packet = nullptr;\n  auto trace_ptr = start_ptr;\n  while (trace_ptr < end_ptr) {\n    auto type = static_cast<TraceCommandType>(xe::load<uint32_t>(trace_ptr));\n    switch (type) {\n      case TraceCommandType::kPrimaryBufferStart: {\n        auto cmd =\n            reinterpret_cast<const PrimaryBufferStartCommand*>(trace_ptr);\n        trace_ptr += sizeof(*cmd) + cmd->count * 4;\n        ImGui::BulletText(\"PrimaryBufferStart\");\n        break;\n      }\n      case TraceCommandType::kPrimaryBufferEnd: {\n        auto cmd = reinterpret_cast<const PrimaryBufferEndCommand*>(trace_ptr);\n        trace_ptr += sizeof(*cmd);\n        ImGui::BulletText(\"PrimaryBufferEnd\");\n        break;\n      }\n      case TraceCommandType::kIndirectBufferStart: {\n        auto cmd =\n            reinterpret_cast<const IndirectBufferStartCommand*>(trace_ptr);\n        trace_ptr += sizeof(*cmd) + cmd->count * 4;\n        ImGui::BulletText(\"IndirectBufferStart\");\n        break;\n      }\n      case TraceCommandType::kIndirectBufferEnd: {\n        auto cmd = reinterpret_cast<const IndirectBufferEndCommand*>(trace_ptr);\n        trace_ptr += sizeof(*cmd);\n        ImGui::BulletText(\"IndirectBufferEnd\");\n        break;\n      }\n      case TraceCommandType::kPacketStart: {\n        auto cmd = reinterpret_cast<const PacketStartCommand*>(trace_ptr);\n        trace_ptr += sizeof(*cmd) + cmd->count * 4;\n        pending_packet = cmd;\n        break;\n      }\n      case TraceCommandType::kPacketEnd: {\n        auto cmd = reinterpret_cast<const PacketEndCommand*>(trace_ptr);\n        trace_ptr += sizeof(*cmd);\n        if (pending_packet) {\n          PacketInfo packet_info = {0};\n          if (PacketDisassembler::DisasmPacket(\n                  reinterpret_cast<const uint8_t*>(pending_packet) +\n                      sizeof(PacketStartCommand),\n                  &packet_info)) {\n            if (packet_info.predicated) {\n              ImGui::PushStyleColor(ImGuiCol_Text, kColorIgnored);\n            }\n            ImGui::BulletText(\"%s\", packet_info.type_info->name);\n            ImGui::TreePush((const char*)0);\n            for (auto action : packet_info.actions) {\n              switch (action.type) {\n                case PacketAction::Type::kRegisterWrite: {\n                  auto register_info = xe::gpu::RegisterFile::GetRegisterInfo(\n                      action.register_write.index);\n                  ImGui::Columns(2);\n                  ImGui::Text(\"%.4X %s\", action.register_write.index,\n                              register_info ? register_info->name : \"???\");\n                  ImGui::NextColumn();\n                  if (!register_info ||\n                      register_info->type == RegisterInfo::Type::kDword) {\n                    ImGui::Text(\"%.8X\", action.register_write.value);\n                  } else {\n                    ImGui::Text(\"%8f\", xe::memory::Reinterpret<float>(\n                                           action.register_write.value));\n                  }\n                  ImGui::Columns(1);\n                  break;\n                }\n                case PacketAction::Type::kSetBinMask: {\n                  ImGui::Text(\"%.16\" PRIX64, action.set_bin_mask.value);\n                  break;\n                }\n                case PacketAction::Type::kSetBinSelect: {\n                  ImGui::Text(\"%.16\" PRIX64, action.set_bin_select.value);\n                  break;\n                }\n              }\n            }\n            ImGui::TreePop();\n            if (packet_info.predicated) {\n              ImGui::PopStyleColor();\n            }\n          } else {\n            ImGui::BulletText(\"<invalid packet>\");\n          }\n          pending_packet = nullptr;\n        }\n        break;\n      }\n      case TraceCommandType::kMemoryRead: {\n        auto cmd = reinterpret_cast<const MemoryCommand*>(trace_ptr);\n        trace_ptr += sizeof(*cmd) + cmd->encoded_length;\n        // ImGui::BulletText(\"MemoryRead\");\n        break;\n      }\n      case TraceCommandType::kMemoryWrite: {\n        auto cmd = reinterpret_cast<const MemoryCommand*>(trace_ptr);\n        trace_ptr += sizeof(*cmd) + cmd->encoded_length;\n        // ImGui::BulletText(\"MemoryWrite\");\n        break;\n      }\n      case TraceCommandType::kEdramSnapshot: {\n        auto cmd = reinterpret_cast<const EdramSnapshotCommand*>(trace_ptr);\n        trace_ptr += sizeof(*cmd) + cmd->encoded_length;\n        // ImGui::BulletText(\"EdramSnapshot\");\n        break;\n      }\n      case TraceCommandType::kEvent: {\n        auto cmd = reinterpret_cast<const EventCommand*>(trace_ptr);\n        trace_ptr += sizeof(*cmd);\n        switch (cmd->event_type) {\n          case EventCommand::Type::kSwap: {\n            ImGui::BulletText(\"<swap>\");\n            break;\n          }\n        }\n        break;\n      }\n      case TraceCommandType::kRegisters: {\n        auto cmd = reinterpret_cast<const RegistersCommand*>(trace_ptr);\n        trace_ptr += sizeof(*cmd) + cmd->encoded_length;\n        // ImGui::BulletText(\"Registers\");\n        break;\n      }\n      case TraceCommandType::kGammaRamp: {\n        auto cmd = reinterpret_cast<const GammaRampCommand*>(trace_ptr);\n        trace_ptr += sizeof(*cmd) + cmd->encoded_length;\n        // ImGui::BulletText(\"GammaRamp\");\n        break;\n      }\n    }\n  }\n  ImGui::EndChild();\n  ImGui::End();\n}\n\nint TraceViewer::RecursiveDrawCommandBufferUI(\n    const TraceReader::Frame* frame, TraceReader::CommandBuffer* buffer) {\n  int selected_id = -1;\n  int column_width = int(ImGui::GetContentRegionMax().x);\n\n  for (size_t i = 0; i < buffer->commands.size(); i++) {\n    switch (buffer->commands[i].type) {\n      case TraceReader::CommandBuffer::Command::Type::kBuffer: {\n        auto subtree = buffer->commands[i].command_subtree.get();\n        if (!subtree->commands.size()) {\n          continue;\n        }\n\n        ImGui::PushID(int(i));\n        if (ImGui::TreeNode((void*)0, \"Indirect Buffer %\" PRIu64, i)) {\n          ImGui::Indent();\n          auto id = RecursiveDrawCommandBufferUI(\n              frame, buffer->commands[i].command_subtree.get());\n          ImGui::Unindent();\n          ImGui::TreePop();\n\n          if (id != -1) {\n            selected_id = id;\n          }\n        }\n        ImGui::PopID();\n      } break;\n\n      case TraceReader::CommandBuffer::Command::Type::kCommand: {\n        uint32_t command_id = buffer->commands[i].command_id;\n\n        const auto& command = frame->commands[command_id];\n        bool is_selected = command_id == player_->current_command_index();\n        const char* label;\n        switch (command.type) {\n          case TraceReader::Frame::Command::Type::kDraw:\n            label = \"Draw\";\n            break;\n          case TraceReader::Frame::Command::Type::kSwap:\n            label = \"Swap\";\n            break;\n        }\n\n        ImGui::PushID(command_id);\n        if (ImGui::Selectable(label, &is_selected)) {\n          selected_id = command_id;\n        }\n        ImGui::SameLine(column_width - 60.0f);\n        ImGui::Text(\"%d\", command_id);\n        ImGui::PopID();\n        // if (did_seek && target_command == i) {\n        //   ImGui::SetScrollPosHere();\n        // }\n      } break;\n    }\n  }\n\n  return selected_id;\n}\n\nvoid TraceViewer::DrawCommandListUI() {\n  ImGui::SetNextWindowPos(ImVec2(5, 70), ImGuiCond_FirstUseEver);\n  ImGui::SetNextWindowSize(ImVec2(200, 640));\n  ImGui::SetNextWindowBgAlpha(kWindowBgAlpha);\n  if (!ImGui::Begin(\"Command List\", nullptr)) {\n    ImGui::End();\n    return;\n  }\n\n  static const TracePlayer::Frame* previous_frame = nullptr;\n  auto frame = player_->current_frame();\n  if (!frame) {\n    ImGui::End();\n    return;\n  }\n  bool did_seek = false;\n  if (previous_frame != frame) {\n    did_seek = true;\n    previous_frame = frame;\n  }\n  int command_count = int(frame->commands.size());\n  int target_command = player_->current_command_index();\n  int column_width = int(ImGui::GetContentRegionMax().x);\n  ImGui::Text(\"Frame #%d\", player_->current_frame_index());\n  ImGui::Separator();\n  if (ImGui::Button(\"reset\")) {\n    target_command = -1;\n  }\n  if (ImGui::IsItemHovered()) {\n    ImGui::SetTooltip(\"Reset to before any frame commands\");\n  }\n  ImGui::SameLine();\n  ImGui::PushButtonRepeat(true);\n  if (ImGui::Button(\"prev\", ImVec2(0, 0))) {\n    if (target_command >= 0) {\n      --target_command;\n    }\n  }\n  if (ImGui::IsItemHovered()) {\n    ImGui::SetTooltip(\"Move to the previous command (hold)\");\n  }\n  ImGui::SameLine();\n  if (ImGui::Button(\"next\", ImVec2(0, 0))) {\n    if (target_command < command_count - 1) {\n      ++target_command;\n    }\n  }\n  if (ImGui::IsItemHovered()) {\n    ImGui::SetTooltip(\"Move to the next command (hold)\");\n  }\n  ImGui::PopButtonRepeat();\n  ImGui::SameLine();\n  if (ImGui::Button(\"end\")) {\n    target_command = command_count - 1;\n  }\n  if (ImGui::IsItemHovered()) {\n    ImGui::SetTooltip(\"Move to the last command\");\n  }\n  if (player_->is_playing_trace()) {\n    // Don't allow the user to change the command index just yet...\n    // TODO: Find a way to disable the slider below.\n    target_command = player_->current_command_index();\n  }\n\n  ImGui::PushItemWidth(float(column_width - 15));\n  ImGui::SliderInt(\"##\", &target_command, -1, command_count - 1);\n  ImGui::PopItemWidth();\n\n  if (target_command != player_->current_command_index() &&\n      !player_->is_playing_trace()) {\n    did_seek = true;\n    player_->SeekCommand(target_command);\n  }\n  ImGui::Separator();\n  ImGui::BeginChild(\"command_list\");\n  ImGui::PushID(-1);\n  bool is_selected = player_->current_command_index() == -1;\n  if (ImGui::Selectable(\"<start>\", &is_selected)) {\n    player_->SeekCommand(-1);\n  }\n  ImGui::PopID();\n  if (did_seek && target_command == -1) {\n    ImGui::SetScrollHereY(0.5f);\n  }\n\n  auto id = RecursiveDrawCommandBufferUI(frame, frame->command_tree.get());\n  if (id != -1 && id != player_->current_command_index() &&\n      !player_->is_playing_trace()) {\n    player_->SeekCommand(id);\n  }\n\n  ImGui::EndChild();\n  ImGui::End();\n}\n\nTraceViewer::ShaderDisplayType TraceViewer::DrawShaderTypeUI() {\n  static ShaderDisplayType shader_display_type = ShaderDisplayType::kUcode;\n  ImGui::RadioButton(\"ucode\", reinterpret_cast<int*>(&shader_display_type),\n                     static_cast<int>(ShaderDisplayType::kUcode));\n  ImGui::SameLine();\n  ImGui::RadioButton(\"translated\", reinterpret_cast<int*>(&shader_display_type),\n                     static_cast<int>(ShaderDisplayType::kTranslated));\n  ImGui::SameLine();\n  ImGui::RadioButton(\"disasm\", reinterpret_cast<int*>(&shader_display_type),\n                     static_cast<int>(ShaderDisplayType::kHostDisasm));\n  return shader_display_type;\n}\n\nvoid TraceViewer::DrawShaderUI(Shader* shader, ShaderDisplayType display_type) {\n  // Must be prepared for advanced display modes.\n  // FIXME(Triang3l): This should display the actual translation used in the\n  // draw, but it may depend on multiple backend-related factors, including\n  // drawing multiple times with multiple modifications, even depending on\n  // values obtained during translation of other modifications (for instance,\n  // a memexporting shader can be executed both as a vertex shader (to draw the\n  // points) and as a compute shader (to actually export) if the host doesn't\n  // support writes from vertex shaders.\n  const Shader::Translation* translation = nullptr;\n  if (display_type != ShaderDisplayType::kUcode) {\n    for (const auto& translation_pair : shader->translations()) {\n      if (translation_pair.second->is_valid()) {\n        translation = translation_pair.second;\n      }\n    }\n    if (!translation) {\n      ImGui::TextColored(kColorError,\n                         \"ERROR: shader error during parsing/translation\");\n      return;\n    }\n  }\n\n  switch (display_type) {\n    case ShaderDisplayType::kUcode: {\n      DrawMultilineString(shader->ucode_disassembly());\n      break;\n    }\n    case ShaderDisplayType::kTranslated: {\n      const auto& str = translation->GetTranslatedBinaryString();\n      size_t i = 0;\n      bool done = false;\n      while (!done && i < str.size()) {\n        size_t next_i = str.find('\\n', i);\n        if (next_i == std::string::npos) {\n          done = true;\n          next_i = str.size() - 1;\n        }\n        auto line = str.substr(i, next_i - i);\n        if (line.find(\"//\") != std::string::npos) {\n          ImGui::TextColored(kColorComment, \"%s\", line.c_str());\n        } else {\n          ImGui::Text(\"%s\", line.c_str());\n        }\n        i = next_i + 1;\n      }\n      break;\n    }\n    case ShaderDisplayType::kHostDisasm: {\n      DrawMultilineString(translation->host_disassembly());\n      break;\n    }\n  }\n}\n\n// glBlendEquationSeparatei(i, blend_op, blend_op_alpha);\n// glBlendFuncSeparatei(i, src_blend, dest_blend, src_blend_alpha,\n//  dest_blend_alpha);\nvoid TraceViewer::DrawBlendMode(uint32_t src_blend, uint32_t dest_blend,\n                                uint32_t blend_op) {\n  static const char* kBlendNames[] = {\n      /*  0 */ \"ZERO\",\n      /*  1 */ \"ONE\",\n      /*  2 */ \"UNK2\",  // ?\n      /*  3 */ \"UNK3\",  // ?\n      /*  4 */ \"SRC_COLOR\",\n      /*  5 */ \"ONE_MINUS_SRC_COLOR\",\n      /*  6 */ \"SRC_ALPHA\",\n      /*  7 */ \"ONE_MINUS_SRC_ALPHA\",\n      /*  8 */ \"DST_COLOR\",\n      /*  9 */ \"ONE_MINUS_DST_COLOR\",\n      /* 10 */ \"DST_ALPHA\",\n      /* 11 */ \"ONE_MINUS_DST_ALPHA\",\n      /* 12 */ \"CONSTANT_COLOR\",\n      /* 13 */ \"ONE_MINUS_CONSTANT_COLOR\",\n      /* 14 */ \"CONSTANT_ALPHA\",\n      /* 15 */ \"ONE_MINUS_CONSTANT_ALPHA\",\n      /* 16 */ \"SRC_ALPHA_SATURATE\",\n  };\n  const char* src_str = kBlendNames[src_blend];\n  const char* dest_str = kBlendNames[dest_blend];\n  const char* op_template;\n  switch (blend_op) {\n    case 0:  // add\n      op_template = \"%s + %s\";\n      break;\n    case 1:  // subtract\n      op_template = \"%s - %s\";\n      break;\n    case 2:  // min\n      op_template = \"min(%s, %s)\";\n      break;\n    case 3:  // max\n      op_template = \"max(%s, %s)\";\n      break;\n    case 4:  // reverse subtract\n      op_template = \"-(%s) + %s\";\n      break;\n    default:\n      op_template = \"%s ? %s\";\n      break;\n  }\n  ImGui::Text(op_template, src_str, dest_str);\n}\n\nvoid TraceViewer::DrawTextureInfo(\n    const Shader::TextureBinding& texture_binding) {\n  auto& regs = *graphics_system_->register_file();\n\n  xenos::xe_gpu_texture_fetch_t fetch =\n      regs.GetTextureFetch(texture_binding.fetch_constant);\n  if (fetch.type != xenos::FetchConstantType::kTexture &&\n      (!cvars::gpu_allow_invalid_fetch_constants ||\n       fetch.type != xenos::FetchConstantType::kInvalidTexture)) {\n    DrawFailedTextureInfo(texture_binding, \"Invalid fetch type\");\n    return;\n  }\n  TextureInfo texture_info;\n  if (!TextureInfo::Prepare(fetch, &texture_info)) {\n    DrawFailedTextureInfo(texture_binding,\n                          \"Unable to parse texture fetcher info\");\n    return;\n  }\n  SamplerInfo sampler_info;\n  if (!SamplerInfo::Prepare(fetch, texture_binding.fetch_instr,\n                            &sampler_info)) {\n    DrawFailedTextureInfo(texture_binding, \"Unable to parse sampler info\");\n    return;\n  }\n  auto texture = GetTextureEntry(texture_info, sampler_info);\n\n  ImGui::Columns(2);\n  if (texture) {\n    ImVec2 button_size(256, 256);\n    if (ImGui::ImageButton(\"#texture_info_image\", ImTextureID(texture),\n                           button_size, ImVec2(0, 0), ImVec2(1, 1))) {\n      // show viewer\n    }\n  } else {\n    DrawFailedTextureInfo(texture_binding, \"Failed to demand texture\");\n  }\n  ImGui::NextColumn();\n  ImGui::Text(\"Fetch Slot: %u\", texture_binding.fetch_constant);\n  ImGui::Text(\"Guest Address: %.8X\", texture_info.memory.base_address);\n  ImGui::Text(\"Format: %s\", texture_info.format_info()->name);\n  switch (texture_info.dimension) {\n    case xenos::DataDimension::k1D:\n      ImGui::Text(\"1D: %dpx\", texture_info.width + 1);\n      break;\n    case xenos::DataDimension::k2DOrStacked:\n      ImGui::Text(\"2D: %dx%dpx\", texture_info.width + 1,\n                  texture_info.height + 1);\n      break;\n    case xenos::DataDimension::k3D:\n      ImGui::Text(\"3D: %dx%dx%dpx\", texture_info.width + 1,\n                  texture_info.height + 1, texture_info.depth + 1);\n      break;\n    case xenos::DataDimension::kCube:\n      ImGui::Text(\"Cube: ?\");\n      break;\n  }\n  static const char* kSwizzleMap[] = {\"R\", \"G\", \"B\", \"A\", \"0\", \"1\"};\n  ImGui::Text(\"Swizzle: %s%s%s%s\", kSwizzleMap[(fetch.swizzle >> 0) & 0x7],\n              kSwizzleMap[(fetch.swizzle >> 3) & 0x7],\n              kSwizzleMap[(fetch.swizzle >> 6) & 0x7],\n              kSwizzleMap[(fetch.swizzle >> 9) & 0x7]);\n\n  ImGui::Columns(1);\n}\n\nvoid TraceViewer::DrawFailedTextureInfo(\n    const Shader::TextureBinding& texture_binding, const char* message) {\n  // TODO(benvanik): better error info/etc.\n  ImGui::TextColored(kColorError, \"ERROR: %s\", message);\n}\n\nvoid TraceViewer::DrawVertexFetcher(Shader* shader,\n                                    const Shader::VertexBinding& vertex_binding,\n                                    const xe_gpu_vertex_fetch_t& fetch) {\n  const uint8_t* addr = memory_->TranslatePhysical(fetch.address << 2);\n  uint32_t vertex_count = fetch.size / vertex_binding.stride_words;\n  int column_count = 0;\n  for (const auto& attrib : vertex_binding.attributes) {\n    switch (attrib.fetch_instr.attributes.data_format) {\n      case xenos::VertexFormat::k_32:\n      case xenos::VertexFormat::k_32_FLOAT:\n        ++column_count;\n        break;\n      case xenos::VertexFormat::k_16_16:\n      case xenos::VertexFormat::k_16_16_FLOAT:\n      case xenos::VertexFormat::k_32_32:\n      case xenos::VertexFormat::k_32_32_FLOAT:\n        column_count += 2;\n        break;\n      case xenos::VertexFormat::k_10_11_11:\n      case xenos::VertexFormat::k_11_11_10:\n      case xenos::VertexFormat::k_32_32_32_FLOAT:\n        column_count += 3;\n        break;\n      case xenos::VertexFormat::k_8_8_8_8:\n        ++column_count;\n        break;\n      case xenos::VertexFormat::k_2_10_10_10:\n      case xenos::VertexFormat::k_16_16_16_16:\n      case xenos::VertexFormat::k_32_32_32_32:\n      case xenos::VertexFormat::k_16_16_16_16_FLOAT:\n      case xenos::VertexFormat::k_32_32_32_32_FLOAT:\n        column_count += 4;\n        break;\n      case xenos::VertexFormat::kUndefined:\n        assert_unhandled_case(attrib.fetch_instr.attributes.data_format);\n        break;\n    }\n  }\n  ImGui::BeginChild(\"#indices\", ImVec2(0, 300));\n  ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(10, 0));\n  int display_start, display_end;\n  ImGui::CalcListClipping(vertex_count, ImGui::GetTextLineHeight(),\n                          &display_start, &display_end);\n  ImGui::Dummy(ImVec2(0, (display_start)*ImGui::GetTextLineHeight()));\n  ImGui::Columns(column_count);\n  if (display_start <= 1) {\n    for (size_t el_index = 0; el_index < vertex_binding.attributes.size();\n         ++el_index) {\n      const auto& attrib = vertex_binding.attributes[el_index];\n      switch (attrib.fetch_instr.attributes.data_format) {\n        case xenos::VertexFormat::k_32:\n        case xenos::VertexFormat::k_32_FLOAT:\n          ImGui::Text(\"e%\" PRId64 \".x\", el_index);\n          ImGui::NextColumn();\n          break;\n        case xenos::VertexFormat::k_16_16:\n        case xenos::VertexFormat::k_16_16_FLOAT:\n        case xenos::VertexFormat::k_32_32:\n        case xenos::VertexFormat::k_32_32_FLOAT:\n          ImGui::Text(\"e%\" PRId64 \".x\", el_index);\n          ImGui::NextColumn();\n          ImGui::Text(\"e%\" PRId64 \".y\", el_index);\n          ImGui::NextColumn();\n          break;\n        case xenos::VertexFormat::k_10_11_11:\n        case xenos::VertexFormat::k_11_11_10:\n        case xenos::VertexFormat::k_32_32_32_FLOAT:\n          ImGui::Text(\"e%\" PRId64 \".x\", el_index);\n          ImGui::NextColumn();\n          ImGui::Text(\"e%\" PRId64 \".y\", el_index);\n          ImGui::NextColumn();\n          ImGui::Text(\"e%\" PRId64 \".z\", el_index);\n          ImGui::NextColumn();\n          break;\n        case xenos::VertexFormat::k_8_8_8_8:\n          ImGui::Text(\"e%\" PRId64 \".xyzw\", el_index);\n          ImGui::NextColumn();\n          break;\n        case xenos::VertexFormat::k_2_10_10_10:\n        case xenos::VertexFormat::k_16_16_16_16:\n        case xenos::VertexFormat::k_32_32_32_32:\n        case xenos::VertexFormat::k_16_16_16_16_FLOAT:\n        case xenos::VertexFormat::k_32_32_32_32_FLOAT:\n          ImGui::Text(\"e%\" PRId64 \".x\", el_index);\n          ImGui::NextColumn();\n          ImGui::Text(\"e%\" PRId64 \".y\", el_index);\n          ImGui::NextColumn();\n          ImGui::Text(\"e%\" PRId64 \".z\", el_index);\n          ImGui::NextColumn();\n          ImGui::Text(\"e%\" PRId64 \".w\", el_index);\n          ImGui::NextColumn();\n          break;\n        case xenos::VertexFormat::kUndefined:\n          assert_unhandled_case(attrib.fetch_instr.attributes.data_format);\n          break;\n      }\n    }\n    ImGui::Separator();\n  }\n  for (int i = display_start; i < display_end; ++i) {\n    const uint8_t* vstart = addr + i * vertex_binding.stride_words * 4;\n    for (const auto& attrib : vertex_binding.attributes) {\n#define LOADEL(type, wo)                                                   \\\n  GpuSwap(xe::load<type>(vstart +                                          \\\n                         (attrib.fetch_instr.attributes.offset + wo) * 4), \\\n          fetch.endian)\n      switch (attrib.fetch_instr.attributes.data_format) {\n        case xenos::VertexFormat::k_32:\n          ImGui::Text(\"%.8X\", LOADEL(uint32_t, 0));\n          ImGui::NextColumn();\n          break;\n        case xenos::VertexFormat::k_32_FLOAT:\n          ImGui::Text(\"%.3f\", LOADEL(float, 0));\n          ImGui::NextColumn();\n          break;\n        case xenos::VertexFormat::k_16_16: {\n          auto e0 = LOADEL(uint32_t, 0);\n          ImGui::Text(\"%.4X\", (e0 >> 16) & 0xFFFF);\n          ImGui::NextColumn();\n          ImGui::Text(\"%.4X\", (e0 >> 0) & 0xFFFF);\n          ImGui::NextColumn();\n        } break;\n        case xenos::VertexFormat::k_16_16_FLOAT: {\n          auto e0 = LOADEL(uint32_t, 0);\n          ImGui::Text(\"%.2f\",\n                      half_float::detail::half2float((e0 >> 16) & 0xFFFF));\n          ImGui::NextColumn();\n          ImGui::Text(\"%.2f\",\n                      half_float::detail::half2float((e0 >> 0) & 0xFFFF));\n          ImGui::NextColumn();\n        } break;\n        case xenos::VertexFormat::k_32_32:\n          ImGui::Text(\"%.8X\", LOADEL(uint32_t, 0));\n          ImGui::NextColumn();\n          ImGui::Text(\"%.8X\", LOADEL(uint32_t, 1));\n          ImGui::NextColumn();\n          break;\n        case xenos::VertexFormat::k_32_32_FLOAT:\n          ImGui::Text(\"%.3f\", LOADEL(float, 0));\n          ImGui::NextColumn();\n          ImGui::Text(\"%.3f\", LOADEL(float, 1));\n          ImGui::NextColumn();\n          break;\n        case xenos::VertexFormat::k_10_11_11:\n        case xenos::VertexFormat::k_11_11_10:\n          ImGui::Text(\"??\");\n          ImGui::NextColumn();\n          ImGui::Text(\"??\");\n          ImGui::NextColumn();\n          ImGui::Text(\"??\");\n          ImGui::NextColumn();\n          break;\n        case xenos::VertexFormat::k_32_32_32_FLOAT:\n          ImGui::Text(\"%.3f\", LOADEL(float, 0));\n          ImGui::NextColumn();\n          ImGui::Text(\"%.3f\", LOADEL(float, 1));\n          ImGui::NextColumn();\n          ImGui::Text(\"%.3f\", LOADEL(float, 2));\n          ImGui::NextColumn();\n          break;\n        case xenos::VertexFormat::k_8_8_8_8:\n          ImGui::Text(\"%.8X\", LOADEL(uint32_t, 0));\n          ImGui::NextColumn();\n          break;\n        case xenos::VertexFormat::k_2_10_10_10: {\n          auto e0 = LOADEL(uint32_t, 0);\n          ImGui::Text(\"??\");\n          ImGui::NextColumn();\n          ImGui::Text(\"??\");\n          ImGui::NextColumn();\n          ImGui::Text(\"??\");\n          ImGui::NextColumn();\n          ImGui::Text(\"??\");\n          ImGui::NextColumn();\n        } break;\n        case xenos::VertexFormat::k_16_16_16_16: {\n          auto e0 = LOADEL(uint32_t, 0);\n          auto e1 = LOADEL(uint32_t, 1);\n          ImGui::Text(\"%.4X\", (e0 >> 16) & 0xFFFF);\n          ImGui::NextColumn();\n          ImGui::Text(\"%.4X\", (e0 >> 0) & 0xFFFF);\n          ImGui::NextColumn();\n          ImGui::Text(\"%.4X\", (e1 >> 16) & 0xFFFF);\n          ImGui::NextColumn();\n          ImGui::Text(\"%.4X\", (e1 >> 0) & 0xFFFF);\n          ImGui::NextColumn();\n        } break;\n        case xenos::VertexFormat::k_32_32_32_32:\n          ImGui::Text(\"%.8X\", LOADEL(uint32_t, 0));\n          ImGui::NextColumn();\n          ImGui::Text(\"%.8X\", LOADEL(uint32_t, 1));\n          ImGui::NextColumn();\n          ImGui::Text(\"%.8X\", LOADEL(uint32_t, 2));\n          ImGui::NextColumn();\n          ImGui::Text(\"%.8X\", LOADEL(uint32_t, 3));\n          ImGui::NextColumn();\n          break;\n        case xenos::VertexFormat::k_16_16_16_16_FLOAT: {\n          auto e0 = LOADEL(uint32_t, 0);\n          auto e1 = LOADEL(uint32_t, 1);\n          ImGui::Text(\"%.2f\",\n                      half_float::detail::half2float((e0 >> 16) & 0xFFFF));\n          ImGui::NextColumn();\n          ImGui::Text(\"%.2f\",\n                      half_float::detail::half2float((e0 >> 0) & 0xFFFF));\n          ImGui::NextColumn();\n          ImGui::Text(\"%.2f\",\n                      half_float::detail::half2float((e1 >> 16) & 0xFFFF));\n          ImGui::NextColumn();\n          ImGui::Text(\"%.2f\",\n                      half_float::detail::half2float((e1 >> 0) & 0xFFFF));\n          ImGui::NextColumn();\n        } break;\n        case xenos::VertexFormat::k_32_32_32_32_FLOAT:\n          ImGui::Text(\"%.3f\", LOADEL(float, 0));\n          ImGui::NextColumn();\n          ImGui::Text(\"%.3f\", LOADEL(float, 1));\n          ImGui::NextColumn();\n          ImGui::Text(\"%.3f\", LOADEL(float, 2));\n          ImGui::NextColumn();\n          ImGui::Text(\"%.3f\", LOADEL(float, 3));\n          ImGui::NextColumn();\n          break;\n        case xenos::VertexFormat::kUndefined:\n          assert_unhandled_case(attrib.fetch_instr.attributes.data_format);\n          break;\n      }\n    }\n  }\n  ImGui::Columns(1);\n  ImGui::Dummy(\n      ImVec2(0, (vertex_count - display_end) * ImGui::GetTextLineHeight()));\n  ImGui::PopStyleVar();\n  ImGui::EndChild();\n}\n\nstatic const char* kCompareFuncNames[] = {\n    \"<false>\", \"<\", \"==\", \"<=\", \">\", \"!=\", \">=\", \"<true>\",\n};\nstatic const char* kStencilFuncNames[] = {\n    \"Keep\",\n    \"Zero\",\n    \"Replace\",\n    \"Increment and Wrap\",\n    \"Decrement and Wrap\",\n    \"Invert\",\n    \"Increment and Clamp\",\n    \"Decrement and Clamp\",\n};\nstatic const char* kIndexFormatNames[] = {\n    \"uint16\",\n    \"uint32\",\n};\nstatic const char* kEndiannessNames[] = {\n    \"unspecified endianness\",\n    \"8-in-16\",\n    \"8-in-32\",\n    \"16-in-32\",\n};\nstatic const char* kColorFormatNames[] = {\n    /* 0  */ \"k_8_8_8_8\",\n    /* 1  */ \"k_8_8_8_8_GAMMA\",\n    /* 2  */ \"k_2_10_10_10\",\n    /* 3  */ \"k_2_10_10_10_FLOAT\",\n    /* 4  */ \"k_16_16\",\n    /* 5  */ \"k_16_16_16_16\",\n    /* 6  */ \"k_16_16_FLOAT\",\n    /* 7  */ \"k_16_16_16_16_FLOAT\",\n    /* 8  */ \"unknown(8)\",\n    /* 9  */ \"unknown(9)\",\n    /* 10 */ \"k_2_10_10_10_AS_10_10_10_10\",\n    /* 11 */ \"unknown(11)\",\n    /* 12 */ \"k_2_10_10_10_FLOAT_AS_16_16_16_16\",\n    /* 13 */ \"unknown(13)\",\n    /* 14 */ \"k_32_FLOAT\",\n    /* 15 */ \"k_32_32_FLOAT\",\n};\nstatic const char* kDepthFormatNames[] = {\n    \"kD24S8\",\n    \"kD24FS8\",\n};\n\nvoid ProgressBar(float frac, float width, float height = 0,\n                 const ImVec4& color = ImVec4(0, 1, 0, 1),\n                 const ImVec4& border_color = ImVec4(0, 1, 0, 1)) {\n  if (height == 0) {\n    height = ImGui::GetTextLineHeightWithSpacing();\n  }\n  frac = xe::saturate(frac);\n\n  const auto fontAtlas = ImGui::GetIO().Fonts;\n\n  auto pos = ImGui::GetCursorScreenPos();\n  auto col = ImGui::ColorConvertFloat4ToU32(color);\n  auto border_col = ImGui::ColorConvertFloat4ToU32(border_color);\n\n  if (frac > 0) {\n    // Progress bar\n    ImGui::GetWindowDrawList()->AddRectFilled(\n        pos, ImVec2(pos.x + width * frac, pos.y + height), col);\n  }\n  if (border_color.w > 0.f) {\n    // Border\n    ImGui::GetWindowDrawList()->AddRect(\n        pos, ImVec2(pos.x + width, pos.y + height), border_col);\n  }\n\n  ImGui::Dummy(ImVec2(width, height));\n}\n\nvoid ZoomedImage(ImTextureID tex, ImVec2 rel_pos, ImVec2 tex_size,\n                 float focus_size, ImVec2 image_size = ImVec2(128, 128)) {\n  ImVec2 focus;\n  focus.x = rel_pos.x - (focus_size * 0.5f);\n  focus.y = rel_pos.y - (focus_size * 0.5f);\n\n  ImVec2 uv0 = ImVec2(focus.x / tex_size.x, focus.y / tex_size.y);\n  ImVec2 uv1 = ImVec2((focus.x + focus_size) / tex_size.x,\n                      (focus.y + focus_size) / tex_size.y);\n  ImGui::Image(tex, image_size, uv0, uv1);\n}\n\nvoid TraceViewer::DrawStateUI() {\n  auto command_processor = graphics_system_->command_processor();\n  auto& regs = *graphics_system_->register_file();\n\n  ImGui::SetNextWindowPos(\n      ImVec2(float(window_->GetActualLogicalWidth()) - 500 - 5, 30),\n      ImGuiCond_FirstUseEver);\n  ImGui::SetNextWindowSize(ImVec2(500, 680));\n  ImGui::SetNextWindowBgAlpha(kWindowBgAlpha);\n  if (!ImGui::Begin(\"State\", nullptr)) {\n    ImGui::End();\n    return;\n  }\n\n  if (!player_->current_frame() || player_->current_command_index() == -1) {\n    ImGui::Text(\"No frame/command selected\");\n    ImGui::End();\n    return;\n  }\n\n  auto frame = player_->current_frame();\n  const auto& command = frame->commands[player_->current_command_index()];\n  auto packet_head = command.head_ptr + sizeof(PacketStartCommand);\n  uint32_t packet = xe::load_and_swap<uint32_t>(packet_head);\n  uint32_t packet_type = packet >> 30;\n  assert_true(packet_type == 0x03);\n  uint32_t opcode = (packet >> 8) & 0x7F;\n  struct {\n    xenos::PrimitiveType prim_type;\n    bool is_auto_index;\n    uint32_t index_count;\n    uint32_t index_buffer_ptr;\n    uint32_t index_buffer_size;\n    xenos::Endian index_endianness;\n    xenos::IndexFormat index_format;\n  } draw_info;\n  std::memset(&draw_info, 0, sizeof(draw_info));\n  switch (opcode) {\n    case PM4_DRAW_INDX: {\n      uint32_t dword0 = xe::load_and_swap<uint32_t>(packet_head + 4);\n      uint32_t dword1 = xe::load_and_swap<uint32_t>(packet_head + 8);\n      draw_info.index_count = dword1 >> 16;\n      draw_info.prim_type = static_cast<xenos::PrimitiveType>(dword1 & 0x3F);\n      uint32_t src_sel = (dword1 >> 6) & 0x3;\n      if (src_sel == 0x0) {\n        // Indexed draw.\n        draw_info.is_auto_index = false;\n        draw_info.index_buffer_ptr =\n            xe::load_and_swap<uint32_t>(packet_head + 12);\n        uint32_t index_size = xe::load_and_swap<uint32_t>(packet_head + 16);\n        draw_info.index_endianness =\n            static_cast<xenos::Endian>(index_size >> 30);\n        index_size &= 0x00FFFFFF;\n        bool index_32bit = (dword1 >> 11) & 0x1;\n        draw_info.index_format = index_32bit ? xenos::IndexFormat::kInt32\n                                             : xenos::IndexFormat::kInt16;\n        draw_info.index_buffer_size = index_size * (index_32bit ? 4 : 2);\n      } else if (src_sel == 0x2) {\n        // Auto draw.\n        draw_info.is_auto_index = true;\n      } else {\n        // Unknown source select.\n        assert_always();\n      }\n      break;\n    }\n    case PM4_DRAW_INDX_2: {\n      uint32_t dword0 = xe::load_and_swap<uint32_t>(packet_head + 4);\n      uint32_t src_sel = (dword0 >> 6) & 0x3;\n      assert_true(src_sel == 0x2);  // 'SrcSel=AutoIndex'\n      draw_info.prim_type = static_cast<xenos::PrimitiveType>(dword0 & 0x3F);\n      draw_info.is_auto_index = true;\n      draw_info.index_count = dword0 >> 16;\n      break;\n    }\n  }\n\n  if (player_->is_playing_trace()) {\n    ImGui::Text(\"Playing trace...\");\n    float width = ImGui::GetWindowWidth() - 20.f;\n\n    ProgressBar(float(player_->playback_percent()) / 10000.f, width);\n    ImGui::End();\n    return;\n  }\n\n  auto enable_mode =\n      static_cast<EdramMode>(regs[XE_GPU_REG_RB_MODECONTROL] & 0x7);\n\n  const char* mode_name = \"Unknown\";\n  switch (enable_mode) {\n    case EdramMode::kNoOperation:\n      ImGui::Text(\"Ignored Command %d\", player_->current_command_index());\n      break;\n    case EdramMode::kColorDepth:\n    case EdramMode::kDepthOnly: {\n      static const char* kPrimNames[] = {\n          \"<none>\",         \"point list\",   \"line list\",      \"line strip\",\n          \"triangle list\",  \"triangle fan\", \"triangle strip\", \"unknown 0x7\",\n          \"rectangle list\", \"unknown 0x9\",  \"unknown 0xA\",    \"unknown 0xB\",\n          \"line loop\",      \"quad list\",    \"quad strip\",     \"unknown 0xF\",\n      };\n      ImGui::Text(\n          \"%s Command %d: %s, %d indices\",\n          enable_mode == EdramMode::kColorDepth ? \"Color-Depth\" : \"Depth-only\",\n          player_->current_command_index(),\n          kPrimNames[int(draw_info.prim_type)], draw_info.index_count);\n      break;\n    }\n    case EdramMode::kCopy: {\n      uint32_t copy_dest_base = regs[XE_GPU_REG_RB_COPY_DEST_BASE];\n      ImGui::Text(\"Copy Command %d (to %.8X)\", player_->current_command_index(),\n                  copy_dest_base);\n      break;\n    }\n  }\n\n  ImGui::Columns(2);\n  ImGui::BulletText(\"Viewport State:\");\n  if (true) {\n    ImGui::TreePush((const void*)0);\n    uint32_t pa_su_sc_mode_cntl = regs[XE_GPU_REG_PA_SU_SC_MODE_CNTL];\n    if ((pa_su_sc_mode_cntl >> 16) & 1) {\n      uint32_t window_offset = regs[XE_GPU_REG_PA_SC_WINDOW_OFFSET];\n      int16_t window_offset_x = window_offset & 0x7FFF;\n      int16_t window_offset_y = (window_offset >> 16) & 0x7FFF;\n      if (window_offset_x & 0x4000) {\n        window_offset_x |= 0x8000;\n      }\n      if (window_offset_y & 0x4000) {\n        window_offset_y |= 0x8000;\n      }\n      ImGui::BulletText(\"Window Offset: %d, %d\", window_offset_x,\n                        window_offset_y);\n    } else {\n      ImGui::BulletText(\"Window Offset: disabled\");\n    }\n    uint32_t window_scissor_tl = regs[XE_GPU_REG_PA_SC_WINDOW_SCISSOR_TL];\n    uint32_t window_scissor_br = regs[XE_GPU_REG_PA_SC_WINDOW_SCISSOR_BR];\n    ImGui::BulletText(\n        \"Window Scissor: %d,%d to %d,%d (%d x %d)\", window_scissor_tl & 0x7FFF,\n        (window_scissor_tl >> 16) & 0x7FFF, window_scissor_br & 0x7FFF,\n        (window_scissor_br >> 16) & 0x7FFF,\n        (window_scissor_br & 0x7FFF) - (window_scissor_tl & 0x7FFF),\n        ((window_scissor_br >> 16) & 0x7FFF) -\n            ((window_scissor_tl >> 16) & 0x7FFF));\n    uint32_t surface_info = regs[XE_GPU_REG_RB_SURFACE_INFO];\n    uint32_t surface_hiz = (surface_info >> 18) & 0x3FFF;\n    uint32_t surface_pitch = surface_info & 0x3FFF;\n    auto surface_msaa = (surface_info >> 16) & 0x3;\n    static const char* kMsaaNames[] = {\n        \"1X\",\n        \"2X\",\n        \"4X\",\n    };\n    ImGui::BulletText(\"Surface Pitch: %d\", surface_pitch);\n    ImGui::BulletText(\"Surface HI-Z Pitch: %d\", surface_hiz);\n    ImGui::BulletText(\"Surface MSAA: %s\", kMsaaNames[surface_msaa]);\n    uint32_t vte_control = regs[XE_GPU_REG_PA_CL_VTE_CNTL];\n    bool vport_xscale_enable = (vte_control & (1 << 0)) > 0;\n    bool vport_xoffset_enable = (vte_control & (1 << 1)) > 0;\n    bool vport_yscale_enable = (vte_control & (1 << 2)) > 0;\n    bool vport_yoffset_enable = (vte_control & (1 << 3)) > 0;\n    bool vport_zscale_enable = (vte_control & (1 << 4)) > 0;\n    bool vport_zoffset_enable = (vte_control & (1 << 5)) > 0;\n    assert_true(vport_xscale_enable == vport_yscale_enable ==\n                vport_zscale_enable == vport_xoffset_enable ==\n                vport_yoffset_enable == vport_zoffset_enable);\n    if (!vport_xscale_enable) {\n      ImGui::PushStyleColor(ImGuiCol_Text, kColorIgnored);\n    }\n    ImGui::BulletText(\n        \"Viewport Offset: %f, %f, %f\",\n        vport_xoffset_enable ? regs.Get<float>(XE_GPU_REG_PA_CL_VPORT_XOFFSET)\n                             : 0.0f,\n        vport_yoffset_enable ? regs.Get<float>(XE_GPU_REG_PA_CL_VPORT_YOFFSET)\n                             : 0.0f,\n        vport_zoffset_enable ? regs.Get<float>(XE_GPU_REG_PA_CL_VPORT_ZOFFSET)\n                             : 0.0f);\n    ImGui::BulletText(\n        \"Viewport Scale: %f, %f, %f\",\n        vport_xscale_enable ? regs.Get<float>(XE_GPU_REG_PA_CL_VPORT_XSCALE)\n                            : 1.0f,\n        vport_yscale_enable ? regs.Get<float>(XE_GPU_REG_PA_CL_VPORT_YSCALE)\n                            : 1.0f,\n        vport_zscale_enable ? regs.Get<float>(XE_GPU_REG_PA_CL_VPORT_ZSCALE)\n                            : 1.0f);\n    if (!vport_xscale_enable) {\n      ImGui::PopStyleColor();\n    }\n\n    ImGui::BulletText(\"Vertex Format: %s, %s, %s, %s\",\n                      ((vte_control >> 8) & 0x1) ? \"x/w0\" : \"x\",\n                      ((vte_control >> 8) & 0x1) ? \"y/w0\" : \"y\",\n                      ((vte_control >> 9) & 0x1) ? \"z/w0\" : \"z\",\n                      ((vte_control >> 10) & 0x1) ? \"w0\" : \"1/w0\");\n    uint32_t clip_control = regs[XE_GPU_REG_PA_CL_CLIP_CNTL];\n    bool clip_enabled = ((clip_control >> 17) & 0x1) == 0;\n    bool dx_clip = ((clip_control >> 20) & 0x1) == 0x1;\n    ImGui::BulletText(\"Clip Enabled: %s, DX Clip: %s\",\n                      clip_enabled ? \"true\" : \"false\",\n                      dx_clip ? \"true\" : \"false\");\n    ImGui::TreePop();\n  }\n  ImGui::NextColumn();\n  ImGui::BulletText(\"Rasterizer State:\");\n  if (true) {\n    ImGui::TreePush((const void*)0);\n    uint32_t pa_su_sc_mode_cntl = regs[XE_GPU_REG_PA_SU_SC_MODE_CNTL];\n    uint32_t pa_sc_screen_scissor_tl = regs[XE_GPU_REG_PA_SC_SCREEN_SCISSOR_TL];\n    uint32_t pa_sc_screen_scissor_br = regs[XE_GPU_REG_PA_SC_SCREEN_SCISSOR_BR];\n    if (pa_sc_screen_scissor_tl != 0 && pa_sc_screen_scissor_br != 0x20002000) {\n      int32_t screen_scissor_x = pa_sc_screen_scissor_tl & 0x7FFF;\n      int32_t screen_scissor_y = (pa_sc_screen_scissor_tl >> 16) & 0x7FFF;\n      int32_t screen_scissor_w =\n          (pa_sc_screen_scissor_br & 0x7FFF) - screen_scissor_x;\n      int32_t screen_scissor_h =\n          ((pa_sc_screen_scissor_br >> 16) & 0x7FFF) - screen_scissor_y;\n      ImGui::BulletText(\"Scissor: %d,%d to %d,%d (%d x %d)\", screen_scissor_x,\n                        screen_scissor_y, screen_scissor_x + screen_scissor_w,\n                        screen_scissor_y + screen_scissor_h, screen_scissor_w,\n                        screen_scissor_h);\n    } else {\n      ImGui::BulletText(\"Scissor: disabled\");\n    }\n    switch (pa_su_sc_mode_cntl & 0x3) {\n      case 0:\n        ImGui::BulletText(\"Culling: disabled\");\n        break;\n      case 1:\n        ImGui::BulletText(\"Culling: front-face\");\n        break;\n      case 2:\n        ImGui::BulletText(\"Culling: back-face\");\n        break;\n    }\n    if (pa_su_sc_mode_cntl & 0x4) {\n      ImGui::BulletText(\"Front-face: clockwise\");\n    } else {\n      ImGui::BulletText(\"Front-face: counter-clockwise\");\n    }\n    static const char* kFillModeNames[3] = {\n        \"point\",\n        \"line\",\n        \"fill\",\n    };\n    bool poly_mode = ((pa_su_sc_mode_cntl >> 3) & 0x3) != 0;\n    if (poly_mode) {\n      uint32_t front_poly_mode = (pa_su_sc_mode_cntl >> 5) & 0x7;\n      uint32_t back_poly_mode = (pa_su_sc_mode_cntl >> 8) & 0x7;\n      // GL only supports both matching.\n      assert_true(front_poly_mode == back_poly_mode);\n      ImGui::BulletText(\"Polygon Mode: %s\", kFillModeNames[front_poly_mode]);\n    } else {\n      ImGui::BulletText(\"Polygon Mode: fill\");\n    }\n    if (pa_su_sc_mode_cntl & (1 << 19)) {\n      ImGui::BulletText(\"Provoking Vertex: last\");\n    } else {\n      ImGui::BulletText(\"Provoking Vertex: first\");\n    }\n    ImGui::TreePop();\n  }\n  ImGui::Columns(1);\n\n  auto rb_surface_info = regs[XE_GPU_REG_RB_SURFACE_INFO];\n  uint32_t surface_pitch = rb_surface_info & 0x3FFF;\n  auto surface_msaa =\n      static_cast<xenos::MsaaSamples>((rb_surface_info >> 16) & 0x3);\n\n  if (ImGui::CollapsingHeader(\"Color Targets\")) {\n    if (enable_mode != EdramMode::kDepthOnly) {\n      // Alpha testing -- ALPHAREF, ALPHAFUNC, ALPHATESTENABLE\n      // if(ALPHATESTENABLE && frag_out.a [<=/ALPHAFUNC] ALPHAREF) discard;\n      uint32_t color_control = regs[XE_GPU_REG_RB_COLORCONTROL];\n      if ((color_control & 0x8) != 0) {\n        ImGui::BulletText(\"Alpha Test: %s %.2f\",\n                          kCompareFuncNames[color_control & 0x7],\n                          regs.Get<float>(XE_GPU_REG_RB_ALPHA_REF));\n      } else {\n        ImGui::PushStyleColor(ImGuiCol_Text, kColorIgnored);\n        ImGui::BulletText(\"Alpha Test: disabled\");\n        ImGui::PopStyleColor();\n      }\n\n      auto blend_color = ImVec4(regs.Get<float>(XE_GPU_REG_RB_BLEND_RED),\n                                regs.Get<float>(XE_GPU_REG_RB_BLEND_GREEN),\n                                regs.Get<float>(XE_GPU_REG_RB_BLEND_BLUE),\n                                regs.Get<float>(XE_GPU_REG_RB_BLEND_ALPHA));\n      ImGui::BulletText(\"Blend Color: (%.2f,%.2f,%.2f,%.2f)\", blend_color.x,\n                        blend_color.y, blend_color.z, blend_color.w);\n      ImGui::SameLine();\n      // TODO small_height (was true) parameter was removed\n      ImGui::ColorButton(nullptr, blend_color);\n\n      uint32_t rb_color_mask = regs[XE_GPU_REG_RB_COLOR_MASK];\n      uint32_t color_info[4] = {\n          regs[XE_GPU_REG_RB_COLOR_INFO],\n          regs[XE_GPU_REG_RB_COLOR1_INFO],\n          regs[XE_GPU_REG_RB_COLOR2_INFO],\n          regs[XE_GPU_REG_RB_COLOR3_INFO],\n      };\n      uint32_t rb_blendcontrol[4] = {\n          regs[XE_GPU_REG_RB_BLENDCONTROL0],\n          regs[XE_GPU_REG_RB_BLENDCONTROL1],\n          regs[XE_GPU_REG_RB_BLENDCONTROL2],\n          regs[XE_GPU_REG_RB_BLENDCONTROL3],\n      };\n      ImGui::Columns(2);\n      for (int i = 0; i < xe::countof(color_info); ++i) {\n        uint32_t blend_control = rb_blendcontrol[i];\n        // A2XX_RB_BLEND_CONTROL_COLOR_SRCBLEND\n        auto src_blend = (blend_control & 0x0000001F) >> 0;\n        // A2XX_RB_BLEND_CONTROL_COLOR_DESTBLEND\n        auto dest_blend = (blend_control & 0x00001F00) >> 8;\n        // A2XX_RB_BLEND_CONTROL_COLOR_COMB_FCN\n        auto blend_op = (blend_control & 0x000000E0) >> 5;\n        // A2XX_RB_BLEND_CONTROL_ALPHA_SRCBLEND\n        auto src_blend_alpha = (blend_control & 0x001F0000) >> 16;\n        // A2XX_RB_BLEND_CONTROL_ALPHA_DESTBLEND\n        auto dest_blend_alpha = (blend_control & 0x1F000000) >> 24;\n        // A2XX_RB_BLEND_CONTROL_ALPHA_COMB_FCN\n        auto blend_op_alpha = (blend_control & 0x00E00000) >> 21;\n        // A2XX_RB_COLORCONTROL_BLEND_DISABLE ?? Can't find this!\n        // Just guess based on actions.\n        bool blend_enable = !((src_blend == 1) && (dest_blend == 0) &&\n                              (blend_op == 0) && (src_blend_alpha == 1) &&\n                              (dest_blend_alpha == 0) && (blend_op_alpha == 0));\n        if (blend_enable) {\n          if (src_blend == src_blend_alpha && dest_blend == dest_blend_alpha &&\n              blend_op == blend_op_alpha) {\n            ImGui::BulletText(\"Blend %d: \", i);\n            ImGui::SameLine();\n            DrawBlendMode(src_blend, dest_blend, blend_op);\n          } else {\n            ImGui::BulletText(\"Blend %d:\", i);\n            ImGui::BulletText(\"  Color: \");\n            ImGui::SameLine();\n            DrawBlendMode(src_blend, dest_blend, blend_op);\n            ImGui::BulletText(\"  Alpha: \");\n            ImGui::SameLine();\n            DrawBlendMode(src_blend_alpha, dest_blend_alpha, blend_op_alpha);\n          }\n        } else {\n          ImGui::PushStyleColor(ImGuiCol_Text, kColorIgnored);\n          ImGui::BulletText(\"Blend %d: disabled\", i);\n          ImGui::PopStyleColor();\n        }\n        ImGui::NextColumn();\n        uint32_t write_mask = (rb_color_mask >> (i * 4)) & 0xF;\n        if (write_mask) {\n          ImGui::BulletText(\"Write Mask %d: %s, %s, %s, %s\", i,\n                            !!(write_mask & 0x1) ? \"true\" : \"false\",\n                            !!(write_mask & 0x2) ? \"true\" : \"false\",\n                            !!(write_mask & 0x4) ? \"true\" : \"false\",\n                            !!(write_mask & 0x8) ? \"true\" : \"false\");\n        } else {\n          ImGui::PushStyleColor(ImGuiCol_Text, kColorIgnored);\n          ImGui::BulletText(\"Write Mask %d: disabled\", i);\n          ImGui::PopStyleColor();\n        }\n        ImGui::NextColumn();\n      }\n      ImGui::Columns(1);\n\n      ImGui::Columns(4);\n      for (int i = 0; i < xe::countof(color_info); ++i) {\n        uint32_t write_mask = (rb_color_mask >> (i * 4)) & 0xF;\n        uint32_t color_base = color_info[i] & 0xFFF;\n        auto color_format = static_cast<xenos::ColorRenderTargetFormat>(\n            (color_info[i] >> 16) & 0xF);\n        ImVec2 button_pos = ImGui::GetCursorScreenPos();\n        ImVec2 button_size(256, 256);\n        ImTextureID tex = 0;\n        ImGui::PushID(i);\n        if (write_mask) {\n          auto color_target = GetColorRenderTarget(surface_pitch, surface_msaa,\n                                                   color_base, color_format);\n          tex = ImTextureID(color_target);\n          if (ImGui::ImageButton(\"#color_image\", tex, button_size, ImVec2(0, 0),\n                                 ImVec2(1, 1))) {\n            // show viewer\n          }\n        } else {\n          ImGui::ImageButton(\"#color_image\", ImTextureID(0), button_size,\n                             ImVec2(0, 0), ImVec2(1, 1), ImVec4(0, 0, 0, 0),\n                             ImVec4(0, 0, 0, 0));\n        }\n        ImGui::PopID();\n        if (ImGui::IsItemHovered()) {\n          ImGui::BeginTooltip();\n          ImGui::Text(\"Color Target %d (%s), base %.4X, pitch %d, format %s\", i,\n                      write_mask ? \"enabled\" : \"disabled\", color_base,\n                      surface_pitch, kColorFormatNames[uint32_t(color_format)]);\n\n          if (tex) {\n            ImVec2 rel_pos;\n            rel_pos.x = ImGui::GetMousePos().x - button_pos.x;\n            rel_pos.y = ImGui::GetMousePos().y - button_pos.y;\n            ZoomedImage(tex, rel_pos, button_size, 32.f, ImVec2(256, 256));\n          }\n\n          ImGui::EndTooltip();\n        }\n        ImGui::NextColumn();\n      }\n      ImGui::Columns(1);\n    } else {\n      ImGui::PushStyleColor(ImGuiCol_Text, kColorIgnored);\n      ImGui::Text(\"Depth-only mode, no color targets\");\n      ImGui::PopStyleColor();\n    }\n  }\n\n  if (ImGui::CollapsingHeader(\"Depth/Stencil Target\")) {\n    auto rb_depthcontrol = regs[XE_GPU_REG_RB_DEPTHCONTROL];\n    auto rb_stencilrefmask = regs[XE_GPU_REG_RB_STENCILREFMASK];\n    auto rb_depth_info = regs[XE_GPU_REG_RB_DEPTH_INFO];\n    bool uses_depth =\n        (rb_depthcontrol & 0x00000002) || (rb_depthcontrol & 0x00000004);\n    uint32_t stencil_ref = (rb_stencilrefmask & 0xFF);\n    uint32_t stencil_read_mask = (rb_stencilrefmask >> 8) & 0xFF;\n    uint32_t stencil_write_mask = (rb_stencilrefmask >> 16) & 0xFF;\n    bool uses_stencil =\n        (rb_depthcontrol & 0x00000001) || (stencil_write_mask != 0);\n\n    ImGui::Columns(2);\n\n    if (rb_depthcontrol & 0x00000002) {\n      ImGui::BulletText(\"Depth Test: enabled\");\n    } else {\n      ImGui::PushStyleColor(ImGuiCol_Text, kColorIgnored);\n      ImGui::BulletText(\"Depth Test: disabled\");\n    }\n    ImGui::BulletText(\"Depth Func: %s\",\n                      kCompareFuncNames[(rb_depthcontrol & 0x00000070) >> 4]);\n    if (!(rb_depthcontrol & 0x00000002)) {\n      ImGui::PopStyleColor();\n    }\n    if (rb_depthcontrol & 0x00000004) {\n      ImGui::BulletText(\"Depth Write: enabled\");\n    } else {\n      ImGui::PushStyleColor(ImGuiCol_Text, kColorIgnored);\n      ImGui::BulletText(\"Depth Write: disabled\");\n      ImGui::PopStyleColor();\n    }\n\n    if (rb_depthcontrol & 0x00000001) {\n      ImGui::BulletText(\"Stencil Test: enabled\");\n      ImGui::BulletText(\"Stencil ref: 0x%.2X\", stencil_ref);\n      ImGui::BulletText(\"Stencil read / write masks: 0x%.2X / 0x%.2X\",\n                        stencil_read_mask, stencil_write_mask);\n      ImGui::BulletText(\"Front State:\");\n      ImGui::Indent();\n      ImGui::BulletText(\"Compare Op: %s\",\n                        kCompareFuncNames[(rb_depthcontrol >> 8) & 0x7]);\n      ImGui::BulletText(\"Fail Op: %s\",\n                        kStencilFuncNames[(rb_depthcontrol >> 11) & 0x7]);\n      ImGui::BulletText(\"Pass Op: %s\",\n                        kStencilFuncNames[(rb_depthcontrol >> 14) & 0x7]);\n      ImGui::BulletText(\"Depth Fail Op: %s\",\n                        kStencilFuncNames[(rb_depthcontrol >> 17) & 0x7]);\n      ImGui::Unindent();\n\n      // BACKFACE_ENABLE\n      if (!(rb_depthcontrol & 0x80)) {\n        ImGui::PushStyleColor(ImGuiCol_Text, kColorIgnored);\n        ImGui::BulletText(\"Back State (same as front)\");\n        ImGui::PopStyleColor();\n      } else {\n        ImGui::BulletText(\"Back State:\");\n        ImGui::Indent();\n        ImGui::BulletText(\"Compare Op: %s\",\n                          kCompareFuncNames[(rb_depthcontrol >> 20) & 0x7]);\n        ImGui::BulletText(\"Fail Op: %s\",\n                          kStencilFuncNames[(rb_depthcontrol >> 23) & 0x7]);\n        ImGui::BulletText(\"Pass Op: %s\",\n                          kStencilFuncNames[(rb_depthcontrol >> 26) & 0x7]);\n        ImGui::BulletText(\"Depth Fail Op: %s\",\n                          kStencilFuncNames[(rb_depthcontrol >> 29) & 0x7]);\n        ImGui::Unindent();\n      }\n    } else {\n      ImGui::PushStyleColor(ImGuiCol_Text, kColorIgnored);\n      ImGui::BulletText(\"Stencil Test: disabled\");\n      ImGui::PopStyleColor();\n    }\n\n    ImGui::NextColumn();\n\n    if (uses_depth || uses_stencil) {\n      uint32_t depth_base = rb_depth_info & 0xFFF;\n      auto depth_format = static_cast<xenos::DepthRenderTargetFormat>(\n          (rb_depth_info >> 16) & 0x1);\n      auto depth_target = GetDepthRenderTarget(surface_pitch, surface_msaa,\n                                               depth_base, depth_format);\n\n      auto button_pos = ImGui::GetCursorScreenPos();\n      ImVec2 button_size(256, 256);\n      ImGui::ImageButton(\"#depth_stencil_image\", ImTextureID(depth_target),\n                         button_size, ImVec2(0, 0), ImVec2(1, 1));\n      if (ImGui::IsItemHovered()) {\n        ImGui::BeginTooltip();\n\n        ImGui::Text(\"Depth Target: base %.4X, pitch %d, format %s\", depth_base,\n                    surface_pitch, kDepthFormatNames[uint32_t(depth_format)]);\n\n        ImVec2 rel_pos;\n        rel_pos.x = ImGui::GetMousePos().x - button_pos.x;\n        rel_pos.y = ImGui::GetMousePos().y - button_pos.y;\n        ZoomedImage(ImTextureID(depth_target), rel_pos, button_size, 32.f,\n                    ImVec2(256, 256));\n\n        ImGui::EndTooltip();\n      }\n    } else {\n      ImGui::Text(\"No depth target\");\n    }\n\n    ImGui::Columns(1);\n  }\n\n  if (ImGui::CollapsingHeader(\"Vertex Shader\")) {\n    ShaderDisplayType shader_display_type = DrawShaderTypeUI();\n    ImGui::BeginChild(\"#vertex_shader_text\", ImVec2(0, 400));\n    auto shader = command_processor->active_vertex_shader();\n    if (shader) {\n      DrawShaderUI(shader, shader_display_type);\n    } else {\n      ImGui::TextColored(kColorError, \"ERROR: no vertex shader set\");\n    }\n    ImGui::EndChild();\n  }\n  if (ImGui::CollapsingHeader(\"Vertex Shader Output\") &&\n      QueryVSOutputElementSize()) {\n    auto size = QueryVSOutputSize();\n    auto el_size = QueryVSOutputElementSize();\n    if (size > 0) {\n      std::vector<float> vertices;\n      vertices.resize(size / 4);\n      QueryVSOutput(vertices.data(), size);\n\n      ImGui::Text(\"%\" PRIu64 \" output vertices\", vertices.size() / 4);\n      ImGui::SameLine();\n      static bool normalize = false;\n      ImGui::Checkbox(\"Normalize\", &normalize);\n\n      ImGui::BeginChild(\"#vsvertices\", ImVec2(0, 300));\n\n      int display_start, display_end;\n      ImGui::CalcListClipping(int(vertices.size() / 4),\n                              ImGui::GetTextLineHeight(), &display_start,\n                              &display_end);\n      ImGui::Dummy(ImVec2(0, (display_start)*ImGui::GetTextLineHeight()));\n\n      ImGui::Columns(int(el_size), \"#vsvertices\", true);\n      for (size_t i = display_start; i < display_end; i++) {\n        size_t start_vtx = i * el_size;\n        float verts[4] = {vertices[start_vtx], vertices[start_vtx + 1],\n                          vertices[start_vtx + 2], vertices[start_vtx + 3]};\n        assert_true(el_size <= xe::countof(verts));\n        if (normalize) {\n          for (int j = 0; j < el_size; j++) {\n            verts[j] /= verts[3];\n          }\n        }\n\n        for (int j = 0; j < el_size; j++) {\n          ImGui::Text(\"%.3f\", verts[j]);\n          ImGui::NextColumn();\n        }\n      }\n      ImGui::Columns(1);\n\n      ImGui::Dummy(ImVec2(0, ((vertices.size() / 4) - display_end) *\n                                 ImGui::GetTextLineHeight()));\n      ImGui::EndChild();\n    } else {\n      ImGui::Text(\"No vertex shader output\");\n    }\n  }\n  if (ImGui::CollapsingHeader(\"Pixel Shader\")) {\n    ShaderDisplayType shader_display_type = DrawShaderTypeUI();\n    ImGui::BeginChild(\"#pixel_shader_text\", ImVec2(0, 400));\n    auto shader = command_processor->active_pixel_shader();\n    if (shader) {\n      DrawShaderUI(shader, shader_display_type);\n    } else {\n      ImGui::TextColored(kColorError, \"ERROR: no pixel shader set\");\n    }\n    ImGui::EndChild();\n  }\n  if (ImGui::CollapsingHeader(\"Index Buffer\")) {\n    if (draw_info.is_auto_index) {\n      ImGui::Text(\"%d indices, auto-indexed\", draw_info.index_count);\n    } else {\n      ImGui::Text(\"%d indices from buffer %.8X (%db), %s, %s\",\n                  draw_info.index_count, draw_info.index_buffer_ptr,\n                  draw_info.index_buffer_size,\n                  kIndexFormatNames[int(draw_info.index_format)],\n                  kEndiannessNames[int(draw_info.index_endianness)]);\n      uint32_t pa_su_sc_mode_cntl = regs[XE_GPU_REG_PA_SU_SC_MODE_CNTL];\n      if (pa_su_sc_mode_cntl & (1 << 21)) {\n        uint32_t reset_index = regs[XE_GPU_REG_VGT_MULTI_PRIM_IB_RESET_INDX];\n        if (draw_info.index_format == xenos::IndexFormat::kInt16) {\n          ImGui::Text(\"Reset Index: %.4X\", reset_index & 0xFFFF);\n        } else {\n          ImGui::Text(\"Reset Index: %.8X\", reset_index);\n        }\n      } else {\n        ImGui::Text(\"Reset Index: disabled\");\n      }\n      ImGui::BeginChild(\"#indices\", ImVec2(0, 300));\n      ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0));\n      int display_start, display_end;\n      ImGui::CalcListClipping(1 + draw_info.index_count,\n                              ImGui::GetTextLineHeight(), &display_start,\n                              &display_end);\n      ImGui::Dummy(ImVec2(0, (display_start)*ImGui::GetTextLineHeight()));\n      ImGui::Columns(2, \"#indices\", true);\n      ImGui::SetColumnOffset(1, 60);\n      if (display_start <= 1) {\n        ImGui::Text(\"Ordinal\");\n        ImGui::NextColumn();\n        ImGui::Text(\" Value\");\n        ImGui::NextColumn();\n        ImGui::Separator();\n      }\n      uint32_t element_size =\n          draw_info.index_format == xenos::IndexFormat::kInt32 ? 4 : 2;\n      const uint8_t* data_ptr = memory_->TranslatePhysical(\n          draw_info.index_buffer_ptr + (display_start * element_size));\n      for (int i = display_start; i < display_end;\n           ++i, data_ptr += element_size) {\n        if (i < 10) {\n          ImGui::Text(\"     %d\", i);\n        } else if (i < 100) {\n          ImGui::Text(\"    %d\", i);\n        } else if (i < 1000) {\n          ImGui::Text(\"   %d\", i);\n        } else {\n          ImGui::Text(\"  %d\", i);\n        }\n        ImGui::NextColumn();\n        uint32_t value = element_size == 4\n                             ? GpuSwap(xe::load<uint32_t>(data_ptr),\n                                       draw_info.index_endianness)\n                             : GpuSwap(xe::load<uint16_t>(data_ptr),\n                                       draw_info.index_endianness);\n        ImGui::Text(\" %d\", value);\n        ImGui::NextColumn();\n      }\n      ImGui::Columns(1);\n      ImGui::Dummy(ImVec2(0, (draw_info.index_count - display_end) *\n                                 ImGui::GetTextLineHeight()));\n      ImGui::PopStyleVar();\n      ImGui::EndChild();\n    }\n  }\n  if (ImGui::CollapsingHeader(\"Vertex Buffers\")) {\n    auto shader = command_processor->active_vertex_shader();\n    if (shader) {\n      for (const auto& vertex_binding : shader->vertex_bindings()) {\n        xe_gpu_vertex_fetch_t fetch =\n            regs.GetVertexFetch(vertex_binding.fetch_constant);\n        assert_true(fetch.endian == xenos::Endian::k8in32);\n        char tree_root_id[32];\n        sprintf(tree_root_id, \"#vertices_root_%d\",\n                vertex_binding.fetch_constant);\n        if (ImGui::TreeNode(tree_root_id, \"vf%d: 0x%.8X (%db), %s\",\n                            vertex_binding.fetch_constant, fetch.address << 2,\n                            fetch.size * 4,\n                            kEndiannessNames[int(fetch.endian)])) {\n          ImGui::BeginChild(\"#vertices\", ImVec2(0, 300));\n          DrawVertexFetcher(shader, vertex_binding, fetch);\n          ImGui::EndChild();\n          ImGui::TreePop();\n        }\n      }\n    } else {\n      ImGui::TextColored(kColorError, \"ERROR: no vertex shader set\");\n    }\n  }\n  if (ImGui::CollapsingHeader(\"Vertex Textures\")) {\n    auto shader = command_processor->active_vertex_shader();\n    if (shader) {\n      const auto& texture_bindings = shader->texture_bindings();\n      if (!texture_bindings.empty()) {\n        for (const auto& texture_binding : texture_bindings) {\n          DrawTextureInfo(texture_binding);\n        }\n      } else {\n        ImGui::Text(\"No vertex shader samplers\");\n      }\n    } else {\n      ImGui::TextColored(kColorError, \"ERROR: no vertex shader set\");\n    }\n  }\n  if (ImGui::CollapsingHeader(\"Pixel Textures\")) {\n    auto shader = command_processor->active_pixel_shader();\n    if (shader) {\n      const auto& texture_bindings = shader->texture_bindings();\n      if (!texture_bindings.empty()) {\n        for (const auto& texture_binding : texture_bindings) {\n          DrawTextureInfo(texture_binding);\n        }\n      } else {\n        ImGui::Text(\"No pixel shader samplers\");\n      }\n    } else {\n      ImGui::TextColored(kColorError, \"ERROR: no pixel shader set\");\n    }\n  }\n  if (ImGui::CollapsingHeader(\"Fetch Constants (raw)\")) {\n    ImGui::Columns(2);\n    for (int i = XE_GPU_REG_SHADER_CONSTANT_FETCH_00_0;\n         i <= XE_GPU_REG_SHADER_CONSTANT_FETCH_31_5; ++i) {\n      ImGui::Text(\"f%02d_%d\", (i - XE_GPU_REG_SHADER_CONSTANT_FETCH_00_0) / 6,\n                  (i - XE_GPU_REG_SHADER_CONSTANT_FETCH_00_0) % 6);\n      ImGui::NextColumn();\n      ImGui::Text(\"%.8X\", regs[i]);\n      ImGui::NextColumn();\n    }\n    ImGui::Columns(1);\n  }\n  if (ImGui::CollapsingHeader(\"ALU Constants\")) {\n    ImGui::Columns(2);\n    for (int i = XE_GPU_REG_SHADER_CONSTANT_000_X;\n         i <= XE_GPU_REG_SHADER_CONSTANT_511_X; i += 4) {\n      ImGui::Text(\"c%d\", (i - XE_GPU_REG_SHADER_CONSTANT_000_X) / 4);\n      ImGui::NextColumn();\n      ImGui::Text(\"%f, %f, %f, %f\", regs.Get<float>(i + 0),\n                  regs.Get<float>(i + 1), regs.Get<float>(i + 2),\n                  regs.Get<float>(i + 3));\n      ImGui::NextColumn();\n    }\n    ImGui::Columns(1);\n  }\n  if (ImGui::CollapsingHeader(\"Bool Constants\")) {\n    ImGui::Columns(2);\n    for (int i = XE_GPU_REG_SHADER_CONSTANT_BOOL_000_031;\n         i <= XE_GPU_REG_SHADER_CONSTANT_BOOL_224_255; ++i) {\n      ImGui::Text(\"b%03d-%03d\",\n                  (i - XE_GPU_REG_SHADER_CONSTANT_BOOL_000_031) * 32,\n                  (i - XE_GPU_REG_SHADER_CONSTANT_BOOL_000_031) * 32 + 31);\n      ImGui::NextColumn();\n      ImGui::Text(\"%.8X\", regs[i]);\n      ImGui::NextColumn();\n    }\n    ImGui::Columns(1);\n  }\n  if (ImGui::CollapsingHeader(\"Loop Constants\")) {\n    ImGui::Columns(2);\n    for (int i = XE_GPU_REG_SHADER_CONSTANT_LOOP_00;\n         i <= XE_GPU_REG_SHADER_CONSTANT_LOOP_31; ++i) {\n      ImGui::Text(\"l%d\", i - XE_GPU_REG_SHADER_CONSTANT_LOOP_00);\n      ImGui::NextColumn();\n      ImGui::Text(\"%.8X\", regs[i]);\n      ImGui::NextColumn();\n    }\n    ImGui::Columns(1);\n  }\n  ImGui::End();\n}\n\n}  //  namespace gpu\n}  //  namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/trace_viewer.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_TRACE_VIEWER_H_\n#define XENIA_GPU_TRACE_VIEWER_H_\n\n#include <string_view>\n\n#include \"xenia/emulator.h\"\n#include \"xenia/gpu/shader.h\"\n#include \"xenia/gpu/trace_player.h\"\n#include \"xenia/gpu/trace_protocol.h\"\n#include \"xenia/gpu/xenos.h\"\n#include \"xenia/memory.h\"\n#include \"xenia/ui/imgui_dialog.h\"\n#include \"xenia/ui/imgui_drawer.h\"\n#include \"xenia/ui/immediate_drawer.h\"\n#include \"xenia/ui/window.h\"\n#include \"xenia/ui/window_listener.h\"\n#include \"xenia/ui/windowed_app.h\"\n\nnamespace xe {\nnamespace gpu {\n\nstruct SamplerInfo;\nstruct TextureInfo;\n\nclass TraceViewer : public xe::ui::WindowedApp {\n public:\n  virtual ~TraceViewer();\n\n  bool OnInitialize() override;\n\n protected:\n  explicit TraceViewer(xe::ui::WindowedAppContext& app_context,\n                       const std::string_view name);\n\n  virtual std::unique_ptr<gpu::GraphicsSystem> CreateGraphicsSystem() = 0;\n  GraphicsSystem* graphics_system() const { return graphics_system_; }\n\n  void DrawMultilineString(const std::string_view str);\n\n  virtual uintptr_t GetColorRenderTarget(\n      uint32_t pitch, xenos::MsaaSamples samples, uint32_t base,\n      xenos::ColorRenderTargetFormat format) = 0;\n  virtual uintptr_t GetDepthRenderTarget(\n      uint32_t pitch, xenos::MsaaSamples samples, uint32_t base,\n      xenos::DepthRenderTargetFormat format) = 0;\n  virtual uintptr_t GetTextureEntry(const TextureInfo& texture_info,\n                                    const SamplerInfo& sampler_info) = 0;\n\n  virtual size_t QueryVSOutputSize() { return 0; }\n  virtual size_t QueryVSOutputElementSize() { return 0; }\n  virtual bool QueryVSOutput(void* buffer, size_t size) { return false; }\n\n  virtual bool Setup();\n\n private:\n  class TraceViewerWindowListener final : public xe::ui::WindowListener,\n                                          public xe::ui::WindowInputListener {\n   public:\n    explicit TraceViewerWindowListener(TraceViewer& trace_viewer)\n        : trace_viewer_(trace_viewer) {}\n\n    void OnClosing(xe::ui::UIEvent& e) override;\n\n    void OnKeyDown(xe::ui::KeyEvent& e) override;\n\n   private:\n    TraceViewer& trace_viewer_;\n  };\n\n  class TraceViewerDialog final : public ui::ImGuiDialog {\n   public:\n    explicit TraceViewerDialog(xe::ui::ImGuiDrawer* imgui_drawer,\n                               TraceViewer& trace_viewer)\n        : xe::ui::ImGuiDialog(imgui_drawer), trace_viewer_(trace_viewer) {}\n\n   protected:\n    void OnDraw(ImGuiIO& io) override;\n\n   private:\n    TraceViewer& trace_viewer_;\n  };\n\n  enum class ShaderDisplayType : int {\n    kUcode,\n    kTranslated,\n    kHostDisasm,\n  };\n\n  // Same as for Dear ImGui tooltips. Windows are translucent as the controls\n  // may take a pretty large fraction of the screen, especially on small\n  // screens, so the image from the guest can be seen through them.\n  static constexpr float kWindowBgAlpha = 0.6f;\n\n  bool Load(const std::string_view trace_file_path);\n\n  void DrawUI();\n  void DrawControllerUI();\n  void DrawPacketDisassemblerUI();\n  int RecursiveDrawCommandBufferUI(const TraceReader::Frame* frame,\n                                   TraceReader::CommandBuffer* buffer);\n  void DrawCommandListUI();\n  void DrawStateUI();\n\n  ShaderDisplayType DrawShaderTypeUI();\n  void DrawShaderUI(Shader* shader, ShaderDisplayType display_type);\n\n  void DrawBlendMode(uint32_t src_blend, uint32_t dest_blend,\n                     uint32_t blend_op);\n\n  void DrawTextureInfo(const Shader::TextureBinding& texture_binding);\n  void DrawFailedTextureInfo(const Shader::TextureBinding& texture_binding,\n                             const char* message);\n\n  void DrawVertexFetcher(Shader* shader,\n                         const Shader::VertexBinding& vertex_binding,\n                         const xenos::xe_gpu_vertex_fetch_t& fetch);\n\n  TraceViewerWindowListener window_listener_;\n\n  std::unique_ptr<xe::ui::Window> window_;\n\n  std::unique_ptr<Emulator> emulator_;\n  Memory* memory_ = nullptr;\n  GraphicsSystem* graphics_system_ = nullptr;\n  std::unique_ptr<TracePlayer> player_;\n\n  std::unique_ptr<xe::ui::ImmediateDrawer> immediate_drawer_;\n  std::unique_ptr<xe::ui::ImGuiDrawer> imgui_drawer_;\n  std::unique_ptr<TraceViewerDialog> trace_viewer_dialog_;\n};\n\n}  // namespace gpu\n}  // namespace xe\n\n#endif  // XENIA_GPU_TRACE_VIEWER_H_\n"
  },
  {
    "path": "src/xenia/gpu/trace_writer.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/trace_writer.h\"\n\n#include <cstring>\n#include <memory>\n\n#include \"third_party/snappy/snappy-sinksource.h\"\n#include \"third_party/snappy/snappy.h\"\n\n#include \"build/version.h\"\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/filesystem.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/string.h\"\n#include \"xenia/gpu/registers.h\"\n#include \"xenia/gpu/xenos.h\"\n\nnamespace xe {\nnamespace gpu {\n\nTraceWriter::TraceWriter(uint8_t* membase)\n    : membase_(membase), file_(nullptr) {}\n\nTraceWriter::~TraceWriter() = default;\n\nbool TraceWriter::Open(const std::filesystem::path& path, uint32_t title_id) {\n  Close();\n\n  auto canonical_path = std::filesystem::absolute(path);\n  if (canonical_path.has_parent_path()) {\n    auto base_path = canonical_path.parent_path();\n    std::filesystem::create_directories(base_path);\n  }\n\n  file_ = xe::filesystem::OpenFile(canonical_path, \"wb\");\n  if (!file_) {\n    return false;\n  }\n\n  // Write header first. Must be at the top of the file.\n  TraceHeader header;\n  header.version = kTraceFormatVersion;\n  std::memcpy(header.build_commit_sha, XE_BUILD_COMMIT,\n              sizeof(header.build_commit_sha));\n  header.title_id = title_id;\n  fwrite(&header, sizeof(header), 1, file_);\n\n  cached_memory_reads_.clear();\n  return true;\n}\n\nvoid TraceWriter::Flush() {\n  if (file_) {\n    fflush(file_);\n  }\n}\n\nvoid TraceWriter::Close() {\n  if (file_) {\n    cached_memory_reads_.clear();\n\n    fflush(file_);\n    fclose(file_);\n    file_ = nullptr;\n  }\n}\n\nvoid TraceWriter::WritePrimaryBufferStart(uint32_t base_ptr, uint32_t count) {\n  if (!file_) {\n    return;\n  }\n  PrimaryBufferStartCommand cmd = {\n      TraceCommandType::kPrimaryBufferStart,\n      base_ptr,\n      0,\n  };\n  fwrite(&cmd, 1, sizeof(cmd), file_);\n}\n\nvoid TraceWriter::WritePrimaryBufferEnd() {\n  if (!file_) {\n    return;\n  }\n  PrimaryBufferEndCommand cmd = {\n      TraceCommandType::kPrimaryBufferEnd,\n  };\n  fwrite(&cmd, 1, sizeof(cmd), file_);\n}\n\nvoid TraceWriter::WriteIndirectBufferStart(uint32_t base_ptr, uint32_t count) {\n  if (!file_) {\n    return;\n  }\n  IndirectBufferStartCommand cmd = {\n      TraceCommandType::kIndirectBufferStart,\n      base_ptr,\n      0,\n  };\n  fwrite(&cmd, 1, sizeof(cmd), file_);\n}\n\nvoid TraceWriter::WriteIndirectBufferEnd() {\n  if (!file_) {\n    return;\n  }\n  IndirectBufferEndCommand cmd = {\n      TraceCommandType::kIndirectBufferEnd,\n  };\n  fwrite(&cmd, 1, sizeof(cmd), file_);\n}\n\nvoid TraceWriter::WritePacketStart(uint32_t base_ptr, uint32_t count) {\n  if (!file_) {\n    return;\n  }\n  PacketStartCommand cmd = {\n      TraceCommandType::kPacketStart,\n      base_ptr,\n      count,\n  };\n  fwrite(&cmd, 1, sizeof(cmd), file_);\n  fwrite(membase_ + base_ptr, 4, count, file_);\n}\n\nvoid TraceWriter::WritePacketEnd() {\n  if (!file_) {\n    return;\n  }\n  PacketEndCommand cmd = {\n      TraceCommandType::kPacketEnd,\n  };\n  fwrite(&cmd, 1, sizeof(cmd), file_);\n}\n\nvoid TraceWriter::WriteMemoryRead(uint32_t base_ptr, size_t length,\n                                  const void* host_ptr) {\n  if (!file_) {\n    return;\n  }\n  WriteMemoryCommand(TraceCommandType::kMemoryRead, base_ptr, length, host_ptr);\n}\n\nvoid TraceWriter::WriteMemoryReadCached(uint32_t base_ptr, size_t length) {\n  if (!file_) {\n    return;\n  }\n\n  // HACK: length is guaranteed to be within 32-bits (guest memory)\n  uint64_t key = uint64_t(base_ptr) << 32 | uint64_t(length);\n  if (cached_memory_reads_.find(key) == cached_memory_reads_.end()) {\n    WriteMemoryCommand(TraceCommandType::kMemoryRead, base_ptr, length);\n    cached_memory_reads_.insert(key);\n  }\n}\n\nvoid TraceWriter::WriteMemoryReadCachedNop(uint32_t base_ptr, size_t length) {\n  if (!file_) {\n    return;\n  }\n\n  // HACK: length is guaranteed to be within 32-bits (guest memory)\n  uint64_t key = uint64_t(base_ptr) << 32 | uint64_t(length);\n  if (cached_memory_reads_.find(key) == cached_memory_reads_.end()) {\n    cached_memory_reads_.insert(key);\n  }\n}\n\nvoid TraceWriter::WriteMemoryWrite(uint32_t base_ptr, size_t length,\n                                   const void* host_ptr) {\n  if (!file_) {\n    return;\n  }\n  WriteMemoryCommand(TraceCommandType::kMemoryWrite, base_ptr, length,\n                     host_ptr);\n}\n\nclass SnappySink : public snappy::Sink {\n public:\n  SnappySink(FILE* file) : file_(file) {}\n\n  void Append(const char* bytes, size_t n) override {\n    fwrite(bytes, 1, n, file_);\n  }\n\n private:\n  FILE* file_ = nullptr;\n};\n\nvoid TraceWriter::WriteMemoryCommand(TraceCommandType type, uint32_t base_ptr,\n                                     size_t length, const void* host_ptr) {\n  MemoryCommand cmd = {};\n  cmd.type = type;\n  cmd.base_ptr = base_ptr;\n  cmd.encoding_format = MemoryEncodingFormat::kNone;\n  cmd.encoded_length = cmd.decoded_length = static_cast<uint32_t>(length);\n\n  if (!host_ptr) {\n    host_ptr = membase_ + cmd.base_ptr;\n  }\n\n  bool compress = compress_output_ && length > compression_threshold_;\n  if (compress) {\n    // Write the header now so we reserve space in the buffer.\n    long header_position = std::ftell(file_);\n    cmd.encoding_format = MemoryEncodingFormat::kSnappy;\n    fwrite(&cmd, 1, sizeof(cmd), file_);\n\n    // Stream the content right to the buffer.\n    snappy::ByteArraySource snappy_source(\n        reinterpret_cast<const char*>(host_ptr), cmd.decoded_length);\n    SnappySink snappy_sink(file_);\n    cmd.encoded_length =\n        static_cast<uint32_t>(snappy::Compress(&snappy_source, &snappy_sink));\n\n    // Seek back and overwrite the header with our final size.\n    std::fseek(file_, header_position, SEEK_SET);\n    fwrite(&cmd, 1, sizeof(cmd), file_);\n    std::fseek(file_, header_position + sizeof(cmd) + cmd.encoded_length,\n               SEEK_SET);\n  } else {\n    // Uncompressed - write buffer directly to the file.\n    cmd.encoding_format = MemoryEncodingFormat::kNone;\n    fwrite(&cmd, 1, sizeof(cmd), file_);\n    fwrite(host_ptr, 1, cmd.decoded_length, file_);\n  }\n}\n\nvoid TraceWriter::WriteEdramSnapshot(const void* snapshot) {\n  EdramSnapshotCommand cmd = {};\n  cmd.type = TraceCommandType::kEdramSnapshot;\n\n  if (compress_output_) {\n    // Write the header now so we reserve space in the buffer.\n    long header_position = std::ftell(file_);\n    cmd.encoding_format = MemoryEncodingFormat::kSnappy;\n    fwrite(&cmd, 1, sizeof(cmd), file_);\n\n    // Stream the content right to the buffer.\n    snappy::ByteArraySource snappy_source(\n        reinterpret_cast<const char*>(snapshot), xenos::kEdramSizeBytes);\n    SnappySink snappy_sink(file_);\n    cmd.encoded_length =\n        static_cast<uint32_t>(snappy::Compress(&snappy_source, &snappy_sink));\n\n    // Seek back and overwrite the header with our final size.\n    std::fseek(file_, header_position, SEEK_SET);\n    fwrite(&cmd, 1, sizeof(cmd), file_);\n    std::fseek(file_, header_position + sizeof(cmd) + cmd.encoded_length,\n               SEEK_SET);\n  } else {\n    // Uncompressed - write buffer directly to the file.\n    cmd.encoding_format = MemoryEncodingFormat::kNone;\n    cmd.encoded_length = xenos::kEdramSizeBytes;\n    fwrite(&cmd, 1, sizeof(cmd), file_);\n    fwrite(snapshot, 1, xenos::kEdramSizeBytes, file_);\n  }\n}\n\nvoid TraceWriter::WriteEvent(EventCommand::Type event_type) {\n  if (!file_) {\n    return;\n  }\n  EventCommand cmd = {\n      TraceCommandType::kEvent,\n      event_type,\n  };\n  fwrite(&cmd, 1, sizeof(cmd), file_);\n}\n\nvoid TraceWriter::WriteRegisters(uint32_t first_register,\n                                 const uint32_t* register_values,\n                                 uint32_t register_count,\n                                 bool execute_callbacks_on_play) {\n  RegistersCommand cmd = {};\n  cmd.type = TraceCommandType::kRegisters;\n  cmd.first_register = first_register;\n  cmd.register_count = register_count;\n  cmd.execute_callbacks = execute_callbacks_on_play;\n\n  uint32_t uncompressed_length = uint32_t(sizeof(uint32_t) * register_count);\n  if (compress_output_) {\n    // Write the header now so we reserve space in the buffer.\n    long header_position = std::ftell(file_);\n    cmd.encoding_format = MemoryEncodingFormat::kSnappy;\n    fwrite(&cmd, 1, sizeof(cmd), file_);\n\n    // Stream the content right to the buffer.\n    snappy::ByteArraySource snappy_source(\n        reinterpret_cast<const char*>(register_values), uncompressed_length);\n    SnappySink snappy_sink(file_);\n    cmd.encoded_length =\n        static_cast<uint32_t>(snappy::Compress(&snappy_source, &snappy_sink));\n\n    // Seek back and overwrite the header with our final size.\n    std::fseek(file_, header_position, SEEK_SET);\n    fwrite(&cmd, 1, sizeof(cmd), file_);\n    std::fseek(file_, header_position + sizeof(cmd) + cmd.encoded_length,\n               SEEK_SET);\n  } else {\n    // Uncompressed - write the values directly to the file.\n    cmd.encoding_format = MemoryEncodingFormat::kNone;\n    cmd.encoded_length = uncompressed_length;\n    fwrite(&cmd, 1, sizeof(cmd), file_);\n    fwrite(register_values, 1, uncompressed_length, file_);\n  }\n}\n\nvoid TraceWriter::WriteGammaRamp(\n    const reg::DC_LUT_30_COLOR* gamma_ramp_256_entry_table,\n    const reg::DC_LUT_PWL_DATA* gamma_ramp_pwl_rgb,\n    uint32_t gamma_ramp_rw_component) {\n  GammaRampCommand cmd = {};\n  cmd.type = TraceCommandType::kGammaRamp;\n  cmd.rw_component = uint8_t(gamma_ramp_rw_component);\n\n  constexpr uint32_t k256EntryTableUncompressedLength =\n      sizeof(reg::DC_LUT_30_COLOR) * 256;\n  constexpr uint32_t kPWLUncompressedLength =\n      sizeof(reg::DC_LUT_PWL_DATA) * 3 * 128;\n  constexpr uint32_t kUncompressedLength =\n      k256EntryTableUncompressedLength + kPWLUncompressedLength;\n  if (compress_output_) {\n    // Write the header now so we reserve space in the buffer.\n    long header_position = std::ftell(file_);\n    cmd.encoding_format = MemoryEncodingFormat::kSnappy;\n    fwrite(&cmd, 1, sizeof(cmd), file_);\n\n    // Stream the content right to the buffer.\n    {\n      std::unique_ptr<char[]> gamma_ramps(new char[kUncompressedLength]);\n      std::memcpy(gamma_ramps.get(), gamma_ramp_256_entry_table,\n                  k256EntryTableUncompressedLength);\n      std::memcpy(gamma_ramps.get() + k256EntryTableUncompressedLength,\n                  gamma_ramp_pwl_rgb, kPWLUncompressedLength);\n      snappy::ByteArraySource snappy_source(gamma_ramps.get(),\n                                            kUncompressedLength);\n      SnappySink snappy_sink(file_);\n      cmd.encoded_length =\n          static_cast<uint32_t>(snappy::Compress(&snappy_source, &snappy_sink));\n    }\n\n    // Seek back and overwrite the header with our final size.\n    std::fseek(file_, header_position, SEEK_SET);\n    fwrite(&cmd, 1, sizeof(cmd), file_);\n    std::fseek(file_, header_position + sizeof(cmd) + cmd.encoded_length,\n               SEEK_SET);\n  } else {\n    // Uncompressed - write the values directly to the file.\n    cmd.encoding_format = MemoryEncodingFormat::kNone;\n    cmd.encoded_length = kUncompressedLength;\n    fwrite(&cmd, 1, sizeof(cmd), file_);\n    fwrite(gamma_ramp_256_entry_table, 1, k256EntryTableUncompressedLength,\n           file_);\n    fwrite(gamma_ramp_pwl_rgb, 1, kPWLUncompressedLength, file_);\n  }\n}\n\n}  //  namespace gpu\n}  //  namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/trace_writer.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_TRACE_WRITER_H_\n#define XENIA_GPU_TRACE_WRITER_H_\n\n#include <filesystem>\n#include <set>\n#include <string>\n\n#include \"xenia/gpu/registers.h\"\n#include \"xenia/gpu/trace_protocol.h\"\n\nnamespace xe {\nnamespace gpu {\n\nclass TraceWriter {\n public:\n  explicit TraceWriter(uint8_t* membase);\n  ~TraceWriter();\n\n  bool is_open() const { return file_ != nullptr; }\n\n  bool Open(const std::filesystem::path& path, uint32_t title_id);\n  void Flush();\n  void Close();\n\n  void WritePrimaryBufferStart(uint32_t base_ptr, uint32_t count);\n  void WritePrimaryBufferEnd();\n  void WriteIndirectBufferStart(uint32_t base_ptr, uint32_t count);\n  void WriteIndirectBufferEnd();\n  void WritePacketStart(uint32_t base_ptr, uint32_t count);\n  void WritePacketEnd();\n  void WriteMemoryRead(uint32_t base_ptr, size_t length,\n                       const void* host_ptr = nullptr);\n  void WriteMemoryReadCached(uint32_t base_ptr, size_t length);\n  void WriteMemoryReadCachedNop(uint32_t base_ptr, size_t length);\n  void WriteMemoryWrite(uint32_t base_ptr, size_t length,\n                        const void* host_ptr = nullptr);\n  void WriteEdramSnapshot(const void* snapshot);\n  void WriteEvent(EventCommand::Type event_type);\n  void WriteRegisters(uint32_t first_register, const uint32_t* register_values,\n                      uint32_t register_count, bool execute_callbacks_on_play);\n  void WriteGammaRamp(const reg::DC_LUT_30_COLOR* gamma_ramp_256_entry_table,\n                      const reg::DC_LUT_PWL_DATA* gamma_ramp_pwl_rgb,\n                      uint32_t gamma_ramp_rw_component);\n\n private:\n  void WriteMemoryCommand(TraceCommandType type, uint32_t base_ptr,\n                          size_t length, const void* host_ptr = nullptr);\n\n  std::set<uint64_t> cached_memory_reads_;\n  uint8_t* membase_;\n  FILE* file_;\n\n  bool compress_output_ = true;\n  size_t compression_threshold_ = 1024;  // Min. number of bytes to compress.\n};\n\n}  // namespace gpu\n}  // namespace xe\n\n#endif  // XENIA_GPU_TRACE_WRITER_H_\n"
  },
  {
    "path": "src/xenia/gpu/ucode.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/ucode.h\"\n\nnamespace xe {\nnamespace gpu {\nnamespace ucode {\n\nconst AluScalarOpcodeInfo kAluScalarOpcodeInfos[64] = {\n    {\"adds\", 1, true, kAluOpChangedStateNone},\n    {\"adds_prev\", 1, false, kAluOpChangedStateNone},\n    {\"muls\", 1, true, kAluOpChangedStateNone},\n    {\"muls_prev\", 1, false, kAluOpChangedStateNone},\n    {\"muls_prev2\", 1, true, kAluOpChangedStateNone},\n    {\"maxs\", 1, true, kAluOpChangedStateNone},\n    {\"mins\", 1, true, kAluOpChangedStateNone},\n    {\"seqs\", 1, false, kAluOpChangedStateNone},\n    {\"sgts\", 1, false, kAluOpChangedStateNone},\n    {\"sges\", 1, false, kAluOpChangedStateNone},\n    {\"snes\", 1, false, kAluOpChangedStateNone},\n    {\"frcs\", 1, false, kAluOpChangedStateNone},\n    {\"truncs\", 1, false, kAluOpChangedStateNone},\n    {\"floors\", 1, false, kAluOpChangedStateNone},\n    {\"exp\", 1, false, kAluOpChangedStateNone},\n    {\"logc\", 1, false, kAluOpChangedStateNone},\n    {\"log\", 1, false, kAluOpChangedStateNone},\n    {\"rcpc\", 1, false, kAluOpChangedStateNone},\n    {\"rcpf\", 1, false, kAluOpChangedStateNone},\n    {\"rcp\", 1, false, kAluOpChangedStateNone},\n    {\"rsqc\", 1, false, kAluOpChangedStateNone},\n    {\"rsqf\", 1, false, kAluOpChangedStateNone},\n    {\"rsq\", 1, false, kAluOpChangedStateNone},\n    {\"maxas\", 1, true, kAluOpChangedStateAddressRegister},\n    {\"maxasf\", 1, true, kAluOpChangedStateAddressRegister},\n    {\"subs\", 1, true, kAluOpChangedStateNone},\n    {\"subs_prev\", 1, false, kAluOpChangedStateNone},\n    {\"setp_eq\", 1, false, kAluOpChangedStatePredicate},\n    {\"setp_ne\", 1, false, kAluOpChangedStatePredicate},\n    {\"setp_gt\", 1, false, kAluOpChangedStatePredicate},\n    {\"setp_ge\", 1, false, kAluOpChangedStatePredicate},\n    {\"setp_inv\", 1, false, kAluOpChangedStatePredicate},\n    {\"setp_pop\", 1, false, kAluOpChangedStatePredicate},\n    {\"setp_clr\", 0, false, kAluOpChangedStatePredicate},\n    {\"setp_rstr\", 1, false, kAluOpChangedStatePredicate},\n    {\"kills_eq\", 1, false, kAluOpChangedStatePixelKill},\n    {\"kills_gt\", 1, false, kAluOpChangedStatePixelKill},\n    {\"kills_ge\", 1, false, kAluOpChangedStatePixelKill},\n    {\"kills_ne\", 1, false, kAluOpChangedStatePixelKill},\n    {\"kills_one\", 1, false, kAluOpChangedStatePixelKill},\n    {\"sqrt\", 1, false, kAluOpChangedStateNone},\n    {\"opcode_41\", 0, false, kAluOpChangedStateNone},\n    {\"mulsc\", 2, false, kAluOpChangedStateNone},\n    {\"mulsc\", 2, false, kAluOpChangedStateNone},\n    {\"addsc\", 2, false, kAluOpChangedStateNone},\n    {\"addsc\", 2, false, kAluOpChangedStateNone},\n    {\"subsc\", 2, false, kAluOpChangedStateNone},\n    {\"subsc\", 2, false, kAluOpChangedStateNone},\n    {\"sin\", 1, false, kAluOpChangedStateNone},\n    {\"cos\", 1, false, kAluOpChangedStateNone},\n    {\"retain_prev\", 0, false, kAluOpChangedStateNone},\n    {\"opcode_51\", 0, false, kAluOpChangedStateNone},\n    {\"opcode_52\", 0, false, kAluOpChangedStateNone},\n    {\"opcode_53\", 0, false, kAluOpChangedStateNone},\n    {\"opcode_54\", 0, false, kAluOpChangedStateNone},\n    {\"opcode_55\", 0, false, kAluOpChangedStateNone},\n    {\"opcode_56\", 0, false, kAluOpChangedStateNone},\n    {\"opcode_57\", 0, false, kAluOpChangedStateNone},\n    {\"opcode_58\", 0, false, kAluOpChangedStateNone},\n    {\"opcode_59\", 0, false, kAluOpChangedStateNone},\n    {\"opcode_60\", 0, false, kAluOpChangedStateNone},\n    {\"opcode_61\", 0, false, kAluOpChangedStateNone},\n    {\"opcode_62\", 0, false, kAluOpChangedStateNone},\n    {\"opcode_63\", 0, false, kAluOpChangedStateNone},\n};\n\nconst AluVectorOpcodeInfo kAluVectorOpcodeInfos[32] = {\n    {\"add\", {0b1111, 0b1111}, kAluOpChangedStateNone},\n    {\"mul\", {0b1111, 0b1111}, kAluOpChangedStateNone},\n    {\"max\", {0b1111, 0b1111}, kAluOpChangedStateNone},\n    {\"min\", {0b1111, 0b1111}, kAluOpChangedStateNone},\n    {\"seq\", {0b1111, 0b1111}, kAluOpChangedStateNone},\n    {\"sgt\", {0b1111, 0b1111}, kAluOpChangedStateNone},\n    {\"sge\", {0b1111, 0b1111}, kAluOpChangedStateNone},\n    {\"sne\", {0b1111, 0b1111}, kAluOpChangedStateNone},\n    {\"frc\", {0b1111}, kAluOpChangedStateNone},\n    {\"trunc\", {0b1111}, kAluOpChangedStateNone},\n    {\"floor\", {0b1111}, kAluOpChangedStateNone},\n    {\"mad\", {0b1111, 0b1111, 0b1111}, kAluOpChangedStateNone},\n    {\"cndeq\", {0b1111, 0b1111, 0b1111}, kAluOpChangedStateNone},\n    {\"cndge\", {0b1111, 0b1111, 0b1111}, kAluOpChangedStateNone},\n    {\"cndgt\", {0b1111, 0b1111, 0b1111}, kAluOpChangedStateNone},\n    {\"dp4\", {0b1111, 0b1111}, kAluOpChangedStateNone},\n    {\"dp3\", {0b0111, 0b0111}, kAluOpChangedStateNone},\n    {\"dp2add\", {0b0011, 0b0011, 0b0001}, kAluOpChangedStateNone},\n    {\"cube\", {0b1111, 0b1111}, kAluOpChangedStateNone},\n    {\"max4\", {0b1111}, kAluOpChangedStateNone},\n    {\"setp_eq_push\", {0b1001, 0b1001}, kAluOpChangedStatePredicate},\n    {\"setp_ne_push\", {0b1001, 0b1001}, kAluOpChangedStatePredicate},\n    {\"setp_gt_push\", {0b1001, 0b1001}, kAluOpChangedStatePredicate},\n    {\"setp_ge_push\", {0b1001, 0b1001}, kAluOpChangedStatePredicate},\n    {\"kill_eq\", {0b1111, 0b1111}, kAluOpChangedStatePixelKill},\n    {\"kill_gt\", {0b1111, 0b1111}, kAluOpChangedStatePixelKill},\n    {\"kill_ge\", {0b1111, 0b1111}, kAluOpChangedStatePixelKill},\n    {\"kill_ne\", {0b1111, 0b1111}, kAluOpChangedStatePixelKill},\n    {\"dst\", {0b0110, 0b1010}, kAluOpChangedStateNone},\n    {\"maxa\", {0b1111, 0b1111}, kAluOpChangedStateAddressRegister},\n    {\"opcode_30\", {}, kAluOpChangedStateNone},\n    {\"opcode_31\", {}, kAluOpChangedStateNone},\n};\n\n}  // namespace ucode\n}  // namespace gpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/ucode.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_UCODE_H_\n#define XENIA_GPU_UCODE_H_\n\n#include <cstdint>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/platform.h\"\n#include \"xenia/gpu/xenos.h\"\n\n// The XNA Game Studio 3.1 contains Graphics.ShaderCompiler.AssembleFromSource,\n// which, for TargetPlatform.Xbox360, can validate and assemble Xbox 360 shader\n// microcode from Xbox 360 and Direct3D 9 shader assembly, returning the binary,\n// as well as validation warnings and errors and the disassembly via the warning\n// output. It is the primary source of information about the binary encoding of\n// the instructions, as well as valid usage of instruction parameters and\n// sequences.\n// https://www.microsoft.com/en-us/download/details.aspx?id=39\n// (XNAGS31_setup.exe)\n// Xenia provides a tool, tools/shader-playground, that invokes the assembler,\n// displays the binary and the disassembly from the official assembler, and also\n// shows the disassembly generated by Xenia, and passes it back to the assembler\n// to validate Xenia's microcode parsing and disassembly by checking if\n// reassembling the disassembly results in the same binary.\n//\n// The behavior and the parameters of some of the instructions were previously\n// documented on MSDN in the XNA Game Studio programming guide:\n// http://web.archive.org/web/20081211005537/http://msdn.microsoft.com/en-us/library/bb313877.aspx\n//\n// A great amount of documentation, such as the R400 sequencer specification and\n// the official emulator code, was made available during the LG Electronics,\n// Inc. v. ATI Technologies ULC \"Multi-thread Graphics Processing System\" patent\n// dispute IPR2015-00325, with the motion to seal having been denied due to \"a\n// strong public policy interest in making all information filed in an inter\n// partes review publicly available\". Most of the documents attached, however,\n// cover early versions - the development process - of the R400 architecture, so\n// there are some differences from the final Xenos GPU (DOT2ADDv is defined\n// differently, for example, and MUL/ADD/SUB_CONST are missing).\n// https://portal.unifiedpatents.com/ptab/case/IPR2015-00325\n//\n// Also, the R600, while having a different 5-scalar, as opposed to vec4|scalar,\n// parallelism model and instruction encodings and targeting Direct3D 10 rather\n// that 9, inherits a lot of instructions and architectural concepts from the\n// R400.\n// https://www.x.org/docs/AMD/old/r600isa.pdf\n// https://developer.amd.com/wordpress/media/2012/10/r600isa.pdf\n// https://developer.amd.com/wordpress/media/2012/10/R600_Instruction_Set_Architecture.pdf\n\n// Parts of this code also come from the freedreno project:\n// https://github.com/freedreno/freedreno/blob/master/includes/instr-a2xx.h\n/*\n * Copyright (c) 2012 Rob Clark <robdclark@gmail.com>\n *\n * Permission is hereby granted, free of charge, to any person obtaining a\n * copy of this software and associated documentation files (the \"Software\"),\n * to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense,\n * and/or sell copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice (including the next\n * paragraph) shall be included in all copies or substantial portions of the\n * Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\n * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n// Only 32-bit types (uint32_t, int32_t or enums with uint32_t / int32_t as the\n// underlying type) are allowed in the bit fields here, as Visual C++ restarts\n// packing when a field requires different alignment than the previous one.\n\nnamespace xe {\nnamespace gpu {\nnamespace ucode {\n\n// Defines control flow opcodes used to schedule instructions.\nenum class ControlFlowOpcode : uint32_t {\n  // No-op - used to fill space.\n  kNop = 0,\n  // Executes fetch or ALU instructions.\n  kExec = 1,\n  // Executes fetch or ALU instructions then ends execution.\n  kExecEnd = 2,\n  // Conditionally executes based on a bool const.\n  // PredicateClean = false.\n  kCondExec = 3,\n  // Conditionally executes based on a bool const then ends execution.\n  // PredicateClean = false.\n  // According to the IPR2015-00325 sequencer specification, execution ends only\n  // if the condition is actually met (unlike on the R600, where execution ends\n  // unconditionally if END_OF_PROGRAM is set in the control flow instruction).\n  // 4D5307ED has many shaders (used, in particular, in the Press Start screen\n  // background) with if / else in its tail done via cexece - cexece b130, then\n  // cexece !b130, and then an empty exece (if the condition was ignored, the\n  // second cexece would have never been reached). Also, the validator reports\n  // \"Shader will try to execute instruction 3.0, but last possible instruction\n  // is 2.1\" for a shader that contains just one cexece without an exece.\n  kCondExecEnd = 4,\n  // Conditionally executes based on the current predicate.\n  // Since 64 vertices or pixels are processed by each sequencer in the Xenos\n  // hardware, the actual condition is AND of the predicate values for all\n  // active (and not killed) invocations for (!p0) exec, and OR of them for\n  // (p0) exec - if any of the invocations passes the predicate check, all of\n  // them will enter the exec. This is according to the IPR2015-00325 sequencer\n  // specification. Because of this, the compiler makes the ALU and fetch\n  // instructions themselves inside a predicated exec predicated as well. The\n  // validator also reports mismatch between the control flow predication and\n  // ALU / fetch predication.\n  kCondExecPred = 5,\n  // Conditionally executes based on the current predicate then ends execution.\n  // According to the IPR2015-00325 sequencer specification, execution ends only\n  // if the condition is actually met for any of the invocations (unlike on the\n  // R600, where execution ends unconditionally if END_OF_PROGRAM is set in the\n  // control flow instruction).\n  kCondExecPredEnd = 6,\n  // Starts a loop that must be terminated with kLoopEnd, with depth of up to 4.\n  kLoopStart = 7,\n  // Continues or breaks out of a loop started with kLoopStart. According to the\n  // IPR2015-00325 sequencer specification, the incrementing of the loop\n  // iteration happens before the count and the predicated break checks.\n  kLoopEnd = 8,\n  // Conditionally calls a function, with depth of up to 4.\n  // A return address is pushed to the stack to be used by a kReturn.\n  kCondCall = 9,\n  // Returns from the current function as called by kCondCall.\n  // This is a no-op if not in a function.\n  kReturn = 10,\n  // Conditionally jumps to an arbitrary address based on a bool const.\n  kCondJmp = 11,\n  // Allocates output values.\n  kAlloc = 12,\n  // Conditionally executes based on a bool const.\n  // PredicateClean = true.\n  // This is cexec with a bool constant (kCondExec, can be verified by comparing\n  // the XNA disassembler output with cexec containing and not containing a setp\n  // instruction), not a kCondExecPred. kCondExec doesn't have a predicate clean\n  // field (the space is occupied by the bool constant index), while\n  // kCondExecPred itself does. This is unlike what the IPR2015-00325 sequencer\n  // specification says about the Conditional_Execute_Predicates_No_Stall\n  // instruction using this opcode (in the specification, this is described as\n  // behaving like kCondExecPred with PredicateClean = false, but the\n  // specification is likely highly outdated - it doesn't even have predicate\n  // clean fields in exec instructions overall).\n  kCondExecPredClean = 13,\n  // Conditionally executes based on a bool const then ends execution.\n  // PredicateClean = true.\n  kCondExecPredCleanEnd = 14,\n  // Hints that no more vertex fetches will be performed.\n  kMarkVsFetchDone = 15,\n};\n\n// Returns true if the given control flow opcode executes ALU or fetch\n// instructions.\nconstexpr bool IsControlFlowOpcodeExec(ControlFlowOpcode opcode) {\n  return opcode == ControlFlowOpcode::kExec ||\n         opcode == ControlFlowOpcode::kExecEnd ||\n         opcode == ControlFlowOpcode::kCondExec ||\n         opcode == ControlFlowOpcode::kCondExecEnd ||\n         opcode == ControlFlowOpcode::kCondExecPred ||\n         opcode == ControlFlowOpcode::kCondExecPredEnd ||\n         opcode == ControlFlowOpcode::kCondExecPredClean ||\n         opcode == ControlFlowOpcode::kCondExecPredCleanEnd;\n}\n\n// Returns true if the given control flow opcode terminates the shader after\n// executing.\nconstexpr bool DoesControlFlowOpcodeEndShader(ControlFlowOpcode opcode) {\n  return opcode == ControlFlowOpcode::kExecEnd ||\n         opcode == ControlFlowOpcode::kCondExecEnd ||\n         opcode == ControlFlowOpcode::kCondExecPredEnd ||\n         opcode == ControlFlowOpcode::kCondExecPredCleanEnd;\n}\n\n// See the description of ControlFlowOpcode::kCondExecPredClean.\nconstexpr bool DoesControlFlowCondExecHaveCleanPredicate(\n    ControlFlowOpcode opcode) {\n  return opcode == ControlFlowOpcode::kCondExecPredClean ||\n         opcode == ControlFlowOpcode::kCondExecPredCleanEnd;\n}\n\n// Determines whether addressing is based on a0 or aL.\nenum class AddressingMode : uint32_t {\n  // Indexing into register sets is done based on aL.\n  // This allows forms like c[aL + 5].\n  kRelative = 0,\n  // Indexing into register sets is done based on a0.\n  // This allows forms like c[a0 + 5].\n  kAbsolute = 1,\n};\n\n// Defines the type of a ControlFlowOpcode::kAlloc instruction.\n// The allocation is just a size reservation and there may be multiple in a\n// shader.\nenum class AllocType : uint32_t {\n  // ?\n  kNone = 0,\n  // Vertex shader exports a position.\n  kVsPosition = 1,\n  // Vertex shader exports interpolators.\n  kVsInterpolators = 2,\n  // Pixel shader exports colors.\n  kPsColors = 2,\n  // Memory export.\n  kMemory = 3,\n};\n\n// Instruction data for ControlFlowOpcode::kExec and kExecEnd.\nstruct ControlFlowExecInstruction {\n  ControlFlowOpcode opcode() const { return opcode_; }\n  AddressingMode addressing_mode() const { return address_mode_; }\n  // Address of the instructions to execute.\n  uint32_t address() const { return address_; }\n  // Number of instructions being executed.\n  uint32_t count() const { return count_; }\n  // Sequence bits, 2 per instruction.\n  // [0] - ALU (0) or fetch (1), [1] - serialize.\n  uint32_t sequence() const { return sequence_; }\n  bool is_predicate_clean() const { return is_predicate_clean_ == 1; }\n  // ?\n  bool is_yield() const { return is_yield_ == 1; }\n\n private:\n  // Word 0: (32 bits)\n  uint32_t address_ : 12;\n  uint32_t count_ : 3;\n  uint32_t is_yield_ : 1;\n  uint32_t sequence_ : 12;\n  uint32_t vc_hi_ : 4;  // Vertex cache?\n\n  // Word 1: (16 bits)\n  uint32_t vc_lo_ : 2;\n  uint32_t : 7;\n  // According to the description of Conditional_Execute_Predicates_No_Stall in\n  // the IPR2015-00325 sequencer specification, the sequencer's control flow\n  // logic will not wait for the predicate to be updated (apparently after this\n  // exec). The compiler specifies PredicateClean=false for the exec if the\n  // instructions inside it modify the predicate (but if the predicate set is\n  // only a refinement of the current predicate, like in case of a nested `if`,\n  // PredicateClean=true may still be set according to the IPR2015-00325\n  // sequencer specification, because the optimization would still work).\n  uint32_t is_predicate_clean_ : 1;\n  uint32_t : 1;\n  AddressingMode address_mode_ : 1;\n  ControlFlowOpcode opcode_ : 4;\n};\nstatic_assert_size(ControlFlowExecInstruction, sizeof(uint32_t) * 2);\n\n// Instruction data for ControlFlowOpcode::kCondExec, kCondExecEnd,\n// kCondExecPredClean and kCondExecPredCleanEnd.\nstruct ControlFlowCondExecInstruction {\n  ControlFlowOpcode opcode() const { return opcode_; }\n  AddressingMode addressing_mode() const { return address_mode_; }\n  // Address of the instructions to execute.\n  uint32_t address() const { return address_; }\n  // Number of instructions being executed.\n  uint32_t count() const { return count_; }\n  // Sequence bits, 2 per instruction.\n  // [0] - ALU (0) or fetch (1), [1] - serialize.\n  uint32_t sequence() const { return sequence_; }\n  // Constant index used as the conditional.\n  uint32_t bool_address() const { return bool_address_; }\n  // Required condition value of the comparision (true or false).\n  bool condition() const { return condition_ == 1; }\n  // ?\n  bool is_yield() const { return is_yield_ == 1; }\n\n private:\n  // Word 0: (32 bits)\n  uint32_t address_ : 12;\n  uint32_t count_ : 3;\n  uint32_t is_yield_ : 1;\n  uint32_t sequence_ : 12;\n  uint32_t vc_hi_ : 4;  // Vertex cache?\n\n  // Word 1: (16 bits)\n  uint32_t vc_lo_ : 2;\n  uint32_t bool_address_ : 8;\n  uint32_t condition_ : 1;\n  AddressingMode address_mode_ : 1;\n  ControlFlowOpcode opcode_ : 4;\n};\nstatic_assert_size(ControlFlowCondExecInstruction, sizeof(uint32_t) * 2);\n\n// Instruction data for ControlFlowOpcode::kCondExecPred and kCondExecPredEnd.\nstruct ControlFlowCondExecPredInstruction {\n  ControlFlowOpcode opcode() const { return opcode_; }\n  AddressingMode addressing_mode() const { return address_mode_; }\n  // Address of the instructions to execute.\n  uint32_t address() const { return address_; }\n  // Number of instructions being executed.\n  uint32_t count() const { return count_; }\n  // Sequence bits, 2 per instruction.\n  // [0] - ALU (0) or fetch (1), [1] - serialize.\n  uint32_t sequence() const { return sequence_; }\n  bool is_predicate_clean() const { return is_predicate_clean_ == 1; }\n  // Required condition value of the comparision (true or false).\n  bool condition() const { return condition_ == 1; }\n  // ?\n  bool is_yield() const { return is_yield_ == 1; }\n\n private:\n  // Word 0: (32 bits)\n  uint32_t address_ : 12;\n  uint32_t count_ : 3;\n  uint32_t is_yield_ : 1;\n  uint32_t sequence_ : 12;\n  uint32_t vc_hi_ : 4;  // Vertex cache?\n\n  // Word 1: (16 bits)\n  uint32_t vc_lo_ : 2;\n  uint32_t : 7;\n  uint32_t is_predicate_clean_ : 1;\n  uint32_t condition_ : 1;\n  AddressingMode address_mode_ : 1;\n  ControlFlowOpcode opcode_ : 4;\n};\nstatic_assert_size(ControlFlowCondExecPredInstruction, sizeof(uint32_t) * 2);\n\n// Instruction data for ControlFlowOpcode::kLoopStart.\nstruct ControlFlowLoopStartInstruction {\n  ControlFlowOpcode opcode() const { return opcode_; }\n  AddressingMode addressing_mode() const { return address_mode_; }\n  // Target address to jump to when skipping the loop (normally points to the\n  // instruction right after the `endloop` instruction).\n  uint32_t address() const { return address_; }\n  // Whether to reuse the current aL instead of reset it to loop start.\n  bool is_repeat() const { return is_repeat_; }\n  // Integer constant register that holds the loop parameters\n  // (xenos::LoopConstant).\n  uint32_t loop_id() const { return loop_id_; }\n\n private:\n  // Word 0: (32 bits)\n  uint32_t address_ : 13;\n  uint32_t is_repeat_ : 1;\n  uint32_t : 2;\n  uint32_t loop_id_ : 5;\n  uint32_t : 11;\n\n  // Word 1: (16 bits)\n  uint32_t : 11;\n  AddressingMode address_mode_ : 1;\n  ControlFlowOpcode opcode_ : 4;\n};\nstatic_assert_size(ControlFlowLoopStartInstruction, sizeof(uint32_t) * 2);\n\n// Instruction data for ControlFlowOpcode::kLoopEnd.\nstruct ControlFlowLoopEndInstruction {\n  ControlFlowOpcode opcode() const { return opcode_; }\n  AddressingMode addressing_mode() const { return address_mode_; }\n  // Target address of the start of the loop body (normally points to the\n  // instruction right after the `loop` instruction).\n  uint32_t address() const { return address_; }\n  // Integer constant register that holds the loop parameters\n  // (xenos::LoopConstant).\n  uint32_t loop_id() const { return loop_id_; }\n  // Break from the loop if the predicate in all 64 invocations matches the\n  // expected value.\n  bool is_predicated_break() const { return is_predicated_break_; }\n  // Required condition value of the comparision (true or false).\n  bool condition() const { return condition_ == 1; }\n\n private:\n  // Word 0: (32 bits)\n  uint32_t address_ : 13;\n  uint32_t : 3;\n  uint32_t loop_id_ : 5;\n  uint32_t is_predicated_break_ : 1;\n  uint32_t : 10;\n\n  // Word 1: (16 bits)\n  uint32_t : 10;\n  uint32_t condition_ : 1;\n  AddressingMode address_mode_ : 1;\n  ControlFlowOpcode opcode_ : 4;\n};\nstatic_assert_size(ControlFlowLoopEndInstruction, sizeof(uint32_t) * 2);\n\n// Instruction data for ControlFlowOpcode::kCondCall.\nstruct ControlFlowCondCallInstruction {\n  ControlFlowOpcode opcode() const { return opcode_; }\n  AddressingMode addressing_mode() const { return address_mode_; }\n  // Target address.\n  uint32_t address() const { return address_; }\n  // Unconditional call - ignores condition/predication.\n  bool is_unconditional() const { return is_unconditional_; }\n  // Whether the call is predicated (or conditional).\n  bool is_predicated() const { return is_predicated_; }\n  // Constant index used as the conditional.\n  uint32_t bool_address() const { return bool_address_; }\n  // Required condition value of the comparision (true or false).\n  bool condition() const { return condition_ == 1; }\n\n private:\n  // Word 0: (32 bits)\n  uint32_t address_ : 13;\n  uint32_t is_unconditional_ : 1;\n  uint32_t is_predicated_ : 1;\n  uint32_t : 17;\n\n  // Word 1: (16 bits)\n  uint32_t : 2;\n  uint32_t bool_address_ : 8;\n  uint32_t condition_ : 1;\n  AddressingMode address_mode_ : 1;\n  ControlFlowOpcode opcode_ : 4;\n};\nstatic_assert_size(ControlFlowCondCallInstruction, sizeof(uint32_t) * 2);\n\n// Instruction data for ControlFlowOpcode::kReturn.\nstruct ControlFlowReturnInstruction {\n  ControlFlowOpcode opcode() const { return opcode_; }\n  AddressingMode addressing_mode() const { return address_mode_; }\n\n private:\n  // Word 0: (32 bits)\n  uint32_t : 32;\n\n  // Word 1: (16 bits)\n  uint32_t : 11;\n  AddressingMode address_mode_ : 1;\n  ControlFlowOpcode opcode_ : 4;\n};\nstatic_assert_size(ControlFlowReturnInstruction, sizeof(uint32_t) * 2);\n\n// Instruction data for ControlFlowOpcode::kCondJmp.\nstruct ControlFlowCondJmpInstruction {\n  ControlFlowOpcode opcode() const { return opcode_; }\n  AddressingMode addressing_mode() const { return address_mode_; }\n  // Target address.\n  uint32_t address() const { return address_; }\n  // Unconditional jump - ignores condition/predication.\n  bool is_unconditional() const { return is_unconditional_; }\n  // Whether the jump is predicated (or conditional).\n  bool is_predicated() const { return is_predicated_; }\n  // Constant index used as the conditional.\n  uint32_t bool_address() const { return bool_address_; }\n  // Required condition value of the comparision (true or false).\n  bool condition() const { return condition_ == 1; }\n\n private:\n  // Word 0: (32 bits)\n  uint32_t address_ : 13;\n  uint32_t is_unconditional_ : 1;\n  uint32_t is_predicated_ : 1;\n  uint32_t : 17;\n\n  // Word 1: (16 bits)\n  uint32_t : 1;\n  uint32_t direction_ : 1;\n  uint32_t bool_address_ : 8;\n  uint32_t condition_ : 1;\n  AddressingMode address_mode_ : 1;\n  ControlFlowOpcode opcode_ : 4;\n};\nstatic_assert_size(ControlFlowCondJmpInstruction, sizeof(uint32_t) * 2);\n\n// Instruction data for ControlFlowOpcode::kAlloc.\nstruct ControlFlowAllocInstruction {\n  ControlFlowOpcode opcode() const { return opcode_; }\n  // The total number of the given type allocated by this instruction.\n  uint32_t size() const { return size_; }\n  // Unconditional jump - ignores condition/predication.\n  AllocType alloc_type() const { return alloc_type_; }\n\n private:\n  // Word 0: (32 bits)\n  uint32_t size_ : 3;\n  uint32_t : 29;\n\n  // Word 1: (16 bits)\n  uint32_t : 8;\n  uint32_t is_unserialized_ : 1;\n  AllocType alloc_type_ : 2;\n  uint32_t : 1;\n  ControlFlowOpcode opcode_ : 4;\n};\nstatic_assert_size(ControlFlowAllocInstruction, sizeof(uint32_t) * 2);\n\nunion ControlFlowInstruction {\n  ControlFlowOpcode opcode() const { return opcode_value; }\n\n  ControlFlowExecInstruction exec;                    // kExec*\n  ControlFlowCondExecInstruction cond_exec;           // kCondExec*\n  ControlFlowCondExecPredInstruction cond_exec_pred;  // kCondExecPred*\n  ControlFlowLoopStartInstruction loop_start;         // kLoopStart\n  ControlFlowLoopEndInstruction loop_end;             // kLoopEnd\n  ControlFlowCondCallInstruction cond_call;           // kCondCall\n  ControlFlowReturnInstruction ret;                   // kReturn\n  ControlFlowCondJmpInstruction cond_jmp;             // kCondJmp\n  ControlFlowAllocInstruction alloc;                  // kAlloc\n\n  struct {\n    uint32_t dword_0;\n    uint32_t dword_1;\n  };\n  struct {\n    uint32_t unused_0 : 32;\n    uint32_t unused_1 : 12;\n    ControlFlowOpcode opcode_value : 4;\n  };\n};\nstatic_assert_size(ControlFlowInstruction, sizeof(uint32_t) * 2);\n\ninline void UnpackControlFlowInstructions(const uint32_t* dwords,\n                                          ControlFlowInstruction* out_ab) {\n  uint32_t dword_0 = dwords[0];\n  uint32_t dword_1 = dwords[1];\n  uint32_t dword_2 = dwords[2];\n  out_ab[0].dword_0 = dword_0;\n  out_ab[0].dword_1 = dword_1 & 0xFFFF;\n  out_ab[1].dword_0 = (dword_1 >> 16) | (dword_2 << 16);\n  out_ab[1].dword_1 = dword_2 >> 16;\n}\n\nenum class FetchOpcode : uint32_t {\n  kVertexFetch = 0,\n\n  // http://web.archive.org/web/20090514012026/http://msdn.microsoft.com/en-us/library/bb313957.aspx\n  //\n  // Parameters:\n  // - UnnormalizedTextureCoords = false (default) / true.\n  //   Only taken into account if AddressU (1D) / AddressU/V (2D) / AddressU/V/W\n  //   (3D/cube) are all set to a non-wrapping mode. To access 1D textures that\n  //   are wider than 8192 texels, unnormalized texture coordinates must be\n  //   used.\n  // - MagFilter = point / linear / keep (default).\n  // - MinFilter = point / linear / keep (default).\n  // - MipFilter = point / linear / basemap (undocumented, but assembled) / keep\n  //   (default).\n  // - VolMagFilter (3D only) - \"filter used when the volume is magnified\"\n  //   (\"volume\" as opposed to \"texture\") - point / linear / keep (default).\n  // - VolMinFilter (3D only) - point / linear / keep (default).\n  // - AnisoFilter = disabled / max1to1 / max2to1 / max4to1 / max8to1 /\n  //   max16to1 / keep (default).\n  // - UseComputedLOD = false / true (default).\n  // - UseRegisterLOD = false (default) / true.\n  // - LODBias = -4.0...3.9375, in 1/16 increments. the default is 0.\n  // - OffsetX - value added to the x-component of the texel address right\n  //   before sampling = -8.0...7.5, in 1/2 increments, the default is 0.\n  // - OffsetY (2D, 3D and cube only) - similar to OffsetX.\n  // - OffsetZ (3D and cube only) - similar to OffsetX.\n  // - FetchValidOnly - performance booster, whether the data should be fetched\n  //   only for pixels inside the current primitive in a 2x2 quad (must be set\n  //   to false if the result itself is used to calculate gradients) = false /\n  //   true (default).\n  //\n  // Coordinates:\n  // - 1D: U (normalized or unnormalized)\n  // - 2D: U, V (normalized or unnormalized)\n  // - 3D (used for both 3D and stacked 2D texture): U, V, W (normalized or\n  //   unnormalized - same for both 3D W and stack layer; also VolMagFilter /\n  //   VolMinFilter between stack layers is supported, used for color correction\n  //   in 454107DC).\n  // - Cube: SC, TC (between 1 and 2 for normalized), face ID (0.0 to 5.0), the\n  //   cube vector ALU instruction is used to calculate them.\n  // https://gpuopen.com/learn/fetching-from-cubes-and-octahedrons/\n  // \"The 1.5 constant is designed such that the output face coordinate (v4 and\n  //  v5 in the above example) range is {1.0 <= x < 2.0} which has an advantage\n  //  in bit encoding compared to {0.0 <= x < 1.0} in that the upper mantissa\n  //  bits are constant throughout the entire output range.\"\n  //\n  // The total LOD for a sample is additive and is based on what is enabled.\n  //\n  // For cube maps, according to what texCUBEgrad compiles to in a modified\n  // HLSL shader of 455607D1 and to XNA assembler output for PC SM3 texldd,\n  // register gradients are in cube space (not in SC/TC space, unlike the\n  // coordinates themselves). This isn't true for the GCN, however.\n  //\n  // TODO(Triang3l): Find if gradients are unnormalized for cube maps if\n  // coordinates are unnormalized. Since texldd doesn't perform any\n  // transformation for gradients (unlike for the coordinates themselves),\n  // gradients are probably in cube space, which is -MA...MA, and LOD\n  // calculation involves gradients in this space, so probably gradients\n  // shouldn't be unnormalized.\n  //\n  // Adreno has only been supporting seamless cube map sampling since 3xx, so\n  // the Xenos likely doesn't support seamless sampling:\n  // https://developer.qualcomm.com/qfile/28557/80-nu141-1_b_adreno_opengl_es_developer_guide.pdf\n  //\n  // Offsets are likely applied at the LOD at which the texture is sampled (not\n  // sure if to the higher-quality or to both - though \"right before sampling\"\n  // probably means to both - in Direct3D 10, it's recommended to only use\n  // offsets at integer mip levels, otherwise \"you may get results that do not\n  // translate well to hardware\".\n  kTextureFetch = 1,\n\n  // Gets the fraction of border color that would be blended into the texture\n  // data at the specified coordinates into the X component of the destination.\n  // http://web.archive.org/web/20090512001222/http://msdn.microsoft.com/en-us/library/bb313945.aspx\n  //\n  // According to MSDN, this may take all the parameters that tfetch takes.\n  kGetTextureBorderColorFrac = 16,\n\n  // Gets the LOD for all of the pixels in the quad at the specified coordinates\n  // into the X component of the destination.\n  // http://web.archive.org/web/20090511233056/http://msdn.microsoft.com/en-us/library/bb313949.aspx\n  //\n  // According to MSDN, the only valid parameters for this are\n  // UnnormalizedTextureCoords, AnisoFilter, VolMagFilter and VolMinFilter.\n  // However, while XNA assembler rejects LODBias, it assembles UseComputedLOD /\n  // UseRegisterLOD / UseRegisterGradients for it. It's unlikely that it takes\n  // the LOD bias into account, because a getCompTexLOD + tfetch combination\n  // with biases in both would result in double biasing (though not sure whether\n  // grad_exp_adjust_h/v apply - in a getCompTexLOD + tfetch with\n  // UseComputedLOD=false pair, gradient exponent adjustment is more logical to\n  // be applied here). MipFilter also can't be overriden, the XNA assembler does\n  // not assemble this instruction at all with MipFilter, so it's possible that\n  // the mip filtering mode has no effect on the result (possibly should be\n  // treated as linear - so fractional biasing can be done before rounding).\n  //\n  // Valid only in pixel shaders. Since the documentation says \"for all of the\n  // pixels in the quad\" (with explicit gradients, this may diverge), and this\n  // instruction doesn't assemble at all in vertex shaders, even with\n  // UseRegisterGradients=true, it's possible that only implicit gradients may\n  // be used in this instruction.\n  //\n  // Used with AnisoFilter=max16to1 in one place in the Source Engine.\n  //\n  // Not sure if the LOD should be clamped - probably not, considering an\n  // out-of-range LOD passed from getCompTexLOD to setTexLOD may be biased back\n  // into the range later.\n  kGetTextureComputedLod = 17,\n\n  // Source is 2-component. XZ = ddx(source.xy), YW = ddy(source.xy).\n  // TODO(Triang3l): Verify whether it's coarse or fine (on Adreno 200, for\n  // instance). This is using the texture unit, where the LOD is computed for\n  // the whole quad (according to the Direct3D 11.3 specification), so likely\n  // coarse; ddx / ddy from the Shader Model 4 era is also compiled by FXC to\n  // deriv_rtx/rty_coarse when targeting Shader Model 5, and on TeraScale,\n  // coarse / fine selection only appeared on Direct3D 11 GPUs.\n  kGetTextureGradients = 18,\n\n  // Gets the weights used in a bilinear fetch.\n  // http://web.archive.org/web/20090511230938/http://msdn.microsoft.com/en-us/library/bb313953.aspx\n  // X - horizontal lerp factor.\n  // Y - vertical lerp factor.\n  // Z - depth lerp factor.\n  // W - mip lerp factor.\n  //\n  // According to MSDN, this may take all the parameters that tfetch takes.\n  //\n  // Takes filtering mode into account - in some games, used explicitly with\n  // MagFilter=linear, MinFilter=linear. Source Engine explicitly uses this with\n  // UseComputedLOD=false while only using XY of the result. Offsets and LOD\n  // biasing also apply. Likely the factors are at the higher-quality LOD of the\n  // pair used for filtering, though not checked.\n  //\n  // For cube maps, the factors are probably in SC/TC space (not sure what the\n  // depth lerp factor means in case of them), since apparently there's no\n  // seamless cube map sampling on the Xenos.\n  kGetTextureWeights = 19,\n\n  // Source is 1-component.\n  kSetTextureLod = 24,\n  // Source is 3-component.\n  kSetTextureGradientsHorz = 25,\n  // Source is 3-component.\n  kSetTextureGradientsVert = 26,\n};\n\nenum class FetchDestinationSwizzle {\n  // The component indices are absolute (not relative to the component itself,\n  // unlike in ALU operation sources).\n  kX = 0,\n  kY = 1,\n  kZ = 2,\n  kW = 3,\n  k0 = 4,\n  k1 = 5,\n  // Keep the current value of the destination register (don't write).\n  kKeep = 7,\n};\n\nconstexpr FetchDestinationSwizzle GetFetchDestinationComponentSwizzle(\n    uint32_t swizzle, uint32_t component) {\n  return FetchDestinationSwizzle((swizzle >> (3 * component)) & 0b111);\n}\n\nstruct alignas(uint32_t) VertexFetchInstruction {\n  FetchOpcode opcode() const { return data_.opcode_value; }\n\n  // Whether the jump is predicated (or conditional).\n  bool is_predicated() const { return data_.is_predicated; }\n  // Required condition value of the comparision (true or false).\n  bool predicate_condition() const { return data_.pred_condition == 1; }\n  // Vertex fetch constant index [0-95].\n  // Applicable only to vfetch_full (the address from vfetch_full is reused in\n  // vfetch_mini).\n  uint32_t fetch_constant_index() const {\n    return data_.const_index * 3 + data_.const_index_sel;\n  }\n\n  uint32_t dest() const { return data_.dst_reg; }\n  uint32_t dest_swizzle() const { return data_.dst_swiz; }\n  bool is_dest_relative() const { return data_.dst_reg_am; }\n  // The source is applicable only to vfetch_full (the address from vfetch_full\n  // is reused in vfetch_mini).\n  uint32_t src() const { return data_.src_reg; }\n  uint32_t src_swizzle() const { return data_.src_swiz; }\n  bool is_src_relative() const { return data_.src_reg_am; }\n\n  uint32_t prefetch_count() const { return data_.prefetch_count; }\n  bool is_mini_fetch() const { return data_.is_mini_fetch == 1; }\n\n  xenos::VertexFormat data_format() const { return data_.format; }\n  // [-32, 31]\n  int exp_adjust() const { return data_.exp_adjust; }\n  bool is_signed() const { return data_.fomat_comp_all == 1; }\n  bool is_normalized() const { return data_.num_format_all == 0; }\n  xenos::SignedRepeatingFractionMode signed_rf_mode() const {\n    return data_.signed_rf_mode_all;\n  }\n  // If true, the floating-point index is rounded to the nearest integer (likely\n  // as floor(index + 0.5) because rounding to the nearest even makes no sense\n  // for addressing, both 1.5 and 2.5 would be 2).\n  // Otherwise, it's floored (rounded towards negative infinity).\n  // Applicable only to vfetch_full (the address from vfetch_full is reused in\n  // vfetch_mini).\n  // http://web.archive.org/web/20090914055358/http://msdn.microsoft.com/en-us/library/bb313960.aspx\n  bool is_index_rounded() const { return data_.is_index_rounded == 1; }\n  // Dword stride, [0, 255].\n  // Applicable only to vfetch_full (the address from vfetch_full is reused in\n  // vfetch_mini).\n  uint32_t stride() const { return data_.stride; }\n  // Dword offset, [-4194304, 4194303].\n  int32_t offset() const { return data_.offset; }\n\n private:\n  struct Data {\n    struct {\n      FetchOpcode opcode_value : 5;\n      uint32_t src_reg : 6;\n      uint32_t src_reg_am : 1;\n      uint32_t dst_reg : 6;\n      uint32_t dst_reg_am : 1;\n      uint32_t must_be_one : 1;\n      uint32_t const_index : 5;\n      uint32_t const_index_sel : 2;\n      // Prefetch count minus 1.\n      uint32_t prefetch_count : 3;\n      // Absolute, one component.\n      uint32_t src_swiz : 2;\n    };\n    struct {\n      uint32_t dst_swiz : 12;\n      uint32_t fomat_comp_all : 1;\n      uint32_t num_format_all : 1;\n      xenos::SignedRepeatingFractionMode signed_rf_mode_all : 1;\n      uint32_t is_index_rounded : 1;\n      xenos::VertexFormat format : 6;\n      uint32_t reserved2 : 2;\n      int32_t exp_adjust : 6;\n      uint32_t is_mini_fetch : 1;\n      uint32_t is_predicated : 1;\n    };\n    struct {\n      uint32_t stride : 8;\n      int32_t offset : 23;\n      uint32_t pred_condition : 1;\n    };\n  };\n  Data data_;\n};\nstatic_assert_size(VertexFetchInstruction, sizeof(uint32_t) * 3);\n\nstruct alignas(uint32_t) TextureFetchInstruction {\n  FetchOpcode opcode() const { return data_.opcode_value; }\n\n  // Whether the jump is predicated (or conditional).\n  bool is_predicated() const { return data_.is_predicated; }\n  // Required condition value of the comparision (true or false).\n  bool predicate_condition() const { return data_.pred_condition == 1; }\n  // Texture fetch constant index [0-31].\n  uint32_t fetch_constant_index() const { return data_.const_index; }\n\n  uint32_t dest() const { return data_.dst_reg; }\n  uint32_t dest_swizzle() const { return data_.dst_swiz; }\n  bool is_dest_relative() const { return data_.dst_reg_am; }\n  uint32_t src() const { return data_.src_reg; }\n  uint32_t src_swizzle() const { return data_.src_swiz; }\n  bool is_src_relative() const { return data_.src_reg_am; }\n\n  xenos::FetchOpDimension dimension() const { return data_.dimension; }\n  bool fetch_valid_only() const { return data_.fetch_valid_only == 1; }\n  bool unnormalized_coordinates() const { return data_.tx_coord_denorm == 1; }\n  bool has_mag_filter() const {\n    return data_.mag_filter != xenos::TextureFilter::kUseFetchConst;\n  }\n  xenos::TextureFilter mag_filter() const { return data_.mag_filter; }\n  bool has_min_filter() const {\n    return data_.min_filter != xenos::TextureFilter::kUseFetchConst;\n  }\n  xenos::TextureFilter min_filter() const { return data_.min_filter; }\n  bool has_mip_filter() const {\n    return data_.mip_filter != xenos::TextureFilter::kUseFetchConst;\n  }\n  xenos::TextureFilter mip_filter() const { return data_.mip_filter; }\n  bool has_aniso_filter() const {\n    return data_.aniso_filter != xenos::AnisoFilter::kUseFetchConst;\n  }\n  xenos::AnisoFilter aniso_filter() const { return data_.aniso_filter; }\n  bool has_vol_mag_filter() const {\n    return data_.vol_mag_filter != xenos::TextureFilter::kUseFetchConst;\n  }\n  xenos::TextureFilter vol_mag_filter() const { return data_.vol_mag_filter; }\n  bool has_vol_min_filter() const {\n    return data_.vol_min_filter != xenos::TextureFilter::kUseFetchConst;\n  }\n  xenos::TextureFilter vol_min_filter() const { return data_.vol_min_filter; }\n  bool use_computed_lod() const { return data_.use_comp_lod == 1; }\n  bool use_register_lod() const { return data_.use_reg_lod == 1; }\n  bool use_register_gradients() const { return data_.use_reg_gradients == 1; }\n  xenos::SampleLocation sample_location() const {\n    return data_.sample_location;\n  }\n  float lod_bias() const {\n    // http://web.archive.org/web/20090514012026/http://msdn.microsoft.com:80/en-us/library/bb313957.aspx\n    return data_.lod_bias * (1.0f / 16.0f);\n  }\n  float offset_x() const { return data_.offset_x * 0.5f; }\n  float offset_y() const { return data_.offset_y * 0.5f; }\n  float offset_z() const { return data_.offset_z * 0.5f; }\n\n private:\n  struct Data {\n    struct {\n      FetchOpcode opcode_value : 5;\n      uint32_t src_reg : 6;\n      uint32_t src_reg_am : 1;\n      uint32_t dst_reg : 6;\n      uint32_t dst_reg_am : 1;\n      uint32_t fetch_valid_only : 1;\n      uint32_t const_index : 5;\n      uint32_t tx_coord_denorm : 1;\n      // Absolute, three components.\n      uint32_t src_swiz : 6;\n    };\n    struct {\n      uint32_t dst_swiz : 12;\n      xenos::TextureFilter mag_filter : 2;\n      xenos::TextureFilter min_filter : 2;\n      xenos::TextureFilter mip_filter : 2;\n      xenos::AnisoFilter aniso_filter : 3;\n      xenos::ArbitraryFilter arbitrary_filter : 3;\n      xenos::TextureFilter vol_mag_filter : 2;\n      xenos::TextureFilter vol_min_filter : 2;\n      uint32_t use_comp_lod : 1;\n      uint32_t use_reg_lod : 1;\n      uint32_t unk : 1;\n      uint32_t is_predicated : 1;\n    };\n    struct {\n      uint32_t use_reg_gradients : 1;\n      xenos::SampleLocation sample_location : 1;\n      int32_t lod_bias : 7;\n      uint32_t unused : 5;\n      xenos::FetchOpDimension dimension : 2;\n      int32_t offset_x : 5;\n      int32_t offset_y : 5;\n      int32_t offset_z : 5;\n      uint32_t pred_condition : 1;\n    };\n  };\n  Data data_;\n};\nstatic_assert_size(TextureFetchInstruction, sizeof(uint32_t) * 3);\n\nunion alignas(uint32_t) FetchInstruction {\n public:\n  FetchOpcode opcode() const { return data_.opcode_value; }\n\n  // Whether the jump is predicated (or conditional).\n  bool is_predicated() const { return data_.is_predicated; }\n  // Required condition value of the comparision (true or false).\n  bool predicate_condition() const { return data_.pred_condition == 1; }\n\n  uint32_t dest() const { return data_.dst_reg; }\n  uint32_t dest_swizzle() const { return data_.dst_swiz; }\n  bool is_dest_relative() const { return data_.dst_reg_am; }\n  uint32_t src() const { return data_.src_reg; }\n  bool is_src_relative() const { return data_.src_reg_am; }\n\n  // For FetchOpcode::kVertexFetch.\n  const VertexFetchInstruction& vertex_fetch() const { return vertex_fetch_; }\n  // For operations other than FetchOpcode::kVertexFetch.\n  const TextureFetchInstruction& texture_fetch() const {\n    return texture_fetch_;\n  }\n\n private:\n  struct Data {\n    struct {\n      FetchOpcode opcode_value : 5;\n      uint32_t src_reg : 6;\n      uint32_t src_reg_am : 1;\n      uint32_t dst_reg : 6;\n      uint32_t dst_reg_am : 1;\n      // Specific to vertex or texture fetch.\n      uint32_t : 1;\n      // [0-31], points to one tf# or three vf# constants.\n      uint32_t const_index : 5;\n      // Specific to vertex or texture fetch.\n      uint32_t : 7;\n    };\n    struct {\n      uint32_t dst_swiz : 12;\n      // Specific to vertex or texture fetch.\n      uint32_t : 19;\n      uint32_t is_predicated : 1;\n    };\n    struct {\n      // Specific to vertex or texture fetch.\n      uint32_t : 31;\n      uint32_t pred_condition : 1;\n    };\n  };\n  Data data_;\n  VertexFetchInstruction vertex_fetch_;\n  TextureFetchInstruction texture_fetch_;\n};\nstatic_assert_size(FetchInstruction, sizeof(uint32_t) * 3);\n\n// What follows is largely a mash up of the microcode assembly naming and the\n// R600 docs that have a near 1:1 with the instructions available in the Xenos\n// GPU, and Adreno 2xx instruction names found in Freedreno. Some of the\n// behavior has been experimentally verified. Some has been guessed. Some\n// instructions are implemented in the Exhibit 2092 - sq_alu of IPR2015-00325,\n// however, the code provided there is early and incomplete.\n//\n// Conventions:\n// - All temporary registers are vec4s.\n// - Most scalar ALU operations work with one or two components of the source\n//   register or the float constant passed as the third operand of the whole\n//   co-issued ALU operation, denoted by `a` (the left-hand operand) and `b`\n//   (the right-hand operand).\n//   `a` is the [(3 + src3_swizzle[6:7]) & 3] component (W - alpha).\n//   `b` is the [(0 + src3_swizzle[0:1]) & 3] component (X - red).\n// - mulsc, addsc, subsc scalar ALU operations accept two operands - a float\n//   constant with the `a` (W) swizzle (addressed by the third operand index and\n//   addressing mode) being the left-hand operand, and a temporary register with\n//   the `b` (X) swizzle with the index constructed from:\n//   - [0:0] = scalar_opcode[0:0]\n//   - [1:1] = src3_sel[0:0]\n//   - [2:5] = src3_swizzle[2:5]\n//   abs_constants and third source's negation are applied to both the constant\n//   and the temporary register.\n// - Some scalar ALU instructions don't have operands.\n// - Scalar ALU operations replicate the result into all masked components.\n// - Overall, the WXYZ order is pretty commonly used in the Exhibit 2092 -\n//   sq_alu of IPR2015-00325, this is where the AB = WX order of scalar operands\n//   likely comes from. Vector predicate instructions also involve the W and X\n//   components, and in IPR2015-00325 sq_alu, individual components in the\n//   emulated vector instructions are handled in the WXYZ order. However, max4's\n//   \"greater than the rest\" check order is RGBA (XYZW) there. dp4, though, sums\n//   the products in WXYZ order in IPR2015-00325 sq_alu (but in XYZW order on\n//   MSDN).\n// - ps is the previous result of a scalar ALU operation. It is not modified\n//   when the instruction that would write it fails its predication check.\n// - Direct3D 9 rules (like in GCN v_*_legacy_f32 instructions) for\n//   multiplication (+-0 or denormal * anything = +0) wherever it's present\n//   (mul, mad, dp, etc.) and for NaN in min/max. It's very important to respect\n//   this rule for multiplication, as games often rely on it in vector\n//   normalization (rcp and mul), Infinity * 0 resulting in NaN breaks a lot of\n//   things in games - causes white screen in 4D5307E6, white specular on\n//   characters in 545407F2. The result is always positive zero in this case, no\n//   matter what the signs of the other operands are, according to R5xx\n//   Acceleration section 8.7.5 \"Legacy multiply behavior\" and testing on\n//   Adreno 200. This means that the following need to be taken into account\n//   (according to 8.7.2 \"ALU Non-Transcendental Floating Point\"):\n//   - +0 * -0 is -0 with IEEE conformance, however, with this legacy SM3\n//     handling, it should result in +0.\n//   - +0 + -0 is +0, so multiply-add should not be replaced with conditional\n//     move of the third operand in case of zero multiplicands, because the term\n//     may be -0, while the result should be +0 in this case.\n//   http://developer.amd.com/wordpress/media/2013/10/R5xx_Acceleration_v1.5.pdf\n//   Multiply-add also appears to be not fused; the SM3 behavior instruction on\n//   GCN is called v_mad_legacy_f32, not v_fma_legacy_f32 (in 2012-2020, before\n//   RDNA 2, which removed v_mad_f32 as well) - shader translators should not\n//   use instructions that may be interpreted by the host GPU as fused\n//   multiply-add.\n\n// For analysis of shaders and skipping instructions that write nothing.\nenum AluOpChangedState {\n  kAluOpChangedStateNone = 0,\n  kAluOpChangedStateAddressRegister = 1 << 0,\n  kAluOpChangedStatePredicate = 1 << 1,\n  kAluOpChangedStatePixelKill = 1 << 2,\n};\n\nenum class AluScalarOpcode : uint32_t {\n  // Floating-Point Add\n  // adds/ADDs dest, src0.ab\n  //     dest.xyzw = src0.a + src0.b;\n  kAdds = 0,\n\n  // Floating-Point Add (with Previous)\n  // adds_prev/ADD_PREVs dest, src0.a\n  //     dest.xyzw = src0.a + ps;\n  kAddsPrev = 1,\n\n  // Floating-Point Multiply\n  // muls/MULs dest, src0.ab\n  //     dest.xyzw = src0.a * src0.b;\n  kMuls = 2,\n\n  // Floating-Point Multiply (with Previous)\n  // muls_prev/MUL_PREVs dest, src0.a\n  //     dest.xyzw = src0.a * ps;\n  kMulsPrev = 3,\n\n  // Scalar Multiply Emulating LIT Operation\n  // muls_prev2/MUL_PREV2s dest, src0.ab\n  //    dest.xyzw =\n  //        ps == -FLT_MAX || !isfinite(ps) || !isfinite(src0.b) || src0.b <= 0\n  //        ? -FLT_MAX : src0.a * ps;\n  kMulsPrev2 = 4,\n\n  // Floating-Point Maximum\n  // maxs/MAXs dest, src0.ab\n  //     dest.xyzw = src0.a >= src0.b ? src0.a : src0.b;\n  kMaxs = 5,\n\n  // Floating-Point Minimum\n  // mins/MINs dest, src0.ab\n  //     dest.xyzw = src0.a < src0.b ? src0.a : src0.b;\n  kMins = 6,\n\n  // Floating-Point Set If Equal\n  // seqs/SETEs dest, src0.a\n  //     dest.xyzw = src0.a == 0.0 ? 1.0 : 0.0;\n  kSeqs = 7,\n\n  // Floating-Point Set If Greater Than\n  // sgts/SETGTs dest, src0.a\n  //     dest.xyzw = src0.a > 0.0 ? 1.0 : 0.0;\n  kSgts = 8,\n\n  // Floating-Point Set If Greater Than Or Equal\n  // sges/SETGTEs dest, src0.a\n  //     dest.xyzw = src0.a >= 0.0 ? 1.0 : 0.0;\n  kSges = 9,\n\n  // Floating-Point Set If Not Equal\n  // snes/SETNEs dest, src0.a\n  //     dest.xyzw = src0.a != 0.0 ? 1.0 : 0.0;\n  kSnes = 10,\n\n  // Floating-Point Fractional\n  // frcs/FRACs dest, src0.a\n  //     dest.xyzw = src0.a - floor(src0.a);\n  kFrcs = 11,\n\n  // Floating-Point Truncate\n  // truncs/TRUNCs dest, src0.a\n  //     dest.xyzw = src0.a >= 0 ? floor(src0.a) : -floor(-src0.a);\n  kTruncs = 12,\n\n  // Floating-Point Floor\n  // floors/FLOORs dest, src0.a\n  //     dest.xyzw = floor(src0.a);\n  kFloors = 13,\n\n  // Scalar Base-2 Exponent, IEEE\n  // exp/EXP_IEEE dest, src0.a\n  //     dest.xyzw = src0.a == 0.0 ? 1.0 : pow(2, src0.a);\n  kExp = 14,\n\n  // Scalar Base-2 Log\n  // logc/LOG_CLAMP dest, src0.a\n  //     float t = src0.a == 1.0 ? 0.0 : log(src0.a) / log(2.0);\n  //     dest.xyzw = t == -INF ? -FLT_MAX : t;\n  kLogc = 15,\n\n  // Scalar Base-2 IEEE Log\n  // log/LOG_IEEE dest, src0.a\n  //     dest.xyzw = src0.a == 1.0 ? 0.0 : log(src0.a) / log(2.0);\n  kLog = 16,\n\n  // Scalar Reciprocal, Clamp to Maximum\n  // rcpc/RECIP_CLAMP dest, src0.a\n  //     float t = src0.a == 1.0 ? 1.0 : 1.0 / src0.a;\n  //     if (t == -INF) t = -FLT_MAX;\n  //     else if (t == INF) t = FLT_MAX;\n  //     dest.xyzw = t;\n  kRcpc = 17,\n\n  // Scalar Reciprocal, Clamp to Zero\n  // Mimicking the behavior of the fixed-function pipeline.\n  // rcpf/RECIP_FF dest, src0.a\n  //     float t = src0.a == 1.0 ? 1.0 : 1.0 / src0.a;\n  //     if (t == -INF) t = -0.0;\n  //     else if (t == INF) t = 0.0;\n  //     dest.xyzw = t;\n  kRcpf = 18,\n\n  // Scalar Reciprocal, IEEE Approximation\n  // rcp/RECIP_IEEE dest, src0.a\n  //     dest.xyzw = src0.a == 1.0 ? 1.0 : 1.0 / src0.a;\n  kRcp = 19,\n\n  // Scalar Reciprocal Square Root, Clamp to Maximum\n  // rsqc/RECIPSQ_CLAMP dest, src0.a\n  //     float t = src0.a == 1.0 ? 1.0 : 1.0 / sqrt(src0.a);\n  //     if (t == -INF) t = -FLT_MAX;\n  //     else if (t == INF) t = FLT_MAX;\n  //     dest.xyzw = t;\n  kRsqc = 20,\n\n  // Scalar Reciprocal Square Root, Clamp to Zero\n  // rsqf/RECIPSQ_FF dest, src0.a\n  //     float t = src0.a == 1.0 ? 1.0 : 1.0 / sqrt(src0.a);\n  //     if (t == -INF) t = -0.0;\n  //     else if (t == INF) t = 0.0;\n  //     dest.xyzw = t;\n  kRsqf = 21,\n\n  // Scalar Reciprocal Square Root, IEEE Approximation\n  // rsq/RECIPSQ_IEEE dest, src0.a\n  //     dest.xyzw = src0.a == 1.0 ? 1.0 : 1.0 / sqrt(src0.a);\n  kRsq = 22,\n\n  // Floating-Point Maximum with Copy To Integer in AR\n  // maxas dest, src0.ab\n  // movas/MOVAs dest, src0.aa\n  //     a0 = (int)clamp(floor(src0.a + 0.5), -256.0, 255.0);\n  //     dest.xyzw = src0.a >= src0.b ? src0.a : src0.b;\n  kMaxAs = 23,\n\n  // Floating-Point Maximum with Copy Truncated To Integer in AR\n  // maxasf dest, src0.ab\n  // movasf/MOVA_FLOORs dest, src0.aa\n  //     a0 = (int)clamp(floor(src0.a), -256.0, 255.0);\n  //     dest.xyzw = src0.a >= src0.b ? src0.a : src0.b;\n  kMaxAsf = 24,\n\n  // Floating-Point Subtract\n  // subs/SUBs dest, src0.ab\n  //     dest.xyzw = src0.a - src0.b;\n  kSubs = 25,\n\n  // Floating-Point Subtract (with Previous)\n  // subs_prev/SUB_PREVs dest, src0.a\n  //     dest.xyzw = src0.a - ps;\n  kSubsPrev = 26,\n\n  // Floating-Point Predicate Set If Equal\n  // setp_eq/PRED_SETEs dest, src0.a\n  //     if (src0.a == 0.0) {\n  //       dest.xyzw = 0.0;\n  //       p0 = 1;\n  //     } else {\n  //       dest.xyzw = 1.0;\n  //       p0 = 0;\n  //     }\n  kSetpEq = 27,\n\n  // Floating-Point Predicate Set If Not Equal\n  // setp_ne/PRED_SETNEs dest, src0.a\n  //     if (src0.a != 0.0) {\n  //       dest.xyzw = 0.0;\n  //       p0 = 1;\n  //     } else {\n  //       dest.xyzw = 1.0;\n  //       p0 = 0;\n  //     }\n  kSetpNe = 28,\n\n  // Floating-Point Predicate Set If Greater Than\n  // setp_gt/PRED_SETGTs dest, src0.a\n  //     if (src0.a > 0.0) {\n  //       dest.xyzw = 0.0;\n  //       p0 = 1;\n  //     } else {\n  //       dest.xyzw = 1.0;\n  //       p0 = 0;\n  //     }\n  kSetpGt = 29,\n\n  // Floating-Point Predicate Set If Greater Than Or Equal\n  // setp_ge/PRED_SETGTEs dest, src0.a\n  //     if (src0.a >= 0.0) {\n  //       dest.xyzw = 0.0;\n  //       p0 = 1;\n  //     } else {\n  //       dest.xyzw = 1.0;\n  //       p0 = 0;\n  //     }\n  kSetpGe = 30,\n\n  // Predicate Counter Invert\n  // setp_inv/PRED_SET_INVs dest, src0.a\n  //     if (src0.a == 1.0) {\n  //       dest.xyzw = 0.0;\n  //       p0 = 1;\n  //     } else {\n  //       if (src0.a == 0.0) {\n  //         dest.xyzw = 1.0;\n  //       } else {\n  //         dest.xyzw = src0.a;\n  //       }\n  //       p0 = 0;\n  //     }\n  kSetpInv = 31,\n\n  // Predicate Counter Pop\n  // setp_pop/PRED_SET_POPs dest, src0.a\n  //     if (src0.a - 1.0 <= 0.0) {\n  //       dest.xyzw = 0.0;\n  //       p0 = 1;\n  //     } else {\n  //       dest.xyzw = src0.a - 1.0;\n  //       p0 = 0;\n  //     }\n  kSetpPop = 32,\n\n  // Predicate Counter Clear\n  // setp_clr/PRED_SET_CLRs dest\n  //     dest.xyzw = FLT_MAX;\n  //     p0 = 0;\n  kSetpClr = 33,\n\n  // Predicate Counter Restore\n  // setp_rstr/PRED_SET_RESTOREs dest, src0.a\n  //     if (src0.a == 0.0) {\n  //       dest.xyzw = 0.0;\n  //       p0 = 1;\n  //     } else {\n  //       dest.xyzw = src0.a;\n  //       p0 = 0;\n  //     }\n  kSetpRstr = 34,\n\n  // Floating-Point Pixel Kill If Equal\n  // kills_eq/KILLEs dest, src0.a\n  //     if (src0.a == 0.0) {\n  //       dest.xyzw = 1.0;\n  //       discard;\n  //     } else {\n  //       dest.xyzw = 0.0;\n  //     }\n  kKillsEq = 35,\n\n  // Floating-Point Pixel Kill If Greater Than\n  // kills_gt/KILLGTs dest, src0.a\n  //     if (src0.a > 0.0) {\n  //       dest.xyzw = 1.0;\n  //       discard;\n  //     } else {\n  //       dest.xyzw = 0.0;\n  //     }\n  kKillsGt = 36,\n\n  // Floating-Point Pixel Kill If Greater Than Or Equal\n  // kills_ge/KILLGTEs dest, src0.a\n  //     if (src0.a >= 0.0) {\n  //       dest.xyzw = 1.0;\n  //       discard;\n  //     } else {\n  //       dest.xyzw = 0.0;\n  //     }\n  kKillsGe = 37,\n\n  // Floating-Point Pixel Kill If Not Equal\n  // kills_ne/KILLNEs dest, src0.a\n  //     if (src0.a != 0.0) {\n  //       dest.xyzw = 1.0;\n  //       discard;\n  //     } else {\n  //       dest.xyzw = 0.0;\n  //     }\n  kKillsNe = 38,\n\n  // Floating-Point Pixel Kill If One\n  // kills_one/KILLONEs dest, src0.a\n  //     if (src0.a == 1.0) {\n  //       dest.xyzw = 1.0;\n  //       discard;\n  //     } else {\n  //       dest.xyzw = 0.0;\n  //     }\n  kKillsOne = 39,\n\n  // Scalar Square Root, IEEE Aproximation\n  // sqrt/SQRT_IEEE dest, src0.a\n  //     dest.xyzw = sqrt(src0.a);\n  kSqrt = 40,\n\n  // 0 and 1 are the same instruction - one bit of the register index is stored\n  // in the opcode field.\n\n  // mulsc/MUL_CONST_0 dest, src0.a, src1.a\n  kMulsc0 = 42,\n  // mulsc/MUL_CONST_1 dest, src0.a, src1.a\n  kMulsc1 = 43,\n  // addsc/ADD_CONST_0 dest, src0.a, src1.a\n  kAddsc0 = 44,\n  // addsc/ADD_CONST_1 dest, src0.a, src1.a\n  kAddsc1 = 45,\n  // subsc/SUB_CONST_0 dest, src0.a, src1.a\n  kSubsc0 = 46,\n  // subsc/SUB_CONST_1 dest, src0.a, src1.a\n  kSubsc1 = 47,\n\n  // Scalar Sin\n  // sin/SIN dest, src0.a\n  //     dest.xyzw = sin(src0.a);\n  kSin = 48,\n\n  // Scalar Cos\n  // cos/COS dest, src0.a\n  //     dest.xyzw = cos(src0.a);\n  kCos = 49,\n\n  // retain_prev/RETAIN_PREV dest\n  //     dest.xyzw = ps;\n  kRetainPrev = 50,\n};\n\nstruct AluScalarOpcodeInfo {\n  const char* name;\n  // 0 - no operands.\n  // 1 - one single-component (W) or two-component (WX) r# or c#.\n  // 2 - c#.w and r#.x.\n  uint32_t operand_count;\n  // If operand_count is 1, whether both W and X of the operand are used rather\n  // than only W.\n  bool single_operand_is_two_component;\n  // Note that all scalar instructions except for retain_prev modify the\n  // previous scalar register, so they must be executed even if they don't write\n  // any result and don't perform any other state changes.\n  AluOpChangedState changed_state;\n};\n\n// 6 scalar opcode bits - 64 entries.\nextern const AluScalarOpcodeInfo kAluScalarOpcodeInfos[64];\n\ninline const AluScalarOpcodeInfo& GetAluScalarOpcodeInfo(\n    AluScalarOpcode opcode) {\n  assert_true(uint32_t(opcode) < xe::countof(kAluScalarOpcodeInfos));\n  return kAluScalarOpcodeInfos[uint32_t(opcode)];\n}\n\nenum class AluVectorOpcode : uint32_t {\n  // Per-Component Floating-Point Add\n  // add/ADDv dest, src0, src1\n  //     dest.x = src0.x + src1.x;\n  //     dest.y = src0.y + src1.y;\n  //     dest.z = src0.z + src1.z;\n  //     dest.w = src0.w + src1.w;\n  kAdd = 0,\n\n  // Per-Component Floating-Point Multiply\n  // mul/MULv dest, src0, src1\n  //     dest.x = src0.x * src1.x;\n  //     dest.y = src0.y * src1.y;\n  //     dest.z = src0.z * src1.z;\n  //     dest.w = src0.w * src1.w;\n  kMul = 1,\n\n  // Per-Component Floating-Point Maximum\n  // max/MAXv dest, src0, src1\n  //     dest.x = src0.x >= src1.x ? src0.x : src1.x;\n  //     dest.y = src0.x >= src1.y ? src0.y : src1.y;\n  //     dest.z = src0.x >= src1.z ? src0.z : src1.z;\n  //     dest.w = src0.x >= src1.w ? src0.w : src1.w;\n  kMax = 2,\n\n  // Per-Component Floating-Point Minimum\n  // min/MINv dest, src0, src1\n  //     dest.x = src0.x < src1.x ? src0.x : src1.x;\n  //     dest.y = src0.x < src1.y ? src0.y : src1.y;\n  //     dest.z = src0.x < src1.z ? src0.z : src1.z;\n  //     dest.w = src0.x < src1.w ? src0.w : src1.w;\n  kMin = 3,\n\n  // Per-Component Floating-Point Set If Equal\n  // seq/SETEv dest, src0, src1\n  //     dest.x = src0.x == src1.x ? 1.0 : 0.0;\n  //     dest.y = src0.y == src1.y ? 1.0 : 0.0;\n  //     dest.z = src0.z == src1.z ? 1.0 : 0.0;\n  //     dest.w = src0.w == src1.w ? 1.0 : 0.0;\n  kSeq = 4,\n\n  // Per-Component Floating-Point Set If Greater Than\n  // sgt/SETGTv dest, src0, src1\n  //     dest.x = src0.x > src1.x ? 1.0 : 0.0;\n  //     dest.y = src0.y > src1.y ? 1.0 : 0.0;\n  //     dest.z = src0.z > src1.z ? 1.0 : 0.0;\n  //     dest.w = src0.w > src1.w ? 1.0 : 0.0;\n  kSgt = 5,\n\n  // Per-Component Floating-Point Set If Greater Than Or Equal\n  // sge/SETGTEv dest, src0, src1\n  //     dest.x = src0.x >= src1.x ? 1.0 : 0.0;\n  //     dest.y = src0.y >= src1.y ? 1.0 : 0.0;\n  //     dest.z = src0.z >= src1.z ? 1.0 : 0.0;\n  //     dest.w = src0.w >= src1.w ? 1.0 : 0.0;\n  kSge = 6,\n\n  // Per-Component Floating-Point Set If Not Equal\n  // sne/SETNEv dest, src0, src1\n  //     dest.x = src0.x != src1.x ? 1.0 : 0.0;\n  //     dest.y = src0.y != src1.y ? 1.0 : 0.0;\n  //     dest.z = src0.z != src1.z ? 1.0 : 0.0;\n  //     dest.w = src0.w != src1.w ? 1.0 : 0.0;\n  kSne = 7,\n\n  // Per-Component Floating-Point Fractional\n  // frc/FRACv dest, src0\n  //     dest.x = src0.x - floor(src0.x);\n  //     dest.y = src0.y - floor(src0.y);\n  //     dest.z = src0.z - floor(src0.z);\n  //     dest.w = src0.w - floor(src0.w);\n  kFrc = 8,\n\n  // Per-Component Floating-Point Truncate\n  // trunc/TRUNCv dest, src0\n  //     dest.x = src0.x >= 0 ? floor(src0.x) : -floor(-src0.x);\n  //     dest.y = src0.y >= 0 ? floor(src0.y) : -floor(-src0.y);\n  //     dest.z = src0.z >= 0 ? floor(src0.z) : -floor(-src0.z);\n  //     dest.w = src0.w >= 0 ? floor(src0.w) : -floor(-src0.w);\n  kTrunc = 9,\n\n  // Per-Component Floating-Point Floor\n  // floor/FLOORv dest, src0\n  //     dest.x = floor(src0.x);\n  //     dest.y = floor(src0.y);\n  //     dest.z = floor(src0.z);\n  //     dest.w = floor(src0.w);\n  kFloor = 10,\n\n  // Per-Component Floating-Point Multiply-Add\n  // mad/MULADDv dest, src0, src1, src2\n  //     dest.x = src0.x * src1.x + src2.x;\n  //     dest.y = src0.y * src1.y + src2.y;\n  //     dest.z = src0.z * src1.z + src2.z;\n  //     dest.w = src0.w * src1.w + src2.w;\n  // According to SQ_ALU::multiply_add (used in the isHardwareAccurate case)\n  // from IPR2015-00325 sq_alu, this is FMA - rounding to single-precision only\n  // after the addition.\n  kMad = 11,\n\n  // Per-Component Floating-Point Conditional Move If Equal\n  // cndeq/CNDEv dest, src0, src1, src2\n  //     dest.x = src0.x == 0.0 ? src1.x : src2.x;\n  //     dest.y = src0.y == 0.0 ? src1.y : src2.y;\n  //     dest.z = src0.z == 0.0 ? src1.z : src2.z;\n  //     dest.w = src0.w == 0.0 ? src1.w : src2.w;\n  kCndEq = 12,\n\n  // Per-Component Floating-Point Conditional Move If Greater Than Or Equal\n  // cndge/CNDGTEv dest, src0, src1, src2\n  //     dest.x = src0.x >= 0.0 ? src1.x : src2.x;\n  //     dest.y = src0.y >= 0.0 ? src1.y : src2.y;\n  //     dest.z = src0.z >= 0.0 ? src1.z : src2.z;\n  //     dest.w = src0.w >= 0.0 ? src1.w : src2.w;\n  kCndGe = 13,\n\n  // Per-Component Floating-Point Conditional Move If Greater Than\n  // cndgt/CNDGTv dest, src0, src1, src2\n  //     dest.x = src0.x > 0.0 ? src1.x : src2.x;\n  //     dest.y = src0.y > 0.0 ? src1.y : src2.y;\n  //     dest.z = src0.z > 0.0 ? src1.z : src2.z;\n  //     dest.w = src0.w > 0.0 ? src1.w : src2.w;\n  kCndGt = 14,\n\n  // Four-Element Dot Product\n  // dp4/DOT4v dest, src0, src1\n  //     dest.xyzw = src0.x * src1.x + src0.y * src1.y + src0.z * src1.z +\n  //                 src0.w * src1.w;\n  kDp4 = 15,\n\n  // Three-Element Dot Product\n  // dp3/DOT3v dest, src0, src1\n  //     dest.xyzw = src0.x * src1.x + src0.y * src1.y + src0.z * src1.z;\n  kDp3 = 16,\n\n  // Two-Element Dot Product and Add\n  // dp2add/DOT2ADDv dest, src0, src1, src2\n  //     dest.xyzw = src0.x * src1.x + src0.y * src1.y + src2.x;\n  // IPR2015-00325 sq_alu may be an outdated and unreliable reference (Sequencer\n  // Parts Development folder history lists a few changes regarding the swizzle\n  // in dot2add, sq_alu though implements the instruction as\n  // src0.x * src1.x + src0.z * src1.z + src2.y, but MSDN specifies the correct\n  // order as provided in the beginning of this comment, further proven by\n  // assembling PC shader assembly using XNA, with Shader Model 2 dp2add being\n  // translated directly into Xenos dp2add without additional swizzling).\n  // http://web.archive.org/web/20100705150552/http://msdn.microsoft.com/en-us/library/bb313922.aspx\n  kDp2Add = 17,\n\n  // Cube Map\n  // cube/CUBEv dest, src0, src1\n  //     dest.x = T cube coordinate;\n  //     dest.y = S cube coordinate;\n  //     dest.z = 2.0 * major axis;\n  //     dest.w = FaceID;\n  // https://developer.amd.com/wordpress/media/2012/12/AMD_Southern_Islands_Instruction_Set_Architecture.pdf\n  //     if (abs(z) >= abs(x) && abs(z) >= abs(y)) {\n  //       tc = -y;\n  //       sc = z < 0.0 ? -x : x;\n  //       ma = 2.0 * z;\n  //       id = z < 0.0 ? 5.0 : 4.0;\n  //     } else if (abs(y) >= abs(x)) {\n  //       tc = y < 0.0 ? -z : z;\n  //       sc = x;\n  //       ma = 2.0 * y;\n  //       id = y < 0.0 ? 3.0 : 2.0;\n  //     } else {\n  //       tc = -y;\n  //       sc = x < 0.0 ? z : -z;\n  //       ma = 2.0 * x;\n  //       id = x < 0.0 ? 1.0 : 0.0;\n  //     }\n  // Expects src0.zzxy and src1.yxzz swizzles.\n  // FaceID is D3DCUBEMAP_FACES:\n  // https://msdn.microsoft.com/en-us/library/windows/desktop/bb172528(v=vs.85).aspx\n  // Used like:\n  //     cube r0, source.zzxy, source.yxz\n  //     rcp r0.z, r0_abs.z\n  //     mad r0.xy, r0, r0.zzzw, 1.5f\n  //     tfetchCube r0, r0.yxw, tf0\n  // http://web.archive.org/web/20100705154143/http://msdn.microsoft.com/en-us/library/bb313921.aspx\n  // On GCN, the sequence is the same, so GCN documentation can be used as a\n  // reference (tfetchCube doesn't accept the ST as if the texture was a 2D\n  // array in XY exactly, to get texture array ST, 1 must be subtracted from its\n  // XY inputs).\n  // https://gpuopen.com/learn/fetching-from-cubes-and-octahedrons/\n  // \"The 1.5 constant is designed such that the output face coordinate (v4 and\n  //  v5 in the above example) range is {1.0 <= x < 2.0} which has an advantage\n  //  in bit encoding compared to {0.0 <= x < 1.0} in that the upper mantissa\n  //  bits are constant throughout the entire output range.\"\n  kCube = 18,\n\n  // Four-Element Maximum\n  // max4/MAX4v dest, src0\n  // According to IPR2015-00325 sq_alu:\n  //     if (src0.x > src0.y && src0.x > src0.z && src0.x > src0.w) {\n  //       dest.xyzw = src0.x;\n  //     } else if (src0.y > src0.z && src0.y > src0.w) {\n  //       dest.xyzw = src0.y;\n  //     } else if (src0.z > src0.w) {\n  //       dest.xyzw = src0.z;\n  //     } else {\n  //       dest.xyzw = src0.w;\n  //     }\n  // However, the comparisons may be >= actually - the XNA documentation on\n  // MSDN, as well as R600 and GCN documentation, describe `max` as being\n  // implemented via >= rather than >. `max4` is documented vaguely, without the\n  // exact calculations for each component - MSDN describes it as max(xyzw), and\n  // in the R600 documentation it's max(wzyx). There's also a case more similar\n  // to `max4` where there also is a discrepancy between IPR2015-00325 sq_alu\n  // and the GCN documentation - `cube` has max3 in zyx priority order, and a >=\n  // comparison is used for this purpose on the GCN, but in IPR2015-00325 sq_alu\n  // it's implemented via >. It's possible that in an early version of the R400,\n  // the comparison was >, but was later changed to >=, but this is merely a\n  // guess.\n  kMax4 = 19,\n\n  // Floating-Point Predicate Counter Increment If Equal\n  // setp_eq_push/PRED_SETE_PUSHv dest, src0, src1\n  //     if (src0.w == 0.0 && src1.w == 0.0) {\n  //       p0 = 1;\n  //     } else {\n  //       p0 = 0;\n  //     }\n  //     if (src0.x == 0.0 && src1.x == 0.0) {\n  //       dest.xyzw = 0.0;\n  //     } else {\n  //       dest.xyzw = src0.x + 1.0;\n  //     }\n  kSetpEqPush = 20,\n\n  // Floating-Point Predicate Counter Increment If Not Equal\n  // setp_ne_push/PRED_SETNE_PUSHv dest, src0, src1\n  //     if (src0.w == 0.0 && src1.w != 0.0) {\n  //       p0 = 1;\n  //     } else {\n  //       p0 = 0;\n  //     }\n  //     if (src0.x == 0.0 && src1.x != 0.0) {\n  //       dest.xyzw = 0.0;\n  //     } else {\n  //       dest.xyzw = src0.x + 1.0;\n  //     }\n  kSetpNePush = 21,\n\n  // Floating-Point Predicate Counter Increment If Greater Than\n  // setp_gt_push/PRED_SETGT_PUSHv dest, src0, src1\n  //     if (src0.w == 0.0 && src1.w > 0.0) {\n  //       p0 = 1;\n  //     } else {\n  //       p0 = 0;\n  //     }\n  //     if (src0.x == 0.0 && src1.x > 0.0) {\n  //       dest.xyzw = 0.0;\n  //     } else {\n  //       dest.xyzw = src0.x + 1.0;\n  //     }\n  kSetpGtPush = 22,\n\n  // Floating-Point Predicate Counter Increment If Greater Than Or Equal\n  // setp_ge_push/PRED_SETGTE_PUSHv dest, src0, src1\n  //     if (src0.w == 0.0 && src1.w >= 0.0) {\n  //       p0 = 1;\n  //     } else {\n  //       p0 = 0;\n  //     }\n  //     if (src0.x == 0.0 && src1.x >= 0.0) {\n  //       dest.xyzw = 0.0;\n  //     } else {\n  //       dest.xyzw = src0.x + 1.0;\n  //     }\n  kSetpGePush = 23,\n\n  // Floating-Point Pixel Kill If Equal\n  // kill_eq/KILLEv dest, src0, src1\n  //     if (src0.x == src1.x ||\n  //         src0.y == src1.y ||\n  //         src0.z == src1.z ||\n  //         src0.w == src1.w) {\n  //       dest.xyzw = 1.0;\n  //       discard;\n  //     } else {\n  //       dest.xyzw = 0.0;\n  //     }\n  kKillEq = 24,\n\n  // Floating-Point Pixel Kill If Greater Than\n  // kill_gt/KILLGTv dest, src0, src1\n  //     if (src0.x > src1.x ||\n  //         src0.y > src1.y ||\n  //         src0.z > src1.z ||\n  //         src0.w > src1.w) {\n  //       dest.xyzw = 1.0;\n  //       discard;\n  //     } else {\n  //       dest.xyzw = 0.0;\n  //     }\n  kKillGt = 25,\n\n  // Floating-Point Pixel Kill If Equal\n  // kill_ge/KILLGTEv dest, src0, src1\n  //     if (src0.x >= src1.x ||\n  //         src0.y >= src1.y ||\n  //         src0.z >= src1.z ||\n  //         src0.w >= src1.w) {\n  //       dest.xyzw = 1.0;\n  //       discard;\n  //     } else {\n  //       dest.xyzw = 0.0;\n  //     }\n  kKillGe = 26,\n\n  // Floating-Point Pixel Kill If Equal\n  // kill_ne/KILLNEv dest, src0, src1\n  //     if (src0.x != src1.x ||\n  //         src0.y != src1.y ||\n  //         src0.z != src1.z ||\n  //         src0.w != src1.w) {\n  //       dest.xyzw = 1.0;\n  //       discard;\n  //     } else {\n  //       dest.xyzw = 0.0;\n  //     }\n  kKillNe = 27,\n\n  // dst/DSTv dest, src0, src1\n  //     dest.x = 1.0;\n  //     dest.y = src0.y * src1.y;\n  //     dest.z = src0.z;\n  //     dest.w = src1.w;\n  kDst = 28,\n\n  // Per-Component Floating-Point Maximum with Copy To Integer in AR\n  // maxa dest, src0, src1\n  // This is a combined max + mova/MOVAv.\n  //     a0 = (int)clamp(floor(src0.w + 0.5), -256.0, 255.0);\n  //     dest.x = src0.x >= src1.x ? src0.x : src1.x;\n  //     dest.y = src0.x >= src1.y ? src0.y : src1.y;\n  //     dest.z = src0.x >= src1.z ? src0.z : src1.z;\n  //     dest.w = src0.x >= src1.w ? src0.w : src1.w;\n  // The MSDN documentation specifies clamp as:\n  // if (!(SQResultF >= -256.0)) {\n  //   SQResultF = -256.0;\n  // }\n  // if (SQResultF > 255.0) {\n  //   SQResultF = 255.0;\n  // }\n  // http://web.archive.org/web/20100705151335/http://msdn.microsoft.com:80/en-us/library/bb313931.aspx\n  // However, using NaN as an address would be unusual.\n  kMaxA = 29,\n};\n\nstruct AluVectorOpcodeInfo {\n  const char* name;\n  uint32_t operand_components_used[3];\n  AluOpChangedState changed_state;\n\n  uint32_t GetOperandCount() const {\n    if (!operand_components_used[2]) {\n      if (!operand_components_used[1]) {\n        if (!operand_components_used[0]) {\n          return 0;\n        }\n        return 1;\n      }\n      return 2;\n    }\n    return 3;\n  }\n};\n\n// 5 vector opcode bits - 32 entries.\nextern const AluVectorOpcodeInfo kAluVectorOpcodeInfos[32];\n\ninline const AluVectorOpcodeInfo& GetAluVectorOpcodeInfo(\n    AluVectorOpcode opcode) {\n  assert_true(uint32_t(opcode) < xe::countof(kAluVectorOpcodeInfos));\n  return kAluVectorOpcodeInfos[uint32_t(opcode)];\n}\n\n// Whether each component of a source operand is needed for the instruction if\n// executed with the specified write mask, and thus can't be thrown away or be\n// undefined in translation. For per-component operations, for example, only the\n// components specified in the write mask are needed, but there are instructions\n// with special behavior for certain components.\ninline uint32_t GetAluVectorOpNeededSourceComponents(\n    AluVectorOpcode vector_opcode, uint32_t src_index,\n    uint32_t used_result_components) {\n  assert_not_zero(src_index);\n  assert_zero(used_result_components & ~uint32_t(0b1111));\n  uint32_t components = used_result_components;\n  switch (vector_opcode) {\n    case AluVectorOpcode::kDp4:\n    case AluVectorOpcode::kMax4:\n      components = used_result_components ? 0b1111 : 0;\n      break;\n    case AluVectorOpcode::kDp3:\n      components = used_result_components ? 0b0111 : 0;\n      break;\n    case AluVectorOpcode::kDp2Add:\n      components =\n          used_result_components ? (src_index == 3 ? 0b0001 : 0b0011) : 0;\n      break;\n    case AluVectorOpcode::kCube:\n      components = used_result_components ? 0b1111 : 0;\n      break;\n    case AluVectorOpcode::kSetpEqPush:\n    case AluVectorOpcode::kSetpNePush:\n    case AluVectorOpcode::kSetpGtPush:\n    case AluVectorOpcode::kSetpGePush:\n      components = used_result_components ? 0b1001 : 0b1000;\n      break;\n    case AluVectorOpcode::kKillEq:\n    case AluVectorOpcode::kKillGt:\n    case AluVectorOpcode::kKillGe:\n    case AluVectorOpcode::kKillNe:\n      components = 0b1111;\n      break;\n    // kDst is per-component, but not all components are used.\n    // operand_components_used will filter out the unused ones.\n    case AluVectorOpcode::kMaxA:\n      if (src_index == 1) {\n        components |= 0b1000;\n      }\n      break;\n    default:\n      break;\n  }\n  return components & GetAluVectorOpcodeInfo(vector_opcode)\n                          .operand_components_used[src_index - 1];\n}\n\n// eM# (kExportData) register count.\nconstexpr uint32_t kMaxMemExportElementCount = 5;\n\nenum class ExportRegister : uint32_t {\n  kVSInterpolator0 = 0,\n  kVSInterpolator1,\n  kVSInterpolator2,\n  kVSInterpolator3,\n  kVSInterpolator4,\n  kVSInterpolator5,\n  kVSInterpolator6,\n  kVSInterpolator7,\n  kVSInterpolator8,\n  kVSInterpolator9,\n  kVSInterpolator10,\n  kVSInterpolator11,\n  kVSInterpolator12,\n  kVSInterpolator13,\n  kVSInterpolator14,\n  kVSInterpolator15,\n\n  kVSPosition = 62,\n\n  // See R6xx/R7xx registers for details (USE_VTX_POINT_SIZE, USE_VTX_EDGE_FLAG,\n  // USE_VTX_KILL_FLAG).\n  // X - PSIZE (gl_PointSize).\n  //     According to tests and GL_AMD_program_binary_Z400 disassembly on an\n  //     Adreno 200 device:\n  //     * This is the full width and height of the point sprite (not half -\n  //       gl_PointSize goes directly to oPts.x).\n  //     * Clamped to PA_SU_POINT_MINMAX as a signed integer in rasterization:\n  //       * -NaN - min\n  //       * -Infinity - min\n  //       * -Normal - min\n  //       * -0 (0x80000000 - the smallest signed integer) - min\n  //       * +0 - min\n  //       * +Infinity - max\n  //       * +NaN - max\n  // Y - EDGEFLAG (glEdgeFlag) for PrimitiveType::kPolygon wireframe/point\n  //     drawing.\n  // Z - KILLVERTEX flag (used in 4D5307ED for grass), set for killing\n  //     primitives based on PA_CL_CLIP_CNTL::VTX_KILL_OR condition if bits 0:30\n  //     of this export value (the sign bit is ignored according to the\n  //     IPR2015-00325 sequencer specification) are not zero.\n  kVSPointSizeEdgeFlagKillVertex = 63,\n\n  kPSColor0 = 0,\n  kPSColor1,\n  kPSColor2,\n  kPSColor3,\n\n  // In X.\n  kPSDepth = 61,\n\n  // Memory export: index.?y?? * 0100 + xe_gpu_memexport_stream_t.xyzw.\n  kExportAddress = 32,\n  // Memory export: values for texels [index+0], [index+1], ..., [index+4].\n  kExportData0 = 33,\n  kExportData1,\n  kExportData2,\n  kExportData3,\n  kExportData4,\n};\n\nstruct alignas(uint32_t) AluInstruction {\n  // Raw accessors.\n\n  // Whether data is being exported (or written to local registers).\n  bool is_export() const { return data_.export_data == 1; }\n\n  // Whether the jump is predicated (or conditional).\n  bool is_predicated() const { return data_.is_predicated; }\n  // Required condition value of the comparision (true or false).\n  bool predicate_condition() const { return data_.pred_condition == 1; }\n\n  bool abs_constants() const { return data_.abs_constants == 1; }\n  bool is_const_0_addressed() const { return data_.const_0_rel_abs == 1; }\n  bool is_const_1_addressed() const { return data_.const_1_rel_abs == 1; }\n  bool is_const_address_register_relative() const {\n    return data_.const_address_register_relative == 1;\n  }\n\n  AluVectorOpcode vector_opcode() const { return data_.vector_opc; }\n  uint32_t vector_write_mask() const { return data_.vector_write_mask; }\n  uint32_t vector_dest() const { return data_.vector_dest; }\n  bool is_vector_dest_relative() const { return data_.vector_dest_rel == 1; }\n  bool vector_clamp() const { return data_.vector_clamp == 1; }\n\n  AluScalarOpcode scalar_opcode() const { return data_.scalar_opc; }\n  uint32_t scalar_write_mask() const { return data_.scalar_write_mask; }\n  uint32_t scalar_dest() const { return data_.scalar_dest; }\n  bool is_scalar_dest_relative() const { return data_.scalar_dest_rel == 1; }\n  bool scalar_clamp() const { return data_.scalar_clamp == 1; }\n\n  static constexpr uint32_t src_temp_reg(uint32_t src_reg) {\n    return src_reg & 0x3F;\n  }\n  static constexpr bool is_src_temp_relative(uint32_t src_reg) {\n    return (src_reg & 0x40) != 0;\n  }\n  static constexpr bool is_src_temp_value_absolute(uint32_t src_reg) {\n    return (src_reg & 0x80) != 0;\n  }\n  // Full register index for constants, packed structure for temporary\n  // registers (unpack using src_temp_reg, is_src_temp_relative,\n  // is_src_temp_value_absolute).\n  uint32_t src_reg(size_t i) const {\n    switch (i) {\n      case 1:\n        return data_.src1_reg;\n      case 2:\n        return data_.src2_reg;\n      case 3:\n        return data_.src3_reg;\n      default:\n        assert_unhandled_case(i);\n        return 0;\n    }\n  }\n  bool src_is_temp(size_t i) const {\n    switch (i) {\n      case 1:\n        return bool(data_.src1_sel);\n      case 2:\n        return bool(data_.src2_sel);\n      case 3:\n        return bool(data_.src3_sel);\n      default:\n        assert_unhandled_case(i);\n        return 0;\n    }\n  }\n  // Whether the specified operand is actually a constant is disregarded in this\n  // function so its scope is limited to just parsing the structure's layout -\n  // to decide whether to use relative addressing for the operand as a whole,\n  // check externally whether the operand is actually a constant first.\n  //\n  // For the constant operand in mulsc, addsc, subsc, this should be called for\n  // the operand index 3. Note that the XNA disassembler takes the addressing\n  // mode for the constant scalar operand unconditionally from const_1_rel_abs,\n  // and ignores the +aL for it unless the scalar operation is co-issued with a\n  // vector operation reading from a constant. However, the XNA assembler treats\n  // the constant scalar operand as a constant in the third operand, and places\n  // the addressing mode for it in const_0_rel_abs if no other constants are\n  // used in the whole ALU instruction. The validator also doesn't report\n  // anything if +aL is used when the constant scalar operand is the only\n  // constant in the instruction (and explicitly calls it the third constant in\n  // the error message in case both vector operands are constants, and different\n  // addressing modes are used for the second vector operand and the constant\n  // scalar operand). Passing the disassembly produced by XNA back to the\n  // assembler results in different microcode in this case. This indicates that\n  // most likely there's a bug in the XNA disassembler, and that the addressing\n  // mode for the constant scalar operand should actually be taken the same way\n  // as for the third vector operand - from const_0_rel_abs if there are no\n  // constant vector operands, or from const_1_rel_abs if there is at least one.\n  bool src_const_is_addressed(size_t i) const {\n    // \"error X7100: When three constants are used in one instruction, the\n    //  second and third constant must either both be non-relative, or both be\n    //  relative.\"\n    // Whether to use const_0_rel_abs or const_1_rel_abs is essentially\n    // min(sum of whether the previous operands are constants, 1).\n    switch (i) {\n      case 1:\n        return bool(data_.const_0_rel_abs);\n      case 2:\n        return bool(src_is_temp(1) ? data_.const_0_rel_abs\n                                   : data_.const_1_rel_abs);\n      case 3:\n        return bool((src_is_temp(1) && src_is_temp(2)) ? data_.const_0_rel_abs\n                                                       : data_.const_1_rel_abs);\n      default:\n        assert_unhandled_case(i);\n        return false;\n    }\n  }\n  uint32_t src_swizzle(size_t i) const {\n    switch (i) {\n      case 1:\n        return data_.src1_swiz;\n      case 2:\n        return data_.src2_swiz;\n      case 3:\n        return data_.src3_swiz;\n      default:\n        assert_unhandled_case(i);\n        return 0;\n    }\n  }\n  bool src_negate(size_t i) const {\n    switch (i) {\n      case 1:\n        return data_.src1_reg_negate == 1;\n      case 2:\n        return data_.src2_reg_negate == 1;\n      case 3:\n        return data_.src3_reg_negate == 1;\n      default:\n        assert_unhandled_case(i);\n        return 0;\n    }\n  }\n\n  uint32_t scalar_const_reg_op_src_temp_reg() const {\n    return (uint32_t(data_.scalar_opc) & 1) | (data_.src3_sel << 1) |\n           (data_.src3_swiz & 0x3C);\n  }\n\n  // Helpers.\n\n  // Returns the absolute component index calculated from the relative swizzle\n  // in an ALU instruction.\n  static constexpr uint32_t GetSwizzledComponentIndex(\n      uint32_t swizzle, uint32_t component_index) {\n    return ((swizzle >> (2 * component_index)) + component_index) & 3;\n  }\n\n  // Note that even if the export component is unused (like W of the vertex\n  // shader misc register, YZW of pixel shader depth), it must still not be\n  // excluded - that may make disassembly not reassemblable if there are\n  // constant 0 writes in the export, like, oPts.x000 will be assembled, but\n  // oPts.x00_ will not, even though W has no effect on anything.\n  uint32_t GetVectorOpResultWriteMask() const {\n    uint32_t mask = vector_write_mask();\n    if (is_export()) {\n      mask &= ~scalar_write_mask();\n    }\n    return mask;\n  }\n  uint32_t GetScalarOpResultWriteMask() const {\n    uint32_t mask = scalar_write_mask();\n    if (is_export()) {\n      mask &= ~vector_write_mask();\n    }\n    return mask;\n  }\n  uint32_t GetConstant0WriteMask() const {\n    if (!is_export() || !is_scalar_dest_relative()) {\n      return 0b0000;\n    }\n    return 0b1111 & ~(vector_write_mask() | scalar_write_mask());\n  }\n  uint32_t GetConstant1WriteMask() const {\n    if (!is_export()) {\n      return 0b0000;\n    }\n    return vector_write_mask() & scalar_write_mask();\n  }\n\n private:\n  struct Data {\n    struct {\n      // If exporting, both vector and scalar operations use the vector\n      // destination (which can't be relative in this case).\n      // Not very important note: If both scalar and vector operations exporting\n      // something have empty write mask, the XNA assembler forces vector_dest\n      // to 0 (interpolator 0 or color 0) directly in the microcode.\n      uint32_t vector_dest : 6;\n      uint32_t vector_dest_rel : 1;\n      uint32_t abs_constants : 1;\n      uint32_t scalar_dest : 6;\n      uint32_t scalar_dest_rel : 1;\n      // Exports have different write masking (export is done to vector_dest by\n      // both the vector and the scalar operation, and exports can write\n      // constant 0 and 1). For each component:\n      // - vector_write_mask 0, scalar_write_mask 0:\n      //   - scalar_dest_rel 0 - unchanged.\n      //   - scalar_dest_rel 1 - constant 0 (all components must be written).\n      // - vector_write_mask 1, scalar_write_mask 0 - from vector operation.\n      // - vector_write_mask 0, scalar_write_mask 1 - from scalar operation.\n      // - vector_write_mask 1, scalar_write_mask 1 - constant 1.\n      uint32_t export_data : 1;\n      uint32_t vector_write_mask : 4;\n      uint32_t scalar_write_mask : 4;\n      uint32_t vector_clamp : 1;\n      uint32_t scalar_clamp : 1;\n      AluScalarOpcode scalar_opc : 6;\n    };\n    struct {\n      // Swizzles are component-relative.\n      uint32_t src3_swiz : 8;\n      uint32_t src2_swiz : 8;\n      uint32_t src1_swiz : 8;\n      uint32_t src3_reg_negate : 1;\n      uint32_t src2_reg_negate : 1;\n      uint32_t src1_reg_negate : 1;\n      uint32_t pred_condition : 1;\n      uint32_t is_predicated : 1;\n      // Temporary registers can have only absolute and aL-relative indices, not\n      // a0-relative.\n      uint32_t const_address_register_relative : 1;\n      uint32_t const_1_rel_abs : 1;\n      uint32_t const_0_rel_abs : 1;\n    };\n    struct {\n      uint32_t src3_reg : 8;\n      uint32_t src2_reg : 8;\n      uint32_t src1_reg : 8;\n      AluVectorOpcode vector_opc : 5;\n      uint32_t src3_sel : 1;\n      uint32_t src2_sel : 1;\n      uint32_t src1_sel : 1;\n    };\n  };\n  Data data_;\n};\nstatic_assert_size(AluInstruction, sizeof(uint32_t) * 3);\n\n}  // namespace ucode\n}  // namespace gpu\n}  // namespace xe\n\n#endif  // XENIA_GPU_UCODE_H_\n"
  },
  {
    "path": "src/xenia/gpu/vulkan/deferred_command_buffer.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/vulkan/deferred_command_buffer.h\"\n\n#include <cstddef>\n#include <cstdint>\n#include <cstring>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/profiling.h\"\n#include \"xenia/gpu/gpu_flags.h\"\n#include \"xenia/gpu/vulkan/vulkan_command_processor.h\"\n\nnamespace xe {\nnamespace gpu {\nnamespace vulkan {\n\nDeferredCommandBuffer::DeferredCommandBuffer(\n    const VulkanCommandProcessor& command_processor, size_t initial_size)\n    : command_processor_(command_processor) {\n  command_stream_.reserve(initial_size / sizeof(uintmax_t));\n}\n\nvoid DeferredCommandBuffer::Reset() { command_stream_.clear(); }\n\nvoid DeferredCommandBuffer::Execute(VkCommandBuffer command_buffer) {\n#if XE_GPU_FINE_GRAINED_DRAW_SCOPES\n  SCOPE_profile_cpu_f(\"gpu\");\n#endif  // XE_GPU_FINE_GRAINED_DRAW_SCOPES\n\n  const ui::vulkan::VulkanDevice::Functions& dfn =\n      command_processor_.GetVulkanDevice()->functions();\n  const uintmax_t* stream = command_stream_.data();\n  size_t stream_remaining = command_stream_.size();\n  while (stream_remaining) {\n    const CommandHeader& header =\n        *reinterpret_cast<const CommandHeader*>(stream);\n    stream += kCommandHeaderSizeElements;\n    stream_remaining -= kCommandHeaderSizeElements;\n\n    switch (header.command) {\n      case Command::kVkBeginRenderPass: {\n        auto& args = *reinterpret_cast<const ArgsVkBeginRenderPass*>(stream);\n        size_t offset_bytes = sizeof(ArgsVkBeginRenderPass);\n        VkRenderPassBeginInfo render_pass_begin_info;\n        render_pass_begin_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;\n        render_pass_begin_info.pNext = nullptr;\n        render_pass_begin_info.renderPass = args.render_pass;\n        render_pass_begin_info.framebuffer = args.framebuffer;\n        render_pass_begin_info.renderArea = args.render_area;\n        render_pass_begin_info.clearValueCount = args.clear_value_count;\n        if (render_pass_begin_info.clearValueCount) {\n          offset_bytes = xe::align(offset_bytes, alignof(VkClearValue));\n          render_pass_begin_info.pClearValues =\n              reinterpret_cast<const VkClearValue*>(\n                  reinterpret_cast<const uint8_t*>(stream) + offset_bytes);\n          offset_bytes +=\n              sizeof(VkClearValue) * render_pass_begin_info.clearValueCount;\n        } else {\n          render_pass_begin_info.pClearValues = nullptr;\n        }\n        dfn.vkCmdBeginRenderPass(command_buffer, &render_pass_begin_info,\n                                 args.contents);\n      } break;\n\n      case Command::kVkBindDescriptorSets: {\n        auto& args = *reinterpret_cast<const ArgsVkBindDescriptorSets*>(stream);\n        size_t offset_bytes = xe::align(sizeof(ArgsVkBindDescriptorSets),\n                                        alignof(VkDescriptorSet));\n        const VkDescriptorSet* descriptor_sets =\n            reinterpret_cast<const VkDescriptorSet*>(\n                reinterpret_cast<const uint8_t*>(stream) + offset_bytes);\n        offset_bytes += sizeof(VkDescriptorSet) * args.descriptor_set_count;\n        const uint32_t* dynamic_offsets = nullptr;\n        if (args.dynamic_offset_count) {\n          offset_bytes = xe::align(offset_bytes, alignof(uint32_t));\n          dynamic_offsets = reinterpret_cast<const uint32_t*>(\n              reinterpret_cast<const uint8_t*>(stream) + offset_bytes);\n          offset_bytes += sizeof(uint32_t) * args.dynamic_offset_count;\n        }\n        dfn.vkCmdBindDescriptorSets(command_buffer, args.pipeline_bind_point,\n                                    args.layout, args.first_set,\n                                    args.descriptor_set_count, descriptor_sets,\n                                    args.dynamic_offset_count, dynamic_offsets);\n      } break;\n\n      case Command::kVkBindIndexBuffer: {\n        auto& args = *reinterpret_cast<const ArgsVkBindIndexBuffer*>(stream);\n        dfn.vkCmdBindIndexBuffer(command_buffer, args.buffer, args.offset,\n                                 args.index_type);\n      } break;\n\n      case Command::kVkBindPipeline: {\n        auto& args = *reinterpret_cast<const ArgsVkBindPipeline*>(stream);\n        dfn.vkCmdBindPipeline(command_buffer, args.pipeline_bind_point,\n                              args.pipeline);\n      } break;\n\n      case Command::kVkBindVertexBuffers: {\n        auto& args = *reinterpret_cast<const ArgsVkBindVertexBuffers*>(stream);\n        size_t offset_bytes =\n            xe::align(sizeof(ArgsVkBindVertexBuffers), alignof(VkBuffer));\n        const VkBuffer* buffers = reinterpret_cast<const VkBuffer*>(\n            reinterpret_cast<const uint8_t*>(stream) + offset_bytes);\n        offset_bytes =\n            xe::align(offset_bytes + sizeof(VkBuffer) * args.binding_count,\n                      alignof(VkDeviceSize));\n        const VkDeviceSize* offsets = reinterpret_cast<const VkDeviceSize*>(\n            reinterpret_cast<const uint8_t*>(stream) + offset_bytes);\n        dfn.vkCmdBindVertexBuffers(command_buffer, args.first_binding,\n                                   args.binding_count, buffers, offsets);\n      } break;\n\n      case Command::kVkClearAttachments: {\n        auto& args = *reinterpret_cast<const ArgsVkClearAttachments*>(stream);\n        size_t offset_bytes = xe::align(sizeof(ArgsVkClearAttachments),\n                                        alignof(VkClearAttachment));\n        const VkClearAttachment* attachments =\n            reinterpret_cast<const VkClearAttachment*>(\n                reinterpret_cast<const uint8_t*>(stream) + offset_bytes);\n        offset_bytes = xe::align(\n            offset_bytes + sizeof(VkClearAttachment) * args.attachment_count,\n            alignof(VkClearRect));\n        const VkClearRect* rects = reinterpret_cast<const VkClearRect*>(\n            reinterpret_cast<const uint8_t*>(stream) + offset_bytes);\n        dfn.vkCmdClearAttachments(command_buffer, args.attachment_count,\n                                  attachments, args.rect_count, rects);\n      } break;\n\n      case Command::kVkClearColorImage: {\n        auto& args = *reinterpret_cast<const ArgsVkClearColorImage*>(stream);\n        dfn.vkCmdClearColorImage(\n            command_buffer, args.image, args.image_layout, &args.color,\n            args.range_count,\n            reinterpret_cast<const VkImageSubresourceRange*>(\n                reinterpret_cast<const uint8_t*>(stream) +\n                xe::align(sizeof(ArgsVkClearColorImage),\n                          alignof(VkImageSubresourceRange))));\n      } break;\n\n      case Command::kVkCopyBuffer: {\n        auto& args = *reinterpret_cast<const ArgsVkCopyBuffer*>(stream);\n        dfn.vkCmdCopyBuffer(\n            command_buffer, args.src_buffer, args.dst_buffer, args.region_count,\n            reinterpret_cast<const VkBufferCopy*>(\n                reinterpret_cast<const uint8_t*>(stream) +\n                xe::align(sizeof(ArgsVkCopyBuffer), alignof(VkBufferCopy))));\n      } break;\n\n      case Command::kVkCopyBufferToImage: {\n        auto& args = *reinterpret_cast<const ArgsVkCopyBufferToImage*>(stream);\n        dfn.vkCmdCopyBufferToImage(\n            command_buffer, args.src_buffer, args.dst_image,\n            args.dst_image_layout, args.region_count,\n            reinterpret_cast<const VkBufferImageCopy*>(\n                reinterpret_cast<const uint8_t*>(stream) +\n                xe::align(sizeof(ArgsVkCopyBufferToImage),\n                          alignof(VkBufferImageCopy))));\n      } break;\n\n      case Command::kVkDispatch: {\n        auto& args = *reinterpret_cast<const ArgsVkDispatch*>(stream);\n        dfn.vkCmdDispatch(command_buffer, args.group_count_x,\n                          args.group_count_y, args.group_count_z);\n      } break;\n\n      case Command::kVkDraw: {\n        auto& args = *reinterpret_cast<const ArgsVkDraw*>(stream);\n        dfn.vkCmdDraw(command_buffer, args.vertex_count, args.instance_count,\n                      args.first_vertex, args.first_instance);\n      } break;\n\n      case Command::kVkDrawIndexed: {\n        auto& args = *reinterpret_cast<const ArgsVkDrawIndexed*>(stream);\n        dfn.vkCmdDrawIndexed(command_buffer, args.index_count,\n                             args.instance_count, args.first_index,\n                             args.vertex_offset, args.first_instance);\n      } break;\n\n      case Command::kVkEndRenderPass:\n        dfn.vkCmdEndRenderPass(command_buffer);\n        break;\n\n      case Command::kVkPipelineBarrier: {\n        auto& args = *reinterpret_cast<const ArgsVkPipelineBarrier*>(stream);\n        size_t barrier_offset_bytes = sizeof(ArgsVkPipelineBarrier);\n        const VkMemoryBarrier* memory_barriers = nullptr;\n        if (args.memory_barrier_count) {\n          barrier_offset_bytes =\n              xe::align(barrier_offset_bytes, alignof(VkMemoryBarrier));\n          memory_barriers = reinterpret_cast<const VkMemoryBarrier*>(\n              reinterpret_cast<const uint8_t*>(stream) + barrier_offset_bytes);\n          barrier_offset_bytes +=\n              sizeof(VkMemoryBarrier) * args.memory_barrier_count;\n        }\n        const VkBufferMemoryBarrier* buffer_memory_barriers = nullptr;\n        if (args.buffer_memory_barrier_count) {\n          barrier_offset_bytes =\n              xe::align(barrier_offset_bytes, alignof(VkBufferMemoryBarrier));\n          buffer_memory_barriers =\n              reinterpret_cast<const VkBufferMemoryBarrier*>(\n                  reinterpret_cast<const uint8_t*>(stream) +\n                  barrier_offset_bytes);\n          barrier_offset_bytes +=\n              sizeof(VkBufferMemoryBarrier) * args.buffer_memory_barrier_count;\n        }\n        const VkImageMemoryBarrier* image_memory_barriers = nullptr;\n        if (args.image_memory_barrier_count) {\n          barrier_offset_bytes =\n              xe::align(barrier_offset_bytes, alignof(VkImageMemoryBarrier));\n          image_memory_barriers = reinterpret_cast<const VkImageMemoryBarrier*>(\n              reinterpret_cast<const uint8_t*>(stream) + barrier_offset_bytes);\n          barrier_offset_bytes +=\n              sizeof(VkImageMemoryBarrier) * args.image_memory_barrier_count;\n        }\n        dfn.vkCmdPipelineBarrier(\n            command_buffer, args.src_stage_mask, args.dst_stage_mask,\n            args.dependency_flags, args.memory_barrier_count, memory_barriers,\n            args.buffer_memory_barrier_count, buffer_memory_barriers,\n            args.image_memory_barrier_count, image_memory_barriers);\n      } break;\n\n      case Command::kVkPushConstants: {\n        auto& args = *reinterpret_cast<const ArgsVkPushConstants*>(stream);\n        dfn.vkCmdPushConstants(command_buffer, args.layout, args.stage_flags,\n                               args.offset, args.size,\n                               reinterpret_cast<const uint8_t*>(stream) +\n                                   sizeof(ArgsVkPushConstants));\n      } break;\n\n      case Command::kVkSetBlendConstants: {\n        auto& args = *reinterpret_cast<const ArgsVkSetBlendConstants*>(stream);\n        dfn.vkCmdSetBlendConstants(command_buffer, args.blend_constants);\n      } break;\n\n      case Command::kVkSetDepthBias: {\n        auto& args = *reinterpret_cast<const ArgsVkSetDepthBias*>(stream);\n        dfn.vkCmdSetDepthBias(command_buffer, args.depth_bias_constant_factor,\n                              args.depth_bias_clamp,\n                              args.depth_bias_slope_factor);\n      } break;\n\n      case Command::kVkSetScissor: {\n        auto& args = *reinterpret_cast<const ArgsVkSetScissor*>(stream);\n        dfn.vkCmdSetScissor(\n            command_buffer, args.first_scissor, args.scissor_count,\n            reinterpret_cast<const VkRect2D*>(\n                reinterpret_cast<const uint8_t*>(stream) +\n                xe::align(sizeof(ArgsVkSetScissor), alignof(VkRect2D))));\n      } break;\n\n      case Command::kVkSetStencilCompareMask: {\n        auto& args =\n            *reinterpret_cast<const ArgsSetStencilMaskReference*>(stream);\n        dfn.vkCmdSetStencilCompareMask(command_buffer, args.face_mask,\n                                       args.mask_reference);\n      } break;\n\n      case Command::kVkSetStencilReference: {\n        auto& args =\n            *reinterpret_cast<const ArgsSetStencilMaskReference*>(stream);\n        dfn.vkCmdSetStencilReference(command_buffer, args.face_mask,\n                                     args.mask_reference);\n      } break;\n\n      case Command::kVkSetStencilWriteMask: {\n        auto& args =\n            *reinterpret_cast<const ArgsSetStencilMaskReference*>(stream);\n        dfn.vkCmdSetStencilWriteMask(command_buffer, args.face_mask,\n                                     args.mask_reference);\n      } break;\n\n      case Command::kVkSetViewport: {\n        auto& args = *reinterpret_cast<const ArgsVkSetViewport*>(stream);\n        dfn.vkCmdSetViewport(\n            command_buffer, args.first_viewport, args.viewport_count,\n            reinterpret_cast<const VkViewport*>(\n                reinterpret_cast<const uint8_t*>(stream) +\n                xe::align(sizeof(ArgsVkSetViewport), alignof(VkViewport))));\n      } break;\n\n      default:\n        assert_unhandled_case(header.command);\n        break;\n    }\n\n    stream += header.arguments_size_elements;\n    stream_remaining -= header.arguments_size_elements;\n  }\n}\n\nvoid DeferredCommandBuffer::CmdVkPipelineBarrier(\n    VkPipelineStageFlags src_stage_mask, VkPipelineStageFlags dst_stage_mask,\n    VkDependencyFlags dependency_flags, uint32_t memory_barrier_count,\n    const VkMemoryBarrier* memory_barriers,\n    uint32_t buffer_memory_barrier_count,\n    const VkBufferMemoryBarrier* buffer_memory_barriers,\n    uint32_t image_memory_barrier_count,\n    const VkImageMemoryBarrier* image_memory_barriers) {\n  size_t arguments_size = sizeof(ArgsVkPipelineBarrier);\n  size_t memory_barriers_offset = 0;\n  if (memory_barrier_count) {\n    arguments_size = xe::align(arguments_size, alignof(VkMemoryBarrier));\n    memory_barriers_offset = arguments_size;\n    arguments_size += sizeof(VkMemoryBarrier) * memory_barrier_count;\n  }\n  size_t buffer_memory_barriers_offset = 0;\n  if (buffer_memory_barrier_count) {\n    arguments_size = xe::align(arguments_size, alignof(VkBufferMemoryBarrier));\n    buffer_memory_barriers_offset = arguments_size;\n    arguments_size +=\n        sizeof(VkBufferMemoryBarrier) * buffer_memory_barrier_count;\n  }\n  size_t image_memory_barriers_offset = 0;\n  if (image_memory_barrier_count) {\n    arguments_size = xe::align(arguments_size, alignof(VkImageMemoryBarrier));\n    image_memory_barriers_offset = arguments_size;\n    arguments_size += sizeof(VkImageMemoryBarrier) * image_memory_barrier_count;\n  }\n  uint8_t* args_ptr = reinterpret_cast<uint8_t*>(\n      WriteCommand(Command::kVkPipelineBarrier, arguments_size));\n  auto& args = *reinterpret_cast<ArgsVkPipelineBarrier*>(args_ptr);\n  args.src_stage_mask = src_stage_mask;\n  args.dst_stage_mask = dst_stage_mask;\n  args.dependency_flags = dependency_flags;\n  args.memory_barrier_count = memory_barrier_count;\n  args.buffer_memory_barrier_count = buffer_memory_barrier_count;\n  args.image_memory_barrier_count = image_memory_barrier_count;\n  if (memory_barrier_count) {\n    std::memcpy(args_ptr + memory_barriers_offset, memory_barriers,\n                sizeof(VkMemoryBarrier) * memory_barrier_count);\n  }\n  if (buffer_memory_barrier_count) {\n    std::memcpy(args_ptr + buffer_memory_barriers_offset,\n                buffer_memory_barriers,\n                sizeof(VkBufferMemoryBarrier) * buffer_memory_barrier_count);\n  }\n  if (image_memory_barrier_count) {\n    std::memcpy(args_ptr + image_memory_barriers_offset, image_memory_barriers,\n                sizeof(VkImageMemoryBarrier) * image_memory_barrier_count);\n  }\n}\n\nvoid* DeferredCommandBuffer::WriteCommand(Command command,\n                                          size_t arguments_size_bytes) {\n  size_t arguments_size_elements =\n      (arguments_size_bytes + sizeof(uintmax_t) - 1) / sizeof(uintmax_t);\n  size_t offset = command_stream_.size();\n  command_stream_.resize(offset + kCommandHeaderSizeElements +\n                         arguments_size_elements);\n  CommandHeader& header =\n      *reinterpret_cast<CommandHeader*>(command_stream_.data() + offset);\n  header.command = command;\n  header.arguments_size_elements = uint32_t(arguments_size_elements);\n  return command_stream_.data() + (offset + kCommandHeaderSizeElements);\n}\n\n}  // namespace vulkan\n}  // namespace gpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/vulkan/deferred_command_buffer.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_VULKAN_DEFERRED_COMMAND_BUFFER_H_\n#define XENIA_GPU_VULKAN_DEFERRED_COMMAND_BUFFER_H_\n\n#include <cstddef>\n#include <cstdint>\n#include <cstring>\n#include <vector>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/ui/vulkan/vulkan_api.h\"\n\nnamespace xe {\nnamespace gpu {\nnamespace vulkan {\n\nclass VulkanCommandProcessor;\n\nclass DeferredCommandBuffer {\n public:\n  DeferredCommandBuffer(const VulkanCommandProcessor& command_processor,\n                        size_t initial_size_bytes = 1024 * 1024);\n\n  void Reset();\n  void Execute(VkCommandBuffer command_buffer);\n\n  // render_pass_begin->pNext of all barriers must be null.\n  void CmdVkBeginRenderPass(const VkRenderPassBeginInfo* render_pass_begin,\n                            VkSubpassContents contents) {\n    assert_null(render_pass_begin->pNext);\n    size_t arguments_size = sizeof(ArgsVkBeginRenderPass);\n    uint32_t clear_value_count = render_pass_begin->clearValueCount;\n    size_t clear_values_offset = 0;\n    if (clear_value_count) {\n      arguments_size = xe::align(arguments_size, alignof(VkClearValue));\n      clear_values_offset = arguments_size;\n      arguments_size += sizeof(VkClearValue) * clear_value_count;\n    }\n    uint8_t* args_ptr = reinterpret_cast<uint8_t*>(\n        WriteCommand(Command::kVkBeginRenderPass, arguments_size));\n    auto& args = *reinterpret_cast<ArgsVkBeginRenderPass*>(args_ptr);\n    args.render_pass = render_pass_begin->renderPass;\n    args.framebuffer = render_pass_begin->framebuffer;\n    args.render_area = render_pass_begin->renderArea;\n    args.clear_value_count = clear_value_count;\n    args.contents = contents;\n    if (clear_value_count) {\n      std::memcpy(args_ptr + clear_values_offset,\n                  render_pass_begin->pClearValues,\n                  sizeof(VkClearValue) * clear_value_count);\n    }\n  }\n\n  void CmdVkBindDescriptorSets(VkPipelineBindPoint pipeline_bind_point,\n                               VkPipelineLayout layout, uint32_t first_set,\n                               uint32_t descriptor_set_count,\n                               const VkDescriptorSet* descriptor_sets,\n                               uint32_t dynamic_offset_count,\n                               const uint32_t* dynamic_offsets) {\n    size_t arguments_size =\n        xe::align(sizeof(ArgsVkBindDescriptorSets), alignof(VkDescriptorSet));\n    size_t descriptor_sets_offset = arguments_size;\n    arguments_size += sizeof(VkDescriptorSet) * descriptor_set_count;\n    size_t dynamic_offsets_offset = 0;\n    if (dynamic_offset_count) {\n      arguments_size = xe::align(arguments_size, alignof(uint32_t));\n      dynamic_offsets_offset = arguments_size;\n      arguments_size += sizeof(uint32_t) * dynamic_offset_count;\n    }\n    uint8_t* args_ptr = reinterpret_cast<uint8_t*>(\n        WriteCommand(Command::kVkBindDescriptorSets, arguments_size));\n    auto& args = *reinterpret_cast<ArgsVkBindDescriptorSets*>(args_ptr);\n    args.pipeline_bind_point = pipeline_bind_point;\n    args.layout = layout;\n    args.first_set = first_set;\n    args.descriptor_set_count = descriptor_set_count;\n    args.dynamic_offset_count = dynamic_offset_count;\n    std::memcpy(args_ptr + descriptor_sets_offset, descriptor_sets,\n                sizeof(VkDescriptorSet) * descriptor_set_count);\n    if (dynamic_offset_count) {\n      std::memcpy(args_ptr + dynamic_offsets_offset, dynamic_offsets,\n                  sizeof(uint32_t) * dynamic_offset_count);\n    }\n  }\n\n  void CmdVkBindIndexBuffer(VkBuffer buffer, VkDeviceSize offset,\n                            VkIndexType index_type) {\n    auto& args = *reinterpret_cast<ArgsVkBindIndexBuffer*>(WriteCommand(\n        Command::kVkBindIndexBuffer, sizeof(ArgsVkBindIndexBuffer)));\n    args.buffer = buffer;\n    args.offset = offset;\n    args.index_type = index_type;\n  }\n\n  void CmdVkBindPipeline(VkPipelineBindPoint pipeline_bind_point,\n                         VkPipeline pipeline) {\n    auto& args = *reinterpret_cast<ArgsVkBindPipeline*>(\n        WriteCommand(Command::kVkBindPipeline, sizeof(ArgsVkBindPipeline)));\n    args.pipeline_bind_point = pipeline_bind_point;\n    args.pipeline = pipeline;\n  }\n\n  void CmdVkBindVertexBuffers(uint32_t first_binding, uint32_t binding_count,\n                              const VkBuffer* buffers,\n                              const VkDeviceSize* offsets) {\n    size_t arguments_size =\n        xe::align(sizeof(ArgsVkBindVertexBuffers), alignof(VkBuffer));\n    size_t buffers_offset = arguments_size;\n    arguments_size =\n        xe::align(arguments_size + sizeof(VkBuffer) * binding_count,\n                  alignof(VkDeviceSize));\n    size_t offsets_offset = arguments_size;\n    arguments_size += sizeof(VkDeviceSize) * binding_count;\n    uint8_t* args_ptr = reinterpret_cast<uint8_t*>(\n        WriteCommand(Command::kVkBindVertexBuffers, arguments_size));\n    auto& args = *reinterpret_cast<ArgsVkBindVertexBuffers*>(args_ptr);\n    args.first_binding = first_binding;\n    args.binding_count = binding_count;\n    std::memcpy(args_ptr + buffers_offset, buffers,\n                sizeof(VkBuffer) * binding_count);\n    std::memcpy(args_ptr + offsets_offset, offsets,\n                sizeof(VkDeviceSize) * binding_count);\n  }\n\n  void CmdClearAttachmentsEmplace(uint32_t attachment_count,\n                                  VkClearAttachment*& attachments_out,\n                                  uint32_t rect_count,\n                                  VkClearRect*& rects_out) {\n    size_t arguments_size =\n        xe::align(sizeof(ArgsVkClearAttachments), alignof(VkClearAttachment));\n    size_t attachments_offset = arguments_size;\n    arguments_size =\n        xe::align(arguments_size + sizeof(VkClearAttachment) * attachment_count,\n                  alignof(VkClearRect));\n    size_t rects_offset = arguments_size;\n    arguments_size += sizeof(VkClearRect) * rect_count;\n    uint8_t* args_ptr = reinterpret_cast<uint8_t*>(\n        WriteCommand(Command::kVkClearAttachments, arguments_size));\n    auto& args = *reinterpret_cast<ArgsVkClearAttachments*>(args_ptr);\n    args.attachment_count = attachment_count;\n    args.rect_count = rect_count;\n    attachments_out =\n        reinterpret_cast<VkClearAttachment*>(args_ptr + attachments_offset);\n    rects_out = reinterpret_cast<VkClearRect*>(args_ptr + rects_offset);\n  }\n  void CmdVkClearAttachments(uint32_t attachment_count,\n                             const VkClearAttachment* attachments,\n                             uint32_t rect_count, const VkClearRect* rects) {\n    VkClearAttachment* attachments_arg;\n    VkClearRect* rects_arg;\n    CmdClearAttachmentsEmplace(attachment_count, attachments_arg, rect_count,\n                               rects_arg);\n    std::memcpy(attachments_arg, attachments,\n                sizeof(VkClearAttachment) * attachment_count);\n    std::memcpy(rects_arg, rects, sizeof(VkClearRect) * rect_count);\n  }\n\n  VkImageSubresourceRange* CmdClearColorImageEmplace(\n      VkImage image, VkImageLayout image_layout, const VkClearColorValue* color,\n      uint32_t range_count) {\n    const size_t header_size = xe::align(sizeof(ArgsVkClearColorImage),\n                                         alignof(VkImageSubresourceRange));\n    uint8_t* args_ptr = reinterpret_cast<uint8_t*>(WriteCommand(\n        Command::kVkClearColorImage,\n        header_size + sizeof(VkImageSubresourceRange) * range_count));\n    auto& args = *reinterpret_cast<ArgsVkClearColorImage*>(args_ptr);\n    args.image = image;\n    args.image_layout = image_layout;\n    args.color = *color;\n    args.range_count = range_count;\n    return reinterpret_cast<VkImageSubresourceRange*>(args_ptr + header_size);\n  }\n  void CmdVkClearColorImage(VkImage image, VkImageLayout image_layout,\n                            const VkClearColorValue* color,\n                            uint32_t range_count,\n                            const VkImageSubresourceRange* ranges) {\n    std::memcpy(\n        CmdClearColorImageEmplace(image, image_layout, color, range_count),\n        ranges, sizeof(VkImageSubresourceRange) * range_count);\n  }\n\n  VkBufferCopy* CmdCopyBufferEmplace(VkBuffer src_buffer, VkBuffer dst_buffer,\n                                     uint32_t region_count) {\n    const size_t header_size =\n        xe::align(sizeof(ArgsVkCopyBuffer), alignof(VkBufferCopy));\n    uint8_t* args_ptr = reinterpret_cast<uint8_t*>(\n        WriteCommand(Command::kVkCopyBuffer,\n                     header_size + sizeof(VkBufferCopy) * region_count));\n    auto& args = *reinterpret_cast<ArgsVkCopyBuffer*>(args_ptr);\n    args.src_buffer = src_buffer;\n    args.dst_buffer = dst_buffer;\n    args.region_count = region_count;\n    return reinterpret_cast<VkBufferCopy*>(args_ptr + header_size);\n  }\n  void CmdVkCopyBuffer(VkBuffer src_buffer, VkBuffer dst_buffer,\n                       uint32_t region_count, const VkBufferCopy* regions) {\n    std::memcpy(CmdCopyBufferEmplace(src_buffer, dst_buffer, region_count),\n                regions, sizeof(VkBufferCopy) * region_count);\n  }\n\n  VkBufferImageCopy* CmdCopyBufferToImageEmplace(VkBuffer src_buffer,\n                                                 VkImage dst_image,\n                                                 VkImageLayout dst_image_layout,\n                                                 uint32_t region_count) {\n    const size_t header_size =\n        xe::align(sizeof(ArgsVkCopyBufferToImage), alignof(VkBufferImageCopy));\n    uint8_t* args_ptr = reinterpret_cast<uint8_t*>(\n        WriteCommand(Command::kVkCopyBufferToImage,\n                     header_size + sizeof(VkBufferImageCopy) * region_count));\n    auto& args = *reinterpret_cast<ArgsVkCopyBufferToImage*>(args_ptr);\n    args.src_buffer = src_buffer;\n    args.dst_image = dst_image;\n    args.dst_image_layout = dst_image_layout;\n    args.region_count = region_count;\n    return reinterpret_cast<VkBufferImageCopy*>(args_ptr + header_size);\n  }\n  void CmdVkCopyBufferToImage(VkBuffer src_buffer, VkImage dst_image,\n                              VkImageLayout dst_image_layout,\n                              uint32_t region_count,\n                              const VkBufferImageCopy* regions) {\n    std::memcpy(CmdCopyBufferToImageEmplace(src_buffer, dst_image,\n                                            dst_image_layout, region_count),\n                regions, sizeof(VkBufferImageCopy) * region_count);\n  }\n\n  void CmdVkDispatch(uint32_t group_count_x, uint32_t group_count_y,\n                     uint32_t group_count_z) {\n    auto& args = *reinterpret_cast<ArgsVkDispatch*>(\n        WriteCommand(Command::kVkDispatch, sizeof(ArgsVkDispatch)));\n    args.group_count_x = group_count_x;\n    args.group_count_y = group_count_y;\n    args.group_count_z = group_count_z;\n  }\n\n  void CmdVkDraw(uint32_t vertex_count, uint32_t instance_count,\n                 uint32_t first_vertex, uint32_t first_instance) {\n    auto& args = *reinterpret_cast<ArgsVkDraw*>(\n        WriteCommand(Command::kVkDraw, sizeof(ArgsVkDraw)));\n    args.vertex_count = vertex_count;\n    args.instance_count = instance_count;\n    args.first_vertex = first_vertex;\n    args.first_instance = first_instance;\n  }\n\n  void CmdVkDrawIndexed(uint32_t index_count, uint32_t instance_count,\n                        uint32_t first_index, int32_t vertex_offset,\n                        uint32_t first_instance) {\n    auto& args = *reinterpret_cast<ArgsVkDrawIndexed*>(\n        WriteCommand(Command::kVkDrawIndexed, sizeof(ArgsVkDrawIndexed)));\n    args.index_count = index_count;\n    args.instance_count = instance_count;\n    args.first_index = first_index;\n    args.vertex_offset = vertex_offset;\n    args.first_instance = first_instance;\n  }\n\n  void CmdVkEndRenderPass() { WriteCommand(Command::kVkEndRenderPass, 0); }\n\n  // pNext of all barriers must be null.\n  void CmdVkPipelineBarrier(VkPipelineStageFlags src_stage_mask,\n                            VkPipelineStageFlags dst_stage_mask,\n                            VkDependencyFlags dependency_flags,\n                            uint32_t memory_barrier_count,\n                            const VkMemoryBarrier* memory_barriers,\n                            uint32_t buffer_memory_barrier_count,\n                            const VkBufferMemoryBarrier* buffer_memory_barriers,\n                            uint32_t image_memory_barrier_count,\n                            const VkImageMemoryBarrier* image_memory_barriers);\n\n  void CmdVkPushConstants(VkPipelineLayout layout,\n                          VkShaderStageFlags stage_flags, uint32_t offset,\n                          uint32_t size, const void* values) {\n    uint8_t* args_ptr = reinterpret_cast<uint8_t*>(WriteCommand(\n        Command::kVkPushConstants, sizeof(ArgsVkPushConstants) + size));\n    auto& args = *reinterpret_cast<ArgsVkPushConstants*>(args_ptr);\n    args.layout = layout;\n    args.stage_flags = stage_flags;\n    args.offset = offset;\n    args.size = size;\n    std::memcpy(args_ptr + sizeof(ArgsVkPushConstants), values, size);\n  }\n\n  void CmdVkSetBlendConstants(const float* blend_constants) {\n    auto& args = *reinterpret_cast<ArgsVkSetBlendConstants*>(WriteCommand(\n        Command::kVkSetBlendConstants, sizeof(ArgsVkSetBlendConstants)));\n    std::memcpy(args.blend_constants, blend_constants, sizeof(float) * 4);\n  }\n\n  void CmdVkSetDepthBias(float depth_bias_constant_factor,\n                         float depth_bias_clamp,\n                         float depth_bias_slope_factor) {\n    auto& args = *reinterpret_cast<ArgsVkSetDepthBias*>(\n        WriteCommand(Command::kVkSetDepthBias, sizeof(ArgsVkSetDepthBias)));\n    args.depth_bias_constant_factor = depth_bias_constant_factor;\n    args.depth_bias_clamp = depth_bias_clamp;\n    args.depth_bias_slope_factor = depth_bias_slope_factor;\n  }\n\n  void CmdVkSetScissor(uint32_t first_scissor, uint32_t scissor_count,\n                       const VkRect2D* scissors) {\n    const size_t header_size =\n        xe::align(sizeof(ArgsVkSetScissor), alignof(VkRect2D));\n    uint8_t* args_ptr = reinterpret_cast<uint8_t*>(\n        WriteCommand(Command::kVkSetScissor,\n                     header_size + sizeof(VkRect2D) * scissor_count));\n    auto& args = *reinterpret_cast<ArgsVkSetScissor*>(args_ptr);\n    args.first_scissor = first_scissor;\n    args.scissor_count = scissor_count;\n    std::memcpy(args_ptr + header_size, scissors,\n                sizeof(VkRect2D) * scissor_count);\n  }\n\n  void CmdVkSetStencilCompareMask(VkStencilFaceFlags face_mask,\n                                  uint32_t compare_mask) {\n    auto& args = *reinterpret_cast<ArgsSetStencilMaskReference*>(\n        WriteCommand(Command::kVkSetStencilCompareMask,\n                     sizeof(ArgsSetStencilMaskReference)));\n    args.face_mask = face_mask;\n    args.mask_reference = compare_mask;\n  }\n\n  void CmdVkSetStencilReference(VkStencilFaceFlags face_mask,\n                                uint32_t reference) {\n    auto& args = *reinterpret_cast<ArgsSetStencilMaskReference*>(WriteCommand(\n        Command::kVkSetStencilReference, sizeof(ArgsSetStencilMaskReference)));\n    args.face_mask = face_mask;\n    args.mask_reference = reference;\n  }\n\n  void CmdVkSetStencilWriteMask(VkStencilFaceFlags face_mask,\n                                uint32_t write_mask) {\n    auto& args = *reinterpret_cast<ArgsSetStencilMaskReference*>(WriteCommand(\n        Command::kVkSetStencilWriteMask, sizeof(ArgsSetStencilMaskReference)));\n    args.face_mask = face_mask;\n    args.mask_reference = write_mask;\n  }\n\n  void CmdVkSetViewport(uint32_t first_viewport, uint32_t viewport_count,\n                        const VkViewport* viewports) {\n    const size_t header_size =\n        xe::align(sizeof(ArgsVkSetViewport), alignof(VkViewport));\n    uint8_t* args_ptr = reinterpret_cast<uint8_t*>(\n        WriteCommand(Command::kVkSetViewport,\n                     header_size + sizeof(VkViewport) * viewport_count));\n    auto& args = *reinterpret_cast<ArgsVkSetViewport*>(args_ptr);\n    args.first_viewport = first_viewport;\n    args.viewport_count = viewport_count;\n    std::memcpy(args_ptr + header_size, viewports,\n                sizeof(VkViewport) * viewport_count);\n  }\n\n private:\n  enum class Command {\n    kVkBeginRenderPass,\n    kVkBindDescriptorSets,\n    kVkBindIndexBuffer,\n    kVkBindPipeline,\n    kVkBindVertexBuffers,\n    kVkClearAttachments,\n    kVkClearColorImage,\n    kVkCopyBuffer,\n    kVkCopyBufferToImage,\n    kVkDispatch,\n    kVkDraw,\n    kVkDrawIndexed,\n    kVkEndRenderPass,\n    kVkPipelineBarrier,\n    kVkPushConstants,\n    kVkSetBlendConstants,\n    kVkSetDepthBias,\n    kVkSetScissor,\n    kVkSetStencilCompareMask,\n    kVkSetStencilReference,\n    kVkSetStencilWriteMask,\n    kVkSetViewport,\n  };\n\n  struct CommandHeader {\n    Command command;\n    uint32_t arguments_size_elements;\n  };\n  static constexpr size_t kCommandHeaderSizeElements =\n      (sizeof(CommandHeader) + sizeof(uintmax_t) - 1) / sizeof(uintmax_t);\n\n  struct ArgsVkBeginRenderPass {\n    VkRenderPass render_pass;\n    VkFramebuffer framebuffer;\n    VkRect2D render_area;\n    uint32_t clear_value_count;\n    VkSubpassContents contents;\n    // Followed by aligned optional VkClearValue[].\n    static_assert(alignof(VkClearValue) <= alignof(uintmax_t));\n  };\n\n  struct ArgsVkBindDescriptorSets {\n    VkPipelineBindPoint pipeline_bind_point;\n    VkPipelineLayout layout;\n    uint32_t first_set;\n    uint32_t descriptor_set_count;\n    uint32_t dynamic_offset_count;\n    // Followed by aligned VkDescriptorSet[], optional uint32_t[].\n    static_assert(alignof(VkDescriptorSet) <= alignof(uintmax_t));\n  };\n\n  struct ArgsVkBindIndexBuffer {\n    VkBuffer buffer;\n    VkDeviceSize offset;\n    VkIndexType index_type;\n  };\n\n  struct ArgsVkBindPipeline {\n    VkPipelineBindPoint pipeline_bind_point;\n    VkPipeline pipeline;\n  };\n\n  struct ArgsVkBindVertexBuffers {\n    uint32_t first_binding;\n    uint32_t binding_count;\n    // Followed by aligned VkBuffer[], VkDeviceSize[].\n    static_assert(alignof(VkBuffer) <= alignof(uintmax_t));\n    static_assert(alignof(VkDeviceSize) <= alignof(uintmax_t));\n  };\n\n  struct ArgsVkClearAttachments {\n    uint32_t attachment_count;\n    uint32_t rect_count;\n    // Followed by aligned VkClearAttachment[], VkClearRect[].\n    static_assert(alignof(VkClearAttachment) <= alignof(uintmax_t));\n    static_assert(alignof(VkClearRect) <= alignof(uintmax_t));\n  };\n\n  struct ArgsVkClearColorImage {\n    VkImage image;\n    VkImageLayout image_layout;\n    VkClearColorValue color;\n    uint32_t range_count;\n    // Followed by aligned VkImageSubresourceRange[].\n    static_assert(alignof(VkImageSubresourceRange) <= alignof(uintmax_t));\n  };\n\n  struct ArgsVkCopyBuffer {\n    VkBuffer src_buffer;\n    VkBuffer dst_buffer;\n    uint32_t region_count;\n    // Followed by aligned VkBufferCopy[].\n    static_assert(alignof(VkBufferCopy) <= alignof(uintmax_t));\n  };\n\n  struct ArgsVkCopyBufferToImage {\n    VkBuffer src_buffer;\n    VkImage dst_image;\n    VkImageLayout dst_image_layout;\n    uint32_t region_count;\n    // Followed by aligned VkBufferImageCopy[].\n    static_assert(alignof(VkBufferImageCopy) <= alignof(uintmax_t));\n  };\n\n  struct ArgsVkDispatch {\n    uint32_t group_count_x;\n    uint32_t group_count_y;\n    uint32_t group_count_z;\n  };\n\n  struct ArgsVkDraw {\n    uint32_t vertex_count;\n    uint32_t instance_count;\n    uint32_t first_vertex;\n    uint32_t first_instance;\n  };\n\n  struct ArgsVkDrawIndexed {\n    uint32_t index_count;\n    uint32_t instance_count;\n    uint32_t first_index;\n    int32_t vertex_offset;\n    uint32_t first_instance;\n  };\n\n  struct ArgsVkPipelineBarrier {\n    VkPipelineStageFlags src_stage_mask;\n    VkPipelineStageFlags dst_stage_mask;\n    VkDependencyFlags dependency_flags;\n    uint32_t memory_barrier_count;\n    uint32_t buffer_memory_barrier_count;\n    uint32_t image_memory_barrier_count;\n    // Followed by aligned optional VkMemoryBarrier[],\n    // optional VkBufferMemoryBarrier[], optional VkImageMemoryBarrier[].\n    static_assert(alignof(VkMemoryBarrier) <= alignof(uintmax_t));\n    static_assert(alignof(VkBufferMemoryBarrier) <= alignof(uintmax_t));\n    static_assert(alignof(VkImageMemoryBarrier) <= alignof(uintmax_t));\n  };\n\n  struct ArgsVkPushConstants {\n    VkPipelineLayout layout;\n    VkShaderStageFlags stage_flags;\n    uint32_t offset;\n    uint32_t size;\n    // Followed by `size` bytes of values.\n  };\n\n  struct ArgsVkSetBlendConstants {\n    float blend_constants[4];\n  };\n\n  struct ArgsVkSetDepthBias {\n    float depth_bias_constant_factor;\n    float depth_bias_clamp;\n    float depth_bias_slope_factor;\n  };\n\n  struct ArgsVkSetScissor {\n    uint32_t first_scissor;\n    uint32_t scissor_count;\n    // Followed by aligned VkRect2D[].\n    static_assert(alignof(VkRect2D) <= alignof(uintmax_t));\n  };\n\n  struct ArgsSetStencilMaskReference {\n    VkStencilFaceFlags face_mask;\n    uint32_t mask_reference;\n  };\n\n  struct ArgsVkSetViewport {\n    uint32_t first_viewport;\n    uint32_t viewport_count;\n    // Followed by aligned VkViewport[].\n    static_assert(alignof(VkViewport) <= alignof(uintmax_t));\n  };\n\n  void* WriteCommand(Command command, size_t arguments_size_bytes);\n\n  const VulkanCommandProcessor& command_processor_;\n\n  // uintmax_t to ensure uint64_t and pointer alignment of all structures.\n  std::vector<uintmax_t> command_stream_;\n};\n\n}  // namespace vulkan\n}  // namespace gpu\n}  // namespace xe\n\n#endif  // XENIA_GPU_VULKAN_DEFERRED_COMMAND_BUFFER_H_"
  },
  {
    "path": "src/xenia/gpu/vulkan/premake5.lua",
    "content": "project_root = \"../../../..\"\ninclude(project_root..\"/tools/build\")\n\ngroup(\"src\")\nproject(\"xenia-gpu-vulkan\")\n  uuid(\"717590b4-f579-4162-8f23-0624e87d6cca\")\n  kind(\"StaticLib\")\n  language(\"C++\")\n  links({\n    \"fmt\",\n    \"glslang-spirv\",\n    \"xenia-base\",\n    \"xenia-gpu\",\n    \"xenia-ui\",\n    \"xenia-ui-vulkan\",\n    \"xxhash\",\n  })\n  includedirs({\n    project_root..\"/third_party/Vulkan-Headers/include\",\n  })\n  local_platform_files()\n  files({\n    \"../shaders/bytecode/vulkan_spirv/*.h\",\n  })\n\ngroup(\"src\")\nproject(\"xenia-gpu-vulkan-trace-viewer\")\n  uuid(\"86a1dddc-a26a-4885-8c55-cf745225d93e\")\n  single_library_windowed_app_kind()\n  language(\"C++\")\n  links({\n    \"xenia-apu\",\n    \"xenia-apu-nop\",\n    \"xenia-base\",\n    \"xenia-core\",\n    \"xenia-cpu\",\n    \"xenia-gpu\",\n    \"xenia-gpu-vulkan\",\n    \"xenia-hid\",\n    \"xenia-hid-nop\",\n    \"xenia-kernel\",\n    \"xenia-ui\",\n    \"xenia-ui-vulkan\",\n    \"xenia-vfs\",\n  })\n  links({\n    \"aes_128\",\n    \"capstone\",\n    \"fmt\",\n    \"glslang-spirv\",\n    \"imgui\",\n    \"libavcodec\",\n    \"libavutil\",\n    \"mspack\",\n    \"snappy\",\n    \"xxhash\",\n  })\n  includedirs({\n    project_root..\"/third_party/Vulkan-Headers/include\",\n  })\n  files({\n    \"vulkan_trace_viewer_main.cc\",\n    \"../../ui/windowed_app_main_\"..platform_suffix..\".cc\",\n  })\n\n  filter(\"architecture:x86_64\")\n    links({\n      \"xenia-cpu-backend-x64\",\n    })\n\n  filter(\"platforms:Linux\")\n    links({\n      \"X11\",\n      \"xcb\",\n      \"X11-xcb\",\n    })\n\n  filter(\"platforms:Windows\")\n    -- Only create the .user file if it doesn't already exist.\n    local user_file = project_root..\"/build/xenia-gpu-vulkan-trace-viewer.vcxproj.user\"\n    if not os.isfile(user_file) then\n      debugdir(project_root)\n      debugargs({\n        \"2>&1\",\n        \"1>scratch/stdout-trace-viewer.txt\",\n      })\n    end\n\ngroup(\"src\")\nproject(\"xenia-gpu-vulkan-trace-dump\")\n  uuid(\"0dd0dd1c-b321-494d-ab9a-6c062f0c65cc\")\n  kind(\"ConsoleApp\")\n  language(\"C++\")\n  links({\n    \"xenia-apu\",\n    \"xenia-apu-nop\",\n    \"xenia-base\",\n    \"xenia-core\",\n    \"xenia-cpu\",\n    \"xenia-gpu\",\n    \"xenia-gpu-vulkan\",\n    \"xenia-hid\",\n    \"xenia-hid-nop\",\n    \"xenia-kernel\",\n    \"xenia-ui\",\n    \"xenia-ui-vulkan\",\n    \"xenia-vfs\",\n  })\n  links({\n    \"aes_128\",\n    \"capstone\",\n    \"fmt\",\n    \"glslang-spirv\",\n    \"imgui\",\n    \"libavcodec\",\n    \"libavutil\",\n    \"mspack\",\n    \"snappy\",\n    \"xxhash\",\n  })\n  includedirs({\n    project_root..\"/third_party/Vulkan-Headers/include\",\n  })\n  files({\n    \"vulkan_trace_dump_main.cc\",\n    \"../../base/console_app_main_\"..platform_suffix..\".cc\",\n  })\n\n  filter(\"architecture:x86_64\")\n    links({\n      \"xenia-cpu-backend-x64\",\n    })\n\n  filter(\"platforms:Linux\")\n    links({\n      \"X11\",\n      \"xcb\",\n      \"X11-xcb\",\n    })\n\n  filter(\"platforms:Windows\")\n    -- Only create the .user file if it doesn't already exist.\n    local user_file = project_root..\"/build/xenia-gpu-vulkan-trace-dump.vcxproj.user\"\n    if not os.isfile(user_file) then\n      debugdir(project_root)\n      debugargs({\n        \"2>&1\",\n        \"1>scratch/stdout-trace-dump.txt\",\n      })\n    end\n"
  },
  {
    "path": "src/xenia/gpu/vulkan/vulkan_command_processor.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/vulkan/vulkan_command_processor.h\"\n\n#include <algorithm>\n#include <array>\n#include <cstdint>\n#include <cstring>\n#include <iterator>\n#include <tuple>\n#include <utility>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/byte_order.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/profiling.h\"\n#include \"xenia/gpu/draw_util.h\"\n#include \"xenia/gpu/gpu_flags.h\"\n#include \"xenia/gpu/registers.h\"\n#include \"xenia/gpu/shader.h\"\n#include \"xenia/gpu/spirv_shader_translator.h\"\n#include \"xenia/gpu/vulkan/vulkan_pipeline_cache.h\"\n#include \"xenia/gpu/vulkan/vulkan_render_target_cache.h\"\n#include \"xenia/gpu/vulkan/vulkan_shader.h\"\n#include \"xenia/gpu/vulkan/vulkan_shared_memory.h\"\n#include \"xenia/gpu/xenos.h\"\n#include \"xenia/ui/vulkan/vulkan_presenter.h\"\n#include \"xenia/ui/vulkan/vulkan_util.h\"\n\nnamespace xe {\nnamespace gpu {\nnamespace vulkan {\n\n// Generated with `xb buildshaders`.\nnamespace shaders {\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/apply_gamma_pwl_fxaa_luma_ps.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/apply_gamma_pwl_ps.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/apply_gamma_table_fxaa_luma_ps.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/apply_gamma_table_ps.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/fullscreen_cw_vs.h\"\n}  // namespace shaders\n\nconst VkDescriptorPoolSize\n    VulkanCommandProcessor::kDescriptorPoolSizeUniformBuffer = {\n        VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,\n        SpirvShaderTranslator::kConstantBufferCount*\n            kLinkedTypeDescriptorPoolSetCount};\n\nconst VkDescriptorPoolSize\n    VulkanCommandProcessor::kDescriptorPoolSizeStorageBuffer = {\n        VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, kLinkedTypeDescriptorPoolSetCount};\n\n// 2x descriptors for texture images because of unsigned and signed bindings.\nconst VkDescriptorPoolSize\n    VulkanCommandProcessor::kDescriptorPoolSizeTextures[2] = {\n        {VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,\n         2 * kLinkedTypeDescriptorPoolSetCount},\n        {VK_DESCRIPTOR_TYPE_SAMPLER, kLinkedTypeDescriptorPoolSetCount},\n};\n\nVulkanCommandProcessor::VulkanCommandProcessor(\n    VulkanGraphicsSystem* graphics_system, kernel::KernelState* kernel_state)\n    : CommandProcessor(graphics_system, kernel_state),\n      completion_timeline_(static_cast<const ui::vulkan::VulkanProvider*>(\n                               graphics_system->provider())\n                               ->vulkan_device()),\n      deferred_command_buffer_(*this),\n      transient_descriptor_allocator_uniform_buffer_(\n          static_cast<const ui::vulkan::VulkanProvider*>(\n              graphics_system->provider())\n              ->vulkan_device(),\n          &kDescriptorPoolSizeUniformBuffer, 1,\n          kLinkedTypeDescriptorPoolSetCount),\n      transient_descriptor_allocator_storage_buffer_(\n          static_cast<const ui::vulkan::VulkanProvider*>(\n              graphics_system->provider())\n              ->vulkan_device(),\n          &kDescriptorPoolSizeStorageBuffer, 1,\n          kLinkedTypeDescriptorPoolSetCount),\n      transient_descriptor_allocator_textures_(\n          static_cast<const ui::vulkan::VulkanProvider*>(\n              graphics_system->provider())\n              ->vulkan_device(),\n          kDescriptorPoolSizeTextures,\n          uint32_t(xe::countof(kDescriptorPoolSizeTextures)),\n          kLinkedTypeDescriptorPoolSetCount) {}\n\nVulkanCommandProcessor::~VulkanCommandProcessor() = default;\n\nvoid VulkanCommandProcessor::ClearCaches() {\n  CommandProcessor::ClearCaches();\n  cache_clear_requested_ = true;\n}\n\nvoid VulkanCommandProcessor::TracePlaybackWroteMemory(uint32_t base_ptr,\n                                                      uint32_t length) {\n  shared_memory_->MemoryInvalidationCallback(base_ptr, length, true);\n  primitive_processor_->MemoryInvalidationCallback(base_ptr, length, true);\n}\n\nvoid VulkanCommandProcessor::RestoreEdramSnapshot(const void* snapshot) {}\n\nstd::string VulkanCommandProcessor::GetWindowTitleText() const {\n  std::ostringstream title;\n  title << \"Vulkan\";\n  if (render_target_cache_) {\n    switch (render_target_cache_->GetPath()) {\n      case RenderTargetCache::Path::kHostRenderTargets:\n        title << \" - FBO\";\n        break;\n      case RenderTargetCache::Path::kPixelShaderInterlock:\n        title << \" - FSI\";\n        break;\n      default:\n        break;\n    }\n    uint32_t draw_resolution_scale_x =\n        texture_cache_ ? texture_cache_->draw_resolution_scale_x() : 1;\n    uint32_t draw_resolution_scale_y =\n        texture_cache_ ? texture_cache_->draw_resolution_scale_y() : 1;\n    if (draw_resolution_scale_x > 1 || draw_resolution_scale_y > 1) {\n      title << ' ' << draw_resolution_scale_x << 'x' << draw_resolution_scale_y;\n    }\n  }\n  title << \" - HEAVILY INCOMPLETE, early development\";\n  return title.str();\n}\n\nbool VulkanCommandProcessor::SetupContext() {\n  if (!CommandProcessor::SetupContext()) {\n    XELOGE(\"Failed to initialize base command processor context\");\n    return false;\n  }\n\n  const ui::vulkan::VulkanDevice* const vulkan_device = GetVulkanDevice();\n  const ui::vulkan::VulkanDevice::Functions& dfn = vulkan_device->functions();\n  const VkDevice device = vulkan_device->device();\n  const ui::vulkan::VulkanDevice::Properties& device_properties =\n      vulkan_device->properties();\n\n  // The unconditional inclusion of the vertex shader stage also covers the case\n  // of manual index / factor buffer fetch (the system constants and the shared\n  // memory are needed for that) in the tessellation vertex shader when\n  // fullDrawIndexUint32 is not supported.\n  guest_shader_pipeline_stages_ = VK_PIPELINE_STAGE_VERTEX_SHADER_BIT |\n                                  VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;\n  guest_shader_vertex_stages_ = VK_SHADER_STAGE_VERTEX_BIT;\n  if (device_properties.tessellationShader) {\n    guest_shader_pipeline_stages_ |=\n        VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT;\n    guest_shader_vertex_stages_ |= VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;\n  }\n  if (!device_properties.vertexPipelineStoresAndAtomics) {\n    // For memory export from vertex shaders converted to compute shaders.\n    guest_shader_pipeline_stages_ |= VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT;\n    guest_shader_vertex_stages_ |= VK_SHADER_STAGE_COMPUTE_BIT;\n  }\n\n  // 16384 is bigger than any single uniform buffer that Xenia needs, but is the\n  // minimum maxUniformBufferRange, thus the safe minimum amount.\n  uniform_buffer_pool_ = std::make_unique<ui::vulkan::VulkanUploadBufferPool>(\n      vulkan_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,\n      xe::align(std::max(ui::GraphicsUploadBufferPool::kDefaultPageSize,\n                         size_t(16384)),\n                size_t(device_properties.minUniformBufferOffsetAlignment)));\n\n  // Descriptor set layouts that don't depend on the setup of other subsystems.\n  VkShaderStageFlags guest_shader_stages =\n      guest_shader_vertex_stages_ | VK_SHADER_STAGE_FRAGMENT_BIT;\n  // Empty.\n  VkDescriptorSetLayoutCreateInfo descriptor_set_layout_create_info;\n  descriptor_set_layout_create_info.sType =\n      VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;\n  descriptor_set_layout_create_info.pNext = nullptr;\n  descriptor_set_layout_create_info.flags = 0;\n  descriptor_set_layout_create_info.bindingCount = 0;\n  descriptor_set_layout_create_info.pBindings = nullptr;\n  if (dfn.vkCreateDescriptorSetLayout(\n          device, &descriptor_set_layout_create_info, nullptr,\n          &descriptor_set_layout_empty_) != VK_SUCCESS) {\n    XELOGE(\"Failed to create an empty Vulkan descriptor set layout\");\n    return false;\n  }\n  // Guest draw constants.\n  VkDescriptorSetLayoutBinding descriptor_set_layout_bindings_constants\n      [SpirvShaderTranslator::kConstantBufferCount] = {};\n  for (uint32_t i = 0; i < SpirvShaderTranslator::kConstantBufferCount; ++i) {\n    VkDescriptorSetLayoutBinding& constants_binding =\n        descriptor_set_layout_bindings_constants[i];\n    constants_binding.binding = i;\n    constants_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;\n    constants_binding.descriptorCount = 1;\n    constants_binding.pImmutableSamplers = nullptr;\n  }\n  descriptor_set_layout_bindings_constants\n      [SpirvShaderTranslator::kConstantBufferSystem]\n          .stageFlags =\n      guest_shader_stages |\n      (device_properties.tessellationShader\n           ? VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT\n           : 0) |\n      (device_properties.geometryShader ? VK_SHADER_STAGE_GEOMETRY_BIT : 0);\n  descriptor_set_layout_bindings_constants\n      [SpirvShaderTranslator::kConstantBufferFloatVertex]\n          .stageFlags = guest_shader_vertex_stages_;\n  descriptor_set_layout_bindings_constants\n      [SpirvShaderTranslator::kConstantBufferFloatPixel]\n          .stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;\n  descriptor_set_layout_bindings_constants\n      [SpirvShaderTranslator::kConstantBufferBoolLoop]\n          .stageFlags = guest_shader_stages;\n  descriptor_set_layout_bindings_constants\n      [SpirvShaderTranslator::kConstantBufferFetch]\n          .stageFlags = guest_shader_stages;\n  descriptor_set_layout_create_info.bindingCount =\n      uint32_t(xe::countof(descriptor_set_layout_bindings_constants));\n  descriptor_set_layout_create_info.pBindings =\n      descriptor_set_layout_bindings_constants;\n  if (dfn.vkCreateDescriptorSetLayout(\n          device, &descriptor_set_layout_create_info, nullptr,\n          &descriptor_set_layout_constants_) != VK_SUCCESS) {\n    XELOGE(\n        \"Failed to create a Vulkan descriptor set layout for guest draw \"\n        \"constant buffers\");\n    return false;\n  }\n  // Transient: storage buffer for compute shaders.\n  VkDescriptorSetLayoutBinding descriptor_set_layout_binding_transient;\n  descriptor_set_layout_binding_transient.binding = 0;\n  descriptor_set_layout_binding_transient.descriptorType =\n      VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;\n  descriptor_set_layout_binding_transient.descriptorCount = 1;\n  descriptor_set_layout_binding_transient.stageFlags =\n      VK_SHADER_STAGE_COMPUTE_BIT;\n  descriptor_set_layout_binding_transient.pImmutableSamplers = nullptr;\n  descriptor_set_layout_create_info.bindingCount = 1;\n  descriptor_set_layout_create_info.pBindings =\n      &descriptor_set_layout_binding_transient;\n  if (dfn.vkCreateDescriptorSetLayout(\n          device, &descriptor_set_layout_create_info, nullptr,\n          &descriptor_set_layouts_single_transient_[size_t(\n              SingleTransientDescriptorLayout::kStorageBufferCompute)]) !=\n      VK_SUCCESS) {\n    XELOGE(\n        \"Failed to create a Vulkan descriptor set layout for a storage buffer \"\n        \"bound to the compute shader\");\n    return false;\n  }\n\n  shared_memory_ = std::make_unique<VulkanSharedMemory>(\n      *this, *memory_, trace_writer_, guest_shader_pipeline_stages_);\n  if (!shared_memory_->Initialize()) {\n    XELOGE(\"Failed to initialize shared memory\");\n    return false;\n  }\n\n  primitive_processor_ = std::make_unique<VulkanPrimitiveProcessor>(\n      *register_file_, *memory_, trace_writer_, *shared_memory_, *this);\n  if (!primitive_processor_->Initialize()) {\n    XELOGE(\"Failed to initialize the geometric primitive processor\");\n    return false;\n  }\n\n  uint32_t shared_memory_binding_count_log2 =\n      SpirvShaderTranslator::GetSharedMemoryStorageBufferCountLog2(\n          device_properties.maxStorageBufferRange);\n  uint32_t shared_memory_binding_count = UINT32_C(1)\n                                         << shared_memory_binding_count_log2;\n\n  // Requires the transient descriptor set layouts.\n  // TODO(Triang3l): Get the actual draw resolution scale when the texture cache\n  // supports resolution scaling.\n  render_target_cache_ = std::make_unique<VulkanRenderTargetCache>(\n      *register_file_, *memory_, trace_writer_, 1, 1, *this);\n  if (!render_target_cache_->Initialize(shared_memory_binding_count)) {\n    XELOGE(\"Failed to initialize the render target cache\");\n    return false;\n  }\n\n  // Shared memory and EDRAM descriptor set layout.\n  bool edram_fragment_shader_interlock =\n      render_target_cache_->GetPath() ==\n      RenderTargetCache::Path::kPixelShaderInterlock;\n  VkDescriptorSetLayoutBinding\n      shared_memory_and_edram_descriptor_set_layout_bindings[2];\n  shared_memory_and_edram_descriptor_set_layout_bindings[0].binding = 0;\n  shared_memory_and_edram_descriptor_set_layout_bindings[0].descriptorType =\n      VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;\n  shared_memory_and_edram_descriptor_set_layout_bindings[0].descriptorCount =\n      shared_memory_binding_count;\n  shared_memory_and_edram_descriptor_set_layout_bindings[0].stageFlags =\n      guest_shader_stages;\n  shared_memory_and_edram_descriptor_set_layout_bindings[0].pImmutableSamplers =\n      nullptr;\n  VkDescriptorSetLayoutCreateInfo\n      shared_memory_and_edram_descriptor_set_layout_create_info;\n  shared_memory_and_edram_descriptor_set_layout_create_info.sType =\n      VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;\n  shared_memory_and_edram_descriptor_set_layout_create_info.pNext = nullptr;\n  shared_memory_and_edram_descriptor_set_layout_create_info.flags = 0;\n  shared_memory_and_edram_descriptor_set_layout_create_info.pBindings =\n      shared_memory_and_edram_descriptor_set_layout_bindings;\n  if (edram_fragment_shader_interlock) {\n    // EDRAM.\n    shared_memory_and_edram_descriptor_set_layout_bindings[1].binding = 1;\n    shared_memory_and_edram_descriptor_set_layout_bindings[1].descriptorType =\n        VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;\n    shared_memory_and_edram_descriptor_set_layout_bindings[1].descriptorCount =\n        1;\n    shared_memory_and_edram_descriptor_set_layout_bindings[1].stageFlags =\n        VK_SHADER_STAGE_FRAGMENT_BIT;\n    shared_memory_and_edram_descriptor_set_layout_bindings[1]\n        .pImmutableSamplers = nullptr;\n    shared_memory_and_edram_descriptor_set_layout_create_info.bindingCount = 2;\n  } else {\n    shared_memory_and_edram_descriptor_set_layout_create_info.bindingCount = 1;\n  }\n  if (dfn.vkCreateDescriptorSetLayout(\n          device, &shared_memory_and_edram_descriptor_set_layout_create_info,\n          nullptr,\n          &descriptor_set_layout_shared_memory_and_edram_) != VK_SUCCESS) {\n    XELOGE(\n        \"Failed to create a Vulkan descriptor set layout for the shared memory \"\n        \"and the EDRAM\");\n    return false;\n  }\n\n  pipeline_cache_ = std::make_unique<VulkanPipelineCache>(\n      *this, *register_file_, *render_target_cache_,\n      guest_shader_vertex_stages_);\n  if (!pipeline_cache_->Initialize()) {\n    XELOGE(\"Failed to initialize the graphics pipeline cache\");\n    return false;\n  }\n\n  // Requires the transient descriptor set layouts.\n  // TODO(Triang3l): Actual draw resolution scale.\n  texture_cache_ =\n      VulkanTextureCache::Create(*register_file_, *shared_memory_, 1, 1, *this,\n                                 guest_shader_pipeline_stages_);\n  if (!texture_cache_) {\n    XELOGE(\"Failed to initialize the texture cache\");\n    return false;\n  }\n\n  // Shared memory and EDRAM common bindings.\n  VkDescriptorPoolSize descriptor_pool_sizes[1];\n  descriptor_pool_sizes[0].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;\n  descriptor_pool_sizes[0].descriptorCount =\n      shared_memory_binding_count + uint32_t(edram_fragment_shader_interlock);\n  VkDescriptorPoolCreateInfo descriptor_pool_create_info;\n  descriptor_pool_create_info.sType =\n      VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;\n  descriptor_pool_create_info.pNext = nullptr;\n  descriptor_pool_create_info.flags = 0;\n  descriptor_pool_create_info.maxSets = 1;\n  descriptor_pool_create_info.poolSizeCount = 1;\n  descriptor_pool_create_info.pPoolSizes = descriptor_pool_sizes;\n  if (dfn.vkCreateDescriptorPool(device, &descriptor_pool_create_info, nullptr,\n                                 &shared_memory_and_edram_descriptor_pool_) !=\n      VK_SUCCESS) {\n    XELOGE(\n        \"Failed to create the Vulkan descriptor pool for shared memory and \"\n        \"EDRAM\");\n    return false;\n  }\n  VkDescriptorSetAllocateInfo descriptor_set_allocate_info;\n  descriptor_set_allocate_info.sType =\n      VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;\n  descriptor_set_allocate_info.pNext = nullptr;\n  descriptor_set_allocate_info.descriptorPool =\n      shared_memory_and_edram_descriptor_pool_;\n  descriptor_set_allocate_info.descriptorSetCount = 1;\n  descriptor_set_allocate_info.pSetLayouts =\n      &descriptor_set_layout_shared_memory_and_edram_;\n  if (dfn.vkAllocateDescriptorSets(device, &descriptor_set_allocate_info,\n                                   &shared_memory_and_edram_descriptor_set_) !=\n      VK_SUCCESS) {\n    XELOGE(\n        \"Failed to allocate the Vulkan descriptor set for shared memory and \"\n        \"EDRAM\");\n    return false;\n  }\n  VkDescriptorBufferInfo\n      shared_memory_descriptor_buffers_info[SharedMemory::kBufferSize /\n                                            (128 << 20)];\n  uint32_t shared_memory_binding_range =\n      SharedMemory::kBufferSize >> shared_memory_binding_count_log2;\n  for (uint32_t i = 0; i < shared_memory_binding_count; ++i) {\n    VkDescriptorBufferInfo& shared_memory_descriptor_buffer_info =\n        shared_memory_descriptor_buffers_info[i];\n    shared_memory_descriptor_buffer_info.buffer = shared_memory_->buffer();\n    shared_memory_descriptor_buffer_info.offset =\n        shared_memory_binding_range * i;\n    shared_memory_descriptor_buffer_info.range = shared_memory_binding_range;\n  }\n  VkWriteDescriptorSet write_descriptor_sets[2];\n  VkWriteDescriptorSet& write_descriptor_set_shared_memory =\n      write_descriptor_sets[0];\n  write_descriptor_set_shared_memory.sType =\n      VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;\n  write_descriptor_set_shared_memory.pNext = nullptr;\n  write_descriptor_set_shared_memory.dstSet =\n      shared_memory_and_edram_descriptor_set_;\n  write_descriptor_set_shared_memory.dstBinding = 0;\n  write_descriptor_set_shared_memory.dstArrayElement = 0;\n  write_descriptor_set_shared_memory.descriptorCount =\n      shared_memory_binding_count;\n  write_descriptor_set_shared_memory.descriptorType =\n      VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;\n  write_descriptor_set_shared_memory.pImageInfo = nullptr;\n  write_descriptor_set_shared_memory.pBufferInfo =\n      shared_memory_descriptor_buffers_info;\n  write_descriptor_set_shared_memory.pTexelBufferView = nullptr;\n  VkDescriptorBufferInfo edram_descriptor_buffer_info;\n  if (edram_fragment_shader_interlock) {\n    edram_descriptor_buffer_info.buffer = render_target_cache_->edram_buffer();\n    edram_descriptor_buffer_info.offset = 0;\n    edram_descriptor_buffer_info.range = VK_WHOLE_SIZE;\n    VkWriteDescriptorSet& write_descriptor_set_edram = write_descriptor_sets[1];\n    write_descriptor_set_edram.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;\n    write_descriptor_set_edram.pNext = nullptr;\n    write_descriptor_set_edram.dstSet = shared_memory_and_edram_descriptor_set_;\n    write_descriptor_set_edram.dstBinding = 1;\n    write_descriptor_set_edram.dstArrayElement = 0;\n    write_descriptor_set_edram.descriptorCount = 1;\n    write_descriptor_set_edram.descriptorType =\n        VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;\n    write_descriptor_set_edram.pImageInfo = nullptr;\n    write_descriptor_set_edram.pBufferInfo = &edram_descriptor_buffer_info;\n    write_descriptor_set_edram.pTexelBufferView = nullptr;\n  }\n  dfn.vkUpdateDescriptorSets(device,\n                             1 + uint32_t(edram_fragment_shader_interlock),\n                             write_descriptor_sets, 0, nullptr);\n\n  // Swap objects.\n\n  // Gamma ramp, either device-local and host-visible at once, or separate\n  // device-local texel buffer and host-visible upload buffer.\n  gamma_ramp_256_entry_table_current_frame_ = UINT32_MAX;\n  gamma_ramp_pwl_current_frame_ = UINT32_MAX;\n  // Try to create a device-local host-visible buffer first, to skip copying.\n  constexpr uint32_t kGammaRampSize256EntryTable = sizeof(uint32_t) * 256;\n  constexpr uint32_t kGammaRampSizePWL = sizeof(uint16_t) * 2 * 3 * 128;\n  constexpr uint32_t kGammaRampSize =\n      kGammaRampSize256EntryTable + kGammaRampSizePWL;\n  VkBufferCreateInfo gamma_ramp_host_visible_buffer_create_info;\n  gamma_ramp_host_visible_buffer_create_info.sType =\n      VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;\n  gamma_ramp_host_visible_buffer_create_info.pNext = nullptr;\n  gamma_ramp_host_visible_buffer_create_info.flags = 0;\n  gamma_ramp_host_visible_buffer_create_info.size =\n      kGammaRampSize * kMaxFramesInFlight;\n  gamma_ramp_host_visible_buffer_create_info.usage =\n      VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;\n  gamma_ramp_host_visible_buffer_create_info.sharingMode =\n      VK_SHARING_MODE_EXCLUSIVE;\n  gamma_ramp_host_visible_buffer_create_info.queueFamilyIndexCount = 0;\n  gamma_ramp_host_visible_buffer_create_info.pQueueFamilyIndices = nullptr;\n  if (dfn.vkCreateBuffer(device, &gamma_ramp_host_visible_buffer_create_info,\n                         nullptr, &gamma_ramp_buffer_) == VK_SUCCESS) {\n    bool use_gamma_ramp_host_visible_buffer = false;\n    VkMemoryRequirements gamma_ramp_host_visible_buffer_memory_requirements;\n    dfn.vkGetBufferMemoryRequirements(\n        device, gamma_ramp_buffer_,\n        &gamma_ramp_host_visible_buffer_memory_requirements);\n    uint32_t gamma_ramp_host_visible_buffer_memory_types =\n        gamma_ramp_host_visible_buffer_memory_requirements.memoryTypeBits &\n        (vulkan_device->memory_types().device_local &\n         vulkan_device->memory_types().host_visible);\n    VkMemoryAllocateInfo gamma_ramp_host_visible_buffer_memory_allocate_info;\n    // Prefer a host-uncached (because it's write-only) memory type, but try a\n    // host-cached host-visible device-local one as well.\n    if (xe::bit_scan_forward(\n            gamma_ramp_host_visible_buffer_memory_types &\n                ~vulkan_device->memory_types().host_cached,\n            &(gamma_ramp_host_visible_buffer_memory_allocate_info\n                  .memoryTypeIndex)) ||\n        xe::bit_scan_forward(\n            gamma_ramp_host_visible_buffer_memory_types,\n            &(gamma_ramp_host_visible_buffer_memory_allocate_info\n                  .memoryTypeIndex))) {\n      VkMemoryAllocateInfo*\n          gamma_ramp_host_visible_buffer_memory_allocate_info_last =\n              &gamma_ramp_host_visible_buffer_memory_allocate_info;\n      gamma_ramp_host_visible_buffer_memory_allocate_info.sType =\n          VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;\n      gamma_ramp_host_visible_buffer_memory_allocate_info.pNext = nullptr;\n      gamma_ramp_host_visible_buffer_memory_allocate_info.allocationSize =\n          gamma_ramp_host_visible_buffer_memory_requirements.size;\n      VkMemoryDedicatedAllocateInfo\n          gamma_ramp_host_visible_buffer_memory_dedicated_allocate_info;\n      if (vulkan_device->extensions().ext_1_1_KHR_dedicated_allocation) {\n        gamma_ramp_host_visible_buffer_memory_allocate_info_last->pNext =\n            &gamma_ramp_host_visible_buffer_memory_dedicated_allocate_info;\n        gamma_ramp_host_visible_buffer_memory_allocate_info_last =\n            reinterpret_cast<VkMemoryAllocateInfo*>(\n                &gamma_ramp_host_visible_buffer_memory_dedicated_allocate_info);\n        gamma_ramp_host_visible_buffer_memory_dedicated_allocate_info.sType =\n            VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO;\n        gamma_ramp_host_visible_buffer_memory_dedicated_allocate_info.pNext =\n            nullptr;\n        gamma_ramp_host_visible_buffer_memory_dedicated_allocate_info.image =\n            VK_NULL_HANDLE;\n        gamma_ramp_host_visible_buffer_memory_dedicated_allocate_info.buffer =\n            gamma_ramp_buffer_;\n      }\n      if (dfn.vkAllocateMemory(\n              device, &gamma_ramp_host_visible_buffer_memory_allocate_info,\n              nullptr, &gamma_ramp_buffer_memory_) == VK_SUCCESS) {\n        if (dfn.vkBindBufferMemory(device, gamma_ramp_buffer_,\n                                   gamma_ramp_buffer_memory_,\n                                   0) == VK_SUCCESS) {\n          if (dfn.vkMapMemory(device, gamma_ramp_buffer_memory_, 0,\n                              VK_WHOLE_SIZE, 0,\n                              &gamma_ramp_upload_mapping_) == VK_SUCCESS) {\n            use_gamma_ramp_host_visible_buffer = true;\n            gamma_ramp_upload_memory_size_ =\n                gamma_ramp_host_visible_buffer_memory_allocate_info\n                    .allocationSize;\n            gamma_ramp_upload_memory_type_ =\n                gamma_ramp_host_visible_buffer_memory_allocate_info\n                    .memoryTypeIndex;\n          }\n        }\n        if (!use_gamma_ramp_host_visible_buffer) {\n          dfn.vkFreeMemory(device, gamma_ramp_buffer_memory_, nullptr);\n          gamma_ramp_buffer_memory_ = VK_NULL_HANDLE;\n        }\n      }\n    }\n    if (!use_gamma_ramp_host_visible_buffer) {\n      dfn.vkDestroyBuffer(device, gamma_ramp_buffer_, nullptr);\n      gamma_ramp_buffer_ = VK_NULL_HANDLE;\n    }\n  }\n  if (gamma_ramp_buffer_ == VK_NULL_HANDLE) {\n    // Create separate buffers for the shader and uploading.\n    if (!ui::vulkan::util::CreateDedicatedAllocationBuffer(\n            vulkan_device, kGammaRampSize,\n            VK_BUFFER_USAGE_TRANSFER_DST_BIT |\n                VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT,\n            ui::vulkan::util::MemoryPurpose::kDeviceLocal, gamma_ramp_buffer_,\n            gamma_ramp_buffer_memory_)) {\n      XELOGE(\"Failed to create the gamma ramp buffer\");\n      return false;\n    }\n    if (!ui::vulkan::util::CreateDedicatedAllocationBuffer(\n            vulkan_device, kGammaRampSize * kMaxFramesInFlight,\n            VK_BUFFER_USAGE_TRANSFER_SRC_BIT,\n            ui::vulkan::util::MemoryPurpose::kUpload, gamma_ramp_upload_buffer_,\n            gamma_ramp_upload_buffer_memory_, &gamma_ramp_upload_memory_type_,\n            &gamma_ramp_upload_memory_size_)) {\n      XELOGE(\"Failed to create the gamma ramp upload buffer\");\n      return false;\n    }\n    if (dfn.vkMapMemory(device, gamma_ramp_upload_buffer_memory_, 0,\n                        VK_WHOLE_SIZE, 0,\n                        &gamma_ramp_upload_mapping_) != VK_SUCCESS) {\n      XELOGE(\"Failed to map the gamma ramp upload buffer\");\n      return false;\n    }\n  }\n\n  // Gamma ramp buffer views.\n  uint32_t gamma_ramp_frame_count =\n      gamma_ramp_upload_buffer_ == VK_NULL_HANDLE ? kMaxFramesInFlight : 1;\n  VkBufferViewCreateInfo gamma_ramp_buffer_view_create_info;\n  gamma_ramp_buffer_view_create_info.sType =\n      VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;\n  gamma_ramp_buffer_view_create_info.pNext = nullptr;\n  gamma_ramp_buffer_view_create_info.flags = 0;\n  gamma_ramp_buffer_view_create_info.buffer = gamma_ramp_buffer_;\n  // 256-entry table.\n  gamma_ramp_buffer_view_create_info.format =\n      VK_FORMAT_A2B10G10R10_UNORM_PACK32;\n  gamma_ramp_buffer_view_create_info.range = kGammaRampSize256EntryTable;\n  for (uint32_t i = 0; i < gamma_ramp_frame_count; ++i) {\n    gamma_ramp_buffer_view_create_info.offset = kGammaRampSize * i;\n    if (dfn.vkCreateBufferView(device, &gamma_ramp_buffer_view_create_info,\n                               nullptr, &gamma_ramp_buffer_views_[i * 2]) !=\n        VK_SUCCESS) {\n      XELOGE(\"Failed to create a 256-entry table gamma ramp buffer view\");\n      return false;\n    }\n  }\n  // Piecewise linear.\n  gamma_ramp_buffer_view_create_info.format = VK_FORMAT_R16G16_UINT;\n  gamma_ramp_buffer_view_create_info.range = kGammaRampSizePWL;\n  for (uint32_t i = 0; i < gamma_ramp_frame_count; ++i) {\n    gamma_ramp_buffer_view_create_info.offset =\n        kGammaRampSize * i + kGammaRampSize256EntryTable;\n    if (dfn.vkCreateBufferView(device, &gamma_ramp_buffer_view_create_info,\n                               nullptr, &gamma_ramp_buffer_views_[i * 2 + 1]) !=\n        VK_SUCCESS) {\n      XELOGE(\"Failed to create a PWL gamma ramp buffer view\");\n      return false;\n    }\n  }\n\n  // Swap descriptor set layouts.\n  VkDescriptorSetLayoutBinding swap_descriptor_set_layout_binding;\n  swap_descriptor_set_layout_binding.binding = 0;\n  swap_descriptor_set_layout_binding.descriptorCount = 1;\n  swap_descriptor_set_layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;\n  swap_descriptor_set_layout_binding.pImmutableSamplers = nullptr;\n  VkDescriptorSetLayoutCreateInfo swap_descriptor_set_layout_create_info;\n  swap_descriptor_set_layout_create_info.sType =\n      VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;\n  swap_descriptor_set_layout_create_info.pNext = nullptr;\n  swap_descriptor_set_layout_create_info.flags = 0;\n  swap_descriptor_set_layout_create_info.bindingCount = 1;\n  swap_descriptor_set_layout_create_info.pBindings =\n      &swap_descriptor_set_layout_binding;\n  swap_descriptor_set_layout_binding.descriptorType =\n      VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;\n  if (dfn.vkCreateDescriptorSetLayout(\n          device, &swap_descriptor_set_layout_create_info, nullptr,\n          &swap_descriptor_set_layout_sampled_image_) != VK_SUCCESS) {\n    XELOGE(\n        \"Failed to create the presentation sampled image descriptor set \"\n        \"layout\");\n    return false;\n  }\n  swap_descriptor_set_layout_binding.descriptorType =\n      VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;\n  if (dfn.vkCreateDescriptorSetLayout(\n          device, &swap_descriptor_set_layout_create_info, nullptr,\n          &swap_descriptor_set_layout_uniform_texel_buffer_) != VK_SUCCESS) {\n    XELOGE(\n        \"Failed to create the presentation uniform texel buffer descriptor set \"\n        \"layout\");\n    return false;\n  }\n\n  // Swap descriptor pool.\n  std::array<VkDescriptorPoolSize, 2> swap_descriptor_pool_sizes;\n  VkDescriptorPoolCreateInfo swap_descriptor_pool_create_info;\n  swap_descriptor_pool_create_info.sType =\n      VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;\n  swap_descriptor_pool_create_info.pNext = nullptr;\n  swap_descriptor_pool_create_info.flags = 0;\n  swap_descriptor_pool_create_info.maxSets = 0;\n  swap_descriptor_pool_create_info.poolSizeCount = 0;\n  swap_descriptor_pool_create_info.pPoolSizes =\n      swap_descriptor_pool_sizes.data();\n  // TODO(Triang3l): FXAA combined image and sampler sources.\n  {\n    VkDescriptorPoolSize& swap_descriptor_pool_size_sampled_image =\n        swap_descriptor_pool_sizes[swap_descriptor_pool_create_info\n                                       .poolSizeCount++];\n    swap_descriptor_pool_size_sampled_image.type =\n        VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;\n    // Source images.\n    swap_descriptor_pool_size_sampled_image.descriptorCount =\n        kMaxFramesInFlight;\n    swap_descriptor_pool_create_info.maxSets += kMaxFramesInFlight;\n  }\n  // 256-entry table and PWL gamma ramps. If the gamma ramp buffer is\n  // host-visible, for multiple frames.\n  uint32_t gamma_ramp_buffer_view_count = 2 * gamma_ramp_frame_count;\n  {\n    VkDescriptorPoolSize& swap_descriptor_pool_size_uniform_texel_buffer =\n        swap_descriptor_pool_sizes[swap_descriptor_pool_create_info\n                                       .poolSizeCount++];\n    swap_descriptor_pool_size_uniform_texel_buffer.type =\n        VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;\n    swap_descriptor_pool_size_uniform_texel_buffer.descriptorCount =\n        gamma_ramp_buffer_view_count;\n    swap_descriptor_pool_create_info.maxSets += gamma_ramp_buffer_view_count;\n  }\n  if (dfn.vkCreateDescriptorPool(device, &swap_descriptor_pool_create_info,\n                                 nullptr,\n                                 &swap_descriptor_pool_) != VK_SUCCESS) {\n    XELOGE(\"Failed to create the presentation descriptor pool\");\n    return false;\n  }\n\n  // Swap descriptor set allocation.\n  VkDescriptorSetAllocateInfo swap_descriptor_set_allocate_info;\n  swap_descriptor_set_allocate_info.sType =\n      VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;\n  swap_descriptor_set_allocate_info.pNext = nullptr;\n  swap_descriptor_set_allocate_info.descriptorPool = swap_descriptor_pool_;\n  swap_descriptor_set_allocate_info.descriptorSetCount = 1;\n  swap_descriptor_set_allocate_info.pSetLayouts =\n      &swap_descriptor_set_layout_uniform_texel_buffer_;\n  for (uint32_t i = 0; i < gamma_ramp_buffer_view_count; ++i) {\n    if (dfn.vkAllocateDescriptorSets(device, &swap_descriptor_set_allocate_info,\n                                     &swap_descriptors_gamma_ramp_[i]) !=\n        VK_SUCCESS) {\n      XELOGE(\"Failed to allocate the gamma ramp descriptor sets\");\n      return false;\n    }\n  }\n  swap_descriptor_set_allocate_info.pSetLayouts =\n      &swap_descriptor_set_layout_sampled_image_;\n  for (uint32_t i = 0; i < kMaxFramesInFlight; ++i) {\n    if (dfn.vkAllocateDescriptorSets(device, &swap_descriptor_set_allocate_info,\n                                     &swap_descriptors_source_[i]) !=\n        VK_SUCCESS) {\n      XELOGE(\n          \"Failed to allocate the presentation source image descriptor sets\");\n      return false;\n    }\n  }\n\n  // Gamma ramp descriptor sets.\n  VkWriteDescriptorSet gamma_ramp_write_descriptor_set;\n  gamma_ramp_write_descriptor_set.sType =\n      VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;\n  gamma_ramp_write_descriptor_set.pNext = nullptr;\n  gamma_ramp_write_descriptor_set.dstBinding = 0;\n  gamma_ramp_write_descriptor_set.dstArrayElement = 0;\n  gamma_ramp_write_descriptor_set.descriptorCount = 1;\n  gamma_ramp_write_descriptor_set.descriptorType =\n      VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;\n  gamma_ramp_write_descriptor_set.pImageInfo = nullptr;\n  gamma_ramp_write_descriptor_set.pBufferInfo = nullptr;\n  for (uint32_t i = 0; i < gamma_ramp_buffer_view_count; ++i) {\n    gamma_ramp_write_descriptor_set.dstSet = swap_descriptors_gamma_ramp_[i];\n    gamma_ramp_write_descriptor_set.pTexelBufferView =\n        &gamma_ramp_buffer_views_[i];\n    dfn.vkUpdateDescriptorSets(device, 1, &gamma_ramp_write_descriptor_set, 0,\n                               nullptr);\n  }\n\n  // Gamma ramp application pipeline layout.\n  std::array<VkDescriptorSetLayout, kSwapApplyGammaDescriptorSetCount>\n      swap_apply_gamma_descriptor_set_layouts{};\n  swap_apply_gamma_descriptor_set_layouts[kSwapApplyGammaDescriptorSetRamp] =\n      swap_descriptor_set_layout_uniform_texel_buffer_;\n  swap_apply_gamma_descriptor_set_layouts[kSwapApplyGammaDescriptorSetSource] =\n      swap_descriptor_set_layout_sampled_image_;\n  VkPipelineLayoutCreateInfo swap_apply_gamma_pipeline_layout_create_info;\n  swap_apply_gamma_pipeline_layout_create_info.sType =\n      VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;\n  swap_apply_gamma_pipeline_layout_create_info.pNext = nullptr;\n  swap_apply_gamma_pipeline_layout_create_info.flags = 0;\n  swap_apply_gamma_pipeline_layout_create_info.setLayoutCount =\n      uint32_t(swap_apply_gamma_descriptor_set_layouts.size());\n  swap_apply_gamma_pipeline_layout_create_info.pSetLayouts =\n      swap_apply_gamma_descriptor_set_layouts.data();\n  swap_apply_gamma_pipeline_layout_create_info.pushConstantRangeCount = 0;\n  swap_apply_gamma_pipeline_layout_create_info.pPushConstantRanges = nullptr;\n  if (dfn.vkCreatePipelineLayout(\n          device, &swap_apply_gamma_pipeline_layout_create_info, nullptr,\n          &swap_apply_gamma_pipeline_layout_) != VK_SUCCESS) {\n    XELOGE(\"Failed to create the gamma ramp application pipeline layout\");\n    return false;\n  }\n\n  // Gamma application render pass. Doesn't make assumptions about outer usage\n  // (explicit barriers must be used instead) for simplicity of use in different\n  // scenarios with different pipelines.\n  VkAttachmentDescription swap_apply_gamma_render_pass_attachment;\n  swap_apply_gamma_render_pass_attachment.flags = 0;\n  swap_apply_gamma_render_pass_attachment.format =\n      ui::vulkan::VulkanPresenter::kGuestOutputFormat;\n  swap_apply_gamma_render_pass_attachment.samples = VK_SAMPLE_COUNT_1_BIT;\n  swap_apply_gamma_render_pass_attachment.loadOp =\n      VK_ATTACHMENT_LOAD_OP_DONT_CARE;\n  swap_apply_gamma_render_pass_attachment.storeOp =\n      VK_ATTACHMENT_STORE_OP_STORE;\n  swap_apply_gamma_render_pass_attachment.stencilLoadOp =\n      VK_ATTACHMENT_LOAD_OP_DONT_CARE;\n  swap_apply_gamma_render_pass_attachment.stencilStoreOp =\n      VK_ATTACHMENT_STORE_OP_DONT_CARE;\n  swap_apply_gamma_render_pass_attachment.initialLayout =\n      VK_IMAGE_LAYOUT_UNDEFINED;\n  swap_apply_gamma_render_pass_attachment.finalLayout =\n      VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;\n  VkAttachmentReference swap_apply_gamma_render_pass_color_attachment;\n  swap_apply_gamma_render_pass_color_attachment.attachment = 0;\n  swap_apply_gamma_render_pass_color_attachment.layout =\n      VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;\n  VkSubpassDescription swap_apply_gamma_render_pass_subpass = {};\n  swap_apply_gamma_render_pass_subpass.pipelineBindPoint =\n      VK_PIPELINE_BIND_POINT_GRAPHICS;\n  swap_apply_gamma_render_pass_subpass.colorAttachmentCount = 1;\n  swap_apply_gamma_render_pass_subpass.pColorAttachments =\n      &swap_apply_gamma_render_pass_color_attachment;\n  VkSubpassDependency swap_apply_gamma_render_pass_dependencies[2];\n  for (uint32_t i = 0; i < 2; ++i) {\n    VkSubpassDependency& swap_apply_gamma_render_pass_dependency =\n        swap_apply_gamma_render_pass_dependencies[i];\n    swap_apply_gamma_render_pass_dependency.srcSubpass =\n        i ? 0 : VK_SUBPASS_EXTERNAL;\n    swap_apply_gamma_render_pass_dependency.dstSubpass =\n        i ? VK_SUBPASS_EXTERNAL : 0;\n    swap_apply_gamma_render_pass_dependency.srcStageMask =\n        VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;\n    swap_apply_gamma_render_pass_dependency.dstStageMask =\n        VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;\n    swap_apply_gamma_render_pass_dependency.srcAccessMask =\n        VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;\n    swap_apply_gamma_render_pass_dependency.dstAccessMask =\n        VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;\n    swap_apply_gamma_render_pass_dependency.dependencyFlags =\n        VK_DEPENDENCY_BY_REGION_BIT;\n  }\n  VkRenderPassCreateInfo swap_apply_gamma_render_pass_create_info;\n  swap_apply_gamma_render_pass_create_info.sType =\n      VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;\n  swap_apply_gamma_render_pass_create_info.pNext = nullptr;\n  swap_apply_gamma_render_pass_create_info.flags = 0;\n  swap_apply_gamma_render_pass_create_info.attachmentCount = 1;\n  swap_apply_gamma_render_pass_create_info.pAttachments =\n      &swap_apply_gamma_render_pass_attachment;\n  swap_apply_gamma_render_pass_create_info.subpassCount = 1;\n  swap_apply_gamma_render_pass_create_info.pSubpasses =\n      &swap_apply_gamma_render_pass_subpass;\n  swap_apply_gamma_render_pass_create_info.dependencyCount =\n      uint32_t(xe::countof(swap_apply_gamma_render_pass_dependencies));\n  swap_apply_gamma_render_pass_create_info.pDependencies =\n      swap_apply_gamma_render_pass_dependencies;\n  if (dfn.vkCreateRenderPass(device, &swap_apply_gamma_render_pass_create_info,\n                             nullptr,\n                             &swap_apply_gamma_render_pass_) != VK_SUCCESS) {\n    XELOGE(\"Failed to create the gamma ramp application render pass\");\n    return false;\n  }\n\n  // Gamma ramp application pipeline.\n  // Using a graphics pipeline, not a compute one, because storage image support\n  // is optional for VK_FORMAT_A2B10G10R10_UNORM_PACK32.\n\n  enum SwapApplyGammaPixelShader {\n    kSwapApplyGammaPixelShader256EntryTable,\n    kSwapApplyGammaPixelShaderPWL,\n\n    kSwapApplyGammaPixelShaderCount,\n  };\n  std::array<VkShaderModule, kSwapApplyGammaPixelShaderCount>\n      swap_apply_gamma_pixel_shaders{};\n  bool swap_apply_gamma_pixel_shaders_created =\n      (swap_apply_gamma_pixel_shaders[kSwapApplyGammaPixelShader256EntryTable] =\n           ui::vulkan::util::CreateShaderModule(\n               vulkan_device, shaders::apply_gamma_table_ps,\n               sizeof(shaders::apply_gamma_table_ps))) != VK_NULL_HANDLE &&\n      (swap_apply_gamma_pixel_shaders[kSwapApplyGammaPixelShaderPWL] =\n           ui::vulkan::util::CreateShaderModule(\n               vulkan_device, shaders::apply_gamma_pwl_ps,\n               sizeof(shaders::apply_gamma_pwl_ps))) != VK_NULL_HANDLE;\n  if (!swap_apply_gamma_pixel_shaders_created) {\n    XELOGE(\"Failed to create the gamma ramp application pixel shader modules\");\n    for (VkShaderModule swap_apply_gamma_pixel_shader :\n         swap_apply_gamma_pixel_shaders) {\n      if (swap_apply_gamma_pixel_shader != VK_NULL_HANDLE) {\n        dfn.vkDestroyShaderModule(device, swap_apply_gamma_pixel_shader,\n                                  nullptr);\n      }\n    }\n    return false;\n  }\n\n  VkPipelineShaderStageCreateInfo swap_apply_gamma_pipeline_stages[2];\n  swap_apply_gamma_pipeline_stages[0].sType =\n      VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;\n  swap_apply_gamma_pipeline_stages[0].pNext = nullptr;\n  swap_apply_gamma_pipeline_stages[0].flags = 0;\n  swap_apply_gamma_pipeline_stages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;\n  swap_apply_gamma_pipeline_stages[0].module =\n      ui::vulkan::util::CreateShaderModule(vulkan_device,\n                                           shaders::fullscreen_cw_vs,\n                                           sizeof(shaders::fullscreen_cw_vs));\n  if (swap_apply_gamma_pipeline_stages[0].module == VK_NULL_HANDLE) {\n    XELOGE(\"Failed to create the gamma ramp application vertex shader module\");\n    for (VkShaderModule swap_apply_gamma_pixel_shader :\n         swap_apply_gamma_pixel_shaders) {\n      assert_true(swap_apply_gamma_pixel_shader != VK_NULL_HANDLE);\n      dfn.vkDestroyShaderModule(device, swap_apply_gamma_pixel_shader, nullptr);\n    }\n  }\n  swap_apply_gamma_pipeline_stages[0].pName = \"main\";\n  swap_apply_gamma_pipeline_stages[0].pSpecializationInfo = nullptr;\n  swap_apply_gamma_pipeline_stages[1].sType =\n      VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;\n  swap_apply_gamma_pipeline_stages[1].pNext = nullptr;\n  swap_apply_gamma_pipeline_stages[1].flags = 0;\n  swap_apply_gamma_pipeline_stages[1].stage = VK_SHADER_STAGE_FRAGMENT_BIT;\n  // The fragment shader module will be specified later.\n  swap_apply_gamma_pipeline_stages[1].pName = \"main\";\n  swap_apply_gamma_pipeline_stages[1].pSpecializationInfo = nullptr;\n\n  VkPipelineVertexInputStateCreateInfo\n      swap_apply_gamma_pipeline_vertex_input_state = {};\n  swap_apply_gamma_pipeline_vertex_input_state.sType =\n      VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;\n\n  VkPipelineInputAssemblyStateCreateInfo\n      swap_apply_gamma_pipeline_input_assembly_state;\n  swap_apply_gamma_pipeline_input_assembly_state.sType =\n      VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;\n  swap_apply_gamma_pipeline_input_assembly_state.pNext = nullptr;\n  swap_apply_gamma_pipeline_input_assembly_state.flags = 0;\n  swap_apply_gamma_pipeline_input_assembly_state.topology =\n      VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;\n  swap_apply_gamma_pipeline_input_assembly_state.primitiveRestartEnable =\n      VK_FALSE;\n\n  VkPipelineViewportStateCreateInfo swap_apply_gamma_pipeline_viewport_state;\n  swap_apply_gamma_pipeline_viewport_state.sType =\n      VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;\n  swap_apply_gamma_pipeline_viewport_state.pNext = nullptr;\n  swap_apply_gamma_pipeline_viewport_state.flags = 0;\n  swap_apply_gamma_pipeline_viewport_state.viewportCount = 1;\n  swap_apply_gamma_pipeline_viewport_state.pViewports = nullptr;\n  swap_apply_gamma_pipeline_viewport_state.scissorCount = 1;\n  swap_apply_gamma_pipeline_viewport_state.pScissors = nullptr;\n\n  VkPipelineRasterizationStateCreateInfo\n      swap_apply_gamma_pipeline_rasterization_state = {};\n  swap_apply_gamma_pipeline_rasterization_state.sType =\n      VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;\n  swap_apply_gamma_pipeline_rasterization_state.polygonMode =\n      VK_POLYGON_MODE_FILL;\n  swap_apply_gamma_pipeline_rasterization_state.cullMode = VK_CULL_MODE_NONE;\n  swap_apply_gamma_pipeline_rasterization_state.frontFace =\n      VK_FRONT_FACE_CLOCKWISE;\n  swap_apply_gamma_pipeline_rasterization_state.lineWidth = 1.0f;\n\n  VkPipelineMultisampleStateCreateInfo\n      swap_apply_gamma_pipeline_multisample_state = {};\n  swap_apply_gamma_pipeline_multisample_state.sType =\n      VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;\n  swap_apply_gamma_pipeline_multisample_state.rasterizationSamples =\n      VK_SAMPLE_COUNT_1_BIT;\n\n  VkPipelineColorBlendAttachmentState\n      swap_apply_gamma_pipeline_color_blend_attachment_state = {};\n  swap_apply_gamma_pipeline_color_blend_attachment_state.colorWriteMask =\n      VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT |\n      VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;\n  VkPipelineColorBlendStateCreateInfo\n      swap_apply_gamma_pipeline_color_blend_state = {};\n  swap_apply_gamma_pipeline_color_blend_state.sType =\n      VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;\n  swap_apply_gamma_pipeline_color_blend_state.attachmentCount = 1;\n  swap_apply_gamma_pipeline_color_blend_state.pAttachments =\n      &swap_apply_gamma_pipeline_color_blend_attachment_state;\n\n  static const VkDynamicState kSwapApplyGammaPipelineDynamicStates[] = {\n      VK_DYNAMIC_STATE_VIEWPORT,\n      VK_DYNAMIC_STATE_SCISSOR,\n  };\n  VkPipelineDynamicStateCreateInfo swap_apply_gamma_pipeline_dynamic_state;\n  swap_apply_gamma_pipeline_dynamic_state.sType =\n      VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;\n  swap_apply_gamma_pipeline_dynamic_state.pNext = nullptr;\n  swap_apply_gamma_pipeline_dynamic_state.flags = 0;\n  swap_apply_gamma_pipeline_dynamic_state.dynamicStateCount =\n      uint32_t(xe::countof(kSwapApplyGammaPipelineDynamicStates));\n  swap_apply_gamma_pipeline_dynamic_state.pDynamicStates =\n      kSwapApplyGammaPipelineDynamicStates;\n\n  VkGraphicsPipelineCreateInfo swap_apply_gamma_pipeline_create_info;\n  swap_apply_gamma_pipeline_create_info.sType =\n      VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;\n  swap_apply_gamma_pipeline_create_info.pNext = nullptr;\n  swap_apply_gamma_pipeline_create_info.flags = 0;\n  swap_apply_gamma_pipeline_create_info.stageCount =\n      uint32_t(xe::countof(swap_apply_gamma_pipeline_stages));\n  swap_apply_gamma_pipeline_create_info.pStages =\n      swap_apply_gamma_pipeline_stages;\n  swap_apply_gamma_pipeline_create_info.pVertexInputState =\n      &swap_apply_gamma_pipeline_vertex_input_state;\n  swap_apply_gamma_pipeline_create_info.pInputAssemblyState =\n      &swap_apply_gamma_pipeline_input_assembly_state;\n  swap_apply_gamma_pipeline_create_info.pTessellationState = nullptr;\n  swap_apply_gamma_pipeline_create_info.pViewportState =\n      &swap_apply_gamma_pipeline_viewport_state;\n  swap_apply_gamma_pipeline_create_info.pRasterizationState =\n      &swap_apply_gamma_pipeline_rasterization_state;\n  swap_apply_gamma_pipeline_create_info.pMultisampleState =\n      &swap_apply_gamma_pipeline_multisample_state;\n  swap_apply_gamma_pipeline_create_info.pDepthStencilState = nullptr;\n  swap_apply_gamma_pipeline_create_info.pColorBlendState =\n      &swap_apply_gamma_pipeline_color_blend_state;\n  swap_apply_gamma_pipeline_create_info.pDynamicState =\n      &swap_apply_gamma_pipeline_dynamic_state;\n  swap_apply_gamma_pipeline_create_info.layout =\n      swap_apply_gamma_pipeline_layout_;\n  swap_apply_gamma_pipeline_create_info.renderPass =\n      swap_apply_gamma_render_pass_;\n  swap_apply_gamma_pipeline_create_info.subpass = 0;\n  swap_apply_gamma_pipeline_create_info.basePipelineHandle = VK_NULL_HANDLE;\n  swap_apply_gamma_pipeline_create_info.basePipelineIndex = -1;\n  swap_apply_gamma_pipeline_stages[1].module =\n      swap_apply_gamma_pixel_shaders[kSwapApplyGammaPixelShader256EntryTable];\n  VkResult swap_apply_gamma_pipeline_256_entry_table_create_result =\n      dfn.vkCreateGraphicsPipelines(\n          device, VK_NULL_HANDLE, 1, &swap_apply_gamma_pipeline_create_info,\n          nullptr, &swap_apply_gamma_256_entry_table_pipeline_);\n  swap_apply_gamma_pipeline_stages[1].module =\n      swap_apply_gamma_pixel_shaders[kSwapApplyGammaPixelShaderPWL];\n  VkResult swap_apply_gamma_pipeline_pwl_create_result =\n      dfn.vkCreateGraphicsPipelines(device, VK_NULL_HANDLE, 1,\n                                    &swap_apply_gamma_pipeline_create_info,\n                                    nullptr, &swap_apply_gamma_pwl_pipeline_);\n  dfn.vkDestroyShaderModule(device, swap_apply_gamma_pipeline_stages[0].module,\n                            nullptr);\n  for (VkShaderModule swap_apply_gamma_pixel_shader :\n       swap_apply_gamma_pixel_shaders) {\n    assert_true(swap_apply_gamma_pixel_shader != VK_NULL_HANDLE);\n    dfn.vkDestroyShaderModule(device, swap_apply_gamma_pixel_shader, nullptr);\n  }\n  if (swap_apply_gamma_pipeline_256_entry_table_create_result != VK_SUCCESS ||\n      swap_apply_gamma_pipeline_pwl_create_result != VK_SUCCESS) {\n    XELOGE(\"Failed to create the gamma ramp application pipelines\");\n    return false;\n  }\n\n  // Just not to expose uninitialized memory.\n  std::memset(&system_constants_, 0, sizeof(system_constants_));\n\n  return true;\n}\n\nvoid VulkanCommandProcessor::ShutdownContext() {\n  AwaitAllQueueOperationsCompletion();\n\n  const ui::vulkan::VulkanDevice* const vulkan_device = GetVulkanDevice();\n  const ui::vulkan::VulkanDevice::Functions& dfn = vulkan_device->functions();\n  const VkDevice device = vulkan_device->device();\n\n  DestroyScratchBuffer();\n\n  for (SwapFramebuffer& swap_framebuffer : swap_framebuffers_) {\n    ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyFramebuffer, device,\n                                           swap_framebuffer.framebuffer);\n  }\n\n  ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyPipeline, device,\n                                         swap_apply_gamma_pwl_pipeline_);\n  ui::vulkan::util::DestroyAndNullHandle(\n      dfn.vkDestroyPipeline, device,\n      swap_apply_gamma_256_entry_table_pipeline_);\n  ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyRenderPass, device,\n                                         swap_apply_gamma_render_pass_);\n  ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyPipelineLayout, device,\n                                         swap_apply_gamma_pipeline_layout_);\n\n  ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyDescriptorPool, device,\n                                         swap_descriptor_pool_);\n\n  ui::vulkan::util::DestroyAndNullHandle(\n      dfn.vkDestroyDescriptorSetLayout, device,\n      swap_descriptor_set_layout_uniform_texel_buffer_);\n  ui::vulkan::util::DestroyAndNullHandle(\n      dfn.vkDestroyDescriptorSetLayout, device,\n      swap_descriptor_set_layout_sampled_image_);\n  for (VkBufferView& gamma_ramp_buffer_view : gamma_ramp_buffer_views_) {\n    ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyBufferView, device,\n                                           gamma_ramp_buffer_view);\n  }\n  ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyBuffer, device,\n                                         gamma_ramp_upload_buffer_);\n  ui::vulkan::util::DestroyAndNullHandle(dfn.vkFreeMemory, device,\n                                         gamma_ramp_upload_buffer_memory_);\n  ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyBuffer, device,\n                                         gamma_ramp_buffer_);\n  ui::vulkan::util::DestroyAndNullHandle(dfn.vkFreeMemory, device,\n                                         gamma_ramp_buffer_memory_);\n\n  ui::vulkan::util::DestroyAndNullHandle(\n      dfn.vkDestroyDescriptorPool, device,\n      shared_memory_and_edram_descriptor_pool_);\n\n  texture_cache_.reset();\n\n  pipeline_cache_.reset();\n\n  render_target_cache_.reset();\n\n  primitive_processor_.reset();\n\n  shared_memory_.reset();\n\n  ClearTransientDescriptorPools();\n\n  for (const auto& pipeline_layout_pair : pipeline_layouts_) {\n    dfn.vkDestroyPipelineLayout(\n        device, pipeline_layout_pair.second.GetPipelineLayout(), nullptr);\n  }\n  pipeline_layouts_.clear();\n  for (const auto& descriptor_set_layout_pair :\n       descriptor_set_layouts_textures_) {\n    dfn.vkDestroyDescriptorSetLayout(device, descriptor_set_layout_pair.second,\n                                     nullptr);\n  }\n  descriptor_set_layouts_textures_.clear();\n\n  ui::vulkan::util::DestroyAndNullHandle(\n      dfn.vkDestroyDescriptorSetLayout, device,\n      descriptor_set_layout_shared_memory_and_edram_);\n  for (VkDescriptorSetLayout& descriptor_set_layout_single_transient :\n       descriptor_set_layouts_single_transient_) {\n    ui::vulkan::util::DestroyAndNullHandle(\n        dfn.vkDestroyDescriptorSetLayout, device,\n        descriptor_set_layout_single_transient);\n  }\n  ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyDescriptorSetLayout,\n                                         device,\n                                         descriptor_set_layout_constants_);\n  ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyDescriptorSetLayout,\n                                         device, descriptor_set_layout_empty_);\n\n  uniform_buffer_pool_.reset();\n\n  sparse_bind_wait_stage_mask_ = 0;\n  sparse_buffer_binds_.clear();\n  sparse_memory_binds_.clear();\n\n  deferred_command_buffer_.Reset();\n  for (const auto& command_buffer_pair : command_buffers_submitted_) {\n    dfn.vkDestroyCommandPool(device, command_buffer_pair.second.pool, nullptr);\n  }\n  command_buffers_submitted_.clear();\n  for (const CommandBuffer& command_buffer : command_buffers_writable_) {\n    dfn.vkDestroyCommandPool(device, command_buffer.pool, nullptr);\n  }\n  command_buffers_writable_.clear();\n\n  for (const auto& destroy_pair : destroy_framebuffers_) {\n    dfn.vkDestroyFramebuffer(device, destroy_pair.second, nullptr);\n  }\n  destroy_framebuffers_.clear();\n  for (const auto& destroy_pair : destroy_buffers_) {\n    dfn.vkDestroyBuffer(device, destroy_pair.second, nullptr);\n  }\n  destroy_buffers_.clear();\n  for (const auto& destroy_pair : destroy_memory_) {\n    dfn.vkFreeMemory(device, destroy_pair.second, nullptr);\n  }\n  destroy_memory_.clear();\n\n  std::memset(closed_frame_submissions_, 0, sizeof(closed_frame_submissions_));\n  frame_completed_ = 0;\n  frame_current_ = 1;\n  frame_open_ = false;\n\n  for (const auto& semaphore : submissions_in_flight_semaphores_) {\n    dfn.vkDestroySemaphore(device, semaphore.second, nullptr);\n  }\n  submissions_in_flight_semaphores_.clear();\n  current_submission_wait_stage_masks_.clear();\n  for (VkSemaphore semaphore : current_submission_wait_semaphores_) {\n    dfn.vkDestroySemaphore(device, semaphore, nullptr);\n  }\n  current_submission_wait_semaphores_.clear();\n  submission_open_ = false;\n\n  for (VkSemaphore semaphore : semaphores_free_) {\n    dfn.vkDestroySemaphore(device, semaphore, nullptr);\n  }\n  semaphores_free_.clear();\n\n  device_lost_ = false;\n\n  CommandProcessor::ShutdownContext();\n}\n\nvoid VulkanCommandProcessor::WriteRegister(uint32_t index, uint32_t value) {\n  CommandProcessor::WriteRegister(index, value);\n\n  if (index >= XE_GPU_REG_SHADER_CONSTANT_000_X &&\n      index <= XE_GPU_REG_SHADER_CONSTANT_511_W) {\n    if (frame_open_) {\n      uint32_t float_constant_index =\n          (index - XE_GPU_REG_SHADER_CONSTANT_000_X) >> 2;\n      if (float_constant_index >= 256) {\n        float_constant_index -= 256;\n        if (current_float_constant_map_pixel_[float_constant_index >> 6] &\n            (1ull << (float_constant_index & 63))) {\n          current_constant_buffers_up_to_date_ &= ~(\n              UINT32_C(1) << SpirvShaderTranslator::kConstantBufferFloatPixel);\n        }\n      } else {\n        if (current_float_constant_map_vertex_[float_constant_index >> 6] &\n            (1ull << (float_constant_index & 63))) {\n          current_constant_buffers_up_to_date_ &= ~(\n              UINT32_C(1) << SpirvShaderTranslator::kConstantBufferFloatVertex);\n        }\n      }\n    }\n  } else if (index >= XE_GPU_REG_SHADER_CONSTANT_BOOL_000_031 &&\n             index <= XE_GPU_REG_SHADER_CONSTANT_LOOP_31) {\n    current_constant_buffers_up_to_date_ &=\n        ~(UINT32_C(1) << SpirvShaderTranslator::kConstantBufferBoolLoop);\n  } else if (index >= XE_GPU_REG_SHADER_CONSTANT_FETCH_00_0 &&\n             index <= XE_GPU_REG_SHADER_CONSTANT_FETCH_31_5) {\n    current_constant_buffers_up_to_date_ &=\n        ~(UINT32_C(1) << SpirvShaderTranslator::kConstantBufferFetch);\n    if (texture_cache_) {\n      texture_cache_->TextureFetchConstantWritten(\n          (index - XE_GPU_REG_SHADER_CONSTANT_FETCH_00_0) / 6);\n    }\n  }\n}\n\nvoid VulkanCommandProcessor::SparseBindBuffer(\n    VkBuffer buffer, uint32_t bind_count, const VkSparseMemoryBind* binds,\n    VkPipelineStageFlags wait_stage_mask) {\n  if (!bind_count) {\n    return;\n  }\n  SparseBufferBind& buffer_bind = sparse_buffer_binds_.emplace_back();\n  buffer_bind.buffer = buffer;\n  buffer_bind.bind_offset = sparse_memory_binds_.size();\n  buffer_bind.bind_count = bind_count;\n  sparse_memory_binds_.reserve(sparse_memory_binds_.size() + bind_count);\n  sparse_memory_binds_.insert(sparse_memory_binds_.end(), binds,\n                              binds + bind_count);\n  sparse_bind_wait_stage_mask_ |= wait_stage_mask;\n}\n\nvoid VulkanCommandProcessor::OnGammaRamp256EntryTableValueWritten() {\n  gamma_ramp_256_entry_table_current_frame_ = UINT32_MAX;\n}\n\nvoid VulkanCommandProcessor::OnGammaRampPWLValueWritten() {\n  gamma_ramp_pwl_current_frame_ = UINT32_MAX;\n}\n\nvoid VulkanCommandProcessor::IssueSwap(uint32_t frontbuffer_ptr,\n                                       uint32_t frontbuffer_width,\n                                       uint32_t frontbuffer_height) {\n  SCOPE_profile_cpu_f(\"gpu\");\n\n  ui::Presenter* presenter = graphics_system_->presenter();\n  if (!presenter) {\n    return;\n  }\n\n  // In case the swap command is the only one in the frame.\n  if (!BeginSubmission(true)) {\n    return;\n  }\n\n  // Obtaining the actual front buffer size to pass to RefreshGuestOutput,\n  // resolution-scaled if it's a resolve destination, or not otherwise.\n  uint32_t frontbuffer_width_scaled, frontbuffer_height_scaled;\n  xenos::TextureFormat frontbuffer_format;\n  VkImageView swap_texture_view = texture_cache_->RequestSwapTexture(\n      frontbuffer_width_scaled, frontbuffer_height_scaled, frontbuffer_format);\n  if (swap_texture_view == VK_NULL_HANDLE) {\n    return;\n  }\n\n  presenter->RefreshGuestOutput(\n      frontbuffer_width_scaled, frontbuffer_height_scaled, 1280, 720,\n      [this, frontbuffer_width_scaled, frontbuffer_height_scaled,\n       frontbuffer_format, swap_texture_view](\n          ui::Presenter::GuestOutputRefreshContext& context) -> bool {\n        // In case the swap command is the only one in the frame.\n        if (!BeginSubmission(true)) {\n          return false;\n        }\n\n        auto& vulkan_context = static_cast<\n            ui::vulkan::VulkanPresenter::VulkanGuestOutputRefreshContext&>(\n            context);\n        uint64_t guest_output_image_version = vulkan_context.image_version();\n\n        const ui::vulkan::VulkanDevice* const vulkan_device = GetVulkanDevice();\n        const ui::vulkan::VulkanDevice::Functions& dfn =\n            vulkan_device->functions();\n        const VkDevice device = vulkan_device->device();\n\n        uint32_t swap_frame_index =\n            uint32_t(frame_current_ % kMaxFramesInFlight);\n\n        // This is according to D3D::InitializePresentationParameters from a\n        // game executable, which initializes the 256-entry table gamma ramp for\n        // 8_8_8_8 output and the PWL gamma ramp for 2_10_10_10.\n        // TODO(Triang3l): Choose between the table and PWL based on\n        // DC_LUTA_CONTROL, support both for all formats (and also different\n        // increments for PWL).\n        bool use_pwl_gamma_ramp =\n            frontbuffer_format == xenos::TextureFormat::k_2_10_10_10 ||\n            frontbuffer_format ==\n                xenos::TextureFormat::k_2_10_10_10_AS_16_16_16_16;\n\n        // TODO(Triang3l): FXAA can result in more than 8 bits of precision.\n        context.SetIs8bpc(!use_pwl_gamma_ramp);\n\n        // Update the gamma ramp if it's out of date.\n        uint32_t& gamma_ramp_frame_index_ref =\n            use_pwl_gamma_ramp ? gamma_ramp_pwl_current_frame_\n                               : gamma_ramp_256_entry_table_current_frame_;\n        if (gamma_ramp_frame_index_ref == UINT32_MAX) {\n          constexpr uint32_t kGammaRampSize256EntryTable =\n              sizeof(uint32_t) * 256;\n          constexpr uint32_t kGammaRampSizePWL = sizeof(uint16_t) * 2 * 3 * 128;\n          constexpr uint32_t kGammaRampSize =\n              kGammaRampSize256EntryTable + kGammaRampSizePWL;\n          uint32_t gamma_ramp_offset_in_frame =\n              use_pwl_gamma_ramp ? kGammaRampSize256EntryTable : 0;\n          uint32_t gamma_ramp_upload_offset =\n              kGammaRampSize * swap_frame_index + gamma_ramp_offset_in_frame;\n          uint32_t gamma_ramp_size = use_pwl_gamma_ramp\n                                         ? kGammaRampSizePWL\n                                         : kGammaRampSize256EntryTable;\n          void* gamma_ramp_frame_upload =\n              reinterpret_cast<uint8_t*>(gamma_ramp_upload_mapping_) +\n              gamma_ramp_upload_offset;\n          if (std::endian::native != std::endian::little &&\n              use_pwl_gamma_ramp) {\n            // R16G16 is first R16, where the shader expects the base, and\n            // second G16, where the delta should be, but gamma_ramp_pwl_rgb()\n            // is an array of 32-bit DC_LUT_PWL_DATA registers - swap 16 bits in\n            // each 32.\n            auto gamma_ramp_pwl_upload =\n                reinterpret_cast<reg::DC_LUT_PWL_DATA*>(\n                    gamma_ramp_frame_upload);\n            const reg::DC_LUT_PWL_DATA* gamma_ramp_pwl = gamma_ramp_pwl_rgb();\n            for (size_t i = 0; i < 128 * 3; ++i) {\n              reg::DC_LUT_PWL_DATA& gamma_ramp_pwl_upload_entry =\n                  gamma_ramp_pwl_upload[i];\n              reg::DC_LUT_PWL_DATA gamma_ramp_pwl_entry = gamma_ramp_pwl[i];\n              gamma_ramp_pwl_upload_entry.base = gamma_ramp_pwl_entry.delta;\n              gamma_ramp_pwl_upload_entry.delta = gamma_ramp_pwl_entry.base;\n            }\n          } else {\n            std::memcpy(\n                gamma_ramp_frame_upload,\n                use_pwl_gamma_ramp\n                    ? static_cast<const void*>(gamma_ramp_pwl_rgb())\n                    : static_cast<const void*>(gamma_ramp_256_entry_table()),\n                gamma_ramp_size);\n          }\n          bool gamma_ramp_has_upload_buffer =\n              gamma_ramp_upload_buffer_memory_ != VK_NULL_HANDLE;\n          ui::vulkan::util::FlushMappedMemoryRange(\n              vulkan_device,\n              gamma_ramp_has_upload_buffer ? gamma_ramp_upload_buffer_memory_\n                                           : gamma_ramp_buffer_memory_,\n              gamma_ramp_upload_memory_type_, gamma_ramp_upload_offset,\n              gamma_ramp_upload_memory_size_, gamma_ramp_size);\n          if (gamma_ramp_has_upload_buffer) {\n            // Copy from the host-visible buffer to the device-local one.\n            PushBufferMemoryBarrier(\n                gamma_ramp_buffer_, gamma_ramp_offset_in_frame, gamma_ramp_size,\n                VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,\n                VK_PIPELINE_STAGE_TRANSFER_BIT, VK_ACCESS_SHADER_READ_BIT,\n                VK_ACCESS_TRANSFER_WRITE_BIT, VK_QUEUE_FAMILY_IGNORED,\n                VK_QUEUE_FAMILY_IGNORED, false);\n            SubmitBarriers(true);\n            VkBufferCopy gamma_ramp_buffer_copy;\n            gamma_ramp_buffer_copy.srcOffset = gamma_ramp_upload_offset;\n            gamma_ramp_buffer_copy.dstOffset = gamma_ramp_offset_in_frame;\n            gamma_ramp_buffer_copy.size = gamma_ramp_size;\n            deferred_command_buffer_.CmdVkCopyBuffer(gamma_ramp_upload_buffer_,\n                                                     gamma_ramp_buffer_, 1,\n                                                     &gamma_ramp_buffer_copy);\n            PushBufferMemoryBarrier(\n                gamma_ramp_buffer_, gamma_ramp_offset_in_frame, gamma_ramp_size,\n                VK_PIPELINE_STAGE_TRANSFER_BIT,\n                VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,\n                VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_SHADER_READ_BIT,\n                VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED, false);\n          }\n          // The device-local, but not host-visible, gamma ramp buffer doesn't\n          // have per-frame sets of gamma ramps.\n          gamma_ramp_frame_index_ref =\n              gamma_ramp_has_upload_buffer ? 0 : swap_frame_index;\n        }\n\n        // Make sure a framebuffer is available for the current guest output\n        // image version.\n        size_t swap_framebuffer_index = SIZE_MAX;\n        size_t swap_framebuffer_new_index = SIZE_MAX;\n        // Try to find the existing framebuffer for the current guest output\n        // image version, or an unused (without an existing framebuffer, or with\n        // one, but that has never actually been used dynamically) slot.\n        for (size_t i = 0; i < swap_framebuffers_.size(); ++i) {\n          const SwapFramebuffer& existing_swap_framebuffer =\n              swap_framebuffers_[i];\n          if (existing_swap_framebuffer.framebuffer != VK_NULL_HANDLE &&\n              existing_swap_framebuffer.version == guest_output_image_version) {\n            swap_framebuffer_index = i;\n            break;\n          }\n          if (existing_swap_framebuffer.framebuffer == VK_NULL_HANDLE ||\n              !existing_swap_framebuffer.last_submission) {\n            swap_framebuffer_new_index = i;\n          }\n        }\n        if (swap_framebuffer_index == SIZE_MAX) {\n          if (swap_framebuffer_new_index == SIZE_MAX) {\n            // Replace the earliest used framebuffer.\n            swap_framebuffer_new_index = 0;\n            for (size_t i = 1; i < swap_framebuffers_.size(); ++i) {\n              if (swap_framebuffers_[i].last_submission <\n                  swap_framebuffers_[swap_framebuffer_new_index]\n                      .last_submission) {\n                swap_framebuffer_new_index = i;\n              }\n            }\n          }\n          swap_framebuffer_index = swap_framebuffer_new_index;\n          SwapFramebuffer& new_swap_framebuffer =\n              swap_framebuffers_[swap_framebuffer_new_index];\n          if (new_swap_framebuffer.framebuffer != VK_NULL_HANDLE) {\n            if (GetCompletedSubmission() >=\n                new_swap_framebuffer.last_submission) {\n              dfn.vkDestroyFramebuffer(device, new_swap_framebuffer.framebuffer,\n                                       nullptr);\n            } else {\n              destroy_framebuffers_.emplace_back(\n                  new_swap_framebuffer.last_submission,\n                  new_swap_framebuffer.framebuffer);\n            }\n            new_swap_framebuffer.framebuffer = VK_NULL_HANDLE;\n          }\n          VkImageView guest_output_image_view = vulkan_context.image_view();\n          VkFramebufferCreateInfo swap_framebuffer_create_info;\n          swap_framebuffer_create_info.sType =\n              VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;\n          swap_framebuffer_create_info.pNext = nullptr;\n          swap_framebuffer_create_info.flags = 0;\n          swap_framebuffer_create_info.renderPass =\n              swap_apply_gamma_render_pass_;\n          swap_framebuffer_create_info.attachmentCount = 1;\n          swap_framebuffer_create_info.pAttachments = &guest_output_image_view;\n          swap_framebuffer_create_info.width = frontbuffer_width_scaled;\n          swap_framebuffer_create_info.height = frontbuffer_height_scaled;\n          swap_framebuffer_create_info.layers = 1;\n          if (dfn.vkCreateFramebuffer(\n                  device, &swap_framebuffer_create_info, nullptr,\n                  &new_swap_framebuffer.framebuffer) != VK_SUCCESS) {\n            XELOGE(\"Failed to create the Vulkan framebuffer for presentation\");\n            return false;\n          }\n          new_swap_framebuffer.version = guest_output_image_version;\n          // The actual submission index will be set if the framebuffer is\n          // actually used, not dropped due to some error.\n          new_swap_framebuffer.last_submission = 0;\n        }\n\n        if (vulkan_context.image_ever_written_previously()) {\n          // Insert a barrier after the last presenter's usage of the guest\n          // output image. Will be overwriting all the contents, so oldLayout\n          // layout is UNDEFINED. The render pass will do the layout transition,\n          // but newLayout must not be UNDEFINED.\n          PushImageMemoryBarrier(\n              vulkan_context.image(),\n              ui::vulkan::util::InitializeSubresourceRange(),\n              ui::vulkan::VulkanPresenter::kGuestOutputInternalStageMask,\n              VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,\n              ui::vulkan::VulkanPresenter::kGuestOutputInternalAccessMask,\n              VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_IMAGE_LAYOUT_UNDEFINED,\n              VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);\n        }\n\n        // End the current render pass before inserting barriers and starting a\n        // new one, and insert the barrier.\n        SubmitBarriers(true);\n\n        SwapFramebuffer& swap_framebuffer =\n            swap_framebuffers_[swap_framebuffer_index];\n        swap_framebuffer.last_submission = GetCurrentSubmission();\n\n        VkRenderPassBeginInfo render_pass_begin_info;\n        render_pass_begin_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;\n        render_pass_begin_info.pNext = nullptr;\n        render_pass_begin_info.renderPass = swap_apply_gamma_render_pass_;\n        render_pass_begin_info.framebuffer = swap_framebuffer.framebuffer;\n        render_pass_begin_info.renderArea.offset.x = 0;\n        render_pass_begin_info.renderArea.offset.y = 0;\n        render_pass_begin_info.renderArea.extent.width =\n            frontbuffer_width_scaled;\n        render_pass_begin_info.renderArea.extent.height =\n            frontbuffer_height_scaled;\n        render_pass_begin_info.clearValueCount = 0;\n        render_pass_begin_info.pClearValues = nullptr;\n        deferred_command_buffer_.CmdVkBeginRenderPass(\n            &render_pass_begin_info, VK_SUBPASS_CONTENTS_INLINE);\n\n        VkViewport viewport;\n        viewport.x = 0.0f;\n        viewport.y = 0.0f;\n        viewport.width = float(frontbuffer_width_scaled);\n        viewport.height = float(frontbuffer_height_scaled);\n        viewport.minDepth = 0.0f;\n        viewport.maxDepth = 1.0f;\n        SetViewport(viewport);\n        VkRect2D scissor;\n        scissor.offset.x = 0;\n        scissor.offset.y = 0;\n        scissor.extent.width = frontbuffer_width_scaled;\n        scissor.extent.height = frontbuffer_height_scaled;\n        SetScissor(scissor);\n\n        BindExternalGraphicsPipeline(\n            use_pwl_gamma_ramp ? swap_apply_gamma_pwl_pipeline_\n                               : swap_apply_gamma_256_entry_table_pipeline_);\n\n        VkDescriptorSet swap_descriptor_source =\n            swap_descriptors_source_[swap_frame_index];\n        VkDescriptorImageInfo swap_descriptor_source_image_info;\n        swap_descriptor_source_image_info.sampler = VK_NULL_HANDLE;\n        swap_descriptor_source_image_info.imageView = swap_texture_view;\n        swap_descriptor_source_image_info.imageLayout =\n            VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;\n        VkWriteDescriptorSet swap_descriptor_source_write;\n        swap_descriptor_source_write.sType =\n            VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;\n        swap_descriptor_source_write.pNext = nullptr;\n        swap_descriptor_source_write.dstSet = swap_descriptor_source;\n        swap_descriptor_source_write.dstBinding = 0;\n        swap_descriptor_source_write.dstArrayElement = 0;\n        swap_descriptor_source_write.descriptorCount = 1;\n        swap_descriptor_source_write.descriptorType =\n            VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;\n        swap_descriptor_source_write.pImageInfo =\n            &swap_descriptor_source_image_info;\n        swap_descriptor_source_write.pBufferInfo = nullptr;\n        swap_descriptor_source_write.pTexelBufferView = nullptr;\n        dfn.vkUpdateDescriptorSets(device, 1, &swap_descriptor_source_write, 0,\n                                   nullptr);\n\n        std::array<VkDescriptorSet, kSwapApplyGammaDescriptorSetCount>\n            swap_descriptor_sets{};\n        swap_descriptor_sets[kSwapApplyGammaDescriptorSetRamp] =\n            swap_descriptors_gamma_ramp_[2 * gamma_ramp_frame_index_ref +\n                                         uint32_t(use_pwl_gamma_ramp)];\n        swap_descriptor_sets[kSwapApplyGammaDescriptorSetSource] =\n            swap_descriptor_source;\n        // TODO(Triang3l): Red / blue swap without imageViewFormatSwizzle.\n        deferred_command_buffer_.CmdVkBindDescriptorSets(\n            VK_PIPELINE_BIND_POINT_GRAPHICS, swap_apply_gamma_pipeline_layout_,\n            0, uint32_t(swap_descriptor_sets.size()),\n            swap_descriptor_sets.data(), 0, nullptr);\n\n        deferred_command_buffer_.CmdVkDraw(3, 1, 0, 0);\n\n        deferred_command_buffer_.CmdVkEndRenderPass();\n\n        // Insert the release barrier.\n        PushImageMemoryBarrier(\n            vulkan_context.image(),\n            ui::vulkan::util::InitializeSubresourceRange(),\n            VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,\n            ui::vulkan::VulkanPresenter::kGuestOutputInternalStageMask,\n            VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,\n            ui::vulkan::VulkanPresenter::kGuestOutputInternalAccessMask,\n            VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,\n            ui::vulkan::VulkanPresenter::kGuestOutputInternalLayout);\n\n        // Need to submit all the commands before giving the image back to the\n        // presenter so it can submit its own commands for displaying it to the\n        // queue, and also need to submit the release barrier.\n        EndSubmission(true);\n        return true;\n      });\n\n  // End the frame even if did not present for any reason (the image refresher\n  // was not called), to prevent leaking per-frame resources.\n  EndSubmission(true);\n}\n\nbool VulkanCommandProcessor::PushBufferMemoryBarrier(\n    VkBuffer buffer, VkDeviceSize offset, VkDeviceSize size,\n    VkPipelineStageFlags src_stage_mask, VkPipelineStageFlags dst_stage_mask,\n    VkAccessFlags src_access_mask, VkAccessFlags dst_access_mask,\n    uint32_t src_queue_family_index, uint32_t dst_queue_family_index,\n    bool skip_if_equal) {\n  if (skip_if_equal && src_stage_mask == dst_stage_mask &&\n      src_access_mask == dst_access_mask &&\n      src_queue_family_index == dst_queue_family_index) {\n    return false;\n  }\n\n  // Separate different barriers for overlapping buffer ranges into different\n  // pipeline barrier commands.\n  for (const VkBufferMemoryBarrier& other_buffer_memory_barrier :\n       pending_barriers_buffer_memory_barriers_) {\n    if (other_buffer_memory_barrier.buffer != buffer ||\n        (size != VK_WHOLE_SIZE &&\n         offset + size <= other_buffer_memory_barrier.offset) ||\n        (other_buffer_memory_barrier.size != VK_WHOLE_SIZE &&\n         other_buffer_memory_barrier.offset +\n                 other_buffer_memory_barrier.size <=\n             offset)) {\n      continue;\n    }\n    if (other_buffer_memory_barrier.offset == offset &&\n        other_buffer_memory_barrier.size == size &&\n        other_buffer_memory_barrier.srcAccessMask == src_access_mask &&\n        other_buffer_memory_barrier.dstAccessMask == dst_access_mask &&\n        other_buffer_memory_barrier.srcQueueFamilyIndex ==\n            src_queue_family_index &&\n        other_buffer_memory_barrier.dstQueueFamilyIndex ==\n            dst_queue_family_index) {\n      // The barrier is already pending.\n      current_pending_barrier_.src_stage_mask |= src_stage_mask;\n      current_pending_barrier_.dst_stage_mask |= dst_stage_mask;\n      return true;\n    }\n    SplitPendingBarrier();\n    break;\n  }\n\n  current_pending_barrier_.src_stage_mask |= src_stage_mask;\n  current_pending_barrier_.dst_stage_mask |= dst_stage_mask;\n  VkBufferMemoryBarrier& buffer_memory_barrier =\n      pending_barriers_buffer_memory_barriers_.emplace_back();\n  buffer_memory_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;\n  buffer_memory_barrier.pNext = nullptr;\n  buffer_memory_barrier.srcAccessMask = src_access_mask;\n  buffer_memory_barrier.dstAccessMask = dst_access_mask;\n  buffer_memory_barrier.srcQueueFamilyIndex = src_queue_family_index;\n  buffer_memory_barrier.dstQueueFamilyIndex = dst_queue_family_index;\n  buffer_memory_barrier.buffer = buffer;\n  buffer_memory_barrier.offset = offset;\n  buffer_memory_barrier.size = size;\n  return true;\n}\n\nbool VulkanCommandProcessor::PushImageMemoryBarrier(\n    VkImage image, const VkImageSubresourceRange& subresource_range,\n    VkPipelineStageFlags src_stage_mask, VkPipelineStageFlags dst_stage_mask,\n    VkAccessFlags src_access_mask, VkAccessFlags dst_access_mask,\n    VkImageLayout old_layout, VkImageLayout new_layout,\n    uint32_t src_queue_family_index, uint32_t dst_queue_family_index,\n    bool skip_if_equal) {\n  if (skip_if_equal && src_stage_mask == dst_stage_mask &&\n      src_access_mask == dst_access_mask && old_layout == new_layout &&\n      src_queue_family_index == dst_queue_family_index) {\n    return false;\n  }\n\n  // Separate different barriers for overlapping image subresource ranges into\n  // different pipeline barrier commands.\n  for (const VkImageMemoryBarrier& other_image_memory_barrier :\n       pending_barriers_image_memory_barriers_) {\n    if (other_image_memory_barrier.image != image ||\n        !(other_image_memory_barrier.subresourceRange.aspectMask &\n          subresource_range.aspectMask) ||\n        (subresource_range.levelCount != VK_REMAINING_MIP_LEVELS &&\n         subresource_range.baseMipLevel + subresource_range.levelCount <=\n             other_image_memory_barrier.subresourceRange.baseMipLevel) ||\n        (other_image_memory_barrier.subresourceRange.levelCount !=\n             VK_REMAINING_MIP_LEVELS &&\n         other_image_memory_barrier.subresourceRange.baseMipLevel +\n                 other_image_memory_barrier.subresourceRange.levelCount <=\n             subresource_range.baseMipLevel) ||\n        (subresource_range.layerCount != VK_REMAINING_ARRAY_LAYERS &&\n         subresource_range.baseArrayLayer + subresource_range.layerCount <=\n             other_image_memory_barrier.subresourceRange.baseArrayLayer) ||\n        (other_image_memory_barrier.subresourceRange.layerCount !=\n             VK_REMAINING_ARRAY_LAYERS &&\n         other_image_memory_barrier.subresourceRange.baseArrayLayer +\n                 other_image_memory_barrier.subresourceRange.layerCount <=\n             subresource_range.baseArrayLayer)) {\n      continue;\n    }\n    if (other_image_memory_barrier.subresourceRange.aspectMask ==\n            subresource_range.aspectMask &&\n        other_image_memory_barrier.subresourceRange.baseMipLevel ==\n            subresource_range.baseMipLevel &&\n        other_image_memory_barrier.subresourceRange.levelCount ==\n            subresource_range.levelCount &&\n        other_image_memory_barrier.subresourceRange.baseArrayLayer ==\n            subresource_range.baseArrayLayer &&\n        other_image_memory_barrier.subresourceRange.layerCount ==\n            subresource_range.layerCount &&\n        other_image_memory_barrier.srcAccessMask == src_access_mask &&\n        other_image_memory_barrier.dstAccessMask == dst_access_mask &&\n        other_image_memory_barrier.oldLayout == old_layout &&\n        other_image_memory_barrier.newLayout == new_layout &&\n        other_image_memory_barrier.srcQueueFamilyIndex ==\n            src_queue_family_index &&\n        other_image_memory_barrier.dstQueueFamilyIndex ==\n            dst_queue_family_index) {\n      // The barrier is already pending.\n      current_pending_barrier_.src_stage_mask |= src_stage_mask;\n      current_pending_barrier_.dst_stage_mask |= dst_stage_mask;\n      return true;\n    }\n    SplitPendingBarrier();\n    break;\n  }\n\n  current_pending_barrier_.src_stage_mask |= src_stage_mask;\n  current_pending_barrier_.dst_stage_mask |= dst_stage_mask;\n  VkImageMemoryBarrier& image_memory_barrier =\n      pending_barriers_image_memory_barriers_.emplace_back();\n  image_memory_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;\n  image_memory_barrier.pNext = nullptr;\n  image_memory_barrier.srcAccessMask = src_access_mask;\n  image_memory_barrier.dstAccessMask = dst_access_mask;\n  image_memory_barrier.oldLayout = old_layout;\n  image_memory_barrier.newLayout = new_layout;\n  image_memory_barrier.srcQueueFamilyIndex = src_queue_family_index;\n  image_memory_barrier.dstQueueFamilyIndex = dst_queue_family_index;\n  image_memory_barrier.image = image;\n  image_memory_barrier.subresourceRange = subresource_range;\n  return true;\n}\n\nbool VulkanCommandProcessor::SubmitBarriers(bool force_end_render_pass) {\n  assert_true(submission_open_);\n  SplitPendingBarrier();\n  if (pending_barriers_.empty()) {\n    if (force_end_render_pass) {\n      EndRenderPass();\n    }\n    return false;\n  }\n  EndRenderPass();\n  for (auto it = pending_barriers_.cbegin(); it != pending_barriers_.cend();\n       ++it) {\n    auto it_next = std::next(it);\n    bool is_last = it_next == pending_barriers_.cend();\n    // .data() + offset, not &[offset], for buffer and image barriers, because\n    // if there are no buffer or image memory barriers in the last pipeline\n    // barriers, the offsets may be equal to the sizes of the vectors.\n    deferred_command_buffer_.CmdVkPipelineBarrier(\n        it->src_stage_mask ? it->src_stage_mask\n                           : VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,\n        it->dst_stage_mask ? it->dst_stage_mask\n                           : VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,\n        0, 0, nullptr,\n        uint32_t((is_last ? pending_barriers_buffer_memory_barriers_.size()\n                          : it_next->buffer_memory_barriers_offset) -\n                 it->buffer_memory_barriers_offset),\n        pending_barriers_buffer_memory_barriers_.data() +\n            it->buffer_memory_barriers_offset,\n        uint32_t((is_last ? pending_barriers_image_memory_barriers_.size()\n                          : it_next->image_memory_barriers_offset) -\n                 it->image_memory_barriers_offset),\n        pending_barriers_image_memory_barriers_.data() +\n            it->image_memory_barriers_offset);\n  }\n  pending_barriers_.clear();\n  pending_barriers_buffer_memory_barriers_.clear();\n  pending_barriers_image_memory_barriers_.clear();\n  current_pending_barrier_.buffer_memory_barriers_offset = 0;\n  current_pending_barrier_.image_memory_barriers_offset = 0;\n  return true;\n}\n\nvoid VulkanCommandProcessor::SubmitBarriersAndEnterRenderTargetCacheRenderPass(\n    VkRenderPass render_pass,\n    const VulkanRenderTargetCache::Framebuffer* framebuffer) {\n  SubmitBarriers(false);\n  if (current_render_pass_ == render_pass &&\n      current_framebuffer_ == framebuffer) {\n    return;\n  }\n  if (current_render_pass_ != VK_NULL_HANDLE) {\n    deferred_command_buffer_.CmdVkEndRenderPass();\n  }\n  current_render_pass_ = render_pass;\n  current_framebuffer_ = framebuffer;\n  VkRenderPassBeginInfo render_pass_begin_info;\n  render_pass_begin_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;\n  render_pass_begin_info.pNext = nullptr;\n  render_pass_begin_info.renderPass = render_pass;\n  render_pass_begin_info.framebuffer = framebuffer->framebuffer;\n  render_pass_begin_info.renderArea.offset.x = 0;\n  render_pass_begin_info.renderArea.offset.y = 0;\n  // TODO(Triang3l): Actual dirty width / height in the deferred command\n  // buffer.\n  render_pass_begin_info.renderArea.extent = framebuffer->host_extent;\n  render_pass_begin_info.clearValueCount = 0;\n  render_pass_begin_info.pClearValues = nullptr;\n  deferred_command_buffer_.CmdVkBeginRenderPass(&render_pass_begin_info,\n                                                VK_SUBPASS_CONTENTS_INLINE);\n}\n\nvoid VulkanCommandProcessor::EndRenderPass() {\n  assert_true(submission_open_);\n  if (current_render_pass_ == VK_NULL_HANDLE) {\n    return;\n  }\n  deferred_command_buffer_.CmdVkEndRenderPass();\n  current_render_pass_ = VK_NULL_HANDLE;\n  current_framebuffer_ = nullptr;\n}\n\nVkDescriptorSet VulkanCommandProcessor::AllocateSingleTransientDescriptor(\n    SingleTransientDescriptorLayout transient_descriptor_layout) {\n  assert_true(frame_open_);\n  VkDescriptorSet descriptor_set;\n  std::vector<VkDescriptorSet>& transient_descriptors_free =\n      single_transient_descriptors_free_[size_t(transient_descriptor_layout)];\n  if (!transient_descriptors_free.empty()) {\n    descriptor_set = transient_descriptors_free.back();\n    transient_descriptors_free.pop_back();\n  } else {\n    const ui::vulkan::VulkanDevice* const vulkan_device = GetVulkanDevice();\n    const ui::vulkan::VulkanDevice::Functions& dfn = vulkan_device->functions();\n    const VkDevice device = vulkan_device->device();\n    bool is_storage_buffer =\n        transient_descriptor_layout ==\n        SingleTransientDescriptorLayout::kStorageBufferCompute;\n    ui::vulkan::LinkedTypeDescriptorSetAllocator&\n        transient_descriptor_allocator =\n            is_storage_buffer ? transient_descriptor_allocator_storage_buffer_\n                              : transient_descriptor_allocator_uniform_buffer_;\n    VkDescriptorPoolSize descriptor_count;\n    descriptor_count.type = is_storage_buffer\n                                ? VK_DESCRIPTOR_TYPE_STORAGE_BUFFER\n                                : VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;\n    descriptor_count.descriptorCount = 1;\n    descriptor_set = transient_descriptor_allocator.Allocate(\n        GetSingleTransientDescriptorLayout(transient_descriptor_layout),\n        &descriptor_count, 1);\n    if (descriptor_set == VK_NULL_HANDLE) {\n      return VK_NULL_HANDLE;\n    }\n  }\n  UsedSingleTransientDescriptor used_descriptor;\n  used_descriptor.frame = frame_current_;\n  used_descriptor.layout = transient_descriptor_layout;\n  used_descriptor.set = descriptor_set;\n  single_transient_descriptors_used_.emplace_back(used_descriptor);\n  return descriptor_set;\n}\n\nVkDescriptorSetLayout VulkanCommandProcessor::GetTextureDescriptorSetLayout(\n    bool is_vertex, size_t texture_count, size_t sampler_count) {\n  size_t binding_count = texture_count + sampler_count;\n  if (!binding_count) {\n    return descriptor_set_layout_empty_;\n  }\n\n  TextureDescriptorSetLayoutKey texture_descriptor_set_layout_key;\n  texture_descriptor_set_layout_key.texture_count = uint32_t(texture_count);\n  texture_descriptor_set_layout_key.sampler_count = uint32_t(sampler_count);\n  texture_descriptor_set_layout_key.is_vertex = uint32_t(is_vertex);\n  auto it_existing =\n      descriptor_set_layouts_textures_.find(texture_descriptor_set_layout_key);\n  if (it_existing != descriptor_set_layouts_textures_.end()) {\n    return it_existing->second;\n  }\n\n  const ui::vulkan::VulkanDevice* const vulkan_device = GetVulkanDevice();\n  const ui::vulkan::VulkanDevice::Functions& dfn = vulkan_device->functions();\n  const VkDevice device = vulkan_device->device();\n\n  descriptor_set_layout_bindings_.clear();\n  descriptor_set_layout_bindings_.reserve(binding_count);\n  VkShaderStageFlags stage_flags =\n      is_vertex ? guest_shader_vertex_stages_ : VK_SHADER_STAGE_FRAGMENT_BIT;\n  for (size_t i = 0; i < texture_count; ++i) {\n    VkDescriptorSetLayoutBinding& descriptor_set_layout_binding =\n        descriptor_set_layout_bindings_.emplace_back();\n    descriptor_set_layout_binding.binding = uint32_t(i);\n    descriptor_set_layout_binding.descriptorType =\n        VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;\n    descriptor_set_layout_binding.descriptorCount = 1;\n    descriptor_set_layout_binding.stageFlags = stage_flags;\n  }\n  for (size_t i = 0; i < sampler_count; ++i) {\n    VkDescriptorSetLayoutBinding& descriptor_set_layout_binding =\n        descriptor_set_layout_bindings_.emplace_back();\n    descriptor_set_layout_binding.binding = uint32_t(texture_count + i);\n    descriptor_set_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;\n    descriptor_set_layout_binding.descriptorCount = 1;\n    descriptor_set_layout_binding.stageFlags = stage_flags;\n  }\n  VkDescriptorSetLayoutCreateInfo descriptor_set_layout_create_info;\n  descriptor_set_layout_create_info.sType =\n      VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;\n  descriptor_set_layout_create_info.pNext = nullptr;\n  descriptor_set_layout_create_info.flags = 0;\n  descriptor_set_layout_create_info.bindingCount = uint32_t(binding_count);\n  descriptor_set_layout_create_info.pBindings =\n      descriptor_set_layout_bindings_.data();\n  VkDescriptorSetLayout texture_descriptor_set_layout;\n  if (dfn.vkCreateDescriptorSetLayout(\n          device, &descriptor_set_layout_create_info, nullptr,\n          &texture_descriptor_set_layout) != VK_SUCCESS) {\n    return VK_NULL_HANDLE;\n  }\n  descriptor_set_layouts_textures_.emplace(texture_descriptor_set_layout_key,\n                                           texture_descriptor_set_layout);\n  return texture_descriptor_set_layout;\n}\n\nconst VulkanPipelineCache::PipelineLayoutProvider*\nVulkanCommandProcessor::GetPipelineLayout(size_t texture_count_pixel,\n                                          size_t sampler_count_pixel,\n                                          size_t texture_count_vertex,\n                                          size_t sampler_count_vertex) {\n  PipelineLayoutKey pipeline_layout_key;\n  pipeline_layout_key.texture_count_pixel = uint16_t(texture_count_pixel);\n  pipeline_layout_key.sampler_count_pixel = uint16_t(sampler_count_pixel);\n  pipeline_layout_key.texture_count_vertex = uint16_t(texture_count_vertex);\n  pipeline_layout_key.sampler_count_vertex = uint16_t(sampler_count_vertex);\n  {\n    auto it = pipeline_layouts_.find(pipeline_layout_key);\n    if (it != pipeline_layouts_.end()) {\n      return &it->second;\n    }\n  }\n\n  VkDescriptorSetLayout descriptor_set_layout_textures_vertex =\n      GetTextureDescriptorSetLayout(true, texture_count_vertex,\n                                    sampler_count_vertex);\n  if (descriptor_set_layout_textures_vertex == VK_NULL_HANDLE) {\n    XELOGE(\n        \"Failed to obtain a Vulkan descriptor set layout for {} sampled images \"\n        \"and {} samplers for guest vertex shaders\",\n        texture_count_vertex, sampler_count_vertex);\n    return nullptr;\n  }\n  VkDescriptorSetLayout descriptor_set_layout_textures_pixel =\n      GetTextureDescriptorSetLayout(false, texture_count_pixel,\n                                    sampler_count_pixel);\n  if (descriptor_set_layout_textures_pixel == VK_NULL_HANDLE) {\n    XELOGE(\n        \"Failed to obtain a Vulkan descriptor set layout for {} sampled images \"\n        \"and {} samplers for guest pixel shaders\",\n        texture_count_pixel, sampler_count_pixel);\n    return nullptr;\n  }\n\n  VkDescriptorSetLayout\n      descriptor_set_layouts[SpirvShaderTranslator::kDescriptorSetCount];\n  // Immutable layouts.\n  descriptor_set_layouts\n      [SpirvShaderTranslator::kDescriptorSetSharedMemoryAndEdram] =\n          descriptor_set_layout_shared_memory_and_edram_;\n  descriptor_set_layouts[SpirvShaderTranslator::kDescriptorSetConstants] =\n      descriptor_set_layout_constants_;\n  // Mutable layouts.\n  descriptor_set_layouts[SpirvShaderTranslator::kDescriptorSetTexturesVertex] =\n      descriptor_set_layout_textures_vertex;\n  descriptor_set_layouts[SpirvShaderTranslator::kDescriptorSetTexturesPixel] =\n      descriptor_set_layout_textures_pixel;\n\n  const ui::vulkan::VulkanDevice* const vulkan_device = GetVulkanDevice();\n  const ui::vulkan::VulkanDevice::Functions& dfn = vulkan_device->functions();\n  const VkDevice device = vulkan_device->device();\n\n  VkPipelineLayoutCreateInfo pipeline_layout_create_info;\n  pipeline_layout_create_info.sType =\n      VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;\n  pipeline_layout_create_info.pNext = nullptr;\n  pipeline_layout_create_info.flags = 0;\n  pipeline_layout_create_info.setLayoutCount =\n      uint32_t(xe::countof(descriptor_set_layouts));\n  pipeline_layout_create_info.pSetLayouts = descriptor_set_layouts;\n  pipeline_layout_create_info.pushConstantRangeCount = 0;\n  pipeline_layout_create_info.pPushConstantRanges = nullptr;\n  VkPipelineLayout pipeline_layout;\n  if (dfn.vkCreatePipelineLayout(device, &pipeline_layout_create_info, nullptr,\n                                 &pipeline_layout) != VK_SUCCESS) {\n    XELOGE(\n        \"Failed to create a Vulkan pipeline layout for guest drawing with {} \"\n        \"pixel shader and {} vertex shader textures\",\n        texture_count_pixel, texture_count_vertex);\n    return nullptr;\n  }\n  auto emplaced_pair = pipeline_layouts_.emplace(\n      std::piecewise_construct, std::forward_as_tuple(pipeline_layout_key),\n      std::forward_as_tuple(pipeline_layout,\n                            descriptor_set_layout_textures_vertex,\n                            descriptor_set_layout_textures_pixel));\n  // unordered_map insertion doesn't invalidate element references.\n  return &emplaced_pair.first->second;\n}\n\nVulkanCommandProcessor::ScratchBufferAcquisition\nVulkanCommandProcessor::AcquireScratchGpuBuffer(\n    VkDeviceSize size, VkPipelineStageFlags initial_stage_mask,\n    VkAccessFlags initial_access_mask) {\n  assert_true(submission_open_);\n  assert_false(scratch_buffer_used_);\n  if (!submission_open_ || scratch_buffer_used_ || !size) {\n    return ScratchBufferAcquisition();\n  }\n\n  uint64_t submission_current = GetCurrentSubmission();\n\n  if (scratch_buffer_ != VK_NULL_HANDLE && size <= scratch_buffer_size_) {\n    // Already used previously - transition.\n    PushBufferMemoryBarrier(scratch_buffer_, 0, VK_WHOLE_SIZE,\n                            scratch_buffer_last_stage_mask_, initial_stage_mask,\n                            scratch_buffer_last_access_mask_,\n                            initial_access_mask);\n    scratch_buffer_last_stage_mask_ = initial_stage_mask;\n    scratch_buffer_last_access_mask_ = initial_access_mask;\n    scratch_buffer_last_usage_submission_ = submission_current;\n    scratch_buffer_used_ = true;\n    return ScratchBufferAcquisition(*this, scratch_buffer_, initial_stage_mask,\n                                    initial_access_mask);\n  }\n\n  size = xe::align(size, kScratchBufferSizeIncrement);\n\n  const ui::vulkan::VulkanDevice* const vulkan_device = GetVulkanDevice();\n\n  VkDeviceMemory new_scratch_buffer_memory;\n  VkBuffer new_scratch_buffer;\n  // VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT for\n  // texture loading.\n  if (!ui::vulkan::util::CreateDedicatedAllocationBuffer(\n          vulkan_device, size,\n          VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,\n          ui::vulkan::util::MemoryPurpose::kDeviceLocal, new_scratch_buffer,\n          new_scratch_buffer_memory)) {\n    XELOGE(\n        \"VulkanCommandProcessor: Failed to create a {} MB scratch GPU buffer\",\n        size >> 20);\n    return ScratchBufferAcquisition();\n  }\n\n  if (GetCompletedSubmission() >= scratch_buffer_last_usage_submission_) {\n    const ui::vulkan::VulkanDevice::Functions& dfn = vulkan_device->functions();\n    const VkDevice device = vulkan_device->device();\n    if (scratch_buffer_ != VK_NULL_HANDLE) {\n      dfn.vkDestroyBuffer(device, scratch_buffer_, nullptr);\n    }\n    if (scratch_buffer_memory_ != VK_NULL_HANDLE) {\n      dfn.vkFreeMemory(device, scratch_buffer_memory_, nullptr);\n    }\n  } else {\n    if (scratch_buffer_ != VK_NULL_HANDLE) {\n      destroy_buffers_.emplace_back(scratch_buffer_last_usage_submission_,\n                                    scratch_buffer_);\n    }\n    if (scratch_buffer_memory_ != VK_NULL_HANDLE) {\n      destroy_memory_.emplace_back(scratch_buffer_last_usage_submission_,\n                                   scratch_buffer_memory_);\n    }\n  }\n\n  scratch_buffer_memory_ = new_scratch_buffer_memory;\n  scratch_buffer_ = new_scratch_buffer;\n  scratch_buffer_size_ = size;\n  // Not used yet, no need for a barrier.\n  scratch_buffer_last_stage_mask_ = initial_access_mask;\n  scratch_buffer_last_access_mask_ = initial_stage_mask;\n  scratch_buffer_last_usage_submission_ = submission_current;\n  scratch_buffer_used_ = true;\n  return ScratchBufferAcquisition(*this, new_scratch_buffer, initial_stage_mask,\n                                  initial_access_mask);\n}\n\nvoid VulkanCommandProcessor::BindExternalGraphicsPipeline(\n    VkPipeline pipeline, bool keep_dynamic_depth_bias,\n    bool keep_dynamic_blend_constants, bool keep_dynamic_stencil_mask_ref) {\n  if (!keep_dynamic_depth_bias) {\n    dynamic_depth_bias_update_needed_ = true;\n  }\n  if (!keep_dynamic_blend_constants) {\n    dynamic_blend_constants_update_needed_ = true;\n  }\n  if (!keep_dynamic_stencil_mask_ref) {\n    dynamic_stencil_compare_mask_front_update_needed_ = true;\n    dynamic_stencil_compare_mask_back_update_needed_ = true;\n    dynamic_stencil_write_mask_front_update_needed_ = true;\n    dynamic_stencil_write_mask_back_update_needed_ = true;\n    dynamic_stencil_reference_front_update_needed_ = true;\n    dynamic_stencil_reference_back_update_needed_ = true;\n  }\n  if (current_external_graphics_pipeline_ == pipeline) {\n    return;\n  }\n  deferred_command_buffer_.CmdVkBindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS,\n                                             pipeline);\n  current_external_graphics_pipeline_ = pipeline;\n  current_guest_graphics_pipeline_ = VK_NULL_HANDLE;\n  current_guest_graphics_pipeline_layout_ = VK_NULL_HANDLE;\n}\n\nvoid VulkanCommandProcessor::BindExternalComputePipeline(VkPipeline pipeline) {\n  if (current_external_compute_pipeline_ == pipeline) {\n    return;\n  }\n  deferred_command_buffer_.CmdVkBindPipeline(VK_PIPELINE_BIND_POINT_COMPUTE,\n                                             pipeline);\n  current_external_compute_pipeline_ = pipeline;\n}\n\nvoid VulkanCommandProcessor::SetViewport(const VkViewport& viewport) {\n  if (!dynamic_viewport_update_needed_) {\n    dynamic_viewport_update_needed_ |= dynamic_viewport_.x != viewport.x;\n    dynamic_viewport_update_needed_ |= dynamic_viewport_.y != viewport.y;\n    dynamic_viewport_update_needed_ |=\n        dynamic_viewport_.width != viewport.width;\n    dynamic_viewport_update_needed_ |=\n        dynamic_viewport_.height != viewport.height;\n    dynamic_viewport_update_needed_ |=\n        dynamic_viewport_.minDepth != viewport.minDepth;\n    dynamic_viewport_update_needed_ |=\n        dynamic_viewport_.maxDepth != viewport.maxDepth;\n  }\n  if (dynamic_viewport_update_needed_) {\n    dynamic_viewport_ = viewport;\n    deferred_command_buffer_.CmdVkSetViewport(0, 1, &dynamic_viewport_);\n    dynamic_viewport_update_needed_ = false;\n  }\n}\n\nvoid VulkanCommandProcessor::SetScissor(const VkRect2D& scissor) {\n  if (!dynamic_scissor_update_needed_) {\n    dynamic_scissor_update_needed_ |=\n        dynamic_scissor_.offset.x != scissor.offset.x;\n    dynamic_scissor_update_needed_ |=\n        dynamic_scissor_.offset.y != scissor.offset.y;\n    dynamic_scissor_update_needed_ |=\n        dynamic_scissor_.extent.width != scissor.extent.width;\n    dynamic_scissor_update_needed_ |=\n        dynamic_scissor_.extent.height != scissor.extent.height;\n  }\n  if (dynamic_scissor_update_needed_) {\n    dynamic_scissor_ = scissor;\n    deferred_command_buffer_.CmdVkSetScissor(0, 1, &dynamic_scissor_);\n    dynamic_scissor_update_needed_ = false;\n  }\n}\n\nShader* VulkanCommandProcessor::LoadShader(xenos::ShaderType shader_type,\n                                           uint32_t guest_address,\n                                           const uint32_t* host_address,\n                                           uint32_t dword_count) {\n  return pipeline_cache_->LoadShader(shader_type, host_address, dword_count);\n}\n\nbool VulkanCommandProcessor::IssueDraw(xenos::PrimitiveType prim_type,\n                                       uint32_t index_count,\n                                       IndexBufferInfo* index_buffer_info,\n                                       bool major_mode_explicit) {\n#if XE_GPU_FINE_GRAINED_DRAW_SCOPES\n  SCOPE_profile_cpu_f(\"gpu\");\n#endif  // XE_GPU_FINE_GRAINED_DRAW_SCOPES\n\n  const RegisterFile& regs = *register_file_;\n\n  xenos::EdramMode edram_mode = regs.Get<reg::RB_MODECONTROL>().edram_mode;\n  if (edram_mode == xenos::EdramMode::kCopy) {\n    // Special copy handling.\n    return IssueCopy();\n  }\n\n  const ui::vulkan::VulkanDevice::Properties& device_properties =\n      GetVulkanDevice()->properties();\n\n  memexport_ranges_.clear();\n\n  // Vertex shader analysis.\n  auto vertex_shader = static_cast<VulkanShader*>(active_vertex_shader());\n  if (!vertex_shader) {\n    // Always need a vertex shader.\n    return false;\n  }\n  pipeline_cache_->AnalyzeShaderUcode(*vertex_shader);\n  // TODO(Triang3l): If the shader uses memory export, but\n  // vertexPipelineStoresAndAtomics is not supported, convert the vertex shader\n  // to a compute shader and dispatch it after the draw if the draw doesn't use\n  // tessellation.\n  if (vertex_shader->memexport_eM_written() != 0 &&\n      device_properties.vertexPipelineStoresAndAtomics) {\n    draw_util::AddMemExportRanges(regs, *vertex_shader, memexport_ranges_);\n  }\n\n  // Pixel shader analysis.\n  bool primitive_polygonal = draw_util::IsPrimitivePolygonal(regs);\n  bool is_rasterization_done =\n      draw_util::IsRasterizationPotentiallyDone(regs, primitive_polygonal);\n  VulkanShader* pixel_shader = nullptr;\n  if (is_rasterization_done) {\n    // See xenos::EdramMode for explanation why the pixel shader is only used\n    // when it's kColorDepth here.\n    if (edram_mode == xenos::EdramMode::kColorDepth) {\n      pixel_shader = static_cast<VulkanShader*>(active_pixel_shader());\n      if (pixel_shader) {\n        pipeline_cache_->AnalyzeShaderUcode(*pixel_shader);\n        if (!draw_util::IsPixelShaderNeededWithRasterization(*pixel_shader,\n                                                             regs)) {\n          pixel_shader = nullptr;\n        }\n      }\n    }\n  } else {\n    // Disabling pixel shader for this case is also required by the pipeline\n    // cache.\n    if (memexport_ranges_.empty()) {\n      // This draw has no effect.\n      return true;\n    }\n  }\n  if (pixel_shader && pixel_shader->memexport_eM_written() != 0 &&\n      device_properties.fragmentStoresAndAtomics) {\n    draw_util::AddMemExportRanges(regs, *pixel_shader, memexport_ranges_);\n  }\n\n  uint32_t ps_param_gen_pos = UINT32_MAX;\n  uint32_t interpolator_mask =\n      pixel_shader ? (vertex_shader->writes_interpolators() &\n                      pixel_shader->GetInterpolatorInputMask(\n                          regs.Get<reg::SQ_PROGRAM_CNTL>(),\n                          regs.Get<reg::SQ_CONTEXT_MISC>(), ps_param_gen_pos))\n                   : 0;\n\n  PrimitiveProcessor::ProcessingResult primitive_processing_result;\n  SpirvShaderTranslator::Modification vertex_shader_modification;\n  SpirvShaderTranslator::Modification pixel_shader_modification;\n  VulkanShader::VulkanTranslation* vertex_shader_translation;\n  VulkanShader::VulkanTranslation* pixel_shader_translation;\n\n  // Two iterations because a submission (even the current one - in which case\n  // it needs to be ended, and a new one must be started) may need to be awaited\n  // in case of a sampler count overflow, and if that happens, all subsystem\n  // updates done previously must be performed again because the updates done\n  // before the awaiting may be referencing objects destroyed by\n  // CompletedSubmissionUpdated.\n  for (uint32_t i = 0; i < 2; ++i) {\n    if (!BeginSubmission(true)) {\n      return false;\n    }\n\n    // Process primitives.\n    if (!primitive_processor_->Process(primitive_processing_result)) {\n      return false;\n    }\n    if (!primitive_processing_result.host_draw_vertex_count) {\n      // Nothing to draw.\n      return true;\n    }\n    // TODO(Triang3l): Tessellation, geometry-type-specific vertex shader,\n    // vertex shader as compute.\n    if (primitive_processing_result.host_vertex_shader_type !=\n            Shader::HostVertexShaderType::kVertex &&\n        primitive_processing_result.host_vertex_shader_type !=\n            Shader::HostVertexShaderType::kPointListAsTriangleStrip) {\n      return false;\n    }\n\n    // Shader modifications.\n    vertex_shader_modification =\n        pipeline_cache_->GetCurrentVertexShaderModification(\n            *vertex_shader, primitive_processing_result.host_vertex_shader_type,\n            interpolator_mask, ps_param_gen_pos != UINT32_MAX);\n    pixel_shader_modification =\n        pixel_shader ? pipeline_cache_->GetCurrentPixelShaderModification(\n                           *pixel_shader, interpolator_mask, ps_param_gen_pos)\n                     : SpirvShaderTranslator::Modification(0);\n\n    // Translate the shaders now to obtain the sampler bindings.\n    vertex_shader_translation = static_cast<VulkanShader::VulkanTranslation*>(\n        vertex_shader->GetOrCreateTranslation(\n            vertex_shader_modification.value));\n    pixel_shader_translation =\n        pixel_shader ? static_cast<VulkanShader::VulkanTranslation*>(\n                           pixel_shader->GetOrCreateTranslation(\n                               pixel_shader_modification.value))\n                     : nullptr;\n    if (!pipeline_cache_->EnsureShadersTranslated(vertex_shader_translation,\n                                                  pixel_shader_translation)) {\n      return false;\n    }\n\n    // Obtain the samplers. Note that the bindings don't depend on the shader\n    // modification, so if on the second iteration of this loop it becomes\n    // different for some reason (like a race condition with the guest in index\n    // buffer processing in the primitive processor resulting in different host\n    // vertex shader types), the bindings will stay the same.\n    // TODO(Triang3l): Sampler caching and reuse for adjacent draws within one\n    // submission.\n    uint32_t samplers_overflowed_count = 0;\n    for (uint32_t j = 0; j < 2; ++j) {\n      std::vector<std::pair<VulkanTextureCache::SamplerParameters, VkSampler>>&\n          shader_samplers =\n              j ? current_samplers_pixel_ : current_samplers_vertex_;\n      if (!i) {\n        shader_samplers.clear();\n      }\n      const VulkanShader* shader = j ? pixel_shader : vertex_shader;\n      if (!shader) {\n        continue;\n      }\n      const std::vector<VulkanShader::SamplerBinding>& shader_sampler_bindings =\n          shader->GetSamplerBindingsAfterTranslation();\n      if (!i) {\n        shader_samplers.reserve(shader_sampler_bindings.size());\n        for (const VulkanShader::SamplerBinding& shader_sampler_binding :\n             shader_sampler_bindings) {\n          shader_samplers.emplace_back(\n              texture_cache_->GetSamplerParameters(shader_sampler_binding),\n              VK_NULL_HANDLE);\n        }\n      }\n      for (std::pair<VulkanTextureCache::SamplerParameters, VkSampler>&\n               shader_sampler_pair : shader_samplers) {\n        // UseSampler calls are needed even on the second iteration in case the\n        // submission was broken (and thus the last usage submission indices for\n        // the used samplers need to be updated) due to an overflow within one\n        // submission. Though sampler overflow is a very rare situation overall.\n        bool sampler_overflowed;\n        VkSampler shader_sampler = texture_cache_->UseSampler(\n            shader_sampler_pair.first, sampler_overflowed);\n        shader_sampler_pair.second = shader_sampler;\n        if (shader_sampler == VK_NULL_HANDLE) {\n          if (!sampler_overflowed || i) {\n            // If !sampler_overflowed, just failed to create a sampler for some\n            // reason.\n            // If i == 1, an overflow has happened twice, can't recover from it\n            // anymore (would enter an infinite loop otherwise if the number of\n            // attempts was not limited to 2). Possibly too many unique samplers\n            // in one draw, or failed to await submission completion.\n            return false;\n          }\n          ++samplers_overflowed_count;\n        }\n      }\n    }\n    if (!samplers_overflowed_count) {\n      break;\n    }\n    assert_zero(i);\n    // Free space for as many samplers as how many haven't been allocated\n    // successfully - obtain the submission index that needs to be awaited to\n    // reuse `samplers_overflowed_count` slots. This must be done after all the\n    // UseSampler calls, not inside the loop calling UseSampler, because earlier\n    // UseSampler calls may \"mark for deletion\" some samplers that later\n    // UseSampler calls in the loop may actually demand.\n    uint64_t sampler_overflow_await_submission =\n        texture_cache_->GetSubmissionToAwaitOnSamplerOverflow(\n            samplers_overflowed_count);\n    assert_true(sampler_overflow_await_submission <= GetCurrentSubmission());\n    CheckSubmissionCompletionAndDeviceLoss(sampler_overflow_await_submission);\n  }\n\n  // Set up the render targets - this may perform dispatches and draws.\n  reg::RB_DEPTHCONTROL normalized_depth_control =\n      draw_util::GetNormalizedDepthControl(regs);\n  uint32_t normalized_color_mask =\n      pixel_shader ? draw_util::GetNormalizedColorMask(\n                         regs, pixel_shader->writes_color_targets())\n                   : 0;\n  if (!render_target_cache_->Update(is_rasterization_done,\n                                    normalized_depth_control,\n                                    normalized_color_mask, *vertex_shader)) {\n    return false;\n  }\n\n  // Create the pipeline (for this, need the render pass from the render target\n  // cache), translating the shaders - doing this now to obtain the used\n  // textures.\n  VkPipeline pipeline;\n  const VulkanPipelineCache::PipelineLayoutProvider* pipeline_layout_provider;\n  if (!pipeline_cache_->ConfigurePipeline(\n          vertex_shader_translation, pixel_shader_translation,\n          primitive_processing_result, normalized_depth_control,\n          normalized_color_mask,\n          render_target_cache_->last_update_render_pass_key(), pipeline,\n          pipeline_layout_provider)) {\n    return false;\n  }\n\n  // Update the textures before most other work in the submission because\n  // samplers depend on this (and in case of sampler overflow in a submission,\n  // submissions must be split) - may perform dispatches and copying.\n  uint32_t used_texture_mask =\n      vertex_shader->GetUsedTextureMaskAfterTranslation() |\n      (pixel_shader != nullptr\n           ? pixel_shader->GetUsedTextureMaskAfterTranslation()\n           : 0);\n  texture_cache_->RequestTextures(used_texture_mask);\n\n  // Update the graphics pipeline, and if the new graphics pipeline has a\n  // different layout, invalidate incompatible descriptor sets before updating\n  // current_guest_graphics_pipeline_layout_.\n  if (current_guest_graphics_pipeline_ != pipeline) {\n    deferred_command_buffer_.CmdVkBindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS,\n                                               pipeline);\n    current_guest_graphics_pipeline_ = pipeline;\n    current_external_graphics_pipeline_ = VK_NULL_HANDLE;\n  }\n  auto pipeline_layout =\n      static_cast<const PipelineLayout*>(pipeline_layout_provider);\n  if (current_guest_graphics_pipeline_layout_ != pipeline_layout) {\n    if (current_guest_graphics_pipeline_layout_) {\n      // Keep descriptor set layouts for which the new pipeline layout is\n      // compatible with the previous one (pipeline layouts are compatible for\n      // set N if set layouts 0 through N are compatible).\n      uint32_t descriptor_sets_kept =\n          uint32_t(SpirvShaderTranslator::kDescriptorSetCount);\n      if (current_guest_graphics_pipeline_layout_\n              ->descriptor_set_layout_textures_vertex_ref() !=\n          pipeline_layout->descriptor_set_layout_textures_vertex_ref()) {\n        descriptor_sets_kept = std::min(\n            descriptor_sets_kept,\n            uint32_t(SpirvShaderTranslator::kDescriptorSetTexturesVertex));\n      }\n      if (current_guest_graphics_pipeline_layout_\n              ->descriptor_set_layout_textures_pixel_ref() !=\n          pipeline_layout->descriptor_set_layout_textures_pixel_ref()) {\n        descriptor_sets_kept = std::min(\n            descriptor_sets_kept,\n            uint32_t(SpirvShaderTranslator::kDescriptorSetTexturesPixel));\n      }\n    } else {\n      // No or unknown pipeline layout previously bound - all bindings are in an\n      // indeterminate state.\n      current_graphics_descriptor_sets_bound_up_to_date_ = 0;\n    }\n    current_guest_graphics_pipeline_layout_ = pipeline_layout;\n  }\n\n  bool host_render_targets_used = render_target_cache_->GetPath() ==\n                                  RenderTargetCache::Path::kHostRenderTargets;\n\n  // Get dynamic rasterizer state.\n  draw_util::ViewportInfo viewport_info;\n  // Just handling maxViewportDimensions is enough - viewportBoundsRange[1] must\n  // be at least 2 * max(maxViewportDimensions[0...1]) - 1, and\n  // maxViewportDimensions must be greater than or equal to the size of the\n  // largest possible framebuffer attachment (if the viewport has positive\n  // offset and is between maxViewportDimensions and viewportBoundsRange[1],\n  // GetHostViewportInfo will adjust ndc_scale/ndc_offset to clamp it, and the\n  // clamped range will be outside the largest possible framebuffer anyway.\n  // FIXME(Triang3l): Possibly handle maxViewportDimensions and\n  // viewportBoundsRange separately because when using fragment shader\n  // interlocks, framebuffers are not used, while the range may be wider than\n  // dimensions? Though viewport bigger than 4096 - the smallest possible\n  // maximum dimension (which is below the 8192 texture size limit on the Xbox\n  // 360) - and with offset, is probably a situation that never happens in real\n  // life. Or even disregard the viewport bounds range in the fragment shader\n  // interlocks case completely - apply the viewport and the scissor offset\n  // directly to pixel address and to things like ps_param_gen.\n  draw_util::GetHostViewportInfo(\n      regs, 1, 1, false, device_properties.maxViewportDimensions[0],\n      device_properties.maxViewportDimensions[1], true,\n      normalized_depth_control, false, host_render_targets_used,\n      pixel_shader && pixel_shader->writes_depth(), viewport_info);\n\n  // Update dynamic graphics pipeline state.\n  UpdateDynamicState(viewport_info, primitive_polygonal,\n                     normalized_depth_control);\n\n  auto vgt_draw_initiator = regs.Get<reg::VGT_DRAW_INITIATOR>();\n\n  // Whether to load the guest 32-bit (usually big-endian) vertex index\n  // indirectly in the vertex shader if full 32-bit indices are not supported by\n  // the host.\n  bool shader_32bit_index_dma =\n      !device_properties.fullDrawIndexUint32 &&\n      primitive_processing_result.index_buffer_type ==\n          PrimitiveProcessor::ProcessedIndexBufferType::kGuestDMA &&\n      vgt_draw_initiator.index_size == xenos::IndexFormat::kInt32 &&\n      primitive_processing_result.host_vertex_shader_type ==\n          Shader::HostVertexShaderType::kVertex;\n\n  // Update system constants before uploading them.\n  UpdateSystemConstantValues(primitive_polygonal, primitive_processing_result,\n                             shader_32bit_index_dma, viewport_info,\n                             used_texture_mask, normalized_depth_control,\n                             normalized_color_mask);\n\n  // Update uniform buffers and descriptor sets after binding the pipeline with\n  // the new layout.\n  if (!UpdateBindings(vertex_shader, pixel_shader)) {\n    return false;\n  }\n\n  // Ensure vertex buffers are resident.\n  // TODO(Triang3l): Cache residency for ranges in a way similar to how texture\n  // validity is tracked.\n  uint64_t vertex_buffers_resident[2] = {};\n  for (const Shader::VertexBinding& vertex_binding :\n       vertex_shader->vertex_bindings()) {\n    uint32_t vfetch_index = vertex_binding.fetch_constant;\n    if (vertex_buffers_resident[vfetch_index >> 6] &\n        (uint64_t(1) << (vfetch_index & 63))) {\n      continue;\n    }\n    xenos::xe_gpu_vertex_fetch_t vfetch_constant =\n        regs.GetVertexFetch(vfetch_index);\n    switch (vfetch_constant.type) {\n      case xenos::FetchConstantType::kVertex:\n        break;\n      case xenos::FetchConstantType::kInvalidVertex:\n        if (cvars::gpu_allow_invalid_fetch_constants) {\n          break;\n        }\n        XELOGW(\n            \"Vertex fetch constant {} ({:08X} {:08X}) has \\\"invalid\\\" type! \"\n            \"This \"\n            \"is incorrect behavior, but you can try bypassing this by \"\n            \"launching Xenia with --gpu_allow_invalid_fetch_constants=true.\",\n            vfetch_index, vfetch_constant.dword_0, vfetch_constant.dword_1);\n        return false;\n      default:\n        XELOGW(\n            \"Vertex fetch constant {} ({:08X} {:08X}) is completely invalid!\",\n            vfetch_index, vfetch_constant.dword_0, vfetch_constant.dword_1);\n        return false;\n    }\n    if (!shared_memory_->RequestRange(vfetch_constant.address << 2,\n                                      vfetch_constant.size << 2)) {\n      XELOGE(\n          \"Failed to request vertex buffer at 0x{:08X} (size {}) in the shared \"\n          \"memory\",\n          vfetch_constant.address << 2, vfetch_constant.size << 2);\n      return false;\n    }\n    vertex_buffers_resident[vfetch_index >> 6] |= uint64_t(1)\n                                                  << (vfetch_index & 63);\n  }\n\n  // Synchronize the memory pages backing memory scatter export streams, and\n  // calculate the range that includes the streams for the buffer barrier.\n  uint32_t memexport_extent_start = UINT32_MAX, memexport_extent_end = 0;\n  for (const draw_util::MemExportRange& memexport_range : memexport_ranges_) {\n    uint32_t memexport_range_base_bytes = memexport_range.base_address_dwords\n                                          << 2;\n    if (!shared_memory_->RequestRange(memexport_range_base_bytes,\n                                      memexport_range.size_bytes)) {\n      XELOGE(\n          \"Failed to request memexport stream at 0x{:08X} (size {}) in the \"\n          \"shared memory\",\n          memexport_range_base_bytes, memexport_range.size_bytes);\n      return false;\n    }\n    memexport_extent_start =\n        std::min(memexport_extent_start, memexport_range_base_bytes);\n    memexport_extent_end =\n        std::max(memexport_extent_end,\n                 memexport_range_base_bytes + memexport_range.size_bytes);\n  }\n\n  // Insert the shared memory barrier if needed.\n  // TODO(Triang3l): Find some PM4 command that can be used for indication of\n  // when memexports should be awaited instead of inserting the barrier in Use\n  // every time if memory export was done in the previous draw?\n  if (memexport_extent_start < memexport_extent_end) {\n    shared_memory_->Use(\n        VulkanSharedMemory::Usage::kGuestDrawReadWrite,\n        std::make_pair(memexport_extent_start,\n                       memexport_extent_end - memexport_extent_start));\n  } else {\n    shared_memory_->Use(VulkanSharedMemory::Usage::kRead);\n  }\n\n  // After all commands that may dispatch, copy or insert barriers, submit the\n  // barriers (may end the render pass), and (re)enter the render pass before\n  // drawing.\n  SubmitBarriersAndEnterRenderTargetCacheRenderPass(\n      render_target_cache_->last_update_render_pass(),\n      render_target_cache_->last_update_framebuffer());\n\n  // Draw.\n  if (primitive_processing_result.index_buffer_type ==\n          PrimitiveProcessor::ProcessedIndexBufferType::kNone ||\n      shader_32bit_index_dma) {\n    deferred_command_buffer_.CmdVkDraw(\n        primitive_processing_result.host_draw_vertex_count, 1, 0, 0);\n  } else {\n    std::pair<VkBuffer, VkDeviceSize> index_buffer;\n    switch (primitive_processing_result.index_buffer_type) {\n      case PrimitiveProcessor::ProcessedIndexBufferType::kGuestDMA:\n        index_buffer.first = shared_memory_->buffer();\n        index_buffer.second = primitive_processing_result.guest_index_base;\n        break;\n      case PrimitiveProcessor::ProcessedIndexBufferType::kHostConverted:\n        index_buffer = primitive_processor_->GetConvertedIndexBuffer(\n            primitive_processing_result.host_index_buffer_handle);\n        break;\n      case PrimitiveProcessor::ProcessedIndexBufferType::kHostBuiltinForAuto:\n      case PrimitiveProcessor::ProcessedIndexBufferType::kHostBuiltinForDMA:\n        index_buffer = primitive_processor_->GetBuiltinIndexBuffer(\n            primitive_processing_result.host_index_buffer_handle);\n        break;\n      default:\n        assert_unhandled_case(primitive_processing_result.index_buffer_type);\n        return false;\n    }\n    deferred_command_buffer_.CmdVkBindIndexBuffer(\n        index_buffer.first, index_buffer.second,\n        primitive_processing_result.host_index_format ==\n                xenos::IndexFormat::kInt16\n            ? VK_INDEX_TYPE_UINT16\n            : VK_INDEX_TYPE_UINT32);\n    deferred_command_buffer_.CmdVkDrawIndexed(\n        primitive_processing_result.host_draw_vertex_count, 1, 0, 0, 0);\n  }\n\n  // Invalidate textures in memexported memory and watch for changes.\n  for (const draw_util::MemExportRange& memexport_range : memexport_ranges_) {\n    shared_memory_->RangeWrittenByGpu(memexport_range.base_address_dwords << 2,\n                                      memexport_range.size_bytes);\n  }\n\n  return true;\n}\n\nbool VulkanCommandProcessor::IssueCopy() {\n#if XE_GPU_FINE_GRAINED_DRAW_SCOPES\n  SCOPE_profile_cpu_f(\"gpu\");\n#endif  // XE_GPU_FINE_GRAINED_DRAW_SCOPES\n\n  if (!BeginSubmission(true)) {\n    return false;\n  }\n\n  uint32_t written_address, written_length;\n  if (!render_target_cache_->Resolve(*memory_, *shared_memory_, *texture_cache_,\n                                     written_address, written_length)) {\n    return false;\n  }\n\n  // TODO(Triang3l): CPU readback.\n\n  return true;\n}\n\nvoid VulkanCommandProcessor::InitializeTrace() {\n  CommandProcessor::InitializeTrace();\n\n  if (!BeginSubmission(true)) {\n    return;\n  }\n  // TODO(Triang3l): Write the EDRAM.\n  bool shared_memory_submitted =\n      shared_memory_->InitializeTraceSubmitDownloads();\n  if (!shared_memory_submitted) {\n    return;\n  }\n  AwaitAllQueueOperationsCompletion();\n  if (shared_memory_submitted) {\n    shared_memory_->InitializeTraceCompleteDownloads();\n  }\n}\n\nvoid VulkanCommandProcessor::CheckSubmissionCompletionAndDeviceLoss(\n    uint64_t await_submission) {\n  // Only report once, no need to retry a wait that won't succeed anyway.\n  if (device_lost_) {\n    return;\n  }\n\n  if (await_submission >= GetCurrentSubmission()) {\n    if (submission_open_) {\n      EndSubmission(false);\n    }\n    // A submission won't be ended if it hasn't been started, or if ending\n    // has failed - clamp the index.\n    await_submission = GetCurrentSubmission() - 1;\n  }\n\n  completion_timeline_.AwaitSubmissionAndUpdateCompleted(await_submission);\n\n  const ui::vulkan::VulkanDevice* const vulkan_device = GetVulkanDevice();\n\n  if (vulkan_device->IsLost()) {\n    device_lost_ = true;\n    graphics_system_->OnHostGpuLossFromAnyThread(true);\n    return;\n  }\n\n  const uint64_t completed_submission = GetCompletedSubmission();\n\n  // Reclaim semaphores.\n  while (!submissions_in_flight_semaphores_.empty()) {\n    const auto& semaphore_submission =\n        submissions_in_flight_semaphores_.front();\n    if (semaphore_submission.first > completed_submission) {\n      break;\n    }\n    semaphores_free_.push_back(semaphore_submission.second);\n    submissions_in_flight_semaphores_.pop_front();\n  }\n\n  // Reclaim command pools.\n  while (!command_buffers_submitted_.empty()) {\n    const auto& command_buffer_pair = command_buffers_submitted_.front();\n    if (command_buffer_pair.first > completed_submission) {\n      break;\n    }\n    command_buffers_writable_.push_back(command_buffer_pair.second);\n    command_buffers_submitted_.pop_front();\n  }\n\n  shared_memory_->CompletedSubmissionUpdated();\n\n  primitive_processor_->CompletedSubmissionUpdated();\n\n  render_target_cache_->CompletedSubmissionUpdated();\n\n  texture_cache_->CompletedSubmissionUpdated(completed_submission);\n\n  // Destroy objects scheduled for destruction.\n  const ui::vulkan::VulkanDevice::Functions& dfn = vulkan_device->functions();\n  const VkDevice device = vulkan_device->device();\n  while (!destroy_framebuffers_.empty()) {\n    const auto& destroy_pair = destroy_framebuffers_.front();\n    if (destroy_pair.first > completed_submission) {\n      break;\n    }\n    dfn.vkDestroyFramebuffer(device, destroy_pair.second, nullptr);\n    destroy_framebuffers_.pop_front();\n  }\n  while (!destroy_buffers_.empty()) {\n    const auto& destroy_pair = destroy_buffers_.front();\n    if (destroy_pair.first > completed_submission) {\n      break;\n    }\n    dfn.vkDestroyBuffer(device, destroy_pair.second, nullptr);\n    destroy_buffers_.pop_front();\n  }\n  while (!destroy_memory_.empty()) {\n    const auto& destroy_pair = destroy_memory_.front();\n    if (destroy_pair.first > completed_submission) {\n      break;\n    }\n    dfn.vkFreeMemory(device, destroy_pair.second, nullptr);\n    destroy_memory_.pop_front();\n  }\n}\n\nbool VulkanCommandProcessor::BeginSubmission(bool is_guest_command) {\n#if XE_GPU_FINE_GRAINED_DRAW_SCOPES\n  SCOPE_profile_cpu_f(\"gpu\");\n#endif  // XE_GPU_FINE_GRAINED_DRAW_SCOPES\n\n  if (device_lost_) {\n    return false;\n  }\n\n  bool is_opening_frame = is_guest_command && !frame_open_;\n  if (submission_open_ && !is_opening_frame) {\n    return true;\n  }\n\n  // Check the fence - needed for all kinds of submissions (to reclaim transient\n  // resources early) and specifically for frames (not to queue too many), and\n  // await the availability of the current frame. Also check whether the device\n  // is still available, and whether the await was successful.\n  uint64_t await_submission =\n      is_opening_frame\n          ? closed_frame_submissions_[frame_current_ % kMaxFramesInFlight]\n          : 0;\n  CheckSubmissionCompletionAndDeviceLoss(await_submission);\n  const uint64_t completed_submission = GetCompletedSubmission();\n  if (device_lost_ || completed_submission < await_submission) {\n    return false;\n  }\n\n  if (is_opening_frame) {\n    // Update the completed frame index, also obtaining the actual completed\n    // frame number (since the CPU may be actually less than 3 frames behind)\n    // before reclaiming resources tracked with the frame number.\n    frame_completed_ = std::max(frame_current_, uint64_t(kMaxFramesInFlight)) -\n                       kMaxFramesInFlight;\n    for (uint64_t frame = frame_completed_ + 1; frame < frame_current_;\n         ++frame) {\n      if (closed_frame_submissions_[frame % kMaxFramesInFlight] >\n          completed_submission) {\n        break;\n      }\n      frame_completed_ = frame;\n    }\n  }\n\n  if (!submission_open_) {\n    submission_open_ = true;\n\n    // Start a new deferred command buffer - will submit it to the real one in\n    // the end of the submission (when async pipeline object creation requests\n    // are fulfilled).\n    deferred_command_buffer_.Reset();\n\n    // Reset cached state of the command buffer.\n    dynamic_viewport_update_needed_ = true;\n    dynamic_scissor_update_needed_ = true;\n    dynamic_depth_bias_update_needed_ = true;\n    dynamic_blend_constants_update_needed_ = true;\n    dynamic_stencil_compare_mask_front_update_needed_ = true;\n    dynamic_stencil_compare_mask_back_update_needed_ = true;\n    dynamic_stencil_write_mask_front_update_needed_ = true;\n    dynamic_stencil_write_mask_back_update_needed_ = true;\n    dynamic_stencil_reference_front_update_needed_ = true;\n    dynamic_stencil_reference_back_update_needed_ = true;\n    current_render_pass_ = VK_NULL_HANDLE;\n    current_framebuffer_ = nullptr;\n    current_guest_graphics_pipeline_ = VK_NULL_HANDLE;\n    current_external_graphics_pipeline_ = VK_NULL_HANDLE;\n    current_external_compute_pipeline_ = VK_NULL_HANDLE;\n    current_guest_graphics_pipeline_layout_ = nullptr;\n    current_graphics_descriptor_sets_bound_up_to_date_ = 0;\n\n    primitive_processor_->BeginSubmission();\n\n    texture_cache_->BeginSubmission(GetCurrentSubmission());\n  }\n\n  if (is_opening_frame) {\n    frame_open_ = true;\n\n    // Reset bindings that depend on transient data.\n    std::memset(current_float_constant_map_vertex_, 0,\n                sizeof(current_float_constant_map_vertex_));\n    std::memset(current_float_constant_map_pixel_, 0,\n                sizeof(current_float_constant_map_pixel_));\n    std::memset(current_graphics_descriptor_sets_, 0,\n                sizeof(current_graphics_descriptor_sets_));\n    current_constant_buffers_up_to_date_ = 0;\n    current_graphics_descriptor_sets_\n        [SpirvShaderTranslator::kDescriptorSetSharedMemoryAndEdram] =\n            shared_memory_and_edram_descriptor_set_;\n    current_graphics_descriptor_set_values_up_to_date_ =\n        UINT32_C(1)\n        << SpirvShaderTranslator::kDescriptorSetSharedMemoryAndEdram;\n\n    // Reclaim pool pages - no need to do this every small submission since some\n    // may be reused.\n    // FIXME(Triang3l): This will result in a memory leak if the guest is not\n    // presenting.\n    uniform_buffer_pool_->Reclaim(frame_completed_);\n    while (!single_transient_descriptors_used_.empty()) {\n      const UsedSingleTransientDescriptor& used_transient_descriptor =\n          single_transient_descriptors_used_.front();\n      if (used_transient_descriptor.frame > frame_completed_) {\n        break;\n      }\n      single_transient_descriptors_free_[size_t(\n                                             used_transient_descriptor.layout)]\n          .push_back(used_transient_descriptor.set);\n      single_transient_descriptors_used_.pop_front();\n    }\n    while (!constants_transient_descriptors_used_.empty()) {\n      const std::pair<uint64_t, VkDescriptorSet>& used_transient_descriptor =\n          constants_transient_descriptors_used_.front();\n      if (used_transient_descriptor.first > frame_completed_) {\n        break;\n      }\n      constants_transient_descriptors_free_.push_back(\n          used_transient_descriptor.second);\n      constants_transient_descriptors_used_.pop_front();\n    }\n    while (!texture_transient_descriptor_sets_used_.empty()) {\n      const UsedTextureTransientDescriptorSet& used_transient_descriptor_set =\n          texture_transient_descriptor_sets_used_.front();\n      if (used_transient_descriptor_set.frame > frame_completed_) {\n        break;\n      }\n      auto it = texture_transient_descriptor_sets_free_.find(\n          used_transient_descriptor_set.layout);\n      if (it == texture_transient_descriptor_sets_free_.end()) {\n        it =\n            texture_transient_descriptor_sets_free_\n                .emplace(\n                    std::piecewise_construct,\n                    std::forward_as_tuple(used_transient_descriptor_set.layout),\n                    std::forward_as_tuple())\n                .first;\n      }\n      it->second.push_back(used_transient_descriptor_set.set);\n      texture_transient_descriptor_sets_used_.pop_front();\n    }\n\n    primitive_processor_->BeginFrame();\n\n    texture_cache_->BeginFrame();\n  }\n\n  return true;\n}\n\nbool VulkanCommandProcessor::EndSubmission(bool is_swap) {\n  ui::vulkan::VulkanDevice* const vulkan_device = GetVulkanDevice();\n  const ui::vulkan::VulkanDevice::Functions& dfn = vulkan_device->functions();\n  const VkDevice device = vulkan_device->device();\n\n  // Make sure everything needed for submitting exist.\n  if (submission_open_) {\n    if (!sparse_memory_binds_.empty() && semaphores_free_.empty()) {\n      VkSemaphoreCreateInfo semaphore_create_info;\n      semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;\n      semaphore_create_info.pNext = nullptr;\n      semaphore_create_info.flags = 0;\n      VkSemaphore semaphore;\n      if (dfn.vkCreateSemaphore(device, &semaphore_create_info, nullptr,\n                                &semaphore) != VK_SUCCESS) {\n        XELOGE(\"Failed to create a Vulkan semaphore\");\n        return false;\n      }\n      semaphores_free_.push_back(semaphore);\n    }\n    if (command_buffers_writable_.empty()) {\n      CommandBuffer command_buffer;\n      VkCommandPoolCreateInfo command_pool_create_info;\n      command_pool_create_info.sType =\n          VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;\n      command_pool_create_info.pNext = nullptr;\n      command_pool_create_info.flags = VK_COMMAND_POOL_CREATE_TRANSIENT_BIT;\n      command_pool_create_info.queueFamilyIndex =\n          vulkan_device->queue_family_graphics_compute();\n      if (dfn.vkCreateCommandPool(device, &command_pool_create_info, nullptr,\n                                  &command_buffer.pool) != VK_SUCCESS) {\n        XELOGE(\"Failed to create a Vulkan command pool\");\n        return false;\n      }\n      VkCommandBufferAllocateInfo command_buffer_allocate_info;\n      command_buffer_allocate_info.sType =\n          VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;\n      command_buffer_allocate_info.pNext = nullptr;\n      command_buffer_allocate_info.commandPool = command_buffer.pool;\n      command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;\n      command_buffer_allocate_info.commandBufferCount = 1;\n      if (dfn.vkAllocateCommandBuffers(device, &command_buffer_allocate_info,\n                                       &command_buffer.buffer) != VK_SUCCESS) {\n        XELOGE(\"Failed to allocate a Vulkan command buffer\");\n        dfn.vkDestroyCommandPool(device, command_buffer.pool, nullptr);\n        return false;\n      }\n      command_buffers_writable_.push_back(command_buffer);\n    }\n  }\n\n  bool is_closing_frame = is_swap && frame_open_;\n\n  if (is_closing_frame) {\n    primitive_processor_->EndFrame();\n  }\n\n  if (submission_open_) {\n    assert_false(scratch_buffer_used_);\n\n    EndRenderPass();\n\n    render_target_cache_->EndSubmission();\n\n    primitive_processor_->EndSubmission();\n\n    shared_memory_->EndSubmission();\n\n    uniform_buffer_pool_->FlushWrites();\n\n    // Submit sparse binds earlier, before executing the deferred command\n    // buffer, to reduce latency.\n    if (!sparse_memory_binds_.empty()) {\n      sparse_buffer_bind_infos_temp_.clear();\n      sparse_buffer_bind_infos_temp_.reserve(sparse_buffer_binds_.size());\n      for (const SparseBufferBind& sparse_buffer_bind : sparse_buffer_binds_) {\n        VkSparseBufferMemoryBindInfo& sparse_buffer_bind_info =\n            sparse_buffer_bind_infos_temp_.emplace_back();\n        sparse_buffer_bind_info.buffer = sparse_buffer_bind.buffer;\n        sparse_buffer_bind_info.bindCount = sparse_buffer_bind.bind_count;\n        sparse_buffer_bind_info.pBinds =\n            sparse_memory_binds_.data() + sparse_buffer_bind.bind_offset;\n      }\n      assert_false(semaphores_free_.empty());\n      VkSemaphore bind_sparse_semaphore = semaphores_free_.back();\n      VkBindSparseInfo bind_sparse_info;\n      bind_sparse_info.sType = VK_STRUCTURE_TYPE_BIND_SPARSE_INFO;\n      bind_sparse_info.pNext = nullptr;\n      bind_sparse_info.waitSemaphoreCount = 0;\n      bind_sparse_info.pWaitSemaphores = nullptr;\n      bind_sparse_info.bufferBindCount =\n          uint32_t(sparse_buffer_bind_infos_temp_.size());\n      bind_sparse_info.pBufferBinds =\n          !sparse_buffer_bind_infos_temp_.empty()\n              ? sparse_buffer_bind_infos_temp_.data()\n              : nullptr;\n      bind_sparse_info.imageOpaqueBindCount = 0;\n      bind_sparse_info.pImageOpaqueBinds = nullptr;\n      bind_sparse_info.imageBindCount = 0;\n      bind_sparse_info.pImageBinds = 0;\n      bind_sparse_info.signalSemaphoreCount = 1;\n      bind_sparse_info.pSignalSemaphores = &bind_sparse_semaphore;\n      VkResult bind_sparse_result;\n      {\n        ui::vulkan::VulkanDevice::Queue::Acquisition queue_acquisition =\n            vulkan_device->AcquireQueue(\n                vulkan_device->queue_family_sparse_binding(), 0);\n        bind_sparse_result = dfn.vkQueueBindSparse(\n            queue_acquisition.queue(), 1, &bind_sparse_info, VK_NULL_HANDLE);\n      }\n      if (bind_sparse_result != VK_SUCCESS) {\n        XELOGE(\"Failed to submit Vulkan sparse binds\");\n        return false;\n      }\n      current_submission_wait_semaphores_.push_back(bind_sparse_semaphore);\n      semaphores_free_.pop_back();\n      current_submission_wait_stage_masks_.push_back(\n          sparse_bind_wait_stage_mask_);\n      sparse_bind_wait_stage_mask_ = 0;\n      sparse_buffer_binds_.clear();\n      sparse_memory_binds_.clear();\n    }\n\n    SubmitBarriers(true);\n\n    assert_false(command_buffers_writable_.empty());\n    CommandBuffer command_buffer = command_buffers_writable_.back();\n    if (dfn.vkResetCommandPool(device, command_buffer.pool, 0) != VK_SUCCESS) {\n      XELOGE(\"Failed to reset a Vulkan command pool\");\n      return false;\n    }\n    VkCommandBufferBeginInfo command_buffer_begin_info;\n    command_buffer_begin_info.sType =\n        VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;\n    command_buffer_begin_info.pNext = nullptr;\n    command_buffer_begin_info.flags =\n        VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;\n    command_buffer_begin_info.pInheritanceInfo = nullptr;\n    if (dfn.vkBeginCommandBuffer(command_buffer.buffer,\n                                 &command_buffer_begin_info) != VK_SUCCESS) {\n      XELOGE(\"Failed to begin a Vulkan command buffer\");\n      return false;\n    }\n    deferred_command_buffer_.Execute(command_buffer.buffer);\n    if (dfn.vkEndCommandBuffer(command_buffer.buffer) != VK_SUCCESS) {\n      XELOGE(\"Failed to end a Vulkan command buffer\");\n      return false;\n    }\n\n    const uint64_t submission_index = GetCurrentSubmission();\n\n    VkSubmitInfo submit_info = {VK_STRUCTURE_TYPE_SUBMIT_INFO};\n    if (!current_submission_wait_semaphores_.empty()) {\n      submit_info.waitSemaphoreCount =\n          uint32_t(current_submission_wait_semaphores_.size());\n      submit_info.pWaitSemaphores = current_submission_wait_semaphores_.data();\n      submit_info.pWaitDstStageMask =\n          current_submission_wait_stage_masks_.data();\n    }\n    submit_info.commandBufferCount = 1;\n    submit_info.pCommandBuffers = &command_buffer.buffer;\n    const VkResult submit_result = completion_timeline_.AcquireFenceAndSubmit(\n        vulkan_device->queue_family_graphics_compute(), 0, 1, &submit_info);\n    if (submit_result != VK_SUCCESS) {\n      XELOGE(\"Failed to submit a GPU emulation Vulkan command buffer: {}\",\n             vk::to_string(vk::Result(submit_result)));\n      if (vulkan_device->IsLost() && !device_lost_) {\n        device_lost_ = true;\n        graphics_system_->OnHostGpuLossFromAnyThread(true);\n      }\n      return false;\n    }\n    current_submission_wait_stage_masks_.clear();\n    for (VkSemaphore semaphore : current_submission_wait_semaphores_) {\n      submissions_in_flight_semaphores_.emplace_back(submission_index,\n                                                     semaphore);\n    }\n    current_submission_wait_semaphores_.clear();\n    command_buffers_submitted_.emplace_back(submission_index, command_buffer);\n    command_buffers_writable_.pop_back();\n\n    submission_open_ = false;\n  }\n\n  if (is_closing_frame) {\n    frame_open_ = false;\n    // Submission already closed now, so minus 1.\n    closed_frame_submissions_[(frame_current_++) % kMaxFramesInFlight] =\n        GetCurrentSubmission() - 1;\n\n    if (cache_clear_requested_ && AwaitAllQueueOperationsCompletion()) {\n      cache_clear_requested_ = false;\n\n      DestroyScratchBuffer();\n\n      for (SwapFramebuffer& swap_framebuffer : swap_framebuffers_) {\n        ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyFramebuffer, device,\n                                               swap_framebuffer.framebuffer);\n      }\n\n      assert_true(command_buffers_submitted_.empty());\n      for (const CommandBuffer& command_buffer : command_buffers_writable_) {\n        dfn.vkDestroyCommandPool(device, command_buffer.pool, nullptr);\n      }\n      command_buffers_writable_.clear();\n\n      ClearTransientDescriptorPools();\n\n      uniform_buffer_pool_->ClearCache();\n\n      texture_cache_->ClearCache();\n\n      render_target_cache_->ClearCache();\n\n      // Not clearing the pipeline layouts and the descriptor set layouts as\n      // they're referenced by pipelines, which are not destroyed.\n\n      primitive_processor_->ClearCache();\n\n      shared_memory_->ClearCache();\n    }\n  }\n\n  return true;\n}\n\nvoid VulkanCommandProcessor::ClearTransientDescriptorPools() {\n  texture_transient_descriptor_sets_free_.clear();\n  texture_transient_descriptor_sets_used_.clear();\n  transient_descriptor_allocator_textures_.Reset();\n\n  constants_transient_descriptors_free_.clear();\n  constants_transient_descriptors_used_.clear();\n  for (std::vector<VkDescriptorSet>& transient_descriptors_free :\n       single_transient_descriptors_free_) {\n    transient_descriptors_free.clear();\n  }\n  single_transient_descriptors_used_.clear();\n  transient_descriptor_allocator_storage_buffer_.Reset();\n  transient_descriptor_allocator_uniform_buffer_.Reset();\n}\n\nvoid VulkanCommandProcessor::SplitPendingBarrier() {\n  size_t pending_buffer_memory_barrier_count =\n      pending_barriers_buffer_memory_barriers_.size();\n  size_t pending_image_memory_barrier_count =\n      pending_barriers_image_memory_barriers_.size();\n  if (!current_pending_barrier_.src_stage_mask &&\n      !current_pending_barrier_.dst_stage_mask &&\n      current_pending_barrier_.buffer_memory_barriers_offset >=\n          pending_buffer_memory_barrier_count &&\n      current_pending_barrier_.image_memory_barriers_offset >=\n          pending_image_memory_barrier_count) {\n    return;\n  }\n  pending_barriers_.emplace_back(current_pending_barrier_);\n  current_pending_barrier_.src_stage_mask = 0;\n  current_pending_barrier_.dst_stage_mask = 0;\n  current_pending_barrier_.buffer_memory_barriers_offset =\n      pending_buffer_memory_barrier_count;\n  current_pending_barrier_.image_memory_barriers_offset =\n      pending_image_memory_barrier_count;\n}\n\nvoid VulkanCommandProcessor::DestroyScratchBuffer() {\n  assert_false(scratch_buffer_used_);\n\n  const ui::vulkan::VulkanDevice* const vulkan_device = GetVulkanDevice();\n  const ui::vulkan::VulkanDevice::Functions& dfn = vulkan_device->functions();\n  const VkDevice device = vulkan_device->device();\n\n  scratch_buffer_last_usage_submission_ = 0;\n  scratch_buffer_last_access_mask_ = 0;\n  scratch_buffer_last_stage_mask_ = 0;\n  scratch_buffer_size_ = 0;\n  ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyBuffer, device,\n                                         scratch_buffer_);\n  ui::vulkan::util::DestroyAndNullHandle(dfn.vkFreeMemory, device,\n                                         scratch_buffer_memory_);\n}\n\nvoid VulkanCommandProcessor::UpdateDynamicState(\n    const draw_util::ViewportInfo& viewport_info, bool primitive_polygonal,\n    reg::RB_DEPTHCONTROL normalized_depth_control) {\n#if XE_GPU_FINE_GRAINED_DRAW_SCOPES\n  SCOPE_profile_cpu_f(\"gpu\");\n#endif  // XE_GPU_FINE_GRAINED_DRAW_SCOPES\n\n  const RegisterFile& regs = *register_file_;\n\n  // Window parameters.\n  // http://ftp.tku.edu.tw/NetBSD/NetBSD-current/xsrc/external/mit/xf86-video-ati/dist/src/r600_reg_auto_r6xx.h\n  // See r200UpdateWindow:\n  // https://github.com/freedreno/mesa/blob/master/src/mesa/drivers/dri/r200/r200_state.c\n  auto pa_sc_window_offset = regs.Get<reg::PA_SC_WINDOW_OFFSET>();\n\n  // Viewport.\n  VkViewport viewport;\n  if (viewport_info.xy_extent[0] && viewport_info.xy_extent[1]) {\n    viewport.x = float(viewport_info.xy_offset[0]);\n    viewport.y = float(viewport_info.xy_offset[1]);\n    viewport.width = float(viewport_info.xy_extent[0]);\n    viewport.height = float(viewport_info.xy_extent[1]);\n  } else {\n    // Vulkan viewport width must be greater than 0.0f, but the Xenia  viewport\n    // may be empty for various reasons - set the viewport to outside the\n    // framebuffer.\n    viewport.x = -1.0f;\n    viewport.y = -1.0f;\n    viewport.width = 1.0f;\n    viewport.height = 1.0f;\n  }\n  viewport.minDepth = viewport_info.z_min;\n  viewport.maxDepth = viewport_info.z_max;\n  SetViewport(viewport);\n\n  // Scissor.\n  draw_util::Scissor scissor;\n  draw_util::GetScissor(regs, scissor);\n  VkRect2D scissor_rect;\n  scissor_rect.offset.x = int32_t(scissor.offset[0]);\n  scissor_rect.offset.y = int32_t(scissor.offset[1]);\n  scissor_rect.extent.width = scissor.extent[0];\n  scissor_rect.extent.height = scissor.extent[1];\n  SetScissor(scissor_rect);\n\n  if (render_target_cache_->GetPath() ==\n      RenderTargetCache::Path::kHostRenderTargets) {\n    // Depth bias.\n    float depth_bias_constant_factor, depth_bias_slope_factor;\n    draw_util::GetPreferredFacePolygonOffset(regs, primitive_polygonal,\n                                             depth_bias_slope_factor,\n                                             depth_bias_constant_factor);\n    depth_bias_constant_factor *=\n        regs.Get<reg::RB_DEPTH_INFO>().depth_format ==\n                xenos::DepthRenderTargetFormat::kD24S8\n            ? draw_util::kD3D10PolygonOffsetFactorUnorm24\n            : draw_util::kD3D10PolygonOffsetFactorFloat24;\n    // With non-square resolution scaling, make sure the worst-case impact is\n    // reverted (slope only along the scaled axis), thus max. More bias is\n    // better than less bias, because less bias means Z fighting with the\n    // background is more likely.\n    depth_bias_slope_factor *=\n        xenos::kPolygonOffsetScaleSubpixelUnit *\n        float(std::max(render_target_cache_->draw_resolution_scale_x(),\n                       render_target_cache_->draw_resolution_scale_y()));\n    // std::memcmp instead of != so in case of NaN, every draw won't be\n    // invalidating it.\n    dynamic_depth_bias_update_needed_ |=\n        std::memcmp(&dynamic_depth_bias_constant_factor_,\n                    &depth_bias_constant_factor, sizeof(float)) != 0;\n    dynamic_depth_bias_update_needed_ |=\n        std::memcmp(&dynamic_depth_bias_slope_factor_, &depth_bias_slope_factor,\n                    sizeof(float)) != 0;\n    if (dynamic_depth_bias_update_needed_) {\n      dynamic_depth_bias_constant_factor_ = depth_bias_constant_factor;\n      dynamic_depth_bias_slope_factor_ = depth_bias_slope_factor;\n      deferred_command_buffer_.CmdVkSetDepthBias(\n          dynamic_depth_bias_constant_factor_, 0.0f,\n          dynamic_depth_bias_slope_factor_);\n      dynamic_depth_bias_update_needed_ = false;\n    }\n\n    // Blend constants.\n    float blend_constants[] = {\n        regs.Get<float>(XE_GPU_REG_RB_BLEND_RED),\n        regs.Get<float>(XE_GPU_REG_RB_BLEND_GREEN),\n        regs.Get<float>(XE_GPU_REG_RB_BLEND_BLUE),\n        regs.Get<float>(XE_GPU_REG_RB_BLEND_ALPHA),\n    };\n    dynamic_blend_constants_update_needed_ |=\n        std::memcmp(dynamic_blend_constants_, blend_constants,\n                    sizeof(float) * 4) != 0;\n    if (dynamic_blend_constants_update_needed_) {\n      std::memcpy(dynamic_blend_constants_, blend_constants, sizeof(float) * 4);\n      deferred_command_buffer_.CmdVkSetBlendConstants(dynamic_blend_constants_);\n      dynamic_blend_constants_update_needed_ = false;\n    }\n\n    // Stencil masks and references.\n    // Due to pretty complex conditions involving registers not directly related\n    // to stencil (primitive type, culling), changing the values only when\n    // stencil is actually needed. However, due to the way dynamic state needs\n    // to be set in Vulkan, which doesn't take into account whether the state\n    // actually has effect on drawing, and because the masks and the references\n    // are always dynamic in Xenia guest pipelines, they must be set in the\n    // command buffer before any draw.\n    if (normalized_depth_control.stencil_enable) {\n      Register stencil_ref_mask_front_reg, stencil_ref_mask_back_reg;\n      if (primitive_polygonal && normalized_depth_control.backface_enable) {\n        if (GetVulkanDevice()->properties().separateStencilMaskRef) {\n          stencil_ref_mask_front_reg = XE_GPU_REG_RB_STENCILREFMASK;\n          stencil_ref_mask_back_reg = XE_GPU_REG_RB_STENCILREFMASK_BF;\n        } else {\n          // Choose the back face values only if drawing only back faces.\n          stencil_ref_mask_front_reg =\n              regs.Get<reg::PA_SU_SC_MODE_CNTL>().cull_front\n                  ? XE_GPU_REG_RB_STENCILREFMASK_BF\n                  : XE_GPU_REG_RB_STENCILREFMASK;\n          stencil_ref_mask_back_reg = stencil_ref_mask_front_reg;\n        }\n      } else {\n        stencil_ref_mask_front_reg = XE_GPU_REG_RB_STENCILREFMASK;\n        stencil_ref_mask_back_reg = XE_GPU_REG_RB_STENCILREFMASK;\n      }\n      auto stencil_ref_mask_front =\n          regs.Get<reg::RB_STENCILREFMASK>(stencil_ref_mask_front_reg);\n      auto stencil_ref_mask_back =\n          regs.Get<reg::RB_STENCILREFMASK>(stencil_ref_mask_back_reg);\n      // Compare mask.\n      dynamic_stencil_compare_mask_front_update_needed_ |=\n          dynamic_stencil_compare_mask_front_ !=\n          stencil_ref_mask_front.stencilmask;\n      dynamic_stencil_compare_mask_front_ = stencil_ref_mask_front.stencilmask;\n      dynamic_stencil_compare_mask_back_update_needed_ |=\n          dynamic_stencil_compare_mask_back_ !=\n          stencil_ref_mask_back.stencilmask;\n      dynamic_stencil_compare_mask_back_ = stencil_ref_mask_back.stencilmask;\n      // Write mask.\n      dynamic_stencil_write_mask_front_update_needed_ |=\n          dynamic_stencil_write_mask_front_ !=\n          stencil_ref_mask_front.stencilwritemask;\n      dynamic_stencil_write_mask_front_ =\n          stencil_ref_mask_front.stencilwritemask;\n      dynamic_stencil_write_mask_back_update_needed_ |=\n          dynamic_stencil_write_mask_back_ !=\n          stencil_ref_mask_back.stencilwritemask;\n      dynamic_stencil_write_mask_back_ = stencil_ref_mask_back.stencilwritemask;\n      // Reference.\n      dynamic_stencil_reference_front_update_needed_ |=\n          dynamic_stencil_reference_front_ != stencil_ref_mask_front.stencilref;\n      dynamic_stencil_reference_front_ = stencil_ref_mask_front.stencilref;\n      dynamic_stencil_reference_back_update_needed_ |=\n          dynamic_stencil_reference_back_ != stencil_ref_mask_back.stencilref;\n      dynamic_stencil_reference_back_ = stencil_ref_mask_back.stencilref;\n    }\n    // Using VK_STENCIL_FACE_FRONT_AND_BACK for higher safety when running on\n    // the Vulkan portability subset without separateStencilMaskRef.\n    if (dynamic_stencil_compare_mask_front_update_needed_ ||\n        dynamic_stencil_compare_mask_back_update_needed_) {\n      if (dynamic_stencil_compare_mask_front_ ==\n          dynamic_stencil_compare_mask_back_) {\n        deferred_command_buffer_.CmdVkSetStencilCompareMask(\n            VK_STENCIL_FACE_FRONT_AND_BACK,\n            dynamic_stencil_compare_mask_front_);\n      } else {\n        if (dynamic_stencil_compare_mask_front_update_needed_) {\n          deferred_command_buffer_.CmdVkSetStencilCompareMask(\n              VK_STENCIL_FACE_FRONT_BIT, dynamic_stencil_compare_mask_front_);\n        }\n        if (dynamic_stencil_compare_mask_back_update_needed_) {\n          deferred_command_buffer_.CmdVkSetStencilCompareMask(\n              VK_STENCIL_FACE_BACK_BIT, dynamic_stencil_compare_mask_back_);\n        }\n      }\n      dynamic_stencil_compare_mask_front_update_needed_ = false;\n      dynamic_stencil_compare_mask_back_update_needed_ = false;\n    }\n    if (dynamic_stencil_write_mask_front_update_needed_ ||\n        dynamic_stencil_write_mask_back_update_needed_) {\n      if (dynamic_stencil_write_mask_front_ ==\n          dynamic_stencil_write_mask_back_) {\n        deferred_command_buffer_.CmdVkSetStencilWriteMask(\n            VK_STENCIL_FACE_FRONT_AND_BACK, dynamic_stencil_write_mask_front_);\n      } else {\n        if (dynamic_stencil_write_mask_front_update_needed_) {\n          deferred_command_buffer_.CmdVkSetStencilWriteMask(\n              VK_STENCIL_FACE_FRONT_BIT, dynamic_stencil_write_mask_front_);\n        }\n        if (dynamic_stencil_write_mask_back_update_needed_) {\n          deferred_command_buffer_.CmdVkSetStencilWriteMask(\n              VK_STENCIL_FACE_BACK_BIT, dynamic_stencil_write_mask_back_);\n        }\n      }\n      dynamic_stencil_write_mask_front_update_needed_ = false;\n      dynamic_stencil_write_mask_back_update_needed_ = false;\n    }\n    if (dynamic_stencil_reference_front_update_needed_ ||\n        dynamic_stencil_reference_back_update_needed_) {\n      if (dynamic_stencil_reference_front_ == dynamic_stencil_reference_back_) {\n        deferred_command_buffer_.CmdVkSetStencilReference(\n            VK_STENCIL_FACE_FRONT_AND_BACK, dynamic_stencil_reference_front_);\n      } else {\n        if (dynamic_stencil_reference_front_update_needed_) {\n          deferred_command_buffer_.CmdVkSetStencilReference(\n              VK_STENCIL_FACE_FRONT_BIT, dynamic_stencil_reference_front_);\n        }\n        if (dynamic_stencil_reference_back_update_needed_) {\n          deferred_command_buffer_.CmdVkSetStencilReference(\n              VK_STENCIL_FACE_BACK_BIT, dynamic_stencil_reference_back_);\n        }\n      }\n      dynamic_stencil_reference_front_update_needed_ = false;\n      dynamic_stencil_reference_back_update_needed_ = false;\n    }\n  }\n\n  // TODO(Triang3l): VK_EXT_extended_dynamic_state and\n  // VK_EXT_extended_dynamic_state2.\n}\n\nvoid VulkanCommandProcessor::UpdateSystemConstantValues(\n    bool primitive_polygonal,\n    const PrimitiveProcessor::ProcessingResult& primitive_processing_result,\n    bool shader_32bit_index_dma, const draw_util::ViewportInfo& viewport_info,\n    uint32_t used_texture_mask, reg::RB_DEPTHCONTROL normalized_depth_control,\n    uint32_t normalized_color_mask) {\n#if XE_GPU_FINE_GRAINED_DRAW_SCOPES\n  SCOPE_profile_cpu_f(\"gpu\");\n#endif  // XE_GPU_FINE_GRAINED_DRAW_SCOPES\n\n  const RegisterFile& regs = *register_file_;\n  auto pa_cl_vte_cntl = regs.Get<reg::PA_CL_VTE_CNTL>();\n  auto pa_su_sc_mode_cntl = regs.Get<reg::PA_SU_SC_MODE_CNTL>();\n  auto rb_alpha_ref = regs.Get<float>(XE_GPU_REG_RB_ALPHA_REF);\n  auto rb_colorcontrol = regs.Get<reg::RB_COLORCONTROL>();\n  auto rb_depth_info = regs.Get<reg::RB_DEPTH_INFO>();\n  auto rb_stencilrefmask = regs.Get<reg::RB_STENCILREFMASK>();\n  auto rb_stencilrefmask_bf =\n      regs.Get<reg::RB_STENCILREFMASK>(XE_GPU_REG_RB_STENCILREFMASK_BF);\n  auto rb_surface_info = regs.Get<reg::RB_SURFACE_INFO>();\n  auto vgt_draw_initiator = regs.Get<reg::VGT_DRAW_INITIATOR>();\n  auto vgt_indx_offset = regs.Get<int32_t>(XE_GPU_REG_VGT_INDX_OFFSET);\n\n  bool edram_fragment_shader_interlock =\n      render_target_cache_->GetPath() ==\n      RenderTargetCache::Path::kPixelShaderInterlock;\n  uint32_t draw_resolution_scale_x = texture_cache_->draw_resolution_scale_x();\n  uint32_t draw_resolution_scale_y = texture_cache_->draw_resolution_scale_y();\n\n  // Get the color info register values for each render target. Also, for FSI,\n  // exclude components that don't exist in the format from the write mask.\n  // Don't exclude fully overlapping render targets, however - two render\n  // targets with the same base address are used in the lighting pass of\n  // 4D5307E6, for example, with the needed one picked with dynamic control\n  // flow.\n  reg::RB_COLOR_INFO color_infos[xenos::kMaxColorRenderTargets];\n  float rt_clamp[4][4];\n  // Two UINT32_MAX if no components actually existing in the RT are written.\n  uint32_t rt_keep_masks[4][2];\n  for (uint32_t i = 0; i < xenos::kMaxColorRenderTargets; ++i) {\n    auto color_info = regs.Get<reg::RB_COLOR_INFO>(\n        reg::RB_COLOR_INFO::rt_register_indices[i]);\n    color_infos[i] = color_info;\n    if (edram_fragment_shader_interlock) {\n      RenderTargetCache::GetPSIColorFormatInfo(\n          color_info.color_format, (normalized_color_mask >> (i * 4)) & 0b1111,\n          rt_clamp[i][0], rt_clamp[i][1], rt_clamp[i][2], rt_clamp[i][3],\n          rt_keep_masks[i][0], rt_keep_masks[i][1]);\n    }\n  }\n\n  // Disable depth and stencil if it aliases a color render target (for\n  // instance, during the XBLA logo in 58410954, though depth writing is already\n  // disabled there).\n  bool depth_stencil_enabled = normalized_depth_control.stencil_enable ||\n                               normalized_depth_control.z_enable;\n  if (edram_fragment_shader_interlock && depth_stencil_enabled) {\n    for (uint32_t i = 0; i < 4; ++i) {\n      if (rb_depth_info.depth_base == color_infos[i].color_base &&\n          (rt_keep_masks[i][0] != UINT32_MAX ||\n           rt_keep_masks[i][1] != UINT32_MAX)) {\n        depth_stencil_enabled = false;\n        break;\n      }\n    }\n  }\n\n  bool dirty = false;\n\n  // Flags.\n  uint32_t flags = 0;\n  // Vertex index shader loading.\n  if (shader_32bit_index_dma) {\n    flags |= SpirvShaderTranslator::kSysFlag_VertexIndexLoad;\n  }\n  if (primitive_processing_result.index_buffer_type ==\n      PrimitiveProcessor::ProcessedIndexBufferType::kHostBuiltinForDMA) {\n    flags |= SpirvShaderTranslator::kSysFlag_ComputeOrPrimitiveVertexIndexLoad;\n    if (vgt_draw_initiator.index_size == xenos::IndexFormat::kInt32) {\n      flags |= SpirvShaderTranslator ::\n          kSysFlag_ComputeOrPrimitiveVertexIndexLoad32Bit;\n    }\n  }\n  // W0 division control.\n  // http://www.x.org/docs/AMD/old/evergreen_3D_registers_v2.pdf\n  // 8: VTX_XY_FMT = true: the incoming XY have already been multiplied by 1/W0.\n  //               = false: multiply the X, Y coordinates by 1/W0.\n  // 9: VTX_Z_FMT = true: the incoming Z has already been multiplied by 1/W0.\n  //              = false: multiply the Z coordinate by 1/W0.\n  // 10: VTX_W0_FMT = true: the incoming W0 is not 1/W0. Perform the reciprocal\n  //                        to get 1/W0.\n  if (pa_cl_vte_cntl.vtx_xy_fmt) {\n    flags |= SpirvShaderTranslator::kSysFlag_XYDividedByW;\n  }\n  if (pa_cl_vte_cntl.vtx_z_fmt) {\n    flags |= SpirvShaderTranslator::kSysFlag_ZDividedByW;\n  }\n  if (pa_cl_vte_cntl.vtx_w0_fmt) {\n    flags |= SpirvShaderTranslator::kSysFlag_WNotReciprocal;\n  }\n  // Whether the primitive is polygonal, and gl_FrontFacing matters.\n  if (primitive_polygonal) {\n    flags |= SpirvShaderTranslator::kSysFlag_PrimitivePolygonal;\n  }\n  // Primitive type.\n  if (draw_util::IsPrimitiveLine(regs)) {\n    flags |= SpirvShaderTranslator::kSysFlag_PrimitiveLine;\n  }\n  // MSAA sample count.\n  flags |= uint32_t(rb_surface_info.msaa_samples)\n           << SpirvShaderTranslator::kSysFlag_MsaaSamples_Shift;\n  // Depth format.\n  if (rb_depth_info.depth_format == xenos::DepthRenderTargetFormat::kD24FS8) {\n    flags |= SpirvShaderTranslator::kSysFlag_DepthFloat24;\n  }\n  // Alpha test.\n  xenos::CompareFunction alpha_test_function =\n      rb_colorcontrol.alpha_test_enable ? rb_colorcontrol.alpha_func\n                                        : xenos::CompareFunction::kAlways;\n  flags |= uint32_t(alpha_test_function)\n           << SpirvShaderTranslator::kSysFlag_AlphaPassIfLess_Shift;\n  // Gamma writing.\n  // TODO(Triang3l): Gamma as unorm8 check.\n  if (!edram_fragment_shader_interlock) {\n    for (uint32_t i = 0; i < xenos::kMaxColorRenderTargets; ++i) {\n      if (color_infos[i].color_format ==\n          xenos::ColorRenderTargetFormat::k_8_8_8_8_GAMMA) {\n        flags |= SpirvShaderTranslator::kSysFlag_ConvertColor0ToGamma << i;\n      }\n    }\n  }\n  if (edram_fragment_shader_interlock && depth_stencil_enabled) {\n    flags |= SpirvShaderTranslator::kSysFlag_FSIDepthStencil;\n    if (normalized_depth_control.z_enable) {\n      flags |= uint32_t(normalized_depth_control.zfunc)\n               << SpirvShaderTranslator::kSysFlag_FSIDepthPassIfLess_Shift;\n      if (normalized_depth_control.z_write_enable) {\n        flags |= SpirvShaderTranslator::kSysFlag_FSIDepthWrite;\n      }\n    } else {\n      // In case stencil is used without depth testing - always pass, and\n      // don't modify the stored depth.\n      flags |= SpirvShaderTranslator::kSysFlag_FSIDepthPassIfLess |\n               SpirvShaderTranslator::kSysFlag_FSIDepthPassIfEqual |\n               SpirvShaderTranslator::kSysFlag_FSIDepthPassIfGreater;\n    }\n    if (normalized_depth_control.stencil_enable) {\n      flags |= SpirvShaderTranslator::kSysFlag_FSIStencilTest;\n    }\n    // Hint - if not applicable to the shader, will not have effect.\n    if (alpha_test_function == xenos::CompareFunction::kAlways &&\n        !rb_colorcontrol.alpha_to_mask_enable) {\n      flags |= SpirvShaderTranslator::kSysFlag_FSIDepthStencilEarlyWrite;\n    }\n  }\n  dirty |= system_constants_.flags != flags;\n  system_constants_.flags = flags;\n\n  // Index buffer address for loading in the shaders.\n  if (flags &\n      (SpirvShaderTranslator::kSysFlag_VertexIndexLoad |\n       SpirvShaderTranslator::kSysFlag_ComputeOrPrimitiveVertexIndexLoad)) {\n    dirty |= system_constants_.vertex_index_load_address !=\n             primitive_processing_result.guest_index_base;\n    system_constants_.vertex_index_load_address =\n        primitive_processing_result.guest_index_base;\n  }\n\n  // Index or tessellation edge factor buffer endianness.\n  dirty |= system_constants_.vertex_index_endian !=\n           primitive_processing_result.host_shader_index_endian;\n  system_constants_.vertex_index_endian =\n      primitive_processing_result.host_shader_index_endian;\n\n  // Vertex index offset.\n  dirty |= system_constants_.vertex_base_index != vgt_indx_offset;\n  system_constants_.vertex_base_index = vgt_indx_offset;\n\n  // Conversion to host normalized device coordinates.\n  for (uint32_t i = 0; i < 3; ++i) {\n    dirty |= system_constants_.ndc_scale[i] != viewport_info.ndc_scale[i];\n    dirty |= system_constants_.ndc_offset[i] != viewport_info.ndc_offset[i];\n    system_constants_.ndc_scale[i] = viewport_info.ndc_scale[i];\n    system_constants_.ndc_offset[i] = viewport_info.ndc_offset[i];\n  }\n\n  // Point size.\n  if (vgt_draw_initiator.prim_type == xenos::PrimitiveType::kPointList) {\n    auto pa_su_point_minmax = regs.Get<reg::PA_SU_POINT_MINMAX>();\n    auto pa_su_point_size = regs.Get<reg::PA_SU_POINT_SIZE>();\n    float point_vertex_diameter_min =\n        float(pa_su_point_minmax.min_size) * (2.0f / 16.0f);\n    float point_vertex_diameter_max =\n        float(pa_su_point_minmax.max_size) * (2.0f / 16.0f);\n    float point_constant_diameter_x =\n        float(pa_su_point_size.width) * (2.0f / 16.0f);\n    float point_constant_diameter_y =\n        float(pa_su_point_size.height) * (2.0f / 16.0f);\n    dirty |= system_constants_.point_vertex_diameter_min !=\n             point_vertex_diameter_min;\n    dirty |= system_constants_.point_vertex_diameter_max !=\n             point_vertex_diameter_max;\n    dirty |= system_constants_.point_constant_diameter[0] !=\n             point_constant_diameter_x;\n    dirty |= system_constants_.point_constant_diameter[1] !=\n             point_constant_diameter_y;\n    system_constants_.point_vertex_diameter_min = point_vertex_diameter_min;\n    system_constants_.point_vertex_diameter_max = point_vertex_diameter_max;\n    system_constants_.point_constant_diameter[0] = point_constant_diameter_x;\n    system_constants_.point_constant_diameter[1] = point_constant_diameter_y;\n    // 2 because 1 in the NDC is half of the viewport's axis, 0.5 for diameter\n    // to radius conversion to avoid multiplying the per-vertex diameter by an\n    // additional constant in the shader.\n    float point_screen_diameter_to_ndc_radius_x =\n        (/* 0.5f * 2.0f * */ float(draw_resolution_scale_x)) /\n        std::max(viewport_info.xy_extent[0], uint32_t(1));\n    float point_screen_diameter_to_ndc_radius_y =\n        (/* 0.5f * 2.0f * */ float(draw_resolution_scale_y)) /\n        std::max(viewport_info.xy_extent[1], uint32_t(1));\n    dirty |= system_constants_.point_screen_diameter_to_ndc_radius[0] !=\n             point_screen_diameter_to_ndc_radius_x;\n    dirty |= system_constants_.point_screen_diameter_to_ndc_radius[1] !=\n             point_screen_diameter_to_ndc_radius_y;\n    system_constants_.point_screen_diameter_to_ndc_radius[0] =\n        point_screen_diameter_to_ndc_radius_x;\n    system_constants_.point_screen_diameter_to_ndc_radius[1] =\n        point_screen_diameter_to_ndc_radius_y;\n  }\n\n  // Texture signedness / gamma.\n  {\n    uint32_t textures_remaining = used_texture_mask;\n    uint32_t texture_index;\n    while (xe::bit_scan_forward(textures_remaining, &texture_index)) {\n      textures_remaining &= ~(UINT32_C(1) << texture_index);\n      uint32_t& texture_signs_uint =\n          system_constants_.texture_swizzled_signs[texture_index >> 2];\n      uint32_t texture_signs_shift = 8 * (texture_index & 3);\n      uint8_t texture_signs =\n          texture_cache_->GetActiveTextureSwizzledSigns(texture_index);\n      uint32_t texture_signs_shifted = uint32_t(texture_signs)\n                                       << texture_signs_shift;\n      uint32_t texture_signs_mask = ((UINT32_C(1) << 8) - 1)\n                                    << texture_signs_shift;\n      dirty |=\n          (texture_signs_uint & texture_signs_mask) != texture_signs_shifted;\n      texture_signs_uint =\n          (texture_signs_uint & ~texture_signs_mask) | texture_signs_shifted;\n    }\n  }\n\n  // Texture host swizzle in the shader.\n  if (!GetVulkanDevice()->properties().imageViewFormatSwizzle) {\n    uint32_t textures_remaining = used_texture_mask;\n    uint32_t texture_index;\n    while (xe::bit_scan_forward(textures_remaining, &texture_index)) {\n      textures_remaining &= ~(UINT32_C(1) << texture_index);\n      uint32_t& texture_swizzles_uint =\n          system_constants_.texture_swizzles[texture_index >> 1];\n      uint32_t texture_swizzle_shift = 12 * (texture_index & 1);\n      uint32_t texture_swizzle =\n          texture_cache_->GetActiveTextureHostSwizzle(texture_index);\n      uint32_t texture_swizzle_shifted = uint32_t(texture_swizzle)\n                                         << texture_swizzle_shift;\n      uint32_t texture_swizzle_mask = ((UINT32_C(1) << 12) - 1)\n                                      << texture_swizzle_shift;\n      dirty |= (texture_swizzles_uint & texture_swizzle_mask) !=\n               texture_swizzle_shifted;\n      texture_swizzles_uint = (texture_swizzles_uint & ~texture_swizzle_mask) |\n                              texture_swizzle_shifted;\n    }\n  }\n\n  // Alpha test.\n  dirty |= system_constants_.alpha_test_reference != rb_alpha_ref;\n  system_constants_.alpha_test_reference = rb_alpha_ref;\n\n  uint32_t edram_tile_dwords_scaled =\n      xenos::kEdramTileWidthSamples * xenos::kEdramTileHeightSamples *\n      (draw_resolution_scale_x * draw_resolution_scale_y);\n\n  // EDRAM pitch for FSI render target writing.\n  if (edram_fragment_shader_interlock) {\n    // Align, then multiply by 32bpp tile size in dwords.\n    uint32_t edram_32bpp_tile_pitch_dwords_scaled =\n        ((rb_surface_info.surface_pitch *\n          (rb_surface_info.msaa_samples >= xenos::MsaaSamples::k4X ? 2 : 1)) +\n         (xenos::kEdramTileWidthSamples - 1)) /\n        xenos::kEdramTileWidthSamples * edram_tile_dwords_scaled;\n    dirty |= system_constants_.edram_32bpp_tile_pitch_dwords_scaled !=\n             edram_32bpp_tile_pitch_dwords_scaled;\n    system_constants_.edram_32bpp_tile_pitch_dwords_scaled =\n        edram_32bpp_tile_pitch_dwords_scaled;\n  }\n\n  // Color exponent bias and FSI render target writing.\n  for (uint32_t i = 0; i < xenos::kMaxColorRenderTargets; ++i) {\n    reg::RB_COLOR_INFO color_info = color_infos[i];\n    // Exponent bias is in bits 20:25 of RB_COLOR_INFO.\n    int32_t color_exp_bias = color_info.color_exp_bias;\n    if (render_target_cache_->GetPath() ==\n            RenderTargetCache::Path::kHostRenderTargets &&\n        (color_info.color_format == xenos::ColorRenderTargetFormat::k_16_16 &&\n             !render_target_cache_->IsFixedRG16TruncatedToMinus1To1() ||\n         color_info.color_format ==\n                 xenos::ColorRenderTargetFormat::k_16_16_16_16 &&\n             !render_target_cache_->IsFixedRGBA16TruncatedToMinus1To1())) {\n      // Remap from -32...32 to -1...1 by dividing the output values by 32,\n      // losing blending correctness, but getting the full range.\n      color_exp_bias -= 5;\n    }\n    float color_exp_bias_scale;\n    *reinterpret_cast<int32_t*>(&color_exp_bias_scale) =\n        UINT32_C(0x3F800000) + (color_exp_bias << 23);\n    dirty |= system_constants_.color_exp_bias[i] != color_exp_bias_scale;\n    system_constants_.color_exp_bias[i] = color_exp_bias_scale;\n    if (edram_fragment_shader_interlock) {\n      dirty |=\n          system_constants_.edram_rt_keep_mask[i][0] != rt_keep_masks[i][0];\n      system_constants_.edram_rt_keep_mask[i][0] = rt_keep_masks[i][0];\n      dirty |=\n          system_constants_.edram_rt_keep_mask[i][1] != rt_keep_masks[i][1];\n      system_constants_.edram_rt_keep_mask[i][1] = rt_keep_masks[i][1];\n      if (rt_keep_masks[i][0] != UINT32_MAX ||\n          rt_keep_masks[i][1] != UINT32_MAX) {\n        uint32_t rt_base_dwords_scaled =\n            color_info.color_base * edram_tile_dwords_scaled;\n        dirty |= system_constants_.edram_rt_base_dwords_scaled[i] !=\n                 rt_base_dwords_scaled;\n        system_constants_.edram_rt_base_dwords_scaled[i] =\n            rt_base_dwords_scaled;\n        uint32_t format_flags =\n            RenderTargetCache::AddPSIColorFormatFlags(color_info.color_format);\n        dirty |= system_constants_.edram_rt_format_flags[i] != format_flags;\n        system_constants_.edram_rt_format_flags[i] = format_flags;\n        uint32_t blend_factors_ops =\n            regs[reg::RB_BLENDCONTROL::rt_register_indices[i]] & 0x1FFF1FFF;\n        dirty |= system_constants_.edram_rt_blend_factors_ops[i] !=\n                 blend_factors_ops;\n        system_constants_.edram_rt_blend_factors_ops[i] = blend_factors_ops;\n        // Can't do float comparisons here because NaNs would result in always\n        // setting the dirty flag.\n        dirty |= std::memcmp(system_constants_.edram_rt_clamp[i], rt_clamp[i],\n                             4 * sizeof(float)) != 0;\n        std::memcpy(system_constants_.edram_rt_clamp[i], rt_clamp[i],\n                    4 * sizeof(float));\n      }\n    }\n  }\n\n  if (edram_fragment_shader_interlock) {\n    uint32_t depth_base_dwords_scaled =\n        rb_depth_info.depth_base * edram_tile_dwords_scaled;\n    dirty |= system_constants_.edram_depth_base_dwords_scaled !=\n             depth_base_dwords_scaled;\n    system_constants_.edram_depth_base_dwords_scaled = depth_base_dwords_scaled;\n\n    // For non-polygons, front polygon offset is used, and it's enabled if\n    // POLY_OFFSET_PARA_ENABLED is set, for polygons, separate front and back\n    // are used.\n    float poly_offset_front_scale = 0.0f, poly_offset_front_offset = 0.0f;\n    float poly_offset_back_scale = 0.0f, poly_offset_back_offset = 0.0f;\n    if (primitive_polygonal) {\n      if (pa_su_sc_mode_cntl.poly_offset_front_enable) {\n        poly_offset_front_scale =\n            regs.Get<float>(XE_GPU_REG_PA_SU_POLY_OFFSET_FRONT_SCALE);\n        poly_offset_front_offset =\n            regs.Get<float>(XE_GPU_REG_PA_SU_POLY_OFFSET_FRONT_OFFSET);\n      }\n      if (pa_su_sc_mode_cntl.poly_offset_back_enable) {\n        poly_offset_back_scale =\n            regs.Get<float>(XE_GPU_REG_PA_SU_POLY_OFFSET_BACK_SCALE);\n        poly_offset_back_offset =\n            regs.Get<float>(XE_GPU_REG_PA_SU_POLY_OFFSET_BACK_OFFSET);\n      }\n    } else {\n      if (pa_su_sc_mode_cntl.poly_offset_para_enable) {\n        poly_offset_front_scale =\n            regs.Get<float>(XE_GPU_REG_PA_SU_POLY_OFFSET_FRONT_SCALE);\n        poly_offset_front_offset =\n            regs.Get<float>(XE_GPU_REG_PA_SU_POLY_OFFSET_FRONT_OFFSET);\n        poly_offset_back_scale = poly_offset_front_scale;\n        poly_offset_back_offset = poly_offset_front_offset;\n      }\n    }\n    // With non-square resolution scaling, make sure the worst-case impact is\n    // reverted (slope only along the scaled axis), thus max. More bias is\n    // better than less bias, because less bias means Z fighting with the\n    // background is more likely.\n    float poly_offset_scale_factor =\n        xenos::kPolygonOffsetScaleSubpixelUnit *\n        std::max(draw_resolution_scale_x, draw_resolution_scale_y);\n    poly_offset_front_scale *= poly_offset_scale_factor;\n    poly_offset_back_scale *= poly_offset_scale_factor;\n    dirty |= system_constants_.edram_poly_offset_front_scale !=\n             poly_offset_front_scale;\n    system_constants_.edram_poly_offset_front_scale = poly_offset_front_scale;\n    dirty |= system_constants_.edram_poly_offset_front_offset !=\n             poly_offset_front_offset;\n    system_constants_.edram_poly_offset_front_offset = poly_offset_front_offset;\n    dirty |= system_constants_.edram_poly_offset_back_scale !=\n             poly_offset_back_scale;\n    system_constants_.edram_poly_offset_back_scale = poly_offset_back_scale;\n    dirty |= system_constants_.edram_poly_offset_back_offset !=\n             poly_offset_back_offset;\n    system_constants_.edram_poly_offset_back_offset = poly_offset_back_offset;\n\n    if (depth_stencil_enabled && normalized_depth_control.stencil_enable) {\n      uint32_t stencil_front_reference_masks =\n          rb_stencilrefmask.value & 0xFFFFFF;\n      dirty |= system_constants_.edram_stencil_front_reference_masks !=\n               stencil_front_reference_masks;\n      system_constants_.edram_stencil_front_reference_masks =\n          stencil_front_reference_masks;\n      uint32_t stencil_func_ops =\n          (normalized_depth_control.value >> 8) & ((1 << 12) - 1);\n      dirty |=\n          system_constants_.edram_stencil_front_func_ops != stencil_func_ops;\n      system_constants_.edram_stencil_front_func_ops = stencil_func_ops;\n\n      if (primitive_polygonal && normalized_depth_control.backface_enable) {\n        uint32_t stencil_back_reference_masks =\n            rb_stencilrefmask_bf.value & 0xFFFFFF;\n        dirty |= system_constants_.edram_stencil_back_reference_masks !=\n                 stencil_back_reference_masks;\n        system_constants_.edram_stencil_back_reference_masks =\n            stencil_back_reference_masks;\n        uint32_t stencil_func_ops_bf =\n            (normalized_depth_control.value >> 20) & ((1 << 12) - 1);\n        dirty |= system_constants_.edram_stencil_back_func_ops !=\n                 stencil_func_ops_bf;\n        system_constants_.edram_stencil_back_func_ops = stencil_func_ops_bf;\n      } else {\n        dirty |= std::memcmp(system_constants_.edram_stencil_back,\n                             system_constants_.edram_stencil_front,\n                             2 * sizeof(uint32_t)) != 0;\n        std::memcpy(system_constants_.edram_stencil_back,\n                    system_constants_.edram_stencil_front,\n                    2 * sizeof(uint32_t));\n      }\n    }\n\n    dirty |= system_constants_.edram_blend_constant[0] !=\n             regs.Get<float>(XE_GPU_REG_RB_BLEND_RED);\n    system_constants_.edram_blend_constant[0] =\n        regs.Get<float>(XE_GPU_REG_RB_BLEND_RED);\n    dirty |= system_constants_.edram_blend_constant[1] !=\n             regs.Get<float>(XE_GPU_REG_RB_BLEND_GREEN);\n    system_constants_.edram_blend_constant[1] =\n        regs.Get<float>(XE_GPU_REG_RB_BLEND_GREEN);\n    dirty |= system_constants_.edram_blend_constant[2] !=\n             regs.Get<float>(XE_GPU_REG_RB_BLEND_BLUE);\n    system_constants_.edram_blend_constant[2] =\n        regs.Get<float>(XE_GPU_REG_RB_BLEND_BLUE);\n    dirty |= system_constants_.edram_blend_constant[3] !=\n             regs.Get<float>(XE_GPU_REG_RB_BLEND_ALPHA);\n    system_constants_.edram_blend_constant[3] =\n        regs.Get<float>(XE_GPU_REG_RB_BLEND_ALPHA);\n  }\n\n  if (dirty) {\n    current_constant_buffers_up_to_date_ &=\n        ~(UINT32_C(1) << SpirvShaderTranslator::kConstantBufferSystem);\n  }\n}\n\nbool VulkanCommandProcessor::UpdateBindings(const VulkanShader* vertex_shader,\n                                            const VulkanShader* pixel_shader) {\n#if XE_GPU_FINE_GRAINED_DRAW_SCOPES\n  SCOPE_profile_cpu_f(\"gpu\");\n#endif  // XE_GPU_FINE_GRAINED_DRAW_SCOPES\n\n  const RegisterFile& regs = *register_file_;\n\n  const ui::vulkan::VulkanDevice* const vulkan_device = GetVulkanDevice();\n  const ui::vulkan::VulkanDevice::Functions& dfn = vulkan_device->functions();\n  const VkDevice device = vulkan_device->device();\n\n  // Invalidate constant buffers and descriptors for changed data.\n\n  // Float constants.\n  // These are the constant base addresses/ranges for shaders.\n  // We have these hardcoded right now cause nothing seems to differ on the Xbox\n  // 360 (however, OpenGL ES on Adreno 200 on Android has different ranges).\n  assert_true(regs[XE_GPU_REG_SQ_VS_CONST] == 0x000FF000 ||\n              regs[XE_GPU_REG_SQ_VS_CONST] == 0x00000000);\n  assert_true(regs[XE_GPU_REG_SQ_PS_CONST] == 0x000FF100 ||\n              regs[XE_GPU_REG_SQ_PS_CONST] == 0x00000000);\n  // Check if the float constant layout is still the same and get the counts.\n  const Shader::ConstantRegisterMap& float_constant_map_vertex =\n      vertex_shader->constant_register_map();\n  uint32_t float_constant_count_vertex = float_constant_map_vertex.float_count;\n  for (uint32_t i = 0; i < 4; ++i) {\n    if (current_float_constant_map_vertex_[i] !=\n        float_constant_map_vertex.float_bitmap[i]) {\n      current_float_constant_map_vertex_[i] =\n          float_constant_map_vertex.float_bitmap[i];\n      // If no float constants at all, any buffer can be reused for them, so not\n      // invalidating.\n      if (float_constant_count_vertex) {\n        current_constant_buffers_up_to_date_ &=\n            ~(UINT32_C(1) << SpirvShaderTranslator::kConstantBufferFloatVertex);\n      }\n    }\n  }\n  uint32_t float_constant_count_pixel = 0;\n  if (pixel_shader != nullptr) {\n    const Shader::ConstantRegisterMap& float_constant_map_pixel =\n        pixel_shader->constant_register_map();\n    float_constant_count_pixel = float_constant_map_pixel.float_count;\n    for (uint32_t i = 0; i < 4; ++i) {\n      if (current_float_constant_map_pixel_[i] !=\n          float_constant_map_pixel.float_bitmap[i]) {\n        current_float_constant_map_pixel_[i] =\n            float_constant_map_pixel.float_bitmap[i];\n        if (float_constant_count_pixel) {\n          current_constant_buffers_up_to_date_ &= ~(\n              UINT32_C(1) << SpirvShaderTranslator::kConstantBufferFloatPixel);\n        }\n      }\n    }\n  } else {\n    std::memset(current_float_constant_map_pixel_, 0,\n                sizeof(current_float_constant_map_pixel_));\n  }\n\n  // Write the new constant buffers.\n  constexpr uint32_t kAllConstantBuffersMask =\n      (UINT32_C(1) << SpirvShaderTranslator::kConstantBufferCount) - 1;\n  assert_zero(current_constant_buffers_up_to_date_ & ~kAllConstantBuffersMask);\n  if ((current_constant_buffers_up_to_date_ & kAllConstantBuffersMask) !=\n      kAllConstantBuffersMask) {\n    current_graphics_descriptor_set_values_up_to_date_ &=\n        ~(UINT32_C(1) << SpirvShaderTranslator::kDescriptorSetConstants);\n    size_t uniform_buffer_alignment =\n        size_t(vulkan_device->properties().minUniformBufferOffsetAlignment);\n    // System constants.\n    if (!(current_constant_buffers_up_to_date_ &\n          (UINT32_C(1) << SpirvShaderTranslator::kConstantBufferSystem))) {\n      VkDescriptorBufferInfo& buffer_info = current_constant_buffer_infos_\n          [SpirvShaderTranslator::kConstantBufferSystem];\n      uint8_t* mapping = uniform_buffer_pool_->Request(\n          frame_current_, sizeof(SpirvShaderTranslator::SystemConstants),\n          uniform_buffer_alignment, buffer_info.buffer, buffer_info.offset);\n      if (!mapping) {\n        return false;\n      }\n      buffer_info.range = sizeof(SpirvShaderTranslator::SystemConstants);\n      std::memcpy(mapping, &system_constants_,\n                  sizeof(SpirvShaderTranslator::SystemConstants));\n      current_constant_buffers_up_to_date_ |=\n          UINT32_C(1) << SpirvShaderTranslator::kConstantBufferSystem;\n    }\n    // Vertex shader float constants.\n    if (!(current_constant_buffers_up_to_date_ &\n          (UINT32_C(1) << SpirvShaderTranslator::kConstantBufferFloatVertex))) {\n      VkDescriptorBufferInfo& buffer_info = current_constant_buffer_infos_\n          [SpirvShaderTranslator::kConstantBufferFloatVertex];\n      // Even if the shader doesn't need any float constants, a valid binding\n      // must still be provided (the pipeline layout always has float constants,\n      // for both the vertex shader and the pixel shader), so if the first draw\n      // in the frame doesn't have float constants at all, still allocate a\n      // dummy buffer.\n      size_t float_constants_size =\n          sizeof(float) * 4 *\n          std::max(float_constant_count_vertex, UINT32_C(1));\n      uint8_t* mapping = uniform_buffer_pool_->Request(\n          frame_current_, float_constants_size, uniform_buffer_alignment,\n          buffer_info.buffer, buffer_info.offset);\n      if (!mapping) {\n        return false;\n      }\n      buffer_info.range = VkDeviceSize(float_constants_size);\n      for (uint32_t i = 0; i < 4; ++i) {\n        uint64_t float_constant_map_entry =\n            current_float_constant_map_vertex_[i];\n        uint32_t float_constant_index;\n        while (xe::bit_scan_forward(float_constant_map_entry,\n                                    &float_constant_index)) {\n          float_constant_map_entry &= ~(1ull << float_constant_index);\n          std::memcpy(mapping,\n                      &regs[XE_GPU_REG_SHADER_CONSTANT_000_X + (i << 8) +\n                            (float_constant_index << 2)],\n                      sizeof(float) * 4);\n          mapping += sizeof(float) * 4;\n        }\n      }\n      current_constant_buffers_up_to_date_ |=\n          UINT32_C(1) << SpirvShaderTranslator::kConstantBufferFloatVertex;\n    }\n    // Pixel shader float constants.\n    if (!(current_constant_buffers_up_to_date_ &\n          (UINT32_C(1) << SpirvShaderTranslator::kConstantBufferFloatPixel))) {\n      VkDescriptorBufferInfo& buffer_info = current_constant_buffer_infos_\n          [SpirvShaderTranslator::kConstantBufferFloatPixel];\n      size_t float_constants_size =\n          sizeof(float) * 4 * std::max(float_constant_count_pixel, UINT32_C(1));\n      uint8_t* mapping = uniform_buffer_pool_->Request(\n          frame_current_, float_constants_size, uniform_buffer_alignment,\n          buffer_info.buffer, buffer_info.offset);\n      if (!mapping) {\n        return false;\n      }\n      buffer_info.range = VkDeviceSize(float_constants_size);\n      for (uint32_t i = 0; i < 4; ++i) {\n        uint64_t float_constant_map_entry =\n            current_float_constant_map_pixel_[i];\n        uint32_t float_constant_index;\n        while (xe::bit_scan_forward(float_constant_map_entry,\n                                    &float_constant_index)) {\n          float_constant_map_entry &= ~(1ull << float_constant_index);\n          std::memcpy(mapping,\n                      &regs[XE_GPU_REG_SHADER_CONSTANT_256_X + (i << 8) +\n                            (float_constant_index << 2)],\n                      sizeof(float) * 4);\n          mapping += sizeof(float) * 4;\n        }\n      }\n      current_constant_buffers_up_to_date_ |=\n          UINT32_C(1) << SpirvShaderTranslator::kConstantBufferFloatPixel;\n    }\n    // Bool and loop constants.\n    if (!(current_constant_buffers_up_to_date_ &\n          (UINT32_C(1) << SpirvShaderTranslator::kConstantBufferBoolLoop))) {\n      VkDescriptorBufferInfo& buffer_info = current_constant_buffer_infos_\n          [SpirvShaderTranslator::kConstantBufferBoolLoop];\n      constexpr size_t kBoolLoopConstantsSize = sizeof(uint32_t) * (8 + 32);\n      uint8_t* mapping = uniform_buffer_pool_->Request(\n          frame_current_, kBoolLoopConstantsSize, uniform_buffer_alignment,\n          buffer_info.buffer, buffer_info.offset);\n      if (!mapping) {\n        return false;\n      }\n      buffer_info.range = VkDeviceSize(kBoolLoopConstantsSize);\n      std::memcpy(mapping, &regs[XE_GPU_REG_SHADER_CONSTANT_BOOL_000_031],\n                  kBoolLoopConstantsSize);\n      current_constant_buffers_up_to_date_ |=\n          UINT32_C(1) << SpirvShaderTranslator::kConstantBufferBoolLoop;\n    }\n    // Fetch constants.\n    if (!(current_constant_buffers_up_to_date_ &\n          (UINT32_C(1) << SpirvShaderTranslator::kConstantBufferFetch))) {\n      VkDescriptorBufferInfo& buffer_info = current_constant_buffer_infos_\n          [SpirvShaderTranslator::kConstantBufferFetch];\n      constexpr size_t kFetchConstantsSize = sizeof(uint32_t) * 6 * 32;\n      uint8_t* mapping = uniform_buffer_pool_->Request(\n          frame_current_, kFetchConstantsSize, uniform_buffer_alignment,\n          buffer_info.buffer, buffer_info.offset);\n      if (!mapping) {\n        return false;\n      }\n      buffer_info.range = VkDeviceSize(kFetchConstantsSize);\n      std::memcpy(mapping, &regs[XE_GPU_REG_SHADER_CONSTANT_FETCH_00_0],\n                  kFetchConstantsSize);\n      current_constant_buffers_up_to_date_ |=\n          UINT32_C(1) << SpirvShaderTranslator::kConstantBufferFetch;\n    }\n  }\n\n  // Textures and samplers.\n  const std::vector<VulkanShader::SamplerBinding>& samplers_vertex =\n      vertex_shader->GetSamplerBindingsAfterTranslation();\n  const std::vector<VulkanShader::TextureBinding>& textures_vertex =\n      vertex_shader->GetTextureBindingsAfterTranslation();\n  uint32_t sampler_count_vertex = uint32_t(samplers_vertex.size());\n  uint32_t texture_count_vertex = uint32_t(textures_vertex.size());\n  const std::vector<VulkanShader::SamplerBinding>* samplers_pixel;\n  const std::vector<VulkanShader::TextureBinding>* textures_pixel;\n  uint32_t sampler_count_pixel, texture_count_pixel;\n  if (pixel_shader) {\n    samplers_pixel = &pixel_shader->GetSamplerBindingsAfterTranslation();\n    textures_pixel = &pixel_shader->GetTextureBindingsAfterTranslation();\n    sampler_count_pixel = uint32_t(samplers_pixel->size());\n    texture_count_pixel = uint32_t(textures_pixel->size());\n  } else {\n    samplers_pixel = nullptr;\n    textures_pixel = nullptr;\n    sampler_count_pixel = 0;\n    texture_count_pixel = 0;\n  }\n  // TODO(Triang3l): Reuse texture and sampler bindings if not changed.\n  current_graphics_descriptor_set_values_up_to_date_ &=\n      ~((UINT32_C(1) << SpirvShaderTranslator::kDescriptorSetTexturesVertex) |\n        (UINT32_C(1) << SpirvShaderTranslator::kDescriptorSetTexturesPixel));\n\n  // Make sure new descriptor sets are bound to the command buffer.\n\n  current_graphics_descriptor_sets_bound_up_to_date_ &=\n      current_graphics_descriptor_set_values_up_to_date_;\n\n  // Fill the texture and sampler write image infos.\n\n  bool write_vertex_textures =\n      (texture_count_vertex || sampler_count_vertex) &&\n      !(current_graphics_descriptor_set_values_up_to_date_ &\n        (UINT32_C(1) << SpirvShaderTranslator::kDescriptorSetTexturesVertex));\n  bool write_pixel_textures =\n      (texture_count_pixel || sampler_count_pixel) &&\n      !(current_graphics_descriptor_set_values_up_to_date_ &\n        (UINT32_C(1) << SpirvShaderTranslator::kDescriptorSetTexturesPixel));\n  descriptor_write_image_info_.clear();\n  descriptor_write_image_info_.reserve(\n      (write_vertex_textures ? texture_count_vertex + sampler_count_vertex\n                             : 0) +\n      (write_pixel_textures ? texture_count_pixel + sampler_count_pixel : 0));\n  size_t vertex_texture_image_info_offset = descriptor_write_image_info_.size();\n  if (write_vertex_textures && texture_count_vertex) {\n    for (const VulkanShader::TextureBinding& texture_binding :\n         textures_vertex) {\n      VkDescriptorImageInfo& descriptor_image_info =\n          descriptor_write_image_info_.emplace_back();\n      descriptor_image_info.imageView =\n          texture_cache_->GetActiveBindingOrNullImageView(\n              texture_binding.fetch_constant, texture_binding.dimension,\n              bool(texture_binding.is_signed));\n      descriptor_image_info.imageLayout =\n          VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;\n    }\n  }\n  size_t vertex_sampler_image_info_offset = descriptor_write_image_info_.size();\n  if (write_vertex_textures && sampler_count_vertex) {\n    for (const std::pair<VulkanTextureCache::SamplerParameters, VkSampler>&\n             sampler_pair : current_samplers_vertex_) {\n      VkDescriptorImageInfo& descriptor_image_info =\n          descriptor_write_image_info_.emplace_back();\n      descriptor_image_info.sampler = sampler_pair.second;\n    }\n  }\n  size_t pixel_texture_image_info_offset = descriptor_write_image_info_.size();\n  if (write_pixel_textures && texture_count_pixel) {\n    for (const VulkanShader::TextureBinding& texture_binding :\n         *textures_pixel) {\n      VkDescriptorImageInfo& descriptor_image_info =\n          descriptor_write_image_info_.emplace_back();\n      descriptor_image_info.imageView =\n          texture_cache_->GetActiveBindingOrNullImageView(\n              texture_binding.fetch_constant, texture_binding.dimension,\n              bool(texture_binding.is_signed));\n      descriptor_image_info.imageLayout =\n          VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;\n    }\n  }\n  size_t pixel_sampler_image_info_offset = descriptor_write_image_info_.size();\n  if (write_pixel_textures && sampler_count_pixel) {\n    for (const std::pair<VulkanTextureCache::SamplerParameters, VkSampler>&\n             sampler_pair : current_samplers_pixel_) {\n      VkDescriptorImageInfo& descriptor_image_info =\n          descriptor_write_image_info_.emplace_back();\n      descriptor_image_info.sampler = sampler_pair.second;\n    }\n  }\n\n  // Write the new descriptor sets.\n\n  // Consecutive bindings updated via a single VkWriteDescriptorSet must have\n  // identical stage flags, but for the constants they vary. Plus vertex and\n  // pixel texture images and samplers.\n  std::array<VkWriteDescriptorSet,\n             SpirvShaderTranslator::kConstantBufferCount + 2 * 2>\n      write_descriptor_sets;\n  uint32_t write_descriptor_set_count = 0;\n  uint32_t write_descriptor_set_bits = 0;\n  assert_not_zero(\n      current_graphics_descriptor_set_values_up_to_date_ &\n      (UINT32_C(1)\n       << SpirvShaderTranslator::kDescriptorSetSharedMemoryAndEdram));\n  // Constant buffers.\n  if (!(current_graphics_descriptor_set_values_up_to_date_ &\n        (UINT32_C(1) << SpirvShaderTranslator::kDescriptorSetConstants))) {\n    VkDescriptorSet constants_descriptor_set;\n    if (!constants_transient_descriptors_free_.empty()) {\n      constants_descriptor_set = constants_transient_descriptors_free_.back();\n      constants_transient_descriptors_free_.pop_back();\n    } else {\n      VkDescriptorPoolSize constants_descriptor_count;\n      constants_descriptor_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;\n      constants_descriptor_count.descriptorCount =\n          SpirvShaderTranslator::kConstantBufferCount;\n      constants_descriptor_set =\n          transient_descriptor_allocator_uniform_buffer_.Allocate(\n              descriptor_set_layout_constants_, &constants_descriptor_count, 1);\n      if (constants_descriptor_set == VK_NULL_HANDLE) {\n        return false;\n      }\n    }\n    constants_transient_descriptors_used_.emplace_back(\n        frame_current_, constants_descriptor_set);\n    // Consecutive bindings updated via a single VkWriteDescriptorSet must have\n    // identical stage flags, but for the constants they vary.\n    for (uint32_t i = 0; i < SpirvShaderTranslator::kConstantBufferCount; ++i) {\n      VkWriteDescriptorSet& write_constants =\n          write_descriptor_sets[write_descriptor_set_count++];\n      write_constants.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;\n      write_constants.pNext = nullptr;\n      write_constants.dstSet = constants_descriptor_set;\n      write_constants.dstBinding = i;\n      write_constants.dstArrayElement = 0;\n      write_constants.descriptorCount = 1;\n      write_constants.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;\n      write_constants.pImageInfo = nullptr;\n      write_constants.pBufferInfo = &current_constant_buffer_infos_[i];\n      write_constants.pTexelBufferView = nullptr;\n    }\n    write_descriptor_set_bits |=\n        UINT32_C(1) << SpirvShaderTranslator::kDescriptorSetConstants;\n    current_graphics_descriptor_sets_\n        [SpirvShaderTranslator::kDescriptorSetConstants] =\n            constants_descriptor_set;\n  }\n  // Vertex shader textures and samplers.\n  if (write_vertex_textures) {\n    VkWriteDescriptorSet* write_textures =\n        write_descriptor_sets.data() + write_descriptor_set_count;\n    uint32_t texture_descriptor_set_write_count = WriteTransientTextureBindings(\n        true, texture_count_vertex, sampler_count_vertex,\n        current_guest_graphics_pipeline_layout_\n            ->descriptor_set_layout_textures_vertex_ref(),\n        descriptor_write_image_info_.data() + vertex_texture_image_info_offset,\n        descriptor_write_image_info_.data() + vertex_sampler_image_info_offset,\n        write_textures);\n    if (!texture_descriptor_set_write_count) {\n      return false;\n    }\n    write_descriptor_set_count += texture_descriptor_set_write_count;\n    write_descriptor_set_bits |=\n        UINT32_C(1) << SpirvShaderTranslator::kDescriptorSetTexturesVertex;\n    current_graphics_descriptor_sets_\n        [SpirvShaderTranslator::kDescriptorSetTexturesVertex] =\n            write_textures[0].dstSet;\n  }\n  // Pixel shader textures and samplers.\n  if (write_pixel_textures) {\n    VkWriteDescriptorSet* write_textures =\n        write_descriptor_sets.data() + write_descriptor_set_count;\n    uint32_t texture_descriptor_set_write_count = WriteTransientTextureBindings(\n        false, texture_count_pixel, sampler_count_pixel,\n        current_guest_graphics_pipeline_layout_\n            ->descriptor_set_layout_textures_pixel_ref(),\n        descriptor_write_image_info_.data() + pixel_texture_image_info_offset,\n        descriptor_write_image_info_.data() + pixel_sampler_image_info_offset,\n        write_textures);\n    if (!texture_descriptor_set_write_count) {\n      return false;\n    }\n    write_descriptor_set_count += texture_descriptor_set_write_count;\n    write_descriptor_set_bits |=\n        UINT32_C(1) << SpirvShaderTranslator::kDescriptorSetTexturesPixel;\n    current_graphics_descriptor_sets_\n        [SpirvShaderTranslator::kDescriptorSetTexturesPixel] =\n            write_textures[0].dstSet;\n  }\n  // Write.\n  if (write_descriptor_set_count) {\n    dfn.vkUpdateDescriptorSets(device, write_descriptor_set_count,\n                               write_descriptor_sets.data(), 0, nullptr);\n  }\n  // Only make valid if all descriptor sets have been allocated and written\n  // successfully.\n  current_graphics_descriptor_set_values_up_to_date_ |=\n      write_descriptor_set_bits;\n\n  // Bind the new descriptor sets.\n  uint32_t descriptor_sets_needed =\n      (UINT32_C(1) << SpirvShaderTranslator::kDescriptorSetCount) - 1;\n  if (!texture_count_vertex && !sampler_count_vertex) {\n    descriptor_sets_needed &=\n        ~(UINT32_C(1) << SpirvShaderTranslator::kDescriptorSetTexturesVertex);\n  }\n  if (!texture_count_pixel && !sampler_count_pixel) {\n    descriptor_sets_needed &=\n        ~(UINT32_C(1) << SpirvShaderTranslator::kDescriptorSetTexturesPixel);\n  }\n  uint32_t descriptor_sets_remaining =\n      descriptor_sets_needed &\n      ~current_graphics_descriptor_sets_bound_up_to_date_;\n  uint32_t descriptor_set_index;\n  while (\n      xe::bit_scan_forward(descriptor_sets_remaining, &descriptor_set_index)) {\n    uint32_t descriptor_set_mask_tzcnt =\n        xe::tzcnt(~(descriptor_sets_remaining |\n                    ((UINT32_C(1) << descriptor_set_index) - 1)));\n    // TODO(Triang3l): Bind to compute for memexport emulation without vertex\n    // shader memory stores.\n    deferred_command_buffer_.CmdVkBindDescriptorSets(\n        VK_PIPELINE_BIND_POINT_GRAPHICS,\n        current_guest_graphics_pipeline_layout_->GetPipelineLayout(),\n        descriptor_set_index, descriptor_set_mask_tzcnt - descriptor_set_index,\n        current_graphics_descriptor_sets_ + descriptor_set_index, 0, nullptr);\n    if (descriptor_set_mask_tzcnt >= 32) {\n      break;\n    }\n    descriptor_sets_remaining &=\n        ~((UINT32_C(1) << descriptor_set_mask_tzcnt) - 1);\n  }\n  current_graphics_descriptor_sets_bound_up_to_date_ |= descriptor_sets_needed;\n\n  return true;\n}\n\nuint32_t VulkanCommandProcessor::WriteTransientTextureBindings(\n    bool is_vertex, uint32_t texture_count, uint32_t sampler_count,\n    VkDescriptorSetLayout descriptor_set_layout,\n    const VkDescriptorImageInfo* texture_image_info,\n    const VkDescriptorImageInfo* sampler_image_info,\n    VkWriteDescriptorSet* descriptor_set_writes_out) {\n  assert_true(frame_open_);\n  if (!texture_count && !sampler_count) {\n    return 0;\n  }\n  TextureDescriptorSetLayoutKey texture_descriptor_set_layout_key;\n  texture_descriptor_set_layout_key.texture_count = texture_count;\n  texture_descriptor_set_layout_key.sampler_count = sampler_count;\n  texture_descriptor_set_layout_key.is_vertex = uint32_t(is_vertex);\n  VkDescriptorSet texture_descriptor_set;\n  auto textures_free_it = texture_transient_descriptor_sets_free_.find(\n      texture_descriptor_set_layout_key);\n  if (textures_free_it != texture_transient_descriptor_sets_free_.end() &&\n      !textures_free_it->second.empty()) {\n    texture_descriptor_set = textures_free_it->second.back();\n    textures_free_it->second.pop_back();\n  } else {\n    std::array<VkDescriptorPoolSize, 2> texture_descriptor_counts;\n    uint32_t texture_descriptor_counts_count = 0;\n    if (texture_count) {\n      VkDescriptorPoolSize& texture_descriptor_count =\n          texture_descriptor_counts[texture_descriptor_counts_count++];\n      texture_descriptor_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;\n      texture_descriptor_count.descriptorCount = texture_count;\n    }\n    if (sampler_count) {\n      VkDescriptorPoolSize& texture_descriptor_count =\n          texture_descriptor_counts[texture_descriptor_counts_count++];\n      texture_descriptor_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;\n      texture_descriptor_count.descriptorCount = sampler_count;\n    }\n    assert_not_zero(texture_descriptor_counts_count);\n    texture_descriptor_set = transient_descriptor_allocator_textures_.Allocate(\n        descriptor_set_layout, texture_descriptor_counts.data(),\n        texture_descriptor_counts_count);\n    if (texture_descriptor_set == VK_NULL_HANDLE) {\n      return 0;\n    }\n  }\n  UsedTextureTransientDescriptorSet& used_texture_descriptor_set =\n      texture_transient_descriptor_sets_used_.emplace_back();\n  used_texture_descriptor_set.frame = frame_current_;\n  used_texture_descriptor_set.layout = texture_descriptor_set_layout_key;\n  used_texture_descriptor_set.set = texture_descriptor_set;\n  uint32_t descriptor_set_write_count = 0;\n  if (texture_count) {\n    VkWriteDescriptorSet& descriptor_set_write =\n        descriptor_set_writes_out[descriptor_set_write_count++];\n    descriptor_set_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;\n    descriptor_set_write.pNext = nullptr;\n    descriptor_set_write.dstSet = texture_descriptor_set;\n    descriptor_set_write.dstBinding = 0;\n    descriptor_set_write.dstArrayElement = 0;\n    descriptor_set_write.descriptorCount = texture_count;\n    descriptor_set_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;\n    descriptor_set_write.pImageInfo = texture_image_info;\n    descriptor_set_write.pBufferInfo = nullptr;\n    descriptor_set_write.pTexelBufferView = nullptr;\n  }\n  if (sampler_count) {\n    VkWriteDescriptorSet& descriptor_set_write =\n        descriptor_set_writes_out[descriptor_set_write_count++];\n    descriptor_set_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;\n    descriptor_set_write.pNext = nullptr;\n    descriptor_set_write.dstSet = texture_descriptor_set;\n    descriptor_set_write.dstBinding = texture_count;\n    descriptor_set_write.dstArrayElement = 0;\n    descriptor_set_write.descriptorCount = sampler_count;\n    descriptor_set_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;\n    descriptor_set_write.pImageInfo = sampler_image_info;\n    descriptor_set_write.pBufferInfo = nullptr;\n    descriptor_set_write.pTexelBufferView = nullptr;\n  }\n  assert_not_zero(descriptor_set_write_count);\n  return descriptor_set_write_count;\n}\n\n}  // namespace vulkan\n}  // namespace gpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/vulkan/vulkan_command_processor.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_VULKAN_VULKAN_COMMAND_PROCESSOR_H_\n#define XENIA_GPU_VULKAN_VULKAN_COMMAND_PROCESSOR_H_\n\n#include <array>\n#include <climits>\n#include <cstdint>\n#include <deque>\n#include <functional>\n#include <memory>\n#include <string>\n#include <unordered_map>\n#include <utility>\n#include <vector>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/hash.h\"\n#include \"xenia/gpu/command_processor.h\"\n#include \"xenia/gpu/draw_util.h\"\n#include \"xenia/gpu/registers.h\"\n#include \"xenia/gpu/spirv_shader_translator.h\"\n#include \"xenia/gpu/vulkan/deferred_command_buffer.h\"\n#include \"xenia/gpu/vulkan/vulkan_graphics_system.h\"\n#include \"xenia/gpu/vulkan/vulkan_pipeline_cache.h\"\n#include \"xenia/gpu/vulkan/vulkan_primitive_processor.h\"\n#include \"xenia/gpu/vulkan/vulkan_render_target_cache.h\"\n#include \"xenia/gpu/vulkan/vulkan_shader.h\"\n#include \"xenia/gpu/vulkan/vulkan_shared_memory.h\"\n#include \"xenia/gpu/vulkan/vulkan_texture_cache.h\"\n#include \"xenia/gpu/xenos.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/ui/vulkan/linked_type_descriptor_set_allocator.h\"\n#include \"xenia/ui/vulkan/vulkan_gpu_completion_timeline.h\"\n#include \"xenia/ui/vulkan/vulkan_presenter.h\"\n#include \"xenia/ui/vulkan/vulkan_provider.h\"\n#include \"xenia/ui/vulkan/vulkan_upload_buffer_pool.h\"\n\nnamespace xe {\nnamespace gpu {\nnamespace vulkan {\n\nclass VulkanCommandProcessor : public CommandProcessor {\n public:\n  // Single-descriptor layouts for use within a single frame.\n  enum class SingleTransientDescriptorLayout {\n    kStorageBufferCompute,\n    kCount,\n  };\n\n  class ScratchBufferAcquisition {\n   public:\n    explicit ScratchBufferAcquisition() = default;\n    explicit ScratchBufferAcquisition(VulkanCommandProcessor& command_processor,\n                                      VkBuffer buffer,\n                                      VkPipelineStageFlags stage_mask,\n                                      VkAccessFlags access_mask)\n        : command_processor_(&command_processor),\n          buffer_(buffer),\n          stage_mask_(stage_mask),\n          access_mask_(access_mask) {}\n\n    ScratchBufferAcquisition(const ScratchBufferAcquisition& acquisition) =\n        delete;\n    ScratchBufferAcquisition& operator=(\n        const ScratchBufferAcquisition& acquisition) = delete;\n\n    ScratchBufferAcquisition(ScratchBufferAcquisition&& acquisition) {\n      command_processor_ = acquisition.command_processor_;\n      buffer_ = acquisition.buffer_;\n      stage_mask_ = acquisition.stage_mask_;\n      access_mask_ = acquisition.access_mask_;\n      acquisition.command_processor_ = nullptr;\n      acquisition.buffer_ = VK_NULL_HANDLE;\n      acquisition.stage_mask_ = 0;\n      acquisition.access_mask_ = 0;\n    }\n    ScratchBufferAcquisition& operator=(\n        ScratchBufferAcquisition&& acquisition) {\n      if (this == &acquisition) {\n        return *this;\n      }\n      command_processor_ = acquisition.command_processor_;\n      buffer_ = acquisition.buffer_;\n      stage_mask_ = acquisition.stage_mask_;\n      access_mask_ = acquisition.access_mask_;\n      acquisition.command_processor_ = nullptr;\n      acquisition.buffer_ = VK_NULL_HANDLE;\n      acquisition.stage_mask_ = 0;\n      acquisition.access_mask_ = 0;\n      return *this;\n    }\n\n    ~ScratchBufferAcquisition() {\n      if (buffer_ != VK_NULL_HANDLE) {\n        assert_true(command_processor_->scratch_buffer_used_);\n        assert_true(command_processor_->scratch_buffer_ == buffer_);\n        command_processor_->scratch_buffer_last_stage_mask_ = stage_mask_;\n        command_processor_->scratch_buffer_last_access_mask_ = access_mask_;\n        command_processor_->scratch_buffer_last_usage_submission_ =\n            command_processor_->GetCurrentSubmission();\n        command_processor_->scratch_buffer_used_ = false;\n      }\n    }\n\n    // VK_NULL_HANDLE if failed to acquire or if moved.\n    VkBuffer buffer() const { return buffer_; }\n\n    VkPipelineStageFlags GetStageMask() const { return stage_mask_; }\n    VkPipelineStageFlags SetStageMask(VkPipelineStageFlags new_stage_mask) {\n      VkPipelineStageFlags old_stage_mask = stage_mask_;\n      stage_mask_ = new_stage_mask;\n      return old_stage_mask;\n    }\n    VkAccessFlags GetAccessMask() const { return access_mask_; }\n    VkAccessFlags SetAccessMask(VkAccessFlags new_access_mask) {\n      VkAccessFlags old_access_mask = access_mask_;\n      access_mask_ = new_access_mask;\n      return old_access_mask;\n    }\n\n   private:\n    VulkanCommandProcessor* command_processor_ = nullptr;\n    VkBuffer buffer_ = VK_NULL_HANDLE;\n    VkPipelineStageFlags stage_mask_ = 0;\n    VkAccessFlags access_mask_ = 0;\n  };\n\n  VulkanCommandProcessor(VulkanGraphicsSystem* graphics_system,\n                         kernel::KernelState* kernel_state);\n  ~VulkanCommandProcessor();\n\n  void ClearCaches() override;\n\n  void TracePlaybackWroteMemory(uint32_t base_ptr, uint32_t length) override;\n\n  void RestoreEdramSnapshot(const void* snapshot) override;\n\n  ui::vulkan::VulkanDevice* GetVulkanDevice() const {\n    return static_cast<const ui::vulkan::VulkanProvider*>(\n               graphics_system_->provider())\n        ->vulkan_device();\n  }\n\n  // Returns the deferred drawing command list for the currently open\n  // submission.\n  DeferredCommandBuffer& deferred_command_buffer() {\n    assert_true(submission_open_);\n    return deferred_command_buffer_;\n  }\n\n  bool submission_open() const { return submission_open_; }\n  uint64_t GetCurrentSubmission() const {\n    return completion_timeline_.GetUpcomingSubmission();\n  }\n  uint64_t GetCompletedSubmission() const {\n    return completion_timeline_.GetCompletedSubmissionFromLastUpdate();\n  }\n\n  // Sparse binds are:\n  // - In a single submission, all submitted in one vkQueueBindSparse.\n  // - Sent to the queue without waiting for a semaphore.\n  // Thus, multiple sparse binds between the completed and the current\n  // submission, and within one submission, must not touch any overlapping\n  // memory regions.\n  void SparseBindBuffer(VkBuffer buffer, uint32_t bind_count,\n                        const VkSparseMemoryBind* binds,\n                        VkPipelineStageFlags wait_stage_mask);\n\n  uint64_t GetCurrentFrame() const { return frame_current_; }\n  uint64_t GetCompletedFrame() const { return frame_completed_; }\n\n  // Submission must be open to insert barriers. If no pipeline stages access\n  // the resource in a synchronization scope, the stage masks should be 0 (top /\n  // bottom of pipe should be specified only if explicitly needed). Returning\n  // true if the barrier has actually been inserted and not dropped.\n  bool PushBufferMemoryBarrier(\n      VkBuffer buffer, VkDeviceSize offset, VkDeviceSize size,\n      VkPipelineStageFlags src_stage_mask, VkPipelineStageFlags dst_stage_mask,\n      VkAccessFlags src_access_mask, VkAccessFlags dst_access_mask,\n      uint32_t src_queue_family_index = VK_QUEUE_FAMILY_IGNORED,\n      uint32_t dst_queue_family_index = VK_QUEUE_FAMILY_IGNORED,\n      bool skip_if_equal = true);\n  bool PushImageMemoryBarrier(\n      VkImage image, const VkImageSubresourceRange& subresource_range,\n      VkPipelineStageFlags src_stage_mask, VkPipelineStageFlags dst_stage_mask,\n      VkAccessFlags src_access_mask, VkAccessFlags dst_access_mask,\n      VkImageLayout old_layout, VkImageLayout new_layout,\n      uint32_t src_queue_family_index = VK_QUEUE_FAMILY_IGNORED,\n      uint32_t dst_queue_family_index = VK_QUEUE_FAMILY_IGNORED,\n      bool skip_if_equal = true);\n  // Returns whether any barriers have been submitted - if true is returned, the\n  // render pass will also be closed.\n  bool SubmitBarriers(bool force_end_render_pass);\n\n  // If not started yet, begins a render pass from the render target cache.\n  // Submission must be open.\n  void SubmitBarriersAndEnterRenderTargetCacheRenderPass(\n      VkRenderPass render_pass,\n      const VulkanRenderTargetCache::Framebuffer* framebuffer);\n  // Must be called before doing anything outside the render pass scope,\n  // including adding pipeline barriers that are not a part of the render pass\n  // scope. Submission must be open.\n  void EndRenderPass();\n\n  VkDescriptorSetLayout GetSingleTransientDescriptorLayout(\n      SingleTransientDescriptorLayout transient_descriptor_layout) const {\n    return descriptor_set_layouts_single_transient_[size_t(\n        transient_descriptor_layout)];\n  }\n  // A frame must be open.\n  VkDescriptorSet AllocateSingleTransientDescriptor(\n      SingleTransientDescriptorLayout transient_descriptor_layout);\n\n  // The returned reference is valid until a cache clear.\n  VkDescriptorSetLayout GetTextureDescriptorSetLayout(bool is_vertex,\n                                                      size_t texture_count,\n                                                      size_t sampler_count);\n  // The returned reference is valid until a cache clear.\n  const VulkanPipelineCache::PipelineLayoutProvider* GetPipelineLayout(\n      size_t texture_count_pixel, size_t sampler_count_pixel,\n      size_t texture_count_vertex, size_t sampler_count_vertex);\n\n  // Returns a single temporary GPU-side buffer within a submission for tasks\n  // like texture untiling and resolving. May push a buffer memory barrier into\n  // the initial usage. Submission must be open.\n  ScratchBufferAcquisition AcquireScratchGpuBuffer(\n      VkDeviceSize size, VkPipelineStageFlags initial_stage_mask,\n      VkAccessFlags initial_access_mask);\n\n  // Binds a graphics pipeline for host-specific purposes, invalidating the\n  // affected state. keep_dynamic_* must be false (to invalidate the dynamic\n  // state after binding the pipeline with the same state being static, or if\n  // the caller changes the dynamic state bypassing the VulkanCommandProcessor)\n  // unless the caller has these state variables as dynamic and uses the\n  // tracking in VulkanCommandProcessor to modify them.\n  void BindExternalGraphicsPipeline(VkPipeline pipeline,\n                                    bool keep_dynamic_depth_bias = false,\n                                    bool keep_dynamic_blend_constants = false,\n                                    bool keep_dynamic_stencil_mask_ref = false);\n  void BindExternalComputePipeline(VkPipeline pipeline);\n  void SetViewport(const VkViewport& viewport);\n  void SetScissor(const VkRect2D& scissor);\n\n  // Returns the text to display in the GPU backend name in the window title.\n  std::string GetWindowTitleText() const;\n\n protected:\n  bool SetupContext() override;\n  void ShutdownContext() override;\n\n  void WriteRegister(uint32_t index, uint32_t value) override;\n\n  void OnGammaRamp256EntryTableValueWritten() override;\n  void OnGammaRampPWLValueWritten() override;\n\n  void IssueSwap(uint32_t frontbuffer_ptr, uint32_t frontbuffer_width,\n                 uint32_t frontbuffer_height) override;\n\n  Shader* LoadShader(xenos::ShaderType shader_type, uint32_t guest_address,\n                     const uint32_t* host_address,\n                     uint32_t dword_count) override;\n\n  bool IssueDraw(xenos::PrimitiveType prim_type, uint32_t index_count,\n                 IndexBufferInfo* index_buffer_info,\n                 bool major_mode_explicit) override;\n  bool IssueCopy() override;\n\n  void InitializeTrace() override;\n\n private:\n  struct CommandBuffer {\n    VkCommandPool pool;\n    VkCommandBuffer buffer;\n  };\n\n  struct SparseBufferBind {\n    VkBuffer buffer;\n    size_t bind_offset;\n    uint32_t bind_count;\n  };\n\n  union TextureDescriptorSetLayoutKey {\n    uint32_t key;\n    struct {\n      // If texture and sampler counts are both 0, use\n      // descriptor_set_layout_empty_ instead as these are owning references.\n      uint32_t texture_count : 16;\n      uint32_t sampler_count : 15;\n      uint32_t is_vertex : 1;\n    };\n\n    TextureDescriptorSetLayoutKey() : key(0) {\n      static_assert_size(*this, sizeof(key));\n    }\n\n    struct Hasher {\n      size_t operator()(const TextureDescriptorSetLayoutKey& key) const {\n        return std::hash<decltype(key.key)>{}(key.key);\n      }\n    };\n    bool operator==(const TextureDescriptorSetLayoutKey& other_key) const {\n      return key == other_key.key;\n    }\n    bool operator!=(const TextureDescriptorSetLayoutKey& other_key) const {\n      return !(*this == other_key);\n    }\n  };\n\n  union PipelineLayoutKey {\n    uint64_t key;\n    struct {\n      // Pixel textures in the low bits since those are varied much more\n      // commonly.\n      uint16_t texture_count_pixel;\n      uint16_t sampler_count_pixel;\n      uint16_t texture_count_vertex;\n      uint16_t sampler_count_vertex;\n    };\n\n    PipelineLayoutKey() : key(0) { static_assert_size(*this, sizeof(key)); }\n\n    struct Hasher {\n      size_t operator()(const PipelineLayoutKey& key) const {\n        return std::hash<decltype(key.key)>{}(key.key);\n      }\n    };\n    bool operator==(const PipelineLayoutKey& other_key) const {\n      return key == other_key.key;\n    }\n    bool operator!=(const PipelineLayoutKey& other_key) const {\n      return !(*this == other_key);\n    }\n  };\n\n  class PipelineLayout : public VulkanPipelineCache::PipelineLayoutProvider {\n   public:\n    explicit PipelineLayout(\n        VkPipelineLayout pipeline_layout,\n        VkDescriptorSetLayout descriptor_set_layout_textures_vertex_ref,\n        VkDescriptorSetLayout descriptor_set_layout_textures_pixel_ref)\n        : pipeline_layout_(pipeline_layout),\n          descriptor_set_layout_textures_vertex_ref_(\n              descriptor_set_layout_textures_vertex_ref),\n          descriptor_set_layout_textures_pixel_ref_(\n              descriptor_set_layout_textures_pixel_ref) {}\n    VkPipelineLayout GetPipelineLayout() const override {\n      return pipeline_layout_;\n    }\n    VkDescriptorSetLayout descriptor_set_layout_textures_vertex_ref() const {\n      return descriptor_set_layout_textures_vertex_ref_;\n    }\n    VkDescriptorSetLayout descriptor_set_layout_textures_pixel_ref() const {\n      return descriptor_set_layout_textures_pixel_ref_;\n    }\n\n   private:\n    VkPipelineLayout pipeline_layout_;\n    VkDescriptorSetLayout descriptor_set_layout_textures_vertex_ref_;\n    VkDescriptorSetLayout descriptor_set_layout_textures_pixel_ref_;\n  };\n\n  struct UsedSingleTransientDescriptor {\n    uint64_t frame;\n    SingleTransientDescriptorLayout layout;\n    VkDescriptorSet set;\n  };\n\n  struct UsedTextureTransientDescriptorSet {\n    uint64_t frame;\n    TextureDescriptorSetLayoutKey layout;\n    VkDescriptorSet set;\n  };\n\n  enum SwapApplyGammaDescriptorSet : uint32_t {\n    kSwapApplyGammaDescriptorSetRamp,\n    kSwapApplyGammaDescriptorSetSource,\n\n    kSwapApplyGammaDescriptorSetCount,\n  };\n\n  // Framebuffer for the current presenter's guest output image revision, and\n  // its usage tracking.\n  struct SwapFramebuffer {\n    VkFramebuffer framebuffer = VK_NULL_HANDLE;\n    uint64_t version = UINT64_MAX;\n    uint64_t last_submission = 0;\n  };\n\n  // BeginSubmission and EndSubmission may be called at any time. If there's an\n  // open non-frame submission, BeginSubmission(true) will promote it to a\n  // frame. EndSubmission(true) will close the frame no matter whether the\n  // submission has already been closed.\n  // Unlike on Direct3D 12, submission boundaries do not imply any memory\n  // barriers aside from an incoming host write (but not outgoing host read)\n  // dependency.\n\n  // Rechecks submission number and reclaims per-submission resources. Pass 0 as\n  // the submission to await to simply check status, or pass\n  // GetCurrentSubmission() to wait for all queue operations to be completed.\n  void CheckSubmissionCompletionAndDeviceLoss(uint64_t await_submission);\n  // If is_guest_command is true, a new full frame - with full cleanup of\n  // resources and, if needed, starting capturing - is opened if pending (as\n  // opposed to simply resuming after mid-frame synchronization). Returns\n  // whether a submission is open currently and the device is not lost.\n  bool BeginSubmission(bool is_guest_command);\n  // If is_swap is true, a full frame is closed - with, if needed, cache\n  // clearing and stopping capturing. Returns whether the submission was done\n  // successfully, if it has failed, leaves it open.\n  bool EndSubmission(bool is_swap);\n  bool AwaitAllQueueOperationsCompletion() {\n    CheckSubmissionCompletionAndDeviceLoss(GetCurrentSubmission());\n    return !submission_open_ &&\n           GetCompletedSubmission() + 1u >= GetCurrentSubmission();\n  }\n\n  void ClearTransientDescriptorPools();\n\n  void SplitPendingBarrier();\n\n  void DestroyScratchBuffer();\n\n  void UpdateDynamicState(const draw_util::ViewportInfo& viewport_info,\n                          bool primitive_polygonal,\n                          reg::RB_DEPTHCONTROL normalized_depth_control);\n  void UpdateSystemConstantValues(\n      bool primitive_polygonal,\n      const PrimitiveProcessor::ProcessingResult& primitive_processing_result,\n      bool shader_32bit_index_dma, const draw_util::ViewportInfo& viewport_info,\n      uint32_t used_texture_mask, reg::RB_DEPTHCONTROL normalized_depth_control,\n      uint32_t normalized_color_mask);\n  bool UpdateBindings(const VulkanShader* vertex_shader,\n                      const VulkanShader* pixel_shader);\n  // Allocates a descriptor set and fills one or two VkWriteDescriptorSet\n  // structure instances (for images and samplers).\n  // The descriptor set layout must be the one for the given is_vertex,\n  // texture_count, sampler_count (from GetTextureDescriptorSetLayout - may be\n  // already available at the moment of the call, no need to locate it again).\n  // Returns how many VkWriteDescriptorSet structure instances have been\n  // written, or 0 if there was a failure to allocate the descriptor set or no\n  // bindings were requested.\n  uint32_t WriteTransientTextureBindings(\n      bool is_vertex, uint32_t texture_count, uint32_t sampler_count,\n      VkDescriptorSetLayout descriptor_set_layout,\n      const VkDescriptorImageInfo* texture_image_info,\n      const VkDescriptorImageInfo* sampler_image_info,\n      VkWriteDescriptorSet* descriptor_set_writes_out);\n\n  bool device_lost_ = false;\n\n  bool cache_clear_requested_ = false;\n\n  // Host shader types that guest shaders can be translated into - they can\n  // access the shared memory (via vertex fetch, memory export, or manual index\n  // buffer reading) and textures.\n  VkPipelineStageFlags guest_shader_pipeline_stages_ = 0;\n  VkShaderStageFlags guest_shader_vertex_stages_ = 0;\n\n  std::vector<VkSemaphore> semaphores_free_;\n\n  ui::vulkan::VulkanGPUCompletionTimeline completion_timeline_;\n  bool submission_open_ = false;\n  // In case vkQueueSubmit fails after something like a successful\n  // vkQueueBindSparse, to wait correctly on the next attempt.\n  std::vector<VkSemaphore> current_submission_wait_semaphores_;\n  std::vector<VkPipelineStageFlags> current_submission_wait_stage_masks_;\n  std::deque<std::pair<uint64_t, VkSemaphore>>\n      submissions_in_flight_semaphores_;\n\n  static constexpr uint32_t kMaxFramesInFlight = 3;\n  bool frame_open_ = false;\n  // Guest frame index, since some transient resources can be reused across\n  // submissions. Values updated in the beginning of a frame.\n  uint64_t frame_current_ = 1;\n  uint64_t frame_completed_ = 0;\n  // Submission indices of frames that have already been submitted.\n  uint64_t closed_frame_submissions_[kMaxFramesInFlight] = {};\n\n  // <Submission where last used, resource>, sorted by the submission number.\n  std::deque<std::pair<uint64_t, VkDeviceMemory>> destroy_memory_;\n  std::deque<std::pair<uint64_t, VkBuffer>> destroy_buffers_;\n  std::deque<std::pair<uint64_t, VkFramebuffer>> destroy_framebuffers_;\n\n  std::vector<CommandBuffer> command_buffers_writable_;\n  std::deque<std::pair<uint64_t, CommandBuffer>> command_buffers_submitted_;\n  DeferredCommandBuffer deferred_command_buffer_;\n\n  std::vector<VkSparseMemoryBind> sparse_memory_binds_;\n  std::vector<SparseBufferBind> sparse_buffer_binds_;\n  // SparseBufferBind converted to VkSparseBufferMemoryBindInfo to this buffer\n  // on submission (because pBinds should point to a place in std::vector, but\n  // it may be reallocated).\n  std::vector<VkSparseBufferMemoryBindInfo> sparse_buffer_bind_infos_temp_;\n  VkPipelineStageFlags sparse_bind_wait_stage_mask_ = 0;\n\n  // Temporary storage with reusable memory for creating descriptor set layouts.\n  std::vector<VkDescriptorSetLayoutBinding> descriptor_set_layout_bindings_;\n  // Temporary storage with reusable memory for writing image and sampler\n  // descriptors.\n  std::vector<VkDescriptorImageInfo> descriptor_write_image_info_;\n\n  std::unique_ptr<ui::vulkan::VulkanUploadBufferPool> uniform_buffer_pool_;\n\n  // Descriptor set layouts used by different shaders.\n  VkDescriptorSetLayout descriptor_set_layout_empty_ = VK_NULL_HANDLE;\n  VkDescriptorSetLayout descriptor_set_layout_constants_ = VK_NULL_HANDLE;\n  std::array<VkDescriptorSetLayout,\n             size_t(SingleTransientDescriptorLayout::kCount)>\n      descriptor_set_layouts_single_transient_{};\n  VkDescriptorSetLayout descriptor_set_layout_shared_memory_and_edram_ =\n      VK_NULL_HANDLE;\n\n  // Descriptor set layouts are referenced by pipeline_layouts_.\n  std::unordered_map<TextureDescriptorSetLayoutKey, VkDescriptorSetLayout,\n                     TextureDescriptorSetLayoutKey::Hasher>\n      descriptor_set_layouts_textures_;\n  // Pipeline layouts are referenced by VulkanPipelineCache.\n  std::unordered_map<PipelineLayoutKey, PipelineLayout,\n                     PipelineLayoutKey::Hasher>\n      pipeline_layouts_;\n\n  // No specific reason for 32768, just the \"too much\" descriptor count from\n  // Direct3D 12 PIX warnings.\n  static constexpr uint32_t kLinkedTypeDescriptorPoolSetCount = 32768;\n  static const VkDescriptorPoolSize kDescriptorPoolSizeUniformBuffer;\n  static const VkDescriptorPoolSize kDescriptorPoolSizeStorageBuffer;\n  static const VkDescriptorPoolSize kDescriptorPoolSizeTextures[2];\n  ui::vulkan::LinkedTypeDescriptorSetAllocator\n      transient_descriptor_allocator_uniform_buffer_;\n  ui::vulkan::LinkedTypeDescriptorSetAllocator\n      transient_descriptor_allocator_storage_buffer_;\n  std::deque<UsedSingleTransientDescriptor> single_transient_descriptors_used_;\n  std::array<std::vector<VkDescriptorSet>,\n             size_t(SingleTransientDescriptorLayout::kCount)>\n      single_transient_descriptors_free_;\n  // <Usage frame, set>.\n  std::deque<std::pair<uint64_t, VkDescriptorSet>>\n      constants_transient_descriptors_used_;\n  std::vector<VkDescriptorSet> constants_transient_descriptors_free_;\n\n  ui::vulkan::LinkedTypeDescriptorSetAllocator\n      transient_descriptor_allocator_textures_;\n  std::deque<UsedTextureTransientDescriptorSet>\n      texture_transient_descriptor_sets_used_;\n  std::unordered_map<TextureDescriptorSetLayoutKey,\n                     std::vector<VkDescriptorSet>,\n                     TextureDescriptorSetLayoutKey::Hasher>\n      texture_transient_descriptor_sets_free_;\n\n  std::unique_ptr<VulkanSharedMemory> shared_memory_;\n\n  std::unique_ptr<VulkanPrimitiveProcessor> primitive_processor_;\n\n  std::unique_ptr<VulkanRenderTargetCache> render_target_cache_;\n\n  std::unique_ptr<VulkanPipelineCache> pipeline_cache_;\n\n  std::unique_ptr<VulkanTextureCache> texture_cache_;\n\n  VkDescriptorPool shared_memory_and_edram_descriptor_pool_ = VK_NULL_HANDLE;\n  VkDescriptorSet shared_memory_and_edram_descriptor_set_;\n\n  // Bytes 0x0...0x3FF - 256-entry gamma ramp table with B10G10R10X2 data (read\n  // as R10G10B10X2 with swizzle).\n  // Bytes 0x400...0x9FF - 128-entry PWL R16G16 gamma ramp (R - base, G - delta,\n  // low 6 bits of each are zero, 3 elements per entry).\n  // kMaxFramesInFlight pairs of gamma ramps if in host-visible memory and\n  // uploaded directly, one otherwise.\n  VkDeviceMemory gamma_ramp_buffer_memory_ = VK_NULL_HANDLE;\n  VkBuffer gamma_ramp_buffer_ = VK_NULL_HANDLE;\n  // kMaxFramesInFlight pairs, only when the gamma ramp buffer is not\n  // host-visible.\n  VkDeviceMemory gamma_ramp_upload_buffer_memory_ = VK_NULL_HANDLE;\n  VkBuffer gamma_ramp_upload_buffer_ = VK_NULL_HANDLE;\n  VkDeviceSize gamma_ramp_upload_memory_size_;\n  uint32_t gamma_ramp_upload_memory_type_;\n  // Mapping of either gamma_ramp_buffer_memory_ (if it's host-visible) or\n  // gamma_ramp_upload_buffer_memory_ (otherwise).\n  void* gamma_ramp_upload_mapping_;\n  std::array<VkBufferView, 2 * kMaxFramesInFlight> gamma_ramp_buffer_views_{};\n  // UINT32_MAX if outdated.\n  uint32_t gamma_ramp_256_entry_table_current_frame_ = UINT32_MAX;\n  uint32_t gamma_ramp_pwl_current_frame_ = UINT32_MAX;\n\n  VkDescriptorSetLayout swap_descriptor_set_layout_sampled_image_ =\n      VK_NULL_HANDLE;\n  VkDescriptorSetLayout swap_descriptor_set_layout_uniform_texel_buffer_ =\n      VK_NULL_HANDLE;\n\n  // Descriptor pool for allocating descriptors needed for presentation, such as\n  // the destination images and the gamma ramps.\n  VkDescriptorPool swap_descriptor_pool_ = VK_NULL_HANDLE;\n  // Interleaved 256-entry table and PWL texel buffer descriptors.\n  // kMaxFramesInFlight pairs of gamma ramps if in host-visible memory and\n  // uploaded directly, one otherwise.\n  std::array<VkDescriptorSet, 2 * kMaxFramesInFlight>\n      swap_descriptors_gamma_ramp_;\n  // Sampled images.\n  std::array<VkDescriptorSet, kMaxFramesInFlight> swap_descriptors_source_;\n\n  VkPipelineLayout swap_apply_gamma_pipeline_layout_ = VK_NULL_HANDLE;\n  // Has no dependencies on specific pipeline stages on both ends to simplify\n  // use in different scenarios with different pipelines - use explicit barriers\n  // for synchronization.\n  VkRenderPass swap_apply_gamma_render_pass_ = VK_NULL_HANDLE;\n  VkPipeline swap_apply_gamma_256_entry_table_pipeline_ = VK_NULL_HANDLE;\n  VkPipeline swap_apply_gamma_pwl_pipeline_ = VK_NULL_HANDLE;\n\n  std::array<SwapFramebuffer,\n             ui::vulkan::VulkanPresenter::kMaxActiveGuestOutputImageVersions>\n      swap_framebuffers_;\n\n  // Pending pipeline barriers.\n  std::vector<VkBufferMemoryBarrier> pending_barriers_buffer_memory_barriers_;\n  std::vector<VkImageMemoryBarrier> pending_barriers_image_memory_barriers_;\n  struct PendingBarrier {\n    VkPipelineStageFlags src_stage_mask = 0;\n    VkPipelineStageFlags dst_stage_mask = 0;\n    size_t buffer_memory_barriers_offset = 0;\n    size_t image_memory_barriers_offset = 0;\n  };\n  std::vector<PendingBarrier> pending_barriers_;\n  PendingBarrier current_pending_barrier_;\n\n  // GPU-local scratch buffer.\n  static constexpr VkDeviceSize kScratchBufferSizeIncrement = 16 * 1024 * 1024;\n  VkDeviceMemory scratch_buffer_memory_ = VK_NULL_HANDLE;\n  VkBuffer scratch_buffer_ = VK_NULL_HANDLE;\n  VkDeviceSize scratch_buffer_size_ = 0;\n  VkPipelineStageFlags scratch_buffer_last_stage_mask_ = 0;\n  VkAccessFlags scratch_buffer_last_access_mask_ = 0;\n  uint64_t scratch_buffer_last_usage_submission_ = 0;\n  bool scratch_buffer_used_ = false;\n\n  // The current dynamic state of the graphics pipeline bind point. Note that\n  // binding any pipeline to the bind point with static state (even if it's\n  // unused, like depth bias being disabled, but the values themselves still not\n  // declared as dynamic in the pipeline) invalidates such dynamic state.\n  VkViewport dynamic_viewport_;\n  VkRect2D dynamic_scissor_;\n  // Dynamic fixed-function depth bias, blend constants, stencil state are\n  // applicable only to the render target implementations where they are\n  // actually involved.\n  float dynamic_depth_bias_constant_factor_;\n  float dynamic_depth_bias_slope_factor_;\n  float dynamic_blend_constants_[4];\n  // The stencil values are pre-initialized (to D3D11_DEFAULT_STENCIL_*, and the\n  // initial values for front and back are the same for portability subset\n  // safety) because they're updated conditionally to avoid changing the back\n  // face values when stencil is disabled and the primitive type is changed\n  // between polygonal and non-polygonal.\n  uint32_t dynamic_stencil_compare_mask_front_ = UINT8_MAX;\n  uint32_t dynamic_stencil_compare_mask_back_ = UINT8_MAX;\n  uint32_t dynamic_stencil_write_mask_front_ = UINT8_MAX;\n  uint32_t dynamic_stencil_write_mask_back_ = UINT8_MAX;\n  uint32_t dynamic_stencil_reference_front_ = 0;\n  uint32_t dynamic_stencil_reference_back_ = 0;\n  bool dynamic_viewport_update_needed_;\n  bool dynamic_scissor_update_needed_;\n  bool dynamic_depth_bias_update_needed_;\n  bool dynamic_blend_constants_update_needed_;\n  bool dynamic_stencil_compare_mask_front_update_needed_;\n  bool dynamic_stencil_compare_mask_back_update_needed_;\n  bool dynamic_stencil_write_mask_front_update_needed_;\n  bool dynamic_stencil_write_mask_back_update_needed_;\n  bool dynamic_stencil_reference_front_update_needed_;\n  bool dynamic_stencil_reference_back_update_needed_;\n\n  // Currently used samplers.\n  std::vector<std::pair<VulkanTextureCache::SamplerParameters, VkSampler>>\n      current_samplers_vertex_;\n  std::vector<std::pair<VulkanTextureCache::SamplerParameters, VkSampler>>\n      current_samplers_pixel_;\n\n  // Cache render pass currently started in the command buffer with the\n  // framebuffer.\n  VkRenderPass current_render_pass_;\n  const VulkanRenderTargetCache::Framebuffer* current_framebuffer_;\n\n  // Currently bound graphics pipeline, either from the pipeline cache (with\n  // potentially deferred creation - current_external_graphics_pipeline_ is\n  // VK_NULL_HANDLE in this case) or a non-Xenos one\n  // (current_guest_graphics_pipeline_ is VK_NULL_HANDLE in this case).\n  // TODO(Triang3l): Change to a deferred compilation handle.\n  VkPipeline current_guest_graphics_pipeline_;\n  VkPipeline current_external_graphics_pipeline_;\n  VkPipeline current_external_compute_pipeline_;\n\n  // Pipeline layout of the current guest graphics pipeline.\n  const PipelineLayout* current_guest_graphics_pipeline_layout_;\n  VkDescriptorBufferInfo current_constant_buffer_infos_\n      [SpirvShaderTranslator::kConstantBufferCount];\n  // Whether up-to-date data has been written to constant (uniform) buffers, and\n  // the buffer infos in current_constant_buffer_infos_ point to them.\n  uint32_t current_constant_buffers_up_to_date_;\n  VkDescriptorSet current_graphics_descriptor_sets_\n      [SpirvShaderTranslator::kDescriptorSetCount];\n  // Whether descriptor sets in current_graphics_descriptor_sets_ point to\n  // up-to-date data.\n  uint32_t current_graphics_descriptor_set_values_up_to_date_;\n  // Whether the descriptor sets currently bound to the command buffer - only\n  // low bits for the descriptor set layouts that remained the same are kept\n  // when changing the pipeline layout. May be out of sync with\n  // current_graphics_descriptor_set_values_up_to_date_, but should be ensured\n  // to be a subset of it at some point when it becomes important; bits for\n  // non-existent descriptor set layouts may also be set, but need to be ignored\n  // when they start to matter.\n  uint32_t current_graphics_descriptor_sets_bound_up_to_date_;\n  static_assert(\n      SpirvShaderTranslator::kDescriptorSetCount <=\n          sizeof(current_graphics_descriptor_set_values_up_to_date_) * CHAR_BIT,\n      \"Bit fields storing descriptor set validity must be large enough\");\n  static_assert(\n      SpirvShaderTranslator::kDescriptorSetCount <=\n          sizeof(current_graphics_descriptor_sets_bound_up_to_date_) * CHAR_BIT,\n      \"Bit fields storing descriptor set validity must be large enough\");\n\n  // Float constant usage masks of the last draw call.\n  uint64_t current_float_constant_map_vertex_[4];\n  uint64_t current_float_constant_map_pixel_[4];\n\n  // System shader constants.\n  SpirvShaderTranslator::SystemConstants system_constants_;\n\n  // Temporary storage for memexport stream constants used in the draw.\n  std::vector<draw_util::MemExportRange> memexport_ranges_;\n};\n\n}  // namespace vulkan\n}  // namespace gpu\n}  // namespace xe\n\n#endif  // XENIA_GPU_VULKAN_VULKAN_COMMAND_PROCESSOR_H_\n"
  },
  {
    "path": "src/xenia/gpu/vulkan/vulkan_graphics_system.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/vulkan/vulkan_graphics_system.h\"\n\n#include \"xenia/gpu/vulkan/vulkan_command_processor.h\"\n#include \"xenia/ui/vulkan/vulkan_provider.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace gpu {\nnamespace vulkan {\n\nVulkanGraphicsSystem::VulkanGraphicsSystem() {}\n\nVulkanGraphicsSystem::~VulkanGraphicsSystem() {}\n\nstd::string VulkanGraphicsSystem::name() const {\n  auto vulkan_command_processor =\n      static_cast<VulkanCommandProcessor*>(command_processor());\n  if (vulkan_command_processor != nullptr) {\n    return vulkan_command_processor->GetWindowTitleText();\n  }\n  return \"Vulkan - HEAVILY INCOMPLETE, early development\";\n}\n\nX_STATUS VulkanGraphicsSystem::Setup(cpu::Processor* processor,\n                                     kernel::KernelState* kernel_state,\n                                     ui::WindowedAppContext* app_context,\n                                     bool with_presentation) {\n  provider_ = xe::ui::vulkan::VulkanProvider::Create(true, with_presentation);\n  return GraphicsSystem::Setup(processor, kernel_state, app_context,\n                               with_presentation);\n}\n\nstd::unique_ptr<CommandProcessor>\nVulkanGraphicsSystem::CreateCommandProcessor() {\n  return std::make_unique<VulkanCommandProcessor>(this, kernel_state_);\n}\n\n}  // namespace vulkan\n}  // namespace gpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/vulkan/vulkan_graphics_system.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_VULKAN_VULKAN_GRAPHICS_SYSTEM_H_\n#define XENIA_GPU_VULKAN_VULKAN_GRAPHICS_SYSTEM_H_\n\n#include <memory>\n\n#include \"xenia/gpu/command_processor.h\"\n#include \"xenia/gpu/graphics_system.h\"\n\nnamespace xe {\nnamespace gpu {\nnamespace vulkan {\n\nclass VulkanGraphicsSystem : public GraphicsSystem {\n public:\n  VulkanGraphicsSystem();\n  ~VulkanGraphicsSystem() override;\n\n  static bool IsAvailable() { return true; }\n\n  std::string name() const override;\n\n  X_STATUS Setup(cpu::Processor* processor, kernel::KernelState* kernel_state,\n                 ui::WindowedAppContext* app_context,\n                 bool with_presentation) override;\n\n private:\n  std::unique_ptr<CommandProcessor> CreateCommandProcessor() override;\n};\n\n}  // namespace vulkan\n}  // namespace gpu\n}  // namespace xe\n\n#endif  // XENIA_GPU_VULKAN_VULKAN_GRAPHICS_SYSTEM_H_\n"
  },
  {
    "path": "src/xenia/gpu/vulkan/vulkan_pipeline_cache.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/vulkan/vulkan_pipeline_cache.h\"\n\n#include <algorithm>\n#include <array>\n#include <cstdint>\n#include <cstring>\n#include <memory>\n#include <utility>\n#include <vector>\n\n#include \"third_party/fmt/include/fmt/format.h\"\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/profiling.h\"\n#include \"xenia/base/xxhash.h\"\n#include \"xenia/gpu/draw_util.h\"\n#include \"xenia/gpu/gpu_flags.h\"\n#include \"xenia/gpu/register_file.h\"\n#include \"xenia/gpu/registers.h\"\n#include \"xenia/gpu/spirv_builder.h\"\n#include \"xenia/gpu/spirv_shader_translator.h\"\n#include \"xenia/gpu/vulkan/vulkan_command_processor.h\"\n#include \"xenia/gpu/vulkan/vulkan_shader.h\"\n#include \"xenia/gpu/xenos.h\"\n#include \"xenia/ui/vulkan/vulkan_util.h\"\n\nnamespace xe {\nnamespace gpu {\nnamespace vulkan {\n\nVulkanPipelineCache::VulkanPipelineCache(\n    VulkanCommandProcessor& command_processor,\n    const RegisterFile& register_file,\n    VulkanRenderTargetCache& render_target_cache,\n    VkShaderStageFlags guest_shader_vertex_stages)\n    : command_processor_(command_processor),\n      register_file_(register_file),\n      render_target_cache_(render_target_cache),\n      guest_shader_vertex_stages_(guest_shader_vertex_stages) {}\n\nVulkanPipelineCache::~VulkanPipelineCache() { Shutdown(); }\n\nbool VulkanPipelineCache::Initialize() {\n  const ui::vulkan::VulkanDevice* const vulkan_device =\n      command_processor_.GetVulkanDevice();\n\n  bool edram_fragment_shader_interlock =\n      render_target_cache_.GetPath() ==\n      RenderTargetCache::Path::kPixelShaderInterlock;\n\n  shader_translator_ = std::make_unique<SpirvShaderTranslator>(\n      SpirvShaderTranslator::Features(vulkan_device),\n      render_target_cache_.msaa_2x_attachments_supported(),\n      render_target_cache_.msaa_2x_no_attachments_supported(),\n      edram_fragment_shader_interlock);\n\n  if (edram_fragment_shader_interlock) {\n    std::vector<uint8_t> depth_only_fragment_shader_code =\n        shader_translator_->CreateDepthOnlyFragmentShader();\n    depth_only_fragment_shader_ = ui::vulkan::util::CreateShaderModule(\n        vulkan_device,\n        reinterpret_cast<const uint32_t*>(\n            depth_only_fragment_shader_code.data()),\n        depth_only_fragment_shader_code.size());\n    if (depth_only_fragment_shader_ == VK_NULL_HANDLE) {\n      XELOGE(\n          \"VulkanPipelineCache: Failed to create the depth/stencil-only \"\n          \"fragment shader for the fragment shader interlock render backend \"\n          \"implementation\");\n      return false;\n    }\n  }\n\n  return true;\n}\n\nvoid VulkanPipelineCache::Shutdown() {\n  const ui::vulkan::VulkanDevice* const vulkan_device =\n      command_processor_.GetVulkanDevice();\n  const ui::vulkan::VulkanDevice::Functions& dfn = vulkan_device->functions();\n  const VkDevice device = vulkan_device->device();\n\n  // Destroy all pipelines.\n  last_pipeline_ = nullptr;\n  for (const auto& pipeline_pair : pipelines_) {\n    if (pipeline_pair.second.pipeline != VK_NULL_HANDLE) {\n      dfn.vkDestroyPipeline(device, pipeline_pair.second.pipeline, nullptr);\n    }\n  }\n  pipelines_.clear();\n\n  // Destroy all internal shaders.\n  ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyShaderModule, device,\n                                         depth_only_fragment_shader_);\n  for (const auto& geometry_shader_pair : geometry_shaders_) {\n    if (geometry_shader_pair.second != VK_NULL_HANDLE) {\n      dfn.vkDestroyShaderModule(device, geometry_shader_pair.second, nullptr);\n    }\n  }\n  geometry_shaders_.clear();\n\n  // Destroy all translated shaders.\n  for (auto it : shaders_) {\n    delete it.second;\n  }\n  shaders_.clear();\n  texture_binding_layout_map_.clear();\n  texture_binding_layouts_.clear();\n\n  // Shut down shader translation.\n  shader_translator_.reset();\n}\n\nVulkanShader* VulkanPipelineCache::LoadShader(xenos::ShaderType shader_type,\n                                              const uint32_t* host_address,\n                                              uint32_t dword_count) {\n  // Hash the input memory and lookup the shader.\n  uint64_t data_hash =\n      XXH3_64bits(host_address, dword_count * sizeof(uint32_t));\n  auto it = shaders_.find(data_hash);\n  if (it != shaders_.end()) {\n    // Shader has been previously loaded.\n    return it->second;\n  }\n  // Always create the shader and stash it away.\n  // We need to track it even if it fails translation so we know not to try\n  // again.\n  VulkanShader* shader =\n      new VulkanShader(command_processor_.GetVulkanDevice(), shader_type,\n                       data_hash, host_address, dword_count);\n  shaders_.emplace(data_hash, shader);\n  return shader;\n}\n\nSpirvShaderTranslator::Modification\nVulkanPipelineCache::GetCurrentVertexShaderModification(\n    const Shader& shader, Shader::HostVertexShaderType host_vertex_shader_type,\n    uint32_t interpolator_mask, bool ps_param_gen_used) const {\n  assert_true(shader.type() == xenos::ShaderType::kVertex);\n  assert_true(shader.is_ucode_analyzed());\n  const auto& regs = register_file_;\n\n  auto sq_program_cntl = regs.Get<reg::SQ_PROGRAM_CNTL>();\n\n  SpirvShaderTranslator::Modification modification(\n      shader_translator_->GetDefaultVertexShaderModification(\n          shader.GetDynamicAddressableRegisterCount(\n              regs.Get<reg::SQ_PROGRAM_CNTL>().vs_num_reg),\n          host_vertex_shader_type));\n\n  modification.vertex.interpolator_mask = interpolator_mask;\n\n  if (host_vertex_shader_type ==\n      Shader::HostVertexShaderType::kPointListAsTriangleStrip) {\n    modification.vertex.output_point_parameters = uint32_t(ps_param_gen_used);\n  } else {\n    modification.vertex.output_point_parameters =\n        uint32_t((shader.writes_point_size_edge_flag_kill_vertex() & 0b001) &&\n                 regs.Get<reg::VGT_DRAW_INITIATOR>().prim_type ==\n                     xenos::PrimitiveType::kPointList);\n  }\n\n  return modification;\n}\n\nSpirvShaderTranslator::Modification\nVulkanPipelineCache::GetCurrentPixelShaderModification(\n    const Shader& shader, uint32_t interpolator_mask,\n    uint32_t param_gen_pos) const {\n  assert_true(shader.type() == xenos::ShaderType::kPixel);\n  assert_true(shader.is_ucode_analyzed());\n  const auto& regs = register_file_;\n\n  SpirvShaderTranslator::Modification modification(\n      shader_translator_->GetDefaultPixelShaderModification(\n          shader.GetDynamicAddressableRegisterCount(\n              regs.Get<reg::SQ_PROGRAM_CNTL>().ps_num_reg)));\n\n  modification.pixel.interpolator_mask = interpolator_mask;\n  modification.pixel.interpolators_centroid =\n      interpolator_mask &\n      ~xenos::GetInterpolatorSamplingPattern(\n          regs.Get<reg::RB_SURFACE_INFO>().msaa_samples,\n          regs.Get<reg::SQ_CONTEXT_MISC>().sc_sample_cntl,\n          regs.Get<reg::SQ_INTERPOLATOR_CNTL>().sampling_pattern);\n\n  if (param_gen_pos < xenos::kMaxInterpolators) {\n    modification.pixel.param_gen_enable = 1;\n    modification.pixel.param_gen_interpolator = param_gen_pos;\n    modification.pixel.param_gen_point =\n        uint32_t(regs.Get<reg::VGT_DRAW_INITIATOR>().prim_type ==\n                 xenos::PrimitiveType::kPointList);\n  } else {\n    modification.pixel.param_gen_enable = 0;\n    modification.pixel.param_gen_interpolator = 0;\n    modification.pixel.param_gen_point = 0;\n  }\n\n  if (render_target_cache_.GetPath() ==\n      RenderTargetCache::Path::kHostRenderTargets) {\n    using DepthStencilMode =\n        SpirvShaderTranslator::Modification::DepthStencilMode;\n    if (shader.implicit_early_z_write_allowed() &&\n        (!shader.writes_color_target(0) ||\n         !draw_util::DoesCoverageDependOnAlpha(\n             regs.Get<reg::RB_COLORCONTROL>()))) {\n      modification.pixel.depth_stencil_mode = DepthStencilMode::kEarlyHint;\n    } else {\n      modification.pixel.depth_stencil_mode = DepthStencilMode::kNoModifiers;\n    }\n  }\n\n  return modification;\n}\n\nbool VulkanPipelineCache::EnsureShadersTranslated(\n    VulkanShader::VulkanTranslation* vertex_shader,\n    VulkanShader::VulkanTranslation* pixel_shader) {\n  // Edge flags are not supported yet (because polygon primitives are not).\n  assert_true(register_file_.Get<reg::SQ_PROGRAM_CNTL>().vs_export_mode !=\n                  xenos::VertexShaderExportMode::kPosition2VectorsEdge &&\n              register_file_.Get<reg::SQ_PROGRAM_CNTL>().vs_export_mode !=\n                  xenos::VertexShaderExportMode::kPosition2VectorsEdgeKill);\n  assert_false(register_file_.Get<reg::SQ_PROGRAM_CNTL>().gen_index_vtx);\n  if (!vertex_shader->is_translated()) {\n    vertex_shader->shader().AnalyzeUcode(ucode_disasm_buffer_);\n    if (!TranslateAnalyzedShader(*shader_translator_, *vertex_shader)) {\n      XELOGE(\"Failed to translate the vertex shader!\");\n      return false;\n    }\n  }\n  if (!vertex_shader->is_valid()) {\n    // Translation attempted previously, but not valid.\n    return false;\n  }\n  if (pixel_shader != nullptr) {\n    if (!pixel_shader->is_translated()) {\n      pixel_shader->shader().AnalyzeUcode(ucode_disasm_buffer_);\n      if (!TranslateAnalyzedShader(*shader_translator_, *pixel_shader)) {\n        XELOGE(\"Failed to translate the pixel shader!\");\n        return false;\n      }\n    }\n    if (!pixel_shader->is_valid()) {\n      // Translation attempted previously, but not valid.\n      return false;\n    }\n  }\n  return true;\n}\n\nbool VulkanPipelineCache::ConfigurePipeline(\n    VulkanShader::VulkanTranslation* vertex_shader,\n    VulkanShader::VulkanTranslation* pixel_shader,\n    const PrimitiveProcessor::ProcessingResult& primitive_processing_result,\n    reg::RB_DEPTHCONTROL normalized_depth_control,\n    uint32_t normalized_color_mask,\n    VulkanRenderTargetCache::RenderPassKey render_pass_key,\n    VkPipeline& pipeline_out,\n    const PipelineLayoutProvider*& pipeline_layout_out) {\n#if XE_GPU_FINE_GRAINED_DRAW_SCOPES\n  SCOPE_profile_cpu_f(\"gpu\");\n#endif  // XE_GPU_FINE_GRAINED_DRAW_SCOPES\n\n  // Ensure shaders are translated - needed now for GetCurrentStateDescription.\n  if (!EnsureShadersTranslated(vertex_shader, pixel_shader)) {\n    return false;\n  }\n\n  PipelineDescription description;\n  if (!GetCurrentStateDescription(\n          vertex_shader, pixel_shader, primitive_processing_result,\n          normalized_depth_control, normalized_color_mask, render_pass_key,\n          description)) {\n    return false;\n  }\n  if (last_pipeline_ && last_pipeline_->first == description) {\n    pipeline_out = last_pipeline_->second.pipeline;\n    pipeline_layout_out = last_pipeline_->second.pipeline_layout;\n    return true;\n  }\n  auto it = pipelines_.find(description);\n  if (it != pipelines_.end()) {\n    last_pipeline_ = &*it;\n    pipeline_out = it->second.pipeline;\n    pipeline_layout_out = it->second.pipeline_layout;\n    return true;\n  }\n\n  // Create the pipeline if not the latest and not already existing.\n  const PipelineLayoutProvider* pipeline_layout =\n      command_processor_.GetPipelineLayout(\n          pixel_shader\n              ? static_cast<const VulkanShader&>(pixel_shader->shader())\n                    .GetTextureBindingsAfterTranslation()\n                    .size()\n              : 0,\n          pixel_shader\n              ? static_cast<const VulkanShader&>(pixel_shader->shader())\n                    .GetSamplerBindingsAfterTranslation()\n                    .size()\n              : 0,\n          static_cast<const VulkanShader&>(vertex_shader->shader())\n              .GetTextureBindingsAfterTranslation()\n              .size(),\n          static_cast<const VulkanShader&>(vertex_shader->shader())\n              .GetSamplerBindingsAfterTranslation()\n              .size());\n  if (!pipeline_layout) {\n    return false;\n  }\n  VkShaderModule geometry_shader = VK_NULL_HANDLE;\n  GeometryShaderKey geometry_shader_key;\n  if (GetGeometryShaderKey(\n          description.geometry_shader,\n          SpirvShaderTranslator::Modification(vertex_shader->modification()),\n          SpirvShaderTranslator::Modification(\n              pixel_shader ? pixel_shader->modification() : 0),\n          geometry_shader_key)) {\n    geometry_shader = GetGeometryShader(geometry_shader_key);\n    if (geometry_shader == VK_NULL_HANDLE) {\n      return false;\n    }\n  }\n  VkRenderPass render_pass =\n      render_target_cache_.GetPath() ==\n              RenderTargetCache::Path::kPixelShaderInterlock\n          ? render_target_cache_.GetFragmentShaderInterlockRenderPass()\n          : render_target_cache_.GetHostRenderTargetsRenderPass(\n                render_pass_key);\n  if (render_pass == VK_NULL_HANDLE) {\n    return false;\n  }\n  PipelineCreationArguments creation_arguments;\n  auto& pipeline =\n      *pipelines_.emplace(description, Pipeline(pipeline_layout)).first;\n  creation_arguments.pipeline = &pipeline;\n  creation_arguments.vertex_shader = vertex_shader;\n  creation_arguments.pixel_shader = pixel_shader;\n  creation_arguments.geometry_shader = geometry_shader;\n  creation_arguments.render_pass = render_pass;\n  if (!EnsurePipelineCreated(creation_arguments)) {\n    return false;\n  }\n  pipeline_out = pipeline.second.pipeline;\n  pipeline_layout_out = pipeline_layout;\n  return true;\n}\n\nbool VulkanPipelineCache::TranslateAnalyzedShader(\n    SpirvShaderTranslator& translator,\n    VulkanShader::VulkanTranslation& translation) {\n  VulkanShader& shader = static_cast<VulkanShader&>(translation.shader());\n\n  // Perform translation.\n  // If this fails the shader will be marked as invalid and ignored later.\n  if (!translator.TranslateAnalyzedShader(translation)) {\n    XELOGE(\"Shader {:016X} translation failed; marking as ignored\",\n           shader.ucode_data_hash());\n    return false;\n  }\n  if (translation.GetOrCreateShaderModule() == VK_NULL_HANDLE) {\n    return false;\n  }\n\n  // TODO(Triang3l): Log that the shader has been successfully translated in\n  // common code.\n\n  // Set up the texture binding layout.\n  if (shader.EnterBindingLayoutUserUIDSetup()) {\n    // Obtain the unique IDs of the binding layout if there are any texture\n    // bindings, for invalidation in the command processor.\n    size_t texture_binding_layout_uid = kLayoutUIDEmpty;\n    const std::vector<VulkanShader::TextureBinding>& texture_bindings =\n        shader.GetTextureBindingsAfterTranslation();\n    size_t texture_binding_count = texture_bindings.size();\n    if (texture_binding_count) {\n      size_t texture_binding_layout_bytes =\n          texture_binding_count * sizeof(*texture_bindings.data());\n      uint64_t texture_binding_layout_hash =\n          XXH3_64bits(texture_bindings.data(), texture_binding_layout_bytes);\n      auto found_range =\n          texture_binding_layout_map_.equal_range(texture_binding_layout_hash);\n      for (auto it = found_range.first; it != found_range.second; ++it) {\n        if (it->second.vector_span_length == texture_binding_count &&\n            !std::memcmp(\n                texture_binding_layouts_.data() + it->second.vector_span_offset,\n                texture_bindings.data(), texture_binding_layout_bytes)) {\n          texture_binding_layout_uid = it->second.uid;\n          break;\n        }\n      }\n      if (texture_binding_layout_uid == kLayoutUIDEmpty) {\n        static_assert(\n            kLayoutUIDEmpty == 0,\n            \"Layout UID is size + 1 because it's assumed that 0 is the UID for \"\n            \"an empty layout\");\n        texture_binding_layout_uid = texture_binding_layout_map_.size() + 1;\n        LayoutUID new_uid;\n        new_uid.uid = texture_binding_layout_uid;\n        new_uid.vector_span_offset = texture_binding_layouts_.size();\n        new_uid.vector_span_length = texture_binding_count;\n        texture_binding_layouts_.resize(new_uid.vector_span_offset +\n                                        texture_binding_count);\n        std::memcpy(\n            texture_binding_layouts_.data() + new_uid.vector_span_offset,\n            texture_bindings.data(), texture_binding_layout_bytes);\n        texture_binding_layout_map_.emplace(texture_binding_layout_hash,\n                                            new_uid);\n      }\n    }\n    shader.SetTextureBindingLayoutUserUID(texture_binding_layout_uid);\n\n    // Use the sampler count for samplers because it's the only thing that must\n    // be the same for layouts to be compatible in this case\n    // (instruction-specified parameters are used as overrides for creating\n    // actual samplers).\n    static_assert(\n        kLayoutUIDEmpty == 0,\n        \"Empty layout UID is assumed to be 0 because for bindful samplers, the \"\n        \"UID is their count\");\n    shader.SetSamplerBindingLayoutUserUID(\n        shader.GetSamplerBindingsAfterTranslation().size());\n  }\n\n  return true;\n}\n\nvoid VulkanPipelineCache::WritePipelineRenderTargetDescription(\n    reg::RB_BLENDCONTROL blend_control, uint32_t write_mask,\n    PipelineRenderTarget& render_target_out) const {\n  if (write_mask) {\n    assert_zero(write_mask & ~uint32_t(0b1111));\n    // 32 because of 0x1F mask, for safety (all unknown to zero).\n    static const PipelineBlendFactor kBlendFactorMap[32] = {\n        /*  0 */ PipelineBlendFactor::kZero,\n        /*  1 */ PipelineBlendFactor::kOne,\n        /*  2 */ PipelineBlendFactor::kZero,  // ?\n        /*  3 */ PipelineBlendFactor::kZero,  // ?\n        /*  4 */ PipelineBlendFactor::kSrcColor,\n        /*  5 */ PipelineBlendFactor::kOneMinusSrcColor,\n        /*  6 */ PipelineBlendFactor::kSrcAlpha,\n        /*  7 */ PipelineBlendFactor::kOneMinusSrcAlpha,\n        /*  8 */ PipelineBlendFactor::kDstColor,\n        /*  9 */ PipelineBlendFactor::kOneMinusDstColor,\n        /* 10 */ PipelineBlendFactor::kDstAlpha,\n        /* 11 */ PipelineBlendFactor::kOneMinusDstAlpha,\n        /* 12 */ PipelineBlendFactor::kConstantColor,\n        /* 13 */ PipelineBlendFactor::kOneMinusConstantColor,\n        /* 14 */ PipelineBlendFactor::kConstantAlpha,\n        /* 15 */ PipelineBlendFactor::kOneMinusConstantAlpha,\n        /* 16 */ PipelineBlendFactor::kSrcAlphaSaturate,\n    };\n    render_target_out.src_color_blend_factor =\n        kBlendFactorMap[uint32_t(blend_control.color_srcblend)];\n    render_target_out.dst_color_blend_factor =\n        kBlendFactorMap[uint32_t(blend_control.color_destblend)];\n    render_target_out.color_blend_op = blend_control.color_comb_fcn;\n    render_target_out.src_alpha_blend_factor =\n        kBlendFactorMap[uint32_t(blend_control.alpha_srcblend)];\n    render_target_out.dst_alpha_blend_factor =\n        kBlendFactorMap[uint32_t(blend_control.alpha_destblend)];\n    render_target_out.alpha_blend_op = blend_control.alpha_comb_fcn;\n    if (!command_processor_.GetVulkanDevice()\n             ->properties()\n             .constantAlphaColorBlendFactors) {\n      if (blend_control.color_srcblend == xenos::BlendFactor::kConstantAlpha) {\n        render_target_out.src_color_blend_factor =\n            PipelineBlendFactor::kConstantColor;\n      } else if (blend_control.color_srcblend ==\n                 xenos::BlendFactor::kOneMinusConstantAlpha) {\n        render_target_out.src_color_blend_factor =\n            PipelineBlendFactor::kOneMinusConstantColor;\n      }\n      if (blend_control.color_destblend == xenos::BlendFactor::kConstantAlpha) {\n        render_target_out.dst_color_blend_factor =\n            PipelineBlendFactor::kConstantColor;\n      } else if (blend_control.color_destblend ==\n                 xenos::BlendFactor::kOneMinusConstantAlpha) {\n        render_target_out.dst_color_blend_factor =\n            PipelineBlendFactor::kOneMinusConstantColor;\n      }\n    }\n  } else {\n    render_target_out.src_color_blend_factor = PipelineBlendFactor::kOne;\n    render_target_out.dst_color_blend_factor = PipelineBlendFactor::kZero;\n    render_target_out.color_blend_op = xenos::BlendOp::kAdd;\n    render_target_out.src_alpha_blend_factor = PipelineBlendFactor::kOne;\n    render_target_out.dst_alpha_blend_factor = PipelineBlendFactor::kZero;\n    render_target_out.alpha_blend_op = xenos::BlendOp::kAdd;\n  }\n  render_target_out.color_write_mask = write_mask;\n}\n\nbool VulkanPipelineCache::GetCurrentStateDescription(\n    const VulkanShader::VulkanTranslation* vertex_shader,\n    const VulkanShader::VulkanTranslation* pixel_shader,\n    const PrimitiveProcessor::ProcessingResult& primitive_processing_result,\n    reg::RB_DEPTHCONTROL normalized_depth_control,\n    uint32_t normalized_color_mask,\n    VulkanRenderTargetCache::RenderPassKey render_pass_key,\n    PipelineDescription& description_out) const {\n  description_out.Reset();\n\n  const ui::vulkan::VulkanDevice::Properties& device_properties =\n      command_processor_.GetVulkanDevice()->properties();\n\n  const RegisterFile& regs = register_file_;\n  auto pa_su_sc_mode_cntl = regs.Get<reg::PA_SU_SC_MODE_CNTL>();\n\n  description_out.vertex_shader_hash =\n      vertex_shader->shader().ucode_data_hash();\n  description_out.vertex_shader_modification = vertex_shader->modification();\n  if (pixel_shader) {\n    description_out.pixel_shader_hash =\n        pixel_shader->shader().ucode_data_hash();\n    description_out.pixel_shader_modification = pixel_shader->modification();\n  }\n  description_out.render_pass_key = render_pass_key;\n\n  // TODO(Triang3l): Implement primitive types currently using geometry shaders\n  // without them.\n  PipelineGeometryShader geometry_shader = PipelineGeometryShader::kNone;\n  PipelinePrimitiveTopology primitive_topology;\n  switch (primitive_processing_result.host_primitive_type) {\n    case xenos::PrimitiveType::kPointList:\n      geometry_shader = PipelineGeometryShader::kPointList;\n      primitive_topology = PipelinePrimitiveTopology::kPointList;\n      break;\n    case xenos::PrimitiveType::kLineList:\n      primitive_topology = PipelinePrimitiveTopology::kLineList;\n      break;\n    case xenos::PrimitiveType::kLineStrip:\n      primitive_topology = PipelinePrimitiveTopology::kLineStrip;\n      break;\n    case xenos::PrimitiveType::kTriangleList:\n      primitive_topology = PipelinePrimitiveTopology::kTriangleList;\n      break;\n    case xenos::PrimitiveType::kTriangleFan:\n      // The check should be performed at primitive processing time.\n      assert_true(device_properties.triangleFans);\n      primitive_topology = PipelinePrimitiveTopology::kTriangleFan;\n      break;\n    case xenos::PrimitiveType::kTriangleStrip:\n      primitive_topology = PipelinePrimitiveTopology::kTriangleStrip;\n      break;\n    case xenos::PrimitiveType::kRectangleList:\n      geometry_shader = PipelineGeometryShader::kRectangleList;\n      primitive_topology = PipelinePrimitiveTopology::kTriangleList;\n      break;\n    case xenos::PrimitiveType::kQuadList:\n      geometry_shader = PipelineGeometryShader::kQuadList;\n      primitive_topology = PipelinePrimitiveTopology::kLineListWithAdjacency;\n      break;\n    default:\n      // TODO(Triang3l): All primitive types and tessellation.\n      return false;\n  }\n  description_out.geometry_shader = geometry_shader;\n  description_out.primitive_topology = primitive_topology;\n  description_out.primitive_restart =\n      primitive_processing_result.host_primitive_reset_enabled;\n\n  description_out.depth_clamp_enable =\n      device_properties.depthClamp &&\n      regs.Get<reg::PA_CL_CLIP_CNTL>().clip_disable;\n\n  // TODO(Triang3l): Tessellation.\n  bool primitive_polygonal = draw_util::IsPrimitivePolygonal(regs);\n  if (primitive_polygonal) {\n    // Vulkan only allows the polygon mode to be set for both faces - pick the\n    // most special one (more likely to represent the developer's deliberate\n    // intentions - fill is very generic, wireframe is common in debug, points\n    // are for pretty unusual things, but closer to debug purposes too - on the\n    // Xenos, points have the lowest register value and triangles have the\n    // highest) based on which faces are not culled.\n    bool cull_front = pa_su_sc_mode_cntl.cull_front;\n    bool cull_back = pa_su_sc_mode_cntl.cull_back;\n    description_out.cull_front = cull_front;\n    description_out.cull_back = cull_back;\n    if (device_properties.fillModeNonSolid) {\n      xenos::PolygonType polygon_type = xenos::PolygonType::kTriangles;\n      if (!cull_front) {\n        polygon_type =\n            std::min(polygon_type, pa_su_sc_mode_cntl.polymode_front_ptype);\n      }\n      if (!cull_back) {\n        polygon_type =\n            std::min(polygon_type, pa_su_sc_mode_cntl.polymode_back_ptype);\n      }\n      if (pa_su_sc_mode_cntl.poly_mode != xenos::PolygonModeEnable::kDualMode) {\n        polygon_type = xenos::PolygonType::kTriangles;\n      }\n      switch (polygon_type) {\n        case xenos::PolygonType::kPoints:\n          // When points are not supported, use lines instead, preserving\n          // debug-like purpose.\n          description_out.polygon_mode = device_properties.pointPolygons\n                                             ? PipelinePolygonMode::kPoint\n                                             : PipelinePolygonMode::kLine;\n          break;\n        case xenos::PolygonType::kLines:\n          description_out.polygon_mode = PipelinePolygonMode::kLine;\n          break;\n        case xenos::PolygonType::kTriangles:\n          description_out.polygon_mode = PipelinePolygonMode::kFill;\n          break;\n        default:\n          assert_unhandled_case(polygon_type);\n          return false;\n      }\n    } else {\n      description_out.polygon_mode = PipelinePolygonMode::kFill;\n    }\n    description_out.front_face_clockwise = pa_su_sc_mode_cntl.face != 0;\n  } else {\n    description_out.polygon_mode = PipelinePolygonMode::kFill;\n  }\n\n  if (render_target_cache_.GetPath() ==\n      RenderTargetCache::Path::kHostRenderTargets) {\n    if (render_pass_key.depth_and_color_used & 1) {\n      if (normalized_depth_control.z_enable) {\n        description_out.depth_write_enable =\n            normalized_depth_control.z_write_enable;\n        description_out.depth_compare_op = normalized_depth_control.zfunc;\n      } else {\n        description_out.depth_compare_op = xenos::CompareFunction::kAlways;\n      }\n      if (normalized_depth_control.stencil_enable) {\n        description_out.stencil_test_enable = 1;\n        description_out.stencil_front_fail_op =\n            normalized_depth_control.stencilfail;\n        description_out.stencil_front_pass_op =\n            normalized_depth_control.stencilzpass;\n        description_out.stencil_front_depth_fail_op =\n            normalized_depth_control.stencilzfail;\n        description_out.stencil_front_compare_op =\n            normalized_depth_control.stencilfunc;\n        if (primitive_polygonal && normalized_depth_control.backface_enable) {\n          description_out.stencil_back_fail_op =\n              normalized_depth_control.stencilfail_bf;\n          description_out.stencil_back_pass_op =\n              normalized_depth_control.stencilzpass_bf;\n          description_out.stencil_back_depth_fail_op =\n              normalized_depth_control.stencilzfail_bf;\n          description_out.stencil_back_compare_op =\n              normalized_depth_control.stencilfunc_bf;\n        } else {\n          description_out.stencil_back_fail_op =\n              description_out.stencil_front_fail_op;\n          description_out.stencil_back_pass_op =\n              description_out.stencil_front_pass_op;\n          description_out.stencil_back_depth_fail_op =\n              description_out.stencil_front_depth_fail_op;\n          description_out.stencil_back_compare_op =\n              description_out.stencil_front_compare_op;\n        }\n      }\n    }\n\n    // Color blending and write masks (filled only for the attachments present\n    // in the render pass object).\n    uint32_t render_pass_color_rts = render_pass_key.depth_and_color_used >> 1;\n    assert_true(device_properties.independentBlend);\n    uint32_t render_pass_color_rts_remaining = render_pass_color_rts;\n    uint32_t color_rt_index;\n    while (xe::bit_scan_forward(render_pass_color_rts_remaining,\n                                &color_rt_index)) {\n      render_pass_color_rts_remaining &= ~(uint32_t(1) << color_rt_index);\n      WritePipelineRenderTargetDescription(\n          regs.Get<reg::RB_BLENDCONTROL>(\n              reg::RB_BLENDCONTROL::rt_register_indices[color_rt_index]),\n          (normalized_color_mask >> (color_rt_index * 4)) & 0b1111,\n          description_out.render_targets[color_rt_index]);\n    }\n  }\n\n  return true;\n}\n\nbool VulkanPipelineCache::ArePipelineRequirementsMet(\n    const PipelineDescription& description) const {\n  VkShaderStageFlags vertex_shader_stage =\n      Shader::IsHostVertexShaderTypeDomain(\n          SpirvShaderTranslator::Modification(\n              description.vertex_shader_modification)\n              .vertex.host_vertex_shader_type)\n          ? VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT\n          : VK_SHADER_STAGE_VERTEX_BIT;\n  if (!(guest_shader_vertex_stages_ & vertex_shader_stage)) {\n    return false;\n  }\n\n  const ui::vulkan::VulkanDevice::Properties& device_properties =\n      command_processor_.GetVulkanDevice()->properties();\n\n  if (!device_properties.geometryShader &&\n      description.geometry_shader != PipelineGeometryShader::kNone) {\n    return false;\n  }\n\n  if (!device_properties.triangleFans &&\n      description.primitive_topology ==\n          PipelinePrimitiveTopology::kTriangleFan) {\n    return false;\n  }\n\n  if (!device_properties.depthClamp && description.depth_clamp_enable) {\n    return false;\n  }\n\n  if (!device_properties.pointPolygons &&\n      description.polygon_mode == PipelinePolygonMode::kPoint) {\n    return false;\n  }\n\n  if (!device_properties.fillModeNonSolid &&\n      description.polygon_mode != PipelinePolygonMode::kFill) {\n    return false;\n  }\n\n  assert_true(device_properties.independentBlend);\n\n  if (!device_properties.constantAlphaColorBlendFactors) {\n    uint32_t color_rts_remaining =\n        description.render_pass_key.depth_and_color_used >> 1;\n    uint32_t color_rt_index;\n    while (xe::bit_scan_forward(color_rts_remaining, &color_rt_index)) {\n      color_rts_remaining &= ~(uint32_t(1) << color_rt_index);\n      const PipelineRenderTarget& color_rt =\n          description.render_targets[color_rt_index];\n      if (color_rt.src_color_blend_factor ==\n              PipelineBlendFactor::kConstantAlpha ||\n          color_rt.src_color_blend_factor ==\n              PipelineBlendFactor::kOneMinusConstantAlpha ||\n          color_rt.dst_color_blend_factor ==\n              PipelineBlendFactor::kConstantAlpha ||\n          color_rt.dst_color_blend_factor ==\n              PipelineBlendFactor::kOneMinusConstantAlpha) {\n        return false;\n      }\n    }\n  }\n\n  return true;\n}\n\nbool VulkanPipelineCache::GetGeometryShaderKey(\n    PipelineGeometryShader geometry_shader_type,\n    SpirvShaderTranslator::Modification vertex_shader_modification,\n    SpirvShaderTranslator::Modification pixel_shader_modification,\n    GeometryShaderKey& key_out) {\n  if (geometry_shader_type == PipelineGeometryShader::kNone) {\n    return false;\n  }\n  // For kPointListAsTriangleStrip, output_point_parameters has a different\n  // meaning (the coordinates, not the size). However, the AsTriangleStrip host\n  // vertex shader types are needed specifically when geometry shaders are not\n  // supported as fallbacks.\n  if (vertex_shader_modification.vertex.host_vertex_shader_type ==\n          Shader::HostVertexShaderType::kPointListAsTriangleStrip ||\n      vertex_shader_modification.vertex.host_vertex_shader_type ==\n          Shader::HostVertexShaderType::kRectangleListAsTriangleStrip) {\n    assert_always();\n    return false;\n  }\n  GeometryShaderKey key;\n  key.type = geometry_shader_type;\n  // TODO(Triang3l): Once all needed inputs and outputs are added, uncomment the\n  // real counts here.\n  key.interpolator_count =\n      xe::bit_count(vertex_shader_modification.vertex.interpolator_mask);\n  key.user_clip_plane_count =\n      /* vertex_shader_modification.vertex.user_clip_plane_count */ 0;\n  key.user_clip_plane_cull =\n      /* vertex_shader_modification.vertex.user_clip_plane_cull */ 0;\n  key.has_vertex_kill_and =\n      /* vertex_shader_modification.vertex.vertex_kill_and */ 0;\n  key.has_point_size =\n      vertex_shader_modification.vertex.output_point_parameters;\n  key.has_point_coordinates = pixel_shader_modification.pixel.param_gen_point;\n  key_out = key;\n  return true;\n}\n\nVkShaderModule VulkanPipelineCache::GetGeometryShader(GeometryShaderKey key) {\n  auto it = geometry_shaders_.find(key);\n  if (it != geometry_shaders_.end()) {\n    return it->second;\n  }\n\n  std::vector<spv::Id> id_vector_temp;\n  std::vector<unsigned int> uint_vector_temp;\n\n  spv::ExecutionMode input_primitive_execution_mode = spv::ExecutionMode(0);\n  uint32_t input_primitive_vertex_count = 0;\n  spv::ExecutionMode output_primitive_execution_mode = spv::ExecutionMode(0);\n  uint32_t output_max_vertices = 0;\n  switch (key.type) {\n    case PipelineGeometryShader::kPointList:\n      // Point to a strip of 2 triangles.\n      input_primitive_execution_mode = spv::ExecutionModeInputPoints;\n      input_primitive_vertex_count = 1;\n      output_primitive_execution_mode = spv::ExecutionModeOutputTriangleStrip;\n      output_max_vertices = 4;\n      break;\n    case PipelineGeometryShader::kRectangleList:\n      // Triangle to a strip of 2 triangles.\n      input_primitive_execution_mode = spv::ExecutionModeTriangles;\n      input_primitive_vertex_count = 3;\n      output_primitive_execution_mode = spv::ExecutionModeOutputTriangleStrip;\n      output_max_vertices = 4;\n      break;\n    case PipelineGeometryShader::kQuadList:\n      // 4 vertices passed via a line list with adjacency to a strip of 2\n      // triangles.\n      input_primitive_execution_mode = spv::ExecutionModeInputLinesAdjacency;\n      input_primitive_vertex_count = 4;\n      output_primitive_execution_mode = spv::ExecutionModeOutputTriangleStrip;\n      output_max_vertices = 4;\n      break;\n    default:\n      assert_unhandled_case(key.type);\n  }\n\n  uint32_t clip_distance_count =\n      key.user_clip_plane_cull ? 0 : key.user_clip_plane_count;\n  uint32_t cull_distance_count =\n      (key.user_clip_plane_cull ? key.user_clip_plane_count : 0) +\n      key.has_vertex_kill_and;\n\n  SpirvBuilder builder(spv::Spv_1_0,\n                       (SpirvShaderTranslator::kSpirvMagicToolId << 16) | 1,\n                       nullptr);\n  spv::Id ext_inst_glsl_std_450 = builder.import(\"GLSL.std.450\");\n  builder.addCapability(spv::CapabilityGeometry);\n  if (clip_distance_count) {\n    builder.addCapability(spv::CapabilityClipDistance);\n  }\n  if (cull_distance_count) {\n    builder.addCapability(spv::CapabilityCullDistance);\n  }\n  builder.setMemoryModel(spv::AddressingModelLogical, spv::MemoryModelGLSL450);\n  builder.setSource(spv::SourceLanguageUnknown, 0);\n\n  // TODO(Triang3l): Shader float controls (NaN preservation most importantly).\n\n  std::vector<spv::Id> main_interface;\n\n  spv::Id type_void = builder.makeVoidType();\n  spv::Id type_bool = builder.makeBoolType();\n  spv::Id type_bool4 = builder.makeVectorType(type_bool, 4);\n  spv::Id type_int = builder.makeIntType(32);\n  spv::Id type_float = builder.makeFloatType(32);\n  spv::Id type_float2 = builder.makeVectorType(type_float, 2);\n  spv::Id type_float4 = builder.makeVectorType(type_float, 4);\n  spv::Id type_clip_distances =\n      clip_distance_count\n          ? builder.makeArrayType(\n                type_float, builder.makeUintConstant(clip_distance_count), 0)\n          : spv::NoType;\n  spv::Id type_cull_distances =\n      cull_distance_count\n          ? builder.makeArrayType(\n                type_float, builder.makeUintConstant(cull_distance_count), 0)\n          : spv::NoType;\n\n  // System constants.\n  // For points:\n  // - float2 point_constant_diameter\n  // - float2 point_screen_diameter_to_ndc_radius\n  enum PointConstant : uint32_t {\n    kPointConstantConstantDiameter,\n    kPointConstantScreenDiameterToNdcRadius,\n    kPointConstantCount,\n  };\n  spv::Id type_system_constants = spv::NoType;\n  if (key.type == PipelineGeometryShader::kPointList) {\n    id_vector_temp.clear();\n    id_vector_temp.resize(kPointConstantCount);\n    id_vector_temp[kPointConstantConstantDiameter] = type_float2;\n    id_vector_temp[kPointConstantScreenDiameterToNdcRadius] = type_float2;\n    type_system_constants =\n        builder.makeStructType(id_vector_temp, \"XeSystemConstants\");\n    builder.addMemberName(type_system_constants, kPointConstantConstantDiameter,\n                          \"point_constant_diameter\");\n    builder.addMemberDecoration(\n        type_system_constants, kPointConstantConstantDiameter,\n        spv::DecorationOffset,\n        int(offsetof(SpirvShaderTranslator::SystemConstants,\n                     point_constant_diameter)));\n    builder.addMemberName(type_system_constants,\n                          kPointConstantScreenDiameterToNdcRadius,\n                          \"point_screen_diameter_to_ndc_radius\");\n    builder.addMemberDecoration(\n        type_system_constants, kPointConstantScreenDiameterToNdcRadius,\n        spv::DecorationOffset,\n        int(offsetof(SpirvShaderTranslator::SystemConstants,\n                     point_screen_diameter_to_ndc_radius)));\n  }\n  spv::Id uniform_system_constants = spv::NoResult;\n  if (type_system_constants != spv::NoType) {\n    builder.addDecoration(type_system_constants, spv::DecorationBlock);\n    uniform_system_constants = builder.createVariable(\n        spv::NoPrecision, spv::StorageClassUniform, type_system_constants,\n        \"xe_uniform_system_constants\");\n    builder.addDecoration(uniform_system_constants,\n                          spv::DecorationDescriptorSet,\n                          int(SpirvShaderTranslator::kDescriptorSetConstants));\n    builder.addDecoration(uniform_system_constants, spv::DecorationBinding,\n                          int(SpirvShaderTranslator::kConstantBufferSystem));\n    // Generating SPIR-V 1.0, no need to add bindings to the entry point's\n    // interface until SPIR-V 1.4.\n  }\n\n  // Inputs and outputs - matching glslang order, in gl_PerVertex gl_in[],\n  // user-defined outputs, user-defined inputs, out gl_PerVertex.\n  // TODO(Triang3l): Point parameters from the system uniform buffer.\n\n  spv::Id const_input_primitive_vertex_count =\n      builder.makeUintConstant(input_primitive_vertex_count);\n\n  // in gl_PerVertex gl_in[].\n  // gl_Position.\n  id_vector_temp.clear();\n  uint32_t member_in_gl_per_vertex_position = uint32_t(id_vector_temp.size());\n  id_vector_temp.push_back(type_float4);\n  spv::Id const_member_in_gl_per_vertex_position =\n      builder.makeIntConstant(int32_t(member_in_gl_per_vertex_position));\n  // gl_ClipDistance.\n  uint32_t member_in_gl_per_vertex_clip_distance = UINT32_MAX;\n  spv::Id const_member_in_gl_per_vertex_clip_distance = spv::NoResult;\n  if (clip_distance_count) {\n    member_in_gl_per_vertex_clip_distance = uint32_t(id_vector_temp.size());\n    id_vector_temp.push_back(type_clip_distances);\n    const_member_in_gl_per_vertex_clip_distance =\n        builder.makeIntConstant(int32_t(member_in_gl_per_vertex_clip_distance));\n  }\n  // gl_CullDistance.\n  uint32_t member_in_gl_per_vertex_cull_distance = UINT32_MAX;\n  if (cull_distance_count) {\n    member_in_gl_per_vertex_cull_distance = uint32_t(id_vector_temp.size());\n    id_vector_temp.push_back(type_cull_distances);\n  }\n  // Structure and array.\n  spv::Id type_struct_in_gl_per_vertex =\n      builder.makeStructType(id_vector_temp, \"gl_PerVertex\");\n  builder.addMemberName(type_struct_in_gl_per_vertex,\n                        member_in_gl_per_vertex_position, \"gl_Position\");\n  builder.addMemberDecoration(type_struct_in_gl_per_vertex,\n                              member_in_gl_per_vertex_position,\n                              spv::DecorationBuiltIn, spv::BuiltInPosition);\n  if (clip_distance_count) {\n    builder.addMemberName(type_struct_in_gl_per_vertex,\n                          member_in_gl_per_vertex_clip_distance,\n                          \"gl_ClipDistance\");\n    builder.addMemberDecoration(\n        type_struct_in_gl_per_vertex, member_in_gl_per_vertex_clip_distance,\n        spv::DecorationBuiltIn, spv::BuiltInClipDistance);\n  }\n  if (cull_distance_count) {\n    builder.addMemberName(type_struct_in_gl_per_vertex,\n                          member_in_gl_per_vertex_cull_distance,\n                          \"gl_CullDistance\");\n    builder.addMemberDecoration(\n        type_struct_in_gl_per_vertex, member_in_gl_per_vertex_cull_distance,\n        spv::DecorationBuiltIn, spv::BuiltInCullDistance);\n  }\n  builder.addDecoration(type_struct_in_gl_per_vertex, spv::DecorationBlock);\n  spv::Id type_array_in_gl_per_vertex = builder.makeArrayType(\n      type_struct_in_gl_per_vertex, const_input_primitive_vertex_count, 0);\n  spv::Id in_gl_per_vertex =\n      builder.createVariable(spv::NoPrecision, spv::StorageClassInput,\n                             type_array_in_gl_per_vertex, \"gl_in\");\n  main_interface.push_back(in_gl_per_vertex);\n\n  uint32_t output_location = 0;\n\n  // Interpolators outputs.\n  std::array<spv::Id, xenos::kMaxInterpolators> out_interpolators;\n  for (uint32_t i = 0; i < key.interpolator_count; ++i) {\n    spv::Id out_interpolator = builder.createVariable(\n        spv::NoPrecision, spv::StorageClassOutput, type_float4,\n        fmt::format(\"xe_out_interpolator_{}\", i).c_str());\n    out_interpolators[i] = out_interpolator;\n    builder.addDecoration(out_interpolator, spv::DecorationLocation,\n                          int(output_location));\n    builder.addDecoration(out_interpolator, spv::DecorationInvariant);\n    main_interface.push_back(out_interpolator);\n    ++output_location;\n  }\n\n  // Point coordinate output.\n  spv::Id out_point_coordinates = spv::NoResult;\n  if (key.has_point_coordinates) {\n    out_point_coordinates =\n        builder.createVariable(spv::NoPrecision, spv::StorageClassOutput,\n                               type_float2, \"xe_out_point_coordinates\");\n    builder.addDecoration(out_point_coordinates, spv::DecorationLocation,\n                          int(output_location));\n    builder.addDecoration(out_point_coordinates, spv::DecorationInvariant);\n    main_interface.push_back(out_point_coordinates);\n    ++output_location;\n  }\n\n  uint32_t input_location = 0;\n\n  // Interpolator inputs.\n  std::array<spv::Id, xenos::kMaxInterpolators> in_interpolators;\n  for (uint32_t i = 0; i < key.interpolator_count; ++i) {\n    spv::Id in_interpolator = builder.createVariable(\n        spv::NoPrecision, spv::StorageClassInput,\n        builder.makeArrayType(type_float4, const_input_primitive_vertex_count,\n                              0),\n        fmt::format(\"xe_in_interpolator_{}\", i).c_str());\n    in_interpolators[i] = in_interpolator;\n    builder.addDecoration(in_interpolator, spv::DecorationLocation,\n                          int(input_location));\n    main_interface.push_back(in_interpolator);\n    ++input_location;\n  }\n\n  // Point size input.\n  spv::Id in_point_size = spv::NoResult;\n  if (key.has_point_size) {\n    in_point_size = builder.createVariable(\n        spv::NoPrecision, spv::StorageClassInput,\n        builder.makeArrayType(type_float, const_input_primitive_vertex_count,\n                              0),\n        \"xe_in_point_size\");\n    builder.addDecoration(in_point_size, spv::DecorationLocation,\n                          int(input_location));\n    main_interface.push_back(in_point_size);\n    ++input_location;\n  }\n\n  // out gl_PerVertex.\n  // gl_Position.\n  id_vector_temp.clear();\n  uint32_t member_out_gl_per_vertex_position = uint32_t(id_vector_temp.size());\n  id_vector_temp.push_back(type_float4);\n  spv::Id const_member_out_gl_per_vertex_position =\n      builder.makeIntConstant(int32_t(member_out_gl_per_vertex_position));\n  // gl_ClipDistance.\n  uint32_t member_out_gl_per_vertex_clip_distance = UINT32_MAX;\n  spv::Id const_member_out_gl_per_vertex_clip_distance = spv::NoResult;\n  if (clip_distance_count) {\n    member_out_gl_per_vertex_clip_distance = uint32_t(id_vector_temp.size());\n    id_vector_temp.push_back(type_clip_distances);\n    const_member_out_gl_per_vertex_clip_distance = builder.makeIntConstant(\n        int32_t(member_out_gl_per_vertex_clip_distance));\n  }\n  // Structure.\n  spv::Id type_struct_out_gl_per_vertex =\n      builder.makeStructType(id_vector_temp, \"gl_PerVertex\");\n  builder.addMemberName(type_struct_out_gl_per_vertex,\n                        member_out_gl_per_vertex_position, \"gl_Position\");\n  builder.addMemberDecoration(type_struct_out_gl_per_vertex,\n                              member_out_gl_per_vertex_position,\n                              spv::DecorationBuiltIn, spv::BuiltInPosition);\n  if (clip_distance_count) {\n    builder.addMemberName(type_struct_out_gl_per_vertex,\n                          member_out_gl_per_vertex_clip_distance,\n                          \"gl_ClipDistance\");\n    builder.addMemberDecoration(\n        type_struct_out_gl_per_vertex, member_out_gl_per_vertex_clip_distance,\n        spv::DecorationBuiltIn, spv::BuiltInClipDistance);\n  }\n  builder.addDecoration(type_struct_out_gl_per_vertex, spv::DecorationBlock);\n  spv::Id out_gl_per_vertex =\n      builder.createVariable(spv::NoPrecision, spv::StorageClassOutput,\n                             type_struct_out_gl_per_vertex, \"\");\n  builder.addDecoration(out_gl_per_vertex, spv::DecorationInvariant);\n  main_interface.push_back(out_gl_per_vertex);\n\n  // Begin the main function.\n  std::vector<spv::Id> main_param_types;\n  std::vector<std::vector<spv::Decoration>> main_precisions;\n  spv::Block* main_entry;\n  spv::Function* main_function =\n      builder.makeFunctionEntry(spv::NoPrecision, type_void, \"main\",\n                                main_param_types, main_precisions, &main_entry);\n  spv::Instruction* entry_point =\n      builder.addEntryPoint(spv::ExecutionModelGeometry, main_function, \"main\");\n  for (spv::Id interface_id : main_interface) {\n    entry_point->addIdOperand(interface_id);\n  }\n  builder.addExecutionMode(main_function, input_primitive_execution_mode);\n  builder.addExecutionMode(main_function, spv::ExecutionModeInvocations, 1);\n  builder.addExecutionMode(main_function, output_primitive_execution_mode);\n  builder.addExecutionMode(main_function, spv::ExecutionModeOutputVertices,\n                           int(output_max_vertices));\n\n  // Note that after every OpEmitVertex, all output variables are undefined.\n\n  // Discard the whole primitive if any vertex has a NaN position (may also be\n  // set to NaN for emulation of vertex killing with the OR operator).\n  for (uint32_t i = 0; i < input_primitive_vertex_count; ++i) {\n    id_vector_temp.clear();\n    id_vector_temp.push_back(builder.makeIntConstant(int32_t(i)));\n    id_vector_temp.push_back(const_member_in_gl_per_vertex_position);\n    spv::Id position_is_nan = builder.createUnaryOp(\n        spv::OpAny, type_bool,\n        builder.createUnaryOp(\n            spv::OpIsNan, type_bool4,\n            builder.createLoad(\n                builder.createAccessChain(spv::StorageClassInput,\n                                          in_gl_per_vertex, id_vector_temp),\n                spv::NoPrecision)));\n    spv::Block& discard_predecessor = *builder.getBuildPoint();\n    spv::Block& discard_then_block = builder.makeNewBlock();\n    spv::Block& discard_merge_block = builder.makeNewBlock();\n    builder.createSelectionMerge(&discard_merge_block,\n                                 spv::SelectionControlDontFlattenMask);\n    {\n      std::unique_ptr<spv::Instruction> branch_conditional_op(\n          std::make_unique<spv::Instruction>(spv::OpBranchConditional));\n      branch_conditional_op->addIdOperand(position_is_nan);\n      branch_conditional_op->addIdOperand(discard_then_block.getId());\n      branch_conditional_op->addIdOperand(discard_merge_block.getId());\n      branch_conditional_op->addImmediateOperand(1);\n      branch_conditional_op->addImmediateOperand(2);\n      discard_predecessor.addInstruction(std::move(branch_conditional_op));\n    }\n    discard_then_block.addPredecessor(&discard_predecessor);\n    discard_merge_block.addPredecessor(&discard_predecessor);\n    builder.setBuildPoint(&discard_then_block);\n    builder.createNoResultOp(spv::OpReturn);\n    builder.setBuildPoint(&discard_merge_block);\n  }\n\n  // Cull the whole primitive if any cull distance for all vertices in the\n  // primitive is < 0.\n  // TODO(Triang3l): For points, handle ps_ucp_mode (transform the host clip\n  // space to the guest one, calculate the distances to the user clip planes,\n  // cull using the distance from the center for modes 0, 1 and 2, cull and clip\n  // per-vertex for modes 2 and 3) - except for the vertex kill flag.\n  if (cull_distance_count) {\n    spv::Id const_member_in_gl_per_vertex_cull_distance =\n        builder.makeIntConstant(int32_t(member_in_gl_per_vertex_cull_distance));\n    spv::Id const_float_0 = builder.makeFloatConstant(0.0f);\n    spv::Id cull_condition = spv::NoResult;\n    for (uint32_t i = 0; i < cull_distance_count; ++i) {\n      for (uint32_t j = 0; j < input_primitive_vertex_count; ++j) {\n        id_vector_temp.clear();\n        id_vector_temp.push_back(builder.makeIntConstant(int32_t(j)));\n        id_vector_temp.push_back(const_member_in_gl_per_vertex_cull_distance);\n        id_vector_temp.push_back(builder.makeIntConstant(int32_t(i)));\n        spv::Id cull_distance_is_negative = builder.createBinOp(\n            spv::OpFOrdLessThan, type_bool,\n            builder.createLoad(\n                builder.createAccessChain(spv::StorageClassInput,\n                                          in_gl_per_vertex, id_vector_temp),\n                spv::NoPrecision),\n            const_float_0);\n        if (cull_condition != spv::NoResult) {\n          cull_condition =\n              builder.createBinOp(spv::OpLogicalAnd, type_bool, cull_condition,\n                                  cull_distance_is_negative);\n        } else {\n          cull_condition = cull_distance_is_negative;\n        }\n      }\n    }\n    assert_true(cull_condition != spv::NoResult);\n    spv::Block& discard_predecessor = *builder.getBuildPoint();\n    spv::Block& discard_then_block = builder.makeNewBlock();\n    spv::Block& discard_merge_block = builder.makeNewBlock();\n    builder.createSelectionMerge(&discard_merge_block,\n                                 spv::SelectionControlDontFlattenMask);\n    {\n      std::unique_ptr<spv::Instruction> branch_conditional_op(\n          std::make_unique<spv::Instruction>(spv::OpBranchConditional));\n      branch_conditional_op->addIdOperand(cull_condition);\n      branch_conditional_op->addIdOperand(discard_then_block.getId());\n      branch_conditional_op->addIdOperand(discard_merge_block.getId());\n      branch_conditional_op->addImmediateOperand(1);\n      branch_conditional_op->addImmediateOperand(2);\n      discard_predecessor.addInstruction(std::move(branch_conditional_op));\n    }\n    discard_then_block.addPredecessor(&discard_predecessor);\n    discard_merge_block.addPredecessor(&discard_predecessor);\n    builder.setBuildPoint(&discard_then_block);\n    builder.createNoResultOp(spv::OpReturn);\n    builder.setBuildPoint(&discard_merge_block);\n  }\n\n  switch (key.type) {\n    case PipelineGeometryShader::kPointList: {\n      // Expand the point sprite, with left-to-right, top-to-bottom UVs.\n\n      spv::Id const_int_0 = builder.makeIntConstant(0);\n      spv::Id const_int_1 = builder.makeIntConstant(1);\n      spv::Id const_float_0 = builder.makeFloatConstant(0.0f);\n\n      // Load the point diameter in guest pixels.\n      id_vector_temp.clear();\n      id_vector_temp.push_back(\n          builder.makeIntConstant(int32_t(kPointConstantConstantDiameter)));\n      id_vector_temp.push_back(const_int_0);\n      spv::Id point_guest_diameter_x = builder.createLoad(\n          builder.createAccessChain(spv::StorageClassUniform,\n                                    uniform_system_constants, id_vector_temp),\n          spv::NoPrecision);\n      id_vector_temp.back() = const_int_1;\n      spv::Id point_guest_diameter_y = builder.createLoad(\n          builder.createAccessChain(spv::StorageClassUniform,\n                                    uniform_system_constants, id_vector_temp),\n          spv::NoPrecision);\n      if (key.has_point_size) {\n        // The vertex shader's header writes -1.0 to point_size by default, so\n        // any non-negative value means that it was overwritten by the\n        // translated vertex shader, and needs to be used instead of the\n        // constant size. The per-vertex diameter is already clamped in the\n        // vertex shader (combined with making it non-negative).\n        id_vector_temp.clear();\n        // 0 is the input primitive vertex index.\n        id_vector_temp.push_back(const_int_0);\n        spv::Id point_vertex_diameter = builder.createLoad(\n            builder.createAccessChain(spv::StorageClassInput, in_point_size,\n                                      id_vector_temp),\n            spv::NoPrecision);\n        spv::Id point_vertex_diameter_written =\n            builder.createBinOp(spv::OpFOrdGreaterThanEqual, type_bool,\n                                point_vertex_diameter, const_float_0);\n        point_guest_diameter_x = builder.createTriOp(\n            spv::OpSelect, type_float, point_vertex_diameter_written,\n            point_vertex_diameter, point_guest_diameter_x);\n        point_guest_diameter_y = builder.createTriOp(\n            spv::OpSelect, type_float, point_vertex_diameter_written,\n            point_vertex_diameter, point_guest_diameter_y);\n      }\n\n      // 4D5307F1 has zero-size snowflakes, drop them quicker, and also drop\n      // points with a constant size of zero since point lists may also be used\n      // as just \"compute\" with memexport.\n      spv::Id point_size_not_zero = builder.createBinOp(\n          spv::OpLogicalAnd, type_bool,\n          builder.createBinOp(spv::OpFOrdGreaterThan, type_bool,\n                              point_guest_diameter_x, const_float_0),\n          builder.createBinOp(spv::OpFOrdGreaterThan, type_bool,\n                              point_guest_diameter_y, const_float_0));\n      spv::Block& point_size_zero_predecessor = *builder.getBuildPoint();\n      spv::Block& point_size_zero_then_block = builder.makeNewBlock();\n      spv::Block& point_size_zero_merge_block = builder.makeNewBlock();\n      builder.createSelectionMerge(&point_size_zero_merge_block,\n                                   spv::SelectionControlDontFlattenMask);\n      {\n        std::unique_ptr<spv::Instruction> branch_conditional_op(\n            std::make_unique<spv::Instruction>(spv::OpBranchConditional));\n        branch_conditional_op->addIdOperand(point_size_not_zero);\n        branch_conditional_op->addIdOperand(\n            point_size_zero_merge_block.getId());\n        branch_conditional_op->addIdOperand(point_size_zero_then_block.getId());\n        branch_conditional_op->addImmediateOperand(2);\n        branch_conditional_op->addImmediateOperand(1);\n        point_size_zero_predecessor.addInstruction(\n            std::move(branch_conditional_op));\n      }\n      point_size_zero_then_block.addPredecessor(&point_size_zero_predecessor);\n      point_size_zero_merge_block.addPredecessor(&point_size_zero_predecessor);\n      builder.setBuildPoint(&point_size_zero_then_block);\n      builder.createNoResultOp(spv::OpReturn);\n      builder.setBuildPoint(&point_size_zero_merge_block);\n\n      // Transform the diameter in the guest screen coordinates to radius in the\n      // normalized device coordinates, and then to the clip space by\n      // multiplying by W.\n      id_vector_temp.clear();\n      id_vector_temp.push_back(builder.makeIntConstant(\n          int32_t(kPointConstantScreenDiameterToNdcRadius)));\n      id_vector_temp.push_back(const_int_0);\n      spv::Id point_radius_x = builder.createNoContractionBinOp(\n          spv::OpFMul, type_float, point_guest_diameter_x,\n          builder.createLoad(builder.createAccessChain(spv::StorageClassUniform,\n                                                       uniform_system_constants,\n                                                       id_vector_temp),\n                             spv::NoPrecision));\n      id_vector_temp.back() = const_int_1;\n      spv::Id point_radius_y = builder.createNoContractionBinOp(\n          spv::OpFMul, type_float, point_guest_diameter_y,\n          builder.createLoad(builder.createAccessChain(spv::StorageClassUniform,\n                                                       uniform_system_constants,\n                                                       id_vector_temp),\n                             spv::NoPrecision));\n      id_vector_temp.clear();\n      // 0 is the input primitive vertex index.\n      id_vector_temp.push_back(const_int_0);\n      id_vector_temp.push_back(const_member_in_gl_per_vertex_position);\n      spv::Id point_position = builder.createLoad(\n          builder.createAccessChain(spv::StorageClassInput, in_gl_per_vertex,\n                                    id_vector_temp),\n          spv::NoPrecision);\n      spv::Id point_w =\n          builder.createCompositeExtract(point_position, type_float, 3);\n      point_radius_x = builder.createNoContractionBinOp(\n          spv::OpFMul, type_float, point_radius_x, point_w);\n      point_radius_y = builder.createNoContractionBinOp(\n          spv::OpFMul, type_float, point_radius_y, point_w);\n\n      // Load the inputs for the guest point.\n      // Interpolators.\n      std::array<spv::Id, xenos::kMaxInterpolators> point_interpolators;\n      id_vector_temp.clear();\n      // 0 is the input primitive vertex index.\n      id_vector_temp.push_back(const_int_0);\n      for (uint32_t i = 0; i < key.interpolator_count; ++i) {\n        point_interpolators[i] = builder.createLoad(\n            builder.createAccessChain(spv::StorageClassInput,\n                                      in_interpolators[i], id_vector_temp),\n            spv::NoPrecision);\n      }\n      // Positions.\n      spv::Id point_x =\n          builder.createCompositeExtract(point_position, type_float, 0);\n      spv::Id point_y =\n          builder.createCompositeExtract(point_position, type_float, 1);\n      std::array<spv::Id, 2> point_edge_x, point_edge_y;\n      for (uint32_t i = 0; i < 2; ++i) {\n        spv::Op point_radius_add_op = i ? spv::OpFAdd : spv::OpFSub;\n        point_edge_x[i] = builder.createNoContractionBinOp(\n            point_radius_add_op, type_float, point_x, point_radius_x);\n        point_edge_y[i] = builder.createNoContractionBinOp(\n            point_radius_add_op, type_float, point_y, point_radius_y);\n      };\n      spv::Id point_z =\n          builder.createCompositeExtract(point_position, type_float, 2);\n      // Clip distances.\n      spv::Id point_clip_distances = spv::NoResult;\n      if (clip_distance_count) {\n        id_vector_temp.clear();\n        // 0 is the input primitive vertex index.\n        id_vector_temp.push_back(const_int_0);\n        id_vector_temp.push_back(const_member_in_gl_per_vertex_clip_distance);\n        point_clip_distances = builder.createLoad(\n            builder.createAccessChain(spv::StorageClassInput, in_gl_per_vertex,\n                                      id_vector_temp),\n            spv::NoPrecision);\n      }\n\n      for (uint32_t i = 0; i < 4; ++i) {\n        // Same interpolators for the entire sprite.\n        for (uint32_t j = 0; j < key.interpolator_count; ++j) {\n          builder.createStore(point_interpolators[j], out_interpolators[j]);\n        }\n        // Top-left, bottom-left, top-right, bottom-right order (chosen\n        // arbitrarily, simply based on counterclockwise meaning front with\n        // frontFace = VkFrontFace(0), but faceness is ignored for non-polygon\n        // primitive types).\n        uint32_t point_vertex_x = i >> 1;\n        uint32_t point_vertex_y = i & 1;\n        // Point coordinates.\n        if (key.has_point_coordinates) {\n          id_vector_temp.clear();\n          id_vector_temp.push_back(\n              builder.makeFloatConstant(float(point_vertex_x)));\n          id_vector_temp.push_back(\n              builder.makeFloatConstant(float(point_vertex_y)));\n          builder.createStore(\n              builder.makeCompositeConstant(type_float2, id_vector_temp),\n              out_point_coordinates);\n        }\n        // Position.\n        id_vector_temp.clear();\n        id_vector_temp.push_back(point_edge_x[point_vertex_x]);\n        id_vector_temp.push_back(point_edge_y[point_vertex_y]);\n        id_vector_temp.push_back(point_z);\n        id_vector_temp.push_back(point_w);\n        spv::Id point_vertex_position =\n            builder.createCompositeConstruct(type_float4, id_vector_temp);\n        id_vector_temp.clear();\n        id_vector_temp.push_back(const_member_out_gl_per_vertex_position);\n        builder.createStore(\n            point_vertex_position,\n            builder.createAccessChain(spv::StorageClassOutput,\n                                      out_gl_per_vertex, id_vector_temp));\n        // Clip distances.\n        // TODO(Triang3l): Handle ps_ucp_mode properly, clip expanded points if\n        // needed.\n        if (clip_distance_count) {\n          id_vector_temp.clear();\n          id_vector_temp.push_back(\n              const_member_out_gl_per_vertex_clip_distance);\n          builder.createStore(\n              point_clip_distances,\n              builder.createAccessChain(spv::StorageClassOutput,\n                                        out_gl_per_vertex, id_vector_temp));\n        }\n        // Emit the vertex.\n        builder.createNoResultOp(spv::OpEmitVertex);\n      }\n      builder.createNoResultOp(spv::OpEndPrimitive);\n    } break;\n\n    case PipelineGeometryShader::kRectangleList: {\n      // Construct a strip with the fourth vertex generated by mirroring a\n      // vertex across the longest edge (the diagonal).\n      //\n      // Possible options:\n      //\n      // 0---1\n      // |  /|\n      // | / |  - 12 is the longest edge, strip 0123 (most commonly used)\n      // |/  |    v3 = v0 + (v1 - v0) + (v2 - v0), or v3 = -v0 + v1 + v2\n      // 2--[3]\n      //\n      // 1---2\n      // |  /|\n      // | / |  - 20 is the longest edge, strip 1203\n      // |/  |\n      // 0--[3]\n      //\n      // 2---0\n      // |  /|\n      // | / |  - 01 is the longest edge, strip 2013\n      // |/  |\n      // 1--[3]\n\n      spv::Id const_int_0 = builder.makeIntConstant(0);\n      spv::Id const_int_1 = builder.makeIntConstant(1);\n      spv::Id const_int_2 = builder.makeIntConstant(2);\n      spv::Id const_int_3 = builder.makeIntConstant(3);\n\n      // Get squares of edge lengths to choose the longest edge.\n      // [0] - 12, [1] - 20, [2] - 01.\n      spv::Id edge_lengths[3];\n      id_vector_temp.resize(3);\n      id_vector_temp[1] = const_member_in_gl_per_vertex_position;\n      for (uint32_t i = 0; i < 3; ++i) {\n        id_vector_temp[0] = builder.makeIntConstant(int32_t((1 + i) % 3));\n        id_vector_temp[2] = const_int_0;\n        spv::Id edge_0_x = builder.createLoad(\n            builder.createAccessChain(spv::StorageClassInput, in_gl_per_vertex,\n                                      id_vector_temp),\n            spv::NoPrecision);\n        id_vector_temp[2] = const_int_1;\n        spv::Id edge_0_y = builder.createLoad(\n            builder.createAccessChain(spv::StorageClassInput, in_gl_per_vertex,\n                                      id_vector_temp),\n            spv::NoPrecision);\n        id_vector_temp[0] = builder.makeIntConstant(int32_t((2 + i) % 3));\n        id_vector_temp[2] = const_int_0;\n        spv::Id edge_1_x = builder.createLoad(\n            builder.createAccessChain(spv::StorageClassInput, in_gl_per_vertex,\n                                      id_vector_temp),\n            spv::NoPrecision);\n        id_vector_temp[2] = const_int_1;\n        spv::Id edge_1_y = builder.createLoad(\n            builder.createAccessChain(spv::StorageClassInput, in_gl_per_vertex,\n                                      id_vector_temp),\n            spv::NoPrecision);\n        spv::Id edge_x =\n            builder.createBinOp(spv::OpFSub, type_float, edge_1_x, edge_0_x);\n        spv::Id edge_y =\n            builder.createBinOp(spv::OpFSub, type_float, edge_1_y, edge_0_y);\n        edge_lengths[i] = builder.createBinOp(\n            spv::OpFAdd, type_float,\n            builder.createBinOp(spv::OpFMul, type_float, edge_x, edge_x),\n            builder.createBinOp(spv::OpFMul, type_float, edge_y, edge_y));\n      }\n\n      // Choose the index of the first vertex in the strip based on which edge\n      // is the longest, and calculate the indices of the other vertices.\n      spv::Id vertex_indices[3];\n      // If 12 > 20 && 12 > 01, then 12 is the longest edge, and the strip is\n      // 0123. Otherwise, if 20 > 01, then 20 is the longest, and the strip is\n      // 1203, but if not, 01 is the longest, and the strip is 2013.\n      vertex_indices[0] = builder.createTriOp(\n          spv::OpSelect, type_int,\n          builder.createBinOp(\n              spv::OpLogicalAnd, type_bool,\n              builder.createBinOp(spv::OpFOrdGreaterThan, type_bool,\n                                  edge_lengths[0], edge_lengths[1]),\n              builder.createBinOp(spv::OpFOrdGreaterThan, type_bool,\n                                  edge_lengths[0], edge_lengths[2])),\n          const_int_0,\n          builder.createTriOp(\n              spv::OpSelect, type_int,\n              builder.createBinOp(spv::OpFOrdGreaterThan, type_bool,\n                                  edge_lengths[1], edge_lengths[2]),\n              const_int_1, const_int_2));\n      for (uint32_t i = 1; i < 3; ++i) {\n        // vertex_indices[i] = (vertex_indices[0] + i) % 3\n        spv::Id vertex_index_without_wrapping =\n            builder.createBinOp(spv::OpIAdd, type_int, vertex_indices[0],\n                                builder.makeIntConstant(int32_t(i)));\n        vertex_indices[i] = builder.createTriOp(\n            spv::OpSelect, type_int,\n            builder.createBinOp(spv::OpSLessThan, type_bool,\n                                vertex_index_without_wrapping, const_int_3),\n            vertex_index_without_wrapping,\n            builder.createBinOp(spv::OpISub, type_int,\n                                vertex_index_without_wrapping, const_int_3));\n      }\n\n      // Initialize the point coordinates output for safety if this shader type\n      // is used with has_point_coordinates for some reason.\n      spv::Id const_point_coordinates_zero = spv::NoResult;\n      if (key.has_point_coordinates) {\n        spv::Id const_float_0 = builder.makeFloatConstant(0.0f);\n        id_vector_temp.clear();\n        id_vector_temp.push_back(const_float_0);\n        id_vector_temp.push_back(const_float_0);\n        const_point_coordinates_zero =\n            builder.makeCompositeConstant(type_float2, id_vector_temp);\n      }\n\n      // Emit the triangle in the strip that consists of the original vertices.\n      for (uint32_t i = 0; i < 3; ++i) {\n        spv::Id vertex_index = vertex_indices[i];\n        // Interpolators.\n        id_vector_temp.clear();\n        id_vector_temp.push_back(vertex_index);\n        for (uint32_t j = 0; j < key.interpolator_count; ++j) {\n          builder.createStore(\n              builder.createLoad(builder.createAccessChain(\n                                     spv::StorageClassInput,\n                                     in_interpolators[j], id_vector_temp),\n                                 spv::NoPrecision),\n              out_interpolators[j]);\n        }\n        // Point coordinates.\n        if (key.has_point_coordinates) {\n          builder.createStore(const_point_coordinates_zero,\n                              out_point_coordinates);\n        }\n        // Position.\n        id_vector_temp.clear();\n        id_vector_temp.push_back(vertex_index);\n        id_vector_temp.push_back(const_member_in_gl_per_vertex_position);\n        spv::Id vertex_position = builder.createLoad(\n            builder.createAccessChain(spv::StorageClassInput, in_gl_per_vertex,\n                                      id_vector_temp),\n            spv::NoPrecision);\n        id_vector_temp.clear();\n        id_vector_temp.push_back(const_member_out_gl_per_vertex_position);\n        builder.createStore(\n            vertex_position,\n            builder.createAccessChain(spv::StorageClassOutput,\n                                      out_gl_per_vertex, id_vector_temp));\n        // Clip distances.\n        if (clip_distance_count) {\n          id_vector_temp.clear();\n          id_vector_temp.push_back(vertex_index);\n          id_vector_temp.push_back(const_member_in_gl_per_vertex_clip_distance);\n          spv::Id vertex_clip_distances = builder.createLoad(\n              builder.createAccessChain(spv::StorageClassInput,\n                                        in_gl_per_vertex, id_vector_temp),\n              spv::NoPrecision);\n          id_vector_temp.clear();\n          id_vector_temp.push_back(\n              const_member_out_gl_per_vertex_clip_distance);\n          builder.createStore(\n              vertex_clip_distances,\n              builder.createAccessChain(spv::StorageClassOutput,\n                                        out_gl_per_vertex, id_vector_temp));\n        }\n        // Emit the vertex.\n        builder.createNoResultOp(spv::OpEmitVertex);\n      }\n\n      // Construct the fourth vertex.\n      // Interpolators.\n      for (uint32_t i = 0; i < key.interpolator_count; ++i) {\n        spv::Id in_interpolator = in_interpolators[i];\n        id_vector_temp.clear();\n        id_vector_temp.push_back(vertex_indices[0]);\n        spv::Id vertex_interpolator_v0 = builder.createLoad(\n            builder.createAccessChain(spv::StorageClassInput, in_interpolator,\n                                      id_vector_temp),\n            spv::NoPrecision);\n        id_vector_temp[0] = vertex_indices[1];\n        spv::Id vertex_interpolator_v01 = builder.createNoContractionBinOp(\n            spv::OpFSub, type_float4,\n            builder.createLoad(\n                builder.createAccessChain(spv::StorageClassInput,\n                                          in_interpolator, id_vector_temp),\n                spv::NoPrecision),\n            vertex_interpolator_v0);\n        id_vector_temp[0] = vertex_indices[2];\n        spv::Id vertex_interpolator_v3 = builder.createNoContractionBinOp(\n            spv::OpFAdd, type_float4, vertex_interpolator_v01,\n            builder.createLoad(\n                builder.createAccessChain(spv::StorageClassInput,\n                                          in_interpolator, id_vector_temp),\n                spv::NoPrecision));\n        builder.createStore(vertex_interpolator_v3, out_interpolators[i]);\n      }\n      // Point coordinates.\n      if (key.has_point_coordinates) {\n        builder.createStore(const_point_coordinates_zero,\n                            out_point_coordinates);\n      }\n      // Position.\n      id_vector_temp.clear();\n      id_vector_temp.push_back(vertex_indices[0]);\n      id_vector_temp.push_back(const_member_in_gl_per_vertex_position);\n      spv::Id vertex_position_v0 = builder.createLoad(\n          builder.createAccessChain(spv::StorageClassInput, in_gl_per_vertex,\n                                    id_vector_temp),\n          spv::NoPrecision);\n      id_vector_temp[0] = vertex_indices[1];\n      spv::Id vertex_position_v01 = builder.createNoContractionBinOp(\n          spv::OpFSub, type_float4,\n          builder.createLoad(\n              builder.createAccessChain(spv::StorageClassInput,\n                                        in_gl_per_vertex, id_vector_temp),\n              spv::NoPrecision),\n          vertex_position_v0);\n      id_vector_temp[0] = vertex_indices[2];\n      spv::Id vertex_position_v3 = builder.createNoContractionBinOp(\n          spv::OpFAdd, type_float4, vertex_position_v01,\n          builder.createLoad(\n              builder.createAccessChain(spv::StorageClassInput,\n                                        in_gl_per_vertex, id_vector_temp),\n              spv::NoPrecision));\n      id_vector_temp.clear();\n      id_vector_temp.push_back(const_member_out_gl_per_vertex_position);\n      builder.createStore(\n          vertex_position_v3,\n          builder.createAccessChain(spv::StorageClassOutput, out_gl_per_vertex,\n                                    id_vector_temp));\n      // Clip distances.\n      for (uint32_t i = 0; i < clip_distance_count; ++i) {\n        spv::Id const_int_i = builder.makeIntConstant(int32_t(i));\n        id_vector_temp.clear();\n        id_vector_temp.push_back(vertex_indices[0]);\n        id_vector_temp.push_back(const_member_in_gl_per_vertex_clip_distance);\n        id_vector_temp.push_back(const_int_i);\n        spv::Id vertex_clip_distance_v0 = builder.createLoad(\n            builder.createAccessChain(spv::StorageClassInput, in_gl_per_vertex,\n                                      id_vector_temp),\n            spv::NoPrecision);\n        id_vector_temp[0] = vertex_indices[1];\n        spv::Id vertex_clip_distance_v01 = builder.createNoContractionBinOp(\n            spv::OpFSub, type_float,\n            builder.createLoad(\n                builder.createAccessChain(spv::StorageClassInput,\n                                          in_gl_per_vertex, id_vector_temp),\n                spv::NoPrecision),\n            vertex_clip_distance_v0);\n        id_vector_temp[0] = vertex_indices[2];\n        spv::Id vertex_clip_distance_v3 = builder.createNoContractionBinOp(\n            spv::OpFAdd, type_float, vertex_clip_distance_v01,\n            builder.createLoad(\n                builder.createAccessChain(spv::StorageClassInput,\n                                          in_gl_per_vertex, id_vector_temp),\n                spv::NoPrecision));\n        id_vector_temp.clear();\n        id_vector_temp.push_back(const_member_in_gl_per_vertex_clip_distance);\n        id_vector_temp.push_back(const_int_i);\n        builder.createStore(\n            vertex_clip_distance_v3,\n            builder.createAccessChain(spv::StorageClassOutput,\n                                      out_gl_per_vertex, id_vector_temp));\n      }\n      // Emit the vertex.\n      builder.createNoResultOp(spv::OpEmitVertex);\n      builder.createNoResultOp(spv::OpEndPrimitive);\n    } break;\n\n    case PipelineGeometryShader::kQuadList: {\n      // Initialize the point coordinates output for safety if this shader type\n      // is used with has_point_coordinates for some reason.\n      spv::Id const_point_coordinates_zero = spv::NoResult;\n      if (key.has_point_coordinates) {\n        spv::Id const_float_0 = builder.makeFloatConstant(0.0f);\n        id_vector_temp.clear();\n        id_vector_temp.push_back(const_float_0);\n        id_vector_temp.push_back(const_float_0);\n        const_point_coordinates_zero =\n            builder.makeCompositeConstant(type_float2, id_vector_temp);\n      }\n\n      // Build the triangle strip from the original quad vertices in the\n      // 0, 1, 3, 2 order (like specified for GL_QUAD_STRIP).\n      // TODO(Triang3l): Find the correct decomposition of quads into triangles\n      // on the real hardware.\n      for (uint32_t i = 0; i < 4; ++i) {\n        spv::Id const_vertex_index =\n            builder.makeIntConstant(int32_t(i ^ (i >> 1)));\n        // Interpolators.\n        id_vector_temp.clear();\n        id_vector_temp.push_back(const_vertex_index);\n        for (uint32_t j = 0; j < key.interpolator_count; ++j) {\n          builder.createStore(\n              builder.createLoad(builder.createAccessChain(\n                                     spv::StorageClassInput,\n                                     in_interpolators[j], id_vector_temp),\n                                 spv::NoPrecision),\n              out_interpolators[j]);\n        }\n        // Point coordinates.\n        if (key.has_point_coordinates) {\n          builder.createStore(const_point_coordinates_zero,\n                              out_point_coordinates);\n        }\n        // Position.\n        id_vector_temp.clear();\n        id_vector_temp.push_back(const_vertex_index);\n        id_vector_temp.push_back(const_member_in_gl_per_vertex_position);\n        spv::Id vertex_position = builder.createLoad(\n            builder.createAccessChain(spv::StorageClassInput, in_gl_per_vertex,\n                                      id_vector_temp),\n            spv::NoPrecision);\n        id_vector_temp.clear();\n        id_vector_temp.push_back(const_member_out_gl_per_vertex_position);\n        builder.createStore(\n            vertex_position,\n            builder.createAccessChain(spv::StorageClassOutput,\n                                      out_gl_per_vertex, id_vector_temp));\n        // Clip distances.\n        if (clip_distance_count) {\n          id_vector_temp.clear();\n          id_vector_temp.push_back(const_vertex_index);\n          id_vector_temp.push_back(const_member_in_gl_per_vertex_clip_distance);\n          spv::Id vertex_clip_distances = builder.createLoad(\n              builder.createAccessChain(spv::StorageClassInput,\n                                        in_gl_per_vertex, id_vector_temp),\n              spv::NoPrecision);\n          id_vector_temp.clear();\n          id_vector_temp.push_back(\n              const_member_out_gl_per_vertex_clip_distance);\n          builder.createStore(\n              vertex_clip_distances,\n              builder.createAccessChain(spv::StorageClassOutput,\n                                        out_gl_per_vertex, id_vector_temp));\n        }\n        // Emit the vertex.\n        builder.createNoResultOp(spv::OpEmitVertex);\n      }\n      builder.createNoResultOp(spv::OpEndPrimitive);\n    } break;\n\n    default:\n      assert_unhandled_case(key.type);\n  }\n\n  // End the main function.\n  builder.leaveFunction();\n\n  // Serialize the shader code.\n  std::vector<unsigned int> shader_code;\n  builder.dump(shader_code);\n\n  // Create the shader module, and store the handle even if creation fails not\n  // to try to create it again later.\n  VkShaderModule shader_module = ui::vulkan::util::CreateShaderModule(\n      command_processor_.GetVulkanDevice(),\n      reinterpret_cast<const uint32_t*>(shader_code.data()),\n      sizeof(uint32_t) * shader_code.size());\n  if (shader_module == VK_NULL_HANDLE) {\n    XELOGE(\n        \"VulkanPipelineCache: Failed to create the primitive type geometry \"\n        \"shader 0x{:08X}\",\n        key.key);\n  }\n  geometry_shaders_.emplace(key, shader_module);\n  return shader_module;\n}\n\nbool VulkanPipelineCache::EnsurePipelineCreated(\n    const PipelineCreationArguments& creation_arguments) {\n  if (creation_arguments.pipeline->second.pipeline != VK_NULL_HANDLE) {\n    return true;\n  }\n\n  // This function preferably should validate the description to prevent\n  // unsupported behavior that may be dangerous/crashing because pipelines can\n  // be created from the disk storage.\n\n  if (creation_arguments.pixel_shader) {\n    XELOGGPU(\"Creating graphics pipeline state with VS {:016X}, PS {:016X}\",\n             creation_arguments.vertex_shader->shader().ucode_data_hash(),\n             creation_arguments.pixel_shader->shader().ucode_data_hash());\n  } else {\n    XELOGGPU(\"Creating graphics pipeline state with VS {:016X}\",\n             creation_arguments.vertex_shader->shader().ucode_data_hash());\n  }\n\n  const PipelineDescription& description = creation_arguments.pipeline->first;\n  if (!ArePipelineRequirementsMet(description)) {\n    assert_always(\n        \"When creating a new pipeline, the description must not require \"\n        \"unsupported features, and when loading the pipeline storage, \"\n        \"pipelines with unsupported features must be filtered out\");\n    return false;\n  }\n\n  const ui::vulkan::VulkanDevice* const vulkan_device =\n      command_processor_.GetVulkanDevice();\n\n  bool edram_fragment_shader_interlock =\n      render_target_cache_.GetPath() ==\n      RenderTargetCache::Path::kPixelShaderInterlock;\n\n  std::array<VkPipelineShaderStageCreateInfo, 3> shader_stages;\n  uint32_t shader_stage_count = 0;\n\n  // Vertex or tessellation evaluation shader.\n  assert_true(creation_arguments.vertex_shader->is_translated());\n  if (!creation_arguments.vertex_shader->is_valid()) {\n    return false;\n  }\n  VkPipelineShaderStageCreateInfo& shader_stage_vertex =\n      shader_stages[shader_stage_count++];\n  shader_stage_vertex.sType =\n      VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;\n  shader_stage_vertex.pNext = nullptr;\n  shader_stage_vertex.flags = 0;\n  shader_stage_vertex.stage = VK_SHADER_STAGE_VERTEX_BIT;\n  shader_stage_vertex.module =\n      creation_arguments.vertex_shader->shader_module();\n  assert_true(shader_stage_vertex.module != VK_NULL_HANDLE);\n  shader_stage_vertex.pName = \"main\";\n  shader_stage_vertex.pSpecializationInfo = nullptr;\n  // Geometry shader.\n  if (creation_arguments.geometry_shader != VK_NULL_HANDLE) {\n    VkPipelineShaderStageCreateInfo& shader_stage_geometry =\n        shader_stages[shader_stage_count++];\n    shader_stage_geometry.sType =\n        VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;\n    shader_stage_geometry.pNext = nullptr;\n    shader_stage_geometry.flags = 0;\n    shader_stage_geometry.stage = VK_SHADER_STAGE_GEOMETRY_BIT;\n    shader_stage_geometry.module = creation_arguments.geometry_shader;\n    shader_stage_geometry.pName = \"main\";\n    shader_stage_geometry.pSpecializationInfo = nullptr;\n  }\n  // Fragment shader.\n  VkPipelineShaderStageCreateInfo& shader_stage_fragment =\n      shader_stages[shader_stage_count++];\n  shader_stage_fragment.sType =\n      VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;\n  shader_stage_fragment.pNext = nullptr;\n  shader_stage_fragment.flags = 0;\n  shader_stage_fragment.stage = VK_SHADER_STAGE_FRAGMENT_BIT;\n  shader_stage_fragment.module = VK_NULL_HANDLE;\n  shader_stage_fragment.pName = \"main\";\n  shader_stage_fragment.pSpecializationInfo = nullptr;\n  if (creation_arguments.pixel_shader) {\n    assert_true(creation_arguments.pixel_shader->is_translated());\n    if (!creation_arguments.pixel_shader->is_valid()) {\n      return false;\n    }\n    shader_stage_fragment.module =\n        creation_arguments.pixel_shader->shader_module();\n    assert_true(shader_stage_fragment.module != VK_NULL_HANDLE);\n  } else {\n    if (edram_fragment_shader_interlock) {\n      shader_stage_fragment.module = depth_only_fragment_shader_;\n    }\n  }\n  if (shader_stage_fragment.module == VK_NULL_HANDLE) {\n    --shader_stage_count;\n  }\n\n  VkPipelineVertexInputStateCreateInfo vertex_input_state = {};\n  vertex_input_state.sType =\n      VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;\n\n  VkPipelineInputAssemblyStateCreateInfo input_assembly_state;\n  input_assembly_state.sType =\n      VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;\n  input_assembly_state.pNext = nullptr;\n  input_assembly_state.flags = 0;\n  switch (description.primitive_topology) {\n    case PipelinePrimitiveTopology::kPointList:\n      input_assembly_state.topology = VK_PRIMITIVE_TOPOLOGY_POINT_LIST;\n      assert_false(description.primitive_restart);\n      if (description.primitive_restart) {\n        return false;\n      }\n      break;\n    case PipelinePrimitiveTopology::kLineList:\n      input_assembly_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;\n      assert_false(description.primitive_restart);\n      if (description.primitive_restart) {\n        return false;\n      }\n      break;\n    case PipelinePrimitiveTopology::kLineStrip:\n      input_assembly_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_STRIP;\n      break;\n    case PipelinePrimitiveTopology::kTriangleList:\n      input_assembly_state.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;\n      assert_false(description.primitive_restart);\n      if (description.primitive_restart) {\n        return false;\n      }\n      break;\n    case PipelinePrimitiveTopology::kTriangleStrip:\n      input_assembly_state.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;\n      break;\n    case PipelinePrimitiveTopology::kTriangleFan:\n      input_assembly_state.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN;\n      break;\n    case PipelinePrimitiveTopology::kLineListWithAdjacency:\n      input_assembly_state.topology =\n          VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY;\n      assert_false(description.primitive_restart);\n      if (description.primitive_restart) {\n        return false;\n      }\n      break;\n    case PipelinePrimitiveTopology::kPatchList:\n      input_assembly_state.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;\n      assert_false(description.primitive_restart);\n      if (description.primitive_restart) {\n        return false;\n      }\n      break;\n    default:\n      assert_unhandled_case(description.primitive_topology);\n      return false;\n  }\n  input_assembly_state.primitiveRestartEnable =\n      description.primitive_restart ? VK_TRUE : VK_FALSE;\n\n  VkPipelineViewportStateCreateInfo viewport_state;\n  viewport_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;\n  viewport_state.pNext = nullptr;\n  viewport_state.flags = 0;\n  viewport_state.viewportCount = 1;\n  viewport_state.pViewports = nullptr;\n  viewport_state.scissorCount = 1;\n  viewport_state.pScissors = nullptr;\n\n  VkPipelineRasterizationStateCreateInfo rasterization_state = {};\n  rasterization_state.sType =\n      VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;\n  rasterization_state.depthClampEnable =\n      description.depth_clamp_enable ? VK_TRUE : VK_FALSE;\n  switch (description.polygon_mode) {\n    case PipelinePolygonMode::kFill:\n      rasterization_state.polygonMode = VK_POLYGON_MODE_FILL;\n      break;\n    case PipelinePolygonMode::kLine:\n      rasterization_state.polygonMode = VK_POLYGON_MODE_LINE;\n      break;\n    case PipelinePolygonMode::kPoint:\n      rasterization_state.polygonMode = VK_POLYGON_MODE_POINT;\n      break;\n    default:\n      assert_unhandled_case(description.polygon_mode);\n      return false;\n  }\n  rasterization_state.cullMode = VK_CULL_MODE_NONE;\n  if (description.cull_front) {\n    rasterization_state.cullMode |= VK_CULL_MODE_FRONT_BIT;\n  }\n  if (description.cull_back) {\n    rasterization_state.cullMode |= VK_CULL_MODE_BACK_BIT;\n  }\n  rasterization_state.frontFace = description.front_face_clockwise\n                                      ? VK_FRONT_FACE_CLOCKWISE\n                                      : VK_FRONT_FACE_COUNTER_CLOCKWISE;\n  // Depth bias is dynamic (even toggling - pipeline creation is expensive).\n  // \"If no depth attachment is present, r is undefined\" in the depth bias\n  // formula, though Z has no effect on anything if a depth attachment is not\n  // used (the guest shader can't access Z), enabling only when there's a\n  // depth / stencil attachment for correctness.\n  rasterization_state.depthBiasEnable =\n      (!edram_fragment_shader_interlock &&\n       (description.render_pass_key.depth_and_color_used & 0b1))\n          ? VK_TRUE\n          : VK_FALSE;\n  // TODO(Triang3l): Wide lines.\n  rasterization_state.lineWidth = 1.0f;\n\n  VkSampleMask sample_mask = UINT32_MAX;\n  VkPipelineMultisampleStateCreateInfo multisample_state = {};\n  multisample_state.sType =\n      VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;\n  if (description.render_pass_key.msaa_samples == xenos::MsaaSamples::k2X &&\n      !render_target_cache_.IsMsaa2xSupported(\n          !edram_fragment_shader_interlock &&\n          description.render_pass_key.depth_and_color_used != 0)) {\n    // Using sample 0 as 0 and 3 as 1 for 2x instead (not exactly the same\n    // sample locations, but still top-left and bottom-right - however, this can\n    // be adjusted with custom sample locations).\n    multisample_state.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;\n    sample_mask = 0b1001;\n    // TODO(Triang3l): Research sample mask behavior without attachments (in\n    // Direct3D, it's completely ignored in this case).\n    multisample_state.pSampleMask = &sample_mask;\n  } else {\n    multisample_state.rasterizationSamples = VkSampleCountFlagBits(\n        uint32_t(1) << uint32_t(description.render_pass_key.msaa_samples));\n  }\n\n  VkPipelineDepthStencilStateCreateInfo depth_stencil_state = {};\n  depth_stencil_state.sType =\n      VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;\n  depth_stencil_state.pNext = nullptr;\n  if (!edram_fragment_shader_interlock) {\n    if (description.depth_write_enable ||\n        description.depth_compare_op != xenos::CompareFunction::kAlways) {\n      depth_stencil_state.depthTestEnable = VK_TRUE;\n      depth_stencil_state.depthWriteEnable =\n          description.depth_write_enable ? VK_TRUE : VK_FALSE;\n      depth_stencil_state.depthCompareOp =\n          VkCompareOp(uint32_t(VK_COMPARE_OP_NEVER) +\n                      uint32_t(description.depth_compare_op));\n    }\n    if (description.stencil_test_enable) {\n      depth_stencil_state.stencilTestEnable = VK_TRUE;\n      depth_stencil_state.front.failOp =\n          VkStencilOp(uint32_t(VK_STENCIL_OP_KEEP) +\n                      uint32_t(description.stencil_front_fail_op));\n      depth_stencil_state.front.passOp =\n          VkStencilOp(uint32_t(VK_STENCIL_OP_KEEP) +\n                      uint32_t(description.stencil_front_pass_op));\n      depth_stencil_state.front.depthFailOp =\n          VkStencilOp(uint32_t(VK_STENCIL_OP_KEEP) +\n                      uint32_t(description.stencil_front_depth_fail_op));\n      depth_stencil_state.front.compareOp =\n          VkCompareOp(uint32_t(VK_COMPARE_OP_NEVER) +\n                      uint32_t(description.stencil_front_compare_op));\n      depth_stencil_state.back.failOp =\n          VkStencilOp(uint32_t(VK_STENCIL_OP_KEEP) +\n                      uint32_t(description.stencil_back_fail_op));\n      depth_stencil_state.back.passOp =\n          VkStencilOp(uint32_t(VK_STENCIL_OP_KEEP) +\n                      uint32_t(description.stencil_back_pass_op));\n      depth_stencil_state.back.depthFailOp =\n          VkStencilOp(uint32_t(VK_STENCIL_OP_KEEP) +\n                      uint32_t(description.stencil_back_depth_fail_op));\n      depth_stencil_state.back.compareOp =\n          VkCompareOp(uint32_t(VK_COMPARE_OP_NEVER) +\n                      uint32_t(description.stencil_back_compare_op));\n    }\n  }\n\n  VkPipelineColorBlendStateCreateInfo color_blend_state = {};\n  color_blend_state.sType =\n      VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;\n  VkPipelineColorBlendAttachmentState\n      color_blend_attachments[xenos::kMaxColorRenderTargets] = {};\n  if (!edram_fragment_shader_interlock) {\n    uint32_t color_rts_used =\n        description.render_pass_key.depth_and_color_used >> 1;\n    {\n      static const VkBlendFactor kBlendFactorMap[] = {\n          VK_BLEND_FACTOR_ZERO,\n          VK_BLEND_FACTOR_ONE,\n          VK_BLEND_FACTOR_SRC_COLOR,\n          VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR,\n          VK_BLEND_FACTOR_DST_COLOR,\n          VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR,\n          VK_BLEND_FACTOR_SRC_ALPHA,\n          VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA,\n          VK_BLEND_FACTOR_DST_ALPHA,\n          VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA,\n          VK_BLEND_FACTOR_CONSTANT_COLOR,\n          VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_COLOR,\n          VK_BLEND_FACTOR_CONSTANT_ALPHA,\n          VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA,\n          VK_BLEND_FACTOR_SRC_ALPHA_SATURATE,\n      };\n      // 8 entries for safety since 3 bits from the guest are passed directly.\n      static const VkBlendOp kBlendOpMap[] = {VK_BLEND_OP_ADD,\n                                              VK_BLEND_OP_SUBTRACT,\n                                              VK_BLEND_OP_MIN,\n                                              VK_BLEND_OP_MAX,\n                                              VK_BLEND_OP_REVERSE_SUBTRACT,\n                                              VK_BLEND_OP_ADD,\n                                              VK_BLEND_OP_ADD,\n                                              VK_BLEND_OP_ADD};\n      assert_true(vulkan_device->properties().independentBlend);\n      uint32_t color_rts_remaining = color_rts_used;\n      uint32_t color_rt_index;\n      while (xe::bit_scan_forward(color_rts_remaining, &color_rt_index)) {\n        color_rts_remaining &= ~(uint32_t(1) << color_rt_index);\n        VkPipelineColorBlendAttachmentState& color_blend_attachment =\n            color_blend_attachments[color_rt_index];\n        const PipelineRenderTarget& color_rt =\n            description.render_targets[color_rt_index];\n        if (color_rt.src_color_blend_factor != PipelineBlendFactor::kOne ||\n            color_rt.dst_color_blend_factor != PipelineBlendFactor::kZero ||\n            color_rt.color_blend_op != xenos::BlendOp::kAdd ||\n            color_rt.src_alpha_blend_factor != PipelineBlendFactor::kOne ||\n            color_rt.dst_alpha_blend_factor != PipelineBlendFactor::kZero ||\n            color_rt.alpha_blend_op != xenos::BlendOp::kAdd) {\n          color_blend_attachment.blendEnable = VK_TRUE;\n          color_blend_attachment.srcColorBlendFactor =\n              kBlendFactorMap[uint32_t(color_rt.src_color_blend_factor)];\n          color_blend_attachment.dstColorBlendFactor =\n              kBlendFactorMap[uint32_t(color_rt.dst_color_blend_factor)];\n          color_blend_attachment.colorBlendOp =\n              kBlendOpMap[uint32_t(color_rt.color_blend_op)];\n          color_blend_attachment.srcAlphaBlendFactor =\n              kBlendFactorMap[uint32_t(color_rt.src_alpha_blend_factor)];\n          color_blend_attachment.dstAlphaBlendFactor =\n              kBlendFactorMap[uint32_t(color_rt.dst_alpha_blend_factor)];\n          color_blend_attachment.alphaBlendOp =\n              kBlendOpMap[uint32_t(color_rt.alpha_blend_op)];\n        }\n        color_blend_attachment.colorWriteMask =\n            VkColorComponentFlags(color_rt.color_write_mask);\n      }\n    }\n    color_blend_state.attachmentCount = 32 - xe::lzcnt(color_rts_used);\n    color_blend_state.pAttachments = color_blend_attachments;\n  }\n\n  std::array<VkDynamicState, 7> dynamic_states;\n  VkPipelineDynamicStateCreateInfo dynamic_state;\n  dynamic_state.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;\n  dynamic_state.pNext = nullptr;\n  dynamic_state.flags = 0;\n  dynamic_state.dynamicStateCount = 0;\n  dynamic_state.pDynamicStates = dynamic_states.data();\n  // Regardless of whether some of this state actually has any effect on the\n  // pipeline, marking all as dynamic because otherwise, binding any pipeline\n  // with such state not marked as dynamic will cause the dynamic state to be\n  // invalidated (again, even if it has no effect).\n  dynamic_states[dynamic_state.dynamicStateCount++] = VK_DYNAMIC_STATE_VIEWPORT;\n  dynamic_states[dynamic_state.dynamicStateCount++] = VK_DYNAMIC_STATE_SCISSOR;\n  if (!edram_fragment_shader_interlock) {\n    dynamic_states[dynamic_state.dynamicStateCount++] =\n        VK_DYNAMIC_STATE_DEPTH_BIAS;\n    dynamic_states[dynamic_state.dynamicStateCount++] =\n        VK_DYNAMIC_STATE_BLEND_CONSTANTS;\n    dynamic_states[dynamic_state.dynamicStateCount++] =\n        VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK;\n    dynamic_states[dynamic_state.dynamicStateCount++] =\n        VK_DYNAMIC_STATE_STENCIL_WRITE_MASK;\n    dynamic_states[dynamic_state.dynamicStateCount++] =\n        VK_DYNAMIC_STATE_STENCIL_REFERENCE;\n  }\n\n  VkGraphicsPipelineCreateInfo pipeline_create_info;\n  pipeline_create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;\n  pipeline_create_info.pNext = nullptr;\n  pipeline_create_info.flags = 0;\n  pipeline_create_info.stageCount = shader_stage_count;\n  pipeline_create_info.pStages = shader_stages.data();\n  pipeline_create_info.pVertexInputState = &vertex_input_state;\n  pipeline_create_info.pInputAssemblyState = &input_assembly_state;\n  pipeline_create_info.pTessellationState = nullptr;\n  pipeline_create_info.pViewportState = &viewport_state;\n  pipeline_create_info.pRasterizationState = &rasterization_state;\n  pipeline_create_info.pMultisampleState = &multisample_state;\n  pipeline_create_info.pDepthStencilState = &depth_stencil_state;\n  pipeline_create_info.pColorBlendState = &color_blend_state;\n  pipeline_create_info.pDynamicState = &dynamic_state;\n  pipeline_create_info.layout =\n      creation_arguments.pipeline->second.pipeline_layout->GetPipelineLayout();\n  pipeline_create_info.renderPass = creation_arguments.render_pass;\n  pipeline_create_info.subpass = 0;\n  pipeline_create_info.basePipelineHandle = VK_NULL_HANDLE;\n  pipeline_create_info.basePipelineIndex = -1;\n\n  const ui::vulkan::VulkanDevice::Functions& dfn = vulkan_device->functions();\n  const VkDevice device = vulkan_device->device();\n  VkPipeline pipeline;\n  if (dfn.vkCreateGraphicsPipelines(device, VK_NULL_HANDLE, 1,\n                                    &pipeline_create_info, nullptr,\n                                    &pipeline) != VK_SUCCESS) {\n    // TODO(Triang3l): Move these error messages outside.\n    /* if (creation_arguments.pixel_shader) {\n      XELOGE(\n          \"Failed to create graphics pipeline with VS {:016X}, PS {:016X}\",\n          creation_arguments.vertex_shader->shader().ucode_data_hash(),\n          creation_arguments.pixel_shader->shader().ucode_data_hash());\n    } else {\n      XELOGE(\"Failed to create graphics pipeline with VS {:016X}\",\n             creation_arguments.vertex_shader->shader().ucode_data_hash());\n    } */\n    return false;\n  }\n  creation_arguments.pipeline->second.pipeline = pipeline;\n  return true;\n}\n\n}  // namespace vulkan\n}  // namespace gpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/vulkan/vulkan_pipeline_cache.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_VULKAN_VULKAN_PIPELINE_STATE_CACHE_H_\n#define XENIA_GPU_VULKAN_VULKAN_PIPELINE_STATE_CACHE_H_\n\n#include <cstddef>\n#include <cstring>\n#include <functional>\n#include <memory>\n#include <unordered_map>\n#include <utility>\n\n#include \"xenia/base/hash.h\"\n#include \"xenia/base/platform.h\"\n#include \"xenia/base/xxhash.h\"\n#include \"xenia/gpu/primitive_processor.h\"\n#include \"xenia/gpu/register_file.h\"\n#include \"xenia/gpu/registers.h\"\n#include \"xenia/gpu/spirv_shader_translator.h\"\n#include \"xenia/gpu/vulkan/vulkan_render_target_cache.h\"\n#include \"xenia/gpu/vulkan/vulkan_shader.h\"\n#include \"xenia/gpu/xenos.h\"\n#include \"xenia/ui/vulkan/vulkan_api.h\"\n\nnamespace xe {\nnamespace gpu {\nnamespace vulkan {\n\nclass VulkanCommandProcessor;\n\n// TODO(Triang3l): Create a common base for both the Vulkan and the Direct3D\n// implementations.\nclass VulkanPipelineCache {\n public:\n  static constexpr size_t kLayoutUIDEmpty = 0;\n\n  class PipelineLayoutProvider {\n   public:\n    virtual ~PipelineLayoutProvider() {}\n    virtual VkPipelineLayout GetPipelineLayout() const = 0;\n\n   protected:\n    PipelineLayoutProvider() = default;\n  };\n\n  VulkanPipelineCache(VulkanCommandProcessor& command_processor,\n                      const RegisterFile& register_file,\n                      VulkanRenderTargetCache& render_target_cache,\n                      VkShaderStageFlags guest_shader_vertex_stages);\n  ~VulkanPipelineCache();\n\n  bool Initialize();\n  void Shutdown();\n\n  VulkanShader* LoadShader(xenos::ShaderType shader_type,\n                           const uint32_t* host_address, uint32_t dword_count);\n  // Analyze shader microcode on the translator thread.\n  void AnalyzeShaderUcode(Shader& shader) {\n    shader.AnalyzeUcode(ucode_disasm_buffer_);\n  }\n\n  // Retrieves the shader modification for the current state. The shader must\n  // have microcode analyzed.\n  SpirvShaderTranslator::Modification GetCurrentVertexShaderModification(\n      const Shader& shader,\n      Shader::HostVertexShaderType host_vertex_shader_type,\n      uint32_t interpolator_mask, bool ps_param_gen_used) const;\n  SpirvShaderTranslator::Modification GetCurrentPixelShaderModification(\n      const Shader& shader, uint32_t interpolator_mask,\n      uint32_t param_gen_pos) const;\n\n  bool EnsureShadersTranslated(VulkanShader::VulkanTranslation* vertex_shader,\n                               VulkanShader::VulkanTranslation* pixel_shader);\n  // TODO(Triang3l): Return a deferred creation handle.\n  bool ConfigurePipeline(\n      VulkanShader::VulkanTranslation* vertex_shader,\n      VulkanShader::VulkanTranslation* pixel_shader,\n      const PrimitiveProcessor::ProcessingResult& primitive_processing_result,\n      reg::RB_DEPTHCONTROL normalized_depth_control,\n      uint32_t normalized_color_mask,\n      VulkanRenderTargetCache::RenderPassKey render_pass_key,\n      VkPipeline& pipeline_out,\n      const PipelineLayoutProvider*& pipeline_layout_out);\n\n private:\n  enum class PipelineGeometryShader : uint32_t {\n    kNone,\n    kPointList,\n    kRectangleList,\n    kQuadList,\n  };\n\n  enum class PipelinePrimitiveTopology : uint32_t {\n    kPointList,\n    kLineList,\n    kLineStrip,\n    kTriangleList,\n    kTriangleStrip,\n    kTriangleFan,\n    kLineListWithAdjacency,\n    kPatchList,\n  };\n\n  enum class PipelinePolygonMode : uint32_t {\n    kFill,\n    kLine,\n    kPoint,\n  };\n\n  enum class PipelineBlendFactor : uint32_t {\n    kZero,\n    kOne,\n    kSrcColor,\n    kOneMinusSrcColor,\n    kDstColor,\n    kOneMinusDstColor,\n    kSrcAlpha,\n    kOneMinusSrcAlpha,\n    kDstAlpha,\n    kOneMinusDstAlpha,\n    kConstantColor,\n    kOneMinusConstantColor,\n    kConstantAlpha,\n    kOneMinusConstantAlpha,\n    kSrcAlphaSaturate,\n  };\n\n  // Update PipelineDescription::kVersion if anything is changed!\n  XEPACKEDSTRUCT(PipelineRenderTarget, {\n    PipelineBlendFactor src_color_blend_factor : 4;  // 4\n    PipelineBlendFactor dst_color_blend_factor : 4;  // 8\n    xenos::BlendOp color_blend_op : 3;               // 11\n    PipelineBlendFactor src_alpha_blend_factor : 4;  // 15\n    PipelineBlendFactor dst_alpha_blend_factor : 4;  // 19\n    xenos::BlendOp alpha_blend_op : 3;               // 22\n    uint32_t color_write_mask : 4;                   // 26\n  });\n\n  XEPACKEDSTRUCT(PipelineDescription, {\n    uint64_t vertex_shader_hash;\n    uint64_t vertex_shader_modification;\n    // 0 if no pixel shader.\n    uint64_t pixel_shader_hash;\n    uint64_t pixel_shader_modification;\n    VulkanRenderTargetCache::RenderPassKey render_pass_key;\n\n    // Shader stages.\n    PipelineGeometryShader geometry_shader : 2;  // 2\n    // Input assembly.\n    PipelinePrimitiveTopology primitive_topology : 3;  // 5\n    uint32_t primitive_restart : 1;                    // 6\n    // Rasterization.\n    uint32_t depth_clamp_enable : 1;       // 7\n    PipelinePolygonMode polygon_mode : 2;  // 9\n    uint32_t cull_front : 1;               // 10\n    uint32_t cull_back : 1;                // 11\n    uint32_t front_face_clockwise : 1;     // 12\n    // Depth / stencil.\n    uint32_t depth_write_enable : 1;                      // 13\n    xenos::CompareFunction depth_compare_op : 3;          // 15\n    uint32_t stencil_test_enable : 1;                     // 17\n    xenos::StencilOp stencil_front_fail_op : 3;           // 20\n    xenos::StencilOp stencil_front_pass_op : 3;           // 23\n    xenos::StencilOp stencil_front_depth_fail_op : 3;     // 26\n    xenos::CompareFunction stencil_front_compare_op : 3;  // 29\n    xenos::StencilOp stencil_back_fail_op : 3;            // 32\n\n    xenos::StencilOp stencil_back_pass_op : 3;           // 3\n    xenos::StencilOp stencil_back_depth_fail_op : 3;     // 6\n    xenos::CompareFunction stencil_back_compare_op : 3;  // 9\n\n    // Filled only for the attachments present in the render pass object.\n    PipelineRenderTarget render_targets[xenos::kMaxColorRenderTargets];\n\n    // Including all the padding, for a stable hash.\n    PipelineDescription() { Reset(); }\n    PipelineDescription(const PipelineDescription& description) {\n      std::memcpy(this, &description, sizeof(*this));\n    }\n    PipelineDescription& operator=(const PipelineDescription& description) {\n      std::memcpy(this, &description, sizeof(*this));\n      return *this;\n    }\n    bool operator==(const PipelineDescription& description) const {\n      return std::memcmp(this, &description, sizeof(*this)) == 0;\n    }\n    void Reset() { std::memset(this, 0, sizeof(*this)); }\n    uint64_t GetHash() const { return XXH3_64bits(this, sizeof(*this)); }\n    struct Hasher {\n      size_t operator()(const PipelineDescription& description) const {\n        return size_t(description.GetHash());\n      }\n    };\n  });\n\n  struct Pipeline {\n    VkPipeline pipeline = VK_NULL_HANDLE;\n    // The layouts are owned by the VulkanCommandProcessor, and must not be\n    // destroyed by it while the pipeline cache is active.\n    const PipelineLayoutProvider* pipeline_layout;\n    Pipeline(const PipelineLayoutProvider* pipeline_layout_provider)\n        : pipeline_layout(pipeline_layout_provider) {}\n  };\n\n  // Description that can be passed from the command processor thread to the\n  // creation threads, with everything needed from caches pre-looked-up.\n  struct PipelineCreationArguments {\n    std::pair<const PipelineDescription, Pipeline>* pipeline;\n    const VulkanShader::VulkanTranslation* vertex_shader;\n    const VulkanShader::VulkanTranslation* pixel_shader;\n    VkShaderModule geometry_shader;\n    VkRenderPass render_pass;\n  };\n\n  union GeometryShaderKey {\n    uint32_t key;\n    struct {\n      PipelineGeometryShader type : 2;\n      uint32_t interpolator_count : 5;\n      uint32_t user_clip_plane_count : 3;\n      uint32_t user_clip_plane_cull : 1;\n      uint32_t has_vertex_kill_and : 1;\n      uint32_t has_point_size : 1;\n      uint32_t has_point_coordinates : 1;\n    };\n\n    GeometryShaderKey() : key(0) { static_assert_size(*this, sizeof(key)); }\n\n    struct Hasher {\n      size_t operator()(const GeometryShaderKey& key) const {\n        return std::hash<uint32_t>{}(key.key);\n      }\n    };\n    bool operator==(const GeometryShaderKey& other_key) const {\n      return key == other_key.key;\n    }\n    bool operator!=(const GeometryShaderKey& other_key) const {\n      return !(*this == other_key);\n    }\n  };\n\n  // Can be called from multiple threads.\n  bool TranslateAnalyzedShader(SpirvShaderTranslator& translator,\n                               VulkanShader::VulkanTranslation& translation);\n\n  void WritePipelineRenderTargetDescription(\n      reg::RB_BLENDCONTROL blend_control, uint32_t write_mask,\n      PipelineRenderTarget& render_target_out) const;\n  bool GetCurrentStateDescription(\n      const VulkanShader::VulkanTranslation* vertex_shader,\n      const VulkanShader::VulkanTranslation* pixel_shader,\n      const PrimitiveProcessor::ProcessingResult& primitive_processing_result,\n      reg::RB_DEPTHCONTROL normalized_depth_control,\n      uint32_t normalized_color_mask,\n      VulkanRenderTargetCache::RenderPassKey render_pass_key,\n      PipelineDescription& description_out) const;\n\n  // Whether the pipeline for the given description is supported by the device.\n  bool ArePipelineRequirementsMet(const PipelineDescription& description) const;\n\n  static bool GetGeometryShaderKey(\n      PipelineGeometryShader geometry_shader_type,\n      SpirvShaderTranslator::Modification vertex_shader_modification,\n      SpirvShaderTranslator::Modification pixel_shader_modification,\n      GeometryShaderKey& key_out);\n  VkShaderModule GetGeometryShader(GeometryShaderKey key);\n\n  // Can be called from creation threads - all needed data must be fully set up\n  // at the point of the call: shaders must be translated, pipeline layout and\n  // render pass objects must be available.\n  bool EnsurePipelineCreated(\n      const PipelineCreationArguments& creation_arguments);\n\n  VulkanCommandProcessor& command_processor_;\n  const RegisterFile& register_file_;\n  VulkanRenderTargetCache& render_target_cache_;\n  VkShaderStageFlags guest_shader_vertex_stages_;\n\n  // Temporary storage for AnalyzeUcode calls on the processor thread.\n  StringBuffer ucode_disasm_buffer_;\n  // Reusable shader translator on the command processor thread.\n  std::unique_ptr<SpirvShaderTranslator> shader_translator_;\n\n  struct LayoutUID {\n    size_t uid;\n    size_t vector_span_offset;\n    size_t vector_span_length;\n  };\n  std::mutex layouts_mutex_;\n  // Texture binding layouts of different shaders, for obtaining layout UIDs.\n  std::vector<VulkanShader::TextureBinding> texture_binding_layouts_;\n  // Map of texture binding layouts used by shaders, for obtaining UIDs. Keys\n  // are XXH3 hashes of layouts, values need manual collision resolution using\n  // layout_vector_offset:layout_length of texture_binding_layouts_.\n  std::unordered_multimap<uint64_t, LayoutUID,\n                          xe::hash::IdentityHasher<uint64_t>>\n      texture_binding_layout_map_;\n\n  // Ucode hash -> shader.\n  std::unordered_map<uint64_t, VulkanShader*,\n                     xe::hash::IdentityHasher<uint64_t>>\n      shaders_;\n\n  // Geometry shaders for Xenos primitive types not supported by Vulkan.\n  // Stores VK_NULL_HANDLE if failed to create.\n  std::unordered_map<GeometryShaderKey, VkShaderModule,\n                     GeometryShaderKey::Hasher>\n      geometry_shaders_;\n\n  // Empty depth-only pixel shader for writing to depth buffer using fragment\n  // shader interlock when no Xenos pixel shader provided.\n  VkShaderModule depth_only_fragment_shader_ = VK_NULL_HANDLE;\n\n  std::unordered_map<PipelineDescription, Pipeline, PipelineDescription::Hasher>\n      pipelines_;\n\n  // Previously used pipeline, to avoid lookups if the state wasn't changed.\n  const std::pair<const PipelineDescription, Pipeline>* last_pipeline_ =\n      nullptr;\n};\n\n}  // namespace vulkan\n}  // namespace gpu\n}  // namespace xe\n\n#endif  // XENIA_GPU_VULKAN_VULKAN_PIPELINE_STATE_CACHE_H_\n"
  },
  {
    "path": "src/xenia/gpu/vulkan/vulkan_primitive_processor.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/vulkan/vulkan_primitive_processor.h\"\n\n#include <algorithm>\n#include <cstdint>\n#include <memory>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/gpu/vulkan/deferred_command_buffer.h\"\n#include \"xenia/gpu/vulkan/vulkan_command_processor.h\"\n#include \"xenia/ui/vulkan/vulkan_util.h\"\n\nnamespace xe {\nnamespace gpu {\nnamespace vulkan {\n\nVulkanPrimitiveProcessor::~VulkanPrimitiveProcessor() { Shutdown(true); }\n\nbool VulkanPrimitiveProcessor::Initialize() {\n  const ui::vulkan::VulkanDevice* const vulkan_device =\n      command_processor_.GetVulkanDevice();\n  const ui::vulkan::VulkanDevice::Properties& device_properties =\n      vulkan_device->properties();\n  if (!InitializeCommon(\n          device_properties.fullDrawIndexUint32, device_properties.triangleFans,\n          false, device_properties.geometryShader,\n          device_properties.geometryShader, device_properties.geometryShader)) {\n    Shutdown();\n    return false;\n  }\n  frame_index_buffer_pool_ =\n      std::make_unique<ui::vulkan::VulkanUploadBufferPool>(\n          vulkan_device, VK_BUFFER_USAGE_INDEX_BUFFER_BIT,\n          std::max(size_t(kMinRequiredConvertedIndexBufferSize),\n                   ui::GraphicsUploadBufferPool::kDefaultPageSize));\n  return true;\n}\n\nvoid VulkanPrimitiveProcessor::Shutdown(bool from_destructor) {\n  const ui::vulkan::VulkanDevice* const vulkan_device =\n      command_processor_.GetVulkanDevice();\n  const ui::vulkan::VulkanDevice::Functions& dfn = vulkan_device->functions();\n  const VkDevice device = vulkan_device->device();\n\n  frame_index_buffers_.clear();\n  frame_index_buffer_pool_.reset();\n  ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyBuffer, device,\n                                         builtin_index_buffer_upload_);\n  ui::vulkan::util::DestroyAndNullHandle(dfn.vkFreeMemory, device,\n                                         builtin_index_buffer_upload_memory_);\n  ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyBuffer, device,\n                                         builtin_index_buffer_);\n  ui::vulkan::util::DestroyAndNullHandle(dfn.vkFreeMemory, device,\n                                         builtin_index_buffer_memory_);\n\n  if (!from_destructor) {\n    ShutdownCommon();\n  }\n}\n\nvoid VulkanPrimitiveProcessor::CompletedSubmissionUpdated() {\n  if (builtin_index_buffer_upload_ != VK_NULL_HANDLE &&\n      command_processor_.GetCompletedSubmission() >=\n          builtin_index_buffer_upload_submission_) {\n    const ui::vulkan::VulkanDevice* const vulkan_device =\n        command_processor_.GetVulkanDevice();\n    const ui::vulkan::VulkanDevice::Functions& dfn = vulkan_device->functions();\n    const VkDevice device = vulkan_device->device();\n    ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyBuffer, device,\n                                           builtin_index_buffer_upload_);\n    ui::vulkan::util::DestroyAndNullHandle(dfn.vkFreeMemory, device,\n                                           builtin_index_buffer_upload_memory_);\n  }\n}\n\nvoid VulkanPrimitiveProcessor::BeginSubmission() {\n  if (builtin_index_buffer_upload_ != VK_NULL_HANDLE &&\n      builtin_index_buffer_upload_submission_ == UINT64_MAX) {\n    // No need to submit deferred barriers - builtin_index_buffer_ has never\n    // been used yet, and builtin_index_buffer_upload_ is written before\n    // submitting commands reading it.\n\n    command_processor_.EndRenderPass();\n\n    DeferredCommandBuffer& command_buffer =\n        command_processor_.deferred_command_buffer();\n\n    VkBufferCopy* copy_region = command_buffer.CmdCopyBufferEmplace(\n        builtin_index_buffer_upload_, builtin_index_buffer_, 1);\n    copy_region->srcOffset = 0;\n    copy_region->dstOffset = 0;\n    copy_region->size = builtin_index_buffer_size_;\n\n    command_processor_.PushBufferMemoryBarrier(\n        builtin_index_buffer_, 0, VK_WHOLE_SIZE, VK_PIPELINE_STAGE_TRANSFER_BIT,\n        VK_PIPELINE_STAGE_VERTEX_INPUT_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,\n        VK_ACCESS_INDEX_READ_BIT);\n\n    builtin_index_buffer_upload_submission_ =\n        command_processor_.GetCurrentSubmission();\n  }\n}\n\nvoid VulkanPrimitiveProcessor::BeginFrame() {\n  frame_index_buffer_pool_->Reclaim(command_processor_.GetCompletedFrame());\n}\n\nvoid VulkanPrimitiveProcessor::EndSubmission() {\n  frame_index_buffer_pool_->FlushWrites();\n}\n\nvoid VulkanPrimitiveProcessor::EndFrame() {\n  ClearPerFrameCache();\n  frame_index_buffers_.clear();\n}\n\nbool VulkanPrimitiveProcessor::InitializeBuiltinIndexBuffer(\n    size_t size_bytes, std::function<void(void*)> fill_callback) {\n  assert_not_zero(size_bytes);\n  assert_true(builtin_index_buffer_ == VK_NULL_HANDLE);\n  assert_true(builtin_index_buffer_memory_ == VK_NULL_HANDLE);\n  assert_true(builtin_index_buffer_upload_ == VK_NULL_HANDLE);\n  assert_true(builtin_index_buffer_upload_memory_ == VK_NULL_HANDLE);\n\n  const ui::vulkan::VulkanDevice* const vulkan_device =\n      command_processor_.GetVulkanDevice();\n  const ui::vulkan::VulkanDevice::Functions& dfn = vulkan_device->functions();\n  const VkDevice device = vulkan_device->device();\n\n  builtin_index_buffer_size_ = VkDeviceSize(size_bytes);\n  if (!ui::vulkan::util::CreateDedicatedAllocationBuffer(\n          vulkan_device, builtin_index_buffer_size_,\n          VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT,\n          ui::vulkan::util::MemoryPurpose::kDeviceLocal, builtin_index_buffer_,\n          builtin_index_buffer_memory_)) {\n    XELOGE(\n        \"Vulkan primitive processor: Failed to create the built-in index \"\n        \"buffer GPU resource with {} bytes\",\n        size_bytes);\n    return false;\n  }\n  uint32_t upload_memory_type;\n  if (!ui::vulkan::util::CreateDedicatedAllocationBuffer(\n          vulkan_device, builtin_index_buffer_size_,\n          VK_BUFFER_USAGE_TRANSFER_SRC_BIT,\n          ui::vulkan::util::MemoryPurpose::kUpload,\n          builtin_index_buffer_upload_, builtin_index_buffer_upload_memory_,\n          &upload_memory_type)) {\n    XELOGE(\n        \"Vulkan primitive processor: Failed to create the built-in index \"\n        \"buffer upload resource with {} bytes\",\n        size_bytes);\n    ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyBuffer, device,\n                                           builtin_index_buffer_);\n    ui::vulkan::util::DestroyAndNullHandle(dfn.vkFreeMemory, device,\n                                           builtin_index_buffer_memory_);\n    return false;\n  }\n\n  void* mapping;\n  if (dfn.vkMapMemory(device, builtin_index_buffer_upload_memory_, 0,\n                      VK_WHOLE_SIZE, 0, &mapping) != VK_SUCCESS) {\n    XELOGE(\n        \"Vulkan primitive processor: Failed to map the built-in index buffer \"\n        \"upload resource with {} bytes\",\n        size_bytes);\n    ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyBuffer, device,\n                                           builtin_index_buffer_upload_);\n    ui::vulkan::util::DestroyAndNullHandle(dfn.vkFreeMemory, device,\n                                           builtin_index_buffer_upload_memory_);\n    ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyBuffer, device,\n                                           builtin_index_buffer_);\n    ui::vulkan::util::DestroyAndNullHandle(dfn.vkFreeMemory, device,\n                                           builtin_index_buffer_memory_);\n    return false;\n  }\n  fill_callback(mapping);\n  ui::vulkan::util::FlushMappedMemoryRange(\n      vulkan_device, builtin_index_buffer_memory_, upload_memory_type);\n  dfn.vkUnmapMemory(device, builtin_index_buffer_upload_memory_);\n\n  // Schedule uploading in the first submission.\n  builtin_index_buffer_upload_submission_ = UINT64_MAX;\n  return true;\n}\n\nvoid* VulkanPrimitiveProcessor::RequestHostConvertedIndexBufferForCurrentFrame(\n    xenos::IndexFormat format, uint32_t index_count, bool coalign_for_simd,\n    uint32_t coalignment_original_address, size_t& backend_handle_out) {\n  size_t index_size = format == xenos::IndexFormat::kInt16 ? sizeof(uint16_t)\n                                                           : sizeof(uint32_t);\n  VkBuffer buffer;\n  VkDeviceSize offset;\n  uint8_t* mapping = frame_index_buffer_pool_->Request(\n      command_processor_.GetCurrentFrame(),\n      index_size * index_count +\n          (coalign_for_simd ? XE_GPU_PRIMITIVE_PROCESSOR_SIMD_SIZE : 0),\n      index_size, buffer, offset);\n  if (!mapping) {\n    return nullptr;\n  }\n  if (coalign_for_simd) {\n    ptrdiff_t coalignment_offset =\n        GetSimdCoalignmentOffset(mapping, coalignment_original_address);\n    mapping += coalignment_offset;\n    offset = VkDeviceSize(offset + coalignment_offset);\n  }\n  backend_handle_out = frame_index_buffers_.size();\n  frame_index_buffers_.emplace_back(buffer, offset);\n  return mapping;\n}\n\n}  // namespace vulkan\n}  // namespace gpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/vulkan/vulkan_primitive_processor.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_VULKAN_VULKAN_PRIMITIVE_PROCESSOR_H_\n#define XENIA_GPU_VULKAN_VULKAN_PRIMITIVE_PROCESSOR_H_\n\n#include <memory>\n#include <utility>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/gpu/primitive_processor.h\"\n#include \"xenia/ui/vulkan/vulkan_upload_buffer_pool.h\"\n\nnamespace xe {\nnamespace gpu {\nnamespace vulkan {\n\nclass VulkanCommandProcessor;\n\nclass VulkanPrimitiveProcessor final : public PrimitiveProcessor {\n public:\n  VulkanPrimitiveProcessor(const RegisterFile& register_file, Memory& memory,\n                           TraceWriter& trace_writer,\n                           SharedMemory& shared_memory,\n                           VulkanCommandProcessor& command_processor)\n      : PrimitiveProcessor(register_file, memory, trace_writer, shared_memory),\n        command_processor_(command_processor) {}\n  ~VulkanPrimitiveProcessor();\n\n  bool Initialize();\n  void Shutdown(bool from_destructor = false);\n  void ClearCache() { frame_index_buffer_pool_->ClearCache(); }\n\n  void CompletedSubmissionUpdated();\n  void BeginSubmission();\n  void BeginFrame();\n  void EndSubmission();\n  void EndFrame();\n\n  std::pair<VkBuffer, VkDeviceSize> GetBuiltinIndexBuffer(size_t handle) const {\n    assert_not_null(builtin_index_buffer_);\n    return std::make_pair(\n        builtin_index_buffer_,\n        VkDeviceSize(GetBuiltinIndexBufferOffsetBytes(handle)));\n  }\n  std::pair<VkBuffer, VkDeviceSize> GetConvertedIndexBuffer(\n      size_t handle) const {\n    return frame_index_buffers_[handle];\n  }\n\n protected:\n  bool InitializeBuiltinIndexBuffer(\n      size_t size_bytes, std::function<void(void*)> fill_callback) override;\n\n  void* RequestHostConvertedIndexBufferForCurrentFrame(\n      xenos::IndexFormat format, uint32_t index_count, bool coalign_for_simd,\n      uint32_t coalignment_original_address,\n      size_t& backend_handle_out) override;\n\n private:\n  VulkanCommandProcessor& command_processor_;\n\n  VkDeviceSize builtin_index_buffer_size_ = 0;\n  VkBuffer builtin_index_buffer_ = VK_NULL_HANDLE;\n  VkDeviceMemory builtin_index_buffer_memory_ = VK_NULL_HANDLE;\n  // Temporary buffer copied in the beginning of the first submission for\n  // uploading to builtin_index_buffer_, destroyed when the submission when it\n  // was uploaded is completed.\n  VkBuffer builtin_index_buffer_upload_ = VK_NULL_HANDLE;\n  VkDeviceMemory builtin_index_buffer_upload_memory_ = VK_NULL_HANDLE;\n  // UINT64_MAX means not uploaded yet and needs uploading in the first\n  // submission (if the upload buffer exists at all).\n  uint64_t builtin_index_buffer_upload_submission_ = UINT64_MAX;\n\n  std::unique_ptr<ui::vulkan::VulkanUploadBufferPool> frame_index_buffer_pool_;\n  // Indexed by the backend handles.\n  std::deque<std::pair<VkBuffer, VkDeviceSize>> frame_index_buffers_;\n};\n\n}  // namespace vulkan\n}  // namespace gpu\n}  // namespace xe\n\n#endif  // XENIA_GPU_VULKAN_VULKAN_PRIMITIVE_PROCESSOR_H_\n"
  },
  {
    "path": "src/xenia/gpu/vulkan/vulkan_render_target_cache.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/vulkan/vulkan_render_target_cache.h\"\n\n#include <algorithm>\n#include <array>\n#include <cstddef>\n#include <cstdint>\n#include <cstring>\n#include <memory>\n#include <tuple>\n#include <utility>\n#include <vector>\n\n#include \"third_party/glslang/SPIRV/GLSL.std.450.h\"\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/cvar.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/gpu/draw_util.h\"\n#include \"xenia/gpu/registers.h\"\n#include \"xenia/gpu/spirv_builder.h\"\n#include \"xenia/gpu/spirv_shader_translator.h\"\n#include \"xenia/gpu/texture_cache.h\"\n#include \"xenia/gpu/vulkan/deferred_command_buffer.h\"\n#include \"xenia/gpu/vulkan/vulkan_command_processor.h\"\n#include \"xenia/gpu/xenos.h\"\n#include \"xenia/ui/vulkan/vulkan_util.h\"\n\nDEFINE_string(\n    render_target_path_vulkan, \"\",\n    \"Render target emulation path to use on Vulkan.\\n\"\n    \"Use: [any, fbo, fsi]\\n\"\n    \" fbo:\\n\"\n    \"  Host framebuffers and fixed-function blending and depth / stencil \"\n    \"testing, copying between render targets when needed.\\n\"\n    \"  Lower accuracy (limited pixel format support).\\n\"\n    \"  Performance limited primarily by render target layout changes requiring \"\n    \"copying, but generally higher.\\n\"\n    \" fsi:\\n\"\n    \"  Manual pixel packing, blending and depth / stencil testing, with free \"\n    \"render target layout changes.\\n\"\n    \"  Requires a GPU supporting fragment shader interlock.\\n\"\n    \"  Highest accuracy (all pixel formats handled in software).\\n\"\n    \"  Performance limited primarily by overdraw.\\n\"\n    \" Any other value:\\n\"\n    \"  Choose what is considered the most optimal for the system (currently \"\n    \"always FB because the FSI path is much slower now).\",\n    \"GPU\");\n\nnamespace xe {\nnamespace gpu {\nnamespace vulkan {\n\n// Generated with `xb buildshaders`.\nnamespace shaders {\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/host_depth_store_1xmsaa_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/host_depth_store_2xmsaa_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/host_depth_store_4xmsaa_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/passthrough_position_xy_vs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/resolve_clear_32bpp_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/resolve_clear_32bpp_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/resolve_clear_64bpp_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/resolve_clear_64bpp_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/resolve_fast_32bpp_1x2xmsaa_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/resolve_fast_32bpp_1x2xmsaa_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/resolve_fast_32bpp_4xmsaa_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/resolve_fast_32bpp_4xmsaa_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/resolve_fast_64bpp_1x2xmsaa_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/resolve_fast_64bpp_1x2xmsaa_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/resolve_fast_64bpp_4xmsaa_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/resolve_fast_64bpp_4xmsaa_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/resolve_full_128bpp_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/resolve_full_128bpp_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/resolve_full_16bpp_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/resolve_full_16bpp_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/resolve_full_32bpp_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/resolve_full_32bpp_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/resolve_full_64bpp_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/resolve_full_64bpp_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/resolve_full_8bpp_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/resolve_full_8bpp_scaled_cs.h\"\n}  // namespace shaders\n\nconst VulkanRenderTargetCache::ResolveCopyShaderCode\n    VulkanRenderTargetCache::kResolveCopyShaders[size_t(\n        draw_util::ResolveCopyShaderIndex::kCount)] = {\n        {shaders::resolve_fast_32bpp_1x2xmsaa_cs,\n         sizeof(shaders::resolve_fast_32bpp_1x2xmsaa_cs),\n         shaders::resolve_fast_32bpp_1x2xmsaa_scaled_cs,\n         sizeof(shaders::resolve_fast_32bpp_1x2xmsaa_scaled_cs)},\n        {shaders::resolve_fast_32bpp_4xmsaa_cs,\n         sizeof(shaders::resolve_fast_32bpp_4xmsaa_cs),\n         shaders::resolve_fast_32bpp_4xmsaa_scaled_cs,\n         sizeof(shaders::resolve_fast_32bpp_4xmsaa_scaled_cs)},\n        {shaders::resolve_fast_64bpp_1x2xmsaa_cs,\n         sizeof(shaders::resolve_fast_64bpp_1x2xmsaa_cs),\n         shaders::resolve_fast_64bpp_1x2xmsaa_scaled_cs,\n         sizeof(shaders::resolve_fast_64bpp_1x2xmsaa_scaled_cs)},\n        {shaders::resolve_fast_64bpp_4xmsaa_cs,\n         sizeof(shaders::resolve_fast_64bpp_4xmsaa_cs),\n         shaders::resolve_fast_64bpp_4xmsaa_scaled_cs,\n         sizeof(shaders::resolve_fast_64bpp_4xmsaa_scaled_cs)},\n        {shaders::resolve_full_8bpp_cs, sizeof(shaders::resolve_full_8bpp_cs),\n         shaders::resolve_full_8bpp_scaled_cs,\n         sizeof(shaders::resolve_full_8bpp_scaled_cs)},\n        {shaders::resolve_full_16bpp_cs, sizeof(shaders::resolve_full_16bpp_cs),\n         shaders::resolve_full_16bpp_scaled_cs,\n         sizeof(shaders::resolve_full_16bpp_scaled_cs)},\n        {shaders::resolve_full_32bpp_cs, sizeof(shaders::resolve_full_32bpp_cs),\n         shaders::resolve_full_32bpp_scaled_cs,\n         sizeof(shaders::resolve_full_32bpp_scaled_cs)},\n        {shaders::resolve_full_64bpp_cs, sizeof(shaders::resolve_full_64bpp_cs),\n         shaders::resolve_full_64bpp_scaled_cs,\n         sizeof(shaders::resolve_full_64bpp_scaled_cs)},\n        {shaders::resolve_full_128bpp_cs,\n         sizeof(shaders::resolve_full_128bpp_cs),\n         shaders::resolve_full_128bpp_scaled_cs,\n         sizeof(shaders::resolve_full_128bpp_scaled_cs)},\n};\n\nconst VulkanRenderTargetCache::TransferPipelineLayoutInfo\n    VulkanRenderTargetCache::kTransferPipelineLayoutInfos[size_t(\n        TransferPipelineLayoutIndex::kCount)] = {\n        // kColor\n        {kTransferUsedDescriptorSetColorTextureBit,\n         kTransferUsedPushConstantDwordAddressBit},\n        // kDepth\n        {kTransferUsedDescriptorSetDepthStencilTexturesBit,\n         kTransferUsedPushConstantDwordAddressBit},\n        // kColorToStencilBit\n        {kTransferUsedDescriptorSetColorTextureBit,\n         kTransferUsedPushConstantDwordAddressBit |\n             kTransferUsedPushConstantDwordStencilMaskBit},\n        // kDepthToStencilBit\n        {kTransferUsedDescriptorSetDepthStencilTexturesBit,\n         kTransferUsedPushConstantDwordAddressBit |\n             kTransferUsedPushConstantDwordStencilMaskBit},\n        // kColorAndHostDepthTexture\n        {kTransferUsedDescriptorSetHostDepthStencilTexturesBit |\n             kTransferUsedDescriptorSetColorTextureBit,\n         kTransferUsedPushConstantDwordHostDepthAddressBit |\n             kTransferUsedPushConstantDwordAddressBit},\n        // kColorAndHostDepthBuffer\n        {kTransferUsedDescriptorSetHostDepthBufferBit |\n             kTransferUsedDescriptorSetColorTextureBit,\n         kTransferUsedPushConstantDwordHostDepthAddressBit |\n             kTransferUsedPushConstantDwordAddressBit},\n        // kDepthAndHostDepthTexture\n        {kTransferUsedDescriptorSetHostDepthStencilTexturesBit |\n             kTransferUsedDescriptorSetDepthStencilTexturesBit,\n         kTransferUsedPushConstantDwordHostDepthAddressBit |\n             kTransferUsedPushConstantDwordAddressBit},\n        // kDepthAndHostDepthBuffer\n        {kTransferUsedDescriptorSetHostDepthBufferBit |\n             kTransferUsedDescriptorSetDepthStencilTexturesBit,\n         kTransferUsedPushConstantDwordHostDepthAddressBit |\n             kTransferUsedPushConstantDwordAddressBit},\n};\n\nconst VulkanRenderTargetCache::TransferModeInfo\n    VulkanRenderTargetCache::kTransferModes[size_t(TransferMode::kCount)] = {\n        // kColorToDepth\n        {TransferOutput::kDepth, TransferPipelineLayoutIndex::kColor},\n        // kColorToColor\n        {TransferOutput::kColor, TransferPipelineLayoutIndex::kColor},\n        // kDepthToDepth\n        {TransferOutput::kDepth, TransferPipelineLayoutIndex::kDepth},\n        // kDepthToColor\n        {TransferOutput::kColor, TransferPipelineLayoutIndex::kDepth},\n        // kColorToStencilBit\n        {TransferOutput::kStencilBit,\n         TransferPipelineLayoutIndex::kColorToStencilBit},\n        // kDepthToStencilBit\n        {TransferOutput::kStencilBit,\n         TransferPipelineLayoutIndex::kDepthToStencilBit},\n        // kColorAndHostDepthToDepth\n        {TransferOutput::kDepth,\n         TransferPipelineLayoutIndex::kColorAndHostDepthTexture},\n        // kDepthAndHostDepthToDepth\n        {TransferOutput::kDepth,\n         TransferPipelineLayoutIndex::kDepthAndHostDepthTexture},\n        // kColorAndHostDepthCopyToDepth\n        {TransferOutput::kDepth,\n         TransferPipelineLayoutIndex::kColorAndHostDepthBuffer},\n        // kDepthAndHostDepthCopyToDepth\n        {TransferOutput::kDepth,\n         TransferPipelineLayoutIndex::kDepthAndHostDepthBuffer},\n};\n\nVulkanRenderTargetCache::VulkanRenderTargetCache(\n    const RegisterFile& register_file, const Memory& memory,\n    TraceWriter& trace_writer, uint32_t draw_resolution_scale_x,\n    uint32_t draw_resolution_scale_y, VulkanCommandProcessor& command_processor)\n    : RenderTargetCache(register_file, memory, &trace_writer,\n                        draw_resolution_scale_x, draw_resolution_scale_y),\n      command_processor_(command_processor),\n      trace_writer_(trace_writer) {}\n\nVulkanRenderTargetCache::~VulkanRenderTargetCache() { Shutdown(true); }\n\nbool VulkanRenderTargetCache::Initialize(uint32_t shared_memory_binding_count) {\n  const ui::vulkan::VulkanDevice* const vulkan_device =\n      command_processor_.GetVulkanDevice();\n  const ui::vulkan::VulkanInstance::Functions& ifn =\n      vulkan_device->vulkan_instance()->functions();\n  const VkPhysicalDevice physical_device = vulkan_device->physical_device();\n  const ui::vulkan::VulkanDevice::Functions& dfn = vulkan_device->functions();\n  const VkDevice device = vulkan_device->device();\n  const ui::vulkan::VulkanDevice::Properties& device_properties =\n      vulkan_device->properties();\n\n  if (cvars::render_target_path_vulkan == \"fsi\") {\n    path_ = Path::kPixelShaderInterlock;\n  } else {\n    path_ = Path::kHostRenderTargets;\n  }\n  // Fragment shader interlock is a feature implemented by pretty advanced GPUs,\n  // closer to Direct3D 11 / OpenGL ES 3.2 level mainly, not Direct3D 10 /\n  // OpenGL ES 3.1. Thus, it's fine to demand a wide range of other optional\n  // features for the fragment shader interlock backend to work.\n  if (path_ == Path::kPixelShaderInterlock) {\n    // Interlocking between fragments with common sample coverage is enough, but\n    // interlocking more is acceptable too (fragmentShaderShadingRateInterlock\n    // would be okay too, but it's unlikely that an implementation would\n    // advertise only it and not any other ones, as it's a very specific feature\n    // interacting with another optional feature that is variable shading rate,\n    // so there's no need to overcomplicate the checks and the shader execution\n    // mode setting).\n    // Sample-rate shading is required by certain SPIR-V revisions to access the\n    // sample mask fragment shader input.\n    // Stanard sample locations are needed for calculating the depth at the\n    // samples.\n    // It's unlikely that a device exposing fragment shader interlock won't have\n    // a large enough storage buffer range and a sufficient SSBO slot count for\n    // all the shared memory buffers and the EDRAM buffer - an in a conflict\n    // between, for instance, the ability to vfetch and memexport in fragment\n    // shaders, and the usage of fragment shader interlock, prefer the former\n    // for simplicity.\n    if (!(device_properties.fragmentShaderSampleInterlock ||\n          device_properties.fragmentShaderPixelInterlock) ||\n        !device_properties.fragmentStoresAndAtomics ||\n        !device_properties.sampleRateShading ||\n        !device_properties.standardSampleLocations ||\n        shared_memory_binding_count >=\n            device_properties.maxPerStageDescriptorStorageBuffers) {\n      path_ = Path::kHostRenderTargets;\n    }\n  }\n\n  // Format support.\n  constexpr VkFormatFeatureFlags kUsedDepthFormatFeatures =\n      VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT |\n      VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT;\n  VkFormatProperties depth_unorm24_properties;\n  ifn.vkGetPhysicalDeviceFormatProperties(\n      physical_device, VK_FORMAT_D24_UNORM_S8_UINT, &depth_unorm24_properties);\n  depth_unorm24_vulkan_format_supported_ =\n      (depth_unorm24_properties.optimalTilingFeatures &\n       kUsedDepthFormatFeatures) == kUsedDepthFormatFeatures;\n\n  // 2x MSAA support.\n  // TODO(Triang3l): Handle sampledImageIntegerSampleCounts 4 not supported in\n  // transfers.\n  if (cvars::native_2x_msaa) {\n    // Multisampled integer sampled images are optional in Vulkan and in Xenia.\n    msaa_2x_attachments_supported_ =\n        (device_properties.framebufferColorSampleCounts &\n         device_properties.framebufferDepthSampleCounts &\n         device_properties.framebufferStencilSampleCounts &\n         device_properties.sampledImageColorSampleCounts &\n         device_properties.sampledImageDepthSampleCounts &\n         device_properties.sampledImageStencilSampleCounts &\n         VK_SAMPLE_COUNT_2_BIT) &&\n        (device_properties.sampledImageIntegerSampleCounts &\n         (VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT)) !=\n            VK_SAMPLE_COUNT_4_BIT;\n    msaa_2x_no_attachments_supported_ =\n        (device_properties.framebufferNoAttachmentsSampleCounts &\n         VK_SAMPLE_COUNT_2_BIT) != 0;\n  } else {\n    msaa_2x_attachments_supported_ = false;\n    msaa_2x_no_attachments_supported_ = false;\n  }\n\n  // Descriptor set layouts.\n  VkDescriptorSetLayoutBinding descriptor_set_layout_bindings[2];\n  descriptor_set_layout_bindings[0].binding = 0;\n  descriptor_set_layout_bindings[0].descriptorType =\n      VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;\n  descriptor_set_layout_bindings[0].descriptorCount = 1;\n  descriptor_set_layout_bindings[0].stageFlags =\n      VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_COMPUTE_BIT;\n  descriptor_set_layout_bindings[0].pImmutableSamplers = nullptr;\n  VkDescriptorSetLayoutCreateInfo descriptor_set_layout_create_info;\n  descriptor_set_layout_create_info.sType =\n      VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;\n  descriptor_set_layout_create_info.pNext = nullptr;\n  descriptor_set_layout_create_info.flags = 0;\n  descriptor_set_layout_create_info.bindingCount = 1;\n  descriptor_set_layout_create_info.pBindings = descriptor_set_layout_bindings;\n  if (dfn.vkCreateDescriptorSetLayout(\n          device, &descriptor_set_layout_create_info, nullptr,\n          &descriptor_set_layout_storage_buffer_) != VK_SUCCESS) {\n    XELOGE(\n        \"VulkanRenderTargetCache: Failed to create the descriptor set layout \"\n        \"with one storage buffer\");\n    Shutdown();\n    return false;\n  }\n  descriptor_set_layout_bindings[0].descriptorType =\n      VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;\n  if (dfn.vkCreateDescriptorSetLayout(\n          device, &descriptor_set_layout_create_info, nullptr,\n          &descriptor_set_layout_sampled_image_) != VK_SUCCESS) {\n    XELOGE(\n        \"VulkanRenderTargetCache: Failed to create the descriptor set layout \"\n        \"with one sampled image\");\n    Shutdown();\n    return false;\n  }\n  descriptor_set_layout_bindings[1].binding = 1;\n  descriptor_set_layout_bindings[1].descriptorType =\n      VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;\n  descriptor_set_layout_bindings[1].descriptorCount = 1;\n  descriptor_set_layout_bindings[1].stageFlags =\n      descriptor_set_layout_bindings[0].stageFlags;\n  descriptor_set_layout_bindings[1].pImmutableSamplers = nullptr;\n  descriptor_set_layout_create_info.bindingCount = 2;\n  if (dfn.vkCreateDescriptorSetLayout(\n          device, &descriptor_set_layout_create_info, nullptr,\n          &descriptor_set_layout_sampled_image_x2_) != VK_SUCCESS) {\n    XELOGE(\n        \"VulkanRenderTargetCache: Failed to create the descriptor set layout \"\n        \"with two sampled images\");\n    Shutdown();\n    return false;\n  }\n\n  // Descriptor set pools.\n  // The pool sizes were chosen without a specific reason.\n  VkDescriptorPoolSize descriptor_set_layout_size;\n  descriptor_set_layout_size.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;\n  descriptor_set_layout_size.descriptorCount = 1;\n  descriptor_set_pool_sampled_image_ =\n      std::make_unique<ui::vulkan::SingleLayoutDescriptorSetPool>(\n          vulkan_device, 256, 1, &descriptor_set_layout_size,\n          descriptor_set_layout_sampled_image_);\n  descriptor_set_layout_size.descriptorCount = 2;\n  descriptor_set_pool_sampled_image_x2_ =\n      std::make_unique<ui::vulkan::SingleLayoutDescriptorSetPool>(\n          vulkan_device, 256, 1, &descriptor_set_layout_size,\n          descriptor_set_layout_sampled_image_x2_);\n\n  // EDRAM contents reinterpretation buffer.\n  // 90 MB with 9x resolution scaling - within the minimum\n  // maxStorageBufferRange.\n  if (!ui::vulkan::util::CreateDedicatedAllocationBuffer(\n          vulkan_device,\n          VkDeviceSize(xenos::kEdramSizeBytes *\n                       (draw_resolution_scale_x() * draw_resolution_scale_y())),\n          VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |\n              VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,\n          ui::vulkan::util::MemoryPurpose::kDeviceLocal, edram_buffer_,\n          edram_buffer_memory_)) {\n    XELOGE(\"VulkanRenderTargetCache: Failed to create the EDRAM buffer\");\n    Shutdown();\n    return false;\n  }\n  if (GetPath() == Path::kPixelShaderInterlock) {\n    // The first operation will likely be drawing.\n    edram_buffer_usage_ = EdramBufferUsage::kFragmentReadWrite;\n  } else {\n    // The first operation will likely be depth self-comparison.\n    edram_buffer_usage_ = EdramBufferUsage::kFragmentRead;\n  }\n  edram_buffer_modification_status_ =\n      EdramBufferModificationStatus::kUnmodified;\n  VkDescriptorPoolSize edram_storage_buffer_descriptor_pool_size;\n  edram_storage_buffer_descriptor_pool_size.type =\n      VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;\n  edram_storage_buffer_descriptor_pool_size.descriptorCount = 1;\n  VkDescriptorPoolCreateInfo edram_storage_buffer_descriptor_pool_create_info;\n  edram_storage_buffer_descriptor_pool_create_info.sType =\n      VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;\n  edram_storage_buffer_descriptor_pool_create_info.pNext = nullptr;\n  edram_storage_buffer_descriptor_pool_create_info.flags = 0;\n  edram_storage_buffer_descriptor_pool_create_info.maxSets = 1;\n  edram_storage_buffer_descriptor_pool_create_info.poolSizeCount = 1;\n  edram_storage_buffer_descriptor_pool_create_info.pPoolSizes =\n      &edram_storage_buffer_descriptor_pool_size;\n  if (dfn.vkCreateDescriptorPool(\n          device, &edram_storage_buffer_descriptor_pool_create_info, nullptr,\n          &edram_storage_buffer_descriptor_pool_) != VK_SUCCESS) {\n    XELOGE(\n        \"VulkanRenderTargetCache: Failed to create the EDRAM buffer storage \"\n        \"buffer descriptor pool\");\n    Shutdown();\n    return false;\n  }\n  VkDescriptorSetAllocateInfo edram_storage_buffer_descriptor_set_allocate_info;\n  edram_storage_buffer_descriptor_set_allocate_info.sType =\n      VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;\n  edram_storage_buffer_descriptor_set_allocate_info.pNext = nullptr;\n  edram_storage_buffer_descriptor_set_allocate_info.descriptorPool =\n      edram_storage_buffer_descriptor_pool_;\n  edram_storage_buffer_descriptor_set_allocate_info.descriptorSetCount = 1;\n  edram_storage_buffer_descriptor_set_allocate_info.pSetLayouts =\n      &descriptor_set_layout_storage_buffer_;\n  if (dfn.vkAllocateDescriptorSets(\n          device, &edram_storage_buffer_descriptor_set_allocate_info,\n          &edram_storage_buffer_descriptor_set_) != VK_SUCCESS) {\n    XELOGE(\n        \"VulkanRenderTargetCache: Failed to allocate the EDRAM buffer storage \"\n        \"buffer descriptor set\");\n    Shutdown();\n    return false;\n  }\n  VkDescriptorBufferInfo edram_storage_buffer_descriptor_buffer_info;\n  edram_storage_buffer_descriptor_buffer_info.buffer = edram_buffer_;\n  edram_storage_buffer_descriptor_buffer_info.offset = 0;\n  edram_storage_buffer_descriptor_buffer_info.range = VK_WHOLE_SIZE;\n  VkWriteDescriptorSet edram_storage_buffer_descriptor_write;\n  edram_storage_buffer_descriptor_write.sType =\n      VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;\n  edram_storage_buffer_descriptor_write.pNext = nullptr;\n  edram_storage_buffer_descriptor_write.dstSet =\n      edram_storage_buffer_descriptor_set_;\n  edram_storage_buffer_descriptor_write.dstBinding = 0;\n  edram_storage_buffer_descriptor_write.dstArrayElement = 0;\n  edram_storage_buffer_descriptor_write.descriptorCount = 1;\n  edram_storage_buffer_descriptor_write.descriptorType =\n      VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;\n  edram_storage_buffer_descriptor_write.pImageInfo = nullptr;\n  edram_storage_buffer_descriptor_write.pBufferInfo =\n      &edram_storage_buffer_descriptor_buffer_info;\n  edram_storage_buffer_descriptor_write.pTexelBufferView = nullptr;\n  dfn.vkUpdateDescriptorSets(device, 1, &edram_storage_buffer_descriptor_write,\n                             0, nullptr);\n\n  bool draw_resolution_scaled = IsDrawResolutionScaled();\n\n  // Resolve copy pipeline layout.\n  VkDescriptorSetLayout\n      resolve_copy_descriptor_set_layouts[kResolveCopyDescriptorSetCount] = {};\n  resolve_copy_descriptor_set_layouts[kResolveCopyDescriptorSetEdram] =\n      descriptor_set_layout_storage_buffer_;\n  resolve_copy_descriptor_set_layouts[kResolveCopyDescriptorSetDest] =\n      command_processor_.GetSingleTransientDescriptorLayout(\n          VulkanCommandProcessor::SingleTransientDescriptorLayout ::\n              kStorageBufferCompute);\n  VkPushConstantRange resolve_copy_push_constant_range;\n  resolve_copy_push_constant_range.stageFlags = VK_SHADER_STAGE_COMPUTE_BIT;\n  resolve_copy_push_constant_range.offset = 0;\n  // Potentially binding all of the shared memory at 1x resolution, but only\n  // portions with scaled resolution.\n  resolve_copy_push_constant_range.size =\n      draw_resolution_scaled\n          ? sizeof(draw_util::ResolveCopyShaderConstants::DestRelative)\n          : sizeof(draw_util::ResolveCopyShaderConstants);\n  VkPipelineLayoutCreateInfo resolve_copy_pipeline_layout_create_info;\n  resolve_copy_pipeline_layout_create_info.sType =\n      VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;\n  resolve_copy_pipeline_layout_create_info.pNext = nullptr;\n  resolve_copy_pipeline_layout_create_info.flags = 0;\n  resolve_copy_pipeline_layout_create_info.setLayoutCount =\n      kResolveCopyDescriptorSetCount;\n  resolve_copy_pipeline_layout_create_info.pSetLayouts =\n      resolve_copy_descriptor_set_layouts;\n  resolve_copy_pipeline_layout_create_info.pushConstantRangeCount = 1;\n  resolve_copy_pipeline_layout_create_info.pPushConstantRanges =\n      &resolve_copy_push_constant_range;\n  if (dfn.vkCreatePipelineLayout(\n          device, &resolve_copy_pipeline_layout_create_info, nullptr,\n          &resolve_copy_pipeline_layout_) != VK_SUCCESS) {\n    XELOGE(\n        \"VulkanRenderTargetCache: Failed to create the resolve copy pipeline \"\n        \"layout\");\n    Shutdown();\n    return false;\n  }\n\n  // Resolve copy pipelines.\n  for (size_t i = 0; i < size_t(draw_util::ResolveCopyShaderIndex::kCount);\n       ++i) {\n    const draw_util::ResolveCopyShaderInfo& resolve_copy_shader_info =\n        draw_util::resolve_copy_shader_info[i];\n    const ResolveCopyShaderCode& resolve_copy_shader_code =\n        kResolveCopyShaders[i];\n    // Somewhat verification whether resolve_copy_shaders_ is up to date.\n    assert_true(resolve_copy_shader_code.unscaled &&\n                resolve_copy_shader_code.unscaled_size_bytes &&\n                resolve_copy_shader_code.scaled &&\n                resolve_copy_shader_code.scaled_size_bytes);\n    VkPipeline resolve_copy_pipeline = ui::vulkan::util::CreateComputePipeline(\n        vulkan_device, resolve_copy_pipeline_layout_,\n        draw_resolution_scaled ? resolve_copy_shader_code.scaled\n                               : resolve_copy_shader_code.unscaled,\n        draw_resolution_scaled ? resolve_copy_shader_code.scaled_size_bytes\n                               : resolve_copy_shader_code.unscaled_size_bytes);\n    if (resolve_copy_pipeline == VK_NULL_HANDLE) {\n      XELOGE(\n          \"VulkanRenderTargetCache: Failed to create the resolve copy \"\n          \"pipeline {}\",\n          resolve_copy_shader_info.debug_name);\n      Shutdown();\n      return false;\n    }\n    vulkan_device->SetObjectName(VK_OBJECT_TYPE_PIPELINE, resolve_copy_pipeline,\n                                 resolve_copy_shader_info.debug_name);\n    resolve_copy_pipelines_[i] = resolve_copy_pipeline;\n  }\n\n  // TODO(Triang3l): All paths (FSI).\n\n  if (path_ == Path::kHostRenderTargets) {\n    // Host render targets.\n\n    // TODO(Triang3l): When color space conversion is implemented in the\n    // ownership transfer and resolve dump shaders, allow\n    // `gamma_render_target_as_unorm16` if VK_FORMAT_R16G16B16A16_UNORM supports\n    // the SAMPLED_IMAGE | COLOR_ATTACHMENT | COLOR_ATTACHMENT_BLEND features.\n    gamma_render_target_as_unorm16_ = false;\n\n    depth_float24_round_ = cvars::depth_float24_round;\n\n    // Host depth storing pipeline layout.\n    VkDescriptorSetLayout host_depth_store_descriptor_set_layouts[] = {\n        // Destination EDRAM storage buffer.\n        descriptor_set_layout_storage_buffer_,\n        // Source depth / stencil texture (only depth is used).\n        descriptor_set_layout_sampled_image_x2_,\n    };\n    VkPushConstantRange host_depth_store_push_constant_range;\n    host_depth_store_push_constant_range.stageFlags =\n        VK_SHADER_STAGE_COMPUTE_BIT;\n    host_depth_store_push_constant_range.offset = 0;\n    host_depth_store_push_constant_range.size = sizeof(HostDepthStoreConstants);\n    VkPipelineLayoutCreateInfo host_depth_store_pipeline_layout_create_info;\n    host_depth_store_pipeline_layout_create_info.sType =\n        VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;\n    host_depth_store_pipeline_layout_create_info.pNext = nullptr;\n    host_depth_store_pipeline_layout_create_info.flags = 0;\n    host_depth_store_pipeline_layout_create_info.setLayoutCount =\n        uint32_t(xe::countof(host_depth_store_descriptor_set_layouts));\n    host_depth_store_pipeline_layout_create_info.pSetLayouts =\n        host_depth_store_descriptor_set_layouts;\n    host_depth_store_pipeline_layout_create_info.pushConstantRangeCount = 1;\n    host_depth_store_pipeline_layout_create_info.pPushConstantRanges =\n        &host_depth_store_push_constant_range;\n    if (dfn.vkCreatePipelineLayout(\n            device, &host_depth_store_pipeline_layout_create_info, nullptr,\n            &host_depth_store_pipeline_layout_) != VK_SUCCESS) {\n      XELOGE(\n          \"VulkanRenderTargetCache: Failed to create the host depth storing \"\n          \"pipeline layout\");\n      Shutdown();\n      return false;\n    }\n    const std::pair<const uint32_t*, size_t> host_depth_store_shaders[] = {\n        {shaders::host_depth_store_1xmsaa_cs,\n         sizeof(shaders::host_depth_store_1xmsaa_cs)},\n        {shaders::host_depth_store_2xmsaa_cs,\n         sizeof(shaders::host_depth_store_2xmsaa_cs)},\n        {shaders::host_depth_store_4xmsaa_cs,\n         sizeof(shaders::host_depth_store_4xmsaa_cs)},\n    };\n    for (size_t i = 0; i < xe::countof(host_depth_store_shaders); ++i) {\n      const std::pair<const uint32_t*, size_t> host_depth_store_shader =\n          host_depth_store_shaders[i];\n      VkPipeline host_depth_store_pipeline =\n          ui::vulkan::util::CreateComputePipeline(\n              vulkan_device, host_depth_store_pipeline_layout_,\n              host_depth_store_shader.first, host_depth_store_shader.second);\n      if (host_depth_store_pipeline == VK_NULL_HANDLE) {\n        XELOGE(\n            \"VulkanRenderTargetCache: Failed to create the {}-sample host \"\n            \"depth storing pipeline\",\n            uint32_t(1) << i);\n        Shutdown();\n        return false;\n      }\n      host_depth_store_pipelines_[i] = host_depth_store_pipeline;\n    }\n\n    // Transfer and clear vertex buffer, for quads of up to tile granularity.\n    transfer_vertex_buffer_pool_ =\n        std::make_unique<ui::vulkan::VulkanUploadBufferPool>(\n            vulkan_device, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT,\n            std::max(ui::vulkan::VulkanUploadBufferPool::kDefaultPageSize,\n                     sizeof(float) * 2 * 6 *\n                         Transfer::kMaxCutoutBorderRectangles *\n                         xenos::kEdramTileCount));\n\n    // Transfer vertex shader.\n    transfer_passthrough_vertex_shader_ = ui::vulkan::util::CreateShaderModule(\n        vulkan_device, shaders::passthrough_position_xy_vs,\n        sizeof(shaders::passthrough_position_xy_vs));\n    if (transfer_passthrough_vertex_shader_ == VK_NULL_HANDLE) {\n      XELOGE(\n          \"VulkanRenderTargetCache: Failed to create the render target \"\n          \"ownership transfer vertex shader\");\n      Shutdown();\n      return false;\n    }\n\n    // Transfer pipeline layouts.\n    VkDescriptorSetLayout transfer_pipeline_layout_descriptor_set_layouts\n        [kTransferUsedDescriptorSetCount];\n    VkPushConstantRange transfer_pipeline_layout_push_constant_range;\n    transfer_pipeline_layout_push_constant_range.stageFlags =\n        VK_SHADER_STAGE_FRAGMENT_BIT;\n    transfer_pipeline_layout_push_constant_range.offset = 0;\n    VkPipelineLayoutCreateInfo transfer_pipeline_layout_create_info;\n    transfer_pipeline_layout_create_info.sType =\n        VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;\n    transfer_pipeline_layout_create_info.pNext = nullptr;\n    transfer_pipeline_layout_create_info.flags = 0;\n    transfer_pipeline_layout_create_info.pSetLayouts =\n        transfer_pipeline_layout_descriptor_set_layouts;\n    transfer_pipeline_layout_create_info.pPushConstantRanges =\n        &transfer_pipeline_layout_push_constant_range;\n    for (size_t i = 0; i < size_t(TransferPipelineLayoutIndex::kCount); ++i) {\n      const TransferPipelineLayoutInfo& transfer_pipeline_layout_info =\n          kTransferPipelineLayoutInfos[i];\n      transfer_pipeline_layout_create_info.setLayoutCount = 0;\n      uint32_t transfer_pipeline_layout_descriptor_sets_remaining =\n          transfer_pipeline_layout_info.used_descriptor_sets;\n      uint32_t transfer_pipeline_layout_descriptor_set_index;\n      while (xe::bit_scan_forward(\n          transfer_pipeline_layout_descriptor_sets_remaining,\n          &transfer_pipeline_layout_descriptor_set_index)) {\n        transfer_pipeline_layout_descriptor_sets_remaining &=\n            ~(uint32_t(1) << transfer_pipeline_layout_descriptor_set_index);\n        VkDescriptorSetLayout transfer_pipeline_layout_descriptor_set_layout =\n            VK_NULL_HANDLE;\n        switch (TransferUsedDescriptorSet(\n            transfer_pipeline_layout_descriptor_set_index)) {\n          case kTransferUsedDescriptorSetHostDepthBuffer:\n            transfer_pipeline_layout_descriptor_set_layout =\n                descriptor_set_layout_storage_buffer_;\n            break;\n          case kTransferUsedDescriptorSetHostDepthStencilTextures:\n          case kTransferUsedDescriptorSetDepthStencilTextures:\n            transfer_pipeline_layout_descriptor_set_layout =\n                descriptor_set_layout_sampled_image_x2_;\n            break;\n          case kTransferUsedDescriptorSetColorTexture:\n            transfer_pipeline_layout_descriptor_set_layout =\n                descriptor_set_layout_sampled_image_;\n            break;\n          default:\n            assert_unhandled_case(TransferUsedDescriptorSet(\n                transfer_pipeline_layout_descriptor_set_index));\n        }\n        transfer_pipeline_layout_descriptor_set_layouts\n            [transfer_pipeline_layout_create_info.setLayoutCount++] =\n                transfer_pipeline_layout_descriptor_set_layout;\n      }\n      transfer_pipeline_layout_push_constant_range.size = uint32_t(\n          sizeof(uint32_t) *\n          xe::bit_count(\n              transfer_pipeline_layout_info.used_push_constant_dwords));\n      transfer_pipeline_layout_create_info.pushConstantRangeCount =\n          transfer_pipeline_layout_info.used_push_constant_dwords ? 1 : 0;\n      if (dfn.vkCreatePipelineLayout(\n              device, &transfer_pipeline_layout_create_info, nullptr,\n              &transfer_pipeline_layouts_[i]) != VK_SUCCESS) {\n        XELOGE(\n            \"VulkanRenderTargetCache: Failed to create the render target \"\n            \"ownership transfer pipeline layout {}\",\n            i);\n        Shutdown();\n        return false;\n      }\n    }\n\n    // Dump pipeline layouts.\n    VkDescriptorSetLayout\n        dump_pipeline_layout_descriptor_set_layouts[kDumpDescriptorSetCount];\n    dump_pipeline_layout_descriptor_set_layouts[kDumpDescriptorSetEdram] =\n        descriptor_set_layout_storage_buffer_;\n    dump_pipeline_layout_descriptor_set_layouts[kDumpDescriptorSetSource] =\n        descriptor_set_layout_sampled_image_;\n    VkPushConstantRange dump_pipeline_layout_push_constant_range;\n    dump_pipeline_layout_push_constant_range.stageFlags =\n        VK_SHADER_STAGE_COMPUTE_BIT;\n    dump_pipeline_layout_push_constant_range.offset = 0;\n    dump_pipeline_layout_push_constant_range.size =\n        sizeof(uint32_t) * kDumpPushConstantCount;\n    VkPipelineLayoutCreateInfo dump_pipeline_layout_create_info;\n    dump_pipeline_layout_create_info.sType =\n        VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;\n    dump_pipeline_layout_create_info.pNext = nullptr;\n    dump_pipeline_layout_create_info.flags = 0;\n    dump_pipeline_layout_create_info.setLayoutCount =\n        uint32_t(xe::countof(dump_pipeline_layout_descriptor_set_layouts));\n    dump_pipeline_layout_create_info.pSetLayouts =\n        dump_pipeline_layout_descriptor_set_layouts;\n    dump_pipeline_layout_create_info.pushConstantRangeCount = 1;\n    dump_pipeline_layout_create_info.pPushConstantRanges =\n        &dump_pipeline_layout_push_constant_range;\n    if (dfn.vkCreatePipelineLayout(device, &dump_pipeline_layout_create_info,\n                                   nullptr, &dump_pipeline_layout_color_) !=\n        VK_SUCCESS) {\n      XELOGE(\n          \"VulkanRenderTargetCache: Failed to create the color render target \"\n          \"dumping pipeline layout\");\n      Shutdown();\n      return false;\n    }\n    dump_pipeline_layout_descriptor_set_layouts[kDumpDescriptorSetSource] =\n        descriptor_set_layout_sampled_image_x2_;\n    if (dfn.vkCreatePipelineLayout(device, &dump_pipeline_layout_create_info,\n                                   nullptr, &dump_pipeline_layout_depth_) !=\n        VK_SUCCESS) {\n      XELOGE(\n          \"VulkanRenderTargetCache: Failed to create the depth render target \"\n          \"dumping pipeline layout\");\n      Shutdown();\n      return false;\n    }\n  } else if (path_ == Path::kPixelShaderInterlock) {\n    // Pixel (fragment) shader interlock.\n\n    // Piecewise linear gamma is 8-bit with programmable blending.\n    gamma_render_target_as_unorm16_ = false;\n\n    // Always true float24 depth rounded to the nearest even.\n    depth_float24_round_ = true;\n\n    // The pipeline layout and the pipelines for clearing the EDRAM buffer in\n    // resolves.\n    VkPushConstantRange resolve_fsi_clear_push_constant_range;\n    resolve_fsi_clear_push_constant_range.stageFlags =\n        VK_SHADER_STAGE_COMPUTE_BIT;\n    resolve_fsi_clear_push_constant_range.offset = 0;\n    resolve_fsi_clear_push_constant_range.size =\n        sizeof(draw_util::ResolveClearShaderConstants);\n    VkPipelineLayoutCreateInfo resolve_fsi_clear_pipeline_layout_create_info;\n    resolve_fsi_clear_pipeline_layout_create_info.sType =\n        VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;\n    resolve_fsi_clear_pipeline_layout_create_info.pNext = nullptr;\n    resolve_fsi_clear_pipeline_layout_create_info.flags = 0;\n    resolve_fsi_clear_pipeline_layout_create_info.setLayoutCount = 1;\n    resolve_fsi_clear_pipeline_layout_create_info.pSetLayouts =\n        &descriptor_set_layout_storage_buffer_;\n    resolve_fsi_clear_pipeline_layout_create_info.pushConstantRangeCount = 1;\n    resolve_fsi_clear_pipeline_layout_create_info.pPushConstantRanges =\n        &resolve_fsi_clear_push_constant_range;\n    if (dfn.vkCreatePipelineLayout(\n            device, &resolve_fsi_clear_pipeline_layout_create_info, nullptr,\n            &resolve_fsi_clear_pipeline_layout_) != VK_SUCCESS) {\n      XELOGE(\n          \"VulkanRenderTargetCache: Failed to create the resolve EDRAM buffer \"\n          \"clear pipeline layout\");\n      Shutdown();\n      return false;\n    }\n    resolve_fsi_clear_32bpp_pipeline_ = ui::vulkan::util::CreateComputePipeline(\n        vulkan_device, resolve_fsi_clear_pipeline_layout_,\n        draw_resolution_scaled ? shaders::resolve_clear_32bpp_scaled_cs\n                               : shaders::resolve_clear_32bpp_cs,\n        draw_resolution_scaled ? sizeof(shaders::resolve_clear_32bpp_scaled_cs)\n                               : sizeof(shaders::resolve_clear_32bpp_cs));\n    if (resolve_fsi_clear_32bpp_pipeline_ == VK_NULL_HANDLE) {\n      XELOGE(\n          \"VulkanRenderTargetCache: Failed to create the 32bpp resolve EDRAM \"\n          \"buffer clear pipeline\");\n      Shutdown();\n      return false;\n    }\n    resolve_fsi_clear_64bpp_pipeline_ = ui::vulkan::util::CreateComputePipeline(\n        vulkan_device, resolve_fsi_clear_pipeline_layout_,\n        draw_resolution_scaled ? shaders::resolve_clear_64bpp_scaled_cs\n                               : shaders::resolve_clear_64bpp_cs,\n        draw_resolution_scaled ? sizeof(shaders::resolve_clear_64bpp_scaled_cs)\n                               : sizeof(shaders::resolve_clear_64bpp_cs));\n    if (resolve_fsi_clear_32bpp_pipeline_ == VK_NULL_HANDLE) {\n      XELOGE(\n          \"VulkanRenderTargetCache: Failed to create the 64bpp resolve EDRAM \"\n          \"buffer clear pipeline\");\n      Shutdown();\n      return false;\n    }\n\n    // Common render pass.\n    VkSubpassDescription fsi_subpass = {};\n    fsi_subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;\n    // Fragment shader interlock provides synchronization and ordering within a\n    // subpass, create an external by-region dependency to maintain interlocking\n    // between passes. Framebuffer-global dependencies will be made with\n    // explicit barriers when the addressing of the EDRAM buffer relatively to\n    // the fragment coordinates is changed.\n    VkSubpassDependency fsi_subpass_dependencies[2];\n    fsi_subpass_dependencies[0].srcSubpass = VK_SUBPASS_EXTERNAL;\n    fsi_subpass_dependencies[0].dstSubpass = 0;\n    fsi_subpass_dependencies[0].srcStageMask =\n        VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;\n    fsi_subpass_dependencies[0].dstStageMask =\n        VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;\n    fsi_subpass_dependencies[0].srcAccessMask =\n        VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT;\n    fsi_subpass_dependencies[0].dstAccessMask =\n        VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT;\n    fsi_subpass_dependencies[0].dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;\n    fsi_subpass_dependencies[1] = fsi_subpass_dependencies[0];\n    std::swap(fsi_subpass_dependencies[1].srcSubpass,\n              fsi_subpass_dependencies[1].dstSubpass);\n    VkRenderPassCreateInfo fsi_render_pass_create_info;\n    fsi_render_pass_create_info.sType =\n        VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;\n    fsi_render_pass_create_info.pNext = nullptr;\n    fsi_render_pass_create_info.flags = 0;\n    fsi_render_pass_create_info.attachmentCount = 0;\n    fsi_render_pass_create_info.pAttachments = nullptr;\n    fsi_render_pass_create_info.subpassCount = 1;\n    fsi_render_pass_create_info.pSubpasses = &fsi_subpass;\n    fsi_render_pass_create_info.dependencyCount =\n        uint32_t(xe::countof(fsi_subpass_dependencies));\n    fsi_render_pass_create_info.pDependencies = fsi_subpass_dependencies;\n    if (dfn.vkCreateRenderPass(device, &fsi_render_pass_create_info, nullptr,\n                               &fsi_render_pass_) != VK_SUCCESS) {\n      XELOGE(\n          \"VulkanRenderTargetCache: Failed to create the fragment shader \"\n          \"interlock render backend render pass\");\n      Shutdown();\n      return false;\n    }\n\n    // Common framebuffer.\n    VkFramebufferCreateInfo fsi_framebuffer_create_info;\n    fsi_framebuffer_create_info.sType =\n        VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;\n    fsi_framebuffer_create_info.pNext = nullptr;\n    fsi_framebuffer_create_info.flags = 0;\n    fsi_framebuffer_create_info.renderPass = fsi_render_pass_;\n    fsi_framebuffer_create_info.attachmentCount = 0;\n    fsi_framebuffer_create_info.pAttachments = nullptr;\n    fsi_framebuffer_create_info.width = std::min(\n        xenos::kTexture2DCubeMaxWidthHeight * draw_resolution_scale_x(),\n        device_properties.maxFramebufferWidth);\n    fsi_framebuffer_create_info.height = std::min(\n        xenos::kTexture2DCubeMaxWidthHeight * draw_resolution_scale_y(),\n        device_properties.maxFramebufferHeight);\n    fsi_framebuffer_create_info.layers = 1;\n    if (dfn.vkCreateFramebuffer(device, &fsi_framebuffer_create_info, nullptr,\n                                &fsi_framebuffer_.framebuffer) != VK_SUCCESS) {\n      XELOGE(\n          \"VulkanRenderTargetCache: Failed to create the fragment shader \"\n          \"interlock render backend framebuffer\");\n      Shutdown();\n      return false;\n    }\n    fsi_framebuffer_.host_extent.width = fsi_framebuffer_create_info.width;\n    fsi_framebuffer_.host_extent.height = fsi_framebuffer_create_info.height;\n  } else {\n    assert_unhandled_case(path_);\n    Shutdown();\n    return false;\n  }\n\n  // Reset the last update structures, to keep the defaults consistent between\n  // paths regardless of whether the update for the path actually modifies them.\n  last_update_render_pass_key_ = RenderPassKey();\n  last_update_render_pass_ = VK_NULL_HANDLE;\n  last_update_framebuffer_pitch_tiles_at_32bpp_ = 0;\n  std::memset(last_update_framebuffer_attachments_, 0,\n              sizeof(last_update_framebuffer_attachments_));\n  last_update_framebuffer_ = VK_NULL_HANDLE;\n\n  InitializeCommon();\n  return true;\n}\n\nvoid VulkanRenderTargetCache::Shutdown(bool from_destructor) {\n  const ui::vulkan::VulkanDevice* const vulkan_device =\n      command_processor_.GetVulkanDevice();\n  const ui::vulkan::VulkanDevice::Functions& dfn = vulkan_device->functions();\n  const VkDevice device = vulkan_device->device();\n\n  // Destroy all render targets before the descriptor set pool is destroyed -\n  // may happen if shutting down the VulkanRenderTargetCache by destroying it,\n  // so ShutdownCommon is called by the RenderTargetCache destructor, when it's\n  // already too late.\n  DestroyAllRenderTargets(true);\n\n  ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyPipeline, device,\n                                         resolve_fsi_clear_64bpp_pipeline_);\n  ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyPipeline, device,\n                                         resolve_fsi_clear_32bpp_pipeline_);\n  ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyPipelineLayout, device,\n                                         resolve_fsi_clear_pipeline_layout_);\n\n  ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyFramebuffer, device,\n                                         fsi_framebuffer_.framebuffer);\n  ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyRenderPass, device,\n                                         fsi_render_pass_);\n\n  for (const auto& dump_pipeline_pair : dump_pipelines_) {\n    // May be null to prevent recreation attempts.\n    if (dump_pipeline_pair.second != VK_NULL_HANDLE) {\n      dfn.vkDestroyPipeline(device, dump_pipeline_pair.second, nullptr);\n    }\n  }\n  ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyPipelineLayout, device,\n                                         dump_pipeline_layout_depth_);\n  ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyPipelineLayout, device,\n                                         dump_pipeline_layout_color_);\n\n  for (const auto& transfer_pipeline_array_pair : transfer_pipelines_) {\n    for (VkPipeline transfer_pipeline : transfer_pipeline_array_pair.second) {\n      // May be null to prevent recreation attempts.\n      if (transfer_pipeline != VK_NULL_HANDLE) {\n        dfn.vkDestroyPipeline(device, transfer_pipeline, nullptr);\n      }\n    }\n  }\n  transfer_pipelines_.clear();\n  for (const auto& transfer_shader_pair : transfer_shaders_) {\n    if (transfer_shader_pair.second != VK_NULL_HANDLE) {\n      dfn.vkDestroyShaderModule(device, transfer_shader_pair.second, nullptr);\n    }\n  }\n  transfer_shaders_.clear();\n  for (size_t i = 0; i < size_t(TransferPipelineLayoutIndex::kCount); ++i) {\n    ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyPipelineLayout, device,\n                                           transfer_pipeline_layouts_[i]);\n  }\n  ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyShaderModule, device,\n                                         transfer_passthrough_vertex_shader_);\n  transfer_vertex_buffer_pool_.reset();\n\n  for (size_t i = 0; i < xe::countof(host_depth_store_pipelines_); ++i) {\n    ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyPipeline, device,\n                                           host_depth_store_pipelines_[i]);\n  }\n  ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyPipelineLayout, device,\n                                         host_depth_store_pipeline_layout_);\n\n  last_update_framebuffer_ = VK_NULL_HANDLE;\n  for (const auto& framebuffer_pair : framebuffers_) {\n    dfn.vkDestroyFramebuffer(device, framebuffer_pair.second.framebuffer,\n                             nullptr);\n  }\n  framebuffers_.clear();\n\n  last_update_render_pass_ = VK_NULL_HANDLE;\n  for (const auto& render_pass_pair : render_passes_) {\n    if (render_pass_pair.second != VK_NULL_HANDLE) {\n      dfn.vkDestroyRenderPass(device, render_pass_pair.second, nullptr);\n    }\n  }\n  render_passes_.clear();\n\n  for (VkPipeline& resolve_copy_pipeline : resolve_copy_pipelines_) {\n    ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyPipeline, device,\n                                           resolve_copy_pipeline);\n  }\n  ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyPipelineLayout, device,\n                                         resolve_copy_pipeline_layout_);\n\n  ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyDescriptorPool, device,\n                                         edram_storage_buffer_descriptor_pool_);\n  ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyBuffer, device,\n                                         edram_buffer_);\n  ui::vulkan::util::DestroyAndNullHandle(dfn.vkFreeMemory, device,\n                                         edram_buffer_memory_);\n\n  descriptor_set_pool_sampled_image_x2_.reset();\n  descriptor_set_pool_sampled_image_.reset();\n\n  ui::vulkan::util::DestroyAndNullHandle(\n      dfn.vkDestroyDescriptorSetLayout, device,\n      descriptor_set_layout_sampled_image_x2_);\n  ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyDescriptorSetLayout,\n                                         device,\n                                         descriptor_set_layout_sampled_image_);\n  ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyDescriptorSetLayout,\n                                         device,\n                                         descriptor_set_layout_storage_buffer_);\n\n  if (!from_destructor) {\n    ShutdownCommon();\n  }\n}\n\nvoid VulkanRenderTargetCache::ClearCache() {\n  const ui::vulkan::VulkanDevice* const vulkan_device =\n      command_processor_.GetVulkanDevice();\n  const ui::vulkan::VulkanDevice::Functions& dfn = vulkan_device->functions();\n  const VkDevice device = vulkan_device->device();\n\n  // Framebuffer objects must be destroyed because they reference views of\n  // attachment images, which may be removed by the common ClearCache.\n  last_update_framebuffer_ = VK_NULL_HANDLE;\n  for (const auto& framebuffer_pair : framebuffers_) {\n    dfn.vkDestroyFramebuffer(device, framebuffer_pair.second.framebuffer,\n                             nullptr);\n  }\n  framebuffers_.clear();\n\n  last_update_render_pass_ = VK_NULL_HANDLE;\n  for (const auto& render_pass_pair : render_passes_) {\n    dfn.vkDestroyRenderPass(device, render_pass_pair.second, nullptr);\n  }\n  render_passes_.clear();\n\n  RenderTargetCache::ClearCache();\n}\n\nvoid VulkanRenderTargetCache::CompletedSubmissionUpdated() {\n  if (transfer_vertex_buffer_pool_) {\n    transfer_vertex_buffer_pool_->Reclaim(\n        command_processor_.GetCompletedSubmission());\n  }\n}\n\nvoid VulkanRenderTargetCache::EndSubmission() {\n  if (transfer_vertex_buffer_pool_) {\n    transfer_vertex_buffer_pool_->FlushWrites();\n  }\n}\n\nbool VulkanRenderTargetCache::Resolve(const Memory& memory,\n                                      VulkanSharedMemory& shared_memory,\n                                      VulkanTextureCache& texture_cache,\n                                      uint32_t& written_address_out,\n                                      uint32_t& written_length_out) {\n  written_address_out = 0;\n  written_length_out = 0;\n\n  bool draw_resolution_scaled = IsDrawResolutionScaled();\n\n  draw_util::ResolveInfo resolve_info;\n  if (!draw_util::GetResolveInfo(\n          register_file(), memory, trace_writer_, draw_resolution_scale_x(),\n          draw_resolution_scale_y(), IsFixedRG16TruncatedToMinus1To1(),\n          IsFixedRGBA16TruncatedToMinus1To1(), resolve_info)) {\n    return false;\n  }\n\n  // Nothing to copy/clear.\n  if (!resolve_info.coordinate_info.width_div_8 || !resolve_info.height_div_8) {\n    return true;\n  }\n\n  const ui::vulkan::VulkanDevice* const vulkan_device =\n      command_processor_.GetVulkanDevice();\n  const ui::vulkan::VulkanDevice::Functions& dfn = vulkan_device->functions();\n  const VkDevice device = vulkan_device->device();\n  DeferredCommandBuffer& command_buffer =\n      command_processor_.deferred_command_buffer();\n\n  // Copying.\n  bool copied = false;\n  if (resolve_info.copy_dest_extent_length) {\n    if (GetPath() == Path::kHostRenderTargets) {\n      // Dump the current contents of the render targets owning the affected\n      // range to edram_buffer_.\n      // TODO(Triang3l): Direct host render target -> shared memory resolve\n      // shaders for non-converting cases.\n      uint32_t dump_base;\n      uint32_t dump_row_length_used;\n      uint32_t dump_rows;\n      uint32_t dump_pitch;\n      resolve_info.GetCopyEdramTileSpan(dump_base, dump_row_length_used,\n                                        dump_rows, dump_pitch);\n      DumpRenderTargets(dump_base, dump_row_length_used, dump_rows, dump_pitch);\n    }\n\n    draw_util::ResolveCopyShaderConstants copy_shader_constants;\n    uint32_t copy_group_count_x, copy_group_count_y;\n    draw_util::ResolveCopyShaderIndex copy_shader = resolve_info.GetCopyShader(\n        draw_resolution_scale_x(), draw_resolution_scale_y(),\n        copy_shader_constants, copy_group_count_x, copy_group_count_y);\n    assert_true(copy_group_count_x && copy_group_count_y);\n    if (copy_shader != draw_util::ResolveCopyShaderIndex::kUnknown) {\n      const draw_util::ResolveCopyShaderInfo& copy_shader_info =\n          draw_util::resolve_copy_shader_info[size_t(copy_shader)];\n\n      // Make sure there is memory to write to.\n      bool copy_dest_committed;\n      // TODO(Triang3l): Resolution-scaled buffer committing.\n      copy_dest_committed =\n          shared_memory.RequestRange(resolve_info.copy_dest_extent_start,\n                                     resolve_info.copy_dest_extent_length);\n      if (!copy_dest_committed) {\n        XELOGE(\n            \"VulkanRenderTargetCache: Failed to obtain the resolve destination \"\n            \"memory region\");\n      } else {\n        // TODO(Triang3l): Switching between descriptors if exceeding\n        // maxStorageBufferRange.\n        // TODO(Triang3l): Use a single 512 MB shared memory binding if\n        // possible.\n        VkDescriptorSet descriptor_set_dest =\n            command_processor_.AllocateSingleTransientDescriptor(\n                VulkanCommandProcessor::SingleTransientDescriptorLayout ::\n                    kStorageBufferCompute);\n        if (descriptor_set_dest != VK_NULL_HANDLE) {\n          // Write the destination descriptor.\n          // TODO(Triang3l): Scaled resolve buffer binding.\n          VkDescriptorBufferInfo write_descriptor_set_dest_buffer_info;\n          write_descriptor_set_dest_buffer_info.buffer = shared_memory.buffer();\n          write_descriptor_set_dest_buffer_info.offset =\n              resolve_info.copy_dest_base;\n          write_descriptor_set_dest_buffer_info.range =\n              resolve_info.copy_dest_extent_start -\n              resolve_info.copy_dest_base +\n              resolve_info.copy_dest_extent_length;\n          VkWriteDescriptorSet write_descriptor_set_dest;\n          write_descriptor_set_dest.sType =\n              VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;\n          write_descriptor_set_dest.pNext = nullptr;\n          write_descriptor_set_dest.dstSet = descriptor_set_dest;\n          write_descriptor_set_dest.dstBinding = 0;\n          write_descriptor_set_dest.dstArrayElement = 0;\n          write_descriptor_set_dest.descriptorCount = 1;\n          write_descriptor_set_dest.descriptorType =\n              VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;\n          write_descriptor_set_dest.pImageInfo = nullptr;\n          write_descriptor_set_dest.pBufferInfo =\n              &write_descriptor_set_dest_buffer_info;\n          write_descriptor_set_dest.pTexelBufferView = nullptr;\n          dfn.vkUpdateDescriptorSets(device, 1, &write_descriptor_set_dest, 0,\n                                     nullptr);\n\n          // Submit the resolve.\n          // TODO(Triang3l): Transition the scaled resolve buffer.\n          shared_memory.Use(VulkanSharedMemory::Usage::kComputeWrite,\n                            std::pair<uint32_t, uint32_t>(\n                                resolve_info.copy_dest_extent_start,\n                                resolve_info.copy_dest_extent_length));\n          UseEdramBuffer(EdramBufferUsage::kComputeRead);\n          command_processor_.BindExternalComputePipeline(\n              resolve_copy_pipelines_[size_t(copy_shader)]);\n          VkDescriptorSet descriptor_sets[kResolveCopyDescriptorSetCount] = {};\n          descriptor_sets[kResolveCopyDescriptorSetEdram] =\n              edram_storage_buffer_descriptor_set_;\n          descriptor_sets[kResolveCopyDescriptorSetDest] = descriptor_set_dest;\n          command_buffer.CmdVkBindDescriptorSets(\n              VK_PIPELINE_BIND_POINT_COMPUTE, resolve_copy_pipeline_layout_, 0,\n              uint32_t(xe::countof(descriptor_sets)), descriptor_sets, 0,\n              nullptr);\n          if (draw_resolution_scaled) {\n            command_buffer.CmdVkPushConstants(\n                resolve_copy_pipeline_layout_, VK_SHADER_STAGE_COMPUTE_BIT, 0,\n                sizeof(copy_shader_constants.dest_relative),\n                &copy_shader_constants.dest_relative);\n          } else {\n            // TODO(Triang3l): Proper dest_base in case of one 512 MB shared\n            // memory binding, or multiple shared memory bindings in case of\n            // splitting due to maxStorageBufferRange overflow.\n            copy_shader_constants.dest_base -=\n                uint32_t(write_descriptor_set_dest_buffer_info.offset);\n            command_buffer.CmdVkPushConstants(\n                resolve_copy_pipeline_layout_, VK_SHADER_STAGE_COMPUTE_BIT, 0,\n                sizeof(copy_shader_constants), &copy_shader_constants);\n          }\n          command_processor_.SubmitBarriers(true);\n          command_buffer.CmdVkDispatch(copy_group_count_x, copy_group_count_y,\n                                       1);\n\n          // Invalidate textures and mark the range as scaled if needed.\n          texture_cache.MarkRangeAsResolved(\n              resolve_info.copy_dest_extent_start,\n              resolve_info.copy_dest_extent_length);\n          written_address_out = resolve_info.copy_dest_extent_start;\n          written_length_out = resolve_info.copy_dest_extent_length;\n          copied = true;\n        }\n      }\n    }\n  } else {\n    copied = true;\n  }\n\n  // Clearing.\n  bool cleared = false;\n  bool clear_depth = resolve_info.IsClearingDepth();\n  bool clear_color = resolve_info.IsClearingColor();\n  if (clear_depth || clear_color) {\n    switch (GetPath()) {\n      case Path::kHostRenderTargets: {\n        Transfer::Rectangle clear_rectangle;\n        RenderTarget* clear_render_targets[2];\n        // If PrepareHostRenderTargetsResolveClear returns false, may be just an\n        // empty region (success) or an error - don't care.\n        if (PrepareHostRenderTargetsResolveClear(\n                resolve_info, clear_rectangle, clear_render_targets[0],\n                clear_transfers_[0], clear_render_targets[1],\n                clear_transfers_[1])) {\n          uint64_t clear_values[2];\n          clear_values[0] = resolve_info.rb_depth_clear;\n          clear_values[1] = resolve_info.rb_color_clear |\n                            (uint64_t(resolve_info.rb_color_clear_lo) << 32);\n          PerformTransfersAndResolveClears(2, clear_render_targets,\n                                           clear_transfers_, clear_values,\n                                           &clear_rectangle);\n        }\n        cleared = true;\n      } break;\n      case Path::kPixelShaderInterlock: {\n        UseEdramBuffer(EdramBufferUsage::kComputeWrite);\n        // Should be safe to only commit once (if was accessed as unordered or\n        // with fragment shader interlock previously - if there was nothing to\n        // copy, only to clear, for some reason, for instance), overlap of the\n        // depth and the color ranges is highly unlikely.\n        CommitEdramBufferShaderWrites();\n        command_buffer.CmdVkBindDescriptorSets(\n            VK_PIPELINE_BIND_POINT_COMPUTE, resolve_fsi_clear_pipeline_layout_,\n            0, 1, &edram_storage_buffer_descriptor_set_, 0, nullptr);\n        std::pair<uint32_t, uint32_t> clear_group_count =\n            resolve_info.GetClearShaderGroupCount(draw_resolution_scale_x(),\n                                                  draw_resolution_scale_y());\n        assert_true(clear_group_count.first && clear_group_count.second);\n        if (clear_depth) {\n          command_processor_.BindExternalComputePipeline(\n              resolve_fsi_clear_32bpp_pipeline_);\n          draw_util::ResolveClearShaderConstants depth_clear_constants;\n          resolve_info.GetDepthClearShaderConstants(depth_clear_constants);\n          command_buffer.CmdVkPushConstants(\n              resolve_fsi_clear_pipeline_layout_, VK_SHADER_STAGE_COMPUTE_BIT,\n              0, sizeof(depth_clear_constants), &depth_clear_constants);\n          command_processor_.SubmitBarriers(true);\n          command_buffer.CmdVkDispatch(clear_group_count.first,\n                                       clear_group_count.second, 1);\n        }\n        if (clear_color) {\n          command_processor_.BindExternalComputePipeline(\n              resolve_info.color_edram_info.format_is_64bpp\n                  ? resolve_fsi_clear_64bpp_pipeline_\n                  : resolve_fsi_clear_32bpp_pipeline_);\n          draw_util::ResolveClearShaderConstants color_clear_constants;\n          resolve_info.GetColorClearShaderConstants(color_clear_constants);\n          if (clear_depth) {\n            // Non-RT-specific constants have already been set.\n            command_buffer.CmdVkPushConstants(\n                resolve_fsi_clear_pipeline_layout_, VK_SHADER_STAGE_COMPUTE_BIT,\n                uint32_t(offsetof(draw_util::ResolveClearShaderConstants,\n                                  rt_specific)),\n                sizeof(color_clear_constants.rt_specific),\n                &color_clear_constants.rt_specific);\n          } else {\n            command_buffer.CmdVkPushConstants(\n                resolve_fsi_clear_pipeline_layout_, VK_SHADER_STAGE_COMPUTE_BIT,\n                0, sizeof(color_clear_constants), &color_clear_constants);\n          }\n          command_processor_.SubmitBarriers(true);\n          command_buffer.CmdVkDispatch(clear_group_count.first,\n                                       clear_group_count.second, 1);\n        }\n        MarkEdramBufferModified();\n        cleared = true;\n      } break;\n      default:\n        assert_unhandled_case(GetPath());\n    }\n  } else {\n    cleared = true;\n  }\n\n  return copied && cleared;\n}\n\nbool VulkanRenderTargetCache::Update(\n    bool is_rasterization_done, reg::RB_DEPTHCONTROL normalized_depth_control,\n    uint32_t normalized_color_mask, const Shader& vertex_shader) {\n  if (!RenderTargetCache::Update(is_rasterization_done,\n                                 normalized_depth_control,\n                                 normalized_color_mask, vertex_shader)) {\n    return false;\n  }\n\n  auto rb_surface_info = register_file().Get<reg::RB_SURFACE_INFO>();\n\n  RenderPassKey render_pass_key;\n  // Needed even with the fragment shader interlock render backend for passing\n  // the sample count to the pipeline cache.\n  render_pass_key.msaa_samples = rb_surface_info.msaa_samples;\n\n  switch (GetPath()) {\n    case Path::kHostRenderTargets: {\n      RenderTarget* const* depth_and_color_render_targets =\n          last_update_accumulated_render_targets();\n\n      PerformTransfersAndResolveClears(1 + xenos::kMaxColorRenderTargets,\n                                       depth_and_color_render_targets,\n                                       last_update_transfers());\n\n      if (depth_and_color_render_targets[0]) {\n        render_pass_key.depth_and_color_used |= 1 << 0;\n        render_pass_key.depth_format =\n            depth_and_color_render_targets[0]->key().GetDepthFormat();\n      }\n      if (depth_and_color_render_targets[1]) {\n        render_pass_key.depth_and_color_used |= 1 << 1;\n        render_pass_key.color_0_view_format =\n            depth_and_color_render_targets[1]->key().GetColorFormat();\n      }\n      if (depth_and_color_render_targets[2]) {\n        render_pass_key.depth_and_color_used |= 1 << 2;\n        render_pass_key.color_1_view_format =\n            depth_and_color_render_targets[2]->key().GetColorFormat();\n      }\n      if (depth_and_color_render_targets[3]) {\n        render_pass_key.depth_and_color_used |= 1 << 3;\n        render_pass_key.color_2_view_format =\n            depth_and_color_render_targets[3]->key().GetColorFormat();\n      }\n      if (depth_and_color_render_targets[4]) {\n        render_pass_key.depth_and_color_used |= 1 << 4;\n        render_pass_key.color_3_view_format =\n            depth_and_color_render_targets[4]->key().GetColorFormat();\n      }\n\n      const Framebuffer* framebuffer = last_update_framebuffer_;\n      VkRenderPass render_pass = last_update_render_pass_key_ == render_pass_key\n                                     ? last_update_render_pass_\n                                     : VK_NULL_HANDLE;\n      if (render_pass == VK_NULL_HANDLE) {\n        render_pass = GetHostRenderTargetsRenderPass(render_pass_key);\n        if (render_pass == VK_NULL_HANDLE) {\n          return false;\n        }\n        // Framebuffer for a different render pass needed now.\n        framebuffer = nullptr;\n      }\n\n      uint32_t pitch_tiles_at_32bpp =\n          ((rb_surface_info.surface_pitch << uint32_t(\n                rb_surface_info.msaa_samples >= xenos::MsaaSamples::k4X)) +\n           (xenos::kEdramTileWidthSamples - 1)) /\n          xenos::kEdramTileWidthSamples;\n      if (framebuffer) {\n        if (last_update_framebuffer_pitch_tiles_at_32bpp_ !=\n                pitch_tiles_at_32bpp ||\n            std::memcmp(last_update_framebuffer_attachments_,\n                        depth_and_color_render_targets,\n                        sizeof(last_update_framebuffer_attachments_))) {\n          framebuffer = nullptr;\n        }\n      }\n      if (!framebuffer) {\n        framebuffer = GetHostRenderTargetsFramebuffer(\n            render_pass_key, pitch_tiles_at_32bpp,\n            depth_and_color_render_targets);\n        if (!framebuffer) {\n          return false;\n        }\n      }\n\n      // Successful update - write the new configuration.\n      last_update_render_pass_key_ = render_pass_key;\n      last_update_render_pass_ = render_pass;\n      last_update_framebuffer_pitch_tiles_at_32bpp_ = pitch_tiles_at_32bpp;\n      std::memcpy(last_update_framebuffer_attachments_,\n                  depth_and_color_render_targets,\n                  sizeof(last_update_framebuffer_attachments_));\n      last_update_framebuffer_ = framebuffer;\n\n      // Transition the used render targets.\n      for (uint32_t i = 0; i < 1 + xenos::kMaxColorRenderTargets; ++i) {\n        RenderTarget* rt = depth_and_color_render_targets[i];\n        if (!rt) {\n          continue;\n        }\n        auto& vulkan_rt = *static_cast<VulkanRenderTarget*>(rt);\n        VkPipelineStageFlags rt_dst_stage_mask;\n        VkAccessFlags rt_dst_access_mask;\n        VkImageLayout rt_new_layout;\n        VulkanRenderTarget::GetDrawUsage(i == 0, &rt_dst_stage_mask,\n                                         &rt_dst_access_mask, &rt_new_layout);\n        command_processor_.PushImageMemoryBarrier(\n            vulkan_rt.image(),\n            ui::vulkan::util::InitializeSubresourceRange(\n                i ? VK_IMAGE_ASPECT_COLOR_BIT\n                  : (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)),\n            vulkan_rt.current_stage_mask(), rt_dst_stage_mask,\n            vulkan_rt.current_access_mask(), rt_dst_access_mask,\n            vulkan_rt.current_layout(), rt_new_layout);\n        vulkan_rt.SetUsage(rt_dst_stage_mask, rt_dst_access_mask,\n                           rt_new_layout);\n      }\n    } break;\n\n    case Path::kPixelShaderInterlock: {\n      // For FSI, only the barrier is needed - already scheduled if required.\n      // But the buffer will be used for FSI drawing now.\n      UseEdramBuffer(EdramBufferUsage::kFragmentReadWrite);\n      // Commit preceding unordered (but not FSI) writes like clears as they\n      // aren't synchronized with FSI accesses.\n      CommitEdramBufferShaderWrites(\n          EdramBufferModificationStatus::kViaUnordered);\n      // TODO(Triang3l): Check if this draw call modifies color or depth /\n      // stencil, at least coarsely, to prevent useless barriers.\n      MarkEdramBufferModified(\n          EdramBufferModificationStatus::kViaFragmentShaderInterlock);\n      last_update_render_pass_key_ = render_pass_key;\n      last_update_render_pass_ = fsi_render_pass_;\n      last_update_framebuffer_ = &fsi_framebuffer_;\n    } break;\n\n    default:\n      assert_unhandled_case(GetPath());\n      return false;\n  }\n\n  return true;\n}\n\nVkRenderPass VulkanRenderTargetCache::GetHostRenderTargetsRenderPass(\n    RenderPassKey key) {\n  assert_true(GetPath() == Path::kHostRenderTargets);\n\n  auto it = render_passes_.find(key);\n  if (it != render_passes_.end()) {\n    return it->second;\n  }\n\n  VkSampleCountFlagBits samples;\n  switch (key.msaa_samples) {\n    case xenos::MsaaSamples::k1X:\n      samples = VK_SAMPLE_COUNT_1_BIT;\n      break;\n    case xenos::MsaaSamples::k2X:\n      samples = IsMsaa2xSupported(key.depth_and_color_used != 0)\n                    ? VK_SAMPLE_COUNT_2_BIT\n                    : VK_SAMPLE_COUNT_4_BIT;\n      break;\n    case xenos::MsaaSamples::k4X:\n      samples = VK_SAMPLE_COUNT_4_BIT;\n      break;\n    default:\n      return VK_NULL_HANDLE;\n  }\n\n  VkAttachmentDescription attachments[1 + xenos::kMaxColorRenderTargets];\n  if (key.depth_and_color_used & 0b1) {\n    VkAttachmentDescription& attachment = attachments[0];\n    attachment.flags = 0;\n    attachment.format = GetDepthVulkanFormat(key.depth_format);\n    attachment.samples = samples;\n    attachment.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD;\n    attachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE;\n    attachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_LOAD;\n    attachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;\n    attachment.initialLayout = VulkanRenderTarget::kDepthDrawLayout;\n    attachment.finalLayout = VulkanRenderTarget::kDepthDrawLayout;\n  }\n  VkAttachmentReference color_attachments[xenos::kMaxColorRenderTargets];\n  xenos::ColorRenderTargetFormat color_formats[] = {\n      key.color_0_view_format,\n      key.color_1_view_format,\n      key.color_2_view_format,\n      key.color_3_view_format,\n  };\n  for (uint32_t i = 0; i < xenos::kMaxColorRenderTargets; ++i) {\n    VkAttachmentReference& color_attachment = color_attachments[i];\n    color_attachment.layout = VulkanRenderTarget::kColorDrawLayout;\n    uint32_t attachment_bit = uint32_t(1) << (1 + i);\n    if (!(key.depth_and_color_used & attachment_bit)) {\n      color_attachment.attachment = VK_ATTACHMENT_UNUSED;\n      continue;\n    }\n    uint32_t attachment_index =\n        xe::bit_count(key.depth_and_color_used & (attachment_bit - 1));\n    color_attachment.attachment = attachment_index;\n    VkAttachmentDescription& attachment = attachments[attachment_index];\n    attachment.flags = 0;\n    xenos::ColorRenderTargetFormat color_format = color_formats[i];\n    attachment.format =\n        key.color_rts_use_transfer_formats\n            ? GetColorOwnershipTransferVulkanFormat(color_format)\n            : GetColorVulkanFormat(color_format);\n    attachment.samples = samples;\n    attachment.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD;\n    attachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE;\n    attachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;\n    attachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;\n    attachment.initialLayout = VulkanRenderTarget::kColorDrawLayout;\n    attachment.finalLayout = VulkanRenderTarget::kColorDrawLayout;\n  }\n\n  VkAttachmentReference depth_stencil_attachment;\n  depth_stencil_attachment.attachment =\n      (key.depth_and_color_used & 0b1) ? 0 : VK_ATTACHMENT_UNUSED;\n  depth_stencil_attachment.layout = VulkanRenderTarget::kDepthDrawLayout;\n\n  VkSubpassDescription subpass;\n  subpass.flags = 0;\n  subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;\n  subpass.inputAttachmentCount = 0;\n  subpass.pInputAttachments = nullptr;\n  subpass.colorAttachmentCount =\n      32 - xe::lzcnt(uint32_t(key.depth_and_color_used >> 1));\n  subpass.pColorAttachments = color_attachments;\n  subpass.pResolveAttachments = nullptr;\n  subpass.pDepthStencilAttachment =\n      (key.depth_and_color_used & 0b1) ? &depth_stencil_attachment : nullptr;\n  subpass.preserveAttachmentCount = 0;\n  subpass.pPreserveAttachments = nullptr;\n\n  VkPipelineStageFlags dependency_stage_mask = 0;\n  VkAccessFlags dependency_access_mask = 0;\n  if (key.depth_and_color_used & 0b1) {\n    dependency_stage_mask |= VulkanRenderTarget::kDepthDrawStageMask;\n    dependency_access_mask |= VulkanRenderTarget::kDepthDrawAccessMask;\n  }\n  if (key.depth_and_color_used >> 1) {\n    dependency_stage_mask |= VulkanRenderTarget::kColorDrawStageMask;\n    dependency_access_mask |= VulkanRenderTarget::kColorDrawAccessMask;\n  }\n  VkSubpassDependency subpass_dependencies[2];\n  subpass_dependencies[0].srcSubpass = VK_SUBPASS_EXTERNAL;\n  subpass_dependencies[0].dstSubpass = 0;\n  subpass_dependencies[0].srcStageMask = dependency_stage_mask;\n  subpass_dependencies[0].dstStageMask = dependency_stage_mask;\n  subpass_dependencies[0].srcAccessMask = dependency_access_mask;\n  subpass_dependencies[0].dstAccessMask = dependency_access_mask;\n  subpass_dependencies[0].dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;\n  subpass_dependencies[1].srcSubpass = 0;\n  subpass_dependencies[1].dstSubpass = VK_SUBPASS_EXTERNAL;\n  subpass_dependencies[1].srcStageMask = dependency_stage_mask;\n  subpass_dependencies[1].dstStageMask = dependency_stage_mask;\n  subpass_dependencies[1].srcAccessMask = dependency_access_mask;\n  subpass_dependencies[1].dstAccessMask = dependency_access_mask;\n  subpass_dependencies[1].dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;\n\n  VkRenderPassCreateInfo render_pass_create_info;\n  render_pass_create_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;\n  render_pass_create_info.pNext = nullptr;\n  render_pass_create_info.flags = 0;\n  render_pass_create_info.attachmentCount =\n      xe::bit_count(key.depth_and_color_used);\n  render_pass_create_info.pAttachments = attachments;\n  render_pass_create_info.subpassCount = 1;\n  render_pass_create_info.pSubpasses = &subpass;\n  render_pass_create_info.dependencyCount =\n      key.depth_and_color_used ? uint32_t(xe::countof(subpass_dependencies))\n                               : 0;\n  render_pass_create_info.pDependencies = subpass_dependencies;\n\n  const ui::vulkan::VulkanDevice* const vulkan_device =\n      command_processor_.GetVulkanDevice();\n  const ui::vulkan::VulkanDevice::Functions& dfn = vulkan_device->functions();\n  const VkDevice device = vulkan_device->device();\n  VkRenderPass render_pass;\n  if (dfn.vkCreateRenderPass(device, &render_pass_create_info, nullptr,\n                             &render_pass) != VK_SUCCESS) {\n    XELOGE(\"VulkanRenderTargetCache: Failed to create a render pass\");\n    render_passes_.emplace(key, VK_NULL_HANDLE);\n    return VK_NULL_HANDLE;\n  }\n  render_passes_.emplace(key, render_pass);\n  return render_pass;\n}\n\nVkFormat VulkanRenderTargetCache::GetDepthVulkanFormat(\n    xenos::DepthRenderTargetFormat format) const {\n  if (format == xenos::DepthRenderTargetFormat::kD24S8 &&\n      depth_unorm24_vulkan_format_supported()) {\n    return VK_FORMAT_D24_UNORM_S8_UINT;\n  }\n  return VK_FORMAT_D32_SFLOAT_S8_UINT;\n}\n\nVkFormat VulkanRenderTargetCache::GetColorVulkanFormat(\n    xenos::ColorRenderTargetFormat format) const {\n  switch (format) {\n    case xenos::ColorRenderTargetFormat::k_8_8_8_8:\n      return VK_FORMAT_R8G8B8A8_UNORM;\n    case xenos::ColorRenderTargetFormat::k_8_8_8_8_GAMMA:\n      return gamma_render_target_as_unorm16_ ? VK_FORMAT_R16G16B16A16_UNORM\n                                             : VK_FORMAT_R8G8B8A8_UNORM;\n    case xenos::ColorRenderTargetFormat::k_2_10_10_10:\n    case xenos::ColorRenderTargetFormat::k_2_10_10_10_AS_10_10_10_10:\n      return VK_FORMAT_A8B8G8R8_UNORM_PACK32;\n    case xenos::ColorRenderTargetFormat::k_2_10_10_10_FLOAT:\n    case xenos::ColorRenderTargetFormat::k_2_10_10_10_FLOAT_AS_16_16_16_16:\n      return VK_FORMAT_R16G16B16A16_SFLOAT;\n    case xenos::ColorRenderTargetFormat::k_16_16:\n      // TODO(Triang3l): Fallback to float16 (disregarding clearing correctness\n      // likely) - possibly on render target gathering, treating them entirely\n      // as float16.\n      return VK_FORMAT_R16G16_SNORM;\n    case xenos::ColorRenderTargetFormat::k_16_16_16_16:\n      // TODO(Triang3l): Fallback to float16 (disregarding clearing correctness\n      // likely) - possibly on render target gathering, treating them entirely\n      // as float16.\n      return VK_FORMAT_R16G16B16A16_SNORM;\n    case xenos::ColorRenderTargetFormat::k_16_16_FLOAT:\n      return VK_FORMAT_R16G16_SFLOAT;\n    case xenos::ColorRenderTargetFormat::k_16_16_16_16_FLOAT:\n      return VK_FORMAT_R16G16B16A16_SFLOAT;\n    case xenos::ColorRenderTargetFormat::k_32_FLOAT:\n      return VK_FORMAT_R32_SFLOAT;\n    case xenos::ColorRenderTargetFormat::k_32_32_FLOAT:\n      return VK_FORMAT_R32G32_SFLOAT;\n    default:\n      assert_unhandled_case(format);\n      return VK_FORMAT_UNDEFINED;\n  }\n}\n\nVkFormat VulkanRenderTargetCache::GetColorOwnershipTransferVulkanFormat(\n    xenos::ColorRenderTargetFormat format, bool* is_integer_out) const {\n  if (is_integer_out) {\n    *is_integer_out = true;\n  }\n  // Floating-point numbers have NaNs that need to be propagated without\n  // modifications to the bit representation, and SNORM has two representations\n  // of -1.\n  switch (format) {\n    case xenos::ColorRenderTargetFormat::k_16_16:\n    case xenos::ColorRenderTargetFormat::k_16_16_FLOAT:\n      return VK_FORMAT_R16G16_UINT;\n    case xenos::ColorRenderTargetFormat::k_16_16_16_16:\n    case xenos::ColorRenderTargetFormat::k_16_16_16_16_FLOAT:\n      return VK_FORMAT_R16G16B16A16_UINT;\n    case xenos::ColorRenderTargetFormat::k_32_FLOAT:\n      return VK_FORMAT_R32_UINT;\n    case xenos::ColorRenderTargetFormat::k_32_32_FLOAT:\n      return VK_FORMAT_R32G32_UINT;\n    default:\n      if (is_integer_out) {\n        *is_integer_out = false;\n      }\n      return GetColorVulkanFormat(format);\n  }\n}\n\nVulkanRenderTargetCache::VulkanRenderTarget::~VulkanRenderTarget() {\n  const ui::vulkan::VulkanDevice* const vulkan_device =\n      render_target_cache_.command_processor_.GetVulkanDevice();\n  const ui::vulkan::VulkanDevice::Functions& dfn = vulkan_device->functions();\n  const VkDevice device = vulkan_device->device();\n  ui::vulkan::SingleLayoutDescriptorSetPool& descriptor_set_pool =\n      key().is_depth\n          ? *render_target_cache_.descriptor_set_pool_sampled_image_x2_\n          : *render_target_cache_.descriptor_set_pool_sampled_image_;\n  descriptor_set_pool.Free(descriptor_set_index_transfer_source_);\n  if (view_color_transfer_separate_ != VK_NULL_HANDLE) {\n    dfn.vkDestroyImageView(device, view_color_transfer_separate_, nullptr);\n  }\n  if (view_stencil_ != VK_NULL_HANDLE) {\n    dfn.vkDestroyImageView(device, view_stencil_, nullptr);\n  }\n  if (view_depth_stencil_ != VK_NULL_HANDLE) {\n    dfn.vkDestroyImageView(device, view_depth_stencil_, nullptr);\n  }\n  dfn.vkDestroyImageView(device, view_depth_color_, nullptr);\n  dfn.vkDestroyImage(device, image_, nullptr);\n  dfn.vkFreeMemory(device, memory_, nullptr);\n}\n\nbool VulkanRenderTargetCache::IsGammaFormatHostStorageSeparate() const {\n  return gamma_render_target_as_unorm16_;\n}\n\nuint32_t VulkanRenderTargetCache::GetMaxRenderTargetWidth() const {\n  const ui::vulkan::VulkanDevice::Properties& device_properties =\n      command_processor_.GetVulkanDevice()->properties();\n  return std::min(device_properties.maxFramebufferWidth,\n                  device_properties.maxImageDimension2D);\n}\n\nuint32_t VulkanRenderTargetCache::GetMaxRenderTargetHeight() const {\n  const ui::vulkan::VulkanDevice::Properties& device_properties =\n      command_processor_.GetVulkanDevice()->properties();\n  return std::min(device_properties.maxFramebufferHeight,\n                  device_properties.maxImageDimension2D);\n}\n\nRenderTargetCache::RenderTarget* VulkanRenderTargetCache::CreateRenderTarget(\n    RenderTargetKey key) {\n  const ui::vulkan::VulkanDevice* const vulkan_device =\n      command_processor_.GetVulkanDevice();\n  const ui::vulkan::VulkanDevice::Functions& dfn = vulkan_device->functions();\n  const VkDevice device = vulkan_device->device();\n\n  // Create the image.\n\n  VkImageCreateInfo image_create_info;\n  image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;\n  image_create_info.pNext = nullptr;\n  image_create_info.flags = 0;\n  image_create_info.imageType = VK_IMAGE_TYPE_2D;\n  image_create_info.extent.width = key.GetWidth() * draw_resolution_scale_x();\n  image_create_info.extent.height =\n      GetRenderTargetHeight(key.pitch_tiles_at_32bpp, key.msaa_samples) *\n      draw_resolution_scale_y();\n  image_create_info.extent.depth = 1;\n  image_create_info.mipLevels = 1;\n  image_create_info.arrayLayers = 1;\n  if (key.msaa_samples == xenos::MsaaSamples::k2X &&\n      !msaa_2x_attachments_supported_) {\n    image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;\n  } else {\n    image_create_info.samples =\n        VkSampleCountFlagBits(uint32_t(1) << uint32_t(key.msaa_samples));\n  }\n  image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;\n  image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;\n  image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;\n  image_create_info.queueFamilyIndexCount = 0;\n  image_create_info.pQueueFamilyIndices = nullptr;\n  image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;\n  VkFormat transfer_format;\n  if (key.is_depth) {\n    image_create_info.format = GetDepthVulkanFormat(key.GetDepthFormat());\n    transfer_format = image_create_info.format;\n    image_create_info.usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;\n  } else {\n    xenos::ColorRenderTargetFormat color_format = key.GetColorFormat();\n    image_create_info.format = GetColorVulkanFormat(color_format);\n    transfer_format = GetColorOwnershipTransferVulkanFormat(color_format);\n    if (image_create_info.format != transfer_format) {\n      image_create_info.flags |= VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;\n    }\n    image_create_info.usage |= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;\n  }\n  if (image_create_info.format == VK_FORMAT_UNDEFINED) {\n    XELOGE(\"VulkanRenderTargetCache: Unknown {} render target format {}\",\n           key.is_depth ? \"depth\" : \"color\", key.resource_format);\n    return nullptr;\n  }\n  VkImage image;\n  VkDeviceMemory memory;\n  if (!ui::vulkan::util::CreateDedicatedAllocationImage(\n          vulkan_device, image_create_info,\n          ui::vulkan::util::MemoryPurpose::kDeviceLocal, image, memory)) {\n    XELOGE(\n        \"VulkanRenderTarget: Failed to create a {}x{} {}xMSAA {} render target \"\n        \"image\",\n        image_create_info.extent.width, image_create_info.extent.height,\n        uint32_t(1) << uint32_t(key.msaa_samples), key.GetFormatName());\n    return nullptr;\n  }\n\n  // Create the image views.\n\n  VkImageViewCreateInfo view_create_info;\n  view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;\n  view_create_info.pNext = nullptr;\n  view_create_info.flags = 0;\n  view_create_info.image = image;\n  view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;\n  view_create_info.format = image_create_info.format;\n  view_create_info.components.r = VK_COMPONENT_SWIZZLE_IDENTITY;\n  view_create_info.components.g = VK_COMPONENT_SWIZZLE_IDENTITY;\n  view_create_info.components.b = VK_COMPONENT_SWIZZLE_IDENTITY;\n  view_create_info.components.a = VK_COMPONENT_SWIZZLE_IDENTITY;\n  view_create_info.subresourceRange =\n      ui::vulkan::util::InitializeSubresourceRange(\n          key.is_depth ? VK_IMAGE_ASPECT_DEPTH_BIT : VK_IMAGE_ASPECT_COLOR_BIT);\n  VkImageView view_depth_color;\n  if (dfn.vkCreateImageView(device, &view_create_info, nullptr,\n                            &view_depth_color) != VK_SUCCESS) {\n    XELOGE(\n        \"VulkanRenderTarget: Failed to create a {} view for a {}x{} {}xMSAA {} \"\n        \"render target\",\n        key.is_depth ? \"depth\" : \"color\", image_create_info.extent.width,\n        image_create_info.extent.height,\n        uint32_t(1) << uint32_t(key.msaa_samples), key.GetFormatName());\n    dfn.vkDestroyImage(device, image, nullptr);\n    dfn.vkFreeMemory(device, memory, nullptr);\n    return nullptr;\n  }\n  VkImageView view_depth_stencil = VK_NULL_HANDLE;\n  VkImageView view_stencil = VK_NULL_HANDLE;\n  VkImageView view_color_transfer_separate = VK_NULL_HANDLE;\n  if (key.is_depth) {\n    view_create_info.subresourceRange.aspectMask =\n        VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;\n    if (dfn.vkCreateImageView(device, &view_create_info, nullptr,\n                              &view_depth_stencil) != VK_SUCCESS) {\n      XELOGE(\n          \"VulkanRenderTarget: Failed to create a depth / stencil view for a \"\n          \"{}x{} {}xMSAA {} render target\",\n          image_create_info.extent.width, image_create_info.extent.height,\n          uint32_t(1) << uint32_t(key.msaa_samples),\n          xenos::GetDepthRenderTargetFormatName(key.GetDepthFormat()));\n      dfn.vkDestroyImageView(device, view_depth_color, nullptr);\n      dfn.vkDestroyImage(device, image, nullptr);\n      dfn.vkFreeMemory(device, memory, nullptr);\n      return nullptr;\n    }\n    view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;\n    if (dfn.vkCreateImageView(device, &view_create_info, nullptr,\n                              &view_stencil) != VK_SUCCESS) {\n      XELOGE(\n          \"VulkanRenderTarget: Failed to create a stencil view for a {}x{} \"\n          \"{}xMSAA render target\",\n          image_create_info.extent.width, image_create_info.extent.height,\n          uint32_t(1) << uint32_t(key.msaa_samples),\n          xenos::GetDepthRenderTargetFormatName(key.GetDepthFormat()));\n      dfn.vkDestroyImageView(device, view_depth_stencil, nullptr);\n      dfn.vkDestroyImageView(device, view_depth_color, nullptr);\n      dfn.vkDestroyImage(device, image, nullptr);\n      dfn.vkFreeMemory(device, memory, nullptr);\n      return nullptr;\n    }\n  } else {\n    if (transfer_format != image_create_info.format) {\n      view_create_info.format = transfer_format;\n      if (dfn.vkCreateImageView(device, &view_create_info, nullptr,\n                                &view_color_transfer_separate) != VK_SUCCESS) {\n        XELOGE(\n            \"VulkanRenderTarget: Failed to create a transfer view for a {}x{} \"\n            \"{}xMSAA {} render target\",\n            image_create_info.extent.width, image_create_info.extent.height,\n            uint32_t(1) << uint32_t(key.msaa_samples), key.GetFormatName());\n        dfn.vkDestroyImageView(device, view_depth_color, nullptr);\n        dfn.vkDestroyImage(device, image, nullptr);\n        dfn.vkFreeMemory(device, memory, nullptr);\n        return nullptr;\n      }\n    }\n  }\n\n  ui::vulkan::SingleLayoutDescriptorSetPool& descriptor_set_pool =\n      key.is_depth ? *descriptor_set_pool_sampled_image_x2_\n                   : *descriptor_set_pool_sampled_image_;\n  size_t descriptor_set_index_transfer_source = descriptor_set_pool.Allocate();\n  if (descriptor_set_index_transfer_source == SIZE_MAX) {\n    XELOGE(\n        \"VulkanRenderTargetCache: Failed to allocate sampled image descriptors \"\n        \"for a {} render target\",\n        key.is_depth ? \"depth/stencil\" : \"color\");\n    if (view_color_transfer_separate != VK_NULL_HANDLE) {\n      dfn.vkDestroyImageView(device, view_color_transfer_separate, nullptr);\n    }\n    dfn.vkDestroyImageView(device, view_depth_color, nullptr);\n    dfn.vkDestroyImage(device, image, nullptr);\n    dfn.vkFreeMemory(device, memory, nullptr);\n    return nullptr;\n  }\n  VkDescriptorSet descriptor_set_transfer_source =\n      descriptor_set_pool.Get(descriptor_set_index_transfer_source);\n  VkWriteDescriptorSet descriptor_set_write[2];\n  VkDescriptorImageInfo descriptor_set_write_depth_color;\n  descriptor_set_write_depth_color.sampler = VK_NULL_HANDLE;\n  descriptor_set_write_depth_color.imageView =\n      view_color_transfer_separate != VK_NULL_HANDLE\n          ? view_color_transfer_separate\n          : view_depth_color;\n  descriptor_set_write_depth_color.imageLayout =\n      VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;\n  descriptor_set_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;\n  descriptor_set_write[0].pNext = nullptr;\n  descriptor_set_write[0].dstSet = descriptor_set_transfer_source;\n  descriptor_set_write[0].dstBinding = 0;\n  descriptor_set_write[0].dstArrayElement = 0;\n  descriptor_set_write[0].descriptorCount = 1;\n  descriptor_set_write[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;\n  descriptor_set_write[0].pImageInfo = &descriptor_set_write_depth_color;\n  descriptor_set_write[0].pBufferInfo = nullptr;\n  descriptor_set_write[0].pTexelBufferView = nullptr;\n  VkDescriptorImageInfo descriptor_set_write_stencil;\n  if (key.is_depth) {\n    descriptor_set_write_stencil.sampler = VK_NULL_HANDLE;\n    descriptor_set_write_stencil.imageView = view_stencil;\n    descriptor_set_write_stencil.imageLayout =\n        VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;\n    descriptor_set_write[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;\n    descriptor_set_write[1].pNext = nullptr;\n    descriptor_set_write[1].dstSet = descriptor_set_transfer_source;\n    descriptor_set_write[1].dstBinding = 1;\n    descriptor_set_write[1].dstArrayElement = 0;\n    descriptor_set_write[1].descriptorCount = 1;\n    descriptor_set_write[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;\n    descriptor_set_write[1].pImageInfo = &descriptor_set_write_stencil;\n    descriptor_set_write[1].pBufferInfo = nullptr;\n    descriptor_set_write[1].pTexelBufferView = nullptr;\n  }\n  dfn.vkUpdateDescriptorSets(device, key.is_depth ? 2 : 1, descriptor_set_write,\n                             0, nullptr);\n\n  return new VulkanRenderTarget(key, *this, image, memory, view_depth_color,\n                                view_depth_stencil, view_stencil,\n                                view_color_transfer_separate,\n                                descriptor_set_index_transfer_source);\n}\n\nbool VulkanRenderTargetCache::IsHostDepthEncodingDifferent(\n    xenos::DepthRenderTargetFormat format) const {\n  // TODO(Triang3l): Conversion directly in shaders.\n  switch (format) {\n    case xenos::DepthRenderTargetFormat::kD24S8:\n      return !depth_unorm24_vulkan_format_supported();\n    case xenos::DepthRenderTargetFormat::kD24FS8:\n      return true;\n  }\n  return false;\n}\n\nvoid VulkanRenderTargetCache::RequestPixelShaderInterlockBarrier() {\n  if (edram_buffer_usage_ == EdramBufferUsage::kFragmentReadWrite) {\n    CommitEdramBufferShaderWrites();\n  }\n}\n\nvoid VulkanRenderTargetCache::GetEdramBufferUsageMasks(\n    EdramBufferUsage usage, VkPipelineStageFlags& stage_mask_out,\n    VkAccessFlags& access_mask_out) {\n  switch (usage) {\n    case EdramBufferUsage::kFragmentRead:\n      stage_mask_out = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;\n      access_mask_out = VK_ACCESS_SHADER_READ_BIT;\n      break;\n    case EdramBufferUsage::kFragmentReadWrite:\n      stage_mask_out = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;\n      access_mask_out = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT;\n      break;\n    case EdramBufferUsage::kComputeRead:\n      stage_mask_out = VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT;\n      access_mask_out = VK_ACCESS_SHADER_READ_BIT;\n      break;\n    case EdramBufferUsage::kComputeWrite:\n      stage_mask_out = VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT;\n      access_mask_out = VK_ACCESS_SHADER_WRITE_BIT;\n      break;\n    case EdramBufferUsage::kTransferRead:\n      stage_mask_out = VK_PIPELINE_STAGE_TRANSFER_BIT;\n      access_mask_out = VK_ACCESS_TRANSFER_READ_BIT;\n      break;\n    case EdramBufferUsage::kTransferWrite:\n      stage_mask_out = VK_PIPELINE_STAGE_TRANSFER_BIT;\n      access_mask_out = VK_ACCESS_TRANSFER_WRITE_BIT;\n      break;\n    default:\n      assert_unhandled_case(usage);\n  }\n}\n\nvoid VulkanRenderTargetCache::UseEdramBuffer(EdramBufferUsage new_usage) {\n  if (edram_buffer_usage_ == new_usage) {\n    return;\n  }\n  VkPipelineStageFlags src_stage_mask, dst_stage_mask;\n  VkAccessFlags src_access_mask, dst_access_mask;\n  GetEdramBufferUsageMasks(edram_buffer_usage_, src_stage_mask,\n                           src_access_mask);\n  GetEdramBufferUsageMasks(new_usage, dst_stage_mask, dst_access_mask);\n  if (command_processor_.PushBufferMemoryBarrier(\n          edram_buffer_, 0, VK_WHOLE_SIZE, src_stage_mask, dst_stage_mask,\n          src_access_mask, dst_access_mask)) {\n    // Resetting edram_buffer_modification_status_ only if the barrier has been\n    // truly inserted.\n    edram_buffer_modification_status_ =\n        EdramBufferModificationStatus::kUnmodified;\n  }\n  edram_buffer_usage_ = new_usage;\n}\n\nvoid VulkanRenderTargetCache::MarkEdramBufferModified(\n    EdramBufferModificationStatus modification_status) {\n  assert_true(modification_status !=\n              EdramBufferModificationStatus::kUnmodified);\n  switch (edram_buffer_usage_) {\n    case EdramBufferUsage::kFragmentReadWrite:\n      // max because being modified via unordered access requires stricter\n      // synchronization than via fragment shader interlocks.\n      edram_buffer_modification_status_ =\n          std::max(edram_buffer_modification_status_, modification_status);\n      break;\n    case EdramBufferUsage::kComputeWrite:\n      assert_true(modification_status ==\n                  EdramBufferModificationStatus::kViaUnordered);\n      modification_status = EdramBufferModificationStatus::kViaUnordered;\n      break;\n    default:\n      assert_always(\n          \"While changing the usage of the EDRAM buffer before marking it as \"\n          \"modified is handled safely (but will cause spurious marking as \"\n          \"modified after the changes have been implicitly committed by the \"\n          \"usage switch), normally that shouldn't be done and is an \"\n          \"indication of architectural mistakes. Alternatively, this may \"\n          \"indicate that the usage switch has been forgotten before writing, \"\n          \"which is a clearly invalid situation.\");\n  }\n}\n\nvoid VulkanRenderTargetCache::CommitEdramBufferShaderWrites(\n    EdramBufferModificationStatus commit_status) {\n  assert_true(commit_status != EdramBufferModificationStatus::kUnmodified);\n  if (edram_buffer_modification_status_ < commit_status) {\n    return;\n  }\n  VkPipelineStageFlags stage_mask;\n  VkAccessFlags access_mask;\n  GetEdramBufferUsageMasks(edram_buffer_usage_, stage_mask, access_mask);\n  assert_not_zero(access_mask & VK_ACCESS_SHADER_WRITE_BIT);\n  command_processor_.PushBufferMemoryBarrier(\n      edram_buffer_, 0, VK_WHOLE_SIZE, stage_mask, stage_mask, access_mask,\n      access_mask, VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED, false);\n  edram_buffer_modification_status_ =\n      EdramBufferModificationStatus::kUnmodified;\n  PixelShaderInterlockFullEdramBarrierPlaced();\n}\n\nconst VulkanRenderTargetCache::Framebuffer*\nVulkanRenderTargetCache::GetHostRenderTargetsFramebuffer(\n    RenderPassKey render_pass_key, uint32_t pitch_tiles_at_32bpp,\n    const RenderTarget* const* depth_and_color_render_targets) {\n  FramebufferKey key;\n  key.render_pass_key = render_pass_key;\n  key.pitch_tiles_at_32bpp = pitch_tiles_at_32bpp;\n  if (render_pass_key.depth_and_color_used & (1 << 0)) {\n    key.depth_base_tiles = depth_and_color_render_targets[0]->key().base_tiles;\n  }\n  if (render_pass_key.depth_and_color_used & (1 << 1)) {\n    key.color_0_base_tiles =\n        depth_and_color_render_targets[1]->key().base_tiles;\n  }\n  if (render_pass_key.depth_and_color_used & (1 << 2)) {\n    key.color_1_base_tiles =\n        depth_and_color_render_targets[2]->key().base_tiles;\n  }\n  if (render_pass_key.depth_and_color_used & (1 << 3)) {\n    key.color_2_base_tiles =\n        depth_and_color_render_targets[3]->key().base_tiles;\n  }\n  if (render_pass_key.depth_and_color_used & (1 << 4)) {\n    key.color_3_base_tiles =\n        depth_and_color_render_targets[4]->key().base_tiles;\n  }\n  auto it = framebuffers_.find(key);\n  if (it != framebuffers_.end()) {\n    return &it->second;\n  }\n\n  const ui::vulkan::VulkanDevice* const vulkan_device =\n      command_processor_.GetVulkanDevice();\n  const ui::vulkan::VulkanDevice::Functions& dfn = vulkan_device->functions();\n  const VkDevice device = vulkan_device->device();\n  const ui::vulkan::VulkanDevice::Properties& device_properties =\n      vulkan_device->properties();\n\n  VkRenderPass render_pass = GetHostRenderTargetsRenderPass(render_pass_key);\n  if (render_pass == VK_NULL_HANDLE) {\n    return nullptr;\n  }\n\n  VkImageView attachments[1 + xenos::kMaxColorRenderTargets];\n  uint32_t attachment_count = 0;\n  uint32_t depth_and_color_rts_remaining = render_pass_key.depth_and_color_used;\n  uint32_t rt_index;\n  while (xe::bit_scan_forward(depth_and_color_rts_remaining, &rt_index)) {\n    depth_and_color_rts_remaining &= ~(uint32_t(1) << rt_index);\n    const auto& vulkan_rt = *static_cast<const VulkanRenderTarget*>(\n        depth_and_color_render_targets[rt_index]);\n    VkImageView attachment;\n    if (rt_index) {\n      attachment = render_pass_key.color_rts_use_transfer_formats\n                       ? vulkan_rt.view_color_transfer()\n                       : vulkan_rt.view_depth_color();\n    } else {\n      attachment = vulkan_rt.view_depth_stencil();\n    }\n    attachments[attachment_count++] = attachment;\n  }\n\n  VkFramebufferCreateInfo framebuffer_create_info;\n  framebuffer_create_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;\n  framebuffer_create_info.pNext = nullptr;\n  framebuffer_create_info.flags = 0;\n  framebuffer_create_info.renderPass = render_pass;\n  framebuffer_create_info.attachmentCount = attachment_count;\n  framebuffer_create_info.pAttachments = attachments;\n  VkExtent2D host_extent;\n  if (pitch_tiles_at_32bpp) {\n    host_extent.width = RenderTargetKey::GetWidth(pitch_tiles_at_32bpp,\n                                                  render_pass_key.msaa_samples);\n    host_extent.height = GetRenderTargetHeight(pitch_tiles_at_32bpp,\n                                               render_pass_key.msaa_samples);\n  } else {\n    assert_zero(render_pass_key.depth_and_color_used);\n    // Still needed for occlusion queries.\n    host_extent.width = xenos::kTexture2DCubeMaxWidthHeight;\n    host_extent.height = xenos::kTexture2DCubeMaxWidthHeight;\n  }\n  // Limiting to the device limit for the case of no attachments, for which\n  // there's no limit imposed by the sizes of the attachments that have been\n  // created successfully.\n  host_extent.width = std::min(host_extent.width * draw_resolution_scale_x(),\n                               device_properties.maxFramebufferWidth);\n  host_extent.height = std::min(host_extent.height * draw_resolution_scale_y(),\n                                device_properties.maxFramebufferHeight);\n  framebuffer_create_info.width = host_extent.width;\n  framebuffer_create_info.height = host_extent.height;\n  framebuffer_create_info.layers = 1;\n  VkFramebuffer framebuffer;\n  if (dfn.vkCreateFramebuffer(device, &framebuffer_create_info, nullptr,\n                              &framebuffer) != VK_SUCCESS) {\n    return nullptr;\n  }\n  // Creates at a persistent location - safe to use pointers.\n  return &framebuffers_\n              .emplace(std::piecewise_construct, std::forward_as_tuple(key),\n                       std::forward_as_tuple(framebuffer, host_extent))\n              .first->second;\n}\n\nVkShaderModule VulkanRenderTargetCache::GetTransferShader(\n    TransferShaderKey key) {\n  auto shader_it = transfer_shaders_.find(key);\n  if (shader_it != transfer_shaders_.end()) {\n    return shader_it->second;\n  }\n\n  const ui::vulkan::VulkanDevice* const vulkan_device =\n      command_processor_.GetVulkanDevice();\n  const ui::vulkan::VulkanDevice::Properties& device_properties =\n      vulkan_device->properties();\n\n  std::vector<spv::Id> id_vector_temp;\n  std::vector<unsigned int> uint_vector_temp;\n\n  SpirvBuilder builder(spv::Spv_1_0,\n                       (SpirvShaderTranslator::kSpirvMagicToolId << 16) | 1,\n                       nullptr);\n  spv::Id ext_inst_glsl_std_450 = builder.import(\"GLSL.std.450\");\n  builder.addCapability(spv::CapabilityShader);\n  builder.setMemoryModel(spv::AddressingModelLogical, spv::MemoryModelGLSL450);\n  builder.setSource(spv::SourceLanguageUnknown, 0);\n\n  spv::Id type_void = builder.makeVoidType();\n  spv::Id type_bool = builder.makeBoolType();\n  spv::Id type_int = builder.makeIntType(32);\n  spv::Id type_int2 = builder.makeVectorType(type_int, 2);\n  spv::Id type_uint = builder.makeUintType(32);\n  spv::Id type_uint2 = builder.makeVectorType(type_uint, 2);\n  spv::Id type_uint4 = builder.makeVectorType(type_uint, 4);\n  spv::Id type_float = builder.makeFloatType(32);\n  spv::Id type_float2 = builder.makeVectorType(type_float, 2);\n  spv::Id type_float4 = builder.makeVectorType(type_float, 4);\n\n  const TransferModeInfo& mode = kTransferModes[size_t(key.mode)];\n  const TransferPipelineLayoutInfo& pipeline_layout_info =\n      kTransferPipelineLayoutInfos[size_t(mode.pipeline_layout)];\n\n  // If not dest_is_color, it's depth, or stencil bit - 40-sample columns are\n  // swapped as opposed to color source.\n  bool dest_is_color = (mode.output == TransferOutput::kColor);\n  xenos::ColorRenderTargetFormat dest_color_format =\n      xenos::ColorRenderTargetFormat(key.dest_resource_format);\n  xenos::DepthRenderTargetFormat dest_depth_format =\n      xenos::DepthRenderTargetFormat(key.dest_resource_format);\n  bool dest_is_64bpp =\n      dest_is_color && xenos::IsColorRenderTargetFormat64bpp(dest_color_format);\n\n  xenos::ColorRenderTargetFormat source_color_format =\n      xenos::ColorRenderTargetFormat(key.source_resource_format);\n  xenos::DepthRenderTargetFormat source_depth_format =\n      xenos::DepthRenderTargetFormat(key.source_resource_format);\n  // If not source_is_color, it's depth / stencil - 40-sample columns are\n  // swapped as opposed to color destination.\n  bool source_is_color = (pipeline_layout_info.used_descriptor_sets &\n                          kTransferUsedDescriptorSetColorTextureBit) != 0;\n  bool source_is_64bpp;\n  uint32_t source_color_format_component_count;\n  uint32_t source_color_texture_component_mask;\n  bool source_color_is_uint;\n  spv::Id source_color_component_type;\n  if (source_is_color) {\n    assert_zero(pipeline_layout_info.used_descriptor_sets &\n                kTransferUsedDescriptorSetDepthStencilTexturesBit);\n    source_is_64bpp =\n        xenos::IsColorRenderTargetFormat64bpp(source_color_format);\n    source_color_format_component_count =\n        xenos::GetColorRenderTargetFormatComponentCount(source_color_format);\n    if (mode.output == TransferOutput::kStencilBit) {\n      if (source_is_64bpp && !dest_is_64bpp) {\n        // Need one component, but choosing from the two 32bpp halves of the\n        // 64bpp sample.\n        source_color_texture_component_mask =\n            0b1 | (0b1 << (source_color_format_component_count >> 1));\n      } else {\n        // Red is at least 8 bits per component in all formats.\n        source_color_texture_component_mask = 0b1;\n      }\n    } else {\n      source_color_texture_component_mask =\n          (uint32_t(1) << source_color_format_component_count) - 1;\n    }\n    GetColorOwnershipTransferVulkanFormat(source_color_format,\n                                          &source_color_is_uint);\n    source_color_component_type = source_color_is_uint ? type_uint : type_float;\n  } else {\n    source_is_64bpp = false;\n    source_color_format_component_count = 0;\n    source_color_texture_component_mask = 0;\n    source_color_is_uint = false;\n    source_color_component_type = spv::NoType;\n  }\n\n  std::vector<spv::Id> main_interface;\n\n  // Outputs.\n  bool shader_uses_stencil_reference_output =\n      mode.output == TransferOutput::kDepth &&\n      vulkan_device->extensions().ext_EXT_shader_stencil_export;\n  bool dest_color_is_uint = false;\n  uint32_t dest_color_component_count = 0;\n  spv::Id type_fragment_data_component = spv::NoResult;\n  spv::Id type_fragment_data = spv::NoResult;\n  spv::Id output_fragment_data = spv::NoResult;\n  spv::Id output_fragment_depth = spv::NoResult;\n  spv::Id output_fragment_stencil_ref = spv::NoResult;\n  switch (mode.output) {\n    case TransferOutput::kColor:\n      GetColorOwnershipTransferVulkanFormat(dest_color_format,\n                                            &dest_color_is_uint);\n      dest_color_component_count =\n          xenos::GetColorRenderTargetFormatComponentCount(dest_color_format);\n      type_fragment_data_component =\n          dest_color_is_uint ? type_uint : type_float;\n      type_fragment_data =\n          dest_color_component_count > 1\n              ? builder.makeVectorType(type_fragment_data_component,\n                                       dest_color_component_count)\n              : type_fragment_data_component;\n      output_fragment_data = builder.createVariable(\n          spv::NoPrecision, spv::StorageClassOutput, type_fragment_data,\n          \"xe_transfer_fragment_data\");\n      builder.addDecoration(output_fragment_data, spv::DecorationLocation,\n                            key.dest_color_rt_index);\n      main_interface.push_back(output_fragment_data);\n      break;\n    case TransferOutput::kDepth:\n      output_fragment_depth =\n          builder.createVariable(spv::NoPrecision, spv::StorageClassOutput,\n                                 type_float, \"gl_FragDepth\");\n      builder.addDecoration(output_fragment_depth, spv::DecorationBuiltIn,\n                            spv::BuiltInFragDepth);\n      main_interface.push_back(output_fragment_depth);\n      if (shader_uses_stencil_reference_output) {\n        builder.addExtension(\"SPV_EXT_shader_stencil_export\");\n        builder.addCapability(spv::CapabilityStencilExportEXT);\n        output_fragment_stencil_ref =\n            builder.createVariable(spv::NoPrecision, spv::StorageClassOutput,\n                                   type_int, \"gl_FragStencilRefARB\");\n        builder.addDecoration(output_fragment_stencil_ref,\n                              spv::DecorationBuiltIn,\n                              spv::BuiltInFragStencilRefEXT);\n        main_interface.push_back(output_fragment_stencil_ref);\n      }\n      break;\n    default:\n      break;\n  }\n\n  // Bindings.\n  // Generating SPIR-V 1.0, no need to add bindings to the entry point's\n  // interface until SPIR-V 1.4.\n  // Color source.\n  bool source_is_multisampled =\n      key.source_msaa_samples != xenos::MsaaSamples::k1X;\n  spv::Id source_color_texture = spv::NoResult;\n  if (pipeline_layout_info.used_descriptor_sets &\n      kTransferUsedDescriptorSetColorTextureBit) {\n    source_color_texture = builder.createVariable(\n        spv::NoPrecision, spv::StorageClassUniformConstant,\n        builder.makeImageType(source_color_component_type, spv::Dim2D, false,\n                              false, source_is_multisampled, 1,\n                              spv::ImageFormatUnknown),\n        \"xe_transfer_color\");\n    builder.addDecoration(\n        source_color_texture, spv::DecorationDescriptorSet,\n        xe::bit_count(pipeline_layout_info.used_descriptor_sets &\n                      (kTransferUsedDescriptorSetColorTextureBit - 1)));\n    builder.addDecoration(source_color_texture, spv::DecorationBinding, 0);\n  }\n  // Depth / stencil source.\n  spv::Id source_depth_texture = spv::NoResult;\n  spv::Id source_stencil_texture = spv::NoResult;\n  if (pipeline_layout_info.used_descriptor_sets &\n      kTransferUsedDescriptorSetDepthStencilTexturesBit) {\n    uint32_t source_depth_stencil_descriptor_set =\n        xe::bit_count(pipeline_layout_info.used_descriptor_sets &\n                      (kTransferUsedDescriptorSetDepthStencilTexturesBit - 1));\n    // Using `depth == false` in makeImageType because comparisons are not\n    // required, and other values of `depth` are causing issues in drivers.\n    // https://github.com/microsoft/DirectXShaderCompiler/issues/1107\n    if (mode.output != TransferOutput::kStencilBit) {\n      source_depth_texture = builder.createVariable(\n          spv::NoPrecision, spv::StorageClassUniformConstant,\n          builder.makeImageType(type_float, spv::Dim2D, false, false,\n                                source_is_multisampled, 1,\n                                spv::ImageFormatUnknown),\n          \"xe_transfer_depth\");\n      builder.addDecoration(source_depth_texture, spv::DecorationDescriptorSet,\n                            source_depth_stencil_descriptor_set);\n      builder.addDecoration(source_depth_texture, spv::DecorationBinding, 0);\n    }\n    if (mode.output != TransferOutput::kDepth ||\n        shader_uses_stencil_reference_output) {\n      source_stencil_texture = builder.createVariable(\n          spv::NoPrecision, spv::StorageClassUniformConstant,\n          builder.makeImageType(type_uint, spv::Dim2D, false, false,\n                                source_is_multisampled, 1,\n                                spv::ImageFormatUnknown),\n          \"xe_transfer_stencil\");\n      builder.addDecoration(source_stencil_texture,\n                            spv::DecorationDescriptorSet,\n                            source_depth_stencil_descriptor_set);\n      builder.addDecoration(source_stencil_texture, spv::DecorationBinding, 1);\n    }\n  }\n  // Host depth source buffer.\n  spv::Id host_depth_source_buffer = spv::NoResult;\n  if (pipeline_layout_info.used_descriptor_sets &\n      kTransferUsedDescriptorSetHostDepthBufferBit) {\n    id_vector_temp.clear();\n    id_vector_temp.push_back(builder.makeRuntimeArray(type_uint));\n    // Storage buffers have std430 packing, no padding to 4-component vectors.\n    builder.addDecoration(id_vector_temp.back(), spv::DecorationArrayStride,\n                          sizeof(uint32_t));\n    spv::Id type_host_depth_source_buffer =\n        builder.makeStructType(id_vector_temp, \"XeTransferHostDepthBuffer\");\n    builder.addMemberName(type_host_depth_source_buffer, 0, \"host_depth\");\n    builder.addMemberDecoration(type_host_depth_source_buffer, 0,\n                                spv::DecorationNonWritable);\n    builder.addMemberDecoration(type_host_depth_source_buffer, 0,\n                                spv::DecorationOffset, 0);\n    // Block since SPIR-V 1.3, but since SPIR-V 1.0 is generated, it's\n    // BufferBlock.\n    builder.addDecoration(type_host_depth_source_buffer,\n                          spv::DecorationBufferBlock);\n    // StorageBuffer since SPIR-V 1.3, but since SPIR-V 1.0 is generated, it's\n    // Uniform.\n    host_depth_source_buffer = builder.createVariable(\n        spv::NoPrecision, spv::StorageClassUniform,\n        type_host_depth_source_buffer, \"xe_transfer_host_depth_buffer\");\n    builder.addDecoration(\n        host_depth_source_buffer, spv::DecorationDescriptorSet,\n        xe::bit_count(pipeline_layout_info.used_descriptor_sets &\n                      (kTransferUsedDescriptorSetHostDepthBufferBit - 1)));\n    builder.addDecoration(host_depth_source_buffer, spv::DecorationBinding, 0);\n  }\n  // Host depth source texture (the depth / stencil descriptor set is reused,\n  // but stencil is not needed).\n  spv::Id host_depth_source_texture = spv::NoResult;\n  if (pipeline_layout_info.used_descriptor_sets &\n      kTransferUsedDescriptorSetHostDepthStencilTexturesBit) {\n    host_depth_source_texture = builder.createVariable(\n        spv::NoPrecision, spv::StorageClassUniformConstant,\n        builder.makeImageType(\n            type_float, spv::Dim2D, false, false,\n            key.host_depth_source_msaa_samples != xenos::MsaaSamples::k1X, 1,\n            spv::ImageFormatUnknown),\n        \"xe_transfer_host_depth\");\n    builder.addDecoration(\n        host_depth_source_texture, spv::DecorationDescriptorSet,\n        xe::bit_count(\n            pipeline_layout_info.used_descriptor_sets &\n            (kTransferUsedDescriptorSetHostDepthStencilTexturesBit - 1)));\n    builder.addDecoration(host_depth_source_texture, spv::DecorationBinding, 0);\n  }\n  // Push constants.\n  id_vector_temp.clear();\n  uint32_t push_constants_member_host_depth_address = UINT32_MAX;\n  if (pipeline_layout_info.used_push_constant_dwords &\n      kTransferUsedPushConstantDwordHostDepthAddressBit) {\n    push_constants_member_host_depth_address = uint32_t(id_vector_temp.size());\n    id_vector_temp.push_back(type_uint);\n  }\n  uint32_t push_constants_member_address = UINT32_MAX;\n  if (pipeline_layout_info.used_push_constant_dwords &\n      kTransferUsedPushConstantDwordAddressBit) {\n    push_constants_member_address = uint32_t(id_vector_temp.size());\n    id_vector_temp.push_back(type_uint);\n  }\n  uint32_t push_constants_member_stencil_mask = UINT32_MAX;\n  if (pipeline_layout_info.used_push_constant_dwords &\n      kTransferUsedPushConstantDwordStencilMaskBit) {\n    push_constants_member_stencil_mask = uint32_t(id_vector_temp.size());\n    id_vector_temp.push_back(type_uint);\n  }\n  spv::Id push_constants = spv::NoResult;\n  if (!id_vector_temp.empty()) {\n    spv::Id type_push_constants =\n        builder.makeStructType(id_vector_temp, \"XeTransferPushConstants\");\n    if (pipeline_layout_info.used_push_constant_dwords &\n        kTransferUsedPushConstantDwordHostDepthAddressBit) {\n      assert_true(push_constants_member_host_depth_address != UINT32_MAX);\n      builder.addMemberName(type_push_constants,\n                            push_constants_member_host_depth_address,\n                            \"host_depth_address\");\n      builder.addMemberDecoration(\n          type_push_constants, push_constants_member_host_depth_address,\n          spv::DecorationOffset,\n          sizeof(uint32_t) *\n              xe::bit_count(\n                  pipeline_layout_info.used_push_constant_dwords &\n                  (kTransferUsedPushConstantDwordHostDepthAddressBit - 1)));\n    }\n    if (pipeline_layout_info.used_push_constant_dwords &\n        kTransferUsedPushConstantDwordAddressBit) {\n      assert_true(push_constants_member_address != UINT32_MAX);\n      builder.addMemberName(type_push_constants, push_constants_member_address,\n                            \"address\");\n      builder.addMemberDecoration(\n          type_push_constants, push_constants_member_address,\n          spv::DecorationOffset,\n          sizeof(uint32_t) *\n              xe::bit_count(pipeline_layout_info.used_push_constant_dwords &\n                            (kTransferUsedPushConstantDwordAddressBit - 1)));\n    }\n    if (pipeline_layout_info.used_push_constant_dwords &\n        kTransferUsedPushConstantDwordStencilMaskBit) {\n      assert_true(push_constants_member_stencil_mask != UINT32_MAX);\n      builder.addMemberName(type_push_constants,\n                            push_constants_member_stencil_mask, \"stencil_mask\");\n      builder.addMemberDecoration(\n          type_push_constants, push_constants_member_stencil_mask,\n          spv::DecorationOffset,\n          sizeof(uint32_t) *\n              xe::bit_count(\n                  pipeline_layout_info.used_push_constant_dwords &\n                  (kTransferUsedPushConstantDwordStencilMaskBit - 1)));\n    }\n    builder.addDecoration(type_push_constants, spv::DecorationBlock);\n    push_constants = builder.createVariable(\n        spv::NoPrecision, spv::StorageClassPushConstant, type_push_constants,\n        \"xe_transfer_push_constants\");\n  }\n\n  // Coordinate inputs.\n  spv::Id input_fragment_coord = builder.createVariable(\n      spv::NoPrecision, spv::StorageClassInput, type_float4, \"gl_FragCoord\");\n  builder.addDecoration(input_fragment_coord, spv::DecorationBuiltIn,\n                        spv::BuiltInFragCoord);\n  main_interface.push_back(input_fragment_coord);\n  spv::Id input_sample_id = spv::NoResult;\n  spv::Id spec_const_sample_id = spv::NoResult;\n  if (key.dest_msaa_samples != xenos::MsaaSamples::k1X) {\n    if (device_properties.sampleRateShading) {\n      // One draw for all samples.\n      builder.addCapability(spv::CapabilitySampleRateShading);\n      input_sample_id = builder.createVariable(\n          spv::NoPrecision, spv::StorageClassInput, type_int, \"gl_SampleID\");\n      builder.addDecoration(input_sample_id, spv::DecorationFlat);\n      builder.addDecoration(input_sample_id, spv::DecorationBuiltIn,\n                            spv::BuiltInSampleId);\n      main_interface.push_back(input_sample_id);\n    } else {\n      // One sample per draw, with different sample masks.\n      spec_const_sample_id = builder.makeUintConstant(0, true);\n      builder.addName(spec_const_sample_id, \"xe_transfer_sample_id\");\n      builder.addDecoration(spec_const_sample_id, spv::DecorationSpecId, 0);\n    }\n  }\n\n  // Begin the main function.\n  std::vector<spv::Id> main_param_types;\n  std::vector<std::vector<spv::Decoration>> main_precisions;\n  spv::Block* main_entry;\n  spv::Function* main_function =\n      builder.makeFunctionEntry(spv::NoPrecision, type_void, \"main\",\n                                main_param_types, main_precisions, &main_entry);\n\n  // Working with unsigned numbers for simplicity now, bitcasting to signed will\n  // be done at texture fetch.\n\n  uint32_t tile_width_samples =\n      xenos::kEdramTileWidthSamples * draw_resolution_scale_x();\n  uint32_t tile_height_samples =\n      xenos::kEdramTileHeightSamples * draw_resolution_scale_y();\n\n  // Split the destination pixel index into 32bpp tile and 32bpp-tile-relative\n  // pixel index.\n  // Note that division by non-power-of-two constants will include a 4-cycle\n  // 32*32 multiplication on AMD, even though so many bits are not needed for\n  // the pixel position - however, if an OpUnreachable path is inserted for the\n  // case when the position has upper bits set, for some reason, the code for it\n  // is not eliminated when compiling the shader for AMD via RenderDoc on\n  // Windows, as of June 2022.\n  uint_vector_temp.clear();\n  uint_vector_temp.push_back(0);\n  uint_vector_temp.push_back(1);\n  spv::Id dest_pixel_coord = builder.createUnaryOp(\n      spv::OpConvertFToU, type_uint2,\n      builder.createRvalueSwizzle(\n          spv::NoPrecision, type_float2,\n          builder.createLoad(input_fragment_coord, spv::NoPrecision),\n          uint_vector_temp));\n  spv::Id dest_pixel_x =\n      builder.createCompositeExtract(dest_pixel_coord, type_uint, 0);\n  spv::Id const_dest_tile_width_pixels = builder.makeUintConstant(\n      tile_width_samples >>\n      (uint32_t(dest_is_64bpp) +\n       uint32_t(key.dest_msaa_samples >= xenos::MsaaSamples::k4X)));\n  spv::Id dest_tile_index_x = builder.createBinOp(\n      spv::OpUDiv, type_uint, dest_pixel_x, const_dest_tile_width_pixels);\n  spv::Id dest_tile_pixel_x = builder.createBinOp(\n      spv::OpUMod, type_uint, dest_pixel_x, const_dest_tile_width_pixels);\n  spv::Id dest_pixel_y =\n      builder.createCompositeExtract(dest_pixel_coord, type_uint, 1);\n  spv::Id const_dest_tile_height_pixels = builder.makeUintConstant(\n      tile_height_samples >>\n      uint32_t(key.dest_msaa_samples >= xenos::MsaaSamples::k2X));\n  spv::Id dest_tile_index_y = builder.createBinOp(\n      spv::OpUDiv, type_uint, dest_pixel_y, const_dest_tile_height_pixels);\n  spv::Id dest_tile_pixel_y = builder.createBinOp(\n      spv::OpUMod, type_uint, dest_pixel_y, const_dest_tile_height_pixels);\n\n  assert_true(push_constants_member_address != UINT32_MAX);\n  id_vector_temp.clear();\n  id_vector_temp.push_back(\n      builder.makeIntConstant(int32_t(push_constants_member_address)));\n  spv::Id address_constant = builder.createLoad(\n      builder.createAccessChain(spv::StorageClassPushConstant, push_constants,\n                                id_vector_temp),\n      spv::NoPrecision);\n\n  // Calculate the 32bpp tile index from its X and Y parts.\n  spv::Id dest_tile_index = builder.createBinOp(\n      spv::OpIAdd, type_uint,\n      builder.createBinOp(\n          spv::OpIMul, type_uint,\n          builder.createTriOp(\n              spv::OpBitFieldUExtract, type_uint, address_constant,\n              builder.makeUintConstant(0),\n              builder.makeUintConstant(xenos::kEdramPitchTilesBits)),\n          dest_tile_index_y),\n      dest_tile_index_x);\n\n  // Load the destination sample index.\n  spv::Id dest_sample_id = spv::NoResult;\n  if (key.dest_msaa_samples != xenos::MsaaSamples::k1X) {\n    if (device_properties.sampleRateShading) {\n      assert_true(input_sample_id != spv::NoResult);\n      dest_sample_id = builder.createUnaryOp(\n          spv::OpBitcast, type_uint,\n          builder.createLoad(input_sample_id, spv::NoPrecision));\n    } else {\n      assert_true(spec_const_sample_id != spv::NoResult);\n      // Already uint.\n      dest_sample_id = spec_const_sample_id;\n    }\n  }\n\n  // Transform the destination framebuffer pixel and sample coordinates into the\n  // source texture pixel and sample coordinates.\n\n  // First sample bit at 4x with Vulkan standard locations - horizontal sample.\n  // Second sample bit at 4x with Vulkan standard locations - vertical sample.\n  // At 2x:\n  // - Native 2x: top is 1 in Vulkan, bottom is 0.\n  // - 2x as 4x: top is 0, bottom is 3.\n\n  spv::Id source_sample_id = dest_sample_id;\n  spv::Id source_tile_pixel_x = dest_tile_pixel_x;\n  spv::Id source_tile_pixel_y = dest_tile_pixel_y;\n  spv::Id source_color_half = spv::NoResult;\n  if (!source_is_64bpp && dest_is_64bpp) {\n    // 32bpp -> 64bpp, need two samples of the source.\n    if (key.source_msaa_samples >= xenos::MsaaSamples::k4X) {\n      // 32bpp -> 64bpp, 4x ->.\n      // Source has 32bpp halves in two adjacent samples.\n      if (key.dest_msaa_samples >= xenos::MsaaSamples::k4X) {\n        // 32bpp -> 64bpp, 4x -> 4x.\n        // 1 destination horizontal sample = 2 source horizontal samples.\n        // D p0,0 s0,0 = S p0,0 s0,0 | S p0,0 s1,0\n        // D p0,0 s1,0 = S p1,0 s0,0 | S p1,0 s1,0\n        // D p0,0 s0,1 = S p0,0 s0,1 | S p0,0 s1,1\n        // D p0,0 s1,1 = S p1,0 s0,1 | S p1,0 s1,1\n        // Thus destination horizontal sample -> source horizontal pixel,\n        // vertical samples are 1:1.\n        source_sample_id =\n            builder.createBinOp(spv::OpBitwiseAnd, type_uint, dest_sample_id,\n                                builder.makeUintConstant(1 << 1));\n        source_tile_pixel_x = builder.createQuadOp(\n            spv::OpBitFieldInsert, type_uint, dest_sample_id, dest_tile_pixel_x,\n            builder.makeUintConstant(1), builder.makeUintConstant(31));\n      } else if (key.dest_msaa_samples == xenos::MsaaSamples::k2X) {\n        // 32bpp -> 64bpp, 4x -> 2x.\n        // 1 destination horizontal pixel = 2 source horizontal samples.\n        // D p0,0 s0 = S p0,0 s0,0 | S p0,0 s1,0\n        // D p0,0 s1 = S p0,0 s0,1 | S p0,0 s1,1\n        // D p1,0 s0 = S p1,0 s0,0 | S p1,0 s1,0\n        // D p1,0 s1 = S p1,0 s0,1 | S p1,0 s1,1\n        // Pixel index can be reused. Sample 1 (for native 2x) or 0 (for 2x as\n        // 4x) should become samples 01, sample 0 or 3 should become samples 23.\n        if (msaa_2x_attachments_supported_) {\n          source_sample_id = builder.createBinOp(\n              spv::OpShiftLeftLogical, type_uint,\n              builder.createBinOp(spv::OpBitwiseXor, type_uint, dest_sample_id,\n                                  builder.makeUintConstant(1)),\n              builder.makeUintConstant(1));\n        } else {\n          source_sample_id =\n              builder.createBinOp(spv::OpBitwiseAnd, type_uint, dest_sample_id,\n                                  builder.makeUintConstant(1 << 1));\n        }\n      } else {\n        // 32bpp -> 64bpp, 4x -> 1x.\n        // 1 destination horizontal pixel = 2 source horizontal samples.\n        // D p0,0 = S p0,0 s0,0 | S p0,0 s1,0\n        // D p0,1 = S p0,0 s0,1 | S p0,0 s1,1\n        // Horizontal pixel index can be reused. Vertical pixel 1 should\n        // become sample 2.\n        source_sample_id = builder.createQuadOp(\n            spv::OpBitFieldInsert, type_uint, builder.makeUintConstant(0),\n            dest_tile_pixel_y, builder.makeUintConstant(1),\n            builder.makeUintConstant(1));\n        source_tile_pixel_y =\n            builder.createBinOp(spv::OpShiftRightLogical, type_uint,\n                                dest_tile_pixel_y, builder.makeUintConstant(1));\n      }\n    } else {\n      // 32bpp -> 64bpp, 1x/2x ->.\n      // Source has 32bpp halves in two adjacent pixels.\n      if (key.dest_msaa_samples >= xenos::MsaaSamples::k4X) {\n        // 32bpp -> 64bpp, 1x/2x -> 4x.\n        // The X part.\n        // 1 destination horizontal sample = 2 source horizontal pixels.\n        source_tile_pixel_x = builder.createQuadOp(\n            spv::OpBitFieldInsert, type_uint,\n            builder.createBinOp(spv::OpShiftLeftLogical, type_uint,\n                                dest_tile_pixel_x, builder.makeUintConstant(2)),\n            dest_sample_id, builder.makeUintConstant(1),\n            builder.makeUintConstant(1));\n        // Y is handled by common code.\n      } else {\n        // 32bpp -> 64bpp, 1x/2x -> 1x/2x.\n        // The X part.\n        // 1 destination horizontal pixel = 2 source horizontal pixels.\n        source_tile_pixel_x =\n            builder.createBinOp(spv::OpShiftLeftLogical, type_uint,\n                                dest_tile_pixel_x, builder.makeUintConstant(1));\n        // Y is handled by common code.\n      }\n    }\n  } else if (source_is_64bpp && !dest_is_64bpp) {\n    // 64bpp -> 32bpp, also the half to load.\n    if (key.dest_msaa_samples >= xenos::MsaaSamples::k4X) {\n      // 64bpp -> 32bpp, -> 4x.\n      // The needed half is in the destination horizontal sample index.\n      if (key.source_msaa_samples >= xenos::MsaaSamples::k4X) {\n        // 64bpp -> 32bpp, 4x -> 4x.\n        // D p0,0 s0,0 = S s0,0 low\n        // D p0,0 s1,0 = S s0,0 high\n        // D p1,0 s0,0 = S s1,0 low\n        // D p1,0 s1,0 = S s1,0 high\n        // Vertical pixel and sample (second bit) addressing is the same.\n        // However, 1 horizontal destination pixel = 1 horizontal source sample.\n        source_sample_id = builder.createQuadOp(\n            spv::OpBitFieldInsert, type_uint, dest_sample_id, dest_tile_pixel_x,\n            builder.makeUintConstant(0), builder.makeUintConstant(1));\n        // 2 destination horizontal samples = 1 source horizontal sample, thus\n        // 2 destination horizontal pixels = 1 source horizontal pixel.\n        source_tile_pixel_x =\n            builder.createBinOp(spv::OpShiftRightLogical, type_uint,\n                                dest_tile_pixel_x, builder.makeUintConstant(1));\n      } else {\n        // 64bpp -> 32bpp, 1x/2x -> 4x.\n        // 2 destination horizontal samples = 1 source horizontal pixel, thus\n        // 1 destination horizontal pixel = 1 source horizontal pixel. Can reuse\n        // horizontal pixel index.\n        // Y is handled by common code.\n      }\n      // Half from the destination horizontal sample index.\n      source_color_half =\n          builder.createBinOp(spv::OpBitwiseAnd, type_uint, dest_sample_id,\n                              builder.makeUintConstant(1));\n    } else {\n      // 64bpp -> 32bpp, -> 1x/2x.\n      // The needed half is in the destination horizontal pixel index.\n      if (key.source_msaa_samples >= xenos::MsaaSamples::k4X) {\n        // 64bpp -> 32bpp, 4x -> 1x/2x.\n        // (Destination horizontal pixel >> 1) & 1 = source horizontal sample\n        // (first bit).\n        source_sample_id = builder.createTriOp(\n            spv::OpBitFieldUExtract, type_uint, dest_tile_pixel_x,\n            builder.makeUintConstant(1), builder.makeUintConstant(1));\n        if (key.dest_msaa_samples == xenos::MsaaSamples::k2X) {\n          // 64bpp -> 32bpp, 4x -> 2x.\n          // Destination vertical samples (1/0 in the first bit for native 2x or\n          // 0/1 in the second bit for 2x as 4x) = source vertical samples\n          // (second bit).\n          if (msaa_2x_attachments_supported_) {\n            source_sample_id = builder.createQuadOp(\n                spv::OpBitFieldInsert, type_uint, source_sample_id,\n                builder.createBinOp(spv::OpBitwiseXor, type_uint,\n                                    dest_sample_id,\n                                    builder.makeUintConstant(1)),\n                builder.makeUintConstant(1), builder.makeUintConstant(1));\n          } else {\n            source_sample_id = builder.createQuadOp(\n                spv::OpBitFieldInsert, type_uint, dest_sample_id,\n                source_sample_id, builder.makeUintConstant(0),\n                builder.makeUintConstant(1));\n          }\n        } else {\n          // 64bpp -> 32bpp, 4x -> 1x.\n          // 1 destination vertical pixel = 1 source vertical sample.\n          source_sample_id = builder.createQuadOp(\n              spv::OpBitFieldInsert, type_uint, source_sample_id,\n              source_tile_pixel_y, builder.makeUintConstant(1),\n              builder.makeUintConstant(1));\n          source_tile_pixel_y = builder.createBinOp(\n              spv::OpShiftRightLogical, type_uint, dest_tile_pixel_y,\n              builder.makeUintConstant(1));\n        }\n        // 2 destination horizontal pixels = 1 source horizontal sample.\n        // 4 destination horizontal pixels = 1 source horizontal pixel.\n        source_tile_pixel_x =\n            builder.createBinOp(spv::OpShiftRightLogical, type_uint,\n                                dest_tile_pixel_x, builder.makeUintConstant(2));\n      } else {\n        // 64bpp -> 32bpp, 1x/2x -> 1x/2x.\n        // The X part.\n        // 2 destination horizontal pixels = 1 destination source pixel.\n        source_tile_pixel_x =\n            builder.createBinOp(spv::OpShiftRightLogical, type_uint,\n                                dest_tile_pixel_x, builder.makeUintConstant(1));\n        // Y is handled by common code.\n      }\n      // Half from the destination horizontal pixel index.\n      source_color_half =\n          builder.createBinOp(spv::OpBitwiseAnd, type_uint, dest_tile_pixel_x,\n                              builder.makeUintConstant(1));\n    }\n    assert_true(source_color_half != spv::NoResult);\n  } else {\n    // Same bit count.\n    if (key.source_msaa_samples != key.dest_msaa_samples) {\n      if (key.source_msaa_samples >= xenos::MsaaSamples::k4X) {\n        // Same BPP, 4x -> 1x/2x.\n        if (key.dest_msaa_samples == xenos::MsaaSamples::k2X) {\n          // Same BPP, 4x -> 2x.\n          // Horizontal pixels to samples. Vertical sample (1/0 in the first bit\n          // for native 2x or 0/1 in the second bit for 2x as 4x) to second\n          // sample bit.\n          if (msaa_2x_attachments_supported_) {\n            source_sample_id = builder.createQuadOp(\n                spv::OpBitFieldInsert, type_uint, dest_tile_pixel_x,\n                builder.createBinOp(spv::OpBitwiseXor, type_uint,\n                                    dest_sample_id,\n                                    builder.makeUintConstant(1)),\n                builder.makeUintConstant(1), builder.makeUintConstant(31));\n          } else {\n            source_sample_id = builder.createQuadOp(\n                spv::OpBitFieldInsert, type_uint, dest_sample_id,\n                dest_tile_pixel_x, builder.makeUintConstant(0),\n                builder.makeUintConstant(1));\n          }\n          source_tile_pixel_x = builder.createBinOp(\n              spv::OpShiftRightLogical, type_uint, dest_tile_pixel_x,\n              builder.makeUintConstant(1));\n        } else {\n          // Same BPP, 4x -> 1x.\n          // Pixels to samples.\n          source_sample_id = builder.createQuadOp(\n              spv::OpBitFieldInsert, type_uint,\n              builder.createBinOp(spv::OpBitwiseAnd, type_uint,\n                                  dest_tile_pixel_x,\n                                  builder.makeUintConstant(1)),\n              dest_tile_pixel_y, builder.makeUintConstant(1),\n              builder.makeUintConstant(1));\n          source_tile_pixel_x = builder.createBinOp(\n              spv::OpShiftRightLogical, type_uint, dest_tile_pixel_x,\n              builder.makeUintConstant(1));\n          source_tile_pixel_y = builder.createBinOp(\n              spv::OpShiftRightLogical, type_uint, dest_tile_pixel_y,\n              builder.makeUintConstant(1));\n        }\n      } else {\n        // Same BPP, 1x/2x -> 1x/2x/4x (as long as they're different).\n        // Only the X part - Y is handled by common code.\n        if (key.dest_msaa_samples >= xenos::MsaaSamples::k4X) {\n          // Horizontal samples to pixels.\n          source_tile_pixel_x = builder.createQuadOp(\n              spv::OpBitFieldInsert, type_uint, dest_sample_id,\n              dest_tile_pixel_x, builder.makeUintConstant(1),\n              builder.makeUintConstant(31));\n        }\n      }\n    }\n  }\n  // Common source Y and sample index for 1x/2x AA sources, independent of bits\n  // per sample.\n  if (key.source_msaa_samples < xenos::MsaaSamples::k4X &&\n      key.source_msaa_samples != key.dest_msaa_samples) {\n    if (key.dest_msaa_samples >= xenos::MsaaSamples::k4X) {\n      // 1x/2x -> 4x.\n      if (key.source_msaa_samples == xenos::MsaaSamples::k2X) {\n        // 2x -> 4x.\n        // Vertical samples (second bit) of 4x destination to vertical sample\n        // (1, 0 for native 2x, or 0, 3 for 2x as 4x) of 2x source.\n        source_sample_id =\n            builder.createBinOp(spv::OpShiftRightLogical, type_uint,\n                                dest_sample_id, builder.makeUintConstant(1));\n        if (msaa_2x_attachments_supported_) {\n          source_sample_id = builder.createBinOp(spv::OpBitwiseXor, type_uint,\n                                                 source_sample_id,\n                                                 builder.makeUintConstant(1));\n        } else {\n          source_sample_id = builder.createQuadOp(\n              spv::OpBitFieldInsert, type_uint, source_sample_id,\n              source_sample_id, builder.makeUintConstant(1),\n              builder.makeUintConstant(1));\n        }\n      } else {\n        // 1x -> 4x.\n        // Vertical samples (second bit) to Y pixels.\n        source_tile_pixel_y = builder.createQuadOp(\n            spv::OpBitFieldInsert, type_uint,\n            builder.createBinOp(spv::OpShiftRightLogical, type_uint,\n                                dest_sample_id, builder.makeUintConstant(1)),\n            dest_tile_pixel_y, builder.makeUintConstant(1),\n            builder.makeUintConstant(31));\n      }\n    } else {\n      // 1x/2x -> different 1x/2x.\n      if (key.source_msaa_samples == xenos::MsaaSamples::k2X) {\n        // 2x -> 1x.\n        // Vertical pixels of 2x destination to vertical samples (1, 0 for\n        // native 2x, or 0, 3 for 2x as 4x) of 1x source.\n        source_sample_id =\n            builder.createBinOp(spv::OpBitwiseAnd, type_uint, dest_tile_pixel_y,\n                                builder.makeUintConstant(1));\n        if (msaa_2x_attachments_supported_) {\n          source_sample_id = builder.createBinOp(spv::OpBitwiseXor, type_uint,\n                                                 source_sample_id,\n                                                 builder.makeUintConstant(1));\n        } else {\n          source_sample_id = builder.createQuadOp(\n              spv::OpBitFieldInsert, type_uint, source_sample_id,\n              source_sample_id, builder.makeUintConstant(1),\n              builder.makeUintConstant(1));\n        }\n        source_tile_pixel_y =\n            builder.createBinOp(spv::OpShiftRightLogical, type_uint,\n                                dest_tile_pixel_y, builder.makeUintConstant(1));\n      } else {\n        // 1x -> 2x.\n        // Vertical samples (1/0 in the first bit for native 2x or 0/1 in the\n        // second bit for 2x as 4x) of 2x destination to vertical pixels of 1x\n        // source.\n        if (msaa_2x_attachments_supported_) {\n          source_tile_pixel_y = builder.createQuadOp(\n              spv::OpBitFieldInsert, type_uint,\n              builder.createBinOp(spv::OpBitwiseXor, type_uint, dest_sample_id,\n                                  builder.makeUintConstant(1)),\n              dest_tile_pixel_y, builder.makeUintConstant(1),\n              builder.makeUintConstant(31));\n        } else {\n          source_tile_pixel_y = builder.createQuadOp(\n              spv::OpBitFieldInsert, type_uint,\n              builder.createBinOp(spv::OpShiftRightLogical, type_uint,\n                                  dest_sample_id, builder.makeUintConstant(1)),\n              dest_tile_pixel_y, builder.makeUintConstant(1),\n              builder.makeUintConstant(31));\n        }\n      }\n    }\n  }\n\n  uint32_t source_pixel_width_dwords_log2 =\n      uint32_t(key.source_msaa_samples >= xenos::MsaaSamples::k4X) +\n      uint32_t(source_is_64bpp);\n\n  if (source_is_color != dest_is_color) {\n    // Copying between color and depth / stencil - swap 40-32bpp-sample columns\n    // in the pixel index within the source 32bpp tile.\n    uint32_t source_32bpp_tile_half_pixels =\n        tile_width_samples >> (1 + source_pixel_width_dwords_log2);\n    source_tile_pixel_x = builder.createUnaryOp(\n        spv::OpBitcast, type_uint,\n        builder.createBinOp(\n            spv::OpIAdd, type_int,\n            builder.createUnaryOp(spv::OpBitcast, type_int,\n                                  source_tile_pixel_x),\n            builder.createTriOp(\n                spv::OpSelect, type_int,\n                builder.createBinOp(\n                    spv::OpULessThan, builder.makeBoolType(),\n                    source_tile_pixel_x,\n                    builder.makeUintConstant(source_32bpp_tile_half_pixels)),\n                builder.makeIntConstant(int32_t(source_32bpp_tile_half_pixels)),\n                builder.makeIntConstant(\n                    -int32_t(source_32bpp_tile_half_pixels)))));\n  }\n\n  // Transform the destination 32bpp tile index into the source. After the\n  // addition, it may be negative - in which case, the transfer is done across\n  // EDRAM addressing wrapping, and xenos::kEdramTileCount must be added to it,\n  // but `& (xenos::kEdramTileCount - 1)` handles that regardless of the sign.\n  spv::Id source_tile_index = builder.createBinOp(\n      spv::OpBitwiseAnd, type_uint,\n      builder.createUnaryOp(\n          spv::OpBitcast, type_uint,\n          builder.createBinOp(\n              spv::OpIAdd, type_int,\n              builder.createUnaryOp(spv::OpBitcast, type_int, dest_tile_index),\n              builder.createTriOp(\n                  spv::OpBitFieldSExtract, type_int,\n                  builder.createUnaryOp(spv::OpBitcast, type_int,\n                                        address_constant),\n                  builder.makeUintConstant(xenos::kEdramPitchTilesBits * 2),\n                  builder.makeUintConstant(xenos::kEdramBaseTilesBits + 1)))),\n      builder.makeUintConstant(xenos::kEdramTileCount - 1));\n  // Split the source 32bpp tile index into X and Y tile index within the source\n  // image.\n  spv::Id source_pitch_tiles = builder.createTriOp(\n      spv::OpBitFieldUExtract, type_uint, address_constant,\n      builder.makeUintConstant(xenos::kEdramPitchTilesBits),\n      builder.makeUintConstant(xenos::kEdramPitchTilesBits));\n  spv::Id source_tile_index_y = builder.createBinOp(\n      spv::OpUDiv, type_uint, source_tile_index, source_pitch_tiles);\n  spv::Id source_tile_index_x = builder.createBinOp(\n      spv::OpUMod, type_uint, source_tile_index, source_pitch_tiles);\n  // Finally calculate the source texture coordinates.\n  spv::Id source_pixel_x_int = builder.createUnaryOp(\n      spv::OpBitcast, type_int,\n      builder.createBinOp(\n          spv::OpIAdd, type_uint,\n          builder.createBinOp(\n              spv::OpIMul, type_uint,\n              builder.makeUintConstant(tile_width_samples >>\n                                       source_pixel_width_dwords_log2),\n              source_tile_index_x),\n          source_tile_pixel_x));\n  spv::Id source_pixel_y_int = builder.createUnaryOp(\n      spv::OpBitcast, type_int,\n      builder.createBinOp(\n          spv::OpIAdd, type_uint,\n          builder.createBinOp(\n              spv::OpIMul, type_uint,\n              builder.makeUintConstant(\n                  tile_height_samples >>\n                  uint32_t(key.source_msaa_samples >= xenos::MsaaSamples::k2X)),\n              source_tile_index_y),\n          source_tile_pixel_y));\n\n  // Load the source.\n\n  spv::Builder::TextureParameters source_texture_parameters = {};\n  id_vector_temp.clear();\n  id_vector_temp.push_back(source_pixel_x_int);\n  id_vector_temp.push_back(source_pixel_y_int);\n  spv::Id source_coordinates[2] = {\n      builder.createCompositeConstruct(type_int2, id_vector_temp),\n  };\n  spv::Id source_sample_ids_int[2] = {};\n  if (key.source_msaa_samples != xenos::MsaaSamples::k1X) {\n    source_sample_ids_int[0] =\n        builder.createUnaryOp(spv::OpBitcast, type_int, source_sample_id);\n  } else {\n    source_texture_parameters.lod = builder.makeIntConstant(0);\n  }\n  // Go to the next sample or pixel along X if need to load two dwords.\n  bool source_load_is_two_32bpp_samples = !source_is_64bpp && dest_is_64bpp;\n  if (source_load_is_two_32bpp_samples) {\n    if (key.source_msaa_samples >= xenos::MsaaSamples::k4X) {\n      source_coordinates[1] = source_coordinates[0];\n      source_sample_ids_int[1] = builder.createBinOp(\n          spv::OpBitwiseOr, type_int, source_sample_ids_int[0],\n          builder.makeIntConstant(1));\n    } else {\n      id_vector_temp.clear();\n      id_vector_temp.push_back(builder.createBinOp(spv::OpBitwiseOr, type_int,\n                                                   source_pixel_x_int,\n                                                   builder.makeIntConstant(1)));\n      id_vector_temp.push_back(source_pixel_y_int);\n      source_coordinates[1] =\n          builder.createCompositeConstruct(type_int2, id_vector_temp);\n      source_sample_ids_int[1] = source_sample_ids_int[0];\n    }\n  }\n  spv::Id source_color[2][4] = {};\n  if (source_color_texture != spv::NoResult) {\n    source_texture_parameters.sampler =\n        builder.createLoad(source_color_texture, spv::NoPrecision);\n    assert_true(source_color_component_type != spv::NoType);\n    spv::Id source_color_vec4_type =\n        builder.makeVectorType(source_color_component_type, 4);\n    for (uint32_t i = 0; i <= uint32_t(source_load_is_two_32bpp_samples); ++i) {\n      source_texture_parameters.coords = source_coordinates[i];\n      source_texture_parameters.sample = source_sample_ids_int[i];\n      spv::Id source_color_vec4 = builder.createTextureCall(\n          spv::NoPrecision, source_color_vec4_type, false, true, false, false,\n          false, source_texture_parameters, spv::ImageOperandsMaskNone);\n      uint32_t source_color_components_remaining =\n          source_color_texture_component_mask;\n      uint32_t source_color_component_index;\n      while (xe::bit_scan_forward(source_color_components_remaining,\n                                  &source_color_component_index)) {\n        source_color_components_remaining &=\n            ~(uint32_t(1) << source_color_component_index);\n        source_color[i][source_color_component_index] =\n            builder.createCompositeExtract(source_color_vec4,\n                                           source_color_component_type,\n                                           source_color_component_index);\n      }\n    }\n  }\n  spv::Id source_depth_float[2] = {};\n  if (source_depth_texture != spv::NoResult) {\n    source_texture_parameters.sampler =\n        builder.createLoad(source_depth_texture, spv::NoPrecision);\n    for (uint32_t i = 0; i <= uint32_t(source_load_is_two_32bpp_samples); ++i) {\n      source_texture_parameters.coords = source_coordinates[i];\n      source_texture_parameters.sample = source_sample_ids_int[i];\n      source_depth_float[i] = builder.createCompositeExtract(\n          builder.createTextureCall(\n              spv::NoPrecision, type_float4, false, true, false, false, false,\n              source_texture_parameters, spv::ImageOperandsMaskNone),\n          type_float, 0);\n    }\n  }\n  spv::Id source_stencil[2] = {};\n  if (source_stencil_texture != spv::NoResult) {\n    source_texture_parameters.sampler =\n        builder.createLoad(source_stencil_texture, spv::NoPrecision);\n    for (uint32_t i = 0; i <= uint32_t(source_load_is_two_32bpp_samples); ++i) {\n      source_texture_parameters.coords = source_coordinates[i];\n      source_texture_parameters.sample = source_sample_ids_int[i];\n      source_stencil[i] = builder.createCompositeExtract(\n          builder.createTextureCall(\n              spv::NoPrecision, type_uint4, false, true, false, false, false,\n              source_texture_parameters, spv::ImageOperandsMaskNone),\n          type_uint, 0);\n    }\n  }\n\n  // Pick the needed 32bpp half of the 64bpp color.\n  if (source_is_64bpp && !dest_is_64bpp) {\n    uint32_t source_color_half_component_count =\n        source_color_format_component_count >> 1;\n    assert_true(source_color_half != spv::NoResult);\n    spv::Id source_color_is_second_half =\n        builder.createBinOp(spv::OpINotEqual, type_bool, source_color_half,\n                            builder.makeUintConstant(0));\n    if (mode.output == TransferOutput::kStencilBit) {\n      source_color[0][0] = builder.createTriOp(\n          spv::OpSelect, source_color_component_type,\n          source_color_is_second_half,\n          source_color[0][source_color_half_component_count],\n          source_color[0][0]);\n    } else {\n      for (uint32_t i = 0; i < source_color_half_component_count; ++i) {\n        source_color[0][i] = builder.createTriOp(\n            spv::OpSelect, source_color_component_type,\n            source_color_is_second_half,\n            source_color[0][source_color_half_component_count + i],\n            source_color[0][i]);\n      }\n    }\n  }\n\n  if (output_fragment_stencil_ref != spv::NoResult &&\n      source_stencil[0] != spv::NoResult) {\n    // For the depth -> depth case, write the stencil directly to the output.\n    assert_true(mode.output == TransferOutput::kDepth);\n    builder.createStore(\n        builder.createUnaryOp(spv::OpBitcast, type_int, source_stencil[0]),\n        output_fragment_stencil_ref);\n  }\n\n  if (dest_is_64bpp) {\n    // Construct the 64bpp color from two 32-bit samples or one 64-bit sample.\n    // If `packed` (two uints) are created, use the generic path involving\n    // unpacking.\n    // Otherwise, the fragment data output must be written to directly by the\n    // reached control flow path.\n    spv::Id packed[2] = {};\n    if (source_is_color) {\n      switch (source_color_format) {\n        case xenos::ColorRenderTargetFormat::k_8_8_8_8:\n        case xenos::ColorRenderTargetFormat::k_8_8_8_8_GAMMA: {\n          spv::Id unorm_round_offset = builder.makeFloatConstant(0.5f);\n          spv::Id unorm_scale = builder.makeFloatConstant(255.0f);\n          spv::Id component_width = builder.makeUintConstant(8);\n          for (uint32_t i = 0; i < 2; ++i) {\n            packed[i] = builder.createUnaryOp(\n                spv::OpConvertFToU, type_uint,\n                builder.createBinOp(\n                    spv::OpFAdd, type_float,\n                    builder.createBinOp(spv::OpFMul, type_float,\n                                        source_color[i][0], unorm_scale),\n                    unorm_round_offset));\n            for (uint32_t j = 1; j < 4; ++j) {\n              packed[i] = builder.createQuadOp(\n                  spv::OpBitFieldInsert, type_uint, packed[i],\n                  builder.createUnaryOp(\n                      spv::OpConvertFToU, type_uint,\n                      builder.createBinOp(\n                          spv::OpFAdd, type_float,\n                          builder.createBinOp(spv::OpFMul, type_float,\n                                              source_color[i][j], unorm_scale),\n                          unorm_round_offset)),\n                  builder.makeUintConstant(8 * j), component_width);\n            }\n          }\n        } break;\n        case xenos::ColorRenderTargetFormat::k_2_10_10_10:\n        case xenos::ColorRenderTargetFormat::k_2_10_10_10_AS_10_10_10_10: {\n          spv::Id unorm_round_offset = builder.makeFloatConstant(0.5f);\n          spv::Id unorm_scale_rgb = builder.makeFloatConstant(1023.0f);\n          spv::Id width_rgb = builder.makeUintConstant(10);\n          spv::Id unorm_scale_a = builder.makeFloatConstant(3.0f);\n          spv::Id width_a = builder.makeUintConstant(2);\n          for (uint32_t i = 0; i < 2; ++i) {\n            packed[i] = builder.createUnaryOp(\n                spv::OpConvertFToU, type_uint,\n                builder.createBinOp(\n                    spv::OpFAdd, type_float,\n                    builder.createBinOp(spv::OpFMul, type_float,\n                                        source_color[i][0], unorm_scale_rgb),\n                    unorm_round_offset));\n            for (uint32_t j = 1; j < 4; ++j) {\n              packed[i] = builder.createQuadOp(\n                  spv::OpBitFieldInsert, type_uint, packed[i],\n                  builder.createUnaryOp(\n                      spv::OpConvertFToU, type_uint,\n                      builder.createBinOp(\n                          spv::OpFAdd, type_float,\n                          builder.createBinOp(\n                              spv::OpFMul, type_float, source_color[i][j],\n                              j == 3 ? unorm_scale_a : unorm_scale_rgb),\n                          unorm_round_offset)),\n                  builder.makeUintConstant(10 * j),\n                  j == 3 ? width_a : width_rgb);\n            }\n          }\n        } break;\n        case xenos::ColorRenderTargetFormat::k_2_10_10_10_FLOAT:\n        case xenos::ColorRenderTargetFormat::\n            k_2_10_10_10_FLOAT_AS_16_16_16_16: {\n          spv::Id width_rgb = builder.makeUintConstant(10);\n          spv::Id float_0 = builder.makeFloatConstant(0.0f);\n          spv::Id float_1 = builder.makeFloatConstant(1.0f);\n          spv::Id unorm_round_offset = builder.makeFloatConstant(0.5f);\n          spv::Id unorm_scale_a = builder.makeFloatConstant(3.0f);\n          spv::Id offset_a = builder.makeUintConstant(30);\n          spv::Id width_a = builder.makeUintConstant(2);\n          for (uint32_t i = 0; i < 2; ++i) {\n            // Float16 has a wider range for both color and alpha, also NaNs -\n            // clamp and convert.\n            packed[i] = SpirvShaderTranslator::UnclampedFloat32To7e3(\n                builder, source_color[i][0], ext_inst_glsl_std_450);\n            for (uint32_t j = 1; j < 3; ++j) {\n              packed[i] = builder.createQuadOp(\n                  spv::OpBitFieldInsert, type_uint, packed[i],\n                  SpirvShaderTranslator::UnclampedFloat32To7e3(\n                      builder, source_color[i][j], ext_inst_glsl_std_450),\n                  builder.makeUintConstant(10 * j), width_rgb);\n            }\n            // Saturate and convert the alpha.\n            spv::Id alpha_saturated = builder.createTriBuiltinCall(\n                type_float, ext_inst_glsl_std_450, GLSLstd450NClamp,\n                source_color[i][3], float_0, float_1);\n            packed[i] = builder.createQuadOp(\n                spv::OpBitFieldInsert, type_uint, packed[i],\n                builder.createUnaryOp(\n                    spv::OpConvertFToU, type_uint,\n                    builder.createBinOp(\n                        spv::OpFAdd, type_float,\n                        builder.createBinOp(spv::OpFMul, type_float,\n                                            alpha_saturated, unorm_scale_a),\n                        unorm_round_offset)),\n                offset_a, width_a);\n          }\n        } break;\n        // All 64bpp formats, and all 16 bits per component formats, are\n        // represented as integers in ownership transfer for safe handling of\n        // NaN encodings and -32768 / -32767.\n        // TODO(Triang3l): Handle the case when that's not true (no multisampled\n        // sampled images, no 16-bit UNORM, no cross-packing 32bpp aliasing on a\n        // portability subset device or a 64bpp format where that wouldn't help\n        // anyway).\n        case xenos::ColorRenderTargetFormat::k_16_16:\n        case xenos::ColorRenderTargetFormat::k_16_16_FLOAT: {\n          if (dest_color_format ==\n              xenos::ColorRenderTargetFormat::k_32_32_FLOAT) {\n            spv::Id component_offset_width = builder.makeUintConstant(16);\n            spv::Id color_16_in_32[2];\n            for (uint32_t i = 0; i < 2; ++i) {\n              color_16_in_32[i] = builder.createQuadOp(\n                  spv::OpBitFieldInsert, type_uint, source_color[i][0],\n                  source_color[i][1], component_offset_width,\n                  component_offset_width);\n            }\n            id_vector_temp.clear();\n            id_vector_temp.push_back(color_16_in_32[0]);\n            id_vector_temp.push_back(color_16_in_32[1]);\n            builder.createStore(builder.createCompositeConstruct(\n                                    type_fragment_data, id_vector_temp),\n                                output_fragment_data);\n          } else {\n            id_vector_temp.clear();\n            for (uint32_t i = 0; i < 4; ++i) {\n              id_vector_temp.push_back(source_color[i >> 1][i & 1]);\n            }\n            builder.createStore(builder.createCompositeConstruct(\n                                    type_fragment_data, id_vector_temp),\n                                output_fragment_data);\n          }\n        } break;\n        case xenos::ColorRenderTargetFormat::k_16_16_16_16:\n        case xenos::ColorRenderTargetFormat::k_16_16_16_16_FLOAT: {\n          if (dest_color_format ==\n              xenos::ColorRenderTargetFormat::k_32_32_FLOAT) {\n            spv::Id component_offset_width = builder.makeUintConstant(16);\n            spv::Id color_16_in_32[2];\n            for (uint32_t i = 0; i < 2; ++i) {\n              color_16_in_32[i] = builder.createQuadOp(\n                  spv::OpBitFieldInsert, type_uint, source_color[0][i << 1],\n                  source_color[0][(i << 1) + 1], component_offset_width,\n                  component_offset_width);\n            }\n            id_vector_temp.clear();\n            id_vector_temp.push_back(color_16_in_32[0]);\n            id_vector_temp.push_back(color_16_in_32[1]);\n            builder.createStore(builder.createCompositeConstruct(\n                                    type_fragment_data, id_vector_temp),\n                                output_fragment_data);\n          } else {\n            id_vector_temp.clear();\n            for (uint32_t i = 0; i < 4; ++i) {\n              id_vector_temp.push_back(source_color[0][i]);\n            }\n            builder.createStore(builder.createCompositeConstruct(\n                                    type_fragment_data, id_vector_temp),\n                                output_fragment_data);\n          }\n        } break;\n        // Float32 is transferred as uint32 to preserve NaN encodings. However,\n        // multisampled sampled image support is optional in Vulkan.\n        case xenos::ColorRenderTargetFormat::k_32_FLOAT: {\n          for (uint32_t i = 0; i < 2; ++i) {\n            packed[i] = source_color[i][0];\n            if (!source_color_is_uint) {\n              packed[i] =\n                  builder.createUnaryOp(spv::OpBitcast, type_uint, packed[i]);\n            }\n          }\n        } break;\n        case xenos::ColorRenderTargetFormat::k_32_32_FLOAT: {\n          for (uint32_t i = 0; i < 2; ++i) {\n            packed[i] = source_color[0][i];\n            if (!source_color_is_uint) {\n              packed[i] =\n                  builder.createUnaryOp(spv::OpBitcast, type_uint, packed[i]);\n            }\n          }\n        } break;\n      }\n    } else {\n      assert_true(source_depth_texture != spv::NoResult);\n      assert_true(source_stencil_texture != spv::NoResult);\n      spv::Id depth_offset = builder.makeUintConstant(8);\n      spv::Id depth_width = builder.makeUintConstant(24);\n      for (uint32_t i = 0; i < 2; ++i) {\n        spv::Id depth24 = spv::NoResult;\n        switch (source_depth_format) {\n          case xenos::DepthRenderTargetFormat::kD24S8: {\n            // Round to the nearest even integer. This seems to be the\n            // correct conversion, adding +0.5 and rounding towards zero results\n            // in red instead of black in the 4D5307E6 clear shader.\n            depth24 = builder.createUnaryOp(\n                spv::OpConvertFToU, type_uint,\n                builder.createUnaryBuiltinCall(\n                    type_float, ext_inst_glsl_std_450, GLSLstd450RoundEven,\n                    builder.createBinOp(\n                        spv::OpFMul, type_float, source_depth_float[i],\n                        builder.makeFloatConstant(float(0xFFFFFF)))));\n          } break;\n          case xenos::DepthRenderTargetFormat::kD24FS8: {\n            depth24 = SpirvShaderTranslator::PreClampedDepthTo20e4(\n                builder, source_depth_float[i], depth_float24_round(), true,\n                ext_inst_glsl_std_450);\n          } break;\n        }\n        // Merge depth and stencil.\n        packed[i] = builder.createQuadOp(spv::OpBitFieldInsert, type_uint,\n                                         source_stencil[i], depth24,\n                                         depth_offset, depth_width);\n      }\n    }\n    // Common path unless there was a specialized one - unpack two packed 32-bit\n    // parts.\n    if (packed[0] != spv::NoResult) {\n      assert_true(packed[1] != spv::NoResult);\n      if (dest_color_format == xenos::ColorRenderTargetFormat::k_32_32_FLOAT) {\n        id_vector_temp.clear();\n        id_vector_temp.push_back(packed[0]);\n        id_vector_temp.push_back(packed[1]);\n        // Multisampled sampled images are optional in Vulkan, and image views\n        // of different formats can't be created separately for sampled image\n        // and color attachment usages, so no multisampled integer sampled image\n        // support implies no multisampled integer framebuffer attachment\n        // support in Xenia.\n        if (!dest_color_is_uint) {\n          for (spv::Id& float32 : id_vector_temp) {\n            float32 =\n                builder.createUnaryOp(spv::OpBitcast, type_float, float32);\n          }\n        }\n        builder.createStore(builder.createCompositeConstruct(type_fragment_data,\n                                                             id_vector_temp),\n                            output_fragment_data);\n      } else {\n        spv::Id const_uint_0 = builder.makeUintConstant(0);\n        spv::Id const_uint_16 = builder.makeUintConstant(16);\n        id_vector_temp.clear();\n        for (uint32_t i = 0; i < 4; ++i) {\n          id_vector_temp.push_back(builder.createTriOp(\n              spv::OpBitFieldUExtract, type_uint, packed[i >> 1],\n              (i & 1) ? const_uint_16 : const_uint_0, const_uint_16));\n        }\n        // TODO(Triang3l): Handle the case when that's not true (no multisampled\n        // sampled images, no 16-bit UNORM, no cross-packing 32bpp aliasing on a\n        // portability subset device or a 64bpp format where that wouldn't help\n        // anyway).\n        builder.createStore(builder.createCompositeConstruct(type_fragment_data,\n                                                             id_vector_temp),\n                            output_fragment_data);\n      }\n    }\n  } else {\n    // If `packed` is created, use the generic path involving unpacking.\n    // - For a color destination, the packed 32bpp color.\n    // - For a depth / stencil destination, stencil in 0:7, depth in 8:31\n    //   normally, or depth in 0:23 and zeros in 24:31 with packed_only_depth.\n    // - For a stencil bit, stencil in 0:7.\n    // Otherwise, the fragment data or fragment depth / stencil output must be\n    // written to directly by the reached control flow path.\n    spv::Id packed = spv::NoResult;\n    bool packed_only_depth = false;\n    if (source_is_color) {\n      switch (source_color_format) {\n        case xenos::ColorRenderTargetFormat::k_8_8_8_8:\n        case xenos::ColorRenderTargetFormat::k_8_8_8_8_GAMMA: {\n          if (dest_is_color &&\n              (dest_color_format == xenos::ColorRenderTargetFormat::k_8_8_8_8 ||\n               dest_color_format ==\n                   xenos::ColorRenderTargetFormat::k_8_8_8_8_GAMMA)) {\n            // Same format - passthrough.\n            id_vector_temp.clear();\n            for (uint32_t i = 0; i < 4; ++i) {\n              id_vector_temp.push_back(source_color[0][i]);\n            }\n            builder.createStore(builder.createCompositeConstruct(\n                                    type_fragment_data, id_vector_temp),\n                                output_fragment_data);\n          } else {\n            spv::Id unorm_round_offset = builder.makeFloatConstant(0.5f);\n            spv::Id unorm_scale = builder.makeFloatConstant(255.0f);\n            uint32_t packed_component_offset = 0;\n            if (mode.output == TransferOutput::kDepth) {\n              // When need only depth, not stencil, skip the red component, and\n              // put the depth from GBA directly in the lower bits.\n              packed_component_offset = 1;\n              packed_only_depth = true;\n              if (output_fragment_stencil_ref != spv::NoResult) {\n                builder.createStore(\n                    builder.createUnaryOp(\n                        spv::OpBitcast, type_int,\n                        builder.createUnaryOp(\n                            spv::OpConvertFToU, type_uint,\n                            builder.createBinOp(\n                                spv::OpFAdd, type_float,\n                                builder.createBinOp(spv::OpFMul, type_float,\n                                                    source_color[0][0],\n                                                    unorm_scale),\n                                unorm_round_offset))),\n                    output_fragment_stencil_ref);\n              }\n            }\n            packed = builder.createUnaryOp(\n                spv::OpConvertFToU, type_uint,\n                builder.createBinOp(\n                    spv::OpFAdd, type_float,\n                    builder.createBinOp(\n                        spv::OpFMul, type_float,\n                        source_color[0][packed_component_offset], unorm_scale),\n                    unorm_round_offset));\n            if (mode.output != TransferOutput::kStencilBit) {\n              spv::Id component_width = builder.makeUintConstant(8);\n              for (uint32_t i = 1; i < 4 - packed_component_offset; ++i) {\n                packed = builder.createQuadOp(\n                    spv::OpBitFieldInsert, type_uint, packed,\n                    builder.createUnaryOp(\n                        spv::OpConvertFToU, type_uint,\n                        builder.createBinOp(\n                            spv::OpFAdd, type_float,\n                            builder.createBinOp(\n                                spv::OpFMul, type_float,\n                                source_color[0][packed_component_offset + i],\n                                unorm_scale),\n                            unorm_round_offset)),\n                    builder.makeUintConstant(8 * i), component_width);\n              }\n            }\n          }\n        } break;\n        case xenos::ColorRenderTargetFormat::k_2_10_10_10:\n        case xenos::ColorRenderTargetFormat::k_2_10_10_10_AS_10_10_10_10: {\n          if (dest_is_color &&\n              (dest_color_format ==\n                   xenos::ColorRenderTargetFormat::k_2_10_10_10 ||\n               dest_color_format == xenos::ColorRenderTargetFormat::\n                                        k_2_10_10_10_AS_10_10_10_10)) {\n            id_vector_temp.clear();\n            for (uint32_t i = 0; i < 4; ++i) {\n              id_vector_temp.push_back(source_color[0][i]);\n            }\n            builder.createStore(builder.createCompositeConstruct(\n                                    type_fragment_data, id_vector_temp),\n                                output_fragment_data);\n          } else {\n            spv::Id unorm_round_offset = builder.makeFloatConstant(0.5f);\n            spv::Id unorm_scale_rgb = builder.makeFloatConstant(1023.0f);\n            packed = builder.createUnaryOp(\n                spv::OpConvertFToU, type_uint,\n                builder.createBinOp(\n                    spv::OpFAdd, type_float,\n                    builder.createBinOp(spv::OpFMul, type_float,\n                                        source_color[0][0], unorm_scale_rgb),\n                    unorm_round_offset));\n            if (mode.output != TransferOutput::kStencilBit) {\n              spv::Id width_rgb = builder.makeUintConstant(10);\n              spv::Id unorm_scale_a = builder.makeFloatConstant(3.0f);\n              spv::Id width_a = builder.makeUintConstant(2);\n              for (uint32_t i = 1; i < 4; ++i) {\n                packed = builder.createQuadOp(\n                    spv::OpBitFieldInsert, type_uint, packed,\n                    builder.createUnaryOp(\n                        spv::OpConvertFToU, type_uint,\n                        builder.createBinOp(\n                            spv::OpFAdd, type_float,\n                            builder.createBinOp(\n                                spv::OpFMul, type_float, source_color[0][i],\n                                i == 3 ? unorm_scale_a : unorm_scale_rgb),\n                            unorm_round_offset)),\n                    builder.makeUintConstant(10 * i),\n                    i == 3 ? width_a : width_rgb);\n              }\n            }\n          }\n        } break;\n        case xenos::ColorRenderTargetFormat::k_2_10_10_10_FLOAT:\n        case xenos::ColorRenderTargetFormat::\n            k_2_10_10_10_FLOAT_AS_16_16_16_16: {\n          if (dest_is_color &&\n              (dest_color_format ==\n                   xenos::ColorRenderTargetFormat::k_2_10_10_10_FLOAT ||\n               dest_color_format == xenos::ColorRenderTargetFormat::\n                                        k_2_10_10_10_FLOAT_AS_16_16_16_16)) {\n            id_vector_temp.clear();\n            for (uint32_t i = 0; i < 4; ++i) {\n              id_vector_temp.push_back(source_color[0][i]);\n            }\n            builder.createStore(builder.createCompositeConstruct(\n                                    type_fragment_data, id_vector_temp),\n                                output_fragment_data);\n          } else {\n            // Float16 has a wider range for both color and alpha, also NaNs -\n            // clamp and convert.\n            packed = SpirvShaderTranslator::UnclampedFloat32To7e3(\n                builder, source_color[0][0], ext_inst_glsl_std_450);\n            if (mode.output != TransferOutput::kStencilBit) {\n              spv::Id width_rgb = builder.makeUintConstant(10);\n              for (uint32_t i = 1; i < 3; ++i) {\n                packed = builder.createQuadOp(\n                    spv::OpBitFieldInsert, type_uint, packed,\n                    SpirvShaderTranslator::UnclampedFloat32To7e3(\n                        builder, source_color[0][i], ext_inst_glsl_std_450),\n                    builder.makeUintConstant(10 * i), width_rgb);\n              }\n              // Saturate and convert the alpha.\n              spv::Id alpha_saturated = builder.createTriBuiltinCall(\n                  type_float, ext_inst_glsl_std_450, GLSLstd450NClamp,\n                  source_color[0][3], builder.makeFloatConstant(0.0f),\n                  builder.makeFloatConstant(1.0f));\n              packed = builder.createQuadOp(\n                  spv::OpBitFieldInsert, type_uint, packed,\n                  builder.createUnaryOp(\n                      spv::OpConvertFToU, type_uint,\n                      builder.createBinOp(\n                          spv::OpFAdd, type_float,\n                          builder.createBinOp(spv::OpFMul, type_float,\n                                              alpha_saturated,\n                                              builder.makeFloatConstant(3.0f)),\n                          builder.makeFloatConstant(0.5f))),\n                  builder.makeUintConstant(30), builder.makeUintConstant(2));\n            }\n          }\n        } break;\n        case xenos::ColorRenderTargetFormat::k_16_16:\n        case xenos::ColorRenderTargetFormat::k_16_16_16_16:\n        case xenos::ColorRenderTargetFormat::k_16_16_FLOAT:\n        case xenos::ColorRenderTargetFormat::k_16_16_16_16_FLOAT: {\n          // All 64bpp formats, and all 16 bits per component formats, are\n          // represented as integers in ownership transfer for safe handling of\n          // NaN encodings and -32768 / -32767.\n          // TODO(Triang3l): Handle the case when that's not true (no\n          // multisampled sampled images, no 16-bit UNORM, no cross-packing\n          // 32bpp aliasing on a portability subset device or a 64bpp format\n          // where that wouldn't help anyway).\n          if (dest_is_color &&\n              (dest_color_format == xenos::ColorRenderTargetFormat::k_16_16 ||\n               dest_color_format ==\n                   xenos::ColorRenderTargetFormat::k_16_16_FLOAT)) {\n            id_vector_temp.clear();\n            for (uint32_t i = 0; i < 2; ++i) {\n              id_vector_temp.push_back(source_color[0][i]);\n            }\n            builder.createStore(builder.createCompositeConstruct(\n                                    type_fragment_data, id_vector_temp),\n                                output_fragment_data);\n          } else {\n            packed = source_color[0][0];\n            if (mode.output != TransferOutput::kStencilBit) {\n              spv::Id component_offset_width = builder.makeUintConstant(16);\n              packed = builder.createQuadOp(\n                  spv::OpBitFieldInsert, type_uint, packed, source_color[0][1],\n                  component_offset_width, component_offset_width);\n            }\n          }\n        } break;\n        // Float32 is transferred as uint32 to preserve NaN encodings. However,\n        // multisampled sampled image support is optional in Vulkan.\n        case xenos::ColorRenderTargetFormat::k_32_FLOAT:\n        case xenos::ColorRenderTargetFormat::k_32_32_FLOAT: {\n          packed = source_color[0][0];\n          if (!source_color_is_uint) {\n            packed = builder.createUnaryOp(spv::OpBitcast, type_uint, packed);\n          }\n        } break;\n      }\n    } else if (source_depth_float[0] != spv::NoResult) {\n      if (mode.output == TransferOutput::kDepth &&\n          dest_depth_format == source_depth_format) {\n        builder.createStore(source_depth_float[0], output_fragment_depth);\n      } else {\n        switch (source_depth_format) {\n          case xenos::DepthRenderTargetFormat::kD24S8: {\n            // Round to the nearest even integer. This seems to be the correct\n            // conversion, adding +0.5 and rounding towards zero results in red\n            // instead of black in the 4D5307E6 clear shader.\n            packed = builder.createUnaryOp(\n                spv::OpConvertFToU, type_uint,\n                builder.createUnaryBuiltinCall(\n                    type_float, ext_inst_glsl_std_450, GLSLstd450RoundEven,\n                    builder.createBinOp(\n                        spv::OpFMul, type_float, source_depth_float[0],\n                        builder.makeFloatConstant(float(0xFFFFFF)))));\n          } break;\n          case xenos::DepthRenderTargetFormat::kD24FS8: {\n            packed = SpirvShaderTranslator::PreClampedDepthTo20e4(\n                builder, source_depth_float[0], depth_float24_round(), true,\n                ext_inst_glsl_std_450);\n          } break;\n        }\n        if (mode.output == TransferOutput::kDepth) {\n          packed_only_depth = true;\n        } else {\n          // Merge depth and stencil.\n          packed = builder.createQuadOp(\n              spv::OpBitFieldInsert, type_uint, source_stencil[0], packed,\n              builder.makeUintConstant(8), builder.makeUintConstant(24));\n        }\n      }\n    }\n    switch (mode.output) {\n      case TransferOutput::kColor: {\n        // Unless a special path was taken, unpack the raw 32bpp value into the\n        // 32bpp color output.\n        if (packed != spv::NoResult) {\n          switch (dest_color_format) {\n            case xenos::ColorRenderTargetFormat::k_8_8_8_8:\n            case xenos::ColorRenderTargetFormat::k_8_8_8_8_GAMMA: {\n              spv::Id component_width = builder.makeUintConstant(8);\n              spv::Id unorm_scale = builder.makeFloatConstant(1.0f / 255.0f);\n              id_vector_temp.clear();\n              for (uint32_t i = 0; i < 4; ++i) {\n                id_vector_temp.push_back(builder.createBinOp(\n                    spv::OpFMul, type_float,\n                    builder.createUnaryOp(\n                        spv::OpConvertUToF, type_float,\n                        builder.createTriOp(\n                            spv::OpBitFieldUExtract, type_uint, packed,\n                            builder.makeUintConstant(8 * i), component_width)),\n                    unorm_scale));\n              }\n              builder.createStore(builder.createCompositeConstruct(\n                                      type_fragment_data, id_vector_temp),\n                                  output_fragment_data);\n            } break;\n            case xenos::ColorRenderTargetFormat::k_2_10_10_10:\n            case xenos::ColorRenderTargetFormat::k_2_10_10_10_AS_10_10_10_10: {\n              spv::Id width_rgb = builder.makeUintConstant(10);\n              spv::Id unorm_scale_rgb =\n                  builder.makeFloatConstant(1.0f / 1023.0f);\n              spv::Id width_a = builder.makeUintConstant(2);\n              spv::Id unorm_scale_a = builder.makeFloatConstant(1.0f / 3.0f);\n              id_vector_temp.clear();\n              for (uint32_t i = 0; i < 4; ++i) {\n                id_vector_temp.push_back(builder.createBinOp(\n                    spv::OpFMul, type_float,\n                    builder.createUnaryOp(\n                        spv::OpConvertUToF, type_float,\n                        builder.createTriOp(spv::OpBitFieldUExtract, type_uint,\n                                            packed,\n                                            builder.makeUintConstant(10 * i),\n                                            i == 3 ? width_a : width_rgb)),\n                    i == 3 ? unorm_scale_a : unorm_scale_rgb));\n              }\n              builder.createStore(builder.createCompositeConstruct(\n                                      type_fragment_data, id_vector_temp),\n                                  output_fragment_data);\n            } break;\n            case xenos::ColorRenderTargetFormat::k_2_10_10_10_FLOAT:\n            case xenos::ColorRenderTargetFormat::\n                k_2_10_10_10_FLOAT_AS_16_16_16_16: {\n              id_vector_temp.clear();\n              // Color.\n              spv::Id width_rgb = builder.makeUintConstant(10);\n              for (uint32_t i = 0; i < 3; ++i) {\n                id_vector_temp.push_back(SpirvShaderTranslator::Float7e3To32(\n                    builder, packed, 10 * i, false, ext_inst_glsl_std_450));\n              }\n              // Alpha.\n              id_vector_temp.push_back(builder.createBinOp(\n                  spv::OpFMul, type_float,\n                  builder.createUnaryOp(\n                      spv::OpConvertUToF, type_float,\n                      builder.createTriOp(spv::OpBitFieldUExtract, type_uint,\n                                          packed, builder.makeUintConstant(30),\n                                          builder.makeUintConstant(2))),\n                  builder.makeFloatConstant(1.0f / 3.0f)));\n              builder.createStore(builder.createCompositeConstruct(\n                                      type_fragment_data, id_vector_temp),\n                                  output_fragment_data);\n            } break;\n            case xenos::ColorRenderTargetFormat::k_16_16:\n            case xenos::ColorRenderTargetFormat::k_16_16_FLOAT: {\n              // All 16 bits per component formats are represented as integers\n              // in ownership transfer for safe handling of NaN encodings and\n              // -32768 / -32767.\n              // TODO(Triang3l): Handle the case when that's not true (no\n              // multisampled sampled images, no 16-bit UNORM, no cross-packing\n              // 32bpp aliasing on a portability subset device or a 64bpp format\n              // where that wouldn't help anyway).\n              spv::Id component_offset_width = builder.makeUintConstant(16);\n              id_vector_temp.clear();\n              for (uint32_t i = 0; i < 2; ++i) {\n                id_vector_temp.push_back(builder.createTriOp(\n                    spv::OpBitFieldUExtract, type_uint, packed,\n                    i ? component_offset_width : builder.makeUintConstant(0),\n                    component_offset_width));\n              }\n              builder.createStore(builder.createCompositeConstruct(\n                                      type_fragment_data, id_vector_temp),\n                                  output_fragment_data);\n            } break;\n            case xenos::ColorRenderTargetFormat::k_32_FLOAT: {\n              // Float32 is transferred as uint32 to preserve NaN encodings.\n              // However, multisampled sampled images are optional in Vulkan,\n              // and image views of different formats can't be created\n              // separately for sampled image and color attachment usages, so no\n              // multisampled integer sampled image support implies no\n              // multisampled integer framebuffer attachment support in Xenia.\n              spv::Id float32 = packed;\n              if (!dest_color_is_uint) {\n                float32 =\n                    builder.createUnaryOp(spv::OpBitcast, type_float, float32);\n              }\n              builder.createStore(float32, output_fragment_data);\n            } break;\n            default:\n              // A 64bpp format (handled separately) or an invalid one.\n              assert_unhandled_case(dest_color_format);\n          }\n        }\n      } break;\n      case TransferOutput::kDepth: {\n        if (packed) {\n          spv::Id guest_depth24 = packed;\n          if (!packed_only_depth) {\n            // Extract the depth bits.\n            guest_depth24 =\n                builder.createBinOp(spv::OpShiftRightLogical, type_uint,\n                                    guest_depth24, builder.makeUintConstant(8));\n          }\n          // Load the host float32 depth, check if, when converted to the guest\n          // format, it's the same as the guest source, thus up to date, and if\n          // it is, write host float32 depth, otherwise do the guest -> host\n          // conversion.\n          spv::Id host_depth32 = spv::NoResult;\n          if (host_depth_source_texture != spv::NoResult) {\n            // Convert position and sample index from within the destination\n            // tile to within the host depth source tile, like for the guest\n            // render target, but for 32bpp -> 32bpp only.\n            spv::Id host_depth_source_sample_id = dest_sample_id;\n            spv::Id host_depth_source_tile_pixel_x = dest_tile_pixel_x;\n            spv::Id host_depth_source_tile_pixel_y = dest_tile_pixel_y;\n            if (key.host_depth_source_msaa_samples != key.dest_msaa_samples) {\n              if (key.host_depth_source_msaa_samples >=\n                  xenos::MsaaSamples::k4X) {\n                // 4x -> 1x/2x.\n                if (key.dest_msaa_samples == xenos::MsaaSamples::k2X) {\n                  // 4x -> 2x.\n                  // Horizontal pixels to samples. Vertical sample (1/0 in the\n                  // first bit for native 2x or 0/1 in the second bit for 2x as\n                  // 4x) to second sample bit.\n                  if (msaa_2x_attachments_supported_) {\n                    host_depth_source_sample_id = builder.createQuadOp(\n                        spv::OpBitFieldInsert, type_uint, dest_tile_pixel_x,\n                        builder.createBinOp(spv::OpBitwiseXor, type_uint,\n                                            dest_sample_id,\n                                            builder.makeUintConstant(1)),\n                        builder.makeUintConstant(1),\n                        builder.makeUintConstant(31));\n                  } else {\n                    host_depth_source_sample_id = builder.createQuadOp(\n                        spv::OpBitFieldInsert, type_uint, dest_sample_id,\n                        dest_tile_pixel_x, builder.makeUintConstant(0),\n                        builder.makeUintConstant(1));\n                  }\n                  host_depth_source_tile_pixel_x = builder.createBinOp(\n                      spv::OpShiftRightLogical, type_uint, dest_tile_pixel_x,\n                      builder.makeUintConstant(1));\n                } else {\n                  // 4x -> 1x.\n                  // Pixels to samples.\n                  host_depth_source_sample_id = builder.createQuadOp(\n                      spv::OpBitFieldInsert, type_uint,\n                      builder.createBinOp(spv::OpBitwiseAnd, type_uint,\n                                          dest_tile_pixel_x,\n                                          builder.makeUintConstant(1)),\n                      dest_tile_pixel_y, builder.makeUintConstant(1),\n                      builder.makeUintConstant(1));\n                  host_depth_source_tile_pixel_x = builder.createBinOp(\n                      spv::OpShiftRightLogical, type_uint, dest_tile_pixel_x,\n                      builder.makeUintConstant(1));\n                  host_depth_source_tile_pixel_y = builder.createBinOp(\n                      spv::OpShiftRightLogical, type_uint, dest_tile_pixel_y,\n                      builder.makeUintConstant(1));\n                }\n              } else {\n                // 1x/2x -> 1x/2x/4x (as long as they're different).\n                // Only the X part - Y is handled by common code.\n                if (key.dest_msaa_samples >= xenos::MsaaSamples::k4X) {\n                  // Horizontal samples to pixels.\n                  host_depth_source_tile_pixel_x = builder.createQuadOp(\n                      spv::OpBitFieldInsert, type_uint, dest_sample_id,\n                      dest_tile_pixel_x, builder.makeUintConstant(1),\n                      builder.makeUintConstant(31));\n                }\n              }\n              // Host depth source Y and sample index for 1x/2x AA sources.\n              if (key.host_depth_source_msaa_samples <\n                  xenos::MsaaSamples::k4X) {\n                if (key.dest_msaa_samples >= xenos::MsaaSamples::k4X) {\n                  // 1x/2x -> 4x.\n                  if (key.host_depth_source_msaa_samples ==\n                      xenos::MsaaSamples::k2X) {\n                    // 2x -> 4x.\n                    // Vertical samples (second bit) of 4x destination to\n                    // vertical sample (1, 0 for native 2x, or 0, 3 for 2x as\n                    // 4x) of 2x source.\n                    host_depth_source_sample_id = builder.createBinOp(\n                        spv::OpShiftRightLogical, type_uint, dest_sample_id,\n                        builder.makeUintConstant(1));\n                    if (msaa_2x_attachments_supported_) {\n                      host_depth_source_sample_id =\n                          builder.createBinOp(spv::OpBitwiseXor, type_uint,\n                                              host_depth_source_sample_id,\n                                              builder.makeUintConstant(1));\n                    } else {\n                      host_depth_source_sample_id =\n                          builder.createQuadOp(spv::OpBitFieldInsert, type_uint,\n                                               host_depth_source_sample_id,\n                                               host_depth_source_sample_id,\n                                               builder.makeUintConstant(1),\n                                               builder.makeUintConstant(1));\n                    }\n                  } else {\n                    // 1x -> 4x.\n                    // Vertical samples (second bit) to Y pixels.\n                    host_depth_source_tile_pixel_y = builder.createQuadOp(\n                        spv::OpBitFieldInsert, type_uint,\n                        builder.createBinOp(spv::OpShiftRightLogical, type_uint,\n                                            dest_sample_id,\n                                            builder.makeUintConstant(1)),\n                        dest_tile_pixel_y, builder.makeUintConstant(1),\n                        builder.makeUintConstant(31));\n                  }\n                } else {\n                  // 1x/2x -> different 1x/2x.\n                  if (key.host_depth_source_msaa_samples ==\n                      xenos::MsaaSamples::k2X) {\n                    // 2x -> 1x.\n                    // Vertical pixels of 2x destination to vertical samples (1,\n                    // 0 for native 2x, or 0, 3 for 2x as 4x) of 1x source.\n                    host_depth_source_sample_id = builder.createBinOp(\n                        spv::OpBitwiseAnd, type_uint, dest_tile_pixel_y,\n                        builder.makeUintConstant(1));\n                    if (msaa_2x_attachments_supported_) {\n                      host_depth_source_sample_id =\n                          builder.createBinOp(spv::OpBitwiseXor, type_uint,\n                                              host_depth_source_sample_id,\n                                              builder.makeUintConstant(1));\n                    } else {\n                      host_depth_source_sample_id =\n                          builder.createQuadOp(spv::OpBitFieldInsert, type_uint,\n                                               host_depth_source_sample_id,\n                                               host_depth_source_sample_id,\n                                               builder.makeUintConstant(1),\n                                               builder.makeUintConstant(1));\n                    }\n                    host_depth_source_tile_pixel_y = builder.createBinOp(\n                        spv::OpShiftRightLogical, type_uint, dest_tile_pixel_y,\n                        builder.makeUintConstant(1));\n                  } else {\n                    // 1x -> 2x.\n                    // Vertical samples (1/0 in the first bit for native 2x or\n                    // 0/1 in the second bit for 2x as 4x) of 2x destination to\n                    // vertical pixels of 1x source.\n                    if (msaa_2x_attachments_supported_) {\n                      host_depth_source_tile_pixel_y = builder.createQuadOp(\n                          spv::OpBitFieldInsert, type_uint,\n                          builder.createBinOp(spv::OpBitwiseXor, type_uint,\n                                              dest_sample_id,\n                                              builder.makeUintConstant(1)),\n                          dest_tile_pixel_y, builder.makeUintConstant(1),\n                          builder.makeUintConstant(31));\n                    } else {\n                      host_depth_source_tile_pixel_y = builder.createQuadOp(\n                          spv::OpBitFieldInsert, type_uint,\n                          builder.createBinOp(spv::OpShiftRightLogical,\n                                              type_uint, dest_sample_id,\n                                              builder.makeUintConstant(1)),\n                          dest_tile_pixel_y, builder.makeUintConstant(1),\n                          builder.makeUintConstant(31));\n                    }\n                  }\n                }\n              }\n            }\n            assert_true(push_constants_member_host_depth_address != UINT32_MAX);\n            id_vector_temp.clear();\n            id_vector_temp.push_back(builder.makeIntConstant(\n                int32_t(push_constants_member_host_depth_address)));\n            spv::Id host_depth_address_constant = builder.createLoad(\n                builder.createAccessChain(spv::StorageClassPushConstant,\n                                          push_constants, id_vector_temp),\n                spv::NoPrecision);\n            // Transform the destination tile index into the host depth source.\n            // After the addition, it may be negative - in which case, the\n            // transfer is done across EDRAM addressing wrapping, and\n            // xenos::kEdramTileCount must be added to it, but\n            // `& (xenos::kEdramTileCount - 1)` handles that regardless of the\n            // sign.\n            spv::Id host_depth_source_tile_index = builder.createBinOp(\n                spv::OpBitwiseAnd, type_uint,\n                builder.createUnaryOp(\n                    spv::OpBitcast, type_uint,\n                    builder.createBinOp(\n                        spv::OpIAdd, type_int,\n                        builder.createUnaryOp(spv::OpBitcast, type_int,\n                                              dest_tile_index),\n                        builder.createTriOp(\n                            spv::OpBitFieldSExtract, type_int,\n                            builder.createUnaryOp(spv::OpBitcast, type_int,\n                                                  host_depth_address_constant),\n                            builder.makeUintConstant(\n                                xenos::kEdramPitchTilesBits * 2),\n                            builder.makeUintConstant(\n                                xenos::kEdramBaseTilesBits + 1)))),\n                builder.makeUintConstant(xenos::kEdramTileCount - 1));\n            // Split the host depth source tile index into X and Y tile index\n            // within the source image.\n            spv::Id host_depth_source_pitch_tiles = builder.createTriOp(\n                spv::OpBitFieldUExtract, type_uint, host_depth_address_constant,\n                builder.makeUintConstant(xenos::kEdramPitchTilesBits),\n                builder.makeUintConstant(xenos::kEdramPitchTilesBits));\n            spv::Id host_depth_source_tile_index_y = builder.createBinOp(\n                spv::OpUDiv, type_uint, host_depth_source_tile_index,\n                host_depth_source_pitch_tiles);\n            spv::Id host_depth_source_tile_index_x = builder.createBinOp(\n                spv::OpUMod, type_uint, host_depth_source_tile_index,\n                host_depth_source_pitch_tiles);\n            // Finally calculate the host depth source texture coordinates.\n            spv::Id host_depth_source_pixel_x_int = builder.createUnaryOp(\n                spv::OpBitcast, type_int,\n                builder.createBinOp(\n                    spv::OpIAdd, type_uint,\n                    builder.createBinOp(spv::OpIMul, type_uint,\n                                        builder.makeUintConstant(\n                                            tile_width_samples >>\n                                            uint32_t(key.source_msaa_samples >=\n                                                     xenos::MsaaSamples::k4X)),\n                                        host_depth_source_tile_index_x),\n                    host_depth_source_tile_pixel_x));\n            spv::Id host_depth_source_pixel_y_int = builder.createUnaryOp(\n                spv::OpBitcast, type_int,\n                builder.createBinOp(\n                    spv::OpIAdd, type_uint,\n                    builder.createBinOp(spv::OpIMul, type_uint,\n                                        builder.makeUintConstant(\n                                            tile_height_samples >>\n                                            uint32_t(key.source_msaa_samples >=\n                                                     xenos::MsaaSamples::k2X)),\n                                        host_depth_source_tile_index_y),\n                    host_depth_source_tile_pixel_y));\n            // Load the host depth source.\n            spv::Builder::TextureParameters\n                host_depth_source_texture_parameters = {};\n            host_depth_source_texture_parameters.sampler =\n                builder.createLoad(host_depth_source_texture, spv::NoPrecision);\n            id_vector_temp.clear();\n            id_vector_temp.push_back(host_depth_source_pixel_x_int);\n            id_vector_temp.push_back(host_depth_source_pixel_y_int);\n            host_depth_source_texture_parameters.coords =\n                builder.createCompositeConstruct(type_int2, id_vector_temp);\n            if (key.host_depth_source_msaa_samples != xenos::MsaaSamples::k1X) {\n              host_depth_source_texture_parameters.sample =\n                  builder.createUnaryOp(spv::OpBitcast, type_int,\n                                        host_depth_source_sample_id);\n            } else {\n              host_depth_source_texture_parameters.lod =\n                  builder.makeIntConstant(0);\n            }\n            host_depth32 = builder.createCompositeExtract(\n                builder.createTextureCall(spv::NoPrecision, type_float4, false,\n                                          true, false, false, false,\n                                          host_depth_source_texture_parameters,\n                                          spv::ImageOperandsMaskNone),\n                type_float, 0);\n          } else if (host_depth_source_buffer != spv::NoResult) {\n            // Get the address in the EDRAM scratch buffer and load from there.\n            // The beginning of the buffer is (0, 0) of the destination.\n            // 40-sample columns are not swapped for addressing simplicity\n            // (because this is used for depth -> depth transfers, where\n            // swapping isn't needed).\n            // Convert samples to pixels.\n            assert_true(key.host_depth_source_msaa_samples ==\n                        xenos::MsaaSamples::k1X);\n            spv::Id dest_tile_sample_x = dest_tile_pixel_x;\n            spv::Id dest_tile_sample_y = dest_tile_pixel_y;\n            if (key.dest_msaa_samples >= xenos::MsaaSamples::k2X) {\n              if (key.dest_msaa_samples >= xenos::MsaaSamples::k4X) {\n                // Horizontal sample index in bit 0.\n                dest_tile_sample_x = builder.createQuadOp(\n                    spv::OpBitFieldInsert, type_uint, dest_sample_id,\n                    dest_tile_pixel_x, builder.makeUintConstant(1),\n                    builder.makeUintConstant(31));\n              }\n              // Vertical sample index as 1 or 0 in bit 0 for true 2x or as 0\n              // or 1 in bit 1 for 4x or for 2x emulated as 4x.\n              dest_tile_sample_y = builder.createQuadOp(\n                  spv::OpBitFieldInsert, type_uint,\n                  builder.createBinOp(\n                      (key.dest_msaa_samples == xenos::MsaaSamples::k2X &&\n                       msaa_2x_attachments_supported_)\n                          ? spv::OpBitwiseXor\n                          : spv::OpShiftRightLogical,\n                      type_uint, dest_sample_id, builder.makeUintConstant(1)),\n                  dest_tile_pixel_y, builder.makeUintConstant(1),\n                  builder.makeUintConstant(31));\n            }\n            // Combine the tile sample index and the tile index.\n            // The tile index doesn't need to be wrapped, as the host depth is\n            // written to the beginning of the buffer, without the base offset.\n            spv::Id host_depth_offset = builder.createBinOp(\n                spv::OpIAdd, type_uint,\n                builder.createBinOp(\n                    spv::OpIMul, type_uint,\n                    builder.makeUintConstant(tile_width_samples *\n                                             tile_height_samples),\n                    dest_tile_index),\n                builder.createBinOp(\n                    spv::OpIAdd, type_uint,\n                    builder.createBinOp(\n                        spv::OpIMul, type_uint,\n                        builder.makeUintConstant(tile_width_samples),\n                        dest_tile_sample_y),\n                    dest_tile_sample_x));\n            id_vector_temp.clear();\n            // The only SSBO structure member.\n            id_vector_temp.push_back(builder.makeIntConstant(0));\n            id_vector_temp.push_back(builder.createUnaryOp(\n                spv::OpBitcast, type_int, host_depth_offset));\n            // StorageBuffer since SPIR-V 1.3, but since SPIR-V 1.0 is\n            // generated, it's Uniform.\n            host_depth32 = builder.createUnaryOp(\n                spv::OpBitcast, type_float,\n                builder.createLoad(\n                    builder.createAccessChain(spv::StorageClassUniform,\n                                              host_depth_source_buffer,\n                                              id_vector_temp),\n                    spv::NoPrecision));\n          }\n          spv::Block* depth24_to_depth32_header = builder.getBuildPoint();\n          spv::Id depth24_to_depth32_convert_id = spv::NoResult;\n          spv::Block* depth24_to_depth32_merge = nullptr;\n          spv::Id host_depth24 = spv::NoResult;\n          if (host_depth32 != spv::NoResult) {\n            // Convert the host depth value to the guest format and check if it\n            // matches the value in the currently owning guest render target.\n            switch (dest_depth_format) {\n              case xenos::DepthRenderTargetFormat::kD24S8: {\n                // Round to the nearest even integer. This seems to be the\n                // correct conversion, adding +0.5 and rounding towards zero\n                // results in red instead of black in the 4D5307E6 clear shader.\n                host_depth24 = builder.createUnaryOp(\n                    spv::OpConvertFToU, type_uint,\n                    builder.createUnaryBuiltinCall(\n                        type_float, ext_inst_glsl_std_450, GLSLstd450RoundEven,\n                        builder.createBinOp(\n                            spv::OpFMul, type_float, host_depth32,\n                            builder.makeFloatConstant(float(0xFFFFFF)))));\n              } break;\n              case xenos::DepthRenderTargetFormat::kD24FS8: {\n                host_depth24 = SpirvShaderTranslator::PreClampedDepthTo20e4(\n                    builder, host_depth32, depth_float24_round(), true,\n                    ext_inst_glsl_std_450);\n              } break;\n            }\n            assert_true(host_depth24 != spv::NoResult);\n            // Update the header block pointer after the conversion (to avoid\n            // assuming that the conversion doesn't branch).\n            depth24_to_depth32_header = builder.getBuildPoint();\n            spv::Id host_depth_outdated = builder.createBinOp(\n                spv::OpINotEqual, type_bool, guest_depth24, host_depth24);\n            spv::Block& depth24_to_depth32_convert_entry =\n                builder.makeNewBlock();\n            {\n              spv::Block& depth24_to_depth32_merge_block =\n                  builder.makeNewBlock();\n              depth24_to_depth32_merge = &depth24_to_depth32_merge_block;\n            }\n            builder.createSelectionMerge(depth24_to_depth32_merge,\n                                         spv::SelectionControlMaskNone);\n            builder.createConditionalBranch(host_depth_outdated,\n                                            &depth24_to_depth32_convert_entry,\n                                            depth24_to_depth32_merge);\n            builder.setBuildPoint(&depth24_to_depth32_convert_entry);\n          }\n          // Convert the guest 24-bit depth to float32 (in an open conditional\n          // if the host depth is also loaded).\n          spv::Id guest_depth32 = spv::NoResult;\n          switch (dest_depth_format) {\n            case xenos::DepthRenderTargetFormat::kD24S8: {\n              // Multiplying by 1.0 / 0xFFFFFF produces an incorrect result (for\n              // 0xC00000, for instance - which is 2_10_10_10 clear to 0001) -\n              // rescale from 0...0xFFFFFF to 0...0x1000000 doing what true\n              // float division followed by multiplication does (on x86-64 MSVC\n              // with default SSE rounding) - values starting from 0x800000\n              // become bigger by 1; then accurately bias the result's exponent.\n              guest_depth32 = builder.createBinOp(\n                  spv::OpFMul, type_float,\n                  builder.createUnaryOp(\n                      spv::OpConvertUToF, type_float,\n                      builder.createBinOp(\n                          spv::OpIAdd, type_uint, guest_depth24,\n                          builder.createBinOp(spv::OpShiftRightLogical,\n                                              type_uint, guest_depth24,\n                                              builder.makeUintConstant(23)))),\n                  builder.makeFloatConstant(1.0f / float(1 << 24)));\n            } break;\n            case xenos::DepthRenderTargetFormat::kD24FS8: {\n              guest_depth32 = SpirvShaderTranslator::Depth20e4To32(\n                  builder, guest_depth24, 0, true, false,\n                  ext_inst_glsl_std_450);\n            } break;\n          }\n          assert_true(guest_depth32 != spv::NoResult);\n          spv::Id fragment_depth32 = guest_depth32;\n          if (host_depth32 != spv::NoResult) {\n            assert_not_null(depth24_to_depth32_merge);\n            spv::Id depth24_to_depth32_result_block_id =\n                builder.getBuildPoint()->getId();\n            builder.createBranch(depth24_to_depth32_merge);\n            builder.setBuildPoint(depth24_to_depth32_merge);\n            id_vector_temp.clear();\n            id_vector_temp.push_back(guest_depth32);\n            id_vector_temp.push_back(depth24_to_depth32_result_block_id);\n            id_vector_temp.push_back(host_depth32);\n            id_vector_temp.push_back(depth24_to_depth32_header->getId());\n            fragment_depth32 =\n                builder.createOp(spv::OpPhi, type_float, id_vector_temp);\n          }\n          builder.createStore(fragment_depth32, output_fragment_depth);\n          // Unpack the stencil into the stencil reference output if needed and\n          // not already written.\n          if (!packed_only_depth &&\n              output_fragment_stencil_ref != spv::NoResult) {\n            builder.createStore(\n                builder.createUnaryOp(\n                    spv::OpBitcast, type_int,\n                    builder.createBinOp(spv::OpBitwiseAnd, type_uint, packed,\n                                        builder.makeUintConstant(UINT8_MAX))),\n                output_fragment_stencil_ref);\n          }\n        }\n      } break;\n      case TransferOutput::kStencilBit: {\n        if (packed) {\n          // Kill the sample if the needed stencil bit is not set.\n          assert_true(push_constants_member_stencil_mask != UINT32_MAX);\n          id_vector_temp.clear();\n          id_vector_temp.push_back(builder.makeIntConstant(\n              int32_t(push_constants_member_stencil_mask)));\n          spv::Id stencil_mask_constant = builder.createLoad(\n              builder.createAccessChain(spv::StorageClassPushConstant,\n                                        push_constants, id_vector_temp),\n              spv::NoPrecision);\n          SpirvBuilder::IfBuilder stencil_kill_if(\n              builder.createBinOp(\n                  spv::OpIEqual, type_bool,\n                  builder.createBinOp(spv::OpBitwiseAnd, type_uint, packed,\n                                      stencil_mask_constant),\n                  builder.makeUintConstant(0)),\n              spv::SelectionControlMaskNone, builder);\n          builder.createNoResultOp(spv::OpKill);\n          // OpKill terminates the block.\n          stencil_kill_if.makeEndIf(false);\n        }\n      } break;\n    }\n  }\n\n  // End the main function and make it the entry point.\n  builder.leaveFunction();\n  builder.addExecutionMode(main_function, spv::ExecutionModeOriginUpperLeft);\n  if (output_fragment_depth != spv::NoResult) {\n    builder.addExecutionMode(main_function, spv::ExecutionModeDepthReplacing);\n  }\n  if (output_fragment_stencil_ref != spv::NoResult) {\n    builder.addExecutionMode(main_function,\n                             spv::ExecutionModeStencilRefReplacingEXT);\n  }\n  spv::Instruction* entry_point =\n      builder.addEntryPoint(spv::ExecutionModelFragment, main_function, \"main\");\n  for (spv::Id interface_id : main_interface) {\n    entry_point->addIdOperand(interface_id);\n  }\n\n  // Serialize the shader code.\n  std::vector<unsigned int> shader_code;\n  builder.dump(shader_code);\n\n  // Create the shader module, and store the handle even if creation fails not\n  // to try to create it again later.\n  VkShaderModule shader_module = ui::vulkan::util::CreateShaderModule(\n      vulkan_device, reinterpret_cast<const uint32_t*>(shader_code.data()),\n      sizeof(uint32_t) * shader_code.size());\n  if (shader_module == VK_NULL_HANDLE) {\n    XELOGE(\n        \"VulkanRenderTargetCache: Failed to create the render target ownership \"\n        \"transfer shader 0x{:08X}\",\n        key.key);\n  }\n  transfer_shaders_.emplace(key, shader_module);\n  return shader_module;\n}\n\nVkPipeline const* VulkanRenderTargetCache::GetTransferPipelines(\n    TransferPipelineKey key) {\n  auto pipeline_it = transfer_pipelines_.find(key);\n  if (pipeline_it != transfer_pipelines_.end()) {\n    return pipeline_it->second[0] != VK_NULL_HANDLE ? pipeline_it->second.data()\n                                                    : nullptr;\n  }\n\n  VkRenderPass render_pass =\n      GetHostRenderTargetsRenderPass(key.render_pass_key);\n  VkShaderModule fragment_shader_module = GetTransferShader(key.shader_key);\n  if (render_pass == VK_NULL_HANDLE ||\n      fragment_shader_module == VK_NULL_HANDLE) {\n    transfer_pipelines_.emplace(key, std::array<VkPipeline, 4>{});\n    return nullptr;\n  }\n\n  const TransferModeInfo& mode = kTransferModes[size_t(key.shader_key.mode)];\n\n  const ui::vulkan::VulkanDevice* const vulkan_device =\n      command_processor_.GetVulkanDevice();\n  const ui::vulkan::VulkanDevice::Functions& dfn = vulkan_device->functions();\n  const VkDevice device = vulkan_device->device();\n  const ui::vulkan::VulkanDevice::Properties& device_properties =\n      vulkan_device->properties();\n\n  uint32_t dest_sample_count = uint32_t(1)\n                               << uint32_t(key.shader_key.dest_msaa_samples);\n  bool dest_is_masked_sample =\n      dest_sample_count > 1 && !device_properties.sampleRateShading;\n\n  VkPipelineShaderStageCreateInfo shader_stages[2];\n  shader_stages[0].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;\n  shader_stages[0].pNext = nullptr;\n  shader_stages[0].flags = 0;\n  shader_stages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;\n  shader_stages[0].module = transfer_passthrough_vertex_shader_;\n  shader_stages[0].pName = \"main\";\n  shader_stages[0].pSpecializationInfo = nullptr;\n  shader_stages[1].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;\n  shader_stages[1].pNext = nullptr;\n  shader_stages[1].flags = 0;\n  shader_stages[1].stage = VK_SHADER_STAGE_FRAGMENT_BIT;\n  shader_stages[1].module = fragment_shader_module;\n  shader_stages[1].pName = \"main\";\n  shader_stages[1].pSpecializationInfo = nullptr;\n  VkSpecializationMapEntry sample_id_specialization_map_entry;\n  uint32_t sample_id_specialization_constant;\n  VkSpecializationInfo sample_id_specialization_info;\n  if (dest_is_masked_sample) {\n    sample_id_specialization_map_entry.constantID = 0;\n    sample_id_specialization_map_entry.offset = 0;\n    sample_id_specialization_map_entry.size = sizeof(uint32_t);\n    sample_id_specialization_constant = 0;\n    sample_id_specialization_info.mapEntryCount = 1;\n    sample_id_specialization_info.pMapEntries =\n        &sample_id_specialization_map_entry;\n    sample_id_specialization_info.dataSize =\n        sizeof(sample_id_specialization_constant);\n    sample_id_specialization_info.pData = &sample_id_specialization_constant;\n    shader_stages[1].pSpecializationInfo = &sample_id_specialization_info;\n  }\n\n  VkVertexInputBindingDescription vertex_input_binding;\n  vertex_input_binding.binding = 0;\n  vertex_input_binding.stride = sizeof(float) * 2;\n  vertex_input_binding.inputRate = VK_VERTEX_INPUT_RATE_VERTEX;\n  VkVertexInputAttributeDescription vertex_input_attribute;\n  vertex_input_attribute.location = 0;\n  vertex_input_attribute.binding = 0;\n  vertex_input_attribute.format = VK_FORMAT_R32G32_SFLOAT;\n  vertex_input_attribute.offset = 0;\n  VkPipelineVertexInputStateCreateInfo vertex_input_state;\n  vertex_input_state.sType =\n      VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;\n  vertex_input_state.pNext = nullptr;\n  vertex_input_state.flags = 0;\n  vertex_input_state.vertexBindingDescriptionCount = 1;\n  vertex_input_state.pVertexBindingDescriptions = &vertex_input_binding;\n  vertex_input_state.vertexAttributeDescriptionCount = 1;\n  vertex_input_state.pVertexAttributeDescriptions = &vertex_input_attribute;\n\n  VkPipelineInputAssemblyStateCreateInfo input_assembly_state;\n  input_assembly_state.sType =\n      VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;\n  input_assembly_state.pNext = nullptr;\n  input_assembly_state.flags = 0;\n  input_assembly_state.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;\n  input_assembly_state.primitiveRestartEnable = VK_FALSE;\n\n  // Dynamic, to stay within maxViewportDimensions while preferring a\n  // power-of-two factor for converting from pixel coordinates to NDC for exact\n  // precision.\n  VkPipelineViewportStateCreateInfo viewport_state;\n  viewport_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;\n  viewport_state.pNext = nullptr;\n  viewport_state.flags = 0;\n  viewport_state.viewportCount = 1;\n  viewport_state.pViewports = nullptr;\n  viewport_state.scissorCount = 1;\n  viewport_state.pScissors = nullptr;\n\n  VkPipelineRasterizationStateCreateInfo rasterization_state = {};\n  rasterization_state.sType =\n      VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;\n  rasterization_state.polygonMode = VK_POLYGON_MODE_FILL;\n  rasterization_state.cullMode = VK_CULL_MODE_NONE;\n  rasterization_state.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;\n  rasterization_state.lineWidth = 1.0f;\n\n  // For samples other than the first, will be changed for the pipelines for\n  // other samples.\n  VkSampleMask sample_mask = UINT32_MAX;\n  VkPipelineMultisampleStateCreateInfo multisample_state = {};\n  multisample_state.sType =\n      VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;\n  multisample_state.rasterizationSamples =\n      (dest_sample_count == 2 && !msaa_2x_attachments_supported_)\n          ? VK_SAMPLE_COUNT_4_BIT\n          : VkSampleCountFlagBits(dest_sample_count);\n  if (dest_sample_count > 1) {\n    if (device_properties.sampleRateShading) {\n      multisample_state.sampleShadingEnable = VK_TRUE;\n      multisample_state.minSampleShading = 1.0f;\n      if (dest_sample_count == 2 && !msaa_2x_attachments_supported_) {\n        // Emulating 2x MSAA as samples 0 and 3 of 4x MSAA when 2x is not\n        // supported.\n        sample_mask = 0b1001;\n      }\n    } else {\n      sample_mask = 0b1;\n    }\n    if (sample_mask != UINT32_MAX) {\n      multisample_state.pSampleMask = &sample_mask;\n    }\n  }\n\n  // Whether the depth / stencil state is used depends on the presence of a\n  // depth attachment in the render pass - but not making assumptions about\n  // whether the render pass contains any specific attachments, so setting up\n  // valid depth / stencil state unconditionally.\n  VkPipelineDepthStencilStateCreateInfo depth_stencil_state = {};\n  depth_stencil_state.sType =\n      VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;\n  if (mode.output == TransferOutput::kDepth) {\n    depth_stencil_state.depthTestEnable = VK_TRUE;\n    depth_stencil_state.depthWriteEnable = VK_TRUE;\n    depth_stencil_state.depthCompareOp = cvars::depth_transfer_not_equal_test\n                                             ? VK_COMPARE_OP_NOT_EQUAL\n                                             : VK_COMPARE_OP_ALWAYS;\n  }\n  if ((mode.output == TransferOutput::kDepth &&\n       vulkan_device->extensions().ext_EXT_shader_stencil_export) ||\n      mode.output == TransferOutput::kStencilBit) {\n    depth_stencil_state.stencilTestEnable = VK_TRUE;\n    depth_stencil_state.front.failOp = VK_STENCIL_OP_KEEP;\n    depth_stencil_state.front.passOp = VK_STENCIL_OP_REPLACE;\n    depth_stencil_state.front.depthFailOp = VK_STENCIL_OP_REPLACE;\n    // Using ALWAYS, not NOT_EQUAL, so depth writing is unaffected by stencil\n    // being different.\n    depth_stencil_state.front.compareOp = VK_COMPARE_OP_ALWAYS;\n    // Will be dynamic for stencil bit output.\n    depth_stencil_state.front.writeMask = UINT8_MAX;\n    depth_stencil_state.front.reference = UINT8_MAX;\n    depth_stencil_state.back = depth_stencil_state.front;\n  }\n\n  // Whether the color blend state is used depends on the presence of color\n  // attachments in the render pass - but not making assumptions about whether\n  // the render pass contains any specific attachments, so setting up valid\n  // color blend state unconditionally.\n  VkPipelineColorBlendAttachmentState\n      color_blend_attachments[xenos::kMaxColorRenderTargets] = {};\n  VkPipelineColorBlendStateCreateInfo color_blend_state = {};\n  color_blend_state.sType =\n      VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;\n  color_blend_state.attachmentCount =\n      32 - xe::lzcnt(key.render_pass_key.depth_and_color_used >> 1);\n  color_blend_state.pAttachments = color_blend_attachments;\n  if (mode.output == TransferOutput::kColor) {\n    assert_true(device_properties.independentBlend);\n    color_blend_attachments[key.shader_key.dest_color_rt_index].colorWriteMask =\n        VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT |\n        VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;\n  }\n\n  std::array<VkDynamicState, 3> dynamic_states;\n  VkPipelineDynamicStateCreateInfo dynamic_state;\n  dynamic_state.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;\n  dynamic_state.pNext = nullptr;\n  dynamic_state.flags = 0;\n  dynamic_state.dynamicStateCount = 0;\n  dynamic_state.pDynamicStates = dynamic_states.data();\n  dynamic_states[dynamic_state.dynamicStateCount++] = VK_DYNAMIC_STATE_VIEWPORT;\n  dynamic_states[dynamic_state.dynamicStateCount++] = VK_DYNAMIC_STATE_SCISSOR;\n  if (mode.output == TransferOutput::kStencilBit) {\n    dynamic_states[dynamic_state.dynamicStateCount++] =\n        VK_DYNAMIC_STATE_STENCIL_WRITE_MASK;\n  }\n\n  std::array<VkPipeline, 4> pipelines{};\n  VkGraphicsPipelineCreateInfo pipeline_create_info;\n  pipeline_create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;\n  pipeline_create_info.pNext = nullptr;\n  pipeline_create_info.flags = 0;\n  if (dest_is_masked_sample) {\n    pipeline_create_info.flags |= VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT;\n  }\n  pipeline_create_info.stageCount = uint32_t(xe::countof(shader_stages));\n  pipeline_create_info.pStages = shader_stages;\n  pipeline_create_info.pVertexInputState = &vertex_input_state;\n  pipeline_create_info.pInputAssemblyState = &input_assembly_state;\n  pipeline_create_info.pTessellationState = nullptr;\n  pipeline_create_info.pViewportState = &viewport_state;\n  pipeline_create_info.pRasterizationState = &rasterization_state;\n  pipeline_create_info.pMultisampleState = &multisample_state;\n  pipeline_create_info.pDepthStencilState = &depth_stencil_state;\n  pipeline_create_info.pColorBlendState = &color_blend_state;\n  pipeline_create_info.pDynamicState = &dynamic_state;\n  pipeline_create_info.layout =\n      transfer_pipeline_layouts_[size_t(mode.pipeline_layout)];\n  pipeline_create_info.renderPass = render_pass;\n  pipeline_create_info.subpass = 0;\n  pipeline_create_info.basePipelineHandle = VK_NULL_HANDLE;\n  pipeline_create_info.basePipelineIndex = -1;\n  if (dfn.vkCreateGraphicsPipelines(device, VK_NULL_HANDLE, 1,\n                                    &pipeline_create_info, nullptr,\n                                    &pipelines[0]) != VK_SUCCESS) {\n    XELOGE(\n        \"VulkanRenderTargetCache: Failed to create the render target ownership \"\n        \"transfer pipeline for render pass 0x{:08X}, shader 0x{:08X}\",\n        key.render_pass_key.key, key.shader_key.key);\n    transfer_pipelines_.emplace(key, std::array<VkPipeline, 4>{});\n    return nullptr;\n  }\n  if (dest_is_masked_sample) {\n    assert_true(multisample_state.pSampleMask == &sample_mask);\n    pipeline_create_info.flags = (pipeline_create_info.flags &\n                                  ~VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT) |\n                                 VK_PIPELINE_CREATE_DERIVATIVE_BIT;\n    pipeline_create_info.basePipelineHandle = pipelines[0];\n    for (uint32_t i = 1; i < dest_sample_count; ++i) {\n      // Emulating 2x MSAA as samples 0 and 3 of 4x MSAA when 2x is not\n      // supported.\n      uint32_t host_sample_index =\n          (dest_sample_count == 2 && !msaa_2x_attachments_supported_ && i == 1)\n              ? 3\n              : i;\n      sample_id_specialization_constant = host_sample_index;\n      sample_mask = uint32_t(1) << host_sample_index;\n      if (dfn.vkCreateGraphicsPipelines(device, VK_NULL_HANDLE, 1,\n                                        &pipeline_create_info, nullptr,\n                                        &pipelines[i]) != VK_SUCCESS) {\n        XELOGE(\n            \"VulkanRenderTargetCache: Failed to create the render target \"\n            \"ownership transfer pipeline for render pass 0x{:08X}, shader \"\n            \"0x{:08X}, sample {}\",\n            key.render_pass_key.key, key.shader_key.key, i);\n        for (uint32_t j = 0; j < i; ++j) {\n          dfn.vkDestroyPipeline(device, pipelines[j], nullptr);\n        }\n        transfer_pipelines_.emplace(key, std::array<VkPipeline, 4>{});\n        return nullptr;\n      }\n    }\n  }\n  return transfer_pipelines_.emplace(key, pipelines).first->second.data();\n}\n\nvoid VulkanRenderTargetCache::PerformTransfersAndResolveClears(\n    uint32_t render_target_count, RenderTarget* const* render_targets,\n    const std::vector<Transfer>* render_target_transfers,\n    const uint64_t* render_target_resolve_clear_values,\n    const Transfer::Rectangle* resolve_clear_rectangle) {\n  assert_true(GetPath() == Path::kHostRenderTargets);\n\n  const ui::vulkan::VulkanDevice* const vulkan_device =\n      command_processor_.GetVulkanDevice();\n  uint64_t current_submission = command_processor_.GetCurrentSubmission();\n  DeferredCommandBuffer& command_buffer =\n      command_processor_.deferred_command_buffer();\n\n  bool resolve_clear_needed =\n      render_target_resolve_clear_values && resolve_clear_rectangle;\n  VkClearRect resolve_clear_rect;\n  if (resolve_clear_needed) {\n    // Assuming the rectangle is already clamped by the setup function from the\n    // common render target cache.\n    resolve_clear_rect.rect.offset.x =\n        int32_t(resolve_clear_rectangle->x_pixels * draw_resolution_scale_x());\n    resolve_clear_rect.rect.offset.y =\n        int32_t(resolve_clear_rectangle->y_pixels * draw_resolution_scale_y());\n    resolve_clear_rect.rect.extent.width =\n        resolve_clear_rectangle->width_pixels * draw_resolution_scale_x();\n    resolve_clear_rect.rect.extent.height =\n        resolve_clear_rectangle->height_pixels * draw_resolution_scale_y();\n    resolve_clear_rect.baseArrayLayer = 0;\n    resolve_clear_rect.layerCount = 1;\n  }\n\n  // Do host depth storing for the depth destination (assuming there can be only\n  // one depth destination) where depth destination == host depth source.\n  bool host_depth_store_set_up = false;\n  for (uint32_t i = 0; i < render_target_count; ++i) {\n    RenderTarget* dest_rt = render_targets[i];\n    if (!dest_rt) {\n      continue;\n    }\n    auto& dest_vulkan_rt = *static_cast<VulkanRenderTarget*>(dest_rt);\n    RenderTargetKey dest_rt_key = dest_vulkan_rt.key();\n    if (!dest_rt_key.is_depth) {\n      continue;\n    }\n    const std::vector<Transfer>& depth_transfers = render_target_transfers[i];\n    for (const Transfer& transfer : depth_transfers) {\n      if (transfer.host_depth_source != dest_rt) {\n        continue;\n      }\n      if (!host_depth_store_set_up) {\n        // Pipeline.\n        command_processor_.BindExternalComputePipeline(\n            host_depth_store_pipelines_[size_t(dest_rt_key.msaa_samples)]);\n        // Descriptor set bindings.\n        VkDescriptorSet host_depth_store_descriptor_sets[] = {\n            edram_storage_buffer_descriptor_set_,\n            dest_vulkan_rt.GetDescriptorSetTransferSource(),\n        };\n        command_buffer.CmdVkBindDescriptorSets(\n            VK_PIPELINE_BIND_POINT_COMPUTE, host_depth_store_pipeline_layout_,\n            0, uint32_t(xe::countof(host_depth_store_descriptor_sets)),\n            host_depth_store_descriptor_sets, 0, nullptr);\n        // Render target constant.\n        HostDepthStoreRenderTargetConstant\n            host_depth_store_render_target_constant =\n                GetHostDepthStoreRenderTargetConstant(\n                    dest_rt_key.pitch_tiles_at_32bpp,\n                    msaa_2x_attachments_supported_);\n        command_buffer.CmdVkPushConstants(\n            host_depth_store_pipeline_layout_, VK_SHADER_STAGE_COMPUTE_BIT,\n            uint32_t(offsetof(HostDepthStoreConstants, render_target)),\n            sizeof(host_depth_store_render_target_constant),\n            &host_depth_store_render_target_constant);\n        // Barriers - don't need to try to combine them with the rest of\n        // render target transfer barriers now - if this happens, after host\n        // depth storing, SHADER_READ -> DEPTH_STENCIL_ATTACHMENT_WRITE will be\n        // done anyway even in the best case, so it's not possible to have all\n        // the barriers in one place here.\n        UseEdramBuffer(EdramBufferUsage::kComputeWrite);\n        // Always transitioning both depth and stencil, not storing separate\n        // usage flags for depth and stencil.\n        command_processor_.PushImageMemoryBarrier(\n            dest_vulkan_rt.image(),\n            ui::vulkan::util::InitializeSubresourceRange(\n                VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT),\n            dest_vulkan_rt.current_stage_mask(),\n            VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,\n            dest_vulkan_rt.current_access_mask(), VK_ACCESS_SHADER_READ_BIT,\n            dest_vulkan_rt.current_layout(),\n            VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);\n        dest_vulkan_rt.SetUsage(VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,\n                                VK_ACCESS_SHADER_READ_BIT,\n                                VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);\n        host_depth_store_set_up = true;\n      }\n      Transfer::Rectangle\n          transfer_rectangles[Transfer::kMaxRectanglesWithCutout];\n      uint32_t transfer_rectangle_count = transfer.GetRectangles(\n          dest_rt_key.base_tiles, dest_rt_key.pitch_tiles_at_32bpp,\n          dest_rt_key.msaa_samples, false, transfer_rectangles,\n          resolve_clear_rectangle);\n      assert_not_zero(transfer_rectangle_count);\n      HostDepthStoreRectangleConstant host_depth_store_rectangle_constant;\n      for (uint32_t j = 0; j < transfer_rectangle_count; ++j) {\n        uint32_t group_count_x, group_count_y;\n        GetHostDepthStoreRectangleInfo(\n            transfer_rectangles[j], dest_rt_key.msaa_samples,\n            host_depth_store_rectangle_constant, group_count_x, group_count_y);\n        command_buffer.CmdVkPushConstants(\n            host_depth_store_pipeline_layout_, VK_SHADER_STAGE_COMPUTE_BIT,\n            uint32_t(offsetof(HostDepthStoreConstants, rectangle)),\n            sizeof(host_depth_store_rectangle_constant),\n            &host_depth_store_rectangle_constant);\n        command_processor_.SubmitBarriers(true);\n        command_buffer.CmdVkDispatch(group_count_x, group_count_y, 1);\n        MarkEdramBufferModified();\n      }\n    }\n    break;\n  }\n\n  constexpr VkPipelineStageFlags kSourceStageMask =\n      VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;\n  constexpr VkAccessFlags kSourceAccessMask = VK_ACCESS_SHADER_READ_BIT;\n  constexpr VkImageLayout kSourceLayout =\n      VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;\n\n  // Try to insert as many barriers as possible in one place, hoping that in the\n  // best case (no cross-copying between current render targets), barriers will\n  // need to be only inserted here, not between transfers. In case of\n  // cross-copying, if the destination use is going to happen before the source\n  // use, choose the destination state, otherwise the source state - to match\n  // the order in which transfers will actually happen (otherwise there will be\n  // just a useless switch back and forth).\n  for (uint32_t i = 0; i < render_target_count; ++i) {\n    RenderTarget* dest_rt = render_targets[i];\n    if (!dest_rt) {\n      continue;\n    }\n    const std::vector<Transfer>& dest_transfers = render_target_transfers[i];\n    if (!resolve_clear_needed && dest_transfers.empty()) {\n      continue;\n    }\n    // Transition the destination, only if not going to be used as a source\n    // earlier.\n    bool dest_used_previously_as_source = false;\n    for (uint32_t j = 0; j < i; ++j) {\n      for (const Transfer& previous_transfer : render_target_transfers[j]) {\n        if (previous_transfer.source == dest_rt ||\n            previous_transfer.host_depth_source == dest_rt) {\n          dest_used_previously_as_source = true;\n          break;\n        }\n      }\n    }\n    if (!dest_used_previously_as_source) {\n      auto& dest_vulkan_rt = *static_cast<VulkanRenderTarget*>(dest_rt);\n      VkPipelineStageFlags dest_dst_stage_mask;\n      VkAccessFlags dest_dst_access_mask;\n      VkImageLayout dest_new_layout;\n      dest_vulkan_rt.GetDrawUsage(&dest_dst_stage_mask, &dest_dst_access_mask,\n                                  &dest_new_layout);\n      command_processor_.PushImageMemoryBarrier(\n          dest_vulkan_rt.image(),\n          ui::vulkan::util::InitializeSubresourceRange(\n              dest_vulkan_rt.key().is_depth\n                  ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)\n                  : VK_IMAGE_ASPECT_COLOR_BIT),\n          dest_vulkan_rt.current_stage_mask(), dest_dst_stage_mask,\n          dest_vulkan_rt.current_access_mask(), dest_dst_access_mask,\n          dest_vulkan_rt.current_layout(), dest_new_layout);\n      dest_vulkan_rt.SetUsage(dest_dst_stage_mask, dest_dst_access_mask,\n                              dest_new_layout);\n    }\n    // Transition the sources, only if not going to be used as destinations\n    // earlier.\n    for (const Transfer& transfer : dest_transfers) {\n      bool source_previously_used_as_dest = false;\n      bool host_depth_source_previously_used_as_dest = false;\n      for (uint32_t j = 0; j < i; ++j) {\n        if (render_target_transfers[j].empty()) {\n          continue;\n        }\n        const RenderTarget* previous_rt = render_targets[j];\n        if (transfer.source == previous_rt) {\n          source_previously_used_as_dest = true;\n        }\n        if (transfer.host_depth_source == previous_rt) {\n          host_depth_source_previously_used_as_dest = true;\n        }\n      }\n      if (!source_previously_used_as_dest) {\n        auto& source_vulkan_rt =\n            *static_cast<VulkanRenderTarget*>(transfer.source);\n        command_processor_.PushImageMemoryBarrier(\n            source_vulkan_rt.image(),\n            ui::vulkan::util::InitializeSubresourceRange(\n                source_vulkan_rt.key().is_depth\n                    ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)\n                    : VK_IMAGE_ASPECT_COLOR_BIT),\n            source_vulkan_rt.current_stage_mask(), kSourceStageMask,\n            source_vulkan_rt.current_access_mask(), kSourceAccessMask,\n            source_vulkan_rt.current_layout(), kSourceLayout);\n        source_vulkan_rt.SetUsage(kSourceStageMask, kSourceAccessMask,\n                                  kSourceLayout);\n      }\n      // transfer.host_depth_source == dest_rt means the EDRAM buffer will be\n      // used instead, no need to transition.\n      if (transfer.host_depth_source && transfer.host_depth_source != dest_rt &&\n          !host_depth_source_previously_used_as_dest) {\n        auto& host_depth_source_vulkan_rt =\n            *static_cast<VulkanRenderTarget*>(transfer.host_depth_source);\n        command_processor_.PushImageMemoryBarrier(\n            host_depth_source_vulkan_rt.image(),\n            ui::vulkan::util::InitializeSubresourceRange(\n                VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT),\n            host_depth_source_vulkan_rt.current_stage_mask(), kSourceStageMask,\n            host_depth_source_vulkan_rt.current_access_mask(),\n            kSourceAccessMask, host_depth_source_vulkan_rt.current_layout(),\n            kSourceLayout);\n        host_depth_source_vulkan_rt.SetUsage(kSourceStageMask,\n                                             kSourceAccessMask, kSourceLayout);\n      }\n    }\n  }\n  if (host_depth_store_set_up) {\n    // Will be reading copied host depth from the EDRAM buffer.\n    UseEdramBuffer(EdramBufferUsage::kFragmentRead);\n  }\n\n  // Perform the transfers and clears.\n\n  TransferPipelineLayoutIndex last_transfer_pipeline_layout_index =\n      TransferPipelineLayoutIndex::kCount;\n  uint32_t transfer_descriptor_sets_bound = 0;\n  uint32_t transfer_push_constants_set = 0;\n  VkDescriptorSet last_descriptor_set_host_depth_stencil_textures =\n      VK_NULL_HANDLE;\n  VkDescriptorSet last_descriptor_set_depth_stencil_textures = VK_NULL_HANDLE;\n  VkDescriptorSet last_descriptor_set_color_texture = VK_NULL_HANDLE;\n  TransferAddressConstant last_host_depth_address_constant;\n  TransferAddressConstant last_address_constant;\n\n  for (uint32_t i = 0; i < render_target_count; ++i) {\n    RenderTarget* dest_rt = render_targets[i];\n    if (!dest_rt) {\n      continue;\n    }\n\n    const std::vector<Transfer>& current_transfers = render_target_transfers[i];\n    if (current_transfers.empty() && !resolve_clear_needed) {\n      continue;\n    }\n\n    auto& dest_vulkan_rt = *static_cast<VulkanRenderTarget*>(dest_rt);\n    RenderTargetKey dest_rt_key = dest_vulkan_rt.key();\n\n    // Late barriers in case there was cross-copying that prevented merging of\n    // barriers.\n    {\n      VkPipelineStageFlags dest_dst_stage_mask;\n      VkAccessFlags dest_dst_access_mask;\n      VkImageLayout dest_new_layout;\n      dest_vulkan_rt.GetDrawUsage(&dest_dst_stage_mask, &dest_dst_access_mask,\n                                  &dest_new_layout);\n      command_processor_.PushImageMemoryBarrier(\n          dest_vulkan_rt.image(),\n          ui::vulkan::util::InitializeSubresourceRange(\n              dest_rt_key.is_depth\n                  ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)\n                  : VK_IMAGE_ASPECT_COLOR_BIT),\n          dest_vulkan_rt.current_stage_mask(), dest_dst_stage_mask,\n          dest_vulkan_rt.current_access_mask(), dest_dst_access_mask,\n          dest_vulkan_rt.current_layout(), dest_new_layout);\n      dest_vulkan_rt.SetUsage(dest_dst_stage_mask, dest_dst_access_mask,\n                              dest_new_layout);\n    }\n\n    // Get the objects needed for transfers to the destination.\n    // TODO(Triang3l): Reuse the guest render pass for transfers where possible\n    // (if the Vulkan format used for drawing is also usable for transfers - for\n    // instance, R8G8B8A8_UNORM can be used for both, so the guest pass can be\n    // reused, but R16G16B16A16_SFLOAT render targets use R16G16B16A16_UINT for\n    // transfers, so the transfer pass has to be separate) to avoid stores and\n    // loads on tile-based devices to make this actually applicable. Also\n    // overall perform all non-cross-copying transfers for the current\n    // framebuffer configuration in a single pass, to load / store only once.\n    RenderPassKey transfer_render_pass_key;\n    transfer_render_pass_key.msaa_samples = dest_rt_key.msaa_samples;\n    if (dest_rt_key.is_depth) {\n      transfer_render_pass_key.depth_and_color_used = 0b1;\n      transfer_render_pass_key.depth_format = dest_rt_key.GetDepthFormat();\n    } else {\n      transfer_render_pass_key.depth_and_color_used = 0b1 << 1;\n      transfer_render_pass_key.color_0_view_format =\n          dest_rt_key.GetColorFormat();\n      transfer_render_pass_key.color_rts_use_transfer_formats = 1;\n    }\n    VkRenderPass transfer_render_pass =\n        GetHostRenderTargetsRenderPass(transfer_render_pass_key);\n    if (transfer_render_pass == VK_NULL_HANDLE) {\n      continue;\n    }\n    const RenderTarget*\n        transfer_framebuffer_render_targets[1 + xenos::kMaxColorRenderTargets] =\n            {};\n    transfer_framebuffer_render_targets[dest_rt_key.is_depth ? 0 : 1] = dest_rt;\n    const Framebuffer* transfer_framebuffer = GetHostRenderTargetsFramebuffer(\n        transfer_render_pass_key, dest_rt_key.pitch_tiles_at_32bpp,\n        transfer_framebuffer_render_targets);\n    if (!transfer_framebuffer) {\n      continue;\n    }\n    // Don't enter the render pass immediately - may still insert source\n    // barriers later.\n\n    if (!current_transfers.empty()) {\n      uint32_t dest_pitch_tiles = dest_rt_key.GetPitchTiles();\n      bool dest_is_64bpp = dest_rt_key.Is64bpp();\n\n      // Gather shader keys and sort to reduce pipeline state and binding\n      // switches. Also gather stencil rectangles to clear if needed.\n      bool need_stencil_bit_draws =\n          dest_rt_key.is_depth &&\n          !vulkan_device->extensions().ext_EXT_shader_stencil_export;\n      current_transfer_invocations_.clear();\n      current_transfer_invocations_.reserve(\n          current_transfers.size() << uint32_t(need_stencil_bit_draws));\n      uint32_t rt_sort_index = 0;\n      TransferShaderKey new_transfer_shader_key;\n      new_transfer_shader_key.dest_msaa_samples = dest_rt_key.msaa_samples;\n      new_transfer_shader_key.dest_resource_format =\n          dest_rt_key.resource_format;\n      uint32_t stencil_clear_rectangle_count = 0;\n      for (uint32_t j = 0; j <= uint32_t(need_stencil_bit_draws); ++j) {\n        // j == 0 - color or depth.\n        // j == 1 - stencil bits.\n        // Stencil bit writing always requires a different root signature,\n        // handle these separately. Stencil never has a host depth source.\n        // Clear previously set sort indices.\n        for (const Transfer& transfer : current_transfers) {\n          auto host_depth_source_vulkan_rt =\n              static_cast<VulkanRenderTarget*>(transfer.host_depth_source);\n          if (host_depth_source_vulkan_rt) {\n            host_depth_source_vulkan_rt->SetTemporarySortIndex(UINT32_MAX);\n          }\n          assert_not_null(transfer.source);\n          auto& source_vulkan_rt =\n              *static_cast<VulkanRenderTarget*>(transfer.source);\n          source_vulkan_rt.SetTemporarySortIndex(UINT32_MAX);\n        }\n        for (const Transfer& transfer : current_transfers) {\n          assert_not_null(transfer.source);\n          auto& source_vulkan_rt =\n              *static_cast<VulkanRenderTarget*>(transfer.source);\n          VulkanRenderTarget* host_depth_source_vulkan_rt =\n              j ? nullptr\n                : static_cast<VulkanRenderTarget*>(transfer.host_depth_source);\n          if (host_depth_source_vulkan_rt &&\n              host_depth_source_vulkan_rt->temporary_sort_index() ==\n                  UINT32_MAX) {\n            host_depth_source_vulkan_rt->SetTemporarySortIndex(rt_sort_index++);\n          }\n          if (source_vulkan_rt.temporary_sort_index() == UINT32_MAX) {\n            source_vulkan_rt.SetTemporarySortIndex(rt_sort_index++);\n          }\n          RenderTargetKey source_rt_key = source_vulkan_rt.key();\n          new_transfer_shader_key.source_msaa_samples =\n              source_rt_key.msaa_samples;\n          new_transfer_shader_key.source_resource_format =\n              source_rt_key.resource_format;\n          bool host_depth_source_is_copy =\n              host_depth_source_vulkan_rt == &dest_vulkan_rt;\n          // The host depth copy buffer has only raw samples.\n          new_transfer_shader_key.host_depth_source_msaa_samples =\n              (host_depth_source_vulkan_rt && !host_depth_source_is_copy)\n                  ? host_depth_source_vulkan_rt->key().msaa_samples\n                  : xenos::MsaaSamples::k1X;\n          if (j) {\n            new_transfer_shader_key.mode =\n                source_rt_key.is_depth ? TransferMode::kDepthToStencilBit\n                                       : TransferMode::kColorToStencilBit;\n            stencil_clear_rectangle_count +=\n                transfer.GetRectangles(dest_rt_key.base_tiles, dest_pitch_tiles,\n                                       dest_rt_key.msaa_samples, dest_is_64bpp,\n                                       nullptr, resolve_clear_rectangle);\n          } else {\n            if (dest_rt_key.is_depth) {\n              if (host_depth_source_vulkan_rt) {\n                if (host_depth_source_is_copy) {\n                  new_transfer_shader_key.mode =\n                      source_rt_key.is_depth\n                          ? TransferMode::kDepthAndHostDepthCopyToDepth\n                          : TransferMode::kColorAndHostDepthCopyToDepth;\n                } else {\n                  new_transfer_shader_key.mode =\n                      source_rt_key.is_depth\n                          ? TransferMode::kDepthAndHostDepthToDepth\n                          : TransferMode::kColorAndHostDepthToDepth;\n                }\n              } else {\n                new_transfer_shader_key.mode =\n                    source_rt_key.is_depth ? TransferMode::kDepthToDepth\n                                           : TransferMode::kColorToDepth;\n              }\n            } else {\n              new_transfer_shader_key.mode = source_rt_key.is_depth\n                                                 ? TransferMode::kDepthToColor\n                                                 : TransferMode::kColorToColor;\n            }\n          }\n          current_transfer_invocations_.emplace_back(transfer,\n                                                     new_transfer_shader_key);\n          if (j) {\n            current_transfer_invocations_.back().transfer.host_depth_source =\n                nullptr;\n          }\n        }\n      }\n      std::sort(current_transfer_invocations_.begin(),\n                current_transfer_invocations_.end());\n\n      for (auto it = current_transfer_invocations_.cbegin();\n           it != current_transfer_invocations_.cend(); ++it) {\n        assert_not_null(it->transfer.source);\n        auto& source_vulkan_rt =\n            *static_cast<VulkanRenderTarget*>(it->transfer.source);\n        command_processor_.PushImageMemoryBarrier(\n            source_vulkan_rt.image(),\n            ui::vulkan::util::InitializeSubresourceRange(\n                source_vulkan_rt.key().is_depth\n                    ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)\n                    : VK_IMAGE_ASPECT_COLOR_BIT),\n            source_vulkan_rt.current_stage_mask(), kSourceStageMask,\n            source_vulkan_rt.current_access_mask(), kSourceAccessMask,\n            source_vulkan_rt.current_layout(), kSourceLayout);\n        source_vulkan_rt.SetUsage(kSourceStageMask, kSourceAccessMask,\n                                  kSourceLayout);\n        auto host_depth_source_vulkan_rt =\n            static_cast<VulkanRenderTarget*>(it->transfer.host_depth_source);\n        if (host_depth_source_vulkan_rt) {\n          TransferShaderKey transfer_shader_key = it->shader_key;\n          if (transfer_shader_key.mode ==\n                  TransferMode::kDepthAndHostDepthCopyToDepth ||\n              transfer_shader_key.mode ==\n                  TransferMode::kColorAndHostDepthCopyToDepth) {\n            // Reading copied host depth from the EDRAM buffer.\n            UseEdramBuffer(EdramBufferUsage::kFragmentRead);\n          } else {\n            // Reading host depth from the texture.\n            command_processor_.PushImageMemoryBarrier(\n                host_depth_source_vulkan_rt->image(),\n                ui::vulkan::util::InitializeSubresourceRange(\n                    VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT),\n                host_depth_source_vulkan_rt->current_stage_mask(),\n                kSourceStageMask,\n                host_depth_source_vulkan_rt->current_access_mask(),\n                kSourceAccessMask,\n                host_depth_source_vulkan_rt->current_layout(), kSourceLayout);\n            host_depth_source_vulkan_rt->SetUsage(\n                kSourceStageMask, kSourceAccessMask, kSourceLayout);\n          }\n        }\n      }\n\n      // Perform the transfers for the render target.\n\n      command_processor_.SubmitBarriersAndEnterRenderTargetCacheRenderPass(\n          transfer_render_pass, transfer_framebuffer);\n\n      if (stencil_clear_rectangle_count) {\n        VkClearAttachment* stencil_clear_attachment;\n        VkClearRect* stencil_clear_rect_write_ptr;\n        command_buffer.CmdClearAttachmentsEmplace(1, stencil_clear_attachment,\n                                                  stencil_clear_rectangle_count,\n                                                  stencil_clear_rect_write_ptr);\n        stencil_clear_attachment->aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;\n        stencil_clear_attachment->colorAttachment = 0;\n        stencil_clear_attachment->clearValue.depthStencil.depth = 0.0f;\n        stencil_clear_attachment->clearValue.depthStencil.stencil = 0;\n        for (const Transfer& transfer : current_transfers) {\n          Transfer::Rectangle transfer_stencil_clear_rectangles\n              [Transfer::kMaxRectanglesWithCutout];\n          uint32_t transfer_stencil_clear_rectangle_count =\n              transfer.GetRectangles(dest_rt_key.base_tiles, dest_pitch_tiles,\n                                     dest_rt_key.msaa_samples, dest_is_64bpp,\n                                     transfer_stencil_clear_rectangles,\n                                     resolve_clear_rectangle);\n          for (uint32_t j = 0; j < transfer_stencil_clear_rectangle_count;\n               ++j) {\n            const Transfer::Rectangle& stencil_clear_rectangle =\n                transfer_stencil_clear_rectangles[j];\n            stencil_clear_rect_write_ptr->rect.offset.x = int32_t(\n                stencil_clear_rectangle.x_pixels * draw_resolution_scale_x());\n            stencil_clear_rect_write_ptr->rect.offset.y = int32_t(\n                stencil_clear_rectangle.y_pixels * draw_resolution_scale_y());\n            stencil_clear_rect_write_ptr->rect.extent.width =\n                stencil_clear_rectangle.width_pixels *\n                draw_resolution_scale_x();\n            stencil_clear_rect_write_ptr->rect.extent.height =\n                stencil_clear_rectangle.height_pixels *\n                draw_resolution_scale_y();\n            stencil_clear_rect_write_ptr->baseArrayLayer = 0;\n            stencil_clear_rect_write_ptr->layerCount = 1;\n            ++stencil_clear_rect_write_ptr;\n          }\n        }\n      }\n\n      // Prefer power of two viewports for exact division by simply biasing the\n      // exponent.\n      VkViewport transfer_viewport;\n      transfer_viewport.x = 0.0f;\n      transfer_viewport.y = 0.0f;\n      transfer_viewport.width =\n          float(std::min(xe::next_pow2(transfer_framebuffer->host_extent.width),\n                         vulkan_device->properties().maxViewportDimensions[0]));\n      transfer_viewport.height = float(\n          std::min(xe::next_pow2(transfer_framebuffer->host_extent.height),\n                   vulkan_device->properties().maxViewportDimensions[1]));\n      transfer_viewport.minDepth = 0.0f;\n      transfer_viewport.maxDepth = 1.0f;\n      command_processor_.SetViewport(transfer_viewport);\n      float pixels_to_ndc_x = 2.0f / transfer_viewport.width;\n      float pixels_to_ndc_y = 2.0f / transfer_viewport.height;\n      VkRect2D transfer_scissor;\n      transfer_scissor.offset.x = 0;\n      transfer_scissor.offset.y = 0;\n      transfer_scissor.extent = transfer_framebuffer->host_extent;\n      command_processor_.SetScissor(transfer_scissor);\n\n      for (auto it = current_transfer_invocations_.cbegin();\n           it != current_transfer_invocations_.cend(); ++it) {\n        const TransferInvocation& transfer_invocation_first = *it;\n        // Will be merging transfers from the same source into one mesh.\n        auto it_merged_first = it, it_merged_last = it;\n        uint32_t transfer_rectangle_count =\n            transfer_invocation_first.transfer.GetRectangles(\n                dest_rt_key.base_tiles, dest_pitch_tiles,\n                dest_rt_key.msaa_samples, dest_is_64bpp, nullptr,\n                resolve_clear_rectangle);\n        for (auto it_merge = std::next(it_merged_first);\n             it_merge != current_transfer_invocations_.cend(); ++it_merge) {\n          if (!transfer_invocation_first.CanBeMergedIntoOneDraw(*it_merge)) {\n            break;\n          }\n          transfer_rectangle_count += it_merge->transfer.GetRectangles(\n              dest_rt_key.base_tiles, dest_pitch_tiles,\n              dest_rt_key.msaa_samples, dest_is_64bpp, nullptr,\n              resolve_clear_rectangle);\n          it_merged_last = it_merge;\n        }\n        assert_not_zero(transfer_rectangle_count);\n        // Skip the merged transfers in the subsequent iterations.\n        it = it_merged_last;\n\n        assert_not_null(it->transfer.source);\n        auto& source_vulkan_rt =\n            *static_cast<VulkanRenderTarget*>(it->transfer.source);\n        auto host_depth_source_vulkan_rt =\n            static_cast<VulkanRenderTarget*>(it->transfer.host_depth_source);\n        TransferShaderKey transfer_shader_key = it->shader_key;\n        const TransferModeInfo& transfer_mode_info =\n            kTransferModes[size_t(transfer_shader_key.mode)];\n        TransferPipelineLayoutIndex transfer_pipeline_layout_index =\n            transfer_mode_info.pipeline_layout;\n        const TransferPipelineLayoutInfo& transfer_pipeline_layout_info =\n            kTransferPipelineLayoutInfos[size_t(\n                transfer_pipeline_layout_index)];\n        uint32_t transfer_sample_pipeline_count =\n            vulkan_device->properties().sampleRateShading\n                ? 1\n                : uint32_t(1) << uint32_t(dest_rt_key.msaa_samples);\n        bool transfer_is_stencil_bit =\n            (transfer_pipeline_layout_info.used_push_constant_dwords &\n             kTransferUsedPushConstantDwordStencilMaskBit) != 0;\n\n        uint32_t transfer_vertex_count = 6 * transfer_rectangle_count;\n        VkBuffer transfer_vertex_buffer;\n        VkDeviceSize transfer_vertex_buffer_offset;\n        float* transfer_rectangle_write_ptr =\n            reinterpret_cast<float*>(transfer_vertex_buffer_pool_->Request(\n                current_submission, sizeof(float) * 2 * transfer_vertex_count,\n                sizeof(float), transfer_vertex_buffer,\n                transfer_vertex_buffer_offset));\n        if (!transfer_rectangle_write_ptr) {\n          continue;\n        }\n        for (auto it_merged = it_merged_first; it_merged <= it_merged_last;\n             ++it_merged) {\n          Transfer::Rectangle transfer_invocation_rectangles\n              [Transfer::kMaxRectanglesWithCutout];\n          uint32_t transfer_invocation_rectangle_count =\n              it_merged->transfer.GetRectangles(\n                  dest_rt_key.base_tiles, dest_pitch_tiles,\n                  dest_rt_key.msaa_samples, dest_is_64bpp,\n                  transfer_invocation_rectangles, resolve_clear_rectangle);\n          assert_not_zero(transfer_invocation_rectangle_count);\n          for (uint32_t j = 0; j < transfer_invocation_rectangle_count; ++j) {\n            const Transfer::Rectangle& transfer_rectangle =\n                transfer_invocation_rectangles[j];\n            float transfer_rectangle_x0 =\n                -1.0f + transfer_rectangle.x_pixels * pixels_to_ndc_x;\n            float transfer_rectangle_y0 =\n                -1.0f + transfer_rectangle.y_pixels * pixels_to_ndc_y;\n            float transfer_rectangle_x1 =\n                transfer_rectangle_x0 +\n                transfer_rectangle.width_pixels * pixels_to_ndc_x;\n            float transfer_rectangle_y1 =\n                transfer_rectangle_y0 +\n                transfer_rectangle.height_pixels * pixels_to_ndc_y;\n            // O-*\n            // |/\n            // *\n            *(transfer_rectangle_write_ptr++) = transfer_rectangle_x0;\n            *(transfer_rectangle_write_ptr++) = transfer_rectangle_y0;\n            // *-*\n            // |/\n            // O\n            *(transfer_rectangle_write_ptr++) = transfer_rectangle_x0;\n            *(transfer_rectangle_write_ptr++) = transfer_rectangle_y1;\n            // *-O\n            // |/\n            // *\n            *(transfer_rectangle_write_ptr++) = transfer_rectangle_x1;\n            *(transfer_rectangle_write_ptr++) = transfer_rectangle_y0;\n            //   O\n            //  /|\n            // *-*\n            *(transfer_rectangle_write_ptr++) = transfer_rectangle_x1;\n            *(transfer_rectangle_write_ptr++) = transfer_rectangle_y0;\n            //   *\n            //  /|\n            // O-*\n            *(transfer_rectangle_write_ptr++) = transfer_rectangle_x0;\n            *(transfer_rectangle_write_ptr++) = transfer_rectangle_y1;\n            //   *\n            //  /|\n            // *-O\n            *(transfer_rectangle_write_ptr++) = transfer_rectangle_x1;\n            *(transfer_rectangle_write_ptr++) = transfer_rectangle_y1;\n          }\n        }\n        command_buffer.CmdVkBindVertexBuffers(0, 1, &transfer_vertex_buffer,\n                                              &transfer_vertex_buffer_offset);\n\n        const VkPipeline* transfer_pipelines = GetTransferPipelines(\n            TransferPipelineKey(transfer_render_pass_key, transfer_shader_key));\n        if (!transfer_pipelines) {\n          continue;\n        }\n        command_processor_.BindExternalGraphicsPipeline(transfer_pipelines[0]);\n        if (last_transfer_pipeline_layout_index !=\n            transfer_pipeline_layout_index) {\n          last_transfer_pipeline_layout_index = transfer_pipeline_layout_index;\n          transfer_descriptor_sets_bound = 0;\n          transfer_push_constants_set = 0;\n        }\n\n        // Invalidate outdated bindings.\n        if (transfer_pipeline_layout_info.used_descriptor_sets &\n            kTransferUsedDescriptorSetHostDepthStencilTexturesBit) {\n          assert_not_null(host_depth_source_vulkan_rt);\n          VkDescriptorSet descriptor_set_host_depth_stencil_textures =\n              host_depth_source_vulkan_rt->GetDescriptorSetTransferSource();\n          if (last_descriptor_set_host_depth_stencil_textures !=\n              descriptor_set_host_depth_stencil_textures) {\n            last_descriptor_set_host_depth_stencil_textures =\n                descriptor_set_host_depth_stencil_textures;\n            transfer_descriptor_sets_bound &=\n                ~kTransferUsedDescriptorSetHostDepthStencilTexturesBit;\n          }\n        }\n        if (transfer_pipeline_layout_info.used_descriptor_sets &\n            kTransferUsedDescriptorSetDepthStencilTexturesBit) {\n          VkDescriptorSet descriptor_set_depth_stencil_textures =\n              source_vulkan_rt.GetDescriptorSetTransferSource();\n          if (last_descriptor_set_depth_stencil_textures !=\n              descriptor_set_depth_stencil_textures) {\n            last_descriptor_set_depth_stencil_textures =\n                descriptor_set_depth_stencil_textures;\n            transfer_descriptor_sets_bound &=\n                ~kTransferUsedDescriptorSetDepthStencilTexturesBit;\n          }\n        }\n        if (transfer_pipeline_layout_info.used_descriptor_sets &\n            kTransferUsedDescriptorSetColorTextureBit) {\n          VkDescriptorSet descriptor_set_color_texture =\n              source_vulkan_rt.GetDescriptorSetTransferSource();\n          if (last_descriptor_set_color_texture !=\n              descriptor_set_color_texture) {\n            last_descriptor_set_color_texture = descriptor_set_color_texture;\n            transfer_descriptor_sets_bound &=\n                ~kTransferUsedDescriptorSetColorTextureBit;\n          }\n        }\n        if (transfer_pipeline_layout_info.used_push_constant_dwords &\n            kTransferUsedPushConstantDwordHostDepthAddressBit) {\n          assert_not_null(host_depth_source_vulkan_rt);\n          RenderTargetKey host_depth_source_rt_key =\n              host_depth_source_vulkan_rt->key();\n          TransferAddressConstant host_depth_address_constant;\n          host_depth_address_constant.dest_pitch = dest_pitch_tiles;\n          host_depth_address_constant.source_pitch =\n              host_depth_source_rt_key.GetPitchTiles();\n          host_depth_address_constant.source_to_dest =\n              int32_t(dest_rt_key.base_tiles) -\n              int32_t(host_depth_source_rt_key.base_tiles);\n          if (last_host_depth_address_constant != host_depth_address_constant) {\n            last_host_depth_address_constant = host_depth_address_constant;\n            transfer_push_constants_set &=\n                ~kTransferUsedPushConstantDwordHostDepthAddressBit;\n          }\n        }\n        if (transfer_pipeline_layout_info.used_push_constant_dwords &\n            kTransferUsedPushConstantDwordAddressBit) {\n          RenderTargetKey source_rt_key = source_vulkan_rt.key();\n          TransferAddressConstant address_constant;\n          address_constant.dest_pitch = dest_pitch_tiles;\n          address_constant.source_pitch = source_rt_key.GetPitchTiles();\n          address_constant.source_to_dest = int32_t(dest_rt_key.base_tiles) -\n                                            int32_t(source_rt_key.base_tiles);\n          if (last_address_constant != address_constant) {\n            last_address_constant = address_constant;\n            transfer_push_constants_set &=\n                ~kTransferUsedPushConstantDwordAddressBit;\n          }\n        }\n\n        // Apply the new bindings.\n        // TODO(Triang3l): Merge binding updates into spans.\n        VkPipelineLayout transfer_pipeline_layout =\n            transfer_pipeline_layouts_[size_t(transfer_pipeline_layout_index)];\n        uint32_t transfer_descriptor_sets_unbound =\n            transfer_pipeline_layout_info.used_descriptor_sets &\n            ~transfer_descriptor_sets_bound;\n        if (transfer_descriptor_sets_unbound &\n            kTransferUsedDescriptorSetHostDepthBufferBit) {\n          command_buffer.CmdVkBindDescriptorSets(\n              VK_PIPELINE_BIND_POINT_GRAPHICS, transfer_pipeline_layout,\n              xe::bit_count(transfer_pipeline_layout_info.used_descriptor_sets &\n                            (kTransferUsedDescriptorSetHostDepthBufferBit - 1)),\n              1, &edram_storage_buffer_descriptor_set_, 0, nullptr);\n          transfer_descriptor_sets_bound |=\n              kTransferUsedDescriptorSetHostDepthBufferBit;\n        }\n        if (transfer_descriptor_sets_unbound &\n            kTransferUsedDescriptorSetHostDepthStencilTexturesBit) {\n          command_buffer.CmdVkBindDescriptorSets(\n              VK_PIPELINE_BIND_POINT_GRAPHICS, transfer_pipeline_layout,\n              xe::bit_count(\n                  transfer_pipeline_layout_info.used_descriptor_sets &\n                  (kTransferUsedDescriptorSetHostDepthStencilTexturesBit - 1)),\n              1, &last_descriptor_set_host_depth_stencil_textures, 0, nullptr);\n          transfer_descriptor_sets_bound |=\n              kTransferUsedDescriptorSetHostDepthStencilTexturesBit;\n        }\n        if (transfer_descriptor_sets_unbound &\n            kTransferUsedDescriptorSetDepthStencilTexturesBit) {\n          command_buffer.CmdVkBindDescriptorSets(\n              VK_PIPELINE_BIND_POINT_GRAPHICS, transfer_pipeline_layout,\n              xe::bit_count(\n                  transfer_pipeline_layout_info.used_descriptor_sets &\n                  (kTransferUsedDescriptorSetDepthStencilTexturesBit - 1)),\n              1, &last_descriptor_set_depth_stencil_textures, 0, nullptr);\n          transfer_descriptor_sets_bound |=\n              kTransferUsedDescriptorSetDepthStencilTexturesBit;\n        }\n        if (transfer_descriptor_sets_unbound &\n            kTransferUsedDescriptorSetColorTextureBit) {\n          command_buffer.CmdVkBindDescriptorSets(\n              VK_PIPELINE_BIND_POINT_GRAPHICS, transfer_pipeline_layout,\n              xe::bit_count(transfer_pipeline_layout_info.used_descriptor_sets &\n                            (kTransferUsedDescriptorSetColorTextureBit - 1)),\n              1, &last_descriptor_set_color_texture, 0, nullptr);\n          transfer_descriptor_sets_bound |=\n              kTransferUsedDescriptorSetColorTextureBit;\n        }\n        uint32_t transfer_push_constants_unset =\n            transfer_pipeline_layout_info.used_push_constant_dwords &\n            ~transfer_push_constants_set;\n        if (transfer_push_constants_unset &\n            kTransferUsedPushConstantDwordHostDepthAddressBit) {\n          command_buffer.CmdVkPushConstants(\n              transfer_pipeline_layout, VK_SHADER_STAGE_FRAGMENT_BIT,\n              sizeof(uint32_t) *\n                  xe::bit_count(\n                      transfer_pipeline_layout_info.used_push_constant_dwords &\n                      (kTransferUsedPushConstantDwordHostDepthAddressBit - 1)),\n              sizeof(uint32_t), &last_host_depth_address_constant);\n          transfer_push_constants_set |=\n              kTransferUsedPushConstantDwordHostDepthAddressBit;\n        }\n        if (transfer_push_constants_unset &\n            kTransferUsedPushConstantDwordAddressBit) {\n          command_buffer.CmdVkPushConstants(\n              transfer_pipeline_layout, VK_SHADER_STAGE_FRAGMENT_BIT,\n              sizeof(uint32_t) *\n                  xe::bit_count(\n                      transfer_pipeline_layout_info.used_push_constant_dwords &\n                      (kTransferUsedPushConstantDwordAddressBit - 1)),\n              sizeof(uint32_t), &last_address_constant);\n          transfer_push_constants_set |=\n              kTransferUsedPushConstantDwordAddressBit;\n        }\n\n        for (uint32_t j = 0; j < transfer_sample_pipeline_count; ++j) {\n          if (j) {\n            command_processor_.BindExternalGraphicsPipeline(\n                transfer_pipelines[j]);\n          }\n          for (uint32_t k = 0; k < uint32_t(transfer_is_stencil_bit ? 8 : 1);\n               ++k) {\n            if (transfer_is_stencil_bit) {\n              uint32_t transfer_stencil_bit = uint32_t(1) << k;\n              command_buffer.CmdVkPushConstants(\n                  transfer_pipeline_layout, VK_SHADER_STAGE_FRAGMENT_BIT,\n                  sizeof(uint32_t) *\n                      xe::bit_count(\n                          transfer_pipeline_layout_info\n                              .used_push_constant_dwords &\n                          (kTransferUsedPushConstantDwordStencilMaskBit - 1)),\n                  sizeof(uint32_t), &transfer_stencil_bit);\n              command_buffer.CmdVkSetStencilWriteMask(\n                  VK_STENCIL_FACE_FRONT_AND_BACK, transfer_stencil_bit);\n            }\n            command_buffer.CmdVkDraw(transfer_vertex_count, 1, 0, 0);\n          }\n        }\n      }\n    }\n\n    // Perform the clear.\n    if (resolve_clear_needed) {\n      command_processor_.SubmitBarriersAndEnterRenderTargetCacheRenderPass(\n          transfer_render_pass, transfer_framebuffer);\n      VkClearAttachment resolve_clear_attachment;\n      resolve_clear_attachment.colorAttachment = 0;\n      std::memset(&resolve_clear_attachment.clearValue, 0,\n                  sizeof(resolve_clear_attachment.clearValue));\n      uint64_t clear_value = render_target_resolve_clear_values[i];\n      if (dest_rt_key.is_depth) {\n        resolve_clear_attachment.aspectMask =\n            VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;\n        uint32_t depth_guest_clear_value =\n            (uint32_t(clear_value) >> 8) & 0xFFFFFF;\n        switch (dest_rt_key.GetDepthFormat()) {\n          case xenos::DepthRenderTargetFormat::kD24S8:\n            resolve_clear_attachment.clearValue.depthStencil.depth =\n                xenos::UNorm24To32(depth_guest_clear_value);\n            break;\n          case xenos::DepthRenderTargetFormat::kD24FS8:\n            // Taking [0, 2) -> [0, 1) remapping into account.\n            resolve_clear_attachment.clearValue.depthStencil.depth =\n                xenos::Float20e4To32(depth_guest_clear_value) * 0.5f;\n            break;\n        }\n        resolve_clear_attachment.clearValue.depthStencil.stencil =\n            uint32_t(clear_value) & 0xFF;\n      } else {\n        resolve_clear_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;\n        switch (dest_rt_key.GetColorFormat()) {\n          case xenos::ColorRenderTargetFormat::k_8_8_8_8:\n          case xenos::ColorRenderTargetFormat::k_8_8_8_8_GAMMA: {\n            for (uint32_t j = 0; j < 4; ++j) {\n              resolve_clear_attachment.clearValue.color.float32[j] =\n                  ((clear_value >> (j * 8)) & 0xFF) * (1.0f / 0xFF);\n            }\n          } break;\n          case xenos::ColorRenderTargetFormat::k_2_10_10_10:\n          case xenos::ColorRenderTargetFormat::k_2_10_10_10_AS_10_10_10_10: {\n            for (uint32_t j = 0; j < 3; ++j) {\n              resolve_clear_attachment.clearValue.color.float32[j] =\n                  ((clear_value >> (j * 10)) & 0x3FF) * (1.0f / 0x3FF);\n            }\n            resolve_clear_attachment.clearValue.color.float32[3] =\n                ((clear_value >> 30) & 0x3) * (1.0f / 0x3);\n          } break;\n          case xenos::ColorRenderTargetFormat::k_2_10_10_10_FLOAT:\n          case xenos::ColorRenderTargetFormat::\n              k_2_10_10_10_FLOAT_AS_16_16_16_16: {\n            for (uint32_t j = 0; j < 3; ++j) {\n              resolve_clear_attachment.clearValue.color.float32[j] =\n                  xenos::Float7e3To32((clear_value >> (j * 10)) & 0x3FF);\n            }\n            resolve_clear_attachment.clearValue.color.float32[3] =\n                ((clear_value >> 30) & 0x3) * (1.0f / 0x3);\n          } break;\n          case xenos::ColorRenderTargetFormat::k_16_16:\n          case xenos::ColorRenderTargetFormat::k_16_16_FLOAT: {\n            // Using uint for transfers and clears of both. Disregarding the\n            // current -32...32 vs. -1...1 settings for consistency with color\n            // clear via depth aliasing.\n            // TODO(Triang3l): Handle cases of unsupported multisampled 16_UINT\n            // and completely unsupported 16_UNORM.\n            for (uint32_t j = 0; j < 2; ++j) {\n              resolve_clear_attachment.clearValue.color.uint32[j] =\n                  uint32_t(clear_value >> (j * 16)) & 0xFFFF;\n            }\n          } break;\n          case xenos::ColorRenderTargetFormat::k_16_16_16_16:\n          case xenos::ColorRenderTargetFormat::k_16_16_16_16_FLOAT: {\n            // Using uint for transfers and clears of both. Disregarding the\n            // current -32...32 vs. -1...1 settings for consistency with color\n            // clear via depth aliasing.\n            // TODO(Triang3l): Handle cases of unsupported multisampled 16_UINT\n            // and completely unsupported 16_UNORM.\n            for (uint32_t j = 0; j < 4; ++j) {\n              resolve_clear_attachment.clearValue.color.uint32[j] =\n                  uint32_t(clear_value >> (j * 16)) & 0xFFFF;\n            }\n          } break;\n          case xenos::ColorRenderTargetFormat::k_32_FLOAT: {\n            // Using uint for proper denormal and NaN handling.\n            resolve_clear_attachment.clearValue.color.uint32[0] =\n                uint32_t(clear_value);\n          } break;\n          case xenos::ColorRenderTargetFormat::k_32_32_FLOAT: {\n            // Using uint for proper denormal and NaN handling.\n            resolve_clear_attachment.clearValue.color.uint32[0] =\n                uint32_t(clear_value);\n            resolve_clear_attachment.clearValue.color.uint32[1] =\n                uint32_t(clear_value >> 32);\n          } break;\n        }\n      }\n      command_buffer.CmdVkClearAttachments(1, &resolve_clear_attachment, 1,\n                                           &resolve_clear_rect);\n    }\n  }\n}\n\nVkPipeline VulkanRenderTargetCache::GetDumpPipeline(DumpPipelineKey key) {\n  auto pipeline_it = dump_pipelines_.find(key);\n  if (pipeline_it != dump_pipelines_.end()) {\n    return pipeline_it->second;\n  }\n\n  std::vector<spv::Id> id_vector_temp;\n\n  SpirvBuilder builder(spv::Spv_1_0,\n                       (SpirvShaderTranslator::kSpirvMagicToolId << 16) | 1,\n                       nullptr);\n  spv::Id ext_inst_glsl_std_450 = builder.import(\"GLSL.std.450\");\n  builder.addCapability(spv::CapabilityShader);\n  builder.setMemoryModel(spv::AddressingModelLogical, spv::MemoryModelGLSL450);\n  builder.setSource(spv::SourceLanguageUnknown, 0);\n\n  spv::Id type_void = builder.makeVoidType();\n  spv::Id type_int = builder.makeIntType(32);\n  spv::Id type_int2 = builder.makeVectorType(type_int, 2);\n  spv::Id type_uint = builder.makeUintType(32);\n  spv::Id type_uint2 = builder.makeVectorType(type_uint, 2);\n  spv::Id type_uint3 = builder.makeVectorType(type_uint, 3);\n  spv::Id type_float = builder.makeFloatType(32);\n\n  // Bindings.\n  // EDRAM buffer.\n  bool format_is_64bpp = !key.is_depth && xenos::IsColorRenderTargetFormat64bpp(\n                                              key.GetColorFormat());\n  id_vector_temp.clear();\n  id_vector_temp.push_back(\n      builder.makeRuntimeArray(format_is_64bpp ? type_uint2 : type_uint));\n  // Storage buffers have std430 packing, no padding to 4-component vectors.\n  builder.addDecoration(id_vector_temp.back(), spv::DecorationArrayStride,\n                        sizeof(uint32_t) << uint32_t(format_is_64bpp));\n  spv::Id type_edram = builder.makeStructType(id_vector_temp, \"XeEdram\");\n  builder.addMemberName(type_edram, 0, \"edram\");\n  builder.addMemberDecoration(type_edram, 0, spv::DecorationNonReadable);\n  builder.addMemberDecoration(type_edram, 0, spv::DecorationOffset, 0);\n  // Block since SPIR-V 1.3, but since SPIR-V 1.0 is generated, it's\n  // BufferBlock.\n  builder.addDecoration(type_edram, spv::DecorationBufferBlock);\n  // StorageBuffer since SPIR-V 1.3, but since SPIR-V 1.0 is generated, it's\n  // Uniform.\n  spv::Id edram_buffer = builder.createVariable(\n      spv::NoPrecision, spv::StorageClassUniform, type_edram, \"xe_edram\");\n  builder.addDecoration(edram_buffer, spv::DecorationDescriptorSet,\n                        kDumpDescriptorSetEdram);\n  builder.addDecoration(edram_buffer, spv::DecorationBinding, 0);\n  // Color or depth source.\n  bool source_is_multisampled = key.msaa_samples != xenos::MsaaSamples::k1X;\n  bool source_is_uint;\n  if (key.is_depth) {\n    source_is_uint = false;\n  } else {\n    GetColorOwnershipTransferVulkanFormat(key.GetColorFormat(),\n                                          &source_is_uint);\n  }\n  spv::Id source_component_type = source_is_uint ? type_uint : type_float;\n  spv::Id source_texture = builder.createVariable(\n      spv::NoPrecision, spv::StorageClassUniformConstant,\n      builder.makeImageType(source_component_type, spv::Dim2D, false, false,\n                            source_is_multisampled, 1, spv::ImageFormatUnknown),\n      \"xe_edram_dump_source\");\n  builder.addDecoration(source_texture, spv::DecorationDescriptorSet,\n                        kDumpDescriptorSetSource);\n  builder.addDecoration(source_texture, spv::DecorationBinding, 0);\n  // Stencil source.\n  spv::Id source_stencil_texture = spv::NoResult;\n  if (key.is_depth) {\n    source_stencil_texture = builder.createVariable(\n        spv::NoPrecision, spv::StorageClassUniformConstant,\n        builder.makeImageType(type_uint, spv::Dim2D, false, false,\n                              source_is_multisampled, 1,\n                              spv::ImageFormatUnknown),\n        \"xe_edram_dump_stencil\");\n    builder.addDecoration(source_stencil_texture, spv::DecorationDescriptorSet,\n                          kDumpDescriptorSetSource);\n    builder.addDecoration(source_stencil_texture, spv::DecorationBinding, 1);\n  }\n  // Push constants.\n  id_vector_temp.clear();\n  id_vector_temp.reserve(kDumpPushConstantCount);\n  for (uint32_t i = 0; i < kDumpPushConstantCount; ++i) {\n    id_vector_temp.push_back(type_uint);\n  }\n  spv::Id type_push_constants =\n      builder.makeStructType(id_vector_temp, \"XeEdramDumpPushConstants\");\n  builder.addMemberName(type_push_constants, kDumpPushConstantPitches,\n                        \"pitches\");\n  builder.addMemberDecoration(type_push_constants, kDumpPushConstantPitches,\n                              spv::DecorationOffset,\n                              int(sizeof(uint32_t) * kDumpPushConstantPitches));\n  builder.addMemberName(type_push_constants, kDumpPushConstantOffsets,\n                        \"offsets\");\n  builder.addMemberDecoration(type_push_constants, kDumpPushConstantOffsets,\n                              spv::DecorationOffset,\n                              int(sizeof(uint32_t) * kDumpPushConstantOffsets));\n  builder.addDecoration(type_push_constants, spv::DecorationBlock);\n  spv::Id push_constants = builder.createVariable(\n      spv::NoPrecision, spv::StorageClassPushConstant, type_push_constants,\n      \"xe_edram_dump_push_constants\");\n\n  // gl_GlobalInvocationID input.\n  spv::Id input_global_invocation_id =\n      builder.createVariable(spv::NoPrecision, spv::StorageClassInput,\n                             type_uint3, \"gl_GlobalInvocationID\");\n  builder.addDecoration(input_global_invocation_id, spv::DecorationBuiltIn,\n                        spv::BuiltInGlobalInvocationId);\n\n  // Begin the main function.\n  std::vector<spv::Id> main_param_types;\n  std::vector<std::vector<spv::Decoration>> main_precisions;\n  spv::Block* main_entry;\n  spv::Function* main_function =\n      builder.makeFunctionEntry(spv::NoPrecision, type_void, \"main\",\n                                main_param_types, main_precisions, &main_entry);\n\n  // For now, as the exact addressing in 64bpp render targets relatively to\n  // 32bpp is unknown, treating 64bpp tiles as storing 40x16 samples rather than\n  // 80x16 for simplicity of addressing into the texture.\n\n  // Split the destination sample index into the 32bpp tile and the\n  // 32bpp-tile-relative sample index.\n  // Note that division by non-power-of-two constants will include a 4-cycle\n  // 32*32 multiplication on AMD, even though so many bits are not needed for\n  // the sample position - however, if an OpUnreachable path is inserted for the\n  // case when the position has upper bits set, for some reason, the code for it\n  // is not eliminated when compiling the shader for AMD via RenderDoc on\n  // Windows, as of June 2022.\n  spv::Id global_invocation_id =\n      builder.createLoad(input_global_invocation_id, spv::NoPrecision);\n  spv::Id rectangle_sample_x =\n      builder.createCompositeExtract(global_invocation_id, type_uint, 0);\n  uint32_t tile_width =\n      (xenos::kEdramTileWidthSamples >> uint32_t(format_is_64bpp)) *\n      draw_resolution_scale_x();\n  spv::Id const_tile_width = builder.makeUintConstant(tile_width);\n  spv::Id rectangle_tile_index_x = builder.createBinOp(\n      spv::OpUDiv, type_uint, rectangle_sample_x, const_tile_width);\n  spv::Id tile_sample_x = builder.createBinOp(\n      spv::OpUMod, type_uint, rectangle_sample_x, const_tile_width);\n  spv::Id rectangle_sample_y =\n      builder.createCompositeExtract(global_invocation_id, type_uint, 1);\n  uint32_t tile_height =\n      xenos::kEdramTileHeightSamples * draw_resolution_scale_y();\n  spv::Id const_tile_height = builder.makeUintConstant(tile_height);\n  spv::Id rectangle_tile_index_y = builder.createBinOp(\n      spv::OpUDiv, type_uint, rectangle_sample_y, const_tile_height);\n  spv::Id tile_sample_y = builder.createBinOp(\n      spv::OpUMod, type_uint, rectangle_sample_y, const_tile_height);\n\n  // Get the tile index in the EDRAM relative to the dump rectangle base tile.\n  id_vector_temp.clear();\n  id_vector_temp.push_back(builder.makeIntConstant(kDumpPushConstantPitches));\n  spv::Id pitches_constant = builder.createLoad(\n      builder.createAccessChain(spv::StorageClassPushConstant, push_constants,\n                                id_vector_temp),\n      spv::NoPrecision);\n  spv::Id const_uint_0 = builder.makeUintConstant(0);\n  spv::Id const_edram_pitch_tiles_bits =\n      builder.makeUintConstant(xenos::kEdramPitchTilesBits);\n  spv::Id rectangle_tile_index = builder.createBinOp(\n      spv::OpIAdd, type_uint,\n      builder.createBinOp(\n          spv::OpIMul, type_uint,\n          builder.createTriOp(spv::OpBitFieldUExtract, type_uint,\n                              pitches_constant, const_uint_0,\n                              const_edram_pitch_tiles_bits),\n          rectangle_tile_index_y),\n      rectangle_tile_index_x);\n  // Add the base tile in the dispatch to the dispatch-local tile index, not\n  // wrapping yet so in case of a wraparound, the address relative to the base\n  // in the image after subtraction of the base won't be negative.\n  id_vector_temp.clear();\n  id_vector_temp.push_back(builder.makeIntConstant(kDumpPushConstantOffsets));\n  spv::Id offsets_constant = builder.createLoad(\n      builder.createAccessChain(spv::StorageClassPushConstant, push_constants,\n                                id_vector_temp),\n      spv::NoPrecision);\n  spv::Id const_edram_base_tiles_bits_plus_1 =\n      builder.makeUintConstant(xenos::kEdramBaseTilesBits + 1);\n  spv::Id edram_tile_index_non_wrapped = builder.createBinOp(\n      spv::OpIAdd, type_uint,\n      builder.createTriOp(spv::OpBitFieldUExtract, type_uint, offsets_constant,\n                          const_uint_0, const_edram_base_tiles_bits_plus_1),\n      rectangle_tile_index);\n\n  // Combine the tile sample index and the tile index, wrapping the tile\n  // addressing, into the EDRAM sample index.\n  spv::Id edram_sample_address = builder.createBinOp(\n      spv::OpIAdd, type_uint,\n      builder.createBinOp(\n          spv::OpIMul, type_uint,\n          builder.makeUintConstant(tile_width * tile_height),\n          builder.createBinOp(\n              spv::OpBitwiseAnd, type_uint, edram_tile_index_non_wrapped,\n              builder.makeUintConstant(xenos::kEdramTileCount - 1))),\n      builder.createBinOp(spv::OpIAdd, type_uint,\n                          builder.createBinOp(spv::OpIMul, type_uint,\n                                              const_tile_width, tile_sample_y),\n                          tile_sample_x));\n  if (key.is_depth) {\n    // Swap 40-sample columns in the depth buffer in the destination address to\n    // get the final address of the sample in the EDRAM.\n    uint32_t tile_width_half = tile_width >> 1;\n    edram_sample_address = builder.createUnaryOp(\n        spv::OpBitcast, type_uint,\n        builder.createBinOp(\n            spv::OpIAdd, type_int,\n            builder.createUnaryOp(spv::OpBitcast, type_int,\n                                  edram_sample_address),\n            builder.createTriOp(\n                spv::OpSelect, type_int,\n                builder.createBinOp(spv::OpULessThan, builder.makeBoolType(),\n                                    tile_sample_x,\n                                    builder.makeUintConstant(tile_width_half)),\n                builder.makeIntConstant(int32_t(tile_width_half)),\n                builder.makeIntConstant(-int32_t(tile_width_half)))));\n  }\n\n  // Get the linear tile index within the source texture.\n  spv::Id source_tile_index = builder.createBinOp(\n      spv::OpISub, type_uint, edram_tile_index_non_wrapped,\n      builder.createTriOp(\n          spv::OpBitFieldUExtract, type_uint, offsets_constant,\n          const_edram_base_tiles_bits_plus_1,\n          builder.makeUintConstant(xenos::kEdramBaseTilesBits)));\n  // Split the linear tile index in the source texture into X and Y in tiles.\n  spv::Id source_pitch_tiles = builder.createTriOp(\n      spv::OpBitFieldUExtract, type_uint, pitches_constant,\n      const_edram_pitch_tiles_bits, const_edram_pitch_tiles_bits);\n  spv::Id source_tile_index_y = builder.createBinOp(\n      spv::OpUDiv, type_uint, source_tile_index, source_pitch_tiles);\n  spv::Id source_tile_index_x = builder.createBinOp(\n      spv::OpUMod, type_uint, source_tile_index, source_pitch_tiles);\n  // Combine the source tile offset and the sample index within the tile.\n  spv::Id source_sample_x = builder.createBinOp(\n      spv::OpIAdd, type_uint,\n      builder.createBinOp(spv::OpIMul, type_uint, const_tile_width,\n                          source_tile_index_x),\n      tile_sample_x);\n  spv::Id source_sample_y = builder.createBinOp(\n      spv::OpIAdd, type_uint,\n      builder.createBinOp(spv::OpIMul, type_uint, const_tile_height,\n                          source_tile_index_y),\n      tile_sample_y);\n  // Get the source pixel coordinate and the sample index within the pixel.\n  spv::Id source_pixel_x = source_sample_x, source_pixel_y = source_sample_y;\n  spv::Id source_sample_id = spv::NoResult;\n  if (source_is_multisampled) {\n    spv::Id const_uint_1 = builder.makeUintConstant(1);\n    source_pixel_y = builder.createBinOp(spv::OpShiftRightLogical, type_uint,\n                                         source_sample_y, const_uint_1);\n    if (key.msaa_samples >= xenos::MsaaSamples::k4X) {\n      source_pixel_x = builder.createBinOp(spv::OpShiftRightLogical, type_uint,\n                                           source_sample_x, const_uint_1);\n      // 4x MSAA source texture sample index - bit 0 for horizontal, bit 1 for\n      // vertical.\n      source_sample_id = builder.createQuadOp(\n          spv::OpBitFieldInsert, type_uint,\n          builder.createBinOp(spv::OpBitwiseAnd, type_uint, source_sample_x,\n                              const_uint_1),\n          source_sample_y, const_uint_1, const_uint_1);\n    } else {\n      // 2x MSAA source texture sample index - convert from the guest to\n      // the Vulkan standard sample locations.\n      source_sample_id = builder.createTriOp(\n          spv::OpSelect, type_uint,\n          builder.createBinOp(\n              spv::OpINotEqual, builder.makeBoolType(),\n              builder.createBinOp(spv::OpBitwiseAnd, type_uint, source_sample_y,\n                                  const_uint_1),\n              const_uint_0),\n          builder.makeUintConstant(draw_util::GetD3D10SampleIndexForGuest2xMSAA(\n              1, msaa_2x_attachments_supported_)),\n          builder.makeUintConstant(draw_util::GetD3D10SampleIndexForGuest2xMSAA(\n              0, msaa_2x_attachments_supported_)));\n    }\n  }\n\n  // Load the source, and pack the value into one or two 32-bit integers.\n  spv::Id packed[2] = {};\n  spv::Builder::TextureParameters source_texture_parameters = {};\n  source_texture_parameters.sampler =\n      builder.createLoad(source_texture, spv::NoPrecision);\n  id_vector_temp.clear();\n  id_vector_temp.push_back(\n      builder.createUnaryOp(spv::OpBitcast, type_int, source_pixel_x));\n  id_vector_temp.push_back(\n      builder.createUnaryOp(spv::OpBitcast, type_int, source_pixel_y));\n  source_texture_parameters.coords =\n      builder.createCompositeConstruct(type_int2, id_vector_temp);\n  if (source_is_multisampled) {\n    source_texture_parameters.sample =\n        builder.createUnaryOp(spv::OpBitcast, type_int, source_sample_id);\n  } else {\n    source_texture_parameters.lod = builder.makeIntConstant(0);\n  }\n  spv::Id source_vec4 = builder.createTextureCall(\n      spv::NoPrecision, builder.makeVectorType(source_component_type, 4), false,\n      true, false, false, false, source_texture_parameters,\n      spv::ImageOperandsMaskNone);\n  if (key.is_depth) {\n    source_texture_parameters.sampler =\n        builder.createLoad(source_stencil_texture, spv::NoPrecision);\n    spv::Id source_stencil = builder.createCompositeExtract(\n        builder.createTextureCall(\n            spv::NoPrecision, builder.makeVectorType(type_uint, 4), false, true,\n            false, false, false, source_texture_parameters,\n            spv::ImageOperandsMaskNone),\n        type_uint, 0);\n    spv::Id source_depth32 =\n        builder.createCompositeExtract(source_vec4, type_float, 0);\n    switch (key.GetDepthFormat()) {\n      case xenos::DepthRenderTargetFormat::kD24S8: {\n        // Round to the nearest even integer. This seems to be the correct\n        // conversion, adding +0.5 and rounding towards zero results in red\n        // instead of black in the 4D5307E6 clear shader.\n        packed[0] = builder.createUnaryOp(\n            spv::OpConvertFToU, type_uint,\n            builder.createUnaryBuiltinCall(\n                type_float, ext_inst_glsl_std_450, GLSLstd450RoundEven,\n                builder.createBinOp(\n                    spv::OpFMul, type_float, source_depth32,\n                    builder.makeFloatConstant(float(0xFFFFFF)))));\n      } break;\n      case xenos::DepthRenderTargetFormat::kD24FS8: {\n        packed[0] = SpirvShaderTranslator::PreClampedDepthTo20e4(\n            builder, source_depth32, depth_float24_round(), true,\n            ext_inst_glsl_std_450);\n      } break;\n    }\n    packed[0] = builder.createQuadOp(\n        spv::OpBitFieldInsert, type_uint, source_stencil, packed[0],\n        builder.makeUintConstant(8), builder.makeUintConstant(24));\n  } else {\n    switch (key.GetColorFormat()) {\n      case xenos::ColorRenderTargetFormat::k_8_8_8_8:\n      case xenos::ColorRenderTargetFormat::k_8_8_8_8_GAMMA: {\n        spv::Id unorm_round_offset = builder.makeFloatConstant(0.5f);\n        spv::Id unorm_scale = builder.makeFloatConstant(255.0f);\n        packed[0] = builder.createUnaryOp(\n            spv::OpConvertFToU, type_uint,\n            builder.createBinOp(\n                spv::OpFAdd, type_float,\n                builder.createBinOp(\n                    spv::OpFMul, type_float,\n                    builder.createCompositeExtract(source_vec4, type_float, 0),\n                    unorm_scale),\n                unorm_round_offset));\n        spv::Id component_width = builder.makeUintConstant(8);\n        for (uint32_t i = 1; i < 4; ++i) {\n          packed[0] = builder.createQuadOp(\n              spv::OpBitFieldInsert, type_uint, packed[0],\n              builder.createUnaryOp(\n                  spv::OpConvertFToU, type_uint,\n                  builder.createBinOp(\n                      spv::OpFAdd, type_float,\n                      builder.createBinOp(spv::OpFMul, type_float,\n                                          builder.createCompositeExtract(\n                                              source_vec4, type_float, i),\n                                          unorm_scale),\n                      unorm_round_offset)),\n              builder.makeUintConstant(8 * i), component_width);\n        }\n      } break;\n      case xenos::ColorRenderTargetFormat::k_2_10_10_10:\n      case xenos::ColorRenderTargetFormat::k_2_10_10_10_AS_10_10_10_10: {\n        spv::Id unorm_round_offset = builder.makeFloatConstant(0.5f);\n        spv::Id unorm_scale_rgb = builder.makeFloatConstant(1023.0f);\n        packed[0] = builder.createUnaryOp(\n            spv::OpConvertFToU, type_uint,\n            builder.createBinOp(\n                spv::OpFAdd, type_float,\n                builder.createBinOp(\n                    spv::OpFMul, type_float,\n                    builder.createCompositeExtract(source_vec4, type_float, 0),\n                    unorm_scale_rgb),\n                unorm_round_offset));\n        spv::Id width_rgb = builder.makeUintConstant(10);\n        spv::Id unorm_scale_a = builder.makeFloatConstant(3.0f);\n        spv::Id width_a = builder.makeUintConstant(2);\n        for (uint32_t i = 1; i < 4; ++i) {\n          packed[0] = builder.createQuadOp(\n              spv::OpBitFieldInsert, type_uint, packed[0],\n              builder.createUnaryOp(\n                  spv::OpConvertFToU, type_uint,\n                  builder.createBinOp(\n                      spv::OpFAdd, type_float,\n                      builder.createBinOp(\n                          spv::OpFMul, type_float,\n                          builder.createCompositeExtract(source_vec4,\n                                                         type_float, i),\n                          i == 3 ? unorm_scale_a : unorm_scale_rgb),\n                      unorm_round_offset)),\n              builder.makeUintConstant(10 * i), i == 3 ? width_a : width_rgb);\n        }\n      } break;\n      case xenos::ColorRenderTargetFormat::k_2_10_10_10_FLOAT:\n      case xenos::ColorRenderTargetFormat::k_2_10_10_10_FLOAT_AS_16_16_16_16: {\n        // Float16 has a wider range for both color and alpha, also NaNs - clamp\n        // and convert.\n        packed[0] = SpirvShaderTranslator::UnclampedFloat32To7e3(\n            builder, builder.createCompositeExtract(source_vec4, type_float, 0),\n            ext_inst_glsl_std_450);\n        spv::Id width_rgb = builder.makeUintConstant(10);\n        for (uint32_t i = 1; i < 3; ++i) {\n          packed[0] = builder.createQuadOp(\n              spv::OpBitFieldInsert, type_uint, packed[0],\n              SpirvShaderTranslator::UnclampedFloat32To7e3(\n                  builder,\n                  builder.createCompositeExtract(source_vec4, type_float, i),\n                  ext_inst_glsl_std_450),\n              builder.makeUintConstant(10 * i), width_rgb);\n        }\n        // Saturate and convert the alpha.\n        spv::Id alpha_saturated = builder.createTriBuiltinCall(\n            type_float, ext_inst_glsl_std_450, GLSLstd450NClamp,\n            builder.createCompositeExtract(source_vec4, type_float, 3),\n            builder.makeFloatConstant(0.0f), builder.makeFloatConstant(1.0f));\n        packed[0] = builder.createQuadOp(\n            spv::OpBitFieldInsert, type_uint, packed[0],\n            builder.createUnaryOp(\n                spv::OpConvertFToU, type_uint,\n                builder.createBinOp(\n                    spv::OpFAdd, type_float,\n                    builder.createBinOp(spv::OpFMul, type_float,\n                                        alpha_saturated,\n                                        builder.makeFloatConstant(3.0f)),\n                    builder.makeFloatConstant(0.5f))),\n            builder.makeUintConstant(30), builder.makeUintConstant(2));\n      } break;\n      case xenos::ColorRenderTargetFormat::k_16_16:\n      case xenos::ColorRenderTargetFormat::k_16_16_16_16:\n      case xenos::ColorRenderTargetFormat::k_16_16_FLOAT:\n      case xenos::ColorRenderTargetFormat::k_16_16_16_16_FLOAT: {\n        // All 64bpp formats, and all 16 bits per component formats, are\n        // represented as integers in ownership transfer for safe handling of\n        // NaN encodings and -32768 / -32767.\n        // TODO(Triang3l): Handle the case when that's not true (no multisampled\n        // sampled images, no 16-bit UNORM, no cross-packing 32bpp aliasing on a\n        // portability subset device or a 64bpp format where that wouldn't help\n        // anyway).\n        spv::Id component_offset_width = builder.makeUintConstant(16);\n        for (uint32_t i = 0; i <= uint32_t(format_is_64bpp); ++i) {\n          packed[i] = builder.createQuadOp(\n              spv::OpBitFieldInsert, type_uint,\n              builder.createCompositeExtract(source_vec4, type_uint, 2 * i),\n              builder.createCompositeExtract(source_vec4, type_uint, 2 * i + 1),\n              component_offset_width, component_offset_width);\n        }\n      } break;\n      // Float32 is transferred as uint32 to preserve NaN encodings. However,\n      // multisampled sampled image support is optional in Vulkan.\n      case xenos::ColorRenderTargetFormat::k_32_FLOAT:\n      case xenos::ColorRenderTargetFormat::k_32_32_FLOAT: {\n        for (uint32_t i = 0; i <= uint32_t(format_is_64bpp); ++i) {\n          spv::Id& packed_ref = packed[i];\n          packed_ref = builder.createCompositeExtract(source_vec4,\n                                                      source_component_type, i);\n          if (!source_is_uint) {\n            packed_ref =\n                builder.createUnaryOp(spv::OpBitcast, type_uint, packed_ref);\n          }\n        }\n      } break;\n    }\n  }\n\n  // Write the packed value to the EDRAM buffer.\n  spv::Id store_value = packed[0];\n  if (format_is_64bpp) {\n    id_vector_temp.clear();\n    id_vector_temp.push_back(packed[0]);\n    id_vector_temp.push_back(packed[1]);\n    store_value = builder.createCompositeConstruct(type_uint2, id_vector_temp);\n  }\n  id_vector_temp.clear();\n  // The only SSBO structure member.\n  id_vector_temp.push_back(builder.makeIntConstant(0));\n  id_vector_temp.push_back(\n      builder.createUnaryOp(spv::OpBitcast, type_int, edram_sample_address));\n  // StorageBuffer since SPIR-V 1.3, but since SPIR-V 1.0 is generated, it's\n  // Uniform.\n  builder.createStore(store_value,\n                      builder.createAccessChain(spv::StorageClassUniform,\n                                                edram_buffer, id_vector_temp));\n\n  // End the main function and make it the entry point.\n  builder.leaveFunction();\n  builder.addExecutionMode(main_function, spv::ExecutionModeLocalSize,\n                           kDumpSamplesPerGroupX, kDumpSamplesPerGroupY, 1);\n  spv::Instruction* entry_point = builder.addEntryPoint(\n      spv::ExecutionModelGLCompute, main_function, \"main\");\n  // Bindings only need to be added to the entry point's interface starting with\n  // SPIR-V 1.4 - emitting 1.0 here, so only inputs / outputs.\n  entry_point->addIdOperand(input_global_invocation_id);\n\n  // Serialize the shader code.\n  std::vector<unsigned int> shader_code;\n  builder.dump(shader_code);\n\n  // Create the pipeline, and store the handle even if creation fails not to try\n  // to create it again later.\n  VkPipeline pipeline = ui::vulkan::util::CreateComputePipeline(\n      command_processor_.GetVulkanDevice(),\n      key.is_depth ? dump_pipeline_layout_depth_ : dump_pipeline_layout_color_,\n      reinterpret_cast<const uint32_t*>(shader_code.data()),\n      sizeof(uint32_t) * shader_code.size());\n  if (pipeline == VK_NULL_HANDLE) {\n    XELOGE(\n        \"VulkanRenderTargetCache: Failed to create a render target dumping \"\n        \"pipeline for {}-sample render targets with format {}\",\n        UINT32_C(1) << uint32_t(key.msaa_samples),\n        key.is_depth\n            ? xenos::GetDepthRenderTargetFormatName(key.GetDepthFormat())\n            : xenos::GetColorRenderTargetFormatName(key.GetColorFormat()));\n  }\n  dump_pipelines_.emplace(key, pipeline);\n  return pipeline;\n}\n\nvoid VulkanRenderTargetCache::DumpRenderTargets(uint32_t dump_base,\n                                                uint32_t dump_row_length_used,\n                                                uint32_t dump_rows,\n                                                uint32_t dump_pitch) {\n  assert_true(GetPath() == Path::kHostRenderTargets);\n\n  GetResolveCopyRectanglesToDump(dump_base, dump_row_length_used, dump_rows,\n                                 dump_pitch, dump_rectangles_);\n  if (dump_rectangles_.empty()) {\n    return;\n  }\n\n  // Clear previously set temporary indices.\n  for (const ResolveCopyDumpRectangle& rectangle : dump_rectangles_) {\n    static_cast<VulkanRenderTarget*>(rectangle.render_target)\n        ->SetTemporarySortIndex(UINT32_MAX);\n  }\n  // Gather all needed barriers and info needed to sort the invocations.\n  UseEdramBuffer(EdramBufferUsage::kComputeWrite);\n  dump_invocations_.clear();\n  dump_invocations_.reserve(dump_rectangles_.size());\n  constexpr VkPipelineStageFlags kRenderTargetDstStageMask =\n      VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT;\n  constexpr VkAccessFlags kRenderTargetDstAccessMask =\n      VK_ACCESS_SHADER_READ_BIT;\n  constexpr VkImageLayout kRenderTargetNewLayout =\n      VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;\n  uint32_t rt_sort_index = 0;\n  for (const ResolveCopyDumpRectangle& rectangle : dump_rectangles_) {\n    auto& vulkan_rt =\n        *static_cast<VulkanRenderTarget*>(rectangle.render_target);\n    RenderTargetKey rt_key = vulkan_rt.key();\n    command_processor_.PushImageMemoryBarrier(\n        vulkan_rt.image(),\n        ui::vulkan::util::InitializeSubresourceRange(\n            rt_key.is_depth\n                ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)\n                : VK_IMAGE_ASPECT_COLOR_BIT),\n        vulkan_rt.current_stage_mask(), VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,\n        vulkan_rt.current_access_mask(), VK_ACCESS_SHADER_READ_BIT,\n        vulkan_rt.current_layout(), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);\n    vulkan_rt.SetUsage(VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,\n                       VK_ACCESS_SHADER_READ_BIT,\n                       VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);\n    if (vulkan_rt.temporary_sort_index() == UINT32_MAX) {\n      vulkan_rt.SetTemporarySortIndex(rt_sort_index++);\n    }\n    DumpPipelineKey pipeline_key;\n    pipeline_key.msaa_samples = rt_key.msaa_samples;\n    pipeline_key.resource_format = rt_key.resource_format;\n    pipeline_key.is_depth = rt_key.is_depth;\n    dump_invocations_.emplace_back(rectangle, pipeline_key);\n  }\n\n  // Sort the invocations to reduce context and binding switches.\n  std::sort(dump_invocations_.begin(), dump_invocations_.end());\n\n  // Dump the render targets.\n  DeferredCommandBuffer& command_buffer =\n      command_processor_.deferred_command_buffer();\n  bool edram_buffer_bound = false;\n  VkDescriptorSet last_source_descriptor_set = VK_NULL_HANDLE;\n  DumpPitches last_pitches;\n  DumpOffsets last_offsets;\n  bool pitches_bound = false, offsets_bound = false;\n  for (const DumpInvocation& invocation : dump_invocations_) {\n    const ResolveCopyDumpRectangle& rectangle = invocation.rectangle;\n    auto& vulkan_rt =\n        *static_cast<VulkanRenderTarget*>(rectangle.render_target);\n    RenderTargetKey rt_key = vulkan_rt.key();\n    DumpPipelineKey pipeline_key = invocation.pipeline_key;\n    VkPipeline pipeline = GetDumpPipeline(pipeline_key);\n    if (!pipeline) {\n      continue;\n    }\n    command_processor_.BindExternalComputePipeline(pipeline);\n\n    VkPipelineLayout pipeline_layout = rt_key.is_depth\n                                           ? dump_pipeline_layout_depth_\n                                           : dump_pipeline_layout_color_;\n\n    // Only need to bind the EDRAM buffer once (relying on pipeline layout\n    // compatibility).\n    if (!edram_buffer_bound) {\n      edram_buffer_bound = true;\n      command_buffer.CmdVkBindDescriptorSets(\n          VK_PIPELINE_BIND_POINT_COMPUTE, pipeline_layout,\n          kDumpDescriptorSetEdram, 1, &edram_storage_buffer_descriptor_set_, 0,\n          nullptr);\n    }\n\n    VkDescriptorSet source_descriptor_set =\n        vulkan_rt.GetDescriptorSetTransferSource();\n    if (last_source_descriptor_set != source_descriptor_set) {\n      last_source_descriptor_set = source_descriptor_set;\n      command_buffer.CmdVkBindDescriptorSets(\n          VK_PIPELINE_BIND_POINT_COMPUTE, pipeline_layout,\n          kDumpDescriptorSetSource, 1, &source_descriptor_set, 0, nullptr);\n    }\n\n    DumpPitches pitches;\n    pitches.dest_pitch = dump_pitch;\n    pitches.source_pitch = rt_key.GetPitchTiles();\n    if (last_pitches != pitches) {\n      last_pitches = pitches;\n      pitches_bound = false;\n    }\n    if (!pitches_bound) {\n      pitches_bound = true;\n      command_buffer.CmdVkPushConstants(\n          pipeline_layout, VK_SHADER_STAGE_COMPUTE_BIT,\n          sizeof(uint32_t) * kDumpPushConstantPitches, sizeof(last_pitches),\n          &last_pitches);\n    }\n\n    DumpOffsets offsets;\n    offsets.source_base_tiles = rt_key.base_tiles;\n    ResolveCopyDumpRectangle::Dispatch\n        dispatches[ResolveCopyDumpRectangle::kMaxDispatches];\n    uint32_t dispatch_count =\n        rectangle.GetDispatches(dump_pitch, dump_row_length_used, dispatches);\n    for (uint32_t i = 0; i < dispatch_count; ++i) {\n      const ResolveCopyDumpRectangle::Dispatch& dispatch = dispatches[i];\n      offsets.dispatch_first_tile = dump_base + dispatch.offset;\n      if (last_offsets != offsets) {\n        last_offsets = offsets;\n        offsets_bound = false;\n      }\n      if (!offsets_bound) {\n        offsets_bound = true;\n        command_buffer.CmdVkPushConstants(\n            pipeline_layout, VK_SHADER_STAGE_COMPUTE_BIT,\n            sizeof(uint32_t) * kDumpPushConstantOffsets, sizeof(last_offsets),\n            &last_offsets);\n      }\n      command_processor_.SubmitBarriers(true);\n      command_buffer.CmdVkDispatch(\n          (draw_resolution_scale_x() *\n               (xenos::kEdramTileWidthSamples >> uint32_t(rt_key.Is64bpp())) *\n               dispatch.width_tiles +\n           (kDumpSamplesPerGroupX - 1)) /\n              kDumpSamplesPerGroupX,\n          (draw_resolution_scale_y() * xenos::kEdramTileHeightSamples *\n               dispatch.height_tiles +\n           (kDumpSamplesPerGroupY - 1)) /\n              kDumpSamplesPerGroupY,\n          1);\n    }\n    MarkEdramBufferModified();\n  }\n}\n\n}  // namespace vulkan\n}  // namespace gpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/vulkan/vulkan_render_target_cache.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_VULKAN_VULKAN_RENDER_TARGET_CACHE_H_\n#define XENIA_GPU_VULKAN_VULKAN_RENDER_TARGET_CACHE_H_\n\n#include <array>\n#include <cstdint>\n#include <cstring>\n#include <functional>\n#include <memory>\n#include <unordered_map>\n\n#include \"xenia/base/hash.h\"\n#include \"xenia/base/xxhash.h\"\n#include \"xenia/gpu/render_target_cache.h\"\n#include \"xenia/gpu/vulkan/vulkan_shared_memory.h\"\n#include \"xenia/gpu/vulkan/vulkan_texture_cache.h\"\n#include \"xenia/gpu/xenos.h\"\n#include \"xenia/ui/vulkan/single_layout_descriptor_set_pool.h\"\n#include \"xenia/ui/vulkan/vulkan_upload_buffer_pool.h\"\n\nnamespace xe {\nnamespace gpu {\nnamespace vulkan {\n\nclass VulkanCommandProcessor;\n\nclass VulkanRenderTargetCache final : public RenderTargetCache {\n public:\n  union RenderPassKey {\n    struct {\n      // If emulating 2x as 4x, this is still 2x for simplicity of using this\n      // field to make guest-related decisions. Render pass objects are not very\n      // expensive, and their dependencies can't be shared between 2x-as-4x and\n      // true 4x MSAA passes (framebuffers because render target cache render\n      // targets are different for 2x and 4x guest MSAA, pipelines because the\n      // sample mask will have 2 samples excluded for 2x-as-4x).\n      // This has effect only on the attachments, but even in cases when there\n      // are no attachments, it can be used to pass the sample count between\n      // subsystems, for instance, to specify the desired number of samples to\n      // use when there are no attachments in pipelines.\n      // Also, without attachments, using separate render passes for different\n      // sample counts ensures that if the variableMultisampleRate feature is\n      // not supported, no draws with different rasterization sample counts end\n      // up in one render pass.\n      xenos::MsaaSamples msaa_samples : xenos::kMsaaSamplesBits;  // 2\n      // << 0 is depth, << 1...4 is color.\n      uint32_t depth_and_color_used : 1 + xenos::kMaxColorRenderTargets;  // 7\n      // 0 for unused attachments.\n      // If VK_FORMAT_D24_UNORM_S8_UINT is not supported, this must be kD24FS8\n      // even for kD24S8.\n      xenos::DepthRenderTargetFormat depth_format\n          : xenos::kDepthRenderTargetFormatBits;  // 8\n      xenos::ColorRenderTargetFormat color_0_view_format\n          : xenos::kColorRenderTargetFormatBits;  // 12\n      xenos::ColorRenderTargetFormat color_1_view_format\n          : xenos::kColorRenderTargetFormatBits;  // 16\n      xenos::ColorRenderTargetFormat color_2_view_format\n          : xenos::kColorRenderTargetFormatBits;  // 20\n      xenos::ColorRenderTargetFormat color_3_view_format\n          : xenos::kColorRenderTargetFormatBits;    // 24\n      uint32_t color_rts_use_transfer_formats : 1;  // 25\n    };\n    uint32_t key = 0;\n    struct Hasher {\n      size_t operator()(const RenderPassKey& key) const {\n        return std::hash<uint32_t>{}(key.key);\n      }\n    };\n    bool operator==(const RenderPassKey& other_key) const {\n      return key == other_key.key;\n    }\n    bool operator!=(const RenderPassKey& other_key) const {\n      return !(*this == other_key);\n    }\n    bool operator<(const RenderPassKey& other_key) const {\n      return key < other_key.key;\n    }\n  };\n  static_assert_size(RenderPassKey, sizeof(uint32_t));\n\n  struct Framebuffer {\n    VkFramebuffer framebuffer = VK_NULL_HANDLE;\n    VkExtent2D host_extent{};\n    Framebuffer() = default;\n    Framebuffer(VkFramebuffer framebuffer, const VkExtent2D& host_extent)\n        : framebuffer(framebuffer), host_extent(host_extent) {}\n  };\n\n  VulkanRenderTargetCache(const RegisterFile& register_file,\n                          const Memory& memory, TraceWriter& trace_writer,\n                          uint32_t draw_resolution_scale_x,\n                          uint32_t draw_resolution_scale_y,\n                          VulkanCommandProcessor& command_processor);\n  ~VulkanRenderTargetCache();\n\n  // Transient descriptor set layouts must be initialized in the command\n  // processor.\n  bool Initialize(uint32_t shared_memory_binding_count);\n  void Shutdown(bool from_destructor = false);\n  void ClearCache() override;\n\n  void CompletedSubmissionUpdated();\n  void EndSubmission();\n\n  Path GetPath() const override { return path_; }\n\n  VkBuffer edram_buffer() const { return edram_buffer_; }\n\n  // Performs the resolve to a shared memory area according to the current\n  // register values, and also clears the render targets if needed. Must be in a\n  // frame for calling.\n  bool Resolve(const Memory& memory, VulkanSharedMemory& shared_memory,\n               VulkanTextureCache& texture_cache, uint32_t& written_address_out,\n               uint32_t& written_length_out);\n\n  bool Update(bool is_rasterization_done,\n              reg::RB_DEPTHCONTROL normalized_depth_control,\n              uint32_t normalized_color_mask,\n              const Shader& vertex_shader) override;\n  // Binding information for the last successful update.\n  RenderPassKey last_update_render_pass_key() const {\n    return last_update_render_pass_key_;\n  }\n  VkRenderPass last_update_render_pass() const {\n    return last_update_render_pass_;\n  }\n  const Framebuffer* last_update_framebuffer() const {\n    return last_update_framebuffer_;\n  }\n\n  // Using R16G16[B16A16]_SNORM, which are -1...1, not the needed -32...32.\n  // Persistent data doesn't depend on this, so can be overriden by per-game\n  // configuration.\n  bool IsFixedRG16TruncatedToMinus1To1() const {\n    // TODO(Triang3l): Not float16 condition.\n    return GetPath() == Path::kHostRenderTargets &&\n           !cvars::snorm16_render_target_full_range;\n  }\n  bool IsFixedRGBA16TruncatedToMinus1To1() const {\n    // TODO(Triang3l): Not float16 condition.\n    return GetPath() == Path::kHostRenderTargets &&\n           !cvars::snorm16_render_target_full_range;\n  }\n\n  bool depth_unorm24_vulkan_format_supported() const {\n    return depth_unorm24_vulkan_format_supported_;\n  }\n  bool depth_float24_round() const { return depth_float24_round_; }\n\n  bool msaa_2x_attachments_supported() const {\n    return msaa_2x_attachments_supported_;\n  }\n  bool msaa_2x_no_attachments_supported() const {\n    return msaa_2x_no_attachments_supported_;\n  }\n  bool IsMsaa2xSupported(bool subpass_has_attachments) const {\n    return subpass_has_attachments ? msaa_2x_attachments_supported_\n                                   : msaa_2x_no_attachments_supported_;\n  }\n\n  // Returns the render pass object, or VK_NULL_HANDLE if failed to create.\n  // A render pass managed by the render target cache may be ended and resumed\n  // at any time (to allow for things like copying and texture loading).\n  VkRenderPass GetHostRenderTargetsRenderPass(RenderPassKey key);\n  VkRenderPass GetFragmentShaderInterlockRenderPass() const {\n    assert_true(GetPath() == Path::kPixelShaderInterlock);\n    return fsi_render_pass_;\n  }\n\n  VkFormat GetDepthVulkanFormat(xenos::DepthRenderTargetFormat format) const;\n  VkFormat GetColorVulkanFormat(xenos::ColorRenderTargetFormat format) const;\n  VkFormat GetColorOwnershipTransferVulkanFormat(\n      xenos::ColorRenderTargetFormat format,\n      bool* is_integer_out = nullptr) const;\n\n protected:\n  bool IsGammaFormatHostStorageSeparate() const override;\n\n  uint32_t GetMaxRenderTargetWidth() const override;\n  uint32_t GetMaxRenderTargetHeight() const override;\n\n  RenderTarget* CreateRenderTarget(RenderTargetKey key) override;\n\n  bool IsHostDepthEncodingDifferent(\n      xenos::DepthRenderTargetFormat format) const override;\n\n  void RequestPixelShaderInterlockBarrier() override;\n\n private:\n  enum class EdramBufferUsage {\n    // There's no need for combined fragment and compute usages.\n    // With host render targets, the usual usage sequence is as follows:\n    // - Optionally compute writes - host depth copy storing for EDRAM range\n    //   ownership transfers.\n    // - Optionally fragment reads - host depth copy storing for EDRAM range\n    //   ownership transfers.\n    // - Compute writes - copying from host render targets during resolving.\n    // - Compute reads - writing to the shared memory during resolving.\n    // With the render backend implementation based on fragment shader\n    // interlocks, it's:\n    // - Fragment reads and writes - depth / stencil and color operations.\n    // - Compute reads - writing to the shared memory during resolving.\n    // So, fragment reads and compute reads normally don't follow each other,\n    // and there's no need to amortize the cost of a read > read barrier in an\n    // exceptional situation by using a wider barrier in the normal scenario.\n\n    // Host depth copy storing.\n    kFragmentRead,\n    // Fragment shader interlock depth / stencil and color operations.\n    kFragmentReadWrite,\n    // Resolve - copying to the shared memory.\n    kComputeRead,\n    // Resolve - copying from host render targets.\n    kComputeWrite,\n    // Trace recording.\n    kTransferRead,\n    // Trace playback.\n    kTransferWrite,\n  };\n\n  enum class EdramBufferModificationStatus {\n    // The values are ordered by how strong the barrier conditions are.\n    // No uncommitted shader writes.\n    kUnmodified,\n    // Need to commit before the next fragment shader interlock usage with\n    // overlap.\n    kViaFragmentShaderInterlock,\n    // Need to commit before any next fragment shader interlock usage.\n    kViaUnordered,\n  };\n\n  enum ResolveCopyDescriptorSet : uint32_t {\n    // Never changes.\n    kResolveCopyDescriptorSetEdram,\n    // Shared memory or a region in it.\n    kResolveCopyDescriptorSetDest,\n\n    kResolveCopyDescriptorSetCount,\n  };\n\n  struct ResolveCopyShaderCode {\n    const uint32_t* unscaled;\n    size_t unscaled_size_bytes;\n    const uint32_t* scaled;\n    size_t scaled_size_bytes;\n  };\n\n  static void GetEdramBufferUsageMasks(EdramBufferUsage usage,\n                                       VkPipelineStageFlags& stage_mask_out,\n                                       VkAccessFlags& access_mask_out);\n  void UseEdramBuffer(EdramBufferUsage new_usage);\n  void MarkEdramBufferModified(\n      EdramBufferModificationStatus modification_status =\n          EdramBufferModificationStatus::kViaUnordered);\n  void CommitEdramBufferShaderWrites(\n      EdramBufferModificationStatus commit_status =\n          EdramBufferModificationStatus::kViaFragmentShaderInterlock);\n\n  VulkanCommandProcessor& command_processor_;\n  TraceWriter& trace_writer_;\n\n  Path path_ = Path::kHostRenderTargets;\n\n  // Accessible in fragment and compute shaders.\n  VkDescriptorSetLayout descriptor_set_layout_storage_buffer_ = VK_NULL_HANDLE;\n  VkDescriptorSetLayout descriptor_set_layout_sampled_image_ = VK_NULL_HANDLE;\n  VkDescriptorSetLayout descriptor_set_layout_sampled_image_x2_ =\n      VK_NULL_HANDLE;\n\n  std::unique_ptr<ui::vulkan::SingleLayoutDescriptorSetPool>\n      descriptor_set_pool_sampled_image_;\n  std::unique_ptr<ui::vulkan::SingleLayoutDescriptorSetPool>\n      descriptor_set_pool_sampled_image_x2_;\n\n  VkDeviceMemory edram_buffer_memory_ = VK_NULL_HANDLE;\n  VkBuffer edram_buffer_ = VK_NULL_HANDLE;\n  EdramBufferUsage edram_buffer_usage_;\n  EdramBufferModificationStatus edram_buffer_modification_status_ =\n      EdramBufferModificationStatus::kUnmodified;\n  VkDescriptorPool edram_storage_buffer_descriptor_pool_ = VK_NULL_HANDLE;\n  VkDescriptorSet edram_storage_buffer_descriptor_set_;\n\n  VkPipelineLayout resolve_copy_pipeline_layout_ = VK_NULL_HANDLE;\n  static const ResolveCopyShaderCode\n      kResolveCopyShaders[size_t(draw_util::ResolveCopyShaderIndex::kCount)];\n  std::array<VkPipeline, size_t(draw_util::ResolveCopyShaderIndex::kCount)>\n      resolve_copy_pipelines_{};\n\n  // On the fragment shader interlock path, the render pass key is used purely\n  // for passing parameters to pipeline setup - there's always only one render\n  // pass.\n  RenderPassKey last_update_render_pass_key_;\n  VkRenderPass last_update_render_pass_ = VK_NULL_HANDLE;\n  // The pitch is not used on the fragment shader interlock path.\n  uint32_t last_update_framebuffer_pitch_tiles_at_32bpp_ = 0;\n  // The attachments are not used on the fragment shader interlock path.\n  const RenderTarget* const*\n      last_update_framebuffer_attachments_[1 + xenos::kMaxColorRenderTargets] =\n          {};\n  const Framebuffer* last_update_framebuffer_ = VK_NULL_HANDLE;\n\n  // For host render targets.\n\n  // Can only be destroyed when framebuffers referencing it are destroyed!\n  class VulkanRenderTarget final : public RenderTarget {\n   public:\n    static constexpr VkPipelineStageFlags kColorDrawStageMask =\n        VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;\n    static constexpr VkAccessFlags kColorDrawAccessMask =\n        VK_ACCESS_COLOR_ATTACHMENT_READ_BIT |\n        VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;\n    static constexpr VkImageLayout kColorDrawLayout =\n        VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;\n    static constexpr VkPipelineStageFlags kDepthDrawStageMask =\n        VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |\n        VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT;\n    static constexpr VkAccessFlags kDepthDrawAccessMask =\n        VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |\n        VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;\n    static constexpr VkImageLayout kDepthDrawLayout =\n        VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;\n\n    // Takes ownership of the Vulkan objects passed to the constructor.\n    VulkanRenderTarget(RenderTargetKey key,\n                       VulkanRenderTargetCache& render_target_cache,\n                       VkImage image, VkDeviceMemory memory,\n                       VkImageView view_depth_color,\n                       VkImageView view_depth_stencil, VkImageView view_stencil,\n                       VkImageView view_color_transfer_separate,\n                       size_t descriptor_set_index_transfer_source)\n        : RenderTarget(key),\n          render_target_cache_(render_target_cache),\n          image_(image),\n          memory_(memory),\n          view_depth_color_(view_depth_color),\n          view_depth_stencil_(view_depth_stencil),\n          view_stencil_(view_stencil),\n          view_color_transfer_separate_(view_color_transfer_separate),\n          descriptor_set_index_transfer_source_(\n              descriptor_set_index_transfer_source) {}\n    ~VulkanRenderTarget();\n\n    VkImage image() const { return image_; }\n\n    VkImageView view_depth_color() const { return view_depth_color_; }\n    VkImageView view_depth_stencil() const { return view_depth_stencil_; }\n    VkImageView view_color_transfer_separate() const {\n      return view_color_transfer_separate_;\n    }\n    VkImageView view_color_transfer() const {\n      return view_color_transfer_separate_ != VK_NULL_HANDLE\n                 ? view_color_transfer_separate_\n                 : view_depth_color_;\n    }\n    VkDescriptorSet GetDescriptorSetTransferSource() const {\n      ui::vulkan::SingleLayoutDescriptorSetPool& descriptor_set_pool =\n          key().is_depth\n              ? *render_target_cache_.descriptor_set_pool_sampled_image_x2_\n              : *render_target_cache_.descriptor_set_pool_sampled_image_;\n      return descriptor_set_pool.Get(descriptor_set_index_transfer_source_);\n    }\n\n    static void GetDrawUsage(bool is_depth,\n                             VkPipelineStageFlags* stage_mask_out,\n                             VkAccessFlags* access_mask_out,\n                             VkImageLayout* layout_out) {\n      if (stage_mask_out) {\n        *stage_mask_out = is_depth ? kDepthDrawStageMask : kColorDrawStageMask;\n      }\n      if (access_mask_out) {\n        *access_mask_out =\n            is_depth ? kDepthDrawAccessMask : kColorDrawAccessMask;\n      }\n      if (layout_out) {\n        *layout_out = is_depth ? kDepthDrawLayout : kColorDrawLayout;\n      }\n    }\n    void GetDrawUsage(VkPipelineStageFlags* stage_mask_out,\n                      VkAccessFlags* access_mask_out,\n                      VkImageLayout* layout_out) const {\n      GetDrawUsage(key().is_depth, stage_mask_out, access_mask_out, layout_out);\n    }\n    VkPipelineStageFlags current_stage_mask() const {\n      return current_stage_mask_;\n    }\n    VkAccessFlags current_access_mask() const { return current_access_mask_; }\n    VkImageLayout current_layout() const { return current_layout_; }\n    void SetUsage(VkPipelineStageFlags stage_mask, VkAccessFlags access_mask,\n                  VkImageLayout layout) {\n      current_stage_mask_ = stage_mask;\n      current_access_mask_ = access_mask;\n      current_layout_ = layout;\n    }\n\n    uint32_t temporary_sort_index() const { return temporary_sort_index_; }\n    void SetTemporarySortIndex(uint32_t index) {\n      temporary_sort_index_ = index;\n    }\n\n   private:\n    VulkanRenderTargetCache& render_target_cache_;\n\n    VkImage image_;\n    VkDeviceMemory memory_;\n\n    // TODO(Triang3l): Per-format drawing views for mutable formats with EDRAM\n    // aliasing without transfers.\n    VkImageView view_depth_color_;\n    // Optional views.\n    VkImageView view_depth_stencil_;\n    VkImageView view_stencil_;\n    VkImageView view_color_transfer_separate_;\n\n    // 2 sampled images for depth / stencil, 1 sampled image for color.\n    size_t descriptor_set_index_transfer_source_;\n\n    VkPipelineStageFlags current_stage_mask_ = 0;\n    VkAccessFlags current_access_mask_ = 0;\n    VkImageLayout current_layout_ = VK_IMAGE_LAYOUT_UNDEFINED;\n\n    // Temporary storage for indices in operations like transfers and dumps.\n    uint32_t temporary_sort_index_ = 0;\n  };\n\n  struct FramebufferKey {\n    RenderPassKey render_pass_key;\n\n    // Same as RenderTargetKey::pitch_tiles_at_32bpp.\n    uint32_t pitch_tiles_at_32bpp : 8;  // 8\n    // [0, 2047].\n    uint32_t depth_base_tiles : xenos::kEdramBaseTilesBits;    // 19\n    uint32_t color_0_base_tiles : xenos::kEdramBaseTilesBits;  // 30\n\n    uint32_t color_1_base_tiles : xenos::kEdramBaseTilesBits;  // 43\n    uint32_t color_2_base_tiles : xenos::kEdramBaseTilesBits;  // 54\n\n    uint32_t color_3_base_tiles : xenos::kEdramBaseTilesBits;  // 75\n\n    // Including all the padding, for a stable hash.\n    FramebufferKey() { Reset(); }\n    FramebufferKey(const FramebufferKey& key) {\n      std::memcpy(this, &key, sizeof(*this));\n    }\n    FramebufferKey& operator=(const FramebufferKey& key) {\n      std::memcpy(this, &key, sizeof(*this));\n      return *this;\n    }\n    bool operator==(const FramebufferKey& key) const {\n      return std::memcmp(this, &key, sizeof(*this)) == 0;\n    }\n    using Hasher = xe::hash::XXHasher<FramebufferKey>;\n    void Reset() { std::memset(this, 0, sizeof(*this)); }\n  };\n\n  enum TransferUsedDescriptorSet : uint32_t {\n    // Ordered from the least to the most frequently changed.\n    kTransferUsedDescriptorSetHostDepthBuffer,\n    kTransferUsedDescriptorSetHostDepthStencilTextures,\n    kTransferUsedDescriptorSetDepthStencilTextures,\n    // Mutually exclusive with kTransferUsedDescriptorSetDepthStencilTextures.\n    kTransferUsedDescriptorSetColorTexture,\n\n    kTransferUsedDescriptorSetCount,\n\n    kTransferUsedDescriptorSetHostDepthBufferBit =\n        uint32_t(1) << kTransferUsedDescriptorSetHostDepthBuffer,\n    kTransferUsedDescriptorSetHostDepthStencilTexturesBit =\n        uint32_t(1) << kTransferUsedDescriptorSetHostDepthStencilTextures,\n    kTransferUsedDescriptorSetDepthStencilTexturesBit =\n        uint32_t(1) << kTransferUsedDescriptorSetDepthStencilTextures,\n    kTransferUsedDescriptorSetColorTextureBit =\n        uint32_t(1) << kTransferUsedDescriptorSetColorTexture,\n  };\n\n  // 32-bit push constants (for simplicity of size calculation and to avoid\n  // std140 packing issues).\n  enum TransferUsedPushConstantDword : uint32_t {\n    kTransferUsedPushConstantDwordHostDepthAddress,\n    kTransferUsedPushConstantDwordAddress,\n    // Changed 8 times per transfer.\n    kTransferUsedPushConstantDwordStencilMask,\n\n    kTransferUsedPushConstantDwordCount,\n\n    kTransferUsedPushConstantDwordHostDepthAddressBit =\n        uint32_t(1) << kTransferUsedPushConstantDwordHostDepthAddress,\n    kTransferUsedPushConstantDwordAddressBit =\n        uint32_t(1) << kTransferUsedPushConstantDwordAddress,\n    kTransferUsedPushConstantDwordStencilMaskBit =\n        uint32_t(1) << kTransferUsedPushConstantDwordStencilMask,\n  };\n\n  enum class TransferPipelineLayoutIndex {\n    kColor,\n    kDepth,\n    kColorToStencilBit,\n    kDepthToStencilBit,\n    kColorAndHostDepthTexture,\n    kColorAndHostDepthBuffer,\n    kDepthAndHostDepthTexture,\n    kDepthAndHostDepthBuffer,\n\n    kCount,\n  };\n\n  struct TransferPipelineLayoutInfo {\n    uint32_t used_descriptor_sets;\n    uint32_t used_push_constant_dwords;\n  };\n\n  static const TransferPipelineLayoutInfo\n      kTransferPipelineLayoutInfos[size_t(TransferPipelineLayoutIndex::kCount)];\n\n  enum class TransferMode : uint32_t {\n    kColorToDepth,\n    kColorToColor,\n\n    kDepthToDepth,\n    kDepthToColor,\n\n    kColorToStencilBit,\n    kDepthToStencilBit,\n\n    // Two-source modes, using the host depth if it, when converted to the guest\n    // format, matches what's in the owner source (not modified, keep host\n    // precision), or the guest data otherwise (significantly modified, possibly\n    // cleared). Stencil for FragStencilRef is always taken from the guest\n    // source.\n\n    kColorAndHostDepthToDepth,\n    // When using different source and destination depth formats.\n    kDepthAndHostDepthToDepth,\n\n    // If host depth is fetched, but it's the same image as the destination,\n    // it's copied to the EDRAM buffer (but since it's just a scratch buffer,\n    // with tiles laid out linearly with the same pitch as in the original\n    // render target; also no swapping of 40-sample columns as opposed to the\n    // host render target - this is done only for the color source) and fetched\n    // from there instead of the host depth texture.\n    kColorAndHostDepthCopyToDepth,\n    kDepthAndHostDepthCopyToDepth,\n\n    kCount,\n  };\n\n  enum class TransferOutput {\n    kColor,\n    kDepth,\n    kStencilBit,\n  };\n\n  struct TransferModeInfo {\n    TransferOutput output;\n    TransferPipelineLayoutIndex pipeline_layout;\n  };\n\n  static const TransferModeInfo kTransferModes[size_t(TransferMode::kCount)];\n\n  union TransferShaderKey {\n    uint32_t key;\n    struct {\n      xenos::MsaaSamples dest_msaa_samples : xenos::kMsaaSamplesBits;\n      uint32_t dest_color_rt_index : xenos::kColorRenderTargetIndexBits;\n      uint32_t dest_resource_format : xenos::kRenderTargetFormatBits;\n      xenos::MsaaSamples source_msaa_samples : xenos::kMsaaSamplesBits;\n      // Always 1x when the host depth is a copy from a buffer rather than an\n      // image, not to create the same pipeline for different MSAA sample counts\n      // as it doesn't matter in this case.\n      xenos::MsaaSamples host_depth_source_msaa_samples\n          : xenos::kMsaaSamplesBits;\n      uint32_t source_resource_format : xenos::kRenderTargetFormatBits;\n\n      // Last bits because this affects the pipeline layout - after sorting,\n      // only change it as fewer times as possible. Depth buffers have an\n      // additional stencil texture.\n      static_assert(size_t(TransferMode::kCount) <= (size_t(1) << 4));\n      TransferMode mode : 4;\n    };\n\n    TransferShaderKey() : key(0) { static_assert_size(*this, sizeof(key)); }\n\n    struct Hasher {\n      size_t operator()(const TransferShaderKey& key) const {\n        return std::hash<uint32_t>{}(key.key);\n      }\n    };\n    bool operator==(const TransferShaderKey& other_key) const {\n      return key == other_key.key;\n    }\n    bool operator!=(const TransferShaderKey& other_key) const {\n      return !(*this == other_key);\n    }\n    bool operator<(const TransferShaderKey& other_key) const {\n      return key < other_key.key;\n    }\n  };\n\n  struct TransferPipelineKey {\n    RenderPassKey render_pass_key;\n    TransferShaderKey shader_key;\n\n    TransferPipelineKey(RenderPassKey render_pass_key,\n                        TransferShaderKey shader_key)\n        : render_pass_key(render_pass_key), shader_key(shader_key) {}\n\n    struct Hasher {\n      size_t operator()(const TransferPipelineKey& key) const {\n        XXH3_state_t hash_state;\n        XXH3_64bits_reset(&hash_state);\n        XXH3_64bits_update(&hash_state, &key.render_pass_key,\n                           sizeof(key.render_pass_key));\n        XXH3_64bits_update(&hash_state, &key.shader_key,\n                           sizeof(key.shader_key));\n        return static_cast<size_t>(XXH3_64bits_digest(&hash_state));\n      }\n    };\n    bool operator==(const TransferPipelineKey& other_key) const {\n      return render_pass_key == other_key.render_pass_key &&\n             shader_key == other_key.shader_key;\n    }\n    bool operator!=(const TransferPipelineKey& other_key) const {\n      return !(*this == other_key);\n    }\n    bool operator<(const TransferPipelineKey& other_key) const {\n      if (render_pass_key != other_key.render_pass_key) {\n        return render_pass_key < other_key.render_pass_key;\n      }\n      return shader_key < other_key.shader_key;\n    }\n  };\n\n  union TransferAddressConstant {\n    uint32_t constant;\n    struct {\n      // All in tiles.\n      uint32_t dest_pitch : xenos::kEdramPitchTilesBits;\n      uint32_t source_pitch : xenos::kEdramPitchTilesBits;\n      // Destination base in tiles minus source base in tiles (not vice versa\n      // because this is a transform of the coordinate system, not addresses\n      // themselves).\n      // + 1 bit because this is a signed difference between two EDRAM bases.\n      // 0 for host_depth_source_is_copy (ignored in this case anyway as\n      // destination == source anyway).\n      int32_t source_to_dest : xenos::kEdramBaseTilesBits + 1;\n    };\n    TransferAddressConstant() : constant(0) {\n      static_assert_size(*this, sizeof(constant));\n    }\n    bool operator==(const TransferAddressConstant& other_constant) const {\n      return constant == other_constant.constant;\n    }\n    bool operator!=(const TransferAddressConstant& other_constant) const {\n      return !(*this == other_constant);\n    }\n  };\n\n  struct TransferInvocation {\n    Transfer transfer;\n    TransferShaderKey shader_key;\n    TransferInvocation(const Transfer& transfer,\n                       const TransferShaderKey& shader_key)\n        : transfer(transfer), shader_key(shader_key) {}\n    bool operator<(const TransferInvocation& other_invocation) const {\n      // TODO(Triang3l): See if it may be better to sort by the source in the\n      // first place, especially when reading the same data multiple times (like\n      // to write the stencil bits after depth) for better read locality.\n      // Sort by the shader key primarily to reduce pipeline state (context)\n      // switches.\n      if (shader_key != other_invocation.shader_key) {\n        return shader_key < other_invocation.shader_key;\n      }\n      // Host depth render targets are changed rarely if they exist, won't save\n      // many binding changes, ignore them for simplicity (their existence is\n      // caught by the shader key change).\n      assert_not_null(transfer.source);\n      assert_not_null(other_invocation.transfer.source);\n      uint32_t source_index =\n          static_cast<const VulkanRenderTarget*>(transfer.source)\n              ->temporary_sort_index();\n      uint32_t other_source_index = static_cast<const VulkanRenderTarget*>(\n                                        other_invocation.transfer.source)\n                                        ->temporary_sort_index();\n      if (source_index != other_source_index) {\n        return source_index < other_source_index;\n      }\n      return transfer.start_tiles < other_invocation.transfer.start_tiles;\n    }\n    bool CanBeMergedIntoOneDraw(\n        const TransferInvocation& other_invocation) const {\n      return shader_key == other_invocation.shader_key &&\n             transfer.AreSourcesSame(other_invocation.transfer);\n    }\n  };\n\n  union DumpPipelineKey {\n    uint32_t key;\n    struct {\n      xenos::MsaaSamples msaa_samples : 2;\n      uint32_t resource_format : 4;\n      // Last bit because this affects the pipeline - after sorting, only change\n      // it at most once. Depth buffers have an additional stencil SRV.\n      uint32_t is_depth : 1;\n    };\n\n    DumpPipelineKey() : key(0) { static_assert_size(*this, sizeof(key)); }\n\n    struct Hasher {\n      size_t operator()(const DumpPipelineKey& key) const {\n        return std::hash<uint32_t>{}(key.key);\n      }\n    };\n    bool operator==(const DumpPipelineKey& other_key) const {\n      return key == other_key.key;\n    }\n    bool operator!=(const DumpPipelineKey& other_key) const {\n      return !(*this == other_key);\n    }\n    bool operator<(const DumpPipelineKey& other_key) const {\n      return key < other_key.key;\n    }\n\n    xenos::ColorRenderTargetFormat GetColorFormat() const {\n      assert_false(is_depth);\n      return xenos::ColorRenderTargetFormat(resource_format);\n    }\n    xenos::DepthRenderTargetFormat GetDepthFormat() const {\n      assert_true(is_depth);\n      return xenos::DepthRenderTargetFormat(resource_format);\n    }\n  };\n\n  // There's no strict dependency on the group size in dumping, for simplicity\n  // calculations especially with resolution scaling, dividing manually (as the\n  // group size is not unlimited). The only restriction is that an integer\n  // multiple of it must be 80x16 samples (and no larger than that) for 32bpp,\n  // or 40x16 samples for 64bpp (because only a half of the pair of tiles may\n  // need to be dumped). Using 8x16 since that's 128 - the minimum required\n  // group size on Vulkan, and the maximum number of lanes in a subgroup on\n  // Vulkan.\n  static constexpr uint32_t kDumpSamplesPerGroupX = 8;\n  static constexpr uint32_t kDumpSamplesPerGroupY = 16;\n\n  union DumpPitches {\n    uint32_t pitches;\n    struct {\n      // Both in tiles.\n      uint32_t dest_pitch : xenos::kEdramPitchTilesBits;\n      uint32_t source_pitch : xenos::kEdramPitchTilesBits;\n    };\n    DumpPitches() : pitches(0) { static_assert_size(*this, sizeof(pitches)); }\n    bool operator==(const DumpPitches& other_pitches) const {\n      return pitches == other_pitches.pitches;\n    }\n    bool operator!=(const DumpPitches& other_pitches) const {\n      return !(*this == other_pitches);\n    }\n  };\n\n  union DumpOffsets {\n    uint32_t offsets;\n    struct {\n      // May be beyond the EDRAM tile count in case of EDRAM addressing\n      // wrapping, thus + 1 bit.\n      uint32_t dispatch_first_tile : xenos::kEdramBaseTilesBits + 1;\n      uint32_t source_base_tiles : xenos::kEdramBaseTilesBits;\n    };\n    DumpOffsets() : offsets(0) { static_assert_size(*this, sizeof(offsets)); }\n    bool operator==(const DumpOffsets& other_offsets) const {\n      return offsets == other_offsets.offsets;\n    }\n    bool operator!=(const DumpOffsets& other_offsets) const {\n      return !(*this == other_offsets);\n    }\n  };\n\n  enum DumpDescriptorSet : uint32_t {\n    // Never changes. Same in both color and depth pipeline layouts, keep the\n    // first for pipeline layout compatibility, to only have to set it once.\n    kDumpDescriptorSetEdram,\n    // One resolve may need multiple sources. Different descriptor set layouts\n    // for color and depth.\n    kDumpDescriptorSetSource,\n\n    kDumpDescriptorSetCount,\n  };\n\n  enum DumpPushConstant : uint32_t {\n    // May be different for different sources.\n    kDumpPushConstantPitches,\n    // May be changed multiple times for the same source.\n    kDumpPushConstantOffsets,\n\n    kDumpPushConstantCount,\n  };\n\n  struct DumpInvocation {\n    ResolveCopyDumpRectangle rectangle;\n    DumpPipelineKey pipeline_key;\n    DumpInvocation(const ResolveCopyDumpRectangle& rectangle,\n                   const DumpPipelineKey& pipeline_key)\n        : rectangle(rectangle), pipeline_key(pipeline_key) {}\n    bool operator<(const DumpInvocation& other_invocation) const {\n      // Sort by the pipeline key primarily to reduce pipeline state (context)\n      // switches.\n      if (pipeline_key != other_invocation.pipeline_key) {\n        return pipeline_key < other_invocation.pipeline_key;\n      }\n      assert_not_null(rectangle.render_target);\n      uint32_t render_target_index =\n          static_cast<const VulkanRenderTarget*>(rectangle.render_target)\n              ->temporary_sort_index();\n      const ResolveCopyDumpRectangle& other_rectangle =\n          other_invocation.rectangle;\n      uint32_t other_render_target_index =\n          static_cast<const VulkanRenderTarget*>(other_rectangle.render_target)\n              ->temporary_sort_index();\n      if (render_target_index != other_render_target_index) {\n        return render_target_index < other_render_target_index;\n      }\n      if (rectangle.row_first != other_rectangle.row_first) {\n        return rectangle.row_first < other_rectangle.row_first;\n      }\n      return rectangle.row_first_start < other_rectangle.row_first_start;\n    }\n  };\n\n  // Returns the framebuffer object, or VK_NULL_HANDLE if failed to create.\n  const Framebuffer* GetHostRenderTargetsFramebuffer(\n      RenderPassKey render_pass_key, uint32_t pitch_tiles_at_32bpp,\n      const RenderTarget* const* depth_and_color_render_targets);\n\n  VkShaderModule GetTransferShader(TransferShaderKey key);\n  // With sample-rate shading, returns a pointer to one pipeline. Without\n  // sample-rate shading, returns a pointer to as many pipelines as there are\n  // samples. If there was a failure to create a pipeline, returns nullptr.\n  VkPipeline const* GetTransferPipelines(TransferPipelineKey key);\n\n  // Do ownership transfers for render targets - each render target / vector may\n  // be null / empty in case there's nothing to do for them.\n  // resolve_clear_rectangle is expected to be provided by\n  // PrepareHostRenderTargetsResolveClear which should do all the needed size\n  // bound checks.\n  void PerformTransfersAndResolveClears(\n      uint32_t render_target_count, RenderTarget* const* render_targets,\n      const std::vector<Transfer>* render_target_transfers,\n      const uint64_t* render_target_resolve_clear_values = nullptr,\n      const Transfer::Rectangle* resolve_clear_rectangle = nullptr);\n\n  VkPipeline GetDumpPipeline(DumpPipelineKey key);\n\n  // Writes contents of host render targets within rectangles from\n  // ResolveInfo::GetCopyEdramTileSpan to edram_buffer_.\n  void DumpRenderTargets(uint32_t dump_base, uint32_t dump_row_length_used,\n                         uint32_t dump_rows, uint32_t dump_pitch);\n\n  bool gamma_render_target_as_unorm16_ = false;\n\n  bool depth_unorm24_vulkan_format_supported_ = false;\n  bool depth_float24_round_ = false;\n\n  bool msaa_2x_attachments_supported_ = false;\n  bool msaa_2x_no_attachments_supported_ = false;\n\n  // VK_NULL_HANDLE if failed to create.\n  std::unordered_map<RenderPassKey, VkRenderPass, RenderPassKey::Hasher>\n      render_passes_;\n\n  std::unordered_map<FramebufferKey, Framebuffer, FramebufferKey::Hasher>\n      framebuffers_;\n\n  // Set 0 - EDRAM storage buffer, set 1 - source depth sampled image (and\n  // unused stencil from the transfer descriptor set), HostDepthStoreConstants\n  // passed via push constants.\n  VkPipelineLayout host_depth_store_pipeline_layout_ = VK_NULL_HANDLE;\n  VkPipeline host_depth_store_pipelines_[size_t(xenos::MsaaSamples::k4X) + 1] =\n      {};\n\n  std::unique_ptr<ui::vulkan::VulkanUploadBufferPool>\n      transfer_vertex_buffer_pool_;\n  VkShaderModule transfer_passthrough_vertex_shader_ = VK_NULL_HANDLE;\n  VkPipelineLayout transfer_pipeline_layouts_[size_t(\n      TransferPipelineLayoutIndex::kCount)] = {};\n  // VK_NULL_HANDLE if failed to create.\n  std::unordered_map<TransferShaderKey, VkShaderModule,\n                     TransferShaderKey::Hasher>\n      transfer_shaders_;\n  // With sample-rate shading, one pipeline per entry. Without sample-rate\n  // shading, one pipeline per sample per entry. VK_NULL_HANDLE if failed to\n  // create.\n  std::unordered_map<TransferPipelineKey, std::array<VkPipeline, 4>,\n                     TransferPipelineKey::Hasher>\n      transfer_pipelines_;\n\n  VkPipelineLayout dump_pipeline_layout_color_ = VK_NULL_HANDLE;\n  VkPipelineLayout dump_pipeline_layout_depth_ = VK_NULL_HANDLE;\n  // Compute pipelines for copying host render target contents to the EDRAM\n  // buffer. VK_NULL_HANDLE if failed to create.\n  std::unordered_map<DumpPipelineKey, VkPipeline, DumpPipelineKey::Hasher>\n      dump_pipelines_;\n\n  // Temporary storage for Resolve.\n  std::vector<Transfer> clear_transfers_[2];\n\n  // Temporary storage for PerformTransfersAndResolveClears.\n  std::vector<TransferInvocation> current_transfer_invocations_;\n\n  // Temporary storage for DumpRenderTargets.\n  std::vector<ResolveCopyDumpRectangle> dump_rectangles_;\n  std::vector<DumpInvocation> dump_invocations_;\n\n  // For pixel (fragment) shader interlock.\n\n  VkRenderPass fsi_render_pass_ = VK_NULL_HANDLE;\n  Framebuffer fsi_framebuffer_;\n\n  VkPipelineLayout resolve_fsi_clear_pipeline_layout_ = VK_NULL_HANDLE;\n  VkPipeline resolve_fsi_clear_32bpp_pipeline_ = VK_NULL_HANDLE;\n  VkPipeline resolve_fsi_clear_64bpp_pipeline_ = VK_NULL_HANDLE;\n};\n\n}  // namespace vulkan\n}  // namespace gpu\n}  // namespace xe\n\n#endif  // XENIA_GPU_VULKAN_VULKAN_RENDER_TARGET_CACHE_H_\n"
  },
  {
    "path": "src/xenia/gpu/vulkan/vulkan_shader.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/vulkan/vulkan_shader.h\"\n\n#include <cstdint>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/ui/vulkan/vulkan_provider.h\"\n\nnamespace xe {\nnamespace gpu {\nnamespace vulkan {\n\nVulkanShader::VulkanTranslation::~VulkanTranslation() {\n  if (shader_module_) {\n    const ui::vulkan::VulkanDevice* const vulkan_device =\n        static_cast<const VulkanShader&>(shader()).vulkan_device_;\n    vulkan_device->functions().vkDestroyShaderModule(vulkan_device->device(),\n                                                     shader_module_, nullptr);\n  }\n}\n\nVkShaderModule VulkanShader::VulkanTranslation::GetOrCreateShaderModule() {\n  if (!is_valid()) {\n    return VK_NULL_HANDLE;\n  }\n  if (shader_module_ != VK_NULL_HANDLE) {\n    return shader_module_;\n  }\n  const ui::vulkan::VulkanDevice* const vulkan_device =\n      static_cast<const VulkanShader&>(shader()).vulkan_device_;\n  VkShaderModuleCreateInfo shader_module_create_info;\n  shader_module_create_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;\n  shader_module_create_info.pNext = nullptr;\n  shader_module_create_info.flags = 0;\n  shader_module_create_info.codeSize = translated_binary().size();\n  shader_module_create_info.pCode =\n      reinterpret_cast<const uint32_t*>(translated_binary().data());\n  if (vulkan_device->functions().vkCreateShaderModule(\n          vulkan_device->device(), &shader_module_create_info, nullptr,\n          &shader_module_) != VK_SUCCESS) {\n    XELOGE(\n        \"VulkanShader::VulkanTranslation: Failed to create a Vulkan shader \"\n        \"module for shader {:016X} modification {:016X}\",\n        shader().ucode_data_hash(), modification());\n    MakeInvalid();\n    return VK_NULL_HANDLE;\n  }\n  return shader_module_;\n}\n\nVulkanShader::VulkanShader(const ui::vulkan::VulkanDevice* const vulkan_device,\n                           const xenos::ShaderType shader_type,\n                           const uint64_t ucode_data_hash,\n                           const uint32_t* const ucode_dwords,\n                           const size_t ucode_dword_count,\n                           const std::endian ucode_source_endian)\n    : SpirvShader(shader_type, ucode_data_hash, ucode_dwords, ucode_dword_count,\n                  ucode_source_endian),\n      vulkan_device_(vulkan_device) {\n  assert_not_null(vulkan_device);\n}\n\nShader::Translation* VulkanShader::CreateTranslationInstance(\n    uint64_t modification) {\n  return new VulkanTranslation(*this, modification);\n}\n\n}  // namespace vulkan\n}  // namespace gpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/vulkan/vulkan_shader.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_VULKAN_VULKAN_SHADER_H_\n#define XENIA_GPU_VULKAN_VULKAN_SHADER_H_\n\n#include <cstdint>\n\n#include \"xenia/gpu/spirv_shader.h\"\n#include \"xenia/gpu/xenos.h\"\n#include \"xenia/ui/vulkan/vulkan_device.h\"\n\nnamespace xe {\nnamespace gpu {\nnamespace vulkan {\n\nclass VulkanShader : public SpirvShader {\n public:\n  class VulkanTranslation : public SpirvTranslation {\n   public:\n    explicit VulkanTranslation(VulkanShader& shader, uint64_t modification)\n        : SpirvTranslation(shader, modification) {}\n    ~VulkanTranslation() override;\n\n    VkShaderModule GetOrCreateShaderModule();\n    VkShaderModule shader_module() const { return shader_module_; }\n\n   private:\n    VkShaderModule shader_module_ = VK_NULL_HANDLE;\n  };\n\n  explicit VulkanShader(const ui::vulkan::VulkanDevice* vulkan_device,\n                        xenos::ShaderType shader_type, uint64_t ucode_data_hash,\n                        const uint32_t* ucode_dwords, size_t ucode_dword_count,\n                        std::endian ucode_source_endian = std::endian::big);\n\n  // For owning subsystem like the pipeline cache, accessors for unique\n  // identifiers (used instead of hashes to make sure collisions can't happen)\n  // of binding layouts used by the shader, for invalidation if a shader with an\n  // incompatible layout has been bound.\n  size_t GetTextureBindingLayoutUserUID() const {\n    return texture_binding_layout_user_uid_;\n  }\n  size_t GetSamplerBindingLayoutUserUID() const {\n    return sampler_binding_layout_user_uid_;\n  }\n  // Modifications of the same shader can be translated on different threads.\n  // The \"set\" function must only be called if \"enter\" returned true - these are\n  // set up only once.\n  bool EnterBindingLayoutUserUIDSetup() {\n    return !binding_layout_user_uids_set_up_.test_and_set();\n  }\n  void SetTextureBindingLayoutUserUID(size_t uid) {\n    texture_binding_layout_user_uid_ = uid;\n  }\n  void SetSamplerBindingLayoutUserUID(size_t uid) {\n    sampler_binding_layout_user_uid_ = uid;\n  }\n\n protected:\n  Translation* CreateTranslationInstance(uint64_t modification) override;\n\n private:\n  const ui::vulkan::VulkanDevice* vulkan_device_;\n\n  std::atomic_flag binding_layout_user_uids_set_up_ = ATOMIC_FLAG_INIT;\n  size_t texture_binding_layout_user_uid_ = 0;\n  size_t sampler_binding_layout_user_uid_ = 0;\n};\n\n}  // namespace vulkan\n}  // namespace gpu\n}  // namespace xe\n\n#endif  // XENIA_GPU_VULKAN_VULKAN_SHADER_H_\n"
  },
  {
    "path": "src/xenia/gpu/vulkan/vulkan_shared_memory.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/vulkan/vulkan_shared_memory.h\"\n\n#include <algorithm>\n#include <cstring>\n#include <utility>\n#include <vector>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/cvar.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/gpu/vulkan/deferred_command_buffer.h\"\n#include \"xenia/gpu/vulkan/vulkan_command_processor.h\"\n#include \"xenia/ui/vulkan/vulkan_util.h\"\n\nDEFINE_bool(vulkan_sparse_shared_memory, true,\n            \"Enable sparse binding for shared memory emulation. Disabling it \"\n            \"increases video memory usage - a 512 MB buffer is created - but \"\n            \"allows graphics debuggers that don't support sparse binding to \"\n            \"work.\",\n            \"Vulkan\");\n\nnamespace xe {\nnamespace gpu {\nnamespace vulkan {\n\nVulkanSharedMemory::VulkanSharedMemory(\n    VulkanCommandProcessor& command_processor, Memory& memory,\n    TraceWriter& trace_writer,\n    VkPipelineStageFlags guest_shader_pipeline_stages)\n    : SharedMemory(memory),\n      command_processor_(command_processor),\n      trace_writer_(trace_writer),\n      guest_shader_pipeline_stages_(guest_shader_pipeline_stages) {}\n\nVulkanSharedMemory::~VulkanSharedMemory() { Shutdown(true); }\n\nbool VulkanSharedMemory::Initialize() {\n  InitializeCommon();\n\n  const ui::vulkan::VulkanDevice* const vulkan_device =\n      command_processor_.GetVulkanDevice();\n  const ui::vulkan::VulkanDevice::Functions& dfn = vulkan_device->functions();\n  const VkDevice device = vulkan_device->device();\n\n  const VkBufferCreateFlags sparse_flags =\n      VK_BUFFER_CREATE_SPARSE_BINDING_BIT |\n      VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT;\n\n  // Try to create a sparse buffer.\n  VkBufferCreateInfo buffer_create_info;\n  buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;\n  buffer_create_info.pNext = nullptr;\n  buffer_create_info.flags = sparse_flags;\n  buffer_create_info.size = kBufferSize;\n  buffer_create_info.usage =\n      VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |\n      VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT;\n  buffer_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;\n  buffer_create_info.queueFamilyIndexCount = 0;\n  buffer_create_info.pQueueFamilyIndices = nullptr;\n  if (cvars::vulkan_sparse_shared_memory &&\n      vulkan_device->properties().sparseResidencyBuffer) {\n    if (dfn.vkCreateBuffer(device, &buffer_create_info, nullptr, &buffer_) ==\n        VK_SUCCESS) {\n      VkMemoryRequirements buffer_memory_requirements;\n      dfn.vkGetBufferMemoryRequirements(device, buffer_,\n                                        &buffer_memory_requirements);\n      if (xe::bit_scan_forward(buffer_memory_requirements.memoryTypeBits &\n                                   vulkan_device->memory_types().device_local,\n                               &buffer_memory_type_)) {\n        uint32_t allocation_size_log2;\n        xe::bit_scan_forward(\n            std::max(uint64_t(buffer_memory_requirements.alignment),\n                     uint64_t(1)),\n            &allocation_size_log2);\n        if (allocation_size_log2 < kBufferSizeLog2) {\n          // Maximum of 1024 allocations in the worst case for all of the\n          // buffer because of the overall 4096 allocation count limit on\n          // Windows drivers.\n          InitializeSparseHostGpuMemory(\n              std::max(allocation_size_log2,\n                       std::max(kHostGpuMemoryOptimalSparseAllocationLog2,\n                                kBufferSizeLog2 - uint32_t(10))));\n        } else {\n          // Shouldn't happen on any real platform, but no point allocating the\n          // buffer sparsely.\n          dfn.vkDestroyBuffer(device, buffer_, nullptr);\n          buffer_ = VK_NULL_HANDLE;\n        }\n      } else {\n        XELOGE(\n            \"Shared memory: Failed to get a device-local Vulkan memory type \"\n            \"for the sparse buffer\");\n        dfn.vkDestroyBuffer(device, buffer_, nullptr);\n        buffer_ = VK_NULL_HANDLE;\n      }\n    } else {\n      XELOGE(\"Shared memory: Failed to create the {} MB Vulkan sparse buffer\",\n             kBufferSize >> 20);\n    }\n  }\n\n  // Create a non-sparse buffer if there were issues with the sparse buffer.\n  if (buffer_ == VK_NULL_HANDLE) {\n    XELOGGPU(\n        \"Vulkan sparse binding is not used for shared memory emulation - video \"\n        \"memory usage may increase significantly because a full {} MB buffer \"\n        \"will be created\",\n        kBufferSize >> 20);\n    buffer_create_info.flags &= ~sparse_flags;\n    if (dfn.vkCreateBuffer(device, &buffer_create_info, nullptr, &buffer_) !=\n        VK_SUCCESS) {\n      XELOGE(\"Shared memory: Failed to create the {} MB Vulkan buffer\",\n             kBufferSize >> 20);\n      Shutdown();\n      return false;\n    }\n    VkMemoryRequirements buffer_memory_requirements;\n    dfn.vkGetBufferMemoryRequirements(device, buffer_,\n                                      &buffer_memory_requirements);\n    if (!xe::bit_scan_forward(buffer_memory_requirements.memoryTypeBits &\n                                  vulkan_device->memory_types().device_local,\n                              &buffer_memory_type_)) {\n      XELOGE(\n          \"Shared memory: Failed to get a device-local Vulkan memory type for \"\n          \"the buffer\");\n      Shutdown();\n      return false;\n    }\n    VkMemoryAllocateInfo buffer_memory_allocate_info;\n    VkMemoryAllocateInfo* buffer_memory_allocate_info_last =\n        &buffer_memory_allocate_info;\n    buffer_memory_allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;\n    buffer_memory_allocate_info.pNext = nullptr;\n    buffer_memory_allocate_info.allocationSize =\n        buffer_memory_requirements.size;\n    buffer_memory_allocate_info.memoryTypeIndex = buffer_memory_type_;\n    VkMemoryDedicatedAllocateInfo buffer_memory_dedicated_allocate_info;\n    if (vulkan_device->extensions().ext_1_1_KHR_dedicated_allocation) {\n      buffer_memory_allocate_info_last->pNext =\n          &buffer_memory_dedicated_allocate_info;\n      buffer_memory_allocate_info_last =\n          reinterpret_cast<VkMemoryAllocateInfo*>(\n              &buffer_memory_dedicated_allocate_info);\n      buffer_memory_dedicated_allocate_info.sType =\n          VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO;\n      buffer_memory_dedicated_allocate_info.pNext = nullptr;\n      buffer_memory_dedicated_allocate_info.image = VK_NULL_HANDLE;\n      buffer_memory_dedicated_allocate_info.buffer = buffer_;\n    }\n    VkDeviceMemory buffer_memory;\n    if (dfn.vkAllocateMemory(device, &buffer_memory_allocate_info, nullptr,\n                             &buffer_memory) != VK_SUCCESS) {\n      XELOGE(\n          \"Shared memory: Failed to allocate {} MB of memory for the Vulkan \"\n          \"buffer\",\n          kBufferSize >> 20);\n      Shutdown();\n      return false;\n    }\n    buffer_memory_.push_back(buffer_memory);\n    if (dfn.vkBindBufferMemory(device, buffer_, buffer_memory, 0) !=\n        VK_SUCCESS) {\n      XELOGE(\"Shared memory: Failed to bind memory to the Vulkan buffer\");\n      Shutdown();\n      return false;\n    }\n  }\n\n  // The first usage will likely be uploading.\n  last_usage_ = Usage::kTransferDestination;\n  last_written_range_ = std::make_pair<uint32_t, uint32_t>(0, 0);\n\n  upload_buffer_pool_ = std::make_unique<ui::vulkan::VulkanUploadBufferPool>(\n      vulkan_device, VK_BUFFER_USAGE_TRANSFER_SRC_BIT,\n      xe::align(ui::vulkan::VulkanUploadBufferPool::kDefaultPageSize,\n                size_t(1) << page_size_log2()));\n\n  return true;\n}\n\nvoid VulkanSharedMemory::Shutdown(bool from_destructor) {\n  ResetTraceDownload();\n\n  upload_buffer_pool_.reset();\n\n  const ui::vulkan::VulkanDevice* const vulkan_device =\n      command_processor_.GetVulkanDevice();\n  const ui::vulkan::VulkanDevice::Functions& dfn = vulkan_device->functions();\n  const VkDevice device = vulkan_device->device();\n\n  ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyBuffer, device, buffer_);\n  for (VkDeviceMemory memory : buffer_memory_) {\n    dfn.vkFreeMemory(device, memory, nullptr);\n  }\n  buffer_memory_.clear();\n\n  // If calling from the destructor, the SharedMemory destructor will call\n  // ShutdownCommon.\n  if (!from_destructor) {\n    ShutdownCommon();\n  }\n}\n\nvoid VulkanSharedMemory::CompletedSubmissionUpdated() {\n  upload_buffer_pool_->Reclaim(command_processor_.GetCompletedSubmission());\n}\n\nvoid VulkanSharedMemory::EndSubmission() { upload_buffer_pool_->FlushWrites(); }\n\nvoid VulkanSharedMemory::Use(Usage usage,\n                             std::pair<uint32_t, uint32_t> written_range) {\n  written_range.first = std::min(written_range.first, kBufferSize);\n  written_range.second =\n      std::min(written_range.second, kBufferSize - written_range.first);\n  assert_true(usage != Usage::kRead || !written_range.second);\n  if (last_usage_ != usage || last_written_range_.second) {\n    VkPipelineStageFlags src_stage_mask, dst_stage_mask;\n    VkAccessFlags src_access_mask, dst_access_mask;\n    GetUsageMasks(last_usage_, src_stage_mask, src_access_mask);\n    GetUsageMasks(usage, dst_stage_mask, dst_access_mask);\n    VkDeviceSize offset, size;\n    if (last_usage_ == usage) {\n      // Committing the previous write, while not changing the access mask\n      // (passing false as whether to skip the barrier if no masks are changed\n      // for this reason).\n      offset = VkDeviceSize(last_written_range_.first);\n      size = VkDeviceSize(last_written_range_.second);\n    } else {\n      // Changing the stage and access mask - all preceding writes must be\n      // available not only to the source stage, but to the destination as well.\n      offset = 0;\n      size = VK_WHOLE_SIZE;\n      last_usage_ = usage;\n    }\n    command_processor_.PushBufferMemoryBarrier(\n        buffer_, offset, size, src_stage_mask, dst_stage_mask, src_access_mask,\n        dst_access_mask, VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED,\n        false);\n  }\n  last_written_range_ = written_range;\n}\n\nbool VulkanSharedMemory::InitializeTraceSubmitDownloads() {\n  ResetTraceDownload();\n  PrepareForTraceDownload();\n  uint32_t download_page_count = trace_download_page_count();\n  if (!download_page_count) {\n    return false;\n  }\n\n  if (!ui::vulkan::util::CreateDedicatedAllocationBuffer(\n          command_processor_.GetVulkanDevice(),\n          download_page_count << page_size_log2(),\n          VK_BUFFER_USAGE_TRANSFER_DST_BIT,\n          ui::vulkan::util::MemoryPurpose::kReadback, trace_download_buffer_,\n          trace_download_buffer_memory_)) {\n    XELOGE(\n        \"Shared memory: Failed to create a {} KB GPU-written memory download \"\n        \"buffer for frame tracing\",\n        download_page_count << page_size_log2() >> 10);\n    ResetTraceDownload();\n    return false;\n  }\n\n  Use(Usage::kRead);\n  command_processor_.SubmitBarriers(true);\n  DeferredCommandBuffer& command_buffer =\n      command_processor_.deferred_command_buffer();\n\n  size_t download_range_count = trace_download_ranges().size();\n  VkBufferCopy* download_regions = command_buffer.CmdCopyBufferEmplace(\n      buffer_, trace_download_buffer_, uint32_t(download_range_count));\n  VkDeviceSize download_buffer_offset = 0;\n  for (size_t i = 0; i < download_range_count; ++i) {\n    VkBufferCopy& download_region = download_regions[i];\n    const std::pair<uint32_t, uint32_t>& download_range =\n        trace_download_ranges()[i];\n    download_region.srcOffset = download_range.first;\n    download_region.dstOffset = download_buffer_offset;\n    download_region.size = download_range.second;\n    download_buffer_offset += download_range.second;\n  }\n\n  command_processor_.PushBufferMemoryBarrier(\n      trace_download_buffer_, 0, VK_WHOLE_SIZE, VK_PIPELINE_STAGE_TRANSFER_BIT,\n      VK_PIPELINE_STAGE_HOST_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,\n      VK_ACCESS_HOST_READ_BIT);\n\n  return true;\n}\n\nvoid VulkanSharedMemory::InitializeTraceCompleteDownloads() {\n  if (!trace_download_buffer_memory_) {\n    return;\n  }\n  const ui::vulkan::VulkanDevice* const vulkan_device =\n      command_processor_.GetVulkanDevice();\n  const ui::vulkan::VulkanDevice::Functions& dfn = vulkan_device->functions();\n  const VkDevice device = vulkan_device->device();\n  void* download_mapping;\n  if (dfn.vkMapMemory(device, trace_download_buffer_memory_, 0, VK_WHOLE_SIZE,\n                      0, &download_mapping) == VK_SUCCESS) {\n    uint32_t download_buffer_offset = 0;\n    for (const auto& download_range : trace_download_ranges()) {\n      trace_writer_.WriteMemoryRead(\n          download_range.first, download_range.second,\n          reinterpret_cast<const uint8_t*>(download_mapping) +\n              download_buffer_offset);\n    }\n    dfn.vkUnmapMemory(device, trace_download_buffer_memory_);\n  } else {\n    XELOGE(\n        \"Shared memory: Failed to map the GPU-written memory download buffer \"\n        \"for frame tracing\");\n  }\n  ResetTraceDownload();\n}\n\nbool VulkanSharedMemory::AllocateSparseHostGpuMemoryRange(\n    uint32_t offset_allocations, uint32_t length_allocations) {\n  if (!length_allocations) {\n    return true;\n  }\n\n  const ui::vulkan::VulkanDevice* const vulkan_device =\n      command_processor_.GetVulkanDevice();\n  const ui::vulkan::VulkanDevice::Functions& dfn = vulkan_device->functions();\n  const VkDevice device = vulkan_device->device();\n\n  VkMemoryAllocateInfo memory_allocate_info;\n  memory_allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;\n  memory_allocate_info.pNext = nullptr;\n  memory_allocate_info.allocationSize =\n      length_allocations << host_gpu_memory_sparse_granularity_log2();\n  memory_allocate_info.memoryTypeIndex = buffer_memory_type_;\n  VkDeviceMemory memory;\n  if (dfn.vkAllocateMemory(device, &memory_allocate_info, nullptr, &memory) !=\n      VK_SUCCESS) {\n    XELOGE(\"Shared memory: Failed to allocate sparse buffer memory\");\n    return false;\n  }\n  buffer_memory_.push_back(memory);\n\n  VkSparseMemoryBind bind;\n  bind.resourceOffset = offset_allocations\n                        << host_gpu_memory_sparse_granularity_log2();\n  bind.size = memory_allocate_info.allocationSize;\n  bind.memory = memory;\n  bind.memoryOffset = 0;\n  bind.flags = 0;\n  VkPipelineStageFlags bind_wait_stage_mask =\n      VK_PIPELINE_STAGE_VERTEX_INPUT_BIT | VK_PIPELINE_STAGE_VERTEX_SHADER_BIT |\n      VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |\n      VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | VK_PIPELINE_STAGE_TRANSFER_BIT;\n  if (vulkan_device->properties().tessellationShader) {\n    bind_wait_stage_mask |=\n        VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT;\n  }\n  command_processor_.SparseBindBuffer(buffer_, 1, &bind, bind_wait_stage_mask);\n\n  return true;\n}\n\nbool VulkanSharedMemory::UploadRanges(\n    const std::vector<std::pair<uint32_t, uint32_t>>& upload_page_ranges) {\n  if (upload_page_ranges.empty()) {\n    return true;\n  }\n  // upload_page_ranges are sorted, use them to determine the range for the\n  // ordering barrier.\n  Use(Usage::kTransferDestination,\n      std::make_pair(\n          upload_page_ranges.front().first << page_size_log2(),\n          (upload_page_ranges.back().first + upload_page_ranges.back().second -\n           upload_page_ranges.front().first)\n              << page_size_log2()));\n  command_processor_.SubmitBarriers(true);\n  DeferredCommandBuffer& command_buffer =\n      command_processor_.deferred_command_buffer();\n  uint64_t submission_current = command_processor_.GetCurrentSubmission();\n  bool successful = true;\n  upload_regions_.clear();\n  VkBuffer upload_buffer_previous = VK_NULL_HANDLE;\n  for (auto upload_range : upload_page_ranges) {\n    uint32_t upload_range_start = upload_range.first;\n    uint32_t upload_range_length = upload_range.second;\n    trace_writer_.WriteMemoryRead(upload_range_start << page_size_log2(),\n                                  upload_range_length << page_size_log2());\n    while (upload_range_length) {\n      VkBuffer upload_buffer;\n      VkDeviceSize upload_buffer_offset, upload_buffer_size;\n      uint8_t* upload_buffer_mapping = upload_buffer_pool_->RequestPartial(\n          submission_current, upload_range_length << page_size_log2(),\n          size_t(1) << page_size_log2(), upload_buffer, upload_buffer_offset,\n          upload_buffer_size);\n      if (upload_buffer_mapping == nullptr) {\n        XELOGE(\"Shared memory: Failed to get a Vulkan upload buffer\");\n        successful = false;\n        break;\n      }\n      MakeRangeValid(upload_range_start << page_size_log2(),\n                     uint32_t(upload_buffer_size), false);\n      std::memcpy(\n          upload_buffer_mapping,\n          memory().TranslatePhysical(upload_range_start << page_size_log2()),\n          upload_buffer_size);\n      if (upload_buffer_previous != upload_buffer && !upload_regions_.empty()) {\n        assert_true(upload_buffer_previous != VK_NULL_HANDLE);\n        command_buffer.CmdVkCopyBuffer(upload_buffer_previous, buffer_,\n                                       uint32_t(upload_regions_.size()),\n                                       upload_regions_.data());\n        upload_regions_.clear();\n      }\n      upload_buffer_previous = upload_buffer;\n      VkBufferCopy& upload_region = upload_regions_.emplace_back();\n      upload_region.srcOffset = upload_buffer_offset;\n      upload_region.dstOffset =\n          VkDeviceSize(upload_range_start << page_size_log2());\n      upload_region.size = upload_buffer_size;\n      uint32_t upload_buffer_pages =\n          uint32_t(upload_buffer_size >> page_size_log2());\n      upload_range_start += upload_buffer_pages;\n      upload_range_length -= upload_buffer_pages;\n    }\n    if (!successful) {\n      break;\n    }\n  }\n  if (!upload_regions_.empty()) {\n    assert_true(upload_buffer_previous != VK_NULL_HANDLE);\n    command_buffer.CmdVkCopyBuffer(upload_buffer_previous, buffer_,\n                                   uint32_t(upload_regions_.size()),\n                                   upload_regions_.data());\n    upload_regions_.clear();\n  }\n  return successful;\n}\n\nvoid VulkanSharedMemory::GetUsageMasks(Usage usage,\n                                       VkPipelineStageFlags& stage_mask,\n                                       VkAccessFlags& access_mask) const {\n  switch (usage) {\n    case Usage::kComputeWrite:\n      stage_mask = VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT;\n      access_mask = VK_ACCESS_SHADER_READ_BIT;\n      return;\n    case Usage::kTransferDestination:\n      stage_mask = VK_PIPELINE_STAGE_TRANSFER_BIT;\n      access_mask = VK_ACCESS_TRANSFER_WRITE_BIT;\n      return;\n    default:\n      break;\n  }\n  stage_mask =\n      VK_PIPELINE_STAGE_VERTEX_INPUT_BIT | guest_shader_pipeline_stages_;\n  access_mask = VK_ACCESS_INDEX_READ_BIT | VK_ACCESS_SHADER_READ_BIT;\n  switch (usage) {\n    case Usage::kRead:\n      stage_mask |=\n          VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | VK_PIPELINE_STAGE_TRANSFER_BIT;\n      access_mask |= VK_ACCESS_TRANSFER_READ_BIT;\n      break;\n    case Usage::kGuestDrawReadWrite:\n      access_mask |= VK_ACCESS_SHADER_WRITE_BIT;\n      break;\n    default:\n      assert_unhandled_case(usage);\n  }\n}\n\nvoid VulkanSharedMemory::ResetTraceDownload() {\n  const ui::vulkan::VulkanDevice* const vulkan_device =\n      command_processor_.GetVulkanDevice();\n  const ui::vulkan::VulkanDevice::Functions& dfn = vulkan_device->functions();\n  const VkDevice device = vulkan_device->device();\n  ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyBuffer, device,\n                                         trace_download_buffer_);\n  ui::vulkan::util::DestroyAndNullHandle(dfn.vkFreeMemory, device,\n                                         trace_download_buffer_memory_);\n  ReleaseTraceDownloadRanges();\n}\n\n}  // namespace vulkan\n}  // namespace gpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/vulkan/vulkan_shared_memory.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_VULKAN_VULKAN_SHARED_MEMORY_H_\n#define XENIA_GPU_VULKAN_VULKAN_SHARED_MEMORY_H_\n\n#include <algorithm>\n#include <memory>\n#include <utility>\n#include <vector>\n\n#include \"xenia/gpu/shared_memory.h\"\n#include \"xenia/gpu/trace_writer.h\"\n#include \"xenia/memory.h\"\n#include \"xenia/ui/vulkan/vulkan_upload_buffer_pool.h\"\n\nnamespace xe {\nnamespace gpu {\nnamespace vulkan {\n\nclass VulkanCommandProcessor;\n\nclass VulkanSharedMemory : public SharedMemory {\n public:\n  VulkanSharedMemory(VulkanCommandProcessor& command_processor, Memory& memory,\n                     TraceWriter& trace_writer,\n                     VkPipelineStageFlags guest_shader_pipeline_stages);\n  ~VulkanSharedMemory() override;\n\n  bool Initialize();\n  void Shutdown(bool from_destructor = false);\n\n  void CompletedSubmissionUpdated();\n  void EndSubmission();\n\n  enum class Usage {\n    // Index buffer, vfetch, compute read, transfer source.\n    kRead,\n    // Index buffer, vfetch, memexport.\n    kGuestDrawReadWrite,\n    kComputeWrite,\n    kTransferDestination,\n  };\n  // Inserts a pipeline barrier for the target usage, also ensuring consecutive\n  // read-write accesses are ordered with each other.\n  void Use(Usage usage, std::pair<uint32_t, uint32_t> written_range = {});\n\n  VkBuffer buffer() const { return buffer_; }\n\n  // Returns true if any downloads were submitted to the command processor.\n  bool InitializeTraceSubmitDownloads();\n  void InitializeTraceCompleteDownloads();\n\n protected:\n  bool AllocateSparseHostGpuMemoryRange(uint32_t offset_allocations,\n                                        uint32_t length_allocations) override;\n\n  bool UploadRanges(const std::vector<std::pair<uint32_t, uint32_t>>&\n                        upload_page_ranges) override;\n\n private:\n  void GetUsageMasks(Usage usage, VkPipelineStageFlags& stage_mask,\n                     VkAccessFlags& access_mask) const;\n\n  VulkanCommandProcessor& command_processor_;\n  TraceWriter& trace_writer_;\n  VkPipelineStageFlags guest_shader_pipeline_stages_;\n\n  VkBuffer buffer_ = VK_NULL_HANDLE;\n  uint32_t buffer_memory_type_;\n  // Single for non-sparse, every allocation so far for sparse.\n  std::vector<VkDeviceMemory> buffer_memory_;\n\n  Usage last_usage_;\n  std::pair<uint32_t, uint32_t> last_written_range_;\n\n  std::unique_ptr<ui::vulkan::VulkanUploadBufferPool> upload_buffer_pool_;\n  std::vector<VkBufferCopy> upload_regions_;\n\n  // Created temporarily, only for downloading.\n  VkBuffer trace_download_buffer_ = VK_NULL_HANDLE;\n  VkDeviceMemory trace_download_buffer_memory_ = VK_NULL_HANDLE;\n  void ResetTraceDownload();\n};\n\n}  // namespace vulkan\n}  // namespace gpu\n}  // namespace xe\n\n#endif  // XENIA_GPU_VULKAN_VULKAN_SHARED_MEMORY_H_\n"
  },
  {
    "path": "src/xenia/gpu/vulkan/vulkan_texture_cache.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/vulkan/vulkan_texture_cache.h\"\n\n#include <algorithm>\n#include <array>\n#include <cstddef>\n#include <utility>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/profiling.h\"\n#include \"xenia/gpu/gpu_flags.h\"\n#include \"xenia/gpu/texture_info.h\"\n#include \"xenia/gpu/texture_util.h\"\n#include \"xenia/gpu/vulkan/deferred_command_buffer.h\"\n#include \"xenia/gpu/vulkan/vulkan_command_processor.h\"\n#include \"xenia/ui/vulkan/ui_samplers.h\"\n#include \"xenia/ui/vulkan/vulkan_mem_alloc.h\"\n#include \"xenia/ui/vulkan/vulkan_util.h\"\n\nnamespace xe {\nnamespace gpu {\nnamespace vulkan {\n\n// Generated with `xb buildshaders`.\nnamespace shaders {\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_128bpb_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_128bpb_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_16bpb_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_16bpb_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_32bpb_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_32bpb_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_64bpb_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_64bpb_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_8bpb_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_8bpb_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_bgrg8_rgb8_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_ctx1_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_depth_float_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_depth_float_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_depth_unorm_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_depth_unorm_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_dxn_rg8_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_dxt1_rgba8_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_dxt3_rgba8_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_dxt3a_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_dxt3aas1111_argb4_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_dxt5_rgba8_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_dxt5a_r8_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_gbgr8_rgb8_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_r10g11b11_rgba16_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_r10g11b11_rgba16_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_r10g11b11_rgba16_snorm_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_r10g11b11_rgba16_snorm_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_r11g11b10_rgba16_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_r11g11b10_rgba16_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_r11g11b10_rgba16_snorm_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_r11g11b10_rgba16_snorm_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_r16_snorm_float_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_r16_snorm_float_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_r16_unorm_float_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_r16_unorm_float_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_r4g4b4a4_a4r4g4b4_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_r4g4b4a4_a4r4g4b4_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_r5g5b5a1_b5g5r5a1_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_r5g5b5a1_b5g5r5a1_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_r5g5b6_b5g6r5_swizzle_rbga_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_r5g5b6_b5g6r5_swizzle_rbga_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_r5g6b5_b5g6r5_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_r5g6b5_b5g6r5_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_rg16_snorm_float_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_rg16_snorm_float_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_rg16_unorm_float_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_rg16_unorm_float_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_rgba16_snorm_float_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_rgba16_snorm_float_scaled_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_rgba16_unorm_float_cs.h\"\n#include \"xenia/gpu/shaders/bytecode/vulkan_spirv/texture_load_rgba16_unorm_float_scaled_cs.h\"\n}  // namespace shaders\n\nstatic_assert(VK_FORMAT_UNDEFINED == VkFormat(0),\n              \"Assuming that skipping a VkFormat in an initializer results in \"\n              \"VK_FORMAT_UNDEFINED\");\nconst VulkanTextureCache::HostFormatPair\n    VulkanTextureCache::kBestHostFormats[64] = {\n        // k_1_REVERSE\n        {{kLoadShaderIndexUnknown},\n         {kLoadShaderIndexUnknown},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RRRR},\n        // k_1\n        {{kLoadShaderIndexUnknown},\n         {kLoadShaderIndexUnknown},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RRRR},\n        // k_8\n        {{kLoadShaderIndex8bpb, VK_FORMAT_R8_UNORM},\n         {kLoadShaderIndex8bpb, VK_FORMAT_R8_SNORM},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RRRR,\n         true},\n        // k_1_5_5_5\n        // Red and blue swapped in the load shader for simplicity.\n        {{kLoadShaderIndexR5G5B5A1ToB5G5R5A1, VK_FORMAT_A1R5G5B5_UNORM_PACK16},\n         {kLoadShaderIndexUnknown},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RGBA},\n        // k_5_6_5\n        // Red and blue swapped in the load shader for simplicity.\n        {{kLoadShaderIndexR5G6B5ToB5G6R5, VK_FORMAT_R5G6B5_UNORM_PACK16},\n         {kLoadShaderIndexUnknown},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RGBB},\n        // k_6_5_5\n        // On the host, green bits in blue, blue bits in green.\n        {{kLoadShaderIndexR5G5B6ToB5G6R5WithRBGASwizzle,\n          VK_FORMAT_R5G6B5_UNORM_PACK16},\n         {kLoadShaderIndexUnknown},\n         XE_GPU_MAKE_TEXTURE_SWIZZLE(R, B, G, G)},\n        // k_8_8_8_8\n        {{kLoadShaderIndex32bpb, VK_FORMAT_R8G8B8A8_UNORM},\n         {kLoadShaderIndex32bpb, VK_FORMAT_R8G8B8A8_SNORM},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RGBA,\n         true},\n        // k_2_10_10_10\n        // VK_FORMAT_A2B10G10R10_SNORM_PACK32 is optional.\n        {{kLoadShaderIndex32bpb, VK_FORMAT_A2B10G10R10_UNORM_PACK32},\n         {kLoadShaderIndex32bpb, VK_FORMAT_A2B10G10R10_SNORM_PACK32},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RGBA,\n         true},\n        // k_8_A\n        {{kLoadShaderIndex8bpb, VK_FORMAT_R8_UNORM},\n         {kLoadShaderIndex8bpb, VK_FORMAT_R8_SNORM},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RRRR,\n         true},\n        // k_8_B\n        {{kLoadShaderIndexUnknown},\n         {kLoadShaderIndexUnknown},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RRRR},\n        // k_8_8\n        {{kLoadShaderIndex16bpb, VK_FORMAT_R8G8_UNORM},\n         {kLoadShaderIndex16bpb, VK_FORMAT_R8G8_SNORM},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RGGG,\n         true},\n        // k_Cr_Y1_Cb_Y0_REP\n        // VK_FORMAT_G8B8G8R8_422_UNORM (added in\n        // VK_KHR_sampler_ycbcr_conversion and promoted to Vulkan 1.1) is\n        // optional.\n        {{kLoadShaderIndex32bpb, VK_FORMAT_G8B8G8R8_422_UNORM, true},\n         {kLoadShaderIndexGBGR8ToRGB8, VK_FORMAT_R8G8B8A8_SNORM},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RGBB},\n        // k_Y1_Cr_Y0_Cb_REP\n        // VK_FORMAT_B8G8R8G8_422_UNORM (added in\n        // VK_KHR_sampler_ycbcr_conversion and promoted to Vulkan 1.1) is\n        // optional.\n        {{kLoadShaderIndex32bpb, VK_FORMAT_B8G8R8G8_422_UNORM, true},\n         {kLoadShaderIndexBGRG8ToRGB8, VK_FORMAT_R8G8B8A8_SNORM},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RGBB},\n        // k_16_16_EDRAM\n        // Not usable as a texture, also has -32...32 range.\n        {{kLoadShaderIndexUnknown},\n         {kLoadShaderIndexUnknown},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RGGG},\n        // k_8_8_8_8_A\n        {{kLoadShaderIndexUnknown},\n         {kLoadShaderIndexUnknown},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RGBA},\n        // k_4_4_4_4\n        // Components swapped in the load shader for simplicity.\n        {{kLoadShaderIndexRGBA4ToARGB4, VK_FORMAT_B4G4R4A4_UNORM_PACK16},\n         {kLoadShaderIndexUnknown},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RGBA},\n        // k_10_11_11\n        // TODO(Triang3l): 16_UNORM/SNORM are optional, convert to float16\n        // instead.\n        {{kLoadShaderIndexR11G11B10ToRGBA16, VK_FORMAT_R16G16B16A16_UNORM},\n         {kLoadShaderIndexR11G11B10ToRGBA16SNorm, VK_FORMAT_R16G16B16A16_SNORM},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RGBB},\n        // k_11_11_10\n        // TODO(Triang3l): 16_UNORM/SNORM are optional, convert to float16\n        // instead.\n        {{kLoadShaderIndexR10G11B11ToRGBA16, VK_FORMAT_R16G16B16A16_UNORM},\n         {kLoadShaderIndexR10G11B11ToRGBA16SNorm, VK_FORMAT_R16G16B16A16_SNORM},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RGBB},\n        // k_DXT1\n        // VK_FORMAT_BC1_RGBA_UNORM_BLOCK is optional.\n        {{kLoadShaderIndex64bpb, VK_FORMAT_BC1_RGBA_UNORM_BLOCK, true},\n         {kLoadShaderIndexUnknown},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RGBA},\n        // k_DXT2_3\n        // VK_FORMAT_BC2_UNORM_BLOCK is optional.\n        {{kLoadShaderIndex128bpb, VK_FORMAT_BC2_UNORM_BLOCK, true},\n         {kLoadShaderIndexUnknown},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RGBA},\n        // k_DXT4_5\n        // VK_FORMAT_BC3_UNORM_BLOCK is optional.\n        {{kLoadShaderIndex128bpb, VK_FORMAT_BC3_UNORM_BLOCK, true},\n         {kLoadShaderIndexUnknown},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RGBA},\n        // k_16_16_16_16_EDRAM\n        // Not usable as a texture, also has -32...32 range.\n        {{kLoadShaderIndexUnknown},\n         {kLoadShaderIndexUnknown},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RGBA},\n        // k_24_8\n        {{kLoadShaderIndexDepthUnorm, VK_FORMAT_R32_SFLOAT},\n         {kLoadShaderIndexUnknown},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RRRR},\n        // k_24_8_FLOAT\n        {{kLoadShaderIndexDepthFloat, VK_FORMAT_R32_SFLOAT},\n         {kLoadShaderIndexUnknown},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RRRR},\n        // k_16\n        // VK_FORMAT_R16_UNORM and VK_FORMAT_R16_SNORM are optional.\n        {{kLoadShaderIndex16bpb, VK_FORMAT_R16_UNORM},\n         {kLoadShaderIndex16bpb, VK_FORMAT_R16_SNORM},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RRRR,\n         true},\n        // k_16_16\n        // VK_FORMAT_R16G16_UNORM and VK_FORMAT_R16G16_SNORM are optional.\n        {{kLoadShaderIndex32bpb, VK_FORMAT_R16G16_UNORM},\n         {kLoadShaderIndex32bpb, VK_FORMAT_R16G16_SNORM},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RGGG,\n         true},\n        // k_16_16_16_16\n        // VK_FORMAT_R16G16B16A16_UNORM and VK_FORMAT_R16G16B16A16_SNORM are\n        // optional.\n        {{kLoadShaderIndex64bpb, VK_FORMAT_R16G16B16A16_UNORM},\n         {kLoadShaderIndex64bpb, VK_FORMAT_R16G16B16A16_SNORM},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RGBA,\n         true},\n        // k_16_EXPAND\n        {{kLoadShaderIndex16bpb, VK_FORMAT_R16_SFLOAT},\n         {kLoadShaderIndex16bpb, VK_FORMAT_R16_SFLOAT},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RRRR,\n         true},\n        // k_16_16_EXPAND\n        {{kLoadShaderIndex32bpb, VK_FORMAT_R16G16_SFLOAT},\n         {kLoadShaderIndex32bpb, VK_FORMAT_R16G16_SFLOAT},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RGGG,\n         true},\n        // k_16_16_16_16_EXPAND\n        {{kLoadShaderIndex64bpb, VK_FORMAT_R16G16B16A16_SFLOAT},\n         {kLoadShaderIndex64bpb, VK_FORMAT_R16G16B16A16_SFLOAT},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RGBA,\n         true},\n        // k_16_FLOAT\n        {{kLoadShaderIndex16bpb, VK_FORMAT_R16_SFLOAT},\n         {kLoadShaderIndex16bpb, VK_FORMAT_R16_SFLOAT},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RRRR,\n         true},\n        // k_16_16_FLOAT\n        {{kLoadShaderIndex32bpb, VK_FORMAT_R16G16_SFLOAT},\n         {kLoadShaderIndex32bpb, VK_FORMAT_R16G16_SFLOAT},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RGGG,\n         true},\n        // k_16_16_16_16_FLOAT\n        {{kLoadShaderIndex64bpb, VK_FORMAT_R16G16B16A16_SFLOAT},\n         {kLoadShaderIndex64bpb, VK_FORMAT_R16G16B16A16_SFLOAT},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RGBA,\n         true},\n        // k_32\n        {{kLoadShaderIndexUnknown},\n         {kLoadShaderIndexUnknown},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RRRR},\n        // k_32_32\n        {{kLoadShaderIndexUnknown},\n         {kLoadShaderIndexUnknown},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RGGG},\n        // k_32_32_32_32\n        {{kLoadShaderIndexUnknown},\n         {kLoadShaderIndexUnknown},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RGBA},\n        // k_32_FLOAT\n        {{kLoadShaderIndex32bpb, VK_FORMAT_R32_SFLOAT},\n         {kLoadShaderIndex32bpb, VK_FORMAT_R32_SFLOAT},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RRRR,\n         true},\n        // k_32_32_FLOAT\n        {{kLoadShaderIndex64bpb, VK_FORMAT_R32G32_SFLOAT},\n         {kLoadShaderIndex64bpb, VK_FORMAT_R32G32_SFLOAT},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RGGG,\n         true},\n        // k_32_32_32_32_FLOAT\n        {{kLoadShaderIndex128bpb, VK_FORMAT_R32G32B32A32_SFLOAT},\n         {kLoadShaderIndex128bpb, VK_FORMAT_R32G32B32A32_SFLOAT},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RGBA,\n         true},\n        // k_32_AS_8\n        {{kLoadShaderIndexUnknown},\n         {kLoadShaderIndexUnknown},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RRRR},\n        // k_32_AS_8_8\n        {{kLoadShaderIndexUnknown},\n         {kLoadShaderIndexUnknown},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RGGG},\n        // k_16_MPEG\n        {{kLoadShaderIndexUnknown},\n         {kLoadShaderIndexUnknown},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RRRR},\n        // k_16_16_MPEG\n        {{kLoadShaderIndexUnknown},\n         {kLoadShaderIndexUnknown},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RGGG},\n        // k_8_INTERLACED\n        {{kLoadShaderIndexUnknown},\n         {kLoadShaderIndexUnknown},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RRRR},\n        // k_32_AS_8_INTERLACED\n        {{kLoadShaderIndexUnknown},\n         {kLoadShaderIndexUnknown},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RRRR},\n        // k_32_AS_8_8_INTERLACED\n        {{kLoadShaderIndexUnknown},\n         {kLoadShaderIndexUnknown},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RGGG},\n        // k_16_INTERLACED\n        {{kLoadShaderIndexUnknown},\n         {kLoadShaderIndexUnknown},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RRRR},\n        // k_16_MPEG_INTERLACED\n        {{kLoadShaderIndexUnknown},\n         {kLoadShaderIndexUnknown},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RRRR},\n        // k_16_16_MPEG_INTERLACED\n        {{kLoadShaderIndexUnknown},\n         {kLoadShaderIndexUnknown},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RGGG},\n        // k_DXN\n        // VK_FORMAT_BC5_UNORM_BLOCK is optional.\n        {{kLoadShaderIndex128bpb, VK_FORMAT_BC5_UNORM_BLOCK, true},\n         {kLoadShaderIndexUnknown},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RGGG},\n        // k_8_8_8_8_AS_16_16_16_16\n        {{kLoadShaderIndex32bpb, VK_FORMAT_R8G8B8A8_UNORM},\n         {kLoadShaderIndex32bpb, VK_FORMAT_R8G8B8A8_SNORM},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RGBA,\n         true},\n        // k_DXT1_AS_16_16_16_16\n        // VK_FORMAT_BC1_RGBA_UNORM_BLOCK is optional.\n        {{kLoadShaderIndex64bpb, VK_FORMAT_BC1_RGBA_UNORM_BLOCK, true},\n         {kLoadShaderIndexUnknown},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RGBA},\n        // k_DXT2_3_AS_16_16_16_16\n        // VK_FORMAT_BC2_UNORM_BLOCK is optional.\n        {{kLoadShaderIndex128bpb, VK_FORMAT_BC2_UNORM_BLOCK, true},\n         {kLoadShaderIndexUnknown},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RGBA},\n        // k_DXT4_5_AS_16_16_16_16\n        // VK_FORMAT_BC3_UNORM_BLOCK is optional.\n        {{kLoadShaderIndex128bpb, VK_FORMAT_BC3_UNORM_BLOCK, true},\n         {kLoadShaderIndexUnknown},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RGBA},\n        // k_2_10_10_10_AS_16_16_16_16\n        // VK_FORMAT_A2B10G10R10_SNORM_PACK32 is optional.\n        {{kLoadShaderIndex32bpb, VK_FORMAT_A2B10G10R10_UNORM_PACK32},\n         {kLoadShaderIndex32bpb, VK_FORMAT_A2B10G10R10_SNORM_PACK32},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RGBA,\n         true},\n        // k_10_11_11_AS_16_16_16_16\n        // TODO(Triang3l): 16_UNORM/SNORM are optional, convert to float16\n        // instead.\n        {{kLoadShaderIndexR11G11B10ToRGBA16, VK_FORMAT_R16G16B16A16_UNORM},\n         {kLoadShaderIndexR11G11B10ToRGBA16SNorm, VK_FORMAT_R16G16B16A16_SNORM},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RGBB},\n        // k_11_11_10_AS_16_16_16_16\n        // TODO(Triang3l): 16_UNORM/SNORM are optional, convert to float16\n        // instead.\n        {{kLoadShaderIndexR10G11B11ToRGBA16, VK_FORMAT_R16G16B16A16_UNORM},\n         {kLoadShaderIndexR10G11B11ToRGBA16SNorm, VK_FORMAT_R16G16B16A16_SNORM},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RGBB},\n        // k_32_32_32_FLOAT\n        {{kLoadShaderIndexUnknown},\n         {kLoadShaderIndexUnknown},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RGBB},\n        // k_DXT3A\n        {{kLoadShaderIndexDXT3A, VK_FORMAT_R8_UNORM},\n         {kLoadShaderIndexUnknown},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RRRR},\n        // k_DXT5A\n        // VK_FORMAT_BC4_UNORM_BLOCK is optional.\n        {{kLoadShaderIndex64bpb, VK_FORMAT_BC4_UNORM_BLOCK, true},\n         {kLoadShaderIndexUnknown},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RRRR},\n        // k_CTX1\n        {{kLoadShaderIndexCTX1, VK_FORMAT_R8G8_UNORM},\n         {kLoadShaderIndexUnknown},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RGGG},\n        // k_DXT3A_AS_1_1_1_1\n        {{kLoadShaderIndexDXT3AAs1111ToARGB4, VK_FORMAT_B4G4R4A4_UNORM_PACK16},\n         {kLoadShaderIndexUnknown},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RGBA},\n        // k_8_8_8_8_GAMMA_EDRAM\n        // Not usable as a texture.\n        {{kLoadShaderIndexUnknown},\n         {kLoadShaderIndexUnknown},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RGBA},\n        // k_2_10_10_10_FLOAT_EDRAM\n        // Not usable as a texture.\n        {{kLoadShaderIndexUnknown},\n         {kLoadShaderIndexUnknown},\n         xenos::XE_GPU_TEXTURE_SWIZZLE_RGBA},\n};\n\n// Vulkan requires 2x1 (4:2:2) subsampled images to have an even width.\n// Always decompressing them to RGBA8, which is required to be linear-filterable\n// as UNORM and SNORM.\n\nconst VulkanTextureCache::HostFormatPair\n    VulkanTextureCache::kHostFormatGBGRUnaligned = {\n        {kLoadShaderIndexGBGR8ToRGB8, VK_FORMAT_R8G8B8A8_UNORM, false, true},\n        {kLoadShaderIndexGBGR8ToRGB8, VK_FORMAT_R8G8B8A8_SNORM, false, true},\n        xenos::XE_GPU_TEXTURE_SWIZZLE_RGBB,\n        true};\n\nconst VulkanTextureCache::HostFormatPair\n    VulkanTextureCache::kHostFormatBGRGUnaligned = {\n        {kLoadShaderIndexBGRG8ToRGB8, VK_FORMAT_R8G8B8A8_UNORM, false, true},\n        {kLoadShaderIndexBGRG8ToRGB8, VK_FORMAT_R8G8B8A8_SNORM, false, true},\n        xenos::XE_GPU_TEXTURE_SWIZZLE_RGBB,\n        true};\n\nVulkanTextureCache::~VulkanTextureCache() {\n  const ui::vulkan::VulkanDevice* const vulkan_device =\n      command_processor_.GetVulkanDevice();\n  const ui::vulkan::VulkanDevice::Functions& dfn = vulkan_device->functions();\n  const VkDevice device = vulkan_device->device();\n\n  for (const std::pair<const SamplerParameters, Sampler>& sampler_pair :\n       samplers_) {\n    dfn.vkDestroySampler(device, sampler_pair.second.sampler, nullptr);\n  }\n  samplers_.clear();\n  COUNT_profile_set(\"gpu/texture_cache/vulkan/samplers\", 0);\n  sampler_used_last_ = nullptr;\n  sampler_used_first_ = nullptr;\n\n  if (null_image_view_3d_ != VK_NULL_HANDLE) {\n    dfn.vkDestroyImageView(device, null_image_view_3d_, nullptr);\n  }\n  if (null_image_view_cube_ != VK_NULL_HANDLE) {\n    dfn.vkDestroyImageView(device, null_image_view_cube_, nullptr);\n  }\n  if (null_image_view_2d_array_ != VK_NULL_HANDLE) {\n    dfn.vkDestroyImageView(device, null_image_view_2d_array_, nullptr);\n  }\n  if (null_image_3d_ != VK_NULL_HANDLE) {\n    dfn.vkDestroyImage(device, null_image_3d_, nullptr);\n  }\n  if (null_image_2d_array_cube_ != VK_NULL_HANDLE) {\n    dfn.vkDestroyImage(device, null_image_2d_array_cube_, nullptr);\n  }\n  for (VkDeviceMemory null_images_memory : null_images_memory_) {\n    if (null_images_memory != VK_NULL_HANDLE) {\n      dfn.vkFreeMemory(device, null_images_memory, nullptr);\n    }\n  }\n  for (VkPipeline load_pipeline : load_pipelines_scaled_) {\n    if (load_pipeline != VK_NULL_HANDLE) {\n      dfn.vkDestroyPipeline(device, load_pipeline, nullptr);\n    }\n  }\n  for (VkPipeline load_pipeline : load_pipelines_) {\n    if (load_pipeline != VK_NULL_HANDLE) {\n      dfn.vkDestroyPipeline(device, load_pipeline, nullptr);\n    }\n  }\n  if (load_pipeline_layout_ != VK_NULL_HANDLE) {\n    dfn.vkDestroyPipelineLayout(device, load_pipeline_layout_, nullptr);\n  }\n\n  // Textures memory is allocated using the Vulkan Memory Allocator, destroy all\n  // textures before destroying VMA.\n  DestroyAllTextures(true);\n\n  if (vma_allocator_ != VK_NULL_HANDLE) {\n    vmaDestroyAllocator(vma_allocator_);\n  }\n}\n\nvoid VulkanTextureCache::BeginSubmission(uint64_t new_submission_index) {\n  TextureCache::BeginSubmission(new_submission_index);\n\n  if (!null_images_cleared_) {\n    VkImage null_images[] = {null_image_2d_array_cube_, null_image_3d_};\n    VkImageSubresourceRange null_image_subresource_range(\n        ui::vulkan::util::InitializeSubresourceRange());\n    for (size_t i = 0; i < xe::countof(null_images); ++i) {\n      command_processor_.PushImageMemoryBarrier(\n          null_images[i], null_image_subresource_range, 0,\n          VK_PIPELINE_STAGE_TRANSFER_BIT, 0, VK_ACCESS_TRANSFER_WRITE_BIT,\n          VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,\n          VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED, false);\n    }\n    command_processor_.SubmitBarriers(true);\n    DeferredCommandBuffer& command_buffer =\n        command_processor_.deferred_command_buffer();\n    // TODO(Triang3l): Find the return value for invalid texture fetch constants\n    // on the real hardware.\n    VkClearColorValue null_image_clear_color;\n    null_image_clear_color.float32[0] = 0.0f;\n    null_image_clear_color.float32[1] = 0.0f;\n    null_image_clear_color.float32[2] = 0.0f;\n    null_image_clear_color.float32[3] = 0.0f;\n    for (size_t i = 0; i < xe::countof(null_images); ++i) {\n      command_buffer.CmdVkClearColorImage(\n          null_images[i], VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,\n          &null_image_clear_color, 1, &null_image_subresource_range);\n    }\n    for (size_t i = 0; i < xe::countof(null_images); ++i) {\n      command_processor_.PushImageMemoryBarrier(\n          null_images[i], null_image_subresource_range,\n          VK_PIPELINE_STAGE_TRANSFER_BIT, guest_shader_pipeline_stages_,\n          VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_SHADER_READ_BIT,\n          VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,\n          VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_QUEUE_FAMILY_IGNORED,\n          VK_QUEUE_FAMILY_IGNORED, false);\n    }\n    null_images_cleared_ = true;\n  }\n}\n\nvoid VulkanTextureCache::RequestTextures(uint32_t used_texture_mask) {\n#if XE_GPU_FINE_GRAINED_DRAW_SCOPES\n  SCOPE_profile_cpu_f(\"gpu\");\n#endif  // XE_GPU_FINE_GRAINED_DRAW_SCOPES\n\n  TextureCache::RequestTextures(used_texture_mask);\n\n  // Transition the textures into the needed usage.\n  VkPipelineStageFlags dst_stage_mask;\n  VkAccessFlags dst_access_mask;\n  VkImageLayout new_layout;\n  GetTextureUsageMasks(VulkanTexture::Usage::kGuestShaderSampled,\n                       dst_stage_mask, dst_access_mask, new_layout);\n  uint32_t textures_remaining = used_texture_mask;\n  uint32_t index;\n  while (xe::bit_scan_forward(textures_remaining, &index)) {\n    textures_remaining &= ~(uint32_t(1) << index);\n    const TextureBinding* binding = GetValidTextureBinding(index);\n    if (!binding) {\n      continue;\n    }\n    VulkanTexture* binding_texture =\n        static_cast<VulkanTexture*>(binding->texture);\n    if (binding_texture != nullptr) {\n      // Will be referenced by the command buffer, so mark as used.\n      binding_texture->MarkAsUsed();\n      VulkanTexture::Usage old_usage =\n          binding_texture->SetUsage(VulkanTexture::Usage::kGuestShaderSampled);\n      if (old_usage != VulkanTexture::Usage::kGuestShaderSampled) {\n        VkPipelineStageFlags src_stage_mask;\n        VkAccessFlags src_access_mask;\n        VkImageLayout old_layout;\n        GetTextureUsageMasks(old_usage, src_stage_mask, src_access_mask,\n                             old_layout);\n        command_processor_.PushImageMemoryBarrier(\n            binding_texture->image(),\n            ui::vulkan::util::InitializeSubresourceRange(), src_stage_mask,\n            dst_stage_mask, src_access_mask, dst_access_mask, old_layout,\n            new_layout);\n      }\n    }\n    VulkanTexture* binding_texture_signed =\n        static_cast<VulkanTexture*>(binding->texture_signed);\n    if (binding_texture_signed != nullptr) {\n      binding_texture_signed->MarkAsUsed();\n      VulkanTexture::Usage old_usage = binding_texture_signed->SetUsage(\n          VulkanTexture::Usage::kGuestShaderSampled);\n      if (old_usage != VulkanTexture::Usage::kGuestShaderSampled) {\n        VkPipelineStageFlags src_stage_mask;\n        VkAccessFlags src_access_mask;\n        VkImageLayout old_layout;\n        GetTextureUsageMasks(old_usage, src_stage_mask, src_access_mask,\n                             old_layout);\n        command_processor_.PushImageMemoryBarrier(\n            binding_texture_signed->image(),\n            ui::vulkan::util::InitializeSubresourceRange(), src_stage_mask,\n            dst_stage_mask, src_access_mask, dst_access_mask, old_layout,\n            new_layout);\n      }\n    }\n  }\n}\n\nVkImageView VulkanTextureCache::GetActiveBindingOrNullImageView(\n    uint32_t fetch_constant_index, xenos::FetchOpDimension dimension,\n    bool is_signed) const {\n  VkImageView image_view = VK_NULL_HANDLE;\n  const TextureBinding* binding = GetValidTextureBinding(fetch_constant_index);\n  if (binding && AreDimensionsCompatible(dimension, binding->key.dimension)) {\n    const VulkanTextureBinding& vulkan_binding =\n        vulkan_texture_bindings_[fetch_constant_index];\n    image_view = is_signed ? vulkan_binding.image_view_signed\n                           : vulkan_binding.image_view_unsigned;\n  }\n  if (image_view != VK_NULL_HANDLE) {\n    return image_view;\n  }\n  switch (dimension) {\n    case xenos::FetchOpDimension::k3DOrStacked:\n      return null_image_view_3d_;\n    case xenos::FetchOpDimension::kCube:\n      return null_image_view_cube_;\n    default:\n      return null_image_view_2d_array_;\n  }\n}\n\nVulkanTextureCache::SamplerParameters VulkanTextureCache::GetSamplerParameters(\n    const VulkanShader::SamplerBinding& binding) const {\n  const auto& regs = register_file();\n  xenos::xe_gpu_texture_fetch_t fetch =\n      regs.GetTextureFetch(binding.fetch_constant);\n\n  SamplerParameters parameters;\n\n  xenos::ClampMode fetch_clamp_x, fetch_clamp_y, fetch_clamp_z;\n  texture_util::GetClampModesForDimension(fetch, fetch_clamp_x, fetch_clamp_y,\n                                          fetch_clamp_z);\n  parameters.clamp_x = NormalizeClampMode(fetch_clamp_x);\n  parameters.clamp_y = NormalizeClampMode(fetch_clamp_y);\n  parameters.clamp_z = NormalizeClampMode(fetch_clamp_z);\n  if (xenos::ClampModeUsesBorder(parameters.clamp_x) ||\n      xenos::ClampModeUsesBorder(parameters.clamp_y) ||\n      xenos::ClampModeUsesBorder(parameters.clamp_z)) {\n    parameters.border_color = fetch.border_color;\n  } else {\n    parameters.border_color = xenos::BorderColor::k_ABGR_Black;\n  }\n\n  xenos::TextureFilter mag_filter =\n      binding.mag_filter == xenos::TextureFilter::kUseFetchConst\n          ? fetch.mag_filter\n          : binding.mag_filter;\n  parameters.mag_linear = mag_filter == xenos::TextureFilter::kLinear;\n  xenos::TextureFilter min_filter =\n      binding.min_filter == xenos::TextureFilter::kUseFetchConst\n          ? fetch.min_filter\n          : binding.min_filter;\n  parameters.min_linear = min_filter == xenos::TextureFilter::kLinear;\n  xenos::TextureFilter mip_filter =\n      binding.mip_filter == xenos::TextureFilter::kUseFetchConst\n          ? fetch.mip_filter\n          : binding.mip_filter;\n  parameters.mip_linear = mip_filter == xenos::TextureFilter::kLinear;\n  if (parameters.mag_linear || parameters.min_linear || parameters.mip_linear) {\n    // Check if the texture is actually filterable on the host.\n    bool linear_filterable = true;\n    TextureKey texture_key;\n    uint8_t texture_swizzled_signs;\n    BindingInfoFromFetchConstant(fetch, texture_key, &texture_swizzled_signs);\n    if (texture_key.is_valid) {\n      const HostFormatPair& host_format_pair = GetHostFormatPair(texture_key);\n      if ((texture_util::IsAnySignNotSigned(texture_swizzled_signs) &&\n           !host_format_pair.format_unsigned.linear_filterable) ||\n          (texture_util::IsAnySignSigned(texture_swizzled_signs) &&\n           !host_format_pair.format_signed.linear_filterable)) {\n        linear_filterable = false;\n      }\n    } else {\n      linear_filterable = false;\n    }\n    if (!linear_filterable) {\n      parameters.mag_linear = 0;\n      parameters.min_linear = 0;\n      parameters.mip_linear = 0;\n    }\n  }\n  xenos::AnisoFilter aniso_filter =\n      binding.aniso_filter == xenos::AnisoFilter::kUseFetchConst\n          ? fetch.aniso_filter\n          : binding.aniso_filter;\n  parameters.aniso_filter = std::min(aniso_filter, max_anisotropy_);\n  parameters.mip_base_map = mip_filter == xenos::TextureFilter::kBaseMap;\n\n  uint32_t mip_min_level;\n  texture_util::GetSubresourcesFromFetchConstant(fetch, nullptr, nullptr,\n                                                 nullptr, nullptr, nullptr,\n                                                 &mip_min_level, nullptr);\n  parameters.mip_min_level = mip_min_level;\n\n  return parameters;\n}\n\nVkSampler VulkanTextureCache::UseSampler(SamplerParameters parameters,\n                                         bool& has_overflown_out) {\n  assert_true(command_processor_.submission_open());\n  uint64_t submission_current = command_processor_.GetCurrentSubmission();\n\n  // Try to find an existing sampler.\n  auto it_existing = samplers_.find(parameters);\n  if (it_existing != samplers_.end()) {\n    std::pair<const SamplerParameters, Sampler>& sampler = *it_existing;\n    assert_true(sampler.second.last_usage_submission <= submission_current);\n    // This is called very frequently, don't relink unless needed for caching.\n    if (sampler.second.last_usage_submission < submission_current) {\n      // Move to the front of the LRU queue.\n      sampler.second.last_usage_submission = submission_current;\n      if (sampler.second.used_next) {\n        if (sampler.second.used_previous) {\n          sampler.second.used_previous->second.used_next =\n              sampler.second.used_next;\n        } else {\n          sampler_used_first_ = sampler.second.used_next;\n        }\n        sampler.second.used_next->second.used_previous =\n            sampler.second.used_previous;\n        sampler.second.used_previous = sampler_used_last_;\n        sampler.second.used_next = nullptr;\n        sampler_used_last_->second.used_next = &sampler;\n        sampler_used_last_ = &sampler;\n      }\n    }\n    has_overflown_out = false;\n    return sampler.second.sampler;\n  }\n\n  const ui::vulkan::VulkanDevice* const vulkan_device =\n      command_processor_.GetVulkanDevice();\n  const ui::vulkan::VulkanDevice::Functions& dfn = vulkan_device->functions();\n  const VkDevice device = vulkan_device->device();\n\n  // See if an existing sampler can be destroyed to create space for the new\n  // one.\n  if (samplers_.size() >= sampler_max_count_) {\n    assert_not_null(sampler_used_first_);\n    if (!sampler_used_first_) {\n      has_overflown_out = false;\n      return VK_NULL_HANDLE;\n    }\n    if (sampler_used_first_->second.last_usage_submission >\n        command_processor_.GetCompletedSubmission()) {\n      has_overflown_out = true;\n      return VK_NULL_HANDLE;\n    }\n    auto it_reuse = samplers_.find(sampler_used_first_->first);\n    dfn.vkDestroySampler(device, sampler_used_first_->second.sampler, nullptr);\n    if (sampler_used_first_->second.used_next) {\n      sampler_used_first_->second.used_next->second.used_previous =\n          sampler_used_first_->second.used_previous;\n    } else {\n      sampler_used_last_ = sampler_used_first_->second.used_previous;\n    }\n    sampler_used_first_ = sampler_used_first_->second.used_next;\n    assert_true(it_reuse != samplers_.end());\n    if (it_reuse != samplers_.end()) {\n      // This destroys the Sampler object.\n      samplers_.erase(it_reuse);\n      COUNT_profile_set(\"gpu/texture_cache/vulkan/samplers\", samplers_.size());\n    } else {\n      has_overflown_out = false;\n      return VK_NULL_HANDLE;\n    }\n  }\n\n  // Create a new sampler and make it the least recently used.\n  // The values are normalized, and unsupported ones are excluded, in\n  // GetSamplerParameters.\n  VkSamplerCreateInfo sampler_create_info = {};\n  sampler_create_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;\n  if (vulkan_device->properties().nonSeamlessCubeMap &&\n      cvars::non_seamless_cube_map) {\n    sampler_create_info.flags |=\n        VK_SAMPLER_CREATE_NON_SEAMLESS_CUBE_MAP_BIT_EXT;\n  }\n  sampler_create_info.magFilter =\n      parameters.mag_linear ? VK_FILTER_LINEAR : VK_FILTER_NEAREST;\n  sampler_create_info.minFilter =\n      parameters.mag_linear ? VK_FILTER_LINEAR : VK_FILTER_NEAREST;\n  sampler_create_info.mipmapMode = parameters.mag_linear\n                                       ? VK_SAMPLER_MIPMAP_MODE_LINEAR\n                                       : VK_SAMPLER_MIPMAP_MODE_NEAREST;\n  static const VkSamplerAddressMode kAddressModeMap[] = {\n      // kRepeat\n      VK_SAMPLER_ADDRESS_MODE_REPEAT,\n      // kMirroredRepeat\n      VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT,\n      // kClampToEdge\n      VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,\n      // kMirrorClampToEdge\n      VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE,\n      // kClampToHalfway\n      VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,\n      // kMirrorClampToHalfway\n      VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE,\n      // kClampToBorder\n      VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER,\n      // kMirrorClampToBorder\n      VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE,\n  };\n  sampler_create_info.addressModeU =\n      kAddressModeMap[uint32_t(parameters.clamp_x)];\n  sampler_create_info.addressModeV =\n      kAddressModeMap[uint32_t(parameters.clamp_y)];\n  sampler_create_info.addressModeW =\n      kAddressModeMap[uint32_t(parameters.clamp_z)];\n  // LOD biasing is performed in shaders.\n  if (parameters.aniso_filter != xenos::AnisoFilter::kDisabled) {\n    sampler_create_info.anisotropyEnable = VK_TRUE;\n    sampler_create_info.maxAnisotropy =\n        float(UINT32_C(1) << (uint32_t(parameters.aniso_filter) -\n                              uint32_t(xenos::AnisoFilter::kMax_1_1)));\n  }\n  sampler_create_info.minLod = float(parameters.mip_min_level);\n  if (parameters.mip_base_map) {\n    assert_false(parameters.mip_linear);\n    sampler_create_info.maxLod = sampler_create_info.minLod + 0.25f;\n  } else {\n    sampler_create_info.maxLod = VK_LOD_CLAMP_NONE;\n  }\n  // TODO(Triang3l): Custom border colors for CrYCb / YCrCb.\n  switch (parameters.border_color) {\n    case xenos::BorderColor::k_ABGR_White:\n      sampler_create_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;\n      break;\n    default:\n      sampler_create_info.borderColor = VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK;\n      break;\n  }\n  VkSampler vulkan_sampler;\n  if (dfn.vkCreateSampler(device, &sampler_create_info, nullptr,\n                          &vulkan_sampler) != VK_SUCCESS) {\n    XELOGE(\n        \"VulkanTextureCache: Failed to create the sampler for parameters \"\n        \"0x{:08X}\",\n        parameters.value);\n    has_overflown_out = false;\n    return VK_NULL_HANDLE;\n  }\n  std::pair<const SamplerParameters, Sampler>& new_sampler =\n      *(samplers_\n            .emplace(std::piecewise_construct,\n                     std::forward_as_tuple(parameters), std::forward_as_tuple())\n            .first);\n  COUNT_profile_set(\"gpu/texture_cache/vulkan/samplers\", samplers_.size());\n  new_sampler.second.sampler = vulkan_sampler;\n  new_sampler.second.last_usage_submission = submission_current;\n  new_sampler.second.used_previous = sampler_used_last_;\n  new_sampler.second.used_next = nullptr;\n  if (sampler_used_last_) {\n    sampler_used_last_->second.used_next = &new_sampler;\n  } else {\n    sampler_used_first_ = &new_sampler;\n  }\n  sampler_used_last_ = &new_sampler;\n  return vulkan_sampler;\n}\n\nuint64_t VulkanTextureCache::GetSubmissionToAwaitOnSamplerOverflow(\n    uint32_t overflowed_sampler_count) const {\n  if (!overflowed_sampler_count) {\n    return 0;\n  }\n  std::pair<const SamplerParameters, Sampler>* sampler_used =\n      sampler_used_first_;\n  if (!sampler_used_first_) {\n    return 0;\n  }\n  for (uint32_t samplers_remaining = overflowed_sampler_count - 1;\n       samplers_remaining; --samplers_remaining) {\n    std::pair<const SamplerParameters, Sampler>* sampler_used_next =\n        sampler_used->second.used_next;\n    if (!sampler_used_next) {\n      break;\n    }\n    sampler_used = sampler_used_next;\n  }\n  return sampler_used->second.last_usage_submission;\n}\n\nVkImageView VulkanTextureCache::RequestSwapTexture(\n    uint32_t& width_scaled_out, uint32_t& height_scaled_out,\n    xenos::TextureFormat& format_out) {\n  const auto& regs = register_file();\n  xenos::xe_gpu_texture_fetch_t fetch = regs.GetTextureFetch(0);\n  TextureKey key;\n  BindingInfoFromFetchConstant(fetch, key, nullptr);\n  if (!key.is_valid || key.base_page == 0 ||\n      key.dimension != xenos::DataDimension::k2DOrStacked) {\n    return nullptr;\n  }\n  VulkanTexture* texture =\n      static_cast<VulkanTexture*>(FindOrCreateTexture(key));\n  if (!texture) {\n    return VK_NULL_HANDLE;\n  }\n  VkImageView texture_view = texture->GetView(\n      false, GuestToHostSwizzle(fetch.swizzle, GetHostFormatSwizzle(key)),\n      false);\n  if (texture_view == VK_NULL_HANDLE) {\n    return VK_NULL_HANDLE;\n  }\n  if (!LoadTextureData(*texture)) {\n    return VK_NULL_HANDLE;\n  }\n  texture->MarkAsUsed();\n  VulkanTexture::Usage old_usage =\n      texture->SetUsage(VulkanTexture::Usage::kSwapSampled);\n  if (old_usage != VulkanTexture::Usage::kSwapSampled) {\n    VkPipelineStageFlags src_stage_mask, dst_stage_mask;\n    VkAccessFlags src_access_mask, dst_access_mask;\n    VkImageLayout old_layout, new_layout;\n    GetTextureUsageMasks(old_usage, src_stage_mask, src_access_mask,\n                         old_layout);\n    GetTextureUsageMasks(VulkanTexture::Usage::kSwapSampled, dst_stage_mask,\n                         dst_access_mask, new_layout);\n    command_processor_.PushImageMemoryBarrier(\n        texture->image(), ui::vulkan::util::InitializeSubresourceRange(),\n        src_stage_mask, dst_stage_mask, src_access_mask, dst_access_mask,\n        old_layout, new_layout);\n  }\n  // Only texture->key, not the result of BindingInfoFromFetchConstant, contains\n  // whether the texture is scaled.\n  key = texture->key();\n  width_scaled_out =\n      key.GetWidth() * (key.scaled_resolve ? draw_resolution_scale_x() : 1);\n  height_scaled_out =\n      key.GetHeight() * (key.scaled_resolve ? draw_resolution_scale_y() : 1);\n  format_out = key.format;\n  return texture_view;\n}\n\nbool VulkanTextureCache::IsSignedVersionSeparateForFormat(\n    TextureKey key) const {\n  const HostFormatPair& host_format_pair = GetHostFormatPair(key);\n  if (host_format_pair.format_unsigned.format == VK_FORMAT_UNDEFINED ||\n      host_format_pair.format_signed.format == VK_FORMAT_UNDEFINED) {\n    // Just one signedness.\n    return false;\n  }\n  return !host_format_pair.unsigned_signed_compatible;\n}\n\nuint32_t VulkanTextureCache::GetHostFormatSwizzle(TextureKey key) const {\n  return GetHostFormatPair(key).swizzle;\n}\n\nuint32_t VulkanTextureCache::GetMaxHostTextureWidthHeight(\n    xenos::DataDimension dimension) const {\n  const ui::vulkan::VulkanDevice::Properties& device_properties =\n      command_processor_.GetVulkanDevice()->properties();\n  switch (dimension) {\n    case xenos::DataDimension::k1D:\n    case xenos::DataDimension::k2DOrStacked:\n      // 1D and 2D are emulated as 2D arrays.\n      return device_properties.maxImageDimension2D;\n    case xenos::DataDimension::k3D:\n      return device_properties.maxImageDimension3D;\n    case xenos::DataDimension::kCube:\n      return device_properties.maxImageDimensionCube;\n    default:\n      assert_unhandled_case(dimension);\n      return 0;\n  }\n}\n\nuint32_t VulkanTextureCache::GetMaxHostTextureDepthOrArraySize(\n    xenos::DataDimension dimension) const {\n  const ui::vulkan::VulkanDevice::Properties& device_properties =\n      command_processor_.GetVulkanDevice()->properties();\n  switch (dimension) {\n    case xenos::DataDimension::k1D:\n    case xenos::DataDimension::k2DOrStacked:\n      // 1D and 2D are emulated as 2D arrays.\n      return device_properties.maxImageArrayLayers;\n    case xenos::DataDimension::k3D:\n      return device_properties.maxImageDimension3D;\n    case xenos::DataDimension::kCube:\n      // Not requesting the imageCubeArray feature, and the Xenos doesn't\n      // support cube map arrays.\n      return 6;\n    default:\n      assert_unhandled_case(dimension);\n      return 0;\n  }\n}\n\nstd::unique_ptr<TextureCache::Texture> VulkanTextureCache::CreateTexture(\n    TextureKey key) {\n  VkFormat formats[] = {VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED};\n  const HostFormatPair& host_format = GetHostFormatPair(key);\n  if (host_format.format_signed.format == VK_FORMAT_UNDEFINED) {\n    // Only the unsigned format may be available, if at all.\n    formats[0] = host_format.format_unsigned.format;\n  } else if (host_format.format_unsigned.format == VK_FORMAT_UNDEFINED) {\n    // Only the signed format may be available, if at all.\n    formats[0] = host_format.format_signed.format;\n  } else {\n    // Both unsigned and signed formats are available.\n    if (IsSignedVersionSeparateForFormat(key)) {\n      formats[0] = key.signed_separate ? host_format.format_signed.format\n                                       : host_format.format_unsigned.format;\n    } else {\n      // Same format for unsigned and signed, or compatible formats.\n      formats[0] = host_format.format_unsigned.format;\n      if (host_format.format_signed.format !=\n          host_format.format_unsigned.format) {\n        assert_not_zero(host_format.unsigned_signed_compatible);\n        formats[1] = host_format.format_signed.format;\n      }\n    }\n  }\n  if (formats[0] == VK_FORMAT_UNDEFINED) {\n    // TODO(Triang3l): If there's no best format, set that a format unsupported\n    // by the emulator completely is used to report at the end of the frame.\n    return nullptr;\n  }\n\n  const ui::vulkan::VulkanDevice* const vulkan_device =\n      command_processor_.GetVulkanDevice();\n  const ui::vulkan::VulkanDevice::Functions& dfn = vulkan_device->functions();\n  const VkDevice device = vulkan_device->device();\n\n  bool is_3d = key.dimension == xenos::DataDimension::k3D;\n  uint32_t depth_or_array_size = key.GetDepthOrArraySize();\n\n  VkImageCreateInfo image_create_info;\n  VkImageCreateInfo* image_create_info_last = &image_create_info;\n  image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;\n  image_create_info.pNext = nullptr;\n  image_create_info.flags = 0;\n  if (formats[1] != VK_FORMAT_UNDEFINED) {\n    image_create_info.flags |= VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;\n  }\n  if (key.dimension == xenos::DataDimension::kCube) {\n    image_create_info.flags |= VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT;\n  }\n  image_create_info.imageType = is_3d ? VK_IMAGE_TYPE_3D : VK_IMAGE_TYPE_2D;\n  image_create_info.format = formats[0];\n  image_create_info.extent.width = key.GetWidth();\n  image_create_info.extent.height = key.GetHeight();\n  if (key.scaled_resolve) {\n    image_create_info.extent.width *= draw_resolution_scale_x();\n    image_create_info.extent.height *= draw_resolution_scale_y();\n  }\n  image_create_info.extent.depth = is_3d ? depth_or_array_size : 1;\n  image_create_info.mipLevels = key.mip_max_level + 1;\n  image_create_info.arrayLayers = is_3d ? 1 : depth_or_array_size;\n  image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;\n  image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;\n  image_create_info.usage =\n      VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;\n  image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;\n  image_create_info.queueFamilyIndexCount = 0;\n  image_create_info.pQueueFamilyIndices = nullptr;\n  image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;\n  VkImageFormatListCreateInfo image_format_list_create_info;\n  if (formats[1] != VK_FORMAT_UNDEFINED &&\n      vulkan_device->extensions().ext_1_2_KHR_image_format_list) {\n    image_create_info_last->pNext = &image_format_list_create_info;\n    image_create_info_last =\n        reinterpret_cast<VkImageCreateInfo*>(&image_format_list_create_info);\n    image_format_list_create_info.sType =\n        VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO;\n    image_format_list_create_info.pNext = nullptr;\n    image_format_list_create_info.viewFormatCount = 2;\n    image_format_list_create_info.pViewFormats = formats;\n  }\n\n  VmaAllocationCreateInfo allocation_create_info = {};\n  allocation_create_info.usage = VMA_MEMORY_USAGE_AUTO_PREFER_DEVICE;\n\n  VkImage image;\n  VmaAllocation allocation;\n  if (vmaCreateImage(vma_allocator_, &image_create_info,\n                     &allocation_create_info, &image, &allocation, nullptr)) {\n    return nullptr;\n  }\n\n  return std::unique_ptr<Texture>(\n      new VulkanTexture(*this, key, image, allocation));\n}\n\nbool VulkanTextureCache::LoadTextureDataFromResidentMemoryImpl(Texture& texture,\n                                                               bool load_base,\n                                                               bool load_mips) {\n  VulkanTexture& vulkan_texture = static_cast<VulkanTexture&>(texture);\n  TextureKey texture_key = vulkan_texture.key();\n\n  // Get the pipeline.\n  const HostFormatPair& host_format_pair = GetHostFormatPair(texture_key);\n  bool host_format_is_signed;\n  if (IsSignedVersionSeparateForFormat(texture_key)) {\n    host_format_is_signed = bool(texture_key.signed_separate);\n  } else {\n    host_format_is_signed =\n        host_format_pair.format_unsigned.load_shader == kLoadShaderIndexUnknown;\n  }\n  const HostFormat& host_format = host_format_is_signed\n                                      ? host_format_pair.format_signed\n                                      : host_format_pair.format_unsigned;\n  LoadShaderIndex load_shader = host_format.load_shader;\n  if (load_shader == kLoadShaderIndexUnknown) {\n    return false;\n  }\n  VkPipeline pipeline = texture_key.scaled_resolve\n                            ? load_pipelines_scaled_[load_shader]\n                            : load_pipelines_[load_shader];\n  if (pipeline == VK_NULL_HANDLE) {\n    return false;\n  }\n  const LoadShaderInfo& load_shader_info = GetLoadShaderInfo(load_shader);\n\n  // Get the guest layout.\n  const texture_util::TextureGuestLayout& guest_layout =\n      vulkan_texture.guest_layout();\n  xenos::DataDimension dimension = texture_key.dimension;\n  bool is_3d = dimension == xenos::DataDimension::k3D;\n  uint32_t width = texture_key.GetWidth();\n  uint32_t height = texture_key.GetHeight();\n  uint32_t depth_or_array_size = texture_key.GetDepthOrArraySize();\n  uint32_t depth = is_3d ? depth_or_array_size : 1;\n  uint32_t array_size = is_3d ? 1 : depth_or_array_size;\n  xenos::TextureFormat guest_format = texture_key.format;\n  const FormatInfo* guest_format_info = FormatInfo::Get(guest_format);\n  uint32_t block_width = guest_format_info->block_width;\n  uint32_t block_height = guest_format_info->block_height;\n  uint32_t bytes_per_block = guest_format_info->bytes_per_block();\n  uint32_t level_first = load_base ? 0 : 1;\n  uint32_t level_last = load_mips ? texture_key.mip_max_level : 0;\n  assert_true(level_first <= level_last);\n  uint32_t level_packed = guest_layout.packed_level;\n  uint32_t level_stored_first = std::min(level_first, level_packed);\n  uint32_t level_stored_last = std::min(level_last, level_packed);\n  uint32_t texture_resolution_scale_x =\n      texture_key.scaled_resolve ? draw_resolution_scale_x() : 1;\n  uint32_t texture_resolution_scale_y =\n      texture_key.scaled_resolve ? draw_resolution_scale_y() : 1;\n\n  // The loop counter can mean two things depending on whether the packed mip\n  // tail is stored as mip 0, because in this case, it would be ambiguous since\n  // both the base and the mips would be on \"level 0\", but stored in separate\n  // places.\n  uint32_t loop_level_first, loop_level_last;\n  if (level_packed == 0) {\n    // Packed mip tail is the level 0 - may need to load mip tails for the base,\n    // the mips, or both.\n    // Loop iteration 0 - base packed mip tail.\n    // Loop iteration 1 - mips packed mip tail.\n    loop_level_first = uint32_t(level_first != 0);\n    loop_level_last = uint32_t(level_last != 0);\n  } else {\n    // Packed mip tail is not the level 0.\n    // Loop iteration is the actual level being loaded.\n    loop_level_first = level_stored_first;\n    loop_level_last = level_stored_last;\n  }\n\n  // Get the host layout and the buffer.\n  uint32_t host_block_width = host_format.block_compressed ? block_width : 1;\n  uint32_t host_block_height = host_format.block_compressed ? block_height : 1;\n  uint32_t host_x_blocks_per_thread =\n      UINT32_C(1) << load_shader_info.guest_x_blocks_per_thread_log2;\n  if (!host_format.block_compressed) {\n    // Decompressing guest blocks.\n    host_x_blocks_per_thread *= block_width;\n  }\n  VkDeviceSize host_buffer_size = 0;\n  struct HostLayout {\n    VkDeviceSize offset_bytes;\n    VkDeviceSize slice_size_bytes;\n    uint32_t x_pitch_blocks;\n    uint32_t y_pitch_blocks;\n  };\n  HostLayout host_layout_base;\n  // Indexing is the same as for guest stored mips:\n  // 1...min(level_last, level_packed) if level_packed is not 0, or only 0 if\n  // level_packed == 0.\n  HostLayout host_layout_mips[xenos::kTextureMaxMips];\n  for (uint32_t loop_level = loop_level_first; loop_level <= loop_level_last;\n       ++loop_level) {\n    bool is_base = loop_level == 0;\n    uint32_t level = (level_packed == 0) ? 0 : loop_level;\n    HostLayout& level_host_layout =\n        is_base ? host_layout_base : host_layout_mips[level];\n    level_host_layout.offset_bytes = host_buffer_size;\n    uint32_t level_guest_x_extent_texels_unscaled;\n    uint32_t level_guest_y_extent_texels_unscaled;\n    uint32_t level_guest_z_extent_texels;\n    if (level == level_packed) {\n      // Loading the packed tail for the base or the mips - load the whole tail\n      // to copy regions out of it.\n      const texture_util::TextureGuestLayout::Level& guest_layout_packed =\n          is_base ? guest_layout.base : guest_layout.mips[level];\n      level_guest_x_extent_texels_unscaled =\n          guest_layout_packed.x_extent_blocks * block_width;\n      level_guest_y_extent_texels_unscaled =\n          guest_layout_packed.y_extent_blocks * block_height;\n      level_guest_z_extent_texels = guest_layout_packed.z_extent;\n    } else {\n      level_guest_x_extent_texels_unscaled =\n          std::max(width >> level, UINT32_C(1));\n      level_guest_y_extent_texels_unscaled =\n          std::max(height >> level, UINT32_C(1));\n      level_guest_z_extent_texels = std::max(depth >> level, UINT32_C(1));\n    }\n    level_host_layout.x_pitch_blocks = xe::round_up(\n        (level_guest_x_extent_texels_unscaled * texture_resolution_scale_x +\n         (host_block_width - 1)) /\n            host_block_width,\n        host_x_blocks_per_thread);\n    level_host_layout.y_pitch_blocks =\n        (level_guest_y_extent_texels_unscaled * texture_resolution_scale_y +\n         (host_block_height - 1)) /\n        host_block_height;\n    level_host_layout.slice_size_bytes =\n        VkDeviceSize(load_shader_info.bytes_per_host_block) *\n        level_host_layout.x_pitch_blocks * level_host_layout.y_pitch_blocks *\n        level_guest_z_extent_texels;\n    host_buffer_size += level_host_layout.slice_size_bytes * array_size;\n  }\n  VulkanCommandProcessor::ScratchBufferAcquisition scratch_buffer_acquisition(\n      command_processor_.AcquireScratchGpuBuffer(\n          host_buffer_size, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,\n          VK_ACCESS_SHADER_WRITE_BIT));\n  VkBuffer scratch_buffer = scratch_buffer_acquisition.buffer();\n  if (scratch_buffer == VK_NULL_HANDLE) {\n    return false;\n  }\n\n  // Begin loading.\n  // TODO(Triang3l): Going from one descriptor to another on per-array-layer\n  // or even per-8-depth-slices level to stay within maxStorageBufferRange.\n  const ui::vulkan::VulkanDevice* const vulkan_device =\n      command_processor_.GetVulkanDevice();\n  const ui::vulkan::VulkanDevice::Functions& dfn = vulkan_device->functions();\n  const VkDevice device = vulkan_device->device();\n  VulkanSharedMemory& vulkan_shared_memory =\n      static_cast<VulkanSharedMemory&>(shared_memory());\n  std::array<VkWriteDescriptorSet, 3> write_descriptor_sets;\n  uint32_t write_descriptor_set_count = 0;\n  VkDescriptorSet descriptor_set_dest =\n      command_processor_.AllocateSingleTransientDescriptor(\n          VulkanCommandProcessor::SingleTransientDescriptorLayout ::\n              kStorageBufferCompute);\n  if (!descriptor_set_dest) {\n    return false;\n  }\n  VkDescriptorBufferInfo write_descriptor_set_dest_buffer_info;\n  {\n    write_descriptor_set_dest_buffer_info.buffer = scratch_buffer;\n    write_descriptor_set_dest_buffer_info.offset = 0;\n    write_descriptor_set_dest_buffer_info.range = host_buffer_size;\n    VkWriteDescriptorSet& write_descriptor_set_dest =\n        write_descriptor_sets[write_descriptor_set_count++];\n    write_descriptor_set_dest.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;\n    write_descriptor_set_dest.pNext = nullptr;\n    write_descriptor_set_dest.dstSet = descriptor_set_dest;\n    write_descriptor_set_dest.dstBinding = 0;\n    write_descriptor_set_dest.dstArrayElement = 0;\n    write_descriptor_set_dest.descriptorCount = 1;\n    write_descriptor_set_dest.descriptorType =\n        VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;\n    write_descriptor_set_dest.pImageInfo = nullptr;\n    write_descriptor_set_dest.pBufferInfo =\n        &write_descriptor_set_dest_buffer_info;\n    write_descriptor_set_dest.pTexelBufferView = nullptr;\n  }\n  // TODO(Triang3l): Use a single 512 MB shared memory binding if possible.\n  // TODO(Triang3l): Scaled resolve buffer bindings.\n  VkDescriptorSet descriptor_set_source_base = VK_NULL_HANDLE;\n  VkDescriptorSet descriptor_set_source_mips = VK_NULL_HANDLE;\n  VkDescriptorBufferInfo write_descriptor_set_source_base_buffer_info;\n  VkDescriptorBufferInfo write_descriptor_set_source_mips_buffer_info;\n  if (level_first == 0) {\n    descriptor_set_source_base =\n        command_processor_.AllocateSingleTransientDescriptor(\n            VulkanCommandProcessor::SingleTransientDescriptorLayout ::\n                kStorageBufferCompute);\n    if (!descriptor_set_source_base) {\n      return false;\n    }\n    write_descriptor_set_source_base_buffer_info.buffer =\n        vulkan_shared_memory.buffer();\n    write_descriptor_set_source_base_buffer_info.offset = texture_key.base_page\n                                                          << 12;\n    // Align (primarily the last row of linear textures) because shaders use up\n    // to 16-byte loads for multiple blocks at once.\n    write_descriptor_set_source_base_buffer_info.range =\n        xe::align(vulkan_texture.GetGuestBaseSize(), uint32_t(16));\n    VkWriteDescriptorSet& write_descriptor_set_source_base =\n        write_descriptor_sets[write_descriptor_set_count++];\n    write_descriptor_set_source_base.sType =\n        VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;\n    write_descriptor_set_source_base.pNext = nullptr;\n    write_descriptor_set_source_base.dstSet = descriptor_set_source_base;\n    write_descriptor_set_source_base.dstBinding = 0;\n    write_descriptor_set_source_base.dstArrayElement = 0;\n    write_descriptor_set_source_base.descriptorCount = 1;\n    write_descriptor_set_source_base.descriptorType =\n        VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;\n    write_descriptor_set_source_base.pImageInfo = nullptr;\n    write_descriptor_set_source_base.pBufferInfo =\n        &write_descriptor_set_source_base_buffer_info;\n    write_descriptor_set_source_base.pTexelBufferView = nullptr;\n  }\n  if (level_last != 0) {\n    descriptor_set_source_mips =\n        command_processor_.AllocateSingleTransientDescriptor(\n            VulkanCommandProcessor::SingleTransientDescriptorLayout ::\n                kStorageBufferCompute);\n    if (!descriptor_set_source_mips) {\n      return false;\n    }\n    write_descriptor_set_source_mips_buffer_info.buffer =\n        vulkan_shared_memory.buffer();\n    write_descriptor_set_source_mips_buffer_info.offset = texture_key.mip_page\n                                                          << 12;\n    // Align (primarily the last row of a linear packed mip tail) because\n    // shaders use up to 16-byte loads for multiple blocks at once.\n    write_descriptor_set_source_mips_buffer_info.range =\n        xe::align(vulkan_texture.GetGuestMipsSize(), uint32_t(16));\n    VkWriteDescriptorSet& write_descriptor_set_source_mips =\n        write_descriptor_sets[write_descriptor_set_count++];\n    write_descriptor_set_source_mips.sType =\n        VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;\n    write_descriptor_set_source_mips.pNext = nullptr;\n    write_descriptor_set_source_mips.dstSet = descriptor_set_source_mips;\n    write_descriptor_set_source_mips.dstBinding = 0;\n    write_descriptor_set_source_mips.dstArrayElement = 0;\n    write_descriptor_set_source_mips.descriptorCount = 1;\n    write_descriptor_set_source_mips.descriptorType =\n        VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;\n    write_descriptor_set_source_mips.pImageInfo = nullptr;\n    write_descriptor_set_source_mips.pBufferInfo =\n        &write_descriptor_set_source_mips_buffer_info;\n    write_descriptor_set_source_mips.pTexelBufferView = nullptr;\n  }\n  if (write_descriptor_set_count) {\n    dfn.vkUpdateDescriptorSets(device, write_descriptor_set_count,\n                               write_descriptor_sets.data(), 0, nullptr);\n  }\n  vulkan_shared_memory.Use(VulkanSharedMemory::Usage::kRead);\n\n  // Submit the copy buffer population commands.\n\n  DeferredCommandBuffer& command_buffer =\n      command_processor_.deferred_command_buffer();\n\n  command_processor_.BindExternalComputePipeline(pipeline);\n\n  command_buffer.CmdVkBindDescriptorSets(\n      VK_PIPELINE_BIND_POINT_COMPUTE, load_pipeline_layout_,\n      kLoadDescriptorSetIndexDestination, 1, &descriptor_set_dest, 0, nullptr);\n\n  VkDescriptorSet descriptor_set_source_current = VK_NULL_HANDLE;\n\n  LoadConstants load_constants;\n  // 3 bits for each.\n  assert_true(texture_resolution_scale_x <= 7);\n  assert_true(texture_resolution_scale_y <= 7);\n  load_constants.is_tiled_3d_endian_scale =\n      uint32_t(texture_key.tiled) | (uint32_t(is_3d) << 1) |\n      (uint32_t(texture_key.endianness) << 2) |\n      (texture_resolution_scale_x << 4) | (texture_resolution_scale_y << 7);\n\n  uint32_t guest_x_blocks_per_group_log2 =\n      load_shader_info.GetGuestXBlocksPerGroupLog2();\n  for (uint32_t loop_level = loop_level_first; loop_level <= loop_level_last;\n       ++loop_level) {\n    bool is_base = loop_level == 0;\n    uint32_t level = (level_packed == 0) ? 0 : loop_level;\n\n    VkDescriptorSet descriptor_set_source =\n        is_base ? descriptor_set_source_base : descriptor_set_source_mips;\n    if (descriptor_set_source_current != descriptor_set_source) {\n      descriptor_set_source_current = descriptor_set_source;\n      command_buffer.CmdVkBindDescriptorSets(\n          VK_PIPELINE_BIND_POINT_COMPUTE, load_pipeline_layout_,\n          kLoadDescriptorSetIndexSource, 1, &descriptor_set_source, 0, nullptr);\n    }\n\n    // TODO(Triang3l): guest_offset relative to the storage buffer origin.\n    load_constants.guest_offset = 0;\n    if (!is_base) {\n      load_constants.guest_offset +=\n          guest_layout.mip_offsets_bytes[level] *\n          (texture_resolution_scale_x * texture_resolution_scale_y);\n    }\n    const texture_util::TextureGuestLayout::Level& level_guest_layout =\n        is_base ? guest_layout.base : guest_layout.mips[level];\n    load_constants.guest_pitch_aligned =\n        level_guest_layout.row_pitch_bytes / bytes_per_block;\n    load_constants.guest_z_stride_block_rows_aligned =\n        level_guest_layout.z_slice_stride_block_rows;\n    assert_true(dimension != xenos::DataDimension::k3D ||\n                !(load_constants.guest_z_stride_block_rows_aligned &\n                  (xenos::kTextureTileWidthHeight - 1)));\n\n    uint32_t level_width, level_height, level_depth;\n    if (level == level_packed) {\n      // This is the packed mip tail, containing not only the specified level,\n      // but also other levels at different offsets - load the entire needed\n      // extents.\n      level_width = level_guest_layout.x_extent_blocks * block_width;\n      level_height = level_guest_layout.y_extent_blocks * block_height;\n      level_depth = level_guest_layout.z_extent;\n    } else {\n      level_width = std::max(width >> level, UINT32_C(1));\n      level_height = std::max(height >> level, UINT32_C(1));\n      level_depth = std::max(depth >> level, UINT32_C(1));\n    }\n    load_constants.size_blocks[0] = (level_width + (block_width - 1)) /\n                                    block_width * texture_resolution_scale_x;\n    load_constants.size_blocks[1] = (level_height + (block_height - 1)) /\n                                    block_height * texture_resolution_scale_y;\n    load_constants.size_blocks[2] = level_depth;\n    load_constants.height_texels = level_height;\n\n    uint32_t group_count_x =\n        (load_constants.size_blocks[0] +\n         ((UINT32_C(1) << guest_x_blocks_per_group_log2) - 1)) >>\n        guest_x_blocks_per_group_log2;\n    uint32_t group_count_y =\n        (load_constants.size_blocks[1] +\n         ((UINT32_C(1) << kLoadGuestYBlocksPerGroupLog2) - 1)) >>\n        kLoadGuestYBlocksPerGroupLog2;\n\n    // TODO(Triang3l): host_offset relative to the storage buffer origin.\n    const HostLayout& level_host_layout =\n        is_base ? host_layout_base : host_layout_mips[level];\n    load_constants.host_offset = uint32_t(level_host_layout.offset_bytes);\n    load_constants.host_pitch = load_shader_info.bytes_per_host_block *\n                                level_host_layout.x_pitch_blocks;\n\n    command_buffer.CmdVkPushConstants(load_pipeline_layout_,\n                                      VK_SHADER_STAGE_COMPUTE_BIT, 0,\n                                      sizeof(load_constants), &load_constants);\n\n    uint32_t level_array_slice_stride_bytes_scaled =\n        level_guest_layout.array_slice_stride_bytes *\n        (texture_resolution_scale_x * texture_resolution_scale_y);\n    for (uint32_t slice = 0; slice < array_size; ++slice) {\n      if (slice != 0) {\n        command_buffer.CmdVkPushConstants(\n            load_pipeline_layout_, VK_SHADER_STAGE_COMPUTE_BIT,\n            offsetof(LoadConstants, guest_offset),\n            sizeof(load_constants.guest_offset), &load_constants.guest_offset);\n        command_buffer.CmdVkPushConstants(\n            load_pipeline_layout_, VK_SHADER_STAGE_COMPUTE_BIT,\n            offsetof(LoadConstants, host_offset),\n            sizeof(load_constants.host_offset), &load_constants.host_offset);\n      }\n      command_processor_.SubmitBarriers(true);\n      command_buffer.CmdVkDispatch(group_count_x, group_count_y,\n                                   load_constants.size_blocks[2]);\n      load_constants.guest_offset += level_array_slice_stride_bytes_scaled;\n      load_constants.host_offset +=\n          uint32_t(level_host_layout.slice_size_bytes);\n    }\n  }\n\n  // Submit copying from the copy buffer to the host texture.\n  command_processor_.PushBufferMemoryBarrier(\n      scratch_buffer, 0, VK_WHOLE_SIZE,\n      scratch_buffer_acquisition.SetStageMask(VK_PIPELINE_STAGE_TRANSFER_BIT),\n      VK_PIPELINE_STAGE_TRANSFER_BIT,\n      scratch_buffer_acquisition.SetAccessMask(VK_ACCESS_TRANSFER_READ_BIT),\n      VK_ACCESS_TRANSFER_READ_BIT);\n  vulkan_texture.MarkAsUsed();\n  VulkanTexture::Usage texture_old_usage =\n      vulkan_texture.SetUsage(VulkanTexture::Usage::kTransferDestination);\n  if (texture_old_usage != VulkanTexture::Usage::kTransferDestination) {\n    VkPipelineStageFlags texture_src_stage_mask, texture_dst_stage_mask;\n    VkAccessFlags texture_src_access_mask, texture_dst_access_mask;\n    VkImageLayout texture_old_layout, texture_new_layout;\n    GetTextureUsageMasks(texture_old_usage, texture_src_stage_mask,\n                         texture_src_access_mask, texture_old_layout);\n    GetTextureUsageMasks(VulkanTexture::Usage::kTransferDestination,\n                         texture_dst_stage_mask, texture_dst_access_mask,\n                         texture_new_layout);\n    command_processor_.PushImageMemoryBarrier(\n        vulkan_texture.image(), ui::vulkan::util::InitializeSubresourceRange(),\n        texture_src_stage_mask, texture_dst_stage_mask, texture_src_access_mask,\n        texture_dst_access_mask, texture_old_layout, texture_new_layout);\n  }\n  command_processor_.SubmitBarriers(true);\n  VkBufferImageCopy* copy_regions = command_buffer.CmdCopyBufferToImageEmplace(\n      scratch_buffer, vulkan_texture.image(),\n      VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, level_last - level_first + 1);\n  for (uint32_t level = level_first; level <= level_last; ++level) {\n    VkBufferImageCopy& copy_region = copy_regions[level - level_first];\n    const HostLayout& level_host_layout =\n        level != 0 ? host_layout_mips[std::min(level, level_packed)]\n                   : host_layout_base;\n    copy_region.bufferOffset = level_host_layout.offset_bytes;\n    if (level >= level_packed) {\n      uint32_t level_offset_blocks_x, level_offset_blocks_y, level_offset_z;\n      texture_util::GetPackedMipOffset(width, height, depth, guest_format,\n                                       level, level_offset_blocks_x,\n                                       level_offset_blocks_y, level_offset_z);\n      uint32_t level_offset_host_blocks_x =\n          texture_resolution_scale_x * level_offset_blocks_x;\n      uint32_t level_offset_host_blocks_y =\n          texture_resolution_scale_y * level_offset_blocks_y;\n      if (!host_format.block_compressed) {\n        level_offset_host_blocks_x *= block_width;\n        level_offset_host_blocks_y *= block_height;\n      }\n      copy_region.bufferOffset +=\n          load_shader_info.bytes_per_host_block *\n          (level_offset_host_blocks_x +\n           level_host_layout.x_pitch_blocks *\n               (level_offset_host_blocks_y + level_host_layout.y_pitch_blocks *\n                                                 VkDeviceSize(level_offset_z)));\n    }\n    copy_region.bufferRowLength =\n        level_host_layout.x_pitch_blocks * host_block_width;\n    copy_region.bufferImageHeight =\n        level_host_layout.y_pitch_blocks * host_block_height;\n    copy_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;\n    copy_region.imageSubresource.mipLevel = level;\n    copy_region.imageSubresource.baseArrayLayer = 0;\n    copy_region.imageSubresource.layerCount = array_size;\n    copy_region.imageOffset.x = 0;\n    copy_region.imageOffset.y = 0;\n    copy_region.imageOffset.z = 0;\n    copy_region.imageExtent.width =\n        std::max((width * texture_resolution_scale_x) >> level, UINT32_C(1));\n    copy_region.imageExtent.height =\n        std::max((height * texture_resolution_scale_y) >> level, UINT32_C(1));\n    copy_region.imageExtent.depth = std::max(depth >> level, UINT32_C(1));\n  }\n\n  return true;\n}\n\nvoid VulkanTextureCache::UpdateTextureBindingsImpl(\n    uint32_t fetch_constant_mask) {\n  uint32_t bindings_remaining = fetch_constant_mask;\n  uint32_t binding_index;\n  while (xe::bit_scan_forward(bindings_remaining, &binding_index)) {\n    bindings_remaining &= ~(UINT32_C(1) << binding_index);\n    VulkanTextureBinding& vulkan_binding =\n        vulkan_texture_bindings_[binding_index];\n    vulkan_binding.Reset();\n    const TextureBinding* binding = GetValidTextureBinding(binding_index);\n    if (!binding) {\n      continue;\n    }\n    if (IsSignedVersionSeparateForFormat(binding->key)) {\n      if (binding->texture &&\n          texture_util::IsAnySignNotSigned(binding->swizzled_signs)) {\n        vulkan_binding.image_view_unsigned =\n            static_cast<VulkanTexture*>(binding->texture)\n                ->GetView(false, binding->host_swizzle);\n      }\n      if (binding->texture_signed &&\n          texture_util::IsAnySignSigned(binding->swizzled_signs)) {\n        vulkan_binding.image_view_signed =\n            static_cast<VulkanTexture*>(binding->texture_signed)\n                ->GetView(true, binding->host_swizzle);\n      }\n    } else {\n      VulkanTexture* texture = static_cast<VulkanTexture*>(binding->texture);\n      if (texture) {\n        if (texture_util::IsAnySignNotSigned(binding->swizzled_signs)) {\n          vulkan_binding.image_view_unsigned =\n              texture->GetView(false, binding->host_swizzle);\n        }\n        if (texture_util::IsAnySignSigned(binding->swizzled_signs)) {\n          vulkan_binding.image_view_signed =\n              texture->GetView(true, binding->host_swizzle);\n        }\n      }\n    }\n  }\n}\n\nVulkanTextureCache::VulkanTexture::VulkanTexture(\n    VulkanTextureCache& texture_cache, const TextureKey& key, VkImage image,\n    VmaAllocation allocation)\n    : Texture(texture_cache, key), image_(image), allocation_(allocation) {\n  VmaAllocationInfo allocation_info;\n  vmaGetAllocationInfo(texture_cache.vma_allocator_, allocation_,\n                       &allocation_info);\n  SetHostMemoryUsage(uint64_t(allocation_info.size));\n}\n\nVulkanTextureCache::VulkanTexture::~VulkanTexture() {\n  const VulkanTextureCache& vulkan_texture_cache =\n      static_cast<const VulkanTextureCache&>(texture_cache());\n  const ui::vulkan::VulkanDevice* const vulkan_device =\n      vulkan_texture_cache.command_processor_.GetVulkanDevice();\n  const ui::vulkan::VulkanDevice::Functions& dfn = vulkan_device->functions();\n  const VkDevice device = vulkan_device->device();\n  for (const auto& view_pair : views_) {\n    dfn.vkDestroyImageView(device, view_pair.second, nullptr);\n  }\n  vmaDestroyImage(vulkan_texture_cache.vma_allocator_, image_, allocation_);\n}\n\nVkImageView VulkanTextureCache::VulkanTexture::GetView(bool is_signed,\n                                                       uint32_t host_swizzle,\n                                                       bool is_array) {\n  xenos::DataDimension dimension = key().dimension;\n  if (dimension == xenos::DataDimension::k3D ||\n      dimension == xenos::DataDimension::kCube) {\n    is_array = false;\n  }\n\n  const VulkanTextureCache& vulkan_texture_cache =\n      static_cast<const VulkanTextureCache&>(texture_cache());\n\n  ViewKey view_key;\n\n  const HostFormatPair& host_format_pair =\n      vulkan_texture_cache.GetHostFormatPair(key());\n  VkFormat format = (is_signed ? host_format_pair.format_signed\n                               : host_format_pair.format_unsigned)\n                        .format;\n  if (format == VK_FORMAT_UNDEFINED) {\n    return VK_NULL_HANDLE;\n  }\n  // If not distinguishing between unsigned and signed formats for the same\n  // image, don't create two views. As this happens within an image, no need to\n  // care about whether unsigned and signed images are separate - if they are\n  // (or if there are only unsigned or only signed images), this image will have\n  // either all views unsigned or all views signed.\n  view_key.is_signed_separate_view =\n      is_signed && (host_format_pair.format_signed.format !=\n                    host_format_pair.format_unsigned.format);\n\n  const ui::vulkan::VulkanDevice* const vulkan_device =\n      vulkan_texture_cache.command_processor_.GetVulkanDevice();\n\n  if (!vulkan_device->properties().imageViewFormatSwizzle) {\n    host_swizzle = xenos::XE_GPU_TEXTURE_SWIZZLE_RGBA;\n  }\n  view_key.host_swizzle = host_swizzle;\n\n  view_key.is_array = uint32_t(is_array);\n\n  // Try to find an existing view.\n  auto it = views_.find(view_key);\n  if (it != views_.end()) {\n    return it->second;\n  }\n\n  // Create a new view.\n  const ui::vulkan::VulkanDevice::Functions& dfn = vulkan_device->functions();\n  const VkDevice device = vulkan_device->device();\n  VkImageViewCreateInfo view_create_info;\n  view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;\n  view_create_info.pNext = nullptr;\n  view_create_info.flags = 0;\n  view_create_info.image = image();\n  view_create_info.format = format;\n  view_create_info.components.r = GetComponentSwizzle(host_swizzle, 0);\n  view_create_info.components.g = GetComponentSwizzle(host_swizzle, 1);\n  view_create_info.components.b = GetComponentSwizzle(host_swizzle, 2);\n  view_create_info.components.a = GetComponentSwizzle(host_swizzle, 3);\n  view_create_info.subresourceRange =\n      ui::vulkan::util::InitializeSubresourceRange();\n  switch (dimension) {\n    case xenos::DataDimension::k3D:\n      view_create_info.viewType = VK_IMAGE_VIEW_TYPE_3D;\n      break;\n    case xenos::DataDimension::kCube:\n      view_create_info.viewType = VK_IMAGE_VIEW_TYPE_CUBE;\n      break;\n    default:\n      if (is_array) {\n        view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D_ARRAY;\n      } else {\n        view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;\n        view_create_info.subresourceRange.layerCount = 1;\n      }\n      break;\n  }\n  VkImageView view;\n  if (dfn.vkCreateImageView(device, &view_create_info, nullptr, &view) !=\n      VK_SUCCESS) {\n    XELOGE(\n        \"VulkanTextureCache: Failed to create an image view for Vulkan format \"\n        \"{} ({}signed) with swizzle 0x{:3X}\",\n        uint32_t(format), is_signed ? \"\" : \"un\", host_swizzle);\n    return VK_NULL_HANDLE;\n  }\n  views_.emplace(view_key, view);\n  return view;\n}\n\nVulkanTextureCache::VulkanTextureCache(\n    const RegisterFile& register_file, VulkanSharedMemory& shared_memory,\n    uint32_t draw_resolution_scale_x, uint32_t draw_resolution_scale_y,\n    VulkanCommandProcessor& command_processor,\n    VkPipelineStageFlags guest_shader_pipeline_stages)\n    : TextureCache(register_file, shared_memory, draw_resolution_scale_x,\n                   draw_resolution_scale_y),\n      command_processor_(command_processor),\n      guest_shader_pipeline_stages_(guest_shader_pipeline_stages) {\n  // TODO(Triang3l): Support draw resolution scaling.\n  assert_true(draw_resolution_scale_x == 1 && draw_resolution_scale_y == 1);\n}\n\nbool VulkanTextureCache::Initialize() {\n  const ui::vulkan::VulkanDevice* const vulkan_device =\n      command_processor_.GetVulkanDevice();\n  const ui::vulkan::VulkanInstance::Functions& ifn =\n      vulkan_device->vulkan_instance()->functions();\n  const VkPhysicalDevice physical_device = vulkan_device->physical_device();\n  const ui::vulkan::VulkanDevice::Functions& dfn = vulkan_device->functions();\n  const VkDevice device = vulkan_device->device();\n  const ui::vulkan::VulkanDevice::Properties& device_properties =\n      vulkan_device->properties();\n\n  // Vulkan Memory Allocator.\n\n  vma_allocator_ = ui::vulkan::CreateVmaAllocator(vulkan_device, true);\n  if (vma_allocator_ == VK_NULL_HANDLE) {\n    return false;\n  }\n\n  // Image formats.\n\n  // Initialize to the best formats.\n  for (size_t i = 0; i < xe::countof(host_formats_); ++i) {\n    host_formats_[i] = kBestHostFormats[i];\n  }\n\n  // Check format support and switch to fallbacks if needed.\n  constexpr VkFormatFeatureFlags kLinearFilterFeatures =\n      VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT |\n      VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT;\n  VkFormatProperties r16_unorm_properties;\n  ifn.vkGetPhysicalDeviceFormatProperties(physical_device, VK_FORMAT_R16_UNORM,\n                                          &r16_unorm_properties);\n  VkFormatProperties r16_snorm_properties;\n  ifn.vkGetPhysicalDeviceFormatProperties(physical_device, VK_FORMAT_R16_SNORM,\n                                          &r16_snorm_properties);\n  VkFormatProperties r16g16_unorm_properties;\n  ifn.vkGetPhysicalDeviceFormatProperties(\n      physical_device, VK_FORMAT_R16G16_UNORM, &r16g16_unorm_properties);\n  VkFormatProperties r16g16_snorm_properties;\n  ifn.vkGetPhysicalDeviceFormatProperties(\n      physical_device, VK_FORMAT_R16G16_SNORM, &r16g16_snorm_properties);\n  VkFormatProperties r16g16b16a16_unorm_properties;\n  ifn.vkGetPhysicalDeviceFormatProperties(physical_device,\n                                          VK_FORMAT_R16G16B16A16_UNORM,\n                                          &r16g16b16a16_unorm_properties);\n  VkFormatProperties r16g16b16a16_snorm_properties;\n  ifn.vkGetPhysicalDeviceFormatProperties(physical_device,\n                                          VK_FORMAT_R16G16B16A16_SNORM,\n                                          &r16g16b16a16_snorm_properties);\n  VkFormatProperties format_properties;\n  // TODO(Triang3l): k_2_10_10_10 signed -> filterable R16G16B16A16_SFLOAT\n  // (enough storage precision, possibly unwanted filtering precision change).\n  // k_Cr_Y1_Cb_Y0_REP, k_Y1_Cr_Y0_Cb_REP.\n  HostFormatPair& host_format_gbgr =\n      host_formats_[uint32_t(xenos::TextureFormat::k_Cr_Y1_Cb_Y0_REP)];\n  assert_true(host_format_gbgr.format_unsigned.format ==\n              VK_FORMAT_G8B8G8R8_422_UNORM_KHR);\n  assert_true(host_format_gbgr.format_signed.format ==\n              VK_FORMAT_R8G8B8A8_SNORM);\n  ifn.vkGetPhysicalDeviceFormatProperties(\n      physical_device, VK_FORMAT_G8B8G8R8_422_UNORM_KHR, &format_properties);\n  if ((format_properties.optimalTilingFeatures & kLinearFilterFeatures) !=\n      kLinearFilterFeatures) {\n    host_format_gbgr.format_unsigned.load_shader = kLoadShaderIndexGBGR8ToRGB8;\n    host_format_gbgr.format_unsigned.format = VK_FORMAT_R8G8B8A8_UNORM;\n    host_format_gbgr.format_unsigned.block_compressed = false;\n    host_format_gbgr.unsigned_signed_compatible = true;\n  }\n  HostFormatPair& host_format_bgrg =\n      host_formats_[uint32_t(xenos::TextureFormat::k_Y1_Cr_Y0_Cb_REP)];\n  assert_true(host_format_bgrg.format_unsigned.format ==\n              VK_FORMAT_B8G8R8G8_422_UNORM_KHR);\n  assert_true(host_format_bgrg.format_signed.format ==\n              VK_FORMAT_R8G8B8A8_SNORM);\n  ifn.vkGetPhysicalDeviceFormatProperties(\n      physical_device, VK_FORMAT_B8G8R8G8_422_UNORM_KHR, &format_properties);\n  if ((format_properties.optimalTilingFeatures & kLinearFilterFeatures) !=\n      kLinearFilterFeatures) {\n    host_format_bgrg.format_unsigned.load_shader = kLoadShaderIndexBGRG8ToRGB8;\n    host_format_bgrg.format_unsigned.format = VK_FORMAT_R8G8B8A8_UNORM;\n    host_format_bgrg.format_unsigned.block_compressed = false;\n    host_format_bgrg.unsigned_signed_compatible = true;\n  }\n  // TODO(Triang3l): k_10_11_11 -> filterable R16G16B16A16_SFLOAT (enough\n  // storage precision, possibly unwanted filtering precision change).\n  // TODO(Triang3l): k_11_11_10 -> filterable R16G16B16A16_SFLOAT (enough\n  // storage precision, possibly unwanted filtering precision change).\n  // S3TC.\n  // Not checking the textureCompressionBC feature because its availability\n  // means that all BC formats are supported, however, the device may expose\n  // some BC formats without this feature. Xenia doesn't use BC6H and BC7 at\n  // all, and has fallbacks for each used format.\n  // TODO(Triang3l): Raise the host texture memory usage limit if S3TC has to be\n  // decompressed.\n  // TODO(Triang3l): S3TC -> 5551 or 4444 as an option.\n  // TODO(Triang3l): S3TC -> ETC2 / EAC (a huge research topic).\n  HostFormatPair& host_format_dxt1 =\n      host_formats_[uint32_t(xenos::TextureFormat::k_DXT1)];\n  assert_true(host_format_dxt1.format_unsigned.format ==\n              VK_FORMAT_BC1_RGBA_UNORM_BLOCK);\n  ifn.vkGetPhysicalDeviceFormatProperties(\n      physical_device, VK_FORMAT_BC1_RGBA_UNORM_BLOCK, &format_properties);\n  if ((format_properties.optimalTilingFeatures & kLinearFilterFeatures) !=\n      kLinearFilterFeatures) {\n    host_format_dxt1.format_unsigned.load_shader = kLoadShaderIndexDXT1ToRGBA8;\n    host_format_dxt1.format_unsigned.format = VK_FORMAT_R8G8B8A8_UNORM;\n    host_format_dxt1.format_unsigned.block_compressed = false;\n    host_formats_[uint32_t(xenos::TextureFormat::k_DXT1_AS_16_16_16_16)] =\n        host_format_dxt1;\n  }\n  HostFormatPair& host_format_dxt2_3 =\n      host_formats_[uint32_t(xenos::TextureFormat::k_DXT2_3)];\n  assert_true(host_format_dxt2_3.format_unsigned.format ==\n              VK_FORMAT_BC2_UNORM_BLOCK);\n  ifn.vkGetPhysicalDeviceFormatProperties(\n      physical_device, VK_FORMAT_BC2_UNORM_BLOCK, &format_properties);\n  if ((format_properties.optimalTilingFeatures & kLinearFilterFeatures) !=\n      kLinearFilterFeatures) {\n    host_format_dxt2_3.format_unsigned.load_shader =\n        kLoadShaderIndexDXT3ToRGBA8;\n    host_format_dxt2_3.format_unsigned.format = VK_FORMAT_R8G8B8A8_UNORM;\n    host_format_dxt2_3.format_unsigned.block_compressed = false;\n    host_formats_[uint32_t(xenos::TextureFormat::k_DXT2_3_AS_16_16_16_16)] =\n        host_format_dxt2_3;\n  }\n  HostFormatPair& host_format_dxt4_5 =\n      host_formats_[uint32_t(xenos::TextureFormat::k_DXT4_5)];\n  assert_true(host_format_dxt4_5.format_unsigned.format ==\n              VK_FORMAT_BC3_UNORM_BLOCK);\n  ifn.vkGetPhysicalDeviceFormatProperties(\n      physical_device, VK_FORMAT_BC3_UNORM_BLOCK, &format_properties);\n  if ((format_properties.optimalTilingFeatures & kLinearFilterFeatures) !=\n      kLinearFilterFeatures) {\n    host_format_dxt4_5.format_unsigned.load_shader =\n        kLoadShaderIndexDXT5ToRGBA8;\n    host_format_dxt4_5.format_unsigned.format = VK_FORMAT_R8G8B8A8_UNORM;\n    host_format_dxt4_5.format_unsigned.block_compressed = false;\n    host_formats_[uint32_t(xenos::TextureFormat::k_DXT4_5_AS_16_16_16_16)] =\n        host_format_dxt4_5;\n  }\n  HostFormatPair& host_format_dxn =\n      host_formats_[uint32_t(xenos::TextureFormat::k_DXN)];\n  assert_true(host_format_dxn.format_unsigned.format ==\n              VK_FORMAT_BC5_UNORM_BLOCK);\n  ifn.vkGetPhysicalDeviceFormatProperties(\n      physical_device, VK_FORMAT_BC5_UNORM_BLOCK, &format_properties);\n  if ((format_properties.optimalTilingFeatures & kLinearFilterFeatures) !=\n      kLinearFilterFeatures) {\n    host_format_dxn.format_unsigned.load_shader = kLoadShaderIndexDXNToRG8;\n    host_format_dxn.format_unsigned.format = VK_FORMAT_R8G8_UNORM;\n    host_format_dxn.format_unsigned.block_compressed = false;\n  }\n  HostFormatPair& host_format_dxt5a =\n      host_formats_[uint32_t(xenos::TextureFormat::k_DXT5A)];\n  assert_true(host_format_dxt5a.format_unsigned.format ==\n              VK_FORMAT_BC4_UNORM_BLOCK);\n  ifn.vkGetPhysicalDeviceFormatProperties(\n      physical_device, VK_FORMAT_BC4_UNORM_BLOCK, &format_properties);\n  if ((format_properties.optimalTilingFeatures & kLinearFilterFeatures) !=\n      kLinearFilterFeatures) {\n    host_format_dxt5a.format_unsigned.load_shader = kLoadShaderIndexDXT5AToR8;\n    host_format_dxt5a.format_unsigned.format = VK_FORMAT_R8_UNORM;\n    host_format_dxt5a.format_unsigned.block_compressed = false;\n  }\n  // k_16, k_16_16, k_16_16_16_16 - UNORM / SNORM are optional, fall back to\n  // SFLOAT, which is mandatory and is always filterable (the guest 16-bit\n  // format is filterable, 16-bit fixed-point is the full texture filtering\n  // precision on the Xenos overall). Let the user choose what's more important,\n  // precision (use host UNORM / SNORM if available even if they're not\n  // filterable) or filterability (use host UNORM / SNORM only if they're\n  // available and filterable).\n  // TODO(Triang3l): Expose a cvar for selecting the preference (filterability\n  // or precision).\n  VkFormatFeatureFlags norm16_required_features =\n      VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT;\n  HostFormatPair& host_format_16 =\n      host_formats_[uint32_t(xenos::TextureFormat::k_16)];\n  assert_true(host_format_16.format_unsigned.format == VK_FORMAT_R16_UNORM);\n  if ((r16_unorm_properties.optimalTilingFeatures & norm16_required_features) !=\n      norm16_required_features) {\n    host_format_16.format_unsigned.load_shader =\n        kLoadShaderIndexR16UNormToFloat;\n    host_format_16.format_unsigned.format = VK_FORMAT_R16_SFLOAT;\n  }\n  assert_true(host_format_16.format_signed.format == VK_FORMAT_R16_SNORM);\n  if ((r16_snorm_properties.optimalTilingFeatures & norm16_required_features) !=\n      norm16_required_features) {\n    host_format_16.format_signed.load_shader = kLoadShaderIndexR16SNormToFloat;\n    host_format_16.format_signed.format = VK_FORMAT_R16_SFLOAT;\n  }\n  host_format_16.unsigned_signed_compatible =\n      (host_format_16.format_unsigned.format == VK_FORMAT_R16_UNORM &&\n       host_format_16.format_signed.format == VK_FORMAT_R16_SNORM) ||\n      (host_format_16.format_unsigned.format == VK_FORMAT_R16_SFLOAT &&\n       host_format_16.format_signed.format == VK_FORMAT_R16_SFLOAT);\n  HostFormatPair& host_format_16_16 =\n      host_formats_[uint32_t(xenos::TextureFormat::k_16_16)];\n  assert_true(host_format_16_16.format_unsigned.format ==\n              VK_FORMAT_R16G16_UNORM);\n  if ((r16g16_unorm_properties.optimalTilingFeatures &\n       norm16_required_features) != norm16_required_features) {\n    host_format_16_16.format_unsigned.load_shader =\n        kLoadShaderIndexRG16UNormToFloat;\n    host_format_16_16.format_unsigned.format = VK_FORMAT_R16G16_SFLOAT;\n  }\n  assert_true(host_format_16_16.format_signed.format == VK_FORMAT_R16G16_SNORM);\n  if ((r16g16_snorm_properties.optimalTilingFeatures &\n       norm16_required_features) != norm16_required_features) {\n    host_format_16_16.format_signed.load_shader =\n        kLoadShaderIndexRG16SNormToFloat;\n    host_format_16_16.format_signed.format = VK_FORMAT_R16G16_SFLOAT;\n  }\n  host_format_16_16.unsigned_signed_compatible =\n      (host_format_16_16.format_unsigned.format == VK_FORMAT_R16G16_UNORM &&\n       host_format_16_16.format_signed.format == VK_FORMAT_R16G16_SNORM) ||\n      (host_format_16_16.format_unsigned.format == VK_FORMAT_R16G16_SFLOAT &&\n       host_format_16_16.format_signed.format == VK_FORMAT_R16G16_SFLOAT);\n  HostFormatPair& host_format_16_16_16_16 =\n      host_formats_[uint32_t(xenos::TextureFormat::k_16_16_16_16)];\n  assert_true(host_format_16_16_16_16.format_unsigned.format ==\n              VK_FORMAT_R16G16B16A16_UNORM);\n  if ((r16g16b16a16_unorm_properties.optimalTilingFeatures &\n       norm16_required_features) != norm16_required_features) {\n    host_format_16_16_16_16.format_unsigned.load_shader =\n        kLoadShaderIndexRGBA16UNormToFloat;\n    host_format_16_16_16_16.format_unsigned.format =\n        VK_FORMAT_R16G16B16A16_SFLOAT;\n  }\n  assert_true(host_format_16_16_16_16.format_signed.format ==\n              VK_FORMAT_R16G16B16A16_SNORM);\n  if ((r16g16b16a16_snorm_properties.optimalTilingFeatures &\n       norm16_required_features) != norm16_required_features) {\n    host_format_16_16_16_16.format_signed.load_shader =\n        kLoadShaderIndexRGBA16SNormToFloat;\n    host_format_16_16_16_16.format_signed.format =\n        VK_FORMAT_R16G16B16A16_SFLOAT;\n  }\n  host_format_16_16_16_16.unsigned_signed_compatible =\n      (host_format_16_16_16_16.format_unsigned.format ==\n           VK_FORMAT_R16G16B16A16_UNORM &&\n       host_format_16_16_16_16.format_signed.format ==\n           VK_FORMAT_R16G16B16A16_SNORM) ||\n      (host_format_16_16_16_16.format_unsigned.format ==\n           VK_FORMAT_R16G16B16A16_SFLOAT &&\n       host_format_16_16_16_16.format_signed.format ==\n           VK_FORMAT_R16G16B16A16_SFLOAT);\n\n  // Normalize format information structures.\n  for (size_t i = 0; i < xe::countof(host_formats_); ++i) {\n    HostFormatPair& host_format = host_formats_[i];\n    // load_shader_index is left uninitialized for the tail (non-existent\n    // formats), kLoadShaderIndexUnknown may be non-zero, and format support may\n    // be disabled by setting the format to VK_FORMAT_UNDEFINED.\n    if (host_format.format_unsigned.format == VK_FORMAT_UNDEFINED) {\n      host_format.format_unsigned.load_shader = kLoadShaderIndexUnknown;\n    }\n    assert_false(host_format.format_unsigned.load_shader ==\n                     kLoadShaderIndexUnknown &&\n                 host_format.format_unsigned.format != VK_FORMAT_UNDEFINED);\n    if (host_format.format_unsigned.load_shader == kLoadShaderIndexUnknown) {\n      host_format.format_unsigned.format = VK_FORMAT_UNDEFINED;\n      // Surely known it's unsupported with these two conditions.\n      host_format.format_unsigned.linear_filterable = false;\n    }\n    if (host_format.format_signed.format == VK_FORMAT_UNDEFINED) {\n      host_format.format_signed.load_shader = kLoadShaderIndexUnknown;\n    }\n    assert_false(host_format.format_signed.load_shader ==\n                     kLoadShaderIndexUnknown &&\n                 host_format.format_signed.format != VK_FORMAT_UNDEFINED);\n    if (host_format.format_signed.load_shader == kLoadShaderIndexUnknown) {\n      host_format.format_signed.format = VK_FORMAT_UNDEFINED;\n      // Surely known it's unsupported with these two conditions.\n      host_format.format_signed.linear_filterable = false;\n    }\n\n    // Check if the formats are supported and are linear-filterable.\n    if (host_format.format_unsigned.format != VK_FORMAT_UNDEFINED) {\n      ifn.vkGetPhysicalDeviceFormatProperties(\n          physical_device, host_format.format_unsigned.format,\n          &format_properties);\n      if (format_properties.optimalTilingFeatures &\n          VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) {\n        host_format.format_unsigned.linear_filterable =\n            (format_properties.optimalTilingFeatures &\n             VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT) != 0;\n      } else {\n        host_format.format_unsigned.format = VK_FORMAT_UNDEFINED;\n        host_format.format_unsigned.load_shader = kLoadShaderIndexUnknown;\n        host_format.format_unsigned.linear_filterable = false;\n      }\n    }\n    if (host_format.format_signed.format != VK_FORMAT_UNDEFINED) {\n      ifn.vkGetPhysicalDeviceFormatProperties(physical_device,\n                                              host_format.format_signed.format,\n                                              &format_properties);\n      if (format_properties.optimalTilingFeatures &\n          VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) {\n        host_format.format_signed.linear_filterable =\n            (format_properties.optimalTilingFeatures &\n             VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT) != 0;\n      } else {\n        host_format.format_signed.format = VK_FORMAT_UNDEFINED;\n        host_format.format_signed.load_shader = kLoadShaderIndexUnknown;\n        host_format.format_signed.linear_filterable = false;\n      }\n    }\n\n    // Log which formats are not supported or supported via fallbacks.\n    const HostFormatPair& best_host_format = kBestHostFormats[i];\n    const char* guest_format_name =\n        FormatInfo::Get(xenos::TextureFormat(i))->name;\n    if (best_host_format.format_unsigned.format != VK_FORMAT_UNDEFINED) {\n      assert_not_null(guest_format_name);\n      if (host_format.format_unsigned.format != VK_FORMAT_UNDEFINED) {\n        if (host_format.format_unsigned.format !=\n            best_host_format.format_unsigned.format) {\n          XELOGGPU(\n              \"VulkanTextureCache: Format {} (unsigned) is supported via a \"\n              \"fallback format (using the Vulkan format {} instead of the \"\n              \"preferred {})\",\n              guest_format_name, uint32_t(host_format.format_unsigned.format),\n              uint32_t(best_host_format.format_unsigned.format));\n        }\n      } else {\n        XELOGGPU(\n            \"VulkanTextureCache: Format {} (unsigned) is not supported by the \"\n            \"device (preferred Vulkan format is {})\",\n            guest_format_name,\n            uint32_t(best_host_format.format_unsigned.format));\n      }\n    }\n    if (best_host_format.format_signed.format != VK_FORMAT_UNDEFINED) {\n      assert_not_null(guest_format_name);\n      if (host_format.format_signed.format != VK_FORMAT_UNDEFINED) {\n        if (host_format.format_signed.format !=\n            best_host_format.format_signed.format) {\n          XELOGGPU(\n              \"VulkanTextureCache: Format {} (signed) is supported via a \"\n              \"fallback format (using the Vulkan format {} instead of the \"\n              \"preferred {})\",\n              guest_format_name, uint32_t(host_format.format_signed.format),\n              uint32_t(best_host_format.format_signed.format));\n        }\n      } else {\n        XELOGGPU(\n            \"VulkanTextureCache: Format {} (signed) is not supported by the \"\n            \"device (preferred Vulkan format is {})\",\n            guest_format_name, uint32_t(best_host_format.format_signed.format));\n      }\n    }\n\n    // Signednesses with different load shaders must have the data loaded\n    // differently, therefore can't share the image even if the format is the\n    // same. Also, if there's only one version, simplify the logic - there can't\n    // be compatibility between two formats when one of them is undefined.\n    if (host_format.format_unsigned.format != VK_FORMAT_UNDEFINED &&\n        host_format.format_signed.format != VK_FORMAT_UNDEFINED) {\n      if (host_format.format_unsigned.load_shader ==\n          host_format.format_signed.load_shader) {\n        if (host_format.format_unsigned.format ==\n            host_format.format_signed.format) {\n          // Same format after all the fallbacks - force compatibilty.\n          host_format.unsigned_signed_compatible = true;\n        }\n      } else {\n        host_format.unsigned_signed_compatible = false;\n      }\n      // Formats within the same compatibility class must have the same block\n      // size, though the fallbacks are configured incorrectly if that's not the\n      // case (since such formats just can't be in one compatibility class).\n      assert_false(host_format.unsigned_signed_compatible &&\n                   host_format.format_unsigned.block_compressed !=\n                       host_format.format_signed.block_compressed);\n      if (host_format.unsigned_signed_compatible &&\n          host_format.format_unsigned.block_compressed !=\n              host_format.format_signed.block_compressed) {\n        host_format.unsigned_signed_compatible = false;\n      }\n    } else {\n      host_format.unsigned_signed_compatible = false;\n    }\n  }\n\n  // Load pipeline layout.\n\n  VkDescriptorSetLayout load_descriptor_set_layouts[kLoadDescriptorSetCount] =\n      {};\n  VkDescriptorSetLayout load_descriptor_set_layout_storage_buffer =\n      command_processor_.GetSingleTransientDescriptorLayout(\n          VulkanCommandProcessor::SingleTransientDescriptorLayout ::\n              kStorageBufferCompute);\n  assert_true(load_descriptor_set_layout_storage_buffer != VK_NULL_HANDLE);\n  load_descriptor_set_layouts[kLoadDescriptorSetIndexDestination] =\n      load_descriptor_set_layout_storage_buffer;\n  load_descriptor_set_layouts[kLoadDescriptorSetIndexSource] =\n      load_descriptor_set_layout_storage_buffer;\n  VkPushConstantRange load_pipeline_layout_push_constant_range;\n  load_pipeline_layout_push_constant_range.stageFlags =\n      VK_SHADER_STAGE_COMPUTE_BIT;\n  load_pipeline_layout_push_constant_range.offset = 0;\n  load_pipeline_layout_push_constant_range.size = sizeof(LoadConstants);\n  VkPipelineLayoutCreateInfo load_pipeline_layout_create_info;\n  load_pipeline_layout_create_info.sType =\n      VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;\n  load_pipeline_layout_create_info.pNext = nullptr;\n  load_pipeline_layout_create_info.flags = 0;\n  load_pipeline_layout_create_info.setLayoutCount = kLoadDescriptorSetCount;\n  load_pipeline_layout_create_info.pSetLayouts = load_descriptor_set_layouts;\n  load_pipeline_layout_create_info.pushConstantRangeCount = 1;\n  load_pipeline_layout_create_info.pPushConstantRanges =\n      &load_pipeline_layout_push_constant_range;\n  if (dfn.vkCreatePipelineLayout(device, &load_pipeline_layout_create_info,\n                                 nullptr, &load_pipeline_layout_)) {\n    XELOGE(\"VulkanTexture: Failed to create the texture load pipeline layout\");\n    return false;\n  }\n\n  // Load pipelines, only the ones needed for the formats that will be used.\n\n  bool load_shaders_needed[kLoadShaderCount] = {};\n  for (size_t i = 0; i < xe::countof(host_formats_); ++i) {\n    const HostFormatPair& host_format = host_formats_[i];\n    if (host_format.format_unsigned.load_shader != kLoadShaderIndexUnknown) {\n      load_shaders_needed[host_format.format_unsigned.load_shader] = true;\n    }\n    if (host_format.format_signed.load_shader != kLoadShaderIndexUnknown) {\n      load_shaders_needed[host_format.format_signed.load_shader] = true;\n    }\n  }\n  if (kHostFormatGBGRUnaligned.format_unsigned.load_shader !=\n      kLoadShaderIndexUnknown) {\n    load_shaders_needed[kHostFormatGBGRUnaligned.format_unsigned.load_shader] =\n        true;\n  }\n  if (kHostFormatGBGRUnaligned.format_signed.load_shader !=\n      kLoadShaderIndexUnknown) {\n    load_shaders_needed[kHostFormatGBGRUnaligned.format_signed.load_shader] =\n        true;\n  }\n  if (kHostFormatBGRGUnaligned.format_unsigned.load_shader !=\n      kLoadShaderIndexUnknown) {\n    load_shaders_needed[kHostFormatBGRGUnaligned.format_unsigned.load_shader] =\n        true;\n  }\n  if (kHostFormatBGRGUnaligned.format_signed.load_shader !=\n      kLoadShaderIndexUnknown) {\n    load_shaders_needed[kHostFormatBGRGUnaligned.format_signed.load_shader] =\n        true;\n  }\n\n  std::pair<const uint32_t*, size_t> load_shader_code[kLoadShaderCount] = {};\n  load_shader_code[kLoadShaderIndex8bpb] = std::make_pair(\n      shaders::texture_load_8bpb_cs, sizeof(shaders::texture_load_8bpb_cs));\n  load_shader_code[kLoadShaderIndex16bpb] = std::make_pair(\n      shaders::texture_load_16bpb_cs, sizeof(shaders::texture_load_16bpb_cs));\n  load_shader_code[kLoadShaderIndex32bpb] = std::make_pair(\n      shaders::texture_load_32bpb_cs, sizeof(shaders::texture_load_32bpb_cs));\n  load_shader_code[kLoadShaderIndex64bpb] = std::make_pair(\n      shaders::texture_load_64bpb_cs, sizeof(shaders::texture_load_64bpb_cs));\n  load_shader_code[kLoadShaderIndex128bpb] = std::make_pair(\n      shaders::texture_load_128bpb_cs, sizeof(shaders::texture_load_128bpb_cs));\n  load_shader_code[kLoadShaderIndexR5G5B5A1ToB5G5R5A1] =\n      std::make_pair(shaders::texture_load_r5g5b5a1_b5g5r5a1_cs,\n                     sizeof(shaders::texture_load_r5g5b5a1_b5g5r5a1_cs));\n  load_shader_code[kLoadShaderIndexR5G6B5ToB5G6R5] =\n      std::make_pair(shaders::texture_load_r5g6b5_b5g6r5_cs,\n                     sizeof(shaders::texture_load_r5g6b5_b5g6r5_cs));\n  load_shader_code[kLoadShaderIndexR5G5B6ToB5G6R5WithRBGASwizzle] =\n      std::make_pair(\n          shaders::texture_load_r5g5b6_b5g6r5_swizzle_rbga_cs,\n          sizeof(shaders::texture_load_r5g5b6_b5g6r5_swizzle_rbga_cs));\n  load_shader_code[kLoadShaderIndexRGBA4ToARGB4] =\n      std::make_pair(shaders::texture_load_r4g4b4a4_a4r4g4b4_cs,\n                     sizeof(shaders::texture_load_r4g4b4a4_a4r4g4b4_cs));\n  load_shader_code[kLoadShaderIndexGBGR8ToRGB8] =\n      std::make_pair(shaders::texture_load_gbgr8_rgb8_cs,\n                     sizeof(shaders::texture_load_gbgr8_rgb8_cs));\n  load_shader_code[kLoadShaderIndexBGRG8ToRGB8] =\n      std::make_pair(shaders::texture_load_bgrg8_rgb8_cs,\n                     sizeof(shaders::texture_load_bgrg8_rgb8_cs));\n  load_shader_code[kLoadShaderIndexR10G11B11ToRGBA16] =\n      std::make_pair(shaders::texture_load_r10g11b11_rgba16_cs,\n                     sizeof(shaders::texture_load_r10g11b11_rgba16_cs));\n  load_shader_code[kLoadShaderIndexR10G11B11ToRGBA16SNorm] =\n      std::make_pair(shaders::texture_load_r10g11b11_rgba16_snorm_cs,\n                     sizeof(shaders::texture_load_r10g11b11_rgba16_snorm_cs));\n  load_shader_code[kLoadShaderIndexR11G11B10ToRGBA16] =\n      std::make_pair(shaders::texture_load_r11g11b10_rgba16_cs,\n                     sizeof(shaders::texture_load_r11g11b10_rgba16_cs));\n  load_shader_code[kLoadShaderIndexR11G11B10ToRGBA16SNorm] =\n      std::make_pair(shaders::texture_load_r11g11b10_rgba16_snorm_cs,\n                     sizeof(shaders::texture_load_r11g11b10_rgba16_snorm_cs));\n  load_shader_code[kLoadShaderIndexR16UNormToFloat] =\n      std::make_pair(shaders::texture_load_r16_unorm_float_cs,\n                     sizeof(shaders::texture_load_r16_unorm_float_cs));\n  load_shader_code[kLoadShaderIndexR16SNormToFloat] =\n      std::make_pair(shaders::texture_load_r16_snorm_float_cs,\n                     sizeof(shaders::texture_load_r16_snorm_float_cs));\n  load_shader_code[kLoadShaderIndexRG16UNormToFloat] =\n      std::make_pair(shaders::texture_load_rg16_unorm_float_cs,\n                     sizeof(shaders::texture_load_rg16_unorm_float_cs));\n  load_shader_code[kLoadShaderIndexRG16SNormToFloat] =\n      std::make_pair(shaders::texture_load_rg16_snorm_float_cs,\n                     sizeof(shaders::texture_load_rg16_snorm_float_cs));\n  load_shader_code[kLoadShaderIndexRGBA16UNormToFloat] =\n      std::make_pair(shaders::texture_load_rgba16_unorm_float_cs,\n                     sizeof(shaders::texture_load_rgba16_unorm_float_cs));\n  load_shader_code[kLoadShaderIndexRGBA16SNormToFloat] =\n      std::make_pair(shaders::texture_load_rgba16_snorm_float_cs,\n                     sizeof(shaders::texture_load_rgba16_snorm_float_cs));\n  load_shader_code[kLoadShaderIndexDXT1ToRGBA8] =\n      std::make_pair(shaders::texture_load_dxt1_rgba8_cs,\n                     sizeof(shaders::texture_load_dxt1_rgba8_cs));\n  load_shader_code[kLoadShaderIndexDXT3ToRGBA8] =\n      std::make_pair(shaders::texture_load_dxt3_rgba8_cs,\n                     sizeof(shaders::texture_load_dxt3_rgba8_cs));\n  load_shader_code[kLoadShaderIndexDXT5ToRGBA8] =\n      std::make_pair(shaders::texture_load_dxt5_rgba8_cs,\n                     sizeof(shaders::texture_load_dxt5_rgba8_cs));\n  load_shader_code[kLoadShaderIndexDXNToRG8] =\n      std::make_pair(shaders::texture_load_dxn_rg8_cs,\n                     sizeof(shaders::texture_load_dxn_rg8_cs));\n  load_shader_code[kLoadShaderIndexDXT3A] = std::make_pair(\n      shaders::texture_load_dxt3a_cs, sizeof(shaders::texture_load_dxt3a_cs));\n  load_shader_code[kLoadShaderIndexDXT3AAs1111ToARGB4] =\n      std::make_pair(shaders::texture_load_dxt3aas1111_argb4_cs,\n                     sizeof(shaders::texture_load_dxt3aas1111_argb4_cs));\n  load_shader_code[kLoadShaderIndexDXT5AToR8] =\n      std::make_pair(shaders::texture_load_dxt5a_r8_cs,\n                     sizeof(shaders::texture_load_dxt5a_r8_cs));\n  load_shader_code[kLoadShaderIndexCTX1] = std::make_pair(\n      shaders::texture_load_ctx1_cs, sizeof(shaders::texture_load_ctx1_cs));\n  load_shader_code[kLoadShaderIndexDepthUnorm] =\n      std::make_pair(shaders::texture_load_depth_unorm_cs,\n                     sizeof(shaders::texture_load_depth_unorm_cs));\n  load_shader_code[kLoadShaderIndexDepthFloat] =\n      std::make_pair(shaders::texture_load_depth_float_cs,\n                     sizeof(shaders::texture_load_depth_float_cs));\n  std::pair<const uint32_t*, size_t> load_shader_code_scaled[kLoadShaderCount] =\n      {};\n  if (IsDrawResolutionScaled()) {\n    load_shader_code_scaled[kLoadShaderIndex8bpb] =\n        std::make_pair(shaders::texture_load_8bpb_scaled_cs,\n                       sizeof(shaders::texture_load_8bpb_scaled_cs));\n    load_shader_code_scaled[kLoadShaderIndex16bpb] =\n        std::make_pair(shaders::texture_load_16bpb_scaled_cs,\n                       sizeof(shaders::texture_load_16bpb_scaled_cs));\n    load_shader_code_scaled[kLoadShaderIndex32bpb] =\n        std::make_pair(shaders::texture_load_32bpb_scaled_cs,\n                       sizeof(shaders::texture_load_32bpb_scaled_cs));\n    load_shader_code_scaled[kLoadShaderIndex64bpb] =\n        std::make_pair(shaders::texture_load_64bpb_scaled_cs,\n                       sizeof(shaders::texture_load_64bpb_scaled_cs));\n    load_shader_code_scaled[kLoadShaderIndex128bpb] =\n        std::make_pair(shaders::texture_load_128bpb_scaled_cs,\n                       sizeof(shaders::texture_load_128bpb_scaled_cs));\n    load_shader_code_scaled[kLoadShaderIndexR5G5B5A1ToB5G5R5A1] =\n        std::make_pair(\n            shaders::texture_load_r5g5b5a1_b5g5r5a1_scaled_cs,\n            sizeof(shaders::texture_load_r5g5b5a1_b5g5r5a1_scaled_cs));\n    load_shader_code_scaled[kLoadShaderIndexR5G6B5ToB5G6R5] =\n        std::make_pair(shaders::texture_load_r5g6b5_b5g6r5_scaled_cs,\n                       sizeof(shaders::texture_load_r5g6b5_b5g6r5_scaled_cs));\n    load_shader_code_scaled[kLoadShaderIndexR5G5B6ToB5G6R5WithRBGASwizzle] =\n        std::make_pair(\n            shaders::texture_load_r5g5b6_b5g6r5_swizzle_rbga_scaled_cs,\n            sizeof(shaders::texture_load_r5g5b6_b5g6r5_swizzle_rbga_scaled_cs));\n    load_shader_code_scaled[kLoadShaderIndexRGBA4ToARGB4] = std::make_pair(\n        shaders::texture_load_r4g4b4a4_a4r4g4b4_scaled_cs,\n        sizeof(shaders::texture_load_r4g4b4a4_a4r4g4b4_scaled_cs));\n    load_shader_code_scaled[kLoadShaderIndexR10G11B11ToRGBA16] = std::make_pair(\n        shaders::texture_load_r10g11b11_rgba16_scaled_cs,\n        sizeof(shaders::texture_load_r10g11b11_rgba16_scaled_cs));\n    load_shader_code_scaled[kLoadShaderIndexR10G11B11ToRGBA16SNorm] =\n        std::make_pair(\n            shaders::texture_load_r10g11b11_rgba16_snorm_scaled_cs,\n            sizeof(shaders::texture_load_r10g11b11_rgba16_snorm_scaled_cs));\n    load_shader_code_scaled[kLoadShaderIndexR11G11B10ToRGBA16] = std::make_pair(\n        shaders::texture_load_r11g11b10_rgba16_scaled_cs,\n        sizeof(shaders::texture_load_r11g11b10_rgba16_scaled_cs));\n    load_shader_code_scaled[kLoadShaderIndexR11G11B10ToRGBA16SNorm] =\n        std::make_pair(\n            shaders::texture_load_r11g11b10_rgba16_snorm_scaled_cs,\n            sizeof(shaders::texture_load_r11g11b10_rgba16_snorm_scaled_cs));\n    load_shader_code_scaled[kLoadShaderIndexR16UNormToFloat] =\n        std::make_pair(shaders::texture_load_r16_unorm_float_scaled_cs,\n                       sizeof(shaders::texture_load_r16_unorm_float_scaled_cs));\n    load_shader_code_scaled[kLoadShaderIndexR16SNormToFloat] =\n        std::make_pair(shaders::texture_load_r16_snorm_float_scaled_cs,\n                       sizeof(shaders::texture_load_r16_snorm_float_scaled_cs));\n    load_shader_code_scaled[kLoadShaderIndexRG16UNormToFloat] = std::make_pair(\n        shaders::texture_load_rg16_unorm_float_scaled_cs,\n        sizeof(shaders::texture_load_rg16_unorm_float_scaled_cs));\n    load_shader_code_scaled[kLoadShaderIndexRG16SNormToFloat] = std::make_pair(\n        shaders::texture_load_rg16_snorm_float_scaled_cs,\n        sizeof(shaders::texture_load_rg16_snorm_float_scaled_cs));\n    load_shader_code_scaled[kLoadShaderIndexRGBA16UNormToFloat] =\n        std::make_pair(\n            shaders::texture_load_rgba16_unorm_float_scaled_cs,\n            sizeof(shaders::texture_load_rgba16_unorm_float_scaled_cs));\n    load_shader_code_scaled[kLoadShaderIndexRGBA16SNormToFloat] =\n        std::make_pair(\n            shaders::texture_load_rgba16_snorm_float_scaled_cs,\n            sizeof(shaders::texture_load_rgba16_snorm_float_scaled_cs));\n    load_shader_code_scaled[kLoadShaderIndexDepthUnorm] =\n        std::make_pair(shaders::texture_load_depth_unorm_scaled_cs,\n                       sizeof(shaders::texture_load_depth_unorm_scaled_cs));\n    load_shader_code_scaled[kLoadShaderIndexDepthFloat] =\n        std::make_pair(shaders::texture_load_depth_float_scaled_cs,\n                       sizeof(shaders::texture_load_depth_float_scaled_cs));\n  }\n\n  for (size_t i = 0; i < kLoadShaderCount; ++i) {\n    if (!load_shaders_needed[i]) {\n      continue;\n    }\n    const std::pair<const uint32_t*, size_t>& current_load_shader_code =\n        load_shader_code[i];\n    assert_not_null(current_load_shader_code.first);\n    load_pipelines_[i] = ui::vulkan::util::CreateComputePipeline(\n        vulkan_device, load_pipeline_layout_, current_load_shader_code.first,\n        current_load_shader_code.second);\n    if (load_pipelines_[i] == VK_NULL_HANDLE) {\n      XELOGE(\n          \"VulkanTextureCache: Failed to create the texture loading pipeline \"\n          \"for shader {}\",\n          i);\n      return false;\n    }\n    if (IsDrawResolutionScaled()) {\n      const std::pair<const uint32_t*, size_t>&\n          current_load_shader_code_scaled = load_shader_code_scaled[i];\n      if (current_load_shader_code_scaled.first) {\n        load_pipelines_scaled_[i] = ui::vulkan::util::CreateComputePipeline(\n            vulkan_device, load_pipeline_layout_,\n            current_load_shader_code_scaled.first,\n            current_load_shader_code_scaled.second);\n        if (load_pipelines_scaled_[i] == VK_NULL_HANDLE) {\n          XELOGE(\n              \"VulkanTextureCache: Failed to create the resolution-scaled \"\n              \"texture loading pipeline for shader {}\",\n              i);\n          return false;\n        }\n      }\n    }\n  }\n\n  // Null images as a replacement for unneeded bindings and for bindings for\n  // which the real image hasn't been created.\n  // TODO(Triang3l): Use VK_EXT_robustness2 null descriptors.\n\n  VkImageCreateInfo null_image_create_info;\n  null_image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;\n  null_image_create_info.pNext = nullptr;\n  null_image_create_info.flags = VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT;\n  null_image_create_info.imageType = VK_IMAGE_TYPE_2D;\n  // Four components to return (0, 0, 0, 0).\n  // TODO(Triang3l): Find the return value for invalid texture fetch constants\n  // on the real hardware.\n  null_image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;\n  null_image_create_info.extent.width = 1;\n  null_image_create_info.extent.height = 1;\n  null_image_create_info.extent.depth = 1;\n  null_image_create_info.mipLevels = 1;\n  null_image_create_info.arrayLayers = 6;\n  null_image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;\n  null_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;\n  null_image_create_info.usage =\n      VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;\n  null_image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;\n  null_image_create_info.queueFamilyIndexCount = 0;\n  null_image_create_info.pQueueFamilyIndices = nullptr;\n  null_image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;\n  if (dfn.vkCreateImage(device, &null_image_create_info, nullptr,\n                        &null_image_2d_array_cube_) != VK_SUCCESS) {\n    XELOGE(\n        \"VulkanTextureCache: Failed to create the null 2D array and cube \"\n        \"image\");\n    return false;\n  }\n\n  null_image_create_info.flags &= ~VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT;\n  null_image_create_info.imageType = VK_IMAGE_TYPE_3D;\n  null_image_create_info.arrayLayers = 1;\n  if (dfn.vkCreateImage(device, &null_image_create_info, nullptr,\n                        &null_image_3d_) != VK_SUCCESS) {\n    XELOGE(\"VulkanTextureCache: Failed to create the null 3D image\");\n    return false;\n  }\n\n  VkMemoryRequirements null_image_memory_requirements_2d_array_cube_;\n  dfn.vkGetImageMemoryRequirements(\n      device, null_image_2d_array_cube_,\n      &null_image_memory_requirements_2d_array_cube_);\n  VkMemoryRequirements null_image_memory_requirements_3d_;\n  dfn.vkGetImageMemoryRequirements(device, null_image_3d_,\n                                   &null_image_memory_requirements_3d_);\n  uint32_t null_image_memory_type_common = ui::vulkan::util::ChooseMemoryType(\n      vulkan_device->memory_types(),\n      null_image_memory_requirements_2d_array_cube_.memoryTypeBits &\n          null_image_memory_requirements_3d_.memoryTypeBits,\n      ui::vulkan::util::MemoryPurpose::kDeviceLocal);\n  if (null_image_memory_type_common != UINT32_MAX) {\n    // Place both null images in one memory allocation because maximum total\n    // memory allocation count is limited.\n    VkDeviceSize null_image_memory_offset_3d_ =\n        xe::align(null_image_memory_requirements_2d_array_cube_.size,\n                  std::max(null_image_memory_requirements_3d_.alignment,\n                           VkDeviceSize(1)));\n    VkMemoryAllocateInfo null_image_memory_allocate_info;\n    null_image_memory_allocate_info.sType =\n        VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;\n    null_image_memory_allocate_info.pNext = nullptr;\n    null_image_memory_allocate_info.allocationSize =\n        null_image_memory_offset_3d_ + null_image_memory_requirements_3d_.size;\n    null_image_memory_allocate_info.memoryTypeIndex =\n        null_image_memory_type_common;\n    if (dfn.vkAllocateMemory(device, &null_image_memory_allocate_info, nullptr,\n                             &null_images_memory_[0]) != VK_SUCCESS) {\n      XELOGE(\n          \"VulkanTextureCache: Failed to allocate the memory for the null \"\n          \"images\");\n      return false;\n    }\n    if (dfn.vkBindImageMemory(device, null_image_2d_array_cube_,\n                              null_images_memory_[0], 0) != VK_SUCCESS) {\n      XELOGE(\n          \"VulkanTextureCache: Failed to bind the memory to the null 2D array \"\n          \"and cube image\");\n      return false;\n    }\n    if (dfn.vkBindImageMemory(device, null_image_3d_, null_images_memory_[0],\n                              null_image_memory_offset_3d_) != VK_SUCCESS) {\n      XELOGE(\n          \"VulkanTextureCache: Failed to bind the memory to the null 3D image\");\n      return false;\n    }\n  } else {\n    // Place each null image in separate allocations.\n    const uint32_t null_image_memory_type_2d_array_cube =\n        ui::vulkan::util::ChooseMemoryType(\n            vulkan_device->memory_types(),\n            null_image_memory_requirements_2d_array_cube_.memoryTypeBits,\n            ui::vulkan::util::MemoryPurpose::kDeviceLocal);\n    const uint32_t null_image_memory_type_3d =\n        ui::vulkan::util::ChooseMemoryType(\n            vulkan_device->memory_types(),\n            null_image_memory_requirements_3d_.memoryTypeBits,\n            ui::vulkan::util::MemoryPurpose::kDeviceLocal);\n    if (null_image_memory_type_2d_array_cube == UINT32_MAX ||\n        null_image_memory_type_3d == UINT32_MAX) {\n      XELOGE(\n          \"VulkanTextureCache: Failed to get the memory types for the null \"\n          \"images\");\n      return false;\n    }\n\n    VkMemoryAllocateInfo null_image_memory_allocate_info;\n    VkMemoryAllocateInfo* null_image_memory_allocate_info_last =\n        &null_image_memory_allocate_info;\n    null_image_memory_allocate_info.sType =\n        VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;\n    null_image_memory_allocate_info.pNext = nullptr;\n    null_image_memory_allocate_info.allocationSize =\n        null_image_memory_requirements_2d_array_cube_.size;\n    null_image_memory_allocate_info.memoryTypeIndex =\n        null_image_memory_type_2d_array_cube;\n    VkMemoryDedicatedAllocateInfo null_image_memory_dedicated_allocate_info;\n    if (vulkan_device->extensions().ext_1_1_KHR_dedicated_allocation) {\n      null_image_memory_allocate_info_last->pNext =\n          &null_image_memory_dedicated_allocate_info;\n      null_image_memory_allocate_info_last =\n          reinterpret_cast<VkMemoryAllocateInfo*>(\n              &null_image_memory_dedicated_allocate_info);\n      null_image_memory_dedicated_allocate_info.sType =\n          VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO;\n      null_image_memory_dedicated_allocate_info.pNext = nullptr;\n      null_image_memory_dedicated_allocate_info.image =\n          null_image_2d_array_cube_;\n      null_image_memory_dedicated_allocate_info.buffer = VK_NULL_HANDLE;\n    }\n    if (dfn.vkAllocateMemory(device, &null_image_memory_allocate_info, nullptr,\n                             &null_images_memory_[0]) != VK_SUCCESS) {\n      XELOGE(\n          \"VulkanTextureCache: Failed to allocate the memory for the null 2D \"\n          \"array and cube image\");\n      return false;\n    }\n    if (dfn.vkBindImageMemory(device, null_image_2d_array_cube_,\n                              null_images_memory_[0], 0) != VK_SUCCESS) {\n      XELOGE(\n          \"VulkanTextureCache: Failed to bind the memory to the null 2D array \"\n          \"and cube image\");\n      return false;\n    }\n\n    null_image_memory_allocate_info.allocationSize =\n        null_image_memory_requirements_3d_.size;\n    null_image_memory_allocate_info.memoryTypeIndex = null_image_memory_type_3d;\n    null_image_memory_dedicated_allocate_info.image = null_image_3d_;\n    if (dfn.vkAllocateMemory(device, &null_image_memory_allocate_info, nullptr,\n                             &null_images_memory_[1]) != VK_SUCCESS) {\n      XELOGE(\n          \"VulkanTextureCache: Failed to allocate the memory for the null 3D \"\n          \"image\");\n      return false;\n    }\n    if (dfn.vkBindImageMemory(device, null_image_3d_, null_images_memory_[1],\n                              0) != VK_SUCCESS) {\n      XELOGE(\n          \"VulkanTextureCache: Failed to bind the memory to the null 3D image\");\n      return false;\n    }\n  }\n\n  VkImageViewCreateInfo null_image_view_create_info;\n  null_image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;\n  null_image_view_create_info.pNext = nullptr;\n  null_image_view_create_info.flags = 0;\n  null_image_view_create_info.image = null_image_2d_array_cube_;\n  null_image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D_ARRAY;\n  null_image_view_create_info.format = null_image_create_info.format;\n  // TODO(Triang3l): Find the return value for invalid texture fetch constants\n  // on the real hardware.\n  // Micro-optimization if this has any effect on the host GPU at all, use only\n  // constant components instead of the real texels. The image will be cleared\n  // to (0, 0, 0, 0) anyway.\n  VkComponentSwizzle null_image_view_swizzle =\n      device_properties.imageViewFormatSwizzle ? VK_COMPONENT_SWIZZLE_ZERO\n                                               : VK_COMPONENT_SWIZZLE_IDENTITY;\n  null_image_view_create_info.components.r = null_image_view_swizzle;\n  null_image_view_create_info.components.g = null_image_view_swizzle;\n  null_image_view_create_info.components.b = null_image_view_swizzle;\n  null_image_view_create_info.components.a = null_image_view_swizzle;\n  null_image_view_create_info.subresourceRange =\n      ui::vulkan::util::InitializeSubresourceRange(\n          VK_IMAGE_ASPECT_COLOR_BIT, 0, VK_REMAINING_MIP_LEVELS, 0, 1);\n  if (dfn.vkCreateImageView(device, &null_image_view_create_info, nullptr,\n                            &null_image_view_2d_array_) != VK_SUCCESS) {\n    XELOGE(\"VulkanTextureCache: Failed to create the null 2D array image view\");\n    return false;\n  }\n  null_image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_CUBE;\n  null_image_view_create_info.subresourceRange.layerCount = 6;\n  if (dfn.vkCreateImageView(device, &null_image_view_create_info, nullptr,\n                            &null_image_view_cube_) != VK_SUCCESS) {\n    XELOGE(\"VulkanTextureCache: Failed to create the null cube image view\");\n    return false;\n  }\n  null_image_view_create_info.image = null_image_3d_;\n  null_image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_3D;\n  null_image_view_create_info.subresourceRange.layerCount = 1;\n  if (dfn.vkCreateImageView(device, &null_image_view_create_info, nullptr,\n                            &null_image_view_3d_) != VK_SUCCESS) {\n    XELOGE(\"VulkanTextureCache: Failed to create the null 3D image view\");\n    return false;\n  }\n\n  null_images_cleared_ = false;\n\n  // Samplers.\n\n  // Some MoltenVK devices have a maximum of 2048, 1024, or even 96 samplers,\n  // below Vulkan's minimum requirement of 4000.\n  // Assuming that the current VulkanTextureCache is the only one on this\n  // VkDevice (true in a regular emulation scenario), so taking over all the\n  // allocation slots exclusively.\n  // Also leaving a few slots for use by things like overlay applications.\n  sampler_max_count_ = device_properties.maxSamplerAllocationCount -\n                       ui::vulkan::UISamplers::kSamplerCount - 16;\n\n  if (device_properties.samplerAnisotropy) {\n    max_anisotropy_ = xenos::AnisoFilter(\n        uint32_t(xenos::AnisoFilter::kMax_1_1) +\n        (31 -\n         xe::lzcnt(uint32_t(std::min(\n             16.0f, std::max(1.0f, device_properties.maxSamplerAnisotropy))))));\n  } else {\n    max_anisotropy_ = xenos::AnisoFilter::kDisabled;\n  }\n\n  return true;\n}\n\nconst VulkanTextureCache::HostFormatPair& VulkanTextureCache::GetHostFormatPair(\n    TextureKey key) const {\n  if (key.format == xenos::TextureFormat::k_Cr_Y1_Cb_Y0_REP &&\n      (key.GetWidth() & 1)) {\n    return kHostFormatGBGRUnaligned;\n  }\n  if (key.format == xenos::TextureFormat::k_Y1_Cr_Y0_Cb_REP &&\n      (key.GetWidth() & 1)) {\n    return kHostFormatBGRGUnaligned;\n  }\n  return host_formats_[uint32_t(key.format)];\n}\n\nvoid VulkanTextureCache::GetTextureUsageMasks(VulkanTexture::Usage usage,\n                                              VkPipelineStageFlags& stage_mask,\n                                              VkAccessFlags& access_mask,\n                                              VkImageLayout& layout) {\n  stage_mask = 0;\n  access_mask = 0;\n  layout = VK_IMAGE_LAYOUT_UNDEFINED;\n  switch (usage) {\n    case VulkanTexture::Usage::kUndefined:\n      break;\n    case VulkanTexture::Usage::kTransferDestination:\n      stage_mask = VK_PIPELINE_STAGE_TRANSFER_BIT;\n      access_mask = VK_ACCESS_TRANSFER_WRITE_BIT;\n      layout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;\n      break;\n    case VulkanTexture::Usage::kGuestShaderSampled:\n      stage_mask = guest_shader_pipeline_stages_;\n      access_mask = VK_ACCESS_SHADER_READ_BIT;\n      layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;\n      break;\n    case VulkanTexture::Usage::kSwapSampled:\n      // The swap texture is likely to be used only for the presentation\n      // fragment shader, and not during emulation, where it'd be used in other\n      // stages.\n      stage_mask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;\n      access_mask = VK_ACCESS_SHADER_READ_BIT;\n      layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;\n      break;\n  }\n}\n\nxenos::ClampMode VulkanTextureCache::NormalizeClampMode(\n    xenos::ClampMode clamp_mode) const {\n  if (clamp_mode == xenos::ClampMode::kClampToHalfway) {\n    // No GL_CLAMP (clamp to half edge, half border) equivalent in Vulkan, but\n    // there's no Direct3D 9 equivalent anyway, and too weird to be suitable for\n    // intentional real usage.\n    return xenos::ClampMode::kClampToEdge;\n  }\n  if (clamp_mode == xenos::ClampMode::kMirrorClampToEdge ||\n      clamp_mode == xenos::ClampMode::kMirrorClampToHalfway ||\n      clamp_mode == xenos::ClampMode::kMirrorClampToBorder) {\n    // No equivalents for anything other than kMirrorClampToEdge in Vulkan.\n    return command_processor_.GetVulkanDevice()\n                   ->properties()\n                   .samplerMirrorClampToEdge\n               ? xenos::ClampMode::kMirrorClampToEdge\n               : xenos::ClampMode::kMirroredRepeat;\n  }\n  return clamp_mode;\n}\n\n}  // namespace vulkan\n}  // namespace gpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/vulkan/vulkan_texture_cache.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_VULKAN_VULKAN_TEXTURE_CACHE_H_\n#define XENIA_GPU_VULKAN_VULKAN_TEXTURE_CACHE_H_\n\n#include <array>\n#include <memory>\n#include <unordered_map>\n#include <utility>\n\n#include \"xenia/base/hash.h\"\n#include \"xenia/gpu/texture_cache.h\"\n#include \"xenia/gpu/vulkan/vulkan_shader.h\"\n#include \"xenia/gpu/vulkan/vulkan_shared_memory.h\"\n#include \"xenia/ui/vulkan/vulkan_mem_alloc.h\"\n\nnamespace xe {\nnamespace gpu {\nnamespace vulkan {\n\nclass VulkanCommandProcessor;\n\nclass VulkanTextureCache final : public TextureCache {\n public:\n  // Sampler parameters that can be directly converted to a host sampler or used\n  // for checking whether samplers bindings are up to date.\n  union SamplerParameters {\n    uint32_t value;\n    struct {\n      xenos::ClampMode clamp_x : 3;         // 3\n      xenos::ClampMode clamp_y : 3;         // 6\n      xenos::ClampMode clamp_z : 3;         // 9\n      xenos::BorderColor border_color : 2;  // 11\n      uint32_t mag_linear : 1;              // 12\n      uint32_t min_linear : 1;              // 13\n      uint32_t mip_linear : 1;              // 14\n      xenos::AnisoFilter aniso_filter : 3;  // 17\n      uint32_t mip_min_level : 4;           // 21\n      uint32_t mip_base_map : 1;            // 22\n      // Maximum mip level is in the texture resource itself, but mip_base_map\n      // can be used to limit fetching to mip_min_level.\n    };\n\n    SamplerParameters() : value(0) { static_assert_size(*this, sizeof(value)); }\n    struct Hasher {\n      size_t operator()(const SamplerParameters& parameters) const {\n        return std::hash<uint32_t>{}(parameters.value);\n      }\n    };\n    bool operator==(const SamplerParameters& parameters) const {\n      return value == parameters.value;\n    }\n    bool operator!=(const SamplerParameters& parameters) const {\n      return value != parameters.value;\n    }\n  };\n\n  // Transient descriptor set layouts must be initialized in the command\n  // processor.\n  static std::unique_ptr<VulkanTextureCache> Create(\n      const RegisterFile& register_file, VulkanSharedMemory& shared_memory,\n      uint32_t draw_resolution_scale_x, uint32_t draw_resolution_scale_y,\n      VulkanCommandProcessor& command_processor,\n      VkPipelineStageFlags guest_shader_pipeline_stages) {\n    std::unique_ptr<VulkanTextureCache> texture_cache(new VulkanTextureCache(\n        register_file, shared_memory, draw_resolution_scale_x,\n        draw_resolution_scale_y, command_processor,\n        guest_shader_pipeline_stages));\n    if (!texture_cache->Initialize()) {\n      return nullptr;\n    }\n    return std::move(texture_cache);\n  }\n\n  ~VulkanTextureCache();\n\n  void BeginSubmission(uint64_t new_submission_index) override;\n\n  // Must be called within a frame - creates and untiles textures needed by\n  // shaders, and enqueues transitioning them into the sampled usage. This may\n  // bind compute pipelines (notifying the command processor about that), and\n  // also since it may insert deferred barriers, before flushing the barriers\n  // preceding host GPU work.\n  void RequestTextures(uint32_t used_texture_mask) override;\n\n  VkImageView GetActiveBindingOrNullImageView(uint32_t fetch_constant_index,\n                                              xenos::FetchOpDimension dimension,\n                                              bool is_signed) const;\n\n  SamplerParameters GetSamplerParameters(\n      const VulkanShader::SamplerBinding& binding) const;\n\n  // Must be called for every used sampler at least once in a single submission,\n  // and a submission must be open for this to be callable.\n  // Returns:\n  // - The sampler, if obtained successfully - and increases its last usage\n  //   submission index - and has_overflown_out = false.\n  // - VK_NULL_HANDLE and has_overflown_out = true if there's a total sampler\n  //   count overflow in a submission that potentially hasn't completed yet.\n  // - VK_NULL_HANDLE and has_overflown_out = false in case of a general failure\n  //   to create a sampler.\n  VkSampler UseSampler(SamplerParameters parameters, bool& has_overflown_out);\n  // Returns the submission index to await (may be the current submission in\n  // case of an overflow within a single submission - in this case, it must be\n  // ended, and a new one must be started) in case of sampler count overflow, so\n  // samplers may be freed, and UseSamplers may take their slots.\n  uint64_t GetSubmissionToAwaitOnSamplerOverflow(\n      uint32_t overflowed_sampler_count) const;\n\n  // Returns the 2D view of the front buffer texture (for fragment shader\n  // reading - the barrier will be pushed in the command processor if needed),\n  // or VK_NULL_HANDLE in case of failure. May call LoadTextureData.\n  VkImageView RequestSwapTexture(uint32_t& width_scaled_out,\n                                 uint32_t& height_scaled_out,\n                                 xenos::TextureFormat& format_out);\n\n protected:\n  bool IsSignedVersionSeparateForFormat(TextureKey key) const override;\n  uint32_t GetHostFormatSwizzle(TextureKey key) const override;\n\n  uint32_t GetMaxHostTextureWidthHeight(\n      xenos::DataDimension dimension) const override;\n  uint32_t GetMaxHostTextureDepthOrArraySize(\n      xenos::DataDimension dimension) const override;\n\n  std::unique_ptr<Texture> CreateTexture(TextureKey key) override;\n\n  bool LoadTextureDataFromResidentMemoryImpl(Texture& texture, bool load_base,\n                                             bool load_mips) override;\n\n  void UpdateTextureBindingsImpl(uint32_t fetch_constant_mask) override;\n\n private:\n  enum LoadDescriptorSetIndex {\n    kLoadDescriptorSetIndexDestination,\n    kLoadDescriptorSetIndexSource,\n    kLoadDescriptorSetCount,\n  };\n\n  struct HostFormat {\n    LoadShaderIndex load_shader;\n    // Do NOT add integer formats to this - they are not filterable, can only be\n    // read with ImageFetch, not ImageSample! If any game is seen using\n    // num_format 1 for fixed-point formats (for floating-point, it's normally\n    // set to 1 though), add a constant buffer containing multipliers for the\n    // textures and multiplication to the tfetch implementation.\n    VkFormat format;\n    // Whether the format is block-compressed on the host (the host block size\n    // matches the guest format block size in this case), and isn't decompressed\n    // on load.\n    bool block_compressed;\n\n    // Set up dynamically based on what's supported by the device.\n    bool linear_filterable;\n  };\n\n  struct HostFormatPair {\n    HostFormat format_unsigned;\n    HostFormat format_signed;\n    // Mapping of Xenos swizzle components to Vulkan format components.\n    uint32_t swizzle;\n    // Whether the unsigned and the signed formats are compatible for one image\n    // and the same image data (on a portability subset device, this should also\n    // take imageViewFormatReinterpretation into account).\n    bool unsigned_signed_compatible;\n  };\n\n  class VulkanTexture final : public Texture {\n   public:\n    enum class Usage {\n      kUndefined,\n      kTransferDestination,\n      kGuestShaderSampled,\n      kSwapSampled,\n    };\n\n    // Takes ownership of the image and its memory.\n    explicit VulkanTexture(VulkanTextureCache& texture_cache,\n                           const TextureKey& key, VkImage image,\n                           VmaAllocation allocation);\n    ~VulkanTexture();\n\n    VkImage image() const { return image_; }\n\n    // Doesn't transition (the caller must insert the barrier).\n    Usage SetUsage(Usage new_usage) {\n      Usage old_usage = usage_;\n      usage_ = new_usage;\n      return old_usage;\n    }\n\n    VkImageView GetView(bool is_signed, uint32_t host_swizzle,\n                        bool is_array = true);\n\n   private:\n    union ViewKey {\n      uint32_t key;\n      struct {\n        uint32_t is_signed_separate_view : 1;\n        uint32_t host_swizzle : 12;\n        uint32_t is_array : 1;\n      };\n\n      ViewKey() : key(0) { static_assert_size(*this, sizeof(key)); }\n\n      struct Hasher {\n        size_t operator()(const ViewKey& key) const {\n          return std::hash<decltype(key.key)>{}(key.key);\n        }\n      };\n      bool operator==(const ViewKey& other_key) const {\n        return key == other_key.key;\n      }\n      bool operator!=(const ViewKey& other_key) const {\n        return !(*this == other_key);\n      }\n    };\n\n    static constexpr VkComponentSwizzle GetComponentSwizzle(\n        uint32_t texture_swizzle, uint32_t component_index) {\n      xenos::XE_GPU_TEXTURE_SWIZZLE texture_component_swizzle =\n          xenos::XE_GPU_TEXTURE_SWIZZLE(\n              (texture_swizzle >> (3 * component_index)) & 0b111);\n      if (texture_component_swizzle ==\n          xenos::XE_GPU_TEXTURE_SWIZZLE(component_index)) {\n        // The portability subset requires all swizzles to be IDENTITY, return\n        // IDENTITY specifically, not R, G, B, A.\n        return VK_COMPONENT_SWIZZLE_IDENTITY;\n      }\n      switch (texture_component_swizzle) {\n        case xenos::XE_GPU_TEXTURE_SWIZZLE_R:\n          return VK_COMPONENT_SWIZZLE_R;\n        case xenos::XE_GPU_TEXTURE_SWIZZLE_G:\n          return VK_COMPONENT_SWIZZLE_G;\n        case xenos::XE_GPU_TEXTURE_SWIZZLE_B:\n          return VK_COMPONENT_SWIZZLE_B;\n        case xenos::XE_GPU_TEXTURE_SWIZZLE_A:\n          return VK_COMPONENT_SWIZZLE_A;\n        case xenos::XE_GPU_TEXTURE_SWIZZLE_0:\n          return VK_COMPONENT_SWIZZLE_ZERO;\n        case xenos::XE_GPU_TEXTURE_SWIZZLE_1:\n          return VK_COMPONENT_SWIZZLE_ONE;\n        default:\n          // An invalid value.\n          return VK_COMPONENT_SWIZZLE_IDENTITY;\n      }\n    }\n\n    VkImage image_;\n    VmaAllocation allocation_;\n\n    Usage usage_ = Usage::kUndefined;\n\n    std::unordered_map<ViewKey, VkImageView, ViewKey::Hasher> views_;\n  };\n\n  struct VulkanTextureBinding {\n    VkImageView image_view_unsigned;\n    VkImageView image_view_signed;\n\n    VulkanTextureBinding() { Reset(); }\n\n    void Reset() {\n      image_view_unsigned = VK_NULL_HANDLE;\n      image_view_signed = VK_NULL_HANDLE;\n    }\n  };\n\n  struct Sampler {\n    VkSampler sampler;\n    uint64_t last_usage_submission;\n    std::pair<const SamplerParameters, Sampler>* used_previous;\n    std::pair<const SamplerParameters, Sampler>* used_next;\n  };\n\n  static constexpr bool AreDimensionsCompatible(\n      xenos::FetchOpDimension binding_dimension,\n      xenos::DataDimension resource_dimension) {\n    switch (binding_dimension) {\n      case xenos::FetchOpDimension::k1D:\n      case xenos::FetchOpDimension::k2D:\n        return resource_dimension == xenos::DataDimension::k1D ||\n               resource_dimension == xenos::DataDimension::k2DOrStacked;\n      case xenos::FetchOpDimension::k3DOrStacked:\n        return resource_dimension == xenos::DataDimension::k3D;\n      case xenos::FetchOpDimension::kCube:\n        return resource_dimension == xenos::DataDimension::kCube;\n      default:\n        return false;\n    }\n  }\n\n  explicit VulkanTextureCache(\n      const RegisterFile& register_file, VulkanSharedMemory& shared_memory,\n      uint32_t draw_resolution_scale_x, uint32_t draw_resolution_scale_y,\n      VulkanCommandProcessor& command_processor,\n      VkPipelineStageFlags guest_shader_pipeline_stages);\n\n  bool Initialize();\n\n  const HostFormatPair& GetHostFormatPair(TextureKey key) const;\n\n  void GetTextureUsageMasks(VulkanTexture::Usage usage,\n                            VkPipelineStageFlags& stage_mask,\n                            VkAccessFlags& access_mask, VkImageLayout& layout);\n\n  xenos::ClampMode NormalizeClampMode(xenos::ClampMode clamp_mode) const;\n\n  VulkanCommandProcessor& command_processor_;\n  VkPipelineStageFlags guest_shader_pipeline_stages_;\n\n  // Using the Vulkan Memory Allocator because texture count in games is\n  // naturally pretty much unbounded, while Vulkan implementations, especially\n  // on Windows versions before 10, may have an allocation count limit as low as\n  // 4096.\n  VmaAllocator vma_allocator_ = VK_NULL_HANDLE;\n\n  static const HostFormatPair kBestHostFormats[64];\n  static const HostFormatPair kHostFormatGBGRUnaligned;\n  static const HostFormatPair kHostFormatBGRGUnaligned;\n  HostFormatPair host_formats_[64];\n\n  VkPipelineLayout load_pipeline_layout_ = VK_NULL_HANDLE;\n  std::array<VkPipeline, kLoadShaderCount> load_pipelines_{};\n  std::array<VkPipeline, kLoadShaderCount> load_pipelines_scaled_{};\n\n  // If both images can be placed in the same allocation, it's one allocation,\n  // otherwise it's two separate.\n  std::array<VkDeviceMemory, 2> null_images_memory_{};\n  VkImage null_image_2d_array_cube_ = VK_NULL_HANDLE;\n  VkImage null_image_3d_ = VK_NULL_HANDLE;\n  VkImageView null_image_view_2d_array_ = VK_NULL_HANDLE;\n  VkImageView null_image_view_cube_ = VK_NULL_HANDLE;\n  VkImageView null_image_view_3d_ = VK_NULL_HANDLE;\n  bool null_images_cleared_ = false;\n\n  std::array<VulkanTextureBinding, xenos::kTextureFetchConstantCount>\n      vulkan_texture_bindings_;\n\n  uint32_t sampler_max_count_;\n\n  xenos::AnisoFilter max_anisotropy_;\n\n  std::unordered_map<SamplerParameters, Sampler, SamplerParameters::Hasher>\n      samplers_;\n  std::pair<const SamplerParameters, Sampler>* sampler_used_first_ = nullptr;\n  std::pair<const SamplerParameters, Sampler>* sampler_used_last_ = nullptr;\n};\n\n}  // namespace vulkan\n}  // namespace gpu\n}  // namespace xe\n\n#endif  // XENIA_GPU_VULKAN_VULKAN_TEXTURE_CACHE_H_\n"
  },
  {
    "path": "src/xenia/gpu/vulkan/vulkan_trace_dump_main.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/console_app_main.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/gpu/trace_dump.h\"\n#include \"xenia/gpu/vulkan/vulkan_command_processor.h\"\n#include \"xenia/gpu/vulkan/vulkan_graphics_system.h\"\n#include \"xenia/ui/vulkan/vulkan_provider.h\"\n\nnamespace xe {\nnamespace gpu {\nnamespace vulkan {\n\nusing namespace xe::gpu::xenos;\n\nclass VulkanTraceDump : public TraceDump {\n public:\n  std::unique_ptr<gpu::GraphicsSystem> CreateGraphicsSystem() override {\n    return std::unique_ptr<gpu::GraphicsSystem>(new VulkanGraphicsSystem());\n  }\n\n  void BeginHostCapture() override {\n    const ui::RenderDocAPI* const renderdoc_api =\n        static_cast<const ui::vulkan::VulkanProvider*>(\n            graphics_system_->provider())\n            ->vulkan_instance()\n            ->renderdoc_api();\n    if (renderdoc_api && !renderdoc_api->api_1_0_0()->IsFrameCapturing()) {\n      renderdoc_api->api_1_0_0()->StartFrameCapture(nullptr, nullptr);\n    }\n  }\n\n  void EndHostCapture() override {\n    const ui::RenderDocAPI* const renderdoc_api =\n        static_cast<const ui::vulkan::VulkanProvider*>(\n            graphics_system_->provider())\n            ->vulkan_instance()\n            ->renderdoc_api();\n    if (renderdoc_api && renderdoc_api->api_1_0_0()->IsFrameCapturing()) {\n      renderdoc_api->api_1_0_0()->EndFrameCapture(nullptr, nullptr);\n    }\n  }\n};\n\nint trace_dump_main(const std::vector<std::string>& args) {\n  VulkanTraceDump trace_dump;\n  return trace_dump.Main(args);\n}\n\n}  // namespace vulkan\n}  // namespace gpu\n}  // namespace xe\n\nXE_DEFINE_CONSOLE_APP(\"xenia-gpu-vulkan-trace-dump\",\n                      xe::gpu::vulkan::trace_dump_main, \"some.trace\",\n                      \"target_trace_file\");\n"
  },
  {
    "path": "src/xenia/gpu/vulkan/vulkan_trace_viewer_main.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include <memory>\n#include <string>\n\n#include \"xenia/base/logging.h\"\n#include \"xenia/gpu/trace_viewer.h\"\n#include \"xenia/gpu/vulkan/vulkan_command_processor.h\"\n#include \"xenia/gpu/vulkan/vulkan_graphics_system.h\"\n\nnamespace xe {\nnamespace gpu {\nnamespace vulkan {\n\nclass VulkanTraceViewer final : public TraceViewer {\n public:\n  static std::unique_ptr<WindowedApp> Create(\n      xe::ui::WindowedAppContext& app_context) {\n    return std::unique_ptr<WindowedApp>(new VulkanTraceViewer(app_context));\n  }\n\n  std::unique_ptr<gpu::GraphicsSystem> CreateGraphicsSystem() override {\n    return std::unique_ptr<gpu::GraphicsSystem>(new VulkanGraphicsSystem());\n  }\n\n  uintptr_t GetColorRenderTarget(\n      uint32_t pitch, xenos::MsaaSamples samples, uint32_t base,\n      xenos::ColorRenderTargetFormat format) override {\n    // TODO(Triang3l): EDRAM viewer.\n    return 0;\n  }\n\n  uintptr_t GetDepthRenderTarget(\n      uint32_t pitch, xenos::MsaaSamples samples, uint32_t base,\n      xenos::DepthRenderTargetFormat format) override {\n    // TODO(Triang3l): EDRAM viewer.\n    return 0;\n  }\n\n  uintptr_t GetTextureEntry(const TextureInfo& texture_info,\n                            const SamplerInfo& sampler_info) override {\n    // TODO(Triang3l): Textures, but from a fetch constant rather than\n    // TextureInfo/SamplerInfo which are going away.\n    return 0;\n  }\n\n private:\n  explicit VulkanTraceViewer(xe::ui::WindowedAppContext& app_context)\n      : TraceViewer(app_context, \"xenia-gpu-vulkan-trace-viewer\") {}\n};\n\n}  // namespace vulkan\n}  // namespace gpu\n}  // namespace xe\n\nXE_DEFINE_WINDOWED_APP(xenia_gpu_vulkan_trace_viewer,\n                       xe::gpu::vulkan::VulkanTraceViewer::Create);\n"
  },
  {
    "path": "src/xenia/gpu/xenos.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/gpu/xenos.h\"\n\n#include <cmath>\n\n#include \"xenia/base/math.h\"\n#include \"xenia/base/memory.h\"\n\nnamespace xe {\nnamespace gpu {\nnamespace xenos {\n\n// Based on X360GammaToLinear and X360LinearToGamma from the Source Engine, with\n// additional logic from Direct3D 9 code in game executable disassembly, located\n// via the floating-point constants involved.\n// https://github.com/ValveSoftware/source-sdk-2013/blob/master/mp/src/mathlib/color_conversion.cpp#L329\n// These are provided here in part as a reference for shader translators.\n\nfloat PWLGammaToLinear(float gamma) {\n  // Not found in game executables, so just using the logic similar to that in\n  // the Source Engine.\n  gamma = xe::saturate(gamma);\n  float scale, offset;\n  // While the compiled code for linear to gamma conversion uses `vcmpgtfp\n  // constant, value` comparison (constant > value, or value < constant), it's\n  // preferable to use `value >= constant` condition for the higher pieces, as\n  // it will never pass for NaN, and in case of NaN, the 0...64/255 case will be\n  // selected regardless of whether it's saturated before or after the\n  // comparisons (always pre-saturating here, but shader translators may choose\n  // to saturate later for convenience), as saturation will flush NaN to 0.\n  if (gamma >= 96.0f / 255.0f) {\n    if (gamma >= 192.0f / 255.0f) {\n      scale = 8.0f / 1024.0f;\n      offset = -1024.0f;\n    } else {\n      scale = 4.0f / 1024.0f;\n      offset = -256.0f;\n    }\n  } else {\n    if (gamma >= 64.0f / 255.0f) {\n      scale = 2.0f / 1024.0f;\n      offset = -64.0f;\n    } else {\n      scale = 1.0f / 1024.0f;\n      offset = 0.0f;\n      // No `floor` term in this case in the Source Engine, but for the largest\n      // value, 1.0, `floor(255.0f * (1.0f / 1024.0f))` is 0 anyway.\n    }\n  }\n  // Though in the Source Engine, the 1/1024 multiplication is done for the\n  // truncated part specifically, pre-baking it into the scale is lossless -\n  // both 1024 and `scale` are powers of 2.\n  float linear = gamma * ((255.0f * 1024.0f) * scale) + offset;\n  // For consistency with linear to gamma, and because it's more logical here\n  // (0 rather than 1 at -epsilon), using `trunc` instead of `floor`.\n  linear += std::trunc(linear * scale);\n  linear *= 1.0f / 1023.0f;\n  // Clamping is not necessary (1 * (255 * 8) - 1024 + 7 is exactly 1023).\n  return linear;\n}\n\nfloat LinearToPWLGamma(float linear) {\n  linear = xe::saturate(linear);\n  float scale, offset;\n  // While the compiled code uses `vcmpgtfp constant, value` comparison\n  // (constant > value, or value < constant), it's preferable to use `value >=\n  // constant` condition for the higher pieces, as it will never pass for NaN,\n  // and in case of NaN, the 0...64/1023 case will be selected regardless of\n  // whether it's saturated before or after the comparisons (always\n  // pre-saturating here, but shader translators may choose to saturate later\n  // for convenience), as saturation will flush NaN to 0.\n  if (linear >= 128.0f / 1023.0f) {\n    if (linear >= 512.0f / 1023.0f) {\n      scale = 1023.0f / 8.0f;\n      offset = 128.0f / 255.0f;\n    } else {\n      scale = 1023.0f / 4.0f;\n      offset = 64.0f / 255.0f;\n    }\n  } else {\n    if (linear >= 64.0f / 1023.0f) {\n      scale = 1023.0f / 2.0f;\n      offset = 32.0f / 255.0f;\n    } else {\n      scale = 1023.0f;\n      offset = 0.0f;\n    }\n  }\n  // The truncation isn't in X360LinearToGamma in the Source Engine, but is\n  // there in Direct3D 9 disassembly (the `vrfiz` instructions).\n  // It also prevents conversion of 1.0 to 1.0034313725490196078431372549016\n  // that's handled via clamping in the Source Engine.\n  // 127.875 (1023 / 8) is truncated to 127, which, after scaling, becomes\n  // 127 / 255, and when 128 / 255 is added, the result is 1.\n  return std::trunc(linear * scale) * (1.0f / 255.0f) + offset;\n}\n\n// https://github.com/Microsoft/DirectXTex/blob/master/DirectXTex/DirectXTexConvert.cpp\n\nfloat Float7e3To32(uint32_t f10) {\n  f10 &= 0x3FF;\n  if (!f10) {\n    return 0.0f;\n  }\n  uint32_t mantissa = f10 & 0x7F;\n  uint32_t exponent = f10 >> 7;\n  if (!exponent) {\n    // Normalize the value in the resulting float.\n    // do { Exponent--; Mantissa <<= 1; } while ((Mantissa & 0x80) == 0)\n    uint32_t mantissa_lzcnt = xe::lzcnt(mantissa) - (32 - 8);\n    exponent = uint32_t(1 - int32_t(mantissa_lzcnt));\n    mantissa = (mantissa << mantissa_lzcnt) & 0x7F;\n  }\n  return xe::memory::Reinterpret<float>(\n      uint32_t(((exponent + 124) << 23) | (mantissa << 3)));\n}\n\n// Based on CFloat24 from d3dref9.dll and the 6e4 code from:\n// https://github.com/Microsoft/DirectXTex/blob/master/DirectXTex/DirectXTexConvert.cpp\n// 6e4 has a different exponent bias allowing [0,512) values, 20e4 allows [0,2).\n\nuint32_t Float32To20e4(float f32, bool round_to_nearest_even) {\n  if (!(f32 > 0.0f)) {\n    // Positive only, and not -0 or NaN.\n    return 0;\n  }\n  auto f32u32 = xe::memory::Reinterpret<uint32_t>(f32);\n  if (f32u32 >= 0x3FFFFFF8) {\n    // Saturate.\n    return 0xFFFFFF;\n  }\n  if (f32u32 < 0x38800000) {\n    // The number is too small to be represented as a normalized 20e4.\n    // Convert it to a denormalized value.\n    uint32_t shift = std::min(uint32_t(113 - (f32u32 >> 23)), uint32_t(24));\n    f32u32 = (0x800000 | (f32u32 & 0x7FFFFF)) >> shift;\n  } else {\n    // Rebias the exponent to represent the value as a normalized 20e4.\n    f32u32 += 0xC8000000u;\n  }\n  if (round_to_nearest_even) {\n    f32u32 += 3 + ((f32u32 >> 3) & 1);\n  }\n  return (f32u32 >> 3) & 0xFFFFFF;\n}\n\nfloat Float20e4To32(uint32_t f24) {\n  f24 &= 0xFFFFFF;\n  if (!f24) {\n    return 0.0f;\n  }\n  uint32_t mantissa = f24 & 0xFFFFF;\n  uint32_t exponent = f24 >> 20;\n  if (!exponent) {\n    // Normalize the value in the resulting float.\n    // do { Exponent--; Mantissa <<= 1; } while ((Mantissa & 0x100000) == 0)\n    uint32_t mantissa_lzcnt = xe::lzcnt(mantissa) - (32 - 21);\n    exponent = uint32_t(1 - int32_t(mantissa_lzcnt));\n    mantissa = (mantissa << mantissa_lzcnt) & 0xFFFFF;\n  }\n  return xe::memory::Reinterpret<float>(\n      uint32_t(((exponent + 112) << 23) | (mantissa << 3)));\n}\n\nconst char* GetColorRenderTargetFormatName(ColorRenderTargetFormat format) {\n  switch (format) {\n    case ColorRenderTargetFormat::k_8_8_8_8:\n      return \"k_8_8_8_8\";\n    case ColorRenderTargetFormat::k_8_8_8_8_GAMMA:\n      return \"k_8_8_8_8_GAMMA\";\n    case ColorRenderTargetFormat::k_2_10_10_10:\n      return \"k_2_10_10_10\";\n    case ColorRenderTargetFormat::k_2_10_10_10_FLOAT:\n      return \"k_2_10_10_10_FLOAT\";\n    case ColorRenderTargetFormat::k_16_16:\n      return \"k_16_16\";\n    case ColorRenderTargetFormat::k_16_16_16_16:\n      return \"k_16_16_16_16\";\n    case ColorRenderTargetFormat::k_16_16_FLOAT:\n      return \"k_16_16_FLOAT\";\n    case ColorRenderTargetFormat::k_16_16_16_16_FLOAT:\n      return \"k_16_16_16_16_FLOAT\";\n    case ColorRenderTargetFormat::k_2_10_10_10_AS_10_10_10_10:\n      return \"k_2_10_10_10_AS_10_10_10_10\";\n    case ColorRenderTargetFormat::k_2_10_10_10_FLOAT_AS_16_16_16_16:\n      return \"k_2_10_10_10_FLOAT_AS_16_16_16_16\";\n    case ColorRenderTargetFormat::k_32_FLOAT:\n      return \"k_32_FLOAT\";\n    case ColorRenderTargetFormat::k_32_32_FLOAT:\n      return \"k_32_32_FLOAT\";\n    default:\n      return \"kUnknown\";\n  }\n}\n\nconst char* GetDepthRenderTargetFormatName(DepthRenderTargetFormat format) {\n  switch (format) {\n    case DepthRenderTargetFormat::kD24S8:\n      return \"kD24S8\";\n    case DepthRenderTargetFormat::kD24FS8:\n      return \"kD24FS8\";\n    default:\n      return \"kUnknown\";\n  }\n}\n\n}  // namespace xenos\n}  // namespace gpu\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/gpu/xenos.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_GPU_XENOS_H_\n#define XENIA_GPU_XENOS_H_\n\n#include <algorithm>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/byte_order.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/memory.h\"\n#include \"xenia/base/platform.h\"\n\nnamespace xe {\nnamespace gpu {\nnamespace xenos {\n\n// enum types used in the GPU registers or the microcode must be : uint32_t or\n// : int32_t, as Visual C++ restarts bit field packing when a field requires\n// different alignment than the previous one, so only 32-bit types must be used\n// in bit fields (registers are 32-bit, and the microcode consists of triples of\n// 32-bit words).\n\nconstexpr fourcc_t kSwapSignature = make_fourcc(\"SWAP\");\n\nenum class ShaderType : uint32_t {\n  kVertex = 0,\n  kPixel = 1,\n};\n\n// Only the lower 24 bits of the vertex index are used (tested on an Adreno 200\n// phone using a GL_UNSIGNED_INT element array buffer with junk in the upper 8\n// bits that had no effect on drawing).\nconstexpr uint32_t kVertexIndexBits = 24;\nconstexpr uint32_t kVertexIndexMask = (uint32_t(1) << kVertexIndexBits) - 1;\n\nenum class PrimitiveType : uint32_t {\n  kNone = 0x00,\n  kPointList = 0x01,\n  kLineList = 0x02,\n  kLineStrip = 0x03,\n  kTriangleList = 0x04,\n  kTriangleFan = 0x05,\n  kTriangleStrip = 0x06,\n  kTriangleWithWFlags = 0x07,\n  kRectangleList = 0x08,\n  kLineLoop = 0x0C,\n  kQuadList = 0x0D,\n  kQuadStrip = 0x0E,\n  kPolygon = 0x0F,\n\n  // Starting with this primitive type, explicit major mode is assumed (in the\n  // R6xx/R7xx registers, k2DCopyRectListV0 is 22, and implicit major mode is\n  // only used for primitive types 0 through 21) - and tessellation patches use\n  // the range that starts from k2DCopyRectListV0.\n  // TODO(Triang3l): Verify if this is also true for the Xenos.\n  kExplicitMajorModeForceStart = 0x10,\n\n  k2DCopyRectListV0 = 0x10,\n  k2DCopyRectListV1 = 0x11,\n  k2DCopyRectListV2 = 0x12,\n  k2DCopyRectListV3 = 0x13,\n  k2DFillRectList = 0x14,\n  k2DLineStrip = 0x15,\n  k2DTriStrip = 0x16,\n\n  // Tessellation patches when VGT_OUTPUT_PATH_CNTL::path_select is\n  // VGTOutputPath::kTessellationEnable. The vertex shader receives the patch\n  // index rather than control point indices.\n  // With non-adaptive tessellation, VGT_DRAW_INITIATOR::num_indices is the\n  // patch count (4D5307F1 draws single ground patches by passing 1 as the index\n  // count). VGT_INDX_OFFSET is also applied to the patch index - 4D5307F1 uses\n  // auto-indexed patches with a nonzero VGT_INDX_OFFSET, which contains the\n  // base patch index there.\n  // With adaptive tessellation, however, num_indices is the number of\n  // tessellation factors in the \"index buffer\" reused for tessellation factors,\n  // which is the patch count multiplied by the edge count (if num_indices is\n  // multiplied further by 4 for quad patches for the ground in 4D5307F2, for\n  // example, some incorrect patches are drawn, so Xenia shouldn't do that; also\n  // 4D5307E6 draws water triangle patches with the number of indices that is 3\n  // times the invocation count of the memexporting shader that calculates the\n  // tessellation factors for a single patch for each \"point\").\n  kLinePatch = 0x10,\n  kTrianglePatch = 0x11,\n  kQuadPatch = 0x12,\n};\n\n// For the texture fetch constant (not the tfetch instruction), stacked stored\n// as 2D.\nenum class DataDimension : uint32_t {\n  k1D = 0,\n  k2DOrStacked = 1,\n  k3D = 2,\n  kCube = 3,\n};\n\nenum class ClampMode : uint32_t {\n  kRepeat = 0,\n  kMirroredRepeat = 1,\n  kClampToEdge = 2,\n  kMirrorClampToEdge = 3,\n  kClampToHalfway = 4,\n  kMirrorClampToHalfway = 5,\n  kClampToBorder = 6,\n  kMirrorClampToBorder = 7,\n};\n\nconstexpr bool ClampModeUsesBorder(ClampMode clamp_mode) {\n  return clamp_mode == ClampMode::kClampToBorder ||\n         clamp_mode == ClampMode::kMirrorClampToBorder;\n}\n\n// TEX_FORMAT_COMP, known as GPUSIGN on the Xbox 360.\nenum class TextureSign : uint32_t {\n  kUnsigned = 0,\n  // Two's complement texture data.\n  kSigned = 1,\n  // 2*color-1 - https://xboxforums.create.msdn.com/forums/t/107374.aspx\n  kUnsignedBiased = 2,\n  // Linearized when sampled.\n  kGamma = 3,\n};\n\nenum class TextureFilter : uint32_t {\n  kPoint = 0,\n  kLinear = 1,\n  // Only applicable to the mip filter - like OpenGL minification filters\n  // GL_NEAREST / GL_LINEAR without MIPMAP_NEAREST / MIPMAP_LINEAR.\n  kBaseMap = 2,\n  kUseFetchConst = 3,\n};\n\nenum class AnisoFilter : uint32_t {\n  kDisabled = 0,\n  kMax_1_1 = 1,\n  kMax_2_1 = 2,\n  kMax_4_1 = 3,\n  kMax_8_1 = 4,\n  kMax_16_1 = 5,\n  kUseFetchConst = 7,\n};\n\nenum class BorderColor : uint32_t {\n  // (0.0, 0.0, 0.0)\n  // TODO(Triang3l): Is the alpha 0 or 1?\n  k_ABGR_Black = 0,\n  // (1.0, 1.0, 1.0, 1.0)\n  k_ABGR_White = 1,\n  // Unknown precisely, but likely (0.5, 0.0, 0.5) for unsigned (Cr, Y, Cb)\n  // TODO(Triang3l): Real hardware border color, and is the alpha 0 or 1?\n  k_ACBYCR_Black = 2,\n  // Unknown precisely, but likely (0.0, 0.5, 0.5) for unsigned (Y, Cr, Cb)\n  // TODO(Triang3l): Real hardware border color, and is the alpha 0 or 1?\n  k_ACBCRY_Black = 3,\n};\n\n// For the tfetch instruction (not the fetch constant) and related instructions,\n// stacked accessed using tfetch3D.\nenum class FetchOpDimension : uint32_t {\n  k1D = 0,\n  k2D = 1,\n  k3DOrStacked = 2,\n  kCube = 3,\n};\n\ninline int GetFetchOpDimensionComponentCount(FetchOpDimension dimension) {\n  switch (dimension) {\n    case FetchOpDimension::k1D:\n      return 1;\n    case FetchOpDimension::k2D:\n      return 2;\n    case FetchOpDimension::k3DOrStacked:\n    case FetchOpDimension::kCube:\n      return 3;\n    default:\n      assert_unhandled_case(dimension);\n      return 1;\n  }\n}\n\nenum class SampleLocation : uint32_t {\n  kCentroid = 0,\n  kCenter = 1,\n};\n\nenum class Endian : uint32_t {\n  kNone = 0,\n  k8in16 = 1,\n  k8in32 = 2,\n  k16in32 = 3,\n};\n\nenum class Endian128 : uint32_t {\n  kNone = 0,\n  k8in16 = 1,\n  k8in32 = 2,\n  k16in32 = 3,\n  k8in64 = 4,\n  k8in128 = 5,\n};\n\nenum class IndexFormat : uint32_t {\n  kInt16,\n  // Not very common, but used for some world draws in 545407E0.\n  kInt32,\n};\n\n// SurfaceNumberX from yamato_enum.h.\nenum class SurfaceNumberFormat : uint32_t {\n  kUnsignedRepeatingFraction = 0,\n  // Microsoft-style, scale factor (2^(n-1))-1.\n  kSignedRepeatingFraction = 1,\n  kUnsignedInteger = 2,\n  kSignedInteger = 3,\n  kFloat = 7,\n};\n\n// The EDRAM is an opaque block of memory accessible by the RB (render backend)\n// pipeline stage of the GPU, which performs output-merger functionality (color\n// render target writing and blending, depth and stencil testing) and resolve\n// (copy) operations.\n//\n// Data in the 10 MiB of EDRAM is laid out as 2048 tiles on 80x16 32bpp MSAA\n// samples. With 2x MSAA, one pixel consists of 1x2 samples, and with 4x, it\n// consists of 2x2 samples. Thus, for a 32bpp render target, one tile contains\n// 80x16 pixels without MSAA, samples of 80x8 pixels with 2x MSAA, or samples of\n// 40x8 pixels with 4x MSAA. The base is specified in tiles, the pitch is also\n// treated as tiles (so a 256x single-sampled surface will be stored in the\n// EDRAM as 320x).\n//\n// XGSurfaceSize code in game executables calculates the size in tiles in the\n// following order:\n// 1) If MSAA is >=2x, multiply the height by 2.\n// 2) If MSAA is 4x, multiply the width by 2.\n// 3) 80x16-align width and height in samples.\n// 4) Multiply width*height in samples by 4 or 8 depending on the pixel format.\n// 5) Divide the byte size by 5120.\n// This means that when working with layout of surfaces in the EDRAM, it should\n// be assumed that a multisampled surface is the same as a single-sampled\n// surface with 2x height and (with 4x MSAA) width - however, format size\n// doesn't effect the dimensions, 64bpp surfaces take twice as many tiles as\n// 32bpp surfaces.\n//\n// From this, it follows that the tile row pitch in tiles can be multiplied by\n// 64bpp too. In the formula for calculating the tile count:\n// (height rounded up to 16) * (width rounded up to 80) * (4 or 8) / 5120\n// the fraction can be reduced because the numerator is always divisible by\n// 5120 - it changes in 80 * 16 * 4 = 5120 increments - in tile increments -\n// resulting in:\n// (height in tiles) * (width in tiles) * (1 or 2)\n// Here we get only multiplication, which (disregarding the variable size) is\n// associative for integers, so:\n// ((height in tiles) * (width in tiles)) * (1 or 2)\n// is identical to:\n// (height in tiles) * ((width in tiles) * (1 or 2))\n//\n// Depth surfaces are also stored as 32bpp tiles, however, as opposed to color\n// surfaces, 40x16-sample halves of each tile are swapped - game shaders (for\n// example, in 4D5307E6 main menu, 545407F2) perform this swapping when writing\n// specific depth/stencil values by drawing to a depth buffer's memory through a\n// color render target (to reupload a depth/stencil surface previously evicted\n// from the EDRAM to the main memory, for instance).\n//\n// EDRAM addressing is circular - a render target may be backed by a EDRAM range\n// that extends beyond 2048 tiles, in which case, what would go to the tile 2048\n// will actually be in tile 0, tile 2049 will go to tile 1, and so on. 4D5307F1\n// heavily relies on this behavior for its depth buffer. Specifically, it's used\n// the following way:\n// - First, a depth-only 1120x720 2xMSAA pass is performed with the depth buffer\n//   in tiles [1008, 2268), or [1008, 2048) and [0, 220).\n// - Then, the depth buffer in [1008, 2268) is resolved into a texture, later\n//   used in screen-space effects.\n// - The upper 1120x576 bin is drawn into the color buffer in [0, 1008), using\n//   the [1008, 2016) portion of the previously populated depth buffer for early\n//   depth testing (there seems to be no true early Z on the Xenos, only early\n//   hi-Z, but still it possibly needs to be in sync with the per-sample depth\n//   buffer), and overwriting the tail of the previously filled depth buffer in\n//   [0, 220).\n// - The lower 1120x144 bin is drawn without the pregenerated depth buffer data.\n\nenum class MsaaSamples : uint32_t {\n  k1X = 0,\n  k2X = 1,\n  k4X = 2,\n};\n\nconstexpr uint32_t kMsaaSamplesBits = 2;\n\nconstexpr uint32_t kColorRenderTargetIndexBits = 2;\nconstexpr uint32_t kMaxColorRenderTargets = 4;\n\nenum class ColorRenderTargetFormat : uint32_t {\n  k_8_8_8_8 = 0,\n  k_8_8_8_8_GAMMA = 1,\n  k_2_10_10_10 = 2,\n  // 7e3 [0, 32) RGB, unorm alpha.\n  // http://fileadmin.cs.lth.se/cs/Personal/Michael_Doggett/talks/eg05-xenos-doggett.pdf\n  k_2_10_10_10_FLOAT = 3,\n  // Fixed point -32...32.\n  // http://www.students.science.uu.nl/~3220516/advancedgraphics/papers/inferred_lighting.pdf\n  k_16_16 = 4,\n  // Fixed point -32...32.\n  k_16_16_16_16 = 5,\n  k_16_16_FLOAT = 6,\n  k_16_16_16_16_FLOAT = 7,\n  k_2_10_10_10_AS_10_10_10_10 = 10,\n  // 16-bit fixed point at half speed, with full blending.\n  // http://fileadmin.cs.lth.se/cs/Personal/Michael_Doggett/talks/unc-xenos-doggett.pdf\n  k_2_10_10_10_FLOAT_AS_16_16_16_16 = 12,\n  k_32_FLOAT = 14,\n  k_32_32_FLOAT = 15,\n};\n\nconst char* GetColorRenderTargetFormatName(ColorRenderTargetFormat format);\n\nconstexpr bool IsColorRenderTargetFormat64bpp(ColorRenderTargetFormat format) {\n  return format == ColorRenderTargetFormat::k_16_16_16_16 ||\n         format == ColorRenderTargetFormat::k_16_16_16_16_FLOAT ||\n         format == ColorRenderTargetFormat::k_32_32_FLOAT;\n}\n\ninline uint32_t GetColorRenderTargetFormatComponentCount(\n    ColorRenderTargetFormat format) {\n  switch (format) {\n    case ColorRenderTargetFormat::k_8_8_8_8:\n    case ColorRenderTargetFormat::k_8_8_8_8_GAMMA:\n    case ColorRenderTargetFormat::k_2_10_10_10:\n    case ColorRenderTargetFormat::k_2_10_10_10_FLOAT:\n    case ColorRenderTargetFormat::k_16_16_16_16:\n    case ColorRenderTargetFormat::k_16_16_16_16_FLOAT:\n    case ColorRenderTargetFormat::k_2_10_10_10_AS_10_10_10_10:\n    case ColorRenderTargetFormat::k_2_10_10_10_FLOAT_AS_16_16_16_16:\n      return 4;\n    case ColorRenderTargetFormat::k_16_16:\n    case ColorRenderTargetFormat::k_16_16_FLOAT:\n    case ColorRenderTargetFormat::k_32_32_FLOAT:\n      return 2;\n    case ColorRenderTargetFormat::k_32_FLOAT:\n      return 1;\n    default:\n      assert_unhandled_case(format);\n      return 0;\n  }\n}\n\n// Returns the version of the format with the same packing and meaning of values\n// stored in it, but without blending precision modifiers.\nconstexpr ColorRenderTargetFormat GetStorageColorFormat(\n    ColorRenderTargetFormat format) {\n  switch (format) {\n    case ColorRenderTargetFormat::k_2_10_10_10_AS_10_10_10_10:\n      return ColorRenderTargetFormat::k_2_10_10_10;\n    case ColorRenderTargetFormat::k_2_10_10_10_FLOAT_AS_16_16_16_16:\n      return ColorRenderTargetFormat::k_2_10_10_10_FLOAT;\n    default:\n      return format;\n  }\n}\n\nenum class DepthRenderTargetFormat : uint32_t {\n  kD24S8 = 0,\n  // 20e4 [0, 2).\n  kD24FS8 = 1,\n};\n\nconst char* GetDepthRenderTargetFormatName(DepthRenderTargetFormat format);\n\nfloat PWLGammaToLinear(float gamma);\nfloat LinearToPWLGamma(float linear);\n\n// Converts Xenos floating-point 7e3 color value in bits 0:9 (not clamping) to\n// an IEEE-754 32-bit floating-point number.\nfloat Float7e3To32(uint32_t f10);\n// Converts 24-bit unorm depth in the value (not clamping) to an IEEE-754 32-bit\n// floating-point number.\n// Converts an IEEE-754 32-bit floating-point number to Xenos floating-point\n// depth, rounding to the nearest even or towards zero.\nuint32_t Float32To20e4(float f32, bool round_to_nearest_even);\n// Converts Xenos floating-point depth in bits 0:23 (not clamping) to an\n// IEEE-754 32-bit floating-point number.\nfloat Float20e4To32(uint32_t f24);\n// Converts 24-bit unorm depth in the value (not clamping) to an IEEE-754 32-bit\n// floating-point number.\nconstexpr float UNorm24To32(uint32_t n24) {\n  // Not 1.0f / 16777215.0f as that gives an incorrect result (like for a very\n  // common 0xC00000 which clears 2_10_10_10 to 0001). Division by 2^24 is just\n  // an exponent shift though, thus exact.\n  // Division by 16777215.0f behaves this way.\n  return float(n24 + (n24 >> 23)) * (1.0f / float(1 << 24));\n}\n\n// Scale for conversion of slope scales from PA_SU_POLY_OFFSET_FRONT/BACK_SCALE\n// units to those used when the slope is computed from the difference between\n// adjacent pixels, for conversion from the guest to common host APIs or to\n// calculation using max(|ddx(z)|, |ddy(z)|).\n// \"slope computed in subpixels (1/12 or 1/16)\" - R5xx Acceleration.\n// But the correct scale for conversion of the slope scale from subpixels to\n// pixels is likely 1/16 according to:\n// https://github.com/mesa3d/mesa/blob/54ad9b444c8e73da498211870e785239ad3ff1aa/src/gallium/drivers/radeonsi/si_state.c#L946\nconstexpr float kPolygonOffsetScaleSubpixelUnit = 1.0f / 16.0f;\n\nconstexpr uint32_t kColorRenderTargetFormatBits = 4;\nconstexpr uint32_t kDepthRenderTargetFormatBits = 1;\nconstexpr uint32_t kRenderTargetFormatBits =\n    std::max(kColorRenderTargetFormatBits, kDepthRenderTargetFormatBits);\n\nconstexpr uint32_t kEdramTileWidthSamples = 80;\nconstexpr uint32_t kEdramTileHeightSamples = 16;\nconstexpr uint32_t kEdramTileCount = 2048;\nconstexpr uint32_t kEdramSizeBytes = kEdramTileCount * kEdramTileHeightSamples *\n                                     kEdramTileWidthSamples * sizeof(uint32_t);\n\n// RB_SURFACE_INFO::surface_pitch width.\nconstexpr uint32_t kEdramPitchPixelsBits = 14;\n// The part of RB_COLOR_INFO::color_base and RB_DEPTH_INFO::depth_base width\n// usable on the Xenos, which has periodic 11-bit EDRAM tile addressing.\nconstexpr uint32_t kEdramBaseTilesBits = 11;\n\nconstexpr uint32_t GetSurfacePitchTiles(uint32_t pitch_pixels,\n                                        MsaaSamples msaa_samples,\n                                        bool is_64bpp) {\n  uint32_t pitch_samples = pitch_pixels\n                           << uint32_t(msaa_samples >= MsaaSamples::k4X);\n  uint32_t pitch_tiles =\n      (pitch_samples + (kEdramTileWidthSamples - 1)) / kEdramTileWidthSamples;\n  if (is_64bpp) {\n    pitch_tiles <<= 1;\n  }\n  return pitch_tiles;\n}\n\n// log2_ceil of the maximum value of GetSurfacePitchTiles, assuming 16383 being\n// the maximum pitch in pixels (not sure about the validity of values above\n// 8192, but to avoid bounds checking).\n// log2_ceil of 16383, multiplied by 2 for 4x MSAA, rounded to 80 samples,\n// multiplied by 2 for 64bpp.\nconstexpr uint32_t kEdramPitchTilesBits = 10;\n\nconstexpr uint32_t kFormatBits = 6;\n\n// a2xx_sq_surfaceformat +\n// https://github.com/indirivacua/RAGE-Console-Texture-Editor/blob/master/Console.Xbox360.Graphics.pas\nenum class TextureFormat : uint32_t {\n  k_1_REVERSE = 0,\n  k_1 = 1,\n  k_8 = 2,\n  k_1_5_5_5 = 3,\n  k_5_6_5 = 4,\n  k_6_5_5 = 5,\n  k_8_8_8_8 = 6,\n  k_2_10_10_10 = 7,\n  // Possibly similar to k_8, but may be storing alpha instead of red when\n  // resolving/memexporting, though not exactly known. From the point of view of\n  // sampling, it should be treated the same as k_8 (given that textures have\n  // the last - and single-component textures have the only - component\n  // replicated into all the remaining ones before the swizzle).\n  // Used as:\n  // - Texture in 4B4E083C - text, starting from the \"Loading...\" and the \"This\n  //   game saves data automatically\" messages. The swizzle in the fetch\n  //   constant is 111W (suggesting that internally the only component may be\n  //   the alpha one, not red).\n  // TODO(Triang3l): Investigate how k_8_A and k_8_B work in resolves and\n  // memexports, whether they store alpha/blue of the input or red.\n  k_8_A = 8,\n  k_8_B = 9,\n  k_8_8 = 10,\n  // Though it's unknown what exactly REP means, likely it's \"repeating\n  // fraction\" (the term used for normalized fixed-point formats, UNORM in\n  // particular for unsigned signedness - 0.0 to 1.0 range, like in\n  // Direct3D 10+, unlike the 0.0 to 255.0 range for D3DFMT_R8G8_B8G8 and\n  // D3DFMT_G8R8_G8B8 in Direct3D 9). 54540829 uses k_Y1_Cr_Y0_Cb_REP directly\n  // as UNORM.\n  k_Cr_Y1_Cb_Y0_REP = 11,\n  // Used for videos in 54540829.\n  k_Y1_Cr_Y0_Cb_REP = 12,\n  k_16_16_EDRAM = 13,\n  // Likely same as k_8_8_8_8.\n  // Used as:\n  // - Memexport destination in 4D5308BC - multiple small draws when looking\n  //   back at the door behind the player in the first room of gameplay.\n  // - Memexport destination in 4D53085B and 4D530919 - in 4D53085B, in a frame\n  //   between the intro video and the main menu, in a 8192-point draw.\n  k_8_8_8_8_A = 14,\n  k_4_4_4_4 = 15,\n  k_10_11_11 = 16,\n  k_11_11_10 = 17,\n  k_DXT1 = 18,\n  k_DXT2_3 = 19,\n  k_DXT4_5 = 20,\n  k_16_16_16_16_EDRAM = 21,\n  k_24_8 = 22,\n  k_24_8_FLOAT = 23,\n  k_16 = 24,\n  k_16_16 = 25,\n  k_16_16_16_16 = 26,\n  k_16_EXPAND = 27,\n  k_16_16_EXPAND = 28,\n  k_16_16_16_16_EXPAND = 29,\n  k_16_FLOAT = 30,\n  k_16_16_FLOAT = 31,\n  k_16_16_16_16_FLOAT = 32,\n  k_32 = 33,\n  k_32_32 = 34,\n  k_32_32_32_32 = 35,\n  k_32_FLOAT = 36,\n  k_32_32_FLOAT = 37,\n  k_32_32_32_32_FLOAT = 38,\n  k_32_AS_8 = 39,\n  k_32_AS_8_8 = 40,\n  k_16_MPEG = 41,\n  k_16_16_MPEG = 42,\n  k_8_INTERLACED = 43,\n  k_32_AS_8_INTERLACED = 44,\n  k_32_AS_8_8_INTERLACED = 45,\n  k_16_INTERLACED = 46,\n  k_16_MPEG_INTERLACED = 47,\n  k_16_16_MPEG_INTERLACED = 48,\n  k_DXN = 49,\n  k_8_8_8_8_AS_16_16_16_16 = 50,\n  k_DXT1_AS_16_16_16_16 = 51,\n  k_DXT2_3_AS_16_16_16_16 = 52,\n  k_DXT4_5_AS_16_16_16_16 = 53,\n  k_2_10_10_10_AS_16_16_16_16 = 54,\n  k_10_11_11_AS_16_16_16_16 = 55,\n  k_11_11_10_AS_16_16_16_16 = 56,\n  k_32_32_32_FLOAT = 57,\n  k_DXT3A = 58,\n  k_DXT5A = 59,\n  k_CTX1 = 60,\n  k_DXT3A_AS_1_1_1_1 = 61,\n  k_8_8_8_8_GAMMA_EDRAM = 62,\n  k_2_10_10_10_FLOAT_EDRAM = 63,\n};\n\n// Subset of a2xx_sq_surfaceformat - formats that RTs can be resolved to.\nenum class ColorFormat : uint32_t {\n  k_8 = 2,\n  k_1_5_5_5 = 3,\n  k_5_6_5 = 4,\n  k_6_5_5 = 5,\n  k_8_8_8_8 = 6,\n  k_2_10_10_10 = 7,\n  k_8_A = 8,\n  k_8_B = 9,\n  k_8_8 = 10,\n  k_8_8_8_8_A = 14,\n  k_4_4_4_4 = 15,\n  k_10_11_11 = 16,\n  k_11_11_10 = 17,\n  k_16 = 24,\n  k_16_16 = 25,\n  k_16_16_16_16 = 26,\n  k_16_FLOAT = 30,\n  k_16_16_FLOAT = 31,\n  k_16_16_16_16_FLOAT = 32,\n  k_32_FLOAT = 36,\n  k_32_32_FLOAT = 37,\n  k_32_32_32_32_FLOAT = 38,\n  k_8_8_8_8_AS_16_16_16_16 = 50,\n  k_2_10_10_10_AS_16_16_16_16 = 54,\n  k_10_11_11_AS_16_16_16_16 = 55,\n  k_11_11_10_AS_16_16_16_16 = 56,\n};\n\n// Resolve writes unsigned data for fixed-point formats (so k_16_16 and\n// k_16_16_16_16 render target formats, which are signed and also have a\n// different range, are not equivalent to the respective texture formats).\nconstexpr bool IsColorResolveFormatBitwiseEquivalent(\n    ColorRenderTargetFormat render_target_format, ColorFormat color_format) {\n  switch (render_target_format) {\n    case ColorRenderTargetFormat::k_8_8_8_8:\n    // Shaders fetch data copied from k_8_8_8_8_GAMMA with TextureSign::kGamma.\n    case ColorRenderTargetFormat::k_8_8_8_8_GAMMA:\n      // TODO(Triang3l): Investigate k_8_8_8_8_A.\n      return color_format == ColorFormat::k_8_8_8_8 ||\n             color_format == ColorFormat::k_8_8_8_8_A ||\n             color_format == ColorFormat::k_8_8_8_8_AS_16_16_16_16;\n    case ColorRenderTargetFormat::k_2_10_10_10:\n    case ColorRenderTargetFormat::k_2_10_10_10_AS_10_10_10_10:\n      return color_format == ColorFormat::k_2_10_10_10 ||\n             color_format == ColorFormat::k_2_10_10_10_AS_16_16_16_16;\n    case ColorRenderTargetFormat::k_16_16_FLOAT:\n      return color_format == ColorFormat::k_16_16_FLOAT;\n    case ColorRenderTargetFormat::k_16_16_16_16_FLOAT:\n      return color_format == ColorFormat::k_16_16_16_16_FLOAT;\n    case ColorRenderTargetFormat::k_32_FLOAT:\n      return color_format == ColorFormat::k_32_FLOAT;\n    case ColorRenderTargetFormat::k_32_32_FLOAT:\n      return color_format == ColorFormat::k_32_32_FLOAT;\n    default:\n      return false;\n  }\n}\n\nenum class VertexFormat : uint32_t {\n  kUndefined = 0,\n  k_8_8_8_8 = 6,\n  k_2_10_10_10 = 7,\n  k_10_11_11 = 16,\n  k_11_11_10 = 17,\n  k_16_16 = 25,\n  k_16_16_16_16 = 26,\n  k_16_16_FLOAT = 31,\n  k_16_16_16_16_FLOAT = 32,\n  k_32 = 33,\n  k_32_32 = 34,\n  k_32_32_32_32 = 35,\n  k_32_FLOAT = 36,\n  k_32_32_FLOAT = 37,\n  k_32_32_32_32_FLOAT = 38,\n  k_32_32_32_FLOAT = 57,\n};\n\ninline int GetVertexFormatComponentCount(VertexFormat format) {\n  switch (format) {\n    case VertexFormat::k_32:\n    case VertexFormat::k_32_FLOAT:\n      return 1;\n    case VertexFormat::k_16_16:\n    case VertexFormat::k_16_16_FLOAT:\n    case VertexFormat::k_32_32:\n    case VertexFormat::k_32_32_FLOAT:\n      return 2;\n    case VertexFormat::k_10_11_11:\n    case VertexFormat::k_11_11_10:\n    case VertexFormat::k_32_32_32_FLOAT:\n      return 3;\n    case VertexFormat::k_8_8_8_8:\n    case VertexFormat::k_2_10_10_10:\n    case VertexFormat::k_16_16_16_16:\n    case VertexFormat::k_16_16_16_16_FLOAT:\n    case VertexFormat::k_32_32_32_32:\n    case VertexFormat::k_32_32_32_32_FLOAT:\n      return 4;\n    default:\n      assert_unhandled_case(format);\n      return 0;\n  }\n}\n\ninline uint32_t GetVertexFormatNeededWords(VertexFormat format,\n                                           uint32_t used_components) {\n  assert_zero(used_components & ~uint32_t(0b1111));\n  if (!used_components) {\n    return 0;\n  }\n  switch (format) {\n    case VertexFormat::k_8_8_8_8:\n    case VertexFormat::k_2_10_10_10:\n      return 0b0001;\n    case VertexFormat::k_10_11_11:\n    case VertexFormat::k_11_11_10:\n      return (used_components & 0b0111) ? 0b0001 : 0b0000;\n    case VertexFormat::k_16_16:\n    case VertexFormat::k_16_16_FLOAT:\n      return (used_components & 0b0011) ? 0b0001 : 0b0000;\n    case VertexFormat::k_16_16_16_16:\n    case VertexFormat::k_16_16_16_16_FLOAT:\n      return ((used_components & 0b0011) ? 0b0001 : 0b0000) |\n             ((used_components & 0b1100) ? 0b0010 : 0b0000);\n    case VertexFormat::k_32:\n    case VertexFormat::k_32_FLOAT:\n      return used_components & 0b0001;\n    case VertexFormat::k_32_32:\n    case VertexFormat::k_32_32_FLOAT:\n      return used_components & 0b0011;\n    case VertexFormat::k_32_32_32_32:\n    case VertexFormat::k_32_32_32_32_FLOAT:\n      return used_components;\n    case VertexFormat::k_32_32_32_FLOAT:\n      return used_components & 0b0111;\n    default:\n      assert_unhandled_case(format);\n      return 0b0000;\n  }\n}\n\nenum class CompareFunction : uint32_t {\n  kNever = 0b000,\n  kLess = 0b001,\n  kEqual = 0b010,\n  kLessEqual = 0b011,\n  kGreater = 0b100,\n  kNotEqual = 0b101,\n  kGreaterEqual = 0b110,\n  kAlways = 0b111,\n};\n\nenum class StencilOp : uint32_t {\n  kKeep = 0,\n  kZero = 1,\n  kReplace = 2,\n  kIncrementClamp = 3,\n  kDecrementClamp = 4,\n  kInvert = 5,\n  kIncrementWrap = 6,\n  kDecrementWrap = 7,\n};\n\n// adreno_rb_blend_factor\nenum class BlendFactor : uint32_t {\n  kZero = 0,\n  kOne = 1,\n  kSrcColor = 4,\n  kOneMinusSrcColor = 5,\n  kSrcAlpha = 6,\n  kOneMinusSrcAlpha = 7,\n  kDstColor = 8,\n  kOneMinusDstColor = 9,\n  kDstAlpha = 10,\n  kOneMinusDstAlpha = 11,\n  kConstantColor = 12,\n  kOneMinusConstantColor = 13,\n  kConstantAlpha = 14,\n  kOneMinusConstantAlpha = 15,\n  kSrcAlphaSaturate = 16,\n  // SRC1 added on Adreno.\n};\n\nenum class BlendOp : uint32_t {\n  kAdd = 0,\n  kSubtract = 1,\n  kMin = 2,\n  kMax = 3,\n  kRevSubtract = 4,\n};\n\ntypedef enum {\n  XE_GPU_INVALIDATE_MASK_VERTEX_SHADER = 1 << 8,\n  XE_GPU_INVALIDATE_MASK_PIXEL_SHADER = 1 << 9,\n\n  XE_GPU_INVALIDATE_MASK_ALL = 0x7FFF,\n} XE_GPU_INVALIDATE_MASK;\n\n// VGT_DRAW_INITIATOR::DI_SRC_SEL_*\nenum class SourceSelect : uint32_t {\n  kDMA,\n  kImmediate,\n  kAutoIndex,\n};\n\n// VGT_DRAW_INITIATOR::DI_MAJOR_MODE_*\nenum class MajorMode : uint32_t {\n  kImplicit,\n  kExplicit,\n};\n\ninline bool IsMajorModeExplicit(MajorMode major_mode,\n                                PrimitiveType primitive_type) {\n  return major_mode != MajorMode::kImplicit ||\n         primitive_type >= PrimitiveType::kExplicitMajorModeForceStart;\n}\n\nenum class SignedRepeatingFractionMode : uint32_t {\n  // Microsoft-style representation with two -1 representations (one is slightly\n  // past -1 but clamped).\n  kZeroClampMinusOne,\n  // OpenGL \"alternate mapping\" format lacking representation for zero.\n  kNoZero,\n};\n\n// Arbitrary filter is still present in the Code Aurora Forum release of the\n// Adreno 200 programming interface, but is deprecated according to the\n// IPR2015-00325 R400 Document Library Folder History:\n//   \"Change 124923 on 2003/10/03 by jhoule@jhoule_doc_lt\n//   [...]\n//   Deprecated the ARBITRARY_FILTER fields from TFetch instr+const.\"\nenum class ArbitraryFilter : uint32_t {\n  k2x4Sym = 0,\n  k2x4Asym = 1,\n  k4x2Sym = 2,\n  k4x2Asym = 3,\n  k4x4Sym = 4,\n  k4x4Asym = 5,\n  kUseFetchConst = 7,\n};\n\nconstexpr uint32_t kMaxShaderTempRegistersLog2 = 6;\nconstexpr uint32_t kMaxShaderTempRegisters = UINT32_C(1)\n                                             << kMaxShaderTempRegistersLog2;\n\n// a2xx_sq_ps_vtx_mode\nenum class VertexShaderExportMode : uint32_t {\n  kPosition1Vector = 0,\n  kPosition2VectorsSprite = 2,\n  kPosition2VectorsEdge = 3,\n  kPosition2VectorsKill = 4,\n  kPosition2VectorsSpriteKill = 5,\n  kPosition2VectorsEdgeKill = 6,\n  // Vertex shader outputs are ignored (kill all primitives) - see\n  // SX_MISC::MULTIPASS on R6xx/R7xx.\n  kMultipass = 7,\n};\n\nconstexpr uint32_t kMaxInterpolators = 16;\n\nenum class SampleControl : uint32_t {\n  kCentroidsOnly = 0,\n  kCentersOnly = 1,\n  kCentroidsAndCenters = 2,\n};\n\n// - msaa_samples is RB_SURFACE_INFO::msaa_samples.\n// - sample_control is SQ_CONTEXT_MISC::sc_sample_cntl.\n// - interpolator_control_sampling_pattern is\n//   SQ_INTERPOLATOR_CNTL::sampling_pattern.\n// Centroid interpolation can be tested in 5454082B. If the GPU host backend\n// implements guest MSAA properly, using host MSAA, with everything interpolated\n// at centers, the Monument Valley start screen background may have a few\n// distinctly bright pixels on the mesas/buttes, where extrapolation happens.\n// Interpolating certain values (ones that aren't used for gradient calculation,\n// not texture coordinates) at centroids fixes this issue.\ninline uint32_t GetInterpolatorSamplingPattern(\n    MsaaSamples msaa_samples, SampleControl sample_control,\n    uint32_t interpolator_control_sampling_pattern) {\n  if (msaa_samples == MsaaSamples::k1X ||\n      sample_control == SampleControl::kCentersOnly) {\n    return ((1 << kMaxInterpolators) - 1) * uint32_t(SampleLocation::kCenter);\n  }\n  if (sample_control == SampleControl::kCentroidsOnly) {\n    return ((1 << kMaxInterpolators) - 1) * uint32_t(SampleLocation::kCentroid);\n  }\n  assert_true(sample_control == SampleControl::kCentroidsAndCenters);\n  return interpolator_control_sampling_pattern;\n}\n\nenum class VGTOutputPath : uint32_t {\n  kVertexReuse = 0,\n  kTessellationEnable = 1,\n  kPassthru = 2,\n};\n\nenum class TessellationMode : uint32_t {\n  kDiscrete = 0,\n  kContinuous = 1,\n  kAdaptive = 2,\n};\n\nenum class PolygonModeEnable : uint32_t {\n  kDisabled = 0,  // Render triangles.\n  kDualMode = 1,  // Send 2 sets of 3 polygons with the specified polygon type.\n  // 4541096E uses 2 for triangles, which is \"reserved\" on R6xx and not defined\n  // on Adreno 2xx, but polymode_front/back_ptype are 0 (points) in this case in\n  // 4541096E, which should not be respected for non-kDualMode as the title\n  // wants to draw filled triangles.\n};\n\nenum class PolygonType : uint32_t {\n  kPoints = 0,\n  kLines = 1,\n  kTriangles = 2,\n};\n\nenum class PixelCenter : uint32_t {\n  // Pixel center at vertex positions .0, like in Direct3D 9.\n  // Commonly used in Xbox 360 games.\n  kD3DZero = 0,\n  // Pixel center at vertex positions .5, like in OpenGL.\n  // Used in 415607E6.\n  kOGLHalf = 1,\n};\n\nenum class VertexRounding : uint32_t {\n  kTruncate = 0,  // OpenGL.\n  kRound = 1,\n  kRoundToEven = 2,  // Direct3D. Common in Xbox 360 games.\n  kRoundToOdd = 3,\n};\n\nenum class VertexQuantization : uint32_t {\n  k_1_16th = 0,\n  k_1_8th = 1,\n  k_1_4th = 2,\n  k_1_2 = 3,\n  k_1 = 4,\n  // 1/256th was added in R600. On the Xbox 360, games normally use 1/16th.\n};\n\nenum class EdramMode : uint32_t {\n  kNoOperation = 0,\n  kColorDepth = 4,\n  // TODO(Triang3l): Verify whether kDepthOnly means the pixel shader is ignored\n  // completely even if it writes depth, exports to memory or kills pixels.\n  // Hints suggesting that it should be completely ignored (which is desirable\n  // on real hardware to avoid scheduling the pixel shader at all and waiting\n  // for it especially since the Xbox 360 doesn't have early per-sample depth /\n  // stencil, only early hi-Z / hi-stencil, and other registers possibly\n  // toggling pixel shader execution are yet to be found):\n  // - Most of depth pre-pass draws in 415607E6 use the kDepthOnly more with a\n  //   `oC0 = tfetch2D(tf0, r0.xy) * r1` shader, some use `oC0 = r0` though.\n  //   However, when alphatested surfaces are drawn, kColorDepth is explicitly\n  //   used with the same shader performing the texture fetch.\n  // - 5454082B has some kDepthOnly draws with alphatest enabled, but the shader\n  //   is `oC0 = r0`, which makes no sense (alphatest based on an interpolant\n  //   from the vertex shader) as no texture alpha cutout is involved.\n  // - 5454082B also has kDepthOnly draws with pretty complex shaders clearly\n  //   for use only in the color pass - even fetching and filtering a shadowmap.\n  // For now, based on these, let's assume the pixel shader is never used with\n  // kDepthOnly.\n  kDepthOnly = 5,\n  kCopy = 6,\n};\n\n// Xenos copies EDRAM contents to a tiled 2D or 3D texture (resolves - from\n// \"MSAA resolve\", but this name is also used for single-sampled copying) by\n// drawing primitives with the EDRAM mode EdramMode::kCopy. Pixels covered by\n// the drawn geometry are copied. It's likely that only rectangular regions can\n// be resolved.\n//\n// Resolve operation can write color data in ColorFormat formats, with or\n// without MSAA color sample averaging, endian swap, red/blue swap, and exponent\n// bias. Depth resolving likely has a lot more restrictions, considering sample\n// averaging, red/blue swap and exponent bias would be pretty meaningless for it\n// (also, Direct3D 9 specifies k_8_8_8_8 as RB_COPY_DEST_INFO::copy_dest_format\n// for depth, which is clearly not true - the right format would be k_24_8 or\n// k_24_8_FLOAT, so depth resolving likely doesn't support format conversion),\n// though endian swap is supported.\n//\n// In addition, a resolve draw may clear the region it copies (this feature is\n// commonly used when going to the next tile with predicated tiling). While one\n// resolve draw call may copy just one color or depth buffer, it may clear both\n// color and depth at once (or just color or depth, or nothing) if copying a\n// color buffer (the color render target cleared is the same as the one copied -\n// however, depth resolves have RB_COPY_CONTROL::copy_src_select 4, so they\n// can't clear color).\n//\n// Direct3D 9 does resolving by drawing kRectangleList with 3 vertices with a\n// vertex shader that accepts k_32_32_FLOAT vertices with k8in32 endianness in\n// SHADER_CONSTANT_FETCH_00_0, with the half-pixel offset, according to the\n// PA_SU_VTX_CNTL::pix_center setting, pre-applied to the vertices (for Direct3D\n// 9 pixel centers, 0.5 must be added to the vertex positions to get the\n// coordinates of the corners).\n//\n// The rectangle is used for both the source render target and the destination\n// texture, according to how it's used in 4E4D07E9.\n//\n// Direct3D 9 gives the rectangle in source render target coordinates (for\n// example, in 4D5307E6, the sniper rifle scope has a (128,64)->(448,256)\n// rectangle). It doesn't adjust the EDRAM base pointer, otherwise (taking into\n// account that 4x MSAA is used for the scope) it would have been\n// (8,0)->(328,192), but it's not. However, it adjusts the destination texture\n// address so (0,0) relative to the destination address is (0,0) relative to\n// the render target (if resolving a part of a render target to the top-left\n// corner of a texture, Direct3D 9 actually moves the destination pointer before\n// the start of the texture, with tiled offset internally calculated for a\n// negative offset). When copying, the pointer needs to be adjusted to the first\n// 32x32 tile that will actually be modified, by adding the value of\n// XGAddress2D/3DTiledOffset called for left/top & ~31.\n//\n// RB_COPY_DEST_PITCH's purpose appears to be not clamping or something like\n// that, but just specifying pitch for going between rows, and height for going\n// between 3D texture slices. copy_dest_pitch is rounded to 32 by Direct3D 9,\n// copy_dest_height is not. In the 4D5307E6 sniper rifle scope example,\n// copy_dest_pitch is 320, and copy_dest_height is 192 - the same as the resolve\n// rectangle size (resolving from a 320x192 portion of the surface at 128,64 to\n// the whole texture, at 0,0). Relative to RB_COPY_DEST_BASE, the height should\n// have been 256, but it's not. Adreno doesn't have copy_dest_height at all (as\n// well as RB_COPY_DEST_INFO::copy_dest_slice), suggesting (alongside the name\n// of the register) that it exists purely to be able to go between 3D texture\n// slices.\n//\n// Window scissor must also be applied - in the jigsaw puzzle in 58410955, there\n// are 1280x720 resolve rectangles, but only the scissored 1280x256 needs to be\n// copied, otherwise it overflows even beyond the EDRAM, and the depth buffer is\n// visible on the screen. It also ensures the coordinates are not negative (in\n// 565507D9, for example, the right tile is resolved with vertices\n// (-640,0)->(640,720), however, the destination texture pointer is adjusted\n// properly to the right half of the texture, and the source render target has a\n// pitch of 800).\n\n// Granularity of offset and size in resolve operations is 8x8 pixels\n// (GPU_RESOLVE_ALIGNMENT - for example, 4D5307E6 resolves a 24x16 region for a\n// 18x10 texture, 8x8 region for a 1x1 texture).\n// https://github.com/jmfauvel/CSGO-SDK/blob/master/game/client/view.cpp#L944\n// https://github.com/stanriders/hl2-asw-port/blob/master/src/game/client/vgui_int.cpp#L901\nconstexpr uint32_t kResolveAlignmentPixelsLog2 = 3;\nconstexpr uint32_t kResolveAlignmentPixels = 1 << kResolveAlignmentPixelsLog2;\n\n// Same as RB_SURFACE_INFO::surface_pitch, RB_COPY_DEST_PITCH::copy_dest_pitch\n// and RB_COPY_DEST_PITCH::copy_dest_height.\nconstexpr uint32_t kResolveSizeBits = 14;\nconstexpr uint32_t kMaxResolveSize =\n    (1 << kResolveSizeBits) - kResolveAlignmentPixels;\n\nenum class CopyCommand : uint32_t {\n  kRaw = 0,\n  kConvert = 1,\n  kConstantOne = 2,\n  kNull = 3,  // ?\n};\n\n// a2xx_rb_copy_sample_select\nenum class CopySampleSelect : uint32_t {\n  k0,\n  k1,\n  k2,\n  k3,\n  k01,\n  k23,\n  k0123,\n};\n\nconstexpr bool IsSingleCopySampleSelected(CopySampleSelect copy_sample_select) {\n  return copy_sample_select >= CopySampleSelect::k0 &&\n         copy_sample_select <= CopySampleSelect::k3;\n}\n\n#define XE_GPU_MAKE_TEXTURE_SWIZZLE(x, y, z, w)          \\\n  (((xe::gpu::xenos::XE_GPU_TEXTURE_SWIZZLE_##x) << 0) | \\\n   ((xe::gpu::xenos::XE_GPU_TEXTURE_SWIZZLE_##y) << 3) | \\\n   ((xe::gpu::xenos::XE_GPU_TEXTURE_SWIZZLE_##z) << 6) | \\\n   ((xe::gpu::xenos::XE_GPU_TEXTURE_SWIZZLE_##w) << 9))\ntypedef enum {\n  XE_GPU_TEXTURE_SWIZZLE_X = 0,\n  XE_GPU_TEXTURE_SWIZZLE_R = 0,\n  XE_GPU_TEXTURE_SWIZZLE_Y = 1,\n  XE_GPU_TEXTURE_SWIZZLE_G = 1,\n  XE_GPU_TEXTURE_SWIZZLE_Z = 2,\n  XE_GPU_TEXTURE_SWIZZLE_B = 2,\n  XE_GPU_TEXTURE_SWIZZLE_W = 3,\n  XE_GPU_TEXTURE_SWIZZLE_A = 3,\n  XE_GPU_TEXTURE_SWIZZLE_0 = 4,\n  XE_GPU_TEXTURE_SWIZZLE_1 = 5,\n  XE_GPU_TEXTURE_SWIZZLE_RRRR = XE_GPU_MAKE_TEXTURE_SWIZZLE(R, R, R, R),\n  XE_GPU_TEXTURE_SWIZZLE_RGGG = XE_GPU_MAKE_TEXTURE_SWIZZLE(R, G, G, G),\n  XE_GPU_TEXTURE_SWIZZLE_RGBB = XE_GPU_MAKE_TEXTURE_SWIZZLE(R, G, B, B),\n  XE_GPU_TEXTURE_SWIZZLE_RGBA = XE_GPU_MAKE_TEXTURE_SWIZZLE(R, G, B, A),\n  XE_GPU_TEXTURE_SWIZZLE_0000 = XE_GPU_MAKE_TEXTURE_SWIZZLE(0, 0, 0, 0),\n} XE_GPU_TEXTURE_SWIZZLE;\n\ninline uint16_t GpuSwap(uint16_t value, Endian endianness) {\n  switch (endianness) {\n    case Endian::kNone:\n      // No swap.\n      return value;\n    case Endian::k8in16:\n      // Swap bytes in half words.\n      return ((value << 8) & 0xFF00FF00) | ((value >> 8) & 0x00FF00FF);\n    default:\n      assert_unhandled_case(endianness);\n      return value;\n  }\n}\n\ninline uint32_t GpuSwap(uint32_t value, Endian endianness) {\n  switch (endianness) {\n    default:\n    case Endian::kNone:\n      // No swap.\n      return value;\n    case Endian::k8in16:\n      // Swap bytes in half words.\n      return ((value << 8) & 0xFF00FF00) | ((value >> 8) & 0x00FF00FF);\n    case Endian::k8in32:\n      // Swap bytes.\n      // NOTE: we are likely doing two swaps here. Wasteful. Oh well.\n      return xe::byte_swap(value);\n    case Endian::k16in32:\n      // Swap half words.\n      return ((value >> 16) & 0xFFFF) | (value << 16);\n  }\n}\n\ninline float GpuSwap(float value, Endian endianness) {\n  union {\n    uint32_t i;\n    float f;\n  } v;\n  v.f = value;\n  v.i = GpuSwap(v.i, endianness);\n  return v.f;\n}\n\ninline uint32_t GpuToCpu(uint32_t p) { return p; }\n\ninline uint32_t CpuToGpu(uint32_t p) { return p & 0x1FFFFFFF; }\n\n// XE_GPU_REG_SHADER_CONSTANT_LOOP_*\nunion alignas(uint32_t) LoopConstant {\n  uint32_t value;\n  struct {\n    uint32_t count : 8;  // +0\n    // Address (aL) start and step.\n    // The resulting aL is `iterator * step + start`, 10-bit, and has the real\n    // range of [-256, 256], according to the IPR2015-00325 sequencer\n    // specification.\n    uint32_t start : 8;    // +8\n    int32_t step : 8;      // +16\n    uint32_t _pad_24 : 8;  // +24\n  };\n};\nstatic_assert_size(LoopConstant, sizeof(uint32_t));\n\n// SQ_TEX_VTX_INVALID/VALID_TEXTURE/BUFFER\nenum class FetchConstantType : uint32_t {\n  kInvalidTexture,\n  kInvalidVertex,\n  kTexture,\n  kVertex,\n};\n\nconstexpr uint32_t kTextureFetchConstantCount = 32;\nconstexpr uint32_t kVertexFetchConstantCount = 3 * kTextureFetchConstantCount;\n\n// XE_GPU_REG_SHADER_CONSTANT_FETCH_*\nunion alignas(uint32_t) xe_gpu_vertex_fetch_t {\n  struct {\n    uint32_t dword_0;\n    uint32_t dword_1;\n  };\n  struct {\n    FetchConstantType type : 2;  // +0\n    uint32_t address : 30;       // +2 address in dwords\n\n    Endian endian : 2;       // +0\n    uint32_t size : 24;      // +2 size in words\n    uint32_t _pad_1_26 : 6;  // +26\n  };\n};\nstatic_assert_size(xe_gpu_vertex_fetch_t, sizeof(uint32_t) * 2);\n\n// Byte alignment of texture subresources in memory - of each mip and stack\n// slice / cube face (and of textures themselves), this number of bits is also\n// omitted from base_address and mip_address.\nconstexpr uint32_t kTextureSubresourceAlignmentBytesLog2 = 12;\nconstexpr uint32_t kTextureSubresourceAlignmentBytes =\n    1 << kTextureSubresourceAlignmentBytesLog2;\n\n// Texture fetch constant size field widths.\nconstexpr uint32_t kTexture1DMaxWidthLog2 = 24;\nconstexpr uint32_t kTexture1DMaxWidth = 1 << kTexture1DMaxWidthLog2;\nconstexpr uint32_t kTexture2DCubeMaxWidthHeightLog2 = 13;\nconstexpr uint32_t kTexture2DCubeMaxWidthHeight =\n    1 << kTexture2DCubeMaxWidthHeightLog2;\nconstexpr uint32_t kTexture2DMaxStackDepthLog2 = 6;\nconstexpr uint32_t kTexture2DMaxStackDepth = 1 << kTexture2DMaxStackDepthLog2;\nconstexpr uint32_t kTexture3DMaxWidthHeightLog2 = 11;\nconstexpr uint32_t kTexture3DMaxWidthHeight = 1 << kTexture3DMaxWidthHeightLog2;\nconstexpr uint32_t kTexture3DMaxDepthLog2 = 10;\nconstexpr uint32_t kTexture3DMaxDepth = 1 << kTexture3DMaxDepthLog2;\n\nconstexpr uint32_t kTextureMaxMips =\n    std::max(kTexture2DCubeMaxWidthHeightLog2, kTexture3DMaxWidthHeightLog2) +\n    1;\n\nconstexpr uint32_t kTextureTileWidthHeightLog2 = 5;\nconstexpr uint32_t kTextureTileWidthHeight = 1 << kTextureTileWidthHeightLog2;\n// 3D tiled texture slices 0:3 and 4:7 are stored separately in memory, in\n// non-overlapping ranges, but addressing in 4:7 is different than in 0:3.\nconstexpr uint32_t kTextureTileDepthLog2 = 2;\nconstexpr uint32_t kTextureTileDepth = 1 << kTextureTileDepthLog2;\n\n// Texture tile address function periods:\n// - 2D 1bpb: 128x128\n// - 2D 2bpb: 64x64\n// - 2D 4bpb+: 32x32\n// - 3D 1bpb: 64x32x8\n// - 3D 2bpb+: 32x32x8\nconstexpr uint32_t GetTextureTiledXBaseGranularityLog2(\n    bool is_3d, uint32_t bytes_per_block_log2) {\n  return 7 - std::min(UINT32_C(2), bytes_per_block_log2 + uint32_t(is_3d));\n}\nconstexpr uint32_t GetTextureTiledYBaseGranularityLog2(\n    bool is_3d, uint32_t bytes_per_block_log2) {\n  return is_3d ? 5 : (7 - std::min(UINT32_C(2), bytes_per_block_log2));\n}\nconstexpr uint32_t kTextureTiledZBaseGranularityLog2 = 3;\nconstexpr uint32_t kTextureTiledZBaseGranularity =\n    1 << kTextureTiledZBaseGranularityLog2;\n\n// Row pitch alignment of non-tiled textures.\nconstexpr uint32_t kTextureLinearRowAlignmentBytesLog2 = 8;\nconstexpr uint32_t kTextureLinearRowAlignmentBytes =\n    1 << kTextureLinearRowAlignmentBytesLog2;\n\n// XE_GPU_REG_SHADER_CONSTANT_FETCH_*\nunion alignas(uint32_t) xe_gpu_texture_fetch_t {\n  struct {\n    uint32_t dword_0;\n    uint32_t dword_1;\n    uint32_t dword_2;\n    uint32_t dword_3;\n    uint32_t dword_4;\n    uint32_t dword_5;\n  };\n  struct {\n    FetchConstantType type : 2;  // +0 dword_0\n    // The signedness applies to the data components (before the swizzle, which\n    // is the destination selection).\n    // Signed repeating fraction formats always use the kZeroClampMinusOne mode,\n    // according to the IPR2015-00325 R400 Document Library Folder History:\n    //   \"Change 133990 on 2003/11/25 by jhoule@jhoule_doc_lt\n    //   v1.80 - Indicated that NO_ZERO srf mode is unsupported for Xenos (will\n    //   currently only work in the VC path)\"\n    TextureSign sign_x : 2;  // +2\n    TextureSign sign_y : 2;  // +4\n    TextureSign sign_z : 2;  // +6\n    TextureSign sign_w : 2;  // +8\n    ClampMode clamp_x : 3;   // +10\n    ClampMode clamp_y : 3;   // +13\n    ClampMode clamp_z : 3;   // +16\n    uint32_t _pad_0_19 : 3;  // +19\n    // Base row pitch in pixels (not blocks) >> 5. For linear textures, this is\n    // provided by Direct3D 9 in a way that every row of blocks ends up aligned\n    // to kTextureLinearRowAlignmentBytes (the GPU requires 256-byte alignment\n    // of linear texture block rows for all textures).\n    // Mips are always stored with padding to the `max(next_pow2(base width or\n    // height) >> level, 1)` or a 32x32x4 tile (whichever is larger), so this\n    // pitch is irrelevant to them (but the 256-byte alignment requirement still\n    // applies to linear textures).\n    // Examples of pitch > aligned width:\n    // - 584109FF (loading screen and menu backgrounds, 1408 for a 1280x linear\n    //   k_DXT4_5 texture, which corresponds to 22 * 256 bytes rather than\n    //   20 * 256 for just 1280x).\n    uint32_t pitch : 9;  // +22\n    uint32_t tiled : 1;  // +31\n\n    TextureFormat format : 6;           // +0 dword_1\n    Endian endianness : 2;              // +6\n    uint32_t request_size : 2;          // +8\n    uint32_t stacked : 1;               // +10\n    uint32_t nearest_clamp_policy : 1;  // +11 d3d/opengl\n    uint32_t base_address : 20;         // +12 base address >> 12\n\n    // Size is stored with 1 subtracted from each component.\n    union {  // dword_2\n      struct {\n        uint32_t width : 24;\n        uint32_t _pad_size_1d : 8;\n      } size_1d;\n      struct {\n        uint32_t width : 13;\n        uint32_t height : 13;\n        // Should be 0 for k2D and 5 for kCube if not stacked, but not very\n        // meaningful in this case, likely should be ignored for non-stacked.\n        uint32_t stack_depth : 6;\n      } size_2d;\n      struct {\n        uint32_t width : 11;\n        uint32_t height : 11;\n        uint32_t depth : 10;\n      } size_3d;\n    };\n\n    uint32_t num_format : 1;  // +0 dword_3 frac/int\n    // xyzw, 3b each (XE_GPU_TEXTURE_SWIZZLE)\n    uint32_t swizzle : 12;                 // +1\n    int32_t exp_adjust : 6;                // +13\n    TextureFilter mag_filter : 2;          // +19\n    TextureFilter min_filter : 2;          // +21\n    TextureFilter mip_filter : 2;          // +23\n    AnisoFilter aniso_filter : 3;          // +25\n    ArbitraryFilter arbitrary_filter : 3;  // +28\n    uint32_t border_size : 1;              // +31\n\n    uint32_t vol_mag_filter : 1;  // +0 dword_4\n    uint32_t vol_min_filter : 1;  // +1\n    uint32_t mip_min_level : 4;   // +2\n    uint32_t mip_max_level : 4;   // +6\n    uint32_t mag_aniso_walk : 1;  // +10\n    uint32_t min_aniso_walk : 1;  // +11\n    // 5 fractional bits (A2XX_SQ_TEX_4_LOD_BIAS).\n    int32_t lod_bias : 10;  // +12\n    // Also known as LodBiasH/V in sys2gmem.\n    int32_t grad_exp_adjust_h : 5;  // +22\n    int32_t grad_exp_adjust_v : 5;  // +27\n\n    BorderColor border_color : 2;    // +0 dword_5\n    uint32_t force_bc_w_to_max : 1;  // +2\n    // Also known as TriJuice.\n    uint32_t tri_clamp : 2;       // +3\n    int32_t aniso_bias : 4;       // +5\n    DataDimension dimension : 2;  // +9\n    uint32_t packed_mips : 1;     // +11\n    uint32_t mip_address : 20;    // +12 mip address >> 12\n  };\n};\nstatic_assert_size(xe_gpu_texture_fetch_t, sizeof(uint32_t) * 6);\n\n// XE_GPU_REG_SHADER_CONSTANT_FETCH_*\nunion alignas(uint32_t) xe_gpu_fetch_group_t {\n  struct {\n    uint32_t dword_0;\n    uint32_t dword_1;\n    uint32_t dword_2;\n    uint32_t dword_3;\n    uint32_t dword_4;\n    uint32_t dword_5;\n  };\n  xe_gpu_texture_fetch_t texture_fetch;\n  struct {\n    xe_gpu_vertex_fetch_t vertex_fetch_0;\n    xe_gpu_vertex_fetch_t vertex_fetch_1;\n    xe_gpu_vertex_fetch_t vertex_fetch_2;\n  };\n  struct {\n    uint32_t type_0 : 2;\n    uint32_t data_0_a : 30;\n    uint32_t data_0_b : 32;\n    uint32_t type_1 : 2;\n    uint32_t data_1_a : 30;\n    uint32_t data_1_b : 32;\n    uint32_t type_2 : 2;\n    uint32_t data_2_a : 30;\n    uint32_t data_2_b : 32;\n  };\n};\nstatic_assert_size(xe_gpu_fetch_group_t, sizeof(uint32_t) * 6);\n\n// Shader memory export (memexport) allows for writing of arbitrary formatted\n// data with random access / scatter capabilities. It provides functionality\n// largely similar to resolving - format packing, supporting arbitrary color\n// formats, from sub-dword ones such as k_8 in 58410B86, to 128-bit ones, with\n// endian swap similar to how it's performed in resolves (up to 128-bit);\n// specifying the number format, swapping red and blue channels - though with no\n// exponent biasing. Unlike resolving, however, instead of writing to tiled\n// textures, it exports the data to up to 5 elements (the eM# shader registers,\n// each corresponding to `base address + element size * (offset + 0...4)`) in a\n// stream defined by a stream constant and an offset in elements written to eA -\n// a shader, however, can write to multiple streams with different or the same\n// stream constants, by performing `alloc export` multiple times. It's used\n// mostly in vertex shaders (most commonly in improvised \"compute shaders\" done\n// by executing a vertex shader for a number of point-type primitives covering\n// nothing), though usage in pixel shaders is also possible - an example is\n// provided in the \"Advanced Screenspace Antialiasing\" presentation by Arne\n// Schober.\n// https://ubm-twvideo01.s3.amazonaws.com/o1/vault/gdceurope2010/slides/A_Schober_Advanced_Screenspace_Antialiasing.pdf\n//\n// Unlike fetch constants, which are passed via special registers, a memory\n// export stream is configured by writing the stream constant and the offset to\n// a shader export register (eA) allocated by the shader - similar to more\n// conventional exports like oPos, o#, oC#. Therefore, in general, it's not\n// possible to know what its value will be without running the shader. For\n// emulation, this means that the memory range referenced by an export - that\n// needs to be validated - requires running the shader on the CPU in general.\n// Thankfully, however, the usual way of setting up eA is by executing:\n// `mad eA, r#, const0100, c#`\n// where c# is the stream float4 constant from the float constant registers, and\n// const0100 is a literal (0.0f, 1.0f, 0.0f, 0.0f) constant, also from the float\n// constant registers, used for placing the element index (r#) in the correct\n// component of eA. This allows for easy gathering of memexport stream\n// constants, which contain both the base address and the size of the\n// destination buffer for bounds checking, from the shader code and the float\n// constant registers, as long as the guest uses this instruction pattern to\n// write to eA.\n//\n// The Xenos doesn't have an integer ALU, and denormals are treated as zero and\n// are flushed. However, eA contains integers and bit fields. A stream constant\n// is thus structured in a way that allows for packing integers in normalized\n// floating-point numbers.\n//\n// X contains the base address of the stream in dwords as integer bits in the\n// lower 30 bits, and bits 0b01 in the top. The 0b01 bits make the exponent\n// nonzero, so the number is considered normalized, and therefore isn't flushed\n// to zero. With only 512 MB of the physical memory on the Xbox 360, the\n// exponent can't become 0b11111111, so X also won't be NaN for any valid Xbox\n// 360 physical address (though in general the GPU supports 32-bit addresses,\n// but this is originally an Xbox 360-specific feature, that was later, however,\n// likely reused for GL_QCOM_writeonly_rendering).\n//\n// TODO(Triang3l): Verify whether GL_QCOM_writeonly_rendering is actually\n// memexport on the Adreno 2xx using GL_OES_get_program_binary - it's also\n// interesting to see how alphatest interacts with it, whether it's still true\n// fixed-function alphatest, as it's claimed to be supported as usual by the\n// extension specification.\n//\n// Y of eA contains the offset in elements - this is what shaders are supposed\n// to calculate from something like the vertex index. Again, it's specified as\n// an integer in the low bits, not as a truly floating-point number. For this\n// purpose, stream constants contain the value 2^23 - when a whole\n// floating-point number smaller than 2^23 is added as floating-point to 2^23,\n// its integer representation becomes the mantissa bits of a number with an\n// exponent of 23. Via multiply-add, `offset * 1.0f + exp2f(23)` is written here\n// by the shader, allowing for element offsets of up to 2^23 - 1.\n//\n// Z is a bit field with the information about the formatting of the data. It's\n// also packed as a normalized floating-point number, but in a cleaner way than\n// X because not as many bits are required - just like Y, it has an exponent of\n// 23 (possibly to let shaders build these values manually using floating-point\n// multiply-add like integer shift-or, and finally to add 2^23, though that's\n// not a case easy to handle in emulation, unlike prebuilt stream constants).\n//\n// W contains the number of elements in the stream. It's also packed with the\n// full 23 exponent just like Y and Z, there's no way to index more than 2^23\n// elements using packing via addition to 2^23, so this field also doesn't need\n// more bits than that.\n//\n// According to the sequencer specification from IPR2015-00325 (where memexport\n// is called \"pass thru export\"):\n// - Pass thru exports can occur anywhere in the shader program.\n// - There can be any number of pass thru exports.\n// - The address register is not kept across clause boundaries, so it must be\n//   refreshed after any Serialize (or yield), allocate instruction or resource\n//   change.\n// - The write to eM# may be predicated if the export is not needed.\n// - Exports are dropped if:\n//   - The index is above the maximum.\n//   - The index sign bit is 1.\n//   - The exponent of the index is not 23.\n// The requirement that eM4 must be written if any eM# other than eM0 is also\n// written doesn't apply to the final Xenos, it's likely an outdated note in the\n// specification considering that it's very preliminary.\n//\n// According to Microsoft's shader validator:\n// - eA can be written only by `mad`.\n// - A single eM# can be written by any number of instruction, including with\n//   write masking.\n// - eA must be written before eM#.\n// - Any alloc instruction or a `serialize` terminates the current memory\n//   export. This doesn't apply to `exec Yield=true`, however, and it's not\n//   clear if that's an oversight or if that's not considered a yield that\n//   terminates the export.\n//\n// From the emulation perspective, this means that:\n// - Alloc instructions (`alloc export` mandatorily, other allocs optionally),\n//   and optionally `serialize` instructions within `exec`, should be treated as\n//   the locations where the currently open export should be flushed to the\n//   memory. It should be taken into account that an export may be in looping\n//   control flow, and in this case it must be performed at every iteration.\n// - Whether each eM# was written to must be tracked at shader execution time,\n//   as predication can disable the export of an element.\n//\n// TODO(Triang3l): Investigate how memory export interacts with pixel killing.\n// Given that eM# writes disabled by predication don't cause an export, it's\n// possible that killed invocations are treated as inactive (invalid in Xenos\n// terms) overall, and thus new memory exports from them shouldn't be done, but\n// that's not verified. However, given that on Direct3D 11+, OpenGL and Vulkan\n// hosts, discarding disables subsequent storage resource writes, on the host,\n// it would be natural to perform all outstanding memory exports before\n// discarding if the kill condition passes.\n//\n// Memory exports can be performed to any ColorFormat, including 8bpp and 16bpp\n// ones. Hosts, however, may have the memory bound as a 32bpp buffer (for\n// instance, due to the minimum resource view size limitation on Direct3D 11).\n// In this case, bytes and shorts aren't addressable directly. However, taking\n// into account that memory accesses are coherent within one shader invocation\n// on Direct3D 11+, OpenGL and Vulkan and thus are done in order relatively to\n// each other, it should be possible to implement them by clearing the bits via\n// an atomic AND, and writing the new value using an atomic OR. This will, of\n// course, make the entire write operation non-atomic, and in case of a race\n// between writes to the same location, the final result may not even be just a\n// value from one of the invocations, but rather, it can be OR of the values\n// from any invocations involved. However, on the Xenos, there doesn't seem to\n// be any possibility of meaningfully accessing the same location from multiple\n// invocations if any of them is writing, memory exports are out-of-order, so\n// such an implementation shouldn't be causing issues in reality. Atomic\n// compare-exchange, however, should not be used for this purpose, as it may\n// result in an infinite loop if different invocations want to write different\n// values to the same memory location.\n//\n// Examples of setup in titles (Z from MSB to LSB):\n//\n// 4D5307E6 particles (different VS invocation counts, like 1, 2, 4):\n// There is a passthrough shader - useful for verification as it simply writes\n// directly what it reads via vfetch of various formats. Another shader (with\n// different c# numbers, but same formats) does complicated math to process the\n// particles.\n// c152:           Z = 010010110000|0|111|00|100110|00000|010, count = 35840\n//   8in32, 32_32_32_32_FLOAT, float, RGBA - from 32_32_32_32_FLOAT vfetch\n// c154, 162:      Z = 010010110000|0|111|00|100000|00000|001, count = 71680\n//   8in16, 16_16_16_16_FLOAT, float, RGBA - from 16_16_16_16_FLOAT vfetch\n// c156, 158, 160: Z = 010010110000|0|000|00|011010|00000|001, count = 71680\n//   8in16, 16_16_16_16, unorm, RGBA - from 16_16_16_16 unorm vfetch\n// c164:           Z = 010010110000|0|111|00|011111|00000|001, count = 143360\n//   8in16, 16_16_FLOAT, float, RGBA - from 16_16_FLOAT vfetch\n// c166:           Z = 010010110000|0|000|00|011001|00000|001, count = 143360\n//   8in16, 16_16, unorm, RGBA - from 16_16 unorm vfetch\n// c168:           Z = 010010110000|0|001|00|000111|00000|010, count = 143360\n//   8in32, 2_10_10_10, snorm, RGBA - from 2_10_10_10 snorm vfetch\n// c170, c172:     Z = 010010110000|1|000|00|000110|00000|010, count = 143360\n//   8in32, 8_8_8_8, unorm, BGRA - from 8_8_8_8 unorm vfetch with .zyxw swizzle\n//\n// 4D5307E6 water simulation (2048 VS invocations):\n// c130: Z = 010010110000|0|111|00|100110|00000|010, count = 16384\n//   8in32, 32_32_32_32_FLOAT, float, RGBA\n//   The shader has 5 memexports of this kind and 6 32_32_32_32_FLOAT vfetches.\n//\n// 4D5307E6 water tessellation factors (1 VS invocation per triangle patch):\n// c130: Z = 010010110000|0|111|11|100100|11111|010, count = patch count * 3\n//   8in32, 32_FLOAT, float, RGBA\n//\n// 41560817 texture memory copying (64 bytes per invocation, two eA, eight eM#):\n// c0: Z = 010010110000|0|010|11|011010|00011|001\n//   8in16, 16_16_16_16, uint, RGBA - from 16_16_16_16 uint vfetch\n//   (16_16_16_16 is the largest color format without special values)\n//\n// 58410B86 hierarchical depth buffer occlusion culling with the result read on\n// the CPU (15000 VS invocations in the main menu):\n// c8: Z = 010010110000|0|010|00|000010|00000|000, count = invocation count\n//   No endian swap, 8, uint, RGBA\nunion alignas(uint32_t) xe_gpu_memexport_stream_t {\n  struct {\n    uint32_t dword_0;\n    uint32_t dword_1;\n    uint32_t dword_2;\n    uint32_t dword_3;\n  };\n  struct {\n    uint32_t base_address : 30;  // +0 dword_0 physical address >> 2\n    uint32_t const_0x1 : 2;      // +30\n\n    uint32_t const_0x4b000000;  // +0 dword_1\n\n    Endian128 endianness : 3;            // +0 dword_2\n    uint32_t unused_0 : 5;               // +3\n    ColorFormat format : 6;              // +8\n    uint32_t unused_1 : 2;               // +14\n    SurfaceNumberFormat num_format : 3;  // +16\n    uint32_t red_blue_swap : 1;          // +19\n    uint32_t const_0x4b0 : 12;           // +20\n\n    uint32_t index_count : 23;  // +0 dword_3\n    uint32_t const_0x96 : 9;    // +23\n  };\n};\nstatic_assert_size(xe_gpu_memexport_stream_t, sizeof(uint32_t) * 4);\n\nstruct alignas(uint32_t) xe_gpu_depth_sample_counts {\n  // This is little endian as it is swapped in D3D code.\n  // Corresponding A and B values are summed up by D3D.\n  // Occlusion there is calculated by substracting begin from end struct.\n  le<uint32_t> Total_A;\n  le<uint32_t> Total_B;\n  le<uint32_t> ZFail_A;\n  le<uint32_t> ZFail_B;\n  le<uint32_t> ZPass_A;\n  le<uint32_t> ZPass_B;\n  le<uint32_t> StencilFail_A;\n  le<uint32_t> StencilFail_B;\n};\nstatic_assert_size(xe_gpu_depth_sample_counts, sizeof(uint32_t) * 8);\n\n// Enum of event values used for VGT_EVENT_INITIATOR\nenum Event {\n  VS_DEALLOC = 0,\n  PS_DEALLOC = 1,\n  VS_DONE_TS = 2,\n  PS_DONE_TS = 3,\n  CACHE_FLUSH_TS = 4,\n  CONTEXT_DONE = 5,\n  CACHE_FLUSH = 6,\n  VIZQUERY_START = 7,\n  VIZQUERY_END = 8,\n  SC_WAIT_WC = 9,\n  MPASS_PS_CP_REFETCH = 10,\n  MPASS_PS_RST_START = 11,\n  MPASS_PS_INCR_START = 12,\n  RST_PIX_CNT = 13,\n  RST_VTX_CNT = 14,\n  TILE_FLUSH = 15,\n  CACHE_FLUSH_AND_INV_TS_EVENT = 20,\n  ZPASS_DONE = 21,\n  CACHE_FLUSH_AND_INV_EVENT = 22,\n  PERFCOUNTER_START = 23,\n  PERFCOUNTER_STOP = 24,\n  SCREEN_EXT_INIT = 25,\n  SCREEN_EXT_RPT = 26,\n  VS_FETCH_DONE_TS = 27,\n};\n\n// Opcodes (IT_OPCODE) for Type-3 commands in the ringbuffer.\n// https://github.com/freedreno/amd-gpu/blob/master/include/api/gsl_pm4types.h\n// Not sure if all of these are used.\n// clang-format off\nenum Type3Opcode {\n  PM4_ME_INIT               = 0x48,   // initialize CP's micro-engine\n\n  PM4_NOP                   = 0x10,   // skip N 32-bit words to get to the next packet\n\n  PM4_INDIRECT_BUFFER       = 0x3f,   // indirect buffer dispatch.  prefetch parser uses this packet type to determine whether to pre-fetch the IB\n  PM4_INDIRECT_BUFFER_PFD   = 0x37,   // indirect buffer dispatch.  same as IB, but init is pipelined\n\n  PM4_WAIT_FOR_IDLE         = 0x26,   // wait for the IDLE state of the engine\n  PM4_WAIT_REG_MEM          = 0x3c,   // wait until a register or memory location is a specific value\n  PM4_WAIT_REG_EQ           = 0x52,   // wait until a register location is equal to a specific value\n  PM4_WAIT_REG_GTE          = 0x53,   // wait until a register location is >= a specific value\n  PM4_WAIT_UNTIL_READ       = 0x5c,   // wait until a read completes\n  PM4_WAIT_IB_PFD_COMPLETE  = 0x5d,   // wait until all base/size writes from an IB_PFD packet have completed\n\n  PM4_REG_RMW               = 0x21,   // register read/modify/write\n  PM4_REG_TO_MEM            = 0x3e,   // reads register in chip and writes to memory\n  PM4_MEM_WRITE             = 0x3d,   // write N 32-bit words to memory\n  PM4_MEM_WRITE_CNTR        = 0x4f,   // write CP_PROG_COUNTER value to memory\n  PM4_COND_EXEC             = 0x44,   // conditional execution of a sequence of packets\n  PM4_COND_WRITE            = 0x45,   // conditional write to memory or register\n\n  PM4_EVENT_WRITE           = 0x46,   // generate an event that creates a write to memory when completed\n  PM4_EVENT_WRITE_SHD       = 0x58,   // generate a VS|PS_done event\n  PM4_EVENT_WRITE_CFL       = 0x59,   // generate a cache flush done event\n  PM4_EVENT_WRITE_EXT       = 0x5a,   // generate a screen extent event\n  PM4_EVENT_WRITE_ZPD       = 0x5b,   // generate a z_pass done event\n\n  PM4_DRAW_INDX             = 0x22,   // initiate fetch of index buffer and draw\n  PM4_DRAW_INDX_2           = 0x36,   // draw using supplied indices in packet\n  PM4_DRAW_INDX_BIN         = 0x34,   // initiate fetch of index buffer and binIDs and draw\n  PM4_DRAW_INDX_2_BIN       = 0x35,   // initiate fetch of bin IDs and draw using supplied indices\n\n  PM4_VIZ_QUERY             = 0x23,   // begin/end initiator for viz query extent processing\n  PM4_SET_STATE             = 0x25,   // fetch state sub-blocks and initiate shader code DMAs\n  PM4_SET_CONSTANT          = 0x2d,   // load constant into chip and to memory\n  PM4_SET_CONSTANT2         = 0x55,   // INCR_UPDATE_STATE\n  PM4_SET_SHADER_CONSTANTS  = 0x56,   // INCR_UPDT_CONST\n  PM4_LOAD_ALU_CONSTANT     = 0x2f,   // load constants from memory\n  PM4_IM_LOAD               = 0x27,   // load sequencer instruction memory (pointer-based)\n  PM4_IM_LOAD_IMMEDIATE     = 0x2b,   // load sequencer instruction memory (code embedded in packet)\n  PM4_LOAD_CONSTANT_CONTEXT = 0x2e,   // load constants from a location in memory\n  PM4_INVALIDATE_STATE      = 0x3b,   // selective invalidation of state pointers\n\n  PM4_SET_SHADER_BASES      = 0x4A,   // dynamically changes shader instruction memory partition\n  PM4_SET_BIN_BASE_OFFSET   = 0x4B,   // program an offset that will added to the BIN_BASE value of the 3D_DRAW_INDX_BIN packet\n  PM4_SET_BIN_MASK          = 0x50,   // sets the 64-bit BIN_MASK register in the PFP\n  PM4_SET_BIN_SELECT        = 0x51,   // sets the 64-bit BIN_SELECT register in the PFP\n\n  PM4_CONTEXT_UPDATE        = 0x5e,   // updates the current context, if needed\n  PM4_INTERRUPT             = 0x54,   // generate interrupt from the command stream\n\n  PM4_XE_SWAP               = 0x64,   // Xenia only: VdSwap uses this to trigger a swap.\n\n  PM4_IM_STORE              = 0x2c,   // copy sequencer instruction memory to system memory\n\n  // Tiled rendering:\n  // https://www.google.com/patents/US20060055701\n  PM4_SET_BIN_MASK_LO       = 0x60,\n  PM4_SET_BIN_MASK_HI       = 0x61,\n  PM4_SET_BIN_SELECT_LO     = 0x62,\n  PM4_SET_BIN_SELECT_HI     = 0x63,\n};\n// clang-format on\n\ninline uint32_t MakePacketType0(uint16_t index, uint16_t count,\n                                bool one_reg = false) {\n  // ttcccccc cccccccc oiiiiiii iiiiiiii\n  assert(index <= 0x7FFF);\n  assert(count >= 1 && count <= 0x4000);\n  return (0u << 30) | (((count - 1) & 0x3FFF) << 16) | (index & 0x7FFF);\n}\n\ninline uint32_t MakePacketType1(uint16_t index_1, uint16_t index_2) {\n  // tt?????? ??222222 22222111 11111111\n  assert(index_1 <= 0x7FF);\n  assert(index_2 <= 0x7FF);\n  return (1u << 30) | ((index_2 & 0x7FF) << 11) | (index_1 & 0x7FF);\n}\n\nconstexpr inline uint32_t MakePacketType2() {\n  // tt?????? ???????? ???????? ????????\n  return (2u << 30);\n}\n\ninline uint32_t MakePacketType3(Type3Opcode opcode, uint16_t count,\n                                bool predicate = false) {\n  // ttcccccc cccccccc ?ooooooo ???????p\n  assert(opcode <= 0x7F);\n  assert(count >= 1 && count <= 0x4000);\n  return (3u << 30) | (((count - 1) & 0x3FFF) << 16) | ((opcode & 0x7F) << 8) |\n         (predicate ? 1 : 0);\n}\n\n}  // namespace xenos\n}  // namespace gpu\n}  // namespace xe\n\n#endif  // XENIA_GPU_XENOS_H_\n"
  },
  {
    "path": "src/xenia/helper/sdl/premake5.lua",
    "content": "project_root = \"../../../..\"\ninclude(project_root..\"/tools/build\")\n\ngroup(\"src\")\nproject(\"xenia-helper-sdl\")\n  uuid(\"84b00ad3-fba3-4561-96c9-1f9993b14c9c\")\n  kind(\"StaticLib\")\n  language(\"C++\")\n  links({\n    \"SDL2\",\n  })\n  defines({\n  })\n  includedirs({\n  })\n  local_platform_files()\n  sdl2_include()\n"
  },
  {
    "path": "src/xenia/helper/sdl/sdl_helper.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/helper/sdl/sdl_helper.h\"\n\n// On linux we likely build on an \"outdated\" system but still want to control\n// these features when available on a newer system.\n#if !SDL_VERSION_ATLEAST(2, 0, 14)\n#define SDL_HINT_AUDIO_DEVICE_APP_NAME \"SDL_AUDIO_DEVICE_APP_NAME\"\n#endif\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/logging.h\"\n\nnamespace xe {\nnamespace helper {\nnamespace sdl {\nbool SDLHelper::is_prepared_ = false;\n\nbool SDLHelper::Prepare() {\n  if (is_prepared_) {\n    return true;\n  }\n  is_prepared_ = true;\n\n  is_prepared_ &= SetHints();\n  is_prepared_ &= RedirectLog();\n\n  SDL_version ver = {};\n  SDL_GetVersion(&ver);\n  XELOGI(\"SDL Version {}.{}.{} initialized.\", ver.major, ver.minor, ver.patch);\n\n  return is_prepared_;\n}\n\nbool SDLHelper::SetHints() {\n  bool suc = true;\n\n  const auto setHint = [](const char* name, const char* value,\n                          bool override_ = false) -> bool {\n    // Setting hints with normal priority fails when the hint is set via env\n    // vars or a hint with override priority is set, which does not conclude a\n    // failure.\n    if (SDL_FALSE ==\n        SDL_SetHintWithPriority(\n            name, value, override_ ? SDL_HINT_OVERRIDE : SDL_HINT_NORMAL)) {\n      const char* msg_fmt =\n          \"SDLHelper: Unable to set hint \\\"{}\\\" to value \\\"{}\\\".\";\n      if (override_) {\n        XELOGE(msg_fmt, name, value);\n        return false;\n      } else {\n        XELOGI(msg_fmt, name, value);\n      }\n    }\n    return true;\n  };\n\n  // SDL calls timeBeginPeriod(1) but xenia sets this to a lower value before\n  // using NtSetTimerResolution(). Having that value overwritten causes overall\n  // fps drops. Use override priority as timer resolution should always be\n  // managed by xenia. https://bugzilla.libsdl.org/show_bug.cgi?id=5104\n  suc &= setHint(SDL_HINT_TIMER_RESOLUTION, \"0\", true);\n\n  suc &= setHint(SDL_HINT_AUDIO_CATEGORY, \"playback\");\n\n  suc &= setHint(SDL_HINT_AUDIO_DEVICE_APP_NAME, \"xenia emulator\");\n\n  return suc;\n}\n\nbool SDLHelper::RedirectLog() {\n  // Redirect SDL_Log* output (internal library stuff) to our log system.\n  SDL_LogSetOutputFunction(\n      [](void* userdata, int category, SDL_LogPriority priority,\n         const char* message) {\n        const char* msg_fmt = \"SDL: {}\";\n        switch (priority) {\n          case SDL_LOG_PRIORITY_VERBOSE:\n          case SDL_LOG_PRIORITY_DEBUG:\n            XELOGD(msg_fmt, message);\n            break;\n          case SDL_LOG_PRIORITY_INFO:\n            XELOGI(msg_fmt, message);\n            break;\n          case SDL_LOG_PRIORITY_WARN:\n            XELOGW(msg_fmt, message);\n            break;\n          case SDL_LOG_PRIORITY_ERROR:\n          case SDL_LOG_PRIORITY_CRITICAL:\n            XELOGE(msg_fmt, message);\n            break;\n          default:\n            XELOGI(msg_fmt, message);\n            assert_always(\"SDL: Unknown log priority\");\n            break;\n        }\n      },\n      nullptr);\n  // SDL itself isn't that talkative. Additionally to this settings there are\n  // hints that can be switched on to output additional internal logging\n  // information.\n  SDL_LogSetAllPriority(SDL_LogPriority::SDL_LOG_PRIORITY_VERBOSE);\n  return true;\n}\n}  // namespace sdl\n}  // namespace helper\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/helper/sdl/sdl_helper.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_HELPER_SDL_SDL_HELPER_H_\n#define XENIA_HELPER_SDL_SDL_HELPER_H_\n\n#include \"SDL.h\"\n\nnamespace xe {\nnamespace helper {\nnamespace sdl {\n// This helper class exists to independently use SDL from different parts of\n// xenia.\nclass SDLHelper {\n public:\n  // To configure the SDL library for use in xenia call this function before\n  // SDL_InitSubSystem() is called.\n  static bool Prepare();\n  static bool IsPrepared() { return is_prepared_; }\n\n private:\n  static bool SetHints();\n  static bool RedirectLog();\n\n private:\n  static bool is_prepared_;\n};\n}  // namespace sdl\n}  // namespace helper\n}  // namespace xe\n\n#endif  // XENIA_HELPER_SDL_SDL_HELPER_H_"
  },
  {
    "path": "src/xenia/hid/hid_demo.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include <array>\n#include <cstring>\n#include <forward_list>\n#include <memory>\n#include <string>\n#include <tuple>\n#include <unordered_map>\n#include <vector>\n\n#include \"third_party/fmt/include/fmt/format.h\"\n#include \"third_party/imgui/imgui.h\"\n#include \"xenia/base/clock.h\"\n#include \"xenia/base/cvar.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/platform.h\"\n#include \"xenia/base/threading.h\"\n#include \"xenia/hid/hid_flags.h\"\n#include \"xenia/hid/input_system.h\"\n#include \"xenia/ui/imgui_dialog.h\"\n#include \"xenia/ui/imgui_drawer.h\"\n#include \"xenia/ui/immediate_drawer.h\"\n#include \"xenia/ui/presenter.h\"\n#include \"xenia/ui/virtual_key.h\"\n#include \"xenia/ui/vulkan/vulkan_provider.h\"\n#include \"xenia/ui/window.h\"\n#include \"xenia/ui/window_listener.h\"\n#include \"xenia/ui/windowed_app.h\"\n\n// Available input drivers:\n#include \"xenia/hid/nop/nop_hid.h\"\n#if !XE_PLATFORM_ANDROID\n#include \"xenia/hid/sdl/sdl_hid.h\"\n#endif  // !XE_PLATFORM_ANDROID\n#if XE_PLATFORM_WIN32\n#include \"xenia/hid/winkey/winkey_hid.h\"\n#include \"xenia/hid/xinput/xinput_hid.h\"\n#endif  // XE_PLATFORM_WIN32\n\nDEFINE_string(hid, \"any\", \"Input system. Use: [any, nop, sdl, winkey, xinput]\",\n              \"General\");\n\n#define MAX_USERS 4\n#define ROW_HEIGHT_GENERAL 60\n#define COL_WIDTH_STATE 320\n#define COL_WIDTH_STROKE 416\n\nnamespace xe {\nnamespace hid {\n\nclass HidDemoApp final : public ui::WindowedApp {\n public:\n  static std::unique_ptr<ui::WindowedApp> Create(\n      ui::WindowedAppContext& app_context) {\n    return std::unique_ptr<ui::WindowedApp>(new HidDemoApp(app_context));\n  }\n\n  bool OnInitialize() override;\n\n private:\n  enum : size_t {\n    kZOrderHidInput,\n    kZOrderImGui,\n  };\n\n  class HidDemoWindowListener final : public ui::WindowListener {\n   public:\n    explicit HidDemoWindowListener(ui::WindowedAppContext& app_context)\n        : app_context_(app_context) {}\n    void OnClosing(ui::UIEvent& e) override { app_context_.QuitFromUIThread(); }\n\n   private:\n    ui::WindowedAppContext& app_context_;\n  };\n\n  class HidDemoDialog final : public ui::ImGuiDialog {\n   public:\n    explicit HidDemoDialog(ui::ImGuiDrawer* imgui_drawer, HidDemoApp& app)\n        : ui::ImGuiDialog(imgui_drawer), app_(app) {}\n\n   protected:\n    void OnDraw(ImGuiIO& io) override;\n\n   private:\n    HidDemoApp& app_;\n  };\n\n  explicit HidDemoApp(ui::WindowedAppContext& app_context)\n      : ui::WindowedApp(app_context, \"xenia-hid-demo\"),\n        window_listener_(app_context) {}\n\n  static std::vector<std::unique_ptr<hid::InputDriver>> CreateInputDrivers(\n      ui::Window* window);\n\n  void Draw(ImGuiIO& io);\n  void DrawUserInputGetState(uint32_t user_index) const;\n  void DrawInputGetState() const;\n  void DrawUserInputGetKeystroke(uint32_t user_index, bool poll,\n                                 bool hide_repeats, bool clear_log) const;\n  void DrawInputGetKeystroke(bool poll, bool hide_repeats,\n                             bool clear_log) const;\n\n  HidDemoWindowListener window_listener_;\n  std::unique_ptr<ui::GraphicsProvider> graphics_provider_;\n  std::unique_ptr<ui::Window> window_;\n  std::unique_ptr<InputSystem> input_system_;\n  std::unique_ptr<ui::Presenter> presenter_;\n  std::unique_ptr<ui::ImmediateDrawer> immediate_drawer_;\n  std::unique_ptr<ui::ImGuiDrawer> imgui_drawer_;\n  std::unique_ptr<HidDemoDialog> demo_dialog_;\n\n  bool is_active_ = true;\n};\n\nstd::vector<std::unique_ptr<hid::InputDriver>> HidDemoApp::CreateInputDrivers(\n    ui::Window* window) {\n  std::vector<std::unique_ptr<hid::InputDriver>> drivers;\n  if (cvars::hid.compare(\"nop\") == 0) {\n    drivers.emplace_back(xe::hid::nop::Create(window, kZOrderHidInput));\n#if !XE_PLATFORM_ANDROID\n  } else if (cvars::hid.compare(\"sdl\") == 0) {\n    auto driver = xe::hid::sdl::Create(window, kZOrderHidInput);\n    if (XSUCCEEDED(driver->Setup())) {\n      drivers.emplace_back(std::move(driver));\n    }\n#endif  // !XE_PLATFORM_ANDROID\n#if XE_PLATFORM_WIN32\n  } else if (cvars::hid.compare(\"winkey\") == 0) {\n    auto driver = xe::hid::winkey::Create(window, kZOrderHidInput);\n    if (XSUCCEEDED(driver->Setup())) {\n      drivers.emplace_back(std::move(driver));\n    }\n  } else if (cvars::hid.compare(\"xinput\") == 0) {\n    auto driver = xe::hid::xinput::Create(window, kZOrderHidInput);\n    if (XSUCCEEDED(driver->Setup())) {\n      drivers.emplace_back(std::move(driver));\n    }\n#endif  // XE_PLATFORM_WIN32\n  } else {\n#if !XE_PLATFORM_ANDROID\n    auto sdl_driver = xe::hid::sdl::Create(window, kZOrderHidInput);\n    if (sdl_driver && XSUCCEEDED(sdl_driver->Setup())) {\n      drivers.emplace_back(std::move(sdl_driver));\n    }\n#endif  // !XE_PLATFORM_ANDROID\n#if XE_PLATFORM_WIN32\n    auto xinput_driver = xe::hid::xinput::Create(window, kZOrderHidInput);\n    if (xinput_driver && XSUCCEEDED(xinput_driver->Setup())) {\n      drivers.emplace_back(std::move(xinput_driver));\n    }\n    auto winkey_driver = xe::hid::winkey::Create(window, kZOrderHidInput);\n    if (winkey_driver && XSUCCEEDED(winkey_driver->Setup())) {\n      drivers.emplace_back(std::move(winkey_driver));\n    }\n#endif  // XE_PLATFORM_WIN32\n    if (drivers.empty()) {\n      // Fallback to nop if none created.\n      drivers.emplace_back(xe::hid::nop::Create(window, kZOrderHidInput));\n    }\n  }\n  return drivers;\n}\n\nbool HidDemoApp::OnInitialize() {\n  // Create the graphics provider that provides the presenter for the window.\n  graphics_provider_ = xe::ui::vulkan::VulkanProvider::Create(false, true);\n  if (!graphics_provider_) {\n    XELOGE(\"Failed to initialize the graphics provider\");\n    return false;\n  }\n\n  // Create and configure the window.\n  window_ = xe::ui::Window::Create(app_context(), GetName(),\n                                   COL_WIDTH_STATE + COL_WIDTH_STROKE,\n                                   ROW_HEIGHT_GENERAL + 500);\n  window_->AddListener(&window_listener_);\n  if (!window_->Open()) {\n    XELOGE(\"Failed to open the main window\");\n    return false;\n  }\n\n  // Initialize input system and all drivers.\n  input_system_ = std::make_unique<xe::hid::InputSystem>(window_.get());\n  auto drivers = CreateInputDrivers(window_.get());\n  for (size_t i = 0; i < drivers.size(); ++i) {\n    auto& driver = drivers[i];\n    driver->set_is_active_callback([this]() -> bool { return is_active_; });\n    input_system_->AddDriver(std::move(driver));\n  }\n\n  // Setup drawing to the window.\n  presenter_ = graphics_provider_->CreatePresenter();\n  if (!presenter_) {\n    XELOGE(\"Failed to initialize the presenter\");\n    return false;\n  }\n  immediate_drawer_ = graphics_provider_->CreateImmediateDrawer();\n  if (!immediate_drawer_) {\n    XELOGE(\"Failed to initialize the immediate drawer\");\n    return false;\n  }\n  immediate_drawer_->SetPresenter(presenter_.get());\n  imgui_drawer_ =\n      std::make_unique<ui::ImGuiDrawer>(window_.get(), kZOrderImGui);\n  imgui_drawer_->SetPresenterAndImmediateDrawer(presenter_.get(),\n                                                immediate_drawer_.get());\n  demo_dialog_ = std::make_unique<HidDemoDialog>(imgui_drawer_.get(), *this);\n  window_->SetPresenter(presenter_.get());\n\n  return true;\n}\n\nvoid HidDemoApp::HidDemoDialog::OnDraw(ImGuiIO& io) { app_.Draw(io); }\n\nvoid HidDemoApp::Draw(ImGuiIO& io) {\n  const ImGuiWindowFlags wflags =\n      ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove |\n      ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoSavedSettings |\n      ImGuiWindowFlags_NoScrollbar;\n\n  ImGui::Begin(\"General\", nullptr, wflags);\n  {\n    ImGui::SetWindowPos(ImVec2(0, 0));\n    ImGui::SetWindowSize(\n        ImVec2(COL_WIDTH_STATE + COL_WIDTH_STROKE, ROW_HEIGHT_GENERAL));\n\n    ImGui::Text(\"Input System (hid) = \\\"%s\\\"\", cvars::hid.c_str());\n    ImGui::Checkbox(\"is_active\", &is_active_);\n  }\n  ImGui::End();\n\n  ImGui::Begin(\"GetState()\", nullptr, wflags);\n  {\n    ImGui::SetWindowPos(ImVec2(0, ROW_HEIGHT_GENERAL));\n    ImGui::SetWindowSize(\n        ImVec2(COL_WIDTH_STATE, io.DisplaySize.y - ROW_HEIGHT_GENERAL));\n\n    static bool enable_GetState = false;\n    ImGui::Checkbox(\"Active\", &enable_GetState);\n    ImGui::SameLine();\n    ImGui::Checkbox(\"Guide Button\", &cvars::guide_button);\n    if (enable_GetState) {\n      ImGui::Spacing();\n      DrawInputGetState();\n    }\n  }\n  ImGui::End();\n\n  ImGui::Begin(\"GetKeystroke()\", nullptr, wflags);\n  {\n    ImGui::SetWindowPos(ImVec2(COL_WIDTH_STATE, ROW_HEIGHT_GENERAL));\n    ImGui::SetWindowSize(\n        ImVec2(COL_WIDTH_STROKE, io.DisplaySize.y - ROW_HEIGHT_GENERAL));\n\n    static bool enable_GetKeystroke = false;\n    static bool hide_repeats = false;\n    ImGui::Checkbox(\"Active\", &enable_GetKeystroke);\n    ImGui::SameLine();\n    ImGui::Checkbox(\"Hide repeats\", &hide_repeats);\n    ImGui::SameLine();\n    const bool clear_log = ImGui::Button(\"Clear\");\n    ImGui::Spacing();\n    DrawInputGetKeystroke(enable_GetKeystroke, hide_repeats, clear_log);\n  }\n  ImGui::End();\n}\n\nvoid HidDemoApp::DrawUserInputGetState(uint32_t user_index) const {\n  ImGui::Text(\"User %u:\", user_index);\n\n  X_INPUT_STATE state;\n  if (input_system_->GetState(user_index, &state) != X_ERROR_SUCCESS) {\n    ImGui::Text(\" No controller detected\");\n    return;\n  }\n\n  ImGui::Text(\"  Packet Number: %u\",\n              static_cast<uint32_t>(state.packet_number));\n\n  auto& gamepad = state.gamepad;\n  ImGui::Text(\"  Right Buttons: [%c][%c][%c][%c]\",\n              gamepad.buttons & X_INPUT_GAMEPAD_A ? 'A' : ' ',\n              gamepad.buttons & X_INPUT_GAMEPAD_B ? 'B' : ' ',\n              gamepad.buttons & X_INPUT_GAMEPAD_X ? 'X' : ' ',\n              gamepad.buttons & X_INPUT_GAMEPAD_Y ? 'Y' : ' ');\n  ImGui::Text(\"Special Buttons: [%s][%s][%s]\",\n              gamepad.buttons & X_INPUT_GAMEPAD_BACK ? \"back\" : \"    \",\n              gamepad.buttons & X_INPUT_GAMEPAD_GUIDE ? \"guide\" : \"     \",\n              gamepad.buttons & X_INPUT_GAMEPAD_START ? \"start\" : \"     \");\n  ImGui::Text(\"          D-pad: [%c][%c][%c][%c]\",\n              gamepad.buttons & X_INPUT_GAMEPAD_DPAD_UP ? 'U' : ' ',\n              gamepad.buttons & X_INPUT_GAMEPAD_DPAD_DOWN ? 'D' : ' ',\n              gamepad.buttons & X_INPUT_GAMEPAD_DPAD_LEFT ? 'L' : ' ',\n              gamepad.buttons & X_INPUT_GAMEPAD_DPAD_RIGHT ? 'R' : ' ');\n  ImGui::Text(\"         Thumbs: [%c][%c]\",\n              gamepad.buttons & X_INPUT_GAMEPAD_LEFT_THUMB ? 'L' : ' ',\n              gamepad.buttons & X_INPUT_GAMEPAD_RIGHT_THUMB ? 'R' : ' ');\n  ImGui::Text(\"      Shoulders: [%c][%c]\",\n              gamepad.buttons & X_INPUT_GAMEPAD_LEFT_SHOULDER ? 'L' : ' ',\n              gamepad.buttons & X_INPUT_GAMEPAD_RIGHT_SHOULDER ? 'R' : ' ');\n  ImGui::Text(\"   Left Trigger: %3u\",\n              static_cast<uint16_t>(gamepad.left_trigger));\n  ImGui::Text(\"  Right Trigger: %3u\",\n              static_cast<uint16_t>(gamepad.right_trigger));\n  ImGui::Text(\"     Left Thumb: %6d, %6d\",\n              static_cast<int32_t>(gamepad.thumb_lx),\n              static_cast<int32_t>(gamepad.thumb_ly));\n  ImGui::Text(\"    Right Thumb: %6d, %6d\",\n              static_cast<int32_t>(gamepad.thumb_rx),\n              static_cast<int32_t>(gamepad.thumb_ry));\n\n  X_INPUT_VIBRATION vibration;\n  vibration.left_motor_speed = static_cast<uint16_t>(\n      float(static_cast<uint16_t>(gamepad.left_trigger)) / 255.0f * UINT16_MAX);\n  vibration.right_motor_speed = static_cast<uint16_t>(\n      float(static_cast<uint16_t>(gamepad.right_trigger)) / 255.0f *\n      UINT16_MAX);\n  input_system_->SetState(user_index, &vibration);\n\n  ImGui::Text(\"  Motor Speeds: L %5u, R %5u\",\n              static_cast<uint32_t>(vibration.left_motor_speed),\n              static_cast<uint32_t>(vibration.right_motor_speed));\n\n  ImGui::Text(\" \");\n}\n\nvoid HidDemoApp::DrawInputGetState() const {\n  ImGui::BeginChild(\"##input_get_state_scroll\");\n  for (uint32_t user_index = 0; user_index < MAX_USERS; ++user_index) {\n    DrawUserInputGetState(user_index);\n  }\n  ImGui::EndChild();\n}\n\nvoid HidDemoApp::DrawUserInputGetKeystroke(uint32_t user_index, bool poll,\n                                           bool hide_repeats,\n                                           bool clear_log) const {\n  static const std::unordered_map<ui::VirtualKey, const std::string> kVkPretty =\n      {\n          {ui::VirtualKey::kXInputPadA, \"A\"},\n          {ui::VirtualKey::kXInputPadB, \"B\"},\n          {ui::VirtualKey::kXInputPadX, \"X\"},\n          {ui::VirtualKey::kXInputPadY, \"Y\"},\n          {ui::VirtualKey::kXInputPadRShoulder, \"R Shoulder\"},\n          {ui::VirtualKey::kXInputPadLShoulder, \"L Shoulder\"},\n          {ui::VirtualKey::kXInputPadLTrigger, \"L Trigger\"},\n          {ui::VirtualKey::kXInputPadRTrigger, \"R Trigger\"},\n\n          {ui::VirtualKey::kXInputPadDpadUp, \"DPad up\"},\n          {ui::VirtualKey::kXInputPadDpadDown, \"DPad down\"},\n          {ui::VirtualKey::kXInputPadDpadLeft, \"DPad left\"},\n          {ui::VirtualKey::kXInputPadDpadRight, \"DPad right\"},\n          {ui::VirtualKey::kXInputPadStart, \"Start\"},\n          {ui::VirtualKey::kXInputPadBack, \"Back\"},\n          {ui::VirtualKey::kXInputPadLThumbPress, \"L Thumb press\"},\n          {ui::VirtualKey::kXInputPadRThumbPress, \"R Thumb press\"},\n\n          {ui::VirtualKey::kXInputPadLThumbUp, \"L Thumb up\"},\n          {ui::VirtualKey::kXInputPadLThumbDown, \"L Thumb down\"},\n          {ui::VirtualKey::kXInputPadLThumbRight, \"L Thumb right\"},\n          {ui::VirtualKey::kXInputPadLThumbLeft, \"L Thumb left\"},\n          {ui::VirtualKey::kXInputPadLThumbUpLeft, \"L Thumb up & left\"},\n          {ui::VirtualKey::kXInputPadLThumbUpRight, \"L Thumb up & right\"},\n          {ui::VirtualKey::kXInputPadLThumbDownRight, \"L Thumb down & right\"},\n          {ui::VirtualKey::kXInputPadLThumbDownLeft, \"L Thumb down & left\"},\n\n          {ui::VirtualKey::kXInputPadRThumbUp, \"R Thumb up\"},\n          {ui::VirtualKey::kXInputPadRThumbDown, \"R Thumb down\"},\n          {ui::VirtualKey::kXInputPadRThumbRight, \"R Thumb right\"},\n          {ui::VirtualKey::kXInputPadRThumbLeft, \"R Thumb left\"},\n          {ui::VirtualKey::kXInputPadRThumbUpLeft, \"R Thumb up & left\"},\n          {ui::VirtualKey::kXInputPadRThumbUpRight, \"R Thumb up & right\"},\n          {ui::VirtualKey::kXInputPadRThumbDownRight, \"R Thumb down & right\"},\n          {ui::VirtualKey::kXInputPadRThumbDownLeft, \"R Thumb down & left\"},\n      };\n\n  const size_t maxLog = 128;\n  static std::array<std::forward_list<std::string>, MAX_USERS> event_logs;\n  static std::array<uint64_t, MAX_USERS> last_event_times = {};\n\n  auto& event_log = event_logs.at(user_index);\n  if (clear_log) {\n    event_log.clear();\n  }\n\n  if (poll) {\n    X_INPUT_KEYSTROKE stroke;\n    bool continue_poll;\n    do {\n      continue_poll = false;\n      auto status = input_system_->GetKeystroke(user_index, 0, &stroke);\n      switch (status) {\n        case X_ERROR_SUCCESS: {\n          if (!stroke.virtual_key) {\n            event_log.emplace_front(\"Error: Empty KEYSTROKE on SUCCESS.\");\n            break;\n          }\n          continue_poll = true;\n\n          const auto now = Clock::QueryHostUptimeMillis();\n          const auto dur = now - last_event_times[user_index];\n          last_event_times[user_index] = now;\n\n          if (hide_repeats && (stroke.flags & X_INPUT_KEYSTROKE_REPEAT)) {\n            break;\n          }\n\n          ui::VirtualKey virtual_key = ui::VirtualKey(stroke.virtual_key.get());\n          const auto key_search = kVkPretty.find(virtual_key);\n          std::string key =\n              key_search != kVkPretty.cend()\n                  ? key_search->second\n                  : fmt::format(\"0x{:04x}\", uint16_t(virtual_key));\n          event_log.emplace_front(fmt::format(\n              \"{:>6} {:>9}ms    {:<20}    {} {} {}\", ImGui::GetFrameCount(),\n              dur, key,\n              ((stroke.flags & X_INPUT_KEYSTROKE_KEYDOWN) ? \"down\" : \"    \"),\n              ((stroke.flags & X_INPUT_KEYSTROKE_KEYUP) ? \"up\" : \"  \"),\n              ((stroke.flags & X_INPUT_KEYSTROKE_REPEAT) ? \"repeat\" : \"\")));\n\n          break;\n        }\n        case X_ERROR_DEVICE_NOT_CONNECTED:\n        case X_ERROR_EMPTY:\n          break;\n        default:\n          event_log.emplace_front(\n              fmt::format(\"Error: Unknown result code: 0x{:08X}\", status));\n          break;\n      }\n    } while (continue_poll);\n  }\n\n  if (ImGui::BeginTabItem(fmt::format(\"User {}\", user_index).c_str())) {\n    ImGui::BeginChild(\n        fmt::format(\"##input_get_keystroke_scroll_{}\", user_index).c_str());\n    ImGui::Text(\" frame  since last    button                  flags\");\n    for (auto [it, count] = std::tuple{event_log.begin(), 1};\n         it != event_log.end(); ++it, ++count) {\n      ImGui::Text(\"%s\", it->c_str());\n\n      if (count >= maxLog) {\n        auto last = it;\n        if (++it != event_log.end()) {\n          event_log.erase_after(last);\n        }\n        break;\n      }\n    }\n    ImGui::EndChild();\n    ImGui::EndTabItem();\n  }\n}\n\nvoid HidDemoApp::DrawInputGetKeystroke(bool poll, bool hide_repeats,\n                                       bool clear_log) const {\n  bool tab_bar = ImGui::BeginTabBar(\"DrawInputGetKeystroke\");\n  for (uint32_t user_index = 0; user_index < MAX_USERS; ++user_index) {\n    DrawUserInputGetKeystroke(user_index, poll, hide_repeats, clear_log);\n  }\n  if (tab_bar) ImGui::EndTabBar();\n}\n\n}  // namespace hid\n}  // namespace xe\n\nXE_DEFINE_WINDOWED_APP(xenia_hid_demo, xe::hid::HidDemoApp::Create);\n"
  },
  {
    "path": "src/xenia/hid/hid_flags.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/hid/hid_flags.h\"\n\nDEFINE_bool(guide_button, false, \"Forward guide button presses to guest.\",\n            \"HID\");\n"
  },
  {
    "path": "src/xenia/hid/hid_flags.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_HID_HID_FLAGS_H_\n#define XENIA_HID_HID_FLAGS_H_\n\n#include \"xenia/base/cvar.h\"\n\nDECLARE_bool(guide_button);\n\n#endif  // XENIA_HID_HID_FLAGS_H_\n"
  },
  {
    "path": "src/xenia/hid/input.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2015 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_HID_INPUT_H_\n#define XENIA_HID_INPUT_H_\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/byte_order.h\"\n\nnamespace xe {\nnamespace hid {\n\nenum X_INPUT_CAPS {\n  X_INPUT_CAPS_FFB_SUPPORTED = 0x0001,\n  X_INPUT_CAPS_WIRELESS = 0x0002,\n  X_INPUT_CAPS_VOICE_SUPPORTED = 0x0004,\n  X_INPUT_CAPS_PMD_SUPPORTED = 0x0008,\n  X_INPUT_CAPS_NO_NAVIGATION = 0x0010,\n};\n\nenum X_INPUT_FLAG {\n  X_INPUT_FLAG_GAMEPAD = 0x00000001,\n};\n\nenum X_INPUT_GAMEPAD_BUTTON {\n  X_INPUT_GAMEPAD_DPAD_UP = 0x0001,\n  X_INPUT_GAMEPAD_DPAD_DOWN = 0x0002,\n  X_INPUT_GAMEPAD_DPAD_LEFT = 0x0004,\n  X_INPUT_GAMEPAD_DPAD_RIGHT = 0x0008,\n  X_INPUT_GAMEPAD_START = 0x0010,\n  X_INPUT_GAMEPAD_BACK = 0x0020,\n  X_INPUT_GAMEPAD_LEFT_THUMB = 0x0040,\n  X_INPUT_GAMEPAD_RIGHT_THUMB = 0x0080,\n  X_INPUT_GAMEPAD_LEFT_SHOULDER = 0x0100,\n  X_INPUT_GAMEPAD_RIGHT_SHOULDER = 0x0200,\n  X_INPUT_GAMEPAD_GUIDE = 0x0400,\n  X_INPUT_GAMEPAD_A = 0x1000,\n  X_INPUT_GAMEPAD_B = 0x2000,\n  X_INPUT_GAMEPAD_X = 0x4000,\n  X_INPUT_GAMEPAD_Y = 0x8000,\n};\n\n// For VK_PAD, use ui::VirtualKey.\n\nenum X_INPUT_KEYSTROKE_FLAGS {\n  X_INPUT_KEYSTROKE_KEYDOWN = 0x0001,\n  X_INPUT_KEYSTROKE_KEYUP = 0x0002,\n  X_INPUT_KEYSTROKE_REPEAT = 0x0004,\n};\n\nstruct X_INPUT_GAMEPAD {\n  be<uint16_t> buttons;\n  uint8_t left_trigger;\n  uint8_t right_trigger;\n  be<int16_t> thumb_lx;\n  be<int16_t> thumb_ly;\n  be<int16_t> thumb_rx;\n  be<int16_t> thumb_ry;\n};\nstatic_assert_size(X_INPUT_GAMEPAD, 12);\n\nstruct X_INPUT_STATE {\n  be<uint32_t> packet_number;\n  X_INPUT_GAMEPAD gamepad;\n};\nstatic_assert_size(X_INPUT_STATE, sizeof(X_INPUT_GAMEPAD) + 4);\n\nstruct X_INPUT_VIBRATION {\n  be<uint16_t> left_motor_speed;\n  be<uint16_t> right_motor_speed;\n};\nstatic_assert_size(X_INPUT_VIBRATION, 4);\n\nstruct X_INPUT_CAPABILITIES {\n  uint8_t type;\n  uint8_t sub_type;\n  be<uint16_t> flags;\n  X_INPUT_GAMEPAD gamepad;\n  X_INPUT_VIBRATION vibration;\n};\nstatic_assert_size(X_INPUT_CAPABILITIES,\n                   sizeof(X_INPUT_GAMEPAD) + sizeof(X_INPUT_VIBRATION) + 4);\n\n// https://msdn.microsoft.com/en-us/library/windows/desktop/microsoft.directx_sdk.reference.xinput_keystroke(v=vs.85).aspx\nstruct X_INPUT_KEYSTROKE {\n  be<uint16_t> virtual_key;\n  be<uint16_t> unicode;\n  be<uint16_t> flags;\n  uint8_t user_index;\n  uint8_t hid_code;\n};\nstatic_assert_size(X_INPUT_KEYSTROKE, 8);\n\n}  // namespace hid\n}  // namespace xe\n\n#endif  // XENIA_HID_INPUT_H_\n"
  },
  {
    "path": "src/xenia/hid/input_driver.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_HID_INPUT_DRIVER_H_\n#define XENIA_HID_INPUT_DRIVER_H_\n\n#include <cstddef>\n#include <functional>\n\n#include \"xenia/hid/input.h\"\n#include \"xenia/ui/window.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace ui {\nclass Window;\n}  // namespace ui\n}  // namespace xe\n\nnamespace xe {\nnamespace hid {\n\nclass InputSystem;\n\nclass InputDriver {\n public:\n  virtual ~InputDriver() = default;\n\n  virtual X_STATUS Setup() = 0;\n\n  virtual X_RESULT GetCapabilities(uint32_t user_index, uint32_t flags,\n                                   X_INPUT_CAPABILITIES* out_caps) = 0;\n  virtual X_RESULT GetState(uint32_t user_index, X_INPUT_STATE* out_state) = 0;\n  virtual X_RESULT SetState(uint32_t user_index,\n                            X_INPUT_VIBRATION* vibration) = 0;\n  virtual X_RESULT GetKeystroke(uint32_t user_index, uint32_t flags,\n                                X_INPUT_KEYSTROKE* out_keystroke) = 0;\n\n  void set_is_active_callback(std::function<bool()> is_active_callback) {\n    is_active_callback_ = is_active_callback;\n  }\n\n protected:\n  explicit InputDriver(xe::ui::Window* window, size_t window_z_order)\n      : window_(window), window_z_order_(window_z_order) {}\n\n  xe::ui::Window* window() const { return window_; }\n  size_t window_z_order() const { return window_z_order_; }\n\n  bool is_active() const {\n    return !is_active_callback_ || is_active_callback_();\n  }\n\n private:\n  xe::ui::Window* window_;\n  size_t window_z_order_;\n  std::function<bool()> is_active_callback_ = nullptr;\n};\n\n}  // namespace hid\n}  // namespace xe\n\n#endif  // XENIA_HID_INPUT_DRIVER_H_\n"
  },
  {
    "path": "src/xenia/hid/input_system.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/hid/input_system.h\"\n\n#include \"xenia/base/profiling.h\"\n#include \"xenia/hid/hid_flags.h\"\n#include \"xenia/hid/input_driver.h\"\n\nnamespace xe {\nnamespace hid {\n\nInputSystem::InputSystem(xe::ui::Window* window) : window_(window) {}\n\nInputSystem::~InputSystem() = default;\n\nX_STATUS InputSystem::Setup() { return X_STATUS_SUCCESS; }\n\nvoid InputSystem::AddDriver(std::unique_ptr<InputDriver> driver) {\n  drivers_.push_back(std::move(driver));\n}\n\nX_RESULT InputSystem::GetCapabilities(uint32_t user_index, uint32_t flags,\n                                      X_INPUT_CAPABILITIES* out_caps) {\n  SCOPE_profile_cpu_f(\"hid\");\n\n  bool any_connected = false;\n  for (auto& driver : drivers_) {\n    X_RESULT result = driver->GetCapabilities(user_index, flags, out_caps);\n    if (result != X_ERROR_DEVICE_NOT_CONNECTED) {\n      any_connected = true;\n    }\n    if (result == X_ERROR_SUCCESS) {\n      return result;\n    }\n  }\n  return any_connected ? X_ERROR_EMPTY : X_ERROR_DEVICE_NOT_CONNECTED;\n}\n\nX_RESULT InputSystem::GetState(uint32_t user_index, X_INPUT_STATE* out_state) {\n  SCOPE_profile_cpu_f(\"hid\");\n\n  bool any_connected = false;\n  for (auto& driver : drivers_) {\n    X_RESULT result = driver->GetState(user_index, out_state);\n    if (result != X_ERROR_DEVICE_NOT_CONNECTED) {\n      any_connected = true;\n    }\n    if (result == X_ERROR_SUCCESS) {\n      return result;\n    }\n  }\n  return any_connected ? X_ERROR_EMPTY : X_ERROR_DEVICE_NOT_CONNECTED;\n}\n\nX_RESULT InputSystem::SetState(uint32_t user_index,\n                               X_INPUT_VIBRATION* vibration) {\n  SCOPE_profile_cpu_f(\"hid\");\n\n  bool any_connected = false;\n  for (auto& driver : drivers_) {\n    X_RESULT result = driver->SetState(user_index, vibration);\n    if (result != X_ERROR_DEVICE_NOT_CONNECTED) {\n      any_connected = true;\n    }\n    if (result == X_ERROR_SUCCESS) {\n      return result;\n    }\n  }\n  return any_connected ? X_ERROR_EMPTY : X_ERROR_DEVICE_NOT_CONNECTED;\n}\n\nX_RESULT InputSystem::GetKeystroke(uint32_t user_index, uint32_t flags,\n                                   X_INPUT_KEYSTROKE* out_keystroke) {\n  SCOPE_profile_cpu_f(\"hid\");\n\n  bool any_connected = false;\n  for (auto& driver : drivers_) {\n    X_RESULT result = driver->GetKeystroke(user_index, flags, out_keystroke);\n    if (result != X_ERROR_DEVICE_NOT_CONNECTED) {\n      any_connected = true;\n    }\n    if (result == X_ERROR_SUCCESS || result == X_ERROR_EMPTY) {\n      return result;\n    }\n  }\n  return any_connected ? X_ERROR_EMPTY : X_ERROR_DEVICE_NOT_CONNECTED;\n}\n\n}  // namespace hid\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/hid/input_system.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_HID_INPUT_SYSTEM_H_\n#define XENIA_HID_INPUT_SYSTEM_H_\n\n#include <memory>\n#include <vector>\n\n#include \"xenia/hid/input.h\"\n#include \"xenia/hid/input_driver.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace ui {\nclass Window;\n}  // namespace ui\n}  // namespace xe\n\nnamespace xe {\nnamespace hid {\n\nclass InputSystem {\n public:\n  explicit InputSystem(xe::ui::Window* window);\n  ~InputSystem();\n\n  xe::ui::Window* window() const { return window_; }\n\n  X_STATUS Setup();\n\n  void AddDriver(std::unique_ptr<InputDriver> driver);\n\n  X_RESULT GetCapabilities(uint32_t user_index, uint32_t flags,\n                           X_INPUT_CAPABILITIES* out_caps);\n  X_RESULT GetState(uint32_t user_index, X_INPUT_STATE* out_state);\n  X_RESULT SetState(uint32_t user_index, X_INPUT_VIBRATION* vibration);\n  X_RESULT GetKeystroke(uint32_t user_index, uint32_t flags,\n                        X_INPUT_KEYSTROKE* out_keystroke);\n\n private:\n  xe::ui::Window* window_ = nullptr;\n\n  std::vector<std::unique_ptr<InputDriver>> drivers_;\n};\n\n}  // namespace hid\n}  // namespace xe\n\n#endif  // XENIA_HID_INPUT_SYSTEM_H_\n"
  },
  {
    "path": "src/xenia/hid/nop/nop_hid.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/hid/nop/nop_hid.h\"\n\n#include \"xenia/hid/nop/nop_input_driver.h\"\n\nnamespace xe {\nnamespace hid {\nnamespace nop {\n\nstd::unique_ptr<InputDriver> Create(xe::ui::Window* window,\n                                    size_t window_z_order) {\n  return std::make_unique<NopInputDriver>(window, window_z_order);\n}\n\n}  // namespace nop\n}  // namespace hid\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/hid/nop/nop_hid.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_HID_NOP_NOP_HID_H_\n#define XENIA_HID_NOP_NOP_HID_H_\n\n#include <memory>\n\n#include \"xenia/hid/input_system.h\"\n\nnamespace xe {\nnamespace hid {\nnamespace nop {\n\nstd::unique_ptr<InputDriver> Create(xe::ui::Window* window,\n                                    size_t window_z_order);\n\n}  // namespace nop\n}  // namespace hid\n}  // namespace xe\n\n#endif  // XENIA_HID_NOP_NOP_HID_H_\n"
  },
  {
    "path": "src/xenia/hid/nop/nop_input_driver.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/hid/nop/nop_input_driver.h\"\n\n#include \"xenia/hid/hid_flags.h\"\n\nnamespace xe {\nnamespace hid {\nnamespace nop {\n\nNopInputDriver::NopInputDriver(xe::ui::Window* window, size_t window_z_order)\n    : InputDriver(window, window_z_order) {}\n\nNopInputDriver::~NopInputDriver() = default;\n\nX_STATUS NopInputDriver::Setup() { return X_STATUS_SUCCESS; }\n\n// TODO(benvanik): spoof a device so that games don't stop waiting for\n//     a controller to be plugged in.\n\nX_RESULT NopInputDriver::GetCapabilities(uint32_t user_index, uint32_t flags,\n                                         X_INPUT_CAPABILITIES* out_caps) {\n  return X_ERROR_DEVICE_NOT_CONNECTED;\n}\n\nX_RESULT NopInputDriver::GetState(uint32_t user_index,\n                                  X_INPUT_STATE* out_state) {\n  return X_ERROR_DEVICE_NOT_CONNECTED;\n}\n\nX_RESULT NopInputDriver::SetState(uint32_t user_index,\n                                  X_INPUT_VIBRATION* vibration) {\n  return X_ERROR_DEVICE_NOT_CONNECTED;\n}\n\nX_RESULT NopInputDriver::GetKeystroke(uint32_t user_index, uint32_t flags,\n                                      X_INPUT_KEYSTROKE* out_keystroke) {\n  return X_ERROR_DEVICE_NOT_CONNECTED;\n}\n\n}  // namespace nop\n}  // namespace hid\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/hid/nop/nop_input_driver.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_HID_NOP_NOP_INPUT_DRIVER_H_\n#define XENIA_HID_NOP_NOP_INPUT_DRIVER_H_\n\n#include \"xenia/hid/input_driver.h\"\n\nnamespace xe {\nnamespace hid {\nnamespace nop {\n\nclass NopInputDriver final : public InputDriver {\n public:\n  explicit NopInputDriver(xe::ui::Window* window, size_t window_z_order);\n  ~NopInputDriver() override;\n\n  X_STATUS Setup() override;\n\n  X_RESULT GetCapabilities(uint32_t user_index, uint32_t flags,\n                           X_INPUT_CAPABILITIES* out_caps) override;\n  X_RESULT GetState(uint32_t user_index, X_INPUT_STATE* out_state) override;\n  X_RESULT SetState(uint32_t user_index, X_INPUT_VIBRATION* vibration) override;\n  X_RESULT GetKeystroke(uint32_t user_index, uint32_t flags,\n                        X_INPUT_KEYSTROKE* out_keystroke) override;\n};\n\n}  // namespace nop\n}  // namespace hid\n}  // namespace xe\n\n#endif  // XENIA_HID_NOP_NOP_INPUT_DRIVER_H_\n"
  },
  {
    "path": "src/xenia/hid/nop/premake5.lua",
    "content": "project_root = \"../../../..\"\ninclude(project_root..\"/tools/build\")\n\ngroup(\"src\")\nproject(\"xenia-hid-nop\")\n  uuid(\"887b6f26-b0c1-43c1-a013-a37e7b9634fd\")\n  kind(\"StaticLib\")\n  language(\"C++\")\n  links({\n    \"xenia-base\",\n    \"xenia-hid\",\n  })\n  defines({\n  })\n  local_platform_files()\n"
  },
  {
    "path": "src/xenia/hid/premake5.lua",
    "content": "project_root = \"../../..\"\ninclude(project_root..\"/tools/build\")\n\ngroup(\"src\")\nproject(\"xenia-hid\")\n  uuid(\"88a4ef38-c550-430f-8c22-8ded4e4ef601\")\n  kind(\"StaticLib\")\n  language(\"C++\")\n  links({\n    \"xenia-base\",\n  })\n  defines({\n  })\n  local_platform_files()\n  removefiles({\"*_demo.cc\"})\n\ngroup(\"demos\")\nproject(\"xenia-hid-demo\")\n  uuid(\"a56a209c-16d5-4913-85f9-86976fe7fddf\")\n  single_library_windowed_app_kind()\n  language(\"C++\")\n  links({\n    \"fmt\",\n    \"imgui\",\n    \"xenia-base\",\n    \"xenia-hid\",\n    \"xenia-hid-nop\",\n    \"xenia-ui\",\n    \"xenia-ui-vulkan\",\n  })\n  includedirs({\n    project_root..\"/third_party/Vulkan-Headers/include\",\n  })\n  files({\n    \"hid_demo.cc\",\n    \"../ui/windowed_app_main_\"..platform_suffix..\".cc\",\n  })\n  resincludedirs({\n    project_root,\n  })\n\n  filter(\"platforms:not Android-*\")\n    links({\n      \"xenia-helper-sdl\",\n      \"xenia-hid-sdl\",\n    })\n\n  filter(\"platforms:Linux\")\n    links({\n      \"SDL2\",\n      \"X11\",\n      \"xcb\",\n      \"X11-xcb\",\n    })\n\n  filter(\"platforms:Windows\")\n    links({\n      \"xenia-hid-winkey\",\n      \"xenia-hid-xinput\",\n    })\n"
  },
  {
    "path": "src/xenia/hid/sdl/premake5.lua",
    "content": "project_root = \"../../../..\"\ninclude(project_root..\"/tools/build\")\n\ngroup(\"src\")\nproject(\"xenia-hid-sdl\")\n  uuid(\"44f5b9a1-00f8-4825-acf1-5c93f26eba9b\")\n  kind(\"StaticLib\")\n  language(\"C++\")\n  links({\n    \"xenia-base\",\n    \"xenia-hid\",\n    \"xenia-ui\",\n    \"SDL2\",\n  })\n  defines({\n  })\n  local_platform_files()\n  sdl2_include()\n"
  },
  {
    "path": "src/xenia/hid/sdl/sdl_hid.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/hid/sdl/sdl_hid.h\"\n\n#include \"xenia/hid/sdl/sdl_input_driver.h\"\n\nnamespace xe {\nnamespace hid {\nnamespace sdl {\n\nstd::unique_ptr<InputDriver> Create(xe::ui::Window* window,\n                                    size_t window_z_order) {\n  return std::make_unique<SDLInputDriver>(window, window_z_order);\n}\n\n}  // namespace sdl\n}  // namespace hid\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/hid/sdl/sdl_hid.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_HID_SDL_SDL_HID_H_\n#define XENIA_HID_SDL_SDL_HID_H_\n\n#include <memory>\n\n#include \"xenia/hid/input_system.h\"\n\nnamespace xe {\nnamespace hid {\nnamespace sdl {\n\nstd::unique_ptr<InputDriver> Create(xe::ui::Window* window,\n                                    size_t window_z_order);\n\n}  // namespace sdl\n}  // namespace hid\n}  // namespace xe\n\n#endif  // XENIA_HID_SDL_SDL_HID_H_\n"
  },
  {
    "path": "src/xenia/hid/sdl/sdl_input_driver.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/hid/sdl/sdl_input_driver.h\"\n\n#include <array>\n\n#if XE_PLATFORM_WIN32\n#include \"xenia/base/platform_win.h\"\n#endif  // XE_PLATFORM_WIN32\n\n#include \"xenia/base/clock.h\"\n#include \"xenia/base/cvar.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/helper/sdl/sdl_helper.h\"\n#include \"xenia/hid/hid_flags.h\"\n#include \"xenia/ui/virtual_key.h\"\n#include \"xenia/ui/window.h\"\n#include \"xenia/ui/windowed_app_context.h\"\n\n// TODO(joellinn) make this path relative to the config folder.\nDEFINE_path(mappings_file, \"gamecontrollerdb.txt\",\n            \"Filename of a database with custom game controller mappings.\",\n            \"SDL\");\n\nnamespace xe {\nnamespace hid {\nnamespace sdl {\n\nSDLInputDriver::SDLInputDriver(xe::ui::Window* window, size_t window_z_order)\n    : InputDriver(window, window_z_order),\n      sdl_events_initialized_(false),\n      sdl_gamecontroller_initialized_(false),\n      sdl_events_unflushed_(0),\n      sdl_pumpevents_queued_(false),\n      controllers_(),\n      controllers_mutex_(),\n      keystroke_states_() {}\n\nSDLInputDriver::~SDLInputDriver() {\n  // Make sure the CallInUIThread is executed before destroying the references.\n  if (sdl_pumpevents_queued_) {\n    window()->app_context().CallInUIThreadSynchronous([this]() {\n      window()->app_context().ExecutePendingFunctionsFromUIThread();\n    });\n  }\n  for (size_t i = 0; i < controllers_.size(); i++) {\n    if (controllers_.at(i).sdl) {\n      SDL_GameControllerClose(controllers_.at(i).sdl);\n      controllers_.at(i) = {};\n    }\n  }\n  if (sdl_events_initialized_) {\n    SDL_QuitSubSystem(SDL_INIT_EVENTS);\n    sdl_events_initialized_ = false;\n  }\n  if (sdl_gamecontroller_initialized_) {\n    SDL_QuitSubSystem(SDL_INIT_GAMECONTROLLER);\n    sdl_gamecontroller_initialized_ = false;\n  }\n}\n\nX_STATUS SDLInputDriver::Setup() {\n  if (!TestSDLVersion()) {\n    return X_STATUS_UNSUCCESSFUL;\n  }\n\n  // SDL_PumpEvents should only be run in the thread that initialized SDL - we\n  // are hijacking the UI thread for that. If this function fails to be queued,\n  // the \"initialized\" variables will be false - that's handled safely.\n  window()->app_context().CallInUIThreadSynchronous([this]() {\n    if (!xe::helper::sdl::SDLHelper::Prepare()) {\n      return;\n    }\n    // Initialize the event system early, so we catch device events for already\n    // connected controllers.\n    if (SDL_InitSubSystem(SDL_INIT_EVENTS) < 0) {\n      return;\n    }\n    sdl_events_initialized_ = true;\n\n    // With an event watch we will always get notified, even if the event queue\n    // is full, which can happen if another subsystem does not clear its events.\n    SDL_AddEventWatch(\n        [](void* userdata, SDL_Event* event) -> int {\n          if (!userdata || !event) {\n            assert_always();\n            return 0;\n          }\n\n          const auto type = event->type;\n          if (type < SDL_JOYAXISMOTION || type >= SDL_FINGERDOWN) {\n            return 0;\n          }\n\n          // If another part of xenia uses another SDL subsystem that generates\n          // events, this may seem like a bad idea. They will however not\n          // subscribe to controller events so we get away with that.\n          const auto driver = static_cast<SDLInputDriver*>(userdata);\n          driver->HandleEvent(*event);\n\n          return 0;\n        },\n        this);\n\n    if (SDL_InitSubSystem(SDL_INIT_GAMECONTROLLER) < 0) {\n      return;\n    }\n    sdl_gamecontroller_initialized_ = true;\n\n    if (!cvars::mappings_file.empty()) {\n      if (!std::filesystem::exists(cvars::mappings_file)) {\n        XELOGW(\"SDL GameControllerDB: file '{}' does not exist.\",\n               xe::path_to_utf8(cvars::mappings_file));\n      } else {\n        auto mappings_file = filesystem::OpenFile(cvars::mappings_file, \"rb\");\n        if (!mappings_file) {\n          XELOGE(\"SDL GameControllerDB: failed to open file '{}'.\",\n                 xe::path_to_utf8(cvars::mappings_file));\n        } else {\n          auto mappings_result = SDL_GameControllerAddMappingsFromRW(\n              SDL_RWFromFP(mappings_file, SDL_TRUE), 1);\n          if (mappings_result < 0) {\n            XELOGE(\"SDL GameControllerDB: error loading file '{}': {}.\",\n                   xe::path_to_utf8(cvars::mappings_file), mappings_result);\n          } else {\n            XELOGI(\"SDL GameControllerDB: loaded {} mappings.\",\n                   mappings_result);\n          }\n        }\n      }\n    }\n  });\n  return (sdl_events_initialized_ && sdl_gamecontroller_initialized_)\n             ? X_STATUS_SUCCESS\n             : X_STATUS_UNSUCCESSFUL;\n}\n\nX_RESULT SDLInputDriver::GetCapabilities(uint32_t user_index, uint32_t flags,\n                                         X_INPUT_CAPABILITIES* out_caps) {\n  assert(sdl_events_initialized_ && sdl_gamecontroller_initialized_);\n  if (user_index >= HID_SDL_USER_COUNT || !out_caps) {\n    return X_ERROR_BAD_ARGUMENTS;\n  }\n\n  QueueControllerUpdate();\n\n  std::unique_lock<std::mutex> guard(controllers_mutex_);\n\n  auto controller = GetControllerState(user_index);\n  if (!controller) {\n    return X_ERROR_DEVICE_NOT_CONNECTED;\n  }\n\n  // Unfortunately drivers can't present all information immediately (e.g.\n  // battery information) so this needs to be refreshed every time.\n  UpdateXCapabilities(*controller);\n\n  std::memcpy(out_caps, &controller->caps, sizeof(*out_caps));\n\n  return X_ERROR_SUCCESS;\n}\n\nX_RESULT SDLInputDriver::GetState(uint32_t user_index,\n                                  X_INPUT_STATE* out_state) {\n  assert(sdl_events_initialized_ && sdl_gamecontroller_initialized_);\n  if (user_index >= HID_SDL_USER_COUNT) {\n    return X_ERROR_BAD_ARGUMENTS;\n  }\n\n  auto is_active = this->is_active();\n\n  if (is_active) {\n    QueueControllerUpdate();\n  }\n\n  std::unique_lock<std::mutex> guard(controllers_mutex_);\n\n  auto controller = GetControllerState(user_index);\n  if (!controller) {\n    return X_ERROR_DEVICE_NOT_CONNECTED;\n  }\n\n  // Make sure packet_number is only incremented by 1, even if there have been\n  // multiple updates between GetState calls. Also track `is_active` to\n  // increment the packet number if it changed.\n  if ((is_active != controller->is_active) ||\n      (is_active && controller->state_changed)) {\n    controller->state.packet_number++;\n    controller->is_active = is_active;\n    controller->state_changed = false;\n  }\n  std::memcpy(out_state, &controller->state, sizeof(*out_state));\n  if (!is_active) {\n    // Simulate an \"untouched\" controller. When we become active again the\n    // pressed buttons aren't lost and will be visible again.\n    std::memset(&out_state->gamepad, 0, sizeof(out_state->gamepad));\n  }\n  return X_ERROR_SUCCESS;\n}\n\nX_RESULT SDLInputDriver::SetState(uint32_t user_index,\n                                  X_INPUT_VIBRATION* vibration) {\n  assert(sdl_events_initialized_ && sdl_gamecontroller_initialized_);\n  if (user_index >= HID_SDL_USER_COUNT) {\n    return X_ERROR_BAD_ARGUMENTS;\n  }\n\n  QueueControllerUpdate();\n\n  std::unique_lock<std::mutex> guard(controllers_mutex_);\n\n  auto controller = GetControllerState(user_index);\n  if (!controller) {\n    return X_ERROR_DEVICE_NOT_CONNECTED;\n  }\n\n#if SDL_VERSION_ATLEAST(2, 0, 9)\n  if (SDL_GameControllerRumble(controller->sdl, vibration->left_motor_speed,\n                               vibration->right_motor_speed, 0)) {\n    return X_ERROR_FUNCTION_FAILED;\n  } else {\n    return X_ERROR_SUCCESS;\n  }\n#else\n  return X_ERROR_SUCCESS;\n#endif\n}\n\nX_RESULT SDLInputDriver::GetKeystroke(uint32_t users, uint32_t flags,\n                                      X_INPUT_KEYSTROKE* out_keystroke) {\n  // TODO(JoelLinn): Figure out the flags\n  // https://github.com/evilC/UCR/blob/0489929e2a8e39caa3484c67f3993d3fba39e46f/Libraries/XInput.ahk#L85-L98\n  assert(sdl_events_initialized_ && sdl_gamecontroller_initialized_);\n  bool user_any = users == 0xFF;\n  if (users >= HID_SDL_USER_COUNT && !user_any) {\n    return X_ERROR_BAD_ARGUMENTS;\n  }\n  if (!out_keystroke) {\n    return X_ERROR_BAD_ARGUMENTS;\n  }\n\n  // The order of this list is also the order in which events are send if\n  // multiple buttons change at once.\n  static_assert(sizeof(X_INPUT_GAMEPAD::buttons) == 2);\n  static constexpr std::array<ui::VirtualKey, 34> kVkLookup = {\n      // 00 - True buttons from xinput button field\n      ui::VirtualKey::kXInputPadDpadUp,\n      ui::VirtualKey::kXInputPadDpadDown,\n      ui::VirtualKey::kXInputPadDpadLeft,\n      ui::VirtualKey::kXInputPadDpadRight,\n      ui::VirtualKey::kXInputPadStart,\n      ui::VirtualKey::kXInputPadBack,\n      ui::VirtualKey::kXInputPadLThumbPress,\n      ui::VirtualKey::kXInputPadRThumbPress,\n      ui::VirtualKey::kXInputPadLShoulder,\n      ui::VirtualKey::kXInputPadRShoulder,\n      ui::VirtualKey::kNone, /* Guide has no VK */\n      ui::VirtualKey::kNone, /* Unknown */\n      ui::VirtualKey::kXInputPadA,\n      ui::VirtualKey::kXInputPadB,\n      ui::VirtualKey::kXInputPadX,\n      ui::VirtualKey::kXInputPadY,\n      // 16 - Fake buttons generated from analog inputs\n      ui::VirtualKey::kXInputPadLTrigger,\n      ui::VirtualKey::kXInputPadRTrigger,\n      // 18\n      ui::VirtualKey::kXInputPadLThumbUp,\n      ui::VirtualKey::kXInputPadLThumbDown,\n      ui::VirtualKey::kXInputPadLThumbRight,\n      ui::VirtualKey::kXInputPadLThumbLeft,\n      ui::VirtualKey::kXInputPadLThumbUpLeft,\n      ui::VirtualKey::kXInputPadLThumbUpRight,\n      ui::VirtualKey::kXInputPadLThumbDownRight,\n      ui::VirtualKey::kXInputPadLThumbDownLeft,\n      // 26\n      ui::VirtualKey::kXInputPadRThumbUp,\n      ui::VirtualKey::kXInputPadRThumbDown,\n      ui::VirtualKey::kXInputPadRThumbRight,\n      ui::VirtualKey::kXInputPadRThumbLeft,\n      ui::VirtualKey::kXInputPadRThumbUpLeft,\n      ui::VirtualKey::kXInputPadRThumbUpRight,\n      ui::VirtualKey::kXInputPadRThumbDownRight,\n      ui::VirtualKey::kXInputPadRThumbDownLeft,\n  };\n\n  auto is_active = this->is_active();\n\n  if (is_active) {\n    QueueControllerUpdate();\n  }\n\n  std::unique_lock<std::mutex> guard(controllers_mutex_);\n\n  for (uint32_t user_index = (user_any ? 0 : users);\n       user_index < (user_any ? HID_SDL_USER_COUNT : users + 1); user_index++) {\n    auto controller = GetControllerState(user_index);\n    if (!controller) {\n      if (user_any) {\n        continue;\n      } else {\n        return X_ERROR_DEVICE_NOT_CONNECTED;\n      }\n    }\n\n    // If input is not active (e.g. due to a dialog overlay), force buttons to\n    // \"unpressed\". The algorithm will automatically send UP events when\n    // `is_active()` goes low and DOWN events when it goes high again.\n    const uint64_t curr_butts =\n        is_active ? (controller->state.gamepad.buttons |\n                     AnalogToKeyfield(controller->state.gamepad))\n                  : uint64_t(0);\n    KeystrokeState& last = keystroke_states_.at(user_index);\n\n    // Handle repeating\n    auto guest_now = Clock::QueryGuestUptimeMillis();\n    static_assert(HID_SDL_REPEAT_DELAY >= HID_SDL_REPEAT_RATE);\n    if (last.repeat_state == RepeatState::Waiting &&\n        (last.repeat_time + HID_SDL_REPEAT_DELAY < guest_now)) {\n      last.repeat_state = RepeatState::Repeating;\n    }\n    if (last.repeat_state == RepeatState::Repeating &&\n        (last.repeat_time + HID_SDL_REPEAT_RATE < guest_now)) {\n      last.repeat_time = guest_now;\n      ui::VirtualKey vk = kVkLookup.at(last.repeat_butt_idx);\n      assert_true(vk != ui::VirtualKey::kNone);\n      out_keystroke->virtual_key = uint16_t(vk);\n      out_keystroke->unicode = 0;\n      out_keystroke->user_index = user_index;\n      out_keystroke->hid_code = 0;\n      out_keystroke->flags =\n          X_INPUT_KEYSTROKE_KEYDOWN | X_INPUT_KEYSTROKE_REPEAT;\n      return X_ERROR_SUCCESS;\n    }\n\n    auto butts_changed = curr_butts ^ last.buttons;\n    if (!butts_changed) {\n      continue;\n    }\n\n    // First try to clear buttons with up events. This is to match xinput\n    // behaviour when transitioning thumb sticks, e.g. so that THUMB_UPLEFT is\n    // up before THUMB_LEFT is down.\n    for (auto [clear_pass, i] = std::tuple{true, 0}; i < 2;\n         clear_pass = false, i++) {\n      for (uint8_t i = 0; i < uint8_t(std::size(kVkLookup)); i++) {\n        auto fbutton = uint64_t(1) << i;\n        if (!(butts_changed & fbutton)) {\n          continue;\n        }\n        ui::VirtualKey vk = kVkLookup.at(i);\n        if (vk == ui::VirtualKey::kNone) {\n          continue;\n        }\n\n        out_keystroke->virtual_key = uint16_t(vk);\n        out_keystroke->unicode = 0;\n        out_keystroke->user_index = user_index;\n        out_keystroke->hid_code = 0;\n\n        bool is_pressed = curr_butts & fbutton;\n        if (clear_pass && !is_pressed) {\n          // up\n          out_keystroke->flags = X_INPUT_KEYSTROKE_KEYUP;\n          last.buttons &= ~fbutton;\n          last.repeat_state = RepeatState::Idle;\n          return X_ERROR_SUCCESS;\n        }\n        if (!clear_pass && is_pressed) {\n          // down\n          out_keystroke->flags = X_INPUT_KEYSTROKE_KEYDOWN;\n          last.buttons |= fbutton;\n          last.repeat_state = RepeatState::Waiting;\n          last.repeat_butt_idx = i;\n          last.repeat_time = guest_now;\n          return X_ERROR_SUCCESS;\n        }\n      }\n    }\n  }\n  return X_ERROR_EMPTY;\n}\n\nvoid SDLInputDriver::HandleEvent(const SDL_Event& event) {\n  // This callback will likely run on the thread that posts the event, which\n  // may be a dedicated thread SDL has created for the joystick subsystem.\n\n  // Event queue should never be (this) full\n  assert(SDL_PeepEvents(nullptr, 0, SDL_PEEKEVENT, SDL_FIRSTEVENT,\n                        SDL_LASTEVENT) < 0xFFFF);\n\n  // The queue could grow up to 3.5MB since it is never polled.\n  if (++sdl_events_unflushed_ > 64) {\n    SDL_FlushEvents(SDL_JOYAXISMOTION, SDL_FINGERDOWN - 1);\n    sdl_events_unflushed_ = 0;\n  }\n  switch (event.type) {\n    case SDL_CONTROLLERDEVICEADDED:\n      OnControllerDeviceAdded(event);\n      break;\n    case SDL_CONTROLLERDEVICEREMOVED:\n      OnControllerDeviceRemoved(event);\n      break;\n    case SDL_CONTROLLERAXISMOTION:\n      OnControllerDeviceAxisMotion(event);\n      break;\n    case SDL_CONTROLLERBUTTONDOWN:\n    case SDL_CONTROLLERBUTTONUP:\n      OnControllerDeviceButtonChanged(event);\n      break;\n    default:\n      break;\n  }\n  return;\n}\n\nvoid SDLInputDriver::OnControllerDeviceAdded(const SDL_Event& event) {\n  std::unique_lock<std::mutex> guard(controllers_mutex_);\n\n  // Open the controller.\n  const auto controller = SDL_GameControllerOpen(event.cdevice.which);\n  if (!controller) {\n    assert_always();\n    return;\n  }\n  XELOGI(\n      \"SDL OnControllerDeviceAdded: \\\"{}\\\", \"\n      \"JoystickType({}), \"\n      \"GameControllerType({}), \"\n      \"VendorID(0x{:04X}), \"\n      \"ProductID(0x{:04X})\",\n      SDL_GameControllerName(controller),\n      SDL_JoystickGetType(SDL_GameControllerGetJoystick(controller)),\n#if SDL_VERSION_ATLEAST(2, 0, 12)\n      SDL_GameControllerGetType(controller),\n#else\n      \"?\",\n#endif\n#if SDL_VERSION_ATLEAST(2, 0, 6)\n      SDL_GameControllerGetVendor(controller),\n      SDL_GameControllerGetProduct(controller));\n#else\n      \"?\", \"?\");\n#endif\n  int user_id = -1;\n#if SDL_VERSION_ATLEAST(2, 0, 9)\n  // Check if the controller has a player index LED.\n  user_id = SDL_GameControllerGetPlayerIndex(controller);\n  // Is that id already taken?\n  if (user_id < 0 || user_id >= controllers_.size() ||\n      controllers_.at(user_id).sdl) {\n    user_id = -1;\n  }\n#endif\n  // No player index or already taken, just take the first free slot.\n  if (user_id < 0) {\n    for (size_t i = 0; i < controllers_.size(); i++) {\n      if (!controllers_.at(i).sdl) {\n        user_id = static_cast<int>(i);\n#if SDL_VERSION_ATLEAST(2, 0, 12)\n        SDL_GameControllerSetPlayerIndex(controller, user_id);\n#endif\n        break;\n      }\n    }\n  }\n  if (user_id >= 0) {\n    auto& state = controllers_.at(user_id);\n    state = {controller, {}};\n    // XInput seems to start with packet_number = 1 .\n    state.state_changed = true;\n    UpdateXCapabilities(state);\n\n    XELOGI(\"SDL OnControllerDeviceAdded: Added at index {}.\", user_id);\n  } else {\n    // No more controllers needed, close it.\n    SDL_GameControllerClose(controller);\n    XELOGW(\"SDL OnControllerDeviceAdded: Ignored. No free slots.\");\n  }\n}\n\nvoid SDLInputDriver::OnControllerDeviceRemoved(const SDL_Event& event) {\n  std::unique_lock<std::mutex> guard(controllers_mutex_);\n\n  // Find the disconnected gamecontroller and close it.\n  auto idx = GetControllerIndexFromInstanceID(event.cdevice.which);\n  if (idx) {\n    SDL_GameControllerClose(controllers_.at(*idx).sdl);\n    controllers_.at(*idx) = {};\n    keystroke_states_.at(*idx) = {};\n    XELOGI(\"SDL OnControllerDeviceRemoved: Removed at player index {}.\", *idx);\n  } else {\n    // Can happen in case all slots where full previously.\n    XELOGW(\"SDL OnControllerDeviceRemoved: Ignored. Unused device.\");\n  }\n}\n\nvoid SDLInputDriver::OnControllerDeviceAxisMotion(const SDL_Event& event) {\n  std::unique_lock<std::mutex> guard(controllers_mutex_);\n\n  auto idx = GetControllerIndexFromInstanceID(event.caxis.which);\n  assert(idx);\n  auto& pad = controllers_.at(*idx).state.gamepad;\n  switch (event.caxis.axis) {\n    case SDL_CONTROLLER_AXIS_LEFTX:\n      pad.thumb_lx = event.caxis.value;\n      break;\n    case SDL_CONTROLLER_AXIS_LEFTY:\n      pad.thumb_ly = ~event.caxis.value;\n      break;\n    case SDL_CONTROLLER_AXIS_RIGHTX:\n      pad.thumb_rx = event.caxis.value;\n      break;\n    case SDL_CONTROLLER_AXIS_RIGHTY:\n      pad.thumb_ry = ~event.caxis.value;\n      break;\n    case SDL_CONTROLLER_AXIS_TRIGGERLEFT:\n      pad.left_trigger = static_cast<uint8_t>(event.caxis.value >> 7);\n      break;\n    case SDL_CONTROLLER_AXIS_TRIGGERRIGHT:\n      pad.right_trigger = static_cast<uint8_t>(event.caxis.value >> 7);\n      break;\n    default:\n      assert_always();\n      break;\n  }\n  controllers_.at(*idx).state_changed = true;\n}\n\nvoid SDLInputDriver::OnControllerDeviceButtonChanged(const SDL_Event& event) {\n  std::unique_lock<std::mutex> guard(controllers_mutex_);\n\n  // Define a lookup table to map between SDL and XInput button codes.\n  // These need to be in the order of the SDL_GameControllerButton enum.\n  static constexpr std::array<\n      std::underlying_type<X_INPUT_GAMEPAD_BUTTON>::type, 21>\n      xbutton_lookup = {\n          // Standard buttons:\n          X_INPUT_GAMEPAD_A,\n          X_INPUT_GAMEPAD_B,\n          X_INPUT_GAMEPAD_X,\n          X_INPUT_GAMEPAD_Y,\n          X_INPUT_GAMEPAD_BACK,\n          X_INPUT_GAMEPAD_GUIDE,\n          X_INPUT_GAMEPAD_START,\n          X_INPUT_GAMEPAD_LEFT_THUMB,\n          X_INPUT_GAMEPAD_RIGHT_THUMB,\n          X_INPUT_GAMEPAD_LEFT_SHOULDER,\n          X_INPUT_GAMEPAD_RIGHT_SHOULDER,\n          X_INPUT_GAMEPAD_DPAD_UP,\n          X_INPUT_GAMEPAD_DPAD_DOWN,\n          X_INPUT_GAMEPAD_DPAD_LEFT,\n          X_INPUT_GAMEPAD_DPAD_RIGHT,\n          // There are additional buttons only available on some controllers.\n          // For now just assign sensible defaults\n          // Misc:\n          X_INPUT_GAMEPAD_GUIDE,\n          // Xbox Elite paddles:\n          X_INPUT_GAMEPAD_Y,\n          X_INPUT_GAMEPAD_B,\n          X_INPUT_GAMEPAD_X,\n          X_INPUT_GAMEPAD_A,\n          // PS touchpad button\n          X_INPUT_GAMEPAD_GUIDE,\n      };\n  static_assert(SDL_CONTROLLER_BUTTON_A == 0);\n  static_assert(SDL_CONTROLLER_BUTTON_DPAD_RIGHT == 14);\n\n  auto idx = GetControllerIndexFromInstanceID(event.cbutton.which);\n  assert(idx);\n  auto& controller = controllers_.at(*idx);\n\n  uint16_t xbuttons = controller.state.gamepad.buttons;\n  // Lookup the XInput button code.\n  if (event.cbutton.button >= xbutton_lookup.size()) {\n    // A newer SDL Version may have added new buttons.\n    XELOGI(\"SDL HID: Unknown button was pressed: {}.\", event.cbutton.button);\n    return;\n  }\n  auto xbutton = xbutton_lookup.at(event.cbutton.button);\n  // Pressed or released?\n  if (event.cbutton.state == SDL_PRESSED) {\n    if (xbutton == X_INPUT_GAMEPAD_GUIDE && !cvars::guide_button) {\n      return;\n    }\n    xbuttons |= xbutton;\n  } else {\n    xbuttons &= ~xbutton;\n  }\n  controller.state.gamepad.buttons = xbuttons;\n  controller.state_changed = true;\n}\n\nstd::optional<size_t> SDLInputDriver::GetControllerIndexFromInstanceID(\n    SDL_JoystickID instance_id) {\n  // Loop through our controllers and try to match the given ID.\n  for (size_t i = 0; i < controllers_.size(); i++) {\n    auto controller = controllers_.at(i).sdl;\n    if (!controller) {\n      continue;\n    }\n    auto joystick = SDL_GameControllerGetJoystick(controller);\n    assert(joystick);\n    auto joy_instance_id = SDL_JoystickInstanceID(joystick);\n    assert(joy_instance_id >= 0);\n    if (joy_instance_id == instance_id) {\n      return i;\n    }\n  }\n  return std::nullopt;\n}\n\nSDLInputDriver::ControllerState* SDLInputDriver::GetControllerState(\n    uint32_t user_index) {\n  if (user_index >= controllers_.size()) {\n    return nullptr;\n  }\n  auto controller = &controllers_.at(user_index);\n  if (!controller->sdl) {\n    return nullptr;\n  }\n  return controller;\n}\n\nbool SDLInputDriver::TestSDLVersion() const {\n#if SDL_VERSION_ATLEAST(2, 0, 9)\n  // SDL 2.0.9 or newer is required for simple rumble support and player\n  // index.\n  const Uint8 min_patchlevel = 9;\n#else\n  // SDL 2.0.4 or newer is required to read game controller mappings from\n  // file.\n  const Uint8 min_patchlevel = 4;\n#endif\n\n  SDL_version ver = {};\n  SDL_GetVersion(&ver);\n  if ((ver.major < 2) ||\n      (ver.major == 2 && ver.minor == 0 && ver.patch < min_patchlevel)) {\n    return false;\n  }\n  return true;\n}\n\nvoid SDLInputDriver::UpdateXCapabilities(ControllerState& state) {\n  assert(state.sdl);\n  uint16_t cap_flags = 0x0;\n\n  // The RAWINPUT driver combines and enhances input from different APIs. For\n  // details, see `SDL_rawinputjoystick.c`. This correlation however has latency\n  // which might confuse games calling `GetCapabilities()` (The power level is\n  // only available after the controller has been \"touched\"). Generally that\n  // should not be a problem, when in doubt disable the RAWINPUT driver via hint\n  // (env var).\n\n  // Guess if we are wireless\n  auto power_level =\n      SDL_JoystickCurrentPowerLevel(SDL_GameControllerGetJoystick(state.sdl));\n  if (power_level >= SDL_JOYSTICK_POWER_EMPTY &&\n      power_level <= SDL_JOYSTICK_POWER_FULL) {\n    cap_flags |= X_INPUT_CAPS_WIRELESS;\n  }\n\n  // Check if all navigational buttons are present\n  static constexpr std::array<SDL_GameControllerButton, 6> nav_buttons = {\n      SDL_CONTROLLER_BUTTON_START,     SDL_CONTROLLER_BUTTON_BACK,\n      SDL_CONTROLLER_BUTTON_DPAD_UP,   SDL_CONTROLLER_BUTTON_DPAD_DOWN,\n      SDL_CONTROLLER_BUTTON_DPAD_LEFT, SDL_CONTROLLER_BUTTON_DPAD_RIGHT,\n  };\n  for (auto it = nav_buttons.begin(); it < nav_buttons.end(); it++) {\n    auto bind = SDL_GameControllerGetBindForButton(state.sdl, *it);\n    if (bind.bindType == SDL_CONTROLLER_BINDTYPE_NONE) {\n      cap_flags |= X_INPUT_CAPS_NO_NAVIGATION;\n      break;\n    }\n  }\n\n  auto& c = state.caps;\n  c.type = 0x01;      // XINPUT_DEVTYPE_GAMEPAD\n  c.sub_type = 0x01;  // XINPUT_DEVSUBTYPE_GAMEPAD\n  c.flags = cap_flags;\n  c.gamepad.buttons =\n      0xF3FF | (cvars::guide_button ? X_INPUT_GAMEPAD_GUIDE : 0x0);\n  c.gamepad.left_trigger = 0xFF;\n  c.gamepad.right_trigger = 0xFF;\n  c.gamepad.thumb_lx = static_cast<int16_t>(0xFFFFu);\n  c.gamepad.thumb_ly = static_cast<int16_t>(0xFFFFu);\n  c.gamepad.thumb_rx = static_cast<int16_t>(0xFFFFu);\n  c.gamepad.thumb_ry = static_cast<int16_t>(0xFFFFu);\n  c.vibration.left_motor_speed = 0xFFFFu;\n  c.vibration.right_motor_speed = 0xFFFFu;\n}\n\nvoid SDLInputDriver::QueueControllerUpdate() {\n  // To minimize consecutive event pumps do not queue before previous pump is\n  // finished.\n  bool is_queued = false;\n  sdl_pumpevents_queued_.compare_exchange_strong(is_queued, true);\n  if (!is_queued) {\n    window()->app_context().CallInUIThread([this]() {\n      SDL_PumpEvents();\n      sdl_pumpevents_queued_ = false;\n    });\n  }\n}\n\n// Check if the analog inputs exceed their thresholds to become a button press\n// and build the bitfield.\ninline uint64_t SDLInputDriver::AnalogToKeyfield(\n    const X_INPUT_GAMEPAD& gamepad) const {\n  uint64_t f = 0;\n\n  f |= static_cast<uint64_t>(gamepad.left_trigger > HID_SDL_TRIGG_THRES) << 16;\n  f |= static_cast<uint64_t>(gamepad.right_trigger > HID_SDL_TRIGG_THRES) << 17;\n\n  auto thumb_x = gamepad.thumb_lx;\n  auto thumb_y = gamepad.thumb_ly;\n  for (size_t i = 0; i <= 8; i = i + 8) {\n    uint64_t u = thumb_y > HID_SDL_THUMB_THRES;\n    uint64_t d = thumb_y < ~HID_SDL_THUMB_THRES;\n    uint64_t r = thumb_x > HID_SDL_THUMB_THRES;\n    uint64_t l = thumb_x < ~HID_SDL_THUMB_THRES;\n    if (u && l) {\n      u = l = 0;\n      f |= uint64_t(1) << (22 + i);\n    }\n    if (u && r) {\n      u = r = 0;\n      f |= uint64_t(1) << (23 + i);\n    }\n    if (d && r) {\n      d = r = 0;\n      f |= uint64_t(1) << (24 + i);\n    }\n    if (d && l) {\n      d = l = 0;\n      f |= uint64_t(1) << (25 + i);\n    }\n    f |= u << (18 + i);\n    f |= d << (19 + i);\n    f |= r << (20 + i);\n    f |= l << (21 + i);\n\n    thumb_x = gamepad.thumb_rx;\n    thumb_y = gamepad.thumb_ry;\n  }\n  return f;\n}\n\n}  // namespace sdl\n}  // namespace hid\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/hid/sdl/sdl_input_driver.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_HID_SDL_SDL_INPUT_DRIVER_H_\n#define XENIA_HID_SDL_SDL_INPUT_DRIVER_H_\n\n#include <array>\n#include <atomic>\n#include <mutex>\n#include <optional>\n\n#include \"SDL.h\"\n#include \"xenia/hid/input_driver.h\"\n\n#define HID_SDL_USER_COUNT 4\n#define HID_SDL_THUMB_THRES 0x4E00\n#define HID_SDL_TRIGG_THRES 0x1F\n#define HID_SDL_REPEAT_DELAY 400\n#define HID_SDL_REPEAT_RATE 100\n\nnamespace xe {\nnamespace hid {\nnamespace sdl {\n\nclass SDLInputDriver final : public InputDriver {\n public:\n  explicit SDLInputDriver(xe::ui::Window* window, size_t window_z_order);\n  ~SDLInputDriver() override;\n\n  X_STATUS Setup() override;\n\n  X_RESULT GetCapabilities(uint32_t user_index, uint32_t flags,\n                           X_INPUT_CAPABILITIES* out_caps) override;\n  X_RESULT GetState(uint32_t user_index, X_INPUT_STATE* out_state) override;\n  X_RESULT SetState(uint32_t user_index, X_INPUT_VIBRATION* vibration) override;\n  X_RESULT GetKeystroke(uint32_t user_index, uint32_t flags,\n                        X_INPUT_KEYSTROKE* out_keystroke) override;\n\n private:\n  struct ControllerState {\n    SDL_GameController* sdl;\n    X_INPUT_CAPABILITIES caps;\n    X_INPUT_STATE state;\n    bool state_changed;\n    bool is_active;\n  };\n\n  enum class RepeatState {\n    Idle,       // no buttons pressed or repeating has ended\n    Waiting,    // a button is held and the delay is awaited\n    Repeating,  // actively repeating at a rate\n  };\n  struct KeystrokeState {\n    uint64_t buttons;\n    RepeatState repeat_state;\n    // the button number that was pressed last:\n    uint8_t repeat_butt_idx;\n    // the last time (ms) a down (and/or repeat) event for that button was send:\n    uint32_t repeat_time;\n  };\n\n  void HandleEvent(const SDL_Event& event);\n  void OnControllerDeviceAdded(const SDL_Event& event);\n  void OnControllerDeviceRemoved(const SDL_Event& event);\n  void OnControllerDeviceAxisMotion(const SDL_Event& event);\n  void OnControllerDeviceButtonChanged(const SDL_Event& event);\n\n  inline uint64_t AnalogToKeyfield(const X_INPUT_GAMEPAD& gamepad) const;\n  std::optional<size_t> GetControllerIndexFromInstanceID(\n      SDL_JoystickID instance_id);\n  ControllerState* GetControllerState(uint32_t user_index);\n  bool TestSDLVersion() const;\n  void UpdateXCapabilities(ControllerState& state);\n  void QueueControllerUpdate();\n\n  bool sdl_events_initialized_;\n  bool sdl_gamecontroller_initialized_;\n  int sdl_events_unflushed_;\n  std::atomic<bool> sdl_pumpevents_queued_;\n  std::array<ControllerState, HID_SDL_USER_COUNT> controllers_;\n  std::mutex controllers_mutex_;\n  std::array<KeystrokeState, HID_SDL_USER_COUNT> keystroke_states_;\n};\n\n}  // namespace sdl\n}  // namespace hid\n}  // namespace xe\n\n#endif  // XENIA_HID_SDL_SDL_INPUT_DRIVER_H_\n"
  },
  {
    "path": "src/xenia/hid/winkey/premake5.lua",
    "content": "project_root = \"../../../..\"\ninclude(project_root..\"/tools/build\")\n\ngroup(\"src\")\nproject(\"xenia-hid-winkey\")\n  uuid(\"fd16e19a-6219-4ab7-b95a-7c78523c50c3\")\n  kind(\"StaticLib\")\n  language(\"C++\")\n  links({\n    \"xenia-base\",\n    \"xenia-hid\",\n    \"xenia-ui\",\n  })\n  defines({\n  })\n  local_platform_files()\n"
  },
  {
    "path": "src/xenia/hid/winkey/winkey_binding_table.inc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n// This is a partial file designed to be included by other files when\n// constructing various tables.\n\n// clang-format off\nXE_HID_WINKEY_BINDING(DpadLeft,    \"DPAD_LEFT\"          , keybind_dpad_left        , \"^A\"  )\nXE_HID_WINKEY_BINDING(DpadRight,   \"DPAD_RIGHT\"         , keybind_dpad_right       , \"^D\"  )\nXE_HID_WINKEY_BINDING(DpadDown,    \"DPAD_DOWN\"          , keybind_dpad_down        , \"^S\"  )\nXE_HID_WINKEY_BINDING(DpadUp,      \"DPAD_UP\"            , keybind_dpad_up          , \"^W\"  )\nXE_HID_WINKEY_BINDING(LThumbLeft,  \"LEFT_THUMB_LEFT\"    , keybind_left_thumb_left  , \"_A\"  )\nXE_HID_WINKEY_BINDING(LThumbRight, \"LEFT_THUMB_RIGHT\"   , keybind_left_thumb_right , \"_D\"  )\nXE_HID_WINKEY_BINDING(LThumbDown,  \"LEFT_THUMB_DOWN\"    , keybind_left_thumb_down  , \"_S\"  )\nXE_HID_WINKEY_BINDING(LThumbUp,    \"LEFT_THUMB_UP\"      , keybind_left_thumb_up    , \"_W\"  )\nXE_HID_WINKEY_BINDING(LThumbPress, \"LEFT_THUMB_PRESSED\" , keybind_left_thumb       , \"F\"   )\nXE_HID_WINKEY_BINDING(RThumbUp,    \"RIGHT_THUMB_UP\"     , keybind_right_thumb_up   , \"0x26\")\nXE_HID_WINKEY_BINDING(RThumbDown,  \"RIGHT_THUMB_DOWN\"   , keybind_right_thumb_down , \"0x28\")\nXE_HID_WINKEY_BINDING(RThumbRight, \"RIGHT_THUMB_RIGHT\"  , keybind_right_thumb_right, \"0x27\")\nXE_HID_WINKEY_BINDING(RThumbLeft,  \"RIGHT_THUMB_LEFT\"   , keybind_right_thumb_left , \"0x25\")\nXE_HID_WINKEY_BINDING(RThumbPress, \"RIGHT_THUMB_PRESSED\", keybind_right_thumb      , \"K\"   )\nXE_HID_WINKEY_BINDING(X,           \"X\"                  , keybind_x                , \"L\"   )\nXE_HID_WINKEY_BINDING(B,           \"B\"                  , keybind_b                , \"0xDE\")\nXE_HID_WINKEY_BINDING(A,           \"A\"                  , keybind_a                , \"0xBA\")\nXE_HID_WINKEY_BINDING(Y,           \"Y\"                  , keybind_y                , \"P\"   )\nXE_HID_WINKEY_BINDING(LTrigger,    \"LEFT_TRIGGER\"       , keybind_left_trigger     , \"Q I\" )\nXE_HID_WINKEY_BINDING(RTrigger,    \"RIGHT_TRIGGER\"      , keybind_right_trigger    , \"E O\" )\nXE_HID_WINKEY_BINDING(Back,        \"BACK\"               , keybind_back             , \"Z\"   )\nXE_HID_WINKEY_BINDING(Start,       \"START\"              , keybind_start            , \"X\"   )\nXE_HID_WINKEY_BINDING(LShoulder,   \"LEFT_SHOULDER\"      , keybind_left_shoulder    , \"1\"   )\nXE_HID_WINKEY_BINDING(RShoulder,   \"RIGHT_SHOULDER\"     , keybind_right_shoulder   , \"3\"   )\n// clang-format on\n"
  },
  {
    "path": "src/xenia/hid/winkey/winkey_hid.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/hid/winkey/winkey_hid.h\"\n\n#include \"xenia/hid/winkey/winkey_input_driver.h\"\n\nnamespace xe {\nnamespace hid {\nnamespace winkey {\n\nstd::unique_ptr<InputDriver> Create(xe::ui::Window* window,\n                                    size_t window_z_order) {\n  return std::make_unique<WinKeyInputDriver>(window, window_z_order);\n}\n\n}  // namespace winkey\n}  // namespace hid\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/hid/winkey/winkey_hid.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_HID_WINKEY_WINKEY_HID_H_\n#define XENIA_HID_WINKEY_WINKEY_HID_H_\n\n#include <memory>\n\n#include \"xenia/hid/input_system.h\"\n\nnamespace xe {\nnamespace hid {\nnamespace winkey {\n\nstd::unique_ptr<InputDriver> Create(xe::ui::Window* window,\n                                    size_t window_z_order);\n\n}  // namespace winkey\n}  // namespace hid\n}  // namespace xe\n\n#endif  // XENIA_HID_WINKEY_WINKEY_HID_H_\n"
  },
  {
    "path": "src/xenia/hid/winkey/winkey_input_driver.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/hid/winkey/winkey_input_driver.h\"\n\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/platform_win.h\"\n#include \"xenia/hid/hid_flags.h\"\n#include \"xenia/hid/input_system.h\"\n#include \"xenia/ui/virtual_key.h\"\n#include \"xenia/ui/window.h\"\n\n#define XE_HID_WINKEY_BINDING(button, description, cvar_name, \\\n                              cvar_default_value)             \\\n  DEFINE_string(cvar_name, cvar_default_value,                \\\n                \"List of keys to bind to \" description        \\\n                \", separated by spaces\",                      \\\n                \"HID.WinKey\")\n#include \"winkey_binding_table.inc\"\n#undef XE_HID_WINKEY_BINDING\n\nnamespace xe {\nnamespace hid {\nnamespace winkey {\n\nbool __inline IsKeyToggled(uint8_t key) {\n  return (GetKeyState(key) & 0x1) == 0x1;\n}\n\nbool __inline IsKeyDown(uint8_t key) {\n  return (GetAsyncKeyState(key) & 0x8000) == 0x8000;\n}\n\nbool __inline IsKeyDown(ui::VirtualKey virtual_key) {\n  return IsKeyDown(static_cast<uint8_t>(virtual_key));\n}\n\nvoid WinKeyInputDriver::ParseKeyBinding(ui::VirtualKey output_key,\n                                        const std::string_view description,\n                                        const std::string_view source_tokens) {\n  for (const std::string_view source_token :\n       utf8::split(source_tokens, \" \", true)) {\n    KeyBinding key_binding;\n    key_binding.output_key = output_key;\n\n    std::string_view token = source_token;\n\n    if (utf8::starts_with(token, \"_\")) {\n      key_binding.lowercase = true;\n      token = token.substr(1);\n    } else if (utf8::starts_with(token, \"^\")) {\n      key_binding.uppercase = true;\n      token = token.substr(1);\n    }\n\n    if (utf8::starts_with(token, \"0x\")) {\n      token = token.substr(2);\n      key_binding.input_key = static_cast<ui::VirtualKey>(\n          string_util::from_string<uint16_t>(token, true));\n    } else if (token.size() == 1 && (token[0] >= 'A' && token[0] <= 'Z') ||\n               (token[0] >= '0' && token[0] <= '9')) {\n      key_binding.input_key = static_cast<ui::VirtualKey>(token[0]);\n    }\n\n    if (key_binding.input_key == ui::VirtualKey::kNone) {\n      XELOGW(\"winkey: failed to parse binding \\\"{}\\\" for controller input {}.\",\n             source_token, description);\n      continue;\n    }\n\n    key_bindings_.push_back(key_binding);\n    XELOGI(\"winkey: \\\"{}\\\" binds key 0x{:X} to controller input {}.\",\n           source_token, key_binding.input_key, description);\n  }\n}\n\nWinKeyInputDriver::WinKeyInputDriver(xe::ui::Window* window,\n                                     size_t window_z_order)\n    : InputDriver(window, window_z_order), window_input_listener_(*this) {\n#define XE_HID_WINKEY_BINDING(button, description, cvar_name,          \\\n                              cvar_default_value)                      \\\n  ParseKeyBinding(xe::ui::VirtualKey::kXInputPad##button, description, \\\n                  cvars::cvar_name);\n#include \"winkey_binding_table.inc\"\n#undef XE_HID_WINKEY_BINDING\n\n  window->AddInputListener(&window_input_listener_, window_z_order);\n}\n\nWinKeyInputDriver::~WinKeyInputDriver() {\n  window()->RemoveInputListener(&window_input_listener_);\n}\n\nX_STATUS WinKeyInputDriver::Setup() { return X_STATUS_SUCCESS; }\n\nX_RESULT WinKeyInputDriver::GetCapabilities(uint32_t user_index, uint32_t flags,\n                                            X_INPUT_CAPABILITIES* out_caps) {\n  if (user_index != 0) {\n    return X_ERROR_DEVICE_NOT_CONNECTED;\n  }\n\n  // TODO(benvanik): confirm with a real XInput controller.\n  out_caps->type = 0x01;      // XINPUT_DEVTYPE_GAMEPAD\n  out_caps->sub_type = 0x01;  // XINPUT_DEVSUBTYPE_GAMEPAD\n  out_caps->flags = 0;\n  out_caps->gamepad.buttons = 0xFFFF;\n  out_caps->gamepad.left_trigger = 0xFF;\n  out_caps->gamepad.right_trigger = 0xFF;\n  out_caps->gamepad.thumb_lx = (int16_t)0xFFFFu;\n  out_caps->gamepad.thumb_ly = (int16_t)0xFFFFu;\n  out_caps->gamepad.thumb_rx = (int16_t)0xFFFFu;\n  out_caps->gamepad.thumb_ry = (int16_t)0xFFFFu;\n  out_caps->vibration.left_motor_speed = 0;\n  out_caps->vibration.right_motor_speed = 0;\n  return X_ERROR_SUCCESS;\n}\n\nX_RESULT WinKeyInputDriver::GetState(uint32_t user_index,\n                                     X_INPUT_STATE* out_state) {\n  if (user_index != 0) {\n    return X_ERROR_DEVICE_NOT_CONNECTED;\n  }\n\n  packet_number_++;\n\n  uint16_t buttons = 0;\n  uint8_t left_trigger = 0;\n  uint8_t right_trigger = 0;\n  int16_t thumb_lx = 0;\n  int16_t thumb_ly = 0;\n  int16_t thumb_rx = 0;\n  int16_t thumb_ry = 0;\n\n  if (window()->HasFocus() && is_active()) {\n    bool capital = IsKeyToggled(VK_CAPITAL) || IsKeyDown(VK_SHIFT);\n    for (const KeyBinding& b : key_bindings_) {\n      if (((b.lowercase == b.uppercase) || (b.lowercase && !capital) ||\n           (b.uppercase && capital)) &&\n          IsKeyDown(b.input_key)) {\n        switch (b.output_key) {\n          case ui::VirtualKey::kXInputPadA:\n            buttons |= 0x1000;  // XINPUT_GAMEPAD_A\n            break;\n          case ui::VirtualKey::kXInputPadY:\n            buttons |= 0x8000;  // XINPUT_GAMEPAD_Y\n            break;\n          case ui::VirtualKey::kXInputPadB:\n            buttons |= 0x2000;  // XINPUT_GAMEPAD_B\n            break;\n          case ui::VirtualKey::kXInputPadX:\n            buttons |= 0x4000;  // XINPUT_GAMEPAD_X\n            break;\n          case ui::VirtualKey::kXInputPadDpadLeft:\n            buttons |= 0x0004;  // XINPUT_GAMEPAD_DPAD_LEFT\n            break;\n          case ui::VirtualKey::kXInputPadDpadRight:\n            buttons |= 0x0008;  // XINPUT_GAMEPAD_DPAD_RIGHT\n            break;\n          case ui::VirtualKey::kXInputPadDpadDown:\n            buttons |= 0x0002;  // XINPUT_GAMEPAD_DPAD_DOWN\n            break;\n          case ui::VirtualKey::kXInputPadDpadUp:\n            buttons |= 0x0001;  // XINPUT_GAMEPAD_DPAD_UP\n            break;\n          case ui::VirtualKey::kXInputPadRThumbPress:\n            buttons |= 0x0080;  // XINPUT_GAMEPAD_RIGHT_THUMB\n            break;\n          case ui::VirtualKey::kXInputPadLThumbPress:\n            buttons |= 0x0040;  // XINPUT_GAMEPAD_LEFT_THUMB\n            break;\n          case ui::VirtualKey::kXInputPadBack:\n            buttons |= 0x0020;  // XINPUT_GAMEPAD_BACK\n            break;\n          case ui::VirtualKey::kXInputPadStart:\n            buttons |= 0x0010;  // XINPUT_GAMEPAD_START\n            break;\n          case ui::VirtualKey::kXInputPadLShoulder:\n            buttons |= 0x0100;  // XINPUT_GAMEPAD_LEFT_SHOULDER\n            break;\n          case ui::VirtualKey::kXInputPadRShoulder:\n            buttons |= 0x0200;  // XINPUT_GAMEPAD_RIGHT_SHOULDER\n            break;\n          case ui::VirtualKey::kXInputPadLTrigger:\n            left_trigger = 0xFF;\n            break;\n          case ui::VirtualKey::kXInputPadRTrigger:\n            right_trigger = 0xFF;\n            break;\n          case ui::VirtualKey::kXInputPadLThumbLeft:\n            thumb_lx += SHRT_MIN;\n            break;\n          case ui::VirtualKey::kXInputPadLThumbRight:\n            thumb_lx += SHRT_MAX;\n            break;\n          case ui::VirtualKey::kXInputPadLThumbDown:\n            thumb_ly += SHRT_MIN;\n            break;\n          case ui::VirtualKey::kXInputPadLThumbUp:\n            thumb_ly += SHRT_MAX;\n            break;\n          case ui::VirtualKey::kXInputPadRThumbUp:\n            thumb_ry += SHRT_MAX;\n            break;\n          case ui::VirtualKey::kXInputPadRThumbDown:\n            thumb_ry += SHRT_MIN;\n            break;\n          case ui::VirtualKey::kXInputPadRThumbRight:\n            thumb_rx += SHRT_MAX;\n            break;\n          case ui::VirtualKey::kXInputPadRThumbLeft:\n            thumb_rx += SHRT_MIN;\n            break;\n        }\n      }\n    }\n  }\n\n  out_state->packet_number = packet_number_;\n  out_state->gamepad.buttons = buttons;\n  out_state->gamepad.left_trigger = left_trigger;\n  out_state->gamepad.right_trigger = right_trigger;\n  out_state->gamepad.thumb_lx = thumb_lx;\n  out_state->gamepad.thumb_ly = thumb_ly;\n  out_state->gamepad.thumb_rx = thumb_rx;\n  out_state->gamepad.thumb_ry = thumb_ry;\n\n  return X_ERROR_SUCCESS;\n}\n\nX_RESULT WinKeyInputDriver::SetState(uint32_t user_index,\n                                     X_INPUT_VIBRATION* vibration) {\n  if (user_index != 0) {\n    return X_ERROR_DEVICE_NOT_CONNECTED;\n  }\n\n  return X_ERROR_SUCCESS;\n}\n\nX_RESULT WinKeyInputDriver::GetKeystroke(uint32_t user_index, uint32_t flags,\n                                         X_INPUT_KEYSTROKE* out_keystroke) {\n  if (user_index != 0) {\n    return X_ERROR_DEVICE_NOT_CONNECTED;\n  }\n\n  if (!is_active()) {\n    return X_ERROR_EMPTY;\n  }\n\n  X_RESULT result = X_ERROR_EMPTY;\n\n  ui::VirtualKey xinput_virtual_key = ui::VirtualKey::kNone;\n  uint16_t unicode = 0;\n  uint16_t keystroke_flags = 0;\n  uint8_t hid_code = 0;\n\n  // Pop from the queue.\n  KeyEvent evt;\n  {\n    auto global_lock = global_critical_region_.Acquire();\n    if (key_events_.empty()) {\n      // No keys!\n      return X_ERROR_EMPTY;\n    }\n    evt = key_events_.front();\n    key_events_.pop();\n  }\n\n  bool capital = IsKeyToggled(VK_CAPITAL) || IsKeyDown(VK_SHIFT);\n  for (const KeyBinding& b : key_bindings_) {\n    if (b.input_key == evt.virtual_key &&\n        ((b.lowercase == b.uppercase) || (b.lowercase && !capital) ||\n         (b.uppercase && capital))) {\n      xinput_virtual_key = b.output_key;\n    }\n  }\n\n  if (xinput_virtual_key != ui::VirtualKey::kNone) {\n    if (evt.transition == true) {\n      keystroke_flags |= 0x0001;  // XINPUT_KEYSTROKE_KEYDOWN\n    } else if (evt.transition == false) {\n      keystroke_flags |= 0x0002;  // XINPUT_KEYSTROKE_KEYUP\n    }\n\n    if (evt.prev_state == evt.transition) {\n      keystroke_flags |= 0x0004;  // XINPUT_KEYSTROKE_REPEAT\n    }\n\n    result = X_ERROR_SUCCESS;\n  }\n\n  out_keystroke->virtual_key = uint16_t(xinput_virtual_key);\n  out_keystroke->unicode = unicode;\n  out_keystroke->flags = keystroke_flags;\n  out_keystroke->user_index = 0;\n  out_keystroke->hid_code = hid_code;\n\n  // X_ERROR_EMPTY if no new keys\n  // X_ERROR_DEVICE_NOT_CONNECTED if no device\n  // X_ERROR_SUCCESS if key\n  return result;\n}\n\nvoid WinKeyInputDriver::WinKeyWindowInputListener::OnKeyDown(ui::KeyEvent& e) {\n  driver_.OnKey(e, true);\n}\n\nvoid WinKeyInputDriver::WinKeyWindowInputListener::OnKeyUp(ui::KeyEvent& e) {\n  driver_.OnKey(e, false);\n}\n\nvoid WinKeyInputDriver::OnKey(ui::KeyEvent& e, bool is_down) {\n  if (!is_active()) {\n    return;\n  }\n\n  KeyEvent key;\n  key.virtual_key = e.virtual_key();\n  key.transition = is_down;\n  key.prev_state = e.prev_state();\n  key.repeat_count = e.repeat_count();\n\n  auto global_lock = global_critical_region_.Acquire();\n  key_events_.push(key);\n}\n\n}  // namespace winkey\n}  // namespace hid\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/hid/winkey/winkey_input_driver.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_HID_WINKEY_WINKEY_INPUT_DRIVER_H_\n#define XENIA_HID_WINKEY_WINKEY_INPUT_DRIVER_H_\n\n#include <queue>\n\n#include \"xenia/base/mutex.h\"\n#include \"xenia/hid/input_driver.h\"\n#include \"xenia/ui/virtual_key.h\"\n\nnamespace xe {\nnamespace hid {\nnamespace winkey {\n\nclass WinKeyInputDriver final : public InputDriver {\n public:\n  explicit WinKeyInputDriver(xe::ui::Window* window, size_t window_z_order);\n  ~WinKeyInputDriver() override;\n\n  X_STATUS Setup() override;\n\n  X_RESULT GetCapabilities(uint32_t user_index, uint32_t flags,\n                           X_INPUT_CAPABILITIES* out_caps) override;\n  X_RESULT GetState(uint32_t user_index, X_INPUT_STATE* out_state) override;\n  X_RESULT SetState(uint32_t user_index, X_INPUT_VIBRATION* vibration) override;\n  X_RESULT GetKeystroke(uint32_t user_index, uint32_t flags,\n                        X_INPUT_KEYSTROKE* out_keystroke) override;\n\n protected:\n  struct KeyEvent {\n    ui::VirtualKey virtual_key = ui::VirtualKey::kNone;\n    int repeat_count = 0;\n    bool transition = false;  // going up(false) or going down(true)\n    bool prev_state = false;  // down(true) or up(false)\n  };\n\n  struct KeyBinding {\n    ui::VirtualKey input_key = ui::VirtualKey::kNone;\n    ui::VirtualKey output_key = ui::VirtualKey::kNone;\n    bool uppercase = false;\n    bool lowercase = false;\n  };\n\n  class WinKeyWindowInputListener final : public ui::WindowInputListener {\n   public:\n    explicit WinKeyWindowInputListener(WinKeyInputDriver& driver)\n        : driver_(driver) {}\n\n    void OnKeyDown(ui::KeyEvent& e) override;\n    void OnKeyUp(ui::KeyEvent& e) override;\n\n   private:\n    WinKeyInputDriver& driver_;\n  };\n\n  void ParseKeyBinding(ui::VirtualKey virtual_key,\n                       const std::string_view description,\n                       const std::string_view binding);\n\n  void OnKey(ui::KeyEvent& e, bool is_down);\n\n  WinKeyWindowInputListener window_input_listener_;\n\n  xe::global_critical_region global_critical_region_;\n  std::queue<KeyEvent> key_events_;\n  std::vector<KeyBinding> key_bindings_;\n\n  uint32_t packet_number_ = 1;\n};\n\n}  // namespace winkey\n}  // namespace hid\n}  // namespace xe\n\n#endif  // XENIA_HID_WINKEY_WINKEY_INPUT_DRIVER_H_\n"
  },
  {
    "path": "src/xenia/hid/xinput/premake5.lua",
    "content": "project_root = \"../../../..\"\ninclude(project_root..\"/tools/build\")\n\ngroup(\"src\")\nproject(\"xenia-hid-xinput\")\n  uuid(\"3d49e251-07a7-40ae-9bc6-aae984c85568\")\n  kind(\"StaticLib\")\n  language(\"C++\")\n  links({\n    \"xenia-base\",\n    \"xenia-hid\",\n  })\n  defines({\n  })\n  local_platform_files()\n"
  },
  {
    "path": "src/xenia/hid/xinput/xinput_hid.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/hid/xinput/xinput_hid.h\"\n\n#include \"xenia/hid/xinput/xinput_input_driver.h\"\n\nnamespace xe {\nnamespace hid {\nnamespace xinput {\n\nstd::unique_ptr<InputDriver> Create(xe::ui::Window* window,\n                                    size_t window_z_order) {\n  return std::make_unique<XInputInputDriver>(window, window_z_order);\n}\n\n}  // namespace xinput\n}  // namespace hid\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/hid/xinput/xinput_hid.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_HID_XINPUT_XINPUT_HID_H_\n#define XENIA_HID_XINPUT_XINPUT_HID_H_\n\n#include <memory>\n\n#include \"xenia/hid/input_system.h\"\n\nnamespace xe {\nnamespace hid {\nnamespace xinput {\n\nstd::unique_ptr<InputDriver> Create(xe::ui::Window* window,\n                                    size_t window_z_order);\n\n}  // namespace xinput\n}  // namespace hid\n}  // namespace xe\n\n#endif  // XENIA_HID_XINPUT_XINPUT_HID_H_\n"
  },
  {
    "path": "src/xenia/hid/xinput/xinput_input_driver.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/hid/xinput/xinput_input_driver.h\"\n\n// Must be included before xinput.h to avoid windows.h conflicts:\n#include \"xenia/base/platform_win.h\"\n\n#include <xinput.h>  // NOLINT(build/include_order)\n\n#include \"xenia/base/logging.h\"\n#include \"xenia/hid/hid_flags.h\"\n\nnamespace xe {\nnamespace hid {\nnamespace xinput {\n\nXInputInputDriver::XInputInputDriver(xe::ui::Window* window,\n                                     size_t window_z_order)\n    : InputDriver(window, window_z_order),\n      module_(nullptr),\n      XInputGetCapabilities_(nullptr),\n      XInputGetState_(nullptr),\n      XInputGetKeystroke_(nullptr),\n      XInputSetState_(nullptr),\n      XInputEnable_(nullptr) {}\n\nXInputInputDriver::~XInputInputDriver() {\n  if (module_) {\n    FreeLibrary((HMODULE)module_);\n    module_ = nullptr;\n    XInputGetCapabilities_ = nullptr;\n    XInputGetState_ = nullptr;\n    XInputGetKeystroke_ = nullptr;\n    XInputSetState_ = nullptr;\n    XInputEnable_ = nullptr;\n  }\n}\n\nX_STATUS XInputInputDriver::Setup() {\n  HMODULE module = LoadLibraryW(L\"xinput1_4.dll\");\n  if (!module) {\n    module = LoadLibraryW(L\"xinput1_3.dll\");\n  }\n  if (!module) {\n    return X_STATUS_DLL_NOT_FOUND;\n  }\n\n  // Required.\n  auto xigc = GetProcAddress(module, \"XInputGetCapabilities\");\n  auto xigs = GetProcAddress(module, \"XInputGetState\");\n  auto xigk = GetProcAddress(module, \"XInputGetKeystroke\");\n  auto xiss = GetProcAddress(module, \"XInputSetState\");\n\n  // Not required.\n  auto xie = GetProcAddress(module, \"XInputEnable\");\n\n  // Only fail when we don't have the bare essentials;\n  if (!xigc || !xigs || !xigk || !xiss) {\n    FreeLibrary(module);\n    return X_STATUS_PROCEDURE_NOT_FOUND;\n  }\n\n  module_ = module;\n  XInputGetCapabilities_ = xigc;\n  XInputGetState_ = xigs;\n  XInputGetKeystroke_ = xigk;\n  XInputSetState_ = xiss;\n  XInputEnable_ = xie;\n\n  if (cvars::guide_button) {\n    // Theoretically there is XInputGetStateEx\n    // but thats undocumented and milage varies.\n    XELOGW(\"XInput: Guide button support is not implemented.\");\n  }\n  return X_STATUS_SUCCESS;\n}\n\nX_RESULT XInputInputDriver::GetCapabilities(uint32_t user_index, uint32_t flags,\n                                            X_INPUT_CAPABILITIES* out_caps) {\n  XINPUT_CAPABILITIES native_caps;\n  auto xigc = (decltype(&XInputGetCapabilities))XInputGetCapabilities_;\n  DWORD result = xigc(user_index, flags, &native_caps);\n  if (result) {\n    return result;\n  }\n\n  out_caps->type = native_caps.Type;\n  out_caps->sub_type = native_caps.SubType;\n  out_caps->flags = native_caps.Flags;\n  out_caps->gamepad.buttons = native_caps.Gamepad.wButtons;\n  out_caps->gamepad.left_trigger = native_caps.Gamepad.bLeftTrigger;\n  out_caps->gamepad.right_trigger = native_caps.Gamepad.bRightTrigger;\n  out_caps->gamepad.thumb_lx = native_caps.Gamepad.sThumbLX;\n  out_caps->gamepad.thumb_ly = native_caps.Gamepad.sThumbLY;\n  out_caps->gamepad.thumb_rx = native_caps.Gamepad.sThumbRX;\n  out_caps->gamepad.thumb_ry = native_caps.Gamepad.sThumbRY;\n  out_caps->vibration.left_motor_speed = native_caps.Vibration.wLeftMotorSpeed;\n  out_caps->vibration.right_motor_speed =\n      native_caps.Vibration.wRightMotorSpeed;\n\n  return result;\n}\n\nX_RESULT XInputInputDriver::GetState(uint32_t user_index,\n                                     X_INPUT_STATE* out_state) {\n  XINPUT_STATE native_state;\n  auto xigs = (decltype(&XInputGetState))XInputGetState_;\n  DWORD result = xigs(user_index, &native_state);\n  if (result) {\n    return result;\n  }\n\n  out_state->packet_number = native_state.dwPacketNumber;\n  out_state->gamepad.buttons = native_state.Gamepad.wButtons;\n  out_state->gamepad.left_trigger = native_state.Gamepad.bLeftTrigger;\n  out_state->gamepad.right_trigger = native_state.Gamepad.bRightTrigger;\n  out_state->gamepad.thumb_lx = native_state.Gamepad.sThumbLX;\n  out_state->gamepad.thumb_ly = native_state.Gamepad.sThumbLY;\n  out_state->gamepad.thumb_rx = native_state.Gamepad.sThumbRX;\n  out_state->gamepad.thumb_ry = native_state.Gamepad.sThumbRY;\n\n  return result;\n}\n\nX_RESULT XInputInputDriver::SetState(uint32_t user_index,\n                                     X_INPUT_VIBRATION* vibration) {\n  XINPUT_VIBRATION native_vibration;\n  native_vibration.wLeftMotorSpeed = vibration->left_motor_speed;\n  native_vibration.wRightMotorSpeed = vibration->right_motor_speed;\n  auto xiss = (decltype(&XInputSetState))XInputSetState_;\n  DWORD result = xiss(user_index, &native_vibration);\n  return result;\n}\n\nX_RESULT XInputInputDriver::GetKeystroke(uint32_t user_index, uint32_t flags,\n                                         X_INPUT_KEYSTROKE* out_keystroke) {\n  // We may want to filter flags/user_index before sending to native.\n  // flags is reserved on desktop.\n  DWORD result;\n\n  // XInputGetKeystroke on Windows has a bug where it will return\n  // ERROR_SUCCESS (0) even if the device is not connected:\n  // https://stackoverflow.com/questions/23669238/xinputgetkeystroke-returning-error-success-while-controller-is-unplugged\n  //\n  // So we first check if the device is connected via XInputGetCapabilities, so\n  // we are not passing back an uninitialized X_INPUT_KEYSTROKE structure.\n  // If any user (0xFF) is polled this bug does not occur but GetCapabilities\n  // would fail so we need to skip it.\n  if (user_index != 0xFF) {\n    XINPUT_CAPABILITIES caps;\n    auto xigc = (decltype(&XInputGetCapabilities))XInputGetCapabilities_;\n    result = xigc(user_index, 0, &caps);\n    if (result) {\n      return result;\n    }\n  }\n\n  XINPUT_KEYSTROKE native_keystroke;\n  auto xigk = (decltype(&XInputGetKeystroke))XInputGetKeystroke_;\n  result = xigk(user_index, 0, &native_keystroke);\n  if (result) {\n    return result;\n  }\n\n  out_keystroke->virtual_key = native_keystroke.VirtualKey;\n  out_keystroke->unicode = native_keystroke.Unicode;\n  out_keystroke->flags = native_keystroke.Flags;\n  out_keystroke->user_index = native_keystroke.UserIndex;\n  out_keystroke->hid_code = native_keystroke.HidCode;\n  // X_ERROR_EMPTY if no new keys\n  // X_ERROR_DEVICE_NOT_CONNECTED if no device\n  // X_ERROR_SUCCESS if key\n  return result;\n}\n\n}  // namespace xinput\n}  // namespace hid\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/hid/xinput/xinput_input_driver.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_HID_XINPUT_XINPUT_INPUT_DRIVER_H_\n#define XENIA_HID_XINPUT_XINPUT_INPUT_DRIVER_H_\n\n#include \"xenia/hid/input_driver.h\"\n\nnamespace xe {\nnamespace hid {\nnamespace xinput {\n\nclass XInputInputDriver final : public InputDriver {\n public:\n  explicit XInputInputDriver(xe::ui::Window* window, size_t window_z_order);\n  ~XInputInputDriver() override;\n\n  X_STATUS Setup() override;\n\n  X_RESULT GetCapabilities(uint32_t user_index, uint32_t flags,\n                           X_INPUT_CAPABILITIES* out_caps) override;\n  X_RESULT GetState(uint32_t user_index, X_INPUT_STATE* out_state) override;\n  X_RESULT SetState(uint32_t user_index, X_INPUT_VIBRATION* vibration) override;\n  X_RESULT GetKeystroke(uint32_t user_index, uint32_t flags,\n                        X_INPUT_KEYSTROKE* out_keystroke) override;\n\n private:\n  void* module_;\n  void* XInputGetCapabilities_;\n  void* XInputGetState_;\n  void* XInputGetKeystroke_;\n  void* XInputSetState_;\n  void* XInputEnable_;\n};\n\n}  // namespace xinput\n}  // namespace hid\n}  // namespace xe\n\n#endif  // XENIA_HID_XINPUT_XINPUT_INPUT_DRIVER_H_\n"
  },
  {
    "path": "src/xenia/kernel/debug_visualizers.natvis",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<AutoVisualizer xmlns=\"http://schemas.microsoft.com/vstudio/debugger/natvis/2010\">\n\n  <!-- Shims -->\n  <Type Name=\"xe::kernel::shim::TypedPointerParam&lt;*&gt;\">\n    <DisplayString>{host_ptr_}</DisplayString>\n    <Expand>\n      <ExpandedItem>host_ptr_</ExpandedItem>\n    </Expand>\n  </Type>\n\n</AutoVisualizer>\n"
  },
  {
    "path": "src/xenia/kernel/info/file.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_KERNEL_INFO_FILE_H_\n#define XENIA_KERNEL_INFO_FILE_H_\n\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace kernel {\n\n// https://github.com/oukiar/vdash/blob/master/vdash/include/kernel.h\nenum X_FILE_INFORMATION_CLASS {\n  XFileDirectoryInformation = 1,\n  XFileFullDirectoryInformation,\n  XFileBothDirectoryInformation,\n  XFileBasicInformation,\n  XFileStandardInformation,\n  XFileInternalInformation,\n  XFileEaInformation,\n  XFileAccessInformation,\n  XFileNameInformation,\n  XFileRenameInformation,\n  XFileLinkInformation,\n  XFileNamesInformation,\n  XFileDispositionInformation,\n  XFilePositionInformation,\n  XFileFullEaInformation,\n  XFileModeInformation,\n  XFileAlignmentInformation,\n  XFileAllInformation,\n  XFileAllocationInformation,\n  XFileEndOfFileInformation,\n  XFileAlternateNameInformation,\n  XFileStreamInformation,\n  XFileMountPartitionInformation,\n  XFileMountPartitionsInformation,\n  XFilePipeRemoteInformation,\n  XFileSectorInformation,\n  XFileXctdCompressionInformation,\n  XFileCompressionInformation,\n  XFileObjectIdInformation,\n  XFileCompletionInformation,\n  XFileMoveClusterInformation,\n  XFileIoPriorityInformation,\n  XFileReparsePointInformation,\n  XFileNetworkOpenInformation,\n  XFileAttributeTagInformation,\n  XFileTrackingInformation,\n  XFileMaximumInformation\n};\n\n#pragma pack(push, 1)\n\n// https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/ns-ntifs-_file_internal_information\nstruct X_FILE_INTERNAL_INFORMATION {\n  be<uint64_t> index_number;\n};\nstatic_assert_size(X_FILE_INTERNAL_INFORMATION, 8);\n\n// https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/ntddk/ns-ntddk-_file_disposition_information\nstruct X_FILE_DISPOSITION_INFORMATION {\n  uint8_t delete_file;\n};\nstatic_assert_size(X_FILE_DISPOSITION_INFORMATION, 1);\n\n// https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/ns-wdm-_file_position_information\nstruct X_FILE_POSITION_INFORMATION {\n  be<uint64_t> current_byte_offset;\n};\nstatic_assert_size(X_FILE_POSITION_INFORMATION, 8);\n\n// https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/ntddk/ns-ntddk-_file_end_of_file_information\nstruct X_FILE_END_OF_FILE_INFORMATION {\n  be<uint64_t> end_of_file;\n};\nstatic_assert_size(X_FILE_END_OF_FILE_INFORMATION, 8);\n\nstruct X_FILE_XCTD_COMPRESSION_INFORMATION {\n  be<uint32_t> unknown;\n};\nstatic_assert_size(X_FILE_XCTD_COMPRESSION_INFORMATION, 4);\n\n// https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/ns-ntifs-_file_completion_information\nstruct X_FILE_COMPLETION_INFORMATION {\n  be<uint32_t> handle;\n  be<uint32_t> key;\n};\nstatic_assert_size(X_FILE_COMPLETION_INFORMATION, 8);\n\n// https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/ns-wdm-_file_network_open_information\nstruct X_FILE_NETWORK_OPEN_INFORMATION {\n  be<uint64_t> creation_time;\n  be<uint64_t> last_access_time;\n  be<uint64_t> last_write_time;\n  be<uint64_t> change_time;\n  be<uint64_t> allocation_size;\n  be<uint64_t> end_of_file;  // size in bytes\n  be<uint32_t> attributes;\n  be<uint32_t> pad;\n};\nstatic_assert_size(X_FILE_NETWORK_OPEN_INFORMATION, 56);\n\n#pragma pack(pop)\n\n}  // namespace kernel\n}  // namespace xe\n\n#endif  // XENIA_KERNEL_INFO_FILE_H_\n"
  },
  {
    "path": "src/xenia/kernel/info/volume.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_KERNEL_INFO_VOLUME_H_\n#define XENIA_KERNEL_INFO_VOLUME_H_\n\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace kernel {\n\nenum X_FILE_FS_INFORMATION_CLASS {\n  XFileFsVolumeInformation = 1,\n  XFileFsSizeInformation = 3,\n  XFileFsDeviceInformation,\n  XFileFsAttributeInformation = 5,\n};\n\n#pragma pack(push, 1)\n\n// https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/ntddk/ns-ntddk-_file_fs_volume_information\nstruct X_FILE_FS_VOLUME_INFORMATION {\n  be<uint64_t> creation_time;\n  be<uint32_t> serial_number;\n  be<uint32_t> label_length;\n  uint8_t supports_objects;\n  char label[1];\n  uint8_t pad[6];\n};\nstatic_assert_size(X_FILE_FS_VOLUME_INFORMATION, 24);\n\n// https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/ntddk/ns-ntddk-_file_fs_size_information\nstruct X_FILE_FS_SIZE_INFORMATION {\n  be<uint64_t> total_allocation_units;\n  be<uint64_t> available_allocation_units;\n  be<uint32_t> sectors_per_allocation_unit;\n  be<uint32_t> bytes_per_sector;\n};\nstatic_assert_size(X_FILE_FS_SIZE_INFORMATION, 24);\n\n// https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/ns-ntifs-_file_fs_attribute_information\nstruct X_FILE_FS_ATTRIBUTE_INFORMATION {\n  be<uint32_t> attributes;\n  be<int32_t> component_name_max_length;\n  be<uint32_t> name_length;\n  char name[1];\n  uint8_t pad[3];\n};\nstatic_assert_size(X_FILE_FS_ATTRIBUTE_INFORMATION, 16);\n\n#pragma pack(pop)\n\n}  // namespace kernel\n}  // namespace xe\n\n#endif  // XENIA_KERNEL_INFO_VOLUME_H_\n"
  },
  {
    "path": "src/xenia/kernel/kernel_flags.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/kernel/kernel_flags.h\"\n\nDEFINE_bool(headless, false,\n            \"Don't display any UI, using defaults for prompts as needed.\",\n            \"UI\");\nDEFINE_bool(log_high_frequency_kernel_calls, false,\n            \"Log kernel calls with the kHighFrequency tag.\", \"Kernel\");\n"
  },
  {
    "path": "src/xenia/kernel/kernel_flags.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_KERNEL_KERNEL_FLAGS_H_\n#define XENIA_KERNEL_KERNEL_FLAGS_H_\n#include \"xenia/base/cvar.h\"\n\nDECLARE_bool(headless);\nDECLARE_bool(log_high_frequency_kernel_calls);\n\n#endif  // XENIA_KERNEL_KERNEL_FLAGS_H_\n"
  },
  {
    "path": "src/xenia/kernel/kernel_module.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/kernel/kernel_module.h\"\n\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/mutex.h\"\n#include \"xenia/cpu/processor.h\"\n#include \"xenia/cpu/raw_module.h\"\n#include \"xenia/emulator.h\"\n#include \"xenia/kernel/xthread.h\"\n\nnamespace xe {\nnamespace kernel {\n\nKernelModule::KernelModule(KernelState* kernel_state,\n                           const std::string_view path)\n    : XModule(kernel_state, ModuleType::kKernelModule) {\n  emulator_ = kernel_state->emulator();\n  memory_ = emulator_->memory();\n  export_resolver_ = kernel_state->emulator()->export_resolver();\n\n  path_ = path;\n  name_ = utf8::find_base_name_from_guest_path(path);\n\n  // Persist this object through reloads.\n  host_object_ = true;\n\n  // HACK: Allocates memory where xboxkrnl.exe would be!\n  // TODO: Need to free this memory when necessary.\n  auto heap = memory()->LookupHeap(0x80040000);\n  if (heap->AllocRange(0x80040000, 0x801C0000, kTrampolineSize, 16,\n                       kMemoryAllocationCommit,\n                       kMemoryProtectRead | kMemoryProtectWrite, false,\n                       &guest_trampoline_)) {\n    guest_trampoline_size_ = kTrampolineSize;\n\n    auto module = std::make_unique<cpu::RawModule>(emulator_->processor());\n    guest_trampoline_module_ = module.get();\n\n    module->set_name(name_ + \"_trampoline\");\n    module->SetAddressRange(guest_trampoline_, guest_trampoline_size_);\n    emulator_->processor()->AddModule(std::move(module));\n  } else {\n    XELOGW(\"KernelModule {} could not allocate trampoline for GetProcAddress!\",\n           path);\n  }\n\n  OnLoad();\n}\n\nKernelModule::~KernelModule() {}\n\nuint32_t KernelModule::GenerateTrampoline(\n    std::string name, cpu::GuestFunction::ExternHandler handler,\n    cpu::Export* export_data) {\n  // Generate the function.\n  assert_true(guest_trampoline_next_ * 8 < guest_trampoline_size_);\n  if (guest_trampoline_next_ * 8 >= guest_trampoline_size_) {\n    assert_always();  // If you hit this, increase kTrampolineSize\n    XELOGE(\"KernelModule::GenerateTrampoline trampoline exhausted\");\n    return 0;\n  }\n\n  uint32_t guest_addr = guest_trampoline_ + (guest_trampoline_next_++ * 8);\n\n  auto mem = memory()->TranslateVirtual(guest_addr);\n  xe::store_and_swap<uint32_t>(mem + 0x0, 0x44000042);  // sc\n  xe::store_and_swap<uint32_t>(mem + 0x4, 0x4E800020);  // blr\n\n  // Declare/define the extern function.\n  cpu::Function* function;\n  guest_trampoline_module_->DeclareFunction(guest_addr, &function);\n  function->set_end_address(guest_addr + 8);\n  function->set_name(std::string(\"__T_\") + name);\n\n  static_cast<cpu::GuestFunction*>(function)->SetupExtern(handler, export_data);\n\n  function->set_status(cpu::Symbol::Status::kDeclared);\n\n  return guest_addr;\n}\n\nuint32_t KernelModule::GetProcAddressByOrdinal(uint16_t ordinal) {\n  auto export_entry =\n      export_resolver_->GetExportByOrdinal(name().c_str(), ordinal);\n  if (!export_entry) {\n    // Export (or its parent library) not found.\n    return 0;\n  }\n  if (export_entry->type == cpu::Export::Type::kVariable) {\n    if (export_entry->variable_ptr) {\n      return export_entry->variable_ptr;\n    } else {\n      XELOGW(\n          \"ERROR: var export referenced GetProcAddressByOrdinal({:04X}({})) is \"\n          \"not implemented\",\n          ordinal, export_entry->name);\n      return 0;\n    }\n  } else {\n    if (export_entry->function_data.trampoline ||\n        export_entry->function_data.shim) {\n      auto global_lock = global_critical_region_.Acquire();\n\n      // See if the function has been generated already.\n      auto item = guest_trampoline_map_.find(ordinal);\n      if (item != guest_trampoline_map_.end()) {\n        return item->second;\n      }\n\n      cpu::GuestFunction::ExternHandler handler = nullptr;\n      if (export_entry->function_data.trampoline) {\n        handler = (cpu::GuestFunction::ExternHandler)\n                      export_entry->function_data.trampoline;\n      } else {\n        handler =\n            (cpu::GuestFunction::ExternHandler)export_entry->function_data.shim;\n      }\n\n      uint32_t guest_addr =\n          GenerateTrampoline(export_entry->name, handler, export_entry);\n\n      XELOGD(\"GetProcAddressByOrdinal(\\\"{}\\\", \\\"{}\\\") = {:08X}\", name(),\n             export_entry->name, guest_addr);\n\n      // Register the function in our map.\n      guest_trampoline_map_.emplace(ordinal, guest_addr);\n      return guest_addr;\n    } else {\n      // Not implemented.\n      XELOGW(\n          \"ERROR: fn export referenced GetProcAddressByOrdinal({:04X}({})) is \"\n          \"not implemented\",\n          ordinal, export_entry->name);\n      return 0;\n    }\n  }\n}\n\nuint32_t KernelModule::GetProcAddressByName(const std::string_view name) {\n  // TODO: Does this even work for kernel modules?\n  XELOGE(\"KernelModule::GetProcAddressByName not implemented\");\n  return 0;\n}\n\n}  // namespace kernel\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/kernel/kernel_module.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_KERNEL_KERNEL_MODULE_H_\n#define XENIA_KERNEL_KERNEL_MODULE_H_\n\n#include <map>\n\n#include \"xenia/emulator.h\"\n#include \"xenia/kernel/xmodule.h\"\n\nnamespace xe {\nnamespace cpu {\nclass RawModule;\n}  // namespace cpu\n\nnamespace kernel {\n\nclass KernelState;\n\nclass KernelModule : public XModule {\n public:\n  KernelModule(KernelState* kernel_state, const std::string_view path);\n  ~KernelModule() override;\n\n  const std::string& path() const override { return path_; }\n  const std::string& name() const override { return name_; }\n\n  uint32_t GetProcAddressByOrdinal(uint16_t ordinal) override;\n  uint32_t GetProcAddressByName(const std::string_view name) override;\n\n protected:\n  Emulator* emulator_;\n  Memory* memory_;\n  xe::cpu::ExportResolver* export_resolver_;\n\n  std::string name_;\n  std::string path_;\n\n  // Guest trampoline for GetProcAddress\n  static const uint32_t kTrampolineSize = 400 * 8;\n  uint32_t guest_trampoline_ = 0;\n  uint32_t guest_trampoline_next_ = 0;  // Next free entry to be generated.\n  uint32_t guest_trampoline_size_ = 0;\n  cpu::RawModule* guest_trampoline_module_ = nullptr;\n  std::map<uint16_t, uint32_t> guest_trampoline_map_;\n\n  xe::global_critical_region global_critical_region_;\n\n  uint32_t GenerateTrampoline(std::string name,\n                              cpu::GuestFunction::ExternHandler handler,\n                              cpu::Export* export_data = nullptr);\n};\n\n}  // namespace kernel\n}  // namespace xe\n\n#endif  // XENIA_KERNEL_KERNEL_MODULE_H_\n"
  },
  {
    "path": "src/xenia/kernel/kernel_state.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/kernel/kernel_state.h\"\n\n#include <string>\n\n#include \"third_party/fmt/include/fmt/format.h\"\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/byte_stream.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/string.h\"\n#include \"xenia/cpu/processor.h\"\n#include \"xenia/emulator.h\"\n#include \"xenia/kernel/user_module.h\"\n#include \"xenia/kernel/util/shim_utils.h\"\n#include \"xenia/kernel/xam/xam_module.h\"\n#include \"xenia/kernel/xboxkrnl/xboxkrnl_module.h\"\n#include \"xenia/kernel/xevent.h\"\n#include \"xenia/kernel/xmodule.h\"\n#include \"xenia/kernel/xnotifylistener.h\"\n#include \"xenia/kernel/xobject.h\"\n#include \"xenia/kernel/xthread.h\"\n\nnamespace xe {\nnamespace kernel {\n\nconstexpr uint32_t kDeferredOverlappedDelayMillis = 100;\n\n// This is a global object initialized with the XboxkrnlModule.\n// It references the current kernel state object that all kernel methods should\n// be using to stash their variables.\nKernelState* shared_kernel_state_ = nullptr;\n\nKernelState* kernel_state() { return shared_kernel_state_; }\n\nKernelState::KernelState(Emulator* emulator)\n    : emulator_(emulator),\n      memory_(emulator->memory()),\n      dispatch_thread_running_(false),\n      dpc_list_(emulator->memory()) {\n  processor_ = emulator->processor();\n  file_system_ = emulator->file_system();\n\n  app_manager_ = std::make_unique<xam::AppManager>();\n  user_profile_ = std::make_unique<xam::UserProfile>();\n\n  auto content_root = emulator_->content_root();\n  if (!content_root.empty()) {\n    content_root = std::filesystem::absolute(content_root);\n  }\n  content_manager_ = std::make_unique<xam::ContentManager>(this, content_root);\n\n  assert_null(shared_kernel_state_);\n  shared_kernel_state_ = this;\n\n  // Hardcoded maximum of 2048 TLS slots.\n  tls_bitmap_.Resize(2048);\n\n  xam::AppManager::RegisterApps(this, app_manager_.get());\n}\n\nKernelState::~KernelState() {\n  SetExecutableModule(nullptr);\n\n  if (dispatch_thread_running_) {\n    dispatch_thread_running_ = false;\n    dispatch_cond_.notify_all();\n    dispatch_thread_->Wait(0, 0, 0, nullptr);\n  }\n\n  executable_module_.reset();\n  user_modules_.clear();\n  kernel_modules_.clear();\n\n  // Delete all objects.\n  object_table_.Reset();\n\n  // Shutdown apps.\n  app_manager_.reset();\n\n  assert_true(shared_kernel_state_ == this);\n  shared_kernel_state_ = nullptr;\n}\n\nKernelState* KernelState::shared() { return shared_kernel_state_; }\n\nuint32_t KernelState::title_id() const {\n  assert_not_null(executable_module_);\n\n  xex2_opt_execution_info* exec_info = 0;\n  executable_module_->GetOptHeader(XEX_HEADER_EXECUTION_INFO, &exec_info);\n\n  if (exec_info) {\n    return exec_info->title_id;\n  }\n\n  return 0;\n}\n\nutil::XdbfGameData KernelState::title_xdbf() const {\n  return module_xdbf(executable_module_);\n}\n\nutil::XdbfGameData KernelState::module_xdbf(\n    object_ref<UserModule> exec_module) const {\n  assert_not_null(exec_module);\n\n  uint32_t resource_data = 0;\n  uint32_t resource_size = 0;\n  if (XSUCCEEDED(exec_module->GetSection(\n          fmt::format(\"{:08X}\", exec_module->title_id()).c_str(),\n          &resource_data, &resource_size))) {\n    util::XdbfGameData db(memory()->TranslateVirtual(resource_data),\n                          resource_size);\n    return db;\n  }\n  return util::XdbfGameData(nullptr, resource_size);\n}\n\nuint32_t KernelState::process_type() const {\n  auto pib =\n      memory_->TranslateVirtual<ProcessInfoBlock*>(process_info_block_address_);\n  return pib->process_type;\n}\n\nvoid KernelState::set_process_type(uint32_t value) {\n  auto pib =\n      memory_->TranslateVirtual<ProcessInfoBlock*>(process_info_block_address_);\n  pib->process_type = uint8_t(value);\n}\n\nuint32_t KernelState::AllocateTLS() { return uint32_t(tls_bitmap_.Acquire()); }\n\nvoid KernelState::FreeTLS(uint32_t slot) {\n  const std::vector<object_ref<XThread>> threads =\n      object_table()->GetObjectsByType<XThread>();\n\n  for (const object_ref<XThread>& thread : threads) {\n    if (thread->is_guest_thread()) {\n      thread->SetTLSValue(slot, 0);\n    }\n  }\n  tls_bitmap_.Release(slot);\n}\n\nvoid KernelState::RegisterTitleTerminateNotification(uint32_t routine,\n                                                     uint32_t priority) {\n  TerminateNotification notify;\n  notify.guest_routine = routine;\n  notify.priority = priority;\n\n  terminate_notifications_.push_back(notify);\n}\n\nvoid KernelState::RemoveTitleTerminateNotification(uint32_t routine) {\n  for (auto it = terminate_notifications_.begin();\n       it != terminate_notifications_.end(); it++) {\n    if (it->guest_routine == routine) {\n      terminate_notifications_.erase(it);\n      break;\n    }\n  }\n}\n\nvoid KernelState::RegisterModule(XModule* module) {}\n\nvoid KernelState::UnregisterModule(XModule* module) {}\n\nbool KernelState::RegisterUserModule(object_ref<UserModule> module) {\n  auto lock = global_critical_region_.Acquire();\n\n  for (auto user_module : user_modules_) {\n    if (user_module->path() == module->path()) {\n      // Already loaded.\n      return false;\n    }\n  }\n\n  user_modules_.push_back(module);\n  return true;\n}\n\nvoid KernelState::UnregisterUserModule(UserModule* module) {\n  auto lock = global_critical_region_.Acquire();\n\n  for (auto it = user_modules_.begin(); it != user_modules_.end(); it++) {\n    if ((*it)->path() == module->path()) {\n      user_modules_.erase(it);\n      return;\n    }\n  }\n}\n\nbool KernelState::IsKernelModule(const std::string_view name) {\n  if (name.empty()) {\n    // Executing module isn't a kernel module.\n    return false;\n  }\n  // NOTE: no global lock required as the kernel module list is static.\n  for (auto kernel_module : kernel_modules_) {\n    if (kernel_module->Matches(name)) {\n      return true;\n    }\n  }\n  return false;\n}\n\nobject_ref<KernelModule> KernelState::GetKernelModule(\n    const std::string_view name) {\n  assert_true(IsKernelModule(name));\n\n  for (auto kernel_module : kernel_modules_) {\n    if (kernel_module->Matches(name)) {\n      return retain_object(kernel_module.get());\n    }\n  }\n\n  return nullptr;\n}\n\nobject_ref<XModule> KernelState::GetModule(const std::string_view name,\n                                           bool user_only) {\n  if (name.empty()) {\n    // NULL name = self.\n    // TODO(benvanik): lookup module from caller address.\n    return GetExecutableModule();\n  } else if (xe::utf8::equal_case(name, \"kernel32.dll\")) {\n    // Some games request this, for some reason. wtf.\n    return nullptr;\n  }\n\n  auto global_lock = global_critical_region_.Acquire();\n\n  if (!user_only) {\n    for (auto kernel_module : kernel_modules_) {\n      if (kernel_module->Matches(name)) {\n        return retain_object(kernel_module.get());\n      }\n    }\n  }\n\n  auto path(name);\n\n  // Resolve the path to an absolute path.\n  auto entry = file_system_->ResolvePath(name);\n  if (entry) {\n    path = entry->absolute_path();\n  }\n\n  for (auto user_module : user_modules_) {\n    if (user_module->Matches(path)) {\n      return retain_object(user_module.get());\n    }\n  }\n  return nullptr;\n}\n\nobject_ref<XThread> KernelState::LaunchModule(object_ref<UserModule> module) {\n  if (!module->is_executable()) {\n    return nullptr;\n  }\n\n  SetExecutableModule(module);\n  XELOGI(\"KernelState: Launching module...\");\n\n  // Create a thread to run in.\n  // We start suspended so we can run the debugger prep.\n  auto thread = object_ref<XThread>(\n      new XThread(kernel_state(), module->stack_size(), 0,\n                  module->entry_point(), 0, X_CREATE_SUSPENDED, true, true));\n\n  // We know this is the 'main thread'.\n  thread->set_name(\"Main XThread\");\n\n  X_STATUS result = thread->Create();\n  if (XFAILED(result)) {\n    XELOGE(\"Could not create launch thread: {:08X}\", result);\n    return nullptr;\n  }\n\n  // Waits for a debugger client, if desired.\n  emulator()->processor()->PreLaunch();\n\n  // Resume the thread now.\n  // If the debugger has requested a suspend this will just decrement the\n  // suspend count without resuming it until the debugger wants.\n  thread->Resume();\n\n  return thread;\n}\n\nobject_ref<UserModule> KernelState::GetExecutableModule() {\n  if (!executable_module_) {\n    return nullptr;\n  }\n  return executable_module_;\n}\n\nvoid KernelState::SetExecutableModule(object_ref<UserModule> module) {\n  if (module.get() == executable_module_.get()) {\n    return;\n  }\n  executable_module_ = std::move(module);\n  if (!executable_module_) {\n    return;\n  }\n\n  assert_zero(process_info_block_address_);\n  process_info_block_address_ = memory_->SystemHeapAlloc(0x60);\n\n  auto pib =\n      memory_->TranslateVirtual<ProcessInfoBlock*>(process_info_block_address_);\n  // TODO(benvanik): figure out what this list is.\n  pib->unk_04 = pib->unk_08 = 0;\n  pib->unk_0C = 0x0000007F;\n  pib->unk_10 = 0x001F0000;\n  pib->thread_count = 0;\n  pib->unk_1B = 0x06;\n  pib->kernel_stack_size = 16 * 1024;\n  pib->process_type = process_type_;\n  // TODO(benvanik): figure out what this list is.\n  pib->unk_54 = pib->unk_58 = 0;\n\n  xex2_opt_tls_info* tls_header = nullptr;\n  executable_module_->GetOptHeader(XEX_HEADER_TLS_INFO, &tls_header);\n  if (tls_header) {\n    auto pib = memory_->TranslateVirtual<ProcessInfoBlock*>(\n        process_info_block_address_);\n    pib->tls_data_size = tls_header->data_size;\n    pib->tls_raw_data_size = tls_header->raw_data_size;\n    pib->tls_slot_size = tls_header->slot_count * 4;\n  }\n\n  // Setup the kernel's XexExecutableModuleHandle field.\n  auto export_entry = processor()->export_resolver()->GetExportByOrdinal(\n      \"xboxkrnl.exe\", ordinals::XexExecutableModuleHandle);\n  if (export_entry) {\n    assert_not_zero(export_entry->variable_ptr);\n    auto variable_ptr = memory()->TranslateVirtual<xe::be<uint32_t>*>(\n        export_entry->variable_ptr);\n    *variable_ptr = executable_module_->hmodule_ptr();\n  }\n\n  // Setup the kernel's ExLoadedImageName field\n  export_entry = processor()->export_resolver()->GetExportByOrdinal(\n      \"xboxkrnl.exe\", ordinals::ExLoadedImageName);\n\n  if (export_entry) {\n    char* variable_ptr =\n        memory()->TranslateVirtual<char*>(export_entry->variable_ptr);\n    xe::string_util::copy_truncating(\n        variable_ptr, executable_module_->path(),\n        xboxkrnl::XboxkrnlModule::kExLoadedImageNameSize);\n  }\n  // Spin up deferred dispatch worker.\n  // TODO(benvanik): move someplace more appropriate (out of ctor, but around\n  // here).\n  if (!dispatch_thread_running_) {\n    dispatch_thread_running_ = true;\n    dispatch_thread_ =\n        object_ref<XHostThread>(new XHostThread(this, 128 * 1024, 0, [this]() {\n          // As we run guest callbacks the debugger must be able to suspend us.\n          dispatch_thread_->set_can_debugger_suspend(true);\n\n          auto global_lock = global_critical_region_.AcquireDeferred();\n          while (dispatch_thread_running_) {\n            global_lock.lock();\n            if (dispatch_queue_.empty()) {\n              dispatch_cond_.wait(global_lock);\n              if (!dispatch_thread_running_) {\n                global_lock.unlock();\n                break;\n              }\n            }\n            auto fn = std::move(dispatch_queue_.front());\n            dispatch_queue_.pop_front();\n            global_lock.unlock();\n\n            fn();\n          }\n          return 0;\n        }));\n    dispatch_thread_->set_name(\"Kernel Dispatch\");\n    dispatch_thread_->Create();\n  }\n}\n\nvoid KernelState::LoadKernelModule(object_ref<KernelModule> kernel_module) {\n  auto global_lock = global_critical_region_.Acquire();\n  kernel_modules_.push_back(std::move(kernel_module));\n}\n\nobject_ref<UserModule> KernelState::LoadUserModule(\n    const std::string_view raw_name, bool call_entry) {\n  // Some games try to load relative to launch module, others specify full path.\n  auto name = xe::utf8::find_name_from_guest_path(raw_name);\n  std::string path(raw_name);\n  if (name == raw_name) {\n    assert_not_null(executable_module_);\n    path = xe::utf8::join_guest_paths(\n        xe::utf8::find_base_guest_path(executable_module_->path()), name);\n  }\n\n  object_ref<UserModule> module;\n  {\n    auto global_lock = global_critical_region_.Acquire();\n\n    // See if we've already loaded it\n    for (auto& existing_module : user_modules_) {\n      if (existing_module->path() == path) {\n        return existing_module;\n      }\n    }\n\n    global_lock.unlock();\n\n    // Module wasn't loaded, so load it.\n    module = object_ref<UserModule>(new UserModule(this));\n    X_STATUS status = module->LoadFromFile(path);\n    if (XFAILED(status)) {\n      object_table()->ReleaseHandle(module->handle());\n      return nullptr;\n    }\n\n    global_lock.lock();\n\n    // Putting into the listing automatically retains.\n    user_modules_.push_back(module);\n  }\n\n  module->Dump();\n\n  if (module->is_dll_module() && module->entry_point() && call_entry) {\n    // Call DllMain(DLL_PROCESS_ATTACH):\n    // https://msdn.microsoft.com/en-us/library/windows/desktop/ms682583%28v=vs.85%29.aspx\n    uint64_t args[] = {\n        module->handle(),\n        1,  // DLL_PROCESS_ATTACH\n        0,  // 0 because always dynamic\n    };\n    auto thread_state = XThread::GetCurrentThread()->thread_state();\n    processor()->Execute(thread_state, module->entry_point(), args,\n                         xe::countof(args));\n  }\n\n  return module;\n}\n\nvoid KernelState::UnloadUserModule(const object_ref<UserModule>& module,\n                                   bool call_entry) {\n  auto global_lock = global_critical_region_.Acquire();\n\n  if (module->is_dll_module() && module->entry_point() && call_entry) {\n    // Call DllMain(DLL_PROCESS_DETACH):\n    // https://msdn.microsoft.com/en-us/library/windows/desktop/ms682583%28v=vs.85%29.aspx\n    uint64_t args[] = {\n        module->handle(),\n        0,  // DLL_PROCESS_DETACH\n        0,  // 0 for now, assume XexUnloadImage is like FreeLibrary\n    };\n    auto thread_state = XThread::GetCurrentThread()->thread_state();\n    processor()->Execute(thread_state, module->entry_point(), args,\n                         xe::countof(args));\n  }\n\n  auto iter = std::find_if(\n      user_modules_.begin(), user_modules_.end(),\n      [&module](const auto& e) { return e->path() == module->path(); });\n  assert_true(iter != user_modules_.end());  // Unloading an unregistered module\n                                             // is probably really bad\n  user_modules_.erase(iter);\n\n  // Ensure this module was not somehow registered twice\n  assert_true(std::find_if(user_modules_.begin(), user_modules_.end(),\n                           [&module](const auto& e) {\n                             return e->path() == module->path();\n                           }) == user_modules_.end());\n\n  object_table()->ReleaseHandle(module->handle());\n}\n\nvoid KernelState::TerminateTitle() {\n  XELOGD(\"KernelState::TerminateTitle\");\n  auto global_lock = global_critical_region_.Acquire();\n\n  // Call terminate routines.\n  // TODO(benvanik): these might take arguments.\n  // FIXME: Calling these will send some threads into kernel code and they'll\n  // hold the lock when terminated! Do we need to wait for all threads to exit?\n  /*\n  if (from_guest_thread) {\n    for (auto routine : terminate_notifications_) {\n      auto thread_state = XThread::GetCurrentThread()->thread_state();\n      processor()->Execute(thread_state, routine.guest_routine);\n    }\n  }\n  terminate_notifications_.clear();\n  */\n\n  // Kill all guest threads.\n  for (auto it = threads_by_id_.begin(); it != threads_by_id_.end();) {\n    if (!XThread::IsInThread(it->second) && it->second->is_guest_thread()) {\n      auto thread = it->second;\n\n      if (thread->is_running()) {\n        // Need to step the thread to a safe point (returns it to guest code\n        // so it's guaranteed to not be holding any locks / in host kernel\n        // code / etc). Can't do that properly if we have the lock.\n        if (!emulator_->is_paused()) {\n          thread->thread()->Suspend();\n        }\n\n        global_lock.unlock();\n        processor_->StepToGuestSafePoint(thread->thread_id());\n        thread->Terminate(0);\n        global_lock.lock();\n      }\n\n      // Erase it from the thread list.\n      it = threads_by_id_.erase(it);\n    } else {\n      ++it;\n    }\n  }\n\n  // Third: Unload all user modules (including the executable).\n  for (size_t i = 0; i < user_modules_.size(); i++) {\n    X_STATUS status = user_modules_[i]->Unload();\n    assert_true(XSUCCEEDED(status));\n\n    object_table_.RemoveHandle(user_modules_[i]->handle());\n  }\n  user_modules_.clear();\n\n  // Release all objects in the object table.\n  object_table_.PurgeAllObjects();\n\n  // Unregister all notify listeners.\n  notify_listeners_.clear();\n\n  // Clear the TLS map.\n  tls_bitmap_.Reset();\n\n  // Unset the executable module.\n  executable_module_ = nullptr;\n\n  if (process_info_block_address_) {\n    memory_->SystemHeapFree(process_info_block_address_);\n    process_info_block_address_ = 0;\n  }\n\n  if (XThread::IsInThread()) {\n    threads_by_id_.erase(XThread::GetCurrentThread()->thread_id());\n\n    // Now commit suicide (using Terminate, because we can't call into guest\n    // code anymore).\n    global_lock.unlock();\n    XThread::GetCurrentThread()->Terminate(0);\n  }\n}\n\nvoid KernelState::RegisterThread(XThread* thread) {\n  auto global_lock = global_critical_region_.Acquire();\n  threads_by_id_[thread->thread_id()] = thread;\n\n  /*\n  auto pib =\n      memory_->TranslateVirtual<ProcessInfoBlock*>(process_info_block_address_);\n  pib->thread_count = pib->thread_count + 1;\n  */\n}\n\nvoid KernelState::UnregisterThread(XThread* thread) {\n  auto global_lock = global_critical_region_.Acquire();\n  auto it = threads_by_id_.find(thread->thread_id());\n  if (it != threads_by_id_.end()) {\n    threads_by_id_.erase(it);\n  }\n\n  /*\n  auto pib =\n      memory_->TranslateVirtual<ProcessInfoBlock*>(process_info_block_address_);\n  pib->thread_count = pib->thread_count - 1;\n  */\n}\n\nvoid KernelState::OnThreadExecute(XThread* thread) {\n  auto global_lock = global_critical_region_.Acquire();\n\n  // Must be called on executing thread.\n  assert_true(XThread::GetCurrentThread() == thread);\n\n  // Call DllMain(DLL_THREAD_ATTACH) for each user module:\n  // https://msdn.microsoft.com/en-us/library/windows/desktop/ms682583%28v=vs.85%29.aspx\n  auto thread_state = thread->thread_state();\n  for (auto user_module : user_modules_) {\n    if (user_module->is_dll_module() && user_module->entry_point()) {\n      uint64_t args[] = {\n          user_module->handle(),\n          2,  // DLL_THREAD_ATTACH\n          0,  // 0 because always dynamic\n      };\n      processor()->Execute(thread_state, user_module->entry_point(), args,\n                           xe::countof(args));\n    }\n  }\n}\n\nvoid KernelState::OnThreadExit(XThread* thread) {\n  auto global_lock = global_critical_region_.Acquire();\n\n  // Must be called on executing thread.\n  assert_true(XThread::GetCurrentThread() == thread);\n\n  // Call DllMain(DLL_THREAD_DETACH) for each user module:\n  // https://msdn.microsoft.com/en-us/library/windows/desktop/ms682583%28v=vs.85%29.aspx\n  auto thread_state = thread->thread_state();\n  for (auto user_module : user_modules_) {\n    if (user_module->is_dll_module() && user_module->entry_point()) {\n      uint64_t args[] = {\n          user_module->handle(),\n          3,  // DLL_THREAD_DETACH\n          0,  // 0 because always dynamic\n      };\n      processor()->Execute(thread_state, user_module->entry_point(), args,\n                           xe::countof(args));\n    }\n  }\n\n  emulator()->processor()->OnThreadExit(thread->thread_id());\n}\n\nobject_ref<XThread> KernelState::GetThreadByID(uint32_t thread_id) {\n  auto global_lock = global_critical_region_.Acquire();\n  XThread* thread = nullptr;\n  auto it = threads_by_id_.find(thread_id);\n  if (it != threads_by_id_.end()) {\n    thread = it->second;\n  }\n  return retain_object(thread);\n}\n\nvoid KernelState::RegisterNotifyListener(XNotifyListener* listener) {\n  auto global_lock = global_critical_region_.Acquire();\n  notify_listeners_.push_back(retain_object(listener));\n\n  // Games seem to expect a few notifications on startup, only for the first\n  // listener.\n  // https://cs.rin.ru/forum/viewtopic.php?f=38&t=60668&hilit=resident+evil+5&start=375\n  if (!has_notified_startup_ && listener->mask() & 0x00000001) {\n    has_notified_startup_ = true;\n    // XN_SYS_UI (on, off)\n    listener->EnqueueNotification(0x00000009, 1);\n    listener->EnqueueNotification(0x00000009, 0);\n    // XN_SYS_SIGNINCHANGED x2\n    listener->EnqueueNotification(0x0000000A, 1);\n    listener->EnqueueNotification(0x0000000A, 1);\n    // XN_SYS_INPUTDEVICESCHANGED x2\n    listener->EnqueueNotification(0x00000012, 0);\n    listener->EnqueueNotification(0x00000012, 0);\n    // XN_SYS_INPUTDEVICECONFIGCHANGED x2\n    listener->EnqueueNotification(0x00000013, 0);\n    listener->EnqueueNotification(0x00000013, 0);\n  }\n}\n\nvoid KernelState::UnregisterNotifyListener(XNotifyListener* listener) {\n  auto global_lock = global_critical_region_.Acquire();\n  for (auto it = notify_listeners_.begin(); it != notify_listeners_.end();\n       ++it) {\n    if ((*it).get() == listener) {\n      notify_listeners_.erase(it);\n      break;\n    }\n  }\n}\n\nvoid KernelState::BroadcastNotification(XNotificationID id, uint32_t data) {\n  auto global_lock = global_critical_region_.Acquire();\n  for (const auto& notify_listener : notify_listeners_) {\n    notify_listener->EnqueueNotification(id, data);\n  }\n}\n\nvoid KernelState::CompleteOverlapped(uint32_t overlapped_ptr, X_RESULT result) {\n  CompleteOverlappedEx(overlapped_ptr, result, result, 0);\n}\n\nvoid KernelState::CompleteOverlappedEx(uint32_t overlapped_ptr, X_RESULT result,\n                                       uint32_t extended_error,\n                                       uint32_t length) {\n  auto ptr = memory()->TranslateVirtual(overlapped_ptr);\n  XOverlappedSetResult(ptr, result);\n  XOverlappedSetExtendedError(ptr, extended_error);\n  XOverlappedSetLength(ptr, length);\n  X_HANDLE event_handle = XOverlappedGetEvent(ptr);\n  if (event_handle) {\n    auto ev = object_table()->LookupObject<XEvent>(event_handle);\n    assert_not_null(ev);\n    if (ev) {\n      ev->Set(0, false);\n    }\n  }\n  if (XOverlappedGetCompletionRoutine(ptr)) {\n    X_HANDLE thread_handle = XOverlappedGetContext(ptr);\n    auto thread = object_table()->LookupObject<XThread>(thread_handle);\n    if (thread) {\n      // Queue APC on the thread that requested the overlapped operation.\n      uint32_t routine = XOverlappedGetCompletionRoutine(ptr);\n      thread->EnqueueApc(routine, result, length, overlapped_ptr);\n    }\n  }\n}\n\nvoid KernelState::CompleteOverlappedImmediate(uint32_t overlapped_ptr,\n                                              X_RESULT result) {\n  // TODO(gibbed): there are games that check 'length' of overlapped as\n  // an indication of success. WTF?\n  // Setting length to -1 when not success seems to be helping.\n  uint32_t length = !result ? 0 : 0xFFFFFFFF;\n  CompleteOverlappedImmediateEx(overlapped_ptr, result, result, length);\n}\n\nvoid KernelState::CompleteOverlappedImmediateEx(uint32_t overlapped_ptr,\n                                                X_RESULT result,\n                                                uint32_t extended_error,\n                                                uint32_t length) {\n  auto ptr = memory()->TranslateVirtual(overlapped_ptr);\n  XOverlappedSetContext(ptr, XThread::GetCurrentThreadHandle());\n  CompleteOverlappedEx(overlapped_ptr, result, extended_error, length);\n}\n\nvoid KernelState::CompleteOverlappedDeferred(\n    std::function<void()> completion_callback, uint32_t overlapped_ptr,\n    X_RESULT result, std::function<void()> pre_callback,\n    std::function<void()> post_callback) {\n  CompleteOverlappedDeferredEx(std::move(completion_callback), overlapped_ptr,\n                               result, result, 0, pre_callback, post_callback);\n}\n\nvoid KernelState::CompleteOverlappedDeferredEx(\n    std::function<void()> completion_callback, uint32_t overlapped_ptr,\n    X_RESULT result, uint32_t extended_error, uint32_t length,\n    std::function<void()> pre_callback, std::function<void()> post_callback) {\n  CompleteOverlappedDeferredEx(\n      [completion_callback, result, extended_error, length](\n          uint32_t& cb_extended_error, uint32_t& cb_length) -> X_RESULT {\n        completion_callback();\n        cb_extended_error = extended_error;\n        cb_length = length;\n        return result;\n      },\n      overlapped_ptr, pre_callback, post_callback);\n}\n\nvoid KernelState::CompleteOverlappedDeferred(\n    std::function<X_RESULT()> completion_callback, uint32_t overlapped_ptr,\n    std::function<void()> pre_callback, std::function<void()> post_callback) {\n  CompleteOverlappedDeferredEx(\n      [completion_callback](uint32_t& extended_error,\n                            uint32_t& length) -> X_RESULT {\n        auto result = completion_callback();\n        extended_error = static_cast<uint32_t>(result);\n        length = 0;\n        return result;\n      },\n      overlapped_ptr, pre_callback, post_callback);\n}\n\nvoid KernelState::CompleteOverlappedDeferredEx(\n    std::function<X_RESULT(uint32_t&, uint32_t&)> completion_callback,\n    uint32_t overlapped_ptr, std::function<void()> pre_callback,\n    std::function<void()> post_callback) {\n  auto ptr = memory()->TranslateVirtual(overlapped_ptr);\n  XOverlappedSetResult(ptr, X_ERROR_IO_PENDING);\n  XOverlappedSetContext(ptr, XThread::GetCurrentThreadHandle());\n  auto global_lock = global_critical_region_.Acquire();\n  dispatch_queue_.push_back([this, completion_callback, overlapped_ptr,\n                             pre_callback, post_callback]() {\n    if (pre_callback) {\n      pre_callback();\n    }\n    xe::threading::Sleep(\n        std::chrono::milliseconds(kDeferredOverlappedDelayMillis));\n    uint32_t extended_error, length;\n    auto result = completion_callback(extended_error, length);\n    CompleteOverlappedEx(overlapped_ptr, result, extended_error, length);\n    if (post_callback) {\n      post_callback();\n    }\n  });\n  dispatch_cond_.notify_all();\n}\n\nbool KernelState::Save(ByteStream* stream) {\n  XELOGD(\"Serializing the kernel...\");\n  stream->Write(kKernelSaveSignature);\n\n  // Save the object table\n  object_table_.Save(stream);\n\n  // Write the TLS allocation bitmap\n  auto tls_bitmap = tls_bitmap_.data();\n  stream->Write(uint32_t(tls_bitmap.size()));\n  for (size_t i = 0; i < tls_bitmap.size(); i++) {\n    stream->Write<uint64_t>(tls_bitmap[i]);\n  }\n\n  // We save XThreads absolutely first, as they will execute code upon save\n  // (which could modify the kernel state)\n  auto threads = object_table_.GetObjectsByType<XThread>();\n  uint32_t* num_threads_ptr =\n      reinterpret_cast<uint32_t*>(stream->data() + stream->offset());\n  stream->Write(static_cast<uint32_t>(threads.size()));\n\n  size_t num_threads = threads.size();\n  XELOGD(\"Serializing {} threads...\", threads.size());\n  for (auto thread : threads) {\n    if (!thread->is_guest_thread()) {\n      // Don't save host threads. They can be reconstructed on startup.\n      num_threads--;\n      continue;\n    }\n\n    if (!thread->Save(stream)) {\n      XELOGD(\"Failed to save thread \\\"{}\\\"\", thread->name());\n      num_threads--;\n    }\n  }\n\n  *num_threads_ptr = static_cast<uint32_t>(num_threads);\n\n  // Save all other objects\n  auto objects = object_table_.GetAllObjects();\n  uint32_t* num_objects_ptr =\n      reinterpret_cast<uint32_t*>(stream->data() + stream->offset());\n  stream->Write(static_cast<uint32_t>(objects.size()));\n\n  size_t num_objects = objects.size();\n  XELOGD(\"Serializing {} objects...\", num_objects);\n  for (auto object : objects) {\n    auto prev_offset = stream->offset();\n\n    if (object->is_host_object() || object->type() == XObject::Type::Thread) {\n      // Don't save host objects or save XThreads again\n      num_objects--;\n      continue;\n    }\n\n    stream->Write<uint32_t>(static_cast<uint32_t>(object->type()));\n    if (!object->Save(stream)) {\n      XELOGD(\"Did not save object of type {}\", object->type());\n      assert_always();\n\n      // Revert backwards and overwrite if a save failed.\n      stream->set_offset(prev_offset);\n      num_objects--;\n    }\n  }\n\n  *num_objects_ptr = static_cast<uint32_t>(num_objects);\n  return true;\n}\n\nbool KernelState::Restore(ByteStream* stream) {\n  // Check the magic value.\n  if (stream->Read<uint32_t>() != kKernelSaveSignature) {\n    return false;\n  }\n\n  // Restore the object table\n  object_table_.Restore(stream);\n\n  // Read the TLS allocation bitmap\n  auto num_bitmap_entries = stream->Read<uint32_t>();\n  auto& tls_bitmap = tls_bitmap_.data();\n  tls_bitmap.resize(num_bitmap_entries);\n  for (uint32_t i = 0; i < num_bitmap_entries; i++) {\n    tls_bitmap[i] = stream->Read<uint64_t>();\n  }\n\n  uint32_t num_threads = stream->Read<uint32_t>();\n  XELOGD(\"Loading {} threads...\", num_threads);\n  for (uint32_t i = 0; i < num_threads; i++) {\n    auto thread = XObject::Restore(this, XObject::Type::Thread, stream);\n    if (!thread) {\n      // Can't continue the restore or we risk misalignment.\n      assert_always();\n      return false;\n    }\n  }\n\n  uint32_t num_objects = stream->Read<uint32_t>();\n  XELOGD(\"Loading {} objects...\", num_objects);\n  for (uint32_t i = 0; i < num_objects; i++) {\n    uint32_t type = stream->Read<uint32_t>();\n\n    auto obj = XObject::Restore(this, XObject::Type(type), stream);\n    if (!obj) {\n      // Can't continue the restore or we risk misalignment.\n      assert_always();\n      return false;\n    }\n  }\n\n  return true;\n}\n\n}  // namespace kernel\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/kernel/kernel_state.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_KERNEL_KERNEL_STATE_H_\n#define XENIA_KERNEL_KERNEL_STATE_H_\n\n#include <atomic>\n#include <condition_variable>\n#include <functional>\n#include <list>\n#include <memory>\n#include <vector>\n\n#include \"xenia/base/bit_map.h\"\n#include \"xenia/base/cvar.h\"\n#include \"xenia/base/mutex.h\"\n#include \"xenia/cpu/export_resolver.h\"\n#include \"xenia/kernel/util/native_list.h\"\n#include \"xenia/kernel/util/object_table.h\"\n#include \"xenia/kernel/util/xdbf_utils.h\"\n#include \"xenia/kernel/xam/app_manager.h\"\n#include \"xenia/kernel/xam/content_manager.h\"\n#include \"xenia/kernel/xam/user_profile.h\"\n#include \"xenia/memory.h\"\n#include \"xenia/vfs/virtual_file_system.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nclass ByteStream;\nclass Emulator;\nnamespace cpu {\nclass Processor;\n}  // namespace cpu\n}  // namespace xe\n\nnamespace xe {\nnamespace kernel {\n\nconstexpr fourcc_t kKernelSaveSignature = make_fourcc(\"KRNL\");\n\nclass Dispatcher;\nclass XHostThread;\nclass KernelModule;\nclass XModule;\nclass XNotifyListener;\nclass XThread;\nclass UserModule;\n\n// (?), used by KeGetCurrentProcessType\nconstexpr uint32_t X_PROCTYPE_IDLE = 0;\nconstexpr uint32_t X_PROCTYPE_USER = 1;\nconstexpr uint32_t X_PROCTYPE_SYSTEM = 2;\n\nstruct ProcessInfoBlock {\n  xe::be<uint32_t> unk_00;\n  xe::be<uint32_t> unk_04;  // blink\n  xe::be<uint32_t> unk_08;  // flink\n  xe::be<uint32_t> unk_0C;\n  xe::be<uint32_t> unk_10;\n  xe::be<uint32_t> thread_count;\n  uint8_t unk_18;\n  uint8_t unk_19;\n  uint8_t unk_1A;\n  uint8_t unk_1B;\n  xe::be<uint32_t> kernel_stack_size;\n  xe::be<uint32_t> unk_20;\n  xe::be<uint32_t> tls_data_size;\n  xe::be<uint32_t> tls_raw_data_size;\n  xe::be<uint16_t> tls_slot_size;\n  uint8_t unk_2E;\n  uint8_t process_type;\n  xe::be<uint32_t> bitmap[0x20 / 4];\n  xe::be<uint32_t> unk_50;\n  xe::be<uint32_t> unk_54;  // blink\n  xe::be<uint32_t> unk_58;  // flink\n  xe::be<uint32_t> unk_5C;\n};\n\nstruct TerminateNotification {\n  uint32_t guest_routine;\n  uint32_t priority;\n};\n\nclass KernelState {\n public:\n  explicit KernelState(Emulator* emulator);\n  ~KernelState();\n\n  static KernelState* shared();\n\n  Emulator* emulator() const { return emulator_; }\n  Memory* memory() const { return memory_; }\n  cpu::Processor* processor() const { return processor_; }\n  vfs::VirtualFileSystem* file_system() const { return file_system_; }\n\n  uint32_t title_id() const;\n  util::XdbfGameData title_xdbf() const;\n  util::XdbfGameData module_xdbf(object_ref<UserModule> exec_module) const;\n\n  xam::AppManager* app_manager() const { return app_manager_.get(); }\n  xam::ContentManager* content_manager() const {\n    return content_manager_.get();\n  }\n  xam::UserProfile* user_profile() const { return user_profile_.get(); }\n\n  // Access must be guarded by the global critical region.\n  util::ObjectTable* object_table() { return &object_table_; }\n\n  uint32_t process_type() const;\n  void set_process_type(uint32_t value);\n  uint32_t process_info_block_address() const {\n    return process_info_block_address_;\n  }\n\n  uint32_t AllocateTLS();\n  void FreeTLS(uint32_t slot);\n\n  void RegisterTitleTerminateNotification(uint32_t routine, uint32_t priority);\n  void RemoveTitleTerminateNotification(uint32_t routine);\n\n  void RegisterModule(XModule* module);\n  void UnregisterModule(XModule* module);\n  bool RegisterUserModule(object_ref<UserModule> module);\n  void UnregisterUserModule(UserModule* module);\n  bool IsKernelModule(const std::string_view name);\n  object_ref<XModule> GetModule(const std::string_view name,\n                                bool user_only = false);\n\n  object_ref<XThread> LaunchModule(object_ref<UserModule> module);\n  object_ref<UserModule> GetExecutableModule();\n  void SetExecutableModule(object_ref<UserModule> module);\n  object_ref<UserModule> LoadUserModule(const std::string_view name,\n                                        bool call_entry = true);\n  void UnloadUserModule(const object_ref<UserModule>& module,\n                        bool call_entry = true);\n\n  object_ref<KernelModule> GetKernelModule(const std::string_view name);\n  template <typename T>\n  object_ref<KernelModule> LoadKernelModule() {\n    auto kernel_module = object_ref<KernelModule>(new T(emulator_, this));\n    LoadKernelModule(kernel_module);\n    return kernel_module;\n  }\n  template <typename T>\n  object_ref<T> GetKernelModule(const std::string_view name) {\n    auto module = GetKernelModule(name);\n    return object_ref<T>(reinterpret_cast<T*>(module.release()));\n  }\n\n  // Terminates a title: Unloads all modules, and kills all guest threads.\n  // This DOES NOT RETURN if called from a guest thread!\n  void TerminateTitle();\n\n  void RegisterThread(XThread* thread);\n  void UnregisterThread(XThread* thread);\n  void OnThreadExecute(XThread* thread);\n  void OnThreadExit(XThread* thread);\n  object_ref<XThread> GetThreadByID(uint32_t thread_id);\n\n  void RegisterNotifyListener(XNotifyListener* listener);\n  void UnregisterNotifyListener(XNotifyListener* listener);\n  void BroadcastNotification(XNotificationID id, uint32_t data);\n\n  util::NativeList* dpc_list() { return &dpc_list_; }\n\n  void CompleteOverlapped(uint32_t overlapped_ptr, X_RESULT result);\n  void CompleteOverlappedEx(uint32_t overlapped_ptr, X_RESULT result,\n                            uint32_t extended_error, uint32_t length);\n\n  void CompleteOverlappedImmediate(uint32_t overlapped_ptr, X_RESULT result);\n  void CompleteOverlappedImmediateEx(uint32_t overlapped_ptr, X_RESULT result,\n                                     uint32_t extended_error, uint32_t length);\n\n  void CompleteOverlappedDeferred(\n      std::function<void()> completion_callback, uint32_t overlapped_ptr,\n      X_RESULT result, std::function<void()> pre_callback = nullptr,\n      std::function<void()> post_callback = nullptr);\n  void CompleteOverlappedDeferredEx(\n      std::function<void()> completion_callback, uint32_t overlapped_ptr,\n      X_RESULT result, uint32_t extended_error, uint32_t length,\n      std::function<void()> pre_callback = nullptr,\n      std::function<void()> post_callback = nullptr);\n\n  void CompleteOverlappedDeferred(\n      std::function<X_RESULT()> completion_callback, uint32_t overlapped_ptr,\n      std::function<void()> pre_callback = nullptr,\n      std::function<void()> post_callback = nullptr);\n  void CompleteOverlappedDeferredEx(\n      std::function<X_RESULT(uint32_t&, uint32_t&)> completion_callback,\n      uint32_t overlapped_ptr, std::function<void()> pre_callback = nullptr,\n      std::function<void()> post_callback = nullptr);\n\n  bool Save(ByteStream* stream);\n  bool Restore(ByteStream* stream);\n\n private:\n  void LoadKernelModule(object_ref<KernelModule> kernel_module);\n\n  Emulator* emulator_;\n  Memory* memory_;\n  cpu::Processor* processor_;\n  vfs::VirtualFileSystem* file_system_;\n\n  std::unique_ptr<xam::AppManager> app_manager_;\n  std::unique_ptr<xam::ContentManager> content_manager_;\n  std::unique_ptr<xam::UserProfile> user_profile_;\n\n  xe::global_critical_region global_critical_region_;\n\n  // Must be guarded by the global critical region.\n  util::ObjectTable object_table_;\n  std::unordered_map<uint32_t, XThread*> threads_by_id_;\n  std::vector<object_ref<XNotifyListener>> notify_listeners_;\n  bool has_notified_startup_ = false;\n\n  uint32_t process_type_ = X_PROCTYPE_USER;\n  object_ref<UserModule> executable_module_;\n  std::vector<object_ref<KernelModule>> kernel_modules_;\n  std::vector<object_ref<UserModule>> user_modules_;\n  std::vector<TerminateNotification> terminate_notifications_;\n\n  uint32_t process_info_block_address_ = 0;\n\n  std::atomic<bool> dispatch_thread_running_;\n  object_ref<XHostThread> dispatch_thread_;\n  // Must be guarded by the global critical region.\n  util::NativeList dpc_list_;\n  std::condition_variable_any dispatch_cond_;\n  std::list<std::function<void()>> dispatch_queue_;\n\n  BitMap tls_bitmap_;\n\n  friend class XObject;\n};\n\n}  // namespace kernel\n}  // namespace xe\n\n#endif  // XENIA_KERNEL_KERNEL_STATE_H_\n"
  },
  {
    "path": "src/xenia/kernel/premake5.lua",
    "content": "project_root = \"../../..\"\ninclude(project_root..\"/tools/build\")\n\ngroup(\"src\")\nproject(\"xenia-kernel\")\n  uuid(\"ae185c4a-1c4f-4503-9892-328e549e871a\")\n  kind(\"StaticLib\")\n  language(\"C++\")\n  links({\n    \"aes_128\",\n    \"fmt\",\n    \"xenia-apu\",\n    \"xenia-base\",\n    \"xenia-cpu\",\n    \"xenia-hid\",\n    \"xenia-vfs\",\n  })\n  defines({\n  })\n  recursive_platform_files()\n  files({\n    \"debug_visualizers.natvis\",\n  })\n"
  },
  {
    "path": "src/xenia/kernel/user_module.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/kernel/user_module.h\"\n\n#include <vector>\n\n#include \"xenia/base/byte_stream.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/cpu/elf_module.h\"\n#include \"xenia/cpu/processor.h\"\n#include \"xenia/cpu/xex_module.h\"\n#include \"xenia/emulator.h\"\n#include \"xenia/kernel/xfile.h\"\n#include \"xenia/kernel/xthread.h\"\n\nDEFINE_bool(xex_apply_patches, true, \"Apply XEX patches.\", \"Kernel\");\n\nnamespace xe {\nnamespace kernel {\n\nUserModule::UserModule(KernelState* kernel_state)\n    : XModule(kernel_state, ModuleType::kUserModule) {}\n\nUserModule::~UserModule() { Unload(); }\n\nuint32_t UserModule::title_id() const {\n  if (module_format_ != kModuleFormatXex) {\n    return 0;\n  }\n  auto header = xex_header();\n  for (uint32_t i = 0; i < header->header_count; i++) {\n    auto& opt_header = header->headers[i];\n    if (opt_header.key == XEX_HEADER_EXECUTION_INFO) {\n      auto opt_header_ptr =\n          reinterpret_cast<const uint8_t*>(header) + opt_header.offset;\n      auto opt_exec_info =\n          reinterpret_cast<const xex2_opt_execution_info*>(opt_header_ptr);\n      return static_cast<uint32_t>(opt_exec_info->title_id);\n    }\n  }\n  return 0;\n}\n\nX_STATUS UserModule::LoadFromFile(const std::string_view path) {\n  X_STATUS result = X_STATUS_UNSUCCESSFUL;\n\n  // Resolve the file to open.\n  // TODO(benvanik): make this code shared?\n  auto fs_entry = kernel_state()->file_system()->ResolvePath(path);\n  if (!fs_entry) {\n    XELOGE(\"File not found: {}\", path);\n    return X_STATUS_NO_SUCH_FILE;\n  }\n\n  path_ = fs_entry->absolute_path();\n  name_ = utf8::find_base_name_from_guest_path(path_);\n\n  // If the FS supports mapping, map the file in and load from that.\n  if (fs_entry->can_map()) {\n    // Map.\n    auto mmap = fs_entry->OpenMapped(MappedMemory::Mode::kRead);\n    if (!mmap) {\n      return result;\n    }\n\n    // Load the module.\n    result = LoadFromMemory(mmap->data(), mmap->size());\n  } else {\n    std::vector<uint8_t> buffer(fs_entry->size());\n\n    // Open file for reading.\n    vfs::File* file = nullptr;\n    result = fs_entry->Open(vfs::FileAccess::kGenericRead, &file);\n    if (XFAILED(result)) {\n      return result;\n    }\n\n    // Read entire file into memory.\n    // Ugh.\n    size_t bytes_read = 0;\n    result = file->ReadSync(buffer.data(), buffer.size(), 0, &bytes_read);\n    if (XFAILED(result)) {\n      return result;\n    }\n\n    // Load the module.\n    result = LoadFromMemory(buffer.data(), bytes_read);\n\n    // Close the file.\n    file->Destroy();\n  }\n\n  // Only XEX returns X_STATUS_PENDING\n  if (result != X_STATUS_PENDING) {\n    return result;\n  }\n\n  if (cvars::xex_apply_patches) {\n    // Search for xexp patch file\n    auto patch_entry = kernel_state()->file_system()->ResolvePath(path_ + \"p\");\n\n    if (patch_entry) {\n      auto patch_path = patch_entry->absolute_path();\n\n      XELOGI(\"Loading XEX patch from {}\", patch_path);\n\n      auto patch_module = object_ref<UserModule>(new UserModule(kernel_state_));\n      result = patch_module->LoadFromFile(patch_path);\n      if (!result) {\n        result = patch_module->xex_module()->ApplyPatch(xex_module());\n        if (result) {\n          XELOGE(\"Failed to apply XEX patch, code: {}\", result);\n        }\n      } else {\n        XELOGE(\"Failed to load XEX patch, code: {}\", result);\n      }\n\n      if (result) {\n        return X_STATUS_UNSUCCESSFUL;\n      }\n    }\n  }\n\n  return LoadXexContinue();\n}\n\nX_STATUS UserModule::LoadFromMemory(const void* addr, const size_t length) {\n  auto processor = kernel_state()->processor();\n\n  be<fourcc_t> magic;\n  magic.value = xe::load<fourcc_t>(addr);\n  if (magic == xe::cpu::kXEX2Signature || magic == xe::cpu::kXEX1Signature) {\n    module_format_ = kModuleFormatXex;\n  } else if (magic == xe::cpu::kElfSignature) {\n    module_format_ = kModuleFormatElf;\n  } else {\n    be<uint16_t> magic16;\n    magic16.value = xe::load<uint16_t>(addr);\n    if (magic16 == 0x4D5A) {\n      XELOGE(\"XNA executables are not yet implemented\");\n      return X_STATUS_NOT_IMPLEMENTED;\n    } else {\n      XELOGE(\"Unknown module magic: {:08X}\", magic);\n      return X_STATUS_NOT_IMPLEMENTED;\n    }\n  }\n\n  if (module_format_ == kModuleFormatXex) {\n    // Prepare the module for execution.\n    // Runtime takes ownership.\n    auto xex_module =\n        std::make_unique<cpu::XexModule>(processor, kernel_state());\n    if (!xex_module->Load(name_, path_, addr, length)) {\n      return X_STATUS_UNSUCCESSFUL;\n    }\n    processor_module_ = xex_module.get();\n    if (!processor->AddModule(std::move(xex_module))) {\n      return X_STATUS_UNSUCCESSFUL;\n    }\n\n    // Only XEX headers + image are loaded right now\n    // Caller will have to call LoadXexContinue after they've loaded in a patch\n    // (or after patch isn't found anywhere)\n    // or if this is an XEXP being loaded return success since there's nothing\n    // else to load\n    return this->xex_module()->is_patch() ? X_STATUS_SUCCESS : X_STATUS_PENDING;\n\n  } else if (module_format_ == kModuleFormatElf) {\n    auto elf_module =\n        std::make_unique<cpu::ElfModule>(processor, kernel_state());\n    if (!elf_module->Load(name_, path_, addr, length)) {\n      return X_STATUS_UNSUCCESSFUL;\n    }\n\n    entry_point_ = elf_module->entry_point();\n    stack_size_ = 1024 * 1024;  // 1 MB\n    is_dll_module_ = false;     // Hardcoded not a DLL (for now)\n\n    processor_module_ = elf_module.get();\n    if (!processor->AddModule(std::move(elf_module))) {\n      return X_STATUS_UNSUCCESSFUL;\n    }\n  }\n\n  OnLoad();\n\n  return X_STATUS_SUCCESS;\n}\n\nX_STATUS UserModule::LoadXexContinue() {\n  // LoadXexContinue: finishes loading XEX after a patch has been applied (or\n  // patch wasn't found)\n\n  if (!this->xex_module()) {\n    return X_STATUS_UNSUCCESSFUL;\n  }\n\n  // If guest_xex_header is set we must have already loaded the XEX\n  if (guest_xex_header_) {\n    return X_STATUS_SUCCESS;\n  }\n\n  // Finish XexModule load (PE sections/imports/symbols...)\n  if (!xex_module()->LoadContinue()) {\n    return X_STATUS_UNSUCCESSFUL;\n  }\n\n  // Copy the xex2 header into guest memory.\n  auto header = this->xex_module()->xex_header();\n  auto security_header = this->xex_module()->xex_security_info();\n  guest_xex_header_ = memory()->SystemHeapAlloc(header->header_size);\n\n  uint8_t* xex_header_ptr = memory()->TranslateVirtual(guest_xex_header_);\n  std::memcpy(xex_header_ptr, header, header->header_size);\n\n  // Cache some commonly used headers...\n  this->xex_module()->GetOptHeader(XEX_HEADER_ENTRY_POINT, &entry_point_);\n  this->xex_module()->GetOptHeader(XEX_HEADER_DEFAULT_STACK_SIZE, &stack_size_);\n  is_dll_module_ = !!(header->module_flags & XEX_MODULE_DLL_MODULE);\n\n  // Setup the loader data entry\n  auto ldr_data =\n      memory()->TranslateVirtual<X_LDR_DATA_TABLE_ENTRY*>(hmodule_ptr_);\n\n  ldr_data->dll_base = 0;  // GetProcAddress will read this.\n  ldr_data->xex_header_base = guest_xex_header_;\n  ldr_data->full_image_size = security_header->image_size;\n  ldr_data->image_base = this->xex_module()->base_address();\n  ldr_data->entry_point = entry_point_;\n\n  OnLoad();\n\n  return X_STATUS_SUCCESS;\n}\n\nX_STATUS UserModule::Unload() {\n  if (module_format_ == kModuleFormatXex &&\n      (!processor_module_ || !xex_module()->loaded())) {\n    // Quick abort.\n    return X_STATUS_SUCCESS;\n  }\n\n  if (module_format_ == kModuleFormatXex && processor_module_ &&\n      xex_module()->Unload()) {\n    OnUnload();\n    return X_STATUS_SUCCESS;\n  }\n\n  return X_STATUS_UNSUCCESSFUL;\n}\n\nuint32_t UserModule::GetProcAddressByOrdinal(uint16_t ordinal) {\n  return xex_module()->GetProcAddress(ordinal);\n}\n\nuint32_t UserModule::GetProcAddressByName(std::string_view name) {\n  return xex_module()->GetProcAddress(name);\n}\n\nX_STATUS UserModule::GetSection(const std::string_view name,\n                                uint32_t* out_section_data,\n                                uint32_t* out_section_size) {\n  xex2_opt_resource_info* resource_header = nullptr;\n  if (!cpu::XexModule::GetOptHeader(xex_header(), XEX_HEADER_RESOURCE_INFO,\n                                    &resource_header)) {\n    // No resources.\n    return X_STATUS_NOT_FOUND;\n  }\n  uint32_t count = (resource_header->size - 4) / sizeof(xex2_resource);\n  for (uint32_t i = 0; i < count; i++) {\n    auto& res = resource_header->resources[i];\n    if (utf8::equal_z(name, std::string_view(res.name, 8))) {\n      // Found!\n      *out_section_data = res.address;\n      *out_section_size = res.size;\n      return X_STATUS_SUCCESS;\n    }\n  }\n\n  return X_STATUS_NOT_FOUND;\n}\n\nX_STATUS UserModule::GetOptHeader(xex2_header_keys key, void** out_ptr) {\n  assert_not_null(out_ptr);\n\n  if (module_format_ == kModuleFormatElf) {\n    // Quick die.\n    return X_STATUS_UNSUCCESSFUL;\n  }\n\n  bool ret = xex_module()->GetOptHeader(key, out_ptr);\n  if (!ret) {\n    return X_STATUS_NOT_FOUND;\n  }\n\n  return X_STATUS_SUCCESS;\n}\n\nX_STATUS UserModule::GetOptHeader(xex2_header_keys key,\n                                  uint32_t* out_header_guest_ptr) {\n  if (module_format_ == kModuleFormatElf) {\n    // Quick die.\n    return X_STATUS_UNSUCCESSFUL;\n  }\n\n  auto header =\n      memory()->TranslateVirtual<const xex2_header*>(guest_xex_header_);\n  if (!header) {\n    return X_STATUS_UNSUCCESSFUL;\n  }\n  return GetOptHeader(memory(), header, key, out_header_guest_ptr);\n}\n\nX_STATUS UserModule::GetOptHeader(const Memory* memory,\n                                  const xex2_header* header,\n                                  xex2_header_keys key,\n                                  uint32_t* out_header_guest_ptr) {\n  assert_not_null(out_header_guest_ptr);\n  uint32_t field_value = 0;\n  bool field_found = false;\n  for (uint32_t i = 0; i < header->header_count; i++) {\n    auto& opt_header = header->headers[i];\n    if (opt_header.key != key) {\n      continue;\n    }\n    field_found = true;\n    switch (opt_header.key & 0xFF) {\n      case 0x00:\n        // Return data stored in header value.\n        field_value = opt_header.value;\n        break;\n      case 0x01:\n        // Return pointer to data stored in header value.\n        field_value = memory->HostToGuestVirtual(&opt_header.value);\n        break;\n      default:\n        // Data stored at offset to header.\n        field_value = memory->HostToGuestVirtual(header) + opt_header.offset;\n        break;\n    }\n    break;\n  }\n  *out_header_guest_ptr = field_value;\n  if (!field_found) {\n    return X_STATUS_NOT_FOUND;\n  }\n  return X_STATUS_SUCCESS;\n}\n\nbool UserModule::Save(ByteStream* stream) {\n  if (!XModule::Save(stream)) {\n    return false;\n  }\n\n  // A lot of the information stored on this class can be reconstructed at\n  // runtime.\n\n  return true;\n}\n\nobject_ref<UserModule> UserModule::Restore(KernelState* kernel_state,\n                                           ByteStream* stream,\n                                           const std::string_view path) {\n  auto module = new UserModule(kernel_state);\n\n  // XModule::Save took care of this earlier...\n  // TODO: Find a nicer way to represent that here.\n  if (!module->RestoreObject(stream)) {\n    return nullptr;\n  }\n\n  auto result = module->LoadFromFile(path);\n  if (XFAILED(result)) {\n    XELOGD(\"UserModule::Restore LoadFromFile({}) FAILED - code {:08X}\", path,\n           result);\n    return nullptr;\n  }\n\n  if (!kernel_state->RegisterUserModule(retain_object(module))) {\n    // Already loaded?\n    assert_always();\n  }\n\n  return object_ref<UserModule>(module);\n}\n\nvoid UserModule::Dump() {\n  if (module_format_ == kModuleFormatElf) {\n    // Quick die.\n    return;\n  }\n\n  StringBuffer sb;\n\n  xe::cpu::ExportResolver* export_resolver =\n      kernel_state_->emulator()->export_resolver();\n  auto header = xex_header();\n\n  // XEX header.\n  sb.AppendFormat(\"Module {}:\\n\", path_);\n  sb.AppendFormat(\"    Module Flags: {:08X}\\n\", (uint32_t)header->module_flags);\n\n  // Security header\n  auto security_info = xex_module()->xex_security_info();\n  sb.Append(\"Security Header:\\n\");\n  sb.AppendFormat(\"     Image Flags: {:08X}\\n\",\n                  (uint32_t)security_info->image_flags);\n  sb.AppendFormat(\"    Load Address: {:08X}\\n\",\n                  (uint32_t)security_info->load_address);\n  sb.AppendFormat(\"      Image Size: {:08X}\\n\",\n                  (uint32_t)security_info->image_size);\n  sb.AppendFormat(\"    Export Table: {:08X}\\n\",\n                  (uint32_t)security_info->export_table);\n\n  // Optional headers\n  sb.AppendFormat(\"Optional Header Count: {}\\n\",\n                  (uint32_t)header->header_count);\n\n  for (uint32_t i = 0; i < header->header_count; i++) {\n    auto& opt_header = header->headers[i];\n\n    // Stash a pointer (although this isn't used in every case)\n    auto opt_header_ptr =\n        reinterpret_cast<const uint8_t*>(header) + opt_header.offset;\n    switch (opt_header.key) {\n      case XEX_HEADER_RESOURCE_INFO: {\n        sb.Append(\"  XEX_HEADER_RESOURCE_INFO:\\n\");\n        auto opt_resource_info =\n            reinterpret_cast<const xex2_opt_resource_info*>(opt_header_ptr);\n\n        uint32_t count = (opt_resource_info->size - 4) / 16;\n        for (uint32_t j = 0; j < count; j++) {\n          auto& res = opt_resource_info->resources[j];\n\n          // Manually NULL-terminate the name.\n          char name[9];\n          std::memcpy(name, res.name, sizeof(res.name));\n          name[8] = 0;\n\n          sb.AppendFormat(\n              \"    {:<8} {:08X}-{:08X}, {}b\\n\", name, (uint32_t)res.address,\n              (uint32_t)res.address + (uint32_t)res.size, (uint32_t)res.size);\n        }\n      } break;\n      case XEX_HEADER_FILE_FORMAT_INFO: {\n        sb.Append(\"  XEX_HEADER_FILE_FORMAT_INFO (TODO):\\n\");\n      } break;\n      case XEX_HEADER_DELTA_PATCH_DESCRIPTOR: {\n        sb.Append(\"  XEX_HEADER_DELTA_PATCH_DESCRIPTOR (TODO):\\n\");\n      } break;\n      case XEX_HEADER_BOUNDING_PATH: {\n        auto opt_bound_path =\n            reinterpret_cast<const xex2_opt_bound_path*>(opt_header_ptr);\n        sb.AppendFormat(\"  XEX_HEADER_BOUNDING_PATH: {}\\n\",\n                        opt_bound_path->path);\n      } break;\n      case XEX_HEADER_ORIGINAL_BASE_ADDRESS: {\n        sb.AppendFormat(\"  XEX_HEADER_ORIGINAL_BASE_ADDRESS: {:08X}\\n\",\n                        (uint32_t)opt_header.value);\n      } break;\n      case XEX_HEADER_ENTRY_POINT: {\n        sb.AppendFormat(\"  XEX_HEADER_ENTRY_POINT: {:08X}\\n\",\n                        (uint32_t)opt_header.value);\n      } break;\n      case XEX_HEADER_IMAGE_BASE_ADDRESS: {\n        sb.AppendFormat(\"  XEX_HEADER_IMAGE_BASE_ADDRESS: {:08X}\\n\",\n                        (uint32_t)opt_header.value);\n      } break;\n      case XEX_HEADER_IMPORT_LIBRARIES: {\n        sb.Append(\"  XEX_HEADER_IMPORT_LIBRARIES:\\n\");\n        auto opt_import_libraries =\n            reinterpret_cast<const xex2_opt_import_libraries*>(opt_header_ptr);\n\n        // FIXME: Don't know if 32 is the actual limit, but haven't seen more\n        // than 2.\n        const char* string_table[32];\n        std::memset(string_table, 0, sizeof(string_table));\n\n        // Parse the string table\n        for (size_t j = 0, o = 0; j < opt_import_libraries->string_table.size &&\n                                  o < opt_import_libraries->string_table.count;\n             o++) {\n          assert_true(o < xe::countof(string_table));\n          const char* str = &opt_import_libraries->string_table.data[j];\n\n          string_table[o] = str;\n          j += std::strlen(str) + 1;\n\n          // Padding\n          if ((j % 4) != 0) {\n            j += 4 - (j % 4);\n          }\n        }\n\n        auto library_data =\n            reinterpret_cast<const uint8_t*>(opt_import_libraries);\n        uint32_t library_offset = opt_import_libraries->string_table.size + 12;\n        while (library_offset < opt_import_libraries->size) {\n          auto library = reinterpret_cast<const xex2_import_library*>(\n              library_data + library_offset);\n          if (!library->size) {\n            break;\n          }\n          auto name = string_table[library->name_index & 0xFF];\n          assert_not_null(name);\n          sb.AppendFormat(\"    {} - {} imports\\n\", name,\n                          (uint16_t)library->count);\n\n          xex2_version version, version_min;\n          version = library->version();\n          version_min = library->version_min();\n          sb.AppendFormat(\"      Version: {}.{}.{}.{}\\n\", version.major,\n                          version.minor, version.build, version.qfe);\n          sb.AppendFormat(\"      Min Version: {}.{}.{}.{}\\n\", version_min.major,\n                          version_min.minor, version_min.build,\n                          version_min.qfe);\n\n          library_offset += library->size;\n        }\n      } break;\n      case XEX_HEADER_CHECKSUM_TIMESTAMP: {\n        sb.Append(\"  XEX_HEADER_CHECKSUM_TIMESTAMP (TODO):\\n\");\n      } break;\n      case XEX_HEADER_ORIGINAL_PE_NAME: {\n        auto opt_pe_name =\n            reinterpret_cast<const xex2_opt_original_pe_name*>(opt_header_ptr);\n        sb.AppendFormat(\"  XEX_HEADER_ORIGINAL_PE_NAME: {}\\n\",\n                        opt_pe_name->name);\n      } break;\n      case XEX_HEADER_STATIC_LIBRARIES: {\n        sb.Append(\"  XEX_HEADER_STATIC_LIBRARIES:\\n\");\n        auto opt_static_libraries =\n            reinterpret_cast<const xex2_opt_static_libraries*>(opt_header_ptr);\n\n        uint32_t count = (opt_static_libraries->size - 4) / 0x10;\n        for (uint32_t l = 0; l < count; l++) {\n          auto& library = opt_static_libraries->libraries[l];\n          sb.AppendFormat(\"    {:<8} : {}.{}.{}.{}\\n\", library.name,\n                          static_cast<uint16_t>(library.version_major),\n                          static_cast<uint16_t>(library.version_minor),\n                          static_cast<uint16_t>(library.version_build),\n                          static_cast<uint16_t>(library.version_qfe));\n        }\n      } break;\n      case XEX_HEADER_TLS_INFO: {\n        sb.Append(\"  XEX_HEADER_TLS_INFO:\\n\");\n        auto opt_tls_info =\n            reinterpret_cast<const xex2_opt_tls_info*>(opt_header_ptr);\n\n        sb.AppendFormat(\"          Slot Count: {}\\n\",\n                        static_cast<uint32_t>(opt_tls_info->slot_count));\n        sb.AppendFormat(\"    Raw Data Address: {:08X}\\n\",\n                        static_cast<uint32_t>(opt_tls_info->raw_data_address));\n        sb.AppendFormat(\"           Data Size: {}\\n\",\n                        static_cast<uint32_t>(opt_tls_info->data_size));\n        sb.AppendFormat(\"       Raw Data Size: {}\\n\",\n                        static_cast<uint32_t>(opt_tls_info->raw_data_size));\n      } break;\n      case XEX_HEADER_DEFAULT_STACK_SIZE: {\n        sb.AppendFormat(\"  XEX_HEADER_DEFAULT_STACK_SIZE: {}\\n\",\n                        static_cast<uint32_t>(opt_header.value));\n      } break;\n      case XEX_HEADER_DEFAULT_FILESYSTEM_CACHE_SIZE: {\n        sb.AppendFormat(\"  XEX_HEADER_DEFAULT_FILESYSTEM_CACHE_SIZE: {}\\n\",\n                        static_cast<uint32_t>(opt_header.value));\n      } break;\n      case XEX_HEADER_DEFAULT_HEAP_SIZE: {\n        sb.AppendFormat(\"  XEX_HEADER_DEFAULT_HEAP_SIZE: {}\\n\",\n                        static_cast<uint32_t>(opt_header.value));\n      } break;\n      case XEX_HEADER_PAGE_HEAP_SIZE_AND_FLAGS: {\n        sb.Append(\"  XEX_HEADER_PAGE_HEAP_SIZE_AND_FLAGS (TODO):\\n\");\n      } break;\n      case XEX_HEADER_SYSTEM_FLAGS: {\n        sb.AppendFormat(\"  XEX_HEADER_SYSTEM_FLAGS: {:08X}\\n\",\n                        static_cast<uint32_t>(opt_header.value));\n      } break;\n      case XEX_HEADER_EXECUTION_INFO: {\n        sb.Append(\"  XEX_HEADER_EXECUTION_INFO:\\n\");\n        auto opt_exec_info =\n            reinterpret_cast<const xex2_opt_execution_info*>(opt_header_ptr);\n\n        sb.AppendFormat(\"       Media ID: {:08X}\\n\",\n                        static_cast<uint32_t>(opt_exec_info->media_id));\n        sb.AppendFormat(\"       Title ID: {:08X}\\n\",\n                        static_cast<uint32_t>(opt_exec_info->title_id));\n        sb.AppendFormat(\"    Savegame ID: {:08X}\\n\",\n                        static_cast<uint32_t>(opt_exec_info->title_id));\n        sb.AppendFormat(\"    Disc Number / Total: {} / {}\\n\",\n                        opt_exec_info->disc_number, opt_exec_info->disc_count);\n      } break;\n      case XEX_HEADER_TITLE_WORKSPACE_SIZE: {\n        sb.AppendFormat(\"  XEX_HEADER_TITLE_WORKSPACE_SIZE: {}\\n\",\n                        uint32_t(opt_header.value));\n      } break;\n      case XEX_HEADER_GAME_RATINGS: {\n        sb.Append(\"  XEX_HEADER_GAME_RATINGS (TODO):\\n\");\n      } break;\n      case XEX_HEADER_LAN_KEY: {\n        sb.Append(\"  XEX_HEADER_LAN_KEY:\");\n        auto opt_lan_key =\n            reinterpret_cast<const xex2_opt_lan_key*>(opt_header_ptr);\n\n        for (int l = 0; l < 16; l++) {\n          sb.AppendFormat(\" {:02X}\", opt_lan_key->key[l]);\n        }\n        sb.Append(\"\\n\");\n      } break;\n      case XEX_HEADER_XBOX360_LOGO: {\n        sb.Append(\"  XEX_HEADER_XBOX360_LOGO (TODO):\\n\");\n      } break;\n      case XEX_HEADER_MULTIDISC_MEDIA_IDS: {\n        sb.Append(\"  XEX_HEADER_MULTIDISC_MEDIA_IDS (TODO):\\n\");\n      } break;\n      case XEX_HEADER_ALTERNATE_TITLE_IDS: {\n        sb.Append(\"  XEX_HEADER_ALTERNATE_TITLE_IDS (TODO):\\n\");\n      } break;\n      case XEX_HEADER_ADDITIONAL_TITLE_MEMORY: {\n        sb.AppendFormat(\"  XEX_HEADER_ADDITIONAL_TITLE_MEMORY: {}\\n\",\n                        uint32_t(opt_header.value));\n      } break;\n      case XEX_HEADER_EXPORTS_BY_NAME: {\n        sb.Append(\"  XEX_HEADER_EXPORTS_BY_NAME:\\n\");\n        auto dir =\n            reinterpret_cast<const xex2_opt_data_directory*>(opt_header_ptr);\n\n        auto exe_address = xex_module()->base_address();\n        auto e = memory()->TranslateVirtual<const X_IMAGE_EXPORT_DIRECTORY*>(\n            exe_address + dir->offset);\n        auto e_base = reinterpret_cast<uintptr_t>(e);\n\n        // e->AddressOfX RVAs are relative to the IMAGE_EXPORT_DIRECTORY!\n        auto function_table =\n            reinterpret_cast<const uint32_t*>(e_base + e->AddressOfFunctions);\n        // Names relative to directory.\n        auto name_table =\n            reinterpret_cast<const uint32_t*>(e_base + e->AddressOfNames);\n        // Table of ordinals (by name).\n        auto ordinal_table = reinterpret_cast<const uint16_t*>(\n            e_base + e->AddressOfNameOrdinals);\n        for (uint32_t n = 0; n < e->NumberOfNames; n++) {\n          auto name = reinterpret_cast<const char*>(e_base + name_table[n]);\n          uint16_t ordinal = ordinal_table[n];\n          uint32_t addr = exe_address + function_table[ordinal];\n          sb.AppendFormat(\"    {:<28} - {:03X} - {:08X}\\n\", name, ordinal,\n                          addr);\n        }\n      } break;\n      default: {\n        sb.AppendFormat(\"  Unknown Header {:08X}\\n\", (uint32_t)opt_header.key);\n      } break;\n    }\n  }\n\n  sb.Append(\"Sections:\\n\");\n  for (uint32_t i = 0, page = 0; i < security_info->page_descriptor_count;\n       i++) {\n    // Manually byteswap the bitfield data.\n    xex2_page_descriptor page_descriptor;\n    page_descriptor.value =\n        xe::byte_swap(security_info->page_descriptors[i].value);\n\n    const char* type = \"UNKNOWN\";\n    switch (page_descriptor.info) {\n      case XEX_SECTION_CODE:\n        type = \"CODE   \";\n        break;\n      case XEX_SECTION_DATA:\n        type = \"RWDATA \";\n        break;\n      case XEX_SECTION_READONLY_DATA:\n        type = \"RODATA \";\n        break;\n    }\n\n    const uint32_t page_size =\n        xex_module()->base_address() < 0x90000000 ? 64 * 1024 : 4 * 1024;\n    uint32_t start_address = xex_module()->base_address() + (page * page_size);\n    uint32_t end_address =\n        start_address + (page_descriptor.page_count * page_size);\n\n    sb.AppendFormat(\"  {:3} {} {:3} pages    {:08X} - {:08X} ({} bytes)\\n\",\n                    page, type, page_descriptor.page_count, start_address,\n                    end_address, page_descriptor.page_count * page_size);\n    page += page_descriptor.page_count;\n  }\n\n  // Print out imports.\n\n  auto import_libs = xex_module()->import_libraries();\n\n  sb.Append(\"Imports:\\n\");\n  for (std::vector<cpu::XexModule::ImportLibrary>::const_iterator library =\n           import_libs->begin();\n       library != import_libs->end(); ++library) {\n    if (library->imports.size() > 0) {\n      sb.AppendFormat(\" {} - {} imports\\n\", library->name,\n                      library->imports.size());\n      sb.AppendFormat(\"   Version: {}.{}.{}.{}\\n\", library->version.major,\n                      library->version.minor, library->version.build,\n                      library->version.qfe);\n      sb.AppendFormat(\"   Min Version: {}.{}.{}.{}\\n\",\n                      library->min_version.major, library->min_version.minor,\n                      library->min_version.build, library->min_version.qfe);\n      sb.Append(\"\\n\");\n\n      // Counts.\n      int known_count = 0;\n      int unknown_count = 0;\n      int impl_count = 0;\n      int unimpl_count = 0;\n\n      for (std::vector<cpu::XexModule::ImportLibraryFn>::const_iterator info =\n               library->imports.begin();\n           info != library->imports.end(); ++info) {\n        if (kernel_state_->IsKernelModule(library->name)) {\n          auto kernel_export =\n              export_resolver->GetExportByOrdinal(library->name, info->ordinal);\n          if (kernel_export) {\n            known_count++;\n            if (kernel_export->is_implemented()) {\n              impl_count++;\n            } else {\n              unimpl_count++;\n            }\n          } else {\n            unknown_count++;\n            unimpl_count++;\n          }\n        } else {\n          auto module = kernel_state_->GetModule(library->name);\n          if (module) {\n            uint32_t export_addr =\n                module->GetProcAddressByOrdinal(info->ordinal);\n            if (export_addr) {\n              impl_count++;\n              known_count++;\n            } else {\n              unimpl_count++;\n              unknown_count++;\n            }\n          } else {\n            unimpl_count++;\n            unknown_count++;\n          }\n        }\n      }\n      float total_count = static_cast<float>(library->imports.size()) / 100.0f;\n      sb.AppendFormat(\"         Total: {:4}\\n\", library->imports.size());\n      sb.AppendFormat(\"         Known:  {:3}% ({} known, {} unknown)\\n\",\n                      static_cast<int>(known_count / total_count), known_count,\n                      unknown_count);\n      sb.AppendFormat(\n          \"   Implemented:  {:3}% ({} implemented, {} unimplemented)\\n\",\n          static_cast<int>(impl_count / total_count), impl_count, unimpl_count);\n      sb.AppendFormat(\"\\n\");\n\n      // Listing.\n      for (std::vector<cpu::XexModule::ImportLibraryFn>::const_iterator info =\n               library->imports.begin();\n           info != library->imports.end(); ++info) {\n        const char* name = \"UNKNOWN\";\n        bool implemented = false;\n\n        cpu::Export* kernel_export = nullptr;\n        if (kernel_state_->IsKernelModule(library->name)) {\n          kernel_export =\n              export_resolver->GetExportByOrdinal(library->name, info->ordinal);\n          if (kernel_export) {\n            name = kernel_export->name;\n            implemented = kernel_export->is_implemented();\n          }\n        } else {\n          auto module = kernel_state_->GetModule(library->name);\n          if (module && module->GetProcAddressByOrdinal(info->ordinal)) {\n            // TODO(benvanik): name lookup.\n            implemented = true;\n          }\n        }\n        if (kernel_export &&\n            kernel_export->type == cpu::Export::Type::kVariable) {\n          sb.AppendFormat(\"   V {:08X}          {:03X} ({:4}) {} {}\\n\",\n                          info->value_address, info->ordinal, info->ordinal,\n                          implemented ? \"  \" : \"!!\", name);\n        } else if (info->thunk_address) {\n          sb.AppendFormat(\"   F {:08X} {:08X} {:03X} ({:4}) {} {}\\n\",\n                          info->value_address, info->thunk_address,\n                          info->ordinal, info->ordinal,\n                          implemented ? \"  \" : \"!!\", name);\n        }\n      }\n    }\n\n    sb.Append(\"\\n\");\n  }\n\n  xe::logging::AppendLogLine(xe::LogLevel::Info, 'i', sb.to_string_view());\n}\n\n}  // namespace kernel\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/kernel/user_module.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_KERNEL_USER_MODULE_H_\n#define XENIA_KERNEL_USER_MODULE_H_\n\n#include <string>\n\n#include \"xenia/cpu/export_resolver.h\"\n#include \"xenia/cpu/xex_module.h\"\n#include \"xenia/kernel/util/xex2_info.h\"\n#include \"xenia/kernel/xmodule.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace cpu {\nclass XexModule;\nclass ElfModule;\n}  // namespace cpu\nnamespace kernel {\nclass XThread;\n}  // namespace kernel\n}  // namespace xe\n\nnamespace xe {\nnamespace kernel {\n\nclass UserModule : public XModule {\n public:\n  UserModule(KernelState* kernel_state);\n  ~UserModule() override;\n\n  const std::string& path() const override { return path_; }\n  const std::string& name() const override { return name_; }\n\n  enum ModuleFormat {\n    kModuleFormatUndefined = 0,\n    kModuleFormatXex,\n    kModuleFormatElf,\n  };\n\n  const xe::cpu::XexModule* xex_module() const {\n    assert_true(module_format_ == kModuleFormatXex);\n    return reinterpret_cast<xe::cpu::XexModule*>(processor_module_);\n  }\n  xe::cpu::XexModule* xex_module() {\n    assert_true(module_format_ == kModuleFormatXex);\n    return reinterpret_cast<xe::cpu::XexModule*>(processor_module_);\n  }\n\n  const xex2_header* xex_header() const { return xex_module()->xex_header(); }\n  uint32_t guest_xex_header() const { return guest_xex_header_; }\n  // The title ID in the xex header or 0 if this is not a xex.\n  uint32_t title_id() const;\n  bool is_executable() const { return processor_module_->is_executable(); }\n  bool is_dll_module() const { return is_dll_module_; }\n\n  uint32_t entry_point() const { return entry_point_; }\n  uint32_t stack_size() const { return stack_size_; }\n\n  X_STATUS LoadFromFile(const std::string_view path);\n  X_STATUS LoadFromMemory(const void* addr, const size_t length);\n  X_STATUS Unload();\n\n  uint32_t GetProcAddressByOrdinal(uint16_t ordinal) override;\n  uint32_t GetProcAddressByName(const std::string_view name) override;\n  X_STATUS GetSection(const std::string_view name, uint32_t* out_section_data,\n                      uint32_t* out_section_size) override;\n\n  // Get optional header - FOR HOST USE ONLY!\n  X_STATUS GetOptHeader(xex2_header_keys key, void** out_ptr);\n\n  // Get optional header - FOR HOST USE ONLY!\n  template <typename T>\n  X_STATUS GetOptHeader(xex2_header_keys key, T* out_ptr) {\n    return GetOptHeader(key, reinterpret_cast<void**>(out_ptr));\n  }\n\n  // Get optional header that can safely be returned to guest code.\n  X_STATUS GetOptHeader(xex2_header_keys key, uint32_t* out_header_guest_ptr);\n  static X_STATUS GetOptHeader(const Memory* memory, const xex2_header* header,\n                               xex2_header_keys key,\n                               uint32_t* out_header_guest_ptr);\n\n  void Dump();\n\n  bool Save(ByteStream* stream) override;\n  static object_ref<UserModule> Restore(KernelState* kernel_state,\n                                        ByteStream* stream,\n                                        const std::string_view path);\n\n private:\n  X_STATUS LoadXexContinue();\n\n  std::string name_;\n  std::string path_;\n\n  uint32_t guest_xex_header_ = 0;\n  ModuleFormat module_format_ = kModuleFormatUndefined;\n\n  bool is_dll_module_ = false;\n  uint32_t entry_point_ = 0;\n  uint32_t stack_size_ = 0;\n};\n\n}  // namespace kernel\n}  // namespace xe\n\n#endif  // XENIA_KERNEL_USER_MODULE_H_\n"
  },
  {
    "path": "src/xenia/kernel/util/export_table_post.inc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n// Post-include file for an export table.\n\n#undef FLAG\n#undef XE_EXPORT\n"
  },
  {
    "path": "src/xenia/kernel/util/export_table_pre.inc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n/**\n * Pre-include file for an export table.\n * Use this to build tables of exports:\n *\n * // Build the export table used for resolution.\n * #include \"xenia/kernel/util/export_table_pre.inc\"\n * static Export my_module_export_table[] = {\n *   #include \"xenia/kernel/my_module/my_module_table.inc\"\n * };\n * #include \"xenia/kernel/util/export_table_post.inc\"\n * export_resolver_->RegisterTable(\n *     \"my_module.xex\",\n *     my_module_export_table, xe::countof(my_module_export_table));\n */\n\n#define XE_EXPORT(module, ordinal, name, type) \\\n  xe::cpu::Export(ordinal, xe::cpu::Export::Type::type, #name)\n\n#define FLAG(t) kXEKernelExportFlag##t\n"
  },
  {
    "path": "src/xenia/kernel/util/gameinfo_utils.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2016 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/kernel/util/gameinfo_utils.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace util {\n\nconstexpr fourcc_t kGameInfoExecSignature = make_fourcc(\"EXEC\");\nconstexpr fourcc_t kGameInfoCommSignature = make_fourcc(\"COMM\");\nconstexpr fourcc_t kGameInfoTitlSignature = make_fourcc(\"TITL\");\n\nGameInfoWrapper::GameInfoWrapper(const uint8_t* data, size_t data_size)\n    : data_(data), data_size_(data_size) {\n  if (!data) {\n    return;\n  }\n\n  const GameInfoBlockHeader* block_header(nullptr);\n  size_t data_offset(0);\n  while (data_offset < data_size_) {\n    block_header =\n        reinterpret_cast<const GameInfoBlockHeader*>(data_ + data_offset);\n    data_offset += sizeof(GameInfoBlockHeader);\n\n    switch (block_header->magic) {\n      case kGameInfoExecSignature:\n        exec_.virtual_titleid =\n            reinterpret_cast<const char*>(data_ + data_offset);\n        data_offset += exec_.VirtualTitleIdLength + 1;\n        exec_.module_name = reinterpret_cast<const char*>(data_ + data_offset);\n        data_offset += exec_.ModuleNameLength + 1;\n        exec_.build_description =\n            reinterpret_cast<const char*>(data_ + data_offset);\n        data_offset += exec_.BuildDescriptionLength + 1;\n        break;\n      case kGameInfoCommSignature:\n        assert_true(block_header->block_size == sizeof(GameInfoBlockComm));\n        comm_ = reinterpret_cast<const GameInfoBlockComm*>(data_ + data_offset);\n        data_offset += block_header->block_size;\n        break;\n      case kGameInfoTitlSignature:\n        assert_true(block_header->block_size == sizeof(GameInfoBlockTitl));\n        titl_ = reinterpret_cast<const GameInfoBlockTitl*>(data_ + data_offset);\n        data_offset += block_header->block_size;\n        break;\n      default:\n        // Unsupported headers\n        data_ = nullptr;\n        return;\n    }\n  }\n\n  if ((comm_ == nullptr) || (titl_ == nullptr) ||\n      (exec_.virtual_titleid == nullptr)) {\n    data_ = nullptr;\n  }\n}\n\nuint32_t GameInfo::title_id() const { return comm_->title_id; }\n\nstd::string GameInfo::virtual_title_id() const {\n  size_t virtual_titleid_length(std::strlen(exec_.virtual_titleid));\n  return std::string(exec_.virtual_titleid,\n                     exec_.virtual_titleid + virtual_titleid_length);\n}\n\nstd::string GameInfo::module_name() const {\n  size_t module_name_length(std::strlen(exec_.module_name));\n  return std::string(exec_.module_name, exec_.module_name + module_name_length);\n}\n\n}  // namespace util\n}  // namespace kernel\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/kernel/util/gameinfo_utils.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_KERNEL_UTIL_GAMEINFO_UTILS_H_\n#define XENIA_KERNEL_UTIL_GAMEINFO_UTILS_H_\n\n#include <string>\n#include <vector>\n\n#include \"xenia/base/memory.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace util {\n\nclass GameInfoWrapper {\n public:\n  GameInfoWrapper(const uint8_t* data, size_t data_size);\n\n  bool is_valid() const { return data_ != nullptr; }\n\n protected:\n  struct GameInfoBlockHeader {\n    xe::be<uint32_t> magic;\n    xe::be<uint32_t> block_size;\n  };\n  static_assert_size(GameInfoBlockHeader, 8);\n\n  struct GameInfoBlockExec {\n    const char* virtual_titleid;\n    const char* module_name;\n    const char* build_description;\n\n    const uint32_t VirtualTitleIdLength = 32;\n    const uint32_t ModuleNameLength = 42;\n    const uint32_t BuildDescriptionLength = 64;\n  };\n\n  struct GameInfoBlockComm {\n    xe::be<uint32_t> title_id;\n  };\n  static_assert_size(GameInfoBlockComm, 4);\n\n  struct GameInfoBlockTitl {\n    xe::be<char16_t> title[128];\n    xe::be<char16_t> description[256];\n    xe::be<char16_t> publisher[256];  // assumed field name from wxPirs\n  };\n\n private:\n  const uint8_t* data_ = nullptr;\n  size_t data_size_ = 0;\n\n protected:\n  GameInfoBlockExec exec_;\n  const GameInfoBlockComm* comm_ = nullptr;\n  const GameInfoBlockTitl* titl_ = nullptr;\n};\n\nclass GameInfo : public GameInfoWrapper {\n public:\n  GameInfo(const std::vector<uint8_t>& data)\n      : GameInfoWrapper(reinterpret_cast<const uint8_t*>(data.data()),\n                        data.size()) {}\n\n  uint32_t title_id() const;\n  std::string virtual_title_id() const;\n  std::string module_name() const;\n};\n\n}  // namespace util\n}  // namespace kernel\n}  // namespace xe\n\n#endif  // XENIA_KERNEL_UTIL_GAMEINFO_UTILS_H_\n"
  },
  {
    "path": "src/xenia/kernel/util/native_list.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/kernel/util/native_list.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace util {\n\nNativeList::NativeList() = default;\n\nNativeList::NativeList(Memory* memory)\n    : memory_(memory), head_(kInvalidPointer) {}\n\nvoid NativeList::Insert(uint32_t ptr) {\n  xe::store_and_swap<uint32_t>(memory_->TranslateVirtual(ptr + 0), head_);\n  xe::store_and_swap<uint32_t>(memory_->TranslateVirtual(ptr + 4), 0);\n  if (head_) {\n    xe::store_and_swap<uint32_t>(memory_->TranslateVirtual(head_ + 4), ptr);\n  }\n  head_ = ptr;\n}\n\nbool NativeList::IsQueued(uint32_t ptr) {\n  uint32_t flink =\n      xe::load_and_swap<uint32_t>(memory_->TranslateVirtual(ptr + 0));\n  uint32_t blink =\n      xe::load_and_swap<uint32_t>(memory_->TranslateVirtual(ptr + 4));\n  return head_ == ptr || flink || blink;\n}\n\nvoid NativeList::Remove(uint32_t ptr) {\n  uint32_t flink =\n      xe::load_and_swap<uint32_t>(memory_->TranslateVirtual(ptr + 0));\n  uint32_t blink =\n      xe::load_and_swap<uint32_t>(memory_->TranslateVirtual(ptr + 4));\n  if (ptr == head_) {\n    head_ = flink;\n    if (flink) {\n      xe::store_and_swap<uint32_t>(memory_->TranslateVirtual(flink + 4), 0);\n    }\n  } else {\n    if (blink) {\n      xe::store_and_swap<uint32_t>(memory_->TranslateVirtual(blink + 0), flink);\n    }\n    if (flink) {\n      xe::store_and_swap<uint32_t>(memory_->TranslateVirtual(flink + 4), blink);\n    }\n  }\n  xe::store_and_swap<uint32_t>(memory_->TranslateVirtual(ptr + 0), 0);\n  xe::store_and_swap<uint32_t>(memory_->TranslateVirtual(ptr + 4), 0);\n}\n\nuint32_t NativeList::Shift() {\n  if (!head_) {\n    return 0;\n  }\n\n  uint32_t ptr = head_;\n  Remove(ptr);\n  return ptr;\n}\n\nbool NativeList::HasPending() { return head_ != kInvalidPointer; }\n\n}  // namespace util\n}  // namespace kernel\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/kernel/util/native_list.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_KERNEL_UTIL_NATIVE_LIST_H_\n#define XENIA_KERNEL_UTIL_NATIVE_LIST_H_\n\n#include \"xenia/memory.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace util {\n\n// List is designed for storing pointers to objects in the guest heap.\n// All values in the list should be assumed to be in big endian.\n\n// Pass LIST_ENTRY pointers.\n// struct MYOBJ {\n//   uint32_t stuff;\n//   LIST_ENTRY list_entry; <-- pass this\n//   ...\n// }\n\nclass NativeList {\n public:\n  NativeList();\n  explicit NativeList(Memory* memory);\n\n  void Insert(uint32_t list_entry_ptr);\n  bool IsQueued(uint32_t list_entry_ptr);\n  void Remove(uint32_t list_entry_ptr);\n  uint32_t Shift();\n  bool HasPending();\n\n  uint32_t head() const { return head_; }\n  void set_head(uint32_t head) { head_ = head; }\n\n  void set_memory(Memory* mem) { memory_ = mem; }\n\n private:\n  const uint32_t kInvalidPointer = 0xE0FE0FFF;\n\n private:\n  Memory* memory_ = nullptr;\n  uint32_t head_;\n};\n\n}  // namespace util\n}  // namespace kernel\n}  // namespace xe\n\n#endif  // XENIA_KERNEL_UTIL_NATIVE_LIST_H_\n"
  },
  {
    "path": "src/xenia/kernel/util/object_table.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/kernel/util/object_table.h\"\n\n#include <algorithm>\n#include <cstring>\n\n#include \"xenia/base/byte_stream.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/kernel/xobject.h\"\n#include \"xenia/kernel/xthread.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace util {\n\nObjectTable::ObjectTable() {}\n\nObjectTable::~ObjectTable() { Reset(); }\n\nvoid ObjectTable::Reset() {\n  auto global_lock = global_critical_region_.Acquire();\n\n  // Release all objects.\n  for (uint32_t n = 0; n < table_capacity_; n++) {\n    ObjectTableEntry& entry = table_[n];\n    if (entry.object) {\n      entry.object->Release();\n    }\n  }\n\n  table_capacity_ = 0;\n  last_free_entry_ = 0;\n  free(table_);\n  table_ = nullptr;\n}\n\nX_STATUS ObjectTable::FindFreeSlot(uint32_t* out_slot) {\n  // Find a free slot.\n  uint32_t slot = last_free_entry_;\n  uint32_t scan_count = 0;\n  while (scan_count < table_capacity_) {\n    ObjectTableEntry& entry = table_[slot];\n    if (!entry.object) {\n      *out_slot = slot;\n      return X_STATUS_SUCCESS;\n    }\n    scan_count++;\n    slot = (slot + 1) % table_capacity_;\n    if (slot == 0) {\n      // Never allow 0 handles.\n      scan_count++;\n      slot++;\n    }\n  }\n\n  // Table out of slots, expand.\n  uint32_t new_table_capacity = std::max(16 * 1024u, table_capacity_ * 2);\n  if (!Resize(new_table_capacity)) {\n    return X_STATUS_NO_MEMORY;\n  }\n\n  // Never allow 0 handles.\n  slot = ++last_free_entry_;\n  *out_slot = slot;\n\n  return X_STATUS_SUCCESS;\n}\n\nbool ObjectTable::Resize(uint32_t new_capacity) {\n  uint32_t new_size = new_capacity * sizeof(ObjectTableEntry);\n  uint32_t old_size = table_capacity_ * sizeof(ObjectTableEntry);\n  auto new_table =\n      reinterpret_cast<ObjectTableEntry*>(realloc(table_, new_size));\n  if (!new_table) {\n    return false;\n  }\n\n  // Zero out new entries.\n  if (new_size > old_size) {\n    std::memset(reinterpret_cast<uint8_t*>(new_table) + old_size, 0,\n                new_size - old_size);\n  }\n\n  last_free_entry_ = table_capacity_;\n  table_capacity_ = new_capacity;\n  table_ = new_table;\n\n  return true;\n}\n\nX_STATUS ObjectTable::AddHandle(XObject* object, X_HANDLE* out_handle) {\n  X_STATUS result = X_STATUS_SUCCESS;\n\n  uint32_t handle = 0;\n  {\n    auto global_lock = global_critical_region_.Acquire();\n\n    // Find a free slot.\n    uint32_t slot = 0;\n    result = FindFreeSlot(&slot);\n\n    // Stash.\n    if (XSUCCEEDED(result)) {\n      ObjectTableEntry& entry = table_[slot];\n      entry.object = object;\n      entry.handle_ref_count = 1;\n      handle = XObject::kHandleBase + (slot << 2);\n      object->handles().push_back(handle);\n\n      // Retain so long as the object is in the table.\n      object->Retain();\n\n      XELOGI(\"Added handle:{:08X} for {}\", handle, typeid(*object).name());\n    }\n  }\n\n  if (XSUCCEEDED(result)) {\n    if (out_handle) {\n      *out_handle = handle;\n    }\n  }\n\n  return result;\n}\n\nX_STATUS ObjectTable::DuplicateHandle(X_HANDLE handle, X_HANDLE* out_handle) {\n  X_STATUS result = X_STATUS_SUCCESS;\n  handle = TranslateHandle(handle);\n\n  XObject* object = LookupObject(handle, false);\n  if (object) {\n    result = AddHandle(object, out_handle);\n    object->Release();  // Release the ref that LookupObject took\n  } else {\n    result = X_STATUS_INVALID_HANDLE;\n  }\n\n  return result;\n}\n\nX_STATUS ObjectTable::RetainHandle(X_HANDLE handle) {\n  auto global_lock = global_critical_region_.Acquire();\n\n  ObjectTableEntry* entry = LookupTable(handle);\n  if (!entry) {\n    return X_STATUS_INVALID_HANDLE;\n  }\n\n  entry->handle_ref_count++;\n  return X_STATUS_SUCCESS;\n}\n\nX_STATUS ObjectTable::ReleaseHandle(X_HANDLE handle) {\n  auto global_lock = global_critical_region_.Acquire();\n\n  ObjectTableEntry* entry = LookupTable(handle);\n  if (!entry) {\n    return X_STATUS_INVALID_HANDLE;\n  }\n\n  if (--entry->handle_ref_count == 0) {\n    // No more references. Remove it from the table.\n    return RemoveHandle(handle);\n  }\n\n  // FIXME: Return a status code telling the caller it wasn't released\n  // (but not a failure code)\n  return X_STATUS_SUCCESS;\n}\n\nX_STATUS ObjectTable::RemoveHandle(X_HANDLE handle) {\n  X_STATUS result = X_STATUS_SUCCESS;\n\n  handle = TranslateHandle(handle);\n  if (!handle) {\n    return X_STATUS_INVALID_HANDLE;\n  }\n\n  ObjectTableEntry* entry = LookupTable(handle);\n  if (!entry) {\n    return X_STATUS_INVALID_HANDLE;\n  }\n\n  auto global_lock = global_critical_region_.Acquire();\n  if (entry->object) {\n    auto object = entry->object;\n    entry->object = nullptr;\n    assert_zero(entry->handle_ref_count);\n    entry->handle_ref_count = 0;\n\n    // Walk the object's handles and remove this one.\n    auto handle_entry =\n        std::find(object->handles().begin(), object->handles().end(), handle);\n    if (handle_entry != object->handles().end()) {\n      object->handles().erase(handle_entry);\n    }\n\n    XELOGI(\"Removed handle:{:08X} for {}\", handle, typeid(*object).name());\n\n    // Remove object name from mapping to prevent naming collision.\n    if (!object->name().empty()) {\n      RemoveNameMapping(object->name());\n    }\n    // Release now that the object has been removed from the table.\n    object->Release();\n  }\n\n  return X_STATUS_SUCCESS;\n}\n\nstd::vector<object_ref<XObject>> ObjectTable::GetAllObjects() {\n  auto lock = global_critical_region_.Acquire();\n  std::vector<object_ref<XObject>> results;\n\n  for (uint32_t slot = 0; slot < table_capacity_; slot++) {\n    auto& entry = table_[slot];\n    if (entry.object && std::find(results.begin(), results.end(),\n                                  entry.object) == results.end()) {\n      entry.object->Retain();\n      results.push_back(object_ref<XObject>(entry.object));\n    }\n  }\n\n  return results;\n}\n\nvoid ObjectTable::PurgeAllObjects() {\n  auto lock = global_critical_region_.Acquire();\n  for (uint32_t slot = 0; slot < table_capacity_; slot++) {\n    auto& entry = table_[slot];\n    if (entry.object && !entry.object->is_host_object()) {\n      entry.handle_ref_count = 0;\n      entry.object->Release();\n\n      entry.object = nullptr;\n    }\n  }\n}\n\nObjectTable::ObjectTableEntry* ObjectTable::LookupTable(X_HANDLE handle) {\n  handle = TranslateHandle(handle);\n  if (!handle) {\n    return nullptr;\n  }\n\n  auto global_lock = global_critical_region_.Acquire();\n\n  // Lower 2 bits are ignored.\n  uint32_t slot = GetHandleSlot(handle);\n  if (slot <= table_capacity_) {\n    return &table_[slot];\n  }\n\n  return nullptr;\n}\n\n// Generic lookup\ntemplate <>\nobject_ref<XObject> ObjectTable::LookupObject<XObject>(X_HANDLE handle) {\n  auto object = ObjectTable::LookupObject(handle, false);\n  auto result = object_ref<XObject>(reinterpret_cast<XObject*>(object));\n  return result;\n}\n\nXObject* ObjectTable::LookupObject(X_HANDLE handle, bool already_locked) {\n  handle = TranslateHandle(handle);\n  if (!handle) {\n    return nullptr;\n  }\n\n  XObject* object = nullptr;\n  if (!already_locked) {\n    global_critical_region_.mutex().lock();\n  }\n\n  // Lower 2 bits are ignored.\n  uint32_t slot = GetHandleSlot(handle);\n\n  // Verify slot.\n  if (slot < table_capacity_) {\n    ObjectTableEntry& entry = table_[slot];\n    if (entry.object) {\n      object = entry.object;\n    }\n  }\n\n  // Retain the object pointer.\n  if (object) {\n    object->Retain();\n  }\n\n  if (!already_locked) {\n    global_critical_region_.mutex().unlock();\n  }\n\n  return object;\n}\n\nvoid ObjectTable::GetObjectsByType(XObject::Type type,\n                                   std::vector<object_ref<XObject>>* results) {\n  auto global_lock = global_critical_region_.Acquire();\n  for (uint32_t slot = 0; slot < table_capacity_; ++slot) {\n    auto& entry = table_[slot];\n    if (entry.object) {\n      if (entry.object->type() == type) {\n        entry.object->Retain();\n        results->push_back(object_ref<XObject>(entry.object));\n      }\n    }\n  }\n}\n\nX_HANDLE ObjectTable::TranslateHandle(X_HANDLE handle) {\n  if (handle == 0xFFFFFFFF) {\n    // CurrentProcess\n    // assert_always();\n    return 0;\n  } else if (handle == 0xFFFFFFFE) {\n    // CurrentThread\n    return XThread::GetCurrentThreadHandle();\n  } else {\n    return handle;\n  }\n}\n\nX_STATUS ObjectTable::AddNameMapping(const std::string_view name,\n                                     X_HANDLE handle) {\n  auto global_lock = global_critical_region_.Acquire();\n  if (name_table_.count(string_key_case(name))) {\n    return X_STATUS_OBJECT_NAME_COLLISION;\n  }\n  name_table_.insert({string_key_case::create(name), handle});\n  return X_STATUS_SUCCESS;\n}\n\nvoid ObjectTable::RemoveNameMapping(const std::string_view name) {\n  // Names are case-insensitive.\n  auto global_lock = global_critical_region_.Acquire();\n  auto it = name_table_.find(string_key_case(name));\n  if (it != name_table_.end()) {\n    name_table_.erase(it);\n  }\n}\n\nX_STATUS ObjectTable::GetObjectByName(const std::string_view name,\n                                      X_HANDLE* out_handle) {\n  // Names are case-insensitive.\n  auto global_lock = global_critical_region_.Acquire();\n  auto it = name_table_.find(string_key_case(name));\n  if (it == name_table_.end()) {\n    *out_handle = X_INVALID_HANDLE_VALUE;\n    return X_STATUS_OBJECT_NAME_NOT_FOUND;\n  }\n  *out_handle = it->second;\n\n  // We need to ref the handle. I think.\n  auto obj = LookupObject(it->second, true);\n  if (obj) {\n    obj->RetainHandle();\n    obj->Release();\n  }\n\n  return X_STATUS_SUCCESS;\n}\n\nbool ObjectTable::Save(ByteStream* stream) {\n  stream->Write<uint32_t>(table_capacity_);\n  for (uint32_t i = 0; i < table_capacity_; i++) {\n    auto& entry = table_[i];\n    stream->Write<int32_t>(entry.handle_ref_count);\n  }\n\n  return true;\n}\n\nbool ObjectTable::Restore(ByteStream* stream) {\n  Resize(stream->Read<uint32_t>());\n  for (uint32_t i = 0; i < table_capacity_; i++) {\n    auto& entry = table_[i];\n    // entry.object = nullptr;\n    entry.handle_ref_count = stream->Read<int32_t>();\n  }\n\n  return true;\n}\n\nX_STATUS ObjectTable::RestoreHandle(X_HANDLE handle, XObject* object) {\n  uint32_t slot = GetHandleSlot(handle);\n  assert_true(table_capacity_ >= slot);\n\n  if (table_capacity_ >= slot) {\n    auto& entry = table_[slot];\n    entry.object = object;\n    object->Retain();\n  }\n\n  return X_STATUS_SUCCESS;\n}\n\n}  // namespace util\n}  // namespace kernel\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/kernel/util/object_table.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_KERNEL_UTIL_OBJECT_TABLE_H_\n#define XENIA_KERNEL_UTIL_OBJECT_TABLE_H_\n\n#include <string>\n#include <unordered_map>\n#include <vector>\n\n#include \"xenia/base/mutex.h\"\n#include \"xenia/base/string_key.h\"\n#include \"xenia/kernel/xobject.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nclass ByteStream;\n}  // namespace xe\n\nnamespace xe {\nnamespace kernel {\nnamespace util {\n\nclass ObjectTable {\n public:\n  ObjectTable();\n  ~ObjectTable();\n\n  void Reset();\n\n  X_STATUS AddHandle(XObject* object, X_HANDLE* out_handle);\n  X_STATUS DuplicateHandle(X_HANDLE orig, X_HANDLE* out_handle);\n  X_STATUS RetainHandle(X_HANDLE handle);\n  X_STATUS ReleaseHandle(X_HANDLE handle);\n  X_STATUS RemoveHandle(X_HANDLE handle);\n\n  bool Save(ByteStream* stream);\n  bool Restore(ByteStream* stream);\n\n  // Restores a XObject reference with a handle. Mainly for internal use - do\n  // not use.\n  X_STATUS RestoreHandle(X_HANDLE handle, XObject* object);\n\n  template <typename T>\n  object_ref<T> LookupObject(X_HANDLE handle) {\n    auto object = LookupObject(handle, false);\n    if (object) {\n      assert_true(object->type() == T::kObjectType);\n    }\n    auto result = object_ref<T>(reinterpret_cast<T*>(object));\n    return result;\n  }\n\n  X_STATUS AddNameMapping(const std::string_view name, X_HANDLE handle);\n  void RemoveNameMapping(const std::string_view name);\n  X_STATUS GetObjectByName(const std::string_view name, X_HANDLE* out_handle);\n  template <typename T>\n  std::vector<object_ref<T>> GetObjectsByType(XObject::Type type) {\n    std::vector<object_ref<T>> results;\n    GetObjectsByType(\n        type, reinterpret_cast<std::vector<object_ref<XObject>>*>(&results));\n    return results;\n  }\n\n  template <typename T>\n  std::vector<object_ref<T>> GetObjectsByType() {\n    std::vector<object_ref<T>> results;\n    GetObjectsByType(\n        T::kObjectType,\n        reinterpret_cast<std::vector<object_ref<XObject>>*>(&results));\n    return results;\n  }\n\n  std::vector<object_ref<XObject>> GetAllObjects();\n  void PurgeAllObjects();  // Purges the object table of all guest objects\n\n private:\n  struct ObjectTableEntry {\n    int handle_ref_count = 0;\n    XObject* object = nullptr;\n  };\n\n  ObjectTableEntry* LookupTable(X_HANDLE handle);\n  XObject* LookupObject(X_HANDLE handle, bool already_locked);\n  void GetObjectsByType(XObject::Type type,\n                        std::vector<object_ref<XObject>>* results);\n\n  X_HANDLE TranslateHandle(X_HANDLE handle);\n  static constexpr uint32_t GetHandleSlot(X_HANDLE handle) {\n    return (handle - XObject::kHandleBase) >> 2;\n  }\n  X_STATUS FindFreeSlot(uint32_t* out_slot);\n  bool Resize(uint32_t new_capacity);\n\n  xe::global_critical_region global_critical_region_;\n  uint32_t table_capacity_ = 0;\n  ObjectTableEntry* table_ = nullptr;\n  uint32_t last_free_entry_ = 0;\n  std::unordered_map<string_key_case, X_HANDLE> name_table_;\n};\n\n// Generic lookup\ntemplate <>\nobject_ref<XObject> ObjectTable::LookupObject<XObject>(X_HANDLE handle);\n\n}  // namespace util\n}  // namespace kernel\n}  // namespace xe\n\n#endif  // XENIA_KERNEL_UTIL_OBJECT_TABLE_H_\n"
  },
  {
    "path": "src/xenia/kernel/util/ordinal_table_post.inc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n// Post-include file for an ordinal table.\n\n#undef XE_EXPORT\n"
  },
  {
    "path": "src/xenia/kernel/util/ordinal_table_pre.inc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n/**\n * Pre-include file for an ordinal table.\n * Use this to build tables of constants describing the ordinals:\n *\n * // Build an ordinal enum to make it easy to lookup ordinals.\n * #include \"xenia/kernel/util/ordinal_table_pre.inc\"\n * namespace ordinals {\n * enum {\n *   #include \"xenia/kernel/my_module/my_module_table.inc\"\n * };\n * }  // namespace ordinals\n * #include \"xenia/kernel/util/ordinal_table_post.inc\"\n */\n\n#define XE_EXPORT(module, ordinal, name, type) name = ordinal\n"
  },
  {
    "path": "src/xenia/kernel/util/shim_utils.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2015 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/kernel/util/shim_utils.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace shim {\n\nthread_local StringBuffer string_buffer_;\n\nStringBuffer* thread_local_string_buffer() { return &string_buffer_; }\n\n}  // namespace shim\n}  // namespace kernel\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/kernel/util/shim_utils.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_KERNEL_UTIL_SHIM_UTILS_H_\n#define XENIA_KERNEL_UTIL_SHIM_UTILS_H_\n\n#include <cstring>\n#include <string>\n#include <type_traits>\n\n#include \"third_party/fmt/include/fmt/format.h\"\n#include \"xenia/base/byte_order.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/memory.h\"\n#include \"xenia/base/string_buffer.h\"\n#include \"xenia/cpu/export_resolver.h\"\n#include \"xenia/cpu/ppc/ppc_context.h\"\n#include \"xenia/kernel/kernel_flags.h\"\n#include \"xenia/kernel/kernel_state.h\"\n\nnamespace xe {\nnamespace kernel {\n\nusing PPCContext = xe::cpu::ppc::PPCContext;\n\n#define SHIM_CALL void\n#define SHIM_SET_MAPPING(library_name, export_name, shim_data) \\\n  export_resolver->SetFunctionMapping(                         \\\n      library_name, ordinals::export_name,                     \\\n      (xe::cpu::xe_kernel_export_shim_fn)export_name##_entry);\n\n#define SHIM_MEM_ADDR(a) \\\n  ((a) ? ppc_context->kernel_state->memory()->TranslateVirtual(a) : nullptr)\n\n#define SHIM_MEM_8(a) xe::load_and_swap<uint8_t>(SHIM_MEM_ADDR(a))\n#define SHIM_MEM_16(a) xe::load_and_swap<uint16_t>(SHIM_MEM_ADDR(a))\n#define SHIM_MEM_32(a) xe::load_and_swap<uint32_t>(SHIM_MEM_ADDR(a))\n#define SHIM_MEM_64(a) xe::load_and_swap<uint64_t>(SHIM_MEM_ADDR(a))\n#define SHIM_SET_MEM_8(a, v) xe::store_and_swap<uint8_t>(SHIM_MEM_ADDR(a), v)\n#define SHIM_SET_MEM_16(a, v) xe::store_and_swap<uint16_t>(SHIM_MEM_ADDR(a), v)\n#define SHIM_SET_MEM_32(a, v) xe::store_and_swap<uint32_t>(SHIM_MEM_ADDR(a), v)\n#define SHIM_SET_MEM_64(a, v) xe::store_and_swap<uint64_t>(SHIM_MEM_ADDR(a), v)\n\nnamespace util {\ninline uint32_t get_arg_stack_ptr(PPCContext* ppc_context, uint8_t index) {\n  return ((uint32_t)ppc_context->r[1]) + 0x54 + index * 8;\n}\n\ninline uint8_t get_arg_8(PPCContext* ppc_context, uint8_t index) {\n  if (index <= 7) {\n    return (uint8_t)ppc_context->r[3 + index];\n  }\n  uint32_t stack_address = get_arg_stack_ptr(ppc_context, index - 8);\n  return SHIM_MEM_8(stack_address);\n}\n\ninline uint16_t get_arg_16(PPCContext* ppc_context, uint8_t index) {\n  if (index <= 7) {\n    return (uint16_t)ppc_context->r[3 + index];\n  }\n  uint32_t stack_address = get_arg_stack_ptr(ppc_context, index - 8);\n  return SHIM_MEM_16(stack_address);\n}\n\ninline uint32_t get_arg_32(PPCContext* ppc_context, uint8_t index) {\n  if (index <= 7) {\n    return (uint32_t)ppc_context->r[3 + index];\n  }\n  uint32_t stack_address = get_arg_stack_ptr(ppc_context, index - 8);\n  return SHIM_MEM_32(stack_address);\n}\n\ninline uint64_t get_arg_64(PPCContext* ppc_context, uint8_t index) {\n  if (index <= 7) {\n    return ppc_context->r[3 + index];\n  }\n  uint32_t stack_address = get_arg_stack_ptr(ppc_context, index - 8);\n  return SHIM_MEM_64(stack_address);\n}\n\ninline std::string_view TranslateAnsiString(const Memory* memory,\n                                            const X_ANSI_STRING* ansi_string) {\n  if (!ansi_string || !ansi_string->length) {\n    return \"\";\n  }\n  return std::string_view(\n      memory->TranslateVirtual<const char*>(ansi_string->pointer),\n      ansi_string->length);\n}\n\ninline std::string_view TranslateAnsiStringAddress(const Memory* memory,\n                                                   uint32_t guest_address) {\n  if (!guest_address) {\n    return \"\";\n  }\n  return TranslateAnsiString(\n      memory, memory->TranslateVirtual<const X_ANSI_STRING*>(guest_address));\n}\n\ninline std::u16string TranslateUnicodeString(\n    const Memory* memory, const X_UNICODE_STRING* unicode_string) {\n  if (!unicode_string) {\n    return u\"\";\n  }\n  uint16_t length = unicode_string->length;\n  if (!length) {\n    return u\"\";\n  }\n  const xe::be<uint16_t>* guest_string =\n      memory->TranslateVirtual<const xe::be<uint16_t>*>(\n          unicode_string->pointer);\n  std::u16string translated_string;\n  translated_string.reserve(length);\n  for (uint16_t i = 0; i < length; ++i) {\n    translated_string += char16_t(uint16_t(guest_string[i]));\n  }\n  return translated_string;\n}\n}  // namespace util\n\n#define SHIM_GET_ARG_8(n) util::get_arg_8(ppc_context, n)\n#define SHIM_GET_ARG_16(n) util::get_arg_16(ppc_context, n)\n#define SHIM_GET_ARG_32(n) util::get_arg_32(ppc_context, n)\n#define SHIM_GET_ARG_64(n) util::get_arg_64(ppc_context, n)\n#define SHIM_SET_RETURN_32(v) ppc_context->r[3] = (uint64_t)((int32_t)v)\n\n#define SHIM_STRUCT(type, address) \\\n  reinterpret_cast<type*>(SHIM_MEM_ADDR(address))\n\nnamespace shim {\n\nclass Param {\n public:\n  struct Init {\n    PPCContext* ppc_context;\n    int ordinal;\n    int float_ordinal;\n  };\n\n  Param& operator=(const Param&) = delete;\n\n  int ordinal() const { return ordinal_; }\n\n protected:\n  Param() : ordinal_(-1) {}\n  explicit Param(Init& init) : ordinal_(init.ordinal++) {}\n\n  template <typename V>\n  void LoadValue(Init& init, V* out_value) {\n    if (ordinal_ <= 7) {\n      *out_value = V(init.ppc_context->r[3 + ordinal_]);\n    } else {\n      uint32_t stack_ptr =\n          uint32_t(init.ppc_context->r[1]) + 0x54 + (ordinal_ - 8) * 8;\n      *out_value = xe::load_and_swap<V>(\n          init.ppc_context->kernel_state->memory()->TranslateVirtual(\n              stack_ptr));\n    }\n  }\n\n  int ordinal_;\n};\ntemplate <>\ninline void Param::LoadValue<float>(Param::Init& init, float* out_value) {\n  *out_value =\n      static_cast<float>(init.ppc_context->f[1 + ++init.float_ordinal]);\n}\ntemplate <>\ninline void Param::LoadValue<double>(Param::Init& init, double* out_value) {\n  *out_value = init.ppc_context->f[1 + ++init.float_ordinal];\n}\ntemplate <typename T>\nclass ParamBase : public Param {\n public:\n  ParamBase() : Param(), value_(0) {}\n  ParamBase(T value) : Param(), value_(value) {}\n  ParamBase(Init& init) : Param(init) { LoadValue<T>(init, &value_); }\n  ParamBase& operator=(const T& other) {\n    value_ = other;\n    return *this;\n  }\n  operator T() const { return value_; }\n  T value() const { return value_; }\n\n protected:\n  T value_;\n};\n\nclass PointerParam : public ParamBase<uint32_t> {\n public:\n  PointerParam(Init& init) : ParamBase(init) {\n    host_ptr_ =\n        value_\n            ? init.ppc_context->kernel_state->memory()->TranslateVirtual(value_)\n            : nullptr;\n  }\n  PointerParam(void* host_ptr) : ParamBase(), host_ptr_(host_ptr) {}\n  PointerParam& operator=(void*& other) {\n    host_ptr_ = other;\n    return *this;\n  }\n  uint32_t guest_address() const { return value_; }\n  uintptr_t host_address() const {\n    return reinterpret_cast<uintptr_t>(host_ptr_);\n  }\n  template <typename T>\n  T as() const {\n    return reinterpret_cast<T>(host_ptr_);\n  }\n  template <typename T>\n  xe::be<T>* as_array() const {\n    return reinterpret_cast<xe::be<T>*>(host_ptr_);\n  }\n  operator void*() const { return host_ptr_; }\n  operator uint8_t*() const { return reinterpret_cast<uint8_t*>(host_ptr_); }\n  operator bool() const { return host_ptr_ != nullptr; }\n  void* operator+(int offset) const {\n    return reinterpret_cast<uint8_t*>(host_ptr_) + offset;\n  }\n  void Zero(size_t size) const {\n    assert_not_null(host_ptr_);\n    std::memset(host_ptr_, 0, size);\n  }\n\n protected:\n  void* host_ptr_;\n};\n\ntemplate <typename T>\nclass PrimitivePointerParam : public ParamBase<uint32_t> {\n public:\n  PrimitivePointerParam(Init& init) : ParamBase(init) {\n    host_ptr_ = value_ ? init.ppc_context->kernel_state->memory()\n                             ->TranslateVirtual<xe::be<T>*>(value_)\n                       : nullptr;\n  }\n  PrimitivePointerParam(T* host_ptr) : ParamBase() {\n    host_ptr_ = reinterpret_cast<xe::be<T>*>(host_ptr);\n  }\n  PrimitivePointerParam& operator=(const T*& other) {\n    host_ptr_ = other;\n    return *this;\n  }\n  uint32_t guest_address() const { return value_; }\n  uintptr_t host_address() const {\n    return reinterpret_cast<uintptr_t>(host_ptr_);\n  }\n  T value() const { return *host_ptr_; }\n  operator T() const = delete;\n  operator xe::be<T>*() const { return host_ptr_; }\n  operator bool() const { return host_ptr_ != nullptr; }\n  void Zero() const {\n    assert_not_null(host_ptr_);\n    *host_ptr_ = 0;\n  }\n\n protected:\n  xe::be<T>* host_ptr_;\n};\n\ntemplate <typename CHAR, typename STR>\nclass StringPointerParam : public ParamBase<uint32_t> {\n public:\n  StringPointerParam(Init& init) : ParamBase(init) {\n    host_ptr_ =\n        value_\n            ? init.ppc_context->kernel_state->memory()->TranslateVirtual<CHAR*>(\n                  value_)\n            : nullptr;\n  }\n  StringPointerParam(CHAR* host_ptr) : ParamBase(), host_ptr_(host_ptr) {}\n  StringPointerParam& operator=(const CHAR*& other) {\n    host_ptr_ = other;\n    return *this;\n  }\n  uint32_t guest_address() const { return value_; }\n  uintptr_t host_address() const {\n    return reinterpret_cast<uintptr_t>(host_ptr_);\n  }\n  STR value() const { return xe::load_and_swap<STR>(host_ptr_); }\n  operator CHAR*() const { return host_ptr_; }\n  operator bool() const { return host_ptr_ != nullptr; }\n\n protected:\n  CHAR* host_ptr_;\n};\n\ntemplate <typename T>\nclass TypedPointerParam : public ParamBase<uint32_t> {\n public:\n  TypedPointerParam(Init& init) : ParamBase(init) {\n    host_ptr_ =\n        value_ ? init.ppc_context->kernel_state->memory()->TranslateVirtual<T*>(\n                     value_)\n               : nullptr;\n  }\n  TypedPointerParam(T* host_ptr) : ParamBase(), host_ptr_(host_ptr) {}\n  TypedPointerParam& operator=(const T*& other) {\n    host_ptr_ = other;\n    return *this;\n  }\n  uint32_t guest_address() const { return value_; }\n  uintptr_t host_address() const {\n    return reinterpret_cast<uintptr_t>(host_ptr_);\n  }\n  operator T*() const { return host_ptr_; }\n  operator bool() const { return host_ptr_ != nullptr; }\n  T* operator->() const {\n    assert_not_null(host_ptr_);\n    return host_ptr_;\n  }\n  void Zero() const {\n    assert_not_null(host_ptr_);\n    std::memset(host_ptr_, 0, sizeof(T));\n  }\n\n protected:\n  T* host_ptr_;\n};\n\nclass Result {\n public:\n  virtual void Store(PPCContext* ppc_context) = 0;\n};\n\ntemplate <typename T>\nclass ResultBase : public Result {\n public:\n  ResultBase(T value) : value_(value) {}\n  void Store(PPCContext* ppc_context) {\n    ppc_context->r[3] = uint64_t(int32_t(value_));\n  }\n  ResultBase() = delete;\n  ResultBase& operator=(const ResultBase&) = delete;\n  operator T() const { return value_; }\n\n private:\n  T value_;\n};\n\n}  // namespace shim\n\nusing int_t = const shim::ParamBase<int32_t>&;\nusing word_t = const shim::ParamBase<uint16_t>&;\nusing dword_t = const shim::ParamBase<uint32_t>&;\nusing qword_t = const shim::ParamBase<uint64_t>&;\nusing float_t = const shim::ParamBase<float>&;\nusing double_t = const shim::ParamBase<double>&;\nusing lpvoid_t = const shim::PointerParam&;\nusing lpword_t = const shim::PrimitivePointerParam<uint16_t>&;\nusing lpdword_t = const shim::PrimitivePointerParam<uint32_t>&;\nusing lpqword_t = const shim::PrimitivePointerParam<uint64_t>&;\nusing lpfloat_t = const shim::PrimitivePointerParam<float>&;\nusing lpdouble_t = const shim::PrimitivePointerParam<double>&;\nusing lpstring_t = const shim::StringPointerParam<char, std::string>&;\nusing lpu16string_t = const shim::StringPointerParam<char16_t, std::u16string>&;\nusing function_t = const shim::ParamBase<uint32_t>&;\nusing unknown_t = const shim::ParamBase<uint32_t>&;\nusing lpunknown_t = const shim::PointerParam&;\ntemplate <typename T>\nusing pointer_t = const shim::TypedPointerParam<T>&;\n\nusing int_result_t = shim::ResultBase<int32_t>;\nusing dword_result_t = shim::ResultBase<uint32_t>;\nusing pointer_result_t = shim::ResultBase<uint32_t>;\nusing X_HRESULT_result_t = shim::ResultBase<X_HRESULT>;\n\n// Exported from kernel_state.cc.\nKernelState* kernel_state();\ninline Memory* kernel_memory() { return kernel_state()->memory(); }\n\nnamespace shim {\n\ninline void AppendParam(StringBuffer* string_buffer, int_t param) {\n  string_buffer->AppendFormat(\"{}\", int32_t(param));\n}\ninline void AppendParam(StringBuffer* string_buffer, word_t param) {\n  string_buffer->AppendFormat(\"{:04X}\", uint16_t(param));\n}\ninline void AppendParam(StringBuffer* string_buffer, dword_t param) {\n  string_buffer->AppendFormat(\"{:08X}\", uint32_t(param));\n}\ninline void AppendParam(StringBuffer* string_buffer, qword_t param) {\n  string_buffer->AppendFormat(\"{:016X}\", uint64_t(param));\n}\ninline void AppendParam(StringBuffer* string_buffer, float_t param) {\n  string_buffer->AppendFormat(\"{:G}\", static_cast<float>(param));\n}\ninline void AppendParam(StringBuffer* string_buffer, double_t param) {\n  string_buffer->AppendFormat(\"{:G}\", static_cast<double>(param));\n}\ninline void AppendParam(StringBuffer* string_buffer, lpvoid_t param) {\n  string_buffer->AppendFormat(\"{:08X}\", uint32_t(param));\n}\ninline void AppendParam(StringBuffer* string_buffer, lpdword_t param) {\n  string_buffer->AppendFormat(\"{:08X}\", param.guest_address());\n  if (param) {\n    string_buffer->AppendFormat(\"({:08X})\", param.value());\n  }\n}\ninline void AppendParam(StringBuffer* string_buffer, lpqword_t param) {\n  string_buffer->AppendFormat(\"{:08X}\", param.guest_address());\n  if (param) {\n    string_buffer->AppendFormat(\"({:016X})\", param.value());\n  }\n}\ninline void AppendParam(StringBuffer* string_buffer, lpfloat_t param) {\n  string_buffer->AppendFormat(\"{:08X}\", param.guest_address());\n  if (param) {\n    string_buffer->AppendFormat(\"({:G})\", param.value());\n  }\n}\ninline void AppendParam(StringBuffer* string_buffer, lpdouble_t param) {\n  string_buffer->AppendFormat(\"{:08X}\", param.guest_address());\n  if (param) {\n    string_buffer->AppendFormat(\"({:G})\", param.value());\n  }\n}\ninline void AppendParam(StringBuffer* string_buffer, lpstring_t param) {\n  string_buffer->AppendFormat(\"{:08X}\", param.guest_address());\n  if (param) {\n    string_buffer->AppendFormat(\"({})\", param.value());\n  }\n}\ninline void AppendParam(StringBuffer* string_buffer, lpu16string_t param) {\n  string_buffer->AppendFormat(\"{:08X}\", param.guest_address());\n  if (param) {\n    string_buffer->AppendFormat(\"({})\", xe::to_utf8(param.value()));\n  }\n}\ninline void AppendParam(StringBuffer* string_buffer,\n                        pointer_t<X_OBJECT_ATTRIBUTES> record) {\n  string_buffer->AppendFormat(\"{:08X}\", record.guest_address());\n  if (record) {\n    auto name_string =\n        kernel_memory()->TranslateVirtual<X_ANSI_STRING*>(record->name_ptr);\n    std::string_view name =\n        name_string == nullptr\n            ? \"(null)\"\n            : util::TranslateAnsiString(kernel_memory(), name_string);\n    string_buffer->AppendFormat(\"({:08X},{},{:08X})\",\n                                uint32_t(record->root_directory), name,\n                                uint32_t(record->attributes));\n  }\n}\ninline void AppendParam(StringBuffer* string_buffer,\n                        pointer_t<X_EX_TITLE_TERMINATE_REGISTRATION> reg) {\n  string_buffer->AppendFormat(\"{:08X}({:08X}, {:08X})\", reg.guest_address(),\n                              static_cast<uint32_t>(reg->notification_routine),\n                              static_cast<uint32_t>(reg->priority));\n}\ninline void AppendParam(StringBuffer* string_buffer,\n                        pointer_t<X_EXCEPTION_RECORD> record) {\n  string_buffer->AppendFormat(\"{:08X}({:08X})\", record.guest_address(),\n                              uint32_t(record->code));\n}\ntemplate <typename T>\nvoid AppendParam(StringBuffer* string_buffer, pointer_t<T> param) {\n  string_buffer->AppendFormat(\"{:08X}\", param.guest_address());\n}\n\nenum class KernelModuleId {\n  xboxkrnl,\n  xam,\n  xbdm,\n};\n\ntemplate <size_t I = 0, typename... Ps>\ntypename std::enable_if<I == sizeof...(Ps)>::type AppendKernelCallParams(\n    StringBuffer& string_buffer, xe::cpu::Export* export_entry,\n    const std::tuple<Ps...>&) {}\n\ntemplate <size_t I = 0, typename... Ps>\n    typename std::enable_if <\n    I<sizeof...(Ps)>::type AppendKernelCallParams(\n        StringBuffer& string_buffer, xe::cpu::Export* export_entry,\n        const std::tuple<Ps...>& params) {\n  if (I) {\n    string_buffer.Append(\", \");\n  }\n  auto param = std::get<I>(params);\n  AppendParam(&string_buffer, param);\n  AppendKernelCallParams<I + 1>(string_buffer, export_entry, params);\n}\n\nStringBuffer* thread_local_string_buffer();\n\ntemplate <typename Tuple>\nvoid PrintKernelCall(cpu::Export* export_entry, const Tuple& params) {\n  auto& string_buffer = *thread_local_string_buffer();\n  string_buffer.Reset();\n  string_buffer.Append(export_entry->name);\n  string_buffer.Append('(');\n  AppendKernelCallParams(string_buffer, export_entry, params);\n  string_buffer.Append(')');\n  if (export_entry->tags & xe::cpu::ExportTag::kImportant) {\n    xe::logging::AppendLogLine(xe::LogLevel::Info, 'i',\n                               string_buffer.to_string_view());\n  } else {\n    xe::logging::AppendLogLine(xe::LogLevel::Debug, 'd',\n                               string_buffer.to_string_view());\n  }\n}\n\ntemplate <typename F, typename Tuple, std::size_t... I>\nauto KernelTrampoline(F&& f, Tuple&& t, std::index_sequence<I...>) {\n  return std::forward<F>(f)(std::get<I>(std::forward<Tuple>(t))...);\n}\n\ntemplate <KernelModuleId MODULE, uint16_t ORDINAL, typename R, typename... Ps>\nxe::cpu::Export* RegisterExport(R (*fn)(Ps&...), const char* name,\n                                xe::cpu::ExportTag::type tags) {\n  static_assert(\n      std::is_void<R>::value || std::is_base_of<shim::Result, R>::value,\n      \"R must be void or derive from shim::Result\");\n  static_assert((std::is_base_of_v<shim::Param, Ps> && ...),\n                \"Ps must derive from shim::Param\");\n  static const auto export_entry = new cpu::Export(\n      ORDINAL, xe::cpu::Export::Type::kFunction, name,\n      tags | xe::cpu::ExportTag::kImplemented | xe::cpu::ExportTag::kLog);\n  static R (*FN)(Ps & ...) = fn;\n  struct X {\n    static void Trampoline(PPCContext* ppc_context) {\n      ++export_entry->function_data.call_count;\n      Param::Init init = {\n          ppc_context,\n          0,\n      };\n      // Using braces initializer instead of make_tuple because braces\n      // enforce execution order across compilers.\n      // The make_tuple order is undefined per the C++ standard and\n      // cause inconsitencies between msvc and clang.\n      std::tuple<Ps...> params = {Ps(init)...};\n      if (export_entry->tags & xe::cpu::ExportTag::kLog &&\n          (!(export_entry->tags & xe::cpu::ExportTag::kHighFrequency) ||\n           cvars::log_high_frequency_kernel_calls)) {\n        PrintKernelCall(export_entry, params);\n      }\n      if constexpr (std::is_void<R>::value) {\n        KernelTrampoline(FN, std::forward<std::tuple<Ps...>>(params),\n                         std::make_index_sequence<sizeof...(Ps)>());\n      } else {\n        auto result =\n            KernelTrampoline(FN, std::forward<std::tuple<Ps...>>(params),\n                             std::make_index_sequence<sizeof...(Ps)>());\n        result.Store(ppc_context);\n        if (export_entry->tags &\n            (xe::cpu::ExportTag::kLog | xe::cpu::ExportTag::kLogResult)) {\n          // TODO(benvanik): log result.\n        }\n      }\n    }\n  };\n  export_entry->function_data.trampoline = &X::Trampoline;\n  return export_entry;\n}\n\n}  // namespace shim\n\nusing xe::cpu::ExportTag;\n\n#define DECLARE_EXPORT(module_name, name, category, tags)                  \\\n  const auto EXPORT_##module_name##_##name = RegisterExport_##module_name( \\\n      xe::kernel::shim::RegisterExport<                                    \\\n          xe::kernel::shim::KernelModuleId::module_name, ordinals::name>(  \\\n          &name##_entry, #name,                                            \\\n          tags | (static_cast<xe::cpu::ExportTag::type>(                   \\\n                      xe::cpu::ExportCategory::category)                   \\\n                  << xe::cpu::ExportTag::CategoryShift)));\n\n#define DECLARE_EMPTY_REGISTER_EXPORTS(module_name, group_name) \\\n  void xe::kernel::module_name::Register##group_name##Exports(  \\\n      xe::cpu::ExportResolver* export_resolver,                 \\\n      xe::kernel::KernelState* kernel_state) {}\n\n#define DECLARE_XAM_EXPORT_(name, category, tags) \\\n  DECLARE_EXPORT(xam, name, category, tags)\n#define DECLARE_XAM_EXPORT1(name, category, tag) \\\n  DECLARE_EXPORT(xam, name, category, xe::cpu::ExportTag::tag)\n#define DECLARE_XAM_EXPORT2(name, category, tag1, tag2) \\\n  DECLARE_EXPORT(xam, name, category,                   \\\n                 xe::cpu::ExportTag::tag1 | xe::cpu::ExportTag::tag2)\n\n#define DECLARE_XAM_EMPTY_REGISTER_EXPORTS(group_name) \\\n  DECLARE_EMPTY_REGISTER_EXPORTS(xam, group_name)\n\n#define DECLARE_XBDM_EXPORT_(name, category, tags) \\\n  DECLARE_EXPORT(xbdm, name, category, tags)\n#define DECLARE_XBDM_EXPORT1(name, category, tag) \\\n  DECLARE_EXPORT(xbdm, name, category, xe::cpu::ExportTag::tag)\n\n#define DECLARE_XBDM_EMPTY_REGISTER_EXPORTS(group_name) \\\n  DECLARE_EMPTY_REGISTER_EXPORTS(xbdm, group_name)\n\n#define DECLARE_XBOXKRNL_EXPORT_(name, category, tags) \\\n  DECLARE_EXPORT(xboxkrnl, name, category, tags)\n#define DECLARE_XBOXKRNL_EXPORT1(name, category, tag) \\\n  DECLARE_EXPORT(xboxkrnl, name, category, xe::cpu::ExportTag::tag)\n#define DECLARE_XBOXKRNL_EXPORT2(name, category, tag1, tag2) \\\n  DECLARE_EXPORT(xboxkrnl, name, category,                   \\\n                 xe::cpu::ExportTag::tag1 | xe::cpu::ExportTag::tag2)\n#define DECLARE_XBOXKRNL_EXPORT3(name, category, tag1, tag2, tag3)     \\\n  DECLARE_EXPORT(xboxkrnl, name, category,                             \\\n                 xe::cpu::ExportTag::tag1 | xe::cpu::ExportTag::tag2 | \\\n                     xe::cpu::ExportTag::tag3)\n#define DECLARE_XBOXKRNL_EXPORT4(name, category, tag1, tag2, tag3, tag4) \\\n  DECLARE_EXPORT(xboxkrnl, name, category,                               \\\n                 xe::cpu::ExportTag::tag1 | xe::cpu::ExportTag::tag2 |   \\\n                     xe::cpu::ExportTag::tag3 | xe::cpu::ExportTag::tag4)\n\n#define DECLARE_XBOXKRNL_EMPTY_REGISTER_EXPORTS(group_name) \\\n  DECLARE_EMPTY_REGISTER_EXPORTS(xboxkrnl, group_name)\n\n}  // namespace kernel\n}  // namespace xe\n\n#endif  // XENIA_KERNEL_UTIL_SHIM_UTILS_H_\n"
  },
  {
    "path": "src/xenia/kernel/util/xdbf_utils.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2016 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/kernel/util/xdbf_utils.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace util {\n\nconstexpr fourcc_t kXdbfSignatureXdbf = make_fourcc(\"XDBF\");\nconstexpr fourcc_t kXdbfSignatureXstc = make_fourcc(\"XSTC\");\nconstexpr fourcc_t kXdbfSignatureXstr = make_fourcc(\"XSTR\");\nconstexpr fourcc_t kXdbfSignatureXach = make_fourcc(\"XACH\");\n\nconstexpr uint64_t kXdbfIdTitle = 0x8000;\nconstexpr uint64_t kXdbfIdXstc = 0x58535443;\nconstexpr uint64_t kXdbfIdXach = 0x58414348;\n\nXdbfWrapper::XdbfWrapper(const uint8_t* data, size_t data_size)\n    : data_(data), data_size_(data_size) {\n  if (!data || data_size <= sizeof(XbdfHeader)) {\n    data_ = nullptr;\n    return;\n  }\n\n  const uint8_t* ptr = data_;\n\n  header_ = reinterpret_cast<const XbdfHeader*>(ptr);\n  ptr += sizeof(XbdfHeader);\n  if (header_->magic != kXdbfSignatureXdbf) {\n    data_ = nullptr;\n    return;\n  }\n\n  entries_ = reinterpret_cast<const XbdfEntry*>(ptr);\n  ptr += sizeof(XbdfEntry) * header_->entry_count;\n\n  files_ = reinterpret_cast<const XbdfFileLoc*>(ptr);\n  ptr += sizeof(XbdfFileLoc) * header_->free_count;\n\n  content_offset_ = ptr;\n}\n\nXdbfBlock XdbfWrapper::GetEntry(XdbfSection section, uint64_t id) const {\n  for (uint32_t i = 0; i < header_->entry_used; ++i) {\n    auto& entry = entries_[i];\n    if (entry.section == static_cast<uint16_t>(section) && entry.id == id) {\n      XdbfBlock block;\n      block.buffer = content_offset_ + entry.offset;\n      block.size = entry.size;\n      return block;\n    }\n  }\n  return {0};\n}\n\nstd::string XdbfWrapper::GetStringTableEntry(XLanguage language,\n                                             uint16_t string_id) const {\n  auto language_block =\n      GetEntry(XdbfSection::kStringTable, static_cast<uint64_t>(language));\n  if (!language_block) {\n    return \"\";\n  }\n\n  auto xstr_head =\n      reinterpret_cast<const XdbfSectionHeader*>(language_block.buffer);\n  assert_true(xstr_head->magic == kXdbfSignatureXstr);\n  assert_true(xstr_head->version == 1);\n\n  const uint8_t* ptr = language_block.buffer + sizeof(XdbfSectionHeader);\n  for (uint16_t i = 0; i < xstr_head->count; ++i) {\n    auto entry = reinterpret_cast<const XdbfStringTableEntry*>(ptr);\n    ptr += sizeof(XdbfStringTableEntry);\n    if (entry->id == string_id) {\n      return std::string(reinterpret_cast<const char*>(ptr),\n                         entry->string_length);\n    }\n    ptr += entry->string_length;\n  }\n  return \"\";\n}\n\nstd::vector<XdbfAchievementTableEntry> XdbfWrapper::GetAchievements() const {\n  std::vector<XdbfAchievementTableEntry> achievements;\n\n  auto achievement_table = GetEntry(XdbfSection::kMetadata, kXdbfIdXach);\n  if (!achievement_table) {\n    return achievements;\n  }\n\n  auto xach_head =\n      reinterpret_cast<const XdbfSectionHeader*>(achievement_table.buffer);\n  assert_true(xach_head->magic == kXdbfSignatureXach);\n  assert_true(xach_head->version == 1);\n\n  const uint8_t* ptr = achievement_table.buffer + sizeof(XdbfSectionHeader);\n  for (uint16_t i = 0; i < xach_head->count; ++i) {\n    auto entry = reinterpret_cast<const XdbfAchievementTableEntry*>(ptr);\n    ptr += sizeof(XdbfAchievementTableEntry);\n    achievements.push_back(*entry);\n  }\n  return achievements;\n\n}\n\nXLanguage XdbfGameData::GetExistingLanguage(XLanguage language_to_check) const {\n  // A bit of a hack. Check if title in specific language exist.\n  // If it doesn't then for sure language is not supported.\n  return title(language_to_check).empty() ? default_language()\n                                          : language_to_check;\n}\n\nXdbfBlock XdbfGameData::icon() const {\n  return GetEntry(XdbfSection::kImage, kXdbfIdTitle);\n}\n\nXLanguage XdbfGameData::default_language() const {\n  auto block = GetEntry(XdbfSection::kMetadata, kXdbfIdXstc);\n  if (!block.buffer) {\n    return XLanguage::kEnglish;\n  }\n  auto xstc = reinterpret_cast<const XdbfXstc*>(block.buffer);\n  assert_true(xstc->magic == kXdbfSignatureXstc);\n  return static_cast<XLanguage>(static_cast<uint32_t>(xstc->default_language));\n}\n\nstd::string XdbfGameData::title() const {\n  return GetStringTableEntry(default_language(), kXdbfIdTitle);\n}\n\nstd::string XdbfGameData::title(XLanguage language) const {\n  return GetStringTableEntry(language, kXdbfIdTitle);\n}\n\n}  // namespace util\n}  // namespace kernel\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/kernel/util/xdbf_utils.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2016 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_KERNEL_UTIL_XDBF_UTILS_H_\n#define XENIA_KERNEL_UTIL_XDBF_UTILS_H_\n\n#include <string>\n#include <vector>\n\n#include \"xenia/base/memory.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace util {\n\n// https://github.com/oukiar/freestyledash/blob/master/Freestyle/Tools/XEX/SPA.h\n// https://github.com/oukiar/freestyledash/blob/master/Freestyle/Tools/XEX/SPA.cpp\n\nenum class XdbfSection : uint16_t {\n  kMetadata = 0x0001,\n  kImage = 0x0002,\n  kStringTable = 0x0003,\n};\n\n#pragma pack(push, 1)\nstruct XbdfHeader {\n  xe::be<uint32_t> magic;\n  xe::be<uint32_t> version;\n  xe::be<uint32_t> entry_count;\n  xe::be<uint32_t> entry_used;\n  xe::be<uint32_t> free_count;\n  xe::be<uint32_t> free_used;\n};\nstatic_assert_size(XbdfHeader, 24);\n\nstruct XbdfEntry {\n  xe::be<uint16_t> section;\n  xe::be<uint64_t> id;\n  xe::be<uint32_t> offset;\n  xe::be<uint32_t> size;\n};\nstatic_assert_size(XbdfEntry, 18);\n\nstruct XbdfFileLoc {\n  xe::be<uint32_t> offset;\n  xe::be<uint32_t> size;\n};\nstatic_assert_size(XbdfFileLoc, 8);\n\nstruct XdbfXstc {\n  xe::be<uint32_t> magic;\n  xe::be<uint32_t> version;\n  xe::be<uint32_t> size;\n  xe::be<uint32_t> default_language;\n};\nstatic_assert_size(XdbfXstc, 16);\n\nstruct XdbfSectionHeader {\n  xe::be<uint32_t> magic;\n  xe::be<uint32_t> version;\n  xe::be<uint32_t> size;\n  xe::be<uint16_t> count;\n};\nstatic_assert_size(XdbfSectionHeader, 14);\n\nstruct XdbfStringTableEntry {\n  xe::be<uint16_t> id;\n  xe::be<uint16_t> string_length;\n};\nstatic_assert_size(XdbfStringTableEntry, 4);\n\nstruct XdbfAchievementTableEntry {\n  xe::be<uint16_t> id;\n  xe::be<uint16_t> label_id;\n  xe::be<uint16_t> description_id;\n  xe::be<uint16_t> unachieved_id;\n  xe::be<uint32_t> image_id;\n  xe::be<uint16_t> gamerscore;\n  xe::be<uint16_t> unkE;\n  xe::be<uint32_t> flags;\n  xe::be<uint32_t> unk14;\n  xe::be<uint32_t> unk18;\n  xe::be<uint32_t> unk1C;\n  xe::be<uint32_t> unk20;\n};\nstatic_assert_size(XdbfAchievementTableEntry, 0x24);\n#pragma pack(pop)\n\nstruct XdbfBlock {\n  const uint8_t* buffer;\n  size_t size;\n\n  operator bool() const { return buffer != nullptr; }\n};\n\n// Wraps an XBDF (XboxDataBaseFormat) in-memory database.\n// https://free60project.github.io/wiki/XDBF.html\nclass XdbfWrapper {\n public:\n  XdbfWrapper(const uint8_t* data, size_t data_size);\n\n  // True if the target memory contains a valid XDBF instance.\n  bool is_valid() const { return data_ != nullptr; }\n\n  // Gets an entry in the given section.\n  // If the entry is not found the returned block will be nullptr.\n  XdbfBlock GetEntry(XdbfSection section, uint64_t id) const;\n\n  // Gets a string from the string table in the given language.\n  // Returns the empty string if the entry is not found.\n  std::string GetStringTableEntry(XLanguage language, uint16_t string_id) const;\n  std::vector<XdbfAchievementTableEntry> GetAchievements() const;\n\n private:\n  const uint8_t* data_ = nullptr;\n  size_t data_size_ = 0;\n  const uint8_t* content_offset_ = nullptr;\n\n  const XbdfHeader* header_ = nullptr;\n  const XbdfEntry* entries_ = nullptr;\n  const XbdfFileLoc* files_ = nullptr;\n};\n\nclass XdbfGameData : public XdbfWrapper {\n public:\n  XdbfGameData(const uint8_t* data, size_t data_size)\n      : XdbfWrapper(data, data_size) {}\n\n  // Checks if provided language exist, if not returns default title language.\n  XLanguage GetExistingLanguage(XLanguage language_to_check) const;\n\n  // The game icon image, if found.\n  XdbfBlock icon() const;\n\n  // The game's default language.\n  XLanguage default_language() const;\n\n  // The game's title in its default language.\n  std::string title() const;\n\n  std::string title(XLanguage language) const;\n};\n\n}  // namespace util\n}  // namespace kernel\n}  // namespace xe\n\n#endif  // XENIA_KERNEL_UTIL_XDBF_UTILS_H_\n"
  },
  {
    "path": "src/xenia/kernel/util/xex2_info.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_KERNEL_UTIL_XEX2_INFO_H_\n#define XENIA_KERNEL_UTIL_XEX2_INFO_H_\n\n#include <cstdint>\n\n#include \"xenia/base/byte_order.h\"\n\nunion xe_xex2_version_t {\n  uint32_t value;\n  struct {\n    uint32_t major : 4;\n    uint32_t minor : 4;\n    uint32_t build : 16;\n    uint32_t qfe : 8;\n  };\n};\n\nenum xe_pe_section_flags_e : uint32_t {\n  kXEPESectionContainsCode = 0x00000020,\n  kXEPESectionContainsDataInit = 0x00000040,\n  kXEPESectionContainsDataUninit = 0x00000080,\n  kXEPESectionMemoryExecute = 0x20000000,\n  kXEPESectionMemoryRead = 0x40000000,\n  kXEPESectionMemoryWrite = 0x80000000,\n};\n\nclass PESection {\n public:\n  char name[9];  // 8 + 1 for \\0\n  uint32_t raw_address;\n  uint32_t raw_size;\n  uint32_t address;\n  uint32_t size;\n  uint32_t flags;  // kXEPESection*\n};\n\nstruct PEExport {\n  const char* name;\n  uint32_t ordinal;\n\n  uint64_t addr;  // Function address\n};\n\nnamespace xe {\n\nenum xex2_section_type {\n  XEX_SECTION_CODE = 1,\n  XEX_SECTION_DATA = 2,\n  XEX_SECTION_READONLY_DATA = 3,\n};\n\nenum xex2_image_flags : uint32_t {\n  XEX_IMAGE_MANUFACTURING_UTILITY = 0x00000002,\n  XEX_IMAGE_MANUFACTURING_SUPPORT_TOOLS = 0x00000004,\n  XEX_IMAGE_XGD2_MEDIA_ONLY = 0x00000008,\n  XEX_IMAGE_CARDEA_KEY = 0x00000100,\n  XEX_IMAGE_XEIKA_KEY = 0x00000200,\n  XEX_IMAGE_USERMODE_TITLE = 0x00000400,\n  XEX_IMAGE_USERMODE_SYSTEM = 0x00000800,\n  XEX_IMAGE_ORANGE0 = 0x00001000,\n  XEX_IMAGE_ORANGE1 = 0x00002000,\n  XEX_IMAGE_ORANGE2 = 0x00004000,\n  XEX_IMAGE_IPTV_SIGNUP_APPLICATION = 0x00010000,\n  XEX_IMAGE_IPTV_TITLE_APPLICATION = 0x00020000,\n  XEX_IMAGE_KEYVAULT_PRIVILEGES_REQUIRED = 0x04000000,\n  XEX_IMAGE_ONLINE_ACTIVATION_REQUIRED = 0x08000000,\n  XEX_IMAGE_PAGE_SIZE_4KB = 0x10000000,  // else 64KB\n  XEX_IMAGE_REGION_FREE = 0x20000000,\n  XEX_IMAGE_REVOCATION_CHECK_OPTIONAL = 0x40000000,\n  XEX_IMAGE_REVOCATION_CHECK_REQUIRED = 0x80000000,\n};\n\nenum xex2_media_flags : uint32_t {\n  XEX_MEDIA_HARDDISK = 0x00000001,\n  XEX_MEDIA_DVD_X2 = 0x00000002,\n  XEX_MEDIA_DVD_CD = 0x00000004,\n  XEX_MEDIA_DVD_5 = 0x00000008,\n  XEX_MEDIA_DVD_9 = 0x00000010,\n  XEX_MEDIA_SYSTEM_FLASH = 0x00000020,\n  XEX_MEDIA_MEMORY_UNIT = 0x00000080,\n  XEX_MEDIA_USB_MASS_STORAGE_DEVICE = 0x00000100,\n  XEX_MEDIA_NETWORK = 0x00000200,\n  XEX_MEDIA_DIRECT_FROM_MEMORY = 0x00000400,\n  XEX_MEDIA_RAM_DRIVE = 0x00000800,\n  XEX_MEDIA_SVOD = 0x00001000,\n  XEX_MEDIA_INSECURE_PACKAGE = 0x01000000,\n  XEX_MEDIA_SAVEGAME_PACKAGE = 0x02000000,\n  XEX_MEDIA_LOCALLY_SIGNED_PACKAGE = 0x04000000,\n  XEX_MEDIA_LIVE_SIGNED_PACKAGE = 0x08000000,\n  XEX_MEDIA_XBOX_PACKAGE = 0x10000000,\n};\n\nenum xex2_region_flags : uint32_t {\n  XEX_REGION_NTSCU = 0x000000FF,\n  XEX_REGION_NTSCJ = 0x0000FF00,\n  XEX_REGION_NTSCJ_JAPAN = 0x00000100,\n  XEX_REGION_NTSCJ_CHINA = 0x00000200,\n  XEX_REGION_PAL = 0x00FF0000,\n  XEX_REGION_PAL_AU_NZ = 0x00010000,\n  XEX_REGION_OTHER = 0xFF000000,\n  XEX_REGION_ALL = 0xFFFFFFFF,\n};\n\nenum xex2_module_flags : uint32_t {\n  XEX_MODULE_TITLE = 0x00000001,\n  XEX_MODULE_EXPORTS_TO_TITLE = 0x00000002,\n  XEX_MODULE_SYSTEM_DEBUGGER = 0x00000004,\n  XEX_MODULE_DLL_MODULE = 0x00000008,\n  XEX_MODULE_MODULE_PATCH = 0x00000010,\n  XEX_MODULE_PATCH_FULL = 0x00000020,\n  XEX_MODULE_PATCH_DELTA = 0x00000040,\n  XEX_MODULE_USER_MODE = 0x00000080,\n};\n\nenum xex2_system_flags : uint32_t {\n  XEX_SYSTEM_NO_FORCED_REBOOT = 0x00000001,\n  XEX_SYSTEM_FOREGROUND_TASKS = 0x00000002,\n  XEX_SYSTEM_NO_ODD_MAPPING = 0x00000004,\n  XEX_SYSTEM_HANDLE_MCE_INPUT = 0x00000008,\n  XEX_SYSTEM_RESTRICTED_HUD_FEATURES = 0x00000010,\n  XEX_SYSTEM_HANDLE_GAMEPAD_DISCONNECT = 0x00000020,\n  XEX_SYSTEM_INSECURE_SOCKETS = 0x00000040,\n  XEX_SYSTEM_XBOX1_INTEROPERABILITY = 0x00000080,\n  XEX_SYSTEM_DASH_CONTEXT = 0x00000100,\n  XEX_SYSTEM_USES_GAME_VOICE_CHANNEL = 0x00000200,\n  XEX_SYSTEM_PAL50_INCOMPATIBLE = 0x00000400,\n  XEX_SYSTEM_INSECURE_UTILITY_DRIVE = 0x00000800,\n  XEX_SYSTEM_XAM_HOOKS = 0x00001000,\n  XEX_SYSTEM_ACCESS_PII = 0x00002000,\n  XEX_SYSTEM_CROSS_PLATFORM_SYSTEM_LINK = 0x00004000,\n  XEX_SYSTEM_MULTIDISC_SWAP = 0x00008000,\n  XEX_SYSTEM_MULTIDISC_INSECURE_MEDIA = 0x00010000,\n  XEX_SYSTEM_AP25_MEDIA = 0x00020000,\n  XEX_SYSTEM_NO_CONFIRM_EXIT = 0x00040000,\n  XEX_SYSTEM_ALLOW_BACKGROUND_DOWNLOAD = 0x00080000,\n  XEX_SYSTEM_CREATE_PERSISTABLE_RAMDRIVE = 0x00100000,\n  XEX_SYSTEM_INHERIT_PERSISTENT_RAMDRIVE = 0x00200000,\n  XEX_SYSTEM_ALLOW_HUD_VIBRATION = 0x00400000,\n  XEX_SYSTEM_ACCESS_UTILITY_PARTITIONS = 0x00800000,\n  XEX_SYSTEM_IPTV_INPUT_SUPPORTED = 0x01000000,\n  XEX_SYSTEM_PREFER_BIG_BUTTON_INPUT = 0x02000000,\n  XEX_SYSTEM_ALLOW_EXTENDED_SYSTEM_RESERVATION = 0x04000000,\n  XEX_SYSTEM_MULTIDISC_CROSS_TITLE = 0x08000000,\n  XEX_SYSTEM_INSTALL_INCOMPATIBLE = 0x10000000,\n  XEX_SYSTEM_ALLOW_AVATAR_GET_METADATA_BY_XUID = 0x20000000,\n  XEX_SYSTEM_ALLOW_CONTROLLER_SWAPPING = 0x40000000,\n  XEX_SYSTEM_DASH_EXTENSIBILITY_MODULE = 0x80000000,\n  // TODO(benvanik): figure out how stored.\n  /*XEX_SYSTEM_ALLOW_NETWORK_READ_CANCEL            = 0x0,\n  XEX_SYSTEM_UNINTERRUPTABLE_READS                = 0x0,\n  XEX_SYSTEM_REQUIRE_FULL_EXPERIENCE              = 0x0,\n  XEX_SYSTEM_GAME_VOICE_REQUIRED_UI               = 0x0,\n  XEX_SYSTEM_CAMERA_ANGLE                         = 0x0,\n  XEX_SYSTEM_SKELETAL_TRACKING_REQUIRED           = 0x0,\n  XEX_SYSTEM_SKELETAL_TRACKING_SUPPORTED          = 0x0,*/\n};\n\n// ESRB (Entertainment Software Rating Board)\nenum xex2_rating_esrb_value : uint32_t {\n  XEX_RATING_ESRB_eC = 0x00,\n  XEX_RATING_ESRB_E = 0x02,\n  XEX_RATING_ESRB_E10 = 0x04,\n  XEX_RATING_ESRB_T = 0x06,\n  XEX_RATING_ESRB_M = 0x08,\n  XEX_RATING_ESRB_AO = 0x0E,\n  XEX_RATING_ESRB_UNRATED = 0xFF,\n};\n// PEGI (Pan European Game Information)\nenum xex2_rating_pegi_value : uint32_t {\n  XEX_RATING_PEGI_3_PLUS = 0,\n  XEX_RATING_PEGI_7_PLUS = 4,\n  XEX_RATING_PEGI_12_PLUS = 9,\n  XEX_RATING_PEGI_16_PLUS = 13,\n  XEX_RATING_PEGI_18_PLUS = 14,\n  XEX_RATING_PEGI_UNRATED = 0xFF,\n};\n// PEGI (Pan European Game Information) - Finland\nenum xex2_rating_pegi_fi_value : uint32_t {\n  XEX_RATING_PEGI_FI_3_PLUS = 0,\n  XEX_RATING_PEGI_FI_7_PLUS = 4,\n  XEX_RATING_PEGI_FI_11_PLUS = 8,\n  XEX_RATING_PEGI_FI_15_PLUS = 12,\n  XEX_RATING_PEGI_FI_18_PLUS = 14,\n  XEX_RATING_PEGI_FI_UNRATED = 0xFF,\n};\n// PEGI (Pan European Game Information) - Portugal\nenum xex2_rating_pegi_pt_value : uint32_t {\n  XEX_RATING_PEGI_PT_4_PLUS = 1,\n  XEX_RATING_PEGI_PT_6_PLUS = 3,\n  XEX_RATING_PEGI_PT_12_PLUS = 9,\n  XEX_RATING_PEGI_PT_16_PLUS = 13,\n  XEX_RATING_PEGI_PT_18_PLUS = 14,\n  XEX_RATING_PEGI_PT_UNRATED = 0xFF,\n};\n// BBFC (British Board of Film Classification) - UK/Ireland\nenum xex2_rating_bbfc_value : uint32_t {\n  XEX_RATING_BBFC_UNIVERSAL = 1,\n  XEX_RATING_BBFC_PG = 5,\n  XEX_RATING_BBFC_3_PLUS = 0,\n  XEX_RATING_BBFC_7_PLUS = 4,\n  XEX_RATING_BBFC_12_PLUS = 9,\n  XEX_RATING_BBFC_15_PLUS = 12,\n  XEX_RATING_BBFC_16_PLUS = 13,\n  XEX_RATING_BBFC_18_PLUS = 14,\n  XEX_RATING_BBFC_UNRATED = 0xFF,\n};\n// CERO (Computer Entertainment Rating Organization)\nenum xex2_rating_cero_value : uint32_t {\n  XEX_RATING_CERO_A = 0,\n  XEX_RATING_CERO_B = 2,\n  XEX_RATING_CERO_C = 4,\n  XEX_RATING_CERO_D = 6,\n  XEX_RATING_CERO_Z = 8,\n  XEX_RATING_CERO_UNRATED = 0xFF,\n};\n// USK (Unterhaltungssoftware SelbstKontrolle)\nenum xex2_rating_usk_value : uint32_t {\n  XEX_RATING_USK_ALL = 0,\n  XEX_RATING_USK_6_PLUS = 2,\n  XEX_RATING_USK_12_PLUS = 4,\n  XEX_RATING_USK_16_PLUS = 6,\n  XEX_RATING_USK_18_PLUS = 8,\n  XEX_RATING_USK_UNRATED = 0xFF,\n};\n// OFLC (Office of Film and Literature Classification) - Australia\nenum xex2_rating_oflc_au_value : uint32_t {\n  XEX_RATING_OFLC_AU_G = 0,\n  XEX_RATING_OFLC_AU_PG = 2,\n  XEX_RATING_OFLC_AU_M = 4,\n  XEX_RATING_OFLC_AU_MA15_PLUS = 6,\n  XEX_RATING_OFLC_AU_UNRATED = 0xFF,\n};\n// OFLC (Office of Film and Literature Classification) - New Zealand\nenum xex2_rating_oflc_nz_value : uint32_t {\n  XEX_RATING_OFLC_NZ_G = 0,\n  XEX_RATING_OFLC_NZ_PG = 2,\n  XEX_RATING_OFLC_NZ_M = 4,\n  XEX_RATING_OFLC_NZ_MA15_PLUS = 6,\n  XEX_RATING_OFLC_NZ_UNRATED = 0xFF,\n};\n// KMRB (Korea Media Rating Board)\nenum xex2_rating_kmrb_value : uint32_t {\n  XEX_RATING_KMRB_ALL = 0,\n  XEX_RATING_KMRB_12_PLUS = 2,\n  XEX_RATING_KMRB_15_PLUS = 4,\n  XEX_RATING_KMRB_18_PLUS = 6,\n  XEX_RATING_KMRB_UNRATED = 0xFF,\n};\n// Brazil\nenum xex2_rating_brazil_value : uint32_t {\n  XEX_RATING_BRAZIL_ALL = 0,\n  XEX_RATING_BRAZIL_12_PLUS = 2,\n  XEX_RATING_BRAZIL_14_PLUS = 4,\n  XEX_RATING_BRAZIL_16_PLUS = 5,\n  XEX_RATING_BRAZIL_18_PLUS = 8,\n  XEX_RATING_BRAZIL_UNRATED = 0xFF,\n};\n// FPB (Film and Publication Board)\nenum xex2_rating_fpb_value : uint32_t {\n  XEX_RATING_FPB_ALL = 0,\n  XEX_RATING_FPB_PG = 6,\n  XEX_RATING_FPB_10_PLUS = 7,\n  XEX_RATING_FPB_13_PLUS = 10,\n  XEX_RATING_FPB_16_PLUS = 13,\n  XEX_RATING_FPB_18_PLUS = 14,\n  XEX_RATING_FPB_UNRATED = 0xFF,\n};\n\nenum xex2_header_keys : uint32_t {\n  XEX_HEADER_RESOURCE_INFO = 0x000002FF,\n  XEX_HEADER_FILE_FORMAT_INFO = 0x000003FF,\n  XEX_HEADER_DELTA_PATCH_DESCRIPTOR = 0x000005FF,\n  XEX_HEADER_BASE_REFERENCE = 0x00000405,\n  XEX_HEADER_BOUNDING_PATH = 0x000080FF,\n  XEX_HEADER_DEVICE_ID = 0x00008105,\n  XEX_HEADER_ORIGINAL_BASE_ADDRESS = 0x00010001,\n  XEX_HEADER_ENTRY_POINT = 0x00010100,\n  XEX_HEADER_IMAGE_BASE_ADDRESS = 0x00010201,\n  XEX_HEADER_IMPORT_LIBRARIES = 0x000103FF,\n  XEX_HEADER_CHECKSUM_TIMESTAMP = 0x00018002,\n  XEX_HEADER_ENABLED_FOR_CALLCAP = 0x00018102,\n  XEX_HEADER_ENABLED_FOR_FASTCAP = 0x00018200,\n  XEX_HEADER_ORIGINAL_PE_NAME = 0x000183FF,\n  XEX_HEADER_STATIC_LIBRARIES = 0x000200FF,\n  XEX_HEADER_TLS_INFO = 0x00020104,\n  XEX_HEADER_DEFAULT_STACK_SIZE = 0x00020200,\n  XEX_HEADER_DEFAULT_FILESYSTEM_CACHE_SIZE = 0x00020301,\n  XEX_HEADER_DEFAULT_HEAP_SIZE = 0x00020401,\n  XEX_HEADER_PAGE_HEAP_SIZE_AND_FLAGS = 0x00028002,\n  XEX_HEADER_SYSTEM_FLAGS = 0x00030000,\n  XEX_HEADER_EXECUTION_INFO = 0x00040006,\n  XEX_HEADER_TITLE_WORKSPACE_SIZE = 0x00040201,\n  XEX_HEADER_GAME_RATINGS = 0x00040310,\n  XEX_HEADER_LAN_KEY = 0x00040404,\n  XEX_HEADER_XBOX360_LOGO = 0x000405FF,\n  XEX_HEADER_MULTIDISC_MEDIA_IDS = 0x000406FF,\n  XEX_HEADER_ALTERNATE_TITLE_IDS = 0x000407FF,\n  XEX_HEADER_ADDITIONAL_TITLE_MEMORY = 0x00040801,\n  XEX_HEADER_EXPORTS_BY_NAME = 0x00E10402,\n};\n\nenum xex2_encryption_type : uint16_t {\n  XEX_ENCRYPTION_NONE = 0,\n  XEX_ENCRYPTION_NORMAL = 1,\n};\n\nenum xex2_compression_type : uint16_t {\n  XEX_COMPRESSION_NONE = 0,\n  XEX_COMPRESSION_BASIC = 1,\n  XEX_COMPRESSION_NORMAL = 2,\n  XEX_COMPRESSION_DELTA = 3,\n};\n\nenum xex2_approval_type : uint32_t {\n  XEX_APPROVAL_UNAPPROVED = 0,\n  XEX_APPROVAL_POSSIBLE = 1,\n  XEX_APPROVAL_APPROVED = 2,\n  XEX_APPROVAL_EXPIRED = 3,\n};\n\nstruct xex2_game_ratings_t {\n  xe::be<xex2_rating_esrb_value> esrb;\n  xe::be<xex2_rating_pegi_value> pegi;\n  xe::be<xex2_rating_pegi_fi_value> pegifi;\n  xe::be<xex2_rating_pegi_pt_value> pegipt;\n  xe::be<xex2_rating_bbfc_value> bbfc;\n  xe::be<xex2_rating_cero_value> cero;\n  xe::be<xex2_rating_usk_value> usk;\n  xe::be<xex2_rating_oflc_au_value> oflcau;\n  xe::be<xex2_rating_oflc_nz_value> oflcnz;\n  xe::be<xex2_rating_kmrb_value> kmrb;\n  xe::be<xex2_rating_brazil_value> brazil;\n  xe::be<xex2_rating_fpb_value> fpb;\n};\n\nstruct xex2_file_basic_compression_block {\n  xe::be<uint32_t> data_size;\n  xe::be<uint32_t> zero_size;\n};\n\nstruct xex2_file_basic_compression_info {\n  xex2_file_basic_compression_block blocks[1];\n};\n\nstruct xex2_compressed_block_info {\n  xe::be<uint32_t> block_size;\n  uint8_t block_hash[20];\n};\n\nstruct xex2_file_normal_compression_info {\n  xe::be<uint32_t> window_size;\n  xex2_compressed_block_info first_block;\n};\n\nstruct xex2_opt_file_format_info {\n  xe::be<uint32_t> info_size;\n  xe::be<xex2_encryption_type> encryption_type;\n  xe::be<xex2_compression_type> compression_type;\n  union {\n    xex2_file_basic_compression_info basic;\n    xex2_file_normal_compression_info normal;\n  } compression_info;\n};\n\nunion xex2_version {\n  uint32_t value;\n  struct {\n    uint32_t major : 4;\n    uint32_t minor : 4;\n    uint32_t build : 16;\n    uint32_t qfe : 8;\n  };\n};\n\nstruct xex2_opt_lan_key {\n  uint8_t key[0x10];\n};\n\nstruct xex2_opt_bound_path {\n  xe::be<uint32_t> size;\n  char path[1];\n};\n\nstruct xex2_opt_static_library {\n  char name[8];                    // 0x0\n  xe::be<uint16_t> version_major;  // 0x8\n  xe::be<uint16_t> version_minor;  // 0xA\n  xe::be<uint16_t> version_build;  // 0xC\n  uint8_t approval_type;           // 0xE\n  uint8_t version_qfe;             // 0xF\n};\nstatic_assert_size(xex2_opt_static_library, 0x10);\n\nstruct xex2_opt_static_libraries {\n  xe::be<uint32_t> size;                 // 0x0\n  xex2_opt_static_library libraries[1];  // 0x4\n};\n\nstruct xex2_opt_original_pe_name {\n  xe::be<uint32_t> size;\n  char name[1];\n};\n\nstruct xex2_opt_data_directory {\n  xe::be<uint32_t> offset;  // 0x0\n  xe::be<uint32_t> size;    // 0x4\n};\nstatic_assert_size(xex2_opt_data_directory, 0x8);\n\nstruct xex2_opt_tls_info {\n  xe::be<uint32_t> slot_count;        // 0x0\n  xe::be<uint32_t> raw_data_address;  // 0x4\n  xe::be<uint32_t> data_size;         // 0x8\n  xe::be<uint32_t> raw_data_size;     // 0xC\n};\nstatic_assert_size(xex2_opt_tls_info, 0x10);\n\nstruct xex2_resource {\n  char name[8];              // 0x0\n  xe::be<uint32_t> address;  // 0x8\n  xe::be<uint32_t> size;     // 0xC\n};\nstatic_assert_size(xex2_resource, 0x10);\n\nstruct xex2_opt_resource_info {\n  xe::be<uint32_t> size;       // 0x0 Resource count is (size - 4) / 16\n  xex2_resource resources[1];  // 0x4\n};\n\nstruct xex2_delta_patch {\n  xe::be<uint32_t> old_addr;\n  xe::be<uint32_t> new_addr;\n  xe::be<uint16_t> uncompressed_len;\n  xe::be<uint16_t> compressed_len;\n  char patch_data[1];\n};\n\nstruct xex2_opt_delta_patch_descriptor {\n  xe::be<uint32_t> size;                         // 0x0\n  xe::be<uint32_t> target_version_value;         // 0x4\n  xe::be<uint32_t> source_version_value;         // 0x8\n  uint8_t digest_source[0x14];                   // 0xC\n  uint8_t image_key_source[0x10];                // 0x20\n  xe::be<uint32_t> size_of_target_headers;       // 0x30\n  xe::be<uint32_t> delta_headers_source_offset;  // 0x34\n  xe::be<uint32_t> delta_headers_source_size;    // 0x38\n  xe::be<uint32_t> delta_headers_target_offset;  // 0x3C\n  xe::be<uint32_t> delta_image_source_offset;    // 0x40\n  xe::be<uint32_t> delta_image_source_size;      // 0x44\n  xe::be<uint32_t> delta_image_target_offset;    // 0x48\n  xex2_delta_patch info;                         // 0x4C\n\n  xex2_version target_version() const {\n    return xex2_version{target_version_value};\n  }\n\n  void set_target_version(xex2_version version) {\n    target_version_value = version.value;\n  }\n\n  xex2_version source_version() const {\n    return xex2_version{source_version_value};\n  }\n\n  void set_source_version(xex2_version version) {\n    source_version_value = version.value;\n  }\n};\n\nstruct xex2_opt_execution_info {\n  xe::be<uint32_t> media_id;            // 0x0\n  xe::be<uint32_t> version_value;       // 0x4\n  xe::be<uint32_t> base_version_value;  // 0x8\n  xe::be<uint32_t> title_id;            // 0xC\n  uint8_t platform;                     // 0x10\n  uint8_t executable_table;             // 0x11\n  uint8_t disc_number;                  // 0x12\n  uint8_t disc_count;                   // 0x13\n  xe::be<uint32_t> savegame_id;         // 0x14\n\n  xex2_version version() const { return xex2_version{version_value}; }\n\n  void set_version(xex2_version version) { version_value = version.value; }\n\n  xex2_version base_version() const { return xex2_version{base_version_value}; }\n\n  void set_base_version(xex2_version version) {\n    base_version_value = version.value;\n  }\n};\nstatic_assert_size(xex2_opt_execution_info, 0x18);\n\nstruct xex2_opt_import_libraries {\n  xe::be<uint32_t> size;  // 0x0\n  struct {\n    xe::be<uint32_t> size;   // 0x4\n    xe::be<uint32_t> count;  // 0x8\n    char data[1];            // 0xC string_table_size bytes\n  } string_table;\n};\n\nstruct xex2_import_library {\n  xe::be<uint32_t> size;               // 0x0\n  char next_import_digest[0x14];       // 0x4\n  xe::be<uint32_t> id;                 // 0x18\n  xe::be<uint32_t> version_value;      // 0x1C\n  xe::be<uint32_t> version_min_value;  // 0x20\n  xe::be<uint16_t> name_index;         // 0x24\n  xe::be<uint16_t> count;              // 0x26\n  xe::be<uint32_t> import_table[1];    // 0x28\n\n  xex2_version version() const { return xex2_version{version_value}; }\n\n  void set_version(xex2_version version) { version_value = version.value; }\n\n  xex2_version version_min() const { return xex2_version{version_min_value}; }\n\n  void set_version_min(xex2_version version) {\n    version_min_value = version.value;\n  }\n};\n\nstruct xex2_opt_generic_u32 {\n  xe::be<uint32_t> size;\n  xe::be<uint32_t> values[1];\n\n  uint32_t count() const { return (size - 4) / 4; }\n};\n\nstruct xex2_opt_header {\n  xe::be<uint32_t> key;  // 0x0\n\n  union {\n    xe::be<uint32_t> value;   // 0x4\n    xe::be<uint32_t> offset;  // 0x4\n  };\n};\n\nstruct xex2_header {\n  xe::be<uint32_t> magic;                  // 0x0 'XEX2'\n  xe::be<xex2_module_flags> module_flags;  // 0x4\n  xe::be<uint32_t> header_size;            // 0x8\n  xe::be<uint32_t> reserved;               // 0xC\n  xe::be<uint32_t> security_offset;        // 0x10\n  xe::be<uint32_t> header_count;           // 0x14\n\n  xex2_opt_header headers[1];  // 0x18\n};\n\nstruct xex2_page_descriptor {\n  union {\n    xe::be<uint32_t> value;  // 0x0\n    struct {\n      xex2_section_type info : 4;\n      uint32_t page_count : 28;\n    };\n  };\n  char data_digest[0x14];  // 0x4\n};\n\nstruct xex2_security_info {\n  xe::be<uint32_t> header_size;              // 0x0\n  xe::be<uint32_t> image_size;               // 0x4\n  char rsa_signature[0x100];                 // 0x8\n  xe::be<uint32_t> unk_108;                  // 0x108 unk length\n  xe::be<uint32_t> image_flags;              // 0x10C\n  xe::be<uint32_t> load_address;             // 0x110\n  char section_digest[0x14];                 // 0x114\n  xe::be<uint32_t> import_table_count;       // 0x128\n  char import_table_digest[0x14];            // 0x12C\n  char xgd2_media_id[0x10];                  // 0x140\n  char aes_key[0x10];                        // 0x150\n  xe::be<uint32_t> export_table;             // 0x160\n  char header_digest[0x14];                  // 0x164\n  xe::be<uint32_t> region;                   // 0x178\n  xe::be<uint32_t> allowed_media_types;      // 0x17C\n  xe::be<uint32_t> page_descriptor_count;    // 0x180\n  xex2_page_descriptor page_descriptors[1];  // 0x184\n};\n\nstruct xex1_security_info {\n  xe::be<uint32_t> header_size;\n  xe::be<uint32_t> image_size;\n  char rsa_signature[0x100];\n  char image_digest[0x14];\n  char import_table_digest[0x14];\n  xe::be<uint32_t> load_address;\n  char aes_key[0x10];\n  char xgd2_media_id[0x10];\n  xe::be<uint32_t> region;\n  xe::be<uint32_t> image_flags;\n  xe::be<uint32_t> export_table;\n  xe::be<uint32_t> allowed_media_types;\n  xe::be<uint32_t> page_descriptor_count;\n  xex2_page_descriptor page_descriptors[1];\n};\n\nstruct xex2_export_table {\n  xe::be<uint32_t> magic[3];         // 0x0\n  xe::be<uint32_t> modulenumber[2];  // 0xC\n  xe::be<uint32_t> version[3];       // 0x14\n  xe::be<uint32_t> imagebaseaddr;    // 0x20 must be <<16 to be accurate\n  xe::be<uint32_t> count;            // 0x24\n  xe::be<uint32_t> base;             // 0x28\n  xe::be<uint32_t>\n      ordOffset[1];  // 0x2C ordOffset[0] + (imagebaseaddr << 16) = function\n};\n\n// Little endian PE export directory (from winnt.h)\nstruct X_IMAGE_EXPORT_DIRECTORY {\n  uint32_t Characteristics;\n  uint32_t TimeDateStamp;\n  uint16_t MajorVersion;\n  uint16_t MinorVersion;\n  uint32_t Name;\n  uint32_t Base;\n  uint32_t NumberOfFunctions;\n  uint32_t NumberOfNames;\n  uint32_t AddressOfFunctions;     // RVA from base of image\n  uint32_t AddressOfNames;         // RVA from base of image\n  uint32_t AddressOfNameOrdinals;  // RVA from base of image\n};\n\n}  // namespace xe\n\n#endif  // XENIA_KERNEL_UTIL_XEX2_INFO_H_\n"
  },
  {
    "path": "src/xenia/kernel/xam/app_manager.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/kernel/xam/app_manager.h\"\n\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/xam/apps/xam_app.h\"\n#include \"xenia/kernel/xam/apps/xgi_app.h\"\n#include \"xenia/kernel/xam/apps/xlivebase_app.h\"\n#include \"xenia/kernel/xam/apps/xmp_app.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xam {\n\nApp::App(KernelState* kernel_state, uint32_t app_id)\n    : kernel_state_(kernel_state),\n      memory_(kernel_state->memory()),\n      app_id_(app_id) {}\n\nvoid AppManager::RegisterApps(KernelState* kernel_state, AppManager* manager) {\n  manager->RegisterApp(std::make_unique<apps::XmpApp>(kernel_state));\n  manager->RegisterApp(std::make_unique<apps::XgiApp>(kernel_state));\n  manager->RegisterApp(std::make_unique<apps::XLiveBaseApp>(kernel_state));\n  manager->RegisterApp(std::make_unique<apps::XamApp>(kernel_state));\n}\n\nvoid AppManager::RegisterApp(std::unique_ptr<App> app) {\n  assert_zero(app_lookup_.count(app->app_id()));\n  app_lookup_.insert({app->app_id(), app.get()});\n  apps_.push_back(std::move(app));\n}\n\nX_HRESULT AppManager::DispatchMessageSync(uint32_t app_id, uint32_t message,\n                                          uint32_t buffer_ptr,\n                                          uint32_t buffer_length) {\n  const auto& it = app_lookup_.find(app_id);\n  if (it == app_lookup_.end()) {\n    return X_E_NOTFOUND;\n  }\n  return it->second->DispatchMessageSync(message, buffer_ptr, buffer_length);\n}\n\nX_HRESULT AppManager::DispatchMessageAsync(uint32_t app_id, uint32_t message,\n                                           uint32_t buffer_ptr,\n                                           uint32_t buffer_length) {\n  const auto& it = app_lookup_.find(app_id);\n  if (it == app_lookup_.end()) {\n    return X_E_NOTFOUND;\n  }\n  return it->second->DispatchMessageSync(message, buffer_ptr, buffer_length);\n}\n\n}  // namespace xam\n}  // namespace kernel\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/kernel/xam/app_manager.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_KERNEL_XAM_APP_MANAGER_H_\n#define XENIA_KERNEL_XAM_APP_MANAGER_H_\n\n#include <cstddef>\n#include <memory>\n#include <unordered_map>\n#include <vector>\n\n#include \"xenia/memory.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace kernel {\nclass KernelState;\n}  // namespace kernel\n}  // namespace xe\n\nnamespace xe {\nnamespace kernel {\nnamespace xam {\n\nclass App {\n public:\n  uint32_t app_id() const { return app_id_; }\n\n  virtual X_HRESULT DispatchMessageSync(uint32_t message, uint32_t buffer_ptr,\n                                        uint32_t buffer_length) = 0;\n\n  virtual ~App() = default;\n\n protected:\n  App(KernelState* kernel_state, uint32_t app_id);\n\n  KernelState* kernel_state_;\n  Memory* memory_;\n  uint32_t app_id_;\n};\n\nclass AppManager {\n public:\n  static void RegisterApps(KernelState* kernel_state, AppManager* manager);\n\n  void RegisterApp(std::unique_ptr<App> app);\n\n  X_HRESULT DispatchMessageSync(uint32_t app_id, uint32_t message,\n                                uint32_t buffer_ptr, uint32_t buffer_length);\n  X_HRESULT DispatchMessageAsync(uint32_t app_id, uint32_t message,\n                                 uint32_t buffer_ptr, uint32_t buffer_length);\n\n private:\n  std::vector<std::unique_ptr<App>> apps_;\n  std::unordered_map<uint32_t, App*> app_lookup_;\n};\n\n}  // namespace xam\n}  // namespace kernel\n}  // namespace xe\n\n#endif  // XENIA_KERNEL_XAM_APP_MANAGER_H_\n"
  },
  {
    "path": "src/xenia/kernel/xam/apps/xam_app.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/kernel/xam/apps/xam_app.h\"\n\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/threading.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/xenumerator.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xam {\nnamespace apps {\n\nXamApp::XamApp(KernelState* kernel_state) : App(kernel_state, 0xFE) {}\n\nX_HRESULT XamApp::DispatchMessageSync(uint32_t message, uint32_t buffer_ptr,\n                                      uint32_t buffer_length) {\n  // NOTE: buffer_length may be zero or valid.\n  auto buffer = memory_->TranslateVirtual(buffer_ptr);\n  switch (message) {\n    case 0x0002000E: {\n      struct message_data {\n        xe::be<uint32_t> user_index;\n        xe::be<uint32_t> unk_04;\n        xe::be<uint32_t> extra_ptr;\n        xe::be<uint32_t> buffer_ptr;\n        xe::be<uint32_t> buffer_size;\n        xe::be<uint32_t> unk_14;\n        xe::be<uint32_t> length_ptr;\n        xe::be<uint32_t> unk_1C;\n      }* data = reinterpret_cast<message_data*>(buffer);\n      XELOGD(\n          \"XamAppEnumerateContentAggregate({}, {:08X}, {:08X}, {:08X}, {}, \"\n          \"{:08X}, {:08X}, {:08X})\",\n          (uint32_t)data->user_index, (uint32_t)data->unk_04,\n          (uint32_t)data->extra_ptr, (uint32_t)data->buffer_ptr,\n          (uint32_t)data->buffer_size, (uint32_t)data->unk_14,\n          (uint32_t)data->length_ptr, (uint32_t)data->unk_1C);\n      auto extra = memory_->TranslateVirtual<X_KENUMERATOR_CONTENT_AGGREGATE*>(\n          data->extra_ptr);\n      auto buffer = memory_->TranslateVirtual(data->buffer_ptr);\n      auto e = kernel_state_->object_table()->LookupObject<XEnumerator>(\n          extra->handle);\n      if (!e || !buffer || !extra) {\n        return X_E_INVALIDARG;\n      }\n      assert_true(extra->magic == kXObjSignature);\n      if (data->buffer_size) {\n        std::memset(buffer, 0, data->buffer_size);\n      }\n      uint32_t item_count = 0;\n      auto result = e->WriteItems(data->buffer_ptr, buffer, &item_count);\n\n      if (result == X_ERROR_SUCCESS && item_count >= 1) {\n        if (data->length_ptr) {\n          auto length_ptr =\n              memory_->TranslateVirtual<be<uint32_t>*>(data->length_ptr);\n          *length_ptr = 1;\n        }\n        return X_E_SUCCESS;\n      }\n      return X_E_NO_MORE_FILES;\n    }\n    case 0x00020021: {\n      struct message_data {\n        char unk_00[64];\n        xe::be<uint32_t> unk_40;  // KeGetCurrentProcessType() < 1 ? 1 : 0\n        xe::be<uint32_t> unk_44;  // ? output_ptr ?\n        xe::be<uint32_t> unk_48;  // ? overlapped_ptr ?\n      }* data = reinterpret_cast<message_data*>(buffer);\n      assert_true(buffer_length == sizeof(message_data));\n      auto unk = memory_->TranslateVirtual<xe::be<uint32_t>*>(data->unk_44);\n      *unk = 0;\n      XELOGD(\"XamApp(0x00020021)('{}', {:08X}, {:08X}, {:08X})\", data->unk_00,\n             (uint32_t)data->unk_40, (uint32_t)data->unk_44,\n             (uint32_t)data->unk_48);\n      return X_E_SUCCESS;\n    }\n    case 0x00021012: {\n      XELOGD(\"XamApp(0x00021012)\");\n      return X_E_SUCCESS;\n    }\n    case 0x00022005: {\n      struct message_data {\n        xe::be<uint32_t> unk_00;  // ? output_ptr ?\n        xe::be<uint32_t> unk_04;  // ? value/jump to? ?\n      }* data = reinterpret_cast<message_data*>(buffer);\n      assert_true(buffer_length == sizeof(message_data));\n      auto unk = memory_->TranslateVirtual<xe::be<uint32_t>*>(data->unk_00);\n      auto adr = *unk;\n      XELOGD(\"XamApp(0x00022005)(%.8X, %.8X)\", (uint32_t)data->unk_00,\n             (uint32_t)data->unk_04);\n      return X_E_SUCCESS;\n    }\n  }\n  XELOGE(\n      \"Unimplemented XAM message app={:08X}, msg={:08X}, arg1={:08X}, \"\n      \"arg2={:08X}\",\n      app_id(), message, buffer_ptr, buffer_length);\n  return X_E_FAIL;\n}\n\n}  // namespace apps\n}  // namespace xam\n}  // namespace kernel\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/kernel/xam/apps/xam_app.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_KERNEL_XAM_APPS_XAM_APP_H_\n#define XENIA_KERNEL_XAM_APPS_XAM_APP_H_\n\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/xam/app_manager.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xam {\nnamespace apps {\n\nclass XamApp : public App {\n public:\n  explicit XamApp(KernelState* kernel_state);\n\n  X_HRESULT DispatchMessageSync(uint32_t message, uint32_t buffer_ptr,\n                                uint32_t buffer_length) override;\n};\n\n}  // namespace apps\n}  // namespace xam\n}  // namespace kernel\n}  // namespace xe\n\n#endif  // XENIA_KERNEL_XAM_APPS_XAM_APP_H_\n"
  },
  {
    "path": "src/xenia/kernel/xam/apps/xgi_app.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/kernel/xam/apps/xgi_app.h\"\n\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/threading.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xam {\nnamespace apps {\n\nXgiApp::XgiApp(KernelState* kernel_state) : App(kernel_state, 0xFB) {}\n\n// http://mb.mirage.org/bugzilla/xliveless/main.c\n\nX_HRESULT XgiApp::DispatchMessageSync(uint32_t message, uint32_t buffer_ptr,\n                                      uint32_t buffer_length) {\n  // NOTE: buffer_length may be zero or valid.\n  auto buffer = memory_->TranslateVirtual(buffer_ptr);\n  switch (message) {\n    case 0x000B0006: {\n      assert_true(!buffer_length || buffer_length == 24);\n      // dword r3 user index\n      // dword (unwritten?)\n      // qword 0\n      // dword r4 context enum\n      // dword r5 value\n      uint32_t user_index = xe::load_and_swap<uint32_t>(buffer + 0);\n      uint32_t context_id = xe::load_and_swap<uint32_t>(buffer + 16);\n      uint32_t context_value = xe::load_and_swap<uint32_t>(buffer + 20);\n      XELOGD(\"XGIUserSetContextEx({:08X}, {:08X}, {:08X})\", user_index,\n             context_id, context_value);\n      return X_E_SUCCESS;\n    }\n    case 0x000B0007: {\n      uint32_t user_index = xe::load_and_swap<uint32_t>(buffer + 0);\n      uint32_t property_id = xe::load_and_swap<uint32_t>(buffer + 16);\n      uint32_t value_size = xe::load_and_swap<uint32_t>(buffer + 20);\n      uint32_t value_ptr = xe::load_and_swap<uint32_t>(buffer + 24);\n      XELOGD(\"XGIUserSetPropertyEx({:08X}, {:08X}, {}, {:08X})\", user_index,\n             property_id, value_size, value_ptr);\n      return X_E_SUCCESS;\n    }\n    case 0x000B0008: {\n      assert_true(!buffer_length || buffer_length == 8);\n      uint32_t achievement_count = xe::load_and_swap<uint32_t>(buffer + 0);\n      uint32_t achievements_ptr = xe::load_and_swap<uint32_t>(buffer + 4);\n      XELOGD(\"XGIUserWriteAchievements({:08X}, {:08X})\", achievement_count,\n             achievements_ptr);\n      return X_E_SUCCESS;\n    }\n    case 0x000B0010: {\n      assert_true(!buffer_length || buffer_length == 28);\n      // Sequence:\n      // - XamSessionCreateHandle\n      // - XamSessionRefObjByHandle\n      // - [this]\n      // - CloseHandle\n      uint32_t session_ptr = xe::load_and_swap<uint32_t>(buffer + 0x0);\n      uint32_t flags = xe::load_and_swap<uint32_t>(buffer + 0x4);\n      uint32_t num_slots_public = xe::load_and_swap<uint32_t>(buffer + 0x8);\n      uint32_t num_slots_private = xe::load_and_swap<uint32_t>(buffer + 0xC);\n      uint32_t user_xuid = xe::load_and_swap<uint32_t>(buffer + 0x10);\n      uint32_t session_info_ptr = xe::load_and_swap<uint32_t>(buffer + 0x14);\n      uint32_t nonce_ptr = xe::load_and_swap<uint32_t>(buffer + 0x18);\n\n      XELOGD(\n          \"XGISessionCreateImpl({:08X}, {:08X}, {}, {}, {:08X}, {:08X}, \"\n          \"{:08X})\",\n          session_ptr, flags, num_slots_public, num_slots_private, user_xuid,\n          session_info_ptr, nonce_ptr);\n      return X_E_SUCCESS;\n    }\n    case 0x000B0011: {\n      // TODO(PermaNull): reverse buffer contents.\n      XELOGD(\"XGISessionDelete\");\n      return X_STATUS_SUCCESS;\n    }\n    case 0x000B0012: {\n      assert_true(buffer_length == 0x14);\n      uint32_t session_ptr = xe::load_and_swap<uint32_t>(buffer + 0x0);\n      uint32_t user_count = xe::load_and_swap<uint32_t>(buffer + 0x4);\n      uint32_t unk_0 = xe::load_and_swap<uint32_t>(buffer + 0x8);\n      uint32_t user_index_array = xe::load_and_swap<uint32_t>(buffer + 0xC);\n      uint32_t private_slots_array = xe::load_and_swap<uint32_t>(buffer + 0x10);\n\n      assert_zero(unk_0);\n      XELOGD(\"XGISessionJoinLocal({:08X}, {}, {}, {:08X}, {:08X})\", session_ptr,\n             user_count, unk_0, user_index_array, private_slots_array);\n      return X_E_SUCCESS;\n    }\n    case 0x000B0014: {\n      // Gets 584107FB in game.\n      // get high score table?\n      XELOGD(\"XGI_unknown\");\n      return X_STATUS_SUCCESS;\n    }\n    case 0x000B0015: {\n      // send high scores?\n      XELOGD(\"XGI_unknown\");\n      return X_STATUS_SUCCESS;\n    }\n    case 0x000B0041: {\n      assert_true(!buffer_length || buffer_length == 32);\n      // 00000000 2789fecc 00000000 00000000 200491e0 00000000 200491f0 20049340\n      uint32_t user_index = xe::load_and_swap<uint32_t>(buffer + 0);\n      uint32_t context_ptr = xe::load_and_swap<uint32_t>(buffer + 16);\n      auto context =\n          context_ptr ? memory_->TranslateVirtual(context_ptr) : nullptr;\n      uint32_t context_id =\n          context ? xe::load_and_swap<uint32_t>(context + 0) : 0;\n      XELOGD(\"XGIUserGetContext({:08X}, {:08X}{:08X}))\", user_index,\n             context_ptr, context_id);\n      uint32_t value = 0;\n      if (context) {\n        xe::store_and_swap<uint32_t>(context + 4, value);\n      }\n      return X_E_FAIL;\n    }\n    case 0x000B0071: {\n      XELOGD(\"XGI 0x000B0071, unimplemented\");\n      return X_E_SUCCESS;\n    }\n  }\n  XELOGE(\n      \"Unimplemented XGI message app={:08X}, msg={:08X}, arg1={:08X}, \"\n      \"arg2={:08X}\",\n      app_id(), message, buffer_ptr, buffer_length);\n  return X_E_FAIL;\n}\n\n}  // namespace apps\n}  // namespace xam\n}  // namespace kernel\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/kernel/xam/apps/xgi_app.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2015 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_KERNEL_XAM_APPS_XGI_APP_H_\n#define XENIA_KERNEL_XAM_APPS_XGI_APP_H_\n\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/xam/app_manager.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xam {\nnamespace apps {\n\nclass XgiApp : public App {\n public:\n  explicit XgiApp(KernelState* kernel_state);\n\n  X_HRESULT DispatchMessageSync(uint32_t message, uint32_t buffer_ptr,\n                                uint32_t buffer_length) override;\n};\n\n}  // namespace apps\n}  // namespace xam\n}  // namespace kernel\n}  // namespace xe\n\n#endif  // XENIA_KERNEL_XAM_APPS_XGI_APP_H_\n"
  },
  {
    "path": "src/xenia/kernel/xam/apps/xlivebase_app.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/kernel/xam/apps/xlivebase_app.h\"\n\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/threading.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xam {\nnamespace apps {\n\nXLiveBaseApp::XLiveBaseApp(KernelState* kernel_state)\n    : App(kernel_state, 0xFC) {}\n\n// http://mb.mirage.org/bugzilla/xliveless/main.c\n\nX_HRESULT XLiveBaseApp::DispatchMessageSync(uint32_t message,\n                                            uint32_t buffer_ptr,\n                                            uint32_t buffer_length) {\n  // NOTE: buffer_length may be zero or valid.\n  auto buffer = memory_->TranslateVirtual(buffer_ptr);\n  switch (message) {\n    case 0x00058004: {\n      // Called on startup, seems to just return a bool in the buffer.\n      assert_true(!buffer_length || buffer_length == 4);\n      XELOGD(\"XLiveBaseGetLogonId({:08X})\", buffer_ptr);\n      xe::store_and_swap<uint32_t>(buffer + 0, 1);  // ?\n      return X_E_SUCCESS;\n    }\n    case 0x00058006: {\n      assert_true(!buffer_length || buffer_length == 4);\n      XELOGD(\"XLiveBaseGetNatType({:08X})\", buffer_ptr);\n      xe::store_and_swap<uint32_t>(buffer + 0, 1);  // XONLINE_NAT_OPEN\n      return X_E_SUCCESS;\n    }\n    case 0x00058007: {\n      // Occurs if title calls XOnlineGetServiceInfo, expects dwServiceId\n      // and pServiceInfo. pServiceInfo should contain pointer to\n      // XONLINE_SERVICE_INFO structure.\n      XELOGD(\"CXLiveLogon::GetServiceInfo({:08X}, {:08X})\", buffer_ptr,\n             buffer_length);\n      return 0x80151802;  // ERROR_CONNECTION_INVALID\n    }\n    case 0x00058020: {\n      // 0x00058004 is called right before this.\n      // We should create a XamEnumerate-able empty list here, but I'm not\n      // sure of the format.\n      // buffer_length seems to be the same ptr sent to 0x00058004.\n      XELOGD(\"CXLiveFriends::Enumerate({:08X}, {:08X}) unimplemented\",\n             buffer_ptr, buffer_length);\n      return X_E_FAIL;\n    }\n    case 0x00058023: {\n      XELOGD(\n          \"CXLiveMessaging::XMessageGameInviteGetAcceptedInfo({:08X}, {:08X}) \"\n          \"unimplemented\",\n          buffer_ptr, buffer_length);\n      return X_E_FAIL;\n    }\n    case 0x00058046: {\n      // Required to be successful for 4D530910 to detect signed-in profile\n      // Doesn't seem to set anything in the given buffer, probably only takes\n      // input\n      XELOGD(\"XLiveBaseUnk58046({:08X}, {:08X}) unimplemented\", buffer_ptr,\n             buffer_length);\n      return X_E_SUCCESS;\n    }\n  }\n  XELOGE(\n      \"Unimplemented XLIVEBASE message app={:08X}, msg={:08X}, arg1={:08X}, \"\n      \"arg2={:08X}\",\n      app_id(), message, buffer_ptr, buffer_length);\n  return X_E_FAIL;\n}\n\n}  // namespace apps\n}  // namespace xam\n}  // namespace kernel\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/kernel/xam/apps/xlivebase_app.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2015 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_KERNEL_XAM_APPS_XLIVEBASE_APP_H_\n#define XENIA_KERNEL_XAM_APPS_XLIVEBASE_APP_H_\n\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/xam/app_manager.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xam {\nnamespace apps {\n\nclass XLiveBaseApp : public App {\n public:\n  explicit XLiveBaseApp(KernelState* kernel_state);\n\n  X_HRESULT DispatchMessageSync(uint32_t message, uint32_t buffer_ptr,\n                                uint32_t buffer_length) override;\n};\n\n}  // namespace apps\n}  // namespace xam\n}  // namespace kernel\n}  // namespace xe\n\n#endif  // XENIA_KERNEL_XAM_APPS_XLIVEBASE_APP_H_\n"
  },
  {
    "path": "src/xenia/kernel/xam/apps/xmp_app.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/kernel/xam/apps/xmp_app.h\"\n#include \"xenia/kernel/xthread.h\"\n\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/threading.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xam {\nnamespace apps {\n\nXmpApp::XmpApp(KernelState* kernel_state)\n    : App(kernel_state, 0xFA),\n      state_(State::kIdle),\n      playback_client_(PlaybackClient::kTitle),\n      playback_mode_(PlaybackMode::kUnknown),\n      repeat_mode_(RepeatMode::kUnknown),\n      unknown_flags_(0),\n      volume_(1.0f),\n      active_playlist_(nullptr),\n      active_song_index_(0),\n      next_playlist_handle_(1),\n      next_song_handle_(1) {}\n\nX_HRESULT XmpApp::XMPGetStatus(uint32_t state_ptr) {\n  if (!XThread::GetCurrentThread()->main_thread()) {\n    // Some stupid games will hammer this on a thread - induce a delay\n    // here to keep from starving real threads.\n    xe::threading::Sleep(std::chrono::milliseconds(1));\n  }\n\n  XELOGD(\"XMPGetStatus({:08X})\", state_ptr);\n  xe::store_and_swap<uint32_t>(memory_->TranslateVirtual(state_ptr),\n                               static_cast<uint32_t>(state_));\n  return X_E_SUCCESS;\n}\n\nX_HRESULT XmpApp::XMPCreateTitlePlaylist(\n    uint32_t songs_ptr, uint32_t song_count, uint32_t playlist_name_ptr,\n    const std::u16string& playlist_name, uint32_t flags,\n    uint32_t out_song_handles, uint32_t out_playlist_handle) {\n  XELOGD(\n      \"XMPCreateTitlePlaylist({:08X}, {:08X}, {:08X}({}), {:08X}, {:08X}, \"\n      \"{:08X})\",\n      songs_ptr, song_count, playlist_name_ptr, xe::to_utf8(playlist_name),\n      flags, out_song_handles, out_playlist_handle);\n  auto playlist = std::make_unique<Playlist>();\n  playlist->handle = ++next_playlist_handle_;\n  playlist->name = playlist_name;\n  playlist->flags = flags;\n  if (songs_ptr) {\n    for (uint32_t i = 0; i < song_count; ++i) {\n      auto song = std::make_unique<Song>();\n      song->handle = ++next_song_handle_;\n      uint8_t* song_base = memory_->TranslateVirtual(songs_ptr + (i * 36));\n      song->file_path =\n          xe::load_and_swap<std::u16string>(memory_->TranslateVirtual(\n              xe::load_and_swap<uint32_t>(song_base + 0)));\n      song->name = xe::load_and_swap<std::u16string>(memory_->TranslateVirtual(\n          xe::load_and_swap<uint32_t>(song_base + 4)));\n      song->artist =\n          xe::load_and_swap<std::u16string>(memory_->TranslateVirtual(\n              xe::load_and_swap<uint32_t>(song_base + 8)));\n      song->album = xe::load_and_swap<std::u16string>(memory_->TranslateVirtual(\n          xe::load_and_swap<uint32_t>(song_base + 12)));\n      song->album_artist =\n          xe::load_and_swap<std::u16string>(memory_->TranslateVirtual(\n              xe::load_and_swap<uint32_t>(song_base + 16)));\n      song->genre = xe::load_and_swap<std::u16string>(memory_->TranslateVirtual(\n          xe::load_and_swap<uint32_t>(song_base + 20)));\n      song->track_number = xe::load_and_swap<uint32_t>(song_base + 24);\n      song->duration_ms = xe::load_and_swap<uint32_t>(song_base + 28);\n      song->format = static_cast<Song::Format>(\n          xe::load_and_swap<uint32_t>(song_base + 32));\n      if (out_song_handles) {\n        xe::store_and_swap<uint32_t>(\n            memory_->TranslateVirtual(out_song_handles + (i * 4)),\n            song->handle);\n      }\n      playlist->songs.emplace_back(std::move(song));\n    }\n  }\n  if (out_playlist_handle) {\n    xe::store_and_swap<uint32_t>(memory_->TranslateVirtual(out_playlist_handle),\n                                 playlist->handle);\n  }\n\n  auto global_lock = global_critical_region_.Acquire();\n  playlists_.insert({playlist->handle, playlist.get()});\n  playlist.release();\n  return X_E_SUCCESS;\n}\n\nX_HRESULT XmpApp::XMPDeleteTitlePlaylist(uint32_t playlist_handle) {\n  XELOGD(\"XMPDeleteTitlePlaylist({:08X})\", playlist_handle);\n  auto global_lock = global_critical_region_.Acquire();\n  auto it = playlists_.find(playlist_handle);\n  if (it == playlists_.end()) {\n    XELOGE(\"Playlist {:08X} not found\", playlist_handle);\n    return X_E_NOTFOUND;\n  }\n  auto playlist = it->second;\n  if (playlist == active_playlist_) {\n    XMPStop(0);\n  }\n  playlists_.erase(it);\n  delete playlist;\n  return X_E_SUCCESS;\n}\n\nX_HRESULT XmpApp::XMPPlayTitlePlaylist(uint32_t playlist_handle,\n                                       uint32_t song_handle) {\n  XELOGD(\"XMPPlayTitlePlaylist({:08X}, {:08X})\", playlist_handle, song_handle);\n  Playlist* playlist = nullptr;\n  {\n    auto global_lock = global_critical_region_.Acquire();\n    auto it = playlists_.find(playlist_handle);\n    if (it == playlists_.end()) {\n      XELOGE(\"Playlist {:08X} not found\", playlist_handle);\n      return X_E_NOTFOUND;\n    }\n    playlist = it->second;\n  }\n\n  if (playback_client_ == PlaybackClient::kSystem) {\n    XELOGW(\"XMPPlayTitlePlaylist: System playback is enabled!\");\n    return X_E_SUCCESS;\n  }\n\n  // Start playlist?\n  XELOGW(\"Playlist playback not supported\");\n  active_playlist_ = playlist;\n  active_song_index_ = 0;\n  state_ = State::kPlaying;\n  OnStateChanged();\n  kernel_state_->BroadcastNotification(kMsgPlaybackBehaviorChanged, 1);\n  return X_E_SUCCESS;\n}\n\nX_HRESULT XmpApp::XMPContinue() {\n  XELOGD(\"XMPContinue()\");\n  if (state_ == State::kPaused) {\n    state_ = State::kPlaying;\n  }\n  OnStateChanged();\n  return X_E_SUCCESS;\n}\n\nX_HRESULT XmpApp::XMPStop(uint32_t unk) {\n  assert_zero(unk);\n  XELOGD(\"XMPStop({:08X})\", unk);\n  active_playlist_ = nullptr;  // ?\n  active_song_index_ = 0;\n  state_ = State::kIdle;\n  OnStateChanged();\n  return X_E_SUCCESS;\n}\n\nX_HRESULT XmpApp::XMPPause() {\n  XELOGD(\"XMPPause()\");\n  if (state_ == State::kPlaying) {\n    state_ = State::kPaused;\n  }\n  OnStateChanged();\n  return X_E_SUCCESS;\n}\n\nX_HRESULT XmpApp::XMPNext() {\n  XELOGD(\"XMPNext()\");\n  if (!active_playlist_) {\n    return X_E_NOTFOUND;\n  }\n  state_ = State::kPlaying;\n  active_song_index_ =\n      (active_song_index_ + 1) % active_playlist_->songs.size();\n  OnStateChanged();\n  return X_E_SUCCESS;\n}\n\nX_HRESULT XmpApp::XMPPrevious() {\n  XELOGD(\"XMPPrevious()\");\n  if (!active_playlist_) {\n    return X_E_NOTFOUND;\n  }\n  state_ = State::kPlaying;\n  if (!active_song_index_) {\n    active_song_index_ = static_cast<int>(active_playlist_->songs.size()) - 1;\n  } else {\n    --active_song_index_;\n  }\n  OnStateChanged();\n  return X_E_SUCCESS;\n}\n\nvoid XmpApp::OnStateChanged() {\n  kernel_state_->BroadcastNotification(kMsgStateChanged,\n                                       static_cast<uint32_t>(state_));\n}\n\nX_HRESULT XmpApp::DispatchMessageSync(uint32_t message, uint32_t buffer_ptr,\n                                      uint32_t buffer_length) {\n  // NOTE: buffer_length may be zero or valid.\n  auto buffer = memory_->TranslateVirtual(buffer_ptr);\n  switch (message) {\n    case 0x00070002: {\n      assert_true(!buffer_length || buffer_length == 12);\n      uint32_t xmp_client = xe::load_and_swap<uint32_t>(buffer + 0);\n      uint32_t storage_ptr = xe::load_and_swap<uint32_t>(buffer + 4);\n      uint32_t song_handle = xe::load_and_swap<uint32_t>(buffer + 8);  // 0?\n      uint32_t playlist_handle =\n          xe::load_and_swap<uint32_t>(memory_->TranslateVirtual(storage_ptr));\n      assert_true(xmp_client == 0x00000002);\n      return XMPPlayTitlePlaylist(playlist_handle, song_handle);\n    }\n    case 0x00070003: {\n      assert_true(!buffer_length || buffer_length == 4);\n      uint32_t xmp_client = xe::load_and_swap<uint32_t>(buffer + 0);\n      assert_true(xmp_client == 0x00000002);\n      return XMPContinue();\n    }\n    case 0x00070004: {\n      assert_true(!buffer_length || buffer_length == 8);\n      uint32_t xmp_client = xe::load_and_swap<uint32_t>(buffer + 0);\n      uint32_t unk = xe::load_and_swap<uint32_t>(buffer + 4);\n      assert_true(xmp_client == 0x00000002);\n      return XMPStop(unk);\n    }\n    case 0x00070005: {\n      assert_true(!buffer_length || buffer_length == 4);\n      uint32_t xmp_client = xe::load_and_swap<uint32_t>(buffer + 0);\n      assert_true(xmp_client == 0x00000002);\n      return XMPPause();\n    }\n    case 0x00070006: {\n      assert_true(!buffer_length || buffer_length == 4);\n      uint32_t xmp_client = xe::load_and_swap<uint32_t>(buffer + 0);\n      assert_true(xmp_client == 0x00000002);\n      return XMPNext();\n    }\n    case 0x00070007: {\n      assert_true(!buffer_length || buffer_length == 4);\n      uint32_t xmp_client = xe::load_and_swap<uint32_t>(buffer + 0);\n      assert_true(xmp_client == 0x00000002);\n      return XMPPrevious();\n    }\n    case 0x00070008: {\n      assert_true(!buffer_length || buffer_length == 16);\n      struct {\n        xe::be<uint32_t> xmp_client;\n        xe::be<uint32_t> playback_mode;\n        xe::be<uint32_t> repeat_mode;\n        xe::be<uint32_t> flags;\n      }* args = memory_->TranslateVirtual<decltype(args)>(buffer_ptr);\n      static_assert_size(decltype(*args), 16);\n\n      assert_true(args->xmp_client == 0x00000002 ||\n                  args->xmp_client == 0x00000000);\n      XELOGD(\"XMPSetPlaybackBehavior({:08X}, {:08X}, {:08X})\",\n             uint32_t(args->playback_mode), uint32_t(args->repeat_mode),\n             uint32_t(args->flags));\n      playback_mode_ = static_cast<PlaybackMode>(uint32_t(args->playback_mode));\n      repeat_mode_ = static_cast<RepeatMode>(uint32_t(args->repeat_mode));\n      unknown_flags_ = args->flags;\n      kernel_state_->BroadcastNotification(kMsgPlaybackBehaviorChanged, 0);\n      return X_E_SUCCESS;\n    }\n    case 0x00070009: {\n      assert_true(!buffer_length || buffer_length == 8);\n      uint32_t xmp_client = xe::load_and_swap<uint32_t>(buffer + 0);\n      uint32_t state_ptr =\n          xe::load_and_swap<uint32_t>(buffer + 4);  // out ptr to 4b - expect 0\n      assert_true(xmp_client == 0x00000002);\n      return XMPGetStatus(state_ptr);\n    }\n    case 0x0007000B: {\n      assert_true(!buffer_length || buffer_length == 8);\n      struct {\n        xe::be<uint32_t> xmp_client;\n        xe::be<uint32_t> volume_ptr;\n      }* args = memory_->TranslateVirtual<decltype(args)>(buffer_ptr);\n      static_assert_size(decltype(*args), 8);\n\n      assert_true(args->xmp_client == 0x00000002);\n      XELOGD(\"XMPGetVolume({:08X})\", uint32_t(args->volume_ptr));\n      xe::store_and_swap<float>(memory_->TranslateVirtual(args->volume_ptr),\n                                volume_);\n      return X_E_SUCCESS;\n    }\n    case 0x0007000C: {\n      assert_true(!buffer_length || buffer_length == 8);\n      struct {\n        xe::be<uint32_t> xmp_client;\n        xe::be<float> value;\n      }* args = memory_->TranslateVirtual<decltype(args)>(buffer_ptr);\n      static_assert_size(decltype(*args), 8);\n\n      assert_true(args->xmp_client == 0x00000002);\n      XELOGD(\"XMPSetVolume({:g})\", float(args->value));\n      volume_ = args->value;\n      return X_E_SUCCESS;\n    }\n    case 0x0007000D: {\n      assert_true(!buffer_length || buffer_length == 36);\n      struct {\n        xe::be<uint32_t> xmp_client;\n        xe::be<uint32_t> storage_ptr;\n        xe::be<uint32_t> storage_size;\n        xe::be<uint32_t> songs_ptr;\n        xe::be<uint32_t> song_count;\n        xe::be<uint32_t> playlist_name_ptr;\n        xe::be<uint32_t> flags;\n        xe::be<uint32_t> song_handles_ptr;\n        xe::be<uint32_t> playlist_handle_ptr;\n      }* args = memory_->TranslateVirtual<decltype(args)>(buffer_ptr);\n      static_assert_size(decltype(*args), 36);\n\n      xe::store_and_swap<uint32_t>(\n          memory_->TranslateVirtual(args->playlist_handle_ptr),\n          args->storage_ptr);\n      assert_true(args->xmp_client == 0x00000002 ||\n                  args->xmp_client == 0x00000000);\n      std::u16string playlist_name;\n      if (!args->playlist_name_ptr) {\n        playlist_name = u\"\";\n      } else {\n        playlist_name = xe::load_and_swap<std::u16string>(\n            memory_->TranslateVirtual(args->playlist_name_ptr));\n      }\n      // dummy_alloc_ptr is the result of a XamAlloc of storage_size.\n      assert_true(uint32_t(args->storage_size) ==\n                  4 + uint32_t(args->song_count) * 128);\n      return XMPCreateTitlePlaylist(args->songs_ptr, args->song_count,\n                                    args->playlist_name_ptr, playlist_name,\n                                    args->flags, args->song_handles_ptr,\n                                    args->storage_ptr);\n    }\n    case 0x0007000E: {\n      assert_true(!buffer_length || buffer_length == 12);\n      struct {\n        xe::be<uint32_t> xmp_client;\n        xe::be<uint32_t> unk_ptr;  // 0\n        xe::be<uint32_t> info_ptr;\n      }* args = memory_->TranslateVirtual<decltype(args)>(buffer_ptr);\n      static_assert_size(decltype(*args), 12);\n\n      auto info = memory_->TranslateVirtual(args->info_ptr);\n      assert_true(args->xmp_client == 0x00000002);\n      assert_zero(args->unk_ptr);\n      XELOGE(\"XMPGetInfo?({:08X}, {:08X})\", uint32_t(args->unk_ptr),\n             uint32_t(args->info_ptr));\n      if (!active_playlist_) {\n        return X_E_FAIL;\n      }\n      auto& song = active_playlist_->songs[active_song_index_];\n      xe::store_and_swap<uint32_t>(info + 0, song->handle);\n      xe::store_and_swap<std::u16string>(info + 4 + 572 + 0, song->name);\n      xe::store_and_swap<std::u16string>(info + 4 + 572 + 40, song->artist);\n      xe::store_and_swap<std::u16string>(info + 4 + 572 + 80, song->album);\n      xe::store_and_swap<std::u16string>(info + 4 + 572 + 120,\n                                         song->album_artist);\n      xe::store_and_swap<std::u16string>(info + 4 + 572 + 160, song->genre);\n      xe::store_and_swap<uint32_t>(info + 4 + 572 + 200, song->track_number);\n      xe::store_and_swap<uint32_t>(info + 4 + 572 + 204, song->duration_ms);\n      xe::store_and_swap<uint32_t>(info + 4 + 572 + 208,\n                                   static_cast<uint32_t>(song->format));\n      return X_E_SUCCESS;\n    }\n    case 0x00070013: {\n      assert_true(!buffer_length || buffer_length == 8);\n      struct {\n        xe::be<uint32_t> xmp_client;\n        xe::be<uint32_t> storage_ptr;\n      }* args = memory_->TranslateVirtual<decltype(args)>(buffer_ptr);\n      static_assert_size(decltype(*args), 8);\n\n      uint32_t playlist_handle = xe::load_and_swap<uint32_t>(\n          memory_->TranslateVirtual(args->storage_ptr));\n      assert_true(args->xmp_client == 0x00000002 ||\n                  args->xmp_client == 0x00000000);\n      return XMPDeleteTitlePlaylist(playlist_handle);\n    }\n    case 0x0007001A: {\n      // XMPSetPlaybackController\n      assert_true(!buffer_length || buffer_length == 12);\n      struct {\n        xe::be<uint32_t> xmp_client;\n        xe::be<uint32_t> controller;\n        xe::be<uint32_t> playback_client;\n      }* args = memory_->TranslateVirtual<decltype(args)>(buffer_ptr);\n      static_assert_size(decltype(*args), 12);\n\n      assert_true(\n          (args->xmp_client == 0x00000002 && args->controller == 0x00000000) ||\n          (args->xmp_client == 0x00000000 && args->controller == 0x00000001));\n      XELOGD(\"XMPSetPlaybackController({:08X}, {:08X})\",\n             uint32_t(args->controller), uint32_t(args->playback_client));\n\n      playback_client_ = PlaybackClient(uint32_t(args->playback_client));\n      kernel_state_->BroadcastNotification(kMsgPlaybackControllerChanged,\n                                           !args->playback_client);\n      return X_E_SUCCESS;\n    }\n    case 0x0007001B: {\n      // XMPGetPlaybackController\n      assert_true(!buffer_length || buffer_length == 12);\n      struct {\n        xe::be<uint32_t> xmp_client;\n        xe::be<uint32_t> controller_ptr;\n        xe::be<uint32_t> locked_ptr;\n      }* args = memory_->TranslateVirtual<decltype(args)>(buffer_ptr);\n      static_assert_size(decltype(*args), 12);\n\n      assert_true(args->xmp_client == 0x00000002);\n      XELOGD(\"XMPGetPlaybackController({:08X}, {:08X}, {:08X})\",\n             uint32_t(args->xmp_client), uint32_t(args->controller_ptr),\n             uint32_t(args->locked_ptr));\n      xe::store_and_swap<uint32_t>(\n          memory_->TranslateVirtual(args->controller_ptr), 0);\n      xe::store_and_swap<uint32_t>(memory_->TranslateVirtual(args->locked_ptr),\n                                   0);\n\n      if (!XThread::GetCurrentThread()->main_thread()) {\n        // Atrain spawns a thread 82437FD0 to call this in a tight loop forever.\n        xe::threading::Sleep(std::chrono::milliseconds(10));\n      }\n\n      return X_E_SUCCESS;\n    }\n    case 0x00070029: {\n      // XMPGetPlaybackBehavior\n      assert_true(!buffer_length || buffer_length == 16);\n      struct {\n        xe::be<uint32_t> xmp_client;\n        xe::be<uint32_t> playback_mode_ptr;\n        xe::be<uint32_t> repeat_mode_ptr;\n        xe::be<uint32_t> unk3_ptr;\n      }* args = memory_->TranslateVirtual<decltype(args)>(buffer_ptr);\n      static_assert_size(decltype(*args), 16);\n\n      assert_true(args->xmp_client == 0x00000002 ||\n                  args->xmp_client == 0x00000000);\n      XELOGD(\"XMPGetPlaybackBehavior({:08X}, {:08X}, {:08X})\",\n             uint32_t(args->playback_mode_ptr), uint32_t(args->repeat_mode_ptr),\n             uint32_t(args->unk3_ptr));\n      if (args->playback_mode_ptr) {\n        xe::store_and_swap<uint32_t>(\n            memory_->TranslateVirtual(args->playback_mode_ptr),\n            static_cast<uint32_t>(playback_mode_));\n      }\n      if (args->repeat_mode_ptr) {\n        xe::store_and_swap<uint32_t>(\n            memory_->TranslateVirtual(args->repeat_mode_ptr),\n            static_cast<uint32_t>(repeat_mode_));\n      }\n      if (args->unk3_ptr) {\n        xe::store_and_swap<uint32_t>(memory_->TranslateVirtual(args->unk3_ptr),\n                                     unknown_flags_);\n      }\n      return X_E_SUCCESS;\n    }\n    case 0x0007002E: {\n      assert_true(!buffer_length || buffer_length == 12);\n      // Query of size for XamAlloc - the result of the alloc is passed to\n      // 0x0007000D.\n      struct {\n        xe::be<uint32_t> xmp_client;\n        xe::be<uint32_t> song_count;\n        xe::be<uint32_t> size_ptr;\n      }* args = memory_->TranslateVirtual<decltype(args)>(buffer_ptr);\n      static_assert_size(decltype(*args), 12);\n\n      assert_true(args->xmp_client == 0x00000002 ||\n                  args->xmp_client == 0x00000000);\n      // We don't use the storage, so just fudge the number.\n      xe::store_and_swap<uint32_t>(memory_->TranslateVirtual(args->size_ptr),\n                                   4 + uint32_t(args->song_count) * 128);\n      return X_E_SUCCESS;\n    }\n    case 0x0007003D: {\n      // XMPCaptureOutput - not sure how this works :/\n      XELOGD(\"XMPCaptureOutput(...)\");\n      assert_always(\"XMP output not unimplemented\");\n      return X_E_FAIL;\n    }\n  }\n  XELOGE(\n      \"Unimplemented XMP message app={:08X}, msg={:08X}, arg1={:08X}, \"\n      \"arg2={:08X}\",\n      app_id(), message, buffer_ptr, buffer_length);\n  return X_E_FAIL;\n}\n\n}  // namespace apps\n}  // namespace xam\n}  // namespace kernel\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/kernel/xam/apps/xmp_app.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_KERNEL_XAM_APPS_XMP_APP_H_\n#define XENIA_KERNEL_XAM_APPS_XMP_APP_H_\n\n#include <memory>\n#include <string>\n#include <unordered_map>\n#include <vector>\n\n#include \"xenia/base/mutex.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/xam/app_manager.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xam {\nnamespace apps {\n\n// Only source of docs for a lot of these functions:\n// https://github.com/oukiar/freestyledash/blob/master/Freestyle/Scenes/Media/Music/ScnMusic.cpp\n\nclass XmpApp : public App {\n public:\n  enum class State : uint32_t {\n    kIdle = 0,\n    kPlaying = 1,\n    kPaused = 2,\n  };\n  enum class PlaybackClient : uint32_t {\n    kSystem = 0,\n    kTitle = 1,\n  };\n  enum class PlaybackMode : uint32_t {\n    // kInOrder = ?,\n    kUnknown = 0,\n  };\n  enum class RepeatMode : uint32_t {\n    // kNoRepeat = ?,\n    kUnknown = 0,\n  };\n  struct Song {\n    enum class Format : uint32_t {\n      kWma = 0,\n      kMp3 = 1,\n    };\n\n    uint32_t handle;\n    std::u16string file_path;\n    std::u16string name;\n    std::u16string artist;\n    std::u16string album;\n    std::u16string album_artist;\n    std::u16string genre;\n    uint32_t track_number;\n    uint32_t duration_ms;\n    Format format;\n  };\n  struct Playlist {\n    uint32_t handle;\n    std::u16string name;\n    uint32_t flags;\n    std::vector<std::unique_ptr<Song>> songs;\n  };\n\n  explicit XmpApp(KernelState* kernel_state);\n\n  X_HRESULT XMPGetStatus(uint32_t status_ptr);\n\n  X_HRESULT XMPCreateTitlePlaylist(uint32_t songs_ptr, uint32_t song_count,\n                                   uint32_t playlist_name_ptr,\n                                   const std::u16string& playlist_name,\n                                   uint32_t flags, uint32_t out_song_handles,\n                                   uint32_t out_playlist_handle);\n  X_HRESULT XMPDeleteTitlePlaylist(uint32_t playlist_handle);\n  X_HRESULT XMPPlayTitlePlaylist(uint32_t playlist_handle,\n                                 uint32_t song_handle);\n  X_HRESULT XMPContinue();\n  X_HRESULT XMPStop(uint32_t unk);\n  X_HRESULT XMPPause();\n  X_HRESULT XMPNext();\n  X_HRESULT XMPPrevious();\n\n  X_HRESULT DispatchMessageSync(uint32_t message, uint32_t buffer_ptr,\n                                uint32_t buffer_length) override;\n\n private:\n  static const uint32_t kMsgStateChanged = 0x0A000001;\n  static const uint32_t kMsgPlaybackBehaviorChanged = 0x0A000002;\n  static const uint32_t kMsgPlaybackControllerChanged = 0x0A000003;\n\n  void OnStateChanged();\n\n  State state_;\n  PlaybackClient playback_client_;\n  PlaybackMode playback_mode_;\n  RepeatMode repeat_mode_;\n  uint32_t unknown_flags_;\n  float volume_;\n  Playlist* active_playlist_;\n  int active_song_index_;\n\n  xe::global_critical_region global_critical_region_;\n  std::unordered_map<uint32_t, Playlist*> playlists_;\n  uint32_t next_playlist_handle_;\n  uint32_t next_song_handle_;\n};\n\n}  // namespace apps\n}  // namespace xam\n}  // namespace kernel\n}  // namespace xe\n\n#endif  // XENIA_KERNEL_XAM_APPS_XMP_APP_H_\n"
  },
  {
    "path": "src/xenia/kernel/xam/content_manager.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/kernel/xam/content_manager.h\"\n\n#include <string>\n\n#include \"third_party/fmt/include/fmt/format.h\"\n#include \"xenia/base/filesystem.h\"\n#include \"xenia/base/string.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/xfile.h\"\n#include \"xenia/kernel/xobject.h\"\n#include \"xenia/vfs/devices/host_path_device.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xam {\n\nstatic const char* kThumbnailFileName = \"__thumbnail.png\";\n\nstatic const char* kGameUserContentDirName = \"profile\";\n\nstatic int content_device_id_ = 0;\n\nContentPackage::ContentPackage(KernelState* kernel_state,\n                               const std::string_view root_name,\n                               const XCONTENT_AGGREGATE_DATA& data,\n                               const std::filesystem::path& package_path)\n    : kernel_state_(kernel_state), root_name_(root_name) {\n  device_path_ = fmt::format(\"\\\\Device\\\\Content\\\\{0}\\\\\", ++content_device_id_);\n  content_data_ = data;\n\n  auto fs = kernel_state_->file_system();\n  auto device =\n      std::make_unique<vfs::HostPathDevice>(device_path_, package_path, false);\n  device->Initialize();\n  fs->RegisterDevice(std::move(device));\n  fs->RegisterSymbolicLink(root_name_ + \":\", device_path_);\n}\n\nContentPackage::~ContentPackage() {\n  auto fs = kernel_state_->file_system();\n  fs->UnregisterSymbolicLink(root_name_ + \":\");\n  fs->UnregisterDevice(device_path_);\n}\n\nContentManager::ContentManager(KernelState* kernel_state,\n                               const std::filesystem::path& root_path)\n    : kernel_state_(kernel_state), root_path_(root_path) {}\n\nContentManager::~ContentManager() = default;\n\nstd::filesystem::path ContentManager::ResolvePackageRoot(\n    XContentType content_type, uint32_t title_id) {\n  if (title_id == kCurrentlyRunningTitleId) {\n    title_id = kernel_state_->title_id();\n  }\n  auto title_id_str = fmt::format(\"{:08X}\", title_id);\n  auto content_type_str = fmt::format(\"{:08X}\", uint32_t(content_type));\n\n  // Package root path:\n  // content_root/title_id/content_type/\n  return root_path_ / title_id_str / content_type_str;\n}\n\nstd::filesystem::path ContentManager::ResolvePackagePath(\n    const XCONTENT_AGGREGATE_DATA& data) {\n  // Content path:\n  // content_root/title_id/content_type/data_file_name/\n  auto package_root = ResolvePackageRoot(data.content_type, data.title_id);\n  return package_root / xe::to_path(data.file_name());\n}\n\nstd::vector<XCONTENT_AGGREGATE_DATA> ContentManager::ListContent(\n    uint32_t device_id, XContentType content_type, uint32_t title_id) {\n  std::vector<XCONTENT_AGGREGATE_DATA> result;\n\n  if (title_id == kCurrentlyRunningTitleId) {\n    title_id = kernel_state_->title_id();\n  }\n\n  // Search path:\n  // content_root/title_id/type_name/*\n  auto package_root = ResolvePackageRoot(content_type, title_id);\n  auto file_infos = xe::filesystem::ListFiles(package_root);\n  for (const auto& file_info : file_infos) {\n    if (file_info.type != xe::filesystem::FileInfo::Type::kDirectory) {\n      // Directories only.\n      continue;\n    }\n    XCONTENT_AGGREGATE_DATA content_data;\n    content_data.device_id = device_id;\n    content_data.content_type = content_type;\n    content_data.set_display_name(xe::path_to_utf16(file_info.name));\n    content_data.set_file_name(xe::path_to_utf8(file_info.name));\n    content_data.title_id = title_id;\n    result.emplace_back(std::move(content_data));\n  }\n\n  return result;\n}\n\nstd::unique_ptr<ContentPackage> ContentManager::ResolvePackage(\n    const std::string_view root_name, const XCONTENT_AGGREGATE_DATA& data) {\n  auto package_path = ResolvePackagePath(data);\n  if (!std::filesystem::exists(package_path)) {\n    return nullptr;\n  }\n\n  auto global_lock = global_critical_region_.Acquire();\n\n  auto package = std::make_unique<ContentPackage>(kernel_state_, root_name,\n                                                  data, package_path);\n  return package;\n}\n\nbool ContentManager::ContentExists(const XCONTENT_AGGREGATE_DATA& data) {\n  auto path = ResolvePackagePath(data);\n  return std::filesystem::exists(path);\n}\n\nX_RESULT ContentManager::CreateContent(const std::string_view root_name,\n                                       const XCONTENT_AGGREGATE_DATA& data) {\n  auto global_lock = global_critical_region_.Acquire();\n\n  if (open_packages_.count(string_key(root_name))) {\n    // Already content open with this root name.\n    return X_ERROR_ALREADY_EXISTS;\n  }\n\n  auto package_path = ResolvePackagePath(data);\n  if (std::filesystem::exists(package_path)) {\n    // Exists, must not!\n    return X_ERROR_ALREADY_EXISTS;\n  }\n\n  if (!std::filesystem::create_directories(package_path)) {\n    return X_ERROR_ACCESS_DENIED;\n  }\n\n  auto package = ResolvePackage(root_name, data);\n  assert_not_null(package);\n\n  open_packages_.insert({string_key::create(root_name), package.release()});\n\n  return X_ERROR_SUCCESS;\n}\n\nX_RESULT ContentManager::OpenContent(const std::string_view root_name,\n                                     const XCONTENT_AGGREGATE_DATA& data) {\n  auto global_lock = global_critical_region_.Acquire();\n\n  if (open_packages_.count(string_key(root_name))) {\n    // Already content open with this root name.\n    return X_ERROR_ALREADY_EXISTS;\n  }\n\n  auto package_path = ResolvePackagePath(data);\n  if (!std::filesystem::exists(package_path)) {\n    // Does not exist, must be created.\n    return X_ERROR_FILE_NOT_FOUND;\n  }\n\n  // Open package.\n  auto package = ResolvePackage(root_name, data);\n  assert_not_null(package);\n\n  open_packages_.insert({string_key::create(root_name), package.release()});\n\n  return X_ERROR_SUCCESS;\n}\n\nX_RESULT ContentManager::CloseContent(const std::string_view root_name) {\n  auto global_lock = global_critical_region_.Acquire();\n\n  auto it = open_packages_.find(string_key(root_name));\n  if (it == open_packages_.end()) {\n    return X_ERROR_FILE_NOT_FOUND;\n  }\n  CloseOpenedFilesFromContent(root_name);\n\n  auto package = it->second;\n  open_packages_.erase(it);\n  delete package;\n\n  return X_ERROR_SUCCESS;\n}\n\nX_RESULT ContentManager::GetContentThumbnail(\n    const XCONTENT_AGGREGATE_DATA& data, std::vector<uint8_t>* buffer) {\n  auto global_lock = global_critical_region_.Acquire();\n  auto package_path = ResolvePackagePath(data);\n  auto thumb_path = package_path / kThumbnailFileName;\n  if (std::filesystem::exists(thumb_path)) {\n    auto file = xe::filesystem::OpenFile(thumb_path, \"rb\");\n    fseek(file, 0, SEEK_END);\n    size_t file_len = ftell(file);\n    fseek(file, 0, SEEK_SET);\n    buffer->resize(file_len);\n    fread(const_cast<uint8_t*>(buffer->data()), 1, buffer->size(), file);\n    fclose(file);\n    return X_ERROR_SUCCESS;\n  } else {\n    return X_ERROR_FILE_NOT_FOUND;\n  }\n}\n\nX_RESULT ContentManager::SetContentThumbnail(\n    const XCONTENT_AGGREGATE_DATA& data, std::vector<uint8_t> buffer) {\n  auto global_lock = global_critical_region_.Acquire();\n  auto package_path = ResolvePackagePath(data);\n  std::filesystem::create_directories(package_path);\n  if (std::filesystem::exists(package_path)) {\n    auto thumb_path = package_path / kThumbnailFileName;\n    auto file = xe::filesystem::OpenFile(thumb_path, \"wb\");\n    fwrite(buffer.data(), 1, buffer.size(), file);\n    fclose(file);\n    return X_ERROR_SUCCESS;\n  } else {\n    return X_ERROR_FILE_NOT_FOUND;\n  }\n}\n\nX_RESULT ContentManager::DeleteContent(const XCONTENT_AGGREGATE_DATA& data) {\n  auto global_lock = global_critical_region_.Acquire();\n\n  if (IsContentOpen(data)) {\n    // TODO(Gliniak): Get real error code for this case.\n    return X_ERROR_ACCESS_DENIED;\n  }\n\n  auto package_path = ResolvePackagePath(data);\n  if (std::filesystem::remove_all(package_path) > 0) {\n    return X_ERROR_SUCCESS;\n  } else {\n    return X_ERROR_FILE_NOT_FOUND;\n  }\n}\n\nstd::filesystem::path ContentManager::ResolveGameUserContentPath() {\n  auto title_id = fmt::format(\"{:08X}\", kernel_state_->title_id());\n  auto user_name = xe::to_path(kernel_state_->user_profile()->name());\n\n  // Per-game per-profile data location:\n  // content_root/title_id/profile/user_name\n  return root_path_ / title_id / kGameUserContentDirName / user_name;\n}\n\nbool ContentManager::IsContentOpen(const XCONTENT_AGGREGATE_DATA& data) const {\n  return std::any_of(open_packages_.cbegin(), open_packages_.cend(),\n                     [data](std::pair<string_key, ContentPackage*> content) {\n                       return data == content.second->GetPackageContentData();\n                     });\n}\n\nvoid ContentManager::CloseOpenedFilesFromContent(\n    const std::string_view root_name) {\n  // TODO(Gliniak): Cleanup this code to care only about handles\n  // related to provided content\n  const std::vector<object_ref<XFile>> all_files_handles =\n      kernel_state_->object_table()->GetObjectsByType<XFile>(\n          XObject::Type::File);\n\n  std::string resolved_path = \"\";\n  kernel_state_->file_system()->FindSymbolicLink(std::string(root_name) + ':',\n                                                 resolved_path);\n\n  for (const object_ref<XFile>& file : all_files_handles) {\n    std::string file_path = file->entry()->absolute_path();\n    bool is_file_inside_content = utf8::starts_with(file_path, resolved_path);\n\n    if (is_file_inside_content) {\n      file->ReleaseHandle();\n    }\n  }\n}\n\n}  // namespace xam\n}  // namespace kernel\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/kernel/xam/content_manager.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_KERNEL_XAM_CONTENT_MANAGER_H_\n#define XENIA_KERNEL_XAM_CONTENT_MANAGER_H_\n\n#include <memory>\n#include <string>\n#include <unordered_map>\n#include <vector>\n\n#include \"xenia/base/memory.h\"\n#include \"xenia/base/mutex.h\"\n#include \"xenia/base/string_key.h\"\n#include \"xenia/base/string_util.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace kernel {\nclass KernelState;\n}  // namespace kernel\n}  // namespace xe\n\nnamespace xe {\nnamespace kernel {\nnamespace xam {\n\n// If set in XCONTENT_AGGREGATE_DATA, will be substituted with the running\n// titles ID\n// TODO: check if actual x360 kernel/xam has a value similar to this\nconstexpr uint32_t kCurrentlyRunningTitleId = 0xFFFFFFFF;\n\nstruct XCONTENT_DATA {\n  be<uint32_t> device_id;\n  be<XContentType> content_type;\n  union {\n    // this should be be<uint16_t>, but that stops copy constructor being\n    // generated...\n    uint16_t uint[128];\n    char16_t chars[128];\n  } display_name_raw;\n\n  char file_name_raw[42];\n\n  // Some games use this padding field as a null-terminator, as eg.\n  // DLC packages usually fill the entire file_name_raw array\n  // Not every game sets it to 0 though, so make sure any file_name_raw reads\n  // only go up to 42 chars!\n  uint8_t padding[2];\n\n  bool operator==(const XCONTENT_DATA& other) const {\n    // Package is located via device_id/content_type/file_name, so only need to\n    // compare those\n    return device_id == other.device_id && content_type == other.content_type &&\n           file_name() == other.file_name();\n  }\n\n  std::u16string display_name() const {\n    return load_and_swap<std::u16string>(display_name_raw.uint);\n  }\n\n  std::string file_name() const {\n    std::string value;\n    value.assign(file_name_raw,\n                 std::min(strlen(file_name_raw), countof(file_name_raw)));\n    return value;\n  }\n\n  void set_display_name(const std::u16string_view value) {\n    // Some games (e.g. 584108A9) require multiple null-terminators for it to\n    // read the string properly, blanking the array should take care of that\n\n    std::fill_n(display_name_raw.chars, countof(display_name_raw.chars), 0);\n    string_util::copy_and_swap_truncating(display_name_raw.chars, value,\n                                          countof(display_name_raw.chars));\n  }\n\n  void set_file_name(const std::string_view value) {\n    std::fill_n(file_name_raw, countof(file_name_raw), 0);\n    string_util::copy_maybe_truncating<string_util::Safety::IKnowWhatIAmDoing>(\n        file_name_raw, value, xe::countof(file_name_raw));\n\n    // Some games rely on padding field acting as a null-terminator...\n    padding[0] = padding[1] = 0;\n  }\n};\nstatic_assert_size(XCONTENT_DATA, 0x134);\n\nstruct XCONTENT_AGGREGATE_DATA : XCONTENT_DATA {\n  be<uint64_t> unk134;  // some titles store XUID here?\n  be<uint32_t> title_id;\n\n  XCONTENT_AGGREGATE_DATA() = default;\n  XCONTENT_AGGREGATE_DATA(const XCONTENT_DATA& other) {\n    device_id = other.device_id;\n    content_type = other.content_type;\n    set_display_name(other.display_name());\n    set_file_name(other.file_name());\n    padding[0] = padding[1] = 0;\n    unk134 = 0;\n    title_id = kCurrentlyRunningTitleId;\n  }\n\n  bool operator==(const XCONTENT_AGGREGATE_DATA& other) const {\n    // Package is located via device_id/title_id/content_type/file_name, so only\n    // need to compare those\n    return device_id == other.device_id && title_id == other.title_id &&\n           content_type == other.content_type &&\n           file_name() == other.file_name();\n  }\n};\nstatic_assert_size(XCONTENT_AGGREGATE_DATA, 0x148);\n\nclass ContentPackage {\n public:\n  ContentPackage(KernelState* kernel_state, const std::string_view root_name,\n                 const XCONTENT_AGGREGATE_DATA& data,\n                 const std::filesystem::path& package_path);\n  ~ContentPackage();\n\n  const XCONTENT_AGGREGATE_DATA& GetPackageContentData() const {\n    return content_data_;\n  }\n\n private:\n  KernelState* kernel_state_;\n  std::string root_name_;\n  std::string device_path_;\n  XCONTENT_AGGREGATE_DATA content_data_;\n};\n\nclass ContentManager {\n public:\n  ContentManager(KernelState* kernel_state,\n                 const std::filesystem::path& root_path);\n  ~ContentManager();\n\n  std::vector<XCONTENT_AGGREGATE_DATA> ListContent(uint32_t device_id,\n                                                   XContentType content_type,\n                                                   uint32_t title_id = -1);\n\n  std::unique_ptr<ContentPackage> ResolvePackage(\n      const std::string_view root_name, const XCONTENT_AGGREGATE_DATA& data);\n\n  bool ContentExists(const XCONTENT_AGGREGATE_DATA& data);\n  X_RESULT CreateContent(const std::string_view root_name,\n                         const XCONTENT_AGGREGATE_DATA& data);\n  X_RESULT OpenContent(const std::string_view root_name,\n                       const XCONTENT_AGGREGATE_DATA& data);\n  X_RESULT CloseContent(const std::string_view root_name);\n  X_RESULT GetContentThumbnail(const XCONTENT_AGGREGATE_DATA& data,\n                               std::vector<uint8_t>* buffer);\n  X_RESULT SetContentThumbnail(const XCONTENT_AGGREGATE_DATA& data,\n                               std::vector<uint8_t> buffer);\n  X_RESULT DeleteContent(const XCONTENT_AGGREGATE_DATA& data);\n  std::filesystem::path ResolveGameUserContentPath();\n  bool IsContentOpen(const XCONTENT_AGGREGATE_DATA& data) const;\n  void CloseOpenedFilesFromContent(const std::string_view root_name);\n\n private:\n  std::filesystem::path ResolvePackageRoot(XContentType content_type,\n                                           uint32_t title_id = -1);\n  std::filesystem::path ResolvePackagePath(const XCONTENT_AGGREGATE_DATA& data);\n\n  KernelState* kernel_state_;\n  std::filesystem::path root_path_;\n\n  // TODO(benvanik): remove use of global lock, it's bad here!\n  xe::global_critical_region global_critical_region_;\n  std::unordered_map<string_key, ContentPackage*> open_packages_;\n};\n\n}  // namespace xam\n}  // namespace kernel\n}  // namespace xe\n\n#endif  // XENIA_KERNEL_XAM_CONTENT_MANAGER_H_\n"
  },
  {
    "path": "src/xenia/kernel/xam/user_profile.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/kernel/xam/user_profile.h\"\n\n#include <sstream>\n\n#include \"third_party/fmt/include/fmt/format.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/util/shim_utils.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xam {\n\nUserProfile::UserProfile() {\n  // 58410A1F checks the user XUID against a mask of 0x00C0000000000000 (3<<54),\n  // if non-zero, it prevents the user from playing the game.\n  // \"You do not have permissions to perform this operation.\"\n  xuid_ = 0xB13EBABEBABEBABE;\n  name_ = \"User\";\n\n  // https://cs.rin.ru/forum/viewtopic.php?f=38&t=60668&hilit=gfwl+live&start=195\n  // https://github.com/arkem/py360/blob/master/py360/constants.py\n  // XPROFILE_GAMER_YAXIS_INVERSION\n  AddSetting(std::make_unique<Int32Setting>(0x10040002, 0));\n  // XPROFILE_OPTION_CONTROLLER_VIBRATION\n  AddSetting(std::make_unique<Int32Setting>(0x10040003, 3));\n  // XPROFILE_GAMERCARD_ZONE\n  AddSetting(std::make_unique<Int32Setting>(0x10040004, 0));\n  // XPROFILE_GAMERCARD_REGION\n  AddSetting(std::make_unique<Int32Setting>(0x10040005, 0));\n  // XPROFILE_GAMERCARD_CRED\n  AddSetting(std::make_unique<Int32Setting>(0x10040006, 0xFA));\n  // XPROFILE_GAMERCARD_REP\n  AddSetting(std::make_unique<FloatSetting>(0x5004000B, 0.0f));\n  // XPROFILE_OPTION_VOICE_MUTED\n  AddSetting(std::make_unique<Int32Setting>(0x1004000C, 0));\n  // XPROFILE_OPTION_VOICE_THRU_SPEAKERS\n  AddSetting(std::make_unique<Int32Setting>(0x1004000D, 0));\n  // XPROFILE_OPTION_VOICE_VOLUME\n  AddSetting(std::make_unique<Int32Setting>(0x1004000E, 0x64));\n  // XPROFILE_GAMERCARD_MOTTO\n  AddSetting(std::make_unique<UnicodeSetting>(0x402C0011, u\"\"));\n  // XPROFILE_GAMERCARD_TITLES_PLAYED\n  AddSetting(std::make_unique<Int32Setting>(0x10040012, 1));\n  // XPROFILE_GAMERCARD_ACHIEVEMENTS_EARNED\n  AddSetting(std::make_unique<Int32Setting>(0x10040013, 0));\n  // XPROFILE_GAMER_DIFFICULTY\n  AddSetting(std::make_unique<Int32Setting>(0x10040015, 0));\n  // XPROFILE_GAMER_CONTROL_SENSITIVITY\n  AddSetting(std::make_unique<Int32Setting>(0x10040018, 0));\n  // Preferred color 1\n  AddSetting(std::make_unique<Int32Setting>(0x1004001D, 0xFFFF0000u));\n  // Preferred color 2\n  AddSetting(std::make_unique<Int32Setting>(0x1004001E, 0xFF00FF00u));\n  // XPROFILE_GAMER_ACTION_AUTO_AIM\n  AddSetting(std::make_unique<Int32Setting>(0x10040022, 1));\n  // XPROFILE_GAMER_ACTION_AUTO_CENTER\n  AddSetting(std::make_unique<Int32Setting>(0x10040023, 0));\n  // XPROFILE_GAMER_ACTION_MOVEMENT_CONTROL\n  AddSetting(std::make_unique<Int32Setting>(0x10040024, 0));\n  // XPROFILE_GAMER_RACE_TRANSMISSION\n  AddSetting(std::make_unique<Int32Setting>(0x10040026, 0));\n  // XPROFILE_GAMER_RACE_CAMERA_LOCATION\n  AddSetting(std::make_unique<Int32Setting>(0x10040027, 0));\n  // XPROFILE_GAMER_RACE_BRAKE_CONTROL\n  AddSetting(std::make_unique<Int32Setting>(0x10040028, 0));\n  // XPROFILE_GAMER_RACE_ACCELERATOR_CONTROL\n  AddSetting(std::make_unique<Int32Setting>(0x10040029, 0));\n  // XPROFILE_GAMERCARD_TITLE_CRED_EARNED\n  AddSetting(std::make_unique<Int32Setting>(0x10040038, 0));\n  // XPROFILE_GAMERCARD_TITLE_ACHIEVEMENTS_EARNED\n  AddSetting(std::make_unique<Int32Setting>(0x10040039, 0));\n\n  // If we set this, games will try to get it.\n  // XPROFILE_GAMERCARD_PICTURE_KEY\n  AddSetting(\n      std::make_unique<UnicodeSetting>(0x4064000F, u\"gamercard_picture_key\"));\n\n  // XPROFILE_TITLE_SPECIFIC1\n  AddSetting(std::make_unique<BinarySetting>(0x63E83FFF));\n  // XPROFILE_TITLE_SPECIFIC2\n  AddSetting(std::make_unique<BinarySetting>(0x63E83FFE));\n  // XPROFILE_TITLE_SPECIFIC3\n  AddSetting(std::make_unique<BinarySetting>(0x63E83FFD));\n}\n\nvoid UserProfile::AddSetting(std::unique_ptr<Setting> setting) {\n  Setting* previous_setting = setting.get();\n  std::swap(settings_[setting->setting_id], previous_setting);\n\n  if (setting->is_set && setting->is_title_specific()) {\n    SaveSetting(setting.get());\n  }\n\n  if (previous_setting) {\n    // replace: swap out the old setting from the owning list\n    for (auto vec_it = setting_list_.begin(); vec_it != setting_list_.end();\n         ++vec_it) {\n      if (vec_it->get() == previous_setting) {\n        vec_it->swap(setting);\n        break;\n      }\n    }\n  } else {\n    // new setting: add to the owning list\n    setting_list_.push_back(std::move(setting));\n  }\n}\n\nUserProfile::Setting* UserProfile::GetSetting(uint32_t setting_id) {\n  const auto& it = settings_.find(setting_id);\n  if (it == settings_.end()) {\n    return nullptr;\n  }\n  UserProfile::Setting* setting = it->second;\n  if (setting->is_title_specific()) {\n    // If what we have loaded in memory isn't for the title that is running\n    // right now, then load it from disk.\n    if (kernel_state()->title_id() != setting->loaded_title_id) {\n      LoadSetting(setting);\n    }\n  }\n  return setting;\n}\n\nvoid UserProfile::LoadSetting(UserProfile::Setting* setting) {\n  if (setting->is_title_specific()) {\n    auto content_dir =\n        kernel_state()->content_manager()->ResolveGameUserContentPath();\n    auto setting_id = fmt::format(\"{:08X}\", setting->setting_id);\n    auto file_path = content_dir / setting_id;\n    auto file = xe::filesystem::OpenFile(file_path, \"rb\");\n    if (file) {\n      fseek(file, 0, SEEK_END);\n      uint32_t input_file_size = static_cast<uint32_t>(ftell(file));\n      fseek(file, 0, SEEK_SET);\n\n      std::vector<uint8_t> serialized_data(input_file_size);\n      fread(serialized_data.data(), 1, serialized_data.size(), file);\n      fclose(file);\n      setting->Deserialize(serialized_data);\n      setting->loaded_title_id = kernel_state()->title_id();\n    }\n  } else {\n    // Unsupported for now.  Other settings aren't per-game and need to be\n    // stored some other way.\n    XELOGW(\"Attempting to load unsupported profile setting from disk\");\n  }\n}\n\nvoid UserProfile::SaveSetting(UserProfile::Setting* setting) {\n  if (setting->is_title_specific()) {\n    auto serialized_setting = setting->Serialize();\n    auto content_dir =\n        kernel_state()->content_manager()->ResolveGameUserContentPath();\n    std::filesystem::create_directories(content_dir);\n    auto setting_id = fmt::format(\"{:08X}\", setting->setting_id);\n    auto file_path = content_dir / setting_id;\n    auto file = xe::filesystem::OpenFile(file_path, \"wb\");\n    fwrite(serialized_setting.data(), 1, serialized_setting.size(), file);\n    fclose(file);\n  } else {\n    // Unsupported for now.  Other settings aren't per-game and need to be\n    // stored some other way.\n    XELOGW(\"Attempting to save unsupported profile setting to disk\");\n  }\n}\n\n}  // namespace xam\n}  // namespace kernel\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/kernel/xam/user_profile.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_KERNEL_XAM_USER_PROFILE_H_\n#define XENIA_KERNEL_XAM_USER_PROFILE_H_\n\n#include <memory>\n#include <string>\n#include <unordered_map>\n#include <vector>\n\n#include \"xenia/base/byte_stream.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xam {\n\nstruct X_USER_PROFILE_SETTING_DATA {\n  // UserProfile::Setting::Type. Appears to be 8-in-32 field, and the upper 24\n  // are not always zeroed by the game.\n  uint8_t type;\n  uint8_t unk_1[3];\n  xe::be<uint32_t> unk_4;\n  // TODO(sabretooth): not sure if this is a union, but it seems likely.\n  // Haven't run into cases other than \"binary data\" yet.\n  union {\n    xe::be<int32_t> s32;\n    xe::be<int64_t> s64;\n    xe::be<uint32_t> u32;\n    xe::be<double> f64;\n    struct {\n      xe::be<uint32_t> size;\n      xe::be<uint32_t> ptr;\n    } unicode;\n    xe::be<float> f32;\n    struct {\n      xe::be<uint32_t> size;\n      xe::be<uint32_t> ptr;\n    } binary;\n    xe::be<uint64_t> filetime;\n  };\n};\nstatic_assert_size(X_USER_PROFILE_SETTING_DATA, 16);\n\nstruct X_USER_PROFILE_SETTING {\n  xe::be<uint32_t> from;\n  xe::be<uint32_t> unk04;\n  union {\n    xe::be<uint32_t> user_index;\n    xe::be<uint64_t> xuid;\n  };\n  xe::be<uint32_t> setting_id;\n  xe::be<uint32_t> unk14;\n  union {\n    uint8_t data_bytes[sizeof(X_USER_PROFILE_SETTING_DATA)];\n    X_USER_PROFILE_SETTING_DATA data;\n  };\n};\nstatic_assert_size(X_USER_PROFILE_SETTING, 40);\n\nclass UserProfile {\n public:\n  class SettingByteStream : public ByteStream {\n   public:\n    SettingByteStream(uint32_t ptr, uint8_t* data, size_t data_length,\n                      size_t offset = 0)\n        : ByteStream(data, data_length, offset), ptr_(ptr) {}\n\n    uint32_t ptr() const { return static_cast<uint32_t>(ptr_ + offset()); }\n\n   private:\n    uint32_t ptr_;\n  };\n  struct Setting {\n    enum class Type {\n      CONTENT = 0,\n      INT32 = 1,\n      INT64 = 2,\n      DOUBLE = 3,\n      WSTRING = 4,\n      FLOAT = 5,\n      BINARY = 6,\n      DATETIME = 7,\n      UNSET = 0xFF,\n    };\n    union Key {\n      uint32_t value;\n      struct {\n        uint32_t id : 14;\n        uint32_t unk : 2;\n        uint32_t size : 12;\n        uint32_t type : 4;\n      };\n    };\n    uint32_t setting_id;\n    Type type;\n    size_t size;\n    bool is_set;\n    uint32_t loaded_title_id;\n    Setting(uint32_t setting_id, Type type, size_t size, bool is_set)\n        : setting_id(setting_id),\n          type(type),\n          size(size),\n          is_set(is_set),\n          loaded_title_id(0) {}\n    virtual void Append(X_USER_PROFILE_SETTING_DATA* data,\n                        SettingByteStream* stream) {\n      data->type = static_cast<uint8_t>(type);\n    }\n    virtual std::vector<uint8_t> Serialize() const {\n      return std::vector<uint8_t>();\n    }\n    virtual void Deserialize(std::vector<uint8_t>) {}\n    bool is_title_specific() const { return (setting_id & 0x3F00) == 0x3F00; }\n  };\n  struct Int32Setting : public Setting {\n    Int32Setting(uint32_t setting_id, int32_t value)\n        : Setting(setting_id, Type::INT32, 4, true), value(value) {}\n    int32_t value;\n    void Append(X_USER_PROFILE_SETTING_DATA* data,\n                SettingByteStream* stream) override {\n      Setting::Append(data, stream);\n      data->s32 = value;\n    }\n  };\n  struct Int64Setting : public Setting {\n    Int64Setting(uint32_t setting_id, int64_t value)\n        : Setting(setting_id, Type::INT64, 8, true), value(value) {}\n    int64_t value;\n    void Append(X_USER_PROFILE_SETTING_DATA* data,\n                SettingByteStream* stream) override {\n      Setting::Append(data, stream);\n      data->s64 = value;\n    }\n  };\n  struct DoubleSetting : public Setting {\n    DoubleSetting(uint32_t setting_id, double value)\n        : Setting(setting_id, Type::DOUBLE, 8, true), value(value) {}\n    double value;\n    void Append(X_USER_PROFILE_SETTING_DATA* data,\n                SettingByteStream* stream) override {\n      Setting::Append(data, stream);\n      data->f64 = value;\n    }\n  };\n  struct UnicodeSetting : public Setting {\n    UnicodeSetting(uint32_t setting_id, const std::u16string& value)\n        : Setting(setting_id, Type::WSTRING, 8, true), value(value) {}\n    std::u16string value;\n    void Append(X_USER_PROFILE_SETTING_DATA* data,\n                SettingByteStream* stream) override {\n      Setting::Append(data, stream);\n      if (value.empty()) {\n        data->unicode.size = 0;\n        data->unicode.ptr = 0;\n      } else {\n        size_t count = value.size() + 1;\n        size_t size = 2 * count;\n        assert_true(size <= std::numeric_limits<uint32_t>::max());\n        data->unicode.size = static_cast<uint32_t>(size);\n        data->unicode.ptr = stream->ptr();\n        auto buffer =\n            reinterpret_cast<uint16_t*>(&stream->data()[stream->offset()]);\n        stream->Advance(size);\n        xe::copy_and_swap(buffer, (uint16_t*)value.data(), count);\n      }\n    }\n  };\n  struct FloatSetting : public Setting {\n    FloatSetting(uint32_t setting_id, float value)\n        : Setting(setting_id, Type::FLOAT, 4, true), value(value) {}\n    float value;\n    void Append(X_USER_PROFILE_SETTING_DATA* data,\n                SettingByteStream* stream) override {\n      Setting::Append(data, stream);\n      data->f32 = value;\n    }\n  };\n  struct BinarySetting : public Setting {\n    BinarySetting(uint32_t setting_id)\n        : Setting(setting_id, Type::BINARY, 8, false), value() {}\n    BinarySetting(uint32_t setting_id, const std::vector<uint8_t>& value)\n        : Setting(setting_id, Type::BINARY, 8, true), value(value) {}\n    std::vector<uint8_t> value;\n    void Append(X_USER_PROFILE_SETTING_DATA* data,\n                SettingByteStream* stream) override {\n      Setting::Append(data, stream);\n      if (value.empty()) {\n        data->binary.size = 0;\n        data->binary.ptr = 0;\n      } else {\n        size_t size = value.size();\n        assert_true(size <= std::numeric_limits<uint32_t>::max());\n        data->binary.size = static_cast<uint32_t>(size);\n        data->binary.ptr = stream->ptr();\n        stream->Write(value.data(), size);\n      }\n    }\n    std::vector<uint8_t> Serialize() const override {\n      return std::vector<uint8_t>(value.data(), value.data() + value.size());\n    }\n    void Deserialize(std::vector<uint8_t> data) override {\n      value = data;\n      is_set = true;\n    }\n  };\n  struct DateTimeSetting : public Setting {\n    DateTimeSetting(uint32_t setting_id, int64_t value)\n        : Setting(setting_id, Type::DATETIME, 8, true), value(value) {}\n    int64_t value;\n    void Append(X_USER_PROFILE_SETTING_DATA* data,\n                SettingByteStream* stream) override {\n      Setting::Append(data, stream);\n      data->filetime = value;\n    }\n  };\n\n  UserProfile();\n\n  uint64_t xuid() const { return xuid_; }\n  std::string name() const { return name_; }\n  uint32_t signin_state() const { return 1; }\n  uint32_t type() const { return 1 | 2; /* local | online profile? */ }\n\n  void AddSetting(std::unique_ptr<Setting> setting);\n  Setting* GetSetting(uint32_t setting_id);\n\n private:\n  uint64_t xuid_;\n  std::string name_;\n  std::vector<std::unique_ptr<Setting>> setting_list_;\n  std::unordered_map<uint32_t, Setting*> settings_;\n\n  void LoadSetting(UserProfile::Setting*);\n  void SaveSetting(UserProfile::Setting*);\n};\n\n}  // namespace xam\n}  // namespace kernel\n}  // namespace xe\n\n#endif  // XENIA_KERNEL_XAM_USER_PROFILE_H_\n"
  },
  {
    "path": "src/xenia/kernel/xam/xam_avatar.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/logging.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/util/shim_utils.h\"\n#include \"xenia/kernel/xam/xam_private.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xam {\n\ndword_result_t XamAvatarInitialize_entry(\n    dword_t unk1,              // 1, 4, etc\n    dword_t unk2,              // 0 or 1\n    dword_t processor_number,  // for thread creation?\n    lpdword_t function_ptrs,   // 20b, 5 pointers\n    lpunknown_t unk5,          // ptr in data segment\n    dword_t unk6               // flags - 0x00300000, 0x30, etc\n) {\n  // Negative to fail. Game should immediately call XamAvatarShutdown.\n  return ~0u;\n}\nDECLARE_XAM_EXPORT1(XamAvatarInitialize, kAvatars, kStub);\n\nvoid XamAvatarShutdown_entry() {\n  // No-op.\n}\nDECLARE_XAM_EXPORT1(XamAvatarShutdown, kAvatars, kStub);\n\n}  // namespace xam\n}  // namespace kernel\n}  // namespace xe\n\nDECLARE_XAM_EMPTY_REGISTER_EXPORTS(Avatar);\n"
  },
  {
    "path": "src/xenia/kernel/xam/xam_content.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/string_util.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/util/shim_utils.h\"\n#include \"xenia/kernel/xam/xam_content_device.h\"\n#include \"xenia/kernel/xam/xam_private.h\"\n#include \"xenia/kernel/xenumerator.h\"\n#include \"xenia/xbox.h\"\n\nDEFINE_int32(\n    license_mask, 0,\n    \"Set license mask for activated content.\\n\"\n    \" 0 = No licenses enabled.\\n\"\n    \" 1 = First license enabled. Generally the full version license in\\n\"\n    \"     Xbox Live Arcade titles.\\n\"\n    \" -1 or 0xFFFFFFFF = All possible licenses enabled. Generally a\\n\"\n    \"                    bad idea, could lead to undefined behavior.\",\n    \"Content\");\n\nnamespace xe {\nnamespace kernel {\nnamespace xam {\n\ndword_result_t XamContentGetLicenseMask_entry(lpdword_t mask_ptr,\n                                              lpunknown_t overlapped_ptr) {\n  // Each bit in the mask represents a granted license. Available licenses\n  // seems to vary from game to game, but most appear to use bit 0 to indicate\n  // if the game is purchased or not.\n  *mask_ptr = static_cast<uint32_t>(cvars::license_mask);\n\n  if (overlapped_ptr) {\n    kernel_state()->CompleteOverlappedImmediate(overlapped_ptr,\n                                                X_ERROR_SUCCESS);\n    return X_ERROR_IO_PENDING;\n  } else {\n    return X_ERROR_SUCCESS;\n  }\n}\nDECLARE_XAM_EXPORT2(XamContentGetLicenseMask, kContent, kStub, kHighFrequency);\n\ndword_result_t XamContentResolve_entry(dword_t user_index,\n                                       lpvoid_t content_data_ptr,\n                                       lpunknown_t buffer_ptr,\n                                       dword_t buffer_size, dword_t unk1,\n                                       dword_t unk2, dword_t unk3) {\n  auto content_data = content_data_ptr.as<XCONTENT_DATA*>();\n\n  // Result of buffer_ptr is sent to RtlInitAnsiString.\n  // buffer_size is usually 260 (max path).\n  // Games expect zero if resolve was successful.\n  assert_always();\n  XELOGW(\"XamContentResolve unimplemented!\");\n  return X_ERROR_NOT_FOUND;\n}\nDECLARE_XAM_EXPORT1(XamContentResolve, kContent, kStub);\n\n// https://github.com/MrColdbird/gameservice/blob/master/ContentManager.cpp\n// https://github.com/LestaD/SourceEngine2007/blob/master/se2007/engine/xboxsystem.cpp#L499\ndword_result_t XamContentCreateEnumerator_entry(\n    dword_t user_index, dword_t device_id, dword_t content_type,\n    dword_t content_flags, dword_t items_per_enumerate,\n    lpdword_t buffer_size_ptr, lpdword_t handle_out) {\n  assert_not_null(handle_out);\n\n  auto device_info = device_id == 0 ? nullptr : GetDummyDeviceInfo(device_id);\n  if ((device_id && device_info == nullptr) || !handle_out) {\n    if (buffer_size_ptr) {\n      *buffer_size_ptr = 0;\n    }\n\n    // TODO(benvanik): memset 0 the data?\n    return X_E_INVALIDARG;\n  }\n\n  if (buffer_size_ptr) {\n    *buffer_size_ptr = sizeof(XCONTENT_DATA) * items_per_enumerate;\n  }\n\n  auto e = make_object<XStaticEnumerator<XCONTENT_DATA>>(kernel_state(),\n                                                         items_per_enumerate);\n  auto result = e->Initialize(0xFF, 0xFE, 0x20005, 0x20007, 0);\n  if (XFAILED(result)) {\n    return result;\n  }\n\n  if (!device_info || device_info->device_id == DummyDeviceId::HDD) {\n    // Get all content data.\n    auto content_datas = kernel_state()->content_manager()->ListContent(\n        static_cast<uint32_t>(DummyDeviceId::HDD),\n        XContentType(uint32_t(content_type)));\n    for (const auto& content_data : content_datas) {\n      auto item = e->AppendItem();\n      *item = content_data;\n    }\n  }\n\n  if (!device_info || device_info->device_id == DummyDeviceId::ODD) {\n    // TODO(gibbed): disc drive content\n  }\n\n  XELOGD(\"XamContentCreateEnumerator: added {} items to enumerator\",\n         e->item_count());\n\n  *handle_out = e->handle();\n  return X_ERROR_SUCCESS;\n}\nDECLARE_XAM_EXPORT1(XamContentCreateEnumerator, kContent, kImplemented);\n\nenum class kDispositionState : uint32_t { Unknown = 0, Create = 1, Open = 2 };\n\ndword_result_t xeXamContentCreate(dword_t user_index, lpstring_t root_name,\n                                  lpvoid_t content_data_ptr,\n                                  dword_t content_data_size, dword_t flags,\n                                  lpdword_t disposition_ptr,\n                                  lpdword_t license_mask_ptr,\n                                  dword_t cache_size, qword_t content_size,\n                                  lpvoid_t overlapped_ptr) {\n  XCONTENT_AGGREGATE_DATA content_data;\n  if (content_data_size == sizeof(XCONTENT_DATA)) {\n    content_data = *content_data_ptr.as<XCONTENT_DATA*>();\n  } else if (content_data_size == sizeof(XCONTENT_AGGREGATE_DATA)) {\n    content_data = *content_data_ptr.as<XCONTENT_AGGREGATE_DATA*>();\n  } else {\n    assert_always();\n    return X_ERROR_INVALID_PARAMETER;\n  }\n\n  auto content_manager = kernel_state()->content_manager();\n\n  if (overlapped_ptr && disposition_ptr) {\n    *disposition_ptr = 0;\n  }\n\n  auto run = [content_manager, root_name = root_name.value(), flags,\n              content_data, disposition_ptr, license_mask_ptr](\n                 uint32_t& extended_error, uint32_t& length) -> X_RESULT {\n    X_RESULT result = X_ERROR_INVALID_PARAMETER;\n    kDispositionState disposition = kDispositionState::Unknown;\n    switch (flags & 0xF) {\n      case 1:  // CREATE_NEW\n               // Fail if exists.\n        if (content_manager->ContentExists(content_data)) {\n          result = X_ERROR_ALREADY_EXISTS;\n        } else {\n          disposition = kDispositionState::Create;\n        }\n        break;\n      case 2:  // CREATE_ALWAYS\n               // Overwrite existing, if any.\n        if (content_manager->ContentExists(content_data)) {\n          content_manager->DeleteContent(content_data);\n        }\n        disposition = kDispositionState::Create;\n        break;\n      case 3:  // OPEN_EXISTING\n               // Open only if exists.\n        if (!content_manager->ContentExists(content_data)) {\n          result = X_ERROR_PATH_NOT_FOUND;\n        } else {\n          disposition = kDispositionState::Open;\n        }\n        break;\n      case 4:  // OPEN_ALWAYS\n               // Create if needed.\n        if (!content_manager->ContentExists(content_data)) {\n          disposition = kDispositionState::Create;\n        } else {\n          disposition = kDispositionState::Open;\n        }\n        break;\n      case 5:  // TRUNCATE_EXISTING\n               // Fail if doesn't exist, if does exist delete and recreate.\n        if (!content_manager->ContentExists(content_data)) {\n          result = X_ERROR_PATH_NOT_FOUND;\n        } else {\n          content_manager->DeleteContent(content_data);\n          disposition = kDispositionState::Create;\n        }\n        break;\n      default:\n        assert_unhandled_case(flags & 0xF);\n        break;\n    }\n\n    if (disposition == kDispositionState::Create) {\n      result = content_manager->CreateContent(root_name, content_data);\n    } else if (disposition == kDispositionState::Open) {\n      result = content_manager->OpenContent(root_name, content_data);\n    }\n\n    if (disposition_ptr) {\n      *disposition_ptr = static_cast<uint32_t>(disposition);\n    }\n\n    if (license_mask_ptr && XSUCCEEDED(result)) {\n      *license_mask_ptr = 0;  // Stub!\n    }\n\n    extended_error = X_HRESULT_FROM_WIN32(result);\n    length = static_cast<uint32_t>(disposition);\n    return result;\n  };\n\n  if (!overlapped_ptr) {\n    uint32_t extended_error, length;\n    return run(extended_error, length);\n  } else {\n    kernel_state()->CompleteOverlappedDeferredEx(run, overlapped_ptr);\n    return X_ERROR_IO_PENDING;\n  }\n}\n\ndword_result_t XamContentCreateEx_entry(\n    dword_t user_index, lpstring_t root_name, lpvoid_t content_data_ptr,\n    dword_t flags, lpdword_t disposition_ptr, lpdword_t license_mask_ptr,\n    dword_t cache_size, qword_t content_size, lpvoid_t overlapped_ptr) {\n  return xeXamContentCreate(user_index, root_name, content_data_ptr,\n                            sizeof(XCONTENT_DATA), flags, disposition_ptr,\n                            license_mask_ptr, cache_size, content_size,\n                            overlapped_ptr);\n}\nDECLARE_XAM_EXPORT1(XamContentCreateEx, kContent, kImplemented);\n\ndword_result_t XamContentCreate_entry(dword_t user_index, lpstring_t root_name,\n                                      lpvoid_t content_data_ptr, dword_t flags,\n                                      lpdword_t disposition_ptr,\n                                      lpdword_t license_mask_ptr,\n                                      lpvoid_t overlapped_ptr) {\n  return xeXamContentCreate(user_index, root_name, content_data_ptr,\n                            sizeof(XCONTENT_DATA), flags, disposition_ptr,\n                            license_mask_ptr, 0, 0, overlapped_ptr);\n}\nDECLARE_XAM_EXPORT1(XamContentCreate, kContent, kImplemented);\n\ndword_result_t XamContentCreateInternal_entry(\n    lpstring_t root_name, lpvoid_t content_data_ptr, dword_t flags,\n    lpdword_t disposition_ptr, lpdword_t license_mask_ptr, dword_t cache_size,\n    qword_t content_size, lpvoid_t overlapped_ptr) {\n  return xeXamContentCreate(0xFE, root_name, content_data_ptr,\n                            sizeof(XCONTENT_AGGREGATE_DATA), flags,\n                            disposition_ptr, license_mask_ptr, cache_size,\n                            content_size, overlapped_ptr);\n}\nDECLARE_XAM_EXPORT1(XamContentCreateInternal, kContent, kImplemented);\n\ndword_result_t XamContentOpenFile_entry(dword_t user_index,\n                                        lpstring_t root_name, lpstring_t path,\n                                        dword_t flags,\n                                        lpdword_t disposition_ptr,\n                                        lpdword_t license_mask_ptr,\n                                        lpvoid_t overlapped_ptr) {\n  // TODO(gibbed): arguments assumed based on XamContentCreate.\n  return X_ERROR_FILE_NOT_FOUND;\n}\nDECLARE_XAM_EXPORT1(XamContentOpenFile, kContent, kStub);\n\ndword_result_t XamContentFlush_entry(lpstring_t root_name,\n                                     lpunknown_t overlapped_ptr) {\n  X_RESULT result = X_ERROR_SUCCESS;\n  if (overlapped_ptr) {\n    kernel_state()->CompleteOverlappedImmediate(overlapped_ptr, result);\n    return X_ERROR_IO_PENDING;\n  } else {\n    return result;\n  }\n}\nDECLARE_XAM_EXPORT1(XamContentFlush, kContent, kStub);\n\ndword_result_t XamContentClose_entry(lpstring_t root_name,\n                                     lpunknown_t overlapped_ptr) {\n  // Closes a previously opened root from XamContentCreate*.\n  auto result =\n      kernel_state()->content_manager()->CloseContent(root_name.value());\n\n  if (overlapped_ptr) {\n    kernel_state()->CompleteOverlappedImmediate(overlapped_ptr, result);\n    return X_ERROR_IO_PENDING;\n  } else {\n    return result;\n  }\n}\nDECLARE_XAM_EXPORT1(XamContentClose, kContent, kImplemented);\n\ndword_result_t XamContentGetCreator_entry(dword_t user_index,\n                                          lpvoid_t content_data_ptr,\n                                          lpdword_t is_creator_ptr,\n                                          lpqword_t creator_xuid_ptr,\n                                          lpunknown_t overlapped_ptr) {\n  auto result = X_ERROR_SUCCESS;\n\n  XCONTENT_AGGREGATE_DATA content_data = *content_data_ptr.as<XCONTENT_DATA*>();\n\n  bool content_exists =\n      kernel_state()->content_manager()->ContentExists(content_data);\n\n  if (content_exists) {\n    if (content_data.content_type == XContentType::kSavedGame) {\n      // User always creates saves.\n      *is_creator_ptr = 1;\n      if (creator_xuid_ptr) {\n        *creator_xuid_ptr = kernel_state()->user_profile()->xuid();\n      }\n    } else {\n      *is_creator_ptr = 0;\n      if (creator_xuid_ptr) {\n        *creator_xuid_ptr = 0;\n      }\n    }\n  } else {\n    result = X_ERROR_PATH_NOT_FOUND;\n  }\n\n  if (overlapped_ptr) {\n    kernel_state()->CompleteOverlappedImmediate(overlapped_ptr, result);\n    return X_ERROR_IO_PENDING;\n  } else {\n    return result;\n  }\n}\nDECLARE_XAM_EXPORT1(XamContentGetCreator, kContent, kImplemented);\n\ndword_result_t XamContentGetThumbnail_entry(dword_t user_index,\n                                            lpvoid_t content_data_ptr,\n                                            lpvoid_t buffer_ptr,\n                                            lpdword_t buffer_size_ptr,\n                                            lpunknown_t overlapped_ptr) {\n  assert_not_null(buffer_size_ptr);\n  uint32_t buffer_size = *buffer_size_ptr;\n  XCONTENT_AGGREGATE_DATA content_data = *content_data_ptr.as<XCONTENT_DATA*>();\n\n  // Get thumbnail (if it exists).\n  std::vector<uint8_t> buffer;\n  auto result = kernel_state()->content_manager()->GetContentThumbnail(\n      content_data, &buffer);\n\n  *buffer_size_ptr = uint32_t(buffer.size());\n\n  if (XSUCCEEDED(result)) {\n    // Write data, if we were given a pointer.\n    // This may have just been a size query.\n    if (buffer_ptr) {\n      if (buffer_size < buffer.size()) {\n        // Dest buffer too small.\n        result = X_ERROR_INSUFFICIENT_BUFFER;\n      } else {\n        // Copy data.\n        std::memcpy((uint8_t*)buffer_ptr, buffer.data(), buffer.size());\n      }\n    }\n  }\n\n  if (overlapped_ptr) {\n    kernel_state()->CompleteOverlappedImmediate(overlapped_ptr, result);\n    return X_ERROR_IO_PENDING;\n  } else {\n    return result;\n  }\n}\nDECLARE_XAM_EXPORT1(XamContentGetThumbnail, kContent, kImplemented);\n\ndword_result_t XamContentSetThumbnail_entry(dword_t user_index,\n                                            lpvoid_t content_data_ptr,\n                                            lpvoid_t buffer_ptr,\n                                            dword_t buffer_size,\n                                            lpunknown_t overlapped_ptr) {\n  XCONTENT_AGGREGATE_DATA content_data = *content_data_ptr.as<XCONTENT_DATA*>();\n\n  // Buffer is PNG data.\n  auto buffer = std::vector<uint8_t>((uint8_t*)buffer_ptr,\n                                     (uint8_t*)buffer_ptr + buffer_size);\n  auto result = kernel_state()->content_manager()->SetContentThumbnail(\n      content_data, std::move(buffer));\n\n  if (overlapped_ptr) {\n    kernel_state()->CompleteOverlappedImmediate(overlapped_ptr, result);\n    return X_ERROR_IO_PENDING;\n  } else {\n    return result;\n  }\n}\nDECLARE_XAM_EXPORT1(XamContentSetThumbnail, kContent, kImplemented);\n\ndword_result_t XamContentDelete_entry(dword_t user_index,\n                                      lpvoid_t content_data_ptr,\n                                      lpunknown_t overlapped_ptr) {\n  XCONTENT_AGGREGATE_DATA content_data = *content_data_ptr.as<XCONTENT_DATA*>();\n\n  auto result = kernel_state()->content_manager()->DeleteContent(content_data);\n\n  if (overlapped_ptr) {\n    kernel_state()->CompleteOverlappedImmediate(overlapped_ptr, result);\n    return X_ERROR_IO_PENDING;\n  } else {\n    return result;\n  }\n}\nDECLARE_XAM_EXPORT1(XamContentDelete, kContent, kImplemented);\n\ndword_result_t XamContentDeleteInternal_entry(lpvoid_t content_data_ptr,\n                                              lpunknown_t overlapped_ptr) {\n  // INFO: Analysis of xam.xex shows that \"internal\" functions are wrappers with\n  // 0xFE as user_index\n  return XamContentDelete_entry(0xFE, content_data_ptr, overlapped_ptr);\n}\nDECLARE_XAM_EXPORT1(XamContentDeleteInternal, kContent, kImplemented);\n\n}  // namespace xam\n}  // namespace kernel\n}  // namespace xe\n\nDECLARE_XAM_EMPTY_REGISTER_EXPORTS(Content);\n"
  },
  {
    "path": "src/xenia/kernel/xam/xam_content_aggregate.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/string_util.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/user_module.h\"\n#include \"xenia/kernel/util/shim_utils.h\"\n#include \"xenia/kernel/xam/xam_content_device.h\"\n#include \"xenia/kernel/xam/xam_private.h\"\n#include \"xenia/kernel/xenumerator.h\"\n#include \"xenia/vfs/file.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xam {\n\nvoid AddODDContentTest(object_ref<XStaticEnumerator<XCONTENT_AGGREGATE_DATA>> e,\n                       XContentType content_type) {\n  auto root_entry = kernel_state()->file_system()->ResolvePath(\n      \"game:\\\\Content\\\\0000000000000000\");\n  if (!root_entry) {\n    return;\n  }\n\n  auto content_type_path = fmt::format(\"{:08X}\", uint32_t(content_type));\n\n  xe::filesystem::WildcardEngine title_find_engine;\n  title_find_engine.SetRule(\"????????\");\n\n  xe::filesystem::WildcardEngine content_find_engine;\n  content_find_engine.SetRule(\"????????????????\");\n\n  size_t title_find_index = 0;\n  vfs::Entry* title_entry;\n  for (;;) {\n    title_entry =\n        root_entry->IterateChildren(title_find_engine, &title_find_index);\n    if (!title_entry) {\n      break;\n    }\n\n    auto title_id =\n        string_util::from_string<uint32_t>(title_entry->name(), true);\n\n    auto content_root_entry = title_entry->ResolvePath(content_type_path);\n    if (content_root_entry) {\n      size_t content_find_index = 0;\n      vfs::Entry* content_entry;\n      for (;;) {\n        content_entry = content_root_entry->IterateChildren(\n            content_find_engine, &content_find_index);\n        if (!content_entry) {\n          break;\n        }\n\n        auto item = e->AppendItem();\n        assert_not_null(item);\n        if (item) {\n          item->device_id = static_cast<uint32_t>(DummyDeviceId::ODD);\n          item->content_type = content_type;\n          item->set_display_name(to_utf16(content_entry->name()));\n          item->set_file_name(content_entry->name());\n          item->title_id = title_id;\n        }\n      }\n    }\n  }\n}\n\ndword_result_t XamContentAggregateCreateEnumerator_entry(qword_t xuid,\n                                                         dword_t device_id,\n                                                         dword_t content_type,\n                                                         unknown_t unk3,\n                                                         lpdword_t handle_out) {\n  assert_not_null(handle_out);\n\n  auto device_info = device_id == 0 ? nullptr : GetDummyDeviceInfo(device_id);\n  if ((device_id && device_info == nullptr) || !handle_out) {\n    return X_E_INVALIDARG;\n  }\n\n  auto e = make_object<XStaticEnumerator<XCONTENT_AGGREGATE_DATA>>(\n      kernel_state(), 1);\n  X_KENUMERATOR_CONTENT_AGGREGATE* extra;\n  auto result = e->Initialize(0xFF, 0xFE, 0x2000E, 0x20010, 0, &extra);\n  if (XFAILED(result)) {\n    return result;\n  }\n\n  extra->magic = kXObjSignature;\n  extra->handle = e->handle();\n\n  auto content_type_enum = XContentType(uint32_t(content_type));\n\n  if (!device_info || device_info->device_type == DeviceType::HDD) {\n    // Fetch any alternate title IDs defined in the XEX header\n    // (used by games to load saves from other titles, etc)\n    std::vector<uint32_t> title_ids{kCurrentlyRunningTitleId};\n    auto exe_module = kernel_state()->GetExecutableModule();\n    if (exe_module && exe_module->xex_module()) {\n      const auto& alt_ids = exe_module->xex_module()->opt_alternate_title_ids();\n      std::copy(alt_ids.cbegin(), alt_ids.cend(),\n                std::back_inserter(title_ids));\n    }\n\n    for (auto& title_id : title_ids) {\n      // Get all content data.\n      auto content_datas = kernel_state()->content_manager()->ListContent(\n          static_cast<uint32_t>(DummyDeviceId::HDD), content_type_enum,\n          title_id);\n      for (const auto& content_data : content_datas) {\n        auto item = e->AppendItem();\n        assert_not_null(item);\n        if (item) {\n          *item = content_data;\n        }\n      }\n    }\n  }\n\n  if (!device_info || device_info->device_type == DeviceType::ODD) {\n    AddODDContentTest(e, content_type_enum);\n  }\n\n  XELOGD(\"XamContentAggregateCreateEnumerator: added {} items to enumerator\",\n         e->item_count());\n\n  *handle_out = e->handle();\n  return X_ERROR_SUCCESS;\n}\nDECLARE_XAM_EXPORT1(XamContentAggregateCreateEnumerator, kContent, kStub);\n\n}  // namespace xam\n}  // namespace kernel\n}  // namespace xe\n\nDECLARE_XAM_EMPTY_REGISTER_EXPORTS(ContentAggregate);\n"
  },
  {
    "path": "src/xenia/kernel/xam/xam_content_device.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/kernel/xam/xam_content_device.h\"\n\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/util/shim_utils.h\"\n#include \"xenia/kernel/xam/xam_private.h\"\n#include \"xenia/kernel/xenumerator.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xam {\n\n// TODO(gibbed): real information.\n//\n// Until we expose real information about a HDD device, we\n// claim there is 3GB free on a 4GB dummy HDD.\n//\n// There is a possibility that certain games are bugged in that\n// they incorrectly only look at the lower 32-bits of free_bytes,\n// when it is a 64-bit value. Which means any size above ~4GB\n// will not be recognized properly.\n#define ONE_GB (1024ull * 1024ull * 1024ull)\n\nstatic const DummyDeviceInfo dummy_hdd_device_info_ = {\n    DummyDeviceId::HDD, DeviceType::HDD,\n    20ull * ONE_GB,  // 20GB\n    3ull * ONE_GB,   // 3GB, so it looks a little used.\n    u\"Dummy HDD\",\n};\nstatic const DummyDeviceInfo dummy_odd_device_info_ = {\n    DummyDeviceId::ODD, DeviceType::ODD,\n    7ull * ONE_GB,  // 7GB (rough maximum)\n    0ull * ONE_GB,  // read-only FS, so no free space\n    u\"Dummy ODD\",\n};\nstatic const DummyDeviceInfo* dummy_device_infos_[] = {\n    &dummy_hdd_device_info_,\n    &dummy_odd_device_info_,\n};\n#undef ONE_GB\n\nconst DummyDeviceInfo* GetDummyDeviceInfo(uint32_t device_id) {\n  const auto& begin = std::begin(dummy_device_infos_);\n  const auto& end = std::end(dummy_device_infos_);\n  auto it = std::find_if(begin, end, [device_id](const auto& item) {\n    return static_cast<uint32_t>(item->device_id) == device_id;\n  });\n  return it == end ? nullptr : *it;\n}\n\ndword_result_t XamContentGetDeviceName_entry(dword_t device_id,\n                                             lpu16string_t name_buffer,\n                                             dword_t name_capacity) {\n  auto device_info = GetDummyDeviceInfo(device_id);\n  if (device_info == nullptr) {\n    return X_ERROR_DEVICE_NOT_CONNECTED;\n  }\n  auto name = std::u16string(device_info->name);\n  if (name_capacity < name.size() + 1) {\n    return X_ERROR_INSUFFICIENT_BUFFER;\n  }\n  xe::string_util::copy_and_swap_truncating(name_buffer, name, name_capacity);\n  return X_ERROR_SUCCESS;\n}\nDECLARE_XAM_EXPORT1(XamContentGetDeviceName, kContent, kImplemented);\n\ndword_result_t XamContentGetDeviceState_entry(dword_t device_id,\n                                              lpunknown_t overlapped_ptr) {\n  auto device_info = GetDummyDeviceInfo(device_id);\n  if (device_info == nullptr) {\n    if (overlapped_ptr) {\n      kernel_state()->CompleteOverlappedImmediateEx(\n          overlapped_ptr, X_ERROR_FUNCTION_FAILED, X_ERROR_DEVICE_NOT_CONNECTED,\n          0);\n      return X_ERROR_IO_PENDING;\n    } else {\n      return X_ERROR_DEVICE_NOT_CONNECTED;\n    }\n  }\n  if (overlapped_ptr) {\n    kernel_state()->CompleteOverlappedImmediate(overlapped_ptr,\n                                                X_ERROR_SUCCESS);\n    return X_ERROR_IO_PENDING;\n  } else {\n    return X_ERROR_SUCCESS;\n  }\n}\nDECLARE_XAM_EXPORT1(XamContentGetDeviceState, kContent, kStub);\n\ntypedef struct {\n  xe::be<uint32_t> device_id;\n  xe::be<uint32_t> device_type;\n  xe::be<uint64_t> total_bytes;\n  xe::be<uint64_t> free_bytes;\n  union {\n    xe::be<uint16_t> name[28];\n    char16_t name_chars[28];\n  };\n} X_CONTENT_DEVICE_DATA;\nstatic_assert_size(X_CONTENT_DEVICE_DATA, 0x50);\n\ndword_result_t XamContentGetDeviceData_entry(\n    dword_t device_id, pointer_t<X_CONTENT_DEVICE_DATA> device_data) {\n  auto device_info = GetDummyDeviceInfo(device_id);\n  if (device_info == nullptr) {\n    return X_ERROR_DEVICE_NOT_CONNECTED;\n  }\n  device_data.Zero();\n  device_data->device_id = static_cast<uint32_t>(device_info->device_id);\n  device_data->device_type = static_cast<uint32_t>(device_info->device_type);\n  device_data->total_bytes = device_info->total_bytes;\n  device_data->free_bytes = device_info->free_bytes;\n  xe::string_util::copy_and_swap_truncating(\n      device_data->name_chars, device_info->name,\n      xe::countof(device_data->name_chars));\n  return X_ERROR_SUCCESS;\n}\nDECLARE_XAM_EXPORT1(XamContentGetDeviceData, kContent, kImplemented);\n\ndword_result_t XamContentCreateDeviceEnumerator_entry(dword_t content_type,\n                                                      dword_t content_flags,\n                                                      dword_t max_count,\n                                                      lpdword_t buffer_size_ptr,\n                                                      lpdword_t handle_out) {\n  assert_not_null(handle_out);\n\n  if (buffer_size_ptr) {\n    *buffer_size_ptr = sizeof(X_CONTENT_DEVICE_DATA) * max_count;\n  }\n\n  auto e = make_object<XStaticEnumerator<X_CONTENT_DEVICE_DATA>>(kernel_state(),\n                                                                 max_count);\n  auto result = e->Initialize(0xFE, 0xFE, 0x2000A, 0x20009, 0);\n  if (XFAILED(result)) {\n    return result;\n  }\n\n  for (const auto& device_info : dummy_device_infos_) {\n    // Copy our dummy device into the enumerator\n    auto device_data = e->AppendItem();\n    assert_not_null(device_data);\n    if (device_data) {\n      device_data->device_id = static_cast<uint32_t>(device_info->device_id);\n      device_data->device_type =\n          static_cast<uint32_t>(device_info->device_type);\n      device_data->total_bytes = device_info->total_bytes;\n      device_data->free_bytes = device_info->free_bytes;\n      xe::string_util::copy_and_swap_truncating(\n          device_data->name_chars, device_info->name,\n          xe::countof(device_data->name_chars));\n    }\n  }\n\n  *handle_out = e->handle();\n  return X_ERROR_SUCCESS;\n}\nDECLARE_XAM_EXPORT1(XamContentCreateDeviceEnumerator, kNone, kImplemented);\n\n}  // namespace xam\n}  // namespace kernel\n}  // namespace xe\n\nDECLARE_XAM_EMPTY_REGISTER_EXPORTS(ContentDevice);\n"
  },
  {
    "path": "src/xenia/kernel/xam/xam_content_device.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_KERNEL_XAM_XAM_CONTENT_DEVICE_H_\n#define XENIA_KERNEL_XAM_XAM_CONTENT_DEVICE_H_\n\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xam {\n\nenum class DeviceType : uint32_t {\n  HDD = 1,\n  ODD = 4,\n};\n\nenum class DummyDeviceId : uint32_t {\n  HDD = 1,\n  ODD = 2,\n};\n\nstruct DummyDeviceInfo {\n  DummyDeviceId device_id;\n  DeviceType device_type;\n  uint64_t total_bytes;\n  uint64_t free_bytes;\n  const std::u16string_view name;\n};\n\nconst DummyDeviceInfo* GetDummyDeviceInfo(uint32_t device_id);\n\n}  // namespace xam\n}  // namespace kernel\n}  // namespace xe\n\n#endif  // XENIA_KERNEL_XAM_XAM_CONTENT_DEVICE_H_\n"
  },
  {
    "path": "src/xenia/kernel/xam/xam_enum.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/string_util.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/util/shim_utils.h\"\n#include \"xenia/kernel/xam/xam_module.h\"\n#include \"xenia/kernel/xam/xam_private.h\"\n#include \"xenia/kernel/xenumerator.h\"\n#include \"xenia/xbox.h\"\n\n#if XE_PLATFORM_WIN32\n#include \"xenia/base/platform_win.h\"\n#endif\n\n#include \"third_party/fmt/include/fmt/format.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xam {\n\n// https://github.com/LestaD/SourceEngine2007/blob/master/se2007/engine/xboxsystem.cpp#L518\nuint32_t xeXamEnumerate(uint32_t handle, uint32_t flags, lpvoid_t buffer_ptr,\n                        uint32_t buffer_size, uint32_t* items_returned,\n                        uint32_t overlapped_ptr) {\n  assert_true(flags == 0);\n\n  auto e = kernel_state()->object_table()->LookupObject<XEnumerator>(handle);\n  if (!e) {\n    return X_ERROR_INVALID_HANDLE;\n  }\n\n  auto run = [e, buffer_ptr](uint32_t& extended_error,\n                             uint32_t& length) -> X_RESULT {\n    X_RESULT result;\n    uint32_t item_count = 0;\n    if (!buffer_ptr) {\n      result = X_ERROR_INVALID_PARAMETER;\n    } else {\n      result = e->WriteItems(buffer_ptr.guest_address(),\n                             buffer_ptr.as<uint8_t*>(), &item_count);\n    }\n    extended_error = X_HRESULT_FROM_WIN32(result);\n    length = item_count;\n    return result;\n  };\n\n  if (items_returned) {\n    assert_true(!overlapped_ptr);\n    uint32_t extended_error;\n    uint32_t item_count;\n    X_RESULT result = run(extended_error, item_count);\n    *items_returned = result == X_ERROR_SUCCESS ? item_count : 0;\n    return result;\n  } else if (overlapped_ptr) {\n    assert_true(!items_returned);\n    kernel_state()->CompleteOverlappedDeferredEx(run, overlapped_ptr);\n    return X_ERROR_IO_PENDING;\n  } else {\n    assert_always();\n    return X_ERROR_INVALID_PARAMETER;\n  }\n}\n\ndword_result_t XamEnumerate_entry(dword_t handle, dword_t flags,\n                                  lpvoid_t buffer, dword_t buffer_length,\n                                  lpdword_t items_returned,\n                                  pointer_t<XAM_OVERLAPPED> overlapped) {\n  uint32_t dummy;\n  auto result = xeXamEnumerate(handle, flags, buffer, buffer_length,\n                               !overlapped ? &dummy : nullptr, overlapped);\n  if (!overlapped && items_returned) {\n    *items_returned = dummy;\n  }\n  return result;\n}\nDECLARE_XAM_EXPORT1(XamEnumerate, kNone, kImplemented);\n\ndword_result_t XamCreateEnumeratorHandle_entry(unknown_t unk1, unknown_t unk2,\n                                               unknown_t unk3, unknown_t unk4,\n                                               unknown_t unk5, unknown_t unk6,\n                                               unknown_t unk7, unknown_t unk8) {\n  return X_ERROR_INVALID_PARAMETER;\n}\nDECLARE_XAM_EXPORT1(XamCreateEnumeratorHandle, kNone, kStub);\n\ndword_result_t XamGetPrivateEnumStructureFromHandle_entry(\n    dword_t handle, lpdword_t out_object_ptr) {\n  auto e = kernel_state()->object_table()->LookupObject<XEnumerator>(handle);\n  if (!e) {\n    return X_STATUS_INVALID_HANDLE;\n  }\n\n  // Caller takes the reference.\n  // It's released in ObDereferenceObject.\n  e->RetainHandle();\n\n  if (out_object_ptr.guest_address()) {\n    *out_object_ptr = e->guest_object();\n  }\n\n  return X_STATUS_SUCCESS;\n}\nDECLARE_XAM_EXPORT1(XamGetPrivateEnumStructureFromHandle, kNone, kStub);\n\n}  // namespace xam\n}  // namespace kernel\n}  // namespace xe\n\nDECLARE_XAM_EMPTY_REGISTER_EXPORTS(Enum);\n"
  },
  {
    "path": "src/xenia/kernel/xam/xam_info.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/string_util.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/user_module.h\"\n#include \"xenia/kernel/util/shim_utils.h\"\n#include \"xenia/kernel/xam/xam_module.h\"\n#include \"xenia/kernel/xam/xam_private.h\"\n#include \"xenia/kernel/xenumerator.h\"\n#include \"xenia/kernel/xthread.h\"\n#include \"xenia/xbox.h\"\n\n#if XE_PLATFORM_WIN32\n#include \"xenia/base/platform_win.h\"\n#endif\n\n#include \"third_party/fmt/include/fmt/format.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xam {\n\ndword_result_t XamFeatureEnabled_entry(dword_t unk) { return 0; }\nDECLARE_XAM_EXPORT1(XamFeatureEnabled, kNone, kStub);\n\n// Empty stub schema binary.\nuint8_t schema_bin[] = {\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x00,\n    0x00, 0x2C, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x2C, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,\n};\n\ndword_result_t XamGetOnlineSchema_entry() {\n  static uint32_t schema_guest = 0;\n\n  if (!schema_guest) {\n    schema_guest =\n        kernel_state()->memory()->SystemHeapAlloc(8 + sizeof(schema_bin));\n    auto schema = kernel_state()->memory()->TranslateVirtual(schema_guest);\n    std::memcpy(schema + 8, schema_bin, sizeof(schema_bin));\n    xe::store_and_swap<uint32_t>(schema + 0, schema_guest + 8);\n    xe::store_and_swap<uint32_t>(schema + 4, sizeof(schema_bin));\n  }\n\n  // return pointer to the schema ptr/schema size struct\n  return schema_guest;\n}\nDECLARE_XAM_EXPORT1(XamGetOnlineSchema, kNone, kImplemented);\n\n#if XE_PLATFORM_WIN32\nstatic SYSTEMTIME xeGetLocalSystemTime(uint64_t filetime) {\n  FILETIME t;\n  t.dwHighDateTime = filetime >> 32;\n  t.dwLowDateTime = (uint32_t)filetime;\n\n  SYSTEMTIME st;\n  SYSTEMTIME local_st;\n  FileTimeToSystemTime(&t, &st);\n  SystemTimeToTzSpecificLocalTime(NULL, &st, &local_st);\n  return local_st;\n}\n#endif\n\nvoid XamFormatDateString_entry(dword_t unk, qword_t filetime,\n                               lpvoid_t output_buffer, dword_t output_count) {\n  std::memset(output_buffer, 0, output_count * sizeof(char16_t));\n\n// TODO: implement this for other platforms\n#if XE_PLATFORM_WIN32\n  auto st = xeGetLocalSystemTime(filetime);\n  // TODO: format this depending on users locale?\n  auto str = fmt::format(u\"{:02d}/{:02d}/{}\", st.wMonth, st.wDay, st.wYear);\n  xe::string_util::copy_and_swap_truncating(output_buffer.as<char16_t*>(), str,\n                                            output_count);\n#else\n  assert_always();\n#endif\n}\nDECLARE_XAM_EXPORT1(XamFormatDateString, kNone, kImplemented);\n\nvoid XamFormatTimeString_entry(dword_t unk, qword_t filetime,\n                               lpvoid_t output_buffer, dword_t output_count) {\n  std::memset(output_buffer, 0, output_count * sizeof(char16_t));\n\n// TODO: implement this for other platforms\n#if XE_PLATFORM_WIN32\n  auto st = xeGetLocalSystemTime(filetime);\n  // TODO: format this depending on users locale?\n  auto str = fmt::format(u\"{:02d}:{:02d}\", st.wHour, st.wMinute);\n  xe::string_util::copy_and_swap_truncating(output_buffer.as<char16_t*>(), str,\n                                            output_count);\n#else\n  assert_always();\n#endif\n}\nDECLARE_XAM_EXPORT1(XamFormatTimeString, kNone, kImplemented);\n\ndword_result_t keXamBuildResourceLocator(uint64_t module,\n                                         const std::u16string& container,\n                                         const std::u16string& resource,\n                                         lpvoid_t buffer_ptr,\n                                         uint32_t buffer_count) {\n  std::u16string path;\n  if (!module) {\n    path = fmt::format(u\"file://media:/{}.xzp#{}\", container, resource);\n    XELOGD(\n        \"XamBuildResourceLocator({0}) returning locator to local file {0}.xzp\",\n        xe::to_utf8(container));\n  } else {\n    path = fmt::format(u\"section://{:X},{}#{}\", (uint32_t)module, container,\n                       resource);\n  }\n  xe::string_util::copy_and_swap_truncating(buffer_ptr.as<char16_t*>(), path,\n                                            buffer_count);\n  return 0;\n}\n\ndword_result_t XamBuildResourceLocator_entry(qword_t module,\n                                             lpu16string_t container,\n                                             lpu16string_t resource,\n                                             lpvoid_t buffer_ptr,\n                                             dword_t buffer_count) {\n  return keXamBuildResourceLocator(module, container.value(), resource.value(),\n                                   buffer_ptr, buffer_count);\n}\nDECLARE_XAM_EXPORT1(XamBuildResourceLocator, kNone, kImplemented);\n\ndword_result_t XamBuildGamercardResourceLocator_entry(lpu16string_t filename,\n                                                      lpvoid_t buffer_ptr,\n                                                      dword_t buffer_count) {\n  // On an actual xbox these funcs would return a locator to xam.xex resources,\n  // but for Xenia we can return a locator to the resources as local files. (big\n  // thanks to MS for letting XamBuildResourceLocator return local file\n  // locators!)\n\n  // If you're running an app that'll need them, make sure to extract xam.xex\n  // resources with xextool (\"xextool -d . xam.xex\") and add a .xzp extension.\n\n  return keXamBuildResourceLocator(0, u\"gamercrd\", filename.value(), buffer_ptr,\n                                   buffer_count);\n}\nDECLARE_XAM_EXPORT1(XamBuildGamercardResourceLocator, kNone, kImplemented);\n\ndword_result_t XamBuildSharedSystemResourceLocator_entry(lpu16string_t filename,\n                                                         lpvoid_t buffer_ptr,\n                                                         dword_t buffer_count) {\n  // see notes inside XamBuildGamercardResourceLocator above\n  return keXamBuildResourceLocator(0, u\"shrdres\", filename.value(), buffer_ptr,\n                                   buffer_count);\n}\nDECLARE_XAM_EXPORT1(XamBuildSharedSystemResourceLocator, kNone, kImplemented);\n\ndword_result_t XamBuildLegacySystemResourceLocator_entry(lpu16string_t filename,\n                                                         lpvoid_t buffer_ptr,\n                                                         dword_t buffer_count) {\n  return XamBuildSharedSystemResourceLocator_entry(filename, buffer_ptr,\n                                                   buffer_count);\n}\nDECLARE_XAM_EXPORT1(XamBuildLegacySystemResourceLocator, kNone, kImplemented);\n\ndword_result_t XamBuildXamResourceLocator_entry(lpu16string_t filename,\n                                                lpvoid_t buffer_ptr,\n                                                dword_t buffer_count) {\n  return keXamBuildResourceLocator(0, u\"xam\", filename.value(), buffer_ptr,\n                                   buffer_count);\n}\nDECLARE_XAM_EXPORT1(XamBuildXamResourceLocator, kNone, kImplemented);\n\ndword_result_t XamGetSystemVersion_entry() {\n  // eh, just picking one. If we go too low we may break new games, but\n  // this value seems to be used for conditionally loading symbols and if\n  // we pretend to be old we have less to worry with implementing.\n  // 0x200A3200\n  // 0x20096B00\n  return 0;\n}\nDECLARE_XAM_EXPORT1(XamGetSystemVersion, kNone, kStub);\n\nvoid XCustomRegisterDynamicActions_entry() {\n  // ???\n}\nDECLARE_XAM_EXPORT1(XCustomRegisterDynamicActions, kNone, kStub);\n\ndword_result_t XGetAVPack_entry() {\n  // DWORD\n  // Not sure what the values are for this, but 6 is VGA.\n  // Other likely values are 3/4/8 for HDMI or something.\n  // Games seem to use this as a PAL check - if the result is not 3/4/6/8\n  // they explode with errors if not in PAL mode.\n  return 6;\n}\nDECLARE_XAM_EXPORT1(XGetAVPack, kNone, kStub);\n\nuint32_t xeXGetGameRegion() { return 0xFFFFu; }\n\ndword_result_t XGetGameRegion_entry() { return xeXGetGameRegion(); }\nDECLARE_XAM_EXPORT1(XGetGameRegion, kNone, kStub);\n\ndword_result_t XGetLanguage_entry() {\n  auto desired_language = XLanguage::kEnglish;\n\n  // Switch the language based on game region.\n  // TODO(benvanik): pull from xex header.\n  uint32_t game_region = XEX_REGION_NTSCU;\n  if (game_region & XEX_REGION_NTSCU) {\n    desired_language = XLanguage::kEnglish;\n  } else if (game_region & XEX_REGION_NTSCJ) {\n    desired_language = XLanguage::kJapanese;\n  }\n  // Add more overrides?\n\n  return uint32_t(desired_language);\n}\nDECLARE_XAM_EXPORT1(XGetLanguage, kNone, kImplemented);\n\ndword_result_t XamGetCurrentTitleId_entry() {\n  return kernel_state()->emulator()->title_id();\n}\nDECLARE_XAM_EXPORT1(XamGetCurrentTitleId, kNone, kImplemented);\n\ndword_result_t XamGetExecutionId_entry(lpdword_t info_ptr) {\n  auto module = kernel_state()->GetExecutableModule();\n  assert_not_null(module);\n\n  uint32_t guest_hdr_ptr;\n  X_STATUS result =\n      module->GetOptHeader(XEX_HEADER_EXECUTION_INFO, &guest_hdr_ptr);\n\n  if (XFAILED(result)) {\n    return result;\n  }\n\n  *info_ptr = guest_hdr_ptr;\n  return X_STATUS_SUCCESS;\n}\nDECLARE_XAM_EXPORT1(XamGetExecutionId, kNone, kImplemented);\n\ndword_result_t XamLoaderSetLaunchData_entry(lpvoid_t data, dword_t size) {\n  auto xam = kernel_state()->GetKernelModule<XamModule>(\"xam.xex\");\n  auto& loader_data = xam->loader_data();\n  loader_data.launch_data_present = size ? true : false;\n  loader_data.launch_data.resize(size);\n  std::memcpy(loader_data.launch_data.data(), data, size);\n  return 0;\n}\nDECLARE_XAM_EXPORT1(XamLoaderSetLaunchData, kNone, kSketchy);\n\ndword_result_t XamLoaderGetLaunchDataSize_entry(lpdword_t size_ptr) {\n  if (!size_ptr) {\n    return X_ERROR_INVALID_PARAMETER;\n  }\n\n  auto xam = kernel_state()->GetKernelModule<XamModule>(\"xam.xex\");\n  auto& loader_data = xam->loader_data();\n  if (!loader_data.launch_data_present) {\n    *size_ptr = 0;\n    return X_ERROR_NOT_FOUND;\n  }\n\n  *size_ptr = uint32_t(xam->loader_data().launch_data.size());\n  return X_ERROR_SUCCESS;\n}\nDECLARE_XAM_EXPORT1(XamLoaderGetLaunchDataSize, kNone, kSketchy);\n\ndword_result_t XamLoaderGetLaunchData_entry(lpvoid_t buffer_ptr,\n                                            dword_t buffer_size) {\n  auto xam = kernel_state()->GetKernelModule<XamModule>(\"xam.xex\");\n  auto& loader_data = xam->loader_data();\n  if (!loader_data.launch_data_present) {\n    return X_ERROR_NOT_FOUND;\n  }\n\n  uint32_t copy_size =\n      std::min(uint32_t(loader_data.launch_data.size()), uint32_t(buffer_size));\n  std::memcpy(buffer_ptr, loader_data.launch_data.data(), copy_size);\n  return X_ERROR_SUCCESS;\n}\nDECLARE_XAM_EXPORT1(XamLoaderGetLaunchData, kNone, kSketchy);\n\nvoid XamLoaderLaunchTitle_entry(lpstring_t raw_name_ptr, dword_t flags) {\n  auto xam = kernel_state()->GetKernelModule<XamModule>(\"xam.xex\");\n\n  auto& loader_data = xam->loader_data();\n  loader_data.launch_flags = flags;\n\n  // Translate the launch path to a full path.\n  if (raw_name_ptr) {\n    auto path = raw_name_ptr.value();\n    if (path.empty()) {\n      loader_data.launch_path = \"game:\\\\default.xex\";\n    } else {\n      if (xe::utf8::find_name_from_guest_path(path) == path) {\n        path = xe::utf8::join_guest_paths(\n            xe::utf8::find_base_guest_path(\n                kernel_state()->GetExecutableModule()->path()),\n            path);\n      }\n      loader_data.launch_path = path;\n    }\n  } else {\n    assert_always(\"Game requested exit to dashboard via XamLoaderLaunchTitle\");\n  }\n\n  // This function does not return.\n  kernel_state()->TerminateTitle();\n}\nDECLARE_XAM_EXPORT1(XamLoaderLaunchTitle, kNone, kSketchy);\n\nvoid XamLoaderTerminateTitle_entry() {\n  // This function does not return.\n  kernel_state()->TerminateTitle();\n}\nDECLARE_XAM_EXPORT1(XamLoaderTerminateTitle, kNone, kSketchy);\n\ndword_result_t XamAlloc_entry(dword_t unk, dword_t size, lpdword_t out_ptr) {\n  assert_true(unk == 0);\n\n  // Allocate from the heap. Not sure why XAM does this specially, perhaps\n  // it keeps stuff in a separate heap?\n  uint32_t ptr = kernel_state()->memory()->SystemHeapAlloc(size);\n  *out_ptr = ptr;\n\n  return X_ERROR_SUCCESS;\n}\nDECLARE_XAM_EXPORT1(XamAlloc, kMemory, kImplemented);\n\ndword_result_t XamFree_entry(lpdword_t ptr) {\n  kernel_state()->memory()->SystemHeapFree(ptr.guest_address());\n\n  return X_ERROR_SUCCESS;\n}\nDECLARE_XAM_EXPORT1(XamFree, kMemory, kImplemented);\n\ndword_result_t XamQueryLiveHiveW_entry(lpu16string_t name, lpvoid_t out_buf,\n                                       dword_t out_size,\n                                       dword_t type /* guess */) {\n  return X_STATUS_INVALID_PARAMETER_1;\n}\nDECLARE_XAM_EXPORT1(XamQueryLiveHiveW, kNone, kStub);\n\n}  // namespace xam\n}  // namespace kernel\n}  // namespace xe\n\nDECLARE_XAM_EMPTY_REGISTER_EXPORTS(Info);\n"
  },
  {
    "path": "src/xenia/kernel/xam/xam_input.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/logging.h\"\n#include \"xenia/emulator.h\"\n#include \"xenia/hid/input.h\"\n#include \"xenia/hid/input_system.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/util/shim_utils.h\"\n#include \"xenia/kernel/xam/xam_private.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xam {\n\nusing xe::hid::X_INPUT_CAPABILITIES;\nusing xe::hid::X_INPUT_KEYSTROKE;\nusing xe::hid::X_INPUT_STATE;\nusing xe::hid::X_INPUT_VIBRATION;\n\nconstexpr uint32_t XINPUT_FLAG_GAMEPAD = 0x01;\nconstexpr uint32_t XINPUT_FLAG_ANY_USER = 1 << 30;\n\nvoid XamResetInactivity_entry() {\n  // Do we need to do anything?\n}\nDECLARE_XAM_EXPORT1(XamResetInactivity, kInput, kStub);\n\ndword_result_t XamEnableInactivityProcessing_entry(dword_t unk,\n                                                   dword_t enable) {\n  return X_ERROR_SUCCESS;\n}\nDECLARE_XAM_EXPORT1(XamEnableInactivityProcessing, kInput, kStub);\n\n// https://msdn.microsoft.com/en-us/library/windows/desktop/microsoft.directx_sdk.reference.xinputgetcapabilities(v=vs.85).aspx\ndword_result_t XamInputGetCapabilities_entry(\n    dword_t user_index, dword_t flags, pointer_t<X_INPUT_CAPABILITIES> caps) {\n  if (!caps) {\n    return X_ERROR_BAD_ARGUMENTS;\n  }\n\n  if ((flags & 0xFF) && (flags & XINPUT_FLAG_GAMEPAD) == 0) {\n    // Ignore any query for other types of devices.\n    return X_ERROR_DEVICE_NOT_CONNECTED;\n  }\n\n  uint32_t actual_user_index = user_index;\n  if ((actual_user_index & 0xFF) == 0xFF || (flags & XINPUT_FLAG_ANY_USER)) {\n    // Always pin user to 0.\n    actual_user_index = 0;\n  }\n\n  auto input_system = kernel_state()->emulator()->input_system();\n  return input_system->GetCapabilities(actual_user_index, flags, caps);\n}\nDECLARE_XAM_EXPORT1(XamInputGetCapabilities, kInput, kSketchy);\n\ndword_result_t XamInputGetCapabilitiesEx_entry(\n    dword_t unk, dword_t user_index, dword_t flags,\n    pointer_t<X_INPUT_CAPABILITIES> caps) {\n  if (!caps) {\n    return X_ERROR_BAD_ARGUMENTS;\n  }\n\n  if ((flags & 0xFF) && (flags & XINPUT_FLAG_GAMEPAD) == 0) {\n    // Ignore any query for other types of devices.\n    return X_ERROR_DEVICE_NOT_CONNECTED;\n  }\n\n  uint32_t actual_user_index = user_index;\n  if ((actual_user_index & 0xFF) == 0xFF || (flags & XINPUT_FLAG_ANY_USER)) {\n    // Always pin user to 0.\n    actual_user_index = 0;\n  }\n\n  auto input_system = kernel_state()->emulator()->input_system();\n  return input_system->GetCapabilities(actual_user_index, flags, caps);\n}\nDECLARE_XAM_EXPORT1(XamInputGetCapabilitiesEx, kInput, kSketchy);\n\n// https://msdn.microsoft.com/en-us/library/windows/desktop/microsoft.directx_sdk.reference.xinputgetstate(v=vs.85).aspx\ndword_result_t XamInputGetState_entry(dword_t user_index, dword_t flags,\n                                      pointer_t<X_INPUT_STATE> input_state) {\n  // Games call this with a NULL state ptr, probably as a query.\n\n  if ((flags & 0xFF) && (flags & XINPUT_FLAG_GAMEPAD) == 0) {\n    // Ignore any query for other types of devices.\n    return X_ERROR_DEVICE_NOT_CONNECTED;\n  }\n\n  uint32_t actual_user_index = user_index;\n  if ((actual_user_index & 0xFF) == 0xFF || (flags & XINPUT_FLAG_ANY_USER)) {\n    // Always pin user to 0.\n    actual_user_index = 0;\n  }\n\n  auto input_system = kernel_state()->emulator()->input_system();\n  return input_system->GetState(user_index, input_state);\n}\nDECLARE_XAM_EXPORT2(XamInputGetState, kInput, kImplemented, kHighFrequency);\n\n// https://msdn.microsoft.com/en-us/library/windows/desktop/microsoft.directx_sdk.reference.xinputsetstate(v=vs.85).aspx\ndword_result_t XamInputSetState_entry(dword_t user_index, dword_t unk,\n                                      pointer_t<X_INPUT_VIBRATION> vibration) {\n  if (!vibration) {\n    return X_ERROR_BAD_ARGUMENTS;\n  }\n\n  uint32_t actual_user_index = user_index;\n  if ((user_index & 0xFF) == 0xFF) {\n    // Always pin user to 0.\n    actual_user_index = 0;\n  }\n\n  auto input_system = kernel_state()->emulator()->input_system();\n  return input_system->SetState(user_index, vibration);\n}\nDECLARE_XAM_EXPORT1(XamInputSetState, kInput, kImplemented);\n\n// https://msdn.microsoft.com/en-us/library/windows/desktop/microsoft.directx_sdk.reference.xinputgetkeystroke(v=vs.85).aspx\ndword_result_t XamInputGetKeystroke_entry(\n    dword_t user_index, dword_t flags, pointer_t<X_INPUT_KEYSTROKE> keystroke) {\n  // https://github.com/CodeAsm/ffplay360/blob/master/Common/AtgXime.cpp\n  // user index = index or XUSER_INDEX_ANY\n  // flags = XINPUT_FLAG_GAMEPAD (| _ANYUSER | _ANYDEVICE)\n\n  if (!keystroke) {\n    return X_ERROR_BAD_ARGUMENTS;\n  }\n\n  if ((flags & 0xFF) && (flags & XINPUT_FLAG_GAMEPAD) == 0) {\n    // Ignore any query for other types of devices.\n    return X_ERROR_DEVICE_NOT_CONNECTED;\n  }\n\n  uint32_t actual_user_index = user_index;\n  if ((actual_user_index & 0xFF) == 0xFF || (flags & XINPUT_FLAG_ANY_USER)) {\n    // Always pin user to 0.\n    actual_user_index = 0;\n  }\n\n  auto input_system = kernel_state()->emulator()->input_system();\n  return input_system->GetKeystroke(user_index, flags, keystroke);\n}\nDECLARE_XAM_EXPORT1(XamInputGetKeystroke, kInput, kImplemented);\n\n// Same as non-ex, just takes a pointer to user index.\ndword_result_t XamInputGetKeystrokeEx_entry(\n    lpdword_t user_index_ptr, dword_t flags,\n    pointer_t<X_INPUT_KEYSTROKE> keystroke) {\n  if (!keystroke) {\n    return X_ERROR_BAD_ARGUMENTS;\n  }\n\n  if ((flags & 0xFF) && (flags & XINPUT_FLAG_GAMEPAD) == 0) {\n    // Ignore any query for other types of devices.\n    return X_ERROR_DEVICE_NOT_CONNECTED;\n  }\n\n  uint32_t user_index = *user_index_ptr;\n  if ((user_index & 0xFF) == 0xFF || (flags & XINPUT_FLAG_ANY_USER)) {\n    // Always pin user to 0.\n    user_index = 0;\n  }\n\n  auto input_system = kernel_state()->emulator()->input_system();\n  auto result = input_system->GetKeystroke(user_index, flags, keystroke);\n  if (XSUCCEEDED(result)) {\n    *user_index_ptr = keystroke->user_index;\n  }\n  return result;\n}\nDECLARE_XAM_EXPORT1(XamInputGetKeystrokeEx, kInput, kImplemented);\n\nX_HRESULT_result_t XamUserGetDeviceContext_entry(dword_t user_index,\n                                                 dword_t unk,\n                                                 lpdword_t out_ptr) {\n  // Games check the result - usually with some masking.\n  // If this function fails they assume zero, so let's fail AND\n  // set zero just to be safe.\n  *out_ptr = 0;\n  if (!user_index || (user_index & 0xFF) == 0xFF) {\n    return X_E_SUCCESS;\n  } else {\n    return X_E_DEVICE_NOT_CONNECTED;\n  }\n}\nDECLARE_XAM_EXPORT1(XamUserGetDeviceContext, kInput, kStub);\n\n}  // namespace xam\n}  // namespace kernel\n}  // namespace xe\n\nDECLARE_XAM_EMPTY_REGISTER_EXPORTS(Input);\n"
  },
  {
    "path": "src/xenia/kernel/xam/xam_locale.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include <cstring>\n\n#include \"xenia/base/logging.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/util/shim_utils.h\"\n#include \"xenia/kernel/xam/xam_private.h\"\n#include \"xenia/kernel/xenumerator.h\"\n#include \"xenia/kernel/xthread.h\"\n#include \"xenia/xbox.h\"\n\nDECLARE_int32(user_country);\n\n// TODO(gibbed): put these forward decls in a header somewhere.\n\nnamespace xe {\nnamespace kernel {\nnamespace xam {\nuint32_t xeXGetGameRegion();\n}  // namespace xam\n}  // namespace kernel\n}  // namespace xe\n\nnamespace xe {\nnamespace kernel {\nnamespace xam {\n\n// Table lookups.\n\nuint8_t xeXamGetOnlineCountryFromLocale(uint8_t id) {\n  static uint8_t const table[] = {\n      2,   6,  5,  8,  13,  16, 19,  20, 21,  23, 25, 32, 34, 24, 37,\n      39,  42, 46, 44, 50,  53, 56,  71, 74,  76, 75, 82, 84, 91, 93,\n      109, 31, 90, 18, 101, 35, 103, 88, 236, 99, 4,  89, 45, 1,\n  };\n#pragma warning(suppress : 6385)\n  return id < xe::countof(table) ? table[id] : 0;\n}\n\nconst char16_t* xeXamGetOnlineCountryString(uint8_t id) {\n  static const char16_t* const table[] = {\n      u\"ZZ\", u\"AE\",   u\"AL\", u\"AM\", u\"AR\",   u\"AT\", u\"AU\",   u\"AZ\",   u\"BE\",\n      u\"BG\", u\"BH\",   u\"BN\", u\"BO\", u\"BR\",   u\"BY\", u\"BZ\",   u\"CA\",   nullptr,\n      u\"CH\", u\"CL\",   u\"CN\", u\"CO\", u\"CR\",   u\"CZ\", u\"DE\",   u\"DK\",   u\"DO\",\n      u\"DZ\", u\"EC\",   u\"EE\", u\"EG\", u\"ES\",   u\"FI\", u\"FO\",   u\"FR\",   u\"GB\",\n      u\"GE\", u\"GR\",   u\"GT\", u\"HK\", u\"HN\",   u\"HR\", u\"HU\",   u\"ID\",   u\"IE\",\n      u\"IL\", u\"IN\",   u\"IQ\", u\"IR\", u\"IS\",   u\"IT\", u\"JM\",   u\"JO\",   u\"JP\",\n      u\"KE\", u\"KG\",   u\"KR\", u\"KW\", u\"KZ\",   u\"LB\", u\"LI\",   u\"LT\",   u\"LU\",\n      u\"LV\", u\"LY\",   u\"MA\", u\"MC\", u\"MK\",   u\"MN\", u\"MO\",   u\"MV\",   u\"MX\",\n      u\"MY\", u\"NI\",   u\"NL\", u\"NO\", u\"NZ\",   u\"OM\", u\"PA\",   u\"PE\",   u\"PH\",\n      u\"PK\", u\"PL\",   u\"PR\", u\"PT\", u\"PY\",   u\"QA\", u\"RO\",   u\"RU\",   u\"SA\",\n      u\"SE\", u\"SG\",   u\"SI\", u\"SK\", nullptr, u\"SV\", u\"SY\",   u\"TH\",   u\"TN\",\n      u\"TR\", u\"TT\",   u\"TW\", u\"UA\", u\"US\",   u\"UY\", u\"UZ\",   u\"VE\",   u\"VN\",\n      u\"YE\", u\"ZA\",   u\"ZW\", u\"AF\", nullptr, u\"AD\", u\"AO\",   u\"AI\",   nullptr,\n      u\"AG\", u\"AW\",   u\"BS\", u\"BD\", u\"BB\",   u\"BJ\", u\"BM\",   u\"BT\",   u\"BA\",\n      u\"BW\", u\"BF\",   u\"BI\", u\"KH\", u\"CM\",   u\"CV\", u\"KY\",   u\"CF\",   u\"TD\",\n      u\"CX\", u\"CC\",   u\"KM\", u\"CG\", u\"CD\",   u\"CK\", u\"CI\",   u\"CY\",   u\"DJ\",\n      u\"DM\", nullptr, u\"GQ\", u\"ER\", u\"ET\",   u\"FK\", u\"FJ\",   u\"GF\",   u\"PF\",\n      u\"GA\", u\"GM\",   u\"GH\", u\"GI\", u\"GL\",   u\"GD\", u\"GP\",   nullptr, u\"GG\",\n      u\"GN\", u\"GW\",   u\"GY\", u\"HT\", u\"JE\",   u\"KI\", u\"LA\",   u\"LS\",   u\"LR\",\n      u\"MG\", u\"MW\",   u\"ML\", u\"MT\", u\"MH\",   u\"MQ\", u\"MR\",   u\"MU\",   u\"YT\",\n      u\"FM\", u\"MD\",   u\"ME\", u\"MS\", u\"MZ\",   u\"MM\", u\"NA\",   u\"NR\",   u\"NP\",\n      u\"AN\", u\"NC\",   u\"NE\", u\"NG\", u\"NU\",   u\"NF\", nullptr, u\"PW\",   u\"PS\",\n      u\"PG\", u\"PN\",   u\"RE\", u\"RW\", u\"WS\",   u\"SM\", u\"ST\",   u\"SN\",   u\"RS\",\n      u\"SC\", u\"SL\",   u\"SB\", u\"SO\", u\"LK\",   u\"SH\", u\"KN\",   u\"LC\",   u\"PM\",\n      u\"VC\", u\"SR\",   u\"SZ\", u\"TJ\", u\"TZ\",   u\"TL\", u\"TG\",   u\"TK\",   u\"TO\",\n      u\"TM\", u\"TC\",   u\"TV\", u\"UG\", u\"VU\",   u\"VA\", nullptr, u\"VG\",   u\"WF\",\n      u\"EH\", u\"ZM\",   u\"ZZ\",\n  };\n#pragma warning(suppress : 6385)\n  return id < xe::countof(table) ? table[id] : nullptr;\n}\n\nconst char16_t* xeXamGetCountryString(uint8_t id) {\n  static const char16_t* const table[] = {\n      u\"ZZ\", u\"AE\", u\"AL\", u\"AM\", u\"AR\",   u\"AT\", u\"AU\", u\"AZ\",   u\"BE\", u\"BG\",\n      u\"BH\", u\"BN\", u\"BO\", u\"BR\", u\"BY\",   u\"BZ\", u\"CA\", nullptr, u\"CH\", u\"CL\",\n      u\"CN\", u\"CO\", u\"CR\", u\"CZ\", u\"DE\",   u\"DK\", u\"DO\", u\"DZ\",   u\"EC\", u\"EE\",\n      u\"EG\", u\"ES\", u\"FI\", u\"FO\", u\"FR\",   u\"GB\", u\"GE\", u\"GR\",   u\"GT\", u\"HK\",\n      u\"HN\", u\"HR\", u\"HU\", u\"ID\", u\"IE\",   u\"IL\", u\"IN\", u\"IQ\",   u\"IR\", u\"IS\",\n      u\"IT\", u\"JM\", u\"JO\", u\"JP\", u\"KE\",   u\"KG\", u\"KR\", u\"KW\",   u\"KZ\", u\"LB\",\n      u\"LI\", u\"LT\", u\"LU\", u\"LV\", u\"LY\",   u\"MA\", u\"MC\", u\"MK\",   u\"MN\", u\"MO\",\n      u\"MV\", u\"MX\", u\"MY\", u\"NI\", u\"NL\",   u\"NO\", u\"NZ\", u\"OM\",   u\"PA\", u\"PE\",\n      u\"PH\", u\"PK\", u\"PL\", u\"PR\", u\"PT\",   u\"PY\", u\"QA\", u\"RO\",   u\"RU\", u\"SA\",\n      u\"SE\", u\"SG\", u\"SI\", u\"SK\", nullptr, u\"SV\", u\"SY\", u\"TH\",   u\"TN\", u\"TR\",\n      u\"TT\", u\"TW\", u\"UA\", u\"US\", u\"UY\",   u\"UZ\", u\"VE\", u\"VN\",   u\"YE\", u\"ZA\",\n      u\"ZW\", u\"ZZ\",\n  };\n#pragma warning(suppress : 6385)\n  return id < xe::countof(table) ? table[id] : nullptr;\n}\n\nconst char16_t* xeXamGetLanguageString(uint8_t id) {\n  static const char16_t* const table[] = {\n      u\"zz\", u\"en\",   u\"ja\", u\"de\", u\"fr\", u\"es\", u\"it\", u\"ko\", u\"zh\",\n      u\"pt\", nullptr, u\"pl\", u\"ru\", u\"sv\", u\"tr\", u\"nb\", u\"nl\", u\"zh\",\n  };\n#pragma warning(suppress : 6385)\n  return id < xe::countof(table) ? table[id] : nullptr;\n}\n\nconst char16_t* xeXamGetLocaleString(uint8_t id) {\n  static const char16_t* const table[] = {\n      u\"ZZ\", u\"AU\", u\"AT\", u\"BE\", u\"BR\", u\"CA\", u\"CL\", u\"CN\", u\"CO\",\n      u\"CZ\", u\"DK\", u\"FI\", u\"FR\", u\"DE\", u\"GR\", u\"HK\", u\"HU\", u\"IN\",\n      u\"IE\", u\"IT\", u\"JP\", u\"KR\", u\"MX\", u\"NL\", u\"NZ\", u\"NO\", u\"PL\",\n      u\"PT\", u\"SG\", u\"SK\", u\"ZA\", u\"ES\", u\"SE\", u\"CH\", u\"TW\", u\"GB\",\n      u\"US\", u\"RU\", u\"ZZ\", u\"TR\", u\"AR\", u\"SA\", u\"IL\", u\"AE\",\n  };\n#pragma warning(suppress : 6385)\n  return id < xe::countof(table) ? table[id] : nullptr;\n}\n\nuint8_t xeXamGetLocaleFromOnlineCountry(uint8_t id) {\n  static uint8_t const table[] = {\n      0,  43, 0, 0, 40, 2,  1,  0,  3,  0, 0, 0, 0,  4,  0,  0,  5,  0,  33,\n      6,  7,  8, 0, 9,  13, 10, 0,  0,  0, 0, 0, 31, 11, 0,  12, 35, 0,  14,\n      0,  15, 0, 0, 16, 0,  18, 42, 17, 0, 0, 0, 19, 0,  0,  20, 0,  0,  21,\n      0,  0,  0, 0, 0,  0,  0,  0,  0,  0, 0, 0, 0,  0,  22, 0,  0,  23, 25,\n      24, 0,  0, 0, 0,  0,  26, 0,  27, 0, 0, 0, 37, 41, 32, 28, 0,  29, 0,\n      0,  0,  0, 0, 39, 0,  34, 0,  36, 0, 0, 0, 0,  0,  30, 0,  0,  0,  0,\n      0,  0,  0, 0, 0,  0,  0,  0,  0,  0, 0, 0, 0,  0,  0,  0,  0,  0,  0,\n      0,  0,  0, 0, 0,  0,  0,  0,  0,  0, 0, 0, 0,  0,  0,  0,  0,  0,  0,\n      0,  0,  0, 0, 0,  0,  0,  0,  0,  0, 0, 0, 0,  0,  0,  0,  0,  0,  0,\n      0,  0,  0, 0, 0,  0,  0,  0,  0,  0, 0, 0, 0,  0,  0,  0,  0,  0,  0,\n      0,  0,  0, 0, 0,  0,  0,  0,  0,  0, 0, 0, 0,  0,  0,  0,  0,  0,  0,\n      0,  0,  0, 0, 0,  0,  0,  0,  0,  0, 0, 0, 0,  0,  0,  0,  0,  0,  0,\n      0,  0,  0, 0, 0,  0,  0,  0,  38,\n  };\n#pragma warning(suppress : 6385)\n  return id < xe::countof(table) ? table[id] : 0;\n}\n\nuint8_t xeXamGetLanguageFromOnlineLanguage(uint8_t id) {\n  static uint8_t const table[] = {\n      0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 17, 11, 12, 1, 1, 15, 16, 13, 1, 1, 1,\n      1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1,  1,  1, 1, 14, 1,  1,  1, 1, 1,\n      1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1,  1,  1, 1, 1,  1,  1,  1,\n  };\n#pragma warning(suppress : 6385)\n  return id < xe::countof(table) ? table[id] : 0;\n}\n\nconst char16_t* xeXamGetOnlineLanguageString(uint8_t id) {\n  static const char16_t* const table[] = {\n      u\"zz\", u\"en\", u\"ja\", u\"de\", u\"fr\", u\"es\", u\"it\", u\"ko\", u\"zh\",\n      u\"pt\", u\"zh\", u\"pl\", u\"ru\", u\"da\", u\"fi\", u\"nb\", u\"nl\", u\"sv\",\n      u\"cs\", u\"el\", u\"hu\", u\"sk\", u\"id\", u\"ms\", u\"ar\", u\"bg\", u\"et\",\n      u\"hr\", u\"he\", u\"is\", u\"kk\", u\"lt\", u\"lv\", u\"ro\", u\"sl\", u\"th\",\n      u\"tr\", u\"uk\", u\"vi\", u\"ps\", u\"sq\", u\"hy\", u\"bn\", u\"be\", u\"km\",\n      u\"am\", u\"fo\", u\"ka\", u\"kl\", u\"sw\", u\"ky\", u\"lb\", u\"mk\", u\"mt\",\n      u\"mn\", u\"ne\", u\"ur\", u\"rw\", u\"wo\", u\"si\", u\"tk\",\n  };\n#pragma warning(suppress : 6385)\n  return id < xe::countof(table) ? table[id] : nullptr;\n}\n\nuint8_t xeXamGetCountryFromOnlineCountry(uint8_t id) {\n  static uint8_t const table[] = {\n      0,  1,  2,  3,  4,   5,   6,   7,   8,   9,   10,  11,  12,  13,  14,  15,\n      16, 0,  18, 19, 20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,\n      32, 33, 34, 35, 36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,\n      48, 49, 50, 51, 52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,\n      64, 65, 66, 67, 68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,\n      80, 81, 82, 83, 84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  0,   95,\n      96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 0,\n      0,  0,  0,  0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n      0,  0,  0,  0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n      0,  0,  0,  0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n      0,  0,  0,  0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n      0,  0,  0,  0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n      0,  0,  0,  0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n      0,  0,  0,  0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n      0,  0,  0,  0,  0,   0,   0,   0,   0,   0,   0,   0,   111,\n  };\n#pragma warning(suppress : 6385)\n  return id < xe::countof(table) ? table[id] : 0;\n}\n\nuint8_t xeXamGetLocaleFromCountry(uint8_t id) {\n  static uint8_t const table[] = {\n      0,  43, 0, 0, 40, 2,  1,  0,  3,  0, 0, 0, 0,  4,  0,  0,  5,  0,  33,\n      6,  7,  8, 0, 9,  13, 10, 0,  0,  0, 0, 0, 31, 11, 0,  12, 35, 0,  14,\n      0,  15, 0, 0, 16, 0,  18, 42, 17, 0, 0, 0, 19, 0,  0,  20, 0,  0,  21,\n      0,  0,  0, 0, 0,  0,  0,  0,  0,  0, 0, 0, 0,  0,  22, 0,  0,  23, 25,\n      24, 0,  0, 0, 0,  0,  26, 0,  27, 0, 0, 0, 37, 41, 32, 28, 0,  29, 0,\n      0,  0,  0, 0, 39, 0,  34, 0,  36, 0, 0, 0, 0,  0,  30, 0,  38,\n  };\n#pragma warning(suppress : 6385)\n  return id < xe::countof(table) ? table[id] : 0;\n}\n\n// Helpers.\n\nuint8_t xeXamGetLocaleEx(uint8_t max_country_id, uint8_t max_locale_id) {\n  // TODO(gibbed): rework when XConfig is cleanly implemented.\n  uint8_t country_id = static_cast<uint8_t>(cvars::user_country);\n  /*if (XSUCCEEDED(xboxkrnl::xeExGetXConfigSetting(\n          3, 14, &country_id, sizeof(country_id), nullptr))) {*/\n  if (country_id <= max_country_id) {\n    uint8_t locale_id = xeXamGetLocaleFromCountry(country_id);\n    if (locale_id <= max_locale_id) {\n      return locale_id;\n    }\n  }\n  /*}*/\n\n  // couldn't find locale, fallback from game region.\n  auto game_region = xeXGetGameRegion();\n  auto region = static_cast<uint8_t>((game_region & 0xFF00u) >> 8);\n  if (region == 1) {\n    return game_region == 0x101 ? 20 /* JP */ : 21 /* KR */;\n  }\n  return region == 2 ? 35 /* GB */ : 36 /* US */;\n}\n\nuint8_t xeXamGetLocale() { return xeXamGetLocaleEx(111, 43); }\n\n// Exports.\n\ndword_result_t XamGetLocale_entry() {\n  return static_cast<uint8_t>(xeXamGetLocale());\n}\nDECLARE_XAM_EXPORT1(XamGetLocale, kLocale, kImplemented);\n\ndword_result_t XamGetOnlineCountryFromLocale_entry(dword_t id) {\n  return xeXamGetOnlineCountryFromLocale(id);\n}\nDECLARE_XAM_EXPORT1(XamGetOnlineCountryFromLocale, kLocale, kImplemented);\n\ndword_result_t XamGetOnlineCountryString_entry(dword_t id,\n                                               dword_t buffer_length,\n                                               lpu16string_t buffer) {\n  if (buffer_length >= 0x80000000u) {\n    return X_E_INVALIDARG;\n  }\n\n  auto str = xeXamGetOnlineCountryString(static_cast<uint8_t>(id));\n  if (!str) {\n    return X_E_NOTFOUND;\n  }\n\n  const auto value = std::u16string(str);\n  if (value.size() + 1 > buffer_length) {\n    return X_HRESULT_FROM_WIN32(X_ERROR_INSUFFICIENT_BUFFER);\n  }\n\n  xe::store_and_swap<std::u16string>(buffer, value);\n  static_cast<char16_t*>(buffer)[value.size()] = 0;\n  return X_E_SUCCESS;\n}\nDECLARE_XAM_EXPORT1(XamGetOnlineCountryString, kLocale, kImplemented);\n\ndword_result_t XamGetCountryString_entry(dword_t id, dword_t buffer_length,\n                                         lpu16string_t buffer) {\n  if (buffer_length >= 0x80000000u) {\n    return X_E_INVALIDARG;\n  }\n\n  auto str = xeXamGetCountryString(static_cast<uint8_t>(id));\n  if (!str) {\n    return X_E_NOTFOUND;\n  }\n\n  const auto value = std::u16string(str);\n  if (value.size() + 1 > buffer_length) {\n    return X_HRESULT_FROM_WIN32(X_ERROR_INSUFFICIENT_BUFFER);\n  }\n\n  xe::store_and_swap<std::u16string>(buffer, value);\n  static_cast<char16_t*>(buffer)[value.size()] = 0;\n  return X_E_SUCCESS;\n}\nDECLARE_XAM_EXPORT1(XamGetCountryString, kLocale, kImplemented);\n\ndword_result_t XamGetLanguageString_entry(dword_t id, dword_t buffer_length,\n                                          lpu16string_t buffer) {\n  if (buffer_length >= 0x80000000u) {\n    return X_E_INVALIDARG;\n  }\n\n  auto str = xeXamGetLanguageString(static_cast<uint8_t>(id));\n  if (!str) {\n    return X_E_NOTFOUND;\n  }\n\n  const auto value = std::u16string(str);\n  if (value.size() + 1 > buffer_length) {\n    return X_HRESULT_FROM_WIN32(X_ERROR_INSUFFICIENT_BUFFER);\n  }\n\n  xe::store_and_swap<std::u16string>(buffer, value);\n  static_cast<char16_t*>(buffer)[value.size()] = 0;\n  return X_E_SUCCESS;\n}\nDECLARE_XAM_EXPORT1(XamGetLanguageString, kLocale, kImplemented);\n\ndword_result_t XamGetLanguageLocaleString_entry(dword_t language_id,\n                                                dword_t locale_id,\n                                                dword_t buffer_length,\n                                                lpu16string_t buffer) {\n  if (buffer_length >= 0x80000000u) {\n    return X_E_INVALIDARG;\n  }\n\n  auto language_str = xeXamGetLanguageString(static_cast<uint8_t>(language_id));\n  if (!language_str) {\n    return X_E_NOTFOUND;\n  }\n\n  auto locale_str = xeXamGetLocaleString(static_cast<uint8_t>(locale_id));\n  if (!locale_str) {\n    return X_E_NOTFOUND;\n  }\n\n  const auto value =\n      std::u16string(language_str) + u\"-\" + std::u16string(locale_str);\n  if (value.size() + 1 > buffer_length) {\n    return X_HRESULT_FROM_WIN32(X_ERROR_INSUFFICIENT_BUFFER);\n  }\n\n  xe::store_and_swap<std::u16string>(buffer, value);\n  static_cast<char16_t*>(buffer)[value.size()] = 0;\n  return X_E_SUCCESS;\n}\nDECLARE_XAM_EXPORT1(XamGetLanguageLocaleString, kLocale, kImplemented);\n\ndword_result_t XamGetOnlineLanguageAndCountryString_entry(\n    dword_t language_id, dword_t country_id, dword_t buffer_length,\n    lpu16string_t buffer) {\n  if (buffer_length >= 0x80000000u) {\n    return X_E_INVALIDARG;\n  }\n\n  auto language_str =\n      xeXamGetOnlineLanguageString(static_cast<uint8_t>(language_id));\n  if (!language_str) {\n    return X_E_NOTFOUND;\n  }\n\n  auto country_str =\n      xeXamGetOnlineCountryString(static_cast<uint8_t>(country_id));\n  if (!country_str) {\n    return X_E_NOTFOUND;\n  }\n\n  const auto value =\n      std::u16string(language_str) + u\"-\" + std::u16string(country_str);\n  if (value.size() + 1 > buffer_length) {\n    return X_HRESULT_FROM_WIN32(X_ERROR_INSUFFICIENT_BUFFER);\n  }\n\n  xe::store_and_swap<std::u16string>(buffer, value);\n  static_cast<char16_t*>(buffer)[value.size()] = 0;\n  return X_E_SUCCESS;\n}\nDECLARE_XAM_EXPORT1(XamGetOnlineLanguageAndCountryString, kLocale,\n                    kImplemented);\n\ndword_result_t XamGetLocaleString_entry(dword_t id, dword_t buffer_length,\n                                        lpu16string_t buffer) {\n  if (buffer_length >= 0x80000000u) {\n    return X_E_INVALIDARG;\n  }\n\n  auto str = xeXamGetLocaleString(static_cast<uint8_t>(id));\n  if (!str) {\n    return X_E_NOTFOUND;\n  }\n\n  const auto value = std::u16string(str);\n  if (value.size() + 1 > buffer_length) {\n    return X_HRESULT_FROM_WIN32(X_ERROR_INSUFFICIENT_BUFFER);\n  }\n\n  xe::store_and_swap<std::u16string>(buffer, value);\n  static_cast<char16_t*>(buffer)[value.size()] = 0;\n  return X_E_SUCCESS;\n}\nDECLARE_XAM_EXPORT1(XamGetLocaleString, kLocale, kImplemented);\n\ndword_result_t XamGetLocaleFromOnlineCountry_entry(dword_t id) {\n  return xeXamGetLocaleFromOnlineCountry(static_cast<uint8_t>(id));\n}\nDECLARE_XAM_EXPORT1(XamGetLocaleFromOnlineCountry, kLocale, kImplemented);\n\ndword_result_t XamGetLanguageFromOnlineLanguage_entry(dword_t id) {\n  return xeXamGetLanguageFromOnlineLanguage(static_cast<uint8_t>(id));\n}\nDECLARE_XAM_EXPORT1(XamGetLanguageFromOnlineLanguage, kLocale, kImplemented);\n\ndword_result_t XamGetOnlineLanguageString_entry(dword_t id,\n                                                dword_t buffer_length,\n                                                lpu16string_t buffer) {\n  if (buffer_length >= 0x80000000u) {\n    return X_E_INVALIDARG;\n  }\n\n  auto str = xeXamGetOnlineLanguageString(static_cast<uint8_t>(id));\n  if (!str) {\n    return X_E_NOTFOUND;\n  }\n\n  const auto value = std::u16string(str);\n  if (value.size() + 1 > buffer_length) {\n    return X_HRESULT_FROM_WIN32(X_ERROR_INSUFFICIENT_BUFFER);\n  }\n\n  xe::store_and_swap<std::u16string>(buffer, value);\n  static_cast<char16_t*>(buffer)[value.size()] = 0;\n  return X_E_SUCCESS;\n}\nDECLARE_XAM_EXPORT1(XamGetOnlineLanguageString, kLocale, kImplemented);\n\ndword_result_t XamGetCountryFromOnlineCountry_entry(dword_t id) {\n  return xeXamGetCountryFromOnlineCountry(static_cast<uint8_t>(id));\n}\nDECLARE_XAM_EXPORT1(XamGetCountryFromOnlineCountry, kLocale, kImplemented);\n\ndword_result_t XamGetLocaleEx_entry(dword_t max_country_id,\n                                    dword_t max_locale_id) {\n  return xeXamGetLocaleEx(static_cast<uint8_t>(max_country_id),\n                          static_cast<uint8_t>(max_locale_id));\n}\nDECLARE_XAM_EXPORT1(XamGetLocaleEx, kLocale, kImplemented);\n\n}  // namespace xam\n}  // namespace kernel\n}  // namespace xe\n\nDECLARE_XAM_EMPTY_REGISTER_EXPORTS(Locale);\n"
  },
  {
    "path": "src/xenia/kernel/xam/xam_module.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2019 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/kernel/xam/xam_module.h\"\n\n#include <vector>\n\n#include \"xenia/base/math.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/xam/xam_private.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xam {\n\nstd::atomic<int> xam_dialogs_shown_ = {0};\n\nbool xeXamIsUIActive() { return xam_dialogs_shown_ > 0; }\n\nXamModule::XamModule(Emulator* emulator, KernelState* kernel_state)\n    : KernelModule(kernel_state, \"xe:\\\\xam.xex\"), loader_data_() {\n  RegisterExportTable(export_resolver_);\n\n  // Register all exported functions.\n#define XE_MODULE_EXPORT_GROUP(m, n) \\\n  Register##n##Exports(export_resolver_, kernel_state_);\n#include \"xam_module_export_groups.inc\"\n#undef XE_MODULE_EXPORT_GROUP\n}\n\nstd::vector<xe::cpu::Export*> xam_exports(4096);\n\nxe::cpu::Export* RegisterExport_xam(xe::cpu::Export* export_entry) {\n  assert_true(export_entry->ordinal < xam_exports.size());\n  xam_exports[export_entry->ordinal] = export_entry;\n  return export_entry;\n}\n\nvoid XamModule::RegisterExportTable(xe::cpu::ExportResolver* export_resolver) {\n  assert_not_null(export_resolver);\n\n// Build the export table used for resolution.\n#include \"xenia/kernel/util/export_table_pre.inc\"\n  static xe::cpu::Export xam_export_table[] = {\n#include \"xenia/kernel/xam/xam_table.inc\"\n  };\n#include \"xenia/kernel/util/export_table_post.inc\"\n  for (size_t i = 0; i < xe::countof(xam_export_table); ++i) {\n    auto& export_entry = xam_export_table[i];\n    assert_true(export_entry.ordinal < xam_exports.size());\n    if (!xam_exports[export_entry.ordinal]) {\n      xam_exports[export_entry.ordinal] = &export_entry;\n    }\n  }\n  export_resolver->RegisterTable(\"xam.xex\", &xam_exports);\n}\n\nXamModule::~XamModule() {}\n\n}  // namespace xam\n}  // namespace kernel\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/kernel/xam/xam_module.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_KERNEL_XAM_XAM_MODULE_H_\n#define XENIA_KERNEL_XAM_XAM_MODULE_H_\n\n#include <string>\n\n#include \"xenia/cpu/export_resolver.h\"\n#include \"xenia/kernel/kernel_module.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/xam/xam_ordinals.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xam {\n\nbool xeXamIsUIActive();\n\nclass XamModule : public KernelModule {\n public:\n  XamModule(Emulator* emulator, KernelState* kernel_state);\n  virtual ~XamModule();\n\n  static void RegisterExportTable(xe::cpu::ExportResolver* export_resolver);\n\n  struct LoaderData {\n    bool launch_data_present = false;\n    std::vector<uint8_t> launch_data;\n    uint32_t launch_flags = 0;\n    std::string launch_path;  // Full path to next xex\n  };\n\n  const LoaderData& loader_data() const { return loader_data_; }\n  LoaderData& loader_data() { return loader_data_; }\n\n private:\n  LoaderData loader_data_;\n};\n\n}  // namespace xam\n}  // namespace kernel\n}  // namespace xe\n\n#endif  // XENIA_KERNEL_XAM_XAM_MODULE_H_\n"
  },
  {
    "path": "src/xenia/kernel/xam/xam_module_export_groups.inc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n// This is a partial file designed to be included by other files when\n// constructing various tables.\n\nXE_MODULE_EXPORT_GROUP(xam, Avatar)\nXE_MODULE_EXPORT_GROUP(xam, Content)\nXE_MODULE_EXPORT_GROUP(xam, ContentAggregate)\nXE_MODULE_EXPORT_GROUP(xam, ContentDevice)\nXE_MODULE_EXPORT_GROUP(xam, Enum)\nXE_MODULE_EXPORT_GROUP(xam, Info)\nXE_MODULE_EXPORT_GROUP(xam, Input)\nXE_MODULE_EXPORT_GROUP(xam, Locale)\nXE_MODULE_EXPORT_GROUP(xam, Msg)\nXE_MODULE_EXPORT_GROUP(xam, Net)\nXE_MODULE_EXPORT_GROUP(xam, Notify)\nXE_MODULE_EXPORT_GROUP(xam, NUI)\nXE_MODULE_EXPORT_GROUP(xam, Party)\nXE_MODULE_EXPORT_GROUP(xam, Task)\nXE_MODULE_EXPORT_GROUP(xam, UI)\nXE_MODULE_EXPORT_GROUP(xam, User)\nXE_MODULE_EXPORT_GROUP(xam, Video)\nXE_MODULE_EXPORT_GROUP(xam, Voice)\n"
  },
  {
    "path": "src/xenia/kernel/xam/xam_msg.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/logging.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/util/shim_utils.h\"\n#include \"xenia/kernel/xam/xam_private.h\"\n#include \"xenia/kernel/xboxkrnl/xboxkrnl_error.h\"\n#include \"xenia/kernel/xevent.h\"\n#include \"xenia/kernel/xthread.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xam {\n\ndword_result_t XMsgInProcessCall_entry(dword_t app, dword_t message,\n                                       dword_t arg1, dword_t arg2) {\n  auto result = kernel_state()->app_manager()->DispatchMessageSync(app, message,\n                                                                   arg1, arg2);\n  if (result == X_ERROR_NOT_FOUND) {\n    XELOGE(\"XMsgInProcessCall: app {:08X} undefined\", app);\n  }\n  return result;\n}\nDECLARE_XAM_EXPORT1(XMsgInProcessCall, kNone, kImplemented);\n\ndword_result_t XMsgSystemProcessCall_entry(dword_t app, dword_t message,\n                                           dword_t buffer,\n                                           dword_t buffer_length) {\n  auto result = kernel_state()->app_manager()->DispatchMessageAsync(\n      app, message, buffer, buffer_length);\n  if (result == X_ERROR_NOT_FOUND) {\n    XELOGE(\"XMsgSystemProcessCall: app {:08X} undefined\", app);\n  }\n  return result;\n}\nDECLARE_XAM_EXPORT1(XMsgSystemProcessCall, kNone, kImplemented);\n\nstruct XMSGSTARTIOREQUEST_UNKNOWNARG {\n  be<uint32_t> unk_0;\n  be<uint32_t> unk_1;\n};\n\nX_HRESULT xeXMsgStartIORequestEx(uint32_t app, uint32_t message,\n                                 uint32_t overlapped_ptr, uint32_t buffer_ptr,\n                                 uint32_t buffer_length,\n                                 XMSGSTARTIOREQUEST_UNKNOWNARG* unknown) {\n  auto result = kernel_state()->app_manager()->DispatchMessageAsync(\n      app, message, buffer_ptr, buffer_length);\n  if (result == X_E_NOTFOUND) {\n    XELOGE(\"XMsgStartIORequestEx: app {:08X} undefined\", app);\n    result = X_E_INVALIDARG;\n    XThread::SetLastError(X_ERROR_NOT_FOUND);\n  }\n  if (overlapped_ptr) {\n    kernel_state()->CompleteOverlappedImmediate(overlapped_ptr, result);\n    result = X_ERROR_IO_PENDING;\n  }\n  if (result == X_ERROR_SUCCESS || result == X_ERROR_IO_PENDING) {\n    XThread::SetLastError(0);\n  }\n  return result;\n}\n\ndword_result_t XMsgStartIORequestEx_entry(\n    dword_t app, dword_t message, pointer_t<XAM_OVERLAPPED> overlapped_ptr,\n    dword_t buffer_ptr, dword_t buffer_length,\n    pointer_t<XMSGSTARTIOREQUEST_UNKNOWNARG> unknown_ptr) {\n  return xeXMsgStartIORequestEx(app, message, overlapped_ptr, buffer_ptr,\n                                buffer_length, unknown_ptr);\n}\nDECLARE_XAM_EXPORT1(XMsgStartIORequestEx, kNone, kImplemented);\n\ndword_result_t XMsgStartIORequest_entry(\n    dword_t app, dword_t message, pointer_t<XAM_OVERLAPPED> overlapped_ptr,\n    dword_t buffer_ptr, dword_t buffer_length) {\n  return xeXMsgStartIORequestEx(app, message, overlapped_ptr, buffer_ptr,\n                                buffer_length, nullptr);\n}\nDECLARE_XAM_EXPORT1(XMsgStartIORequest, kNone, kImplemented);\n\ndword_result_t XMsgCancelIORequest_entry(\n    pointer_t<XAM_OVERLAPPED> overlapped_ptr, dword_t wait) {\n  X_HANDLE event_handle = XOverlappedGetEvent(overlapped_ptr);\n  if (event_handle && wait) {\n    auto ev =\n        kernel_state()->object_table()->LookupObject<XEvent>(event_handle);\n    if (ev) {\n      ev->Wait(0, 0, true, nullptr);\n    }\n  }\n\n  return 0;\n}\nDECLARE_XAM_EXPORT1(XMsgCancelIORequest, kNone, kImplemented);\n\ndword_result_t XMsgCompleteIORequest_entry(\n    pointer_t<XAM_OVERLAPPED> overlapped_ptr, dword_t result,\n    dword_t extended_error, dword_t length) {\n  kernel_state()->CompleteOverlappedImmediateEx(overlapped_ptr, result,\n                                                extended_error, length);\n  return X_ERROR_SUCCESS;\n}\nDECLARE_XAM_EXPORT2(XMsgCompleteIORequest, kNone, kImplemented, kSketchy);\n\ndword_result_t XamGetOverlappedResult_entry(\n    pointer_t<XAM_OVERLAPPED> overlapped_ptr, lpdword_t length_ptr,\n    dword_t unknown) {\n  uint32_t result;\n  if (overlapped_ptr->result != X_ERROR_IO_PENDING) {\n    result = overlapped_ptr->result;\n  } else if (!overlapped_ptr->event) {\n    result = X_ERROR_IO_INCOMPLETE;\n  } else {\n    auto ev = kernel_state()->object_table()->LookupObject<XEvent>(\n        overlapped_ptr->event);\n    result = ev->Wait(3, 1, 0, nullptr);\n    if (XSUCCEEDED(result)) {\n      result = overlapped_ptr->result;\n    } else {\n      result = xboxkrnl::xeRtlNtStatusToDosError(result);\n    }\n  }\n  if (XSUCCEEDED(result) && length_ptr) {\n    *length_ptr = overlapped_ptr->length;\n  }\n  return result;\n}\nDECLARE_XAM_EXPORT2(XamGetOverlappedResult, kNone, kImplemented, kSketchy);\n\n}  // namespace xam\n}  // namespace kernel\n}  // namespace xe\n\nDECLARE_XAM_EMPTY_REGISTER_EXPORTS(Msg);\n"
  },
  {
    "path": "src/xenia/kernel/xam/xam_net.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include <cstring>\n\n#include \"xenia/base/clock.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/util/shim_utils.h\"\n#include \"xenia/kernel/xam/xam_module.h\"\n#include \"xenia/kernel/xam/xam_private.h\"\n#include \"xenia/kernel/xboxkrnl/xboxkrnl_error.h\"\n#include \"xenia/kernel/xboxkrnl/xboxkrnl_threading.h\"\n#include \"xenia/kernel/xevent.h\"\n#include \"xenia/kernel/xsocket.h\"\n#include \"xenia/kernel/xthread.h\"\n#include \"xenia/xbox.h\"\n\n#ifdef XE_PLATFORM_WIN32\n// NOTE: must be included last as it expects windows.h to already be included.\n#define _WINSOCK_DEPRECATED_NO_WARNINGS  // inet_addr\n#include <winsock2.h>                    // NOLINT(build/include_order)\n#elif XE_PLATFORM_LINUX\n#include <arpa/inet.h>\n#include <netinet/in.h>\n#include <netinet/ip.h>\n#include <sys/socket.h>\n#endif\n\nnamespace xe {\nnamespace kernel {\nnamespace xam {\n\n// https://github.com/G91/TitanOffLine/blob/1e692d9bb9dfac386d08045ccdadf4ae3227bb5e/xkelib/xam/xamNet.h\nenum {\n  XNCALLER_INVALID = 0x0,\n  XNCALLER_TITLE = 0x1,\n  XNCALLER_SYSAPP = 0x2,\n  XNCALLER_XBDM = 0x3,\n  XNCALLER_TEST = 0x4,\n  NUM_XNCALLER_TYPES = 0x4,\n};\n\n// https://github.com/pmrowla/hl2sdk-csgo/blob/master/common/xbox/xboxstubs.h\ntypedef struct {\n  // FYI: IN_ADDR should be in network-byte order.\n  in_addr ina;                   // IP address (zero if not static/DHCP)\n  in_addr inaOnline;             // Online IP address (zero if not online)\n  xe::be<uint16_t> wPortOnline;  // Online port\n  uint8_t abEnet[6];             // Ethernet MAC address\n  uint8_t abOnline[20];          // Online identification\n} XNADDR;\n\ntypedef struct {\n  xe::be<int32_t> status;\n  xe::be<uint32_t> cina;\n  in_addr aina[8];\n} XNDNS;\n\ntypedef struct {\n  uint8_t flags;\n  uint8_t reserved;\n  xe::be<uint16_t> probes_xmit;\n  xe::be<uint16_t> probes_recv;\n  xe::be<uint16_t> data_len;\n  xe::be<uint32_t> data_ptr;\n  xe::be<uint16_t> rtt_min_in_msecs;\n  xe::be<uint16_t> rtt_med_in_msecs;\n  xe::be<uint32_t> up_bits_per_sec;\n  xe::be<uint32_t> down_bits_per_sec;\n} XNQOSINFO;\n\ntypedef struct {\n  xe::be<uint32_t> count;\n  xe::be<uint32_t> count_pending;\n  XNQOSINFO info[1];\n} XNQOS;\n\nstruct Xsockaddr_t {\n  xe::be<uint16_t> sa_family;\n  char sa_data[14];\n};\n\nstruct X_WSADATA {\n  xe::be<uint16_t> version;\n  xe::be<uint16_t> version_high;\n  char description[256 + 1];\n  char system_status[128 + 1];\n  xe::be<uint16_t> max_sockets;\n  xe::be<uint16_t> max_udpdg;\n  xe::be<uint32_t> vendor_info_ptr;\n};\n\nstruct XWSABUF {\n  xe::be<uint32_t> len;\n  xe::be<uint32_t> buf_ptr;\n};\n\nstruct XWSAOVERLAPPED {\n  xe::be<uint32_t> internal;\n  xe::be<uint32_t> internal_high;\n  union {\n    struct {\n      xe::be<uint32_t> low;\n      xe::be<uint32_t> high;\n    } offset;  // must be named to avoid GCC error\n    xe::be<uint32_t> pointer;\n  };\n  xe::be<uint32_t> event_handle;\n};\n\nvoid LoadSockaddr(const uint8_t* ptr, sockaddr* out_addr) {\n  out_addr->sa_family = xe::load_and_swap<uint16_t>(ptr + 0);\n  switch (out_addr->sa_family) {\n    case AF_INET: {\n      auto in_addr = reinterpret_cast<sockaddr_in*>(out_addr);\n      in_addr->sin_port = xe::load_and_swap<uint16_t>(ptr + 2);\n      // Maybe? Depends on type.\n      in_addr->sin_addr.s_addr = *(uint32_t*)(ptr + 4);\n      break;\n    }\n    default:\n      assert_unhandled_case(out_addr->sa_family);\n      break;\n  }\n}\n\nvoid StoreSockaddr(const sockaddr& addr, uint8_t* ptr) {\n  switch (addr.sa_family) {\n    case AF_UNSPEC:\n      std::memset(ptr, 0, sizeof(addr));\n      break;\n    case AF_INET: {\n      auto& in_addr = reinterpret_cast<const sockaddr_in&>(addr);\n      xe::store_and_swap<uint16_t>(ptr + 0, in_addr.sin_family);\n      xe::store_and_swap<uint16_t>(ptr + 2, in_addr.sin_port);\n      // Maybe? Depends on type.\n      xe::store_and_swap<uint32_t>(ptr + 4, in_addr.sin_addr.s_addr);\n      break;\n    }\n    default:\n      assert_unhandled_case(addr.sa_family);\n      break;\n  }\n}\n\n// https://github.com/joolswills/mameox/blob/master/MAMEoX/Sources/xbox_Network.cpp#L136\nstruct XNetStartupParams {\n  uint8_t cfgSizeOfStruct;\n  uint8_t cfgFlags;\n  uint8_t cfgSockMaxDgramSockets;\n  uint8_t cfgSockMaxStreamSockets;\n  uint8_t cfgSockDefaultRecvBufsizeInK;\n  uint8_t cfgSockDefaultSendBufsizeInK;\n  uint8_t cfgKeyRegMax;\n  uint8_t cfgSecRegMax;\n  uint8_t cfgQosDataLimitDiv4;\n  uint8_t cfgQosProbeTimeoutInSeconds;\n  uint8_t cfgQosProbeRetries;\n  uint8_t cfgQosSrvMaxSimultaneousResponses;\n  uint8_t cfgQosPairWaitTimeInSeconds;\n};\n\nXNetStartupParams xnet_startup_params = {0};\n\ndword_result_t NetDll_XNetStartup_entry(dword_t caller,\n                                        pointer_t<XNetStartupParams> params) {\n  if (params) {\n    assert_true(params->cfgSizeOfStruct == sizeof(XNetStartupParams));\n    std::memcpy(&xnet_startup_params, params, sizeof(XNetStartupParams));\n  }\n\n  auto xam = kernel_state()->GetKernelModule<XamModule>(\"xam.xex\");\n\n  /*\n  if (!xam->xnet()) {\n    auto xnet = new XNet(kernel_state());\n    xnet->Initialize();\n\n    xam->set_xnet(xnet);\n  }\n  */\n\n  return 0;\n}\nDECLARE_XAM_EXPORT1(NetDll_XNetStartup, kNetworking, kImplemented);\n\ndword_result_t NetDll_XNetCleanup_entry(dword_t caller, lpvoid_t params) {\n  auto xam = kernel_state()->GetKernelModule<XamModule>(\"xam.xex\");\n  // auto xnet = xam->xnet();\n  // xam->set_xnet(nullptr);\n\n  // TODO: Shut down and delete.\n  // delete xnet;\n\n  return 0;\n}\nDECLARE_XAM_EXPORT1(NetDll_XNetCleanup, kNetworking, kImplemented);\n\ndword_result_t NetDll_XNetGetOpt_entry(dword_t one, dword_t option_id,\n                                       lpvoid_t buffer_ptr,\n                                       lpdword_t buffer_size) {\n  assert_true(one == 1);\n  switch (option_id) {\n    case 1:\n      if (*buffer_size < sizeof(XNetStartupParams)) {\n        *buffer_size = sizeof(XNetStartupParams);\n        return 0x2738;  // WSAEMSGSIZE\n      }\n      std::memcpy(buffer_ptr, &xnet_startup_params, sizeof(XNetStartupParams));\n      return 0;\n    default:\n      XELOGE(\"NetDll_XNetGetOpt: option {} unimplemented\", option_id);\n      return 0x2726;  // WSAEINVAL\n  }\n}\nDECLARE_XAM_EXPORT1(NetDll_XNetGetOpt, kNetworking, kSketchy);\n\ndword_result_t NetDll_XNetRandom_entry(dword_t caller, lpvoid_t buffer_ptr,\n                                       dword_t length) {\n  // For now, constant values.\n  // This makes replicating things easier.\n  std::memset(buffer_ptr, 0xBB, length);\n\n  return 0;\n}\nDECLARE_XAM_EXPORT1(NetDll_XNetRandom, kNetworking, kStub);\n\ndword_result_t NetDll_WSAStartup_entry(dword_t caller, word_t version,\n                                       pointer_t<X_WSADATA> data_ptr) {\n// TODO(benvanik): abstraction layer needed.\n#ifdef XE_PLATFORM_WIN32\n  WSADATA wsaData;\n  ZeroMemory(&wsaData, sizeof(WSADATA));\n  int ret = WSAStartup(version, &wsaData);\n\n  auto data_out = kernel_state()->memory()->TranslateVirtual(data_ptr);\n\n  if (data_ptr) {\n    data_ptr->version = wsaData.wVersion;\n    data_ptr->version_high = wsaData.wHighVersion;\n    std::memcpy(&data_ptr->description, wsaData.szDescription, 0x100);\n    std::memcpy(&data_ptr->system_status, wsaData.szSystemStatus, 0x80);\n    data_ptr->max_sockets = wsaData.iMaxSockets;\n    data_ptr->max_udpdg = wsaData.iMaxUdpDg;\n\n    // Some games (5841099F) want this value round-tripped - they'll compare if\n    // it changes and bugcheck if it does.\n    uint32_t vendor_ptr = xe::load_and_swap<uint32_t>(data_out + 0x190);\n    xe::store_and_swap<uint32_t>(data_out + 0x190, vendor_ptr);\n  }\n#else\n  int ret = 0;\n  if (data_ptr) {\n    // Guess these values!\n    data_ptr->version = version.value();\n    data_ptr->description[0] = '\\0';\n    data_ptr->system_status[0] = '\\0';\n    data_ptr->max_sockets = 100;\n    data_ptr->max_udpdg = 1024;\n  }\n#endif\n\n  // DEBUG\n  /*\n  auto xam = kernel_state()->GetKernelModule<XamModule>(\"xam.xex\");\n  if (!xam->xnet()) {\n    auto xnet = new XNet(kernel_state());\n    xnet->Initialize();\n\n    xam->set_xnet(xnet);\n  }\n  */\n\n  return ret;\n}\nDECLARE_XAM_EXPORT1(NetDll_WSAStartup, kNetworking, kImplemented);\n\ndword_result_t NetDll_WSACleanup_entry(dword_t caller) {\n  // This does nothing. Xenia needs WSA running.\n  return 0;\n}\nDECLARE_XAM_EXPORT1(NetDll_WSACleanup, kNetworking, kImplemented);\n\ndword_result_t NetDll_WSAGetLastError_entry() {\n  return XThread::GetLastError();\n}\nDECLARE_XAM_EXPORT1(NetDll_WSAGetLastError, kNetworking, kImplemented);\n\ndword_result_t NetDll_WSARecvFrom_entry(\n    dword_t caller, dword_t socket, pointer_t<XWSABUF> buffers_ptr,\n    dword_t buffer_count, lpdword_t num_bytes_recv, lpdword_t flags_ptr,\n    pointer_t<XSOCKADDR_IN> from_addr, pointer_t<XWSAOVERLAPPED> overlapped_ptr,\n    lpvoid_t completion_routine_ptr) {\n  if (overlapped_ptr) {\n    // auto evt = kernel_state()->object_table()->LookupObject<XEvent>(\n    //    overlapped_ptr->event_handle);\n\n    // if (evt) {\n    //  //evt->Set(0, false);\n    //}\n  }\n\n  // we're not going to be receiving packets any time soon\n  // return error so we don't wait on that - Cancerous\n  return -1;\n}\nDECLARE_XAM_EXPORT2(NetDll_WSARecvFrom, kNetworking, kStub, kHighFrequency);\n\n// If the socket is a VDP socket, buffer 0 is the game data length, and buffer 1\n// is the unencrypted game data.\ndword_result_t NetDll_WSASendTo_entry(\n    dword_t caller, dword_t socket_handle, pointer_t<XWSABUF> buffers,\n    dword_t num_buffers, lpdword_t num_bytes_sent, dword_t flags,\n    pointer_t<XSOCKADDR_IN> to_ptr, dword_t to_len,\n    pointer_t<XWSAOVERLAPPED> overlapped, lpvoid_t completion_routine) {\n  assert(!overlapped);\n  assert(!completion_routine);\n\n  auto socket =\n      kernel_state()->object_table()->LookupObject<XSocket>(socket_handle);\n  if (!socket) {\n    // WSAENOTSOCK\n    XThread::SetLastError(0x2736);\n    return -1;\n  }\n\n  // Our sockets implementation doesn't support multiple buffers, so we need\n  // to combine the buffers the game has given us!\n  std::vector<uint8_t> combined_buffer_mem;\n  uint32_t combined_buffer_size = 0;\n  uint32_t combined_buffer_offset = 0;\n  for (uint32_t i = 0; i < num_buffers; i++) {\n    combined_buffer_size += buffers[i].len;\n    combined_buffer_mem.resize(combined_buffer_size);\n    uint8_t* combined_buffer = combined_buffer_mem.data();\n\n    std::memcpy(combined_buffer + combined_buffer_offset,\n                kernel_memory()->TranslateVirtual(buffers[i].buf_ptr),\n                buffers[i].len);\n    combined_buffer_offset += buffers[i].len;\n  }\n\n  N_XSOCKADDR_IN native_to(to_ptr);\n  socket->SendTo(combined_buffer_mem.data(), combined_buffer_size, flags,\n                 &native_to, to_len);\n\n  // TODO: Instantly complete overlapped\n\n  return 0;\n}\nDECLARE_XAM_EXPORT1(NetDll_WSASendTo, kNetworking, kImplemented);\n\ndword_result_t NetDll_WSAWaitForMultipleEvents_entry(dword_t num_events,\n                                                     lpdword_t events,\n                                                     dword_t wait_all,\n                                                     dword_t timeout,\n                                                     dword_t alertable) {\n  if (num_events > 64) {\n    XThread::SetLastError(87);  // ERROR_INVALID_PARAMETER\n    return ~0u;\n  }\n\n  uint64_t timeout_wait = (uint64_t)timeout;\n\n  X_STATUS result = 0;\n  do {\n    result = xboxkrnl::xeNtWaitForMultipleObjectsEx(\n        num_events, events, wait_all, 1, alertable,\n        timeout != -1 ? &timeout_wait : nullptr);\n  } while (result == X_STATUS_ALERTED);\n\n  if (XFAILED(result)) {\n    uint32_t error = xboxkrnl::xeRtlNtStatusToDosError(result);\n    XThread::SetLastError(error);\n    return ~0u;\n  }\n  return 0;\n}\nDECLARE_XAM_EXPORT2(NetDll_WSAWaitForMultipleEvents, kNetworking, kImplemented,\n                    kBlocking);\n\ndword_result_t NetDll_WSACreateEvent_entry() {\n  XEvent* ev = new XEvent(kernel_state());\n  ev->Initialize(true, false);\n  return ev->handle();\n}\nDECLARE_XAM_EXPORT1(NetDll_WSACreateEvent, kNetworking, kImplemented);\n\ndword_result_t NetDll_WSACloseEvent_entry(dword_t event_handle) {\n  X_STATUS result = kernel_state()->object_table()->ReleaseHandle(event_handle);\n  if (XFAILED(result)) {\n    uint32_t error = xboxkrnl::xeRtlNtStatusToDosError(result);\n    XThread::SetLastError(error);\n    return 0;\n  }\n  return 1;\n}\nDECLARE_XAM_EXPORT1(NetDll_WSACloseEvent, kNetworking, kImplemented);\n\ndword_result_t NetDll_WSAResetEvent_entry(dword_t event_handle) {\n  X_STATUS result = xboxkrnl::xeNtClearEvent(event_handle);\n  if (XFAILED(result)) {\n    uint32_t error = xboxkrnl::xeRtlNtStatusToDosError(result);\n    XThread::SetLastError(error);\n    return 0;\n  }\n  return 1;\n}\nDECLARE_XAM_EXPORT1(NetDll_WSAResetEvent, kNetworking, kImplemented);\n\ndword_result_t NetDll_WSASetEvent_entry(dword_t event_handle) {\n  X_STATUS result = xboxkrnl::xeNtSetEvent(event_handle, nullptr);\n  if (XFAILED(result)) {\n    uint32_t error = xboxkrnl::xeRtlNtStatusToDosError(result);\n    XThread::SetLastError(error);\n    return 0;\n  }\n  return 1;\n}\nDECLARE_XAM_EXPORT1(NetDll_WSASetEvent, kNetworking, kImplemented);\n\nstruct XnAddrStatus {\n  // Address acquisition is not yet complete\n  static const uint32_t XNET_GET_XNADDR_PENDING = 0x00000000;\n  // XNet is uninitialized or no debugger found\n  static const uint32_t XNET_GET_XNADDR_NONE = 0x00000001;\n  // Host has ethernet address (no IP address)\n  static const uint32_t XNET_GET_XNADDR_ETHERNET = 0x00000002;\n  // Host has statically assigned IP address\n  static const uint32_t XNET_GET_XNADDR_STATIC = 0x00000004;\n  // Host has DHCP assigned IP address\n  static const uint32_t XNET_GET_XNADDR_DHCP = 0x00000008;\n  // Host has PPPoE assigned IP address\n  static const uint32_t XNET_GET_XNADDR_PPPOE = 0x00000010;\n  // Host has one or more gateways configured\n  static const uint32_t XNET_GET_XNADDR_GATEWAY = 0x00000020;\n  // Host has one or more DNS servers configured\n  static const uint32_t XNET_GET_XNADDR_DNS = 0x00000040;\n  // Host is currently connected to online service\n  static const uint32_t XNET_GET_XNADDR_ONLINE = 0x00000080;\n  // Network configuration requires troubleshooting\n  static const uint32_t XNET_GET_XNADDR_TROUBLESHOOT = 0x00008000;\n};\n\ndword_result_t NetDll_XNetGetTitleXnAddr_entry(dword_t caller,\n                                               pointer_t<XNADDR> addr_ptr) {\n  // Just return a loopback address atm.\n  addr_ptr->ina.s_addr = htonl(INADDR_LOOPBACK);\n  addr_ptr->inaOnline.s_addr = 0;\n  addr_ptr->wPortOnline = 0;\n\n  // TODO(gibbed): A proper mac address.\n  // RakNet's 360 version appears to depend on abEnet to create \"random\" 64-bit\n  // numbers. A zero value will cause RakPeer::Startup to fail. This causes\n  // 58411436 to crash on startup.\n  // The 360-specific code is scrubbed from the RakNet repo, but there's still\n  // traces of what it's doing which match the game code.\n  // https://github.com/facebookarchive/RakNet/blob/master/Source/RakPeer.cpp#L382\n  // https://github.com/facebookarchive/RakNet/blob/master/Source/RakPeer.cpp#L4527\n  // https://github.com/facebookarchive/RakNet/blob/master/Source/RakPeer.cpp#L4467\n  // \"Mac address is a poor solution because you can't have multiple connections\n  // from the same system\"\n  std::memset(addr_ptr->abEnet, 0xCC, 6);\n\n  std::memset(addr_ptr->abOnline, 0, 20);\n\n  return XnAddrStatus::XNET_GET_XNADDR_STATIC;\n}\nDECLARE_XAM_EXPORT1(NetDll_XNetGetTitleXnAddr, kNetworking, kStub);\n\ndword_result_t NetDll_XNetGetDebugXnAddr_entry(dword_t caller,\n                                               pointer_t<XNADDR> addr_ptr) {\n  addr_ptr.Zero();\n\n  // XNET_GET_XNADDR_NONE causes caller to gracefully return.\n  return XnAddrStatus::XNET_GET_XNADDR_NONE;\n}\nDECLARE_XAM_EXPORT1(NetDll_XNetGetDebugXnAddr, kNetworking, kStub);\n\ndword_result_t NetDll_XNetXnAddrToMachineId_entry(dword_t caller,\n                                                  pointer_t<XNADDR> addr_ptr,\n                                                  lpdword_t id_ptr) {\n  // Tell the caller we're not signed in to live (non-zero ret)\n  return 1;\n}\nDECLARE_XAM_EXPORT1(NetDll_XNetXnAddrToMachineId, kNetworking, kStub);\n\nvoid NetDll_XNetInAddrToString_entry(dword_t caller, dword_t in_addr,\n                                     lpstring_t string_out,\n                                     dword_t string_size) {\n  strncpy(string_out, \"666.666.666.666\", string_size);\n}\nDECLARE_XAM_EXPORT1(NetDll_XNetInAddrToString, kNetworking, kStub);\n\n// This converts a XNet address to an IN_ADDR. The IN_ADDR is used for\n// subsequent socket calls (like a handle to a XNet address)\ndword_result_t NetDll_XNetXnAddrToInAddr_entry(dword_t caller,\n                                               pointer_t<XNADDR> xn_addr,\n                                               lpvoid_t xid, lpvoid_t in_addr) {\n  return 1;\n}\nDECLARE_XAM_EXPORT1(NetDll_XNetXnAddrToInAddr, kNetworking, kStub);\n\n// Does the reverse of the above.\n// FIXME: Arguments may not be correct.\ndword_result_t NetDll_XNetInAddrToXnAddr_entry(dword_t caller, lpvoid_t in_addr,\n                                               pointer_t<XNADDR> xn_addr,\n                                               lpvoid_t xid) {\n  return 1;\n}\nDECLARE_XAM_EXPORT1(NetDll_XNetInAddrToXnAddr, kNetworking, kStub);\n\n// https://www.google.com/patents/WO2008112448A1?cl=en\n// Reserves a port for use by system link\ndword_result_t NetDll_XNetSetSystemLinkPort_entry(dword_t caller,\n                                                  dword_t port) {\n  return 1;\n}\nDECLARE_XAM_EXPORT1(NetDll_XNetSetSystemLinkPort, kNetworking, kStub);\n\n// https://github.com/ILOVEPIE/Cxbx-Reloaded/blob/master/src/CxbxKrnl/EmuXOnline.h#L39\nstruct XEthernetStatus {\n  static const uint32_t XNET_ETHERNET_LINK_ACTIVE = 0x01;\n  static const uint32_t XNET_ETHERNET_LINK_100MBPS = 0x02;\n  static const uint32_t XNET_ETHERNET_LINK_10MBPS = 0x04;\n  static const uint32_t XNET_ETHERNET_LINK_FULL_DUPLEX = 0x08;\n  static const uint32_t XNET_ETHERNET_LINK_HALF_DUPLEX = 0x10;\n};\n\ndword_result_t NetDll_XNetGetEthernetLinkStatus_entry(dword_t caller) {\n  return 0;\n}\nDECLARE_XAM_EXPORT1(NetDll_XNetGetEthernetLinkStatus, kNetworking, kStub);\n\ndword_result_t NetDll_XNetDnsLookup_entry(dword_t caller, lpstring_t host,\n                                          dword_t event_handle,\n                                          lpdword_t pdns) {\n  // TODO(gibbed): actually implement this\n  if (pdns) {\n    auto dns_guest = kernel_memory()->SystemHeapAlloc(sizeof(XNDNS));\n    auto dns = kernel_memory()->TranslateVirtual<XNDNS*>(dns_guest);\n    dns->status = 1;  // non-zero = error\n    *pdns = dns_guest;\n  }\n  if (event_handle) {\n    auto ev =\n        kernel_state()->object_table()->LookupObject<XEvent>(event_handle);\n    assert_not_null(ev);\n    ev->Set(0, false);\n  }\n  return 0;\n}\nDECLARE_XAM_EXPORT1(NetDll_XNetDnsLookup, kNetworking, kStub);\n\ndword_result_t NetDll_XNetDnsRelease_entry(dword_t caller,\n                                           pointer_t<XNDNS> dns) {\n  if (!dns) {\n    return X_STATUS_INVALID_PARAMETER;\n  }\n  kernel_memory()->SystemHeapFree(dns.guest_address());\n  return 0;\n}\nDECLARE_XAM_EXPORT1(NetDll_XNetDnsRelease, kNetworking, kStub);\n\ndword_result_t NetDll_XNetQosServiceLookup_entry(dword_t caller, dword_t flags,\n                                                 dword_t event_handle,\n                                                 lpdword_t pqos) {\n  // Set pqos as some games will try accessing it despite non-successful result\n  if (pqos) {\n    auto qos_guest = kernel_memory()->SystemHeapAlloc(sizeof(XNQOS));\n    auto qos = kernel_memory()->TranslateVirtual<XNQOS*>(qos_guest);\n    qos->count = qos->count_pending = 0;\n    *pqos = qos_guest;\n  }\n  if (event_handle) {\n    auto ev =\n        kernel_state()->object_table()->LookupObject<XEvent>(event_handle);\n    assert_not_null(ev);\n    ev->Set(0, false);\n  }\n  return 0;\n}\nDECLARE_XAM_EXPORT1(NetDll_XNetQosServiceLookup, kNetworking, kStub);\n\ndword_result_t NetDll_XNetQosRelease_entry(dword_t caller,\n                                           pointer_t<XNQOS> qos) {\n  if (!qos) {\n    return X_STATUS_INVALID_PARAMETER;\n  }\n  kernel_memory()->SystemHeapFree(qos.guest_address());\n  return 0;\n}\nDECLARE_XAM_EXPORT1(NetDll_XNetQosRelease, kNetworking, kStub);\n\ndword_result_t NetDll_XNetQosListen_entry(dword_t caller, lpvoid_t id,\n                                          lpvoid_t data, dword_t data_size,\n                                          dword_t r7, dword_t flags) {\n  return X_ERROR_FUNCTION_FAILED;\n}\nDECLARE_XAM_EXPORT1(NetDll_XNetQosListen, kNetworking, kStub);\n\ndword_result_t NetDll_inet_addr_entry(lpstring_t addr_ptr) {\n  if (!addr_ptr) {\n    return -1;\n  }\n\n  uint32_t addr = inet_addr(addr_ptr);\n  // https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-inet_addr#return-value\n  // Based on console research it seems like x360 uses old version of inet_addr\n  // In case of empty string it return 0 instead of -1\n  if (addr == -1 && !addr_ptr.value().length()) {\n    return 0;\n  }\n\n  return xe::byte_swap(addr);\n}\nDECLARE_XAM_EXPORT1(NetDll_inet_addr, kNetworking, kImplemented);\n\ndword_result_t NetDll_socket_entry(dword_t caller, dword_t af, dword_t type,\n                                   dword_t protocol) {\n  XSocket* socket = new XSocket(kernel_state());\n  X_STATUS result = socket->Initialize(XSocket::AddressFamily((uint32_t)af),\n                                       XSocket::Type((uint32_t)type),\n                                       XSocket::Protocol((uint32_t)protocol));\n\n  if (XFAILED(result)) {\n    socket->Release();\n\n    uint32_t error = xboxkrnl::xeRtlNtStatusToDosError(result);\n    XThread::SetLastError(error);\n    return -1;\n  }\n\n  return socket->handle();\n}\nDECLARE_XAM_EXPORT1(NetDll_socket, kNetworking, kImplemented);\n\ndword_result_t NetDll_closesocket_entry(dword_t caller, dword_t socket_handle) {\n  auto socket =\n      kernel_state()->object_table()->LookupObject<XSocket>(socket_handle);\n  if (!socket) {\n    // WSAENOTSOCK\n    XThread::SetLastError(0x2736);\n    return -1;\n  }\n\n  // TODO: Absolutely delete this object. It is no longer valid after calling\n  // closesocket.\n  socket->Close();\n  socket->ReleaseHandle();\n  return 0;\n}\nDECLARE_XAM_EXPORT1(NetDll_closesocket, kNetworking, kImplemented);\n\nint_result_t NetDll_shutdown_entry(dword_t caller, dword_t socket_handle,\n                                   int_t how) {\n  auto socket =\n      kernel_state()->object_table()->LookupObject<XSocket>(socket_handle);\n  if (!socket) {\n    // WSAENOTSOCK\n    XThread::SetLastError(0x2736);\n    return -1;\n  }\n\n  auto ret = socket->Shutdown(how);\n  if (ret == -1) {\n#ifdef XE_PLATFORM_WIN32\n    uint32_t error_code = WSAGetLastError();\n    XThread::SetLastError(error_code);\n#else\n    XThread::SetLastError(0x0);\n#endif\n  }\n  return ret;\n}\nDECLARE_XAM_EXPORT1(NetDll_shutdown, kNetworking, kImplemented);\n\ndword_result_t NetDll_setsockopt_entry(dword_t caller, dword_t socket_handle,\n                                       dword_t level, dword_t optname,\n                                       lpvoid_t optval_ptr, dword_t optlen) {\n  auto socket =\n      kernel_state()->object_table()->LookupObject<XSocket>(socket_handle);\n  if (!socket) {\n    // WSAENOTSOCK\n    XThread::SetLastError(0x2736);\n    return -1;\n  }\n\n  X_STATUS status = socket->SetOption(level, optname, optval_ptr, optlen);\n  return XSUCCEEDED(status) ? 0 : -1;\n}\nDECLARE_XAM_EXPORT1(NetDll_setsockopt, kNetworking, kImplemented);\n\ndword_result_t NetDll_ioctlsocket_entry(dword_t caller, dword_t socket_handle,\n                                        dword_t cmd, lpvoid_t arg_ptr) {\n  auto socket =\n      kernel_state()->object_table()->LookupObject<XSocket>(socket_handle);\n  if (!socket) {\n    // WSAENOTSOCK\n    XThread::SetLastError(0x2736);\n    return -1;\n  }\n\n  X_STATUS status = socket->IOControl(cmd, arg_ptr);\n  if (XFAILED(status)) {\n    XThread::SetLastError(xboxkrnl::xeRtlNtStatusToDosError(status));\n    return -1;\n  }\n\n  // TODO\n  return 0;\n}\nDECLARE_XAM_EXPORT1(NetDll_ioctlsocket, kNetworking, kImplemented);\n\ndword_result_t NetDll_bind_entry(dword_t caller, dword_t socket_handle,\n                                 pointer_t<XSOCKADDR_IN> name,\n                                 dword_t namelen) {\n  auto socket =\n      kernel_state()->object_table()->LookupObject<XSocket>(socket_handle);\n  if (!socket) {\n    // WSAENOTSOCK\n    XThread::SetLastError(0x2736);\n    return -1;\n  }\n\n  N_XSOCKADDR_IN native_name(name);\n  X_STATUS status = socket->Bind(&native_name, namelen);\n  if (XFAILED(status)) {\n    XThread::SetLastError(xboxkrnl::xeRtlNtStatusToDosError(status));\n    return -1;\n  }\n\n  return 0;\n}\nDECLARE_XAM_EXPORT1(NetDll_bind, kNetworking, kImplemented);\n\ndword_result_t NetDll_connect_entry(dword_t caller, dword_t socket_handle,\n                                    pointer_t<XSOCKADDR> name,\n                                    dword_t namelen) {\n  auto socket =\n      kernel_state()->object_table()->LookupObject<XSocket>(socket_handle);\n  if (!socket) {\n    // WSAENOTSOCK\n    XThread::SetLastError(0x2736);\n    return -1;\n  }\n\n  N_XSOCKADDR native_name(name);\n  X_STATUS status = socket->Connect(&native_name, namelen);\n  if (XFAILED(status)) {\n    XThread::SetLastError(xboxkrnl::xeRtlNtStatusToDosError(status));\n    return -1;\n  }\n\n  return 0;\n}\nDECLARE_XAM_EXPORT1(NetDll_connect, kNetworking, kImplemented);\n\ndword_result_t NetDll_listen_entry(dword_t caller, dword_t socket_handle,\n                                   int_t backlog) {\n  auto socket =\n      kernel_state()->object_table()->LookupObject<XSocket>(socket_handle);\n  if (!socket) {\n    // WSAENOTSOCK\n    XThread::SetLastError(0x2736);\n    return -1;\n  }\n\n  X_STATUS status = socket->Listen(backlog);\n  if (XFAILED(status)) {\n    XThread::SetLastError(xboxkrnl::xeRtlNtStatusToDosError(status));\n    return -1;\n  }\n\n  return 0;\n}\nDECLARE_XAM_EXPORT1(NetDll_listen, kNetworking, kImplemented);\n\ndword_result_t NetDll_accept_entry(dword_t caller, dword_t socket_handle,\n                                   pointer_t<XSOCKADDR> addr_ptr,\n                                   lpdword_t addrlen_ptr) {\n  if (!addr_ptr) {\n    // WSAEFAULT\n    XThread::SetLastError(0x271E);\n    return -1;\n  }\n\n  auto socket =\n      kernel_state()->object_table()->LookupObject<XSocket>(socket_handle);\n  if (!socket) {\n    // WSAENOTSOCK\n    XThread::SetLastError(0x2736);\n    return -1;\n  }\n\n  N_XSOCKADDR native_addr(addr_ptr);\n  int native_len = *addrlen_ptr;\n  auto new_socket = socket->Accept(&native_addr, &native_len);\n  if (new_socket) {\n    addr_ptr->address_family = native_addr.address_family;\n    std::memcpy(addr_ptr->sa_data, native_addr.sa_data, *addrlen_ptr - 2);\n    *addrlen_ptr = native_len;\n\n    return new_socket->handle();\n  } else {\n    return -1;\n  }\n}\nDECLARE_XAM_EXPORT1(NetDll_accept, kNetworking, kImplemented);\n\nstruct x_fd_set {\n  xe::be<uint32_t> fd_count;\n  xe::be<uint32_t> fd_array[64];\n};\n\nstruct host_set {\n  uint32_t count;\n  object_ref<XSocket> sockets[64];\n\n  void Load(const x_fd_set* guest_set) {\n    assert_true(guest_set->fd_count < 64);\n    this->count = guest_set->fd_count;\n    for (uint32_t i = 0; i < this->count; ++i) {\n      auto socket_handle = static_cast<X_HANDLE>(guest_set->fd_array[i]);\n      if (socket_handle == -1) {\n        this->count = i;\n        break;\n      }\n      // Convert from Xenia -> native\n      auto socket =\n          kernel_state()->object_table()->LookupObject<XSocket>(socket_handle);\n      assert_not_null(socket);\n      this->sockets[i] = socket;\n    }\n  }\n\n  void Store(x_fd_set* guest_set) {\n    guest_set->fd_count = 0;\n    for (uint32_t i = 0; i < this->count; ++i) {\n      auto socket = this->sockets[i];\n      guest_set->fd_array[guest_set->fd_count++] = socket->handle();\n    }\n  }\n\n  void Store(fd_set* native_set) {\n    FD_ZERO(native_set);\n    for (uint32_t i = 0; i < this->count; ++i) {\n      FD_SET(this->sockets[i]->native_handle(), native_set);\n    }\n  }\n\n  void UpdateFrom(fd_set* native_set) {\n    uint32_t new_count = 0;\n    for (uint32_t i = 0; i < this->count; ++i) {\n      auto socket = this->sockets[i];\n      if (FD_ISSET(socket->native_handle(), native_set)) {\n        this->sockets[new_count++] = socket;\n      }\n    }\n    this->count = new_count;\n  }\n};\n\nint_result_t NetDll_select_entry(int_t caller, int_t nfds,\n                                 pointer_t<x_fd_set> readfds,\n                                 pointer_t<x_fd_set> writefds,\n                                 pointer_t<x_fd_set> exceptfds,\n                                 lpvoid_t timeout_ptr) {\n  host_set host_readfds = {0};\n  fd_set native_readfds = {0};\n  if (readfds) {\n    host_readfds.Load(readfds);\n    host_readfds.Store(&native_readfds);\n  }\n  host_set host_writefds = {0};\n  fd_set native_writefds = {0};\n  if (writefds) {\n    host_writefds.Load(writefds);\n    host_writefds.Store(&native_writefds);\n  }\n  host_set host_exceptfds = {0};\n  fd_set native_exceptfds = {0};\n  if (exceptfds) {\n    host_exceptfds.Load(exceptfds);\n    host_exceptfds.Store(&native_exceptfds);\n  }\n  timeval* timeout_in = nullptr;\n  timeval timeout;\n  if (timeout_ptr) {\n    timeout = {static_cast<int32_t>(timeout_ptr.as_array<int32_t>()[0]),\n               static_cast<int32_t>(timeout_ptr.as_array<int32_t>()[1])};\n    Clock::ScaleGuestDurationTimeval(\n        reinterpret_cast<int32_t*>(&timeout.tv_sec),\n        reinterpret_cast<int32_t*>(&timeout.tv_usec));\n    timeout_in = &timeout;\n  }\n  int ret = select(nfds, readfds ? &native_readfds : nullptr,\n                   writefds ? &native_writefds : nullptr,\n                   exceptfds ? &native_exceptfds : nullptr, timeout_in);\n  if (readfds) {\n    host_readfds.UpdateFrom(&native_readfds);\n    host_readfds.Store(readfds);\n  }\n  if (writefds) {\n    host_writefds.UpdateFrom(&native_writefds);\n    host_writefds.Store(writefds);\n  }\n  if (exceptfds) {\n    host_exceptfds.UpdateFrom(&native_exceptfds);\n    host_exceptfds.Store(exceptfds);\n  }\n\n  // TODO(gibbed): modify ret to be what's actually copied to the guest fd_sets?\n  return ret;\n}\nDECLARE_XAM_EXPORT1(NetDll_select, kNetworking, kImplemented);\n\ndword_result_t NetDll_recv_entry(dword_t caller, dword_t socket_handle,\n                                 lpvoid_t buf_ptr, dword_t buf_len,\n                                 dword_t flags) {\n  auto socket =\n      kernel_state()->object_table()->LookupObject<XSocket>(socket_handle);\n  if (!socket) {\n    // WSAENOTSOCK\n    XThread::SetLastError(0x2736);\n    return -1;\n  }\n\n  return socket->Recv(buf_ptr, buf_len, flags);\n}\nDECLARE_XAM_EXPORT1(NetDll_recv, kNetworking, kImplemented);\n\ndword_result_t NetDll_recvfrom_entry(dword_t caller, dword_t socket_handle,\n                                     lpvoid_t buf_ptr, dword_t buf_len,\n                                     dword_t flags,\n                                     pointer_t<XSOCKADDR_IN> from_ptr,\n                                     lpdword_t fromlen_ptr) {\n  auto socket =\n      kernel_state()->object_table()->LookupObject<XSocket>(socket_handle);\n  if (!socket) {\n    // WSAENOTSOCK\n    XThread::SetLastError(0x2736);\n    return -1;\n  }\n\n  N_XSOCKADDR_IN native_from;\n  if (from_ptr) {\n    native_from = *from_ptr;\n  }\n  uint32_t native_fromlen = fromlen_ptr ? fromlen_ptr.value() : 0;\n  int ret = socket->RecvFrom(buf_ptr, buf_len, flags, &native_from,\n                             fromlen_ptr ? &native_fromlen : 0);\n\n  if (from_ptr) {\n    from_ptr->sin_family = native_from.sin_family;\n    from_ptr->sin_port = native_from.sin_port;\n    from_ptr->sin_addr = native_from.sin_addr;\n    std::memset(from_ptr->x_sin_zero, 0, sizeof(from_ptr->x_sin_zero));\n  }\n  if (fromlen_ptr) {\n    *fromlen_ptr = native_fromlen;\n  }\n\n  if (ret == -1) {\n// TODO: Better way of getting the error code\n#ifdef XE_PLATFORM_WIN32\n    uint32_t error_code = WSAGetLastError();\n    XThread::SetLastError(error_code);\n#else\n    XThread::SetLastError(0x0);\n#endif\n  }\n\n  return ret;\n}\nDECLARE_XAM_EXPORT1(NetDll_recvfrom, kNetworking, kImplemented);\n\ndword_result_t NetDll_send_entry(dword_t caller, dword_t socket_handle,\n                                 lpvoid_t buf_ptr, dword_t buf_len,\n                                 dword_t flags) {\n  auto socket =\n      kernel_state()->object_table()->LookupObject<XSocket>(socket_handle);\n  if (!socket) {\n    // WSAENOTSOCK\n    XThread::SetLastError(0x2736);\n    return -1;\n  }\n\n  return socket->Send(buf_ptr, buf_len, flags);\n}\nDECLARE_XAM_EXPORT1(NetDll_send, kNetworking, kImplemented);\n\ndword_result_t NetDll_sendto_entry(dword_t caller, dword_t socket_handle,\n                                   lpvoid_t buf_ptr, dword_t buf_len,\n                                   dword_t flags,\n                                   pointer_t<XSOCKADDR_IN> to_ptr,\n                                   dword_t to_len) {\n  auto socket =\n      kernel_state()->object_table()->LookupObject<XSocket>(socket_handle);\n  if (!socket) {\n    // WSAENOTSOCK\n    XThread::SetLastError(0x2736);\n    return -1;\n  }\n\n  N_XSOCKADDR_IN native_to(to_ptr);\n  return socket->SendTo(buf_ptr, buf_len, flags, &native_to, to_len);\n}\nDECLARE_XAM_EXPORT1(NetDll_sendto, kNetworking, kImplemented);\n\ndword_result_t NetDll___WSAFDIsSet_entry(dword_t socket_handle,\n                                         pointer_t<x_fd_set> fd_set) {\n  const uint8_t max_fd_count =\n      std::min((uint32_t)fd_set->fd_count, uint32_t(64));\n  for (uint8_t i = 0; i < max_fd_count; i++) {\n    if (fd_set->fd_array[i] == socket_handle) {\n      return 1;\n    }\n  }\n  return 0;\n}\nDECLARE_XAM_EXPORT1(NetDll___WSAFDIsSet, kNetworking, kImplemented);\n\nvoid NetDll_WSASetLastError_entry(dword_t error_code) {\n  XThread::SetLastError(error_code);\n}\nDECLARE_XAM_EXPORT1(NetDll_WSASetLastError, kNetworking, kImplemented);\n\n}  // namespace xam\n}  // namespace kernel\n}  // namespace xe\n\nDECLARE_XAM_EMPTY_REGISTER_EXPORTS(Net);\n"
  },
  {
    "path": "src/xenia/kernel/xam/xam_notify.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/logging.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/util/shim_utils.h\"\n#include \"xenia/kernel/xam/xam_private.h\"\n#include \"xenia/kernel/xnotifylistener.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xam {\n\nuint32_t xeXamNotifyCreateListener(uint64_t mask, uint32_t is_system,\n                                   uint32_t max_version) {\n  assert_true(max_version < 11);\n\n  if (max_version > 10) {\n    max_version = 10;\n  }\n\n  auto listener =\n      object_ref<XNotifyListener>(new XNotifyListener(kernel_state()));\n  listener->Initialize(mask, max_version);\n\n  // Handle ref is incremented, so return that.\n  uint32_t handle = listener->handle();\n\n  return handle;\n}\n\ndword_result_t XamNotifyCreateListener_entry(qword_t mask,\n                                             dword_t max_version) {\n  return xeXamNotifyCreateListener(mask, 0, max_version);\n}\nDECLARE_XAM_EXPORT1(XamNotifyCreateListener, kNone, kImplemented);\n\ndword_result_t XamNotifyCreateListenerInternal_entry(qword_t mask,\n                                                     dword_t is_system,\n                                                     dword_t max_version) {\n  return xeXamNotifyCreateListener(mask, is_system, max_version);\n}\nDECLARE_XAM_EXPORT1(XamNotifyCreateListenerInternal, kNone, kImplemented);\n\n// https://github.com/CodeAsm/ffplay360/blob/master/Common/AtgSignIn.cpp\ndword_result_t XNotifyGetNext_entry(dword_t handle, dword_t match_id,\n                                    lpdword_t id_ptr, lpdword_t param_ptr) {\n  if (param_ptr) {\n    *param_ptr = 0;\n  }\n\n  if (!id_ptr) {\n    return 0;\n  }\n  *id_ptr = 0;\n\n  // Grab listener.\n  auto listener =\n      kernel_state()->object_table()->LookupObject<XNotifyListener>(handle);\n  if (!listener) {\n    return 0;\n  }\n\n  bool dequeued = false;\n  uint32_t id = 0;\n  uint32_t param = 0;\n  if (match_id) {\n    // Asking for a specific notification\n    id = match_id;\n    dequeued = listener->DequeueNotification(match_id, &param);\n  } else {\n    // Just get next.\n    dequeued = listener->DequeueNotification(&id, &param);\n  }\n\n  *id_ptr = dequeued ? id : 0;\n  // param_ptr may be null - 555307F0 Demo explicitly passes nullptr in the\n  // code.\n  // https://github.com/xenia-project/xenia/pull/1577\n  if (param_ptr) {\n    *param_ptr = dequeued ? param : 0;\n  }\n  return dequeued ? 1 : 0;\n}\nDECLARE_XAM_EXPORT2(XNotifyGetNext, kNone, kImplemented, kHighFrequency);\n\ndword_result_t XNotifyDelayUI_entry(dword_t delay_ms) {\n  // Ignored.\n  return 0;\n}\nDECLARE_XAM_EXPORT1(XNotifyDelayUI, kNone, kStub);\n\nvoid XNotifyPositionUI_entry(dword_t position) {\n  // Ignored.\n}\nDECLARE_XAM_EXPORT1(XNotifyPositionUI, kNone, kStub);\n\n}  // namespace xam\n}  // namespace kernel\n}  // namespace xe\n\nDECLARE_XAM_EMPTY_REGISTER_EXPORTS(Notify);\n"
  },
  {
    "path": "src/xenia/kernel/xam/xam_nui.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/logging.h\"\n#include \"xenia/emulator.h\"\n#include \"xenia/kernel/kernel_flags.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/util/shim_utils.h\"\n#include \"xenia/kernel/xam/xam_private.h\"\n#include \"xenia/ui/imgui_dialog.h\"\n#include \"xenia/ui/imgui_drawer.h\"\n#include \"xenia/ui/window.h\"\n#include \"xenia/ui/windowed_app_context.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xam {\n\nextern std::atomic<int> xam_dialogs_shown_;\n\nstruct X_NUI_DEVICE_STATUS {\n  xe::be<uint32_t> unk0;\n  xe::be<uint32_t> unk1;\n  xe::be<uint32_t> unk2;\n  xe::be<uint32_t> status;\n  xe::be<uint32_t> unk4;\n  xe::be<uint32_t> unk5;\n};\nstatic_assert(sizeof(X_NUI_DEVICE_STATUS) == 24, \"Size matters\");\n\nvoid XamNuiGetDeviceStatus_entry(pointer_t<X_NUI_DEVICE_STATUS> status_ptr) {\n  status_ptr.Zero();\n  status_ptr->status = 0;  // Not connected.\n}\nDECLARE_XAM_EXPORT1(XamNuiGetDeviceStatus, kNone, kStub);\n\ndword_result_t XamShowNuiTroubleshooterUI_entry(unknown_t unk1, unknown_t unk2,\n                                                unknown_t unk3) {\n  // unk1 is 0xFF - possibly user index?\n  // unk2, unk3 appear to always be zero.\n\n  if (cvars::headless) {\n    return 0;\n  }\n\n  const Emulator* emulator = kernel_state()->emulator();\n  ui::Window* display_window = emulator->display_window();\n  ui::ImGuiDrawer* imgui_drawer = emulator->imgui_drawer();\n  if (display_window && imgui_drawer) {\n    xe::threading::Fence fence;\n    if (display_window->app_context().CallInUIThreadSynchronous([&]() {\n          xe::ui::ImGuiDialog::ShowMessageBox(\n              imgui_drawer, \"NUI Troubleshooter\",\n              \"The game has indicated there is a problem with NUI (Kinect).\")\n              ->Then(&fence);\n        })) {\n      ++xam_dialogs_shown_;\n      fence.Wait();\n      --xam_dialogs_shown_;\n    }\n  }\n\n  return 0;\n}\nDECLARE_XAM_EXPORT1(XamShowNuiTroubleshooterUI, kNone, kStub);\n\n}  // namespace xam\n}  // namespace kernel\n}  // namespace xe\n\nDECLARE_XAM_EMPTY_REGISTER_EXPORTS(NUI);\n"
  },
  {
    "path": "src/xenia/kernel/xam/xam_ordinals.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_KERNEL_XAM_XAM_ORDINALS_H_\n#define XENIA_KERNEL_XAM_XAM_ORDINALS_H_\n\n#include \"xenia/cpu/export_resolver.h\"\n\n// Build an ordinal enum to make it easy to lookup ordinals.\n#include \"xenia/kernel/util/ordinal_table_pre.inc\"\nnamespace ordinals {\nenum {\n#include \"xenia/kernel/xam/xam_table.inc\"\n};\n}  // namespace ordinals\n#include \"xenia/kernel/util/ordinal_table_post.inc\"\n\n#endif  // XENIA_KERNEL_XAM_XAM_ORDINALS_H_\n"
  },
  {
    "path": "src/xenia/kernel/xam/xam_party.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/util/shim_utils.h\"\n#include \"xenia/kernel/xam/xam_private.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xam {\n\ndword_result_t XamPartyGetUserList_entry(dword_t player_count,\n                                         lpdword_t party_list) {\n  // 5345085D wants specifically this code to skip loading party data.\n  // This code is not documented in NT_STATUS code list\n  return 0x807D0003;\n}\nDECLARE_XAM_EXPORT1(XamPartyGetUserList, kNone, kStub);\n\ndword_result_t XamPartySendGameInvites_entry(dword_t r3, dword_t r4,\n                                             dword_t r5) {\n  return X_ERROR_FUNCTION_FAILED;\n}\nDECLARE_XAM_EXPORT1(XamPartySendGameInvites, kNone, kStub);\n\ndword_result_t XamPartySetCustomData_entry(dword_t r3, dword_t r4, dword_t r5) {\n  return X_ERROR_FUNCTION_FAILED;\n}\nDECLARE_XAM_EXPORT1(XamPartySetCustomData, kNone, kStub);\n\ndword_result_t XamPartyGetBandwidth_entry(dword_t r3, dword_t r4) {\n  return X_ERROR_FUNCTION_FAILED;\n}\nDECLARE_XAM_EXPORT1(XamPartyGetBandwidth, kNone, kStub);\n\n}  // namespace xam\n}  // namespace kernel\n}  // namespace xe\n\nDECLARE_XAM_EMPTY_REGISTER_EXPORTS(Party);\n"
  },
  {
    "path": "src/xenia/kernel/xam/xam_private.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2019 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_KERNEL_XAM_XAM_PRIVATE_H_\n#define XENIA_KERNEL_XAM_XAM_PRIVATE_H_\n\n#include \"xenia/cpu/export_resolver.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/xam/xam_ordinals.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xam {\n\nbool xeXamIsUIActive();\n\nxe::cpu::Export* RegisterExport_xam(xe::cpu::Export* export_entry);\n\n// Registration functions, one per file.\n#define XE_MODULE_EXPORT_GROUP(m, n)                                  \\\n  void Register##n##Exports(xe::cpu::ExportResolver* export_resolver, \\\n                            KernelState* kernel_state);\n#include \"xam_module_export_groups.inc\"\n#undef XE_MODULE_EXPORT_GROUP\n\n}  // namespace xam\n}  // namespace kernel\n}  // namespace xe\n\n#endif  // XENIA_KERNEL_XAM_XAM_PRIVATE_H_\n"
  },
  {
    "path": "src/xenia/kernel/xam/xam_table.inc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n// This is a partial file designed to be included by other files when\n// constructing various tables.\n\n// clang-format off\n\nXE_EXPORT(xam,      0x00000001, NetDll_WSAStartup,                                          kFunction),\nXE_EXPORT(xam,      0x00000002, NetDll_WSACleanup,                                          kFunction),\nXE_EXPORT(xam,      0x00000003, NetDll_socket,                                              kFunction),\nXE_EXPORT(xam,      0x00000004, NetDll_closesocket,                                         kFunction),\nXE_EXPORT(xam,      0x00000005, NetDll_shutdown,                                            kFunction),\nXE_EXPORT(xam,      0x00000006, NetDll_ioctlsocket,                                         kFunction),\nXE_EXPORT(xam,      0x00000007, NetDll_setsockopt,                                          kFunction),\nXE_EXPORT(xam,      0x00000008, NetDll_getsockopt,                                          kFunction),\nXE_EXPORT(xam,      0x00000009, NetDll_getsockname,                                         kFunction),\nXE_EXPORT(xam,      0x0000000A, NetDll_getpeername,                                         kFunction),\nXE_EXPORT(xam,      0x0000000B, NetDll_bind,                                                kFunction),\nXE_EXPORT(xam,      0x0000000C, NetDll_connect,                                             kFunction),\nXE_EXPORT(xam,      0x0000000D, NetDll_listen,                                              kFunction),\nXE_EXPORT(xam,      0x0000000E, NetDll_accept,                                              kFunction),\nXE_EXPORT(xam,      0x0000000F, NetDll_select,                                              kFunction),\nXE_EXPORT(xam,      0x00000010, NetDll_WSAGetOverlappedResult,                              kFunction),\nXE_EXPORT(xam,      0x00000011, NetDll_WSACancelOverlappedIO,                               kFunction),\nXE_EXPORT(xam,      0x00000012, NetDll_recv,                                                kFunction),\nXE_EXPORT(xam,      0x00000013, NetDll_WSARecv,                                             kFunction),\nXE_EXPORT(xam,      0x00000014, NetDll_recvfrom,                                            kFunction),\nXE_EXPORT(xam,      0x00000015, NetDll_WSARecvFrom,                                         kFunction),\nXE_EXPORT(xam,      0x00000016, NetDll_send,                                                kFunction),\nXE_EXPORT(xam,      0x00000017, NetDll_WSASend,                                             kFunction),\nXE_EXPORT(xam,      0x00000018, NetDll_sendto,                                              kFunction),\nXE_EXPORT(xam,      0x00000019, NetDll_WSASendTo,                                           kFunction),\nXE_EXPORT(xam,      0x0000001A, NetDll_inet_addr,                                           kFunction),\nXE_EXPORT(xam,      0x0000001B, NetDll_WSAGetLastError,                                     kFunction),\nXE_EXPORT(xam,      0x0000001C, NetDll_WSASetLastError,                                     kFunction),\nXE_EXPORT(xam,      0x0000001D, NetDll_WSACreateEvent,                                      kFunction),\nXE_EXPORT(xam,      0x0000001E, NetDll_WSACloseEvent,                                       kFunction),\nXE_EXPORT(xam,      0x0000001F, NetDll_WSASetEvent,                                         kFunction),\nXE_EXPORT(xam,      0x00000020, NetDll_WSAResetEvent,                                       kFunction),\nXE_EXPORT(xam,      0x00000021, NetDll_WSAWaitForMultipleEvents,                            kFunction),\nXE_EXPORT(xam,      0x00000022, NetDll___WSAFDIsSet,                                        kFunction),\nXE_EXPORT(xam,      0x00000023, NetDll_WSAEventSelect,                                      kFunction),\nXE_EXPORT(xam,      0x00000024, NetDll_WSAStartupEx,                                        kFunction),\nXE_EXPORT(xam,      0x00000033, NetDll_XNetStartup,                                         kFunction),\nXE_EXPORT(xam,      0x00000034, NetDll_XNetCleanup,                                         kFunction),\nXE_EXPORT(xam,      0x00000035, NetDll_XNetRandom,                                          kFunction),\nXE_EXPORT(xam,      0x00000036, NetDll_XNetCreateKey,                                       kFunction),\nXE_EXPORT(xam,      0x00000037, NetDll_XNetRegisterKey,                                     kFunction),\nXE_EXPORT(xam,      0x00000038, NetDll_XNetUnregisterKey,                                   kFunction),\nXE_EXPORT(xam,      0x00000039, NetDll_XNetXnAddrToInAddr,                                  kFunction),\nXE_EXPORT(xam,      0x0000003A, NetDll_XNetServerToInAddr,                                  kFunction),\nXE_EXPORT(xam,      0x0000003B, NetDll_XNetTsAddrToInAddr,                                  kFunction),\nXE_EXPORT(xam,      0x0000003C, NetDll_XNetInAddrToXnAddr,                                  kFunction),\nXE_EXPORT(xam,      0x0000003D, NetDll_XNetInAddrToServer,                                  kFunction),\nXE_EXPORT(xam,      0x0000003E, NetDll_XNetInAddrToString,                                  kFunction),\nXE_EXPORT(xam,      0x0000003F, NetDll_XNetUnregisterInAddr,                                kFunction),\nXE_EXPORT(xam,      0x00000040, NetDll_XNetXnAddrToMachineId,                               kFunction),\nXE_EXPORT(xam,      0x00000041, NetDll_XNetConnect,                                         kFunction),\nXE_EXPORT(xam,      0x00000042, NetDll_XNetGetConnectStatus,                                kFunction),\nXE_EXPORT(xam,      0x00000043, NetDll_XNetDnsLookup,                                       kFunction),\nXE_EXPORT(xam,      0x00000044, NetDll_XNetDnsRelease,                                      kFunction),\nXE_EXPORT(xam,      0x00000045, NetDll_XNetQosListen,                                       kFunction),\nXE_EXPORT(xam,      0x00000046, NetDll_XNetQosLookup,                                       kFunction),\nXE_EXPORT(xam,      0x00000047, NetDll_XNetQosServiceLookup,                                kFunction),\nXE_EXPORT(xam,      0x00000048, NetDll_XNetQosRelease,                                      kFunction),\nXE_EXPORT(xam,      0x00000049, NetDll_XNetGetTitleXnAddr,                                  kFunction),\nXE_EXPORT(xam,      0x0000004A, NetDll_XNetGetDebugXnAddr,                                  kFunction),\nXE_EXPORT(xam,      0x0000004B, NetDll_XNetGetEthernetLinkStatus,                           kFunction),\nXE_EXPORT(xam,      0x0000004C, NetDll_XNetGetBroadcastVersionStatus,                       kFunction),\nXE_EXPORT(xam,      0x0000004D, NetDll_XNetQosGetListenStats,                               kFunction),\nXE_EXPORT(xam,      0x0000004E, NetDll_XNetGetOpt,                                          kFunction),\nXE_EXPORT(xam,      0x0000004F, NetDll_XNetSetOpt,                                          kFunction),\nXE_EXPORT(xam,      0x00000050, NetDll_XNetStartupEx,                                       kFunction),\nXE_EXPORT(xam,      0x00000051, NetDll_XNetReplaceKey,                                      kFunction),\nXE_EXPORT(xam,      0x00000052, NetDll_XNetGetXnAddrPlatform,                               kFunction),\nXE_EXPORT(xam,      0x00000053, NetDll_XNetGetSystemLinkPort,                               kFunction),\nXE_EXPORT(xam,      0x00000054, NetDll_XNetSetSystemLinkPort,                               kFunction),\nXE_EXPORT(xam,      0x00000055, NetDll_XNetDnsReverseLookup,                                kFunction),\nXE_EXPORT(xam,      0x00000056, NetDll_XNetDnsReverseRelease,                               kFunction),\nXE_EXPORT(xam,      0x00000065, NetDll_XnpLoadConfigParams,                                 kFunction),\nXE_EXPORT(xam,      0x00000066, NetDll_XnpSaveConfigParams,                                 kFunction),\nXE_EXPORT(xam,      0x00000067, NetDll_XnpConfigUPnP,                                       kFunction),\nXE_EXPORT(xam,      0x00000068, NetDll_XnpConfig,                                           kFunction),\nXE_EXPORT(xam,      0x00000069, NetDll_XnpGetConfigStatus,                                  kFunction),\nXE_EXPORT(xam,      0x0000006A, NetDll_XnpLoadMachineAccount,                               kFunction),\nXE_EXPORT(xam,      0x0000006B, NetDll_XnpSaveMachineAccount,                               kFunction),\nXE_EXPORT(xam,      0x0000006C, NetDll_XnpCapture,                                          kFunction),\nXE_EXPORT(xam,      0x0000006D, NetDll_XnpEthernetInterceptSetCallbacks,                    kFunction),\nXE_EXPORT(xam,      0x0000006E, NetDll_XnpEthernetInterceptXmit,                            kFunction),\nXE_EXPORT(xam,      0x0000006F, NetDll_XnpEthernetInterceptRecv,                            kFunction),\nXE_EXPORT(xam,      0x00000070, NetDll_XnpLogonGetStatus,                                   kFunction),\nXE_EXPORT(xam,      0x00000071, NetDll_XnpLogonGetQFlags,                                   kFunction),\nXE_EXPORT(xam,      0x00000072, NetDll_XnpLogonSetQFlags,                                   kFunction),\nXE_EXPORT(xam,      0x00000073, NetDll_XnpLogonSetQEvent,                                   kFunction),\nXE_EXPORT(xam,      0x00000074, NetDll_XnpLogonClearQEvent,                                 kFunction),\nXE_EXPORT(xam,      0x00000075, NetDll_XnpLogonGetQVals,                                    kFunction),\nXE_EXPORT(xam,      0x00000076, NetDll_XnpLogonSetQVals,                                    kFunction),\nXE_EXPORT(xam,      0x00000077, NetDll_XnpLogonSetPState,                                   kFunction),\nXE_EXPORT(xam,      0x00000078, NetDll_XnpGetVlanXboxName,                                  kFunction),\nXE_EXPORT(xam,      0x00000079, NetDll_XnpSetVlanXboxName,                                  kFunction),\nXE_EXPORT(xam,      0x0000007A, NetDll_XnpGetActiveSocketList,                              kFunction),\nXE_EXPORT(xam,      0x0000007B, NetDll_XnpNoteSystemTime,                                   kFunction),\nXE_EXPORT(xam,      0x0000007C, NetDll_XnpRegisterKeyForCallerType,                         kFunction),\nXE_EXPORT(xam,      0x0000007D, NetDll_XnpUnregisterKeyForCallerType,                       kFunction),\nXE_EXPORT(xam,      0x0000007E, NetDll_XnpLogonGetChallenge,                                kFunction),\nXE_EXPORT(xam,      0x0000007F, NetDll_XnpLogonClearChallenge,                              kFunction),\nXE_EXPORT(xam,      0x00000080, NetDll_XnpLogonSetChallengeResponse,                        kFunction),\nXE_EXPORT(xam,      0x00000081, NetDll_XnpGetSecAssocList,                                  kFunction),\nXE_EXPORT(xam,      0x00000082, NetDll_XnpGetKeyList,                                       kFunction),\nXE_EXPORT(xam,      0x00000083, NetDll_XnpGetQosLookupList,                                 kFunction),\nXE_EXPORT(xam,      0x00000084, NetDll_XnpPersistTitleState,                                kFunction),\nXE_EXPORT(xam,      0x00000085, NetDll_XnpReplaceKeyForCallerType,                          kFunction),\nXE_EXPORT(xam,      0x00000086, NetDll_XnpEthernetInterceptSetExtendedReceiveCallback,      kFunction),\nXE_EXPORT(xam,      0x00000087, NetDll_XnpQosHistoryLoad,                                   kFunction),\nXE_EXPORT(xam,      0x00000088, NetDll_XnpQosHistorySaveMeasurements,                       kFunction),\nXE_EXPORT(xam,      0x00000089, NetDll_XnpQosHistoryGetEntries,                             kFunction),\nXE_EXPORT(xam,      0x0000008A, NetDll_XnpQosHistoryGetAggregateMeasurement,                kFunction),\nXE_EXPORT(xam,      0x0000008B, NetDll_XnpToolSetCallbacks,                                 kFunction),\nXE_EXPORT(xam,      0x0000008C, NetDll_XnpToolIpProxyInject,                                kFunction),\nXE_EXPORT(xam,      0x0000008D, NetDll_XnpUpdateConfigParams,                               kFunction),\nXE_EXPORT(xam,      0x0000008E, NetDll_XnpEthernetInterceptXmitAsIp,                        kFunction),\nXE_EXPORT(xam,      0x0000008F, NetDll_XnpConfigUPnPPortAndExternalAddr,                    kFunction),\nXE_EXPORT(xam,      0x00000097, NetDll_XmlDownloadStart,                                    kFunction),\nXE_EXPORT(xam,      0x00000098, NetDll_XmlDownloadContinue,                                 kFunction),\nXE_EXPORT(xam,      0x00000099, NetDll_XmlDownloadStop,                                     kFunction),\nXE_EXPORT(xam,      0x0000009A, NetDll_XmlDownloadGetParseTime,                             kFunction),\nXE_EXPORT(xam,      0x0000009B, NetDll_XmlDownloadGetReceivedDataSize,                      kFunction),\nXE_EXPORT(xam,      0x000000C6, XnpGetXwppMemoryLogSnapshot,                                kFunction),\nXE_EXPORT(xam,      0x000000C7, XnpGetXwppRuntimeFilter,                                    kFunction),\nXE_EXPORT(xam,      0x000000C9, NetDll_XHttpStartup,                                        kFunction),\nXE_EXPORT(xam,      0x000000CA, NetDll_XHttpShutdown,                                       kFunction),\nXE_EXPORT(xam,      0x000000CB, NetDll_XHttpOpen,                                           kFunction),\nXE_EXPORT(xam,      0x000000CC, NetDll_XHttpCloseHandle,                                    kFunction),\nXE_EXPORT(xam,      0x000000CD, NetDll_XHttpConnect,                                        kFunction),\nXE_EXPORT(xam,      0x000000CE, NetDll_XHttpSetStatusCallback,                              kFunction),\nXE_EXPORT(xam,      0x000000CF, NetDll_XHttpOpenRequest,                                    kFunction),\nXE_EXPORT(xam,      0x000000D0, NetDll_XHttpOpenRequestUsingMemory,                         kFunction),\nXE_EXPORT(xam,      0x000000D1, NetDll_XHttpSendRequest,                                    kFunction),\nXE_EXPORT(xam,      0x000000D2, NetDll_XHttpReceiveResponse,                                kFunction),\nXE_EXPORT(xam,      0x000000D3, NetDll_XHttpQueryHeaders,                                   kFunction),\nXE_EXPORT(xam,      0x000000D4, NetDll_XHttpReadData,                                       kFunction),\nXE_EXPORT(xam,      0x000000D5, NetDll_XHttpWriteData,                                      kFunction),\nXE_EXPORT(xam,      0x000000D6, NetDll_XHttpQueryOption,                                    kFunction),\nXE_EXPORT(xam,      0x000000D7, NetDll_XHttpSetOption,                                      kFunction),\nXE_EXPORT(xam,      0x000000D8, NetDll_XHttpDoWork,                                         kFunction),\nXE_EXPORT(xam,      0x000000D9, NetDll_XHttpSetCredentials,                                 kFunction),\nXE_EXPORT(xam,      0x000000DA, NetDll_XHttpQueryAuthSchemes,                               kFunction),\nXE_EXPORT(xam,      0x000000DB, NetDll_XHttpCrackUrlW,                                      kFunction),\nXE_EXPORT(xam,      0x000000DC, NetDll_XHttpCrackUrl,                                       kFunction),\nXE_EXPORT(xam,      0x000000DD, NetDll_XHttpCreateUrl,                                      kFunction),\nXE_EXPORT(xam,      0x000000DE, NetDll_XHttpCreateUrlW,                                     kFunction),\nXE_EXPORT(xam,      0x000000DF, NetDll_XHttpResetPerfCounters,                              kFunction),\nXE_EXPORT(xam,      0x000000E0, NetDll_XHttpGetPerfCounters,                                kFunction),\nXE_EXPORT(xam,      0x000000FB, NetDll_UpnpStartup,                                         kFunction),\nXE_EXPORT(xam,      0x000000FC, NetDll_UpnpCleanup,                                         kFunction),\nXE_EXPORT(xam,      0x000000FD, NetDll_UpnpSearchCreate,                                    kFunction),\nXE_EXPORT(xam,      0x000000FE, NetDll_UpnpSearchGetDevices,                                kFunction),\nXE_EXPORT(xam,      0x000000FF, NetDll_UpnpDescribeCreate,                                  kFunction),\nXE_EXPORT(xam,      0x00000100, NetDll_UpnpDescribeGetResults,                              kFunction),\nXE_EXPORT(xam,      0x00000101, NetDll_UpnpActionCalculateWorkBufferSize,                   kFunction),\nXE_EXPORT(xam,      0x00000102, NetDll_UpnpActionCreate,                                    kFunction),\nXE_EXPORT(xam,      0x00000103, NetDll_UpnpActionGetResults,                                kFunction),\nXE_EXPORT(xam,      0x00000104, NetDll_UpnpEventCreate,                                     kFunction),\nXE_EXPORT(xam,      0x00000105, NetDll_UpnpEventGetCurrentState,                            kFunction),\nXE_EXPORT(xam,      0x00000106, NetDll_UpnpEventUnsubscribe,                                kFunction),\nXE_EXPORT(xam,      0x00000107, NetDll_UpnpDoWork,                                          kFunction),\nXE_EXPORT(xam,      0x00000108, NetDll_UpnpCloseHandle,                                     kFunction),\nXE_EXPORT(xam,      0x0000012D, XNetLogonGetLoggedOnUsers,                                  kFunction),\nXE_EXPORT(xam,      0x0000012E, XNetLogonGetNatType,                                        kFunction),\nXE_EXPORT(xam,      0x0000012F, XNetLogonTaskStart,                                         kFunction),\nXE_EXPORT(xam,      0x00000130, XNetLogonTaskClose,                                         kFunction),\nXE_EXPORT(xam,      0x00000131, XNetLogonTaskContinue,                                      kFunction),\nXE_EXPORT(xam,      0x00000132, XNetLogonGetServiceInfo,                                    kFunction),\nXE_EXPORT(xam,      0x00000133, XNetLogonGetUserPrivileges,                                 kFunction),\nXE_EXPORT(xam,      0x00000134, XNetLogonSetConsoleCertificate,                             kFunction),\nXE_EXPORT(xam,      0x00000135, XNetLogonGetMachineID,                                      kFunction),\nXE_EXPORT(xam,      0x00000136, XNetLogonGetTitleID,                                        kFunction),\nXE_EXPORT(xam,      0x00000137, XNetLogonGetTitleVersion,                                   kFunction),\nXE_EXPORT(xam,      0x00000138, XNetLogonGetServiceNetworkID,                               kFunction),\nXE_EXPORT(xam,      0x00000139, XNetLogonGetDnsString,                                      kFunction),\nXE_EXPORT(xam,      0x0000013A, XNetLogonSetTitleID,                                        kFunction),\nXE_EXPORT(xam,      0x0000013B, XNetLogonGetExtendedStatus,                                 kFunction),\nXE_EXPORT(xam,      0x0000013C, XNetLogonClearTicketCaches,                                 kFunction),\nXE_EXPORT(xam,      0x0000013D, XNetLogonInitOverrideInfo,                                  kFunction),\nXE_EXPORT(xam,      0x0000013E, XNetLogonGetLastUPnPStatus,                                 kFunction),\nXE_EXPORT(xam,      0x0000013F, XNetLogonGetFlowToken,                                      kFunction),\nXE_EXPORT(xam,      0x00000140, XNetLogonGetTicketOpt,                                      kFunction),\nXE_EXPORT(xam,      0x00000141, XNetLogonSetTicketOpt,                                      kFunction),\nXE_EXPORT(xam,      0x00000142, XNetLogonGetState,                                          kFunction),\nXE_EXPORT(xam,      0x00000190, XamInputGetCapabilities,                                    kFunction),\nXE_EXPORT(xam,      0x00000191, XamInputGetState,                                           kFunction),\nXE_EXPORT(xam,      0x00000192, XamInputSetState,                                           kFunction),\nXE_EXPORT(xam,      0x00000193, XamInputGetKeystroke,                                       kFunction),\nXE_EXPORT(xam,      0x00000194, XamInputEnableAutobind,                                     kFunction),\nXE_EXPORT(xam,      0x00000195, XamInputRawState,                                           kFunction),\nXE_EXPORT(xam,      0x00000196, XamEnableSystemAppInput,                                    kFunction),\nXE_EXPORT(xam,      0x00000197, XamInputGetDeviceStats,                                     kFunction),\nXE_EXPORT(xam,      0x00000198, XamInputGetKeystrokeEx,                                     kFunction),\nXE_EXPORT(xam,      0x00000199, XamInputGetKeystrokeHud,                                    kFunction),\nXE_EXPORT(xam,      0x0000019A, XamInputSetLayoutKeyboard,                                  kFunction),\nXE_EXPORT(xam,      0x0000019B, XamInputToggleKeyLocks,                                     kFunction),\nXE_EXPORT(xam,      0x0000019C, XamInputResetLayoutKeyboard,                                kFunction),\nXE_EXPORT(xam,      0x0000019D, XamInputGetKeystrokeHudEx,                                  kFunction),\nXE_EXPORT(xam,      0x0000019E, XamInputSetKeyboardTranslationHud,                          kFunction),\nXE_EXPORT(xam,      0x0000019F, XamSetInactivityTime,                                       kFunction),\nXE_EXPORT(xam,      0x000001A0, XamEnableInactivityProcessing,                              kFunction),\nXE_EXPORT(xam,      0x000001A1, XamResetInactivity,                                         kFunction),\nXE_EXPORT(xam,      0x000001A2, XamSetInactivityTimeFromConfig,                             kFunction),\nXE_EXPORT(xam,      0x000001A3, XamLoaderGetMediaInfo,                                      kFunction),\nXE_EXPORT(xam,      0x000001A4, XamLoaderLaunchTitle,                                       kFunction),\nXE_EXPORT(xam,      0x000001A5, XamLoaderLaunchTitleEx,                                     kFunction),\nXE_EXPORT(xam,      0x000001A6, XamLoaderSetLaunchData,                                     kFunction),\nXE_EXPORT(xam,      0x000001A7, XamLoaderGetLaunchDataSize,                                 kFunction),\nXE_EXPORT(xam,      0x000001A8, XamLoaderGetLaunchData,                                     kFunction),\nXE_EXPORT(xam,      0x000001A9, XamLoaderTerminateTitle,                                    kFunction),\nXE_EXPORT(xam,      0x000001AA, XamLoaderGetDvdTrayState,                                   kFunction),\nXE_EXPORT(xam,      0x000001AB, XamLoaderGetGameInfo,                                       kFunction),\nXE_EXPORT(xam,      0x000001AC, XamLoaderLaunchTitleOnDvd,                                  kFunction),\nXE_EXPORT(xam,      0x000001AD, XamLoaderSetSpindleSpeed,                                   kFunction),\nXE_EXPORT(xam,      0x000001AE, XamTaskCreateQueue,                                         kFunction),\nXE_EXPORT(xam,      0x000001AF, XamTaskSchedule,                                            kFunction),\nXE_EXPORT(xam,      0x000001B0, XamTaskReschedule,                                          kFunction),\nXE_EXPORT(xam,      0x000001B1, XamTaskCloseHandle,                                         kFunction),\nXE_EXPORT(xam,      0x000001B2, XamTaskCancel,                                              kFunction),\nXE_EXPORT(xam,      0x000001B3, XamTaskShouldExit,                                          kFunction),\nXE_EXPORT(xam,      0x000001B4, XamTaskWaitOnCompletion,                                    kFunction),\nXE_EXPORT(xam,      0x000001B5, XamTaskModify,                                              kFunction),\nXE_EXPORT(xam,      0x000001B6, XamTaskGetCurrentTask,                                      kFunction),\nXE_EXPORT(xam,      0x000001B7, XamTaskGetAttributes,                                       kFunction),\nXE_EXPORT(xam,      0x000001B8, XamExecutingOnBehalfOfTitle,                                kFunction),\nXE_EXPORT(xam,      0x000001B9, XamInputSendStayAliveRequest,                               kFunction),\nXE_EXPORT(xam,      0x000001BA, XamInputGetUserVibrationLevel,                              kFunction),\nXE_EXPORT(xam,      0x000001BB, XamIsSystemTitleId,                                         kFunction),\nXE_EXPORT(xam,      0x000001BC, XamLoaderIsTitleTerminatePending,                           kFunction),\nXE_EXPORT(xam,      0x000001BD, XamInputSetTextMessengerIndicator,                          kFunction),\nXE_EXPORT(xam,      0x000001BE, XamLoaderGetPriorTitleId,                                   kFunction),\nXE_EXPORT(xam,      0x000001BF, XamIsXbox1TitleId,                                          kFunction),\nXE_EXPORT(xam,      0x000001C0, XamInputSetKeyLocks,                                        kFunction),\nXE_EXPORT(xam,      0x000001C1, XamInputGetKeyLocks,                                        kFunction),\nXE_EXPORT(xam,      0x000001C2, XamTaskGetStatus,                                           kFunction),\nXE_EXPORT(xam,      0x000001C3, XamGetRootObj,                                              kFunction),\nXE_EXPORT(xam,      0x000001C4, XamDevAuthSetFault,                                         kFunction),\nXE_EXPORT(xam,      0x000001C5, XamGetDefaultSystemImage,                                   kFunction),\nXE_EXPORT(xam,      0x000001C6, XamGetWCNConfigFile,                                        kFunction),\nXE_EXPORT(xam,      0x000001C7, XamSetPowerMode,                                            kFunction),\nXE_EXPORT(xam,      0x000001C8, XamExecuteChallenge,                                        kFunction),\nXE_EXPORT(xam,      0x000001C9, XamGetDefaultImage,                                         kFunction),\nXE_EXPORT(xam,      0x000001CA, XamMuteSound,                                               kFunction),\nXE_EXPORT(xam,      0x000001CB, XamGetOnlineSchema,                                         kFunction),\nXE_EXPORT(xam,      0x000001CC, XamSetDashContext,                                          kFunction),\nXE_EXPORT(xam,      0x000001CD, XamGetDashContext,                                          kFunction),\nXE_EXPORT(xam,      0x000001CE, XamIsCurrentTitleDash,                                      kFunction),\nXE_EXPORT(xam,      0x000001CF, XamGetCurrentTitleId,                                       kFunction),\nXE_EXPORT(xam,      0x000001D0, XamSetCurrentTitleDash,                                     kFunction),\nXE_EXPORT(xam,      0x000001D1, XamAllocHeapFreeSpace,                                      kFunction),\nXE_EXPORT(xam,      0x000001D2, XamSetDashContextEx,                                        kFunction),\nXE_EXPORT(xam,      0x000001D3, XamGetDashContextEx,                                        kFunction),\nXE_EXPORT(xam,      0x000001D4, XamSetHudContext,                                           kFunction),\nXE_EXPORT(xam,      0x000001D5, XamGetHudContext,                                           kFunction),\nXE_EXPORT(xam,      0x000001D6, XCustomGetBannerImage,                                      kFunction),\nXE_EXPORT(xam,      0x000001D7, Refresh,                                                    kFunction),\nXE_EXPORT(xam,      0x000001D8, XCustomSetAction,                                           kFunction),\nXE_EXPORT(xam,      0x000001D9, XCustomGetLastActionPress,                                  kFunction),\nXE_EXPORT(xam,      0x000001DA, XCustomSetDynamicActions,                                   kFunction),\nXE_EXPORT(xam,      0x000001DB, XCustomBroadcastActionEvent,                                kFunction),\nXE_EXPORT(xam,      0x000001DC, XCustomGetLastActionPressEx,                                kFunction),\nXE_EXPORT(xam,      0x000001DD, XCustomRegisterDynamicActions,                              kFunction),\nXE_EXPORT(xam,      0x000001DE, XCustomUnregisterDynamicActions,                            kFunction),\nXE_EXPORT(xam,      0x000001DF, XCustomGetCurrentGamercard,                                 kFunction),\nXE_EXPORT(xam,      0x000001E0, XamDbgPrint,                                                kFunction),\nXE_EXPORT(xam,      0x000001E1, XamDbgSetOutputLevel,                                       kFunction),\nXE_EXPORT(xam,      0x000001E2, XamDbgSetBreakLevel,                                        kFunction),\nXE_EXPORT(xam,      0x000001E3, XamLoaderGetMediaInfoEx,                                    kFunction),\nXE_EXPORT(xam,      0x000001E4, XamLoaderSetGameInfo,                                       kFunction),\nXE_EXPORT(xam,      0x000001E5, XamFormatMessage,                                           kFunction),\nXE_EXPORT(xam,      0x000001E6, XamUniSortCmpString,                                        kFunction),\nXE_EXPORT(xam,      0x000001E7, XamFormatTimeString,                                        kFunction),\nXE_EXPORT(xam,      0x000001E8, XamFormatDateString,                                        kFunction),\nXE_EXPORT(xam,      0x000001E9, XamGetLocaleDateFormat,                                     kFunction),\nXE_EXPORT(xam,      0x000001EA, XamAlloc,                                                   kFunction),\nXE_EXPORT(xam,      0x000001EB, XamAllocEx,                                                 kFunction),\nXE_EXPORT(xam,      0x000001EC, XamFree,                                                    kFunction),\nXE_EXPORT(xam,      0x000001ED, XamAllocSize,                                               kFunction),\nXE_EXPORT(xam,      0x000001EE, XamAllocMountIPTVHeap,                                      kFunction),\nXE_EXPORT(xam,      0x000001EF, XamAllocUnmountIPTVHeap,                                    kFunction),\nXE_EXPORT(xam,      0x000001F0, XamAllocFreeIPTVHeap,                                       kFunction),\nXE_EXPORT(xam,      0x000001F1, XamDeviceRemap,                                             kFunction),\nXE_EXPORT(xam,      0x000001F2, XamLoaderGetClearCache,                                     kFunction),\nXE_EXPORT(xam,      0x000001F3, XamLoaderSetClearCache,                                     kFunction),\nXE_EXPORT(xam,      0x000001F4, XMsgInProcessCall,                                          kFunction),\nXE_EXPORT(xam,      0x000001F5, XMsgCompleteIORequest,                                      kFunction),\nXE_EXPORT(xam,      0x000001F6, XMsgSystemProcessCall,                                      kFunction),\nXE_EXPORT(xam,      0x000001F7, XMsgStartIORequest,                                         kFunction),\nXE_EXPORT(xam,      0x000001F8, XMsgCancelIORequest,                                        kFunction),\nXE_EXPORT(xam,      0x000001F9, XMsgAcquireAsyncMessageFromOverlapped,                      kFunction),\nXE_EXPORT(xam,      0x000001FA, XMsgReleaseAsyncMessageToOverlapped,                        kFunction),\nXE_EXPORT(xam,      0x000001FB, XamGetOverlappedResult,                                     kFunction),\nXE_EXPORT(xam,      0x000001FC, XMsgStartIORequestEx,                                       kFunction),\nXE_EXPORT(xam,      0x000001FD, XamAppAllocateInterappWorkspace,                            kFunction),\nXE_EXPORT(xam,      0x000001FE, XamAppGetInterappWorkspace,                                 kFunction),\nXE_EXPORT(xam,      0x000001FF, XamAppFreeInterappWorkspace,                                kFunction),\nXE_EXPORT(xam,      0x00000200, XamFeatureEnabled,                                          kFunction),\nXE_EXPORT(xam,      0x00000201, XamFeatureEnforceImageBudget,                               kFunction),\nXE_EXPORT(xam,      0x00000202, XamFeatureSetMask,                                          kFunction),\nXE_EXPORT(xam,      0x00000203, XamFeatureEnableDisable,                                    kFunction),\nXE_EXPORT(xam,      0x00000204, XuiControlSetItemAssociation,                               kFunction),\nXE_EXPORT(xam,      0x00000205, XamGetTitleGlobalStorageValue,                              kFunction),\nXE_EXPORT(xam,      0x00000206, XamSetTitleGlobalStorageValue,                              kFunction),\nXE_EXPORT(xam,      0x00000207, XamUserValidateAvatarManifest,                              kFunction),\nXE_EXPORT(xam,      0x00000208, XamUserGetDeviceContext,                                    kFunction),\nXE_EXPORT(xam,      0x00000209, XamUserLookupDevice,                                        kFunction),\nXE_EXPORT(xam,      0x0000020A, XamUserGetXUID,                                             kFunction),\nXE_EXPORT(xam,      0x0000020B, XamUserLogon,                                               kFunction),\nXE_EXPORT(xam,      0x0000020C, XamUserGetGamerTag,                                         kFunction),\nXE_EXPORT(xam,      0x0000020D, XamUserGetUserIndexMask,                                    kFunction),\nXE_EXPORT(xam,      0x0000020E, XamUserGetName,                                             kFunction),\nXE_EXPORT(xam,      0x0000020F, XamLookupCommonStringByIndex,                               kFunction),\nXE_EXPORT(xam,      0x00000210, XamUserGetSigninState,                                      kFunction),\nXE_EXPORT(xam,      0x00000211, XamUserGetIndexFromXUID,                                    kFunction),\nXE_EXPORT(xam,      0x00000212, XamUserCheckPrivilege,                                      kFunction),\nXE_EXPORT(xam,      0x00000213, XamUserAreUsersFriends,                                     kFunction),\nXE_EXPORT(xam,      0x00000214, XamSetUserPresetPresenceState,                              kFunction),\nXE_EXPORT(xam,      0x00000215, XamGetUserPresetPresenceState,                              kFunction),\nXE_EXPORT(xam,      0x00000216, XamUserGetUserFlagsFromXUID,                                kFunction),\nXE_EXPORT(xam,      0x00000217, XamUserGetMembershipTierFromXUID,                           kFunction),\nXE_EXPORT(xam,      0x00000218, XamUserGetOnlineCountryFromXUID,                            kFunction),\nXE_EXPORT(xam,      0x00000219, XamUserReadProfileSettings,                                 kFunction),\nXE_EXPORT(xam,      0x0000021A, XamUserWriteProfileSettings,                                kFunction),\nXE_EXPORT(xam,      0x0000021B, XamUserGetMembershipTier,                                   kFunction),\nXE_EXPORT(xam,      0x0000021C, XamUserGetUserFlags,                                        kFunction),\nXE_EXPORT(xam,      0x0000021D, XamUserGetRequestedUserIndexMask,                           kFunction),\nXE_EXPORT(xam,      0x0000021E, XamUserIsGuest,                                             kFunction),\nXE_EXPORT(xam,      0x0000021F, XamUserProfileSync,                                         kFunction),\nXE_EXPORT(xam,      0x00000220, XamUserFlushLogonQueue,                                     kFunction),\nXE_EXPORT(xam,      0x00000221, XamUserIsOnlineEnabled,                                     kFunction),\nXE_EXPORT(xam,      0x00000222, XamUserGetCachedUserFlags,                                  kFunction),\nXE_EXPORT(xam,      0x00000223, XamAreMixedAccountsSignedIn,                                kFunction),\nXE_EXPORT(xam,      0x00000224, XamUserLogonEx,                                             kFunction),\nXE_EXPORT(xam,      0x00000225, XamSetUserShowMessengerFriends,                             kFunction),\nXE_EXPORT(xam,      0x00000226, XamGetUserShowMessengerFriends,                             kFunction),\nXE_EXPORT(xam,      0x00000227, XamUserGetSigninInfo,                                       kFunction),\nXE_EXPORT(xam,      0x00000228, XamUserIsPartial,                                           kFunction),\nXE_EXPORT(xam,      0x00000229, XamUserGetOnlineLanguageFromXUID,                           kFunction),\nXE_EXPORT(xam,      0x0000022A, XamUserReadProfileSettingsEx,                               kFunction),\nXE_EXPORT(xam,      0x0000022B, XamSystemUpdaterLogon,                                      kFunction),\nXE_EXPORT(xam,      0x0000022C, XamUserGetUsersMissingAvatars,                              kFunction),\nXE_EXPORT(xam,      0x0000022D, XamIsChildAccountSignedIn,                                  kFunction),\nXE_EXPORT(xam,      0x0000022E, XamUserPrefetchProfileSettings,                             kFunction),\nXE_EXPORT(xam,      0x0000022F, XamUserInvalidateProfileSetting,                            kFunction),\nXE_EXPORT(xam,      0x00000230, XamProfileCreate,                                           kFunction),\nXE_EXPORT(xam,      0x00000231, XamProfileCreateEnumerator,                                 kFunction),\nXE_EXPORT(xam,      0x00000232, XamProfileEnumerate,                                        kFunction),\nXE_EXPORT(xam,      0x00000233, XamProfileDelete,                                           kFunction),\nXE_EXPORT(xam,      0x00000234, XamProfileGetCreationStatus,                                kFunction),\nXE_EXPORT(xam,      0x00000235, XamProfileFindAccount,                                      kFunction),\nXE_EXPORT(xam,      0x00000236, XamProfileRenameAccount,                                    kFunction),\nXE_EXPORT(xam,      0x00000237, XamProfileOpen,                                             kFunction),\nXE_EXPORT(xam,      0x00000238, XamProfileClose,                                            kFunction),\nXE_EXPORT(xam,      0x00000239, XamProfileSaveAccountInfo,                                  kFunction),\nXE_EXPORT(xam,      0x0000023A, XamProfileLoadAccountInfo,                                  kFunction),\nXE_EXPORT(xam,      0x0000023B, XamProfileRecoverTitle,                                     kFunction),\nXE_EXPORT(xam,      0x0000023C, XamProfileSaveWindowsLiveCredentials,                       kFunction),\nXE_EXPORT(xam,      0x0000023D, XamProfileLoadWindowsLiveCredentials,                       kFunction),\nXE_EXPORT(xam,      0x0000023E, XamProfileIsSaveWindowsLiveCredsEnabled,                    kFunction),\nXE_EXPORT(xam,      0x0000023F, XamProfileSetSaveWindowsLiveCredsEnabled,                   kFunction),\nXE_EXPORT(xam,      0x00000240, XamSetProfileReadTestHook,                                  kFunction),\nXE_EXPORT(xam,      0x00000241, XamProfileGetLastSync,                                      kFunction),\nXE_EXPORT(xam,      0x00000242, XamAccountRecoveryRecoverTitle,                             kFunction),\nXE_EXPORT(xam,      0x00000243, XamProfileControlPec,                                       kFunction),\nXE_EXPORT(xam,      0x00000244, XamAppLoad,                                                 kFunction),\nXE_EXPORT(xam,      0x00000245, XamAppUnloadSelf,                                           kFunction),\nXE_EXPORT(xam,      0x00000246, XamAppUnloadStack,                                          kFunction),\nXE_EXPORT(xam,      0x00000247, XamSendMessageToLoadedApps,                                 kFunction),\nXE_EXPORT(xam,      0x00000248, XamAppRequestLoad,                                          kFunction),\nXE_EXPORT(xam,      0x00000249, XamAppUnrequestLoad,                                        kFunction),\nXE_EXPORT(xam,      0x0000024A, XamNavigate,                                                kFunction),\nXE_EXPORT(xam,      0x0000024B, XamRegisterSysApp,                                          kFunction),\nXE_EXPORT(xam,      0x0000024C, XamUnregisterSysApp,                                        kFunction),\nXE_EXPORT(xam,      0x0000024D, XamAppReinitialize,                                         kFunction),\nXE_EXPORT(xam,      0x0000024E, XamCreateEnumeratorHandle,                                  kFunction),\nXE_EXPORT(xam,      0x0000024F, XamGetPrivateEnumStructureFromHandle,                       kFunction),\nXE_EXPORT(xam,      0x00000250, XamEnumerate,                                               kFunction),\nXE_EXPORT(xam,      0x00000251, XamLoadSysApp,                                              kFunction),\nXE_EXPORT(xam,      0x00000252, XamUnloadSysApp,                                            kFunction),\nXE_EXPORT(xam,      0x00000253, XamReloadSysApp,                                            kFunction),\nXE_EXPORT(xam,      0x00000254, XamAppLoadPass2SysApps,                                     kFunction),\nXE_EXPORT(xam,      0x00000255, XamProfileGetLiveLegalLocale,                               kFunction),\nXE_EXPORT(xam,      0x00000256, XamUserIsParentalControlled,                                kFunction),\nXE_EXPORT(xam,      0x00000257, XamContentLaunchImageFromFileInternal,                      kFunction),\nXE_EXPORT(xam,      0x00000258, XamContentCreate,                                           kFunction),\nXE_EXPORT(xam,      0x00000259, XamContentCreateEx,                                         kFunction),\nXE_EXPORT(xam,      0x0000025A, XamContentClose,                                            kFunction),\nXE_EXPORT(xam,      0x0000025B, XamContentDelete,                                           kFunction),\nXE_EXPORT(xam,      0x0000025C, XamContentCreateEnumerator,                                 kFunction),\nXE_EXPORT(xam,      0x0000025D, XamContentCreateDeviceEnumerator,                           kFunction),\nXE_EXPORT(xam,      0x0000025E, XamContentGetDeviceData,                                    kFunction),\nXE_EXPORT(xam,      0x0000025F, XamContentGetDeviceName,                                    kFunction),\nXE_EXPORT(xam,      0x00000260, XamContentSetThumbnail,                                     kFunction),\nXE_EXPORT(xam,      0x00000261, XamContentGetThumbnail,                                     kFunction),\nXE_EXPORT(xam,      0x00000262, XamContentGetCreator,                                       kFunction),\nXE_EXPORT(xam,      0x00000263, XamContentLaunchImage,                                      kFunction),\nXE_EXPORT(xam,      0x00000264, XamContentGetAttributes,                                    kFunction),\nXE_EXPORT(xam,      0x00000265, XamContentGetDeviceState,                                   kFunction),\nXE_EXPORT(xam,      0x00000266, XamContentGetLicenseMask,                                   kFunction),\nXE_EXPORT(xam,      0x00000267, XamContentFlush,                                            kFunction),\nXE_EXPORT(xam,      0x00000268, XamContentResolve,                                          kFunction),\nXE_EXPORT(xam,      0x00000269, XamContentOpenFile,                                         kFunction),\nXE_EXPORT(xam,      0x0000026A, XamContentInstall,                                          kFunction),\nXE_EXPORT(xam,      0x0000026B, XamContentLockUnlockPackageHeaders,                         kFunction),\nXE_EXPORT(xam,      0x0000026C, XamContentCopyInternal,                                     kFunction),\nXE_EXPORT(xam,      0x0000026D, XamContentMoveInternal,                                     kFunction),\nXE_EXPORT(xam,      0x0000026E, XamContentGetMetaDataInternal,                              kFunction),\nXE_EXPORT(xam,      0x0000026F, XamContentCreateEnumeratorInternal,                         kFunction),\nXE_EXPORT(xam,      0x00000270, XamContentDeleteInternal,                                   kFunction),\nXE_EXPORT(xam,      0x00000271, XamContentCreateInternal,                                   kFunction),\nXE_EXPORT(xam,      0x00000272, XamContentSetThumbnailInternal,                             kFunction),\nXE_EXPORT(xam,      0x00000273, XamContentLaunchImageInternal,                              kFunction),\nXE_EXPORT(xam,      0x00000274, XamContentWritePackageHeader,                               kFunction),\nXE_EXPORT(xam,      0x00000275, XamContentDismountAndClosePackage,                          kFunction),\nXE_EXPORT(xam,      0x00000276, XamContentResolveInternal,                                  kFunction),\nXE_EXPORT(xam,      0x00000277, XamContentGetAttributesInternal,                            kFunction),\nXE_EXPORT(xam,      0x00000278, XamContentOpenFileInternal,                                 kFunction),\nXE_EXPORT(xam,      0x00000279, XamContentAggregateCreateEnumerator,                        kFunction),\nXE_EXPORT(xam,      0x0000027A, XamContentCreateAndMountPackage,                            kFunction),\nXE_EXPORT(xam,      0x0000027B, XamContentOpenPackageFile,                                  kFunction),\nXE_EXPORT(xam,      0x0000027C, XamContentMountPackage,                                     kFunction),\nXE_EXPORT(xam,      0x0000027D, XamContentFlushPackage,                                     kFunction),\nXE_EXPORT(xam,      0x0000027E, XamContentClosePackageFile,                                 kFunction),\nXE_EXPORT(xam,      0x0000027F, XamContentDuplicateFileHandle,                              kFunction),\nXE_EXPORT(xam,      0x00000280, XamGetExecutionId,                                          kFunction),\nXE_EXPORT(xam,      0x00000281, XamGetGameRatings,                                          kFunction),\nXE_EXPORT(xam,      0x00000282, XamGetSystemVersion,                                        kFunction),\nXE_EXPORT(xam,      0x00000283, XamContentGetLocalizedString,                               kFunction),\nXE_EXPORT(xam,      0x00000284, XamContentGetDefaultDevice,                                 kFunction),\nXE_EXPORT(xam,      0x00000285, XamContentInstallInternal,                                  kFunction),\nXE_EXPORT(xam,      0x00000286, XamContentSetMediaMetaDataInternal,                         kFunction),\nXE_EXPORT(xam,      0x00000287, XamContentGetDeviceSerialNumber,                            kFunction),\nXE_EXPORT(xam,      0x00000288, XamContentGetMountedPackageByRootName,                      kFunction),\nXE_EXPORT(xam,      0x00000289, XamContentRegisterChangeCallback,                           kFunction),\nXE_EXPORT(xam,      0x0000028A, XamNotifyCreateListener,                                    kFunction),\nXE_EXPORT(xam,      0x0000028B, XNotifyGetNext,                                             kFunction),\nXE_EXPORT(xam,      0x0000028C, XNotifyPositionUI,                                          kFunction),\nXE_EXPORT(xam,      0x0000028D, XNotifyDelayUI,                                             kFunction),\nXE_EXPORT(xam,      0x0000028E, XNotifyBroadcast,                                           kFunction),\nXE_EXPORT(xam,      0x0000028F, XNotifyRegisterArea,                                        kFunction),\nXE_EXPORT(xam,      0x00000290, XNotifyQueueUI,                                             kFunction),\nXE_EXPORT(xam,      0x00000291, XamNotifyCreateListenerInternal,                            kFunction),\nXE_EXPORT(xam,      0x00000292, XNotifyUISetOptions,                                        kFunction),\nXE_EXPORT(xam,      0x00000293, XNotifyUIGetOptions,                                        kFunction),\nXE_EXPORT(xam,      0x00000294, XamContentLaunchImageInternalEx,                            kFunction),\nXE_EXPORT(xam,      0x00000295, XamShutdown,                                                kFunction),\nXE_EXPORT(xam,      0x00000296, XamAllocDevkitHeapAvailable,                                kFunction),\nXE_EXPORT(xam,      0x00000297, XamNotifyCreateListenerRangeInternal,                       kFunction),\nXE_EXPORT(xam,      0x00000298, XNotifyQueueUIEx,                                           kFunction),\nXE_EXPORT(xam,      0x00000299, XamAppRequestLoadEx,                                        kFunction),\nXE_EXPORT(xam,      0x0000029A, XuiPNGTextureLoader,                                        kFunction),\nXE_EXPORT(xam,      0x0000029B, XuiRenderGetXuiDevice,                                      kFunction),\nXE_EXPORT(xam,      0x0000029C, XuiDefault_False,                                           kFunction),\nXE_EXPORT(xam,      0x0000029D, XamUserGetReportingInfo,                                    kFunction),\nXE_EXPORT(xam,      0x0000029E, XamUpdateStart,                                             kFunction),\nXE_EXPORT(xam,      0x0000029F, XamUpdateGetProgress,                                       kFunction),\nXE_EXPORT(xam,      0x000002A0, XamUpdateGetExtenderInstance,                               kFunction),\nXE_EXPORT(xam,      0x000002A1, XamUpdateFinish,                                            kFunction),\nXE_EXPORT(xam,      0x000002A2, XamUpdateAttachExtenderInstance,                            kFunction),\nXE_EXPORT(xam,      0x000002A3, XamUpdateAllocateExtenderBuffer,                            kFunction),\nXE_EXPORT(xam,      0x000002A4, XamRestartTitleLoadAfterUpdate,                             kFunction),\nXE_EXPORT(xam,      0x000002A5, XamUIThreadDisableFontPatching,                             kFunction),\nXE_EXPORT(xam,      0x000002A6, XamUpdateGetBaseSystemVersion,                              kFunction),\nXE_EXPORT(xam,      0x000002A7, XamUpdateGetCurrentSystemVersion,                           kFunction),\nXE_EXPORT(xam,      0x000002A8, XamUIThreadEnableFontPatching,                              kFunction),\nXE_EXPORT(xam,      0x000002A9, XamTerminateTitleForUpdate,                                 kFunction),\nXE_EXPORT(xam,      0x000002AA, XamSystemUpdateInstallLocal,                                kFunction),\nXE_EXPORT(xam,      0x000002AB, XamUpdateChainPass3FromPass2,                               kFunction),\nXE_EXPORT(xam,      0x000002AD, XamInputGetCapabilitiesEx,                                  kFunction),\nXE_EXPORT(xam,      0x000002AE, XamUserIsUnsafeProgrammingAllowed,                          kFunction),\nXE_EXPORT(xam,      0x000002AF, XamDevAuthSetFaultEx,                                       kFunction),\nXE_EXPORT(xam,      0x000002B0, XamUpdateGetData,                                           kFunction),\nXE_EXPORT(xam,      0x000002B1, XamCacheIntegrityCheck,                                     kFunction),\nXE_EXPORT(xam,      0x000002B2, XamCacheStoreFile,                                          kFunction),\nXE_EXPORT(xam,      0x000002B3, XamCacheFetchFile,                                          kFunction),\nXE_EXPORT(xam,      0x000002B4, XamCacheOpenFile,                                           kFunction),\nXE_EXPORT(xam,      0x000002B5, XamCacheCloseFile,                                          kFunction),\nXE_EXPORT(xam,      0x000002B6, XamGetCachedTitleName,                                      kFunction),\nXE_EXPORT(xam,      0x000002B7, XamCacheReset,                                              kFunction),\nXE_EXPORT(xam,      0x000002B8, XamGetCachedGamerTag,                                       kFunction),\nXE_EXPORT(xam,      0x000002B9, XamGetCachedGamerTagW,                                      kFunction),\nXE_EXPORT(xam,      0x000002BA, XamCacheDeleteFile,                                         kFunction),\nXE_EXPORT(xam,      0x000002BB, XamCacheRenameFile,                                         kFunction),\nXE_EXPORT(xam,      0x000002BC, XamShowSigninUI,                                            kFunction),\nXE_EXPORT(xam,      0x000002BD, XamShowSigninUIEx,                                          kFunction),\nXE_EXPORT(xam,      0x000002BE, XamShowSigninUIp,                                           kFunction),\nXE_EXPORT(xam,      0x000002BF, XamShowFriendsUI,                                           kFunction),\nXE_EXPORT(xam,      0x000002C0, XamShowMessagesUI,                                          kFunction),\nXE_EXPORT(xam,      0x000002C1, XamShowKeyboardUI,                                          kFunction),\nXE_EXPORT(xam,      0x000002C2, XamShowQuickChatUI,                                         kFunction),\nXE_EXPORT(xam,      0x000002C3, XamShowVoiceMailUI,                                         kFunction),\nXE_EXPORT(xam,      0x000002C4, XamShowGamerCardUI,                                         kFunction),\nXE_EXPORT(xam,      0x000002C5, XamShowAchievementsUI,                                      kFunction),\nXE_EXPORT(xam,      0x000002C6, XamShowPlayerReviewUI,                                      kFunction),\nXE_EXPORT(xam,      0x000002C7, XamShowMarketplaceUI,                                       kFunction),\nXE_EXPORT(xam,      0x000002C8, XamShowPlayersUI,                                           kFunction),\nXE_EXPORT(xam,      0x000002C9, XamShowUpdaterUI,                                           kFunction),\nXE_EXPORT(xam,      0x000002CA, XamShowMessageBoxUI,                                        kFunction),\nXE_EXPORT(xam,      0x000002CB, XamShowDeviceSelectorUI,                                    kFunction),\nXE_EXPORT(xam,      0x000002CC, XamShowMessageComposeUI,                                    kFunction),\nXE_EXPORT(xam,      0x000002CD, XamShowGameInviteUI,                                        kFunction),\nXE_EXPORT(xam,      0x000002CE, XamShowFriendRequestUI,                                     kFunction),\nXE_EXPORT(xam,      0x000002CF, XamShowCreateProfileUI,                                     kFunction),\nXE_EXPORT(xam,      0x000002D0, XamShowGamesUI,                                             kFunction),\nXE_EXPORT(xam,      0x000002D1, XamShowLiveSignupUI,                                        kFunction),\nXE_EXPORT(xam,      0x000002D2, XamShowFriendsUIp,                                          kFunction),\nXE_EXPORT(xam,      0x000002D3, XamShowComplaintUI,                                         kFunction),\nXE_EXPORT(xam,      0x000002D4, XamShowReputationUI,                                        kFunction),\nXE_EXPORT(xam,      0x000002D5, XamShowGamerCardUIForXUID,                                  kFunction),\nXE_EXPORT(xam,      0x000002D6, XamShowForcedNameChangeUI,                                  kFunction),\nXE_EXPORT(xam,      0x000002D7, XamShowLiveUpsellUI,                                        kFunction),\nXE_EXPORT(xam,      0x000002D8, XamShowPasscodeVerifyUI,                                    kFunction),\nXE_EXPORT(xam,      0x000002D9, XamShowDirtyDiscErrorUI,                                    kFunction),\nXE_EXPORT(xam,      0x000002DA, XamShowSignupCreditCardUI,                                  kFunction),\nXE_EXPORT(xam,      0x000002DB, XamShowPrivateChatInviteUI,                                 kFunction),\nXE_EXPORT(xam,      0x000002DC, XamShowMessageBoxUIEx,                                      kFunction),\nXE_EXPORT(xam,      0x000002DD, XamShowRecentMessageUI,                                     kFunction),\nXE_EXPORT(xam,      0x000002DE, XamShowRecentMessageUIEx,                                   kFunction),\nXE_EXPORT(xam,      0x000002DF, XamShowMessagesUIEx,                                        kFunction),\nXE_EXPORT(xam,      0x000002E0, XamShowAchievementDetailsUI,                                kFunction),\nXE_EXPORT(xam,      0x000002E1, XamShowPersonalizationUI,                                   kFunction),\nXE_EXPORT(xam,      0x000002E2, XamShowChangeGamerTileUI,                                   kFunction),\nXE_EXPORT(xam,      0x000002E3, XamShowVoiceSettingsUI,                                     kFunction),\nXE_EXPORT(xam,      0x000002E4, XamShowVideoChatInviteUI,                                   kFunction),\nXE_EXPORT(xam,      0x000002E5, XamShowCustomMessageComposeUI,                              kFunction),\nXE_EXPORT(xam,      0x000002E6, XamShowCustomPlayerListUI,                                  kFunction),\nXE_EXPORT(xam,      0x000002E7, XamShowMarketplaceDownloadItemsUI,                          kFunction),\nXE_EXPORT(xam,      0x000002E8, XamShowMarketplaceUIEx,                                     kFunction),\nXE_EXPORT(xam,      0x000002E9, XamShowMessageBox,                                          kFunction),\nXE_EXPORT(xam,      0x000002EA, XamIsSysUiInvokedByXenonButton,                             kFunction),\nXE_EXPORT(xam,      0x000002EB, XamIsSysUiInvokedByTitle,                                   kFunction),\nXE_EXPORT(xam,      0x000002EC, XamIsUIActive,                                              kFunction),\nXE_EXPORT(xam,      0x000002ED, XamSysUiDisableAutoClose,                                   kFunction),\nXE_EXPORT(xam,      0x000002EE, XamUserCreateAchievementEnumerator,                         kFunction),\nXE_EXPORT(xam,      0x000002EF, XamReadTile,                                                kFunction),\nXE_EXPORT(xam,      0x000002F0, XamWriteGamerTile,                                          kFunction),\nXE_EXPORT(xam,      0x000002F1, XamWriteTile,                                               kFunction),\nXE_EXPORT(xam,      0x000002F2, XamReadImage,                                               kFunction),\nXE_EXPORT(xam,      0x000002F3, XamUserCreateTitlesPlayedEnumerator,                        kFunction),\nXE_EXPORT(xam,      0x000002F4, XamDecompressPNGToTexture,                                  kFunction),\nXE_EXPORT(xam,      0x000002F5, XamReadTileToTexture,                                       kFunction),\nXE_EXPORT(xam,      0x000002F6, XamReadString,                                              kFunction),\nXE_EXPORT(xam,      0x000002F7, XamUserCreateStatsEnumerator,                               kFunction),\nXE_EXPORT(xam,      0x000002F8, XamPrepareGamerTiles,                                       kFunction),\nXE_EXPORT(xam,      0x000002F9, XamClearTitle,                                              kFunction),\nXE_EXPORT(xam,      0x000002FA, XamReadStrings,                                             kFunction),\nXE_EXPORT(xam,      0x000002FB, XamWriteGamerTileEx,                                        kFunction),\nXE_EXPORT(xam,      0x000002FC, XamReadTileEx,                                              kFunction),\nXE_EXPORT(xam,      0x000002FD, XamReadTileToTextureEx,                                     kFunction),\nXE_EXPORT(xam,      0x000002FE, XamShowMessengerUI,                                         kFunction),\nXE_EXPORT(xam,      0x000002FF, XamShowKeyboardUIMessenger,                                 kFunction),\nXE_EXPORT(xam,      0x00000300, XamShowLiveUpsellUIEx,                                      kFunction),\nXE_EXPORT(xam,      0x00000301, XamShowJoinSessionInProgressUI,                             kFunction),\nXE_EXPORT(xam,      0x00000302, XamShowGraduateUserUI,                                      kFunction),\nXE_EXPORT(xam,      0x00000303, XamShowGamerCardUIForXUIDp,                                 kFunction),\nXE_EXPORT(xam,      0x00000304, XamShowGuideUI,                                             kFunction),\nXE_EXPORT(xam,      0x00000305, XamShowPartyUI,                                             kFunction),\nXE_EXPORT(xam,      0x00000306, XamShowPartyInviteUI,                                       kFunction),\nXE_EXPORT(xam,      0x00000307, XamUserAddRecentPlayer,                                     kFunction),\nXE_EXPORT(xam,      0x00000308, XamUserUpdateRecentPlayer,                                  kFunction),\nXE_EXPORT(xam,      0x00000309, XamUserCreatePlayerEnumerator,                              kFunction),\nXE_EXPORT(xam,      0x0000030A, XamParseGamerTileKey,                                       kFunction),\nXE_EXPORT(xam,      0x0000030B, XamShowCommunitySessionsUI,                                 kFunction),\nXE_EXPORT(xam,      0x0000030C, XamVoiceCreate,                                             kFunction),\nXE_EXPORT(xam,      0x0000030D, XamVoiceHeadsetPresent,                                     kFunction),\nXE_EXPORT(xam,      0x0000030E, XamVoiceSubmitPacket,                                       kFunction),\nXE_EXPORT(xam,      0x0000030F, XamVoiceClose,                                              kFunction),\nXE_EXPORT(xam,      0x00000310, XamVoiceGetBatteryStatus,                                   kFunction),\nXE_EXPORT(xam,      0x00000311, Refresh_,                                                   kFunction),\nXE_EXPORT(xam,      0x00000312, Refresh_0,                                                  kFunction),\nXE_EXPORT(xam,      0x00000313, XamShowJoinSessionByIdInProgressUI,                         kFunction),\nXE_EXPORT(xam,      0x00000314, XamShowPartyJoinInProgressUI,                               kFunction),\nXE_EXPORT(xam,      0x00000315, XamBuildSharedSystemResourceLocator,                        kFunction),\nXE_EXPORT(xam,      0x00000316, XamSessionCreateHandle,                                     kFunction),\nXE_EXPORT(xam,      0x00000317, XamSessionRefObjByHandle,                                   kFunction),\nXE_EXPORT(xam,      0x00000318, XamVoiceGetMicArrayStatus,                                  kFunction),\nXE_EXPORT(xam,      0x00000319, XamVoiceSetAudioCaptureRoutine,                             kFunction),\nXE_EXPORT(xam,      0x0000031A, XamVoiceGetDirectionalData,                                 kFunction),\nXE_EXPORT(xam,      0x0000031B, XamBuildResourceLocator,                                    kFunction),\nXE_EXPORT(xam,      0x0000031C, XamBuildLegacySystemResourceLocator,                        kFunction),\nXE_EXPORT(xam,      0x0000031D, XamBuildGamercardResourceLocator,                           kFunction),\nXE_EXPORT(xam,      0x0000031E, XamBuildDynamicResourceLocator,                             kFunction),\nXE_EXPORT(xam,      0x0000031F, XamBuildXamResourceLocator,                                 kFunction),\nXE_EXPORT(xam,      0x00000320, XuiAnimRun,                                                 kFunction),\nXE_EXPORT(xam,      0x00000321, XuiApplyLocale,                                             kFunction),\nXE_EXPORT(xam,      0x00000322, XuiBubbleMessage,                                           kFunction),\nXE_EXPORT(xam,      0x00000323, XuiControlIsBackButton,                                     kFunction),\nXE_EXPORT(xam,      0x00000324, XuiControlIsNavButton,                                      kFunction),\nXE_EXPORT(xam,      0x00000325, XuiCreateObject,                                            kFunction),\nXE_EXPORT(xam,      0x00000326, XuiDestroyObject,                                           kFunction),\nXE_EXPORT(xam,      0x00000327, XuiDynamicCast,                                             kFunction),\nXE_EXPORT(xam,      0x00000328, XuiElementAddChild,                                         kFunction),\nXE_EXPORT(xam,      0x00000329, XuiElementFindNamedFrame,                                   kFunction),\nXE_EXPORT(xam,      0x0000032A, XuiElementGetChildById,                                     kFunction),\nXE_EXPORT(xam,      0x0000032B, XuiElementGetFirstChild,                                    kFunction),\nXE_EXPORT(xam,      0x0000032C, XuiElementGetFocus,                                         kFunction),\nXE_EXPORT(xam,      0x0000032D, XuiElementGetFocusUser,                                     kFunction),\nXE_EXPORT(xam,      0x0000032E, XuiElementGetId,                                            kFunction),\nXE_EXPORT(xam,      0x0000032F, XuiElementGetLastChild,                                     kFunction),\nXE_EXPORT(xam,      0x00000330, XuiElementGetNext,                                          kFunction),\nXE_EXPORT(xam,      0x00000331, XuiElementGetParent,                                        kFunction),\nXE_EXPORT(xam,      0x00000332, XuiElementGetUserFocus,                                     kFunction),\nXE_EXPORT(xam,      0x00000333, XuiElementInitFocus,                                        kFunction),\nXE_EXPORT(xam,      0x00000334, XuiElementInitUserFocus,                                    kFunction),\nXE_EXPORT(xam,      0x00000335, XuiElementPlayTimeline,                                     kFunction),\nXE_EXPORT(xam,      0x00000336, XuiElementSetBounds,                                        kFunction),\nXE_EXPORT(xam,      0x00000337, XuiElementSetFocus,                                         kFunction),\nXE_EXPORT(xam,      0x00000338, XuiElementSetUserFocus,                                     kFunction),\nXE_EXPORT(xam,      0x00000339, XuiElementTreeGetFocus,                                     kFunction),\nXE_EXPORT(xam,      0x0000033A, XuiFindClass,                                               kFunction),\nXE_EXPORT(xam,      0x0000033B, XuiFreeStringTable,                                         kFunction),\nXE_EXPORT(xam,      0x0000033C, XuiGetBaseObject,                                           kFunction),\nXE_EXPORT(xam,      0x0000033D, XuiGetClass,                                                kFunction),\nXE_EXPORT(xam,      0x0000033E, XuiGetObjectClass,                                          kFunction),\nXE_EXPORT(xam,      0x0000033F, XuiGetOuter,                                                kFunction),\nXE_EXPORT(xam,      0x00000340, XuiInit,                                                    kFunction),\nXE_EXPORT(xam,      0x00000341, XuiLoadFromBinary,                                          kFunction),\nXE_EXPORT(xam,      0x00000342, XuiLoadStringTableFromFile,                                 kFunction),\nXE_EXPORT(xam,      0x00000343, XuiVisualGetBasePath,                                       kFunction),\nXE_EXPORT(xam,      0x00000344, XuiLookupStringTable,                                       kFunction),\nXE_EXPORT(xam,      0x00000345, XuiNavButtonGetPressPath,                                   kFunction),\nXE_EXPORT(xam,      0x00000346, XuiObjectFromHandle,                                        kFunction),\nXE_EXPORT(xam,      0x00000347, XuiObjectGetProperty,                                       kFunction),\nXE_EXPORT(xam,      0x00000348, XuiObjectGetPropertyId,                                     kFunction),\nXE_EXPORT(xam,      0x00000349, XuiProcessInput,                                            kFunction),\nXE_EXPORT(xam,      0x0000034A, XuiRegisterClass,                                           kFunction),\nXE_EXPORT(xam,      0x0000034B, XuiRenderBegin,                                             kFunction),\nXE_EXPORT(xam,      0x0000034C, XuiRenderCreateDC,                                          kFunction),\nXE_EXPORT(xam,      0x0000034D, XuiRenderDCDeviceChanged,                                   kFunction),\nXE_EXPORT(xam,      0x0000034E, XuiRenderDestroyDC,                                         kFunction),\nXE_EXPORT(xam,      0x0000034F, XuiRenderEnd,                                               kFunction),\nXE_EXPORT(xam,      0x00000350, XuiRenderGetBackBufferSize,                                 kFunction),\nXE_EXPORT(xam,      0x00000351, XuiRenderInit,                                              kFunction),\nXE_EXPORT(xam,      0x00000352, XuiRenderInitShared,                                        kFunction),\nXE_EXPORT(xam,      0x00000353, XuiRenderPresent,                                           kFunction),\nXE_EXPORT(xam,      0x00000354, XuiRenderSetViewTransform,                                  kFunction),\nXE_EXPORT(xam,      0x00000355, XuiRenderUninit,                                            kFunction),\nXE_EXPORT(xam,      0x00000356, XamShowNuiGuideUI,                                          kFunction),\nXE_EXPORT(xam,      0x00000357, XuiSceneCreate,                                             kFunction),\nXE_EXPORT(xam,      0x00000358, XuiSceneNavigateBack,                                       kFunction),\nXE_EXPORT(xam,      0x00000359, XuiSceneNavigateFirst,                                      kFunction),\nXE_EXPORT(xam,      0x0000035A, XuiSceneNavigateForward,                                    kFunction),\nXE_EXPORT(xam,      0x0000035B, XuiScenePlayBackFromTransition,                             kFunction),\nXE_EXPORT(xam,      0x0000035C, XuiScenePlayBackToTransition,                               kFunction),\nXE_EXPORT(xam,      0x0000035D, XuiScenePlayFromTransition,                                 kFunction),\nXE_EXPORT(xam,      0x0000035E, XuiScenePlayToTransition,                                   kFunction),\nXE_EXPORT(xam,      0x0000035F, XuiSendMessage,                                             kFunction),\nXE_EXPORT(xam,      0x00000360, XuiSetLocale,                                               kFunction),\nXE_EXPORT(xam,      0x00000361, XuiUninit,                                                  kFunction),\nXE_EXPORT(xam,      0x00000362, XuiUnregisterClass,                                         kFunction),\nXE_EXPORT(xam,      0x00000363, XuiTextElementSetText,                                      kFunction),\nXE_EXPORT(xam,      0x00000364, XuiSetTimer,                                                kFunction),\nXE_EXPORT(xam,      0x00000365, XuiTimersRun,                                               kFunction),\nXE_EXPORT(xam,      0x00000366, XuiTextElementGetText,                                      kFunction),\nXE_EXPORT(xam,      0x00000367, XuiVisualSetBasePath,                                       kFunction),\nXE_EXPORT(xam,      0x00000368, XuiHandleIsValid,                                           kFunction),\nXE_EXPORT(xam,      0x00000369, XuiAlloc,                                                   kFunction),\nXE_EXPORT(xam,      0x0000036A, XuiFree,                                                    kFunction),\nXE_EXPORT(xam,      0x0000036B, XuiDefault_True,                                            kFunction),\nXE_EXPORT(xam,      0x0000036C, XuiDefault_EmptyString,                                     kFunction),\nXE_EXPORT(xam,      0x0000036D, XuiDefault_IntegerZero,                                     kFunction),\nXE_EXPORT(xam,      0x0000036E, XuiCopyString,                                              kFunction),\nXE_EXPORT(xam,      0x0000036F, XuiRealloc,                                                 kFunction),\nXE_EXPORT(xam,      0x00000370, XuiControlPlayOptionalVisual,                               kFunction),\nXE_EXPORT(xam,      0x00000371, XuiKillTimer,                                               kFunction),\nXE_EXPORT(xam,      0x00000372, XuiElementEnableInput,                                      kFunction),\nXE_EXPORT(xam,      0x00000373, XuiElementInputEnabled,                                     kFunction),\nXE_EXPORT(xam,      0x00000374, XuiIsInstanceOf,                                            kFunction),\nXE_EXPORT(xam,      0x00000375, XuiResourceComposeLocator,                                  kFunction),\nXE_EXPORT(xam,      0x00000376, XuiResourceLocatorIsAbsolute,                               kFunction),\nXE_EXPORT(xam,      0x00000377, XuiBroadcastMessage,                                        kFunction),\nXE_EXPORT(xam,      0x00000378, XuiElementDisallowRecursiveTimelineControl,                 kFunction),\nXE_EXPORT(xam,      0x00000379, XUIElementPropVal_Construct,                                kFunction),\nXE_EXPORT(xam,      0x0000037A, XUIElementPropVal_Destruct,                                 kFunction),\nXE_EXPORT(xam,      0x0000037B, XUIElementPropVal_SetString,                                kFunction),\nXE_EXPORT(xam,      0x0000037C, XuiObjectSetProperty,                                       kFunction),\nXE_EXPORT(xam,      0x0000037D, XuiElementGetOpacity,                                       kFunction),\nXE_EXPORT(xam,      0x0000037E, XuiElementSetOpacity,                                       kFunction),\nXE_EXPORT(xam,      0x0000037F, XuiEditSetTextLimit,                                        kFunction),\nXE_EXPORT(xam,      0x00000380, XuiEditGetTextLimit,                                        kFunction),\nXE_EXPORT(xam,      0x00000381, XuiSliderSetValue,                                          kFunction),\nXE_EXPORT(xam,      0x00000382, XuiSliderGetValue,                                          kFunction),\nXE_EXPORT(xam,      0x00000383, XuiSliderSetRange,                                          kFunction),\nXE_EXPORT(xam,      0x00000384, XuiElementUnlink,                                           kFunction),\nXE_EXPORT(xam,      0x00000385, XuiElementInsertChild,                                      kFunction),\nXE_EXPORT(xam,      0x00000386, XuiSceneNavigateBackToFirst,                                kFunction),\nXE_EXPORT(xam,      0x00000387, XuiProgressBarSetRange,                                     kFunction),\nXE_EXPORT(xam,      0x00000388, XuiProgressBarSetValue,                                     kFunction),\nXE_EXPORT(xam,      0x00000389, XuiProgressBarGetValue,                                     kFunction),\nXE_EXPORT(xam,      0x0000038A, XuiControlAttachVisual,                                     kFunction),\nXE_EXPORT(xam,      0x0000038B, XuiCreateTextureBrush,                                      kFunction),\nXE_EXPORT(xam,      0x0000038C, XuiDestroyBrush,                                            kFunction),\nXE_EXPORT(xam,      0x0000038D, XUIElementPropVal_SetColorFromUint,                         kFunction),\nXE_EXPORT(xam,      0x0000038E, XuiFigureSetFill,                                           kFunction),\nXE_EXPORT(xam,      0x0000038F, XuiSliderGetRange,                                          kFunction),\nXE_EXPORT(xam,      0x00000390, XuiFigureSetTexture,                                        kFunction),\nXE_EXPORT(xam,      0x00000391, XuiControlGetItemAssociation,                               kFunction),\nXE_EXPORT(xam,      0x00000392, XuiResourceLoadAll,                                         kFunction),\nXE_EXPORT(xam,      0x00000393, XuiImageElementSetImagePath,                                kFunction),\nXE_EXPORT(xam,      0x00000394, XuiImageElementGetImagePath,                                kFunction),\nXE_EXPORT(xam,      0x00000395, XuiControlGetVisual,                                        kFunction),\nXE_EXPORT(xam,      0x00000396, XuiControlGetNavigation,                                    kFunction),\nXE_EXPORT(xam,      0x00000397, XuiLookupStringTableByIndex,                                kFunction),\nXE_EXPORT(xam,      0x00000398, XUIElementPropVal_SetBool,                                  kFunction),\nXE_EXPORT(xam,      0x00000399, XuiElementHasFocus,                                         kFunction),\nXE_EXPORT(xam,      0x0000039A, XUIElementPropVal_SetUint,                                  kFunction),\nXE_EXPORT(xam,      0x0000039B, XUIElementPropVal_Clear,                                    kFunction),\nXE_EXPORT(xam,      0x0000039C, XuiEditSetTextFormatInfo,                                   kFunction),\nXE_EXPORT(xam,      0x0000039D, XuiCreateSolidBrush,                                        kFunction),\nXE_EXPORT(xam,      0x0000039E, XuiSceneInterruptTransitions,                               kFunction),\nXE_EXPORT(xam,      0x0000039F, XuiResourceOpen,                                            kFunction),\nXE_EXPORT(xam,      0x000003A0, XuiResourceRead,                                            kFunction),\nXE_EXPORT(xam,      0x000003A1, XuiResourceClose,                                           kFunction),\nXE_EXPORT(xam,      0x000003A2, XuiVisualCreateInstance,                                    kFunction),\nXE_EXPORT(xam,      0x000003A3, XuiElementGetTimeline,                                      kFunction),\nXE_EXPORT(xam,      0x000003A4, GetCodecVersion,                                            kFunction),\nXE_EXPORT(xam,      0x000003A5, XuiElementIsDescendant,                                     kFunction),\nXE_EXPORT(xam,      0x000003A6, XuiSetMessageFilter,                                        kFunction),\nXE_EXPORT(xam,      0x000003A7, XuiAttachTextureBrush,                                      kFunction),\nXE_EXPORT(xam,      0x000003A8, XuiElementBeginRender,                                      kFunction),\nXE_EXPORT(xam,      0x000003A9, XuiElementEndRender,                                        kFunction),\nXE_EXPORT(xam,      0x000003AA, XuiDrawShape,                                               kFunction),\nXE_EXPORT(xam,      0x000003AB, XuiSelectBrushEx,                                           kFunction),\nXE_EXPORT(xam,      0x000003AC, XuiFigureGetShape,                                          kFunction),\nXE_EXPORT(xam,      0x000003AD, XuiFillRect,                                                kFunction),\nXE_EXPORT(xam,      0x000003AE, XuiVec2TransformCoord,                                      kFunction),\nXE_EXPORT(xam,      0x000003AF, XuiMatrixMultiply,                                          kFunction),\nXE_EXPORT(xam,      0x000003B0, XuiElementGetXForm,                                         kFunction),\nXE_EXPORT(xam,      0x000003B1, XuiElementSetPosition,                                      kFunction),\nXE_EXPORT(xam,      0x000003B2, XuiSelectBrush,                                             kFunction),\nXE_EXPORT(xam,      0x000003B3, XuiElementRenderChildren,                                   kFunction),\nXE_EXPORT(xam,      0x000003B4, XuiFreeUnusedTextures,                                      kFunction),\nXE_EXPORT(xam,      0x000003B5, XuiListEnableItemOverride,                                  kFunction),\nXE_EXPORT(xam,      0x000003B6, XuiListGetDefaultItemSize,                                  kFunction),\nXE_EXPORT(xam,      0x000003B7, XuiResourceSeek,                                            kFunction),\nXE_EXPORT(xam,      0x000003B8, XuiElementDiscardResources,                                 kFunction),\nXE_EXPORT(xam,      0x000003B9, XuiTabSceneGoto,                                            kFunction),\nXE_EXPORT(xam,      0x000003BA, XuiTabSceneGetCurrentTab,                                   kFunction),\nXE_EXPORT(xam,      0x000003BB, XamShowWhatsOnUI,                                           kFunction),\nXE_EXPORT(xam,      0x000003BC, XamShowEditProfileUI,                                       kFunction),\nXE_EXPORT(xam,      0x000003BD, XamShowStorePickerUI,                                       kFunction),\nXE_EXPORT(xam,      0x000003BE, XamShowTermsOfUseUI,                                        kFunction),\nXE_EXPORT(xam,      0x000003BF, XamShowJoinPartyUI,                                         kFunction),\nXE_EXPORT(xam,      0x000003C0, XamShowWordRegisterUI,                                      kFunction),\nXE_EXPORT(xam,      0x000003C1, XamOverrideHudOpenType,                                     kFunction),\nXE_EXPORT(xam,      0x000003C2, XamShowAchievementsUIEx,                                    kFunction),\nXE_EXPORT(xam,      0x000003C3, XamUserGetUserTenure,                                       kFunction),\nXE_EXPORT(xam,      0x000003C4, XamUserGetSubscriptionType,                                 kFunction),\nXE_EXPORT(xam,      0x000003C5, XamShowGameVoiceChannelUI,                                  kFunction),\nXE_EXPORT(xam,      0x000003C6, XamShowAvatarAwardsUI,                                      kFunction),\nXE_EXPORT(xam,      0x000003C7, XamShowAvatarAwardGamesUI,                                  kFunction),\nXE_EXPORT(xam,      0x000003C8, XamShowVideoRichPresenceUI,                                 kFunction),\nXE_EXPORT(xam,      0x000003C9, XamHudGetUserIndex,                                         kFunction),\nXE_EXPORT(xam,      0x000003CA, XGetAudioFlags,                                             kFunction),\nXE_EXPORT(xam,      0x000003CB, XGetAVPack,                                                 kFunction),\nXE_EXPORT(xam,      0x000003CC, XGetGameRegion,                                             kFunction),\nXE_EXPORT(xam,      0x000003CD, XGetLanguage,                                               kFunction),\nXE_EXPORT(xam,      0x000003CE, XapipGetLocale,                                             kFunction),\nXE_EXPORT(xam,      0x000003CF, XGetVideoFlags,                                             kFunction),\nXE_EXPORT(xam,      0x000003D0, XGetVideoStandard,                                          kFunction),\nXE_EXPORT(xam,      0x000003D1, XGetVideoMode,                                              kFunction),\nXE_EXPORT(xam,      0x000003D2, XamGetLanguage,                                             kFunction),\nXE_EXPORT(xam,      0x000003D3, XUITimeline_Run,                                            kFunction),\nXE_EXPORT(xam,      0x000003D4, XamSetAutomation,                                           kFunction),\nXE_EXPORT(xam,      0x000003D5, XAutomationpBindController,                                 kFunction),\nXE_EXPORT(xam,      0x000003D6, XAutomationpUnbindController,                               kFunction),\nXE_EXPORT(xam,      0x000003D7, XAutomationpInputXenonButton,                               kFunction),\nXE_EXPORT(xam,      0x000003D8, XAutomationpInputPress,                                     kFunction),\nXE_EXPORT(xam,      0x000003D9, XAutomationpInputSetState,                                  kFunction),\nXE_EXPORT(xam,      0x000003DA, XamEnableOverdraw,                                          kFunction),\nXE_EXPORT(xam,      0x000003DB, g_XuiAutomation,                                            kVariable),\nXE_EXPORT(xam,      0x000003DC, XamVoiceGetMicArrayAudio,                                   kFunction),\nXE_EXPORT(xam,      0x000003DD, XampSystemInput,                                            kFunction),\nXE_EXPORT(xam,      0x000003DE, XamInputControl,                                            kFunction),\nXE_EXPORT(xam,      0x000003DF, XuiElementGetPosition,                                      kFunction),\nXE_EXPORT(xam,      0x000003E0, XamIsMessageBoxActive,                                      kFunction),\nXE_EXPORT(xam,      0x000003E1, XamIsBackgroundSceneInTransition,                           kFunction),\nXE_EXPORT(xam,      0x000003E2, XuiElementTreeHasFocus,                                     kFunction),\nXE_EXPORT(xam,      0x000003E3, XuiFigureClose,                                             kFunction),\nXE_EXPORT(xam,      0x000003E4, GamerCardStartup,                                           kFunction),\nXE_EXPORT(xam,      0x000003E5, GamerCardCleanup,                                           kFunction),\nXE_EXPORT(xam,      0x000003E6, GamerCardRegisterControls,                                  kFunction),\nXE_EXPORT(xam,      0x000003E7, GamerCardUnregisterControls,                                kFunction),\nXE_EXPORT(xam,      0x000003E8, RtlFindFirstFile,                                           kFunction),\nXE_EXPORT(xam,      0x000003E9, RtlFindNextFile,                                            kFunction),\nXE_EXPORT(xam,      0x000003EA, RtlGetModuleFileName,                                       kFunction),\nXE_EXPORT(xam,      0x000003EB, RtlOutputDebugString,                                       kFunction),\nXE_EXPORT(xam,      0x000003EC, RtlRemoveDirectory,                                         kFunction),\nXE_EXPORT(xam,      0x000003ED, RtlSleep,                                                   kFunction),\nXE_EXPORT(xam,      0x000003EE, RtlGetLastError,                                            kFunction),\nXE_EXPORT(xam,      0x000003EF, RtlSetLastError,                                            kFunction),\nXE_EXPORT(xam,      0x000003F0, RtlSetLastNTError,                                          kFunction),\nXE_EXPORT(xam,      0x000003F1, RtlDebugPrint,                                              kFunction),\nXE_EXPORT(xam,      0x000003F2, RtlDebugError,                                              kFunction),\nXE_EXPORT(xam,      0x000003F3, XDebugWarning,                                              kFunction),\nXE_EXPORT(xam,      0x000003F4, RtlDebugTrace,                                              kFunction),\nXE_EXPORT(xam,      0x000003F5, RtlDebugEntry,                                              kFunction),\nXE_EXPORT(xam,      0x000003F6, RtlDebugExit,                                               kFunction),\nXE_EXPORT(xam,      0x000003F7, RtlGetAttributesOnHeapAlloc,                                kFunction),\nXE_EXPORT(xam,      0x000003F8, RtlSetAttributesOnHeapAlloc,                                kFunction),\nXE_EXPORT(xam,      0x000003F9, XuiFigureSetShape,                                          kFunction),\nXE_EXPORT(xam,      0x000003FA, RtlCreateHeap,                                              kFunction),\nXE_EXPORT(xam,      0x000003FB, RtlDestroyHeap,                                             kFunction),\nXE_EXPORT(xam,      0x000003FC, RtlAllocateHeap,                                            kFunction),\nXE_EXPORT(xam,      0x000003FD, RtlAllocateHeapSlowly,                                      kFunction),\nXE_EXPORT(xam,      0x000003FE, RtlReAllocateHeap,                                          kFunction),\nXE_EXPORT(xam,      0x000003FF, RtlFreeHeap,                                                kFunction),\nXE_EXPORT(xam,      0x00000400, RtlFreeHeapSlowly,                                          kFunction),\nXE_EXPORT(xam,      0x00000401, RtlSizeHeap,                                                kFunction),\nXE_EXPORT(xam,      0x00000402, RtlZeroHeap,                                                kFunction),\nXE_EXPORT(xam,      0x00000403, RtlDebugWalkHeap,                                           kFunction),\nXE_EXPORT(xam,      0x00000404, RtlWalkHeap,                                                kFunction),\nXE_EXPORT(xam,      0x00000405, RtlLockHeap,                                                kFunction),\nXE_EXPORT(xam,      0x00000406, RtlUnlockHeap,                                              kFunction),\nXE_EXPORT(xam,      0x00000407, RtlValidateHeap,                                            kFunction),\nXE_EXPORT(xam,      0x00000408, RtlDebugCompactHeap,                                        kFunction),\nXE_EXPORT(xam,      0x00000409, RtlCompactHeap,                                             kFunction),\nXE_EXPORT(xam,      0x0000040A, XamAppSetTestOption,                                        kFunction),\nXE_EXPORT(xam,      0x0000040B, XamAppReportError,                                          kFunction),\nXE_EXPORT(xam,      0x0000040C, XamIsNuiUIActive,                                           kFunction),\nXE_EXPORT(xam,      0x0000040D, XamVerifyPasscode,                                          kFunction),\nXE_EXPORT(xam,      0x0000040E, OutputDebugStringA,                                         kFunction),\nXE_EXPORT(xam,      0x0000040F, DebugBreak,                                                 kFunction),\nXE_EXPORT(xam,      0x00000410, GetCurrentThreadId,                                         kFunction),\nXE_EXPORT(xam,      0x00000411, XDebugError,                                                kFunction),\nXE_EXPORT(xam,      0x00000412, XDebugWarning_,                                             kFunction),\nXE_EXPORT(xam,      0x00000413, RtlDebugSetLevel,                                           kFunction),\nXE_EXPORT(xam,      0x00000414, CloseHandle,                                                kFunction),\nXE_EXPORT(xam,      0x00000415, GetTickCount,                                               kFunction),\nXE_EXPORT(xam,      0x00000416, GetLastError,                                               kFunction),\nXE_EXPORT(xam,      0x00000417, SetFilePointer,                                             kFunction),\nXE_EXPORT(xam,      0x00000418, SetFilePointerEx,                                           kFunction),\nXE_EXPORT(xam,      0x00000419, SetLastError,                                               kFunction),\nXE_EXPORT(xam,      0x0000041A, MultiByteToWideChar,                                        kFunction),\nXE_EXPORT(xam,      0x0000041B, WideCharToMultiByte,                                        kFunction),\nXE_EXPORT(xam,      0x0000041C, ReadFile,                                                   kFunction),\nXE_EXPORT(xam,      0x0000041D, FlushFileBuffers,                                           kFunction),\nXE_EXPORT(xam,      0x0000041E, WriteFile,                                                  kFunction),\nXE_EXPORT(xam,      0x0000041F, OutputDebugStringW,                                         kFunction),\nXE_EXPORT(xam,      0x00000420, SetEvent,                                                   kFunction),\nXE_EXPORT(xam,      0x00000421, XapiFormatTimeOut,                                          kFunction),\nXE_EXPORT(xam,      0x00000422, CreateMutexA,                                               kFunction),\nXE_EXPORT(xam,      0x00000423, OpenMutexA,                                                 kFunction),\nXE_EXPORT(xam,      0x00000424, ReleaseMutex,                                               kFunction),\nXE_EXPORT(xam,      0x00000425, WaitForSingleObject,                                        kFunction),\nXE_EXPORT(xam,      0x00000426, WaitForSingleObjectEx,                                      kFunction),\nXE_EXPORT(xam,      0x00000427, GetFileSize,                                                kFunction),\nXE_EXPORT(xam,      0x00000428, GetFileSizeEx,                                              kFunction),\nXE_EXPORT(xam,      0x00000429, XapiDirectoryInformationToFindData,                         kFunction),\nXE_EXPORT(xam,      0x0000042A, XapiFormatObjectAttributes,                                 kFunction),\nXE_EXPORT(xam,      0x0000042B, ResetEvent,                                                 kFunction),\nXE_EXPORT(xam,      0x0000042C, wsprintfA,                                                  kFunction),\nXE_EXPORT(xam,      0x0000042D, wsprintfW,                                                  kFunction),\nXE_EXPORT(xam,      0x0000042E, GetOverlappedResult,                                        kFunction),\nXE_EXPORT(xam,      0x0000042F, QueryPerformanceCounter,                                    kFunction),\nXE_EXPORT(xam,      0x00000430, QueryPerformanceFrequency,                                  kFunction),\nXE_EXPORT(xam,      0x00000431, LocalAlloc,                                                 kFunction),\nXE_EXPORT(xam,      0x00000432, LocalFree,                                                  kFunction),\nXE_EXPORT(xam,      0x00000433, RaiseException,                                             kFunction),\nXE_EXPORT(xam,      0x00000434, RtlUniform,                                                 kFunction),\nXE_EXPORT(xam,      0x00000435, RtlRandom,                                                  kFunction),\nXE_EXPORT(xam,      0x00000436, Sleep,                                                      kFunction),\nXE_EXPORT(xam,      0x00000437, SleepEx,                                                    kFunction),\nXE_EXPORT(xam,      0x00000438, XMemSet,                                                    kFunction),\nXE_EXPORT(xam,      0x00000439, XRegisterThreadNotifyRoutine,                               kFunction),\nXE_EXPORT(xam,      0x0000043A, XGetOverlappedExtendedError,                                kFunction),\nXE_EXPORT(xam,      0x0000043B, XGetOverlappedResult,                                       kFunction),\nXE_EXPORT(xam,      0x0000043C, CreateThread,                                               kFunction),\nXE_EXPORT(xam,      0x0000043D, ResumeThread,                                               kFunction),\nXE_EXPORT(xam,      0x0000043E, ExitThread,                                                 kFunction),\nXE_EXPORT(xam,      0x0000043F, GetTimeZoneInformation,                                     kFunction),\nXE_EXPORT(xam,      0x00000440, GetSystemTimeAsFileTime,                                    kFunction),\nXE_EXPORT(xam,      0x00000441, SystemTimeToFileTime,                                       kFunction),\nXE_EXPORT(xam,      0x00000442, FileTimeToSystemTime,                                       kFunction),\nXE_EXPORT(xam,      0x00000443, GetSystemTime,                                              kFunction),\nXE_EXPORT(xam,      0x00000444, GetLocalTime,                                               kFunction),\nXE_EXPORT(xam,      0x00000445, CreateDirectoryA,                                           kFunction),\nXE_EXPORT(xam,      0x00000446, CreateEventA,                                               kFunction),\nXE_EXPORT(xam,      0x00000447, CreateFileA,                                                kFunction),\nXE_EXPORT(xam,      0x00000448, DeleteFileA,                                                kFunction),\nXE_EXPORT(xam,      0x00000449, FindFirstFileA,                                             kFunction),\nXE_EXPORT(xam,      0x0000044A, FindNextFileA,                                              kFunction),\nXE_EXPORT(xam,      0x0000044B, GetFileAttributesA,                                         kFunction),\nXE_EXPORT(xam,      0x0000044C, XamLoaderGetCurrentTitleD3DVersion,                         kFunction),\nXE_EXPORT(xam,      0x0000044D, GetFileAttributesExA,                                       kFunction),\nXE_EXPORT(xam,      0x0000044E, GetModuleHandleA,                                           kFunction),\nXE_EXPORT(xam,      0x0000044F, GetDiskFreeSpaceExA,                                        kFunction),\nXE_EXPORT(xam,      0x00000450, CopyFileA,                                                  kFunction),\nXE_EXPORT(xam,      0x00000451, SetEndOfFile,                                               kFunction),\nXE_EXPORT(xam,      0x00000452, XamFamilyAddParentalExemptionToList,                        kFunction),\nXE_EXPORT(xam,      0x00000453, XamFamilyIsParentalValidationRequired,                      kFunction),\nXE_EXPORT(xam,      0x00000454, PIXBeginCapture,                                            kFunction),\nXE_EXPORT(xam,      0x00000455, PIXEndCapture,                                              kFunction),\nXE_EXPORT(xam,      0x00000456, PIXAddCounter,                                              kFunction),\nXE_EXPORT(xam,      0x00000457, PIXGetGPUSlot,                                              kFunction),\nXE_EXPORT(xam,      0x00000458, SetWaitableTimer,                                           kFunction),\nXE_EXPORT(xam,      0x00000459, CancelWaitableTimer,                                        kFunction),\nXE_EXPORT(xam,      0x0000045A, CreateWaitableTimerA,                                       kFunction),\nXE_EXPORT(xam,      0x0000045B, DuplicateHandle,                                            kFunction),\nXE_EXPORT(xam,      0x0000045C, XapipCreateThread,                                          kFunction),\nXE_EXPORT(xam,      0x0000045D, lstrcpyA,                                                   kFunction),\nXE_EXPORT(xam,      0x0000045E, lstrcpyW,                                                   kFunction),\nXE_EXPORT(xam,      0x0000045F, lstrcpynA,                                                  kFunction),\nXE_EXPORT(xam,      0x00000460, lstrcpynW,                                                  kFunction),\nXE_EXPORT(xam,      0x00000461, lstrcatA,                                                   kFunction),\nXE_EXPORT(xam,      0x00000462, lstrcatW,                                                   kFunction),\nXE_EXPORT(xam,      0x00000463, lstrlenA,                                                   kFunction),\nXE_EXPORT(xam,      0x00000464, lstrlenW,                                                   kFunction),\nXE_EXPORT(xam,      0x00000465, IsBadReadPtr,                                               kFunction),\nXE_EXPORT(xam,      0x00000466, IsBadWritePtr,                                              kFunction),\nXE_EXPORT(xam,      0x00000467, FileTimeToLocalFileTime,                                    kFunction),\nXE_EXPORT(xam,      0x00000468, XMemCpy,                                                    kFunction),\nXE_EXPORT(xam,      0x00000469, XMemCpyStreaming,                                           kFunction),\nXE_EXPORT(xam,      0x0000046A, XamHudSetUserIndex,                                         kFunction),\nXE_EXPORT(xam,      0x0000046B, XamShowNuiTroubleshooterUI,                                 kFunction),\nXE_EXPORT(xam,      0x0000046C, XamTestShowNuiTroubleshooterUI,                             kFunction),\nXE_EXPORT(xam,      0x0000046D, XamShowPasscodeVerifyUIEx,                                  kFunction),\nXE_EXPORT(xam,      0x0000046E, XamShowNuiAchievementsUI,                                   kFunction),\nXE_EXPORT(xam,      0x0000046F, XamShowNuiCommunitySessionsUI,                              kFunction),\nXE_EXPORT(xam,      0x00000470, XamShowNuiDeviceSelectorUI,                                 kFunction),\nXE_EXPORT(xam,      0x00000471, XamShowNuiDirtyDiscErrorUI,                                 kFunction),\nXE_EXPORT(xam,      0x00000472, XamShowNuiFriendsUI,                                        kFunction),\nXE_EXPORT(xam,      0x00000473, XamShowNuiGameInviteUI,                                     kFunction),\nXE_EXPORT(xam,      0x00000474, XamShowNuiGamerCardUIForXUID,                               kFunction),\nXE_EXPORT(xam,      0x00000475, XamShowNuiMarketplaceDownloadItemsUI,                       kFunction),\nXE_EXPORT(xam,      0x00000476, XamShowNuiMarketplaceUI,                                    kFunction),\nXE_EXPORT(xam,      0x00000477, XamShowNuiMessageBoxUI,                                     kFunction),\nXE_EXPORT(xam,      0x00000478, XamShowNuiPartyUI,                                          kFunction),\nXE_EXPORT(xam,      0x00000479, XamShowNuiFriendRequestUI,                                  kFunction),\nXE_EXPORT(xam,      0x0000047A, XamShowNuiSigninUI,                                         kFunction),\nXE_EXPORT(xam,      0x0000047B, XamShowNuiControllerRequiredUI,                             kFunction),\nXE_EXPORT(xam,      0x0000047C, XamShowNuiGamesUI,                                          kFunction),\nXE_EXPORT(xam,      0x0000047D, XamShowNuiHardwareRequiredUI,                               kFunction),\nXE_EXPORT(xam,      0x0000047E, XamCacheStoreFileByString,                                  kFunction),\nXE_EXPORT(xam,      0x0000047F, XamCacheFetchFileByString,                                  kFunction),\nXE_EXPORT(xam,      0x00000480, XamCacheDeleteFileByString,                                 kFunction),\nXE_EXPORT(xam,      0x00000481, XamGetCachedTitleNameEx,                                    kFunction),\nXE_EXPORT(xam,      0x00000482, XamXlfsInitializeUploadQueue,                               kFunction),\nXE_EXPORT(xam,      0x00000483, XamXlfsUninitializeUploadQueue,                             kFunction),\nXE_EXPORT(xam,      0x00000484, XamXlfsMountUploadQueueInstance,                            kFunction),\nXE_EXPORT(xam,      0x00000485, XamXlfsUnmountUploadQueueInstance,                          kFunction),\nXE_EXPORT(xam,      0x00000486, XamVoiceRecordUserPrivileges,                               kFunction),\nXE_EXPORT(xam,      0x00000487, XamXlfsInitializeUploadQueueWithTestHooks,                  kFunction),\nXE_EXPORT(xam,      0x00000488, XamXlfsNotifyContentDeletion,                               kFunction),\nXE_EXPORT(xam,      0x00000489, XMemAlloc,                                                  kFunction),\nXE_EXPORT(xam,      0x0000048A, XMemFree,                                                   kFunction),\nXE_EXPORT(xam,      0x0000048B, XMemSize,                                                   kFunction),\nXE_EXPORT(xam,      0x0000048C, XamVoiceSetMicArrayIdleUsers,                               kFunction),\nXE_EXPORT(xam,      0x0000048D, XamVoiceMuteMicArray,                                       kFunction),\nXE_EXPORT(xam,      0x0000048E, XamVoiceGetMicArrayUnderrunStatus,                          kFunction),\nXE_EXPORT(xam,      0x0000048F, XuiSceneEnableTransitionDependency,                         kFunction),\nXE_EXPORT(xam,      0x00000490, XamVoiceGetMicArrayAudioEx,                                 kFunction),\nXE_EXPORT(xam,      0x00000491, XamVoiceDisableMicArray,                                    kFunction),\nXE_EXPORT(xam,      0x00000492, XamUserGetDeviceId,                                         kFunction),\nXE_EXPORT(xam,      0x00000493, XamUpdateEtxLogUpdateTaskStart,                             kFunction),\nXE_EXPORT(xam,      0x00000494, XamUpdateEtxLogUpdateTaskSuccess,                           kFunction),\nXE_EXPORT(xam,      0x00000495, XamUpdateEtxLogUpdateTaskFailure,                           kFunction),\nXE_EXPORT(xam,      0x00000496, XamEtxFlushLogs,                                            kFunction),\nXE_EXPORT(xam,      0x00000497, XamVoiceIsActiveProcess,                                    kFunction),\nXE_EXPORT(xam,      0x00000498, XamInactivityGetInactivityInterruptTime,                    kFunction),\nXE_EXPORT(xam,      0x00000499, XamInactivitySetInactivityInterruptTime,                    kFunction),\nXE_EXPORT(xam,      0x0000049A, XamInactivityGetLastActivityTime,                           kFunction),\nXE_EXPORT(xam,      0x0000049B, XamInactivitySetDetectionTaskPeriod,                        kFunction),\nXE_EXPORT(xam,      0x0000049C, XamInactivityEnablePowerDown,                               kFunction),\nXE_EXPORT(xam,      0x0000049D, XamUpdateGetChainMarker,                                    kFunction),\nXE_EXPORT(xam,      0x0000049E, XGetVideoCapabilities,                                      kFunction),\nXE_EXPORT(xam,      0x0000049F, XMsgProcessRequest,                                         kFunction),\nXE_EXPORT(xam,      0x000004A0, XGetDisplaySize,                                            kFunction),\nXE_EXPORT(xam,      0x000004A1, XamInputNonControllerGetRaw,                                kFunction),\nXE_EXPORT(xam,      0x000004A2, XamInputNonControllerSetRaw,                                kFunction),\nXE_EXPORT(xam,      0x000004A3, XamVoiceSetMicArrayBeamAngle,                               kFunction),\nXE_EXPORT(xam,      0x000004A4, XamUserGetAge,                                              kFunction),\nXE_EXPORT(xam,      0x000004A5, XamUserGetAgeGroup,                                         kFunction),\nXE_EXPORT(xam,      0x000004A6, XamVoiceGetMicArrayFilenameDesc,                            kFunction),\nXE_EXPORT(xam,      0x000004A7, XamLoaderGetState,                                          kFunction),\nXE_EXPORT(xam,      0x000004A8, XamTaskQueryProperty,                                       kFunction),\nXE_EXPORT(xam,      0x000004A9, XamGetLocale,                                               kFunction),\nXE_EXPORT(xam,      0x000004AA, XamQueryTimeZoneInformation,                                kFunction),\nXE_EXPORT(xam,      0x000004AB, XamSetTimeZoneInformation,                                  kFunction),\nXE_EXPORT(xam,      0x000004AC, XamLaunchURI,                                               kFunction),\nXE_EXPORT(xam,      0x000004AF, XamShowNuiMessagesUI,                                       kFunction),\nXE_EXPORT(xam,      0x000004B0, XMPRegisterCodec,                                           kFunction),\nXE_EXPORT(xam,      0x000004B1, XamNavigateBack,                                            kFunction),\nXE_EXPORT(xam,      0x000004B2, XamPushBackURI,                                             kFunction),\nXE_EXPORT(xam,      0x000004B3, XamUserOverrideDeviceBindings,                              kFunction),\nXE_EXPORT(xam,      0x000004B4, XamUserOverrideBindingCallbacks,                            kFunction),\nXE_EXPORT(xam,      0x000004B5, XamUserOverrideUserInfo,                                    kFunction),\nXE_EXPORT(xam,      0x000004B6, XamUserContentRestrictionGetFlags,                          kFunction),\nXE_EXPORT(xam,      0x000004B7, XamUserContentRestrictionGetRating,                         kFunction),\nXE_EXPORT(xam,      0x000004B8, XamUserContentRestrictionCheckAccess,                       kFunction),\nXE_EXPORT(xam,      0x000004B9, XamShowFitnessBodyProfileUI,                                kFunction),\nXE_EXPORT(xam,      0x000004BA, XamFitnessAddBodyProfileRecord,                             kFunction),\nXE_EXPORT(xam,      0x000004BB, XamFamilyGetMembers,                                        kFunction),\nXE_EXPORT(xam,      0x000004BC, XampXAuthStartup,                                           kFunction),\nXE_EXPORT(xam,      0x000004BD, XampXAuthShutdown,                                          kFunction),\nXE_EXPORT(xam,      0x000004BE, XamGetToken,                                                kFunction),\nXE_EXPORT(xam,      0x000004BF, XamFreeToken,                                               kFunction),\nXE_EXPORT(xam,      0x000004C0, XamGetAppliesTo,                                            kFunction),\nXE_EXPORT(xam,      0x000004C1, XamFitnessClearBodyProfileRecords,                          kFunction),\nXE_EXPORT(xam,      0x000004C2, XamFitnessGetCurrentBodyProfileRecord,                      kFunction),\nXE_EXPORT(xam,      0x000004C3, XamFitnessGetAllBodyProfileRecords,                         kFunction),\nXE_EXPORT(xam,      0x000004C4, XamFitnessGetAllTitleSummaries,                             kFunction),\nXE_EXPORT(xam,      0x000004C5, XamFitnessGetOverallSummary,                                kFunction),\nXE_EXPORT(xam,      0x000004C6, XamFitnessAddFitnessEvent,                                  kFunction),\nXE_EXPORT(xam,      0x000004C7, XamLrcGetInput,                                             kFunction),\nXE_EXPORT(xam,      0x000004C8, XamLrcGetInputWithSeek,                                     kFunction),\nXE_EXPORT(xam,      0x000004C9, XamLrcSetMediaState,                                        kFunction),\nXE_EXPORT(xam,      0x000004CA, XamPixSetDirtyCounters,                                     kFunction),\nXE_EXPORT(xam,      0x000004CB, XamFitnessCreateFitnessEventEnumerator,                     kFunction),\nXE_EXPORT(xam,      0x000004CC, XamFitnessInitialize,                                       kFunction),\nXE_EXPORT(xam,      0x000004CD, XamRequestToken,                                            kFunction),\nXE_EXPORT(xam,      0x000004CE, XamResolveURI,                                              kFunction),\nXE_EXPORT(xam,      0x000004CF, XamContentGetOnlineCreator,                                 kFunction),\nXE_EXPORT(xam,      0x000004D0, XamShowBrandedKeyboardUI,                                   kFunction),\nXE_EXPORT(xam,      0x000004D1, XamBackgroundDownloadNetworkStorageEnable,                  kFunction),\nXE_EXPORT(xam,      0x000004D2, XamBackgroundDownloadNetworkStorageIsEnabled,               kFunction),\nXE_EXPORT(xam,      0x000004D3, XamShowNuiJoinSessionInProgressUI,                          kFunction),\nXE_EXPORT(xam,      0x000004D4, XamBase64Decode,                                            kFunction),\nXE_EXPORT(xam,      0x000004D5, XamCertDecode,                                              kFunction),\nXE_EXPORT(xam,      0x000004D6, XamCertDecodeRsaPublicKey,                                  kFunction),\nXE_EXPORT(xam,      0x000004D7, XamCertValidateStruct,                                      kFunction),\nXE_EXPORT(xam,      0x000004D8, XamFitnessConvertByteMetToFloatMet,                         kFunction),\nXE_EXPORT(xam,      0x000004D9, XamXgiBlobTrackerSetMockInfo,                               kFunction),\nXE_EXPORT(xam,      0x000004DA, XamFitnessMsgTimeToSystemTime,                              kFunction),\nXE_EXPORT(xam,      0x000004DB, XamFitnessSystemTimeToMsgTime,                              kFunction),\nXE_EXPORT(xam,      0x000004DC, XamShowFitnessWarnAboutPrivacyUI,                           kFunction),\nXE_EXPORT(xam,      0x000004DD, XamShowFitnessWarnAboutTimeUI,                              kFunction),\nXE_EXPORT(xam,      0x000004DE, XamFitnessUnInitialize,                                     kFunction),\nXE_EXPORT(xam,      0x000004DF, XamBackgroundDownloadNetworkStorageOnContentChange,         kFunction),\nXE_EXPORT(xam,      0x000004E0, XamLiveBaseConfigureInMemoryMockResponse,                   kFunction),\nXE_EXPORT(xam,      0x000004E1, InjectConnectionServerNotification,                         kFunction),\nXE_EXPORT(xam,      0x000004E2, XamFitnessConvertFloatMetToByteMet,                         kFunction),\nXE_EXPORT(xam,      0x000004E3, XamGetGamerTileKeyFromGamertag,                             kFunction),\nXE_EXPORT(xam,      0x000004E4, XamBackgroundDownloadNetworkStorageRegisterChangeCallback,  kFunction),\nXE_EXPORT(xam,      0x000004E5, XamFindOrCreateInternalPassportAccount,                     kFunction),\nXE_EXPORT(xam,      0x000004E6, XOnlinepFriendsRequest,                                     kFunction),\nXE_EXPORT(xam,      0x000004E7, XOnlinepFriendsAcceptRequest,                               kFunction),\nXE_EXPORT(xam,      0x000004E8, XOnlinepFriendsRejectRequest,                               kFunction),\nXE_EXPORT(xam,      0x000004E9, XOnlinepFriendsRemove,                                      kFunction),\nXE_EXPORT(xam,      0x000004EA, XFriendsCreateEnumerator,                                   kFunction),\nXE_EXPORT(xam,      0x000004EB, XamBackgroundDownloadNetworkStorageIsRunning,               kFunction),\nXE_EXPORT(xam,      0x000004EC, XamCertGetSerialNumber,                                     kFunction),\nXE_EXPORT(xam,      0x000004ED, XamShowOptionsUI,                                           kFunction),\nXE_EXPORT(xam,      0x000004EE, XampXAuthGetTitleBuffer,                                    kFunction),\nXE_EXPORT(xam,      0x000004EF, XamGetSTSTokenCache,                                        kFunction),\nXE_EXPORT(xam,      0x000004F0, XamUserGetOnlineXUIDFromOfflineXUID,                        kFunction),\nXE_EXPORT(xam,      0x000004F1, XamIsUserUsingMetricSystem,                                 kFunction),\nXE_EXPORT(xam,      0x000004F2, XamShowNuiVideoRichPresenceUI,                              kFunction),\nXE_EXPORT(xam,      0x000004F3, XamAppAllocateInterappWorkspaceEx,                          kFunction),\nXE_EXPORT(xam,      0x000004F4, XampKioskSetTestMock,                                       kFunction),\nXE_EXPORT(xam,      0x000004F5, XamNetworkStatusGetInformation,                             kFunction),\nXE_EXPORT(xam,      0x000004F6, XamNetworkStatusAddAddress,                                 kFunction),\nXE_EXPORT(xam,      0x000004F7, XamUserReadUserPreference,                                  kFunction),\nXE_EXPORT(xam,      0x000004F8, XamUserWriteUserPreference,                                 kFunction),\nXE_EXPORT(xam,      0x000004F9, XamShowFitnessClearUI,                                      kFunction),\nXE_EXPORT(xam,      0x000004FA, XamFitnessClearAll,                                         kFunction),\nXE_EXPORT(xam,      0x000004FB, XamFitnessGetPrivacySettings,                               kFunction),\nXE_EXPORT(xam,      0x000004FC, XamWaitForNSAL,                                             kFunction),\nXE_EXPORT(xam,      0x000004FD, XamMarkInternalAccountTrustedOnConsole,                     kFunction),\nXE_EXPORT(xam,      0x000004FE, XamBackgroundDownloadNetworkStorageGetProgress,             kFunction),\nXE_EXPORT(xam,      0x000004FF, XamCopyFile,                                                kFunction),\nXE_EXPORT(xam,      0x00000500, XamMoveFile,                                                kFunction),\nXE_EXPORT(xam,      0x00000501, XamDeleteFile,                                              kFunction),\nXE_EXPORT(xam,      0x00000502, XamUserOverrideGlobalState,                                 kFunction),\nXE_EXPORT(xam,      0x00000503, XamGetAdaptersCollection,                                   kFunction),\nXE_EXPORT(xam,      0x00000504, XampKioskIsSimulationMode,                                  kFunction),\nXE_EXPORT(xam,      0x00000505, XamIsUIThread,                                              kFunction),\nXE_EXPORT(xam,      0x00000506, XamInputSendXenonButtonPress,                               kFunction),\nXE_EXPORT(xam,      0x00000507, XamDebugGetURISchemeCount,                                  kFunction),\nXE_EXPORT(xam,      0x00000508, XamDebugGetURISchemeInfo,                                   kFunction),\nXE_EXPORT(xam,      0x00000509, XamGetOnlineCountryFromLocale,                              kFunction),\nXE_EXPORT(xam,      0x0000050A, XTestOnlineIsConnectedToLive,                               kFunction),\nXE_EXPORT(xam,      0x0000050B, XamGetConsoleFriendlyName,                                  kFunction),\nXE_EXPORT(xam,      0x0000050C, XamSetConsoleFriendlyName,                                  kFunction),\nXE_EXPORT(xam,      0x0000050D, XamGetCountry,                                              kFunction),\nXE_EXPORT(xam,      0x0000050E, XamPackageManagerGetFilePathW,                              kFunction),\nXE_EXPORT(xam,      0x0000050F, XamGetCurrentDemand,                                        kFunction),\nXE_EXPORT(xam,      0x00000510, XamCompleteDemand,                                          kFunction),\nXE_EXPORT(xam,      0x00000511, XamDemand,                                                  kFunction),\nXE_EXPORT(xam,      0x00000512, XamFormatSystemDateString,                                  kFunction),\nXE_EXPORT(xam,      0x00000513, XamDebugGetBackURI,                                         kFunction),\nXE_EXPORT(xam,      0x00000514, XamIsCurrentTitleIptv,                                      kFunction),\nXE_EXPORT(xam,      0x00000515, XamIsIptvEnabled,                                           kFunction),\nXE_EXPORT(xam,      0x00000516, XamIsDvrRecording,                                          kFunction),\nXE_EXPORT(xam,      0x00000517, XamIptvUninstall,                                           kFunction),\nXE_EXPORT(xam,      0x00000518, XamGetDvrStorage,                                           kFunction),\nXE_EXPORT(xam,      0x00000519, XamSetDvrStorage,                                           kFunction),\nXE_EXPORT(xam,      0x0000051A, XamIptvGetServiceName,                                      kFunction),\nXE_EXPORT(xam,      0x0000051B, XamNuiHudGetEngagedEnrollmentIndex,                         kFunction),\nXE_EXPORT(xam,      0x0000051C, XamProfileSetCachedWindowsLiveEmail,                        kFunction),\nXE_EXPORT(xam,      0x0000051D, XamProfileGetCachedWindowsLiveEmail,                        kFunction),\nXE_EXPORT(xam,      0x0000051E, XamUserResetSubscriptionType,                               kFunction),\nXE_EXPORT(xam,      0x0000051F, XamLrcSetTitlePort,                                         kFunction),\nXE_EXPORT(xam,      0x00000520, XamLrcVerifyClientId,                                       kFunction),\nXE_EXPORT(xam,      0x00000521, XamLrcEncryptDecryptTitleMessage,                           kFunction),\nXE_EXPORT(xam,      0x00000522, XamFitnessGetSyncStatus,                                    kFunction),\nXE_EXPORT(xam,      0x00000523, XamFitnessInitializeForOneUser,                             kFunction),\nXE_EXPORT(xam,      0x00000524, XamFitnessGetSuggestedPrivacySettings,                      kFunction),\nXE_EXPORT(xam,      0x00000525, XampFitnessLetFireAndForgetsCatchUpInternal,                kFunction),\nXE_EXPORT(xam,      0x00000526, XamInputGetFailedConnectionOrBind,                          kFunction),\nXE_EXPORT(xam,      0x00000527, XuiSceneIsInTransition,                                     kFunction),\nXE_EXPORT(xam,      0x00000528, XamIsOnPrivateNetwork,                                      kFunction),\nXE_EXPORT(xam,      0x00000529, XamInputSetMinMaxAuthDelay,                                 kFunction),\nXE_EXPORT(xam,      0x0000052A, XamInputNonControllerGetRawEx,                              kFunction),\nXE_EXPORT(xam,      0x0000052B, XamInputNonControllerSetRawEx,                              kFunction),\nXE_EXPORT(xam,      0x0000052C, XamMarketplaceAcquireFreeContent,                           kFunction),\nXE_EXPORT(xam,      0x0000052D, XamGetClosedCaptioningState,                                kFunction),\nXE_EXPORT(xam,      0x0000052E, XamGetClosedCaptioningSettings,                             kFunction),\nXE_EXPORT(xam,      0x0000052F, XamSetClosedCaptioningState,                                kFunction),\nXE_EXPORT(xam,      0x00000530, XamLoaderGetLogonTitle,                                     kFunction),\nXE_EXPORT(xam,      0x00000531, XamBeginDemand,                                             kFunction),\nXE_EXPORT(xam,      0x00000532, XamGetErrorStringFromWebService,                            kFunction),\nXE_EXPORT(xam,      0x00000533, XamGetModernPresenceWorkspaceSize,                          kFunction),\nXE_EXPORT(xam,      0x00000534, XamGetModernPresence,                                       kFunction),\nXE_EXPORT(xam,      0x00000535, XamGetSingleModernPresence,                                 kFunction),\nXE_EXPORT(xam,      0x00000536, XamGetModernPresenceImageUrl,                               kFunction),\nXE_EXPORT(xam,      0x00000537, XGetSSLCertBypassEnabled,                                   kFunction),\nXE_EXPORT(xam,      0x00000538, XamIsNetworkCaptivePortal,                                  kFunction),\nXE_EXPORT(xam,      0x00000539, XamShowAndWaitForMessageBoxEx,                              kFunction),\nXE_EXPORT(xam,      0x0000053B, XamGetCurrencyFormat,                                       kFunction),\nXE_EXPORT(xam,      0x0000053C, XamFormatCurrency,                                          kFunction),\nXE_EXPORT(xam,      0x0000053D, XamReportTLSConnect,                                        kFunction),\nXE_EXPORT(xam,      0x0000053E, XamGetXSTSTokenExpiryPeriodMS,                              kFunction),\nXE_EXPORT(xam,      0x0000053F, XamGetUserBalance,                                          kFunction),\nXE_EXPORT(xam,      0x00000540, XamIsGuideDisabled,                                         kFunction),\nXE_EXPORT(xam,      0x00000541, XampCallXAccountTransitionStoredValuePointsToCurrency,      kFunction),\nXE_EXPORT(xam,      0x00000542, XampSetMockCallXAccountTransitionStoredValuePointsToCurrency, kFunction),\nXE_EXPORT(xam,      0x00000543, XamShowCsvTransitionUI,                                     kFunction),\nXE_EXPORT(xam,      0x00000544, XamAskUserForCSVDrainagePermission,                         kFunction),\nXE_EXPORT(xam,      0x00000545, XamIsCSVDrainageSupported,                                  kFunction),\nXE_EXPORT(xam,      0x0000056C, XamGetTLSConfig,                                            kFunction),\nXE_EXPORT(xam,      0x00000577, XamGetServiceEndpoint,                                      kFunction),\nXE_EXPORT(xam,      0x00000578, XamReminderGetItems,                                        kFunction),\nXE_EXPORT(xam,      0x00000579, XamReminderClearItems,                                      kFunction),\nXE_EXPORT(xam,      0x0000057A, XamReminderItemAdd,                                         kFunction),\nXE_EXPORT(xam,      0x0000057B, XamReminderItemRemove,                                      kFunction),\nXE_EXPORT(xam,      0x0000057C, XamReminderGetNextItem,                                     kFunction),\nXE_EXPORT(xam,      0x0000057D, XamReminderGetModifiedTime,                                 kFunction),\nXE_EXPORT(xam,      0x0000057E, XamReminderClearCache,                                      kFunction),\nXE_EXPORT(xam,      0x0000057F, XamLrcKeyboardGetInput,                                     kFunction),\nXE_EXPORT(xam,      0x00000580, XamLrcKeyboardGetRequiredBufferSize,                        kFunction),\nXE_EXPORT(xam,      0x00000581, XamLrcKeyboardRegister,                                     kFunction),\nXE_EXPORT(xam,      0x00000582, XamLrcKeyboardUnregister,                                   kFunction),\nXE_EXPORT(xam,      0x00000583, XamLrcKeyboardUpdateText,                                   kFunction),\nXE_EXPORT(xam,      0x00000584, XamValidateCountry,                                         kFunction),\nXE_EXPORT(xam,      0x00000585, XamGetOnlineCountryString,                                  kFunction),\nXE_EXPORT(xam,      0x00000586, XamGetCountryString,                                        kFunction),\nXE_EXPORT(xam,      0x00000587, XamGetLanguageString,                                       kFunction),\nXE_EXPORT(xam,      0x00000588, XamGetLanguageLocaleString,                                 kFunction),\nXE_EXPORT(xam,      0x00000589, XamGetOnlineLanguageAndCountryString,                       kFunction),\nXE_EXPORT(xam,      0x0000058A, XamGetLanguageLocaleFallbackString,                         kFunction),\nXE_EXPORT(xam,      0x0000058B, XamGetOnlineLanguageAndCountry,                             kFunction),\nXE_EXPORT(xam,      0x0000058C, XamGetLanguageTypeface,                                     kFunction),\nXE_EXPORT(xam,      0x0000058D, XamGetLanguageTypefacePatch,                                kFunction),\nXE_EXPORT(xam,      0x0000058E, XamGetLocaleString,                                         kFunction),\nXE_EXPORT(xam,      0x0000058F, XamGetLocaleFromOnlineCountry,                              kFunction),\nXE_EXPORT(xam,      0x00000590, XamOfflineTimerSetData,                                     kFunction),\nXE_EXPORT(xam,      0x00000591, XamOfflineTimerResume,                                      kFunction),\nXE_EXPORT(xam,      0x00000592, XamOfflineTimerSuspend,                                     kFunction),\nXE_EXPORT(xam,      0x00000593, XamOfflineTimerIsRunning,                                   kFunction),\nXE_EXPORT(xam,      0x00000594, XamOfflineTimerIsEnabled,                                   kFunction),\nXE_EXPORT(xam,      0x00000595, XamOfflineTimerGetTimeRemaining,                            kFunction),\nXE_EXPORT(xam,      0x00000596, XamOfflineTimerGetContractData,                             kFunction),\nXE_EXPORT(xam,      0x00000597, XamOfflineTimerInitialize,                                  kFunction),\nXE_EXPORT(xam,      0x00000598, XamOfflineTimerGetData,                                     kFunction),\nXE_EXPORT(xam,      0x00000599, XamPlayToRegister,                                          kFunction),\nXE_EXPORT(xam,      0x0000059A, XamPlayToReportPlaybackState,                               kFunction),\nXE_EXPORT(xam,      0x0000059B, XamPlayToUnregister,                                        kFunction),\nXE_EXPORT(xam,      0x0000059C, XamShowTFAUI,                                               kFunction),\nXE_EXPORT(xam,      0x0000059D, OnReconnect,                                                kFunction),\nXE_EXPORT(xam,      0x0000059E, XamGetOnlineCountryFeatures,                                kFunction),\nXE_EXPORT(xam,      0x0000059F, XamLogLocalizationEtx,                                      kFunction),\nXE_EXPORT(xam,      0x000005A0, XampXAuthIsLocalSocketAllowed,                              kFunction),\nXE_EXPORT(xam,      0x000005A1, XamPlayToGetRequest,                                        kFunction),\nXE_EXPORT(xam,      0x000005A2, XamPlayToCancelGetRequest,                                  kFunction),\nXE_EXPORT(xam,      0x000005A3, XamPlayToCompleteRequest,                                   kFunction),\nXE_EXPORT(xam,      0x000005A4, XamFitnessGetTitleSummaries,                                kFunction),\nXE_EXPORT(xam,      0x000005A5, XamFitnessGetTitleSummary,                                  kFunction),\nXE_EXPORT(xam,      0x000005A6, XamOfflineTimerShutdown,                                    kFunction),\nXE_EXPORT(xam,      0x000005A7, XamFitnessContainsFitnessData,                              kFunction),\nXE_EXPORT(xam,      0x000005A8, XamGetLanguageFromOnlineLanguage,                           kFunction),\nXE_EXPORT(xam,      0x000005A9, XamGetOnlineLanguageString,                                 kFunction),\nXE_EXPORT(xam,      0x000005AA, XamGetCountryFromOnlineCountry,                             kFunction),\nXE_EXPORT(xam,      0x000005D7, XamGetLocaleEx,                                             kFunction),\nXE_EXPORT(xam,      0x000005D8, XamOfflineTimerForceQuery,                                  kFunction),\nXE_EXPORT(xam,      0x000005D9, XamShowCreateProfileUIEx,                                   kFunction),\nXE_EXPORT(xam,      0x000005DA, XTLGetLanguageV2,                                           kFunction),\nXE_EXPORT(xam,      0x000005DB, XTLGetLocaleV1,                                             kFunction),\nXE_EXPORT(xam,      0x000005DC, XamAvatarInitialize,                                        kFunction),\nXE_EXPORT(xam,      0x000005DD, XamAvatarShutdown,                                          kFunction),\nXE_EXPORT(xam,      0x000005DE, XamAvatarGetManifestLocalUser,                              kFunction),\nXE_EXPORT(xam,      0x000005DF, XamAvatarGetManifestsByXuid,                                kFunction),\nXE_EXPORT(xam,      0x000005E0, XamAvatarGetAssetsResultSize,                               kFunction),\nXE_EXPORT(xam,      0x000005E1, XamAvatarGetAssets,                                         kFunction),\nXE_EXPORT(xam,      0x000005E2, XamAvatarGenerateMipMaps,                                   kFunction),\nXE_EXPORT(xam,      0x000005E3, XamAvatarSetCustomAsset,                                    kFunction),\nXE_EXPORT(xam,      0x000005E4, XamAvatarSetManifest,                                       kFunction),\nXE_EXPORT(xam,      0x000005E5, EnumerateMediaObjects,                                      kFunction),\nXE_EXPORT(xam,      0x000005E6, EnumerateMediaObjects_,                                     kFunction),\nXE_EXPORT(xam,      0x000005E7, XamAvatarLoadAnimation,                                     kFunction),\nXE_EXPORT(xam,      0x000005E8, XamAvatarBeginEnumAssets,                                   kFunction),\nXE_EXPORT(xam,      0x000005E9, XamAvatarEndEnumAssets,                                     kFunction),\nXE_EXPORT(xam,      0x000005EA, XamAvatarEnumAssets,                                        kFunction),\nXE_EXPORT(xam,      0x000005EB, XamAvatarGetMetadataRandom,                                 kFunction),\nXE_EXPORT(xam,      0x000005EC, EnumerateMediaObjects_0,                                    kFunction),\nXE_EXPORT(xam,      0x000005ED, EnumerateMediaObjects_1,                                    kFunction),\nXE_EXPORT(xam,      0x000005EE, XamAvatarGetMetadataSignedOutProfileCount,                  kFunction),\nXE_EXPORT(xam,      0x000005EF, XamAvatarGetMetadataSignedOutProfile,                       kFunction),\nXE_EXPORT(xam,      0x000005F0, EnumerateMediaObjects_2,                                    kFunction),\nXE_EXPORT(xam,      0x000005F1, XamAvatarManifestGetBodyType,                               kFunction),\nXE_EXPORT(xam,      0x000005F2, XamAvatarGetInstrumentation,                                kFunction),\nXE_EXPORT(xam,      0x000005F3, XamAvatarGetAssetIcon,                                      kFunction),\nXE_EXPORT(xam,      0x000005F4, XamAvatarWearNow,                                           kFunction),\nXE_EXPORT(xam,      0x000005F5, XamAvatarGetAssetBinary,                                    kFunction),\nXE_EXPORT(xam,      0x000005F6, XamAvatarReinstallAwardedAsset,                             kFunction),\nXE_EXPORT(xam,      0x000005F7, XamAvatarGetInstalledAssetPackageDescription,               kFunction),\nXE_EXPORT(xam,      0x000005F8, XamAvatarSetMocks,                                          kFunction),\nXE_EXPORT(xam,      0x000005F9, XamLrcKeyboardValidateTextChange,                           kFunction),\nXE_EXPORT(xam,      0x000005FA, XamLrcKeyboardApplyTextChange,                              kFunction),\nXE_EXPORT(xam,      0x000005FB, XamLrcLogSessionSummary,                                    kFunction),\nXE_EXPORT(xam,      0x000005FC, XamLrcLogError,                                             kFunction),\nXE_EXPORT(xam,      0x0000060E, XamContentMountInstalledGame,                               kFunction),\nXE_EXPORT(xam,      0x0000060F, XamContentIsGameInstalledToHDD,                             kFunction),\nXE_EXPORT(xam,      0x00000610, XamContentQueryLicenseInternal,                             kFunction),\nXE_EXPORT(xam,      0x00000611, XamContentGetDeviceVolumePath,                              kFunction),\nXE_EXPORT(xam,      0x00000612, XamContentDeviceCheckUpdates,                               kFunction),\nXE_EXPORT(xam,      0x00000613, XamContentGetHeaderInternal,                                kFunction),\nXE_EXPORT(xam,      0x00000614, XamNetworkStorageGetNetworkDevice,                          kFunction),\nXE_EXPORT(xam,      0x00000615, XamNetworkStorageDeviceHasCacheFile,                        kFunction),\nXE_EXPORT(xam,      0x00000616, XamNetworkStorageCreateCacheOnDevice,                       kFunction),\nXE_EXPORT(xam,      0x00000617, XamNetworkStorageDeleteCacheOnDevice,                       kFunction),\nXE_EXPORT(xam,      0x00000618, XamNetworkStorageGetStatus,                                 kFunction),\nXE_EXPORT(xam,      0x00000619, XamNetworkStorageIsSupportedContentType,                    kFunction),\nXE_EXPORT(xam,      0x0000061A, XamNetworkStorageSetTestMock,                               kFunction),\nXE_EXPORT(xam,      0x0000061B, XamNetworkStorageGetLastSyncTime,                           kFunction),\nXE_EXPORT(xam,      0x0000061C, XamShowNetworkStorageSyncUI,                                kFunction),\nXE_EXPORT(xam,      0x0000061D, XamUserIsLogonPreviewModeEnabled,                           kFunction),\nXE_EXPORT(xam,      0x0000061E, XamUserLockLogonPreviewMode,                                kFunction),\nXE_EXPORT(xam,      0x0000061F, XamUserUnlockLogonPreviewMode,                              kFunction),\nXE_EXPORT(xam,      0x00000620, XamNetworkStorageIsUserInSync,                              kFunction),\nXE_EXPORT(xam,      0x00000621, XamNetworkStorageSetUserInSync,                             kFunction),\nXE_EXPORT(xam,      0x00000622, XamNetworkStorageOnSigninChanged,                           kFunction),\nXE_EXPORT(xam,      0x00000623, XamNetworkStorageSignInTestMock,                            kFunction),\nXE_EXPORT(xam,      0x00000624, XamShowFofUI,                                               kFunction),\nXE_EXPORT(xam,      0x00000625, CompareFileTime,                                            kFunction),\nXE_EXPORT(xam,      0x00000626, SetFileTime,                                                kFunction),\nXE_EXPORT(xam,      0x00000627, XamNetworkStorageGetTitleProperties,                        kFunction),\nXE_EXPORT(xam,      0x00000628, XamNetworkStorageLockFile,                                  kFunction),\nXE_EXPORT(xam,      0x00000629, XamNetworkStorageUserHasPrivilege,                          kFunction),\nXE_EXPORT(xam,      0x0000062A, XamNetworkStorageIsTitleExempt,                             kFunction),\nXE_EXPORT(xam,      0x0000062B, XamContentExistsOnDeviceInternal,                           kFunction),\nXE_EXPORT(xam,      0x0000062C, XamNetworkStorageGetBackingDevice,                          kFunction),\nXE_EXPORT(xam,      0x0000062D, XamNetworkStorageIsEnabledInLiveHive,                       kFunction),\nXE_EXPORT(xam,      0x0000062E, XamNetworkStorageIsCheckingSyncStates,                      kFunction),\nXE_EXPORT(xam,      0x0000062F, XamNetworkStorageUserNeedsToSync,                           kFunction),\nXE_EXPORT(xam,      0x00000630, XamNetworkStorageGetUserNetworkSyncTime,                    kFunction),\nXE_EXPORT(xam,      0x00000631, XamNetworkStorageGetUserProperties,                         kFunction),\nXE_EXPORT(xam,      0x00000632, XamNetworkStorageAppLauncherLaunchIfRunning,                kFunction),\nXE_EXPORT(xam,      0x00000633, XamNetworkStorageSetTitleProperties,                        kFunction),\nXE_EXPORT(xam,      0x00000634, XamNetworkStorageGetUserLastError,                          kFunction),\nXE_EXPORT(xam,      0x00000635, XamNetworkStorageCheckOutTitle,                             kFunction),\nXE_EXPORT(xam,      0x00000636, XamNetworkStorageShouldHideFromTitle,                       kFunction),\nXE_EXPORT(xam,      0x00000637, XamNetworkStorageOnUserSyncChange,                          kFunction),\nXE_EXPORT(xam,      0x00000638, XamNetworkStorageHasUserEnabledStorage,                     kFunction),\nXE_EXPORT(xam,      0x00000639, XamContentGetLocalizedDeviceData,                           kFunction),\nXE_EXPORT(xam,      0x00000640, XamPackageManagerFindPackageContainingIndexedXEX,           kFunction),\nXE_EXPORT(xam,      0x00000641, XamPackageManagerReinitialize,                              kFunction),\nXE_EXPORT(xam,      0x00000642, XamPackageManagerGetAuthoritativeManifestVersion,           kFunction),\nXE_EXPORT(xam,      0x00000643, XamGetCurrentSystemOnlineManifestRevision,                  kFunction),\nXE_EXPORT(xam,      0x00000644, XamPackageManagerDeleteExtendedPartition,                   kFunction),\nXE_EXPORT(xam,      0x00000645, XamPackageManagerHasExtendedPartition,                      kFunction),\nXE_EXPORT(xam,      0x00000646, XamPackageManagerGetExperienceMode,                         kFunction),\nXE_EXPORT(xam,      0x00000647, XamPackageManagerGetFeatureRequiresUpdateStrings,           kFunction),\nXE_EXPORT(xam,      0x00000648, XamPackageManagerGetFileSize,                               kFunction),\nXE_EXPORT(xam,      0x00000649, XampDemandUpdateGetAttributes,                              kFunction),\nXE_EXPORT(xam,      0x0000064A, XampDemandUpdateGetExtendedAttributes,                      kFunction),\nXE_EXPORT(xam,      0x0000064B, XampDemandUpdateGetInstance,                                kFunction),\nXE_EXPORT(xam,      0x0000064C, XampDemandUpdateSetRefreshTestFlags,                        kFunction),\nXE_EXPORT(xam,      0x0000064D, XampDemandUpdateIsRefreshTestFlagSet,                       kFunction),\nXE_EXPORT(xam,      0x0000064E, XampDemandUpdateGetManifestLocalPath,                       kFunction),\nXE_EXPORT(xam,      0x0000064F, XampDemandUpdateRefreshManifest,                            kFunction),\nXE_EXPORT(xam,      0x00000650, XdfInitialize,                                              kFunction),\nXE_EXPORT(xam,      0x00000651, XdfShutdown,                                                kFunction),\nXE_EXPORT(xam,      0x00000652, XdfGetExpectedDownloadSize,                                 kFunction),\nXE_EXPORT(xam,      0x00000653, XdfGetItem,                                                 kFunction),\nXE_EXPORT(xam,      0x00000654, XdfCacheItem,                                               kFunction),\nXE_EXPORT(xam,      0x00000655, XdfLoadXexFromCache,                                        kFunction),\nXE_EXPORT(xam,      0x00000656, XdfLoadXex,                                                 kFunction),\nXE_EXPORT(xam,      0x00000657, XdfCancelRequest,                                           kFunction),\nXE_EXPORT(xam,      0x00000658, XdfResumeDelayedItem,                                       kFunction),\nXE_EXPORT(xam,      0x00000659, XdfLaunchNewImageFromCache,                                 kFunction),\nXE_EXPORT(xam,      0x0000065A, XampDemandUpdateRefreshManifestDuringLogon,                 kFunction),\nXE_EXPORT(xam,      0x0000065B, XampDemandUpdateCheckOnlineManifestChanged,                 kFunction),\nXE_EXPORT(xam,      0x0000065C, XampDemandUpdateRunCacheCleaner,                            kFunction),\nXE_EXPORT(xam,      0x00000685, XamUpdateGetTitleUpdateSizeThreshold,                       kFunction),\nXE_EXPORT(xam,      0x00000686, XamXStudioRequest,                                          kFunction),\nXE_EXPORT(xam,      0x00000687, XamNotifyDelayUIInternal,                                   kFunction),\nXE_EXPORT(xam,      0x000006A4, XamShowAvatarMiniCreatorUI,                                 kFunction),\nXE_EXPORT(xam,      0x000006A5, XamShowGoldUpgradeUI,                                       kFunction),\nXE_EXPORT(xam,      0x000006A6, XamResumeUpdaterUI,                                         kFunction),\nXE_EXPORT(xam,      0x000006A7, XamShowDirectAcquireUI,                                     kFunction),\nXE_EXPORT(xam,      0x000006A8, XamShowPaymentOptionsUI,                                    kFunction),\nXE_EXPORT(xam,      0x000006A9, XamShowMultiplayerUpgradeUI,                                kFunction),\nXE_EXPORT(xam,      0x00000708, XamGetLiveHiveValueA,                                       kFunction),\nXE_EXPORT(xam,      0x00000709, XamGetLiveHiveValueW,                                       kFunction),\nXE_EXPORT(xam,      0x0000070A, XamGetLiveHiveValueDuringLogonAttemptA,                     kFunction),\nXE_EXPORT(xam,      0x0000070B, XamSetUserPresetWindowsLiveCreds,                           kFunction),\nXE_EXPORT(xam,      0x0000070C, XamQueryLiveHiveA,                                          kFunction),\nXE_EXPORT(xam,      0x0000070D, XamQueryLiveHiveW,                                          kFunction),\nXE_EXPORT(xam,      0x0000070E, XamGetLiveHiveValueDuringLogonAttemptExA,                   kFunction),\nXE_EXPORT(xam,      0x0000070F, XamGetUserPresetWindowsLiveCreds,                           kFunction),\nXE_EXPORT(xam,      0x00000710, XamGetUserNeedTFA,                                          kFunction),\nXE_EXPORT(xam,      0x00000711, XamSetUserNeedTFA,                                          kFunction),\nXE_EXPORT(xam,      0x00000712, XamGetUserInMemoryWindowsLiveCreds,                         kFunction),\nXE_EXPORT(xam,      0x0000076C, XamDownloadMarketplaceStoresList,                           kFunction),\nXE_EXPORT(xam,      0x0000076D, XamGetStoreFront,                                           kFunction),\nXE_EXPORT(xam,      0x0000076E, XamSetStagingMode,                                          kFunction),\nXE_EXPORT(xam,      0x0000076F, XamGetStagingMode,                                          kFunction),\nXE_EXPORT(xam,      0x00000770, XamAppGetSessionId,                                         kFunction),\nXE_EXPORT(xam,      0x00000771, XamAccountRecoveryRecoverAllProfileData,                    kFunction),\nXE_EXPORT(xam,      0x00000772, XamAccountRecoveryGetProgress,                              kFunction),\nXE_EXPORT(xam,      0x000007D0, XamDoesOmniNeedConfiguration,                               kFunction),\nXE_EXPORT(xam,      0x000007D1, XamFirstRunExperienceShouldRun,                             kFunction),\nXE_EXPORT(xam,      0x000007D2, GetProcessHeap,                                             kFunction),\nXE_EXPORT(xam,      0x000007D3, UnhandledExceptionFilter,                                   kFunction),\nXE_EXPORT(xam,      0x000007D4, SetUnhandledExceptionFilter,                                kFunction),\nXE_EXPORT(xam,      0x000007D5, XamIsOptionalMediaUpdateInstalled,                          kFunction),\nXE_EXPORT(xam,      0x000007D6, XamShowOptionalMediaUpdateRequiredUI,                       kFunction),\nXE_EXPORT(xam,      0x000007D7, XamShowOptionalMediaUpdateRequiredUIEx,                     kFunction),\nXE_EXPORT(xam,      0x000007D8, XamShowFirstRunWelcomeUI,                                   kFunction),\nXE_EXPORT(xam,      0x000007D9, XamTaskCreateQueueEx,                                       kFunction),\nXE_EXPORT(xam,      0x000007DA, XamSetDashBackstackData,                                    kFunction),\nXE_EXPORT(xam,      0x000007DB, XamLaunchAvatarEditor,                                      kFunction),\nXE_EXPORT(xam,      0x000007DC, XamGetDashBackstackData,                                    kFunction),\nXE_EXPORT(xam,      0x000007DD, XamGetDashBackstackNodesCount,                              kFunction),\nXE_EXPORT(xam,      0x000007DE, XamSetLastActiveUserData,                                   kFunction),\nXE_EXPORT(xam,      0x000007DF, XamGetLastActiveUserData,                                   kFunction),\nXE_EXPORT(xam,      0x000007E0, XamSetActiveDashAppInfo,                                    kFunction),\nXE_EXPORT(xam,      0x000007E1, XamGetActiveDashAppInfo,                                    kFunction),\nXE_EXPORT(xam,      0x000007E2, XamLoaderRegisterLaunchRequestCallback,                     kFunction),\nXE_EXPORT(xam,      0x000007E3, XamLoadExtraAVCodecs2,                                      kFunction),\nXE_EXPORT(xam,      0x000007E4, XamUnloadExtraAVCodecs2,                                    kFunction),\nXE_EXPORT(xam,      0x00000802, XamUserCreateAvatarAssetEnumerator,                         kFunction),\nXE_EXPORT(xam,      0x00000803, XamInitializeGameTileCache,                                 kFunction),\nXE_EXPORT(xam,      0x00000804, XamDestroyGameTileCache,                                    kFunction),\nXE_EXPORT(xam,      0x00000805, XamReadGameTileImage,                                       kFunction),\nXE_EXPORT(xam,      0x00000806, XamShouldThrottleAccountInfoCall,                           kFunction),\nXE_EXPORT(xam,      0x00000807, XuiClassDerivesFrom,                                        kFunction),\nXE_EXPORT(xam,      0x00000808, XuiFreeVisuals,                                             kFunction),\nXE_EXPORT(xam,      0x00000809, XuiGetBaseClass,                                            kFunction),\nXE_EXPORT(xam,      0x0000080A, XuiLoadVisualFromBinary,                                    kFunction),\nXE_EXPORT(xam,      0x0000080B, XuiResourceGetBuffer,                                       kFunction),\nXE_EXPORT(xam,      0x0000080C, XuiResourceGetTotalSize,                                    kFunction),\nXE_EXPORT(xam,      0x0000080D, XuiElementGetUserData,                                      kFunction),\nXE_EXPORT(xam,      0x0000080E, XuiElementSetUserData,                                      kFunction),\nXE_EXPORT(xam,      0x0000080F, XuiTabSceneGetCount,                                        kFunction),\nXE_EXPORT(xam,      0x00000810, XuiSliderGetStep,                                           kFunction),\nXE_EXPORT(xam,      0x00000811, XuiSliderSetStep,                                           kFunction),\nXE_EXPORT(xam,      0x00000812, XuiProgressBarGetRange,                                     kFunction),\nXE_EXPORT(xam,      0x00000813, XuiElementSetHittable,                                      kFunction),\nXE_EXPORT(xam,      0x00000814, XuiElementPlayNamedFrames,                                  kFunction),\nXE_EXPORT(xam,      0x00000815, XuiElementGetPivot,                                         kFunction),\nXE_EXPORT(xam,      0x00000816, XuiElementGetPrev,                                          kFunction),\nXE_EXPORT(xam,      0x00000817, XuiElementGetScale,                                         kFunction),\nXE_EXPORT(xam,      0x00000818, XuiElementSetPivot,                                         kFunction),\nXE_EXPORT(xam,      0x00000819, XuiElementSetRotation,                                      kFunction),\nXE_EXPORT(xam,      0x0000081A, XuiElementSetScale,                                         kFunction),\nXE_EXPORT(xam,      0x0000081B, XuiControlWantsUnfocusedInput,                              kFunction),\nXE_EXPORT(xam,      0x0000081C, XuiResourceOpenNoLoc,                                       kFunction),\nXE_EXPORT(xam,      0x0000081D, XuiResourceReleasePackage,                                  kFunction),\nXE_EXPORT(xam,      0x0000081E, XuiResourceGetPackageEntryInfo,                             kFunction),\nXE_EXPORT(xam,      0x0000081F, XuiResourceGetPackageEntryCount,                            kFunction),\nXE_EXPORT(xam,      0x00000820, XuiResourceOpenPackage,                                     kFunction),\nXE_EXPORT(xam,      0x00000821, XamCodeCoverageFileOpen,                                    kFunction),\nXE_EXPORT(xam,      0x00000822, XamCodeCoverageFileClose,                                   kFunction),\nXE_EXPORT(xam,      0x00000823, XamCodeCoverageFileLseek,                                   kFunction),\nXE_EXPORT(xam,      0x00000824, XamCodeCoverageFileRead,                                    kFunction),\nXE_EXPORT(xam,      0x00000825, XamCodeCoverageFileWrite,                                   kFunction),\nXE_EXPORT(xam,      0x00000826, Refresh_1,                                                  kFunction),\nXE_EXPORT(xam,      0x00000827, XampHeapGetInfo,                                            kFunction),\nXE_EXPORT(xam,      0x00000828, XampHeapGetCount,                                           kFunction),\nXE_EXPORT(xam,      0x00000829, XamShowPamUI,                                               kFunction),\nXE_EXPORT(xam,      0x0000082A, XuiElementLayoutTree,                                       kFunction),\nXE_EXPORT(xam,      0x0000082B, XamRegisterScreenSaverCallback,                             kFunction),\nXE_EXPORT(xam,      0x0000082C, XUIElementPropVal_SetInt,                                   kFunction),\nXE_EXPORT(xam,      0x0000082D, XUIElementPropVal_SetFloat,                                 kFunction),\nXE_EXPORT(xam,      0x0000082E, XuiObjectGetPropertyDef,                                    kFunction),\nXE_EXPORT(xam,      0x0000082F, XuiRenderGetDevice,                                         kFunction),\nXE_EXPORT(xam,      0x00000830, XuiRenderRestoreState,                                      kFunction),\nXE_EXPORT(xam,      0x00000831, XuiElementGetFullXForm,                                     kFunction),\nXE_EXPORT(xam,      0x00000832, XuiRenderGetViewTransform,                                  kFunction),\nXE_EXPORT(xam,      0x00000833, XuiRenderGetColorSpace,                                     kFunction),\nXE_EXPORT(xam,      0x00000834, XamPngEncode,                                               kFunction),\nXE_EXPORT(xam,      0x00000835, XamPngDecode,                                               kFunction),\nXE_EXPORT(xam,      0x00000836, XamPngEncodeEx,                                             kFunction),\nXE_EXPORT(xam,      0x00000837, XuiTextElementMeasureText,                                  kFunction),\nXE_EXPORT(xam,      0x00000838, XamLoaderShouldConfirmReboot,                               kFunction),\nXE_EXPORT(xam,      0x00000839, XamLoaderRebootToDash,                                      kFunction),\nXE_EXPORT(xam,      0x0000083A, XamNuiHudGetEngagedTrackingID,                              kFunction),\nXE_EXPORT(xam,      0x0000083B, XamLoaderLaunchTitleForReason,                              kFunction),\nXE_EXPORT(xam,      0x0000083C, XamNuiHudSetEngagedTrackingID,                              kFunction),\nXE_EXPORT(xam,      0x0000083D, XuiBrushGetTexture,                                         kFunction),\nXE_EXPORT(xam,      0x0000083E, XamSetupTexture,                                            kFunction),\nXE_EXPORT(xam,      0x0000083F, XuiElementGetDescendantById,                                kFunction),\nXE_EXPORT(xam,      0x00000840, XamLoaderIsKinectUIPreferredForLogonTitle,                  kFunction),\nXE_EXPORT(xam,      0x00000841, XamSetupCameraPreviewStuff,                                 kFunction),\nXE_EXPORT(xam,      0x00000842, XamReleaseCameraPreviewStuff,                               kFunction),\nXE_EXPORT(xam,      0x00000843, XamRenderCameraPreviewStuff,                                kFunction),\nXE_EXPORT(xam,      0x00000848, XamAccountRecoveryGetSetTitleSyncTime,                      kFunction),\nXE_EXPORT(xam,      0x00000849, XamReadBiometricData,                                       kFunction),\nXE_EXPORT(xam,      0x0000084A, XamWriteBiometricData,                                      kFunction),\nXE_EXPORT(xam,      0x0000084B, XamD3DResourceDescriptorCreate,                             kFunction),\nXE_EXPORT(xam,      0x0000084C, XamD3DResourceDescriptorAddRef,                             kFunction),\nXE_EXPORT(xam,      0x0000084D, XamD3DResourceDescriptorRelease,                            kFunction),\nXE_EXPORT(xam,      0x0000084E, XamD3DResourceAddRef,                                       kFunction),\nXE_EXPORT(xam,      0x0000084F, XamD3DResourceSet,                                          kFunction),\nXE_EXPORT(xam,      0x00000850, XamD3DResourceIsBusy,                                       kFunction),\nXE_EXPORT(xam,      0x00000851, XamD3DResourceRelease,                                      kFunction),\nXE_EXPORT(xam,      0x00000852, ControlPackGetCursorPosition,                               kFunction),\nXE_EXPORT(xam,      0x00000853, ControlPackShouldShowCursor,                                kFunction),\nXE_EXPORT(xam,      0x00000858, XamFlushAgraTemperatureReport,                              kFunction),\nXE_EXPORT(xam,      0x00000859, XamNatalDeviceAudioCalibrate,                               kFunction),\nXE_EXPORT(xam,      0x0000085A, XamNuiIdentityGetEnrollmentInfo,                            kFunction),\nXE_EXPORT(xam,      0x0000085B, XamNuiIdentityUnenroll,                                     kFunction),\nXE_EXPORT(xam,      0x0000085C, XamNuiIdentityGetColorTexture,                              kFunction),\nXE_EXPORT(xam,      0x0000085D, XamReportKinectSettingsChangedEvent,                        kFunction),\nXE_EXPORT(xam,      0x0000085E, XamNuiEnableChatMic,                                        kFunction),\nXE_EXPORT(xam,      0x0000085F, XamNuiIsChatMicEnabled,                                     kFunction),\nXE_EXPORT(xam,      0x00000860, XamNuiGetDepthCalibration,                                  kFunction),\nXE_EXPORT(xam,      0x00000861, XamNuiStoreDepthCalibration,                                kFunction),\nXE_EXPORT(xam,      0x00000862, XamUserNuiIsBiometricEnabled,                               kFunction),\nXE_EXPORT(xam,      0x00000863, XamUserNuiEnableBiometric,                                  kFunction),\nXE_EXPORT(xam,      0x00000864, XamNuiCameraSetFlags,                                       kFunction),\nXE_EXPORT(xam,      0x00000865, XamNuiCameraRememberFloor,                                  kFunction),\nXE_EXPORT(xam,      0x00000866, XamUserNuiGetUserIndexForBind,                              kFunction),\nXE_EXPORT(xam,      0x00000867, XamUserNuiGetUserIndexForSignin,                            kFunction),\nXE_EXPORT(xam,      0x00000868, XamUserNuiBind,                                             kFunction),\nXE_EXPORT(xam,      0x00000869, XamUserNuiGetUserIndex,                                     kFunction),\nXE_EXPORT(xam,      0x0000086A, XamUserNuiGetEnrollmentIndex,                               kFunction),\nXE_EXPORT(xam,      0x0000086B, XamUserNuiUnbind,                                           kFunction),\nXE_EXPORT(xam,      0x0000086C, XamNuiIdentityGetQualityFlagsMessage,                       kFunction),\nXE_EXPORT(xam,      0x0000086D, XamNuiCameraTiltSetCallback,                                kFunction),\nXE_EXPORT(xam,      0x0000086E, XamNuiHudIsEnabled,                                         kFunction),\nXE_EXPORT(xam,      0x0000086F, XamNuiCameraGetTiltControllerType,                          kFunction),\nXE_EXPORT(xam,      0x00000870, XamNuiCameraTiltGetStatus,                                  kFunction),\nXE_EXPORT(xam,      0x00000871, XamNuiIdentityGetQualityFlags,                              kFunction),\nXE_EXPORT(xam,      0x00000872, XamNuiIdentityEnrollForSignIn,                              kFunction),\nXE_EXPORT(xam,      0x00000873, XamNuiIdentityGetSessionId,                                 kFunction),\nXE_EXPORT(xam,      0x00000874, XamNuiIdentityIdentifyWithBiometric,                        kFunction),\nXE_EXPORT(xam,      0x00000875, ControlPackGetHandleManager,                                kFunction),\nXE_EXPORT(xam,      0x00000876, XamEnableNuiAutomation,                                     kFunction),\nXE_EXPORT(xam,      0x00000877, XamNuiGetSystemGestureControl,                              kFunction),\nXE_EXPORT(xam,      0x00000878, XamGetPasscodeKeyFromVirtualKey,                            kFunction),\nXE_EXPORT(xam,      0x00000879, XamEnableNatalPlayback,                                     kFunction),\nXE_EXPORT(xam,      0x0000087A, XamIsNuiAutomationEnabled,                                  kFunction),\nXE_EXPORT(xam,      0x0000087B, XamIsNatalPlaybackEnabled,                                  kFunction),\nXE_EXPORT(xam,      0x0000087C, XamNuiHudInterpretFrame,                                    kFunction),\nXE_EXPORT(xam,      0x0000087D, XamNuiHudEnableInputFilter,                                 kFunction),\nXE_EXPORT(xam,      0x0000087E, ControlpackNuiCursorSetTrackingId,                          kFunction),\nXE_EXPORT(xam,      0x0000087F, XamNuiHudGetInitializeFlags,                                kFunction),\nXE_EXPORT(xam,      0x00000880, XamNuiCameraElevationSetAngle,                              kFunction),\nXE_EXPORT(xam,      0x00000881, XamNuiCameraElevationGetAngle,                              kFunction),\nXE_EXPORT(xam,      0x00000882, XamNuiCameraElevationAutoTilt,                              kFunction),\nXE_EXPORT(xam,      0x00000883, XamNuiCameraElevationStopMovement,                          kFunction),\nXE_EXPORT(xam,      0x00000884, XamNuiCameraElevationSetCallback,                           kFunction),\nXE_EXPORT(xam,      0x00000885, XamNuiGetDeviceStatus,                                      kFunction),\nXE_EXPORT(xam,      0x00000886, XamNuiNatalCameraUpdateStarting,                            kFunction),\nXE_EXPORT(xam,      0x00000887, XamNuiNatalCameraUpdateComplete,                            kFunction),\nXE_EXPORT(xam,      0x00000888, XamNuiHudGetVersions,                                       kFunction),\nXE_EXPORT(xam,      0x00000889, XamGetHUDElementByPath,                                     kFunction),\nXE_EXPORT(xam,      0x0000088A, XamGetHUDElementByAutoId,                                   kFunction),\nXE_EXPORT(xam,      0x0000088B, XuiElementGetScreenPositionCenter,                          kFunction),\nXE_EXPORT(xam,      0x0000088C, XamNuiCameraElevationReverseAutoTilt,                       kFunction),\nXE_EXPORT(xam,      0x0000088D, ControlPackSimpleCursorGetRayFromScreenPosition,            kFunction),\nXE_EXPORT(xam,      0x0000088E, ControlPackSideNavControlGetNuiHandle,                      kFunction),\nXE_EXPORT(xam,      0x0000088F, XamFindHUDElementByXuiId,                                   kFunction),\nXE_EXPORT(xam,      0x00000890, XamNuiIsDeviceReady,                                        kFunction),\nXE_EXPORT(xam,      0x00000891, XamNuiSetForceDeviceOff,                                    kFunction),\nXE_EXPORT(xam,      0x00000892, XamNuiPlayerEngagementUpdate,                               kFunction),\nXE_EXPORT(xam,      0x00000893, XamNuiSkeletonGetBestSkeletonIndex,                         kFunction),\nXE_EXPORT(xam,      0x00000894, XamNuiSkeletonScoreUpdate,                                  kFunction),\nXE_EXPORT(xam,      0x00000895, XamNuiCameraTiltReportStatus,                               kFunction),\nXE_EXPORT(xam,      0x00000896, XamNuiCameraAdjustTilt,                                     kFunction),\nXE_EXPORT(xam,      0x00000897, XamNuiIdentityAbort,                                        kFunction),\nXE_EXPORT(xam,      0x00000898, D3DDevice_CreateVertexShader,                               kFunction),\nXE_EXPORT(xam,      0x00000899, D3DDevice_CreatePixelShader,                                kFunction),\nXE_EXPORT(xam,      0x0000089A, D3DDevice_CreateTexture,                                    kFunction),\nXE_EXPORT(xam,      0x0000089B, D3DDevice_CreateVertexBuffer,                               kFunction),\nXE_EXPORT(xam,      0x0000089C, D3DDevice_CreateIndexBuffer,                                kFunction),\nXE_EXPORT(xam,      0x0000089D, D3DDevice_CreateVertexDeclaration,                          kFunction),\nXE_EXPORT(xam,      0x0000089E, D3DVertexBuffer_Unlock,                                     kFunction),\nXE_EXPORT(xam,      0x0000089F, D3DVertexBuffer_Lock,                                       kFunction),\nXE_EXPORT(xam,      0x000008A0, D3DIndexBuffer_Unlock,                                      kFunction),\nXE_EXPORT(xam,      0x000008A1, D3DIndexBuffer_Lock,                                        kFunction),\nXE_EXPORT(xam,      0x000008A2, D3DTexture_UnlockRect,                                      kFunction),\nXE_EXPORT(xam,      0x000008A3, D3DTexture_LockRect,                                        kFunction),\nXE_EXPORT(xam,      0x000008A4, D3DDevice_Clear,                                            kFunction),\nXE_EXPORT(xam,      0x000008A5, D3DDevice_SetViewport,                                      kFunction),\nXE_EXPORT(xam,      0x000008A6, D3DDevice_GetViewport,                                      kFunction),\nXE_EXPORT(xam,      0x000008A7, D3DVertexShader_Release,                                    kFunction),\nXE_EXPORT(xam,      0x000008A8, D3DPixelShader_Release,                                     kFunction),\nXE_EXPORT(xam,      0x000008A9, D3DVertexDeclaration_Release,                               kFunction),\nXE_EXPORT(xam,      0x000008AA, D3DResource_Release,                                        kFunction),\nXE_EXPORT(xam,      0x000008AB, D3DDevice_Release,                                          kFunction),\nXE_EXPORT(xam,      0x000008AC, D3DDevice_SetVertexShader,                                  kFunction),\nXE_EXPORT(xam,      0x000008AD, D3DDevice_SetPixelShader,                                   kFunction),\nXE_EXPORT(xam,      0x000008AE, D3DDevice_SetTexture,                                       kFunction),\nXE_EXPORT(xam,      0x000008AF, D3DDevice_SetVertexDeclaration,                             kFunction),\nXE_EXPORT(xam,      0x000008B0, D3DDevice_SetIndices,                                       kFunction),\nXE_EXPORT(xam,      0x000008B1, D3DDevice_SetStreamSource,                                  kFunction),\nXE_EXPORT(xam,      0x000008B2, D3DDevice_DrawVertices,                                     kFunction),\nXE_EXPORT(xam,      0x000008B3, D3DDevice_DrawVerticesUP,                                   kFunction),\nXE_EXPORT(xam,      0x000008B4, D3DDevice_DrawIndexedVertices,                              kFunction),\nXE_EXPORT(xam,      0x000008B5, D3DDevice_DrawIndexedVerticesUP,                            kFunction),\nXE_EXPORT(xam,      0x000008B6, D3DDevice_SetVertexShaderConstantF_ParameterCheck,          kFunction),\nXE_EXPORT(xam,      0x000008B7, D3DDevice_SetPixelShaderConstantF_ParameterCheck,           kFunction),\nXE_EXPORT(xam,      0x000008B8, D3DDevice_SetSamplerState_ParameterCheck,                   kFunction),\nXE_EXPORT(xam,      0x000008B9, D3DDevice_SetRenderState_ParameterCheck,                    kFunction),\nXE_EXPORT(xam,      0x000008BA, D3DDevice_GetRenderState_ParameterCheck,                    kFunction),\nXE_EXPORT(xam,      0x000008BB, D3DDevice_SetVertexShaderConstantFN,                        kFunction),\nXE_EXPORT(xam,      0x000008BC, D3DDevice_SetPixelShaderConstantFN,                         kFunction),\nXE_EXPORT(xam,      0x000008BD, D3DDevice_GetRenderState_ZEnable,                           kFunction),\nXE_EXPORT(xam,      0x000008BE, D3DDevice_GetRenderState_CullMode,                          kFunction),\nXE_EXPORT(xam,      0x000008BF, D3DDevice_GetRenderState_AlphaBlendEnable,                  kFunction),\nXE_EXPORT(xam,      0x000008C0, D3DDevice_GetRenderState_SrcBlendAlpha,                     kFunction),\nXE_EXPORT(xam,      0x000008C1, D3DDevice_GetRenderState_DestBlendAlpha,                    kFunction),\nXE_EXPORT(xam,      0x000008C2, D3DDevice_GetRenderState_BlendOp,                           kFunction),\nXE_EXPORT(xam,      0x000008C3, D3DDevice_GetRenderState_ViewportEnable,                    kFunction),\nXE_EXPORT(xam,      0x000008C4, D3DDevice_SetRenderState_ZEnable,                           kFunction),\nXE_EXPORT(xam,      0x000008C5, D3DDevice_SetRenderState_CullMode,                          kFunction),\nXE_EXPORT(xam,      0x000008C6, D3DDevice_SetRenderState_AlphaBlendEnable,                  kFunction),\nXE_EXPORT(xam,      0x000008C7, D3DDevice_SetRenderState_SrcBlendAlpha,                     kFunction),\nXE_EXPORT(xam,      0x000008C8, D3DDevice_SetRenderState_DestBlendAlpha,                    kFunction),\nXE_EXPORT(xam,      0x000008C9, D3DDevice_SetRenderState_BlendOp,                           kFunction),\nXE_EXPORT(xam,      0x000008CA, D3DDevice_SetRenderState_ViewportEnable,                    kFunction),\nXE_EXPORT(xam,      0x000008CB, D3DDevice_SetSamplerState_MagFilter,                        kFunction),\nXE_EXPORT(xam,      0x000008CC, D3DDevice_SetSamplerState_MinFilter,                        kFunction),\nXE_EXPORT(xam,      0x000008CD, D3DDevice_SetSamplerState_AddressU,                         kFunction),\nXE_EXPORT(xam,      0x000008CE, D3DDevice_SetSamplerState_AddressV,                         kFunction),\nXE_EXPORT(xam,      0x000008CF, XGSetTextureHeader,                                         kFunction),\nXE_EXPORT(xam,      0x000008D0, XGGetTextureDesc,                                           kFunction),\nXE_EXPORT(xam,      0x000008D1, XGOffsetResourceAddress,                                    kFunction),\nXE_EXPORT(xam,      0x000008D2, D3DResource_AddRef,                                         kFunction),\nXE_EXPORT(xam,      0x000008D3, D3DVertexShader_AddRef,                                     kFunction),\nXE_EXPORT(xam,      0x000008D4, D3DPixelShader_AddRef,                                      kFunction),\nXE_EXPORT(xam,      0x000008D5, D3DVertexDeclaration_AddRef,                                kFunction),\nXE_EXPORT(xam,      0x000008D6, XGSetTextureHeaderEx,                                       kFunction),\nXE_EXPORT(xam,      0x000008D7, D3DDevice_GetRenderTarget,                                  kFunction),\nXE_EXPORT(xam,      0x000008D8, D3DDevice_SetRenderTarget,                                  kFunction),\nXE_EXPORT(xam,      0x000008D9, D3DDevice_GetDepthStencilSurface,                           kFunction),\nXE_EXPORT(xam,      0x000008DA, D3DDevice_SetDepthStencilSurface,                           kFunction),\nXE_EXPORT(xam,      0x000008DB, D3DDevice_Resolve,                                          kFunction),\nXE_EXPORT(xam,      0x000008DC, D3DDevice_SetPixelShaderConstantB,                          kFunction),\nXE_EXPORT(xam,      0x000008DD, XamNuiGetDeviceSerialNumber,                                kFunction),\nXE_EXPORT(xam,      0x000008DE, XamNuiGetLoadedDepthCalibration,                            kFunction),\nXE_EXPORT(xam,      0x000008DF, XamNuiGetTrueColorInfo,                                     kFunction),\nXE_EXPORT(xam,      0x000008E0, XamNuiGetCameraIntrinsics,                                  kFunction),\nXE_EXPORT(xam,      0x000008E1, XamNuiGetFanRate,                                           kFunction),\nXE_EXPORT(xam,      0x000008E2, XamNuiGetSupportString,                                     kFunction),\nXE_EXPORT(xam,      0x000008E3, XamKinectGetHardwareType,                                   kFunction),\nXE_EXPORT(xam,      0x000008FC, XamXtwManagerGetVariableCount,                              kFunction),\nXE_EXPORT(xam,      0x000008FD, XamXtwManagerGetId,                                         kFunction),\nXE_EXPORT(xam,      0x000008FE, XamXtwManagerGetValue,                                      kFunction),\nXE_EXPORT(xam,      0x000008FF, XamXtwManagerSetValue,                                      kFunction),\nXE_EXPORT(xam,      0x00000900, XamXtwManagerIncrement,                                     kFunction),\nXE_EXPORT(xam,      0x00000901, XamXtwManagerDecrement,                                     kFunction),\nXE_EXPORT(xam,      0x00000902, XamXtwManagerResetValue,                                    kFunction),\nXE_EXPORT(xam,      0x00000903, XamXtwManagerResetAll,                                      kFunction),\nXE_EXPORT(xam,      0x00000904, XamXtwManagerGetDataFilePath,                               kFunction),\nXE_EXPORT(xam,      0x00000905, XamXtwManagerDeleteDataFile,                                kFunction),\nXE_EXPORT(xam,      0x00000906, XamXtwManagerSave,                                          kFunction),\nXE_EXPORT(xam,      0x00000907, XamXtwManagerLoad,                                          kFunction),\nXE_EXPORT(xam,      0x00000908, XamGetXTweakManager,                                        kFunction),\nXE_EXPORT(xam,      0x000009BB, XamMediaVerificationCreate,                                 kFunction),\nXE_EXPORT(xam,      0x000009BC, XamMediaVerificationClose,                                  kFunction),\nXE_EXPORT(xam,      0x000009BD, XamMediaVerificationVerify,                                 kFunction),\nXE_EXPORT(xam,      0x000009BE, XamMediaVerificationFailedBlocks,                           kFunction),\nXE_EXPORT(xam,      0x000009BF, XamMediaVerificationInject,                                 kFunction),\nXE_EXPORT(xam,      0x000009C0, XamShowBadDiscErrorUI,                                      kFunction),\nXE_EXPORT(xam,      0x000009C4, XamBackgroundDownloadSetMode,                               kFunction),\nXE_EXPORT(xam,      0x000009C5, XamBackgroundDownloadIsEnabled,                             kFunction),\nXE_EXPORT(xam,      0x000009C6, XamBackgroundDownloadGetActiveItem,                         kFunction),\nXE_EXPORT(xam,      0x000009C7, XamBackgroundDownloadGetItems,                              kFunction),\nXE_EXPORT(xam,      0x000009C8, XamBackgroundDownloadClearItems,                            kFunction),\nXE_EXPORT(xam,      0x000009C9, XamBackgroundDownloadItemAdd,                               kFunction),\nXE_EXPORT(xam,      0x000009CA, XamBackgroundDownloadItemRemove,                            kFunction),\nXE_EXPORT(xam,      0x000009CB, XamBackgroundDownloadItemMakeFirst,                         kFunction),\nXE_EXPORT(xam,      0x000009CC, XamBackgroundDownloadSetForegroundPriority,                 kFunction),\nXE_EXPORT(xam,      0x000009CD, XamBackgroundDownloadGetForegroundPriority,                 kFunction),\nXE_EXPORT(xam,      0x000009CE, XamBackgroundDownloadItemToContentData,                     kFunction),\nXE_EXPORT(xam,      0x000009CF, XamBackgroundDownloadItemGetStatus,                         kFunction),\nXE_EXPORT(xam,      0x000009D0, XamBackgroundDownloadHistoryGetItem,                        kFunction),\nXE_EXPORT(xam,      0x000009D1, XamBackgroundDownloadItemGetHistoryStatus,                  kFunction),\nXE_EXPORT(xam,      0x000009D2, XamBackgroundDownloadItemSetHistoryStatus,                  kFunction),\nXE_EXPORT(xam,      0x000009D3, XamBackgroundDownloadItemGetStatusAsync,                    kFunction),\nXE_EXPORT(xam,      0x000009D4, XamBackgroundDownloadItemGetStatusEx,                       kFunction),\nXE_EXPORT(xam,      0x000009D5, XamBackgroundDownloadItemGetHistoryStatusEx,                kFunction),\nXE_EXPORT(xam,      0x000009D6, XamBackgroundDownloadBindItems,                             kFunction),\nXE_EXPORT(xam,      0x000009D7, XamBackgroundDownloadSetPollingActive,                      kFunction),\nXE_EXPORT(xam,      0x000009D8, XamBackgroundDownloadGetPollingActive,                      kFunction),\nXE_EXPORT(xam,      0x000009D9, XamBackgroundDownloadGetMode,                               kFunction),\nXE_EXPORT(xam,      0x000009DA, XamBackgroundDownloadGetUnexpectedChangeCount,              kFunction),\nXE_EXPORT(xam,      0x000009DB, XamBackgroundDownloadIsItemForThisConsole,                  kFunction),\nXE_EXPORT(xam,      0x000009DC, XamBackgroundDownloadSelectDevice,                          kFunction),\nXE_EXPORT(xam,      0x000009DD, XamBackgroundDownloadItemModify,                            kFunction),\nXE_EXPORT(xam,      0x000009DE, XamBackgroundDownloadCacheLegacyMappingInfo,                kFunction),\nXE_EXPORT(xam,      0x000009DF, XamBackgroundDownloadGetLegacyMappingInfo,                  kFunction),\nXE_EXPORT(xam,      0x000009E0, XamBackgroundDownloadGetLegacyId,                           kFunction),\nXE_EXPORT(xam,      0x000009E1, XamBackgroundDownloadDoFail,                                kFunction),\nXE_EXPORT(xam,      0x000009E2, XamDownloadSingleItem,                                      kFunction),\nXE_EXPORT(xam,      0x000009E3, XamDownloadInSingleItemMode,                                kFunction),\nXE_EXPORT(xam,      0x00000A28, XamSwapDisc,                                                kFunction),\nXE_EXPORT(xam,      0x00000A29, XamSwapDiscPatchAddress,                                    kVariable),\nXE_EXPORT(xam,      0x00000A2A, XamSwapCancel,                                              kFunction),\nXE_EXPORT(xam,      0x00000A2B, XamContentSetAttributes,                                    kFunction),\nXE_EXPORT(xam,      0x00000A32, XamRamDriveCreate,                                          kFunction),\nXE_EXPORT(xam,      0x00000A33, XamRamDriveDestroy,                                         kFunction),\nXE_EXPORT(xam,      0x00000A5A, XamPlayTimerGetData,                                        kFunction),\nXE_EXPORT(xam,      0x00000A5B, XamPlayTimerSetData,                                        kFunction),\nXE_EXPORT(xam,      0x00000A5C, XamPlayTimerResume,                                         kFunction),\nXE_EXPORT(xam,      0x00000A5D, XamPlayTimerSuspend,                                        kFunction),\nXE_EXPORT(xam,      0x00000A5E, XamPlayTimerIsRunning,                                      kFunction),\nXE_EXPORT(xam,      0x00000A5F, XamPlayTimerIsEnabled,                                      kFunction),\nXE_EXPORT(xam,      0x00000A60, XamPlayTimerGetNextResetDate,                               kFunction),\nXE_EXPORT(xam,      0x00000A61, XamPlayTimerFormatDurationString,                           kFunction),\nXE_EXPORT(xam,      0x00000A62, XamPlayTimerGetTimeRemaining,                               kFunction),\nXE_EXPORT(xam,      0x00000A63, XamPlayTimerUpdateTimeRemaining,                            kFunction),\nXE_EXPORT(xam,      0x00000A64, XamPlayTimerForceNotification,                              kFunction),\nXE_EXPORT(xam,      0x00000A65, XamPlayTimerRefreshResetDate,                               kFunction),\nXE_EXPORT(xam,      0x00000A66, XuiResourceOpenAndVerifyNoLoc,                              kFunction),\nXE_EXPORT(xam,      0x00000A6E, UpnpAVServerSearchInitialize,                               kFunction),\nXE_EXPORT(xam,      0x00000A6F, UpnpAVServerSearchDestroy,                                  kFunction),\nXE_EXPORT(xam,      0x00000A70, UpnpAVServerSearchStart,                                    kFunction),\nXE_EXPORT(xam,      0x00000A71, Destroy,                                                    kFunction),\nXE_EXPORT(xam,      0x00000A72, UpnpAVServerSearchDoWork,                                   kFunction),\nXE_EXPORT(xam,      0x00000A73, UpnpAVServerSearchGetNextServer,                            kFunction),\nXE_EXPORT(xam,      0x00000A8C, XCustomBroadcastGamercardEvent,                             kFunction),\nXE_EXPORT(xam,      0x00000A8D, XamCustomGetCurrentActions,                                 kFunction),\nXE_EXPORT(xam,      0x00000AA0, XamInstrumentationLogEvent,                                 kFunction),\nXE_EXPORT(xam,      0x00000AA1, XamRegisterSMCNotification,                                 kFunction),\nXE_EXPORT(xam,      0x00000AA8, XamIsScreenSaverActive,                                     kFunction),\nXE_EXPORT(xam,      0x00000AAA, XamInstrumentationLogEventEx,                               kFunction),\nXE_EXPORT(xam,      0x00000AAB, XamInstrumentationGetSourceConfig,                          kFunction),\nXE_EXPORT(xam,      0x00000AAC, XamInstrumentationDebugConfig,                              kFunction),\nXE_EXPORT(xam,      0x00000ADC, CurlCreateCacheEntry,                                       kFunction),\nXE_EXPORT(xam,      0x00000ADD, CurlOpenCacheEntry,                                         kFunction),\nXE_EXPORT(xam,      0x00000ADE, CurlSetCacheEntryExpireTime,                                kFunction),\nXE_EXPORT(xam,      0x00000ADF, CurlReadCacheEntryHeaders,                                  kFunction),\nXE_EXPORT(xam,      0x00000AE0, CurlReadCacheEntryContent,                                  kFunction),\nXE_EXPORT(xam,      0x00000AE1, CurlWriteCacheEntryContent,                                 kFunction),\nXE_EXPORT(xam,      0x00000AE2, CurlCloseCacheEntry,                                        kFunction),\nXE_EXPORT(xam,      0x00000AE3, CurlEnumerateCacheEntry,                                    kFunction),\nXE_EXPORT(xam,      0x00000AE5, CurlWipeBackingFiles,                                       kFunction),\nXE_EXPORT(xam,      0x00000AE7, CurlOpenTitleBackingFile,                                   kFunction),\nXE_EXPORT(xam,      0x00000AEA, XamUserIsPartialProfile,                                    kFunction),\nXE_EXPORT(xam,      0x00000AEB, XamLocateTitle,                                             kFunction),\nXE_EXPORT(xam,      0x00000AEC, XamProfileGetLocalTitleCount,                               kFunction),\nXE_EXPORT(xam,      0x00000AED, XamContentRemoveCacheDevice,                                kFunction),\nXE_EXPORT(xam,      0x00000AEE, XamContentAddCacheDevice,                                   kFunction),\nXE_EXPORT(xam,      0x00000AF0, XamSetSecurityViolationDetected,                            kFunction),\nXE_EXPORT(xam,      0x00000AF1, XamIsSecurityViolationDetected,                             kFunction),\nXE_EXPORT(xam,      0x00000AF2, XamIsAnySecurityViolationDetected,                          kFunction),\nXE_EXPORT(xam,      0x00000AF3, XamGetSecurityViolationsDetected,                           kFunction),\nXE_EXPORT(xam,      0x00000AF4, XamActivateCounterMeasure,                                  kFunction),\nXE_EXPORT(xam,      0x00000AF5, XamDeactivateCounterMeasure,                                kFunction),\nXE_EXPORT(xam,      0x00000AF6, XamIsCounterMeasureActivated,                               kFunction),\nXE_EXPORT(xam,      0x00000AF7, XamGetActiveCounterMeasures,                                kFunction),\nXE_EXPORT(xam,      0x00000AF8, XamPmdIdentify,                                             kFunction),\nXE_EXPORT(xam,      0x00000AF9, XamPmdSendCommand,                                          kFunction),\nXE_EXPORT(xam,      0x00000AFA, XamPmdReadReport,                                           kFunction),\nXE_EXPORT(xam,      0x00000AFC, XamPartyCreate,                                             kFunction),\nXE_EXPORT(xam,      0x00000AFD, XamPartyLeave,                                              kFunction),\nXE_EXPORT(xam,      0x00000AFE, XamPartySendInviteDeprecated,                               kFunction),\nXE_EXPORT(xam,      0x00000AFF, XamPartyGetUserList,                                        kFunction),\nXE_EXPORT(xam,      0x00000B00, XamPartySendGameInvites,                                    kFunction),\nXE_EXPORT(xam,      0x00000B01, XamPartyJoin,                                               kFunction),\nXE_EXPORT(xam,      0x00000B02, XamPartyKickUser,                                           kFunction),\nXE_EXPORT(xam,      0x00000B03, XamPartyAddLocalUsers,                                      kFunction),\nXE_EXPORT(xam,      0x00000B04, XamConvertEmoticons,                                        kFunction),\nXE_EXPORT(xam,      0x00000B05, XamGetLocaleTimeFormat,                                     kFunction),\nXE_EXPORT(xam,      0x00000B06, XamPartyRemoveLocalUsers,                                   kFunction),\nXE_EXPORT(xam,      0x00000B07, XamPartyGetUserListInternal,                                kFunction),\nXE_EXPORT(xam,      0x00000B08, XamPartySetJoinable,                                        kFunction),\nXE_EXPORT(xam,      0x00000B09, XamPartyGetJoinable,                                        kFunction),\nXE_EXPORT(xam,      0x00000B0A, XamPartyGetInfo,                                            kFunction),\nXE_EXPORT(xam,      0x00000B0B, XamPartySetCustomData,                                      kFunction),\nXE_EXPORT(xam,      0x00000B0C, XamPartySetConnectivityGraph,                               kFunction),\nXE_EXPORT(xam,      0x00000B0D, XamPartyGetRoutingTable,                                    kFunction),\nXE_EXPORT(xam,      0x00000B0E, XamPartyAutomationInprocCall,                               kFunction),\nXE_EXPORT(xam,      0x00000B0F, XamPartyGetState,                                           kFunction),\nXE_EXPORT(xam,      0x00000B10, XamPartyGetBandwidth,                                       kFunction),\nXE_EXPORT(xam,      0x00000B11, XamPartyGetNetworkCounters,                                 kFunction),\nXE_EXPORT(xam,      0x00000B12, XamShowQuickLaunchUI,                                       kFunction),\nXE_EXPORT(xam,      0x00000B13, XamPartyIsCoordinator,                                      kFunction),\nXE_EXPORT(xam,      0x00000B14, XamPartyGetFormation,                                       kFunction),\nXE_EXPORT(xam,      0x00000B15, XamPartySendInvite,                                         kFunction),\nXE_EXPORT(xam,      0x00000B16, XamPartySetTestDelay,                                       kFunction),\nXE_EXPORT(xam,      0x00000B17, XamPartyOverrideNatType,                                    kFunction),\nXE_EXPORT(xam,      0x00000B18, XamPartyGetAccessLevel,                                     kFunction),\nXE_EXPORT(xam,      0x00000B19, XamPartySetTestFlags,                                       kFunction),\nXE_EXPORT(xam,      0x00000B1A, XamIsSystemExperienceTitleId,                               kFunction),\nXE_EXPORT(xam,      0x00000B1B, XamPartyJoinEx,                                             kFunction),\nXE_EXPORT(xam,      0x00000B1C, XamPartyGetInfoEx,                                          kFunction),\nXE_EXPORT(xam,      0x00000B20, XamIsCurrentTitleDatacenterClient,                          kFunction),\nXE_EXPORT(xam,      0x00000B22, XamTaskSetCancelSubTasks,                                   kFunction),\nXE_EXPORT(xam,      0x00000B23, XamTaskGetCompletionStatus,                                 kFunction),\nXE_EXPORT(xam,      0x00000B24, XamTaskCancelWaitAndCloseWaitTask,                          kFunction),\nXE_EXPORT(xam,      0x00000B27, XamDataCenterLog,                                           kFunction),\nXE_EXPORT(xam,      0x00000B28, XamDataCenterGetDhcpOptionResponseHostnameAndPort,          kFunction),\nXE_EXPORT(xam,      0x00000B29, XamDataCenterLogEvent,                                      kFunction),\nXE_EXPORT(xam,      0x00000B2A, XamDataCenterShowForceSignInMessage,                        kFunction),\nXE_EXPORT(xam,      0x00000B2C, XamWebInstrumentationCreateReport,                          kFunction),\nXE_EXPORT(xam,      0x00000B2D, XamWebInstrumentationSetUserVar,                            kFunction),\nXE_EXPORT(xam,      0x00000B2E, XamWebInstrumentationSetUserVarNoEscape,                    kFunction),\nXE_EXPORT(xam,      0x00000B2F, XamWebInstrumentationGetURL,                                kFunction),\nXE_EXPORT(xam,      0x00000B30, XamWebInstrumentationSendReport,                            kFunction),\nXE_EXPORT(xam,      0x00000B31, XamWebInstrumentationDestroyReport,                         kFunction),\nXE_EXPORT(xam,      0x00000B32, XamWebInstrumentationCreateSampledReport,                   kFunction),\nXE_EXPORT(xam,      0x00000B33, XampSetSamplingRandomValue,                                 kFunction),\nXE_EXPORT(xam,      0x00000B34, XampWebInstrumentationSetProfileCounts,                     kFunction),\nXE_EXPORT(xam,      0x00000B35, XamWebInstrumentationGetURLEx,                              kFunction),\nXE_EXPORT(xam,      0x00000B36, XampSetOmnitureCallbackFunction,                            kFunction),\nXE_EXPORT(xam,      0x00000B37, XamShowQuickChatUIp,                                        kFunction),\nXE_EXPORT(xam,      0x00000B38, XamShowSocialPostUI,                                        kFunction),\nXE_EXPORT(xam,      0x00000B39, XamShowBeaconsUI,                                           kFunction),\nXE_EXPORT(xam,      0x00000B3A, XamShowMarketplacePurchaseOrderUI,                          kFunction),\nXE_EXPORT(xam,      0x00000B3B, XamShowMarketplaceGetOrderReceipts,                         kFunction),\nXE_EXPORT(xam,      0x00000B3C, XamShowGenericOnlineAppUI,                                  kFunction),\nXE_EXPORT(xam,      0x00000B3D, XamUserAllowedToPostToSocialNetwork,                        kFunction),\nXE_EXPORT(xam,      0x00000B3E, XamShowMarketplacePurchaseOrderUIEx,                        kFunction),\nXE_EXPORT(xam,      0x00000B3F, DebugXamShowMessageBoxUI_Wait,                              kFunction),\nXE_EXPORT(xam,      0x00000B43, XamSetCountry,                                              kFunction),\nXE_EXPORT(xam,      0x00000B44, XamIsCurrentTitleDatacenterDash,                            kFunction),\nXE_EXPORT(xam,      0x00000B45, XamLoaderRebootToServerDash,                                kFunction),\nXE_EXPORT(xam,      0x00000B46, XamIsDataCenterMode,                                        kFunction),\nXE_EXPORT(xam,      0x00000B48, XamUserGetXUIDForTFA,                                       kFunction),\nXE_EXPORT(xam,      0x00000B4A, XamVerifyXSignerSignature,                                  kFunction),\n"
  },
  {
    "path": "src/xenia/kernel/xam/xam_task.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/string_util.h\"\n#include \"xenia/cpu/processor.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/user_module.h\"\n#include \"xenia/kernel/util/shim_utils.h\"\n#include \"xenia/kernel/xam/xam_module.h\"\n#include \"xenia/kernel/xam/xam_private.h\"\n#include \"xenia/kernel/xthread.h\"\n#include \"xenia/xbox.h\"\n\n#if XE_PLATFORM_WIN32\n#include \"xenia/base/platform_win.h\"\n#endif\n\n#include \"third_party/fmt/include/fmt/format.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xam {\n\nstruct XTASK_MESSAGE {\n  be<uint32_t> unknown_00;\n  be<uint32_t> unknown_04;\n  be<uint32_t> unknown_08;\n  be<uint32_t> callback_arg_ptr;\n  be<uint32_t> event_handle;\n  be<uint32_t> unknown_14;\n  be<uint32_t> task_handle;\n};\nstatic_assert_size(XTASK_MESSAGE, 0x1C);\n\ndword_result_t XamTaskSchedule_entry(lpvoid_t callback,\n                                     pointer_t<XTASK_MESSAGE> message,\n                                     lpdword_t unknown, lpdword_t handle_ptr) {\n  // TODO(gibbed): figure out what this is for\n  *handle_ptr = 12345;\n\n  uint32_t stack_size = kernel_state()->GetExecutableModule()->stack_size();\n\n  // Stack must be aligned to 16kb pages\n  stack_size = std::max((uint32_t)0x4000, ((stack_size + 0xFFF) & 0xFFFFF000));\n\n  auto thread =\n      object_ref<XThread>(new XThread(kernel_state(), stack_size, 0, callback,\n                                      message.guest_address(), 0, true));\n\n  X_STATUS result = thread->Create();\n\n  if (XFAILED(result)) {\n    // Failed!\n    XELOGE(\"XAM task creation failed: {:08X}\", result);\n    return result;\n  }\n\n  XELOGD(\"XAM task ({:08X}) scheduled asynchronously\",\n         callback.guest_address());\n\n  return X_STATUS_SUCCESS;\n}\nDECLARE_XAM_EXPORT2(XamTaskSchedule, kNone, kImplemented, kSketchy);\n\ndword_result_t XamTaskShouldExit_entry(dword_t r3) { return 0; }\nDECLARE_XAM_EXPORT2(XamTaskShouldExit, kNone, kStub, kSketchy);\n\n}  // namespace xam\n}  // namespace kernel\n}  // namespace xe\n\nDECLARE_XAM_EMPTY_REGISTER_EXPORTS(Task);\n"
  },
  {
    "path": "src/xenia/kernel/xam/xam_ui.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"third_party/imgui/imgui.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/string_util.h\"\n#include \"xenia/emulator.h\"\n#include \"xenia/kernel/kernel_flags.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/util/shim_utils.h\"\n#include \"xenia/kernel/xam/xam_private.h\"\n#include \"xenia/ui/imgui_dialog.h\"\n#include \"xenia/ui/imgui_drawer.h\"\n#include \"xenia/ui/window.h\"\n#include \"xenia/ui/windowed_app_context.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xam {\n\n// TODO(gibbed): This is all one giant WIP that seems to work better than the\n// previous immediate synchronous completion of dialogs.\n//\n// The deferred execution of dialog handling is done in such a way that there is\n// a pre-, peri- (completion), and post- callback steps.\n//\n// pre();\n// result = completion();\n// CompleteOverlapped(result);\n// post();\n//\n// There are games that are batshit insane enough to wait for the X_OVERLAPPED\n// to be completed (ie not X_ERROR_PENDING) before creating a listener to\n// receive a notification, which is why we have distinct pre- and post- steps.\n//\n// We deliberately delay the XN_SYS_UI = false notification to give games time\n// to create a listener (if they're insane enough do this).\n\nextern std::atomic<int> xam_dialogs_shown_;\n\nclass XamDialog : public xe::ui::ImGuiDialog {\n public:\n  void set_close_callback(std::function<void()> close_callback) {\n    close_callback_ = close_callback;\n  }\n\n protected:\n  XamDialog(xe::ui::ImGuiDrawer* imgui_drawer)\n      : xe::ui::ImGuiDialog(imgui_drawer) {}\n\n  void OnClose() override {\n    if (close_callback_) {\n      close_callback_();\n    }\n  }\n\n private:\n  std::function<void()> close_callback_ = nullptr;\n};\n\ntemplate <typename T>\nX_RESULT xeXamDispatchDialog(T* dialog,\n                             std::function<X_RESULT(T*)> close_callback,\n                             uint32_t overlapped) {\n  auto pre = []() {\n    // Broadcast XN_SYS_UI = true\n    kernel_state()->BroadcastNotification(0x9, true);\n  };\n  auto run = [dialog, close_callback]() -> X_RESULT {\n    X_RESULT result;\n    dialog->set_close_callback([&dialog, &result, &close_callback]() {\n      result = close_callback(dialog);\n    });\n    xe::threading::Fence fence;\n    xe::ui::WindowedAppContext& app_context =\n        kernel_state()->emulator()->display_window()->app_context();\n    if (app_context.CallInUIThreadSynchronous(\n            [&dialog, &fence]() { dialog->Then(&fence); })) {\n      ++xam_dialogs_shown_;\n      fence.Wait();\n      --xam_dialogs_shown_;\n    } else {\n      delete dialog;\n    }\n    // dialog should be deleted at this point!\n    return result;\n  };\n  auto post = []() {\n    xe::threading::Sleep(std::chrono::milliseconds(100));\n    // Broadcast XN_SYS_UI = false\n    kernel_state()->BroadcastNotification(0x9, false);\n  };\n  if (!overlapped) {\n    pre();\n    auto result = run();\n    post();\n    return result;\n  } else {\n    kernel_state()->CompleteOverlappedDeferred(run, overlapped, pre, post);\n    return X_ERROR_IO_PENDING;\n  }\n}\n\ntemplate <typename T>\nX_RESULT xeXamDispatchDialogEx(\n    T* dialog, std::function<X_RESULT(T*, uint32_t&, uint32_t&)> close_callback,\n    uint32_t overlapped) {\n  auto pre = []() {\n    // Broadcast XN_SYS_UI = true\n    kernel_state()->BroadcastNotification(0x9, true);\n  };\n  auto run = [dialog, close_callback](uint32_t& extended_error,\n                                      uint32_t& length) -> X_RESULT {\n    auto display_window = kernel_state()->emulator()->display_window();\n    X_RESULT result;\n    dialog->set_close_callback(\n        [&dialog, &result, &extended_error, &length, &close_callback]() {\n          result = close_callback(dialog, extended_error, length);\n        });\n    xe::threading::Fence fence;\n    if (display_window->app_context().CallInUIThreadSynchronous(\n            [&dialog, &fence]() { dialog->Then(&fence); })) {\n      ++xam_dialogs_shown_;\n      fence.Wait();\n      --xam_dialogs_shown_;\n    } else {\n      delete dialog;\n    }\n    // dialog should be deleted at this point!\n    return result;\n  };\n  auto post = []() {\n    xe::threading::Sleep(std::chrono::milliseconds(100));\n    // Broadcast XN_SYS_UI = false\n    kernel_state()->BroadcastNotification(0x9, false);\n  };\n  if (!overlapped) {\n    pre();\n    uint32_t extended_error, length;\n    auto result = run(extended_error, length);\n    post();\n    // TODO(gibbed): do something with extended_error/length?\n    return result;\n  } else {\n    kernel_state()->CompleteOverlappedDeferredEx(run, overlapped, pre, post);\n    return X_ERROR_IO_PENDING;\n  }\n}\n\nX_RESULT xeXamDispatchHeadless(std::function<X_RESULT()> run_callback,\n                               uint32_t overlapped) {\n  auto pre = []() {\n    // Broadcast XN_SYS_UI = true\n    kernel_state()->BroadcastNotification(0x9, true);\n  };\n  auto post = []() {\n    xe::threading::Sleep(std::chrono::milliseconds(100));\n    // Broadcast XN_SYS_UI = false\n    kernel_state()->BroadcastNotification(0x9, false);\n  };\n  if (!overlapped) {\n    pre();\n    auto result = run_callback();\n    post();\n    return result;\n  } else {\n    kernel_state()->CompleteOverlappedDeferred(run_callback, overlapped, pre,\n                                               post);\n    return X_ERROR_IO_PENDING;\n  }\n}\n\nX_RESULT xeXamDispatchHeadlessEx(\n    std::function<X_RESULT(uint32_t&, uint32_t&)> run_callback,\n    uint32_t overlapped) {\n  auto pre = []() {\n    // Broadcast XN_SYS_UI = true\n    kernel_state()->BroadcastNotification(0x9, true);\n  };\n  auto post = []() {\n    xe::threading::Sleep(std::chrono::milliseconds(100));\n    // Broadcast XN_SYS_UI = false\n    kernel_state()->BroadcastNotification(0x9, false);\n  };\n  if (!overlapped) {\n    pre();\n    uint32_t extended_error, length;\n    auto result = run_callback(extended_error, length);\n    post();\n    // TODO(gibbed): do something with extended_error/length?\n    return result;\n  } else {\n    kernel_state()->CompleteOverlappedDeferredEx(run_callback, overlapped, pre,\n                                                 post);\n    return X_ERROR_IO_PENDING;\n  }\n}\n\ndword_result_t XamIsUIActive_entry() { return xeXamIsUIActive(); }\nDECLARE_XAM_EXPORT2(XamIsUIActive, kUI, kImplemented, kHighFrequency);\n\nclass MessageBoxDialog : public XamDialog {\n public:\n  MessageBoxDialog(xe::ui::ImGuiDrawer* imgui_drawer, std::string title,\n                   std::string description, std::vector<std::string> buttons,\n                   uint32_t default_button)\n      : XamDialog(imgui_drawer),\n        title_(title),\n        description_(description),\n        buttons_(std::move(buttons)),\n        default_button_(default_button),\n        chosen_button_(default_button) {\n    if (!title_.size()) {\n      title_ = \"Message Box\";\n    }\n  }\n\n  uint32_t chosen_button() const { return chosen_button_; }\n\n  void OnDraw(ImGuiIO& io) override {\n    bool first_draw = false;\n    if (!has_opened_) {\n      ImGui::OpenPopup(title_.c_str());\n      has_opened_ = true;\n      first_draw = true;\n    }\n    if (ImGui::BeginPopupModal(title_.c_str(), nullptr,\n                               ImGuiWindowFlags_AlwaysAutoResize)) {\n      if (description_.size()) {\n        ImGui::Text(\"%s\", description_.c_str());\n      }\n      if (first_draw) {\n        ImGui::SetKeyboardFocusHere();\n      }\n      for (size_t i = 0; i < buttons_.size(); ++i) {\n        if (ImGui::Button(buttons_[i].c_str())) {\n          chosen_button_ = static_cast<uint32_t>(i);\n          ImGui::CloseCurrentPopup();\n          Close();\n        }\n        ImGui::SameLine();\n      }\n      ImGui::Spacing();\n      ImGui::Spacing();\n      ImGui::EndPopup();\n    } else {\n      Close();\n    }\n  }\n\n private:\n  bool has_opened_ = false;\n  std::string title_;\n  std::string description_;\n  std::vector<std::string> buttons_;\n  uint32_t default_button_ = 0;\n  uint32_t chosen_button_ = 0;\n};\n\n// https://www.se7ensins.com/forums/threads/working-xshowmessageboxui.844116/\ndword_result_t XamShowMessageBoxUI_entry(\n    dword_t user_index, lpu16string_t title_ptr, lpu16string_t text_ptr,\n    dword_t button_count, lpdword_t button_ptrs, dword_t active_button,\n    dword_t flags, lpdword_t result_ptr, pointer_t<XAM_OVERLAPPED> overlapped) {\n  std::string title;\n  if (title_ptr) {\n    title = xe::to_utf8(title_ptr.value());\n  } else {\n    title = \"\";  // TODO(gibbed): default title based on flags?\n  }\n\n  std::vector<std::string> buttons;\n  for (uint32_t i = 0; i < button_count; ++i) {\n    uint32_t button_ptr = button_ptrs[i];\n    auto button = xe::load_and_swap<std::u16string>(\n        kernel_state()->memory()->TranslateVirtual(button_ptr));\n    buttons.push_back(xe::to_utf8(button));\n  }\n\n  X_RESULT result;\n  if (cvars::headless) {\n    // Auto-pick the focused button.\n    auto run = [result_ptr, active_button]() -> X_RESULT {\n      *result_ptr = static_cast<uint32_t>(active_button);\n      return X_ERROR_SUCCESS;\n    };\n    result = xeXamDispatchHeadless(run, overlapped);\n  } else {\n    // TODO(benvanik): setup icon states.\n    switch (flags & 0xF) {\n      case 0:\n        // config.pszMainIcon = nullptr;\n        break;\n      case 1:\n        // config.pszMainIcon = TD_ERROR_ICON;\n        break;\n      case 2:\n        // config.pszMainIcon = TD_WARNING_ICON;\n        break;\n      case 3:\n        // config.pszMainIcon = TD_INFORMATION_ICON;\n        break;\n    }\n    auto close = [result_ptr](MessageBoxDialog* dialog) -> X_RESULT {\n      *result_ptr = dialog->chosen_button();\n      return X_ERROR_SUCCESS;\n    };\n    const Emulator* emulator = kernel_state()->emulator();\n    ui::ImGuiDrawer* imgui_drawer = emulator->imgui_drawer();\n    result = xeXamDispatchDialog<MessageBoxDialog>(\n        new MessageBoxDialog(imgui_drawer, title, xe::to_utf8(text_ptr.value()),\n                             buttons, active_button),\n        close, overlapped);\n  }\n  return result;\n}\nDECLARE_XAM_EXPORT1(XamShowMessageBoxUI, kUI, kImplemented);\n\nclass KeyboardInputDialog : public XamDialog {\n public:\n  KeyboardInputDialog(xe::ui::ImGuiDrawer* imgui_drawer, std::string title,\n                      std::string description, std::string default_text,\n                      size_t max_length)\n      : XamDialog(imgui_drawer),\n        title_(title),\n        description_(description),\n        default_text_(default_text),\n        max_length_(max_length),\n        text_buffer_() {\n    if (!title_.size()) {\n      if (!description_.size()) {\n        title_ = \"Keyboard Input\";\n      } else {\n        title_ = description_;\n        description_ = \"\";\n      }\n    }\n    text_ = default_text;\n    text_buffer_.resize(max_length);\n    xe::string_util::copy_truncating(text_buffer_.data(), default_text_,\n                                     text_buffer_.size());\n  }\n\n  const std::string& text() const { return text_; }\n  bool cancelled() const { return cancelled_; }\n\n  void OnDraw(ImGuiIO& io) override {\n    bool first_draw = false;\n    if (!has_opened_) {\n      ImGui::OpenPopup(title_.c_str());\n      has_opened_ = true;\n      first_draw = true;\n    }\n    if (ImGui::BeginPopupModal(title_.c_str(), nullptr,\n                               ImGuiWindowFlags_AlwaysAutoResize)) {\n      if (description_.size()) {\n        ImGui::TextWrapped(\"%s\", description_.c_str());\n      }\n      if (first_draw) {\n        ImGui::SetKeyboardFocusHere();\n      }\n      if (ImGui::InputText(\"##body\", text_buffer_.data(), text_buffer_.size(),\n                           ImGuiInputTextFlags_EnterReturnsTrue)) {\n        text_ = std::string(text_buffer_.data(), text_buffer_.size());\n        cancelled_ = false;\n        ImGui::CloseCurrentPopup();\n        Close();\n      }\n      if (ImGui::Button(\"OK\")) {\n        text_ = std::string(text_buffer_.data(), text_buffer_.size());\n        cancelled_ = false;\n        ImGui::CloseCurrentPopup();\n        Close();\n      }\n      ImGui::SameLine();\n      if (ImGui::Button(\"Cancel\")) {\n        text_ = \"\";\n        cancelled_ = true;\n        ImGui::CloseCurrentPopup();\n        Close();\n      }\n      ImGui::Spacing();\n      ImGui::EndPopup();\n    } else {\n      Close();\n    }\n  }\n\n private:\n  bool has_opened_ = false;\n  std::string title_;\n  std::string description_;\n  std::string default_text_;\n  size_t max_length_ = 0;\n  std::vector<char> text_buffer_;\n  std::string text_ = \"\";\n  bool cancelled_ = true;\n};\n\n// https://www.se7ensins.com/forums/threads/release-how-to-use-xshowkeyboardui-release.906568/\ndword_result_t XamShowKeyboardUI_entry(\n    dword_t user_index, dword_t flags, lpu16string_t default_text,\n    lpu16string_t title, lpu16string_t description, lpu16string_t buffer,\n    dword_t buffer_length, pointer_t<XAM_OVERLAPPED> overlapped) {\n  if (!buffer) {\n    return X_ERROR_INVALID_PARAMETER;\n  }\n\n  assert_not_null(overlapped);\n\n  auto buffer_size = static_cast<size_t>(buffer_length) * 2;\n\n  X_RESULT result;\n  if (cvars::headless) {\n    auto run = [default_text, buffer, buffer_length,\n                buffer_size]() -> X_RESULT {\n      // Redirect default_text back into the buffer.\n      if (!default_text) {\n        std::memset(buffer, 0, buffer_size);\n      } else {\n        string_util::copy_and_swap_truncating(buffer, default_text.value(),\n                                              buffer_length);\n      }\n      return X_ERROR_SUCCESS;\n    };\n    result = xeXamDispatchHeadless(run, overlapped);\n  } else {\n    auto close = [buffer, buffer_length](KeyboardInputDialog* dialog,\n                                         uint32_t& extended_error,\n                                         uint32_t& length) -> X_RESULT {\n      if (dialog->cancelled()) {\n        extended_error = X_ERROR_CANCELLED;\n        length = 0;\n        return X_ERROR_SUCCESS;\n      } else {\n        // Zero the output buffer.\n        auto text = xe::to_utf16(dialog->text());\n        string_util::copy_and_swap_truncating(buffer, text, buffer_length);\n        extended_error = X_ERROR_SUCCESS;\n        length = 0;\n        return X_ERROR_SUCCESS;\n      }\n    };\n    const Emulator* emulator = kernel_state()->emulator();\n    ui::ImGuiDrawer* imgui_drawer = emulator->imgui_drawer();\n    result = xeXamDispatchDialogEx<KeyboardInputDialog>(\n        new KeyboardInputDialog(\n            imgui_drawer, title ? xe::to_utf8(title.value()) : \"\",\n            description ? xe::to_utf8(description.value()) : \"\",\n            default_text ? xe::to_utf8(default_text.value()) : \"\",\n            buffer_length),\n        close, overlapped);\n  }\n  return result;\n}\nDECLARE_XAM_EXPORT1(XamShowKeyboardUI, kUI, kImplemented);\n\ndword_result_t XamShowDeviceSelectorUI_entry(\n    dword_t user_index, dword_t content_type, dword_t content_flags,\n    qword_t total_requested, lpdword_t device_id_ptr,\n    pointer_t<XAM_OVERLAPPED> overlapped) {\n  return xeXamDispatchHeadless(\n      [device_id_ptr]() -> X_RESULT {\n        // NOTE: 0x00000001 is our dummy device ID from xam_content.cc\n        *device_id_ptr = 0x00000001;\n        return X_ERROR_SUCCESS;\n      },\n      overlapped);\n}\nDECLARE_XAM_EXPORT1(XamShowDeviceSelectorUI, kUI, kImplemented);\n\nvoid XamShowDirtyDiscErrorUI_entry(dword_t user_index) {\n  if (cvars::headless) {\n    assert_always();\n    exit(1);\n    return;\n  }\n  const Emulator* emulator = kernel_state()->emulator();\n  ui::ImGuiDrawer* imgui_drawer = emulator->imgui_drawer();\n  xeXamDispatchDialog<MessageBoxDialog>(\n      new MessageBoxDialog(\n          imgui_drawer, \"Disc Read Error\",\n          \"There's been an issue reading content from the game disc.\\nThis is \"\n          \"likely caused by bad or unimplemented file IO calls.\",\n          {\"OK\"}, 0),\n      [](MessageBoxDialog*) -> X_RESULT { return X_ERROR_SUCCESS; }, 0);\n  // This is death, and should never return.\n  // TODO(benvanik): cleaner exit.\n  exit(1);\n}\nDECLARE_XAM_EXPORT1(XamShowDirtyDiscErrorUI, kUI, kImplemented);\n\ndword_result_t XamShowPartyUI_entry(unknown_t r3, unknown_t r4) {\n  return X_ERROR_FUNCTION_FAILED;\n}\nDECLARE_XAM_EXPORT1(XamShowPartyUI, kNone, kStub);\n\ndword_result_t XamShowCommunitySessionsUI_entry(unknown_t r3, unknown_t r4) {\n  return X_ERROR_FUNCTION_FAILED;\n}\nDECLARE_XAM_EXPORT1(XamShowCommunitySessionsUI, kNone, kStub);\n\n}  // namespace xam\n}  // namespace kernel\n}  // namespace xe\n\nDECLARE_XAM_EMPTY_REGISTER_EXPORTS(UI);\n"
  },
  {
    "path": "src/xenia/kernel/xam/xam_user.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include <cstring>\n\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/string_util.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/util/shim_utils.h\"\n#include \"xenia/kernel/xam/user_profile.h\"\n#include \"xenia/kernel/xam/xam_private.h\"\n#include \"xenia/kernel/xenumerator.h\"\n#include \"xenia/kernel/xthread.h\"\n#include \"xenia/xbox.h\"\n\nDECLARE_int32(user_language);\n\nnamespace xe {\nnamespace kernel {\nnamespace xam {\n\nX_HRESULT_result_t XamUserGetXUID_entry(dword_t user_index, dword_t type_mask,\n                                        lpqword_t xuid_ptr) {\n  assert_true(type_mask == 1 || type_mask == 2 || type_mask == 3 ||\n              type_mask == 4 || type_mask == 7);\n  if (!xuid_ptr) {\n    return X_E_INVALIDARG;\n  }\n  uint32_t result = X_E_NO_SUCH_USER;\n  uint64_t xuid = 0;\n  if (user_index < 4) {\n    if (user_index == 0) {\n      const auto& user_profile = kernel_state()->user_profile();\n      auto type = user_profile->type() & type_mask;\n      if (type & (2 | 4)) {\n        // maybe online profile?\n        xuid = user_profile->xuid();\n        result = X_E_SUCCESS;\n      } else if (type & 1) {\n        // maybe offline profile?\n        xuid = user_profile->xuid();\n        result = X_E_SUCCESS;\n      }\n    }\n  } else {\n    result = X_E_INVALIDARG;\n  }\n  *xuid_ptr = xuid;\n  return result;\n}\nDECLARE_XAM_EXPORT1(XamUserGetXUID, kUserProfiles, kImplemented);\n\ndword_result_t XamUserGetSigninState_entry(dword_t user_index) {\n  // Yield, as some games spam this.\n  xe::threading::MaybeYield();\n  uint32_t signin_state = 0;\n  if (user_index < 4) {\n    if (user_index == 0) {\n      const auto& user_profile = kernel_state()->user_profile();\n      signin_state = user_profile->signin_state();\n    }\n  }\n  return signin_state;\n}\nDECLARE_XAM_EXPORT2(XamUserGetSigninState, kUserProfiles, kImplemented,\n                    kHighFrequency);\n\ntypedef struct {\n  xe::be<uint64_t> xuid;\n  xe::be<uint32_t> unk08;  // maybe zero?\n  xe::be<uint32_t> signin_state;\n  xe::be<uint32_t> unk10;  // ?\n  xe::be<uint32_t> unk14;  // ?\n  char name[16];\n} X_USER_SIGNIN_INFO;\nstatic_assert_size(X_USER_SIGNIN_INFO, 40);\n\nX_HRESULT_result_t XamUserGetSigninInfo_entry(\n    dword_t user_index, dword_t flags, pointer_t<X_USER_SIGNIN_INFO> info) {\n  if (!info) {\n    return X_E_INVALIDARG;\n  }\n\n  std::memset(info, 0, sizeof(X_USER_SIGNIN_INFO));\n  if (user_index) {\n    return X_E_NO_SUCH_USER;\n  }\n\n  const auto& user_profile = kernel_state()->user_profile();\n  info->xuid = user_profile->xuid();\n  info->signin_state = user_profile->signin_state();\n  xe::string_util::copy_truncating(info->name, user_profile->name(),\n                                   xe::countof(info->name));\n  return X_E_SUCCESS;\n}\nDECLARE_XAM_EXPORT1(XamUserGetSigninInfo, kUserProfiles, kImplemented);\n\ndword_result_t XamUserGetName_entry(dword_t user_index, lpstring_t buffer,\n                                    dword_t buffer_len) {\n  if (user_index >= 4) {\n    return X_E_INVALIDARG;\n  }\n\n  if (user_index) {\n    return X_E_NO_SUCH_USER;\n  }\n\n  const auto& user_profile = kernel_state()->user_profile();\n  const auto& user_name = user_profile->name();\n  xe::string_util::copy_truncating(buffer, user_name,\n                                   std::min(buffer_len.value(), uint32_t(16)));\n  return X_E_SUCCESS;\n}\nDECLARE_XAM_EXPORT1(XamUserGetName, kUserProfiles, kImplemented);\n\ndword_result_t XamUserGetGamerTag_entry(dword_t user_index,\n                                        lpu16string_t buffer,\n                                        dword_t buffer_len) {\n  if (user_index >= 4) {\n    return X_E_INVALIDARG;\n  }\n\n  if (user_index) {\n    return X_E_NO_SUCH_USER;\n  }\n\n  if (!buffer || buffer_len < 16) {\n    return X_E_INVALIDARG;\n  }\n\n  const auto& user_profile = kernel_state()->user_profile();\n  auto user_name = xe::to_utf16(user_profile->name());\n  xe::string_util::copy_and_swap_truncating(\n      buffer, user_name, std::min(buffer_len.value(), uint32_t(16)));\n  return X_E_SUCCESS;\n}\nDECLARE_XAM_EXPORT1(XamUserGetGamerTag, kUserProfiles, kImplemented);\n\ntypedef struct {\n  xe::be<uint32_t> setting_count;\n  xe::be<uint32_t> settings_ptr;\n} X_USER_READ_PROFILE_SETTINGS;\nstatic_assert_size(X_USER_READ_PROFILE_SETTINGS, 8);\n\n// https://github.com/oukiar/freestyledash/blob/master/Freestyle/Tools/Generic/xboxtools.cpp\nuint32_t XamUserReadProfileSettingsEx(uint32_t title_id, uint32_t user_index,\n                                      uint32_t xuid_count, be<uint64_t>* xuids,\n                                      uint32_t setting_count,\n                                      be<uint32_t>* setting_ids, uint32_t unk,\n                                      be<uint32_t>* buffer_size_ptr,\n                                      uint8_t* buffer,\n                                      XAM_OVERLAPPED* overlapped) {\n  if (!xuid_count) {\n    assert_null(xuids);\n  } else {\n    assert_true(xuid_count == 1);\n    assert_not_null(xuids);\n    // TODO(gibbed): allow proper lookup of arbitrary XUIDs\n    const auto& user_profile = kernel_state()->user_profile();\n    assert_true(static_cast<uint64_t>(xuids[0]) == user_profile->xuid());\n    // TODO(gibbed): we assert here, but in case a title passes xuid_count > 1\n    // until it's implemented for release builds...\n    xuid_count = 1;\n  }\n  assert_zero(unk);  // probably flags\n\n  // must have at least 1 to 32 settings\n  if (setting_count < 1 || setting_count > 32) {\n    return X_ERROR_INVALID_PARAMETER;\n  }\n\n  // buffer size pointer must be valid\n  if (!buffer_size_ptr) {\n    return X_ERROR_INVALID_PARAMETER;\n  }\n\n  // if buffer size is non-zero, buffer pointer must be valid\n  auto buffer_size = static_cast<uint32_t>(*buffer_size_ptr);\n  if (buffer_size && !buffer) {\n    return X_ERROR_INVALID_PARAMETER;\n  }\n\n  uint32_t needed_header_size = 0;\n  uint32_t needed_data_size = 0;\n  for (uint32_t i = 0; i < setting_count; ++i) {\n    needed_header_size += sizeof(X_USER_PROFILE_SETTING);\n    UserProfile::Setting::Key setting_key;\n    setting_key.value = static_cast<uint32_t>(setting_ids[i]);\n    switch (static_cast<UserProfile::Setting::Type>(setting_key.type)) {\n      case UserProfile::Setting::Type::WSTRING:\n      case UserProfile::Setting::Type::BINARY:\n        needed_data_size += setting_key.size;\n        break;\n      default:\n        break;\n    }\n  }\n  if (xuids) {\n    needed_header_size *= xuid_count;\n    needed_data_size *= xuid_count;\n  }\n  needed_header_size += sizeof(X_USER_READ_PROFILE_SETTINGS);\n\n  uint32_t needed_size = needed_header_size + needed_data_size;\n  if (!buffer || buffer_size < needed_size) {\n    if (!buffer_size) {\n      *buffer_size_ptr = needed_size;\n    }\n    return X_ERROR_INSUFFICIENT_BUFFER;\n  }\n\n  // Title ID = 0 means us.\n  // 0xfffe07d1 = profile?\n\n  if (!xuids && user_index) {\n    // Only support user 0.\n    if (overlapped) {\n      kernel_state()->CompleteOverlappedImmediate(\n          kernel_state()->memory()->HostToGuestVirtual(overlapped),\n          X_ERROR_NO_SUCH_USER);\n      return X_ERROR_IO_PENDING;\n    }\n    return X_ERROR_NO_SUCH_USER;\n  }\n\n  const auto& user_profile = kernel_state()->user_profile();\n\n  // First call asks for size (fill buffer_size_ptr).\n  // Second call asks for buffer contents with that size.\n\n  // TODO(gibbed): setting validity checking without needing a user profile\n  // object.\n  bool any_missing = false;\n  for (uint32_t i = 0; i < setting_count; ++i) {\n    auto setting_id = static_cast<uint32_t>(setting_ids[i]);\n    auto setting = user_profile->GetSetting(setting_id);\n    if (!setting) {\n      any_missing = true;\n      XELOGE(\n          \"xeXamUserReadProfileSettingsEx requested unimplemented setting \"\n          \"{:08X}\",\n          setting_id);\n    }\n  }\n  if (any_missing) {\n    // TODO(benvanik): don't fail? most games don't even check!\n    if (overlapped) {\n      kernel_state()->CompleteOverlappedImmediate(\n          kernel_state()->memory()->HostToGuestVirtual(overlapped),\n          X_ERROR_INVALID_PARAMETER);\n      return X_ERROR_IO_PENDING;\n    }\n    return X_ERROR_INVALID_PARAMETER;\n  }\n\n  auto out_header = reinterpret_cast<X_USER_READ_PROFILE_SETTINGS*>(buffer);\n  auto out_setting = reinterpret_cast<X_USER_PROFILE_SETTING*>(&out_header[1]);\n  out_header->setting_count = static_cast<uint32_t>(setting_count);\n  out_header->settings_ptr =\n      kernel_state()->memory()->HostToGuestVirtual(out_setting);\n\n  UserProfile::SettingByteStream out_stream(\n      kernel_state()->memory()->HostToGuestVirtual(buffer), buffer, buffer_size,\n      needed_header_size);\n  for (uint32_t n = 0; n < setting_count; ++n) {\n    uint32_t setting_id = setting_ids[n];\n    auto setting = user_profile->GetSetting(setting_id);\n\n    std::memset(out_setting, 0, sizeof(X_USER_PROFILE_SETTING));\n    out_setting->from = !setting || !setting->is_set   ? 0\n                        : setting->is_title_specific() ? 2\n                                                       : 1;\n    if (xuids) {\n      out_setting->xuid = user_profile->xuid();\n    } else {\n      out_setting->user_index = static_cast<uint32_t>(user_index);\n    }\n    out_setting->setting_id = setting_id;\n\n    if (setting && setting->is_set) {\n      setting->Append(&out_setting->data, &out_stream);\n    }\n    ++out_setting;\n  }\n\n  if (overlapped) {\n    kernel_state()->CompleteOverlappedImmediate(\n        kernel_state()->memory()->HostToGuestVirtual(overlapped),\n        X_ERROR_SUCCESS);\n    return X_ERROR_IO_PENDING;\n  }\n  return X_ERROR_SUCCESS;\n}\n\ndword_result_t XamUserReadProfileSettings_entry(\n    dword_t title_id, dword_t user_index, dword_t xuid_count, lpqword_t xuids,\n    dword_t setting_count, lpdword_t setting_ids, lpdword_t buffer_size_ptr,\n    lpvoid_t buffer_ptr, pointer_t<XAM_OVERLAPPED> overlapped) {\n  return XamUserReadProfileSettingsEx(title_id, user_index, xuid_count, xuids,\n                                      setting_count, setting_ids, 0,\n                                      buffer_size_ptr, buffer_ptr, overlapped);\n}\nDECLARE_XAM_EXPORT1(XamUserReadProfileSettings, kUserProfiles, kImplemented);\n\ndword_result_t XamUserReadProfileSettingsEx_entry(\n    dword_t title_id, dword_t user_index, dword_t xuid_count, lpqword_t xuids,\n    dword_t setting_count, lpdword_t setting_ids, lpdword_t buffer_size_ptr,\n    dword_t unk_2, lpvoid_t buffer_ptr, pointer_t<XAM_OVERLAPPED> overlapped) {\n  return XamUserReadProfileSettingsEx(title_id, user_index, xuid_count, xuids,\n                                      setting_count, setting_ids, unk_2,\n                                      buffer_size_ptr, buffer_ptr, overlapped);\n}\nDECLARE_XAM_EXPORT1(XamUserReadProfileSettingsEx, kUserProfiles, kImplemented);\n\ndword_result_t XamUserWriteProfileSettings_entry(\n    dword_t title_id, dword_t user_index, dword_t setting_count,\n    pointer_t<X_USER_PROFILE_SETTING> settings,\n    pointer_t<XAM_OVERLAPPED> overlapped) {\n  if (!setting_count || !settings) {\n    return X_ERROR_INVALID_PARAMETER;\n  }\n\n  if (user_index) {\n    // Only support user 0.\n    if (overlapped) {\n      kernel_state()->CompleteOverlappedImmediate(overlapped,\n                                                  X_ERROR_NO_SUCH_USER);\n      return X_ERROR_IO_PENDING;\n    }\n    return X_ERROR_NO_SUCH_USER;\n  }\n\n  // Update and save settings.\n  const auto& user_profile = kernel_state()->user_profile();\n\n  for (uint32_t n = 0; n < setting_count; ++n) {\n    const X_USER_PROFILE_SETTING& setting = settings[n];\n\n    auto setting_type =\n        static_cast<UserProfile::Setting::Type>(setting.data.type);\n    if (setting_type == UserProfile::Setting::Type::UNSET) {\n      continue;\n    }\n\n    XELOGD(\n        \"XamUserWriteProfileSettings: setting index [{}]:\"\n        \" from={} setting_id={:08X} data.type={}\",\n        n, (uint32_t)setting.from, (uint32_t)setting.setting_id,\n        setting.data.type);\n\n    switch (setting_type) {\n      case UserProfile::Setting::Type::CONTENT:\n      case UserProfile::Setting::Type::BINARY: {\n        uint8_t* binary_ptr =\n            kernel_state()->memory()->TranslateVirtual(setting.data.binary.ptr);\n        size_t binary_size = setting.data.binary.size;\n        std::vector<uint8_t> bytes;\n        if (setting.data.binary.ptr) {\n          // Copy provided data\n          bytes.resize(binary_size);\n          std::memcpy(bytes.data(), binary_ptr, binary_size);\n        } else {\n          // Data pointer was NULL, so just fill with zeroes\n          bytes.resize(binary_size, 0);\n        }\n        user_profile->AddSetting(\n            std::make_unique<xam::UserProfile::BinarySetting>(\n                setting.setting_id, bytes));\n      } break;\n      case UserProfile::Setting::Type::WSTRING:\n      case UserProfile::Setting::Type::DOUBLE:\n      case UserProfile::Setting::Type::FLOAT:\n      case UserProfile::Setting::Type::INT32:\n      case UserProfile::Setting::Type::INT64:\n      case UserProfile::Setting::Type::DATETIME:\n      default: {\n        XELOGE(\"XamUserWriteProfileSettings: Unimplemented data type {}\",\n               setting_type);\n      } break;\n    };\n  }\n\n  if (overlapped) {\n    kernel_state()->CompleteOverlappedImmediate(overlapped, X_ERROR_SUCCESS);\n    return X_ERROR_IO_PENDING;\n  }\n  return X_ERROR_SUCCESS;\n}\nDECLARE_XAM_EXPORT1(XamUserWriteProfileSettings, kUserProfiles, kImplemented);\n\ndword_result_t XamUserCheckPrivilege_entry(dword_t user_index, dword_t mask,\n                                           lpdword_t out_value) {\n  // checking all users?\n  if (user_index != 0xFF) {\n    if (user_index >= 4) {\n      return X_ERROR_INVALID_PARAMETER;\n    }\n\n    if (user_index) {\n      return X_ERROR_NO_SUCH_USER;\n    }\n  }\n\n  // If we deny everything, games should hopefully not try to do stuff.\n  *out_value = 0;\n  return X_ERROR_SUCCESS;\n}\nDECLARE_XAM_EXPORT1(XamUserCheckPrivilege, kUserProfiles, kStub);\n\ndword_result_t XamUserContentRestrictionGetFlags_entry(dword_t user_index,\n                                                       lpdword_t out_flags) {\n  if (user_index) {\n    return X_ERROR_NO_SUCH_USER;\n  }\n\n  // No restrictions?\n  *out_flags = 0;\n  return X_ERROR_SUCCESS;\n}\nDECLARE_XAM_EXPORT1(XamUserContentRestrictionGetFlags, kUserProfiles, kStub);\n\ndword_result_t XamUserContentRestrictionGetRating_entry(dword_t user_index,\n                                                        dword_t unk1,\n                                                        lpdword_t out_unk2,\n                                                        lpdword_t out_unk3) {\n  if (user_index) {\n    return X_ERROR_NO_SUCH_USER;\n  }\n\n  // Some games have special case paths for 3F that differ from the failure\n  // path, so my guess is that's 'don't care'.\n  *out_unk2 = 0x3F;\n  *out_unk3 = 0;\n  return X_ERROR_SUCCESS;\n}\nDECLARE_XAM_EXPORT1(XamUserContentRestrictionGetRating, kUserProfiles, kStub);\n\ndword_result_t XamUserContentRestrictionCheckAccess_entry(\n    dword_t user_index, dword_t unk1, dword_t unk2, dword_t unk3, dword_t unk4,\n    lpdword_t out_unk5, dword_t overlapped_ptr) {\n  *out_unk5 = 1;\n\n  if (overlapped_ptr) {\n    // TODO(benvanik): does this need the access arg on it?\n    kernel_state()->CompleteOverlappedImmediate(overlapped_ptr,\n                                                X_ERROR_SUCCESS);\n  }\n\n  return X_ERROR_SUCCESS;\n}\nDECLARE_XAM_EXPORT1(XamUserContentRestrictionCheckAccess, kUserProfiles, kStub);\n\ndword_result_t XamUserIsOnlineEnabled_entry(dword_t user_index) { return 1; }\nDECLARE_XAM_EXPORT1(XamUserIsOnlineEnabled, kUserProfiles, kStub);\n\ndword_result_t XamUserGetMembershipTier_entry(dword_t user_index) {\n  if (user_index >= 4) {\n    return X_ERROR_INVALID_PARAMETER;\n  }\n  if (user_index) {\n    return X_ERROR_NO_SUCH_USER;\n  }\n  return 6 /* 6 appears to be Gold */;\n}\nDECLARE_XAM_EXPORT1(XamUserGetMembershipTier, kUserProfiles, kStub);\n\ndword_result_t XamUserAreUsersFriends_entry(dword_t user_index, dword_t unk1,\n                                            dword_t unk2, lpdword_t out_value,\n                                            dword_t overlapped_ptr) {\n  uint32_t are_friends = 0;\n  X_RESULT result;\n\n  if (user_index >= 4) {\n    result = X_ERROR_INVALID_PARAMETER;\n  } else {\n    if (user_index == 0) {\n      const auto& user_profile = kernel_state()->user_profile();\n      if (user_profile->signin_state() == 0) {\n        result = X_ERROR_NOT_LOGGED_ON;\n      } else {\n        // No friends!\n        are_friends = 0;\n        result = X_ERROR_SUCCESS;\n      }\n    } else {\n      // Only support user 0.\n      result =\n          X_ERROR_NO_SUCH_USER;  // if user is local -> X_ERROR_NOT_LOGGED_ON\n    }\n  }\n\n  if (out_value) {\n    assert_true(!overlapped_ptr);\n    *out_value = result == X_ERROR_SUCCESS ? are_friends : 0;\n    return result;\n  } else if (overlapped_ptr) {\n    assert_true(!out_value);\n    kernel_state()->CompleteOverlappedImmediateEx(\n        overlapped_ptr,\n        result == X_ERROR_SUCCESS ? X_ERROR_SUCCESS : X_ERROR_FUNCTION_FAILED,\n        X_HRESULT_FROM_WIN32(result),\n        result == X_ERROR_SUCCESS ? are_friends : 0);\n    return X_ERROR_IO_PENDING;\n  } else {\n    assert_always();\n    return X_ERROR_INVALID_PARAMETER;\n  }\n}\nDECLARE_XAM_EXPORT1(XamUserAreUsersFriends, kUserProfiles, kStub);\n\ndword_result_t XamShowSigninUI_entry(dword_t unk, dword_t unk_mask) {\n  // Mask values vary. Probably matching user types? Local/remote?\n\n  // To fix game modes that display a 4 profile signin UI (even if playing\n  // alone):\n  // XN_SYS_SIGNINCHANGED\n  kernel_state()->BroadcastNotification(0x0000000A, 1);\n  // Games seem to sit and loop until we trigger this notification:\n  // XN_SYS_UI (off)\n  kernel_state()->BroadcastNotification(0x00000009, 0);\n  return X_ERROR_SUCCESS;\n}\nDECLARE_XAM_EXPORT1(XamShowSigninUI, kUserProfiles, kStub);\n\n// TODO(gibbed): probably a FILETIME/LARGE_INTEGER, unknown currently\nstruct X_ACHIEVEMENT_UNLOCK_TIME {\n  xe::be<uint32_t> unk_0;\n  xe::be<uint32_t> unk_4;\n};\n\nstruct X_ACHIEVEMENT_DETAILS {\n  xe::be<uint32_t> id;\n  xe::be<uint32_t> label_ptr;\n  xe::be<uint32_t> description_ptr;\n  xe::be<uint32_t> unachieved_ptr;\n  xe::be<uint32_t> image_id;\n  xe::be<uint32_t> gamerscore;\n  X_ACHIEVEMENT_UNLOCK_TIME unlock_time;\n  xe::be<uint32_t> flags;\n\n  static const size_t kStringBufferSize = 464;\n};\nstatic_assert_size(X_ACHIEVEMENT_DETAILS, 36);\n\nclass XStaticAchievementEnumerator : public XEnumerator {\n public:\n  struct AchievementDetails {\n    uint32_t id;\n    std::u16string label;\n    std::u16string description;\n    std::u16string unachieved;\n    uint32_t image_id;\n    uint32_t gamerscore;\n    struct {\n      uint32_t unk_0;\n      uint32_t unk_4;\n    } unlock_time;\n    uint32_t flags;\n  };\n\n  XStaticAchievementEnumerator(KernelState* kernel_state,\n                               size_t items_per_enumerate, uint32_t flags)\n      : XEnumerator(\n            kernel_state, items_per_enumerate,\n            sizeof(X_ACHIEVEMENT_DETAILS) +\n                (!!(flags & 7) ? X_ACHIEVEMENT_DETAILS::kStringBufferSize : 0)),\n        flags_(flags) {}\n\n  void AppendItem(AchievementDetails item) {\n    items_.push_back(std::move(item));\n  }\n\n  uint32_t WriteItems(uint32_t buffer_ptr, uint8_t* buffer_data,\n                      uint32_t* written_count) override {\n    size_t count =\n        std::min(items_.size() - current_item_, items_per_enumerate());\n    if (!count) {\n      return X_ERROR_NO_MORE_FILES;\n    }\n\n    size_t size = count * item_size();\n\n    auto details = reinterpret_cast<X_ACHIEVEMENT_DETAILS*>(buffer_data);\n    size_t string_offset =\n        items_per_enumerate() * sizeof(X_ACHIEVEMENT_DETAILS);\n    auto string_buffer =\n        StringBuffer{buffer_ptr + static_cast<uint32_t>(string_offset),\n                     &buffer_data[string_offset],\n                     count * X_ACHIEVEMENT_DETAILS::kStringBufferSize};\n    for (size_t i = 0, o = current_item_; i < count; ++i, ++current_item_) {\n      const auto& item = items_[current_item_];\n      details[i].id = item.id;\n      details[i].label_ptr =\n          !!(flags_ & 1) ? AppendString(string_buffer, item.label) : 0;\n      details[i].description_ptr =\n          !!(flags_ & 2) ? AppendString(string_buffer, item.description) : 0;\n      details[i].unachieved_ptr =\n          !!(flags_ & 4) ? AppendString(string_buffer, item.unachieved) : 0;\n      details[i].image_id = item.image_id;\n      details[i].gamerscore = item.gamerscore;\n      details[i].unlock_time.unk_0 = item.unlock_time.unk_0;\n      details[i].unlock_time.unk_4 = item.unlock_time.unk_4;\n      details[i].flags = item.flags;\n    }\n\n    if (written_count) {\n      *written_count = static_cast<uint32_t>(count);\n    }\n\n    return X_ERROR_SUCCESS;\n  }\n\n private:\n  struct StringBuffer {\n    uint32_t ptr;\n    uint8_t* data;\n    size_t remaining_bytes;\n  };\n\n  uint32_t AppendString(StringBuffer& sb, const std::u16string_view string) {\n    size_t count = string.length() + 1;\n    size_t size = count * sizeof(char16_t);\n    if (size > sb.remaining_bytes) {\n      assert_always();\n      return 0;\n    }\n    auto ptr = sb.ptr;\n    string_util::copy_and_swap_truncating(reinterpret_cast<char16_t*>(sb.data),\n                                          string, count);\n    sb.ptr += static_cast<uint32_t>(size);\n    sb.data += size;\n    sb.remaining_bytes -= size;\n    return ptr;\n  }\n\n private:\n  uint32_t flags_;\n  std::vector<AchievementDetails> items_;\n  size_t current_item_ = 0;\n};\n\ndword_result_t XamUserCreateAchievementEnumerator_entry(\n    dword_t title_id, dword_t user_index, dword_t xuid, dword_t flags,\n    dword_t offset, dword_t count, lpdword_t buffer_size_ptr,\n    lpdword_t handle_ptr) {\n  if (!count || !buffer_size_ptr || !handle_ptr) {\n    return X_ERROR_INVALID_PARAMETER;\n  }\n\n  if (user_index >= 4) {\n    return X_ERROR_INVALID_PARAMETER;\n  }\n\n  size_t entry_size = sizeof(X_ACHIEVEMENT_DETAILS);\n  if (flags & 7) {\n    entry_size += X_ACHIEVEMENT_DETAILS::kStringBufferSize;\n  }\n\n  if (buffer_size_ptr) {\n    *buffer_size_ptr = static_cast<uint32_t>(entry_size) * count;\n  }\n\n  auto e = object_ref<XStaticAchievementEnumerator>(\n      new XStaticAchievementEnumerator(kernel_state(), count, flags));\n  auto result = e->Initialize(user_index, 0xFB, 0xB000A, 0xB000B, 0);\n  if (XFAILED(result)) {\n    return result;\n  }\n\n  const util::XdbfGameData db = kernel_state()->title_xdbf();\n\n  if (db.is_valid()) {\n    const XLanguage language =\n        db.GetExistingLanguage(static_cast<XLanguage>(cvars::user_language));\n    const std::vector<util::XdbfAchievementTableEntry> achievement_list =\n        db.GetAchievements();\n\n    for (const util::XdbfAchievementTableEntry& entry : achievement_list) {\n      auto item = XStaticAchievementEnumerator::AchievementDetails{\n          entry.id,\n          xe::to_utf16(db.GetStringTableEntry(language, entry.label_id)),\n          xe::to_utf16(db.GetStringTableEntry(language, entry.description_id)),\n          xe::to_utf16(db.GetStringTableEntry(language, entry.unachieved_id)),\n          entry.image_id,\n          entry.gamerscore,\n          {0, 0},\n          entry.flags};\n\n      e->AppendItem(item);\n    }\n  }\n\n  *handle_ptr = e->handle();\n  return X_ERROR_SUCCESS;\n}\nDECLARE_XAM_EXPORT1(XamUserCreateAchievementEnumerator, kUserProfiles,\n                    kSketchy);\n\ndword_result_t XamParseGamerTileKey_entry(lpdword_t key_ptr, lpdword_t out1_ptr,\n                                          lpdword_t out2_ptr,\n                                          lpdword_t out3_ptr) {\n  *out1_ptr = 0xC0DE0001;\n  *out2_ptr = 0xC0DE0002;\n  *out3_ptr = 0xC0DE0003;\n  return X_ERROR_SUCCESS;\n}\nDECLARE_XAM_EXPORT1(XamParseGamerTileKey, kUserProfiles, kStub);\n\ndword_result_t XamReadTileToTexture_entry(dword_t unknown, dword_t title_id,\n                                          qword_t tile_id, dword_t user_index,\n                                          lpvoid_t buffer_ptr, dword_t stride,\n                                          dword_t height,\n                                          dword_t overlapped_ptr) {\n  // TODO(gibbed): unknown=0,2,3,9\n  if (!tile_id) {\n    return X_ERROR_INVALID_PARAMETER;\n  }\n\n  size_t size = size_t(stride) * size_t(height);\n  std::memset(buffer_ptr, 0xFF, size);\n\n  if (overlapped_ptr) {\n    kernel_state()->CompleteOverlappedImmediate(overlapped_ptr,\n                                                X_ERROR_SUCCESS);\n    return X_ERROR_IO_PENDING;\n  }\n  return X_ERROR_SUCCESS;\n}\nDECLARE_XAM_EXPORT1(XamReadTileToTexture, kUserProfiles, kStub);\n\ndword_result_t XamWriteGamerTile_entry(dword_t arg1, dword_t arg2, dword_t arg3,\n                                       dword_t arg4, dword_t arg5,\n                                       dword_t overlapped_ptr) {\n  if (overlapped_ptr) {\n    kernel_state()->CompleteOverlappedImmediate(overlapped_ptr,\n                                                X_ERROR_SUCCESS);\n    return X_ERROR_IO_PENDING;\n  }\n  return X_ERROR_SUCCESS;\n}\nDECLARE_XAM_EXPORT1(XamWriteGamerTile, kUserProfiles, kStub);\n\ndword_result_t XamSessionCreateHandle_entry(lpdword_t handle_ptr) {\n  *handle_ptr = 0xCAFEDEAD;\n  return X_ERROR_SUCCESS;\n}\nDECLARE_XAM_EXPORT1(XamSessionCreateHandle, kUserProfiles, kStub);\n\ndword_result_t XamSessionRefObjByHandle_entry(dword_t handle,\n                                              lpdword_t obj_ptr) {\n  assert_true(handle == 0xCAFEDEAD);\n  // TODO(PermaNull): Implement this properly,\n  // For the time being returning 0xDEADF00D will prevent crashing.\n  *obj_ptr = 0xDEADF00D;\n  return X_ERROR_SUCCESS;\n}\nDECLARE_XAM_EXPORT1(XamSessionRefObjByHandle, kUserProfiles, kStub);\n\n}  // namespace xam\n}  // namespace kernel\n}  // namespace xe\n\nDECLARE_XAM_EMPTY_REGISTER_EXPORTS(User);\n"
  },
  {
    "path": "src/xenia/kernel/xam/xam_video.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/logging.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/util/shim_utils.h\"\n#include \"xenia/kernel/xam/xam_private.h\"\n#include \"xenia/kernel/xboxkrnl/xboxkrnl_video.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xam {\n\nvoid XGetVideoMode_entry(pointer_t<X_VIDEO_MODE> video_mode) {\n  // TODO(benvanik): actually check to see if these are the same.\n  xboxkrnl::VdQueryVideoMode(std::move(video_mode));\n}\nDECLARE_XAM_EXPORT1(XGetVideoMode, kVideo, ExportTag::kSketchy);\n\ndword_result_t XGetVideoCapabilities_entry() { return 0; }\nDECLARE_XAM_EXPORT1(XGetVideoCapabilities, kVideo, kStub);\n\n}  // namespace xam\n}  // namespace kernel\n}  // namespace xe\n\nDECLARE_XAM_EMPTY_REGISTER_EXPORTS(Video);\n"
  },
  {
    "path": "src/xenia/kernel/xam/xam_voice.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/logging.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/util/shim_utils.h\"\n#include \"xenia/kernel/xam/xam_private.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xam {\n\ndword_result_t XamVoiceIsActiveProcess_entry() {\n  // Returning 0 here will short-circuit a bunch of voice stuff.\n  return 0;\n}\nDECLARE_XAM_EXPORT1(XamVoiceIsActiveProcess, kNone, kStub);\n\ndword_result_t XamVoiceCreate_entry(unknown_t unk1,  // 0\n                                    unknown_t unk2,  // 0xF\n                                    lpdword_t out_voice_ptr) {\n  // Null out the ptr.\n  out_voice_ptr.Zero();\n  return X_ERROR_ACCESS_DENIED;\n}\nDECLARE_XAM_EXPORT1(XamVoiceCreate, kNone, kStub);\n\ndword_result_t XamVoiceClose_entry(lpunknown_t voice_ptr) { return 0; }\nDECLARE_XAM_EXPORT1(XamVoiceClose, kNone, kStub);\n\ndword_result_t XamVoiceHeadsetPresent_entry(lpunknown_t voice_ptr) { return 0; }\nDECLARE_XAM_EXPORT1(XamVoiceHeadsetPresent, kNone, kStub);\n\n}  // namespace xam\n}  // namespace kernel\n}  // namespace xe\n\nDECLARE_XAM_EMPTY_REGISTER_EXPORTS(Voice);\n"
  },
  {
    "path": "src/xenia/kernel/xbdm/xbdm_misc.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/logging.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/util/shim_utils.h\"\n#include \"xenia/kernel/xbdm/xbdm_private.h\"\n#include \"xenia/kernel/xthread.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xbdm {\n\n#define MAKE_DUMMY_STUB_PTR(x)             \\\n  dword_result_t x##_entry() { return 0; } \\\n  DECLARE_XBDM_EXPORT1(x, kDebug, kStub)\n\n#define MAKE_DUMMY_STUB_STATUS(x)                                   \\\n  dword_result_t x##_entry() { return X_STATUS_INVALID_PARAMETER; } \\\n  DECLARE_XBDM_EXPORT1(x, kDebug, kStub)\n\nMAKE_DUMMY_STUB_PTR(DmAllocatePool);\n\nvoid DmCloseLoadedModules_entry(lpdword_t unk0_ptr) {}\nDECLARE_XBDM_EXPORT1(DmCloseLoadedModules, kDebug, kStub);\n\nMAKE_DUMMY_STUB_STATUS(DmFreePool);\n\ndword_result_t DmGetXbeInfo_entry() {\n  // TODO(gibbed): 4D5307DC appears to expect this as success?\n  // Unknown arguments -- let's hope things don't explode.\n  return 0x02DA0000;\n}\nDECLARE_XBDM_EXPORT1(DmGetXbeInfo, kDebug, kStub);\n\nMAKE_DUMMY_STUB_STATUS(DmGetXboxName);\n\ndword_result_t DmIsDebuggerPresent_entry() { return 0; }\nDECLARE_XBDM_EXPORT1(DmIsDebuggerPresent, kDebug, kStub);\n\nMAKE_DUMMY_STUB_STATUS(DmRegisterCommandProcessor);\n\nvoid DmSendNotificationString_entry(lpdword_t unk0_ptr) {}\nDECLARE_XBDM_EXPORT1(DmSendNotificationString, kDebug, kStub);\n\ndword_result_t DmRegisterCommandProcessorEx_entry(lpdword_t name_ptr,\n                                                  lpdword_t handler_fn,\n                                                  dword_t unk3) {\n  // Return success to prevent some games from stalling\n  return X_STATUS_SUCCESS;\n}\nDECLARE_XBDM_EXPORT1(DmRegisterCommandProcessorEx, kDebug, kStub);\n\nMAKE_DUMMY_STUB_STATUS(DmStartProfiling);\nMAKE_DUMMY_STUB_STATUS(DmStopProfiling);\n\ndword_result_t DmCaptureStackBackTrace_entry(lpdword_t unk0_ptr,\n                                             lpdword_t unk1_ptr) {\n  return X_STATUS_INVALID_PARAMETER;\n}\nDECLARE_XBDM_EXPORT1(DmCaptureStackBackTrace, kDebug, kStub);\n\nMAKE_DUMMY_STUB_STATUS(DmGetThreadInfoEx);\nMAKE_DUMMY_STUB_STATUS(DmSetProfilingOptions);\n\ndword_result_t DmWalkLoadedModules_entry(lpdword_t unk0_ptr,\n                                         lpdword_t unk1_ptr) {\n  // Some games will loop forever unless this code is returned\n  return 0x82DA0104;\n}\nDECLARE_XBDM_EXPORT1(DmWalkLoadedModules, kDebug, kStub);\n\nvoid DmMapDevkitDrive_entry() {}\nDECLARE_XBDM_EXPORT1(DmMapDevkitDrive, kDebug, kStub);\n\ndword_result_t DmFindPdbSignature_entry(lpdword_t unk0_ptr,\n                                        lpdword_t unk1_ptr) {\n  return X_STATUS_INVALID_PARAMETER;\n}\nDECLARE_XBDM_EXPORT1(DmFindPdbSignature, kDebug, kStub);\n\n}  // namespace xbdm\n}  // namespace kernel\n}  // namespace xe\n\nDECLARE_XBDM_EMPTY_REGISTER_EXPORTS(Misc);\n"
  },
  {
    "path": "src/xenia/kernel/xbdm/xbdm_module.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/kernel/xbdm/xbdm_module.h\"\n\n#include <vector>\n\n#include \"xenia/base/math.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/xbdm/xbdm_private.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xbdm {\n\nXbdmModule::XbdmModule(Emulator* emulator, KernelState* kernel_state)\n    : KernelModule(kernel_state, \"xe:\\\\xbdm.xex\") {\n  RegisterExportTable(export_resolver_);\n\n  // Register all exported functions.\n#define XE_MODULE_EXPORT_GROUP(m, n) \\\n  Register##n##Exports(export_resolver_, kernel_state_);\n#include \"xbdm_module_export_groups.inc\"\n#undef XE_MODULE_EXPORT_GROUP\n}\n\nstd::vector<xe::cpu::Export*> xbdm_exports(4096);\n\nxe::cpu::Export* RegisterExport_xbdm(xe::cpu::Export* export_entry) {\n  assert_true(export_entry->ordinal < xbdm_exports.size());\n  xbdm_exports[export_entry->ordinal] = export_entry;\n  return export_entry;\n}\n\nvoid XbdmModule::RegisterExportTable(xe::cpu::ExportResolver* export_resolver) {\n  assert_not_null(export_resolver);\n\n// Build the export table used for resolution.\n#include \"xenia/kernel/util/export_table_pre.inc\"\n  static xe::cpu::Export xbdm_export_table[] = {\n#include \"xenia/kernel/xbdm/xbdm_table.inc\"\n  };\n#include \"xenia/kernel/util/export_table_post.inc\"\n  for (size_t i = 0; i < xe::countof(xbdm_export_table); ++i) {\n    auto& export_entry = xbdm_export_table[i];\n    assert_true(export_entry.ordinal < xbdm_exports.size());\n    if (!xbdm_exports[export_entry.ordinal]) {\n      xbdm_exports[export_entry.ordinal] = &export_entry;\n    }\n  }\n  export_resolver->RegisterTable(\"xbdm.xex\", &xbdm_exports);\n}\n\nXbdmModule::~XbdmModule() {}\n\n}  // namespace xbdm\n}  // namespace kernel\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/kernel/xbdm/xbdm_module.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_KERNEL_XBDM_XBDM_MODULE_H_\n#define XENIA_KERNEL_XBDM_XBDM_MODULE_H_\n\n#include <string>\n\n#include \"xenia/cpu/export_resolver.h\"\n#include \"xenia/kernel/kernel_module.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/xbdm/xbdm_ordinals.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xbdm {\n\nclass XbdmModule : public KernelModule {\n public:\n  XbdmModule(Emulator* emulator, KernelState* kernel_state);\n  virtual ~XbdmModule();\n\n  static void RegisterExportTable(xe::cpu::ExportResolver* export_resolver);\n};\n\n}  // namespace xbdm\n}  // namespace kernel\n}  // namespace xe\n\n#endif  // XENIA_KERNEL_XBDM_XBDM_MODULE_H_\n"
  },
  {
    "path": "src/xenia/kernel/xbdm/xbdm_module_export_groups.inc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n// This is a partial file designed to be included by other files when\n// constructing various tables.\n\nXE_MODULE_EXPORT_GROUP(xbdm, Misc)\n"
  },
  {
    "path": "src/xenia/kernel/xbdm/xbdm_ordinals.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_KERNEL_XBDM_XBDM_ORDINALS_H_\n#define XENIA_KERNEL_XBDM_XBDM_ORDINALS_H_\n\n#include \"xenia/cpu/export_resolver.h\"\n\n// Build an ordinal enum to make it easy to lookup ordinals.\n#include \"xenia/kernel/util/ordinal_table_pre.inc\"\nnamespace ordinals {\nenum {\n#include \"xenia/kernel/xbdm/xbdm_table.inc\"\n};\n}  // namespace ordinals\n#include \"xenia/kernel/util/ordinal_table_post.inc\"\n\n#endif  // XENIA_KERNEL_XBDM_XBDM_ORDINALS_H_\n"
  },
  {
    "path": "src/xenia/kernel/xbdm/xbdm_private.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_KERNEL_XBDM_XBDM_PRIVATE_H_\n#define XENIA_KERNEL_XBDM_XBDM_PRIVATE_H_\n\n#include \"xenia/cpu/export_resolver.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/xbdm/xbdm_ordinals.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xbdm {\n\nxe::cpu::Export* RegisterExport_xbdm(xe::cpu::Export* export_entry);\n\n// Registration functions, one per file.\n#define XE_MODULE_EXPORT_GROUP(m, n)                                  \\\n  void Register##n##Exports(xe::cpu::ExportResolver* export_resolver, \\\n                            KernelState* kernel_state);\n#include \"xbdm_module_export_groups.inc\"\n#undef XE_MODULE_EXPORT_GROUP\n\n}  // namespace xbdm\n}  // namespace kernel\n}  // namespace xe\n\n#endif  // XENIA_KERNEL_XBDM_XBDM_PRIVATE_H_\n"
  },
  {
    "path": "src/xenia/kernel/xbdm/xbdm_table.inc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n// This is a partial file designed to be included by other files when\n// constructing various tables.\n\n// clang-format off\n\nXE_EXPORT(xbdm,     0x00000001, DmAllocatePool,                                             kFunction),\nXE_EXPORT(xbdm,     0x00000002, DmAllocatePoolWithTag,                                      kFunction),\nXE_EXPORT(xbdm,     0x00000003, DmCloseCounters,                                            kFunction),\nXE_EXPORT(xbdm,     0x00000004, DmCloseLoadedModules,                                       kFunction),\nXE_EXPORT(xbdm,     0x00000005, DmCloseModuleSections_,                                     kFunction),\nXE_EXPORT(xbdm,     0x00000006, DmCloseNotificationSession,                                 kFunction),\nXE_EXPORT(xbdm,     0x00000007, DmClosePerformanceCounter,                                  kFunction),\nXE_EXPORT(xbdm,     0x00000008, DmContinueThread,                                           kFunction),\nXE_EXPORT(xbdm,     0x00000009, DmFreePool,                                                 kFunction),\nXE_EXPORT(xbdm,     0x0000000A, DmGetMemory,                                                kFunction),\nXE_EXPORT(xbdm,     0x0000000B, DmGetModuleLongName,                                        kFunction),\nXE_EXPORT(xbdm,     0x0000000C, DmGetProcAddress,                                           kFunction),\nXE_EXPORT(xbdm,     0x0000000D, DmGetThreadContext,                                         kFunction),\nXE_EXPORT(xbdm,     0x0000000F, DmGetThreadList,                                            kFunction),\nXE_EXPORT(xbdm,     0x00000010, DmGetXbeInfo,                                               kFunction),\nXE_EXPORT(xbdm,     0x00000011, DmGetXboxName,                                              kFunction),\nXE_EXPORT(xbdm,     0x00000013, DmGo,                                                       kFunction),\nXE_EXPORT(xbdm,     0x00000014, DmHaltThread,                                               kFunction),\nXE_EXPORT(xbdm,     0x00000015, DmIsDebuggerPresent,                                        kFunction),\nXE_EXPORT(xbdm,     0x00000016, DmIsThreadStopped,                                          kFunction),\nXE_EXPORT(xbdm,     0x00000017, DmLoadExtension,                                            kFunction),\nXE_EXPORT(xbdm,     0x00000018, DmNotify,                                                   kFunction),\nXE_EXPORT(xbdm,     0x00000019, DmOpenNotificationSession,                                  kFunction),\nXE_EXPORT(xbdm,     0x0000001A, DmOpenPerformanceCounter,                                   kFunction),\nXE_EXPORT(xbdm,     0x0000001B, DmQueryPerformanceCounterHandle,                            kFunction),\nXE_EXPORT(xbdm,     0x0000001C, DmReboot,                                                   kFunction),\nXE_EXPORT(xbdm,     0x0000001E, DmRegisterCommandProcessor,                                 kFunction),\nXE_EXPORT(xbdm,     0x00000020, DmRegisterNotificationProcessor,                            kFunction),\nXE_EXPORT(xbdm,     0x00000021, DmRegisterPerformanceCounter,                               kFunction),\nXE_EXPORT(xbdm,     0x00000022, DmRemoveBreakpoint,                                         kFunction),\nXE_EXPORT(xbdm,     0x00000023, DmResumeThread,                                             kFunction),\nXE_EXPORT(xbdm,     0x00000024, DmSendNotificationString,                                   kFunction),\nXE_EXPORT(xbdm,     0x00000025, DmSetBreakpoint,                                            kFunction),\nXE_EXPORT(xbdm,     0x00000026, DmSetDataBreakpoint,                                        kFunction),\nXE_EXPORT(xbdm,     0x00000027, DmSetInitialBreakpoint,                                     kFunction),\nXE_EXPORT(xbdm,     0x00000028, DmSetMemory,                                                kFunction),\nXE_EXPORT(xbdm,     0x00000029, DmSetThreadContext,                                         kFunction),\nXE_EXPORT(xbdm,     0x0000002A, DmSetTitle,                                                 kFunction),\nXE_EXPORT(xbdm,     0x0000002B, DmSetXboxName,                                              kFunction),\nXE_EXPORT(xbdm,     0x0000002D, DmStop,                                                     kFunction),\nXE_EXPORT(xbdm,     0x0000002E, DmStopOn,                                                   kFunction),\nXE_EXPORT(xbdm,     0x00000030, DmSuspendThread,                                            kFunction),\nXE_EXPORT(xbdm,     0x00000031, DmThreadUserData,                                           kFunction),\nXE_EXPORT(xbdm,     0x00000032, DmUnloadExtension,                                          kFunction),\nXE_EXPORT(xbdm,     0x00000033, DmWalkLoadedModules,                                        kFunction),\nXE_EXPORT(xbdm,     0x00000034, DmWalkModuleSections,                                       kFunction),\nXE_EXPORT(xbdm,     0x00000035, DmWalkPerformanceCounters,                                  kFunction),\nXE_EXPORT(xbdm,     0x00000037, DmCloseCounters_0,                                          kFunction),\nXE_EXPORT(xbdm,     0x00000038, DmIsBreakpoint,                                             kFunction),\nXE_EXPORT(xbdm,     0x00000039, DmCloseCounters_1,                                          kFunction),\nXE_EXPORT(xbdm,     0x0000003A, DmSetUserAccess,                                            kFunction),\nXE_EXPORT(xbdm,     0x0000003B, DmGetUserAccess,                                            kFunction),\nXE_EXPORT(xbdm,     0x0000003C, DmWalkUserList,                                             kFunction),\nXE_EXPORT(xbdm,     0x0000003D, DmAddUser,                                                  kFunction),\nXE_EXPORT(xbdm,     0x0000003E, DmEnableSecurity,                                           kFunction),\nXE_EXPORT(xbdm,     0x0000003F, DmIsSecurityEnabled,                                        kFunction),\nXE_EXPORT(xbdm,     0x00000040, DmRemoveUser,                                               kFunction),\nXE_EXPORT(xbdm,     0x00000041, __CAP_Start_Profiling,                                      kFunction),\nXE_EXPORT(xbdm,     0x00000042, __CAP_End_Profiling,                                        kFunction),\nXE_EXPORT(xbdm,     0x00000046, __CAP_Enter_Function,                                       kFunction),\nXE_EXPORT(xbdm,     0x00000047, __CAP_Exit_Function,                                        kFunction),\nXE_EXPORT(xbdm,     0x00000048, DmRegisterCommandProcessorEx,                               kFunction),\nXE_EXPORT(xbdm,     0x00000049, DmStartProfiling,                                           kFunction),\nXE_EXPORT(xbdm,     0x0000004A, DmStopProfiling,                                            kFunction),\nXE_EXPORT(xbdm,     0x0000004B, DmQueryMemoryStatistics,                                    kFunction),\nXE_EXPORT(xbdm,     0x0000004C, DmEnableStackTrace,                                         kFunction),\nXE_EXPORT(xbdm,     0x0000004D, DmQueryAllocationTypeName,                                  kFunction),\nXE_EXPORT(xbdm,     0x0000004E, DmRegisterAllocationType,                                   kFunction),\nXE_EXPORT(xbdm,     0x0000004F, DmInsertAllocationEntry,                                    kFunction),\nXE_EXPORT(xbdm,     0x00000050, DmRemoveAllocationEntry,                                    kFunction),\nXE_EXPORT(xbdm,     0x00000051, DmSetTitleEx,                                               kFunction),\nXE_EXPORT(xbdm,     0x00000052, DmCaptureStackBackTrace,                                    kFunction),\nXE_EXPORT(xbdm,     0x00000053, DmCrashDump,                                                kFunction),\nXE_EXPORT(xbdm,     0x00000054, DmIsFastCAPEnabled,                                         kFunction),\nXE_EXPORT(xbdm,     0x00000055, DmGetFileAccessCount,                                       kFunction),\nXE_EXPORT(xbdm,     0x00000058, DmGetUtilityDriveInfo,                                      kFunction),\nXE_EXPORT(xbdm,     0x00000059, DmGetThreadInfoEx,                                          kFunction),\nXE_EXPORT(xbdm,     0x0000005A, DmSetProfilingOptions,                                      kFunction),\nXE_EXPORT(xbdm,     0x0000005B, DmQuerySystemSettings,                                      kFunction),\nXE_EXPORT(xbdm,     0x0000005C, DmSaveSystemSettings,                                       kFunction),\nXE_EXPORT(xbdm,     0x0000006A, DmpGetPgoModuleHandleForBaseAddress,                        kFunction),\nXE_EXPORT(xbdm,     0x0000006B, DmpOnPgoModuleLoad,                                         kFunction),\nXE_EXPORT(xbdm,     0x0000006C, DmPgoStartDataCollection,                                   kFunction),\nXE_EXPORT(xbdm,     0x0000006D, DmPgoStopDataCollection,                                    kFunction),\nXE_EXPORT(xbdm,     0x0000006E, DmPgoSaveSnapshot,                                          kFunction),\nXE_EXPORT(xbdm,     0x0000006F, IrtClientAbort,                                             kFunction),\nXE_EXPORT(xbdm,     0x00000070, IrtPogoInit,                                                kFunction),\nXE_EXPORT(xbdm,     0x00000071, IrtSetStaticInfo,                                           kFunction),\nXE_EXPORT(xbdm,     0x00000072, IrtAutoSweepW,                                              kFunction),\nXE_EXPORT(xbdm,     0x00000073, IrtAutoSweepA,                                              kFunction),\nXE_EXPORT(xbdm,     0x00000075, DmGetDumpMode,                                              kFunction),\nXE_EXPORT(xbdm,     0x00000076, DmSetDumpMode,                                              kFunction),\nXE_EXPORT(xbdm,     0x00000077, DmGetDumpSettings,                                          kFunction),\nXE_EXPORT(xbdm,     0x00000078, DmSetDumpSettings,                                          kFunction),\nXE_EXPORT(xbdm,     0x00000079, DmGetEventDeferFlags,                                       kFunction),\nXE_EXPORT(xbdm,     0x0000007A, DmSetEventDeferFlags,                                       kFunction),\nXE_EXPORT(xbdm,     0x0000007B, DmWalkCommittedMemory,                                      kFunction),\nXE_EXPORT(xbdm,     0x0000007C, DmCloseCounters_2,                                          kFunction),\nXE_EXPORT(xbdm,     0x0000007D, DmRebootEx,                                                 kFunction),\nXE_EXPORT(xbdm,     0x00000082, DmMountFdfxVolume,                                          kFunction),\nXE_EXPORT(xbdm,     0x00000083, DmCapGetFileHeader,                                         kFunction),\nXE_EXPORT(xbdm,     0x00000084, DmCapFreeFileHeader,                                        kFunction),\nXE_EXPORT(xbdm,     0x00000085, DmTraceStartRecording,                                      kFunction),\nXE_EXPORT(xbdm,     0x00000086, DmTraceStartRecordingFunction,                              kFunction),\nXE_EXPORT(xbdm,     0x00000087, DmTraceSetBufferSize,                                       kFunction),\nXE_EXPORT(xbdm,     0x00000088, DmTraceStopRecording,                                       kFunction),\nXE_EXPORT(xbdm,     0x00000089, DmTraceSaveBuffer,                                          kFunction),\nXE_EXPORT(xbdm,     0x0000008C, DmGetConsoleType,                                           kFunction),\nXE_EXPORT(xbdm,     0x0000008D, DmMapDevkitDrive,                                           kFunction),\nXE_EXPORT(xbdm,     0x0000008E, DmWalkLoadedModulesEx,                                      kFunction),\nXE_EXPORT(xbdm,     0x0000008F, DmGetXexHeaderField,                                        kFunction),\nXE_EXPORT(xbdm,     0x00000090, DmGetMouseChanges,                                          kFunction),\nXE_EXPORT(xbdm,     0x00000091, DmFindPdbSignature,                                         kFunction),\nXE_EXPORT(xbdm,     0x00000092, DmGetProfilingStatus,                                       kFunction),\nXE_EXPORT(xbdm,     0x00000093, DmOpticalDiscLogStart,                                      kFunction),\nXE_EXPORT(xbdm,     0x00000094, DmOpticalDiscLogStop,                                       kFunction),\nXE_EXPORT(xbdm,     0x00000095, DmStartSamplingProfiler,                                    kFunction),\nXE_EXPORT(xbdm,     0x00000096, DmStopSamplingProfiler,                                     kFunction),\nXE_EXPORT(xbdm,     0x00000097, DmGetSamplingProfilerInfo,                                  kFunction),\nXE_EXPORT(xbdm,     0x00000098, DmStartFileEventCapture,                                    kFunction),\nXE_EXPORT(xbdm,     0x00000099, DmStopFileEventCapture,                                     kFunction),\nXE_EXPORT(xbdm,     0x0000009A, DmSetFileEventMarker,                                       kFunction),\nXE_EXPORT(xbdm,     0x0000009B, DmMarkPseudoCreateBegin,                                    kFunction),\nXE_EXPORT(xbdm,     0x0000009C, DmMarkPseudoCreateEnd,                                      kFunction),\nXE_EXPORT(xbdm,     0x0000009D, DmMarkPseudoEventBegin,                                     kFunction),\nXE_EXPORT(xbdm,     0x0000009E, DmMarkPseudoEventEnd,                                       kFunction),\nXE_EXPORT(xbdm,     0x0000009F, DmMarkFileEventWorkerThreadBegin,                           kFunction),\nXE_EXPORT(xbdm,     0x000000A0, DmMarkFileEventWorkerThreadEnd,                             kFunction),\nXE_EXPORT(xbdm,     0x000000A1, DmGetSystemInfo,                                            kFunction),\nXE_EXPORT(xbdm,     0x000000A2, DmAbortProfiling,                                           kFunction),\nXE_EXPORT(xbdm,     0x000000A3, DmNetCaptureStart,                                          kFunction),\nXE_EXPORT(xbdm,     0x000000A4, DmNetCaptureStop,                                           kFunction),\nXE_EXPORT(xbdm,     0x000000A5, DmQueryTitleMemoryStatistics,                               kFunction),\nXE_EXPORT(xbdm,     0x000000A6, DmAutomationGetInputProcess,                                kFunction),\nXE_EXPORT(xbdm,     0x000000A7, DmAutomationBindController,                                 kFunction),\nXE_EXPORT(xbdm,     0x000000A8, DmAutomationUnbindController,                               kFunction),\nXE_EXPORT(xbdm,     0x000000A9, DmAutomationConnectController,                              kFunction),\nXE_EXPORT(xbdm,     0x000000AA, DmAutomationDisconnectController,                           kFunction),\nXE_EXPORT(xbdm,     0x000000AB, DmAutomationSetGamepadState,                                kFunction),\nXE_EXPORT(xbdm,     0x000000AC, DmAutomationQueueGamepadState,                              kFunction),\nXE_EXPORT(xbdm,     0x000000AD, DmAutomationClearGamepadQueue,                              kFunction),\nXE_EXPORT(xbdm,     0x000000AE, DmAutomationQueryGamepadQueue,                              kFunction),\nXE_EXPORT(xbdm,     0x000000AF, DmAutomationGetUserDefaultProfile,                          kFunction),\nXE_EXPORT(xbdm,     0x000000B0, DmAutomationSetUserDefaultProfile,                          kFunction),\nXE_EXPORT(xbdm,     0x000000B1, DmTraceIsRecording,                                         kFunction),\nXE_EXPORT(xbdm,     0x000000B2, DmLoadDebuggerExtension,                                    kFunction),\nXE_EXPORT(xbdm,     0x000000B3, DmUnloadDebuggerExtension,                                  kFunction),\nXE_EXPORT(xbdm,     0x000000B4, DmCreateSystemThread,                                       kFunction),\nXE_EXPORT(xbdm,     0x000000B5, PEPLELookup,                                                kFunction),\nXE_EXPORT(xbdm,     0x000000B6, PEPLELookupCompact,                                         kFunction),\nXE_EXPORT(xbdm,     0x000000B7, PVPLELookup,                                                kFunction),\nXE_EXPORT(xbdm,     0x000000B8, PVPLELookupCompact,                                         kFunction),\nXE_EXPORT(xbdm,     0x000000B9, PVPLELookupCompactMDS,                                      kFunction),\nXE_EXPORT(xbdm,     0x000000BA, PVPLEFilteredLookup,                                        kFunction),\nXE_EXPORT(xbdm,     0x000000BB, PVPLEFilteredLookupCompact,                                 kFunction),\nXE_EXPORT(xbdm,     0x000000BC, PVPLEFilteredLookupCompactMDS,                              kFunction),\nXE_EXPORT(xbdm,     0x000000BD, PVPLETemplatedLookup,                                       kFunction),\nXE_EXPORT(xbdm,     0x000000BE, PVPLETemplatedLookupCompact,                                kFunction),\nXE_EXPORT(xbdm,     0x000000BF, PVPLETemplatedLookupCompactMDS,                             kFunction),\nXE_EXPORT(xbdm,     0x000000C0, DmpPgoCounterOverflow,                                      kFunction),\nXE_EXPORT(xbdm,     0x000000C1, UpdateMDSProbeState,                                        kFunction),\nXE_EXPORT(xbdm,     0x000000C2, DmGetHttpRegistration,                                      kFunction),\nXE_EXPORT(xbdm,     0x000000C3, DmTraceSetIOThread,                                         kFunction),\nXE_EXPORT(xbdm,     0x000000C4, DmPMCInstallAndStart,                                       kFunction),\nXE_EXPORT(xbdm,     0x000000C5, DmPMCStopAndReport,                                         kFunction),\nXE_EXPORT(xbdm,     0x000000C6, DmPMCInstallSetup,                                          kFunction),\nXE_EXPORT(xbdm,     0x000000C7, DmPMCUnInstallSetup,                                        kFunction),\nXE_EXPORT(xbdm,     0x000000C8, DmPMCResetCounters,                                         kFunction),\nXE_EXPORT(xbdm,     0x000000C9, DmPMCSetTriggerProcessor,                                   kFunction),\nXE_EXPORT(xbdm,     0x000000CA, DmPMCStart,                                                 kFunction),\nXE_EXPORT(xbdm,     0x000000CB, DmPMCStop,                                                  kFunction),\nXE_EXPORT(xbdm,     0x000000CC, DmPMCGetCounter,                                            kFunction),\nXE_EXPORT(xbdm,     0x000000CD, DmPMCGetCounters,                                           kFunction),\nXE_EXPORT(xbdm,     0x000000CE, DmPMCGetCounterName,                                        kFunction),\nXE_EXPORT(xbdm,     0x000000CF, DmPMCDumpCounters,                                          kFunction),\nXE_EXPORT(xbdm,     0x000000D0, DmPMCDumpCountersVerbose,                                   kFunction),\nXE_EXPORT(xbdm,     0x000000D1, DmPMCGetCounterCostEstimate,                                kFunction),\nXE_EXPORT(xbdm,     0x000000D2, DmPMCGetCounterSource,                                      kFunction),\nXE_EXPORT(xbdm,     0x000000D3, DmPMCComputeFrequency,                                      kFunction),\nXE_EXPORT(xbdm,     0x000000D4, DmGetAdditionalTitleMemorySetting,                          kFunction),\nXE_EXPORT(xbdm,     0x000000D5, DmGetDebugMemorySize,                                       kFunction),\nXE_EXPORT(xbdm,     0x000000D6, DmGetConsoleDebugMemoryStatus,                              kFunction),\nXE_EXPORT(xbdm,     0x000000D7, DmNetSimSetLinkStatusHidden,                                kFunction),\nXE_EXPORT(xbdm,     0x000000D8, DmNetSimInsertQueue,                                        kFunction),\nXE_EXPORT(xbdm,     0x000000D9, DmNetSimRemoveQueue,                                        kFunction),\nXE_EXPORT(xbdm,     0x000000DA, DmNetSimRemoveAllQueues,                                    kFunction),\nXE_EXPORT(xbdm,     0x000000DB, DmNetSimModifyQueueSettings,                                kFunction),\nXE_EXPORT(xbdm,     0x000000DC, DmGetConsoleFeatures,                                       kFunction),\nXE_EXPORT(xbdm,     0x000000DD, DmNetSimGetQueueStats,                                      kFunction),\nXE_EXPORT(xbdm,     0x000000DE, DmNetSimGetQueueSettings,                                   kFunction),\nXE_EXPORT(xbdm,     0x000000DF, DmNetSimGetNumQueues,                                       kFunction),\nXE_EXPORT(xbdm,     0x000000E0, DmNetSimInsertIpv4Redirect,                                 kFunction),\nXE_EXPORT(xbdm,     0x000000E1, DmNetSimRemoveIpv4Redirect,                                 kFunction),\nXE_EXPORT(xbdm,     0x000000E2, DmNetSimGetNumIpv4Redirects,                                kFunction),\nXE_EXPORT(xbdm,     0x0000012C, XLFAllocate,                                                kFunction),\nXE_EXPORT(xbdm,     0x0000012D, XLFFree,                                                    kFunction),\nXE_EXPORT(xbdm,     0x0000012E, XLFQueueAdd,                                                kFunction),\nXE_EXPORT(xbdm,     0x0000012F, XLFQueueAllocated,                                          kFunction),\nXE_EXPORT(xbdm,     0x00000130, XLFQueueCreate,                                             kFunction),\nXE_EXPORT(xbdm,     0x00000131, XLFQueueDestroy,                                            kFunction),\nXE_EXPORT(xbdm,     0x00000132, XLFQueueGetEntryCount,                                      kFunction),\nXE_EXPORT(xbdm,     0x00000133, XLFQueueIsEmpty,                                            kFunction),\nXE_EXPORT(xbdm,     0x00000134, XLFQueueRemove,                                             kFunction),\nXE_EXPORT(xbdm,     0x00000135, XLFQueueUnsafeDump,                                         kFunction),\nXE_EXPORT(xbdm,     0x00000136, XLFStackAllocated,                                          kFunction),\nXE_EXPORT(xbdm,     0x00000137, XLFStackCreate,                                             kFunction),\nXE_EXPORT(xbdm,     0x00000138, XLFStackDestroy,                                            kFunction),\nXE_EXPORT(xbdm,     0x00000139, XLFStackGetEntryCount,                                      kFunction),\nXE_EXPORT(xbdm,     0x0000013A, XLFStackIsEmpty,                                            kFunction),\nXE_EXPORT(xbdm,     0x0000013B, XLFStackPop,                                                kFunction),\nXE_EXPORT(xbdm,     0x0000013C, XLFStackPush,                                               kFunction),\nXE_EXPORT(xbdm,     0x0000013D, XLFStackUnsafeDump,                                         kFunction),\nXE_EXPORT(xbdm,     0x00000140, XLFPriorityQueueAdd,                                        kFunction),\nXE_EXPORT(xbdm,     0x00000141, XLFPriorityQueueAllocated,                                  kFunction),\nXE_EXPORT(xbdm,     0x00000142, XLFPriorityQueueCreate,                                     kFunction),\nXE_EXPORT(xbdm,     0x00000143, XLFPriorityQueueDestroy,                                    kFunction),\nXE_EXPORT(xbdm,     0x00000144, XLFPriorityQueueGetEntryCount,                              kFunction),\nXE_EXPORT(xbdm,     0x00000145, XLFPriorityQueueIsEmpty,                                    kFunction),\nXE_EXPORT(xbdm,     0x00000146, XLFPriorityQueueRemoveFirst,                                kFunction),\nXE_EXPORT(xbdm,     0x00000147, XLFPriorityQueueRemove,                                     kFunction),\nXE_EXPORT(xbdm,     0x00000148, XLFPriorityQueueUnsafeDump,                                 kFunction),\nXE_EXPORT(xbdm,     0x0000014A, XLFHashTableAdd,                                            kFunction),\nXE_EXPORT(xbdm,     0x0000014B, XLFHashTableAllocated,                                      kFunction),\nXE_EXPORT(xbdm,     0x0000014C, XLFHashTableCreate,                                         kFunction),\nXE_EXPORT(xbdm,     0x0000014D, XLFHashTableDestroy,                                        kFunction),\nXE_EXPORT(xbdm,     0x0000014E, XLFHashTableGetEntryCount,                                  kFunction),\nXE_EXPORT(xbdm,     0x0000014F, XLFHashTableIsEmpty,                                        kFunction),\nXE_EXPORT(xbdm,     0x00000150, XLFHashTableRemoveFirst,                                    kFunction),\nXE_EXPORT(xbdm,     0x00000151, XLFHashTableRemove,                                         kFunction),\nXE_EXPORT(xbdm,     0x00000152, XLFHashTableUnsafeDump,                                     kFunction),\nXE_EXPORT(xbdm,     0x00000154, XLFPoolAcquireLock,                                         kFunction),\nXE_EXPORT(xbdm,     0x00000155, XLFPoolAllocated,                                           kFunction),\nXE_EXPORT(xbdm,     0x00000156, XLFPoolCreate,                                              kFunction),\nXE_EXPORT(xbdm,     0x00000157, XLFPoolCreateLock,                                          kFunction),\nXE_EXPORT(xbdm,     0x00000158, XLFPoolDestroy,                                             kFunction),\nXE_EXPORT(xbdm,     0x00000159, XLFPoolDestroyLock,                                         kFunction),\nXE_EXPORT(xbdm,     0x0000015A, XLFPoolIncreaseEvents,                                      kFunction),\nXE_EXPORT(xbdm,     0x0000015B, XLFPoolIncreaseLocks,                                       kFunction),\nXE_EXPORT(xbdm,     0x0000015C, XLFPoolInitializeLock,                                      kFunction),\nXE_EXPORT(xbdm,     0x0000015D, XLFPoolNumberOfEvents,                                      kFunction),\nXE_EXPORT(xbdm,     0x0000015E, XLFPoolNumberOfLocks,                                       kFunction),\nXE_EXPORT(xbdm,     0x0000015F, XLFPoolReleaseLock,                                         kFunction),\nXE_EXPORT(xbdm,     0x00000163, XLFStartLog,                                                kFunction),\nXE_EXPORT(xbdm,     0x00000164, XLFStartUserLog,                                            kFunction),\nXE_EXPORT(xbdm,     0x00000165, XLFInitializeLog,                                           kFunction),\nXE_EXPORT(xbdm,     0x00000166, XLFInitializeUserLog,                                       kFunction),\nXE_EXPORT(xbdm,     0x00000168, XLFEndLog,                                                  kFunction),\nXE_EXPORT(xbdm,     0x00000169, XLFLogPrint,                                                kFunction),\nXE_EXPORT(xbdm,     0x0000016A, XLFLogPrintV,                                               kFunction),\nXE_EXPORT(xbdm,     0x0000016B, XLFLogBuffer,                                               kFunction),\nXE_EXPORT(xbdm,     0x0000016C, XLFLogMessageStats,                                         kFunction),\nXE_EXPORT(xbdm,     0x00000172, XLockFreeGetErrorHandler,                                   kFunction),\nXE_EXPORT(xbdm,     0x00000173, XLockFreeSetErrorHandler,                                   kFunction),\nXE_EXPORT(xbdm,     0x00000174, DmExecuteThreadRPC,                                         kFunction),\nXE_EXPORT(xbdm,     0x00000175, DmGetDebuggerConnection,                                    kFunction),\n"
  },
  {
    "path": "src/xenia/kernel/xboxkrnl/cert_monitor.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/kernel/xboxkrnl/xboxkrnl_module.h\"\n\n#include <vector>\n\n#include \"xenia/base/clock.h\"\n#include \"xenia/base/debugging.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/cpu/ppc/ppc_context.h\"\n#include \"xenia/cpu/processor.h\"\n#include \"xenia/emulator.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/user_module.h\"\n#include \"xenia/kernel/xboxkrnl/xboxkrnl_private.h\"\n#include \"xenia/kernel/xthread.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xboxkrnl {\n\nvoid KeCertMonitorCallback(cpu::ppc::PPCContext* ppc_context,\n                           kernel::KernelState* kernel_state) {\n  auto id = ppc_context->r[3];\n  auto arg = ppc_context->r[4];\n  XELOGI(\"KeCertMonitorCallback({}, {:08X})\", id, arg);\n  auto xboxkrnl = kernel_state->GetKernelModule<XboxkrnlModule>(\"xboxkrnl.exe\");\n}\n\n}  // namespace xboxkrnl\n}  // namespace kernel\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/kernel/xboxkrnl/cert_monitor.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_KERNEL_KERNEL_XBOXKRNL_CERT_MONITOR_H_\n#define XENIA_KERNEL_KERNEL_XBOXKRNL_CERT_MONITOR_H_\n\n#include <memory>\n\n#include \"xenia/base/threading.h\"\n#include \"xenia/cpu/export_resolver.h\"\n#include \"xenia/kernel/kernel_module.h\"\n#include \"xenia/kernel/kernel_state.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xboxkrnl {\n\nstruct X_KECERTMONITORDATA {\n  xe::be<uint32_t> callback_fn;\n};\n\nvoid KeCertMonitorCallback(cpu::ppc::PPCContext* ppc_context,\n                           kernel::KernelState* kernel_state);\n\n}  // namespace xboxkrnl\n}  // namespace kernel\n}  // namespace xe\n\n#endif  // XENIA_KERNEL_KERNEL_XBOXKRNL_CERT_MONITOR_H_\n"
  },
  {
    "path": "src/xenia/kernel/xboxkrnl/debug_monitor.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/kernel/xboxkrnl/xboxkrnl_module.h\"\n\n#include <vector>\n\n#include \"xenia/base/clock.h\"\n#include \"xenia/base/debugging.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/cpu/ppc/ppc_context.h\"\n#include \"xenia/cpu/processor.h\"\n#include \"xenia/emulator.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/user_module.h\"\n#include \"xenia/kernel/util/shim_utils.h\"\n#include \"xenia/kernel/xboxkrnl/xboxkrnl_private.h\"\n#include \"xenia/kernel/xthread.h\"\n\nDECLARE_bool(kernel_pix);\n\nnamespace xe {\nnamespace kernel {\nnamespace xboxkrnl {\n\nenum class DebugMonitorCommand {\n  PIXCommandResult = 27,\n  SetPIXCallback = 28,\n  Unknown66 = 66,\n  Unknown89 = 89,\n  Unknown94 = 94,\n};\n\nvoid KeDebugMonitorCallback(cpu::ppc::PPCContext* ppc_context,\n                            kernel::KernelState* kernel_state) {\n  auto id = static_cast<DebugMonitorCommand>(ppc_context->r[3] & 0xFFFFFFFFu);\n  auto arg = static_cast<uint32_t>(ppc_context->r[4] & 0xFFFFFFFFu);\n\n  XELOGI(\"KeDebugMonitorCallback({}, {:08X})\", static_cast<uint32_t>(id), arg);\n\n  if (!cvars::kernel_pix) {\n    SHIM_SET_RETURN_32(-1);\n    return;\n  }\n\n  auto xboxkrnl = kernel_state->GetKernelModule<XboxkrnlModule>(\"xboxkrnl.exe\");\n\n  switch (id) {\n    case DebugMonitorCommand::PIXCommandResult: {\n      auto s = kernel_state->memory()->TranslateVirtual<const char*>(arg);\n      debugging::DebugPrint(\"{}\\n\", s);\n      XELOGD(\"PIX command result: {}\\n\", s);\n      if (strcmp(s, \"PIX!{CaptureFileCreationEnded} 0x00000000\") == 0) {\n        xboxkrnl->SendPIXCommand(\"{BeginCapture}\");\n      }\n      SHIM_SET_RETURN_32(0);\n      break;\n    }\n    case DebugMonitorCommand::SetPIXCallback:\n      xboxkrnl->set_pix_function(arg);\n      xboxkrnl->SendPIXCommand(\"{LimitCaptureSize} 100\");  // in MB\n      xboxkrnl->SendPIXCommand(\"{BeginCaptureFileCreation} scratch:\\\\test.cap\");\n      SHIM_SET_RETURN_32(0);\n      break;\n    case DebugMonitorCommand::Unknown66: {\n      struct callback_info {\n        xe::be<uint32_t> callback_fn;\n        xe::be<uint32_t> callback_arg;  // D3D device object?\n      };\n      auto cbi = kernel_state->memory()->TranslateVirtual<callback_info*>(arg);\n      SHIM_SET_RETURN_32(0);\n      break;\n    }\n    case DebugMonitorCommand::Unknown89:\n      // arg = function pointer?\n      SHIM_SET_RETURN_32(0);\n      break;\n    case DebugMonitorCommand::Unknown94:\n      // xboxkrnl->SendPIXCommand(\"{EndCapture}\");\n      SHIM_SET_RETURN_32(0);\n      break;\n    default:\n      SHIM_SET_RETURN_32(-1);\n      break;\n  }\n}\n\n}  // namespace xboxkrnl\n}  // namespace kernel\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/kernel/xboxkrnl/debug_monitor.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_KERNEL_KERNEL_XBOXKRNL_DEBUG_MONITOR_H_\n#define XENIA_KERNEL_KERNEL_XBOXKRNL_DEBUG_MONITOR_H_\n\n#include <memory>\n\n#include \"xenia/base/threading.h\"\n#include \"xenia/cpu/export_resolver.h\"\n#include \"xenia/kernel/kernel_module.h\"\n#include \"xenia/kernel/kernel_state.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xboxkrnl {\n\nstruct X_KEDEBUGMONITORDATA {\n  xe::be<uint32_t> unk_00;       // 0x00\n  xe::be<uint32_t> unk_04;       // 0x04\n  xe::be<uint32_t> unk_08;       // 0x08\n  xe::be<uint32_t> unk_0C;       // 0x0C\n  xe::be<uint32_t> unk_10;       // 0x10\n  xe::be<uint32_t> unk_14;       // 0x14\n  xe::be<uint32_t> callback_fn;  // 0x18 function\n  xe::be<uint32_t> unk_1C;       // 0x1C\n  xe::be<uint32_t> unk_20;       // 0x20 Vd graphics data?\n};\n\nvoid KeDebugMonitorCallback(cpu::ppc::PPCContext* ppc_context,\n                            kernel::KernelState* kernel_state);\n\n}  // namespace xboxkrnl\n}  // namespace kernel\n}  // namespace xe\n\n#endif  // XENIA_KERNEL_KERNEL_DEBUG_MONITOR_H_\n"
  },
  {
    "path": "src/xenia/kernel/xboxkrnl/xboxkrnl_audio.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/apu/audio_system.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/emulator.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/util/shim_utils.h\"\n#include \"xenia/kernel/xboxkrnl/xboxkrnl_private.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xboxkrnl {\n\ndword_result_t XAudioGetSpeakerConfig_entry(lpdword_t config_ptr) {\n  *config_ptr = 0x00010001;\n  return X_ERROR_SUCCESS;\n}\nDECLARE_XBOXKRNL_EXPORT1(XAudioGetSpeakerConfig, kAudio, kImplemented);\n\ndword_result_t XAudioGetVoiceCategoryVolumeChangeMask_entry(\n    lpunknown_t driver_ptr, lpdword_t out_ptr) {\n  assert_true((driver_ptr.guest_address() & 0xFFFF0000) == 0x41550000);\n\n  xe::threading::MaybeYield();\n\n  // Checking these bits to see if any voice volume changed.\n  // I think.\n  *out_ptr = 0;\n  return X_ERROR_SUCCESS;\n}\nDECLARE_XBOXKRNL_EXPORT2(XAudioGetVoiceCategoryVolumeChangeMask, kAudio, kStub,\n                         kHighFrequency);\n\ndword_result_t XAudioGetVoiceCategoryVolume_entry(dword_t unk,\n                                                  lpfloat_t out_ptr) {\n  // Expects a floating point single. Volume %?\n  *out_ptr = 1.0f;\n\n  return X_ERROR_SUCCESS;\n}\nDECLARE_XBOXKRNL_EXPORT2(XAudioGetVoiceCategoryVolume, kAudio, kStub,\n                         kHighFrequency);\n\ndword_result_t XAudioEnableDucker_entry(dword_t unk) { return X_ERROR_SUCCESS; }\nDECLARE_XBOXKRNL_EXPORT1(XAudioEnableDucker, kAudio, kStub);\n\ndword_result_t XAudioRegisterRenderDriverClient_entry(lpdword_t callback_ptr,\n                                                      lpdword_t driver_ptr) {\n  uint32_t callback = callback_ptr[0];\n  uint32_t callback_arg = callback_ptr[1];\n\n  auto audio_system = kernel_state()->emulator()->audio_system();\n\n  size_t index;\n  auto result = audio_system->RegisterClient(callback, callback_arg, &index);\n  if (XFAILED(result)) {\n    return result;\n  }\n\n  assert_true(!(index & ~0x0000FFFF));\n  *driver_ptr = 0x41550000 | (static_cast<uint32_t>(index) & 0x0000FFFF);\n  return X_ERROR_SUCCESS;\n}\nDECLARE_XBOXKRNL_EXPORT1(XAudioRegisterRenderDriverClient, kAudio,\n                         kImplemented);\n\ndword_result_t XAudioUnregisterRenderDriverClient_entry(\n    lpunknown_t driver_ptr) {\n  assert_true((driver_ptr.guest_address() & 0xFFFF0000) == 0x41550000);\n\n  auto audio_system = kernel_state()->emulator()->audio_system();\n  audio_system->UnregisterClient(driver_ptr.guest_address() & 0x0000FFFF);\n  return X_ERROR_SUCCESS;\n}\nDECLARE_XBOXKRNL_EXPORT1(XAudioUnregisterRenderDriverClient, kAudio,\n                         kImplemented);\n\ndword_result_t XAudioSubmitRenderDriverFrame_entry(lpunknown_t driver_ptr,\n                                                   lpunknown_t samples_ptr) {\n  assert_true((driver_ptr.guest_address() & 0xFFFF0000) == 0x41550000);\n\n  auto audio_system = kernel_state()->emulator()->audio_system();\n  audio_system->SubmitFrame(driver_ptr.guest_address() & 0x0000FFFF,\n                            samples_ptr);\n\n  return X_ERROR_SUCCESS;\n}\nDECLARE_XBOXKRNL_EXPORT2(XAudioSubmitRenderDriverFrame, kAudio, kImplemented,\n                         kHighFrequency);\n\n}  // namespace xboxkrnl\n}  // namespace kernel\n}  // namespace xe\n\nDECLARE_XBOXKRNL_EMPTY_REGISTER_EXPORTS(Audio);\n"
  },
  {
    "path": "src/xenia/kernel/xboxkrnl/xboxkrnl_audio_xma.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include <cstring>\n\n#include \"xenia/apu/audio_system.h\"\n#include \"xenia/apu/xma_decoder.h\"\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/emulator.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/util/shim_utils.h\"\n#include \"xenia/kernel/xboxkrnl/xboxkrnl_private.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xboxkrnl {\n\nusing xe::apu::XMA_CONTEXT_DATA;\n\n// See audio_system.cc for implementation details.\n//\n// XMA details:\n// https://devel.nuclex.org/external/svn/directx/trunk/include/xma2defs.h\n// https://github.com/gdawg/fsbext/blob/master/src/xma_header.h\n//\n// XMA is undocumented, but the methods are pretty simple.\n// Games do this sequence to decode (now):\n//   (not sure we are setting buffer validity/offsets right)\n// d> XMACreateContext(20656800)\n// d> XMAIsInputBuffer0Valid(000103E0)\n// d> XMAIsInputBuffer1Valid(000103E0)\n// d> XMADisableContext(000103E0, 0)\n// d> XMABlockWhileInUse(000103E0)\n// d> XMAInitializeContext(000103E0, 20008810)\n// d> XMASetOutputBufferValid(000103E0)\n// d> XMASetInputBuffer0Valid(000103E0)\n// d> XMAEnableContext(000103E0)\n// d> XMAGetOutputBufferWriteOffset(000103E0)\n// d> XMAGetOutputBufferReadOffset(000103E0)\n// d> XMAIsOutputBufferValid(000103E0)\n// d> XMAGetOutputBufferReadOffset(000103E0)\n// d> XMAGetOutputBufferWriteOffset(000103E0)\n// d> XMAIsInputBuffer0Valid(000103E0)\n// d> XMAIsInputBuffer1Valid(000103E0)\n// d> XMAIsInputBuffer0Valid(000103E0)\n// d> XMAIsInputBuffer1Valid(000103E0)\n// d> XMAReleaseContext(000103E0)\n//\n// XAudio2 uses XMA under the covers, and seems to map with the same\n// restrictions of frame/subframe/etc:\n// https://msdn.microsoft.com/en-us/library/windows/desktop/microsoft.directx_sdk.xaudio2.xaudio2_buffer(v=vs.85).aspx\n\ndword_result_t XMACreateContext_entry(lpdword_t context_out_ptr) {\n  auto xma_decoder = kernel_state()->emulator()->audio_system()->xma_decoder();\n  uint32_t context_ptr = xma_decoder->AllocateContext();\n  *context_out_ptr = context_ptr;\n  if (!context_ptr) {\n    return X_STATUS_NO_MEMORY;\n  }\n  return X_STATUS_SUCCESS;\n}\nDECLARE_XBOXKRNL_EXPORT2(XMACreateContext, kAudio, kImplemented,\n                         kHighFrequency);\n\ndword_result_t XMAReleaseContext_entry(lpvoid_t context_ptr) {\n  auto xma_decoder = kernel_state()->emulator()->audio_system()->xma_decoder();\n  xma_decoder->ReleaseContext(context_ptr);\n  return 0;\n}\nDECLARE_XBOXKRNL_EXPORT2(XMAReleaseContext, kAudio, kImplemented,\n                         kHighFrequency);\n\nvoid StoreXmaContextIndexedRegister(KernelState* kernel_state,\n                                    uint32_t base_reg, uint32_t context_ptr) {\n  uint32_t context_physical_address =\n      kernel_memory()->GetPhysicalAddress(context_ptr);\n  assert_true(context_physical_address != UINT32_MAX);\n  auto xma_decoder = kernel_state->emulator()->audio_system()->xma_decoder();\n  uint32_t hw_index =\n      (context_physical_address - xma_decoder->context_array_ptr()) /\n      sizeof(XMA_CONTEXT_DATA);\n  uint32_t reg_num = base_reg + (hw_index >> 5) * 4;\n  uint32_t reg_value = 1 << (hw_index & 0x1F);\n  xma_decoder->WriteRegister(reg_num, xe::byte_swap(reg_value));\n}\n\nstruct XMA_LOOP_DATA {\n  xe::be<uint32_t> loop_start;\n  xe::be<uint32_t> loop_end;\n  uint8_t loop_count;\n  uint8_t loop_subframe_end;\n  uint8_t loop_subframe_skip;\n};\nstatic_assert_size(XMA_LOOP_DATA, 12);\n\nstruct XMA_CONTEXT_INIT {\n  xe::be<uint32_t> input_buffer_0_ptr;\n  xe::be<uint32_t> input_buffer_0_packet_count;\n  xe::be<uint32_t> input_buffer_1_ptr;\n  xe::be<uint32_t> input_buffer_1_packet_count;\n  xe::be<uint32_t> input_buffer_read_offset;\n  xe::be<uint32_t> output_buffer_ptr;\n  xe::be<uint32_t> output_buffer_block_count;\n  xe::be<uint32_t> work_buffer;\n  xe::be<uint32_t> subframe_decode_count;\n  xe::be<uint32_t> channel_count;\n  xe::be<uint32_t> sample_rate;\n  XMA_LOOP_DATA loop_data;\n};\nstatic_assert_size(XMA_CONTEXT_INIT, 56);\n\ndword_result_t XMAInitializeContext_entry(\n    lpvoid_t context_ptr, pointer_t<XMA_CONTEXT_INIT> context_init) {\n  // Input buffers may be null (buffer 1 in 415607D4).\n  // Convert to host endianness.\n  uint32_t input_buffer_0_guest_ptr = context_init->input_buffer_0_ptr;\n  uint32_t input_buffer_0_physical_address = 0;\n  if (input_buffer_0_guest_ptr) {\n    input_buffer_0_physical_address =\n        kernel_memory()->GetPhysicalAddress(input_buffer_0_guest_ptr);\n    // Xenia-specific safety check.\n    assert_true(input_buffer_0_physical_address != UINT32_MAX);\n    if (input_buffer_0_physical_address == UINT32_MAX) {\n      XELOGE(\n          \"XMAInitializeContext: Invalid input buffer 0 virtual address {:08X}\",\n          input_buffer_0_guest_ptr);\n      return X_E_FALSE;\n    }\n  }\n  uint32_t input_buffer_1_guest_ptr = context_init->input_buffer_1_ptr;\n  uint32_t input_buffer_1_physical_address = 0;\n  if (input_buffer_1_guest_ptr) {\n    input_buffer_1_physical_address =\n        kernel_memory()->GetPhysicalAddress(input_buffer_1_guest_ptr);\n    assert_true(input_buffer_1_physical_address != UINT32_MAX);\n    if (input_buffer_1_physical_address == UINT32_MAX) {\n      XELOGE(\n          \"XMAInitializeContext: Invalid input buffer 1 virtual address {:08X}\",\n          input_buffer_1_guest_ptr);\n      return X_E_FALSE;\n    }\n  }\n  uint32_t output_buffer_guest_ptr = context_init->output_buffer_ptr;\n  assert_not_zero(output_buffer_guest_ptr);\n  uint32_t output_buffer_physical_address =\n      kernel_memory()->GetPhysicalAddress(output_buffer_guest_ptr);\n  assert_true(output_buffer_physical_address != UINT32_MAX);\n  if (output_buffer_physical_address == UINT32_MAX) {\n    XELOGE(\"XMAInitializeContext: Invalid output buffer virtual address {:08X}\",\n           output_buffer_guest_ptr);\n    return X_E_FALSE;\n  }\n\n  std::memset(context_ptr, 0, sizeof(XMA_CONTEXT_DATA));\n\n  XMA_CONTEXT_DATA context(context_ptr);\n\n  context.input_buffer_0_ptr = input_buffer_0_physical_address;\n  context.input_buffer_0_packet_count =\n      context_init->input_buffer_0_packet_count;\n  context.input_buffer_1_ptr = input_buffer_1_physical_address;\n  context.input_buffer_1_packet_count =\n      context_init->input_buffer_1_packet_count;\n  context.input_buffer_read_offset = context_init->input_buffer_read_offset;\n  context.output_buffer_ptr = output_buffer_physical_address;\n  context.output_buffer_block_count = context_init->output_buffer_block_count;\n\n  // context.work_buffer = context_init->work_buffer;  // ?\n  context.subframe_decode_count = context_init->subframe_decode_count;\n  context.is_stereo = context_init->channel_count >= 1;\n  context.sample_rate = context_init->sample_rate;\n\n  context.loop_start = context_init->loop_data.loop_start;\n  context.loop_end = context_init->loop_data.loop_end;\n  context.loop_count = context_init->loop_data.loop_count;\n  context.loop_subframe_end = context_init->loop_data.loop_subframe_end;\n  context.loop_subframe_skip = context_init->loop_data.loop_subframe_skip;\n\n  context.Store(context_ptr);\n\n  StoreXmaContextIndexedRegister(kernel_state(), 0x1A80, context_ptr);\n\n  return 0;\n}\nDECLARE_XBOXKRNL_EXPORT2(XMAInitializeContext, kAudio, kImplemented,\n                         kHighFrequency);\n\ndword_result_t XMASetLoopData_entry(lpvoid_t context_ptr,\n                                    pointer_t<XMA_CONTEXT_DATA> loop_data) {\n  XMA_CONTEXT_DATA context(context_ptr);\n\n  context.loop_start = loop_data->loop_start;\n  context.loop_end = loop_data->loop_end;\n  context.loop_count = loop_data->loop_count;\n  context.loop_subframe_end = loop_data->loop_subframe_end;\n  context.loop_subframe_skip = loop_data->loop_subframe_skip;\n\n  context.Store(context_ptr);\n\n  return 0;\n}\nDECLARE_XBOXKRNL_EXPORT2(XMASetLoopData, kAudio, kImplemented, kHighFrequency);\n\ndword_result_t XMAGetInputBufferReadOffset_entry(lpvoid_t context_ptr) {\n  XMA_CONTEXT_DATA context(context_ptr);\n  return context.input_buffer_read_offset;\n}\nDECLARE_XBOXKRNL_EXPORT2(XMAGetInputBufferReadOffset, kAudio, kImplemented,\n                         kHighFrequency);\n\ndword_result_t XMASetInputBufferReadOffset_entry(lpvoid_t context_ptr,\n                                                 dword_t value) {\n  XMA_CONTEXT_DATA context(context_ptr);\n  context.input_buffer_read_offset = value;\n  context.Store(context_ptr);\n\n  return 0;\n}\nDECLARE_XBOXKRNL_EXPORT2(XMASetInputBufferReadOffset, kAudio, kImplemented,\n                         kHighFrequency);\n\ndword_result_t XMASetInputBuffer0_entry(lpvoid_t context_ptr, lpvoid_t buffer,\n                                        dword_t packet_count) {\n  uint32_t buffer_physical_address =\n      kernel_memory()->GetPhysicalAddress(buffer.guest_address());\n  assert_true(buffer_physical_address != UINT32_MAX);\n  if (buffer_physical_address == UINT32_MAX) {\n    // Xenia-specific safety check.\n    XELOGE(\"XMASetInputBuffer0: Invalid buffer virtual address {:08X}\",\n           buffer.guest_address());\n    return X_E_FALSE;\n  }\n\n  XMA_CONTEXT_DATA context(context_ptr);\n\n  context.input_buffer_0_ptr = buffer_physical_address;\n  context.input_buffer_0_packet_count = packet_count;\n\n  context.Store(context_ptr);\n\n  return 0;\n}\nDECLARE_XBOXKRNL_EXPORT2(XMASetInputBuffer0, kAudio, kImplemented,\n                         kHighFrequency);\n\ndword_result_t XMAIsInputBuffer0Valid_entry(lpvoid_t context_ptr) {\n  XMA_CONTEXT_DATA context(context_ptr);\n  return context.input_buffer_0_valid;\n}\nDECLARE_XBOXKRNL_EXPORT2(XMAIsInputBuffer0Valid, kAudio, kImplemented,\n                         kHighFrequency);\n\ndword_result_t XMASetInputBuffer0Valid_entry(lpvoid_t context_ptr) {\n  XMA_CONTEXT_DATA context(context_ptr);\n  context.input_buffer_0_valid = 1;\n  context.Store(context_ptr);\n\n  return 0;\n}\nDECLARE_XBOXKRNL_EXPORT2(XMASetInputBuffer0Valid, kAudio, kImplemented,\n                         kHighFrequency);\n\ndword_result_t XMASetInputBuffer1_entry(lpvoid_t context_ptr, lpvoid_t buffer,\n                                        dword_t packet_count) {\n  uint32_t buffer_physical_address =\n      kernel_memory()->GetPhysicalAddress(buffer.guest_address());\n  assert_true(buffer_physical_address != UINT32_MAX);\n  if (buffer_physical_address == UINT32_MAX) {\n    // Xenia-specific safety check.\n    XELOGE(\"XMASetInputBuffer1: Invalid buffer virtual address {:08X}\",\n           buffer.guest_address());\n    return X_E_FALSE;\n  }\n\n  XMA_CONTEXT_DATA context(context_ptr);\n\n  context.input_buffer_1_ptr = buffer_physical_address;\n  context.input_buffer_1_packet_count = packet_count;\n\n  context.Store(context_ptr);\n\n  return 0;\n}\nDECLARE_XBOXKRNL_EXPORT2(XMASetInputBuffer1, kAudio, kImplemented,\n                         kHighFrequency);\n\ndword_result_t XMAIsInputBuffer1Valid_entry(lpvoid_t context_ptr) {\n  XMA_CONTEXT_DATA context(context_ptr);\n  return context.input_buffer_1_valid;\n}\nDECLARE_XBOXKRNL_EXPORT2(XMAIsInputBuffer1Valid, kAudio, kImplemented,\n                         kHighFrequency);\n\ndword_result_t XMASetInputBuffer1Valid_entry(lpvoid_t context_ptr) {\n  XMA_CONTEXT_DATA context(context_ptr);\n  context.input_buffer_1_valid = 1;\n  context.Store(context_ptr);\n\n  return 0;\n}\nDECLARE_XBOXKRNL_EXPORT2(XMASetInputBuffer1Valid, kAudio, kImplemented,\n                         kHighFrequency);\n\ndword_result_t XMAIsOutputBufferValid_entry(lpvoid_t context_ptr) {\n  XMA_CONTEXT_DATA context(context_ptr);\n  return context.output_buffer_valid;\n}\nDECLARE_XBOXKRNL_EXPORT2(XMAIsOutputBufferValid, kAudio, kImplemented,\n                         kHighFrequency);\n\ndword_result_t XMASetOutputBufferValid_entry(lpvoid_t context_ptr) {\n  XMA_CONTEXT_DATA context(context_ptr);\n  context.output_buffer_valid = 1;\n  context.Store(context_ptr);\n\n  return 0;\n}\nDECLARE_XBOXKRNL_EXPORT2(XMASetOutputBufferValid, kAudio, kImplemented,\n                         kHighFrequency);\n\ndword_result_t XMAGetOutputBufferReadOffset_entry(lpvoid_t context_ptr) {\n  XMA_CONTEXT_DATA context(context_ptr);\n  return context.output_buffer_read_offset;\n}\nDECLARE_XBOXKRNL_EXPORT2(XMAGetOutputBufferReadOffset, kAudio, kImplemented,\n                         kHighFrequency);\n\ndword_result_t XMASetOutputBufferReadOffset_entry(lpvoid_t context_ptr,\n                                                  dword_t value) {\n  XMA_CONTEXT_DATA context(context_ptr);\n  context.output_buffer_read_offset = value;\n  context.Store(context_ptr);\n\n  return 0;\n}\nDECLARE_XBOXKRNL_EXPORT2(XMASetOutputBufferReadOffset, kAudio, kImplemented,\n                         kHighFrequency);\n\ndword_result_t XMAGetOutputBufferWriteOffset_entry(lpvoid_t context_ptr) {\n  XMA_CONTEXT_DATA context(context_ptr);\n  return context.output_buffer_write_offset;\n}\nDECLARE_XBOXKRNL_EXPORT2(XMAGetOutputBufferWriteOffset, kAudio, kImplemented,\n                         kHighFrequency);\n\ndword_result_t XMAGetPacketMetadata_entry(lpvoid_t context_ptr) {\n  XMA_CONTEXT_DATA context(context_ptr);\n  return context.packet_metadata;\n}\nDECLARE_XBOXKRNL_EXPORT1(XMAGetPacketMetadata, kAudio, kImplemented);\n\ndword_result_t XMAEnableContext_entry(lpvoid_t context_ptr) {\n  StoreXmaContextIndexedRegister(kernel_state(), 0x1940, context_ptr);\n  return 0;\n}\nDECLARE_XBOXKRNL_EXPORT2(XMAEnableContext, kAudio, kImplemented,\n                         kHighFrequency);\n\ndword_result_t XMADisableContext_entry(lpvoid_t context_ptr, dword_t wait) {\n  X_HRESULT result = X_E_SUCCESS;\n  StoreXmaContextIndexedRegister(kernel_state(), 0x1A40, context_ptr);\n  if (!kernel_state()\n           ->emulator()\n           ->audio_system()\n           ->xma_decoder()\n           ->BlockOnContext(context_ptr, !wait)) {\n    result = X_E_FALSE;\n  }\n  return result;\n}\nDECLARE_XBOXKRNL_EXPORT2(XMADisableContext, kAudio, kImplemented,\n                         kHighFrequency);\n\ndword_result_t XMABlockWhileInUse_entry(lpvoid_t context_ptr) {\n  do {\n    XMA_CONTEXT_DATA context(context_ptr);\n    if (!context.input_buffer_0_valid && !context.input_buffer_1_valid) {\n      break;\n    }\n    xe::threading::Sleep(std::chrono::milliseconds(1));\n  } while (true);\n  return 0;\n}\nDECLARE_XBOXKRNL_EXPORT2(XMABlockWhileInUse, kAudio, kImplemented,\n                         kHighFrequency);\n\n}  // namespace xboxkrnl\n}  // namespace kernel\n}  // namespace xe\n\nDECLARE_XBOXKRNL_EMPTY_REGISTER_EXPORTS(AudioXma);\n"
  },
  {
    "path": "src/xenia/kernel/xboxkrnl/xboxkrnl_crypt.cc",
    "content": "/**\n******************************************************************************\n* Xenia : Xbox 360 Emulator Research Project                                 *\n******************************************************************************\n* Copyright 2022 Ben Vanik. All rights reserved.                             *\n* Released under the BSD license - see LICENSE in the root for more details. *\n******************************************************************************\n*/\n\n#include <algorithm>\n\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/platform.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/util/shim_utils.h\"\n#include \"xenia/kernel/xboxkrnl/xboxkrnl_private.h\"\n#include \"xenia/xbox.h\"\n\n#ifdef XE_PLATFORM_WIN32\n#include \"xenia/base/platform_win.h\"  // for bcrypt.h\n#endif\n\n#include \"third_party/crypto/TinySHA1.hpp\"\n#include \"third_party/crypto/des/des.cpp\"\n#include \"third_party/crypto/des/des.h\"\n#include \"third_party/crypto/des/des3.h\"\n#include \"third_party/crypto/des/descbc.h\"\n#include \"third_party/crypto/sha256.cpp\"\n#include \"third_party/crypto/sha256.h\"\n\nextern \"C\" {\n#include \"third_party/aes_128/aes.h\"\n}\n\nnamespace xe {\nnamespace kernel {\nnamespace xboxkrnl {\n\ntypedef struct {\n  uint8_t S[256];  // 0x0\n  uint8_t i;       // 0x100\n  uint8_t j;       // 0x101\n} XECRYPT_RC4_STATE;\nstatic_assert_size(XECRYPT_RC4_STATE, 0x102);\n\nvoid XeCryptRc4Key_entry(pointer_t<XECRYPT_RC4_STATE> rc4_ctx, lpvoid_t key,\n                         dword_t key_size) {\n  // Setup RC4 state\n  rc4_ctx->i = rc4_ctx->j = 0;\n  for (uint32_t x = 0; x < 0x100; x++) {\n    rc4_ctx->S[x] = (uint8_t)x;\n  }\n\n  uint32_t idx = 0;\n  for (uint32_t x = 0; x < 0x100; x++) {\n    idx = (idx + rc4_ctx->S[x] + key[x % 0x10]) % 0x100;\n    uint8_t temp = rc4_ctx->S[idx];\n    rc4_ctx->S[idx] = rc4_ctx->S[x];\n    rc4_ctx->S[x] = temp;\n  }\n}\nDECLARE_XBOXKRNL_EXPORT1(XeCryptRc4Key, kNone, kImplemented);\n\nvoid XeCryptRc4Ecb_entry(pointer_t<XECRYPT_RC4_STATE> rc4_ctx, lpvoid_t data,\n                         dword_t size) {\n  // Crypt data\n  for (uint32_t idx = 0; idx < size; idx++) {\n    rc4_ctx->i = (rc4_ctx->i + 1) % 0x100;\n    rc4_ctx->j = (rc4_ctx->j + rc4_ctx->S[rc4_ctx->i]) % 0x100;\n    uint8_t temp = rc4_ctx->S[rc4_ctx->i];\n    rc4_ctx->S[rc4_ctx->i] = rc4_ctx->S[rc4_ctx->j];\n    rc4_ctx->S[rc4_ctx->j] = temp;\n\n    uint8_t a = data[idx];\n    uint8_t b =\n        rc4_ctx->S[(rc4_ctx->S[rc4_ctx->i] + rc4_ctx->S[rc4_ctx->j]) % 0x100];\n    data[idx] = (uint8_t)(a ^ b);\n  }\n}\nDECLARE_XBOXKRNL_EXPORT1(XeCryptRc4Ecb, kNone, kImplemented);\n\nvoid XeCryptRc4_entry(lpvoid_t key, dword_t key_size, lpvoid_t data,\n                      dword_t size) {\n  XECRYPT_RC4_STATE rc4_ctx;\n  XeCryptRc4Key_entry(&rc4_ctx, key, key_size);\n  XeCryptRc4Ecb_entry(&rc4_ctx, data, size);\n}\nDECLARE_XBOXKRNL_EXPORT1(XeCryptRc4, kNone, kImplemented);\n\ntypedef struct {\n  xe::be<uint32_t> count;     // 0x0\n  xe::be<uint32_t> state[5];  // 0x4\n  uint8_t buffer[64];         // 0x18\n} XECRYPT_SHA_STATE;\nstatic_assert_size(XECRYPT_SHA_STATE, 0x58);\n\nvoid InitSha1(sha1::SHA1* sha, const XECRYPT_SHA_STATE* state) {\n  uint32_t digest[5];\n  std::copy(std::begin(state->state), std::end(state->state), digest);\n\n  sha->init(digest, state->buffer, state->count);\n}\n\nvoid StoreSha1(const sha1::SHA1* sha, XECRYPT_SHA_STATE* state) {\n  std::copy_n(sha->getDigest(), xe::countof(state->state), state->state);\n\n  state->count = static_cast<uint32_t>(sha->getByteCount());\n  std::copy_n(sha->getBlock(), sha->getBlockByteIndex(), state->buffer);\n}\n\nvoid XeCryptShaInit_entry(pointer_t<XECRYPT_SHA_STATE> sha_state) {\n  sha_state.Zero();\n\n  sha_state->state[0] = 0x67452301;\n  sha_state->state[1] = 0xEFCDAB89;\n  sha_state->state[2] = 0x98BADCFE;\n  sha_state->state[3] = 0x10325476;\n  sha_state->state[4] = 0xC3D2E1F0;\n}\nDECLARE_XBOXKRNL_EXPORT1(XeCryptShaInit, kNone, kImplemented);\n\nvoid XeCryptShaUpdate_entry(pointer_t<XECRYPT_SHA_STATE> sha_state,\n                            lpvoid_t input, dword_t input_size) {\n  sha1::SHA1 sha;\n  InitSha1(&sha, sha_state);\n\n  sha.processBytes(input, input_size);\n\n  StoreSha1(&sha, sha_state);\n}\nDECLARE_XBOXKRNL_EXPORT1(XeCryptShaUpdate, kNone, kImplemented);\n\nvoid XeCryptShaFinal_entry(pointer_t<XECRYPT_SHA_STATE> sha_state,\n                           pointer_t<uint8_t> out, dword_t out_size) {\n  sha1::SHA1 sha;\n  InitSha1(&sha, sha_state);\n\n  uint8_t digest[0x14];\n  sha.finalize(digest);\n\n  std::copy_n(digest, std::min<size_t>(xe::countof(digest), out_size),\n              static_cast<uint8_t*>(out));\n  std::copy_n(sha.getDigest(), xe::countof(sha_state->state), sha_state->state);\n}\nDECLARE_XBOXKRNL_EXPORT1(XeCryptShaFinal, kNone, kImplemented);\n\nvoid XeCryptSha_entry(lpvoid_t input_1, dword_t input_1_size, lpvoid_t input_2,\n                      dword_t input_2_size, lpvoid_t input_3,\n                      dword_t input_3_size, lpvoid_t output,\n                      dword_t output_size) {\n  sha1::SHA1 sha;\n\n  if (input_1 && input_1_size) {\n    sha.processBytes(input_1, input_1_size);\n  }\n  if (input_2 && input_2_size) {\n    sha.processBytes(input_2, input_2_size);\n  }\n  if (input_3 && input_3_size) {\n    sha.processBytes(input_3, input_3_size);\n  }\n\n  uint8_t digest[0x14];\n  sha.finalize(digest);\n  std::copy_n(digest, std::min<size_t>(xe::countof(digest), output_size),\n              output.as<uint8_t*>());\n}\nDECLARE_XBOXKRNL_EXPORT1(XeCryptSha, kNone, kImplemented);\n\n// TODO: Size of this struct hasn't been confirmed yet.\ntypedef struct {\n  xe::be<uint32_t> count;     // 0x0\n  xe::be<uint32_t> state[8];  // 0x4\n  uint8_t buffer[64];         // 0x24\n} XECRYPT_SHA256_STATE;\n\nvoid XeCryptSha256Init_entry(pointer_t<XECRYPT_SHA256_STATE> sha_state) {\n  sha_state.Zero();\n\n  sha_state->state[0] = 0x6a09e667;\n  sha_state->state[1] = 0xbb67ae85;\n  sha_state->state[2] = 0x3c6ef372;\n  sha_state->state[3] = 0xa54ff53a;\n  sha_state->state[4] = 0x510e527f;\n  sha_state->state[5] = 0x9b05688c;\n  sha_state->state[6] = 0x1f83d9ab;\n  sha_state->state[7] = 0x5be0cd19;\n}\nDECLARE_XBOXKRNL_EXPORT1(XeCryptSha256Init, kNone, kImplemented);\n\nvoid XeCryptSha256Update_entry(pointer_t<XECRYPT_SHA256_STATE> sha_state,\n                               lpvoid_t input, dword_t input_size) {\n  sha256::SHA256 sha;\n  std::copy(std::begin(sha_state->state), std::end(sha_state->state),\n            sha.getHashValues());\n  std::copy(std::begin(sha_state->buffer), std::end(sha_state->buffer),\n            sha.getBuffer());\n  sha.setTotalSize(sha_state->count);\n\n  sha.add(input, input_size);\n\n  std::copy_n(sha.getHashValues(), xe::countof(sha_state->state),\n              sha_state->state);\n  std::copy_n(sha.getBuffer(), xe::countof(sha_state->buffer),\n              sha_state->buffer);\n  sha_state->count = static_cast<uint32_t>(sha.getTotalSize());\n}\nDECLARE_XBOXKRNL_EXPORT1(XeCryptSha256Update, kNone, kImplemented);\n\nvoid XeCryptSha256Final_entry(pointer_t<XECRYPT_SHA256_STATE> sha_state,\n                              pointer_t<uint8_t> out, dword_t out_size) {\n  sha256::SHA256 sha;\n  std::copy(std::begin(sha_state->state), std::end(sha_state->state),\n            sha.getHashValues());\n  std::copy(std::begin(sha_state->buffer), std::end(sha_state->buffer),\n            sha.getBuffer());\n  sha.setTotalSize(sha_state->count);\n\n  uint8_t hash[32];\n  sha.getHash(hash);\n\n  std::copy_n(hash, std::min<size_t>(xe::countof(hash), out_size),\n              static_cast<uint8_t*>(out));\n  std::copy(std::begin(hash), std::end(hash), sha_state->buffer);\n}\nDECLARE_XBOXKRNL_EXPORT1(XeCryptSha256Final, kNone, kImplemented);\n\n// Byteswaps each 8 bytes\nvoid XeCryptBnQw_SwapDwQwLeBe_entry(pointer_t<uint64_t> qw_inp,\n                                    pointer_t<uint64_t> qw_out, dword_t size) {\n  xe::copy_and_swap<uint64_t>(qw_out, qw_inp, size);\n}\nDECLARE_XBOXKRNL_EXPORT1(XeCryptBnQw_SwapDwQwLeBe, kNone, kImplemented);\n\ntypedef struct {\n  xe::be<uint32_t> size;  // size of modulus in 8 byte units\n  xe::be<uint32_t> public_exponent;\n  xe::be<uint64_t> pad_8;\n\n  // followed by modulus, followed by any private-key data\n} XECRYPT_RSA;\nstatic_assert_size(XECRYPT_RSA, 0x10);\n\ndword_result_t XeCryptBnQwNeRsaPubCrypt_entry(pointer_t<uint64_t> qw_a,\n                                              pointer_t<uint64_t> qw_b,\n                                              pointer_t<XECRYPT_RSA> rsa) {\n  // 0 indicates failure (but not a BOOL return value)\n#ifndef XE_PLATFORM_WIN32\n  XELOGE(\n      \"XeCryptBnQwNeRsaPubCrypt called but no implementation available for \"\n      \"this platform!\");\n  assert_always();\n  return 1;\n#else\n  uint32_t modulus_size = rsa->size * 8;\n\n  // Convert XECRYPT blob into BCrypt format\n  ULONG key_size = sizeof(BCRYPT_RSAKEY_BLOB) + sizeof(uint32_t) + modulus_size;\n  auto key_buf = std::make_unique<uint8_t[]>(key_size);\n  auto* key_header = reinterpret_cast<BCRYPT_RSAKEY_BLOB*>(key_buf.get());\n\n  key_header->Magic = BCRYPT_RSAPUBLIC_MAGIC;\n  key_header->BitLength = modulus_size * 8;\n  key_header->cbPublicExp = sizeof(uint32_t);\n  key_header->cbModulus = modulus_size;\n  key_header->cbPrime1 = key_header->cbPrime2 = 0;\n\n  // Copy in exponent/modulus, luckily these are BE inside BCrypt blob\n  uint32_t* key_exponent = reinterpret_cast<uint32_t*>(&key_header[1]);\n  *key_exponent = rsa->public_exponent.value;\n\n  // ...except modulus needs to be reversed in 64-bit chunks for BCrypt to make\n  // use of it properly for some reason\n  uint64_t* key_modulus = reinterpret_cast<uint64_t*>(&key_exponent[1]);\n  uint64_t* xecrypt_modulus = reinterpret_cast<uint64_t*>(&rsa[1]);\n  std::reverse_copy(xecrypt_modulus, xecrypt_modulus + rsa->size, key_modulus);\n\n  BCRYPT_ALG_HANDLE hAlgorithm = NULL;\n  NTSTATUS status = BCryptOpenAlgorithmProvider(\n      &hAlgorithm, BCRYPT_RSA_ALGORITHM, MS_PRIMITIVE_PROVIDER, 0);\n\n  if (!BCRYPT_SUCCESS(status)) {\n    XELOGE(\n        \"XeCryptBnQwNeRsaPubCrypt: BCryptOpenAlgorithmProvider failed with \"\n        \"status {:#X}!\",\n        status);\n    return 0;\n  }\n\n  BCRYPT_KEY_HANDLE hKey = NULL;\n  status = BCryptImportKeyPair(hAlgorithm, NULL, BCRYPT_RSAPUBLIC_BLOB, &hKey,\n                               key_buf.get(), key_size, 0);\n\n  if (!BCRYPT_SUCCESS(status)) {\n    XELOGE(\n        \"XeCryptBnQwNeRsaPubCrypt: BCryptImportKeyPair failed with status \"\n        \"{:#X}!\",\n        status);\n\n    if (hAlgorithm) {\n      BCryptCloseAlgorithmProvider(hAlgorithm, 0);\n    }\n\n    return 0;\n  }\n\n  // Byteswap & reverse the input into output, as BCrypt wants MSB first\n  uint64_t* output = qw_b;\n  uint8_t* output_bytes = reinterpret_cast<uint8_t*>(output);\n  xe::copy_and_swap<uint64_t>(output, qw_a, rsa->size);\n  std::reverse(output_bytes, output_bytes + modulus_size);\n\n  // BCryptDecrypt only works with private keys, fortunately BCryptEncrypt\n  // performs the right actions needed for us to decrypt the input\n  ULONG result_size = 0;\n  status =\n      BCryptEncrypt(hKey, output_bytes, modulus_size, nullptr, nullptr, 0,\n                    output_bytes, modulus_size, &result_size, BCRYPT_PAD_NONE);\n\n  assert(result_size == modulus_size);\n\n  if (!BCRYPT_SUCCESS(status)) {\n    XELOGE(\"XeCryptBnQwNeRsaPubCrypt: BCryptEncrypt failed with status {:#X}!\",\n           status);\n  } else {\n    // Reverse data & byteswap again so data is as game expects\n    std::reverse(output_bytes, output_bytes + modulus_size);\n    xe::copy_and_swap(output, output, rsa->size);\n  }\n\n  if (hKey) {\n    BCryptDestroyKey(hKey);\n  }\n  if (hAlgorithm) {\n    BCryptCloseAlgorithmProvider(hAlgorithm, 0);\n  }\n\n  return BCRYPT_SUCCESS(status) ? 1 : 0;\n#endif\n}\n#ifdef XE_PLATFORM_WIN32\nDECLARE_XBOXKRNL_EXPORT1(XeCryptBnQwNeRsaPubCrypt, kNone, kImplemented);\n#else\nDECLARE_XBOXKRNL_EXPORT1(XeCryptBnQwNeRsaPubCrypt, kNone, kStub);\n#endif\n\ndword_result_t XeCryptBnDwLePkcs1Verify_entry(lpvoid_t hash, lpvoid_t sig,\n                                              dword_t size) {\n  // BOOL return value\n  return 1;\n}\nDECLARE_XBOXKRNL_EXPORT1(XeCryptBnDwLePkcs1Verify, kNone, kStub);\n\nvoid XeCryptRandom_entry(lpvoid_t buf, dword_t buf_size) {\n  std::memset(buf, 0xFD, buf_size);\n}\nDECLARE_XBOXKRNL_EXPORT1(XeCryptRandom, kNone, kStub);\n\nstruct XECRYPT_DES_STATE {\n  uint32_t keytab[16][2];\n};\n\n// Sets bit 0 to make the parity odd\nvoid XeCryptDesParity_entry(lpvoid_t inp, dword_t inp_size, lpvoid_t out_ptr) {\n  DES::set_parity(inp, inp_size, out_ptr);\n}\nDECLARE_XBOXKRNL_EXPORT1(XeCryptDesParity, kNone, kImplemented);\n\nstruct XECRYPT_DES3_STATE {\n  XECRYPT_DES_STATE des_state[3];\n};\n\nvoid XeCryptDes3Key_entry(pointer_t<XECRYPT_DES3_STATE> state_ptr,\n                          lpqword_t key) {\n  DES3 des3(key[0], key[1], key[2]);\n  DES* des = des3.getDES();\n\n  // Store our DES state into the state.\n  for (int i = 0; i < 3; i++) {\n    std::memcpy(state_ptr->des_state[i].keytab, des[i].get_sub_key(), 128);\n  }\n}\nDECLARE_XBOXKRNL_EXPORT1(XeCryptDes3Key, kNone, kImplemented);\n\nvoid XeCryptDes3Ecb_entry(pointer_t<XECRYPT_DES3_STATE> state_ptr,\n                          lpqword_t inp, lpqword_t out, dword_t encrypt) {\n  DES3 des3((ui64*)state_ptr->des_state[0].keytab,\n            (ui64*)state_ptr->des_state[1].keytab,\n            (ui64*)state_ptr->des_state[2].keytab);\n\n  if (encrypt) {\n    *out = des3.encrypt(*inp);\n  } else {\n    *out = des3.decrypt(*inp);\n  }\n}\nDECLARE_XBOXKRNL_EXPORT1(XeCryptDes3Ecb, kNone, kImplemented);\n\nvoid XeCryptDes3Cbc_entry(pointer_t<XECRYPT_DES3_STATE> state_ptr,\n                          lpqword_t inp, dword_t inp_size, lpqword_t out,\n                          lpqword_t feed, dword_t encrypt) {\n  DES3 des3((ui64*)state_ptr->des_state[0].keytab,\n            (ui64*)state_ptr->des_state[1].keytab,\n            (ui64*)state_ptr->des_state[2].keytab);\n\n  // DES can only do 8-byte chunks at a time!\n  assert_true(inp_size % 8 == 0);\n\n  uint64_t last_block = *feed;\n  for (uint32_t i = 0; i < inp_size / 8; i++) {\n    uint64_t block = inp[i];\n    if (encrypt) {\n      last_block = des3.encrypt(block ^ last_block);\n      out[i] = last_block;\n    } else {\n      out[i] = des3.decrypt(block) ^ last_block;\n      last_block = block;\n    }\n  }\n\n  *feed = last_block;\n}\nDECLARE_XBOXKRNL_EXPORT1(XeCryptDes3Cbc, kNone, kImplemented);\n\nstruct XECRYPT_AES_STATE {\n  uint8_t keytabenc[11][4][4];  // 0x0\n  uint8_t keytabdec[11][4][4];  // 0xB0\n};\nstatic_assert_size(XECRYPT_AES_STATE, 0x160);\n\nstatic inline uint8_t xeXeCryptAesMul2(uint8_t a) {\n  return (a & 0x80) ? ((a << 1) ^ 0x1B) : (a << 1);\n}\n\nvoid XeCryptAesKey_entry(pointer_t<XECRYPT_AES_STATE> state_ptr, lpvoid_t key) {\n  aes_key_schedule_128(key, reinterpret_cast<uint8_t*>(state_ptr->keytabenc));\n  // Decryption key schedule not needed by openluopworld/aes_128, but generated\n  // to fill the context structure properly.\n  std::memcpy(state_ptr->keytabdec[0], state_ptr->keytabenc[10], 16);\n  // Inverse MixColumns.\n  for (uint32_t i = 1; i < 10; ++i) {\n    const uint8_t* enc =\n        reinterpret_cast<const uint8_t*>(state_ptr->keytabenc[10 - i]);\n    uint8_t* dec = reinterpret_cast<uint8_t*>(state_ptr->keytabdec[i]);\n    uint8_t t, u, v;\n    t = enc[0] ^ enc[1] ^ enc[2] ^ enc[3];\n    dec[0] = t ^ enc[0] ^ xeXeCryptAesMul2(enc[0] ^ enc[1]);\n    dec[1] = t ^ enc[1] ^ xeXeCryptAesMul2(enc[1] ^ enc[2]);\n    dec[2] = t ^ enc[2] ^ xeXeCryptAesMul2(enc[2] ^ enc[3]);\n    dec[3] = t ^ enc[3] ^ xeXeCryptAesMul2(enc[3] ^ enc[0]);\n    u = xeXeCryptAesMul2(xeXeCryptAesMul2(enc[0] ^ enc[2]));\n    v = xeXeCryptAesMul2(xeXeCryptAesMul2(enc[1] ^ enc[3]));\n    t = xeXeCryptAesMul2(u ^ v);\n    dec[0] ^= t ^ u;\n    dec[1] ^= t ^ v;\n    dec[2] ^= t ^ u;\n    dec[3] ^= t ^ v;\n    t = enc[4] ^ enc[5] ^ enc[6] ^ enc[7];\n    dec[4] = t ^ enc[4] ^ xeXeCryptAesMul2(enc[4] ^ enc[5]);\n    dec[5] = t ^ enc[5] ^ xeXeCryptAesMul2(enc[5] ^ enc[6]);\n    dec[6] = t ^ enc[6] ^ xeXeCryptAesMul2(enc[6] ^ enc[7]);\n    dec[7] = t ^ enc[7] ^ xeXeCryptAesMul2(enc[7] ^ enc[4]);\n    u = xeXeCryptAesMul2(xeXeCryptAesMul2(enc[4] ^ enc[6]));\n    v = xeXeCryptAesMul2(xeXeCryptAesMul2(enc[5] ^ enc[7]));\n    t = xeXeCryptAesMul2(u ^ v);\n    dec[4] ^= t ^ u;\n    dec[5] ^= t ^ v;\n    dec[6] ^= t ^ u;\n    dec[7] ^= t ^ v;\n    t = enc[8] ^ enc[9] ^ enc[10] ^ enc[11];\n    dec[8] = t ^ enc[8] ^ xeXeCryptAesMul2(enc[8] ^ enc[9]);\n    dec[9] = t ^ enc[9] ^ xeXeCryptAesMul2(enc[9] ^ enc[10]);\n    dec[10] = t ^ enc[10] ^ xeXeCryptAesMul2(enc[10] ^ enc[11]);\n    dec[11] = t ^ enc[11] ^ xeXeCryptAesMul2(enc[11] ^ enc[8]);\n    u = xeXeCryptAesMul2(xeXeCryptAesMul2(enc[8] ^ enc[10]));\n    v = xeXeCryptAesMul2(xeXeCryptAesMul2(enc[9] ^ enc[11]));\n    t = xeXeCryptAesMul2(u ^ v);\n    dec[8] ^= t ^ u;\n    dec[9] ^= t ^ v;\n    dec[10] ^= t ^ u;\n    dec[11] ^= t ^ v;\n    t = enc[12] ^ enc[13] ^ enc[14] ^ enc[15];\n    dec[12] = t ^ enc[12] ^ xeXeCryptAesMul2(enc[12] ^ enc[13]);\n    dec[13] = t ^ enc[13] ^ xeXeCryptAesMul2(enc[13] ^ enc[14]);\n    dec[14] = t ^ enc[14] ^ xeXeCryptAesMul2(enc[14] ^ enc[15]);\n    dec[15] = t ^ enc[15] ^ xeXeCryptAesMul2(enc[15] ^ enc[12]);\n    u = xeXeCryptAesMul2(xeXeCryptAesMul2(enc[12] ^ enc[14]));\n    v = xeXeCryptAesMul2(xeXeCryptAesMul2(enc[13] ^ enc[15]));\n    t = xeXeCryptAesMul2(u ^ v);\n    dec[12] ^= t ^ u;\n    dec[13] ^= t ^ v;\n    dec[14] ^= t ^ u;\n    dec[15] ^= t ^ v;\n  }\n  std::memcpy(state_ptr->keytabdec[10], state_ptr->keytabenc[0], 16);\n  // TODO(Triang3l): Verify the order in keytabenc and everything in keytabdec.\n}\nDECLARE_XBOXKRNL_EXPORT1(XeCryptAesKey, kNone, kImplemented);\n\nvoid XeCryptAesEcb_entry(pointer_t<XECRYPT_AES_STATE> state_ptr,\n                         lpvoid_t inp_ptr, lpvoid_t out_ptr, dword_t encrypt) {\n  const uint8_t* keytab =\n      reinterpret_cast<const uint8_t*>(state_ptr->keytabenc);\n  if (encrypt) {\n    aes_encrypt_128(keytab, inp_ptr, out_ptr);\n  } else {\n    aes_decrypt_128(keytab, inp_ptr, out_ptr);\n  }\n}\nDECLARE_XBOXKRNL_EXPORT1(XeCryptAesEcb, kNone, kImplemented);\n\nvoid XeCryptAesCbc_entry(pointer_t<XECRYPT_AES_STATE> state_ptr,\n                         lpvoid_t inp_ptr, dword_t inp_size, lpvoid_t out_ptr,\n                         lpvoid_t feed_ptr, dword_t encrypt) {\n  const uint8_t* keytab =\n      reinterpret_cast<const uint8_t*>(state_ptr->keytabenc);\n  const uint8_t* inp = inp_ptr.as<const uint8_t*>();\n  uint8_t* out = out_ptr.as<uint8_t*>();\n  uint8_t* feed = feed_ptr.as<uint8_t*>();\n  if (encrypt) {\n    for (uint32_t i = 0; i < inp_size; i += 16) {\n      for (uint32_t j = 0; j < 16; ++j) {\n        feed[j] ^= inp[j];\n      }\n      aes_encrypt_128(keytab, feed, feed);\n      std::memcpy(out, feed, 16);\n      inp += 16;\n      out += 16;\n    }\n  } else {\n    for (uint32_t i = 0; i < inp_size; i += 16) {\n      // In case inp == out.\n      uint8_t tmp[16];\n      std::memcpy(tmp, inp, 16);\n      aes_decrypt_128(keytab, inp, out);\n      for (uint32_t j = 0; j < 16; ++j) {\n        out[j] ^= feed[j];\n      }\n      std::memcpy(feed, tmp, 16);\n      inp += 16;\n      out += 16;\n    }\n  }\n}\nDECLARE_XBOXKRNL_EXPORT1(XeCryptAesCbc, kNone, kImplemented);\n\nvoid XeCryptHmacSha_entry(lpvoid_t key, dword_t key_size_in, lpvoid_t inp_1,\n                          dword_t inp_1_size, lpvoid_t inp_2,\n                          dword_t inp_2_size, lpvoid_t inp_3,\n                          dword_t inp_3_size, lpvoid_t out, dword_t out_size) {\n  uint32_t key_size = key_size_in;\n  sha1::SHA1 sha;\n  uint8_t kpad_i[0x40];\n  uint8_t kpad_o[0x40];\n  uint8_t tmp_key[0x40];\n  std::memset(kpad_i, 0x36, 0x40);\n  std::memset(kpad_o, 0x5C, 0x40);\n\n  // Setup HMAC key\n  // If > block size, use its hash\n  if (key_size > 0x40) {\n    sha1::SHA1 sha_key;\n    sha_key.processBytes(key, key_size);\n    sha_key.finalize((uint8_t*)tmp_key);\n\n    key_size = 0x14u;\n  } else {\n    std::memcpy(tmp_key, key, key_size);\n  }\n\n  for (uint32_t i = 0; i < key_size; i++) {\n    kpad_i[i] = tmp_key[i] ^ 0x36;\n    kpad_o[i] = tmp_key[i] ^ 0x5C;\n  }\n\n  // Inner\n  sha.processBytes(kpad_i, 0x40);\n\n  if (inp_1_size) {\n    sha.processBytes(inp_1, inp_1_size);\n  }\n\n  if (inp_2_size) {\n    sha.processBytes(inp_2, inp_2_size);\n  }\n\n  if (inp_3_size) {\n    sha.processBytes(inp_3, inp_3_size);\n  }\n\n  uint8_t digest[0x14];\n  sha.finalize(digest);\n  sha.reset();\n\n  // Outer\n  sha.processBytes(kpad_o, 0x40);\n  sha.processBytes(digest, 0x14);\n  sha.finalize(digest);\n\n  std::memcpy(out, digest, std::min((uint32_t)out_size, 0x14u));\n}\nDECLARE_XBOXKRNL_EXPORT1(XeCryptHmacSha, kNone, kImplemented);\n\n// Keys\n// TODO: Array of keys we need\n\n// Retail key 0x19\nstatic const uint8_t key19[] = {0xE1, 0xBC, 0x15, 0x9C, 0x73, 0xB1, 0xEA, 0xE9,\n                                0xAB, 0x31, 0x70, 0xF3, 0xAD, 0x47, 0xEB, 0xF3};\n\ndword_result_t XeKeysHmacSha_entry(dword_t key_num, lpvoid_t inp_1,\n                                   dword_t inp_1_size, lpvoid_t inp_2,\n                                   dword_t inp_2_size, lpvoid_t inp_3,\n                                   dword_t inp_3_size, lpvoid_t out,\n                                   dword_t out_size) {\n  const uint8_t* key = nullptr;\n  if (key_num == 0x19) {\n    key = key19;\n  }\n\n  if (key) {\n    XeCryptHmacSha_entry((void*)key, 0x10, inp_1, inp_1_size, inp_2, inp_2_size,\n                         inp_3, inp_3_size, out, out_size);\n\n    return X_STATUS_SUCCESS;\n  }\n\n  return X_STATUS_UNSUCCESSFUL;\n}\nDECLARE_XBOXKRNL_EXPORT1(XeKeysHmacSha, kNone, kImplemented);\n\nstatic const uint8_t xe_key_obfuscation_key[16] = {\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};\n\ndword_result_t XeKeysAesCbcUsingKey_entry(lpvoid_t obscured_key,\n                                          lpvoid_t inp_ptr, dword_t inp_size,\n                                          lpvoid_t out_ptr, lpvoid_t feed_ptr,\n                                          dword_t encrypt) {\n  uint8_t key[16];\n\n  // Deobscure key\n  XECRYPT_AES_STATE aes;\n  XeCryptAesKey_entry(&aes, (uint8_t*)xe_key_obfuscation_key);\n  XeCryptAesEcb_entry(&aes, obscured_key, key, 0);\n\n  // Run CBC using deobscured key\n  XeCryptAesKey_entry(&aes, key);\n  XeCryptAesCbc_entry(&aes, inp_ptr, inp_size, out_ptr, feed_ptr, encrypt);\n\n  return X_STATUS_SUCCESS;\n}\nDECLARE_XBOXKRNL_EXPORT1(XeKeysAesCbcUsingKey, kNone, kImplemented);\n\ndword_result_t XeKeysObscureKey_entry(lpvoid_t input, lpvoid_t output) {\n  // Based on HvxKeysObscureKey\n  // Seems to encrypt input with per-console KEY_OBFUSCATION_KEY (key 0x18)\n\n  XECRYPT_AES_STATE aes;\n  XeCryptAesKey_entry(&aes, (uint8_t*)xe_key_obfuscation_key);\n  XeCryptAesEcb_entry(&aes, input, output, 1);\n\n  return X_STATUS_SUCCESS;\n}\nDECLARE_XBOXKRNL_EXPORT1(XeKeysObscureKey, kNone, kImplemented);\n\ndword_result_t XeKeysHmacShaUsingKey_entry(lpvoid_t obscured_key,\n                                           lpvoid_t inp_1, dword_t inp_1_size,\n                                           lpvoid_t inp_2, dword_t inp_2_size,\n                                           lpvoid_t inp_3, dword_t inp_3_size,\n                                           lpvoid_t out, dword_t out_size) {\n  if (!obscured_key) {\n    return X_STATUS_INVALID_PARAMETER;\n  }\n\n  uint8_t key[16];\n\n  // Deobscure key\n  XECRYPT_AES_STATE aes;\n  XeCryptAesKey_entry(&aes, (uint8_t*)xe_key_obfuscation_key);\n  XeCryptAesEcb_entry(&aes, obscured_key, key, 0);\n\n  XeCryptHmacSha_entry(key, 0x10, inp_1, inp_1_size, inp_2, inp_2_size, inp_3,\n                       inp_3_size, out, out_size);\n  return X_STATUS_SUCCESS;\n}\nDECLARE_XBOXKRNL_EXPORT1(XeKeysHmacShaUsingKey, kNone, kImplemented);\n\n}  // namespace xboxkrnl\n}  // namespace kernel\n}  // namespace xe\n\nDECLARE_XBOXKRNL_EMPTY_REGISTER_EXPORTS(Crypt);\n"
  },
  {
    "path": "src/xenia/kernel/xboxkrnl/xboxkrnl_debug.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/debugging.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/util/shim_utils.h\"\n#include \"xenia/kernel/xboxkrnl/xboxkrnl_private.h\"\n#include \"xenia/kernel/xthread.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xboxkrnl {\n\nvoid DbgBreakPoint_entry() { xe::debugging::Break(); }\nDECLARE_XBOXKRNL_EXPORT2(DbgBreakPoint, kDebug, kStub, kImportant);\n\n// https://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx\ntypedef struct {\n  xe::be<uint32_t> type;\n  xe::be<uint32_t> name_ptr;\n  xe::be<uint32_t> thread_id;\n  xe::be<uint32_t> flags;\n} X_THREADNAME_INFO;\nstatic_assert_size(X_THREADNAME_INFO, 0x10);\n\nvoid HandleSetThreadName(pointer_t<X_EXCEPTION_RECORD> record) {\n  // SetThreadName. FFS.\n  // https://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx\n\n  // TODO(benvanik): check record->number_parameters to make sure it's a\n  // correct size.\n  auto thread_info =\n      reinterpret_cast<X_THREADNAME_INFO*>(&record->exception_information[0]);\n\n  assert_true(thread_info->type == 0x1000);\n\n  if (!thread_info->name_ptr) {\n    XELOGD(\"SetThreadName called with null name_ptr\");\n    return;\n  }\n\n  // 4D5307D6 (and its demo) has a bug where it ends up passing freed memory for\n  // the name, so at the point of SetThreadName it's filled with junk.\n\n  // TODO(gibbed): cvar for thread name encoding for conversion, some games use\n  // SJIS and there's no way to automatically know this.\n  auto name = std::string(\n      kernel_memory()->TranslateVirtual<const char*>(thread_info->name_ptr));\n  std::replace_if(\n      name.begin(), name.end(), [](auto c) { return c < 32 || c > 127; }, '?');\n\n  object_ref<XThread> thread;\n  if (thread_info->thread_id == -1) {\n    // Current thread.\n    thread = retain_object(XThread::GetCurrentThread());\n  } else {\n    // Lookup thread by ID.\n    thread = kernel_state()->GetThreadByID(thread_info->thread_id);\n  }\n\n  if (thread) {\n    XELOGD(\"SetThreadName({}, {})\", thread->thread_id(), name);\n    thread->set_name(name);\n  }\n\n  // TODO(benvanik): unwinding required here?\n}\n\ntypedef struct {\n  xe::be<int32_t> mdisp;\n  xe::be<int32_t> pdisp;\n  xe::be<int32_t> vdisp;\n} x_PMD;\n\ntypedef struct {\n  xe::be<uint32_t> properties;\n  xe::be<uint32_t> type_ptr;\n  x_PMD this_displacement;\n  xe::be<int32_t> size_or_offset;\n  xe::be<uint32_t> copy_function_ptr;\n} x_s__CatchableType;\n\ntypedef struct {\n  xe::be<int32_t> number_catchable_types;\n  xe::be<uint32_t> catchable_type_ptrs[1];\n} x_s__CatchableTypeArray;\n\ntypedef struct {\n  xe::be<uint32_t> attributes;\n  xe::be<uint32_t> unwind_ptr;\n  xe::be<uint32_t> forward_compat_ptr;\n  xe::be<uint32_t> catchable_type_array_ptr;\n} x_s__ThrowInfo;\n\nvoid HandleCppException(pointer_t<X_EXCEPTION_RECORD> record) {\n  // C++ exception.\n  // https://blogs.msdn.com/b/oldnewthing/archive/2010/07/30/10044061.aspx\n  // http://www.drdobbs.com/visual-c-exception-handling-instrumentat/184416600\n  // http://www.openrce.org/articles/full_view/21\n\n  assert_true(record->number_parameters == 3);\n  assert_true(record->exception_information[0] == 0x19930520);\n\n  auto thrown_ptr = record->exception_information[1];\n  auto thrown = kernel_memory()->TranslateVirtual(thrown_ptr);\n  auto vftable_ptr = *reinterpret_cast<xe::be<uint32_t>*>(thrown);\n\n  auto throw_info_ptr = record->exception_information[2];\n  auto throw_info =\n      kernel_memory()->TranslateVirtual<x_s__ThrowInfo*>(throw_info_ptr);\n  auto catchable_types =\n      kernel_memory()->TranslateVirtual<x_s__CatchableTypeArray*>(\n          throw_info->catchable_type_array_ptr);\n\n  xe::debugging::Break();\n}\n\nvoid RtlRaiseException_entry(pointer_t<X_EXCEPTION_RECORD> record) {\n  switch (record->code) {\n    case 0x406D1388: {\n      HandleSetThreadName(record);\n      return;\n    }\n    case 0xE06D7363: {\n      HandleCppException(record);\n      return;\n    }\n  }\n\n  // TODO(benvanik): unwinding.\n  // This is going to suck.\n  xe::debugging::Break();\n}\nDECLARE_XBOXKRNL_EXPORT2(RtlRaiseException, kDebug, kStub, kImportant);\n\nvoid KeBugCheckEx_entry(dword_t code, dword_t param1, dword_t param2,\n                        dword_t param3, dword_t param4) {\n  XELOGD(\"*** STOP: 0x{:08X} (0x{:08X}, 0x{:08X}, 0x{:08X}, 0x{:08X})\", code,\n         param1, param2, param3, param4);\n  fflush(stdout);\n  xe::debugging::Break();\n  assert_always();\n}\nDECLARE_XBOXKRNL_EXPORT2(KeBugCheckEx, kDebug, kStub, kImportant);\n\nvoid KeBugCheck_entry(dword_t code) { KeBugCheckEx_entry(code, 0, 0, 0, 0); }\nDECLARE_XBOXKRNL_EXPORT2(KeBugCheck, kDebug, kImplemented, kImportant);\n\n}  // namespace xboxkrnl\n}  // namespace kernel\n}  // namespace xe\n\nDECLARE_XBOXKRNL_EMPTY_REGISTER_EXPORTS(Debug);\n"
  },
  {
    "path": "src/xenia/kernel/xboxkrnl/xboxkrnl_error.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include <algorithm>\n\n#include \"xenia/base/atomic.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/string.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/user_module.h\"\n#include \"xenia/kernel/util/shim_utils.h\"\n#include \"xenia/kernel/xboxkrnl/xboxkrnl_error.h\"\n#include \"xenia/kernel/xboxkrnl/xboxkrnl_private.h\"\n#include \"xenia/kernel/xthread.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xboxkrnl {\n\nstruct error_lookup_table {\n  uint32_t base_code;\n  size_t count;\n  const uint32_t* entries;\n};\n\n// TODO(gibbed): replace these with named error codes\nconst uint32_t error_table_0x00000103[] = {\n    0x000003E5,  // 0x00000103\n    0,           //\n    0x000000EA,  // 0x00000105\n    0x00000514,  // 0x00000106\n    0x00000515,  // 0x00000107\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0x000003FE,  // 0x0000010C\n    0x00000516,  // 0x0000010D\n};\n\nconst uint32_t error_table_0x40000002[] = {\n    0x00000057,  // 0x40000002\n    0,           //\n    0,           //\n    0,           //\n    0x00000517,  // 0x40000006\n    0,           //\n    0x00000460,  // 0x40000008\n    0x000003F6,  // 0x40000009\n    0,           //\n    0,           //\n    0x00000461,  // 0x4000000C\n    0x00000518,  // 0x4000000D\n};\n\nconst uint32_t error_table_0x40020056[] = {\n    0x00000720,  // 0x40020056\n};\n\nconst uint32_t error_table_0x400200AF[] = {\n    0x00000779,  // 0x400200AF\n};\n\nconst uint32_t error_table_0x80000001[] = {\n    0x80000001,  // 0x80000001\n    0x000003E6,  // 0x80000002\n    0x80000003,  // 0x80000003\n    0x80000004,  // 0x80000004\n    0x000000EA,  // 0x80000005\n    0x00000012,  // 0x80000006\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0x0000056F,  // 0x8000000B\n    0,           //\n    0x0000012B,  // 0x8000000D\n    0x0000001C,  // 0x8000000E\n    0x00000015,  // 0x8000000F\n    0x00000015,  // 0x80000010\n    0x000000AA,  // 0x80000011\n    0x00000103,  // 0x80000012\n    0x000000FE,  // 0x80000013\n    0x000000FF,  // 0x80000014\n    0x000000FF,  // 0x80000015\n    0x00000456,  // 0x80000016\n    0,           //\n    0,           //\n    0,           //\n    0x00000103,  // 0x8000001A\n    0x0000044D,  // 0x8000001B\n    0x00000456,  // 0x8000001C\n    0x00000457,  // 0x8000001D\n    0x0000044C,  // 0x8000001E\n    0x0000044E,  // 0x8000001F\n    0,           //\n    0x0000044F,  // 0x80000021\n    0x00000450,  // 0x80000022\n    0,           //\n    0,           //\n    0x00000962,  // 0x80000025\n};\n\nconst uint32_t error_table_0x80000288[] = {\n    0x0000048D,  // 0x80000288\n    0x0000048E,  // 0x80000289\n};\n\nconst uint32_t error_table_0x80090300[] = {\n    0x000005AA,  // 0x80090300\n    0x00000006,  // 0x80090301\n    0x00000001,  // 0x80090302\n    0x00000035,  // 0x80090303\n    0x0000054F,  // 0x80090304\n    0x00000554,  // 0x80090305\n    0x00000120,  // 0x80090306\n    0x00000554,  // 0x80090307\n    0x00000057,  // 0x80090308\n    0x00000057,  // 0x80090309\n    0x00000032,  // 0x8009030A\n    0x00000558,  // 0x8009030B\n    0x0000052E,  // 0x8009030C\n    0x00000057,  // 0x8009030D\n    0x00000520,  // 0x8009030E\n    0x00000005,  // 0x8009030F\n    0x00000005,  // 0x80090310\n    0x0000051F,  // 0x80090311\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0x00000554,  // 0x80090316\n    0,           //\n    0x000006F8,  // 0x80090318\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0x00000057,  // 0x80090320\n    0x0000007A,  // 0x80090321\n    0x00000574,  // 0x80090322\n    0,           //\n    0,           //\n    0x000006FE,  // 0x80090325\n    0x00000057,  // 0x80090326\n    0x00000057,  // 0x80090327\n    0x00000532,  // 0x80090328\n    0x00001770,  // 0x80090329\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0x00001771,  // 0x80090330\n    0x00000001,  // 0x80090331\n};\n\nconst uint32_t error_table_0xC0000001[] = {\n    0x0000001F,  // 0xC0000001\n    0x00000001,  // 0xC0000002\n    0x00000057,  // 0xC0000003\n    0x00000018,  // 0xC0000004\n    0x000003E6,  // 0xC0000005\n    0x000003E7,  // 0xC0000006\n    0x000005AE,  // 0xC0000007\n    0x00000006,  // 0xC0000008\n    0x000003E9,  // 0xC0000009\n    0x000000C1,  // 0xC000000A\n    0x00000057,  // 0xC000000B\n    0,           //\n    0x00000057,  // 0xC000000D\n    0x00000002,  // 0xC000000E\n    0x00000002,  // 0xC000000F\n    0x00000001,  // 0xC0000010\n    0x00000026,  // 0xC0000011\n    0x00000022,  // 0xC0000012\n    0x00000015,  // 0xC0000013\n    0x000006F9,  // 0xC0000014\n    0x0000001B,  // 0xC0000015\n    0x000000EA,  // 0xC0000016\n    0x00000008,  // 0xC0000017\n    0x000001E7,  // 0xC0000018\n    0x000001E7,  // 0xC0000019\n    0x00000057,  // 0xC000001A\n    0x00000057,  // 0xC000001B\n    0x00000001,  // 0xC000001C\n    0xC000001D,  // 0xC000001D\n    0x00000005,  // 0xC000001E\n    0x00000005,  // 0xC000001F\n    0x000000C1,  // 0xC0000020\n    0x00000005,  // 0xC0000021\n    0x00000005,  // 0xC0000022\n    0x0000007A,  // 0xC0000023\n    0x00000006,  // 0xC0000024\n    0xC0000025,  // 0xC0000025\n    0xC0000026,  // 0xC0000026\n    0,           //\n    0,           //\n    0,           //\n    0x0000009E,  // 0xC000002A\n    0xC000002B,  // 0xC000002B\n    0x000001E7,  // 0xC000002C\n    0x000001E7,  // 0xC000002D\n    0,           //\n    0,           //\n    0x00000057,  // 0xC0000030\n    0,           //\n    0x00000571,  // 0xC0000032\n    0x0000007B,  // 0xC0000033\n    0x00000002,  // 0xC0000034\n    0x000000B7,  // 0xC0000035\n    0,           //\n    0x00000006,  // 0xC0000037\n    0,           //\n    0x000000A1,  // 0xC0000039\n    0x00000003,  // 0xC000003A\n    0x000000A1,  // 0xC000003B\n    0x0000045D,  // 0xC000003C\n    0x0000045D,  // 0xC000003D\n    0x00000017,  // 0xC000003E\n    0x00000017,  // 0xC000003F\n    0x00000008,  // 0xC0000040\n    0x00000005,  // 0xC0000041\n    0x00000006,  // 0xC0000042\n    0x00000020,  // 0xC0000043\n    0x00000718,  // 0xC0000044\n    0x00000057,  // 0xC0000045\n    0x00000120,  // 0xC0000046\n    0x0000012A,  // 0xC0000047\n    0x00000057,  // 0xC0000048\n    0x00000057,  // 0xC0000049\n    0x0000009C,  // 0xC000004A\n    0x00000005,  // 0xC000004B\n    0x00000057,  // 0xC000004C\n    0x00000057,  // 0xC000004D\n    0x00000057,  // 0xC000004E\n    0x0000011A,  // 0xC000004F\n    0x000000FF,  // 0xC0000050\n    0x00000570,  // 0xC0000051\n    0x00000570,  // 0xC0000052\n    0x00000570,  // 0xC0000053\n    0x00000021,  // 0xC0000054\n    0x00000021,  // 0xC0000055\n    0x00000005,  // 0xC0000056\n    0x00000032,  // 0xC0000057\n    0x00000519,  // 0xC0000058\n    0x0000051A,  // 0xC0000059\n    0x0000051B,  // 0xC000005A\n    0x0000051C,  // 0xC000005B\n    0x0000051D,  // 0xC000005C\n    0x0000051E,  // 0xC000005D\n    0x0000051F,  // 0xC000005E\n    0x00000520,  // 0xC000005F\n    0x00000521,  // 0xC0000060\n    0x00000522,  // 0xC0000061\n    0x00000523,  // 0xC0000062\n    0x00000524,  // 0xC0000063\n    0x00000525,  // 0xC0000064\n    0x00000526,  // 0xC0000065\n    0x00000527,  // 0xC0000066\n    0x00000528,  // 0xC0000067\n    0x00000529,  // 0xC0000068\n    0x0000052A,  // 0xC0000069\n    0x00000056,  // 0xC000006A\n    0x0000052C,  // 0xC000006B\n    0x0000052D,  // 0xC000006C\n    0x0000052E,  // 0xC000006D\n    0x0000052F,  // 0xC000006E\n    0x00000530,  // 0xC000006F\n    0x00000531,  // 0xC0000070\n    0x00000532,  // 0xC0000071\n    0x00000533,  // 0xC0000072\n    0x00000534,  // 0xC0000073\n    0x00000535,  // 0xC0000074\n    0x00000536,  // 0xC0000075\n    0x00000537,  // 0xC0000076\n    0x00000538,  // 0xC0000077\n    0x00000539,  // 0xC0000078\n    0x0000053A,  // 0xC0000079\n    0x0000007F,  // 0xC000007A\n    0x000000C1,  // 0xC000007B\n    0x000003F0,  // 0xC000007C\n    0x0000053C,  // 0xC000007D\n    0x0000009E,  // 0xC000007E\n    0x00000070,  // 0xC000007F\n    0x0000053D,  // 0xC0000080\n    0x0000053E,  // 0xC0000081\n    0x00000044,  // 0xC0000082\n    0x00000103,  // 0xC0000083\n    0x0000053F,  // 0xC0000084\n    0x00000103,  // 0xC0000085\n    0x0000009A,  // 0xC0000086\n    0x0000000E,  // 0xC0000087\n    0x000001E7,  // 0xC0000088\n    0x00000714,  // 0xC0000089\n    0x00000715,  // 0xC000008A\n    0x00000716,  // 0xC000008B\n    0xC000008C,  // 0xC000008C\n    0xC000008D,  // 0xC000008D\n    0xC000008E,  // 0xC000008E\n    0xC000008F,  // 0xC000008F\n    0xC0000090,  // 0xC0000090\n    0xC0000091,  // 0xC0000091\n    0xC0000092,  // 0xC0000092\n    0xC0000093,  // 0xC0000093\n    0xC0000094,  // 0xC0000094\n    0x00000216,  // 0xC0000095\n    0xC0000096,  // 0xC0000096\n    0x00000008,  // 0xC0000097\n    0x000003EE,  // 0xC0000098\n    0x00000540,  // 0xC0000099\n    0x000005AA,  // 0xC000009A\n    0x00000003,  // 0xC000009B\n    0x00000017,  // 0xC000009C\n    0x0000048F,  // 0xC000009D\n    0x00000015,  // 0xC000009E\n    0x000001E7,  // 0xC000009F\n    0x000001E7,  // 0xC00000A0\n    0x000005AD,  // 0xC00000A1\n    0x00000013,  // 0xC00000A2\n    0x00000015,  // 0xC00000A3\n    0x00000541,  // 0xC00000A4\n    0x00000542,  // 0xC00000A5\n    0x00000543,  // 0xC00000A6\n    0x00000544,  // 0xC00000A7\n    0x00000545,  // 0xC00000A8\n    0x00000057,  // 0xC00000A9\n    0,           //\n    0x000000E7,  // 0xC00000AB\n    0x000000E7,  // 0xC00000AC\n    0x000000E6,  // 0xC00000AD\n    0x000000E7,  // 0xC00000AE\n    0x00000001,  // 0xC00000AF\n    0x000000E9,  // 0xC00000B0\n    0x000000E8,  // 0xC00000B1\n    0x00000217,  // 0xC00000B2\n    0x00000218,  // 0xC00000B3\n    0x000000E6,  // 0xC00000B4\n    0x00000079,  // 0xC00000B5\n    0x00000026,  // 0xC00000B6\n    0,           //\n    0,           //\n    0,           //\n    0x00000005,  // 0xC00000BA\n    0x00000032,  // 0xC00000BB\n    0x00000033,  // 0xC00000BC\n    0x00000034,  // 0xC00000BD\n    0x00000035,  // 0xC00000BE\n    0x00000036,  // 0xC00000BF\n    0x00000037,  // 0xC00000C0\n    0x00000038,  // 0xC00000C1\n    0x00000039,  // 0xC00000C2\n    0x0000003A,  // 0xC00000C3\n    0x0000003B,  // 0xC00000C4\n    0x0000003C,  // 0xC00000C5\n    0x0000003D,  // 0xC00000C6\n    0x0000003E,  // 0xC00000C7\n    0x0000003F,  // 0xC00000C8\n    0x00000040,  // 0xC00000C9\n    0x00000041,  // 0xC00000CA\n    0x00000042,  // 0xC00000CB\n    0x00000043,  // 0xC00000CC\n    0x00000044,  // 0xC00000CD\n    0x00000045,  // 0xC00000CE\n    0x00000046,  // 0xC00000CF\n    0x00000047,  // 0xC00000D0\n    0x00000048,  // 0xC00000D1\n    0x00000058,  // 0xC00000D2\n    0,           //\n    0x00000011,  // 0xC00000D4\n    0x00000005,  // 0xC00000D5\n    0x000000F0,  // 0xC00000D6\n    0x00000546,  // 0xC00000D7\n    0,           //\n    0x000000E8,  // 0xC00000D9\n    0x00000547,  // 0xC00000DA\n    0,           //\n    0x00000548,  // 0xC00000DC\n    0x00000549,  // 0xC00000DD\n    0x0000054A,  // 0xC00000DE\n    0x0000054B,  // 0xC00000DF\n    0x0000054C,  // 0xC00000E0\n    0x0000054D,  // 0xC00000E1\n    0x0000012C,  // 0xC00000E2\n    0x0000012D,  // 0xC00000E3\n    0x0000054E,  // 0xC00000E4\n    0x0000054F,  // 0xC00000E5\n    0x00000550,  // 0xC00000E6\n    0x00000551,  // 0xC00000E7\n    0x000006F8,  // 0xC00000E8\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0x00000552,  // 0xC00000ED\n    0x00000553,  // 0xC00000EE\n    0x00000057,  // 0xC00000EF\n    0x00000057,  // 0xC00000F0\n    0x00000057,  // 0xC00000F1\n    0x00000057,  // 0xC00000F2\n    0x00000057,  // 0xC00000F3\n    0x00000057,  // 0xC00000F4\n    0x00000057,  // 0xC00000F5\n    0x00000057,  // 0xC00000F6\n    0x00000057,  // 0xC00000F7\n    0x00000057,  // 0xC00000F8\n    0x00000057,  // 0xC00000F9\n    0x00000057,  // 0xC00000FA\n    0x00000003,  // 0xC00000FB\n    0,           //\n    0x000003E9,  // 0xC00000FD\n    0x00000554,  // 0xC00000FE\n    0,           //\n    0x000000CB,  // 0xC0000100\n    0x00000091,  // 0xC0000101\n    0x00000570,  // 0xC0000102\n    0x0000010B,  // 0xC0000103\n    0x00000555,  // 0xC0000104\n    0x00000556,  // 0xC0000105\n    0x000000CE,  // 0xC0000106\n    0x00000961,  // 0xC0000107\n    0x00000964,  // 0xC0000108\n    0x0000013D,  // 0xC0000109\n    0x00000005,  // 0xC000010A\n    0x00000557,  // 0xC000010B\n    0,           //\n    0x00000558,  // 0xC000010D\n    0x00000420,  // 0xC000010E\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0x000005A4,  // 0xC0000117\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0x000003EE,  // 0xC000011E\n    0x00000004,  // 0xC000011F\n    0x000003E3,  // 0xC0000120\n    0x00000005,  // 0xC0000121\n    0x000004BA,  // 0xC0000122\n    0x00000005,  // 0xC0000123\n    0x0000055B,  // 0xC0000124\n    0x0000055C,  // 0xC0000125\n    0x0000055D,  // 0xC0000126\n    0x0000055E,  // 0xC0000127\n    0x00000006,  // 0xC0000128\n    0,           //\n    0,           //\n    0x0000055F,  // 0xC000012B\n    0,           //\n    0x000005AF,  // 0xC000012D\n    0,           //\n    0,           //\n    0x000000C1,  // 0xC0000130\n    0,           //\n    0,           //\n    0x00000576,  // 0xC0000133\n    0,           //\n    0x0000007E,  // 0xC0000135\n    0,           //\n    0,           //\n    0x000000B6,  // 0xC0000138\n    0x0000007F,  // 0xC0000139\n    0,           //\n    0x00000040,  // 0xC000013B\n    0x00000040,  // 0xC000013C\n    0x00000033,  // 0xC000013D\n    0x0000003B,  // 0xC000013E\n    0x0000003B,  // 0xC000013F\n    0x0000003B,  // 0xC0000140\n    0x0000003B,  // 0xC0000141\n    0x0000045A,  // 0xC0000142\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0x0000007C,  // 0xC0000148\n    0x00000056,  // 0xC0000149\n    0,           //\n    0x0000006D,  // 0xC000014B\n    0x000003F1,  // 0xC000014C\n    0x000003F8,  // 0xC000014D\n    0,           //\n    0x000003ED,  // 0xC000014F\n    0x0000045E,  // 0xC0000150\n    0x00000560,  // 0xC0000151\n    0x00000561,  // 0xC0000152\n    0x00000562,  // 0xC0000153\n    0x00000563,  // 0xC0000154\n    0x00000564,  // 0xC0000155\n    0x00000565,  // 0xC0000156\n    0x00000566,  // 0xC0000157\n    0x00000567,  // 0xC0000158\n    0x000003EF,  // 0xC0000159\n    0x00000568,  // 0xC000015A\n    0x00000569,  // 0xC000015B\n    0x000003F9,  // 0xC000015C\n    0x0000056A,  // 0xC000015D\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0x00000459,  // 0xC0000162\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0x00000466,  // 0xC0000169\n    0x00000467,  // 0xC000016A\n    0x00000468,  // 0xC000016B\n    0x0000045F,  // 0xC000016C\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0x00000451,  // 0xC0000172\n    0x00000452,  // 0xC0000173\n    0x00000453,  // 0xC0000174\n    0x00000454,  // 0xC0000175\n    0x00000455,  // 0xC0000176\n    0x00000469,  // 0xC0000177\n    0x00000458,  // 0xC0000178\n    0,           //\n    0x0000056B,  // 0xC000017A\n    0x0000056C,  // 0xC000017B\n    0x000003FA,  // 0xC000017C\n    0x000003FB,  // 0xC000017D\n    0x0000056D,  // 0xC000017E\n    0x0000056E,  // 0xC000017F\n    0x000003FC,  // 0xC0000180\n    0x000003FD,  // 0xC0000181\n    0x00000057,  // 0xC0000182\n    0x0000045D,  // 0xC0000183\n    0x00000016,  // 0xC0000184\n    0x0000045D,  // 0xC0000185\n    0x0000045D,  // 0xC0000186\n    0,           //\n    0x000005DE,  // 0xC0000188\n    0x00000013,  // 0xC0000189\n    0x000006FA,  // 0xC000018A\n    0x000006FB,  // 0xC000018B\n    0x000006FC,  // 0xC000018C\n    0x000006FD,  // 0xC000018D\n    0x000005DC,  // 0xC000018E\n    0x000005DD,  // 0xC000018F\n    0x000006FE,  // 0xC0000190\n    0,           //\n    0x00000700,  // 0xC0000192\n    0x00000701,  // 0xC0000193\n    0x0000046B,  // 0xC0000194\n    0x000004C3,  // 0xC0000195\n    0x000004C4,  // 0xC0000196\n    0x000005DF,  // 0xC0000197\n    0x0000070F,  // 0xC0000198\n    0x00000710,  // 0xC0000199\n    0x00000711,  // 0xC000019A\n    0x00000712,  // 0xC000019B\n};\n\nconst uint32_t error_table_0xC0000202[] = {\n    0x00000572,  // 0xC0000202\n    0x0000003B,  // 0xC0000203\n    0x00000717,  // 0xC0000204\n    0x0000046A,  // 0xC0000205\n    0x000006F8,  // 0xC0000206\n    0x000004BE,  // 0xC0000207\n    0x000004BE,  // 0xC0000208\n    0x00000044,  // 0xC0000209\n    0x00000034,  // 0xC000020A\n    0x00000040,  // 0xC000020B\n    0x00000040,  // 0xC000020C\n    0x00000040,  // 0xC000020D\n    0x00000044,  // 0xC000020E\n    0x0000003B,  // 0xC000020F\n    0x0000003B,  // 0xC0000210\n    0x0000003B,  // 0xC0000211\n    0x0000003B,  // 0xC0000212\n    0x0000003B,  // 0xC0000213\n    0x0000003B,  // 0xC0000214\n    0x0000003B,  // 0xC0000215\n    0x00000032,  // 0xC0000216\n    0x00000032,  // 0xC0000217\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0x000017E6,  // 0xC000021C\n    0,           //\n    0,           //\n    0,           //\n    0x0000046C,  // 0xC0000220\n    0x000000C1,  // 0xC0000221\n    0,           //\n    0,           //\n    0x00000773,  // 0xC0000224\n    0x00000490,  // 0xC0000225\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0xC000022A,  // 0xC000022A\n    0xC000022B,  // 0xC000022B\n    0,           //\n    0x000004D5,  // 0xC000022D\n    0,           //\n    0,           //\n    0x00000492,  // 0xC0000230\n    0,           //\n    0,           //\n    0x00000774,  // 0xC0000233\n    0x00000775,  // 0xC0000234\n    0x00000006,  // 0xC0000235\n    0x000004C9,  // 0xC0000236\n    0x000004CA,  // 0xC0000237\n    0x000004CB,  // 0xC0000238\n    0x000004CC,  // 0xC0000239\n    0x000004CD,  // 0xC000023A\n    0x000004CE,  // 0xC000023B\n    0x000004CF,  // 0xC000023C\n    0x000004D0,  // 0xC000023D\n    0x000004D1,  // 0xC000023E\n    0x000004D2,  // 0xC000023F\n    0x000004D3,  // 0xC0000240\n    0x000004D4,  // 0xC0000241\n    0,           //\n    0x000004C8,  // 0xC0000243\n    0,           //\n    0,           //\n    0x000004D6,  // 0xC0000246\n    0x000004D7,  // 0xC0000247\n    0x000004D8,  // 0xC0000248\n    0x000000C1,  // 0xC0000249\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0x0000054F,  // 0xC0000253\n    0,           //\n    0,           //\n    0,           //\n    0x000004D0,  // 0xC0000257\n    0,           //\n    0x00000573,  // 0xC0000259\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0x00000422,  // 0xC000025E\n    0,           //\n    0,           //\n    0,           //\n    0x000000B6,  // 0xC0000262\n    0x0000007F,  // 0xC0000263\n    0x00000120,  // 0xC0000264\n    0x00000476,  // 0xC0000265\n    0,           //\n    0x000010FE,  // 0xC0000267\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0x000007D1,  // 0xC000026C\n    0x000004B1,  // 0xC000026D\n    0x00000015,  // 0xC000026E\n    0,           //\n    0,           //\n    0,           //\n    0x00000491,  // 0xC0000272\n    0,           //\n    0,           //\n    0x00001126,  // 0xC0000275\n    0x00001129,  // 0xC0000276\n    0x0000112A,  // 0xC0000277\n    0x00001128,  // 0xC0000278\n    0x00000780,  // 0xC0000279\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0x00000781,  // 0xC0000280\n    0x000000A1,  // 0xC0000281\n    0,           //\n    0x00000488,  // 0xC0000283\n    0x00000489,  // 0xC0000284\n    0x0000048A,  // 0xC0000285\n    0x0000048B,  // 0xC0000286\n    0x0000048C,  // 0xC0000287\n    0,           //\n    0,           //\n    0x00000005,  // 0xC000028A\n    0x00000005,  // 0xC000028B\n    0,           //\n    0x00000005,  // 0xC000028D\n    0x00000005,  // 0xC000028E\n    0x00000005,  // 0xC000028F\n    0x00000005,  // 0xC0000290\n    0x00001777,  // 0xC0000291\n    0x00001778,  // 0xC0000292\n    0x00001772,  // 0xC0000293\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0x00000001,  // 0xC000029C\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0x00001127,  // 0xC00002B2\n    0,           //\n    0,           //\n    0,           //\n    0x00000651,  // 0xC00002B6\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0x00000575,  // 0xC00002C3\n    0,           //\n    0x000003E6,  // 0xC00002C5\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0x000010E8,  // 0xC00002CA\n    0,           //\n    0x000004E3,  // 0xC00002CC\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0x00000052,  // 0xC00002EA\n};\n\nconst uint32_t error_table_0xC0020001[] = {\n    0x000006A4,  // 0xC0020001\n    0x000006A5,  // 0xC0020002\n    0x00000006,  // 0xC0020003\n    0x000006A7,  // 0xC0020004\n    0x000006A8,  // 0xC0020005\n    0x000006A9,  // 0xC0020006\n    0x000006AA,  // 0xC0020007\n    0x000006AB,  // 0xC0020008\n    0x000006AC,  // 0xC0020009\n    0x000006AD,  // 0xC002000A\n    0x000006AE,  // 0xC002000B\n    0x000006AF,  // 0xC002000C\n    0x000006B0,  // 0xC002000D\n    0x000006B1,  // 0xC002000E\n    0x000006B2,  // 0xC002000F\n    0x000006B3,  // 0xC0020010\n    0x000006B4,  // 0xC0020011\n    0x000006B5,  // 0xC0020012\n    0x000006B6,  // 0xC0020013\n    0x000006B7,  // 0xC0020014\n    0x000006B8,  // 0xC0020015\n    0x000006B9,  // 0xC0020016\n    0x000006BA,  // 0xC0020017\n    0x000006BB,  // 0xC0020018\n    0x000006BC,  // 0xC0020019\n    0x000006BD,  // 0xC002001A\n    0x000006BE,  // 0xC002001B\n    0x000006BF,  // 0xC002001C\n    0x000006C0,  // 0xC002001D\n    0,           //\n    0x000006C2,  // 0xC002001F\n    0,           //\n    0x000006C4,  // 0xC0020021\n    0x000006C5,  // 0xC0020022\n    0x000006C6,  // 0xC0020023\n    0x000006C7,  // 0xC0020024\n    0x000006C8,  // 0xC0020025\n    0x000006C9,  // 0xC0020026\n    0,           //\n    0x000006CB,  // 0xC0020028\n    0x000006CC,  // 0xC0020029\n    0x000006CD,  // 0xC002002A\n    0x000006CE,  // 0xC002002B\n    0x000006CF,  // 0xC002002C\n    0x000006D0,  // 0xC002002D\n    0x000006D1,  // 0xC002002E\n    0x000006D2,  // 0xC002002F\n    0x000006D3,  // 0xC0020030\n    0x000006D4,  // 0xC0020031\n    0x000006D5,  // 0xC0020032\n    0x000006D6,  // 0xC0020033\n    0x000006D7,  // 0xC0020034\n    0x000006D8,  // 0xC0020035\n    0x000006D9,  // 0xC0020036\n    0x000006DA,  // 0xC0020037\n    0x000006DB,  // 0xC0020038\n    0x000006DC,  // 0xC0020039\n    0x000006DD,  // 0xC002003A\n    0x000006DE,  // 0xC002003B\n    0x000006DF,  // 0xC002003C\n    0x000006E0,  // 0xC002003D\n    0x000006E1,  // 0xC002003E\n    0x000006E2,  // 0xC002003F\n    0x000006E3,  // 0xC0020040\n    0x000006E4,  // 0xC0020041\n    0x000006E5,  // 0xC0020042\n    0x000006E6,  // 0xC0020043\n    0x000006E7,  // 0xC0020044\n    0x000006E8,  // 0xC0020045\n    0x000006E9,  // 0xC0020046\n    0x000006EA,  // 0xC0020047\n    0x000006EB,  // 0xC0020048\n    0x000006FF,  // 0xC0020049\n    0x0000070E,  // 0xC002004A\n    0x0000076A,  // 0xC002004B\n    0x0000076B,  // 0xC002004C\n    0x0000076C,  // 0xC002004D\n    0,           //\n    0x00000719,  // 0xC002004F\n    0x0000071A,  // 0xC0020050\n    0x0000071B,  // 0xC0020051\n    0x0000071C,  // 0xC0020052\n    0x0000071D,  // 0xC0020053\n    0x0000071E,  // 0xC0020054\n    0x0000071F,  // 0xC0020055\n    0,           //\n    0x00000721,  // 0xC0020057\n    0x00000722,  // 0xC0020058\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0x0000077A,  // 0xC0020062\n    0x0000077B,  // 0xC0020063\n};\n\nconst uint32_t error_table_0xC0030001[] = {\n    0x000006EC,  // 0xC0030001\n    0x000006ED,  // 0xC0030002\n    0x000006EE,  // 0xC0030003\n    0x00000006,  // 0xC0030004\n    0x00000006,  // 0xC0030005\n    0x000006F1,  // 0xC0030006\n    0x000006F2,  // 0xC0030007\n    0x000006F3,  // 0xC0030008\n    0x000006F4,  // 0xC0030009\n    0x000006F5,  // 0xC003000A\n    0x000006F6,  // 0xC003000B\n    0x000006F7,  // 0xC003000C\n};\n\nconst uint32_t error_table_0xC0030059[] = {\n    0x00000723,  // 0xC0030059\n    0x00000724,  // 0xC003005A\n    0x00000725,  // 0xC003005B\n    0x00000726,  // 0xC003005C\n    0,           //\n    0x00000728,  // 0xC003005E\n    0x0000077C,  // 0xC003005F\n    0x0000077D,  // 0xC0030060\n    0x0000077E,  // 0xC0030061\n};\n\nconst uint32_t error_table_0xC0050003[] = {\n    0x0000045D,  // 0xC0050003\n    0x00000456,  // 0xC0050004\n};\n\nconst uint32_t error_table_0xC0980001[] = {\n    0x00000037,  // 0xC0980001\n    0x00000037,  // 0xC0980002\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0,           //\n    0x00000037,  // 0xC0980008\n};\n\n#define MAKE_ENTRY(x) \\\n  { x, xe::countof(error_table_##x), error_table_##x }\nconst error_lookup_table error_tables[] = {\n    MAKE_ENTRY(0x00000103), MAKE_ENTRY(0x40000002), MAKE_ENTRY(0x40020056),\n    MAKE_ENTRY(0x400200AF), MAKE_ENTRY(0x80000001), MAKE_ENTRY(0x80000288),\n    MAKE_ENTRY(0x80090300), MAKE_ENTRY(0xC0000001), MAKE_ENTRY(0xC0000202),\n    MAKE_ENTRY(0xC0020001), MAKE_ENTRY(0xC0030001), MAKE_ENTRY(0xC0030059),\n    MAKE_ENTRY(0xC0050003), MAKE_ENTRY(0xC0980001), {0, 0, nullptr},\n};\n#undef MAKE_ENTRY\n\nuint32_t xeRtlNtStatusToDosError(uint32_t source_status) {\n  uint32_t status = source_status;\n  if (!status || (status & 0x20000000)) {\n    return status;\n  }\n\n  if ((status >> 16) == 0x8007) {\n    return status & 0xFFFF;\n  }\n\n  if ((status & 0xF0000000) == 0xD0000000) {\n    // High bits doesn't matter.\n    status &= ~0x30000000;\n  }\n\n  auto error_table = &error_tables[0];\n  while (error_table->base_code) {\n    if (status < error_table->base_code) {\n      break;\n    }\n    auto index = status - error_table->base_code;\n    if (index < error_table->count) {\n      uint32_t result = error_table->entries[index];\n      if (!result) {\n        break;\n      }\n      XELOGI(\"xeRtlNtStatusToDosError {:X} => {:X}\", status, result);\n      return result;\n    }\n    ++error_table;\n  }\n\n  if ((status >> 16) == 0xC001) {\n    return status & 0xFFFF;\n  }\n\n  XELOGE(\"xeRtlNtStatusToDosError lookup NOT IMPLEMENTED\");\n  return 317;  // ERROR_MR_MID_NOT_FOUND\n}\n\ndword_result_t RtlNtStatusToDosError_entry(dword_t source_status) {\n  return xeRtlNtStatusToDosError(source_status);\n}\nDECLARE_XBOXKRNL_EXPORT3(RtlNtStatusToDosError, kNone, kImportant,\n                         kHighFrequency, kLogResult);\n\n}  // namespace xboxkrnl\n}  // namespace kernel\n}  // namespace xe\n\nDECLARE_XBOXKRNL_EMPTY_REGISTER_EXPORTS(Error);\n"
  },
  {
    "path": "src/xenia/kernel/xboxkrnl/xboxkrnl_error.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2015 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_KERNEL_XBOXKRNL_XBOXKRNL_ERROR_H_\n#define XENIA_KERNEL_XBOXKRNL_XBOXKRNL_ERROR_H_\n\n#include \"xenia/kernel/util/shim_utils.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xboxkrnl {\n\nuint32_t xeRtlNtStatusToDosError(uint32_t source_status);\n\n}  // namespace xboxkrnl\n}  // namespace kernel\n}  // namespace xe\n\n#endif  // XENIA_KERNEL_XBOXKRNL_XBOXKRNL_ERROR_H_\n"
  },
  {
    "path": "src/xenia/kernel/xboxkrnl/xboxkrnl_hal.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/logging.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/util/shim_utils.h\"\n#include \"xenia/kernel/xboxkrnl/xboxkrnl_private.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xboxkrnl {\n\nvoid HalReturnToFirmware_entry(dword_t routine) {\n  // void\n  // IN FIRMWARE_REENTRY  Routine\n\n  // Routine must be 1 'HalRebootRoutine'\n  assert_true(routine == 1);\n\n  // TODO(benvank): diediedie much more gracefully\n  // Not sure how to blast back up the stack in LLVM without exceptions, though.\n  XELOGE(\"Game requested shutdown via HalReturnToFirmware\");\n  exit(0);\n}\nDECLARE_XBOXKRNL_EXPORT2(HalReturnToFirmware, kNone, kStub, kImportant);\n\n}  // namespace xboxkrnl\n}  // namespace kernel\n}  // namespace xe\n\nDECLARE_XBOXKRNL_EMPTY_REGISTER_EXPORTS(Hal);\n"
  },
  {
    "path": "src/xenia/kernel/xboxkrnl/xboxkrnl_hid.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/logging.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/util/shim_utils.h\"\n#include \"xenia/kernel/xboxkrnl/xboxkrnl_private.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xboxkrnl {\n\ndword_result_t HidReadKeys_entry(dword_t unk1, unknown_t unk2, unknown_t unk3) {\n  /* TODO(gibbed):\n   * Games check for the following errors:\n   *   0xC000009D - translated to 0x48F  - ERROR_DEVICE_NOT_CONNECTED\n   *   0x103      - translated to 0x10D2 - ERROR_EMPTY\n   * Other errors appear to be ignored?\n   *\n   * unk1 is 0\n   * unk2 is a pointer to &unk3[2], possibly a 6-byte buffer\n   * unk3 is a pointer to a 20-byte buffer\n   */\n  return 0xC000009D;\n}\nDECLARE_XBOXKRNL_EXPORT1(HidReadKeys, kInput, kStub);\n\n}  // namespace xboxkrnl\n}  // namespace kernel\n}  // namespace xe\n\nDECLARE_XBOXKRNL_EMPTY_REGISTER_EXPORTS(Hid);\n"
  },
  {
    "path": "src/xenia/kernel/xboxkrnl/xboxkrnl_io.cc",
    "content": "﻿/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/memory.h\"\n#include \"xenia/base/mutex.h\"\n#include \"xenia/cpu/processor.h\"\n#include \"xenia/kernel/info/file.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/util/shim_utils.h\"\n#include \"xenia/kernel/xboxkrnl/xboxkrnl_private.h\"\n#include \"xenia/kernel/xevent.h\"\n#include \"xenia/kernel/xfile.h\"\n#include \"xenia/kernel/xiocompletion.h\"\n#include \"xenia/kernel/xsymboliclink.h\"\n#include \"xenia/kernel/xthread.h\"\n#include \"xenia/vfs/device.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xboxkrnl {\n\nstruct CreateOptions {\n  // https://processhacker.sourceforge.io/doc/ntioapi_8h.html\n  static const uint32_t FILE_DIRECTORY_FILE = 0x00000001;\n  // Optimization - files access will be sequential, not random.\n  static const uint32_t FILE_SEQUENTIAL_ONLY = 0x00000004;\n  static const uint32_t FILE_SYNCHRONOUS_IO_ALERT = 0x00000010;\n  static const uint32_t FILE_SYNCHRONOUS_IO_NONALERT = 0x00000020;\n  static const uint32_t FILE_NON_DIRECTORY_FILE = 0x00000040;\n  // Optimization - file access will be random, not sequential.\n  static const uint32_t FILE_RANDOM_ACCESS = 0x00000800;\n};\n\nstatic bool IsValidPath(const std::string_view s, bool is_pattern) {\n  // TODO(gibbed): validate path components individually\n  bool got_asterisk = false;\n  for (const auto& c : s) {\n    if (c <= 31 || c >= 127) {\n      return false;\n    }\n    if (got_asterisk) {\n      // * must be followed by a . (*.)\n      //\n      // 4D530819 has a bug in its game code where it attempts to\n      // FindFirstFile() with filters of \"Game:\\\\*_X3.rkv\", \"Game:\\\\m*_X3.rkv\",\n      // and \"Game:\\\\w*_X3.rkv\" and will infinite loop if the path filter is\n      // allowed.\n      if (c != '.') {\n        return false;\n      }\n      got_asterisk = false;\n    }\n    switch (c) {\n      case '\"':\n      // case '*':\n      case '+':\n      case ',':\n      // case ':':\n      case ';':\n      case '<':\n      case '=':\n      case '>':\n      // case '?':\n      case '|': {\n        return false;\n      }\n      case '*': {\n        // Pattern-specific (for NtQueryDirectoryFile)\n        if (!is_pattern) {\n          return false;\n        }\n        got_asterisk = true;\n        break;\n      }\n      case '?': {\n        // Pattern-specific (for NtQueryDirectoryFile)\n        if (!is_pattern) {\n          return false;\n        }\n        break;\n      }\n      default: {\n        break;\n      }\n    }\n  }\n  return true;\n}\n\ndword_result_t NtCreateFile_entry(lpdword_t handle_out, dword_t desired_access,\n                                  pointer_t<X_OBJECT_ATTRIBUTES> object_attrs,\n                                  pointer_t<X_IO_STATUS_BLOCK> io_status_block,\n                                  lpqword_t allocation_size_ptr,\n                                  dword_t file_attributes, dword_t share_access,\n                                  dword_t creation_disposition,\n                                  dword_t create_options) {\n  uint64_t allocation_size = 0;  // is this correct???\n  if (allocation_size_ptr) {\n    allocation_size = *allocation_size_ptr;\n  }\n\n  if (!object_attrs) {\n    // ..? Some games do this. This parameter is not optional.\n    return X_STATUS_INVALID_PARAMETER;\n  }\n  assert_not_null(handle_out);\n\n  auto object_name =\n      kernel_memory()->TranslateVirtual<X_ANSI_STRING*>(object_attrs->name_ptr);\n\n  vfs::Entry* root_entry = nullptr;\n\n  // Compute path, possibly attrs relative.\n  auto target_path = util::TranslateAnsiString(kernel_memory(), object_name);\n\n  // Enforce that the path is ASCII.\n  if (!IsValidPath(target_path, false)) {\n    return X_STATUS_OBJECT_NAME_INVALID;\n  }\n\n  if (object_attrs->root_directory != 0xFFFFFFFD &&  // ObDosDevices\n      object_attrs->root_directory != 0) {\n    auto root_file = kernel_state()->object_table()->LookupObject<XFile>(\n        object_attrs->root_directory);\n    assert_not_null(root_file);\n    assert_true(root_file->type() == XObject::Type::File);\n\n    root_entry = root_file->entry();\n  }\n\n  // Attempt open (or create).\n  vfs::File* vfs_file;\n  vfs::FileAction file_action;\n  X_STATUS result = kernel_state()->file_system()->OpenFile(\n      root_entry, target_path,\n      vfs::FileDisposition((uint32_t)creation_disposition), desired_access,\n      (create_options & CreateOptions::FILE_DIRECTORY_FILE) != 0,\n      (create_options & CreateOptions::FILE_NON_DIRECTORY_FILE) != 0, &vfs_file,\n      &file_action);\n  object_ref<XFile> file = nullptr;\n\n  X_HANDLE handle = X_INVALID_HANDLE_VALUE;\n  if (XSUCCEEDED(result)) {\n    // If true, desired_access SYNCHRONIZE flag must be set.\n    bool synchronous =\n        (create_options & CreateOptions::FILE_SYNCHRONOUS_IO_ALERT) ||\n        (create_options & CreateOptions::FILE_SYNCHRONOUS_IO_NONALERT);\n    file = object_ref<XFile>(new XFile(kernel_state(), vfs_file, synchronous));\n\n    // Handle ref is incremented, so return that.\n    handle = file->handle();\n  }\n\n  if (io_status_block) {\n    io_status_block->status = result;\n    io_status_block->information = (uint32_t)file_action;\n  }\n\n  *handle_out = handle;\n\n  return result;\n}\nDECLARE_XBOXKRNL_EXPORT1(NtCreateFile, kFileSystem, kImplemented);\n\ndword_result_t NtOpenFile_entry(\n    lpdword_t handle_out, dword_t desired_access,\n    pointer_t<X_OBJECT_ATTRIBUTES> object_attributes,\n    pointer_t<X_IO_STATUS_BLOCK> io_status_block, dword_t open_options) {\n  return NtCreateFile_entry(\n      handle_out, desired_access, object_attributes, io_status_block, nullptr,\n      0, 0, static_cast<uint32_t>(xe::vfs::FileDisposition::kOpen),\n      open_options);\n}\nDECLARE_XBOXKRNL_EXPORT1(NtOpenFile, kFileSystem, kImplemented);\n\ndword_result_t NtReadFile_entry(dword_t file_handle, dword_t event_handle,\n                                lpvoid_t apc_routine_ptr, lpvoid_t apc_context,\n                                pointer_t<X_IO_STATUS_BLOCK> io_status_block,\n                                lpvoid_t buffer, dword_t buffer_length,\n                                lpqword_t byte_offset_ptr) {\n  X_STATUS result = X_STATUS_SUCCESS;\n\n  bool signal_event = false;\n  auto ev = kernel_state()->object_table()->LookupObject<XEvent>(event_handle);\n  if (event_handle && !ev) {\n    result = X_STATUS_INVALID_HANDLE;\n  }\n\n  auto file = kernel_state()->object_table()->LookupObject<XFile>(file_handle);\n  if (!file) {\n    result = X_STATUS_INVALID_HANDLE;\n  }\n\n  if (XSUCCEEDED(result)) {\n    if (true || file->is_synchronous()) {\n      // Synchronous.\n      uint32_t bytes_read = 0;\n      result = file->Read(\n          buffer.guest_address(), buffer_length,\n          byte_offset_ptr ? static_cast<uint64_t>(*byte_offset_ptr) : -1,\n          &bytes_read, apc_context);\n      if (io_status_block) {\n        io_status_block->status = result;\n        io_status_block->information = bytes_read;\n      }\n\n      // Queue the APC callback. It must be delivered via the APC mechanism even\n      // though were are completing immediately.\n      // Low bit probably means do not queue to IO ports.\n      if ((uint32_t)apc_routine_ptr & ~1) {\n        if (apc_context) {\n          auto thread = XThread::GetCurrentThread();\n          thread->EnqueueApc(static_cast<uint32_t>(apc_routine_ptr) & ~1u,\n                             apc_context, io_status_block, 0);\n        }\n      }\n\n      if (!file->is_synchronous()) {\n        result = X_STATUS_PENDING;\n      }\n\n      // Mark that we should signal the event now. We do this after\n      // we have written the info out.\n      signal_event = true;\n    } else {\n      // TODO(benvanik): async.\n\n      // X_STATUS_PENDING if not returning immediately.\n      // XFile is waitable and signalled after each async req completes.\n      // reset the input event (->Reset())\n      /*xeNtReadFileState* call_state = new xeNtReadFileState();\n      XAsyncRequest* request = new XAsyncRequest(\n      state, file,\n      (XAsyncRequest::CompletionCallback)xeNtReadFileCompleted,\n      call_state);*/\n      // result = file->Read(buffer.guest_address(), buffer_length, byte_offset,\n      //                     request);\n      if (io_status_block) {\n        io_status_block->status = X_STATUS_PENDING;\n        io_status_block->information = 0;\n      }\n\n      result = X_STATUS_PENDING;\n    }\n  }\n\n  if (XFAILED(result) && io_status_block) {\n    io_status_block->status = result;\n    io_status_block->information = 0;\n  }\n\n  if (ev && signal_event) {\n    ev->Set(0, false);\n  }\n\n  return result;\n}\nDECLARE_XBOXKRNL_EXPORT2(NtReadFile, kFileSystem, kImplemented, kHighFrequency);\n\ndword_result_t NtReadFileScatter_entry(\n    dword_t file_handle, dword_t event_handle, lpvoid_t apc_routine_ptr,\n    lpvoid_t apc_context, pointer_t<X_IO_STATUS_BLOCK> io_status_block,\n    lpdword_t segment_array, dword_t length, lpqword_t byte_offset_ptr) {\n  X_STATUS result = X_STATUS_SUCCESS;\n\n  bool signal_event = false;\n  auto ev = kernel_state()->object_table()->LookupObject<XEvent>(event_handle);\n  if (event_handle && !ev) {\n    result = X_STATUS_INVALID_HANDLE;\n  }\n\n  auto file = kernel_state()->object_table()->LookupObject<XFile>(file_handle);\n  if (!file) {\n    result = X_STATUS_INVALID_HANDLE;\n  }\n\n  if (XSUCCEEDED(result)) {\n    if (true || file->is_synchronous()) {\n      // Synchronous.\n      uint32_t bytes_read = 0;\n      result = file->ReadScatter(\n          segment_array.guest_address(), length,\n          byte_offset_ptr ? static_cast<uint64_t>(*byte_offset_ptr) : -1,\n          &bytes_read, apc_context);\n      if (io_status_block) {\n        io_status_block->status = result;\n        io_status_block->information = bytes_read;\n      }\n\n      // Queue the APC callback. It must be delivered via the APC mechanism even\n      // though were are completing immediately.\n      // Low bit probably means do not queue to IO ports.\n      if ((uint32_t)apc_routine_ptr & ~1) {\n        if (apc_context) {\n          auto thread = XThread::GetCurrentThread();\n          thread->EnqueueApc(static_cast<uint32_t>(apc_routine_ptr) & ~1u,\n                             apc_context, io_status_block, 0);\n        }\n      }\n\n      if (!file->is_synchronous()) {\n        result = X_STATUS_PENDING;\n      }\n\n      // Mark that we should signal the event now. We do this after\n      // we have written the info out.\n      signal_event = true;\n    } else {\n      // TODO(benvanik): async.\n\n      // TODO: On Windows it might be worth trying to use Win32 ReadFileScatter\n      // here instead of handling it ourselves\n\n      // X_STATUS_PENDING if not returning immediately.\n      // XFile is waitable and signalled after each async req completes.\n      // reset the input event (->Reset())\n      /*xeNtReadFileState* call_state = new xeNtReadFileState();\n      XAsyncRequest* request = new XAsyncRequest(\n      state, file,\n      (XAsyncRequest::CompletionCallback)xeNtReadFileCompleted,\n      call_state);*/\n      // result = file->Read(buffer.guest_address(), buffer_length, byte_offset,\n      //                     request);\n      if (io_status_block) {\n        io_status_block->status = X_STATUS_PENDING;\n        io_status_block->information = 0;\n      }\n\n      result = X_STATUS_PENDING;\n    }\n  }\n\n  if (XFAILED(result) && io_status_block) {\n    io_status_block->status = result;\n    io_status_block->information = 0;\n  }\n\n  if (ev && signal_event) {\n    ev->Set(0, false);\n  }\n\n  return result;\n}\nDECLARE_XBOXKRNL_EXPORT1(NtReadFileScatter, kFileSystem, kImplemented);\n\ndword_result_t NtWriteFile_entry(dword_t file_handle, dword_t event_handle,\n                                 function_t apc_routine, lpvoid_t apc_context,\n                                 pointer_t<X_IO_STATUS_BLOCK> io_status_block,\n                                 lpvoid_t buffer, dword_t buffer_length,\n                                 lpqword_t byte_offset_ptr) {\n  X_STATUS result = X_STATUS_SUCCESS;\n\n  // Grab event to signal.\n  bool signal_event = false;\n  auto ev = kernel_state()->object_table()->LookupObject<XEvent>(event_handle);\n  if (event_handle && !ev) {\n    result = X_STATUS_INVALID_HANDLE;\n  }\n\n  // Grab file.\n  auto file = kernel_state()->object_table()->LookupObject<XFile>(file_handle);\n  if (!file) {\n    result = X_STATUS_INVALID_HANDLE;\n  }\n\n  // Execute write.\n  if (XSUCCEEDED(result)) {\n    // TODO(benvanik): async path.\n    if (true || file->is_synchronous()) {\n      // Synchronous request.\n      uint32_t bytes_written = 0;\n      result = file->Write(\n          buffer.guest_address(), buffer_length,\n          byte_offset_ptr ? static_cast<uint64_t>(*byte_offset_ptr) : -1,\n          &bytes_written, apc_context);\n\n      if (io_status_block) {\n        io_status_block->status = result;\n        io_status_block->information = static_cast<uint32_t>(bytes_written);\n      }\n\n      // Queue the APC callback. It must be delivered via the APC mechanism even\n      // though were are completing immediately.\n      // Low bit probably means do not queue to IO ports.\n      if ((uint32_t)apc_routine & ~1) {\n        if (apc_context) {\n          auto thread = XThread::GetCurrentThread();\n          thread->EnqueueApc(static_cast<uint32_t>(apc_routine) & ~1u,\n                             apc_context, io_status_block, 0);\n        }\n      }\n\n      if (!file->is_synchronous()) {\n        result = X_STATUS_PENDING;\n      }\n\n      // Mark that we should signal the event now. We do this after\n      // we have written the info out.\n      signal_event = true;\n    } else {\n      // X_STATUS_PENDING if not returning immediately.\n      result = X_STATUS_PENDING;\n\n      if (io_status_block) {\n        io_status_block->status = X_STATUS_PENDING;\n        io_status_block->information = 0;\n      }\n    }\n  }\n\n  if (XFAILED(result) && io_status_block) {\n    io_status_block->status = result;\n    io_status_block->information = 0;\n  }\n\n  if (ev && signal_event) {\n    ev->Set(0, false);\n  }\n\n  return result;\n}\nDECLARE_XBOXKRNL_EXPORT1(NtWriteFile, kFileSystem, kImplemented);\n\ndword_result_t NtCreateIoCompletion_entry(lpdword_t out_handle,\n                                          dword_t desired_access,\n                                          lpvoid_t object_attribs,\n                                          dword_t num_concurrent_threads) {\n  auto completion = new XIOCompletion(kernel_state());\n  if (out_handle) {\n    *out_handle = completion->handle();\n  }\n\n  return X_STATUS_SUCCESS;\n}\nDECLARE_XBOXKRNL_EXPORT1(NtCreateIoCompletion, kFileSystem, kImplemented);\n\ndword_result_t NtSetIoCompletion_entry(dword_t handle, dword_t key_context,\n                                       dword_t apc_context,\n                                       dword_t completion_status,\n                                       dword_t num_bytes) {\n  auto port =\n      kernel_state()->object_table()->LookupObject<XIOCompletion>(handle);\n  if (!port) {\n    return X_STATUS_INVALID_HANDLE;\n  }\n\n  XIOCompletion::IONotification notification;\n  notification.key_context = key_context;\n  notification.apc_context = apc_context;\n  notification.num_bytes = num_bytes;\n  notification.status = completion_status;\n\n  port->QueueNotification(notification);\n  return X_STATUS_SUCCESS;\n}\nDECLARE_XBOXKRNL_EXPORT2(NtSetIoCompletion, kFileSystem, kImplemented,\n                         kHighFrequency);\n\n// Dequeues a packet from the completion port.\ndword_result_t NtRemoveIoCompletion_entry(\n    dword_t handle, lpdword_t key_context, lpdword_t apc_context,\n    pointer_t<X_IO_STATUS_BLOCK> io_status_block, lpqword_t timeout) {\n  X_STATUS status = X_STATUS_SUCCESS;\n  uint32_t info = 0;\n\n  auto port =\n      kernel_state()->object_table()->LookupObject<XIOCompletion>(handle);\n  if (!port) {\n    status = X_STATUS_INVALID_HANDLE;\n  }\n\n  uint64_t timeout_ticks =\n      timeout ? static_cast<uint32_t>(*timeout)\n              : static_cast<uint64_t>(std::numeric_limits<int64_t>::min());\n  XIOCompletion::IONotification notification;\n  if (port->WaitForNotification(timeout_ticks, &notification)) {\n    if (key_context) {\n      *key_context = notification.key_context;\n    }\n    if (apc_context) {\n      *apc_context = notification.apc_context;\n    }\n\n    if (io_status_block) {\n      io_status_block->status = notification.status;\n      io_status_block->information = notification.num_bytes;\n    }\n  } else {\n    status = X_STATUS_TIMEOUT;\n  }\n\n  return status;\n}\nDECLARE_XBOXKRNL_EXPORT2(NtRemoveIoCompletion, kFileSystem, kImplemented,\n                         kHighFrequency);\n\ndword_result_t NtQueryFullAttributesFile_entry(\n    pointer_t<X_OBJECT_ATTRIBUTES> obj_attribs,\n    pointer_t<X_FILE_NETWORK_OPEN_INFORMATION> file_info) {\n  auto object_name =\n      kernel_memory()->TranslateVirtual<X_ANSI_STRING*>(obj_attribs->name_ptr);\n\n  object_ref<XFile> root_file;\n  if (obj_attribs->root_directory != 0xFFFFFFFD &&  // ObDosDevices\n      obj_attribs->root_directory != 0) {\n    root_file = kernel_state()->object_table()->LookupObject<XFile>(\n        obj_attribs->root_directory);\n    assert_not_null(root_file);\n    assert_true(root_file->type() == XObject::Type::File);\n    assert_always();\n  }\n\n  auto target_path = util::TranslateAnsiString(kernel_memory(), object_name);\n\n  // Enforce that the path is ASCII.\n  if (!IsValidPath(target_path, false)) {\n    return X_STATUS_OBJECT_NAME_INVALID;\n  }\n\n  // Resolve the file using the virtual file system.\n  auto entry = kernel_state()->file_system()->ResolvePath(target_path);\n  if (entry) {\n    // Found.\n    file_info->creation_time = entry->create_timestamp();\n    file_info->last_access_time = entry->access_timestamp();\n    file_info->last_write_time = entry->write_timestamp();\n    file_info->change_time = entry->write_timestamp();\n    file_info->allocation_size = entry->allocation_size();\n    file_info->end_of_file = entry->size();\n    file_info->attributes = entry->attributes();\n\n    return X_STATUS_SUCCESS;\n  }\n\n  return X_STATUS_NO_SUCH_FILE;\n}\nDECLARE_XBOXKRNL_EXPORT1(NtQueryFullAttributesFile, kFileSystem, kImplemented);\n\ndword_result_t NtQueryDirectoryFile_entry(\n    dword_t file_handle, dword_t event_handle, function_t apc_routine,\n    lpvoid_t apc_context, pointer_t<X_IO_STATUS_BLOCK> io_status_block,\n    pointer_t<X_FILE_DIRECTORY_INFORMATION> file_info_ptr, dword_t length,\n    pointer_t<X_ANSI_STRING> file_name, dword_t restart_scan) {\n  if (length < 72) {\n    return X_STATUS_INFO_LENGTH_MISMATCH;\n  }\n\n  X_STATUS result = X_STATUS_UNSUCCESSFUL;\n  uint32_t info = 0;\n\n  auto file = kernel_state()->object_table()->LookupObject<XFile>(file_handle);\n  auto name = util::TranslateAnsiString(kernel_memory(), file_name);\n\n  // Enforce that the path is ASCII.\n  if (!IsValidPath(name, true)) {\n    return X_STATUS_INVALID_PARAMETER;\n  }\n\n  if (file) {\n    X_FILE_DIRECTORY_INFORMATION dir_info = {0};\n    result =\n        file->QueryDirectory(file_info_ptr, length, name, restart_scan != 0);\n    if (XSUCCEEDED(result)) {\n      info = length;\n    }\n  } else {\n    result = X_STATUS_NO_SUCH_FILE;\n  }\n\n  if (XFAILED(result)) {\n    info = 0;\n  }\n\n  if (io_status_block) {\n    io_status_block->status = result;\n    io_status_block->information = info;\n  }\n\n  return result;\n}\nDECLARE_XBOXKRNL_EXPORT1(NtQueryDirectoryFile, kFileSystem, kImplemented);\n\ndword_result_t NtFlushBuffersFile_entry(\n    dword_t file_handle, pointer_t<X_IO_STATUS_BLOCK> io_status_block_ptr) {\n  auto result = X_STATUS_SUCCESS;\n\n  if (io_status_block_ptr) {\n    io_status_block_ptr->status = result;\n    io_status_block_ptr->information = 0;\n  }\n\n  return result;\n}\nDECLARE_XBOXKRNL_EXPORT1(NtFlushBuffersFile, kFileSystem, kStub);\n\n// https://docs.microsoft.com/en-us/windows/win32/devnotes/ntopensymboliclinkobject\ndword_result_t NtOpenSymbolicLinkObject_entry(\n    lpdword_t handle_out, pointer_t<X_OBJECT_ATTRIBUTES> object_attrs) {\n  if (!object_attrs) {\n    return X_STATUS_INVALID_PARAMETER;\n  }\n  assert_not_null(handle_out);\n\n  assert_true(object_attrs->attributes == 64);  // case insensitive\n\n  auto object_name =\n      kernel_memory()->TranslateVirtual<X_ANSI_STRING*>(object_attrs->name_ptr);\n\n  auto target_path = util::TranslateAnsiString(kernel_memory(), object_name);\n\n  // Enforce that the path is ASCII.\n  if (!IsValidPath(target_path, false)) {\n    return X_STATUS_OBJECT_NAME_INVALID;\n  }\n\n  if (object_attrs->root_directory != 0) {\n    assert_always();\n  }\n\n  if (utf8::starts_with(target_path, \"\\\\??\\\\\")) {\n    target_path = target_path.substr(4);  // Strip the full qualifier\n  }\n\n  std::string link_path;\n  if (!kernel_state()->file_system()->FindSymbolicLink(target_path,\n                                                       link_path)) {\n    return X_STATUS_NO_SUCH_FILE;\n  }\n\n  object_ref<XSymbolicLink> symlink(new XSymbolicLink(kernel_state()));\n  symlink->Initialize(target_path, link_path);\n\n  *handle_out = symlink->handle();\n\n  return X_STATUS_SUCCESS;\n}\nDECLARE_XBOXKRNL_EXPORT1(NtOpenSymbolicLinkObject, kFileSystem, kImplemented);\n\n// https://docs.microsoft.com/en-us/windows/win32/devnotes/ntquerysymboliclinkobject\ndword_result_t NtQuerySymbolicLinkObject_entry(\n    dword_t handle, pointer_t<X_ANSI_STRING> target) {\n  auto symlink =\n      kernel_state()->object_table()->LookupObject<XSymbolicLink>(handle);\n  if (!symlink) {\n    return X_STATUS_NO_SUCH_FILE;\n  }\n  auto length = std::min(static_cast<size_t>(target->maximum_length),\n                         symlink->target().size());\n  if (length > 0) {\n    auto target_buf = kernel_memory()->TranslateVirtual(target->pointer);\n    std::memcpy(target_buf, symlink->target().c_str(), length);\n  }\n  target->length = static_cast<uint16_t>(length);\n  return X_STATUS_SUCCESS;\n}\nDECLARE_XBOXKRNL_EXPORT1(NtQuerySymbolicLinkObject, kFileSystem, kImplemented);\n\ndword_result_t FscGetCacheElementCount_entry(dword_t r3) { return 0; }\nDECLARE_XBOXKRNL_EXPORT1(FscGetCacheElementCount, kFileSystem, kStub);\n\ndword_result_t FscSetCacheElementCount_entry(dword_t unk_0, dword_t unk_1) {\n  // unk_0 = 0\n  // unk_1 looks like a count? in what units? 256 is a common value\n  return X_STATUS_SUCCESS;\n}\nDECLARE_XBOXKRNL_EXPORT1(FscSetCacheElementCount, kFileSystem, kStub);\n\ndword_result_t NtDeviceIoControlFile_entry(\n    dword_t handle, dword_t event_handle, dword_t apc_routine,\n    dword_t apc_context, dword_t io_status_block, dword_t io_control_code,\n    lpvoid_t input_buffer, dword_t input_buffer_len, lpvoid_t output_buffer,\n    dword_t output_buffer_len) {\n  // Called by XMountUtilityDrive cache-mounting code\n  // (checks if the returned values look valid, values below seem to pass the\n  // checks)\n  const uint32_t cache_size = 0xFF000;\n\n  const uint32_t X_IOCTL_DISK_GET_DRIVE_GEOMETRY = 0x70000;\n  const uint32_t X_IOCTL_DISK_GET_PARTITION_INFO = 0x74004;\n\n  if (io_control_code == X_IOCTL_DISK_GET_DRIVE_GEOMETRY) {\n    if (output_buffer_len < 0x8) {\n      assert_always();\n      return X_STATUS_BUFFER_TOO_SMALL;\n    }\n    xe::store_and_swap<uint32_t>(output_buffer, cache_size / 512);\n    xe::store_and_swap<uint32_t>(output_buffer + 4, 512);\n  } else if (io_control_code == X_IOCTL_DISK_GET_PARTITION_INFO) {\n    if (output_buffer_len < 0x10) {\n      assert_always();\n      return X_STATUS_BUFFER_TOO_SMALL;\n    }\n    xe::store_and_swap<uint64_t>(output_buffer, 0);\n    xe::store_and_swap<uint64_t>(output_buffer + 8, cache_size);\n  } else {\n    XELOGD(\"NtDeviceIoControlFile(0x{:X}) - unhandled IOCTL!\",\n           uint32_t(io_control_code));\n    assert_always();\n    return X_STATUS_INVALID_PARAMETER;\n  }\n\n  return X_STATUS_SUCCESS;\n}\nDECLARE_XBOXKRNL_EXPORT1(NtDeviceIoControlFile, kFileSystem, kStub);\n\ndword_result_t IoCreateDevice_entry(dword_t device_struct, dword_t r4,\n                                    dword_t r5, dword_t r6, dword_t r7,\n                                    lpdword_t out_struct) {\n  // Called from XMountUtilityDrive XAM-task code\n  // That code tries writing things to a pointer at out_struct+0x18\n  // We'll alloc some scratch space for it so it doesn't cause any exceptions\n\n  // 0x24 is guessed size from accesses to out_struct - likely incorrect\n  auto out_guest = kernel_memory()->SystemHeapAlloc(0x24);\n\n  auto out = kernel_memory()->TranslateVirtual<uint8_t*>(out_guest);\n  memset(out, 0, 0x24);\n\n  // XMountUtilityDrive writes some kind of header here\n  // 0x1000 bytes should be enough to store it\n  auto out_guest2 = kernel_memory()->SystemHeapAlloc(0x1000);\n  xe::store_and_swap(out + 0x18, out_guest2);\n\n  *out_struct = out_guest;\n  return X_STATUS_SUCCESS;\n}\nDECLARE_XBOXKRNL_EXPORT1(IoCreateDevice, kFileSystem, kStub);\n\n}  // namespace xboxkrnl\n}  // namespace kernel\n}  // namespace xe\n\nDECLARE_XBOXKRNL_EMPTY_REGISTER_EXPORTS(Io);\n"
  },
  {
    "path": "src/xenia/kernel/xboxkrnl/xboxkrnl_io_info.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/memory.h\"\n#include \"xenia/base/mutex.h\"\n#include \"xenia/cpu/processor.h\"\n#include \"xenia/kernel/info/file.h\"\n#include \"xenia/kernel/info/volume.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/util/shim_utils.h\"\n#include \"xenia/kernel/xboxkrnl/xboxkrnl_private.h\"\n#include \"xenia/kernel/xevent.h\"\n#include \"xenia/kernel/xfile.h\"\n#include \"xenia/kernel/xiocompletion.h\"\n#include \"xenia/kernel/xsymboliclink.h\"\n#include \"xenia/kernel/xthread.h\"\n#include \"xenia/vfs/device.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xboxkrnl {\n\nuint32_t GetQueryFileInfoMinimumLength(uint32_t info_class) {\n  switch (info_class) {\n    case XFileInternalInformation:\n      return sizeof(X_FILE_INTERNAL_INFORMATION);\n    case XFilePositionInformation:\n      return sizeof(X_FILE_POSITION_INFORMATION);\n    case XFileXctdCompressionInformation:\n      return sizeof(X_FILE_XCTD_COMPRESSION_INFORMATION);\n    case XFileNetworkOpenInformation:\n      return sizeof(X_FILE_NETWORK_OPEN_INFORMATION);\n    // TODO(gibbed): structures to get the size of.\n    case XFileModeInformation:\n    case XFileAlignmentInformation:\n    case XFileSectorInformation:\n    case XFileIoPriorityInformation:\n      return 4;\n    case XFileNameInformation:\n    case XFileAllocationInformation:\n      return 8;\n    case XFileBasicInformation:\n      return 40;\n    default:\n      return 0;\n  }\n}\n\ndword_result_t NtQueryInformationFile_entry(\n    dword_t file_handle, pointer_t<X_IO_STATUS_BLOCK> io_status_block_ptr,\n    lpvoid_t info_ptr, dword_t info_length, dword_t info_class) {\n  uint32_t minimum_length = GetQueryFileInfoMinimumLength(info_class);\n  if (!minimum_length) {\n    return X_STATUS_INVALID_INFO_CLASS;\n  }\n\n  if (info_length < minimum_length) {\n    return X_STATUS_INFO_LENGTH_MISMATCH;\n  }\n\n  auto file = kernel_state()->object_table()->LookupObject<XFile>(file_handle);\n  if (!file) {\n    return X_STATUS_INVALID_HANDLE;\n  }\n\n  info_ptr.Zero(info_length);\n\n  X_STATUS status = X_STATUS_SUCCESS;\n  uint32_t out_length;\n\n  switch (info_class) {\n    case XFileInternalInformation: {\n      // Internal unique file pointer. Not sure why anyone would want this.\n      // TODO(benvanik): use pointer to fs::entry?\n      auto info = info_ptr.as<X_FILE_INTERNAL_INFORMATION*>();\n      info->index_number = xe::memory::hash_combine(0, file->path());\n      out_length = sizeof(*info);\n      break;\n    }\n    case XFilePositionInformation: {\n      auto info = info_ptr.as<X_FILE_POSITION_INFORMATION*>();\n      info->current_byte_offset = file->position();\n      out_length = sizeof(*info);\n      break;\n    }\n    case XFileSectorInformation: {\n      // TODO(benvanik): return sector this file's on.\n      XELOGE(\"NtQueryInformationFile(XFileSectorInformation) unimplemented\");\n      status = X_STATUS_INVALID_PARAMETER;\n      out_length = 0;\n      break;\n    }\n    case XFileXctdCompressionInformation: {\n      XELOGE(\n          \"NtQueryInformationFile(XFileXctdCompressionInformation) \"\n          \"unimplemented\");\n      // Files that are XCTD compressed begin with the magic 0x0FF512ED but we\n      // shouldn't detect this that way. There's probably a flag somewhere\n      // (attributes?) that defines if it's compressed or not.\n      status = X_STATUS_INVALID_PARAMETER;\n      out_length = 0;\n      break;\n    };\n    case XFileNetworkOpenInformation: {\n      // Make sure we're working with up-to-date information, just in case the\n      // file size has changed via something other than NtSetInfoFile\n      // (eg. seems NtWriteFile might extend the file in some cases)\n      file->entry()->update();\n\n      auto info = info_ptr.as<X_FILE_NETWORK_OPEN_INFORMATION*>();\n      info->creation_time = file->entry()->create_timestamp();\n      info->last_access_time = file->entry()->access_timestamp();\n      info->last_write_time = file->entry()->write_timestamp();\n      info->change_time = file->entry()->write_timestamp();\n      info->allocation_size = file->entry()->allocation_size();\n      info->end_of_file = file->entry()->size();\n      info->attributes = file->entry()->attributes();\n      out_length = sizeof(*info);\n      break;\n    }\n    case XFileAlignmentInformation: {\n      // Requested by XMountUtilityDrive XAM-task\n      auto info = info_ptr.as<uint32_t*>();\n      *info = 0;  // FILE_BYTE_ALIGNMENT?\n      out_length = sizeof(*info);\n      break;\n    }\n    default: {\n      // Unsupported, for now.\n      assert_always();\n      status = X_STATUS_INVALID_PARAMETER;\n      out_length = 0;\n      break;\n    }\n  }\n\n  if (io_status_block_ptr) {\n    io_status_block_ptr->status = status;\n    io_status_block_ptr->information = out_length;\n  }\n\n  return status;\n}\nDECLARE_XBOXKRNL_EXPORT1(NtQueryInformationFile, kFileSystem, kImplemented);\n\nuint32_t GetSetFileInfoMinimumLength(uint32_t info_class) {\n  switch (info_class) {\n    case XFileDispositionInformation:\n      return sizeof(X_FILE_DISPOSITION_INFORMATION);\n    case XFilePositionInformation:\n      return sizeof(X_FILE_POSITION_INFORMATION);\n    case XFileCompletionInformation:\n      return sizeof(X_FILE_COMPLETION_INFORMATION);\n    // TODO(gibbed): structures to get the size of.\n    case XFileModeInformation:\n    case XFileIoPriorityInformation:\n      return 4;\n    case XFileAllocationInformation:\n    case XFileEndOfFileInformation:\n    case XFileMountPartitionInformation:\n      return 8;\n    case XFileRenameInformation:\n    case XFileLinkInformation:\n      return 16;\n    case XFileBasicInformation:\n      return 40;\n    case XFileMountPartitionsInformation:\n      return 152;\n    default:\n      return 0;\n  }\n}\n\ndword_result_t NtSetInformationFile_entry(\n    dword_t file_handle, pointer_t<X_IO_STATUS_BLOCK> io_status_block,\n    lpvoid_t info_ptr, dword_t info_length, dword_t info_class) {\n  uint32_t minimum_length = GetSetFileInfoMinimumLength(info_class);\n  if (!minimum_length) {\n    return X_STATUS_INVALID_INFO_CLASS;\n  }\n\n  if (info_length < minimum_length) {\n    return X_STATUS_INFO_LENGTH_MISMATCH;\n  }\n\n  auto file = kernel_state()->object_table()->LookupObject<XFile>(file_handle);\n  if (!file) {\n    return X_STATUS_INVALID_HANDLE;\n  }\n\n  X_STATUS result = X_STATUS_SUCCESS;\n  uint32_t out_length;\n\n  switch (info_class) {\n    case XFileDispositionInformation: {\n      // Used to set deletion flag. Which we don't support. Probably?\n      auto info = info_ptr.as<X_FILE_DISPOSITION_INFORMATION*>();\n      bool delete_on_close = info->delete_file ? true : false;\n      out_length = 0;\n      XELOGW(\"NtSetInformationFile ignoring delete on close: {}\",\n             delete_on_close);\n      break;\n    }\n    case XFilePositionInformation: {\n      auto info = info_ptr.as<X_FILE_POSITION_INFORMATION*>();\n      file->set_position(info->current_byte_offset);\n      out_length = sizeof(*info);\n      break;\n    }\n    case XFileAllocationInformation: {\n      XELOGW(\"NtSetInformationFile ignoring alloc\");\n      out_length = 8;\n      break;\n    }\n    case XFileEndOfFileInformation: {\n      auto info = info_ptr.as<X_FILE_END_OF_FILE_INFORMATION*>();\n      result = file->SetLength(info->end_of_file);\n      out_length = sizeof(*info);\n\n      // Update the files vfs::Entry information\n      file->entry()->update();\n      break;\n    }\n    case XFileCompletionInformation: {\n      // Info contains IO Completion handle and completion key\n      auto info = info_ptr.as<X_FILE_COMPLETION_INFORMATION*>();\n      auto handle = uint32_t(info->handle);\n      auto key = uint32_t(info->key);\n      out_length = sizeof(*info);\n      auto port =\n          kernel_state()->object_table()->LookupObject<XIOCompletion>(handle);\n      if (!port) {\n        result = X_STATUS_INVALID_HANDLE;\n      } else {\n        file->RegisterIOCompletionPort(key, port);\n      }\n      break;\n    }\n    default:\n      // Unsupported, for now.\n      assert_always();\n      out_length = 0;\n      break;\n  }\n\n  if (io_status_block) {\n    io_status_block->status = result;\n    io_status_block->information = out_length;\n  }\n\n  return result;\n}\nDECLARE_XBOXKRNL_EXPORT2(NtSetInformationFile, kFileSystem, kImplemented,\n                         kHighFrequency);\n\nuint32_t GetQueryVolumeInfoMinimumLength(uint32_t info_class) {\n  switch (info_class) {\n    case XFileFsVolumeInformation:\n      return sizeof(X_FILE_FS_VOLUME_INFORMATION);\n    case XFileFsSizeInformation:\n      return sizeof(X_FILE_FS_SIZE_INFORMATION);\n    case XFileFsAttributeInformation:\n      return sizeof(X_FILE_FS_ATTRIBUTE_INFORMATION);\n    // TODO(gibbed): structures to get the size of.\n    case XFileFsDeviceInformation:\n      return 8;\n    default:\n      return 0;\n  }\n}\n\ndword_result_t NtQueryVolumeInformationFile_entry(\n    dword_t file_handle, pointer_t<X_IO_STATUS_BLOCK> io_status_block_ptr,\n    lpvoid_t info_ptr, dword_t info_length, dword_t info_class) {\n  uint32_t minimum_length = GetQueryVolumeInfoMinimumLength(info_class);\n  if (!minimum_length) {\n    return X_STATUS_INVALID_INFO_CLASS;\n  }\n\n  if (info_length < minimum_length) {\n    return X_STATUS_INFO_LENGTH_MISMATCH;\n  }\n\n  auto file = kernel_state()->object_table()->LookupObject<XFile>(file_handle);\n  if (!file) {\n    return X_STATUS_INVALID_HANDLE;\n  }\n\n  info_ptr.Zero(info_length);\n\n  X_STATUS status = X_STATUS_SUCCESS;\n  uint32_t out_length;\n\n  switch (info_class) {\n    case XFileFsVolumeInformation: {\n      auto info = info_ptr.as<X_FILE_FS_VOLUME_INFORMATION*>();\n      info->creation_time = 0;\n      info->serial_number = 0;  // set for FATX, but we don't do that currently\n      info->supports_objects = 0;\n      info->label_length = 0;\n      out_length = offsetof(X_FILE_FS_VOLUME_INFORMATION, label);\n      break;\n    }\n    case XFileFsSizeInformation: {\n      auto device = file->device();\n      auto info = info_ptr.as<X_FILE_FS_SIZE_INFORMATION*>();\n      info->total_allocation_units = device->total_allocation_units();\n      info->available_allocation_units = device->available_allocation_units();\n      info->sectors_per_allocation_unit = device->sectors_per_allocation_unit();\n      info->bytes_per_sector = device->bytes_per_sector();\n      // TODO(gibbed): sanity check, XCTD userland code seems to require this.\n      assert_true(info->bytes_per_sector == 0x200);\n      out_length = sizeof(*info);\n      break;\n    }\n    case XFileFsAttributeInformation: {\n      auto device = file->device();\n      const auto& name = device->name();\n      auto info = info_ptr.as<X_FILE_FS_ATTRIBUTE_INFORMATION*>();\n      info->attributes = device->attributes();\n      info->component_name_max_length = device->component_name_max_length();\n      info->name_length = uint32_t(name.size());\n      if (info_length >= 12 + name.size()) {\n        std::memcpy(info->name, name.data(), name.size());\n        out_length =\n            offsetof(X_FILE_FS_ATTRIBUTE_INFORMATION, name) + info->name_length;\n      } else {\n        status = X_STATUS_BUFFER_OVERFLOW;\n        out_length = offsetof(X_FILE_FS_ATTRIBUTE_INFORMATION, name);\n      }\n      break;\n    }\n    case XFileFsDeviceInformation:\n    default: {\n      // Unsupported, for now.\n      assert_always();\n      out_length = 0;\n      break;\n    }\n  }\n\n  if (io_status_block_ptr) {\n    io_status_block_ptr->status = status;\n    io_status_block_ptr->information = out_length;\n  }\n\n  return status;\n}\nDECLARE_XBOXKRNL_EXPORT1(NtQueryVolumeInformationFile, kFileSystem,\n                         kImplemented);\n\n}  // namespace xboxkrnl\n}  // namespace kernel\n}  // namespace xe\n\nDECLARE_XBOXKRNL_EMPTY_REGISTER_EXPORTS(IoInfo);\n"
  },
  {
    "path": "src/xenia/kernel/xboxkrnl/xboxkrnl_memory.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include <cstring>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/util/shim_utils.h\"\n#include \"xenia/kernel/xboxkrnl/xboxkrnl_private.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xboxkrnl {\n\nuint32_t ToXdkProtectFlags(uint32_t protect) {\n  uint32_t result = 0;\n  if (!(protect & kMemoryProtectRead) && !(protect & kMemoryProtectWrite)) {\n    result = X_PAGE_NOACCESS;\n  } else if ((protect & kMemoryProtectRead) &&\n             !(protect & kMemoryProtectWrite)) {\n    result = X_PAGE_READONLY;\n  } else {\n    result = X_PAGE_READWRITE;\n  }\n  if (protect & kMemoryProtectNoCache) {\n    result |= X_PAGE_NOCACHE;\n  }\n  if (protect & kMemoryProtectWriteCombine) {\n    result |= X_PAGE_WRITECOMBINE;\n  }\n  return result;\n}\n\nuint32_t FromXdkProtectFlags(uint32_t protect) {\n  uint32_t result = 0;\n  if ((protect & X_PAGE_READONLY) | (protect & X_PAGE_EXECUTE_READ)) {\n    result = kMemoryProtectRead;\n  } else if ((protect & X_PAGE_READWRITE) |\n             (protect & X_PAGE_EXECUTE_READWRITE)) {\n    result = kMemoryProtectRead | kMemoryProtectWrite;\n  }\n  if (protect & X_PAGE_NOCACHE) {\n    result |= kMemoryProtectNoCache;\n  }\n  if (protect & X_PAGE_WRITECOMBINE) {\n    result |= kMemoryProtectWriteCombine;\n  }\n  return result;\n}\n\ndword_result_t NtAllocateVirtualMemory_entry(lpdword_t base_addr_ptr,\n                                             lpdword_t region_size_ptr,\n                                             dword_t alloc_type,\n                                             dword_t protect_bits,\n                                             dword_t debug_memory) {\n  // NTSTATUS\n  // _Inout_  PVOID *BaseAddress,\n  // _Inout_  PSIZE_T RegionSize,\n  // _In_     ULONG AllocationType,\n  // _In_     ULONG Protect\n  // _In_     BOOLEAN DebugMemory\n\n  assert_not_null(base_addr_ptr);\n  assert_not_null(region_size_ptr);\n\n  // Set to TRUE when allocation is from devkit memory area.\n  assert_true(debug_memory == 0);\n\n  // This allocates memory from the kernel heap, which is initialized on startup\n  // and shared by both the kernel implementation and user code.\n  // The xe_memory_ref object is used to actually get the memory, and although\n  // it's simple today we could extend it to do better things in the future.\n\n  // Must request a size.\n  if (!base_addr_ptr || !region_size_ptr || !*region_size_ptr) {\n    return X_STATUS_INVALID_PARAMETER;\n  }\n  // Check allocation type.\n  if (!(alloc_type & (X_MEM_COMMIT | X_MEM_RESET | X_MEM_RESERVE))) {\n    return X_STATUS_INVALID_PARAMETER;\n  }\n  // If MEM_RESET is set only MEM_RESET can be set.\n  if (alloc_type & X_MEM_RESET && (alloc_type & ~X_MEM_RESET)) {\n    return X_STATUS_INVALID_PARAMETER;\n  }\n  // Don't allow games to set execute bits.\n  if (protect_bits & (X_PAGE_EXECUTE | X_PAGE_EXECUTE_READ |\n                      X_PAGE_EXECUTE_READWRITE | X_PAGE_EXECUTE_WRITECOPY)) {\n    XELOGW(\"Game setting EXECUTE bit on allocation\");\n  }\n\n  uint32_t page_size;\n  if (*base_addr_ptr != 0) {\n    // ignore specified page size when base address is specified.\n    auto heap = kernel_memory()->LookupHeap(*base_addr_ptr);\n    if (heap->heap_type() != HeapType::kGuestVirtual) {\n      return X_STATUS_INVALID_PARAMETER;\n    }\n    page_size = heap->page_size();\n  } else {\n    // Adjust size.\n    page_size = 4 * 1024;\n    if (alloc_type & X_MEM_LARGE_PAGES) {\n      page_size = 64 * 1024;\n    }\n  }\n\n  // Round the base address down to the nearest page boundary.\n  uint32_t adjusted_base = *base_addr_ptr - (*base_addr_ptr % page_size);\n  // For some reason, some games pass in negative sizes.\n  uint32_t adjusted_size = int32_t(*region_size_ptr) < 0\n                               ? -int32_t(region_size_ptr.value())\n                               : region_size_ptr.value();\n  adjusted_size = xe::round_up(adjusted_size, page_size);\n\n  // Allocate.\n  uint32_t allocation_type = 0;\n  if (alloc_type & X_MEM_RESERVE) {\n    allocation_type |= kMemoryAllocationReserve;\n  }\n  if (alloc_type & X_MEM_COMMIT) {\n    allocation_type |= kMemoryAllocationCommit;\n  }\n  if (alloc_type & X_MEM_RESET) {\n    XELOGE(\"X_MEM_RESET not implemented\");\n    assert_always();\n  }\n  uint32_t protect = FromXdkProtectFlags(protect_bits);\n  uint32_t address = 0;\n  BaseHeap* heap;\n  HeapAllocationInfo prev_alloc_info = {};\n  bool was_commited = false;\n\n  if (adjusted_base != 0) {\n    heap = kernel_memory()->LookupHeap(adjusted_base);\n    if (heap->page_size() != page_size) {\n      // Specified the wrong page size for the wrong heap.\n      return X_STATUS_ACCESS_DENIED;\n    }\n    was_commited = heap->QueryRegionInfo(adjusted_base, &prev_alloc_info) &&\n                   (prev_alloc_info.state & kMemoryAllocationCommit) != 0;\n\n    if (heap->AllocFixed(adjusted_base, adjusted_size, page_size,\n                         allocation_type, protect)) {\n      address = adjusted_base;\n    }\n  } else {\n    bool top_down = !!(alloc_type & X_MEM_TOP_DOWN);\n    heap = kernel_memory()->LookupHeapByType(false, page_size);\n    heap->Alloc(adjusted_size, page_size, allocation_type, protect, top_down,\n                &address);\n  }\n  if (!address) {\n    // Failed - assume no memory available.\n    return X_STATUS_NO_MEMORY;\n  }\n\n  // Zero memory, if needed.\n  if (address && !(alloc_type & X_MEM_NOZERO)) {\n    if (alloc_type & X_MEM_COMMIT) {\n      if (!(protect & kMemoryProtectWrite)) {\n        heap->Protect(address, adjusted_size,\n                      kMemoryProtectRead | kMemoryProtectWrite);\n      }\n      if (!was_commited) {\n        kernel_memory()->Zero(address, adjusted_size);\n      }\n      if (!(protect & kMemoryProtectWrite)) {\n        heap->Protect(address, adjusted_size, protect);\n      }\n    }\n  }\n\n  XELOGD(\"NtAllocateVirtualMemory = {:08X}\", address);\n\n  // Stash back.\n  // Maybe set X_STATUS_ALREADY_COMMITTED if MEM_COMMIT?\n  *base_addr_ptr = address;\n  *region_size_ptr = adjusted_size;\n  return X_STATUS_SUCCESS;\n}\nDECLARE_XBOXKRNL_EXPORT1(NtAllocateVirtualMemory, kMemory, kImplemented);\n\ndword_result_t NtProtectVirtualMemory_entry(lpdword_t base_addr_ptr,\n                                            lpdword_t region_size_ptr,\n                                            dword_t protect_bits,\n                                            lpdword_t old_protect,\n                                            dword_t debug_memory) {\n  // Set to TRUE when this memory refers to devkit memory area.\n  assert_true(debug_memory == 0);\n\n  // Must request a size.\n  if (!base_addr_ptr || !region_size_ptr || !*region_size_ptr) {\n    return X_STATUS_INVALID_PARAMETER;\n  }\n\n  // Don't allow games to set execute bits.\n  if (protect_bits & (X_PAGE_EXECUTE | X_PAGE_EXECUTE_READ |\n                      X_PAGE_EXECUTE_READWRITE | X_PAGE_EXECUTE_WRITECOPY)) {\n    XELOGW(\"Game setting EXECUTE bit on protect\");\n    return X_STATUS_ACCESS_DENIED;\n  }\n\n  auto heap = kernel_memory()->LookupHeap(*base_addr_ptr);\n  if (heap->heap_type() != HeapType::kGuestVirtual) {\n    return X_STATUS_INVALID_PARAMETER;\n  }\n  // Adjust the base downwards to the nearest page boundary.\n  uint32_t adjusted_base =\n      *base_addr_ptr - (*base_addr_ptr % heap->page_size());\n  uint32_t adjusted_size = xe::round_up(*region_size_ptr, heap->page_size());\n  uint32_t protect = FromXdkProtectFlags(protect_bits);\n\n  uint32_t tmp_old_protect = 0;\n\n  // FIXME: I think it's valid for NtProtectVirtualMemory to span regions, but\n  // as of now our implementation will fail in this case. Need to verify.\n  if (!heap->Protect(adjusted_base, adjusted_size, protect, &tmp_old_protect)) {\n    return X_STATUS_ACCESS_DENIED;\n  }\n\n  // Write back output variables.\n  *base_addr_ptr = adjusted_base;\n  *region_size_ptr = adjusted_size;\n\n  if (old_protect) {\n    *old_protect = tmp_old_protect;\n  }\n\n  return X_STATUS_SUCCESS;\n}\nDECLARE_XBOXKRNL_EXPORT1(NtProtectVirtualMemory, kMemory, kImplemented);\n\ndword_result_t NtFreeVirtualMemory_entry(lpdword_t base_addr_ptr,\n                                         lpdword_t region_size_ptr,\n                                         dword_t free_type,\n                                         dword_t debug_memory) {\n  uint32_t base_addr_value = *base_addr_ptr;\n  uint32_t region_size_value = *region_size_ptr;\n  // X_MEM_DECOMMIT | X_MEM_RELEASE\n\n  // NTSTATUS\n  // _Inout_  PVOID *BaseAddress,\n  // _Inout_  PSIZE_T RegionSize,\n  // _In_     ULONG FreeType\n  // _In_     BOOLEAN DebugMemory\n\n  // Set to TRUE when freeing external devkit memory.\n  assert_true(debug_memory == 0);\n\n  if (!base_addr_value) {\n    return X_STATUS_MEMORY_NOT_ALLOCATED;\n  }\n\n  auto heap = kernel_state()->memory()->LookupHeap(base_addr_value);\n  if (heap->heap_type() != HeapType::kGuestVirtual) {\n    return X_STATUS_INVALID_PARAMETER;\n  }\n  bool result = false;\n  if (free_type == X_MEM_DECOMMIT) {\n    // If zero, we may need to query size (free whole region).\n    assert_not_zero(region_size_value);\n\n    region_size_value = xe::round_up(region_size_value, heap->page_size());\n    result = heap->Decommit(base_addr_value, region_size_value);\n  } else {\n    result = heap->Release(base_addr_value, &region_size_value);\n  }\n  if (!result) {\n    return X_STATUS_UNSUCCESSFUL;\n  }\n\n  *base_addr_ptr = base_addr_value;\n  *region_size_ptr = region_size_value;\n  return X_STATUS_SUCCESS;\n}\nDECLARE_XBOXKRNL_EXPORT1(NtFreeVirtualMemory, kMemory, kImplemented);\n\nstruct X_MEMORY_BASIC_INFORMATION {\n  be<uint32_t> base_address;\n  be<uint32_t> allocation_base;\n  be<uint32_t> allocation_protect;\n  be<uint32_t> region_size;\n  be<uint32_t> state;\n  be<uint32_t> protect;\n  be<uint32_t> type;\n};\n\ndword_result_t NtQueryVirtualMemory_entry(\n    dword_t base_address,\n    pointer_t<X_MEMORY_BASIC_INFORMATION> memory_basic_information_ptr) {\n  auto heap = kernel_state()->memory()->LookupHeap(base_address);\n  HeapAllocationInfo alloc_info;\n  if (heap == nullptr || !heap->QueryRegionInfo(base_address, &alloc_info)) {\n    return X_STATUS_INVALID_PARAMETER;\n  }\n\n  memory_basic_information_ptr->base_address = alloc_info.base_address;\n  memory_basic_information_ptr->allocation_base = alloc_info.allocation_base;\n  memory_basic_information_ptr->allocation_protect =\n      ToXdkProtectFlags(alloc_info.allocation_protect);\n  memory_basic_information_ptr->region_size = alloc_info.region_size;\n  // https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-memory_basic_information\n  // State: ... This member can be one of the following values: MEM_COMMIT,\n  // MEM_FREE, MEM_RESERVE.\n  // State queried by Beautiful Katamari before displaying the loading screen.\n  uint32_t x_state;\n  if (alloc_info.state & kMemoryAllocationCommit) {\n    assert_not_zero(alloc_info.state & kMemoryAllocationReserve);\n    x_state = X_MEM_COMMIT;\n  } else if (alloc_info.state & kMemoryAllocationReserve) {\n    x_state = X_MEM_RESERVE;\n  } else {\n    x_state = X_MEM_FREE;\n  }\n  memory_basic_information_ptr->state = x_state;\n  memory_basic_information_ptr->protect = ToXdkProtectFlags(alloc_info.protect);\n  memory_basic_information_ptr->type = X_MEM_PRIVATE;\n\n  return X_STATUS_SUCCESS;\n}\nDECLARE_XBOXKRNL_EXPORT1(NtQueryVirtualMemory, kMemory, kImplemented);\n\ndword_result_t MmAllocatePhysicalMemoryEx_entry(\n    dword_t flags, dword_t region_size, dword_t protect_bits,\n    dword_t min_addr_range, dword_t max_addr_range, dword_t alignment) {\n  // Type will usually be 0 (user request?), where 1 and 2 are sometimes made\n  // by D3D/etc.\n\n  // Check protection bits.\n  if (!(protect_bits & (X_PAGE_READONLY | X_PAGE_READWRITE))) {\n    XELOGE(\"MmAllocatePhysicalMemoryEx: bad protection bits\");\n    return 0;\n  }\n\n  // Either may be OR'ed into protect_bits:\n  // X_PAGE_NOCACHE\n  // X_PAGE_WRITECOMBINE\n  // We could use this to detect what's likely GPU-synchronized memory\n  // and let the GPU know we're messing with it (or even allocate from\n  // the GPU). At least the D3D command buffer is X_PAGE_WRITECOMBINE.\n\n  // Calculate page size.\n  // Default            = 4KB\n  // X_MEM_LARGE_PAGES  = 64KB\n  // X_MEM_16MB_PAGES   = 16MB\n  uint32_t page_size = 4 * 1024;\n  if (protect_bits & X_MEM_LARGE_PAGES) {\n    page_size = 64 * 1024;\n  } else if (protect_bits & X_MEM_16MB_PAGES) {\n    page_size = 16 * 1024 * 1024;\n  }\n\n  // Round up the region size and alignment to the next page.\n  uint32_t adjusted_size = xe::round_up(region_size, page_size);\n  uint32_t adjusted_alignment = xe::round_up(alignment, page_size);\n\n  uint32_t allocation_type = kMemoryAllocationReserve | kMemoryAllocationCommit;\n  uint32_t protect = FromXdkProtectFlags(protect_bits);\n  bool top_down = true;\n  auto heap = static_cast<PhysicalHeap*>(\n      kernel_memory()->LookupHeapByType(true, page_size));\n  // min_addr_range/max_addr_range are bounds in physical memory, not virtual.\n  uint32_t heap_base = heap->heap_base();\n  uint32_t heap_physical_address_offset = heap->GetPhysicalAddress(heap_base);\n  uint32_t heap_min_addr =\n      xe::sat_sub(min_addr_range.value(), heap_physical_address_offset);\n  uint32_t heap_max_addr =\n      xe::sat_sub(max_addr_range.value(), heap_physical_address_offset);\n  uint32_t heap_size = heap->heap_size();\n  heap_min_addr = heap_base + std::min(heap_min_addr, heap_size - 1);\n  heap_max_addr = heap_base + std::min(heap_max_addr, heap_size - 1);\n  uint32_t base_address;\n  if (!heap->AllocRange(heap_min_addr, heap_max_addr, adjusted_size,\n                        adjusted_alignment, allocation_type, protect, top_down,\n                        &base_address)) {\n    // Failed - assume no memory available.\n    return 0;\n  }\n  XELOGD(\"MmAllocatePhysicalMemoryEx = {:08X}\", base_address);\n\n  return base_address;\n}\nDECLARE_XBOXKRNL_EXPORT1(MmAllocatePhysicalMemoryEx, kMemory, kImplemented);\n\ndword_result_t MmAllocatePhysicalMemory_entry(dword_t flags,\n                                              dword_t region_size,\n                                              dword_t protect_bits) {\n  return MmAllocatePhysicalMemoryEx_entry(flags, region_size, protect_bits, 0,\n                                          0xFFFFFFFFu, 0);\n}\nDECLARE_XBOXKRNL_EXPORT1(MmAllocatePhysicalMemory, kMemory, kImplemented);\n\nvoid MmFreePhysicalMemory_entry(dword_t type, dword_t base_address) {\n  // base_address = result of MmAllocatePhysicalMemory.\n\n  assert_true((base_address & 0x1F) == 0);\n\n  auto heap = kernel_state()->memory()->LookupHeap(base_address);\n  heap->Release(base_address);\n}\nDECLARE_XBOXKRNL_EXPORT1(MmFreePhysicalMemory, kMemory, kImplemented);\n\ndword_result_t MmQueryAddressProtect_entry(dword_t base_address) {\n  auto heap = kernel_state()->memory()->LookupHeap(base_address);\n  uint32_t access;\n  if (!heap->QueryProtect(base_address, &access)) {\n    access = 0;\n  }\n  access = !access ? 0 : ToXdkProtectFlags(access);\n\n  return access;\n}\nDECLARE_XBOXKRNL_EXPORT2(MmQueryAddressProtect, kMemory, kImplemented,\n                         kHighFrequency);\n\nvoid MmSetAddressProtect_entry(lpvoid_t base_address, dword_t region_size,\n                               dword_t protect_bits) {\n  if (!protect_bits) {\n    XELOGE(\"MmSetAddressProtect: Failed due to incorrect protect_bits\");\n    return;\n  }\n\n  uint32_t protect = FromXdkProtectFlags(protect_bits);\n  auto heap = kernel_memory()->LookupHeap(base_address);\n  heap->Protect(base_address.guest_address(), region_size, protect);\n}\nDECLARE_XBOXKRNL_EXPORT1(MmSetAddressProtect, kMemory, kImplemented);\n\ndword_result_t MmQueryAllocationSize_entry(lpvoid_t base_address) {\n  auto heap = kernel_state()->memory()->LookupHeap(base_address);\n  uint32_t size;\n  if (!heap->QuerySize(base_address, &size)) {\n    size = 0;\n  }\n\n  return size;\n}\nDECLARE_XBOXKRNL_EXPORT1(MmQueryAllocationSize, kMemory, kImplemented);\n\n// https://code.google.com/p/vdash/source/browse/trunk/vdash/include/kernel.h\nstruct X_MM_QUERY_STATISTICS_SECTION {\n  xe::be<uint32_t> available_pages;\n  xe::be<uint32_t> total_virtual_memory_bytes;\n  xe::be<uint32_t> reserved_virtual_memory_bytes;\n  xe::be<uint32_t> physical_pages;\n  xe::be<uint32_t> pool_pages;\n  xe::be<uint32_t> stack_pages;\n  xe::be<uint32_t> image_pages;\n  xe::be<uint32_t> heap_pages;\n  xe::be<uint32_t> virtual_pages;\n  xe::be<uint32_t> page_table_pages;\n  xe::be<uint32_t> cache_pages;\n};\n\nstruct X_MM_QUERY_STATISTICS_RESULT {\n  xe::be<uint32_t> size;\n  xe::be<uint32_t> total_physical_pages;\n  xe::be<uint32_t> kernel_pages;\n  X_MM_QUERY_STATISTICS_SECTION title;\n  X_MM_QUERY_STATISTICS_SECTION system;\n  xe::be<uint32_t> highest_physical_page;\n};\nstatic_assert_size(X_MM_QUERY_STATISTICS_RESULT, 104);\n\ndword_result_t MmQueryStatistics_entry(\n    pointer_t<X_MM_QUERY_STATISTICS_RESULT> stats_ptr) {\n  if (!stats_ptr) {\n    return X_STATUS_INVALID_PARAMETER;\n  }\n\n  const uint32_t size = sizeof(X_MM_QUERY_STATISTICS_RESULT);\n\n  if (stats_ptr->size != size) {\n    return X_STATUS_BUFFER_TOO_SMALL;\n  }\n\n  // Zero out the struct.\n  stats_ptr.Zero();\n\n  // Set the constants the game is likely asking for.\n  // These numbers are mostly guessed. If the game is just checking for\n  // memory, this should satisfy it. If it's actually verifying things\n  // this won't work :/\n  stats_ptr->size = size;\n\n  stats_ptr->total_physical_pages = 0x00020000;  // 512mb / 4kb pages\n  stats_ptr->kernel_pages = 0x00000300;\n\n  // TODO(gibbed): maybe use LookupHeapByType instead?\n  auto heap_a = kernel_memory()->LookupHeap(0xA0000000);\n  auto heap_c = kernel_memory()->LookupHeap(0xC0000000);\n  auto heap_e = kernel_memory()->LookupHeap(0xE0000000);\n\n  assert_not_null(heap_a);\n  assert_not_null(heap_c);\n  assert_not_null(heap_e);\n\n#define GET_USED_PAGE_COUNT(x) \\\n  (x->GetTotalPageCount() - x->GetUnreservedPageCount())\n#define GET_USED_PAGE_SIZE(x) ((GET_USED_PAGE_COUNT(x) * x->page_size()) / 4096)\n  uint32_t used_pages = 0;\n  used_pages += GET_USED_PAGE_SIZE(heap_a);\n  used_pages += GET_USED_PAGE_SIZE(heap_c);\n  used_pages += GET_USED_PAGE_SIZE(heap_e);\n#undef GET_USED_PAGE_SIZE\n#undef GET_USED_PAGE_COUNT\n\n  assert_true(used_pages < stats_ptr->total_physical_pages);\n\n  stats_ptr->title.available_pages =\n      stats_ptr->total_physical_pages - used_pages;\n  stats_ptr->title.total_virtual_memory_bytes =\n      0x2FFF0000;  // TODO(gibbed): FIXME\n  stats_ptr->title.reserved_virtual_memory_bytes =\n      0x00160000;                                // TODO(gibbed): FIXME\n  stats_ptr->title.physical_pages = 0x00001000;  // TODO(gibbed): FIXME\n  stats_ptr->title.pool_pages = 0x00000010;\n  stats_ptr->title.stack_pages = 0x00000100;\n  stats_ptr->title.image_pages = 0x00000100;\n  stats_ptr->title.heap_pages = 0x00000100;\n  stats_ptr->title.virtual_pages = 0x00000100;\n  stats_ptr->title.page_table_pages = 0x00000100;\n  stats_ptr->title.cache_pages = 0x00000100;\n\n  stats_ptr->system.available_pages = 0x00000000;\n  stats_ptr->system.total_virtual_memory_bytes = 0x00000000;\n  stats_ptr->system.reserved_virtual_memory_bytes = 0x00000000;\n  stats_ptr->system.physical_pages = 0x00000000;\n  stats_ptr->system.pool_pages = 0x00000000;\n  stats_ptr->system.stack_pages = 0x00000000;\n  stats_ptr->system.image_pages = 0x00000000;\n  stats_ptr->system.heap_pages = 0x00000000;\n  stats_ptr->system.virtual_pages = 0x00000000;\n  stats_ptr->system.page_table_pages = 0x00000000;\n  stats_ptr->system.cache_pages = 0x00000000;\n\n  stats_ptr->highest_physical_page = 0x0001FFFF;\n\n  return X_STATUS_SUCCESS;\n}\nDECLARE_XBOXKRNL_EXPORT1(MmQueryStatistics, kMemory, kImplemented);\n\n// https://msdn.microsoft.com/en-us/library/windows/hardware/ff554547(v=vs.85).aspx\ndword_result_t MmGetPhysicalAddress_entry(dword_t base_address) {\n  // PHYSICAL_ADDRESS MmGetPhysicalAddress(\n  //   _In_  PVOID BaseAddress\n  // );\n  // base_address = result of MmAllocatePhysicalMemory.\n  uint32_t physical_address = kernel_memory()->GetPhysicalAddress(base_address);\n  assert_true(physical_address != UINT32_MAX);\n  if (physical_address == UINT32_MAX) {\n    physical_address = 0;\n  }\n  return physical_address;\n}\nDECLARE_XBOXKRNL_EXPORT1(MmGetPhysicalAddress, kMemory, kImplemented);\n\ndword_result_t MmMapIoSpace_entry(dword_t unk0, lpvoid_t src_address,\n                                  dword_t size, dword_t flags) {\n  // I've only seen this used to map XMA audio contexts.\n  // The code seems fine with taking the src address, so this just returns that.\n  // If others start using it there could be problems.\n  assert_true(unk0 == 2);\n  assert_true(size == 0x40);\n  assert_true(flags == 0x404);\n\n  return src_address.guest_address();\n}\nDECLARE_XBOXKRNL_EXPORT1(MmMapIoSpace, kMemory, kImplemented);\n\ndword_result_t ExAllocatePoolTypeWithTag_entry(dword_t size, dword_t tag,\n                                               dword_t zero) {\n  uint32_t alignment = 8;\n  uint32_t adjusted_size = size;\n  if (adjusted_size < 4 * 1024) {\n    adjusted_size = xe::round_up(adjusted_size, 4 * 1024);\n  } else {\n    alignment = 4 * 1024;\n  }\n\n  uint32_t addr =\n      kernel_state()->memory()->SystemHeapAlloc(adjusted_size, alignment);\n\n  return addr;\n}\nDECLARE_XBOXKRNL_EXPORT1(ExAllocatePoolTypeWithTag, kMemory, kImplemented);\n\ndword_result_t ExAllocatePool_entry(dword_t size) {\n  const uint32_t none = 0x656E6F4E;  // 'None'\n  return ExAllocatePoolTypeWithTag_entry(size, none, 0);\n}\nDECLARE_XBOXKRNL_EXPORT1(ExAllocatePool, kMemory, kImplemented);\n\nvoid ExFreePool_entry(lpvoid_t base_address) {\n  kernel_state()->memory()->SystemHeapFree(base_address);\n}\nDECLARE_XBOXKRNL_EXPORT1(ExFreePool, kMemory, kImplemented);\n\ndword_result_t KeGetImagePageTableEntry_entry(lpvoid_t address) {\n  // Unknown\n  return 1;\n}\nDECLARE_XBOXKRNL_EXPORT1(KeGetImagePageTableEntry, kMemory, kStub);\n\ndword_result_t KeLockL2_entry() {\n  // TODO\n  return 0;\n}\nDECLARE_XBOXKRNL_EXPORT1(KeLockL2, kMemory, kStub);\n\nvoid KeUnlockL2_entry() {}\nDECLARE_XBOXKRNL_EXPORT1(KeUnlockL2, kMemory, kStub);\n\ndword_result_t MmCreateKernelStack_entry(dword_t stack_size, dword_t r4) {\n  assert_zero(r4);  // Unknown argument.\n\n  auto stack_size_aligned = (stack_size + 0xFFF) & 0xFFFFF000;\n  uint32_t stack_alignment = (stack_size & 0xF000) ? 0x1000 : 0x10000;\n\n  uint32_t stack_address;\n  kernel_memory()\n      ->LookupHeap(0x70000000)\n      ->AllocRange(0x70000000, 0x7F000000, stack_size_aligned, stack_alignment,\n                   kMemoryAllocationReserve | kMemoryAllocationCommit,\n                   kMemoryProtectRead | kMemoryProtectWrite, false,\n                   &stack_address);\n  return stack_address + stack_size;\n}\nDECLARE_XBOXKRNL_EXPORT1(MmCreateKernelStack, kMemory, kImplemented);\n\ndword_result_t MmDeleteKernelStack_entry(lpvoid_t stack_base,\n                                         lpvoid_t stack_end) {\n  // Release the stack (where stack_end is the low address)\n  if (kernel_memory()->LookupHeap(0x70000000)->Release(stack_end)) {\n    return X_STATUS_SUCCESS;\n  }\n\n  return X_STATUS_UNSUCCESSFUL;\n}\nDECLARE_XBOXKRNL_EXPORT1(MmDeleteKernelStack, kMemory, kImplemented);\n\n}  // namespace xboxkrnl\n}  // namespace kernel\n}  // namespace xe\n\nDECLARE_XBOXKRNL_EMPTY_REGISTER_EXPORTS(Memory);\n"
  },
  {
    "path": "src/xenia/kernel/xboxkrnl/xboxkrnl_misc.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/logging.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/util/shim_utils.h\"\n#include \"xenia/kernel/xboxkrnl/xboxkrnl_private.h\"\n#include \"xenia/kernel/xthread.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xboxkrnl {\n\nvoid KeEnableFpuExceptions_entry(dword_t enabled) {\n  // TODO(benvanik): can we do anything about exceptions?\n}\nDECLARE_XBOXKRNL_EXPORT1(KeEnableFpuExceptions, kNone, kStub);\n\n}  // namespace xboxkrnl\n}  // namespace kernel\n}  // namespace xe\n\nDECLARE_XBOXKRNL_EMPTY_REGISTER_EXPORTS(Misc);\n"
  },
  {
    "path": "src/xenia/kernel/xboxkrnl/xboxkrnl_module.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/kernel/xboxkrnl/xboxkrnl_module.h\"\n\n#include <vector>\n\n#include \"third_party/fmt/include/fmt/format.h\"\n#include \"xenia/base/clock.h\"\n#include \"xenia/base/debugging.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/cpu/ppc/ppc_context.h\"\n#include \"xenia/cpu/processor.h\"\n#include \"xenia/emulator.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/user_module.h\"\n#include \"xenia/kernel/xboxkrnl/cert_monitor.h\"\n#include \"xenia/kernel/xboxkrnl/debug_monitor.h\"\n#include \"xenia/kernel/xboxkrnl/xboxkrnl_private.h\"\n#include \"xenia/kernel/xthread.h\"\n\nDEFINE_string(cl, \"\", \"Specify additional command-line provided to guest.\",\n              \"Kernel\");\n\nDEFINE_bool(kernel_debug_monitor, false, \"Enable debug monitor.\", \"Kernel\");\nDEFINE_bool(kernel_cert_monitor, false, \"Enable cert monitor.\", \"Kernel\");\nDEFINE_bool(kernel_pix, false, \"Enable PIX.\", \"Kernel\");\n\nnamespace xe {\nnamespace kernel {\nnamespace xboxkrnl {\n\nbool XboxkrnlModule::SendPIXCommand(const char* cmd) {\n  if (!cvars::kernel_pix) {\n    return false;\n  }\n\n  auto global_lock = global_critical_region_.Acquire();\n  if (!XThread::IsInThread()) {\n    assert_always();\n    return false;\n  }\n\n  uint32_t scratch_size = 260 + 260;\n  auto scratch_ptr = memory_->SystemHeapAlloc(scratch_size);\n  auto scratch = memory_->TranslateVirtual(scratch_ptr);\n  std::memset(scratch, 0, scratch_size);\n\n  auto response = reinterpret_cast<char*>(scratch + 0);\n  auto command = reinterpret_cast<char*>(scratch + 260);\n\n  fmt::format_to_n(command, 259, \"PIX!m!{}\", cmd);\n\n  global_lock.unlock();\n  uint64_t args[] = {scratch_ptr + 260, scratch_ptr, 260};\n  auto result = kernel_state_->processor()->Execute(\n      XThread::GetCurrentThread()->thread_state(), pix_function_, args,\n      xe::countof(args));\n  global_lock.lock();\n\n  XELOGD(\"PIX(command): {}\", cmd);\n  XELOGD(\"PIX(response): {}\", response);\n\n  memory_->SystemHeapFree(scratch_ptr);\n\n  if (XSUCCEEDED(result)) {\n    return true;\n  }\n\n  return false;\n}\n\nXboxkrnlModule::XboxkrnlModule(Emulator* emulator, KernelState* kernel_state)\n    : KernelModule(kernel_state, \"xe:\\\\xboxkrnl.exe\"),\n      timestamp_timer_(nullptr) {\n  RegisterExportTable(export_resolver_);\n\n  // Register all exported functions.\n#define XE_MODULE_EXPORT_GROUP(m, n) \\\n  Register##n##Exports(export_resolver_, kernel_state_);\n#include \"xboxkrnl_module_export_groups.inc\"\n#undef XE_MODULE_EXPORT_GROUP\n\n  // KeDebugMonitorData (?*)\n  // Set to a valid value when a remote debugger is attached.\n  // Offset 0x18 is a 4b pointer to a handler function that seems to take two\n  // arguments. If we wanted to see what would happen we could fake that.\n  uint32_t pKeDebugMonitorData;\n  if (!cvars::kernel_debug_monitor) {\n    pKeDebugMonitorData = memory_->SystemHeapAlloc(4);\n    auto lpKeDebugMonitorData = memory_->TranslateVirtual(pKeDebugMonitorData);\n    xe::store_and_swap<uint32_t>(lpKeDebugMonitorData, 0);\n  } else {\n    pKeDebugMonitorData =\n        memory_->SystemHeapAlloc(4 + sizeof(X_KEDEBUGMONITORDATA));\n    xe::store_and_swap<uint32_t>(memory_->TranslateVirtual(pKeDebugMonitorData),\n                                 pKeDebugMonitorData + 4);\n    auto lpKeDebugMonitorData =\n        memory_->TranslateVirtual<X_KEDEBUGMONITORDATA*>(pKeDebugMonitorData +\n                                                         4);\n    std::memset(lpKeDebugMonitorData, 0, sizeof(X_KEDEBUGMONITORDATA));\n    lpKeDebugMonitorData->callback_fn =\n        GenerateTrampoline(\"KeDebugMonitorCallback\", KeDebugMonitorCallback);\n  }\n  export_resolver_->SetVariableMapping(\n      \"xboxkrnl.exe\", ordinals::KeDebugMonitorData, pKeDebugMonitorData);\n\n  // KeCertMonitorData (?*)\n  // Always set to zero, ignored.\n  uint32_t pKeCertMonitorData;\n  if (!cvars::kernel_cert_monitor) {\n    pKeCertMonitorData = memory_->SystemHeapAlloc(4);\n    auto lpKeCertMonitorData = memory_->TranslateVirtual(pKeCertMonitorData);\n    xe::store_and_swap<uint32_t>(lpKeCertMonitorData, 0);\n  } else {\n    pKeCertMonitorData =\n        memory_->SystemHeapAlloc(4 + sizeof(X_KECERTMONITORDATA));\n    xe::store_and_swap<uint32_t>(memory_->TranslateVirtual(pKeCertMonitorData),\n                                 pKeCertMonitorData + 4);\n    auto lpKeCertMonitorData =\n        memory_->TranslateVirtual<X_KECERTMONITORDATA*>(pKeCertMonitorData + 4);\n    std::memset(lpKeCertMonitorData, 0, sizeof(X_KECERTMONITORDATA));\n    lpKeCertMonitorData->callback_fn =\n        GenerateTrampoline(\"KeCertMonitorCallback\", KeCertMonitorCallback);\n  }\n  export_resolver_->SetVariableMapping(\n      \"xboxkrnl.exe\", ordinals::KeCertMonitorData, pKeCertMonitorData);\n\n  // XboxHardwareInfo (XboxHardwareInfo_t, 16b)\n  // flags       cpu#  ?     ?     ?     ?           ?       ?\n  // 0x00000000, 0x06, 0x00, 0x00, 0x00, 0x00000000, 0x0000, 0x0000\n  // Games seem to check if bit 26 (0x20) is set, which at least for xbox1\n  // was whether an HDD was present. Not sure what the other flags are.\n  //\n  // aomega08 says the value is 0x02000817, bit 27: debug mode on.\n  // When that is set, though, allocs crash in weird ways.\n  //\n  // From kernel dissasembly, after storage is initialized\n  // XboxHardwareInfo flags is set with flag 5 (0x20).\n  uint32_t pXboxHardwareInfo = memory_->SystemHeapAlloc(16);\n  auto lpXboxHardwareInfo = memory_->TranslateVirtual(pXboxHardwareInfo);\n  export_resolver_->SetVariableMapping(\n      \"xboxkrnl.exe\", ordinals::XboxHardwareInfo, pXboxHardwareInfo);\n  xe::store_and_swap<uint32_t>(lpXboxHardwareInfo + 0, 0x20);  // flags\n  xe::store_and_swap<uint8_t>(lpXboxHardwareInfo + 4, 0x06);   // cpu count\n  // Remaining 11b are zeroes?\n\n  // ExConsoleGameRegion, probably same values as keyvault region uses?\n  // Just return all 0xFF, should satisfy anything that checks it\n  uint32_t pExConsoleGameRegion = memory_->SystemHeapAlloc(4);\n  auto lpExConsoleGameRegion = memory_->TranslateVirtual(pExConsoleGameRegion);\n  export_resolver_->SetVariableMapping(\n      \"xboxkrnl.exe\", ordinals::ExConsoleGameRegion, pExConsoleGameRegion);\n  xe::store<uint32_t>(lpExConsoleGameRegion, 0xFFFFFFFF);\n\n  // XexExecutableModuleHandle (?**)\n  // Games try to dereference this to get a pointer to some module struct.\n  // So far it seems like it's just in loader code, and only used to look up\n  // the XexHeaderBase for use by RtlImageXexHeaderField.\n  // We fake it so that the address passed to that looks legit.\n  // 0x80100FFC <- pointer to structure\n  // 0x80101000 <- our module structure\n  // 0x80101058 <- pointer to xex header\n  // 0x80101100 <- xex header base\n  uint32_t ppXexExecutableModuleHandle = memory_->SystemHeapAlloc(4);\n  export_resolver_->SetVariableMapping(\"xboxkrnl.exe\",\n                                       ordinals::XexExecutableModuleHandle,\n                                       ppXexExecutableModuleHandle);\n\n  // ExLoadedImageName (char*)\n  // The full path to loaded image/xex including its name.\n  // Used usually in custom dashboards (Aurora)\n  // Todo(Gliniak): Confirm that official kernel always allocate space for this\n  // variable.\n  uint32_t ppExLoadedImageName =\n      memory_->SystemHeapAlloc(kExLoadedImageNameSize);\n  export_resolver_->SetVariableMapping(\n      \"xboxkrnl.exe\", ordinals::ExLoadedImageName, ppExLoadedImageName);\n\n  // ExLoadedCommandLine (char*)\n  // The name of the xex. Not sure this is ever really used on real devices.\n  // Perhaps it's how swap disc/etc data is sent?\n  // Always set to \"default.xex\" (with quotes) for now.\n  // TODO(gibbed): set this to the actual module name.\n  std::string command_line(\"\\\"default.xex\\\"\");\n  if (cvars::cl.length()) {\n    command_line += \" \" + cvars::cl;\n  }\n  uint32_t command_line_length =\n      xe::align(static_cast<uint32_t>(command_line.length()) + 1, 1024u);\n  uint32_t pExLoadedCommandLine = memory_->SystemHeapAlloc(command_line_length);\n  auto lpExLoadedCommandLine = memory_->TranslateVirtual(pExLoadedCommandLine);\n  export_resolver_->SetVariableMapping(\n      \"xboxkrnl.exe\", ordinals::ExLoadedCommandLine, pExLoadedCommandLine);\n  std::memset(lpExLoadedCommandLine, 0, command_line_length);\n  std::memcpy(lpExLoadedCommandLine, command_line.c_str(),\n              command_line.length());\n\n  // XboxKrnlVersion (8b)\n  // Kernel version, looks like 2b.2b.2b.2b.\n  // I've only seen games check >=, so we just fake something here.\n  uint32_t pXboxKrnlVersion = memory_->SystemHeapAlloc(8);\n  auto lpXboxKrnlVersion = memory_->TranslateVirtual(pXboxKrnlVersion);\n  export_resolver_->SetVariableMapping(\n      \"xboxkrnl.exe\", ordinals::XboxKrnlVersion, pXboxKrnlVersion);\n  xe::store_and_swap<uint16_t>(lpXboxKrnlVersion + 0, 2);\n  xe::store_and_swap<uint16_t>(lpXboxKrnlVersion + 2, 0xFFFF);\n  xe::store_and_swap<uint16_t>(lpXboxKrnlVersion + 4, 0xFFFF);\n  xe::store_and_swap<uint8_t>(lpXboxKrnlVersion + 6, 0x80);\n  xe::store_and_swap<uint8_t>(lpXboxKrnlVersion + 7, 0x00);\n\n  // KeTimeStampBundle (ad)\n  // This must be updated during execution, at 1ms intevals.\n  // We setup a system timer here to do that.\n  uint32_t pKeTimeStampBundle = memory_->SystemHeapAlloc(24);\n  auto lpKeTimeStampBundle = memory_->TranslateVirtual(pKeTimeStampBundle);\n  export_resolver_->SetVariableMapping(\n      \"xboxkrnl.exe\", ordinals::KeTimeStampBundle, pKeTimeStampBundle);\n  xe::store_and_swap<uint64_t>(lpKeTimeStampBundle + 0, 0);\n  xe::store_and_swap<uint64_t>(lpKeTimeStampBundle + 8, 0);\n  xe::store_and_swap<uint32_t>(lpKeTimeStampBundle + 16,\n                               Clock::QueryGuestUptimeMillis());\n  xe::store_and_swap<uint32_t>(lpKeTimeStampBundle + 20, 0);\n  timestamp_timer_ = xe::threading::HighResolutionTimer::CreateRepeating(\n      std::chrono::milliseconds(1), [lpKeTimeStampBundle]() {\n        xe::store_and_swap<uint32_t>(lpKeTimeStampBundle + 16,\n                                     Clock::QueryGuestUptimeMillis());\n      });\n}\n\nstatic auto& get_xboxkrnl_exports() {\n  static std::vector<xe::cpu::Export*> xboxkrnl_exports(4096);\n  return xboxkrnl_exports;\n}\n\nxe::cpu::Export* RegisterExport_xboxkrnl(xe::cpu::Export* export_entry) {\n  auto& xboxkrnl_exports = get_xboxkrnl_exports();\n  assert_true(export_entry->ordinal < xboxkrnl_exports.size());\n  xboxkrnl_exports[export_entry->ordinal] = export_entry;\n  return export_entry;\n}\n\nvoid XboxkrnlModule::RegisterExportTable(\n    xe::cpu::ExportResolver* export_resolver) {\n  assert_not_null(export_resolver);\n\n// Build the export table used for resolution.\n#include \"xenia/kernel/util/export_table_pre.inc\"\n  static xe::cpu::Export xboxkrnl_export_table[] = {\n#include \"xenia/kernel/xboxkrnl/xboxkrnl_table.inc\"\n  };\n#include \"xenia/kernel/util/export_table_post.inc\"\n  auto& xboxkrnl_exports = get_xboxkrnl_exports();\n  for (size_t i = 0; i < xe::countof(xboxkrnl_export_table); ++i) {\n    auto& export_entry = xboxkrnl_export_table[i];\n    assert_true(export_entry.ordinal < xboxkrnl_exports.size());\n    if (!xboxkrnl_exports[export_entry.ordinal]) {\n      xboxkrnl_exports[export_entry.ordinal] = &export_entry;\n    }\n  }\n  export_resolver->RegisterTable(\"xboxkrnl.exe\", &xboxkrnl_exports);\n}\n\nXboxkrnlModule::~XboxkrnlModule() = default;\n\n}  // namespace xboxkrnl\n}  // namespace kernel\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/kernel/xboxkrnl/xboxkrnl_module.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_KERNEL_XBOXKRNL_XBOXKRNL_MODULE_H_\n#define XENIA_KERNEL_XBOXKRNL_XBOXKRNL_MODULE_H_\n\n#include <memory>\n\n#include \"xenia/base/threading.h\"\n#include \"xenia/cpu/export_resolver.h\"\n#include \"xenia/kernel/kernel_module.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/xboxkrnl/xboxkrnl_ordinals.h\"\n\n// All of the exported functions:\n#include \"xenia/kernel/xboxkrnl/xboxkrnl_rtl.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xboxkrnl {\n\nclass XboxkrnlModule : public KernelModule {\n public:\n  static constexpr size_t kExLoadedImageNameSize = 255 + 1;\n\n  XboxkrnlModule(Emulator* emulator, KernelState* kernel_state);\n  virtual ~XboxkrnlModule();\n\n  static void RegisterExportTable(xe::cpu::ExportResolver* export_resolver);\n\n  bool SendPIXCommand(const char* cmd);\n\n  void set_pix_function(uint32_t addr) { pix_function_ = addr; }\n\n protected:\n  uint32_t pix_function_ = 0;\n\n private:\n  std::unique_ptr<xe::threading::HighResolutionTimer> timestamp_timer_;\n};\n\n}  // namespace xboxkrnl\n}  // namespace kernel\n}  // namespace xe\n\n#endif  // XENIA_KERNEL_XBOXKRNL_XBOXKRNL_MODULE_H_\n"
  },
  {
    "path": "src/xenia/kernel/xboxkrnl/xboxkrnl_module_export_groups.inc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n// This is a partial file designed to be included by other files when\n// constructing various tables.\n\nXE_MODULE_EXPORT_GROUP(xboxkrnl, Audio)\nXE_MODULE_EXPORT_GROUP(xboxkrnl, AudioXma)\nXE_MODULE_EXPORT_GROUP(xboxkrnl, Crypt)\nXE_MODULE_EXPORT_GROUP(xboxkrnl, Debug)\nXE_MODULE_EXPORT_GROUP(xboxkrnl, Error)\nXE_MODULE_EXPORT_GROUP(xboxkrnl, Hal)\nXE_MODULE_EXPORT_GROUP(xboxkrnl, Hid)\nXE_MODULE_EXPORT_GROUP(xboxkrnl, Io)\nXE_MODULE_EXPORT_GROUP(xboxkrnl, IoInfo)\nXE_MODULE_EXPORT_GROUP(xboxkrnl, Memory)\nXE_MODULE_EXPORT_GROUP(xboxkrnl, Misc)\nXE_MODULE_EXPORT_GROUP(xboxkrnl, Module)\nXE_MODULE_EXPORT_GROUP(xboxkrnl, Ob)\nXE_MODULE_EXPORT_GROUP(xboxkrnl, Rtl)\nXE_MODULE_EXPORT_GROUP(xboxkrnl, String)\nXE_MODULE_EXPORT_GROUP(xboxkrnl, Threading)\nXE_MODULE_EXPORT_GROUP(xboxkrnl, Usbcam)\nXE_MODULE_EXPORT_GROUP(xboxkrnl, Video)\nXE_MODULE_EXPORT_GROUP(xboxkrnl, XConfig)\n"
  },
  {
    "path": "src/xenia/kernel/xboxkrnl/xboxkrnl_modules.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/logging.h\"\n#include \"xenia/cpu/processor.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/user_module.h\"\n#include \"xenia/kernel/util/shim_utils.h\"\n#include \"xenia/kernel/xboxkrnl/xboxkrnl_private.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xboxkrnl {\n\ndword_result_t XexCheckExecutablePrivilege_entry(dword_t privilege) {\n  // BOOL\n  // DWORD Privilege\n\n  // Privilege is bit position in xe_xex2_system_flags enum - so:\n  // Privilege=6 -> 0x00000040 -> XEX_SYSTEM_INSECURE_SOCKETS\n  uint32_t mask = 1 << privilege;\n\n  auto module = kernel_state()->GetExecutableModule();\n  if (!module) {\n    return 0;\n  }\n\n  uint32_t flags = 0;\n  module->GetOptHeader<uint32_t>(XEX_HEADER_SYSTEM_FLAGS, &flags);\n\n  return (flags & mask) > 0;\n}\nDECLARE_XBOXKRNL_EXPORT1(XexCheckExecutablePrivilege, kModules, kImplemented);\n\ndword_result_t XexGetModuleHandle_entry(lpstring_t module_name,\n                                        lpdword_t hmodule_ptr) {\n  object_ref<XModule> module;\n\n  if (!module_name) {\n    module = kernel_state()->GetExecutableModule();\n  } else {\n    module = kernel_state()->GetModule(module_name.value());\n  }\n\n  if (!module) {\n    *hmodule_ptr = 0;\n    return X_ERROR_NOT_FOUND;\n  }\n\n  // NOTE: we don't retain the handle for return.\n  *hmodule_ptr = module->hmodule_ptr();\n\n  return X_ERROR_SUCCESS;\n}\nDECLARE_XBOXKRNL_EXPORT1(XexGetModuleHandle, kModules, kImplemented);\n\ndword_result_t XexGetModuleSection_entry(lpvoid_t hmodule, lpstring_t name,\n                                         lpdword_t data_ptr,\n                                         lpdword_t size_ptr) {\n  X_STATUS result = X_STATUS_SUCCESS;\n\n  auto module = XModule::GetFromHModule(kernel_state(), hmodule);\n  if (module) {\n    uint32_t section_data = 0;\n    uint32_t section_size = 0;\n    result = module->GetSection(name.value(), &section_data, &section_size);\n    if (XSUCCEEDED(result)) {\n      *data_ptr = section_data;\n      *size_ptr = section_size;\n    }\n  } else {\n    result = X_STATUS_INVALID_HANDLE;\n  }\n\n  return result;\n}\nDECLARE_XBOXKRNL_EXPORT1(XexGetModuleSection, kModules, kImplemented);\n\ndword_result_t XexLoadImage_entry(lpstring_t module_name, dword_t module_flags,\n                                  dword_t min_version, lpdword_t hmodule_ptr) {\n  X_STATUS result = X_STATUS_NO_SUCH_FILE;\n\n  uint32_t hmodule = 0;\n  auto module = kernel_state()->GetModule(module_name.value());\n  if (module) {\n    // Existing module found.\n    hmodule = module->hmodule_ptr();\n    result = X_STATUS_SUCCESS;\n  } else {\n    // Not found; attempt to load as a user module.\n    auto user_module = kernel_state()->LoadUserModule(module_name.value());\n    if (user_module) {\n      // Give up object ownership, this reference will be released by the last\n      // XexUnloadImage call\n      auto user_module_raw = user_module.release();\n      hmodule = user_module_raw->hmodule_ptr();\n      result = X_STATUS_SUCCESS;\n    }\n  }\n\n  // Increment the module's load count.\n  if (hmodule) {\n    auto ldr_data =\n        kernel_memory()->TranslateVirtual<X_LDR_DATA_TABLE_ENTRY*>(hmodule);\n    ldr_data->load_count++;\n  }\n\n  *hmodule_ptr = hmodule;\n\n  return result;\n}\nDECLARE_XBOXKRNL_EXPORT1(XexLoadImage, kModules, kImplemented);\n\ndword_result_t XexUnloadImage_entry(lpvoid_t hmodule) {\n  auto module = XModule::GetFromHModule(kernel_state(), hmodule);\n  if (!module) {\n    return X_STATUS_INVALID_HANDLE;\n  }\n\n  // Can't unload kernel modules from user code.\n  if (module->module_type() != XModule::ModuleType::kKernelModule) {\n    auto ldr_data = hmodule.as<X_LDR_DATA_TABLE_ENTRY*>();\n    if (--ldr_data->load_count == 0) {\n      // No more references, free it.\n      module->Release();\n      kernel_state()->UnloadUserModule(object_ref<UserModule>(\n          reinterpret_cast<UserModule*>(module.release())));\n    }\n  }\n\n  return X_STATUS_SUCCESS;\n}\nDECLARE_XBOXKRNL_EXPORT1(XexUnloadImage, kModules, kImplemented);\n\ndword_result_t XexGetProcedureAddress_entry(lpvoid_t hmodule, dword_t ordinal,\n                                            lpdword_t out_function_ptr) {\n  // May be entry point?\n  assert_not_zero(ordinal);\n\n  bool is_string_name = (ordinal & 0xFFFF0000) != 0;\n  auto string_name =\n      reinterpret_cast<const char*>(kernel_memory()->TranslateVirtual(ordinal));\n\n  X_STATUS result = X_STATUS_INVALID_HANDLE;\n\n  object_ref<XModule> module;\n  if (!hmodule) {\n    module = kernel_state()->GetExecutableModule();\n  } else {\n    module = XModule::GetFromHModule(kernel_state(), hmodule);\n  }\n  if (module) {\n    uint32_t ptr;\n    if (is_string_name) {\n      ptr = module->GetProcAddressByName(string_name);\n    } else {\n      ptr = module->GetProcAddressByOrdinal(ordinal);\n    }\n    if (ptr) {\n      *out_function_ptr = ptr;\n      result = X_STATUS_SUCCESS;\n    } else {\n      if (is_string_name) {\n        XELOGW(\"ERROR: XexGetProcedureAddress export '{}' in '{}' not found!\",\n               string_name, module->name());\n      } else {\n        XELOGW(\n            \"ERROR: XexGetProcedureAddress ordinal {} (0x{:X}) in '{}' not \"\n            \"found!\",\n            ordinal, ordinal, module->name());\n      }\n      *out_function_ptr = 0;\n      result = X_STATUS_DRIVER_ENTRYPOINT_NOT_FOUND;\n    }\n  }\n\n  return result;\n}\nDECLARE_XBOXKRNL_EXPORT1(XexGetProcedureAddress, kModules, kImplemented);\n\nvoid ExRegisterTitleTerminateNotification_entry(\n    pointer_t<X_EX_TITLE_TERMINATE_REGISTRATION> reg, dword_t create) {\n  if (create) {\n    // Adding.\n    kernel_state()->RegisterTitleTerminateNotification(\n        reg->notification_routine, reg->priority);\n  } else {\n    // Removing.\n    kernel_state()->RemoveTitleTerminateNotification(reg->notification_routine);\n  }\n}\nDECLARE_XBOXKRNL_EXPORT1(ExRegisterTitleTerminateNotification, kModules,\n                         kImplemented);\n\n}  // namespace xboxkrnl\n}  // namespace kernel\n}  // namespace xe\n\nDECLARE_XBOXKRNL_EMPTY_REGISTER_EXPORTS(Module);\n"
  },
  {
    "path": "src/xenia/kernel/xboxkrnl/xboxkrnl_ob.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/util/shim_utils.h\"\n#include \"xenia/kernel/xboxkrnl/xboxkrnl_private.h\"\n#include \"xenia/kernel/xobject.h\"\n#include \"xenia/kernel/xsemaphore.h\"\n#include \"xenia/kernel/xthread.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xboxkrnl {\n\ndword_result_t ObOpenObjectByName_entry(lpunknown_t obj_attributes_ptr,\n                                        lpunknown_t object_type_ptr,\n                                        dword_t unk, lpdword_t handle_ptr) {\n  // r3 = ptr to info?\n  //   +0 = -4\n  //   +4 = name ptr\n  //   +8 = 0\n  // r4 = ExEventObjectType | ExSemaphoreObjectType | ExTimerObjectType\n  // r5 = 0\n  // r6 = out_ptr (handle?)\n\n  if (!obj_attributes_ptr) {\n    return X_STATUS_INVALID_PARAMETER;\n  }\n\n  auto obj_attributes = kernel_memory()->TranslateVirtual<X_OBJECT_ATTRIBUTES*>(\n      obj_attributes_ptr);\n  assert_true(obj_attributes->name_ptr != 0);\n  auto name = util::TranslateAnsiStringAddress(kernel_memory(),\n                                               obj_attributes->name_ptr);\n\n  X_HANDLE handle = X_INVALID_HANDLE_VALUE;\n  X_STATUS result =\n      kernel_state()->object_table()->GetObjectByName(name, &handle);\n  if (XSUCCEEDED(result)) {\n    *handle_ptr = handle;\n  }\n\n  return result;\n}\nDECLARE_XBOXKRNL_EXPORT1(ObOpenObjectByName, kNone, kImplemented);\n\ndword_result_t ObOpenObjectByPointer_entry(lpvoid_t object_ptr,\n                                           lpdword_t out_handle_ptr) {\n  auto object = XObject::GetNativeObject<XObject>(kernel_state(), object_ptr);\n  if (!object) {\n    return X_STATUS_UNSUCCESSFUL;\n  }\n\n  // Retain the handle. Will be released in NtClose.\n  object->RetainHandle();\n  *out_handle_ptr = object->handle();\n  return X_STATUS_SUCCESS;\n}\nDECLARE_XBOXKRNL_EXPORT1(ObOpenObjectByPointer, kNone, kImplemented);\n\ndword_result_t ObLookupThreadByThreadId_entry(dword_t thread_id,\n                                              lpdword_t out_object_ptr) {\n  auto thread = kernel_state()->GetThreadByID(thread_id);\n  if (!thread) {\n    return X_STATUS_NOT_FOUND;\n  }\n\n  // Retain the object. Will be released in ObDereferenceObject.\n  thread->RetainHandle();\n  *out_object_ptr = thread->guest_object();\n  return X_STATUS_SUCCESS;\n}\nDECLARE_XBOXKRNL_EXPORT1(ObLookupThreadByThreadId, kNone, kImplemented);\n\ndword_result_t ObReferenceObjectByHandle_entry(dword_t handle,\n                                               dword_t object_type_ptr,\n                                               lpdword_t out_object_ptr) {\n  // These values come from how Xenia handles uninitialized kernel data exports.\n  // D###BEEF where ### is the ordinal.\n  const static std::unordered_map<XObject::Type, uint32_t> object_types = {\n      {XObject::Type::Event, 0xD00EBEEF},\n      {XObject::Type::Semaphore, 0xD017BEEF},\n      {XObject::Type::Thread, 0xD01BBEEF}};\n  auto object = kernel_state()->object_table()->LookupObject<XObject>(handle);\n  if (!object) {\n    return X_STATUS_INVALID_HANDLE;\n  }\n\n  uint32_t native_ptr = object->guest_object();\n  auto object_type = object_types.find(object->type());\n  if (object_type != object_types.end()) {\n    if (object_type_ptr && object_type_ptr != object_type->second) {\n      return X_STATUS_OBJECT_TYPE_MISMATCH;\n    }\n  } else {\n    assert_unhandled_case(object->type());\n    native_ptr = 0xDEADF00D;\n  }\n  // Caller takes the reference.\n  // It's released in ObDereferenceObject.\n  object->RetainHandle();\n  if (out_object_ptr.guest_address()) {\n    *out_object_ptr = native_ptr;\n  }\n  return X_STATUS_SUCCESS;\n}\nDECLARE_XBOXKRNL_EXPORT1(ObReferenceObjectByHandle, kNone, kImplemented);\n\ndword_result_t ObReferenceObjectByName_entry(lpstring_t name,\n                                             dword_t attributes,\n                                             dword_t object_type_ptr,\n                                             lpvoid_t parse_context,\n                                             lpdword_t out_object_ptr) {\n  X_HANDLE handle = X_INVALID_HANDLE_VALUE;\n  X_STATUS result =\n      kernel_state()->object_table()->GetObjectByName(name.value(), &handle);\n  if (XSUCCEEDED(result)) {\n    return ObReferenceObjectByHandle_entry(handle, object_type_ptr,\n                                           out_object_ptr);\n  }\n\n  return result;\n}\nDECLARE_XBOXKRNL_EXPORT1(ObReferenceObjectByName, kNone, kImplemented);\n\ndword_result_t ObDereferenceObject_entry(dword_t native_ptr) {\n  // Check if a dummy value from ObReferenceObjectByHandle.\n  if (native_ptr == 0xDEADF00D) {\n    return 0;\n  }\n\n  auto object = XObject::GetNativeObject<XObject>(\n      kernel_state(), kernel_memory()->TranslateVirtual(native_ptr));\n  if (object) {\n    object->ReleaseHandle();\n  }\n\n  return 0;\n}\nDECLARE_XBOXKRNL_EXPORT1(ObDereferenceObject, kNone, kImplemented);\n\ndword_result_t ObCreateSymbolicLink_entry(pointer_t<X_ANSI_STRING> path_ptr,\n                                          pointer_t<X_ANSI_STRING> target_ptr) {\n  auto path = xe::utf8::canonicalize_guest_path(\n      util::TranslateAnsiString(kernel_memory(), path_ptr));\n  auto target = xe::utf8::canonicalize_guest_path(\n      util::TranslateAnsiString(kernel_memory(), target_ptr));\n\n  if (xe::utf8::starts_with(path, u8\"\\\\??\\\\\")) {\n    path = path.substr(4);  // Strip the full qualifier\n  }\n\n  if (!kernel_state()->file_system()->RegisterSymbolicLink(path, target)) {\n    return X_STATUS_UNSUCCESSFUL;\n  }\n\n  return X_STATUS_SUCCESS;\n}\nDECLARE_XBOXKRNL_EXPORT1(ObCreateSymbolicLink, kNone, kImplemented);\n\ndword_result_t ObDeleteSymbolicLink_entry(pointer_t<X_ANSI_STRING> path_ptr) {\n  auto path = util::TranslateAnsiString(kernel_memory(), path_ptr);\n  if (!kernel_state()->file_system()->UnregisterSymbolicLink(path)) {\n    return X_STATUS_UNSUCCESSFUL;\n  }\n\n  return X_STATUS_SUCCESS;\n}\nDECLARE_XBOXKRNL_EXPORT1(ObDeleteSymbolicLink, kNone, kImplemented);\n\ndword_result_t NtDuplicateObject_entry(dword_t handle, lpdword_t new_handle_ptr,\n                                       dword_t options) {\n  // NOTE: new_handle_ptr can be zero to just close a handle.\n  // NOTE: this function seems to be used to get the current thread handle\n  //       (passed handle=-2).\n  // This function actually just creates a new handle to the same object.\n  // Most games use it to get real handles to the current thread or whatever.\n\n  X_HANDLE new_handle = X_INVALID_HANDLE_VALUE;\n  X_STATUS result =\n      kernel_state()->object_table()->DuplicateHandle(handle, &new_handle);\n\n  if (new_handle_ptr) {\n    *new_handle_ptr = new_handle;\n  }\n\n  if (options == 1 /* DUPLICATE_CLOSE_SOURCE */) {\n    // Always close the source object.\n    kernel_state()->object_table()->RemoveHandle(handle);\n  }\n\n  return result;\n}\nDECLARE_XBOXKRNL_EXPORT1(NtDuplicateObject, kNone, kImplemented);\n\ndword_result_t NtClose_entry(dword_t handle) {\n  return kernel_state()->object_table()->ReleaseHandle(handle);\n}\nDECLARE_XBOXKRNL_EXPORT1(NtClose, kNone, kImplemented);\n\n}  // namespace xboxkrnl\n}  // namespace kernel\n}  // namespace xe\n\nDECLARE_XBOXKRNL_EMPTY_REGISTER_EXPORTS(Ob);\n"
  },
  {
    "path": "src/xenia/kernel/xboxkrnl/xboxkrnl_ordinals.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_KERNEL_XBOXKRNL_XBOXKRNL_ORDINALS_H_\n#define XENIA_KERNEL_XBOXKRNL_XBOXKRNL_ORDINALS_H_\n\n#include \"xenia/cpu/export_resolver.h\"\n\n// Build an ordinal enum to make it easy to lookup ordinals.\n#include \"xenia/kernel/util/ordinal_table_pre.inc\"\nnamespace ordinals {\nenum {\n#include \"xenia/kernel/xboxkrnl/xboxkrnl_table.inc\"\n};\n}  // namespace ordinals\n#include \"xenia/kernel/util/ordinal_table_post.inc\"\n\n#endif  // XENIA_KERNEL_XBOXKRNL_XBOXKRNL_ORDINALS_H_\n"
  },
  {
    "path": "src/xenia/kernel/xboxkrnl/xboxkrnl_private.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_KERNEL_XBOXKRNL_XBOXKRNL_PRIVATE_H_\n#define XENIA_KERNEL_XBOXKRNL_XBOXKRNL_PRIVATE_H_\n\n#include \"xenia/cpu/export_resolver.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/xboxkrnl/xboxkrnl_ordinals.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xboxkrnl {\n\nxe::cpu::Export* RegisterExport_xboxkrnl(xe::cpu::Export* export_entry);\n\n// Registration functions, one per file.\n#define XE_MODULE_EXPORT_GROUP(m, n)                                  \\\n  void Register##n##Exports(xe::cpu::ExportResolver* export_resolver, \\\n                            KernelState* kernel_state);\n#include \"xboxkrnl_module_export_groups.inc\"\n#undef XE_MODULE_EXPORT_GROUP\n\n}  // namespace xboxkrnl\n}  // namespace kernel\n}  // namespace xe\n\n#endif  // XENIA_KERNEL_XBOXKRNL_XBOXKRNL_PRIVATE_H_\n"
  },
  {
    "path": "src/xenia/kernel/xboxkrnl/xboxkrnl_rtl.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/kernel/xboxkrnl/xboxkrnl_rtl.h\"\n\n#include <algorithm>\n#include <string>\n\n#include \"xenia/base/atomic.h\"\n#include \"xenia/base/chrono.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/string.h\"\n#include \"xenia/base/threading.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/user_module.h\"\n#include \"xenia/kernel/util/shim_utils.h\"\n#include \"xenia/kernel/xboxkrnl/xboxkrnl_private.h\"\n#include \"xenia/kernel/xboxkrnl/xboxkrnl_threading.h\"\n#include \"xenia/kernel/xevent.h\"\n#include \"xenia/kernel/xthread.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xboxkrnl {\n\n// https://msdn.microsoft.com/en-us/library/ff561778\ndword_result_t RtlCompareMemory_entry(lpvoid_t source1, lpvoid_t source2,\n                                      dword_t length) {\n  uint8_t* p1 = source1;\n  uint8_t* p2 = source2;\n\n  // Note that the return value is the number of bytes that match, so it's best\n  // we just do this ourselves vs. using memcmp.\n  // On Windows we could use the builtin function.\n\n  uint32_t c = 0;\n  for (uint32_t n = 0; n < length; n++, p1++, p2++) {\n    if (*p1 == *p2) {\n      c++;\n    }\n  }\n\n  return c;\n}\nDECLARE_XBOXKRNL_EXPORT1(RtlCompareMemory, kMemory, kImplemented);\n\n// https://msdn.microsoft.com/en-us/library/ff552123\ndword_result_t RtlCompareMemoryUlong_entry(lpvoid_t source, dword_t length,\n                                           dword_t pattern) {\n  // Return 0 if source/length not aligned\n  if (source.guest_address() % 4 || length % 4) {\n    return 0;\n  }\n\n  uint32_t n = 0;\n  for (uint32_t i = 0; i < (length / 4); i++) {\n    // FIXME: This assumes as_array returns xe::be\n    uint32_t val = source.as_array<uint32_t>()[i];\n    if (val == pattern) {\n      n++;\n    }\n  }\n\n  return n;\n}\nDECLARE_XBOXKRNL_EXPORT1(RtlCompareMemoryUlong, kMemory, kImplemented);\n\n// https://msdn.microsoft.com/en-us/library/ff552263\nvoid RtlFillMemoryUlong_entry(lpvoid_t destination, dword_t length,\n                              dword_t pattern) {\n  // NOTE: length must be % 4, so we can work on uint32s.\n  uint32_t count = length >> 2;\n\n  uint32_t* p = destination.as<uint32_t*>();\n  uint32_t swapped_pattern = xe::byte_swap(pattern.value());\n  for (uint32_t n = 0; n < count; n++, p++) {\n    *p = swapped_pattern;\n  }\n}\nDECLARE_XBOXKRNL_EXPORT1(RtlFillMemoryUlong, kMemory, kImplemented);\n\ndword_result_t RtlUpperChar_entry(dword_t in) {\n  char c = in & 0xFF;\n  if (c >= 'a' && c <= 'z') {\n    return c ^ 0x20;\n  }\n\n  return c;\n}\nDECLARE_XBOXKRNL_EXPORT1(RtlUpperChar, kNone, kImplemented);\n\ndword_result_t RtlLowerChar_entry(dword_t in) {\n  char c = in & 0xFF;\n  if (c >= 'A' && c <= 'Z') {\n    return c ^ 0x20;\n  }\n\n  return c;\n}\nDECLARE_XBOXKRNL_EXPORT1(RtlLowerChar, kNone, kImplemented);\n\ndword_result_t RtlCompareString_entry(lpstring_t string_1, lpstring_t string_2,\n                                      dword_t case_insensitive) {\n  int ret = case_insensitive ? xe_strcasecmp(string_1, string_2)\n                             : std::strcmp(string_1, string_2);\n\n  return ret;\n}\nDECLARE_XBOXKRNL_EXPORT1(RtlCompareString, kNone, kImplemented);\n\ndword_result_t RtlCompareStringN_entry(lpstring_t string_1,\n                                       dword_t string_1_len,\n                                       lpstring_t string_2,\n                                       dword_t string_2_len,\n                                       dword_t case_insensitive) {\n  uint32_t len1 = string_1_len;\n  uint32_t len2 = string_2_len;\n\n  if (string_1_len == 0xFFFF) {\n    len1 = uint32_t(std::strlen(string_1));\n  }\n  if (string_2_len == 0xFFFF) {\n    len2 = uint32_t(std::strlen(string_2));\n  }\n  auto len = std::min(string_1_len, string_2_len);\n\n  int ret = case_insensitive ? xe_strncasecmp(string_1, string_2, len)\n                             : std::strncmp(string_1, string_2, len);\n\n  return ret;\n}\nDECLARE_XBOXKRNL_EXPORT1(RtlCompareStringN, kNone, kImplemented);\n\n// https://msdn.microsoft.com/en-us/library/ff561918\nvoid RtlInitAnsiString_entry(pointer_t<X_ANSI_STRING> destination,\n                             lpstring_t source) {\n  if (source) {\n    uint16_t length = (uint16_t)strlen(source);\n    destination->length = length;\n    destination->maximum_length = length + 1;\n  } else {\n    destination->reset();\n  }\n\n  destination->pointer = source.guest_address();\n}\nDECLARE_XBOXKRNL_EXPORT1(RtlInitAnsiString, kNone, kImplemented);\n\n// https://msdn.microsoft.com/en-us/library/ff561899\nvoid RtlFreeAnsiString_entry(pointer_t<X_ANSI_STRING> string) {\n  if (string->pointer) {\n    kernel_memory()->SystemHeapFree(string->pointer);\n  }\n\n  string->reset();\n}\nDECLARE_XBOXKRNL_EXPORT1(RtlFreeAnsiString, kNone, kImplemented);\n\n// https://msdn.microsoft.com/en-us/library/ff561934\nvoid RtlInitUnicodeString_entry(pointer_t<X_UNICODE_STRING> destination,\n                                lpu16string_t source) {\n  if (source) {\n    destination->length = (uint16_t)source.value().size() * 2;\n    destination->maximum_length = (uint16_t)(source.value().size() + 1) * 2;\n    destination->pointer = source.guest_address();\n  } else {\n    destination->reset();\n  }\n}\nDECLARE_XBOXKRNL_EXPORT1(RtlInitUnicodeString, kNone, kImplemented);\n\n// https://msdn.microsoft.com/en-us/library/ff561903\nvoid RtlFreeUnicodeString_entry(pointer_t<X_UNICODE_STRING> string) {\n  if (string->pointer) {\n    kernel_memory()->SystemHeapFree(string->pointer);\n  }\n\n  string->reset();\n}\nDECLARE_XBOXKRNL_EXPORT1(RtlFreeUnicodeString, kNone, kImplemented);\n\nvoid RtlCopyString_entry(pointer_t<X_ANSI_STRING> destination,\n                         pointer_t<X_ANSI_STRING> source) {\n  if (!source) {\n    destination->length = 0;\n    return;\n  }\n\n  auto length = std::min(destination->maximum_length, source->length);\n  if (length > 0) {\n    auto dst_buf = kernel_memory()->TranslateVirtual(destination->pointer);\n    auto src_buf = kernel_memory()->TranslateVirtual(source->pointer);\n    std::memcpy(dst_buf, src_buf, length);\n  }\n  destination->length = length;\n}\nDECLARE_XBOXKRNL_EXPORT1(RtlCopyString, kNone, kImplemented);\n\nvoid RtlCopyUnicodeString_entry(pointer_t<X_UNICODE_STRING> destination,\n                                pointer_t<X_UNICODE_STRING> source) {\n  if (!source) {\n    destination->length = 0;\n    return;\n  }\n\n  auto length = std::min(destination->maximum_length, source->length);\n  if (length > 0) {\n    auto dst_buf = kernel_memory()->TranslateVirtual(destination->pointer);\n    auto src_buf = kernel_memory()->TranslateVirtual(source->pointer);\n    std::memcpy(dst_buf, src_buf, length * 2);\n  }\n  destination->length = length;\n}\nDECLARE_XBOXKRNL_EXPORT1(RtlCopyUnicodeString, kNone, kImplemented);\n\n// https://msdn.microsoft.com/en-us/library/ff562969\ndword_result_t RtlUnicodeStringToAnsiString_entry(\n    pointer_t<X_ANSI_STRING> destination_ptr,\n    pointer_t<X_UNICODE_STRING> source_ptr, dword_t alloc_dest) {\n  // NTSTATUS\n  // _Inout_  PANSI_STRING DestinationString,\n  // _In_     PCUNICODE_STRING SourceString,\n  // _In_     BOOLEAN AllocateDestinationString\n\n  std::u16string unicode_str =\n      util::TranslateUnicodeString(kernel_memory(), source_ptr);\n  std::string ansi_str = xe::to_utf8(unicode_str);\n  if (ansi_str.size() > 0xFFFF - 1) {\n    return X_STATUS_INVALID_PARAMETER_2;\n  }\n\n  X_STATUS result = X_STATUS_SUCCESS;\n  if (alloc_dest) {\n    uint32_t buffer_ptr =\n        kernel_memory()->SystemHeapAlloc(uint32_t(ansi_str.size() + 1));\n\n    memcpy(kernel_memory()->TranslateVirtual(buffer_ptr), ansi_str.data(),\n           ansi_str.size() + 1);\n    destination_ptr->length = static_cast<uint16_t>(ansi_str.size());\n    destination_ptr->maximum_length =\n        static_cast<uint16_t>(ansi_str.size() + 1);\n    destination_ptr->pointer = static_cast<uint32_t>(buffer_ptr);\n  } else {\n    uint32_t buffer_capacity = destination_ptr->maximum_length;\n    auto buffer_ptr =\n        kernel_memory()->TranslateVirtual(destination_ptr->pointer);\n    if (buffer_capacity < ansi_str.size() + 1) {\n      // Too large - we just write what we can.\n      result = X_STATUS_BUFFER_OVERFLOW;\n      memcpy(buffer_ptr, ansi_str.data(), buffer_capacity - 1);\n    } else {\n      memcpy(buffer_ptr, ansi_str.data(), ansi_str.size() + 1);\n    }\n    buffer_ptr[buffer_capacity - 1] = 0;  // \\0\n  }\n  return result;\n}\nDECLARE_XBOXKRNL_EXPORT1(RtlUnicodeStringToAnsiString, kNone, kImplemented);\n\n// https://msdn.microsoft.com/en-us/library/ff553113\ndword_result_t RtlMultiByteToUnicodeN_entry(lpword_t destination_ptr,\n                                            dword_t destination_len,\n                                            lpdword_t written_ptr,\n                                            pointer_t<uint8_t> source_ptr,\n                                            dword_t source_len) {\n  uint32_t copy_len = destination_len >> 1;\n  copy_len = copy_len < source_len ? copy_len : source_len.value();\n\n  // TODO(benvanik): maybe use MultiByteToUnicode on Win32? would require\n  // swapping.\n\n  for (uint32_t i = 0; i < copy_len; i++) {\n    destination_ptr[i] = source_ptr[i];\n  }\n\n  if (written_ptr.guest_address() != 0) {\n    *written_ptr = copy_len << 1;\n  }\n\n  return 0;\n}\nDECLARE_XBOXKRNL_EXPORT3(RtlMultiByteToUnicodeN, kNone, kImplemented,\n                         kHighFrequency, kSketchy);\n\n// https://msdn.microsoft.com/en-us/library/ff553261\ndword_result_t RtlUnicodeToMultiByteN_entry(pointer_t<uint8_t> destination_ptr,\n                                            dword_t destination_len,\n                                            lpdword_t written_ptr,\n                                            lpword_t source_ptr,\n                                            dword_t source_len) {\n  uint32_t copy_len = source_len >> 1;\n  copy_len = copy_len < destination_len ? copy_len : destination_len.value();\n\n  // TODO(benvanik): maybe use UnicodeToMultiByte on Win32?\n  for (uint32_t i = 0; i < copy_len; i++) {\n    uint16_t c = source_ptr[i];\n    destination_ptr[i] = c < 256 ? (uint8_t)c : '?';\n  }\n\n  if (written_ptr.guest_address() != 0) {\n    *written_ptr = copy_len;\n  }\n  return 0;\n}\nDECLARE_XBOXKRNL_EXPORT3(RtlUnicodeToMultiByteN, kNone, kImplemented,\n                         kHighFrequency, kSketchy);\n\n// https://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/Executable%20Images/RtlImageNtHeader.html\npointer_result_t RtlImageNtHeader_entry(lpvoid_t module) {\n  if (!module) {\n    return 0;\n  }\n\n  // Little-endian! no swapping!\n\n  auto dos_header = module.as<const uint8_t*>();\n  auto dos_magic = *reinterpret_cast<const uint16_t*>(&dos_header[0x00]);\n  if (dos_magic != 0x5A4D) {  // 'MZ'\n    return 0;\n  }\n  auto dos_lfanew = *reinterpret_cast<const int32_t*>(&dos_header[0x3C]);\n\n  auto nt_header = &dos_header[dos_lfanew];\n  auto nt_magic = *reinterpret_cast<const uint32_t*>(&nt_header[0x00]);\n  if (nt_magic != 0x4550) {  // 'PE'\n    return 0;\n  }\n  return kernel_memory()->HostToGuestVirtual(nt_header);\n}\nDECLARE_XBOXKRNL_EXPORT1(RtlImageNtHeader, kNone, kImplemented);\n\npointer_result_t RtlImageXexHeaderField_entry(pointer_t<xex2_header> xex_header,\n                                              dword_t field_dword) {\n  uint32_t field_value = 0;\n  uint32_t field = field_dword;  // VS acts weird going from dword_t -> enum\n\n  UserModule::GetOptHeader(kernel_memory(), xex_header, xex2_header_keys(field),\n                           &field_value);\n\n  return field_value;\n}\nDECLARE_XBOXKRNL_EXPORT1(RtlImageXexHeaderField, kNone, kImplemented);\n\n// Unfortunately the Windows RTL_CRITICAL_SECTION object is bigger than the one\n// on the 360 (32b vs. 28b). This means that we can't do in-place splatting of\n// the critical sections. Also, the 360 never calls RtlDeleteCriticalSection\n// so we can't clean up the native handles.\n//\n// Because of this, we reimplement it poorly. Hooray.\n// We have 28b to work with so we need to be careful. We map our struct directly\n// into guest memory, as it should be opaque and so long as our size is right\n// the user code will never know.\n//\n// Ref:\n// https://web.archive.org/web/20161214022602/https://msdn.microsoft.com/en-us/magazine/cc164040.aspx\n// Ref:\n// https://github.com/reactos/reactos/blob/master/sdk/lib/rtl/critical.c\n\n// This structure tries to match the one on the 360 as best I can figure out.\n// Unfortunately some games have the critical sections pre-initialized in\n// their embedded data and InitializeCriticalSection will never be called.\n#pragma pack(push, 1)\nstruct X_RTL_CRITICAL_SECTION {\n  X_DISPATCH_HEADER header;\n  int32_t lock_count;               // 0x10 -1 -> 0 on first lock\n  xe::be<int32_t> recursion_count;  // 0x14  0 -> 1 on first lock\n  xe::be<uint32_t> owning_thread;   // 0x18 PKTHREAD 0 unless locked\n};\n#pragma pack(pop)\nstatic_assert_size(X_RTL_CRITICAL_SECTION, 28);\n\nvoid xeRtlInitializeCriticalSection(X_RTL_CRITICAL_SECTION* cs,\n                                    uint32_t cs_ptr) {\n  cs->header.type = 1;      // EventSynchronizationObject (auto reset)\n  cs->header.absolute = 0;  // spin count div 256\n  cs->header.signal_state = 0;\n  cs->lock_count = -1;\n  cs->recursion_count = 0;\n  cs->owning_thread = 0;\n}\n\nvoid RtlInitializeCriticalSection_entry(pointer_t<X_RTL_CRITICAL_SECTION> cs) {\n  xeRtlInitializeCriticalSection(cs, cs.guest_address());\n}\nDECLARE_XBOXKRNL_EXPORT1(RtlInitializeCriticalSection, kNone, kImplemented);\n\nX_STATUS xeRtlInitializeCriticalSectionAndSpinCount(X_RTL_CRITICAL_SECTION* cs,\n                                                    uint32_t cs_ptr,\n                                                    uint32_t spin_count) {\n  // Spin count is rounded up to 256 intervals then packed in.\n  // uint32_t spin_count_div_256 = (uint32_t)floor(spin_count / 256.0f + 0.5f);\n  uint32_t spin_count_div_256 = (spin_count + 255) >> 8;\n  if (spin_count_div_256 > 255) {\n    spin_count_div_256 = 255;\n  }\n\n  cs->header.type = 1;  // EventSynchronizationObject (auto reset)\n  cs->header.absolute = spin_count_div_256;\n  cs->header.signal_state = 0;\n  cs->lock_count = -1;\n  cs->recursion_count = 0;\n  cs->owning_thread = 0;\n\n  return X_STATUS_SUCCESS;\n}\n\ndword_result_t RtlInitializeCriticalSectionAndSpinCount_entry(\n    pointer_t<X_RTL_CRITICAL_SECTION> cs, dword_t spin_count) {\n  return xeRtlInitializeCriticalSectionAndSpinCount(cs, cs.guest_address(),\n                                                    spin_count);\n}\nDECLARE_XBOXKRNL_EXPORT1(RtlInitializeCriticalSectionAndSpinCount, kNone,\n                         kImplemented);\n\nvoid RtlEnterCriticalSection_entry(pointer_t<X_RTL_CRITICAL_SECTION> cs) {\n  uint32_t cur_thread = XThread::GetCurrentThread()->guest_object();\n  uint32_t spin_count = cs->header.absolute * 256;\n\n  if (cs->owning_thread == cur_thread) {\n    // We already own the lock.\n    xe::atomic_inc(&cs->lock_count);\n    cs->recursion_count++;\n    return;\n  }\n\n  // Spin loop\n  while (spin_count--) {\n    if (xe::atomic_cas(-1, 0, &cs->lock_count)) {\n      // Acquired.\n      cs->owning_thread = cur_thread;\n      cs->recursion_count = 1;\n      return;\n    }\n  }\n\n  if (xe::atomic_inc(&cs->lock_count) != 0) {\n    // Create a full waiter.\n    xeKeWaitForSingleObject(reinterpret_cast<void*>(cs.host_address()), 8, 0, 0,\n                            nullptr);\n  }\n\n  assert_true(cs->owning_thread == 0);\n  cs->owning_thread = cur_thread;\n  cs->recursion_count = 1;\n}\nDECLARE_XBOXKRNL_EXPORT2(RtlEnterCriticalSection, kNone, kImplemented,\n                         kHighFrequency);\n\ndword_result_t RtlTryEnterCriticalSection_entry(\n    pointer_t<X_RTL_CRITICAL_SECTION> cs) {\n  uint32_t thread = XThread::GetCurrentThread()->guest_object();\n\n  if (xe::atomic_cas(-1, 0, &cs->lock_count)) {\n    // Able to steal the lock right away.\n    cs->owning_thread = thread;\n    cs->recursion_count = 1;\n    return 1;\n  } else if (cs->owning_thread == thread) {\n    // Already own the lock.\n    xe::atomic_inc(&cs->lock_count);\n    ++cs->recursion_count;\n    return 1;\n  }\n\n  // Failed to acquire lock.\n  return 0;\n}\nDECLARE_XBOXKRNL_EXPORT2(RtlTryEnterCriticalSection, kNone, kImplemented,\n                         kHighFrequency);\n\nvoid RtlLeaveCriticalSection_entry(pointer_t<X_RTL_CRITICAL_SECTION> cs) {\n  assert_true(cs->owning_thread == XThread::GetCurrentThread()->guest_object());\n\n  // Drop recursion count - if it isn't zero we still have the lock.\n  assert_true(cs->recursion_count > 0);\n  if (--cs->recursion_count != 0) {\n    assert_true(cs->recursion_count >= 0);\n\n    xe::atomic_dec(&cs->lock_count);\n    return;\n  }\n\n  // Not owned - unlock!\n  cs->owning_thread = 0;\n  if (xe::atomic_dec(&cs->lock_count) != -1) {\n    // There were waiters - wake one of them.\n    xeKeSetEvent(reinterpret_cast<X_KEVENT*>(cs.host_address()), 1, 0);\n  }\n}\nDECLARE_XBOXKRNL_EXPORT2(RtlLeaveCriticalSection, kNone, kImplemented,\n                         kHighFrequency);\n\nstruct X_TIME_FIELDS {\n  xe::be<uint16_t> year;\n  xe::be<uint16_t> month;\n  xe::be<uint16_t> day;\n  xe::be<uint16_t> hour;\n  xe::be<uint16_t> minute;\n  xe::be<uint16_t> second;\n  xe::be<uint16_t> milliseconds;\n  xe::be<uint16_t> weekday;\n};\nstatic_assert_size(X_TIME_FIELDS, 16);\n\n// https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/nf-wdm-rtltimetotimefields\nvoid RtlTimeToTimeFields_entry(lpqword_t time_ptr,\n                               pointer_t<X_TIME_FIELDS> time_fields_ptr) {\n  // Use host clock because we don't want scaling to be applied, just conversion\n  using xe::chrono::WinSystemClock;\n  auto tp =\n      WinSystemClock::to_sys(WinSystemClock::from_file_time(time_ptr.value()));\n  auto dp = date::floor<date::days>(tp);\n  auto year_month_day = date::year_month_day{dp};\n  auto weekday = date::weekday{dp};\n  auto time = date::hh_mm_ss{date::floor<std::chrono::milliseconds>(tp - dp)};\n  time_fields_ptr->year = static_cast<int>(year_month_day.year());\n  time_fields_ptr->month = static_cast<unsigned>(year_month_day.month());\n  time_fields_ptr->day = static_cast<unsigned>(year_month_day.day());\n  time_fields_ptr->weekday = weekday.c_encoding();\n  time_fields_ptr->hour = time.hours().count();\n  time_fields_ptr->minute = time.minutes().count();\n  time_fields_ptr->second = static_cast<uint16_t>(time.seconds().count());\n  time_fields_ptr->milliseconds =\n      static_cast<uint16_t>(time.subseconds().count());\n}\nDECLARE_XBOXKRNL_EXPORT1(RtlTimeToTimeFields, kNone, kImplemented);\n\n// https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/nf-wdm-rtltimefieldstotime\ndword_result_t RtlTimeFieldsToTime_entry(\n    pointer_t<X_TIME_FIELDS> time_fields_ptr, lpqword_t time_ptr) {\n  using xe::chrono::WinSystemClock;\n  if (time_fields_ptr->year < 1601 || time_fields_ptr->month < 1 ||\n      time_fields_ptr->month > 12 || time_fields_ptr->day < 1 ||\n      time_fields_ptr->day > 31 || time_fields_ptr->hour > 23 ||\n      time_fields_ptr->minute > 59 || time_fields_ptr->second > 59 ||\n      time_fields_ptr->milliseconds > 999) {\n    return 0;\n  }\n  auto year = date::year{time_fields_ptr->year};\n  auto month = date::month{time_fields_ptr->month};\n  auto day = date::day{time_fields_ptr->day};\n  auto year_month_day = date::year_month_day{year, month, day};\n  if (!year_month_day.ok()) {\n    return 0;\n  }\n  auto dp = static_cast<date::sys_days>(year_month_day);\n  std::chrono::system_clock::time_point time = dp;\n  time += std::chrono::hours{time_fields_ptr->hour};\n  time += std::chrono::minutes{time_fields_ptr->minute};\n  time += std::chrono::seconds{time_fields_ptr->second};\n  time += std::chrono::milliseconds{time_fields_ptr->milliseconds};\n  *time_ptr = WinSystemClock::to_file_time(WinSystemClock::from_sys(time));\n  return 1;\n}\nDECLARE_XBOXKRNL_EXPORT1(RtlTimeFieldsToTime, kNone, kImplemented);\n\nstatic uint32_t crc32_table[256] = {\n    0x00000000u, 0x77073096u, 0xEE0E612Cu, 0x990951BAu, 0x076DC419u,\n    0x706AF48Fu, 0xE963A535u, 0x9E6495A3u, 0x0EDB8832u, 0x79DCB8A4u,\n    0xE0D5E91Eu, 0x97D2D988u, 0x09B64C2Bu, 0x7EB17CBDu, 0xE7B82D07u,\n    0x90BF1D91u, 0x1DB71064u, 0x6AB020F2u, 0xF3B97148u, 0x84BE41DEu,\n    0x1ADAD47Du, 0x6DDDE4EBu, 0xF4D4B551u, 0x83D385C7u, 0x136C9856u,\n    0x646BA8C0u, 0xFD62F97Au, 0x8A65C9ECu, 0x14015C4Fu, 0x63066CD9u,\n    0xFA0F3D63u, 0x8D080DF5u, 0x3B6E20C8u, 0x4C69105Eu, 0xD56041E4u,\n    0xA2677172u, 0x3C03E4D1u, 0x4B04D447u, 0xD20D85FDu, 0xA50AB56Bu,\n    0x35B5A8FAu, 0x42B2986Cu, 0xDBBBC9D6u, 0xACBCF940u, 0x32D86CE3u,\n    0x45DF5C75u, 0xDCD60DCFu, 0xABD13D59u, 0x26D930ACu, 0x51DE003Au,\n    0xC8D75180u, 0xBFD06116u, 0x21B4F4B5u, 0x56B3C423u, 0xCFBA9599u,\n    0xB8BDA50Fu, 0x2802B89Eu, 0x5F058808u, 0xC60CD9B2u, 0xB10BE924u,\n    0x2F6F7C87u, 0x58684C11u, 0xC1611DABu, 0xB6662D3Du, 0x76DC4190u,\n    0x01DB7106u, 0x98D220BCu, 0xEFD5102Au, 0x71B18589u, 0x06B6B51Fu,\n    0x9FBFE4A5u, 0xE8B8D433u, 0x7807C9A2u, 0x0F00F934u, 0x9609A88Eu,\n    0xE10E9818u, 0x7F6A0DBBu, 0x086D3D2Du, 0x91646C97u, 0xE6635C01u,\n    0x6B6B51F4u, 0x1C6C6162u, 0x856530D8u, 0xF262004Eu, 0x6C0695EDu,\n    0x1B01A57Bu, 0x8208F4C1u, 0xF50FC457u, 0x65B0D9C6u, 0x12B7E950u,\n    0x8BBEB8EAu, 0xFCB9887Cu, 0x62DD1DDFu, 0x15DA2D49u, 0x8CD37CF3u,\n    0xFBD44C65u, 0x4DB26158u, 0x3AB551CEu, 0xA3BC0074u, 0xD4BB30E2u,\n    0x4ADFA541u, 0x3DD895D7u, 0xA4D1C46Du, 0xD3D6F4FBu, 0x4369E96Au,\n    0x346ED9FCu, 0xAD678846u, 0xDA60B8D0u, 0x44042D73u, 0x33031DE5u,\n    0xAA0A4C5Fu, 0xDD0D7CC9u, 0x5005713Cu, 0x270241AAu, 0xBE0B1010u,\n    0xC90C2086u, 0x5768B525u, 0x206F85B3u, 0xB966D409u, 0xCE61E49Fu,\n    0x5EDEF90Eu, 0x29D9C998u, 0xB0D09822u, 0xC7D7A8B4u, 0x59B33D17u,\n    0x2EB40D81u, 0xB7BD5C3Bu, 0xC0BA6CADu, 0xEDB88320u, 0x9ABFB3B6u,\n    0x03B6E20Cu, 0x74B1D29Au, 0xEAD54739u, 0x9DD277AFu, 0x04DB2615u,\n    0x73DC1683u, 0xE3630B12u, 0x94643B84u, 0x0D6D6A3Eu, 0x7A6A5AA8u,\n    0xE40ECF0Bu, 0x9309FF9Du, 0x0A00AE27u, 0x7D079EB1u, 0xF00F9344u,\n    0x8708A3D2u, 0x1E01F268u, 0x6906C2FEu, 0xF762575Du, 0x806567CBu,\n    0x196C3671u, 0x6E6B06E7u, 0xFED41B76u, 0x89D32BE0u, 0x10DA7A5Au,\n    0x67DD4ACCu, 0xF9B9DF6Fu, 0x8EBEEFF9u, 0x17B7BE43u, 0x60B08ED5u,\n    0xD6D6A3E8u, 0xA1D1937Eu, 0x38D8C2C4u, 0x4FDFF252u, 0xD1BB67F1u,\n    0xA6BC5767u, 0x3FB506DDu, 0x48B2364Bu, 0xD80D2BDAu, 0xAF0A1B4Cu,\n    0x36034AF6u, 0x41047A60u, 0xDF60EFC3u, 0xA867DF55u, 0x316E8EEFu,\n    0x4669BE79u, 0xCB61B38Cu, 0xBC66831Au, 0x256FD2A0u, 0x5268E236u,\n    0xCC0C7795u, 0xBB0B4703u, 0x220216B9u, 0x5505262Fu, 0xC5BA3BBEu,\n    0xB2BD0B28u, 0x2BB45A92u, 0x5CB36A04u, 0xC2D7FFA7u, 0xB5D0CF31u,\n    0x2CD99E8Bu, 0x5BDEAE1Du, 0x9B64C2B0u, 0xEC63F226u, 0x756AA39Cu,\n    0x026D930Au, 0x9C0906A9u, 0xEB0E363Fu, 0x72076785u, 0x05005713u,\n    0x95BF4A82u, 0xE2B87A14u, 0x7BB12BAEu, 0x0CB61B38u, 0x92D28E9Bu,\n    0xE5D5BE0Du, 0x7CDCEFB7u, 0x0BDBDF21u, 0x86D3D2D4u, 0xF1D4E242u,\n    0x68DDB3F8u, 0x1FDA836Eu, 0x81BE16CDu, 0xF6B9265Bu, 0x6FB077E1u,\n    0x18B74777u, 0x88085AE6u, 0xFF0F6A70u, 0x66063BCAu, 0x11010B5Cu,\n    0x8F659EFFu, 0xF862AE69u, 0x616BFFD3u, 0x166CCF45u, 0xA00AE278u,\n    0xD70DD2EEu, 0x4E048354u, 0x3903B3C2u, 0xA7672661u, 0xD06016F7u,\n    0x4969474Du, 0x3E6E77DBu, 0xAED16A4Au, 0xD9D65ADCu, 0x40DF0B66u,\n    0x37D83BF0u, 0xA9BCAE53u, 0xDEBB9EC5u, 0x47B2CF7Fu, 0x30B5FFE9u,\n    0xBDBDF21Cu, 0xCABAC28Au, 0x53B39330u, 0x24B4A3A6u, 0xBAD03605u,\n    0xCDD70693u, 0x54DE5729u, 0x23D967BFu, 0xB3667A2Eu, 0xC4614AB8u,\n    0x5D681B02u, 0x2A6F2B94u, 0xB40BBE37u, 0xC30C8EA1u, 0x5A05DF1Bu,\n    0x2D02EF8Du,\n};\n\ndword_result_t RtlComputeCrc32_entry(dword_t seed, lpvoid_t buffer,\n                                     dword_t length) {\n  if (!length) {\n    return seed.value();\n  }\n  uint32_t hash = ~seed;\n  for (uint32_t i = 0; i < length; ++i) {\n    hash = crc32_table[buffer[i] ^ (hash & 0xFF)] ^ (hash >> 8);\n  }\n  return ~hash;\n}\nDECLARE_XBOXKRNL_EXPORT1(RtlComputeCrc32, kNone, kImplemented);\n\n}  // namespace xboxkrnl\n}  // namespace kernel\n}  // namespace xe\n\nDECLARE_XBOXKRNL_EMPTY_REGISTER_EXPORTS(Rtl);\n"
  },
  {
    "path": "src/xenia/kernel/xboxkrnl/xboxkrnl_rtl.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_KERNEL_XBOXKRNL_XBOXKRNL_RTL_H_\n#define XENIA_KERNEL_XBOXKRNL_XBOXKRNL_RTL_H_\n\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xboxkrnl {\n\nstruct X_RTL_CRITICAL_SECTION;\n\nvoid xeRtlInitializeCriticalSection(X_RTL_CRITICAL_SECTION* cs,\n                                    uint32_t cs_ptr);\nX_STATUS xeRtlInitializeCriticalSectionAndSpinCount(X_RTL_CRITICAL_SECTION* cs,\n                                                    uint32_t cs_ptr,\n                                                    uint32_t spin_count);\n\n}  // namespace xboxkrnl\n}  // namespace kernel\n}  // namespace xe\n\n#endif  // XENIA_KERNEL_XBOXKRNL_XBOXKRNL_RTL_H_\n"
  },
  {
    "path": "src/xenia/kernel/xboxkrnl/xboxkrnl_strings.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include <cstring>\n#include <iomanip>\n#include <sstream>\n#include <string>\n\n#include \"xenia/base/logging.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/user_module.h\"\n#include \"xenia/kernel/util/shim_utils.h\"\n#include \"xenia/kernel/xboxkrnl/xboxkrnl_private.h\"\n#include \"xenia/kernel/xthread.h\"\n#include \"xenia/xbox.h\"\n\nDEFINE_bool(log_string_format_kernel_calls, false,\n            \"Log kernel calls with the kHighFrequency tag.\", \"Logging\");\n\nnamespace xe {\nnamespace kernel {\nnamespace xboxkrnl {\n\nenum FormatState {\n  FS_Invalid = 0,\n  FS_Unknown,\n  FS_Start,\n  FS_Flags,\n  FS_Width,\n  FS_PrecisionStart,\n  FS_Precision,\n  FS_Size,\n  FS_Type,\n  FS_End,\n};\n\nenum FormatFlags {\n  FF_LeftJustify = 1 << 0,\n  FF_AddLeadingZeros = 1 << 1,\n  FF_AddPositive = 1 << 2,\n  FF_AddPositiveAsSpace = 1 << 3,\n  FF_AddNegative = 1 << 4,\n  FF_AddPrefix = 1 << 5,\n  FF_IsShort = 1 << 6,\n  FF_IsLong = 1 << 7,\n  FF_IsLongLong = 1 << 8,\n  FF_IsWide = 1 << 9,\n  FF_IsSigned = 1 << 10,\n  FF_ForceLeadingZero = 1 << 11,\n  FF_InvertWide = 1 << 12,\n};\n\nenum ArgumentSize {\n  AS_Default = 0,\n  AS_Short,\n  AS_Long,\n  AS_LongLong,\n};\n\nclass FormatData {\n public:\n  virtual uint16_t get() = 0;\n  virtual uint16_t peek(int32_t offset) = 0;\n  virtual void skip(int32_t count) = 0;\n  virtual bool put(uint16_t c) = 0;\n};\n\nclass ArgList {\n public:\n  virtual uint32_t get32() = 0;\n  virtual uint64_t get64() = 0;\n};\n\n// Making the assumption that the Xbox 360's implementation of the\n// printf-functions matches what is described on MSDN's documentation for the\n// Windows CRT:\n//\n// \"Format Specification Syntax: printf and wprintf Functions\"\n// https://msdn.microsoft.com/en-us/library/56e442dc.aspx\n\nstd::string format_double(double value, int32_t precision, uint16_t c,\n                          uint32_t flags) {\n  if (precision < 0) {\n    precision = 6;\n  } else if (precision == 0 && c == 'g') {\n    precision = 1;\n  }\n\n  std::ostringstream temp;\n  temp << std::setprecision(precision);\n\n  if (c == 'f') {\n    temp << std::fixed;\n  } else if (c == 'e' || c == 'E') {\n    temp << std::scientific;\n  } else if (c == 'a' || c == 'A') {\n    temp << std::hexfloat;\n  } else if (c == 'g' || c == 'G') {\n    temp << std::defaultfloat;\n  }\n\n  if (c == 'E' || c == 'G' || c == 'A') {\n    temp << std::uppercase;\n  }\n\n  if (flags & FF_AddPrefix) {\n    temp << std::showpoint;\n  }\n\n  temp << value;\n  return temp.str();\n}\n\nint32_t format_core(PPCContext* ppc_context, FormatData& data, ArgList& args,\n                    const bool wide) {\n  int32_t count = 0;\n\n  char work8[512];\n  char16_t work16[4];\n\n  struct {\n    const void* buffer;\n    int32_t length;\n    bool is_wide;\n    bool swap_wide;\n  } text;\n\n  struct {\n    char buffer[2];\n    int32_t length;\n  } prefix;\n\n  auto state = FS_Unknown;\n  uint32_t flags = 0;\n  int32_t width = 0;\n  int32_t precision = -1;\n  ArgumentSize size = AS_Default;\n  int32_t radix = 0;\n  const char* digits = nullptr;\n\n  text.buffer = nullptr;\n  text.is_wide = false;\n  text.swap_wide = true;\n  text.length = 0;\n  prefix.buffer[0] = '\\0';\n  prefix.length = 0;\n\n  for (uint16_t c = data.get();; c = data.get()) {\n    if (state == FS_Unknown) {\n      if (!c) {  // the end\n        return count;\n      } else if (c != '%') {\n      output:\n        if (!data.put(c)) {\n          return -1;\n        }\n        ++count;\n        continue;\n      }\n\n      state = FS_Start;\n      c = data.get();\n      // fall through\n    }\n\n    // in any state, if c is \\0, it's bad\n    if (!c) {\n      return -1;\n    }\n\n  restart:\n    switch (state) {\n      case FS_Invalid:\n      case FS_Unknown:\n      case FS_End:\n      default: {\n        assert_always();\n      }\n\n      case FS_Start: {\n        if (c == '%') {\n          state = FS_Unknown;\n          goto output;\n        }\n\n        state = FS_Flags;\n\n        // reset to defaults\n        flags = 0;\n        width = 0;\n        precision = -1;\n        size = AS_Default;\n        radix = 0;\n        digits = nullptr;\n\n        text.buffer = nullptr;\n        text.is_wide = false;\n        text.swap_wide = true;\n        text.length = 0;\n        prefix.buffer[0] = '\\0';\n        prefix.length = 0;\n\n        // fall through, don't need to goto restart\n      }\n\n      // https://msdn.microsoft.com/en-us/library/8aky45ct.aspx\n      case FS_Flags: {\n        if (c == '-') {\n          flags |= FF_LeftJustify;\n          continue;\n        } else if (c == '+') {\n          flags |= FF_AddPositive;\n          continue;\n        } else if (c == '0') {\n          flags |= FF_AddLeadingZeros;\n          continue;\n        } else if (c == ' ') {\n          flags |= FF_AddPositiveAsSpace;\n          continue;\n        } else if (c == '#') {\n          flags |= FF_AddPrefix;\n          continue;\n        }\n        state = FS_Width;\n        // fall through, don't need to goto restart\n      }\n\n      // https://msdn.microsoft.com/en-us/library/25366k66.aspx\n      case FS_Width: {\n        if (c == '*') {\n          width = (int32_t)args.get32();\n          if (width < 0) {\n            flags |= FF_LeftJustify;\n            width = -width;\n          }\n          state = FS_PrecisionStart;\n          continue;\n        } else if (c >= '0' && c <= '9') {\n          width *= 10;\n          width += c - '0';\n          continue;\n        }\n        state = FS_PrecisionStart;\n        // fall through, don't need to goto restart\n      }\n\n      // https://msdn.microsoft.com/en-us/library/0ecbz014.aspx\n      case FS_PrecisionStart: {\n        if (c == '.') {\n          state = FS_Precision;\n          precision = 0;\n          continue;\n        }\n        state = FS_Size;\n        goto restart;\n      }\n\n      // https://msdn.microsoft.com/en-us/library/0ecbz014.aspx\n      case FS_Precision: {\n        if (c == '*') {\n          precision = (int32_t)args.get32();\n          if (precision < 0) {\n            precision = -1;\n          }\n          state = FS_Size;\n          continue;\n        } else if (c >= '0' && c <= '9') {\n          precision *= 10;\n          precision += c - '0';\n          continue;\n        }\n        state = FS_Size;\n        // fall through\n      }\n\n      // https://msdn.microsoft.com/en-us/library/tcxf1dw6.aspx\n      case FS_Size: {\n        if (c == 'l') {\n          if (data.peek(0) == 'l') {\n            data.skip(1);\n            flags |= FF_IsLongLong;\n          } else {\n            flags |= FF_IsLong;\n          }\n          state = FS_Type;\n          continue;\n        } else if (c == 'L') {\n          // 58410826 incorrectly uses 'L' instead of 'l'.\n          // TODO(gibbed): L appears to be treated as an invalid token by\n          // xboxkrnl, investigate how invalid tokens are processed in xboxkrnl\n          // formatting when state FF_Type is reached.\n          state = FS_Type;\n          continue;\n        } else if (c == 'h') {\n          flags |= FF_IsShort;\n          state = FS_Type;\n          continue;\n        } else if (c == 'w') {\n          flags |= FF_IsWide;\n          state = FS_Type;\n          continue;\n        } else if (c == 'I') {\n          if (data.peek(0) == '6' && data.peek(1) == '4') {\n            data.skip(2);\n            flags |= FF_IsLongLong;\n            state = FS_Type;\n            continue;\n          } else if (data.peek(0) == '3' && data.peek(1) == '2') {\n            data.skip(2);\n            state = FS_Type;\n            continue;\n          } else {\n            state = FS_Type;\n            continue;\n          }\n        }\n        // fall through\n      }\n\n      // https://msdn.microsoft.com/en-us/library/hf4y5e3w.aspx\n      case FS_Type: {\n        // wide character\n        switch (c) {\n          case 'C': {\n            flags |= FF_InvertWide;\n            // fall through\n          }\n\n          // character\n          case 'c': {\n            bool is_wide;\n            if (flags & (FF_IsLong | FF_IsWide)) {\n              // \"An lc, lC, wc or wC type specifier is synonymous with C in\n              // printf functions and with c in wprintf functions.\"\n              is_wide = true;\n            } else if (flags & FF_IsShort) {\n              // \"An hc or hC type specifier is synonymous with c in printf\n              // functions and with C in wprintf functions.\"\n              is_wide = false;\n            } else {\n              is_wide = ((flags & FF_InvertWide) != 0) ^ wide;\n            }\n\n            auto value = args.get32();\n\n            if (!is_wide) {\n              work8[0] = (uint8_t)value;\n              text.buffer = &work8[0];\n              text.length = 1;\n              text.is_wide = false;\n            } else {\n              work16[0] = (uint16_t)value;\n              text.buffer = &work16[0];\n              text.length = 1;\n              text.is_wide = true;\n              text.swap_wide = false;\n            }\n\n            break;\n          }\n\n          // signed decimal integer\n          case 'd':\n          case 'i': {\n            flags |= FF_IsSigned;\n            digits = \"0123456789\";\n            radix = 10;\n\n          integer:\n            assert_not_null(digits);\n            assert_not_zero(radix);\n\n            int64_t value;\n\n            if (flags & FF_IsLongLong) {\n              value = (int64_t)args.get64();\n            } else if (flags & FF_IsLong) {\n              value = (int32_t)args.get32();\n            } else if (flags & FF_IsShort) {\n              value = (int16_t)args.get32();\n            } else {\n              value = (int32_t)args.get32();\n            }\n\n            if (precision >= 0) {\n              precision = std::min(precision, (int32_t)xe::countof(work8));\n            } else {\n              precision = 1;\n            }\n\n            if ((flags & FF_IsSigned) && value < 0) {\n              value = -value;\n              flags |= FF_AddNegative;\n            }\n\n            if (!(flags & FF_IsLongLong)) {\n              value &= UINT32_MAX;\n            }\n\n            if (value == 0) {\n              prefix.length = 0;\n            }\n\n            char* end = &work8[xe::countof(work8) - 1];\n            char* start = end;\n            start[0] = '\\0';\n\n            while (precision-- > 0 || value != 0) {\n              auto digit = (int32_t)(value % radix);\n              value /= radix;\n              assert_true(digit < strlen(digits));\n              *--start = digits[digit];\n            }\n\n            if ((flags & FF_ForceLeadingZero) &&\n                (start == end || *start != '0')) {\n              *--start = '0';\n            }\n\n            text.buffer = start;\n            text.length = (int32_t)(end - start);\n            text.is_wide = false;\n            break;\n          }\n\n          // unsigned octal integer\n          case 'o': {\n            digits = \"01234567\";\n            radix = 8;\n            if (flags & FF_AddPrefix) {\n              flags |= FF_ForceLeadingZero;\n            }\n            goto integer;\n          }\n\n          // unsigned decimal integer\n          case 'u': {\n            digits = \"0123456789\";\n            radix = 10;\n            goto integer;\n          }\n\n          // unsigned hexadecimal integer\n          case 'x':\n          case 'X': {\n            digits = c == 'x' ? \"0123456789abcdef\" : \"0123456789ABCDEF\";\n            radix = 16;\n\n            if (flags & FF_AddPrefix) {\n              prefix.buffer[0] = '0';\n              prefix.buffer[1] = c == 'x' ? 'x' : 'X';\n              prefix.length = 2;\n            }\n\n            goto integer;\n          }\n\n          // floating-point with exponent\n          case 'e':\n          case 'E': {\n            // fall through\n          }\n\n          // floating-point without exponent\n          case 'f': {\n          floatingpoint:\n            flags |= FF_IsSigned;\n\n            int64_t dummy = args.get64();\n            double value = *(double*)&dummy;\n\n            if (value < 0) {\n              value = -value;\n              flags |= FF_AddNegative;\n            }\n\n            auto s = format_double(value, precision, c, flags);\n            auto length = (int32_t)s.size();\n            assert_true(length < xe::countof(work8));\n\n            auto start = &work8[0];\n            auto end = &start[length];\n\n            std::memcpy(start, s.c_str(), length);\n            end[0] = '\\0';\n\n            text.buffer = start;\n            text.length = (int32_t)(end - start);\n            text.is_wide = false;\n            break;\n          }\n\n          // floating-point with or without exponent\n          case 'g':\n          case 'G': {\n            goto floatingpoint;\n          }\n\n          // floating-point in hexadecimal\n          case 'a':\n          case 'A': {\n            goto floatingpoint;\n          }\n\n          // pointer to integer\n          case 'n': {\n            auto pointer = (uint32_t)args.get32();\n            if (flags & FF_IsShort) {\n              SHIM_SET_MEM_16(pointer, (uint16_t)count);\n            } else {\n              SHIM_SET_MEM_32(pointer, (uint32_t)count);\n            }\n            continue;\n          }\n\n          // pointer\n          case 'p': {\n            digits = \"0123456789ABCDEF\";\n            radix = 16;\n            precision = 8;\n            flags &= ~(FF_IsLongLong | FF_IsShort);\n            flags |= FF_IsLong;\n            goto integer;\n          }\n\n          // wide string\n          case 'S': {\n            flags |= FF_InvertWide;\n            // fall through\n          }\n\n          // string\n          case 's': {\n            uint32_t pointer = args.get32();\n            int32_t cap = precision < 0 ? INT32_MAX : precision;\n\n            if (pointer == 0) {\n              auto nullstr = \"(null)\";\n              text.buffer = nullstr;\n              text.length = std::min((int32_t)strlen(nullstr), cap);\n              text.is_wide = false;\n            } else {\n              void* str = SHIM_MEM_ADDR(pointer);\n              bool is_wide;\n              if (flags & (FF_IsLong | FF_IsWide)) {\n                // \"An ls, lS, ws or wS type specifier is synonymous with S in\n                // printf functions and with s in wprintf functions.\"\n                is_wide = true;\n              } else if (flags & FF_IsShort) {\n                // \"An hs or hS type specifier is synonymous with s in printf\n                // functions and with S in wprintf functions.\"\n                is_wide = false;\n              } else {\n                is_wide = ((flags & FF_InvertWide) != 0) ^ wide;\n              }\n              int32_t length;\n\n              if (!is_wide) {\n                length = 0;\n                for (auto s = (const uint8_t*)str; cap > 0 && *s; ++s, cap--) {\n                  length++;\n                }\n              } else {\n                length = 0;\n                for (auto s = (const uint16_t*)str; cap > 0 && *s; ++s, cap--) {\n                  length++;\n                }\n              }\n\n              text.buffer = str;\n              text.length = length;\n              text.is_wide = is_wide;\n            }\n            break;\n          }\n\n          // ANSI_STRING / UNICODE_STRING\n          case 'Z': {\n            assert_always();\n            break;\n          }\n\n          default: {\n            assert_always();\n          }\n        }\n      }\n    }\n\n    if (flags & FF_IsSigned) {\n      if (flags & FF_AddNegative) {\n        prefix.buffer[0] = '-';\n        prefix.length = 1;\n      } else if (flags & FF_AddPositive) {\n        prefix.buffer[0] = '+';\n        prefix.length = 1;\n      } else if (flags & FF_AddPositiveAsSpace) {\n        prefix.buffer[0] = ' ';\n        prefix.length = 1;\n      }\n    }\n\n    int32_t padding = width - text.length - prefix.length;\n\n    if (!(flags & (FF_LeftJustify | FF_AddLeadingZeros)) && padding > 0) {\n      count += padding;\n      while (padding-- > 0) {\n        if (!data.put(' ')) {\n          return -1;\n        }\n      }\n    }\n\n    if (prefix.length > 0) {\n      int32_t remaining = prefix.length;\n      count += prefix.length;\n      auto b = &prefix.buffer[0];\n      while (remaining-- > 0) {\n        if (!data.put(*b++)) {\n          return -1;\n        }\n      }\n    }\n\n    if ((flags & FF_AddLeadingZeros) && !(flags & (FF_LeftJustify)) &&\n        padding > 0) {\n      count += padding;\n      while (padding-- > 0) {\n        if (!data.put('0')) {\n          return -1;\n        }\n      }\n    }\n\n    int32_t remaining = text.length;\n    if (!text.is_wide) {\n      // it's a const char*\n      auto b = (const uint8_t*)text.buffer;\n      while (remaining-- > 0) {\n        if (!data.put(*b++)) {\n          return -1;\n        }\n      }\n    } else {\n      // it's a const char16_t*\n      auto b = (const uint16_t*)text.buffer;\n      if (text.swap_wide) {\n        while (remaining-- > 0) {\n          if (!data.put(xe::byte_swap(*b++))) {\n            return -1;\n          }\n        }\n      } else {\n        while (remaining-- > 0) {\n          if (!data.put(*b++)) {\n            return -1;\n          }\n        }\n      }\n    }\n    count += text.length;\n\n    // right padding\n    if ((flags & FF_LeftJustify) && padding > 0) {\n      count += padding;\n      while (padding-- > 0) {\n        if (!data.put(' ')) {\n          return -1;\n        }\n      }\n    }\n\n    state = FS_Unknown;\n  }\n\n  return count;\n}\n\nclass StackArgList : public ArgList {\n public:\n  StackArgList(PPCContext* ppc_context, int32_t index)\n      : ppc_context(ppc_context), index_(index) {}\n\n  uint32_t get32() { return (uint32_t)get64(); }\n\n  uint64_t get64() {\n    auto value = SHIM_GET_ARG_64(index_);\n    ++index_;\n    return value;\n  }\n\n private:\n  PPCContext* ppc_context;\n  int32_t index_;\n};\n\nclass ArrayArgList : public ArgList {\n public:\n  ArrayArgList(PPCContext* ppc_context, uint32_t arg_ptr)\n      : ppc_context(ppc_context), arg_ptr_(arg_ptr), index_(0) {}\n\n  uint32_t get32() { return (uint32_t)get64(); }\n\n  uint64_t get64() {\n    auto value = SHIM_MEM_64(arg_ptr_ + (8 * index_));\n    ++index_;\n    return value;\n  }\n\n private:\n  PPCContext* ppc_context;\n  uint32_t arg_ptr_;\n  int32_t index_;\n};\n\nclass StringFormatData : public FormatData {\n public:\n  StringFormatData(const uint8_t* input) : input_(input) {}\n\n  uint16_t get() {\n    uint16_t result = *input_;\n    if (result) {\n      input_++;\n    }\n    return result;\n  }\n\n  uint16_t peek(int32_t offset) { return input_[offset]; }\n\n  void skip(int32_t count) {\n    while (count-- > 0) {\n      if (!get()) {\n        break;\n      }\n    }\n  }\n\n  bool put(uint16_t c) {\n    if (c >= 0x100) {\n      return false;\n    }\n    output_.push_back(char(c));\n    return true;\n  }\n\n  const std::string& str() const { return output_; }\n\n private:\n  const uint8_t* input_;\n  std::string output_;\n};\n\nclass WideStringFormatData : public FormatData {\n public:\n  WideStringFormatData(const uint16_t* input) : input_(input) {}\n\n  uint16_t get() {\n    uint16_t result = *input_;\n    if (result) {\n      input_++;\n    }\n    return xe::byte_swap(result);\n  }\n\n  uint16_t peek(int32_t offset) { return xe::byte_swap(input_[offset]); }\n\n  void skip(int32_t count) {\n    while (count-- > 0) {\n      if (!get()) {\n        break;\n      }\n    }\n  }\n\n  bool put(uint16_t c) {\n    output_.push_back(char16_t(c));\n    return true;\n  }\n\n  const std::u16string& wstr() const { return output_; }\n\n private:\n  const uint16_t* input_;\n  std::u16string output_;\n};\n\nclass WideCountFormatData : public FormatData {\n public:\n  WideCountFormatData(const uint16_t* input) : input_(input), count_(0) {}\n\n  uint16_t get() {\n    uint16_t result = *input_;\n    if (result) {\n      input_++;\n    }\n    return xe::byte_swap(result);\n  }\n\n  uint16_t peek(int32_t offset) { return xe::byte_swap(input_[offset]); }\n\n  void skip(int32_t count) {\n    while (count-- > 0) {\n      if (!get()) {\n        break;\n      }\n    }\n  }\n\n  bool put(uint16_t c) {\n    ++count_;\n    return true;\n  }\n\n  const int32_t count() const { return count_; }\n\n private:\n  const uint16_t* input_;\n  int32_t count_;\n};\n\nSHIM_CALL DbgPrint_entry(PPCContext* ppc_context, KernelState* kernel_state) {\n  uint32_t format_ptr = SHIM_GET_ARG_32(0);\n  if (!format_ptr) {\n    SHIM_SET_RETURN_32(X_STATUS_INVALID_PARAMETER);\n    return;\n  }\n  auto format = (const uint8_t*)SHIM_MEM_ADDR(format_ptr);\n\n  StackArgList args(ppc_context, 1);\n  StringFormatData data(format);\n\n  int32_t count = format_core(ppc_context, data, args, false);\n  if (count <= 0) {\n    SHIM_SET_RETURN_32(X_STATUS_SUCCESS);\n    return;\n  }\n\n  // trim whitespace from end of message\n  auto str = data.str();\n  str.erase(std::find_if(str.rbegin(), str.rend(),\n                         [](uint8_t c) { return !std::isspace(c); })\n                .base(),\n            str.end());\n\n  XELOGI(\"(DbgPrint) {}\", str);\n\n  SHIM_SET_RETURN_32(X_STATUS_SUCCESS);\n}\n\n// https://msdn.microsoft.com/en-us/library/2ts7cx93.aspx\nSHIM_CALL _snprintf_entry(PPCContext* ppc_context, KernelState* kernel_state) {\n  uint32_t buffer_ptr = SHIM_GET_ARG_32(0);\n  int32_t buffer_count = SHIM_GET_ARG_32(1);\n  uint32_t format_ptr = SHIM_GET_ARG_32(2);\n\n  if (cvars::log_string_format_kernel_calls) {\n    XELOGD(\"_snprintf({:08X}, {}, {:08X}({}), ...)\", buffer_ptr, buffer_count,\n           format_ptr,\n           xe::load_and_swap<std::string>(SHIM_MEM_ADDR(format_ptr)));\n  }\n\n  if (buffer_ptr == 0 || buffer_count <= 0 || format_ptr == 0) {\n    SHIM_SET_RETURN_32(-1);\n    return;\n  }\n\n  auto buffer = (uint8_t*)SHIM_MEM_ADDR(buffer_ptr);\n  auto format = (const uint8_t*)SHIM_MEM_ADDR(format_ptr);\n\n  StackArgList args(ppc_context, 3);\n  StringFormatData data(format);\n\n  int32_t count = format_core(ppc_context, data, args, false);\n  if (count < 0) {\n    if (buffer_count > 0) {\n      buffer[0] = '\\0';  // write a null, just to be safe\n    }\n  } else if (count <= buffer_count) {\n    std::memcpy(buffer, data.str().c_str(), count);\n    if (count < buffer_count) {\n      buffer[count] = '\\0';\n    }\n  } else {\n    std::memcpy(buffer, data.str().c_str(), buffer_count);\n    count = -1;  // for return value\n  }\n  SHIM_SET_RETURN_32(count);\n}\n\n// https://msdn.microsoft.com/en-us/library/ybk95axf.aspx\nSHIM_CALL sprintf_entry(PPCContext* ppc_context, KernelState* kernel_state) {\n  uint32_t buffer_ptr = SHIM_GET_ARG_32(0);\n  uint32_t format_ptr = SHIM_GET_ARG_32(1);\n\n  if (cvars::log_string_format_kernel_calls) {\n    XELOGD(\"sprintf({:08X}, {:08X}({}), ...)\", buffer_ptr, format_ptr,\n           xe::load_and_swap<std::string>(SHIM_MEM_ADDR(format_ptr)));\n  }\n\n  if (buffer_ptr == 0 || format_ptr == 0) {\n    SHIM_SET_RETURN_32(-1);\n    return;\n  }\n\n  auto buffer = (uint8_t*)SHIM_MEM_ADDR(buffer_ptr);\n  auto format = (const uint8_t*)SHIM_MEM_ADDR(format_ptr);\n\n  StackArgList args(ppc_context, 2);\n  StringFormatData data(format);\n\n  int32_t count = format_core(ppc_context, data, args, false);\n  if (count <= 0) {\n    buffer[0] = '\\0';\n  } else {\n    std::memcpy(buffer, data.str().c_str(), count);\n    buffer[count] = '\\0';\n  }\n  SHIM_SET_RETURN_32(count);\n}\n\n// https://msdn.microsoft.com/en-us/library/2ts7cx93.aspx\nSHIM_CALL _snwprintf_entry(PPCContext* ppc_context, KernelState* kernel_state) {\n  uint32_t buffer_ptr = SHIM_GET_ARG_32(0);\n  int32_t buffer_count = SHIM_GET_ARG_32(1);\n  uint32_t format_ptr = SHIM_GET_ARG_32(2);\n\n  if (cvars::log_string_format_kernel_calls) {\n    XELOGD(\"_snwprintf({:08X}, {}, {:08X}({}), ...)\", buffer_ptr, buffer_count,\n           format_ptr,\n           xe::to_utf8(\n               xe::load_and_swap<std::u16string>(SHIM_MEM_ADDR(format_ptr))));\n  }\n\n  if (buffer_ptr == 0 || buffer_count <= 0 || format_ptr == 0) {\n    SHIM_SET_RETURN_32(-1);\n    return;\n  }\n\n  auto buffer = (uint16_t*)SHIM_MEM_ADDR(buffer_ptr);\n  auto format = (const uint16_t*)SHIM_MEM_ADDR(format_ptr);\n\n  StackArgList args(ppc_context, 3);\n  WideStringFormatData data(format);\n\n  int32_t count = format_core(ppc_context, data, args, true);\n  if (count < 0) {\n    if (buffer_count > 0) {\n      buffer[0] = '\\0';  // write a null, just to be safe\n    }\n  } else if (count <= buffer_count) {\n    xe::copy_and_swap(buffer, (uint16_t*)data.wstr().c_str(), count);\n    if (count < buffer_count) {\n      buffer[count] = '\\0';\n    }\n  } else {\n    xe::copy_and_swap(buffer, (uint16_t*)data.wstr().c_str(), buffer_count);\n    count = -1;  // for return value\n  }\n  SHIM_SET_RETURN_32(count);\n}\n\n// https://msdn.microsoft.com/en-us/library/ybk95axf.aspx\nSHIM_CALL swprintf_entry(PPCContext* ppc_context, KernelState* kernel_state) {\n  uint32_t buffer_ptr = SHIM_GET_ARG_32(0);\n  uint32_t format_ptr = SHIM_GET_ARG_32(1);\n\n  if (cvars::log_string_format_kernel_calls) {\n    XELOGD(\"swprintf({:08X}, {:08X}({}), ...)\", buffer_ptr, format_ptr,\n           xe::to_utf8(\n               xe::load_and_swap<std::u16string>(SHIM_MEM_ADDR(format_ptr))));\n  }\n\n  if (buffer_ptr == 0 || format_ptr == 0) {\n    SHIM_SET_RETURN_32(-1);\n    return;\n  }\n\n  auto buffer = (uint16_t*)SHIM_MEM_ADDR(buffer_ptr);\n  auto format = (const uint16_t*)SHIM_MEM_ADDR(format_ptr);\n\n  StackArgList args(ppc_context, 2);\n  WideStringFormatData data(format);\n\n  int32_t count = format_core(ppc_context, data, args, false);\n  if (count <= 0) {\n    buffer[0] = '\\0';\n  } else {\n    xe::copy_and_swap(buffer, (uint16_t*)data.wstr().c_str(), count);\n    buffer[count] = '\\0';\n  }\n  SHIM_SET_RETURN_32(count);\n}\n\n// https://msdn.microsoft.com/en-us/library/1kt27hek.aspx\nSHIM_CALL _vsnprintf_entry(PPCContext* ppc_context, KernelState* kernel_state) {\n  uint32_t buffer_ptr = SHIM_GET_ARG_32(0);\n  int32_t buffer_count = SHIM_GET_ARG_32(1);\n  uint32_t format_ptr = SHIM_GET_ARG_32(2);\n  uint32_t arg_ptr = SHIM_GET_ARG_32(3);\n\n  if (cvars::log_string_format_kernel_calls) {\n    XELOGD(\"_vsnprintf({:08X}, {}, {:08X}({}), {:08X})\", buffer_ptr,\n           buffer_count, format_ptr,\n           xe::load_and_swap<std::string>(SHIM_MEM_ADDR(format_ptr)), arg_ptr);\n  }\n\n  if (buffer_ptr == 0 || buffer_count <= 0 || format_ptr == 0) {\n    SHIM_SET_RETURN_32(-1);\n    return;\n  }\n\n  auto buffer = (uint8_t*)SHIM_MEM_ADDR(buffer_ptr);\n  auto format = (const uint8_t*)SHIM_MEM_ADDR(format_ptr);\n\n  ArrayArgList args(ppc_context, arg_ptr);\n  StringFormatData data(format);\n\n  int32_t count = format_core(ppc_context, data, args, false);\n  if (count < 0) {\n    // Error.\n    if (buffer_count > 0) {\n      buffer[0] = '\\0';  // write a null, just to be safe\n    }\n  } else if (count <= buffer_count) {\n    // Fit within the buffer.\n    std::memcpy(buffer, data.str().c_str(), count);\n    if (count < buffer_count) {\n      buffer[count] = '\\0';\n    }\n  } else {\n    // Overflowed buffer. We still return the count we would have written.\n    std::memcpy(buffer, data.str().c_str(), buffer_count);\n  }\n  SHIM_SET_RETURN_32(count);\n}\n\n// https://msdn.microsoft.com/en-us/library/1kt27hek.aspx\nSHIM_CALL _vsnwprintf_entry(PPCContext* ppc_context,\n                            KernelState* kernel_state) {\n  uint32_t buffer_ptr = SHIM_GET_ARG_32(0);\n  int32_t buffer_count = SHIM_GET_ARG_32(1);\n  uint32_t format_ptr = SHIM_GET_ARG_32(2);\n  uint32_t arg_ptr = SHIM_GET_ARG_32(3);\n\n  if (cvars::log_string_format_kernel_calls) {\n    XELOGD(\"_vsnwprintf({:08X}, {}, {:08X}({}), {:08X})\", buffer_ptr,\n           buffer_count, format_ptr,\n           xe::to_utf8(\n               xe::load_and_swap<std::u16string>(SHIM_MEM_ADDR(format_ptr))),\n           arg_ptr);\n  }\n\n  if (buffer_ptr == 0 || buffer_count <= 0 || format_ptr == 0) {\n    SHIM_SET_RETURN_32(-1);\n    return;\n  }\n\n  auto buffer = (uint16_t*)SHIM_MEM_ADDR(buffer_ptr);\n  auto format = (const uint16_t*)SHIM_MEM_ADDR(format_ptr);\n\n  ArrayArgList args(ppc_context, arg_ptr);\n  WideStringFormatData data(format);\n\n  int32_t count = format_core(ppc_context, data, args, true);\n  if (count < 0) {\n    // Error.\n    if (buffer_count > 0) {\n      buffer[0] = '\\0';  // write a null, just to be safe\n    }\n  } else if (count <= buffer_count) {\n    // Fit within the buffer.\n    xe::copy_and_swap(buffer, (uint16_t*)data.wstr().c_str(), count);\n    if (count < buffer_count) {\n      buffer[count] = '\\0';\n    }\n  } else {\n    // Overflowed buffer. We still return the count we would have written.\n    xe::copy_and_swap(buffer, (uint16_t*)data.wstr().c_str(), buffer_count);\n  }\n  SHIM_SET_RETURN_32(count);\n}\n\n// https://msdn.microsoft.com/en-us/library/28d5ce15.aspx\nSHIM_CALL vsprintf_entry(PPCContext* ppc_context, KernelState* kernel_state) {\n  uint32_t buffer_ptr = SHIM_GET_ARG_32(0);\n  uint32_t format_ptr = SHIM_GET_ARG_32(1);\n  uint32_t arg_ptr = SHIM_GET_ARG_32(2);\n\n  if (cvars::log_string_format_kernel_calls) {\n    XELOGD(\"vsprintf({:08X}, {:08X}({}), {:08X})\", buffer_ptr, format_ptr,\n           xe::load_and_swap<std::string>(SHIM_MEM_ADDR(format_ptr)), arg_ptr);\n  }\n\n  if (buffer_ptr == 0 || format_ptr == 0) {\n    SHIM_SET_RETURN_32(-1);\n    return;\n  }\n\n  auto buffer = (uint8_t*)SHIM_MEM_ADDR(buffer_ptr);\n  auto format = (const uint8_t*)SHIM_MEM_ADDR(format_ptr);\n\n  ArrayArgList args(ppc_context, arg_ptr);\n  StringFormatData data(format);\n\n  int32_t count = format_core(ppc_context, data, args, false);\n  if (count <= 0) {\n    buffer[0] = '\\0';\n  } else {\n    std::memcpy(buffer, data.str().c_str(), count);\n    buffer[count] = '\\0';\n  }\n  SHIM_SET_RETURN_32(count);\n}\n\n// https://msdn.microsoft.com/en-us/library/w05tbk72.aspx\nSHIM_CALL _vscwprintf_entry(PPCContext* ppc_context,\n                            KernelState* kernel_state) {\n  uint32_t format_ptr = SHIM_GET_ARG_32(0);\n  uint32_t arg_ptr = SHIM_GET_ARG_32(1);\n\n  if (cvars::log_string_format_kernel_calls) {\n    XELOGD(\"_vscwprintf({:08X}({}), {:08X})\", format_ptr,\n           xe::to_utf8(\n               xe::load_and_swap<std::u16string>(SHIM_MEM_ADDR(format_ptr))),\n           arg_ptr);\n  }\n\n  if (format_ptr == 0) {\n    SHIM_SET_RETURN_32(-1);\n    return;\n  }\n\n  auto format = (const uint16_t*)SHIM_MEM_ADDR(format_ptr);\n\n  ArrayArgList args(ppc_context, arg_ptr);\n  WideCountFormatData data(format);\n\n  int32_t count = format_core(ppc_context, data, args, true);\n  assert_true(count < 0 || data.count() == count);\n  SHIM_SET_RETURN_32(count);\n}\n\n// https://msdn.microsoft.com/en-us/library/28d5ce15.aspx\nSHIM_CALL vswprintf_entry(PPCContext* ppc_context, KernelState* kernel_state) {\n  uint32_t buffer_ptr = SHIM_GET_ARG_32(0);\n  uint32_t format_ptr = SHIM_GET_ARG_32(1);\n  uint32_t arg_ptr = SHIM_GET_ARG_32(2);\n\n  if (cvars::log_string_format_kernel_calls) {\n    XELOGD(\"vswprintf({:08X}, {:08X}({}), {:08X})\", buffer_ptr, format_ptr,\n           xe::to_utf8(\n               xe::load_and_swap<std::u16string>(SHIM_MEM_ADDR(format_ptr))),\n           arg_ptr);\n  }\n\n  if (buffer_ptr == 0 || format_ptr == 0) {\n    SHIM_SET_RETURN_32(-1);\n    return;\n  }\n\n  auto buffer = (uint16_t*)SHIM_MEM_ADDR(buffer_ptr);\n  auto format = (const uint16_t*)SHIM_MEM_ADDR(format_ptr);\n\n  ArrayArgList args(ppc_context, arg_ptr);\n  WideStringFormatData data(format);\n\n  int32_t count = format_core(ppc_context, data, args, true);\n  if (count <= 0) {\n    buffer[0] = '\\0';\n  } else {\n    xe::copy_and_swap(buffer, (uint16_t*)data.wstr().c_str(), count);\n    buffer[count] = '\\0';\n  }\n  SHIM_SET_RETURN_32(count);\n}\n\nvoid RegisterStringExports(xe::cpu::ExportResolver* export_resolver,\n                           KernelState* state) {\n  SHIM_SET_MAPPING(\"xboxkrnl.exe\", DbgPrint, state);\n  SHIM_SET_MAPPING(\"xboxkrnl.exe\", _snprintf, state);\n  SHIM_SET_MAPPING(\"xboxkrnl.exe\", sprintf, state);\n  SHIM_SET_MAPPING(\"xboxkrnl.exe\", _snwprintf, state);\n  SHIM_SET_MAPPING(\"xboxkrnl.exe\", swprintf, state);\n  SHIM_SET_MAPPING(\"xboxkrnl.exe\", _vsnprintf, state);\n  SHIM_SET_MAPPING(\"xboxkrnl.exe\", vsprintf, state);\n  SHIM_SET_MAPPING(\"xboxkrnl.exe\", _vscwprintf, state);\n  SHIM_SET_MAPPING(\"xboxkrnl.exe\", vswprintf, state);\n  SHIM_SET_MAPPING(\"xboxkrnl.exe\", _vsnwprintf, state);\n}\n\n}  // namespace xboxkrnl\n}  // namespace kernel\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/kernel/xboxkrnl/xboxkrnl_table.inc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n// This is a partial file designed to be included by other files when\n// constructing various tables.\n\n// clang-format off\n\nXE_EXPORT(xboxkrnl, 0x00000001, DbgBreakPoint,                                              kFunction),\nXE_EXPORT(xboxkrnl, 0x00000002, DbgBreakPointWithStatus,                                    kFunction),\nXE_EXPORT(xboxkrnl, 0x00000003, DbgPrint,                                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x00000004, DbgPrompt,                                                  kFunction),\nXE_EXPORT(xboxkrnl, 0x00000005, DumpGetRawDumpInfo,                                         kFunction),\nXE_EXPORT(xboxkrnl, 0x00000006, DumpWriteDump,                                              kFunction),\nXE_EXPORT(xboxkrnl, 0x00000007, ExAcquireReadWriteLockExclusive,                            kFunction),\nXE_EXPORT(xboxkrnl, 0x00000008, ExAcquireReadWriteLockShared,                               kFunction),\nXE_EXPORT(xboxkrnl, 0x00000009, ExAllocatePool,                                             kFunction),\nXE_EXPORT(xboxkrnl, 0x0000000A, ExAllocatePoolWithTag,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x0000000B, ExAllocatePoolTypeWithTag,                                  kFunction),\nXE_EXPORT(xboxkrnl, 0x0000000C, ExConsoleGameRegion,                                        kVariable),\nXE_EXPORT(xboxkrnl, 0x0000000D, ExCreateThread,                                             kFunction),\nXE_EXPORT(xboxkrnl, 0x0000000E, ExEventObjectType,                                          kVariable),\nXE_EXPORT(xboxkrnl, 0x0000000F, ExFreePool,                                                 kFunction),\nXE_EXPORT(xboxkrnl, 0x00000010, ExGetXConfigSetting,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x00000011, ExInitializeReadWriteLock,                                  kFunction),\nXE_EXPORT(xboxkrnl, 0x00000012, ExMutantObjectType,                                         kVariable),\nXE_EXPORT(xboxkrnl, 0x00000013, ExQueryPoolBlockSize,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x00000014, ExRegisterThreadNotification,                               kFunction),\nXE_EXPORT(xboxkrnl, 0x00000015, ExRegisterTitleTerminateNotification,                       kFunction),\nXE_EXPORT(xboxkrnl, 0x00000016, ExReleaseReadWriteLock,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x00000017, ExSemaphoreObjectType,                                      kVariable),\nXE_EXPORT(xboxkrnl, 0x00000018, ExSetXConfigSetting,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x00000019, ExTerminateThread,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x0000001A, ExTerminateTitleProcess,                                    kFunction),\nXE_EXPORT(xboxkrnl, 0x0000001B, ExThreadObjectType,                                         kVariable),\nXE_EXPORT(xboxkrnl, 0x0000001C, ExTimerObjectType,                                          kVariable),\nXE_EXPORT(xboxkrnl, 0x0000001D, MmDoubleMapMemory,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x0000001E, MmUnmapMemory,                                              kFunction),\nXE_EXPORT(xboxkrnl, 0x0000001F, XeKeysGetConsoleCertificate,                                kFunction),\nXE_EXPORT(xboxkrnl, 0x00000020, FscGetCacheElementCount,                                    kFunction),\nXE_EXPORT(xboxkrnl, 0x00000021, FscSetCacheElementCount,                                    kFunction),\nXE_EXPORT(xboxkrnl, 0x00000022, HalGetCurrentAVPack,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x00000023, HalGpioControl,                                             kFunction),\nXE_EXPORT(xboxkrnl, 0x00000024, HalOpenCloseODDTray,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x00000025, HalReadWritePCISpace,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x00000026, HalRegisterPowerDownNotification,                           kFunction),\nXE_EXPORT(xboxkrnl, 0x00000027, HalRegisterSMCNotification,                                 kFunction),\nXE_EXPORT(xboxkrnl, 0x00000028, HalReturnToFirmware,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x00000029, HalSendSMCMessage,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x0000002A, HalSetAudioEnable,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x0000002B, InterlockedFlushSList,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x0000002C, InterlockedPopEntrySList,                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x0000002D, InterlockedPushEntrySList,                                  kFunction),\nXE_EXPORT(xboxkrnl, 0x0000002E, IoAcquireDeviceObjectLock,                                  kFunction),\nXE_EXPORT(xboxkrnl, 0x0000002F, IoAllocateIrp,                                              kFunction),\nXE_EXPORT(xboxkrnl, 0x00000030, IoBuildAsynchronousFsdRequest,                              kFunction),\nXE_EXPORT(xboxkrnl, 0x00000031, IoBuildDeviceIoControlRequest,                              kFunction),\nXE_EXPORT(xboxkrnl, 0x00000032, IoBuildSynchronousFsdRequest,                               kFunction),\nXE_EXPORT(xboxkrnl, 0x00000033, IoCallDriver,                                               kFunction),\nXE_EXPORT(xboxkrnl, 0x00000034, IoCheckShareAccess,                                         kFunction),\nXE_EXPORT(xboxkrnl, 0x00000035, IoCompleteRequest,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x00000036, IoCompletionObjectType,                                     kVariable),\nXE_EXPORT(xboxkrnl, 0x00000037, IoCreateDevice,                                             kFunction),\nXE_EXPORT(xboxkrnl, 0x00000038, IoCreateFile,                                               kFunction),\nXE_EXPORT(xboxkrnl, 0x00000039, IoDeleteDevice,                                             kFunction),\nXE_EXPORT(xboxkrnl, 0x0000003A, IoDeviceObjectType,                                         kVariable),\nXE_EXPORT(xboxkrnl, 0x0000003B, IoDismountVolume,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x0000003C, IoDismountVolumeByFileHandle,                               kFunction),\nXE_EXPORT(xboxkrnl, 0x0000003D, IoDismountVolumeByName,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x0000003E, IoFileObjectType,                                           kVariable),\nXE_EXPORT(xboxkrnl, 0x0000003F, IoFreeIrp,                                                  kFunction),\nXE_EXPORT(xboxkrnl, 0x00000040, IoInitializeIrp,                                            kFunction),\nXE_EXPORT(xboxkrnl, 0x00000041, IoInvalidDeviceRequest,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x00000042, ExSetBetaFeaturesEnabled,                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x00000043, IoQueueThreadIrp,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x00000044, IoReleaseDeviceObjectLock,                                  kFunction),\nXE_EXPORT(xboxkrnl, 0x00000045, IoRemoveShareAccess,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x00000046, IoSetIoCompletion,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x00000047, IoSetShareAccess,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x00000048, IoStartNextPacket,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x00000049, IoStartNextPacketByKey,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x0000004A, IoStartPacket,                                              kFunction),\nXE_EXPORT(xboxkrnl, 0x0000004B, IoSynchronousDeviceIoControlRequest,                        kFunction),\nXE_EXPORT(xboxkrnl, 0x0000004C, IoSynchronousFsdRequest,                                    kFunction),\nXE_EXPORT(xboxkrnl, 0x0000004D, KeAcquireSpinLockAtRaisedIrql,                              kFunction),\nXE_EXPORT(xboxkrnl, 0x0000004E, KeAlertResumeThread,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x0000004F, KeAlertThread,                                              kFunction),\nXE_EXPORT(xboxkrnl, 0x00000050, KeBlowFuses,                                                kFunction),\nXE_EXPORT(xboxkrnl, 0x00000051, KeBoostPriorityThread,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x00000052, KeBugCheck,                                                 kFunction),\nXE_EXPORT(xboxkrnl, 0x00000053, KeBugCheckEx,                                               kFunction),\nXE_EXPORT(xboxkrnl, 0x00000054, KeCancelTimer,                                              kFunction),\nXE_EXPORT(xboxkrnl, 0x00000055, KeConnectInterrupt,                                         kFunction),\nXE_EXPORT(xboxkrnl, 0x00000056, KeContextFromKframes,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x00000057, KeContextToKframes,                                         kFunction),\nXE_EXPORT(xboxkrnl, 0x00000058, KeCreateUserMode,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x00000059, KeDebugMonitorData,                                         kVariable),\nXE_EXPORT(xboxkrnl, 0x0000005A, KeDelayExecutionThread,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x0000005B, KeDeleteUserMode,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x0000005C, KeDisconnectInterrupt,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x0000005D, KeEnableFpuExceptions,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x0000005E, KeEnablePPUPerformanceMonitor,                              kFunction),\nXE_EXPORT(xboxkrnl, 0x0000005F, KeEnterCriticalRegion,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x00000060, KeEnterUserMode,                                            kFunction),\nXE_EXPORT(xboxkrnl, 0x00000061, KeFlushCacheRange,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x00000062, KeFlushCurrentEntireTb,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x00000063, KeFlushEntireTb,                                            kFunction),\nXE_EXPORT(xboxkrnl, 0x00000064, KeFlushUserModeCurrentTb,                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x00000065, KeFlushUserModeTb,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x00000066, KeGetCurrentProcessType,                                    kFunction),\nXE_EXPORT(xboxkrnl, 0x00000067, KeGetPMWRegister,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x00000068, KeGetPRVRegister,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x00000069, KeGetSocRegister,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x0000006A, KeGetSpecialPurposeRegister,                                kFunction),\nXE_EXPORT(xboxkrnl, 0x0000006B, KeLockL2,                                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x0000006C, KeUnlockL2,                                                 kFunction),\nXE_EXPORT(xboxkrnl, 0x0000006D, KeInitializeApc,                                            kFunction),\nXE_EXPORT(xboxkrnl, 0x0000006E, KeInitializeDeviceQueue,                                    kFunction),\nXE_EXPORT(xboxkrnl, 0x0000006F, KeInitializeDpc,                                            kFunction),\nXE_EXPORT(xboxkrnl, 0x00000070, KeInitializeEvent,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x00000071, KeInitializeInterrupt,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x00000072, KeInitializeMutant,                                         kFunction),\nXE_EXPORT(xboxkrnl, 0x00000073, KeInitializeQueue,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x00000074, KeInitializeSemaphore,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x00000075, KeInitializeTimerEx,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x00000076, KeInsertByKeyDeviceQueue,                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x00000077, KeInsertDeviceQueue,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x00000078, KeInsertHeadQueue,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x00000079, KeInsertQueue,                                              kFunction),\nXE_EXPORT(xboxkrnl, 0x0000007A, KeInsertQueueApc,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x0000007B, KeInsertQueueDpc,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x0000007C, KeIpiGenericCall,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x0000007D, KeLeaveCriticalRegion,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x0000007E, KeLeaveUserMode,                                            kFunction),\nXE_EXPORT(xboxkrnl, 0x0000007F, KePulseEvent,                                               kFunction),\nXE_EXPORT(xboxkrnl, 0x00000080, KeQueryBackgroundProcessors,                                kFunction),\nXE_EXPORT(xboxkrnl, 0x00000081, KeQueryBasePriorityThread,                                  kFunction),\nXE_EXPORT(xboxkrnl, 0x00000082, KeQueryInterruptTime,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x00000083, KeQueryPerformanceFrequency,                                kFunction),\nXE_EXPORT(xboxkrnl, 0x00000084, KeQuerySystemTime,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x00000085, KeRaiseIrqlToDpcLevel,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x00000086, KeRegisterDriverNotification,                               kFunction),\nXE_EXPORT(xboxkrnl, 0x00000087, KeReleaseMutant,                                            kFunction),\nXE_EXPORT(xboxkrnl, 0x00000088, KeReleaseSemaphore,                                         kFunction),\nXE_EXPORT(xboxkrnl, 0x00000089, KeReleaseSpinLockFromRaisedIrql,                            kFunction),\nXE_EXPORT(xboxkrnl, 0x0000008A, KeRemoveByKeyDeviceQueue,                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x0000008B, KeRemoveDeviceQueue,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x0000008C, KeRemoveEntryDeviceQueue,                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x0000008D, KeRemoveQueue,                                              kFunction),\nXE_EXPORT(xboxkrnl, 0x0000008E, KeRemoveQueueDpc,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x0000008F, KeResetEvent,                                               kFunction),\nXE_EXPORT(xboxkrnl, 0x00000090, KeRestoreFloatingPointState,                                kFunction),\nXE_EXPORT(xboxkrnl, 0x00000091, KeRestoreVectorUnitState,                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x00000092, KeResumeThread,                                             kFunction),\nXE_EXPORT(xboxkrnl, 0x00000093, KeRetireDpcList,                                            kFunction),\nXE_EXPORT(xboxkrnl, 0x00000094, KeRundownQueue,                                             kFunction),\nXE_EXPORT(xboxkrnl, 0x00000095, KeSaveFloatingPointState,                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x00000096, KeSaveVectorUnitState,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x00000097, KeSetAffinityThread,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x00000098, KeSetBackgroundProcessors,                                  kFunction),\nXE_EXPORT(xboxkrnl, 0x00000099, KeSetBasePriorityThread,                                    kFunction),\nXE_EXPORT(xboxkrnl, 0x0000009A, KeSetCurrentProcessType,                                    kFunction),\nXE_EXPORT(xboxkrnl, 0x0000009B, KeSetCurrentStackPointers,                                  kFunction),\nXE_EXPORT(xboxkrnl, 0x0000009C, KeSetDisableBoostThread,                                    kFunction),\nXE_EXPORT(xboxkrnl, 0x0000009D, KeSetEvent,                                                 kFunction),\nXE_EXPORT(xboxkrnl, 0x0000009E, KeSetEventBoostPriority,                                    kFunction),\nXE_EXPORT(xboxkrnl, 0x0000009F, KeSetPMWRegister,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x000000A0, KeSetPowerMode,                                             kFunction),\nXE_EXPORT(xboxkrnl, 0x000000A1, KeSetPRVRegister,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x000000A2, KeSetPriorityClassThread,                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x000000A3, KeSetPriorityThread,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x000000A4, KeSetSocRegister,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x000000A5, KeSetSpecialPurposeRegister,                                kFunction),\nXE_EXPORT(xboxkrnl, 0x000000A6, KeSetTimer,                                                 kFunction),\nXE_EXPORT(xboxkrnl, 0x000000A7, KeSetTimerEx,                                               kFunction),\nXE_EXPORT(xboxkrnl, 0x000000A8, KeStallExecutionProcessor,                                  kFunction),\nXE_EXPORT(xboxkrnl, 0x000000A9, KeSuspendThread,                                            kFunction),\nXE_EXPORT(xboxkrnl, 0x000000AA, KeSweepDcacheRange,                                         kFunction),\nXE_EXPORT(xboxkrnl, 0x000000AB, KeSweepIcacheRange,                                         kFunction),\nXE_EXPORT(xboxkrnl, 0x000000AC, KeTestAlertThread,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x000000AD, KeTimeStampBundle,                                          kVariable),\nXE_EXPORT(xboxkrnl, 0x000000AE, KeTryToAcquireSpinLockAtRaisedIrql,                         kFunction),\nXE_EXPORT(xboxkrnl, 0x000000AF, KeWaitForMultipleObjects,                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x000000B0, KeWaitForSingleObject,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x000000B1, KfAcquireSpinLock,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x000000B2, KfRaiseIrql,                                                kFunction),\nXE_EXPORT(xboxkrnl, 0x000000B3, KfLowerIrql,                                                kFunction),\nXE_EXPORT(xboxkrnl, 0x000000B4, KfReleaseSpinLock,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x000000B5, KiBugCheckData,                                             kVariable),\nXE_EXPORT(xboxkrnl, 0x000000B6, LDICreateDecompression,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x000000B7, LDIDecompress,                                              kFunction),\nXE_EXPORT(xboxkrnl, 0x000000B8, LDIDestroyDecompression,                                    kFunction),\nXE_EXPORT(xboxkrnl, 0x000000B9, MmAllocatePhysicalMemory,                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x000000BA, MmAllocatePhysicalMemoryEx,                                 kFunction),\nXE_EXPORT(xboxkrnl, 0x000000BB, MmCreateKernelStack,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x000000BC, MmDeleteKernelStack,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x000000BD, MmFreePhysicalMemory,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x000000BE, MmGetPhysicalAddress,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x000000BF, MmIsAddressValid,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x000000C0, MmLockAndMapSegmentArray,                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x000000C1, MmLockUnlockBufferPages,                                    kFunction),\nXE_EXPORT(xboxkrnl, 0x000000C2, MmMapIoSpace,                                               kFunction),\nXE_EXPORT(xboxkrnl, 0x000000C3, MmPersistPhysicalMemoryAllocation,                          kFunction),\nXE_EXPORT(xboxkrnl, 0x000000C4, MmQueryAddressProtect,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x000000C5, MmQueryAllocationSize,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x000000C6, MmQueryStatistics,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x000000C7, MmSetAddressProtect,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x000000C8, MmSplitPhysicalMemoryAllocation,                            kFunction),\nXE_EXPORT(xboxkrnl, 0x000000C9, MmUnlockAndUnmapSegmentArray,                               kFunction),\nXE_EXPORT(xboxkrnl, 0x000000CA, MmUnmapIoSpace,                                             kFunction),\nXE_EXPORT(xboxkrnl, 0x000000CB, Nls844UnicodeCaseTable,                                     kVariable),\nXE_EXPORT(xboxkrnl, 0x000000CC, NtAllocateVirtualMemory,                                    kFunction),\nXE_EXPORT(xboxkrnl, 0x000000CD, NtCancelTimer,                                              kFunction),\nXE_EXPORT(xboxkrnl, 0x000000CE, NtClearEvent,                                               kFunction),\nXE_EXPORT(xboxkrnl, 0x000000CF, NtClose,                                                    kFunction),\nXE_EXPORT(xboxkrnl, 0x000000D0, NtCreateDirectoryObject,                                    kFunction),\nXE_EXPORT(xboxkrnl, 0x000000D1, NtCreateEvent,                                              kFunction),\nXE_EXPORT(xboxkrnl, 0x000000D2, NtCreateFile,                                               kFunction),\nXE_EXPORT(xboxkrnl, 0x000000D3, NtCreateIoCompletion,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x000000D4, NtCreateMutant,                                             kFunction),\nXE_EXPORT(xboxkrnl, 0x000000D5, NtCreateSemaphore,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x000000D6, NtCreateSymbolicLinkObject,                                 kFunction),\nXE_EXPORT(xboxkrnl, 0x000000D7, NtCreateTimer,                                              kFunction),\nXE_EXPORT(xboxkrnl, 0x000000D8, NtDeleteFile,                                               kFunction),\nXE_EXPORT(xboxkrnl, 0x000000D9, NtDeviceIoControlFile,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x000000DA, NtDuplicateObject,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x000000DB, NtFlushBuffersFile,                                         kFunction),\nXE_EXPORT(xboxkrnl, 0x000000DC, NtFreeVirtualMemory,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x000000DD, NtMakeTemporaryObject,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x000000DE, NtOpenDirectoryObject,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x000000DF, NtOpenFile,                                                 kFunction),\nXE_EXPORT(xboxkrnl, 0x000000E0, NtOpenSymbolicLinkObject,                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x000000E1, NtProtectVirtualMemory,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x000000E2, NtPulseEvent,                                               kFunction),\nXE_EXPORT(xboxkrnl, 0x000000E3, NtQueueApcThread,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x000000E4, NtQueryDirectoryFile,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x000000E5, NtQueryDirectoryObject,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x000000E6, NtQueryEvent,                                               kFunction),\nXE_EXPORT(xboxkrnl, 0x000000E7, NtQueryFullAttributesFile,                                  kFunction),\nXE_EXPORT(xboxkrnl, 0x000000E8, NtQueryInformationFile,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x000000E9, NtQueryIoCompletion,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x000000EA, NtQueryMutant,                                              kFunction),\nXE_EXPORT(xboxkrnl, 0x000000EB, NtQuerySemaphore,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x000000EC, NtQuerySymbolicLinkObject,                                  kFunction),\nXE_EXPORT(xboxkrnl, 0x000000ED, NtQueryTimer,                                               kFunction),\nXE_EXPORT(xboxkrnl, 0x000000EE, NtQueryVirtualMemory,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x000000EF, NtQueryVolumeInformationFile,                               kFunction),\nXE_EXPORT(xboxkrnl, 0x000000F0, NtReadFile,                                                 kFunction),\nXE_EXPORT(xboxkrnl, 0x000000F1, NtReadFileScatter,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x000000F2, NtReleaseMutant,                                            kFunction),\nXE_EXPORT(xboxkrnl, 0x000000F3, NtReleaseSemaphore,                                         kFunction),\nXE_EXPORT(xboxkrnl, 0x000000F4, NtRemoveIoCompletion,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x000000F5, NtResumeThread,                                             kFunction),\nXE_EXPORT(xboxkrnl, 0x000000F6, NtSetEvent,                                                 kFunction),\nXE_EXPORT(xboxkrnl, 0x000000F7, NtSetInformationFile,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x000000F8, NtSetIoCompletion,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x000000F9, NtSetSystemTime,                                            kFunction),\nXE_EXPORT(xboxkrnl, 0x000000FA, NtSetTimerEx,                                               kFunction),\nXE_EXPORT(xboxkrnl, 0x000000FB, NtSignalAndWaitForSingleObjectEx,                           kFunction),\nXE_EXPORT(xboxkrnl, 0x000000FC, NtSuspendThread,                                            kFunction),\nXE_EXPORT(xboxkrnl, 0x000000FD, NtWaitForSingleObjectEx,                                    kFunction),\nXE_EXPORT(xboxkrnl, 0x000000FE, NtWaitForMultipleObjectsEx,                                 kFunction),\nXE_EXPORT(xboxkrnl, 0x000000FF, NtWriteFile,                                                kFunction),\nXE_EXPORT(xboxkrnl, 0x00000100, NtWriteFileGather,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x00000101, NtYieldExecution,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x00000102, ObCreateObject,                                             kFunction),\nXE_EXPORT(xboxkrnl, 0x00000103, ObCreateSymbolicLink,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x00000104, ObDeleteSymbolicLink,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x00000105, ObDereferenceObject,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x00000106, ObDirectoryObjectType,                                      kVariable),\nXE_EXPORT(xboxkrnl, 0x00000107, ObGetWaitableObject,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x00000108, ObInsertObject,                                             kFunction),\nXE_EXPORT(xboxkrnl, 0x00000109, ObIsTitleObject,                                            kFunction),\nXE_EXPORT(xboxkrnl, 0x0000010A, ObLookupAnyThreadByThreadId,                                kFunction),\nXE_EXPORT(xboxkrnl, 0x0000010B, ObLookupThreadByThreadId,                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x0000010C, ObMakeTemporaryObject,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x0000010D, ObOpenObjectByName,                                         kFunction),\nXE_EXPORT(xboxkrnl, 0x0000010E, ObOpenObjectByPointer,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x0000010F, ObReferenceObject,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x00000110, ObReferenceObjectByHandle,                                  kFunction),\nXE_EXPORT(xboxkrnl, 0x00000111, ObReferenceObjectByName,                                    kFunction),\nXE_EXPORT(xboxkrnl, 0x00000112, ObSymbolicLinkObjectType,                                   kVariable),\nXE_EXPORT(xboxkrnl, 0x00000113, ObTranslateSymbolicLink,                                    kFunction),\nXE_EXPORT(xboxkrnl, 0x00000114, RtlAnsiStringToUnicodeString,                               kFunction),\nXE_EXPORT(xboxkrnl, 0x00000115, RtlAppendStringToString,                                    kFunction),\nXE_EXPORT(xboxkrnl, 0x00000116, RtlAppendUnicodeStringToString,                             kFunction),\nXE_EXPORT(xboxkrnl, 0x00000117, RtlAppendUnicodeToString,                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x00000118, RtlAssert,                                                  kFunction),\nXE_EXPORT(xboxkrnl, 0x00000119, RtlCaptureContext,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x0000011A, RtlCompareMemory,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x0000011B, RtlCompareMemoryUlong,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x0000011C, RtlCompareString,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x0000011D, RtlCompareStringN,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x0000011E, RtlCompareUnicodeString,                                    kFunction),\nXE_EXPORT(xboxkrnl, 0x0000011F, RtlCompareUnicodeStringN,                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x00000120, RtlCompareUtf8ToUnicode,                                    kFunction),\nXE_EXPORT(xboxkrnl, 0x00000121, RtlCopyString,                                              kFunction),\nXE_EXPORT(xboxkrnl, 0x00000122, RtlCopyUnicodeString,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x00000123, RtlCreateUnicodeString,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x00000124, RtlDowncaseUnicodeChar,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x00000125, RtlEnterCriticalSection,                                    kFunction),\nXE_EXPORT(xboxkrnl, 0x00000126, RtlFillMemoryUlong,                                         kFunction),\nXE_EXPORT(xboxkrnl, 0x00000127, RtlFreeAnsiString,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x00000128, RtlFreeUnicodeString,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x00000129, RtlGetCallersAddress,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x0000012A, RtlGetStackLimits,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x0000012B, RtlImageXexHeaderField,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x0000012C, RtlInitAnsiString,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x0000012D, RtlInitUnicodeString,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x0000012E, RtlInitializeCriticalSection,                               kFunction),\nXE_EXPORT(xboxkrnl, 0x0000012F, RtlInitializeCriticalSectionAndSpinCount,                   kFunction),\nXE_EXPORT(xboxkrnl, 0x00000130, RtlLeaveCriticalSection,                                    kFunction),\nXE_EXPORT(xboxkrnl, 0x00000131, RtlLookupFunctionEntry,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x00000132, RtlLowerChar,                                               kFunction),\nXE_EXPORT(xboxkrnl, 0x00000133, RtlMultiByteToUnicodeN,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x00000134, RtlMultiByteToUnicodeSize,                                  kFunction),\nXE_EXPORT(xboxkrnl, 0x00000135, RtlNtStatusToDosError,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x00000136, RtlRaiseException,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x00000137, RtlRaiseStatus,                                             kFunction),\nXE_EXPORT(xboxkrnl, 0x00000138, RtlRip,                                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x00000139, _scprintf,                                                  kFunction),\nXE_EXPORT(xboxkrnl, 0x0000013A, _snprintf,                                                  kFunction),\nXE_EXPORT(xboxkrnl, 0x0000013B, sprintf,                                                    kFunction),\nXE_EXPORT(xboxkrnl, 0x0000013C, _scwprintf,                                                 kFunction),\nXE_EXPORT(xboxkrnl, 0x0000013D, _snwprintf,                                                 kFunction),\nXE_EXPORT(xboxkrnl, 0x0000013E, swprintf,                                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x0000013F, RtlTimeFieldsToTime,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x00000140, RtlTimeToTimeFields,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x00000141, RtlTryEnterCriticalSection,                                 kFunction),\nXE_EXPORT(xboxkrnl, 0x00000142, RtlUnicodeStringToAnsiString,                               kFunction),\nXE_EXPORT(xboxkrnl, 0x00000143, RtlUnicodeToMultiByteN,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x00000144, RtlUnicodeToMultiByteSize,                                  kFunction),\nXE_EXPORT(xboxkrnl, 0x00000145, RtlUnicodeToUtf8,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x00000146, RtlUnicodeToUtf8Size,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x00000147, RtlUnwind,                                                  kFunction),\nXE_EXPORT(xboxkrnl, 0x00000148, RtlUnwind2,                                                 kFunction),\nXE_EXPORT(xboxkrnl, 0x00000149, RtlUpcaseUnicodeChar,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x0000014A, RtlUpperChar,                                               kFunction),\nXE_EXPORT(xboxkrnl, 0x0000014B, RtlVirtualUnwind,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x0000014C, _vscprintf,                                                 kFunction),\nXE_EXPORT(xboxkrnl, 0x0000014D, _vsnprintf,                                                 kFunction),\nXE_EXPORT(xboxkrnl, 0x0000014E, vsprintf,                                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x0000014F, _vscwprintf,                                                kFunction),\nXE_EXPORT(xboxkrnl, 0x00000150, _vsnwprintf,                                                kFunction),\nXE_EXPORT(xboxkrnl, 0x00000151, vswprintf,                                                  kFunction),\nXE_EXPORT(xboxkrnl, 0x00000152, KeTlsAlloc,                                                 kFunction),\nXE_EXPORT(xboxkrnl, 0x00000153, KeTlsFree,                                                  kFunction),\nXE_EXPORT(xboxkrnl, 0x00000154, KeTlsGetValue,                                              kFunction),\nXE_EXPORT(xboxkrnl, 0x00000155, KeTlsSetValue,                                              kFunction),\nXE_EXPORT(xboxkrnl, 0x00000156, XboxHardwareInfo,                                           kVariable),\nXE_EXPORT(xboxkrnl, 0x00000157, XboxKrnlBaseVersion,                                        kVariable),\nXE_EXPORT(xboxkrnl, 0x00000158, XboxKrnlVersion,                                            kVariable),\nXE_EXPORT(xboxkrnl, 0x00000159, XeCryptAesKey,                                              kFunction),\nXE_EXPORT(xboxkrnl, 0x0000015A, XeCryptAesEcb,                                              kFunction),\nXE_EXPORT(xboxkrnl, 0x0000015B, XeCryptAesCbc,                                              kFunction),\nXE_EXPORT(xboxkrnl, 0x0000015C, XeCryptBnDwLeDhEqualBase,                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x0000015D, XeCryptBnDwLeDhInvalBase,                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x0000015E, XeCryptBnDwLeDhModExp,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x0000015F, XeCryptBnDw_Copy,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x00000160, XeCryptBnDw_SwapLeBe,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x00000161, XeCryptBnDw_Zero,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x00000162, XeCryptBnDwLePkcs1Format,                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x00000163, XeCryptBnDwLePkcs1Verify,                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x00000164, XeCryptBnQwBeSigCreate,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x00000165, XeCryptBnQwBeSigFormat,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x00000166, XeCryptBnQwBeSigVerify,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x00000167, XeCryptBnQwNeModExp,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x00000168, XeCryptBnQwNeModExpRoot,                                    kFunction),\nXE_EXPORT(xboxkrnl, 0x00000169, XeCryptBnQwNeModInv,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x0000016A, XeCryptBnQwNeModMul,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x0000016B, XeCryptBnQwNeRsaKeyGen,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x0000016C, XeCryptBnQwNeRsaPrvCrypt,                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x0000016D, XeCryptBnQwNeRsaPubCrypt,                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x0000016E, XeCryptBnQw_Copy,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x0000016F, XeCryptBnQw_SwapDwQw,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x00000170, XeCryptBnQw_SwapDwQwLeBe,                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x00000171, XeCryptBnQw_SwapLeBe,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x00000172, XeCryptBnQw_Zero,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x00000173, XeCryptChainAndSumMac,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x00000174, XeCryptDesParity,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x00000175, XeCryptDesKey,                                              kFunction),\nXE_EXPORT(xboxkrnl, 0x00000176, XeCryptDesEcb,                                              kFunction),\nXE_EXPORT(xboxkrnl, 0x00000177, XeCryptDesCbc,                                              kFunction),\nXE_EXPORT(xboxkrnl, 0x00000178, XeCryptDes3Key,                                             kFunction),\nXE_EXPORT(xboxkrnl, 0x00000179, XeCryptDes3Ecb,                                             kFunction),\nXE_EXPORT(xboxkrnl, 0x0000017A, XeCryptDes3Cbc,                                             kFunction),\nXE_EXPORT(xboxkrnl, 0x0000017B, XeCryptHmacMd5Init,                                         kFunction),\nXE_EXPORT(xboxkrnl, 0x0000017C, XeCryptHmacMd5Update,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x0000017D, XeCryptHmacMd5Final,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x0000017E, XeCryptHmacMd5,                                             kFunction),\nXE_EXPORT(xboxkrnl, 0x0000017F, XeCryptHmacShaInit,                                         kFunction),\nXE_EXPORT(xboxkrnl, 0x00000180, XeCryptHmacShaUpdate,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x00000181, XeCryptHmacShaFinal,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x00000182, XeCryptHmacSha,                                             kFunction),\nXE_EXPORT(xboxkrnl, 0x00000183, XeCryptHmacShaVerify,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x00000184, XeCryptMd5Init,                                             kFunction),\nXE_EXPORT(xboxkrnl, 0x00000185, XeCryptMd5Update,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x00000186, XeCryptMd5Final,                                            kFunction),\nXE_EXPORT(xboxkrnl, 0x00000187, XeCryptMd5,                                                 kFunction),\nXE_EXPORT(xboxkrnl, 0x00000188, XeCryptParveEcb,                                            kFunction),\nXE_EXPORT(xboxkrnl, 0x00000189, XeCryptParveCbcMac,                                         kFunction),\nXE_EXPORT(xboxkrnl, 0x0000018A, XeCryptRandom,                                              kFunction),\nXE_EXPORT(xboxkrnl, 0x0000018B, XeCryptRc4Key,                                              kFunction),\nXE_EXPORT(xboxkrnl, 0x0000018C, XeCryptRc4Ecb,                                              kFunction),\nXE_EXPORT(xboxkrnl, 0x0000018D, XeCryptRc4,                                                 kFunction),\nXE_EXPORT(xboxkrnl, 0x0000018E, XeCryptRotSumSha,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x0000018F, XeCryptShaInit,                                             kFunction),\nXE_EXPORT(xboxkrnl, 0x00000190, XeCryptShaUpdate,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x00000191, XeCryptShaFinal,                                            kFunction),\nXE_EXPORT(xboxkrnl, 0x00000192, XeCryptSha,                                                 kFunction),\nXE_EXPORT(xboxkrnl, 0x00000193, XexExecutableModuleHandle,                                  kVariable),\nXE_EXPORT(xboxkrnl, 0x00000194, XexCheckExecutablePrivilege,                                kFunction),\nXE_EXPORT(xboxkrnl, 0x00000195, XexGetModuleHandle,                                         kFunction),\nXE_EXPORT(xboxkrnl, 0x00000196, XexGetModuleSection,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x00000197, XexGetProcedureAddress,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x00000198, XexLoadExecutable,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x00000199, XexLoadImage,                                               kFunction),\nXE_EXPORT(xboxkrnl, 0x0000019A, XexLoadImageFromMemory,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x0000019B, XexLoadImageHeaders,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x0000019C, XexPcToFileHeader,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x0000019D, KiApcNormalRoutineNop_,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x0000019E, XexRegisterPatchDescriptor,                                 kFunction),\nXE_EXPORT(xboxkrnl, 0x0000019F, XexSendDeferredNotifications,                               kFunction),\nXE_EXPORT(xboxkrnl, 0x000001A0, XexStartExecutable,                                         kFunction),\nXE_EXPORT(xboxkrnl, 0x000001A1, XexUnloadImage,                                             kFunction),\nXE_EXPORT(xboxkrnl, 0x000001A2, XexUnloadImageAndExitThread,                                kFunction),\nXE_EXPORT(xboxkrnl, 0x000001A3, XexUnloadTitleModules,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x000001A4, XexVerifyImageHeaders,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x000001A5, __C_specific_handler,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x000001A6, DbgLoadImageSymbols,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x000001A7, DbgUnLoadImageSymbols,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x000001A8, RtlImageDirectoryEntryToData,                               kFunction),\nXE_EXPORT(xboxkrnl, 0x000001A9, RtlImageNtHeader,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x000001AA, ExDebugMonitorService,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x000001AB, MmDbgReadCheck,                                             kFunction),\nXE_EXPORT(xboxkrnl, 0x000001AC, MmDbgReleaseAddress,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x000001AD, MmDbgWriteCheck,                                            kFunction),\nXE_EXPORT(xboxkrnl, 0x000001AE, ExLoadedCommandLine,                                        kVariable),\nXE_EXPORT(xboxkrnl, 0x000001AF, ExLoadedImageName,                                          kVariable),\nXE_EXPORT(xboxkrnl, 0x000001B0, VdBlockUntilGUIIdle,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x000001B1, VdCallGraphicsNotificationRoutines,                         kFunction),\nXE_EXPORT(xboxkrnl, 0x000001B2, VdDisplayFatalError,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x000001B3, VdEnableClosedCaption,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x000001B4, VdEnableDisableClockGating,                                 kFunction),\nXE_EXPORT(xboxkrnl, 0x000001B5, VdEnableDisablePowerSavingMode,                             kFunction),\nXE_EXPORT(xboxkrnl, 0x000001B6, VdEnableRingBufferRPtrWriteBack,                            kFunction),\nXE_EXPORT(xboxkrnl, 0x000001B7, VdGenerateGPUCSCCoefficients,                               kFunction),\nXE_EXPORT(xboxkrnl, 0x000001B8, VdGetClosedCaptionReadyStatus,                              kFunction),\nXE_EXPORT(xboxkrnl, 0x000001B9, VdGetCurrentDisplayGamma,                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x000001BA, VdGetCurrentDisplayInformation,                             kFunction),\nXE_EXPORT(xboxkrnl, 0x000001BB, VdGetDisplayModeOverride,                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x000001BC, VdGetGraphicsAsicID,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x000001BD, VdGetSystemCommandBuffer,                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x000001BE, VdGlobalDevice,                                             kVariable),\nXE_EXPORT(xboxkrnl, 0x000001BF, VdGlobalXamDevice,                                          kVariable),\nXE_EXPORT(xboxkrnl, 0x000001C0, VdGpuClockInMHz,                                            kVariable),\nXE_EXPORT(xboxkrnl, 0x000001C1, VdHSIOCalibrationLock,                                      kVariable),\nXE_EXPORT(xboxkrnl, 0x000001C2, VdInitializeEngines,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x000001C3, VdInitializeRingBuffer,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x000001C4, VdInitializeScaler,                                         kFunction),\nXE_EXPORT(xboxkrnl, 0x000001C5, VdInitializeScalerCommandBuffer,                            kFunction),\nXE_EXPORT(xboxkrnl, 0x000001C6, VdIsHSIOTrainingSucceeded,                                  kFunction),\nXE_EXPORT(xboxkrnl, 0x000001C7, VdPersistDisplay,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x000001C8, VdQuerySystemCommandBuffer,                                 kFunction),\nXE_EXPORT(xboxkrnl, 0x000001C9, VdQueryVideoFlags,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x000001CA, VdQueryVideoMode,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x000001CB, VdReadDVERegisterUlong,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x000001CC, VdReadWriteHSIOCalibrationFlag,                             kFunction),\nXE_EXPORT(xboxkrnl, 0x000001CD, VdRegisterGraphicsNotification,                             kFunction),\nXE_EXPORT(xboxkrnl, 0x000001CE, VdRegisterXamGraphicsNotification,                          kFunction),\nXE_EXPORT(xboxkrnl, 0x000001CF, VdSendClosedCaptionData,                                    kFunction),\nXE_EXPORT(xboxkrnl, 0x000001D0, VdSetCGMSOption,                                            kFunction),\nXE_EXPORT(xboxkrnl, 0x000001D1, VdSetColorProfileAdjustment,                                kFunction),\nXE_EXPORT(xboxkrnl, 0x000001D2, VdSetCscMatricesOverride,                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x000001D3, VdSetDisplayMode,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x000001D4, VdSetDisplayModeOverride,                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x000001D5, VdSetGraphicsInterruptCallback,                             kFunction),\nXE_EXPORT(xboxkrnl, 0x000001D6, VdSetHDCPOption,                                            kFunction),\nXE_EXPORT(xboxkrnl, 0x000001D7, VdSetMacrovisionOption,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x000001D8, VdSetSystemCommandBuffer,                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x000001D9, VdSetSystemCommandBufferGpuIdentifierAddress,               kFunction),\nXE_EXPORT(xboxkrnl, 0x000001DA, VdSetWSSData,                                               kFunction),\nXE_EXPORT(xboxkrnl, 0x000001DB, VdSetWSSOption,                                             kFunction),\nXE_EXPORT(xboxkrnl, 0x000001DC, VdShutdownEngines,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x000001DD, VdTurnDisplayOff,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x000001DE, VdTurnDisplayOn,                                            kFunction),\nXE_EXPORT(xboxkrnl, 0x000001DF, KiApcNormalRoutineNop,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x000001E0, VdWriteDVERegisterUlong,                                    kFunction),\nXE_EXPORT(xboxkrnl, 0x000001E1, XVoicedHeadsetPresent,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x000001E2, XVoicedSubmitPacket,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x000001E3, XVoicedClose,                                               kFunction),\nXE_EXPORT(xboxkrnl, 0x000001E4, XVoicedActivate,                                            kFunction),\nXE_EXPORT(xboxkrnl, 0x000001E5, XInputdGetCapabilities,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x000001E6, XInputdReadState,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x000001E7, XInputdWriteState,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x000001E8, XInputdNotify,                                              kFunction),\nXE_EXPORT(xboxkrnl, 0x000001E9, XInputdRawState,                                            kFunction),\nXE_EXPORT(xboxkrnl, 0x000001EA, HidGetCapabilities,                                         kFunction),\nXE_EXPORT(xboxkrnl, 0x000001EB, HidReadKeys,                                                kFunction),\nXE_EXPORT(xboxkrnl, 0x000001EC, XInputdGetDeviceStats,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x000001ED, XInputdResetDevice,                                         kFunction),\nXE_EXPORT(xboxkrnl, 0x000001EE, XInputdSetRingOfLight,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x000001EF, XInputdSetRFPowerMode,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x000001F0, XInputdSetRadioFrequency,                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x000001F1, HidGetLastInputTime,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x000001F2, XAudioRenderDriverInitialize,                               kFunction),\nXE_EXPORT(xboxkrnl, 0x000001F3, XAudioRegisterRenderDriverClient,                           kFunction),\nXE_EXPORT(xboxkrnl, 0x000001F4, XAudioUnregisterRenderDriverClient,                         kFunction),\nXE_EXPORT(xboxkrnl, 0x000001F5, XAudioSubmitRenderDriverFrame,                              kFunction),\nXE_EXPORT(xboxkrnl, 0x000001F6, XAudioRenderDriverLock,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x000001F7, XAudioGetVoiceCategoryVolumeChangeMask,                     kFunction),\nXE_EXPORT(xboxkrnl, 0x000001F8, XAudioGetVoiceCategoryVolume,                               kFunction),\nXE_EXPORT(xboxkrnl, 0x000001F9, XAudioSetVoiceCategoryVolume,                               kFunction),\nXE_EXPORT(xboxkrnl, 0x000001FA, XAudioBeginDigitalBypassMode,                               kFunction),\nXE_EXPORT(xboxkrnl, 0x000001FB, XAudioEndDigitalBypassMode,                                 kFunction),\nXE_EXPORT(xboxkrnl, 0x000001FC, XAudioSubmitDigitalPacket,                                  kFunction),\nXE_EXPORT(xboxkrnl, 0x000001FD, XAudioQueryDriverPerformance,                               kFunction),\nXE_EXPORT(xboxkrnl, 0x000001FE, XAudioGetRenderDriverThread,                                kFunction),\nXE_EXPORT(xboxkrnl, 0x000001FF, XAudioGetSpeakerConfig,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x00000200, XAudioSetSpeakerConfig,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x00000201, NicSetUnicastAddress,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x00000202, NicAttach,                                                  kFunction),\nXE_EXPORT(xboxkrnl, 0x00000203, NicDetach,                                                  kFunction),\nXE_EXPORT(xboxkrnl, 0x00000204, NicXmit,                                                    kFunction),\nXE_EXPORT(xboxkrnl, 0x00000205, NicUpdateMcastMembership,                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x00000206, NicFlushXmitQueue,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x00000207, NicShutdown,                                                kFunction),\nXE_EXPORT(xboxkrnl, 0x00000208, NicGetLinkState,                                            kFunction),\nXE_EXPORT(xboxkrnl, 0x00000209, NicGetStats,                                                kFunction),\nXE_EXPORT(xboxkrnl, 0x0000020A, NicGetOpt,                                                  kFunction),\nXE_EXPORT(xboxkrnl, 0x0000020B, NicSetOpt,                                                  kFunction),\nXE_EXPORT(xboxkrnl, 0x0000020C, DrvSetSysReqCallback,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x0000020D, DrvSetUserBindingCallback,                                  kFunction),\nXE_EXPORT(xboxkrnl, 0x0000020E, DrvSetContentStorageCallback,                               kFunction),\nXE_EXPORT(xboxkrnl, 0x0000020F, DrvSetAutobind,                                             kFunction),\nXE_EXPORT(xboxkrnl, 0x00000210, DrvGetContentStorageNotification,                           kFunction),\nXE_EXPORT(xboxkrnl, 0x00000211, MtpdBeginTransaction,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x00000212, MtpdCancelTransaction,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x00000213, MtpdEndTransaction,                                         kFunction),\nXE_EXPORT(xboxkrnl, 0x00000214, MtpdGetCurrentDevices,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x00000215, MtpdReadData,                                               kFunction),\nXE_EXPORT(xboxkrnl, 0x00000216, MtpdReadEvent,                                              kFunction),\nXE_EXPORT(xboxkrnl, 0x00000217, MtpdResetDevice,                                            kFunction),\nXE_EXPORT(xboxkrnl, 0x00000218, MtpdSendData,                                               kFunction),\nXE_EXPORT(xboxkrnl, 0x00000219, MtpdVerifyProximity,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x0000021A, XUsbcamSetCaptureMode,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x0000021B, XUsbcamGetConfig,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x0000021C, XUsbcamSetConfig,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x0000021D, XUsbcamGetState,                                            kFunction),\nXE_EXPORT(xboxkrnl, 0x0000021E, XUsbcamReadFrame,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x0000021F, XUsbcamSnapshot,                                            kFunction),\nXE_EXPORT(xboxkrnl, 0x00000220, XUsbcamSetView,                                             kFunction),\nXE_EXPORT(xboxkrnl, 0x00000221, XUsbcamGetView,                                             kFunction),\nXE_EXPORT(xboxkrnl, 0x00000222, XUsbcamCreate,                                              kFunction),\nXE_EXPORT(xboxkrnl, 0x00000223, XUsbcamDestroy,                                             kFunction),\nXE_EXPORT(xboxkrnl, 0x00000224, XMACreateContext,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x00000225, XMAInitializeContext,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x00000226, XMAReleaseContext,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x00000227, XMAEnableContext,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x00000228, XMADisableContext,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x00000229, XMAGetOutputBufferWriteOffset,                              kFunction),\nXE_EXPORT(xboxkrnl, 0x0000022A, XMASetOutputBufferReadOffset,                               kFunction),\nXE_EXPORT(xboxkrnl, 0x0000022B, XMAGetOutputBufferReadOffset,                               kFunction),\nXE_EXPORT(xboxkrnl, 0x0000022C, XMASetOutputBufferValid,                                    kFunction),\nXE_EXPORT(xboxkrnl, 0x0000022D, XMAIsOutputBufferValid,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x0000022E, XMASetInputBuffer0Valid,                                    kFunction),\nXE_EXPORT(xboxkrnl, 0x0000022F, XMAIsInputBuffer0Valid,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x00000230, XMASetInputBuffer1Valid,                                    kFunction),\nXE_EXPORT(xboxkrnl, 0x00000231, XMAIsInputBuffer1Valid,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x00000232, XMASetInputBuffer0,                                         kFunction),\nXE_EXPORT(xboxkrnl, 0x00000233, XMASetInputBuffer1,                                         kFunction),\nXE_EXPORT(xboxkrnl, 0x00000234, XMAGetPacketMetadata,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x00000235, XMABlockWhileInUse,                                         kFunction),\nXE_EXPORT(xboxkrnl, 0x00000236, XMASetLoopData,                                             kFunction),\nXE_EXPORT(xboxkrnl, 0x00000237, XMASetInputBufferReadOffset,                                kFunction),\nXE_EXPORT(xboxkrnl, 0x00000238, XMAGetInputBufferReadOffset,                                kFunction),\nXE_EXPORT(xboxkrnl, 0x00000239, ExIsBetaFeatureEnabled,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x0000023A, XeKeysGetFactoryChallenge,                                  kFunction),\nXE_EXPORT(xboxkrnl, 0x0000023B, XeKeysSetFactoryResponse,                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x0000023C, XeKeysInitializeFuses,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x0000023D, XeKeysSaveBootLoader,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x0000023E, XeKeysSaveKeyVault,                                         kFunction),\nXE_EXPORT(xboxkrnl, 0x0000023F, XeKeysGetStatus,                                            kFunction),\nXE_EXPORT(xboxkrnl, 0x00000240, XeKeysGeneratePrivateKey,                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x00000241, XeKeysGetKeyProperties,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x00000242, XeKeysSetKey,                                               kFunction),\nXE_EXPORT(xboxkrnl, 0x00000243, XeKeysGenerateRandomKey,                                    kFunction),\nXE_EXPORT(xboxkrnl, 0x00000244, XeKeysGetKey,                                               kFunction),\nXE_EXPORT(xboxkrnl, 0x00000245, XeKeysGetDigest,                                            kFunction),\nXE_EXPORT(xboxkrnl, 0x00000246, XeKeysGetConsoleID,                                         kFunction),\nXE_EXPORT(xboxkrnl, 0x00000247, XeKeysGetConsoleType,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x00000248, XeKeysQwNeRsaPrvCrypt,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x00000249, XeKeysHmacSha,                                              kFunction),\nXE_EXPORT(xboxkrnl, 0x0000024A, XInputdPassThroughRFCommand,                                kFunction),\nXE_EXPORT(xboxkrnl, 0x0000024B, XeKeysAesCbc,                                               kFunction),\nXE_EXPORT(xboxkrnl, 0x0000024C, XeKeysDes2Cbc,                                              kFunction),\nXE_EXPORT(xboxkrnl, 0x0000024D, XeKeysDesCbc,                                               kFunction),\nXE_EXPORT(xboxkrnl, 0x0000024E, XeKeysObscureKey,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x0000024F, XeKeysHmacShaUsingKey,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x00000250, XeKeysSaveBootLoaderEx,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x00000251, XeKeysAesCbcUsingKey,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x00000252, XeKeysDes2CbcUsingKey,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x00000253, XeKeysDesCbcUsingKey,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x00000254, XeKeysObfuscate,                                            kFunction),\nXE_EXPORT(xboxkrnl, 0x00000255, XeKeysUnObfuscate,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x00000256, XeKeysConsolePrivateKeySign,                                kFunction),\nXE_EXPORT(xboxkrnl, 0x00000257, XeKeysConsoleSignatureVerification,                         kFunction),\nXE_EXPORT(xboxkrnl, 0x00000258, XeKeysVerifyRSASignature,                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x00000259, StfsCreateDevice,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x0000025A, StfsControlDevice,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x0000025B, VdSwap,                                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x0000025C, HalFsbInterruptCount,                                       kVariable),\nXE_EXPORT(xboxkrnl, 0x0000025D, XeKeysSaveSystemUpdate,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x0000025E, XeKeysLockSystemUpdate,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x0000025F, XeKeysExecute,                                              kFunction),\nXE_EXPORT(xboxkrnl, 0x00000260, XeKeysGetVersions,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x00000261, XInputdPowerDownDevice,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x00000262, AniBlockOnAnimation,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x00000263, AniTerminateAnimation,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x00000264, XUsbcamReset,                                               kFunction),\nXE_EXPORT(xboxkrnl, 0x00000265, AniSetLogo,                                                 kFunction),\nXE_EXPORT(xboxkrnl, 0x00000266, KeCertMonitorData,                                          kVariable),\nXE_EXPORT(xboxkrnl, 0x00000267, HalIsExecutingPowerDownDpc,                                 kFunction),\nXE_EXPORT(xboxkrnl, 0x00000268, VdInitializeEDRAM,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x00000269, VdRetrainEDRAM,                                             kFunction),\nXE_EXPORT(xboxkrnl, 0x0000026A, VdRetrainEDRAMWorker,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x0000026B, VdHSIOTrainCount,                                           kVariable),\nXE_EXPORT(xboxkrnl, 0x0000026C, HalGetPowerUpCause,                                         kFunction),\nXE_EXPORT(xboxkrnl, 0x0000026D, VdHSIOTrainingStatus,                                       kVariable),\nXE_EXPORT(xboxkrnl, 0x0000026E, RgcBindInfo,                                                kVariable),\nXE_EXPORT(xboxkrnl, 0x0000026F, VdReadEEDIDBlock,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x00000270, VdEnumerateVideoModes,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x00000271, VdEnableHDCP,                                               kFunction),\nXE_EXPORT(xboxkrnl, 0x00000272, VdRegisterHDCPNotification,                                 kFunction),\nXE_EXPORT(xboxkrnl, 0x00000273, HidReadMouseChanges,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x00000274, DumpSetCollectionFacility,                                  kFunction),\nXE_EXPORT(xboxkrnl, 0x00000275, XexTransformImageKey,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x00000276, XAudioOverrideSpeakerConfig,                                kFunction),\nXE_EXPORT(xboxkrnl, 0x00000277, XInputdReadTextKeystroke,                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x00000278, DrvXenonButtonPressed,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x00000279, DrvBindToUser,                                              kFunction),\nXE_EXPORT(xboxkrnl, 0x0000027A, XexGetModuleImportVersions,                                 kFunction),\nXE_EXPORT(xboxkrnl, 0x0000027B, RtlComputeCrc32,                                            kFunction),\nXE_EXPORT(xboxkrnl, 0x0000027C, XeKeysSetRevocationList,                                    kFunction),\nXE_EXPORT(xboxkrnl, 0x0000027D, HalRegisterPowerDownCallback,                               kFunction),\nXE_EXPORT(xboxkrnl, 0x0000027E, VdGetDisplayDiscoveryData,                                  kFunction),\nXE_EXPORT(xboxkrnl, 0x0000027F, XInputdSendStayAliveRequest,                                kFunction),\nXE_EXPORT(xboxkrnl, 0x00000280, XVoicedSendVPort,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x00000281, XVoicedGetBatteryStatus,                                    kFunction),\nXE_EXPORT(xboxkrnl, 0x00000282, XInputdFFGetDeviceInfo,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x00000283, XInputdFFSetEffect,                                         kFunction),\nXE_EXPORT(xboxkrnl, 0x00000284, XInputdFFUpdateEffect,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x00000285, XInputdFFEffectOperation,                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x00000286, XInputdFFDeviceControl,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x00000287, XInputdFFSetDeviceGain,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x00000288, XInputdFFCancelIo,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x00000289, XInputdFFSetRumble,                                         kFunction),\nXE_EXPORT(xboxkrnl, 0x0000028A, NtAllocateEncryptedMemory,                                  kFunction),\nXE_EXPORT(xboxkrnl, 0x0000028B, NtFreeEncryptedMemory,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x0000028C, XeKeysExSaveKeyVault,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x0000028D, XeKeysExSetKey,                                             kFunction),\nXE_EXPORT(xboxkrnl, 0x0000028E, XeKeysExGetKey,                                             kFunction),\nXE_EXPORT(xboxkrnl, 0x0000028F, DrvSetDeviceConfigChangeCallback,                           kFunction),\nXE_EXPORT(xboxkrnl, 0x00000290, DrvDeviceConfigChange,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x00000291, HalRegisterHdDvdRomNotification,                            kFunction),\nXE_EXPORT(xboxkrnl, 0x00000292, XeKeysSecurityInitialize,                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x00000293, XeKeysSecurityLoadSettings,                                 kFunction),\nXE_EXPORT(xboxkrnl, 0x00000294, XeKeysSecuritySaveSettings,                                 kFunction),\nXE_EXPORT(xboxkrnl, 0x00000295, XeKeysSecuritySetDetected,                                  kFunction),\nXE_EXPORT(xboxkrnl, 0x00000296, XeKeysSecurityGetDetected,                                  kFunction),\nXE_EXPORT(xboxkrnl, 0x00000297, XeKeysSecuritySetActivated,                                 kFunction),\nXE_EXPORT(xboxkrnl, 0x00000298, XeKeysSecurityGetActivated,                                 kFunction),\nXE_EXPORT(xboxkrnl, 0x00000299, XeKeysDvdAuthAP25InstallTable,                              kFunction),\nXE_EXPORT(xboxkrnl, 0x0000029A, XeKeysDvdAuthAP25GetTableVersion,                           kFunction),\nXE_EXPORT(xboxkrnl, 0x0000029B, XeKeysGetProtectedFlag,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x0000029C, XeKeysSetProtectedFlag,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x0000029D, KeEnablePFMInterrupt,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x0000029E, KeDisablePFMInterrupt,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x0000029F, KeSetProfilerISR,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x000002A0, VdStartDisplayDiscovery,                                    kFunction),\nXE_EXPORT(xboxkrnl, 0x000002A1, VdSetHDCPRevocationList,                                    kFunction),\nXE_EXPORT(xboxkrnl, 0x000002A2, XeKeysGetUpdateSequence,                                    kFunction),\nXE_EXPORT(xboxkrnl, 0x000002A3, XeKeysDvdAuthExActivate,                                    kFunction),\nXE_EXPORT(xboxkrnl, 0x000002A4, KeGetImagePageTableEntry,                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x000002A5, HalRegisterBackgroundModeTransitionCallback,                kFunction),\nXE_EXPORT(xboxkrnl, 0x000002A6, AniStartBootAnimation,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x000002A7, HalClampUnclampOutputDACs,                                  kFunction),\nXE_EXPORT(xboxkrnl, 0x000002A8, HalPowerDownToBackgroundMode,                               kFunction),\nXE_EXPORT(xboxkrnl, 0x000002A9, HalNotifyAddRemoveBackgroundTask,                           kFunction),\nXE_EXPORT(xboxkrnl, 0x000002AA, HalCallBackgroundModeNotificationRoutines,                  kFunction),\nXE_EXPORT(xboxkrnl, 0x000002AB, HalFsbResetCount,                                           kVariable),\nXE_EXPORT(xboxkrnl, 0x000002AC, HalGetMemoryInformation,                                    kFunction),\nXE_EXPORT(xboxkrnl, 0x000002AD, XInputdGetLastTextInputTime,                                kFunction),\nXE_EXPORT(xboxkrnl, 0x000002AE, VdEnableWMAProOverHDMI,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x000002AF, XeKeysRevokeSaveSettings,                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x000002B0, XInputdSetTextMessengerIndicator,                           kFunction),\nXE_EXPORT(xboxkrnl, 0x000002B1, MicDeviceRequest,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x000002B2, XeKeysGetMediaID,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x000002B3, XeKeysLoadKeyVault,                                         kFunction),\nXE_EXPORT(xboxkrnl, 0x000002B4, KeGetVidInfo,                                               kFunction),\nXE_EXPORT(xboxkrnl, 0x000002B5, HalNotifyBackgroundModeTransitionComplete,                  kFunction),\nXE_EXPORT(xboxkrnl, 0x000002B6, IoAcquireCancelSpinLock,                                    kFunction),\nXE_EXPORT(xboxkrnl, 0x000002B7, IoReleaseCancelSpinLock,                                    kFunction),\nXE_EXPORT(xboxkrnl, 0x000002B8, NtCancelIoFile,                                             kFunction),\nXE_EXPORT(xboxkrnl, 0x000002B9, NtCancelIoFileEx,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x000002BA, HalFinalizePowerLossRecovery,                               kFunction),\nXE_EXPORT(xboxkrnl, 0x000002BB, HalSetPowerLossRecovery,                                    kFunction),\nXE_EXPORT(xboxkrnl, 0x000002BC, ExReadModifyWriteXConfigSettingUlong,                       kFunction),\nXE_EXPORT(xboxkrnl, 0x000002BD, HalRegisterXamPowerDownCallback,                            kFunction),\nXE_EXPORT(xboxkrnl, 0x000002BE, ExCancelAlarm,                                              kFunction),\nXE_EXPORT(xboxkrnl, 0x000002BF, ExInitializeAlarm,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x000002C0, ExSetAlarm,                                                 kFunction),\nXE_EXPORT(xboxkrnl, 0x000002C1, XexActivationGetNonce,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x000002C2, XexActivationSetLicense,                                    kFunction),\nXE_EXPORT(xboxkrnl, 0x000002C3, IptvSetBoundaryKey,                                         kFunction),\nXE_EXPORT(xboxkrnl, 0x000002C4, IptvSetSessionKey,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x000002C5, IptvVerifyOmac1Signature,                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x000002C6, IptvGetAesCtrTransform,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x000002C7, SataCdRomRecordReset,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x000002C8, XInputdSetTextDeviceKeyLocks,                               kFunction),\nXE_EXPORT(xboxkrnl, 0x000002C9, XInputdGetTextDeviceKeyLocks,                               kFunction),\nXE_EXPORT(xboxkrnl, 0x000002CA, XexActivationVerifyOwnership,                               kFunction),\nXE_EXPORT(xboxkrnl, 0x000002CB, XexDisableVerboseDbgPrint,                                  kFunction),\nXE_EXPORT(xboxkrnl, 0x000002CC, SvodCreateDevice,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x000002CD, RtlCaptureStackBackTrace,                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x000002CE, XeKeysRevokeUpdateDynamic,                                  kFunction),\nXE_EXPORT(xboxkrnl, 0x000002CF, XexImportTraceEnable,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x000002D0, ExRegisterXConfigNotification,                              kFunction),\nXE_EXPORT(xboxkrnl, 0x000002D1, XeKeysSecuritySetStat,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x000002D2, VdQueryRealVideoMode,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x000002D3, XexSetExecutablePrivilege,                                  kFunction),\nXE_EXPORT(xboxkrnl, 0x000002D4, XAudioSuspendRenderDriverClients,                           kFunction),\nXE_EXPORT(xboxkrnl, 0x000002D5, IptvGetSessionKeyHash,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x000002D6, VdSetCGMSState,                                             kFunction),\nXE_EXPORT(xboxkrnl, 0x000002D7, VdSetSCMSState,                                             kFunction),\nXE_EXPORT(xboxkrnl, 0x000002D8, KeFlushMultipleTb,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x000002D9, VdGetOption,                                                kFunction),\nXE_EXPORT(xboxkrnl, 0x000002DA, VdSetOption,                                                kFunction),\nXE_EXPORT(xboxkrnl, 0x000002DB, UsbdBootEnumerationDoneEvent,                               kVariable),\nXE_EXPORT(xboxkrnl, 0x000002DC, StfsDeviceErrorEvent,                                       kVariable),\nXE_EXPORT(xboxkrnl, 0x000002DD, ExTryToAcquireReadWriteLockExclusive,                       kFunction),\nXE_EXPORT(xboxkrnl, 0x000002DE, ExTryToAcquireReadWriteLockShared,                          kFunction),\nXE_EXPORT(xboxkrnl, 0x000002DF, XexSetLastKdcTime,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x000002E0, XInputdControl,                                             kFunction),\nXE_EXPORT(xboxkrnl, 0x000002E1, RmcDeviceRequest,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x000002E2, LDIResetDecompression,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x000002E3, NicRegisterDevice,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x000002E4, UsbdAddDeviceComplete,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x000002E5, UsbdCancelAsyncTransfer,                                    kFunction),\nXE_EXPORT(xboxkrnl, 0x000002E6, UsbdGetDeviceSpeed,                                         kFunction),\nXE_EXPORT(xboxkrnl, 0x000002E7, UsbdGetDeviceTopology,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x000002E8, UsbdGetEndpointDescriptor,                                  kFunction),\nXE_EXPORT(xboxkrnl, 0x000002E9, UsbdIsDeviceAuthenticated,                                  kFunction),\nXE_EXPORT(xboxkrnl, 0x000002EA, UsbdOpenDefaultEndpoint,                                    kFunction),\nXE_EXPORT(xboxkrnl, 0x000002EB, UsbdOpenEndpoint,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x000002EC, UsbdQueueAsyncTransfer,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x000002ED, UsbdQueueCloseDefaultEndpoint,                              kFunction),\nXE_EXPORT(xboxkrnl, 0x000002EE, UsbdQueueCloseEndpoint,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x000002EF, UsbdRemoveDeviceComplete,                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x000002F0, KeRemoveQueueApc,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x000002F1, UsbdDriverLoadRequiredEvent,                                kVariable),\nXE_EXPORT(xboxkrnl, 0x000002F2, UsbdGetRequiredDrivers,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x000002F3, UsbdRegisterDriverObject,                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x000002F4, UsbdUnregisterDriverObject,                                 kFunction),\nXE_EXPORT(xboxkrnl, 0x000002F5, UsbdCallAndBlockOnDpcRoutine,                               kFunction),\nXE_EXPORT(xboxkrnl, 0x000002F6, UsbdResetDevice,                                            kFunction),\nXE_EXPORT(xboxkrnl, 0x000002F7, UsbdGetDeviceDescriptor,                                    kFunction),\nXE_EXPORT(xboxkrnl, 0x000002F8, NomnilGetExtension,                                         kFunction),\nXE_EXPORT(xboxkrnl, 0x000002F9, NomnilStartCloseDevice,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x000002FA, WifiBeginAuthentication,                                    kFunction),\nXE_EXPORT(xboxkrnl, 0x000002FB, WifiCheckCounterMeasures,                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x000002FC, WifiChooseAuthenCipherSetFromBSSID,                         kFunction),\nXE_EXPORT(xboxkrnl, 0x000002FD, WifiCompleteAuthentication,                                 kFunction),\nXE_EXPORT(xboxkrnl, 0x000002FE, WifiGetAssociationIE,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x000002FF, WifiOnMICError,                                             kFunction),\nXE_EXPORT(xboxkrnl, 0x00000300, WifiPrepareAuthenticationContext,                           kFunction),\nXE_EXPORT(xboxkrnl, 0x00000301, WifiRecvEAPOLPacket,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x00000302, WifiDeduceNetworkType,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x00000303, NicUnregisterDevice,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x00000304, DumpXitThread,                                              kFunction),\nXE_EXPORT(xboxkrnl, 0x00000305, XInputdSetWifiChannel,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x00000306, NomnilSetLed,                                               kFunction),\nXE_EXPORT(xboxkrnl, 0x00000307, WifiCalculateRegulatoryDomain,                              kFunction),\nXE_EXPORT(xboxkrnl, 0x00000308, WifiSelectAdHocChannel,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x00000309, WifiChannelToFrequency,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x0000030A, MmGetPoolPagesType,                                         kFunction),\nXE_EXPORT(xboxkrnl, 0x0000030B, ExExpansionInstall,                                         kFunction),\nXE_EXPORT(xboxkrnl, 0x0000030C, ExExpansionCall,                                            kFunction),\nXE_EXPORT(xboxkrnl, 0x0000030D, PsCamDeviceRequest,                                         kFunction),\nXE_EXPORT(xboxkrnl, 0x0000030E, McaDeviceRequest,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x0000030F, DetroitDeviceRequest,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x00000310, XeCryptSha256Init,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x00000311, XeCryptSha256Update,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x00000312, XeCryptSha256Final,                                         kFunction),\nXE_EXPORT(xboxkrnl, 0x00000313, XeCryptSha256,                                              kFunction),\nXE_EXPORT(xboxkrnl, 0x00000314, XeCryptSha384Init,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x00000315, XeCryptSha384Update,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x00000316, XInputdGetDevicePid,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x00000317, HalGetNotedArgonErrors,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x00000318, XeCryptSha384Final,                                         kFunction),\nXE_EXPORT(xboxkrnl, 0x00000319, HalReadArgonEeprom,                                         kFunction),\nXE_EXPORT(xboxkrnl, 0x0000031A, HalWriteArgonEeprom,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x0000031B, XeKeysFcrtLoad,                                             kFunction),\nXE_EXPORT(xboxkrnl, 0x0000031C, XeKeysFcrtSave,                                             kFunction),\nXE_EXPORT(xboxkrnl, 0x0000031D, XeKeysFcrtSet,                                              kFunction),\nXE_EXPORT(xboxkrnl, 0x0000031E, XeCryptSha384,                                              kFunction),\nXE_EXPORT(xboxkrnl, 0x0000031F, XeCryptSha512Init,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x00000320, XAudioRegisterRenderDriverMECClient,                        kFunction),\nXE_EXPORT(xboxkrnl, 0x00000321, XAudioUnregisterRenderDriverMECClient,                      kFunction),\nXE_EXPORT(xboxkrnl, 0x00000322, XAudioCaptureRenderDriverFrame,                             kFunction),\nXE_EXPORT(xboxkrnl, 0x00000323, XeCryptSha512Update,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x00000324, XeCryptSha512Final,                                         kFunction),\nXE_EXPORT(xboxkrnl, 0x00000325, XeCryptSha512,                                              kFunction),\nXE_EXPORT(xboxkrnl, 0x00000326, XeCryptBnQwNeCompare,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x00000327, XVoicedGetDirectionalData,                                  kFunction),\nXE_EXPORT(xboxkrnl, 0x00000328, DrvSetMicArrayStartCallback,                                kFunction),\nXE_EXPORT(xboxkrnl, 0x00000329, DevAuthGetStatistics,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x0000032A, NullCableRequest,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x0000032B, XeKeysRevokeIsDeviceRevoked,                                kFunction),\nXE_EXPORT(xboxkrnl, 0x0000032C, DumpUpdateDumpSettings,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x0000032D, EtxConsumerDisableEventType,                                kFunction),\nXE_EXPORT(xboxkrnl, 0x0000032E, EtxConsumerEnableEventType,                                 kFunction),\nXE_EXPORT(xboxkrnl, 0x0000032F, EtxConsumerProcessLogs,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x00000330, EtxConsumerRegister,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x00000331, EtxConsumerUnregister,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x00000332, EtxProducerLog,                                             kFunction),\nXE_EXPORT(xboxkrnl, 0x00000333, EtxProducerLogV,                                            kFunction),\nXE_EXPORT(xboxkrnl, 0x00000334, EtxProducerRegister,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x00000335, EtxProducerUnregister,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x00000336, EtxConsumerFlushBuffers,                                    kFunction),\nXE_EXPORT(xboxkrnl, 0x00000337, EtxProducerLogXwpp,                                         kFunction),\nXE_EXPORT(xboxkrnl, 0x00000338, EtxProducerLogXwppV,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x00000339, UsbdEnableDisableRootHubPort,                               kFunction),\nXE_EXPORT(xboxkrnl, 0x0000033A, EtxBufferRegister,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x0000033B, EtxBufferUnregister,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x0000033C, DumpRegisterDedicatedDataBlock,                             kFunction),\nXE_EXPORT(xboxkrnl, 0x0000033D, XeKeysDvdAuthExSave,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x0000033E, XeKeysDvdAuthExInstall,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x0000033F, XexShimDisable,                                             kFunction),\nXE_EXPORT(xboxkrnl, 0x00000340, XexShimEnable,                                              kFunction),\nXE_EXPORT(xboxkrnl, 0x00000341, XexShimEntryDisable,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x00000342, XexShimEntryEnable,                                         kFunction),\nXE_EXPORT(xboxkrnl, 0x00000343, XexShimEntryRegister,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x00000344, XexShimLock,                                                kFunction),\nXE_EXPORT(xboxkrnl, 0x00000345, XboxKrnlVersion4Digit,                                      kVariable),\nXE_EXPORT(xboxkrnl, 0x00000346, XeKeysObfuscateEx,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x00000347, XeKeysUnObfuscateEx,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x00000348, XexTitleHash,                                               kFunction),\nXE_EXPORT(xboxkrnl, 0x00000349, XexTitleHashClose,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x0000034A, XexTitleHashContinue,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x0000034B, XexTitleHashOpen,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x0000034C, XAudioGetRenderDriverTic,                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x0000034D, XAudioEnableDucker,                                         kFunction),\nXE_EXPORT(xboxkrnl, 0x0000034E, XAudioSetDuckerLevel,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x0000034F, XAudioIsDuckerEnabled,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x00000350, XAudioGetDuckerLevel,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x00000351, XAudioGetDuckerThreshold,                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x00000352, XAudioSetDuckerThreshold,                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x00000353, XAudioGetDuckerAttackTime,                                  kFunction),\nXE_EXPORT(xboxkrnl, 0x00000354, XAudioSetDuckerAttackTime,                                  kFunction),\nXE_EXPORT(xboxkrnl, 0x00000355, XAudioGetDuckerReleaseTime,                                 kFunction),\nXE_EXPORT(xboxkrnl, 0x00000356, XAudioSetDuckerReleaseTime,                                 kFunction),\nXE_EXPORT(xboxkrnl, 0x00000357, XAudioGetDuckerHoldTime,                                    kFunction),\nXE_EXPORT(xboxkrnl, 0x00000358, XAudioSetDuckerHoldTime,                                    kFunction),\nXE_EXPORT(xboxkrnl, 0x00000359, DevAuthShouldAlwaysEnforce,                                 kFunction),\nXE_EXPORT(xboxkrnl, 0x0000035A, XAudioGetUnderrunCount,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x0000035B, DrvSetAudioLatencyCallback,                                 kFunction),\nXE_EXPORT(xboxkrnl, 0x0000035C, XVoicedIsActiveProcess,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x0000035D, KeExecuteOnProtectedStack,                                  kFunction),\nXE_EXPORT(xboxkrnl, 0x0000035E, XeKeysVerifyPIRSSignature,                                  kFunction),\nXE_EXPORT(xboxkrnl, 0x0000035F, XeCryptAesCtr,                                              kFunction),\nXE_EXPORT(xboxkrnl, 0x00000360, XeCryptAesCbcMac,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x00000361, XeCryptAesDmMac,                                            kFunction),\nXE_EXPORT(xboxkrnl, 0x00000362, EmaExecute,                                                 kFunction),\nXE_EXPORT(xboxkrnl, 0x00000363, XeKeysGetTruncatedSecondaryConsoleId,                       kFunction),\nXE_EXPORT(xboxkrnl, 0x00000364, ExFreeDebugPool,                                            kFunction),\nXE_EXPORT(xboxkrnl, 0x00000365, VdQueryVideoCapabilities,                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x00000366, UsbdGetDeviceRootPortType,                                  kFunction),\nXE_EXPORT(xboxkrnl, 0x00000367, VdGet3dVideoFormat,                                         kFunction),\nXE_EXPORT(xboxkrnl, 0x00000368, VdGetWSS2Data,                                              kFunction),\nXE_EXPORT(xboxkrnl, 0x00000369, VdSet3dVideoFormat,                                         kFunction),\nXE_EXPORT(xboxkrnl, 0x0000036A, VdSetWSS2Data,                                              kFunction),\nXE_EXPORT(xboxkrnl, 0x0000036B, XexReserveCodeBuffer,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x0000036C, XexCommitCodeBuffer,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x0000036D, RtlSetVectoredExceptionHandler,                             kFunction),\nXE_EXPORT(xboxkrnl, 0x0000036E, RtlClearVectoredExceptionHandler,                           kFunction),\nXE_EXPORT(xboxkrnl, 0x0000036F, XAudioSetProcessFrameCallback,                              kFunction),\nXE_EXPORT(xboxkrnl, 0x00000370, UsbdGetRootHubDeviceNode,                                   kFunction),\nXE_EXPORT(xboxkrnl, 0x00000371, UsbdGetPortDeviceNode,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x00000372, UsbdGetNatalHub,                                            kFunction),\nXE_EXPORT(xboxkrnl, 0x00000373, UsbdGetNatalHardwareVersion,                                kFunction),\nXE_EXPORT(xboxkrnl, 0x00000374, UsbdNatalHubRegisterNotificationCallback,                   kFunction),\nXE_EXPORT(xboxkrnl, 0x00000375, KeCallAndBlockOnDpcRoutine,                                 kFunction),\nXE_EXPORT(xboxkrnl, 0x00000376, KeCallAndWaitForDpcRoutine,                                 kFunction),\nXE_EXPORT(xboxkrnl, 0x00000377, TidDeviceRequest,                                           kFunction),\nXE_EXPORT(xboxkrnl, 0x00000378, DmPrintData,                                                kFunction),\nXE_EXPORT(xboxkrnl, 0x00000379, VdSetStudioRGBMode,                                         kFunction),\nXE_EXPORT(xboxkrnl, 0x0000037A, UsbdTitleDriverResetAllUnrecognizedPorts,                   kFunction),\nXE_EXPORT(xboxkrnl, 0x0000037B, UsbdTitleDriverSetUnrecognizedPort,                         kFunction),\nXE_EXPORT(xboxkrnl, 0x0000037C, UsbdResetEndpoint,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x0000037D, UsbdSetTimer,                                               kFunction),\nXE_EXPORT(xboxkrnl, 0x0000037E, UsbdCancelTimer,                                            kFunction),\nXE_EXPORT(xboxkrnl, 0x0000037F, UsbdQueueIsochTransfer,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x00000380, KeSetPageRelocationCallback,                                kFunction),\nXE_EXPORT(xboxkrnl, 0x00000381, XexRegisterUsermodeModule,                                  kFunction),\nXE_EXPORT(xboxkrnl, 0x00000383, TitleDeviceAuthRequest,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x00000384, KeRegisterSwapNotification,                                 kFunction),\nXE_EXPORT(xboxkrnl, 0x00000385, XInputdGetFailedConnectionOrBind,                           kFunction),\nXE_EXPORT(xboxkrnl, 0x00000386, XInputdSetFailedConnectionOrBindCallback,                   kFunction),\nXE_EXPORT(xboxkrnl, 0x00000388, XInputdSetMinMaxAuthDelay,                                  kFunction),\nXE_EXPORT(xboxkrnl, 0x00000389, VgcHandler_SetHandlers,                                     kFunction),\nXE_EXPORT(xboxkrnl, 0x0000038A, VvcHandlerCancelTransfers,                                  kFunction),\nXE_EXPORT(xboxkrnl, 0x0000038B, VvcHandlerRetrieveVoiceExtension,                           kFunction),\nXE_EXPORT(xboxkrnl, 0x0000038D, MmResetLowestAvailablePages,                                kFunction),\nXE_EXPORT(xboxkrnl, 0x00000394, VeSetHandlers,                                              kFunction),\nXE_EXPORT(xboxkrnl, 0x00000395, HalConfigureVeDevice,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x00000396, XeCryptSha224Init,                                          kFunction),\nXE_EXPORT(xboxkrnl, 0x00000397, XeCryptAesCreateKeySchedule,                                kFunction),\nXE_EXPORT(xboxkrnl, 0x00000398, XeCryptAesEncryptOne,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x00000399, XeCryptAesDecryptOne,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x0000039A, XeCryptAesCbcEncrypt,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x0000039B, XeCryptAesCbcDecrypt,                                       kFunction),\nXE_EXPORT(xboxkrnl, 0x0000039C, XeCryptAesGcmInitialize,                                    kFunction),\nXE_EXPORT(xboxkrnl, 0x0000039D, XeCryptAesGcmUpdate,                                        kFunction),\nXE_EXPORT(xboxkrnl, 0x0000039E, XeCryptAesGcmFinalize,                                      kFunction),\nXE_EXPORT(xboxkrnl, 0x0000039F, XeCryptEccGetCurveParameters,                               kFunction),\nXE_EXPORT(xboxkrnl, 0x000003A0, XeCryptEccEcdhGenerateKeypair,                              kFunction),\nXE_EXPORT(xboxkrnl, 0x000003A1, XeCryptEccEcdhExponentiate,                                 kFunction),\nXE_EXPORT(xboxkrnl, 0x000003A2, XeCryptEccEcdsaGenerateSignature,                           kFunction),\nXE_EXPORT(xboxkrnl, 0x000003A3, XeCryptEccEcdsaVerifySignature,                             kFunction),\n"
  },
  {
    "path": "src/xenia/kernel/xboxkrnl/xboxkrnl_threading.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include <algorithm>\n#include <vector>\n\n#include \"xenia/base/atomic.h\"\n#include \"xenia/base/clock.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/mutex.h\"\n#include \"xenia/cpu/processor.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/user_module.h\"\n#include \"xenia/kernel/util/shim_utils.h\"\n#include \"xenia/kernel/xboxkrnl/xboxkrnl_private.h\"\n#include \"xenia/kernel/xboxkrnl/xboxkrnl_threading.h\"\n#include \"xenia/kernel/xevent.h\"\n#include \"xenia/kernel/xmutant.h\"\n#include \"xenia/kernel/xsemaphore.h\"\n#include \"xenia/kernel/xthread.h\"\n#include \"xenia/kernel/xtimer.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xboxkrnl {\n\n// r13 + 0x100: pointer to thread local state\n// Thread local state:\n//   0x058: kernel time\n//   0x14C: thread id\n//   0x150: if >0 then error states don't get set\n//   0x160: last error\n\n// GetCurrentThreadId:\n// lwz       r11, 0x100(r13)\n// lwz       r3, 0x14C(r11)\n\n// RtlGetLastError:\n// lwz r11, 0x150(r13)\n// if (r11 == 0) {\n//   lwz r11, 0x100(r13)\n//   stw r3, 0x160(r11)\n// }\n\n// RtlSetLastError:\n// lwz r11, 0x150(r13)\n// if (r11 == 0) {\n//   lwz r11, 0x100(r13)\n//   stw r3, 0x160(r11)\n// }\n\n// RtlSetLastNTError:\n// r3 = RtlNtStatusToDosError(r3)\n// lwz r11, 0x150(r13)\n// if (r11 == 0) {\n//   lwz r11, 0x100(r13)\n//   stw r3, 0x160(r11)\n// }\n\ntemplate <typename T>\nobject_ref<T> LookupNamedObject(KernelState* kernel_state,\n                                uint32_t obj_attributes_ptr) {\n  // If the name exists and its type matches, we can return that (ref+1)\n  // with a success of NAME_EXISTS.\n  // If the name exists and its type doesn't match, we do NAME_COLLISION.\n  // Otherwise, we add like normal.\n  if (!obj_attributes_ptr) {\n    return nullptr;\n  }\n  auto obj_attributes =\n      kernel_state->memory()->TranslateVirtual<X_OBJECT_ATTRIBUTES*>(\n          obj_attributes_ptr);\n  assert_true(obj_attributes->name_ptr != 0);\n  auto name = util::TranslateAnsiStringAddress(kernel_state->memory(),\n                                               obj_attributes->name_ptr);\n  if (!name.empty()) {\n    X_HANDLE handle = X_INVALID_HANDLE_VALUE;\n    X_RESULT result =\n        kernel_state->object_table()->GetObjectByName(name, &handle);\n    if (XSUCCEEDED(result)) {\n      // Found something! It's been retained, so return.\n      auto obj = kernel_state->object_table()->LookupObject<T>(handle);\n      if (obj) {\n        // The caller will do as it likes.\n        obj->ReleaseHandle();\n        return obj;\n      }\n    }\n  }\n  return nullptr;\n}\n\ndword_result_t ExCreateThread_entry(lpdword_t handle_ptr, dword_t stack_size,\n                                    lpdword_t thread_id_ptr,\n                                    dword_t xapi_thread_startup,\n                                    lpvoid_t start_address,\n                                    lpvoid_t start_context,\n                                    dword_t creation_flags) {\n  // http://jafile.com/uploads/scoop/main.cpp.txt\n  // DWORD\n  // LPHANDLE Handle,\n  // DWORD    StackSize,\n  // LPDWORD  ThreadId,\n  // LPVOID   XapiThreadStartup, ?? often 0\n  // LPVOID   StartAddress,\n  // LPVOID   StartContext,\n  // DWORD    CreationFlags // 0x80?\n\n  // Inherit default stack size\n  uint32_t actual_stack_size = stack_size;\n\n  if (actual_stack_size == 0) {\n    actual_stack_size = kernel_state()->GetExecutableModule()->stack_size();\n  }\n\n  // Stack must be aligned to 16kb pages\n  actual_stack_size =\n      std::max((uint32_t)0x4000, ((actual_stack_size + 0xFFF) & 0xFFFFF000));\n\n  auto thread = object_ref<XThread>(\n      new XThread(kernel_state(), actual_stack_size, xapi_thread_startup,\n                  start_address.guest_address(), start_context.guest_address(),\n                  creation_flags, true));\n\n  X_STATUS result = thread->Create();\n  if (XFAILED(result)) {\n    // Failed!\n    XELOGE(\"Thread creation failed: {:08X}\", result);\n    return result;\n  }\n\n  if (XSUCCEEDED(result)) {\n    if (handle_ptr) {\n      if (creation_flags & 0x80) {\n        *handle_ptr = thread->guest_object();\n      } else {\n        *handle_ptr = thread->handle();\n      }\n    }\n    if (thread_id_ptr) {\n      *thread_id_ptr = thread->thread_id();\n    }\n  }\n  return result;\n}\nDECLARE_XBOXKRNL_EXPORT1(ExCreateThread, kThreading, kImplemented);\n\ndword_result_t ExTerminateThread_entry(dword_t exit_code) {\n  XThread* thread = XThread::GetCurrentThread();\n\n  // NOTE: this kills us right now. We won't return from it.\n  return thread->Exit(exit_code);\n}\nDECLARE_XBOXKRNL_EXPORT1(ExTerminateThread, kThreading, kImplemented);\n\ndword_result_t NtResumeThread_entry(dword_t handle,\n                                    lpdword_t suspend_count_ptr) {\n  X_RESULT result = X_STATUS_INVALID_HANDLE;\n  uint32_t suspend_count = 0;\n\n  auto thread = kernel_state()->object_table()->LookupObject<XThread>(handle);\n  if (thread) {\n    result = thread->Resume(&suspend_count);\n  }\n  if (suspend_count_ptr) {\n    *suspend_count_ptr = suspend_count;\n  }\n\n  return result;\n}\nDECLARE_XBOXKRNL_EXPORT1(NtResumeThread, kThreading, kImplemented);\n\ndword_result_t KeResumeThread_entry(lpvoid_t thread_ptr) {\n  X_STATUS result = X_STATUS_SUCCESS;\n  auto thread = XObject::GetNativeObject<XThread>(kernel_state(), thread_ptr);\n  if (thread) {\n    result = thread->Resume();\n  } else {\n    result = X_STATUS_INVALID_HANDLE;\n  }\n\n  return result;\n}\nDECLARE_XBOXKRNL_EXPORT1(KeResumeThread, kThreading, kImplemented);\n\ndword_result_t NtSuspendThread_entry(dword_t handle,\n                                     lpdword_t suspend_count_ptr) {\n  X_RESULT result = X_STATUS_SUCCESS;\n  uint32_t suspend_count = 0;\n\n  auto thread = kernel_state()->object_table()->LookupObject<XThread>(handle);\n  if (thread) {\n    result = thread->Suspend(&suspend_count);\n  } else {\n    result = X_STATUS_INVALID_HANDLE;\n  }\n\n  if (suspend_count_ptr) {\n    *suspend_count_ptr = suspend_count;\n  }\n\n  return result;\n}\nDECLARE_XBOXKRNL_EXPORT1(NtSuspendThread, kThreading, kImplemented);\n\nvoid KeSetCurrentStackPointers_entry(lpvoid_t stack_ptr,\n                                     pointer_t<X_KTHREAD> thread,\n                                     lpvoid_t stack_alloc_base,\n                                     lpvoid_t stack_base,\n                                     lpvoid_t stack_limit) {\n  auto current_thread = XThread::GetCurrentThread();\n  auto context = current_thread->thread_state()->context();\n  auto pcr = kernel_memory()->TranslateVirtual<X_KPCR*>(\n      static_cast<uint32_t>(context->r[13]));\n\n  thread->stack_alloc_base = stack_alloc_base.value();\n  thread->stack_base = stack_base.value();\n  thread->stack_limit = stack_limit.value();\n  pcr->stack_base_ptr = stack_base.guest_address();\n  pcr->stack_end_ptr = stack_limit.guest_address();\n  context->r[1] = stack_ptr.guest_address();\n\n  // If a fiber is set, and the thread matches, reenter to avoid issues with\n  // host stack overflowing.\n  if (thread->fiber_ptr &&\n      current_thread->guest_object() == thread.guest_address()) {\n    current_thread->Reenter(static_cast<uint32_t>(context->lr));\n  }\n}\nDECLARE_XBOXKRNL_EXPORT2(KeSetCurrentStackPointers, kThreading, kImplemented,\n                         kHighFrequency);\n\ndword_result_t KeSetAffinityThread_entry(lpvoid_t thread_ptr, dword_t affinity,\n                                         lpdword_t previous_affinity_ptr) {\n  // The Xbox 360, according to disassembly of KeSetAffinityThread, unlike\n  // Windows NT, stores the previous affinity via the pointer provided as an\n  // argument, not in the return value - the return value is used for the\n  // result.\n  if (!affinity) {\n    return X_STATUS_INVALID_PARAMETER;\n  }\n  auto thread = XObject::GetNativeObject<XThread>(kernel_state(), thread_ptr);\n  if (thread) {\n    if (previous_affinity_ptr) {\n      *previous_affinity_ptr = uint32_t(1) << thread->active_cpu();\n    }\n    thread->SetAffinity(affinity);\n  }\n  return X_STATUS_SUCCESS;\n}\nDECLARE_XBOXKRNL_EXPORT1(KeSetAffinityThread, kThreading, kImplemented);\n\ndword_result_t KeQueryBasePriorityThread_entry(lpvoid_t thread_ptr) {\n  int32_t priority = 0;\n\n  auto thread = XObject::GetNativeObject<XThread>(kernel_state(), thread_ptr);\n  if (thread) {\n    priority = thread->QueryPriority();\n  }\n\n  return priority;\n}\nDECLARE_XBOXKRNL_EXPORT1(KeQueryBasePriorityThread, kThreading, kImplemented);\n\ndword_result_t KeSetBasePriorityThread_entry(lpvoid_t thread_ptr,\n                                             dword_t increment) {\n  int32_t prev_priority = 0;\n  auto thread = XObject::GetNativeObject<XThread>(kernel_state(), thread_ptr);\n\n  if (thread) {\n    prev_priority = thread->QueryPriority();\n    thread->SetPriority(increment);\n  }\n\n  return prev_priority;\n}\nDECLARE_XBOXKRNL_EXPORT1(KeSetBasePriorityThread, kThreading, kImplemented);\n\ndword_result_t KeSetDisableBoostThread_entry(lpvoid_t thread_ptr,\n                                             dword_t disabled) {\n  auto thread = XObject::GetNativeObject<XThread>(kernel_state(), thread_ptr);\n  if (thread) {\n    // Uhm?\n  }\n\n  return 0;\n}\nDECLARE_XBOXKRNL_EXPORT1(KeSetDisableBoostThread, kThreading, kImplemented);\n\ndword_result_t KeGetCurrentProcessType_entry() {\n  return kernel_state()->process_type();\n}\nDECLARE_XBOXKRNL_EXPORT2(KeGetCurrentProcessType, kThreading, kImplemented,\n                         kHighFrequency);\n\nvoid KeSetCurrentProcessType_entry(dword_t type) {\n  // One of X_PROCTYPE_?\n\n  assert_true(type <= 2);\n\n  kernel_state()->set_process_type(type);\n}\nDECLARE_XBOXKRNL_EXPORT1(KeSetCurrentProcessType, kThreading, kImplemented);\n\ndword_result_t KeQueryPerformanceFrequency_entry() {\n  uint64_t result = Clock::guest_tick_frequency();\n  return static_cast<uint32_t>(result);\n}\nDECLARE_XBOXKRNL_EXPORT2(KeQueryPerformanceFrequency, kThreading, kImplemented,\n                         kHighFrequency);\n\ndword_result_t KeDelayExecutionThread_entry(dword_t processor_mode,\n                                            dword_t alertable,\n                                            lpqword_t interval_ptr) {\n  XThread* thread = XThread::GetCurrentThread();\n  X_STATUS result = thread->Delay(processor_mode, alertable, *interval_ptr);\n\n  return result;\n}\nDECLARE_XBOXKRNL_EXPORT3(KeDelayExecutionThread, kThreading, kImplemented,\n                         kBlocking, kHighFrequency);\n\ndword_result_t NtYieldExecution_entry() {\n  auto thread = XThread::GetCurrentThread();\n  thread->Delay(0, 0, 0);\n  return 0;\n}\nDECLARE_XBOXKRNL_EXPORT2(NtYieldExecution, kThreading, kImplemented,\n                         kHighFrequency);\n\nvoid KeQuerySystemTime_entry(lpqword_t time_ptr) {\n  uint64_t time = Clock::QueryGuestSystemTime();\n  if (time_ptr) {\n    *time_ptr = time;\n  }\n}\nDECLARE_XBOXKRNL_EXPORT1(KeQuerySystemTime, kThreading, kImplemented);\n\n// https://msdn.microsoft.com/en-us/library/ms686801\ndword_result_t KeTlsAlloc_entry() {\n  uint32_t slot = kernel_state()->AllocateTLS();\n  XThread::GetCurrentThread()->SetTLSValue(slot, 0);\n\n  return slot;\n}\nDECLARE_XBOXKRNL_EXPORT1(KeTlsAlloc, kThreading, kImplemented);\n\n// https://msdn.microsoft.com/en-us/library/ms686804\ndword_result_t KeTlsFree_entry(dword_t tls_index) {\n  if (tls_index == X_TLS_OUT_OF_INDEXES) {\n    return 0;\n  }\n\n  kernel_state()->FreeTLS(tls_index);\n  return 1;\n}\nDECLARE_XBOXKRNL_EXPORT1(KeTlsFree, kThreading, kImplemented);\n\n// https://msdn.microsoft.com/en-us/library/ms686812\ndword_result_t KeTlsGetValue_entry(dword_t tls_index) {\n  // xboxkrnl doesn't actually have an error branch - it always succeeds, even\n  // if it overflows the TLS.\n  uint32_t value = 0;\n  if (XThread::GetCurrentThread()->GetTLSValue(tls_index, &value)) {\n    return value;\n  }\n\n  return 0;\n}\nDECLARE_XBOXKRNL_EXPORT2(KeTlsGetValue, kThreading, kImplemented,\n                         kHighFrequency);\n\n// https://msdn.microsoft.com/en-us/library/ms686818\ndword_result_t KeTlsSetValue_entry(dword_t tls_index, dword_t tls_value) {\n  // xboxkrnl doesn't actually have an error branch - it always succeeds, even\n  // if it overflows the TLS.\n  if (XThread::GetCurrentThread()->SetTLSValue(tls_index, tls_value)) {\n    return 1;\n  }\n\n  return 0;\n}\nDECLARE_XBOXKRNL_EXPORT1(KeTlsSetValue, kThreading, kImplemented);\n\nvoid KeInitializeEvent_entry(pointer_t<X_KEVENT> event_ptr, dword_t event_type,\n                             dword_t initial_state) {\n  event_ptr.Zero();\n  event_ptr->header.type = event_type;\n  event_ptr->header.signal_state = (uint32_t)initial_state;\n  auto ev =\n      XObject::GetNativeObject<XEvent>(kernel_state(), event_ptr, event_type);\n  if (!ev) {\n    assert_always();\n    return;\n  }\n}\nDECLARE_XBOXKRNL_EXPORT1(KeInitializeEvent, kThreading, kImplemented);\n\nuint32_t xeKeSetEvent(X_KEVENT* event_ptr, uint32_t increment, uint32_t wait) {\n  auto ev = XObject::GetNativeObject<XEvent>(kernel_state(), event_ptr);\n  if (!ev) {\n    assert_always();\n    return 0;\n  }\n\n  return ev->Set(increment, !!wait);\n}\n\ndword_result_t KeSetEvent_entry(pointer_t<X_KEVENT> event_ptr,\n                                dword_t increment, dword_t wait) {\n  return xeKeSetEvent(event_ptr, increment, wait);\n}\nDECLARE_XBOXKRNL_EXPORT2(KeSetEvent, kThreading, kImplemented, kHighFrequency);\n\ndword_result_t KePulseEvent_entry(pointer_t<X_KEVENT> event_ptr,\n                                  dword_t increment, dword_t wait) {\n  auto ev = XObject::GetNativeObject<XEvent>(kernel_state(), event_ptr);\n  if (!ev) {\n    assert_always();\n    return 0;\n  }\n\n  return ev->Pulse(increment, !!wait);\n}\nDECLARE_XBOXKRNL_EXPORT2(KePulseEvent, kThreading, kImplemented,\n                         kHighFrequency);\n\ndword_result_t KeResetEvent_entry(pointer_t<X_KEVENT> event_ptr) {\n  auto ev = XObject::GetNativeObject<XEvent>(kernel_state(), event_ptr);\n  if (!ev) {\n    assert_always();\n    return 0;\n  }\n\n  return ev->Reset();\n}\nDECLARE_XBOXKRNL_EXPORT1(KeResetEvent, kThreading, kImplemented);\n\ndword_result_t NtCreateEvent_entry(\n    lpdword_t handle_ptr, pointer_t<X_OBJECT_ATTRIBUTES> obj_attributes_ptr,\n    dword_t event_type, dword_t initial_state) {\n  // Check for an existing timer with the same name.\n  auto existing_object =\n      LookupNamedObject<XEvent>(kernel_state(), obj_attributes_ptr);\n  if (existing_object) {\n    if (existing_object->type() == XObject::Type::Event) {\n      if (handle_ptr) {\n        existing_object->RetainHandle();\n        *handle_ptr = existing_object->handle();\n      }\n      return X_STATUS_OBJECT_NAME_EXISTS;\n    } else {\n      return X_STATUS_INVALID_HANDLE;\n    }\n  }\n\n  auto ev = object_ref<XEvent>(new XEvent(kernel_state()));\n  ev->Initialize(!event_type, !!initial_state);\n\n  // obj_attributes may have a name inside of it, if != NULL.\n  if (obj_attributes_ptr) {\n    ev->SetAttributes(obj_attributes_ptr);\n  }\n\n  if (handle_ptr) {\n    *handle_ptr = ev->handle();\n  }\n  return X_STATUS_SUCCESS;\n}\nDECLARE_XBOXKRNL_EXPORT1(NtCreateEvent, kThreading, kImplemented);\n\nuint32_t xeNtSetEvent(uint32_t handle, xe::be<uint32_t>* previous_state_ptr) {\n  X_STATUS result = X_STATUS_SUCCESS;\n\n  auto ev = kernel_state()->object_table()->LookupObject<XEvent>(handle);\n  if (ev) {\n    int32_t was_signalled = ev->Set(0, false);\n    if (previous_state_ptr) {\n      *previous_state_ptr = static_cast<uint32_t>(was_signalled);\n    }\n  } else {\n    result = X_STATUS_INVALID_HANDLE;\n  }\n\n  return result;\n}\n\ndword_result_t NtSetEvent_entry(dword_t handle, lpdword_t previous_state_ptr) {\n  return xeNtSetEvent(handle, previous_state_ptr);\n}\nDECLARE_XBOXKRNL_EXPORT2(NtSetEvent, kThreading, kImplemented, kHighFrequency);\n\ndword_result_t NtPulseEvent_entry(dword_t handle,\n                                  lpdword_t previous_state_ptr) {\n  X_STATUS result = X_STATUS_SUCCESS;\n\n  auto ev = kernel_state()->object_table()->LookupObject<XEvent>(handle);\n  if (ev) {\n    int32_t was_signalled = ev->Pulse(0, false);\n    if (previous_state_ptr) {\n      *previous_state_ptr = static_cast<uint32_t>(was_signalled);\n    }\n  } else {\n    result = X_STATUS_INVALID_HANDLE;\n  }\n\n  return result;\n}\nDECLARE_XBOXKRNL_EXPORT2(NtPulseEvent, kThreading, kImplemented,\n                         kHighFrequency);\n\nuint32_t xeNtClearEvent(uint32_t handle) {\n  X_STATUS result = X_STATUS_SUCCESS;\n\n  auto ev = kernel_state()->object_table()->LookupObject<XEvent>(handle);\n  if (ev) {\n    ev->Reset();\n  } else {\n    result = X_STATUS_INVALID_HANDLE;\n  }\n\n  return result;\n}\n\ndword_result_t NtClearEvent_entry(dword_t handle) {\n  return xeNtClearEvent(handle);\n}\nDECLARE_XBOXKRNL_EXPORT2(NtClearEvent, kThreading, kImplemented,\n                         kHighFrequency);\n\n// https://msdn.microsoft.com/en-us/library/windows/hardware/ff552150(v=vs.85).aspx\nvoid KeInitializeSemaphore_entry(pointer_t<X_KSEMAPHORE> semaphore_ptr,\n                                 dword_t count, dword_t limit) {\n  semaphore_ptr->header.type = 5;  // SemaphoreObject\n  semaphore_ptr->header.signal_state = (uint32_t)count;\n  semaphore_ptr->limit = (uint32_t)limit;\n\n  auto sem = XObject::GetNativeObject<XSemaphore>(kernel_state(), semaphore_ptr,\n                                                  5 /* SemaphoreObject */);\n  if (!sem) {\n    assert_always();\n    return;\n  }\n}\nDECLARE_XBOXKRNL_EXPORT1(KeInitializeSemaphore, kThreading, kImplemented);\n\nuint32_t xeKeReleaseSemaphore(X_KSEMAPHORE* semaphore_ptr, uint32_t increment,\n                              uint32_t adjustment, uint32_t wait) {\n  auto sem =\n      XObject::GetNativeObject<XSemaphore>(kernel_state(), semaphore_ptr);\n  if (!sem) {\n    assert_always();\n    return 0;\n  }\n\n  // TODO(benvanik): increment thread priority?\n  // TODO(benvanik): wait?\n\n  return sem->ReleaseSemaphore(adjustment);\n}\n\ndword_result_t KeReleaseSemaphore_entry(pointer_t<X_KSEMAPHORE> semaphore_ptr,\n                                        dword_t increment, dword_t adjustment,\n                                        dword_t wait) {\n  return xeKeReleaseSemaphore(semaphore_ptr, increment, adjustment, wait);\n}\nDECLARE_XBOXKRNL_EXPORT1(KeReleaseSemaphore, kThreading, kImplemented);\n\ndword_result_t NtCreateSemaphore_entry(lpdword_t handle_ptr,\n                                       lpvoid_t obj_attributes_ptr,\n                                       dword_t count, dword_t limit) {\n  // Check for an existing semaphore with the same name.\n  auto existing_object =\n      LookupNamedObject<XSemaphore>(kernel_state(), obj_attributes_ptr);\n  if (existing_object) {\n    if (existing_object->type() == XObject::Type::Semaphore) {\n      if (handle_ptr) {\n        existing_object->RetainHandle();\n        *handle_ptr = existing_object->handle();\n      }\n      return X_STATUS_OBJECT_NAME_EXISTS;\n    } else {\n      return X_STATUS_INVALID_HANDLE;\n    }\n  }\n\n  auto sem = object_ref<XSemaphore>(new XSemaphore(kernel_state()));\n  if (!sem->Initialize((int32_t)count, (int32_t)limit)) {\n    if (handle_ptr) {\n      *handle_ptr = 0;\n    }\n    sem->ReleaseHandle();\n    return X_STATUS_INVALID_PARAMETER;\n  }\n\n  // obj_attributes may have a name inside of it, if != NULL.\n  if (obj_attributes_ptr) {\n    sem->SetAttributes(obj_attributes_ptr);\n  }\n\n  if (handle_ptr) {\n    *handle_ptr = sem->handle();\n  }\n\n  return X_STATUS_SUCCESS;\n}\nDECLARE_XBOXKRNL_EXPORT1(NtCreateSemaphore, kThreading, kImplemented);\n\ndword_result_t NtReleaseSemaphore_entry(dword_t sem_handle,\n                                        dword_t release_count,\n                                        lpdword_t previous_count_ptr) {\n  X_STATUS result = X_STATUS_SUCCESS;\n  int32_t previous_count = 0;\n\n  auto sem =\n      kernel_state()->object_table()->LookupObject<XSemaphore>(sem_handle);\n  if (sem) {\n    previous_count = sem->ReleaseSemaphore((int32_t)release_count);\n  } else {\n    result = X_STATUS_INVALID_HANDLE;\n  }\n  if (previous_count_ptr) {\n    *previous_count_ptr = (uint32_t)previous_count;\n  }\n\n  return result;\n}\nDECLARE_XBOXKRNL_EXPORT2(NtReleaseSemaphore, kThreading, kImplemented,\n                         kHighFrequency);\n\ndword_result_t NtCreateMutant_entry(\n    lpdword_t handle_out, pointer_t<X_OBJECT_ATTRIBUTES> obj_attributes,\n    dword_t initial_owner) {\n  // Check for an existing timer with the same name.\n  auto existing_object = LookupNamedObject<XMutant>(\n      kernel_state(), obj_attributes.guest_address());\n  if (existing_object) {\n    if (existing_object->type() == XObject::Type::Mutant) {\n      if (handle_out) {\n        existing_object->RetainHandle();\n        *handle_out = existing_object->handle();\n      }\n      return X_STATUS_OBJECT_NAME_EXISTS;\n    } else {\n      return X_STATUS_INVALID_HANDLE;\n    }\n  }\n\n  auto mutant = object_ref<XMutant>(new XMutant(kernel_state()));\n  mutant->Initialize(initial_owner ? true : false);\n\n  // obj_attributes may have a name inside of it, if != NULL.\n  if (obj_attributes) {\n    mutant->SetAttributes(obj_attributes);\n  }\n\n  if (handle_out) {\n    *handle_out = mutant->handle();\n  }\n\n  return X_STATUS_SUCCESS;\n}\nDECLARE_XBOXKRNL_EXPORT1(NtCreateMutant, kThreading, kImplemented);\n\ndword_result_t NtReleaseMutant_entry(dword_t mutant_handle, dword_t unknown) {\n  // This doesn't seem to be supported.\n  // int32_t previous_count_ptr = SHIM_GET_ARG_32(2);\n\n  // Whatever arg 1 is all games seem to set it to 0, so whether it's\n  // abandon or wait we just say false. Which is good, cause they are\n  // both ignored.\n  assert_zero(unknown);\n  uint32_t priority_increment = 0;\n  bool abandon = false;\n  bool wait = false;\n\n  X_STATUS result = X_STATUS_SUCCESS;\n\n  auto mutant =\n      kernel_state()->object_table()->LookupObject<XMutant>(mutant_handle);\n  if (mutant) {\n    result = mutant->ReleaseMutant(priority_increment, abandon, wait);\n  } else {\n    result = X_STATUS_INVALID_HANDLE;\n  }\n\n  return result;\n}\nDECLARE_XBOXKRNL_EXPORT1(NtReleaseMutant, kThreading, kImplemented);\n\ndword_result_t NtCreateTimer_entry(lpdword_t handle_ptr,\n                                   lpvoid_t obj_attributes_ptr,\n                                   dword_t timer_type) {\n  // timer_type = NotificationTimer (0) or SynchronizationTimer (1)\n\n  // Check for an existing timer with the same name.\n  auto existing_object =\n      LookupNamedObject<XTimer>(kernel_state(), obj_attributes_ptr);\n  if (existing_object) {\n    if (existing_object->type() == XObject::Type::Timer) {\n      if (handle_ptr) {\n        existing_object->RetainHandle();\n        *handle_ptr = existing_object->handle();\n      }\n      return X_STATUS_OBJECT_NAME_EXISTS;\n    } else {\n      return X_STATUS_INVALID_HANDLE;\n    }\n  }\n\n  auto timer = object_ref<XTimer>(new XTimer(kernel_state()));\n  timer->Initialize(timer_type);\n\n  // obj_attributes may have a name inside of it, if != NULL.\n  if (obj_attributes_ptr) {\n    timer->SetAttributes(obj_attributes_ptr);\n  }\n\n  if (handle_ptr) {\n    *handle_ptr = timer->handle();\n  }\n\n  return X_STATUS_SUCCESS;\n}\nDECLARE_XBOXKRNL_EXPORT1(NtCreateTimer, kThreading, kImplemented);\n\ndword_result_t NtSetTimerEx_entry(dword_t timer_handle, lpqword_t due_time_ptr,\n                                  lpvoid_t routine_ptr /*PTIMERAPCROUTINE*/,\n                                  dword_t unk_one, lpvoid_t routine_arg,\n                                  dword_t resume, dword_t period_ms,\n                                  dword_t unk_zero) {\n  assert_true(unk_one == 1);\n  assert_true(unk_zero == 0);\n\n  uint64_t due_time = *due_time_ptr;\n\n  X_STATUS result = X_STATUS_SUCCESS;\n\n  auto timer =\n      kernel_state()->object_table()->LookupObject<XTimer>(timer_handle);\n  if (timer) {\n    result =\n        timer->SetTimer(due_time, period_ms, routine_ptr.guest_address(),\n                        routine_arg.guest_address(), resume ? true : false);\n  } else {\n    result = X_STATUS_INVALID_HANDLE;\n  }\n\n  return result;\n}\nDECLARE_XBOXKRNL_EXPORT1(NtSetTimerEx, kThreading, kImplemented);\n\ndword_result_t NtCancelTimer_entry(dword_t timer_handle,\n                                   lpdword_t current_state_ptr) {\n  X_STATUS result = X_STATUS_SUCCESS;\n\n  auto timer =\n      kernel_state()->object_table()->LookupObject<XTimer>(timer_handle);\n  if (timer) {\n    result = timer->Cancel();\n  } else {\n    result = X_STATUS_INVALID_HANDLE;\n  }\n  if (current_state_ptr) {\n    *current_state_ptr = 0;\n  }\n\n  return result;\n}\nDECLARE_XBOXKRNL_EXPORT1(NtCancelTimer, kThreading, kImplemented);\n\nuint32_t xeKeWaitForSingleObject(void* object_ptr, uint32_t wait_reason,\n                                 uint32_t processor_mode, uint32_t alertable,\n                                 uint64_t* timeout_ptr) {\n  auto object = XObject::GetNativeObject<XObject>(kernel_state(), object_ptr);\n\n  if (!object) {\n    // The only kind-of failure code (though this should never happen)\n    assert_always();\n    return X_STATUS_ABANDONED_WAIT_0;\n  }\n\n  X_STATUS result =\n      object->Wait(wait_reason, processor_mode, alertable, timeout_ptr);\n\n  return result;\n}\n\ndword_result_t KeWaitForSingleObject_entry(lpvoid_t object_ptr,\n                                           dword_t wait_reason,\n                                           dword_t processor_mode,\n                                           dword_t alertable,\n                                           lpqword_t timeout_ptr) {\n  uint64_t timeout = timeout_ptr ? static_cast<uint64_t>(*timeout_ptr) : 0u;\n  return xeKeWaitForSingleObject(object_ptr, wait_reason, processor_mode,\n                                 alertable, timeout_ptr ? &timeout : nullptr);\n}\nDECLARE_XBOXKRNL_EXPORT3(KeWaitForSingleObject, kThreading, kImplemented,\n                         kBlocking, kHighFrequency);\n\ndword_result_t NtWaitForSingleObjectEx_entry(dword_t object_handle,\n                                             dword_t wait_mode,\n                                             dword_t alertable,\n                                             lpqword_t timeout_ptr) {\n  X_STATUS result = X_STATUS_SUCCESS;\n\n  auto object =\n      kernel_state()->object_table()->LookupObject<XObject>(object_handle);\n  if (object) {\n    uint64_t timeout = timeout_ptr ? static_cast<uint64_t>(*timeout_ptr) : 0u;\n    result =\n        object->Wait(3, wait_mode, alertable, timeout_ptr ? &timeout : nullptr);\n  } else {\n    result = X_STATUS_INVALID_HANDLE;\n  }\n\n  return result;\n}\nDECLARE_XBOXKRNL_EXPORT3(NtWaitForSingleObjectEx, kThreading, kImplemented,\n                         kBlocking, kHighFrequency);\n\ndword_result_t KeWaitForMultipleObjects_entry(\n    dword_t count, lpdword_t objects_ptr, dword_t wait_type,\n    dword_t wait_reason, dword_t processor_mode, dword_t alertable,\n    lpqword_t timeout_ptr, lpvoid_t wait_block_array_ptr) {\n  assert_true(wait_type <= 1);\n\n  std::vector<object_ref<XObject>> objects;\n  for (uint32_t n = 0; n < count; n++) {\n    auto object_ptr = kernel_memory()->TranslateVirtual(objects_ptr[n]);\n    auto object_ref =\n        XObject::GetNativeObject<XObject>(kernel_state(), object_ptr);\n    if (!object_ref) {\n      return X_STATUS_INVALID_PARAMETER;\n    }\n\n    objects.push_back(std::move(object_ref));\n  }\n\n  uint64_t timeout = timeout_ptr ? static_cast<uint64_t>(*timeout_ptr) : 0u;\n  return XObject::WaitMultiple(uint32_t(objects.size()),\n                               reinterpret_cast<XObject**>(objects.data()),\n                               wait_type, wait_reason, processor_mode,\n                               alertable, timeout_ptr ? &timeout : nullptr);\n}\nDECLARE_XBOXKRNL_EXPORT3(KeWaitForMultipleObjects, kThreading, kImplemented,\n                         kBlocking, kHighFrequency);\n\nuint32_t xeNtWaitForMultipleObjectsEx(uint32_t count, xe::be<uint32_t>* handles,\n                                      uint32_t wait_type, uint32_t wait_mode,\n                                      uint32_t alertable,\n                                      uint64_t* timeout_ptr) {\n  assert_true(wait_type <= 1);\n\n  std::vector<object_ref<XObject>> objects;\n  for (uint32_t n = 0; n < count; n++) {\n    uint32_t object_handle = handles[n];\n    auto object =\n        kernel_state()->object_table()->LookupObject<XObject>(object_handle);\n    if (!object) {\n      return X_STATUS_INVALID_PARAMETER;\n    }\n    objects.push_back(std::move(object));\n  }\n\n  return XObject::WaitMultiple(count,\n                               reinterpret_cast<XObject**>(objects.data()),\n                               wait_type, 6, wait_mode, alertable, timeout_ptr);\n}\n\ndword_result_t NtWaitForMultipleObjectsEx_entry(\n    dword_t count, lpdword_t handles, dword_t wait_type, dword_t wait_mode,\n    dword_t alertable, lpqword_t timeout_ptr) {\n  uint64_t timeout = timeout_ptr ? static_cast<uint64_t>(*timeout_ptr) : 0u;\n  return xeNtWaitForMultipleObjectsEx(count, handles, wait_type, wait_mode,\n                                      alertable,\n                                      timeout_ptr ? &timeout : nullptr);\n}\nDECLARE_XBOXKRNL_EXPORT3(NtWaitForMultipleObjectsEx, kThreading, kImplemented,\n                         kBlocking, kHighFrequency);\n\ndword_result_t NtSignalAndWaitForSingleObjectEx_entry(dword_t signal_handle,\n                                                      dword_t wait_handle,\n                                                      dword_t alertable,\n                                                      dword_t r6,\n                                                      lpqword_t timeout_ptr) {\n  X_STATUS result = X_STATUS_SUCCESS;\n\n  auto signal_object =\n      kernel_state()->object_table()->LookupObject<XObject>(signal_handle);\n  auto wait_object =\n      kernel_state()->object_table()->LookupObject<XObject>(wait_handle);\n  if (signal_object && wait_object) {\n    uint64_t timeout = timeout_ptr ? static_cast<uint64_t>(*timeout_ptr) : 0u;\n    result =\n        XObject::SignalAndWait(signal_object.get(), wait_object.get(), 3, 1,\n                               alertable, timeout_ptr ? &timeout : nullptr);\n  } else {\n    result = X_STATUS_INVALID_HANDLE;\n  }\n\n  return result;\n}\nDECLARE_XBOXKRNL_EXPORT3(NtSignalAndWaitForSingleObjectEx, kThreading,\n                         kImplemented, kBlocking, kHighFrequency);\n\nuint32_t xeKeKfAcquireSpinLock(uint32_t* lock) {\n  // XELOGD(\n  //     \"KfAcquireSpinLock({:08X})\",\n  //     lock_ptr);\n\n  // Lock.\n  while (!xe::atomic_cas(0, 1, lock)) {\n    // Spin!\n    // TODO(benvanik): error on deadlock?\n    xe::threading::MaybeYield();\n  }\n\n  // Raise IRQL to DISPATCH.\n  XThread* thread = XThread::GetCurrentThread();\n  auto old_irql = thread->RaiseIrql(2);\n\n  return old_irql;\n}\n\ndword_result_t KfAcquireSpinLock_entry(lpdword_t lock_ptr) {\n  auto lock = reinterpret_cast<uint32_t*>(lock_ptr.host_address());\n  return xeKeKfAcquireSpinLock(lock);\n}\nDECLARE_XBOXKRNL_EXPORT3(KfAcquireSpinLock, kThreading, kImplemented, kBlocking,\n                         kHighFrequency);\n\nvoid xeKeKfReleaseSpinLock(uint32_t* lock, dword_t old_irql) {\n  // Restore IRQL.\n  XThread* thread = XThread::GetCurrentThread();\n  thread->LowerIrql(old_irql);\n\n  // Unlock.\n  xe::atomic_dec(lock);\n}\n\nvoid KfReleaseSpinLock_entry(lpdword_t lock_ptr, dword_t old_irql) {\n  auto lock = reinterpret_cast<uint32_t*>(lock_ptr.host_address());\n  xeKeKfReleaseSpinLock(lock, old_irql);\n}\nDECLARE_XBOXKRNL_EXPORT2(KfReleaseSpinLock, kThreading, kImplemented,\n                         kHighFrequency);\n\nvoid KeAcquireSpinLockAtRaisedIrql_entry(lpdword_t lock_ptr) {\n  // Lock.\n  auto lock = reinterpret_cast<uint32_t*>(lock_ptr.host_address());\n  while (!xe::atomic_cas(0, 1, lock)) {\n    // Spin!\n    // TODO(benvanik): error on deadlock?\n  }\n}\nDECLARE_XBOXKRNL_EXPORT3(KeAcquireSpinLockAtRaisedIrql, kThreading,\n                         kImplemented, kBlocking, kHighFrequency);\n\ndword_result_t KeTryToAcquireSpinLockAtRaisedIrql_entry(lpdword_t lock_ptr) {\n  // Lock.\n  auto lock = reinterpret_cast<uint32_t*>(lock_ptr.host_address());\n  if (!xe::atomic_cas(0, 1, lock)) {\n    return 0;\n  }\n  return 1;\n}\nDECLARE_XBOXKRNL_EXPORT4(KeTryToAcquireSpinLockAtRaisedIrql, kThreading,\n                         kImplemented, kBlocking, kHighFrequency, kSketchy);\n\nvoid KeReleaseSpinLockFromRaisedIrql_entry(lpdword_t lock_ptr) {\n  // Unlock.\n  auto lock = reinterpret_cast<uint32_t*>(lock_ptr.host_address());\n  xe::atomic_dec(lock);\n}\nDECLARE_XBOXKRNL_EXPORT2(KeReleaseSpinLockFromRaisedIrql, kThreading,\n                         kImplemented, kHighFrequency);\n\nvoid KeEnterCriticalRegion_entry() {\n  XThread::GetCurrentThread()->EnterCriticalRegion();\n}\nDECLARE_XBOXKRNL_EXPORT2(KeEnterCriticalRegion, kThreading, kImplemented,\n                         kHighFrequency);\n\nvoid KeLeaveCriticalRegion_entry() {\n  XThread::GetCurrentThread()->LeaveCriticalRegion();\n}\nDECLARE_XBOXKRNL_EXPORT2(KeLeaveCriticalRegion, kThreading, kImplemented,\n                         kHighFrequency);\n\ndword_result_t KeRaiseIrqlToDpcLevel_entry() {\n  auto old_value = kernel_state()->processor()->RaiseIrql(cpu::Irql::DPC);\n  return (uint32_t)old_value;\n}\nDECLARE_XBOXKRNL_EXPORT2(KeRaiseIrqlToDpcLevel, kThreading, kImplemented,\n                         kHighFrequency);\n\nvoid KfLowerIrql_entry(dword_t old_value) {\n  kernel_state()->processor()->LowerIrql(\n      static_cast<cpu::Irql>((uint32_t)old_value));\n\n  XThread::GetCurrentThread()->CheckApcs();\n}\nDECLARE_XBOXKRNL_EXPORT2(KfLowerIrql, kThreading, kImplemented, kHighFrequency);\n\nvoid NtQueueApcThread_entry(dword_t thread_handle, lpvoid_t apc_routine,\n                            lpvoid_t apc_routine_context, lpvoid_t arg1,\n                            lpvoid_t arg2) {\n  auto thread =\n      kernel_state()->object_table()->LookupObject<XThread>(thread_handle);\n\n  if (!thread) {\n    XELOGE(\"NtQueueApcThread: Incorrect thread handle! Might cause crash\");\n    return;\n  }\n\n  if (!apc_routine) {\n    XELOGE(\"NtQueueApcThread: Incorrect apc routine! Might cause crash\");\n    return;\n  }\n\n  thread->EnqueueApc(apc_routine, apc_routine_context, arg1, arg2);\n}\nDECLARE_XBOXKRNL_EXPORT1(NtQueueApcThread, kThreading, kImplemented);\n\nvoid KeInitializeApc_entry(pointer_t<XAPC> apc, lpvoid_t thread_ptr,\n                           lpvoid_t kernel_routine, lpvoid_t rundown_routine,\n                           lpvoid_t normal_routine, dword_t processor_mode,\n                           lpvoid_t normal_context) {\n  apc->Initialize();\n  apc->processor_mode = processor_mode;\n  apc->thread_ptr = thread_ptr.guest_address();\n  apc->kernel_routine = kernel_routine.guest_address();\n  apc->rundown_routine = rundown_routine.guest_address();\n  apc->normal_routine = normal_routine.guest_address();\n  apc->normal_context =\n      normal_routine.guest_address() ? normal_context.guest_address() : 0;\n}\nDECLARE_XBOXKRNL_EXPORT1(KeInitializeApc, kThreading, kImplemented);\n\ndword_result_t KeInsertQueueApc_entry(pointer_t<XAPC> apc, lpvoid_t arg1,\n                                      lpvoid_t arg2,\n                                      dword_t priority_increment) {\n  auto thread = XObject::GetNativeObject<XThread>(\n      kernel_state(),\n      kernel_state()->memory()->TranslateVirtual(apc->thread_ptr));\n  if (!thread) {\n    return 0;\n  }\n\n  // Lock thread.\n  thread->LockApc();\n\n  // Fail if already inserted.\n  if (apc->enqueued) {\n    thread->UnlockApc(false);\n    return 0;\n  }\n\n  // Prep APC.\n  apc->arg1 = arg1.guest_address();\n  apc->arg2 = arg2.guest_address();\n  apc->enqueued = 1;\n\n  auto apc_list = thread->apc_list();\n\n  uint32_t list_entry_ptr = apc.guest_address() + 8;\n  apc_list->Insert(list_entry_ptr);\n\n  // Unlock thread.\n  thread->UnlockApc(true);\n\n  return 1;\n}\nDECLARE_XBOXKRNL_EXPORT1(KeInsertQueueApc, kThreading, kImplemented);\n\ndword_result_t KeRemoveQueueApc_entry(pointer_t<XAPC> apc) {\n  bool result = false;\n\n  auto thread = XObject::GetNativeObject<XThread>(\n      kernel_state(),\n      kernel_state()->memory()->TranslateVirtual(apc->thread_ptr));\n  if (!thread) {\n    return 0;\n  }\n\n  thread->LockApc();\n\n  if (!apc->enqueued) {\n    thread->UnlockApc(false);\n    return 0;\n  }\n\n  auto apc_list = thread->apc_list();\n  uint32_t list_entry_ptr = apc.guest_address() + 8;\n  if (apc_list->IsQueued(list_entry_ptr)) {\n    apc_list->Remove(list_entry_ptr);\n    result = true;\n  }\n\n  thread->UnlockApc(true);\n\n  return result ? 1 : 0;\n}\nDECLARE_XBOXKRNL_EXPORT1(KeRemoveQueueApc, kThreading, kImplemented);\n\ndword_result_t KiApcNormalRoutineNop_entry(dword_t unk0 /* output? */,\n                                           dword_t unk1 /* 0x13 */) {\n  return 0;\n}\nDECLARE_XBOXKRNL_EXPORT1(KiApcNormalRoutineNop, kThreading, kStub);\n\ntypedef struct {\n  xe::be<uint32_t> unknown;\n  xe::be<uint32_t> flink;\n  xe::be<uint32_t> blink;\n  xe::be<uint32_t> routine;\n  xe::be<uint32_t> context;\n  xe::be<uint32_t> arg1;\n  xe::be<uint32_t> arg2;\n} XDPC;\n\nvoid KeInitializeDpc_entry(pointer_t<XDPC> dpc, lpvoid_t routine,\n                           lpvoid_t context) {\n  // KDPC (maybe) 0x18 bytes?\n  uint32_t type = 19;  // DpcObject\n  uint32_t importance = 0;\n  uint32_t number = 0;  // ?\n  dpc->unknown = (type << 24) | (importance << 16) | (number);\n  dpc->flink = 0;\n  dpc->blink = 0;\n  dpc->routine = routine.guest_address();\n  dpc->context = context.guest_address();\n  dpc->arg1 = 0;\n  dpc->arg2 = 0;\n}\nDECLARE_XBOXKRNL_EXPORT2(KeInitializeDpc, kThreading, kImplemented, kSketchy);\n\ndword_result_t KeInsertQueueDpc_entry(pointer_t<XDPC> dpc, dword_t arg1,\n                                      dword_t arg2) {\n  assert_always(\"DPC does not dispatch yet; going to hang!\");\n\n  uint32_t list_entry_ptr = dpc.guest_address() + 4;\n\n  // Lock dispatcher.\n  auto global_lock = xe::global_critical_region::AcquireDirect();\n  auto dpc_list = kernel_state()->dpc_list();\n\n  // If already in a queue, abort.\n  if (dpc_list->IsQueued(list_entry_ptr)) {\n    return 0;\n  }\n\n  // Prep DPC.\n  dpc->arg1 = (uint32_t)arg1;\n  dpc->arg2 = (uint32_t)arg2;\n\n  dpc_list->Insert(list_entry_ptr);\n\n  return 1;\n}\nDECLARE_XBOXKRNL_EXPORT2(KeInsertQueueDpc, kThreading, kStub, kSketchy);\n\ndword_result_t KeRemoveQueueDpc_entry(pointer_t<XDPC> dpc) {\n  bool result = false;\n\n  uint32_t list_entry_ptr = dpc.guest_address() + 4;\n\n  auto global_lock = xe::global_critical_region::AcquireDirect();\n  auto dpc_list = kernel_state()->dpc_list();\n  if (dpc_list->IsQueued(list_entry_ptr)) {\n    dpc_list->Remove(list_entry_ptr);\n    result = true;\n  }\n\n  return result ? 1 : 0;\n}\nDECLARE_XBOXKRNL_EXPORT1(KeRemoveQueueDpc, kThreading, kImplemented);\n\n// https://github.com/Cxbx-Reloaded/Cxbx-Reloaded/blob/51e4dfcaacfdbd1a9692272931a436371492f72d/import/OpenXDK/include/xboxkrnl/xboxkrnl.h#L1372\nstruct X_ERWLOCK {\n  be<int32_t> lock_count;              // 0x0\n  be<uint32_t> writers_waiting_count;  // 0x4\n  be<uint32_t> readers_waiting_count;  // 0x8\n  be<uint32_t> readers_entry_count;    // 0xC\n  X_KEVENT writer_event;               // 0x10\n  X_KSEMAPHORE reader_semaphore;       // 0x20\n  uint32_t spin_lock;                  // 0x34\n};\nstatic_assert_size(X_ERWLOCK, 0x38);\n\nvoid ExInitializeReadWriteLock_entry(pointer_t<X_ERWLOCK> lock_ptr) {\n  lock_ptr->lock_count = -1;\n  lock_ptr->writers_waiting_count = 0;\n  lock_ptr->readers_waiting_count = 0;\n  lock_ptr->readers_entry_count = 0;\n  KeInitializeEvent_entry(&lock_ptr->writer_event, 1, 0);\n  KeInitializeSemaphore_entry(&lock_ptr->reader_semaphore, 0, 0x7FFFFFFF);\n  lock_ptr->spin_lock = 0;\n}\nDECLARE_XBOXKRNL_EXPORT1(ExInitializeReadWriteLock, kThreading, kImplemented);\n\nvoid ExAcquireReadWriteLockExclusive_entry(pointer_t<X_ERWLOCK> lock_ptr) {\n  auto old_irql = xeKeKfAcquireSpinLock(&lock_ptr->spin_lock);\n\n  int32_t lock_count = ++lock_ptr->lock_count;\n  if (!lock_count) {\n    xeKeKfReleaseSpinLock(&lock_ptr->spin_lock, old_irql);\n    return;\n  }\n\n  lock_ptr->writers_waiting_count++;\n\n  xeKeKfReleaseSpinLock(&lock_ptr->spin_lock, old_irql);\n  xeKeWaitForSingleObject(&lock_ptr->writer_event, 7, 0, 0, nullptr);\n}\nDECLARE_XBOXKRNL_EXPORT2(ExAcquireReadWriteLockExclusive, kThreading,\n                         kImplemented, kBlocking);\n\ndword_result_t ExTryToAcquireReadWriteLockExclusive_entry(\n    pointer_t<X_ERWLOCK> lock_ptr) {\n  auto old_irql = xeKeKfAcquireSpinLock(&lock_ptr->spin_lock);\n\n  uint32_t result;\n  if (lock_ptr->lock_count < 0) {\n    lock_ptr->lock_count = 0;\n    result = 1;\n  } else {\n    result = 0;\n  }\n\n  xeKeKfReleaseSpinLock(&lock_ptr->spin_lock, old_irql);\n  return result;\n}\nDECLARE_XBOXKRNL_EXPORT1(ExTryToAcquireReadWriteLockExclusive, kThreading,\n                         kImplemented);\n\nvoid ExAcquireReadWriteLockShared_entry(pointer_t<X_ERWLOCK> lock_ptr) {\n  auto old_irql = xeKeKfAcquireSpinLock(&lock_ptr->spin_lock);\n\n  int32_t lock_count = ++lock_ptr->lock_count;\n  if (!lock_count ||\n      (lock_ptr->readers_entry_count && !lock_ptr->writers_waiting_count)) {\n    lock_ptr->readers_entry_count++;\n    xeKeKfReleaseSpinLock(&lock_ptr->spin_lock, old_irql);\n    return;\n  }\n\n  lock_ptr->readers_waiting_count++;\n\n  xeKeKfReleaseSpinLock(&lock_ptr->spin_lock, old_irql);\n  xeKeWaitForSingleObject(&lock_ptr->reader_semaphore, 7, 0, 0, nullptr);\n}\nDECLARE_XBOXKRNL_EXPORT2(ExAcquireReadWriteLockShared, kThreading, kImplemented,\n                         kBlocking);\n\ndword_result_t ExTryToAcquireReadWriteLockShared_entry(\n    pointer_t<X_ERWLOCK> lock_ptr) {\n  auto old_irql = xeKeKfAcquireSpinLock(&lock_ptr->spin_lock);\n\n  uint32_t result;\n  if (lock_ptr->lock_count < 0 ||\n      (lock_ptr->readers_entry_count && !lock_ptr->writers_waiting_count)) {\n    lock_ptr->lock_count++;\n    lock_ptr->readers_entry_count++;\n    result = 1;\n  } else {\n    result = 0;\n  }\n\n  xeKeKfReleaseSpinLock(&lock_ptr->spin_lock, old_irql);\n  return result;\n}\nDECLARE_XBOXKRNL_EXPORT1(ExTryToAcquireReadWriteLockShared, kThreading,\n                         kImplemented);\n\nvoid ExReleaseReadWriteLock_entry(pointer_t<X_ERWLOCK> lock_ptr) {\n  auto old_irql = xeKeKfAcquireSpinLock(&lock_ptr->spin_lock);\n\n  int32_t lock_count = --lock_ptr->lock_count;\n\n  if (lock_count < 0) {\n    lock_ptr->readers_entry_count = 0;\n    xeKeKfReleaseSpinLock(&lock_ptr->spin_lock, old_irql);\n    return;\n  }\n\n  if (!lock_ptr->readers_entry_count) {\n    auto readers_waiting_count = lock_ptr->readers_waiting_count;\n    if (readers_waiting_count) {\n      lock_ptr->readers_waiting_count = 0;\n      lock_ptr->readers_entry_count = readers_waiting_count;\n      xeKeKfReleaseSpinLock(&lock_ptr->spin_lock, old_irql);\n      xeKeReleaseSemaphore(&lock_ptr->reader_semaphore, 1,\n                           readers_waiting_count, 0);\n      return;\n    }\n  }\n\n  auto readers_entry_count = --lock_ptr->readers_entry_count;\n  if (readers_entry_count) {\n    xeKeKfReleaseSpinLock(&lock_ptr->spin_lock, old_irql);\n    return;\n  }\n\n  lock_ptr->writers_waiting_count--;\n  xeKeKfReleaseSpinLock(&lock_ptr->spin_lock, old_irql);\n  xeKeSetEvent(&lock_ptr->writer_event, 1, 0);\n}\nDECLARE_XBOXKRNL_EXPORT1(ExReleaseReadWriteLock, kThreading, kImplemented);\n\n// NOTE: This function is very commonly inlined, and probably won't be called!\npointer_result_t InterlockedPushEntrySList_entry(\n    pointer_t<X_SLIST_HEADER> plist_ptr, pointer_t<X_SINGLE_LIST_ENTRY> entry) {\n  assert_not_null(plist_ptr);\n  assert_not_null(entry);\n\n  alignas(8) X_SLIST_HEADER old_hdr = *plist_ptr;\n  alignas(8) X_SLIST_HEADER new_hdr = {0};\n  uint32_t old_head = 0;\n  do {\n    old_hdr = *plist_ptr;\n    new_hdr.depth = old_hdr.depth + 1;\n    new_hdr.sequence = old_hdr.sequence + 1;\n\n    old_head = old_hdr.next.next;\n    entry->next = old_hdr.next.next;\n    new_hdr.next.next = entry.guest_address();\n  } while (\n      !xe::atomic_cas(*(uint64_t*)(&old_hdr), *(uint64_t*)(&new_hdr),\n                      reinterpret_cast<uint64_t*>(plist_ptr.host_address())));\n\n  return old_head;\n}\nDECLARE_XBOXKRNL_EXPORT2(InterlockedPushEntrySList, kThreading, kImplemented,\n                         kHighFrequency);\n\npointer_result_t InterlockedPopEntrySList_entry(\n    pointer_t<X_SLIST_HEADER> plist_ptr) {\n  assert_not_null(plist_ptr);\n\n  uint32_t popped = 0;\n  alignas(8) X_SLIST_HEADER old_hdr = {0};\n  alignas(8) X_SLIST_HEADER new_hdr = {0};\n  do {\n    old_hdr = *plist_ptr;\n    auto next = kernel_memory()->TranslateVirtual<X_SINGLE_LIST_ENTRY*>(\n        old_hdr.next.next);\n    if (!old_hdr.next.next) {\n      return 0;\n    }\n    popped = old_hdr.next.next;\n\n    new_hdr.depth = old_hdr.depth - 1;\n    new_hdr.next.next = next->next;\n    new_hdr.sequence = old_hdr.sequence;\n  } while (\n      !xe::atomic_cas(*(uint64_t*)(&old_hdr), *(uint64_t*)(&new_hdr),\n                      reinterpret_cast<uint64_t*>(plist_ptr.host_address())));\n\n  return popped;\n}\nDECLARE_XBOXKRNL_EXPORT2(InterlockedPopEntrySList, kThreading, kImplemented,\n                         kHighFrequency);\n\npointer_result_t InterlockedFlushSList_entry(\n    pointer_t<X_SLIST_HEADER> plist_ptr) {\n  assert_not_null(plist_ptr);\n\n  alignas(8) X_SLIST_HEADER old_hdr = *plist_ptr;\n  alignas(8) X_SLIST_HEADER new_hdr = {0};\n  uint32_t first = 0;\n  do {\n    old_hdr = *plist_ptr;\n    first = old_hdr.next.next;\n    new_hdr.next.next = 0;\n    new_hdr.depth = 0;\n    new_hdr.sequence = 0;\n  } while (\n      !xe::atomic_cas(*(uint64_t*)(&old_hdr), *(uint64_t*)(&new_hdr),\n                      reinterpret_cast<uint64_t*>(plist_ptr.host_address())));\n\n  return first;\n}\nDECLARE_XBOXKRNL_EXPORT1(InterlockedFlushSList, kThreading, kImplemented);\n\n}  // namespace xboxkrnl\n}  // namespace kernel\n}  // namespace xe\n\nDECLARE_XBOXKRNL_EMPTY_REGISTER_EXPORTS(Threading);\n"
  },
  {
    "path": "src/xenia/kernel/xboxkrnl/xboxkrnl_threading.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2015 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_KERNEL_XBOXKRNL_XBOXKRNL_THREADING_H_\n#define XENIA_KERNEL_XBOXKRNL_XBOXKRNL_THREADING_H_\n\n#include \"xenia/kernel/util/shim_utils.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace kernel {\nstruct X_KEVENT;\n\nnamespace xboxkrnl {\n\nuint32_t xeNtSetEvent(uint32_t handle, xe::be<uint32_t>* previous_state_ptr);\nuint32_t xeNtClearEvent(uint32_t handle);\n\nuint32_t xeNtWaitForMultipleObjectsEx(uint32_t count, xe::be<uint32_t>* handles,\n                                      uint32_t wait_type, uint32_t wait_mode,\n                                      uint32_t alertable,\n                                      uint64_t* timeout_ptr);\n\nuint32_t xeKeWaitForSingleObject(void* object_ptr, uint32_t wait_reason,\n                                 uint32_t processor_mode, uint32_t alertable,\n                                 uint64_t* timeout_ptr);\nuint32_t xeKeSetEvent(X_KEVENT* event_ptr, uint32_t increment, uint32_t wait);\n\n}  // namespace xboxkrnl\n}  // namespace kernel\n}  // namespace xe\n\n#endif  // XENIA_KERNEL_XBOXKRNL_XBOXKRNL_THREADING_H_\n"
  },
  {
    "path": "src/xenia/kernel/xboxkrnl/xboxkrnl_usbcam.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/logging.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/util/shim_utils.h\"\n#include \"xenia/kernel/xboxkrnl/xboxkrnl_private.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xboxkrnl {\n\ndword_result_t XUsbcamCreate_entry(dword_t buffer,\n                                   dword_t buffer_size,  // 0x4B000 640x480?\n                                   lpunknown_t unk3_ptr) {\n  // This function should return success.\n  // It looks like it only allocates space for usbcam support.\n  // returning error code might cause games to initialize incorrectly.\n  // \"Carcassonne\" initalization function checks for result from this\n  // function. If value is different than 0 instead of loading\n  // rest of the game it returns from initalization function and tries\n  // to run game normally which causes crash, due to uninitialized data.\n  return X_STATUS_SUCCESS;\n}\nDECLARE_XBOXKRNL_EXPORT1(XUsbcamCreate, kNone, kStub);\n\ndword_result_t XUsbcamGetState_entry() {\n  // 0 = not connected.\n  return 0;\n}\nDECLARE_XBOXKRNL_EXPORT1(XUsbcamGetState, kNone, kStub);\n\n}  // namespace xboxkrnl\n}  // namespace kernel\n}  // namespace xe\n\nDECLARE_XBOXKRNL_EMPTY_REGISTER_EXPORTS(Usbcam);\n"
  },
  {
    "path": "src/xenia/kernel/xboxkrnl/xboxkrnl_video.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/kernel/xboxkrnl/xboxkrnl_video.h\"\n\n#include \"xenia/base/logging.h\"\n#include \"xenia/emulator.h\"\n#include \"xenia/gpu/graphics_system.h\"\n#include \"xenia/gpu/texture_info.h\"\n#include \"xenia/gpu/xenos.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/util/shim_utils.h\"\n#include \"xenia/kernel/xboxkrnl/xboxkrnl_private.h\"\n#include \"xenia/kernel/xboxkrnl/xboxkrnl_rtl.h\"\n#include \"xenia/xbox.h\"\n\n// BT.709 on modern monitors and TVs looks the closest to the Xbox 360 connected\n// to an HDTV.\nDEFINE_uint32(kernel_display_gamma_type, 2,\n              \"Display gamma type: 0 - linear, 1 - sRGB (CRT), 2 - BT.709 \"\n              \"(HDTV), 3 - power specified via kernel_display_gamma_power.\",\n              \"Kernel\");\nUPDATE_from_uint32(kernel_display_gamma_type, 2020, 12, 31, 13, 1);\nDEFINE_double(kernel_display_gamma_power, 2.22222233,\n              \"Display gamma to use with kernel_display_gamma_type 3.\",\n              \"Kernel\");\n\nnamespace xe {\nnamespace kernel {\nnamespace xboxkrnl {\n\n// https://web.archive.org/web/20150805074003/https://www.tweakoz.com/orkid/\n// http://www.tweakoz.com/orkid/dox/d3/d52/xb360init_8cpp_source.html\n// https://github.com/Free60Project/xenosfb/\n// https://github.com/Free60Project/xenosfb/blob/master/src/xe.h\n// https://github.com/gligli/libxemit\n// https://web.archive.org/web/20090428095215/https://msdn.microsoft.com/en-us/library/bb313877.aspx\n// https://web.archive.org/web/20100423054747/https://msdn.microsoft.com/en-us/library/bb313961.aspx\n// https://web.archive.org/web/20100423054747/https://msdn.microsoft.com/en-us/library/bb313878.aspx\n// https://web.archive.org/web/20090510235238/https://msdn.microsoft.com/en-us/library/bb313942.aspx\n// https://svn.dd-wrt.com/browser/src/linux/universal/linux-3.8/drivers/gpu/drm/radeon/radeon_ring.c?rev=21595\n// https://www.microsoft.com/en-za/download/details.aspx?id=5313 -- \"Stripped\n// Down Direct3D: Xbox 360 Command Buffer and Resource Management\"\n\nvoid VdGetCurrentDisplayGamma_entry(lpdword_t type_ptr, lpfloat_t power_ptr) {\n  // 1 - sRGB.\n  // 2 - TV (BT.709).\n  // 3 - use the power written to *power_ptr.\n  // Anything else - linear.\n  // Used in D3D SetGammaRamp/SetPWLGamma to adjust the ramp for the display.\n  *type_ptr = cvars::kernel_display_gamma_type;\n  *power_ptr = float(cvars::kernel_display_gamma_power);\n}\nDECLARE_XBOXKRNL_EXPORT1(VdGetCurrentDisplayGamma, kVideo, kStub);\n\nstruct X_D3DPRIVATE_RECT {\n  xe::be<uint32_t> x1;  // 0x0\n  xe::be<uint32_t> y1;  // 0x4\n  xe::be<uint32_t> x2;  // 0x8\n  xe::be<uint32_t> y2;  // 0xC\n};\nstatic_assert_size(X_D3DPRIVATE_RECT, 0x10);\n\nstruct X_D3DFILTER_PARAMETERS {\n  xe::be<float> nyquist;         // 0x0\n  xe::be<float> flicker_filter;  // 0x4\n  xe::be<float> beta;            // 0x8\n};\nstatic_assert_size(X_D3DFILTER_PARAMETERS, 0xC);\n\nstruct X_D3DPRIVATE_SCALER_PARAMETERS {\n  X_D3DPRIVATE_RECT scaler_source_rect;                 // 0x0\n  xe::be<uint32_t> scaled_output_width;                 // 0x10\n  xe::be<uint32_t> scaled_output_height;                // 0x14\n  xe::be<uint32_t> vertical_filter_type;                // 0x18\n  X_D3DFILTER_PARAMETERS vertical_filter_parameters;    // 0x1C\n  xe::be<uint32_t> horizontal_filter_type;              // 0x28\n  X_D3DFILTER_PARAMETERS horizontal_filter_parameters;  // 0x2C\n};\nstatic_assert_size(X_D3DPRIVATE_SCALER_PARAMETERS, 0x38);\n\nstruct X_DISPLAY_INFO {\n  xe::be<uint16_t> front_buffer_width;               // 0x0\n  xe::be<uint16_t> front_buffer_height;              // 0x2\n  uint8_t front_buffer_color_format;                 // 0x4\n  uint8_t front_buffer_pixel_format;                 // 0x5\n  X_D3DPRIVATE_SCALER_PARAMETERS scaler_parameters;  // 0x8\n  xe::be<uint16_t> display_window_overscan_left;     // 0x40\n  xe::be<uint16_t> display_window_overscan_top;      // 0x42\n  xe::be<uint16_t> display_window_overscan_right;    // 0x44\n  xe::be<uint16_t> display_window_overscan_bottom;   // 0x46\n  xe::be<uint16_t> display_width;                    // 0x48\n  xe::be<uint16_t> display_height;                   // 0x4A\n  xe::be<float> display_refresh_rate;                // 0x4C\n  xe::be<uint32_t> display_interlaced;               // 0x50\n  uint8_t display_color_format;                      // 0x54\n  xe::be<uint16_t> actual_display_width;             // 0x56\n};\nstatic_assert_size(X_DISPLAY_INFO, 0x58);\n\nvoid VdGetCurrentDisplayInformation_entry(\n    pointer_t<X_DISPLAY_INFO> display_info) {\n  X_VIDEO_MODE mode;\n  VdQueryVideoMode(&mode);\n\n  display_info.Zero();\n  display_info->front_buffer_width = (uint16_t)mode.display_width;\n  display_info->front_buffer_height = (uint16_t)mode.display_height;\n\n  display_info->scaler_parameters.scaler_source_rect.x2 = mode.display_width;\n  display_info->scaler_parameters.scaler_source_rect.y2 = mode.display_height;\n  display_info->scaler_parameters.scaled_output_width = mode.display_width;\n  display_info->scaler_parameters.scaled_output_height = mode.display_height;\n  display_info->scaler_parameters.horizontal_filter_type = 1;\n  display_info->scaler_parameters.vertical_filter_type = 1;\n\n  display_info->display_window_overscan_left = 320;\n  display_info->display_window_overscan_top = 180;\n  display_info->display_window_overscan_right = 320;\n  display_info->display_window_overscan_bottom = 180;\n  display_info->display_width = (uint16_t)mode.display_width;\n  display_info->display_height = (uint16_t)mode.display_height;\n  display_info->display_refresh_rate = mode.refresh_rate;\n  display_info->actual_display_width = (uint16_t)mode.display_width;\n}\nDECLARE_XBOXKRNL_EXPORT1(VdGetCurrentDisplayInformation, kVideo, kStub);\n\nvoid VdQueryVideoMode(X_VIDEO_MODE* video_mode) {\n  // TODO(benvanik): get info from actual display.\n  std::memset(video_mode, 0, sizeof(X_VIDEO_MODE));\n  video_mode->display_width = 1280;\n  video_mode->display_height = 720;\n  video_mode->is_interlaced = 0;\n  video_mode->is_widescreen = 1;\n  video_mode->is_hi_def = 1;\n  video_mode->refresh_rate = 60.0f;\n  video_mode->video_standard = 1;  // NTSC\n  video_mode->unknown_0x8a = 0x4A;\n  video_mode->unknown_0x01 = 0x01;\n}\n\nvoid VdQueryVideoMode_entry(pointer_t<X_VIDEO_MODE> video_mode) {\n  VdQueryVideoMode(video_mode);\n}\nDECLARE_XBOXKRNL_EXPORT1(VdQueryVideoMode, kVideo, kStub);\n\ndword_result_t VdQueryVideoFlags_entry() {\n  X_VIDEO_MODE mode;\n  VdQueryVideoMode(&mode);\n\n  uint32_t flags = 0;\n  flags |= mode.is_widescreen ? 1 : 0;\n  flags |= mode.display_width >= 1024 ? 2 : 0;\n  flags |= mode.display_width >= 1920 ? 4 : 0;\n\n  return flags;\n}\nDECLARE_XBOXKRNL_EXPORT1(VdQueryVideoFlags, kVideo, kStub);\n\ndword_result_t VdSetDisplayMode_entry(dword_t flags) {\n  // Often 0x40000000.\n\n  // 0?ccf000 00000000 00000000 000000r0\n\n  // r: 0x00000002 |     1\n  // f: 0x08000000 |    27\n  // c: 0x30000000 | 28-29\n  // ?: 0x40000000 |    30\n\n  // r: 1 = Resolution is 720x480 or 720x576\n  // f: 1 = Texture format is k_2_10_10_10 or k_2_10_10_10_AS_16_16_16_16\n  // c: Color space (0 = RGB, 1 = ?, 2 = ?)\n  // ?: (always set?)\n\n  return 0;\n}\nDECLARE_XBOXKRNL_EXPORT1(VdSetDisplayMode, kVideo, kStub);\n\ndword_result_t VdSetDisplayModeOverride_entry(unknown_t unk0, unknown_t unk1,\n                                              double_t refresh_rate,\n                                              unknown_t unk3, unknown_t unk4) {\n  // refresh_rate = 0, 50, 59.9, etc.\n  return 0;\n}\nDECLARE_XBOXKRNL_EXPORT1(VdSetDisplayModeOverride, kVideo, kStub);\n\ndword_result_t VdInitializeEngines_entry(unknown_t unk0, function_t callback,\n                                         lpvoid_t arg, lpdword_t pfp_ptr,\n                                         lpdword_t me_ptr) {\n  // r3 = 0x4F810000\n  // r4 = function ptr (cleanup callback?)\n  // r5 = function arg\n  // r6 = PFP Microcode\n  // r7 = ME Microcode\n  return 1;\n}\nDECLARE_XBOXKRNL_EXPORT1(VdInitializeEngines, kVideo, kStub);\n\nvoid VdShutdownEngines_entry() {\n  // Ignored for now.\n  // Games seem to call an Initialize/Shutdown pair to query info, then\n  // re-initialize.\n}\nDECLARE_XBOXKRNL_EXPORT1(VdShutdownEngines, kVideo, kStub);\n\ndword_result_t VdGetGraphicsAsicID_entry() {\n  // Games compare for < 0x10 and do VdInitializeEDRAM, else other\n  // (retrain/etc).\n  return 0x11;\n}\nDECLARE_XBOXKRNL_EXPORT1(VdGetGraphicsAsicID, kVideo, kStub);\n\ndword_result_t VdEnableDisableClockGating_entry(dword_t enabled) {\n  // Ignored, as it really doesn't matter.\n  return 0;\n}\nDECLARE_XBOXKRNL_EXPORT1(VdEnableDisableClockGating, kVideo, kStub);\n\nvoid VdSetGraphicsInterruptCallback_entry(function_t callback,\n                                          lpvoid_t user_data) {\n  // callback takes 2 params\n  // r3 = bool 0/1 - 0 is normal interrupt, 1 is some acquire/lock mumble\n  // r4 = user_data (r4 of VdSetGraphicsInterruptCallback)\n  auto graphics_system = kernel_state()->emulator()->graphics_system();\n  graphics_system->SetInterruptCallback(callback, user_data);\n}\nDECLARE_XBOXKRNL_EXPORT1(VdSetGraphicsInterruptCallback, kVideo, kImplemented);\n\nvoid VdInitializeRingBuffer_entry(lpvoid_t ptr, int_t size_log2) {\n  // r3 = result of MmGetPhysicalAddress\n  // r4 = log2(size)\n  // Buffer pointers are from MmAllocatePhysicalMemory with WRITE_COMBINE.\n  auto graphics_system = kernel_state()->emulator()->graphics_system();\n  graphics_system->InitializeRingBuffer(ptr, size_log2);\n}\nDECLARE_XBOXKRNL_EXPORT1(VdInitializeRingBuffer, kVideo, kImplemented);\n\nvoid VdEnableRingBufferRPtrWriteBack_entry(lpvoid_t ptr,\n                                           int_t block_size_log2) {\n  // r4 = log2(block size), 6, usually --- <=19\n  auto graphics_system = kernel_state()->emulator()->graphics_system();\n  graphics_system->EnableReadPointerWriteBack(ptr, block_size_log2);\n}\nDECLARE_XBOXKRNL_EXPORT1(VdEnableRingBufferRPtrWriteBack, kVideo, kImplemented);\n\nvoid VdGetSystemCommandBuffer_entry(lpunknown_t p0_ptr, lpunknown_t p1_ptr) {\n  p0_ptr.Zero(0x94);\n  xe::store_and_swap<uint32_t>(p0_ptr, 0xBEEF0000);\n  xe::store_and_swap<uint32_t>(p1_ptr, 0xBEEF0001);\n}\nDECLARE_XBOXKRNL_EXPORT1(VdGetSystemCommandBuffer, kVideo, kStub);\n\nvoid VdSetSystemCommandBufferGpuIdentifierAddress_entry(lpunknown_t unk) {\n  // r3 = 0x2B10(d3d?) + 8\n}\nDECLARE_XBOXKRNL_EXPORT1(VdSetSystemCommandBufferGpuIdentifierAddress, kVideo,\n                         kStub);\n\n// VdVerifyMEInitCommand\n// r3\n// r4 = 19\n// no op?\n\ndword_result_t VdInitializeScalerCommandBuffer_entry(\n    dword_t scaler_source_xy,      // ((uint16_t)y << 16) | (uint16_t)x\n    dword_t scaler_source_wh,      // ((uint16_t)h << 16) | (uint16_t)w\n    dword_t scaled_output_xy,      // ((uint16_t)y << 16) | (uint16_t)x\n    dword_t scaled_output_wh,      // ((uint16_t)h << 16) | (uint16_t)w\n    dword_t front_buffer_wh,       // ((uint16_t)h << 16) | (uint16_t)w\n    dword_t vertical_filter_type,  // 7?\n    pointer_t<X_D3DFILTER_PARAMETERS> vertical_filter_params,    //\n    dword_t horizontal_filter_type,                              // 7?\n    pointer_t<X_D3DFILTER_PARAMETERS> horizontal_filter_params,  //\n    lpvoid_t unk9,                                               //\n    lpvoid_t dest_ptr,  // Points to the first 80000000h where the memcpy\n                        // sources from.\n    dword_t dest_count  // Count in words.\n) {\n  // We could fake the commands here, but I'm not sure the game checks for\n  // anything but success (non-zero ret).\n  // For now, we just fill it with NOPs.\n  auto dest = dest_ptr.as_array<uint32_t>();\n  for (size_t i = 0; i < dest_count; ++i) {\n    dest[i] = 0x80000000;\n  }\n  return (uint32_t)dest_count;\n}\nDECLARE_XBOXKRNL_EXPORT2(VdInitializeScalerCommandBuffer, kVideo, kImplemented,\n                         kSketchy);\n\nstruct BufferScaling {\n  xe::be<uint16_t> fb_width;\n  xe::be<uint16_t> fb_height;\n  xe::be<uint16_t> bb_width;\n  xe::be<uint16_t> bb_height;\n};\nvoid AppendParam(StringBuffer* string_buffer, pointer_t<BufferScaling> param) {\n  string_buffer->AppendFormat(\n      \"{:08X}(scale {}x{} -> {}x{}))\", param.guest_address(),\n      uint16_t(param->bb_width), uint16_t(param->bb_height),\n      uint16_t(param->fb_width), uint16_t(param->fb_height));\n}\n\ndword_result_t VdCallGraphicsNotificationRoutines_entry(\n    unknown_t unk0, pointer_t<BufferScaling> args_ptr) {\n  assert_true(unk0 == 1);\n\n  // TODO(benvanik): what does this mean, I forget:\n  // callbacks get 0, r3, r4\n  return 0;\n}\nDECLARE_XBOXKRNL_EXPORT2(VdCallGraphicsNotificationRoutines, kVideo,\n                         kImplemented, kSketchy);\n\ndword_result_t VdIsHSIOTrainingSucceeded_entry() {\n  // BOOL return value\n  return 1;\n}\nDECLARE_XBOXKRNL_EXPORT1(VdIsHSIOTrainingSucceeded, kVideo, kStub);\n\ndword_result_t VdPersistDisplay_entry(unknown_t unk0, lpdword_t unk1_ptr) {\n  // unk1_ptr needs to be populated with a pointer passed to\n  // MmFreePhysicalMemory(1, *unk1_ptr).\n  if (unk1_ptr) {\n    auto heap = kernel_memory()->LookupHeapByType(true, 16 * 1024);\n    uint32_t unk1_value;\n    heap->Alloc(64, 32, kMemoryAllocationReserve | kMemoryAllocationCommit,\n                kMemoryProtectNoAccess, false, &unk1_value);\n    *unk1_ptr = unk1_value;\n  }\n\n  return 1;\n}\nDECLARE_XBOXKRNL_EXPORT2(VdPersistDisplay, kVideo, kImplemented, kSketchy);\n\ndword_result_t VdRetrainEDRAMWorker_entry(unknown_t unk0) { return 0; }\nDECLARE_XBOXKRNL_EXPORT1(VdRetrainEDRAMWorker, kVideo, kStub);\n\ndword_result_t VdRetrainEDRAM_entry(unknown_t unk0, unknown_t unk1,\n                                    unknown_t unk2, unknown_t unk3,\n                                    unknown_t unk4, unknown_t unk5) {\n  return 0;\n}\nDECLARE_XBOXKRNL_EXPORT1(VdRetrainEDRAM, kVideo, kStub);\n\nvoid VdSwap_entry(\n    lpvoid_t buffer_ptr,        // ptr into primary ringbuffer\n    lpvoid_t fetch_ptr,         // frontbuffer Direct3D 9 texture header fetch\n    lpunknown_t unk2,           // system writeback ptr\n    lpunknown_t unk3,           // buffer from VdGetSystemCommandBuffer\n    lpunknown_t unk4,           // from VdGetSystemCommandBuffer (0xBEEF0001)\n    lpdword_t frontbuffer_ptr,  // ptr to frontbuffer address\n    lpdword_t texture_format_ptr, lpdword_t color_space_ptr, lpdword_t width,\n    lpdword_t height) {\n  // All of these parameters are REQUIRED.\n  assert(buffer_ptr);\n  assert(fetch_ptr);\n  assert(frontbuffer_ptr);\n  assert(texture_format_ptr);\n  assert(width);\n  assert(height);\n\n  namespace xenos = xe::gpu::xenos;\n\n  xenos::xe_gpu_texture_fetch_t gpu_fetch;\n  xe::copy_and_swap_32_unaligned(\n      &gpu_fetch, reinterpret_cast<uint32_t*>(fetch_ptr.host_address()), 6);\n\n  // The fetch constant passed is not a true GPU fetch constant, but rather, the\n  // fetch constant stored in the Direct3D 9 texture header, which contains the\n  // address in one of the virtual mappings of the physical memory rather than\n  // the physical address itself. We're emulating swapping in the GPU subsystem,\n  // which works with GPU memory addresses (physical addresses directly) from\n  // proper fetch constants like ones used to bind textures to shaders, not CPU\n  // MMU addresses, so translation from virtual to physical is needed.\n  uint32_t frontbuffer_virtual_address = gpu_fetch.base_address << 12;\n  assert_true(*frontbuffer_ptr == frontbuffer_virtual_address);\n  uint32_t frontbuffer_physical_address =\n      kernel_memory()->GetPhysicalAddress(frontbuffer_virtual_address);\n  assert_true(frontbuffer_physical_address != UINT32_MAX);\n  if (frontbuffer_physical_address == UINT32_MAX) {\n    // Xenia-specific safety check.\n    XELOGE(\"VdSwap: Invalid front buffer virtual address 0x{:08X}\",\n           frontbuffer_virtual_address);\n    return;\n  }\n  gpu_fetch.base_address = frontbuffer_physical_address >> 12;\n\n  auto texture_format = gpu::xenos::TextureFormat(texture_format_ptr.value());\n  auto color_space = *color_space_ptr;\n  assert_true(texture_format == gpu::xenos::TextureFormat::k_8_8_8_8 ||\n              texture_format ==\n                  gpu::xenos::TextureFormat::k_2_10_10_10_AS_16_16_16_16);\n  assert_true(color_space == 0);  // RGB(0)\n  assert_true(*width == 1 + gpu_fetch.size_2d.width);\n  assert_true(*height == 1 + gpu_fetch.size_2d.height);\n\n  // The caller seems to reserve 64 words (256b) in the primary ringbuffer\n  // for this method to do what it needs. We just zero them out and send a\n  // token value. It'd be nice to figure out what this is really doing so\n  // that we could simulate it, though due to TCR I bet all games need to\n  // use this method.\n  buffer_ptr.Zero(64 * 4);\n\n  uint32_t offset = 0;\n  auto dwords = buffer_ptr.as_array<uint32_t>();\n\n  // Write in the GPU texture fetch.\n  dwords[offset++] =\n      xenos::MakePacketType0(gpu::XE_GPU_REG_SHADER_CONSTANT_FETCH_00_0, 6);\n  dwords[offset++] = gpu_fetch.dword_0;\n  dwords[offset++] = gpu_fetch.dword_1;\n  dwords[offset++] = gpu_fetch.dword_2;\n  dwords[offset++] = gpu_fetch.dword_3;\n  dwords[offset++] = gpu_fetch.dword_4;\n  dwords[offset++] = gpu_fetch.dword_5;\n\n  dwords[offset++] = xenos::MakePacketType3(xenos::PM4_XE_SWAP, 4);\n  dwords[offset++] = xe::gpu::xenos::kSwapSignature;\n  dwords[offset++] = frontbuffer_physical_address;\n\n  dwords[offset++] = *width;\n  dwords[offset++] = *height;\n\n  // Fill the rest of the buffer with NOP packets.\n  for (uint32_t i = offset; i < 64; i++) {\n    dwords[i] = xenos::MakePacketType2();\n  }\n}\nDECLARE_XBOXKRNL_EXPORT2(VdSwap, kVideo, kImplemented, kImportant);\n\nvoid RegisterVideoExports(xe::cpu::ExportResolver* export_resolver,\n                          KernelState* kernel_state) {\n  auto memory = kernel_state->memory();\n\n  // VdGlobalDevice (4b)\n  // Pointer to a global D3D device. Games only seem to set this, so we don't\n  // have to do anything. We may want to read it back later, though.\n  uint32_t pVdGlobalDevice =\n      memory->SystemHeapAlloc(4, 32, kSystemHeapPhysical);\n  export_resolver->SetVariableMapping(\"xboxkrnl.exe\", ordinals::VdGlobalDevice,\n                                      pVdGlobalDevice);\n  xe::store_and_swap<uint32_t>(memory->TranslateVirtual(pVdGlobalDevice), 0);\n\n  // VdGlobalXamDevice (4b)\n  // Pointer to the XAM D3D device, which we don't have.\n  uint32_t pVdGlobalXamDevice =\n      memory->SystemHeapAlloc(4, 32, kSystemHeapPhysical);\n  export_resolver->SetVariableMapping(\n      \"xboxkrnl.exe\", ordinals::VdGlobalXamDevice, pVdGlobalXamDevice);\n  xe::store_and_swap<uint32_t>(memory->TranslateVirtual(pVdGlobalXamDevice), 0);\n\n  // VdGpuClockInMHz (4b)\n  // GPU clock. Xenos is 500MHz. Hope nothing is relying on this timing...\n  uint32_t pVdGpuClockInMHz =\n      memory->SystemHeapAlloc(4, 32, kSystemHeapPhysical);\n  export_resolver->SetVariableMapping(\"xboxkrnl.exe\", ordinals::VdGpuClockInMHz,\n                                      pVdGpuClockInMHz);\n  xe::store_and_swap<uint32_t>(memory->TranslateVirtual(pVdGpuClockInMHz), 500);\n\n  // VdHSIOCalibrationLock (28b)\n  // CriticalSection.\n  uint32_t pVdHSIOCalibrationLock =\n      memory->SystemHeapAlloc(28, 32, kSystemHeapPhysical);\n  export_resolver->SetVariableMapping(\n      \"xboxkrnl.exe\", ordinals::VdHSIOCalibrationLock, pVdHSIOCalibrationLock);\n  auto hsio_lock =\n      memory->TranslateVirtual<X_RTL_CRITICAL_SECTION*>(pVdHSIOCalibrationLock);\n  xeRtlInitializeCriticalSectionAndSpinCount(hsio_lock, pVdHSIOCalibrationLock,\n                                             10000);\n}\n\n}  // namespace xboxkrnl\n}  // namespace kernel\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/kernel/xboxkrnl/xboxkrnl_video.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_KERNEL_XBOXKRNL_XBOXKRNL_VIDEO_H_\n#define XENIA_KERNEL_XBOXKRNL_XBOXKRNL_VIDEO_H_\n\n#include \"xenia/kernel/util/shim_utils.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace kernel {\nnamespace xboxkrnl {\n\nvoid VdQueryVideoMode(X_VIDEO_MODE* video_mode);\n\n}  // namespace xboxkrnl\n}  // namespace kernel\n}  // namespace xe\n\n#endif  // XENIA_KERNEL_XBOXKRNL_XBOXKRNL_VIDEO_H_\n"
  },
  {
    "path": "src/xenia/kernel/xboxkrnl/xboxkrnl_xconfig.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/logging.h\"\n#include \"xenia/cpu/processor.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/user_module.h\"\n#include \"xenia/kernel/util/shim_utils.h\"\n#include \"xenia/kernel/xboxkrnl/xboxkrnl_private.h\"\n#include \"xenia/xbox.h\"\n\nDEFINE_int32(user_language, 1,\n             \"User language ID.\\n\"\n             \"  1=en  2=ja  3=de  4=fr  5=es  6=it  7=ko  8=zh\\n\"\n             \"  9=pt 11=pl 12=ru 13=sv 14=tr 15=nb 16=nl 17=zh\",\n             \"XConfig\");\n\nDEFINE_int32(user_country, 103,\n             \"User country ID.\\n\"\n             \"   1=AE   2=AL   3=AM   4=AR   5=AT   6=AU   7=AZ   8=BE   9=BG\\n\"\n             \"  10=BH  11=BN  12=BO  13=BR  14=BY  15=BZ  16=CA  18=CH  19=CL\\n\"\n             \"  20=CN  21=CO  22=CR  23=CZ  24=DE  25=DK  26=DO  27=DZ  28=EC\\n\"\n             \"  29=EE  30=EG  31=ES  32=FI  33=FO  34=FR  35=GB  36=GE  37=GR\\n\"\n             \"  38=GT  39=HK  40=HN  41=HR  42=HU  43=ID  44=IE  45=IL  46=IN\\n\"\n             \"  47=IQ  48=IR  49=IS  50=IT  51=JM  52=JO  53=JP  54=KE  55=KG\\n\"\n             \"  56=KR  57=KW  58=KZ  59=LB  60=LI  61=LT  62=LU  63=LV  64=LY\\n\"\n             \"  65=MA  66=MC  67=MK  68=MN  69=MO  70=MV  71=MX  72=MY  73=NI\\n\"\n             \"  74=NL  75=NO  76=NZ  77=OM  78=PA  79=PE  80=PH  81=PK  82=PL\\n\"\n             \"  83=PR  84=PT  85=PY  86=QA  87=RO  88=RU  89=SA  90=SE  91=SG\\n\"\n             \"  92=SI  93=SK  95=SV  96=SY  97=TH  98=TN  99=TR 100=TT 101=TW\\n\"\n             \" 102=UA 103=US 104=UY 105=UZ 106=VE 107=VN 108=YE 109=ZA\\n\",\n             \"XConfig\");\n\nnamespace xe {\nnamespace kernel {\nnamespace xboxkrnl {\n\nX_STATUS xeExGetXConfigSetting(uint16_t category, uint16_t setting,\n                               void* buffer, uint16_t buffer_size,\n                               uint16_t* required_size) {\n  uint16_t setting_size = 0;\n  alignas(uint32_t) uint8_t value[4];\n\n  // TODO(benvanik): have real structs here that just get copied from.\n  // https://free60project.github.io/wiki/XConfig.html\n  // https://github.com/oukiar/freestyledash/blob/master/Freestyle/Tools/Generic/ExConfig.h\n  switch (category) {\n    case 0x0002:\n      // XCONFIG_SECURED_CATEGORY\n      switch (setting) {\n        case 0x0002:  // XCONFIG_SECURED_AV_REGION\n          setting_size = 4;\n          xe::store_and_swap<uint32_t>(value, 0x00001000);  // USA/Canada\n          break;\n        default:\n          assert_unhandled_case(setting);\n          return X_STATUS_INVALID_PARAMETER_2;\n      }\n      break;\n    case 0x0003:\n      // XCONFIG_USER_CATEGORY\n      switch (setting) {\n        case 0x0001:  // XCONFIG_USER_TIME_ZONE_BIAS\n        case 0x0002:  // XCONFIG_USER_TIME_ZONE_STD_NAME\n        case 0x0003:  // XCONFIG_USER_TIME_ZONE_DLT_NAME\n        case 0x0004:  // XCONFIG_USER_TIME_ZONE_STD_DATE\n        case 0x0005:  // XCONFIG_USER_TIME_ZONE_DLT_DATE\n        case 0x0006:  // XCONFIG_USER_TIME_ZONE_STD_BIAS\n        case 0x0007:  // XCONFIG_USER_TIME_ZONE_DLT_BIAS\n          setting_size = 4;\n          // TODO(benvanik): get this value.\n          xe::store_and_swap<uint32_t>(value, 0);\n          break;\n        case 0x0009:  // XCONFIG_USER_LANGUAGE\n          setting_size = 4;\n          xe::store_and_swap<uint32_t>(value, cvars::user_language);\n          break;\n        case 0x000A:  // XCONFIG_USER_VIDEO_FLAGS\n          setting_size = 4;\n          xe::store_and_swap<uint32_t>(value, 0x00040000);\n          break;\n        case 0x000C:  // XCONFIG_USER_RETAIL_FLAGS\n          setting_size = 4;\n          // TODO(benvanik): get this value.\n          xe::store_and_swap<uint32_t>(value, 0);\n          break;\n        case 0x000E:  // XCONFIG_USER_COUNTRY\n          setting_size = 1;\n          value[0] = static_cast<uint8_t>(cvars::user_country);\n          break;\n        default:\n          assert_unhandled_case(setting);\n          return X_STATUS_INVALID_PARAMETER_2;\n      }\n      break;\n    default:\n      assert_unhandled_case(category);\n      return X_STATUS_INVALID_PARAMETER_1;\n  }\n\n  if (buffer) {\n    if (buffer_size < setting_size) {\n      return X_STATUS_BUFFER_TOO_SMALL;\n    }\n    std::memcpy(buffer, value, setting_size);\n  } else {\n    if (buffer_size) {\n      return X_STATUS_INVALID_PARAMETER_3;\n    }\n  }\n\n  if (required_size) {\n    *required_size = setting_size;\n  }\n\n  return X_STATUS_SUCCESS;\n}\n\ndword_result_t ExGetXConfigSetting_entry(word_t category, word_t setting,\n                                         lpvoid_t buffer_ptr,\n                                         word_t buffer_size,\n                                         lpword_t required_size_ptr) {\n  uint16_t required_size = 0;\n  X_STATUS result = xeExGetXConfigSetting(category, setting, buffer_ptr,\n                                          buffer_size, &required_size);\n\n  if (required_size_ptr) {\n    *required_size_ptr = required_size;\n  }\n\n  return result;\n}\nDECLARE_XBOXKRNL_EXPORT1(ExGetXConfigSetting, kModules, kImplemented);\n\n}  // namespace xboxkrnl\n}  // namespace kernel\n}  // namespace xe\n\nDECLARE_XBOXKRNL_EMPTY_REGISTER_EXPORTS(XConfig);\n"
  },
  {
    "path": "src/xenia/kernel/xenumerator.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/kernel/xenumerator.h\"\n\nnamespace xe {\nnamespace kernel {\n\nXEnumerator::XEnumerator(KernelState* kernel_state, size_t items_per_enumerate,\n                         size_t item_size)\n    : XObject(kernel_state, kObjectType),\n      items_per_enumerate_(items_per_enumerate),\n      item_size_(item_size) {}\n\nXEnumerator::~XEnumerator() = default;\n\nX_STATUS XEnumerator::Initialize(uint32_t user_index, uint32_t app_id,\n                                 uint32_t open_message, uint32_t close_message,\n                                 uint32_t flags, uint32_t extra_size,\n                                 void** extra_buffer) {\n  auto native_object = CreateNative(sizeof(X_KENUMERATOR) + extra_size);\n  if (!native_object) {\n    return X_STATUS_NO_MEMORY;\n  }\n  auto guest_object = reinterpret_cast<X_KENUMERATOR*>(native_object);\n  guest_object->app_id = app_id;\n  guest_object->open_message = open_message;\n  guest_object->close_message = close_message;\n  guest_object->user_index = user_index;\n  guest_object->items_per_enumerate =\n      static_cast<uint32_t>(items_per_enumerate_);\n  guest_object->flags = flags;\n  if (extra_buffer) {\n    *extra_buffer =\n        !extra_buffer ? nullptr : &native_object[sizeof(X_KENUMERATOR)];\n  }\n  return X_STATUS_SUCCESS;\n}\n\nX_STATUS XEnumerator::Initialize(uint32_t user_index, uint32_t app_id,\n                                 uint32_t open_message, uint32_t close_message,\n                                 uint32_t flags) {\n  return Initialize(user_index, app_id, open_message, close_message, flags, 0,\n                    nullptr);\n}\n\nuint8_t* XStaticUntypedEnumerator::AppendItem() {\n  size_t offset = buffer_.size();\n  buffer_.resize(offset + item_size());\n  item_count_++;\n  return const_cast<uint8_t*>(&buffer_.data()[offset]);\n}\n\nuint32_t XStaticUntypedEnumerator::WriteItems(uint32_t buffer_ptr,\n                                              uint8_t* buffer_data,\n                                              uint32_t* written_count) {\n  size_t count = std::min(item_count_ - current_item_, items_per_enumerate());\n  if (!count) {\n    return X_ERROR_NO_MORE_FILES;\n  }\n\n  size_t size = count * item_size();\n  size_t offset = current_item_ * item_size();\n  std::memcpy(buffer_data, buffer_.data() + offset, size);\n\n  current_item_ += count;\n\n  if (written_count) {\n    *written_count = static_cast<uint32_t>(count);\n  }\n\n  return X_ERROR_SUCCESS;\n}\n\n}  // namespace kernel\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/kernel/xenumerator.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_KERNEL_XENUMERATOR_H_\n#define XENIA_KERNEL_XENUMERATOR_H_\n\n#include <algorithm>\n#include <cstring>\n#include <vector>\n\n#include \"xenia/kernel/xobject.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace kernel {\n\nstruct X_KENUMERATOR {\n  be<uint32_t> app_id;\n  be<uint32_t> open_message;\n  be<uint32_t> close_message;\n  be<uint32_t> user_index;\n  be<uint32_t> items_per_enumerate;\n  be<uint32_t> flags;\n};\nstatic_assert_size(X_KENUMERATOR, 0x18);\n\nstruct X_KENUMERATOR_CONTENT_AGGREGATE {\n  be<uint32_t> magic;\n  be<uint32_t> handle;\n};\n\nclass XEnumerator : public XObject {\n public:\n  static const XObject::Type kObjectType = XObject::Type::Enumerator;\n\n  XEnumerator(KernelState* kernel_state, size_t items_per_enumerate,\n              size_t item_size);\n  virtual ~XEnumerator();\n\n  X_STATUS Initialize(uint32_t user_index, uint32_t app_id,\n                      uint32_t open_message, uint32_t close_message,\n                      uint32_t flags, uint32_t extra_size, void** extra_buffer);\n\n  X_STATUS Initialize(uint32_t user_index, uint32_t app_id,\n                      uint32_t open_message, uint32_t close_message,\n                      uint32_t flags);\n\n  template <typename T>\n  X_STATUS Initialize(uint32_t user_index, uint32_t app_id,\n                      uint32_t open_message, uint32_t close_message,\n                      uint32_t flags, T** extra) {\n    void* dummy;\n    auto result = Initialize(user_index, app_id, open_message, close_message,\n                             flags, static_cast<uint32_t>(sizeof(T)), &dummy);\n    if (extra) {\n      *extra = XFAILED(result) ? nullptr : static_cast<T*>(dummy);\n    }\n    return result;\n  }\n\n  virtual uint32_t WriteItems(uint32_t buffer_ptr, uint8_t* buffer_data,\n                              uint32_t* written_count) = 0;\n\n  size_t item_size() const { return item_size_; }\n  size_t items_per_enumerate() const { return items_per_enumerate_; }\n\n private:\n  size_t items_per_enumerate_;\n  size_t item_size_;\n};\n\nclass XStaticUntypedEnumerator : public XEnumerator {\n public:\n  XStaticUntypedEnumerator(KernelState* kernel_state,\n                           size_t items_per_enumerate, size_t item_size)\n      : XEnumerator(kernel_state, items_per_enumerate, item_size),\n        item_count_(0),\n        current_item_(0) {}\n\n  size_t item_count() const { return item_count_; }\n\n  uint8_t* AppendItem();\n\n  uint32_t WriteItems(uint32_t buffer_ptr, uint8_t* buffer_data,\n                      uint32_t* written_count) override;\n\n private:\n  size_t item_count_;\n  size_t current_item_;\n  std::vector<uint8_t> buffer_;\n};\n\ntemplate <typename T>\nclass XStaticEnumerator : public XStaticUntypedEnumerator {\n public:\n  XStaticEnumerator(KernelState* kernel_state, size_t items_per_enumerate)\n      : XStaticUntypedEnumerator(kernel_state, items_per_enumerate, sizeof(T)) {\n  }\n\n  T* AppendItem() {\n    return reinterpret_cast<T*>(XStaticUntypedEnumerator::AppendItem());\n  }\n\n  void AppendItem(const T& item) {\n    auto ptr = AppendItem();\n    item.Write(ptr);\n  }\n};\n\n}  // namespace kernel\n}  // namespace xe\n\n#endif  // XENIA_KERNEL_XENUMERATOR_H_\n"
  },
  {
    "path": "src/xenia/kernel/xevent.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/kernel/xevent.h\"\n\n#include \"xenia/base/byte_stream.h\"\n#include \"xenia/base/logging.h\"\n\nnamespace xe {\nnamespace kernel {\n\nXEvent::XEvent(KernelState* kernel_state)\n    : XObject(kernel_state, kObjectType) {}\n\nXEvent::~XEvent() = default;\n\nvoid XEvent::Initialize(bool manual_reset, bool initial_state) {\n  assert_false(event_);\n\n  this->CreateNative<X_KEVENT>();\n\n  if (manual_reset) {\n    event_ = xe::threading::Event::CreateManualResetEvent(initial_state);\n  } else {\n    event_ = xe::threading::Event::CreateAutoResetEvent(initial_state);\n  }\n  assert_not_null(event_);\n}\n\nvoid XEvent::InitializeNative(void* native_ptr, X_DISPATCH_HEADER* header) {\n  assert_false(event_);\n\n  switch (header->type) {\n    case 0x00:  // EventNotificationObject (manual reset)\n      manual_reset_ = true;\n      break;\n    case 0x01:  // EventSynchronizationObject (auto reset)\n      manual_reset_ = false;\n      break;\n    default:\n      assert_always();\n      return;\n  }\n\n  bool initial_state = header->signal_state ? true : false;\n  if (manual_reset_) {\n    event_ = xe::threading::Event::CreateManualResetEvent(initial_state);\n  } else {\n    event_ = xe::threading::Event::CreateAutoResetEvent(initial_state);\n  }\n  assert_not_null(event_);\n}\n\nint32_t XEvent::Set(uint32_t priority_increment, bool wait) {\n  event_->Set();\n  return 1;\n}\n\nint32_t XEvent::Pulse(uint32_t priority_increment, bool wait) {\n  event_->Pulse();\n  return 1;\n}\n\nint32_t XEvent::Reset() {\n  event_->Reset();\n  return 1;\n}\n\nvoid XEvent::Clear() { event_->Reset(); }\n\nbool XEvent::Save(ByteStream* stream) {\n  XELOGD(\"XEvent {:08X} ({})\", handle(), manual_reset_ ? \"manual\" : \"auto\");\n  SaveObject(stream);\n\n  bool signaled = true;\n  auto result =\n      xe::threading::Wait(event_.get(), false, std::chrono::milliseconds(0));\n  if (result == xe::threading::WaitResult::kSuccess) {\n    signaled = true;\n  } else if (result == xe::threading::WaitResult::kTimeout) {\n    signaled = false;\n  } else {\n    assert_always();\n  }\n\n  if (signaled) {\n    // Reset the event in-case it's an auto-reset.\n    event_->Set();\n  }\n\n  stream->Write<bool>(signaled);\n  stream->Write<bool>(manual_reset_);\n\n  return true;\n}\n\nobject_ref<XEvent> XEvent::Restore(KernelState* kernel_state,\n                                   ByteStream* stream) {\n  auto evt = new XEvent(nullptr);\n  evt->kernel_state_ = kernel_state;\n\n  evt->RestoreObject(stream);\n  bool signaled = stream->Read<bool>();\n  evt->manual_reset_ = stream->Read<bool>();\n\n  if (evt->manual_reset_) {\n    evt->event_ = xe::threading::Event::CreateManualResetEvent(false);\n  } else {\n    evt->event_ = xe::threading::Event::CreateAutoResetEvent(false);\n  }\n  assert_not_null(evt->event_);\n\n  if (signaled) {\n    evt->event_->Set();\n  }\n\n  return object_ref<XEvent>(evt);\n}\n\n}  // namespace kernel\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/kernel/xevent.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_KERNEL_XEVENT_H_\n#define XENIA_KERNEL_XEVENT_H_\n\n#include \"xenia/base/threading.h\"\n#include \"xenia/kernel/xobject.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace kernel {\n\n// https://www.nirsoft.net/kernel_struct/vista/KEVENT.html\nstruct X_KEVENT {\n  X_DISPATCH_HEADER header;\n};\nstatic_assert_size(X_KEVENT, 0x10);\n\nclass XEvent : public XObject {\n public:\n  static const XObject::Type kObjectType = XObject::Type::Event;\n\n  explicit XEvent(KernelState* kernel_state);\n  ~XEvent() override;\n\n  void Initialize(bool manual_reset, bool initial_state);\n  void InitializeNative(void* native_ptr, X_DISPATCH_HEADER* header);\n\n  int32_t Set(uint32_t priority_increment, bool wait);\n  int32_t Pulse(uint32_t priority_increment, bool wait);\n  int32_t Reset();\n  void Clear();\n\n  bool Save(ByteStream* stream) override;\n  static object_ref<XEvent> Restore(KernelState* kernel_state,\n                                    ByteStream* stream);\n\n protected:\n  xe::threading::WaitHandle* GetWaitHandle() override { return event_.get(); }\n\n private:\n  bool manual_reset_ = false;\n  std::unique_ptr<xe::threading::Event> event_;\n};\n\n}  // namespace kernel\n}  // namespace xe\n\n#endif  // XENIA_KERNEL_XEVENT_H_\n"
  },
  {
    "path": "src/xenia/kernel/xfile.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/kernel/xfile.h\"\n#include \"xenia/vfs/virtual_file_system.h\"\n\n#include \"xenia/base/byte_stream.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/mutex.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/xevent.h\"\n#include \"xenia/memory.h\"\n\nnamespace xe {\nnamespace kernel {\n\nXFile::XFile(KernelState* kernel_state, vfs::File* file, bool synchronous)\n    : XObject(kernel_state, kObjectType),\n      file_(file),\n      is_synchronous_(synchronous) {\n  async_event_ = threading::Event::CreateAutoResetEvent(false);\n  assert_not_null(async_event_);\n}\n\nXFile::XFile() : XObject(kObjectType) {\n  async_event_ = threading::Event::CreateAutoResetEvent(false);\n  assert_not_null(async_event_);\n}\n\nXFile::~XFile() {\n  // TODO(benvanik): signal that the file is closing?\n  async_event_->Set();\n  file_->Destroy();\n}\n\nX_STATUS XFile::QueryDirectory(X_FILE_DIRECTORY_INFORMATION* out_info,\n                               size_t length, const std::string_view file_name,\n                               bool restart) {\n  assert_not_null(out_info);\n\n  vfs::Entry* entry = nullptr;\n\n  if (!file_name.empty()) {\n    // Only queries in the current directory are supported for now.\n    assert_true(utf8::find_any_of(file_name, \"\\\\\") == std::string_view::npos);\n\n    find_engine_.SetRule(file_name);\n\n    // Always restart the search?\n    find_index_ = 0;\n    entry = file_->entry()->IterateChildren(find_engine_, &find_index_);\n    if (!entry) {\n      return X_STATUS_NO_SUCH_FILE;\n    }\n  } else {\n    if (restart) {\n      find_index_ = 0;\n    }\n\n    entry = file_->entry()->IterateChildren(find_engine_, &find_index_);\n    if (!entry) {\n      return X_STATUS_NO_MORE_FILES;\n    }\n  }\n\n  auto end = reinterpret_cast<uint8_t*>(out_info) + length;\n  const auto& entry_name = entry->name();\n  if (reinterpret_cast<uint8_t*>(&out_info->file_name[0]) + entry_name.size() >\n      end) {\n    assert_always(\"Buffer overflow?\");\n    return X_STATUS_NO_SUCH_FILE;\n  }\n\n  out_info->next_entry_offset = 0;\n  out_info->file_index = static_cast<uint32_t>(find_index_);\n  out_info->creation_time = entry->create_timestamp();\n  out_info->last_access_time = entry->access_timestamp();\n  out_info->last_write_time = entry->write_timestamp();\n  out_info->change_time = entry->write_timestamp();\n  out_info->end_of_file = entry->size();\n  out_info->allocation_size = entry->allocation_size();\n  out_info->attributes = entry->attributes();\n  out_info->file_name_length = static_cast<uint32_t>(entry_name.size());\n  std::memcpy(out_info->file_name, entry_name.data(), entry_name.size());\n\n  return X_STATUS_SUCCESS;\n}\n\nX_STATUS XFile::Read(uint32_t buffer_guest_address, uint32_t buffer_length,\n                     uint64_t byte_offset, uint32_t* out_bytes_read,\n                     uint32_t apc_context, bool notify_completion) {\n  if (byte_offset == uint64_t(-1)) {\n    // Read from current position.\n    byte_offset = position_;\n  }\n\n  size_t bytes_read = 0;\n  X_STATUS result = X_STATUS_SUCCESS;\n  // Zero length means success for a valid file object according to Windows\n  // tests.\n  if (buffer_length) {\n    if (UINT32_MAX - buffer_guest_address < buffer_length) {\n      result = X_STATUS_ACCESS_VIOLATION;\n    } else {\n      // Games often read directly to texture/vertex buffer memory - in this\n      // case, invalidation notifications must be sent. However, having any\n      // memory callbacks in the range will result in STATUS_ACCESS_VIOLATION at\n      // least on Windows, without anything being read or any callbacks being\n      // triggered. So for physical memory, host protection must be bypassed,\n      // and invalidation callbacks must be triggered manually (it's also wrong\n      // to trigger invalidation callbacks before reading in this case, because\n      // during the read, the guest may still access the data around the buffer\n      // that is located in the same host pages as the buffer's start and end,\n      // on the GPU - and that must not trigger a race condition).\n      uint32_t buffer_guest_high_address =\n          buffer_guest_address + buffer_length - 1;\n      xe::BaseHeap* buffer_start_heap =\n          memory()->LookupHeap(buffer_guest_address);\n      const xe::BaseHeap* buffer_end_heap =\n          memory()->LookupHeap(buffer_guest_high_address);\n      if (!buffer_start_heap || !buffer_end_heap ||\n          (buffer_start_heap->heap_type() == HeapType::kGuestPhysical) !=\n              (buffer_end_heap->heap_type() == HeapType::kGuestPhysical) ||\n          (buffer_start_heap->heap_type() == HeapType::kGuestPhysical &&\n           buffer_start_heap != buffer_end_heap)) {\n        result = X_STATUS_ACCESS_VIOLATION;\n      } else {\n        xe::PhysicalHeap* buffer_physical_heap =\n            buffer_start_heap->heap_type() == HeapType::kGuestPhysical\n                ? static_cast<xe::PhysicalHeap*>(buffer_start_heap)\n                : nullptr;\n        if (buffer_physical_heap &&\n            buffer_physical_heap->QueryRangeAccess(buffer_guest_address,\n                                                   buffer_guest_high_address) !=\n                memory::PageAccess::kReadWrite) {\n          result = X_STATUS_ACCESS_VIOLATION;\n        } else {\n          result = file_->ReadSync(\n              buffer_physical_heap\n                  ? memory()->TranslatePhysical(\n                        buffer_physical_heap->GetPhysicalAddress(\n                            buffer_guest_address))\n                  : memory()->TranslateVirtual(buffer_guest_address),\n              buffer_length, size_t(byte_offset), &bytes_read);\n          if (XSUCCEEDED(result)) {\n            if (buffer_physical_heap) {\n              buffer_physical_heap->TriggerCallbacks(\n                  xe::global_critical_region::AcquireDirect(),\n                  buffer_guest_address, buffer_length, true, true);\n            }\n            position_ += bytes_read;\n          }\n        }\n      }\n    }\n  }\n\n  if (out_bytes_read) {\n    *out_bytes_read = uint32_t(bytes_read);\n  }\n\n  if (notify_completion) {\n    XIOCompletion::IONotification notify;\n    notify.apc_context = apc_context;\n    notify.num_bytes = uint32_t(bytes_read);\n    notify.status = result;\n\n    NotifyIOCompletionPorts(notify);\n\n    async_event_->Set();\n  }\n\n  return result;\n}\n\nX_STATUS XFile::ReadScatter(uint32_t segments_guest_address, uint32_t length,\n                            uint64_t byte_offset, uint32_t* out_bytes_read,\n                            uint32_t apc_context) {\n  X_STATUS result = X_STATUS_SUCCESS;\n\n  // segments points to an array of buffer pointers of type\n  // \"FILE_SEGMENT_ELEMENT\", but they can just be treated as normal pointers\n  xe::be<uint32_t>* segments = reinterpret_cast<xe::be<uint32_t>*>(\n      memory()->TranslateVirtual(segments_guest_address));\n\n  // TODO: not sure if this is meant to change depending on buffer address?\n  // (only game seen using this always seems to use 4096-byte buffers)\n  uint32_t page_size = 4096;\n\n  uint32_t read_total = 0;\n  uint32_t read_remain = length;\n  while (read_remain) {\n    uint32_t read_length = read_remain;\n    uint32_t read_buffer = *segments;\n    if (read_length > page_size) {\n      read_length = page_size;\n      segments++;\n    }\n\n    uint32_t bytes_read = 0;\n    result = Read(read_buffer, read_length,\n                  byte_offset ? ((byte_offset != -1 && byte_offset != -2)\n                                     ? byte_offset + read_total\n                                     : byte_offset)\n                              : -1,\n                  &bytes_read, apc_context, false);\n\n    if (result != X_STATUS_SUCCESS) {\n      break;\n    }\n\n    read_total += bytes_read;\n    read_remain -= read_length;\n  }\n\n  if (out_bytes_read) {\n    *out_bytes_read = uint32_t(read_total);\n  }\n\n  XIOCompletion::IONotification notify;\n  notify.apc_context = apc_context;\n  notify.num_bytes = uint32_t(read_total);\n  notify.status = result;\n\n  NotifyIOCompletionPorts(notify);\n\n  async_event_->Set();\n\n  return result;\n}\n\nX_STATUS XFile::Write(uint32_t buffer_guest_address, uint32_t buffer_length,\n                      uint64_t byte_offset, uint32_t* out_bytes_written,\n                      uint32_t apc_context) {\n  if (byte_offset == uint64_t(-1)) {\n    // Write from current position.\n    byte_offset = position_;\n  }\n\n  size_t bytes_written = 0;\n  X_STATUS result =\n      file_->WriteSync(memory()->TranslateVirtual(buffer_guest_address),\n                       buffer_length, size_t(byte_offset), &bytes_written);\n  if (XSUCCEEDED(result)) {\n    position_ += bytes_written;\n  }\n\n  XIOCompletion::IONotification notify;\n  notify.apc_context = apc_context;\n  notify.num_bytes = uint32_t(bytes_written);\n  notify.status = result;\n\n  NotifyIOCompletionPorts(notify);\n\n  if (out_bytes_written) {\n    *out_bytes_written = uint32_t(bytes_written);\n  }\n\n  async_event_->Set();\n  return result;\n}\n\nX_STATUS XFile::SetLength(size_t length) { return file_->SetLength(length); }\n\nvoid XFile::RegisterIOCompletionPort(uint32_t key,\n                                     object_ref<XIOCompletion> port) {\n  std::lock_guard<std::mutex> lock(completion_port_lock_);\n\n  completion_ports_.push_back({key, port});\n}\n\nvoid XFile::RemoveIOCompletionPort(uint32_t key) {\n  std::lock_guard<std::mutex> lock(completion_port_lock_);\n\n  for (auto it = completion_ports_.begin(); it != completion_ports_.end();\n       it++) {\n    if (it->first == key) {\n      completion_ports_.erase(it);\n      break;\n    }\n  }\n}\n\nbool XFile::Save(ByteStream* stream) {\n  XELOGD(\"XFile {:08X} ({})\", handle(),\n         file_->entry()->absolute_path().c_str());\n\n  if (!SaveObject(stream)) {\n    return false;\n  }\n\n  stream->Write(file_->entry()->absolute_path());\n  stream->Write<uint64_t>(position_);\n  stream->Write(file_access());\n  stream->Write<bool>(\n      (file_->entry()->attributes() & vfs::kFileAttributeDirectory) != 0);\n  stream->Write<bool>(is_synchronous_);\n\n  return true;\n}\n\nobject_ref<XFile> XFile::Restore(KernelState* kernel_state,\n                                 ByteStream* stream) {\n  auto file = new XFile();\n  file->kernel_state_ = kernel_state;\n  if (!file->RestoreObject(stream)) {\n    delete file;\n    return nullptr;\n  }\n\n  auto abs_path = stream->Read<std::string>();\n  uint64_t position = stream->Read<uint64_t>();\n  auto access = stream->Read<uint32_t>();\n  auto is_directory = stream->Read<bool>();\n  auto is_synchronous = stream->Read<bool>();\n\n  XELOGD(\"XFile {:08X} ({})\", file->handle(), abs_path);\n\n  vfs::File* vfs_file = nullptr;\n  vfs::FileAction action;\n  auto res = kernel_state->file_system()->OpenFile(\n      nullptr, abs_path, vfs::FileDisposition::kOpen, access, is_directory,\n      false, &vfs_file, &action);\n  if (XFAILED(res)) {\n    XELOGE(\"Failed to open XFile: error {:08X}\", res);\n    return object_ref<XFile>(file);\n  }\n\n  file->file_ = vfs_file;\n  file->position_ = position;\n  file->is_synchronous_ = is_synchronous;\n\n  return object_ref<XFile>(file);\n}\n\nvoid XFile::NotifyIOCompletionPorts(\n    XIOCompletion::IONotification& notification) {\n  std::lock_guard<std::mutex> lock(completion_port_lock_);\n\n  for (auto port : completion_ports_) {\n    notification.key_context = port.first;\n    port.second->QueueNotification(notification);\n  }\n}\n\n}  // namespace kernel\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/kernel/xfile.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_KERNEL_XFILE_H_\n#define XENIA_KERNEL_XFILE_H_\n\n#include <string>\n\n#include \"xenia/kernel/xevent.h\"\n#include \"xenia/kernel/xiocompletion.h\"\n#include \"xenia/kernel/xobject.h\"\n#include \"xenia/vfs/device.h\"\n#include \"xenia/vfs/entry.h\"\n#include \"xenia/vfs/file.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace kernel {\n\n// https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/ns-wdm-_io_status_block\nstruct X_IO_STATUS_BLOCK {\n  union {\n    be<uint32_t> status;\n    be<uint32_t> pointer;\n  };\n  be<uint32_t> information;\n};\n\n// https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/ns-ntifs-_file_directory_information\nclass X_FILE_DIRECTORY_INFORMATION {\n public:\n  // FILE_DIRECTORY_INFORMATION\n  be<uint32_t> next_entry_offset;  // 0x0\n  be<uint32_t> file_index;         // 0x4\n  be<uint64_t> creation_time;      // 0x8\n  be<uint64_t> last_access_time;   // 0x10\n  be<uint64_t> last_write_time;    // 0x18\n  be<uint64_t> change_time;        // 0x20\n  be<uint64_t> end_of_file;        // 0x28 size in bytes\n  be<uint64_t> allocation_size;    // 0x30\n  be<uint32_t> attributes;         // 0x38 X_FILE_ATTRIBUTES\n  be<uint32_t> file_name_length;   // 0x3C\n  char file_name[1];               // 0x40\n\n  void Write(uint8_t* base, uint32_t p) {\n    uint8_t* dst = base + p;\n    uint8_t* src = reinterpret_cast<uint8_t*>(this);\n    X_FILE_DIRECTORY_INFORMATION* right;\n    do {\n      auto left = reinterpret_cast<X_FILE_DIRECTORY_INFORMATION*>(dst);\n      right = reinterpret_cast<X_FILE_DIRECTORY_INFORMATION*>(src);\n      left->next_entry_offset = right->next_entry_offset;\n      left->file_index = right->file_index;\n      left->creation_time = right->creation_time;\n      left->last_access_time = right->last_access_time;\n      left->last_write_time = right->last_write_time;\n      left->change_time = right->change_time;\n      left->end_of_file = right->end_of_file;\n      left->allocation_size = right->allocation_size;\n      left->attributes = right->attributes;\n      left->file_name_length = right->file_name_length;\n      std::memcpy(left->file_name, right->file_name, right->file_name_length);\n\n      dst += right->next_entry_offset;\n      src += right->next_entry_offset;\n    } while (right->next_entry_offset != 0);\n  }\n};\n\nclass XFile : public XObject {\n public:\n  static const XObject::Type kObjectType = XObject::Type::File;\n\n  XFile(KernelState* kernel_state, vfs::File* file, bool synchronous);\n  ~XFile() override;\n\n  vfs::Device* device() const { return file_->entry()->device(); }\n  vfs::Entry* entry() const { return file_->entry(); }\n  vfs::File* file() const { return file_; }\n  uint32_t file_access() const { return file_->file_access(); }\n\n  const std::string& path() const { return file_->entry()->path(); }\n  const std::string& name() const { return file_->entry()->name(); }\n\n  uint64_t position() const { return position_; }\n  void set_position(uint64_t value) { position_ = value; }\n\n  X_STATUS QueryDirectory(X_FILE_DIRECTORY_INFORMATION* out_info, size_t length,\n                          const std::string_view file_name, bool restart);\n\n  // Don't do within the global critical region because invalidation callbacks\n  // may be triggered (as per the usual rule of not doing I/O within the global\n  // critical region).\n  X_STATUS Read(uint32_t buffer_guess_address, uint32_t buffer_length,\n                uint64_t byte_offset, uint32_t* out_bytes_read,\n                uint32_t apc_context, bool notify_completion = true);\n\n  X_STATUS ReadScatter(uint32_t segments_guest_address, uint32_t length,\n                       uint64_t byte_offset, uint32_t* out_bytes_read,\n                       uint32_t apc_context);\n\n  X_STATUS Write(uint32_t buffer_guess_address, uint32_t buffer_length,\n                 uint64_t byte_offset, uint32_t* out_bytes_written,\n                 uint32_t apc_context);\n\n  X_STATUS SetLength(size_t length);\n\n  void RegisterIOCompletionPort(uint32_t key, object_ref<XIOCompletion> port);\n  void RemoveIOCompletionPort(uint32_t key);\n\n  bool Save(ByteStream* stream) override;\n  static object_ref<XFile> Restore(KernelState* kernel_state,\n                                   ByteStream* stream);\n\n  bool is_synchronous() const { return is_synchronous_; }\n\n protected:\n  void NotifyIOCompletionPorts(XIOCompletion::IONotification& notification);\n\n  xe::threading::WaitHandle* GetWaitHandle() override {\n    return async_event_.get();\n  }\n\n private:\n  XFile();\n\n  vfs::File* file_ = nullptr;\n  std::unique_ptr<threading::Event> async_event_ = nullptr;\n\n  std::mutex completion_port_lock_;\n  std::vector<std::pair<uint32_t, object_ref<XIOCompletion>>> completion_ports_;\n\n  // TODO(benvanik): create flags, open state, etc.\n\n  uint64_t position_ = 0;\n\n  xe::filesystem::WildcardEngine find_engine_;\n  size_t find_index_ = 0;\n\n  bool is_synchronous_ = false;\n};\n\n}  // namespace kernel\n}  // namespace xe\n\n#endif  // XENIA_KERNEL_XFILE_H_\n"
  },
  {
    "path": "src/xenia/kernel/xiocompletion.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/kernel/xiocompletion.h\"\n\nnamespace xe {\nnamespace kernel {\n\nXIOCompletion::XIOCompletion(KernelState* kernel_state)\n    : XObject(kernel_state, kObjectType) {\n  notification_semaphore_ = threading::Semaphore::Create(0, kMaxNotifications);\n  assert_not_null(notification_semaphore_);\n}\n\nXIOCompletion::~XIOCompletion() = default;\n\nvoid XIOCompletion::QueueNotification(IONotification& notification) {\n  std::unique_lock<std::mutex> lock(notification_lock_);\n\n  notifications_.push(notification);\n  notification_semaphore_->Release(1, nullptr);\n}\n\nbool XIOCompletion::WaitForNotification(uint64_t wait_ticks,\n                                        IONotification* notify) {\n  auto ms = std::chrono::milliseconds(TimeoutTicksToMs(wait_ticks));\n  auto res = threading::Wait(notification_semaphore_.get(), false, ms);\n  if (res == threading::WaitResult::kSuccess) {\n    std::unique_lock<std::mutex> lock(notification_lock_);\n    assert_false(notifications_.empty());\n\n    std::memcpy(notify, &notifications_.front(), sizeof(IONotification));\n    notifications_.pop();\n\n    return true;\n  }\n\n  return false;\n}\n\n}  // namespace kernel\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/kernel/xiocompletion.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2015 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_KERNEL_XIOCOMPLETION_H_\n#define XENIA_KERNEL_XIOCOMPLETION_H_\n\n#include <queue>\n\n#include \"xenia/base/threading.h\"\n#include \"xenia/kernel/xobject.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace kernel {\n\nclass XIOCompletion : public XObject {\n public:\n  static const XObject::Type kObjectType = XObject::Type::IOCompletion;\n\n  explicit XIOCompletion(KernelState* kernel_state);\n  ~XIOCompletion() override;\n\n  struct IONotification {\n    uint32_t key_context;\n    uint32_t apc_context;\n    uint32_t status;\n    uint32_t num_bytes;\n  };\n\n  void QueueNotification(IONotification& notification);\n\n  // Returns true if the wait ended because a notification was received.\n  bool WaitForNotification(uint64_t wait_ticks, IONotification* notify);\n\n private:\n  static const uint32_t kMaxNotifications = 1024;\n\n  std::mutex notification_lock_;\n  std::queue<IONotification> notifications_;\n  std::unique_ptr<threading::Semaphore> notification_semaphore_ = nullptr;\n};\n\n}  // namespace kernel\n}  // namespace xe\n\n#endif  // XENIA_KERNEL_XIOCOMPLETION_H_\n"
  },
  {
    "path": "src/xenia/kernel/xmodule.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/kernel/xmodule.h\"\n\n#include \"xenia/base/byte_stream.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/string.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/user_module.h\"\n\nnamespace xe {\nnamespace kernel {\n\nXModule::XModule(KernelState* kernel_state, ModuleType module_type)\n    : XObject(kernel_state, kObjectType),\n      module_type_(module_type),\n      processor_module_(nullptr),\n      hmodule_ptr_(0) {\n  // Loader data (HMODULE)\n  hmodule_ptr_ = memory()->SystemHeapAlloc(sizeof(X_LDR_DATA_TABLE_ENTRY));\n\n  // Hijack the checksum field to store our kernel object handle.\n  auto ldr_data =\n      memory()->TranslateVirtual<X_LDR_DATA_TABLE_ENTRY*>(hmodule_ptr_);\n  ldr_data->checksum = handle();\n}\n\nXModule::~XModule() {\n  kernel_state_->UnregisterModule(this);\n\n  // Destroy the loader data.\n  memory()->SystemHeapFree(hmodule_ptr_);\n}\n\nbool XModule::Matches(const std::string_view name) const {\n  return xe::utf8::equal_case(xe::utf8::find_name_from_guest_path(path()),\n                              name) ||\n         xe::utf8::equal_case(this->name(), name) ||\n         xe::utf8::equal_case(path(), name);\n}  // namespace kernel\n\nvoid XModule::OnLoad() { kernel_state_->RegisterModule(this); }\n\nvoid XModule::OnUnload() { kernel_state_->UnregisterModule(this); }\n\nX_STATUS XModule::GetSection(const std::string_view name,\n                             uint32_t* out_section_data,\n                             uint32_t* out_section_size) {\n  return X_STATUS_UNSUCCESSFUL;\n}\n\nobject_ref<XModule> XModule::GetFromHModule(KernelState* kernel_state,\n                                            void* hmodule) {\n  // Grab the object from our stashed kernel handle\n  return kernel_state->object_table()->LookupObject<XModule>(\n      GetHandleFromHModule(hmodule));\n}\n\nuint32_t XModule::GetHandleFromHModule(void* hmodule) {\n  auto ldr_data = reinterpret_cast<X_LDR_DATA_TABLE_ENTRY*>(hmodule);\n  return ldr_data->checksum;\n}\n\nbool XModule::Save(ByteStream* stream) {\n  XELOGD(\"XModule {:08X} ({})\", handle(), path());\n\n  stream->Write(kModuleSaveSignature);\n\n  stream->Write(path());\n  stream->Write(hmodule_ptr_);\n\n  if (!SaveObject(stream)) {\n    return false;\n  }\n\n  return true;\n}\n\nobject_ref<XModule> XModule::Restore(KernelState* kernel_state,\n                                     ByteStream* stream) {\n  if (stream->Read<uint32_t>() != kModuleSaveSignature) {\n    return nullptr;\n  }\n\n  auto path = stream->Read<std::string>();\n  auto hmodule_ptr = stream->Read<uint32_t>();\n\n  // Can only save user modules at the moment, so just redirect.\n  // TODO: Find a way to call RestoreObject here before UserModule::Restore.\n  auto module = UserModule::Restore(kernel_state, stream, path);\n  if (!module) {\n    return nullptr;\n  }\n\n  XELOGD(\"XModule {:08X} ({})\", module->handle(), module->path());\n\n  module->hmodule_ptr_ = hmodule_ptr;\n  return module;\n}\n\n}  // namespace kernel\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/kernel/xmodule.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_KERNEL_XMODULE_H_\n#define XENIA_KERNEL_XMODULE_H_\n\n#include <string>\n\n#include \"xenia/cpu/module.h\"\n#include \"xenia/kernel/xobject.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace kernel {\n\nconstexpr fourcc_t kModuleSaveSignature = make_fourcc(\"XMOD\");\n\n// https://www.nirsoft.net/kernel_struct/vista/LDR_DATA_TABLE_ENTRY.html\n// HMODULE points to this struct!\nstruct X_LDR_DATA_TABLE_ENTRY {\n  X_LIST_ENTRY in_load_order_links;            // 0x0\n  X_LIST_ENTRY in_memory_order_links;          // 0x8\n  X_LIST_ENTRY in_initialization_order_links;  // 0x10\n\n  xe::be<uint32_t> dll_base;    // 0x18\n  xe::be<uint32_t> image_base;  // 0x1C\n  xe::be<uint32_t> image_size;  // 0x20\n\n  X_UNICODE_STRING full_dll_name;  // 0x24\n  X_UNICODE_STRING base_dll_name;  // 0x2C\n\n  xe::be<uint32_t> flags;              // 0x34\n  xe::be<uint32_t> full_image_size;    // 0x38\n  xe::be<uint32_t> entry_point;        // 0x3C\n  xe::be<uint16_t> load_count;         // 0x40\n  xe::be<uint16_t> module_index;       // 0x42\n  xe::be<uint32_t> dll_base_original;  // 0x44\n  xe::be<uint32_t> checksum;           // 0x48 hijacked to hold kernel handle\n  xe::be<uint32_t> load_flags;         // 0x4C\n  xe::be<uint32_t> time_date_stamp;    // 0x50\n  xe::be<uint32_t> loaded_imports;     // 0x54\n  xe::be<uint32_t> xex_header_base;    // 0x58\n  // X_ANSI_STRING load_file_name;     // 0x5C\n  xe::be<uint32_t> closure_root;      // 0x5C\n  xe::be<uint32_t> traversal_parent;  // 0x60\n};\n\nclass XModule : public XObject {\n public:\n  enum class ModuleType {\n    // Matches debugger Module type.\n    kKernelModule = 0,\n    kUserModule = 1,\n  };\n\n  static const XObject::Type kObjectType = XObject::Type::Module;\n\n  XModule(KernelState* kernel_state, ModuleType module_type);\n  virtual ~XModule();\n\n  ModuleType module_type() const { return module_type_; }\n  virtual const std::string& path() const = 0;\n  virtual const std::string& name() const = 0;\n  bool Matches(const std::string_view name) const;\n\n  xe::cpu::Module* processor_module() const { return processor_module_; }\n  uint32_t hmodule_ptr() const { return hmodule_ptr_; }\n\n  virtual uint32_t GetProcAddressByOrdinal(uint16_t ordinal) = 0;\n  virtual uint32_t GetProcAddressByName(const std::string_view name) = 0;\n  virtual X_STATUS GetSection(const std::string_view name,\n                              uint32_t* out_section_data,\n                              uint32_t* out_section_size);\n\n  static object_ref<XModule> GetFromHModule(KernelState* kernel_state,\n                                            void* hmodule);\n  static uint32_t GetHandleFromHModule(void* hmodule);\n\n  virtual bool Save(ByteStream* stream) override;\n  static object_ref<XModule> Restore(KernelState* kernel_state,\n                                     ByteStream* stream);\n\n protected:\n  void OnLoad();\n  void OnUnload();\n\n  ModuleType module_type_;\n\n  xe::cpu::Module* processor_module_;\n\n  uint32_t hmodule_ptr_;  // This points to LDR_DATA_TABLE_ENTRY.\n};\n\n}  // namespace kernel\n}  // namespace xe\n\n#endif  // XENIA_KERNEL_XMODULE_H_\n"
  },
  {
    "path": "src/xenia/kernel/xmutant.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/kernel/xmutant.h\"\n\n#include \"xenia/base/byte_stream.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/xthread.h\"\n\nnamespace xe {\nnamespace kernel {\n\nXMutant::XMutant(KernelState* kernel_state)\n    : XObject(kernel_state, kObjectType) {}\n\nXMutant::XMutant() : XObject(kObjectType) {}\n\nXMutant::~XMutant() = default;\n\nvoid XMutant::Initialize(bool initial_owner) {\n  assert_false(mutant_);\n\n  mutant_ = xe::threading::Mutant::Create(initial_owner);\n  assert_not_null(mutant_);\n}\n\nvoid XMutant::InitializeNative(void* native_ptr, X_DISPATCH_HEADER* header) {\n  assert_false(mutant_);\n\n  // Haven't seen this yet, but it's possible.\n  assert_always();\n}\n\nX_STATUS XMutant::ReleaseMutant(uint32_t priority_increment, bool abandon,\n                                bool wait) {\n  // Call should succeed if we own the mutant, so go ahead and do this.\n  if (owning_thread_ == XThread::GetCurrentThread()) {\n    owning_thread_ = nullptr;\n  }\n\n  // TODO(benvanik): abandoning.\n  assert_false(abandon);\n  if (mutant_->Release()) {\n    return X_STATUS_SUCCESS;\n  } else {\n    return X_STATUS_MUTANT_NOT_OWNED;\n  }\n}\n\nbool XMutant::Save(ByteStream* stream) {\n  if (!SaveObject(stream)) {\n    return false;\n  }\n\n  uint32_t owning_thread_handle = owning_thread_ ? owning_thread_->handle() : 0;\n  stream->Write<uint32_t>(owning_thread_handle);\n  XELOGD(\"XMutant {:08X} (owner: {:08X})\", handle(), owning_thread_handle);\n\n  return true;\n}\n\nobject_ref<XMutant> XMutant::Restore(KernelState* kernel_state,\n                                     ByteStream* stream) {\n  auto mutant = new XMutant();\n  mutant->kernel_state_ = kernel_state;\n\n  if (!mutant->RestoreObject(stream)) {\n    delete mutant;\n    return nullptr;\n  }\n\n  mutant->Initialize(false);\n\n  auto owning_thread_handle = stream->Read<uint32_t>();\n  if (owning_thread_handle) {\n    mutant->owning_thread_ = kernel_state->object_table()\n                                 ->LookupObject<XThread>(owning_thread_handle)\n                                 .get();\n    mutant->owning_thread_->AcquireMutantOnStartup(retain_object(mutant));\n  }\n\n  return object_ref<XMutant>(mutant);\n}\n\nvoid XMutant::WaitCallback() { owning_thread_ = XThread::GetCurrentThread(); }\n\n}  // namespace kernel\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/kernel/xmutant.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_KERNEL_XMUTANT_H_\n#define XENIA_KERNEL_XMUTANT_H_\n\n#include \"xenia/base/threading.h\"\n#include \"xenia/kernel/xobject.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace kernel {\nclass XThread;\n\nclass XMutant : public XObject {\n public:\n  static const XObject::Type kObjectType = XObject::Type::Mutant;\n\n  explicit XMutant(KernelState* kernel_state);\n  ~XMutant() override;\n\n  void Initialize(bool initial_owner);\n  void InitializeNative(void* native_ptr, X_DISPATCH_HEADER* header);\n\n  X_STATUS ReleaseMutant(uint32_t priority_increment, bool abandon, bool wait);\n\n  bool Save(ByteStream* stream) override;\n  static object_ref<XMutant> Restore(KernelState* kernel_state,\n                                     ByteStream* stream);\n\n protected:\n  xe::threading::WaitHandle* GetWaitHandle() override { return mutant_.get(); }\n  void WaitCallback() override;\n\n private:\n  XMutant();\n\n  std::unique_ptr<xe::threading::Mutant> mutant_;\n  XThread* owning_thread_ = nullptr;\n};\n\n}  // namespace kernel\n}  // namespace xe\n\n#endif  // XENIA_KERNEL_XMUTANT_H_\n"
  },
  {
    "path": "src/xenia/kernel/xnotifylistener.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/kernel/xnotifylistener.h\"\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/byte_stream.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/kernel/kernel_state.h\"\n\nnamespace xe {\nnamespace kernel {\n\nXNotifyListener::XNotifyListener(KernelState* kernel_state)\n    : XObject(kernel_state, kObjectType) {}\n\nXNotifyListener::~XNotifyListener() {}\n\nvoid XNotifyListener::Initialize(uint64_t mask, uint32_t max_version) {\n  assert_false(wait_handle_);\n\n  wait_handle_ = xe::threading::Event::CreateManualResetEvent(false);\n  assert_not_null(wait_handle_);\n  mask_ = mask;\n  max_version_ = max_version;\n\n  kernel_state_->RegisterNotifyListener(this);\n}\n\nvoid XNotifyListener::EnqueueNotification(XNotificationID id, uint32_t data) {\n  auto key = XNotificationKey(id);\n  // Ignore if the notification doesn't match our mask.\n  if ((mask_ & uint64_t(1ULL << key.mask_index)) == 0) {\n    return;\n  }\n  // Ignore if the notification is too new.\n  if (key.version > max_version_) {\n    return;\n  }\n  auto global_lock = global_critical_region_.Acquire();\n  notifications_.push_back(std::pair<XNotificationID, uint32_t>(id, data));\n  wait_handle_->Set();\n}\n\nbool XNotifyListener::DequeueNotification(XNotificationID* out_id,\n                                          uint32_t* out_data) {\n  auto global_lock = global_critical_region_.Acquire();\n  bool dequeued = false;\n  if (notifications_.size()) {\n    dequeued = true;\n    auto it = notifications_.begin();\n    *out_id = it->first;\n    *out_data = it->second;\n    notifications_.erase(it);\n    if (!notifications_.size()) {\n      wait_handle_->Reset();\n    }\n  }\n  return dequeued;\n}\n\nbool XNotifyListener::DequeueNotification(XNotificationID id,\n                                          uint32_t* out_data) {\n  auto global_lock = global_critical_region_.Acquire();\n  if (!notifications_.size()) {\n    return false;\n  }\n  bool dequeued = false;\n  for (auto it = notifications_.begin(); it != notifications_.end(); ++it) {\n    if (it->first != id) {\n      continue;\n    }\n    dequeued = true;\n    *out_data = it->second;\n    notifications_.erase(it);\n    if (!notifications_.size()) {\n      wait_handle_->Reset();\n    }\n    break;\n  }\n  return dequeued;\n}\n\nbool XNotifyListener::Save(ByteStream* stream) {\n  SaveObject(stream);\n\n  stream->Write(mask_);\n  stream->Write(max_version_);\n  stream->Write(notifications_.size());\n  for (auto pair : notifications_) {\n    stream->Write<uint32_t>(pair.first);\n    stream->Write<uint32_t>(pair.second);\n  }\n\n  return true;\n}\n\nobject_ref<XNotifyListener> XNotifyListener::Restore(KernelState* kernel_state,\n                                                     ByteStream* stream) {\n  auto notify = new XNotifyListener(nullptr);\n  notify->kernel_state_ = kernel_state;\n\n  notify->RestoreObject(stream);\n\n  auto mask = stream->Read<uint64_t>();\n  auto max_version = stream->Read<uint32_t>();\n  notify->Initialize(mask, max_version);\n\n  auto notification_count_ = stream->Read<size_t>();\n  for (size_t i = 0; i < notification_count_; i++) {\n    std::pair<XNotificationID, uint32_t> pair;\n    pair.first = stream->Read<uint32_t>();\n    pair.second = stream->Read<uint32_t>();\n    notify->notifications_.push_back(pair);\n  }\n\n  return object_ref<XNotifyListener>(notify);\n}\n\n}  // namespace kernel\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/kernel/xnotifylistener.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_KERNEL_XNOTIFYLISTENER_H_\n#define XENIA_KERNEL_XNOTIFYLISTENER_H_\n\n#include <memory>\n#include <unordered_map>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/mutex.h\"\n#include \"xenia/base/threading.h\"\n#include \"xenia/kernel/xobject.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace kernel {\n\nunion XNotificationKey {\n  XNotificationID id;\n  struct {\n    uint32_t local_id : 16;\n    uint32_t version : 9;\n    uint32_t mask_index : 6;\n    uint32_t : 1;\n  };\n\n  constexpr XNotificationKey(\n      XNotificationID notification_id = XNotificationID(0))\n      : id(notification_id) {\n    static_assert_size(*this, sizeof(id));\n  }\n\n  constexpr operator XNotificationID() { return id; }\n};\n\nclass XNotifyListener : public XObject {\n public:\n  static const XObject::Type kObjectType = XObject::Type::NotifyListener;\n\n  explicit XNotifyListener(KernelState* kernel_state);\n  ~XNotifyListener() override;\n\n  uint64_t mask() const { return mask_; }\n  uint32_t max_version() const { return max_version_; }\n\n  void Initialize(uint64_t mask, uint32_t max_version);\n\n  void EnqueueNotification(XNotificationID id, uint32_t data);\n  bool DequeueNotification(XNotificationID* out_id, uint32_t* out_data);\n  bool DequeueNotification(XNotificationID id, uint32_t* out_data);\n\n  bool Save(ByteStream* stream) override;\n  static object_ref<XNotifyListener> Restore(KernelState* kernel_state,\n                                             ByteStream* stream);\n\n protected:\n  xe::threading::WaitHandle* GetWaitHandle() override {\n    return wait_handle_.get();\n  }\n\n private:\n  std::unique_ptr<xe::threading::Event> wait_handle_;\n  xe::global_critical_region global_critical_region_;\n  std::vector<std::pair<XNotificationID, uint32_t>> notifications_;\n  uint64_t mask_ = 0;\n  uint32_t max_version_ = 0;\n};\n\n}  // namespace kernel\n}  // namespace xe\n\n#endif  // XENIA_KERNEL_XNOTIFYLISTENER_H_\n"
  },
  {
    "path": "src/xenia/kernel/xobject.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/kernel/xobject.h\"\n\n#include <vector>\n\n#include \"xenia/base/byte_stream.h\"\n#include \"xenia/base/clock.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/util/shim_utils.h\"\n#include \"xenia/kernel/xboxkrnl/xboxkrnl_private.h\"\n#include \"xenia/kernel/xenumerator.h\"\n#include \"xenia/kernel/xevent.h\"\n#include \"xenia/kernel/xfile.h\"\n#include \"xenia/kernel/xmodule.h\"\n#include \"xenia/kernel/xmutant.h\"\n#include \"xenia/kernel/xnotifylistener.h\"\n#include \"xenia/kernel/xsemaphore.h\"\n#include \"xenia/kernel/xsymboliclink.h\"\n#include \"xenia/kernel/xthread.h\"\n\nnamespace xe {\nnamespace kernel {\n\nXObject::XObject(Type type)\n    : kernel_state_(nullptr), pointer_ref_count_(1), type_(type) {\n  handles_.reserve(10);\n}\n\nXObject::XObject(KernelState* kernel_state, Type type)\n    : kernel_state_(kernel_state),\n      type_(type),\n      pointer_ref_count_(1),\n      guest_object_ptr_(0),\n      allocated_guest_object_(false) {\n  handles_.reserve(10);\n\n  // TODO: Assert kernel_state != nullptr in this constructor.\n  if (kernel_state) {\n    kernel_state->object_table()->AddHandle(this, nullptr);\n  }\n}\n\nXObject::~XObject() {\n  assert_true(handles_.empty());\n  assert_zero(pointer_ref_count_);\n\n  if (allocated_guest_object_) {\n    uint32_t ptr = guest_object_ptr_ - sizeof(X_OBJECT_HEADER);\n    auto header = memory()->TranslateVirtual<X_OBJECT_HEADER*>(ptr);\n\n    // Free the object creation info\n    if (header->object_type_ptr) {\n      memory()->SystemHeapFree(header->object_type_ptr);\n    }\n\n    memory()->SystemHeapFree(ptr);\n  }\n}\n\nEmulator* XObject::emulator() const { return kernel_state_->emulator_; }\nKernelState* XObject::kernel_state() const { return kernel_state_; }\nMemory* XObject::memory() const { return kernel_state_->memory(); }\n\nXObject::Type XObject::type() const { return type_; }\n\nvoid XObject::RetainHandle() {\n  kernel_state_->object_table()->RetainHandle(handles_[0]);\n}\n\nbool XObject::ReleaseHandle() {\n  // FIXME: Return true when handle is actually released.\n  return kernel_state_->object_table()->ReleaseHandle(handles_[0]) ==\n         X_STATUS_SUCCESS;\n}\n\nvoid XObject::Retain() { ++pointer_ref_count_; }\n\nvoid XObject::Release() {\n  if (--pointer_ref_count_ == 0) {\n    delete this;\n  }\n}\n\nX_STATUS XObject::Delete() {\n  if (kernel_state_ == nullptr) {\n    // Fake return value for api-scanner\n    return X_STATUS_SUCCESS;\n  } else {\n    if (!name_.empty()) {\n      kernel_state_->object_table()->RemoveNameMapping(name_);\n    }\n    return kernel_state_->object_table()->RemoveHandle(handles_[0]);\n  }\n}\n\nbool XObject::SaveObject(ByteStream* stream) {\n  stream->Write<uint32_t>(allocated_guest_object_);\n  stream->Write<uint32_t>(guest_object_ptr_);\n\n  stream->Write(uint32_t(handles_.size()));\n  stream->Write(&handles_[0], handles_.size() * sizeof(X_HANDLE));\n\n  return true;\n}\n\nbool XObject::RestoreObject(ByteStream* stream) {\n  allocated_guest_object_ = stream->Read<uint32_t>() > 0;\n  guest_object_ptr_ = stream->Read<uint32_t>();\n\n  handles_.resize(stream->Read<uint32_t>());\n  stream->Read(&handles_[0], handles_.size() * sizeof(X_HANDLE));\n\n  // Restore our pointer to our handles in the object table.\n  for (size_t i = 0; i < handles_.size(); i++) {\n    kernel_state_->object_table()->RestoreHandle(handles_[i], this);\n  }\n\n  return true;\n}\n\nobject_ref<XObject> XObject::Restore(KernelState* kernel_state, Type type,\n                                     ByteStream* stream) {\n  switch (type) {\n    case Type::Enumerator:\n      break;\n    case Type::Event:\n      return XEvent::Restore(kernel_state, stream);\n    case Type::File:\n      return XFile::Restore(kernel_state, stream);\n    case Type::IOCompletion:\n      break;\n    case Type::Module:\n      return XModule::Restore(kernel_state, stream);\n    case Type::Mutant:\n      return XMutant::Restore(kernel_state, stream);\n    case Type::NotifyListener:\n      return XNotifyListener::Restore(kernel_state, stream);\n    case Type::Semaphore:\n      return XSemaphore::Restore(kernel_state, stream);\n    case Type::Session:\n      break;\n    case Type::Socket:\n      break;\n    case Type::SymbolicLink:\n      return XSymbolicLink::Restore(kernel_state, stream);\n    case Type::Thread:\n      return XThread::Restore(kernel_state, stream);\n    case Type::Timer:\n      break;\n    case Type::Undefined:\n      break;\n  }\n\n  assert_always(\"No restore handler exists for this object!\");\n  return nullptr;\n}\n\nvoid XObject::SetAttributes(uint32_t obj_attributes_ptr) {\n  if (!obj_attributes_ptr) {\n    return;\n  }\n\n  auto name = util::TranslateAnsiStringAddress(\n      memory(), xe::load_and_swap<uint32_t>(\n                    memory()->TranslateVirtual(obj_attributes_ptr + 4)));\n  if (!name.empty()) {\n    name_ = std::string(name);\n    kernel_state_->object_table()->AddNameMapping(name_, handles_[0]);\n  }\n}\n\nuint32_t XObject::TimeoutTicksToMs(int64_t timeout_ticks) {\n  if (timeout_ticks > 0) {\n    // Absolute time, based on January 1, 1601.\n    // TODO(benvanik): convert time to relative time.\n    assert_always();\n    return 0;\n  } else if (timeout_ticks < 0) {\n    // Relative time.\n    return (uint32_t)(-timeout_ticks / 10000);  // Ticks -> MS\n  } else {\n    return 0;\n  }\n}\n\nX_STATUS XObject::Wait(uint32_t wait_reason, uint32_t processor_mode,\n                       uint32_t alertable, uint64_t* opt_timeout) {\n  auto wait_handle = GetWaitHandle();\n  if (!wait_handle) {\n    // Object doesn't support waiting.\n    return X_STATUS_SUCCESS;\n  }\n\n  auto timeout_ms =\n      opt_timeout ? std::chrono::milliseconds(Clock::ScaleGuestDurationMillis(\n                        TimeoutTicksToMs(*opt_timeout)))\n                  : std::chrono::milliseconds::max();\n\n  auto result =\n      xe::threading::Wait(wait_handle, alertable ? true : false, timeout_ms);\n  switch (result) {\n    case xe::threading::WaitResult::kSuccess:\n      WaitCallback();\n      return X_STATUS_SUCCESS;\n    case xe::threading::WaitResult::kUserCallback:\n      // Or X_STATUS_ALERTED?\n      return X_STATUS_USER_APC;\n    case xe::threading::WaitResult::kTimeout:\n      xe::threading::MaybeYield();\n      return X_STATUS_TIMEOUT;\n    default:\n    case xe::threading::WaitResult::kAbandoned:\n    case xe::threading::WaitResult::kFailed:\n      return X_STATUS_ABANDONED_WAIT_0;\n  }\n}\n\nX_STATUS XObject::SignalAndWait(XObject* signal_object, XObject* wait_object,\n                                uint32_t wait_reason, uint32_t processor_mode,\n                                uint32_t alertable, uint64_t* opt_timeout) {\n  auto timeout_ms =\n      opt_timeout ? std::chrono::milliseconds(Clock::ScaleGuestDurationMillis(\n                        TimeoutTicksToMs(*opt_timeout)))\n                  : std::chrono::milliseconds::max();\n\n  auto result = xe::threading::SignalAndWait(\n      signal_object->GetWaitHandle(), wait_object->GetWaitHandle(),\n      alertable ? true : false, timeout_ms);\n  switch (result) {\n    case xe::threading::WaitResult::kSuccess:\n      wait_object->WaitCallback();\n      return X_STATUS_SUCCESS;\n    case xe::threading::WaitResult::kUserCallback:\n      // Or X_STATUS_ALERTED?\n      return X_STATUS_USER_APC;\n    case xe::threading::WaitResult::kTimeout:\n      xe::threading::MaybeYield();\n      return X_STATUS_TIMEOUT;\n    default:\n    case xe::threading::WaitResult::kAbandoned:\n    case xe::threading::WaitResult::kFailed:\n      return X_STATUS_ABANDONED_WAIT_0;\n  }\n}\n\nX_STATUS XObject::WaitMultiple(uint32_t count, XObject** objects,\n                               uint32_t wait_type, uint32_t wait_reason,\n                               uint32_t processor_mode, uint32_t alertable,\n                               uint64_t* opt_timeout) {\n  std::vector<xe::threading::WaitHandle*> wait_handles(count);\n  for (size_t i = 0; i < count; ++i) {\n    wait_handles[i] = objects[i]->GetWaitHandle();\n    assert_not_null(wait_handles[i]);\n  }\n\n  auto timeout_ms =\n      opt_timeout ? std::chrono::milliseconds(Clock::ScaleGuestDurationMillis(\n                        TimeoutTicksToMs(*opt_timeout)))\n                  : std::chrono::milliseconds::max();\n\n  if (wait_type) {\n    auto result = xe::threading::WaitAny(std::move(wait_handles),\n                                         alertable ? true : false, timeout_ms);\n    switch (result.first) {\n      case xe::threading::WaitResult::kSuccess:\n        objects[result.second]->WaitCallback();\n\n        return X_STATUS(result.second);\n      case xe::threading::WaitResult::kUserCallback:\n        // Or X_STATUS_ALERTED?\n        return X_STATUS_USER_APC;\n      case xe::threading::WaitResult::kTimeout:\n        xe::threading::MaybeYield();\n        return X_STATUS_TIMEOUT;\n      default:\n      case xe::threading::WaitResult::kAbandoned:\n        return X_STATUS(X_STATUS_ABANDONED_WAIT_0 + result.second);\n      case xe::threading::WaitResult::kFailed:\n        return X_STATUS_UNSUCCESSFUL;\n    }\n  } else {\n    auto result = xe::threading::WaitAll(std::move(wait_handles),\n                                         alertable ? true : false, timeout_ms);\n    switch (result) {\n      case xe::threading::WaitResult::kSuccess:\n        for (uint32_t i = 0; i < count; i++) {\n          objects[i]->WaitCallback();\n        }\n\n        return X_STATUS_SUCCESS;\n      case xe::threading::WaitResult::kUserCallback:\n        // Or X_STATUS_ALERTED?\n        return X_STATUS_USER_APC;\n      case xe::threading::WaitResult::kTimeout:\n        xe::threading::MaybeYield();\n        return X_STATUS_TIMEOUT;\n      default:\n      case xe::threading::WaitResult::kAbandoned:\n      case xe::threading::WaitResult::kFailed:\n        return X_STATUS_ABANDONED_WAIT_0;\n    }\n  }\n}\n\nuint8_t* XObject::CreateNative(uint32_t size) {\n  auto global_lock = xe::global_critical_region::AcquireDirect();\n\n  uint32_t total_size = size + sizeof(X_OBJECT_HEADER);\n\n  auto mem = memory()->SystemHeapAlloc(total_size);\n  if (!mem) {\n    // Out of memory!\n    return nullptr;\n  }\n\n  allocated_guest_object_ = true;\n  memory()->Zero(mem, total_size);\n  SetNativePointer(mem + sizeof(X_OBJECT_HEADER), true);\n\n  auto header = memory()->TranslateVirtual<X_OBJECT_HEADER*>(mem);\n\n  auto object_type = memory()->SystemHeapAlloc(sizeof(X_OBJECT_TYPE));\n  if (object_type) {\n    // Set it up in the header.\n    // Some kernel method is accessing this struct and dereferencing a member\n    // @ offset 0x14\n    header->object_type_ptr = object_type;\n  }\n\n  return memory()->TranslateVirtual(guest_object_ptr_);\n}\n\nvoid XObject::SetNativePointer(uint32_t native_ptr, bool uninitialized) {\n  auto global_lock = xe::global_critical_region::AcquireDirect();\n\n  // If hit: We've already setup the native ptr with CreateNative!\n  assert_zero(guest_object_ptr_);\n\n  auto header =\n      kernel_state_->memory()->TranslateVirtual<X_DISPATCH_HEADER*>(native_ptr);\n\n  // Memory uninitialized, so don't bother with the check.\n  if (!uninitialized) {\n    assert_true(!(header->wait_list_blink & 0x1));\n  }\n\n  // Stash pointer in struct.\n  // FIXME: This assumes the object has a dispatch header (some don't!)\n  StashHandle(header, handle());\n\n  guest_object_ptr_ = native_ptr;\n}\n\nobject_ref<XObject> XObject::GetNativeObject(KernelState* kernel_state,\n                                             void* native_ptr,\n                                             int32_t as_type) {\n  assert_not_null(native_ptr);\n\n  // Unfortunately the XDK seems to inline some KeInitialize calls, meaning\n  // we never see it and just randomly start getting passed events/timers/etc.\n  // Luckily it seems like all other calls (Set/Reset/Wait/etc) are used and\n  // we don't have to worry about PPC code poking the struct. Because of that,\n  // we init on first use, store our handle in the struct, and dereference it\n  // each time.\n  // We identify this by setting wait_list_flink to a magic value. When set,\n  // wait_list_blink will hold a handle to our object.\n\n  auto global_lock = xe::global_critical_region::AcquireDirect();\n\n  auto header = reinterpret_cast<X_DISPATCH_HEADER*>(native_ptr);\n\n  if (as_type == -1) {\n    as_type = header->type;\n  }\n\n  if (header->wait_list_flink == kXObjSignature) {\n    // Already initialized.\n    // TODO: assert if the type of the object != as_type\n    uint32_t handle = header->wait_list_blink;\n    auto object = kernel_state->object_table()->LookupObject<XObject>(handle);\n\n    // TODO(benvanik): assert nothing has been changed in the struct.\n    return object;\n  } else {\n    // First use, create new.\n    // https://www.nirsoft.net/kernel_struct/vista/KOBJECTS.html\n    XObject* object = nullptr;\n    switch (as_type) {\n      case 0:  // EventNotificationObject\n      case 1:  // EventSynchronizationObject\n      {\n        auto ev = new XEvent(kernel_state);\n        ev->InitializeNative(native_ptr, header);\n        object = ev;\n      } break;\n      case 2:  // MutantObject\n      {\n        auto mutant = new XMutant(kernel_state);\n        mutant->InitializeNative(native_ptr, header);\n        object = mutant;\n      } break;\n      case 5:  // SemaphoreObject\n      {\n        auto sem = new XSemaphore(kernel_state);\n        auto success = sem->InitializeNative(native_ptr, header);\n        // Can't report failure to the guest at late initialization:\n        assert_true(success);\n        object = sem;\n      } break;\n      case 3:   // ProcessObject\n      case 4:   // QueueObject\n      case 6:   // ThreadObject\n      case 7:   // GateObject\n      case 8:   // TimerNotificationObject\n      case 9:   // TimerSynchronizationObject\n      case 18:  // ApcObject\n      case 19:  // DpcObject\n      case 20:  // DeviceQueueObject\n      case 21:  // EventPairObject\n      case 22:  // InterruptObject\n      case 23:  // ProfileObject\n      case 24:  // ThreadedDpcObject\n      default:\n        assert_always();\n        return NULL;\n    }\n\n    // Stash pointer in struct.\n    // FIXME: This assumes the object contains a dispatch header (some don't!)\n    StashHandle(header, object->handle());\n\n    return object_ref<XObject>(object);\n  }\n}\n\n}  // namespace kernel\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/kernel/xobject.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_KERNEL_XOBJECT_H_\n#define XENIA_KERNEL_XOBJECT_H_\n\n#include <algorithm>\n#include <atomic>\n#include <cstddef>\n#include <string>\n\n#include \"xenia/base/threading.h\"\n#include \"xenia/memory.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nclass ByteStream;\nclass Emulator;\n}  // namespace xe\n\nnamespace xe {\nnamespace kernel {\n\nconstexpr fourcc_t kXObjSignature = make_fourcc('X', 'E', 'N', '\\0');\n\nclass KernelState;\n\ntemplate <typename T>\nclass object_ref;\n\n// https://www.nirsoft.net/kernel_struct/vista/DISPATCHER_HEADER.html\ntypedef struct {\n  struct {\n    uint8_t type;\n\n    union {\n      uint8_t abandoned;\n      uint8_t absolute;\n      uint8_t npx_irql;\n      uint8_t signalling;\n    };\n    union {\n      uint8_t size;\n      uint8_t hand;\n    };\n    union {\n      uint8_t inserted;\n      uint8_t debug_active;\n      uint8_t dpc_active;\n    };\n  };\n\n  xe::be<uint32_t> signal_state;\n  xe::be<uint32_t> wait_list_flink;\n  xe::be<uint32_t> wait_list_blink;\n} X_DISPATCH_HEADER;\nstatic_assert_size(X_DISPATCH_HEADER, 0x10);\n\n// https://www.nirsoft.net/kernel_struct/vista/OBJECT_HEADER.html\nstruct X_OBJECT_HEADER {\n  xe::be<uint32_t> pointer_count;\n  union {\n    xe::be<uint32_t> handle_count;\n    xe::be<uint32_t> next_to_free;\n  };\n  uint8_t name_info_offset;\n  uint8_t handle_info_offset;\n  uint8_t quota_info_offset;\n  uint8_t flags;\n  union {\n    xe::be<uint32_t> object_create_info;  // X_OBJECT_CREATE_INFORMATION\n    xe::be<uint32_t> quota_block_charged;\n  };\n  xe::be<uint32_t> object_type_ptr;  // -0x8 POBJECT_TYPE\n  xe::be<uint32_t> unk_04;           // -0x4\n\n  // Object lives after this header.\n  // (There's actually a body field here which is the object itself)\n};\n\n// https://www.nirsoft.net/kernel_struct/vista/OBJECT_CREATE_INFORMATION.html\nstruct X_OBJECT_CREATE_INFORMATION {\n  xe::be<uint32_t> attributes;                  // 0x0\n  xe::be<uint32_t> root_directory_ptr;          // 0x4\n  xe::be<uint32_t> parse_context_ptr;           // 0x8\n  xe::be<uint32_t> probe_mode;                  // 0xC\n  xe::be<uint32_t> paged_pool_charge;           // 0x10\n  xe::be<uint32_t> non_paged_pool_charge;       // 0x14\n  xe::be<uint32_t> security_descriptor_charge;  // 0x18\n  xe::be<uint32_t> security_descriptor;         // 0x1C\n  xe::be<uint32_t> security_qos_ptr;            // 0x20\n\n  // Security QoS here (SECURITY_QUALITY_OF_SERVICE) too!\n};\n\nstruct X_OBJECT_TYPE {\n  xe::be<uint32_t> constructor;  // 0x0\n  xe::be<uint32_t> destructor;   // 0x4\n  xe::be<uint32_t> unk_08;       // 0x8\n  xe::be<uint32_t> unk_0C;       // 0xC\n  xe::be<uint32_t> unk_10;       // 0x10\n  xe::be<uint32_t> unk_14;    // 0x14 probably offset from ntobject to keobject\n  xe::be<uint32_t> pool_tag;  // 0x18\n};\n\nclass XObject {\n public:\n  // 45410806 needs proper handle value for certain calculations\n  // It gets handle value from TLS (without base handle value is 0x88)\n  // and substract 0xF8000088. Without base we're receiving wrong address\n  // Instead of receiving address that starts with 0x82... we're receiving\n  // one with 0x8A... which causes crash\n  static constexpr uint32_t kHandleBase = 0xF8000000;\n\n  enum class Type : uint32_t {\n    Undefined,\n    Enumerator,\n    Event,\n    File,\n    IOCompletion,\n    Module,\n    Mutant,\n    NotifyListener,\n    Semaphore,\n    Session,\n    Socket,\n    SymbolicLink,\n    Thread,\n    Timer,\n  };\n\n  XObject(Type type);\n  XObject(KernelState* kernel_state, Type type);\n  virtual ~XObject();\n\n  Emulator* emulator() const;\n  KernelState* kernel_state() const;\n  Memory* memory() const;\n\n  Type type() const;\n\n  // Returns the primary handle of this object.\n  X_HANDLE handle() const { return handles_[0]; }\n\n  // Returns all associated handles with this object.\n  std::vector<X_HANDLE> handles() const { return handles_; }\n  std::vector<X_HANDLE>& handles() { return handles_; }\n\n  const std::string& name() const { return name_; }\n  uint32_t guest_object() const { return guest_object_ptr_; }\n\n  // Has this object been created for use by the host?\n  // Host objects are persisted through reloads/etc.\n  bool is_host_object() const { return host_object_; }\n  void set_host_object(bool host_object) { host_object_ = host_object; }\n\n  template <typename T>\n  T* guest_object() {\n    return memory()->TranslateVirtual<T*>(guest_object_ptr_);\n  }\n\n  void RetainHandle();\n  bool ReleaseHandle();\n  void Retain();\n  void Release();\n  X_STATUS Delete();\n\n  virtual bool Save(ByteStream* stream) { return false; }\n  static object_ref<XObject> Restore(KernelState* kernel_state, Type type,\n                                     ByteStream* stream);\n\n  // Reference()\n  // Dereference()\n\n  void SetAttributes(uint32_t obj_attributes_ptr);\n\n  X_STATUS Wait(uint32_t wait_reason, uint32_t processor_mode,\n                uint32_t alertable, uint64_t* opt_timeout);\n  static X_STATUS SignalAndWait(XObject* signal_object, XObject* wait_object,\n                                uint32_t wait_reason, uint32_t processor_mode,\n                                uint32_t alertable, uint64_t* opt_timeout);\n  static X_STATUS WaitMultiple(uint32_t count, XObject** objects,\n                               uint32_t wait_type, uint32_t wait_reason,\n                               uint32_t processor_mode, uint32_t alertable,\n                               uint64_t* opt_timeout);\n\n  static object_ref<XObject> GetNativeObject(KernelState* kernel_state,\n                                             void* native_ptr,\n                                             int32_t as_type = -1);\n  template <typename T>\n  static object_ref<T> GetNativeObject(KernelState* kernel_state,\n                                       void* native_ptr, int32_t as_type = -1);\n\n protected:\n  bool SaveObject(ByteStream* stream);\n  bool RestoreObject(ByteStream* stream);\n\n  // Called on successful wait.\n  virtual void WaitCallback() {}\n  virtual xe::threading::WaitHandle* GetWaitHandle() { return nullptr; }\n\n  // Creates the kernel object for guest code to use. Typically not needed.\n  uint8_t* CreateNative(uint32_t size);\n  void SetNativePointer(uint32_t native_ptr, bool uninitialized = false);\n\n  template <typename T>\n  T* CreateNative() {\n    return reinterpret_cast<T*>(CreateNative(sizeof(T)));\n  }\n\n  // Stash native pointer into X_DISPATCH_HEADER\n  static void StashHandle(X_DISPATCH_HEADER* header, uint32_t handle) {\n    header->wait_list_flink = kXObjSignature;\n    header->wait_list_blink = handle;\n  }\n\n  static uint32_t TimeoutTicksToMs(int64_t timeout_ticks);\n\n  KernelState* kernel_state_;\n\n  // Host objects are persisted through resets/etc.\n  bool host_object_ = false;\n\n private:\n  std::atomic<int32_t> pointer_ref_count_;\n\n  Type type_;\n  std::vector<X_HANDLE> handles_;\n  std::string name_;  // May be zero length.\n\n  // Guest pointer for kernel object. Remember: X_OBJECT_HEADER precedes this\n  // if we allocated it!\n  uint32_t guest_object_ptr_ = 0;\n  bool allocated_guest_object_ = false;\n};\n\ntemplate <typename T>\nclass object_ref {\n public:\n  object_ref() noexcept : value_(nullptr) {}\n  object_ref(std::nullptr_t) noexcept  // NOLINT(runtime/explicit)\n      : value_(nullptr) {}\n  object_ref& operator=(std::nullptr_t) noexcept {\n    reset();\n    return (*this);\n  }\n\n  explicit object_ref(T* value) noexcept : value_(value) {\n    // Assumes retained on call.\n  }\n  explicit object_ref(const object_ref& right) noexcept {\n    reset(right.get());\n    if (value_) value_->Retain();\n  }\n  template <class V, class = typename std::enable_if<\n                         std::is_convertible<V*, T*>::value, void>::type>\n  object_ref(const object_ref<V>& right) noexcept {\n    reset(right.get());\n    if (value_) value_->Retain();\n  }\n\n  object_ref(object_ref&& right) noexcept : value_(right.release()) {}\n  object_ref& operator=(object_ref&& right) noexcept {\n    object_ref(std::move(right)).swap(*this);\n    return (*this);\n  }\n  template <typename V>\n  object_ref& operator=(object_ref<V>&& right) noexcept {\n    object_ref(std::move(right)).swap(*this);\n    return (*this);\n  }\n\n  object_ref& operator=(const object_ref& right) noexcept {\n    object_ref(right).swap(*this);  // NOLINT(runtime/explicit): misrecognized?\n    return (*this);\n  }\n  template <typename V>\n  object_ref& operator=(const object_ref<V>& right) noexcept {\n    object_ref(right).swap(*this);  // NOLINT(runtime/explicit): misrecognized?\n    return (*this);\n  }\n\n  void swap(object_ref& right) noexcept { std::swap(value_, right.value_); }\n\n  ~object_ref() noexcept {\n    if (value_) {\n      value_->Release();\n      value_ = nullptr;\n    }\n  }\n\n  typename std::add_lvalue_reference<T>::type operator*() const {\n    return (*get());\n  }\n\n  T* operator->() const noexcept {\n    return std::pointer_traits<T*>::pointer_to(**this);\n  }\n\n  T* get() const noexcept { return value_; }\n\n  template <typename V>\n  V* get() const noexcept {\n    return reinterpret_cast<V*>(value_);\n  }\n\n  explicit operator bool() const noexcept { return value_ != nullptr; }\n\n  T* release() noexcept {\n    T* value = value_;\n    value_ = nullptr;\n    return value;\n  }\n\n  void reset() noexcept { object_ref().swap(*this); }\n\n  void reset(T* value) noexcept { object_ref(value).swap(*this); }\n\n  inline bool operator==(const T* right) noexcept { return value_ == right; }\n\n private:\n  T* value_ = nullptr;\n};\n\ntemplate <class _Ty>\nbool operator==(const object_ref<_Ty>& _Left, std::nullptr_t) noexcept {\n  return (_Left.get() == reinterpret_cast<_Ty*>(0));\n}\n\ntemplate <class _Ty>\nbool operator==(std::nullptr_t, const object_ref<_Ty>& _Right) noexcept {\n  return (reinterpret_cast<_Ty*>(0) == _Right.get());\n}\n\ntemplate <class _Ty>\nbool operator!=(const object_ref<_Ty>& _Left, std::nullptr_t _Right) noexcept {\n  return (!(_Left == _Right));\n}\n\ntemplate <class _Ty>\nbool operator!=(std::nullptr_t _Left, const object_ref<_Ty>& _Right) noexcept {\n  return (!(_Left == _Right));\n}\n\ntemplate <class T, class... Args>\nstd::enable_if_t<!std::is_array<T>::value, object_ref<T>> make_object(\n    Args&&... args) {\n  return object_ref<T>(new T(std::forward<Args>(args)...));\n}\n\ntemplate <typename T>\nobject_ref<T> retain_object(T* ptr) {\n  if (ptr) ptr->Retain();\n  return object_ref<T>(ptr);\n}\n\ntemplate <typename T>\nobject_ref<T> XObject::GetNativeObject(KernelState* kernel_state,\n                                       void* native_ptr, int32_t as_type) {\n  return object_ref<T>(reinterpret_cast<T*>(\n      GetNativeObject(kernel_state, native_ptr, as_type).release()));\n}\n\n}  // namespace kernel\n}  // namespace xe\n\n#endif  // XENIA_KERNEL_XOBJECT_H_\n"
  },
  {
    "path": "src/xenia/kernel/xsemaphore.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/kernel/xsemaphore.h\"\n\n#include \"xenia/base/byte_stream.h\"\n#include \"xenia/base/logging.h\"\n\nnamespace xe {\nnamespace kernel {\n\nXSemaphore::XSemaphore(KernelState* kernel_state)\n    : XObject(kernel_state, kObjectType) {}\n\nXSemaphore::~XSemaphore() = default;\n\nbool XSemaphore::Initialize(int32_t initial_count, int32_t maximum_count) {\n  assert_false(semaphore_);\n\n  CreateNative(sizeof(X_KSEMAPHORE));\n\n  maximum_count_ = maximum_count;\n  semaphore_ = xe::threading::Semaphore::Create(initial_count, maximum_count);\n  return !!semaphore_;\n}\n\nbool XSemaphore::InitializeNative(void* native_ptr, X_DISPATCH_HEADER* header) {\n  assert_false(semaphore_);\n\n  auto semaphore = reinterpret_cast<X_KSEMAPHORE*>(native_ptr);\n  maximum_count_ = semaphore->limit;\n  semaphore_ = xe::threading::Semaphore::Create(semaphore->header.signal_state,\n                                                semaphore->limit);\n  return !!semaphore_;\n}\n\nint32_t XSemaphore::ReleaseSemaphore(int32_t release_count) {\n  int32_t previous_count = 0;\n  semaphore_->Release(release_count, &previous_count);\n  return previous_count;\n}\n\nbool XSemaphore::Save(ByteStream* stream) {\n  if (!SaveObject(stream)) {\n    return false;\n  }\n\n  // Get the free number of slots from the semaphore.\n  uint32_t free_count = 0;\n  while (\n      threading::Wait(semaphore_.get(), false, std::chrono::milliseconds(0)) ==\n      threading::WaitResult::kSuccess) {\n    free_count++;\n  }\n\n  XELOGD(\"XSemaphore {:08X} (count {}/{})\", handle(), free_count,\n         maximum_count_);\n\n  // Restore the semaphore back to its previous count.\n  semaphore_->Release(free_count, nullptr);\n\n  stream->Write(maximum_count_);\n  stream->Write(free_count);\n\n  return true;\n}\n\nobject_ref<XSemaphore> XSemaphore::Restore(KernelState* kernel_state,\n                                           ByteStream* stream) {\n  auto sem = new XSemaphore(nullptr);\n  sem->kernel_state_ = kernel_state;\n\n  if (!sem->RestoreObject(stream)) {\n    return nullptr;\n  }\n\n  sem->maximum_count_ = stream->Read<uint32_t>();\n  auto free_count = stream->Read<uint32_t>();\n  XELOGD(\"XSemaphore {:08X} (count {}/{})\", sem->handle(), free_count,\n         sem->maximum_count_);\n\n  sem->semaphore_ =\n      threading::Semaphore::Create(free_count, sem->maximum_count_);\n  assert_not_null(sem->semaphore_);\n\n  return object_ref<XSemaphore>(sem);\n}\n\n}  // namespace kernel\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/kernel/xsemaphore.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_KERNEL_XSEMAPHORE_H_\n#define XENIA_KERNEL_XSEMAPHORE_H_\n\n#include \"xenia/base/threading.h\"\n#include \"xenia/kernel/xobject.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace kernel {\n\nstruct X_KSEMAPHORE {\n  X_DISPATCH_HEADER header;\n  xe::be<uint32_t> limit;\n};\nstatic_assert_size(X_KSEMAPHORE, 0x14);\n\nclass XSemaphore : public XObject {\n public:\n  static const XObject::Type kObjectType = XObject::Type::Semaphore;\n\n  explicit XSemaphore(KernelState* kernel_state);\n  ~XSemaphore() override;\n\n  [[nodiscard]] bool Initialize(int32_t initial_count, int32_t maximum_count);\n  [[nodiscard]] bool InitializeNative(void* native_ptr,\n                                      X_DISPATCH_HEADER* header);\n\n  int32_t ReleaseSemaphore(int32_t release_count);\n\n  bool Save(ByteStream* stream) override;\n  static object_ref<XSemaphore> Restore(KernelState* kernel_state,\n                                        ByteStream* stream);\n\n protected:\n  xe::threading::WaitHandle* GetWaitHandle() override {\n    return semaphore_.get();\n  }\n\n private:\n  std::unique_ptr<xe::threading::Semaphore> semaphore_;\n  uint32_t maximum_count_ = 0;\n};\n\n}  // namespace kernel\n}  // namespace xe\n\n#endif  // XENIA_KERNEL_XSEMAPHORE_H_\n"
  },
  {
    "path": "src/xenia/kernel/xsocket.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"src/xenia/kernel/xsocket.h\"\n\n#include <cstring>\n\n#include \"xenia/base/platform.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/xam/xam_module.h\"\n// #include \"xenia/kernel/xnet.h\"\n\n#ifdef XE_PLATFORM_WIN32\n// clang-format off\n#include \"xenia/base/platform_win.h\"\n#include <WS2tcpip.h>\n#include <WinSock2.h>\n// clang-format on\n#else\n#include <arpa/inet.h>\n#include <netinet/in.h>\n#include <netinet/ip.h>\n#include <sys/socket.h>\n#include <unistd.h>\n#endif\n\nnamespace xe {\nnamespace kernel {\n\nXSocket::XSocket(KernelState* kernel_state)\n    : XObject(kernel_state, kObjectType) {}\n\nXSocket::XSocket(KernelState* kernel_state, uint64_t native_handle)\n    : XObject(kernel_state, kObjectType), native_handle_(native_handle) {}\n\nXSocket::~XSocket() { Close(); }\n\nX_STATUS XSocket::Initialize(AddressFamily af, Type type, Protocol proto) {\n  af_ = af;\n  type_ = type;\n  proto_ = proto;\n\n  if (proto == Protocol::IPPROTO_VDP) {\n    // VDP is a layer on top of UDP.\n    proto = Protocol::IPPROTO_UDP;\n  }\n\n  native_handle_ = socket(af, type, proto);\n  if (native_handle_ == -1) {\n    return X_STATUS_UNSUCCESSFUL;\n  }\n\n  return X_STATUS_SUCCESS;\n}\n\nX_STATUS XSocket::Close() {\n#if XE_PLATFORM_WIN32\n  int ret = closesocket(native_handle_);\n#elif XE_PLATFORM_LINUX\n  int ret = close(native_handle_);\n#endif\n\n  if (ret != 0) {\n    return X_STATUS_UNSUCCESSFUL;\n  }\n\n  return X_STATUS_SUCCESS;\n}\n\nX_STATUS XSocket::SetOption(uint32_t level, uint32_t optname, void* optval_ptr,\n                            uint32_t optlen) {\n  if (level == 0xFFFF && (optname == 0x5801 || optname == 0x5802)) {\n    // Disable socket encryption\n    secure_ = false;\n    return X_STATUS_SUCCESS;\n  }\n\n  int ret =\n      setsockopt(native_handle_, level, optname, (char*)optval_ptr, optlen);\n  if (ret < 0) {\n    // TODO: WSAGetLastError()\n    return X_STATUS_UNSUCCESSFUL;\n  }\n\n  // SO_BROADCAST\n  if (level == 0xFFFF && optname == 0x0020) {\n    broadcast_socket_ = true;\n  }\n\n  return X_STATUS_SUCCESS;\n}\n\nX_STATUS XSocket::IOControl(uint32_t cmd, uint8_t* arg_ptr) {\n#ifdef XE_PLATFORM_WIN32\n  int ret = ioctlsocket(native_handle_, cmd, (u_long*)arg_ptr);\n  if (ret < 0) {\n    // TODO: Get last error\n    return X_STATUS_UNSUCCESSFUL;\n  }\n\n  return X_STATUS_SUCCESS;\n#elif XE_PLATFORM_LINUX\n  return X_STATUS_UNSUCCESSFUL;\n#endif\n}\n\nX_STATUS XSocket::Connect(N_XSOCKADDR* name, int name_len) {\n  int ret = connect(native_handle_, (sockaddr*)name, name_len);\n  if (ret < 0) {\n    return X_STATUS_UNSUCCESSFUL;\n  }\n\n  return X_STATUS_SUCCESS;\n}\n\nX_STATUS XSocket::Bind(N_XSOCKADDR_IN* name, int name_len) {\n  int ret = bind(native_handle_, (sockaddr*)name, name_len);\n  if (ret < 0) {\n    return X_STATUS_UNSUCCESSFUL;\n  }\n\n  bound_ = true;\n  bound_port_ = name->sin_port;\n\n  return X_STATUS_SUCCESS;\n}\n\nX_STATUS XSocket::Listen(int backlog) {\n  int ret = listen(native_handle_, backlog);\n  if (ret < 0) {\n    return X_STATUS_UNSUCCESSFUL;\n  }\n\n  return X_STATUS_SUCCESS;\n}\n\nobject_ref<XSocket> XSocket::Accept(N_XSOCKADDR* name, int* name_len) {\n  sockaddr n_sockaddr;\n  socklen_t n_name_len = sizeof(sockaddr);\n  uintptr_t ret = accept(native_handle_, &n_sockaddr, &n_name_len);\n  if (ret == -1) {\n    std::memset(name, 0, *name_len);\n    *name_len = 0;\n    return nullptr;\n  }\n\n  std::memcpy(name, &n_sockaddr, n_name_len);\n  *name_len = n_name_len;\n\n  // Create a kernel object to represent the new socket, and copy parameters\n  // over.\n  auto socket = object_ref<XSocket>(new XSocket(kernel_state_, ret));\n  socket->af_ = af_;\n  socket->type_ = type_;\n  socket->proto_ = proto_;\n\n  return socket;\n}\n\nint XSocket::Shutdown(int how) { return shutdown(native_handle_, how); }\n\nint XSocket::Recv(uint8_t* buf, uint32_t buf_len, uint32_t flags) {\n  return recv(native_handle_, reinterpret_cast<char*>(buf), buf_len, flags);\n}\n\nint XSocket::RecvFrom(uint8_t* buf, uint32_t buf_len, uint32_t flags,\n                      N_XSOCKADDR_IN* from, uint32_t* from_len) {\n  // Pop from secure packets first\n  // TODO(DrChat): Enable when I commit XNet\n  /*\n  {\n    std::lock_guard<std::mutex> lock(incoming_packet_mutex_);\n    if (incoming_packets_.size()) {\n      packet* pkt = (packet*)incoming_packets_.front();\n      int data_len = pkt->data_len;\n      std::memcpy(buf, pkt->data, std::min((uint32_t)pkt->data_len, buf_len));\n\n      from->sin_family = 2;\n      from->sin_addr = pkt->src_ip;\n      from->sin_port = pkt->src_port;\n\n      incoming_packets_.pop();\n      uint8_t* pkt_ui8 = (uint8_t*)pkt;\n      delete[] pkt_ui8;\n\n      return data_len;\n    }\n  }\n  */\n\n  sockaddr_in nfrom;\n  socklen_t nfromlen = sizeof(sockaddr_in);\n  int ret = recvfrom(native_handle_, reinterpret_cast<char*>(buf), buf_len,\n                     flags, (sockaddr*)&nfrom, &nfromlen);\n  if (from) {\n    from->sin_family = nfrom.sin_family;\n    from->sin_addr = ntohl(nfrom.sin_addr.s_addr);  // BE <- BE\n    from->sin_port = nfrom.sin_port;\n    std::memset(from->x_sin_zero, 0, sizeof(from->x_sin_zero));\n  }\n\n  if (from_len) {\n    *from_len = nfromlen;\n  }\n\n  return ret;\n}\n\nint XSocket::Send(const uint8_t* buf, uint32_t buf_len, uint32_t flags) {\n  return send(native_handle_, reinterpret_cast<const char*>(buf), buf_len,\n              flags);\n}\n\nint XSocket::SendTo(uint8_t* buf, uint32_t buf_len, uint32_t flags,\n                    N_XSOCKADDR_IN* to, uint32_t to_len) {\n  // Send 2 copies of the packet: One to XNet (for network security) and an\n  // unencrypted copy for other Xenia hosts.\n  // TODO(DrChat): Enable when I commit XNet.\n  /*\n  auto xam = kernel_state()->GetKernelModule<xam::XamModule>(\"xam.xex\");\n  auto xnet = xam->xnet();\n  if (xnet) {\n    xnet->SendPacket(this, to, buf, buf_len);\n  }\n  */\n\n  sockaddr_in nto;\n  if (to) {\n    nto.sin_addr.s_addr = to->sin_addr;\n    nto.sin_family = to->sin_family;\n    nto.sin_port = to->sin_port;\n  }\n\n  return sendto(native_handle_, reinterpret_cast<char*>(buf), buf_len, flags,\n                to ? (sockaddr*)&nto : nullptr, to_len);\n}\n\nbool XSocket::QueuePacket(uint32_t src_ip, uint16_t src_port,\n                          const uint8_t* buf, size_t len) {\n  packet* pkt = reinterpret_cast<packet*>(new uint8_t[sizeof(packet) + len]);\n  pkt->src_ip = src_ip;\n  pkt->src_port = src_port;\n\n  pkt->data_len = (uint16_t)len;\n  std::memcpy(pkt->data, buf, len);\n\n  std::lock_guard<std::mutex> lock(incoming_packet_mutex_);\n  incoming_packets_.push((uint8_t*)pkt);\n\n  // TODO: Limit on number of incoming packets?\n  return true;\n}\n\n}  // namespace kernel\n}  // namespace xe"
  },
  {
    "path": "src/xenia/kernel/xsocket.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2015 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_KERNEL_XSOCKET_H_\n#define XENIA_KERNEL_XSOCKET_H_\n\n#include <cstring>\n#include <queue>\n\n#include \"xenia/base/byte_order.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/kernel/xobject.h\"\n\nnamespace xe {\nnamespace kernel {\nstruct XSOCKADDR {\n  xe::be<uint16_t> address_family;\n  char sa_data[14];\n};\n\nstruct N_XSOCKADDR {\n  N_XSOCKADDR() {}\n  N_XSOCKADDR(const XSOCKADDR* other) { *this = *other; }\n  N_XSOCKADDR& operator=(const XSOCKADDR& other) {\n    address_family = other.address_family;\n    std::memcpy(sa_data, other.sa_data, xe::countof(sa_data));\n    return *this;\n  }\n\n  uint16_t address_family;\n  char sa_data[14];\n};\n\nstruct XSOCKADDR_IN {\n  xe::be<uint16_t> sin_family;\n\n  // Always big-endian!\n  xe::be<uint16_t> sin_port;\n  xe::be<uint32_t> sin_addr;\n  // sin_zero is defined as __pad on Android, so prefixed here.\n  char x_sin_zero[8];\n};\n\n// Xenia native sockaddr_in\nstruct N_XSOCKADDR_IN {\n  N_XSOCKADDR_IN() {}\n  N_XSOCKADDR_IN(const XSOCKADDR_IN* other) { *this = *other; }\n  N_XSOCKADDR_IN& operator=(const XSOCKADDR_IN& other) {\n    sin_family = other.sin_family;\n    sin_port = other.sin_port;\n    sin_addr = other.sin_addr;\n    std::memset(x_sin_zero, 0, sizeof(x_sin_zero));\n\n    return *this;\n  }\n\n  uint16_t sin_family;\n  xe::be<uint16_t> sin_port;\n  xe::be<uint32_t> sin_addr;\n  // sin_zero is defined as __pad on Android, so prefixed here.\n  char x_sin_zero[8];\n};\n\nclass XSocket : public XObject {\n public:\n  static const XObject::Type kObjectType = XObject::Type::Socket;\n\n  enum AddressFamily {\n    AF_INET = 2,\n  };\n\n  enum Type {\n    SOCK_STREAM = 1,\n    SOCK_DGRAM = 2,\n  };\n\n  enum Protocol {\n    IPPROTO_TCP = 6,\n    IPPROTO_UDP = 17,\n\n    // LIVE Voice and Data Protocol\n    // https://blog.csdn.net/baozi3026/article/details/4277227\n    // Format: [cbGameData][GameData(encrypted)][VoiceData(unencrypted)]\n    IPPROTO_VDP = 254,\n  };\n\n  XSocket(KernelState* kernel_state);\n  ~XSocket();\n\n  uint64_t native_handle() const { return native_handle_; }\n  uint16_t bound_port() const { return bound_port_; }\n\n  X_STATUS Initialize(AddressFamily af, Type type, Protocol proto);\n  X_STATUS Close();\n\n  X_STATUS SetOption(uint32_t level, uint32_t optname, void* optval_ptr,\n                     uint32_t optlen);\n  X_STATUS IOControl(uint32_t cmd, uint8_t* arg_ptr);\n\n  X_STATUS Connect(N_XSOCKADDR* name, int name_len);\n  X_STATUS Bind(N_XSOCKADDR_IN* name, int name_len);\n  X_STATUS Listen(int backlog);\n  object_ref<XSocket> Accept(N_XSOCKADDR* name, int* name_len);\n  int Shutdown(int how);\n\n  int Recv(uint8_t* buf, uint32_t buf_len, uint32_t flags);\n  int Send(const uint8_t* buf, uint32_t buf_len, uint32_t flags);\n\n  int RecvFrom(uint8_t* buf, uint32_t buf_len, uint32_t flags,\n               N_XSOCKADDR_IN* from, uint32_t* from_len);\n  int SendTo(uint8_t* buf, uint32_t buf_len, uint32_t flags, N_XSOCKADDR_IN* to,\n             uint32_t to_len);\n\n  struct packet {\n    // These values are in network byte order.\n    xe::be<uint16_t> src_port;\n    xe::be<uint32_t> src_ip;\n\n    uint16_t data_len;\n    uint8_t data[1];\n  };\n\n  // Queue a packet into our internal buffer.\n  bool QueuePacket(uint32_t src_ip, uint16_t src_port, const uint8_t* buf,\n                   size_t len);\n\n private:\n  XSocket(KernelState* kernel_state, uint64_t native_handle);\n  uint64_t native_handle_ = -1;\n\n  AddressFamily af_;    // Address family\n  Type type_;           // Type (DGRAM/Stream/etc)\n  Protocol proto_;      // Protocol (TCP/UDP/etc)\n  bool secure_ = true;  // Secure socket (encryption enabled)\n\n  bool bound_ = false;  // Explicitly bound to an IP address?\n  uint16_t bound_port_ = 0;\n\n  bool broadcast_socket_ = false;\n\n  std::unique_ptr<xe::threading::Event> event_;\n  std::mutex incoming_packet_mutex_;\n  std::queue<uint8_t*> incoming_packets_;\n};\n\n}  // namespace kernel\n}  // namespace xe\n\n#endif  // XENIA_KERNEL_XSOCKET_H_"
  },
  {
    "path": "src/xenia/kernel/xsymboliclink.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/kernel/xsymboliclink.h\"\n\n#include \"xenia/base/byte_stream.h\"\n#include \"xenia/kernel/kernel_state.h\"\n\nnamespace xe {\nnamespace kernel {\n\nXSymbolicLink::XSymbolicLink(KernelState* kernel_state)\n    : XObject(kernel_state, kObjectType), path_(), target_() {}\n\nXSymbolicLink::XSymbolicLink() : XObject(kObjectType), path_(), target_() {}\n\nXSymbolicLink::~XSymbolicLink() {}\n\nvoid XSymbolicLink::Initialize(const std::string_view path,\n                               const std::string_view target) {\n  path_ = std::string(path);\n  target_ = std::string(target);\n  // TODO(gibbed): kernel_state_->RegisterSymbolicLink(this);\n}\n\nbool XSymbolicLink::Save(ByteStream* stream) {\n  if (!SaveObject(stream)) {\n    return false;\n  }\n  stream->Write(path_);\n  stream->Write(target_);\n  return true;\n}\n\nobject_ref<XSymbolicLink> XSymbolicLink::Restore(KernelState* kernel_state,\n                                                 ByteStream* stream) {\n  auto symlink = new XSymbolicLink();\n  symlink->kernel_state_ = kernel_state;\n  if (!symlink->RestoreObject(stream)) {\n    delete symlink;\n    return nullptr;\n  }\n\n  auto path = stream->Read<std::string>();\n  auto target = stream->Read<std::string>();\n  symlink->Initialize(path, target);\n\n  return object_ref<XSymbolicLink>(symlink);\n}\n\n}  // namespace kernel\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/kernel/xsymboliclink.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_KERNEL_XSYMBOLICLINK_H_\n#define XENIA_KERNEL_XSYMBOLICLINK_H_\n\n#include <memory>\n#include <unordered_map>\n\n#include \"xenia/base/mutex.h\"\n#include \"xenia/base/threading.h\"\n#include \"xenia/kernel/xobject.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace kernel {\n\nclass XSymbolicLink : public XObject {\n public:\n  static const XObject::Type kObjectType = XObject::Type::SymbolicLink;\n\n  explicit XSymbolicLink(KernelState* kernel_state);\n  ~XSymbolicLink() override;\n\n  void Initialize(const std::string_view path, const std::string_view target);\n\n  bool Save(ByteStream* stream) override;\n  static object_ref<XSymbolicLink> Restore(KernelState* kernel_state,\n                                           ByteStream* stream);\n\n  const std::string& path() const { return path_; }\n  const std::string& target() const { return target_; }\n\n private:\n  XSymbolicLink();\n\n  std::string path_;\n  std::string target_;\n};\n\n}  // namespace kernel\n}  // namespace xe\n\n#endif  // XENIA_KERNEL_XSYMBOLICLINK_H_\n"
  },
  {
    "path": "src/xenia/kernel/xthread.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/kernel/xthread.h\"\n\n#include <cstring>\n\n#include \"third_party/fmt/include/fmt/format.h\"\n#include \"xenia/base/byte_stream.h\"\n#include \"xenia/base/clock.h\"\n#include \"xenia/base/literals.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/profiling.h\"\n#include \"xenia/base/threading.h\"\n#include \"xenia/cpu/breakpoint.h\"\n#include \"xenia/cpu/ppc/ppc_decode_data.h\"\n#include \"xenia/cpu/processor.h\"\n#include \"xenia/emulator.h\"\n#include \"xenia/kernel/kernel_state.h\"\n#include \"xenia/kernel/user_module.h\"\n#include \"xenia/kernel/xevent.h\"\n#include \"xenia/kernel/xmutant.h\"\n\nDEFINE_bool(ignore_thread_priorities, true,\n            \"Ignores game-specified thread priorities.\", \"Kernel\");\nDEFINE_bool(ignore_thread_affinities, true,\n            \"Ignores game-specified thread affinities.\", \"Kernel\");\n\nnamespace xe {\nnamespace kernel {\n\nconst uint32_t XAPC::kSize;\nconst uint32_t XAPC::kDummyKernelRoutine;\nconst uint32_t XAPC::kDummyRundownRoutine;\n\nusing xe::cpu::ppc::PPCOpcode;\n\nusing namespace xe::literals;\n\nuint32_t next_xthread_id_ = 0;\n\nXThread::XThread(KernelState* kernel_state)\n    : XObject(kernel_state, kObjectType), guest_thread_(true) {}\n\nXThread::XThread(KernelState* kernel_state, uint32_t stack_size,\n                 uint32_t xapi_thread_startup, uint32_t start_address,\n                 uint32_t start_context, uint32_t creation_flags,\n                 bool guest_thread, bool main_thread)\n    : XObject(kernel_state, kObjectType),\n      thread_id_(++next_xthread_id_),\n      guest_thread_(guest_thread),\n      main_thread_(main_thread),\n      apc_list_(kernel_state->memory()) {\n  creation_params_.stack_size = stack_size;\n  creation_params_.xapi_thread_startup = xapi_thread_startup;\n  creation_params_.start_address = start_address;\n  creation_params_.start_context = start_context;\n\n  // top 8 bits = processor ID (or 0 for default)\n  // bit 0 = 1 to create suspended\n  creation_params_.creation_flags = creation_flags;\n\n  // Adjust stack size - min of 16k.\n  if (creation_params_.stack_size < 16 * 1024) {\n    creation_params_.stack_size = 16 * 1024;\n  }\n\n  if (!guest_thread_) {\n    host_object_ = true;\n  }\n\n  // The kernel does not take a reference. We must unregister in the dtor.\n  kernel_state_->RegisterThread(this);\n}\n\nXThread::~XThread() {\n  // Unregister first to prevent lookups while deleting.\n  kernel_state_->UnregisterThread(this);\n\n  // Notify processor of our impending destruction.\n  emulator()->processor()->OnThreadDestroyed(thread_id_);\n\n  thread_.reset();\n\n  if (thread_state_) {\n    delete thread_state_;\n  }\n  kernel_state()->memory()->SystemHeapFree(scratch_address_);\n  kernel_state()->memory()->SystemHeapFree(tls_static_address_);\n  kernel_state()->memory()->SystemHeapFree(pcr_address_);\n  FreeStack();\n\n  if (thread_) {\n    // TODO(benvanik): platform kill\n    XELOGE(\"Thread disposed without exiting\");\n  }\n}\n\nthread_local XThread* current_xthread_tls_ = nullptr;\n\nbool XThread::IsInThread() { return Thread::IsInThread(); }\n\nbool XThread::IsInThread(XThread* other) {\n  return current_xthread_tls_ == other;\n}\n\nXThread* XThread::GetCurrentThread() {\n  XThread* thread = reinterpret_cast<XThread*>(current_xthread_tls_);\n  if (!thread) {\n    assert_always(\"Attempting to use kernel stuff from a non-kernel thread\");\n  }\n  return thread;\n}\n\nuint32_t XThread::GetCurrentThreadHandle() {\n  XThread* thread = XThread::GetCurrentThread();\n  return thread->handle();\n}\n\nuint32_t XThread::GetCurrentThreadId() {\n  XThread* thread = XThread::GetCurrentThread();\n  return thread->guest_object<X_KTHREAD>()->thread_id;\n}\n\nuint32_t XThread::GetLastError() {\n  XThread* thread = XThread::GetCurrentThread();\n  return thread->last_error();\n}\n\nvoid XThread::SetLastError(uint32_t error_code) {\n  XThread* thread = XThread::GetCurrentThread();\n  thread->set_last_error(error_code);\n}\n\nuint32_t XThread::last_error() { return guest_object<X_KTHREAD>()->last_error; }\n\nvoid XThread::set_last_error(uint32_t error_code) {\n  guest_object<X_KTHREAD>()->last_error = error_code;\n}\n\nvoid XThread::set_name(const std::string_view name) {\n  thread_name_ = fmt::format(\"{} ({:08X})\", name, handle());\n\n  if (thread_) {\n    // May be getting set before the thread is created.\n    // One the thread is ready it will handle it.\n    thread_->set_name(thread_name_);\n  }\n}\n\nstatic uint8_t next_cpu = 0;\nstatic uint8_t GetFakeCpuNumber(uint8_t proc_mask) {\n  // NOTE: proc_mask is logical processors, not physical processors or cores.\n  if (!proc_mask) {\n    next_cpu = (next_cpu + 1) % 6;\n    return next_cpu;  // is this reasonable?\n    // TODO(Triang3l): Does the following apply here?\n    // https://docs.microsoft.com/en-us/windows/win32/dxtecharts/coding-for-multiple-cores\n    // \"On Xbox 360, you must explicitly assign software threads to a particular\n    //  hardware thread by using XSetThreadProcessor. Otherwise, all child\n    //  threads will stay on the same hardware thread as the parent.\"\n  }\n  assert_false(proc_mask & 0xC0);\n\n  uint8_t cpu_number = 7 - xe::lzcnt(proc_mask);\n  assert_true(1 << cpu_number == proc_mask);\n  assert_true(cpu_number < 6);\n  return cpu_number;\n}\n\nvoid XThread::InitializeGuestObject() {\n  auto guest_thread = guest_object<X_KTHREAD>();\n\n  // Setup the thread state block (last error/etc).\n  uint8_t* p = memory()->TranslateVirtual(guest_object());\n  guest_thread->header.type = 6;\n  guest_thread->suspend_count =\n      (creation_params_.creation_flags & X_CREATE_SUSPENDED) ? 1 : 0;\n\n  xe::store_and_swap<uint32_t>(p + 0x010, guest_object() + 0x010);\n  xe::store_and_swap<uint32_t>(p + 0x014, guest_object() + 0x010);\n\n  xe::store_and_swap<uint32_t>(p + 0x040, guest_object() + 0x018 + 8);\n  xe::store_and_swap<uint32_t>(p + 0x044, guest_object() + 0x018 + 8);\n  xe::store_and_swap<uint32_t>(p + 0x048, guest_object());\n  xe::store_and_swap<uint32_t>(p + 0x04C, guest_object() + 0x018);\n\n  xe::store_and_swap<uint16_t>(p + 0x054, 0x102);\n  xe::store_and_swap<uint16_t>(p + 0x056, 1);\n  xe::store_and_swap<uint32_t>(p + 0x05C, stack_base_);\n  xe::store_and_swap<uint32_t>(p + 0x060, stack_limit_);\n  xe::store_and_swap<uint32_t>(p + 0x068, tls_static_address_);\n  xe::store_and_swap<uint8_t>(p + 0x06C, 0);\n  xe::store_and_swap<uint32_t>(p + 0x074, guest_object() + 0x074);\n  xe::store_and_swap<uint32_t>(p + 0x078, guest_object() + 0x074);\n  xe::store_and_swap<uint32_t>(p + 0x07C, guest_object() + 0x07C);\n  xe::store_and_swap<uint32_t>(p + 0x080, guest_object() + 0x07C);\n  xe::store_and_swap<uint32_t>(p + 0x084,\n                               kernel_state_->process_info_block_address());\n  xe::store_and_swap<uint8_t>(p + 0x08B, 1);\n  // 0xD4 = APC\n  // 0xFC = semaphore (ptr, 0, 2)\n  // 0xA88 = APC\n  // 0x18 = timer\n  xe::store_and_swap<uint32_t>(p + 0x09C, 0xFDFFD7FF);\n  // current_cpu is expected to be initialized externally via SetActiveCpu.\n  xe::store_and_swap<uint32_t>(p + 0x0D0, stack_base_);\n  xe::store_and_swap<uint64_t>(p + 0x130, Clock::QueryGuestSystemTime());\n  xe::store_and_swap<uint32_t>(p + 0x144, guest_object() + 0x144);\n  xe::store_and_swap<uint32_t>(p + 0x148, guest_object() + 0x144);\n  xe::store_and_swap<uint32_t>(p + 0x14C, thread_id_);\n  xe::store_and_swap<uint32_t>(p + 0x150, creation_params_.start_address);\n  xe::store_and_swap<uint32_t>(p + 0x154, guest_object() + 0x154);\n  xe::store_and_swap<uint32_t>(p + 0x158, guest_object() + 0x154);\n  xe::store_and_swap<uint32_t>(p + 0x160, 0);  // last error\n  xe::store_and_swap<uint32_t>(p + 0x16C, creation_params_.creation_flags);\n  xe::store_and_swap<uint32_t>(p + 0x17C, 1);\n}\n\nbool XThread::AllocateStack(uint32_t size) {\n  auto heap = memory()->LookupHeap(kStackAddressRangeBegin);\n\n  auto alignment = heap->page_size();\n  auto padding = heap->page_size() * 2;  // Guard page size * 2\n  size = xe::round_up(size, alignment);\n  auto actual_size = size + padding;\n\n  uint32_t address = 0;\n  if (!heap->AllocRange(\n          kStackAddressRangeBegin, kStackAddressRangeEnd, actual_size,\n          alignment, kMemoryAllocationReserve | kMemoryAllocationCommit,\n          kMemoryProtectRead | kMemoryProtectWrite, false, &address)) {\n    return false;\n  }\n\n  stack_alloc_base_ = address;\n  stack_alloc_size_ = actual_size;\n  stack_limit_ = address + (padding / 2);\n  stack_base_ = stack_limit_ + size;\n\n  // Initialize the stack with junk\n  memory()->Fill(stack_alloc_base_, actual_size, 0xBE);\n\n  // Setup the guard pages\n  heap->Protect(stack_alloc_base_, padding / 2, kMemoryProtectNoAccess);\n  heap->Protect(stack_base_, padding / 2, kMemoryProtectNoAccess);\n\n  return true;\n}\n\nvoid XThread::FreeStack() {\n  if (stack_alloc_base_) {\n    auto heap = memory()->LookupHeap(kStackAddressRangeBegin);\n    heap->Release(stack_alloc_base_);\n\n    stack_alloc_base_ = 0;\n    stack_alloc_size_ = 0;\n    stack_base_ = 0;\n    stack_limit_ = 0;\n  }\n}\n\nX_STATUS XThread::Create() {\n  // Thread kernel object.\n  if (!CreateNative<X_KTHREAD>()) {\n    XELOGW(\"Unable to allocate thread object\");\n    return X_STATUS_NO_MEMORY;\n  }\n\n  // Allocate a stack.\n  if (!AllocateStack(creation_params_.stack_size)) {\n    return X_STATUS_NO_MEMORY;\n  }\n\n  // Allocate thread scratch.\n  // This is used by interrupts/APCs/etc so we can round-trip pointers through.\n  scratch_size_ = 4 * 16;\n  scratch_address_ = memory()->SystemHeapAlloc(scratch_size_);\n\n  // Allocate TLS block.\n  // Games will specify a certain number of 4b slots that each thread will get.\n  xex2_opt_tls_info* tls_header = nullptr;\n  auto module = kernel_state()->GetExecutableModule();\n  if (module) {\n    module->GetOptHeader(XEX_HEADER_TLS_INFO, &tls_header);\n  }\n\n  const uint32_t kDefaultTlsSlotCount = 1024;\n  uint32_t tls_slots = kDefaultTlsSlotCount;\n  uint32_t tls_extended_size = 0;\n  if (tls_header && tls_header->slot_count) {\n    tls_slots = tls_header->slot_count;\n    tls_extended_size = tls_header->data_size;\n  }\n\n  // Allocate both the slots and the extended data.\n  // Some TLS is compiled with the binary (declspec(thread)) vars. The game\n  // will directly access those through 0(r13).\n  uint32_t tls_slot_size = tls_slots * 4;\n  tls_total_size_ = tls_slot_size + tls_extended_size;\n  tls_static_address_ = memory()->SystemHeapAlloc(tls_total_size_);\n  tls_dynamic_address_ = tls_static_address_ + tls_extended_size;\n  if (!tls_static_address_) {\n    XELOGW(\"Unable to allocate thread local storage block\");\n    return X_STATUS_NO_MEMORY;\n  }\n\n  // Zero all of TLS.\n  memory()->Fill(tls_static_address_, tls_total_size_, 0);\n  if (tls_extended_size) {\n    // If game has extended data, copy in the default values.\n    assert_not_zero(tls_header->raw_data_address);\n    memory()->Copy(tls_static_address_, tls_header->raw_data_address,\n                   tls_header->raw_data_size);\n  }\n\n  // Allocate thread state block from heap.\n  // https://web.archive.org/web/20170704035330/https://www.microsoft.com/msj/archive/S2CE.aspx\n  // This is set as r13 for user code and some special inlined Win32 calls\n  // (like GetLastError/etc) will poke it directly.\n  // We try to use it as our primary store of data just to keep things all\n  // consistent.\n  // 0x000: pointer to tls data\n  // 0x100: pointer to TEB(?)\n  // 0x10C: Current CPU(?)\n  // 0x150: if >0 then error states don't get set (DPC active bool?)\n  // TEB:\n  // 0x14C: thread id\n  // 0x160: last error\n  // So, at offset 0x100 we have a 4b pointer to offset 200, then have the\n  // structure.\n  pcr_address_ = memory()->SystemHeapAlloc(0x2D8);\n  if (!pcr_address_) {\n    XELOGW(\"Unable to allocate thread state block\");\n    return X_STATUS_NO_MEMORY;\n  }\n\n  // Allocate processor thread state.\n  // This is thread safe.\n  thread_state_ = new cpu::ThreadState(kernel_state()->processor(), thread_id_,\n                                       stack_base_, pcr_address_);\n  XELOGI(\"XThread{:08X} ({:X}) Stack: {:08X}-{:08X}\", handle(), thread_id_,\n         stack_limit_, stack_base_);\n\n  // Exports use this to get the kernel.\n  thread_state_->context()->kernel_state = kernel_state_;\n\n  uint8_t cpu_index = GetFakeCpuNumber(\n      static_cast<uint8_t>(creation_params_.creation_flags >> 24));\n\n  // Initialize the KTHREAD object.\n  InitializeGuestObject();\n\n  X_KPCR* pcr = memory()->TranslateVirtual<X_KPCR*>(pcr_address_);\n\n  pcr->tls_ptr = tls_static_address_;\n  pcr->pcr_ptr = pcr_address_;\n  pcr->current_thread = guest_object();\n\n  pcr->stack_base_ptr = stack_base_;\n  pcr->stack_end_ptr = stack_limit_;\n\n  pcr->dpc_active = 0;  // DPC active bool?\n\n  // Always retain when starting - the thread owns itself until exited.\n  RetainHandle();\n\n  xe::threading::Thread::CreationParameters params;\n  params.stack_size = 16_MiB;  // Allocate a big host stack.\n  params.create_suspended = true;\n  thread_ = xe::threading::Thread::Create(params, [this]() {\n    // Set thread ID override. This is used by logging.\n    xe::threading::set_current_thread_id(handle());\n\n    // Set name immediately, if we have one.\n    thread_->set_name(thread_name_);\n\n    // Profiler needs to know about the thread.\n    xe::Profiler::ThreadEnter(thread_name_.c_str());\n\n    // Execute user code.\n    current_xthread_tls_ = this;\n    current_thread_ = this;\n    running_ = true;\n    Execute();\n    running_ = false;\n    current_thread_ = nullptr;\n    current_xthread_tls_ = nullptr;\n\n    xe::Profiler::ThreadExit();\n\n    // Release the self-reference to the thread.\n    ReleaseHandle();\n  });\n\n  if (!thread_) {\n    // TODO(benvanik): translate error?\n    XELOGE(\"CreateThread failed\");\n    return X_STATUS_NO_MEMORY;\n  }\n\n  // Set the thread name based on host ID (for easier debugging).\n  if (thread_name_.empty()) {\n    set_name(fmt::format(\"XThread{:04X}\", thread_->system_id()));\n  }\n\n  if (creation_params_.creation_flags & 0x60) {\n    thread_->set_priority(creation_params_.creation_flags & 0x20 ? 1 : 0);\n  }\n\n  // Assign the newly created thread to the logical processor, and also set up\n  // the current CPU in KPCR and KTHREAD.\n  SetActiveCpu(cpu_index);\n\n  // Notify processor of our creation.\n  emulator()->processor()->OnThreadCreated(handle(), thread_state_, this);\n\n  if ((creation_params_.creation_flags & X_CREATE_SUSPENDED) == 0) {\n    // Start the thread now that we're all setup.\n    thread_->Resume();\n  }\n\n  return X_STATUS_SUCCESS;\n}\n\nX_STATUS XThread::Exit(int exit_code) {\n  // This may only be called on the thread itself.\n  assert_true(XThread::GetCurrentThread() == this);\n\n  // TODO(benvanik): dispatch events? waiters? etc?\n  RundownAPCs();\n\n  // Set exit code.\n  X_KTHREAD* thread = guest_object<X_KTHREAD>();\n  thread->header.signal_state = 1;\n  thread->exit_status = exit_code;\n\n  kernel_state()->OnThreadExit(this);\n\n  // Notify processor of our exit.\n  emulator()->processor()->OnThreadExit(thread_id_);\n\n  // NOTE: unless PlatformExit fails, expect it to never return!\n  current_xthread_tls_ = nullptr;\n  current_thread_ = nullptr;\n  xe::Profiler::ThreadExit();\n\n  running_ = false;\n  ReleaseHandle();\n\n  // NOTE: this does not return!\n  xe::threading::Thread::Exit(exit_code);\n  return X_STATUS_SUCCESS;\n}\n\nX_STATUS XThread::Terminate(int exit_code) {\n  // TODO(benvanik): inform the profiler that this thread is exiting.\n\n  // Set exit code.\n  X_KTHREAD* thread = guest_object<X_KTHREAD>();\n  thread->header.signal_state = 1;\n  thread->exit_status = exit_code;\n\n  // Notify processor of our exit.\n  emulator()->processor()->OnThreadExit(thread_id_);\n\n  running_ = false;\n  if (XThread::IsInThread(this)) {\n    ReleaseHandle();\n    xe::threading::Thread::Exit(exit_code);\n  } else {\n    thread_->Terminate(exit_code);\n    ReleaseHandle();\n  }\n\n  return X_STATUS_SUCCESS;\n}\n\nclass reenter_exception {\n public:\n  reenter_exception(uint32_t address) : address_(address){};\n  virtual ~reenter_exception(){};\n  uint32_t address() const { return address_; }\n\n private:\n  uint32_t address_;\n};\n\nvoid XThread::Execute() {\n  XELOGKERNEL(\"XThread::Execute thid {} (handle={:08X}, '{}', native={:08X})\",\n              thread_id_, handle(), thread_name_, thread_->system_id());\n\n  // Let the kernel know we are starting.\n  kernel_state()->OnThreadExecute(this);\n\n  // All threads get a mandatory sleep. This is to deal with some buggy\n  // games that are assuming the 360 is so slow to create threads that they\n  // have time to initialize shared structures AFTER CreateThread (RR).\n  xe::threading::Sleep(std::chrono::milliseconds(10));\n\n  // Dispatch any APCs that were queued before the thread was created first.\n  DeliverAPCs();\n\n  uint32_t address;\n  std::vector<uint64_t> args;\n  bool want_exit_code;\n  int exit_code = 0;\n\n  // If a XapiThreadStartup value is present, we use that as a trampoline.\n  // Otherwise, we are a raw thread.\n  if (creation_params_.xapi_thread_startup) {\n    address = creation_params_.xapi_thread_startup;\n    args.push_back(creation_params_.start_address);\n    args.push_back(creation_params_.start_context);\n    want_exit_code = false;\n  } else {\n    // Run user code.\n    address = creation_params_.start_address;\n    args.push_back(creation_params_.start_context);\n    want_exit_code = true;\n  }\n\n  uint32_t next_address;\n  try {\n    exit_code = static_cast<int>(kernel_state()->processor()->Execute(\n        thread_state_, address, args.data(), args.size()));\n    next_address = 0;\n  } catch (const reenter_exception& ree) {\n    next_address = ree.address();\n  }\n\n  // See XThread::Reenter comments.\n  while (next_address != 0) {\n    try {\n      kernel_state()->processor()->ExecuteRaw(thread_state_, next_address);\n      next_address = 0;\n      if (want_exit_code) {\n        exit_code = static_cast<int>(thread_state_->context()->r[3]);\n      }\n    } catch (const reenter_exception& ree) {\n      next_address = ree.address();\n    }\n  }\n\n  // If we got here it means the execute completed without an exit being called.\n  // Treat the return code as an implicit exit code (if desired).\n  Exit(!want_exit_code ? 0 : exit_code);\n}\n\nvoid XThread::Reenter(uint32_t address) {\n  // TODO(gibbed): Maybe use setjmp/longjmp on Windows?\n  // https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/longjmp#remarks\n  // On Windows with /EH, setjmp/longjmp do stack unwinding.\n  // Is there a better solution than exceptions for stack unwinding?\n  throw reenter_exception(address);\n}\n\nvoid XThread::EnterCriticalRegion() {\n  guest_object<X_KTHREAD>()->apc_disable_count--;\n}\n\nvoid XThread::LeaveCriticalRegion() {\n  auto kthread = guest_object<X_KTHREAD>();\n  auto apc_disable_count = ++kthread->apc_disable_count;\n  if (apc_disable_count == 0) {\n    CheckApcs();\n  }\n}\n\nuint32_t XThread::RaiseIrql(uint32_t new_irql) {\n  return irql_.exchange(new_irql);\n}\n\nvoid XThread::LowerIrql(uint32_t new_irql) { irql_ = new_irql; }\n\nvoid XThread::CheckApcs() { DeliverAPCs(); }\n\nvoid XThread::LockApc() { global_critical_region_.mutex().lock(); }\n\nvoid XThread::UnlockApc(bool queue_delivery) {\n  bool needs_apc = apc_list_.HasPending();\n  global_critical_region_.mutex().unlock();\n  if (needs_apc && queue_delivery) {\n    thread_->QueueUserCallback([this]() { DeliverAPCs(); });\n  }\n}\n\nvoid XThread::EnqueueApc(uint32_t normal_routine, uint32_t normal_context,\n                         uint32_t arg1, uint32_t arg2) {\n  LockApc();\n\n  // Allocate APC.\n  // We'll tag it as special and free it when dispatched.\n  uint32_t apc_ptr = memory()->SystemHeapAlloc(XAPC::kSize);\n  auto apc = reinterpret_cast<XAPC*>(memory()->TranslateVirtual(apc_ptr));\n\n  apc->Initialize();\n  apc->kernel_routine = XAPC::kDummyKernelRoutine;\n  apc->rundown_routine = XAPC::kDummyRundownRoutine;\n  apc->normal_routine = normal_routine;\n  apc->normal_context = normal_context;\n  apc->arg1 = arg1;\n  apc->arg2 = arg2;\n  apc->enqueued = 1;\n\n  uint32_t list_entry_ptr = apc_ptr + 8;\n  apc_list_.Insert(list_entry_ptr);\n\n  UnlockApc(true);\n}\n\nvoid XThread::DeliverAPCs() {\n  // https://www.drdobbs.com/inside-nts-asynchronous-procedure-call/184416590?pgno=1\n  // https://www.drdobbs.com/inside-nts-asynchronous-procedure-call/184416590?pgno=7\n  auto processor = kernel_state()->processor();\n  LockApc();\n  auto kthread = guest_object<X_KTHREAD>();\n  while (apc_list_.HasPending() && kthread->apc_disable_count == 0) {\n    // Get APC entry (offset for LIST_ENTRY offset) and cache what we need.\n    // Calling the routine may delete the memory/overwrite it.\n    uint32_t apc_ptr = apc_list_.Shift() - 8;\n    auto apc = reinterpret_cast<XAPC*>(memory()->TranslateVirtual(apc_ptr));\n    bool needs_freeing = apc->kernel_routine == XAPC::kDummyKernelRoutine;\n\n    XELOGD(\"Delivering APC to {:08X}\", uint32_t(apc->normal_routine));\n\n    // Mark as uninserted so that it can be reinserted again by the routine.\n    apc->enqueued = 0;\n\n    // Call kernel routine.\n    // The routine can modify all of its arguments before passing it on.\n    // Since we need to give guest accessible pointers over, we copy things\n    // into and out of scratch.\n    uint8_t* scratch_ptr = memory()->TranslateVirtual(scratch_address_);\n    xe::store_and_swap<uint32_t>(scratch_ptr + 0, apc->normal_routine);\n    xe::store_and_swap<uint32_t>(scratch_ptr + 4, apc->normal_context);\n    xe::store_and_swap<uint32_t>(scratch_ptr + 8, apc->arg1);\n    xe::store_and_swap<uint32_t>(scratch_ptr + 12, apc->arg2);\n    if (apc->kernel_routine != XAPC::kDummyKernelRoutine) {\n      // kernel_routine(apc_address, &normal_routine, &normal_context,\n      // &system_arg1, &system_arg2)\n      uint64_t kernel_args[] = {\n          apc_ptr,\n          scratch_address_ + 0,\n          scratch_address_ + 4,\n          scratch_address_ + 8,\n          scratch_address_ + 12,\n      };\n      processor->Execute(thread_state_, apc->kernel_routine, kernel_args,\n                         xe::countof(kernel_args));\n    }\n    uint32_t normal_routine = xe::load_and_swap<uint32_t>(scratch_ptr + 0);\n    uint32_t normal_context = xe::load_and_swap<uint32_t>(scratch_ptr + 4);\n    uint32_t arg1 = xe::load_and_swap<uint32_t>(scratch_ptr + 8);\n    uint32_t arg2 = xe::load_and_swap<uint32_t>(scratch_ptr + 12);\n\n    // Call the normal routine. Note that it may have been killed by the kernel\n    // routine.\n    if (normal_routine) {\n      UnlockApc(false);\n      // normal_routine(normal_context, system_arg1, system_arg2)\n      uint64_t normal_args[] = {normal_context, arg1, arg2};\n      processor->Execute(thread_state_, normal_routine, normal_args,\n                         xe::countof(normal_args));\n      LockApc();\n    }\n\n    XELOGD(\"Completed delivery of APC to {:08X} ({:08X}, {:08X}, {:08X})\",\n           normal_routine, normal_context, arg1, arg2);\n\n    // If special, free it.\n    if (needs_freeing) {\n      memory()->SystemHeapFree(apc_ptr);\n    }\n  }\n  UnlockApc(true);\n}\n\nvoid XThread::RundownAPCs() {\n  assert_true(XThread::GetCurrentThread() == this);\n  LockApc();\n  while (apc_list_.HasPending()) {\n    // Get APC entry (offset for LIST_ENTRY offset) and cache what we need.\n    // Calling the routine may delete the memory/overwrite it.\n    uint32_t apc_ptr = apc_list_.Shift() - 8;\n    auto apc = reinterpret_cast<XAPC*>(memory()->TranslateVirtual(apc_ptr));\n    bool needs_freeing = apc->kernel_routine == XAPC::kDummyKernelRoutine;\n\n    // Mark as uninserted so that it can be reinserted again by the routine.\n    apc->enqueued = 0;\n\n    // Call the rundown routine.\n    if (apc->rundown_routine == XAPC::kDummyRundownRoutine) {\n      // No-op.\n    } else if (apc->rundown_routine) {\n      // rundown_routine(apc)\n      uint64_t args[] = {apc_ptr};\n      kernel_state()->processor()->Execute(thread_state(), apc->rundown_routine,\n                                           args, xe::countof(args));\n    }\n\n    // If special, free it.\n    if (needs_freeing) {\n      memory()->SystemHeapFree(apc_ptr);\n    }\n  }\n  UnlockApc(true);\n}\n\nint32_t XThread::QueryPriority() { return thread_->priority(); }\n\nvoid XThread::SetPriority(int32_t increment) {\n  priority_ = increment;\n  int32_t target_priority = 0;\n  if (increment > 0x22) {\n    target_priority = xe::threading::ThreadPriority::kHighest;\n  } else if (increment > 0x11) {\n    target_priority = xe::threading::ThreadPriority::kAboveNormal;\n  } else if (increment < -0x22) {\n    target_priority = xe::threading::ThreadPriority::kLowest;\n  } else if (increment < -0x11) {\n    target_priority = xe::threading::ThreadPriority::kBelowNormal;\n  } else {\n    target_priority = xe::threading::ThreadPriority::kNormal;\n  }\n  if (!cvars::ignore_thread_priorities) {\n    thread_->set_priority(target_priority);\n  }\n}\n\nvoid XThread::SetAffinity(uint32_t affinity) {\n  SetActiveCpu(GetFakeCpuNumber(affinity));\n}\n\nuint8_t XThread::active_cpu() const {\n  const X_KPCR& pcr = *memory()->TranslateVirtual<const X_KPCR*>(pcr_address_);\n  return pcr.current_cpu;\n}\n\nvoid XThread::SetActiveCpu(uint8_t cpu_index) {\n  // May be called during thread creation - don't skip if current == new.\n\n  assert_true(cpu_index < 6);\n\n  X_KPCR& pcr = *memory()->TranslateVirtual<X_KPCR*>(pcr_address_);\n  pcr.current_cpu = cpu_index;\n\n  if (is_guest_thread()) {\n    X_KTHREAD& thread_object =\n        *memory()->TranslateVirtual<X_KTHREAD*>(guest_object());\n    thread_object.current_cpu = cpu_index;\n  }\n\n  if (xe::threading::logical_processor_count() >= 6) {\n    if (!cvars::ignore_thread_affinities) {\n      thread_->set_affinity_mask(uint64_t(1) << cpu_index);\n    }\n  } else {\n    XELOGW(\"Too few processor cores - scheduling will be wonky\");\n  }\n}\n\nbool XThread::GetTLSValue(uint32_t slot, uint32_t* value_out) {\n  if (slot * 4 > tls_total_size_) {\n    return false;\n  }\n\n  auto mem = memory()->TranslateVirtual(tls_dynamic_address_ + slot * 4);\n  *value_out = xe::load_and_swap<uint32_t>(mem);\n  return true;\n}\n\nbool XThread::SetTLSValue(uint32_t slot, uint32_t value) {\n  if (slot * 4 >= tls_total_size_) {\n    return false;\n  }\n\n  auto mem = memory()->TranslateVirtual(tls_dynamic_address_ + slot * 4);\n  xe::store_and_swap<uint32_t>(mem, value);\n  return true;\n}\n\nuint32_t XThread::suspend_count() {\n  return guest_object<X_KTHREAD>()->suspend_count;\n}\n\nX_STATUS XThread::Resume(uint32_t* out_suspend_count) {\n  --guest_object<X_KTHREAD>()->suspend_count;\n\n  if (thread_->Resume(out_suspend_count)) {\n    return X_STATUS_SUCCESS;\n  } else {\n    return X_STATUS_UNSUCCESSFUL;\n  }\n}\n\nX_STATUS XThread::Suspend(uint32_t* out_suspend_count) {\n  auto global_lock = global_critical_region_.Acquire();\n\n  ++guest_object<X_KTHREAD>()->suspend_count;\n\n  // If we are suspending ourselves, we can't hold the lock.\n  if (XThread::IsInThread() && XThread::GetCurrentThread() == this) {\n    global_lock.unlock();\n  }\n\n  if (thread_->Suspend(out_suspend_count)) {\n    return X_STATUS_SUCCESS;\n  } else {\n    return X_STATUS_UNSUCCESSFUL;\n  }\n}\n\nX_STATUS XThread::Delay(uint32_t processor_mode, uint32_t alertable,\n                        uint64_t interval) {\n  int64_t timeout_ticks = interval;\n  uint32_t timeout_ms;\n  if (timeout_ticks > 0) {\n    // Absolute time, based on January 1, 1601.\n    // TODO(benvanik): convert time to relative time.\n    assert_always();\n    timeout_ms = 0;\n  } else if (timeout_ticks < 0) {\n    // Relative time.\n    timeout_ms = uint32_t(-timeout_ticks / 10000);  // Ticks -> MS\n  } else {\n    timeout_ms = 0;\n  }\n  timeout_ms = Clock::ScaleGuestDurationMillis(timeout_ms);\n  if (alertable) {\n    auto result =\n        xe::threading::AlertableSleep(std::chrono::milliseconds(timeout_ms));\n    switch (result) {\n      default:\n      case xe::threading::SleepResult::kSuccess:\n        return X_STATUS_SUCCESS;\n      case xe::threading::SleepResult::kAlerted:\n        return X_STATUS_USER_APC;\n    }\n  } else {\n    xe::threading::Sleep(std::chrono::milliseconds(timeout_ms));\n    return X_STATUS_SUCCESS;\n  }\n}\n\nstruct ThreadSavedState {\n  uint32_t thread_id;\n  bool is_main_thread;  // Is this the main thread?\n  bool is_running;\n\n  uint32_t apc_head;\n  uint32_t tls_static_address;\n  uint32_t tls_dynamic_address;\n  uint32_t tls_total_size;\n  uint32_t pcr_address;\n  uint32_t stack_base;        // High address\n  uint32_t stack_limit;       // Low address\n  uint32_t stack_alloc_base;  // Allocation address\n  uint32_t stack_alloc_size;  // Allocation size\n\n  // Context (invalid if not running)\n  struct {\n    uint64_t lr;\n    uint64_t ctr;\n    uint64_t r[32];\n    double f[32];\n    vec128_t v[128];\n    uint32_t cr[8];\n    uint32_t fpscr;\n    uint8_t xer_ca;\n    uint8_t xer_ov;\n    uint8_t xer_so;\n    uint8_t vscr_sat;\n    uint32_t pc;\n  } context;\n};\n\nbool XThread::Save(ByteStream* stream) {\n  if (!guest_thread_) {\n    // Host XThreads are expected to be recreated on their own.\n    return false;\n  }\n\n  XELOGD(\"XThread {:08X} serializing...\", handle());\n\n  uint32_t pc = 0;\n  if (running_) {\n    pc = emulator()->processor()->StepToGuestSafePoint(thread_id_);\n    if (!pc) {\n      XELOGE(\"XThread {:08X} failed to save: could not step to a safe point!\",\n             handle());\n      assert_always();\n      return false;\n    }\n  }\n\n  if (!SaveObject(stream)) {\n    return false;\n  }\n\n  stream->Write(kThreadSaveSignature);\n  stream->Write(thread_name_);\n\n  ThreadSavedState state;\n  state.thread_id = thread_id_;\n  state.is_main_thread = main_thread_;\n  state.is_running = running_;\n  state.apc_head = apc_list_.head();\n  state.tls_static_address = tls_static_address_;\n  state.tls_dynamic_address = tls_dynamic_address_;\n  state.tls_total_size = tls_total_size_;\n  state.pcr_address = pcr_address_;\n  state.stack_base = stack_base_;\n  state.stack_limit = stack_limit_;\n  state.stack_alloc_base = stack_alloc_base_;\n  state.stack_alloc_size = stack_alloc_size_;\n\n  if (running_) {\n    // Context information\n    auto context = thread_state_->context();\n    state.context.lr = context->lr;\n    state.context.ctr = context->ctr;\n    std::memcpy(state.context.r, context->r, 32 * 8);\n    std::memcpy(state.context.f, context->f, 32 * 8);\n    std::memcpy(state.context.v, context->v, 128 * 16);\n    state.context.cr[0] = context->cr0.value;\n    state.context.cr[1] = context->cr1.value;\n    state.context.cr[2] = context->cr2.value;\n    state.context.cr[3] = context->cr3.value;\n    state.context.cr[4] = context->cr4.value;\n    state.context.cr[5] = context->cr5.value;\n    state.context.cr[6] = context->cr6.value;\n    state.context.cr[7] = context->cr7.value;\n    state.context.fpscr = context->fpscr.value;\n    state.context.xer_ca = context->xer_ca;\n    state.context.xer_ov = context->xer_ov;\n    state.context.xer_so = context->xer_so;\n    state.context.vscr_sat = context->vscr_sat;\n    state.context.pc = pc;\n  }\n\n  stream->Write(&state, sizeof(ThreadSavedState));\n  return true;\n}\n\nobject_ref<XThread> XThread::Restore(KernelState* kernel_state,\n                                     ByteStream* stream) {\n  // Kind-of a hack, but we need to set the kernel state outside of the object\n  // constructor so it doesn't register a handle with the object table.\n  auto thread = new XThread(nullptr);\n  thread->kernel_state_ = kernel_state;\n\n  if (!thread->RestoreObject(stream)) {\n    return nullptr;\n  }\n\n  if (stream->Read<uint32_t>() != kThreadSaveSignature) {\n    XELOGE(\"Could not restore XThread - invalid magic!\");\n    return nullptr;\n  }\n\n  XELOGD(\"XThread {:08X}\", thread->handle());\n\n  thread->thread_name_ = stream->Read<std::string>();\n\n  ThreadSavedState state;\n  stream->Read(&state, sizeof(ThreadSavedState));\n  thread->thread_id_ = state.thread_id;\n  thread->main_thread_ = state.is_main_thread;\n  thread->running_ = state.is_running;\n  thread->apc_list_.set_head(state.apc_head);\n  thread->tls_static_address_ = state.tls_static_address;\n  thread->tls_dynamic_address_ = state.tls_dynamic_address;\n  thread->tls_total_size_ = state.tls_total_size;\n  thread->pcr_address_ = state.pcr_address;\n  thread->stack_base_ = state.stack_base;\n  thread->stack_limit_ = state.stack_limit;\n  thread->stack_alloc_base_ = state.stack_alloc_base;\n  thread->stack_alloc_size_ = state.stack_alloc_size;\n\n  thread->apc_list_.set_memory(kernel_state->memory());\n\n  // Register now that we know our thread ID.\n  kernel_state->RegisterThread(thread);\n\n  thread->thread_state_ =\n      new cpu::ThreadState(kernel_state->processor(), thread->thread_id_,\n                           thread->stack_base_, thread->pcr_address_);\n\n  if (state.is_running) {\n    auto context = thread->thread_state_->context();\n    context->kernel_state = kernel_state;\n    context->lr = state.context.lr;\n    context->ctr = state.context.ctr;\n    std::memcpy(context->r, state.context.r, 32 * 8);\n    std::memcpy(context->f, state.context.f, 32 * 8);\n    std::memcpy(context->v, state.context.v, 128 * 16);\n    context->cr0.value = state.context.cr[0];\n    context->cr1.value = state.context.cr[1];\n    context->cr2.value = state.context.cr[2];\n    context->cr3.value = state.context.cr[3];\n    context->cr4.value = state.context.cr[4];\n    context->cr5.value = state.context.cr[5];\n    context->cr6.value = state.context.cr[6];\n    context->cr7.value = state.context.cr[7];\n    context->fpscr.value = state.context.fpscr;\n    context->xer_ca = state.context.xer_ca;\n    context->xer_ov = state.context.xer_ov;\n    context->xer_so = state.context.xer_so;\n    context->vscr_sat = state.context.vscr_sat;\n\n    // Always retain when starting - the thread owns itself until exited.\n    thread->RetainHandle();\n\n    xe::threading::Thread::CreationParameters params;\n    params.create_suspended = true;  // Not done restoring yet.\n    params.stack_size = 16_MiB;\n    thread->thread_ = xe::threading::Thread::Create(params, [thread, state]() {\n      // Set thread ID override. This is used by logging.\n      xe::threading::set_current_thread_id(thread->handle());\n\n      // Set name immediately, if we have one.\n      thread->thread_->set_name(thread->name());\n\n      // Profiler needs to know about the thread.\n      xe::Profiler::ThreadEnter(thread->name().c_str());\n\n      current_xthread_tls_ = thread;\n      current_thread_ = thread;\n\n      // Acquire any mutants\n      for (auto mutant : thread->pending_mutant_acquires_) {\n        uint64_t timeout = 0;\n        auto status = mutant->Wait(0, 0, 0, &timeout);\n        assert_true(status == X_STATUS_SUCCESS);\n      }\n      thread->pending_mutant_acquires_.clear();\n\n      // Execute user code.\n      thread->running_ = true;\n\n      uint32_t pc = state.context.pc;\n      thread->kernel_state_->processor()->ExecuteRaw(thread->thread_state_, pc);\n\n      current_thread_ = nullptr;\n      current_xthread_tls_ = nullptr;\n\n      xe::Profiler::ThreadExit();\n\n      // Release the self-reference to the thread.\n      thread->ReleaseHandle();\n    });\n    assert_not_null(thread->thread_);\n\n    // Notify processor we were recreated.\n    thread->emulator()->processor()->OnThreadCreated(\n        thread->handle(), thread->thread_state(), thread);\n  }\n\n  return object_ref<XThread>(thread);\n}\n\nXHostThread::XHostThread(KernelState* kernel_state, uint32_t stack_size,\n                         uint32_t creation_flags, std::function<int()> host_fn)\n    : XThread(kernel_state, stack_size, 0, 0, 0, creation_flags, false),\n      host_fn_(host_fn) {\n  // By default host threads are not debugger suspendable. If the thread runs\n  // any guest code this must be overridden.\n  can_debugger_suspend_ = false;\n}\n\nvoid XHostThread::Execute() {\n  XELOGKERNEL(\n      \"XThread::Execute thid {} (handle={:08X}, '{}', native={:08X}, <host>)\",\n      thread_id_, handle(), thread_name_, thread_->system_id());\n\n  // Let the kernel know we are starting.\n  kernel_state()->OnThreadExecute(this);\n\n  int ret = host_fn_();\n\n  // Exit.\n  Exit(ret);\n}\n\n}  // namespace kernel\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/kernel/xthread.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_KERNEL_XTHREAD_H_\n#define XENIA_KERNEL_XTHREAD_H_\n\n#include <atomic>\n#include <string>\n\n#include \"xenia/base/mutex.h\"\n#include \"xenia/base/threading.h\"\n#include \"xenia/cpu/thread.h\"\n#include \"xenia/cpu/thread_state.h\"\n#include \"xenia/kernel/util/native_list.h\"\n#include \"xenia/kernel/xmutant.h\"\n#include \"xenia/kernel/xobject.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace kernel {\n\nconstexpr fourcc_t kThreadSaveSignature = make_fourcc(\"THRD\");\n\nclass XEvent;\n\nconstexpr uint32_t X_CREATE_SUSPENDED = 0x00000001;\n\nconstexpr uint32_t X_TLS_OUT_OF_INDEXES = UINT32_MAX;\n\nstruct XAPC {\n  static const uint32_t kSize = 40;\n  static const uint32_t kDummyKernelRoutine = 0xF00DFF00;\n  static const uint32_t kDummyRundownRoutine = 0xF00DFF01;\n\n  // KAPC is 0x28(40) bytes? (what's passed to ExAllocatePoolWithTag)\n  // This is 4b shorter than NT - looks like the reserved dword at +4 is gone.\n  // NOTE: stored in guest memory.\n  uint8_t type;                      // +0\n  uint8_t unk1;                      // +1\n  uint8_t processor_mode;            // +2\n  uint8_t enqueued;                  // +3\n  xe::be<uint32_t> thread_ptr;       // +4\n  xe::be<uint32_t> flink;            // +8\n  xe::be<uint32_t> blink;            // +12\n  xe::be<uint32_t> kernel_routine;   // +16\n  xe::be<uint32_t> rundown_routine;  // +20\n  xe::be<uint32_t> normal_routine;   // +24\n  xe::be<uint32_t> normal_context;   // +28\n  xe::be<uint32_t> arg1;             // +32\n  xe::be<uint32_t> arg2;             // +36\n\n  void Initialize() {\n    type = 18;  // ApcObject\n    unk1 = 0;\n    processor_mode = 0;\n    enqueued = 0;\n    thread_ptr = 0;\n    flink = blink = 0;\n    kernel_routine = 0;\n    normal_routine = 0;\n    normal_context = 0;\n    arg1 = arg2 = 0;\n  }\n};\n\n// Processor Control Region\nstruct X_KPCR {\n  xe::be<uint32_t> tls_ptr;         // 0x0\n  uint8_t unk_04[0x2C];             // 0x4\n  xe::be<uint32_t> pcr_ptr;         // 0x30\n  uint8_t unk_34[0x3C];             // 0x34\n  xe::be<uint32_t> stack_base_ptr;  // 0x70 Stack base address (high addr)\n  xe::be<uint32_t> stack_end_ptr;   // 0x74 Stack end (low addr)\n  uint8_t unk_78[0x88];             // 0x78\n  xe::be<uint32_t> current_thread;  // 0x100\n  uint8_t unk_104[0x8];             // 0x104\n  uint8_t current_cpu;              // 0x10C\n  uint8_t unk_10D[0x43];            // 0x10D\n  xe::be<uint32_t> dpc_active;      // 0x150\n};\n\nstruct X_KTHREAD {\n  X_DISPATCH_HEADER header;           // 0x0\n  xe::be<uint32_t> unk_10;            // 0x10\n  xe::be<uint32_t> unk_14;            // 0x14\n  uint8_t unk_18[0x28];               // 0x10\n  xe::be<uint32_t> unk_40;            // 0x40\n  xe::be<uint32_t> unk_44;            // 0x44\n  xe::be<uint32_t> unk_48;            // 0x48\n  xe::be<uint32_t> unk_4C;            // 0x4C\n  uint8_t unk_50[0x4];                // 0x50\n  xe::be<uint16_t> unk_54;            // 0x54\n  xe::be<uint16_t> unk_56;            // 0x56\n  uint8_t unk_58[0x4];                // 0x58\n  xe::be<uint32_t> stack_base;        // 0x5C\n  xe::be<uint32_t> stack_limit;       // 0x60\n  uint8_t unk_64[0x4];                // 0x64\n  xe::be<uint32_t> tls_address;       // 0x68\n  uint8_t unk_6C;                     // 0x6C\n  uint8_t unk_6D[0x7];                // 0x6D\n  xe::be<uint32_t> unk_74;            // 0x74\n  xe::be<uint32_t> unk_78;            // 0x78\n  xe::be<uint32_t> unk_7C;            // 0x7C\n  xe::be<uint32_t> unk_80;            // 0x80\n  xe::be<uint32_t> unk_84;            // 0x84\n  uint8_t unk_88[0x3];                // 0x88\n  uint8_t unk_8B;                     // 0x8B\n  uint8_t unk_8C[0x10];               // 0x8C\n  xe::be<uint32_t> unk_9C;            // 0x9C\n  uint8_t unk_A0[0x10];               // 0xA0\n  int32_t apc_disable_count;          // 0xB0\n  uint8_t unk_B4[0x8];                // 0xB4\n  uint8_t suspend_count;              // 0xBC\n  uint8_t unk_BD;                     // 0xBD\n  uint8_t unk_BE;                     // 0xBE\n  uint8_t current_cpu;                // 0xBF\n  uint8_t unk_C0[0x10];               // 0xC0\n  xe::be<uint32_t> stack_alloc_base;  // 0xD0\n  uint8_t unk_D4[0x5C];               // 0xD4\n  xe::be<uint64_t> create_time;       // 0x130\n  xe::be<uint64_t> exit_time;         // 0x138\n  xe::be<uint32_t> exit_status;       // 0x140\n  xe::be<uint32_t> unk_144;           // 0x144\n  xe::be<uint32_t> unk_148;           // 0x148\n  xe::be<uint32_t> thread_id;         // 0x14C\n  xe::be<uint32_t> start_address;     // 0x150\n  xe::be<uint32_t> unk_154;           // 0x154\n  xe::be<uint32_t> unk_158;           // 0x158\n  uint8_t unk_15C[0x4];               // 0x15C\n  xe::be<uint32_t> last_error;        // 0x160\n  xe::be<uint32_t> fiber_ptr;         // 0x164\n  uint8_t unk_168[0x4];               // 0x168\n  xe::be<uint32_t> creation_flags;    // 0x16C\n  uint8_t unk_170[0xC];               // 0x170\n  xe::be<uint32_t> unk_17C;           // 0x17C\n  uint8_t unk_180[0x930];             // 0x180\n\n  // This struct is actually quite long... so uh, not filling this out!\n};\nstatic_assert_size(X_KTHREAD, 0xAB0);\n\nclass XThread : public XObject, public cpu::Thread {\n public:\n  static const XObject::Type kObjectType = XObject::Type::Thread;\n\n  static constexpr uint32_t kStackAddressRangeBegin = 0x70000000;\n  static constexpr uint32_t kStackAddressRangeEnd = 0x7F000000;\n\n  struct CreationParams {\n    uint32_t stack_size;\n    uint32_t xapi_thread_startup;\n    uint32_t start_address;\n    uint32_t start_context;\n    uint32_t creation_flags;\n  };\n\n  XThread(KernelState* kernel_state);\n  XThread(KernelState* kernel_state, uint32_t stack_size,\n          uint32_t xapi_thread_startup, uint32_t start_address,\n          uint32_t start_context, uint32_t creation_flags, bool guest_thread,\n          bool main_thread = false);\n  ~XThread() override;\n\n  static bool IsInThread(XThread* other);\n  static bool IsInThread();\n  static XThread* GetCurrentThread();\n  static uint32_t GetCurrentThreadHandle();\n  static uint32_t GetCurrentThreadId();\n\n  static uint32_t GetLastError();\n  static void SetLastError(uint32_t error_code);\n\n  const CreationParams* creation_params() const { return &creation_params_; }\n  uint32_t tls_ptr() const { return tls_static_address_; }\n  uint32_t pcr_ptr() const { return pcr_address_; }\n  // True if the thread is created by the guest app.\n  bool is_guest_thread() const { return guest_thread_; }\n  bool main_thread() const { return main_thread_; }\n  bool is_running() const { return running_; }\n\n  uint32_t thread_id() const { return thread_id_; }\n  uint32_t last_error();\n  void set_last_error(uint32_t error_code);\n  void set_name(const std::string_view name);\n\n  X_STATUS Create();\n  X_STATUS Exit(int exit_code);\n  X_STATUS Terminate(int exit_code);\n\n  virtual void Execute();\n\n  virtual void Reenter(uint32_t address);\n\n  void EnterCriticalRegion();\n  void LeaveCriticalRegion();\n  uint32_t RaiseIrql(uint32_t new_irql);\n  void LowerIrql(uint32_t new_irql);\n\n  void CheckApcs();\n  void LockApc();\n  void UnlockApc(bool queue_delivery);\n  util::NativeList* apc_list() { return &apc_list_; }\n  void EnqueueApc(uint32_t normal_routine, uint32_t normal_context,\n                  uint32_t arg1, uint32_t arg2);\n\n  int32_t priority() const { return priority_; }\n  int32_t QueryPriority();\n  void SetPriority(int32_t increment);\n\n  // Xbox thread IDs:\n  // 0 - core 0, thread 0 - user\n  // 1 - core 0, thread 1 - user\n  // 2 - core 1, thread 0 - sometimes xcontent\n  // 3 - core 1, thread 1 - user\n  // 4 - core 2, thread 0 - xaudio\n  // 5 - core 2, thread 1 - user\n  void SetAffinity(uint32_t affinity);\n  uint8_t active_cpu() const;\n  void SetActiveCpu(uint8_t cpu_index);\n\n  bool GetTLSValue(uint32_t slot, uint32_t* value_out);\n  bool SetTLSValue(uint32_t slot, uint32_t value);\n\n  uint32_t suspend_count();\n  X_STATUS Resume(uint32_t* out_suspend_count = nullptr);\n  X_STATUS Suspend(uint32_t* out_suspend_count = nullptr);\n  X_STATUS Delay(uint32_t processor_mode, uint32_t alertable,\n                 uint64_t interval);\n\n  xe::threading::Thread* thread() { return thread_.get(); }\n\n  virtual bool Save(ByteStream* stream) override;\n  static object_ref<XThread> Restore(KernelState* kernel_state,\n                                     ByteStream* stream);\n\n  // Internal - do not use.\n  void AcquireMutantOnStartup(object_ref<XMutant> mutant) {\n    pending_mutant_acquires_.push_back(mutant);\n  }\n\n protected:\n  bool AllocateStack(uint32_t size);\n  void FreeStack();\n  void InitializeGuestObject();\n\n  void DeliverAPCs();\n  void RundownAPCs();\n\n  xe::threading::WaitHandle* GetWaitHandle() override { return thread_.get(); }\n\n  CreationParams creation_params_ = {0};\n\n  std::vector<object_ref<XMutant>> pending_mutant_acquires_;\n\n  uint32_t thread_id_ = 0;\n  uint32_t scratch_address_ = 0;\n  uint32_t scratch_size_ = 0;\n  uint32_t tls_static_address_ = 0;\n  uint32_t tls_dynamic_address_ = 0;\n  uint32_t tls_total_size_ = 0;\n  uint32_t pcr_address_ = 0;\n  uint32_t stack_alloc_base_ = 0;  // Stack alloc base\n  uint32_t stack_alloc_size_ = 0;  // Stack alloc size\n  uint32_t stack_base_ = 0;        // High address\n  uint32_t stack_limit_ = 0;       // Low address\n  bool guest_thread_ = false;\n  bool main_thread_ = false;  // Entry-point thread\n  bool running_ = false;\n\n  int32_t priority_ = 0;\n\n  xe::global_critical_region global_critical_region_;\n  std::atomic<uint32_t> irql_ = {0};\n  util::NativeList apc_list_;\n};\n\nclass XHostThread : public XThread {\n public:\n  XHostThread(KernelState* kernel_state, uint32_t stack_size,\n              uint32_t creation_flags, std::function<int()> host_fn);\n\n  virtual void Execute();\n\n private:\n  std::function<int()> host_fn_;\n};\n\n}  // namespace kernel\n}  // namespace xe\n\n#endif  // XENIA_KERNEL_XTHREAD_H_\n"
  },
  {
    "path": "src/xenia/kernel/xtimer.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/kernel/xtimer.h\"\n\n#include \"xenia/base/chrono.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/cpu/processor.h\"\n#include \"xenia/kernel/xthread.h\"\n\nnamespace xe {\nnamespace kernel {\n\nXTimer::XTimer(KernelState* kernel_state)\n    : XObject(kernel_state, kObjectType) {}\n\nXTimer::~XTimer() = default;\n\nvoid XTimer::Initialize(uint32_t timer_type) {\n  assert_false(timer_);\n  switch (timer_type) {\n    case 0:  // NotificationTimer\n      timer_ = xe::threading::Timer::CreateManualResetTimer();\n      break;\n    case 1:  // SynchronizationTimer\n      timer_ = xe::threading::Timer::CreateSynchronizationTimer();\n      break;\n    default:\n      assert_always();\n      break;\n  }\n  assert_not_null(timer_);\n}\n\nX_STATUS XTimer::SetTimer(int64_t due_time, uint32_t period_ms,\n                          uint32_t routine, uint32_t routine_arg, bool resume) {\n  using xe::chrono::WinSystemClock;\n  using xe::chrono::XSystemClock;\n  // Caller is checking for STATUS_TIMER_RESUME_IGNORED.\n  if (resume) {\n    return X_STATUS_TIMER_RESUME_IGNORED;\n  }\n\n  period_ms = Clock::ScaleGuestDurationMillis(period_ms);\n  WinSystemClock::time_point due_tp;\n  if (due_time < 0) {\n    // Any timer implementation uses absolute times eventually, convert as early\n    // as possible for increased accuracy\n    auto after = xe::chrono::hundrednanoseconds(-due_time);\n    due_tp = date::clock_cast<WinSystemClock>(XSystemClock::now() + after);\n  } else {\n    due_tp = date::clock_cast<WinSystemClock>(\n        XSystemClock::from_file_time(due_time));\n  }\n\n  // Stash routine for callback.\n  callback_thread_ = XThread::GetCurrentThread();\n  callback_routine_ = routine;\n  callback_routine_arg_ = routine_arg;\n\n  // This callback will only be issued when the timer is fired.\n  std::function<void()> callback = nullptr;\n  if (callback_routine_) {\n    callback = [this]() {\n      // Queue APC to call back routine with (arg, low, high).\n      // It'll be executed on the thread that requested the timer.\n      uint64_t time = xe::Clock::QueryGuestSystemTime();\n      uint32_t time_low = static_cast<uint32_t>(time);\n      uint32_t time_high = static_cast<uint32_t>(time >> 32);\n      XELOGI(\n          \"XTimer enqueuing timer callback to {:08X}({:08X}, {:08X}, {:08X})\",\n          callback_routine_, callback_routine_arg_, time_low, time_high);\n      callback_thread_->EnqueueApc(callback_routine_, callback_routine_arg_,\n                                   time_low, time_high);\n    };\n  }\n\n  bool result;\n  if (!period_ms) {\n    result = timer_->SetOnceAt(due_tp, std::move(callback));\n  } else {\n    result = timer_->SetRepeatingAt(\n        due_tp, std::chrono::milliseconds(period_ms), std::move(callback));\n  }\n\n  return result ? X_STATUS_SUCCESS : X_STATUS_UNSUCCESSFUL;\n}\n\nX_STATUS XTimer::Cancel() {\n  return timer_->Cancel() ? X_STATUS_SUCCESS : X_STATUS_UNSUCCESSFUL;\n}\n\n}  // namespace kernel\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/kernel/xtimer.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_KERNEL_XTIMER_H_\n#define XENIA_KERNEL_XTIMER_H_\n\n#include \"xenia/base/threading.h\"\n#include \"xenia/kernel/xobject.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace kernel {\n\nclass XThread;\n\nclass XTimer : public XObject {\n public:\n  static const XObject::Type kObjectType = XObject::Type::Timer;\n\n  explicit XTimer(KernelState* kernel_state);\n  ~XTimer() override;\n\n  void Initialize(uint32_t timer_type);\n\n  X_STATUS SetTimer(int64_t due_time, uint32_t period_ms, uint32_t routine,\n                    uint32_t routine_arg, bool resume);\n  X_STATUS Cancel();\n\n protected:\n  xe::threading::WaitHandle* GetWaitHandle() override { return timer_.get(); }\n\n private:\n  std::unique_ptr<xe::threading::Timer> timer_;\n\n  XThread* callback_thread_ = nullptr;\n  uint32_t callback_routine_ = 0;\n  uint32_t callback_routine_arg_ = 0;\n};\n\n}  // namespace kernel\n}  // namespace xe\n\n#endif  // XENIA_KERNEL_XTIMER_H_\n"
  },
  {
    "path": "src/xenia/memory.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/memory.h\"\n\n#include <algorithm>\n#include <cstring>\n#include <utility>\n\n#include \"third_party/fmt/include/fmt/format.h\"\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/byte_stream.h\"\n#include \"xenia/base/clock.h\"\n#include \"xenia/base/cvar.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/threading.h\"\n#include \"xenia/cpu/mmio_handler.h\"\n\n// TODO(benvanik): move xbox.h out\n#include \"xenia/xbox.h\"\n\nDEFINE_bool(protect_zero, true, \"Protect the zero page from reads and writes.\",\n            \"Memory\");\nDEFINE_bool(protect_on_release, false,\n            \"Protect released memory to prevent accesses.\", \"Memory\");\nDEFINE_bool(scribble_heap, false,\n            \"Scribble 0xCD into all allocated heap memory.\", \"Memory\");\n\nnamespace xe {\nuint32_t get_page_count(uint32_t value, uint32_t page_size) {\n  return xe::round_up(value, page_size) / page_size;\n}\n\n/**\n * Memory map:\n * 0x00000000 - 0x3FFFFFFF (1024mb) - virtual 4k pages\n * 0x40000000 - 0x7FFFFFFF (1024mb) - virtual 64k pages\n * 0x80000000 - 0x8BFFFFFF ( 192mb) - xex 64k pages\n * 0x8C000000 - 0x8FFFFFFF (  64mb) - xex 64k pages (encrypted)\n * 0x90000000 - 0x9FFFFFFF ( 256mb) - xex 4k pages\n * 0xA0000000 - 0xBFFFFFFF ( 512mb) - physical 64k pages\n * 0xC0000000 - 0xDFFFFFFF          - physical 16mb pages\n * 0xE0000000 - 0xFFFFFFFF          - physical 4k pages\n *\n * We use the host OS to create an entire addressable range for this. That way\n * we don't have to emulate a TLB. It'd be really cool to pass through page\n * sizes or use madvice to let the OS know what to expect.\n *\n * We create our own heap of committed memory that lives at\n * memory_HEAP_LOW to memory_HEAP_HIGH - all normal user allocations\n * come from there. Since the Xbox has no paging, we know that the size of\n * this heap will never need to be larger than ~512MB (realistically, smaller\n * than that). We place it far away from the XEX data and keep the memory\n * around it uncommitted so that we have some warning if things go astray.\n *\n * For XEX/GPU/etc data we allow placement allocations (base_address != 0) and\n * commit the requested memory as needed. This bypasses the standard heap, but\n * XEXs should never be overwriting anything so that's fine. We can also query\n * for previous commits and assert that we really isn't committing twice.\n *\n * GPU memory is mapped onto the lower 512mb of the virtual 4k range (0).\n * So 0xA0000000 = 0x00000000. A more sophisticated allocator could handle\n * this.\n */\n\nstatic Memory* active_memory_ = nullptr;\n\nvoid CrashDump() {\n  static std::atomic<int> in_crash_dump(0);\n  if (in_crash_dump.fetch_add(1)) {\n    xe::FatalError(\n        \"Hard crash: the memory system crashed while dumping a crash dump.\");\n    return;\n  }\n  active_memory_->DumpMap();\n  --in_crash_dump;\n}\n\nMemory::Memory() {\n  system_page_size_ = uint32_t(xe::memory::page_size());\n  system_allocation_granularity_ =\n      uint32_t(xe::memory::allocation_granularity());\n  assert_zero(active_memory_);\n  active_memory_ = this;\n}\n\nMemory::~Memory() {\n  assert_true(active_memory_ == this);\n  active_memory_ = nullptr;\n\n  // Uninstall the MMIO handler, as we won't be able to service more\n  // requests.\n  mmio_handler_.reset();\n\n  for (auto invalidation_callback : physical_memory_invalidation_callbacks_) {\n    delete invalidation_callback;\n  }\n\n  heaps_.v00000000.Dispose();\n  heaps_.v40000000.Dispose();\n  heaps_.v80000000.Dispose();\n  heaps_.v90000000.Dispose();\n  heaps_.vA0000000.Dispose();\n  heaps_.vC0000000.Dispose();\n  heaps_.vE0000000.Dispose();\n  heaps_.physical.Dispose();\n\n  // Unmap all views and close mapping.\n  if (mapping_ != xe::memory::kFileMappingHandleInvalid) {\n    UnmapViews();\n    xe::memory::CloseFileMappingHandle(mapping_, file_name_);\n    mapping_base_ = nullptr;\n    mapping_ = xe::memory::kFileMappingHandleInvalid;\n  }\n\n  virtual_membase_ = nullptr;\n  physical_membase_ = nullptr;\n}\n\nbool Memory::Initialize() {\n  file_name_ = fmt::format(\"xenia_memory_{}\", Clock::QueryHostTickCount());\n\n  // Create main page file-backed mapping. This is all reserved but\n  // uncommitted (so it shouldn't expand page file).\n  mapping_ = xe::memory::CreateFileMappingHandle(\n      file_name_,\n      // entire 4gb space + 512mb physical:\n      0x11FFFFFFF, xe::memory::PageAccess::kReadWrite, false);\n  if (mapping_ == xe::memory::kFileMappingHandleInvalid) {\n    XELOGE(\"Unable to reserve the 4gb guest address space.\");\n    assert_always();\n    return false;\n  }\n\n  // Attempt to create our views. This may fail at the first address\n  // we pick, so try a few times.\n  mapping_base_ = 0;\n  for (size_t n = 32; n < 64; n++) {\n    auto mapping_base = reinterpret_cast<uint8_t*>(1ull << n);\n    if (!MapViews(mapping_base)) {\n      mapping_base_ = mapping_base;\n      break;\n    }\n  }\n  if (!mapping_base_) {\n    XELOGE(\"Unable to find a continuous block in the 64bit address space.\");\n    assert_always();\n    return false;\n  }\n  virtual_membase_ = mapping_base_;\n  physical_membase_ = mapping_base_ + 0x100000000ull;\n\n  // Prepare virtual heaps.\n  heaps_.v00000000.Initialize(this, virtual_membase_, HeapType::kGuestVirtual,\n                              0x00000000, 0x40000000, 4096);\n  heaps_.v40000000.Initialize(this, virtual_membase_, HeapType::kGuestVirtual,\n                              0x40000000, 0x40000000 - 0x01000000, 64 * 1024);\n  heaps_.v80000000.Initialize(this, virtual_membase_, HeapType::kGuestXex,\n                              0x80000000, 0x10000000, 64 * 1024);\n  heaps_.v90000000.Initialize(this, virtual_membase_, HeapType::kGuestXex,\n                              0x90000000, 0x10000000, 4096);\n\n  // Prepare physical heaps.\n  heaps_.physical.Initialize(this, physical_membase_, HeapType::kGuestPhysical,\n                             0x00000000, 0x20000000, 4096);\n  heaps_.vA0000000.Initialize(this, virtual_membase_, HeapType::kGuestPhysical,\n                              0xA0000000, 0x20000000, 64 * 1024,\n                              &heaps_.physical);\n  heaps_.vC0000000.Initialize(this, virtual_membase_, HeapType::kGuestPhysical,\n                              0xC0000000, 0x20000000, 16 * 1024 * 1024,\n                              &heaps_.physical);\n  heaps_.vE0000000.Initialize(this, virtual_membase_, HeapType::kGuestPhysical,\n                              0xE0000000, 0x1FD00000, 4096, &heaps_.physical);\n\n  // Protect the first and last 64kb of memory.\n  heaps_.v00000000.AllocFixed(\n      0x00000000, 0x10000, 0x10000,\n      kMemoryAllocationReserve | kMemoryAllocationCommit,\n      !cvars::protect_zero ? kMemoryProtectRead | kMemoryProtectWrite\n                           : kMemoryProtectNoAccess);\n  heaps_.physical.AllocFixed(0x1FFF0000, 0x10000, 0x10000,\n                             kMemoryAllocationReserve, kMemoryProtectNoAccess);\n\n  // GPU writeback.\n  // 0xC... is physical, 0x7F... is virtual. We may need to overlay these.\n  heaps_.vC0000000.AllocFixed(\n      0xC0000000, 0x01000000, 32,\n      kMemoryAllocationReserve | kMemoryAllocationCommit,\n      kMemoryProtectRead | kMemoryProtectWrite);\n\n  // Add handlers for MMIO.\n  mmio_handler_ = cpu::MMIOHandler::Install(\n      virtual_membase_, physical_membase_, physical_membase_ + 0x1FFFFFFF,\n      HostToGuestVirtualThunk, this, AccessViolationCallbackThunk, this);\n  if (!mmio_handler_) {\n    XELOGE(\"Unable to install MMIO handlers\");\n    assert_always();\n    return false;\n  }\n\n  // ?\n  uint32_t unk_phys_alloc;\n  heaps_.vA0000000.Alloc(0x340000, 64 * 1024, kMemoryAllocationReserve,\n                         kMemoryProtectNoAccess, true, &unk_phys_alloc);\n\n  return true;\n}\n\nstatic const struct {\n  uint64_t virtual_address_start;\n  uint64_t virtual_address_end;\n  uint64_t target_address;\n} map_info[] = {\n    // (1024mb) - virtual 4k pages\n    {\n        0x00000000,\n        0x3FFFFFFF,\n        0x0000000000000000ull,\n    },\n    // (1024mb) - virtual 64k pages (cont)\n    {\n        0x40000000,\n        0x7EFFFFFF,\n        0x0000000040000000ull,\n    },\n    //   (16mb) - GPU writeback + 15mb of XPS?\n    {\n        0x7F000000,\n        0x7FFFFFFF,\n        0x0000000100000000ull,\n    },\n    //  (256mb) - xex 64k pages\n    {\n        0x80000000,\n        0x8FFFFFFF,\n        0x0000000080000000ull,\n    },\n    //  (256mb) - xex 4k pages\n    {\n        0x90000000,\n        0x9FFFFFFF,\n        0x0000000080000000ull,\n    },\n    //  (512mb) - physical 64k pages\n    {\n        0xA0000000,\n        0xBFFFFFFF,\n        0x0000000100000000ull,\n    },\n    //          - physical 16mb pages\n    {\n        0xC0000000,\n        0xDFFFFFFF,\n        0x0000000100000000ull,\n    },\n    //          - physical 4k pages\n    {\n        0xE0000000,\n        0xFFFFFFFF,\n        0x0000000100001000ull,\n    },\n    //          - physical raw\n    {\n        0x100000000,\n        0x11FFFFFFF,\n        0x0000000100000000ull,\n    },\n};\nint Memory::MapViews(uint8_t* mapping_base) {\n  assert_true(xe::countof(map_info) == xe::countof(views_.all_views));\n  // 0xE0000000 4 KB offset is emulated via host_address_offset and on the CPU\n  // side if system allocation granularity is bigger than 4 KB.\n  uint64_t granularity_mask = ~uint64_t(system_allocation_granularity_ - 1);\n  for (size_t n = 0; n < xe::countof(map_info); n++) {\n    views_.all_views[n] = reinterpret_cast<uint8_t*>(xe::memory::MapFileView(\n        mapping_, mapping_base + map_info[n].virtual_address_start,\n        map_info[n].virtual_address_end - map_info[n].virtual_address_start + 1,\n        xe::memory::PageAccess::kReadWrite,\n        map_info[n].target_address & granularity_mask));\n    if (!views_.all_views[n]) {\n      // Failed, so bail and try again.\n      UnmapViews();\n      return 1;\n    }\n  }\n  return 0;\n}\n\nvoid Memory::UnmapViews() {\n  for (size_t n = 0; n < xe::countof(views_.all_views); n++) {\n    if (views_.all_views[n]) {\n      size_t length = map_info[n].virtual_address_end -\n                      map_info[n].virtual_address_start + 1;\n      xe::memory::UnmapFileView(mapping_, views_.all_views[n], length);\n    }\n  }\n}\n\nvoid Memory::Reset() {\n  heaps_.v00000000.Reset();\n  heaps_.v40000000.Reset();\n  heaps_.v80000000.Reset();\n  heaps_.v90000000.Reset();\n  heaps_.physical.Reset();\n}\n\nconst BaseHeap* Memory::LookupHeap(uint32_t address) const {\n  if (address < 0x40000000) {\n    return &heaps_.v00000000;\n  } else if (address < 0x7F000000) {\n    return &heaps_.v40000000;\n  } else if (address < 0x80000000) {\n    return nullptr;\n  } else if (address < 0x90000000) {\n    return &heaps_.v80000000;\n  } else if (address < 0xA0000000) {\n    return &heaps_.v90000000;\n  } else if (address < 0xC0000000) {\n    return &heaps_.vA0000000;\n  } else if (address < 0xE0000000) {\n    return &heaps_.vC0000000;\n  } else if (address < 0xFFD00000) {\n    return &heaps_.vE0000000;\n  } else {\n    return nullptr;\n  }\n}\n\nBaseHeap* Memory::LookupHeapByType(bool physical, uint32_t page_size) {\n  if (physical) {\n    if (page_size <= 4096) {\n      return &heaps_.vE0000000;\n    } else if (page_size <= 64 * 1024) {\n      return &heaps_.vA0000000;\n    } else {\n      return &heaps_.vC0000000;\n    }\n  } else {\n    if (page_size <= 4096) {\n      return &heaps_.v00000000;\n    } else {\n      return &heaps_.v40000000;\n    }\n  }\n}\n\nVirtualHeap* Memory::GetPhysicalHeap() { return &heaps_.physical; }\n\nuint32_t Memory::HostToGuestVirtual(const void* host_address) const {\n  size_t virtual_address = reinterpret_cast<size_t>(host_address) -\n                           reinterpret_cast<size_t>(virtual_membase_);\n  uint32_t vE0000000_host_offset = heaps_.vE0000000.host_address_offset();\n  size_t vE0000000_host_base =\n      size_t(heaps_.vE0000000.heap_base()) + vE0000000_host_offset;\n  if (virtual_address >= vE0000000_host_base &&\n      virtual_address <=\n          (vE0000000_host_base + (heaps_.vE0000000.heap_size() - 1))) {\n    virtual_address -= vE0000000_host_offset;\n  }\n  return uint32_t(virtual_address);\n}\n\nuint32_t Memory::HostToGuestVirtualThunk(const void* context,\n                                         const void* host_address) {\n  return reinterpret_cast<const Memory*>(context)->HostToGuestVirtual(\n      host_address);\n}\n\nuint32_t Memory::GetPhysicalAddress(uint32_t address) const {\n  const BaseHeap* heap = LookupHeap(address);\n  if (!heap || heap->heap_type() != HeapType::kGuestPhysical) {\n    return UINT32_MAX;\n  }\n  return static_cast<const PhysicalHeap*>(heap)->GetPhysicalAddress(address);\n}\n\nvoid Memory::Zero(uint32_t address, uint32_t size) {\n  std::memset(TranslateVirtual(address), 0, size);\n}\n\nvoid Memory::Fill(uint32_t address, uint32_t size, uint8_t value) {\n  std::memset(TranslateVirtual(address), value, size);\n}\n\nvoid Memory::Copy(uint32_t dest, uint32_t src, uint32_t size) {\n  uint8_t* pdest = TranslateVirtual(dest);\n  const uint8_t* psrc = TranslateVirtual(src);\n  std::memcpy(pdest, psrc, size);\n}\n\nuint32_t Memory::SearchAligned(uint32_t start, uint32_t end,\n                               const uint32_t* values, size_t value_count) {\n  assert_true(start <= end);\n  auto p = TranslateVirtual<const uint32_t*>(start);\n  auto pe = TranslateVirtual<const uint32_t*>(end);\n  while (p != pe) {\n    if (*p == values[0]) {\n      const uint32_t* pc = p + 1;\n      size_t matched = 1;\n      for (size_t n = 1; n < value_count; n++, pc++) {\n        if (*pc != values[n]) {\n          break;\n        }\n        matched++;\n      }\n      if (matched == value_count) {\n        return HostToGuestVirtual(p);\n      }\n    }\n    p++;\n  }\n  return 0;\n}\n\nbool Memory::AddVirtualMappedRange(uint32_t virtual_address, uint32_t mask,\n                                   uint32_t size, void* context,\n                                   cpu::MMIOReadCallback read_callback,\n                                   cpu::MMIOWriteCallback write_callback) {\n  if (!xe::memory::AllocFixed(TranslateVirtual(virtual_address), size,\n                              xe::memory::AllocationType::kCommit,\n                              xe::memory::PageAccess::kNoAccess)) {\n    XELOGE(\"Unable to map range; commit/protect failed\");\n    return false;\n  }\n  return mmio_handler_->RegisterRange(virtual_address, mask, size, context,\n                                      read_callback, write_callback);\n}\n\ncpu::MMIORange* Memory::LookupVirtualMappedRange(uint32_t virtual_address) {\n  return mmio_handler_->LookupRange(virtual_address);\n}\n\nbool Memory::AccessViolationCallback(\n    std::unique_lock<std::recursive_mutex> global_lock_locked_once,\n    void* host_address, bool is_write) {\n  // Access via physical_membase_ is special, when need to bypass everything\n  // (for instance, for a data provider to actually write the data) so only\n  // triggering callbacks on virtual memory regions.\n  if (reinterpret_cast<size_t>(host_address) <\n          reinterpret_cast<size_t>(virtual_membase_) ||\n      reinterpret_cast<size_t>(host_address) >=\n          reinterpret_cast<size_t>(physical_membase_)) {\n    return false;\n  }\n  uint32_t virtual_address = HostToGuestVirtual(host_address);\n  BaseHeap* heap = LookupHeap(virtual_address);\n  if (heap->heap_type() != HeapType::kGuestPhysical) {\n    return false;\n  }\n\n  // Access violation callbacks from the guest are triggered when the global\n  // critical region mutex is locked once.\n  //\n  // Will be rounded to physical page boundaries internally, so just pass 1 as\n  // the length - guranteed not to cross page boundaries also.\n  auto physical_heap = static_cast<PhysicalHeap*>(heap);\n  return physical_heap->TriggerCallbacks(std::move(global_lock_locked_once),\n                                         virtual_address, 1, is_write, false);\n}\n\nbool Memory::AccessViolationCallbackThunk(\n    std::unique_lock<std::recursive_mutex> global_lock_locked_once,\n    void* context, void* host_address, bool is_write) {\n  return reinterpret_cast<Memory*>(context)->AccessViolationCallback(\n      std::move(global_lock_locked_once), host_address, is_write);\n}\n\nbool Memory::TriggerPhysicalMemoryCallbacks(\n    std::unique_lock<std::recursive_mutex> global_lock_locked_once,\n    uint32_t virtual_address, uint32_t length, bool is_write,\n    bool unwatch_exact_range, bool unprotect) {\n  BaseHeap* heap = LookupHeap(virtual_address);\n  if (heap->heap_type() == HeapType::kGuestPhysical) {\n    auto physical_heap = static_cast<PhysicalHeap*>(heap);\n    return physical_heap->TriggerCallbacks(std::move(global_lock_locked_once),\n                                           virtual_address, length, is_write,\n                                           unwatch_exact_range, unprotect);\n  }\n  return false;\n}\n\nvoid* Memory::RegisterPhysicalMemoryInvalidationCallback(\n    PhysicalMemoryInvalidationCallback callback, void* callback_context) {\n  auto entry = new std::pair<PhysicalMemoryInvalidationCallback, void*>(\n      callback, callback_context);\n  auto lock = global_critical_region_.Acquire();\n  physical_memory_invalidation_callbacks_.push_back(entry);\n  return entry;\n}\n\nvoid Memory::UnregisterPhysicalMemoryInvalidationCallback(\n    void* callback_handle) {\n  auto entry =\n      reinterpret_cast<std::pair<PhysicalMemoryInvalidationCallback, void*>*>(\n          callback_handle);\n  {\n    auto lock = global_critical_region_.Acquire();\n    auto it = std::find(physical_memory_invalidation_callbacks_.begin(),\n                        physical_memory_invalidation_callbacks_.end(), entry);\n    assert_true(it != physical_memory_invalidation_callbacks_.end());\n    if (it != physical_memory_invalidation_callbacks_.end()) {\n      physical_memory_invalidation_callbacks_.erase(it);\n    }\n  }\n  delete entry;\n}\n\nvoid Memory::EnablePhysicalMemoryAccessCallbacks(\n    uint32_t physical_address, uint32_t length,\n    bool enable_invalidation_notifications, bool enable_data_providers) {\n  heaps_.vA0000000.EnableAccessCallbacks(physical_address, length,\n                                         enable_invalidation_notifications,\n                                         enable_data_providers);\n  heaps_.vC0000000.EnableAccessCallbacks(physical_address, length,\n                                         enable_invalidation_notifications,\n                                         enable_data_providers);\n  heaps_.vE0000000.EnableAccessCallbacks(physical_address, length,\n                                         enable_invalidation_notifications,\n                                         enable_data_providers);\n}\n\nuint32_t Memory::SystemHeapAlloc(uint32_t size, uint32_t alignment,\n                                 uint32_t system_heap_flags) {\n  // TODO(benvanik): lightweight pool.\n  bool is_physical = !!(system_heap_flags & kSystemHeapPhysical);\n  auto heap = LookupHeapByType(is_physical, 4096);\n  uint32_t address;\n  if (!heap->Alloc(size, alignment,\n                   kMemoryAllocationReserve | kMemoryAllocationCommit,\n                   kMemoryProtectRead | kMemoryProtectWrite, false, &address)) {\n    return 0;\n  }\n  Zero(address, size);\n  return address;\n}\n\nvoid Memory::SystemHeapFree(uint32_t address) {\n  if (!address) {\n    return;\n  }\n  // TODO(benvanik): lightweight pool.\n  auto heap = LookupHeap(address);\n  heap->Release(address);\n}\n\nvoid Memory::DumpMap() {\n  XELOGE(\"==================================================================\");\n  XELOGE(\"Memory Dump\");\n  XELOGE(\"==================================================================\");\n  XELOGE(\"               System Page Size: {0} ({0:08X})\", system_page_size_);\n  XELOGE(\"  System Allocation Granularity: {0} ({0:08X})\",\n         system_allocation_granularity_);\n  XELOGE(\"                Virtual Membase: {}\", virtual_membase_);\n  XELOGE(\"               Physical Membase: {}\", physical_membase_);\n  XELOGE(\"\");\n  XELOGE(\"------------------------------------------------------------------\");\n  XELOGE(\"Virtual Heaps\");\n  XELOGE(\"------------------------------------------------------------------\");\n  XELOGE(\"\");\n  heaps_.v00000000.DumpMap();\n  heaps_.v40000000.DumpMap();\n  heaps_.v80000000.DumpMap();\n  heaps_.v90000000.DumpMap();\n  XELOGE(\"\");\n  XELOGE(\"------------------------------------------------------------------\");\n  XELOGE(\"Physical Heaps\");\n  XELOGE(\"------------------------------------------------------------------\");\n  XELOGE(\"\");\n  heaps_.physical.DumpMap();\n  heaps_.vA0000000.DumpMap();\n  heaps_.vC0000000.DumpMap();\n  heaps_.vE0000000.DumpMap();\n  XELOGE(\"\");\n}\n\nbool Memory::Save(ByteStream* stream) {\n  XELOGD(\"Serializing memory...\");\n  heaps_.v00000000.Save(stream);\n  heaps_.v40000000.Save(stream);\n  heaps_.v80000000.Save(stream);\n  heaps_.v90000000.Save(stream);\n  heaps_.physical.Save(stream);\n\n  return true;\n}\n\nbool Memory::Restore(ByteStream* stream) {\n  XELOGD(\"Restoring memory...\");\n  heaps_.v00000000.Restore(stream);\n  heaps_.v40000000.Restore(stream);\n  heaps_.v80000000.Restore(stream);\n  heaps_.v90000000.Restore(stream);\n  heaps_.physical.Restore(stream);\n\n  return true;\n}\n\nxe::memory::PageAccess ToPageAccess(uint32_t protect) {\n  if ((protect & kMemoryProtectRead) && !(protect & kMemoryProtectWrite)) {\n    return xe::memory::PageAccess::kReadOnly;\n  } else if ((protect & kMemoryProtectRead) &&\n             (protect & kMemoryProtectWrite)) {\n    return xe::memory::PageAccess::kReadWrite;\n  } else {\n    return xe::memory::PageAccess::kNoAccess;\n  }\n}\n\nuint32_t FromPageAccess(xe::memory::PageAccess protect) {\n  switch (protect) {\n    case memory::PageAccess::kNoAccess:\n      return kMemoryProtectNoAccess;\n    case memory::PageAccess::kReadOnly:\n      return kMemoryProtectRead;\n    case memory::PageAccess::kReadWrite:\n      return kMemoryProtectRead | kMemoryProtectWrite;\n    case memory::PageAccess::kExecuteReadOnly:\n      // Guest memory cannot be executable - this should never happen :)\n      assert_always();\n      return kMemoryProtectRead;\n    case memory::PageAccess::kExecuteReadWrite:\n      // Guest memory cannot be executable - this should never happen :)\n      assert_always();\n      return kMemoryProtectRead | kMemoryProtectWrite;\n  }\n\n  return kMemoryProtectNoAccess;\n}\n\nBaseHeap::BaseHeap()\n    : membase_(nullptr), heap_base_(0), heap_size_(0), page_size_(0) {}\n\nBaseHeap::~BaseHeap() = default;\n\nvoid BaseHeap::Initialize(Memory* memory, uint8_t* membase, HeapType heap_type,\n                          uint32_t heap_base, uint32_t heap_size,\n                          uint32_t page_size, uint32_t host_address_offset) {\n  memory_ = memory;\n  membase_ = membase;\n  heap_type_ = heap_type;\n  heap_base_ = heap_base;\n  heap_size_ = heap_size;\n  page_size_ = page_size;\n  host_address_offset_ = host_address_offset;\n  page_table_.resize(heap_size / page_size);\n}\n\nvoid BaseHeap::Dispose() {\n  // Walk table and release all regions.\n  for (uint32_t page_number = 0; page_number < page_table_.size();\n       ++page_number) {\n    auto& page_entry = page_table_[page_number];\n    if (page_entry.state) {\n      xe::memory::DeallocFixed(TranslateRelative(page_number * page_size_), 0,\n                               xe::memory::DeallocationType::kRelease);\n      page_number += page_entry.region_page_count;\n    }\n  }\n}\n\nvoid BaseHeap::DumpMap() {\n  auto global_lock = global_critical_region_.Acquire();\n  XELOGE(\"------------------------------------------------------------------\");\n  XELOGE(\"Heap: {:08X}-{:08X}\", heap_base_, heap_base_ + (heap_size_ - 1));\n  XELOGE(\"------------------------------------------------------------------\");\n  XELOGE(\"            Heap Base: {:08X}\", heap_base_);\n  XELOGE(\"            Heap Size: {0} ({0:08X})\", heap_size_);\n  XELOGE(\"            Page Size: {0} ({0:08X})\", page_size_);\n  XELOGE(\"           Page Count: {}\", page_table_.size());\n  XELOGE(\"  Host Address Offset: {0} ({0:08X})\", host_address_offset_);\n  bool is_empty_span = false;\n  uint32_t empty_span_start = 0;\n  for (uint32_t i = 0; i < uint32_t(page_table_.size()); ++i) {\n    auto& page = page_table_[i];\n    if (!page.state) {\n      if (!is_empty_span) {\n        is_empty_span = true;\n        empty_span_start = i;\n      }\n      continue;\n    }\n    if (is_empty_span) {\n      XELOGE(\"  {:08X}-{:08X} {:6d}p {:10d}b unreserved\",\n             heap_base_ + empty_span_start * page_size_,\n             heap_base_ + i * page_size_, i - empty_span_start,\n             (i - empty_span_start) * page_size_);\n      is_empty_span = false;\n    }\n    const char* state_name = \"   \";\n    if (page.state & kMemoryAllocationCommit) {\n      state_name = \"COM\";\n    } else if (page.state & kMemoryAllocationReserve) {\n      state_name = \"RES\";\n    }\n    char access_r = (page.current_protect & kMemoryProtectRead) ? 'R' : ' ';\n    char access_w = (page.current_protect & kMemoryProtectWrite) ? 'W' : ' ';\n    XELOGE(\"  {:08X}-{:08X} {:6d}p {:10d}b {} {}{}\",\n           heap_base_ + i * page_size_,\n           heap_base_ + (i + page.region_page_count) * page_size_,\n           page.region_page_count, page.region_page_count * page_size_,\n           state_name, access_r, access_w);\n    i += page.region_page_count - 1;\n  }\n  if (is_empty_span) {\n    XELOGE(\"  {:08X}-{:08X} - {} unreserved pages)\",\n           heap_base_ + empty_span_start * page_size_,\n           heap_base_ + (heap_size_ - 1),\n           page_table_.size() - empty_span_start);\n  }\n}\n\nuint32_t BaseHeap::GetTotalPageCount() { return uint32_t(page_table_.size()); }\n\nuint32_t BaseHeap::GetUnreservedPageCount() {\n  auto global_lock = global_critical_region_.Acquire();\n  uint32_t count = 0;\n  bool is_empty_span = false;\n  uint32_t empty_span_start = 0;\n  uint32_t size = uint32_t(page_table_.size());\n  for (uint32_t i = 0; i < size; ++i) {\n    auto& page = page_table_[i];\n    if (!page.state) {\n      if (!is_empty_span) {\n        is_empty_span = true;\n        empty_span_start = i;\n      }\n      continue;\n    }\n    if (is_empty_span) {\n      is_empty_span = false;\n      count += i - empty_span_start;\n    }\n    i += page.region_page_count - 1;\n  }\n  if (is_empty_span) {\n    count += size - empty_span_start;\n  }\n  return count;\n}\n\nbool BaseHeap::Save(ByteStream* stream) {\n  XELOGD(\"Heap {:08X}-{:08X}\", heap_base_, heap_base_ + (heap_size_ - 1));\n\n  for (size_t i = 0; i < page_table_.size(); i++) {\n    auto& page = page_table_[i];\n    stream->Write(page.qword);\n    if (!page.state) {\n      // Unallocated.\n      continue;\n    }\n\n    // TODO(DrChat): write compressed with snappy.\n    if (page.state & kMemoryAllocationCommit) {\n      void* addr = TranslateRelative(i * page_size_);\n\n      memory::PageAccess old_access;\n      memory::Protect(addr, page_size_, memory::PageAccess::kReadWrite,\n                      &old_access);\n\n      stream->Write(addr, page_size_);\n\n      memory::Protect(addr, page_size_, old_access, nullptr);\n    }\n  }\n\n  return true;\n}\n\nbool BaseHeap::Restore(ByteStream* stream) {\n  XELOGD(\"Heap {:08X}-{:08X}\", heap_base_, heap_base_ + (heap_size_ - 1));\n\n  for (size_t i = 0; i < page_table_.size(); i++) {\n    auto& page = page_table_[i];\n    page.qword = stream->Read<uint64_t>();\n    if (!page.state) {\n      // Unallocated.\n      continue;\n    }\n\n    memory::PageAccess page_access = memory::PageAccess::kNoAccess;\n    if ((page.current_protect & kMemoryProtectRead) &&\n        (page.current_protect & kMemoryProtectWrite)) {\n      page_access = memory::PageAccess::kReadWrite;\n    } else if (page.current_protect & kMemoryProtectRead) {\n      page_access = memory::PageAccess::kReadOnly;\n    }\n\n    // Commit the memory if it isn't already. We do not need to reserve any\n    // memory, as the mapping has already taken care of that.\n    if (page.state & kMemoryAllocationCommit) {\n      xe::memory::AllocFixed(TranslateRelative(i * page_size_), page_size_,\n                             memory::AllocationType::kCommit,\n                             memory::PageAccess::kReadWrite);\n    }\n\n    // Now read into memory. We'll set R/W protection first, then set the\n    // protection back to its previous state.\n    // TODO(DrChat): read compressed with snappy.\n    if (page.state & kMemoryAllocationCommit) {\n      void* addr = TranslateRelative(i * page_size_);\n      xe::memory::Protect(addr, page_size_, memory::PageAccess::kReadWrite,\n                          nullptr);\n\n      stream->Read(addr, page_size_);\n\n      xe::memory::Protect(addr, page_size_, page_access, nullptr);\n    }\n  }\n\n  return true;\n}\n\nvoid BaseHeap::Reset() {\n  // TODO(DrChat): protect pages.\n  std::memset(page_table_.data(), 0, sizeof(PageEntry) * page_table_.size());\n  // TODO(Triang3l): Remove access callbacks from pages if this is a physical\n  // memory heap.\n}\n\nbool BaseHeap::Alloc(uint32_t size, uint32_t alignment,\n                     uint32_t allocation_type, uint32_t protect, bool top_down,\n                     uint32_t* out_address) {\n  *out_address = 0;\n  size = xe::round_up(size, page_size_);\n  alignment = xe::round_up(alignment, page_size_);\n  uint32_t low_address = heap_base_;\n  uint32_t high_address = heap_base_ + (heap_size_ - 1);\n  return AllocRange(low_address, high_address, size, alignment, allocation_type,\n                    protect, top_down, out_address);\n}\n\nbool BaseHeap::AllocFixed(uint32_t base_address, uint32_t size,\n                          uint32_t alignment, uint32_t allocation_type,\n                          uint32_t protect) {\n  alignment = xe::round_up(alignment, page_size_);\n  size = xe::align(size, alignment);\n  assert_true(base_address % alignment == 0);\n  uint32_t page_count = get_page_count(size, page_size_);\n  uint32_t start_page_number = (base_address - heap_base_) / page_size_;\n  uint32_t end_page_number = start_page_number + page_count - 1;\n  if (start_page_number >= page_table_.size() ||\n      end_page_number > page_table_.size()) {\n    XELOGE(\"BaseHeap::AllocFixed passed out of range address range\");\n    return false;\n  }\n\n  auto global_lock = global_critical_region_.Acquire();\n\n  // - If we are reserving the entire range requested must not be already\n  //   reserved.\n  // - If we are committing it's ok for pages within the range to already be\n  //   committed.\n  for (uint32_t page_number = start_page_number; page_number <= end_page_number;\n       ++page_number) {\n    uint32_t state = page_table_[page_number].state;\n    if ((allocation_type == kMemoryAllocationReserve) && state) {\n      // Already reserved.\n      XELOGE(\n          \"BaseHeap::AllocFixed attempting to reserve an already reserved \"\n          \"range\");\n      return false;\n    }\n    if ((allocation_type == kMemoryAllocationCommit) &&\n        !(state & kMemoryAllocationReserve)) {\n      // Attempting a commit-only op on an unreserved page.\n      // This may be OK.\n      XELOGW(\"BaseHeap::AllocFixed attempting commit on unreserved page\");\n      allocation_type |= kMemoryAllocationReserve;\n      break;\n    }\n  }\n\n  // Allocate from host.\n  if (allocation_type == kMemoryAllocationReserve) {\n    // Reserve is not needed, as we are mapped already.\n  } else {\n    auto alloc_type = (allocation_type & kMemoryAllocationCommit)\n                          ? xe::memory::AllocationType::kCommit\n                          : xe::memory::AllocationType::kReserve;\n    void* result = xe::memory::AllocFixed(\n        TranslateRelative(start_page_number * page_size_),\n        page_count * page_size_, alloc_type, ToPageAccess(protect));\n    if (!result) {\n      XELOGE(\"BaseHeap::AllocFixed failed to alloc range from host\");\n      return false;\n    }\n\n    if (cvars::scribble_heap && protect & kMemoryProtectWrite) {\n      std::memset(result, 0xCD, page_count * page_size_);\n    }\n  }\n\n  // Set page state.\n  for (uint32_t page_number = start_page_number; page_number <= end_page_number;\n       ++page_number) {\n    auto& page_entry = page_table_[page_number];\n    if (allocation_type & kMemoryAllocationReserve) {\n      // Region is based on reservation.\n      page_entry.base_address = start_page_number;\n      page_entry.region_page_count = page_count;\n    }\n    page_entry.allocation_protect = protect;\n    page_entry.current_protect = protect;\n    page_entry.state = kMemoryAllocationReserve | allocation_type;\n  }\n\n  return true;\n}\n\nbool BaseHeap::AllocRange(uint32_t low_address, uint32_t high_address,\n                          uint32_t size, uint32_t alignment,\n                          uint32_t allocation_type, uint32_t protect,\n                          bool top_down, uint32_t* out_address) {\n  *out_address = 0;\n\n  alignment = xe::round_up(alignment, page_size_);\n  uint32_t page_count = get_page_count(size, page_size_);\n  low_address = std::max(heap_base_, xe::align(low_address, alignment));\n  high_address = std::min(heap_base_ + (heap_size_ - 1),\n                          xe::align(high_address, alignment));\n  uint32_t low_page_number = (low_address - heap_base_) / page_size_;\n  uint32_t high_page_number = (high_address - heap_base_) / page_size_;\n  low_page_number = std::min(uint32_t(page_table_.size()) - 1, low_page_number);\n  high_page_number =\n      std::min(uint32_t(page_table_.size()) - 1, high_page_number);\n\n  if (page_count > (high_page_number - low_page_number)) {\n    XELOGE(\"BaseHeap::Alloc page count too big for requested range\");\n    return false;\n  }\n\n  auto global_lock = global_critical_region_.Acquire();\n\n  // Find a free page range.\n  // The base page must match the requested alignment, so we first scan for\n  // a free aligned page and only then check for continuous free pages.\n  // TODO(benvanik): optimized searching (free list buckets, bitmap, etc).\n  uint32_t start_page_number = UINT_MAX;\n  uint32_t end_page_number = UINT_MAX;\n  uint32_t page_scan_stride = alignment / page_size_;\n  high_page_number = high_page_number - (high_page_number % page_scan_stride);\n  if (top_down) {\n    for (int64_t base_page_number =\n             high_page_number - xe::round_up(page_count, page_scan_stride);\n         base_page_number >= low_page_number;\n         base_page_number -= page_scan_stride) {\n      if (page_table_[base_page_number].state != 0) {\n        // Base page not free, skip to next usable page.\n        continue;\n      }\n      // Check requested range to ensure free.\n      start_page_number = uint32_t(base_page_number);\n      end_page_number = uint32_t(base_page_number) + page_count - 1;\n      assert_true(end_page_number < page_table_.size());\n      bool any_taken = false;\n      for (uint32_t page_number = uint32_t(base_page_number);\n           !any_taken && page_number <= end_page_number; ++page_number) {\n        bool is_free = page_table_[page_number].state == 0;\n        if (!is_free) {\n          // At least one page in the range is used, skip to next.\n          // We know we'll be starting at least before this page.\n          any_taken = true;\n          if (page_count > page_number) {\n            // Not enough space left to fit entire page range. Breaks outer\n            // loop.\n            base_page_number = -1;\n          } else {\n            base_page_number = page_number - page_count;\n            base_page_number -= base_page_number % page_scan_stride;\n            base_page_number += page_scan_stride;  // cancel out loop logic\n          }\n          break;\n        }\n      }\n      if (!any_taken) {\n        // Found our place.\n        break;\n      }\n      // Retry.\n      start_page_number = end_page_number = UINT_MAX;\n    }\n  } else {\n    for (uint32_t base_page_number = low_page_number;\n         base_page_number <= high_page_number - page_count;\n         base_page_number += page_scan_stride) {\n      if (page_table_[base_page_number].state != 0) {\n        // Base page not free, skip to next usable page.\n        continue;\n      }\n      // Check requested range to ensure free.\n      start_page_number = base_page_number;\n      end_page_number = base_page_number + page_count - 1;\n      bool any_taken = false;\n      for (uint32_t page_number = base_page_number;\n           !any_taken && page_number <= end_page_number; ++page_number) {\n        bool is_free = page_table_[page_number].state == 0;\n        if (!is_free) {\n          // At least one page in the range is used, skip to next.\n          // We know we'll be starting at least after this page.\n          any_taken = true;\n          base_page_number = xe::round_up(page_number + 1, page_scan_stride);\n          base_page_number -= page_scan_stride;  // cancel out loop logic\n          break;\n        }\n      }\n      if (!any_taken) {\n        // Found our place.\n        break;\n      }\n      // Retry.\n      start_page_number = end_page_number = UINT_MAX;\n    }\n  }\n  if (start_page_number == UINT_MAX || end_page_number == UINT_MAX) {\n    // Out of memory.\n    XELOGE(\"BaseHeap::Alloc failed to find contiguous range\");\n    assert_always(\"Heap exhausted!\");\n    return false;\n  }\n\n  // Allocate from host.\n  if (allocation_type == kMemoryAllocationReserve) {\n    // Reserve is not needed, as we are mapped already.\n  } else {\n    auto alloc_type = (allocation_type & kMemoryAllocationCommit)\n                          ? xe::memory::AllocationType::kCommit\n                          : xe::memory::AllocationType::kReserve;\n    void* result = xe::memory::AllocFixed(\n        TranslateRelative(start_page_number * page_size_),\n        page_count * page_size_, alloc_type, ToPageAccess(protect));\n    if (!result) {\n      XELOGE(\"BaseHeap::Alloc failed to alloc range from host\");\n      return false;\n    }\n\n    if (cvars::scribble_heap && (protect & kMemoryProtectWrite)) {\n      std::memset(result, 0xCD, page_count * page_size_);\n    }\n  }\n\n  // Set page state.\n  for (uint32_t page_number = start_page_number; page_number <= end_page_number;\n       ++page_number) {\n    auto& page_entry = page_table_[page_number];\n    page_entry.base_address = start_page_number;\n    page_entry.region_page_count = page_count;\n    page_entry.allocation_protect = protect;\n    page_entry.current_protect = protect;\n    page_entry.state = kMemoryAllocationReserve | allocation_type;\n  }\n\n  *out_address = heap_base_ + (start_page_number * page_size_);\n  return true;\n}\n\nbool BaseHeap::Decommit(uint32_t address, uint32_t size) {\n  uint32_t page_count = get_page_count(size, page_size_);\n  uint32_t start_page_number = (address - heap_base_) / page_size_;\n  uint32_t end_page_number = start_page_number + page_count - 1;\n  start_page_number =\n      std::min(uint32_t(page_table_.size()) - 1, start_page_number);\n  end_page_number = std::min(uint32_t(page_table_.size()) - 1, end_page_number);\n\n  auto global_lock = global_critical_region_.Acquire();\n\n  // Release from host.\n  // TODO(benvanik): find a way to actually decommit memory;\n  //     mapped memory cannot be decommitted.\n  /*BOOL result =\n      VirtualFree(TranslateRelative(start_page_number * page_size_),\n                  page_count * page_size_, MEM_DECOMMIT);\n  if (!result) {\n    PLOGW(\"BaseHeap::Decommit failed due to host VirtualFree failure\");\n    return false;\n  }*/\n\n  // Perform table change.\n  for (uint32_t page_number = start_page_number; page_number <= end_page_number;\n       ++page_number) {\n    auto& page_entry = page_table_[page_number];\n    page_entry.state &= ~kMemoryAllocationCommit;\n  }\n\n  return true;\n}\n\nbool BaseHeap::Release(uint32_t base_address, uint32_t* out_region_size) {\n  auto global_lock = global_critical_region_.Acquire();\n\n  // Given address must be a region base address.\n  uint32_t base_page_number = (base_address - heap_base_) / page_size_;\n  auto base_page_entry = page_table_[base_page_number];\n  if (base_page_entry.base_address != base_page_number) {\n    XELOGE(\"BaseHeap::Release failed because address is not a region start\");\n    return false;\n  }\n\n  if (heap_base_ == 0x00000000 && base_page_number == 0) {\n    XELOGE(\"BaseHeap::Release: Attempt to free 0!\");\n    return false;\n  }\n\n  if (out_region_size) {\n    *out_region_size = (base_page_entry.region_page_count * page_size_);\n  }\n\n  // Release from host not needed as mapping reserves the range for us.\n  // TODO(benvanik): protect with NOACCESS?\n  /*BOOL result = VirtualFree(\n      TranslateRelative(base_page_number * page_size_), 0, MEM_RELEASE);\n  if (!result) {\n    PLOGE(\"BaseHeap::Release failed due to host VirtualFree failure\");\n    return false;\n  }*/\n  // Instead, we just protect it, if we can.\n  if (page_size_ == xe::memory::page_size() ||\n      ((base_page_entry.region_page_count * page_size_) %\n               xe::memory::page_size() ==\n           0 &&\n       ((base_page_number * page_size_) % xe::memory::page_size() == 0))) {\n    // TODO(benvanik): figure out why games are using memory after releasing\n    // it. It's possible this is some virtual/physical stuff where the GPU\n    // still can access it.\n    if (cvars::protect_on_release) {\n      if (!xe::memory::Protect(TranslateRelative(base_page_number * page_size_),\n                               base_page_entry.region_page_count * page_size_,\n                               xe::memory::PageAccess::kNoAccess, nullptr)) {\n        XELOGW(\"BaseHeap::Release failed due to host VirtualProtect failure\");\n      }\n    }\n  }\n\n  // Perform table change.\n  uint32_t end_page_number =\n      base_page_number + base_page_entry.region_page_count - 1;\n  for (uint32_t page_number = base_page_number; page_number <= end_page_number;\n       ++page_number) {\n    auto& page_entry = page_table_[page_number];\n    page_entry.qword = 0;\n  }\n\n  return true;\n}\n\nbool BaseHeap::Protect(uint32_t address, uint32_t size, uint32_t protect,\n                       uint32_t* old_protect) {\n  if (!size) {\n    XELOGE(\"BaseHeap::Protect failed due to zero size\");\n    return false;\n  }\n\n  // From the VirtualProtect MSDN page:\n  //\n  // \"The region of affected pages includes all pages containing one or more\n  //  bytes in the range from the lpAddress parameter to (lpAddress+dwSize).\n  //  This means that a 2-byte range straddling a page boundary causes the\n  //  protection attributes of both pages to be changed.\"\n  //\n  // \"The access protection value can be set only on committed pages. If the\n  //  state of any page in the specified region is not committed, the function\n  //  fails and returns without modifying the access protection of any pages in\n  //  the specified region.\"\n\n  uint32_t start_page_number = (address - heap_base_) / page_size_;\n  if (start_page_number >= page_table_.size()) {\n    XELOGE(\"BaseHeap::Protect failed due to out-of-bounds base address {:08X}\",\n           address);\n    return false;\n  }\n  uint32_t end_page_number =\n      uint32_t((uint64_t(address) + size - 1 - heap_base_) / page_size_);\n  if (end_page_number >= page_table_.size()) {\n    XELOGE(\n        \"BaseHeap::Protect failed due to out-of-bounds range ({:08X} bytes \"\n        \"from {:08x})\",\n        size, address);\n    return false;\n  }\n\n  auto global_lock = global_critical_region_.Acquire();\n\n  // Ensure all pages are in the same reserved region and all are committed.\n  uint32_t first_base_address = UINT_MAX;\n  for (uint32_t page_number = start_page_number; page_number <= end_page_number;\n       ++page_number) {\n    auto page_entry = page_table_[page_number];\n    if (first_base_address == UINT_MAX) {\n      first_base_address = page_entry.base_address;\n    } else if (first_base_address != page_entry.base_address) {\n      XELOGE(\"BaseHeap::Protect failed due to request spanning regions\");\n      return false;\n    }\n    if (!(page_entry.state & kMemoryAllocationCommit)) {\n      XELOGE(\"BaseHeap::Protect failed due to uncommitted page\");\n      return false;\n    }\n  }\n\n  // Attempt host change (hopefully won't fail).\n  // We can only do this if our size matches system page granularity.\n  uint32_t page_count = end_page_number - start_page_number + 1;\n  if (page_size_ == xe::memory::page_size() ||\n      (((page_count * page_size_) % xe::memory::page_size() == 0) &&\n       ((start_page_number * page_size_) % xe::memory::page_size() == 0))) {\n    memory::PageAccess old_protect_access;\n    if (!xe::memory::Protect(TranslateRelative(start_page_number * page_size_),\n                             page_count * page_size_, ToPageAccess(protect),\n                             old_protect ? &old_protect_access : nullptr)) {\n      XELOGE(\"BaseHeap::Protect failed due to host VirtualProtect failure\");\n      return false;\n    }\n\n    if (old_protect) {\n      *old_protect = FromPageAccess(old_protect_access);\n    }\n  } else {\n    XELOGW(\"BaseHeap::Protect: ignoring request as not 4k page aligned\");\n    return false;\n  }\n\n  // Perform table change.\n  for (uint32_t page_number = start_page_number; page_number <= end_page_number;\n       ++page_number) {\n    auto& page_entry = page_table_[page_number];\n    page_entry.current_protect = protect;\n  }\n\n  return true;\n}\n\nbool BaseHeap::QueryRegionInfo(uint32_t base_address,\n                               HeapAllocationInfo* out_info) {\n  uint32_t start_page_number = (base_address - heap_base_) / page_size_;\n  if (start_page_number > page_table_.size()) {\n    XELOGE(\"BaseHeap::QueryRegionInfo base page out of range\");\n    return false;\n  }\n\n  auto global_lock = global_critical_region_.Acquire();\n\n  auto start_page_entry = page_table_[start_page_number];\n  out_info->base_address = base_address;\n  out_info->allocation_base = 0;\n  out_info->allocation_protect = 0;\n  out_info->region_size = 0;\n  out_info->state = 0;\n  out_info->protect = 0;\n  if (start_page_entry.state) {\n    // Committed/reserved region.\n    out_info->allocation_base = start_page_entry.base_address * page_size_;\n    out_info->allocation_protect = start_page_entry.allocation_protect;\n    out_info->allocation_size = start_page_entry.region_page_count * page_size_;\n    out_info->state = start_page_entry.state;\n    out_info->protect = start_page_entry.current_protect;\n\n    // Scan forward and report the size of the region matching the initial\n    // base address's attributes.\n    for (uint32_t page_number = start_page_number;\n         page_number <\n         start_page_entry.base_address + start_page_entry.region_page_count;\n         ++page_number) {\n      auto page_entry = page_table_[page_number];\n      if (page_entry.base_address != start_page_entry.base_address ||\n          page_entry.state != start_page_entry.state ||\n          page_entry.current_protect != start_page_entry.current_protect) {\n        // Different region or different properties within the region; done.\n        break;\n      }\n      out_info->region_size += page_size_;\n    }\n  } else {\n    // Free region.\n    for (uint32_t page_number = start_page_number;\n         page_number < page_table_.size(); ++page_number) {\n      auto page_entry = page_table_[page_number];\n      if (page_entry.state) {\n        // First non-free page; done with region.\n        break;\n      }\n      out_info->region_size += page_size_;\n    }\n  }\n  return true;\n}\n\nbool BaseHeap::QuerySize(uint32_t address, uint32_t* out_size) {\n  uint32_t page_number = (address - heap_base_) / page_size_;\n  if (page_number > page_table_.size()) {\n    XELOGE(\"BaseHeap::QuerySize base page out of range\");\n    *out_size = 0;\n    return false;\n  }\n  auto global_lock = global_critical_region_.Acquire();\n  auto page_entry = page_table_[page_number];\n  *out_size = (page_entry.region_page_count * page_size_);\n  return true;\n}\n\nbool BaseHeap::QueryBaseAndSize(uint32_t* in_out_address, uint32_t* out_size) {\n  uint32_t page_number = (*in_out_address - heap_base_) / page_size_;\n  if (page_number > page_table_.size()) {\n    XELOGE(\"BaseHeap::QuerySize base page out of range\");\n    *out_size = 0;\n    return false;\n  }\n  auto global_lock = global_critical_region_.Acquire();\n  auto page_entry = page_table_[page_number];\n  *in_out_address = (page_entry.base_address * page_size_);\n  *out_size = (page_entry.region_page_count * page_size_);\n  return true;\n}\n\nbool BaseHeap::QueryProtect(uint32_t address, uint32_t* out_protect) {\n  uint32_t page_number = (address - heap_base_) / page_size_;\n  if (page_number > page_table_.size()) {\n    XELOGE(\"BaseHeap::QueryProtect base page out of range\");\n    *out_protect = 0;\n    return false;\n  }\n  auto global_lock = global_critical_region_.Acquire();\n  auto page_entry = page_table_[page_number];\n  *out_protect = page_entry.current_protect;\n  return true;\n}\n\nxe::memory::PageAccess BaseHeap::QueryRangeAccess(uint32_t low_address,\n                                                  uint32_t high_address) {\n  if (low_address > high_address || low_address < heap_base_ ||\n      (high_address - heap_base_) >= heap_size_) {\n    return xe::memory::PageAccess::kNoAccess;\n  }\n  uint32_t low_page_number = (low_address - heap_base_) / page_size_;\n  uint32_t high_page_number = (high_address - heap_base_) / page_size_;\n  uint32_t protect = kMemoryProtectRead | kMemoryProtectWrite;\n  {\n    auto global_lock = global_critical_region_.Acquire();\n    for (uint32_t i = low_page_number; protect && i <= high_page_number; ++i) {\n      protect &= page_table_[i].current_protect;\n    }\n  }\n  return ToPageAccess(protect);\n}\n\nVirtualHeap::VirtualHeap() = default;\n\nVirtualHeap::~VirtualHeap() = default;\n\nvoid VirtualHeap::Initialize(Memory* memory, uint8_t* membase,\n                             HeapType heap_type, uint32_t heap_base,\n                             uint32_t heap_size, uint32_t page_size) {\n  BaseHeap::Initialize(memory, membase, heap_type, heap_base, heap_size,\n                       page_size);\n}\n\nPhysicalHeap::PhysicalHeap() : parent_heap_(nullptr) {}\n\nPhysicalHeap::~PhysicalHeap() = default;\n\nvoid PhysicalHeap::Initialize(Memory* memory, uint8_t* membase,\n                              HeapType heap_type, uint32_t heap_base,\n                              uint32_t heap_size, uint32_t page_size,\n                              VirtualHeap* parent_heap) {\n  uint32_t host_address_offset;\n  if (heap_base >= 0xE0000000 &&\n      xe::memory::allocation_granularity() > 0x1000) {\n    host_address_offset = 0x1000;\n  } else {\n    host_address_offset = 0;\n  }\n\n  BaseHeap::Initialize(memory, membase, heap_type, heap_base, heap_size,\n                       page_size, host_address_offset);\n  parent_heap_ = parent_heap;\n  system_page_size_ = uint32_t(xe::memory::page_size());\n\n  system_page_count_ =\n      (size_t(heap_size_) + host_address_offset + (system_page_size_ - 1)) /\n      system_page_size_;\n  system_page_flags_.resize((system_page_count_ + 63) / 64);\n}\n\nbool PhysicalHeap::Alloc(uint32_t size, uint32_t alignment,\n                         uint32_t allocation_type, uint32_t protect,\n                         bool top_down, uint32_t* out_address) {\n  *out_address = 0;\n\n  // Default top-down. Since parent heap is bottom-up this prevents\n  // collisions.\n  top_down = true;\n\n  // Adjust alignment size our page size differs from the parent.\n  size = xe::round_up(size, page_size_);\n  alignment = xe::round_up(alignment, page_size_);\n\n  auto global_lock = global_critical_region_.Acquire();\n\n  // Allocate from parent heap (gets our physical address in 0-512mb).\n  uint32_t parent_heap_start = GetPhysicalAddress(heap_base_);\n  uint32_t parent_heap_end = GetPhysicalAddress(heap_base_ + (heap_size_ - 1));\n  uint32_t parent_address;\n  if (!parent_heap_->AllocRange(parent_heap_start, parent_heap_end, size,\n                                alignment, allocation_type, protect, top_down,\n                                &parent_address)) {\n    XELOGE(\n        \"PhysicalHeap::Alloc unable to alloc physical memory in parent heap\");\n    return false;\n  }\n\n  // Given the address we've reserved in the parent heap, pin that here.\n  // Shouldn't be possible for it to be allocated already.\n  uint32_t address = heap_base_ + parent_address - parent_heap_start;\n  if (!BaseHeap::AllocFixed(address, size, alignment, allocation_type,\n                            protect)) {\n    XELOGE(\n        \"PhysicalHeap::Alloc unable to pin physical memory in physical heap\");\n    // TODO(benvanik): don't leak parent memory.\n    return false;\n  }\n  *out_address = address;\n  return true;\n}\n\nbool PhysicalHeap::AllocFixed(uint32_t base_address, uint32_t size,\n                              uint32_t alignment, uint32_t allocation_type,\n                              uint32_t protect) {\n  // Adjust alignment size our page size differs from the parent.\n  size = xe::round_up(size, page_size_);\n  alignment = xe::round_up(alignment, page_size_);\n\n  auto global_lock = global_critical_region_.Acquire();\n\n  // Allocate from parent heap (gets our physical address in 0-512mb).\n  // NOTE: this can potentially overwrite heap contents if there are already\n  // committed pages in the requested physical range.\n  // TODO(benvanik): flag for ensure-not-committed?\n  uint32_t parent_base_address = GetPhysicalAddress(base_address);\n  if (!parent_heap_->AllocFixed(parent_base_address, size, alignment,\n                                allocation_type, protect)) {\n    XELOGE(\n        \"PhysicalHeap::Alloc unable to alloc physical memory in parent heap\");\n    return false;\n  }\n\n  // Given the address we've reserved in the parent heap, pin that here.\n  // Shouldn't be possible for it to be allocated already.\n  uint32_t address =\n      heap_base_ + parent_base_address - GetPhysicalAddress(heap_base_);\n  if (!BaseHeap::AllocFixed(address, size, alignment, allocation_type,\n                            protect)) {\n    XELOGE(\n        \"PhysicalHeap::Alloc unable to pin physical memory in physical heap\");\n    // TODO(benvanik): don't leak parent memory.\n    return false;\n  }\n\n  return true;\n}\n\nbool PhysicalHeap::AllocRange(uint32_t low_address, uint32_t high_address,\n                              uint32_t size, uint32_t alignment,\n                              uint32_t allocation_type, uint32_t protect,\n                              bool top_down, uint32_t* out_address) {\n  *out_address = 0;\n\n  // Adjust alignment size our page size differs from the parent.\n  size = xe::round_up(size, page_size_);\n  alignment = xe::round_up(alignment, page_size_);\n\n  auto global_lock = global_critical_region_.Acquire();\n\n  // Allocate from parent heap (gets our physical address in 0-512mb).\n  low_address = std::max(heap_base_, low_address);\n  high_address = std::min(heap_base_ + (heap_size_ - 1), high_address);\n  uint32_t parent_low_address = GetPhysicalAddress(low_address);\n  uint32_t parent_high_address = GetPhysicalAddress(high_address);\n  uint32_t parent_address;\n  if (!parent_heap_->AllocRange(parent_low_address, parent_high_address, size,\n                                alignment, allocation_type, protect, top_down,\n                                &parent_address)) {\n    XELOGE(\n        \"PhysicalHeap::Alloc unable to alloc physical memory in parent heap\");\n    return false;\n  }\n\n  // Given the address we've reserved in the parent heap, pin that here.\n  // Shouldn't be possible for it to be allocated already.\n  uint32_t address =\n      heap_base_ + parent_address - GetPhysicalAddress(heap_base_);\n  if (!BaseHeap::AllocFixed(address, size, alignment, allocation_type,\n                            protect)) {\n    XELOGE(\n        \"PhysicalHeap::Alloc unable to pin physical memory in physical heap\");\n    // TODO(benvanik): don't leak parent memory.\n    return false;\n  }\n  *out_address = address;\n  return true;\n}\n\nbool PhysicalHeap::Decommit(uint32_t address, uint32_t size) {\n  auto global_lock = global_critical_region_.Acquire();\n\n  uint32_t parent_address = GetPhysicalAddress(address);\n  if (!parent_heap_->Decommit(parent_address, size)) {\n    XELOGE(\"PhysicalHeap::Decommit failed due to parent heap failure\");\n    return false;\n  }\n\n  // Not caring about the contents anymore.\n  TriggerCallbacks(std::move(global_lock), address, size, true, true);\n\n  return BaseHeap::Decommit(address, size);\n}\n\nbool PhysicalHeap::Release(uint32_t base_address, uint32_t* out_region_size) {\n  auto global_lock = global_critical_region_.Acquire();\n\n  uint32_t parent_base_address = GetPhysicalAddress(base_address);\n  if (!parent_heap_->Release(parent_base_address, out_region_size)) {\n    XELOGE(\"PhysicalHeap::Release failed due to parent heap failure\");\n    return false;\n  }\n\n  // Must invalidate here because the range being released may be reused in\n  // another mapping of physical memory - but callback flags are set in each\n  // heap separately (https://github.com/xenia-project/xenia/issues/1559 -\n  // dynamic vertices in 4D5307F2 start screen and menu allocated in 0xA0000000\n  // at addresses that overlap intro video textures in 0xE0000000, with the\n  // state of the allocator as of February 24th, 2020). If memory is invalidated\n  // in Alloc instead, Alloc won't be aware of callbacks enabled in other heaps,\n  // thus callback handlers will keep considering this range valid forever.\n  uint32_t region_size;\n  if (QuerySize(base_address, &region_size)) {\n    TriggerCallbacks(std::move(global_lock), base_address, region_size, true,\n                     true);\n  }\n\n  return BaseHeap::Release(base_address, out_region_size);\n}\n\nbool PhysicalHeap::Protect(uint32_t address, uint32_t size, uint32_t protect,\n                           uint32_t* old_protect) {\n  auto global_lock = global_critical_region_.Acquire();\n\n  // Only invalidate if making writable again, for simplicity - not when simply\n  // marking some range as immutable, for instance.\n  if (protect & kMemoryProtectWrite) {\n    TriggerCallbacks(std::move(global_lock), address, size, true, true, false);\n  }\n\n  if (!parent_heap_->Protect(GetPhysicalAddress(address), size, protect,\n                             old_protect)) {\n    XELOGE(\"PhysicalHeap::Protect failed due to parent heap failure\");\n    return false;\n  }\n\n  return BaseHeap::Protect(address, size, protect);\n}\n\nvoid PhysicalHeap::EnableAccessCallbacks(uint32_t physical_address,\n                                         uint32_t length,\n                                         bool enable_invalidation_notifications,\n                                         bool enable_data_providers) {\n  // TODO(Triang3l): Implement data providers.\n  assert_false(enable_data_providers);\n  if (!enable_invalidation_notifications && !enable_data_providers) {\n    return;\n  }\n  uint32_t physical_address_offset = GetPhysicalAddress(heap_base_);\n  if (physical_address < physical_address_offset) {\n    if (physical_address_offset - physical_address >= length) {\n      return;\n    }\n    length -= physical_address_offset - physical_address;\n    physical_address = physical_address_offset;\n  }\n  uint32_t heap_relative_address = physical_address - physical_address_offset;\n  if (heap_relative_address >= heap_size_) {\n    return;\n  }\n  length = std::min(length, heap_size_ - heap_relative_address);\n  if (length == 0) {\n    return;\n  }\n\n  uint32_t system_page_first =\n      (heap_relative_address + host_address_offset()) / system_page_size_;\n  uint32_t system_page_last =\n      (heap_relative_address + length - 1 + host_address_offset()) /\n      system_page_size_;\n  system_page_last = std::min(system_page_last, system_page_count_ - 1);\n  assert_true(system_page_first <= system_page_last);\n\n  // Update callback flags for system pages and make their protection stricter\n  // if needed.\n  xe::memory::PageAccess protect_access =\n      enable_data_providers ? xe::memory::PageAccess::kNoAccess\n                            : xe::memory::PageAccess::kReadOnly;\n  uint8_t* protect_base = membase_ + heap_base_;\n  uint32_t protect_system_page_first = UINT32_MAX;\n  auto global_lock = global_critical_region_.Acquire();\n  for (uint32_t i = system_page_first; i <= system_page_last; ++i) {\n    // Check if need to enable callbacks for the page and raise its protection.\n    //\n    // If enabling invalidation notifications:\n    // - Page writable and not watched for changes yet - protect and enable\n    //   invalidation notifications.\n    // - Page seen as writable by the guest, but only needs data providers -\n    //   just set the bits to enable invalidation notifications (already has\n    //   even stricter protection than needed).\n    // - Page not writable as requested by the game - don't do anything (need\n    //   real access violations here).\n    // If enabling data providers:\n    // - Page accessible (either read/write or read-only) and didn't need data\n    //   providers initially - protect and enable data providers.\n    // - Otherwise - do nothing.\n    //\n    // It's safe not to await data provider completion here before protecting as\n    // this never makes protection lighter, so it can't interfere with page\n    // faults that await data providers.\n    //\n    // Enabling data providers doesn't need to be deferred - providers will be\n    // polled for the last time without releasing the lock.\n    SystemPageFlagsBlock& page_flags_block = system_page_flags_[i >> 6];\n    uint64_t page_flags_bit = uint64_t(1) << (i & 63);\n    uint32_t guest_page_number =\n        xe::sat_sub(i * system_page_size_, host_address_offset()) / page_size_;\n    xe::memory::PageAccess current_page_access =\n        ToPageAccess(page_table_[guest_page_number].current_protect);\n    bool protect_system_page = false;\n    // Don't do anything with inaccessible pages - don't protect, don't enable\n    // callbacks - because real access violations are needed there. And don't\n    // enable invalidation notifications for read-only pages for the same\n    // reason.\n    if (current_page_access != xe::memory::PageAccess::kNoAccess) {\n      // TODO(Triang3l): Enable data providers.\n      if (enable_invalidation_notifications) {\n        if (current_page_access != xe::memory::PageAccess::kReadOnly &&\n            (page_flags_block.notify_on_invalidation & page_flags_bit) == 0) {\n          // TODO(Triang3l): Check if data providers are already enabled.\n          // If data providers are already enabled for the page, it has even\n          // stricter protection.\n          protect_system_page = true;\n          page_flags_block.notify_on_invalidation |= page_flags_bit;\n        }\n      }\n    }\n    if (protect_system_page) {\n      if (protect_system_page_first == UINT32_MAX) {\n        protect_system_page_first = i;\n      }\n    } else {\n      if (protect_system_page_first != UINT32_MAX) {\n        xe::memory::Protect(\n            protect_base + protect_system_page_first * system_page_size_,\n            (i - protect_system_page_first) * system_page_size_,\n            protect_access);\n        protect_system_page_first = UINT32_MAX;\n      }\n    }\n  }\n  if (protect_system_page_first != UINT32_MAX) {\n    xe::memory::Protect(\n        protect_base + protect_system_page_first * system_page_size_,\n        (system_page_last + 1 - protect_system_page_first) * system_page_size_,\n        protect_access);\n  }\n}\n\nbool PhysicalHeap::TriggerCallbacks(\n    std::unique_lock<std::recursive_mutex> global_lock_locked_once,\n    uint32_t virtual_address, uint32_t length, bool is_write,\n    bool unwatch_exact_range, bool unprotect) {\n  // TODO(Triang3l): Support read watches.\n  assert_true(is_write);\n  if (!is_write) {\n    return false;\n  }\n\n  if (virtual_address < heap_base_) {\n    if (heap_base_ - virtual_address >= length) {\n      return false;\n    }\n    length -= heap_base_ - virtual_address;\n    virtual_address = heap_base_;\n  }\n  uint32_t heap_relative_address = virtual_address - heap_base_;\n  if (heap_relative_address >= heap_size_) {\n    return false;\n  }\n  length = std::min(length, heap_size_ - heap_relative_address);\n  if (length == 0) {\n    return false;\n  }\n\n  uint32_t system_page_first =\n      (heap_relative_address + host_address_offset()) / system_page_size_;\n  uint32_t system_page_last =\n      (heap_relative_address + length - 1 + host_address_offset()) /\n      system_page_size_;\n  system_page_last = std::min(system_page_last, system_page_count_ - 1);\n  assert_true(system_page_first <= system_page_last);\n  uint32_t block_index_first = system_page_first >> 6;\n  uint32_t block_index_last = system_page_last >> 6;\n\n  // Check if watching any page, whether need to call the callback at all.\n  bool any_watched = false;\n  for (uint32_t i = block_index_first; i <= block_index_last; ++i) {\n    uint64_t block = system_page_flags_[i].notify_on_invalidation;\n    if (i == block_index_first) {\n      block &= ~((uint64_t(1) << (system_page_first & 63)) - 1);\n    }\n    if (i == block_index_last && (system_page_last & 63) != 63) {\n      block &= (uint64_t(1) << ((system_page_last & 63) + 1)) - 1;\n    }\n    if (block) {\n      any_watched = true;\n      break;\n    }\n  }\n  if (!any_watched) {\n    return false;\n  }\n\n  // Trigger callbacks.\n  if (!unprotect) {\n    // If not doing anything with protection, no point in unwatching excess\n    // pages.\n    unwatch_exact_range = true;\n  }\n  uint32_t physical_address_offset = GetPhysicalAddress(heap_base_);\n  uint32_t physical_address_start =\n      xe::sat_sub(system_page_first * system_page_size_,\n                  host_address_offset()) +\n      physical_address_offset;\n  uint32_t physical_length = std::min(\n      xe::sat_sub(system_page_last * system_page_size_ + system_page_size_,\n                  host_address_offset()) +\n          physical_address_offset - physical_address_start,\n      heap_size_ - (physical_address_start - physical_address_offset));\n  uint32_t unwatch_first = 0;\n  uint32_t unwatch_last = UINT32_MAX;\n  for (auto invalidation_callback :\n       memory_->physical_memory_invalidation_callbacks_) {\n    std::pair<uint32_t, uint32_t> callback_unwatch_range =\n        invalidation_callback->first(invalidation_callback->second,\n                                     physical_address_start, physical_length,\n                                     unwatch_exact_range);\n    if (!unwatch_exact_range) {\n      unwatch_first = std::max(unwatch_first, callback_unwatch_range.first);\n      unwatch_last = std::min(\n          unwatch_last,\n          xe::sat_add(\n              callback_unwatch_range.first,\n              std::max(callback_unwatch_range.second, uint32_t(1)) - 1));\n    }\n  }\n  if (!unwatch_exact_range) {\n    // Always unwatch at least the requested pages.\n    unwatch_first = std::min(unwatch_first, physical_address_start);\n    unwatch_last =\n        std::max(unwatch_last, physical_address_start + physical_length - 1);\n    // Don't unprotect too much if not caring much about the region (limit to\n    // 4 MB - somewhat random, but max 1024 iterations of the page loop).\n    const uint32_t kMaxUnwatchExcess = 4 * 1024 * 1024;\n    unwatch_first = std::max(unwatch_first,\n                             physical_address_start & ~(kMaxUnwatchExcess - 1));\n    unwatch_last =\n        std::min(unwatch_last, (physical_address_start + physical_length - 1) |\n                                   (kMaxUnwatchExcess - 1));\n    // Convert to heap-relative addresses.\n    unwatch_first = xe::sat_sub(unwatch_first, physical_address_offset);\n    unwatch_last = xe::sat_sub(unwatch_last, physical_address_offset);\n    // Clamp to the heap upper bound.\n    unwatch_first = std::min(unwatch_first, heap_size_ - 1);\n    unwatch_last = std::min(unwatch_last, heap_size_ - 1);\n    // Convert to system pages and update the range.\n    unwatch_first += host_address_offset();\n    unwatch_last += host_address_offset();\n    assert_true(unwatch_first <= unwatch_last);\n    system_page_first = unwatch_first / system_page_size_;\n    system_page_last = unwatch_last / system_page_size_;\n    block_index_first = system_page_first >> 6;\n    block_index_last = system_page_last >> 6;\n  }\n\n  // Unprotect ranges that need unprotection.\n  if (unprotect) {\n    uint8_t* protect_base = membase_ + heap_base_;\n    uint32_t unprotect_system_page_first = UINT32_MAX;\n    for (uint32_t i = system_page_first; i <= system_page_last; ++i) {\n      // Check if need to allow writing to this page.\n      bool unprotect_page = (system_page_flags_[i >> 6].notify_on_invalidation &\n                             (uint64_t(1) << (i & 63))) != 0;\n      if (unprotect_page) {\n        uint32_t guest_page_number =\n            xe::sat_sub(i * system_page_size_, host_address_offset()) /\n            page_size_;\n        if (ToPageAccess(page_table_[guest_page_number].current_protect) !=\n            xe::memory::PageAccess::kReadWrite) {\n          unprotect_page = false;\n        }\n      }\n      if (unprotect_page) {\n        if (unprotect_system_page_first == UINT32_MAX) {\n          unprotect_system_page_first = i;\n        }\n      } else {\n        if (unprotect_system_page_first != UINT32_MAX) {\n          xe::memory::Protect(\n              protect_base + unprotect_system_page_first * system_page_size_,\n              (i - unprotect_system_page_first) * system_page_size_,\n              xe::memory::PageAccess::kReadWrite);\n          unprotect_system_page_first = UINT32_MAX;\n        }\n      }\n    }\n    if (unprotect_system_page_first != UINT32_MAX) {\n      xe::memory::Protect(\n          protect_base + unprotect_system_page_first * system_page_size_,\n          (system_page_last + 1 - unprotect_system_page_first) *\n              system_page_size_,\n          xe::memory::PageAccess::kReadWrite);\n    }\n  }\n\n  // Mark pages as not write-watched.\n  for (uint32_t i = block_index_first; i <= block_index_last; ++i) {\n    uint64_t mask = 0;\n    if (i == block_index_first) {\n      mask |= (uint64_t(1) << (system_page_first & 63)) - 1;\n    }\n    if (i == block_index_last && (system_page_last & 63) != 63) {\n      mask |= ~((uint64_t(1) << ((system_page_last & 63) + 1)) - 1);\n    }\n    system_page_flags_[i].notify_on_invalidation &= mask;\n  }\n\n  return true;\n}\n\nuint32_t PhysicalHeap::GetPhysicalAddress(uint32_t address) const {\n  assert_true(address >= heap_base_);\n  address -= heap_base_;\n  assert_true(address < heap_size_);\n  if (heap_base_ >= 0xE0000000) {\n    address += 0x1000;\n  }\n  return address;\n}\n\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/memory.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_MEMORY_H_\n#define XENIA_MEMORY_H_\n\n#include <cstdint>\n#include <memory>\n#include <mutex>\n#include <string>\n#include <utility>\n#include <vector>\n\n#include \"xenia/base/memory.h\"\n#include \"xenia/base/mutex.h\"\n#include \"xenia/cpu/mmio_handler.h\"\n\nnamespace xe {\nclass ByteStream;\n}  // namespace xe\n\nnamespace xe {\n\nclass Memory;\n\nenum SystemHeapFlag : uint32_t {\n  kSystemHeapVirtual = 1 << 0,\n  kSystemHeapPhysical = 1 << 1,\n\n  kSystemHeapDefault = kSystemHeapVirtual,\n};\n\nenum class HeapType : uint8_t {\n  kGuestVirtual,\n  kGuestXex,\n  kGuestPhysical,\n  kHostPhysical,\n};\n\nenum MemoryAllocationFlag : uint32_t {\n  kMemoryAllocationReserve = 1 << 0,\n  kMemoryAllocationCommit = 1 << 1,\n};\n\nenum MemoryProtectFlag : uint32_t {\n  kMemoryProtectRead = 1 << 0,\n  kMemoryProtectWrite = 1 << 1,\n  kMemoryProtectNoCache = 1 << 2,\n  kMemoryProtectWriteCombine = 1 << 3,\n\n  kMemoryProtectNoAccess = 0,\n};\n\n// Equivalent to the Win32 MEMORY_BASIC_INFORMATION struct.\nstruct HeapAllocationInfo {\n  // A pointer to the base address of the region of pages.\n  uint32_t base_address;\n  // A pointer to the base address of a range of pages allocated by the\n  // VirtualAlloc function. The page pointed to by the BaseAddress member is\n  // contained within this allocation range.\n  uint32_t allocation_base;\n  // The memory protection option when the region was initially allocated.\n  uint32_t allocation_protect;\n  // The size specified when the region was initially allocated, in bytes.\n  uint32_t allocation_size;\n  // The size of the region beginning at the base address in which all pages\n  // have identical attributes, in bytes.\n  uint32_t region_size;\n  // The state of the pages in the region (commit/free/reserve).\n  uint32_t state;\n  // The access protection of the pages in the region.\n  uint32_t protect;\n};\n\n// Describes a single page in the page table.\nunion PageEntry {\n  uint64_t qword;\n  struct {\n    // Base address of the allocated region in 4k pages.\n    uint32_t base_address : 20;\n    // Total number of pages in the allocated region in 4k pages.\n    uint32_t region_page_count : 20;\n    // Protection bits specified during region allocation.\n    // Composed of bits from MemoryProtectFlag.\n    uint32_t allocation_protect : 4;\n    // Current protection bits as of the last Protect.\n    // Composed of bits from MemoryProtectFlag.\n    uint32_t current_protect : 4;\n    // Allocation state of the page as a MemoryAllocationFlag bit mask.\n    uint32_t state : 2;\n    uint32_t reserved : 14;\n  };\n};\n\n// Heap abstraction for page-based allocation.\nclass BaseHeap {\n public:\n  virtual ~BaseHeap();\n\n  // Offset of the heap in relative to membase, without host_address_offset\n  // adjustment.\n  uint32_t heap_base() const { return heap_base_; }\n\n  // Length of the heap range.\n  uint32_t heap_size() const { return heap_size_; }\n\n  // Size of each page within the heap range in bytes.\n  uint32_t page_size() const { return page_size_; }\n\n  // Type of specified heap\n  HeapType heap_type() const { return heap_type_; }\n\n  // Offset added to the virtual addresses to convert them to host addresses\n  // (not including membase).\n  uint32_t host_address_offset() const { return host_address_offset_; }\n\n  template <typename T = uint8_t*>\n  inline T TranslateRelative(size_t relative_address) const {\n    return reinterpret_cast<T>(membase_ + heap_base_ + host_address_offset_ +\n                               relative_address);\n  }\n\n  // Disposes and decommits all memory and clears the page table.\n  virtual void Dispose();\n\n  // Dumps information about all allocations within the heap to the log.\n  void DumpMap();\n\n  uint32_t GetTotalPageCount();\n  uint32_t GetUnreservedPageCount();\n\n  // Allocates pages with the given properties and allocation strategy.\n  // This can reserve and commit the pages as well as set protection modes.\n  // This will fail if not enough contiguous pages can be found.\n  virtual bool Alloc(uint32_t size, uint32_t alignment,\n                     uint32_t allocation_type, uint32_t protect, bool top_down,\n                     uint32_t* out_address);\n\n  // Allocates pages at the given address.\n  // This can reserve and commit the pages as well as set protection modes.\n  // This will fail if the pages are already allocated.\n  virtual bool AllocFixed(uint32_t base_address, uint32_t size,\n                          uint32_t alignment, uint32_t allocation_type,\n                          uint32_t protect);\n\n  // Allocates pages at an address within the given address range.\n  // This can reserve and commit the pages as well as set protection modes.\n  // This will fail if not enough contiguous pages can be found.\n  virtual bool AllocRange(uint32_t low_address, uint32_t high_address,\n                          uint32_t size, uint32_t alignment,\n                          uint32_t allocation_type, uint32_t protect,\n                          bool top_down, uint32_t* out_address);\n\n  // Decommits pages in the given range.\n  // Partial overlapping pages will also be decommitted.\n  virtual bool Decommit(uint32_t address, uint32_t size);\n\n  // Decommits and releases pages in the given range.\n  // Partial overlapping pages will also be released.\n  virtual bool Release(uint32_t address, uint32_t* out_region_size = nullptr);\n\n  // Modifies the protection mode of pages within the given range.\n  virtual bool Protect(uint32_t address, uint32_t size, uint32_t protect,\n                       uint32_t* old_protect = nullptr);\n\n  // Queries information about the given region of pages.\n  bool QueryRegionInfo(uint32_t base_address, HeapAllocationInfo* out_info);\n\n  // Queries the size of the region containing the given address.\n  bool QuerySize(uint32_t address, uint32_t* out_size);\n\n  // Queries the base and size of a region containing the given address.\n  bool QueryBaseAndSize(uint32_t* in_out_address, uint32_t* out_size);\n\n  // Queries the current protection mode of the region containing the given\n  // address.\n  bool QueryProtect(uint32_t address, uint32_t* out_protect);\n\n  // Queries the currently strictest readability and writability for the entire\n  // range.\n  xe::memory::PageAccess QueryRangeAccess(uint32_t low_address,\n                                          uint32_t high_address);\n\n  bool Save(ByteStream* stream);\n  bool Restore(ByteStream* stream);\n\n  void Reset();\n\n protected:\n  BaseHeap();\n\n  void Initialize(Memory* memory, uint8_t* membase, HeapType heap_type,\n                  uint32_t heap_base, uint32_t heap_size, uint32_t page_size,\n                  uint32_t host_address_offset = 0);\n\n  Memory* memory_;\n  uint8_t* membase_;\n  HeapType heap_type_;\n  uint32_t heap_base_;\n  uint32_t heap_size_;\n  uint32_t page_size_;\n  uint32_t host_address_offset_;\n  xe::global_critical_region global_critical_region_;\n  std::vector<PageEntry> page_table_;\n};\n\n// Normal heap allowing allocations from guest virtual address ranges.\nclass VirtualHeap : public BaseHeap {\n public:\n  VirtualHeap();\n  ~VirtualHeap() override;\n\n  // Initializes the heap properties and allocates the page table.\n  void Initialize(Memory* memory, uint8_t* membase, HeapType heap_type,\n                  uint32_t heap_base, uint32_t heap_size, uint32_t page_size);\n};\n\n// A heap for ranges of memory that are mapped to physical ranges.\n// Physical ranges are used by the audio and graphics subsystems representing\n// hardware wired directly to memory in the console.\n//\n// The physical heap and the behavior of sharing pages with virtual pages is\n// implemented by having a 'parent' heap that is used to perform allocation in\n// the guest virtual address space 1:1 with the physical address space.\nclass PhysicalHeap : public BaseHeap {\n public:\n  PhysicalHeap();\n  ~PhysicalHeap() override;\n\n  // Initializes the heap properties and allocates the page table.\n  void Initialize(Memory* memory, uint8_t* membase, HeapType heap_type,\n                  uint32_t heap_base, uint32_t heap_size, uint32_t page_size,\n                  VirtualHeap* parent_heap);\n\n  bool Alloc(uint32_t size, uint32_t alignment, uint32_t allocation_type,\n             uint32_t protect, bool top_down, uint32_t* out_address) override;\n  bool AllocFixed(uint32_t base_address, uint32_t size, uint32_t alignment,\n                  uint32_t allocation_type, uint32_t protect) override;\n  bool AllocRange(uint32_t low_address, uint32_t high_address, uint32_t size,\n                  uint32_t alignment, uint32_t allocation_type,\n                  uint32_t protect, bool top_down,\n                  uint32_t* out_address) override;\n  bool Decommit(uint32_t address, uint32_t size) override;\n  bool Release(uint32_t base_address,\n               uint32_t* out_region_size = nullptr) override;\n  bool Protect(uint32_t address, uint32_t size, uint32_t protect,\n               uint32_t* old_protect = nullptr) override;\n\n  void EnableAccessCallbacks(uint32_t physical_address, uint32_t length,\n                             bool enable_invalidation_notifications,\n                             bool enable_data_providers);\n  // Returns true if any page in the range was watched.\n  bool TriggerCallbacks(\n      std::unique_lock<std::recursive_mutex> global_lock_locked_once,\n      uint32_t virtual_address, uint32_t length, bool is_write,\n      bool unwatch_exact_range, bool unprotect = true);\n\n  uint32_t GetPhysicalAddress(uint32_t address) const;\n\n protected:\n  VirtualHeap* parent_heap_;\n\n  uint32_t system_page_size_;\n  uint32_t system_page_count_;\n\n  struct SystemPageFlagsBlock {\n    // Whether writing to each page should result trigger invalidation\n    // callbacks.\n    uint64_t notify_on_invalidation;\n  };\n  // Protected by global_critical_region. Flags for each 64 system pages,\n  // interleaved as blocks, so bit scan can be used to quickly extract ranges.\n  std::vector<SystemPageFlagsBlock> system_page_flags_;\n};\n\n// Models the entire guest memory system on the console.\n// This exposes interfaces to both virtual and physical memory and a TLB and\n// page table for allocation, mapping, and protection.\n//\n// The memory is backed by a memory mapped file and is placed at a stable\n// fixed address in the host address space (like 0x100000000). This allows\n// efficient guest<->host address translations as well as easy sharing of the\n// memory across various subsystems.\n//\n// The guest memory address space is split into several ranges that have varying\n// properties such as page sizes, caching strategies, protections, and\n// overlap with other ranges. Each range is represented by a BaseHeap of either\n// VirtualHeap or PhysicalHeap depending on type. Heaps model the page tables\n// and can handle reservation and committing of requested pages.\nclass Memory {\n public:\n  Memory();\n  ~Memory();\n\n  // Initializes the memory system.\n  // This may fail if the host address space could not be reserved or the\n  // mapping to the file system fails.\n  bool Initialize();\n\n  // Resets all memory to zero and resets all allocations.\n  void Reset();\n\n  // Full file name and path of the memory-mapped file backing all memory.\n  const std::filesystem::path& file_name() const { return file_name_; }\n\n  // Base address of virtual memory in the host address space.\n  // This is often something like 0x100000000.\n  inline uint8_t* virtual_membase() const { return virtual_membase_; }\n\n  // Translates a guest virtual address to a host address that can be accessed\n  // as a normal pointer.\n  // Note that the contents at the specified host address are big-endian.\n  template <typename T = uint8_t*>\n  inline T TranslateVirtual(uint32_t guest_address) const {\n    uint8_t* host_address = virtual_membase_ + guest_address;\n    const auto heap = LookupHeap(guest_address);\n    if (heap) {\n      host_address += heap->host_address_offset();\n    }\n    return reinterpret_cast<T>(host_address);\n  }\n\n  // Base address of physical memory in the host address space.\n  // This is often something like 0x200000000.\n  inline uint8_t* physical_membase() const { return physical_membase_; }\n\n  // Translates a guest physical address to a host address that can be accessed\n  // as a normal pointer.\n  // Note that the contents at the specified host address are big-endian.\n  template <typename T = uint8_t*>\n  inline T TranslatePhysical(uint32_t guest_address) const {\n    return reinterpret_cast<T>(physical_membase_ +\n                               (guest_address & 0x1FFFFFFF));\n  }\n\n  // Translates a host address to a guest virtual address.\n  // Note that the contents at the returned host address are big-endian.\n  uint32_t HostToGuestVirtual(const void* host_address) const;\n\n  // Returns the guest physical address for the guest virtual address, or\n  // UINT32_MAX if it can't be obtained.\n  uint32_t GetPhysicalAddress(uint32_t address) const;\n\n  // Zeros out a range of memory at the given guest address.\n  void Zero(uint32_t address, uint32_t size);\n\n  // Fills a range of guest memory with the given byte value.\n  void Fill(uint32_t address, uint32_t size, uint8_t value);\n\n  // Copies a non-overlapping range of guest memory (like a memcpy).\n  void Copy(uint32_t dest, uint32_t src, uint32_t size);\n\n  // Searches the given range of guest memory for a run of dword values in\n  // big-endian order.\n  uint32_t SearchAligned(uint32_t start, uint32_t end, const uint32_t* values,\n                         size_t value_count);\n\n  // Defines a memory-mapped IO (MMIO) virtual address range that when accessed\n  // will trigger the specified read and write callbacks for dword read/writes.\n  bool AddVirtualMappedRange(uint32_t virtual_address, uint32_t mask,\n                             uint32_t size, void* context,\n                             cpu::MMIOReadCallback read_callback,\n                             cpu::MMIOWriteCallback write_callback);\n\n  // Gets the defined MMIO range for the given virtual address, if any.\n  cpu::MMIORange* LookupVirtualMappedRange(uint32_t virtual_address);\n\n  // Physical memory access callbacks, two types of them.\n  //\n  // This is simple per-system-page protection without reference counting or\n  // stored ranges. Whenever a watched page is accessed, all callbacks for it\n  // are triggered. Also the only way to remove callbacks is to trigger them\n  // somehow. Since there are no references from pages to individual callbacks,\n  // there's no way to disable only a specific callback for a page. Also\n  // callbacks may be triggered spuriously, and handlers should properly ignore\n  // pages they don't care about.\n  //\n  // Once callbacks are triggered for a page, the page is not watched anymore\n  // until requested again later. It is, however, unwatched only in one guest\n  // view of physical memory (because different views may have different\n  // protection for the same memory) - but it's rare when the same memory is\n  // used with different guest page sizes, and it's okay to fire a callback more\n  // than once.\n  //\n  // Only accessing the guest virtual memory views of physical memory triggers\n  // callbacks - data providers, for instance, must write to the host physical\n  // heap directly, otherwise their threads may infinitely await themselves.\n  //\n  // - Invalidation notifications:\n  //\n  // Protecting from writing. One-shot callbacks for invalidation of various\n  // kinds of physical memory caches (such as the GPU copy of the memory).\n  //\n  // May be triggered for a single page (in case of a write access violation or\n  // when need to synchronize data given by data providers) or for multiple\n  // pages (like when memory is released, or explicitly to trigger callbacks\n  // when host-side code can't rely on regular access violations, like when\n  // accessing a file).\n  //\n  // Since granularity of callbacks is one single page, an invalidation\n  // notification handler must invalidate the all the data stored in the touched\n  // pages.\n  //\n  // Because large ranges (like whole framebuffers) may be written to and\n  // exceptions are expensive, it's better to unprotect multiple pages as a\n  // result of a write access violation, so the shortest common range returned\n  // by all the invalidation callbacks (clamped to a sane range and also not to\n  // touch pages with provider callbacks) is unprotected.\n  //\n  // - Data providers:\n  //\n  // TODO(Triang3l): Implement data providers - more complicated because they\n  // will need to be able to release the global lock.\n\n  // Returns start and length of the smallest physical memory region surrounding\n  // the watched region that can be safely unwatched, if it doesn't matter,\n  // return (0, UINT32_MAX).\n  typedef std::pair<uint32_t, uint32_t> (*PhysicalMemoryInvalidationCallback)(\n      void* context_ptr, uint32_t physical_address_start, uint32_t length,\n      bool exact_range);\n  // Returns a handle for unregistering or for skipping one notification handler\n  // while triggering data providers.\n  void* RegisterPhysicalMemoryInvalidationCallback(\n      PhysicalMemoryInvalidationCallback callback, void* callback_context);\n  // Unregisters a physical memory invalidation callback previously added with\n  // RegisterPhysicalMemoryInvalidationCallback.\n  void UnregisterPhysicalMemoryInvalidationCallback(void* callback_handle);\n\n  // Enables physical memory access callbacks for the specified memory range,\n  // snapped to system page boundaries.\n  void EnablePhysicalMemoryAccessCallbacks(\n      uint32_t physical_address, uint32_t length,\n      bool enable_invalidation_notifications, bool enable_data_providers);\n\n  // Forces triggering of watch callbacks for a virtual address range if pages\n  // are watched there and unwatching them. Returns whether any page was\n  // watched. Must be called with global critical region locking depth of 1.\n  // TODO(Triang3l): Implement data providers - this is why locking depth of 1\n  // will be required in the future.\n  bool TriggerPhysicalMemoryCallbacks(\n      std::unique_lock<std::recursive_mutex> global_lock_locked_once,\n      uint32_t virtual_address, uint32_t length, bool is_write,\n      bool unwatch_exact_range, bool unprotect = true);\n\n  // Allocates virtual memory from the 'system' heap.\n  // System memory is kept separate from game memory but is still accessible\n  // using normal guest virtual addresses. Kernel structures and other internal\n  // 'system' allocations should come from this heap when possible.\n  uint32_t SystemHeapAlloc(uint32_t size, uint32_t alignment = 0x20,\n                           uint32_t system_heap_flags = kSystemHeapDefault);\n\n  // Frees memory allocated with SystemHeapAlloc.\n  void SystemHeapFree(uint32_t address);\n\n  // Gets the heap for the address space containing the given address.\n  const BaseHeap* LookupHeap(uint32_t address) const;\n\n  inline BaseHeap* LookupHeap(uint32_t address) {\n    return const_cast<BaseHeap*>(\n        const_cast<const Memory*>(this)->LookupHeap(address));\n  }\n\n  // Gets the heap with the given properties.\n  BaseHeap* LookupHeapByType(bool physical, uint32_t page_size);\n\n  // Gets the physical base heap.\n  VirtualHeap* GetPhysicalHeap();\n\n  // Dumps a map of all allocated memory to the log.\n  void DumpMap();\n\n  bool Save(ByteStream* stream);\n  bool Restore(ByteStream* stream);\n\n private:\n  int MapViews(uint8_t* mapping_base);\n  void UnmapViews();\n\n  static uint32_t HostToGuestVirtualThunk(const void* context,\n                                          const void* host_address);\n\n  bool AccessViolationCallback(\n      std::unique_lock<std::recursive_mutex> global_lock_locked_once,\n      void* host_address, bool is_write);\n  static bool AccessViolationCallbackThunk(\n      std::unique_lock<std::recursive_mutex> global_lock_locked_once,\n      void* context, void* host_address, bool is_write);\n\n  std::filesystem::path file_name_;\n  uint32_t system_page_size_ = 0;\n  uint32_t system_allocation_granularity_ = 0;\n  uint8_t* virtual_membase_ = nullptr;\n  uint8_t* physical_membase_ = nullptr;\n\n  xe::memory::FileMappingHandle mapping_ =\n      xe::memory::kFileMappingHandleInvalid;\n  uint8_t* mapping_base_ = nullptr;\n  union {\n    struct {\n      uint8_t* v00000000;\n      uint8_t* v40000000;\n      uint8_t* v7F000000;\n      uint8_t* v80000000;\n      uint8_t* v90000000;\n      uint8_t* vA0000000;\n      uint8_t* vC0000000;\n      uint8_t* vE0000000;\n      uint8_t* physical;\n    };\n    uint8_t* all_views[9];\n  } views_ = {{0}};\n\n  std::unique_ptr<cpu::MMIOHandler> mmio_handler_;\n\n  struct {\n    VirtualHeap v00000000;\n    VirtualHeap v40000000;\n    VirtualHeap v80000000;\n    VirtualHeap v90000000;\n\n    VirtualHeap physical;\n    PhysicalHeap vA0000000;\n    PhysicalHeap vC0000000;\n    PhysicalHeap vE0000000;\n  } heaps_;\n\n  friend class BaseHeap;\n\n  friend class PhysicalHeap;\n  xe::global_critical_region global_critical_region_;\n  std::vector<std::pair<PhysicalMemoryInvalidationCallback, void*>*>\n      physical_memory_invalidation_callbacks_;\n};\n\n}  // namespace xe\n\n#endif  // XENIA_MEMORY_H_\n"
  },
  {
    "path": "src/xenia/premake5.lua",
    "content": "project_root = \"../..\"\ninclude(project_root..\"/tools/build\")\n\ngroup(\"src\")\nproject(\"xenia-core\")\n  uuid(\"970f7892-f19a-4bf5-8795-478c51757bec\")\n  kind(\"StaticLib\")\n  language(\"C++\")\n  links({\n    \"fmt\",\n    \"xenia-base\",\n  })\n  defines({\n  })\n  files({\"*.h\", \"*.cc\"})\n"
  },
  {
    "path": "src/xenia/tools/api-scanner/README.md",
    "content": "## api-scanner\n\napi-scanner will dump out the API imports from a packaged 360 game\n\n### Usage\n\nRun from the command line\n\n`api-scanner <package_path>`\n\nor:\n\n`api-scanner --target <package_path>`\n\nOutput is printed to the console window, so it self-managed.\n\nThe suggested usage is to append the output to a local file:\n\n`api-scanner <package_path> >> title_log.txt`\n\n### Issues\n\n- Duplicate code for loading containers\n- Several issues with gflags library - incorrectly prints usage from other files (due to linkage with libxenia)\n"
  },
  {
    "path": "src/xenia/tools/api-scanner/api_scanner_loader.cc",
    "content": "/**\n ******************************************************************************\n * api-scanner - Scan for API imports from a packaged 360 game                *\n ******************************************************************************\n * Copyright 2015 x1nixmzeng. All rights reserved.                            *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"api_scanner_loader.h\"\n#include \"xenia/kernel/xam_module.h\"\n#include \"xenia/kernel/xboxkrnl_module.h\"\n\nnamespace xe {\nnamespace tools {\n\nvoid apiscanner_logger::operator()(const LogType type, const char* szMessage) {\n  switch (type) {\n    case LT_WARNING:\n      fprintf(stderr, \"[W] %s\\n\", szMessage);\n      break;\n    case LT_ERROR:\n      fprintf(stderr, \"[!] %s\\n\", szMessage);\n      break;\n    default:\n      break;\n  }\n}\n\napiscanner_loader::apiscanner_loader()\n    : export_resolver(nullptr), memory_(nullptr) {\n  export_resolver = std::make_unique<xe::cpu::ExportResolver>();\n\n  kernel::XamModule::RegisterExportTable(export_resolver.get());\n  kernel::XboxkrnlModule::RegisterExportTable(export_resolver.get());\n\n  memory_ = std::make_unique<Memory>();\n  memory_->Initialize();\n}\n\napiscanner_loader::~apiscanner_loader() {\n  if (export_resolver != nullptr) {\n    export_resolver.reset();\n  }\n\n  if (memory_ != nullptr) {\n    memory_.reset();\n  }\n}\n\nbool apiscanner_loader::LoadTitleImports(const std::wstring& target) {\n  auto type(file_system.InferType(target));\n  int result = file_system.InitializeFromPath(type, target);\n  if (result) {\n    log(log.LT_ERROR, \"Could not load target\");\n    return false;\n  }\n\n  return ReadTarget();\n}\n\nbool apiscanner_loader::ReadTarget() {\n  // XXX Do a wildcard search for all xex files?\n  const char path[] = \"game:\\\\default.xex\";\n\n  kernel::XFile* file(nullptr);\n  bool read_result(false);\n  auto fs_entry = file_system.ResolvePath(path);\n  if (!fs_entry) {\n    log(log.LT_WARNING, \"Could not resolve xex path\");\n    return false;\n  }\n\n  // If the FS supports mapping, map the file in and load from that.\n  if (fs_entry->can_map()) {\n    auto mmap = fs_entry->CreateMemoryMapping(kernel::fs::Mode::READ, 0, 0);\n    if (!mmap) {\n      if (file) {\n        file->Release();\n      }\n      log(log.LT_WARNING, \"Could not map filesystem\");\n      return false;\n    }\n\n    title res;\n    read_result = ExtractImports(mmap->address(), mmap->length(), res);\n    if (read_result) {\n      loaded_titles.push_back(res);\n    }\n  } else {\n    kernel::XFileInfo file_info;\n    if (fs_entry->QueryInfo(&file_info)) {\n      if (file) {\n        file->Release();\n      }\n      log(log.LT_WARNING, \"Could not read xex attributes\");\n      return false;\n    }\n\n    // Load into memory\n    std::vector<uint8_t> buffer(file_info.file_length);\n\n    // XXX No kernel state again\n    int result = file_system.Open(std::move(fs_entry), nullptr,\n                                  kernel::fs::Mode::READ, false, &file);\n    if (result) {\n      if (file) {\n        file->Release();\n      }\n      log(log.LT_WARNING, \"Could not open xex file\");\n      return false;\n    }\n\n    size_t bytes_read = 0;\n    result = file->Read(buffer.data(), buffer.size(), 0, &bytes_read);\n    if (result) {\n      if (file) {\n        file->Release();\n      }\n      log(log.LT_ERROR, \"Could not read xex data\");\n      return false;\n    }\n\n    title res;\n    read_result = ExtractImports(buffer.data(), bytes_read, res);\n    if (read_result) {\n      loaded_titles.push_back(res);\n    }\n  }\n\n  if (file) {\n    file->Release();\n  }\n\n  return read_result;\n}\n\nbool apiscanner_loader::ExtractImports(const void* addr, const size_t length,\n                                       title& info) {\n  // Load the XEX into memory and decrypt.\n  xe_xex2_options_t xex_options = {0};\n  xe_xex2_ref xex_(xe_xex2_load(memory_.get(), addr, length, xex_options));\n  if (!xex_) {\n    log(log.LT_ERROR, \"Failed to parse xex file\");\n    return false;\n  }\n\n  const xe_xex2_header_t* header = xe_xex2_get_header(xex_);\n\n  info.title_id = header->execution_info.title_id;\n\n  // XXX Copy out library versions?\n  for (size_t n = 0; n < header->import_library_count; n++) {\n    const xe_xex2_import_library_t* library = &header->import_libraries[n];\n\n    xe_xex2_import_info_t* import_infos;\n    size_t import_info_count;\n    if (!xe_xex2_get_import_infos(xex_, library, &import_infos,\n                                  &import_info_count)) {\n      for (size_t m = 0; m < import_info_count; m++) {\n        const xe_xex2_import_info_t* import_info = &import_infos[m];\n\n        auto kernel_export = export_resolver->GetExportByOrdinal(\n            library->name, import_info->ordinal);\n\n        if ((kernel_export &&\n             kernel_export->type == xe::cpu::KernelExport::Variable) ||\n            import_info->thunk_address) {\n          const std::string named(kernel_export ? kernel_export->name : \"\");\n          info.imports.push_back(named);\n        }\n      }\n    }\n  }\n\n  xe_xex2_dealloc(xex_);\n  std::sort(info.imports.begin(), info.imports.end());\n\n  return true;\n}\n\n}  // namespace tools\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/tools/api-scanner/api_scanner_loader.h",
    "content": "/**\n ******************************************************************************\n * api-scanner - Scan for API imports from a packaged 360 game                *\n ******************************************************************************\n * Copyright 2015 x1nixmzeng. All rights reserved.                            *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include <cstddef>\n#include <cstdint>\n#include <memory>\n#include <vector>\n\n#include \"xenia/base/math.h\"\n#include \"xenia/cpu/export_resolver.h\"\n#include \"xenia/kernel/fs/filesystem.h\"\n#include \"xenia/kernel/objects/xfile.h\"\n#include \"xenia/kernel/util/xex2.h\"\n#include \"xenia/memory.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace tools {\n\nclass apiscanner_logger {\n public:\n  enum LogType { LT_WARNING, LT_ERROR };\n\n  void operator()(const LogType type, const char* szMessage);\n};\n\nclass apiscanner_loader {\n private:\n  kernel::fs::FileSystem file_system;\n  apiscanner_logger log;\n  std::unique_ptr<Memory> memory_;\n  std::unique_ptr<xe::cpu::ExportResolver> export_resolver;\n\n public:\n  apiscanner_loader();\n  ~apiscanner_loader();\n\n  bool LoadTitleImports(const std::wstring& target);\n\n  struct title {\n    uint32_t title_id;\n    std::vector<std::string> imports;\n  };\n\n  const std::vector<title>& GetAllTitles() const { return loaded_titles; }\n\n private:\n  std::vector<title> loaded_titles;\n\n  bool ReadTarget();\n  bool ExtractImports(const void* addr, const size_t length, title& info);\n};\n\n}  // namespace tools\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/tools/api-scanner/api_scanner_main.cc",
    "content": "/**\n ******************************************************************************\n * api-scanner - Scan for API imports from a packaged 360 game                *\n ******************************************************************************\n * Copyright 2015 x1nixmzeng. All rights reserved.                            *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include <cstdio>\n#include <string>\n#include <vector>\n\n#include \"xenia/base/console_app_main.h\"\n#include \"xenia/base/cvar.h\"\n#include \"xenia/base/string.h\"\n#include \"xenia/tools/api_scanner_loader.h\"\n\nnamespace xe {\nnamespace tools {\n\nDEFINE_transient_string(target, \"\", \"List of file to extract imports from\");\n\n// TODO(Triang3l): Change to std::string (currently doesn't even compile).\nint api_scanner_main(std::vector<std::wstring>& args) {\n  // XXX we need gflags to split multiple flags into arrays for us\n\n  if (args.size() == 2 || !cvars::target.empty()) {\n    apiscanner_loader loader_;\n    std::wstring target(cvars::target.empty() ? args[1]\n                                              : xe::to_wstring(cvars::target));\n\n    std::wstring target_abs = xe::to_absolute_path(target);\n\n    // XXX For each target?\n    if (loader_.LoadTitleImports(target)) {\n      for (const auto title : loader_.GetAllTitles()) {\n        printf(\"%08x\\n\", title.title_id);\n        for (const auto import : title.imports) {\n          printf(\"\\t%s\\n\", import.c_str());\n        }\n      }\n    }\n  }\n\n  return 0;\n}\n\n}  // namespace tools\n}  // namespace xe\n\nXE_DEFINE_CONSOLE_APP(\"api-scanner\", xe::tools::api_scanner_main,\n                      \"[target file]\", \"target\");\n"
  },
  {
    "path": "src/xenia/ui/d3d12/d3d12_api.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2018 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_D3D12_D3D12_API_H_\n#define XENIA_UI_D3D12_D3D12_API_H_\n\n// Must be included before D3D and DXGI for things like NOMINMAX.\n#include \"xenia/base/platform_win.h\"\n\n// Include the up to date versions of the headers of DXGI and Direct3D 12 rather\n// than the ones from the Windows SDK before other headers that may also\n// potentially include their headers.\n\n#include \"xenia/ui/dxgi_include_win.h\"\n\n#include \"third_party/DirectX-Headers/include/directx/d3d12.h\"\n#include \"third_party/DirectX-Headers/include/directx/d3d12sdklayers.h\"\n\n#include <DXProgrammableCapture.h>\n#include <d3dcompiler.h>\n#include <dxgidebug.h>\n// For Microsoft::WRL::ComPtr.\n#include <wrl/client.h>\n\n#include \"third_party/DirectXShaderCompiler/include/dxc/dxcapi.h\"\n#include \"third_party/DirectXShaderCompiler/projects/dxilconv/include/DxbcConverter.h\"\n\n#define XELOGD3D XELOGI\n\n#endif  // XENIA_UI_D3D12_D3D12_API_H_\n"
  },
  {
    "path": "src/xenia/ui/d3d12/d3d12_cpu_descriptor_pool.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/ui/d3d12/d3d12_cpu_descriptor_pool.h\"\n\n#include <cstdint>\n#include <memory>\n\n#include \"xenia/base/logging.h\"\n\nnamespace xe {\nnamespace ui {\nnamespace d3d12 {\n\nD3D12CpuDescriptorPool::Descriptor\nD3D12CpuDescriptorPool::AllocateDescriptor() {\n  if (!freed_indices_.empty()) {\n    size_t index = freed_indices_.back();\n    freed_indices_.pop_back();\n    return Descriptor(shared_from_this(), index);\n  }\n  uint32_t heap_size = uint32_t(1) << heap_size_log2_;\n  if (!heaps_.empty() && last_heap_allocated_ < heap_size) {\n    return Descriptor(shared_from_this(),\n                      (heaps_.size() - 1) * heap_size + last_heap_allocated_++);\n  }\n  D3D12_DESCRIPTOR_HEAP_DESC descriptor_heap_desc;\n  descriptor_heap_desc.Type = type_;\n  descriptor_heap_desc.NumDescriptors = heap_size;\n  descriptor_heap_desc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE;\n  descriptor_heap_desc.NodeMask = 0;\n  ID3D12DescriptorHeap* descriptor_heap;\n  if (FAILED(provider_.GetDevice()->CreateDescriptorHeap(\n          &descriptor_heap_desc, IID_PPV_ARGS(&descriptor_heap)))) {\n    XELOGE(\n        \"Failed to create a non-shader-visible descriptor heap for {} \"\n        \"descriptors\",\n        heap_size);\n    return Descriptor();\n  }\n  heaps_.push_back(descriptor_heap);\n  last_heap_allocated_ = 1;\n  return Descriptor(shared_from_this(), (heaps_.size() - 1) * heap_size);\n}\n\n}  // namespace d3d12\n}  // namespace ui\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/ui/d3d12/d3d12_cpu_descriptor_pool.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_D3D12_D3D12_CPU_DESCRIPTOR_POOL_H_\n#define XENIA_UI_D3D12_D3D12_CPU_DESCRIPTOR_POOL_H_\n\n#include <cstdint>\n#include <memory>\n#include <utility>\n#include <vector>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/ui/d3d12/d3d12_provider.h\"\n\nnamespace xe {\nnamespace ui {\nnamespace d3d12 {\n\n// Single-descriptor pool with reference counting and unique ownership of\n// allocations, safe to use in environments where the order of releasing of the\n// descriptor heap and of allocated descriptors is undefined.\nclass D3D12CpuDescriptorPool\n    : public std::enable_shared_from_this<D3D12CpuDescriptorPool> {\n public:\n  class Descriptor {\n   public:\n    Descriptor() = default;\n    // shared_ptr to ensure correct release order with between render targets\n    // and descriptor pools.\n    Descriptor(std::shared_ptr<D3D12CpuDescriptorPool> pool, size_t index)\n        : pool_(pool), index_(index) {}\n    // Owns a descriptor in the pool exclusively.\n    Descriptor(const Descriptor& descriptor) = delete;\n    Descriptor& operator=(const Descriptor& descriptor) = delete;\n    Descriptor(Descriptor&& descriptor) {\n      pool_ = std::move(descriptor.pool_);\n      index_ = descriptor.index_;\n    }\n    Descriptor& operator=(Descriptor&& descriptor) {\n      if (IsValid() && pool_ == descriptor.pool_ &&\n          index_ == descriptor.index_) {\n        // If moving to self, don't free.\n        return *this;\n      }\n      Free();\n      pool_ = std::move(descriptor.pool_);\n      index_ = descriptor.index_;\n      return *this;\n    }\n    ~Descriptor() { Free(); }\n    void Free() {\n      if (!pool_) {\n        return;\n      }\n      pool_->FreeDescriptor(index_);\n      pool_.reset();\n    }\n    bool IsValid() const { return pool_.get() != nullptr; }\n    operator bool() const { return IsValid(); }\n    D3D12_CPU_DESCRIPTOR_HANDLE GetHandle() const {\n      assert_true(IsValid());\n      return pool_->GetHandle(index_);\n    }\n\n   private:\n    std::shared_ptr<D3D12CpuDescriptorPool> pool_;\n    size_t index_ = 0;\n  };\n\n  D3D12CpuDescriptorPool(const ui::d3d12::D3D12Provider& provider,\n                         D3D12_DESCRIPTOR_HEAP_TYPE type,\n                         uint32_t heap_size_log2)\n      : provider_(provider), type_(type), heap_size_log2_(heap_size_log2) {\n    assert_true(heap_size_log2 <= 31);\n  }\n  D3D12CpuDescriptorPool(const D3D12CpuDescriptorPool& pool) = delete;\n  D3D12CpuDescriptorPool& operator=(const D3D12CpuDescriptorPool& pool) =\n      delete;\n  // No point in moving, created only via make_shared.\n  D3D12CpuDescriptorPool(D3D12CpuDescriptorPool&& pool) = delete;\n  D3D12CpuDescriptorPool& operator=(D3D12CpuDescriptorPool&& pool) = delete;\n  ~D3D12CpuDescriptorPool() {\n    for (ID3D12DescriptorHeap* heap : heaps_) {\n      heap->Release();\n    }\n  }\n\n  Descriptor AllocateDescriptor();\n\n private:\n  void FreeDescriptor(size_t index) { freed_indices_.push_back(index); }\n\n  D3D12_CPU_DESCRIPTOR_HANDLE GetHandle(size_t index) const {\n    D3D12_CPU_DESCRIPTOR_HANDLE heap_start =\n        heaps_[index >> heap_size_log2_]->GetCPUDescriptorHandleForHeapStart();\n    uint32_t heap_local_index =\n        uint32_t(index & ((uint32_t(1) << heap_size_log2_) - 1));\n    return provider_.OffsetDescriptor(type_, heap_start, heap_local_index);\n  }\n\n  const ui::d3d12::D3D12Provider& provider_;\n  D3D12_DESCRIPTOR_HEAP_TYPE type_;\n  uint32_t heap_size_log2_;\n  std::vector<ID3D12DescriptorHeap*> heaps_;\n  std::vector<size_t> freed_indices_;\n  uint32_t last_heap_allocated_ = 0;\n};\n\n}  // namespace d3d12\n}  // namespace ui\n}  // namespace xe\n\n#endif  // XENIA_UI_D3D12_D3D12_CPU_DESCRIPTOR_POOL_H_\n"
  },
  {
    "path": "src/xenia/ui/d3d12/d3d12_descriptor_heap_pool.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/ui/d3d12/d3d12_descriptor_heap_pool.h\"\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/logging.h\"\n\nnamespace xe {\nnamespace ui {\nnamespace d3d12 {\n\nD3D12DescriptorHeapPool::D3D12DescriptorHeapPool(\n    ID3D12Device* device, D3D12_DESCRIPTOR_HEAP_TYPE type, uint32_t page_size)\n    : device_(device), type_(type), page_size_(page_size) {}\n\nD3D12DescriptorHeapPool::~D3D12DescriptorHeapPool() { ClearCache(); }\n\nvoid D3D12DescriptorHeapPool::Reclaim(uint64_t completed_submission_index) {\n  while (submitted_first_) {\n    if (submitted_first_->last_submission_index > completed_submission_index) {\n      break;\n    }\n    if (writable_last_) {\n      writable_last_->next = submitted_first_;\n    } else {\n      writable_first_ = submitted_first_;\n    }\n    writable_last_ = submitted_first_;\n    submitted_first_ = submitted_first_->next;\n    writable_last_->next = nullptr;\n  }\n  if (!submitted_first_) {\n    submitted_last_ = nullptr;\n  }\n}\n\nvoid D3D12DescriptorHeapPool::ChangeSubmissionTimeline() {\n  // Reclaim all submitted pages.\n  if (writable_last_) {\n    writable_last_->next = submitted_first_;\n  } else {\n    writable_first_ = submitted_first_;\n  }\n  writable_last_ = submitted_last_;\n  submitted_first_ = nullptr;\n  submitted_last_ = nullptr;\n\n  // Mark all pages as never used yet in the new timeline.\n  Page* page = writable_first_;\n  while (page) {\n    page->last_submission_index = 0;\n    page = page->next;\n  }\n}\n\nvoid D3D12DescriptorHeapPool::ClearCache() {\n  // Not checking current_page_used_ != 0 because asking for 0 descriptors\n  // returns a valid heap also - but actually the new heap will be different now\n  // and the old one must be unbound since it doesn't exist anymore.\n  ++current_heap_index_;\n  current_page_used_ = 0;\n  while (submitted_first_) {\n    auto next = submitted_first_->next;\n    delete submitted_first_;\n    submitted_first_ = next;\n  }\n  submitted_last_ = nullptr;\n  while (writable_first_) {\n    auto next = writable_first_->next;\n    delete writable_first_;\n    writable_first_ = next;\n  }\n  writable_last_ = nullptr;\n}\n\nuint64_t D3D12DescriptorHeapPool::Request(uint64_t submission_index,\n                                          uint64_t previous_heap_index,\n                                          uint32_t count_for_partial_update,\n                                          uint32_t count_for_full_update,\n                                          uint32_t& index_out) {\n  assert_true(count_for_partial_update <= count_for_full_update);\n  assert_true(count_for_full_update <= page_size_);\n  if (count_for_partial_update > count_for_full_update ||\n      count_for_full_update > page_size_) {\n    return kHeapIndexInvalid;\n  }\n  assert_true(!current_page_used_ ||\n              submission_index >= writable_first_->last_submission_index);\n  assert_true(!submitted_last_ ||\n              submission_index >= submitted_last_->last_submission_index);\n  // If the last full update happened on the current page, a partial update is\n  // possible.\n  uint32_t count = previous_heap_index == current_heap_index_\n                       ? count_for_partial_update\n                       : count_for_full_update;\n  // Go to the next page if there's not enough free space on the current one,\n  // or because the previous page may be outdated. In this case, a full update\n  // is necessary.\n  if (page_size_ - current_page_used_ < count) {\n    // Close the page that was current.\n    if (submitted_last_) {\n      submitted_last_->next = writable_first_;\n    } else {\n      submitted_first_ = writable_first_;\n    }\n    submitted_last_ = writable_first_;\n    writable_first_ = writable_first_->next;\n    submitted_last_->next = nullptr;\n    if (!writable_first_) {\n      writable_last_ = nullptr;\n    }\n    ++current_heap_index_;\n    current_page_used_ = 0;\n    count = count_for_full_update;\n  }\n  // Create the page if needed (may be the first call for the page).\n  if (!writable_first_) {\n    D3D12_DESCRIPTOR_HEAP_DESC new_heap_desc;\n    new_heap_desc.Type = type_;\n    new_heap_desc.NumDescriptors = page_size_;\n    new_heap_desc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE;\n    new_heap_desc.NodeMask = 0;\n    Microsoft::WRL::ComPtr<ID3D12DescriptorHeap> new_heap;\n    if (FAILED(device_->CreateDescriptorHeap(&new_heap_desc,\n                                             IID_PPV_ARGS(&new_heap)))) {\n      XELOGE(\"Failed to create a heap for {} shader-visible descriptors\",\n             page_size_);\n      return kHeapIndexInvalid;\n    }\n    writable_first_ = new Page;\n    writable_first_->heap = new_heap;\n    writable_first_->cpu_start = new_heap->GetCPUDescriptorHandleForHeapStart();\n    writable_first_->gpu_start = new_heap->GetGPUDescriptorHandleForHeapStart();\n    writable_first_->last_submission_index = submission_index;\n    writable_first_->next = nullptr;\n    writable_last_ = writable_first_;\n  }\n  writable_first_->last_submission_index = submission_index;\n  index_out = current_page_used_;\n  current_page_used_ += count;\n  return current_heap_index_;\n}\n\n}  // namespace d3d12\n}  // namespace ui\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/ui/d3d12/d3d12_descriptor_heap_pool.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_D3D12_D3D12_DESCRIPTOR_HEAP_POOL_H_\n#define XENIA_UI_D3D12_D3D12_DESCRIPTOR_HEAP_POOL_H_\n\n#include <cstdint>\n\n#include \"xenia/ui/d3d12/d3d12_provider.h\"\n\nnamespace xe {\nnamespace ui {\nnamespace d3d12 {\n\n// Submission index is the fence value or a value derived from it (if reclaiming\n// less often than once per fence value, for instance).\n\nclass D3D12DescriptorHeapPool {\n public:\n  static constexpr uint64_t kHeapIndexInvalid = UINT64_MAX;\n\n  D3D12DescriptorHeapPool(ID3D12Device* device, D3D12_DESCRIPTOR_HEAP_TYPE type,\n                          uint32_t page_size);\n  ~D3D12DescriptorHeapPool();\n\n  void Reclaim(uint64_t completed_submission_index);\n  void ChangeSubmissionTimeline();\n  void ClearCache();\n\n  // Because all descriptors for a single draw call must be in the same heap,\n  // sometimes all descriptors, rather than only the modified portion of it,\n  // needs to be written.\n  //\n  // This may happen if there's not enough free space even for a partial update\n  // in the current heap, or if the heap which contains the unchanged part of\n  // the descriptors is outdated.\n  //\n  // If something uses this pool to do partial updates, it must let this\n  // function determine whether a partial update is possible. For this purpose,\n  // this function returns the heap reset index - and it must be called with its\n  // previous return value for the set of descriptors it's updating.\n  //\n  // If this function returns a value that is the same as previous_heap_index, a\n  // partial update needs to be done - and space for count_for_partial_update is\n  // allocated.\n  //\n  // If it's different, all descriptors must be written again - and space for\n  // count_for_full_update is allocated.\n  //\n  // If kHeapIndexInvalid is returned, there was an error.\n  //\n  // This MUST be called even if there's nothing to write in a partial update\n  // (with count_for_partial_update being 0), because a full update may still be\n  // required.\n  uint64_t Request(uint64_t submission_index, uint64_t previous_heap_index,\n                   uint32_t count_for_partial_update,\n                   uint32_t count_for_full_update, uint32_t& index_out);\n\n  // The current heap, for binding and actually writing - may be called only\n  // after a successful request because before a request, the heap may not exist\n  // yet.\n  ID3D12DescriptorHeap* GetLastRequestHeap() const {\n    return writable_first_->heap.Get();\n  }\n  D3D12_CPU_DESCRIPTOR_HANDLE GetLastRequestHeapCPUStart() const {\n    return writable_first_->cpu_start;\n  }\n  D3D12_GPU_DESCRIPTOR_HANDLE GetLastRequestHeapGPUStart() const {\n    return writable_first_->gpu_start;\n  }\n\n private:\n  ID3D12Device* device_;\n  D3D12_DESCRIPTOR_HEAP_TYPE type_;\n  uint32_t page_size_;\n\n  struct Page {\n    Microsoft::WRL::ComPtr<ID3D12DescriptorHeap> heap;\n    D3D12_CPU_DESCRIPTOR_HANDLE cpu_start;\n    D3D12_GPU_DESCRIPTOR_HANDLE gpu_start;\n    uint64_t last_submission_index;\n    Page* next;\n  };\n\n  // A list of heap with free space, with the first buffer being the one\n  // currently being filled.\n  Page* writable_first_ = nullptr;\n  Page* writable_last_ = nullptr;\n  // A list of full heaps that can be reclaimed when the GPU doesn't use them\n  // anymore.\n  Page* submitted_first_ = nullptr;\n  Page* submitted_last_ = nullptr;\n  // Monotonically increased when a new request is going to a different\n  // ID3D12DescriptorHeap than the one that may be bound currently. See Request\n  // for more information.\n  uint64_t current_heap_index_ = 0;\n  uint32_t current_page_used_ = 0;\n};\n\n}  // namespace d3d12\n}  // namespace ui\n}  // namespace xe\n\n#endif  // XENIA_UI_D3D12_D3D12_DESCRIPTOR_HEAP_POOL_H_\n"
  },
  {
    "path": "src/xenia/ui/d3d12/d3d12_gpu_completion_timeline.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2025 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/ui/d3d12/d3d12_gpu_completion_timeline.h\"\n\n#include <utility>\n\n#include \"xenia/base/logging.h\"\n\nnamespace xe {\nnamespace ui {\nnamespace d3d12 {\n\nstd::unique_ptr<D3D12GPUCompletionTimeline> D3D12GPUCompletionTimeline::Create(\n    ID3D12Device* const device) {\n  Microsoft::WRL::ComPtr<ID3D12Fence> fence;\n  const HRESULT fence_create_result =\n      device->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&fence));\n  if (FAILED(fence_create_result)) {\n    XELOGE(\"Failed to create a Direct3D 12 fence, result 0x{:08X}\",\n           fence_create_result);\n    return nullptr;\n  }\n  return std::unique_ptr<D3D12GPUCompletionTimeline>(\n      new D3D12GPUCompletionTimeline(fence.Get()));\n}\n\nD3D12GPUCompletionTimeline::~D3D12GPUCompletionTimeline() {\n  fence_->SetEventOnCompletion(GetUpcomingSubmission() - 1, nullptr);\n}\n\nvoid D3D12GPUCompletionTimeline::UpdateCompletedSubmission() {\n  uint64_t actual_completed_submission = fence_->GetCompletedValue();\n  // The device has been removed if the completed value is UINT64_MAX.\n  if (actual_completed_submission == UINT64_MAX) {\n    return;\n  }\n  SetCompletedSubmission(actual_completed_submission);\n}\n\nvoid D3D12GPUCompletionTimeline::AwaitSubmissionImpl(\n    const uint64_t awaited_submission) {\n  fence_->SetEventOnCompletion(awaited_submission, nullptr);\n}\n\nHRESULT D3D12GPUCompletionTimeline::SignalAndAdvance(\n    ID3D12CommandQueue* const queue) {\n  const HRESULT signal_result =\n      queue->Signal(fence_.Get(), GetUpcomingSubmission());\n  if (FAILED(signal_result)) {\n    XELOGE(\"Failed to signal a Direct3D 12 fence, result 0x{:08X}\",\n           signal_result);\n  } else {\n    IncrementUpcomingSubmission();\n  }\n  return signal_result;\n}\n\n}  // namespace d3d12\n}  // namespace ui\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/ui/d3d12/d3d12_gpu_completion_timeline.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2025 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_D3D12_D3D12_GPU_COMPLETION_TIMELINE_H_\n#define XENIA_UI_D3D12_D3D12_GPU_COMPLETION_TIMELINE_H_\n\n#include <memory>\n\n#include \"xenia/ui/d3d12/d3d12_api.h\"\n#include \"xenia/ui/gpu_completion_timeline.h\"\n\nnamespace xe {\nnamespace ui {\nnamespace d3d12 {\n\nclass D3D12GPUCompletionTimeline : public GPUCompletionTimeline {\n public:\n  static std::unique_ptr<D3D12GPUCompletionTimeline> Create(\n      ID3D12Device* device);\n\n  D3D12GPUCompletionTimeline(const D3D12GPUCompletionTimeline&) = delete;\n  D3D12GPUCompletionTimeline& operator=(const D3D12GPUCompletionTimeline&) =\n      delete;\n  D3D12GPUCompletionTimeline(D3D12GPUCompletionTimeline&&) = delete;\n  D3D12GPUCompletionTimeline& operator=(D3D12GPUCompletionTimeline&&) = delete;\n\n  ~D3D12GPUCompletionTimeline();\n\n  ID3D12Fence* GetFence() const { return fence_.Get(); }\n\n  using GPUCompletionTimeline::IncrementUpcomingSubmission;\n\n  void UpdateCompletedSubmission() override;\n\n  // If signaling has succeeded, will advance to the next submission.\n  HRESULT SignalAndAdvance(ID3D12CommandQueue* queue);\n\n protected:\n  void AwaitSubmissionImpl(uint64_t awaited_submission) override;\n\n private:\n  explicit D3D12GPUCompletionTimeline(ID3D12Fence* const fence)\n      : fence_(fence) {}\n\n  Microsoft::WRL::ComPtr<ID3D12Fence> fence_;\n};\n\n}  // namespace d3d12\n}  // namespace ui\n}  // namespace xe\n\n#endif  // XENIA_UI_D3D12_D3D12_GPU_COMPLETION_TIMELINE_H_\n"
  },
  {
    "path": "src/xenia/ui/d3d12/d3d12_immediate_drawer.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/ui/d3d12/d3d12_immediate_drawer.h\"\n\n#include <cstring>\n#include <memory>\n#include <utility>\n#include <vector>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/ui/d3d12/d3d12_presenter.h\"\n#include \"xenia/ui/d3d12/d3d12_util.h\"\n\nnamespace xe {\nnamespace ui {\nnamespace d3d12 {\n\n// Generated with `xb buildshaders`.\nnamespace shaders {\n#include \"xenia/ui/shaders/bytecode/d3d12_5_1/immediate_ps.h\"\n#include \"xenia/ui/shaders/bytecode/d3d12_5_1/immediate_vs.h\"\n}  // namespace shaders\n\nD3D12ImmediateDrawer::D3D12ImmediateTexture::D3D12ImmediateTexture(\n    uint32_t width, uint32_t height, ID3D12Resource* resource,\n    SamplerIndex sampler_index, D3D12ImmediateDrawer* immediate_drawer,\n    size_t immediate_drawer_index)\n    : ImmediateTexture(width, height),\n      resource_(resource),\n      sampler_index_(sampler_index),\n      immediate_drawer_(immediate_drawer),\n      immediate_drawer_index_(immediate_drawer_index) {}\n\nD3D12ImmediateDrawer::D3D12ImmediateTexture::~D3D12ImmediateTexture() {\n  if (immediate_drawer_) {\n    immediate_drawer_->OnImmediateTextureDestroyed(*this);\n  }\n}\n\nvoid D3D12ImmediateDrawer::D3D12ImmediateTexture::OnImmediateDrawerDestroyed() {\n  immediate_drawer_ = nullptr;\n  // Lifetime is not managed anymore, so don't keep the resource either.\n  resource_.Reset();\n}\n\nD3D12ImmediateDrawer::~D3D12ImmediateDrawer() {\n  // Await GPU usage completion of all draws and texture uploads (which happen\n  // before draws).\n  auto d3d12_presenter = static_cast<D3D12Presenter*>(presenter());\n  if (d3d12_presenter) {\n    d3d12_presenter->AwaitUISubmissionCompletionFromUIThread(\n        last_paint_submission_index_);\n  }\n\n  // Texture resources and descriptors are owned and tracked by the immediate\n  // drawer. Zombie texture objects are supported, but are meaningless.\n  assert_true(textures_.empty());\n  for (D3D12ImmediateTexture* texture : textures_) {\n    texture->OnImmediateDrawerDestroyed();\n  }\n  textures_.clear();\n}\n\nbool D3D12ImmediateDrawer::Initialize() {\n  ID3D12Device* device = provider_.GetDevice();\n\n  // Create the root signature.\n  D3D12_ROOT_PARAMETER root_parameters[size_t(RootParameter::kCount)];\n  D3D12_DESCRIPTOR_RANGE descriptor_range_texture, descriptor_range_sampler;\n  {\n    auto& root_parameter = root_parameters[size_t(RootParameter::kTexture)];\n    root_parameter.ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;\n    root_parameter.DescriptorTable.NumDescriptorRanges = 1;\n    root_parameter.DescriptorTable.pDescriptorRanges =\n        &descriptor_range_texture;\n    descriptor_range_texture.RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV;\n    descriptor_range_texture.NumDescriptors = 1;\n    descriptor_range_texture.BaseShaderRegister = 0;\n    descriptor_range_texture.RegisterSpace = 0;\n    descriptor_range_texture.OffsetInDescriptorsFromTableStart = 0;\n    root_parameter.ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL;\n  }\n  {\n    auto& root_parameter = root_parameters[size_t(RootParameter::kSampler)];\n    root_parameter.ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;\n    root_parameter.DescriptorTable.NumDescriptorRanges = 1;\n    root_parameter.DescriptorTable.pDescriptorRanges =\n        &descriptor_range_sampler;\n    descriptor_range_sampler.RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER;\n    descriptor_range_sampler.NumDescriptors = 1;\n    descriptor_range_sampler.BaseShaderRegister = 0;\n    descriptor_range_sampler.RegisterSpace = 0;\n    descriptor_range_sampler.OffsetInDescriptorsFromTableStart = 0;\n    root_parameter.ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL;\n  }\n  {\n    auto& root_parameter =\n        root_parameters[size_t(RootParameter::kCoordinateSpaceSizeInv)];\n    root_parameter.ParameterType = D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS;\n    root_parameter.Constants.ShaderRegister = 0;\n    root_parameter.Constants.RegisterSpace = 0;\n    root_parameter.Constants.Num32BitValues = 2;\n    root_parameter.ShaderVisibility = D3D12_SHADER_VISIBILITY_VERTEX;\n  }\n  D3D12_ROOT_SIGNATURE_DESC root_signature_desc;\n  root_signature_desc.NumParameters = UINT(RootParameter::kCount);\n  root_signature_desc.pParameters = root_parameters;\n  root_signature_desc.NumStaticSamplers = 0;\n  root_signature_desc.pStaticSamplers = nullptr;\n  root_signature_desc.Flags =\n      D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT;\n  *(root_signature_.ReleaseAndGetAddressOf()) =\n      util::CreateRootSignature(provider_, root_signature_desc);\n  if (!root_signature_) {\n    XELOGE(\"D3D12ImmediateDrawer: Failed to create the root signature\");\n    return false;\n  }\n\n  // Create the pipelines.\n  D3D12_GRAPHICS_PIPELINE_STATE_DESC pipeline_desc = {};\n  pipeline_desc.pRootSignature = root_signature_.Get();\n  pipeline_desc.VS.pShaderBytecode = shaders::immediate_vs;\n  pipeline_desc.VS.BytecodeLength = sizeof(shaders::immediate_vs);\n  pipeline_desc.PS.pShaderBytecode = shaders::immediate_ps;\n  pipeline_desc.PS.BytecodeLength = sizeof(shaders::immediate_ps);\n  D3D12_RENDER_TARGET_BLEND_DESC& pipeline_blend_desc =\n      pipeline_desc.BlendState.RenderTarget[0];\n  pipeline_blend_desc.BlendEnable = TRUE;\n  pipeline_blend_desc.SrcBlend = D3D12_BLEND_SRC_ALPHA;\n  pipeline_blend_desc.DestBlend = D3D12_BLEND_INV_SRC_ALPHA;\n  pipeline_blend_desc.BlendOp = D3D12_BLEND_OP_ADD;\n  pipeline_blend_desc.SrcBlendAlpha = D3D12_BLEND_ONE;\n  pipeline_blend_desc.DestBlendAlpha = D3D12_BLEND_ONE;\n  pipeline_blend_desc.BlendOpAlpha = D3D12_BLEND_OP_ADD;\n  pipeline_blend_desc.RenderTargetWriteMask = D3D12_COLOR_WRITE_ENABLE_ALL;\n  pipeline_desc.SampleMask = UINT_MAX;\n  pipeline_desc.RasterizerState.FillMode = D3D12_FILL_MODE_SOLID;\n  pipeline_desc.RasterizerState.CullMode = D3D12_CULL_MODE_NONE;\n  pipeline_desc.RasterizerState.FrontCounterClockwise = FALSE;\n  pipeline_desc.RasterizerState.DepthClipEnable = TRUE;\n  D3D12_INPUT_ELEMENT_DESC pipeline_input_elements[3] = {};\n  pipeline_input_elements[0].SemanticName = \"POSITION\";\n  pipeline_input_elements[0].Format = DXGI_FORMAT_R32G32_FLOAT;\n  pipeline_input_elements[0].AlignedByteOffset = offsetof(ImmediateVertex, x);\n  pipeline_input_elements[1].SemanticName = \"TEXCOORD\";\n  pipeline_input_elements[1].Format = DXGI_FORMAT_R32G32_FLOAT;\n  pipeline_input_elements[1].AlignedByteOffset = offsetof(ImmediateVertex, u);\n  pipeline_input_elements[2].SemanticName = \"COLOR\";\n  pipeline_input_elements[2].Format = DXGI_FORMAT_R8G8B8A8_UNORM;\n  pipeline_input_elements[2].AlignedByteOffset =\n      offsetof(ImmediateVertex, color);\n  pipeline_desc.InputLayout.pInputElementDescs = pipeline_input_elements;\n  pipeline_desc.InputLayout.NumElements =\n      UINT(xe::countof(pipeline_input_elements));\n  pipeline_desc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;\n  pipeline_desc.NumRenderTargets = 1;\n  pipeline_desc.RTVFormats[0] = D3D12Presenter::kSwapChainFormat;\n  pipeline_desc.SampleDesc.Count = 1;\n  if (FAILED(device->CreateGraphicsPipelineState(\n          &pipeline_desc, IID_PPV_ARGS(&pipeline_triangle_)))) {\n    XELOGE(\"D3D12ImmediateDrawer: Failed to create the triangle pipeline\");\n    return false;\n  }\n  pipeline_desc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_LINE;\n  if (FAILED(device->CreateGraphicsPipelineState(\n          &pipeline_desc, IID_PPV_ARGS(&pipeline_line_)))) {\n    XELOGE(\"D3D12ImmediateDrawer: Failed to create the line pipeline\");\n    return false;\n  }\n\n  // Create the samplers.\n  D3D12_DESCRIPTOR_HEAP_DESC sampler_heap_desc;\n  sampler_heap_desc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER;\n  sampler_heap_desc.NumDescriptors = UINT(SamplerIndex::kCount);\n  sampler_heap_desc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE;\n  sampler_heap_desc.NodeMask = 0;\n  if (FAILED(device->CreateDescriptorHeap(&sampler_heap_desc,\n                                          IID_PPV_ARGS(&sampler_heap_)))) {\n    XELOGE(\n        \"D3D12ImmediateDrawer: Failed to create the sampler descriptor heap\");\n    return false;\n  }\n  sampler_heap_cpu_start_ = sampler_heap_->GetCPUDescriptorHandleForHeapStart();\n  sampler_heap_gpu_start_ = sampler_heap_->GetGPUDescriptorHandleForHeapStart();\n  uint32_t sampler_size = provider_.GetSamplerDescriptorSize();\n  // Nearest neighbor, clamp.\n  D3D12_SAMPLER_DESC sampler_desc = {};\n  sampler_desc.Filter = D3D12_FILTER_MIN_MAG_MIP_POINT;\n  sampler_desc.AddressU = D3D12_TEXTURE_ADDRESS_MODE_CLAMP;\n  sampler_desc.AddressV = D3D12_TEXTURE_ADDRESS_MODE_CLAMP;\n  sampler_desc.AddressW = D3D12_TEXTURE_ADDRESS_MODE_CLAMP;\n  sampler_desc.MaxAnisotropy = 1;\n  D3D12_CPU_DESCRIPTOR_HANDLE sampler_handle;\n  sampler_handle.ptr = sampler_heap_cpu_start_.ptr +\n                       uint32_t(SamplerIndex::kNearestClamp) * sampler_size;\n  device->CreateSampler(&sampler_desc, sampler_handle);\n  // Bilinear, clamp.\n  sampler_desc.Filter = D3D12_FILTER_MIN_MAG_MIP_LINEAR;\n  sampler_handle.ptr = sampler_heap_cpu_start_.ptr +\n                       uint32_t(SamplerIndex::kLinearClamp) * sampler_size;\n  device->CreateSampler(&sampler_desc, sampler_handle);\n  // Bilinear, repeat.\n  sampler_desc.AddressU = D3D12_TEXTURE_ADDRESS_MODE_WRAP;\n  sampler_desc.AddressV = D3D12_TEXTURE_ADDRESS_MODE_WRAP;\n  sampler_desc.AddressW = D3D12_TEXTURE_ADDRESS_MODE_WRAP;\n  sampler_handle.ptr = sampler_heap_cpu_start_.ptr +\n                       uint32_t(SamplerIndex::kLinearRepeat) * sampler_size;\n  device->CreateSampler(&sampler_desc, sampler_handle);\n  // Nearest neighbor, repeat.\n  sampler_desc.Filter = D3D12_FILTER_MIN_MAG_MIP_POINT;\n  sampler_handle.ptr = sampler_heap_cpu_start_.ptr +\n                       uint32_t(SamplerIndex::kNearestRepeat) * sampler_size;\n  device->CreateSampler(&sampler_desc, sampler_handle);\n\n  // Create pools for draws.\n  vertex_buffer_pool_ = std::make_unique<D3D12UploadBufferPool>(provider_);\n  texture_descriptor_pool_ = std::make_unique<D3D12DescriptorHeapPool>(\n      device, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV, 2048);\n\n  // Reset the current state.\n  batch_open_ = false;\n\n  return true;\n}\n\nstd::unique_ptr<ImmediateTexture> D3D12ImmediateDrawer::CreateTexture(\n    uint32_t width, uint32_t height, ImmediateTextureFilter filter,\n    bool is_repeated, const uint8_t* data) {\n  ID3D12Device* device = provider_.GetDevice();\n  D3D12_HEAP_FLAGS heap_flag_create_not_zeroed =\n      provider_.GetHeapFlagCreateNotZeroed();\n\n  D3D12_RESOURCE_DESC resource_desc;\n  resource_desc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D;\n  resource_desc.Alignment = 0;\n  resource_desc.Width = width;\n  resource_desc.Height = height;\n  resource_desc.DepthOrArraySize = 1;\n  resource_desc.MipLevels = 1;\n  resource_desc.Format = D3D12ImmediateTexture::kFormat;\n  resource_desc.SampleDesc.Count = 1;\n  resource_desc.SampleDesc.Quality = 0;\n  resource_desc.Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN;\n  resource_desc.Flags = D3D12_RESOURCE_FLAG_NONE;\n  Microsoft::WRL::ComPtr<ID3D12Resource> resource;\n  if (SUCCEEDED(device->CreateCommittedResource(\n          &util::kHeapPropertiesDefault, heap_flag_create_not_zeroed,\n          &resource_desc, D3D12_RESOURCE_STATE_COPY_DEST, nullptr,\n          IID_PPV_ARGS(&resource)))) {\n    // Create and fill the upload buffer.\n    D3D12_PLACED_SUBRESOURCE_FOOTPRINT upload_footprint;\n    UINT64 upload_size;\n    device->GetCopyableFootprints(&resource_desc, 0, 1, 0, &upload_footprint,\n                                  nullptr, nullptr, &upload_size);\n    D3D12_RESOURCE_DESC upload_buffer_desc;\n    util::FillBufferResourceDesc(upload_buffer_desc, upload_size,\n                                 D3D12_RESOURCE_FLAG_NONE);\n    Microsoft::WRL::ComPtr<ID3D12Resource> upload_buffer;\n    if (SUCCEEDED(device->CreateCommittedResource(\n            &util::kHeapPropertiesUpload, heap_flag_create_not_zeroed,\n            &upload_buffer_desc, D3D12_RESOURCE_STATE_GENERIC_READ, nullptr,\n            IID_PPV_ARGS(&upload_buffer)))) {\n      D3D12_RANGE upload_buffer_read_range;\n      upload_buffer_read_range.Begin = 0;\n      upload_buffer_read_range.End = 0;\n      void* upload_buffer_mapping;\n      if (SUCCEEDED(upload_buffer->Map(0, &upload_buffer_read_range,\n                                       &upload_buffer_mapping))) {\n        size_t data_row_length = sizeof(uint32_t) * width;\n        if (data_row_length == upload_footprint.Footprint.RowPitch) {\n          std::memcpy(upload_buffer_mapping, data, data_row_length * height);\n        } else {\n          uint8_t* upload_buffer_row =\n              reinterpret_cast<uint8_t*>(upload_buffer_mapping) +\n              upload_footprint.Offset;\n          const uint8_t* data_row = data;\n          for (uint32_t i = 0; i < height; ++i) {\n            std::memcpy(upload_buffer_row, data_row, data_row_length);\n            data_row += data_row_length;\n            upload_buffer_row += upload_footprint.Footprint.RowPitch;\n          }\n        }\n        upload_buffer->Unmap(0, nullptr);\n        // Defer uploading and transition to the next draw.\n        // While the upload has not been yet completed, keep a reference to the\n        // resource because its lifetime is not tied to that of the\n        // ImmediateTexture (and thus to context's submissions) now.\n        PendingTextureUpload& pending_upload =\n            texture_uploads_pending_.emplace_back(resource.Get(),\n                                                  upload_buffer.Get());\n      } else {\n        XELOGE(\n            \"D3D12ImmediateDrawer: Failed to map an upload buffer for a {}x{} \"\n            \"texture\",\n            width, height);\n        upload_buffer.Reset();\n        resource.Reset();\n      }\n    } else {\n      XELOGE(\n          \"D3D12ImmediateDrawer: Failed to create an upload buffer for a {}x{} \"\n          \"texture\",\n          width, height);\n      resource.Reset();\n    }\n  } else {\n    XELOGE(\"D3D12ImmediateDrawer: Failed to create a {}x{} texture\", width,\n           height);\n  }\n\n  SamplerIndex sampler_index;\n  if (filter == ImmediateTextureFilter::kLinear) {\n    sampler_index =\n        is_repeated ? SamplerIndex::kLinearRepeat : SamplerIndex::kLinearClamp;\n  } else {\n    sampler_index = is_repeated ? SamplerIndex::kNearestRepeat\n                                : SamplerIndex::kNearestClamp;\n  }\n\n  // Manage by this immediate drawer if successfully created a resource.\n  std::unique_ptr<D3D12ImmediateTexture> texture =\n      std::make_unique<D3D12ImmediateTexture>(\n          width, height, resource.Get(), sampler_index,\n          resource ? this : nullptr, textures_.size());\n  if (resource) {\n    textures_.push_back(texture.get());\n  }\n  return std::move(texture);\n}\n\nvoid D3D12ImmediateDrawer::Begin(UIDrawContext& ui_draw_context,\n                                 float coordinate_space_width,\n                                 float coordinate_space_height) {\n  ImmediateDrawer::Begin(ui_draw_context, coordinate_space_width,\n                         coordinate_space_height);\n\n  assert_false(batch_open_);\n\n  const D3D12UIDrawContext& d3d12_ui_draw_context =\n      static_cast<const D3D12UIDrawContext&>(ui_draw_context);\n\n  // Update the submission index to be used throughout the current immediate\n  // drawer paint.\n  last_paint_submission_index_ =\n      d3d12_ui_draw_context.submission_index_current();\n  last_completed_submission_index_ =\n      d3d12_ui_draw_context.submission_index_completed();\n\n  // Release deleted textures.\n  for (auto it = textures_deleted_.begin(); it != textures_deleted_.end();) {\n    if (it->second > last_completed_submission_index_) {\n      ++it;\n      continue;\n    }\n    if (std::next(it) != textures_deleted_.end()) {\n      *it = textures_deleted_.back();\n    }\n    textures_deleted_.pop_back();\n  }\n\n  // Release upload buffers for completed texture uploads.\n  auto erase_uploads_end = texture_uploads_submitted_.begin();\n  while (erase_uploads_end != texture_uploads_submitted_.end()) {\n    if (erase_uploads_end->submission_index >\n        last_completed_submission_index_) {\n      break;\n    }\n    ++erase_uploads_end;\n  }\n  texture_uploads_submitted_.erase(texture_uploads_submitted_.begin(),\n                                   erase_uploads_end);\n\n  // Make sure textures created before the current frame are uploaded, even if\n  // nothing was drawn in the previous frames or nothing will be drawn in the\n  // current or subsequent ones, as that would result in upload buffers kept\n  // forever.\n  UploadTextures();\n\n  texture_descriptor_pool_->Reclaim(last_completed_submission_index_);\n  vertex_buffer_pool_->Reclaim(last_completed_submission_index_);\n\n  // Begin drawing.\n\n  ID3D12GraphicsCommandList* command_list =\n      d3d12_ui_draw_context.command_list();\n\n  D3D12_VIEWPORT viewport;\n  viewport.TopLeftX = 0.0f;\n  viewport.TopLeftY = 0.0f;\n  viewport.Width = float(d3d12_ui_draw_context.render_target_width());\n  viewport.Height = float(d3d12_ui_draw_context.render_target_height());\n  viewport.MinDepth = 0.0f;\n  viewport.MaxDepth = 1.0f;\n  command_list->RSSetViewports(1, &viewport);\n\n  command_list->SetGraphicsRootSignature(root_signature_.Get());\n  float coordinate_space_size_inv[2];\n  coordinate_space_size_inv[0] = 1.0f / coordinate_space_width;\n  coordinate_space_size_inv[1] = 1.0f / coordinate_space_height;\n  command_list->SetGraphicsRoot32BitConstants(\n      UINT(RootParameter::kCoordinateSpaceSizeInv), 2,\n      coordinate_space_size_inv, 0);\n\n  current_scissor_.left = 0;\n  current_scissor_.top = 0;\n  current_scissor_.right = 0;\n  current_scissor_.bottom = 0;\n\n  current_primitive_topology_ = D3D_PRIMITIVE_TOPOLOGY_UNDEFINED;\n  current_texture_ = nullptr;\n  current_texture_descriptor_heap_index_ =\n      D3D12DescriptorHeapPool::kHeapIndexInvalid;\n  current_sampler_index_ = SamplerIndex::kInvalid;\n}\n\nvoid D3D12ImmediateDrawer::BeginDrawBatch(const ImmediateDrawBatch& batch) {\n  assert_false(batch_open_);\n\n  const D3D12UIDrawContext& d3d12_ui_draw_context =\n      *static_cast<const D3D12UIDrawContext*>(ui_draw_context());\n\n  ID3D12GraphicsCommandList* command_list =\n      d3d12_ui_draw_context.command_list();\n\n  // Bind the vertices.\n  D3D12_VERTEX_BUFFER_VIEW vertex_buffer_view;\n  vertex_buffer_view.StrideInBytes = UINT(sizeof(ImmediateVertex));\n  vertex_buffer_view.SizeInBytes =\n      UINT(sizeof(ImmediateVertex)) * batch.vertex_count;\n  void* vertex_buffer_mapping = vertex_buffer_pool_->Request(\n      last_paint_submission_index_, vertex_buffer_view.SizeInBytes,\n      sizeof(float), nullptr, nullptr, &vertex_buffer_view.BufferLocation);\n  if (vertex_buffer_mapping == nullptr) {\n    XELOGE(\"D3D12ImmediateDrawer: Failed to get a buffer for {} vertices\",\n           batch.vertex_count);\n    return;\n  }\n  std::memcpy(vertex_buffer_mapping, batch.vertices,\n              vertex_buffer_view.SizeInBytes);\n  command_list->IASetVertexBuffers(0, 1, &vertex_buffer_view);\n\n  // Bind the indices.\n  batch_has_index_buffer_ = batch.indices != nullptr;\n  if (batch_has_index_buffer_) {\n    D3D12_INDEX_BUFFER_VIEW index_buffer_view;\n    index_buffer_view.SizeInBytes = UINT(sizeof(uint16_t)) * batch.index_count;\n    index_buffer_view.Format = DXGI_FORMAT_R16_UINT;\n    void* index_buffer_mapping = vertex_buffer_pool_->Request(\n        last_paint_submission_index_, index_buffer_view.SizeInBytes,\n        sizeof(uint16_t), nullptr, nullptr, &index_buffer_view.BufferLocation);\n    if (index_buffer_mapping == nullptr) {\n      XELOGE(\"D3D12ImmediateDrawer: Failed to get a buffer for {} indices\",\n             batch.index_count);\n      return;\n    }\n    std::memcpy(index_buffer_mapping, batch.indices,\n                index_buffer_view.SizeInBytes);\n    command_list->IASetIndexBuffer(&index_buffer_view);\n  }\n\n  batch_open_ = true;\n}\n\nvoid D3D12ImmediateDrawer::Draw(const ImmediateDraw& draw) {\n  if (!batch_open_) {\n    // Could be an error while obtaining the vertex and index buffers.\n    return;\n  }\n\n  const D3D12UIDrawContext& d3d12_ui_draw_context =\n      *static_cast<const D3D12UIDrawContext*>(ui_draw_context());\n  ID3D12GraphicsCommandList* command_list =\n      d3d12_ui_draw_context.command_list();\n\n  // Set the scissor rectangle.\n  uint32_t scissor_left, scissor_top, scissor_width, scissor_height;\n  if (!ScissorToRenderTarget(draw, scissor_left, scissor_top, scissor_width,\n                             scissor_height)) {\n    // Nothing is visible (zero area is used as the default current_scissor_\n    // value also).\n    return;\n  }\n  D3D12_RECT scissor;\n  scissor.left = LONG(scissor_left);\n  scissor.top = LONG(scissor_top);\n  scissor.right = LONG(scissor_left + scissor_width);\n  scissor.bottom = LONG(scissor_top + scissor_height);\n  if (current_scissor_.left != scissor.left ||\n      current_scissor_.top != scissor.top ||\n      current_scissor_.right != scissor.right ||\n      current_scissor_.bottom != scissor.bottom) {\n    current_scissor_ = scissor;\n    command_list->RSSetScissorRects(1, &scissor);\n  }\n\n  // Ensure texture data is available if any texture is loaded, upload all in a\n  // batch, then transition all at once.\n  UploadTextures();\n\n  // Bind the texture. If this is the first draw in a frame, the descriptor heap\n  // index will be invalid initially, and the texture will be bound regardless\n  // of what's in current_texture_.\n  auto texture = static_cast<D3D12ImmediateTexture*>(draw.texture);\n  ID3D12Resource* texture_resource = texture ? texture->resource() : nullptr;\n  bool bind_texture = current_texture_ != texture_resource;\n  uint32_t texture_descriptor_index;\n  uint64_t texture_heap_index = texture_descriptor_pool_->Request(\n      last_paint_submission_index_, current_texture_descriptor_heap_index_,\n      bind_texture ? 1 : 0, 1, texture_descriptor_index);\n  if (texture_heap_index == D3D12DescriptorHeapPool::kHeapIndexInvalid) {\n    return;\n  }\n  if (texture_resource) {\n    texture->SetLastUsageSubmissionIndex(last_paint_submission_index_);\n  }\n  if (current_texture_descriptor_heap_index_ != texture_heap_index) {\n    current_texture_descriptor_heap_index_ = texture_heap_index;\n    bind_texture = true;\n    ID3D12DescriptorHeap* descriptor_heaps[] = {\n        texture_descriptor_pool_->GetLastRequestHeap(), sampler_heap_.Get()};\n    command_list->SetDescriptorHeaps(2, descriptor_heaps);\n  }\n\n  if (bind_texture) {\n    current_texture_ = texture_resource;\n    D3D12_SHADER_RESOURCE_VIEW_DESC texture_view_desc;\n    texture_view_desc.Format = D3D12ImmediateTexture::kFormat;\n    texture_view_desc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D;\n    if (texture_resource) {\n      texture_view_desc.Shader4ComponentMapping =\n          D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;\n    } else {\n      // No texture, solid color.\n      texture_view_desc.Shader4ComponentMapping =\n          D3D12_ENCODE_SHADER_4_COMPONENT_MAPPING(\n              D3D12_SHADER_COMPONENT_MAPPING_FORCE_VALUE_1,\n              D3D12_SHADER_COMPONENT_MAPPING_FORCE_VALUE_1,\n              D3D12_SHADER_COMPONENT_MAPPING_FORCE_VALUE_1,\n              D3D12_SHADER_COMPONENT_MAPPING_FORCE_VALUE_1);\n    }\n    texture_view_desc.Texture2D.MostDetailedMip = 0;\n    texture_view_desc.Texture2D.MipLevels = 1;\n    texture_view_desc.Texture2D.PlaneSlice = 0;\n    texture_view_desc.Texture2D.ResourceMinLODClamp = 0.0f;\n    provider_.GetDevice()->CreateShaderResourceView(\n        texture_resource, &texture_view_desc,\n        provider_.OffsetViewDescriptor(\n            texture_descriptor_pool_->GetLastRequestHeapCPUStart(),\n            texture_descriptor_index));\n    command_list->SetGraphicsRootDescriptorTable(\n        UINT(RootParameter::kTexture),\n        provider_.OffsetViewDescriptor(\n            texture_descriptor_pool_->GetLastRequestHeapGPUStart(),\n            texture_descriptor_index));\n  }\n\n  // Bind the sampler. If the resource doesn't exist (solid color drawing), use\n  // nearest-neighbor and clamp so fetching is simpler.\n  SamplerIndex sampler_index =\n      texture_resource ? texture->sampler_index() : SamplerIndex::kNearestClamp;\n  if (current_sampler_index_ != sampler_index) {\n    current_sampler_index_ = sampler_index;\n    command_list->SetGraphicsRootDescriptorTable(\n        UINT(RootParameter::kSampler),\n        provider_.OffsetSamplerDescriptor(sampler_heap_gpu_start_,\n                                          uint32_t(sampler_index)));\n  }\n\n  // Set the primitive type and the pipeline for it.\n  D3D_PRIMITIVE_TOPOLOGY primitive_topology;\n  ID3D12PipelineState* pipeline;\n  switch (draw.primitive_type) {\n    case ImmediatePrimitiveType::kLines:\n      primitive_topology = D3D_PRIMITIVE_TOPOLOGY_LINELIST;\n      pipeline = pipeline_line_.Get();\n      break;\n    case ImmediatePrimitiveType::kTriangles:\n      primitive_topology = D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST;\n      pipeline = pipeline_triangle_.Get();\n      break;\n    default:\n      assert_unhandled_case(draw.primitive_type);\n      return;\n  }\n  if (current_primitive_topology_ != primitive_topology) {\n    current_primitive_topology_ = primitive_topology;\n    command_list->IASetPrimitiveTopology(primitive_topology);\n    command_list->SetPipelineState(pipeline);\n  }\n\n  // Draw.\n  if (batch_has_index_buffer_) {\n    command_list->DrawIndexedInstanced(draw.count, 1, draw.index_offset,\n                                       draw.base_vertex, 0);\n  } else {\n    command_list->DrawInstanced(draw.count, 1, draw.base_vertex, 0);\n  }\n}\n\nvoid D3D12ImmediateDrawer::EndDrawBatch() { batch_open_ = false; }\n\nvoid D3D12ImmediateDrawer::End() {\n  assert_false(batch_open_);\n\n  ImmediateDrawer::End();\n}\n\nvoid D3D12ImmediateDrawer::OnLeavePresenter() {\n  // Leaving the presenter's submission timeline - await GPU usage completion of\n  // all draws and texture uploads (which happen before draws) and reset\n  // submission indices.\n  D3D12Presenter& d3d12_presenter = *static_cast<D3D12Presenter*>(presenter());\n  d3d12_presenter.AwaitUISubmissionCompletionFromUIThread(\n      last_paint_submission_index_);\n\n  for (D3D12ImmediateTexture* texture : textures_) {\n    texture->SetLastUsageSubmissionIndex(0);\n  }\n\n  texture_uploads_submitted_.clear();\n\n  vertex_buffer_pool_->ChangeSubmissionTimeline();\n  texture_descriptor_pool_->ChangeSubmissionTimeline();\n\n  last_paint_submission_index_ = 0;\n  last_completed_submission_index_ = 0;\n}\n\nvoid D3D12ImmediateDrawer::OnImmediateTextureDestroyed(\n    D3D12ImmediateTexture& texture) {\n  // Remove from the texture list.\n  size_t texture_index = texture.immediate_drawer_index();\n  assert_true(texture_index != SIZE_MAX);\n  D3D12ImmediateTexture*& texture_at_index = textures_[texture_index];\n  texture_at_index = textures_.back();\n  texture_at_index->SetImmediateDrawerIndex(texture_index);\n  textures_.pop_back();\n\n  // Queue for delayed release.\n  ID3D12Resource* resource = texture.resource();\n  UINT64 last_usage_submission_index = texture.last_usage_submission_index();\n  if (resource &&\n      last_usage_submission_index > last_completed_submission_index_) {\n    textures_deleted_.emplace_back(resource, last_usage_submission_index);\n  }\n}\n\nvoid D3D12ImmediateDrawer::UploadTextures() {\n  if (texture_uploads_pending_.empty()) {\n    // Called often - don't initialize anything.\n    return;\n  }\n\n  ID3D12Device* device = provider_.GetDevice();\n  const D3D12UIDrawContext& d3d12_ui_draw_context =\n      *static_cast<const D3D12UIDrawContext*>(ui_draw_context());\n  ID3D12GraphicsCommandList* command_list =\n      d3d12_ui_draw_context.command_list();\n\n  // Copy all at once, then transition all at once (not interleaving copying and\n  // pipeline barriers).\n  std::vector<D3D12_RESOURCE_BARRIER> barriers;\n  barriers.reserve(texture_uploads_pending_.size());\n  for (const PendingTextureUpload& pending_upload : texture_uploads_pending_) {\n    ID3D12Resource* texture = pending_upload.texture.Get();\n\n    D3D12_RESOURCE_DESC texture_desc = texture->GetDesc();\n    D3D12_TEXTURE_COPY_LOCATION location_source, location_dest;\n    location_source.pResource = pending_upload.buffer.Get();\n    location_source.Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT;\n    device->GetCopyableFootprints(&texture_desc, 0, 1, 0,\n                                  &location_source.PlacedFootprint, nullptr,\n                                  nullptr, nullptr);\n    location_dest.pResource = texture;\n    location_dest.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX;\n    location_dest.SubresourceIndex = 0;\n    command_list->CopyTextureRegion(&location_dest, 0, 0, 0, &location_source,\n                                    nullptr);\n\n    D3D12_RESOURCE_BARRIER& barrier = barriers.emplace_back();\n    barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;\n    barrier.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE;\n    barrier.Transition.pResource = texture;\n    barrier.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES;\n    barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_COPY_DEST;\n    barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE;\n\n    texture_uploads_submitted_.emplace_back(\n        texture, pending_upload.buffer.Get(), last_paint_submission_index_);\n  }\n  texture_uploads_pending_.clear();\n  assert_false(barriers.empty());\n  command_list->ResourceBarrier(UINT(barriers.size()), barriers.data());\n}\n\n}  // namespace d3d12\n}  // namespace ui\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/ui/d3d12/d3d12_immediate_drawer.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_D3D12_D3D12_IMMEDIATE_DRAWER_H_\n#define XENIA_UI_D3D12_D3D12_IMMEDIATE_DRAWER_H_\n\n#include <deque>\n#include <memory>\n#include <utility>\n#include <vector>\n\n#include \"xenia/ui/d3d12/d3d12_api.h\"\n#include \"xenia/ui/d3d12/d3d12_descriptor_heap_pool.h\"\n#include \"xenia/ui/d3d12/d3d12_provider.h\"\n#include \"xenia/ui/d3d12/d3d12_upload_buffer_pool.h\"\n#include \"xenia/ui/immediate_drawer.h\"\n\nnamespace xe {\nnamespace ui {\nnamespace d3d12 {\n\nclass D3D12ImmediateDrawer final : public ImmediateDrawer {\n public:\n  static std::unique_ptr<D3D12ImmediateDrawer> Create(\n      const D3D12Provider& provider) {\n    auto immediate_drawer = std::unique_ptr<D3D12ImmediateDrawer>(\n        new D3D12ImmediateDrawer(provider));\n    if (!immediate_drawer->Initialize()) {\n      return nullptr;\n    }\n    return std::move(immediate_drawer);\n  }\n\n  ~D3D12ImmediateDrawer();\n\n  std::unique_ptr<ImmediateTexture> CreateTexture(uint32_t width,\n                                                  uint32_t height,\n                                                  ImmediateTextureFilter filter,\n                                                  bool is_repeated,\n                                                  const uint8_t* data) override;\n\n  void Begin(UIDrawContext& ui_draw_context, float coordinate_space_width,\n             float coordinate_space_height) override;\n  void BeginDrawBatch(const ImmediateDrawBatch& batch) override;\n  void Draw(const ImmediateDraw& draw) override;\n  void EndDrawBatch() override;\n  void End() override;\n\n protected:\n  void OnLeavePresenter() override;\n\n private:\n  enum class SamplerIndex {\n    kNearestClamp,\n    kLinearClamp,\n    kNearestRepeat,\n    kLinearRepeat,\n\n    kCount,\n    kInvalid = kCount\n  };\n\n  class D3D12ImmediateTexture final : public ImmediateTexture {\n   public:\n    static constexpr DXGI_FORMAT kFormat = DXGI_FORMAT_R8G8B8A8_UNORM;\n    D3D12ImmediateTexture(uint32_t width, uint32_t height,\n                          ID3D12Resource* resource, SamplerIndex sampler_index,\n                          D3D12ImmediateDrawer* immediate_drawer,\n                          size_t immediate_drawer_index);\n    ~D3D12ImmediateTexture() override;\n\n    ID3D12Resource* resource() const { return resource_.Get(); }\n    SamplerIndex sampler_index() const { return sampler_index_; }\n\n    size_t immediate_drawer_index() const { return immediate_drawer_index_; }\n    void SetImmediateDrawerIndex(size_t index) {\n      immediate_drawer_index_ = index;\n    }\n    void OnImmediateDrawerDestroyed();\n\n    UINT64 last_usage_submission_index() const {\n      return last_usage_submission_index_;\n    }\n    void SetLastUsageSubmissionIndex(UINT64 submission_index) {\n      last_usage_submission_index_ = submission_index;\n    }\n\n   private:\n    Microsoft::WRL::ComPtr<ID3D12Resource> resource_;\n    SamplerIndex sampler_index_;\n\n    D3D12ImmediateDrawer* immediate_drawer_;\n    size_t immediate_drawer_index_;\n\n    UINT64 last_usage_submission_index_ = 0;\n  };\n\n  D3D12ImmediateDrawer(const D3D12Provider& provider) : provider_(provider) {}\n  bool Initialize();\n\n  void OnImmediateTextureDestroyed(D3D12ImmediateTexture& texture);\n\n  void UploadTextures();\n\n  const D3D12Provider& provider_;\n\n  Microsoft::WRL::ComPtr<ID3D12RootSignature> root_signature_;\n  enum class RootParameter {\n    kTexture,\n    kSampler,\n    kCoordinateSpaceSizeInv,\n\n    kCount\n  };\n\n  Microsoft::WRL::ComPtr<ID3D12PipelineState> pipeline_triangle_;\n  Microsoft::WRL::ComPtr<ID3D12PipelineState> pipeline_line_;\n\n  Microsoft::WRL::ComPtr<ID3D12DescriptorHeap> sampler_heap_;\n  D3D12_CPU_DESCRIPTOR_HANDLE sampler_heap_cpu_start_;\n  D3D12_GPU_DESCRIPTOR_HANDLE sampler_heap_gpu_start_;\n\n  // Only with non-null resources.\n  std::vector<D3D12ImmediateTexture*> textures_;\n\n  struct PendingTextureUpload {\n    PendingTextureUpload(ID3D12Resource* texture, ID3D12Resource* buffer)\n        : texture(texture), buffer(buffer) {}\n    Microsoft::WRL::ComPtr<ID3D12Resource> texture;\n    Microsoft::WRL::ComPtr<ID3D12Resource> buffer;\n  };\n  std::vector<PendingTextureUpload> texture_uploads_pending_;\n\n  struct SubmittedTextureUpload {\n    SubmittedTextureUpload(ID3D12Resource* texture, ID3D12Resource* buffer,\n                           UINT64 submission_index)\n        : texture(texture),\n          buffer(buffer),\n          submission_index(submission_index) {}\n    Microsoft::WRL::ComPtr<ID3D12Resource> texture;\n    Microsoft::WRL::ComPtr<ID3D12Resource> buffer;\n    UINT64 submission_index;\n  };\n  std::deque<SubmittedTextureUpload> texture_uploads_submitted_;\n\n  std::deque<std::pair<Microsoft::WRL::ComPtr<ID3D12Resource>, UINT64>>\n      textures_deleted_;\n\n  std::unique_ptr<D3D12UploadBufferPool> vertex_buffer_pool_;\n  std::unique_ptr<D3D12DescriptorHeapPool> texture_descriptor_pool_;\n\n  // The submission index within the current Begin (or the last, if outside\n  // one).\n  UINT64 last_paint_submission_index_ = 0;\n  // Completed submission index as of the latest Begin, to coarsely skip delayed\n  // texture deletion.\n  UINT64 last_completed_submission_index_ = 0;\n\n  bool batch_open_ = false;\n  bool batch_has_index_buffer_;\n  D3D12_RECT current_scissor_;\n  D3D_PRIMITIVE_TOPOLOGY current_primitive_topology_;\n  ID3D12Resource* current_texture_;\n  uint64_t current_texture_descriptor_heap_index_;\n  SamplerIndex current_sampler_index_;\n};\n\n}  // namespace d3d12\n}  // namespace ui\n}  // namespace xe\n\n#endif  // XENIA_UI_D3D12_D3D12_IMMEDIATE_DRAWER_H_\n"
  },
  {
    "path": "src/xenia/ui/d3d12/d3d12_presenter.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/ui/d3d12/d3d12_presenter.h\"\n\n#include <algorithm>\n#include <climits>\n#include <cstdint>\n#include <memory>\n#include <utility>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/cvar.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/ui/d3d12/d3d12_provider.h\"\n#include \"xenia/ui/d3d12/d3d12_util.h\"\n#include \"xenia/ui/surface_win.h\"\n\nDEFINE_bool(\n    d3d12_allow_variable_refresh_rate_and_tearing, true,\n    \"In fullscreen, allow using variable refresh rate on displays supporting \"\n    \"it. On displays not supporting VRR, screen tearing may occur in certain \"\n    \"cases.\",\n    \"D3D12\");\n\nnamespace xe {\nnamespace ui {\nnamespace d3d12 {\n\n// Generated with `xb buildshaders`.\nnamespace shaders {\n#include \"xenia/ui/shaders/bytecode/d3d12_5_1/guest_output_bilinear_dither_ps.h\"\n#include \"xenia/ui/shaders/bytecode/d3d12_5_1/guest_output_bilinear_ps.h\"\n#include \"xenia/ui/shaders/bytecode/d3d12_5_1/guest_output_ffx_cas_resample_dither_ps.h\"\n#include \"xenia/ui/shaders/bytecode/d3d12_5_1/guest_output_ffx_cas_resample_ps.h\"\n#include \"xenia/ui/shaders/bytecode/d3d12_5_1/guest_output_ffx_cas_sharpen_dither_ps.h\"\n#include \"xenia/ui/shaders/bytecode/d3d12_5_1/guest_output_ffx_cas_sharpen_ps.h\"\n#include \"xenia/ui/shaders/bytecode/d3d12_5_1/guest_output_ffx_fsr_easu_ps.h\"\n#include \"xenia/ui/shaders/bytecode/d3d12_5_1/guest_output_ffx_fsr_rcas_dither_ps.h\"\n#include \"xenia/ui/shaders/bytecode/d3d12_5_1/guest_output_ffx_fsr_rcas_ps.h\"\n#include \"xenia/ui/shaders/bytecode/d3d12_5_1/guest_output_triangle_strip_rect_vs.h\"\n}  // namespace shaders\n\nD3D12Presenter::~D3D12Presenter() {\n  // Await completion of the usage of everything before destroying anything,\n  // irrespective of the declaration order in the class.\n  // From most likely the latest to most likely the earliest to be signaled, so\n  // just one sleep will likely be needed.\n  paint_context_.AwaitSwapChainUsageCompletion();\n  if (guest_output_resource_refresher_completion_timeline_) {\n    guest_output_resource_refresher_completion_timeline_->AwaitAllSubmissions();\n  }\n  if (ui_completion_timeline_) {\n    ui_completion_timeline_->AwaitAllSubmissions();\n  }\n}\n\nSurface::TypeFlags D3D12Presenter::GetSupportedSurfaceTypes() const {\n  Surface::TypeFlags types = 0;\n#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_GAMES)\n  types |= Surface::kTypeFlag_Win32Hwnd;\n#endif\n  return types;\n}\n\nbool D3D12Presenter::CaptureGuestOutput(RawImage& image_out) {\n  Microsoft::WRL::ComPtr<ID3D12Resource> guest_output_resource;\n  {\n    uint32_t guest_output_mailbox_index;\n    std::unique_lock<std::mutex> guest_output_consumer_lock(\n        ConsumeGuestOutput(guest_output_mailbox_index, nullptr, nullptr));\n    if (guest_output_mailbox_index != UINT32_MAX) {\n      guest_output_resource =\n          guest_output_resources_[guest_output_mailbox_index].second;\n    }\n    // Incremented the reference count of the guest output resource - safe to\n    // leave the consumer critical section now.\n  }\n  if (!guest_output_resource) {\n    return false;\n  }\n\n  ID3D12Device* device = provider_.GetDevice();\n\n  D3D12_RESOURCE_DESC texture_desc = guest_output_resource->GetDesc();\n  D3D12_TEXTURE_COPY_LOCATION copy_dest;\n  UINT64 copy_dest_size;\n  device->GetCopyableFootprints(&texture_desc, 0, 1, 0,\n                                &copy_dest.PlacedFootprint, nullptr, nullptr,\n                                &copy_dest_size);\n\n  D3D12_RESOURCE_DESC buffer_desc;\n  util::FillBufferResourceDesc(buffer_desc, copy_dest_size,\n                               D3D12_RESOURCE_FLAG_NONE);\n  Microsoft::WRL::ComPtr<ID3D12Resource> buffer;\n  // Create zeroed not to leak data in the row padding.\n  if (FAILED(device->CreateCommittedResource(\n          &util::kHeapPropertiesReadback, D3D12_HEAP_FLAG_NONE, &buffer_desc,\n          D3D12_RESOURCE_STATE_COPY_DEST, nullptr, IID_PPV_ARGS(&buffer)))) {\n    XELOGE(\"D3D12Presenter: Failed to create the guest output capture buffer\");\n    return false;\n  }\n\n  {\n    Microsoft::WRL::ComPtr<ID3D12CommandAllocator> command_allocator;\n    if (FAILED(\n            device->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT,\n                                           IID_PPV_ARGS(&command_allocator)))) {\n      XELOGE(\n          \"D3D12Presenter: Failed to create the guest output capturing command \"\n          \"allocator\");\n      return false;\n    }\n    Microsoft::WRL::ComPtr<ID3D12GraphicsCommandList> command_list;\n    if (FAILED(device->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT,\n                                         command_allocator.Get(), nullptr,\n                                         IID_PPV_ARGS(&command_list)))) {\n      XELOGE(\n          \"D3D12Presenter: Failed to create the guest output capturing command \"\n          \"list\");\n      return false;\n    }\n\n    D3D12_RESOURCE_BARRIER barrier;\n    barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;\n    barrier.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE;\n    barrier.Transition.pResource = guest_output_resource.Get();\n    barrier.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES;\n    barrier.Transition.StateBefore = kGuestOutputInternalState;\n    barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_COPY_SOURCE;\n    if constexpr (kGuestOutputInternalState !=\n                  D3D12_RESOURCE_STATE_COPY_SOURCE) {\n      command_list->ResourceBarrier(1, &barrier);\n    }\n    copy_dest.pResource = buffer.Get();\n    copy_dest.Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT;\n    D3D12_TEXTURE_COPY_LOCATION copy_source;\n    copy_source.pResource = guest_output_resource.Get();\n    copy_source.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX;\n    copy_source.SubresourceIndex = 0;\n    command_list->CopyTextureRegion(&copy_dest, 0, 0, 0, &copy_source, nullptr);\n    if constexpr (kGuestOutputInternalState !=\n                  D3D12_RESOURCE_STATE_COPY_SOURCE) {\n      std::swap(barrier.Transition.StateBefore, barrier.Transition.StateAfter);\n      command_list->ResourceBarrier(1, &barrier);\n    }\n    if (FAILED(command_list->Close())) {\n      XELOGE(\n          \"D3D12Presenter: Failed to close the guest output capturing command \"\n          \"list\");\n      return false;\n    }\n\n    Microsoft::WRL::ComPtr<ID3D12Fence> fence;\n    const HRESULT fence_create_result =\n        device->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&fence));\n    if (FAILED(fence_create_result)) {\n      XELOGE(\n          \"D3D12Presenter: Failed to create the guest output capturing fence, \"\n          \"result 0x{:08X}\",\n          fence_create_result);\n      return false;\n    }\n    ID3D12CommandQueue* const direct_queue = provider_.GetDirectQueue();\n    ID3D12CommandList* execute_command_list = command_list.Get();\n    direct_queue->ExecuteCommandLists(1, &execute_command_list);\n    const HRESULT fence_signal_result = direct_queue->Signal(fence.Get(), 1);\n    if (FAILED(fence_signal_result)) {\n      XELOGE(\n          \"D3D12Presenter: Failed to enqueue signaling of the guest output \"\n          \"capturing fence, result 0x{:08X}\",\n          fence_signal_result);\n      return false;\n    }\n    const HRESULT fence_wait_result = fence->SetEventOnCompletion(1, nullptr);\n    if (FAILED(fence_wait_result)) {\n      XELOGE(\n          \"D3D12Presenter: Failed to await the guest output capturing fence, \"\n          \"result 0x{:08X}\",\n          fence_wait_result);\n      return false;\n    }\n  }\n\n  D3D12_RANGE read_range;\n  read_range.Begin = copy_dest.PlacedFootprint.Offset;\n  read_range.End = copy_dest_size;\n  void* mapping;\n  if (FAILED(buffer->Map(0, &read_range, &mapping))) {\n    XELOGE(\"D3D12Presenter: Failed to map the guest output capture buffer\");\n    return false;\n  }\n  image_out.width = uint32_t(texture_desc.Width);\n  image_out.height = uint32_t(texture_desc.Height);\n  image_out.stride = sizeof(uint32_t) * image_out.width;\n  image_out.data.resize(image_out.stride * image_out.height);\n  uint32_t* image_out_pixels =\n      reinterpret_cast<uint32_t*>(image_out.data.data());\n  for (uint32_t y = 0; y < image_out.height; ++y) {\n    uint32_t* dest_row = &image_out_pixels[size_t(image_out.width) * y];\n    const uint32_t* source_row = reinterpret_cast<const uint32_t*>(\n        reinterpret_cast<const uint8_t*>(mapping) +\n        copy_dest.PlacedFootprint.Offset +\n        size_t(copy_dest.PlacedFootprint.Footprint.RowPitch) * y);\n    for (uint32_t x = 0; x < image_out.width; ++x) {\n      dest_row[x] = Packed10bpcRGBTo8bpcBytes(source_row[x]);\n    }\n  }\n  // Unmapping will be done implicitly when the resource goes out of scope and\n  // gets destroyed.\n  return true;\n}\n\nPresenter::SurfacePaintConnectResult\nD3D12Presenter::ConnectOrReconnectPaintingToSurfaceFromUIThread(\n    Surface& new_surface, uint32_t new_surface_width,\n    uint32_t new_surface_height, bool was_paintable,\n    bool& is_vsync_implicit_out) {\n  uint32_t new_swap_chain_width = std::min(\n      new_surface_width, uint32_t(D3D12_REQ_TEXTURE2D_U_OR_V_DIMENSION));\n  uint32_t new_swap_chain_height = std::min(\n      new_surface_height, uint32_t(D3D12_REQ_TEXTURE2D_U_OR_V_DIMENSION));\n\n  // ConnectOrReconnectPaintingToSurfaceFromUIThread may be called only for the\n  // surface of the current swap chain or when the old swap chain has already\n  // been destroyed, if the surface is the same, try resizing.\n  if (paint_context_.swap_chain) {\n    if (was_paintable &&\n        paint_context_.swap_chain_width == new_swap_chain_width &&\n        paint_context_.swap_chain_height == new_swap_chain_height) {\n      is_vsync_implicit_out = false;\n      return SurfacePaintConnectResult::kSuccessUnchanged;\n    }\n    paint_context_.AwaitSwapChainUsageCompletion();\n    // Using the current swap_chain_allows_tearing_ value that's consistent with\n    // the creation of the swap chain because ResizeBuffers can't toggle the\n    // tearing flag.\n    for (Microsoft::WRL::ComPtr<ID3D12Resource>& swap_chain_buffer_ref :\n         paint_context_.swap_chain_buffers) {\n      swap_chain_buffer_ref.Reset();\n    }\n    bool swap_chain_resized =\n        SUCCEEDED(paint_context_.swap_chain->ResizeBuffers(\n            0, UINT(new_swap_chain_width), UINT(new_swap_chain_height),\n            DXGI_FORMAT_UNKNOWN,\n            paint_context_.swap_chain_allows_tearing\n                ? DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING\n                : 0));\n    if (swap_chain_resized) {\n      for (uint32_t i = 0; i < PaintContext::kSwapChainBufferCount; ++i) {\n        if (FAILED(paint_context_.swap_chain->GetBuffer(\n                i, IID_PPV_ARGS(&paint_context_.swap_chain_buffers[i])))) {\n          swap_chain_resized = false;\n          break;\n        }\n      }\n      if (swap_chain_resized) {\n        paint_context_.swap_chain_width = new_swap_chain_width;\n        paint_context_.swap_chain_height = new_swap_chain_height;\n      }\n    }\n    if (!swap_chain_resized) {\n      XELOGE(\"D3D12Presenter: Failed to resize a swap chain\");\n      // Failed to resize, retry creating from scratch.\n      paint_context_.DestroySwapChain();\n    }\n  }\n\n  if (!paint_context_.swap_chain) {\n    // Create a new swap chain.\n    Surface::TypeIndex surface_type = new_surface.GetType();\n    DXGI_SWAP_CHAIN_DESC1 swap_chain_desc;\n    swap_chain_desc.Width = UINT(new_swap_chain_width);\n    swap_chain_desc.Height = UINT(new_swap_chain_height);\n    swap_chain_desc.Format = kSwapChainFormat;\n    swap_chain_desc.Stereo = FALSE;\n    swap_chain_desc.SampleDesc.Count = 1;\n    swap_chain_desc.SampleDesc.Quality = 0;\n    swap_chain_desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;\n    swap_chain_desc.BufferCount = UINT(PaintContext::kSwapChainBufferCount);\n    // DXGI_SCALING_STRETCH may cause the content to \"shake\" while resizing,\n    // with relayout done for the guest output twice visually rather than once,\n    // and the UI becoming stretched and then jumping to normal. If it's\n    // possible to cover the entire surface without stretching, don't stretch.\n    // After resizing, the presenter repaints as soon as possible anyway, so\n    swap_chain_desc.Scaling = (new_swap_chain_width == new_surface_width &&\n                               new_swap_chain_height == new_surface_height)\n                                  ? DXGI_SCALING_NONE\n                                  : DXGI_SCALING_STRETCH;\n    swap_chain_desc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD;\n    swap_chain_desc.AlphaMode = DXGI_ALPHA_MODE_IGNORE;\n    swap_chain_desc.Flags = 0;\n    if (cvars::d3d12_allow_variable_refresh_rate_and_tearing &&\n        dxgi_supports_tearing_) {\n      // Allow tearing in borderless fullscreen to support variable refresh\n      // rate.\n      swap_chain_desc.Flags |= DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING;\n    }\n    IDXGIFactory2* dxgi_factory = provider_.GetDXGIFactory();\n    ID3D12CommandQueue* direct_queue = provider_.GetDirectQueue();\n    Microsoft::WRL::ComPtr<IDXGISwapChain1> swap_chain_1;\n    switch (surface_type) {\n#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_GAMES)\n      case Surface::kTypeIndex_Win32Hwnd: {\n        HWND surface_hwnd =\n            static_cast<const Win32HwndSurface&>(new_surface).hwnd();\n        if (FAILED(dxgi_factory->CreateSwapChainForHwnd(\n                direct_queue, surface_hwnd, &swap_chain_desc, nullptr, nullptr,\n                &swap_chain_1))) {\n          XELOGE(\"D3D12Presenter: Failed to create a swap chain for the HWND\");\n          return SurfacePaintConnectResult::kFailure;\n        }\n        // Disable automatic Alt+Enter handling - DXGI fullscreen doesn't\n        // support ALLOW_TEARING, and using custom fullscreen in ui::Win32Window\n        // anyway as with Alt+Enter the menu is kept, state changes are tracked\n        // better, and nothing is presented for some reason.\n        dxgi_factory->MakeWindowAssociation(surface_hwnd,\n                                            DXGI_MWA_NO_ALT_ENTER);\n      } break;\n#endif\n      default:\n        assert_unhandled_case(surface_type);\n        XELOGE(\n            \"D3D12Presenter: Tried to create a swap chain for an unsupported \"\n            \"Xenia surface type\");\n        return SurfacePaintConnectResult::kFailureSurfaceUnusable;\n    }\n    if (FAILED(swap_chain_1->QueryInterface(\n            IID_PPV_ARGS(&paint_context_.swap_chain)))) {\n      XELOGE(\n          \"D3D12Presenter: Failed to get version 3 of the swap chain \"\n          \"interface\");\n      return SurfacePaintConnectResult::kFailure;\n    }\n    // From now on, in case of any failure, DestroySwapChain must be called\n    // before returning.\n    paint_context_.swap_chain_width = new_swap_chain_width;\n    paint_context_.swap_chain_height = new_swap_chain_height;\n    paint_context_.swap_chain_allows_tearing =\n        (swap_chain_desc.Flags & DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING) != 0;\n    for (uint32_t i = 0; i < PaintContext::kSwapChainBufferCount; ++i) {\n      if (FAILED(paint_context_.swap_chain->GetBuffer(\n              i, IID_PPV_ARGS(&paint_context_.swap_chain_buffers[i])))) {\n        XELOGE(\n            \"D3D12Presenter: Failed to get buffer {} of a {}-buffer swap chain\",\n            i, PaintContext::kSwapChainBufferCount);\n        paint_context_.DestroySwapChain();\n        return SurfacePaintConnectResult::kFailure;\n      }\n    }\n  }\n\n  ID3D12Device* device = provider_.GetDevice();\n\n  // Create the RTV descriptors.\n  D3D12_CPU_DESCRIPTOR_HANDLE rtv_heap_start =\n      paint_context_.rtv_heap->GetCPUDescriptorHandleForHeapStart();\n  D3D12_RENDER_TARGET_VIEW_DESC rtv_desc;\n  rtv_desc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2D;\n  rtv_desc.Texture2D.MipSlice = 0;\n  rtv_desc.Texture2D.PlaneSlice = 0;\n  for (uint32_t i = 0; i < PaintContext::kSwapChainBufferCount; ++i) {\n    ID3D12Resource* swap_chain_buffer =\n        paint_context_.swap_chain_buffers[i].Get();\n    rtv_desc.Format = kSwapChainFormat;\n    device->CreateRenderTargetView(\n        swap_chain_buffer, &rtv_desc,\n        provider_.OffsetRTVDescriptor(\n            rtv_heap_start, PaintContext::kRTVIndexSwapChainBuffer0 + i));\n  }\n\n  is_vsync_implicit_out = false;\n  return SurfacePaintConnectResult::kSuccess;\n}\n\nvoid D3D12Presenter::DisconnectPaintingFromSurfaceFromUIThreadImpl() {\n  paint_context_.DestroySwapChain();\n}\n\nbool D3D12Presenter::RefreshGuestOutputImpl(\n    uint32_t mailbox_index, uint32_t frontbuffer_width,\n    uint32_t frontbuffer_height,\n    std::function<bool(GuestOutputRefreshContext& context)> refresher,\n    bool& is_8bpc_out_ref) {\n  assert_not_zero(frontbuffer_width);\n  assert_not_zero(frontbuffer_height);\n  std::pair<uint64_t, Microsoft::WRL::ComPtr<ID3D12Resource>>&\n      guest_output_resource_ref = guest_output_resources_[mailbox_index];\n  if (guest_output_resource_ref.second) {\n    D3D12_RESOURCE_DESC guest_output_resource_current_desc =\n        guest_output_resource_ref.second->GetDesc();\n    if (guest_output_resource_current_desc.Width != frontbuffer_width ||\n        guest_output_resource_current_desc.Height != frontbuffer_height) {\n      // Main target painting has its own reference to the textures for reading\n      // in its own completion timeline, safe to release here.\n      guest_output_resource_refresher_completion_timeline_\n          ->AwaitSubmissionAndUpdateCompleted(guest_output_resource_ref.first);\n      guest_output_resource_ref.second.Reset();\n    }\n  }\n  if (!guest_output_resource_ref.second) {\n    ID3D12Device* device = provider_.GetDevice();\n    D3D12_RESOURCE_DESC guest_output_resource_new_desc;\n    guest_output_resource_new_desc.Dimension =\n        D3D12_RESOURCE_DIMENSION_TEXTURE2D;\n    guest_output_resource_new_desc.Alignment = 0;\n    guest_output_resource_new_desc.Width = frontbuffer_width;\n    guest_output_resource_new_desc.Height = frontbuffer_height;\n    guest_output_resource_new_desc.DepthOrArraySize = 1;\n    guest_output_resource_new_desc.MipLevels = 1;\n    guest_output_resource_new_desc.Format = kGuestOutputFormat;\n    guest_output_resource_new_desc.SampleDesc.Count = 1;\n    guest_output_resource_new_desc.SampleDesc.Quality = 0;\n    guest_output_resource_new_desc.Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN;\n    guest_output_resource_new_desc.Flags =\n        D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS;\n    if (FAILED(device->CreateCommittedResource(\n            &util::kHeapPropertiesDefault,\n            provider_.GetHeapFlagCreateNotZeroed(),\n            &guest_output_resource_new_desc, kGuestOutputInternalState, nullptr,\n            IID_PPV_ARGS(&guest_output_resource_ref.second)))) {\n      XELOGE(\"D3D12Presenter: Failed to create the guest output {}x{} texture\",\n             frontbuffer_width, frontbuffer_height);\n      return false;\n    }\n  }\n  D3D12GuestOutputRefreshContext context(\n      is_8bpc_out_ref, guest_output_resource_ref.second.Get());\n  bool refresher_succeeded = refresher(context);\n  // Even if the refresher has returned false, it still might have submitted\n  // some commands referencing the resource. It's better to put an excessive\n  // signal and wait slightly longer, for nothing important, while shutting down\n  // than to destroy the resource while it's still in use.\n  guest_output_resource_ref.first =\n      guest_output_resource_refresher_completion_timeline_\n          ->GetUpcomingSubmission();\n  guest_output_resource_refresher_completion_timeline_->SignalAndAdvance(\n      provider_.GetDirectQueue());\n  return refresher_succeeded;\n}\n\nvoid D3D12Presenter::PaintContext::DestroySwapChain() {\n  if (!swap_chain) {\n    return;\n  }\n  AwaitSwapChainUsageCompletion();\n  for (Microsoft::WRL::ComPtr<ID3D12Resource>& swap_chain_buffer_ref :\n       swap_chain_buffers) {\n    swap_chain_buffer_ref.Reset();\n  }\n  swap_chain.Reset();\n  swap_chain_allows_tearing = false;\n  swap_chain_height = 0;\n  swap_chain_width = 0;\n}\n\nPresenter::PaintResult D3D12Presenter::PaintAndPresentImpl(\n    bool execute_ui_drawers) {\n  // Begin the command list with the command allocator not currently potentially\n  // used on the GPU.\n  const uint64_t current_paint_submission =\n      paint_context_.paint_completion_timeline->GetUpcomingSubmission();\n  const uint64_t command_allocator_count =\n      UINT64(paint_context_.command_allocators.size());\n  paint_context_.paint_completion_timeline\n      ->AwaitMaxSubmissionsPendingAndUpdateCompleted(command_allocator_count);\n  ID3D12CommandAllocator* command_allocator =\n      paint_context_\n          .command_allocators[current_paint_submission %\n                              command_allocator_count]\n          .Get();\n  command_allocator->Reset();\n  ID3D12GraphicsCommandList* command_list = paint_context_.command_list.Get();\n  command_list->Reset(command_allocator, nullptr);\n\n  ID3D12Device* device = provider_.GetDevice();\n\n  // Obtain the RTV heap and the back buffer.\n  D3D12_CPU_DESCRIPTOR_HANDLE rtv_heap_start =\n      paint_context_.rtv_heap->GetCPUDescriptorHandleForHeapStart();\n  UINT back_buffer_index =\n      paint_context_.swap_chain->GetCurrentBackBufferIndex();\n  D3D12_CPU_DESCRIPTOR_HANDLE back_buffer_rtv = provider_.OffsetRTVDescriptor(\n      rtv_heap_start,\n      PaintContext::kRTVIndexSwapChainBuffer0 + back_buffer_index);\n  ID3D12Resource* back_buffer =\n      paint_context_.swap_chain_buffers[back_buffer_index].Get();\n  bool back_buffer_acquired = false;\n  bool back_buffer_bound = false;\n  bool back_buffer_clear_needed = true;\n  const float kBackBufferClearColor[] = {0.0f, 0.0f, 0.0f, 1.0f};\n\n  // Draw the guest output.\n\n  GuestOutputProperties guest_output_properties;\n  GuestOutputPaintConfig guest_output_paint_config;\n  Microsoft::WRL::ComPtr<ID3D12Resource> guest_output_resource;\n  {\n    uint32_t guest_output_mailbox_index;\n    std::unique_lock<std::mutex> guest_output_consumer_lock(\n        ConsumeGuestOutput(guest_output_mailbox_index, &guest_output_properties,\n                           &guest_output_paint_config));\n    if (guest_output_mailbox_index != UINT32_MAX) {\n      guest_output_resource =\n          guest_output_resources_[guest_output_mailbox_index].second;\n    }\n    // Incremented the reference count of the guest output resource - safe to\n    // leave the consumer critical section now as everything here either will be\n    // using the new reference or is exclusively owned by main target painting\n    // (and multiple threads can't paint the main target at the same time).\n  }\n\n  if (guest_output_resource) {\n    GuestOutputPaintFlow guest_output_flow = GetGuestOutputPaintFlow(\n        guest_output_properties, paint_context_.swap_chain_width,\n        paint_context_.swap_chain_height, D3D12_REQ_TEXTURE2D_U_OR_V_DIMENSION,\n        D3D12_REQ_TEXTURE2D_U_OR_V_DIMENSION, guest_output_paint_config);\n\n    // Check if all guest output paint effects are supported by the\n    // implementation.\n    if (guest_output_flow.effect_count) {\n      if (!guest_output_paint_final_pipelines_[size_t(\n              guest_output_flow.effects[guest_output_flow.effect_count - 1])]) {\n        guest_output_flow.effect_count = 0;\n      }\n      for (size_t i = 0; i + 1 < guest_output_flow.effect_count; ++i) {\n        if (!guest_output_paint_intermediate_pipelines_[size_t(\n                guest_output_flow.effects[i])]) {\n          guest_output_flow.effect_count = 0;\n          break;\n        }\n      }\n    }\n\n    if (guest_output_flow.effect_count) {\n      ID3D12DescriptorHeap* view_heap = paint_context_.view_heap.Get();\n      D3D12_CPU_DESCRIPTOR_HANDLE view_heap_cpu_start =\n          view_heap->GetCPUDescriptorHandleForHeapStart();\n\n      // Store the main target reference to the guest output texture so it's not\n      // destroyed while it's still potentially in use by main target painting\n      // queued on the GPU.\n      size_t guest_output_resource_paint_ref_index = SIZE_MAX;\n      size_t guest_output_resource_paint_ref_new_index = SIZE_MAX;\n      // Try to find the existing reference to the same texture, or an already\n      // released (or a taken, but never actually used) slot.\n      for (size_t i = 0;\n           i < paint_context_.guest_output_resource_paint_refs.size(); ++i) {\n        const std::pair<uint64_t, Microsoft::WRL::ComPtr<ID3D12Resource>>&\n            guest_output_resource_paint_ref =\n                paint_context_.guest_output_resource_paint_refs[i];\n        if (guest_output_resource_paint_ref.second == guest_output_resource) {\n          guest_output_resource_paint_ref_index = i;\n          break;\n        }\n        if (guest_output_resource_paint_ref_new_index == SIZE_MAX &&\n            (!guest_output_resource_paint_ref.second ||\n             !guest_output_resource_paint_ref.first)) {\n          guest_output_resource_paint_ref_new_index = i;\n        }\n      }\n      if (guest_output_resource_paint_ref_index == SIZE_MAX) {\n        // New texture - store the reference and create the descriptors.\n        if (guest_output_resource_paint_ref_new_index == SIZE_MAX) {\n          // Replace the earliest used reference.\n          guest_output_resource_paint_ref_new_index = 0;\n          for (size_t i = 1;\n               i < paint_context_.guest_output_resource_paint_refs.size();\n               ++i) {\n            if (paint_context_.guest_output_resource_paint_refs[i].first <\n                paint_context_\n                    .guest_output_resource_paint_refs\n                        [guest_output_resource_paint_ref_new_index]\n                    .first) {\n              guest_output_resource_paint_ref_new_index = i;\n            }\n          }\n          // Await the completion of the usage of the old guest output\n          // resource and its SRV descriptors.\n          paint_context_.paint_completion_timeline\n              ->AwaitSubmissionAndUpdateCompleted(\n                  paint_context_\n                      .guest_output_resource_paint_refs\n                          [guest_output_resource_paint_ref_new_index]\n                      .first);\n        }\n        guest_output_resource_paint_ref_index =\n            guest_output_resource_paint_ref_new_index;\n        // The actual submission index will be set if the texture is actually\n        // used, not dropped due to some error.\n        paint_context_.guest_output_resource_paint_refs\n            [guest_output_resource_paint_ref_index] =\n            std::make_pair(uint64_t(0), guest_output_resource);\n        // Create the SRV descriptor of the new texture.\n        D3D12_SHADER_RESOURCE_VIEW_DESC guest_output_resource_srv_desc;\n        guest_output_resource_srv_desc.Format = kGuestOutputFormat;\n        guest_output_resource_srv_desc.ViewDimension =\n            D3D12_SRV_DIMENSION_TEXTURE2D;\n        guest_output_resource_srv_desc.Shader4ComponentMapping =\n            D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;\n        guest_output_resource_srv_desc.Texture2D.MostDetailedMip = 0;\n        guest_output_resource_srv_desc.Texture2D.MipLevels = 1;\n        guest_output_resource_srv_desc.Texture2D.PlaneSlice = 0;\n        guest_output_resource_srv_desc.Texture2D.ResourceMinLODClamp = 0.0f;\n        device->CreateShaderResourceView(\n            guest_output_resource.Get(), &guest_output_resource_srv_desc,\n            provider_.OffsetViewDescriptor(\n                view_heap_cpu_start,\n                PaintContext::kViewIndexGuestOutput0Srv +\n                    uint32_t(guest_output_resource_paint_ref_index)));\n      }\n\n      // Make sure intermediate textures of the needed size are available, and\n      // unneeded intermediate textures are destroyed.\n      for (size_t i = 0; i < kMaxGuestOutputPaintEffects - 1; ++i) {\n        std::pair<uint32_t, uint32_t> intermediate_needed_size(0, 0);\n        if (i + 1 < guest_output_flow.effect_count) {\n          intermediate_needed_size = guest_output_flow.effect_output_sizes[i];\n        }\n        Microsoft::WRL::ComPtr<ID3D12Resource>& intermediate_texture_ptr_ref =\n            paint_context_.guest_output_intermediate_textures[i];\n        std::pair<uint32_t, uint32_t> intermediate_current_size(0, 0);\n        if (intermediate_texture_ptr_ref) {\n          D3D12_RESOURCE_DESC intermediate_current_desc =\n              intermediate_texture_ptr_ref->GetDesc();\n          intermediate_current_size.first =\n              uint32_t(intermediate_current_desc.Width);\n          intermediate_current_size.second = intermediate_current_desc.Height;\n        }\n        if (intermediate_current_size != intermediate_needed_size) {\n          if (intermediate_needed_size.first &&\n              intermediate_needed_size.second) {\n            // Need to replace immediately as a new texture with the requested\n            // size is needed.\n            if (intermediate_texture_ptr_ref) {\n              paint_context_.paint_completion_timeline\n                  ->AwaitSubmissionAndUpdateCompleted(\n                      paint_context_\n                          .guest_output_intermediate_texture_last_usage);\n              intermediate_texture_ptr_ref.Reset();\n            }\n            // Resource.\n            D3D12_RESOURCE_DESC intermediate_desc;\n            intermediate_desc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D;\n            intermediate_desc.Alignment = 0;\n            intermediate_desc.Width = intermediate_needed_size.first;\n            intermediate_desc.Height = intermediate_needed_size.second;\n            intermediate_desc.DepthOrArraySize = 1;\n            intermediate_desc.MipLevels = 1;\n            intermediate_desc.Format = kGuestOutputIntermediateFormat;\n            intermediate_desc.SampleDesc.Count = 1;\n            intermediate_desc.SampleDesc.Quality = 0;\n            intermediate_desc.Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN;\n            intermediate_desc.Flags = D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET;\n            if (FAILED(device->CreateCommittedResource(\n                    &util::kHeapPropertiesDefault,\n                    provider_.GetHeapFlagCreateNotZeroed(), &intermediate_desc,\n                    D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE, nullptr,\n                    IID_PPV_ARGS(&intermediate_texture_ptr_ref)))) {\n              XELOGE(\n                  \"D3D12Presenter: Failed to create a guest output \"\n                  \"presentation intermediate texture\");\n              // Don't display the guest output, and don't try to create more\n              // intermediate textures (only destroy them).\n              guest_output_flow.effect_count = 0;\n              continue;\n            }\n            ID3D12Resource* intermediate_texture =\n                intermediate_texture_ptr_ref.Get();\n            // SRV.\n            D3D12_SHADER_RESOURCE_VIEW_DESC intermediate_srv_desc;\n            intermediate_srv_desc.Format = kGuestOutputIntermediateFormat;\n            intermediate_srv_desc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D;\n            intermediate_srv_desc.Shader4ComponentMapping =\n                D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;\n            intermediate_srv_desc.Texture2D.MostDetailedMip = 0;\n            intermediate_srv_desc.Texture2D.MipLevels = 1;\n            intermediate_srv_desc.Texture2D.PlaneSlice = 0;\n            intermediate_srv_desc.Texture2D.ResourceMinLODClamp = 0.0f;\n            device->CreateShaderResourceView(\n                intermediate_texture, &intermediate_srv_desc,\n                provider_.OffsetViewDescriptor(\n                    view_heap_cpu_start,\n                    uint32_t(\n                        PaintContext::kViewIndexGuestOutputIntermediate0Srv +\n                        i)));\n            // RTV.\n            D3D12_RENDER_TARGET_VIEW_DESC intermediate_rtv_desc;\n            intermediate_rtv_desc.Format = kGuestOutputIntermediateFormat;\n            intermediate_rtv_desc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2D;\n            intermediate_rtv_desc.Texture2D.MipSlice = 0;\n            intermediate_rtv_desc.Texture2D.PlaneSlice = 0;\n            device->CreateRenderTargetView(\n                intermediate_texture, &intermediate_rtv_desc,\n                provider_.OffsetRTVDescriptor(\n                    rtv_heap_start,\n                    uint32_t(PaintContext::kRTVIndexGuestOutputIntermediate0 +\n                             i)));\n          } else {\n            // Was previously needed, but not anymore - destroy when possible.\n            if (intermediate_texture_ptr_ref &&\n                paint_context_.paint_completion_timeline\n                        ->GetCompletedSubmissionFromLastUpdate() >=\n                    paint_context_\n                        .guest_output_intermediate_texture_last_usage) {\n              intermediate_texture_ptr_ref.Reset();\n            }\n          }\n        }\n      }\n\n      if (guest_output_flow.effect_count) {\n        paint_context_\n            .guest_output_resource_paint_refs\n                [guest_output_resource_paint_ref_index]\n            .first = current_paint_submission;\n        if (guest_output_flow.effect_count > 1) {\n          paint_context_.guest_output_intermediate_texture_last_usage =\n              current_paint_submission;\n        }\n\n        command_list->SetDescriptorHeaps(1, &view_heap);\n      }\n\n      // This effect loop must not be aborted so the states of the resources\n      // involved are consistent.\n      D3D12_GPU_DESCRIPTOR_HANDLE view_heap_gpu_start =\n          view_heap->GetGPUDescriptorHandleForHeapStart();\n      for (size_t i = 0; i < guest_output_flow.effect_count; ++i) {\n        bool is_final_effect = i + 1 >= guest_output_flow.effect_count;\n\n        GuestOutputPaintEffect effect = guest_output_flow.effects[i];\n\n        ID3D12Resource* effect_dest_resource;\n        int32_t effect_rect_x, effect_rect_y;\n        if (is_final_effect) {\n          effect_dest_resource = back_buffer;\n          if (!back_buffer_acquired) {\n            D3D12_RESOURCE_BARRIER barrier_present_to_rtv;\n            barrier_present_to_rtv.Type =\n                D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;\n            barrier_present_to_rtv.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE;\n            barrier_present_to_rtv.Transition.pResource = back_buffer;\n            barrier_present_to_rtv.Transition.Subresource =\n                D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES;\n            barrier_present_to_rtv.Transition.StateBefore =\n                D3D12_RESOURCE_STATE_PRESENT;\n            barrier_present_to_rtv.Transition.StateAfter =\n                D3D12_RESOURCE_STATE_RENDER_TARGET;\n            command_list->ResourceBarrier(1, &barrier_present_to_rtv);\n            back_buffer_acquired = true;\n          }\n          effect_rect_x = guest_output_flow.output_x;\n          effect_rect_y = guest_output_flow.output_y;\n        } else {\n          effect_dest_resource =\n              paint_context_.guest_output_intermediate_textures[i].Get();\n          if (!i) {\n            // If this is not the first effect, the transition has been done at\n            // the end of the previous effect in a single command.\n            D3D12_RESOURCE_BARRIER barrier_srv_to_rtv;\n            barrier_srv_to_rtv.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;\n            barrier_srv_to_rtv.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE;\n            barrier_srv_to_rtv.Transition.pResource = effect_dest_resource;\n            barrier_srv_to_rtv.Transition.Subresource =\n                D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES;\n            barrier_srv_to_rtv.Transition.StateBefore =\n                D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE;\n            barrier_srv_to_rtv.Transition.StateAfter =\n                D3D12_RESOURCE_STATE_RENDER_TARGET;\n            command_list->ResourceBarrier(1, &barrier_srv_to_rtv);\n          }\n          command_list->DiscardResource(effect_dest_resource, nullptr);\n          effect_rect_x = 0;\n          effect_rect_y = 0;\n        }\n\n        if (is_final_effect) {\n          if (!back_buffer_bound) {\n            command_list->OMSetRenderTargets(1, &back_buffer_rtv, TRUE,\n                                             nullptr);\n            back_buffer_bound = true;\n          }\n        } else {\n          D3D12_CPU_DESCRIPTOR_HANDLE intermediate_rtv =\n              provider_.OffsetRTVDescriptor(\n                  rtv_heap_start,\n                  uint32_t(PaintContext::kRTVIndexGuestOutputIntermediate0 +\n                           i));\n          command_list->OMSetRenderTargets(1, &intermediate_rtv, TRUE, nullptr);\n          back_buffer_bound = false;\n        }\n        if (is_final_effect) {\n          back_buffer_bound = true;\n        }\n        D3D12_RESOURCE_DESC effect_dest_resource_desc =\n            effect_dest_resource->GetDesc();\n        D3D12_VIEWPORT viewport;\n        viewport.TopLeftX = 0.0f;\n        viewport.TopLeftY = 0.0f;\n        viewport.Width = float(effect_dest_resource_desc.Width);\n        viewport.Height = float(effect_dest_resource_desc.Height);\n        viewport.MinDepth = 0.0f;\n        viewport.MaxDepth = 1.0f;\n        command_list->RSSetViewports(1, &viewport);\n        D3D12_RECT scissor;\n        scissor.left = 0;\n        scissor.top = 0;\n        scissor.right = LONG(effect_dest_resource_desc.Width);\n        scissor.bottom = LONG(effect_dest_resource_desc.Height);\n        command_list->RSSetScissorRects(1, &scissor);\n\n        command_list->SetPipelineState(\n            is_final_effect\n                ? guest_output_paint_final_pipelines_[size_t(effect)].Get()\n                : guest_output_paint_intermediate_pipelines_[size_t(effect)]\n                      .Get());\n        GuestOutputPaintRootSignatureIndex\n            guest_output_paint_root_signature_index =\n                GetGuestOutputPaintRootSignatureIndex(effect);\n        command_list->SetGraphicsRootSignature(\n            guest_output_paint_root_signatures_\n                [size_t(guest_output_paint_root_signature_index)]\n                    .Get());\n\n        UINT effect_src_view_index = UINT(\n            i ? (PaintContext::kViewIndexGuestOutputIntermediate0Srv + (i - 1))\n              : (PaintContext::kViewIndexGuestOutput0Srv +\n                 guest_output_resource_paint_ref_index));\n        command_list->SetGraphicsRootDescriptorTable(\n            UINT(GuestOutputPaintRootParameter::kSource),\n            provider_.OffsetViewDescriptor(view_heap_gpu_start,\n                                           effect_src_view_index));\n\n        GuestOutputPaintRectangleConstants effect_rect_constants;\n        float effect_x_to_ndc = 2.0f / viewport.Width;\n        float effect_y_to_ndc = 2.0f / viewport.Height;\n        effect_rect_constants.x =\n            -1.0f + float(effect_rect_x) * effect_x_to_ndc;\n        // +Y is -V.\n        effect_rect_constants.y = 1.0f - float(effect_rect_y) * effect_y_to_ndc;\n        effect_rect_constants.width =\n            float(guest_output_flow.effect_output_sizes[i].first) *\n            effect_x_to_ndc;\n        effect_rect_constants.height =\n            -float(guest_output_flow.effect_output_sizes[i].second) *\n            effect_y_to_ndc;\n        command_list->SetGraphicsRoot32BitConstants(\n            UINT(GuestOutputPaintRootParameter::kRectangle),\n            sizeof(effect_rect_constants) / sizeof(uint32_t),\n            &effect_rect_constants, 0);\n\n        UINT effect_constants_size = 0;\n        union {\n          BilinearConstants bilinear;\n          CasSharpenConstants cas_sharpen;\n          CasResampleConstants cas_resample;\n          FsrEasuConstants fsr_easu;\n          FsrRcasConstants fsr_rcas;\n        } effect_constants;\n        switch (guest_output_paint_root_signature_index) {\n          case kGuestOutputPaintRootSignatureIndexBilinear: {\n            effect_constants_size = sizeof(effect_constants.bilinear);\n            effect_constants.bilinear.Initialize(guest_output_flow, i);\n          } break;\n          case kGuestOutputPaintRootSignatureIndexCasSharpen: {\n            effect_constants_size = sizeof(effect_constants.cas_sharpen);\n            effect_constants.cas_sharpen.Initialize(guest_output_flow, i,\n                                                    guest_output_paint_config);\n          } break;\n          case kGuestOutputPaintRootSignatureIndexCasResample: {\n            effect_constants_size = sizeof(effect_constants.cas_resample);\n            effect_constants.cas_resample.Initialize(guest_output_flow, i,\n                                                     guest_output_paint_config);\n          } break;\n          case kGuestOutputPaintRootSignatureIndexFsrEasu: {\n            effect_constants_size = sizeof(effect_constants.fsr_easu);\n            effect_constants.fsr_easu.Initialize(guest_output_flow, i);\n          } break;\n          case kGuestOutputPaintRootSignatureIndexFsrRcas: {\n            effect_constants_size = sizeof(effect_constants.fsr_rcas);\n            effect_constants.fsr_rcas.Initialize(guest_output_flow, i,\n                                                 guest_output_paint_config);\n          } break;\n          default:\n            break;\n        }\n        if (effect_constants_size) {\n          command_list->SetGraphicsRoot32BitConstants(\n              UINT(GuestOutputPaintRootParameter::kEffectConstants),\n              effect_constants_size / sizeof(uint32_t), &effect_constants, 0);\n        }\n\n        command_list->IASetPrimitiveTopology(\n            D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);\n        command_list->DrawInstanced(4, 1, 0, 0);\n\n        if (is_final_effect) {\n          // Clear the letterbox around the guest output if the guest output\n          // doesn't cover the entire back buffer.\n          if (guest_output_flow.letterbox_clear_rectangle_count) {\n            D3D12_RECT letterbox_clear_d3d12_rectangles\n                [GuestOutputPaintFlow::kMaxClearRectangles];\n            for (size_t i = 0;\n                 i < guest_output_flow.letterbox_clear_rectangle_count; ++i) {\n              D3D12_RECT& letterbox_clear_d3d12_rectangle =\n                  letterbox_clear_d3d12_rectangles[i];\n              const GuestOutputPaintFlow::ClearRectangle&\n                  letterbox_clear_rectangle =\n                      guest_output_flow.letterbox_clear_rectangles[i];\n              letterbox_clear_d3d12_rectangle.left =\n                  LONG(letterbox_clear_rectangle.x);\n              letterbox_clear_d3d12_rectangle.top =\n                  LONG(letterbox_clear_rectangle.y);\n              letterbox_clear_d3d12_rectangle.right =\n                  LONG(letterbox_clear_rectangle.x +\n                       letterbox_clear_rectangle.width);\n              letterbox_clear_d3d12_rectangle.bottom =\n                  LONG(letterbox_clear_rectangle.y +\n                       letterbox_clear_rectangle.height);\n            }\n            command_list->ClearRenderTargetView(\n                back_buffer_rtv, kBackBufferClearColor,\n                UINT(guest_output_flow.letterbox_clear_rectangle_count),\n                letterbox_clear_d3d12_rectangles);\n          }\n          back_buffer_clear_needed = false;\n        } else {\n          D3D12_RESOURCE_BARRIER barriers[2];\n          UINT barrier_count = 0;\n          // Transition the newly written intermediate image to SRV for use as\n          // the source in the next effect.\n          {\n            assert_true(barrier_count < xe::countof(barriers));\n            D3D12_RESOURCE_BARRIER& barrier_rtv_to_srv =\n                barriers[barrier_count++];\n            barrier_rtv_to_srv.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;\n            barrier_rtv_to_srv.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE;\n            barrier_rtv_to_srv.Transition.pResource = effect_dest_resource;\n            barrier_rtv_to_srv.Transition.Subresource =\n                D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES;\n            barrier_rtv_to_srv.Transition.StateBefore =\n                D3D12_RESOURCE_STATE_RENDER_TARGET;\n            barrier_rtv_to_srv.Transition.StateAfter =\n                D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE;\n          }\n          // Merge the current destination > next source transition with the\n          // acquisition of the destination for the next effect.\n          if (i + 2 < guest_output_flow.effect_count) {\n            // The next effect won't be the last - transition the next\n            // intermediate destination to RTV.\n            assert_true(barrier_count < xe::countof(barriers));\n            D3D12_RESOURCE_BARRIER& barrier_srv_to_rtv =\n                barriers[barrier_count++];\n            barrier_srv_to_rtv.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;\n            barrier_srv_to_rtv.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE;\n            barrier_srv_to_rtv.Transition.pResource =\n                paint_context_.guest_output_intermediate_textures[i + 1].Get();\n            barrier_srv_to_rtv.Transition.Subresource =\n                D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES;\n            barrier_srv_to_rtv.Transition.StateBefore =\n                D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE;\n            barrier_srv_to_rtv.Transition.StateAfter =\n                D3D12_RESOURCE_STATE_RENDER_TARGET;\n          } else {\n            // The next effect draws to the back buffer - merge into one\n            // ResourceBarrier command.\n            if (!back_buffer_acquired) {\n              assert_true(barrier_count < xe::countof(barriers));\n              D3D12_RESOURCE_BARRIER& barrier_present_to_rtv =\n                  barriers[barrier_count++];\n              barrier_present_to_rtv.Type =\n                  D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;\n              barrier_present_to_rtv.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE;\n              barrier_present_to_rtv.Transition.pResource = back_buffer;\n              barrier_present_to_rtv.Transition.Subresource =\n                  D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES;\n              barrier_present_to_rtv.Transition.StateBefore =\n                  D3D12_RESOURCE_STATE_PRESENT;\n              barrier_present_to_rtv.Transition.StateAfter =\n                  D3D12_RESOURCE_STATE_RENDER_TARGET;\n              back_buffer_acquired = true;\n            }\n          }\n          if (barrier_count) {\n            command_list->ResourceBarrier(barrier_count, barriers);\n          }\n        }\n      }\n    }\n  }\n\n  // Release main target guest output texture references that aren't needed\n  // anymore (this is done after various potential guest-output-related main\n  // target completion timeline waits so the completed submission value is the\n  // most actual).\n  uint64_t completed_paint_submission =\n      paint_context_.paint_completion_timeline\n          ->GetCompletedSubmissionFromLastUpdate();\n  for (std::pair<uint64_t, Microsoft::WRL::ComPtr<ID3D12Resource>>&\n           guest_output_resource_paint_ref :\n       paint_context_.guest_output_resource_paint_refs) {\n    if (!guest_output_resource_paint_ref.second ||\n        guest_output_resource_paint_ref.second == guest_output_resource) {\n      continue;\n    }\n    if (completed_paint_submission >= guest_output_resource_paint_ref.first) {\n      guest_output_resource_paint_ref.second.Reset();\n    }\n  }\n\n  // If no guest output has been drawn, the transitioned of the back buffer to\n  // RTV hasn't been done yet, and it's needed to clear it, and optionally to\n  // draw the UI.\n  if (!back_buffer_acquired) {\n    D3D12_RESOURCE_BARRIER barrier_present_to_rtv;\n    barrier_present_to_rtv.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;\n    barrier_present_to_rtv.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE;\n    barrier_present_to_rtv.Transition.pResource = back_buffer;\n    barrier_present_to_rtv.Transition.Subresource =\n        D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES;\n    barrier_present_to_rtv.Transition.StateBefore =\n        D3D12_RESOURCE_STATE_PRESENT;\n    barrier_present_to_rtv.Transition.StateAfter =\n        D3D12_RESOURCE_STATE_RENDER_TARGET;\n    command_list->ResourceBarrier(1, &barrier_present_to_rtv);\n    back_buffer_acquired = true;\n  }\n\n  if (back_buffer_clear_needed) {\n    command_list->ClearRenderTargetView(back_buffer_rtv, kBackBufferClearColor,\n                                        0, nullptr);\n    back_buffer_clear_needed = false;\n  }\n\n  if (execute_ui_drawers) {\n    // Draw the UI.\n    if (!back_buffer_bound) {\n      command_list->OMSetRenderTargets(1, &back_buffer_rtv, TRUE, nullptr);\n      back_buffer_bound = true;\n    }\n    D3D12UIDrawContext ui_draw_context(\n        *this, paint_context_.swap_chain_width,\n        paint_context_.swap_chain_height, command_list,\n        ui_completion_timeline_->GetUpcomingSubmission(),\n        ui_completion_timeline_->UpdateAndGetCompletedSubmission());\n    ExecuteUIDrawersFromUIThread(ui_draw_context);\n  }\n\n  // End drawing to the back buffer.\n  D3D12_RESOURCE_BARRIER barrier_rtv_to_present;\n  barrier_rtv_to_present.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;\n  barrier_rtv_to_present.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE;\n  barrier_rtv_to_present.Transition.pResource = back_buffer;\n  barrier_rtv_to_present.Transition.Subresource =\n      D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES;\n  barrier_rtv_to_present.Transition.StateBefore =\n      D3D12_RESOURCE_STATE_RENDER_TARGET;\n  barrier_rtv_to_present.Transition.StateAfter = D3D12_RESOURCE_STATE_PRESENT;\n  command_list->ResourceBarrier(1, &barrier_rtv_to_present);\n\n  // Execute and present.\n  // TODO(Triang3l): Error checking.\n  command_list->Close();\n  ID3D12CommandQueue* const direct_queue = provider_.GetDirectQueue();\n  ID3D12CommandList* execute_command_list = command_list;\n  direct_queue->ExecuteCommandLists(1, &execute_command_list);\n  if (execute_ui_drawers) {\n    ui_completion_timeline_->SignalAndAdvance(direct_queue);\n  }\n  paint_context_.paint_completion_timeline->SignalAndAdvance(direct_queue);\n  // Present as soon as possible, without waiting for vsync (the host refresh\n  // rate may be something like 144 Hz, which is not a multiple of the common\n  // 30 Hz or 60 Hz guest refresh rate), and allowing dropping outdated queued\n  // frames for lower latency. Also, if possible, allowing tearing to use\n  // variable refresh rate in borderless fullscreen (note that if DXGI\n  // fullscreen is ever used in, the allow tearing flag must not be passed in\n  // fullscreen, but DXGI fullscreen is largely unneeded with the flip\n  // presentation model used in Direct3D 12).\n  HRESULT present_result = paint_context_.swap_chain->Present(\n      0, DXGI_PRESENT_RESTART | (paint_context_.swap_chain_allows_tearing\n                                     ? DXGI_PRESENT_ALLOW_TEARING\n                                     : 0));\n  // Even if presentation has failed, work might have been enqueued anyway\n  // internally before the failure according to Jesse Natalie from the DirectX\n  // Discord server.\n  paint_context_.present_completion_timeline->SignalAndAdvance(direct_queue);\n  switch (present_result) {\n    case DXGI_ERROR_DEVICE_REMOVED:\n      return PaintResult::kGpuLostExternally;\n    case DXGI_ERROR_DEVICE_RESET:\n      return PaintResult::kGpuLostResponsible;\n    default:\n      return SUCCEEDED(present_result) ? PaintResult::kPresented\n                                       : PaintResult::kNotPresented;\n  }\n}\n\nbool D3D12Presenter::InitializeSurfaceIndependent() {\n  // Check if DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING is supported.\n  {\n    Microsoft::WRL::ComPtr<IDXGIFactory5> dxgi_factory_5;\n    if (SUCCEEDED(provider_.GetDXGIFactory()->QueryInterface(\n            IID_PPV_ARGS(&dxgi_factory_5)))) {\n      BOOL tearing_feature_data;\n      dxgi_supports_tearing_ =\n          SUCCEEDED(dxgi_factory_5->CheckFeatureSupport(\n              DXGI_FEATURE_PRESENT_ALLOW_TEARING, &tearing_feature_data,\n              sizeof(tearing_feature_data))) &&\n          tearing_feature_data;\n    }\n  }\n\n  ID3D12Device* device = provider_.GetDevice();\n\n  // Initialize static guest output painting objects.\n\n  // Guest output painting root signatures.\n  // One (texture) for bilinear, two (texture and constants) for AMD FidelityFX\n  // CAS and FSR.\n  D3D12_ROOT_PARAMETER guest_output_paint_root_parameters[UINT(\n      GuestOutputPaintRootParameter::kCount)];\n  // Source texture.\n  D3D12_DESCRIPTOR_RANGE guest_output_paint_root_descriptor_range_source;\n  guest_output_paint_root_descriptor_range_source.RangeType =\n      D3D12_DESCRIPTOR_RANGE_TYPE_SRV;\n  guest_output_paint_root_descriptor_range_source.NumDescriptors = 1;\n  guest_output_paint_root_descriptor_range_source.BaseShaderRegister = 0;\n  guest_output_paint_root_descriptor_range_source.RegisterSpace = 0;\n  guest_output_paint_root_descriptor_range_source\n      .OffsetInDescriptorsFromTableStart = 0;\n  {\n    D3D12_ROOT_PARAMETER& guest_output_paint_root_parameter_source =\n        guest_output_paint_root_parameters[UINT(\n            GuestOutputPaintRootParameter::kSource)];\n    guest_output_paint_root_parameter_source.ParameterType =\n        D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;\n    guest_output_paint_root_parameter_source.DescriptorTable\n        .NumDescriptorRanges = 1;\n    guest_output_paint_root_parameter_source.DescriptorTable.pDescriptorRanges =\n        &guest_output_paint_root_descriptor_range_source;\n    guest_output_paint_root_parameter_source.ShaderVisibility =\n        D3D12_SHADER_VISIBILITY_PIXEL;\n  }\n  // Rectangle.\n  {\n    D3D12_ROOT_PARAMETER& guest_output_paint_root_parameter_rect =\n        guest_output_paint_root_parameters[UINT(\n            GuestOutputPaintRootParameter::kRectangle)];\n    guest_output_paint_root_parameter_rect.ParameterType =\n        D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS;\n    guest_output_paint_root_parameter_rect.Constants.ShaderRegister = 0;\n    guest_output_paint_root_parameter_rect.Constants.RegisterSpace = 0;\n    guest_output_paint_root_parameter_rect.Constants.Num32BitValues =\n        sizeof(GuestOutputPaintRectangleConstants) / sizeof(uint32_t);\n    guest_output_paint_root_parameter_rect.ShaderVisibility =\n        D3D12_SHADER_VISIBILITY_VERTEX;\n  }\n  // Pixel shader constants.\n  D3D12_ROOT_PARAMETER& guest_output_paint_root_parameter_effect_constants =\n      guest_output_paint_root_parameters[UINT(\n          GuestOutputPaintRootParameter::kEffectConstants)];\n  guest_output_paint_root_parameter_effect_constants.ParameterType =\n      D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS;\n  guest_output_paint_root_parameter_effect_constants.Constants.ShaderRegister =\n      0;\n  guest_output_paint_root_parameter_effect_constants.Constants.RegisterSpace =\n      0;\n  guest_output_paint_root_parameter_effect_constants.ShaderVisibility =\n      D3D12_SHADER_VISIBILITY_PIXEL;\n  // Bilinear sampler.\n  D3D12_STATIC_SAMPLER_DESC guest_output_paint_root_sampler;\n  guest_output_paint_root_sampler.Filter = D3D12_FILTER_MIN_MAG_MIP_LINEAR;\n  guest_output_paint_root_sampler.AddressU = D3D12_TEXTURE_ADDRESS_MODE_CLAMP;\n  guest_output_paint_root_sampler.AddressV = D3D12_TEXTURE_ADDRESS_MODE_CLAMP;\n  guest_output_paint_root_sampler.AddressW = D3D12_TEXTURE_ADDRESS_MODE_CLAMP;\n  guest_output_paint_root_sampler.MipLODBias = 0.0f;\n  guest_output_paint_root_sampler.MaxAnisotropy = 1;\n  guest_output_paint_root_sampler.ComparisonFunc = D3D12_COMPARISON_FUNC_NEVER;\n  guest_output_paint_root_sampler.BorderColor =\n      D3D12_STATIC_BORDER_COLOR_OPAQUE_BLACK;\n  guest_output_paint_root_sampler.MinLOD = 0.0f;\n  guest_output_paint_root_sampler.MaxLOD = 0.0f;\n  guest_output_paint_root_sampler.ShaderRegister = 0;\n  guest_output_paint_root_sampler.RegisterSpace = 0;\n  guest_output_paint_root_sampler.ShaderVisibility =\n      D3D12_SHADER_VISIBILITY_PIXEL;\n  D3D12_ROOT_SIGNATURE_DESC guest_output_paint_root_signature_desc;\n  guest_output_paint_root_signature_desc.NumParameters =\n      UINT(GuestOutputPaintRootParameter::kCount);\n  guest_output_paint_root_signature_desc.pParameters =\n      guest_output_paint_root_parameters;\n  guest_output_paint_root_signature_desc.NumStaticSamplers = 1;\n  guest_output_paint_root_signature_desc.pStaticSamplers =\n      &guest_output_paint_root_sampler;\n  guest_output_paint_root_signature_desc.Flags = D3D12_ROOT_SIGNATURE_FLAG_NONE;\n  // Bilinear filtering (needs the sampler).\n  guest_output_paint_root_parameter_effect_constants.Constants.Num32BitValues =\n      sizeof(BilinearConstants) / sizeof(uint32_t);\n  {\n    ID3D12RootSignature* guest_output_paint_root_signature =\n        util::CreateRootSignature(provider_,\n                                  guest_output_paint_root_signature_desc);\n    if (!guest_output_paint_root_signature) {\n      XELOGE(\n          \"D3D12Presenter: Failed to create the guest output bilinear \"\n          \"filtering presentation root signature\");\n      return false;\n    }\n    *(guest_output_paint_root_signatures_\n          [kGuestOutputPaintRootSignatureIndexBilinear]\n              .ReleaseAndGetAddressOf()) = guest_output_paint_root_signature;\n  }\n  // EASU (needs the sampler).\n  guest_output_paint_root_parameter_effect_constants.Constants.Num32BitValues =\n      sizeof(FsrEasuConstants) / sizeof(uint32_t);\n  {\n    ID3D12RootSignature* guest_output_paint_root_signature =\n        util::CreateRootSignature(provider_,\n                                  guest_output_paint_root_signature_desc);\n    if (!guest_output_paint_root_signature) {\n      XELOGE(\n          \"D3D12Presenter: Failed to create the guest output AMD FidelityFX \"\n          \"FSR EASU presentation root signature\");\n      return false;\n    }\n    *(guest_output_paint_root_signatures_\n          [kGuestOutputPaintRootSignatureIndexFsrEasu]\n              .ReleaseAndGetAddressOf()) = guest_output_paint_root_signature;\n  }\n  // RCAS and CAS don't need the sampler.\n  guest_output_paint_root_signature_desc.NumStaticSamplers = 0;\n  // RCAS.\n  guest_output_paint_root_parameter_effect_constants.Constants.Num32BitValues =\n      sizeof(FsrRcasConstants) / sizeof(uint32_t);\n  {\n    ID3D12RootSignature* guest_output_paint_root_signature =\n        util::CreateRootSignature(provider_,\n                                  guest_output_paint_root_signature_desc);\n    if (!guest_output_paint_root_signature) {\n      XELOGE(\n          \"D3D12Presenter: Failed to create the guest output AMD FidelityFX \"\n          \"FSR RCAS presentation root signature\");\n      return false;\n    }\n    *(guest_output_paint_root_signatures_\n          [kGuestOutputPaintRootSignatureIndexFsrRcas]\n              .ReleaseAndGetAddressOf()) = guest_output_paint_root_signature;\n  }\n  // CAS, sharpening only.\n  guest_output_paint_root_parameter_effect_constants.Constants.Num32BitValues =\n      sizeof(CasSharpenConstants) / sizeof(uint32_t);\n  {\n    ID3D12RootSignature* guest_output_paint_root_signature =\n        util::CreateRootSignature(provider_,\n                                  guest_output_paint_root_signature_desc);\n    if (!guest_output_paint_root_signature) {\n      XELOGE(\n          \"D3D12Presenter: Failed to create the guest output AMD FidelityFX \"\n          \"CAS presentation root signature\");\n      return false;\n    }\n    *(guest_output_paint_root_signatures_\n          [kGuestOutputPaintRootSignatureIndexCasSharpen]\n              .ReleaseAndGetAddressOf()) = guest_output_paint_root_signature;\n  }\n  // CAS, resampling.\n  guest_output_paint_root_parameter_effect_constants.Constants.Num32BitValues =\n      sizeof(CasResampleConstants) / sizeof(uint32_t);\n  {\n    ID3D12RootSignature* guest_output_paint_root_signature =\n        util::CreateRootSignature(provider_,\n                                  guest_output_paint_root_signature_desc);\n    if (!guest_output_paint_root_signature) {\n      XELOGE(\n          \"D3D12Presenter: Failed to create the guest output resampling AMD \"\n          \"FidelityFX CAS presentation root signature\");\n      return false;\n    }\n    *(guest_output_paint_root_signatures_\n          [kGuestOutputPaintRootSignatureIndexCasResample]\n              .ReleaseAndGetAddressOf()) = guest_output_paint_root_signature;\n  }\n\n  // Guest output painting pipelines.\n  D3D12_GRAPHICS_PIPELINE_STATE_DESC guest_output_paint_pipeline_desc = {};\n  guest_output_paint_pipeline_desc.VS.pShaderBytecode =\n      shaders::guest_output_triangle_strip_rect_vs;\n  guest_output_paint_pipeline_desc.VS.BytecodeLength =\n      sizeof(shaders::guest_output_triangle_strip_rect_vs);\n  guest_output_paint_pipeline_desc.BlendState.RenderTarget[0]\n      .RenderTargetWriteMask = D3D12_COLOR_WRITE_ENABLE_ALL;\n  guest_output_paint_pipeline_desc.SampleMask = UINT_MAX;\n  guest_output_paint_pipeline_desc.RasterizerState.FillMode =\n      D3D12_FILL_MODE_SOLID;\n  guest_output_paint_pipeline_desc.RasterizerState.CullMode =\n      D3D12_CULL_MODE_NONE;\n  guest_output_paint_pipeline_desc.RasterizerState.DepthClipEnable = TRUE;\n  guest_output_paint_pipeline_desc.PrimitiveTopologyType =\n      D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;\n  guest_output_paint_pipeline_desc.NumRenderTargets = 1;\n  guest_output_paint_pipeline_desc.SampleDesc.Count = 1;\n  for (size_t i = 0; i < size_t(GuestOutputPaintEffect::kCount); ++i) {\n    GuestOutputPaintEffect guest_output_paint_effect =\n        GuestOutputPaintEffect(i);\n    switch (guest_output_paint_effect) {\n      case GuestOutputPaintEffect::kBilinear:\n        guest_output_paint_pipeline_desc.PS.pShaderBytecode =\n            shaders::guest_output_bilinear_ps;\n        guest_output_paint_pipeline_desc.PS.BytecodeLength =\n            sizeof(shaders::guest_output_bilinear_ps);\n        break;\n      case GuestOutputPaintEffect::kBilinearDither:\n        guest_output_paint_pipeline_desc.PS.pShaderBytecode =\n            shaders::guest_output_bilinear_dither_ps;\n        guest_output_paint_pipeline_desc.PS.BytecodeLength =\n            sizeof(shaders::guest_output_bilinear_dither_ps);\n        break;\n      case GuestOutputPaintEffect::kCasSharpen:\n        guest_output_paint_pipeline_desc.PS.pShaderBytecode =\n            shaders::guest_output_ffx_cas_sharpen_ps;\n        guest_output_paint_pipeline_desc.PS.BytecodeLength =\n            sizeof(shaders::guest_output_ffx_cas_sharpen_ps);\n        break;\n      case GuestOutputPaintEffect::kCasSharpenDither:\n        guest_output_paint_pipeline_desc.PS.pShaderBytecode =\n            shaders::guest_output_ffx_cas_sharpen_dither_ps;\n        guest_output_paint_pipeline_desc.PS.BytecodeLength =\n            sizeof(shaders::guest_output_ffx_cas_sharpen_dither_ps);\n        break;\n      case GuestOutputPaintEffect::kCasResample:\n        guest_output_paint_pipeline_desc.PS.pShaderBytecode =\n            shaders::guest_output_ffx_cas_resample_ps;\n        guest_output_paint_pipeline_desc.PS.BytecodeLength =\n            sizeof(shaders::guest_output_ffx_cas_resample_ps);\n        break;\n      case GuestOutputPaintEffect::kCasResampleDither:\n        guest_output_paint_pipeline_desc.PS.pShaderBytecode =\n            shaders::guest_output_ffx_cas_resample_dither_ps;\n        guest_output_paint_pipeline_desc.PS.BytecodeLength =\n            sizeof(shaders::guest_output_ffx_cas_resample_dither_ps);\n        break;\n      case GuestOutputPaintEffect::kFsrEasu:\n        guest_output_paint_pipeline_desc.PS.pShaderBytecode =\n            shaders::guest_output_ffx_fsr_easu_ps;\n        guest_output_paint_pipeline_desc.PS.BytecodeLength =\n            sizeof(shaders::guest_output_ffx_fsr_easu_ps);\n        break;\n      case GuestOutputPaintEffect::kFsrRcas:\n        guest_output_paint_pipeline_desc.PS.pShaderBytecode =\n            shaders::guest_output_ffx_fsr_rcas_ps;\n        guest_output_paint_pipeline_desc.PS.BytecodeLength =\n            sizeof(shaders::guest_output_ffx_fsr_rcas_ps);\n        break;\n      case GuestOutputPaintEffect::kFsrRcasDither:\n        guest_output_paint_pipeline_desc.PS.pShaderBytecode =\n            shaders::guest_output_ffx_fsr_rcas_dither_ps;\n        guest_output_paint_pipeline_desc.PS.BytecodeLength =\n            sizeof(shaders::guest_output_ffx_fsr_rcas_dither_ps);\n        break;\n      default:\n        // Not supported by this implementation.\n        continue;\n    }\n    guest_output_paint_pipeline_desc.pRootSignature =\n        guest_output_paint_root_signatures_\n            [GetGuestOutputPaintRootSignatureIndex(guest_output_paint_effect)]\n                .Get();\n    if (CanGuestOutputPaintEffectBeIntermediate(guest_output_paint_effect)) {\n      guest_output_paint_pipeline_desc.RTVFormats[0] =\n          kGuestOutputIntermediateFormat;\n      if (FAILED(device->CreateGraphicsPipelineState(\n              &guest_output_paint_pipeline_desc,\n              IID_PPV_ARGS(&guest_output_paint_intermediate_pipelines_[i])))) {\n        XELOGE(\n            \"D3D12Presenter: Failed to create the guest output painting \"\n            \"pipeline for effect {} writing to an intermediate texture\",\n            i);\n        return false;\n      }\n    }\n    if (CanGuestOutputPaintEffectBeFinal(guest_output_paint_effect)) {\n      guest_output_paint_pipeline_desc.RTVFormats[0] = kSwapChainFormat;\n      if (FAILED(device->CreateGraphicsPipelineState(\n              &guest_output_paint_pipeline_desc,\n              IID_PPV_ARGS(&guest_output_paint_final_pipelines_[i])))) {\n        XELOGE(\n            \"D3D12Presenter: Failed to create the guest output painting \"\n            \"pipeline for effect {} writing to a swap chain buffer\",\n            i);\n        return false;\n      }\n    }\n  }\n\n  // Initialize connection-independent parts of the painting context.\n\n  ID3D12CommandQueue* direct_queue = provider_.GetDirectQueue();\n\n  // Paint completion timelines.\n  paint_context_.paint_completion_timeline =\n      D3D12GPUCompletionTimeline::Create(device);\n  paint_context_.present_completion_timeline =\n      D3D12GPUCompletionTimeline::Create(device);\n  if (!paint_context_.paint_completion_timeline ||\n      !paint_context_.present_completion_timeline) {\n    return false;\n  }\n\n  // Paint command allocators and command list.\n  for (Microsoft::WRL::ComPtr<ID3D12CommandAllocator>&\n           paint_command_allocator_ref : paint_context_.command_allocators) {\n    if (FAILED(device->CreateCommandAllocator(\n            D3D12_COMMAND_LIST_TYPE_DIRECT,\n            IID_PPV_ARGS(&paint_command_allocator_ref)))) {\n      XELOGE(\n          \"D3D12Presenter: Failed to create a command allocator for drawing to \"\n          \"a swap chain\");\n      return false;\n    }\n  }\n  if (FAILED(device->CreateCommandList(\n          0, D3D12_COMMAND_LIST_TYPE_DIRECT,\n          paint_context_.command_allocators[0].Get(), nullptr,\n          IID_PPV_ARGS(&paint_context_.command_list)))) {\n    XELOGE(\n        \"D3D12Presenter: Failed to create the command list for drawing to a \"\n        \"swap chain\");\n    return false;\n  }\n  // Command lists are created in an open state.\n  paint_context_.command_list->Close();\n\n  // RTV descriptor heap.\n  D3D12_DESCRIPTOR_HEAP_DESC rtv_heap_desc;\n  rtv_heap_desc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV;\n  rtv_heap_desc.NumDescriptors = PaintContext::kRTVCount;\n  rtv_heap_desc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE;\n  rtv_heap_desc.NodeMask = 0;\n  if (FAILED(device->CreateDescriptorHeap(\n          &rtv_heap_desc, IID_PPV_ARGS(&paint_context_.rtv_heap)))) {\n    XELOGE(\n        \"D3D12Presenter: Failed to create an RTV descriptor heap with {} \"\n        \"descriptors\",\n        rtv_heap_desc.NumDescriptors);\n    return false;\n  }\n\n  // CBV/SRV/UAV descriptor heap.\n  D3D12_DESCRIPTOR_HEAP_DESC view_heap_desc;\n  view_heap_desc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV;\n  view_heap_desc.NumDescriptors = PaintContext::kViewCount;\n  view_heap_desc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE;\n  view_heap_desc.NodeMask = 0;\n  if (FAILED(device->CreateDescriptorHeap(\n          &view_heap_desc, IID_PPV_ARGS(&paint_context_.view_heap)))) {\n    XELOGE(\n        \"D3D12Presenter: Failed to create a shader-visible CBV/SRV/UAV \"\n        \"descriptor heap with {} descriptors\",\n        view_heap_desc.NumDescriptors);\n    return false;\n  }\n\n  guest_output_resource_refresher_completion_timeline_ =\n      D3D12GPUCompletionTimeline::Create(device);\n  if (!guest_output_resource_refresher_completion_timeline_) {\n    return false;\n  }\n\n  ui_completion_timeline_ = D3D12GPUCompletionTimeline::Create(device);\n  if (!ui_completion_timeline_) {\n    return false;\n  }\n\n  return InitializeCommonSurfaceIndependent();\n}\n\n}  // namespace d3d12\n}  // namespace ui\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/ui/d3d12/d3d12_presenter.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_D3D12_D3D12_PRESENTER_H_\n#define XENIA_UI_D3D12_D3D12_PRESENTER_H_\n\n#include <array>\n#include <cstdint>\n#include <memory>\n#include <utility>\n\n#include \"xenia/base/math.h\"\n#include \"xenia/ui/d3d12/d3d12_gpu_completion_timeline.h\"\n#include \"xenia/ui/d3d12/d3d12_provider.h\"\n#include \"xenia/ui/presenter.h\"\n#include \"xenia/ui/surface.h\"\n\nnamespace xe {\nnamespace ui {\nnamespace d3d12 {\n\nclass D3D12UIDrawContext final : public UIDrawContext {\n public:\n  D3D12UIDrawContext(Presenter& presenter, uint32_t render_target_width,\n                     uint32_t render_target_height,\n                     ID3D12GraphicsCommandList* command_list,\n                     uint64_t submission_index_current,\n                     uint64_t submission_index_completed)\n      : UIDrawContext(presenter, render_target_width, render_target_height),\n        command_list_(command_list),\n        submission_index_current_(submission_index_current),\n        submission_index_completed_(submission_index_completed) {}\n\n  ID3D12GraphicsCommandList* command_list() const {\n    return command_list_.Get();\n  }\n  uint64_t submission_index_current() const {\n    return submission_index_current_;\n  }\n  uint64_t submission_index_completed() const {\n    return submission_index_completed_;\n  }\n\n private:\n  Microsoft::WRL::ComPtr<ID3D12GraphicsCommandList> command_list_;\n  uint64_t submission_index_current_;\n  uint64_t submission_index_completed_;\n};\n\nclass D3D12Presenter final : public Presenter {\n public:\n  static constexpr DXGI_FORMAT kGuestOutputFormat =\n      DXGI_FORMAT_R10G10B10A2_UNORM;\n  static constexpr D3D12_RESOURCE_STATES kGuestOutputInternalState =\n      D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE;\n\n  static constexpr DXGI_FORMAT kGuestOutputIntermediateFormat =\n      DXGI_FORMAT_R10G10B10A2_UNORM;\n\n  // The format used internally by Windows composition.\n  static constexpr DXGI_FORMAT kSwapChainFormat = DXGI_FORMAT_B8G8R8A8_UNORM;\n\n  // The callback must use the main direct queue of the provider.\n  class D3D12GuestOutputRefreshContext final\n      : public GuestOutputRefreshContext {\n   public:\n    D3D12GuestOutputRefreshContext(bool& is_8bpc_out_ref,\n                                   ID3D12Resource* resource)\n        : GuestOutputRefreshContext(is_8bpc_out_ref), resource_(resource) {}\n\n    // kGuestOutputFormat, supports UAV. The initial state in the callback is\n    // kGuestOutputInternalState, and the callback must also transition it back\n    // to kGuestOutputInternalState before finishing.\n    ID3D12Resource* resource_uav_capable() const { return resource_.Get(); }\n\n   private:\n    Microsoft::WRL::ComPtr<ID3D12Resource> resource_;\n  };\n\n  static std::unique_ptr<D3D12Presenter> Create(\n      HostGpuLossCallback host_gpu_loss_callback,\n      const D3D12Provider& provider) {\n    auto presenter = std::unique_ptr<D3D12Presenter>(\n        new D3D12Presenter(host_gpu_loss_callback, provider));\n    if (!presenter->InitializeSurfaceIndependent()) {\n      return nullptr;\n    }\n    return presenter;\n  }\n\n  ~D3D12Presenter();\n\n  const D3D12Provider& provider() const { return provider_; }\n\n  Surface::TypeFlags GetSupportedSurfaceTypes() const override;\n\n  bool CaptureGuestOutput(RawImage& image_out) override;\n\n  void AwaitUISubmissionCompletionFromUIThread(uint64_t submission_index) {\n    ui_completion_timeline_->AwaitSubmissionAndUpdateCompleted(\n        submission_index);\n  }\n\n protected:\n  SurfacePaintConnectResult ConnectOrReconnectPaintingToSurfaceFromUIThread(\n      Surface& new_surface, uint32_t new_surface_width,\n      uint32_t new_surface_height, bool was_paintable,\n      bool& is_vsync_implicit_out) override;\n  void DisconnectPaintingFromSurfaceFromUIThreadImpl() override;\n\n  bool RefreshGuestOutputImpl(\n      uint32_t mailbox_index, uint32_t frontbuffer_width,\n      uint32_t frontbuffer_height,\n      std::function<bool(GuestOutputRefreshContext& context)> refresher,\n      bool& is_8bpc_out) override;\n\n  PaintResult PaintAndPresentImpl(bool execute_ui_drawers) override;\n\n private:\n  struct GuestOutputPaintRectangleConstants {\n    union {\n      struct {\n        float x;\n        float y;\n      };\n      float offset[2];\n    };\n    union {\n      struct {\n        float width;\n        float height;\n      };\n      float size[2];\n    };\n  };\n\n  enum class GuestOutputPaintRootParameter : UINT {\n    kSource,\n    kRectangle,\n    kEffectConstants,\n\n    kCount,\n  };\n\n  enum GuestOutputPaintRootSignatureIndex : size_t {\n    kGuestOutputPaintRootSignatureIndexBilinear,\n    kGuestOutputPaintRootSignatureIndexCasSharpen,\n    kGuestOutputPaintRootSignatureIndexCasResample,\n    kGuestOutputPaintRootSignatureIndexFsrEasu,\n    kGuestOutputPaintRootSignatureIndexFsrRcas,\n\n    kGuestOutputPaintRootSignatureCount,\n  };\n\n  static constexpr GuestOutputPaintRootSignatureIndex\n  GetGuestOutputPaintRootSignatureIndex(GuestOutputPaintEffect effect) {\n    switch (effect) {\n      case GuestOutputPaintEffect::kBilinear:\n      case GuestOutputPaintEffect::kBilinearDither:\n        return kGuestOutputPaintRootSignatureIndexBilinear;\n      case GuestOutputPaintEffect::kCasSharpen:\n      case GuestOutputPaintEffect::kCasSharpenDither:\n        return kGuestOutputPaintRootSignatureIndexCasSharpen;\n      case GuestOutputPaintEffect::kCasResample:\n      case GuestOutputPaintEffect::kCasResampleDither:\n        return kGuestOutputPaintRootSignatureIndexCasResample;\n      case GuestOutputPaintEffect::kFsrEasu:\n        return kGuestOutputPaintRootSignatureIndexFsrEasu;\n      case GuestOutputPaintEffect::kFsrRcas:\n      case GuestOutputPaintEffect::kFsrRcasDither:\n        return kGuestOutputPaintRootSignatureIndexFsrRcas;\n      default:\n        assert_unhandled_case(effect);\n        return kGuestOutputPaintRootSignatureCount;\n    }\n  }\n\n  struct PaintContext {\n    explicit PaintContext() = default;\n    PaintContext(const PaintContext& paint_context) = delete;\n    PaintContext& operator=(const PaintContext& paint_context) = delete;\n\n    static constexpr uint32_t kSwapChainBufferCount = 3;\n\n    enum RTVIndex : UINT {\n      // Swap chain buffers - updated when creating the swap chain\n      // (connection-specific).\n      kRTVIndexSwapChainBuffer0,\n\n      // Intermediate textures - the last usage is\n      // guest_output_intermediate_texture_paint_last_usage_.\n      kRTVIndexGuestOutputIntermediate0 =\n          kRTVIndexSwapChainBuffer0 + kSwapChainBufferCount,\n\n      kRTVCount =\n          kRTVIndexGuestOutputIntermediate0 + kGuestOutputMailboxSize - 1,\n    };\n\n    enum ViewIndex : UINT {\n      // Guest output textures - indices are the same as in\n      // guest_output_resource_paint_refs, and the last usage is tied to them.\n      kViewIndexGuestOutput0Srv,\n\n      // Intermediate textures - the last usage is\n      // guest_output_intermediate_texture_paint_last_usage_.\n      kViewIndexGuestOutputIntermediate0Srv =\n          kViewIndexGuestOutput0Srv + kGuestOutputMailboxSize,\n\n      kViewCount = kViewIndexGuestOutputIntermediate0Srv +\n                   kMaxGuestOutputPaintEffects - 1,\n    };\n\n    void AwaitSwapChainUsageCompletion() {\n      // May be called during destruction.\n\n      // Presentation engine usage.\n      if (present_completion_timeline) {\n        present_completion_timeline->AwaitAllSubmissions();\n      }\n\n      // Paint (render target) usage. While the presentation fence is signaled\n      // on the same queue, and presentation happens after painting, awaiting\n      // anyway for safety just to make less assumptions in the architecture.\n      if (paint_completion_timeline) {\n        paint_completion_timeline->AwaitAllSubmissions();\n      }\n    }\n\n    void DestroySwapChain();\n\n    // Connection-independent.\n\n    // Signaled before presenting.\n    std::unique_ptr<D3D12GPUCompletionTimeline> paint_completion_timeline;\n    // Signaled after presenting.\n    std::unique_ptr<D3D12GPUCompletionTimeline> present_completion_timeline;\n\n    std::array<Microsoft::WRL::ComPtr<ID3D12CommandAllocator>,\n               kSwapChainBufferCount>\n        command_allocators;\n    Microsoft::WRL::ComPtr<ID3D12GraphicsCommandList> command_list;\n\n    // Descriptor heaps for views of the current resources related to the guest\n    // output and to painting, updated either during painting or during\n    // connection lifetime management if outdated after awaiting usage\n    // completion.\n    // RTV heap.\n    Microsoft::WRL::ComPtr<ID3D12DescriptorHeap> rtv_heap;\n    // Shader-visible CBV/SRV/UAV heap.\n    Microsoft::WRL::ComPtr<ID3D12DescriptorHeap> view_heap;\n\n    // Refreshed and cleaned up during guest output painting. The first is the\n    // paint submission index in which the guest output texture (and its\n    // descriptors) was last used, the second is the reference to the texture,\n    // which may be null. The indices are not mailbox indices here, rather, if\n    // the reference is not in this array yet, the most outdated reference, if\n    // needed, is replaced with the new one, awaiting the completion of the last\n    // paint usage.\n    std::array<std::pair<uint64_t, Microsoft::WRL::ComPtr<ID3D12Resource>>,\n               kGuestOutputMailboxSize>\n        guest_output_resource_paint_refs;\n\n    // Current intermediate textures for guest output painting, refreshed when\n    // painting guest output. While not in use, they are in\n    // D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE.\n    std::array<Microsoft::WRL::ComPtr<ID3D12Resource>,\n               kMaxGuestOutputPaintEffects - 1>\n        guest_output_intermediate_textures;\n    uint64_t guest_output_intermediate_texture_last_usage = 0;\n\n    // Connection-specific.\n\n    uint32_t swap_chain_width = 0;\n    uint32_t swap_chain_height = 0;\n    bool swap_chain_allows_tearing = false;\n    Microsoft::WRL::ComPtr<IDXGISwapChain3> swap_chain;\n    std::array<Microsoft::WRL::ComPtr<ID3D12Resource>, kSwapChainBufferCount>\n        swap_chain_buffers;\n  };\n\n  explicit D3D12Presenter(HostGpuLossCallback host_gpu_loss_callback,\n                          const D3D12Provider& provider)\n      : Presenter(host_gpu_loss_callback), provider_(provider) {}\n\n  bool dxgi_supports_tearing() const { return dxgi_supports_tearing_; }\n\n  bool InitializeSurfaceIndependent();\n\n  const D3D12Provider& provider_;\n\n  // Whether DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING is supported by DXGI (depends in\n  // particular on the Windows 10 version and hardware support), primarily for\n  // variable refresh rate support.\n  bool dxgi_supports_tearing_ = false;\n\n  // Static objects for guest output presentation, used only when painting the\n  // main target (can be destroyed only after awaiting main target usage\n  // completion).\n  std::array<Microsoft::WRL::ComPtr<ID3D12RootSignature>,\n             kGuestOutputPaintRootSignatureCount>\n      guest_output_paint_root_signatures_;\n  std::array<Microsoft::WRL::ComPtr<ID3D12PipelineState>,\n             size_t(GuestOutputPaintEffect::kCount)>\n      guest_output_paint_intermediate_pipelines_;\n  std::array<Microsoft::WRL::ComPtr<ID3D12PipelineState>,\n             size_t(GuestOutputPaintEffect::kCount)>\n      guest_output_paint_final_pipelines_;\n\n  // The first is the refresher completion timeline submission index at which\n  // the guest output texture was last refreshed, the second is the reference to\n  // the texture, which may be null. The indices are the mailbox indices.\n  std::array<std::pair<uint64_t, Microsoft::WRL::ComPtr<ID3D12Resource>>,\n             kGuestOutputMailboxSize>\n      guest_output_resources_;\n  // The guest output resources are protected by two completion timelines - the\n  // refresher one (for writing to them via the guest_output_resources_\n  // references) and the paint one (for presenting it via the\n  // paint_context_.guest_output_resource_paint_refs references taken from\n  // guest_output_resources_).\n  std::unique_ptr<D3D12GPUCompletionTimeline>\n      guest_output_resource_refresher_completion_timeline_;\n\n  // UI completion timeline with the submission index that can be given to UI\n  // drawers (accessible from the UI thread only, at any time).\n  std::unique_ptr<D3D12GPUCompletionTimeline> ui_completion_timeline_;\n\n  // Accessible only by painting and by surface connection lifetime management\n  // (ConnectOrReconnectPaintingToSurfaceFromUIThread,\n  // DisconnectPaintingFromSurfaceFromUIThreadImpl) by the thread doing it, as\n  // well as by presenter initialization and shutdown.\n  PaintContext paint_context_;\n};\n\n}  // namespace d3d12\n}  // namespace ui\n}  // namespace xe\n\n#endif  // XENIA_UI_D3D12_D3D12_PRESENTER_H_\n"
  },
  {
    "path": "src/xenia/ui/d3d12/d3d12_provider.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/ui/d3d12/d3d12_provider.h\"\n\n#include <malloc.h>\n#include <cstdlib>\n\n#include \"xenia/base/cvar.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/ui/d3d12/d3d12_immediate_drawer.h\"\n#include \"xenia/ui/d3d12/d3d12_presenter.h\"\n\nDEFINE_bool(d3d12_debug, false, \"Enable Direct3D 12 and DXGI debug layer.\",\n            \"D3D12\");\nDEFINE_bool(d3d12_break_on_error, false,\n            \"Break on Direct3D 12 validation errors.\", \"D3D12\");\nDEFINE_bool(d3d12_break_on_warning, false,\n            \"Break on Direct3D 12 validation warnings.\", \"D3D12\");\nDEFINE_int32(d3d12_adapter, -1,\n             \"Index of the DXGI adapter to use. \"\n             \"-1 for any physical adapter, -2 for WARP software rendering.\",\n             \"D3D12\");\nDEFINE_int32(\n    d3d12_queue_priority, 1,\n    \"Graphics (direct) command queue scheduling priority, 0 - normal, 1 - \"\n    \"high, 2 - global realtime (requires administrator privileges, may impact \"\n    \"system responsibility)\",\n    \"D3D12\");\n\nnamespace xe {\nnamespace ui {\nnamespace d3d12 {\n\nbool D3D12Provider::IsD3D12APIAvailable() {\n  HMODULE library_d3d12 = LoadLibraryW(L\"D3D12.dll\");\n  if (!library_d3d12) {\n    return false;\n  }\n  FreeLibrary(library_d3d12);\n  return true;\n}\n\nstd::unique_ptr<D3D12Provider> D3D12Provider::Create() {\n  std::unique_ptr<D3D12Provider> provider(new D3D12Provider);\n  if (!provider->Initialize()) {\n    xe::FatalError(\n        \"Unable to initialize Direct3D 12 graphics subsystem.\\n\"\n        \"\\n\"\n        \"Ensure that you have the latest drivers for your GPU and it supports \"\n        \"Direct3D 12 with the feature level of at least 11_0.\\n\"\n        \"\\n\"\n        \"See https://xenia.jp/faq/ for more information and a list of \"\n        \"supported GPUs.\");\n    return nullptr;\n  }\n  return provider;\n}\n\nD3D12Provider::~D3D12Provider() {\n  if (graphics_analysis_ != nullptr) {\n    graphics_analysis_->Release();\n  }\n  if (direct_queue_ != nullptr) {\n    direct_queue_->Release();\n  }\n  if (device_ != nullptr) {\n    device_->Release();\n  }\n  if (dxgi_factory_ != nullptr) {\n    dxgi_factory_->Release();\n  }\n\n  if (cvars::d3d12_debug && pfn_dxgi_get_debug_interface1_) {\n    Microsoft::WRL::ComPtr<IDXGIDebug> dxgi_debug;\n    if (SUCCEEDED(\n            pfn_dxgi_get_debug_interface1_(0, IID_PPV_ARGS(&dxgi_debug)))) {\n      dxgi_debug->ReportLiveObjects(DXGI_DEBUG_ALL, DXGI_DEBUG_RLO_ALL);\n    }\n  }\n\n  if (library_dxcompiler_ != nullptr) {\n    FreeLibrary(library_dxcompiler_);\n  }\n  if (library_dxilconv_ != nullptr) {\n    FreeLibrary(library_dxilconv_);\n  }\n  if (library_d3dcompiler_ != nullptr) {\n    FreeLibrary(library_d3dcompiler_);\n  }\n  if (library_d3d12_ != nullptr) {\n    FreeLibrary(library_d3d12_);\n  }\n  if (library_dxgi_ != nullptr) {\n    FreeLibrary(library_dxgi_);\n  }\n}\n\nbool D3D12Provider::EnableIncreaseBasePriorityPrivilege() {\n  TOKEN_PRIVILEGES privileges;\n  privileges.PrivilegeCount = 1;\n  privileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;\n  if (!LookupPrivilegeValue(nullptr, SE_INC_BASE_PRIORITY_NAME,\n                            &privileges.Privileges[0].Luid)) {\n    return false;\n  }\n  HANDLE token;\n  if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &token)) {\n    return false;\n  }\n  bool enabled = AdjustTokenPrivileges(token, FALSE, &privileges,\n                                       sizeof(privileges), nullptr, nullptr) &&\n                 GetLastError() != ERROR_NOT_ALL_ASSIGNED;\n  CloseHandle(token);\n  return enabled;\n}\n\nbool D3D12Provider::Initialize() {\n  // Load the core libraries.\n  library_dxgi_ = LoadLibraryW(L\"dxgi.dll\");\n  library_d3d12_ = LoadLibraryW(L\"D3D12.dll\");\n  if (!library_dxgi_ || !library_d3d12_) {\n    XELOGE(\"Failed to load dxgi.dll or D3D12.dll\");\n    return false;\n  }\n  bool libraries_loaded = true;\n  libraries_loaded &=\n      (pfn_create_dxgi_factory2_ = PFNCreateDXGIFactory2(\n           GetProcAddress(library_dxgi_, \"CreateDXGIFactory2\"))) != nullptr;\n  libraries_loaded &=\n      (pfn_dxgi_get_debug_interface1_ = PFNDXGIGetDebugInterface1(\n           GetProcAddress(library_dxgi_, \"DXGIGetDebugInterface1\"))) != nullptr;\n  libraries_loaded &=\n      (pfn_d3d12_get_debug_interface_ = PFN_D3D12_GET_DEBUG_INTERFACE(\n           GetProcAddress(library_d3d12_, \"D3D12GetDebugInterface\"))) !=\n      nullptr;\n  libraries_loaded &=\n      (pfn_d3d12_create_device_ = PFN_D3D12_CREATE_DEVICE(\n           GetProcAddress(library_d3d12_, \"D3D12CreateDevice\"))) != nullptr;\n  libraries_loaded &=\n      (pfn_d3d12_serialize_root_signature_ = PFN_D3D12_SERIALIZE_ROOT_SIGNATURE(\n           GetProcAddress(library_d3d12_, \"D3D12SerializeRootSignature\"))) !=\n      nullptr;\n  if (!libraries_loaded) {\n    XELOGE(\"Failed to get DXGI or Direct3D 12 functions\");\n    return false;\n  }\n\n  // Load optional D3DCompiler_47.dll.\n  pfn_d3d_disassemble_ = nullptr;\n  library_d3dcompiler_ = LoadLibraryW(L\"D3DCompiler_47.dll\");\n  if (library_d3dcompiler_) {\n    pfn_d3d_disassemble_ =\n        pD3DDisassemble(GetProcAddress(library_d3dcompiler_, \"D3DDisassemble\"));\n    if (pfn_d3d_disassemble_ == nullptr) {\n      XELOGD(\n          \"Failed to get D3DDisassemble from D3DCompiler_47.dll, DXBC \"\n          \"disassembly for debugging will be unavailable\");\n    }\n  } else {\n    XELOGD(\n        \"Failed to load D3DCompiler_47.dll, DXBC disassembly for debugging \"\n        \"will be unavailable\");\n  }\n\n  // Load optional dxilconv.dll.\n  pfn_dxilconv_dxc_create_instance_ = nullptr;\n  library_dxilconv_ = LoadLibraryW(L\"dxilconv.dll\");\n  if (library_dxilconv_) {\n    pfn_dxilconv_dxc_create_instance_ = DxcCreateInstanceProc(\n        GetProcAddress(library_dxilconv_, \"DxcCreateInstance\"));\n    if (pfn_dxilconv_dxc_create_instance_ == nullptr) {\n      XELOGD(\n          \"Failed to get DxcCreateInstance from dxilconv.dll, converted DXIL \"\n          \"disassembly for debugging will be unavailable\");\n    }\n  } else {\n    XELOGD(\n        \"Failed to load dxilconv.dll, converted DXIL disassembly for debugging \"\n        \"will be unavailable - DXIL may be unsupported by your OS version\");\n  }\n\n  // Load optional dxcompiler.dll.\n  pfn_dxcompiler_dxc_create_instance_ = nullptr;\n  library_dxcompiler_ = LoadLibraryW(L\"dxcompiler.dll\");\n  if (library_dxcompiler_) {\n    pfn_dxcompiler_dxc_create_instance_ = DxcCreateInstanceProc(\n        GetProcAddress(library_dxcompiler_, \"DxcCreateInstance\"));\n    if (pfn_dxcompiler_dxc_create_instance_ == nullptr) {\n      XELOGD(\n          \"Failed to get DxcCreateInstance from dxcompiler.dll, converted DXIL \"\n          \"disassembly for debugging will be unavailable\");\n    }\n  } else {\n    XELOGD(\n        \"Failed to load dxcompiler.dll, converted DXIL disassembly for \"\n        \"debugging will be unavailable - if needed, download the DirectX \"\n        \"Shader Compiler from \"\n        \"https://github.com/microsoft/DirectXShaderCompiler/releases and place \"\n        \"the DLL in the Xenia directory\");\n  }\n\n  // Configure the DXGI debug info queue.\n  if (cvars::d3d12_break_on_error || cvars::d3d12_break_on_warning) {\n    IDXGIInfoQueue* dxgi_info_queue;\n    if (SUCCEEDED(pfn_dxgi_get_debug_interface1_(\n            0, IID_PPV_ARGS(&dxgi_info_queue)))) {\n      if (cvars::d3d12_break_on_error) {\n        dxgi_info_queue->SetBreakOnSeverity(\n            DXGI_DEBUG_ALL, DXGI_INFO_QUEUE_MESSAGE_SEVERITY_CORRUPTION, TRUE);\n        dxgi_info_queue->SetBreakOnSeverity(\n            DXGI_DEBUG_ALL, DXGI_INFO_QUEUE_MESSAGE_SEVERITY_ERROR, TRUE);\n      }\n      if (cvars::d3d12_break_on_warning) {\n        dxgi_info_queue->SetBreakOnSeverity(\n            DXGI_DEBUG_ALL, DXGI_INFO_QUEUE_MESSAGE_SEVERITY_WARNING, TRUE);\n      }\n      dxgi_info_queue->Release();\n    }\n  }\n\n  // Enable the debug layer.\n  bool debug = cvars::d3d12_debug;\n  if (debug) {\n    ID3D12Debug* debug_interface;\n    if (SUCCEEDED(\n            pfn_d3d12_get_debug_interface_(IID_PPV_ARGS(&debug_interface)))) {\n      debug_interface->EnableDebugLayer();\n      debug_interface->Release();\n    } else {\n      XELOGW(\"Failed to enable the Direct3D 12 debug layer\");\n      debug = false;\n    }\n  }\n\n  // Create the DXGI factory.\n  IDXGIFactory2* dxgi_factory;\n  if (FAILED(pfn_create_dxgi_factory2_(debug ? DXGI_CREATE_FACTORY_DEBUG : 0,\n                                       IID_PPV_ARGS(&dxgi_factory)))) {\n    XELOGE(\"Failed to create a DXGI factory\");\n    return false;\n  }\n\n  // Choose the adapter.\n  uint32_t adapter_index = 0;\n  IDXGIAdapter1* adapter = nullptr;\n  while (dxgi_factory->EnumAdapters1(adapter_index, &adapter) == S_OK) {\n    DXGI_ADAPTER_DESC1 adapter_desc;\n    if (SUCCEEDED(adapter->GetDesc1(&adapter_desc))) {\n      if (SUCCEEDED(pfn_d3d12_create_device_(adapter, D3D_FEATURE_LEVEL_11_0,\n                                             _uuidof(ID3D12Device), nullptr))) {\n        if (cvars::d3d12_adapter >= 0) {\n          if (adapter_index == cvars::d3d12_adapter) {\n            break;\n          }\n        } else if (cvars::d3d12_adapter == -2) {\n          if (adapter_desc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE) {\n            break;\n          }\n        } else {\n          if (!(adapter_desc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE)) {\n            break;\n          }\n        }\n      }\n    }\n    adapter->Release();\n    adapter = nullptr;\n    ++adapter_index;\n  }\n  if (adapter == nullptr) {\n    XELOGE(\n        \"Failed to get an adapter supporting Direct3D 12 with the feature \"\n        \"level of at least 11_0\");\n    dxgi_factory->Release();\n    return false;\n  }\n  DXGI_ADAPTER_DESC adapter_desc;\n  if (FAILED(adapter->GetDesc(&adapter_desc))) {\n    XELOGE(\"Failed to get the DXGI adapter description\");\n    adapter->Release();\n    dxgi_factory->Release();\n    return false;\n  }\n  adapter_vendor_id_ = GpuVendorID(adapter_desc.VendorId);\n  int adapter_name_mb_size = WideCharToMultiByte(\n      CP_UTF8, 0, adapter_desc.Description, -1, nullptr, 0, nullptr, nullptr);\n  if (adapter_name_mb_size != 0) {\n    char* adapter_name_mb =\n        reinterpret_cast<char*>(alloca(adapter_name_mb_size));\n    if (WideCharToMultiByte(CP_UTF8, 0, adapter_desc.Description, -1,\n                            adapter_name_mb, adapter_name_mb_size, nullptr,\n                            nullptr) != 0) {\n      XELOGD3D(\"DXGI adapter: {} (vendor 0x{:04X}, device 0x{:04X})\",\n               adapter_name_mb, adapter_desc.VendorId, adapter_desc.DeviceId);\n    }\n  }\n\n  // Create the Direct3D 12 device.\n  ID3D12Device* device;\n  if (FAILED(pfn_d3d12_create_device_(adapter, D3D_FEATURE_LEVEL_11_0,\n                                      IID_PPV_ARGS(&device)))) {\n    XELOGE(\"Failed to create a Direct3D 12 feature level 11_0 device\");\n    adapter->Release();\n    dxgi_factory->Release();\n    return false;\n  }\n  adapter->Release();\n\n  // Configure the Direct3D 12 debug info queue.\n  ID3D12InfoQueue* d3d12_info_queue;\n  if (SUCCEEDED(device->QueryInterface(IID_PPV_ARGS(&d3d12_info_queue)))) {\n    D3D12_MESSAGE_SEVERITY d3d12_info_queue_denied_severities[] = {\n        D3D12_MESSAGE_SEVERITY_INFO,\n    };\n    D3D12_MESSAGE_ID d3d12_info_queue_denied_messages[] = {\n        // Xbox 360 vertex fetch is explicit in shaders.\n        D3D12_MESSAGE_ID_CREATEINPUTLAYOUT_EMPTY_LAYOUT,\n        // Bug in the debug layer (fixed in some version of Windows) - gaps in\n        // render target bindings must be represented with a fully typed RTV\n        // descriptor and DXGI_FORMAT_UNKNOWN in the pipeline state, but older\n        // debug layer versions give a format mismatch error in this case.\n        D3D12_MESSAGE_ID_RENDER_TARGET_FORMAT_MISMATCH_PIPELINE_STATE,\n        // Render targets and shader exports don't have to match on the Xbox\n        // 360.\n        D3D12_MESSAGE_ID_CREATEGRAPHICSPIPELINESTATE_RENDERTARGETVIEW_NOT_SET,\n        // Arbitrary scissor can be specified by the guest, also it can be\n        // explicitly used to disable drawing.\n        D3D12_MESSAGE_ID_DRAW_EMPTY_SCISSOR_RECTANGLE,\n        // Arbitrary clear values can be specified by the guest.\n        D3D12_MESSAGE_ID_CLEARRENDERTARGETVIEW_MISMATCHINGCLEARVALUE,\n        D3D12_MESSAGE_ID_CLEARDEPTHSTENCILVIEW_MISMATCHINGCLEARVALUE,\n    };\n    D3D12_INFO_QUEUE_FILTER d3d12_info_queue_filter = {};\n    d3d12_info_queue_filter.DenyList.NumSeverities =\n        UINT(xe::countof(d3d12_info_queue_denied_severities));\n    d3d12_info_queue_filter.DenyList.pSeverityList =\n        d3d12_info_queue_denied_severities;\n    d3d12_info_queue_filter.DenyList.NumIDs =\n        UINT(xe::countof(d3d12_info_queue_denied_messages));\n    d3d12_info_queue_filter.DenyList.pIDList = d3d12_info_queue_denied_messages;\n    d3d12_info_queue->PushStorageFilter(&d3d12_info_queue_filter);\n    if (cvars::d3d12_break_on_error) {\n      d3d12_info_queue->SetBreakOnSeverity(D3D12_MESSAGE_SEVERITY_CORRUPTION,\n                                           TRUE);\n      d3d12_info_queue->SetBreakOnSeverity(D3D12_MESSAGE_SEVERITY_ERROR, TRUE);\n    }\n    if (cvars::d3d12_break_on_warning) {\n      d3d12_info_queue->SetBreakOnSeverity(D3D12_MESSAGE_SEVERITY_WARNING,\n                                           TRUE);\n    }\n    d3d12_info_queue->Release();\n  }\n\n  // Create the command queue for graphics.\n  D3D12_COMMAND_QUEUE_DESC queue_desc;\n  queue_desc.Type = D3D12_COMMAND_LIST_TYPE_DIRECT;\n  if (cvars::d3d12_queue_priority >= 2) {\n    queue_desc.Priority = D3D12_COMMAND_QUEUE_PRIORITY_GLOBAL_REALTIME;\n    if (!EnableIncreaseBasePriorityPrivilege()) {\n      XELOGW(\n          \"Failed to enable SeIncreaseBasePriorityPrivilege for global \"\n          \"realtime Direct3D 12 command queue priority, falling back to high \"\n          \"priority, try launching Xenia as administrator\");\n      queue_desc.Priority = D3D12_COMMAND_QUEUE_PRIORITY_HIGH;\n    }\n  } else if (cvars::d3d12_queue_priority >= 1) {\n    queue_desc.Priority = D3D12_COMMAND_QUEUE_PRIORITY_HIGH;\n  } else {\n    queue_desc.Priority = D3D12_COMMAND_QUEUE_PRIORITY_NORMAL;\n  }\n  queue_desc.Flags = D3D12_COMMAND_QUEUE_FLAG_NONE;\n  queue_desc.NodeMask = 0;\n  ID3D12CommandQueue* direct_queue;\n  if (FAILED(device->CreateCommandQueue(&queue_desc,\n                                        IID_PPV_ARGS(&direct_queue)))) {\n    bool queue_created = false;\n    if (queue_desc.Priority == D3D12_COMMAND_QUEUE_PRIORITY_GLOBAL_REALTIME) {\n      XELOGW(\n          \"Failed to create a Direct3D 12 direct command queue with global \"\n          \"realtime priority, falling back to high priority, try launching \"\n          \"Xenia as administrator\");\n      queue_desc.Priority = D3D12_COMMAND_QUEUE_PRIORITY_HIGH;\n      queue_created = SUCCEEDED(\n          device->CreateCommandQueue(&queue_desc, IID_PPV_ARGS(&direct_queue)));\n    }\n    if (!queue_created) {\n      XELOGE(\"Failed to create a Direct3D 12 direct command queue\");\n      device->Release();\n      dxgi_factory->Release();\n      return false;\n    }\n  }\n\n  dxgi_factory_ = dxgi_factory;\n  device_ = device;\n  direct_queue_ = direct_queue;\n\n  // Get descriptor sizes for each type.\n  for (uint32_t i = 0; i < D3D12_DESCRIPTOR_HEAP_TYPE_NUM_TYPES; ++i) {\n    descriptor_sizes_[i] =\n        device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE(i));\n  }\n\n  // Check if optional features are supported.\n  // D3D12_HEAP_FLAG_CREATE_NOT_ZEROED requires Windows 10 2004 (indicated by\n  // the availability of ID3D12Device8 or D3D12_FEATURE_D3D12_OPTIONS7).\n  heap_flag_create_not_zeroed_ = D3D12_HEAP_FLAG_NONE;\n  D3D12_FEATURE_DATA_D3D12_OPTIONS7 options7;\n  if (SUCCEEDED(device->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS7,\n                                            &options7, sizeof(options7)))) {\n    heap_flag_create_not_zeroed_ = D3D12_HEAP_FLAG_CREATE_NOT_ZEROED;\n  }\n  ps_specified_stencil_reference_supported_ = false;\n  rasterizer_ordered_views_supported_ = false;\n  resource_binding_tier_ = D3D12_RESOURCE_BINDING_TIER_1;\n  tiled_resources_tier_ = D3D12_TILED_RESOURCES_TIER_NOT_SUPPORTED;\n  unaligned_block_textures_supported_ = false;\n  D3D12_FEATURE_DATA_D3D12_OPTIONS options;\n  if (SUCCEEDED(device->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS,\n                                            &options, sizeof(options)))) {\n    ps_specified_stencil_reference_supported_ =\n        bool(options.PSSpecifiedStencilRefSupported);\n    rasterizer_ordered_views_supported_ = bool(options.ROVsSupported);\n    resource_binding_tier_ = options.ResourceBindingTier;\n    tiled_resources_tier_ = options.TiledResourcesTier;\n  }\n  programmable_sample_positions_tier_ =\n      D3D12_PROGRAMMABLE_SAMPLE_POSITIONS_TIER_NOT_SUPPORTED;\n  D3D12_FEATURE_DATA_D3D12_OPTIONS2 options2;\n  if (SUCCEEDED(device->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS2,\n                                            &options2, sizeof(options2)))) {\n    programmable_sample_positions_tier_ =\n        options2.ProgrammableSamplePositionsTier;\n  }\n  D3D12_FEATURE_DATA_D3D12_OPTIONS8 options8;\n  if (SUCCEEDED(device->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS8,\n                                            &options8, sizeof(options8)))) {\n    unaligned_block_textures_supported_ =\n        bool(options8.UnalignedBlockTexturesSupported);\n  }\n  virtual_address_bits_per_resource_ = 0;\n  D3D12_FEATURE_DATA_GPU_VIRTUAL_ADDRESS_SUPPORT virtual_address_support;\n  if (SUCCEEDED(device->CheckFeatureSupport(\n          D3D12_FEATURE_GPU_VIRTUAL_ADDRESS_SUPPORT, &virtual_address_support,\n          sizeof(virtual_address_support)))) {\n    virtual_address_bits_per_resource_ =\n        virtual_address_support.MaxGPUVirtualAddressBitsPerResource;\n  }\n  XELOGD3D(\n      \"Direct3D 12 device and OS features:\\n\"\n      \"* Max GPU virtual address bits per resource: {}\\n\"\n      \"* Non-zeroed heap creation: {}\\n\"\n      \"* Pixel-shader-specified stencil reference: {}\\n\"\n      \"* Programmable sample positions: tier {}\\n\"\n      \"* Rasterizer-ordered views: {}\\n\"\n      \"* Resource binding: tier {}\\n\"\n      \"* Tiled resources: tier {}\\n\"\n      \"* Unaligned block-compressed textures: {}\",\n      virtual_address_bits_per_resource_,\n      (heap_flag_create_not_zeroed_ & D3D12_HEAP_FLAG_CREATE_NOT_ZEROED) ? \"yes\"\n                                                                         : \"no\",\n      ps_specified_stencil_reference_supported_ ? \"yes\" : \"no\",\n      uint32_t(programmable_sample_positions_tier_),\n      rasterizer_ordered_views_supported_ ? \"yes\" : \"no\",\n      uint32_t(resource_binding_tier_), uint32_t(tiled_resources_tier_),\n      unaligned_block_textures_supported_ ? \"yes\" : \"no\");\n\n  // Get the graphics analysis interface, will silently fail if PIX is not\n  // attached.\n  pfn_dxgi_get_debug_interface1_(0, IID_PPV_ARGS(&graphics_analysis_));\n\n  return true;\n}\n\nstd::unique_ptr<Presenter> D3D12Provider::CreatePresenter(\n    Presenter::HostGpuLossCallback host_gpu_loss_callback) {\n  return D3D12Presenter::Create(host_gpu_loss_callback, *this);\n}\n\nstd::unique_ptr<ImmediateDrawer> D3D12Provider::CreateImmediateDrawer() {\n  return D3D12ImmediateDrawer::Create(*this);\n}\n\n}  // namespace d3d12\n}  // namespace ui\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/ui/d3d12/d3d12_provider.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_D3D12_D3D12_PROVIDER_H_\n#define XENIA_UI_D3D12_D3D12_PROVIDER_H_\n\n#include <memory>\n\n#include \"xenia/ui/d3d12/d3d12_api.h\"\n#include \"xenia/ui/graphics_provider.h\"\n\nnamespace xe {\nnamespace ui {\nnamespace d3d12 {\n\nclass D3D12Provider : public GraphicsProvider {\n public:\n  ~D3D12Provider();\n\n  static bool IsD3D12APIAvailable();\n\n  static std::unique_ptr<D3D12Provider> Create();\n\n  std::unique_ptr<Presenter> CreatePresenter(\n      Presenter::HostGpuLossCallback host_gpu_loss_callback =\n          Presenter::FatalErrorHostGpuLossCallback) override;\n\n  std::unique_ptr<ImmediateDrawer> CreateImmediateDrawer() override;\n\n  IDXGIFactory2* GetDXGIFactory() const { return dxgi_factory_; }\n  // nullptr if PIX not attached.\n  IDXGraphicsAnalysis* GetGraphicsAnalysis() const {\n    return graphics_analysis_;\n  }\n  ID3D12Device* GetDevice() const { return device_; }\n  ID3D12CommandQueue* GetDirectQueue() const { return direct_queue_; }\n\n  uint32_t GetDescriptorSize(D3D12_DESCRIPTOR_HEAP_TYPE type) const {\n    return descriptor_sizes_[type];\n  }\n  uint32_t GetViewDescriptorSize() const {\n    return GetDescriptorSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);\n  }\n  uint32_t GetSamplerDescriptorSize() const {\n    return GetDescriptorSize(D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER);\n  }\n  uint32_t GetRTVDescriptorSize() const {\n    return GetDescriptorSize(D3D12_DESCRIPTOR_HEAP_TYPE_RTV);\n  }\n  uint32_t GetDSVDescriptorSize() const {\n    return GetDescriptorSize(D3D12_DESCRIPTOR_HEAP_TYPE_DSV);\n  }\n  template <typename T>\n  T OffsetDescriptor(D3D12_DESCRIPTOR_HEAP_TYPE type, T start,\n                     uint32_t index) const {\n    start.ptr += index * GetDescriptorSize(type);\n    return start;\n  }\n  template <typename T>\n  T OffsetViewDescriptor(T start, uint32_t index) const {\n    start.ptr += index * GetViewDescriptorSize();\n    return start;\n  }\n  template <typename T>\n  T OffsetSamplerDescriptor(T start, uint32_t index) const {\n    start.ptr += index * GetSamplerDescriptorSize();\n    return start;\n  }\n  template <typename T>\n  T OffsetRTVDescriptor(T start, uint32_t index) const {\n    start.ptr += index * GetRTVDescriptorSize();\n    return start;\n  }\n  template <typename T>\n  T OffsetDSVDescriptor(T start, uint32_t index) const {\n    start.ptr += index * GetDSVDescriptorSize();\n    return start;\n  }\n\n  // Adapter info.\n  GpuVendorID GetAdapterVendorID() const { return adapter_vendor_id_; }\n\n  // Device features.\n  D3D12_HEAP_FLAGS GetHeapFlagCreateNotZeroed() const {\n    return heap_flag_create_not_zeroed_;\n  }\n  D3D12_PROGRAMMABLE_SAMPLE_POSITIONS_TIER\n  GetProgrammableSamplePositionsTier() const {\n    return programmable_sample_positions_tier_;\n  }\n  bool IsPSSpecifiedStencilReferenceSupported() const {\n    return ps_specified_stencil_reference_supported_;\n  }\n  bool AreRasterizerOrderedViewsSupported() const {\n    return rasterizer_ordered_views_supported_;\n  }\n  D3D12_RESOURCE_BINDING_TIER GetResourceBindingTier() const {\n    return resource_binding_tier_;\n  }\n  D3D12_TILED_RESOURCES_TIER GetTiledResourcesTier() const {\n    return tiled_resources_tier_;\n  }\n  bool AreUnalignedBlockTexturesSupported() const {\n    return unaligned_block_textures_supported_;\n  }\n  uint32_t GetVirtualAddressBitsPerResource() const {\n    return virtual_address_bits_per_resource_;\n  }\n\n  // Proxies for DirectX functions since they are loaded dynamically.\n  HRESULT SerializeRootSignature(const D3D12_ROOT_SIGNATURE_DESC* desc,\n                                 D3D_ROOT_SIGNATURE_VERSION version,\n                                 ID3DBlob** blob_out,\n                                 ID3DBlob** error_blob_out) const {\n    return pfn_d3d12_serialize_root_signature_(desc, version, blob_out,\n                                               error_blob_out);\n  }\n  HRESULT Disassemble(const void* src_data, size_t src_data_size, UINT flags,\n                      const char* comments, ID3DBlob** disassembly_out) const {\n    if (!pfn_d3d_disassemble_) {\n      return E_NOINTERFACE;\n    }\n    return pfn_d3d_disassemble_(src_data, src_data_size, flags, comments,\n                                disassembly_out);\n  }\n  HRESULT DxbcConverterCreateInstance(const CLSID& rclsid, const IID& riid,\n                                      void** ppv) const {\n    if (!pfn_dxilconv_dxc_create_instance_) {\n      return E_NOINTERFACE;\n    }\n    return pfn_dxilconv_dxc_create_instance_(rclsid, riid, ppv);\n  }\n  HRESULT DxcCreateInstance(const CLSID& rclsid, const IID& riid,\n                            void** ppv) const {\n    if (!pfn_dxcompiler_dxc_create_instance_) {\n      return E_NOINTERFACE;\n    }\n    return pfn_dxcompiler_dxc_create_instance_(rclsid, riid, ppv);\n  }\n\n private:\n  D3D12Provider() = default;\n\n  static bool EnableIncreaseBasePriorityPrivilege();\n  bool Initialize();\n\n  typedef HRESULT(WINAPI* PFNCreateDXGIFactory2)(UINT Flags, REFIID riid,\n                                                 _COM_Outptr_ void** ppFactory);\n  typedef HRESULT(WINAPI* PFNDXGIGetDebugInterface1)(\n      UINT Flags, REFIID riid, _COM_Outptr_ void** pDebug);\n\n  HMODULE library_dxgi_ = nullptr;\n  PFNCreateDXGIFactory2 pfn_create_dxgi_factory2_;\n  // Needed during shutdown as well to report live objects, so may be nullptr.\n  PFNDXGIGetDebugInterface1 pfn_dxgi_get_debug_interface1_ = nullptr;\n\n  HMODULE library_d3d12_ = nullptr;\n  PFN_D3D12_GET_DEBUG_INTERFACE pfn_d3d12_get_debug_interface_;\n  PFN_D3D12_CREATE_DEVICE pfn_d3d12_create_device_;\n  PFN_D3D12_SERIALIZE_ROOT_SIGNATURE pfn_d3d12_serialize_root_signature_;\n\n  HMODULE library_d3dcompiler_ = nullptr;\n  pD3DDisassemble pfn_d3d_disassemble_ = nullptr;\n\n  HMODULE library_dxilconv_ = nullptr;\n  DxcCreateInstanceProc pfn_dxilconv_dxc_create_instance_ = nullptr;\n\n  HMODULE library_dxcompiler_ = nullptr;\n  DxcCreateInstanceProc pfn_dxcompiler_dxc_create_instance_ = nullptr;\n\n  IDXGIFactory2* dxgi_factory_ = nullptr;\n  ID3D12Device* device_ = nullptr;\n  ID3D12CommandQueue* direct_queue_ = nullptr;\n  IDXGraphicsAnalysis* graphics_analysis_ = nullptr;\n\n  uint32_t descriptor_sizes_[D3D12_DESCRIPTOR_HEAP_TYPE_NUM_TYPES];\n\n  GpuVendorID adapter_vendor_id_;\n\n  D3D12_HEAP_FLAGS heap_flag_create_not_zeroed_;\n  D3D12_PROGRAMMABLE_SAMPLE_POSITIONS_TIER programmable_sample_positions_tier_;\n  D3D12_RESOURCE_BINDING_TIER resource_binding_tier_;\n  D3D12_TILED_RESOURCES_TIER tiled_resources_tier_;\n  uint32_t virtual_address_bits_per_resource_;\n  bool ps_specified_stencil_reference_supported_;\n  bool rasterizer_ordered_views_supported_;\n  bool unaligned_block_textures_supported_;\n};\n\n}  // namespace d3d12\n}  // namespace ui\n}  // namespace xe\n\n#endif  // XENIA_UI_D3D12_D3D12_PROVIDER_H_\n"
  },
  {
    "path": "src/xenia/ui/d3d12/d3d12_upload_buffer_pool.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/ui/d3d12/d3d12_upload_buffer_pool.h\"\n\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/ui/d3d12/d3d12_util.h\"\n\nnamespace xe {\nnamespace ui {\nnamespace d3d12 {\n\n// Align to D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT not to waste any space if\n// it's smaller (the size of the heap backing the buffer will be aligned to\n// D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT anyway).\nD3D12UploadBufferPool::D3D12UploadBufferPool(const D3D12Provider& provider,\n                                             size_t page_size)\n    : GraphicsUploadBufferPool(xe::align(\n          page_size, size_t(D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT))),\n      provider_(provider) {}\n\nuint8_t* D3D12UploadBufferPool::Request(\n    uint64_t submission_index, size_t size, size_t alignment,\n    ID3D12Resource** buffer_out, size_t* offset_out,\n    D3D12_GPU_VIRTUAL_ADDRESS* gpu_address_out) {\n  size_t offset;\n  const D3D12Page* page =\n      static_cast<const D3D12Page*>(GraphicsUploadBufferPool::Request(\n          submission_index, size, alignment, offset));\n  if (!page) {\n    return nullptr;\n  }\n  if (buffer_out) {\n    *buffer_out = page->buffer_.Get();\n  }\n  if (offset_out) {\n    *offset_out = offset;\n  }\n  if (gpu_address_out) {\n    *gpu_address_out = page->gpu_address_ + offset;\n  }\n  return reinterpret_cast<uint8_t*>(page->mapping_) + offset;\n}\n\nuint8_t* D3D12UploadBufferPool::RequestPartial(\n    uint64_t submission_index, size_t size, size_t alignment,\n    ID3D12Resource** buffer_out, size_t* offset_out, size_t* size_out,\n    D3D12_GPU_VIRTUAL_ADDRESS* gpu_address_out) {\n  size_t offset, size_obtained;\n  const D3D12Page* page =\n      static_cast<const D3D12Page*>(GraphicsUploadBufferPool::RequestPartial(\n          submission_index, size, alignment, offset, size_obtained));\n  if (!page) {\n    return nullptr;\n  }\n  if (buffer_out) {\n    *buffer_out = page->buffer_.Get();\n  }\n  if (offset_out) {\n    *offset_out = offset;\n  }\n  if (size_out) {\n    *size_out = size_obtained;\n  }\n  if (gpu_address_out) {\n    *gpu_address_out = page->gpu_address_ + offset;\n  }\n  return reinterpret_cast<uint8_t*>(page->mapping_) + offset;\n}\n\nGraphicsUploadBufferPool::Page*\nD3D12UploadBufferPool::CreatePageImplementation() {\n  D3D12_RESOURCE_DESC buffer_desc;\n  util::FillBufferResourceDesc(buffer_desc, page_size_,\n                               D3D12_RESOURCE_FLAG_NONE);\n  Microsoft::WRL::ComPtr<ID3D12Resource> buffer;\n  if (FAILED(provider_.GetDevice()->CreateCommittedResource(\n          &util::kHeapPropertiesUpload, provider_.GetHeapFlagCreateNotZeroed(),\n          &buffer_desc, D3D12_RESOURCE_STATE_GENERIC_READ, nullptr,\n          IID_PPV_ARGS(&buffer)))) {\n    XELOGE(\"Failed to create a D3D upload buffer with {} bytes\", page_size_);\n    return nullptr;\n  }\n  D3D12_RANGE read_range;\n  read_range.Begin = 0;\n  read_range.End = 0;\n  void* mapping;\n  if (FAILED(buffer->Map(0, &read_range, &mapping))) {\n    XELOGE(\"Failed to map a D3D upload buffer with {} bytes\", page_size_);\n    buffer->Release();\n    return nullptr;\n  }\n  // Unmapping will be done implicitly when the resource is destroyed.\n  return new D3D12Page(buffer.Get(), mapping);\n}\n\nD3D12UploadBufferPool::D3D12Page::D3D12Page(ID3D12Resource* buffer,\n                                            void* mapping)\n    : buffer_(buffer), mapping_(mapping) {\n  gpu_address_ = buffer_->GetGPUVirtualAddress();\n}\n\n}  // namespace d3d12\n}  // namespace ui\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/ui/d3d12/d3d12_upload_buffer_pool.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_D3D12_D3D12_UPLOAD_BUFFER_POOL_H_\n#define XENIA_UI_D3D12_D3D12_UPLOAD_BUFFER_POOL_H_\n\n#include \"xenia/ui/d3d12/d3d12_provider.h\"\n#include \"xenia/ui/graphics_upload_buffer_pool.h\"\n\nnamespace xe {\nnamespace ui {\nnamespace d3d12 {\n\nclass D3D12UploadBufferPool : public GraphicsUploadBufferPool {\n public:\n  D3D12UploadBufferPool(const D3D12Provider& provider,\n                        size_t page_size = kDefaultPageSize);\n\n  uint8_t* Request(uint64_t submission_index, size_t size, size_t alignment,\n                   ID3D12Resource** buffer_out, size_t* offset_out,\n                   D3D12_GPU_VIRTUAL_ADDRESS* gpu_address_out);\n  uint8_t* RequestPartial(uint64_t submission_index, size_t size,\n                          size_t alignment, ID3D12Resource** buffer_out,\n                          size_t* offset_out, size_t* size_out,\n                          D3D12_GPU_VIRTUAL_ADDRESS* gpu_address_out);\n\n protected:\n  Page* CreatePageImplementation() override;\n\n private:\n  struct D3D12Page : public Page {\n    // Creates a reference to the buffer. It must not be unmapped until this\n    // D3D12Page is deleted.\n    D3D12Page(ID3D12Resource* buffer, void* mapping);\n    Microsoft::WRL::ComPtr<ID3D12Resource> buffer_;\n    void* mapping_;\n    D3D12_GPU_VIRTUAL_ADDRESS gpu_address_;\n  };\n\n  const D3D12Provider& provider_;\n};\n\n}  // namespace d3d12\n}  // namespace ui\n}  // namespace xe\n\n#endif  // XENIA_UI_D3D12_D3D12_UPLOAD_BUFFER_POOL_H_\n"
  },
  {
    "path": "src/xenia/ui/d3d12/d3d12_util.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2018 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/ui/d3d12/d3d12_util.h\"\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/logging.h\"\n\nnamespace xe {\nnamespace ui {\nnamespace d3d12 {\nnamespace util {\n\nconst D3D12_HEAP_PROPERTIES kHeapPropertiesDefault = {D3D12_HEAP_TYPE_DEFAULT};\nconst D3D12_HEAP_PROPERTIES kHeapPropertiesUpload = {D3D12_HEAP_TYPE_UPLOAD};\nconst D3D12_HEAP_PROPERTIES kHeapPropertiesReadback = {\n    D3D12_HEAP_TYPE_READBACK};\n\nID3D12RootSignature* CreateRootSignature(\n    const D3D12Provider& provider, const D3D12_ROOT_SIGNATURE_DESC& desc) {\n  ID3DBlob* blob;\n  ID3DBlob* error_blob = nullptr;\n  if (FAILED(provider.SerializeRootSignature(\n          &desc, D3D_ROOT_SIGNATURE_VERSION_1, &blob, &error_blob))) {\n    XELOGE(\"Failed to serialize a root signature\");\n    if (error_blob != nullptr) {\n      XELOGE(\"{}\",\n             reinterpret_cast<const char*>(error_blob->GetBufferPointer()));\n      error_blob->Release();\n    }\n    return nullptr;\n  }\n  if (error_blob != nullptr) {\n    error_blob->Release();\n  }\n  ID3D12RootSignature* root_signature = nullptr;\n  provider.GetDevice()->CreateRootSignature(0, blob->GetBufferPointer(),\n                                            blob->GetBufferSize(),\n                                            IID_PPV_ARGS(&root_signature));\n  blob->Release();\n  return root_signature;\n}\n\nID3D12PipelineState* CreateComputePipeline(\n    ID3D12Device* device, const void* shader, size_t shader_size,\n    ID3D12RootSignature* root_signature) {\n  D3D12_COMPUTE_PIPELINE_STATE_DESC desc;\n  desc.pRootSignature = root_signature;\n  desc.CS.pShaderBytecode = shader;\n  desc.CS.BytecodeLength = shader_size;\n  desc.NodeMask = 0;\n  desc.CachedPSO.pCachedBlob = nullptr;\n  desc.CachedPSO.CachedBlobSizeInBytes = 0;\n  desc.Flags = D3D12_PIPELINE_STATE_FLAG_NONE;\n  ID3D12PipelineState* pipeline = nullptr;\n  device->CreateComputePipelineState(&desc, IID_PPV_ARGS(&pipeline));\n  return pipeline;\n}\n\nvoid CreateBufferRawSRV(ID3D12Device* device,\n                        D3D12_CPU_DESCRIPTOR_HANDLE handle,\n                        ID3D12Resource* buffer, uint32_t size,\n                        uint64_t offset) {\n  assert_false(size & (D3D12_RAW_UAV_SRV_BYTE_ALIGNMENT - 1));\n  assert_false(offset & (D3D12_RAW_UAV_SRV_BYTE_ALIGNMENT - 1));\n  D3D12_SHADER_RESOURCE_VIEW_DESC desc;\n  desc.Format = DXGI_FORMAT_R32_TYPELESS;\n  desc.ViewDimension = D3D12_SRV_DIMENSION_BUFFER;\n  desc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;\n  desc.Buffer.FirstElement = offset >> 2;\n  desc.Buffer.NumElements = size >> 2;\n  desc.Buffer.StructureByteStride = 0;\n  desc.Buffer.Flags = D3D12_BUFFER_SRV_FLAG_RAW;\n  device->CreateShaderResourceView(buffer, &desc, handle);\n}\n\nvoid CreateBufferRawUAV(ID3D12Device* device,\n                        D3D12_CPU_DESCRIPTOR_HANDLE handle,\n                        ID3D12Resource* buffer, uint32_t size,\n                        uint64_t offset) {\n  assert_false(size & (D3D12_RAW_UAV_SRV_BYTE_ALIGNMENT - 1));\n  assert_false(offset & (D3D12_RAW_UAV_SRV_BYTE_ALIGNMENT - 1));\n  D3D12_UNORDERED_ACCESS_VIEW_DESC desc;\n  desc.Format = DXGI_FORMAT_R32_TYPELESS;\n  desc.ViewDimension = D3D12_UAV_DIMENSION_BUFFER;\n  desc.Buffer.FirstElement = offset >> 2;\n  desc.Buffer.NumElements = size >> 2;\n  desc.Buffer.StructureByteStride = 0;\n  desc.Buffer.CounterOffsetInBytes = 0;\n  desc.Buffer.Flags = D3D12_BUFFER_UAV_FLAG_RAW;\n  device->CreateUnorderedAccessView(buffer, nullptr, &desc, handle);\n}\n\nvoid CreateBufferTypedSRV(ID3D12Device* device,\n                          D3D12_CPU_DESCRIPTOR_HANDLE handle,\n                          ID3D12Resource* buffer, DXGI_FORMAT format,\n                          uint32_t num_elements, uint64_t first_element) {\n  D3D12_SHADER_RESOURCE_VIEW_DESC desc;\n  desc.Format = format;\n  desc.ViewDimension = D3D12_SRV_DIMENSION_BUFFER;\n  desc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;\n  desc.Buffer.FirstElement = first_element;\n  desc.Buffer.NumElements = num_elements;\n  desc.Buffer.StructureByteStride = 0;\n  desc.Buffer.Flags = D3D12_BUFFER_SRV_FLAG_NONE;\n  device->CreateShaderResourceView(buffer, &desc, handle);\n}\n\nvoid CreateBufferTypedUAV(ID3D12Device* device,\n                          D3D12_CPU_DESCRIPTOR_HANDLE handle,\n                          ID3D12Resource* buffer, DXGI_FORMAT format,\n                          uint32_t num_elements, uint64_t first_element) {\n  D3D12_UNORDERED_ACCESS_VIEW_DESC desc;\n  desc.Format = format;\n  desc.ViewDimension = D3D12_UAV_DIMENSION_BUFFER;\n  desc.Buffer.FirstElement = first_element;\n  desc.Buffer.NumElements = num_elements;\n  desc.Buffer.StructureByteStride = 0;\n  desc.Buffer.CounterOffsetInBytes = 0;\n  desc.Buffer.Flags = D3D12_BUFFER_UAV_FLAG_NONE;\n  device->CreateUnorderedAccessView(buffer, nullptr, &desc, handle);\n}\n\n}  // namespace util\n}  // namespace d3d12\n}  // namespace ui\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/ui/d3d12/d3d12_util.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2018 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_D3D12_D3D12_UTIL_H_\n#define XENIA_UI_D3D12_D3D12_UTIL_H_\n\n#include <utility>\n\n#include \"xenia/ui/d3d12/d3d12_provider.h\"\n\nnamespace xe {\nnamespace ui {\nnamespace d3d12 {\nnamespace util {\n\nusing DescriptorCpuGpuHandlePair =\n    std::pair<D3D12_CPU_DESCRIPTOR_HANDLE, D3D12_GPU_DESCRIPTOR_HANDLE>;\n\nextern const D3D12_HEAP_PROPERTIES kHeapPropertiesDefault;\nextern const D3D12_HEAP_PROPERTIES kHeapPropertiesUpload;\nextern const D3D12_HEAP_PROPERTIES kHeapPropertiesReadback;\n\ntemplate <typename T>\nbool ReleaseAndNull(T& object) {\n  if (object != nullptr) {\n    object->Release();\n    object = nullptr;\n    return true;\n  }\n  return false;\n};\n\nID3D12RootSignature* CreateRootSignature(const D3D12Provider& provider,\n                                         const D3D12_ROOT_SIGNATURE_DESC& desc);\n\nID3D12PipelineState* CreateComputePipeline(ID3D12Device* device,\n                                           const void* shader,\n                                           size_t shader_size,\n                                           ID3D12RootSignature* root_signature);\n\nconstexpr DXGI_FORMAT GetUintPow2DXGIFormat(uint32_t element_size_bytes_log2) {\n  switch (element_size_bytes_log2) {\n    case 0:\n      return DXGI_FORMAT_R8_UINT;\n    case 1:\n      return DXGI_FORMAT_R16_UINT;\n    case 2:\n      return DXGI_FORMAT_R32_UINT;\n    case 3:\n      return DXGI_FORMAT_R32G32_UINT;\n    case 4:\n      return DXGI_FORMAT_R32G32B32A32_UINT;\n    default:\n      return DXGI_FORMAT_UNKNOWN;\n  }\n}\n\ninline void FillBufferResourceDesc(D3D12_RESOURCE_DESC& desc, UINT64 size,\n                                   D3D12_RESOURCE_FLAGS flags) {\n  desc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER;\n  desc.Alignment = 0;\n  desc.Width = size;\n  desc.Height = 1;\n  desc.DepthOrArraySize = 1;\n  desc.MipLevels = 1;\n  desc.Format = DXGI_FORMAT_UNKNOWN;\n  desc.SampleDesc.Count = 1;\n  desc.SampleDesc.Quality = 0;\n  desc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR;\n  desc.Flags = flags;\n}\n\nvoid CreateBufferRawSRV(ID3D12Device* device,\n                        D3D12_CPU_DESCRIPTOR_HANDLE handle,\n                        ID3D12Resource* buffer, uint32_t size,\n                        uint64_t offset = 0);\nvoid CreateBufferRawUAV(ID3D12Device* device,\n                        D3D12_CPU_DESCRIPTOR_HANDLE handle,\n                        ID3D12Resource* buffer, uint32_t size,\n                        uint64_t offset = 0);\nvoid CreateBufferTypedSRV(ID3D12Device* device,\n                          D3D12_CPU_DESCRIPTOR_HANDLE handle,\n                          ID3D12Resource* buffer, DXGI_FORMAT format,\n                          uint32_t num_elements, uint64_t first_element = 0);\nvoid CreateBufferTypedUAV(ID3D12Device* device,\n                          D3D12_CPU_DESCRIPTOR_HANDLE handle,\n                          ID3D12Resource* buffer, DXGI_FORMAT format,\n                          uint32_t num_elements, uint64_t first_element = 0);\n\n}  // namespace util\n}  // namespace d3d12\n}  // namespace ui\n}  // namespace xe\n\n#endif  // XENIA_UI_D3D12_D3D12_UTIL_H_\n"
  },
  {
    "path": "src/xenia/ui/d3d12/d3d12_window_demo.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include <memory>\n#include <string>\n\n#include \"xenia/ui/d3d12/d3d12_provider.h\"\n#include \"xenia/ui/window_demo.h\"\n#include \"xenia/ui/windowed_app.h\"\n\nnamespace xe {\nnamespace ui {\nnamespace d3d12 {\n\nclass D3D12WindowDemoApp final : public WindowDemoApp {\n public:\n  static std::unique_ptr<WindowedApp> Create(WindowedAppContext& app_context) {\n    return std::unique_ptr<WindowedApp>(new D3D12WindowDemoApp(app_context));\n  }\n\n protected:\n  std::unique_ptr<GraphicsProvider> CreateGraphicsProvider() const override;\n\n private:\n  explicit D3D12WindowDemoApp(WindowedAppContext& app_context)\n      : WindowDemoApp(app_context, \"xenia-ui-window-d3d12-demo\") {}\n};\n\nstd::unique_ptr<GraphicsProvider> D3D12WindowDemoApp::CreateGraphicsProvider()\n    const {\n  return D3D12Provider::Create();\n}\n\n}  // namespace d3d12\n}  // namespace ui\n}  // namespace xe\n\nXE_DEFINE_WINDOWED_APP(xenia_ui_window_d3d12_demo,\n                       xe::ui::d3d12::D3D12WindowDemoApp::Create);\n"
  },
  {
    "path": "src/xenia/ui/d3d12/premake5.lua",
    "content": "project_root = \"../../../..\"\ninclude(project_root..\"/tools/build\")\n\ngroup(\"src\")\nproject(\"xenia-ui-d3d12\")\n  uuid(\"f93dc1a8-600f-43e7-b0fc-ae3eefbe836b\")\n  kind(\"StaticLib\")\n  language(\"C++\")\n  links({\n    \"xenia-base\",\n    \"xenia-ui\",\n  })\n  local_platform_files()\n  files({\n    \"../shaders/bytecode/d3d12_5_1/*.h\",\n  })\n\ngroup(\"demos\")\nproject(\"xenia-ui-window-d3d12-demo\")\n  uuid(\"3b9686a7-0f04-4e17-8b00-aeb78ae1107c\")\n  single_library_windowed_app_kind()\n  language(\"C++\")\n  links({\n    \"fmt\",\n    \"imgui\",\n    \"xenia-base\",\n    \"xenia-ui\",\n    \"xenia-ui-d3d12\",\n  })\n  files({\n    \"../window_demo.cc\",\n    \"d3d12_window_demo.cc\",\n    project_root..\"/src/xenia/ui/windowed_app_main_\"..platform_suffix..\".cc\",\n  })\n  resincludedirs({\n    project_root,\n  })\n"
  },
  {
    "path": "src/xenia/ui/dxgi_include_win.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2026 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_DXGI_INCLUDE_WIN_H_\n#define XENIA_UI_DXGI_INCLUDE_WIN_H_\n\n// Must be included before Windows headers for definitions like NOMINMAX.\n#include \"xenia/base/platform_win.h\"\n\n// Include the up to date versions of the DXGI header dependencies rather than\n// the ones from the Windows SDK before including the DXGI header.\n#include \"third_party/DirectX-Headers/include/directx/dxgicommon.h\"\n#include \"third_party/DirectX-Headers/include/directx/dxgiformat.h\"\n\n#include <dxgi1_5.h>\n\n#endif  // XENIA_UI_DXGI_INCLUDE_WIN_H_\n"
  },
  {
    "path": "src/xenia/ui/file_picker.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_FILE_PICKER_H_\n#define XENIA_UI_FILE_PICKER_H_\n\n#include <filesystem>\n#include <memory>\n#include <string>\n#include <utility>\n#include <vector>\n\n#include \"xenia/ui/window.h\"\n\nnamespace xe {\nnamespace ui {\n\nclass FilePicker {\n public:\n  enum class Mode {\n    kOpen = 0,\n    kSave = 1,\n  };\n  enum class Type {\n    kFile = 0,\n    kDirectory = 1,\n  };\n\n  static std::unique_ptr<FilePicker> Create();\n\n  FilePicker()\n      : mode_(Mode::kOpen),\n        type_(Type::kFile),\n        title_(\"Select Files\"),\n        multi_selection_(false) {}\n  virtual ~FilePicker() = default;\n\n  Mode mode() const { return mode_; }\n  void set_mode(Mode mode) { mode_ = mode; }\n\n  Type type() const { return type_; }\n  void set_type(Type type) { type_ = type; }\n\n  const std::string& title() const { return title_; }\n  void set_title(std::string title) { title_ = std::move(title); }\n\n  std::vector<std::pair<std::string, std::string>> extensions() const {\n    return extensions_;\n  }\n  void set_extensions(\n      std::vector<std::pair<std::string, std::string>> extensions) {\n    extensions_ = std::move(extensions);\n  }\n\n  bool multi_selection() const { return multi_selection_; }\n  void set_multi_selection(bool multi_selection) {\n    multi_selection_ = multi_selection;\n  }\n\n  std::vector<std::filesystem::path> selected_files() const {\n    return selected_files_;\n  }\n  void set_selected_files(std::vector<std::filesystem::path> selected_files) {\n    selected_files_ = std::move(selected_files);\n  }\n\n  virtual bool Show(Window* parent_window = nullptr) = 0;\n\n private:\n  Mode mode_;\n  Type type_;\n  std::string title_;\n  std::vector<std::pair<std::string, std::string>> extensions_;\n  bool multi_selection_;\n\n  std::vector<std::filesystem::path> selected_files_;\n};\n\n}  // namespace ui\n}  // namespace xe\n\n#endif  // XENIA_UI_FILE_PICKER_H_\n"
  },
  {
    "path": "src/xenia/ui/file_picker_android.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include <memory>\n\n#include \"xenia/ui/file_picker.h\"\n\nnamespace xe {\nnamespace ui {\n\n// TODO(Triang3l): An asynchronous file picker with a callback, starting an\n// activity for an ACTION_OPEN_DOCUMENT or an ACTION_OPEN_DOCUMENT_TREE intent.\n// This intent, however, provides a content URI, not the file path directly.\n// Accessing the file via the Storage Access Framework doesn't require the\n// READ_EXTERNAL_STORAGE permission, unlike opening a file by its path directly.\n// A file descriptor can be opened for the URI using\n// Context.getContentResolver().openFileDescriptor (it will return a\n// ParcelFileDescriptor, and a FileDescriptor can be obtained using its\n// getFileDescriptor() method).\n\nclass AndroidFilePicker : public FilePicker {\n public:\n  bool Show(Window* parent_window) override { return false; }\n};\n\nstd::unique_ptr<FilePicker> FilePicker::Create() {\n  return std::make_unique<AndroidFilePicker>();\n}\n\n}  // namespace ui\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/ui/file_picker_gtk.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/ui/file_picker.h\"\n\n#include <filesystem>\n#include <string>\n\n#include <gdk/gdkx.h>\n#include <gtk/gtk.h>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/filesystem.h\"\n#include \"xenia/base/platform_linux.h\"\n#include \"xenia/base/string.h\"\n#include \"xenia/ui/window_gtk.h\"\n\nnamespace xe {\nnamespace ui {\n\nclass GtkFilePicker : public FilePicker {\n public:\n  GtkFilePicker();\n  ~GtkFilePicker() override;\n\n  bool Show(Window* parent_window) override;\n\n private:\n};\n\nstd::unique_ptr<FilePicker> FilePicker::Create() {\n  return std::make_unique<GtkFilePicker>();\n}\n\nGtkFilePicker::GtkFilePicker() = default;\n\nGtkFilePicker::~GtkFilePicker() = default;\n\nbool GtkFilePicker::Show(Window* parent_window) {\n  // TODO(benvanik): FileSaveDialog.\n  assert_true(mode() == Mode::kOpen);\n  // TODO(benvanik): folder dialogs.\n  assert_true(type() == Type::kFile);\n  GtkWidget* dialog;\n  gint res;\n\n  dialog = gtk_file_chooser_dialog_new(\n      \"Open File\",\n      parent_window\n          ? GTK_WINDOW(static_cast<const GTKWindow*>(parent_window)->window())\n          : nullptr,\n      GTK_FILE_CHOOSER_ACTION_OPEN, \"_Cancel\", GTK_RESPONSE_CANCEL, \"_Open\",\n      GTK_RESPONSE_ACCEPT, NULL);\n\n  res = gtk_dialog_run(GTK_DIALOG(dialog));\n  char* filename;\n  if (res == GTK_RESPONSE_ACCEPT) {\n    GtkFileChooser* chooser = GTK_FILE_CHOOSER(dialog);\n    filename = gtk_file_chooser_get_filename(chooser);\n    std::vector<std::filesystem::path> selected_files;\n    selected_files.push_back(xe::to_path(std::string(filename)));\n    set_selected_files(selected_files);\n    gtk_widget_destroy(dialog);\n    return true;\n  }\n  gtk_widget_destroy(dialog);\n  return false;\n}\n\n}  // namespace ui\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/ui/file_picker_win.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/platform_win.h\"\n#include \"xenia/base/string.h\"\n#include \"xenia/ui/file_picker.h\"\n#include \"xenia/ui/window_win.h\"\n\n// Microsoft headers after platform_win.h.\n#include <wrl/client.h>\n\nnamespace xe {\nnamespace ui {\n\nclass Win32FilePicker : public FilePicker {\n public:\n  Win32FilePicker();\n  ~Win32FilePicker() override;\n\n  bool Show(Window* parent_window) override;\n\n private:\n};\n\nstd::unique_ptr<FilePicker> FilePicker::Create() {\n  return std::make_unique<Win32FilePicker>();\n}\n\nclass CDialogEventHandler : public IFileDialogEvents,\n                            public IFileDialogControlEvents {\n public:\n  // IUnknown methods\n  IFACEMETHODIMP QueryInterface(REFIID riid, void** ppv) {\n    // dwOffset may be a DWORD or an int depending on compiler/SDK version.\n    static const QITAB qit[] = {\n        {&__uuidof(IFileDialogEvents),\n         static_cast<decltype(qit[0].dwOffset)>(\n             OFFSETOFCLASS(IFileDialogEvents, CDialogEventHandler))},\n        {&__uuidof(IFileDialogControlEvents),\n         static_cast<decltype(qit[1].dwOffset)>(\n             OFFSETOFCLASS(IFileDialogControlEvents, CDialogEventHandler))},\n        {0},\n    };\n    return QISearch(this, qit, riid, ppv);\n  }\n\n  IFACEMETHODIMP_(ULONG) AddRef() { return InterlockedIncrement(&_cRef); }\n\n  IFACEMETHODIMP_(ULONG) Release() {\n    long cRef = InterlockedDecrement(&_cRef);\n    if (!cRef) delete this;\n    return cRef;\n  }\n\n  // IFileDialogEvents methods\n  IFACEMETHODIMP OnFileOk(IFileDialog*) { return S_OK; }\n  IFACEMETHODIMP OnFolderChange(IFileDialog*) { return S_OK; }\n  IFACEMETHODIMP OnFolderChanging(IFileDialog*, IShellItem*) { return S_OK; }\n  IFACEMETHODIMP OnHelp(IFileDialog*) { return S_OK; }\n  IFACEMETHODIMP OnSelectionChange(IFileDialog*) { return S_OK; }\n  IFACEMETHODIMP OnShareViolation(IFileDialog*, IShellItem*,\n                                  FDE_SHAREVIOLATION_RESPONSE*) {\n    return S_OK;\n  }\n  IFACEMETHODIMP OnTypeChange(IFileDialog* pfd) { return S_OK; }\n  IFACEMETHODIMP OnOverwrite(IFileDialog*, IShellItem*,\n                             FDE_OVERWRITE_RESPONSE*) {\n    return S_OK;\n  }\n\n  // IFileDialogControlEvents methods\n  IFACEMETHODIMP OnItemSelected(IFileDialogCustomize* pfdc, DWORD dwIDCtl,\n                                DWORD dwIDItem) {\n    return S_OK;\n  }\n  IFACEMETHODIMP OnButtonClicked(IFileDialogCustomize*, DWORD) { return S_OK; }\n  IFACEMETHODIMP OnCheckButtonToggled(IFileDialogCustomize*, DWORD, BOOL) {\n    return S_OK;\n  }\n  IFACEMETHODIMP OnControlActivating(IFileDialogCustomize*, DWORD) {\n    return S_OK;\n  }\n\n  CDialogEventHandler() : _cRef(1) {}\n\n private:\n  virtual ~CDialogEventHandler() = default;\n  long _cRef;\n};\n\nHRESULT CDialogEventHandler_CreateInstance(REFIID riid, void** ppv) {\n  *ppv = NULL;\n  auto dialog_event_handler = new (std::nothrow) CDialogEventHandler();\n  HRESULT hr = dialog_event_handler ? S_OK : E_OUTOFMEMORY;\n  if (SUCCEEDED(hr)) {\n    hr = dialog_event_handler->QueryInterface(riid, ppv);\n    dialog_event_handler->Release();\n  }\n  return hr;\n}\n\nWin32FilePicker::Win32FilePicker() = default;\n\nWin32FilePicker::~Win32FilePicker() = default;\n\nbool Win32FilePicker::Show(Window* parent_window) {\n  // TODO(benvanik): FileSaveDialog.\n  assert_true(mode() == Mode::kOpen);\n\n  Microsoft::WRL::ComPtr<IFileDialog> file_dialog;\n  HRESULT hr =\n      CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_INPROC_SERVER,\n                       IID_PPV_ARGS(&file_dialog));\n  if (!SUCCEEDED(hr)) {\n    return false;\n  }\n\n  hr = file_dialog->SetTitle((LPCWSTR)xe::to_utf16(title()).c_str());\n  if (!SUCCEEDED(hr)) {\n    return false;\n  }\n\n  DWORD flags;\n  hr = file_dialog->GetOptions(&flags);\n  if (!SUCCEEDED(hr)) {\n    return false;\n  }\n  // FOS_FILEMUSTEXIST\n  // FOS_PATHMUSTEXIST\n  flags |= FOS_FORCEFILESYSTEM;\n  if (multi_selection()) {\n    flags |= FOS_ALLOWMULTISELECT;\n  }\n  if (type() == Type::kDirectory) {\n    flags |= FOS_PICKFOLDERS;\n  }\n  hr = file_dialog->SetOptions(flags);\n  if (!SUCCEEDED(hr)) {\n    return false;\n  }\n\n  if (type() == Type::kFile) {\n    // Set the file types to display only. Notice that this is a 1-based array.\n    using u16sPair = std::pair<std::u16string, std::u16string>;\n    std::vector<std::unique_ptr<u16sPair>> file_pairs;\n    std::vector<COMDLG_FILTERSPEC> file_types;\n    for (const auto& extension : this->extensions()) {\n      const auto& file_pair =\n          file_pairs.emplace_back(std::make_unique<u16sPair>(\n              xe::to_utf16(extension.first), xe::to_utf16(extension.second)));\n      file_types.push_back(\n          {reinterpret_cast<LPCWSTR>(file_pair->first.c_str()),\n           reinterpret_cast<LPCWSTR>(file_pair->second.c_str())});\n    }\n    hr = file_dialog->SetFileTypes(static_cast<UINT>(file_types.size()),\n                                   file_types.data());\n    if (!SUCCEEDED(hr)) {\n      return false;\n    }\n\n    hr = file_dialog->SetFileTypeIndex(1);\n    if (!SUCCEEDED(hr)) {\n      return false;\n    }\n  }\n\n  // Create an event handling object, and hook it up to the dialog.\n  Microsoft::WRL::ComPtr<IFileDialogEvents> file_dialog_events;\n  hr = CDialogEventHandler_CreateInstance(IID_PPV_ARGS(&file_dialog_events));\n  if (!SUCCEEDED(hr)) {\n    return false;\n  }\n  DWORD cookie;\n  hr = file_dialog->Advise(file_dialog_events.Get(), &cookie);\n  if (!SUCCEEDED(hr)) {\n    return false;\n  }\n\n  // Show the dialog modally.\n  hr = file_dialog->Show(\n      parent_window ? static_cast<const Win32Window*>(parent_window)->hwnd()\n                    : nullptr);\n  file_dialog->Unadvise(cookie);\n  if (!SUCCEEDED(hr)) {\n    return false;\n  }\n\n  // Obtain the result once the user clicks the 'Open' button.\n  // The result is an IShellItem object.\n  Microsoft::WRL::ComPtr<IShellItem> shell_item;\n  hr = file_dialog->GetResult(&shell_item);\n  if (!SUCCEEDED(hr)) {\n    return false;\n  }\n\n  // We are just going to print out the name of the file for sample sake.\n  PWSTR file_path = nullptr;\n  hr = shell_item->GetDisplayName(SIGDN_FILESYSPATH, &file_path);\n  if (!SUCCEEDED(hr)) {\n    return false;\n  }\n  std::vector<std::filesystem::path> selected_files;\n  selected_files.push_back(std::filesystem::path(file_path));\n  set_selected_files(selected_files);\n  CoTaskMemFree(file_path);\n\n  return true;\n}\n\n}  // namespace ui\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/ui/gpu_completion_timeline.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2025 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_GPU_COMPLETION_TIMELINE_H_\n#define XENIA_UI_GPU_COMPLETION_TIMELINE_H_\n\n#include <algorithm>\n#include <cstdint>\n\n#include \"xenia/base/assert.h\"\n\nnamespace xe {\nnamespace ui {\n\nclass GPUCompletionTimeline {\n public:\n  GPUCompletionTimeline(const GPUCompletionTimeline&) = delete;\n  GPUCompletionTimeline& operator=(const GPUCompletionTimeline&) = delete;\n  GPUCompletionTimeline(GPUCompletionTimeline&&) = delete;\n  GPUCompletionTimeline& operator=(GPUCompletionTimeline&&) = delete;\n\n  // The implemention of completion timeline destruction must await all pending\n  // submissions (including for releasing its own GPU API fences, but also\n  // because code that uses the completion timeline may expect that, since the\n  // completion timeline is generally the only way for it to know when its GPU\n  // objects can be destroyed safely).\n  virtual ~GPUCompletionTimeline() = default;\n\n  // Always >= 1, so objects never used yet may be associated with the\n  // submission index 0.\n  uint64_t GetUpcomingSubmission() const { return upcoming_submission_; }\n\n  // Awaiting completion or updating the completed submission may mark the\n  // device as lost.\n\n  // The implementation is required to call `SetCompletedSubmission` if it has\n  // been made aware that a submission has been completed.\n  virtual void UpdateCompletedSubmission() = 0;\n\n  uint64_t GetCompletedSubmissionFromLastUpdate() const {\n    return completed_submission_;\n  }\n\n  uint64_t UpdateAndGetCompletedSubmission() {\n    UpdateCompletedSubmission();\n    return GetCompletedSubmissionFromLastUpdate();\n  }\n\n  bool AwaitSubmissionAndUpdateCompleted(const uint64_t awaited_submission) {\n    assert_true(awaited_submission < upcoming_submission_);\n    if (UpdateAndGetCompletedSubmission() < awaited_submission) {\n      AwaitSubmissionImpl(awaited_submission);\n    }\n    // Recheck, the wait might have been incomplete if there was an error.\n    return UpdateAndGetCompletedSubmission() >= awaited_submission;\n  }\n\n  bool AwaitMaxSubmissionsPendingAndUpdateCompleted(\n      const uint64_t max_submissions_pending) {\n    assert_not_zero(max_submissions_pending);\n    return AwaitSubmissionAndUpdateCompleted(\n        GetUpcomingSubmission() -\n        std::min(max_submissions_pending, GetUpcomingSubmission()));\n  }\n\n  bool AwaitAllSubmissions() {\n    return AwaitSubmissionAndUpdateCompleted(GetUpcomingSubmission() - 1);\n  }\n\n protected:\n  explicit GPUCompletionTimeline() = default;\n\n  // Call only after a successful submission, so that it can be awaited later.\n  void IncrementUpcomingSubmission() { ++upcoming_submission_; }\n\n  void SetCompletedSubmission(const uint64_t new_completed_submission) {\n    assert_true(new_completed_submission < upcoming_submission_);\n    assert_true(new_completed_submission >= completed_submission_);\n    completed_submission_ = new_completed_submission;\n  }\n\n  // The implementation may call `SetCompletedSubmission`, but is not required\n  // to.\n  virtual void AwaitSubmissionImpl(uint64_t awaited_submission) = 0;\n\n private:\n  uint64_t upcoming_submission_ = 1;\n\n  uint64_t completed_submission_ = 0;\n};\n\n}  // namespace ui\n}  // namespace xe\n\n#endif  // XENIA_UI_GPU_COMPLETION_TIMELINE_H_\n"
  },
  {
    "path": "src/xenia/ui/graphics_provider.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2015 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_GRAPHICS_PROVIDER_H_\n#define XENIA_UI_GRAPHICS_PROVIDER_H_\n\n#include <memory>\n\n#include \"xenia/ui/immediate_drawer.h\"\n#include \"xenia/ui/presenter.h\"\n\nnamespace xe {\nnamespace ui {\n\nclass Window;\n\n// Factory for graphics contexts.\n// All contexts created by the same provider will be able to share resources\n// according to the rules of the backing graphics API.\nclass GraphicsProvider {\n public:\n  enum class GpuVendorID {\n    kAMD = 0x1002,\n    kApple = 0x106B,\n    kArm = 0x13B5,\n    kImagination = 0x1010,\n    kIntel = 0x8086,\n    kMicrosoft = 0x1414,\n    kNvidia = 0x10DE,\n    kQualcomm = 0x5143,\n  };\n\n  GraphicsProvider(const GraphicsProvider&) = delete;\n  GraphicsProvider& operator=(const GraphicsProvider&) = delete;\n  GraphicsProvider(GraphicsProvider&&) = delete;\n  GraphicsProvider& operator=(GraphicsProvider&&) = delete;\n\n  virtual ~GraphicsProvider() = default;\n\n  // It's safe to reinitialize the presenter in the host GPU loss callback if it\n  // was called from the UI thread as specified in the arguments.\n  virtual std::unique_ptr<Presenter> CreatePresenter(\n      Presenter::HostGpuLossCallback host_gpu_loss_callback =\n          Presenter::FatalErrorHostGpuLossCallback) = 0;\n\n  virtual std::unique_ptr<ImmediateDrawer> CreateImmediateDrawer() = 0;\n\n protected:\n  GraphicsProvider() = default;\n};\n\n}  // namespace ui\n}  // namespace xe\n\n#endif  // XENIA_UI_GRAPHICS_PROVIDER_H_\n"
  },
  {
    "path": "src/xenia/ui/graphics_upload_buffer_pool.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/ui/graphics_upload_buffer_pool.h\"\n\n#include <algorithm>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/math.h\"\n\nnamespace xe {\nnamespace ui {\n\nGraphicsUploadBufferPool::~GraphicsUploadBufferPool() { ClearCache(); }\n\nvoid GraphicsUploadBufferPool::Reclaim(uint64_t completed_submission_index) {\n  while (submitted_first_) {\n    if (submitted_first_->last_submission_index_ > completed_submission_index) {\n      break;\n    }\n    if (writable_last_) {\n      writable_last_->next_ = submitted_first_;\n    } else {\n      writable_first_ = submitted_first_;\n    }\n    writable_last_ = submitted_first_;\n    submitted_first_ = submitted_first_->next_;\n    writable_last_->next_ = nullptr;\n  }\n  if (!submitted_first_) {\n    submitted_last_ = nullptr;\n  }\n}\n\nvoid GraphicsUploadBufferPool::ChangeSubmissionTimeline() {\n  // Reclaim all submitted pages.\n  if (writable_last_) {\n    writable_last_->next_ = submitted_first_;\n  } else {\n    writable_first_ = submitted_first_;\n  }\n  writable_last_ = submitted_last_;\n  submitted_first_ = nullptr;\n  submitted_last_ = nullptr;\n\n  // Mark all pages as never used yet in the new timeline.\n  Page* page = writable_first_;\n  while (page) {\n    page->last_submission_index_ = 0;\n    page = page->next_;\n  }\n}\n\nvoid GraphicsUploadBufferPool::ClearCache() {\n  // Called from the destructor - must not call virtual functions here.\n  current_page_flushed_ = 0;\n  current_page_used_ = 0;\n  while (submitted_first_) {\n    Page* next_ = submitted_first_->next_;\n    delete submitted_first_;\n    submitted_first_ = next_;\n  }\n  submitted_last_ = nullptr;\n  while (writable_first_) {\n    Page* next_ = writable_first_->next_;\n    delete writable_first_;\n    writable_first_ = next_;\n  }\n  writable_last_ = nullptr;\n}\n\nGraphicsUploadBufferPool::Page::~Page() {}\n\nvoid GraphicsUploadBufferPool::FlushWrites() {\n  if (current_page_flushed_ >= current_page_used_) {\n    return;\n  }\n  assert_not_null(writable_first_);\n  FlushPageWrites(writable_first_, current_page_flushed_,\n                  current_page_used_ - current_page_flushed_);\n  current_page_flushed_ = current_page_used_;\n}\n\nGraphicsUploadBufferPool::Page* GraphicsUploadBufferPool::Request(\n    uint64_t submission_index, size_t size, size_t alignment,\n    size_t& offset_out) {\n  alignment = std::max(alignment, size_t(1));\n  assert_true(xe::is_pow2(alignment));\n  size = xe::align(size, alignment);\n  assert_true(size <= page_size_);\n  if (size > page_size_) {\n    return nullptr;\n  }\n  assert_true(!current_page_used_ ||\n              submission_index >= writable_first_->last_submission_index_);\n  assert_true(!submitted_last_ ||\n              submission_index >= submitted_last_->last_submission_index_);\n  size_t current_page_used_aligned = xe::align(current_page_used_, alignment);\n  if (current_page_used_aligned + size > page_size_ || !writable_first_) {\n    // Start a new page if can't fit all the bytes or don't have an open page.\n    if (writable_first_) {\n      // Close the page that was current.\n      FlushWrites();\n      if (submitted_last_) {\n        submitted_last_->next_ = writable_first_;\n      } else {\n        submitted_first_ = writable_first_;\n      }\n      submitted_last_ = writable_first_;\n      writable_first_ = writable_first_->next_;\n      submitted_last_->next_ = nullptr;\n      if (!writable_first_) {\n        writable_last_ = nullptr;\n      }\n    }\n    if (!writable_first_) {\n      // Create a new page if none available.\n      writable_first_ = CreatePageImplementation();\n      if (!writable_first_) {\n        // Failed to create.\n        return nullptr;\n      }\n      writable_first_->last_submission_index_ = submission_index;\n      writable_first_->next_ = nullptr;\n      writable_last_ = writable_first_;\n      // After CreatePageImplementation (more specifically, the first successful\n      // call), page_size_ may grow - but this doesn't matter here.\n    }\n    current_page_used_ = 0;\n    current_page_used_aligned = 0;\n    current_page_flushed_ = 0;\n  }\n  writable_first_->last_submission_index_ = submission_index;\n  offset_out = current_page_used_aligned;\n  current_page_used_ = current_page_used_aligned + size;\n  return writable_first_;\n}\n\nGraphicsUploadBufferPool::Page* GraphicsUploadBufferPool::RequestPartial(\n    uint64_t submission_index, size_t size, size_t alignment,\n    size_t& offset_out, size_t& size_out) {\n  alignment = std::max(alignment, size_t(1));\n  assert_true(xe::is_pow2(alignment));\n  size = xe::align(size, alignment);\n  size = std::min(size, page_size_);\n  size_t current_page_used_aligned = xe::align(current_page_used_, alignment);\n  if (current_page_used_aligned + alignment <= page_size_) {\n    size = std::min(\n        size, (page_size_ - current_page_used_aligned) & ~(alignment - 1));\n  }\n  Page* page = Request(submission_index, size, alignment, offset_out);\n  if (!page) {\n    return nullptr;\n  }\n  size_out = size;\n  return page;\n}\n\nvoid GraphicsUploadBufferPool::FlushPageWrites(Page* page, size_t offset,\n                                               size_t size) {}\n\n}  // namespace ui\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/ui/graphics_upload_buffer_pool.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_GRAPHICS_UPLOAD_BUFFER_POOL_H_\n#define XENIA_UI_GRAPHICS_UPLOAD_BUFFER_POOL_H_\n\n#include <cstddef>\n#include <cstdint>\n\n#include \"xenia/base/literals.h\"\n\nnamespace xe {\nnamespace ui {\n\nusing namespace xe::literals;\n\n// Submission index is the fence value or a value derived from it (if reclaiming\n// less often than once per fence value, for instance).\n\nclass GraphicsUploadBufferPool {\n public:\n  // Taken from the Direct3D 12 MiniEngine sample (LinearAllocator\n  // kCpuAllocatorPageSize). Large enough for most cases.\n  static constexpr size_t kDefaultPageSize = 2_MiB;\n\n  virtual ~GraphicsUploadBufferPool();\n\n  void Reclaim(uint64_t completed_submission_index);\n  void ChangeSubmissionTimeline();\n  void ClearCache();\n\n  // Should be called before submitting anything using this pool, unless the\n  // implementation doesn't require explicit flushing.\n  void FlushWrites();\n\n protected:\n  // Extended by the implementation.\n  struct Page {\n    virtual ~Page();\n    uint64_t last_submission_index_;\n    Page* next_;\n  };\n\n  GraphicsUploadBufferPool(size_t page_size) : page_size_(page_size) {}\n\n  // Request to write data in a single piece, creating a new page if the current\n  // one doesn't have enough free space.\n  Page* Request(uint64_t submission_index, size_t size, size_t alignment,\n                size_t& offset_out);\n  // Request to write data in multiple parts, filling the buffer entirely.\n  Page* RequestPartial(uint64_t submission_index, size_t size, size_t alignment,\n                       size_t& offset_out, size_t& size_out);\n\n  virtual Page* CreatePageImplementation() = 0;\n\n  virtual void FlushPageWrites(Page* page, size_t offset, size_t size);\n\n  // May be increased by the implementation on creation or on first allocation\n  // to avoid wasting space if the real allocation turns out to be bigger than\n  // the specified page size.\n  size_t page_size_;\n\n  // A list of buffers with free space, with the first buffer being the one\n  // currently being filled.\n  Page* writable_first_ = nullptr;\n  Page* writable_last_ = nullptr;\n  // A list of full buffers that can be reclaimed when the GPU doesn't use them\n  // anymore.\n  Page* submitted_first_ = nullptr;\n  Page* submitted_last_ = nullptr;\n\n  size_t current_page_used_ = 0;\n  size_t current_page_flushed_ = 0;\n};\n\n}  // namespace ui\n}  // namespace xe\n\n#endif  // XENIA_UI_GRAPHICS_UPLOAD_BUFFER_POOL_H_\n"
  },
  {
    "path": "src/xenia/ui/graphics_util.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/ui/graphics_util.h\"\n\n#include <cmath>\n\nnamespace xe {\nnamespace ui {\n\nint32_t FloatToD3D11Fixed16p8(float f32) {\n  // https://microsoft.github.io/DirectX-Specs/d3d/archive/D3D11_3_FunctionalSpec.htm#3.2.4.1%20FLOAT%20-%3E%20Fixed%20Point%20Integer\n  // Early exit tests.\n  // n == NaN || n.unbiasedExponent < -f-1 -> 0 . 0\n  if (!(std::abs(f32) >= 1.0f / 512.0f)) {\n    return 0;\n  }\n  // n >= (2^(i-1)-2^-f) -> 2^(i-1)-1 . 2^f-1\n  if (f32 >= 32768.0f - 1.0f / 256.0f) {\n    return (1 << 23) - 1;\n  }\n  // n <= -2^(i-1) -> -2^(i-1) . 0\n  if (f32 <= -32768.0f) {\n    return -32768 * 256;\n  }\n  uint32_t f32_bits = *reinterpret_cast<const uint32_t*>(&f32);\n  // Copy float32 mantissa bits [22:0] into corresponding bits [22:0] of a\n  // result buffer that has at least 24 bits total storage (before reaching\n  // rounding step further below). This includes one bit for the hidden 1.\n  // Set bit [23] (float32 hidden bit).\n  // Clear bits [31:24].\n  union {\n    int32_t s;\n    uint32_t u;\n  } result;\n  result.u = (f32_bits & ((1 << 23) - 1)) | (1 << 23);\n  // If the sign bit is set in the float32 number (negative), then take the 2's\n  // component of the entire set of bits.\n  if ((f32_bits >> 31) != 0) {\n    result.s = -result.s;\n  }\n  // Final calculation: extraBits = (mantissa - f) - n.unbiasedExponent\n  // (guaranteed to be >= 0).\n  int32_t exponent = int32_t((f32_bits >> 23) & 255) - 127;\n  uint32_t extra_bits = uint32_t(15 - exponent);\n  if (extra_bits) {\n    // Round the 32-bit value to a decimal that is extraBits to the left of\n    // the LSB end, using nearest-even.\n    result.u += (1 << (extra_bits - 1)) - 1 + ((result.u >> extra_bits) & 1);\n    // Shift right by extraBits (sign extending).\n    result.s >>= extra_bits;\n  }\n  return result.s;\n}\n\n}  // namespace ui\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/ui/graphics_util.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_GRAPHICS_UTIL_H_\n#define XENIA_UI_GRAPHICS_UTIL_H_\n\n#include <cstdint>\n\nnamespace xe {\nnamespace ui {\n\n// For estimating coverage extents from vertices. This may give results that are\n// different than what the GPU will actually draw (this is the reference\n// conversion with 1/2 ULP accuracy, but Direct3D 11 permits 0.6 ULP tolerance\n// in floating point to fixed point conversion), but is enough to tie-break\n// vertices at pixel centers (due to the half-pixel offset applied to integer\n// coordinates incorrectly, for instance) with some error tolerance near 0.5,\n// for use with the top-left rasterization rule later.\nint32_t FloatToD3D11Fixed16p8(float f32);\n\n}  // namespace ui\n}  // namespace xe\n\n#endif  // XENIA_UI_GRAPHICS_UTIL_H_\n"
  },
  {
    "path": "src/xenia/ui/imgui_dialog.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/ui/imgui_dialog.h\"\n\n#include \"third_party/imgui/imgui.h\"\n#include \"xenia/base/assert.h\"\n#include \"xenia/ui/imgui_drawer.h\"\n\nnamespace xe {\nnamespace ui {\n\nImGuiDialog::ImGuiDialog(ImGuiDrawer* imgui_drawer)\n    : imgui_drawer_(imgui_drawer) {\n  imgui_drawer_->AddDialog(this);\n}\n\nImGuiDialog::~ImGuiDialog() {\n  imgui_drawer_->RemoveDialog(this);\n  for (auto fence : waiting_fences_) {\n    fence->Signal();\n  }\n}\n\nvoid ImGuiDialog::Then(xe::threading::Fence* fence) {\n  waiting_fences_.push_back(fence);\n}\n\nvoid ImGuiDialog::Close() { has_close_pending_ = true; }\n\nImGuiIO& ImGuiDialog::GetIO() { return imgui_drawer()->GetIO(); }\n\nvoid ImGuiDialog::Draw() {\n  // Draw UI.\n  OnDraw(GetIO());\n\n  // Check to see if the UI closed itself and needs to be deleted.\n  if (has_close_pending_) {\n    OnClose();\n    delete this;\n  }\n}\n\nclass MessageBoxDialog final : public ImGuiDialog {\n public:\n  MessageBoxDialog(ImGuiDrawer* imgui_drawer, std::string title,\n                   std::string body)\n      : ImGuiDialog(imgui_drawer),\n        title_(std::move(title)),\n        body_(std::move(body)) {}\n\n  void OnDraw(ImGuiIO& io) override {\n    if (!has_opened_) {\n      ImGui::OpenPopup(title_.c_str());\n      has_opened_ = true;\n    }\n    if (ImGui::BeginPopupModal(title_.c_str(), nullptr,\n                               ImGuiWindowFlags_AlwaysAutoResize)) {\n      char* text = const_cast<char*>(body_.c_str());\n      ImGui::InputTextMultiline(\n          \"##body\", text, body_.size(), ImVec2(600, 0),\n          ImGuiInputTextFlags_AutoSelectAll | ImGuiInputTextFlags_ReadOnly);\n      if (ImGui::Button(\"OK\")) {\n        ImGui::CloseCurrentPopup();\n        Close();\n      }\n      ImGui::EndPopup();\n    } else {\n      Close();\n    }\n  }\n\n private:\n  bool has_opened_ = false;\n  std::string title_;\n  std::string body_;\n};\n\nImGuiDialog* ImGuiDialog::ShowMessageBox(ImGuiDrawer* imgui_drawer,\n                                         std::string title, std::string body) {\n  return new MessageBoxDialog(imgui_drawer, std::move(title), std::move(body));\n}\n\n}  // namespace ui\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/ui/imgui_dialog.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_IMGUI_DIALOG_H_\n#define XENIA_UI_IMGUI_DIALOG_H_\n\n#include <memory>\n\n#include \"xenia/base/threading.h\"\n#include \"xenia/ui/imgui_drawer.h\"\n#include \"xenia/ui/window_listener.h\"\n\nnamespace xe {\nnamespace ui {\n\nclass ImGuiDialog {\n public:\n  ~ImGuiDialog();\n\n  // Shows a simple message box containing a text message.\n  // Callers can want for the dialog to close with Wait().\n  // Dialogs retain themselves and will delete themselves when closed.\n  static ImGuiDialog* ShowMessageBox(ImGuiDrawer* imgui_drawer,\n                                     std::string title, std::string body);\n\n  // A fence to signal when the dialog is closed.\n  void Then(xe::threading::Fence* fence);\n\n  void Draw();\n\n protected:\n  ImGuiDialog(ImGuiDrawer* imgui_drawer);\n\n  ImGuiDrawer* imgui_drawer() const { return imgui_drawer_; }\n  ImGuiIO& GetIO();\n\n  // Closes the dialog and returns to any waiters.\n  void Close();\n\n  virtual void OnShow() {}\n  virtual void OnClose() {}\n  virtual void OnDraw(ImGuiIO& io) {}\n\n private:\n  ImGuiDrawer* imgui_drawer_ = nullptr;\n  bool has_close_pending_ = false;\n  std::vector<xe::threading::Fence*> waiting_fences_;\n};\n\n}  // namespace ui\n}  // namespace xe\n\n#endif  // XENIA_UI_IMGUI_DIALOG_H_\n"
  },
  {
    "path": "src/xenia/ui/imgui_drawer.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/ui/imgui_drawer.h\"\n\n#include <cfloat>\n#include <cstring>\n\n#include \"third_party/imgui/imgui.h\"\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/clock.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/ui/imgui_dialog.h\"\n#include \"xenia/ui/ui_event.h\"\n#include \"xenia/ui/window.h\"\n\nnamespace xe {\nnamespace ui {\n\n// File: 'ProggyTiny.ttf' (35656 bytes)\n// Exported using binary_to_compressed_c.cpp\nconst char kProggyTinyCompressedDataBase85[10950 + 1] =\n    R\"(7])#######LJg=:'/###[),##/l:$#Q6>##5[n42<Vh8H4,>>#/e>11NNV=Bv(*:.F?uu#(gRU.o0XGH`$vhLG1hxt9?W`#,5LsCm<]vf.r$<$u7k;hb';9C'mm?]XmKVeU2cD4Eo3R/[WB]b(MC;$jPfY.;h^`ItLw6Lh2TlS+f-s$o6Q<BaRTQrU.xfLq$N;$0iR/G0VCf_cW2p/W*q?-qmnUCLYgR`*1mTi+7.nT@C=GH?a9wps_2IH,.TQg1)Q-GL(lf(T(ofL:%SS%MS=C#jfQ$X7V$t'X#(v#Y9w0#2D$CI]V3N0PRAV3#&5>#X14,MZ[Z##UE31#J&###Q-F%b>-nw'w++GM-]u)Nx0#,M[LH>#Zsvx+6O_^#l(FS7f`C_&E?g'&kcg-6Y,/;M#@2G`Bf%=(`5LF%fv$8#,+[0#veg>$EB&sQSSDgEKnIS7EM9>Z,KO_/78pQWqJE#$nt-4$F&###E`J&#uU'B#*9D6N;@;=-:U>hL&Y5<-%A9;-Y+Z&P^)9<QYN8VQM#S/Mx?c(NdBxfMKpCEPX;*qM$Q?##&5>##._L&#awnk+ib*.-Z06X1>LcA#'rB#$o4ve6)fbA#kt72LN.72L=CG&#*iX&#90Wt(F,>>#_03:)`(@2L@^x4Sj2B@PN#[xO8QkJNRR()N@#f.Mr#)t-L5FGMm8#&#/2TkLi3n##-/5##MwQ0#EB^1v&ols-)-mTMQ@-##qlQ08*lkA#aNRV7KRYML%4_s[kNa=_0Z%7Nd4[3#S@1g_/v`W#'`Fm#<MOe#_=:n#Lx;%$b(w,$g&J1$N9>B$(Q#n$oqvc$&Svv$`,TM%,PS=%OeJE%s+]l%A=Fe%']K#&7aW5&O-Nd&q&>^&GZs1'w.bA'c>u>'B-1R'%gJ.(t1tx'_jH4(iNdc(GJ*X(l`uf(^Wqr(-=Jx(=[%5)')Gb)$1vV)57Vk),8n<*BYl/*qs%]*OI5R*Fkgb*H<+q*TQv(+Xak6+?C@H+5SaT+o2VhLKd)k+i$xl+4YW=,sJd,,C*oT,Eb:K,mSPgLsF8e,Z$=rJ[<5J`E:E&#k&bV7uVco]JfaJ2M'8L#xArJ27FJx?Zgt%uov/vZ@?Gj:Kl;,jo%*K;AL7L#7G'3/J(*t.5xO+/0r+N/%ipJ/Bq_k/A>4Y/^iwl/%K:K0[HW=04D'N0wQq_00Kjt0]NJ21?p?d1T:=Y1e*&i1HLr@28x*:29A[L2Mpd%3pFIp2igO+3aXRX3M#PN3uY$d37p2=4c,s54.3SI4v0iw4JqN65G$S*5rh<65ld7E5.IRt5.f-16A/U(6IoFR6Nj7I6Y3i[6>s#s6EF=P90>=W6-Mc##=(V$#MXI%#^3=&#nd0'#(?$(#8pm(#HJa)#X%T*#iUG+##1;,#3b.-#C<x-#Smk.#GdrI3TCR/$3Ds9)?^k-$&pG/?Hn.1#rPr.LR;NHZYu-A-muPG`uqJfLK_v>#$i0B#'2[0#s6aW-AS*wp1W,/$-pZw'%]#AOC+[]O>X`=-9_cHMN8r&MsKH##77N/)8r_G3=^x]O].[]-/(pI$^=Kn<00k-$t`%/LDK5x76,G&#$or>I?v+sQ;koJM>,CS-14,dM,Hv<-cLH?01FQ*NGx0='H9V&#;Rov$8ooX_i7d;)]]>R*sVi.Lt3NM-$@dXM:uSGMDn%>-30[b's6Ct_.39I$3#bo7;FP&#YKh9&#d)KE$tok&L1tY-sTf2LP]K<Lsjr>&s9L]u-c4Au9*A>-<'3UN-PZL-NIV+85p0eZ3:.Q8bj1S*(h)Z$lel,MX_CH-.Nck-(veHZwdJe$ej+_frio0cKB$HFtRZ>#DiaWqFq7Q84okA#tiUi'Qumo%<]Xl8As(?@iLT[%tDn8gsDGA#hDu-$+HM3X_?@_8:N+q7v3G&#a7>0H3=t-?ZKm.HK+U58E/.`AcQV,tUd+Z-$fQ-Haotl8Zx2Fn)&UQ8c6E&docd.%&^R]u)x:p.N*wIL8+fsrk+5<MR@v58X^?xKxUi^6A``6MU-lPSgJ$##P*w,v%,[0#Rhi;-`2$I%*nhxu67Np.(AP##Y+YB]LD_K*NPG])IsiA#Dqi05siIfL;G;QMM8-##?bu&#,>###>jq:9%/v2;f`?J8fDrG%fmWw9gl'ENgjG:,EC%<-WW5x'6eaR86kf2`5alP&u]::.'a0i);c)3LN3wK#gZb19YvMa,?IggL3xoFMTK_P85<B9&NP'##mF#m8$6<QhEn>.)0xLp7gw]m_oM++.`=JfLm)1#.gGKd4N^@N%M'Np7ZO:k)VTqt%EO`gurjj;-0r%;%I<Ga>'M,W-(hdnXP4bA,%GLp75c<LYo5oMiXKh+0O>`QUWh<_&.ZoDuWmL<LKx(B6eVxZ9,V@Z76OM=-Ke??.]RXk:UD`?%^FHM&LMQY-SJmDc?1&Z$gq`gMi.(58gkcA#l5#N9#9Z;%Y*K-;8K?E5#0]guh&tP8m7:f[<f568<JtpBUNiF*4db;-[s[n&9o`Y-R7B$L4*XQ8t$,?.Vqa_&fQB?-/]2u$#JUp7S+5wp=25?R6W5@MA)jB%lpNp7^'9U)jNtKNBU0I,'XFQ/&&###'><h#I[*T.73rI3#1[m%:TUv[NC90/Q]i.L(dt_/1dC_&8QFeFKgL<L+qdU2f$;R3rftK3GiIn&ddcA,CDkGM'CYcM#c[#%(MgTTc645&L(T&#b:o<<l/tDYp$M3<QQGb@vjfe$i@nEI?ZKal44)=-T4sP-u0@q$:-d9`EQjDNuagC-_1X_$PQ`&#g1iJs&h'a)J`C<-M`B-'sB1tL>CVJ+7:P&#Wj7n$+8sb<:+R.Qx7m<-T`&0%3TK<-h.oN'eSYW-g7D^6mu<W)>7Rc;:cIH%5hWHX9uCq'RC/2'GZZ(=:.$ekS>k((WP_=-,8dT%;]DeHjNJ'HOsgj-vUa$UFQO68Ic+k2HwQ'(0Kgn8V=:</jUcP(Nir;JdYO&/+mZe;Cmw@^[x8IH2i<w-u$Hq7lB)KE@V)7)'R4tQc*Fv%0DTgLvgjIL%Xi.Lb+pE='Rf3M_o>*(iM]?[]-#9)#tb,;mdUw.SB+-8M*cj)1)A@;:O#kipW<78t=vERat3KN(RZ&%0)3XJh/1q+<E3'mJ9?m'as868qukA#>'_5'r1GX`4;kNbkh&@-HCp[+c+Z68=Z9:BM#Jn$R+0Au6A)K:YXr1d^8ILE65V'#Y_%n8Mc`3r:>H9%PMhj9GVCh3F3wm81EG&#,`**<3AEYLN1pA#>q0p&(^?@'Bl+&>klY'vO%co7juS^d)a#9%=&m9.m`0i)rQNm8*GF]uI9+W-wmw5_L07xLC8qT;`9%90i^Gx'abQp7)>5wLq3n0#/U0V8+B^G3%3,0:3w<W8.p?#+Hp]p7*MXK3JhpgLE-q8P&(mW-dxr>R]4fJ(d%2N9Z-r_&7rjQS<XpW&&A-W--@;qi&29tUa5N&#gB)gL8,Ap-elVKW5TwR*0l;wPAjbS(()Eb<iU(Y&3:8,($2)49;(fvnOpTx=Jx#6qqjL<LA?*l2PS&i;d2W&HBfj.L6$[J8b(%df[2Q:8bDew'2N#k9gbY2VAHX*2L0,rBcSWf%AZbqKY9g8)k4ZQ_8dP^0#$$3:,hwW&^?Ie-:Z&Eu:RL>,sM;n9g#>ve^2SK)71JTRxD)o0@1wWA2#E;<PRZ;%>xov>0f^-QQQYVBeT+?-7kMD5d0B#QZAW0:Z<A^HCkC&Oe4LI89xAs997Um.Xi,FNt-iE)6=nm8<>jUK[OZi&61L&#>CCj;r]/RLH'(j>+$P-R9bF69`%f@[p-JZ*.hnp7;-ge$NSi?-qx8;-V<ZA+1q8N9tGRWAv9j+(7=DHFC=[Z:UVgY(=5)N<)b)OBsUeA,RgI#P76ZE,3tQnTSSff&N,76LMX[r;%'1'#(AP##r-7G;4akA[ve^@%sVi.LS_r&&;4qgL>]Z##,B?nrCn,)'(Q%a-sI^W&9'i&#SrRfL`Zwe%k.jA,xf:-%<Gf&#_:JfL:JQi*c/Z)<'7(a6g/mx'aPc689TO]uo<MU'5+WZPi.cE<g(_>$+:t>-v^)'%of?pg=`N_*o'w<LJb*=-q`6]'Fh0BI@9[&%7bI4VM$D*'C[:RaFCI<-v=B[%7hep7=wRLa#E-v.K#gmA.2(LNqLC2)bqDp7.5HZAm;&_8ekx;8FmR/&mTV:@#CTp9:td>)3(ip7XqF]uN-Fj9l=K/+sAH^*I=5qBCRt-,T163BO%ov7%,sb&T=XaZ$(#GM0#Qp%a]Cs7HNbxum=g@>wb%?7N:Fk'0PYRhUv-tLWr+P(lLM/:9N*H=KRZT'Pf2;.@2<)#pVl1MwLk0&;tUAuP3w.Le.]T/*Mc##O->>#9NCU.73rI3ZbA;%^xT3BS2L#$uLjf%53Kt-2SJMBFZ.m0cmcPS)aX%(c]Yg<^[G6;$W(8*2&$X->B+kk^$D'8E@P&#I-nT'u5pm8u;Be=AJ8F-T6po)A:&?-CPcd$rDtJjLUsv'7Hx_onecgHu78k:D#]4;tb)$-UHAm8h;2c>8J<@.(W=p&oVoY?&@+w7-)ri'bb=+<b2:*S]stQ_=5>X:<Q(Ka=4)=-+'h&,:TKs-#>#29.*DW/tNqT&QAl29xj+AuD:*+lnW]D,3l6<-PX9YYw)vX&=WuT8H=AbIs[`Am2xcW-jqbn*cZV%_t/Z&QpvGJ(i2.^==iWDurfn:Ml;-##/-U%)x$+1:lROdt*mpM=i4/)Zdr'H'P[N>-EKHl$hUvf:P'Q3`u*IM&uZA39^0F[pUB+n8hq+?I`L'-)2>Cq71g/6(?(oR&iBRiLr7w;-[HuL3u6e2&V:QjBJ:9iuF8.a<ARjp'0Abr&l&:P9L3B:^7aj(8PK:(QkKLTMsCt?'Yqkd4'DW-2%^Bq7xR[[%i_Nh11uZp7LW^G3(Y0(=DRYF%#jl<-h&*u$;S^,Mw?<K**]I^FG,614Dd@N%$;Ed;0pkKNJl:a%rL@Y-&5n0#TD,##%5w.LCn^-)uH90:H;lA#;qp1(J7rLExpE]F=%,(HFI8V%095g)3fBemf@#kGO5###'5>##PHT<-.4r1&,qBE<es9B#LG'>#LK,W-fIO4kX@%%#tUB#$57>uHN^KeX'-cD)d.s*<i5qHQhe%D<KIF&#_UK]u**<gLY7<C0t#jgLqWQ>#P<Eh#$`b3(.hFQ/0rC$#P9cY#]TJLC,=5(H)L2Y&SE^=-6hk.?lG8<9c6Bt+=B`&#Ee<wTFMGT&2P###3XG$>2+c&#ok:/:3l(RsPD###2d#<-%,.t$5@HgL/mu<+PXhv[Bgb4)GO;eMZQMr?,tXvIIe;t-P2l?G2j1v^)3l$'mEa68K1l@7.`V[GG#)C]Y&f;]?OM>&x]i.L(/5##BO+k9Xp0B#NS9>#+7E<-d]nl$Yw6v9YK*6(sxGug]oko$_'l_-Ai%RMq<&_8o2@2L@@AS)c8(<-c&r]$J9oq7g?(m9LIS;H-)KfF@qVI*^ACO9fKc'&6k/q7RD&Fe&*l2LSQUV$vC#W-lwf&v:'n]%D4xVH4&(^#0jg<-@r'29EQT_6Gx)Q&':nKC>s6.6*;X^ZH.->#>atJC6`hJ>NjO?-^5l-8Tj72LFIRp7,:<Q3$)F/)5Wu>-.wruM;q0)(YHWp7@i('#'2,##8ZDK<cUb5A@]kA#9fRjNh6]0#&P[g)P`0i)0d](%^m[v$q)TVHKS9.v<%SR8<<9*#2<_C-7)hg'Orqs-QEsFMp=h19vO%o<M5,##n[li98-aQL[3=G%6J>M9dvR3kYKd&#V(f+MR?xK#liDE<[/RM3M7-##1na_$+q)'%xheG*DsXbN^BxK#R90%'vrIfL.r&/LT*=(&A's2;O56>>/jsX_Z_+/(NSi.L>jEG']iNUR238^&?MR49ne<Gm'IVQ(((wQ8*9Xd=.H6h'lv049,uPGG:Jw_-Oghr?PvblrD)TJGlq=42p_N^-e59I$%]4d<r%wd+^1Iu'n94395H72LcojA#^QWp7i0/kXEFEm8TjjM3j^an8JUbA#FS0a=l6G]uVMHW-P-t2DpAqa)1xF&#l.HB,)'sFl=TA_%6DPT^$ok%(vc<'#Z'[0#SHW-$2W(1:C,QD.Ln5%()ocjK+uZH+o[2n<rh/:)jPHmk0S_GDMgTd4o'1c&X(ek90sTn`pij7'7_j:HY/6ElAGdvDUpK#$mgJH+.`]&=*6J_60lSc&>A>.M5N=h#=eq:T?k)/:;SF&#;k-gLXL0e,e6JdDNHj?@ihvi&wNT-;6`E.FAl):%3WK<-:EI+'^([:.+lQS%?_,c<8L[W&T7-##`QHXA=(xn&Yqbf(kg<LWVZx2&&]?68vN6pgnUIu'M6YE<i(72Lgs00:xi8u_)F.^'J5YY#)PjfL=w;/:ilAqBqSBt7r[b&#hEqhLJLvu#DO*e*),8Z>e2-g)[OksHT*bm+Do5IM<_jILK4Pv'=u5a*E#Z^FHmn),Dheq.+Sl##04kWoAl[W]rYHI%+d@a-.dm<%#1[,MtRBt)O(35&>-f;-J=<n)/on,48,Ut':/;3t&u5*P`^0d%5P'gLvk,6+)>.g:(xp/)U]W]+RCwgCbE0#Aes-h%vr_BF0;=K34Yv',/GoEYQQ-U&5&Aw>]ewGt?k,l$1oR8VCkF<%+nTH4Z8f%/M&dQ/(2###S`%/L*cS5JX&V_$iac=(LG:;$ZcRPA.$+bHU7-###c7^O1[qS%)S#qT=lI(#=,o_Q.^r#(w1I<-+PK`&,o'^#GhsWQt6j(,]_<g:%t)qK.h`u&QggR8p0S`ABAla*GK[,MtDNg8IUL^#'5>##IN]p7i4mFuXih@-t=58.1&>uu$&h2`2H:%'T):wPGJuD%5DJTIUXbA#pvRdM=WcO-uhKj%0ej?Ppr<A+6o*KWQJ,x)lE59)+HL$Gs2J?n(Y]9@3*?$(x%Id;IZO]un4WJ%ncg;-3Fd<-;Q*((VD,C'q3n0#J,,##Jw@D<aNO&#PYkb$S(Fk4:Ru&#()>uu9k,h%cwfi'B.x`=Tg^d4%45GM@iZQ'YGHP9(MGGG<CD?@lb`^)j()<-X,r]$5rJ&voRl5(4@m=&l#I]uFX9b<,#hdOsBqA.&?sI3w+K?I(kEe$PLRN9De:'#6]###QfB##:a;l9Z^:m9;pd,k#en3)wXN*<W.r_&Y]$O9+]^8iC,`l--hN,m%VO;&@RG&#]*J788ix?7HZU18T0Y(f;F@q7O51Llmr1hYQw<kkDqkjDx&AKu$-a&#2f<p^oXAZ$`([K:&tF?.T;a38igw-+BB]c;N)man%)(gL$V0`$ilcp7Clp/NCP,3)Ev$&41Nw`*@0.9@iN7rqS]Ll)H)1W-]3n0#`6%_8I;TGlGR1H-w,TRLb8jn'+.UE,fK^n&SO7m83wgDlG=](WrCeA%ioD(=;+<r7r)`0G8MT&#Dfdf.>vbG3jZJp7FAeEP&e<tDI$f[@Kn,$%6M.M:12f4V.,j80DmpKC;'+-tl;rn-okgdkq5%Y%pBmp@r,g2`PR-N9&<D^63_RR(L<*b*bP5<-s>PL'8k8k91/D?[-7(&(m@?q7kdH)cDfYN)@9TDSe;DG)uQh&#k+'p74N)^ohl=,'';[P9_kisBjgU,&g>Ok2=4'K%cl@Nii)3q-_.1U9,.QL/2&>uuF*^TVA7Bs&;W36AZ(j'muJG4M_<bc%_Q?6']Td`*<g-[-%u,N<Tcm(F,rGF>CpO4)0kNeFKG2V?'jkgNvkK<&MQU+<[xKVaY>/T@&Jp'HtA$a&5U&R8bs:RWYiYeQu4k(NgxE$%X6V&#X+3O-u_dQ8/_-ldRf1W-2dpGe*E^r7d>S^JisoC%s`^68r*d;))C[p7W?<McU=n%P4'Ho$8VG29mZvQ:H1[^&foZaE#jbxu$lZp7%2s&-9rJfL4s*C8mlB#$P:=QSF-*j$[A'aNtobb.Z'[0#kQ*n%:i4%(JN#,2#9bp7q>[6OfId2P&;Hr7cpB#$X8-l93rg996Nb4):v0<-Y7`[eEdoW*l/xNN9<&v,%nra*-?078.F8o8aP+Au]ZX2L:1Bn*fuW1;N&&3M5U#x'<w:u??w]RjZCNv'[c)BFnoDbPf][`*(pBQ8mcN)YW/b,'^Y(<-QIIZ*eRrP8r=24D<.#L%vXMnNG_`78f:HO*m$N$-PMR8`[9jb8tBuTW.WqG`++ho%pI<#6EZA`X;)&G;EY+Aus#XjBZXG&#j[*RBY<-El+AI':)Z.=`]4i78Z]]2`=R$m8,@^2`Qs849_LfH[(X+`)X0-2(a+@>-KA$ZAf0YS&_;AL;>g6pgV==5A6R.db1Wbs'MC9-)5u:ENe7-##H:O&=$^]712c&gL,%,cM+4(5SmwUF<qhvhO+X[b+rh(hL5:Tf$^gs]OK?Qd&kJ1>-x-*j0c-G(-9Y`N*$0_k2ece`*#JdQ8Fk=9W'&%kCjYeaHC@nL-$[d;B*<^#DuHQNYF#>Q8L*fW]8cJX/,CWR83+pVooXXk'1HCL:6I%T(`2VY(An&R8?uN]'WLJM'$/*JLXm@8JhS](6l0tv'x06oDXFC'%=7CP8fCKetbqp0%;=0iC/kRkrjK5x'qtD_Or/9x:VWF&#<r)<-rHR.'>LW`<04=q0E8/c&hItt'a8J0)kY#Q8nnV78o=6UT`-1t%-FuN:xA1J[Oq`p77%72L9$2<?vo]Q(S/,`%VaGY>-'[qp)mH^*[eL]u/o(HF0iu.-vwoW_wn=O:[3NPcDh)Zn)ex[T%LaP-VC%f$36t1CvSw,X>^>Z4q=Z58]evqT5.xP33h839>So>InZb%=w=>F%$Mdm_FjSEEwGJMN3B,-(b@mHM;uFr$r&V@-Vp;m$bF6XJbM0-'-PgQJ=Z.lBE?=x>YBPX9N3?&+0)xm'wQsH$K]MP9cmv9glREr(>=n-k;/6t$r]2@-Ips&d-8oS@pb5r@lwcQ:aum))u=KkrVv[n>Lu,@RvlOE.^Puk;v4[+9.2A2LrPn'&]/?pg&.Rq$9-vc6BUpD*8[?:BmMq*9.HFt_QSl##O->>#b7278#r%34A$;M%+=hlTsVPp'X8N&Zu/To%mDh:.,umo%5VIl90wn5F9;_OFJ?=?JbjcX($^)Rj2vao7W9Udkr[F%8:@(4F@5W5_oHOG%M4Y@G:P+JGUsRA%UeO-;Tr+OOHi8i:F$aC=K@82L(__3:>H-g)S65e;B@:xnT_x0+x,2N:rmL4)VtH#)NF7WAs,Zx'uQpE<NJEaGq^'%'j%gpB;Je(-/`%=-8`&.6X/4S-FK=f'F>U78_TX=?1s?cZYlBd'<IaN9E=Ws^iqV_,Yei68%U@9KA-Rb'2WK78hIZ;%DkE2LDfvd(M%Jn&KSC<-mSZ[$ca<@9#`'^#nx(X-BLpU@YmB#$0Q?d8/4hFco+Eu$fY%F<]%*?@FBA,;vV@-Fo:Cu047V2B18,'$Rqmr*$J4gU<7(p(Y5:wPn;v&'C(^('$9#v/1<#e+K2ta*SV0<ISF0'HPQB%oF'7F'IZ'N9$/+8Vf[VC2)&4V&7rpgL<=XD+`2aO;_((e*FKK=-J.fQ-]HGM.IhF(=2tJQ(C9ES.qL)*NpYd.:b[+Au-g([I%QL@-cVfJ8D>BugDAVB-vlc_fV5gc*s&Y9.;25##F7,W.P'OC&aTZ`*65m_&WRJM'vGl_&==(S*2)7`&27@U1G^4?-:_`=-+()t-c'ChLGF%q.0l:$#:T__&Pi68%0xi_&Zh+/(77j_&JWoF.V735&S)[R*:xFR*K5>>#`bW-?4Ne_&6Ne_&6Ne_&lM4;-xCJcM6X;uM6X;uM(.a..^2TkL%oR(#;u.T%eAr%4tJ8&><1=GHZ_+m9/#H1F^R#SC#*N=BA9(D?v[UiFk-c/>tBc/>`9IL2a)Ph#WL](#O:Jr1Btu+#TH4.#a5C/#vS3rL<1^NMowY.##t6qLw`5oL_R#.#2HwqLUwXrLp/w+#ALx>-1xRu-'*IqL@KCsLB@]qL]cYs-dpao7Om#K)l?1?%;LuDNH@H>#/X-TI(;P>#,Gc>#0Su>#4`1?#8lC?#<xU?#@.i?#D:%@#HF7@#LRI@#P_[@#Tkn@#Xw*A#]-=A#a9OA#d<F&#*;G##.GY##2Sl##6`($#:l:$#>xL$#B.`$#F:r$#JF.%#NR@%#R_R%#Vke%#Zww%#_-4&#1TR-&Mglr-k'MS.o?.5/sWel/wpEM0%3'/1)K^f1-d>G21&v(35>V`39V7A4=onx4A1OY5EI0;6Ibgr6M$HS7Q<)58UT`l8Ym@M9^/x.:bGXf:f`9G;jxp(<n:Q`<rR2A=vkix=$.JY>(F+;?,_br?0wBS@49$5A8QZlAQ#]V-kw:8.o9ro.sQRP/wj320%-ki0)EKJ1-^,,21vcc258DD39P%&4=i[]4A+=>5ECtu5I[TV6Mt587Q6mo7tB'DW-fJcMxUq4S=Gj(N=eC]OkKu=Yc/;ip3#T(j:6s7R`?U+rH#5PSpL7]bIFtIqmW:YYdQqFrhod(WEH1VdDMSrZ>vViBn_t.CTp;JCbMMrdku.Sek+f4ft(XfCsOFlfOuo7[&+T.q6j<fh#+$JhxUwOoErf%OLoOcDQ@h%FSL-AF3HJ]FZndxF_6auGcH&;Hggx7I1$BSIm/YoIrVq1KXpa._D1SiKx%n.L<U=lox/Ff_)(:oDkarTCu:.T2B-5CPgW=CPh^FCPidOCPjjXCPkpbCPlvkCPm&uCPn,(DP@t>HPA$HHPB*QHPC0ZHPD6dHPD3Q-P_aQL2<j9xpG';xpG';xpG';xpG';xpG';xpG';xpG';xpG';xpG';xpG';xpG';xpG';xpG';xpCUi'%jseUCF3K29]cP.PK)uCPK)uCPK)uCPK)uCPK)uCPK)uCPK)uCPK)uCPK)uCPK)uCPK)uCPK)uCPK)uCPK)uCPT$au7ggUA5o,^<-O<eT-O<eT-O<eT-O<eT-O<eT-O<eT-O<eT-O<eT-O<eT-O<eT-O<eT-O<eT-O<eT-RWaQ.nW&##]9Pwf+($##)\";\n\nstatic_assert(sizeof(ImmediateVertex) == sizeof(ImDrawVert),\n              \"Vertex types must match\");\n\nImGuiDrawer::ImGuiDrawer(xe::ui::Window* window, size_t z_order)\n    : window_(window), z_order_(z_order) {\n  Initialize();\n}\n\nImGuiDrawer::~ImGuiDrawer() {\n  SetPresenter(nullptr);\n  if (!dialogs_.empty()) {\n    window_->RemoveInputListener(this);\n    if (internal_state_) {\n      ImGui::SetCurrentContext(internal_state_);\n      if (touch_pointer_id_ == TouchEvent::kPointerIDNone &&\n          ImGui::IsAnyMouseDown()) {\n        window_->ReleaseMouse();\n      }\n    }\n  }\n  if (internal_state_) {\n    ImGui::DestroyContext(internal_state_);\n    internal_state_ = nullptr;\n  }\n}\n\nvoid ImGuiDrawer::AddDialog(ImGuiDialog* dialog) {\n  assert_not_null(dialog);\n  // Check if already added.\n  if (std::find(dialogs_.cbegin(), dialogs_.cend(), dialog) !=\n      dialogs_.cend()) {\n    return;\n  }\n  if (dialogs_.empty() && !IsDrawingDialogs()) {\n    // First dialog added. !IsDrawingDialogs() is also checked because in a\n    // situation of removing the only dialog, then adding a dialog, from within\n    // a dialog's Draw function, re-registering the ImGuiDrawer may result in\n    // ImGui being drawn multiple times in the current frame.\n    window_->AddInputListener(this, z_order_);\n    if (presenter_) {\n      presenter_->AddUIDrawerFromUIThread(this, z_order_);\n    }\n  }\n  dialogs_.push_back(dialog);\n}\n\nvoid ImGuiDrawer::RemoveDialog(ImGuiDialog* dialog) {\n  assert_not_null(dialog);\n  auto it = std::find(dialogs_.cbegin(), dialogs_.cend(), dialog);\n  if (it == dialogs_.cend()) {\n    return;\n  }\n  if (IsDrawingDialogs()) {\n    // Actualize the next dialog index after the erasure from the vector.\n    size_t existing_index = size_t(std::distance(dialogs_.cbegin(), it));\n    if (dialog_loop_next_index_ > existing_index) {\n      --dialog_loop_next_index_;\n    }\n  }\n  dialogs_.erase(it);\n  DetachIfLastDialogRemoved();\n}\n\nvoid ImGuiDrawer::Initialize() {\n  // Setup ImGui internal state.\n  // This will give us state we can swap to the ImGui globals when in use.\n  internal_state_ = ImGui::CreateContext();\n  ImGui::SetCurrentContext(internal_state_);\n\n  auto& io = ImGui::GetIO();\n\n  // TODO(gibbed): disable imgui.ini saving for now,\n  // imgui assumes paths are char* so we can't throw a good path at it on\n  // Windows.\n  io.IniFilename = nullptr;\n\n  // Setup the font glyphs.\n  ImFontConfig font_config;\n  font_config.OversampleH = font_config.OversampleV = 1;\n  font_config.PixelSnapH = true;\n  static const ImWchar font_glyph_ranges[] = {\n      0x0020,\n      0x00FF,  // Basic Latin + Latin Supplement\n      0,\n  };\n  io.Fonts->AddFontFromMemoryCompressedBase85TTF(\n      kProggyTinyCompressedDataBase85, 10.0f, &font_config, font_glyph_ranges);\n  // TODO(benvanik): jp font on other platforms?\n  // https://github.com/Koruri/kibitaki looks really good, but is 1.5MiB.\n  const char* jp_font_path = \"C:\\\\Windows\\\\Fonts\\\\msgothic.ttc\";\n  if (std::filesystem::exists(jp_font_path)) {\n    ImFontConfig jp_font_config;\n    jp_font_config.MergeMode = true;\n    jp_font_config.OversampleH = jp_font_config.OversampleV = 1;\n    jp_font_config.PixelSnapH = true;\n    jp_font_config.FontNo = 0;\n    io.Fonts->AddFontFromFileTTF(jp_font_path, 12.0f, &jp_font_config,\n                                 io.Fonts->GetGlyphRangesJapanese());\n  } else {\n    XELOGW(\"Unable to load Japanese font; JP characters will be boxes\");\n  }\n\n  auto& style = ImGui::GetStyle();\n  style.ScrollbarRounding = 0;\n  style.WindowRounding = 0;\n  style.TabRounding = 0;\n  style.Colors[ImGuiCol_Text] = ImVec4(0.89f, 0.90f, 0.90f, 1.00f);\n  style.Colors[ImGuiCol_TextDisabled] = ImVec4(0.60f, 0.60f, 0.60f, 1.00f);\n  style.Colors[ImGuiCol_WindowBg] = ImVec4(0.00f, 0.06f, 0.00f, 1.00f);\n  style.Colors[ImGuiCol_ChildBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f);\n  style.Colors[ImGuiCol_Border] = ImVec4(0.00f, 0.35f, 0.00f, 1.00f);\n  style.Colors[ImGuiCol_BorderShadow] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f);\n  style.Colors[ImGuiCol_FrameBg] = ImVec4(0.80f, 0.80f, 0.80f, 0.30f);\n  style.Colors[ImGuiCol_FrameBgHovered] = ImVec4(0.90f, 0.80f, 0.80f, 0.40f);\n  style.Colors[ImGuiCol_FrameBgActive] = ImVec4(0.90f, 0.65f, 0.65f, 0.45f);\n  style.Colors[ImGuiCol_TitleBg] = ImVec4(0.00f, 0.40f, 0.00f, 1.00f);\n  style.Colors[ImGuiCol_TitleBgCollapsed] = ImVec4(0.00f, 0.33f, 0.00f, 1.00f);\n  style.Colors[ImGuiCol_TitleBgActive] = ImVec4(0.16f, 0.65f, 0.00f, 1.00f);\n  style.Colors[ImGuiCol_MenuBarBg] = ImVec4(0.00f, 0.35f, 0.00f, 1.00f);\n  style.Colors[ImGuiCol_ScrollbarBg] = ImVec4(0.00f, 0.40f, 0.11f, 0.59f);\n  style.Colors[ImGuiCol_ScrollbarGrab] = ImVec4(0.00f, 0.68f, 0.00f, 0.68f);\n  style.Colors[ImGuiCol_ScrollbarGrabHovered] =\n      ImVec4(0.00f, 1.00f, 0.15f, 0.62f);\n  style.Colors[ImGuiCol_ScrollbarGrabActive] =\n      ImVec4(0.00f, 0.91f, 0.09f, 0.40f);\n  style.Colors[ImGuiCol_PopupBg] = ImVec4(0.20f, 0.20f, 0.20f, 0.99f);\n  style.Colors[ImGuiCol_CheckMark] = ImVec4(0.74f, 0.90f, 0.72f, 0.50f);\n  style.Colors[ImGuiCol_SliderGrab] = ImVec4(1.00f, 1.00f, 1.00f, 0.30f);\n  style.Colors[ImGuiCol_SliderGrabActive] = ImVec4(0.34f, 0.75f, 0.11f, 1.00f);\n  style.Colors[ImGuiCol_Button] = ImVec4(0.15f, 0.56f, 0.11f, 0.60f);\n  style.Colors[ImGuiCol_ButtonHovered] = ImVec4(0.19f, 0.72f, 0.09f, 1.00f);\n  style.Colors[ImGuiCol_ButtonActive] = ImVec4(0.19f, 0.60f, 0.09f, 1.00f);\n  style.Colors[ImGuiCol_Header] = ImVec4(0.00f, 0.40f, 0.00f, 0.71f);\n  style.Colors[ImGuiCol_HeaderHovered] = ImVec4(0.00f, 0.60f, 0.26f, 0.80f);\n  style.Colors[ImGuiCol_HeaderActive] = ImVec4(0.00f, 0.75f, 0.00f, 0.80f);\n  style.Colors[ImGuiCol_Separator] = ImVec4(0.00f, 0.35f, 0.00f, 1.00f);\n  style.Colors[ImGuiCol_SeparatorHovered] = ImVec4(0.36f, 0.89f, 0.38f, 1.00f);\n  style.Colors[ImGuiCol_SeparatorActive] = ImVec4(0.13f, 0.50f, 0.11f, 1.00f);\n  style.Colors[ImGuiCol_ResizeGrip] = ImVec4(1.00f, 1.00f, 1.00f, 0.30f);\n  style.Colors[ImGuiCol_ResizeGripHovered] = ImVec4(1.00f, 1.00f, 1.00f, 0.60f);\n  style.Colors[ImGuiCol_ResizeGripActive] = ImVec4(1.00f, 1.00f, 1.00f, 0.90f);\n  style.Colors[ImGuiCol_Tab] = style.Colors[ImGuiCol_Button];\n  style.Colors[ImGuiCol_TabHovered] = style.Colors[ImGuiCol_ButtonHovered];\n  style.Colors[ImGuiCol_TabActive] = style.Colors[ImGuiCol_ButtonActive];\n  style.Colors[ImGuiCol_TabUnfocused] = style.Colors[ImGuiCol_FrameBg];\n  style.Colors[ImGuiCol_TabUnfocusedActive] =\n      style.Colors[ImGuiCol_FrameBgHovered];\n  style.Colors[ImGuiCol_PlotLines] = ImVec4(1.00f, 1.00f, 1.00f, 1.00f);\n  style.Colors[ImGuiCol_PlotLinesHovered] = ImVec4(0.90f, 0.70f, 0.00f, 1.00f);\n  style.Colors[ImGuiCol_PlotHistogram] = ImVec4(0.90f, 0.70f, 0.00f, 1.00f);\n  style.Colors[ImGuiCol_PlotHistogramHovered] =\n      ImVec4(1.00f, 0.60f, 0.00f, 1.00f);\n  style.Colors[ImGuiCol_TextSelectedBg] = ImVec4(0.00f, 1.00f, 0.00f, 0.21f);\n  style.Colors[ImGuiCol_ModalWindowDimBg] = ImVec4(0.20f, 0.20f, 0.20f, 0.35f);\n\n  frame_time_tick_frequency_ = double(Clock::QueryHostTickFrequency());\n  last_frame_time_ticks_ = Clock::QueryHostTickCount();\n\n  touch_pointer_id_ = TouchEvent::kPointerIDNone;\n  reset_mouse_position_after_next_frame_ = false;\n}\n\nstd::optional<ImGuiKey> ImGuiDrawer::VirtualKeyToImGuiKey(VirtualKey vkey) {\n  static const std::map<VirtualKey, ImGuiKey> map = {\n      {ui::VirtualKey::kTab, ImGuiKey_Tab},\n      {ui::VirtualKey::kLeft, ImGuiKey_LeftArrow},\n      {ui::VirtualKey::kRight, ImGuiKey_RightArrow},\n      {ui::VirtualKey::kUp, ImGuiKey_UpArrow},\n      {ui::VirtualKey::kDown, ImGuiKey_DownArrow},\n      {ui::VirtualKey::kHome, ImGuiKey_Home},\n      {ui::VirtualKey::kEnd, ImGuiKey_End},\n      {ui::VirtualKey::kDelete, ImGuiKey_Delete},\n      {ui::VirtualKey::kBack, ImGuiKey_Backspace},\n      {ui::VirtualKey::kReturn, ImGuiKey_Enter},\n      {ui::VirtualKey::kEscape, ImGuiKey_Escape},\n      {ui::VirtualKey::kA, ImGuiKey_A},\n      {ui::VirtualKey::kC, ImGuiKey_C},\n      {ui::VirtualKey::kV, ImGuiKey_V},\n      {ui::VirtualKey::kX, ImGuiKey_X},\n      {ui::VirtualKey::kY, ImGuiKey_Y},\n      {ui::VirtualKey::kZ, ImGuiKey_Z},\n  };\n  if (auto search = map.find(vkey); search != map.end()) {\n    return search->second;\n  } else {\n    return std::nullopt;\n  }\n}\n\nvoid ImGuiDrawer::SetupFontTexture() {\n  if (font_texture_ || !immediate_drawer_) {\n    return;\n  }\n  ImGuiIO& io = GetIO();\n  unsigned char* pixels;\n  int width, height;\n  io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height);\n  font_texture_ = immediate_drawer_->CreateTexture(\n      width, height, ImmediateTextureFilter::kLinear, true,\n      reinterpret_cast<uint8_t*>(pixels));\n  io.Fonts->TexID = reinterpret_cast<ImTextureID>(font_texture_.get());\n}\n\nvoid ImGuiDrawer::SetPresenter(Presenter* new_presenter) {\n  if (presenter_) {\n    if (presenter_ == new_presenter) {\n      return;\n    }\n    if (!dialogs_.empty()) {\n      presenter_->RemoveUIDrawerFromUIThread(this);\n    }\n    ImGuiIO& io = GetIO();\n  }\n  presenter_ = new_presenter;\n  if (presenter_) {\n    if (!dialogs_.empty()) {\n      presenter_->AddUIDrawerFromUIThread(this, z_order_);\n    }\n  }\n}\n\nvoid ImGuiDrawer::SetImmediateDrawer(ImmediateDrawer* new_immediate_drawer) {\n  if (immediate_drawer_ == new_immediate_drawer) {\n    return;\n  }\n  if (immediate_drawer_) {\n    GetIO().Fonts->TexID = static_cast<ImTextureID>(nullptr);\n    font_texture_.reset();\n  }\n  immediate_drawer_ = new_immediate_drawer;\n  if (immediate_drawer_) {\n    SetupFontTexture();\n  }\n}\n\nvoid ImGuiDrawer::Draw(UIDrawContext& ui_draw_context) {\n  // Drawing of anything is initiated by the presenter.\n  assert_not_null(presenter_);\n  if (!immediate_drawer_) {\n    // A presenter has been attached, but an immediate drawer hasn't been\n    // attached yet.\n    return;\n  }\n\n  if (dialogs_.empty()) {\n    return;\n  }\n\n  ImGui::SetCurrentContext(internal_state_);\n\n  ImGuiIO& io = ImGui::GetIO();\n\n  uint64_t current_frame_time_ticks = Clock::QueryHostTickCount();\n  io.DeltaTime =\n      float(double(current_frame_time_ticks - last_frame_time_ticks_) /\n            frame_time_tick_frequency_);\n  if (!(io.DeltaTime > 0.0f) ||\n      current_frame_time_ticks < last_frame_time_ticks_) {\n    // For safety as Dear ImGui doesn't allow non-positive DeltaTime. Using the\n    // same default value as in the official samples.\n    io.DeltaTime = 1.0f / 60.0f;\n  }\n  last_frame_time_ticks_ = current_frame_time_ticks;\n\n  float physical_to_logical =\n      float(window_->GetMediumDpi()) / float(window_->GetDpi());\n  io.DisplaySize.x = window_->GetActualPhysicalWidth() * physical_to_logical;\n  io.DisplaySize.y = window_->GetActualPhysicalHeight() * physical_to_logical;\n\n  ImGui::NewFrame();\n\n  assert_true(!IsDrawingDialogs());\n  dialog_loop_next_index_ = 0;\n  while (dialog_loop_next_index_ < dialogs_.size()) {\n    dialogs_[dialog_loop_next_index_++]->Draw();\n  }\n  dialog_loop_next_index_ = SIZE_MAX;\n\n  ImGui::Render();\n  ImDrawData* draw_data = ImGui::GetDrawData();\n  if (draw_data) {\n    RenderDrawLists(draw_data, ui_draw_context);\n  }\n\n  if (reset_mouse_position_after_next_frame_) {\n    reset_mouse_position_after_next_frame_ = false;\n    io.MousePos = ImVec2(-FLT_MAX, -FLT_MAX);\n  }\n\n  // Detaching is deferred if the last dialog is removed during drawing, perform\n  // it now if needed.\n  DetachIfLastDialogRemoved();\n\n  if (!dialogs_.empty()) {\n    // Repaint (and handle input) continuously if still active.\n    presenter_->RequestUIPaintFromUIThread();\n  }\n}\n\nvoid ImGuiDrawer::RenderDrawLists(ImDrawData* data,\n                                  UIDrawContext& ui_draw_context) {\n  ImGuiIO& io = ImGui::GetIO();\n\n  immediate_drawer_->Begin(ui_draw_context, io.DisplaySize.x, io.DisplaySize.y);\n\n  for (int i = 0; i < data->CmdListsCount; ++i) {\n    const auto cmd_list = data->CmdLists[i];\n\n    ImmediateDrawBatch batch;\n    batch.vertices =\n        reinterpret_cast<ImmediateVertex*>(cmd_list->VtxBuffer.Data);\n    batch.vertex_count = cmd_list->VtxBuffer.size();\n    batch.indices = cmd_list->IdxBuffer.Data;\n    batch.index_count = cmd_list->IdxBuffer.size();\n    immediate_drawer_->BeginDrawBatch(batch);\n\n    for (int j = 0; j < cmd_list->CmdBuffer.size(); ++j) {\n      const auto& cmd = cmd_list->CmdBuffer[j];\n\n      ImmediateDraw draw;\n      draw.primitive_type = ImmediatePrimitiveType::kTriangles;\n      draw.count = cmd.ElemCount;\n      draw.index_offset = cmd.IdxOffset;\n      draw.texture = reinterpret_cast<ImmediateTexture*>(cmd.TextureId);\n      draw.scissor = true;\n      draw.scissor_left = cmd.ClipRect.x;\n      draw.scissor_top = cmd.ClipRect.y;\n      draw.scissor_right = cmd.ClipRect.z;\n      draw.scissor_bottom = cmd.ClipRect.w;\n      immediate_drawer_->Draw(draw);\n    }\n\n    immediate_drawer_->EndDrawBatch();\n  }\n\n  immediate_drawer_->End();\n}\n\nImGuiIO& ImGuiDrawer::GetIO() {\n  ImGui::SetCurrentContext(internal_state_);\n  return ImGui::GetIO();\n}\n\nvoid ImGuiDrawer::OnKeyDown(KeyEvent& e) { OnKey(e, true); }\n\nvoid ImGuiDrawer::OnKeyUp(KeyEvent& e) { OnKey(e, false); }\n\nvoid ImGuiDrawer::OnKeyChar(KeyEvent& e) {\n  auto& io = GetIO();\n  // TODO(Triang3l): Accept the Unicode character.\n  unsigned int character = static_cast<unsigned int>(e.virtual_key());\n  if (character > 0 && character < 0x10000) {\n    io.AddInputCharacter(character);\n    e.set_handled(true);\n  }\n}\n\nvoid ImGuiDrawer::OnMouseDown(MouseEvent& e) {\n  SwitchToPhysicalMouseAndUpdateMousePosition(e);\n  auto& io = GetIO();\n  int button = -1;\n  switch (e.button()) {\n    case xe::ui::MouseEvent::Button::kLeft: {\n      button = 0;\n      break;\n    }\n    case xe::ui::MouseEvent::Button::kRight: {\n      button = 1;\n      break;\n    }\n    default: {\n      // Ignored.\n      break;\n    }\n  }\n  if (button >= 0 && button < std::size(io.MouseDown)) {\n    if (!io.MouseDown[button]) {\n      if (!ImGui::IsAnyMouseDown()) {\n        window_->CaptureMouse();\n      }\n      io.MouseDown[button] = true;\n    }\n  }\n}\n\nvoid ImGuiDrawer::OnMouseMove(MouseEvent& e) {\n  SwitchToPhysicalMouseAndUpdateMousePosition(e);\n}\n\nvoid ImGuiDrawer::OnMouseUp(MouseEvent& e) {\n  SwitchToPhysicalMouseAndUpdateMousePosition(e);\n  auto& io = GetIO();\n  int button = -1;\n  switch (e.button()) {\n    case xe::ui::MouseEvent::Button::kLeft: {\n      button = 0;\n      break;\n    }\n    case xe::ui::MouseEvent::Button::kRight: {\n      button = 1;\n      break;\n    }\n    default: {\n      // Ignored.\n      break;\n    }\n  }\n  if (button >= 0 && button < std::size(io.MouseDown)) {\n    if (io.MouseDown[button]) {\n      io.MouseDown[button] = false;\n      if (!ImGui::IsAnyMouseDown()) {\n        window_->ReleaseMouse();\n      }\n    }\n  }\n}\n\nvoid ImGuiDrawer::OnMouseWheel(MouseEvent& e) {\n  SwitchToPhysicalMouseAndUpdateMousePosition(e);\n  auto& io = GetIO();\n  io.MouseWheel += float(e.scroll_y()) / float(MouseEvent::kScrollPerDetent);\n}\n\nvoid ImGuiDrawer::OnTouchEvent(TouchEvent& e) {\n  auto& io = GetIO();\n  TouchEvent::Action action = e.action();\n  uint32_t pointer_id = e.pointer_id();\n  if (action == TouchEvent::Action::kDown) {\n    // The latest pointer needs to be controlling the ImGui mouse.\n    if (touch_pointer_id_ == TouchEvent::kPointerIDNone) {\n      // Switching from the mouse to touch input.\n      if (ImGui::IsAnyMouseDown()) {\n        std::memset(io.MouseDown, 0, sizeof(io.MouseDown));\n        window_->ReleaseMouse();\n      }\n    }\n    touch_pointer_id_ = pointer_id;\n  } else {\n    if (pointer_id != touch_pointer_id_) {\n      return;\n    }\n  }\n  UpdateMousePosition(e.x(), e.y());\n  if (action == TouchEvent::Action::kUp ||\n      action == TouchEvent::Action::kCancel) {\n    io.MouseDown[0] = false;\n    touch_pointer_id_ = TouchEvent::kPointerIDNone;\n    // Make sure that after a touch, the ImGui mouse isn't hovering over\n    // anything.\n    reset_mouse_position_after_next_frame_ = true;\n  } else {\n    io.MouseDown[0] = true;\n    reset_mouse_position_after_next_frame_ = false;\n  }\n}\n\nvoid ImGuiDrawer::ClearInput() {\n  auto& io = GetIO();\n  if (touch_pointer_id_ == TouchEvent::kPointerIDNone &&\n      ImGui::IsAnyMouseDown()) {\n    window_->ReleaseMouse();\n  }\n  io.MousePos = ImVec2(-FLT_MAX, -FLT_MAX);\n  std::memset(io.MouseDown, 0, sizeof(io.MouseDown));\n  io.ClearInputKeys();\n  io.ClearInputCharacters();\n  touch_pointer_id_ = TouchEvent::kPointerIDNone;\n  reset_mouse_position_after_next_frame_ = false;\n}\n\nvoid ImGuiDrawer::OnKey(KeyEvent& e, bool is_down) {\n  auto& io = GetIO();\n  const VirtualKey virtual_key = e.virtual_key();\n  if (auto imGuiKey = VirtualKeyToImGuiKey(virtual_key); imGuiKey) {\n    io.AddKeyEvent(*imGuiKey, is_down);\n  }\n  switch (virtual_key) {\n    case VirtualKey::kShift:\n      io.KeyShift = is_down;\n      break;\n    case VirtualKey::kControl:\n      io.KeyCtrl = is_down;\n      break;\n    case VirtualKey::kMenu:\n      // FIXME(Triang3l): Doesn't work in xenia-ui-window-demo.\n      io.KeyAlt = is_down;\n      break;\n    case VirtualKey::kLWin:\n      io.KeySuper = is_down;\n      break;\n    default:\n      break;\n  }\n}\n\nvoid ImGuiDrawer::UpdateMousePosition(float x, float y) {\n  auto& io = GetIO();\n  float physical_to_logical =\n      float(window_->GetMediumDpi()) / float(window_->GetDpi());\n  io.MousePos.x = x * physical_to_logical;\n  io.MousePos.y = y * physical_to_logical;\n}\n\nvoid ImGuiDrawer::SwitchToPhysicalMouseAndUpdateMousePosition(\n    const MouseEvent& e) {\n  if (touch_pointer_id_ != TouchEvent::kPointerIDNone) {\n    touch_pointer_id_ = TouchEvent::kPointerIDNone;\n    auto& io = GetIO();\n    std::memset(io.MouseDown, 0, sizeof(io.MouseDown));\n    // Nothing needs to be done regarding CaptureMouse and ReleaseMouse - all\n    // buttons as well as mouse capture have been released when switching to\n    // touch input, the mouse is never captured during touch input, and now\n    // resetting to no buttons down (therefore not capturing).\n  }\n  reset_mouse_position_after_next_frame_ = false;\n  UpdateMousePosition(float(e.x()), float(e.y()));\n}\n\nvoid ImGuiDrawer::DetachIfLastDialogRemoved() {\n  // IsDrawingDialogs() is also checked because in a situation of removing the\n  // only dialog, then adding a dialog, from within a dialog's Draw function,\n  // re-registering the ImGuiDrawer may result in ImGui being drawn multiple\n  // times in the current frame.\n  if (!dialogs_.empty() || IsDrawingDialogs()) {\n    return;\n  }\n  if (presenter_) {\n    presenter_->RemoveUIDrawerFromUIThread(this);\n  }\n  window_->RemoveInputListener(this);\n  // Clear all input since no input will be received anymore, and when the\n  // drawer becomes active again, it'd have an outdated input state otherwise\n  // which will be persistent until new events actualize individual input\n  // properties.\n  ClearInput();\n}\n\n}  // namespace ui\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/ui/imgui_drawer.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_IMGUI_DRAWER_H_\n#define XENIA_UI_IMGUI_DRAWER_H_\n\n#include <cstddef>\n#include <cstdint>\n#include <memory>\n#include <optional>\n#include <vector>\n\n#include \"xenia/ui/immediate_drawer.h\"\n#include \"xenia/ui/presenter.h\"\n#include \"xenia/ui/window.h\"\n#include \"xenia/ui/window_listener.h\"\n\nstruct ImDrawData;\nstruct ImGuiContext;\nstruct ImGuiIO;\nenum ImGuiKey : int;\n\nnamespace xe {\nnamespace ui {\n\nclass ImGuiDialog;\nclass Window;\n\nclass ImGuiDrawer : public WindowInputListener, public UIDrawer {\n public:\n  ImGuiDrawer(Window* window, size_t z_order);\n  ~ImGuiDrawer();\n\n  ImGuiIO& GetIO();\n\n  void AddDialog(ImGuiDialog* dialog);\n  void RemoveDialog(ImGuiDialog* dialog);\n\n  // SetPresenter may be called from the destructor.\n  void SetPresenter(Presenter* new_presenter);\n  void SetImmediateDrawer(ImmediateDrawer* new_immediate_drawer);\n  void SetPresenterAndImmediateDrawer(Presenter* new_presenter,\n                                      ImmediateDrawer* new_immediate_drawer) {\n    SetPresenter(new_presenter);\n    SetImmediateDrawer(new_immediate_drawer);\n  }\n\n  void Draw(UIDrawContext& ui_draw_context) override;\n\n protected:\n  void OnKeyDown(KeyEvent& e) override;\n  void OnKeyUp(KeyEvent& e) override;\n  void OnKeyChar(KeyEvent& e) override;\n  void OnMouseDown(MouseEvent& e) override;\n  void OnMouseMove(MouseEvent& e) override;\n  void OnMouseUp(MouseEvent& e) override;\n  void OnMouseWheel(MouseEvent& e) override;\n  void OnTouchEvent(TouchEvent& e) override;\n  // For now, no need for OnDpiChanged because redrawing is done continuously.\n\n private:\n  void Initialize();\n\n  void SetupFontTexture();\n\n  void RenderDrawLists(ImDrawData* data, UIDrawContext& ui_draw_context);\n\n  void ClearInput();\n  void OnKey(KeyEvent& e, bool is_down);\n  void UpdateMousePosition(float x, float y);\n  void SwitchToPhysicalMouseAndUpdateMousePosition(const MouseEvent& e);\n\n  bool IsDrawingDialogs() const { return dialog_loop_next_index_ != SIZE_MAX; }\n  void DetachIfLastDialogRemoved();\n\n  std::optional<ImGuiKey> VirtualKeyToImGuiKey(VirtualKey vkey);\n\n  Window* window_;\n  size_t z_order_;\n\n  ImGuiContext* internal_state_ = nullptr;\n\n  // All currently-attached dialogs that get drawn.\n  std::vector<ImGuiDialog*> dialogs_;\n  // Using an index, not an iterator, because after the erasure, the adjustment\n  // must be done for the vector element indices that would be in the iterator\n  // range that would be invalidated.\n  // SIZE_MAX if not currently in the dialog loop.\n  size_t dialog_loop_next_index_ = SIZE_MAX;\n\n  Presenter* presenter_ = nullptr;\n\n  ImmediateDrawer* immediate_drawer_ = nullptr;\n  // Resources specific to an immediate drawer - must be destroyed before\n  // detaching the presenter.\n  std::unique_ptr<ImmediateTexture> font_texture_;\n\n  // If there's an active pointer, the ImGui mouse is controlled by this touch.\n  // If it's TouchEvent::kPointerIDNone, the ImGui mouse is controlled by the\n  // mouse.\n  uint32_t touch_pointer_id_ = TouchEvent::kPointerIDNone;\n  // Whether after the next frame (since the mouse up event needs to be handled\n  // with the correct mouse position still), the ImGui mouse position should be\n  // reset (for instance, after releasing a touch), so it's not hovering over\n  // anything.\n  bool reset_mouse_position_after_next_frame_ = false;\n\n  double frame_time_tick_frequency_;\n  uint64_t last_frame_time_ticks_;\n};\n\n}  // namespace ui\n}  // namespace xe\n\n#endif  // XENIA_UI_IMGUI_DRAWER_H_\n"
  },
  {
    "path": "src/xenia/ui/immediate_drawer.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/ui/immediate_drawer.h\"\n\n#include <algorithm>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/ui/graphics_util.h\"\n#include \"xenia/ui/presenter.h\"\n\nnamespace xe {\nnamespace ui {\n\nvoid ImmediateDrawer::SetPresenter(Presenter* new_presenter) {\n  if (presenter_ == new_presenter) {\n    return;\n  }\n  // Changing the presenter while drawing would make the state inconsistent.\n  assert_null(ui_draw_context_);\n  if (presenter_) {\n    OnLeavePresenter();\n  }\n  presenter_ = new_presenter;\n  if (presenter_) {\n    OnEnterPresenter();\n  }\n}\n\nvoid ImmediateDrawer::Begin(UIDrawContext& ui_draw_context,\n                            float coordinate_space_width,\n                            float coordinate_space_height) {\n  assert_true(&ui_draw_context.presenter() == presenter_);\n  ui_draw_context_ = &ui_draw_context;\n  // In case of non-positive values (or NaNs) - use render target coordinates\n  // according to the contract of the function, and also for safety because\n  // there will be division by the coordinate space size in several places.\n  if (!(coordinate_space_width > 0.0f) || !(coordinate_space_height > 0.0f)) {\n    coordinate_space_width = float(ui_draw_context.render_target_width());\n    coordinate_space_height = float(ui_draw_context.render_target_height());\n  }\n  coordinate_space_width_ = coordinate_space_width;\n  coordinate_space_height_ = coordinate_space_height;\n}\n\nvoid ImmediateDrawer::End() { ui_draw_context_ = nullptr; }\n\nbool ImmediateDrawer::ScissorToRenderTarget(const ImmediateDraw& immediate_draw,\n                                            uint32_t& out_left,\n                                            uint32_t& out_top,\n                                            uint32_t& out_width,\n                                            uint32_t& out_height) {\n  uint32_t render_target_width = ui_draw_context()->render_target_width();\n  uint32_t render_target_height = ui_draw_context()->render_target_height();\n  if (!immediate_draw.scissor) {\n    out_left = 0;\n    out_top = 0;\n    out_width = render_target_width;\n    out_height = render_target_height;\n    return render_target_width && render_target_height;\n  }\n  float render_target_width_float = float(render_target_width);\n  float render_target_height_float = float(render_target_height);\n  // Scale to render target coordinates, drop NaNs, and clamp to the render\n  // target size, below which the values are representable as 16p8 fixed-point.\n  float scale_x = render_target_width / coordinate_space_width();\n  float scale_y = render_target_height / coordinate_space_height();\n  float x0_float = xe::clamp_float(immediate_draw.scissor_left * scale_x, 0.0f,\n                                   render_target_width_float);\n  float y0_float = xe::clamp_float(immediate_draw.scissor_top * scale_y, 0.0f,\n                                   render_target_height_float);\n  // Also make sure the size is non-negative.\n  float x1_float = xe::clamp_float(immediate_draw.scissor_right * scale_x,\n                                   x0_float, render_target_width_float);\n  float y1_float = xe::clamp_float(immediate_draw.scissor_bottom * scale_y,\n                                   y0_float, render_target_height_float);\n  // Top-left - include .5 (0.128 treated as 0 covered, 0.129 as 0 not covered).\n  int32_t x0 = (FloatToD3D11Fixed16p8(x0_float) + 127) >> 8;\n  int32_t y0 = (FloatToD3D11Fixed16p8(y0_float) + 127) >> 8;\n  // Bottom-right - exclude .5.\n  int32_t x1 = (FloatToD3D11Fixed16p8(x1_float) + 127) >> 8;\n  int32_t y1 = (FloatToD3D11Fixed16p8(y1_float) + 127) >> 8;\n  assert_true(x0 >= 0);\n  assert_true(y0 >= 0);\n  assert_true(x1 >= x0);\n  assert_true(y1 >= y0);\n  assert_true(x1 <= int32_t(render_target_width));\n  assert_true(y1 <= int32_t(render_target_height));\n  out_left = uint32_t(x0);\n  out_top = uint32_t(y0);\n  out_width = uint32_t(x1 - x0);\n  out_height = uint32_t(y1 - y0);\n  return x1 > x0 && y1 > y0;\n}\n\n}  // namespace ui\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/ui/immediate_drawer.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_IMMEDIATE_DRAWER_H_\n#define XENIA_UI_IMMEDIATE_DRAWER_H_\n\n#include <memory>\n\n#include \"xenia/ui/presenter.h\"\n\nnamespace xe {\nnamespace ui {\n\n// Describes the filter applied when sampling textures.\nenum class ImmediateTextureFilter {\n  kNearest,\n  kLinear,\n};\n\n// Simple texture compatible with the immediate renderer.\nclass ImmediateTexture {\n public:\n  virtual ~ImmediateTexture() = default;\n\n  // Texture width, in pixels.\n  uint32_t width;\n  // Texture height, in pixels.\n  uint32_t height;\n\n protected:\n  ImmediateTexture(uint32_t width, uint32_t height)\n      : width(width), height(height) {}\n};\n\n// Describes the primitive type used by a draw call.\nenum class ImmediatePrimitiveType {\n  kLines,\n  kTriangles,\n};\n\n// Simple vertex used by the immediate mode drawer.\n// To avoid translations, this matches both imgui and elemental-forms vertices:\n//   ImDrawVert\n//   el::graphics::Renderer::Vertex\nstruct ImmediateVertex {\n  float x, y;\n  float u, v;\n  uint32_t color;\n};\n\n// All parameters required to draw an immediate-mode batch of vertices.\nstruct ImmediateDrawBatch {\n  // Vertices to draw.\n  const ImmediateVertex* vertices = nullptr;\n  int vertex_count = 0;\n\n  // Optional index buffer indices.\n  const uint16_t* indices = nullptr;\n  int index_count = 0;\n};\n\nstruct ImmediateDraw {\n  // Primitive type the vertices/indices represent.\n  ImmediatePrimitiveType primitive_type = ImmediatePrimitiveType::kTriangles;\n  // Total number of elements to draw.\n  int count = 0;\n  // Starting offset in the index buffer.\n  int index_offset = 0;\n  // Base vertex of elements, if using an index buffer.\n  int base_vertex = 0;\n\n  // Texture used when drawing, or nullptr if color only.\n  ImmediateTexture* texture = nullptr;\n\n  // True to enable scissoring using the region defined by scissor_rect.\n  bool scissor = false;\n  // Scissoring region in the coordinate space (if right < left or bottom < top,\n  // not drawing).\n  float scissor_left = 0.0f;\n  float scissor_top = 0.0f;\n  float scissor_right = 0.0f;\n  float scissor_bottom = 0.0f;\n};\n\nclass ImmediateDrawer {\n public:\n  ImmediateDrawer(const ImmediateDrawer& immediate_drawer) = delete;\n  ImmediateDrawer& operator=(const ImmediateDrawer& immediate_drawer) = delete;\n\n  virtual ~ImmediateDrawer() = default;\n\n  void SetPresenter(Presenter* new_presenter);\n\n  // Creates a new texture with the given attributes and R8G8B8A8 data.\n  virtual std::unique_ptr<ImmediateTexture> CreateTexture(\n      uint32_t width, uint32_t height, ImmediateTextureFilter filter,\n      bool is_repeated, const uint8_t* data) = 0;\n\n  // Begins drawing in immediate mode using the given projection matrix. The\n  // presenter that is currently attached to the immediate drawer, as the\n  // implementation may hold presenter-specific information such as UI\n  // submission indices. Pass 0 or a negative value as the coordinate space\n  // width or height to use raw render target pixel coordinates (or this will\n  // just be used as a safe fallback when with a non-zero-sized surface the\n  // coordinate space size becomes zero somehow).\n  virtual void Begin(UIDrawContext& ui_draw_context,\n                     float coordinate_space_width,\n                     float coordinate_space_height);\n  // Starts a draw batch.\n  virtual void BeginDrawBatch(const ImmediateDrawBatch& batch) = 0;\n  // Draws one set of a batch.\n  virtual void Draw(const ImmediateDraw& draw) = 0;\n  // Ends a draw batch.\n  virtual void EndDrawBatch() = 0;\n  // Ends drawing in immediate mode and flushes contents.\n  virtual void End();\n\n protected:\n  ImmediateDrawer() = default;\n\n  Presenter* presenter() const { return presenter_; }\n  virtual void OnLeavePresenter() {}\n  virtual void OnEnterPresenter() {}\n\n  // Available between Begin and End.\n  UIDrawContext* ui_draw_context() const { return ui_draw_context_; }\n  float coordinate_space_width() const { return coordinate_space_width_; }\n  float coordinate_space_height() const { return coordinate_space_height_; }\n\n  // Converts and clamps the scissor in the immediate draw to render target\n  // coordinates. Returns whether the scissor contains any render target pixels\n  // (but a valid scissor is written even if false is returned).\n  bool ScissorToRenderTarget(const ImmediateDraw& immediate_draw,\n                             uint32_t& out_left, uint32_t& out_top,\n                             uint32_t& out_width, uint32_t& out_height);\n\n private:\n  Presenter* presenter_ = nullptr;\n\n  UIDrawContext* ui_draw_context_ = nullptr;\n  float coordinate_space_width_;\n  float coordinate_space_height_;\n};\n\n}  // namespace ui\n}  // namespace xe\n\n#endif  // XENIA_UI_IMMEDIATE_DRAWER_H_\n"
  },
  {
    "path": "src/xenia/ui/menu_item.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/ui/menu_item.h\"\n\nnamespace xe {\nnamespace ui {\n\nstd::unique_ptr<MenuItem> MenuItem::Create(Type type) {\n  return MenuItem::Create(type, \"\", \"\", nullptr);\n}\n\nstd::unique_ptr<MenuItem> MenuItem::Create(Type type, const std::string& text) {\n  return MenuItem::Create(type, text, \"\", nullptr);\n}\n\nstd::unique_ptr<MenuItem> MenuItem::Create(Type type, const std::string& text,\n                                           std::function<void()> callback) {\n  return MenuItem::Create(type, text, \"\", std::move(callback));\n}\n\nMenuItem::MenuItem(Type type, const std::string& text,\n                   const std::string& hotkey, std::function<void()> callback)\n    : type_(type),\n      parent_item_(nullptr),\n      text_(text),\n      hotkey_(hotkey),\n      callback_(std::move(callback)) {}\n\nMenuItem::~MenuItem() = default;\n\nvoid MenuItem::AddChild(MenuItem* child_item) {\n  AddChild(MenuItemPtr(child_item, [](MenuItem* item) {}));\n}\n\nvoid MenuItem::AddChild(std::unique_ptr<MenuItem> child_item) {\n  AddChild(\n      MenuItemPtr(child_item.release(), [](MenuItem* item) { delete item; }));\n}\n\nvoid MenuItem::AddChild(MenuItemPtr child_item) {\n  auto child_item_ptr = child_item.get();\n  children_.emplace_back(std::move(child_item));\n  OnChildAdded(child_item_ptr);\n}\n\nvoid MenuItem::RemoveChild(MenuItem* child_item) {\n  for (auto it = children_.begin(); it != children_.end(); ++it) {\n    if (it->get() == child_item) {\n      children_.erase(it);\n      OnChildRemoved(child_item);\n      break;\n    }\n  }\n}\n\nMenuItem* MenuItem::child(size_t index) { return children_[index].get(); }\n\nvoid MenuItem::OnSelected() {\n  if (callback_) {\n    callback_();\n    // Note that this MenuItem might have been destroyed by the callback.\n    // Must not do anything with *this in this function from now on.\n  }\n}\n\n}  // namespace ui\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/ui/menu_item.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_MENU_ITEM_H_\n#define XENIA_UI_MENU_ITEM_H_\n\n#include <functional>\n#include <memory>\n#include <string>\n#include <vector>\n\n#include \"xenia/ui/ui_event.h\"\n\nnamespace xe {\nnamespace ui {\n\nclass Window;\n\nclass MenuItem {\n public:\n  typedef std::unique_ptr<MenuItem, void (*)(MenuItem*)> MenuItemPtr;\n\n  enum class Type {\n    kPopup,  // Popup menu (submenu)\n    kSeparator,\n    kNormal,  // Root menu\n    kString,  // Menu is just a string\n  };\n\n  static std::unique_ptr<MenuItem> Create(Type type);\n  static std::unique_ptr<MenuItem> Create(Type type, const std::string& text);\n  static std::unique_ptr<MenuItem> Create(Type type, const std::string& text,\n                                          std::function<void()> callback);\n  static std::unique_ptr<MenuItem> Create(Type type, const std::string& text,\n                                          const std::string& hotkey,\n                                          std::function<void()> callback);\n\n  virtual ~MenuItem();\n\n  MenuItem* parent_item() const { return parent_item_; }\n  Type type() { return type_; }\n  const std::string& text() { return text_; }\n  const std::string& hotkey() { return hotkey_; }\n\n  // If the menu is currently attached to a Window, changes to it (such as the\n  // elements and the enabled / disabled state) may be not reflected\n  // immediately - call Window::CompleteMainMenuItemsUpdate when the\n  // modifications are done.\n\n  void AddChild(MenuItem* child_item);\n  void AddChild(std::unique_ptr<MenuItem> child_item);\n  void AddChild(MenuItemPtr child_item);\n  void RemoveChild(MenuItem* child_item);\n  MenuItem* child(size_t index);\n\n  virtual void SetEnabled(bool enabled) {}\n\n protected:\n  MenuItem(Type type, const std::string& text, const std::string& hotkey,\n           std::function<void()> callback);\n\n  virtual void OnChildAdded(MenuItem* child_item) {}\n  virtual void OnChildRemoved(MenuItem* child_item) {}\n\n  // This MenuItem may be destroyed as a result of the callback, don't do\n  // anything with it after the call.\n  void OnSelected();\n\n  Type type_;\n  MenuItem* parent_item_;\n  std::vector<MenuItemPtr> children_;\n  std::string text_;\n  std::string hotkey_;\n\n private:\n  std::function<void()> callback_;\n};\n\n}  // namespace ui\n}  // namespace xe\n\n#endif  // XENIA_UI_MENU_ITEM_H_\n"
  },
  {
    "path": "src/xenia/ui/microprofile_drawer.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/ui/microprofile_drawer.h\"\n\n#include <algorithm>\n#include <cstdint>\n\n#include \"xenia/base/math.h\"\n#include \"xenia/base/profiling.h\"\n\nnamespace xe {\nnamespace ui {\n\nconst int kMaxVertices = 16 << 10;\n\nconst int kFontTextureWidth = 1024;\nconst int kFontTextureHeight = 9;\nconst int kFontCharWidth = 5;\nconst int kFontCharHeight = 8;\n\n// The last texel is for solid color.\nconst uint8_t kFontData[] = {\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x78, 0x38, 0x78,\n    0x7c, 0x7c, 0x3c, 0x44, 0x38, 0x04, 0x44, 0x40, 0x44, 0x44, 0x38, 0x78,\n    0x38, 0x78, 0x38, 0x7c, 0x44, 0x44, 0x44, 0x44, 0x44, 0x7c, 0x00, 0x00,\n    0x40, 0x00, 0x04, 0x00, 0x18, 0x00, 0x40, 0x10, 0x08, 0x40, 0x30, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x38, 0x10, 0x38, 0x7c, 0x08, 0x7c, 0x1c, 0x7c, 0x38, 0x38,\n    0x10, 0x28, 0x28, 0x10, 0x00, 0x20, 0x10, 0x08, 0x10, 0x10, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x38, 0x38, 0x70, 0x00,\n    0x1c, 0x10, 0x00, 0x1c, 0x10, 0x70, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x28, 0x44, 0x44, 0x44, 0x40, 0x40, 0x40, 0x44,\n    0x10, 0x04, 0x48, 0x40, 0x6c, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x10,\n    0x44, 0x44, 0x44, 0x44, 0x44, 0x04, 0x00, 0x00, 0x40, 0x00, 0x04, 0x00,\n    0x24, 0x00, 0x40, 0x00, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x30,\n    0x44, 0x04, 0x18, 0x40, 0x20, 0x04, 0x44, 0x44, 0x10, 0x28, 0x28, 0x3c,\n    0x44, 0x50, 0x10, 0x10, 0x08, 0x54, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00,\n    0x00, 0x08, 0x00, 0x10, 0x44, 0x44, 0x40, 0x40, 0x04, 0x28, 0x00, 0x30,\n    0x10, 0x18, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x44, 0x44, 0x40, 0x44, 0x40, 0x40, 0x40, 0x44, 0x10, 0x04, 0x50, 0x40,\n    0x54, 0x64, 0x44, 0x44, 0x44, 0x44, 0x40, 0x10, 0x44, 0x44, 0x44, 0x28,\n    0x28, 0x08, 0x00, 0x38, 0x78, 0x3c, 0x3c, 0x38, 0x20, 0x38, 0x78, 0x30,\n    0x18, 0x44, 0x10, 0x6c, 0x78, 0x38, 0x78, 0x3c, 0x5c, 0x3c, 0x3c, 0x44,\n    0x44, 0x44, 0x44, 0x44, 0x7c, 0x00, 0x4c, 0x10, 0x04, 0x08, 0x28, 0x78,\n    0x40, 0x08, 0x44, 0x44, 0x10, 0x00, 0x7c, 0x50, 0x08, 0x50, 0x00, 0x20,\n    0x04, 0x38, 0x10, 0x00, 0x00, 0x00, 0x08, 0x10, 0x10, 0x10, 0x7c, 0x08,\n    0x08, 0x54, 0x40, 0x20, 0x04, 0x44, 0x00, 0x30, 0x10, 0x18, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x78, 0x40, 0x44,\n    0x78, 0x78, 0x40, 0x7c, 0x10, 0x04, 0x60, 0x40, 0x54, 0x54, 0x44, 0x78,\n    0x44, 0x78, 0x38, 0x10, 0x44, 0x44, 0x54, 0x10, 0x10, 0x10, 0x00, 0x04,\n    0x44, 0x40, 0x44, 0x44, 0x78, 0x44, 0x44, 0x10, 0x08, 0x48, 0x10, 0x54,\n    0x44, 0x44, 0x44, 0x44, 0x60, 0x40, 0x10, 0x44, 0x44, 0x44, 0x28, 0x44,\n    0x08, 0x00, 0x54, 0x10, 0x18, 0x18, 0x48, 0x04, 0x78, 0x10, 0x38, 0x3c,\n    0x10, 0x00, 0x28, 0x38, 0x10, 0x20, 0x00, 0x20, 0x04, 0x10, 0x7c, 0x00,\n    0x7c, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x04, 0x10, 0x5c, 0x40, 0x10,\n    0x04, 0x00, 0x00, 0x60, 0x10, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x7c, 0x44, 0x40, 0x44, 0x40, 0x40, 0x4c, 0x44,\n    0x10, 0x04, 0x50, 0x40, 0x44, 0x4c, 0x44, 0x40, 0x54, 0x50, 0x04, 0x10,\n    0x44, 0x44, 0x54, 0x28, 0x10, 0x20, 0x00, 0x3c, 0x44, 0x40, 0x44, 0x7c,\n    0x20, 0x44, 0x44, 0x10, 0x08, 0x70, 0x10, 0x54, 0x44, 0x44, 0x44, 0x44,\n    0x40, 0x38, 0x10, 0x44, 0x44, 0x54, 0x10, 0x44, 0x10, 0x00, 0x64, 0x10,\n    0x20, 0x04, 0x7c, 0x04, 0x44, 0x20, 0x44, 0x04, 0x10, 0x00, 0x7c, 0x14,\n    0x20, 0x54, 0x00, 0x20, 0x04, 0x38, 0x10, 0x10, 0x00, 0x00, 0x20, 0x10,\n    0x10, 0x10, 0x7c, 0x08, 0x10, 0x58, 0x40, 0x08, 0x04, 0x00, 0x00, 0x30,\n    0x10, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x44, 0x44, 0x44, 0x44, 0x40, 0x40, 0x44, 0x44, 0x10, 0x44, 0x48, 0x40,\n    0x44, 0x44, 0x44, 0x40, 0x48, 0x48, 0x44, 0x10, 0x44, 0x28, 0x6c, 0x44,\n    0x10, 0x40, 0x00, 0x44, 0x44, 0x40, 0x44, 0x40, 0x20, 0x3c, 0x44, 0x10,\n    0x08, 0x48, 0x10, 0x54, 0x44, 0x44, 0x44, 0x44, 0x40, 0x04, 0x12, 0x4c,\n    0x28, 0x54, 0x28, 0x3c, 0x20, 0x00, 0x44, 0x10, 0x40, 0x44, 0x08, 0x44,\n    0x44, 0x20, 0x44, 0x08, 0x00, 0x00, 0x28, 0x78, 0x44, 0x48, 0x00, 0x10,\n    0x08, 0x54, 0x10, 0x10, 0x00, 0x00, 0x40, 0x00, 0x10, 0x08, 0x00, 0x10,\n    0x00, 0x40, 0x40, 0x04, 0x04, 0x00, 0x00, 0x30, 0x10, 0x18, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x78, 0x38, 0x78,\n    0x7c, 0x40, 0x3c, 0x44, 0x38, 0x38, 0x44, 0x7c, 0x44, 0x44, 0x38, 0x40,\n    0x34, 0x44, 0x38, 0x10, 0x38, 0x10, 0x44, 0x44, 0x10, 0x7c, 0x00, 0x3c,\n    0x78, 0x3c, 0x3c, 0x3c, 0x20, 0x04, 0x44, 0x38, 0x48, 0x44, 0x38, 0x44,\n    0x44, 0x38, 0x78, 0x3c, 0x40, 0x78, 0x0c, 0x34, 0x10, 0x6c, 0x44, 0x04,\n    0x7c, 0x00, 0x38, 0x38, 0x7c, 0x38, 0x08, 0x38, 0x38, 0x20, 0x38, 0x70,\n    0x10, 0x00, 0x28, 0x10, 0x00, 0x34, 0x00, 0x08, 0x10, 0x10, 0x00, 0x20,\n    0x00, 0x10, 0x00, 0x00, 0x20, 0x04, 0x00, 0x20, 0x10, 0x3c, 0x70, 0x00,\n    0x1c, 0x00, 0x7c, 0x1c, 0x10, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x38, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x04,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,\n};\n\nMicroprofileDrawer::MicroprofileDrawer(ImmediateDrawer* immediate_drawer)\n    : immediate_drawer_(immediate_drawer), vertices_(kMaxVertices) {\n  SetupFont();\n}\n\nvoid MicroprofileDrawer::SetupFont() {\n  // Setup font lookup table.\n  for (uint32_t i = 0; i < xe::countof(font_description_.char_offsets); ++i) {\n    font_description_.char_offsets[i] = 206;\n  }\n  for (uint32_t i = 'A'; i <= 'Z'; ++i) {\n    font_description_.char_offsets[i] = (i - 'A') * 8 + 1;\n  }\n  for (uint32_t i = 'a'; i <= 'z'; ++i) {\n    font_description_.char_offsets[i] = (i - 'a') * 8 + 217;\n  }\n  for (uint32_t i = '0'; i <= '9'; ++i) {\n    font_description_.char_offsets[i] = (i - '0') * 8 + 433;\n  }\n  for (uint32_t i = '!'; i <= '/'; ++i) {\n    font_description_.char_offsets[i] = (i - '!') * 8 + 513;\n  }\n  for (uint32_t i = ':'; i <= '@'; ++i) {\n    font_description_.char_offsets[i] = (i - ':') * 8 + 625 + 8;\n  }\n  for (uint32_t i = '['; i <= '_'; ++i) {\n    font_description_.char_offsets[i] = (i - '[') * 8 + 681 + 8;\n  }\n  for (uint32_t i = '{'; i <= '~'; ++i) {\n    font_description_.char_offsets[i] = (i - '{') * 8 + 721 + 8;\n  }\n\n  // Unpack font bitmap into an RGBA texture.\n  const int kUnpackedSize = kFontTextureWidth * kFontTextureHeight * 4;\n  uint32_t unpacked[kUnpackedSize];\n  int idx = 0;\n  int end = kFontTextureWidth * kFontTextureHeight / 8;\n  for (int i = 0; i < end; i++) {\n    uint8_t b = kFontData[i];\n    for (int j = 0; j < 8; ++j) {\n      unpacked[idx++] = b & 0x80 ? 0xFFFFFFFFu : 0;\n      b <<= 1;\n    }\n  }\n\n  font_texture_ = immediate_drawer_->CreateTexture(\n      kFontTextureWidth, kFontTextureHeight, ImmediateTextureFilter::kNearest,\n      false, reinterpret_cast<uint8_t*>(unpacked));\n}\n\nvoid MicroprofileDrawer::Begin(UIDrawContext& ui_draw_context,\n                               uint32_t coordinate_space_width,\n                               uint32_t coordinate_space_height) {\n  immediate_drawer_->Begin(ui_draw_context, float(coordinate_space_width),\n                           float(coordinate_space_height));\n}\n\nvoid MicroprofileDrawer::End() {\n  Flush();\n  immediate_drawer_->End();\n}\n\nImmediateVertex* MicroprofileDrawer::BeginVertices(\n    ImmediatePrimitiveType primitive_type, int count) {\n  if (vertex_count_ + count > vertices_.size() ||\n      primitive_type != current_primitive_type_) {\n    Flush();\n  }\n  current_primitive_type_ = primitive_type;\n  auto ptr = vertices_.data() + vertex_count_;\n  vertex_count_ += count;\n  return ptr;\n}\n\nvoid MicroprofileDrawer::EndVertices() {}\n\nvoid MicroprofileDrawer::Flush() {\n  if (!vertex_count_) {\n    return;\n  }\n\n  ImmediateDrawBatch batch;\n  batch.vertices = vertices_.data();\n  batch.vertex_count = vertex_count_;\n  immediate_drawer_->BeginDrawBatch(batch);\n\n  ImmediateDraw draw;\n  draw.primitive_type = current_primitive_type_;\n  draw.count = vertex_count_;\n  draw.texture = font_texture_.get();\n  immediate_drawer_->Draw(draw);\n\n  immediate_drawer_->EndDrawBatch();\n\n  vertex_count_ = 0;\n}\n\n#define Q0(d, member, v) d[0].member = v\n#define Q1(d, member, v) \\\n  d[1].member = v;       \\\n  d[3].member = v\n#define Q2(d, member, v) d[4].member = v\n#define Q3(d, member, v) \\\n  d[2].member = v;       \\\n  d[5].member = v\n\nvoid MicroprofileDrawer::DrawBox(int x0, int y0, int x1, int y1, uint32_t color,\n                                 BoxType type) {\n  auto v = BeginVertices(ImmediatePrimitiveType::kTriangles, 6);\n  if (type == BoxType::kFlat) {\n    color =\n        ((color & 0xff) << 16) | ((color >> 16) & 0xff) | (0xff00ff00 & color);\n    Q0(v, x, static_cast<float>(x0));\n    Q0(v, y, static_cast<float>(y0));\n    Q0(v, color, color);\n    Q0(v, u, 1.0f);\n    Q0(v, v, 1.0f);\n    Q1(v, x, static_cast<float>(x1));\n    Q1(v, y, static_cast<float>(y0));\n    Q1(v, color, color);\n    Q1(v, u, 1.0f);\n    Q1(v, v, 1.0f);\n    Q2(v, x, static_cast<float>(x1));\n    Q2(v, y, static_cast<float>(y1));\n    Q2(v, color, color);\n    Q2(v, u, 1.0f);\n    Q2(v, v, 1.0f);\n    Q3(v, x, static_cast<float>(x0));\n    Q3(v, y, static_cast<float>(y1));\n    Q3(v, color, color);\n    Q3(v, u, 1.0f);\n    Q3(v, v, 1.0f);\n  } else {\n    uint32_t r = 0xff & (color >> 16);\n    uint32_t g = 0xff & (color >> 8);\n    uint32_t b = 0xff & color;\n    uint32_t nMax = std::max(std::max(std::max(r, g), b), 30u);\n    uint32_t nMin = std::min(std::min(std::min(r, g), b), 180u);\n\n    uint32_t r0 = 0xff & ((r + nMax) / 2);\n    uint32_t g0 = 0xff & ((g + nMax) / 2);\n    uint32_t b0 = 0xff & ((b + nMax) / 2);\n\n    uint32_t r1 = 0xff & ((r + nMin) / 2);\n    uint32_t g1 = 0xff & ((g + nMin) / 2);\n    uint32_t b1 = 0xff & ((b + nMin) / 2);\n    uint32_t color0 = (r0 << 0) | (g0 << 8) | (b0 << 16) | (0xff000000 & color);\n    uint32_t color1 = (r1 << 0) | (g1 << 8) | (b1 << 16) | (0xff000000 & color);\n    Q0(v, x, static_cast<float>(x0));\n    Q0(v, y, static_cast<float>(y0));\n    Q0(v, color, color0);\n    Q0(v, u, 1.0f);\n    Q0(v, v, 1.0f);\n    Q1(v, x, static_cast<float>(x1));\n    Q1(v, y, static_cast<float>(y0));\n    Q1(v, color, color0);\n    Q1(v, u, 1.0f);\n    Q1(v, v, 1.0f);\n    Q2(v, x, static_cast<float>(x1));\n    Q2(v, y, static_cast<float>(y1));\n    Q2(v, color, color1);\n    Q2(v, u, 1.0f);\n    Q2(v, v, 1.0f);\n    Q3(v, x, static_cast<float>(x0));\n    Q3(v, y, static_cast<float>(y1));\n    Q3(v, color, color1);\n    Q3(v, u, 1.0f);\n    Q3(v, v, 1.0f);\n  }\n  EndVertices();\n}\n\nvoid MicroprofileDrawer::DrawLine2D(uint32_t count, float* vertices,\n                                    uint32_t color) {\n  if (!count || !vertices) {\n    return;\n  }\n  auto v = BeginVertices(ImmediatePrimitiveType::kLines, 2 * (count - 1));\n  color = 0xff000000 | ((color & 0xff) << 16) | (color & 0xff00ff00) |\n          ((color >> 16) & 0xff);\n  for (uint32_t i = 0; i < count - 1; ++i) {\n    v[0].x = vertices[i * 2];\n    v[0].y = vertices[i * 2 + 1];\n    v[0].color = color;\n    v[0].u = 1.0f;\n    v[0].v = 1.0f;\n    v[1].x = vertices[(i + 1) * 2];\n    v[1].y = vertices[(i + 1) * 2 + 1];\n    v[1].color = color;\n    v[1].u = 1.0f;\n    v[1].v = 1.0f;\n    v += 2;\n  }\n  EndVertices();\n}\n\nvoid MicroprofileDrawer::DrawTextString(int x, int y, uint32_t color,\n                                        const char* text, int text_length) {\n  if (!text_length) {\n    return;\n  }\n\n  const float fOffsetU = kFontCharWidth / static_cast<float>(kFontTextureWidth);\n  float fX = static_cast<float>(x);\n  float fY = static_cast<float>(y);\n  float fY2 = fY + (kFontCharHeight + 1);\n\n  auto v = BeginVertices(ImmediatePrimitiveType::kTriangles, 6 * text_length);\n  const char* pStr = text;\n  color = 0xff000000 | ((color & 0xff) << 16) | (color & 0xff00) |\n          ((color >> 16) & 0xff);\n\n  for (size_t j = 0; j < text_length; ++j) {\n    int16_t char_offset = font_description_.char_offsets[*pStr++];\n    float fOffset = char_offset / 1024.0f;\n    Q0(v, x, fX);\n    Q0(v, y, fY);\n    Q0(v, color, color);\n    Q0(v, u, fOffset);\n    Q0(v, v, 0.0f);\n\n    Q1(v, x, fX + kFontCharWidth);\n    Q1(v, y, fY);\n    Q1(v, color, color);\n    Q1(v, u, fOffset + fOffsetU);\n    Q1(v, v, 0.0f);\n\n    Q2(v, x, fX + kFontCharWidth);\n    Q2(v, y, fY2);\n    Q2(v, color, color);\n    Q2(v, u, fOffset + fOffsetU);\n    Q2(v, v, 1.0f);\n\n    Q3(v, x, fX);\n    Q3(v, y, fY2);\n    Q3(v, color, color);\n    Q3(v, u, fOffset);\n    Q3(v, v, 1.0f);\n\n    fX += kFontCharWidth + 1;\n    v += 6;\n  }\n\n  EndVertices();\n}\n\n}  // namespace ui\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/ui/microprofile_drawer.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_MICROPROFILE_DRAWER_H_\n#define XENIA_UI_MICROPROFILE_DRAWER_H_\n\n#include <cstdint>\n#include <memory>\n#include <vector>\n\n#include \"xenia/ui/immediate_drawer.h\"\n\nnamespace xe {\nnamespace ui {\n\nclass MicroprofileDrawer {\n public:\n  enum class BoxType {\n    kBar = 0,   // MicroProfileBoxTypeBar\n    kFlat = 1,  // MicroProfileBoxTypeFlat\n  };\n\n  // Initially hidden.\n  MicroprofileDrawer(ImmediateDrawer* immediate_drawer);\n\n  void Begin(UIDrawContext& ui_draw_context, uint32_t coordinate_space_width,\n             uint32_t coordinate_space_height);\n  void End();\n  void DrawBox(int x0, int y0, int x1, int y1, uint32_t color, BoxType type);\n  void DrawLine2D(uint32_t count, float* vertices, uint32_t color);\n  // The name DrawTextString collides with DrawText in Windows.\n  void DrawTextString(int x, int y, uint32_t color, const char* text,\n                      int text_length);\n\n protected:\n  void SetupFont();\n\n  ImmediateVertex* BeginVertices(ImmediatePrimitiveType primitive_type,\n                                 int count);\n  void EndVertices();\n  void Flush();\n\n  ImmediateDrawer* immediate_drawer_;\n\n  std::vector<ImmediateVertex> vertices_;\n  int vertex_count_ = 0;\n  ImmediatePrimitiveType current_primitive_type_;\n\n  std::unique_ptr<ImmediateTexture> font_texture_;\n  struct {\n    uint16_t char_offsets[256];\n  } font_description_ = {{0}};\n};\n\n}  // namespace ui\n}  // namespace xe\n\n#endif  // XENIA_UI_MICROPROFILE_DRAWER_H_\n"
  },
  {
    "path": "src/xenia/ui/premake5.lua",
    "content": "project_root = \"../../..\"\ninclude(project_root..\"/tools/build\")\n\ngroup(\"src\")\nproject(\"xenia-ui\")\n  uuid(\"d0407c25-b0ea-40dc-846c-82c46fbd9fa2\")\n  kind(\"StaticLib\")\n  language(\"C++\")\n  links({\n    \"xenia-base\",\n  })\n  defines({\n  })\n  local_platform_files()\n  removefiles({\"*_demo.cc\"})\n  removefiles({\"windowed_app_main_*.cc\"})\n\n  filter(\"platforms:Android-*\")\n    -- Exports JNI functions.\n    wholelib(\"On\")\n\n  filter(\"platforms:Windows\")\n    links({\n      \"dwmapi\",\n      \"dxgi\",\n    })\n"
  },
  {
    "path": "src/xenia/ui/presenter.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/ui/presenter.h\"\n\n#include <algorithm>\n#include <utility>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/cvar.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/platform.h\"\n#include \"xenia/ui/window.h\"\n\n#if XE_PLATFORM_WIN32\n#include \"xenia/ui/window_win.h\"\n#endif\n\n// On Windows, InvalidateRect causes WM_PAINT to be sent quite quickly, so\n// presenting from the thread refreshing the guest output is not absolutely\n// necessary, but still may be nice for bypassing the scheduling and the\n// message queue.\n// On Android and GTK, the frame rate of draw events is limited to the display\n// refresh rate internally, so for the lowest latency especially in case the\n// refresh rates differ significantly on the guest and the host (like 30/60 Hz\n// presented to 144 Hz), drawing from the guest output refreshing thread is\n// highly desirable. Presenting directly from the GPU emulation thread also\n// makes debugging GPU emulation easier with external tools, as presenting in\n// most cases happens exactly between emulation frames.\nDEFINE_bool(\n    host_present_from_non_ui_thread, true,\n    \"Allow the GPU emulation thread to present the guest output to the host \"\n    \"surface directly instead of requesting the UI thread to do so through the \"\n    \"host window system.\",\n    \"Display\");\n\nDEFINE_bool(\n    present_render_pass_clear, true,\n    \"On graphics backends where this is supported, use the clear render pass \"\n    \"load operation in presentation instead of clear commands clearing only \"\n    \"the letterbox area.\",\n    \"Display\");\n\nDEFINE_bool(\n    present_letterbox, true,\n    \"Maintain aspect ratio when stretching by displaying bars around the image \"\n    \"when there's no more overscan area to crop out.\",\n    \"Display\");\n// https://github.com/MonoGame/MonoGame/issues/4697#issuecomment-217779403\n// Using the value from DirectXTK (5% cropped out from each side, thus 90%),\n// which is not exactly the Xbox One title-safe area, but close, and within the\n// action-safe area:\n// https://github.com/microsoft/DirectXTK/blob/1e80a465c6960b457ef9ab6716672c1443a45024/Src/SimpleMath.cpp#L144\n// XNA TitleSafeArea is 80%, but it's very conservative, designed for CRT, and\n// is the title-safe area rather than the action-safe area.\n// 90% is also exactly the fraction of 16:9 height in 16:10.\nDEFINE_int32(\n    present_safe_area_x, 90,\n    \"Percentage of the image width that can be kept when presenting to \"\n    \"maintain aspect ratio without letterboxing or stretching.\",\n    \"Display\");\nDEFINE_int32(\n    present_safe_area_y, 90,\n    \"Percentage of the image height that can be kept when presenting to \"\n    \"maintain aspect ratio without letterboxing or stretching.\",\n    \"Display\");\n\nnamespace xe {\nnamespace ui {\n\nvoid Presenter::FatalErrorHostGpuLossCallback(\n    [[maybe_unused]] bool is_responsible,\n    [[maybe_unused]] bool statically_from_ui_thread) {\n  xe::FatalError(\"Graphics device lost (probably due to an internal error)\");\n}\n\nPresenter::~Presenter() {\n  // No intrusive lifetime management must be performed from UI drawers - defer\n  // it if needed.\n  assert_false(is_executing_ui_drawers_);\n\n#if XE_PLATFORM_WIN32\n  if (dxgi_ui_tick_thread_.joinable()) {\n    {\n      std::scoped_lock<std::mutex> dxgi_ui_tick_lock(dxgi_ui_tick_mutex_);\n      dxgi_ui_tick_thread_shutdown_ = true;\n    }\n    dxgi_ui_tick_control_condition_.notify_all();\n    dxgi_ui_tick_thread_.join();\n  }\n#endif  // XE_PLATFORM\n\n  if (window_) {\n    Window* old_window = window_;\n    // Null the pointer to prevent an infinite loop between SetPresenter and\n    // SetWindowSurfaceFromUIThread calling each other.\n    window_ = nullptr;\n    old_window->SetPresenter(nullptr);\n  }\n}\n\nvoid Presenter::SetWindowSurfaceFromUIThread(Window* new_window,\n                                             Surface* new_surface) {\n  // No intrusive lifetime management must be performed from UI drawers - defer\n  // it if needed.\n  assert_false(is_executing_ui_drawers_);\n\n  // There can't be a valid surface pointer without a window, as a surface is\n  // created and owned by the window.\n  assert_false(new_surface && !new_window);\n\n  if (window_ == new_window && (!window_ || surface_ == new_surface)) {\n    // Nothing has changed (or a recursive SetWindowSurfaceFromUIThread >\n    // SetPresenter > SetWindowSurfaceFromUIThread call).\n    return;\n  }\n\n  // Disconnect from the current surface.\n  if (surface_) {\n    // Take ownership of painting, and also stop accepting paint requests from\n    // the guest output thread - the window (which is required for making them)\n    // may be going away, and there will be a forced paint when the connection\n    // becomes available.\n    SetPaintModeFromUIThread(PaintMode::kNone);\n    DisconnectPaintingFromSurfaceFromUIThread(\n        SurfacePaintConnectionState::kUnconnectedRetryAtStateChange);\n    surface_ = nullptr;\n    UpdateSurfaceMonitorFromUIThread(true);\n  }\n\n  if (window_ != new_window) {\n    // The window pointer may be accessed by the guest output thread if painting\n    // is possible (or was possible, but the paint attempt has resulted in the\n    // implementation reporting that the connection has become outdated).\n    // However, a painting connection is currently not established at all, so\n    // it's safe to modify the window pointer here.\n\n    // Detach from the old window if attaching to a different one or just\n    // detaching. SetPresenter for the new window might have been called without\n    // it having been called with nullptr for the old window.\n    if (window_) {\n      Window* old_window = window_;\n      // Null the pointer to prevent an infinite loop between SetPresenter and\n      // SetWindowSurfaceFromUIThread calling each other.\n      window_ = nullptr;\n      old_window->SetPresenter(nullptr);\n    }\n\n    // Attach to the new one.\n    // This function is called from SetPresenter - don't need to notify the\n    // window of this, as it itself has triggered this.\n    window_ = new_window;\n  }\n\n  if (new_surface) {\n    assert_true(paint_mode_ == PaintMode::kNone);\n    surface_ = new_surface;\n    UpdateSurfaceMonitorFromUIThread(true);\n    assert_true(surface_paint_connection_state_ ==\n                SurfacePaintConnectionState::kUnconnectedRetryAtStateChange);\n    bool request_repaint;\n    UpdateSurfacePaintConnectionFromUIThread(&request_repaint, true);\n    // Request to paint as soon as possible in the UI thread if connected\n    // successfully.\n    if (request_repaint) {\n      RequestPaintOrConnectionRecoveryViaWindow(true);\n    }\n  }\n}\n\nvoid Presenter::OnSurfaceMonitorUpdateFromUIThread(\n    bool old_monitor_potentially_disconnected) {\n  // No intrusive lifetime management must be performed from UI drawers - defer\n  // it if needed.\n  assert_false(is_executing_ui_drawers_);\n\n  if (!surface_) {\n    return;\n  }\n\n  UpdateSurfaceMonitorFromUIThread(old_monitor_potentially_disconnected);\n}\n\nvoid Presenter::OnSurfaceResizeFromUIThread() {\n  // No intrusive lifetime management must be performed from UI drawers - defer\n  // it if needed.\n  assert_false(is_executing_ui_drawers_);\n\n  if (!surface_) {\n    return;\n  }\n\n  // Let the UI thread take ownership of painting (so the connection can be\n  // updated) in a smooth way - downgrade to kUIThreadOnRequest rather than\n  // kNone, because a forced repaint may not be necessary if, for example, the\n  // size internally turns out to be the same after the update, and in this case\n  // the current image may be kept - but the new one must not be missed either\n  // if it becomes available during the resize.\n  if (paint_mode_ == PaintMode::kGuestOutputThreadImmediately) {\n    SetPaintModeFromUIThread(PaintMode::kUIThreadOnRequest);\n  }\n\n  bool request_repaint;\n  UpdateSurfacePaintConnectionFromUIThread(&request_repaint, true);\n\n  // Request to repaint as soon as possible in the UI thread if needed.\n  if (request_repaint) {\n    RequestPaintOrConnectionRecoveryViaWindow(true);\n  }\n}\n\nvoid Presenter::PaintFromUIThread(bool force_paint) {\n  // If there is no surface, this will be a no-op, nothing outdated, nothing to\n  // paint. However, an explicit monitor check is needed because UI framerate\n  // limiting may be tied to signals from the OS for the monitor - but painting\n  // may still occur, for instance, if drawing to a composition surface in the\n  // OS (which will still be live even if the window goes outside any monitor).\n  // But a surface check still won't cause harm, for simplicity.\n  if (!InSurfaceOnMonitorFromUIThread()) {\n    return;\n  }\n\n  // Defer changes to the paint mode as well as window paint requests, and do\n  // them in this function so they're consistent with the assumptions made here.\n  assert_false(is_in_ui_thread_paint_);\n  is_in_ui_thread_paint_ = true;\n  request_guest_output_paint_after_current_ui_thread_paint_ = false;\n  request_ui_paint_after_current_ui_thread_paint_ = false;\n\n  // Actualize the connection if the UI needs to be drawn if there was some\n  // explicit paint request (the guest output has been refreshed, and the guest\n  // output thread was asked not to present directly due as the UI needs to be\n  // drawn, or some surface state change has happened so the guest output needs\n  // to be displayed as soon as possible without waiting for the guest to\n  // refresh it, or the guest output thread has been notified that the\n  // connection has become outdated and has requested the UI thread to\n  // reconnect).\n  bool draw_ui = !ui_drawers_.empty();\n  bool do_paint = force_paint || draw_ui;\n  // Reset ui_thread_paint_requested_ unconditionally also, regardless of\n  // whether the UI needs to be drawn - the flag may be set to try reconnecting,\n  // for example.\n  if (ui_thread_paint_requested_.exchange(false, std::memory_order_relaxed)) {\n    do_paint = true;\n  }\n  PaintResult paint_result = PaintResult::kNotPresented;\n  bool request_repaint_at_tick = false;\n  bool request_repaint_immediately = false;\n  if (do_paint) {\n    // Take ownership of painting if it's currently owned by the guest output\n    // thread (downgrade from kGuestOutputThreadImmediately to\n    // kUIThreadOnRequest - not to kNone so if during this paint a new guest\n    // output frame is generated, the notification will still be sent to the UI\n    // thread rather than dropped, so the frame won't be skipped). This is\n    // needed to be able not only to paint, but also to try to recover from an\n    // outdated surface.\n    if (paint_mode_ == PaintMode::kGuestOutputThreadImmediately) {\n      SetPaintModeFromUIThread(PaintMode::kUIThreadOnRequest);\n    }\n    // Try to recover from the connection becoming outdated in the previous\n    // paint.\n    if (surface_paint_connection_state_ ==\n        SurfacePaintConnectionState::kConnectedOutdated) {\n      UpdateSurfacePaintConnectionFromUIThread(nullptr, false);\n    }\n    // If still paintable or recovered successfully, paint.\n    if (surface_paint_connection_state_ ==\n        SurfacePaintConnectionState::kConnectedPaintable) {\n      // The paint mode might have been set to kNone when the connection was\n      // marked as outdated last time. Or, if wasn't reconnecting, there was\n      // some other incorrect situation that caused the paint mode to be set to\n      // kNone for an active connection. Make sure that the current paint mode\n      // is consistent with painting from the UI thread.\n      SetPaintModeFromUIThread(PaintMode::kUIThreadOnRequest);\n\n      // Limit the frame rate of the UI, usually to the monitor refresh rate,\n      // in a way so that the UI won't be stealing all the remaining GPU\n      // resources if it's repainted continuously, and the window system itself\n      // doesn't limit the frame rate.\n      WaitForUITickFromUIThread();\n\n      paint_result = PaintAndPresent(draw_ui);\n      if (surface_paint_connection_state_ ==\n          SurfacePaintConnectionState::kConnectedOutdated) {\n        // Request another PaintFromUIThread which will try to recover from the\n        // outdated connection in the next frame (not immediately, so the\n        // windowing system has some time to prepare what may be required to\n        // recover from it, such as to send a resize event).\n        request_repaint_immediately = true;\n      }\n    }\n    // If can't paint anymore, notify the paint mode refresh below (which is not\n    // guaranteed to have access to have ownership of painting as it's taken\n    // here only conditionally, thus can't know whether the connection is\n    // actually in a paintable state).\n    if (surface_paint_connection_state_ !=\n        SurfacePaintConnectionState::kConnectedPaintable) {\n      SetPaintModeFromUIThread(PaintMode::kNone);\n    }\n  }\n\n  // Transfer the ownership of painting back to the guest output thread if it\n  // was taken or if needed for any reason (however, it's taken conditionally -\n  // no guarantees that the actual connection state is accessible here, so only\n  // checking whether the mode is not kNone currently, not the connection\n  // state), and overall synchronize the state taking into account both what has\n  // been done in this function and what could have been done by the UI drawer\n  // callbacks.\n  if (paint_mode_ != PaintMode::kNone) {\n    SetPaintModeFromUIThread(GetDesiredPaintModeFromUIThread(true));\n  }\n  is_in_ui_thread_paint_ = false;\n\n  // Check if the device has been lost. There's no point in requesting repaint\n  // if it has happened anyway, it won't be possible to satisfy such request\n  // with the current Presenter.\n  if (paint_result == PaintResult::kGpuLostExternally ||\n      paint_result == PaintResult::kGpuLostResponsible) {\n    if (host_gpu_loss_callback_) {\n      host_gpu_loss_callback_(paint_result == PaintResult::kGpuLostResponsible,\n                              true);\n    }\n    // The loss callback might have destroyed the presenter, must not do\n    // anything with `this` anymore.\n    return;\n  }\n\n  // Request refresh if needed.\n  // Can't check the exact paintability as the connection state may currently\n  // be owned by the guest output thread, so check conservatively via\n  // paint_mode_.\n  if (paint_mode_ != PaintMode::kNone) {\n    // Immediately paint the guest output if requested explicitly or if the UI\n    // has hidden itself.\n    if (request_guest_output_paint_after_current_ui_thread_paint_ ||\n        (draw_ui && ui_drawers_.empty())) {\n      request_repaint_immediately = true;\n    }\n    if (request_ui_paint_after_current_ui_thread_paint_ &&\n        !ui_drawers_.empty()) {\n      request_repaint_at_tick = true;\n    }\n  }\n  if (request_repaint_at_tick || request_repaint_immediately) {\n    RequestPaintOrConnectionRecoveryViaWindow(request_repaint_immediately);\n  }\n}\n\nbool Presenter::RefreshGuestOutput(\n    uint32_t frontbuffer_width, uint32_t frontbuffer_height,\n    uint32_t display_aspect_ratio_x, uint32_t display_aspect_ratio_y,\n    std::function<bool(GuestOutputRefreshContext& context)> refresher) {\n  GuestOutputProperties& writable_properties =\n      guest_output_properties_[guest_output_mailbox_writable_];\n  writable_properties.frontbuffer_width = frontbuffer_width;\n  writable_properties.frontbuffer_height = frontbuffer_height;\n  writable_properties.display_aspect_ratio_x = display_aspect_ratio_x;\n  writable_properties.display_aspect_ratio_y = display_aspect_ratio_y;\n  writable_properties.is_8bpc = false;\n  bool is_active = writable_properties.IsActive();\n  if (is_active) {\n    if (!RefreshGuestOutputImpl(guest_output_mailbox_writable_,\n                                frontbuffer_width, frontbuffer_height,\n                                refresher, writable_properties.is_8bpc)) {\n      // If failed to refresh, don't send the currently writable image to the\n      // mailbox as it may be in an undefined state. Don't disable the guest\n      // output either though because the failure may be something transient.\n      return false;\n    }\n    guest_output_active_last_refresh_ = true;\n  } else {\n    // Request presenting a blank image if there was a true image previously,\n    // but not now.\n    if (!guest_output_active_last_refresh_) {\n      return false;\n    }\n    guest_output_active_last_refresh_ = false;\n  }\n\n  // Make the new image the next to present on the host (the \"ready\" one),\n  // replacing the one already specified as the next (dropping it instead of\n  // enqueueing the new image after it) to achieve the lowest latency (also,\n  // after switching from UI thread painting to doing it in the guest output\n  // thread, will immediately recover to having the latest frame always sent to\n  // the host present call on the CPU and all frames reaching a present call).\n  uint32_t last_acquired_and_ready =\n      guest_output_mailbox_acquired_and_ready_.load(std::memory_order_relaxed);\n  // Desired acquired = current acquired (changed only by the consumers).\n  // Desired ready = current writable.\n  // memory_order_acq_rel to acquire the new writable image and to release the\n  // current one (to let the consumers take it, from ready to acquired).\n  while (!guest_output_mailbox_acquired_and_ready_.compare_exchange_weak(\n      last_acquired_and_ready,\n      (last_acquired_and_ready & 3) | (guest_output_mailbox_writable_ << 2),\n      std::memory_order_acq_rel, std::memory_order_relaxed)) {\n  }\n  // Now, it's known that `ready == writable` on the host presentation side.\n  // Take the next `writable` with this assumption about its current value in\n  // mind.\n  uint32_t last_acquired = last_acquired_and_ready & 3;\n  if (last_acquired == guest_output_mailbox_writable_) {\n    // The new image has already been acquired by the time the compare-exchange\n    // loop has finished (acquired == ready == currently writable).\n    // It's a valid situation from the ownership perspective, and the semantics\n    // of the weak compare-exchange explicitly permit spurious `false` results.\n    // (3 - a - b) % 3 cannot be used here, as (3 - a - a) % 3 results in `a` -\n    // the same index.\n    // Take any free image. Preferably using + 1, not ^ 1, so if the guest needs\n    // to await any GPU work referencing the image, it will wait for the frame 3\n    // frames ago, not 2, if this happens repeatedly.\n    guest_output_mailbox_writable_ = (guest_output_mailbox_writable_ + 1) % 3;\n  } else {\n    // Take the image other than the last acquired one and the new one,\n    // currently not accessible to the host presentation.\n    guest_output_mailbox_writable_ =\n        (3 - last_acquired - guest_output_mailbox_writable_) % 3;\n  }\n\n  // Trigger the presentation on the host.\n  PaintResult paint_result = PaintResult::kNotPresented;\n  {\n    std::lock_guard<std::mutex> paint_mode_mutex_lock(paint_mode_mutex_);\n    switch (paint_mode_) {\n      case PaintMode::kNone:\n        // Neither painting nor window paint requesting is accessible.\n        break;\n      case PaintMode::kUIThreadOnRequest:\n        // Only window paint requesting is accessible.\n        RequestPaintOrConnectionRecoveryViaWindow(true);\n        break;\n      case PaintMode::kGuestOutputThreadImmediately:\n        // Both painting and window paint requesting are accessible.\n        if (surface_paint_connection_state_ ==\n            SurfacePaintConnectionState::kConnectedPaintable) {\n          paint_result = PaintAndPresent(false);\n          if (surface_paint_connection_state_ ==\n              SurfacePaintConnectionState::kConnectedOutdated) {\n            RequestPaintOrConnectionRecoveryViaWindow(true);\n          }\n        }\n        break;\n    }\n  }\n  // Handle GPU loss when not in the middle of the function anymore, and\n  // lifecycle management from the GPU loss callback is fine on the UI thread.\n  if (host_gpu_loss_callback_) {\n    if (paint_result == PaintResult::kGpuLostResponsible) {\n      host_gpu_loss_callback_(true, false);\n    } else if (paint_result == PaintResult::kGpuLostExternally) {\n      host_gpu_loss_callback_(false, false);\n    }\n  }\n\n  return is_active;\n}\n\nvoid Presenter::SetGuestOutputPaintConfigFromUIThread(\n    const GuestOutputPaintConfig& new_config) {\n  // For simplicity, this may be called externally repeatedly.\n  // Lock the mutex only when something has been modified, and also don't\n  // request UI thread guest output redraws when not needed.\n  bool modified = false;\n  bool request_repaint = false;\n  if (guest_output_paint_config_.GetEffect() != new_config.GetEffect()) {\n    modified = true;\n    request_repaint = true;\n  }\n  if (guest_output_paint_config_.GetFsrSharpnessReduction() !=\n      new_config.GetFsrSharpnessReduction()) {\n    modified = true;\n    if (new_config.GetEffect() == GuestOutputPaintConfig::Effect::kFsr) {\n      request_repaint = true;\n    }\n  }\n  if (guest_output_paint_config_.GetCasAdditionalSharpness() !=\n      new_config.GetCasAdditionalSharpness()) {\n    modified = true;\n    if (new_config.GetEffect() == GuestOutputPaintConfig::Effect::kCas ||\n        new_config.GetEffect() == GuestOutputPaintConfig::Effect::kFsr) {\n      request_repaint = true;\n    }\n  }\n  if (guest_output_paint_config_.GetDither() != new_config.GetDither()) {\n    modified = true;\n    request_repaint = true;\n  }\n  if (modified) {\n    {\n      std::unique_lock<std::mutex> config_lock(\n          guest_output_paint_config_mutex_);\n      guest_output_paint_config_ = new_config;\n    }\n    // Coarsely check the availability of painting and of the window (for\n    // calling RequestPaint) via paint_mode_ because the actual painting\n    // connection state may currently be owned not by the UI thread.\n    if (request_repaint && paint_mode_ != PaintMode::kNone) {\n      if (is_in_ui_thread_paint_) {\n        // Defer until the end of the current paint if called from, for\n        // instance, a UI drawer.\n        request_guest_output_paint_after_current_ui_thread_paint_ = true;\n      } else {\n        RequestPaintOrConnectionRecoveryViaWindow(true);\n      }\n    }\n  }\n}\n\nvoid Presenter::AddUIDrawerFromUIThread(UIDrawer* drawer, size_t z_order) {\n  assert_not_null(drawer);\n  // Obtain whether the iterator list was empty before erasing in case of\n  // replacing with a new entry with a different Z order happens.\n  bool drawers_were_empty = ui_drawers_.empty();\n  uint64_t drawer_last_draw = UINT64_MAX;\n  // Check if already added.\n  for (auto it_existing = ui_drawers_.begin(); it_existing != ui_drawers_.end();\n       ++it_existing) {\n    if (it_existing->second.drawer != drawer) {\n      continue;\n    }\n    if (it_existing->first == z_order) {\n      return;\n    }\n    // Keep the same last draw index to prevent the drawer from being executed\n    // twice if increasing its Z order during the drawer loop.\n    drawer_last_draw = it_existing->second.last_draw;\n    // If removing the drawer that is the next in the current drawer loop, skip\n    // it (in a multimap, only one element iterator is invalidated).\n    if (is_executing_ui_drawers_ && ui_draw_next_iterator_ == it_existing) {\n      ++ui_draw_next_iterator_;\n    }\n    ui_drawers_.erase(it_existing);\n    break;\n  }\n  auto it_new =\n      ui_drawers_.emplace(z_order, UIDrawerReference(drawer, drawer_last_draw));\n  // If adding to the Z layer currently being processed (for drawing, from the\n  // lowest to the highest), or to layers in between the current and the\n  // previously next, make sure the new drawer is executed too.\n  if (is_executing_ui_drawers_ && z_order >= ui_draw_current_z_order_ &&\n      (ui_draw_next_iterator_ == ui_drawers_.end() ||\n       z_order < ui_draw_next_iterator_->first)) {\n    ui_draw_next_iterator_ = it_new;\n  }\n  HandleUIDrawersChangeFromUIThread(drawers_were_empty);\n}\n\nvoid Presenter::RemoveUIDrawerFromUIThread(UIDrawer* drawer) {\n  assert_not_null(drawer);\n  for (auto it_existing = ui_drawers_.begin(); it_existing != ui_drawers_.end();\n       ++it_existing) {\n    if (it_existing->second.drawer != drawer) {\n      continue;\n    }\n    // If removing the drawer that is the next in the current drawer loop, skip\n    // it (in a multimap, only one element iterator is invalidated).\n    if (is_executing_ui_drawers_ && ui_draw_next_iterator_ == it_existing) {\n      ++ui_draw_next_iterator_;\n    }\n    ui_drawers_.erase(it_existing);\n    HandleUIDrawersChangeFromUIThread(false);\n    return;\n  }\n}\n\nvoid Presenter::RequestUIPaintFromUIThread() {\n  if (is_in_ui_thread_paint_) {\n    // The paint request will be done once in the end of PaintFromUIThread\n    // according to the actual state at the moment that happens. It's common for\n    // drawers to call this (even every frame), and no need to do too many OS\n    // paint request calls.\n    request_ui_paint_after_current_ui_thread_paint_ = true;\n    return;\n  }\n  // The connection state may be owned by the guest output thread now rather\n  // than the UI thread, check whether it's not pointless to make the request\n  // coarsely via paint_mode_.\n  if (!ui_drawers_.empty() && paint_mode_ != PaintMode::kNone) {\n    // The window must be present, otherwise the conditions wouldn't have been\n    // met.\n    window_->RequestPaint();\n  }\n}\n\nbool Presenter::InitializeCommonSurfaceIndependent() {\n  // Initialize UI frame rate limiting.\n#if XE_PLATFORM_WIN32\n  dxgi_ui_tick_thread_ = std::thread(&Presenter::DXGIUITickThread, this);\n#endif  // XE_PLATFORM\n\n  return true;\n}\n\nstd::unique_lock<std::mutex> Presenter::ConsumeGuestOutput(\n    uint32_t& mailbox_index_or_max_if_inactive_out,\n    GuestOutputProperties* properties_out,\n    GuestOutputPaintConfig* paint_config_out) {\n  if (paint_config_out) {\n    // Get the up-to-date guest output paint configuration settings set by the\n    // UI thread.\n    std::unique_lock<std::mutex> config_lock(guest_output_paint_config_mutex_);\n    *paint_config_out = guest_output_paint_config_;\n  }\n\n  // Lock the mutex to make sure the image that will be acquired now is owned\n  // exclusively by the calling thread for the time while this mutex is still\n  // locked (it needs to be held by the consumer while working with anything\n  // that depends on the image now being acquired or its index in the mailbox).\n  std::unique_lock<std::mutex> consumer_lock(\n      guest_output_mailbox_consumer_mutex_);\n  // Acquire the up-to-date ready guest image (may be new, in this case the last\n  // acquired one will be released, or still the same or no refresh has happened\n  // since the last consumption).\n  // memory_order_relaxed here because the ready index from this load will be\n  // used directly only if it's the same as during the last consumption - thus\n  // the image has already been acquired previously, no need for\n  // memory_order_acquire (if the image has been acquired by a different\n  // consumer though, the consumer mutex performs memory access ordering).\n  uint32_t old_acquired_and_ready =\n      guest_output_mailbox_acquired_and_ready_.load(std::memory_order_relaxed);\n  // Desired acquired = current ready.\n  // Desired ready = current ready (changed only by the producer).\n  uint32_t desired_acquired_and_ready =\n      (old_acquired_and_ready & ~uint32_t(3)) | (old_acquired_and_ready >> 2);\n  // Either the same image as during the last consumption, or a new one, is\n  // satisfying. However, if it's new, using memory_order_acq_rel to acquire the\n  // new ready image (to make it acquired) and to release the old acquired image\n  // (to let the producer take it as writable).\n  while (old_acquired_and_ready != desired_acquired_and_ready &&\n         !guest_output_mailbox_acquired_and_ready_.compare_exchange_weak(\n             old_acquired_and_ready, desired_acquired_and_ready,\n             std::memory_order_acq_rel, std::memory_order_relaxed)) {\n    desired_acquired_and_ready =\n        (old_acquired_and_ready & ~uint32_t(3)) | (old_acquired_and_ready >> 2);\n  }\n  uint32_t mailbox_index = desired_acquired_and_ready & 3;\n  // Give the current acquired image to the caller, or UINT32_MAX if it's\n  // inactive.\n  const GuestOutputProperties& properties =\n      guest_output_properties_[mailbox_index];\n  mailbox_index_or_max_if_inactive_out =\n      properties.IsActive() ? mailbox_index : UINT32_MAX;\n  if (properties_out) {\n    *properties_out = properties;\n  }\n  return std::move(consumer_lock);\n}\n\nPresenter::GuestOutputPaintFlow Presenter::GetGuestOutputPaintFlow(\n    const GuestOutputProperties& properties, uint32_t host_rt_width,\n    uint32_t host_rt_height, uint32_t max_rt_width, uint32_t max_rt_height,\n    const GuestOutputPaintConfig& config) const {\n  GuestOutputPaintFlow flow = {};\n\n  // FIXME(Triang3l): Configuration variables racing with per-game config\n  // loading.\n\n  assert_not_zero(max_rt_width);\n  assert_not_zero(max_rt_height);\n\n  // Initialize one clear rectangle for the case of drawing no guest output, for\n  // consistency with fewer state dependencies.\n  flow.letterbox_clear_rectangle_count = 1;\n  flow.letterbox_clear_rectangles[0].width = host_rt_width;\n  flow.letterbox_clear_rectangles[0].height = host_rt_height;\n\n  // For safety such as division by zero prevention.\n  if (!properties.IsActive() || !host_rt_width || !host_rt_height ||\n      !surface_width_in_paint_connection_ ||\n      !surface_height_in_paint_connection_) {\n    return flow;\n  }\n\n  flow.properties = properties;\n\n  // Multiplication-division rounding to the nearest.\n  auto rescale_unsigned = [](uint32_t value, uint32_t new_scale,\n                             uint32_t old_scale) -> uint32_t {\n    return uint32_t((uint64_t(value) * new_scale + (old_scale >> 1)) /\n                    old_scale);\n  };\n  auto rescale_signed = [](int32_t value, uint32_t new_scale,\n                           uint32_t old_scale) -> int32_t {\n    // Plus old_scale / 2 for positive values, minus old_scale / 2 for\n    // negative values for consistent rounding for both positive and\n    // negative values (as the `/` operator rounds towards zero).\n    // Example:\n    // (-3 - 1) / 3 == -1\n    // (-2 - 1) / 3 == -1\n    // (-1 - 1) / 3 == 0\n    // ---\n    // (0 + 1) / 3 == 0\n    // (1 + 1) / 3 == 0\n    // (2 + 1) / 3 == 1\n    return int32_t((int64_t(value) * new_scale +\n                    int32_t(old_scale >> 1) * (value < 0 ? -1 : 1)) /\n                   old_scale);\n  };\n\n  // Final output location and dimensions.\n  // All host location calculations are DPI-independent, conceptually depending\n  // only on the aspect ratios, not the absolute values.\n  uint32_t output_width, output_height;\n  if (uint64_t(surface_width_in_paint_connection_) *\n          properties.display_aspect_ratio_y >\n      uint64_t(surface_height_in_paint_connection_) *\n          properties.display_aspect_ratio_x) {\n    // The window is wider that the source - crop along Y to preserve the aspect\n    // ratio while stretching throughout the entire surface's width, then limit\n    // the Y cropping via letterboxing or stretching along X.\n    uint32_t present_safe_area;\n    if (config.GetAllowOverscanCutoff() && cvars::present_safe_area_y > 0 &&\n        cvars::present_safe_area_y < 100) {\n      present_safe_area = uint32_t(cvars::present_safe_area_y);\n    } else {\n      present_safe_area = 100;\n    }\n    // Scale the desired width by the H:W aspect ratio (inverse of W:H) to get\n    // the height.\n    output_height = rescale_unsigned(surface_width_in_paint_connection_,\n                                     properties.display_aspect_ratio_y,\n                                     properties.display_aspect_ratio_x);\n    bool letterbox = false;\n    if (output_height * present_safe_area >\n        surface_height_in_paint_connection_ * 100) {\n      // Don't crop out more than the safe area margin - letterbox or stretch.\n      output_height = rescale_unsigned(surface_height_in_paint_connection_, 100,\n                                       present_safe_area);\n      letterbox = true;\n    }\n    if (letterbox && cvars::present_letterbox) {\n      output_width = rescale_unsigned(\n          surface_height_in_paint_connection_ * 100,\n          properties.display_aspect_ratio_x,\n          properties.display_aspect_ratio_y * present_safe_area);\n      // output_width might have been rounded up already by rescale_unsigned, so\n      // rounding down in this division.\n      flow.output_x = (int32_t(surface_width_in_paint_connection_) -\n                       int32_t(output_width)) /\n                      2;\n    } else {\n      output_width = surface_width_in_paint_connection_;\n      flow.output_x = 0;\n    }\n    // output_height might have been rounded up already by rescale_unsigned, so\n    // rounding down in this division.\n    flow.output_y = (int32_t(surface_height_in_paint_connection_) -\n                     int32_t(output_height)) /\n                    2;\n  } else {\n    // The window is taller that the source - crop along X to preserve the\n    // aspect ratio while stretching throughout the entire surface's height,\n    // then limit the X cropping via letterboxing or stretching along Y.\n    uint32_t present_safe_area;\n    if (config.GetAllowOverscanCutoff() && cvars::present_safe_area_x > 0 &&\n        cvars::present_safe_area_x < 100) {\n      present_safe_area = uint32_t(cvars::present_safe_area_x);\n    } else {\n      present_safe_area = 100;\n    }\n    // Scale the desired height by the W:H aspect ratio to get the width.\n    output_width = rescale_unsigned(surface_height_in_paint_connection_,\n                                    properties.display_aspect_ratio_x,\n                                    properties.display_aspect_ratio_y);\n    bool letterbox = false;\n    if (output_width * present_safe_area >\n        surface_width_in_paint_connection_ * 100) {\n      // Don't crop out more than the safe area margin - letterbox or stretch.\n      output_width = rescale_unsigned(surface_width_in_paint_connection_, 100,\n                                      present_safe_area);\n      letterbox = true;\n    }\n    if (letterbox && cvars::present_letterbox) {\n      output_height = rescale_unsigned(\n          surface_width_in_paint_connection_ * 100,\n          properties.display_aspect_ratio_y,\n          properties.display_aspect_ratio_x * present_safe_area);\n      // output_height might have been rounded up already by rescale_unsigned,\n      // so rounding down in this division.\n      flow.output_y = (int32_t(surface_height_in_paint_connection_) -\n                       int32_t(output_height)) /\n                      2;\n    } else {\n      output_height = surface_height_in_paint_connection_;\n      flow.output_y = 0;\n    }\n    // output_width might have been rounded up already by rescale_unsigned, so\n    // rounding down in this division.\n    flow.output_x =\n        (int32_t(surface_width_in_paint_connection_) - int32_t(output_width)) /\n        2;\n  }\n\n  // Convert the location from surface pixels (which have 1:1 aspect ratio\n  // relatively to the physical display) to render target pixels (the render\n  // target size may be arbitrary with any aspect ratio, but if it's different\n  // than the surface size, the OS is expected to stretch it to the surface\n  // boundaries), preserving the aspect ratio.\n  if (host_rt_width != surface_width_in_paint_connection_) {\n    flow.output_x = rescale_signed(flow.output_x, host_rt_width,\n                                   surface_width_in_paint_connection_);\n    output_width = rescale_unsigned(output_width, host_rt_width,\n                                    surface_width_in_paint_connection_);\n  }\n  if (host_rt_height != surface_height_in_paint_connection_) {\n    flow.output_y = rescale_signed(flow.output_y, host_rt_height,\n                                   surface_height_in_paint_connection_);\n    output_height = rescale_unsigned(output_height, host_rt_height,\n                                     surface_height_in_paint_connection_);\n  }\n\n  // The out-of-bounds checks are needed for correct letterbox calculations.\n  // Though this normally shouldn't happen, but in case of rounding issues with\n  // extreme values.\n  int32_t output_right = flow.output_x + int32_t(output_width);\n  int32_t output_bottom = flow.output_y + int32_t(output_height);\n  if (!output_width || !output_height || output_right <= 0 ||\n      output_bottom <= 0 || flow.output_x >= int32_t(host_rt_width) ||\n      flow.output_y >= int32_t(host_rt_height)) {\n    return flow;\n  }\n\n  // The output image may have a part of it outside the final render target (if\n  // using the overscan area to stretch the image to the entire surface while\n  // preserving the guest aspect ratio if it differs from the host one, for\n  // instance). While the final render target size is known to be within the\n  // host render target / image size limit, the intermediate images may be\n  // larger than that as they include the overscan area that will be outside the\n  // screen. Make sure the intermediate images can't be larger than the maximum\n  // render target size.\n  uint32_t output_width_clamped = std::min(output_width, max_rt_width);\n  uint32_t output_height_clamped = std::min(output_height, max_rt_height);\n\n  if (config.GetEffect() == GuestOutputPaintConfig::Effect::kCas ||\n      config.GetEffect() == GuestOutputPaintConfig::Effect::kFsr) {\n    // FidelityFX Super Resolution and Contrast Adaptive Sharpening only work\n    // good for up to 2x2 upscaling due to the way they fetch texels.\n    // CAS is primarily a sharpening filter, not an upscaling one (its upscaling\n    // eliminates reduces blurriness, but doesn't preserve the shapes of edges,\n    // and executing it multiple times will only result in oversharpening. So,\n    // using it for scales only of up to 2x2, then simply stretching with\n    // bilinear filtering.\n    // EASU of FSR, however, preserves edges, it's not supposed to blur them or\n    // to make them jagged, so it can be executed multiple times - running\n    // multiple EASU passes for scale factors of over 2x2.\n    // Just one EASU pass rather than multiple for scaling to factors bigger\n    // than 2x2 (especially significantly bigger, such as 1152x640 to 3840x2160,\n    // or 3.333x3.375) results in blurry edges and an overall noisy look,\n    // multiple passes improve visual stability.\n    std::pair<uint32_t, uint32_t> ffx_last_size;\n    if (flow.effect_count) {\n      ffx_last_size = flow.effect_output_sizes[flow.effect_count - 1];\n    } else {\n      ffx_last_size.first = properties.frontbuffer_width;\n      ffx_last_size.second = properties.frontbuffer_height;\n    }\n    if (config.GetEffect() == GuestOutputPaintConfig::Effect::kFsr &&\n        (ffx_last_size.first < output_width_clamped ||\n         ffx_last_size.second < output_height_clamped)) {\n      // AMD FidelityFX Super Resolution - upsample along at least one axis.\n      // Using the output size clamped to the maximum render target size here as\n      // EASU will always write to intermediate images, and RCAS supports only\n      // 1:1.\n      uint32_t easu_max_passes = config.GetFsrMaxUpsamplingPasses();\n      uint32_t easu_pass_count = 0;\n      while (easu_pass_count < easu_max_passes &&\n             (ffx_last_size.first < output_width_clamped ||\n              ffx_last_size.second < output_height_clamped)) {\n        ffx_last_size.first =\n            std::min(ffx_last_size.first * uint32_t(2), output_width_clamped);\n        ffx_last_size.second =\n            std::min(ffx_last_size.second * uint32_t(2), output_height_clamped);\n        assert_true(flow.effect_count < flow.effects.size());\n        flow.effect_output_sizes[flow.effect_count] = ffx_last_size;\n        flow.effects[flow.effect_count++] = GuestOutputPaintEffect::kFsrEasu;\n        ++easu_pass_count;\n      }\n      assert_true(flow.effect_count < flow.effects.size());\n      flow.effect_output_sizes[flow.effect_count] = ffx_last_size;\n      flow.effects[flow.effect_count++] = GuestOutputPaintEffect::kFsrRcas;\n    } else {\n      // AMD FidelityFX Contrast Adaptive Sharpening - sharpen or downsample, or\n      // upsample up to 2x2 if CAS is specified to be used for upscaling too.\n      // Using the unclamped output size as CAS may be the last pass - if a\n      // bilinear pass is needed afterwards, and the CAS pass will be writing to\n      // an intermediate image, the CAS pass output size will be clamped while\n      // adding the bilinear stretch.\n      std::pair<uint32_t, uint32_t> pre_cas_size = ffx_last_size;\n      ffx_last_size.first =\n          std::min(ffx_last_size.first * uint32_t(2), output_width);\n      ffx_last_size.second =\n          std::min(ffx_last_size.second * uint32_t(2), output_height);\n      assert_true(flow.effect_count < flow.effects.size());\n      flow.effect_output_sizes[flow.effect_count] = ffx_last_size;\n      flow.effects[flow.effect_count++] =\n          ffx_last_size == pre_cas_size ? GuestOutputPaintEffect::kCasSharpen\n                                        : GuestOutputPaintEffect::kCasResample;\n    }\n  }\n\n  std::pair<uint32_t, uint32_t>* last_pre_bilinear_effect_size =\n      flow.effect_count ? &flow.effect_output_sizes[flow.effect_count - 1]\n                        : nullptr;\n  if (!last_pre_bilinear_effect_size ||\n      last_pre_bilinear_effect_size->first != output_width ||\n      last_pre_bilinear_effect_size->second != output_height) {\n    // If not using FidelityFX, or it has reached its upscaling capabilities,\n    // but more is needed, stretch via bilinear filtering.\n    // Clamp the output size of the last effect to the maximum render target\n    // size because it will go to an intermediate image now.\n    if (last_pre_bilinear_effect_size) {\n      // RCAS only works for 1:1, clamping must be done explicitly for FSR.\n      assert_false(flow.effects[flow.effect_count - 1] ==\n                       GuestOutputPaintEffect::kFsrRcas &&\n                   (last_pre_bilinear_effect_size->first > max_rt_width ||\n                    last_pre_bilinear_effect_size->second > max_rt_height));\n      last_pre_bilinear_effect_size->first =\n          std::min(last_pre_bilinear_effect_size->first, max_rt_width);\n      last_pre_bilinear_effect_size->second =\n          std::min(last_pre_bilinear_effect_size->second, max_rt_height);\n    }\n    assert_true(flow.effect_count < flow.effects.size());\n    flow.effect_output_sizes[flow.effect_count] =\n        std::make_pair(output_width, output_height);\n    flow.effects[flow.effect_count++] = GuestOutputPaintEffect::kBilinear;\n  }\n\n  assert_not_zero(flow.effect_count);\n\n  if (config.GetDither()) {\n    // Dithering must be applied only to the final effect since resampling and\n    // sharpening filters may considering the dithering noise features and\n    // amplify it.\n    GuestOutputPaintEffect& last_effect = flow.effects[flow.effect_count - 1];\n    switch (last_effect) {\n      case GuestOutputPaintEffect::kBilinear:\n        // Dithering has no effect for 1:1 copying of a 8bpc image.\n        if (!properties.is_8bpc || flow.effect_count > 1 ||\n            output_width != properties.frontbuffer_width ||\n            output_height != properties.frontbuffer_height) {\n          last_effect = GuestOutputPaintEffect::kBilinearDither;\n        }\n        break;\n      case GuestOutputPaintEffect::kCasSharpen:\n        last_effect = GuestOutputPaintEffect::kCasSharpenDither;\n        break;\n      case GuestOutputPaintEffect::kCasResample:\n        last_effect = GuestOutputPaintEffect::kCasResampleDither;\n        break;\n      case GuestOutputPaintEffect::kFsrRcas:\n        last_effect = GuestOutputPaintEffect::kFsrRcasDither;\n        break;\n      default:\n        break;\n    }\n  }\n\n#ifndef NDEBUG\n  for (size_t i = 0; i + 1 < flow.effect_count; ++i) {\n    assert_true(CanGuestOutputPaintEffectBeIntermediate(flow.effects[i]));\n  }\n  assert_true(\n      CanGuestOutputPaintEffectBeFinal(flow.effects[flow.effect_count - 1]));\n#endif\n\n  // Calculate the letterbox geometry.\n  if (flow.effect_count) {\n    flow.letterbox_clear_rectangle_count = 0;\n    uint32_t letterbox_mid_top = uint32_t(std::max(flow.output_y, int32_t(0)));\n    // Top.\n    if (letterbox_mid_top) {\n      assert_true(flow.letterbox_clear_rectangle_count <\n                  flow.letterbox_clear_rectangles.size());\n      GuestOutputPaintFlow::ClearRectangle& letterbox_clear_rectangle_top =\n          flow.letterbox_clear_rectangles\n              [flow.letterbox_clear_rectangle_count++];\n      letterbox_clear_rectangle_top.x = 0;\n      letterbox_clear_rectangle_top.y = 0;\n      letterbox_clear_rectangle_top.width = host_rt_width;\n      letterbox_clear_rectangle_top.height = letterbox_mid_top;\n    }\n    uint32_t letterbox_mid_bottom =\n        std::min(uint32_t(output_bottom), host_rt_height);\n    uint32_t letterbox_mid_height = letterbox_mid_bottom - letterbox_mid_top;\n    // Middle-left.\n    if (flow.output_x > 0) {\n      assert_true(flow.letterbox_clear_rectangle_count <\n                  flow.letterbox_clear_rectangles.size());\n      GuestOutputPaintFlow::ClearRectangle& letterbox_clear_rectangle_left =\n          flow.letterbox_clear_rectangles\n              [flow.letterbox_clear_rectangle_count++];\n      letterbox_clear_rectangle_left.x = 0;\n      letterbox_clear_rectangle_left.y = letterbox_mid_top;\n      letterbox_clear_rectangle_left.width = uint32_t(flow.output_x);\n      letterbox_clear_rectangle_left.height = letterbox_mid_height;\n    }\n    // Middle-right.\n    if (uint32_t(output_right) < host_rt_width) {\n      assert_true(flow.letterbox_clear_rectangle_count <\n                  flow.letterbox_clear_rectangles.size());\n      GuestOutputPaintFlow::ClearRectangle& letterbox_clear_rectangle_right =\n          flow.letterbox_clear_rectangles\n              [flow.letterbox_clear_rectangle_count++];\n      letterbox_clear_rectangle_right.x = uint32_t(output_right);\n      letterbox_clear_rectangle_right.y = letterbox_mid_top;\n      letterbox_clear_rectangle_right.width =\n          host_rt_width - uint32_t(output_right);\n      letterbox_clear_rectangle_right.height = letterbox_mid_height;\n    }\n    // Bottom.\n    if (letterbox_mid_bottom < host_rt_height) {\n      assert_true(flow.letterbox_clear_rectangle_count <\n                  flow.letterbox_clear_rectangles.size());\n      GuestOutputPaintFlow::ClearRectangle& letterbox_clear_rectangle_top =\n          flow.letterbox_clear_rectangles\n              [flow.letterbox_clear_rectangle_count++];\n      letterbox_clear_rectangle_top.x = 0;\n      letterbox_clear_rectangle_top.y = letterbox_mid_bottom;\n      letterbox_clear_rectangle_top.width = host_rt_width;\n      letterbox_clear_rectangle_top.height =\n          host_rt_height - letterbox_mid_bottom;\n    }\n  }\n\n  return flow;\n}\n\nvoid Presenter::ExecuteUIDrawersFromUIThread(UIDrawContext& ui_draw_context) {\n  // May be called by the implementations only when requested.\n  assert_true(is_in_ui_thread_paint_);\n  // Drawers can add or remove drawers (including themselves), need to ensure\n  // iterator validity in this case.\n  assert_false(is_executing_ui_drawers_);\n  ui_draw_next_iterator_ = ui_drawers_.begin();\n  is_executing_ui_drawers_ = true;\n  while (ui_draw_next_iterator_ != ui_drawers_.end()) {\n    // The current iterator may be invalidated, and ui_draw_next_iterator_ may\n    // be changed, during the execution of the drawer if the list of the drawers\n    // is modified by it - don't assume that after the call\n    // ui_draw_next_iterator_ will be the same as\n    // std::next(ui_draw_next_iterator_) before it.\n    auto it_current = ui_draw_next_iterator_++;\n    // Don't draw twice if already drawn in this frame (may happen if the Z\n    // order of a drawer was increased from below the current one to above it by\n    // one of the drawers).\n    if (it_current->second.last_draw != ui_draw_current_) {\n      ui_draw_current_z_order_ = it_current->first;\n      it_current->second.last_draw = ui_draw_current_;\n      it_current->second.drawer->Draw(ui_draw_context);\n    }\n  }\n  is_executing_ui_drawers_ = false;\n  ++ui_draw_current_;\n}\n\nvoid Presenter::SetPaintModeFromUIThread(PaintMode new_mode) {\n  // Can be modified only from the UI thread, so can skip locking if it's the\n  // same.\n  if (paint_mode_ == new_mode) {\n    return;\n  }\n  {\n    std::lock_guard<std::mutex> lock(paint_mode_mutex_);\n    paint_mode_ = new_mode;\n  }\n  UpdateUITicksNeededFromUIThread();\n}\n\nPresenter::PaintMode Presenter::GetDesiredPaintModeFromUIThread(\n    bool is_paintable) const {\n  if (!is_paintable) {\n    // The only case when kNone can be returned, for surface connection updates\n    // when it's known that the UI thread currently has access to the connection\n    // lifecycle.\n    return PaintMode::kNone;\n  }\n  if (!cvars::host_present_from_non_ui_thread) {\n    return PaintMode::kUIThreadOnRequest;\n  }\n  if (surface_paint_connection_has_implicit_vsync_) {\n    // Don't be causing host vertical sync CPU waits in the thread generating\n    // the guest output.\n    return PaintMode::kUIThreadOnRequest;\n  }\n  if (!ui_drawers_.empty()) {\n    // The UI can be drawn only by the UI thread, and it needs to be drawn -\n    // paint in the UI thread.\n    return PaintMode::kUIThreadOnRequest;\n  }\n  // Only the guest output needs to be drawn - let the guest output thread\n  // present immediately for a lower latency.\n  return PaintMode::kGuestOutputThreadImmediately;\n}\n\nvoid Presenter::DisconnectPaintingFromSurfaceFromUIThread(\n    SurfacePaintConnectionState new_state) {\n  assert_false(IsConnectedSurfacePaintConnectionState(new_state));\n  if (IsConnectedSurfacePaintConnectionState(surface_paint_connection_state_)) {\n    DisconnectPaintingFromSurfaceFromUIThreadImpl();\n  }\n  surface_paint_connection_state_ = new_state;\n  surface_paint_connection_has_implicit_vsync_ = false;\n  surface_width_in_paint_connection_ = 0;\n  surface_height_in_paint_connection_ = 0;\n}\n\nvoid Presenter::UpdateSurfacePaintConnectionFromUIThread(\n    bool* repaint_needed_out, bool update_paint_mode_to_desired) {\n  assert_not_null(surface_);\n\n  // Validate that painting lifecycle is accessible by the UI thread currently,\n  // not given to the guest output thread. The mode can be modified only by\n  // the UI thread, so no need to lock the mutex.\n  assert_true(paint_mode_ != PaintMode::kGuestOutputThreadImmediately);\n\n  // Initialize repaint_needed_out for failure cases.\n  if (repaint_needed_out) {\n    *repaint_needed_out = false;\n  }\n\n  // If the connection state is kUnconnectedSurfaceReportedUnusable, the\n  // implementation has reported that the surface is not usable by the presenter\n  // at all, and it's pointless to retry connecting to it.\n  if (surface_paint_connection_state_ !=\n      SurfacePaintConnectionState::kUnconnectedSurfaceReportedUnusable) {\n    uint32_t surface_width = 0, surface_height = 0;\n    bool surface_area_available =\n        surface_->GetSize(surface_width, surface_height);\n    if (!surface_area_available) {\n      // The surface is currently zero-area (or has become zero-area), try again\n      // when it's resized.\n      DisconnectPaintingFromSurfaceFromUIThread(\n          SurfacePaintConnectionState::kUnconnectedRetryAtStateChange);\n    } else {\n      bool is_reconnect = IsConnectedSurfacePaintConnectionState(\n          surface_paint_connection_state_);\n      bool is_vsync_implicit = false;\n      SurfacePaintConnectResult connect_result =\n          ConnectOrReconnectPaintingToSurfaceFromUIThread(\n              *surface_, surface_width, surface_height,\n              surface_paint_connection_state_ ==\n                  SurfacePaintConnectionState::kConnectedPaintable,\n              is_vsync_implicit);\n      switch (connect_result) {\n        case SurfacePaintConnectResult::kSuccess:\n          if (repaint_needed_out) {\n            *repaint_needed_out = true;\n          }\n          // Fallthrough to common success handling.\n        case SurfacePaintConnectResult::kSuccessUnchanged:\n          // Don't know yet what the first result was (success or suboptimal).\n          surface_paint_connection_was_optimal_at_successful_paint_ = false;\n          surface_paint_connection_state_ =\n              SurfacePaintConnectionState::kConnectedPaintable;\n          surface_paint_connection_has_implicit_vsync_ = is_vsync_implicit;\n          surface_width_in_paint_connection_ = surface_width;\n          surface_height_in_paint_connection_ = surface_height;\n          if (!is_reconnect) {\n            *repaint_needed_out = true;\n          }\n          break;\n        case SurfacePaintConnectResult::kFailure:\n          surface_paint_connection_state_ =\n              SurfacePaintConnectionState::kUnconnectedRetryAtStateChange;\n          break;\n        case SurfacePaintConnectResult::kFailureSurfaceUnusable:\n          surface_paint_connection_state_ =\n              SurfacePaintConnectionState::kUnconnectedSurfaceReportedUnusable;\n          break;\n      }\n    }\n  }\n\n  if (update_paint_mode_to_desired) {\n    SetPaintModeFromUIThread(GetDesiredPaintModeFromUIThread(\n        surface_paint_connection_state_ ==\n        SurfacePaintConnectionState::kConnectedPaintable));\n  }\n}\n\nbool Presenter::RequestPaintOrConnectionRecoveryViaWindow(\n    bool force_ui_thread_paint_tick) {\n  // Can be called from any thread if an existing window_ is available in it,\n  // and it's known to have a Surface that will be the same throughout this\n  // call - not doing any checks whether this request can be satisfied\n  // theoretically. For safety, check whether the window exists unconditionally.\n  assert_not_null(window_);\n  assert_not_null(surface_);\n  if (ui_thread_paint_requested_.exchange(true, std::memory_order_relaxed)) {\n    // Invalidation pending already, no need to do it twice.\n    return false;\n  }\n  if (force_ui_thread_paint_tick) {\n    ForceUIThreadPaintTick();\n  }\n  window_->RequestPaint();\n  return true;\n}\n\nvoid Presenter::UpdateSurfaceMonitorFromUIThread(\n    bool old_monitor_potentially_disconnected) {\n  // For dropping the monitor when the window is closing and is losing its\n  // surface, the existence of `surface_` (which implies that `window_` exists\n  // too) must be the condition for a non-null monitor, not just the existence\n  // of `window_`.\n#if XE_PLATFORM_WIN32\n  HMONITOR surface_new_win32_monitor = nullptr;\n  if (surface_) {\n    HWND hwnd = static_cast<const Win32Window*>(window_)->hwnd();\n    // The HWND may be non-existent if the window has been closed and destroyed\n    // (the HWND, not the xe::ui::Window) already.\n    if (hwnd) {\n      surface_new_win32_monitor =\n          MonitorFromWindow(hwnd, MONITOR_DEFAULTTONULL);\n    }\n  }\n  if (old_monitor_potentially_disconnected ||\n      surface_win32_monitor_ != surface_new_win32_monitor) {\n    surface_win32_monitor_ = surface_new_win32_monitor;\n    if (dxgi_ui_tick_factory_ && !dxgi_ui_tick_factory_->IsCurrent()) {\n      // If a monitor has been newly connected, it won't appear in the old\n      // factory, need to recreate it.\n      {\n        Microsoft::WRL::ComPtr<IDXGIOutput> old_factory_output_to_release;\n        {\n          std::scoped_lock<std::mutex> dxgi_ui_tick_lock(dxgi_ui_tick_mutex_);\n          old_factory_output_to_release = std::move(dxgi_ui_tick_output_);\n        }\n      }\n      dxgi_ui_tick_factory_.Reset();\n    }\n    if (!dxgi_ui_tick_factory_) {\n      if (FAILED(CreateDXGIFactory1(IID_PPV_ARGS(&dxgi_ui_tick_factory_)))) {\n        XELOGE(\"Presenter: Failed to create a DXGI factory\");\n      }\n    }\n    Microsoft::WRL::ComPtr<IDXGIOutput> new_dxgi_output;\n    if (dxgi_ui_tick_factory_ && surface_new_win32_monitor) {\n      new_dxgi_output = GetDXGIOutputForMonitor(dxgi_ui_tick_factory_.Get(),\n                                                surface_new_win32_monitor);\n    }\n    // If the adapter was recreated, and the old output was released before its\n    // destruction, notifying is still required - the vertical blank wait thread\n    // might have entered the condition variable wait already as the output was\n    // null.\n    bool signal_dxgi_ui_tick_control;\n    {\n      std::unique_lock<std::mutex> dxgi_ui_tick_lock(dxgi_ui_tick_mutex_);\n      bool dxgi_output_was_null = (dxgi_ui_tick_output_ == nullptr);\n      dxgi_ui_tick_output_ = new_dxgi_output;\n      signal_dxgi_ui_tick_control =\n          dxgi_output_was_null && AreDXGIUITicksWaitable(dxgi_ui_tick_lock);\n    }\n    if (signal_dxgi_ui_tick_control) {\n      dxgi_ui_tick_control_condition_.notify_all();\n    }\n  }\n#endif  // XE_PLATFORM\n}\n\nbool Presenter::InSurfaceOnMonitorFromUIThread() const {\n  if (!surface_) {\n    return false;\n  }\n#if XE_PLATFORM_WIN32\n  return surface_win32_monitor_ != nullptr;\n#else\n  return true;\n#endif  // XE_PLATFORM\n}\n\nPresenter::PaintResult Presenter::PaintAndPresent(bool execute_ui_drawers) {\n  assert_false(execute_ui_drawers && !is_in_ui_thread_paint_);\n  assert_true(surface_paint_connection_state_ ==\n              SurfacePaintConnectionState::kConnectedPaintable);\n  PaintResult result = PaintAndPresentImpl(execute_ui_drawers);\n  switch (result) {\n    case PaintResult::kPresented:\n      surface_paint_connection_was_optimal_at_successful_paint_ = true;\n      break;\n    case PaintResult::kPresentedSuboptimal:\n      // Make outdated if previously optimal, now suboptimal, but don't cause\n      // the connection to become outdated if it has been suboptimal from the\n      // very beginning.\n      if (surface_paint_connection_was_optimal_at_successful_paint_) {\n        surface_paint_connection_state_ =\n            SurfacePaintConnectionState::kConnectedOutdated;\n      }\n      break;\n    case PaintResult::kNotPresentedConnectionOutdated:\n      surface_paint_connection_state_ =\n          SurfacePaintConnectionState::kConnectedOutdated;\n      break;\n    default:\n      // Another issue not directly related to the surface connection.\n      break;\n  }\n  return result;\n}\n\nvoid Presenter::HandleUIDrawersChangeFromUIThread(bool drawers_were_empty) {\n  if (is_in_ui_thread_paint_) {\n    // Defer the refresh so no dangerous lifecycle-related changes happen during\n    // drawing.\n    if (!ui_drawers_.empty()) {\n      request_ui_paint_after_current_ui_thread_paint_ = true;\n    }\n    return;\n  }\n\n  if (paint_mode_ == PaintMode::kNone) {\n    // Not connected, no point in refreshing (checking a more conservative\n    // paint_mode_ because the actual connection state may currently be owned by\n    // the guest output thread instead) or in toggling the ownership (the rest\n    // of the function can assume it's not kNone).\n    return;\n  }\n\n  if (ui_drawers_.empty() != drawers_were_empty) {\n    // Require the UI thread to paint if it needs the UI, or let the guest\n    // output thread paint immediately if not.\n    SetPaintModeFromUIThread(GetDesiredPaintModeFromUIThread(true));\n    // Make sure the ticks for limiting the UI frame rate are sent.\n    UpdateUITicksNeededFromUIThread();\n  }\n\n  // Request painting so the changes to the UI drawer list are reflected as\n  // quickly as possible.\n  // RequestUIPaintFromUIThread is not enough, because a paint request is also\n  // needed if disabling the UI, to force paint a frame without the UI as soon\n  // as possible - it can't be dropped if ui_drawers_ is empty.\n  // The coarse painting availability (and thus the availability of `window_`,\n  // which is required for the paint mode to be anything else than kNone) has\n  // already been checked above.\n  ForceUIThreadPaintTick();\n  window_->RequestPaint();\n}\n\nvoid Presenter::UpdateUITicksNeededFromUIThread() {\n#if XE_PLATFORM_WIN32\n  bool new_needed = AreUITicksNeededFromUIThread();\n  if (dxgi_ui_ticks_needed_ == new_needed) {\n    return;\n  }\n  bool signal_dxgi_ui_tick_control;\n  {\n    std::unique_lock<std::mutex> dxgi_ui_tick_lock(dxgi_ui_tick_mutex_);\n    dxgi_ui_ticks_needed_ = new_needed;\n    signal_dxgi_ui_tick_control = AreDXGIUITicksWaitable(dxgi_ui_tick_lock);\n  }\n  if (signal_dxgi_ui_tick_control) {\n    dxgi_ui_tick_control_condition_.notify_all();\n  }\n#endif\n}\n\nvoid Presenter::WaitForUITickFromUIThread() {\n#if XE_PLATFORM_WIN32\n  if (!AreUITicksNeededFromUIThread()) {\n    return;\n  }\n  std::unique_lock<std::mutex> dxgi_ui_tick_lock(dxgi_ui_tick_mutex_);\n  uint64_t last_vblank_before_wait = dxgi_ui_tick_last_vblank_;\n  while (true) {\n    // Guest output present requests should interrupt the wait as quickly as\n    // possible as they should be fulfilled as early as possible.\n    if (dxgi_ui_tick_force_requested_) {\n      dxgi_ui_tick_force_requested_ = false;\n      return;\n    }\n    if (!AreDXGIUITicksWaitable(dxgi_ui_tick_lock)) {\n      return;\n    }\n    if (dxgi_ui_tick_last_vblank_ > dxgi_ui_tick_last_draw_) {\n      // If there have been multiple vblanks during the wait for some reason,\n      // next time draw the UI immediately.\n      dxgi_ui_tick_last_draw_ = std::min(last_vblank_before_wait + uint64_t(1),\n                                         dxgi_ui_tick_last_vblank_);\n      return;\n    }\n    dxgi_ui_tick_signal_condition_.wait(dxgi_ui_tick_lock);\n  }\n#endif  // XE_PLATFORM\n}\n\nvoid Presenter::ForceUIThreadPaintTick() {\n#if XE_PLATFORM_WIN32\n  std::scoped_lock<std::mutex> dxgi_ui_tick_lock(dxgi_ui_tick_mutex_);\n  dxgi_ui_tick_force_requested_ = true;\n#endif  // XE_PLATFORM\n}\n\n#if XE_PLATFORM_WIN32\nMicrosoft::WRL::ComPtr<IDXGIOutput> Presenter::GetDXGIOutputForMonitor(\n    IDXGIFactory1* factory, HMONITOR monitor) {\n  Microsoft::WRL::ComPtr<IDXGIAdapter> adapter;\n  for (UINT adapter_index = 0; SUCCEEDED(factory->EnumAdapters(\n           adapter_index, adapter.ReleaseAndGetAddressOf()));\n       ++adapter_index) {\n    Microsoft::WRL::ComPtr<IDXGIOutput> output;\n    for (UINT output_index = 0;\n         SUCCEEDED(adapter->EnumOutputs(output_index, &output));\n         ++output_index) {\n      DXGI_OUTPUT_DESC output_desc;\n      if (SUCCEEDED(output->GetDesc(&output_desc)) &&\n          output_desc.Monitor == monitor) {\n        return std::move(output);\n      }\n    }\n  }\n  return nullptr;\n}\n\nvoid Presenter::DXGIUITickThread() {\n  std::unique_lock<std::mutex> dxgi_ui_tick_lock(dxgi_ui_tick_mutex_);\n  while (true) {\n    if (dxgi_ui_tick_thread_shutdown_) {\n      return;\n    }\n    if (!AreDXGIUITicksWaitable(dxgi_ui_tick_lock)) {\n      dxgi_ui_tick_control_condition_.wait(dxgi_ui_tick_lock);\n      continue;\n    }\n    // Wait for vertical blank, with the mutex unlocked (holding a new reference\n    // to the current output while it's happening) so subscribers can still do\n    // early-out checks.\n    bool wait_succeeded;\n    {\n      Microsoft::WRL::ComPtr<IDXGIOutput> dxgi_output = dxgi_ui_tick_output_;\n      dxgi_ui_tick_lock.unlock();\n      wait_succeeded = SUCCEEDED(dxgi_ui_tick_output_->WaitForVBlank());\n    }\n    dxgi_ui_tick_lock.lock();\n    if (wait_succeeded) {\n      ++dxgi_ui_tick_last_vblank_;\n    } else {\n      // Lost the ability to wait for a vertical blank on this output, notify\n      // the waiting threads, and wait for a new one.\n      dxgi_ui_tick_output_.Reset();\n    }\n    dxgi_ui_tick_signal_condition_.notify_all();\n  }\n}\n#endif  // XE_PLATFORM\n\n}  // namespace ui\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/ui/presenter.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_PRESENTER_H_\n#define XENIA_UI_PRESENTER_H_\n\n#include <algorithm>\n#include <array>\n#include <atomic>\n#include <climits>\n#include <cmath>\n#include <condition_variable>\n#include <cstddef>\n#include <cstdint>\n#include <functional>\n#include <map>\n#include <memory>\n#include <mutex>\n#include <thread>\n#include <utility>\n#include <vector>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/byte_order.h\"\n#include \"xenia/base/cvar.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/platform.h\"\n#include \"xenia/ui/surface.h\"\n#include \"xenia/ui/ui_drawer.h\"\n\n#if XE_PLATFORM_WIN32\n// Must be included before DXGI for things like NOMINMAX, and also needed for\n// Windows handle types.\n#include \"xenia/base/platform_win.h\"\n\n#include \"xenia/ui/dxgi_include_win.h\"\n\n#include <wrl/client.h>\n#endif  // XE_PLATFORM\n\n// For implementation use.\nDECLARE_bool(present_render_pass_clear);\n\nnamespace xe {\nnamespace ui {\n\nclass Presenter;\nclass Window;\nclass Win32Window;\n\nclass UIDrawContext {\n public:\n  UIDrawContext(const UIDrawContext& context) = delete;\n  UIDrawContext& operator=(const UIDrawContext& context) = delete;\n  virtual ~UIDrawContext() = default;\n\n  Presenter& presenter() const { return presenter_; }\n\n  // It's assumed that the render target size will be either equal to the size\n  // of the surface, or the render target will be stretched to cover the entire\n  // surface (not in the corner of the surface).\n  uint32_t render_target_width() const { return render_target_width_; }\n  uint32_t render_target_height() const { return render_target_height_; }\n\n protected:\n  explicit UIDrawContext(Presenter& presenter, uint32_t render_target_width,\n                         uint32_t render_target_height)\n      : presenter_(presenter),\n        render_target_width_(render_target_width),\n        render_target_height_(render_target_height) {}\n\n private:\n  Presenter& presenter_;\n  uint32_t render_target_width_;\n  uint32_t render_target_height_;\n};\n\nstruct RawImage {\n  uint32_t width = 0;\n  uint32_t height = 0;\n  size_t stride = 0;\n  // R8 G8 B8 X8. The last row is not required to be padded to the stride.\n  std::vector<uint8_t> data;\n};\n\n// The presenter displays up to two layers of content on a host surface:\n// - Guest output image, focusing on lowering latency and maintaining stable\n//   frame pacing, with various scaling and sharpening methods and letterboxing;\n// - Xenia's internal UI (such as the profiler and Dear ImGui).\n//\n// The guest output image may be refreshed from any thread generating it\n// (usually the GPU emulation thread), as long as there are no multiple threads\n// doing that simultaneously (since that would functionally be a race condition\n// even if refreshing is performed in a critical section).\n//\n// The UI overlays are managed entirely by the UI thread.\n//\n// Painting on the host surface may occur in two places:\n// - If there are no UI overlays, painting of the guest output may be performed\n//   immediately from the thread refreshing it, to bypass the OS scheduling and\n//   event handling. This is especially important on platforms where the native\n//   surface paint event has a frame rate limit (such as the display refresh\n//   rate), and the limit may differ greatly from the guest frame rate (such as\n//   presenting a 30 or 60 FPS guest to a 144 Hz host surface).\n// - If the UI overlays (owned by the UI thread) are present, painting of both\n//   the guest output (is available) and the UI is done exclusively from the\n//   platform paint event handler. The guest output without UI overlays may also\n//   be painted from the platform paint callback in certain cases, such as when\n//   an additional paint beyond the guest's frame rate may be needed (like when\n//   resizing the window), or when painting from the thread refreshing the guest\n//   output is undesirable (for instance, if it will result in waiting for host\n//   vertical sync in that thread too early if host vertical sync can't be\n//   disabled on the platform, blocking the next frame of GPU emulation).\n//\n// The composition of the guest and the UI is done by Xenia manually, as opposed\n// to using platform functionality such as DirectComposition, in order to have\n// more predictability of GPU queue scheduling, but primarily to be able to take\n// advantage of independent host presentation where it's available, so variable\n// refresh rate may be used where possible, and latency may be significantly\n// reduced. Also, at least on some configurations (checked on Windows 11 21H2 on\n// Nvidia GeForce GTX 1070 with driver version 472.12), when in borderless\n// fullscreen, any composition causes the DXGI Present to wait for vertical sync\n// on the GPU even if the sync interval 0 is specified.\n//\n// An intermediate image with the size requested by the guest is used for guest\n// output in all cases. Even though it adds some GPU overhead, especially in the\n// 1:1 size case, using it solves multiple issues:\n// - Presentation may be done more often than by the guest.\n// - There is clear separation between pre-scaling and mid- / post-scaling\n//   operations. The gamma ramp, for instance, may be applied before scaling,\n//   with one lookup per pixel rather than four with fetch4.\n// - A simpler compute shader may be used instead of setting up the whole\n//   graphics pipeline for copying in the GPU command processor in all cases,\n//   while Direct3D 12 does not allow UAVs for swap chain buffers.\n//\n// The presenter limits the frame rate of the UI overlay (when possible) to a\n// value that's ideally the refresh rate of the monitor containing the window if\n// the platform's paint event doesn't have an internal limiter. However, where\n// possible, the arrival of a new guest output image will interrupt the UI tick\n// wait.\n//\n// Because the UI overlays preclude the possibility of presenting directly from\n// the thread refreshing the guest output, and on some platforms, result in the\n// frame rate limiting of paint events manifesting itself, there must be no\n// persistent UI overlays that haven't been explicitly requested by the user.\n// However, for temporary (primarily non-modal) UI elements such as various\n// timed notifications, using the Presenter should be preferred to implementing\n// them via overlaying native windows on top of the presentation surface on\n// platforms where the concept of independent presentation exists, as multiple\n// windows will result in native composition disabling it.\n//\n// The painting connection between the Presenter and the Surface can be managed\n// only by the UI thread. However, the thread refreshing the guest output may\n// still mark the current connection as outdated and ask the UI thread (by\n// requesting painting) to try to recover - but the guest output refresh thread\n// must not try to reconnect by itself, as methods of the Surface are available\n// only to the UI thread.\nclass Presenter {\n public:\n  // May be actually called on the UI thread even if statically_from_ui_thread\n  // is false, such as when the guest output is refreshed by the UI thread.\n  using HostGpuLossCallback =\n      std::function<void(bool is_responsible, bool statically_from_ui_thread)>;\n  static void FatalErrorHostGpuLossCallback(bool is_responsible,\n                                            bool statically_from_ui_thread);\n\n  class GuestOutputRefreshContext {\n   public:\n    GuestOutputRefreshContext(const GuestOutputRefreshContext& context) =\n        delete;\n    GuestOutputRefreshContext& operator=(\n        const GuestOutputRefreshContext& context) = delete;\n    virtual ~GuestOutputRefreshContext() = default;\n\n    // Sets whether the source actually has no more than 8 bits of precision\n    // (though the image provided by the refresher may still have a higher\n    // storage precision). If never called, assuming it's false.\n    void SetIs8bpc(bool is_8bpc) { is_8bpc_out_ref_ = is_8bpc; }\n\n   protected:\n    GuestOutputRefreshContext(bool& is_8bpc_out_ref)\n        : is_8bpc_out_ref_(is_8bpc_out_ref) {\n      is_8bpc_out_ref = false;\n    }\n\n   private:\n    bool& is_8bpc_out_ref_;\n  };\n\n  class GuestOutputPaintConfig {\n   public:\n    enum class Effect {\n      kBilinear,\n      kCas,\n      // AMD FidelityFX Super Resolution upsampling, Contrast Adaptive\n      // Sharpening otherwise.\n      kFsr,\n    };\n\n    // This value is used as a lerp factor.\n    static constexpr float kCasAdditionalSharpnessMin = 0.0f;\n    static constexpr float kCasAdditionalSharpnessMax = 1.0f;\n    static constexpr float kCasAdditionalSharpnessDefault = 0.0f;\n    static_assert(kCasAdditionalSharpnessDefault >=\n                      kCasAdditionalSharpnessMin &&\n                  kCasAdditionalSharpnessDefault <= kCasAdditionalSharpnessMax);\n\n    // EASU (as well as CAS) is designed for scaling by factors of up to 2x2.\n    // Some sensible limit for unusual cases, when the game for some reason\n    // presents a very small back buffer.\n    // This is enough for 480p > 960p > 1920p > 3840p > 7680p (bigger than 8K,\n    // or 4320p).\n    static constexpr uint32_t kFsrMaxUpscalingPassesMax = 4;\n\n    static constexpr float kFsrSharpnessReductionMin = 0.0f;\n    // \"Values above 2.0 won't make a visible difference.\"\n    // https://raw.githubusercontent.com/GPUOpen-Effects/FidelityFX-FSR/master/docs/FidelityFX-FSR-Overview-Integration.pdf\n    static constexpr float kFsrSharpnessReductionMax = 2.0f;\n    static constexpr float kFsrSharpnessReductionDefault = 0.2f;\n    static_assert(kFsrSharpnessReductionDefault >= kFsrSharpnessReductionMin &&\n                  kFsrSharpnessReductionDefault <= kFsrSharpnessReductionMax);\n\n    // In the sharpness setters, min / max with a constant as the first argument\n    // also drops NaNs.\n\n    bool GetAllowOverscanCutoff() const { return allow_overscan_cutoff_; }\n    void SetAllowOverscanCutoff(bool new_allow_overscan_cutoff) {\n      allow_overscan_cutoff_ = new_allow_overscan_cutoff;\n    }\n\n    Effect GetEffect() const { return effect_; }\n    void SetEffect(Effect new_effect) { effect_ = new_effect; }\n\n    float GetCasAdditionalSharpness() const {\n      return cas_additional_sharpness_;\n    }\n    void SetCasAdditionalSharpness(float new_cas_additional_sharpness) {\n      cas_additional_sharpness_ = std::min(\n          kCasAdditionalSharpnessMax,\n          std::max(kCasAdditionalSharpnessMin, new_cas_additional_sharpness));\n    }\n\n    uint32_t GetFsrMaxUpsamplingPasses() const {\n      return fsr_max_upsampling_passes_;\n    }\n    void SetFsrMaxUpsamplingPasses(uint32_t new_fsr_max_upsampling_passes) {\n      fsr_max_upsampling_passes_ =\n          std::min(kFsrMaxUpscalingPassesMax,\n                   std::max(uint32_t(1), new_fsr_max_upsampling_passes));\n    }\n\n    // In stops.\n    float GetFsrSharpnessReduction() const { return fsr_sharpness_reduction_; }\n    void SetFsrSharpnessReduction(float new_fsr_sharpness_reduction) {\n      fsr_sharpness_reduction_ = std::min(\n          kFsrSharpnessReductionMax,\n          std::max(kFsrSharpnessReductionMin, new_fsr_sharpness_reduction));\n    }\n\n    // Very tiny effect, but highly noticeable, for instance, on the sky in the\n    // 4D5307E6 main menu (prominently in Custom Games, especially with FSR -\n    // banding around the clouds can be clearly seen without dithering with 8bpc\n    // final host output).\n    bool GetDither() const { return dither_; }\n    void SetDither(bool new_dither) { dither_ = new_dither; }\n\n   private:\n    // Tools, rather than the emulator itself, must not allow overscan cutoff\n    // and must use the kBilinear effect as the image must be as close to the\n    // original front buffer as possible.\n    bool allow_overscan_cutoff_ = false;\n    Effect effect_ = Effect::kBilinear;\n    float cas_additional_sharpness_ = kCasAdditionalSharpnessDefault;\n    uint32_t fsr_max_upsampling_passes_ = kFsrMaxUpscalingPassesMax;\n    float fsr_sharpness_reduction_ = kFsrSharpnessReductionDefault;\n    bool dither_ = false;\n  };\n\n  Presenter(const Presenter& presenter) = delete;\n  Presenter& operator=(const Presenter& presenter) = delete;\n  virtual ~Presenter();\n\n  virtual Surface::TypeFlags GetSupportedSurfaceTypes() const = 0;\n\n  // For calling from the Window for the Presenter attached to it.\n  // May be called from the destructor of the presenter through the window.\n  void SetWindowSurfaceFromUIThread(Window* new_window, Surface* new_surface);\n  void OnSurfaceMonitorUpdateFromUIThread(\n      bool old_monitor_potentially_disconnected);\n  void OnSurfaceResizeFromUIThread();\n\n  // For calling from the platform paint event handler. Refreshes the surface\n  // connection if needed, and also paints if possible and if needed (if there\n  // are no UI overlays, and the guest output is presented directly from the\n  // thread refreshing it, the paint may be skipped unless there has been an\n  // explicit request previously or force_paint is true). If painting happens,\n  // both the guest output and the UI overlays (if any are active) are drawn.\n  // The background / letterbox of the painted context will be black - windows\n  // should preferably have a black background before a Presenter is attached to\n  // them too.\n  void PaintFromUIThread(bool force_paint = false);\n\n  // Pass 0 as width or height to disable guest output until the next refresh\n  // with an actual size. The display aspect ratio may be specified like 16:9 or\n  // like 1280:720, both are accepted, for simplicity, the guest display size\n  // may just be passed. The callback will receive a backend-specific context,\n  // and will not be called in case of an error such as the wrong size, or if\n  // guest output is disabled. Returns whether the callback was called and it\n  // returned true. The callback must submit all updating work to the host GPU\n  // before successfully returning, and also signal all the GPU synchronization\n  // primitives required by the GuestOutputRefreshContext implementation.\n  bool RefreshGuestOutput(\n      uint32_t frontbuffer_width, uint32_t frontbuffer_height,\n      uint32_t display_aspect_ratio_x, uint32_t display_aspect_ratio_y,\n      std::function<bool(GuestOutputRefreshContext& context)> refresher);\n  // The implementation must be callable from any thread, including from\n  // multiple at the same time, and it should acquire the latest guest output\n  // image via ConsumeGuestOutput.\n  virtual bool CaptureGuestOutput(RawImage& image_out) = 0;\n  const GuestOutputPaintConfig& GetGuestOutputPaintConfigFromUIThread() const {\n    return guest_output_paint_config_;\n  }\n  // For simplicity, may be called repeatedly even if no changes have been made.\n  void SetGuestOutputPaintConfigFromUIThread(\n      const GuestOutputPaintConfig& new_config);\n\n  void AddUIDrawerFromUIThread(UIDrawer* drawer, size_t z_order);\n  void RemoveUIDrawerFromUIThread(UIDrawer* drawer);\n\n  // Requests (re)painting with the UI if there's UI to draw.\n  void RequestUIPaintFromUIThread();\n\n protected:\n  enum class PaintResult {\n    kPresented,\n    kPresentedSuboptimal,\n    // Refused for internal reasons or a host API side failure, but still may\n    // try to present without resetting the graphics provider in the future.\n    kNotPresented,\n    kNotPresentedConnectionOutdated,\n    kGpuLostExternally,\n    kGpuLostResponsible,\n  };\n\n  enum class SurfacePaintConnectResult {\n    // Redrawing not necessary, nothing changed. Must not be returned for a new\n    // connection (when was previously disconnected from the surface).\n    kSuccessUnchanged,\n    kSuccess,\n    kFailure,\n    kFailureSurfaceUnusable,\n  };\n\n  static constexpr uint32_t kGuestOutputMailboxSize = 3;\n\n  struct GuestOutputProperties {\n    // At least any value being 0 here means the guest output is disabled for\n    // this frame.\n    uint32_t frontbuffer_width;\n    uint32_t frontbuffer_height;\n    // Guest display aspect ratio numerator and denominator (both 16:9 and\n    // 1280:720 kinds of values are accepted).\n    uint32_t display_aspect_ratio_x;\n    uint32_t display_aspect_ratio_y;\n    bool is_8bpc;\n\n    GuestOutputProperties() { SetToInactive(); }\n\n    bool IsActive() const {\n      return frontbuffer_width && frontbuffer_height &&\n             display_aspect_ratio_x && display_aspect_ratio_y;\n    }\n\n    void SetToInactive() {\n      frontbuffer_width = 0;\n      frontbuffer_height = 0;\n      display_aspect_ratio_x = 0;\n      display_aspect_ratio_y = 0;\n      is_8bpc = false;\n    }\n  };\n\n  enum class GuestOutputPaintEffect {\n    kBilinear,\n    kBilinearDither,\n    kCasSharpen,\n    kCasSharpenDither,\n    kCasResample,\n    kCasResampleDither,\n    kFsrEasu,\n    kFsrRcas,\n    kFsrRcasDither,\n\n    kCount,\n  };\n\n  static constexpr bool CanGuestOutputPaintEffectBeIntermediate(\n      GuestOutputPaintEffect effect) {\n    switch (effect) {\n      case GuestOutputPaintEffect::kBilinear:\n      // Dithering is never performed in intermediate passes because it may be\n      // interpreted as features by the subsequent passes.\n      case GuestOutputPaintEffect::kBilinearDither:\n      case GuestOutputPaintEffect::kCasSharpenDither:\n      case GuestOutputPaintEffect::kCasResampleDither:\n      case GuestOutputPaintEffect::kFsrRcasDither:\n        return false;\n      default:\n        // The result of any other effect can be stretched with bilinear\n        // filtering to the final resolution.\n        return true;\n    };\n  }\n\n  static constexpr bool CanGuestOutputPaintEffectBeFinal(\n      GuestOutputPaintEffect effect) {\n    switch (effect) {\n      case GuestOutputPaintEffect::kFsrEasu:\n        return false;\n      default:\n        return true;\n    };\n  }\n\n  // The longest path is kFsrMaxUpscalingPassesMax + optionally RCAS +\n  // optionally bilinear, when upscaling by more than\n  // 2^kFsrMaxUpscalingPassesMax along any direction.\n  // Non-FSR paths are either only bilinear, only CAS, or (when upscaling by\n  // more than 2 along any direction) CAS followed by bilinear.\n  static constexpr size_t kMaxGuestOutputPaintEffects =\n      GuestOutputPaintConfig::kFsrMaxUpscalingPassesMax + 2;\n\n  struct GuestOutputPaintFlow {\n    // Letterbox on up to 4 sides.\n    static constexpr size_t kMaxClearRectangles = 4;\n\n    struct ClearRectangle {\n      uint32_t x;\n      uint32_t y;\n      uint32_t width;\n      uint32_t height;\n    };\n\n    GuestOutputProperties properties;\n\n    // If 0, don't display the guest output.\n    size_t effect_count;\n    std::array<GuestOutputPaintEffect, kMaxGuestOutputPaintEffects> effects;\n    std::array<std::pair<uint32_t, uint32_t>, kMaxGuestOutputPaintEffects>\n        effect_output_sizes;\n\n    // Offset of the rectangle for final drawing to the host window with\n    // letterboxing.\n    int32_t output_x;\n    int32_t output_y;\n\n    // If there is guest output (effect_count is not 0), contains the letterbox\n    // rectangles around the guest output.\n    size_t letterbox_clear_rectangle_count;\n    std::array<ClearRectangle, kMaxClearRectangles> letterbox_clear_rectangles;\n\n    void GetEffectInputSize(size_t effect_index, uint32_t& width_out,\n                            uint32_t& height_out) const {\n      assert_true(effect_index < effect_count);\n      if (!effect_index) {\n        width_out = properties.frontbuffer_width;\n        height_out = properties.frontbuffer_height;\n        return;\n      }\n      const std::pair<uint32_t, uint32_t>& intermediate_size =\n          effect_output_sizes[effect_index - 1];\n      width_out = intermediate_size.first;\n      height_out = intermediate_size.second;\n    }\n\n    void GetEffectOutputOffset(size_t effect_index, int32_t& x_out,\n                               int32_t& y_out) const {\n      assert_true(effect_index < effect_count);\n      if (effect_index + 1 < effect_count) {\n        x_out = 0;\n        y_out = 0;\n        return;\n      }\n      x_out = output_x;\n      y_out = output_y;\n    }\n  };\n\n  struct BilinearConstants {\n    int32_t output_offset[2];\n    float output_size_inv[2];\n\n    void Initialize(const GuestOutputPaintFlow& flow, size_t effect_index) {\n      flow.GetEffectOutputOffset(effect_index, output_offset[0],\n                                 output_offset[1]);\n      const std::pair<uint32_t, uint32_t>& output_size =\n          flow.effect_output_sizes[effect_index];\n      output_size_inv[0] = 1.0f / float(output_size.first);\n      output_size_inv[1] = 1.0f / float(output_size.second);\n    }\n  };\n\n  static constexpr float CalculateCasPostSetupSharpness(float sharpness) {\n    // CasSetup const1.x.\n    return -1.0f / (8.0f - 3.0f * sharpness);\n  }\n\n  struct CasSharpenConstants {\n    int32_t output_offset[2];\n    float sharpness_post_setup;\n\n    void Initialize(const GuestOutputPaintFlow& flow, size_t effect_index,\n                    const GuestOutputPaintConfig& config) {\n      flow.GetEffectOutputOffset(effect_index, output_offset[0],\n                                 output_offset[1]);\n      sharpness_post_setup =\n          CalculateCasPostSetupSharpness(config.GetCasAdditionalSharpness());\n    }\n  };\n\n  struct CasResampleConstants {\n    int32_t output_offset[2];\n    // Input size / output size.\n    float input_output_size_ratio[2];\n    float sharpness_post_setup;\n\n    void Initialize(const GuestOutputPaintFlow& flow, size_t effect_index,\n                    const GuestOutputPaintConfig& config) {\n      flow.GetEffectOutputOffset(effect_index, output_offset[0],\n                                 output_offset[1]);\n      uint32_t input_width, input_height;\n      flow.GetEffectInputSize(effect_index, input_width, input_height);\n      const std::pair<uint32_t, uint32_t>& output_size =\n          flow.effect_output_sizes[effect_index];\n      input_output_size_ratio[0] =\n          float(input_width) / float(output_size.first);\n      input_output_size_ratio[1] =\n          float(input_height) / float(output_size.second);\n      sharpness_post_setup =\n          CalculateCasPostSetupSharpness(config.GetCasAdditionalSharpness());\n    }\n  };\n\n  struct FsrEasuConstants {\n    // No output offset because the EASU pass is always done to an intermediate\n    // framebuffer.\n    float input_output_size_ratio[2];\n    float input_size_inv[2];\n\n    void Initialize(const GuestOutputPaintFlow& flow, size_t effect_index) {\n      uint32_t input_width, input_height;\n      flow.GetEffectInputSize(effect_index, input_width, input_height);\n      const std::pair<uint32_t, uint32_t>& output_size =\n          flow.effect_output_sizes[effect_index];\n      input_output_size_ratio[0] =\n          float(input_width) / float(output_size.first);\n      input_output_size_ratio[1] =\n          float(input_height) / float(output_size.second);\n      input_size_inv[0] = 1.0f / float(input_width);\n      input_size_inv[1] = 1.0f / float(input_height);\n    }\n  };\n\n  struct FsrRcasConstants {\n    int32_t output_offset[2];\n    float sharpness_post_setup;\n\n    static float CalculatePostSetupSharpness(float sharpness_reduction_stops) {\n      // FsrRcasCon const0.x.\n      return std::exp2f(-sharpness_reduction_stops);\n    }\n\n    void Initialize(const GuestOutputPaintFlow& flow, size_t effect_index,\n                    const GuestOutputPaintConfig& config) {\n      flow.GetEffectOutputOffset(effect_index, output_offset[0],\n                                 output_offset[1]);\n      sharpness_post_setup =\n          CalculatePostSetupSharpness(config.GetFsrSharpnessReduction());\n    }\n  };\n\n  explicit Presenter(HostGpuLossCallback host_gpu_loss_callback)\n      : host_gpu_loss_callback_(host_gpu_loss_callback) {}\n\n  // Must be called by the implementation's initialization, before the presenter\n  // is used for anything.\n  bool InitializeCommonSurfaceIndependent();\n\n  // ConnectOrReconnect and Disconnect are callable only by the UI thread and\n  // only when it has access to painting (PaintMode is not\n  // kGuestOutputThreadImmediately).\n  // Called only for a non-zero-area surface potentially supporting painting via\n  // the presenter. In case of a failure, internally no resources referencing\n  // the surface must be held by the implementation anymore - the implementation\n  // must be left in the same state as after\n  // DisconnectPaintingFromSurfaceFromUIThreadImpl. If the call is successful,\n  // the implementation must write to is_vsync_implicit_out whether the\n  // connection will now have vertical sync forced by the host window system,\n  // which may cause undesirable waits on the CPU when beginning or ending\n  // frames.\n  virtual SurfacePaintConnectResult\n  ConnectOrReconnectPaintingToSurfaceFromUIThread(\n      Surface& new_surface, uint32_t new_surface_width,\n      uint32_t new_surface_height, bool was_paintable,\n      bool& is_vsync_implicit_out) = 0;\n  // Releases resources referencing the surface in the implementation if they\n  // are held by it. Call through DisconnectPaintingFromSurfaceFromUIThread to\n  // ensure the implementation is only called while the connection is active.\n  virtual void DisconnectPaintingFromSurfaceFromUIThreadImpl() = 0;\n\n  // The returned lock interlocks multiple consumers (but not the producer and\n  // the consumer) and must be held while accessing implementation-specific\n  // objects that depend on the image or its index in the mailbox (unless there\n  // are other locking mechanisms involved for the resources, such as reference\n  // counting for the guest output images, which doesn't have to be atomic\n  // though for the reason described later in this paragraph, or assumptions\n  // like of main target painting being possible only in at most one thread at\n  // once). While this lock is held, the currently acquired image index can't be\n  // changed (by other consumers advancing the acquired image index to the new\n  // ready image index), so the image with the index given by this function\n  // can't be released and be made writable or given to a different consumer\n  // (thus it's owned exclusively by the consumer who has called this function).\n  // The properties are returned by copy rather than returning a pointer to them\n  // or asking the consumer to pull them for the current mailbox index, so there\n  // are less things to take into consideration while leaving the guest output\n  // consumer critical section earlier (as if a pointer was returned, the data\n  // behind it could be overwritten at any time after leaving the consumer\n  // critical section) if the implementation has its own synchronization\n  // mechanisms that allow for doing so as described earlier. Returns UINT32_MAX\n  // as the mailbox index if the image is inactive (if it's active, it has\n  // proper properties though).\n  [[nodiscard]] std::unique_lock<std::mutex> ConsumeGuestOutput(\n      uint32_t& mailbox_index_or_max_if_inactive_out,\n      GuestOutputProperties* properties_out,\n      GuestOutputPaintConfig* paint_config_out);\n  // The properties are passed explicitly, not taken from the current acquired\n  // image, so it can be called for a copy of the acquired image's properties\n  // outside the consumer lock if the implementation has its own synchronization\n  // (like reference counting for the guest output images) that makes it\n  // possible to leave the consumer critical section earlier. Also, the guest\n  // output paint configuration is passed explicitly too so calling this\n  // function multiple times is safer.\n  GuestOutputPaintFlow GetGuestOutputPaintFlow(\n      const GuestOutputProperties& properties, uint32_t host_rt_width,\n      uint32_t host_rt_height, uint32_t max_rt_width, uint32_t max_rt_height,\n      const GuestOutputPaintConfig& config) const;\n  // is_8bpc_out_ref is where to write whether the source actually has no more\n  // than 8 bits of precision per channel (though the image provided by the\n  // refresher may still have a higher storage precision) - if not written, it\n  // will be assumed to be false.\n  virtual bool RefreshGuestOutputImpl(\n      uint32_t mailbox_index, uint32_t frontbuffer_width,\n      uint32_t frontbuffer_height,\n      std::function<bool(GuestOutputRefreshContext& context)> refresher,\n      bool& is_8bpc_out_ref) = 0;\n\n  // For guest output capturing (for debugging use thus - shouldn't be adding\n  // any noise like dithering that's not present in the original image),\n  // converting a 10bpc RGB pixel to 8bpc that can be stored in common image\n  // formats.\n  static uint32_t Packed10bpcRGBTo8bpcBytes(uint32_t rgb10) {\n    // Conversion almost according to the Direct3D 10+ rules (unorm > float >\n    // unorm), but with one multiplication rather than separate division and\n    // multiplication - the results are the same for unorm10 to unorm8.\n    if constexpr (std::endian::native == std::endian::big) {\n      return (uint32_t(float(rgb10 & 0x3FF) * (255.0f / 1023.0f) + 0.5f)\n              << 24) |\n             (uint32_t(float((rgb10 >> 10) & 0x3FF) * (255.0f / 1023.0f) + 0.5f)\n              << 16) |\n             (uint32_t(float((rgb10 >> 20) & 0x3FF) * (255.0f / 1023.0f) + 0.5f)\n              << 8) |\n             uint32_t(0xFF);\n    }\n    return uint32_t(float(rgb10 & 0x3FF) * (255.0f / 1023.0f) + 0.5f) |\n           (uint32_t(float((rgb10 >> 10) & 0x3FF) * (255.0f / 1023.0f) + 0.5f)\n            << 8) |\n           (uint32_t(float((rgb10 >> 20) & 0x3FF) * (255.0f / 1023.0f) + 0.5f)\n            << 16) |\n           (uint32_t(0xFF) << 24);\n  }\n\n  // Paints and presents the guest output if available (or just solid black\n  // color), and if requested, the UI on top of it.\n  //\n  // May be called from the non-UI thread, but only to paint the guest output\n  // (no UI drawing, with execute_ui_drawers disabled).\n  //\n  // Call via PaintAndPresent.\n  virtual PaintResult PaintAndPresentImpl(bool execute_ui_drawers) = 0;\n\n  // For calling from the painting implementations if requested.\n  void ExecuteUIDrawersFromUIThread(UIDrawContext& ui_draw_context);\n\n private:\n  enum class PaintMode {\n    // Don't paint at all.\n    // Painting lifecycle is accessible only by the UI thread.\n    // window_->RequestPaint() must not be called in this mode at all regardless\n    // of whether the Window object exists because the Window object in this\n    // case may correspond to a window without a paintable Surface (in a closed\n    // state, or in the middle of a surface change), and non-UI threads (such as\n    // the guest output thread) may result in a race condition internally inside\n    // Window::RequestPaint during the access to the Window's state, such as the\n    // availability of the Surface that can handle the paint (therefore, if\n    // there's no Surface, this is the only valid mode).\n    kNone,\n    // Guest output refreshing notifies the `window_`, which must be valid and\n    // safe to call RequestPaint for, that painting should be done in the UI\n    // thread (including the UI if needed). Painting is possible, and painting\n    // lifecycle is accessible, only by the UI thread.\n    kUIThreadOnRequest,\n    // Paint immediately in the guest output thread for lower latency. The\n    // `window_`, however, may be notified that the surface painting connection\n    // has become outdated (via RequestPaint, as in this case the UI thread will\n    // need to repaint as sooner as possible after reconnecting anyway), and\n    // change the surface connection state accordingly (only to\n    // kConnectedOutdated).\n    // Painting is possible only by the guest output thread, lifecycle\n    // management cannot be done from the UI thread until it takes over.\n    kGuestOutputThreadImmediately,\n  };\n\n  enum class SurfacePaintConnectionState {\n    // No surface at all, or couldn't connect with the current state of the\n    // surface (such as because the surface was zero-sized because the window\n    // was minimized, for example). Or, the connection has become outdated, and\n    // the attempt to reconnect at kRetryConnectingSoon has failed. Try to\n    // reconnect if anything changes in the state of the surface, such as its\n    // size.\n    kUnconnectedRetryAtStateChange,\n    // Can't connect to the current existing surface (the surface has been lost\n    // or it's completely incompatible). No point in retrying connecting until\n    // the surface is replaced.\n    kUnconnectedSurfaceReportedUnusable,\n    // Everything is fine, can paint. The connection might have become\n    // suboptimal though, and haven't tried refreshing yet, but still usable for\n    // painting nonetheless.\n    kConnectedPaintable,\n    // The implementation still holds resources associated with the connection,\n    // but presentation has reported that it has become outdated, try\n    // reconnecting as soon as possible (at the next paint attempt, requesting\n    // it if needed). This is the only state that the guest output thread may\n    // transition the connection to (from kConnectedPaintable only) if it has\n    // access to painting (the paint mode is kGuestOutputThreadImmediately).\n    kConnectedOutdated,\n  };\n\n  static constexpr bool IsConnectedSurfacePaintConnectionState(\n      SurfacePaintConnectionState connection_state) {\n    return connection_state ==\n               SurfacePaintConnectionState::kConnectedPaintable ||\n           connection_state == SurfacePaintConnectionState::kConnectedOutdated;\n  }\n\n  struct UIDrawerReference {\n    UIDrawer* drawer;\n    uint64_t last_draw;\n\n    explicit UIDrawerReference(UIDrawer* drawer,\n                               uint64_t last_draw = UINT64_MAX)\n        : drawer(drawer), last_draw(last_draw) {}\n  };\n\n  void SetPaintModeFromUIThread(PaintMode new_mode);\n  // Based on conditions like whether UI needs to be drawn and whether vertical\n  // sync is implicit - see the implementation for the requirements.\n  // is_paintable is an explicit parameter because this function may be called\n  // in two scenarios:\n  // - After connection updates - painting connection is owned by the UI thread,\n  //   so the actual state can be obtained and passed here so kNone can be\n  //   returned.\n  // - When merely toggling something local to the UI thread - only to toggle\n  //   between the two threads, but not to switch from or to kNone (make sure\n  //   it's not kNone before calling), pass `true` in this case.\n  PaintMode GetDesiredPaintModeFromUIThread(bool is_paintable) const;\n\n  // Callable only by the UI thread and only when it has access to painting\n  // (PaintMode is not kGuestOutputThreadImmediately).\n  // This can be called to a surface after having not been connected to any (in\n  // this case, surface_paint_connection_state_ must be\n  // kUnconnectedRetryAtStateChange, not kUnconnectedNoUsableSurface, otherwise\n  // the call will be dropped), or to handle surface state changes such as\n  // resizing. However, this must not be called to change directly from one\n  // surface to another - need to disconnect prior to that, because the\n  // implementation may assume that the surface is still the same, and may try\n  // to, for instance, resize the buffers for the existing surface.\n  void UpdateSurfacePaintConnectionFromUIThread(\n      bool* repaint_needed_out, bool update_paint_mode_to_desired);\n  // Callable only by the UI thread and only when it has access to painting\n  // (PaintMode is not kGuestOutputThreadImmediately).\n  // See DisconnectPaintingFromSurfaceFromUIThreadImpl for more information.\n  void DisconnectPaintingFromSurfaceFromUIThread(\n      SurfacePaintConnectionState new_state);\n\n  // Can be called from any thread if an existing window_ safe to RequestPaint\n  // (not closed) is available in it, so doesn't check the surface painting\n  // connection state. Returns whether the window_->RequestPaint() call has been\n  // made.\n  bool RequestPaintOrConnectionRecoveryViaWindow(\n      bool force_ui_thread_paint_tick);\n\n  // Platform-specific function refreshing the monitor the current window\n  // surface is on, through the Surface or its Window. A reference to the\n  // monitor is held only when a Surface is available, so it's automatically\n  // dropped when the Window loses its Surface when it's being closed (but the\n  // Window object keeps being attached to the Presenter), for instance.\n  void UpdateSurfaceMonitorFromUIThread(\n      bool old_monitor_potentially_disconnected);\n  // Platform-specific function returning whether the surface the presenter is\n  // currently attached it is actually visible on any monitor. UI thread\n  // painting may be dropped if this returns false - need to request painting if\n  // the surface appears on a monitor again. May be using the state cached at\n  // window / surface state changes, not the actual state from the platform.\n  bool InSurfaceOnMonitorFromUIThread() const;\n\n  // Calls PaintAndPresentImpl and does post-paint checks that are safe to do on\n  // both the UI thread and the guest output thread. See the information about\n  // PaintAndPresentImpl for details.\n  // A kPresentedSuboptimal result is returned as is, but the connection may or\n  // may not be made outdated if that happens - though if it's\n  // kPresentedSuboptimal rather than kNotPresentedConnectionOutdated, the image\n  // has been successfully sent to the OS presentation at least.\n  PaintResult PaintAndPresent(bool execute_ui_drawers);\n\n  void HandleUIDrawersChangeFromUIThread(bool drawers_were_empty);\n\n  bool AreUITicksNeededFromUIThread() const {\n    // UI drawing should be done, and painting needs to be possible (coarsely\n    // checking because the actual connection state, including outdated, may be\n    // currently unavailable from the UI thread).\n    // There's no need to limit the frame rate manually if there is vertical\n    // sync in the presentation already as that might result in inconsistent\n    // frame pacing and potentially skipped vertical sync intervals.\n    return !ui_drawers_.empty() && paint_mode_ != PaintMode::kNone &&\n           !surface_paint_connection_has_implicit_vsync_;\n  }\n  void UpdateUITicksNeededFromUIThread();\n  void WaitForUITickFromUIThread();\n  // May be called from any thread.\n  void ForceUIThreadPaintTick();\n\n  // Must be called only in the end of entry points - reinitialization of the\n  // presenter may be done by the handler if it was called from the UI thread\n  // (even if the UI thread argument is false - such as when the guest output is\n  // refreshed on the UI thread).\n  HostGpuLossCallback host_gpu_loss_callback_;\n\n  // May be accessed by the guest output thread if the paint mode is not kNone,\n  // to request painting (for kUIThreadOnRequest) or reconnection (for\n  // kGuestOutputThreadImmediately) in the UI thread. Set the paint mode to\n  // kNone before modifying (that naturally has to be done anyway by\n  // disconnecting painting).\n  Window* window_ = nullptr;\n\n  // The surface of the `window_` the presenter is currently attached to.\n  Surface* surface_ = nullptr;\n\n  // Mutex protecting paint_mode_ (and, in the guest output thread, objects\n  // related to painting themselves).\n  //\n  // The UI thread (as the mode is modifiable only by it) can use it as\n  // \"barriers\", like:\n  // 1) If needed, lock and disable guest output thread access to painting.\n  // 2) Interact with the painting connection.\n  // 3) If needed, lock and re-enable guest output thread access to the\n  //    painting.\n  //\n  // On the other hand, the guest output thread _must_ hold it all the time it's\n  // painting, to ensure the mode stays the same while it's painting.\n  std::mutex paint_mode_mutex_;\n  // UI thread: writable, guest output thread: read-only.\n  PaintMode paint_mode_ = PaintMode::kNone;\n\n  // These fields can be accessed _exclusively_ by either the UI thread or the\n  // guest output thread, depending on paint_mode_.\n  // If it's kGuestOutputThreadImmediately, they can be accessed _only_ by the\n  // guest output thread (though the UI thread can still read, but not modify,\n  // fields that are writable by the UI thread and readadable by both).\n  // Otherwise, they can be accessed _only_ by the UI thread.\n  // The connection state may be changed from the guest output thread, but only\n  // from kConnectedPaintable to kConnectedOutdated.\n  SurfacePaintConnectionState surface_paint_connection_state_ =\n      SurfacePaintConnectionState::kUnconnectedRetryAtStateChange;\n  // If the surface connection was optimal at the last paint attempt, but now\n  // has become suboptimal, need to try to reconnect. But only in this case - if\n  // the connection has been suboptimal from the very beginning don't try to\n  // reconnect every frame.\n  bool surface_paint_connection_was_optimal_at_successful_paint_ = false;\n\n  // Modifiable only by the UI thread (therefore can be accessed by the UI\n  // thread regardless of the paint mode) while (re)connecting painting to the\n  // surface.\n  bool surface_paint_connection_has_implicit_vsync_ = false;\n  // Modifiable only by the UI thread, can be read by the thread that's\n  // painting.\n  uint32_t surface_width_in_paint_connection_ = 0;\n  uint32_t surface_height_in_paint_connection_ = 0;\n\n  // Can be set by both the UI thread and the guest output thread before doing\n  // window_->RequestPaint() - whether an extra painting (preceded by\n  // reconnection if needed, and painting) was requested, primarily after some\n  // state change that may effect the surface painting connection, resulting in\n  // the need to refresh it as soon as possible.\n  //\n  // Relaxed memory order is enough, everything that may influence painting is\n  // either local to the UI thread or protected with barriers elsewhere.\n  //\n  // There's no need to bother about resetting this variable when losing\n  // connection as the next successful reconnection should be followed by a\n  // repaint request anyway.\n  std::atomic<bool> ui_thread_paint_requested_{false};\n\n  std::mutex guest_output_paint_config_mutex_;\n  // UI thread: writable, guest output thread: read-only.\n  GuestOutputPaintConfig guest_output_paint_config_;\n\n  // Single-producer-multiple-consumers (lock-free SPSC + consumer lock) mailbox\n  // for presenting of the most up-to-date guest output image without long\n  // interlocking between guest output refreshing and painting.\n  static_assert(kGuestOutputMailboxSize == 3);\n  // The \"acquired\" image (in bits 0:1) is the one that is currently being read,\n  // or was last read, by a consumer of the guest output. The index of it can be\n  // modified only by the consumer and stays the same while it's processing the\n  // image.\n  // The \"ready\" image (in bits 2:3) is the most up-to-date image that the\n  // refresher has completely written, and a consumer may acquire it. It may be\n  // == acquired if there has been no refresh since the last acquisition.\n  // These two images can be accessed by painting in parallel, in an unordered\n  // way, with guest output refreshing.\n  std::atomic<uint32_t> guest_output_mailbox_acquired_and_ready_{0};\n  // The \"writable\" image is different than both \"acquired\" and \"ready\" and is\n  // accessible only by the guest output refreshing - it's the image that the\n  // refresher may write to.\n  uint32_t guest_output_mailbox_writable_ = 1;\n  // The guest output images may be consumed by two operations - painting, and\n  // capturing to a CPU-side buffer. These two usually never happen in parallel\n  // in reality though, as they're usually not even needed both at once in the\n  // same app within Xenia, so there's no need to create any\n  // complex lock-free synchronization between the two, but still, the situation\n  // when multiple consumers want the guest output image at the same is\n  // perfectly valid (unlike for producers, because even with a producer lock\n  // that would still be a race condition since the two refreshes themselves\n  // will be done in an undefined order) - so, a sufficient synchronization\n  // mechanism is used to make sure multiple consumers can acquire images\n  // without interfering with each other.\n  // While this is held, paint_mode_mutex_ must not be locked (the lock order is\n  // the reverse when painting in the guest output thread - painting is done\n  // with paint_mode_mutex_ held in this case, and guest output consumption\n  // happens as part of painting.\n  std::mutex guest_output_mailbox_consumer_mutex_;\n\n  std::array<GuestOutputProperties, kGuestOutputMailboxSize>\n      guest_output_properties_;\n  // Accessible only by refreshing, whether the last refresh contained an image\n  // rather than being blank.\n  bool guest_output_active_last_refresh_ = false;\n\n  // Ordered by the Z order, and then by the time of addition.\n  // Note: All the iteration logic involving this Z ordering must be the same as\n  // in input handling (in the input listeners in the Window), but in reverse.\n  std::multimap<size_t, UIDrawerReference> ui_drawers_;\n\n  size_t ui_draw_current_ = 0;\n  size_t ui_draw_current_z_order_;\n  std::multimap<size_t, UIDrawerReference>::iterator ui_draw_next_iterator_;\n  bool is_executing_ui_drawers_ = false;\n\n  // Whether currently running the logic of PaintFromUIThread, so certain\n  // actions (such as changing the paint mode, requesting a redraw) must be\n  // deferred and be handled by the tail of PaintFromUIThread for consistency\n  // with what PaintFromUIThread does internally.\n  bool is_in_ui_thread_paint_ = false;\n  bool request_guest_output_paint_after_current_ui_thread_paint_;\n  bool request_ui_paint_after_current_ui_thread_paint_;\n\n  // Platform-specific, but implementation-agnostic parts, primarily for\n  // limiting of the frame rate of the UI to avoid drawing the UI at extreme\n  // frame rates wasting the CPU and the GPU resources and starving everything\n  // else. The waits performed here must be interruptible by guest output\n  // presentation requests to prevent adding arbitrary amounts of latency to it.\n  // On Android and GTK, this is not needed, the frame rate of draw events is\n  // limited to the display refresh rate internally.\n#if XE_PLATFORM_WIN32\n  static Microsoft::WRL::ComPtr<IDXGIOutput> GetDXGIOutputForMonitor(\n      IDXGIFactory1* factory, HMONITOR monitor);\n  bool AreDXGIUITicksWaitable(\n      [[maybe_unused]] const std::unique_lock<std::mutex>& dxgi_ui_tick_lock) {\n    return dxgi_ui_ticks_needed_ && !dxgi_ui_tick_thread_shutdown_ &&\n           dxgi_ui_tick_output_;\n  }\n  void DXGIUITickThread();\n\n  // Accessible only from the UI thread, to avoid updating monitor-dependent\n  // information such as the DXGI output if the monitor hasn't actually been\n  // changed in the current state change (such as window positioning changes).\n  HMONITOR surface_win32_monitor_ = nullptr;\n\n  // Requiring the lowest version of DXGI for IDXGIOutput::WaitForVBlank, which\n  // is available even on Windows Vista, but for IDXGIFactory1::IsCurrent,\n  // DXGI 1.1 is needed (available starting from Windows 7; also mixing DXGI 1.0\n  // and 1.1+ in the Direct3D 12 code is not supported, see CreateDXGIFactory on\n  // MSDN). The factory is created when it's needed, and may be released and\n  // recreated when it's not current anymore and that becomes relevant.\n  Microsoft::WRL::ComPtr<IDXGIFactory1> dxgi_ui_tick_factory_;\n\n  // Accessible only from the UI thread, though the value is taken from the\n  // tick-mutex-protected variable.\n  uint64_t dxgi_ui_tick_last_draw_ = 0;\n\n  std::mutex dxgi_ui_tick_mutex_;\n  uint64_t dxgi_ui_tick_last_vblank_ = 1;\n  // If output is null or shutdown is true, the signal may not be sent, either\n  // don't limit the frame rate in this case (an exceptional situation, such as\n  // a failure to find the output in DXGI), or don't draw at all if the window\n  // was removed from a connected monitor.\n  Microsoft::WRL::ComPtr<IDXGIOutput> dxgi_ui_tick_output_;\n  // To avoid allocating processing resources to the thread when nothing needs\n  // the ticks (not drawing the UI), the thread waits for vertical blanking\n  // intervals only when the UI drawing ticks are needed, and sleeping waiting\n  // for the control condition variable signals otherwise. Modifiable only from\n  // the UI thread, so readable by it without locking the mutex.\n  bool dxgi_ui_ticks_needed_ = false;\n  // The shutdown flag is modifiable only from the UI thread.\n  bool dxgi_ui_tick_thread_shutdown_ = false;\n  bool dxgi_ui_tick_force_requested_ = false;\n\n  std::condition_variable dxgi_ui_tick_control_condition_;\n  // May be signaled by guest output refreshing.\n  std::condition_variable dxgi_ui_tick_signal_condition_;\n\n  std::thread dxgi_ui_tick_thread_;\n#endif  // XE_PLATFORM\n};\n\n}  // namespace ui\n}  // namespace xe\n\n#endif  // XENIA_UI_PRESENTER_H_\n"
  },
  {
    "path": "src/xenia/ui/renderdoc_api.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/ui/renderdoc_api.h\"\n\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/platform.h\"\n\n#if XE_PLATFORM_LINUX\n#include <dlfcn.h>\n#elif XE_PLATFORM_WIN32\n#include \"xenia/base/platform_win.h\"\n#endif\n\nnamespace xe {\nnamespace ui {\n\nstd::unique_ptr<RenderDocAPI> RenderDocAPI::CreateIfConnected() {\n  std::unique_ptr<RenderDocAPI> renderdoc_api(new RenderDocAPI());\n\n  pRENDERDOC_GetAPI get_api = nullptr;\n\n  // The RenderDoc library should already be loaded into the process if\n  // RenderDoc is attached - this is why RTLD_NOLOAD or GetModuleHandle instead\n  // of LoadLibrary.\n#if XE_PLATFORM_LINUX\n#if XE_PLATFORM_ANDROID\n  const char* const library_name = \"libVkLayer_GLES_RenderDoc.so\";\n#else\n  const char* const library_name = \"librenderdoc.so\";\n#endif\n  renderdoc_api->library_ = dlopen(library_name, RTLD_NOW | RTLD_NOLOAD);\n  if (!renderdoc_api->library_) {\n    return nullptr;\n  }\n  get_api =\n      pRENDERDOC_GetAPI(dlsym(renderdoc_api->library_, \"RENDERDOC_GetAPI\"));\n#elif XE_PLATFORM_WIN32\n  renderdoc_api->library_ = GetModuleHandleW(L\"renderdoc.dll\");\n  if (!renderdoc_api->library_) {\n    return nullptr;\n  }\n  get_api = pRENDERDOC_GetAPI(\n      GetProcAddress(renderdoc_api->library_, \"RENDERDOC_GetAPI\"));\n#endif\n\n  // get_api will be null if RenderDoc is not connected, or the API isn't\n  // available on this platform, or there was an error.\n  if (!get_api ||\n      !get_api(eRENDERDOC_API_Version_1_0_0,\n               (void**)&renderdoc_api->api_1_0_0_) ||\n      !renderdoc_api->api_1_0_0_) {\n    return nullptr;\n  }\n\n  XELOGI(\"RenderDoc API initialized\");\n\n  return renderdoc_api;\n}\n\nRenderDocAPI::~RenderDocAPI() {\n#if XE_PLATFORM_LINUX\n  if (library_) {\n    dlclose(library_);\n  }\n#endif\n  // Not calling FreeLibrary on Windows as GetModuleHandle doesn't increment\n  // the reference count.\n}\n\n}  // namespace ui\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/ui/renderdoc_api.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_RENDERDOC_API_H_\n#define XENIA_UI_RENDERDOC_API_H_\n\n#include <memory>\n\n#include \"third_party/renderdoc/renderdoc_app.h\"\n#include \"xenia/base/platform.h\"\n\n#if XE_PLATFORM_WIN32\n#include \"xenia/base/platform_win.h\"\n#endif\n\nnamespace xe {\nnamespace ui {\n\nclass RenderDocAPI {\n public:\n  static std::unique_ptr<RenderDocAPI> CreateIfConnected();\n\n  RenderDocAPI(const RenderDocAPI&) = delete;\n  RenderDocAPI& operator=(const RenderDocAPI&) = delete;\n\n  ~RenderDocAPI();\n\n  // Always present if this object exists.\n  const RENDERDOC_API_1_0_0* api_1_0_0() const { return api_1_0_0_; }\n\n private:\n  explicit RenderDocAPI() = default;\n\n#if XE_PLATFORM_LINUX\n  void* library_ = nullptr;\n#elif XE_PLATFORM_WIN32\n  HMODULE library_ = nullptr;\n#endif\n\n  const RENDERDOC_API_1_0_0* api_1_0_0_ = nullptr;\n};\n\n}  // namespace ui\n}  // namespace xe\n\n#endif  // XENIA_UI_RENDERDOC_API_H_"
  },
  {
    "path": "src/xenia/ui/shaders/amd_language.xesli",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_SHADERS_AMD_LANGUAGE_XESLI_\n#define XENIA_UI_SHADERS_AMD_LANGUAGE_XESLI_\n\n#if SHADING_LANGUAGE_GLSL_XE\n  #define A_GLSL 1\n#elif SHADING_LANGUAGE_HLSL_XE\n  #define A_HLSL 1\n#else\n  #error Unknown shading language for AMD shaders.\n#endif\n\n#endif  // XENIA_UI_SHADERS_AMD_LANGUAGE_XESLI_\n"
  },
  {
    "path": "src/xenia/ui/shaders/bytecode/.clang-format",
    "content": "DisableFormat: true\nSortIncludes: false\n"
  },
  {
    "path": "src/xenia/ui/shaders/bytecode/d3d12_5_1/guest_output_bilinear_dither_ps.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   int2 xe_bilinear_output_offset;    // Offset:    0 Size:     8\n//   float2 xe_bilinear_output_size_inv;// Offset:    8 Size:     8\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_bilinear_sampler               sampler      NA          NA      S0             s0      1 \n// xe_bilinear_source                texture  float4          2d      T0             t0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// SV_Position              0   xyzw        0      POS   float   xy  \n//\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// SV_Target                0   xyzw        0   TARGET   float   xyzw\n//\nps_5_1\ndcl_globalFlags refactoringAllowed\ndcl_immediateConstantBuffer { { -0.001003, 0, 0, 0},\n                              { 0.000881, 0, 0, 0},\n                              { 0.001693, 0, 0, 0},\n                              { -0.001555, 0, 0, 0},\n                              { 0.001279, 0, 0, 0},\n                              { -0.000605, 0, 0, 0},\n                              { 0.001065, 0, 0, 0},\n                              { -0.001386, 0, 0, 0},\n                              { 0.001356, 0, 0, 0},\n                              { 0.000513, 0, 0, 0},\n                              { 0.001218, 0, 0, 0},\n                              { -0.001601, 0, 0, 0},\n                              { 0.000590, 0, 0, 0},\n                              { -0.000283, 0, 0, 0},\n                              { 0.001111, 0, 0, 0},\n                              { -0.001417, 0, 0, 0},\n                              { 0.001448, 0, 0, 0},\n                              { -0.000544, 0, 0, 0},\n                              { 0.000130, 0, 0, 0},\n                              { -0.001203, 0, 0, 0},\n                              { 0.000437, 0, 0, 0},\n                              { -0.001049, 0, 0, 0},\n                              { 0.000620, 0, 0, 0},\n                              { -0.000483, 0, 0, 0},\n                              { 0.001877, 0, 0, 0},\n                              { -0.001095, 0, 0, 0},\n                              { -0.000100, 0, 0, 0},\n                              { -0.000528, 0, 0, 0},\n                              { 0.001432, 0, 0, 0},\n                              { -0.001938, 0, 0, 0},\n                              { -0.000697, 0, 0, 0},\n                              { 0.000038, 0, 0, 0},\n                              { 0.000712, 0, 0, 0},\n                              { -0.001310, 0, 0, 0},\n                              { 0.001095, 0, 0, 0},\n                              { -0.000299, 0, 0, 0},\n                              { 0.001754, 0, 0, 0},\n                              { -0.001677, 0, 0, 0},\n                              { 0.001478, 0, 0, 0},\n                              { -0.000038, 0, 0, 0},\n                              { 0.000789, 0, 0, 0},\n                              { -0.001831, 0, 0, 0},\n                              { 0.000299, 0, 0, 0},\n                              { 0.000988, 0, 0, 0},\n                              { -0.001172, 0, 0, 0},\n                              { 0.000176, 0, 0, 0},\n                              { 0.001647, 0, 0, 0},\n                              { -0.001585, 0, 0, 0},\n                              { 0.000345, 0, 0, 0},\n                              { 0.001861, 0, 0, 0},\n                              { -0.001769, 0, 0, 0},\n                              { -0.000866, 0, 0, 0},\n                              { 0.000896, 0, 0, 0},\n                              { 0.000161, 0, 0, 0},\n                              { -0.000927, 0, 0, 0},\n                              { -0.001524, 0, 0, 0},\n                              { -0.000651, 0, 0, 0},\n                              { 0.001294, 0, 0, 0},\n                              { -0.000804, 0, 0, 0},\n                              { -0.001463, 0, 0, 0},\n                              { 0.001800, 0, 0, 0},\n                              { -0.000850, 0, 0, 0},\n                              { 0.000850, 0, 0, 0},\n                              { -0.000452, 0, 0, 0},\n                              { -0.001065, 0, 0, 0},\n                              { -0.000146, 0, 0, 0},\n                              { 0.000237, 0, 0, 0},\n                              { 0.001417, 0, 0, 0},\n                              { -0.000590, 0, 0, 0},\n                              { -0.000191, 0, 0, 0},\n                              { 0.001601, 0, 0, 0},\n                              { 0.001019, 0, 0, 0},\n                              { 0.000406, 0, 0, 0},\n                              { -0.000207, 0, 0, 0},\n                              { 0.001585, 0, 0, 0},\n                              { 0.000651, 0, 0, 0},\n                              { -0.000069, 0, 0, 0},\n                              { 0.000421, 0, 0, 0},\n                              { -0.001647, 0, 0, 0},\n                              { 0.001371, 0, 0, 0},\n                              { 0.000927, 0, 0, 0},\n                              { -0.000666, 0, 0, 0},\n                              { 0.001187, 0, 0, 0},\n                              { -0.001448, 0, 0, 0},\n                              { 0.000574, 0, 0, 0},\n                              { -0.001892, 0, 0, 0},\n                              { 0.000758, 0, 0, 0},\n                              { -0.001294, 0, 0, 0},\n                              { 0.001922, 0, 0, 0},\n                              { -0.001662, 0, 0, 0},\n                              { -0.001034, 0, 0, 0},\n                              { -0.000498, 0, 0, 0},\n                              { -0.001861, 0, 0, 0},\n                              { 0.001203, 0, 0, 0},\n                              { -0.000329, 0, 0, 0},\n                              { -0.001371, 0, 0, 0},\n                              { 0.001631, 0, 0, 0},\n                              { -0.001846, 0, 0, 0},\n                              { 0.000728, 0, 0, 0},\n                              { -0.000911, 0, 0, 0},\n                              { 0.001815, 0, 0, 0},\n                              { -0.001141, 0, 0, 0},\n                              { -0.000375, 0, 0, 0},\n                              { 0.000100, 0, 0, 0},\n                              { -0.000743, 0, 0, 0},\n                              { 0.001172, 0, 0, 0},\n                              { 0.000069, 0, 0, 0},\n                              { 0.001494, 0, 0, 0},\n                              { 0.000973, 0, 0, 0},\n                              { -0.000957, 0, 0, 0},\n                              { 0.001938, 0, 0, 0},\n                              { 0.000528, 0, 0, 0},\n                              { 0.000054, 0, 0, 0},\n                              { -0.001248, 0, 0, 0},\n                              { -0.000268, 0, 0, 0},\n                              { 0.001540, 0, 0, 0},\n                              { -0.000008, 0, 0, 0},\n                              { 0.000314, 0, 0, 0},\n                              { 0.001340, 0, 0, 0},\n                              { -0.001754, 0, 0, 0},\n                              { 0.000498, 0, 0, 0},\n                              { -0.001187, 0, 0, 0},\n                              { 0.000774, 0, 0, 0},\n                              { -0.001340, 0, 0, 0},\n                              { 0.000268, 0, 0, 0},\n                              { -0.001478, 0, 0, 0},\n                              { -0.000130, 0, 0, 0},\n                              { -0.000774, 0, 0, 0},\n                              { 0.001310, 0, 0, 0},\n                              { 0.000391, 0, 0, 0},\n                              { 0.000957, 0, 0, 0},\n                              { -0.000467, 0, 0, 0},\n                              { -0.001540, 0, 0, 0},\n                              { 0.001034, 0, 0, 0},\n                              { -0.000682, 0, 0, 0},\n                              { 0.001677, 0, 0, 0},\n                              { 0.001003, 0, 0, 0},\n                              { -0.000421, 0, 0, 0},\n                              { 0.001785, 0, 0, 0},\n                              { -0.000237, 0, 0, 0},\n                              { -0.000620, 0, 0, 0},\n                              { 0.001662, 0, 0, 0},\n                              { 0.000835, 0, 0, 0},\n                              { -0.001723, 0, 0, 0},\n                              { -0.001080, 0, 0, 0},\n                              { 0.001769, 0, 0, 0},\n                              { -0.000789, 0, 0, 0},\n                              { -0.001785, 0, 0, 0},\n                              { 0.000682, 0, 0, 0},\n                              { -0.000988, 0, 0, 0},\n                              { -0.001325, 0, 0, 0},\n                              { -0.000176, 0, 0, 0},\n                              { -0.001509, 0, 0, 0},\n                              { 0.000329, 0, 0, 0},\n                              { -0.001953, 0, 0, 0},\n                              { 0.000666, 0, 0, 0},\n                              { -0.001616, 0, 0, 0},\n                              { 0.001157, 0, 0, 0},\n                              { 0.000452, 0, 0, 0},\n                              { -0.000437, 0, 0, 0},\n                              { 0.000191, 0, 0, 0},\n                              { -0.001494, 0, 0, 0},\n                              { 0.001141, 0, 0, 0},\n                              { 0.000084, 0, 0, 0},\n                              { 0.001892, 0, 0, 0},\n                              { 0.001402, 0, 0, 0},\n                              { 0.000559, 0, 0, 0},\n                              { 0.000115, 0, 0, 0},\n                              { 0.001264, 0, 0, 0},\n                              { -0.000574, 0, 0, 0},\n                              { -0.000973, 0, 0, 0},\n                              { 0.001325, 0, 0, 0},\n                              { 0.000222, 0, 0, 0},\n                              { -0.000758, 0, 0, 0},\n                              { -0.001356, 0, 0, 0},\n                              { 0.001463, 0, 0, 0},\n                              { 0.000866, 0, 0, 0},\n                              { -0.000360, 0, 0, 0},\n                              { 0.000544, 0, 0, 0},\n                              { -0.001126, 0, 0, 0},\n                              { -0.000253, 0, 0, 0},\n                              { -0.000559, 0, 0, 0},\n                              { -0.001815, 0, 0, 0},\n                              { 0.001723, 0, 0, 0},\n                              { -0.001157, 0, 0, 0},\n                              { 0.000743, 0, 0, 0},\n                              { 0.001570, 0, 0, 0},\n                              { -0.000115, 0, 0, 0},\n                              { -0.001218, 0, 0, 0},\n                              { 0.001831, 0, 0, 0},\n                              { 0.000023, 0, 0, 0},\n                              { -0.001922, 0, 0, 0},\n                              { 0.001739, 0, 0, 0},\n                              { -0.000712, 0, 0, 0},\n                              { 0.001555, 0, 0, 0},\n                              { -0.001708, 0, 0, 0},\n                              { 0.001233, 0, 0, 0},\n                              { 0.000207, 0, 0, 0},\n                              { 0.001049, 0, 0, 0},\n                              { -0.000728, 0, 0, 0},\n                              { -0.001631, 0, 0, 0},\n                              { -0.000314, 0, 0, 0},\n                              { 0.000483, 0, 0, 0},\n                              { -0.001800, 0, 0, 0},\n                              { 0.000942, 0, 0, 0},\n                              { -0.000345, 0, 0, 0},\n                              { 0.000697, 0, 0, 0},\n                              { -0.001019, 0, 0, 0},\n                              { -0.001570, 0, 0, 0},\n                              { -0.000023, 0, 0, 0},\n                              { -0.001279, 0, 0, 0},\n                              { 0.000804, 0, 0, 0},\n                              { -0.000896, 0, 0, 0},\n                              { -0.001432, 0, 0, 0},\n                              { 0.000605, 0, 0, 0},\n                              { -0.000084, 0, 0, 0},\n                              { 0.000911, 0, 0, 0},\n                              { 0.001953, 0, 0, 0},\n                              { -0.001402, 0, 0, 0},\n                              { -0.000636, 0, 0, 0},\n                              { 0.001509, 0, 0, 0},\n                              { -0.000820, 0, 0, 0},\n                              { 0.001248, 0, 0, 0},\n                              { 0.000253, 0, 0, 0},\n                              { 0.001524, 0, 0, 0},\n                              { 0.001126, 0, 0, 0},\n                              { 0.000360, 0, 0, 0},\n                              { -0.000391, 0, 0, 0},\n                              { 0.001907, 0, 0, 0},\n                              { 0.001386, 0, 0, 0},\n                              { -0.001111, 0, 0, 0},\n                              { 0.001616, 0, 0, 0},\n                              { -0.000881, 0, 0, 0},\n                              { 0.000146, 0, 0, 0},\n                              { 0.001080, 0, 0, 0},\n                              { -0.000054, 0, 0, 0},\n                              { 0.000283, 0, 0, 0},\n                              { -0.001693, 0, 0, 0},\n                              { -0.001264, 0, 0, 0},\n                              { -0.000513, 0, 0, 0},\n                              { -0.000161, 0, 0, 0},\n                              { -0.001877, 0, 0, 0},\n                              { -0.000835, 0, 0, 0},\n                              { 0.000636, 0, 0, 0},\n                              { 0.000008, 0, 0, 0},\n                              { -0.001907, 0, 0, 0},\n                              { -0.000222, 0, 0, 0},\n                              { 0.000375, 0, 0, 0},\n                              { -0.001739, 0, 0, 0},\n                              { -0.000406, 0, 0, 0},\n                              { -0.001233, 0, 0, 0},\n                              { 0.001708, 0, 0, 0},\n                              { -0.000942, 0, 0, 0},\n                              { 0.000820, 0, 0, 0},\n                              { 0.001846, 0, 0, 0},\n                              { 0.000467, 0, 0, 0} }\ndcl_constantbuffer CB0[0:0][1], immediateIndexed, space=0\ndcl_sampler S0[0:0], mode_default, space=0\ndcl_resource_texture2d (float,float,float,float) T0[0:0], space=0\ndcl_input_ps_siv linear noperspective v0.xy, position\ndcl_output o0.xyzw\ndcl_temps 2\nftoi r0.xy, v0.xyxx\niadd r0.xy, r0.xyxx, -CB0[0][0].xyxx\nutof r0.zw, r0.xxxy\nadd r0.zw, r0.zzzw, l(0.000000, 0.000000, 0.500000, 0.500000)\nmul r0.zw, r0.zzzw, CB0[0][0].zzzw\nsample_l r1.xyz, r0.zwzz, T0[0].xyzw, S0[0], l(0.000000)\nbfi r0.y, l(4), l(4), r0.y, l(0)\nbfi r0.x, l(4), l(0), r0.x, r0.y\nadd_sat o0.xyz, r1.xyzx, icb[r0.x + 0].xxxx\nmov o0.w, l(1.000000)\nret \n// Approximately 11 instruction slots used\n#endif\n\nconst BYTE guest_output_bilinear_dither_ps[] =\n{\n     68,  88,  66,  67, 156, 138, \n    216, 142, 148,  62, 121,  93, \n    254,  24, 231, 193,  50, 177, \n    115,  65,   1,   0,   0,   0, \n     56,  21,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     68,   2,   0,   0, 120,   2, \n      0,   0, 172,   2,   0,   0, \n    156,  20,   0,   0,  82,  68, \n     69,  70,   8,   2,   0,   0, \n      1,   0,   0,   0, 236,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n    255, 255,   0,   5,   0,   0, \n    224,   1,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 200,   0, \n      0,   0,   2,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  12,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 219,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95,  98, 105, 108, \n    105, 110, 101,  97, 114,  95, \n    115,  97, 109, 112, 108, 101, \n    114,   0, 120, 101,  95,  98, \n    105, 108, 105, 110, 101,  97, \n    114,  95, 115, 111, 117, 114, \n     99, 101,   0, 112, 117, 115, \n    104,  95,  99, 111, 110, 115, \n    116, 115,  95, 120, 101,   0, \n    171, 171, 219,   0,   0,   0, \n      2,   0,   0,   0,   4,   1, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  84,   1,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,   2,   0,   0,   0, \n    116,   1,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    152,   1,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      2,   0,   0,   0, 188,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 120, 101, \n     95,  98, 105, 108, 105, 110, \n    101,  97, 114,  95, 111, 117, \n    116, 112, 117, 116,  95, 111, \n    102, 102, 115, 101, 116,   0, \n    105, 110, 116,  50,   0, 171, \n      1,   0,   2,   0,   1,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 110,   1,   0,   0, \n    120, 101,  95,  98, 105, 108, \n    105, 110, 101,  97, 114,  95, \n    111, 117, 116, 112, 117, 116, \n     95, 115, 105, 122, 101,  95, \n    105, 110, 118,   0, 102, 108, \n    111,  97, 116,  50,   0, 171, \n      1,   0,   3,   0,   1,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 180,   1,   0,   0, \n     77, 105,  99, 114, 111, 115, \n    111, 102, 116,  32,  40,  82, \n     41,  32,  72,  76,  83,  76, \n     32,  83, 104,  97, 100, 101, \n    114,  32,  67, 111, 109, 112, \n    105, 108, 101, 114,  32,  49, \n     48,  46,  49,   0,  73,  83, \n     71,  78,  44,   0,   0,   0, \n      1,   0,   0,   0,   8,   0, \n      0,   0,  32,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  83,  86,  95,  80, \n    111, 115, 105, 116, 105, 111, \n    110,   0,  79,  83,  71,  78, \n     44,   0,   0,   0,   1,   0, \n      0,   0,   8,   0,   0,   0, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,  15,   0,   0,   0, \n     83,  86,  95,  84,  97, 114, \n    103, 101, 116,   0, 171, 171, \n     83,  72,  69,  88, 232,  17, \n      0,   0,  81,   0,   0,   0, \n    122,   4,   0,   0, 106,   8, \n      0,   1,  53,  24,   0,   0, \n      2,   4,   0,   0, 132, 131, \n    131, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 231, 230, 102,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    222, 221, 221,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 204, 203, \n    203, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 168, 167, 167,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    159, 158,  30, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140, 139, \n    139,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 182, 181, 181, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    178, 177, 177,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 135, 134, \n      6,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 160, 159, 159,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    210, 209, 209, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 155, 154, \n     26,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 149, 148, 148, 185, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    146, 145, 145,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 186, 185, \n    185, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 190, 189, 189,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    143, 142,  14, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 137, 136, \n      8,  57,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 158, 157, 157, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    229, 228, 228,  57,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 138, 137, \n    137, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 163, 162,  34,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    253, 252, 252, 185,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 246, 245, \n    245,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 144, 143, 143, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    209, 208, 208, 184,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 139, 138, \n     10, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 188, 187, 187,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    254, 253, 253, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 183, 182, \n     54, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 161, 160,  32,  56, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    187, 186,  58,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 172, 171, \n    171, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 144, 143, 143,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    157, 156, 156, 185,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 230, 229, \n    229,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 220, 219, 219, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    194, 193, 193,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 161, 160, \n     32, 184,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 207, 206,  78,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    240, 239, 239, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 157, 156, \n    156,  57,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 130, 129, 129,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    154, 153, 153, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 185, 184, \n     56,  57,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 216, 215, 215,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    208, 207, 207, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 181, 180, \n    180,  57,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 244, 243, 243,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    232, 231, 231, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 227, 226, \n     98, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 235, 234, 106,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    169, 168,  40,  57,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 243, 242, \n    114, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 200, 199, 199, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    171, 170,  42, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 170, 169, \n    169,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 211, 210,  82, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    192, 191, 191, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 236, 235, \n    235,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 223, 222,  94, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    223, 222,  94,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 237, 236, \n    236, 185,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140, 139, 139, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    153, 152,  24, 185,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 249, 248, \n    120,  57,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 186, 185, 185,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    155, 154,  26, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 201, 200, \n     72, 185,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 210, 209, 209,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    134, 133, 133,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 213, 212, \n    212,  57,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 217, 216,  88, 185, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    208, 207, 207,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 171, 170, \n     42,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 145, 144, 144, 184, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    221, 220, 220,  57,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 216, 215, \n    215, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 180, 179, 179,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    243, 242, 114,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 175, 174, \n     46, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 156, 155, 155,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    190, 189, 189, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 151, 150, \n     22,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 248, 247, 247, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    199, 198,  70,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 170, 169, \n    169, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 252, 251, 251,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    218, 217, 217, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 136, 135, \n    135, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 131, 130,   2, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    244, 243, 243, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 158, 157, \n    157,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 173, 172, 172, 185, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    180, 179, 179, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 214, 213, \n    213,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 242, 241, 241, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    191, 190,  62,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 239, 238, \n    110, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 238, 237, 237,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    150, 149, 149, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 197, 196, \n    196, 185,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 209, 208, 208,  56, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    195, 194,  66, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 154, 153, \n    153,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 145, 144, 144,  56, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    196, 195, 195,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 255, 254, \n    126,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 251, 250, 122, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    254, 253, 253,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 139, 138, \n     10,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 225, 224,  96,  56, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    164, 163, 163, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 141, 140, \n    140, 185,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 202, 201, 201,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    129, 128,   0, 183,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165, 164, \n    164,  57,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 176, 175, 175,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    230, 229, 229, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 131, 130, \n      2,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 156, 155, 155, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    203, 202,  74,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 176, 175, \n    175, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 141, 140, 140,  57, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    194, 193, 193, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 137, 136, \n      8, 185,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 203, 202,  74, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    172, 171, 171,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 205, 204, \n    204,  57,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 251, 250, 122,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    245, 244, 244, 185,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 202, 201, \n    201, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 136, 135, 135,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    179, 178,  50, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 220, 219, \n    219,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 132, 131, 131,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    221, 220, 220, 185,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 234, 233, \n    233,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 249, 248, 120, 185, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    163, 162,  34, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 218, 217, \n    217,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 219, 218,  90,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    226, 225, 225, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 142, 141, \n    141, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 232, 231, 231,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    207, 206,  78, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 234, 233, \n    233, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 179, 178,  50,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    130, 129, 129, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 174, 173, \n    173, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 185, 184,  56, 185, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    198, 197, 197, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 173, 172, \n    172,  57,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0, 187, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    175, 174,  46,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 212, 211, \n    211, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 152, 151, 151,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    237, 236, 236,  57,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 229, 228, \n    228, 185,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 201, 200,  72,  57, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    196, 195, 195, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 150, 149, \n    149,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 177, 176, 176,  56, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    248, 247, 247,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 184, 183, \n    183,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 147, 146,  18,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    241, 240, 240,  56,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 166, 165, \n    165,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 151, 150,  22, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    255, 254, 126, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 174, 173, \n    173,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 233, 232, 104,  57, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    199, 198,  70, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 178, 177, \n    177, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 192, 191, 191,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    227, 226,  98,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 189, 188, \n    188, 185,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 143, 142,  14,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    148, 147, 147, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 133, 132, \n    132, 185,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 147, 146,  18, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    238, 237, 237, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 226, 225, \n    225,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 152, 151, 151, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    195, 194,  66,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 206, 205, \n    205,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 241, 240, 240, 184, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    160, 159, 159, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 240, 239, \n    239,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 193, 192, 192,  55, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    252, 251, 251, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 228, 227, \n    227,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 187, 186,  58, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    204, 203, 203,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 224, 223, \n    223, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 162, 161, 161,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    217, 216,  88,  57,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 138, 137, \n    137,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 191, 190,  62, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    214, 213, 213, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165, 164, \n    164, 185,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 253, 252, 252,  57, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    236, 235, 235, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 247, 246, \n    118,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 181, 180, 180, 185, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    183, 182,  54,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 134, 133, \n    133, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 206, 205, 205, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    193, 192, 192, 183,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 168, 167, \n    167, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 211, 210,  82,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    235, 234, 106, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 188, 187, \n    187, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 159, 158,  30,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    177, 176, 176, 184,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 239, 238, \n    110,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,  59, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    184, 183, 183, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 167, 166, \n     38, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 198, 197, 197,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    215, 214,  86, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 164, 163, \n    163,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 133, 132, 132,  57, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    200, 199, 199,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 148, 147, \n    147,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 189, 188, 188,  57, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    205, 204, 204, 185,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 250, 249, \n    249,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 182, 181, 181,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    146, 145, 145, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 212, 211, \n    211,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 231, 230, 102, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    153, 152,  24,  57,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 142, 141, \n    141,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 225, 224,  96, 184, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    149, 148, 148,  57,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 222, 221, \n    221, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 166, 165, 165, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    135, 134,   6, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 169, 168, \n     40, 185,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 246, 245, 245, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    219, 218,  90, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 167, 166, \n     38,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 129, 128,   0,  55, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    250, 249, 249, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 233, 232, \n    104, 185,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 197, 196, 196,  57, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    228, 227, 227, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 213, 212, \n    212, 185,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 162, 161, 161, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    224, 223, 223,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 247, 246, \n    118, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 215, 214,  86,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    242, 241, 241,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 245, 244, \n    244,  57,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  89,   0,   0,   7, \n     70, 142,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     90,   0,   0,   6,  70, 110, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     88,  24,   0,   7,  70, 126, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  85,  85,   0,   0, \n      0,   0,   0,   0, 100,  32, \n      0,   4,  50,  16,  16,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0, 101,   0,   0,   3, \n    242,  32,  16,   0,   0,   0, \n      0,   0, 104,   0,   0,   2, \n      2,   0,   0,   0,  27,   0, \n      0,   5,  50,   0,  16,   0, \n      0,   0,   0,   0,  70,  16, \n     16,   0,   0,   0,   0,   0, \n     30,   0,   0,  10,  50,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0,  70, 128,  48, 128, \n     65,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   0, \n      0,   5, 194,   0,  16,   0, \n      0,   0,   0,   0,   6,   4, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,  10, 194,   0, \n     16,   0,   0,   0,   0,   0, \n    166,  14,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,  63, \n      0,   0,   0,  63,  56,   0, \n      0,   9, 194,   0,  16,   0, \n      0,   0,   0,   0, 166,  14, \n     16,   0,   0,   0,   0,   0, \n    166, 142,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  72,   0, \n      0,  13, 114,   0,  16,   0, \n      1,   0,   0,   0, 230,  10, \n     16,   0,   0,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,  96,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     34,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0, 140,   0, \n      0,  11,  18,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      0,  32,   0,   8, 114,  32, \n     16,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,   1,   0, \n      0,   0,   6, 144, 144,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n    130,  32,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0, 128,  63,  62,   0, \n      0,   1,  83,  84,  65,  84, \n    148,   0,   0,   0,  11,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   1,   0,   0,   2,   0, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0\n};\n"
  },
  {
    "path": "src/xenia/ui/shaders/bytecode/d3d12_5_1/guest_output_bilinear_ps.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   int2 xe_bilinear_output_offset;    // Offset:    0 Size:     8\n//   float2 xe_bilinear_output_size_inv;// Offset:    8 Size:     8\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_bilinear_sampler               sampler      NA          NA      S0             s0      1 \n// xe_bilinear_source                texture  float4          2d      T0             t0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// SV_Position              0   xyzw        0      POS   float   xy  \n//\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// SV_Target                0   xyzw        0   TARGET   float   xyzw\n//\nps_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][1], immediateIndexed, space=0\ndcl_sampler S0[0:0], mode_default, space=0\ndcl_resource_texture2d (float,float,float,float) T0[0:0], space=0\ndcl_input_ps_siv linear noperspective v0.xy, position\ndcl_output o0.xyzw\ndcl_temps 1\nftoi r0.xy, v0.xyxx\niadd r0.xy, r0.xyxx, -CB0[0][0].xyxx\nutof r0.xy, r0.xyxx\nadd r0.xy, r0.xyxx, l(0.500000, 0.500000, 0.000000, 0.000000)\nmul r0.xy, r0.xyxx, CB0[0][0].zwzz\nsample_l r0.xyz, r0.xyxx, T0[0].xyzw, S0[0], l(0.000000)\nmov o0.xyz, r0.xyzx\nmov o0.w, l(1.000000)\nret \n// Approximately 9 instruction slots used\n#endif\n\nconst BYTE guest_output_bilinear_ps[] =\n{\n     68,  88,  66,  67, 235,  28, \n     93, 216, 171, 104, 177, 132, \n     67, 116,  72, 226, 224,  12, \n     60, 100,   1,   0,   0,   0, \n    204,   4,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     68,   2,   0,   0, 120,   2, \n      0,   0, 172,   2,   0,   0, \n     48,   4,   0,   0,  82,  68, \n     69,  70,   8,   2,   0,   0, \n      1,   0,   0,   0, 236,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n    255, 255,   0,   5,   0,   0, \n    224,   1,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 200,   0, \n      0,   0,   2,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  12,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 219,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95,  98, 105, 108, \n    105, 110, 101,  97, 114,  95, \n    115,  97, 109, 112, 108, 101, \n    114,   0, 120, 101,  95,  98, \n    105, 108, 105, 110, 101,  97, \n    114,  95, 115, 111, 117, 114, \n     99, 101,   0, 112, 117, 115, \n    104,  95,  99, 111, 110, 115, \n    116, 115,  95, 120, 101,   0, \n    171, 171, 219,   0,   0,   0, \n      2,   0,   0,   0,   4,   1, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  84,   1,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,   2,   0,   0,   0, \n    116,   1,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    152,   1,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      2,   0,   0,   0, 188,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 120, 101, \n     95,  98, 105, 108, 105, 110, \n    101,  97, 114,  95, 111, 117, \n    116, 112, 117, 116,  95, 111, \n    102, 102, 115, 101, 116,   0, \n    105, 110, 116,  50,   0, 171, \n      1,   0,   2,   0,   1,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 110,   1,   0,   0, \n    120, 101,  95,  98, 105, 108, \n    105, 110, 101,  97, 114,  95, \n    111, 117, 116, 112, 117, 116, \n     95, 115, 105, 122, 101,  95, \n    105, 110, 118,   0, 102, 108, \n    111,  97, 116,  50,   0, 171, \n      1,   0,   3,   0,   1,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 180,   1,   0,   0, \n     77, 105,  99, 114, 111, 115, \n    111, 102, 116,  32,  40,  82, \n     41,  32,  72,  76,  83,  76, \n     32,  83, 104,  97, 100, 101, \n    114,  32,  67, 111, 109, 112, \n    105, 108, 101, 114,  32,  49, \n     48,  46,  49,   0,  73,  83, \n     71,  78,  44,   0,   0,   0, \n      1,   0,   0,   0,   8,   0, \n      0,   0,  32,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  83,  86,  95,  80, \n    111, 115, 105, 116, 105, 111, \n    110,   0,  79,  83,  71,  78, \n     44,   0,   0,   0,   1,   0, \n      0,   0,   8,   0,   0,   0, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,  15,   0,   0,   0, \n     83,  86,  95,  84,  97, 114, \n    103, 101, 116,   0, 171, 171, \n     83,  72,  69,  88, 124,   1, \n      0,   0,  81,   0,   0,   0, \n     95,   0,   0,   0, 106,   8, \n      0,   1,  89,   0,   0,   7, \n     70, 142,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     90,   0,   0,   6,  70, 110, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     88,  24,   0,   7,  70, 126, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  85,  85,   0,   0, \n      0,   0,   0,   0, 100,  32, \n      0,   4,  50,  16,  16,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0, 101,   0,   0,   3, \n    242,  32,  16,   0,   0,   0, \n      0,   0, 104,   0,   0,   2, \n      1,   0,   0,   0,  27,   0, \n      0,   5,  50,   0,  16,   0, \n      0,   0,   0,   0,  70,  16, \n     16,   0,   0,   0,   0,   0, \n     30,   0,   0,  10,  50,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0,  70, 128,  48, 128, \n     65,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  86,   0, \n      0,   5,  50,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,  10,  50,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,  63,   0,   0, \n      0,  63,   0,   0,   0,   0, \n      0,   0,   0,   0,  56,   0, \n      0,   9,  50,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n    230, 138,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  72,   0, \n      0,  13, 114,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,  96,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n    114,  32,  16,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5, 130,  32,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0, 128,  63, \n     62,   0,   0,   1,  83,  84, \n     65,  84, 148,   0,   0,   0, \n      9,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/ui/shaders/bytecode/d3d12_5_1/guest_output_ffx_cas_resample_dither_ps.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   int2 xe_cas_output_offset;         // Offset:    0 Size:     8\n//   float2 xe_cas_input_output_size_ratio;// Offset:    8 Size:     8\n//   float xe_cas_sharpness_post_setup; // Offset:   16 Size:     4\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_cas_source                     texture  float4          2d      T0             t0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// SV_Position              0   xyzw        0      POS   float   xy  \n//\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// SV_Target                0   xyzw        0   TARGET   float   xyzw\n//\nps_5_1\ndcl_globalFlags refactoringAllowed\ndcl_immediateConstantBuffer { { -0.001003, 0, 0, 0},\n                              { 0.000881, 0, 0, 0},\n                              { 0.001693, 0, 0, 0},\n                              { -0.001555, 0, 0, 0},\n                              { 0.001279, 0, 0, 0},\n                              { -0.000605, 0, 0, 0},\n                              { 0.001065, 0, 0, 0},\n                              { -0.001386, 0, 0, 0},\n                              { 0.001356, 0, 0, 0},\n                              { 0.000513, 0, 0, 0},\n                              { 0.001218, 0, 0, 0},\n                              { -0.001601, 0, 0, 0},\n                              { 0.000590, 0, 0, 0},\n                              { -0.000283, 0, 0, 0},\n                              { 0.001111, 0, 0, 0},\n                              { -0.001417, 0, 0, 0},\n                              { 0.001448, 0, 0, 0},\n                              { -0.000544, 0, 0, 0},\n                              { 0.000130, 0, 0, 0},\n                              { -0.001203, 0, 0, 0},\n                              { 0.000437, 0, 0, 0},\n                              { -0.001049, 0, 0, 0},\n                              { 0.000620, 0, 0, 0},\n                              { -0.000483, 0, 0, 0},\n                              { 0.001877, 0, 0, 0},\n                              { -0.001095, 0, 0, 0},\n                              { -0.000100, 0, 0, 0},\n                              { -0.000528, 0, 0, 0},\n                              { 0.001432, 0, 0, 0},\n                              { -0.001938, 0, 0, 0},\n                              { -0.000697, 0, 0, 0},\n                              { 0.000038, 0, 0, 0},\n                              { 0.000712, 0, 0, 0},\n                              { -0.001310, 0, 0, 0},\n                              { 0.001095, 0, 0, 0},\n                              { -0.000299, 0, 0, 0},\n                              { 0.001754, 0, 0, 0},\n                              { -0.001677, 0, 0, 0},\n                              { 0.001478, 0, 0, 0},\n                              { -0.000038, 0, 0, 0},\n                              { 0.000789, 0, 0, 0},\n                              { -0.001831, 0, 0, 0},\n                              { 0.000299, 0, 0, 0},\n                              { 0.000988, 0, 0, 0},\n                              { -0.001172, 0, 0, 0},\n                              { 0.000176, 0, 0, 0},\n                              { 0.001647, 0, 0, 0},\n                              { -0.001585, 0, 0, 0},\n                              { 0.000345, 0, 0, 0},\n                              { 0.001861, 0, 0, 0},\n                              { -0.001769, 0, 0, 0},\n                              { -0.000866, 0, 0, 0},\n                              { 0.000896, 0, 0, 0},\n                              { 0.000161, 0, 0, 0},\n                              { -0.000927, 0, 0, 0},\n                              { -0.001524, 0, 0, 0},\n                              { -0.000651, 0, 0, 0},\n                              { 0.001294, 0, 0, 0},\n                              { -0.000804, 0, 0, 0},\n                              { -0.001463, 0, 0, 0},\n                              { 0.001800, 0, 0, 0},\n                              { -0.000850, 0, 0, 0},\n                              { 0.000850, 0, 0, 0},\n                              { -0.000452, 0, 0, 0},\n                              { -0.001065, 0, 0, 0},\n                              { -0.000146, 0, 0, 0},\n                              { 0.000237, 0, 0, 0},\n                              { 0.001417, 0, 0, 0},\n                              { -0.000590, 0, 0, 0},\n                              { -0.000191, 0, 0, 0},\n                              { 0.001601, 0, 0, 0},\n                              { 0.001019, 0, 0, 0},\n                              { 0.000406, 0, 0, 0},\n                              { -0.000207, 0, 0, 0},\n                              { 0.001585, 0, 0, 0},\n                              { 0.000651, 0, 0, 0},\n                              { -0.000069, 0, 0, 0},\n                              { 0.000421, 0, 0, 0},\n                              { -0.001647, 0, 0, 0},\n                              { 0.001371, 0, 0, 0},\n                              { 0.000927, 0, 0, 0},\n                              { -0.000666, 0, 0, 0},\n                              { 0.001187, 0, 0, 0},\n                              { -0.001448, 0, 0, 0},\n                              { 0.000574, 0, 0, 0},\n                              { -0.001892, 0, 0, 0},\n                              { 0.000758, 0, 0, 0},\n                              { -0.001294, 0, 0, 0},\n                              { 0.001922, 0, 0, 0},\n                              { -0.001662, 0, 0, 0},\n                              { -0.001034, 0, 0, 0},\n                              { -0.000498, 0, 0, 0},\n                              { -0.001861, 0, 0, 0},\n                              { 0.001203, 0, 0, 0},\n                              { -0.000329, 0, 0, 0},\n                              { -0.001371, 0, 0, 0},\n                              { 0.001631, 0, 0, 0},\n                              { -0.001846, 0, 0, 0},\n                              { 0.000728, 0, 0, 0},\n                              { -0.000911, 0, 0, 0},\n                              { 0.001815, 0, 0, 0},\n                              { -0.001141, 0, 0, 0},\n                              { -0.000375, 0, 0, 0},\n                              { 0.000100, 0, 0, 0},\n                              { -0.000743, 0, 0, 0},\n                              { 0.001172, 0, 0, 0},\n                              { 0.000069, 0, 0, 0},\n                              { 0.001494, 0, 0, 0},\n                              { 0.000973, 0, 0, 0},\n                              { -0.000957, 0, 0, 0},\n                              { 0.001938, 0, 0, 0},\n                              { 0.000528, 0, 0, 0},\n                              { 0.000054, 0, 0, 0},\n                              { -0.001248, 0, 0, 0},\n                              { -0.000268, 0, 0, 0},\n                              { 0.001540, 0, 0, 0},\n                              { -0.000008, 0, 0, 0},\n                              { 0.000314, 0, 0, 0},\n                              { 0.001340, 0, 0, 0},\n                              { -0.001754, 0, 0, 0},\n                              { 0.000498, 0, 0, 0},\n                              { -0.001187, 0, 0, 0},\n                              { 0.000774, 0, 0, 0},\n                              { -0.001340, 0, 0, 0},\n                              { 0.000268, 0, 0, 0},\n                              { -0.001478, 0, 0, 0},\n                              { -0.000130, 0, 0, 0},\n                              { -0.000774, 0, 0, 0},\n                              { 0.001310, 0, 0, 0},\n                              { 0.000391, 0, 0, 0},\n                              { 0.000957, 0, 0, 0},\n                              { -0.000467, 0, 0, 0},\n                              { -0.001540, 0, 0, 0},\n                              { 0.001034, 0, 0, 0},\n                              { -0.000682, 0, 0, 0},\n                              { 0.001677, 0, 0, 0},\n                              { 0.001003, 0, 0, 0},\n                              { -0.000421, 0, 0, 0},\n                              { 0.001785, 0, 0, 0},\n                              { -0.000237, 0, 0, 0},\n                              { -0.000620, 0, 0, 0},\n                              { 0.001662, 0, 0, 0},\n                              { 0.000835, 0, 0, 0},\n                              { -0.001723, 0, 0, 0},\n                              { -0.001080, 0, 0, 0},\n                              { 0.001769, 0, 0, 0},\n                              { -0.000789, 0, 0, 0},\n                              { -0.001785, 0, 0, 0},\n                              { 0.000682, 0, 0, 0},\n                              { -0.000988, 0, 0, 0},\n                              { -0.001325, 0, 0, 0},\n                              { -0.000176, 0, 0, 0},\n                              { -0.001509, 0, 0, 0},\n                              { 0.000329, 0, 0, 0},\n                              { -0.001953, 0, 0, 0},\n                              { 0.000666, 0, 0, 0},\n                              { -0.001616, 0, 0, 0},\n                              { 0.001157, 0, 0, 0},\n                              { 0.000452, 0, 0, 0},\n                              { -0.000437, 0, 0, 0},\n                              { 0.000191, 0, 0, 0},\n                              { -0.001494, 0, 0, 0},\n                              { 0.001141, 0, 0, 0},\n                              { 0.000084, 0, 0, 0},\n                              { 0.001892, 0, 0, 0},\n                              { 0.001402, 0, 0, 0},\n                              { 0.000559, 0, 0, 0},\n                              { 0.000115, 0, 0, 0},\n                              { 0.001264, 0, 0, 0},\n                              { -0.000574, 0, 0, 0},\n                              { -0.000973, 0, 0, 0},\n                              { 0.001325, 0, 0, 0},\n                              { 0.000222, 0, 0, 0},\n                              { -0.000758, 0, 0, 0},\n                              { -0.001356, 0, 0, 0},\n                              { 0.001463, 0, 0, 0},\n                              { 0.000866, 0, 0, 0},\n                              { -0.000360, 0, 0, 0},\n                              { 0.000544, 0, 0, 0},\n                              { -0.001126, 0, 0, 0},\n                              { -0.000253, 0, 0, 0},\n                              { -0.000559, 0, 0, 0},\n                              { -0.001815, 0, 0, 0},\n                              { 0.001723, 0, 0, 0},\n                              { -0.001157, 0, 0, 0},\n                              { 0.000743, 0, 0, 0},\n                              { 0.001570, 0, 0, 0},\n                              { -0.000115, 0, 0, 0},\n                              { -0.001218, 0, 0, 0},\n                              { 0.001831, 0, 0, 0},\n                              { 0.000023, 0, 0, 0},\n                              { -0.001922, 0, 0, 0},\n                              { 0.001739, 0, 0, 0},\n                              { -0.000712, 0, 0, 0},\n                              { 0.001555, 0, 0, 0},\n                              { -0.001708, 0, 0, 0},\n                              { 0.001233, 0, 0, 0},\n                              { 0.000207, 0, 0, 0},\n                              { 0.001049, 0, 0, 0},\n                              { -0.000728, 0, 0, 0},\n                              { -0.001631, 0, 0, 0},\n                              { -0.000314, 0, 0, 0},\n                              { 0.000483, 0, 0, 0},\n                              { -0.001800, 0, 0, 0},\n                              { 0.000942, 0, 0, 0},\n                              { -0.000345, 0, 0, 0},\n                              { 0.000697, 0, 0, 0},\n                              { -0.001019, 0, 0, 0},\n                              { -0.001570, 0, 0, 0},\n                              { -0.000023, 0, 0, 0},\n                              { -0.001279, 0, 0, 0},\n                              { 0.000804, 0, 0, 0},\n                              { -0.000896, 0, 0, 0},\n                              { -0.001432, 0, 0, 0},\n                              { 0.000605, 0, 0, 0},\n                              { -0.000084, 0, 0, 0},\n                              { 0.000911, 0, 0, 0},\n                              { 0.001953, 0, 0, 0},\n                              { -0.001402, 0, 0, 0},\n                              { -0.000636, 0, 0, 0},\n                              { 0.001509, 0, 0, 0},\n                              { -0.000820, 0, 0, 0},\n                              { 0.001248, 0, 0, 0},\n                              { 0.000253, 0, 0, 0},\n                              { 0.001524, 0, 0, 0},\n                              { 0.001126, 0, 0, 0},\n                              { 0.000360, 0, 0, 0},\n                              { -0.000391, 0, 0, 0},\n                              { 0.001907, 0, 0, 0},\n                              { 0.001386, 0, 0, 0},\n                              { -0.001111, 0, 0, 0},\n                              { 0.001616, 0, 0, 0},\n                              { -0.000881, 0, 0, 0},\n                              { 0.000146, 0, 0, 0},\n                              { 0.001080, 0, 0, 0},\n                              { -0.000054, 0, 0, 0},\n                              { 0.000283, 0, 0, 0},\n                              { -0.001693, 0, 0, 0},\n                              { -0.001264, 0, 0, 0},\n                              { -0.000513, 0, 0, 0},\n                              { -0.000161, 0, 0, 0},\n                              { -0.001877, 0, 0, 0},\n                              { -0.000835, 0, 0, 0},\n                              { 0.000636, 0, 0, 0},\n                              { 0.000008, 0, 0, 0},\n                              { -0.001907, 0, 0, 0},\n                              { -0.000222, 0, 0, 0},\n                              { 0.000375, 0, 0, 0},\n                              { -0.001739, 0, 0, 0},\n                              { -0.000406, 0, 0, 0},\n                              { -0.001233, 0, 0, 0},\n                              { 0.001708, 0, 0, 0},\n                              { -0.000942, 0, 0, 0},\n                              { 0.000820, 0, 0, 0},\n                              { 0.001846, 0, 0, 0},\n                              { 0.000467, 0, 0, 0} }\ndcl_constantbuffer CB0[0:0][2], immediateIndexed, space=0\ndcl_resource_texture2d (float,float,float,float) T0[0:0], space=0\ndcl_input_ps_siv linear noperspective v0.xy, position\ndcl_output o0.xyzw\ndcl_temps 14\nftoi r0.xy, v0.xyxx\niadd r0.xy, r0.xyxx, -CB0[0][0].xyxx\nmad r0.zw, CB0[0][0].zzzw, l(0.000000, 0.000000, 0.500000, 0.500000), l(0.000000, 0.000000, -0.500000, -0.500000)\nutof r1.xy, r0.xyxx\nmad r0.zw, r1.xxxy, CB0[0][0].zzzw, r0.zzzw\nround_ni r1.xy, r0.zwzz\nadd r0.zw, r0.zzzw, -r1.xxxy\nftoi r1.xy, r1.xyxx\niadd r2.xyzw, r1.xyxy, l(-1, 0, 0, -1)\nmov r3.xy, r2.zwzz\nmov r3.zw, l(0,0,0,0)\nld r3.xyz, r3.xyzw, T0[0].xyzw\nmov r2.zw, l(0,0,0,0)\nld r2.xyz, r2.xyzw, T0[0].xyzw\nmov r1.zw, l(0,0,0,0)\nld r4.xyz, r1.xyzw, T0[0].xyzw\niadd r5.xyzw, r1.xyxy, l(1, 0, 1, -1)\nmov r6.xy, r5.zwzz\nmov r6.zw, l(0,0,0,0)\nld r6.xyz, r6.xyzw, T0[0].xyzw\nmov r5.zw, l(0,0,0,0)\nld r5.xyz, r5.xyzw, T0[0].xyzw\niadd r7.xyzw, r1.xyxy, l(-1, 1, 2, 0)\nmov r8.xy, r7.zwzz\nmov r8.zw, l(0,0,0,0)\nld r8.xyz, r8.xyzw, T0[0].xyzw\nmov r7.zw, l(0,0,0,0)\nld r7.xyz, r7.xyzw, T0[0].xyzw\niadd r9.xyzw, r1.xyxy, l(0, 2, 0, 1)\nmov r10.xy, r9.zwzz\nmov r10.zw, l(0,0,0,0)\nld r10.xyz, r10.xyzw, T0[0].xyzw\nmov r9.zw, l(0,0,0,0)\nld r9.xyz, r9.xyzw, T0[0].xyzw\niadd r11.xyzw, r1.xyxy, l(2, 1, 1, 1)\nmov r12.xy, r11.zwzz\nmov r12.zw, l(0,0,0,0)\nld r12.xyz, r12.xyzw, T0[0].xyzw\nmov r11.zw, l(0,0,0,0)\nld r11.xyz, r11.xyzw, T0[0].xyzw\niadd r1.xy, r1.xyxx, l(1, 2, 0, 0)\nmov r1.zw, l(0,0,0,0)\nld r1.xyz, r1.xyzw, T0[0].xyzw\nmul r3.xyz, r3.xyzx, r3.xyzx\nmul r6.xyz, r6.xyzx, r6.xyzx\nmul r2.xyz, r2.xyzx, r2.xyzx\nmul r4.xyz, r4.xyzx, r4.xyzx\nmul r5.xyz, r5.xyzx, r5.xyzx\nmul r8.xyz, r8.xyzx, r8.xyzx\nmul r7.xyz, r7.xyzx, r7.xyzx\nmul r10.xyz, r10.xyzx, r10.xyzx\nmul r12.xyz, r12.xyzx, r12.xyzx\nmul r11.xyz, r11.xyzx, r11.xyzx\nmul r9.xyz, r9.xyzx, r9.xyzx\nmul r1.xyz, r1.xyzx, r1.xyzx\nmin r1.w, r2.y, r4.y\nmin r1.w, r1.w, r3.y\nmin r2.w, r5.y, r10.y\nmin r1.w, r1.w, r2.w\nmax r2.w, r2.y, r4.y\nmax r2.w, r2.w, r3.y\nmax r3.w, r5.y, r10.y\nmax r2.w, r2.w, r3.w\nmin r3.w, r4.y, r5.y\nmin r3.w, r3.w, r6.y\nmin r4.w, r8.y, r12.y\nmin r3.w, r3.w, r4.w\nmax r4.w, r4.y, r5.y\nmax r4.w, r4.w, r6.y\nmax r5.w, r8.y, r12.y\nmax r4.w, r4.w, r5.w\nmin r5.w, r7.y, r10.y\nmin r5.w, r4.y, r5.w\nmin r6.w, r9.y, r12.y\nmin r5.w, r5.w, r6.w\nmax r6.w, r7.y, r10.y\nmax r6.w, r4.y, r6.w\nmax r7.w, r9.y, r12.y\nmax r6.w, r6.w, r7.w\nmin r7.w, r10.y, r12.y\nmin r7.w, r5.y, r7.w\nmin r8.w, r1.y, r11.y\nmin r7.w, r7.w, r8.w\nmax r8.w, r10.y, r12.y\nmax r8.w, r5.y, r8.w\nmax r9.w, r1.y, r11.y\nmax r8.w, r8.w, r9.w\niadd r9.w, -r2.w, l(0x7ef07ebb)\niadd r10.w, -r4.w, l(0x7ef07ebb)\niadd r11.w, -r6.w, l(0x7ef07ebb)\niadd r12.w, -r8.w, l(0x7ef07ebb)\nadd r13.x, -r2.w, l(1.000000)\nmin r13.x, r1.w, r13.x\nmul_sat r9.w, r9.w, r13.x\nadd r13.x, -r4.w, l(1.000000)\nmin r13.x, r3.w, r13.x\nmul_sat r10.w, r10.w, r13.x\nadd r13.x, -r6.w, l(1.000000)\nmin r13.x, r5.w, r13.x\nmul_sat r11.w, r11.w, r13.x\nadd r13.x, -r8.w, l(1.000000)\nmin r13.x, r7.w, r13.x\nmul_sat r12.w, r12.w, r13.x\nushr r9.w, r9.w, l(1)\niadd r9.w, r9.w, l(0x1fbc4639)\nushr r10.w, r10.w, l(1)\niadd r10.w, r10.w, l(0x1fbc4639)\nushr r11.w, r11.w, l(1)\niadd r11.w, r11.w, l(0x1fbc4639)\nushr r12.w, r12.w, l(1)\niadd r12.w, r12.w, l(0x1fbc4639)\nmul r9.w, r9.w, CB0[0][1].x\nmul r10.w, r10.w, CB0[0][1].x\nmul r11.w, r11.w, CB0[0][1].x\nmul r12.w, r12.w, CB0[0][1].x\nadd r13.xy, -r0.wzww, l(1.000000, 1.000000, 0.000000, 0.000000)\nmul r13.z, r13.x, r13.y\nmul r13.xy, r0.zwzz, r13.xyxx\nmul r0.z, r0.w, r0.z\nadd r0.w, -r1.w, r2.w\nadd r0.w, r0.w, l(0.031250)\niadd r0.w, -r0.w, l(0x7ef07ebb)\nmul r1.w, r0.w, r13.z\nadd r2.w, -r3.w, r4.w\nadd r2.w, r2.w, l(0.031250)\niadd r2.w, -r2.w, l(0x7ef07ebb)\nmul r3.w, r2.w, r13.x\nadd r4.w, -r5.w, r6.w\nadd r4.w, r4.w, l(0.031250)\niadd r4.w, -r4.w, l(0x7ef07ebb)\nmul r5.w, r4.w, r13.y\nadd r6.w, -r7.w, r8.w\nadd r6.w, r6.w, l(0.031250)\niadd r6.w, -r6.w, l(0x7ef07ebb)\nmul r7.w, r0.z, r6.w\nmul r8.w, r1.w, r9.w\nmul r13.w, r3.w, r10.w\nmul r5.w, r5.w, r11.w\nmad r3.w, r10.w, r3.w, r5.w\nmad r0.w, r13.z, r0.w, r3.w\nmul r7.w, r7.w, r12.w\nmad r1.w, r9.w, r1.w, r7.w\nmad r2.w, r13.x, r2.w, r1.w\nmad r1.w, r13.y, r4.w, r1.w\nmad r0.z, r0.z, r6.w, r3.w\nadd r3.w, r13.w, r13.w\nmad r3.w, r8.w, l(2.000000), r3.w\nmad r3.w, r5.w, l(2.000000), r3.w\nmad r3.w, r7.w, l(2.000000), r3.w\nadd r3.w, r0.w, r3.w\nadd r3.w, r2.w, r3.w\nadd r3.w, r1.w, r3.w\nadd r3.w, r0.z, r3.w\niadd r4.w, -r3.w, l(0x7ef19fff)\nmad r3.w, -r4.w, r3.w, l(2.000000)\nmul r3.w, r3.w, r4.w\nmul r2.xyz, r2.xyzx, r8.wwww\nmad r2.xyz, r3.xyzx, r8.wwww, r2.xyzx\nmad r2.xyz, r6.xyzx, r13.wwww, r2.xyzx\nmad r2.xyz, r8.xyzx, r13.wwww, r2.xyzx\nmad r2.xyz, r7.xyzx, r5.wwww, r2.xyzx\nmad r2.xyz, r9.xyzx, r5.wwww, r2.xyzx\nmad r2.xyz, r11.xyzx, r7.wwww, r2.xyzx\nmad r1.xyz, r1.xyzx, r7.wwww, r2.xyzx\nmad r1.xyz, r4.xyzx, r0.wwww, r1.xyzx\nmad r1.xyz, r5.xyzx, r2.wwww, r1.xyzx\nmad r1.xyz, r10.xyzx, r1.wwww, r1.xyzx\nmad r1.xyz, r12.xyzx, r0.zzzz, r1.xyzx\nmul_sat r1.xyz, r3.wwww, r1.xyzx\nsqrt r1.xyz, r1.xyzx\nbfi r0.y, l(4), l(4), r0.y, l(0)\nbfi r0.x, l(4), l(0), r0.x, r0.y\nadd_sat o0.xyz, r1.xyzx, icb[r0.x + 0].xxxx\nmov o0.w, l(1.000000)\nret \n// Approximately 175 instruction slots used\n#endif\n\nconst BYTE guest_output_ffx_cas_resample_dither_ps[] =\n{\n     68,  88,  66,  67,   0, 137, \n    156, 109, 124, 158, 247, 143, \n     56,  48, 248, 105, 125, 135, \n    166, 115,   1,   0,   0,   0, \n    216,  40,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n    116,   2,   0,   0, 168,   2, \n      0,   0, 220,   2,   0,   0, \n     60,  40,   0,   0,  82,  68, \n     69,  70,  56,   2,   0,   0, \n      1,   0,   0,   0, 172,   0, \n      0,   0,   2,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n    255, 255,   0,   5,   0,   0, \n     16,   2,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,   0,   2,   0, \n      0,   0,   5,   0,   0,   0, \n      4,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n      1,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 154,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 120, 101,  95,  99, \n     97, 115,  95, 115, 111, 117, \n    114,  99, 101,   0, 112, 117, \n    115, 104,  95,  99, 111, 110, \n    115, 116, 115,  95, 120, 101, \n      0, 171, 171, 171, 154,   0, \n      0,   0,   3,   0,   0,   0, \n    196,   0,   0,   0,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  60,   1, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,   2,   0, \n      0,   0,  88,   1,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 124,   1,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   2,   0,   0,   0, \n    164,   1,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    200,   1,   0,   0,  16,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 236,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 120, 101, \n     95,  99,  97, 115,  95, 111, \n    117, 116, 112, 117, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 105, 110, 116,  50,   0, \n    171, 171,   1,   0,   2,   0, \n      1,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  81,   1, \n      0,   0, 120, 101,  95,  99, \n     97, 115,  95, 105, 110, 112, \n    117, 116,  95, 111, 117, 116, \n    112, 117, 116,  95, 115, 105, \n    122, 101,  95, 114,  97, 116, \n    105, 111,   0, 102, 108, 111, \n     97, 116,  50,   0, 171, 171, \n      1,   0,   3,   0,   1,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 155,   1,   0,   0, \n    120, 101,  95,  99,  97, 115, \n     95, 115, 104,  97, 114, 112, \n    110, 101, 115, 115,  95, 112, \n    111, 115, 116,  95, 115, 101, \n    116, 117, 112,   0, 102, 108, \n    111,  97, 116,   0, 171, 171, \n      0,   0,   3,   0,   1,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 228,   1,   0,   0, \n     77, 105,  99, 114, 111, 115, \n    111, 102, 116,  32,  40,  82, \n     41,  32,  72,  76,  83,  76, \n     32,  83, 104,  97, 100, 101, \n    114,  32,  67, 111, 109, 112, \n    105, 108, 101, 114,  32,  49, \n     48,  46,  49,   0,  73,  83, \n     71,  78,  44,   0,   0,   0, \n      1,   0,   0,   0,   8,   0, \n      0,   0,  32,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  83,  86,  95,  80, \n    111, 115, 105, 116, 105, 111, \n    110,   0,  79,  83,  71,  78, \n     44,   0,   0,   0,   1,   0, \n      0,   0,   8,   0,   0,   0, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,  15,   0,   0,   0, \n     83,  86,  95,  84,  97, 114, \n    103, 101, 116,   0, 171, 171, \n     83,  72,  69,  88,  88,  37, \n      0,   0,  81,   0,   0,   0, \n     86,   9,   0,   0, 106,   8, \n      0,   1,  53,  24,   0,   0, \n      2,   4,   0,   0, 132, 131, \n    131, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 231, 230, 102,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    222, 221, 221,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 204, 203, \n    203, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 168, 167, 167,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    159, 158,  30, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 140, 139, \n    139,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 182, 181, 181, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    178, 177, 177,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 135, 134, \n      6,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 160, 159, 159,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    210, 209, 209, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 155, 154, \n     26,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 149, 148, 148, 185, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    146, 145, 145,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 186, 185, \n    185, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 190, 189, 189,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    143, 142,  14, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 137, 136, \n      8,  57,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 158, 157, 157, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    229, 228, 228,  57,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 138, 137, \n    137, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 163, 162,  34,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    253, 252, 252, 185,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 246, 245, \n    245,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 144, 143, 143, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    209, 208, 208, 184,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 139, 138, \n     10, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 188, 187, 187,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    254, 253, 253, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 183, 182, \n     54, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 161, 160,  32,  56, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    187, 186,  58,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 172, 171, \n    171, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 144, 143, 143,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    157, 156, 156, 185,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 230, 229, \n    229,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 220, 219, 219, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    194, 193, 193,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 161, 160, \n     32, 184,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 207, 206,  78,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    240, 239, 239, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 157, 156, \n    156,  57,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 130, 129, 129,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    154, 153, 153, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 185, 184, \n     56,  57,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 216, 215, 215,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    208, 207, 207, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 181, 180, \n    180,  57,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 244, 243, 243,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    232, 231, 231, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 227, 226, \n     98, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 235, 234, 106,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    169, 168,  40,  57,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 243, 242, \n    114, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 200, 199, 199, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    171, 170,  42, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 170, 169, \n    169,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 211, 210,  82, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    192, 191, 191, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 236, 235, \n    235,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 223, 222,  94, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    223, 222,  94,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 237, 236, \n    236, 185,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140, 139, 139, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    153, 152,  24, 185,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 249, 248, \n    120,  57,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 186, 185, 185,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    155, 154,  26, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 201, 200, \n     72, 185,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 210, 209, 209,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    134, 133, 133,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 213, 212, \n    212,  57,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 217, 216,  88, 185, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    208, 207, 207,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 171, 170, \n     42,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 145, 144, 144, 184, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    221, 220, 220,  57,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 216, 215, \n    215, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 180, 179, 179,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    243, 242, 114,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 175, 174, \n     46, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 156, 155, 155,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    190, 189, 189, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 151, 150, \n     22,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 248, 247, 247, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    199, 198,  70,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 170, 169, \n    169, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 252, 251, 251,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    218, 217, 217, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 136, 135, \n    135, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 131, 130,   2, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    244, 243, 243, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 158, 157, \n    157,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 173, 172, 172, 185, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    180, 179, 179, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 214, 213, \n    213,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 242, 241, 241, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    191, 190,  62,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 239, 238, \n    110, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 238, 237, 237,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    150, 149, 149, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 197, 196, \n    196, 185,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 209, 208, 208,  56, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    195, 194,  66, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 154, 153, \n    153,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 145, 144, 144,  56, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    196, 195, 195,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 255, 254, \n    126,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 251, 250, 122, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    254, 253, 253,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 139, 138, \n     10,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 225, 224,  96,  56, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    164, 163, 163, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 141, 140, \n    140, 185,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 202, 201, 201,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    129, 128,   0, 183,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165, 164, \n    164,  57,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 176, 175, 175,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    230, 229, 229, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 131, 130, \n      2,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 156, 155, 155, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    203, 202,  74,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 176, 175, \n    175, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 141, 140, 140,  57, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    194, 193, 193, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 137, 136, \n      8, 185,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 203, 202,  74, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    172, 171, 171,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 205, 204, \n    204,  57,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 251, 250, 122,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    245, 244, 244, 185,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 202, 201, \n    201, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 136, 135, 135,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    179, 178,  50, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 220, 219, \n    219,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 132, 131, 131,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    221, 220, 220, 185,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 234, 233, \n    233,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 249, 248, 120, 185, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    163, 162,  34, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 218, 217, \n    217,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 219, 218,  90,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    226, 225, 225, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 142, 141, \n    141, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 232, 231, 231,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    207, 206,  78, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 234, 233, \n    233, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 179, 178,  50,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    130, 129, 129, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 174, 173, \n    173, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 185, 184,  56, 185, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    198, 197, 197, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 173, 172, \n    172,  57,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0, 187, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    175, 174,  46,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 212, 211, \n    211, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 152, 151, 151,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    237, 236, 236,  57,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 229, 228, \n    228, 185,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 201, 200,  72,  57, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    196, 195, 195, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 150, 149, \n    149,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 177, 176, 176,  56, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    248, 247, 247,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 184, 183, \n    183,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 147, 146,  18,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    241, 240, 240,  56,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 166, 165, \n    165,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 151, 150,  22, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    255, 254, 126, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 174, 173, \n    173,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 233, 232, 104,  57, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    199, 198,  70, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 178, 177, \n    177, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 192, 191, 191,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    227, 226,  98,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 189, 188, \n    188, 185,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 143, 142,  14,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    148, 147, 147, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 133, 132, \n    132, 185,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 147, 146,  18, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    238, 237, 237, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 226, 225, \n    225,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 152, 151, 151, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    195, 194,  66,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 206, 205, \n    205,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 241, 240, 240, 184, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    160, 159, 159, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 240, 239, \n    239,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 193, 192, 192,  55, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    252, 251, 251, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 228, 227, \n    227,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 187, 186,  58, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    204, 203, 203,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 224, 223, \n    223, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 162, 161, 161,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    217, 216,  88,  57,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 138, 137, \n    137,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 191, 190,  62, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    214, 213, 213, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 165, 164, \n    164, 185,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 253, 252, 252,  57, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    236, 235, 235, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 247, 246, \n    118,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 181, 180, 180, 185, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    183, 182,  54,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 134, 133, \n    133, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 206, 205, 205, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    193, 192, 192, 183,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 168, 167, \n    167, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 211, 210,  82,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    235, 234, 106, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 188, 187, \n    187, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 159, 158,  30,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    177, 176, 176, 184,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 239, 238, \n    110,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,  59, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    184, 183, 183, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 167, 166, \n     38, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 198, 197, 197,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    215, 214,  86, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 164, 163, \n    163,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 133, 132, 132,  57, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    200, 199, 199,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 148, 147, \n    147,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 189, 188, 188,  57, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    205, 204, 204, 185,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 250, 249, \n    249,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 182, 181, 181,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    146, 145, 145, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 212, 211, \n    211,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 231, 230, 102, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    153, 152,  24,  57,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 142, 141, \n    141,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 225, 224,  96, 184, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    149, 148, 148,  57,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 222, 221, \n    221, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 166, 165, 165, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    135, 134,   6, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 169, 168, \n     40, 185,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 246, 245, 245, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    219, 218,  90, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 167, 166, \n     38,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 129, 128,   0,  55, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    250, 249, 249, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 233, 232, \n    104, 185,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 197, 196, 196,  57, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    228, 227, 227, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 213, 212, \n    212, 185,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 162, 161, 161, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    224, 223, 223,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 247, 246, \n    118, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 215, 214,  86,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    242, 241, 241,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 245, 244, \n    244,  57,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  89,   0,   0,   7, \n     70, 142,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n     88,  24,   0,   7,  70, 126, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  85,  85,   0,   0, \n      0,   0,   0,   0, 100,  32, \n      0,   4,  50,  16,  16,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0, 101,   0,   0,   3, \n    242,  32,  16,   0,   0,   0, \n      0,   0, 104,   0,   0,   2, \n     14,   0,   0,   0,  27,   0, \n      0,   5,  50,   0,  16,   0, \n      0,   0,   0,   0,  70,  16, \n     16,   0,   0,   0,   0,   0, \n     30,   0,   0,  10,  50,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0,  70, 128,  48, 128, \n     65,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  50,   0, \n      0,  17, 194,   0,  16,   0, \n      0,   0,   0,   0, 166, 142, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,  63, \n      0,   0,   0,  63,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0, 191,   0,   0,   0, 191, \n     86,   0,   0,   5,  50,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0,  50,   0,   0,  11, \n    194,   0,  16,   0,   0,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0, 166, 142, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 166,  14,  16,   0, \n      0,   0,   0,   0,  65,   0, \n      0,   5,  50,   0,  16,   0, \n      1,   0,   0,   0, 230,  10, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   8, 194,   0, \n     16,   0,   0,   0,   0,   0, \n    166,  14,  16,   0,   0,   0, \n      0,   0,   6,   4,  16, 128, \n     65,   0,   0,   0,   1,   0, \n      0,   0,  27,   0,   0,   5, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0,  30,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,   4, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,  54,   0,   0,   5, \n     50,   0,  16,   0,   3,   0, \n      0,   0, 230,  10,  16,   0, \n      2,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     45,   0,   0,   8, 114,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  45,   0, \n      0,   8, 114,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  45,   0,   0,   8, \n    114,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,   4, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0, 255, 255, \n    255, 255,  54,   0,   0,   5, \n     50,   0,  16,   0,   6,   0, \n      0,   0, 230,  10,  16,   0, \n      5,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     45,   0,   0,   8, 114,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  45,   0, \n      0,   8, 114,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  10, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,   4,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n    255, 255, 255, 255,   1,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  50,   0,  16,   0, \n      8,   0,   0,   0, 230,  10, \n     16,   0,   7,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  45,   0,   0,   8, \n    114,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     45,   0,   0,   8, 114,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,   4,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     54,   0,   0,   5,  50,   0, \n     16,   0,  10,   0,   0,   0, \n    230,  10,  16,   0,   9,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  45,   0, \n      0,   8, 114,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  45,   0,   0,   8, \n    114,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,   4, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  54,   0,   0,   5, \n     50,   0,  16,   0,  12,   0, \n      0,   0, 230,  10,  16,   0, \n     11,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     45,   0,   0,   8, 114,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  45,   0, \n      0,   8, 114,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  10,  50,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     45,   0,   0,   8, 114,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  56,   0,   0,   7, \n    114,   0,  16,   0,   3,   0, \n      0,   0,  70,   2,  16,   0, \n      3,   0,   0,   0,  70,   2, \n     16,   0,   3,   0,   0,   0, \n     56,   0,   0,   7, 114,   0, \n     16,   0,   6,   0,   0,   0, \n     70,   2,  16,   0,   6,   0, \n      0,   0,  70,   2,  16,   0, \n      6,   0,   0,   0,  56,   0, \n      0,   7, 114,   0,  16,   0, \n      2,   0,   0,   0,  70,   2, \n     16,   0,   2,   0,   0,   0, \n     70,   2,  16,   0,   2,   0, \n      0,   0,  56,   0,   0,   7, \n    114,   0,  16,   0,   4,   0, \n      0,   0,  70,   2,  16,   0, \n      4,   0,   0,   0,  70,   2, \n     16,   0,   4,   0,   0,   0, \n     56,   0,   0,   7, 114,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0,  56,   0, \n      0,   7, 114,   0,  16,   0, \n      8,   0,   0,   0,  70,   2, \n     16,   0,   8,   0,   0,   0, \n     70,   2,  16,   0,   8,   0, \n      0,   0,  56,   0,   0,   7, \n    114,   0,  16,   0,   7,   0, \n      0,   0,  70,   2,  16,   0, \n      7,   0,   0,   0,  70,   2, \n     16,   0,   7,   0,   0,   0, \n     56,   0,   0,   7, 114,   0, \n     16,   0,  10,   0,   0,   0, \n     70,   2,  16,   0,  10,   0, \n      0,   0,  70,   2,  16,   0, \n     10,   0,   0,   0,  56,   0, \n      0,   7, 114,   0,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,  56,   0,   0,   7, \n    114,   0,  16,   0,  11,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n     56,   0,   0,   7, 114,   0, \n     16,   0,   9,   0,   0,   0, \n     70,   2,  16,   0,   9,   0, \n      0,   0,  70,   2,  16,   0, \n      9,   0,   0,   0,  56,   0, \n      0,   7, 114,   0,  16,   0, \n      1,   0,   0,   0,  70,   2, \n     16,   0,   1,   0,   0,   0, \n     70,   2,  16,   0,   1,   0, \n      0,   0,  51,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n     51,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,  51,   0, \n      0,   7, 130,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   5,   0,   0,   0, \n     26,   0,  16,   0,  10,   0, \n      0,   0,  51,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n     52,   0,   0,   7, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      4,   0,   0,   0,  52,   0, \n      0,   7, 130,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,  52,   0,   0,   7, \n    130,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      5,   0,   0,   0,  26,   0, \n     16,   0,  10,   0,   0,   0, \n     52,   0,   0,   7, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,  51,   0, \n      0,   7, 130,   0,  16,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0,  51,   0,   0,   7, \n    130,   0,  16,   0,   3,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   6,   0,   0,   0, \n     51,   0,   0,   7, 130,   0, \n     16,   0,   4,   0,   0,   0, \n     26,   0,  16,   0,   8,   0, \n      0,   0,  26,   0,  16,   0, \n     12,   0,   0,   0,  51,   0, \n      0,   7, 130,   0,  16,   0, \n      3,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n     58,   0,  16,   0,   4,   0, \n      0,   0,  52,   0,   0,   7, \n    130,   0,  16,   0,   4,   0, \n      0,   0,  26,   0,  16,   0, \n      4,   0,   0,   0,  26,   0, \n     16,   0,   5,   0,   0,   0, \n     52,   0,   0,   7, 130,   0, \n     16,   0,   4,   0,   0,   0, \n     58,   0,  16,   0,   4,   0, \n      0,   0,  26,   0,  16,   0, \n      6,   0,   0,   0,  52,   0, \n      0,   7, 130,   0,  16,   0, \n      5,   0,   0,   0,  26,   0, \n     16,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,  12,   0, \n      0,   0,  52,   0,   0,   7, \n    130,   0,  16,   0,   4,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,  58,   0, \n     16,   0,   5,   0,   0,   0, \n     51,   0,   0,   7, 130,   0, \n     16,   0,   5,   0,   0,   0, \n     26,   0,  16,   0,   7,   0, \n      0,   0,  26,   0,  16,   0, \n     10,   0,   0,   0,  51,   0, \n      0,   7, 130,   0,  16,   0, \n      5,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n     58,   0,  16,   0,   5,   0, \n      0,   0,  51,   0,   0,   7, \n    130,   0,  16,   0,   6,   0, \n      0,   0,  26,   0,  16,   0, \n      9,   0,   0,   0,  26,   0, \n     16,   0,  12,   0,   0,   0, \n     51,   0,   0,   7, 130,   0, \n     16,   0,   5,   0,   0,   0, \n     58,   0,  16,   0,   5,   0, \n      0,   0,  58,   0,  16,   0, \n      6,   0,   0,   0,  52,   0, \n      0,   7, 130,   0,  16,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,  10,   0, \n      0,   0,  52,   0,   0,   7, \n    130,   0,  16,   0,   6,   0, \n      0,   0,  26,   0,  16,   0, \n      4,   0,   0,   0,  58,   0, \n     16,   0,   6,   0,   0,   0, \n     52,   0,   0,   7, 130,   0, \n     16,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   9,   0, \n      0,   0,  26,   0,  16,   0, \n     12,   0,   0,   0,  52,   0, \n      0,   7, 130,   0,  16,   0, \n      6,   0,   0,   0,  58,   0, \n     16,   0,   6,   0,   0,   0, \n     58,   0,  16,   0,   7,   0, \n      0,   0,  51,   0,   0,   7, \n    130,   0,  16,   0,   7,   0, \n      0,   0,  26,   0,  16,   0, \n     10,   0,   0,   0,  26,   0, \n     16,   0,  12,   0,   0,   0, \n     51,   0,   0,   7, 130,   0, \n     16,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0,  58,   0,  16,   0, \n      7,   0,   0,   0,  51,   0, \n      0,   7, 130,   0,  16,   0, \n      8,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,  11,   0, \n      0,   0,  51,   0,   0,   7, \n    130,   0,  16,   0,   7,   0, \n      0,   0,  58,   0,  16,   0, \n      7,   0,   0,   0,  58,   0, \n     16,   0,   8,   0,   0,   0, \n     52,   0,   0,   7, 130,   0, \n     16,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,  10,   0, \n      0,   0,  26,   0,  16,   0, \n     12,   0,   0,   0,  52,   0, \n      0,   7, 130,   0,  16,   0, \n      8,   0,   0,   0,  26,   0, \n     16,   0,   5,   0,   0,   0, \n     58,   0,  16,   0,   8,   0, \n      0,   0,  52,   0,   0,   7, \n    130,   0,  16,   0,   9,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,  11,   0,   0,   0, \n     52,   0,   0,   7, 130,   0, \n     16,   0,   8,   0,   0,   0, \n     58,   0,  16,   0,   8,   0, \n      0,   0,  58,   0,  16,   0, \n      9,   0,   0,   0,  30,   0, \n      0,   8, 130,   0,  16,   0, \n      9,   0,   0,   0,  58,   0, \n     16, 128,  65,   0,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0, 187, 126, 240, 126, \n     30,   0,   0,   8, 130,   0, \n     16,   0,  10,   0,   0,   0, \n     58,   0,  16, 128,  65,   0, \n      0,   0,   4,   0,   0,   0, \n      1,  64,   0,   0, 187, 126, \n    240, 126,  30,   0,   0,   8, \n    130,   0,  16,   0,  11,   0, \n      0,   0,  58,   0,  16, 128, \n     65,   0,   0,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n    187, 126, 240, 126,  30,   0, \n      0,   8, 130,   0,  16,   0, \n     12,   0,   0,   0,  58,   0, \n     16, 128,  65,   0,   0,   0, \n      8,   0,   0,   0,   1,  64, \n      0,   0, 187, 126, 240, 126, \n      0,   0,   0,   8,  18,   0, \n     16,   0,  13,   0,   0,   0, \n     58,   0,  16, 128,  65,   0, \n      0,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n    128,  63,  51,   0,   0,   7, \n     18,   0,  16,   0,  13,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,  13,   0,   0,   0, \n     56,  32,   0,   7, 130,   0, \n     16,   0,   9,   0,   0,   0, \n     58,   0,  16,   0,   9,   0, \n      0,   0,  10,   0,  16,   0, \n     13,   0,   0,   0,   0,   0, \n      0,   8,  18,   0,  16,   0, \n     13,   0,   0,   0,  58,   0, \n     16, 128,  65,   0,   0,   0, \n      4,   0,   0,   0,   1,  64, \n      0,   0,   0,   0, 128,  63, \n     51,   0,   0,   7,  18,   0, \n     16,   0,  13,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,  10,   0,  16,   0, \n     13,   0,   0,   0,  56,  32, \n      0,   7, 130,   0,  16,   0, \n     10,   0,   0,   0,  58,   0, \n     16,   0,  10,   0,   0,   0, \n     10,   0,  16,   0,  13,   0, \n      0,   0,   0,   0,   0,   8, \n     18,   0,  16,   0,  13,   0, \n      0,   0,  58,   0,  16, 128, \n     65,   0,   0,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0, 128,  63,  51,   0, \n      0,   7,  18,   0,  16,   0, \n     13,   0,   0,   0,  58,   0, \n     16,   0,   5,   0,   0,   0, \n     10,   0,  16,   0,  13,   0, \n      0,   0,  56,  32,   0,   7, \n    130,   0,  16,   0,  11,   0, \n      0,   0,  58,   0,  16,   0, \n     11,   0,   0,   0,  10,   0, \n     16,   0,  13,   0,   0,   0, \n      0,   0,   0,   8,  18,   0, \n     16,   0,  13,   0,   0,   0, \n     58,   0,  16, 128,  65,   0, \n      0,   0,   8,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n    128,  63,  51,   0,   0,   7, \n     18,   0,  16,   0,  13,   0, \n      0,   0,  58,   0,  16,   0, \n      7,   0,   0,   0,  10,   0, \n     16,   0,  13,   0,   0,   0, \n     56,  32,   0,   7, 130,   0, \n     16,   0,  12,   0,   0,   0, \n     58,   0,  16,   0,  12,   0, \n      0,   0,  10,   0,  16,   0, \n     13,   0,   0,   0,  85,   0, \n      0,   7, 130,   0,  16,   0, \n      9,   0,   0,   0,  58,   0, \n     16,   0,   9,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n    130,   0,  16,   0,   9,   0, \n      0,   0,  58,   0,  16,   0, \n      9,   0,   0,   0,   1,  64, \n      0,   0,  57,  70, 188,  31, \n     85,   0,   0,   7, 130,   0, \n     16,   0,  10,   0,   0,   0, \n     58,   0,  16,   0,  10,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7, 130,   0,  16,   0, \n     10,   0,   0,   0,  58,   0, \n     16,   0,  10,   0,   0,   0, \n      1,  64,   0,   0,  57,  70, \n    188,  31,  85,   0,   0,   7, \n    130,   0,  16,   0,  11,   0, \n      0,   0,  58,   0,  16,   0, \n     11,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     30,   0,   0,   7, 130,   0, \n     16,   0,  11,   0,   0,   0, \n     58,   0,  16,   0,  11,   0, \n      0,   0,   1,  64,   0,   0, \n     57,  70, 188,  31,  85,   0, \n      0,   7, 130,   0,  16,   0, \n     12,   0,   0,   0,  58,   0, \n     16,   0,  12,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n    130,   0,  16,   0,  12,   0, \n      0,   0,  58,   0,  16,   0, \n     12,   0,   0,   0,   1,  64, \n      0,   0,  57,  70, 188,  31, \n     56,   0,   0,   9, 130,   0, \n     16,   0,   9,   0,   0,   0, \n     58,   0,  16,   0,   9,   0, \n      0,   0,  10, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     56,   0,   0,   9, 130,   0, \n     16,   0,  10,   0,   0,   0, \n     58,   0,  16,   0,  10,   0, \n      0,   0,  10, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     56,   0,   0,   9, 130,   0, \n     16,   0,  11,   0,   0,   0, \n     58,   0,  16,   0,  11,   0, \n      0,   0,  10, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     56,   0,   0,   9, 130,   0, \n     16,   0,  12,   0,   0,   0, \n     58,   0,  16,   0,  12,   0, \n      0,   0,  10, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,  11,  50,   0, \n     16,   0,  13,   0,   0,   0, \n    182,  15,  16, 128,  65,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128,  63,   0,   0, 128,  63, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  56,   0,   0,   7, \n     66,   0,  16,   0,  13,   0, \n      0,   0,  10,   0,  16,   0, \n     13,   0,   0,   0,  26,   0, \n     16,   0,  13,   0,   0,   0, \n     56,   0,   0,   7,  50,   0, \n     16,   0,  13,   0,   0,   0, \n    230,  10,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n     13,   0,   0,   0,  56,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   8, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16, 128, \n     65,   0,   0,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  61,  30,   0,   0,   8, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16, 128, \n     65,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n    187, 126, 240, 126,  56,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,  13,   0, \n      0,   0,   0,   0,   0,   8, \n    130,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16, 128, \n     65,   0,   0,   0,   3,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   7, 130,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  61,  30,   0,   0,   8, \n    130,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16, 128, \n     65,   0,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n    187, 126, 240, 126,  56,   0, \n      0,   7, 130,   0,  16,   0, \n      3,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,  13,   0, \n      0,   0,   0,   0,   0,   8, \n    130,   0,  16,   0,   4,   0, \n      0,   0,  58,   0,  16, 128, \n     65,   0,   0,   0,   5,   0, \n      0,   0,  58,   0,  16,   0, \n      6,   0,   0,   0,   0,   0, \n      0,   7, 130,   0,  16,   0, \n      4,   0,   0,   0,  58,   0, \n     16,   0,   4,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  61,  30,   0,   0,   8, \n    130,   0,  16,   0,   4,   0, \n      0,   0,  58,   0,  16, 128, \n     65,   0,   0,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n    187, 126, 240, 126,  56,   0, \n      0,   7, 130,   0,  16,   0, \n      5,   0,   0,   0,  58,   0, \n     16,   0,   4,   0,   0,   0, \n     26,   0,  16,   0,  13,   0, \n      0,   0,   0,   0,   0,   8, \n    130,   0,  16,   0,   6,   0, \n      0,   0,  58,   0,  16, 128, \n     65,   0,   0,   0,   7,   0, \n      0,   0,  58,   0,  16,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   7, 130,   0,  16,   0, \n      6,   0,   0,   0,  58,   0, \n     16,   0,   6,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  61,  30,   0,   0,   8, \n    130,   0,  16,   0,   6,   0, \n      0,   0,  58,   0,  16, 128, \n     65,   0,   0,   0,   6,   0, \n      0,   0,   1,  64,   0,   0, \n    187, 126, 240, 126,  56,   0, \n      0,   7, 130,   0,  16,   0, \n      7,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   6,   0, \n      0,   0,  56,   0,   0,   7, \n    130,   0,  16,   0,   8,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   9,   0,   0,   0, \n     56,   0,   0,   7, 130,   0, \n     16,   0,  13,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,  58,   0,  16,   0, \n     10,   0,   0,   0,  56,   0, \n      0,   7, 130,   0,  16,   0, \n      5,   0,   0,   0,  58,   0, \n     16,   0,   5,   0,   0,   0, \n     58,   0,  16,   0,  11,   0, \n      0,   0,  50,   0,   0,   9, \n    130,   0,  16,   0,   3,   0, \n      0,   0,  58,   0,  16,   0, \n     10,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n     58,   0,  16,   0,   5,   0, \n      0,   0,  50,   0,   0,   9, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n     13,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,  56,   0,   0,   7, \n    130,   0,  16,   0,   7,   0, \n      0,   0,  58,   0,  16,   0, \n      7,   0,   0,   0,  58,   0, \n     16,   0,  12,   0,   0,   0, \n     50,   0,   0,   9, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   9,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   7,   0,   0,   0, \n     50,   0,   0,   9, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     10,   0,  16,   0,  13,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     50,   0,   0,   9, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,  13,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     50,   0,   0,   9,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      6,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n      0,   0,   0,   7, 130,   0, \n     16,   0,   3,   0,   0,   0, \n     58,   0,  16,   0,  13,   0, \n      0,   0,  58,   0,  16,   0, \n     13,   0,   0,   0,  50,   0, \n      0,   9, 130,   0,  16,   0, \n      3,   0,   0,   0,  58,   0, \n     16,   0,   8,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  64,  58,   0,  16,   0, \n      3,   0,   0,   0,  50,   0, \n      0,   9, 130,   0,  16,   0, \n      3,   0,   0,   0,  58,   0, \n     16,   0,   5,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  64,  58,   0,  16,   0, \n      3,   0,   0,   0,  50,   0, \n      0,   9, 130,   0,  16,   0, \n      3,   0,   0,   0,  58,   0, \n     16,   0,   7,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  64,  58,   0,  16,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   7, 130,   0,  16,   0, \n      3,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,   0,   0,   0,   7, \n    130,   0,  16,   0,   3,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n      0,   0,   0,   7, 130,   0, \n     16,   0,   3,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   7, 130,   0,  16,   0, \n      3,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,  30,   0,   0,   8, \n    130,   0,  16,   0,   4,   0, \n      0,   0,  58,   0,  16, 128, \n     65,   0,   0,   0,   3,   0, \n      0,   0,   1,  64,   0,   0, \n    255, 159, 241, 126,  50,   0, \n      0,  10, 130,   0,  16,   0, \n      3,   0,   0,   0,  58,   0, \n     16, 128,  65,   0,   0,   0, \n      4,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  64,  56,   0,   0,   7, \n    130,   0,  16,   0,   3,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,  58,   0, \n     16,   0,   4,   0,   0,   0, \n     56,   0,   0,   7, 114,   0, \n     16,   0,   2,   0,   0,   0, \n     70,   2,  16,   0,   2,   0, \n      0,   0, 246,  15,  16,   0, \n      8,   0,   0,   0,  50,   0, \n      0,   9, 114,   0,  16,   0, \n      2,   0,   0,   0,  70,   2, \n     16,   0,   3,   0,   0,   0, \n    246,  15,  16,   0,   8,   0, \n      0,   0,  70,   2,  16,   0, \n      2,   0,   0,   0,  50,   0, \n      0,   9, 114,   0,  16,   0, \n      2,   0,   0,   0,  70,   2, \n     16,   0,   6,   0,   0,   0, \n    246,  15,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n      2,   0,   0,   0,  50,   0, \n      0,   9, 114,   0,  16,   0, \n      2,   0,   0,   0,  70,   2, \n     16,   0,   8,   0,   0,   0, \n    246,  15,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n      2,   0,   0,   0,  50,   0, \n      0,   9, 114,   0,  16,   0, \n      2,   0,   0,   0,  70,   2, \n     16,   0,   7,   0,   0,   0, \n    246,  15,  16,   0,   5,   0, \n      0,   0,  70,   2,  16,   0, \n      2,   0,   0,   0,  50,   0, \n      0,   9, 114,   0,  16,   0, \n      2,   0,   0,   0,  70,   2, \n     16,   0,   9,   0,   0,   0, \n    246,  15,  16,   0,   5,   0, \n      0,   0,  70,   2,  16,   0, \n      2,   0,   0,   0,  50,   0, \n      0,   9, 114,   0,  16,   0, \n      2,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n    246,  15,  16,   0,   7,   0, \n      0,   0,  70,   2,  16,   0, \n      2,   0,   0,   0,  50,   0, \n      0,   9, 114,   0,  16,   0, \n      1,   0,   0,   0,  70,   2, \n     16,   0,   1,   0,   0,   0, \n    246,  15,  16,   0,   7,   0, \n      0,   0,  70,   2,  16,   0, \n      2,   0,   0,   0,  50,   0, \n      0,   9, 114,   0,  16,   0, \n      1,   0,   0,   0,  70,   2, \n     16,   0,   4,   0,   0,   0, \n    246,  15,  16,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n      1,   0,   0,   0,  50,   0, \n      0,   9, 114,   0,  16,   0, \n      1,   0,   0,   0,  70,   2, \n     16,   0,   5,   0,   0,   0, \n    246,  15,  16,   0,   2,   0, \n      0,   0,  70,   2,  16,   0, \n      1,   0,   0,   0,  50,   0, \n      0,   9, 114,   0,  16,   0, \n      1,   0,   0,   0,  70,   2, \n     16,   0,  10,   0,   0,   0, \n    246,  15,  16,   0,   1,   0, \n      0,   0,  70,   2,  16,   0, \n      1,   0,   0,   0,  50,   0, \n      0,   9, 114,   0,  16,   0, \n      1,   0,   0,   0,  70,   2, \n     16,   0,  12,   0,   0,   0, \n    166,  10,  16,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n      1,   0,   0,   0,  56,  32, \n      0,   7, 114,   0,  16,   0, \n      1,   0,   0,   0, 246,  15, \n     16,   0,   3,   0,   0,   0, \n     70,   2,  16,   0,   1,   0, \n      0,   0,  75,   0,   0,   5, \n    114,   0,  16,   0,   1,   0, \n      0,   0,  70,   2,  16,   0, \n      1,   0,   0,   0, 140,   0, \n      0,  11,  34,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   4,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,  11,  18,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   0,  32,   0,   8, \n    114,  32,  16,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n      1,   0,   0,   0,   6, 144, \n    144,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5, 130,  32,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0, 128,  63, \n     62,   0,   0,   1,  83,  84, \n     65,  84, 148,   0,   0,   0, \n    175,   0,   0,   0,  14,   0, \n      0,   0,   0,   1,   0,   0, \n      2,   0,   0,   0, 115,   0, \n      0,   0,  20,   0,   0,   0, \n      4,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     12,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  18,   0, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/ui/shaders/bytecode/d3d12_5_1/guest_output_ffx_cas_resample_ps.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   int2 xe_cas_output_offset;         // Offset:    0 Size:     8\n//   float2 xe_cas_input_output_size_ratio;// Offset:    8 Size:     8\n//   float xe_cas_sharpness_post_setup; // Offset:   16 Size:     4\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_cas_source                     texture  float4          2d      T0             t0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// SV_Position              0   xyzw        0      POS   float   xy  \n//\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// SV_Target                0   xyzw        0   TARGET   float   xyzw\n//\nps_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][2], immediateIndexed, space=0\ndcl_resource_texture2d (float,float,float,float) T0[0:0], space=0\ndcl_input_ps_siv linear noperspective v0.xy, position\ndcl_output o0.xyzw\ndcl_temps 14\nftoi r0.xy, v0.xyxx\niadd r0.xy, r0.xyxx, -CB0[0][0].xyxx\nmad r0.zw, CB0[0][0].zzzw, l(0.000000, 0.000000, 0.500000, 0.500000), l(0.000000, 0.000000, -0.500000, -0.500000)\nutof r0.xy, r0.xyxx\nmad r0.xy, r0.xyxx, CB0[0][0].zwzz, r0.zwzz\nround_ni r0.zw, r0.xxxy\nadd r0.xy, -r0.zwzz, r0.xyxx\nftoi r1.xy, r0.zwzz\niadd r2.xyzw, r1.xyxy, l(-1, 0, 0, -1)\nmov r3.xy, r2.zwzz\nmov r3.zw, l(0,0,0,0)\nld r3.xyz, r3.xyzw, T0[0].xyzw\nmov r2.zw, l(0,0,0,0)\nld r2.xyz, r2.xyzw, T0[0].xyzw\nmov r1.zw, l(0,0,0,0)\nld r4.xyz, r1.xyzw, T0[0].xyzw\niadd r5.xyzw, r1.xyxy, l(1, 0, 1, -1)\nmov r6.xy, r5.zwzz\nmov r6.zw, l(0,0,0,0)\nld r6.xyz, r6.xyzw, T0[0].xyzw\nmov r5.zw, l(0,0,0,0)\nld r5.xyz, r5.xyzw, T0[0].xyzw\niadd r7.xyzw, r1.xyxy, l(-1, 1, 2, 0)\nmov r8.xy, r7.zwzz\nmov r8.zw, l(0,0,0,0)\nld r8.xyz, r8.xyzw, T0[0].xyzw\nmov r7.zw, l(0,0,0,0)\nld r7.xyz, r7.xyzw, T0[0].xyzw\niadd r9.xyzw, r1.xyxy, l(0, 2, 0, 1)\nmov r10.xy, r9.zwzz\nmov r10.zw, l(0,0,0,0)\nld r10.xyz, r10.xyzw, T0[0].xyzw\nmov r9.zw, l(0,0,0,0)\nld r9.xyz, r9.xyzw, T0[0].xyzw\niadd r11.xyzw, r1.xyxy, l(2, 1, 1, 1)\nmov r12.xy, r11.zwzz\nmov r12.zw, l(0,0,0,0)\nld r12.xyz, r12.xyzw, T0[0].xyzw\nmov r11.zw, l(0,0,0,0)\nld r11.xyz, r11.xyzw, T0[0].xyzw\niadd r1.xy, r1.xyxx, l(1, 2, 0, 0)\nmov r1.zw, l(0,0,0,0)\nld r1.xyz, r1.xyzw, T0[0].xyzw\nmul r3.xyz, r3.xyzx, r3.xyzx\nmul r6.xyz, r6.xyzx, r6.xyzx\nmul r2.xyz, r2.xyzx, r2.xyzx\nmul r4.xyz, r4.xyzx, r4.xyzx\nmul r5.xyz, r5.xyzx, r5.xyzx\nmul r8.xyz, r8.xyzx, r8.xyzx\nmul r7.xyz, r7.xyzx, r7.xyzx\nmul r10.xyz, r10.xyzx, r10.xyzx\nmul r12.xyz, r12.xyzx, r12.xyzx\nmul r11.xyz, r11.xyzx, r11.xyzx\nmul r9.xyz, r9.xyzx, r9.xyzx\nmul r1.xyz, r1.xyzx, r1.xyzx\nmin r0.z, r2.y, r4.y\nmin r0.z, r0.z, r3.y\nmin r0.w, r5.y, r10.y\nmin r0.z, r0.w, r0.z\nmax r0.w, r2.y, r4.y\nmax r0.w, r0.w, r3.y\nmax r1.w, r5.y, r10.y\nmax r0.w, r0.w, r1.w\nmin r1.w, r4.y, r5.y\nmin r1.w, r1.w, r6.y\nmin r2.w, r8.y, r12.y\nmin r1.w, r1.w, r2.w\nmax r2.w, r4.y, r5.y\nmax r2.w, r2.w, r6.y\nmax r3.w, r8.y, r12.y\nmax r2.w, r2.w, r3.w\nmin r3.w, r7.y, r10.y\nmin r3.w, r3.w, r4.y\nmin r4.w, r9.y, r12.y\nmin r3.w, r3.w, r4.w\nmax r4.w, r7.y, r10.y\nmax r4.w, r4.w, r4.y\nmax r5.w, r9.y, r12.y\nmax r4.w, r4.w, r5.w\nmin r5.w, r10.y, r12.y\nmin r5.w, r5.w, r5.y\nmin r6.w, r1.y, r11.y\nmin r5.w, r5.w, r6.w\nmax r6.w, r10.y, r12.y\nmax r6.w, r5.y, r6.w\nmax r7.w, r1.y, r11.y\nmax r6.w, r6.w, r7.w\niadd r7.w, -r0.w, l(0x7ef07ebb)\niadd r8.w, -r2.w, l(0x7ef07ebb)\niadd r9.w, -r4.w, l(0x7ef07ebb)\niadd r10.w, -r6.w, l(0x7ef07ebb)\nadd r11.w, -r0.w, l(1.000000)\nmin r11.w, r0.z, r11.w\nmul_sat r7.w, r7.w, r11.w\nadd r11.w, -r2.w, l(1.000000)\nmin r11.w, r1.w, r11.w\nmul_sat r8.w, r8.w, r11.w\nadd r11.w, -r4.w, l(1.000000)\nmin r11.w, r3.w, r11.w\nmul_sat r9.w, r9.w, r11.w\nadd r11.w, -r6.w, l(1.000000)\nmin r11.w, r5.w, r11.w\nmul_sat r10.w, r10.w, r11.w\nushr r7.w, r7.w, l(1)\niadd r7.w, r7.w, l(0x1fbc4639)\nushr r8.w, r8.w, l(1)\niadd r8.w, r8.w, l(0x1fbc4639)\nushr r9.w, r9.w, l(1)\niadd r9.w, r9.w, l(0x1fbc4639)\nushr r10.w, r10.w, l(1)\niadd r10.w, r10.w, l(0x1fbc4639)\nmul r7.w, r7.w, CB0[0][1].x\nmul r8.w, r8.w, CB0[0][1].x\nmul r9.w, r9.w, CB0[0][1].x\nmul r10.w, r10.w, CB0[0][1].x\nadd r13.xy, -r0.yxyy, l(1.000000, 1.000000, 0.000000, 0.000000)\nmul r11.w, r13.x, r13.y\nmul r13.xy, r0.xyxx, r13.xyxx\nmul r0.x, r0.y, r0.x\nadd r0.y, -r0.z, r0.w\nadd r0.y, r0.y, l(0.031250)\niadd r0.y, -r0.y, l(0x7ef07ebb)\nmul r0.z, r0.y, r11.w\nadd r0.w, -r1.w, r2.w\nadd r0.w, r0.w, l(0.031250)\niadd r0.w, -r0.w, l(0x7ef07ebb)\nmul r1.w, r0.w, r13.x\nadd r2.w, -r3.w, r4.w\nadd r2.w, r2.w, l(0.031250)\niadd r2.w, -r2.w, l(0x7ef07ebb)\nmul r3.w, r2.w, r13.y\nadd r4.w, -r5.w, r6.w\nadd r4.w, r4.w, l(0.031250)\niadd r4.w, -r4.w, l(0x7ef07ebb)\nmul r5.w, r0.x, r4.w\nmul r6.w, r0.z, r7.w\nmul r12.w, r1.w, r8.w\nmul r3.w, r3.w, r9.w\nmad r1.w, r8.w, r1.w, r3.w\nmad r0.y, r11.w, r0.y, r1.w\nmul r5.w, r5.w, r10.w\nmad r0.z, r7.w, r0.z, r5.w\nmad r0.w, r13.x, r0.w, r0.z\nmad r0.z, r13.y, r2.w, r0.z\nmad r0.x, r0.x, r4.w, r1.w\nadd r1.w, r12.w, r12.w\nmad r1.w, r6.w, l(2.000000), r1.w\nmad r1.w, r3.w, l(2.000000), r1.w\nmad r1.w, r5.w, l(2.000000), r1.w\nadd r1.w, r0.y, r1.w\nadd r1.w, r0.w, r1.w\nadd r1.w, r0.z, r1.w\nadd r1.w, r0.x, r1.w\niadd r2.w, -r1.w, l(0x7ef19fff)\nmad r1.w, -r2.w, r1.w, l(2.000000)\nmul r1.w, r1.w, r2.w\nmul r2.xyz, r2.xyzx, r6.wwww\nmad r2.xyz, r3.xyzx, r6.wwww, r2.xyzx\nmad r2.xyz, r6.xyzx, r12.wwww, r2.xyzx\nmad r2.xyz, r8.xyzx, r12.wwww, r2.xyzx\nmad r2.xyz, r7.xyzx, r3.wwww, r2.xyzx\nmad r2.xyz, r9.xyzx, r3.wwww, r2.xyzx\nmad r2.xyz, r11.xyzx, r5.wwww, r2.xyzx\nmad r1.xyz, r1.xyzx, r5.wwww, r2.xyzx\nmad r1.xyz, r4.xyzx, r0.yyyy, r1.xyzx\nmad r1.xyz, r5.xyzx, r0.wwww, r1.xyzx\nmad r0.yzw, r10.xxyz, r0.zzzz, r1.xxyz\nmad r0.xyz, r12.xyzx, r0.xxxx, r0.yzwy\nmul_sat r0.xyz, r1.wwww, r0.xyzx\nsqrt o0.xyz, r0.xyzx\nmov o0.w, l(1.000000)\nret \n// Approximately 172 instruction slots used\n#endif\n\nconst BYTE guest_output_ffx_cas_resample_ps[] =\n{\n     68,  88,  66,  67,  84,  78, \n    130,   0, 246, 156,  95,  10, \n    227,  64, 193, 189, 212,  26, \n    149,  36,   1,   0,   0,   0, \n     88,  24,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n    116,   2,   0,   0, 168,   2, \n      0,   0, 220,   2,   0,   0, \n    188,  23,   0,   0,  82,  68, \n     69,  70,  56,   2,   0,   0, \n      1,   0,   0,   0, 172,   0, \n      0,   0,   2,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n    255, 255,   0,   5,   0,   0, \n     16,   2,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,   0,   2,   0, \n      0,   0,   5,   0,   0,   0, \n      4,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n      1,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 154,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 120, 101,  95,  99, \n     97, 115,  95, 115, 111, 117, \n    114,  99, 101,   0, 112, 117, \n    115, 104,  95,  99, 111, 110, \n    115, 116, 115,  95, 120, 101, \n      0, 171, 171, 171, 154,   0, \n      0,   0,   3,   0,   0,   0, \n    196,   0,   0,   0,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  60,   1, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,   2,   0, \n      0,   0,  88,   1,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 124,   1,   0,   0, \n      8,   0,   0,   0,   8,   0, \n      0,   0,   2,   0,   0,   0, \n    164,   1,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    200,   1,   0,   0,  16,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 236,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 120, 101, \n     95,  99,  97, 115,  95, 111, \n    117, 116, 112, 117, 116,  95, \n    111, 102, 102, 115, 101, 116, \n      0, 105, 110, 116,  50,   0, \n    171, 171,   1,   0,   2,   0, \n      1,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  81,   1, \n      0,   0, 120, 101,  95,  99, \n     97, 115,  95, 105, 110, 112, \n    117, 116,  95, 111, 117, 116, \n    112, 117, 116,  95, 115, 105, \n    122, 101,  95, 114,  97, 116, \n    105, 111,   0, 102, 108, 111, \n     97, 116,  50,   0, 171, 171, \n      1,   0,   3,   0,   1,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 155,   1,   0,   0, \n    120, 101,  95,  99,  97, 115, \n     95, 115, 104,  97, 114, 112, \n    110, 101, 115, 115,  95, 112, \n    111, 115, 116,  95, 115, 101, \n    116, 117, 112,   0, 102, 108, \n    111,  97, 116,   0, 171, 171, \n      0,   0,   3,   0,   1,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 228,   1,   0,   0, \n     77, 105,  99, 114, 111, 115, \n    111, 102, 116,  32,  40,  82, \n     41,  32,  72,  76,  83,  76, \n     32,  83, 104,  97, 100, 101, \n    114,  32,  67, 111, 109, 112, \n    105, 108, 101, 114,  32,  49, \n     48,  46,  49,   0,  73,  83, \n     71,  78,  44,   0,   0,   0, \n      1,   0,   0,   0,   8,   0, \n      0,   0,  32,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,  15,   3, \n      0,   0,  83,  86,  95,  80, \n    111, 115, 105, 116, 105, 111, \n    110,   0,  79,  83,  71,  78, \n     44,   0,   0,   0,   1,   0, \n      0,   0,   8,   0,   0,   0, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,  15,   0,   0,   0, \n     83,  86,  95,  84,  97, 114, \n    103, 101, 116,   0, 171, 171, \n     83,  72,  69,  88, 216,  20, \n      0,   0,  81,   0,   0,   0, \n     54,   5,   0,   0, 106,   8, \n      0,   1,  89,   0,   0,   7, \n     70, 142,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n     88,  24,   0,   7,  70, 126, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  85,  85,   0,   0, \n      0,   0,   0,   0, 100,  32, \n      0,   4,  50,  16,  16,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0, 101,   0,   0,   3, \n    242,  32,  16,   0,   0,   0, \n      0,   0, 104,   0,   0,   2, \n     14,   0,   0,   0,  27,   0, \n      0,   5,  50,   0,  16,   0, \n      0,   0,   0,   0,  70,  16, \n     16,   0,   0,   0,   0,   0, \n     30,   0,   0,  10,  50,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0,  70, 128,  48, 128, \n     65,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  50,   0, \n      0,  17, 194,   0,  16,   0, \n      0,   0,   0,   0, 166, 142, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,  63, \n      0,   0,   0,  63,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0, 191,   0,   0,   0, 191, \n     86,   0,   0,   5,  50,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0,  50,   0,   0,  11, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      0,   0,   0,   0, 230, 138, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 230,  10,  16,   0, \n      0,   0,   0,   0,  65,   0, \n      0,   5, 194,   0,  16,   0, \n      0,   0,   0,   0,   6,   4, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   8,  50,   0, \n     16,   0,   0,   0,   0,   0, \n    230,  10,  16, 128,  65,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0,  27,   0,   0,   5, \n     50,   0,  16,   0,   1,   0, \n      0,   0, 230,  10,  16,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  10, 242,   0,  16,   0, \n      2,   0,   0,   0,  70,   4, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,  54,   0,   0,   5, \n     50,   0,  16,   0,   3,   0, \n      0,   0, 230,  10,  16,   0, \n      2,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      3,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     45,   0,   0,   8, 114,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   3,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  45,   0, \n      0,   8, 114,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  45,   0,   0,   8, \n    114,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  10, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,   4, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0, 255, 255, \n    255, 255,  54,   0,   0,   5, \n     50,   0,  16,   0,   6,   0, \n      0,   0, 230,  10,  16,   0, \n      5,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     45,   0,   0,   8, 114,   0, \n     16,   0,   6,   0,   0,   0, \n     70,  14,  16,   0,   6,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  45,   0, \n      0,   8, 114,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  10, 242,   0, \n     16,   0,   7,   0,   0,   0, \n     70,   4,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n    255, 255, 255, 255,   1,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5,  50,   0,  16,   0, \n      8,   0,   0,   0, 230,  10, \n     16,   0,   7,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  45,   0,   0,   8, \n    114,   0,  16,   0,   8,   0, \n      0,   0,  70,  14,  16,   0, \n      8,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     45,   0,   0,   8, 114,   0, \n     16,   0,   7,   0,   0,   0, \n     70,  14,  16,   0,   7,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    242,   0,  16,   0,   9,   0, \n      0,   0,  70,   4,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     54,   0,   0,   5,  50,   0, \n     16,   0,  10,   0,   0,   0, \n    230,  10,  16,   0,   9,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  10,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  45,   0, \n      0,   8, 114,   0,  16,   0, \n     10,   0,   0,   0,  70,  14, \n     16,   0,  10,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,   9,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  45,   0,   0,   8, \n    114,   0,  16,   0,   9,   0, \n      0,   0,  70,  14,  16,   0, \n      9,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  10, 242,   0,  16,   0, \n     11,   0,   0,   0,  70,   4, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,  54,   0,   0,   5, \n     50,   0,  16,   0,  12,   0, \n      0,   0, 230,  10,  16,   0, \n     11,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n     12,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     45,   0,   0,   8, 114,   0, \n     16,   0,  12,   0,   0,   0, \n     70,  14,  16,   0,  12,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,  11,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  45,   0, \n      0,   8, 114,   0,  16,   0, \n     11,   0,   0,   0,  70,  14, \n     16,   0,  11,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     30,   0,   0,  10,  50,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,   2,  64,   0,   0, \n      1,   0,   0,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     45,   0,   0,   8, 114,   0, \n     16,   0,   1,   0,   0,   0, \n     70,  14,  16,   0,   1,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  56,   0,   0,   7, \n    114,   0,  16,   0,   3,   0, \n      0,   0,  70,   2,  16,   0, \n      3,   0,   0,   0,  70,   2, \n     16,   0,   3,   0,   0,   0, \n     56,   0,   0,   7, 114,   0, \n     16,   0,   6,   0,   0,   0, \n     70,   2,  16,   0,   6,   0, \n      0,   0,  70,   2,  16,   0, \n      6,   0,   0,   0,  56,   0, \n      0,   7, 114,   0,  16,   0, \n      2,   0,   0,   0,  70,   2, \n     16,   0,   2,   0,   0,   0, \n     70,   2,  16,   0,   2,   0, \n      0,   0,  56,   0,   0,   7, \n    114,   0,  16,   0,   4,   0, \n      0,   0,  70,   2,  16,   0, \n      4,   0,   0,   0,  70,   2, \n     16,   0,   4,   0,   0,   0, \n     56,   0,   0,   7, 114,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0,  56,   0, \n      0,   7, 114,   0,  16,   0, \n      8,   0,   0,   0,  70,   2, \n     16,   0,   8,   0,   0,   0, \n     70,   2,  16,   0,   8,   0, \n      0,   0,  56,   0,   0,   7, \n    114,   0,  16,   0,   7,   0, \n      0,   0,  70,   2,  16,   0, \n      7,   0,   0,   0,  70,   2, \n     16,   0,   7,   0,   0,   0, \n     56,   0,   0,   7, 114,   0, \n     16,   0,  10,   0,   0,   0, \n     70,   2,  16,   0,  10,   0, \n      0,   0,  70,   2,  16,   0, \n     10,   0,   0,   0,  56,   0, \n      0,   7, 114,   0,  16,   0, \n     12,   0,   0,   0,  70,   2, \n     16,   0,  12,   0,   0,   0, \n     70,   2,  16,   0,  12,   0, \n      0,   0,  56,   0,   0,   7, \n    114,   0,  16,   0,  11,   0, \n      0,   0,  70,   2,  16,   0, \n     11,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n     56,   0,   0,   7, 114,   0, \n     16,   0,   9,   0,   0,   0, \n     70,   2,  16,   0,   9,   0, \n      0,   0,  70,   2,  16,   0, \n      9,   0,   0,   0,  56,   0, \n      0,   7, 114,   0,  16,   0, \n      1,   0,   0,   0,  70,   2, \n     16,   0,   1,   0,   0,   0, \n     70,   2,  16,   0,   1,   0, \n      0,   0,  51,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n     51,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,  51,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   5,   0,   0,   0, \n     26,   0,  16,   0,  10,   0, \n      0,   0,  51,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     52,   0,   0,   7, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      4,   0,   0,   0,  52,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,  52,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      5,   0,   0,   0,  26,   0, \n     16,   0,  10,   0,   0,   0, \n     52,   0,   0,   7, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  51,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0,  51,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   6,   0,   0,   0, \n     51,   0,   0,   7, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   8,   0, \n      0,   0,  26,   0,  16,   0, \n     12,   0,   0,   0,  51,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  52,   0,   0,   7, \n    130,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      4,   0,   0,   0,  26,   0, \n     16,   0,   5,   0,   0,   0, \n     52,   0,   0,   7, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      6,   0,   0,   0,  52,   0, \n      0,   7, 130,   0,  16,   0, \n      3,   0,   0,   0,  26,   0, \n     16,   0,   8,   0,   0,   0, \n     26,   0,  16,   0,  12,   0, \n      0,   0,  52,   0,   0,   7, \n    130,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n     51,   0,   0,   7, 130,   0, \n     16,   0,   3,   0,   0,   0, \n     26,   0,  16,   0,   7,   0, \n      0,   0,  26,   0,  16,   0, \n     10,   0,   0,   0,  51,   0, \n      0,   7, 130,   0,  16,   0, \n      3,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0,  51,   0,   0,   7, \n    130,   0,  16,   0,   4,   0, \n      0,   0,  26,   0,  16,   0, \n      9,   0,   0,   0,  26,   0, \n     16,   0,  12,   0,   0,   0, \n     51,   0,   0,   7, 130,   0, \n     16,   0,   3,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,  52,   0, \n      0,   7, 130,   0,  16,   0, \n      4,   0,   0,   0,  26,   0, \n     16,   0,   7,   0,   0,   0, \n     26,   0,  16,   0,  10,   0, \n      0,   0,  52,   0,   0,   7, \n    130,   0,  16,   0,   4,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n     52,   0,   0,   7, 130,   0, \n     16,   0,   5,   0,   0,   0, \n     26,   0,  16,   0,   9,   0, \n      0,   0,  26,   0,  16,   0, \n     12,   0,   0,   0,  52,   0, \n      0,   7, 130,   0,  16,   0, \n      4,   0,   0,   0,  58,   0, \n     16,   0,   4,   0,   0,   0, \n     58,   0,  16,   0,   5,   0, \n      0,   0,  51,   0,   0,   7, \n    130,   0,  16,   0,   5,   0, \n      0,   0,  26,   0,  16,   0, \n     10,   0,   0,   0,  26,   0, \n     16,   0,  12,   0,   0,   0, \n     51,   0,   0,   7, 130,   0, \n     16,   0,   5,   0,   0,   0, \n     58,   0,  16,   0,   5,   0, \n      0,   0,  26,   0,  16,   0, \n      5,   0,   0,   0,  51,   0, \n      0,   7, 130,   0,  16,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,  11,   0, \n      0,   0,  51,   0,   0,   7, \n    130,   0,  16,   0,   5,   0, \n      0,   0,  58,   0,  16,   0, \n      5,   0,   0,   0,  58,   0, \n     16,   0,   6,   0,   0,   0, \n     52,   0,   0,   7, 130,   0, \n     16,   0,   6,   0,   0,   0, \n     26,   0,  16,   0,  10,   0, \n      0,   0,  26,   0,  16,   0, \n     12,   0,   0,   0,  52,   0, \n      0,   7, 130,   0,  16,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   5,   0,   0,   0, \n     58,   0,  16,   0,   6,   0, \n      0,   0,  52,   0,   0,   7, \n    130,   0,  16,   0,   7,   0, \n      0,   0,  26,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,  11,   0,   0,   0, \n     52,   0,   0,   7, 130,   0, \n     16,   0,   6,   0,   0,   0, \n     58,   0,  16,   0,   6,   0, \n      0,   0,  58,   0,  16,   0, \n      7,   0,   0,   0,  30,   0, \n      0,   8, 130,   0,  16,   0, \n      7,   0,   0,   0,  58,   0, \n     16, 128,  65,   0,   0,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0, 187, 126, 240, 126, \n     30,   0,   0,   8, 130,   0, \n     16,   0,   8,   0,   0,   0, \n     58,   0,  16, 128,  65,   0, \n      0,   0,   2,   0,   0,   0, \n      1,  64,   0,   0, 187, 126, \n    240, 126,  30,   0,   0,   8, \n    130,   0,  16,   0,   9,   0, \n      0,   0,  58,   0,  16, 128, \n     65,   0,   0,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n    187, 126, 240, 126,  30,   0, \n      0,   8, 130,   0,  16,   0, \n     10,   0,   0,   0,  58,   0, \n     16, 128,  65,   0,   0,   0, \n      6,   0,   0,   0,   1,  64, \n      0,   0, 187, 126, 240, 126, \n      0,   0,   0,   8, 130,   0, \n     16,   0,  11,   0,   0,   0, \n     58,   0,  16, 128,  65,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n    128,  63,  51,   0,   0,   7, \n    130,   0,  16,   0,  11,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,  11,   0,   0,   0, \n     56,  32,   0,   7, 130,   0, \n     16,   0,   7,   0,   0,   0, \n     58,   0,  16,   0,   7,   0, \n      0,   0,  58,   0,  16,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   8, 130,   0,  16,   0, \n     11,   0,   0,   0,  58,   0, \n     16, 128,  65,   0,   0,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   0,   0, 128,  63, \n     51,   0,   0,   7, 130,   0, \n     16,   0,  11,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n     11,   0,   0,   0,  56,  32, \n      0,   7, 130,   0,  16,   0, \n      8,   0,   0,   0,  58,   0, \n     16,   0,   8,   0,   0,   0, \n     58,   0,  16,   0,  11,   0, \n      0,   0,   0,   0,   0,   8, \n    130,   0,  16,   0,  11,   0, \n      0,   0,  58,   0,  16, 128, \n     65,   0,   0,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0, 128,  63,  51,   0, \n      0,   7, 130,   0,  16,   0, \n     11,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n     58,   0,  16,   0,  11,   0, \n      0,   0,  56,  32,   0,   7, \n    130,   0,  16,   0,   9,   0, \n      0,   0,  58,   0,  16,   0, \n      9,   0,   0,   0,  58,   0, \n     16,   0,  11,   0,   0,   0, \n      0,   0,   0,   8, 130,   0, \n     16,   0,  11,   0,   0,   0, \n     58,   0,  16, 128,  65,   0, \n      0,   0,   6,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n    128,  63,  51,   0,   0,   7, \n    130,   0,  16,   0,  11,   0, \n      0,   0,  58,   0,  16,   0, \n      5,   0,   0,   0,  58,   0, \n     16,   0,  11,   0,   0,   0, \n     56,  32,   0,   7, 130,   0, \n     16,   0,  10,   0,   0,   0, \n     58,   0,  16,   0,  10,   0, \n      0,   0,  58,   0,  16,   0, \n     11,   0,   0,   0,  85,   0, \n      0,   7, 130,   0,  16,   0, \n      7,   0,   0,   0,  58,   0, \n     16,   0,   7,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n    130,   0,  16,   0,   7,   0, \n      0,   0,  58,   0,  16,   0, \n      7,   0,   0,   0,   1,  64, \n      0,   0,  57,  70, 188,  31, \n     85,   0,   0,   7, 130,   0, \n     16,   0,   8,   0,   0,   0, \n     58,   0,  16,   0,   8,   0, \n      0,   0,   1,  64,   0,   0, \n      1,   0,   0,   0,  30,   0, \n      0,   7, 130,   0,  16,   0, \n      8,   0,   0,   0,  58,   0, \n     16,   0,   8,   0,   0,   0, \n      1,  64,   0,   0,  57,  70, \n    188,  31,  85,   0,   0,   7, \n    130,   0,  16,   0,   9,   0, \n      0,   0,  58,   0,  16,   0, \n      9,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     30,   0,   0,   7, 130,   0, \n     16,   0,   9,   0,   0,   0, \n     58,   0,  16,   0,   9,   0, \n      0,   0,   1,  64,   0,   0, \n     57,  70, 188,  31,  85,   0, \n      0,   7, 130,   0,  16,   0, \n     10,   0,   0,   0,  58,   0, \n     16,   0,  10,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  30,   0,   0,   7, \n    130,   0,  16,   0,  10,   0, \n      0,   0,  58,   0,  16,   0, \n     10,   0,   0,   0,   1,  64, \n      0,   0,  57,  70, 188,  31, \n     56,   0,   0,   9, 130,   0, \n     16,   0,   7,   0,   0,   0, \n     58,   0,  16,   0,   7,   0, \n      0,   0,  10, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     56,   0,   0,   9, 130,   0, \n     16,   0,   8,   0,   0,   0, \n     58,   0,  16,   0,   8,   0, \n      0,   0,  10, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     56,   0,   0,   9, 130,   0, \n     16,   0,   9,   0,   0,   0, \n     58,   0,  16,   0,   9,   0, \n      0,   0,  10, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n     56,   0,   0,   9, 130,   0, \n     16,   0,  10,   0,   0,   0, \n     58,   0,  16,   0,  10,   0, \n      0,   0,  10, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,  11,  50,   0, \n     16,   0,  13,   0,   0,   0, \n     22,   5,  16, 128,  65,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128,  63,   0,   0, 128,  63, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  56,   0,   0,   7, \n    130,   0,  16,   0,  11,   0, \n      0,   0,  10,   0,  16,   0, \n     13,   0,   0,   0,  26,   0, \n     16,   0,  13,   0,   0,   0, \n     56,   0,   0,   7,  50,   0, \n     16,   0,  13,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n     13,   0,   0,   0,  56,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   8, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16, 128, \n     65,   0,   0,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   7,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  61,  30,   0,   0,   8, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16, 128, \n     65,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n    187, 126, 240, 126,  56,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,  11,   0, \n      0,   0,   0,   0,   0,   8, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16, 128, \n     65,   0,   0,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  61,  30,   0,   0,   8, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16, 128, \n     65,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n    187, 126, 240, 126,  56,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,  13,   0, \n      0,   0,   0,   0,   0,   8, \n    130,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16, 128, \n     65,   0,   0,   0,   3,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   7, 130,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  61,  30,   0,   0,   8, \n    130,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16, 128, \n     65,   0,   0,   0,   2,   0, \n      0,   0,   1,  64,   0,   0, \n    187, 126, 240, 126,  56,   0, \n      0,   7, 130,   0,  16,   0, \n      3,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,  13,   0, \n      0,   0,   0,   0,   0,   8, \n    130,   0,  16,   0,   4,   0, \n      0,   0,  58,   0,  16, 128, \n     65,   0,   0,   0,   5,   0, \n      0,   0,  58,   0,  16,   0, \n      6,   0,   0,   0,   0,   0, \n      0,   7, 130,   0,  16,   0, \n      4,   0,   0,   0,  58,   0, \n     16,   0,   4,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  61,  30,   0,   0,   8, \n    130,   0,  16,   0,   4,   0, \n      0,   0,  58,   0,  16, 128, \n     65,   0,   0,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n    187, 126, 240, 126,  56,   0, \n      0,   7, 130,   0,  16,   0, \n      5,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   4,   0, \n      0,   0,  56,   0,   0,   7, \n    130,   0,  16,   0,   6,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   7,   0,   0,   0, \n     56,   0,   0,   7, 130,   0, \n     16,   0,  12,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      8,   0,   0,   0,  56,   0, \n      0,   7, 130,   0,  16,   0, \n      3,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n     58,   0,  16,   0,   9,   0, \n      0,   0,  50,   0,   0,   9, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      8,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   3,   0, \n      0,   0,  50,   0,   0,   9, \n     34,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n     11,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  56,   0,   0,   7, \n    130,   0,  16,   0,   5,   0, \n      0,   0,  58,   0,  16,   0, \n      5,   0,   0,   0,  58,   0, \n     16,   0,  10,   0,   0,   0, \n     50,   0,   0,   9,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   7,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   5,   0,   0,   0, \n     50,   0,   0,   9, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,  13,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     50,   0,   0,   9,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,  13,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     50,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n      0,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,  12,   0, \n      0,   0,  58,   0,  16,   0, \n     12,   0,   0,   0,  50,   0, \n      0,   9, 130,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   6,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  64,  58,   0,  16,   0, \n      1,   0,   0,   0,  50,   0, \n      0,   9, 130,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  64,  58,   0,  16,   0, \n      1,   0,   0,   0,  50,   0, \n      0,   9, 130,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   5,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  64,  58,   0,  16,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,   0,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n      0,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   8, \n    130,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16, 128, \n     65,   0,   0,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n    255, 159, 241, 126,  50,   0, \n      0,  10, 130,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16, 128,  65,   0,   0,   0, \n      2,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,  64,  56,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n     56,   0,   0,   7, 114,   0, \n     16,   0,   2,   0,   0,   0, \n     70,   2,  16,   0,   2,   0, \n      0,   0, 246,  15,  16,   0, \n      6,   0,   0,   0,  50,   0, \n      0,   9, 114,   0,  16,   0, \n      2,   0,   0,   0,  70,   2, \n     16,   0,   3,   0,   0,   0, \n    246,  15,  16,   0,   6,   0, \n      0,   0,  70,   2,  16,   0, \n      2,   0,   0,   0,  50,   0, \n      0,   9, 114,   0,  16,   0, \n      2,   0,   0,   0,  70,   2, \n     16,   0,   6,   0,   0,   0, \n    246,  15,  16,   0,  12,   0, \n      0,   0,  70,   2,  16,   0, \n      2,   0,   0,   0,  50,   0, \n      0,   9, 114,   0,  16,   0, \n      2,   0,   0,   0,  70,   2, \n     16,   0,   8,   0,   0,   0, \n    246,  15,  16,   0,  12,   0, \n      0,   0,  70,   2,  16,   0, \n      2,   0,   0,   0,  50,   0, \n      0,   9, 114,   0,  16,   0, \n      2,   0,   0,   0,  70,   2, \n     16,   0,   7,   0,   0,   0, \n    246,  15,  16,   0,   3,   0, \n      0,   0,  70,   2,  16,   0, \n      2,   0,   0,   0,  50,   0, \n      0,   9, 114,   0,  16,   0, \n      2,   0,   0,   0,  70,   2, \n     16,   0,   9,   0,   0,   0, \n    246,  15,  16,   0,   3,   0, \n      0,   0,  70,   2,  16,   0, \n      2,   0,   0,   0,  50,   0, \n      0,   9, 114,   0,  16,   0, \n      2,   0,   0,   0,  70,   2, \n     16,   0,  11,   0,   0,   0, \n    246,  15,  16,   0,   5,   0, \n      0,   0,  70,   2,  16,   0, \n      2,   0,   0,   0,  50,   0, \n      0,   9, 114,   0,  16,   0, \n      1,   0,   0,   0,  70,   2, \n     16,   0,   1,   0,   0,   0, \n    246,  15,  16,   0,   5,   0, \n      0,   0,  70,   2,  16,   0, \n      2,   0,   0,   0,  50,   0, \n      0,   9, 114,   0,  16,   0, \n      1,   0,   0,   0,  70,   2, \n     16,   0,   4,   0,   0,   0, \n     86,   5,  16,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n      1,   0,   0,   0,  50,   0, \n      0,   9, 114,   0,  16,   0, \n      1,   0,   0,   0,  70,   2, \n     16,   0,   5,   0,   0,   0, \n    246,  15,  16,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n      1,   0,   0,   0,  50,   0, \n      0,   9, 226,   0,  16,   0, \n      0,   0,   0,   0,   6,   9, \n     16,   0,  10,   0,   0,   0, \n    166,  10,  16,   0,   0,   0, \n      0,   0,   6,   9,  16,   0, \n      1,   0,   0,   0,  50,   0, \n      0,   9, 114,   0,  16,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  12,   0,   0,   0, \n      6,   0,  16,   0,   0,   0, \n      0,   0, 150,   7,  16,   0, \n      0,   0,   0,   0,  56,  32, \n      0,   7, 114,   0,  16,   0, \n      0,   0,   0,   0, 246,  15, \n     16,   0,   1,   0,   0,   0, \n     70,   2,  16,   0,   0,   0, \n      0,   0,  75,   0,   0,   5, \n    114,  32,  16,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5, 130,  32,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0, 128,  63, \n     62,   0,   0,   1,  83,  84, \n     65,  84, 148,   0,   0,   0, \n    172,   0,   0,   0,  14,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0, 114,   0, \n      0,   0,  20,   0,   0,   0, \n      4,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     12,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  18,   0, \n      0,   0,   0,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/ui/shaders/bytecode/d3d12_5_1/guest_output_ffx_cas_sharpen_dither_ps.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   int2 xe_cas_output_offset;         // Offset:    0 Size:     8\n//   float xe_cas_sharpness_post_setup; // Offset:    8 Size:     4\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_cas_source                     texture  float4          2d      T0             t0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// SV_Position              0   xyzw        0      POS   float   xy  \n//\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// SV_Target                0   xyzw        0   TARGET   float   xyzw\n//\nps_5_1\ndcl_globalFlags refactoringAllowed\ndcl_immediateConstantBuffer { { -0.001003, 0, 0, 0},\n                              { 0.000881, 0, 0, 0},\n                              { 0.001693, 0, 0, 0},\n                              { -0.001555, 0, 0, 0},\n                              { 0.001279, 0, 0, 0},\n                              { -0.000605, 0, 0, 0},\n                              { 0.001065, 0, 0, 0},\n                              { -0.001386, 0, 0, 0},\n                              { 0.001356, 0, 0, 0},\n                              { 0.000513, 0, 0, 0},\n                              { 0.001218, 0, 0, 0},\n                              { -0.001601, 0, 0, 0},\n                              { 0.000590, 0, 0, 0},\n                              { -0.000283, 0, 0, 0},\n                              { 0.001111, 0, 0, 0},\n                              { -0.001417, 0, 0, 0},\n                              { 0.001448, 0, 0, 0},\n                              { -0.000544, 0, 0, 0},\n                              { 0.000130, 0, 0, 0},\n                              { -0.001203, 0, 0, 0},\n                              { 0.000437, 0, 0, 0},\n                              { -0.001049, 0, 0, 0},\n                              { 0.000620, 0, 0, 0},\n                              { -0.000483, 0, 0, 0},\n                              { 0.001877, 0, 0, 0},\n                              { -0.001095, 0, 0, 0},\n                              { -0.000100, 0, 0, 0},\n                              { -0.000528, 0, 0, 0},\n                              { 0.001432, 0, 0, 0},\n                              { -0.001938, 0, 0, 0},\n                              { -0.000697, 0, 0, 0},\n                              { 0.000038, 0, 0, 0},\n                              { 0.000712, 0, 0, 0},\n                              { -0.001310, 0, 0, 0},\n                              { 0.001095, 0, 0, 0},\n                              { -0.000299, 0, 0, 0},\n                              { 0.001754, 0, 0, 0},\n                              { -0.001677, 0, 0, 0},\n                              { 0.001478, 0, 0, 0},\n                              { -0.000038, 0, 0, 0},\n                              { 0.000789, 0, 0, 0},\n                              { -0.001831, 0, 0, 0},\n                              { 0.000299, 0, 0, 0},\n                              { 0.000988, 0, 0, 0},\n                              { -0.001172, 0, 0, 0},\n                              { 0.000176, 0, 0, 0},\n                              { 0.001647, 0, 0, 0},\n                              { -0.001585, 0, 0, 0},\n                              { 0.000345, 0, 0, 0},\n                              { 0.001861, 0, 0, 0},\n                              { -0.001769, 0, 0, 0},\n                              { -0.000866, 0, 0, 0},\n                              { 0.000896, 0, 0, 0},\n                              { 0.000161, 0, 0, 0},\n                              { -0.000927, 0, 0, 0},\n                              { -0.001524, 0, 0, 0},\n                              { -0.000651, 0, 0, 0},\n                              { 0.001294, 0, 0, 0},\n                              { -0.000804, 0, 0, 0},\n                              { -0.001463, 0, 0, 0},\n                              { 0.001800, 0, 0, 0},\n                              { -0.000850, 0, 0, 0},\n                              { 0.000850, 0, 0, 0},\n                              { -0.000452, 0, 0, 0},\n                              { -0.001065, 0, 0, 0},\n                              { -0.000146, 0, 0, 0},\n                              { 0.000237, 0, 0, 0},\n                              { 0.001417, 0, 0, 0},\n                              { -0.000590, 0, 0, 0},\n                              { -0.000191, 0, 0, 0},\n                              { 0.001601, 0, 0, 0},\n                              { 0.001019, 0, 0, 0},\n                              { 0.000406, 0, 0, 0},\n                              { -0.000207, 0, 0, 0},\n                              { 0.001585, 0, 0, 0},\n                              { 0.000651, 0, 0, 0},\n                              { -0.000069, 0, 0, 0},\n                              { 0.000421, 0, 0, 0},\n                              { -0.001647, 0, 0, 0},\n                              { 0.001371, 0, 0, 0},\n                              { 0.000927, 0, 0, 0},\n                              { -0.000666, 0, 0, 0},\n                              { 0.001187, 0, 0, 0},\n                              { -0.001448, 0, 0, 0},\n                              { 0.000574, 0, 0, 0},\n                              { -0.001892, 0, 0, 0},\n                              { 0.000758, 0, 0, 0},\n                              { -0.001294, 0, 0, 0},\n                              { 0.001922, 0, 0, 0},\n                              { -0.001662, 0, 0, 0},\n                              { -0.001034, 0, 0, 0},\n                              { -0.000498, 0, 0, 0},\n                              { -0.001861, 0, 0, 0},\n                              { 0.001203, 0, 0, 0},\n                              { -0.000329, 0, 0, 0},\n                              { -0.001371, 0, 0, 0},\n                              { 0.001631, 0, 0, 0},\n                              { -0.001846, 0, 0, 0},\n                              { 0.000728, 0, 0, 0},\n                              { -0.000911, 0, 0, 0},\n                              { 0.001815, 0, 0, 0},\n                              { -0.001141, 0, 0, 0},\n                              { -0.000375, 0, 0, 0},\n                              { 0.000100, 0, 0, 0},\n                              { -0.000743, 0, 0, 0},\n                              { 0.001172, 0, 0, 0},\n                              { 0.000069, 0, 0, 0},\n                              { 0.001494, 0, 0, 0},\n                              { 0.000973, 0, 0, 0},\n                              { -0.000957, 0, 0, 0},\n                              { 0.001938, 0, 0, 0},\n                              { 0.000528, 0, 0, 0},\n                              { 0.000054, 0, 0, 0},\n                              { -0.001248, 0, 0, 0},\n                              { -0.000268, 0, 0, 0},\n                              { 0.001540, 0, 0, 0},\n                              { -0.000008, 0, 0, 0},\n                              { 0.000314, 0, 0, 0},\n                              { 0.001340, 0, 0, 0},\n                              { -0.001754, 0, 0, 0},\n                              { 0.000498, 0, 0, 0},\n                              { -0.001187, 0, 0, 0},\n                              { 0.000774, 0, 0, 0},\n                              { -0.001340, 0, 0, 0},\n                              { 0.000268, 0, 0, 0},\n                              { -0.001478, 0, 0, 0},\n                              { -0.000130, 0, 0, 0},\n                              { -0.000774, 0, 0, 0},\n                              { 0.001310, 0, 0, 0},\n                              { 0.000391, 0, 0, 0},\n                              { 0.000957, 0, 0, 0},\n                              { -0.000467, 0, 0, 0},\n                              { -0.001540, 0, 0, 0},\n                              { 0.001034, 0, 0, 0},\n                              { -0.000682, 0, 0, 0},\n                              { 0.001677, 0, 0, 0},\n                              { 0.001003, 0, 0, 0},\n                              { -0.000421, 0, 0, 0},\n                              { 0.001785, 0, 0, 0},\n                              { -0.000237, 0, 0, 0},\n                              { -0.000620, 0, 0, 0},\n                              { 0.001662, 0, 0, 0},\n                              { 0.000835, 0, 0, 0},\n                              { -0.001723, 0, 0, 0},\n                              { -0.001080, 0, 0, 0},\n                              { 0.001769, 0, 0, 0},\n                              { -0.000789, 0, 0, 0},\n                              { -0.001785, 0, 0, 0},\n                              { 0.000682, 0, 0, 0},\n                              { -0.000988, 0, 0, 0},\n                              { -0.001325, 0, 0, 0},\n                              { -0.000176, 0, 0, 0},\n                              { -0.001509, 0, 0, 0},\n                              { 0.000329, 0, 0, 0},\n                              { -0.001953, 0, 0, 0},\n                              { 0.000666, 0, 0, 0},\n                              { -0.001616, 0, 0, 0},\n                              { 0.001157, 0, 0, 0},\n                              { 0.000452, 0, 0, 0},\n                              { -0.000437, 0, 0, 0},\n                              { 0.000191, 0, 0, 0},\n                              { -0.001494, 0, 0, 0},\n                              { 0.001141, 0, 0, 0},\n                              { 0.000084, 0, 0, 0},\n                              { 0.001892, 0, 0, 0},\n                              { 0.001402, 0, 0, 0},\n                              { 0.000559, 0, 0, 0},\n                              { 0.000115, 0, 0, 0},\n                              { 0.001264, 0, 0, 0},\n                              { -0.000574, 0, 0, 0},\n                              { -0.000973, 0, 0, 0},\n                              { 0.001325, 0, 0, 0},\n                              { 0.000222, 0, 0, 0},\n                              { -0.000758, 0, 0, 0},\n                              { -0.001356, 0, 0, 0},\n                              { 0.001463, 0, 0, 0},\n                              { 0.000866, 0, 0, 0},\n                              { -0.000360, 0, 0, 0},\n                              { 0.000544, 0, 0, 0},\n                              { -0.001126, 0, 0, 0},\n                              { -0.000253, 0, 0, 0},\n                              { -0.000559, 0, 0, 0},\n                              { -0.001815, 0, 0, 0},\n                              { 0.001723, 0, 0, 0},\n                              { -0.001157, 0, 0, 0},\n                              { 0.000743, 0, 0, 0},\n                              { 0.001570, 0, 0, 0},\n                              { -0.000115, 0, 0, 0},\n                              { -0.001218, 0, 0, 0},\n                              { 0.001831, 0, 0, 0},\n                              { 0.000023, 0, 0, 0},\n                              { -0.001922, 0, 0, 0},\n                              { 0.001739, 0, 0, 0},\n                              { -0.000712, 0, 0, 0},\n                              { 0.001555, 0, 0, 0},\n                              { -0.001708, 0, 0, 0},\n                              { 0.001233, 0, 0, 0},\n                              { 0.000207, 0, 0, 0},\n                              { 0.001049, 0, 0, 0},\n                              { -0.000728, 0, 0, 0},\n                              { -0.001631, 0, 0, 0},\n                              { -0.000314, 0, 0, 0},\n                              { 0.000483, 0, 0, 0},\n                              { -0.001800, 0, 0, 0},\n                              { 0.000942, 0, 0, 0},\n                              { -0.000345, 0, 0, 0},\n                              { 0.000697, 0, 0, 0},\n                              { -0.001019, 0, 0, 0},\n                              { -0.001570, 0, 0, 0},\n                              { -0.000023, 0, 0, 0},\n                              { -0.001279, 0, 0, 0},\n                              { 0.000804, 0, 0, 0},\n                              { -0.000896, 0, 0, 0},\n                              { -0.001432, 0, 0, 0},\n                              { 0.000605, 0, 0, 0},\n                              { -0.000084, 0, 0, 0},\n                              { 0.000911, 0, 0, 0},\n                              { 0.001953, 0, 0, 0},\n                              { -0.001402, 0, 0, 0},\n                              { -0.000636, 0, 0, 0},\n                              { 0.001509, 0, 0, 0},\n                              { -0.000820, 0, 0, 0},\n                              { 0.001248, 0, 0, 0},\n                              { 0.000253, 0, 0, 0},\n                              { 0.001524, 0, 0, 0},\n                              { 0.001126, 0, 0, 0},\n                              { 0.000360, 0, 0, 0},\n                              { -0.000391, 0, 0, 0},\n                              { 0.001907, 0, 0, 0},\n                              { 0.001386, 0, 0, 0},\n                              { -0.001111, 0, 0, 0},\n                              { 0.001616, 0, 0, 0},\n                              { -0.000881, 0, 0, 0},\n                              { 0.000146, 0, 0, 0},\n                              { 0.001080, 0, 0, 0},\n                              { -0.000054, 0, 0, 0},\n                              { 0.000283, 0, 0, 0},\n                              { -0.001693, 0, 0, 0},\n                              { -0.001264, 0, 0, 0},\n                              { -0.000513, 0, 0, 0},\n                              { -0.000161, 0, 0, 0},\n                              { -0.001877, 0, 0, 0},\n                              { -0.000835, 0, 0, 0},\n                              { 0.000636, 0, 0, 0},\n                              { 0.000008, 0, 0, 0},\n                              { -0.001907, 0, 0, 0},\n                              { -0.000222, 0, 0, 0},\n                              { 0.000375, 0, 0, 0},\n                              { -0.001739, 0, 0, 0},\n                              { -0.000406, 0, 0, 0},\n                              { -0.001233, 0, 0, 0},\n                              { 0.001708, 0, 0, 0},\n                              { -0.000942, 0, 0, 0},\n                              { 0.000820, 0, 0, 0},\n                              { 0.001846, 0, 0, 0},\n                              { 0.000467, 0, 0, 0} }\ndcl_constantbuffer CB0[0:0][1], immediateIndexed, space=0\ndcl_resource_texture2d (float,float,float,float) T0[0:0], space=0\ndcl_input_ps_siv linear noperspective v0.xy, position\ndcl_output o0.xyzw\ndcl_temps 6\nftoi r0.xy, v0.xyxx\niadd r0.xy, r0.xyxx, -CB0[0][0].xyxx\niadd r1.xyzw, r0.xyxy, l(-1, 0, 0, -1)\nmov r2.xy, r1.zwzz\nmov r2.zw, l(0,0,0,0)\nld r2.xyz, r2.xyzw, T0[0].xyzw\nmov r1.zw, l(0,0,0,0)\nld r1.xyz, r1.xyzw, T0[0].xyzw\nmov r0.zw, l(0,0,0,0)\nld r3.xyz, r0.xyzw, T0[0].xyzw\niadd r4.xyzw, r0.xyxy, l(0, 1, 1, 0)\nmov r5.xy, r4.zwzz\nmov r5.zw, l(0,0,0,0)\nld r5.xyz, r5.xyzw, T0[0].xyzw\nmov r4.zw, l(0,0,0,0)\nld r4.xyz, r4.xyzw, T0[0].xyzw\nmul r2.xyz, r2.xyzx, r2.xyzx\nmul r1.xyz, r1.xyzx, r1.xyzx\nmul r0.z, r3.y, r3.y\nmul r5.xyz, r5.xyzx, r5.xyzx\nmul r4.xyz, r4.xyzx, r4.xyzx\nmin r0.w, r0.z, r5.y\nmin r0.w, r0.w, r1.y\nmin r1.w, r2.y, r4.y\nmin r0.w, r0.w, r1.w\nmax r0.z, r0.z, r5.y\nmax r0.z, r0.z, r1.y\nmax r1.w, r2.y, r4.y\nmax r0.z, r0.z, r1.w\niadd r1.w, -r0.z, l(0x7ef07ebb)\nadd r0.z, -r0.z, l(1.000000)\nmin r0.z, r0.z, r0.w\nmul_sat r0.z, r1.w, r0.z\nushr r0.z, r0.z, l(1)\niadd r0.z, r0.z, l(0x1fbc4639)\nmul r0.z, r0.z, CB0[0][0].z\nmad r0.w, r0.z, l(4.000000), l(1.000000)\niadd r1.w, -r0.w, l(0x7ef19fff)\nmad r0.w, -r1.w, r0.w, l(2.000000)\nmul r0.w, r0.w, r1.w\nmul r1.xyz, r0.zzzz, r1.xyzx\nmad r1.xyz, r2.xyzx, r0.zzzz, r1.xyzx\nmad r1.xyz, r5.xyzx, r0.zzzz, r1.xyzx\nmad r1.xyz, r4.xyzx, r0.zzzz, r1.xyzx\nmad r1.xyz, r3.xyzx, r3.xyzx, r1.xyzx\nmul_sat r1.xyz, r0.wwww, r1.xyzx\nsqrt r1.xyz, r1.xyzx\nbfi r0.y, l(4), l(4), r0.y, l(0)\nbfi r0.x, l(4), l(0), r0.x, r0.y\nadd_sat o0.xyz, r1.xyzx, icb[r0.x + 0].xxxx\nmov o0.w, l(1.000000)\nret \n// Approximately 52 instruction slots used\n#endif\n\nconst BYTE guest_output_ffx_cas_sharpen_dither_ps[] =\n{\n     68,  88,  66,  67, 255, 119, \n    136, 143,   9, 220, 108,  33, \n     44, 141, 124,   0, 167,  19, \n    114, 121,   1,   0,   0,   0, \n    164,  25,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n      0,   2,   0,   0,  52,   2, \n      0,   0, 104,   2,   0,   0, \n      8,  25,   0,   0,  82,  68, \n     69,  70, 196,   1,   0,   0, \n      1,   0,   0,   0, 172,   0, \n      0,   0,   2,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n    255, 255,   0,   5,   0,   0, \n    156,   1,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,   0,   2,   0, \n      0,   0,   5,   0,   0,   0, \n      4,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n      1,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 154,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 120, 101,  95,  99, \n     97, 115,  95, 115, 111, 117, \n    114,  99, 101,   0, 112, 117, \n    115, 104,  95,  99, 111, 110, \n    115, 116, 115,  95, 120, 101, \n      0, 171, 171, 171, 154,   0, \n      0,   0,   2,   0,   0,   0, \n    196,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  20,   1, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,   2,   0, \n      0,   0,  48,   1,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  84,   1,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   1,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    120, 101,  95,  99,  97, 115, \n     95, 111, 117, 116, 112, 117, \n    116,  95, 111, 102, 102, 115, \n    101, 116,   0, 105, 110, 116, \n     50,   0, 171, 171,   1,   0, \n      2,   0,   1,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     41,   1,   0,   0, 120, 101, \n     95,  99,  97, 115,  95, 115, \n    104,  97, 114, 112, 110, 101, \n    115, 115,  95, 112, 111, 115, \n    116,  95, 115, 101, 116, 117, \n    112,   0, 102, 108, 111,  97, \n    116,   0, 171, 171,   0,   0, \n      3,   0,   1,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    112,   1,   0,   0,  77, 105, \n     99, 114, 111, 115, 111, 102, \n    116,  32,  40,  82,  41,  32, \n     72,  76,  83,  76,  32,  83, \n    104,  97, 100, 101, 114,  32, \n     67, 111, 109, 112, 105, 108, \n    101, 114,  32,  49,  48,  46, \n     49,   0,  73,  83,  71,  78, \n     44,   0,   0,   0,   1,   0, \n      0,   0,   8,   0,   0,   0, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,  15,   3,   0,   0, \n     83,  86,  95,  80, 111, 115, \n    105, 116, 105, 111, 110,   0, \n     79,  83,  71,  78,  44,   0, \n      0,   0,   1,   0,   0,   0, \n      8,   0,   0,   0,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n     15,   0,   0,   0,  83,  86, \n     95,  84,  97, 114, 103, 101, \n    116,   0, 171, 171,  83,  72, \n     69,  88, 152,  22,   0,   0, \n     81,   0,   0,   0, 166,   5, \n      0,   0, 106,   8,   0,   1, \n     53,  24,   0,   0,   2,   4, \n      0,   0, 132, 131, 131, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    231, 230, 102,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 222, 221, \n    221,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 204, 203, 203, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    168, 167, 167,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 159, 158, \n     30, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140, 139, 139,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    182, 181, 181, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 178, 177, \n    177,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 135, 134,   6,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    160, 159, 159,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 210, 209, \n    209, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 155, 154,  26,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    149, 148, 148, 185,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 146, 145, \n    145,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 186, 185, 185, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    190, 189, 189,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 143, 142, \n     14, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 137, 136,   8,  57, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    158, 157, 157, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 229, 228, \n    228,  57,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 138, 137, 137, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    163, 162,  34,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 253, 252, \n    252, 185,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 246, 245, 245,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    144, 143, 143, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 209, 208, \n    208, 184,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 139, 138,  10, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    188, 187, 187,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 254, 253, \n    253, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 183, 182,  54, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    161, 160,  32,  56,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 187, 186, \n     58,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 172, 171, 171, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    144, 143, 143,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 157, 156, \n    156, 185,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 230, 229, 229,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    220, 219, 219, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 194, 193, \n    193,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 161, 160,  32, 184, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    207, 206,  78,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 240, 239, \n    239, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157, 156, 156,  57, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    130, 129, 129,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 154, 153, \n    153, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 185, 184,  56,  57, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    216, 215, 215,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 208, 207, \n    207, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 181, 180, 180,  57, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    244, 243, 243,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 232, 231, \n    231, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 227, 226,  98, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    235, 234, 106,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 169, 168, \n     40,  57,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 243, 242, 114, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    200, 199, 199, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 171, 170, \n     42, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 170, 169, 169,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    211, 210,  82, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 192, 191, \n    191, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 236, 235, 235,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    223, 222,  94, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 223, 222, \n     94,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 237, 236, 236, 185, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140, 139, 139, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 153, 152, \n     24, 185,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 249, 248, 120,  57, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    186, 185, 185,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 155, 154, \n     26, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 201, 200,  72, 185, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    210, 209, 209,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 134, 133, \n    133,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 213, 212, 212,  57, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    217, 216,  88, 185,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 208, 207, \n    207,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 171, 170,  42,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    145, 144, 144, 184,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 221, 220, \n    220,  57,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 216, 215, 215, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    180, 179, 179,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 243, 242, \n    114,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 175, 174,  46, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    156, 155, 155,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 190, 189, \n    189, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 151, 150,  22,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    248, 247, 247, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 199, 198, \n     70,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 170, 169, 169, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    252, 251, 251,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 218, 217, \n    217, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 136, 135, 135, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    131, 130,   2, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 244, 243, \n    243, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 158, 157, 157,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    173, 172, 172, 185,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 180, 179, \n    179, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 214, 213, 213,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    242, 241, 241, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 191, 190, \n     62,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 239, 238, 110, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    238, 237, 237,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 150, 149, \n    149, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 197, 196, 196, 185, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    209, 208, 208,  56,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 195, 194, \n     66, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 154, 153, 153,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    145, 144, 144,  56,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 196, 195, \n    195,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 255, 254, 126,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    251, 250, 122, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 254, 253, \n    253,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 139, 138,  10,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    225, 224,  96,  56,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 164, 163, \n    163, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 141, 140, 140, 185, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    202, 201, 201,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 129, 128, \n      0, 183,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165, 164, 164,  57, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    176, 175, 175,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 230, 229, \n    229, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 131, 130,   2,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    156, 155, 155, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203, 202, \n     74,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 176, 175, 175, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    141, 140, 140,  57,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 194, 193, \n    193, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 137, 136,   8, 185, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    203, 202,  74, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 172, 171, \n    171,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 205, 204, 204,  57, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    251, 250, 122,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 245, 244, \n    244, 185,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 202, 201, 201, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    136, 135, 135,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 179, 178, \n     50, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 220, 219, 219,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    132, 131, 131,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 221, 220, \n    220, 185,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 234, 233, 233,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    249, 248, 120, 185,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 163, 162, \n     34, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 218, 217, 217,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    219, 218,  90,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 226, 225, \n    225, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 142, 141, 141, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    232, 231, 231,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 207, 206, \n     78, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 234, 233, 233, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    179, 178,  50,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 130, 129, \n    129, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 174, 173, 173, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    185, 184,  56, 185,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 198, 197, \n    197, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 173, 172, 172,  57, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0, 187,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 175, 174, \n     46,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 212, 211, 211, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    152, 151, 151,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 237, 236, \n    236,  57,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 229, 228, 228, 185, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    201, 200,  72,  57,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 196, 195, \n    195, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 150, 149, 149,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    177, 176, 176,  56,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 248, 247, \n    247,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 184, 183, 183,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    147, 146,  18,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 241, 240, \n    240,  56,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 166, 165, 165,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    151, 150,  22, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 255, 254, \n    126, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 174, 173, 173,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    233, 232, 104,  57,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 199, 198, \n     70, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 178, 177, 177, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    192, 191, 191,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 227, 226, \n     98,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 189, 188, 188, 185, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    143, 142,  14,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 148, 147, \n    147, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 133, 132, 132, 185, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    147, 146,  18, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 238, 237, \n    237, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 226, 225, 225,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    152, 151, 151, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 195, 194, \n     66,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 206, 205, 205,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    241, 240, 240, 184,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 160, 159, \n    159, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 240, 239, 239,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    193, 192, 192,  55,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 252, 251, \n    251, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 228, 227, 227,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    187, 186,  58, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 204, 203, \n    203,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224, 223, 223, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    162, 161, 161,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 217, 216, \n     88,  57,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 138, 137, 137,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    191, 190,  62, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 214, 213, \n    213, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165, 164, 164, 185, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    253, 252, 252,  57,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 236, 235, \n    235, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 247, 246, 118,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    181, 180, 180, 185,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 183, 182, \n     54,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 134, 133, 133, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    206, 205, 205, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 193, 192, \n    192, 183,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 168, 167, 167, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    211, 210,  82,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 235, 234, \n    106, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 188, 187, 187, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    159, 158,  30,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 177, 176, \n    176, 184,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 239, 238, 110,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,  59,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 184, 183, \n    183, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 167, 166,  38, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    198, 197, 197,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 215, 214, \n     86, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 164, 163, 163,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    133, 132, 132,  57,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 200, 199, \n    199,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 148, 147, 147,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    189, 188, 188,  57,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 205, 204, \n    204, 185,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 250, 249, 249,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    182, 181, 181,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 146, 145, \n    145, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 212, 211, 211,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    231, 230, 102, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 153, 152, \n     24,  57,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 142, 141, 141,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    225, 224,  96, 184,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 149, 148, \n    148,  57,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 222, 221, 221, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    166, 165, 165, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 135, 134, \n      6, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 169, 168,  40, 185, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    246, 245, 245, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 219, 218, \n     90, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 167, 166,  38,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    129, 128,   0,  55,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 250, 249, \n    249, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 233, 232, 104, 185, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    197, 196, 196,  57,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 228, 227, \n    227, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 213, 212, 212, 185, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    162, 161, 161, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 224, 223, \n    223,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 247, 246, 118, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    215, 214,  86,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 242, 241, \n    241,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 245, 244, 244,  57, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     89,   0,   0,   7,  70, 142, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  88,  24, \n      0,   7,  70, 126,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     85,  85,   0,   0,   0,   0, \n      0,   0, 100,  32,   0,   4, \n     50,  16,  16,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n    101,   0,   0,   3, 242,  32, \n     16,   0,   0,   0,   0,   0, \n    104,   0,   0,   2,   6,   0, \n      0,   0,  27,   0,   0,   5, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,  16,  16,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  10,  50,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n     70, 128,  48, 128,  65,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,   4,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n     54,   0,   0,   5,  50,   0, \n     16,   0,   2,   0,   0,   0, \n    230,  10,  16,   0,   1,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  45,   0, \n      0,   8, 114,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  45,   0,   0,   8, \n    114,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     45,   0,   0,   8, 114,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,   4,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  50,   0, \n     16,   0,   5,   0,   0,   0, \n    230,  10,  16,   0,   4,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  45,   0, \n      0,   8, 114,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  45,   0,   0,   8, \n    114,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  56,   0, \n      0,   7, 114,   0,  16,   0, \n      2,   0,   0,   0,  70,   2, \n     16,   0,   2,   0,   0,   0, \n     70,   2,  16,   0,   2,   0, \n      0,   0,  56,   0,   0,   7, \n    114,   0,  16,   0,   1,   0, \n      0,   0,  70,   2,  16,   0, \n      1,   0,   0,   0,  70,   2, \n     16,   0,   1,   0,   0,   0, \n     56,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,  56,   0, \n      0,   7, 114,   0,  16,   0, \n      5,   0,   0,   0,  70,   2, \n     16,   0,   5,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,  56,   0,   0,   7, \n    114,   0,  16,   0,   4,   0, \n      0,   0,  70,   2,  16,   0, \n      4,   0,   0,   0,  70,   2, \n     16,   0,   4,   0,   0,   0, \n     51,   0,   0,   7, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      5,   0,   0,   0,  51,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  51,   0,   0,   7, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  26,   0, \n     16,   0,   4,   0,   0,   0, \n     51,   0,   0,   7, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  52,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0,  52,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     52,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      4,   0,   0,   0,  52,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  30,   0,   0,   8, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16, 128, \n     65,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n    187, 126, 240, 126,   0,   0, \n      0,   8,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16, 128,  65,   0,   0,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0, 128,  63, \n     51,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  56,  32, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     30,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     57,  70, 188,  31,  56,   0, \n      0,   9,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     42, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  50,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n    128,  64,   1,  64,   0,   0, \n      0,   0, 128,  63,  30,   0, \n      0,   8, 130,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16, 128,  65,   0,   0,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0, 255, 159, 241, 126, \n     50,   0,   0,  10, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16, 128,  65,   0, \n      0,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,  64,  56,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  56,   0,   0,   7, \n    114,   0,  16,   0,   1,   0, \n      0,   0, 166,  10,  16,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,   1,   0,   0,   0, \n     50,   0,   0,   9, 114,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   2,  16,   0,   2,   0, \n      0,   0, 166,  10,  16,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,   1,   0,   0,   0, \n     50,   0,   0,   9, 114,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0, 166,  10,  16,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,   1,   0,   0,   0, \n     50,   0,   0,   9, 114,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   2,  16,   0,   4,   0, \n      0,   0, 166,  10,  16,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,   1,   0,   0,   0, \n     50,   0,   0,   9, 114,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   2,  16,   0,   3,   0, \n      0,   0,  70,   2,  16,   0, \n      3,   0,   0,   0,  70,   2, \n     16,   0,   1,   0,   0,   0, \n     56,  32,   0,   7, 114,   0, \n     16,   0,   1,   0,   0,   0, \n    246,  15,  16,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n      1,   0,   0,   0,  75,   0, \n      0,   5, 114,   0,  16,   0, \n      1,   0,   0,   0,  70,   2, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,   0,  32, \n      0,   8, 114,  32,  16,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,   1,   0,   0,   0, \n      6, 144, 144,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     54,   0,   0,   5, 130,  32, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n    128,  63,  62,   0,   0,   1, \n     83,  84,  65,  84, 148,   0, \n      0,   0,  52,   0,   0,   0, \n      6,   0,   0,   0,   0,   1, \n      0,   0,   2,   0,   0,   0, \n     28,   0,   0,   0,   6,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/ui/shaders/bytecode/d3d12_5_1/guest_output_ffx_cas_sharpen_ps.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   int2 xe_cas_output_offset;         // Offset:    0 Size:     8\n//   float xe_cas_sharpness_post_setup; // Offset:    8 Size:     4\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_cas_source                     texture  float4          2d      T0             t0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// SV_Position              0   xyzw        0      POS   float   xy  \n//\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// SV_Target                0   xyzw        0   TARGET   float   xyzw\n//\nps_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][1], immediateIndexed, space=0\ndcl_resource_texture2d (float,float,float,float) T0[0:0], space=0\ndcl_input_ps_siv linear noperspective v0.xy, position\ndcl_output o0.xyzw\ndcl_temps 5\nftoi r0.xy, v0.xyxx\niadd r0.xy, r0.xyxx, -CB0[0][0].xyxx\niadd r1.xyzw, r0.xyxy, l(-1, 0, 0, -1)\nmov r2.xy, r1.zwzz\nmov r2.zw, l(0,0,0,0)\nld r2.xyz, r2.xyzw, T0[0].xyzw\nmov r1.zw, l(0,0,0,0)\nld r1.xyz, r1.xyzw, T0[0].xyzw\nmov r0.zw, l(0,0,0,0)\nld r3.xyz, r0.xyzw, T0[0].xyzw\niadd r0.xyzw, r0.xyxy, l(0, 1, 1, 0)\nmov r4.xy, r0.zwzz\nmov r4.zw, l(0,0,0,0)\nld r4.xyz, r4.xyzw, T0[0].xyzw\nmov r0.zw, l(0,0,0,0)\nld r0.xyz, r0.xyzw, T0[0].xyzw\nmul r2.xyz, r2.xyzx, r2.xyzx\nmul r1.xyz, r1.xyzx, r1.xyzx\nmul r0.w, r3.y, r3.y\nmul r4.xyz, r4.xyzx, r4.xyzx\nmul r0.xyz, r0.xyzx, r0.xyzx\nmin r1.w, r0.w, r4.y\nmin r1.w, r1.w, r1.y\nmin r2.w, r0.y, r2.y\nmin r1.w, r1.w, r2.w\nmax r0.w, r0.w, r4.y\nmax r0.w, r0.w, r1.y\nmax r2.w, r0.y, r2.y\nmax r0.w, r0.w, r2.w\niadd r2.w, -r0.w, l(0x7ef07ebb)\nadd r0.w, -r0.w, l(1.000000)\nmin r0.w, r0.w, r1.w\nmul_sat r0.w, r2.w, r0.w\nushr r0.w, r0.w, l(1)\niadd r0.w, r0.w, l(0x1fbc4639)\nmul r0.w, r0.w, CB0[0][0].z\nmad r1.w, r0.w, l(4.000000), l(1.000000)\niadd r2.w, -r1.w, l(0x7ef19fff)\nmad r1.w, -r2.w, r1.w, l(2.000000)\nmul r1.w, r1.w, r2.w\nmul r1.xyz, r0.wwww, r1.xyzx\nmad r1.xyz, r2.xyzx, r0.wwww, r1.xyzx\nmad r1.xyz, r4.xyzx, r0.wwww, r1.xyzx\nmad r0.xyz, r0.xyzx, r0.wwww, r1.xyzx\nmad r0.xyz, r3.xyzx, r3.xyzx, r0.xyzx\nmul_sat r0.xyz, r1.wwww, r0.xyzx\nsqrt o0.xyz, r0.xyzx\nmov o0.w, l(1.000000)\nret \n// Approximately 49 instruction slots used\n#endif\n\nconst BYTE guest_output_ffx_cas_sharpen_ps[] =\n{\n     68,  88,  66,  67, 166,  66, \n    169, 116, 206,  31,  71, 185, \n     60, 220, 203, 253,  75, 208, \n    107, 220,   1,   0,   0,   0, \n     36,   9,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n      0,   2,   0,   0,  52,   2, \n      0,   0, 104,   2,   0,   0, \n    136,   8,   0,   0,  82,  68, \n     69,  70, 196,   1,   0,   0, \n      1,   0,   0,   0, 172,   0, \n      0,   0,   2,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n    255, 255,   0,   5,   0,   0, \n    156,   1,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,   0,   2,   0, \n      0,   0,   5,   0,   0,   0, \n      4,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n      1,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 154,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 120, 101,  95,  99, \n     97, 115,  95, 115, 111, 117, \n    114,  99, 101,   0, 112, 117, \n    115, 104,  95,  99, 111, 110, \n    115, 116, 115,  95, 120, 101, \n      0, 171, 171, 171, 154,   0, \n      0,   0,   2,   0,   0,   0, \n    196,   0,   0,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  20,   1, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,   2,   0, \n      0,   0,  48,   1,   0,   0, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0,  84,   1,   0,   0, \n      8,   0,   0,   0,   4,   0, \n      0,   0,   2,   0,   0,   0, \n    120,   1,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    120, 101,  95,  99,  97, 115, \n     95, 111, 117, 116, 112, 117, \n    116,  95, 111, 102, 102, 115, \n    101, 116,   0, 105, 110, 116, \n     50,   0, 171, 171,   1,   0, \n      2,   0,   1,   0,   2,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     41,   1,   0,   0, 120, 101, \n     95,  99,  97, 115,  95, 115, \n    104,  97, 114, 112, 110, 101, \n    115, 115,  95, 112, 111, 115, \n    116,  95, 115, 101, 116, 117, \n    112,   0, 102, 108, 111,  97, \n    116,   0, 171, 171,   0,   0, \n      3,   0,   1,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    112,   1,   0,   0,  77, 105, \n     99, 114, 111, 115, 111, 102, \n    116,  32,  40,  82,  41,  32, \n     72,  76,  83,  76,  32,  83, \n    104,  97, 100, 101, 114,  32, \n     67, 111, 109, 112, 105, 108, \n    101, 114,  32,  49,  48,  46, \n     49,   0,  73,  83,  71,  78, \n     44,   0,   0,   0,   1,   0, \n      0,   0,   8,   0,   0,   0, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,  15,   3,   0,   0, \n     83,  86,  95,  80, 111, 115, \n    105, 116, 105, 111, 110,   0, \n     79,  83,  71,  78,  44,   0, \n      0,   0,   1,   0,   0,   0, \n      8,   0,   0,   0,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n     15,   0,   0,   0,  83,  86, \n     95,  84,  97, 114, 103, 101, \n    116,   0, 171, 171,  83,  72, \n     69,  88,  24,   6,   0,   0, \n     81,   0,   0,   0, 134,   1, \n      0,   0, 106,   8,   0,   1, \n     89,   0,   0,   7,  70, 142, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  88,  24, \n      0,   7,  70, 126,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     85,  85,   0,   0,   0,   0, \n      0,   0, 100,  32,   0,   4, \n     50,  16,  16,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n    101,   0,   0,   3, 242,  32, \n     16,   0,   0,   0,   0,   0, \n    104,   0,   0,   2,   5,   0, \n      0,   0,  27,   0,   0,   5, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,  16,  16,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  10,  50,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n     70, 128,  48, 128,  65,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,   4,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n     54,   0,   0,   5,  50,   0, \n     16,   0,   2,   0,   0,   0, \n    230,  10,  16,   0,   1,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  45,   0, \n      0,   8, 114,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  45,   0,   0,   8, \n    114,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     45,   0,   0,   8, 114,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    242,   0,  16,   0,   0,   0, \n      0,   0,  70,   4,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  50,   0, \n     16,   0,   4,   0,   0,   0, \n    230,  10,  16,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  45,   0, \n      0,   8, 114,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  45,   0,   0,   8, \n    114,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      0,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  56,   0, \n      0,   7, 114,   0,  16,   0, \n      2,   0,   0,   0,  70,   2, \n     16,   0,   2,   0,   0,   0, \n     70,   2,  16,   0,   2,   0, \n      0,   0,  56,   0,   0,   7, \n    114,   0,  16,   0,   1,   0, \n      0,   0,  70,   2,  16,   0, \n      1,   0,   0,   0,  70,   2, \n     16,   0,   1,   0,   0,   0, \n     56,   0,   0,   7, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   3,   0, \n      0,   0,  26,   0,  16,   0, \n      3,   0,   0,   0,  56,   0, \n      0,   7, 114,   0,  16,   0, \n      4,   0,   0,   0,  70,   2, \n     16,   0,   4,   0,   0,   0, \n     70,   2,  16,   0,   4,   0, \n      0,   0,  56,   0,   0,   7, \n    114,   0,  16,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,   0,   0,   0,   0, \n     51,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      4,   0,   0,   0,  51,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  51,   0,   0,   7, \n    130,   0,  16,   0,   2,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   2,   0,   0,   0, \n     51,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,  52,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   4,   0, \n      0,   0,  52,   0,   0,   7, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   1,   0,   0,   0, \n     52,   0,   0,   7, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      2,   0,   0,   0,  52,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  30,   0,   0,   8, \n    130,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16, 128, \n     65,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n    187, 126, 240, 126,   0,   0, \n      0,   8, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16, 128,  65,   0,   0,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0, 128,  63, \n     51,   0,   0,   7, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  56,  32, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  85,   0,   0,   7, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   1,   0,   0,   0, \n     30,   0,   0,   7, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n     57,  70, 188,  31,  56,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     42, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  50,   0, \n      0,   9, 130,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n    128,  64,   1,  64,   0,   0, \n      0,   0, 128,  63,  30,   0, \n      0,   8, 130,   0,  16,   0, \n      2,   0,   0,   0,  58,   0, \n     16, 128,  65,   0,   0,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0, 255, 159, 241, 126, \n     50,   0,   0,  10, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16, 128,  65,   0, \n      0,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,  64,  56,   0, \n      0,   7, 130,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  56,   0,   0,   7, \n    114,   0,  16,   0,   1,   0, \n      0,   0, 246,  15,  16,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,   1,   0,   0,   0, \n     50,   0,   0,   9, 114,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   2,  16,   0,   2,   0, \n      0,   0, 246,  15,  16,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,   1,   0,   0,   0, \n     50,   0,   0,   9, 114,   0, \n     16,   0,   1,   0,   0,   0, \n     70,   2,  16,   0,   4,   0, \n      0,   0, 246,  15,  16,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,   1,   0,   0,   0, \n     50,   0,   0,   9, 114,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,   0,   0, \n      0,   0, 246,  15,  16,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,   1,   0,   0,   0, \n     50,   0,   0,   9, 114,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,   3,   0, \n      0,   0,  70,   2,  16,   0, \n      3,   0,   0,   0,  70,   2, \n     16,   0,   0,   0,   0,   0, \n     56,  32,   0,   7, 114,   0, \n     16,   0,   0,   0,   0,   0, \n    246,  15,  16,   0,   1,   0, \n      0,   0,  70,   2,  16,   0, \n      0,   0,   0,   0,  75,   0, \n      0,   5, 114,  32,  16,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,   0,   0,   0,   0, \n     54,   0,   0,   5, 130,  32, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n    128,  63,  62,   0,   0,   1, \n     83,  84,  65,  84, 148,   0, \n      0,   0,  49,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n     27,   0,   0,   0,   6,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   5,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      8,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/ui/shaders/bytecode/d3d12_5_1/guest_output_ffx_fsr_easu_ps.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   float2 xe_fsr_easu_input_output_size_ratio;// Offset:    0 Size:     8\n//   float2 xe_fsr_easu_input_size_inv; // Offset:    8 Size:     8\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_fsr_easu_sampler               sampler      NA          NA      S0             s0      1 \n// xe_fsr_easu_source                texture  float4          2d      T0             t0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// SV_Position              0   xyzw        0      POS   float   xy  \n//\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// SV_Target                0   xyzw        0   TARGET   float   xyzw\n//\nps_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][1], immediateIndexed, space=0\ndcl_sampler S0[0:0], mode_default, space=0\ndcl_resource_texture2d (float,float,float,float) T0[0:0], space=0\ndcl_input_ps_siv linear noperspective v0.xy, position\ndcl_output o0.xyzw\ndcl_temps 22\nmul r0.w, l(4.000000), CB0[0][0].w\nmad r0.xy, CB0[0][0].xyxx, l(0.500000, 0.500000, 0.000000, 0.000000), l(-0.500000, -0.500000, 0.000000, 0.000000)\nmul r1.xyz, l(1.000000, 1.000000, -1.000000, 0.000000), CB0[0][0].zwwz\nftou r2.xy, v0.xyxx\nutof r2.xy, r2.xyxx\nmad r0.xy, r2.xyxx, CB0[0][0].xyxx, r0.xyxx\nround_ni r2.xy, r0.xyxx\nadd r0.xy, r0.xyxx, -r2.xyxx\nmad r1.xy, r2.xyxx, r1.xyxx, r1.xzxx\nmad r2.xyzw, CB0[0][0].zwzw, l(-1.000000, 2.000000, 1.000000, 2.000000), r1.xyxy\nmov r0.z, l(0)\nadd r0.zw, r0.zzzw, r1.xxxy\ngather4 r1.zw, r1.xyxx, T0[0].zwxy, S0[0].x\ngather4 r3.xy, r1.xyxx, T0[0].xyzw, S0[0].y\ngather4 r4.xz, r1.xyxx, T0[0].xzyw, S0[0].z\ngather4 r5.xyzw, r2.xyxx, T0[0].xyzw, S0[0].x\ngather4 r6.xyzw, r2.xyxx, T0[0].xyzw, S0[0].y\ngather4 r7.xyzw, r2.xyxx, T0[0].yzxw, S0[0].z\ngather4 r8.xyzw, r2.zwzz, T0[0].xyzw, S0[0].x\ngather4 r9.xyzw, r2.zwzz, T0[0].xyzw, S0[0].y\ngather4 r2.xyzw, r2.zwzz, T0[0].xyzw, S0[0].z\ngather4 r1.xy, r0.zwzz, T0[0].zwxy, S0[0].x\ngather4 r3.zw, r0.zwzz, T0[0].xyzw, S0[0].y\ngather4 r10.zw, r0.zwzz, T0[0].xyzw, S0[0].z\nmad r0.zw, r1.zzzw, l(0.000000, 0.000000, 0.500000, 0.500000), r3.xxxy\nmad r0.zw, r4.xxxz, l(0.000000, 0.000000, 0.500000, 0.500000), r0.zzzw\nmad r11.xyzw, r5.zwyx, l(0.500000, 0.500000, 0.500000, 0.500000), r6.zwyx\nmad r11.xyzw, r7.ywxz, l(0.500000, 0.500000, 0.500000, 0.500000), r11.xyzw\nmad r12.xyzw, r8.xyzw, l(0.500000, 0.500000, 0.500000, 0.500000), r9.xyzw\nmad r12.xyzw, r2.xyzw, l(0.500000, 0.500000, 0.500000, 0.500000), r12.xyzw\nmad r13.xy, r1.xyxx, l(0.500000, 0.500000, 0.000000, 0.000000), r3.zwzz\nmad r13.xy, r10.zwzz, l(0.500000, 0.500000, 0.000000, 0.000000), r13.xyxx\nadd r14.xyzw, -r0.xyxy, l(1.000000, 1.000000, 0.000000, -1.000000)\nmul r4.w, r14.y, r14.x\nadd r15.xyzw, -r11.xyxz, r12.wwzx\nadd r16.xyz, -r11.yxwy, r11.xzzx\nmax r13.zw, |r15.xxxw|, |r16.xxxz|\niadd r13.zw, -r13.zzzw, l(0, 0, 0x7ef07ebb, 0x7ef07ebb)\nmul_sat r11.y, r13.z, |r15.y|\nmul r11.y, r11.y, r11.y\nadd r16.xz, -r0.zzzz, r11.xxzx\nmax r0.z, |r16.x|, |r16.y|\niadd r0.z, -r0.z, l(0x7ef07ebb)\nmul_sat r0.z, r0.z, |r16.z|\nmul r0.z, r0.z, r0.z\nmul r0.z, r4.w, r0.z\nmad r0.z, r11.y, r4.w, r0.z\nmul r14.xy, r0.xyxx, r14.yxyy\nadd r17.xyz, -r12.wwxw, r12.zxyz\nmax r15.xw, |r15.xxxw|, |r17.xxxz|\niadd r15.xw, -r15.xxxw, l(0x7ef07ebb, 0, 0, 0x7ef07ebb)\nmul r11.y, r14.x, r15.z\nmad r11.y, r15.y, r4.w, r11.y\nmul_sat r12.z, r15.x, |r15.z|\nmul r12.z, r12.z, r12.z\nmad r0.z, r12.z, r14.x, r0.z\nadd r15.xy, -r0.wwww, r12.wxww\nmax r0.w, |r15.x|, |r17.y|\niadd r0.w, -r0.w, l(0x7ef07ebb)\nmul r12.z, r14.x, r15.y\nmad r4.w, r16.z, r4.w, r12.z\nmul_sat r0.w, r0.w, |r15.y|\nmul r0.w, r0.w, r0.w\nmad r0.z, r0.w, r14.x, r0.z\nadd r12.yz, -r11.wwzw, r12.xxyx\nmad r0.w, r12.y, r14.y, r11.y\nmul_sat r11.y, r13.w, |r12.y|\nmul r11.y, r11.y, r11.y\nmad r0.z, r11.y, r14.y, r0.z\nadd r11.xy, -r11.zxzz, r13.yyyy\nmax r11.x, |r16.y|, |r11.x|\niadd r11.x, -r11.x, l(0x7ef07ebb)\nmad r4.w, r11.y, r14.y, r4.w\nmul_sat r11.x, r11.x, |r11.y|\nmul r11.x, r11.x, r11.x\nmad r0.z, r11.x, r14.y, r0.z\nmul r11.x, r0.y, r0.x\nmad r15.y, r12.z, r11.x, r0.w\nmul_sat r0.w, r15.w, |r12.z|\nmul r0.w, r0.w, r0.w\nmad r0.z, r0.w, r11.x, r0.z\nadd r11.yz, -r12.xxwx, r13.xxxx\nmax r0.w, |r17.y|, |r11.y|\niadd r0.w, -r0.w, l(0x7ef07ebb)\nmad r15.z, r11.z, r11.x, r4.w\nmul_sat r0.w, r0.w, |r11.z|\nmul r0.w, r0.w, r0.w\nmad r0.z, r0.w, r11.x, r0.z\nmul r11.xy, r15.yzyy, r15.yzyy\nadd r0.w, r11.y, r11.x\nlt r4.w, r0.w, l(0.000031)\nushr r0.w, r0.w, l(1)\niadd r0.w, -r0.w, l(0x5f347d74)\nmovc r0.w, r4.w, l(1.000000), r0.w\nmovc r15.x, r4.w, l(1.000000), r15.y\nmul r11.xy, r0.wwww, r15.xzxx\nmul r0.z, r0.z, l(0.500000)\nmul r0.z, r0.z, r0.z\ndp2 r0.w, r11.xyxx, r11.xyxx\nmax r4.w, |r11.y|, |r11.x|\niadd r4.w, -r4.w, l(0x7ef07ebb)\nmad r0.w, r0.w, r4.w, l(-1.000000)\nmad r12.x, r0.w, r0.z, l(1.000000)\nmad r12.yz, r0.zzzz, l(0.000000, -0.500000, -0.290000, 0.000000), l(0.000000, 1.000000, 0.500000, 0.000000)\niadd r0.z, -r12.z, l(0x7ef07ebb)\nmov r13.x, r8.w\nmov r13.y, r9.w\nmov r13.z, r2.w\nmov r15.x, r5.y\nmov r15.y, r6.y\nmov r15.z, r7.x\nmin r16.xyz, r13.xyzx, r15.xyzx\nmov r17.x, r5.z\nmov r17.y, r6.z\nmov r17.z, r7.y\nmin r16.xyz, r16.xyzx, r17.xyzx\nmov r18.x, r8.x\nmov r18.y, r9.x\nmov r18.z, r2.x\nmin r16.xyz, r16.xyzx, r18.xyzx\nmax r19.xyz, r13.xyzx, r15.xyzx\nmax r19.xyz, r17.xyzx, r19.xyzx\nmax r19.xyz, r18.xyzx, r19.xyzx\ndp2 r14.x, r14.zwzz, r11.xyxx\nmul r0.w, r11.x, r14.w\nmad r14.y, r14.z, -r11.y, r0.w\nmul r5.yz, r12.xxyx, r14.xxyx\ndp2 r0.w, r5.yzyy, r5.yzyy\nmin r0.w, r0.z, r0.w\nmad r2.w, r0.w, l(0.400000), l(-1.000000)\nmad r0.w, r12.z, r0.w, l(-1.000000)\nmul r2.w, r2.w, r2.w\nmul r0.w, r0.w, r0.w\nmad r2.w, r2.w, l(1.562500), l(-0.562500)\nmul r4.w, r0.w, r2.w\nmov r14.x, r1.z\nmov r14.y, r3.x\nmov r14.z, r4.x\nadd r20.xyzw, -r0.xyxy, l(1.000000, -1.000000, -1.000000, 1.000000)\ndp2 r21.y, r20.xyxx, r11.xyxx\nmul r5.yz, r11.xxxx, r20.yywy\nmad r21.zw, r20.xxxz, -r11.yyyy, r5.yyyz\nmul r5.yz, r12.xxyx, r21.yyzy\ndp2 r1.z, r5.yzyy, r5.yzyy\nmin r1.z, r0.z, r1.z\nmad r3.x, r1.z, l(0.400000), l(-1.000000)\nmad r1.z, r12.z, r1.z, l(-1.000000)\nmul r3.x, r3.x, r3.x\nmul r1.z, r1.z, r1.z\nmad r3.x, r3.x, l(1.562500), l(-0.562500)\nmul r1.z, r1.z, r3.x\nmov r4.x, r1.w\nmov r4.y, r3.y\nmul r4.xyz, r1.zzzz, r4.xyzx\nmad r4.xyz, r14.xyzx, r4.wwww, r4.xyzx\nmad r0.w, r2.w, r0.w, r1.z\ndp2 r21.x, r20.zwzz, r11.xyxx\nmul r1.zw, r12.xxxy, r21.xxxw\ndp2 r1.z, r1.zwzz, r1.zwzz\nmin r1.z, r0.z, r1.z\nmad r1.w, r1.z, l(0.400000), l(-1.000000)\nmad r1.z, r12.z, r1.z, l(-1.000000)\nmul r1.zw, r1.zzzw, r1.zzzw\nmad r1.w, r1.w, l(1.562500), l(-0.562500)\nmul r2.w, r1.z, r1.w\nmov r7.x, r5.x\nmov r7.y, r6.x\nmad r4.xyz, r7.xyzx, r2.wwww, r4.xyzx\nmad r0.w, r1.w, r1.z, r0.w\nadd r14.xyzw, -r0.xyxy, l(0.000000, 1.000000, -1.000000, 0.000000)\ndp2 r20.y, r14.xyxx, r11.xyxx\nmul r1.zw, r11.xxxx, r14.yyyw\nmad r20.zw, r14.xxxz, -r11.yyyy, r1.zzzw\nmul r1.zw, r12.xxxy, r20.yyyz\ndp2 r1.z, r1.zwzz, r1.zwzz\nmin r1.z, r0.z, r1.z\nmad r1.w, r1.z, l(0.400000), l(-1.000000)\nmad r1.z, r12.z, r1.z, l(-1.000000)\nmul r1.zw, r1.zzzw, r1.zzzw\nmad r1.w, r1.w, l(1.562500), l(-0.562500)\nmul r2.w, r1.z, r1.w\nmad r4.xyz, r15.xyzx, r2.wwww, r4.xyzx\nmad r0.w, r1.w, r1.z, r0.w\ndp2 r3.x, -r0.xyxx, r11.xyxx\nmul r1.z, -r0.y, r11.x\nmad r3.y, r0.x, r11.y, r1.z\nmul r1.zw, r12.xxxy, r3.xxxy\ndp2 r1.z, r1.zwzz, r1.zwzz\nmin r1.z, r0.z, r1.z\nmad r1.w, r1.z, l(0.400000), l(-1.000000)\nmad r1.z, r12.z, r1.z, l(-1.000000)\nmul r1.zw, r1.zzzw, r1.zzzw\nmad r1.w, r1.w, l(1.562500), l(-0.562500)\nmul r2.w, r1.z, r1.w\nmad r4.xyz, r17.xyzx, r2.wwww, r4.xyzx\nmad r0.w, r1.w, r1.z, r0.w\ndp2 r20.x, r14.zwzz, r11.xyxx\nmul r1.zw, r12.xxxy, r20.xxxw\ndp2 r1.z, r1.zwzz, r1.zwzz\nmin r1.z, r0.z, r1.z\nmad r1.w, r1.z, l(0.400000), l(-1.000000)\nmad r1.z, r12.z, r1.z, l(-1.000000)\nmul r1.zw, r1.zzzw, r1.zzzw\nmad r1.w, r1.w, l(1.562500), l(-0.562500)\nmul r2.w, r1.z, r1.w\nmov r7.z, r5.w\nmov r7.x, r6.w\nmad r4.xyz, r7.zxwz, r2.wwww, r4.xyzx\nmad r0.w, r1.w, r1.z, r0.w\nadd r5.xyzw, -r0.xyxy, l(1.000000, 1.000000, 2.000000, 1.000000)\ndp2 r6.y, r5.xyxx, r11.xyxx\nmul r1.zw, r11.xxxx, r5.yyyw\nmad r6.zw, r5.xxxz, -r11.yyyy, r1.zzzw\nmul r1.zw, r12.xxxy, r6.yyyz\ndp2 r1.z, r1.zwzz, r1.zwzz\nmin r1.z, r0.z, r1.z\nmad r1.w, r1.z, l(0.400000), l(-1.000000)\nmad r1.z, r12.z, r1.z, l(-1.000000)\nmul r1.zw, r1.zzzw, r1.zzzw\nmad r1.w, r1.w, l(1.562500), l(-0.562500)\nmul r2.w, r1.z, r1.w\nmad r4.xyz, r18.xyzx, r2.wwww, r4.xyzx\nmad r0.w, r1.w, r1.z, r0.w\ndp2 r6.x, r5.zwzz, r11.xyxx\nmul r1.zw, r12.xxxy, r6.xxxw\ndp2 r1.z, r1.zwzz, r1.zwzz\nmin r1.z, r0.z, r1.z\nmad r1.w, r1.z, l(0.400000), l(-1.000000)\nmad r1.z, r12.z, r1.z, l(-1.000000)\nmul r1.zw, r1.zzzw, r1.zzzw\nmad r1.w, r1.w, l(1.562500), l(-0.562500)\nmul r2.w, r1.z, r1.w\nmov r5.x, r8.y\nmov r5.y, r9.y\nmov r5.z, r2.y\nmad r4.xyz, r5.xyzx, r2.wwww, r4.xyzx\nmad r0.w, r1.w, r1.z, r0.w\nadd r5.xyzw, -r0.xyxy, l(2.000000, 0.000000, 1.000000, 0.000000)\ndp2 r6.y, r5.xyxx, r11.xyxx\nmul r1.zw, r11.xxxx, r5.yyyw\nmad r6.zw, r5.xxxz, -r11.yyyy, r1.zzzw\nmul r1.zw, r12.xxxy, r6.yyyz\ndp2 r1.z, r1.zwzz, r1.zwzz\nmin r1.z, r0.z, r1.z\nmad r1.w, r1.z, l(0.400000), l(-1.000000)\nmad r1.z, r12.z, r1.z, l(-1.000000)\nmul r1.zw, r1.zzzw, r1.zzzw\nmad r1.w, r1.w, l(1.562500), l(-0.562500)\nmul r2.w, r1.z, r1.w\nmov r2.x, r8.z\nmov r2.y, r9.z\nmad r2.xyz, r2.xyzx, r2.wwww, r4.xyzx\nmad r0.w, r1.w, r1.z, r0.w\ndp2 r6.x, r5.zwzz, r11.xyxx\nmul r1.zw, r12.xxxy, r6.xxxw\ndp2 r1.z, r1.zwzz, r1.zwzz\nmin r1.z, r0.z, r1.z\nmad r1.w, r1.z, l(0.400000), l(-1.000000)\nmad r1.z, r12.z, r1.z, l(-1.000000)\nmul r1.zw, r1.zzzw, r1.zzzw\nmad r1.w, r1.w, l(1.562500), l(-0.562500)\nmul r2.w, r1.z, r1.w\nmad r2.xyz, r13.xyzx, r2.wwww, r2.xyzx\nmad r0.w, r1.w, r1.z, r0.w\nadd r4.xyzw, -r0.xyxy, l(1.000000, 2.000000, 0.000000, 2.000000)\ndp2 r5.y, r4.xyxx, r11.xyxx\nmul r0.xy, r11.xxxx, r4.ywyy\nmad r5.zw, r4.xxxz, -r11.yyyy, r0.xxxy\nmul r0.xy, r12.xyxx, r5.yzyy\ndp2 r0.x, r0.xyxx, r0.xyxx\nmin r0.x, r0.z, r0.x\nmad r0.y, r0.x, l(0.400000), l(-1.000000)\nmad r0.x, r12.z, r0.x, l(-1.000000)\nmul r0.xy, r0.xyxx, r0.xyxx\nmad r0.y, r0.y, l(1.562500), l(-0.562500)\nmul r1.z, r0.x, r0.y\nmov r10.x, r1.x\nmov r10.y, r3.z\nmad r1.xzw, r10.xxyz, r1.zzzz, r2.xxyz\nmad r0.x, r0.y, r0.x, r0.w\ndp2 r5.x, r4.zwzz, r11.xyxx\nmul r0.yw, r12.xxxy, r5.xxxw\ndp2 r0.y, r0.ywyy, r0.ywyy\nmin r0.y, r0.z, r0.y\nmad r0.z, r0.y, l(0.400000), l(-1.000000)\nmad r0.y, r12.z, r0.y, l(-1.000000)\nmul r0.yz, r0.yyzy, r0.yyzy\nmad r0.z, r0.z, l(1.562500), l(-0.562500)\nmul r0.w, r0.y, r0.z\nmov r10.x, r1.y\nmov r10.y, r3.w\nmad r1.xyz, r10.xywx, r0.wwww, r1.xzwx\nmad r0.x, r0.z, r0.y, r0.x\nrcp r0.x, r0.x\nmul r0.xyz, r0.xxxx, r1.xyzx\nmax r0.xyz, r0.xyzx, r16.xyzx\nmin o0.xyz, r0.xyzx, r19.xyzx\nmov o0.w, l(1.000000)\nret \n// Approximately 299 instruction slots used\n#endif\n\nconst BYTE guest_output_ffx_fsr_easu_ps[] =\n{\n     68,  88,  66,  67, 104, 250, \n    195,  52, 200, 111, 243, 238, \n      6, 142, 244,  87,  56, 133, \n     88,  21,   1,   0,   0,   0, \n    236,  40,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     36,   2,   0,   0,  88,   2, \n      0,   0, 140,   2,   0,   0, \n     80,  40,   0,   0,  82,  68, \n     69,  70, 232,   1,   0,   0, \n      1,   0,   0,   0, 236,   0, \n      0,   0,   3,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n    255, 255,   0,   5,   0,   0, \n    191,   1,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    180,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 200,   0, \n      0,   0,   2,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  12,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 219,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    120, 101,  95, 102, 115, 114, \n     95, 101,  97, 115, 117,  95, \n    115,  97, 109, 112, 108, 101, \n    114,   0, 120, 101,  95, 102, \n    115, 114,  95, 101,  97, 115, \n    117,  95, 115, 111, 117, 114, \n     99, 101,   0, 112, 117, 115, \n    104,  95,  99, 111, 110, 115, \n    116, 115,  95, 120, 101,   0, \n    171, 171, 219,   0,   0,   0, \n      2,   0,   0,   0,   4,   1, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  84,   1,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,   2,   0,   0,   0, \n    128,   1,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    164,   1,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      2,   0,   0,   0, 128,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 120, 101, \n     95, 102, 115, 114,  95, 101, \n     97, 115, 117,  95, 105, 110, \n    112, 117, 116,  95, 111, 117, \n    116, 112, 117, 116,  95, 115, \n    105, 122, 101,  95, 114,  97, \n    116, 105, 111,   0, 102, 108, \n    111,  97, 116,  50,   0, 171, \n      1,   0,   3,   0,   1,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 120,   1,   0,   0, \n    120, 101,  95, 102, 115, 114, \n     95, 101,  97, 115, 117,  95, \n    105, 110, 112, 117, 116,  95, \n    115, 105, 122, 101,  95, 105, \n    110, 118,   0,  77, 105,  99, \n    114, 111, 115, 111, 102, 116, \n     32,  40,  82,  41,  32,  72, \n     76,  83,  76,  32,  83, 104, \n     97, 100, 101, 114,  32,  67, \n    111, 109, 112, 105, 108, 101, \n    114,  32,  49,  48,  46,  49, \n      0, 171,  73,  83,  71,  78, \n     44,   0,   0,   0,   1,   0, \n      0,   0,   8,   0,   0,   0, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,  15,   3,   0,   0, \n     83,  86,  95,  80, 111, 115, \n    105, 116, 105, 111, 110,   0, \n     79,  83,  71,  78,  44,   0, \n      0,   0,   1,   0,   0,   0, \n      8,   0,   0,   0,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n     15,   0,   0,   0,  83,  86, \n     95,  84,  97, 114, 103, 101, \n    116,   0, 171, 171,  83,  72, \n     69,  88, 188,  37,   0,   0, \n     81,   0,   0,   0, 111,   9, \n      0,   0, 106,   8,   0,   1, \n     89,   0,   0,   7,  70, 142, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  90,   0, \n      0,   6,  70, 110,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  88,  24, \n      0,   7,  70, 126,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     85,  85,   0,   0,   0,   0, \n      0,   0, 100,  32,   0,   4, \n     50,  16,  16,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n    101,   0,   0,   3, 242,  32, \n     16,   0,   0,   0,   0,   0, \n    104,   0,   0,   2,  22,   0, \n      0,   0,  56,   0,   0,   9, \n    130,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0, 128,  64,  58, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  50,   0,   0,  17, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0, 191,   0,   0, \n      0, 191,   0,   0,   0,   0, \n      0,   0,   0,   0,  56,   0, \n      0,  12, 114,   0,  16,   0, \n      1,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128,  63, \n      0,   0, 128,  63,   0,   0, \n    128, 191,   0,   0,   0,   0, \n    230, 139,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  28,   0, \n      0,   5,  50,   0,  16,   0, \n      2,   0,   0,   0,  70,  16, \n     16,   0,   0,   0,   0,   0, \n     86,   0,   0,   5,  50,   0, \n     16,   0,   2,   0,   0,   0, \n     70,   0,  16,   0,   2,   0, \n      0,   0,  50,   0,   0,  11, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,  70, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      0,   0,   0,   0,  65,   0, \n      0,   5,  50,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   8,  50,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16, 128, \n     65,   0,   0,   0,   2,   0, \n      0,   0,  50,   0,   0,   9, \n     50,   0,  16,   0,   1,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n    134,   0,  16,   0,   1,   0, \n      0,   0,  50,   0,   0,  14, \n    242,   0,  16,   0,   2,   0, \n      0,   0, 230, 142,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128, 191,   0,   0,   0,  64, \n      0,   0, 128,  63,   0,   0, \n      0,  64,  70,   4,  16,   0, \n      1,   0,   0,   0,  54,   0, \n      0,   5,  66,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   7, 194,   0, \n     16,   0,   0,   0,   0,   0, \n    166,  14,  16,   0,   0,   0, \n      0,   0,   6,   4,  16,   0, \n      1,   0,   0,   0, 109,   0, \n      0,  11, 194,   0,  16,   0, \n      1,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n    230, 116,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     10,  96,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    109,   0,   0,  11,  50,   0, \n     16,   0,   3,   0,   0,   0, \n     70,   0,  16,   0,   1,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  26,  96,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 109,   0,   0,  11, \n     82,   0,  16,   0,   4,   0, \n      0,   0,  70,   0,  16,   0, \n      1,   0,   0,   0, 134, 125, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  42,  96, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 109,   0, \n      0,  11, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,   0, \n     16,   0,   2,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     10,  96,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    109,   0,   0,  11, 242,   0, \n     16,   0,   6,   0,   0,   0, \n     70,   0,  16,   0,   2,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  26,  96,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 109,   0,   0,  11, \n    242,   0,  16,   0,   7,   0, \n      0,   0,  70,   0,  16,   0, \n      2,   0,   0,   0, 150, 124, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  42,  96, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 109,   0, \n      0,  11, 242,   0,  16,   0, \n      8,   0,   0,   0, 230,  10, \n     16,   0,   2,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     10,  96,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    109,   0,   0,  11, 242,   0, \n     16,   0,   9,   0,   0,   0, \n    230,  10,  16,   0,   2,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  26,  96,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 109,   0,   0,  11, \n    242,   0,  16,   0,   2,   0, \n      0,   0, 230,  10,  16,   0, \n      2,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  42,  96, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 109,   0, \n      0,  11,  50,   0,  16,   0, \n      1,   0,   0,   0, 230,  10, \n     16,   0,   0,   0,   0,   0, \n    230, 116,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     10,  96,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    109,   0,   0,  11, 194,   0, \n     16,   0,   3,   0,   0,   0, \n    230,  10,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  26,  96,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 109,   0,   0,  11, \n    194,   0,  16,   0,  10,   0, \n      0,   0, 230,  10,  16,   0, \n      0,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  42,  96, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  50,   0, \n      0,  12, 194,   0,  16,   0, \n      0,   0,   0,   0, 166,  14, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,  63,   0,   0, \n      0,  63,   6,   4,  16,   0, \n      3,   0,   0,   0,  50,   0, \n      0,  12, 194,   0,  16,   0, \n      0,   0,   0,   0,   6,   8, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,  63,   0,   0, \n      0,  63, 166,  14,  16,   0, \n      0,   0,   0,   0,  50,   0, \n      0,  12, 242,   0,  16,   0, \n     11,   0,   0,   0, 230,   1, \n     16,   0,   5,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,  63, 230,   1,  16,   0, \n      6,   0,   0,   0,  50,   0, \n      0,  12, 242,   0,  16,   0, \n     11,   0,   0,   0, 214,   8, \n     16,   0,   7,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,  63,  70,  14,  16,   0, \n     11,   0,   0,   0,  50,   0, \n      0,  12, 242,   0,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,   8,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,  63,  70,  14,  16,   0, \n      9,   0,   0,   0,  50,   0, \n      0,  12, 242,   0,  16,   0, \n     12,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,  63,   0,   0, \n      0,  63,  70,  14,  16,   0, \n     12,   0,   0,   0,  50,   0, \n      0,  12,  50,   0,  16,   0, \n     13,   0,   0,   0,  70,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 230,  10,  16,   0, \n      3,   0,   0,   0,  50,   0, \n      0,  12,  50,   0,  16,   0, \n     13,   0,   0,   0, 230,  10, \n     16,   0,  10,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  63,   0,   0,   0,  63, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n     13,   0,   0,   0,   0,   0, \n      0,  11, 242,   0,  16,   0, \n     14,   0,   0,   0,  70,   4, \n     16, 128,  65,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128,  63, \n      0,   0, 128,  63,   0,   0, \n      0,   0,   0,   0, 128, 191, \n     56,   0,   0,   7, 130,   0, \n     16,   0,   4,   0,   0,   0, \n     26,   0,  16,   0,  14,   0, \n      0,   0,  10,   0,  16,   0, \n     14,   0,   0,   0,   0,   0, \n      0,   8, 242,   0,  16,   0, \n     15,   0,   0,   0,  70,   8, \n     16, 128,  65,   0,   0,   0, \n     11,   0,   0,   0, 246,   2, \n     16,   0,  12,   0,   0,   0, \n      0,   0,   0,   8, 114,   0, \n     16,   0,  16,   0,   0,   0, \n     22,   7,  16, 128,  65,   0, \n      0,   0,  11,   0,   0,   0, \n    134,   2,  16,   0,  11,   0, \n      0,   0,  52,   0,   0,   9, \n    194,   0,  16,   0,  13,   0, \n      0,   0,   6,  12,  16, 128, \n    129,   0,   0,   0,  15,   0, \n      0,   0,   6,   8,  16, 128, \n    129,   0,   0,   0,  16,   0, \n      0,   0,  30,   0,   0,  11, \n    194,   0,  16,   0,  13,   0, \n      0,   0, 166,  14,  16, 128, \n     65,   0,   0,   0,  13,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 187, 126, 240, 126, \n    187, 126, 240, 126,  56,  32, \n      0,   8,  34,   0,  16,   0, \n     11,   0,   0,   0,  42,   0, \n     16,   0,  13,   0,   0,   0, \n     26,   0,  16, 128, 129,   0, \n      0,   0,  15,   0,   0,   0, \n     56,   0,   0,   7,  34,   0, \n     16,   0,  11,   0,   0,   0, \n     26,   0,  16,   0,  11,   0, \n      0,   0,  26,   0,  16,   0, \n     11,   0,   0,   0,   0,   0, \n      0,   8,  82,   0,  16,   0, \n     16,   0,   0,   0, 166,  10, \n     16, 128,  65,   0,   0,   0, \n      0,   0,   0,   0,   6,   2, \n     16,   0,  11,   0,   0,   0, \n     52,   0,   0,   9,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16, 128, 129,   0, \n      0,   0,  16,   0,   0,   0, \n     26,   0,  16, 128, 129,   0, \n      0,   0,  16,   0,   0,   0, \n     30,   0,   0,   8,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16, 128,  65,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0, 187, 126, \n    240, 126,  56,  32,   0,   8, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16, 128, 129,   0,   0,   0, \n     16,   0,   0,   0,  56,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  56,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     50,   0,   0,   9,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,  11,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     56,   0,   0,   7,  50,   0, \n     16,   0,  14,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0,  22,   5,  16,   0, \n     14,   0,   0,   0,   0,   0, \n      0,   8, 114,   0,  16,   0, \n     17,   0,   0,   0, 246,  12, \n     16, 128,  65,   0,   0,   0, \n     12,   0,   0,   0,  38,   9, \n     16,   0,  12,   0,   0,   0, \n     52,   0,   0,   9, 146,   0, \n     16,   0,  15,   0,   0,   0, \n      6,  12,  16, 128, 129,   0, \n      0,   0,  15,   0,   0,   0, \n      6,   8,  16, 128, 129,   0, \n      0,   0,  17,   0,   0,   0, \n     30,   0,   0,  11, 146,   0, \n     16,   0,  15,   0,   0,   0, \n      6,  12,  16, 128,  65,   0, \n      0,   0,  15,   0,   0,   0, \n      2,  64,   0,   0, 187, 126, \n    240, 126,   0,   0,   0,   0, \n      0,   0,   0,   0, 187, 126, \n    240, 126,  56,   0,   0,   7, \n     34,   0,  16,   0,  11,   0, \n      0,   0,  10,   0,  16,   0, \n     14,   0,   0,   0,  42,   0, \n     16,   0,  15,   0,   0,   0, \n     50,   0,   0,   9,  34,   0, \n     16,   0,  11,   0,   0,   0, \n     26,   0,  16,   0,  15,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,  26,   0, \n     16,   0,  11,   0,   0,   0, \n     56,  32,   0,   8,  66,   0, \n     16,   0,  12,   0,   0,   0, \n     10,   0,  16,   0,  15,   0, \n      0,   0,  42,   0,  16, 128, \n    129,   0,   0,   0,  15,   0, \n      0,   0,  56,   0,   0,   7, \n     66,   0,  16,   0,  12,   0, \n      0,   0,  42,   0,  16,   0, \n     12,   0,   0,   0,  42,   0, \n     16,   0,  12,   0,   0,   0, \n     50,   0,   0,   9,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,  12,   0, \n      0,   0,  10,   0,  16,   0, \n     14,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   8,  50,   0, \n     16,   0,  15,   0,   0,   0, \n    246,  15,  16, 128,  65,   0, \n      0,   0,   0,   0,   0,   0, \n     54,  15,  16,   0,  12,   0, \n      0,   0,  52,   0,   0,   9, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16, 128, \n    129,   0,   0,   0,  15,   0, \n      0,   0,  26,   0,  16, 128, \n    129,   0,   0,   0,  17,   0, \n      0,   0,  30,   0,   0,   8, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16, 128, \n     65,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n    187, 126, 240, 126,  56,   0, \n      0,   7,  66,   0,  16,   0, \n     12,   0,   0,   0,  10,   0, \n     16,   0,  14,   0,   0,   0, \n     26,   0,  16,   0,  15,   0, \n      0,   0,  50,   0,   0,   9, \n    130,   0,  16,   0,   4,   0, \n      0,   0,  42,   0,  16,   0, \n     16,   0,   0,   0,  58,   0, \n     16,   0,   4,   0,   0,   0, \n     42,   0,  16,   0,  12,   0, \n      0,   0,  56,  32,   0,   8, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16, 128, 129,   0,   0,   0, \n     15,   0,   0,   0,  56,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  50,   0,   0,   9, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,  14,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   8, \n     98,   0,  16,   0,  12,   0, \n      0,   0, 246,  14,  16, 128, \n     65,   0,   0,   0,  11,   0, \n      0,   0,   6,   1,  16,   0, \n     12,   0,   0,   0,  50,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,  14,   0, \n      0,   0,  26,   0,  16,   0, \n     11,   0,   0,   0,  56,  32, \n      0,   8,  34,   0,  16,   0, \n     11,   0,   0,   0,  58,   0, \n     16,   0,  13,   0,   0,   0, \n     26,   0,  16, 128, 129,   0, \n      0,   0,  12,   0,   0,   0, \n     56,   0,   0,   7,  34,   0, \n     16,   0,  11,   0,   0,   0, \n     26,   0,  16,   0,  11,   0, \n      0,   0,  26,   0,  16,   0, \n     11,   0,   0,   0,  50,   0, \n      0,   9,  66,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,  11,   0,   0,   0, \n     26,   0,  16,   0,  14,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   8,  50,   0,  16,   0, \n     11,   0,   0,   0,  38,  10, \n     16, 128,  65,   0,   0,   0, \n     11,   0,   0,   0,  86,   5, \n     16,   0,  13,   0,   0,   0, \n     52,   0,   0,   9,  18,   0, \n     16,   0,  11,   0,   0,   0, \n     26,   0,  16, 128, 129,   0, \n      0,   0,  16,   0,   0,   0, \n     10,   0,  16, 128, 129,   0, \n      0,   0,  11,   0,   0,   0, \n     30,   0,   0,   8,  18,   0, \n     16,   0,  11,   0,   0,   0, \n     10,   0,  16, 128,  65,   0, \n      0,   0,  11,   0,   0,   0, \n      1,  64,   0,   0, 187, 126, \n    240, 126,  50,   0,   0,   9, \n    130,   0,  16,   0,   4,   0, \n      0,   0,  26,   0,  16,   0, \n     11,   0,   0,   0,  26,   0, \n     16,   0,  14,   0,   0,   0, \n     58,   0,  16,   0,   4,   0, \n      0,   0,  56,  32,   0,   8, \n     18,   0,  16,   0,  11,   0, \n      0,   0,  10,   0,  16,   0, \n     11,   0,   0,   0,  26,   0, \n     16, 128, 129,   0,   0,   0, \n     11,   0,   0,   0,  56,   0, \n      0,   7,  18,   0,  16,   0, \n     11,   0,   0,   0,  10,   0, \n     16,   0,  11,   0,   0,   0, \n     10,   0,  16,   0,  11,   0, \n      0,   0,  50,   0,   0,   9, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n     11,   0,   0,   0,  26,   0, \n     16,   0,  14,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  56,   0,   0,   7, \n     18,   0,  16,   0,  11,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     50,   0,   0,   9,  34,   0, \n     16,   0,  15,   0,   0,   0, \n     42,   0,  16,   0,  12,   0, \n      0,   0,  10,   0,  16,   0, \n     11,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     56,  32,   0,   8, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,  15,   0, \n      0,   0,  42,   0,  16, 128, \n    129,   0,   0,   0,  12,   0, \n      0,   0,  56,   0,   0,   7, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     50,   0,   0,   9,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n     11,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n      0,   0,   0,   8,  98,   0, \n     16,   0,  11,   0,   0,   0, \n      6,   3,  16, 128,  65,   0, \n      0,   0,  12,   0,   0,   0, \n      6,   0,  16,   0,  13,   0, \n      0,   0,  52,   0,   0,   9, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16, 128, \n    129,   0,   0,   0,  17,   0, \n      0,   0,  26,   0,  16, 128, \n    129,   0,   0,   0,  11,   0, \n      0,   0,  30,   0,   0,   8, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16, 128, \n     65,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n    187, 126, 240, 126,  50,   0, \n      0,   9,  66,   0,  16,   0, \n     15,   0,   0,   0,  42,   0, \n     16,   0,  11,   0,   0,   0, \n     10,   0,  16,   0,  11,   0, \n      0,   0,  58,   0,  16,   0, \n      4,   0,   0,   0,  56,  32, \n      0,   8, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16, 128, 129,   0, \n      0,   0,  11,   0,   0,   0, \n     56,   0,   0,   7, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  50,   0, \n      0,   9,  66,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,  11,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  56,   0, \n      0,   7,  50,   0,  16,   0, \n     11,   0,   0,   0, 150,   5, \n     16,   0,  15,   0,   0,   0, \n    150,   5,  16,   0,  15,   0, \n      0,   0,   0,   0,   0,   7, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n     11,   0,   0,   0,  10,   0, \n     16,   0,  11,   0,   0,   0, \n     49,   0,   0,   7, 130,   0, \n     16,   0,   4,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0,   0,  56,  85,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  30,   0,   0,   8, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16, 128, \n     65,   0,   0,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n    116, 125,  52,  95,  55,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   4,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n    128,  63,  58,   0,  16,   0, \n      0,   0,   0,   0,  55,   0, \n      0,   9,  18,   0,  16,   0, \n     15,   0,   0,   0,  58,   0, \n     16,   0,   4,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n    128,  63,  26,   0,  16,   0, \n     15,   0,   0,   0,  56,   0, \n      0,   7,  50,   0,  16,   0, \n     11,   0,   0,   0, 246,  15, \n     16,   0,   0,   0,   0,   0, \n    134,   0,  16,   0,  15,   0, \n      0,   0,  56,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,  63, \n     56,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  15,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,  11,   0,   0,   0, \n     70,   0,  16,   0,  11,   0, \n      0,   0,  52,   0,   0,   9, \n    130,   0,  16,   0,   4,   0, \n      0,   0,  26,   0,  16, 128, \n    129,   0,   0,   0,  11,   0, \n      0,   0,  10,   0,  16, 128, \n    129,   0,   0,   0,  11,   0, \n      0,   0,  30,   0,   0,   8, \n    130,   0,  16,   0,   4,   0, \n      0,   0,  58,   0,  16, 128, \n     65,   0,   0,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n    187, 126, 240, 126,  50,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0, 128, 191,  50,   0, \n      0,   9,  18,   0,  16,   0, \n     12,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0, 128,  63,  50,   0, \n      0,  15,  98,   0,  16,   0, \n     12,   0,   0,   0, 166,  10, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0, 191, \n    225, 122, 148, 190,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    128,  63,   0,   0,   0,  63, \n      0,   0,   0,   0,  30,   0, \n      0,   8,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16, 128,  65,   0,   0,   0, \n     12,   0,   0,   0,   1,  64, \n      0,   0, 187, 126, 240, 126, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  13,   0,   0,   0, \n     58,   0,  16,   0,   8,   0, \n      0,   0,  54,   0,   0,   5, \n     34,   0,  16,   0,  13,   0, \n      0,   0,  58,   0,  16,   0, \n      9,   0,   0,   0,  54,   0, \n      0,   5,  66,   0,  16,   0, \n     13,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  15,   0,   0,   0, \n     26,   0,  16,   0,   5,   0, \n      0,   0,  54,   0,   0,   5, \n     34,   0,  16,   0,  15,   0, \n      0,   0,  26,   0,  16,   0, \n      6,   0,   0,   0,  54,   0, \n      0,   5,  66,   0,  16,   0, \n     15,   0,   0,   0,  10,   0, \n     16,   0,   7,   0,   0,   0, \n     51,   0,   0,   7, 114,   0, \n     16,   0,  16,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n     17,   0,   0,   0,  42,   0, \n     16,   0,   5,   0,   0,   0, \n     54,   0,   0,   5,  34,   0, \n     16,   0,  17,   0,   0,   0, \n     42,   0,  16,   0,   6,   0, \n      0,   0,  54,   0,   0,   5, \n     66,   0,  16,   0,  17,   0, \n      0,   0,  26,   0,  16,   0, \n      7,   0,   0,   0,  51,   0, \n      0,   7, 114,   0,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  16,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  18,   0, \n      0,   0,  10,   0,  16,   0, \n      8,   0,   0,   0,  54,   0, \n      0,   5,  34,   0,  16,   0, \n     18,   0,   0,   0,  10,   0, \n     16,   0,   9,   0,   0,   0, \n     54,   0,   0,   5,  66,   0, \n     16,   0,  18,   0,   0,   0, \n     10,   0,  16,   0,   2,   0, \n      0,   0,  51,   0,   0,   7, \n    114,   0,  16,   0,  16,   0, \n      0,   0,  70,   2,  16,   0, \n     16,   0,   0,   0,  70,   2, \n     16,   0,  18,   0,   0,   0, \n     52,   0,   0,   7, 114,   0, \n     16,   0,  19,   0,   0,   0, \n     70,   2,  16,   0,  13,   0, \n      0,   0,  70,   2,  16,   0, \n     15,   0,   0,   0,  52,   0, \n      0,   7, 114,   0,  16,   0, \n     19,   0,   0,   0,  70,   2, \n     16,   0,  17,   0,   0,   0, \n     70,   2,  16,   0,  19,   0, \n      0,   0,  52,   0,   0,   7, \n    114,   0,  16,   0,  19,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n     15,   0,   0,   7,  18,   0, \n     16,   0,  14,   0,   0,   0, \n    230,  10,  16,   0,  14,   0, \n      0,   0,  70,   0,  16,   0, \n     11,   0,   0,   0,  56,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,  11,   0,   0,   0, \n     58,   0,  16,   0,  14,   0, \n      0,   0,  50,   0,   0,  10, \n     34,   0,  16,   0,  14,   0, \n      0,   0,  42,   0,  16,   0, \n     14,   0,   0,   0,  26,   0, \n     16, 128,  65,   0,   0,   0, \n     11,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     56,   0,   0,   7,  98,   0, \n     16,   0,   5,   0,   0,   0, \n      6,   1,  16,   0,  12,   0, \n      0,   0,   6,   1,  16,   0, \n     14,   0,   0,   0,  15,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0, 150,   5, \n     16,   0,   5,   0,   0,   0, \n    150,   5,  16,   0,   5,   0, \n      0,   0,  51,   0,   0,   7, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     50,   0,   0,   9, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n    205, 204, 204,  62,   1,  64, \n      0,   0,   0,   0, 128, 191, \n     50,   0,   0,   9, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,  12,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0, 128, 191, \n     56,   0,   0,   7, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,  56,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  50,   0,   0,   9, \n    130,   0,  16,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,   1,  64, \n      0,   0,   0,   0, 200,  63, \n      1,  64,   0,   0,   0,   0, \n     16, 191,  56,   0,   0,   7, \n    130,   0,  16,   0,   4,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  14,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  54,   0,   0,   5, \n     34,   0,  16,   0,  14,   0, \n      0,   0,  10,   0,  16,   0, \n      3,   0,   0,   0,  54,   0, \n      0,   5,  66,   0,  16,   0, \n     14,   0,   0,   0,  10,   0, \n     16,   0,   4,   0,   0,   0, \n      0,   0,   0,  11, 242,   0, \n     16,   0,  20,   0,   0,   0, \n     70,   4,  16, 128,  65,   0, \n      0,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n    128,  63,   0,   0, 128, 191, \n      0,   0, 128, 191,   0,   0, \n    128,  63,  15,   0,   0,   7, \n     34,   0,  16,   0,  21,   0, \n      0,   0,  70,   0,  16,   0, \n     20,   0,   0,   0,  70,   0, \n     16,   0,  11,   0,   0,   0, \n     56,   0,   0,   7,  98,   0, \n     16,   0,   5,   0,   0,   0, \n      6,   0,  16,   0,  11,   0, \n      0,   0,  86,   7,  16,   0, \n     20,   0,   0,   0,  50,   0, \n      0,  10, 194,   0,  16,   0, \n     21,   0,   0,   0,   6,   8, \n     16,   0,  20,   0,   0,   0, \n     86,   5,  16, 128,  65,   0, \n      0,   0,  11,   0,   0,   0, \n     86,   9,  16,   0,   5,   0, \n      0,   0,  56,   0,   0,   7, \n     98,   0,  16,   0,   5,   0, \n      0,   0,   6,   1,  16,   0, \n     12,   0,   0,   0,  86,   6, \n     16,   0,  21,   0,   0,   0, \n     15,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n    150,   5,  16,   0,   5,   0, \n      0,   0, 150,   5,  16,   0, \n      5,   0,   0,   0,  51,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  50,   0,   0,   9, \n     18,   0,  16,   0,   3,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0, 205, 204, 204,  62, \n      1,  64,   0,   0,   0,   0, \n    128, 191,  50,   0,   0,   9, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n     12,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n    128, 191,  56,   0,   0,   7, \n     18,   0,  16,   0,   3,   0, \n      0,   0,  10,   0,  16,   0, \n      3,   0,   0,   0,  10,   0, \n     16,   0,   3,   0,   0,   0, \n     56,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  50,   0, \n      0,   9,  18,   0,  16,   0, \n      3,   0,   0,   0,  10,   0, \n     16,   0,   3,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n    200,  63,   1,  64,   0,   0, \n      0,   0,  16, 191,  56,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     10,   0,  16,   0,   3,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   4,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  54,   0, \n      0,   5,  34,   0,  16,   0, \n      4,   0,   0,   0,  26,   0, \n     16,   0,   3,   0,   0,   0, \n     56,   0,   0,   7, 114,   0, \n     16,   0,   4,   0,   0,   0, \n    166,  10,  16,   0,   1,   0, \n      0,   0,  70,   2,  16,   0, \n      4,   0,   0,   0,  50,   0, \n      0,   9, 114,   0,  16,   0, \n      4,   0,   0,   0,  70,   2, \n     16,   0,  14,   0,   0,   0, \n    246,  15,  16,   0,   4,   0, \n      0,   0,  70,   2,  16,   0, \n      4,   0,   0,   0,  50,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  15,   0, \n      0,   7,  18,   0,  16,   0, \n     21,   0,   0,   0, 230,  10, \n     16,   0,  20,   0,   0,   0, \n     70,   0,  16,   0,  11,   0, \n      0,   0,  56,   0,   0,   7, \n    194,   0,  16,   0,   1,   0, \n      0,   0,   6,   4,  16,   0, \n     12,   0,   0,   0,   6,  12, \n     16,   0,  21,   0,   0,   0, \n     15,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n    230,  10,  16,   0,   1,   0, \n      0,   0, 230,  10,  16,   0, \n      1,   0,   0,   0,  51,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  50,   0,   0,   9, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0, 205, 204, 204,  62, \n      1,  64,   0,   0,   0,   0, \n    128, 191,  50,   0,   0,   9, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n     12,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n    128, 191,  56,   0,   0,   7, \n    194,   0,  16,   0,   1,   0, \n      0,   0, 166,  14,  16,   0, \n      1,   0,   0,   0, 166,  14, \n     16,   0,   1,   0,   0,   0, \n     50,   0,   0,   9, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0, 200,  63,   1,  64, \n      0,   0,   0,   0,  16, 191, \n     56,   0,   0,   7, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  54,   0, \n      0,   5,  18,   0,  16,   0, \n      7,   0,   0,   0,  10,   0, \n     16,   0,   5,   0,   0,   0, \n     54,   0,   0,   5,  34,   0, \n     16,   0,   7,   0,   0,   0, \n     10,   0,  16,   0,   6,   0, \n      0,   0,  50,   0,   0,   9, \n    114,   0,  16,   0,   4,   0, \n      0,   0,  70,   2,  16,   0, \n      7,   0,   0,   0, 246,  15, \n     16,   0,   2,   0,   0,   0, \n     70,   2,  16,   0,   4,   0, \n      0,   0,  50,   0,   0,   9, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,  11, \n    242,   0,  16,   0,  14,   0, \n      0,   0,  70,   4,  16, 128, \n     65,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    128,  63,   0,   0, 128, 191, \n      0,   0,   0,   0,  15,   0, \n      0,   7,  34,   0,  16,   0, \n     20,   0,   0,   0,  70,   0, \n     16,   0,  14,   0,   0,   0, \n     70,   0,  16,   0,  11,   0, \n      0,   0,  56,   0,   0,   7, \n    194,   0,  16,   0,   1,   0, \n      0,   0,   6,   0,  16,   0, \n     11,   0,   0,   0,  86,  13, \n     16,   0,  14,   0,   0,   0, \n     50,   0,   0,  10, 194,   0, \n     16,   0,  20,   0,   0,   0, \n      6,   8,  16,   0,  14,   0, \n      0,   0,  86,   5,  16, 128, \n     65,   0,   0,   0,  11,   0, \n      0,   0, 166,  14,  16,   0, \n      1,   0,   0,   0,  56,   0, \n      0,   7, 194,   0,  16,   0, \n      1,   0,   0,   0,   6,   4, \n     16,   0,  12,   0,   0,   0, \n     86,   9,  16,   0,  20,   0, \n      0,   0,  15,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0, 230,  10,  16,   0, \n      1,   0,   0,   0, 230,  10, \n     16,   0,   1,   0,   0,   0, \n     51,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  50,   0, \n      0,   9, 130,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0, 205, 204, \n    204,  62,   1,  64,   0,   0, \n      0,   0, 128, 191,  50,   0, \n      0,   9,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,  12,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0, 128, 191,  56,   0, \n      0,   7, 194,   0,  16,   0, \n      1,   0,   0,   0, 166,  14, \n     16,   0,   1,   0,   0,   0, \n    166,  14,  16,   0,   1,   0, \n      0,   0,  50,   0,   0,   9, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   0,   0, 200,  63, \n      1,  64,   0,   0,   0,   0, \n     16, 191,  56,   0,   0,   7, \n    130,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     50,   0,   0,   9, 114,   0, \n     16,   0,   4,   0,   0,   0, \n     70,   2,  16,   0,  15,   0, \n      0,   0, 246,  15,  16,   0, \n      2,   0,   0,   0,  70,   2, \n     16,   0,   4,   0,   0,   0, \n     50,   0,   0,   9, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     15,   0,   0,   8,  18,   0, \n     16,   0,   3,   0,   0,   0, \n     70,   0,  16, 128,  65,   0, \n      0,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,  11,   0, \n      0,   0,  56,   0,   0,   8, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  26,   0,  16, 128, \n     65,   0,   0,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n     11,   0,   0,   0,  50,   0, \n      0,   9,  34,   0,  16,   0, \n      3,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,  11,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  56,   0, \n      0,   7, 194,   0,  16,   0, \n      1,   0,   0,   0,   6,   4, \n     16,   0,  12,   0,   0,   0, \n      6,   4,  16,   0,   3,   0, \n      0,   0,  15,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0, 230,  10,  16,   0, \n      1,   0,   0,   0, 230,  10, \n     16,   0,   1,   0,   0,   0, \n     51,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  50,   0, \n      0,   9, 130,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0, 205, 204, \n    204,  62,   1,  64,   0,   0, \n      0,   0, 128, 191,  50,   0, \n      0,   9,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,  12,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0, 128, 191,  56,   0, \n      0,   7, 194,   0,  16,   0, \n      1,   0,   0,   0, 166,  14, \n     16,   0,   1,   0,   0,   0, \n    166,  14,  16,   0,   1,   0, \n      0,   0,  50,   0,   0,   9, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   0,   0, 200,  63, \n      1,  64,   0,   0,   0,   0, \n     16, 191,  56,   0,   0,   7, \n    130,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     50,   0,   0,   9, 114,   0, \n     16,   0,   4,   0,   0,   0, \n     70,   2,  16,   0,  17,   0, \n      0,   0, 246,  15,  16,   0, \n      2,   0,   0,   0,  70,   2, \n     16,   0,   4,   0,   0,   0, \n     50,   0,   0,   9, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     15,   0,   0,   7,  18,   0, \n     16,   0,  20,   0,   0,   0, \n    230,  10,  16,   0,  14,   0, \n      0,   0,  70,   0,  16,   0, \n     11,   0,   0,   0,  56,   0, \n      0,   7, 194,   0,  16,   0, \n      1,   0,   0,   0,   6,   4, \n     16,   0,  12,   0,   0,   0, \n      6,  12,  16,   0,  20,   0, \n      0,   0,  15,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0, 230,  10,  16,   0, \n      1,   0,   0,   0, 230,  10, \n     16,   0,   1,   0,   0,   0, \n     51,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  50,   0, \n      0,   9, 130,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0, 205, 204, \n    204,  62,   1,  64,   0,   0, \n      0,   0, 128, 191,  50,   0, \n      0,   9,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,  12,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0, 128, 191,  56,   0, \n      0,   7, 194,   0,  16,   0, \n      1,   0,   0,   0, 166,  14, \n     16,   0,   1,   0,   0,   0, \n    166,  14,  16,   0,   1,   0, \n      0,   0,  50,   0,   0,   9, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   0,   0, 200,  63, \n      1,  64,   0,   0,   0,   0, \n     16, 191,  56,   0,   0,   7, \n    130,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     54,   0,   0,   5,  66,   0, \n     16,   0,   7,   0,   0,   0, \n     58,   0,  16,   0,   5,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   7,   0, \n      0,   0,  58,   0,  16,   0, \n      6,   0,   0,   0,  50,   0, \n      0,   9, 114,   0,  16,   0, \n      4,   0,   0,   0,  38,  11, \n     16,   0,   7,   0,   0,   0, \n    246,  15,  16,   0,   2,   0, \n      0,   0,  70,   2,  16,   0, \n      4,   0,   0,   0,  50,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n      0,  11, 242,   0,  16,   0, \n      5,   0,   0,   0,  70,   4, \n     16, 128,  65,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128,  63, \n      0,   0, 128,  63,   0,   0, \n      0,  64,   0,   0, 128,  63, \n     15,   0,   0,   7,  34,   0, \n     16,   0,   6,   0,   0,   0, \n     70,   0,  16,   0,   5,   0, \n      0,   0,  70,   0,  16,   0, \n     11,   0,   0,   0,  56,   0, \n      0,   7, 194,   0,  16,   0, \n      1,   0,   0,   0,   6,   0, \n     16,   0,  11,   0,   0,   0, \n     86,  13,  16,   0,   5,   0, \n      0,   0,  50,   0,   0,  10, \n    194,   0,  16,   0,   6,   0, \n      0,   0,   6,   8,  16,   0, \n      5,   0,   0,   0,  86,   5, \n     16, 128,  65,   0,   0,   0, \n     11,   0,   0,   0, 166,  14, \n     16,   0,   1,   0,   0,   0, \n     56,   0,   0,   7, 194,   0, \n     16,   0,   1,   0,   0,   0, \n      6,   4,  16,   0,  12,   0, \n      0,   0,  86,   9,  16,   0, \n      6,   0,   0,   0,  15,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0, 230,  10, \n     16,   0,   1,   0,   0,   0, \n    230,  10,  16,   0,   1,   0, \n      0,   0,  51,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     50,   0,   0,   9, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n    205, 204, 204,  62,   1,  64, \n      0,   0,   0,   0, 128, 191, \n     50,   0,   0,   9,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,  12,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   0,   0, 128, 191, \n     56,   0,   0,   7, 194,   0, \n     16,   0,   1,   0,   0,   0, \n    166,  14,  16,   0,   1,   0, \n      0,   0, 166,  14,  16,   0, \n      1,   0,   0,   0,  50,   0, \n      0,   9, 130,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n    200,  63,   1,  64,   0,   0, \n      0,   0,  16, 191,  56,   0, \n      0,   7, 130,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  50,   0,   0,   9, \n    114,   0,  16,   0,   4,   0, \n      0,   0,  70,   2,  16,   0, \n     18,   0,   0,   0, 246,  15, \n     16,   0,   2,   0,   0,   0, \n     70,   2,  16,   0,   4,   0, \n      0,   0,  50,   0,   0,   9, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  15,   0,   0,   7, \n     18,   0,  16,   0,   6,   0, \n      0,   0, 230,  10,  16,   0, \n      5,   0,   0,   0,  70,   0, \n     16,   0,  11,   0,   0,   0, \n     56,   0,   0,   7, 194,   0, \n     16,   0,   1,   0,   0,   0, \n      6,   4,  16,   0,  12,   0, \n      0,   0,   6,  12,  16,   0, \n      6,   0,   0,   0,  15,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0, 230,  10, \n     16,   0,   1,   0,   0,   0, \n    230,  10,  16,   0,   1,   0, \n      0,   0,  51,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     50,   0,   0,   9, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n    205, 204, 204,  62,   1,  64, \n      0,   0,   0,   0, 128, 191, \n     50,   0,   0,   9,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,  12,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   0,   0, 128, 191, \n     56,   0,   0,   7, 194,   0, \n     16,   0,   1,   0,   0,   0, \n    166,  14,  16,   0,   1,   0, \n      0,   0, 166,  14,  16,   0, \n      1,   0,   0,   0,  50,   0, \n      0,   9, 130,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n    200,  63,   1,  64,   0,   0, \n      0,   0,  16, 191,  56,   0, \n      0,   7, 130,   0,  16,   0, \n      2,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   5,   0, \n      0,   0,  26,   0,  16,   0, \n      8,   0,   0,   0,  54,   0, \n      0,   5,  34,   0,  16,   0, \n      5,   0,   0,   0,  26,   0, \n     16,   0,   9,   0,   0,   0, \n     54,   0,   0,   5,  66,   0, \n     16,   0,   5,   0,   0,   0, \n     26,   0,  16,   0,   2,   0, \n      0,   0,  50,   0,   0,   9, \n    114,   0,  16,   0,   4,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0, 246,  15, \n     16,   0,   2,   0,   0,   0, \n     70,   2,  16,   0,   4,   0, \n      0,   0,  50,   0,   0,   9, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,  11, \n    242,   0,  16,   0,   5,   0, \n      0,   0,  70,   4,  16, 128, \n     65,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,  64,   0,   0, \n      0,   0,   0,   0, 128,  63, \n      0,   0,   0,   0,  15,   0, \n      0,   7,  34,   0,  16,   0, \n      6,   0,   0,   0,  70,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   0,  16,   0,  11,   0, \n      0,   0,  56,   0,   0,   7, \n    194,   0,  16,   0,   1,   0, \n      0,   0,   6,   0,  16,   0, \n     11,   0,   0,   0,  86,  13, \n     16,   0,   5,   0,   0,   0, \n     50,   0,   0,  10, 194,   0, \n     16,   0,   6,   0,   0,   0, \n      6,   8,  16,   0,   5,   0, \n      0,   0,  86,   5,  16, 128, \n     65,   0,   0,   0,  11,   0, \n      0,   0, 166,  14,  16,   0, \n      1,   0,   0,   0,  56,   0, \n      0,   7, 194,   0,  16,   0, \n      1,   0,   0,   0,   6,   4, \n     16,   0,  12,   0,   0,   0, \n     86,   9,  16,   0,   6,   0, \n      0,   0,  15,   0,   0,   7, \n     66,   0,  16,   0,   1,   0, \n      0,   0, 230,  10,  16,   0, \n      1,   0,   0,   0, 230,  10, \n     16,   0,   1,   0,   0,   0, \n     51,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  50,   0, \n      0,   9, 130,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0, 205, 204, \n    204,  62,   1,  64,   0,   0, \n      0,   0, 128, 191,  50,   0, \n      0,   9,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,  12,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0, 128, 191,  56,   0, \n      0,   7, 194,   0,  16,   0, \n      1,   0,   0,   0, 166,  14, \n     16,   0,   1,   0,   0,   0, \n    166,  14,  16,   0,   1,   0, \n      0,   0,  50,   0,   0,   9, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   0,   0, 200,  63, \n      1,  64,   0,   0,   0,   0, \n     16, 191,  56,   0,   0,   7, \n    130,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   8,   0, \n      0,   0,  54,   0,   0,   5, \n     34,   0,  16,   0,   2,   0, \n      0,   0,  42,   0,  16,   0, \n      9,   0,   0,   0,  50,   0, \n      0,   9, 114,   0,  16,   0, \n      2,   0,   0,   0,  70,   2, \n     16,   0,   2,   0,   0,   0, \n    246,  15,  16,   0,   2,   0, \n      0,   0,  70,   2,  16,   0, \n      4,   0,   0,   0,  50,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,  15,   0, \n      0,   7,  18,   0,  16,   0, \n      6,   0,   0,   0, 230,  10, \n     16,   0,   5,   0,   0,   0, \n     70,   0,  16,   0,  11,   0, \n      0,   0,  56,   0,   0,   7, \n    194,   0,  16,   0,   1,   0, \n      0,   0,   6,   4,  16,   0, \n     12,   0,   0,   0,   6,  12, \n     16,   0,   6,   0,   0,   0, \n     15,   0,   0,   7,  66,   0, \n     16,   0,   1,   0,   0,   0, \n    230,  10,  16,   0,   1,   0, \n      0,   0, 230,  10,  16,   0, \n      1,   0,   0,   0,  51,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  50,   0,   0,   9, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0, 205, 204, 204,  62, \n      1,  64,   0,   0,   0,   0, \n    128, 191,  50,   0,   0,   9, \n     66,   0,  16,   0,   1,   0, \n      0,   0,  42,   0,  16,   0, \n     12,   0,   0,   0,  42,   0, \n     16,   0,   1,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n    128, 191,  56,   0,   0,   7, \n    194,   0,  16,   0,   1,   0, \n      0,   0, 166,  14,  16,   0, \n      1,   0,   0,   0, 166,  14, \n     16,   0,   1,   0,   0,   0, \n     50,   0,   0,   9, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0, 200,  63,   1,  64, \n      0,   0,   0,   0,  16, 191, \n     56,   0,   0,   7, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  50,   0, \n      0,   9, 114,   0,  16,   0, \n      2,   0,   0,   0,  70,   2, \n     16,   0,  13,   0,   0,   0, \n    246,  15,  16,   0,   2,   0, \n      0,   0,  70,   2,  16,   0, \n      2,   0,   0,   0,  50,   0, \n      0,   9, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   1,   0,   0,   0, \n     42,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,   0,   0, \n      0,  11, 242,   0,  16,   0, \n      4,   0,   0,   0,  70,   4, \n     16, 128,  65,   0,   0,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128,  63, \n      0,   0,   0,  64,   0,   0, \n      0,   0,   0,   0,   0,  64, \n     15,   0,   0,   7,  34,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   0,  16,   0,   4,   0, \n      0,   0,  70,   0,  16,   0, \n     11,   0,   0,   0,  56,   0, \n      0,   7,  50,   0,  16,   0, \n      0,   0,   0,   0,   6,   0, \n     16,   0,  11,   0,   0,   0, \n    214,   5,  16,   0,   4,   0, \n      0,   0,  50,   0,   0,  10, \n    194,   0,  16,   0,   5,   0, \n      0,   0,   6,   8,  16,   0, \n      4,   0,   0,   0,  86,   5, \n     16, 128,  65,   0,   0,   0, \n     11,   0,   0,   0,   6,   4, \n     16,   0,   0,   0,   0,   0, \n     56,   0,   0,   7,  50,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,  12,   0, \n      0,   0, 150,   5,  16,   0, \n      5,   0,   0,   0,  15,   0, \n      0,   7,  18,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0,  51,   0,   0,   7, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     50,   0,   0,   9,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n    205, 204, 204,  62,   1,  64, \n      0,   0,   0,   0, 128, 191, \n     50,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,  12,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0, 128, 191, \n     56,   0,   0,   7,  50,   0, \n     16,   0,   0,   0,   0,   0, \n     70,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      0,   0,   0,   0,  50,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n    200,  63,   1,  64,   0,   0, \n      0,   0,  16, 191,  56,   0, \n      0,   7,  66,   0,  16,   0, \n      1,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,  10,   0, \n      0,   0,  10,   0,  16,   0, \n      1,   0,   0,   0,  54,   0, \n      0,   5,  34,   0,  16,   0, \n     10,   0,   0,   0,  42,   0, \n     16,   0,   3,   0,   0,   0, \n     50,   0,   0,   9, 210,   0, \n     16,   0,   1,   0,   0,   0, \n      6,   9,  16,   0,  10,   0, \n      0,   0, 166,  10,  16,   0, \n      1,   0,   0,   0,   6,   9, \n     16,   0,   2,   0,   0,   0, \n     50,   0,   0,   9,  18,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n     15,   0,   0,   7,  18,   0, \n     16,   0,   5,   0,   0,   0, \n    230,  10,  16,   0,   4,   0, \n      0,   0,  70,   0,  16,   0, \n     11,   0,   0,   0,  56,   0, \n      0,   7, 162,   0,  16,   0, \n      0,   0,   0,   0,   6,   4, \n     16,   0,  12,   0,   0,   0, \n      6,  12,  16,   0,   5,   0, \n      0,   0,  15,   0,   0,   7, \n     34,   0,  16,   0,   0,   0, \n      0,   0, 214,   5,  16,   0, \n      0,   0,   0,   0, 214,   5, \n     16,   0,   0,   0,   0,   0, \n     51,   0,   0,   7,  34,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  50,   0, \n      0,   9,  66,   0,  16,   0, \n      0,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0, 205, 204, \n    204,  62,   1,  64,   0,   0, \n      0,   0, 128, 191,  50,   0, \n      0,   9,  34,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,  12,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0, 128, 191,  56,   0, \n      0,   7,  98,   0,  16,   0, \n      0,   0,   0,   0,  86,   6, \n     16,   0,   0,   0,   0,   0, \n     86,   6,  16,   0,   0,   0, \n      0,   0,  50,   0,   0,   9, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0, 200,  63, \n      1,  64,   0,   0,   0,   0, \n     16, 191,  56,   0,   0,   7, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  18,   0, \n     16,   0,  10,   0,   0,   0, \n     26,   0,  16,   0,   1,   0, \n      0,   0,  54,   0,   0,   5, \n     34,   0,  16,   0,  10,   0, \n      0,   0,  58,   0,  16,   0, \n      3,   0,   0,   0,  50,   0, \n      0,   9, 114,   0,  16,   0, \n      1,   0,   0,   0,  70,   3, \n     16,   0,  10,   0,   0,   0, \n    246,  15,  16,   0,   0,   0, \n      0,   0, 134,   3,  16,   0, \n      1,   0,   0,   0,  50,   0, \n      0,   9,  18,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n     26,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      0,   0,   0,   0, 129,   0, \n      0,   5,  18,   0,  16,   0, \n      0,   0,   0,   0,  10,   0, \n     16,   0,   0,   0,   0,   0, \n     56,   0,   0,   7, 114,   0, \n     16,   0,   0,   0,   0,   0, \n      6,   0,  16,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n      1,   0,   0,   0,  52,   0, \n      0,   7, 114,   0,  16,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,  16,   0, \n      0,   0,  51,   0,   0,   7, \n    114,  32,  16,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,  19,   0,   0,   0, \n     54,   0,   0,   5, 130,  32, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n    128,  63,  62,   0,   0,   1, \n     83,  84,  65,  84, 148,   0, \n      0,   0,  43,   1,   0,   0, \n     22,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n    239,   0,   0,   0,   9,   0, \n      0,   0,   1,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     32,   0,   0,   0,   2,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/ui/shaders/bytecode/d3d12_5_1/guest_output_ffx_fsr_rcas_dither_ps.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   int2 xe_fsr_rcas_output_offset;    // Offset:    0 Size:     8\n//   float xe_fsr_rcas_sharpness_post_setup;// Offset:    8 Size:     4\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_fsr_rcas_source                texture  float4          2d      T0             t0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// SV_Position              0   xyzw        0      POS   float   xy  \n//\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// SV_Target                0   xyzw        0   TARGET   float   xyzw\n//\nps_5_1\ndcl_globalFlags refactoringAllowed\ndcl_immediateConstantBuffer { { -0.001003, 0, 0, 0},\n                              { 0.000881, 0, 0, 0},\n                              { 0.001693, 0, 0, 0},\n                              { -0.001555, 0, 0, 0},\n                              { 0.001279, 0, 0, 0},\n                              { -0.000605, 0, 0, 0},\n                              { 0.001065, 0, 0, 0},\n                              { -0.001386, 0, 0, 0},\n                              { 0.001356, 0, 0, 0},\n                              { 0.000513, 0, 0, 0},\n                              { 0.001218, 0, 0, 0},\n                              { -0.001601, 0, 0, 0},\n                              { 0.000590, 0, 0, 0},\n                              { -0.000283, 0, 0, 0},\n                              { 0.001111, 0, 0, 0},\n                              { -0.001417, 0, 0, 0},\n                              { 0.001448, 0, 0, 0},\n                              { -0.000544, 0, 0, 0},\n                              { 0.000130, 0, 0, 0},\n                              { -0.001203, 0, 0, 0},\n                              { 0.000437, 0, 0, 0},\n                              { -0.001049, 0, 0, 0},\n                              { 0.000620, 0, 0, 0},\n                              { -0.000483, 0, 0, 0},\n                              { 0.001877, 0, 0, 0},\n                              { -0.001095, 0, 0, 0},\n                              { -0.000100, 0, 0, 0},\n                              { -0.000528, 0, 0, 0},\n                              { 0.001432, 0, 0, 0},\n                              { -0.001938, 0, 0, 0},\n                              { -0.000697, 0, 0, 0},\n                              { 0.000038, 0, 0, 0},\n                              { 0.000712, 0, 0, 0},\n                              { -0.001310, 0, 0, 0},\n                              { 0.001095, 0, 0, 0},\n                              { -0.000299, 0, 0, 0},\n                              { 0.001754, 0, 0, 0},\n                              { -0.001677, 0, 0, 0},\n                              { 0.001478, 0, 0, 0},\n                              { -0.000038, 0, 0, 0},\n                              { 0.000789, 0, 0, 0},\n                              { -0.001831, 0, 0, 0},\n                              { 0.000299, 0, 0, 0},\n                              { 0.000988, 0, 0, 0},\n                              { -0.001172, 0, 0, 0},\n                              { 0.000176, 0, 0, 0},\n                              { 0.001647, 0, 0, 0},\n                              { -0.001585, 0, 0, 0},\n                              { 0.000345, 0, 0, 0},\n                              { 0.001861, 0, 0, 0},\n                              { -0.001769, 0, 0, 0},\n                              { -0.000866, 0, 0, 0},\n                              { 0.000896, 0, 0, 0},\n                              { 0.000161, 0, 0, 0},\n                              { -0.000927, 0, 0, 0},\n                              { -0.001524, 0, 0, 0},\n                              { -0.000651, 0, 0, 0},\n                              { 0.001294, 0, 0, 0},\n                              { -0.000804, 0, 0, 0},\n                              { -0.001463, 0, 0, 0},\n                              { 0.001800, 0, 0, 0},\n                              { -0.000850, 0, 0, 0},\n                              { 0.000850, 0, 0, 0},\n                              { -0.000452, 0, 0, 0},\n                              { -0.001065, 0, 0, 0},\n                              { -0.000146, 0, 0, 0},\n                              { 0.000237, 0, 0, 0},\n                              { 0.001417, 0, 0, 0},\n                              { -0.000590, 0, 0, 0},\n                              { -0.000191, 0, 0, 0},\n                              { 0.001601, 0, 0, 0},\n                              { 0.001019, 0, 0, 0},\n                              { 0.000406, 0, 0, 0},\n                              { -0.000207, 0, 0, 0},\n                              { 0.001585, 0, 0, 0},\n                              { 0.000651, 0, 0, 0},\n                              { -0.000069, 0, 0, 0},\n                              { 0.000421, 0, 0, 0},\n                              { -0.001647, 0, 0, 0},\n                              { 0.001371, 0, 0, 0},\n                              { 0.000927, 0, 0, 0},\n                              { -0.000666, 0, 0, 0},\n                              { 0.001187, 0, 0, 0},\n                              { -0.001448, 0, 0, 0},\n                              { 0.000574, 0, 0, 0},\n                              { -0.001892, 0, 0, 0},\n                              { 0.000758, 0, 0, 0},\n                              { -0.001294, 0, 0, 0},\n                              { 0.001922, 0, 0, 0},\n                              { -0.001662, 0, 0, 0},\n                              { -0.001034, 0, 0, 0},\n                              { -0.000498, 0, 0, 0},\n                              { -0.001861, 0, 0, 0},\n                              { 0.001203, 0, 0, 0},\n                              { -0.000329, 0, 0, 0},\n                              { -0.001371, 0, 0, 0},\n                              { 0.001631, 0, 0, 0},\n                              { -0.001846, 0, 0, 0},\n                              { 0.000728, 0, 0, 0},\n                              { -0.000911, 0, 0, 0},\n                              { 0.001815, 0, 0, 0},\n                              { -0.001141, 0, 0, 0},\n                              { -0.000375, 0, 0, 0},\n                              { 0.000100, 0, 0, 0},\n                              { -0.000743, 0, 0, 0},\n                              { 0.001172, 0, 0, 0},\n                              { 0.000069, 0, 0, 0},\n                              { 0.001494, 0, 0, 0},\n                              { 0.000973, 0, 0, 0},\n                              { -0.000957, 0, 0, 0},\n                              { 0.001938, 0, 0, 0},\n                              { 0.000528, 0, 0, 0},\n                              { 0.000054, 0, 0, 0},\n                              { -0.001248, 0, 0, 0},\n                              { -0.000268, 0, 0, 0},\n                              { 0.001540, 0, 0, 0},\n                              { -0.000008, 0, 0, 0},\n                              { 0.000314, 0, 0, 0},\n                              { 0.001340, 0, 0, 0},\n                              { -0.001754, 0, 0, 0},\n                              { 0.000498, 0, 0, 0},\n                              { -0.001187, 0, 0, 0},\n                              { 0.000774, 0, 0, 0},\n                              { -0.001340, 0, 0, 0},\n                              { 0.000268, 0, 0, 0},\n                              { -0.001478, 0, 0, 0},\n                              { -0.000130, 0, 0, 0},\n                              { -0.000774, 0, 0, 0},\n                              { 0.001310, 0, 0, 0},\n                              { 0.000391, 0, 0, 0},\n                              { 0.000957, 0, 0, 0},\n                              { -0.000467, 0, 0, 0},\n                              { -0.001540, 0, 0, 0},\n                              { 0.001034, 0, 0, 0},\n                              { -0.000682, 0, 0, 0},\n                              { 0.001677, 0, 0, 0},\n                              { 0.001003, 0, 0, 0},\n                              { -0.000421, 0, 0, 0},\n                              { 0.001785, 0, 0, 0},\n                              { -0.000237, 0, 0, 0},\n                              { -0.000620, 0, 0, 0},\n                              { 0.001662, 0, 0, 0},\n                              { 0.000835, 0, 0, 0},\n                              { -0.001723, 0, 0, 0},\n                              { -0.001080, 0, 0, 0},\n                              { 0.001769, 0, 0, 0},\n                              { -0.000789, 0, 0, 0},\n                              { -0.001785, 0, 0, 0},\n                              { 0.000682, 0, 0, 0},\n                              { -0.000988, 0, 0, 0},\n                              { -0.001325, 0, 0, 0},\n                              { -0.000176, 0, 0, 0},\n                              { -0.001509, 0, 0, 0},\n                              { 0.000329, 0, 0, 0},\n                              { -0.001953, 0, 0, 0},\n                              { 0.000666, 0, 0, 0},\n                              { -0.001616, 0, 0, 0},\n                              { 0.001157, 0, 0, 0},\n                              { 0.000452, 0, 0, 0},\n                              { -0.000437, 0, 0, 0},\n                              { 0.000191, 0, 0, 0},\n                              { -0.001494, 0, 0, 0},\n                              { 0.001141, 0, 0, 0},\n                              { 0.000084, 0, 0, 0},\n                              { 0.001892, 0, 0, 0},\n                              { 0.001402, 0, 0, 0},\n                              { 0.000559, 0, 0, 0},\n                              { 0.000115, 0, 0, 0},\n                              { 0.001264, 0, 0, 0},\n                              { -0.000574, 0, 0, 0},\n                              { -0.000973, 0, 0, 0},\n                              { 0.001325, 0, 0, 0},\n                              { 0.000222, 0, 0, 0},\n                              { -0.000758, 0, 0, 0},\n                              { -0.001356, 0, 0, 0},\n                              { 0.001463, 0, 0, 0},\n                              { 0.000866, 0, 0, 0},\n                              { -0.000360, 0, 0, 0},\n                              { 0.000544, 0, 0, 0},\n                              { -0.001126, 0, 0, 0},\n                              { -0.000253, 0, 0, 0},\n                              { -0.000559, 0, 0, 0},\n                              { -0.001815, 0, 0, 0},\n                              { 0.001723, 0, 0, 0},\n                              { -0.001157, 0, 0, 0},\n                              { 0.000743, 0, 0, 0},\n                              { 0.001570, 0, 0, 0},\n                              { -0.000115, 0, 0, 0},\n                              { -0.001218, 0, 0, 0},\n                              { 0.001831, 0, 0, 0},\n                              { 0.000023, 0, 0, 0},\n                              { -0.001922, 0, 0, 0},\n                              { 0.001739, 0, 0, 0},\n                              { -0.000712, 0, 0, 0},\n                              { 0.001555, 0, 0, 0},\n                              { -0.001708, 0, 0, 0},\n                              { 0.001233, 0, 0, 0},\n                              { 0.000207, 0, 0, 0},\n                              { 0.001049, 0, 0, 0},\n                              { -0.000728, 0, 0, 0},\n                              { -0.001631, 0, 0, 0},\n                              { -0.000314, 0, 0, 0},\n                              { 0.000483, 0, 0, 0},\n                              { -0.001800, 0, 0, 0},\n                              { 0.000942, 0, 0, 0},\n                              { -0.000345, 0, 0, 0},\n                              { 0.000697, 0, 0, 0},\n                              { -0.001019, 0, 0, 0},\n                              { -0.001570, 0, 0, 0},\n                              { -0.000023, 0, 0, 0},\n                              { -0.001279, 0, 0, 0},\n                              { 0.000804, 0, 0, 0},\n                              { -0.000896, 0, 0, 0},\n                              { -0.001432, 0, 0, 0},\n                              { 0.000605, 0, 0, 0},\n                              { -0.000084, 0, 0, 0},\n                              { 0.000911, 0, 0, 0},\n                              { 0.001953, 0, 0, 0},\n                              { -0.001402, 0, 0, 0},\n                              { -0.000636, 0, 0, 0},\n                              { 0.001509, 0, 0, 0},\n                              { -0.000820, 0, 0, 0},\n                              { 0.001248, 0, 0, 0},\n                              { 0.000253, 0, 0, 0},\n                              { 0.001524, 0, 0, 0},\n                              { 0.001126, 0, 0, 0},\n                              { 0.000360, 0, 0, 0},\n                              { -0.000391, 0, 0, 0},\n                              { 0.001907, 0, 0, 0},\n                              { 0.001386, 0, 0, 0},\n                              { -0.001111, 0, 0, 0},\n                              { 0.001616, 0, 0, 0},\n                              { -0.000881, 0, 0, 0},\n                              { 0.000146, 0, 0, 0},\n                              { 0.001080, 0, 0, 0},\n                              { -0.000054, 0, 0, 0},\n                              { 0.000283, 0, 0, 0},\n                              { -0.001693, 0, 0, 0},\n                              { -0.001264, 0, 0, 0},\n                              { -0.000513, 0, 0, 0},\n                              { -0.000161, 0, 0, 0},\n                              { -0.001877, 0, 0, 0},\n                              { -0.000835, 0, 0, 0},\n                              { 0.000636, 0, 0, 0},\n                              { 0.000008, 0, 0, 0},\n                              { -0.001907, 0, 0, 0},\n                              { -0.000222, 0, 0, 0},\n                              { 0.000375, 0, 0, 0},\n                              { -0.001739, 0, 0, 0},\n                              { -0.000406, 0, 0, 0},\n                              { -0.001233, 0, 0, 0},\n                              { 0.001708, 0, 0, 0},\n                              { -0.000942, 0, 0, 0},\n                              { 0.000820, 0, 0, 0},\n                              { 0.001846, 0, 0, 0},\n                              { 0.000467, 0, 0, 0} }\ndcl_constantbuffer CB0[0:0][1], immediateIndexed, space=0\ndcl_resource_texture2d (float,float,float,float) T0[0:0], space=0\ndcl_input_ps_siv linear noperspective v0.xy, position\ndcl_output o0.xyzw\ndcl_temps 10\nftoi r0.xy, v0.xyxx\niadd r0.xy, r0.xyxx, -CB0[0][0].xyxx\niadd r1.xyzw, r0.xyxy, l(-1, 0, 0, -1)\nmov r2.xy, r1.zwzz\nmov r2.zw, l(0,0,0,0)\nld r2.xyz, r2.xyzw, T0[0].xyzw\nmov r1.zw, l(0,0,0,0)\nld r1.xyz, r1.xyzw, T0[0].xyzw\nmov r0.zw, l(0,0,0,0)\nld r3.xyz, r0.xyzw, T0[0].xyzw\niadd r4.xyzw, r0.xyxy, l(0, 1, 1, 0)\nmov r5.xy, r4.zwzz\nmov r5.zw, l(0,0,0,0)\nld r5.xyz, r5.xyzw, T0[0].xyzw\nmov r4.zw, l(0,0,0,0)\nld r4.xyz, r4.xyzw, T0[0].xyzw\nmin r6.xyz, r1.xyzx, r5.xyzx\nmin r6.xyz, r2.xyzx, r6.xyzx\nmin r6.xyz, r4.xyzx, r6.xyzx\nmax r7.xyz, r1.xyzx, r5.xyzx\nmax r7.xyz, r2.xyzx, r7.xyzx\nmax r7.xyz, r4.xyzx, r7.xyzx\nmin r8.xyz, r3.xyzx, r6.xyzx\nmul r9.xyz, r7.xyzx, l(4.000000, 4.000000, 4.000000, 0.000000)\nrcp r9.xyz, r9.xyzx\nmul r8.xyz, r8.xyzx, r9.xyzx\nmax r7.xyz, r3.xyzx, r7.xyzx\nadd r7.xyz, -r7.xyzx, l(1.000000, 1.000000, 1.000000, 0.000000)\nmad r6.xyz, r6.xyzx, l(4.000000, 4.000000, 4.000000, 0.000000), l(-4.000000, -4.000000, -4.000000, 0.000000)\nrcp r6.xyz, r6.xyzx\nmul r6.xyz, r6.xyzx, r7.xyzx\nmax r6.xyz, r6.xyzx, -r8.xyzx\nmax r0.z, r6.z, r6.y\nmax r0.z, r0.z, r6.x\nmin r0.z, r0.z, l(0.000000)\nmax r0.z, r0.z, l(-0.187500)\nmul r0.z, r0.z, CB0[0][0].z\nmad r0.w, r0.z, l(4.000000), l(1.000000)\niadd r1.w, -r0.w, l(0x7ef19fff)\nmad r0.w, -r1.w, r0.w, l(2.000000)\nmul r0.w, r0.w, r1.w\nmul r1.xyz, r1.xyzx, r0.zzzz\nmad r1.xyz, r0.zzzz, r2.xyzx, r1.xyzx\nmad r1.xyz, r0.zzzz, r4.xyzx, r1.xyzx\nmad r1.xyz, r0.zzzz, r5.xyzx, r1.xyzx\nadd r1.xyz, r3.xyzx, r1.xyzx\nbfi r0.y, l(4), l(4), r0.y, l(0)\nbfi r0.x, l(4), l(0), r0.x, r0.y\nmad_sat o0.xyz, r1.xyzx, r0.wwww, icb[r0.x + 0].xxxx\nmov o0.w, l(1.000000)\nret \n// Approximately 51 instruction slots used\n#endif\n\nconst BYTE guest_output_ffx_fsr_rcas_dither_ps[] =\n{\n     68,  88,  66,  67, 189, 177, \n    225,  60, 179, 155, 192, 193, \n    156, 139, 161,  52, 112,  21, \n     82,  56,   1,   0,   0,   0, \n    196,  25,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     12,   2,   0,   0,  64,   2, \n      0,   0, 116,   2,   0,   0, \n     40,  25,   0,   0,  82,  68, \n     69,  70, 208,   1,   0,   0, \n      1,   0,   0,   0, 176,   0, \n      0,   0,   2,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n    255, 255,   0,   5,   0,   0, \n    168,   1,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,   0,   2,   0, \n      0,   0,   5,   0,   0,   0, \n      4,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n      1,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 159,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 120, 101,  95, 102, \n    115, 114,  95, 114,  99,  97, \n    115,  95, 115, 111, 117, 114, \n     99, 101,   0, 112, 117, 115, \n    104,  95,  99, 111, 110, 115, \n    116, 115,  95, 120, 101,   0, \n    171, 171, 159,   0,   0,   0, \n      2,   0,   0,   0, 200,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  24,   1,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,   2,   0,   0,   0, \n     56,   1,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     92,   1,   0,   0,   8,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 132,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 120, 101, \n     95, 102, 115, 114,  95, 114, \n     99,  97, 115,  95, 111, 117, \n    116, 112, 117, 116,  95, 111, \n    102, 102, 115, 101, 116,   0, \n    105, 110, 116,  50,   0, 171, \n      1,   0,   2,   0,   1,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  50,   1,   0,   0, \n    120, 101,  95, 102, 115, 114, \n     95, 114,  99,  97, 115,  95, \n    115, 104,  97, 114, 112, 110, \n    101, 115, 115,  95, 112, 111, \n    115, 116,  95, 115, 101, 116, \n    117, 112,   0, 102, 108, 111, \n     97, 116,   0, 171,   0,   0, \n      3,   0,   1,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    125,   1,   0,   0,  77, 105, \n     99, 114, 111, 115, 111, 102, \n    116,  32,  40,  82,  41,  32, \n     72,  76,  83,  76,  32,  83, \n    104,  97, 100, 101, 114,  32, \n     67, 111, 109, 112, 105, 108, \n    101, 114,  32,  49,  48,  46, \n     49,   0,  73,  83,  71,  78, \n     44,   0,   0,   0,   1,   0, \n      0,   0,   8,   0,   0,   0, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,  15,   3,   0,   0, \n     83,  86,  95,  80, 111, 115, \n    105, 116, 105, 111, 110,   0, \n     79,  83,  71,  78,  44,   0, \n      0,   0,   1,   0,   0,   0, \n      8,   0,   0,   0,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n     15,   0,   0,   0,  83,  86, \n     95,  84,  97, 114, 103, 101, \n    116,   0, 171, 171,  83,  72, \n     69,  88, 172,  22,   0,   0, \n     81,   0,   0,   0, 171,   5, \n      0,   0, 106,   8,   0,   1, \n     53,  24,   0,   0,   2,   4, \n      0,   0, 132, 131, 131, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    231, 230, 102,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 222, 221, \n    221,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 204, 203, 203, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    168, 167, 167,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 159, 158, \n     30, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 140, 139, 139,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    182, 181, 181, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 178, 177, \n    177,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 135, 134,   6,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    160, 159, 159,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 210, 209, \n    209, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 155, 154,  26,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    149, 148, 148, 185,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 146, 145, \n    145,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 186, 185, 185, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    190, 189, 189,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 143, 142, \n     14, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 137, 136,   8,  57, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    158, 157, 157, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 229, 228, \n    228,  57,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 138, 137, 137, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    163, 162,  34,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 253, 252, \n    252, 185,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 246, 245, 245,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    144, 143, 143, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 209, 208, \n    208, 184,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 139, 138,  10, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    188, 187, 187,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 254, 253, \n    253, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 183, 182,  54, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    161, 160,  32,  56,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 187, 186, \n     58,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 172, 171, 171, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    144, 143, 143,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 157, 156, \n    156, 185,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 230, 229, 229,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    220, 219, 219, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 194, 193, \n    193,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 161, 160,  32, 184, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    207, 206,  78,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 240, 239, \n    239, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 157, 156, 156,  57, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    130, 129, 129,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 154, 153, \n    153, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 185, 184,  56,  57, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    216, 215, 215,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 208, 207, \n    207, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 181, 180, 180,  57, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    244, 243, 243,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 232, 231, \n    231, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 227, 226,  98, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    235, 234, 106,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 169, 168, \n     40,  57,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 243, 242, 114, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    200, 199, 199, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 171, 170, \n     42, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 170, 169, 169,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    211, 210,  82, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 192, 191, \n    191, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 236, 235, 235,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    223, 222,  94, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 223, 222, \n     94,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 237, 236, 236, 185, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    140, 139, 139, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 153, 152, \n     24, 185,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 249, 248, 120,  57, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    186, 185, 185,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 155, 154, \n     26, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 201, 200,  72, 185, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    210, 209, 209,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 134, 133, \n    133,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 213, 212, 212,  57, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    217, 216,  88, 185,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 208, 207, \n    207,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 171, 170,  42,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    145, 144, 144, 184,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 221, 220, \n    220,  57,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 216, 215, 215, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    180, 179, 179,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 243, 242, \n    114,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 175, 174,  46, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    156, 155, 155,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 190, 189, \n    189, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 151, 150,  22,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    248, 247, 247, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 199, 198, \n     70,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 170, 169, 169, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    252, 251, 251,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 218, 217, \n    217, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 136, 135, 135, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    131, 130,   2, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 244, 243, \n    243, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 158, 157, 157,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    173, 172, 172, 185,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 180, 179, \n    179, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 214, 213, 213,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    242, 241, 241, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 191, 190, \n     62,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 239, 238, 110, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    238, 237, 237,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 150, 149, \n    149, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 197, 196, 196, 185, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    209, 208, 208,  56,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 195, 194, \n     66, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 154, 153, 153,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    145, 144, 144,  56,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 196, 195, \n    195,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 255, 254, 126,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    251, 250, 122, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 254, 253, \n    253,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 139, 138,  10,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    225, 224,  96,  56,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 164, 163, \n    163, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 141, 140, 140, 185, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    202, 201, 201,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 129, 128, \n      0, 183,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165, 164, 164,  57, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    176, 175, 175,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 230, 229, \n    229, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 131, 130,   2,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    156, 155, 155, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 203, 202, \n     74,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 176, 175, 175, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    141, 140, 140,  57,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 194, 193, \n    193, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 137, 136,   8, 185, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    203, 202,  74, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 172, 171, \n    171,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 205, 204, 204,  57, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    251, 250, 122,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 245, 244, \n    244, 185,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 202, 201, 201, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    136, 135, 135,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 179, 178, \n     50, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 220, 219, 219,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    132, 131, 131,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 221, 220, \n    220, 185,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 234, 233, 233,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    249, 248, 120, 185,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 163, 162, \n     34, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 218, 217, 217,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    219, 218,  90,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 226, 225, \n    225, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 142, 141, 141, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    232, 231, 231,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 207, 206, \n     78, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 234, 233, 233, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    179, 178,  50,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 130, 129, \n    129, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 174, 173, 173, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    185, 184,  56, 185,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 198, 197, \n    197, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 173, 172, 172,  57, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0, 187,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 175, 174, \n     46,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 212, 211, 211, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    152, 151, 151,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 237, 236, \n    236,  57,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 229, 228, 228, 185, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    201, 200,  72,  57,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 196, 195, \n    195, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 150, 149, 149,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    177, 176, 176,  56,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 248, 247, \n    247,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 184, 183, 183,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    147, 146,  18,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 241, 240, \n    240,  56,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 166, 165, 165,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    151, 150,  22, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 255, 254, \n    126, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 174, 173, 173,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    233, 232, 104,  57,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 199, 198, \n     70, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 178, 177, 177, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    192, 191, 191,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 227, 226, \n     98,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 189, 188, 188, 185, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    143, 142,  14,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 148, 147, \n    147, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 133, 132, 132, 185, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    147, 146,  18, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 238, 237, \n    237, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 226, 225, 225,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    152, 151, 151, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 195, 194, \n     66,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 206, 205, 205,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    241, 240, 240, 184,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 160, 159, \n    159, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 240, 239, 239,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    193, 192, 192,  55,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 252, 251, \n    251, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 228, 227, 227,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    187, 186,  58, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 204, 203, \n    203,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 224, 223, 223, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    162, 161, 161,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 217, 216, \n     88,  57,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 138, 137, 137,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    191, 190,  62, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 214, 213, \n    213, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 165, 164, 164, 185, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    253, 252, 252,  57,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 236, 235, \n    235, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 247, 246, 118,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    181, 180, 180, 185,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 183, 182, \n     54,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 134, 133, 133, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    206, 205, 205, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 193, 192, \n    192, 183,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 168, 167, 167, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    211, 210,  82,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 235, 234, \n    106, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 188, 187, 187, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    159, 158,  30,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 177, 176, \n    176, 184,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 239, 238, 110,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,  59,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 184, 183, \n    183, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 167, 166,  38, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    198, 197, 197,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 215, 214, \n     86, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 164, 163, 163,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    133, 132, 132,  57,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 200, 199, \n    199,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 148, 147, 147,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    189, 188, 188,  57,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 205, 204, \n    204, 185,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 250, 249, 249,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    182, 181, 181,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 146, 145, \n    145, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 212, 211, 211,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    231, 230, 102, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 153, 152, \n     24,  57,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 142, 141, 141,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    225, 224,  96, 184,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 149, 148, \n    148,  57,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 222, 221, 221, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    166, 165, 165, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 135, 134, \n      6, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 169, 168,  40, 185, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    246, 245, 245, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 219, 218, \n     90, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 167, 166,  38,  58, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    129, 128,   0,  55,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 250, 249, \n    249, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 233, 232, 104, 185, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    197, 196, 196,  57,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 228, 227, \n    227, 186,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 213, 212, 212, 185, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    162, 161, 161, 186,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 224, 223, \n    223,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 247, 246, 118, 186, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    215, 214,  86,  58,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 242, 241, \n    241,  58,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 245, 244, 244,  57, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     89,   0,   0,   7,  70, 142, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  88,  24, \n      0,   7,  70, 126,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     85,  85,   0,   0,   0,   0, \n      0,   0, 100,  32,   0,   4, \n     50,  16,  16,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n    101,   0,   0,   3, 242,  32, \n     16,   0,   0,   0,   0,   0, \n    104,   0,   0,   2,  10,   0, \n      0,   0,  27,   0,   0,   5, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,  16,  16,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  10,  50,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n     70, 128,  48, 128,  65,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,   4,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n     54,   0,   0,   5,  50,   0, \n     16,   0,   2,   0,   0,   0, \n    230,  10,  16,   0,   1,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  45,   0, \n      0,   8, 114,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  45,   0,   0,   8, \n    114,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     45,   0,   0,   8, 114,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    242,   0,  16,   0,   4,   0, \n      0,   0,  70,   4,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  50,   0, \n     16,   0,   5,   0,   0,   0, \n    230,  10,  16,   0,   4,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  45,   0, \n      0,   8, 114,   0,  16,   0, \n      5,   0,   0,   0,  70,  14, \n     16,   0,   5,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,   4,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  45,   0,   0,   8, \n    114,   0,  16,   0,   4,   0, \n      0,   0,  70,  14,  16,   0, \n      4,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  51,   0, \n      0,   7, 114,   0,  16,   0, \n      6,   0,   0,   0,  70,   2, \n     16,   0,   1,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,  51,   0,   0,   7, \n    114,   0,  16,   0,   6,   0, \n      0,   0,  70,   2,  16,   0, \n      2,   0,   0,   0,  70,   2, \n     16,   0,   6,   0,   0,   0, \n     51,   0,   0,   7, 114,   0, \n     16,   0,   6,   0,   0,   0, \n     70,   2,  16,   0,   4,   0, \n      0,   0,  70,   2,  16,   0, \n      6,   0,   0,   0,  52,   0, \n      0,   7, 114,   0,  16,   0, \n      7,   0,   0,   0,  70,   2, \n     16,   0,   1,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,  52,   0,   0,   7, \n    114,   0,  16,   0,   7,   0, \n      0,   0,  70,   2,  16,   0, \n      2,   0,   0,   0,  70,   2, \n     16,   0,   7,   0,   0,   0, \n     52,   0,   0,   7, 114,   0, \n     16,   0,   7,   0,   0,   0, \n     70,   2,  16,   0,   4,   0, \n      0,   0,  70,   2,  16,   0, \n      7,   0,   0,   0,  51,   0, \n      0,   7, 114,   0,  16,   0, \n      8,   0,   0,   0,  70,   2, \n     16,   0,   3,   0,   0,   0, \n     70,   2,  16,   0,   6,   0, \n      0,   0,  56,   0,   0,  10, \n    114,   0,  16,   0,   9,   0, \n      0,   0,  70,   2,  16,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128,  64, \n      0,   0, 128,  64,   0,   0, \n    128,  64,   0,   0,   0,   0, \n    129,   0,   0,   5, 114,   0, \n     16,   0,   9,   0,   0,   0, \n     70,   2,  16,   0,   9,   0, \n      0,   0,  56,   0,   0,   7, \n    114,   0,  16,   0,   8,   0, \n      0,   0,  70,   2,  16,   0, \n      8,   0,   0,   0,  70,   2, \n     16,   0,   9,   0,   0,   0, \n     52,   0,   0,   7, 114,   0, \n     16,   0,   7,   0,   0,   0, \n     70,   2,  16,   0,   3,   0, \n      0,   0,  70,   2,  16,   0, \n      7,   0,   0,   0,   0,   0, \n      0,  11, 114,   0,  16,   0, \n      7,   0,   0,   0,  70,   2, \n     16, 128,  65,   0,   0,   0, \n      7,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128,  63, \n      0,   0, 128,  63,   0,   0, \n    128,  63,   0,   0,   0,   0, \n     50,   0,   0,  15, 114,   0, \n     16,   0,   6,   0,   0,   0, \n     70,   2,  16,   0,   6,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128,  64,   0,   0, \n    128,  64,   0,   0, 128,  64, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 192, \n      0,   0, 128, 192,   0,   0, \n    128, 192,   0,   0,   0,   0, \n    129,   0,   0,   5, 114,   0, \n     16,   0,   6,   0,   0,   0, \n     70,   2,  16,   0,   6,   0, \n      0,   0,  56,   0,   0,   7, \n    114,   0,  16,   0,   6,   0, \n      0,   0,  70,   2,  16,   0, \n      6,   0,   0,   0,  70,   2, \n     16,   0,   7,   0,   0,   0, \n     52,   0,   0,   8, 114,   0, \n     16,   0,   6,   0,   0,   0, \n     70,   2,  16,   0,   6,   0, \n      0,   0,  70,   2,  16, 128, \n     65,   0,   0,   0,   8,   0, \n      0,   0,  52,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      6,   0,   0,   0,  26,   0, \n     16,   0,   6,   0,   0,   0, \n     52,   0,   0,   7,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      6,   0,   0,   0,  51,   0, \n      0,   7,  66,   0,  16,   0, \n      0,   0,   0,   0,  42,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  52,   0,   0,   7, \n     66,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,  64, 190, \n     56,   0,   0,   9,  66,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,  42, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     50,   0,   0,   9, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     42,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0, 128,  64,   1,  64, \n      0,   0,   0,   0, 128,  63, \n     30,   0,   0,   8, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16, 128,  65,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0, 255, 159, \n    241, 126,  50,   0,   0,  10, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16, 128, \n     65,   0,   0,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,  64, \n     56,   0,   0,   7, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,  56,   0, \n      0,   7, 114,   0,  16,   0, \n      1,   0,   0,   0,  70,   2, \n     16,   0,   1,   0,   0,   0, \n    166,  10,  16,   0,   0,   0, \n      0,   0,  50,   0,   0,   9, \n    114,   0,  16,   0,   1,   0, \n      0,   0, 166,  10,  16,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,   2,   0,   0,   0, \n     70,   2,  16,   0,   1,   0, \n      0,   0,  50,   0,   0,   9, \n    114,   0,  16,   0,   1,   0, \n      0,   0, 166,  10,  16,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,   4,   0,   0,   0, \n     70,   2,  16,   0,   1,   0, \n      0,   0,  50,   0,   0,   9, \n    114,   0,  16,   0,   1,   0, \n      0,   0, 166,  10,  16,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,   5,   0,   0,   0, \n     70,   2,  16,   0,   1,   0, \n      0,   0,   0,   0,   0,   7, \n    114,   0,  16,   0,   1,   0, \n      0,   0,  70,   2,  16,   0, \n      3,   0,   0,   0,  70,   2, \n     16,   0,   1,   0,   0,   0, \n    140,   0,   0,  11,  34,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   4,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,  26,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0, 140,   0,   0,  11, \n     18,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      4,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  26,   0,  16,   0, \n      0,   0,   0,   0,  50,  32, \n      0,  10, 114,  32,  16,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,   1,   0,   0,   0, \n    246,  15,  16,   0,   0,   0, \n      0,   0,   6, 144, 144,   0, \n     10,   0,  16,   0,   0,   0, \n      0,   0,  54,   0,   0,   5, \n    130,  32,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0, 128,  63,  62,   0, \n      0,   1,  83,  84,  65,  84, \n    148,   0,   0,   0,  51,   0, \n      0,   0,  10,   0,   0,   0, \n      0,   1,   0,   0,   2,   0, \n      0,   0,  28,   0,   0,   0, \n      4,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   5,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   8,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0\n};\n"
  },
  {
    "path": "src/xenia/ui/shaders/bytecode/d3d12_5_1/guest_output_ffx_fsr_rcas_ps.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   int2 xe_fsr_rcas_output_offset;    // Offset:    0 Size:     8\n//   float xe_fsr_rcas_sharpness_post_setup;// Offset:    8 Size:     4\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_fsr_rcas_source                texture  float4          2d      T0             t0      1 \n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// SV_Position              0   xyzw        0      POS   float   xy  \n//\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// SV_Target                0   xyzw        0   TARGET   float   xyzw\n//\nps_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][1], immediateIndexed, space=0\ndcl_resource_texture2d (float,float,float,float) T0[0:0], space=0\ndcl_input_ps_siv linear noperspective v0.xy, position\ndcl_output o0.xyzw\ndcl_temps 9\nftoi r0.xy, v0.xyxx\niadd r0.xy, r0.xyxx, -CB0[0][0].xyxx\niadd r1.xyzw, r0.xyxy, l(-1, 0, 0, -1)\nmov r2.xy, r1.zwzz\nmov r2.zw, l(0,0,0,0)\nld r2.xyz, r2.xyzw, T0[0].xyzw\nmov r1.zw, l(0,0,0,0)\nld r1.xyz, r1.xyzw, T0[0].xyzw\nmov r0.zw, l(0,0,0,0)\nld r3.xyz, r0.xyzw, T0[0].xyzw\niadd r0.xyzw, r0.xyxy, l(0, 1, 1, 0)\nmov r4.xy, r0.zwzz\nmov r4.zw, l(0,0,0,0)\nld r4.xyz, r4.xyzw, T0[0].xyzw\nmov r0.zw, l(0,0,0,0)\nld r0.xyz, r0.xyzw, T0[0].xyzw\nmin r5.xyz, r1.xyzx, r4.xyzx\nmin r5.xyz, r2.xyzx, r5.xyzx\nmin r5.xyz, r0.xyzx, r5.xyzx\nmax r6.xyz, r1.xyzx, r4.xyzx\nmax r6.xyz, r2.xyzx, r6.xyzx\nmax r6.xyz, r0.xyzx, r6.xyzx\nmin r7.xyz, r3.xyzx, r5.xyzx\nmul r8.xyz, r6.xyzx, l(4.000000, 4.000000, 4.000000, 0.000000)\nrcp r8.xyz, r8.xyzx\nmul r7.xyz, r7.xyzx, r8.xyzx\nmax r6.xyz, r3.xyzx, r6.xyzx\nadd r6.xyz, -r6.xyzx, l(1.000000, 1.000000, 1.000000, 0.000000)\nmad r5.xyz, r5.xyzx, l(4.000000, 4.000000, 4.000000, 0.000000), l(-4.000000, -4.000000, -4.000000, 0.000000)\nrcp r5.xyz, r5.xyzx\nmul r5.xyz, r5.xyzx, r6.xyzx\nmax r5.xyz, r5.xyzx, -r7.xyzx\nmax r0.w, r5.z, r5.y\nmax r0.w, r0.w, r5.x\nmin r0.w, r0.w, l(0.000000)\nmax r0.w, r0.w, l(-0.187500)\nmul r0.w, r0.w, CB0[0][0].z\nmad r1.w, r0.w, l(4.000000), l(1.000000)\niadd r2.w, -r1.w, l(0x7ef19fff)\nmad r1.w, -r2.w, r1.w, l(2.000000)\nmul r1.w, r1.w, r2.w\nmul r1.xyz, r1.xyzx, r0.wwww\nmad r1.xyz, r0.wwww, r2.xyzx, r1.xyzx\nmad r0.xyz, r0.wwww, r0.xyzx, r1.xyzx\nmad r0.xyz, r0.wwww, r4.xyzx, r0.xyzx\nadd r0.xyz, r3.xyzx, r0.xyzx\nmul o0.xyz, r1.wwww, r0.xyzx\nmov o0.w, l(1.000000)\nret \n// Approximately 49 instruction slots used\n#endif\n\nconst BYTE guest_output_ffx_fsr_rcas_ps[] =\n{\n     68,  88,  66,  67,  67, 185, \n    127, 150, 159, 188,  61, 246, \n    239, 146,  24, 229, 183,  68, \n    131, 230,   1,   0,   0,   0, \n     88,   9,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     12,   2,   0,   0,  64,   2, \n      0,   0, 116,   2,   0,   0, \n    188,   8,   0,   0,  82,  68, \n     69,  70, 208,   1,   0,   0, \n      1,   0,   0,   0, 176,   0, \n      0,   0,   2,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n    255, 255,   0,   5,   0,   0, \n    168,   1,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,   0,   2,   0, \n      0,   0,   5,   0,   0,   0, \n      4,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n      1,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 159,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 120, 101,  95, 102, \n    115, 114,  95, 114,  99,  97, \n    115,  95, 115, 111, 117, 114, \n     99, 101,   0, 112, 117, 115, \n    104,  95,  99, 111, 110, 115, \n    116, 115,  95, 120, 101,   0, \n    171, 171, 159,   0,   0,   0, \n      2,   0,   0,   0, 200,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  24,   1,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,   2,   0,   0,   0, \n     56,   1,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     92,   1,   0,   0,   8,   0, \n      0,   0,   4,   0,   0,   0, \n      2,   0,   0,   0, 132,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 120, 101, \n     95, 102, 115, 114,  95, 114, \n     99,  97, 115,  95, 111, 117, \n    116, 112, 117, 116,  95, 111, \n    102, 102, 115, 101, 116,   0, \n    105, 110, 116,  50,   0, 171, \n      1,   0,   2,   0,   1,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  50,   1,   0,   0, \n    120, 101,  95, 102, 115, 114, \n     95, 114,  99,  97, 115,  95, \n    115, 104,  97, 114, 112, 110, \n    101, 115, 115,  95, 112, 111, \n    115, 116,  95, 115, 101, 116, \n    117, 112,   0, 102, 108, 111, \n     97, 116,   0, 171,   0,   0, \n      3,   0,   1,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    125,   1,   0,   0,  77, 105, \n     99, 114, 111, 115, 111, 102, \n    116,  32,  40,  82,  41,  32, \n     72,  76,  83,  76,  32,  83, \n    104,  97, 100, 101, 114,  32, \n     67, 111, 109, 112, 105, 108, \n    101, 114,  32,  49,  48,  46, \n     49,   0,  73,  83,  71,  78, \n     44,   0,   0,   0,   1,   0, \n      0,   0,   8,   0,   0,   0, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,  15,   3,   0,   0, \n     83,  86,  95,  80, 111, 115, \n    105, 116, 105, 111, 110,   0, \n     79,  83,  71,  78,  44,   0, \n      0,   0,   1,   0,   0,   0, \n      8,   0,   0,   0,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n     15,   0,   0,   0,  83,  86, \n     95,  84,  97, 114, 103, 101, \n    116,   0, 171, 171,  83,  72, \n     69,  88,  64,   6,   0,   0, \n     81,   0,   0,   0, 144,   1, \n      0,   0, 106,   8,   0,   1, \n     89,   0,   0,   7,  70, 142, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  88,  24, \n      0,   7,  70, 126,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     85,  85,   0,   0,   0,   0, \n      0,   0, 100,  32,   0,   4, \n     50,  16,  16,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n    101,   0,   0,   3, 242,  32, \n     16,   0,   0,   0,   0,   0, \n    104,   0,   0,   2,   9,   0, \n      0,   0,  27,   0,   0,   5, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,  16,  16,   0, \n      0,   0,   0,   0,  30,   0, \n      0,  10,  50,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n     70, 128,  48, 128,  65,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    242,   0,  16,   0,   1,   0, \n      0,   0,  70,   4,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n     54,   0,   0,   5,  50,   0, \n     16,   0,   2,   0,   0,   0, \n    230,  10,  16,   0,   1,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,   2,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  45,   0, \n      0,   8, 114,   0,  16,   0, \n      2,   0,   0,   0,  70,  14, \n     16,   0,   2,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,   1,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  45,   0,   0,   8, \n    114,   0,  16,   0,   1,   0, \n      0,   0,  70,  14,  16,   0, \n      1,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   8, 194,   0,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     45,   0,   0,   8, 114,   0, \n     16,   0,   3,   0,   0,   0, \n     70,  14,  16,   0,   0,   0, \n      0,   0,  70, 126,  32,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  30,   0,   0,  10, \n    242,   0,  16,   0,   0,   0, \n      0,   0,  70,   4,  16,   0, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   5,  50,   0, \n     16,   0,   4,   0,   0,   0, \n    230,  10,  16,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,   0,  16,   0,   4,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  45,   0, \n      0,   8, 114,   0,  16,   0, \n      4,   0,   0,   0,  70,  14, \n     16,   0,   4,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     54,   0,   0,   8, 194,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  45,   0,   0,   8, \n    114,   0,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      0,   0,   0,   0,  70, 126, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  51,   0, \n      0,   7, 114,   0,  16,   0, \n      5,   0,   0,   0,  70,   2, \n     16,   0,   1,   0,   0,   0, \n     70,   2,  16,   0,   4,   0, \n      0,   0,  51,   0,   0,   7, \n    114,   0,  16,   0,   5,   0, \n      0,   0,  70,   2,  16,   0, \n      2,   0,   0,   0,  70,   2, \n     16,   0,   5,   0,   0,   0, \n     51,   0,   0,   7, 114,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   2,  16,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0,  52,   0, \n      0,   7, 114,   0,  16,   0, \n      6,   0,   0,   0,  70,   2, \n     16,   0,   1,   0,   0,   0, \n     70,   2,  16,   0,   4,   0, \n      0,   0,  52,   0,   0,   7, \n    114,   0,  16,   0,   6,   0, \n      0,   0,  70,   2,  16,   0, \n      2,   0,   0,   0,  70,   2, \n     16,   0,   6,   0,   0,   0, \n     52,   0,   0,   7, 114,   0, \n     16,   0,   6,   0,   0,   0, \n     70,   2,  16,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n      6,   0,   0,   0,  51,   0, \n      0,   7, 114,   0,  16,   0, \n      7,   0,   0,   0,  70,   2, \n     16,   0,   3,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,  56,   0,   0,  10, \n    114,   0,  16,   0,   8,   0, \n      0,   0,  70,   2,  16,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128,  64, \n      0,   0, 128,  64,   0,   0, \n    128,  64,   0,   0,   0,   0, \n    129,   0,   0,   5, 114,   0, \n     16,   0,   8,   0,   0,   0, \n     70,   2,  16,   0,   8,   0, \n      0,   0,  56,   0,   0,   7, \n    114,   0,  16,   0,   7,   0, \n      0,   0,  70,   2,  16,   0, \n      7,   0,   0,   0,  70,   2, \n     16,   0,   8,   0,   0,   0, \n     52,   0,   0,   7, 114,   0, \n     16,   0,   6,   0,   0,   0, \n     70,   2,  16,   0,   3,   0, \n      0,   0,  70,   2,  16,   0, \n      6,   0,   0,   0,   0,   0, \n      0,  11, 114,   0,  16,   0, \n      6,   0,   0,   0,  70,   2, \n     16, 128,  65,   0,   0,   0, \n      6,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128,  63, \n      0,   0, 128,  63,   0,   0, \n    128,  63,   0,   0,   0,   0, \n     50,   0,   0,  15, 114,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128,  64,   0,   0, \n    128,  64,   0,   0, 128,  64, \n      0,   0,   0,   0,   2,  64, \n      0,   0,   0,   0, 128, 192, \n      0,   0, 128, 192,   0,   0, \n    128, 192,   0,   0,   0,   0, \n    129,   0,   0,   5, 114,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,  56,   0,   0,   7, \n    114,   0,  16,   0,   5,   0, \n      0,   0,  70,   2,  16,   0, \n      5,   0,   0,   0,  70,   2, \n     16,   0,   6,   0,   0,   0, \n     52,   0,   0,   8, 114,   0, \n     16,   0,   5,   0,   0,   0, \n     70,   2,  16,   0,   5,   0, \n      0,   0,  70,   2,  16, 128, \n     65,   0,   0,   0,   7,   0, \n      0,   0,  52,   0,   0,   7, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  42,   0,  16,   0, \n      5,   0,   0,   0,  26,   0, \n     16,   0,   5,   0,   0,   0, \n     52,   0,   0,   7, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  10,   0,  16,   0, \n      5,   0,   0,   0,  51,   0, \n      0,   7, 130,   0,  16,   0, \n      0,   0,   0,   0,  58,   0, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  52,   0,   0,   7, \n    130,   0,  16,   0,   0,   0, \n      0,   0,  58,   0,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,  64, 190, \n     56,   0,   0,   9, 130,   0, \n     16,   0,   0,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,  42, 128,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     50,   0,   0,   9, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   0,   0, \n      0,   0,   1,  64,   0,   0, \n      0,   0, 128,  64,   1,  64, \n      0,   0,   0,   0, 128,  63, \n     30,   0,   0,   8, 130,   0, \n     16,   0,   2,   0,   0,   0, \n     58,   0,  16, 128,  65,   0, \n      0,   0,   1,   0,   0,   0, \n      1,  64,   0,   0, 255, 159, \n    241, 126,  50,   0,   0,  10, \n    130,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16, 128, \n     65,   0,   0,   0,   2,   0, \n      0,   0,  58,   0,  16,   0, \n      1,   0,   0,   0,   1,  64, \n      0,   0,   0,   0,   0,  64, \n     56,   0,   0,   7, 130,   0, \n     16,   0,   1,   0,   0,   0, \n     58,   0,  16,   0,   1,   0, \n      0,   0,  58,   0,  16,   0, \n      2,   0,   0,   0,  56,   0, \n      0,   7, 114,   0,  16,   0, \n      1,   0,   0,   0,  70,   2, \n     16,   0,   1,   0,   0,   0, \n    246,  15,  16,   0,   0,   0, \n      0,   0,  50,   0,   0,   9, \n    114,   0,  16,   0,   1,   0, \n      0,   0, 246,  15,  16,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,   2,   0,   0,   0, \n     70,   2,  16,   0,   1,   0, \n      0,   0,  50,   0,   0,   9, \n    114,   0,  16,   0,   0,   0, \n      0,   0, 246,  15,  16,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,   0,   0,   0,   0, \n     70,   2,  16,   0,   1,   0, \n      0,   0,  50,   0,   0,   9, \n    114,   0,  16,   0,   0,   0, \n      0,   0, 246,  15,  16,   0, \n      0,   0,   0,   0,  70,   2, \n     16,   0,   4,   0,   0,   0, \n     70,   2,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   7, \n    114,   0,  16,   0,   0,   0, \n      0,   0,  70,   2,  16,   0, \n      3,   0,   0,   0,  70,   2, \n     16,   0,   0,   0,   0,   0, \n     56,   0,   0,   7, 114,  32, \n     16,   0,   0,   0,   0,   0, \n    246,  15,  16,   0,   1,   0, \n      0,   0,  70,   2,  16,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5, 130,  32,  16,   0, \n      0,   0,   0,   0,   1,  64, \n      0,   0,   0,   0, 128,  63, \n     62,   0,   0,   1,  83,  84, \n     65,  84, 148,   0,   0,   0, \n     49,   0,   0,   0,   9,   0, \n      0,   0,   0,   0,   0,   0, \n      2,   0,   0,   0,  28,   0, \n      0,   0,   4,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      5,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/ui/shaders/bytecode/d3d12_5_1/guest_output_triangle_strip_rect_vs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   float2 xe_triangle_strip_rect_offset;// Offset:    0 Size:     8\n//   float2 xe_triangle_strip_rect_size;// Offset:    8 Size:     8\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// SV_VertexID              0   x           0   VERTID    uint   x   \n//\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// SV_Position              0   xyzw        0      POS   float   xyzw\n//\nvs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][1], immediateIndexed, space=0\ndcl_input_sgv v0.x, vertex_id\ndcl_output_siv o0.xyzw, position\ndcl_temps 1\nushr r0.y, v0.x, l(1)\nmov r0.x, v0.x\nand r0.xy, r0.xyxx, l(1, 1, 0, 0)\nutof r0.xy, r0.xyxx\nmad o0.xy, r0.xyxx, CB0[0][0].zwzz, CB0[0][0].xyxx\nmov o0.zw, l(0,0,0,1.000000)\nret \n// Approximately 7 instruction slots used\n#endif\n\nconst BYTE guest_output_triangle_strip_rect_vs[] =\n{\n     68,  88,  66,  67,  50, 140, \n    173,  83, 164, 102,  25, 145, \n    174, 164, 206,  34,  69, 212, \n    161, 224,   1,   0,   0,   0, \n    200,   3,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n    168,   1,   0,   0, 220,   1, \n      0,   0,  16,   2,   0,   0, \n     44,   3,   0,   0,  82,  68, \n     69,  70, 108,   1,   0,   0, \n      1,   0,   0,   0, 116,   0, \n      0,   0,   1,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n    254, 255,   0,   5,   0,   0, \n     68,   1,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    100,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 112, 117, \n    115, 104,  95,  99, 111, 110, \n    115, 116, 115,  95, 120, 101, \n      0, 171, 100,   0,   0,   0, \n      2,   0,   0,   0, 140,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 220,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,   2,   0,   0,   0, \n      4,   1,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n     40,   1,   0,   0,   8,   0, \n      0,   0,   8,   0,   0,   0, \n      2,   0,   0,   0,   4,   1, \n      0,   0,   0,   0,   0,   0, \n    255, 255, 255, 255,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 120, 101, \n     95, 116, 114, 105,  97, 110, \n    103, 108, 101,  95, 115, 116, \n    114, 105, 112,  95, 114, 101, \n     99, 116,  95, 111, 102, 102, \n    115, 101, 116,   0, 102, 108, \n    111,  97, 116,  50,   0, 171, \n    171, 171,   1,   0,   3,   0, \n      1,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 250,   0, \n      0,   0, 120, 101,  95, 116, \n    114, 105,  97, 110, 103, 108, \n    101,  95, 115, 116, 114, 105, \n    112,  95, 114, 101,  99, 116, \n     95, 115, 105, 122, 101,   0, \n     77, 105,  99, 114, 111, 115, \n    111, 102, 116,  32,  40,  82, \n     41,  32,  72,  76,  83,  76, \n     32,  83, 104,  97, 100, 101, \n    114,  32,  67, 111, 109, 112, \n    105, 108, 101, 114,  32,  49, \n     48,  46,  49,   0,  73,  83, \n     71,  78,  44,   0,   0,   0, \n      1,   0,   0,   0,   8,   0, \n      0,   0,  32,   0,   0,   0, \n      0,   0,   0,   0,   6,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   1,   1, \n      0,   0,  83,  86,  95,  86, \n    101, 114, 116, 101, 120,  73, \n     68,   0,  79,  83,  71,  78, \n     44,   0,   0,   0,   1,   0, \n      0,   0,   8,   0,   0,   0, \n     32,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,  15,   0,   0,   0, \n     83,  86,  95,  80, 111, 115, \n    105, 116, 105, 111, 110,   0, \n     83,  72,  69,  88,  20,   1, \n      0,   0,  81,   0,   1,   0, \n     69,   0,   0,   0, 106,   8, \n      0,   1,  89,   0,   0,   7, \n     70, 142,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n     96,   0,   0,   4,  18,  16, \n     16,   0,   0,   0,   0,   0, \n      6,   0,   0,   0, 103,   0, \n      0,   4, 242,  32,  16,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0, 104,   0,   0,   2, \n      1,   0,   0,   0,  85,   0, \n      0,   7,  34,   0,  16,   0, \n      0,   0,   0,   0,  10,  16, \n     16,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   1,   0, \n      0,   0,  54,   0,   0,   5, \n     18,   0,  16,   0,   0,   0, \n      0,   0,  10,  16,  16,   0, \n      0,   0,   0,   0,   1,   0, \n      0,  10,  50,   0,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   1,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  86,   0,   0,   5, \n     50,   0,  16,   0,   0,   0, \n      0,   0,  70,   0,  16,   0, \n      0,   0,   0,   0,  50,   0, \n      0,  13,  50,  32,  16,   0, \n      0,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n    230, 138,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  70, 128, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,  54,   0,   0,   8, \n    194,  32,  16,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 128,  63,  62,   0, \n      0,   1,  83,  84,  65,  84, \n    148,   0,   0,   0,   7,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   2,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0\n};\n"
  },
  {
    "path": "src/xenia/ui/shaders/bytecode/d3d12_5_1/immediate_ps.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// xe_immediate_texture_xe_sampler    sampler      NA          NA      S0             s0      1 \n// xe_immediate_texture              texture  float4          2d      T0             t0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// TEXCOORD                 0   xy          0     NONE   float   xy  \n// COLOR                    0   xyzw        1     NONE   float   xyzw\n//\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// SV_Target                0   xyzw        0   TARGET   float   xyzw\n//\nps_5_1\ndcl_globalFlags refactoringAllowed\ndcl_sampler S0[0:0], mode_default, space=0\ndcl_resource_texture2d (float,float,float,float) T0[0:0], space=0\ndcl_input_ps linear v0.xy\ndcl_input_ps linear v1.xyzw\ndcl_output o0.xyzw\ndcl_temps 1\nsample_l r0.xyzw, v0.xyxx, T0[0].xyzw, S0[0], l(0.000000)\nmul o0.xyzw, r0.xyzw, v1.xyzw\nret \n// Approximately 3 instruction slots used\n#endif\n\nconst BYTE immediate_ps[] =\n{\n     68,  88,  66,  67, 107, 181, \n     28,  66, 229, 168,  59,   0, \n     81, 196, 220, 121, 194,  12, \n     76, 233,   1,   0,   0,   0, \n     16,   3,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     40,   1,   0,   0, 120,   1, \n      0,   0, 172,   1,   0,   0, \n    116,   2,   0,   0,  82,  68, \n     69,  70, 236,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n    255, 255,   0,   5,   0,   0, \n    193,   0,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    140,   0,   0,   0,   3,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 172,   0, \n      0,   0,   2,   0,   0,   0, \n      5,   0,   0,   0,   4,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0,   1,   0, \n      0,   0,  12,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 120, 101,  95, 105, \n    109, 109, 101, 100, 105,  97, \n    116, 101,  95, 116, 101, 120, \n    116, 117, 114, 101,  95, 120, \n    101,  95, 115,  97, 109, 112, \n    108, 101, 114,   0, 120, 101, \n     95, 105, 109, 109, 101, 100, \n    105,  97, 116, 101,  95, 116, \n    101, 120, 116, 117, 114, 101, \n      0,  77, 105,  99, 114, 111, \n    115, 111, 102, 116,  32,  40, \n     82,  41,  32,  72,  76,  83, \n     76,  32,  83, 104,  97, 100, \n    101, 114,  32,  67, 111, 109, \n    112, 105, 108, 101, 114,  32, \n     49,  48,  46,  49,   0, 171, \n    171, 171,  73,  83,  71,  78, \n     72,   0,   0,   0,   2,   0, \n      0,   0,   8,   0,   0,   0, \n     56,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   3,   3,   0,   0, \n     65,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   0,  15,  15,   0,   0, \n     84,  69,  88,  67,  79,  79, \n     82,  68,   0,  67,  79,  76, \n     79,  82,   0, 171,  79,  83, \n     71,  78,  44,   0,   0,   0, \n      1,   0,   0,   0,   8,   0, \n      0,   0,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,  15,   0, \n      0,   0,  83,  86,  95,  84, \n     97, 114, 103, 101, 116,   0, \n    171, 171,  83,  72,  69,  88, \n    192,   0,   0,   0,  81,   0, \n      0,   0,  48,   0,   0,   0, \n    106,   8,   0,   1,  90,   0, \n      0,   6,  70, 110,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  88,  24, \n      0,   7,  70, 126,  48,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n     85,  85,   0,   0,   0,   0, \n      0,   0,  98,  16,   0,   3, \n     50,  16,  16,   0,   0,   0, \n      0,   0,  98,  16,   0,   3, \n    242,  16,  16,   0,   1,   0, \n      0,   0, 101,   0,   0,   3, \n    242,  32,  16,   0,   0,   0, \n      0,   0, 104,   0,   0,   2, \n      1,   0,   0,   0,  72,   0, \n      0,  13, 242,   0,  16,   0, \n      0,   0,   0,   0,  70,  16, \n     16,   0,   0,   0,   0,   0, \n     70, 126,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,  96,  32,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,  64,   0,   0,   0,   0, \n      0,   0,  56,   0,   0,   7, \n    242,  32,  16,   0,   0,   0, \n      0,   0,  70,  14,  16,   0, \n      0,   0,   0,   0,  70,  30, \n     16,   0,   1,   0,   0,   0, \n     62,   0,   0,   1,  83,  84, \n     65,  84, 148,   0,   0,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0\n};\n"
  },
  {
    "path": "src/xenia/ui/shaders/bytecode/d3d12_5_1/immediate_vs.h",
    "content": "#if 0\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 10.1\n//\n//\n// Buffer Definitions: \n//\n// cbuffer push_consts_xe\n// {\n//\n//   float2 xe_coordinate_space_size_inv;// Offset:    0 Size:     8\n//\n// }\n//\n//\n// Resource Bindings:\n//\n// Name                                 Type  Format         Dim      ID      HLSL Bind  Count\n// ------------------------------ ---------- ------- ----------- ------- -------------- ------\n// push_consts_xe                    cbuffer      NA          NA     CB0            cb0      1 \n//\n//\n//\n// Input signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// POSITION                 0   xy          0     NONE   float   xy  \n// TEXCOORD                 0   xy          1     NONE   float   xy  \n// COLOR                    0   xyzw        2     NONE   float   xyzw\n//\n//\n// Output signature:\n//\n// Name                 Index   Mask Register SysValue  Format   Used\n// -------------------- ----- ------ -------- -------- ------- ------\n// TEXCOORD                 0   xy          0     NONE   float   xy  \n// COLOR                    0   xyzw        1     NONE   float   xyzw\n// SV_Position              0   xyzw        2      POS   float   xyzw\n//\nvs_5_1\ndcl_globalFlags refactoringAllowed\ndcl_constantbuffer CB0[0:0][1], immediateIndexed, space=0\ndcl_input v0.xy\ndcl_input v1.xy\ndcl_input v2.xyzw\ndcl_output o0.xy\ndcl_output o1.xyzw\ndcl_output_siv o2.xyzw, position\ndcl_temps 1\nmul r0.xy, v0.xyxx, CB0[0][0].xyxx\nmad o2.xy, r0.xyxx, l(2.000000, -2.000000, 0.000000, 0.000000), l(-1.000000, 1.000000, 0.000000, 0.000000)\nmov o1.xyzw, v2.xyzw\nmov o2.zw, l(0,0,0,1.000000)\nmov o0.xy, v1.xyxx\nret \n// Approximately 6 instruction slots used\n#endif\n\nconst BYTE immediate_vs[] =\n{\n     68,  88,  66,  67, 150, 136, \n    152, 237, 155, 249,  84,   3, \n     80, 221, 206, 175, 204, 144, \n    211, 193,   1,   0,   0,   0, \n     16,   4,   0,   0,   5,   0, \n      0,   0,  52,   0,   0,   0, \n     96,   1,   0,   0, 208,   1, \n      0,   0,  68,   2,   0,   0, \n    116,   3,   0,   0,  82,  68, \n     69,  70,  36,   1,   0,   0, \n      1,   0,   0,   0, 116,   0, \n      0,   0,   1,   0,   0,   0, \n     60,   0,   0,   0,   1,   5, \n    254, 255,   0,   5,   0,   0, \n    252,   0,   0,   0,  19,  19, \n     68,  37,  60,   0,   0,   0, \n     24,   0,   0,   0,  40,   0, \n      0,   0,  40,   0,   0,   0, \n     36,   0,   0,   0,  12,   0, \n      0,   0,   0,   0,   0,   0, \n    100,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      1,   0,   0,   0,   1,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0, 112, 117, \n    115, 104,  95,  99, 111, 110, \n    115, 116, 115,  95, 120, 101, \n      0, 171, 100,   0,   0,   0, \n      1,   0,   0,   0, 140,   0, \n      0,   0,  16,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 180,   0,   0,   0, \n      0,   0,   0,   0,   8,   0, \n      0,   0,   2,   0,   0,   0, \n    216,   0,   0,   0,   0,   0, \n      0,   0, 255, 255, 255, 255, \n      0,   0,   0,   0, 255, 255, \n    255, 255,   0,   0,   0,   0, \n    120, 101,  95,  99, 111, 111, \n    114, 100, 105, 110,  97, 116, \n    101,  95, 115, 112,  97,  99, \n    101,  95, 115, 105, 122, 101, \n     95, 105, 110, 118,   0, 102, \n    108, 111,  97, 116,  50,   0, \n      1,   0,   3,   0,   1,   0, \n      2,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0, 209,   0,   0,   0, \n     77, 105,  99, 114, 111, 115, \n    111, 102, 116,  32,  40,  82, \n     41,  32,  72,  76,  83,  76, \n     32,  83, 104,  97, 100, 101, \n    114,  32,  67, 111, 109, 112, \n    105, 108, 101, 114,  32,  49, \n     48,  46,  49,   0,  73,  83, \n     71,  78, 104,   0,   0,   0, \n      3,   0,   0,   0,   8,   0, \n      0,   0,  80,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   3,   3, \n      0,   0,  89,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      1,   0,   0,   0,   3,   3, \n      0,   0,  98,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      2,   0,   0,   0,  15,  15, \n      0,   0,  80,  79,  83,  73, \n     84,  73,  79,  78,   0,  84, \n     69,  88,  67,  79,  79,  82, \n     68,   0,  67,  79,  76,  79, \n     82,   0,  79,  83,  71,  78, \n    108,   0,   0,   0,   3,   0, \n      0,   0,   8,   0,   0,   0, \n     80,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   0,   0, \n      0,   0,   3,  12,   0,   0, \n     89,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      3,   0,   0,   0,   1,   0, \n      0,   0,  15,   0,   0,   0, \n     95,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      3,   0,   0,   0,   2,   0, \n      0,   0,  15,   0,   0,   0, \n     84,  69,  88,  67,  79,  79, \n     82,  68,   0,  67,  79,  76, \n     79,  82,   0,  83,  86,  95, \n     80, 111, 115, 105, 116, 105, \n    111, 110,   0, 171,  83,  72, \n     69,  88,  40,   1,   0,   0, \n     81,   0,   1,   0,  74,   0, \n      0,   0, 106,   8,   0,   1, \n     89,   0,   0,   7,  70, 142, \n     48,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,  95,   0, \n      0,   3,  50,  16,  16,   0, \n      0,   0,   0,   0,  95,   0, \n      0,   3,  50,  16,  16,   0, \n      1,   0,   0,   0,  95,   0, \n      0,   3, 242,  16,  16,   0, \n      2,   0,   0,   0, 101,   0, \n      0,   3,  50,  32,  16,   0, \n      0,   0,   0,   0, 101,   0, \n      0,   3, 242,  32,  16,   0, \n      1,   0,   0,   0, 103,   0, \n      0,   4, 242,  32,  16,   0, \n      2,   0,   0,   0,   1,   0, \n      0,   0, 104,   0,   0,   2, \n      1,   0,   0,   0,  56,   0, \n      0,   9,  50,   0,  16,   0, \n      0,   0,   0,   0,  70,  16, \n     16,   0,   0,   0,   0,   0, \n     70, 128,  48,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,  50,   0, \n      0,  15,  50,  32,  16,   0, \n      2,   0,   0,   0,  70,   0, \n     16,   0,   0,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,  64,   0,   0,   0, 192, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   2,  64,   0,   0, \n      0,   0, 128, 191,   0,   0, \n    128,  63,   0,   0,   0,   0, \n      0,   0,   0,   0,  54,   0, \n      0,   5, 242,  32,  16,   0, \n      1,   0,   0,   0,  70,  30, \n     16,   0,   2,   0,   0,   0, \n     54,   0,   0,   8, 194,  32, \n     16,   0,   2,   0,   0,   0, \n      2,  64,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n    128,  63,  54,   0,   0,   5, \n     50,  32,  16,   0,   0,   0, \n      0,   0,  70,  16,  16,   0, \n      1,   0,   0,   0,  62,   0, \n      0,   1,  83,  84,  65,  84, \n    148,   0,   0,   0,   6,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   6,   0, \n      0,   0,   2,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   1,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   3,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0,   0,   0,   0,   0, \n      0,   0\n};\n"
  },
  {
    "path": "src/xenia/ui/shaders/bytecode/vulkan_spirv/guest_output_bilinear_dither_ps.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25141\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint Fragment %main \"main\" %gl_FragCoord %xe_bilinear_color\n               OpExecutionMode %main OriginUpperLeft\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %gl_FragCoord \"gl_FragCoord\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_bilinear_output_offset\"\n               OpMemberName %push_const_block_xe 1 \"xe_bilinear_output_size_inv\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %xe_bilinear_source \"xe_bilinear_source\"\n               OpName %xe_bilinear_sampler \"xe_bilinear_sampler\"\n               OpName %xe_bilinear_color \"xe_bilinear_color\"\n               OpDecorate %gl_FragCoord BuiltIn FragCoord\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 16\n               OpMemberDecorate %push_const_block_xe 1 Offset 24\n               OpDecorate %xe_bilinear_source Binding 0\n               OpDecorate %xe_bilinear_source DescriptorSet 0\n               OpDecorate %xe_bilinear_sampler Binding 1\n               OpDecorate %xe_bilinear_sampler DescriptorSet 0\n               OpDecorate %xe_bilinear_color Location 0\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n      %float = OpTypeFloat 32\n%_ptr_Function_float = OpTypePointer Function %float\n    %v3float = OpTypeVector %float 3\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n    %float_0 = OpConstant %float 0\n    %float_1 = OpConstant %float 1\n    %uint_15 = OpConstant %uint 15\n   %uint_256 = OpConstant %uint 256\n%_arr_float_uint_256 = OpTypeArray %float %uint_256\n%float_n0_00100337015 = OpConstant %float -0.00100337015\n%float_0_000880821084 = OpConstant %float 0.000880821084\n%float_0_00169270835 = OpConstant %float 0.00169270835\n%float_n0_00155484071 = OpConstant %float -0.00155484071\n%float_0_00127910543 = OpConstant %float 0.00127910543\n%float_n0_000605085806 = OpConstant %float -0.000605085806\n%float_0_00106464466 = OpConstant %float 0.00106464466\n%float_n0_00138633582 = OpConstant %float -0.00138633582\n%float_0_00135569857 = OpConstant %float 0.00135569857\n%float_0_000513174047 = OpConstant %float 0.000513174047\n%float_0_00121783093 = OpConstant %float 0.00121783093\n%float_n0_00160079659 = OpConstant %float -0.00160079659\n%float_0_00058976718 = OpConstant %float 0.00058976718\n%float_n0_00028339462 = OpConstant %float -0.00028339462\n%float_0_00111060054 = OpConstant %float 0.00111060054\n%float_n0_00141697307 = OpConstant %float -0.00141697307\n%float_0_00144761032 = OpConstant %float 0.00144761032\n%float_n0_0005438113 = OpConstant %float -0.0005438113\n%float_0_00013020834 = OpConstant %float 0.00013020834\n%float_n0_0012025123 = OpConstant %float -0.0012025123\n%float_0_000436580885 = OpConstant %float 0.000436580885\n%float_n0_00104932603 = OpConstant %float -0.00104932603\n%float_0_000620404433 = OpConstant %float 0.000620404433\n%float_n0_000482536765 = OpConstant %float -0.000482536765\n%float_0_00187653187 = OpConstant %float 0.00187653187\n%float_n0_00109528191 = OpConstant %float -0.00109528191\n%float_n9_95710798en05 = OpConstant %float -9.95710798e-05\n%float_n0_000528492674 = OpConstant %float -0.000528492674\n%float_0_0014322917 = OpConstant %float 0.0014322917\n%float_n0_00193780637 = OpConstant %float -0.00193780637\n%float_n0_000696997566 = OpConstant %float -0.000696997566\n%float_3_829657en05 = OpConstant %float 3.829657e-05\n%float_0_000712316192 = OpConstant %float 0.000712316192\n%float_n0_00130974269 = OpConstant %float -0.00130974269\n%float_0_00109528191 = OpConstant %float 0.00109528191\n%float_n0_000298713247 = OpConstant %float -0.000298713247\n%float_0_00175398286 = OpConstant %float 0.00175398286\n%float_n0_00167738972 = OpConstant %float -0.00167738972\n%float_0_00147824758 = OpConstant %float 0.00147824758\n%float_n3_829657en05 = OpConstant %float -3.829657e-05\n%float_0_000788909325 = OpConstant %float 0.000788909325\n%float_n0_00183057599 = OpConstant %float -0.00183057599\n%float_0_000298713247 = OpConstant %float 0.000298713247\n%float_0_000988051528 = OpConstant %float 0.000988051528\n%float_n0_00117187505 = OpConstant %float -0.00117187505\n%float_0_00017616422 = OpConstant %float 0.00017616422\n%float_0_00164675247 = OpConstant %float 0.00164675247\n%float_n0_00158547796 = OpConstant %float -0.00158547796\n%float_0_000344669126 = OpConstant %float 0.000344669126\n%float_0_00186121324 = OpConstant %float 0.00186121324\n%float_n0_00176930148 = OpConstant %float -0.00176930148\n%float_n0_000865502458 = OpConstant %float -0.000865502458\n%float_0_000896139711 = OpConstant %float 0.000896139711\n%float_0_000160845593 = OpConstant %float 0.000160845593\n%float_n0_000926776964 = OpConstant %float -0.000926776964\n%float_n0_00152420346 = OpConstant %float -0.00152420346\n%float_n0_000651041686 = OpConstant %float -0.000651041686\n%float_0_00129442406 = OpConstant %float 0.00129442406\n%float_n0_000804227951 = OpConstant %float -0.000804227951\n%float_n0_00146292895 = OpConstant %float -0.00146292895\n%float_0_00179993873 = OpConstant %float 0.00179993873\n%float_n0_000850183831 = OpConstant %float -0.000850183831\n%float_0_000850183831 = OpConstant %float 0.000850183831\n%float_n0_000451899512 = OpConstant %float -0.000451899512\n%float_n0_00106464466 = OpConstant %float -0.00106464466\n%float_n0_000145526967 = OpConstant %float -0.000145526967\n%float_0_000237438726 = OpConstant %float 0.000237438726\n%float_0_00141697307 = OpConstant %float 0.00141697307\n%float_n0_00058976718 = OpConstant %float -0.00058976718\n%float_n0_000191482846 = OpConstant %float -0.000191482846\n%float_0_00160079659 = OpConstant %float 0.00160079659\n%float_0_00101868878 = OpConstant %float 0.00101868878\n%float_0_000405943632 = OpConstant %float 0.000405943632\n%float_n0_000206801473 = OpConstant %float -0.000206801473\n%float_0_00158547796 = OpConstant %float 0.00158547796\n%float_0_000651041686 = OpConstant %float 0.000651041686\n%float_n6_89338267en05 = OpConstant %float -6.89338267e-05\n%float_0_000421262259 = OpConstant %float 0.000421262259\n%float_n0_00164675247 = OpConstant %float -0.00164675247\n%float_0_00137101719 = OpConstant %float 0.00137101719\n%float_0_000926776964 = OpConstant %float 0.000926776964\n%float_n0_000666360313 = OpConstant %float -0.000666360313\n%float_0_00118719367 = OpConstant %float 0.00118719367\n%float_n0_00144761032 = OpConstant %float -0.00144761032\n%float_0_000574448553 = OpConstant %float 0.000574448553\n%float_n0_00189185049 = OpConstant %float -0.00189185049\n%float_0_000758272072 = OpConstant %float 0.000758272072\n%float_n0_00129442406 = OpConstant %float -0.00129442406\n%float_0_00192248775 = OpConstant %float 0.00192248775\n%float_n0_0016620711 = OpConstant %float -0.0016620711\n%float_n0_00103400741 = OpConstant %float -0.00103400741\n%float_n0_000497855421 = OpConstant %float -0.000497855421\n%float_n0_00186121324 = OpConstant %float -0.00186121324\n%float_0_0012025123 = OpConstant %float 0.0012025123\n%float_n0_0003293505 = OpConstant %float -0.0003293505\n%float_n0_00137101719 = OpConstant %float -0.00137101719\n%float_0_00163143384 = OpConstant %float 0.00163143384\n%float_n0_00184589461 = OpConstant %float -0.00184589461\n%float_0_000727634819 = OpConstant %float 0.000727634819\n%float_n0_000911458337 = OpConstant %float -0.000911458337\n%float_0_00181525736 = OpConstant %float 0.00181525736\n%float_n0_00114123779 = OpConstant %float -0.00114123779\n%float_n0_000375306379 = OpConstant %float -0.000375306379\n%float_9_95710798en05 = OpConstant %float 9.95710798e-05\n%float_n0_000742953445 = OpConstant %float -0.000742953445\n%float_0_00117187505 = OpConstant %float 0.00117187505\n%float_6_89338267en05 = OpConstant %float 6.89338267e-05\n%float_0_0014935662 = OpConstant %float 0.0014935662\n%float_0_000972732843 = OpConstant %float 0.000972732843\n%float_n0_000957414217 = OpConstant %float -0.000957414217\n%float_0_00193780637 = OpConstant %float 0.00193780637\n%float_0_000528492674 = OpConstant %float 0.000528492674\n%float_5_36151965en05 = OpConstant %float 5.36151965e-05\n%float_n0_00124846818 = OpConstant %float -0.00124846818\n%float_n0_000268075994 = OpConstant %float -0.000268075994\n%float_0_00153952208 = OpConstant %float 0.00153952208\n%float_n7_65931418en06 = OpConstant %float -7.65931418e-06\n%float_0_000314031873 = OpConstant %float 0.000314031873\n%float_0_00134037994 = OpConstant %float 0.00134037994\n%float_n0_00175398286 = OpConstant %float -0.00175398286\n%float_0_000497855421 = OpConstant %float 0.000497855421\n%float_n0_00118719367 = OpConstant %float -0.00118719367\n%float_0_000773590698 = OpConstant %float 0.000773590698\n%float_n0_00134037994 = OpConstant %float -0.00134037994\n%float_0_000268075994 = OpConstant %float 0.000268075994\n%float_n0_00147824758 = OpConstant %float -0.00147824758\n%float_n0_00013020834 = OpConstant %float -0.00013020834\n%float_n0_000773590698 = OpConstant %float -0.000773590698\n%float_0_00130974269 = OpConstant %float 0.00130974269\n%float_0_000390625006 = OpConstant %float 0.000390625006\n%float_0_000957414217 = OpConstant %float 0.000957414217\n%float_n0_000467218139 = OpConstant %float -0.000467218139\n%float_n0_00153952208 = OpConstant %float -0.00153952208\n%float_0_00103400741 = OpConstant %float 0.00103400741\n%float_n0_000681678939 = OpConstant %float -0.000681678939\n%float_0_00167738972 = OpConstant %float 0.00167738972\n%float_0_00100337015 = OpConstant %float 0.00100337015\n%float_n0_000421262259 = OpConstant %float -0.000421262259\n%float_0_00178462011 = OpConstant %float 0.00178462011\n%float_n0_000237438726 = OpConstant %float -0.000237438726\n%float_n0_000620404433 = OpConstant %float -0.000620404433\n%float_0_0016620711 = OpConstant %float 0.0016620711\n%float_0_000834865205 = OpConstant %float 0.000834865205\n%float_n0_0017233456 = OpConstant %float -0.0017233456\n%float_n0_00107996329 = OpConstant %float -0.00107996329\n%float_0_00176930148 = OpConstant %float 0.00176930148\n%float_n0_000788909325 = OpConstant %float -0.000788909325\n%float_n0_00178462011 = OpConstant %float -0.00178462011\n%float_0_000681678939 = OpConstant %float 0.000681678939\n%float_n0_000988051528 = OpConstant %float -0.000988051528\n%float_n0_00132506131 = OpConstant %float -0.00132506131\n%float_n0_00017616422 = OpConstant %float -0.00017616422\n%float_n0_00150888483 = OpConstant %float -0.00150888483\n%float_0_0003293505 = OpConstant %float 0.0003293505\n%float_n0_001953125 = OpConstant %float -0.001953125\n%float_0_000666360313 = OpConstant %float 0.000666360313\n%float_n0_00161611522 = OpConstant %float -0.00161611522\n%float_0_00115655642 = OpConstant %float 0.00115655642\n%float_0_000451899512 = OpConstant %float 0.000451899512\n%float_n0_000436580885 = OpConstant %float -0.000436580885\n%float_0_000191482846 = OpConstant %float 0.000191482846\n%float_n0_0014935662 = OpConstant %float -0.0014935662\n%float_0_00114123779 = OpConstant %float 0.00114123779\n%float_8_42524532en05 = OpConstant %float 8.42524532e-05\n%float_0_00189185049 = OpConstant %float 0.00189185049\n%float_0_00140165444 = OpConstant %float 0.00140165444\n%float_0_000559129927 = OpConstant %float 0.000559129927\n%float_0_000114889706 = OpConstant %float 0.000114889706\n%float_0_00126378681 = OpConstant %float 0.00126378681\n%float_n0_000574448553 = OpConstant %float -0.000574448553\n%float_n0_000972732843 = OpConstant %float -0.000972732843\n%float_0_00132506131 = OpConstant %float 0.00132506131\n%float_0_000222120099 = OpConstant %float 0.000222120099\n%float_n0_000758272072 = OpConstant %float -0.000758272072\n%float_n0_00135569857 = OpConstant %float -0.00135569857\n%float_0_00146292895 = OpConstant %float 0.00146292895\n%float_0_000865502458 = OpConstant %float 0.000865502458\n%float_n0_000359987753 = OpConstant %float -0.000359987753\n%float_0_0005438113 = OpConstant %float 0.0005438113\n%float_n0_00112591917 = OpConstant %float -0.00112591917\n%float_n0_000252757367 = OpConstant %float -0.000252757367\n%float_n0_000559129927 = OpConstant %float -0.000559129927\n%float_n0_00181525736 = OpConstant %float -0.00181525736\n%float_0_0017233456 = OpConstant %float 0.0017233456\n%float_n0_00115655642 = OpConstant %float -0.00115655642\n%float_0_000742953445 = OpConstant %float 0.000742953445\n%float_0_00157015934 = OpConstant %float 0.00157015934\n%float_n0_000114889706 = OpConstant %float -0.000114889706\n%float_n0_00121783093 = OpConstant %float -0.00121783093\n%float_0_00183057599 = OpConstant %float 0.00183057599\n%float_2_29779416en05 = OpConstant %float 2.29779416e-05\n%float_n0_00192248775 = OpConstant %float -0.00192248775\n%float_0_00173866423 = OpConstant %float 0.00173866423\n%float_n0_000712316192 = OpConstant %float -0.000712316192\n%float_0_00155484071 = OpConstant %float 0.00155484071\n%float_n0_00170802698 = OpConstant %float -0.00170802698\n%float_0_00123314955 = OpConstant %float 0.00123314955\n%float_0_000206801473 = OpConstant %float 0.000206801473\n%float_0_00104932603 = OpConstant %float 0.00104932603\n%float_n0_000727634819 = OpConstant %float -0.000727634819\n%float_n0_00163143384 = OpConstant %float -0.00163143384\n%float_n0_000314031873 = OpConstant %float -0.000314031873\n%float_0_000482536765 = OpConstant %float 0.000482536765\n%float_n0_00179993873 = OpConstant %float -0.00179993873\n%float_0_00094209559 = OpConstant %float 0.00094209559\n%float_n0_000344669126 = OpConstant %float -0.000344669126\n%float_0_000696997566 = OpConstant %float 0.000696997566\n%float_n0_00101868878 = OpConstant %float -0.00101868878\n%float_n0_00157015934 = OpConstant %float -0.00157015934\n%float_n2_29779416en05 = OpConstant %float -2.29779416e-05\n%float_n0_00127910543 = OpConstant %float -0.00127910543\n%float_0_000804227951 = OpConstant %float 0.000804227951\n%float_n0_000896139711 = OpConstant %float -0.000896139711\n%float_n0_0014322917 = OpConstant %float -0.0014322917\n%float_0_000605085806 = OpConstant %float 0.000605085806\n%float_n8_42524532en05 = OpConstant %float -8.42524532e-05\n%float_0_000911458337 = OpConstant %float 0.000911458337\n%float_0_001953125 = OpConstant %float 0.001953125\n%float_n0_00140165444 = OpConstant %float -0.00140165444\n%float_n0_00063572306 = OpConstant %float -0.00063572306\n%float_0_00150888483 = OpConstant %float 0.00150888483\n%float_n0_000819546578 = OpConstant %float -0.000819546578\n%float_0_00124846818 = OpConstant %float 0.00124846818\n%float_0_000252757367 = OpConstant %float 0.000252757367\n%float_0_00152420346 = OpConstant %float 0.00152420346\n%float_0_00112591917 = OpConstant %float 0.00112591917\n%float_0_000359987753 = OpConstant %float 0.000359987753\n%float_n0_000390625006 = OpConstant %float -0.000390625006\n%float_0_00190716912 = OpConstant %float 0.00190716912\n%float_0_00138633582 = OpConstant %float 0.00138633582\n%float_n0_00111060054 = OpConstant %float -0.00111060054\n%float_0_00161611522 = OpConstant %float 0.00161611522\n%float_n0_000880821084 = OpConstant %float -0.000880821084\n%float_0_000145526967 = OpConstant %float 0.000145526967\n%float_0_00107996329 = OpConstant %float 0.00107996329\n%float_n5_36151965en05 = OpConstant %float -5.36151965e-05\n%float_0_00028339462 = OpConstant %float 0.00028339462\n%float_n0_00169270835 = OpConstant %float -0.00169270835\n%float_n0_00126378681 = OpConstant %float -0.00126378681\n%float_n0_000513174047 = OpConstant %float -0.000513174047\n%float_n0_000160845593 = OpConstant %float -0.000160845593\n%float_n0_00187653187 = OpConstant %float -0.00187653187\n%float_n0_000834865205 = OpConstant %float -0.000834865205\n%float_0_00063572306 = OpConstant %float 0.00063572306\n%float_7_65931418en06 = OpConstant %float 7.65931418e-06\n%float_n0_00190716912 = OpConstant %float -0.00190716912\n%float_n0_000222120099 = OpConstant %float -0.000222120099\n%float_0_000375306379 = OpConstant %float 0.000375306379\n%float_n0_00173866423 = OpConstant %float -0.00173866423\n%float_n0_000405943632 = OpConstant %float -0.000405943632\n%float_n0_00123314955 = OpConstant %float -0.00123314955\n%float_0_00170802698 = OpConstant %float 0.00170802698\n%float_n0_00094209559 = OpConstant %float -0.00094209559\n%float_0_000819546578 = OpConstant %float 0.000819546578\n%float_0_00184589461 = OpConstant %float 0.00184589461\n%float_0_000467218139 = OpConstant %float 0.000467218139\n       %1947 = OpConstantComposite %_arr_float_uint_256 %float_n0_00100337015 %float_0_000880821084 %float_0_00169270835 %float_n0_00155484071 %float_0_00127910543 %float_n0_000605085806 %float_0_00106464466 %float_n0_00138633582 %float_0_00135569857 %float_0_000513174047 %float_0_00121783093 %float_n0_00160079659 %float_0_00058976718 %float_n0_00028339462 %float_0_00111060054 %float_n0_00141697307 %float_0_00144761032 %float_n0_0005438113 %float_0_00013020834 %float_n0_0012025123 %float_0_000436580885 %float_n0_00104932603 %float_0_000620404433 %float_n0_000482536765 %float_0_00187653187 %float_n0_00109528191 %float_n9_95710798en05 %float_n0_000528492674 %float_0_0014322917 %float_n0_00193780637 %float_n0_000696997566 %float_3_829657en05 %float_0_000712316192 %float_n0_00130974269 %float_0_00109528191 %float_n0_000298713247 %float_0_00175398286 %float_n0_00167738972 %float_0_00147824758 %float_n3_829657en05 %float_0_000788909325 %float_n0_00183057599 %float_0_000298713247 %float_0_000988051528 %float_n0_00117187505 %float_0_00017616422 %float_0_00164675247 %float_n0_00158547796 %float_0_000344669126 %float_0_00186121324 %float_n0_00176930148 %float_n0_000865502458 %float_0_000896139711 %float_0_000160845593 %float_n0_000926776964 %float_n0_00152420346 %float_n0_000651041686 %float_0_00129442406 %float_n0_000804227951 %float_n0_00146292895 %float_0_00179993873 %float_n0_000850183831 %float_0_000850183831 %float_n0_000451899512 %float_n0_00106464466 %float_n0_000145526967 %float_0_000237438726 %float_0_00141697307 %float_n0_00058976718 %float_n0_000191482846 %float_0_00160079659 %float_0_00101868878 %float_0_000405943632 %float_n0_000206801473 %float_0_00158547796 %float_0_000651041686 %float_n6_89338267en05 %float_0_000421262259 %float_n0_00164675247 %float_0_00137101719 %float_0_000926776964 %float_n0_000666360313 %float_0_00118719367 %float_n0_00144761032 %float_0_000574448553 %float_n0_00189185049 %float_0_000758272072 %float_n0_00129442406 %float_0_00192248775 %float_n0_0016620711 %float_n0_00103400741 %float_n0_000497855421 %float_n0_00186121324 %float_0_0012025123 %float_n0_0003293505 %float_n0_00137101719 %float_0_00163143384 %float_n0_00184589461 %float_0_000727634819 %float_n0_000911458337 %float_0_00181525736 %float_n0_00114123779 %float_n0_000375306379 %float_9_95710798en05 %float_n0_000742953445 %float_0_00117187505 %float_6_89338267en05 %float_0_0014935662 %float_0_000972732843 %float_n0_000957414217 %float_0_00193780637 %float_0_000528492674 %float_5_36151965en05 %float_n0_00124846818 %float_n0_000268075994 %float_0_00153952208 %float_n7_65931418en06 %float_0_000314031873 %float_0_00134037994 %float_n0_00175398286 %float_0_000497855421 %float_n0_00118719367 %float_0_000773590698 %float_n0_00134037994 %float_0_000268075994 %float_n0_00147824758 %float_n0_00013020834 %float_n0_000773590698 %float_0_00130974269 %float_0_000390625006 %float_0_000957414217 %float_n0_000467218139 %float_n0_00153952208 %float_0_00103400741 %float_n0_000681678939 %float_0_00167738972 %float_0_00100337015 %float_n0_000421262259 %float_0_00178462011 %float_n0_000237438726 %float_n0_000620404433 %float_0_0016620711 %float_0_000834865205 %float_n0_0017233456 %float_n0_00107996329 %float_0_00176930148 %float_n0_000788909325 %float_n0_00178462011 %float_0_000681678939 %float_n0_000988051528 %float_n0_00132506131 %float_n0_00017616422 %float_n0_00150888483 %float_0_0003293505 %float_n0_001953125 %float_0_000666360313 %float_n0_00161611522 %float_0_00115655642 %float_0_000451899512 %float_n0_000436580885 %float_0_000191482846 %float_n0_0014935662 %float_0_00114123779 %float_8_42524532en05 %float_0_00189185049 %float_0_00140165444 %float_0_000559129927 %float_0_000114889706 %float_0_00126378681 %float_n0_000574448553 %float_n0_000972732843 %float_0_00132506131 %float_0_000222120099 %float_n0_000758272072 %float_n0_00135569857 %float_0_00146292895 %float_0_000865502458 %float_n0_000359987753 %float_0_0005438113 %float_n0_00112591917 %float_n0_000252757367 %float_n0_000559129927 %float_n0_00181525736 %float_0_0017233456 %float_n0_00115655642 %float_0_000742953445 %float_0_00157015934 %float_n0_000114889706 %float_n0_00121783093 %float_0_00183057599 %float_2_29779416en05 %float_n0_00192248775 %float_0_00173866423 %float_n0_000712316192 %float_0_00155484071 %float_n0_00170802698 %float_0_00123314955 %float_0_000206801473 %float_0_00104932603 %float_n0_000727634819 %float_n0_00163143384 %float_n0_000314031873 %float_0_000482536765 %float_n0_00179993873 %float_0_00094209559 %float_n0_000344669126 %float_0_000696997566 %float_n0_00101868878 %float_n0_00157015934 %float_n2_29779416en05 %float_n0_00127910543 %float_0_000804227951 %float_n0_000896139711 %float_n0_0014322917 %float_0_000605085806 %float_n8_42524532en05 %float_0_000911458337 %float_0_001953125 %float_n0_00140165444 %float_n0_00063572306 %float_0_00150888483 %float_n0_000819546578 %float_0_00124846818 %float_0_000252757367 %float_0_00152420346 %float_0_00112591917 %float_0_000359987753 %float_n0_000390625006 %float_0_00190716912 %float_0_00138633582 %float_n0_00111060054 %float_0_00161611522 %float_n0_000880821084 %float_0_000145526967 %float_0_00107996329 %float_n5_36151965en05 %float_0_00028339462 %float_n0_00169270835 %float_n0_00126378681 %float_n0_000513174047 %float_n0_000160845593 %float_n0_00187653187 %float_n0_000834865205 %float_0_00063572306 %float_7_65931418en06 %float_n0_00190716912 %float_n0_000222120099 %float_0_000375306379 %float_n0_00173866423 %float_n0_000405943632 %float_n0_00123314955 %float_0_00170802698 %float_n0_00094209559 %float_0_000819546578 %float_0_00184589461 %float_0_000467218139\n    %uint_16 = OpConstant %uint 16\n%_ptr_Function__arr_float_uint_256 = OpTypePointer Function %_arr_float_uint_256\n    %v4float = OpTypeVector %float 4\n%_ptr_Input_v4float = OpTypePointer Input %v4float\n%gl_FragCoord = OpVariable %_ptr_Input_v4float Input\n    %v2float = OpTypeVector %float 2\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n%push_const_block_xe = OpTypeStruct %v2int %v2float\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n      %int_0 = OpConstant %int 0\n%_ptr_PushConstant_v2int = OpTypePointer PushConstant %v2int\n        %151 = OpTypeImage %float 2D 0 0 0 1 Unknown\n%_ptr_UniformConstant_151 = OpTypePointer UniformConstant %151\n%xe_bilinear_source = OpVariable %_ptr_UniformConstant_151 UniformConstant\n        %508 = OpTypeSampler\n%_ptr_UniformConstant_508 = OpTypePointer UniformConstant %508\n%xe_bilinear_sampler = OpVariable %_ptr_UniformConstant_508 UniformConstant\n        %510 = OpTypeSampledImage %151\n  %float_0_5 = OpConstant %float 0.5\n      %int_1 = OpConstant %int 1\n%_ptr_PushConstant_v2float = OpTypePointer PushConstant %v2float\n%_ptr_Output_v4float = OpTypePointer Output %v4float\n%xe_bilinear_color = OpVariable %_ptr_Output_v4float Output\n       %1566 = OpConstantComposite %v2float %float_0_5 %float_0_5\n       %2122 = OpConstantComposite %v2uint %uint_15 %uint_15\n       %2604 = OpConstantComposite %v3float %float_0 %float_0 %float_0\n       %2582 = OpConstantComposite %v3float %float_1 %float_1 %float_1\n          %2 = OpUndef %v4float\n       %main = OpFunction %void None %1282\n      %24953 = OpLabel\n      %18411 = OpVariable %_ptr_Function__arr_float_uint_256 Function\n      %22087 = OpLoad %v4float %gl_FragCoord\n       %6562 = OpVectorShuffle %v2float %22087 %22087 0 1\n      %17656 = OpConvertFToS %v2int %6562\n      %19279 = OpAccessChain %_ptr_PushConstant_v2int %push_consts_xe %int_0\n      %22822 = OpLoad %v2int %19279\n      %23236 = OpISub %v2int %17656 %22822\n      %10630 = OpBitcast %v2uint %23236\n      %14905 = OpLoad %151 %xe_bilinear_source\n      %16965 = OpLoad %508 %xe_bilinear_sampler\n       %8907 = OpSampledImage %510 %14905 %16965\n      %13759 = OpConvertUToF %v2float %10630\n      %15917 = OpFAdd %v2float %13759 %1566\n      %11863 = OpAccessChain %_ptr_PushConstant_v2float %push_consts_xe %int_1\n      %20800 = OpLoad %v2float %11863\n      %24336 = OpFMul %v2float %15917 %20800\n       %9248 = OpImageSampleExplicitLod %v4float %8907 %24336 Lod %float_0\n      %21554 = OpCompositeExtract %float %9248 0\n      %14517 = OpCompositeInsert %v4float %21554 %2 0\n      %19852 = OpCompositeExtract %float %9248 1\n      %16135 = OpCompositeInsert %v4float %19852 %14517 1\n      %19814 = OpCompositeExtract %float %9248 2\n      %18704 = OpCompositeInsert %v4float %19814 %16135 2\n      %15997 = OpVectorShuffle %v3float %18704 %18704 0 1 2\n      %12552 = OpBitwiseAnd %v2uint %10630 %2122\n       %9741 = OpCompositeExtract %uint %12552 1\n      %21498 = OpIMul %uint %9741 %uint_16\n      %23411 = OpCompositeExtract %uint %12552 0\n      %12610 = OpIAdd %uint %21498 %23411\n               OpStore %18411 %1947\n       %9958 = OpAccessChain %_ptr_Function_float %18411 %12610\n      %25140 = OpLoad %float %9958\n      %18028 = OpCompositeConstruct %v3float %25140 %25140 %25140\n      %21458 = OpFAdd %v3float %15997 %18028\n      %19525 = OpExtInst %v3float %1 FClamp %21458 %2604 %2582\n      %16777 = OpCompositeExtract %float %19525 0\n      %19708 = OpCompositeExtract %float %19525 1\n       %7472 = OpCompositeExtract %float %19525 2\n      %22408 = OpCompositeConstruct %v4float %16777 %19708 %7472 %float_1\n               OpStore %xe_bilinear_color %22408\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t guest_output_bilinear_dither_ps[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006235, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0007000F, 0x00000004,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000C93, 0x000014C0, 0x00030010,\n    0x0000161F, 0x00000007, 0x00030003, 0x00000002, 0x000001CC, 0x00090004,\n    0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F, 0x5F776F6C, 0x72747461,\n    0x74756269, 0x00007365, 0x000B0004, 0x455F4C47, 0x735F5458, 0x6C706D61,\n    0x656C7265, 0x745F7373, 0x75747865, 0x665F6572, 0x74636E75, 0x736E6F69,\n    0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F, 0x70635F45, 0x74735F70,\n    0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365, 0x00006576, 0x00080004,\n    0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63, 0x69645F65, 0x74636572,\n    0x00657669, 0x00040005, 0x0000161F, 0x6E69616D, 0x00000000, 0x00060005,\n    0x00000C93, 0x465F6C67, 0x43676172, 0x64726F6F, 0x00000000, 0x00070005,\n    0x00000404, 0x68737570, 0x6E6F635F, 0x625F7473, 0x6B636F6C, 0x0065785F,\n    0x000A0006, 0x00000404, 0x00000000, 0x625F6578, 0x6E696C69, 0x5F726165,\n    0x7074756F, 0x6F5F7475, 0x65736666, 0x00000074, 0x000A0006, 0x00000404,\n    0x00000001, 0x625F6578, 0x6E696C69, 0x5F726165, 0x7074756F, 0x735F7475,\n    0x5F657A69, 0x00766E69, 0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F,\n    0x5F737473, 0x00006578, 0x00070005, 0x00001160, 0x625F6578, 0x6E696C69,\n    0x5F726165, 0x72756F73, 0x00006563, 0x00070005, 0x0000133F, 0x625F6578,\n    0x6E696C69, 0x5F726165, 0x706D6173, 0x0072656C, 0x00070005, 0x000014C0,\n    0x625F6578, 0x6E696C69, 0x5F726165, 0x6F6C6F63, 0x00000072, 0x00040047,\n    0x00000C93, 0x0000000B, 0x0000000F, 0x00030047, 0x00000404, 0x00000002,\n    0x00050048, 0x00000404, 0x00000000, 0x00000023, 0x00000010, 0x00050048,\n    0x00000404, 0x00000001, 0x00000023, 0x00000018, 0x00040047, 0x00001160,\n    0x00000021, 0x00000000, 0x00040047, 0x00001160, 0x00000022, 0x00000000,\n    0x00040047, 0x0000133F, 0x00000021, 0x00000001, 0x00040047, 0x0000133F,\n    0x00000022, 0x00000000, 0x00040047, 0x000014C0, 0x0000001E, 0x00000000,\n    0x00020013, 0x00000008, 0x00030021, 0x00000502, 0x00000008, 0x00030016,\n    0x0000000D, 0x00000020, 0x00040020, 0x0000028A, 0x00000007, 0x0000000D,\n    0x00040017, 0x00000018, 0x0000000D, 0x00000003, 0x00040015, 0x0000000B,\n    0x00000020, 0x00000000, 0x00040017, 0x00000011, 0x0000000B, 0x00000002,\n    0x0004002B, 0x0000000D, 0x00000A0C, 0x00000000, 0x0004002B, 0x0000000D,\n    0x0000008A, 0x3F800000, 0x0004002B, 0x0000000B, 0x00000A37, 0x0000000F,\n    0x0004002B, 0x0000000B, 0x00000147, 0x00000100, 0x0004001C, 0x000002D4,\n    0x0000000D, 0x00000147, 0x0004002B, 0x0000000D, 0x0000010F, 0xBA838384,\n    0x0004002B, 0x0000000D, 0x00000728, 0x3A66E6E7, 0x0004002B, 0x0000000D,\n    0x00000705, 0x3ADDDDDE, 0x0004002B, 0x0000000D, 0x00000A5A, 0xBACBCBCC,\n    0x0004002B, 0x0000000D, 0x000008DF, 0x3AA7A7A8, 0x0004002B, 0x0000000D,\n    0x00000094, 0xBA1E9E9F, 0x0004002B, 0x0000000D, 0x0000034C, 0x3A8B8B8C,\n    0x0004002B, 0x0000000D, 0x0000087E, 0xBAB5B5B6, 0x0004002B, 0x0000000D,\n    0x0000034D, 0x3AB1B1B2, 0x0004002B, 0x0000000D, 0x00000687, 0x3A068687,\n    0x0004002B, 0x0000000D, 0x000003EB, 0x3A9F9FA0, 0x0004002B, 0x0000000D,\n    0x0000024E, 0xBAD1D1D2, 0x0004002B, 0x0000000D, 0x00000726, 0x3A1A9A9B,\n    0x0004002B, 0x0000000D, 0x00000698, 0xB9949495, 0x0004002B, 0x0000000D,\n    0x00000703, 0x3A919192, 0x0004002B, 0x0000000D, 0x00000AF8, 0xBAB9B9BA,\n    0x0004002B, 0x0000000D, 0x00000ABB, 0x3ABDBDBE, 0x0004002B, 0x0000000D,\n    0x0000026F, 0xBA0E8E8F, 0x0004002B, 0x0000000D, 0x000008A8, 0x39088889,\n    0x0004002B, 0x0000000D, 0x00000565, 0xBA9D9D9E, 0x0004002B, 0x0000000D,\n    0x0000065D, 0x39E4E4E5, 0x0004002B, 0x0000000D, 0x000004C6, 0xBA89898A,\n    0x0004002B, 0x0000000D, 0x00000057, 0x3A22A2A3, 0x0004002B, 0x0000000D,\n    0x0000006A, 0xB9FCFCFD, 0x0004002B, 0x0000000D, 0x00000A1E, 0x3AF5F5F6,\n    0x0004002B, 0x0000000D, 0x0000087D, 0xBA8F8F90, 0x0004002B, 0x0000000D,\n    0x00000959, 0xB8D0D0D1, 0x0004002B, 0x0000000D, 0x00000BB8, 0xBA0A8A8B,\n    0x0004002B, 0x0000000D, 0x0000097E, 0x3ABBBBBC, 0x0004002B, 0x0000000D,\n    0x00000606, 0xBAFDFDFE, 0x0004002B, 0x0000000D, 0x000003AD, 0xBA36B6B7,\n    0x0004002B, 0x0000000D, 0x000000E2, 0x3820A0A1, 0x0004002B, 0x0000000D,\n    0x00000370, 0x3A3ABABB, 0x0004002B, 0x0000000D, 0x0000024D, 0xBAABABAC,\n    0x0004002B, 0x0000000D, 0x000005C6, 0x3A8F8F90, 0x0004002B, 0x0000000D,\n    0x00000B8C, 0xB99C9C9D, 0x0004002B, 0x0000000D, 0x00000036, 0x3AE5E5E6,\n    0x0004002B, 0x0000000D, 0x0000087F, 0xBADBDBDC, 0x0004002B, 0x0000000D,\n    0x00000172, 0x3AC1C1C2, 0x0004002B, 0x0000000D, 0x00000399, 0xB820A0A1,\n    0x0004002B, 0x0000000D, 0x0000040F, 0x3A4ECECF, 0x0004002B, 0x0000000D,\n    0x0000091E, 0xBAEFEFF0, 0x0004002B, 0x0000000D, 0x000008D5, 0x399C9C9D,\n    0x0004002B, 0x0000000D, 0x000008DE, 0x3A818182, 0x0004002B, 0x0000000D,\n    0x000002EB, 0xBA99999A, 0x0004002B, 0x0000000D, 0x00000317, 0x3938B8B9,\n    0x0004002B, 0x0000000D, 0x0000034E, 0x3AD7D7D8, 0x0004002B, 0x0000000D,\n    0x00000111, 0xBACFCFD0, 0x0004002B, 0x0000000D, 0x0000002B, 0x39B4B4B5,\n    0x0004002B, 0x0000000D, 0x000008E1, 0x3AF3F3F4, 0x0004002B, 0x0000000D,\n    0x0000042A, 0xBAE7E7E8, 0x0004002B, 0x0000000D, 0x00000765, 0xBA62E2E3,\n    0x0004002B, 0x0000000D, 0x000009A2, 0x3A6AEAEB, 0x0004002B, 0x0000000D,\n    0x000004F2, 0x3928A8A9, 0x0004002B, 0x0000000D, 0x0000058A, 0xBA72F2F3,\n    0x0004002B, 0x0000000D, 0x000007E0, 0xBAC7C7C8, 0x0004002B, 0x0000000D,\n    0x00000802, 0xBA2AAAAB, 0x0004002B, 0x0000000D, 0x00000A1C, 0x3AA9A9AA,\n    0x0004002B, 0x0000000D, 0x00000940, 0xBA52D2D3, 0x0004002B, 0x0000000D,\n    0x000002EC, 0xBABFBFC0, 0x0004002B, 0x0000000D, 0x000003ED, 0x3AEBEBEC,\n    0x0004002B, 0x0000000D, 0x000004EB, 0xBA5EDEDF, 0x0004002B, 0x0000000D,\n    0x00000234, 0x3A5EDEDF, 0x0004002B, 0x0000000D, 0x00000245, 0xB9ECECED,\n    0x0004002B, 0x0000000D, 0x00000603, 0xBA8B8B8C, 0x0004002B, 0x0000000D,\n    0x00000984, 0xB9189899, 0x0004002B, 0x0000000D, 0x0000076E, 0x3978F8F9,\n    0x0004002B, 0x0000000D, 0x00000841, 0x3AB9B9BA, 0x0004002B, 0x0000000D,\n    0x000009DD, 0xBA1A9A9B, 0x0004002B, 0x0000000D, 0x000003F3, 0xB948C8C9,\n    0x0004002B, 0x0000000D, 0x00000B5A, 0x3AD1D1D2, 0x0004002B, 0x0000000D,\n    0x00000B58, 0x3A858586, 0x0004002B, 0x0000000D, 0x00000838, 0x39D4D4D5,\n    0x0004002B, 0x0000000D, 0x00000218, 0xB958D8D9, 0x0004002B, 0x0000000D,\n    0x00000A1D, 0x3ACFCFD0, 0x0004002B, 0x0000000D, 0x0000054B, 0x3A2AAAAB,\n    0x0004002B, 0x0000000D, 0x00000503, 0xB8909091, 0x0004002B, 0x0000000D,\n    0x00000169, 0x39DCDCDD, 0x0004002B, 0x0000000D, 0x00000605, 0xBAD7D7D8,\n    0x0004002B, 0x0000000D, 0x0000048A, 0x3AB3B3B4, 0x0004002B, 0x0000000D,\n    0x000002D3, 0x3A72F2F3, 0x0004002B, 0x0000000D, 0x00000A7C, 0xBA2EAEAF,\n    0x0004002B, 0x0000000D, 0x00000171, 0x3A9B9B9C, 0x0004002B, 0x0000000D,\n    0x000001AF, 0xBABDBDBE, 0x0004002B, 0x0000000D, 0x000004AC, 0x3A169697,\n    0x0004002B, 0x0000000D, 0x0000024F, 0xBAF7F7F8, 0x0004002B, 0x0000000D,\n    0x00000ADE, 0x3A46C6C7, 0x0004002B, 0x0000000D, 0x00000110, 0xBAA9A9AA,\n    0x0004002B, 0x0000000D, 0x00000212, 0x3AFBFBFC, 0x0004002B, 0x0000000D,\n    0x00000742, 0xBAD9D9DA, 0x0004002B, 0x0000000D, 0x00000389, 0xBA878788,\n    0x0004002B, 0x0000000D, 0x000006C4, 0xBA028283, 0x0004002B, 0x0000000D,\n    0x00000B98, 0xBAF3F3F4, 0x0004002B, 0x0000000D, 0x000002AE, 0x3A9D9D9E,\n    0x0004002B, 0x0000000D, 0x000009B1, 0xB9ACACAD, 0x0004002B, 0x0000000D,\n    0x00000741, 0xBAB3B3B4, 0x0004002B, 0x0000000D, 0x00000211, 0x3AD5D5D6,\n    0x0004002B, 0x0000000D, 0x00000A5B, 0xBAF1F1F2, 0x0004002B, 0x0000000D,\n    0x000005EA, 0x3A3EBEBF, 0x0004002B, 0x0000000D, 0x00000310, 0xBA6EEEEF,\n    0x0004002B, 0x0000000D, 0x0000052A, 0x3AEDEDEE, 0x0004002B, 0x0000000D,\n    0x00000071, 0xBA959596, 0x0004002B, 0x0000000D, 0x00000107, 0xB9C4C4C5,\n    0x0004002B, 0x0000000D, 0x000006A2, 0x38D0D0D1, 0x0004002B, 0x0000000D,\n    0x00000B1B, 0xBA42C2C3, 0x0004002B, 0x0000000D, 0x00000034, 0x3A99999A,\n    0x0004002B, 0x0000000D, 0x0000024B, 0x38909091, 0x0004002B, 0x0000000D,\n    0x000002AF, 0x3AC3C3C4, 0x0004002B, 0x0000000D, 0x00000A41, 0x3A7EFEFF,\n    0x0004002B, 0x0000000D, 0x00000A7E, 0xBA7AFAFB, 0x0004002B, 0x0000000D,\n    0x0000034F, 0x3AFDFDFE, 0x0004002B, 0x0000000D, 0x00000901, 0x3A0A8A8B,\n    0x0004002B, 0x0000000D, 0x00000539, 0x3860E0E1, 0x0004002B, 0x0000000D,\n    0x0000091C, 0xBAA3A3A4, 0x0004002B, 0x0000000D, 0x000001A4, 0xB98C8C8D,\n    0x0004002B, 0x0000000D, 0x00000666, 0x3AC9C9CA, 0x0004002B, 0x0000000D,\n    0x00000833, 0xB7008081, 0x0004002B, 0x0000000D, 0x00000206, 0x39A4A4A5,\n    0x0004002B, 0x0000000D, 0x00000210, 0x3AAFAFB0, 0x0004002B, 0x0000000D,\n    0x000002ED, 0xBAE5E5E6, 0x0004002B, 0x0000000D, 0x0000040D, 0x3A028283,\n    0x0004002B, 0x0000000D, 0x00000428, 0xBA9B9B9C, 0x0004002B, 0x0000000D,\n    0x00000195, 0x3A4ACACB, 0x0004002B, 0x0000000D, 0x000004C7, 0xBAAFAFB0,\n    0x0004002B, 0x0000000D, 0x00000AB0, 0x398C8C8D, 0x0004002B, 0x0000000D,\n    0x00000429, 0xBAC1C1C2, 0x0004002B, 0x0000000D, 0x00000B5F, 0xB9088889,\n    0x0004002B, 0x0000000D, 0x0000044C, 0xBA4ACACB, 0x0004002B, 0x0000000D,\n    0x00000B59, 0x3AABABAC, 0x0004002B, 0x0000000D, 0x00000344, 0x39CCCCCD,\n    0x0004002B, 0x0000000D, 0x000007C7, 0x3A7AFAFB, 0x0004002B, 0x0000000D,\n    0x00000739, 0xB9F4F4F5, 0x0004002B, 0x0000000D, 0x0000091D, 0xBAC9C9CA,\n    0x0004002B, 0x0000000D, 0x000000D2, 0x3A878788, 0x0004002B, 0x0000000D,\n    0x00000133, 0xBA32B2B3, 0x0004002B, 0x0000000D, 0x000005C8, 0x3ADBDBDC,\n    0x0004002B, 0x0000000D, 0x00000A1B, 0x3A838384, 0x0004002B, 0x0000000D,\n    0x00000420, 0xB9DCDCDD, 0x0004002B, 0x0000000D, 0x000002B0, 0x3AE9E9EA,\n    0x0004002B, 0x0000000D, 0x00000A25, 0xB978F8F9, 0x0004002B, 0x0000000D,\n    0x0000030E, 0xBA22A2A3, 0x0004002B, 0x0000000D, 0x0000048B, 0x3AD9D9DA,\n    0x0004002B, 0x0000000D, 0x00000B7D, 0x3A5ADADB, 0x0004002B, 0x0000000D,\n    0x00000073, 0xBAE1E1E2, 0x0004002B, 0x0000000D, 0x00000740, 0xBA8D8D8E,\n    0x0004002B, 0x0000000D, 0x00000173, 0x3AE7E7E8, 0x0004002B, 0x0000000D,\n    0x000006C6, 0xBA4ECECF, 0x0004002B, 0x0000000D, 0x00000567, 0xBAE9E9EA,\n    0x0004002B, 0x0000000D, 0x00000A3F, 0x3A32B2B3, 0x0004002B, 0x0000000D,\n    0x00000B95, 0xBA818182, 0x0004002B, 0x0000000D, 0x0000038A, 0xBAADADAE,\n    0x0004002B, 0x0000000D, 0x000005CE, 0xB938B8B9, 0x0004002B, 0x0000000D,\n    0x000006A3, 0xBAC5C5C6, 0x0004002B, 0x0000000D, 0x000006FA, 0x39ACACAD,\n    0x0004002B, 0x0000000D, 0x00000743, 0xBB000000, 0x0004002B, 0x0000000D,\n    0x000007C5, 0x3A2EAEAF, 0x0004002B, 0x0000000D, 0x0000038B, 0xBAD3D3D4,\n    0x0004002B, 0x0000000D, 0x00000ABA, 0x3A979798, 0x0004002B, 0x0000000D,\n    0x00000B51, 0x39ECECED, 0x0004002B, 0x0000000D, 0x00000914, 0xB9E4E4E5,\n    0x0004002B, 0x0000000D, 0x0000013C, 0x3948C8C9, 0x0004002B, 0x0000000D,\n    0x00000566, 0xBAC3C3C4, 0x0004002B, 0x0000000D, 0x0000097D, 0x3A959596,\n    0x0004002B, 0x0000000D, 0x00000A58, 0x38B0B0B1, 0x0004002B, 0x0000000D,\n    0x00000B5B, 0x3AF7F7F8, 0x0004002B, 0x0000000D, 0x00000704, 0x3AB7B7B8,\n    0x0004002B, 0x0000000D, 0x00000232, 0x3A129293, 0x0004002B, 0x0000000D,\n    0x000002EE, 0x38F0F0F1, 0x0004002B, 0x0000000D, 0x000007A2, 0x3AA5A5A6,\n    0x0004002B, 0x0000000D, 0x00000763, 0xBA169697, 0x0004002B, 0x0000000D,\n    0x00000135, 0xBA7EFEFF, 0x0004002B, 0x0000000D, 0x000000D3, 0x3AADADAE,\n    0x0004002B, 0x0000000D, 0x00000949, 0x3968E8E9, 0x0004002B, 0x0000000D,\n    0x000001D2, 0xBA46C6C7, 0x0004002B, 0x0000000D, 0x00000604, 0xBAB1B1B2,\n    0x0004002B, 0x0000000D, 0x00000035, 0x3ABFBFC0, 0x0004002B, 0x0000000D,\n    0x000004AE, 0x3A62E2E3, 0x0004002B, 0x0000000D, 0x000007D6, 0xB9BCBCBD,\n    0x0004002B, 0x0000000D, 0x00000B7B, 0x3A0E8E8F, 0x0004002B, 0x0000000D,\n    0x00000AF7, 0xBA939394, 0x0004002B, 0x0000000D, 0x00000873, 0xB9848485,\n    0x0004002B, 0x0000000D, 0x000004E9, 0xBA129293, 0x0004002B, 0x0000000D,\n    0x000007E1, 0xBAEDEDEE, 0x0004002B, 0x0000000D, 0x0000097F, 0x3AE1E1E2,\n    0x0004002B, 0x0000000D, 0x000001AE, 0xBA979798, 0x0004002B, 0x0000000D,\n    0x00000864, 0x3A42C2C3, 0x0004002B, 0x0000000D, 0x000008E0, 0x3ACDCDCE,\n    0x0004002B, 0x0000000D, 0x000005A3, 0xB8F0F0F1, 0x0004002B, 0x0000000D,\n    0x000006A4, 0xBA9F9FA0, 0x0004002B, 0x0000000D, 0x00000667, 0x3AEFEFF0,\n    0x0004002B, 0x0000000D, 0x00000961, 0x37C0C0C1, 0x0004002B, 0x0000000D,\n    0x000004C9, 0xBAFBFBFC, 0x0004002B, 0x0000000D, 0x00000ABC, 0x3AE3E3E4,\n    0x0004002B, 0x0000000D, 0x00000627, 0xBA3ABABB, 0x0004002B, 0x0000000D,\n    0x000007A3, 0x3ACBCBCC, 0x0004002B, 0x0000000D, 0x00000AF9, 0xBADFDFE0,\n    0x0004002B, 0x0000000D, 0x00000528, 0x3AA1A1A2, 0x0004002B, 0x0000000D,\n    0x00000B24, 0x3958D8D9, 0x0004002B, 0x0000000D, 0x0000020F, 0x3A89898A,\n    0x0004002B, 0x0000000D, 0x000008A1, 0xBA3EBEBF, 0x0004002B, 0x0000000D,\n    0x000004C8, 0xBAD5D5D6, 0x0004002B, 0x0000000D, 0x000004BD, 0xB9A4A4A5,\n    0x0004002B, 0x0000000D, 0x00000976, 0x39FCFCFD, 0x0004002B, 0x0000000D,\n    0x000006A5, 0xBAEBEBEC, 0x0004002B, 0x0000000D, 0x0000054D, 0x3A76F6F7,\n    0x0004002B, 0x0000000D, 0x000002E2, 0xB9B4B4B5, 0x0004002B, 0x0000000D,\n    0x000000F6, 0x3A36B6B7, 0x0004002B, 0x0000000D, 0x0000024C, 0xBA858586,\n    0x0004002B, 0x0000000D, 0x00000B97, 0xBACDCDCE, 0x0004002B, 0x0000000D,\n    0x00000055, 0xB7C0C0C1, 0x0004002B, 0x0000000D, 0x00000B96, 0xBAA7A7A8,\n    0x0004002B, 0x0000000D, 0x00000689, 0x3A52D2D3, 0x0004002B, 0x0000000D,\n    0x00000096, 0xBA6AEAEB, 0x0004002B, 0x0000000D, 0x00000072, 0xBABBBBBC,\n    0x0004002B, 0x0000000D, 0x000009A0, 0x3A1E9E9F, 0x0004002B, 0x0000000D,\n    0x0000014C, 0xB8B0B0B1, 0x0004002B, 0x0000000D, 0x00000059, 0x3A6EEEEF,\n    0x0004002B, 0x0000000D, 0x0000048C, 0x3B000000, 0x0004002B, 0x0000000D,\n    0x000009BB, 0xBAB7B7B8, 0x0004002B, 0x0000000D, 0x00000588, 0xBA26A6A7,\n    0x0004002B, 0x0000000D, 0x000003EC, 0x3AC5C5C6, 0x0004002B, 0x0000000D,\n    0x00000BBA, 0xBA56D6D7, 0x0004002B, 0x0000000D, 0x00000665, 0x3AA3A3A4,\n    0x0004002B, 0x0000000D, 0x000005BC, 0x39848485, 0x0004002B, 0x0000000D,\n    0x00000529, 0x3AC7C7C8, 0x0004002B, 0x0000000D, 0x00000840, 0x3A939394,\n    0x0004002B, 0x0000000D, 0x0000051F, 0x39BCBCBD, 0x0004002B, 0x0000000D,\n    0x000005FB, 0xB9CCCCCD, 0x0004002B, 0x0000000D, 0x000000D5, 0x3AF9F9FA,\n    0x0004002B, 0x0000000D, 0x000005C7, 0x3AB5B5B6, 0x0004002B, 0x0000000D,\n    0x000009BA, 0xBA919192, 0x0004002B, 0x0000000D, 0x000000D4, 0x3AD3D3D4,\n    0x0004002B, 0x0000000D, 0x000009DF, 0xBA66E6E7, 0x0004002B, 0x0000000D,\n    0x000006CD, 0x39189899, 0x0004002B, 0x0000000D, 0x00000489, 0x3A8D8D8E,\n    0x0004002B, 0x0000000D, 0x000007F0, 0xB860E0E1, 0x0004002B, 0x0000000D,\n    0x000003E1, 0x39949495, 0x0004002B, 0x0000000D, 0x000009BC, 0xBADDDDDE,\n    0x0004002B, 0x0000000D, 0x00000A59, 0xBAA5A5A6, 0x0004002B, 0x0000000D,\n    0x0000093E, 0xBA068687, 0x0004002B, 0x0000000D, 0x000007A9, 0xB928A8A9,\n    0x0004002B, 0x0000000D, 0x00000112, 0xBAF5F5F6, 0x0004002B, 0x0000000D,\n    0x00000271, 0xBA5ADADB, 0x0004002B, 0x0000000D, 0x000002D1, 0x3A26A6A7,\n    0x0004002B, 0x0000000D, 0x0000057C, 0x37008081, 0x0004002B, 0x0000000D,\n    0x0000038C, 0xBAF9F9FA, 0x0004002B, 0x0000000D, 0x0000003D, 0xB968E8E9,\n    0x0004002B, 0x0000000D, 0x00000A13, 0x39C4C4C5, 0x0004002B, 0x0000000D,\n    0x000001B0, 0xBAE3E3E4, 0x0004002B, 0x0000000D, 0x00000AEF, 0xB9D4D4D5,\n    0x0004002B, 0x0000000D, 0x000007DF, 0xBAA1A1A2, 0x0004002B, 0x0000000D,\n    0x00000842, 0x3ADFDFE0, 0x0004002B, 0x0000000D, 0x00000804, 0xBA76F6F7,\n    0x0004002B, 0x0000000D, 0x00000903, 0x3A56D6D7, 0x0004002B, 0x0000000D,\n    0x000007A4, 0x3AF1F1F2, 0x0004002B, 0x0000000D, 0x00000482, 0x39F4F4F5,\n    0x0103002C, 0x000002D4, 0x0000079B, 0x0000010F, 0x00000728, 0x00000705,\n    0x00000A5A, 0x000008DF, 0x00000094, 0x0000034C, 0x0000087E, 0x0000034D,\n    0x00000687, 0x000003EB, 0x0000024E, 0x00000726, 0x00000698, 0x00000703,\n    0x00000AF8, 0x00000ABB, 0x0000026F, 0x000008A8, 0x00000565, 0x0000065D,\n    0x000004C6, 0x00000057, 0x0000006A, 0x00000A1E, 0x0000087D, 0x00000959,\n    0x00000BB8, 0x0000097E, 0x00000606, 0x000003AD, 0x000000E2, 0x00000370,\n    0x0000024D, 0x000005C6, 0x00000B8C, 0x00000036, 0x0000087F, 0x00000172,\n    0x00000399, 0x0000040F, 0x0000091E, 0x000008D5, 0x000008DE, 0x000002EB,\n    0x00000317, 0x0000034E, 0x00000111, 0x0000002B, 0x000008E1, 0x0000042A,\n    0x00000765, 0x000009A2, 0x000004F2, 0x0000058A, 0x000007E0, 0x00000802,\n    0x00000A1C, 0x00000940, 0x000002EC, 0x000003ED, 0x000004EB, 0x00000234,\n    0x00000245, 0x00000603, 0x00000984, 0x0000076E, 0x00000841, 0x000009DD,\n    0x000003F3, 0x00000B5A, 0x00000B58, 0x00000838, 0x00000218, 0x00000A1D,\n    0x0000054B, 0x00000503, 0x00000169, 0x00000605, 0x0000048A, 0x000002D3,\n    0x00000A7C, 0x00000171, 0x000001AF, 0x000004AC, 0x0000024F, 0x00000ADE,\n    0x00000110, 0x00000212, 0x00000742, 0x00000389, 0x000006C4, 0x00000B98,\n    0x000002AE, 0x000009B1, 0x00000741, 0x00000211, 0x00000A5B, 0x000005EA,\n    0x00000310, 0x0000052A, 0x00000071, 0x00000107, 0x000006A2, 0x00000B1B,\n    0x00000034, 0x0000024B, 0x000002AF, 0x00000A41, 0x00000A7E, 0x0000034F,\n    0x00000901, 0x00000539, 0x0000091C, 0x000001A4, 0x00000666, 0x00000833,\n    0x00000206, 0x00000210, 0x000002ED, 0x0000040D, 0x00000428, 0x00000195,\n    0x000004C7, 0x00000AB0, 0x00000429, 0x00000B5F, 0x0000044C, 0x00000B59,\n    0x00000344, 0x000007C7, 0x00000739, 0x0000091D, 0x000000D2, 0x00000133,\n    0x000005C8, 0x00000A1B, 0x00000420, 0x000002B0, 0x00000A25, 0x0000030E,\n    0x0000048B, 0x00000B7D, 0x00000073, 0x00000740, 0x00000173, 0x000006C6,\n    0x00000567, 0x00000A3F, 0x00000B95, 0x0000038A, 0x000005CE, 0x000006A3,\n    0x000006FA, 0x00000743, 0x000007C5, 0x0000038B, 0x00000ABA, 0x00000B51,\n    0x00000914, 0x0000013C, 0x00000566, 0x0000097D, 0x00000A58, 0x00000B5B,\n    0x00000704, 0x00000232, 0x000002EE, 0x000007A2, 0x00000763, 0x00000135,\n    0x000000D3, 0x00000949, 0x000001D2, 0x00000604, 0x00000035, 0x000004AE,\n    0x000007D6, 0x00000B7B, 0x00000AF7, 0x00000873, 0x000004E9, 0x000007E1,\n    0x0000097F, 0x000001AE, 0x00000864, 0x000008E0, 0x000005A3, 0x000006A4,\n    0x00000667, 0x00000961, 0x000004C9, 0x00000ABC, 0x00000627, 0x000007A3,\n    0x00000AF9, 0x00000528, 0x00000B24, 0x0000020F, 0x000008A1, 0x000004C8,\n    0x000004BD, 0x00000976, 0x000006A5, 0x0000054D, 0x000002E2, 0x000000F6,\n    0x0000024C, 0x00000B97, 0x00000055, 0x00000B96, 0x00000689, 0x00000096,\n    0x00000072, 0x000009A0, 0x0000014C, 0x00000059, 0x0000048C, 0x000009BB,\n    0x00000588, 0x000003EC, 0x00000BBA, 0x00000665, 0x000005BC, 0x00000529,\n    0x00000840, 0x0000051F, 0x000005FB, 0x000000D5, 0x000005C7, 0x000009BA,\n    0x000000D4, 0x000009DF, 0x000006CD, 0x00000489, 0x000007F0, 0x000003E1,\n    0x000009BC, 0x00000A59, 0x0000093E, 0x000007A9, 0x00000112, 0x00000271,\n    0x000002D1, 0x0000057C, 0x0000038C, 0x0000003D, 0x00000A13, 0x000001B0,\n    0x00000AEF, 0x000007DF, 0x00000842, 0x00000804, 0x00000903, 0x000007A4,\n    0x00000482, 0x0004002B, 0x0000000B, 0x00000A3A, 0x00000010, 0x00040020,\n    0x00000551, 0x00000007, 0x000002D4, 0x00040017, 0x0000001D, 0x0000000D,\n    0x00000004, 0x00040020, 0x0000029A, 0x00000001, 0x0000001D, 0x0004003B,\n    0x0000029A, 0x00000C93, 0x00000001, 0x00040017, 0x00000013, 0x0000000D,\n    0x00000002, 0x00040015, 0x0000000C, 0x00000020, 0x00000001, 0x00040017,\n    0x00000012, 0x0000000C, 0x00000002, 0x0004001E, 0x00000404, 0x00000012,\n    0x00000013, 0x00040020, 0x00000681, 0x00000009, 0x00000404, 0x0004003B,\n    0x00000681, 0x00000CE9, 0x00000009, 0x0004002B, 0x0000000C, 0x00000A0B,\n    0x00000000, 0x00040020, 0x0000028F, 0x00000009, 0x00000012, 0x00090019,\n    0x00000097, 0x0000000D, 0x00000001, 0x00000000, 0x00000000, 0x00000000,\n    0x00000001, 0x00000000, 0x00040020, 0x00000313, 0x00000000, 0x00000097,\n    0x0004003B, 0x00000313, 0x00001160, 0x00000000, 0x0002001A, 0x000001FC,\n    0x00040020, 0x00000479, 0x00000000, 0x000001FC, 0x0004003B, 0x00000479,\n    0x0000133F, 0x00000000, 0x0003001B, 0x000001FE, 0x00000097, 0x0004002B,\n    0x0000000D, 0x000000FC, 0x3F000000, 0x0004002B, 0x0000000C, 0x00000A0E,\n    0x00000001, 0x00040020, 0x00000290, 0x00000009, 0x00000013, 0x00040020,\n    0x0000029B, 0x00000003, 0x0000001D, 0x0004003B, 0x0000029B, 0x000014C0,\n    0x00000003, 0x0005002C, 0x00000013, 0x0000061E, 0x000000FC, 0x000000FC,\n    0x0005002C, 0x00000011, 0x0000084A, 0x00000A37, 0x00000A37, 0x0006002C,\n    0x00000018, 0x00000A2C, 0x00000A0C, 0x00000A0C, 0x00000A0C, 0x0006002C,\n    0x00000018, 0x00000A16, 0x0000008A, 0x0000008A, 0x0000008A, 0x00030001,\n    0x0000001D, 0x00000002, 0x00050036, 0x00000008, 0x0000161F, 0x00000000,\n    0x00000502, 0x000200F8, 0x00006179, 0x0004003B, 0x00000551, 0x000047EB,\n    0x00000007, 0x0004003D, 0x0000001D, 0x00005647, 0x00000C93, 0x0007004F,\n    0x00000013, 0x000019A2, 0x00005647, 0x00005647, 0x00000000, 0x00000001,\n    0x0004006E, 0x00000012, 0x000044F8, 0x000019A2, 0x00050041, 0x0000028F,\n    0x00004B4F, 0x00000CE9, 0x00000A0B, 0x0004003D, 0x00000012, 0x00005926,\n    0x00004B4F, 0x00050082, 0x00000012, 0x00005AC4, 0x000044F8, 0x00005926,\n    0x0004007C, 0x00000011, 0x00002986, 0x00005AC4, 0x0004003D, 0x00000097,\n    0x00003A39, 0x00001160, 0x0004003D, 0x000001FC, 0x00004245, 0x0000133F,\n    0x00050056, 0x000001FE, 0x000022CB, 0x00003A39, 0x00004245, 0x00040070,\n    0x00000013, 0x000035BF, 0x00002986, 0x00050081, 0x00000013, 0x00003E2D,\n    0x000035BF, 0x0000061E, 0x00050041, 0x00000290, 0x00002E57, 0x00000CE9,\n    0x00000A0E, 0x0004003D, 0x00000013, 0x00005140, 0x00002E57, 0x00050085,\n    0x00000013, 0x00005F10, 0x00003E2D, 0x00005140, 0x00070058, 0x0000001D,\n    0x00002420, 0x000022CB, 0x00005F10, 0x00000002, 0x00000A0C, 0x00050051,\n    0x0000000D, 0x00005432, 0x00002420, 0x00000000, 0x00060052, 0x0000001D,\n    0x000038B5, 0x00005432, 0x00000002, 0x00000000, 0x00050051, 0x0000000D,\n    0x00004D8C, 0x00002420, 0x00000001, 0x00060052, 0x0000001D, 0x00003F07,\n    0x00004D8C, 0x000038B5, 0x00000001, 0x00050051, 0x0000000D, 0x00004D66,\n    0x00002420, 0x00000002, 0x00060052, 0x0000001D, 0x00004910, 0x00004D66,\n    0x00003F07, 0x00000002, 0x0008004F, 0x00000018, 0x00003E7D, 0x00004910,\n    0x00004910, 0x00000000, 0x00000001, 0x00000002, 0x000500C7, 0x00000011,\n    0x00003108, 0x00002986, 0x0000084A, 0x00050051, 0x0000000B, 0x0000260D,\n    0x00003108, 0x00000001, 0x00050084, 0x0000000B, 0x000053FA, 0x0000260D,\n    0x00000A3A, 0x00050051, 0x0000000B, 0x00005B73, 0x00003108, 0x00000000,\n    0x00050080, 0x0000000B, 0x00003142, 0x000053FA, 0x00005B73, 0x0003003E,\n    0x000047EB, 0x0000079B, 0x00050041, 0x0000028A, 0x000026E6, 0x000047EB,\n    0x00003142, 0x0004003D, 0x0000000D, 0x00006234, 0x000026E6, 0x00060050,\n    0x00000018, 0x0000466C, 0x00006234, 0x00006234, 0x00006234, 0x00050081,\n    0x00000018, 0x000053D2, 0x00003E7D, 0x0000466C, 0x0008000C, 0x00000018,\n    0x00004C45, 0x00000001, 0x0000002B, 0x000053D2, 0x00000A2C, 0x00000A16,\n    0x00050051, 0x0000000D, 0x00004189, 0x00004C45, 0x00000000, 0x00050051,\n    0x0000000D, 0x00004CFC, 0x00004C45, 0x00000001, 0x00050051, 0x0000000D,\n    0x00001D30, 0x00004C45, 0x00000002, 0x00070050, 0x0000001D, 0x00005788,\n    0x00004189, 0x00004CFC, 0x00001D30, 0x0000008A, 0x0003003E, 0x000014C0,\n    0x00005788, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/ui/shaders/bytecode/vulkan_spirv/guest_output_bilinear_ps.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 24950\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint Fragment %main \"main\" %gl_FragCoord %xe_bilinear_color\n               OpExecutionMode %main OriginUpperLeft\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %gl_FragCoord \"gl_FragCoord\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_bilinear_output_offset\"\n               OpMemberName %push_const_block_xe 1 \"xe_bilinear_output_size_inv\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %xe_bilinear_source \"xe_bilinear_source\"\n               OpName %xe_bilinear_sampler \"xe_bilinear_sampler\"\n               OpName %xe_bilinear_color \"xe_bilinear_color\"\n               OpDecorate %gl_FragCoord BuiltIn FragCoord\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 16\n               OpMemberDecorate %push_const_block_xe 1 Offset 24\n               OpDecorate %xe_bilinear_source Binding 0\n               OpDecorate %xe_bilinear_source DescriptorSet 0\n               OpDecorate %xe_bilinear_sampler Binding 1\n               OpDecorate %xe_bilinear_sampler DescriptorSet 0\n               OpDecorate %xe_bilinear_color Location 0\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n      %float = OpTypeFloat 32\n    %v4float = OpTypeVector %float 4\n%_ptr_Input_v4float = OpTypePointer Input %v4float\n%gl_FragCoord = OpVariable %_ptr_Input_v4float Input\n    %v2float = OpTypeVector %float 2\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n%push_const_block_xe = OpTypeStruct %v2int %v2float\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n      %int_0 = OpConstant %int 0\n%_ptr_PushConstant_v2int = OpTypePointer PushConstant %v2int\n        %150 = OpTypeImage %float 2D 0 0 0 1 Unknown\n%_ptr_UniformConstant_150 = OpTypePointer UniformConstant %150\n%xe_bilinear_source = OpVariable %_ptr_UniformConstant_150 UniformConstant\n        %508 = OpTypeSampler\n%_ptr_UniformConstant_508 = OpTypePointer UniformConstant %508\n%xe_bilinear_sampler = OpVariable %_ptr_UniformConstant_508 UniformConstant\n        %510 = OpTypeSampledImage %150\n  %float_0_5 = OpConstant %float 0.5\n      %int_1 = OpConstant %int 1\n%_ptr_PushConstant_v2float = OpTypePointer PushConstant %v2float\n    %float_0 = OpConstant %float 0\n    %float_1 = OpConstant %float 1\n%_ptr_Output_v4float = OpTypePointer Output %v4float\n%xe_bilinear_color = OpVariable %_ptr_Output_v4float Output\n       %1566 = OpConstantComposite %v2float %float_0_5 %float_0_5\n       %main = OpFunction %void None %1282\n      %24949 = OpLabel\n      %18571 = OpLoad %v4float %gl_FragCoord\n      %14008 = OpVectorShuffle %v2float %18571 %18571 0 1\n      %17656 = OpConvertFToS %v2int %14008\n      %19279 = OpAccessChain %_ptr_PushConstant_v2int %push_consts_xe %int_0\n      %22822 = OpLoad %v2int %19279\n      %23236 = OpISub %v2int %17656 %22822\n      %10630 = OpBitcast %v2uint %23236\n      %14905 = OpLoad %150 %xe_bilinear_source\n      %16965 = OpLoad %508 %xe_bilinear_sampler\n       %8907 = OpSampledImage %510 %14905 %16965\n      %13759 = OpConvertUToF %v2float %10630\n      %15917 = OpFAdd %v2float %13759 %1566\n      %11863 = OpAccessChain %_ptr_PushConstant_v2float %push_consts_xe %int_1\n      %20800 = OpLoad %v2float %11863\n      %24336 = OpFMul %v2float %15917 %20800\n       %9229 = OpImageSampleExplicitLod %v4float %8907 %24336 Lod %float_0\n      %21727 = OpCompositeExtract %float %9229 0\n      %22672 = OpCompositeExtract %float %9229 1\n       %7472 = OpCompositeExtract %float %9229 2\n      %22408 = OpCompositeConstruct %v4float %21727 %22672 %7472 %float_1\n               OpStore %xe_bilinear_color %22408\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t guest_output_bilinear_ps[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006176, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0007000F, 0x00000004,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000C93, 0x000014C0, 0x00030010,\n    0x0000161F, 0x00000007, 0x00030003, 0x00000002, 0x000001CC, 0x00090004,\n    0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F, 0x5F776F6C, 0x72747461,\n    0x74756269, 0x00007365, 0x000B0004, 0x455F4C47, 0x735F5458, 0x6C706D61,\n    0x656C7265, 0x745F7373, 0x75747865, 0x665F6572, 0x74636E75, 0x736E6F69,\n    0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F, 0x70635F45, 0x74735F70,\n    0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365, 0x00006576, 0x00080004,\n    0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63, 0x69645F65, 0x74636572,\n    0x00657669, 0x00040005, 0x0000161F, 0x6E69616D, 0x00000000, 0x00060005,\n    0x00000C93, 0x465F6C67, 0x43676172, 0x64726F6F, 0x00000000, 0x00070005,\n    0x00000404, 0x68737570, 0x6E6F635F, 0x625F7473, 0x6B636F6C, 0x0065785F,\n    0x000A0006, 0x00000404, 0x00000000, 0x625F6578, 0x6E696C69, 0x5F726165,\n    0x7074756F, 0x6F5F7475, 0x65736666, 0x00000074, 0x000A0006, 0x00000404,\n    0x00000001, 0x625F6578, 0x6E696C69, 0x5F726165, 0x7074756F, 0x735F7475,\n    0x5F657A69, 0x00766E69, 0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F,\n    0x5F737473, 0x00006578, 0x00070005, 0x00001160, 0x625F6578, 0x6E696C69,\n    0x5F726165, 0x72756F73, 0x00006563, 0x00070005, 0x0000133F, 0x625F6578,\n    0x6E696C69, 0x5F726165, 0x706D6173, 0x0072656C, 0x00070005, 0x000014C0,\n    0x625F6578, 0x6E696C69, 0x5F726165, 0x6F6C6F63, 0x00000072, 0x00040047,\n    0x00000C93, 0x0000000B, 0x0000000F, 0x00030047, 0x00000404, 0x00000002,\n    0x00050048, 0x00000404, 0x00000000, 0x00000023, 0x00000010, 0x00050048,\n    0x00000404, 0x00000001, 0x00000023, 0x00000018, 0x00040047, 0x00001160,\n    0x00000021, 0x00000000, 0x00040047, 0x00001160, 0x00000022, 0x00000000,\n    0x00040047, 0x0000133F, 0x00000021, 0x00000001, 0x00040047, 0x0000133F,\n    0x00000022, 0x00000000, 0x00040047, 0x000014C0, 0x0000001E, 0x00000000,\n    0x00020013, 0x00000008, 0x00030021, 0x00000502, 0x00000008, 0x00040015,\n    0x0000000B, 0x00000020, 0x00000000, 0x00040017, 0x00000011, 0x0000000B,\n    0x00000002, 0x00030016, 0x0000000D, 0x00000020, 0x00040017, 0x0000001D,\n    0x0000000D, 0x00000004, 0x00040020, 0x0000029A, 0x00000001, 0x0000001D,\n    0x0004003B, 0x0000029A, 0x00000C93, 0x00000001, 0x00040017, 0x00000013,\n    0x0000000D, 0x00000002, 0x00040015, 0x0000000C, 0x00000020, 0x00000001,\n    0x00040017, 0x00000012, 0x0000000C, 0x00000002, 0x0004001E, 0x00000404,\n    0x00000012, 0x00000013, 0x00040020, 0x00000681, 0x00000009, 0x00000404,\n    0x0004003B, 0x00000681, 0x00000CE9, 0x00000009, 0x0004002B, 0x0000000C,\n    0x00000A0B, 0x00000000, 0x00040020, 0x0000028F, 0x00000009, 0x00000012,\n    0x00090019, 0x00000096, 0x0000000D, 0x00000001, 0x00000000, 0x00000000,\n    0x00000000, 0x00000001, 0x00000000, 0x00040020, 0x00000313, 0x00000000,\n    0x00000096, 0x0004003B, 0x00000313, 0x00001160, 0x00000000, 0x0002001A,\n    0x000001FC, 0x00040020, 0x00000479, 0x00000000, 0x000001FC, 0x0004003B,\n    0x00000479, 0x0000133F, 0x00000000, 0x0003001B, 0x000001FE, 0x00000096,\n    0x0004002B, 0x0000000D, 0x000000FC, 0x3F000000, 0x0004002B, 0x0000000C,\n    0x00000A0E, 0x00000001, 0x00040020, 0x00000290, 0x00000009, 0x00000013,\n    0x0004002B, 0x0000000D, 0x00000A0C, 0x00000000, 0x0004002B, 0x0000000D,\n    0x0000008A, 0x3F800000, 0x00040020, 0x0000029B, 0x00000003, 0x0000001D,\n    0x0004003B, 0x0000029B, 0x000014C0, 0x00000003, 0x0005002C, 0x00000013,\n    0x0000061E, 0x000000FC, 0x000000FC, 0x00050036, 0x00000008, 0x0000161F,\n    0x00000000, 0x00000502, 0x000200F8, 0x00006175, 0x0004003D, 0x0000001D,\n    0x0000488B, 0x00000C93, 0x0007004F, 0x00000013, 0x000036B8, 0x0000488B,\n    0x0000488B, 0x00000000, 0x00000001, 0x0004006E, 0x00000012, 0x000044F8,\n    0x000036B8, 0x00050041, 0x0000028F, 0x00004B4F, 0x00000CE9, 0x00000A0B,\n    0x0004003D, 0x00000012, 0x00005926, 0x00004B4F, 0x00050082, 0x00000012,\n    0x00005AC4, 0x000044F8, 0x00005926, 0x0004007C, 0x00000011, 0x00002986,\n    0x00005AC4, 0x0004003D, 0x00000096, 0x00003A39, 0x00001160, 0x0004003D,\n    0x000001FC, 0x00004245, 0x0000133F, 0x00050056, 0x000001FE, 0x000022CB,\n    0x00003A39, 0x00004245, 0x00040070, 0x00000013, 0x000035BF, 0x00002986,\n    0x00050081, 0x00000013, 0x00003E2D, 0x000035BF, 0x0000061E, 0x00050041,\n    0x00000290, 0x00002E57, 0x00000CE9, 0x00000A0E, 0x0004003D, 0x00000013,\n    0x00005140, 0x00002E57, 0x00050085, 0x00000013, 0x00005F10, 0x00003E2D,\n    0x00005140, 0x00070058, 0x0000001D, 0x0000240D, 0x000022CB, 0x00005F10,\n    0x00000002, 0x00000A0C, 0x00050051, 0x0000000D, 0x000054DF, 0x0000240D,\n    0x00000000, 0x00050051, 0x0000000D, 0x00005890, 0x0000240D, 0x00000001,\n    0x00050051, 0x0000000D, 0x00001D30, 0x0000240D, 0x00000002, 0x00070050,\n    0x0000001D, 0x00005788, 0x000054DF, 0x00005890, 0x00001D30, 0x0000008A,\n    0x0003003E, 0x000014C0, 0x00005788, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/ui/shaders/bytecode/vulkan_spirv/guest_output_ffx_cas_resample_dither_ps.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25213\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint Fragment %main \"main\" %gl_FragCoord %xe_cas_color\n               OpExecutionMode %main OriginUpperLeft\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %gl_FragCoord \"gl_FragCoord\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_cas_output_offset\"\n               OpMemberName %push_const_block_xe 1 \"xe_cas_input_output_size_ratio\"\n               OpMemberName %push_const_block_xe 2 \"xe_cas_sharpness_post_setup\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %xe_cas_color \"xe_cas_color\"\n               OpName %xe_cas_source \"xe_cas_source\"\n               OpDecorate %gl_FragCoord BuiltIn FragCoord\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 16\n               OpMemberDecorate %push_const_block_xe 1 Offset 24\n               OpMemberDecorate %push_const_block_xe 2 Offset 32\n               OpDecorate %xe_cas_color Location 0\n               OpDecorate %xe_cas_source Binding 0\n               OpDecorate %xe_cas_source DescriptorSet 0\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n      %float = OpTypeFloat 32\n%_ptr_Function_float = OpTypePointer Function %float\n    %v3float = OpTypeVector %float 3\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n     %v4uint = OpTypeVector %uint 4\n    %float_0 = OpConstant %float 0\n    %float_1 = OpConstant %float 1\n    %uint_15 = OpConstant %uint 15\n   %uint_256 = OpConstant %uint 256\n%_arr_float_uint_256 = OpTypeArray %float %uint_256\n%float_n0_00100337015 = OpConstant %float -0.00100337015\n%float_0_000880821084 = OpConstant %float 0.000880821084\n%float_0_00169270835 = OpConstant %float 0.00169270835\n%float_n0_00155484071 = OpConstant %float -0.00155484071\n%float_0_00127910543 = OpConstant %float 0.00127910543\n%float_n0_000605085806 = OpConstant %float -0.000605085806\n%float_0_00106464466 = OpConstant %float 0.00106464466\n%float_n0_00138633582 = OpConstant %float -0.00138633582\n%float_0_00135569857 = OpConstant %float 0.00135569857\n%float_0_000513174047 = OpConstant %float 0.000513174047\n%float_0_00121783093 = OpConstant %float 0.00121783093\n%float_n0_00160079659 = OpConstant %float -0.00160079659\n%float_0_00058976718 = OpConstant %float 0.00058976718\n%float_n0_00028339462 = OpConstant %float -0.00028339462\n%float_0_00111060054 = OpConstant %float 0.00111060054\n%float_n0_00141697307 = OpConstant %float -0.00141697307\n%float_0_00144761032 = OpConstant %float 0.00144761032\n%float_n0_0005438113 = OpConstant %float -0.0005438113\n%float_0_00013020834 = OpConstant %float 0.00013020834\n%float_n0_0012025123 = OpConstant %float -0.0012025123\n%float_0_000436580885 = OpConstant %float 0.000436580885\n%float_n0_00104932603 = OpConstant %float -0.00104932603\n%float_0_000620404433 = OpConstant %float 0.000620404433\n%float_n0_000482536765 = OpConstant %float -0.000482536765\n%float_0_00187653187 = OpConstant %float 0.00187653187\n%float_n0_00109528191 = OpConstant %float -0.00109528191\n%float_n9_95710798en05 = OpConstant %float -9.95710798e-05\n%float_n0_000528492674 = OpConstant %float -0.000528492674\n%float_0_0014322917 = OpConstant %float 0.0014322917\n%float_n0_00193780637 = OpConstant %float -0.00193780637\n%float_n0_000696997566 = OpConstant %float -0.000696997566\n%float_3_829657en05 = OpConstant %float 3.829657e-05\n%float_0_000712316192 = OpConstant %float 0.000712316192\n%float_n0_00130974269 = OpConstant %float -0.00130974269\n%float_0_00109528191 = OpConstant %float 0.00109528191\n%float_n0_000298713247 = OpConstant %float -0.000298713247\n%float_0_00175398286 = OpConstant %float 0.00175398286\n%float_n0_00167738972 = OpConstant %float -0.00167738972\n%float_0_00147824758 = OpConstant %float 0.00147824758\n%float_n3_829657en05 = OpConstant %float -3.829657e-05\n%float_0_000788909325 = OpConstant %float 0.000788909325\n%float_n0_00183057599 = OpConstant %float -0.00183057599\n%float_0_000298713247 = OpConstant %float 0.000298713247\n%float_0_000988051528 = OpConstant %float 0.000988051528\n%float_n0_00117187505 = OpConstant %float -0.00117187505\n%float_0_00017616422 = OpConstant %float 0.00017616422\n%float_0_00164675247 = OpConstant %float 0.00164675247\n%float_n0_00158547796 = OpConstant %float -0.00158547796\n%float_0_000344669126 = OpConstant %float 0.000344669126\n%float_0_00186121324 = OpConstant %float 0.00186121324\n%float_n0_00176930148 = OpConstant %float -0.00176930148\n%float_n0_000865502458 = OpConstant %float -0.000865502458\n%float_0_000896139711 = OpConstant %float 0.000896139711\n%float_0_000160845593 = OpConstant %float 0.000160845593\n%float_n0_000926776964 = OpConstant %float -0.000926776964\n%float_n0_00152420346 = OpConstant %float -0.00152420346\n%float_n0_000651041686 = OpConstant %float -0.000651041686\n%float_0_00129442406 = OpConstant %float 0.00129442406\n%float_n0_000804227951 = OpConstant %float -0.000804227951\n%float_n0_00146292895 = OpConstant %float -0.00146292895\n%float_0_00179993873 = OpConstant %float 0.00179993873\n%float_n0_000850183831 = OpConstant %float -0.000850183831\n%float_0_000850183831 = OpConstant %float 0.000850183831\n%float_n0_000451899512 = OpConstant %float -0.000451899512\n%float_n0_00106464466 = OpConstant %float -0.00106464466\n%float_n0_000145526967 = OpConstant %float -0.000145526967\n%float_0_000237438726 = OpConstant %float 0.000237438726\n%float_0_00141697307 = OpConstant %float 0.00141697307\n%float_n0_00058976718 = OpConstant %float -0.00058976718\n%float_n0_000191482846 = OpConstant %float -0.000191482846\n%float_0_00160079659 = OpConstant %float 0.00160079659\n%float_0_00101868878 = OpConstant %float 0.00101868878\n%float_0_000405943632 = OpConstant %float 0.000405943632\n%float_n0_000206801473 = OpConstant %float -0.000206801473\n%float_0_00158547796 = OpConstant %float 0.00158547796\n%float_0_000651041686 = OpConstant %float 0.000651041686\n%float_n6_89338267en05 = OpConstant %float -6.89338267e-05\n%float_0_000421262259 = OpConstant %float 0.000421262259\n%float_n0_00164675247 = OpConstant %float -0.00164675247\n%float_0_00137101719 = OpConstant %float 0.00137101719\n%float_0_000926776964 = OpConstant %float 0.000926776964\n%float_n0_000666360313 = OpConstant %float -0.000666360313\n%float_0_00118719367 = OpConstant %float 0.00118719367\n%float_n0_00144761032 = OpConstant %float -0.00144761032\n%float_0_000574448553 = OpConstant %float 0.000574448553\n%float_n0_00189185049 = OpConstant %float -0.00189185049\n%float_0_000758272072 = OpConstant %float 0.000758272072\n%float_n0_00129442406 = OpConstant %float -0.00129442406\n%float_0_00192248775 = OpConstant %float 0.00192248775\n%float_n0_0016620711 = OpConstant %float -0.0016620711\n%float_n0_00103400741 = OpConstant %float -0.00103400741\n%float_n0_000497855421 = OpConstant %float -0.000497855421\n%float_n0_00186121324 = OpConstant %float -0.00186121324\n%float_0_0012025123 = OpConstant %float 0.0012025123\n%float_n0_0003293505 = OpConstant %float -0.0003293505\n%float_n0_00137101719 = OpConstant %float -0.00137101719\n%float_0_00163143384 = OpConstant %float 0.00163143384\n%float_n0_00184589461 = OpConstant %float -0.00184589461\n%float_0_000727634819 = OpConstant %float 0.000727634819\n%float_n0_000911458337 = OpConstant %float -0.000911458337\n%float_0_00181525736 = OpConstant %float 0.00181525736\n%float_n0_00114123779 = OpConstant %float -0.00114123779\n%float_n0_000375306379 = OpConstant %float -0.000375306379\n%float_9_95710798en05 = OpConstant %float 9.95710798e-05\n%float_n0_000742953445 = OpConstant %float -0.000742953445\n%float_0_00117187505 = OpConstant %float 0.00117187505\n%float_6_89338267en05 = OpConstant %float 6.89338267e-05\n%float_0_0014935662 = OpConstant %float 0.0014935662\n%float_0_000972732843 = OpConstant %float 0.000972732843\n%float_n0_000957414217 = OpConstant %float -0.000957414217\n%float_0_00193780637 = OpConstant %float 0.00193780637\n%float_0_000528492674 = OpConstant %float 0.000528492674\n%float_5_36151965en05 = OpConstant %float 5.36151965e-05\n%float_n0_00124846818 = OpConstant %float -0.00124846818\n%float_n0_000268075994 = OpConstant %float -0.000268075994\n%float_0_00153952208 = OpConstant %float 0.00153952208\n%float_n7_65931418en06 = OpConstant %float -7.65931418e-06\n%float_0_000314031873 = OpConstant %float 0.000314031873\n%float_0_00134037994 = OpConstant %float 0.00134037994\n%float_n0_00175398286 = OpConstant %float -0.00175398286\n%float_0_000497855421 = OpConstant %float 0.000497855421\n%float_n0_00118719367 = OpConstant %float -0.00118719367\n%float_0_000773590698 = OpConstant %float 0.000773590698\n%float_n0_00134037994 = OpConstant %float -0.00134037994\n%float_0_000268075994 = OpConstant %float 0.000268075994\n%float_n0_00147824758 = OpConstant %float -0.00147824758\n%float_n0_00013020834 = OpConstant %float -0.00013020834\n%float_n0_000773590698 = OpConstant %float -0.000773590698\n%float_0_00130974269 = OpConstant %float 0.00130974269\n%float_0_000390625006 = OpConstant %float 0.000390625006\n%float_0_000957414217 = OpConstant %float 0.000957414217\n%float_n0_000467218139 = OpConstant %float -0.000467218139\n%float_n0_00153952208 = OpConstant %float -0.00153952208\n%float_0_00103400741 = OpConstant %float 0.00103400741\n%float_n0_000681678939 = OpConstant %float -0.000681678939\n%float_0_00167738972 = OpConstant %float 0.00167738972\n%float_0_00100337015 = OpConstant %float 0.00100337015\n%float_n0_000421262259 = OpConstant %float -0.000421262259\n%float_0_00178462011 = OpConstant %float 0.00178462011\n%float_n0_000237438726 = OpConstant %float -0.000237438726\n%float_n0_000620404433 = OpConstant %float -0.000620404433\n%float_0_0016620711 = OpConstant %float 0.0016620711\n%float_0_000834865205 = OpConstant %float 0.000834865205\n%float_n0_0017233456 = OpConstant %float -0.0017233456\n%float_n0_00107996329 = OpConstant %float -0.00107996329\n%float_0_00176930148 = OpConstant %float 0.00176930148\n%float_n0_000788909325 = OpConstant %float -0.000788909325\n%float_n0_00178462011 = OpConstant %float -0.00178462011\n%float_0_000681678939 = OpConstant %float 0.000681678939\n%float_n0_000988051528 = OpConstant %float -0.000988051528\n%float_n0_00132506131 = OpConstant %float -0.00132506131\n%float_n0_00017616422 = OpConstant %float -0.00017616422\n%float_n0_00150888483 = OpConstant %float -0.00150888483\n%float_0_0003293505 = OpConstant %float 0.0003293505\n%float_n0_001953125 = OpConstant %float -0.001953125\n%float_0_000666360313 = OpConstant %float 0.000666360313\n%float_n0_00161611522 = OpConstant %float -0.00161611522\n%float_0_00115655642 = OpConstant %float 0.00115655642\n%float_0_000451899512 = OpConstant %float 0.000451899512\n%float_n0_000436580885 = OpConstant %float -0.000436580885\n%float_0_000191482846 = OpConstant %float 0.000191482846\n%float_n0_0014935662 = OpConstant %float -0.0014935662\n%float_0_00114123779 = OpConstant %float 0.00114123779\n%float_8_42524532en05 = OpConstant %float 8.42524532e-05\n%float_0_00189185049 = OpConstant %float 0.00189185049\n%float_0_00140165444 = OpConstant %float 0.00140165444\n%float_0_000559129927 = OpConstant %float 0.000559129927\n%float_0_000114889706 = OpConstant %float 0.000114889706\n%float_0_00126378681 = OpConstant %float 0.00126378681\n%float_n0_000574448553 = OpConstant %float -0.000574448553\n%float_n0_000972732843 = OpConstant %float -0.000972732843\n%float_0_00132506131 = OpConstant %float 0.00132506131\n%float_0_000222120099 = OpConstant %float 0.000222120099\n%float_n0_000758272072 = OpConstant %float -0.000758272072\n%float_n0_00135569857 = OpConstant %float -0.00135569857\n%float_0_00146292895 = OpConstant %float 0.00146292895\n%float_0_000865502458 = OpConstant %float 0.000865502458\n%float_n0_000359987753 = OpConstant %float -0.000359987753\n%float_0_0005438113 = OpConstant %float 0.0005438113\n%float_n0_00112591917 = OpConstant %float -0.00112591917\n%float_n0_000252757367 = OpConstant %float -0.000252757367\n%float_n0_000559129927 = OpConstant %float -0.000559129927\n%float_n0_00181525736 = OpConstant %float -0.00181525736\n%float_0_0017233456 = OpConstant %float 0.0017233456\n%float_n0_00115655642 = OpConstant %float -0.00115655642\n%float_0_000742953445 = OpConstant %float 0.000742953445\n%float_0_00157015934 = OpConstant %float 0.00157015934\n%float_n0_000114889706 = OpConstant %float -0.000114889706\n%float_n0_00121783093 = OpConstant %float -0.00121783093\n%float_0_00183057599 = OpConstant %float 0.00183057599\n%float_2_29779416en05 = OpConstant %float 2.29779416e-05\n%float_n0_00192248775 = OpConstant %float -0.00192248775\n%float_0_00173866423 = OpConstant %float 0.00173866423\n%float_n0_000712316192 = OpConstant %float -0.000712316192\n%float_0_00155484071 = OpConstant %float 0.00155484071\n%float_n0_00170802698 = OpConstant %float -0.00170802698\n%float_0_00123314955 = OpConstant %float 0.00123314955\n%float_0_000206801473 = OpConstant %float 0.000206801473\n%float_0_00104932603 = OpConstant %float 0.00104932603\n%float_n0_000727634819 = OpConstant %float -0.000727634819\n%float_n0_00163143384 = OpConstant %float -0.00163143384\n%float_n0_000314031873 = OpConstant %float -0.000314031873\n%float_0_000482536765 = OpConstant %float 0.000482536765\n%float_n0_00179993873 = OpConstant %float -0.00179993873\n%float_0_00094209559 = OpConstant %float 0.00094209559\n%float_n0_000344669126 = OpConstant %float -0.000344669126\n%float_0_000696997566 = OpConstant %float 0.000696997566\n%float_n0_00101868878 = OpConstant %float -0.00101868878\n%float_n0_00157015934 = OpConstant %float -0.00157015934\n%float_n2_29779416en05 = OpConstant %float -2.29779416e-05\n%float_n0_00127910543 = OpConstant %float -0.00127910543\n%float_0_000804227951 = OpConstant %float 0.000804227951\n%float_n0_000896139711 = OpConstant %float -0.000896139711\n%float_n0_0014322917 = OpConstant %float -0.0014322917\n%float_0_000605085806 = OpConstant %float 0.000605085806\n%float_n8_42524532en05 = OpConstant %float -8.42524532e-05\n%float_0_000911458337 = OpConstant %float 0.000911458337\n%float_0_001953125 = OpConstant %float 0.001953125\n%float_n0_00140165444 = OpConstant %float -0.00140165444\n%float_n0_00063572306 = OpConstant %float -0.00063572306\n%float_0_00150888483 = OpConstant %float 0.00150888483\n%float_n0_000819546578 = OpConstant %float -0.000819546578\n%float_0_00124846818 = OpConstant %float 0.00124846818\n%float_0_000252757367 = OpConstant %float 0.000252757367\n%float_0_00152420346 = OpConstant %float 0.00152420346\n%float_0_00112591917 = OpConstant %float 0.00112591917\n%float_0_000359987753 = OpConstant %float 0.000359987753\n%float_n0_000390625006 = OpConstant %float -0.000390625006\n%float_0_00190716912 = OpConstant %float 0.00190716912\n%float_0_00138633582 = OpConstant %float 0.00138633582\n%float_n0_00111060054 = OpConstant %float -0.00111060054\n%float_0_00161611522 = OpConstant %float 0.00161611522\n%float_n0_000880821084 = OpConstant %float -0.000880821084\n%float_0_000145526967 = OpConstant %float 0.000145526967\n%float_0_00107996329 = OpConstant %float 0.00107996329\n%float_n5_36151965en05 = OpConstant %float -5.36151965e-05\n%float_0_00028339462 = OpConstant %float 0.00028339462\n%float_n0_00169270835 = OpConstant %float -0.00169270835\n%float_n0_00126378681 = OpConstant %float -0.00126378681\n%float_n0_000513174047 = OpConstant %float -0.000513174047\n%float_n0_000160845593 = OpConstant %float -0.000160845593\n%float_n0_00187653187 = OpConstant %float -0.00187653187\n%float_n0_000834865205 = OpConstant %float -0.000834865205\n%float_0_00063572306 = OpConstant %float 0.00063572306\n%float_7_65931418en06 = OpConstant %float 7.65931418e-06\n%float_n0_00190716912 = OpConstant %float -0.00190716912\n%float_n0_000222120099 = OpConstant %float -0.000222120099\n%float_0_000375306379 = OpConstant %float 0.000375306379\n%float_n0_00173866423 = OpConstant %float -0.00173866423\n%float_n0_000405943632 = OpConstant %float -0.000405943632\n%float_n0_00123314955 = OpConstant %float -0.00123314955\n%float_0_00170802698 = OpConstant %float 0.00170802698\n%float_n0_00094209559 = OpConstant %float -0.00094209559\n%float_0_000819546578 = OpConstant %float 0.000819546578\n%float_0_00184589461 = OpConstant %float 0.00184589461\n%float_0_000467218139 = OpConstant %float 0.000467218139\n       %2242 = OpConstantComposite %_arr_float_uint_256 %float_n0_00100337015 %float_0_000880821084 %float_0_00169270835 %float_n0_00155484071 %float_0_00127910543 %float_n0_000605085806 %float_0_00106464466 %float_n0_00138633582 %float_0_00135569857 %float_0_000513174047 %float_0_00121783093 %float_n0_00160079659 %float_0_00058976718 %float_n0_00028339462 %float_0_00111060054 %float_n0_00141697307 %float_0_00144761032 %float_n0_0005438113 %float_0_00013020834 %float_n0_0012025123 %float_0_000436580885 %float_n0_00104932603 %float_0_000620404433 %float_n0_000482536765 %float_0_00187653187 %float_n0_00109528191 %float_n9_95710798en05 %float_n0_000528492674 %float_0_0014322917 %float_n0_00193780637 %float_n0_000696997566 %float_3_829657en05 %float_0_000712316192 %float_n0_00130974269 %float_0_00109528191 %float_n0_000298713247 %float_0_00175398286 %float_n0_00167738972 %float_0_00147824758 %float_n3_829657en05 %float_0_000788909325 %float_n0_00183057599 %float_0_000298713247 %float_0_000988051528 %float_n0_00117187505 %float_0_00017616422 %float_0_00164675247 %float_n0_00158547796 %float_0_000344669126 %float_0_00186121324 %float_n0_00176930148 %float_n0_000865502458 %float_0_000896139711 %float_0_000160845593 %float_n0_000926776964 %float_n0_00152420346 %float_n0_000651041686 %float_0_00129442406 %float_n0_000804227951 %float_n0_00146292895 %float_0_00179993873 %float_n0_000850183831 %float_0_000850183831 %float_n0_000451899512 %float_n0_00106464466 %float_n0_000145526967 %float_0_000237438726 %float_0_00141697307 %float_n0_00058976718 %float_n0_000191482846 %float_0_00160079659 %float_0_00101868878 %float_0_000405943632 %float_n0_000206801473 %float_0_00158547796 %float_0_000651041686 %float_n6_89338267en05 %float_0_000421262259 %float_n0_00164675247 %float_0_00137101719 %float_0_000926776964 %float_n0_000666360313 %float_0_00118719367 %float_n0_00144761032 %float_0_000574448553 %float_n0_00189185049 %float_0_000758272072 %float_n0_00129442406 %float_0_00192248775 %float_n0_0016620711 %float_n0_00103400741 %float_n0_000497855421 %float_n0_00186121324 %float_0_0012025123 %float_n0_0003293505 %float_n0_00137101719 %float_0_00163143384 %float_n0_00184589461 %float_0_000727634819 %float_n0_000911458337 %float_0_00181525736 %float_n0_00114123779 %float_n0_000375306379 %float_9_95710798en05 %float_n0_000742953445 %float_0_00117187505 %float_6_89338267en05 %float_0_0014935662 %float_0_000972732843 %float_n0_000957414217 %float_0_00193780637 %float_0_000528492674 %float_5_36151965en05 %float_n0_00124846818 %float_n0_000268075994 %float_0_00153952208 %float_n7_65931418en06 %float_0_000314031873 %float_0_00134037994 %float_n0_00175398286 %float_0_000497855421 %float_n0_00118719367 %float_0_000773590698 %float_n0_00134037994 %float_0_000268075994 %float_n0_00147824758 %float_n0_00013020834 %float_n0_000773590698 %float_0_00130974269 %float_0_000390625006 %float_0_000957414217 %float_n0_000467218139 %float_n0_00153952208 %float_0_00103400741 %float_n0_000681678939 %float_0_00167738972 %float_0_00100337015 %float_n0_000421262259 %float_0_00178462011 %float_n0_000237438726 %float_n0_000620404433 %float_0_0016620711 %float_0_000834865205 %float_n0_0017233456 %float_n0_00107996329 %float_0_00176930148 %float_n0_000788909325 %float_n0_00178462011 %float_0_000681678939 %float_n0_000988051528 %float_n0_00132506131 %float_n0_00017616422 %float_n0_00150888483 %float_0_0003293505 %float_n0_001953125 %float_0_000666360313 %float_n0_00161611522 %float_0_00115655642 %float_0_000451899512 %float_n0_000436580885 %float_0_000191482846 %float_n0_0014935662 %float_0_00114123779 %float_8_42524532en05 %float_0_00189185049 %float_0_00140165444 %float_0_000559129927 %float_0_000114889706 %float_0_00126378681 %float_n0_000574448553 %float_n0_000972732843 %float_0_00132506131 %float_0_000222120099 %float_n0_000758272072 %float_n0_00135569857 %float_0_00146292895 %float_0_000865502458 %float_n0_000359987753 %float_0_0005438113 %float_n0_00112591917 %float_n0_000252757367 %float_n0_000559129927 %float_n0_00181525736 %float_0_0017233456 %float_n0_00115655642 %float_0_000742953445 %float_0_00157015934 %float_n0_000114889706 %float_n0_00121783093 %float_0_00183057599 %float_2_29779416en05 %float_n0_00192248775 %float_0_00173866423 %float_n0_000712316192 %float_0_00155484071 %float_n0_00170802698 %float_0_00123314955 %float_0_000206801473 %float_0_00104932603 %float_n0_000727634819 %float_n0_00163143384 %float_n0_000314031873 %float_0_000482536765 %float_n0_00179993873 %float_0_00094209559 %float_n0_000344669126 %float_0_000696997566 %float_n0_00101868878 %float_n0_00157015934 %float_n2_29779416en05 %float_n0_00127910543 %float_0_000804227951 %float_n0_000896139711 %float_n0_0014322917 %float_0_000605085806 %float_n8_42524532en05 %float_0_000911458337 %float_0_001953125 %float_n0_00140165444 %float_n0_00063572306 %float_0_00150888483 %float_n0_000819546578 %float_0_00124846818 %float_0_000252757367 %float_0_00152420346 %float_0_00112591917 %float_0_000359987753 %float_n0_000390625006 %float_0_00190716912 %float_0_00138633582 %float_n0_00111060054 %float_0_00161611522 %float_n0_000880821084 %float_0_000145526967 %float_0_00107996329 %float_n5_36151965en05 %float_0_00028339462 %float_n0_00169270835 %float_n0_00126378681 %float_n0_000513174047 %float_n0_000160845593 %float_n0_00187653187 %float_n0_000834865205 %float_0_00063572306 %float_7_65931418en06 %float_n0_00190716912 %float_n0_000222120099 %float_0_000375306379 %float_n0_00173866423 %float_n0_000405943632 %float_n0_00123314955 %float_0_00170802698 %float_n0_00094209559 %float_0_000819546578 %float_0_00184589461 %float_0_000467218139\n     %uint_1 = OpConstant %uint 1\n    %uint_16 = OpConstant %uint 16\n%_ptr_Function__arr_float_uint_256 = OpTypePointer Function %_arr_float_uint_256\n    %v4float = OpTypeVector %float 4\n%_ptr_Input_v4float = OpTypePointer Input %v4float\n%gl_FragCoord = OpVariable %_ptr_Input_v4float Input\n    %v2float = OpTypeVector %float 2\n%push_const_block_xe = OpTypeStruct %v2int %v2float %float\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n      %int_0 = OpConstant %int 0\n%_ptr_PushConstant_v2int = OpTypePointer PushConstant %v2int\n      %int_1 = OpConstant %int 1\n%_ptr_PushConstant_v2float = OpTypePointer PushConstant %v2float\n  %float_0_5 = OpConstant %float 0.5\n      %int_2 = OpConstant %int 2\n%_ptr_PushConstant_float = OpTypePointer PushConstant %float\n%_ptr_Output_v4float = OpTypePointer Output %v4float\n%xe_cas_color = OpVariable %_ptr_Output_v4float Output\n%uint_532432441 = OpConstant %uint 532432441\n%uint_2129690299 = OpConstant %uint 2129690299\n%uint_2129764351 = OpConstant %uint 2129764351\n    %float_2 = OpConstant %float 2\n        %151 = OpTypeImage %float 2D 0 0 0 1 Unknown\n%_ptr_UniformConstant_151 = OpTypePointer UniformConstant %151\n%xe_cas_source = OpVariable %_ptr_UniformConstant_151 UniformConstant\n     %int_n1 = OpConstant %int -1\n       %1803 = OpConstantComposite %v2int %int_0 %int_n1\n       %1812 = OpConstantComposite %v2int %int_1 %int_n1\n       %1806 = OpConstantComposite %v2int %int_n1 %int_0\n       %1824 = OpConstantComposite %v2int %int_1 %int_0\n       %1818 = OpConstantComposite %v2int %int_n1 %int_1\n       %1827 = OpConstantComposite %v2int %int_0 %int_1\n       %1836 = OpConstantComposite %v2int %int_1 %int_1\n       %1833 = OpConstantComposite %v2int %int_2 %int_0\n       %1839 = OpConstantComposite %v2int %int_0 %int_2\n       %1845 = OpConstantComposite %v2int %int_2 %int_1\n       %1848 = OpConstantComposite %v2int %int_1 %int_2\n%float_0_03125 = OpConstant %float 0.03125\n       %1566 = OpConstantComposite %v2float %float_0_5 %float_0_5\n       %2122 = OpConstantComposite %v2uint %uint_15 %uint_15\n       %2604 = OpConstantComposite %v3float %float_0 %float_0 %float_0\n       %2582 = OpConstantComposite %v3float %float_1 %float_1 %float_1\n          %2 = OpUndef %v4float\n       %main = OpFunction %void None %1282\n      %24953 = OpLabel\n      %18411 = OpVariable %_ptr_Function__arr_float_uint_256 Function\n      %22087 = OpLoad %v4float %gl_FragCoord\n       %6562 = OpVectorShuffle %v2float %22087 %22087 0 1\n      %17656 = OpConvertFToS %v2int %6562\n      %19279 = OpAccessChain %_ptr_PushConstant_v2int %push_consts_xe %int_0\n      %22822 = OpLoad %v2int %19279\n      %23312 = OpISub %v2int %17656 %22822\n       %9938 = OpBitcast %v2uint %23312\n      %20997 = OpAccessChain %_ptr_PushConstant_v2float %push_consts_xe %int_1\n      %22579 = OpLoad %v2float %20997\n      %13397 = OpBitcast %v2uint %22579\n      %12762 = OpVectorTimesScalar %v2float %22579 %float_0_5\n      %24595 = OpFSub %v2float %12762 %1566\n      %17743 = OpBitcast %v2uint %24595\n      %16707 = OpCompositeExtract %uint %13397 0\n      %13283 = OpCompositeExtract %uint %13397 1\n       %7641 = OpCompositeExtract %uint %17743 0\n       %7529 = OpCompositeExtract %uint %17743 1\n      %18241 = OpCompositeConstruct %v4uint %16707 %13283 %7641 %7529\n       %9777 = OpAccessChain %_ptr_PushConstant_float %push_consts_xe %int_2\n      %18808 = OpLoad %float %9777\n      %17599 = OpBitcast %uint %18808\n      %19625 = OpConvertUToF %v2float %9938\n       %8442 = OpVectorShuffle %v2uint %18241 %18241 0 1\n      %11576 = OpBitcast %v2float %8442\n      %20814 = OpFMul %v2float %19625 %11576\n       %8994 = OpVectorShuffle %v2uint %18241 %18241 2 3\n      %11797 = OpBitcast %v2float %8994\n      %20069 = OpFAdd %v2float %20814 %11797\n      %12719 = OpExtInst %v2float %1 Floor %20069\n      %16290 = OpFSub %v2float %20069 %12719\n      %17064 = OpConvertFToS %v2int %12719\n      %20568 = OpIAdd %v2int %17064 %1803\n      %18223 = OpLoad %151 %xe_cas_source\n      %19459 = OpImageFetch %v4float %18223 %20568 Lod %int_0\n      %13347 = OpIAdd %v2int %17064 %1806\n      %14538 = OpLoad %151 %xe_cas_source\n      %12625 = OpImageFetch %v4float %14538 %13347 Lod %int_0\n      %10421 = OpLoad %151 %xe_cas_source\n      %15444 = OpImageFetch %v4float %10421 %17064 Lod %int_0\n      %13348 = OpIAdd %v2int %17064 %1812\n      %15811 = OpLoad %151 %xe_cas_source\n      %19460 = OpImageFetch %v4float %15811 %13348 Lod %int_0\n      %13349 = OpIAdd %v2int %17064 %1824\n      %15812 = OpLoad %151 %xe_cas_source\n      %19461 = OpImageFetch %v4float %15812 %13349 Lod %int_0\n      %13350 = OpIAdd %v2int %17064 %1833\n      %15813 = OpLoad %151 %xe_cas_source\n      %19462 = OpImageFetch %v4float %15813 %13350 Lod %int_0\n      %13351 = OpIAdd %v2int %17064 %1818\n      %15814 = OpLoad %151 %xe_cas_source\n      %19463 = OpImageFetch %v4float %15814 %13351 Lod %int_0\n      %13352 = OpIAdd %v2int %17064 %1827\n      %15815 = OpLoad %151 %xe_cas_source\n      %19464 = OpImageFetch %v4float %15815 %13352 Lod %int_0\n      %13353 = OpIAdd %v2int %17064 %1839\n      %15816 = OpLoad %151 %xe_cas_source\n      %19465 = OpImageFetch %v4float %15816 %13353 Lod %int_0\n      %13354 = OpIAdd %v2int %17064 %1836\n      %15817 = OpLoad %151 %xe_cas_source\n      %19466 = OpImageFetch %v4float %15817 %13354 Lod %int_0\n      %13355 = OpIAdd %v2int %17064 %1845\n      %15818 = OpLoad %151 %xe_cas_source\n      %19467 = OpImageFetch %v4float %15818 %13355 Lod %int_0\n      %13356 = OpIAdd %v2int %17064 %1848\n      %14918 = OpLoad %151 %xe_cas_source\n       %8899 = OpImageFetch %v4float %14918 %13356 Lod %int_0\n      %19729 = OpCompositeExtract %float %19459 0\n       %7025 = OpCompositeExtract %float %19459 1\n      %18723 = OpCompositeExtract %float %19459 2\n      %24863 = OpFMul %float %19729 %19729\n      %16184 = OpFMul %float %7025 %7025\n       %9305 = OpFMul %float %18723 %18723\n      %22236 = OpCompositeExtract %float %19460 0\n      %11844 = OpCompositeExtract %float %19460 1\n      %18724 = OpCompositeExtract %float %19460 2\n      %24864 = OpFMul %float %22236 %22236\n      %16185 = OpFMul %float %11844 %11844\n       %9306 = OpFMul %float %18724 %18724\n      %22237 = OpCompositeExtract %float %12625 0\n      %11845 = OpCompositeExtract %float %12625 1\n      %18725 = OpCompositeExtract %float %12625 2\n      %24865 = OpFMul %float %22237 %22237\n      %16186 = OpFMul %float %11845 %11845\n       %9307 = OpFMul %float %18725 %18725\n      %22238 = OpCompositeExtract %float %15444 0\n      %11846 = OpCompositeExtract %float %15444 1\n      %18726 = OpCompositeExtract %float %15444 2\n      %24866 = OpFMul %float %22238 %22238\n      %16187 = OpFMul %float %11846 %11846\n       %9308 = OpFMul %float %18726 %18726\n      %22239 = OpCompositeExtract %float %19461 0\n      %11847 = OpCompositeExtract %float %19461 1\n      %18727 = OpCompositeExtract %float %19461 2\n      %24867 = OpFMul %float %22239 %22239\n      %16188 = OpFMul %float %11847 %11847\n       %9309 = OpFMul %float %18727 %18727\n      %22240 = OpCompositeExtract %float %19462 0\n      %11848 = OpCompositeExtract %float %19462 1\n      %18728 = OpCompositeExtract %float %19462 2\n      %24868 = OpFMul %float %22240 %22240\n      %16189 = OpFMul %float %11848 %11848\n       %9310 = OpFMul %float %18728 %18728\n      %22241 = OpCompositeExtract %float %19463 0\n      %11849 = OpCompositeExtract %float %19463 1\n      %18729 = OpCompositeExtract %float %19463 2\n      %24869 = OpFMul %float %22241 %22241\n      %16190 = OpFMul %float %11849 %11849\n       %9311 = OpFMul %float %18729 %18729\n      %22242 = OpCompositeExtract %float %19464 0\n      %11850 = OpCompositeExtract %float %19464 1\n      %18730 = OpCompositeExtract %float %19464 2\n      %24870 = OpFMul %float %22242 %22242\n      %16191 = OpFMul %float %11850 %11850\n       %9312 = OpFMul %float %18730 %18730\n      %22243 = OpCompositeExtract %float %19466 0\n      %11851 = OpCompositeExtract %float %19466 1\n      %18731 = OpCompositeExtract %float %19466 2\n      %24871 = OpFMul %float %22243 %22243\n      %16192 = OpFMul %float %11851 %11851\n       %9313 = OpFMul %float %18731 %18731\n      %22244 = OpCompositeExtract %float %19467 0\n      %11852 = OpCompositeExtract %float %19467 1\n      %18732 = OpCompositeExtract %float %19467 2\n      %24872 = OpFMul %float %22244 %22244\n      %16193 = OpFMul %float %11852 %11852\n       %9314 = OpFMul %float %18732 %18732\n      %22245 = OpCompositeExtract %float %19465 0\n      %11853 = OpCompositeExtract %float %19465 1\n      %18733 = OpCompositeExtract %float %19465 2\n      %24873 = OpFMul %float %22245 %22245\n      %16194 = OpFMul %float %11853 %11853\n       %9315 = OpFMul %float %18733 %18733\n      %22246 = OpCompositeExtract %float %8899 0\n      %11854 = OpCompositeExtract %float %8899 1\n      %18734 = OpCompositeExtract %float %8899 2\n      %24874 = OpFMul %float %22246 %22246\n      %14910 = OpFMul %float %11854 %11854\n       %8590 = OpFMul %float %18734 %18734\n      %10877 = OpExtInst %float %1 FMin %16186 %16187\n       %9276 = OpExtInst %float %1 FMin %16184 %10877\n      %15951 = OpExtInst %float %1 FMin %16188 %16191\n      %10905 = OpExtInst %float %1 FMin %9276 %15951\n      %24296 = OpExtInst %float %1 FMax %16186 %16187\n      %17523 = OpExtInst %float %1 FMax %16184 %24296\n      %21848 = OpExtInst %float %1 FMax %16188 %16191\n       %7823 = OpExtInst %float %1 FMax %17523 %21848\n      %13503 = OpExtInst %float %1 FMin %16187 %16188\n      %13819 = OpExtInst %float %1 FMin %16185 %13503\n      %15952 = OpExtInst %float %1 FMin %16189 %16192\n      %10906 = OpExtInst %float %1 FMin %13819 %15952\n      %24297 = OpExtInst %float %1 FMax %16187 %16188\n      %17524 = OpExtInst %float %1 FMax %16185 %24297\n      %21849 = OpExtInst %float %1 FMax %16189 %16192\n       %7824 = OpExtInst %float %1 FMax %17524 %21849\n      %13504 = OpExtInst %float %1 FMin %16190 %16191\n      %13820 = OpExtInst %float %1 FMin %16187 %13504\n      %15953 = OpExtInst %float %1 FMin %16192 %16194\n      %10907 = OpExtInst %float %1 FMin %13820 %15953\n      %24298 = OpExtInst %float %1 FMax %16190 %16191\n      %17525 = OpExtInst %float %1 FMax %16187 %24298\n      %21850 = OpExtInst %float %1 FMax %16192 %16194\n       %7825 = OpExtInst %float %1 FMax %17525 %21850\n      %13505 = OpExtInst %float %1 FMin %16191 %16192\n      %13821 = OpExtInst %float %1 FMin %16188 %13505\n      %15954 = OpExtInst %float %1 FMin %16193 %14910\n      %10908 = OpExtInst %float %1 FMin %13821 %15954\n      %24299 = OpExtInst %float %1 FMax %16191 %16192\n      %17526 = OpExtInst %float %1 FMax %16188 %24299\n      %23939 = OpExtInst %float %1 FMax %16193 %14910\n      %21101 = OpExtInst %float %1 FMax %17526 %23939\n       %8181 = OpBitcast %uint %7823\n       %8818 = OpISub %uint %uint_2129690299 %8181\n       %9881 = OpBitcast %float %8818\n      %15062 = OpBitcast %uint %7824\n       %6702 = OpISub %uint %uint_2129690299 %15062\n       %9882 = OpBitcast %float %6702\n      %15063 = OpBitcast %uint %7825\n       %6703 = OpISub %uint %uint_2129690299 %15063\n       %9883 = OpBitcast %float %6703\n      %15064 = OpBitcast %uint %21101\n       %6835 = OpISub %uint %uint_2129690299 %15064\n       %6465 = OpBitcast %float %6835\n      %24131 = OpFSub %float %float_1 %7823\n      %23324 = OpExtInst %float %1 FMin %10905 %24131\n      %23036 = OpFMul %float %23324 %9881\n      %16051 = OpExtInst %float %1 FClamp %23036 %float_0 %float_1\n      %25005 = OpFSub %float %float_1 %7824\n      %10697 = OpExtInst %float %1 FMin %10906 %25005\n      %23037 = OpFMul %float %10697 %9882\n      %16052 = OpExtInst %float %1 FClamp %23037 %float_0 %float_1\n      %25006 = OpFSub %float %float_1 %7825\n      %10698 = OpExtInst %float %1 FMin %10907 %25006\n      %23038 = OpFMul %float %10698 %9883\n      %16053 = OpExtInst %float %1 FClamp %23038 %float_0 %float_1\n      %25007 = OpFSub %float %float_1 %21101\n      %10699 = OpExtInst %float %1 FMin %10908 %25007\n      %22903 = OpFMul %float %10699 %6465\n      %20683 = OpExtInst %float %1 FClamp %22903 %float_0 %float_1\n      %24011 = OpBitcast %uint %16051\n      %22090 = OpShiftRightLogical %uint %24011 %uint_1\n      %23229 = OpIAdd %uint %22090 %uint_532432441\n      %22851 = OpBitcast %float %23229\n       %8910 = OpBitcast %uint %16052\n       %9189 = OpShiftRightLogical %uint %8910 %uint_1\n      %23230 = OpIAdd %uint %9189 %uint_532432441\n      %22852 = OpBitcast %float %23230\n       %8911 = OpBitcast %uint %16053\n       %9190 = OpShiftRightLogical %uint %8911 %uint_1\n      %23231 = OpIAdd %uint %9190 %uint_532432441\n      %22853 = OpBitcast %float %23231\n       %8912 = OpBitcast %uint %20683\n       %9191 = OpShiftRightLogical %uint %8912 %uint_1\n      %23232 = OpIAdd %uint %9191 %uint_532432441\n      %21692 = OpBitcast %float %23232\n      %19558 = OpBitcast %float %17599\n      %18879 = OpFMul %float %22851 %19558\n      %22795 = OpFMul %float %22852 %19558\n      %19380 = OpFMul %float %22853 %19558\n      %10255 = OpFMul %float %21692 %19558\n      %13586 = OpCompositeExtract %float %16290 0\n      %21718 = OpFSub %float %float_1 %13586\n      %11876 = OpCompositeExtract %float %16290 1\n      %11147 = OpFSub %float %float_1 %11876\n      %17670 = OpFMul %float %21718 %11147\n      %25212 = OpFMul %float %13586 %11147\n      %20330 = OpFMul %float %21718 %11876\n      %20638 = OpFMul %float %13586 %11876\n      %18204 = OpFSub %float %7823 %10905\n      %23453 = OpFAdd %float %float_0_03125 %18204\n      %11395 = OpBitcast %uint %23453\n       %7677 = OpISub %uint %uint_2129690299 %11395\n       %8343 = OpBitcast %float %7677\n      %17531 = OpFMul %float %17670 %8343\n      %20631 = OpFSub %float %7824 %10906\n      %23454 = OpFAdd %float %float_0_03125 %20631\n      %11396 = OpBitcast %uint %23454\n       %7678 = OpISub %uint %uint_2129690299 %11396\n       %8344 = OpBitcast %float %7678\n      %17532 = OpFMul %float %25212 %8344\n      %20632 = OpFSub %float %7825 %10907\n      %23455 = OpFAdd %float %float_0_03125 %20632\n      %11397 = OpBitcast %uint %23455\n       %7679 = OpISub %uint %uint_2129690299 %11397\n       %8345 = OpBitcast %float %7679\n      %17533 = OpFMul %float %20330 %8345\n      %20633 = OpFSub %float %21101 %10908\n      %23456 = OpFAdd %float %float_0_03125 %20633\n      %11398 = OpBitcast %uint %23456\n       %7680 = OpISub %uint %uint_2129690299 %11398\n       %8381 = OpBitcast %float %7680\n      %17261 = OpFMul %float %20638 %8381\n      %22796 = OpFMul %float %18879 %17531\n      %20292 = OpFMul %float %22795 %17532\n      %20984 = OpFMul %float %19380 %17533\n      %15690 = OpFAdd %float %20292 %20984\n      %22375 = OpFAdd %float %15690 %17531\n      %12597 = OpFMul %float %10255 %17261\n      %18845 = OpFAdd %float %22796 %12597\n      %23067 = OpFAdd %float %18845 %17532\n       %7227 = OpFAdd %float %18845 %17533\n       %7228 = OpFAdd %float %15690 %17261\n       %7229 = OpFAdd %float %22796 %20292\n       %7303 = OpFAdd %float %7229 %20984\n       %6535 = OpFAdd %float %7303 %12597\n      %12598 = OpFMul %float %float_2 %6535\n      %18846 = OpFAdd %float %12598 %22375\n      %23068 = OpFAdd %float %18846 %23067\n       %7132 = OpFAdd %float %23068 %7227\n       %8111 = OpFAdd %float %7132 %7228\n       %9782 = OpBitcast %uint %8111\n       %7563 = OpISub %uint %uint_2129764351 %9782\n       %9419 = OpBitcast %float %7563\n       %9130 = OpFNegate %float %9419\n      %12367 = OpFMul %float %9130 %8111\n      %16540 = OpFAdd %float %12367 %float_2\n       %9442 = OpFMul %float %9419 %16540\n      %18229 = OpFAdd %float %24863 %24865\n       %8674 = OpFMul %float %22796 %18229\n      %24291 = OpFMul %float %24864 %20292\n      %14922 = OpFAdd %float %8674 %24291\n       %9443 = OpFMul %float %24868 %20292\n      %18153 = OpFAdd %float %14922 %9443\n       %9444 = OpFMul %float %24869 %20984\n      %18154 = OpFAdd %float %18153 %9444\n       %9445 = OpFMul %float %24873 %20984\n      %18155 = OpFAdd %float %18154 %9445\n       %9446 = OpFMul %float %24872 %12597\n      %18156 = OpFAdd %float %18155 %9446\n       %9447 = OpFMul %float %24874 %12597\n      %18157 = OpFAdd %float %18156 %9447\n       %9448 = OpFMul %float %24866 %22375\n      %18158 = OpFAdd %float %18157 %9448\n       %9449 = OpFMul %float %24867 %23067\n      %18159 = OpFAdd %float %18158 %9449\n       %9450 = OpFMul %float %24870 %7227\n      %18160 = OpFAdd %float %18159 %9450\n       %9451 = OpFMul %float %24871 %7228\n      %15973 = OpFAdd %float %18160 %9451\n       %8137 = OpFMul %float %15973 %9442\n      %15218 = OpExtInst %float %1 FClamp %8137 %float_0 %float_1\n      %12765 = OpFAdd %float %16184 %16186\n      %17545 = OpFMul %float %22796 %12765\n      %24292 = OpFMul %float %16185 %20292\n      %14923 = OpFAdd %float %17545 %24292\n       %9452 = OpFMul %float %16189 %20292\n      %18161 = OpFAdd %float %14923 %9452\n       %9453 = OpFMul %float %16190 %20984\n      %18162 = OpFAdd %float %18161 %9453\n       %9454 = OpFMul %float %16194 %20984\n      %18163 = OpFAdd %float %18162 %9454\n       %9455 = OpFMul %float %16193 %12597\n      %18164 = OpFAdd %float %18163 %9455\n       %9456 = OpFMul %float %14910 %12597\n      %18165 = OpFAdd %float %18164 %9456\n       %9457 = OpFMul %float %16187 %22375\n      %18166 = OpFAdd %float %18165 %9457\n       %9458 = OpFMul %float %16188 %23067\n      %18167 = OpFAdd %float %18166 %9458\n       %9459 = OpFMul %float %16191 %7227\n      %18168 = OpFAdd %float %18167 %9459\n       %9460 = OpFMul %float %16192 %7228\n      %15974 = OpFAdd %float %18168 %9460\n       %8138 = OpFMul %float %15974 %9442\n      %15219 = OpExtInst %float %1 FClamp %8138 %float_0 %float_1\n      %12766 = OpFAdd %float %9305 %9307\n      %17546 = OpFMul %float %22796 %12766\n      %24293 = OpFMul %float %9306 %20292\n      %14924 = OpFAdd %float %17546 %24293\n       %9461 = OpFMul %float %9310 %20292\n      %18169 = OpFAdd %float %14924 %9461\n       %9462 = OpFMul %float %9311 %20984\n      %18170 = OpFAdd %float %18169 %9462\n       %9463 = OpFMul %float %9315 %20984\n      %18171 = OpFAdd %float %18170 %9463\n       %9464 = OpFMul %float %9314 %12597\n      %18172 = OpFAdd %float %18171 %9464\n       %9465 = OpFMul %float %8590 %12597\n      %18173 = OpFAdd %float %18172 %9465\n       %9466 = OpFMul %float %9308 %22375\n      %18174 = OpFAdd %float %18173 %9466\n       %9467 = OpFMul %float %9309 %23067\n      %18175 = OpFAdd %float %18174 %9467\n       %9468 = OpFMul %float %9312 %7227\n      %18176 = OpFAdd %float %18175 %9468\n       %9469 = OpFMul %float %9313 %7228\n      %15975 = OpFAdd %float %18176 %9469\n       %7244 = OpFMul %float %15975 %9442\n      %22380 = OpExtInst %float %1 FClamp %7244 %float_0 %float_1\n      %24270 = OpCompositeInsert %v4float %15218 %2 0\n      %11074 = OpCompositeInsert %v4float %15219 %24270 1\n      %14933 = OpCompositeInsert %v4float %22380 %11074 2\n      %12955 = OpVectorShuffle %v3float %14933 %14933 0 1 2\n       %6471 = OpExtInst %v3float %1 Sqrt %12955\n      %22742 = OpCompositeExtract %float %6471 0\n      %19769 = OpCompositeInsert %v4float %22742 %2 0\n      %19852 = OpCompositeExtract %float %6471 1\n      %16135 = OpCompositeInsert %v4float %19852 %19769 1\n      %19814 = OpCompositeExtract %float %6471 2\n      %18704 = OpCompositeInsert %v4float %19814 %16135 2\n      %15997 = OpVectorShuffle %v3float %18704 %18704 0 1 2\n      %12552 = OpBitwiseAnd %v2uint %9938 %2122\n       %9741 = OpCompositeExtract %uint %12552 1\n      %21498 = OpIMul %uint %9741 %uint_16\n      %23411 = OpCompositeExtract %uint %12552 0\n      %12610 = OpIAdd %uint %21498 %23411\n               OpStore %18411 %2242\n       %9958 = OpAccessChain %_ptr_Function_float %18411 %12610\n      %25140 = OpLoad %float %9958\n      %18028 = OpCompositeConstruct %v3float %25140 %25140 %25140\n      %21458 = OpFAdd %v3float %15997 %18028\n      %19525 = OpExtInst %v3float %1 FClamp %21458 %2604 %2582\n      %16777 = OpCompositeExtract %float %19525 0\n      %19708 = OpCompositeExtract %float %19525 1\n       %7472 = OpCompositeExtract %float %19525 2\n      %22408 = OpCompositeConstruct %v4float %16777 %19708 %7472 %float_1\n               OpStore %xe_cas_color %22408\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t guest_output_ffx_cas_resample_dither_ps[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x0000627D, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0007000F, 0x00000004,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000C93, 0x000014D6, 0x00030010,\n    0x0000161F, 0x00000007, 0x00030003, 0x00000002, 0x000001CC, 0x00090004,\n    0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F, 0x5F776F6C, 0x72747461,\n    0x74756269, 0x00007365, 0x000B0004, 0x455F4C47, 0x735F5458, 0x6C706D61,\n    0x656C7265, 0x745F7373, 0x75747865, 0x665F6572, 0x74636E75, 0x736E6F69,\n    0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F, 0x70635F45, 0x74735F70,\n    0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365, 0x00006576, 0x00080004,\n    0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63, 0x69645F65, 0x74636572,\n    0x00657669, 0x00040005, 0x0000161F, 0x6E69616D, 0x00000000, 0x00060005,\n    0x00000C93, 0x465F6C67, 0x43676172, 0x64726F6F, 0x00000000, 0x00070005,\n    0x00000418, 0x68737570, 0x6E6F635F, 0x625F7473, 0x6B636F6C, 0x0065785F,\n    0x00090006, 0x00000418, 0x00000000, 0x635F6578, 0x6F5F7361, 0x75707475,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000B0006, 0x00000418, 0x00000001,\n    0x635F6578, 0x695F7361, 0x7475706E, 0x74756F5F, 0x5F747570, 0x657A6973,\n    0x7461725F, 0x00006F69, 0x000A0006, 0x00000418, 0x00000002, 0x635F6578,\n    0x735F7361, 0x70726168, 0x7373656E, 0x736F705F, 0x65735F74, 0x00707574,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00060005, 0x000014D6, 0x635F6578, 0x635F7361, 0x726F6C6F, 0x00000000,\n    0x00060005, 0x0000142B, 0x635F6578, 0x735F7361, 0x6372756F, 0x00000065,\n    0x00040047, 0x00000C93, 0x0000000B, 0x0000000F, 0x00030047, 0x00000418,\n    0x00000002, 0x00050048, 0x00000418, 0x00000000, 0x00000023, 0x00000010,\n    0x00050048, 0x00000418, 0x00000001, 0x00000023, 0x00000018, 0x00050048,\n    0x00000418, 0x00000002, 0x00000023, 0x00000020, 0x00040047, 0x000014D6,\n    0x0000001E, 0x00000000, 0x00040047, 0x0000142B, 0x00000021, 0x00000000,\n    0x00040047, 0x0000142B, 0x00000022, 0x00000000, 0x00020013, 0x00000008,\n    0x00030021, 0x00000502, 0x00000008, 0x00030016, 0x0000000D, 0x00000020,\n    0x00040020, 0x0000028A, 0x00000007, 0x0000000D, 0x00040017, 0x00000018,\n    0x0000000D, 0x00000003, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040015, 0x0000000C,\n    0x00000020, 0x00000001, 0x00040017, 0x00000012, 0x0000000C, 0x00000002,\n    0x00040017, 0x00000017, 0x0000000B, 0x00000004, 0x0004002B, 0x0000000D,\n    0x00000A0C, 0x00000000, 0x0004002B, 0x0000000D, 0x0000008A, 0x3F800000,\n    0x0004002B, 0x0000000B, 0x00000A37, 0x0000000F, 0x0004002B, 0x0000000B,\n    0x00000147, 0x00000100, 0x0004001C, 0x000003FB, 0x0000000D, 0x00000147,\n    0x0004002B, 0x0000000D, 0x0000010F, 0xBA838384, 0x0004002B, 0x0000000D,\n    0x00000728, 0x3A66E6E7, 0x0004002B, 0x0000000D, 0x00000705, 0x3ADDDDDE,\n    0x0004002B, 0x0000000D, 0x00000A5A, 0xBACBCBCC, 0x0004002B, 0x0000000D,\n    0x000008DF, 0x3AA7A7A8, 0x0004002B, 0x0000000D, 0x00000094, 0xBA1E9E9F,\n    0x0004002B, 0x0000000D, 0x0000034C, 0x3A8B8B8C, 0x0004002B, 0x0000000D,\n    0x0000087E, 0xBAB5B5B6, 0x0004002B, 0x0000000D, 0x0000034D, 0x3AB1B1B2,\n    0x0004002B, 0x0000000D, 0x00000687, 0x3A068687, 0x0004002B, 0x0000000D,\n    0x000003EB, 0x3A9F9FA0, 0x0004002B, 0x0000000D, 0x0000024E, 0xBAD1D1D2,\n    0x0004002B, 0x0000000D, 0x00000726, 0x3A1A9A9B, 0x0004002B, 0x0000000D,\n    0x00000698, 0xB9949495, 0x0004002B, 0x0000000D, 0x00000703, 0x3A919192,\n    0x0004002B, 0x0000000D, 0x00000AF8, 0xBAB9B9BA, 0x0004002B, 0x0000000D,\n    0x00000ABB, 0x3ABDBDBE, 0x0004002B, 0x0000000D, 0x0000026F, 0xBA0E8E8F,\n    0x0004002B, 0x0000000D, 0x000008A8, 0x39088889, 0x0004002B, 0x0000000D,\n    0x00000565, 0xBA9D9D9E, 0x0004002B, 0x0000000D, 0x0000065D, 0x39E4E4E5,\n    0x0004002B, 0x0000000D, 0x000004C6, 0xBA89898A, 0x0004002B, 0x0000000D,\n    0x00000057, 0x3A22A2A3, 0x0004002B, 0x0000000D, 0x0000006A, 0xB9FCFCFD,\n    0x0004002B, 0x0000000D, 0x00000A1E, 0x3AF5F5F6, 0x0004002B, 0x0000000D,\n    0x0000087D, 0xBA8F8F90, 0x0004002B, 0x0000000D, 0x00000959, 0xB8D0D0D1,\n    0x0004002B, 0x0000000D, 0x00000BB8, 0xBA0A8A8B, 0x0004002B, 0x0000000D,\n    0x0000097E, 0x3ABBBBBC, 0x0004002B, 0x0000000D, 0x00000606, 0xBAFDFDFE,\n    0x0004002B, 0x0000000D, 0x000003AD, 0xBA36B6B7, 0x0004002B, 0x0000000D,\n    0x000000E2, 0x3820A0A1, 0x0004002B, 0x0000000D, 0x00000370, 0x3A3ABABB,\n    0x0004002B, 0x0000000D, 0x0000024D, 0xBAABABAC, 0x0004002B, 0x0000000D,\n    0x000005C6, 0x3A8F8F90, 0x0004002B, 0x0000000D, 0x00000B8C, 0xB99C9C9D,\n    0x0004002B, 0x0000000D, 0x00000036, 0x3AE5E5E6, 0x0004002B, 0x0000000D,\n    0x0000087F, 0xBADBDBDC, 0x0004002B, 0x0000000D, 0x00000172, 0x3AC1C1C2,\n    0x0004002B, 0x0000000D, 0x00000399, 0xB820A0A1, 0x0004002B, 0x0000000D,\n    0x0000040F, 0x3A4ECECF, 0x0004002B, 0x0000000D, 0x0000091E, 0xBAEFEFF0,\n    0x0004002B, 0x0000000D, 0x000008D5, 0x399C9C9D, 0x0004002B, 0x0000000D,\n    0x000008DE, 0x3A818182, 0x0004002B, 0x0000000D, 0x000002EB, 0xBA99999A,\n    0x0004002B, 0x0000000D, 0x00000317, 0x3938B8B9, 0x0004002B, 0x0000000D,\n    0x0000034E, 0x3AD7D7D8, 0x0004002B, 0x0000000D, 0x00000111, 0xBACFCFD0,\n    0x0004002B, 0x0000000D, 0x0000002B, 0x39B4B4B5, 0x0004002B, 0x0000000D,\n    0x000008E1, 0x3AF3F3F4, 0x0004002B, 0x0000000D, 0x0000042A, 0xBAE7E7E8,\n    0x0004002B, 0x0000000D, 0x00000765, 0xBA62E2E3, 0x0004002B, 0x0000000D,\n    0x000009A2, 0x3A6AEAEB, 0x0004002B, 0x0000000D, 0x000004F2, 0x3928A8A9,\n    0x0004002B, 0x0000000D, 0x0000058A, 0xBA72F2F3, 0x0004002B, 0x0000000D,\n    0x000007E0, 0xBAC7C7C8, 0x0004002B, 0x0000000D, 0x00000802, 0xBA2AAAAB,\n    0x0004002B, 0x0000000D, 0x00000A1C, 0x3AA9A9AA, 0x0004002B, 0x0000000D,\n    0x00000940, 0xBA52D2D3, 0x0004002B, 0x0000000D, 0x000002EC, 0xBABFBFC0,\n    0x0004002B, 0x0000000D, 0x000003ED, 0x3AEBEBEC, 0x0004002B, 0x0000000D,\n    0x000004EB, 0xBA5EDEDF, 0x0004002B, 0x0000000D, 0x00000234, 0x3A5EDEDF,\n    0x0004002B, 0x0000000D, 0x00000245, 0xB9ECECED, 0x0004002B, 0x0000000D,\n    0x00000603, 0xBA8B8B8C, 0x0004002B, 0x0000000D, 0x00000984, 0xB9189899,\n    0x0004002B, 0x0000000D, 0x0000076E, 0x3978F8F9, 0x0004002B, 0x0000000D,\n    0x00000841, 0x3AB9B9BA, 0x0004002B, 0x0000000D, 0x000009DD, 0xBA1A9A9B,\n    0x0004002B, 0x0000000D, 0x000003F3, 0xB948C8C9, 0x0004002B, 0x0000000D,\n    0x00000B5A, 0x3AD1D1D2, 0x0004002B, 0x0000000D, 0x00000B58, 0x3A858586,\n    0x0004002B, 0x0000000D, 0x00000838, 0x39D4D4D5, 0x0004002B, 0x0000000D,\n    0x00000218, 0xB958D8D9, 0x0004002B, 0x0000000D, 0x00000A1D, 0x3ACFCFD0,\n    0x0004002B, 0x0000000D, 0x0000054B, 0x3A2AAAAB, 0x0004002B, 0x0000000D,\n    0x00000503, 0xB8909091, 0x0004002B, 0x0000000D, 0x00000169, 0x39DCDCDD,\n    0x0004002B, 0x0000000D, 0x00000605, 0xBAD7D7D8, 0x0004002B, 0x0000000D,\n    0x0000048A, 0x3AB3B3B4, 0x0004002B, 0x0000000D, 0x000002D3, 0x3A72F2F3,\n    0x0004002B, 0x0000000D, 0x00000A7C, 0xBA2EAEAF, 0x0004002B, 0x0000000D,\n    0x00000171, 0x3A9B9B9C, 0x0004002B, 0x0000000D, 0x000001AF, 0xBABDBDBE,\n    0x0004002B, 0x0000000D, 0x000004AC, 0x3A169697, 0x0004002B, 0x0000000D,\n    0x0000024F, 0xBAF7F7F8, 0x0004002B, 0x0000000D, 0x00000ADE, 0x3A46C6C7,\n    0x0004002B, 0x0000000D, 0x00000110, 0xBAA9A9AA, 0x0004002B, 0x0000000D,\n    0x00000212, 0x3AFBFBFC, 0x0004002B, 0x0000000D, 0x00000742, 0xBAD9D9DA,\n    0x0004002B, 0x0000000D, 0x00000389, 0xBA878788, 0x0004002B, 0x0000000D,\n    0x000006C4, 0xBA028283, 0x0004002B, 0x0000000D, 0x00000B98, 0xBAF3F3F4,\n    0x0004002B, 0x0000000D, 0x000002AE, 0x3A9D9D9E, 0x0004002B, 0x0000000D,\n    0x000009B1, 0xB9ACACAD, 0x0004002B, 0x0000000D, 0x00000741, 0xBAB3B3B4,\n    0x0004002B, 0x0000000D, 0x00000211, 0x3AD5D5D6, 0x0004002B, 0x0000000D,\n    0x00000A5B, 0xBAF1F1F2, 0x0004002B, 0x0000000D, 0x000005EA, 0x3A3EBEBF,\n    0x0004002B, 0x0000000D, 0x00000310, 0xBA6EEEEF, 0x0004002B, 0x0000000D,\n    0x0000052A, 0x3AEDEDEE, 0x0004002B, 0x0000000D, 0x00000071, 0xBA959596,\n    0x0004002B, 0x0000000D, 0x00000107, 0xB9C4C4C5, 0x0004002B, 0x0000000D,\n    0x000006A2, 0x38D0D0D1, 0x0004002B, 0x0000000D, 0x00000B1B, 0xBA42C2C3,\n    0x0004002B, 0x0000000D, 0x00000034, 0x3A99999A, 0x0004002B, 0x0000000D,\n    0x0000024B, 0x38909091, 0x0004002B, 0x0000000D, 0x000002AF, 0x3AC3C3C4,\n    0x0004002B, 0x0000000D, 0x00000A41, 0x3A7EFEFF, 0x0004002B, 0x0000000D,\n    0x00000A7E, 0xBA7AFAFB, 0x0004002B, 0x0000000D, 0x0000034F, 0x3AFDFDFE,\n    0x0004002B, 0x0000000D, 0x00000901, 0x3A0A8A8B, 0x0004002B, 0x0000000D,\n    0x00000539, 0x3860E0E1, 0x0004002B, 0x0000000D, 0x0000091C, 0xBAA3A3A4,\n    0x0004002B, 0x0000000D, 0x000001A4, 0xB98C8C8D, 0x0004002B, 0x0000000D,\n    0x00000666, 0x3AC9C9CA, 0x0004002B, 0x0000000D, 0x00000833, 0xB7008081,\n    0x0004002B, 0x0000000D, 0x00000206, 0x39A4A4A5, 0x0004002B, 0x0000000D,\n    0x00000210, 0x3AAFAFB0, 0x0004002B, 0x0000000D, 0x000002ED, 0xBAE5E5E6,\n    0x0004002B, 0x0000000D, 0x0000040D, 0x3A028283, 0x0004002B, 0x0000000D,\n    0x00000428, 0xBA9B9B9C, 0x0004002B, 0x0000000D, 0x00000195, 0x3A4ACACB,\n    0x0004002B, 0x0000000D, 0x000004C7, 0xBAAFAFB0, 0x0004002B, 0x0000000D,\n    0x00000AB0, 0x398C8C8D, 0x0004002B, 0x0000000D, 0x00000429, 0xBAC1C1C2,\n    0x0004002B, 0x0000000D, 0x00000B5F, 0xB9088889, 0x0004002B, 0x0000000D,\n    0x0000044C, 0xBA4ACACB, 0x0004002B, 0x0000000D, 0x00000B59, 0x3AABABAC,\n    0x0004002B, 0x0000000D, 0x00000344, 0x39CCCCCD, 0x0004002B, 0x0000000D,\n    0x000007C7, 0x3A7AFAFB, 0x0004002B, 0x0000000D, 0x00000739, 0xB9F4F4F5,\n    0x0004002B, 0x0000000D, 0x0000091D, 0xBAC9C9CA, 0x0004002B, 0x0000000D,\n    0x000000D2, 0x3A878788, 0x0004002B, 0x0000000D, 0x00000133, 0xBA32B2B3,\n    0x0004002B, 0x0000000D, 0x000005C8, 0x3ADBDBDC, 0x0004002B, 0x0000000D,\n    0x00000A1B, 0x3A838384, 0x0004002B, 0x0000000D, 0x00000420, 0xB9DCDCDD,\n    0x0004002B, 0x0000000D, 0x000002B0, 0x3AE9E9EA, 0x0004002B, 0x0000000D,\n    0x00000A25, 0xB978F8F9, 0x0004002B, 0x0000000D, 0x0000030E, 0xBA22A2A3,\n    0x0004002B, 0x0000000D, 0x0000048B, 0x3AD9D9DA, 0x0004002B, 0x0000000D,\n    0x00000B7D, 0x3A5ADADB, 0x0004002B, 0x0000000D, 0x00000073, 0xBAE1E1E2,\n    0x0004002B, 0x0000000D, 0x00000740, 0xBA8D8D8E, 0x0004002B, 0x0000000D,\n    0x00000173, 0x3AE7E7E8, 0x0004002B, 0x0000000D, 0x000006C6, 0xBA4ECECF,\n    0x0004002B, 0x0000000D, 0x00000567, 0xBAE9E9EA, 0x0004002B, 0x0000000D,\n    0x00000A3F, 0x3A32B2B3, 0x0004002B, 0x0000000D, 0x00000B95, 0xBA818182,\n    0x0004002B, 0x0000000D, 0x0000038A, 0xBAADADAE, 0x0004002B, 0x0000000D,\n    0x000005CE, 0xB938B8B9, 0x0004002B, 0x0000000D, 0x000006A3, 0xBAC5C5C6,\n    0x0004002B, 0x0000000D, 0x000006FA, 0x39ACACAD, 0x0004002B, 0x0000000D,\n    0x00000743, 0xBB000000, 0x0004002B, 0x0000000D, 0x000007C5, 0x3A2EAEAF,\n    0x0004002B, 0x0000000D, 0x0000038B, 0xBAD3D3D4, 0x0004002B, 0x0000000D,\n    0x00000ABA, 0x3A979798, 0x0004002B, 0x0000000D, 0x00000B51, 0x39ECECED,\n    0x0004002B, 0x0000000D, 0x00000914, 0xB9E4E4E5, 0x0004002B, 0x0000000D,\n    0x0000013C, 0x3948C8C9, 0x0004002B, 0x0000000D, 0x00000566, 0xBAC3C3C4,\n    0x0004002B, 0x0000000D, 0x0000097D, 0x3A959596, 0x0004002B, 0x0000000D,\n    0x00000A58, 0x38B0B0B1, 0x0004002B, 0x0000000D, 0x00000B5B, 0x3AF7F7F8,\n    0x0004002B, 0x0000000D, 0x00000704, 0x3AB7B7B8, 0x0004002B, 0x0000000D,\n    0x00000232, 0x3A129293, 0x0004002B, 0x0000000D, 0x000002EE, 0x38F0F0F1,\n    0x0004002B, 0x0000000D, 0x000007A2, 0x3AA5A5A6, 0x0004002B, 0x0000000D,\n    0x00000763, 0xBA169697, 0x0004002B, 0x0000000D, 0x00000135, 0xBA7EFEFF,\n    0x0004002B, 0x0000000D, 0x000000D3, 0x3AADADAE, 0x0004002B, 0x0000000D,\n    0x00000949, 0x3968E8E9, 0x0004002B, 0x0000000D, 0x000001D2, 0xBA46C6C7,\n    0x0004002B, 0x0000000D, 0x00000604, 0xBAB1B1B2, 0x0004002B, 0x0000000D,\n    0x00000035, 0x3ABFBFC0, 0x0004002B, 0x0000000D, 0x000004AE, 0x3A62E2E3,\n    0x0004002B, 0x0000000D, 0x000007D6, 0xB9BCBCBD, 0x0004002B, 0x0000000D,\n    0x00000B7B, 0x3A0E8E8F, 0x0004002B, 0x0000000D, 0x00000AF7, 0xBA939394,\n    0x0004002B, 0x0000000D, 0x00000873, 0xB9848485, 0x0004002B, 0x0000000D,\n    0x000004E9, 0xBA129293, 0x0004002B, 0x0000000D, 0x000007E1, 0xBAEDEDEE,\n    0x0004002B, 0x0000000D, 0x0000097F, 0x3AE1E1E2, 0x0004002B, 0x0000000D,\n    0x000001AE, 0xBA979798, 0x0004002B, 0x0000000D, 0x00000864, 0x3A42C2C3,\n    0x0004002B, 0x0000000D, 0x000008E0, 0x3ACDCDCE, 0x0004002B, 0x0000000D,\n    0x000005A3, 0xB8F0F0F1, 0x0004002B, 0x0000000D, 0x000006A4, 0xBA9F9FA0,\n    0x0004002B, 0x0000000D, 0x00000667, 0x3AEFEFF0, 0x0004002B, 0x0000000D,\n    0x00000961, 0x37C0C0C1, 0x0004002B, 0x0000000D, 0x000004C9, 0xBAFBFBFC,\n    0x0004002B, 0x0000000D, 0x00000ABC, 0x3AE3E3E4, 0x0004002B, 0x0000000D,\n    0x00000627, 0xBA3ABABB, 0x0004002B, 0x0000000D, 0x000007A3, 0x3ACBCBCC,\n    0x0004002B, 0x0000000D, 0x00000AF9, 0xBADFDFE0, 0x0004002B, 0x0000000D,\n    0x00000528, 0x3AA1A1A2, 0x0004002B, 0x0000000D, 0x00000B24, 0x3958D8D9,\n    0x0004002B, 0x0000000D, 0x0000020F, 0x3A89898A, 0x0004002B, 0x0000000D,\n    0x000008A1, 0xBA3EBEBF, 0x0004002B, 0x0000000D, 0x000004C8, 0xBAD5D5D6,\n    0x0004002B, 0x0000000D, 0x000004BD, 0xB9A4A4A5, 0x0004002B, 0x0000000D,\n    0x00000976, 0x39FCFCFD, 0x0004002B, 0x0000000D, 0x000006A5, 0xBAEBEBEC,\n    0x0004002B, 0x0000000D, 0x0000054D, 0x3A76F6F7, 0x0004002B, 0x0000000D,\n    0x000002E2, 0xB9B4B4B5, 0x0004002B, 0x0000000D, 0x000000F6, 0x3A36B6B7,\n    0x0004002B, 0x0000000D, 0x0000024C, 0xBA858586, 0x0004002B, 0x0000000D,\n    0x00000B97, 0xBACDCDCE, 0x0004002B, 0x0000000D, 0x00000055, 0xB7C0C0C1,\n    0x0004002B, 0x0000000D, 0x00000B96, 0xBAA7A7A8, 0x0004002B, 0x0000000D,\n    0x00000689, 0x3A52D2D3, 0x0004002B, 0x0000000D, 0x00000096, 0xBA6AEAEB,\n    0x0004002B, 0x0000000D, 0x00000072, 0xBABBBBBC, 0x0004002B, 0x0000000D,\n    0x000009A0, 0x3A1E9E9F, 0x0004002B, 0x0000000D, 0x0000014C, 0xB8B0B0B1,\n    0x0004002B, 0x0000000D, 0x00000059, 0x3A6EEEEF, 0x0004002B, 0x0000000D,\n    0x0000048C, 0x3B000000, 0x0004002B, 0x0000000D, 0x000009BB, 0xBAB7B7B8,\n    0x0004002B, 0x0000000D, 0x00000588, 0xBA26A6A7, 0x0004002B, 0x0000000D,\n    0x000003EC, 0x3AC5C5C6, 0x0004002B, 0x0000000D, 0x00000BBA, 0xBA56D6D7,\n    0x0004002B, 0x0000000D, 0x00000665, 0x3AA3A3A4, 0x0004002B, 0x0000000D,\n    0x000005BC, 0x39848485, 0x0004002B, 0x0000000D, 0x00000529, 0x3AC7C7C8,\n    0x0004002B, 0x0000000D, 0x00000840, 0x3A939394, 0x0004002B, 0x0000000D,\n    0x0000051F, 0x39BCBCBD, 0x0004002B, 0x0000000D, 0x000005FB, 0xB9CCCCCD,\n    0x0004002B, 0x0000000D, 0x000000D5, 0x3AF9F9FA, 0x0004002B, 0x0000000D,\n    0x000005C7, 0x3AB5B5B6, 0x0004002B, 0x0000000D, 0x000009BA, 0xBA919192,\n    0x0004002B, 0x0000000D, 0x000000D4, 0x3AD3D3D4, 0x0004002B, 0x0000000D,\n    0x000009DF, 0xBA66E6E7, 0x0004002B, 0x0000000D, 0x000006CD, 0x39189899,\n    0x0004002B, 0x0000000D, 0x00000489, 0x3A8D8D8E, 0x0004002B, 0x0000000D,\n    0x000007F0, 0xB860E0E1, 0x0004002B, 0x0000000D, 0x000003E1, 0x39949495,\n    0x0004002B, 0x0000000D, 0x000009BC, 0xBADDDDDE, 0x0004002B, 0x0000000D,\n    0x00000A59, 0xBAA5A5A6, 0x0004002B, 0x0000000D, 0x0000093E, 0xBA068687,\n    0x0004002B, 0x0000000D, 0x000007A9, 0xB928A8A9, 0x0004002B, 0x0000000D,\n    0x00000112, 0xBAF5F5F6, 0x0004002B, 0x0000000D, 0x00000271, 0xBA5ADADB,\n    0x0004002B, 0x0000000D, 0x000002D1, 0x3A26A6A7, 0x0004002B, 0x0000000D,\n    0x0000057C, 0x37008081, 0x0004002B, 0x0000000D, 0x0000038C, 0xBAF9F9FA,\n    0x0004002B, 0x0000000D, 0x0000003D, 0xB968E8E9, 0x0004002B, 0x0000000D,\n    0x00000A13, 0x39C4C4C5, 0x0004002B, 0x0000000D, 0x000001B0, 0xBAE3E3E4,\n    0x0004002B, 0x0000000D, 0x00000AEF, 0xB9D4D4D5, 0x0004002B, 0x0000000D,\n    0x000007DF, 0xBAA1A1A2, 0x0004002B, 0x0000000D, 0x00000842, 0x3ADFDFE0,\n    0x0004002B, 0x0000000D, 0x00000804, 0xBA76F6F7, 0x0004002B, 0x0000000D,\n    0x00000903, 0x3A56D6D7, 0x0004002B, 0x0000000D, 0x000007A4, 0x3AF1F1F2,\n    0x0004002B, 0x0000000D, 0x00000482, 0x39F4F4F5, 0x0103002C, 0x000003FB,\n    0x000008C2, 0x0000010F, 0x00000728, 0x00000705, 0x00000A5A, 0x000008DF,\n    0x00000094, 0x0000034C, 0x0000087E, 0x0000034D, 0x00000687, 0x000003EB,\n    0x0000024E, 0x00000726, 0x00000698, 0x00000703, 0x00000AF8, 0x00000ABB,\n    0x0000026F, 0x000008A8, 0x00000565, 0x0000065D, 0x000004C6, 0x00000057,\n    0x0000006A, 0x00000A1E, 0x0000087D, 0x00000959, 0x00000BB8, 0x0000097E,\n    0x00000606, 0x000003AD, 0x000000E2, 0x00000370, 0x0000024D, 0x000005C6,\n    0x00000B8C, 0x00000036, 0x0000087F, 0x00000172, 0x00000399, 0x0000040F,\n    0x0000091E, 0x000008D5, 0x000008DE, 0x000002EB, 0x00000317, 0x0000034E,\n    0x00000111, 0x0000002B, 0x000008E1, 0x0000042A, 0x00000765, 0x000009A2,\n    0x000004F2, 0x0000058A, 0x000007E0, 0x00000802, 0x00000A1C, 0x00000940,\n    0x000002EC, 0x000003ED, 0x000004EB, 0x00000234, 0x00000245, 0x00000603,\n    0x00000984, 0x0000076E, 0x00000841, 0x000009DD, 0x000003F3, 0x00000B5A,\n    0x00000B58, 0x00000838, 0x00000218, 0x00000A1D, 0x0000054B, 0x00000503,\n    0x00000169, 0x00000605, 0x0000048A, 0x000002D3, 0x00000A7C, 0x00000171,\n    0x000001AF, 0x000004AC, 0x0000024F, 0x00000ADE, 0x00000110, 0x00000212,\n    0x00000742, 0x00000389, 0x000006C4, 0x00000B98, 0x000002AE, 0x000009B1,\n    0x00000741, 0x00000211, 0x00000A5B, 0x000005EA, 0x00000310, 0x0000052A,\n    0x00000071, 0x00000107, 0x000006A2, 0x00000B1B, 0x00000034, 0x0000024B,\n    0x000002AF, 0x00000A41, 0x00000A7E, 0x0000034F, 0x00000901, 0x00000539,\n    0x0000091C, 0x000001A4, 0x00000666, 0x00000833, 0x00000206, 0x00000210,\n    0x000002ED, 0x0000040D, 0x00000428, 0x00000195, 0x000004C7, 0x00000AB0,\n    0x00000429, 0x00000B5F, 0x0000044C, 0x00000B59, 0x00000344, 0x000007C7,\n    0x00000739, 0x0000091D, 0x000000D2, 0x00000133, 0x000005C8, 0x00000A1B,\n    0x00000420, 0x000002B0, 0x00000A25, 0x0000030E, 0x0000048B, 0x00000B7D,\n    0x00000073, 0x00000740, 0x00000173, 0x000006C6, 0x00000567, 0x00000A3F,\n    0x00000B95, 0x0000038A, 0x000005CE, 0x000006A3, 0x000006FA, 0x00000743,\n    0x000007C5, 0x0000038B, 0x00000ABA, 0x00000B51, 0x00000914, 0x0000013C,\n    0x00000566, 0x0000097D, 0x00000A58, 0x00000B5B, 0x00000704, 0x00000232,\n    0x000002EE, 0x000007A2, 0x00000763, 0x00000135, 0x000000D3, 0x00000949,\n    0x000001D2, 0x00000604, 0x00000035, 0x000004AE, 0x000007D6, 0x00000B7B,\n    0x00000AF7, 0x00000873, 0x000004E9, 0x000007E1, 0x0000097F, 0x000001AE,\n    0x00000864, 0x000008E0, 0x000005A3, 0x000006A4, 0x00000667, 0x00000961,\n    0x000004C9, 0x00000ABC, 0x00000627, 0x000007A3, 0x00000AF9, 0x00000528,\n    0x00000B24, 0x0000020F, 0x000008A1, 0x000004C8, 0x000004BD, 0x00000976,\n    0x000006A5, 0x0000054D, 0x000002E2, 0x000000F6, 0x0000024C, 0x00000B97,\n    0x00000055, 0x00000B96, 0x00000689, 0x00000096, 0x00000072, 0x000009A0,\n    0x0000014C, 0x00000059, 0x0000048C, 0x000009BB, 0x00000588, 0x000003EC,\n    0x00000BBA, 0x00000665, 0x000005BC, 0x00000529, 0x00000840, 0x0000051F,\n    0x000005FB, 0x000000D5, 0x000005C7, 0x000009BA, 0x000000D4, 0x000009DF,\n    0x000006CD, 0x00000489, 0x000007F0, 0x000003E1, 0x000009BC, 0x00000A59,\n    0x0000093E, 0x000007A9, 0x00000112, 0x00000271, 0x000002D1, 0x0000057C,\n    0x0000038C, 0x0000003D, 0x00000A13, 0x000001B0, 0x00000AEF, 0x000007DF,\n    0x00000842, 0x00000804, 0x00000903, 0x000007A4, 0x00000482, 0x0004002B,\n    0x0000000B, 0x00000A0D, 0x00000001, 0x0004002B, 0x0000000B, 0x00000A3A,\n    0x00000010, 0x00040020, 0x00000678, 0x00000007, 0x000003FB, 0x00040017,\n    0x0000001D, 0x0000000D, 0x00000004, 0x00040020, 0x0000029A, 0x00000001,\n    0x0000001D, 0x0004003B, 0x0000029A, 0x00000C93, 0x00000001, 0x00040017,\n    0x00000013, 0x0000000D, 0x00000002, 0x0005001E, 0x00000418, 0x00000012,\n    0x00000013, 0x0000000D, 0x00040020, 0x00000695, 0x00000009, 0x00000418,\n    0x0004003B, 0x00000695, 0x00000CE9, 0x00000009, 0x0004002B, 0x0000000C,\n    0x00000A0B, 0x00000000, 0x00040020, 0x0000028F, 0x00000009, 0x00000012,\n    0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001, 0x00040020, 0x00000290,\n    0x00000009, 0x00000013, 0x0004002B, 0x0000000D, 0x000000FC, 0x3F000000,\n    0x0004002B, 0x0000000C, 0x00000A11, 0x00000002, 0x00040020, 0x0000028B,\n    0x00000009, 0x0000000D, 0x00040020, 0x0000029B, 0x00000003, 0x0000001D,\n    0x0004003B, 0x0000029B, 0x000014D6, 0x00000003, 0x0004002B, 0x0000000B,\n    0x0000020D, 0x1FBC4639, 0x0004002B, 0x0000000B, 0x00000345, 0x7EF07EBB,\n    0x0004002B, 0x0000000B, 0x000000B2, 0x7EF19FFF, 0x0004002B, 0x0000000D,\n    0x00000019, 0x40000000, 0x00090019, 0x00000097, 0x0000000D, 0x00000001,\n    0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x00040020,\n    0x00000313, 0x00000000, 0x00000097, 0x0004003B, 0x00000313, 0x0000142B,\n    0x00000000, 0x0004002B, 0x0000000C, 0x00000A08, 0xFFFFFFFF, 0x0005002C,\n    0x00000012, 0x0000070B, 0x00000A0B, 0x00000A08, 0x0005002C, 0x00000012,\n    0x00000714, 0x00000A0E, 0x00000A08, 0x0005002C, 0x00000012, 0x0000070E,\n    0x00000A08, 0x00000A0B, 0x0005002C, 0x00000012, 0x00000720, 0x00000A0E,\n    0x00000A0B, 0x0005002C, 0x00000012, 0x0000071A, 0x00000A08, 0x00000A0E,\n    0x0005002C, 0x00000012, 0x00000723, 0x00000A0B, 0x00000A0E, 0x0005002C,\n    0x00000012, 0x0000072C, 0x00000A0E, 0x00000A0E, 0x0005002C, 0x00000012,\n    0x00000729, 0x00000A11, 0x00000A0B, 0x0005002C, 0x00000012, 0x0000072F,\n    0x00000A0B, 0x00000A11, 0x0005002C, 0x00000012, 0x00000735, 0x00000A11,\n    0x00000A0E, 0x0005002C, 0x00000012, 0x00000738, 0x00000A0E, 0x00000A11,\n    0x0004002B, 0x0000000D, 0x000002C4, 0x3D000000, 0x0005002C, 0x00000013,\n    0x0000061E, 0x000000FC, 0x000000FC, 0x0005002C, 0x00000011, 0x0000084A,\n    0x00000A37, 0x00000A37, 0x0006002C, 0x00000018, 0x00000A2C, 0x00000A0C,\n    0x00000A0C, 0x00000A0C, 0x0006002C, 0x00000018, 0x00000A16, 0x0000008A,\n    0x0000008A, 0x0000008A, 0x00030001, 0x0000001D, 0x00000002, 0x00050036,\n    0x00000008, 0x0000161F, 0x00000000, 0x00000502, 0x000200F8, 0x00006179,\n    0x0004003B, 0x00000678, 0x000047EB, 0x00000007, 0x0004003D, 0x0000001D,\n    0x00005647, 0x00000C93, 0x0007004F, 0x00000013, 0x000019A2, 0x00005647,\n    0x00005647, 0x00000000, 0x00000001, 0x0004006E, 0x00000012, 0x000044F8,\n    0x000019A2, 0x00050041, 0x0000028F, 0x00004B4F, 0x00000CE9, 0x00000A0B,\n    0x0004003D, 0x00000012, 0x00005926, 0x00004B4F, 0x00050082, 0x00000012,\n    0x00005B10, 0x000044F8, 0x00005926, 0x0004007C, 0x00000011, 0x000026D2,\n    0x00005B10, 0x00050041, 0x00000290, 0x00005205, 0x00000CE9, 0x00000A0E,\n    0x0004003D, 0x00000013, 0x00005833, 0x00005205, 0x0004007C, 0x00000011,\n    0x00003455, 0x00005833, 0x0005008E, 0x00000013, 0x000031DA, 0x00005833,\n    0x000000FC, 0x00050083, 0x00000013, 0x00006013, 0x000031DA, 0x0000061E,\n    0x0004007C, 0x00000011, 0x0000454F, 0x00006013, 0x00050051, 0x0000000B,\n    0x00004143, 0x00003455, 0x00000000, 0x00050051, 0x0000000B, 0x000033E3,\n    0x00003455, 0x00000001, 0x00050051, 0x0000000B, 0x00001DD9, 0x0000454F,\n    0x00000000, 0x00050051, 0x0000000B, 0x00001D69, 0x0000454F, 0x00000001,\n    0x00070050, 0x00000017, 0x00004741, 0x00004143, 0x000033E3, 0x00001DD9,\n    0x00001D69, 0x00050041, 0x0000028B, 0x00002631, 0x00000CE9, 0x00000A11,\n    0x0004003D, 0x0000000D, 0x00004978, 0x00002631, 0x0004007C, 0x0000000B,\n    0x000044BF, 0x00004978, 0x00040070, 0x00000013, 0x00004CA9, 0x000026D2,\n    0x0007004F, 0x00000011, 0x000020FA, 0x00004741, 0x00004741, 0x00000000,\n    0x00000001, 0x0004007C, 0x00000013, 0x00002D38, 0x000020FA, 0x00050085,\n    0x00000013, 0x0000514E, 0x00004CA9, 0x00002D38, 0x0007004F, 0x00000011,\n    0x00002322, 0x00004741, 0x00004741, 0x00000002, 0x00000003, 0x0004007C,\n    0x00000013, 0x00002E15, 0x00002322, 0x00050081, 0x00000013, 0x00004E65,\n    0x0000514E, 0x00002E15, 0x0006000C, 0x00000013, 0x000031AF, 0x00000001,\n    0x00000008, 0x00004E65, 0x00050083, 0x00000013, 0x00003FA2, 0x00004E65,\n    0x000031AF, 0x0004006E, 0x00000012, 0x000042A8, 0x000031AF, 0x00050080,\n    0x00000012, 0x00005058, 0x000042A8, 0x0000070B, 0x0004003D, 0x00000097,\n    0x0000472F, 0x0000142B, 0x0007005F, 0x0000001D, 0x00004C03, 0x0000472F,\n    0x00005058, 0x00000002, 0x00000A0B, 0x00050080, 0x00000012, 0x00003423,\n    0x000042A8, 0x0000070E, 0x0004003D, 0x00000097, 0x000038CA, 0x0000142B,\n    0x0007005F, 0x0000001D, 0x00003151, 0x000038CA, 0x00003423, 0x00000002,\n    0x00000A0B, 0x0004003D, 0x00000097, 0x000028B5, 0x0000142B, 0x0007005F,\n    0x0000001D, 0x00003C54, 0x000028B5, 0x000042A8, 0x00000002, 0x00000A0B,\n    0x00050080, 0x00000012, 0x00003424, 0x000042A8, 0x00000714, 0x0004003D,\n    0x00000097, 0x00003DC3, 0x0000142B, 0x0007005F, 0x0000001D, 0x00004C04,\n    0x00003DC3, 0x00003424, 0x00000002, 0x00000A0B, 0x00050080, 0x00000012,\n    0x00003425, 0x000042A8, 0x00000720, 0x0004003D, 0x00000097, 0x00003DC4,\n    0x0000142B, 0x0007005F, 0x0000001D, 0x00004C05, 0x00003DC4, 0x00003425,\n    0x00000002, 0x00000A0B, 0x00050080, 0x00000012, 0x00003426, 0x000042A8,\n    0x00000729, 0x0004003D, 0x00000097, 0x00003DC5, 0x0000142B, 0x0007005F,\n    0x0000001D, 0x00004C06, 0x00003DC5, 0x00003426, 0x00000002, 0x00000A0B,\n    0x00050080, 0x00000012, 0x00003427, 0x000042A8, 0x0000071A, 0x0004003D,\n    0x00000097, 0x00003DC6, 0x0000142B, 0x0007005F, 0x0000001D, 0x00004C07,\n    0x00003DC6, 0x00003427, 0x00000002, 0x00000A0B, 0x00050080, 0x00000012,\n    0x00003428, 0x000042A8, 0x00000723, 0x0004003D, 0x00000097, 0x00003DC7,\n    0x0000142B, 0x0007005F, 0x0000001D, 0x00004C08, 0x00003DC7, 0x00003428,\n    0x00000002, 0x00000A0B, 0x00050080, 0x00000012, 0x00003429, 0x000042A8,\n    0x0000072F, 0x0004003D, 0x00000097, 0x00003DC8, 0x0000142B, 0x0007005F,\n    0x0000001D, 0x00004C09, 0x00003DC8, 0x00003429, 0x00000002, 0x00000A0B,\n    0x00050080, 0x00000012, 0x0000342A, 0x000042A8, 0x0000072C, 0x0004003D,\n    0x00000097, 0x00003DC9, 0x0000142B, 0x0007005F, 0x0000001D, 0x00004C0A,\n    0x00003DC9, 0x0000342A, 0x00000002, 0x00000A0B, 0x00050080, 0x00000012,\n    0x0000342B, 0x000042A8, 0x00000735, 0x0004003D, 0x00000097, 0x00003DCA,\n    0x0000142B, 0x0007005F, 0x0000001D, 0x00004C0B, 0x00003DCA, 0x0000342B,\n    0x00000002, 0x00000A0B, 0x00050080, 0x00000012, 0x0000342C, 0x000042A8,\n    0x00000738, 0x0004003D, 0x00000097, 0x00003A46, 0x0000142B, 0x0007005F,\n    0x0000001D, 0x000022C3, 0x00003A46, 0x0000342C, 0x00000002, 0x00000A0B,\n    0x00050051, 0x0000000D, 0x00004D11, 0x00004C03, 0x00000000, 0x00050051,\n    0x0000000D, 0x00001B71, 0x00004C03, 0x00000001, 0x00050051, 0x0000000D,\n    0x00004923, 0x00004C03, 0x00000002, 0x00050085, 0x0000000D, 0x0000611F,\n    0x00004D11, 0x00004D11, 0x00050085, 0x0000000D, 0x00003F38, 0x00001B71,\n    0x00001B71, 0x00050085, 0x0000000D, 0x00002459, 0x00004923, 0x00004923,\n    0x00050051, 0x0000000D, 0x000056DC, 0x00004C04, 0x00000000, 0x00050051,\n    0x0000000D, 0x00002E44, 0x00004C04, 0x00000001, 0x00050051, 0x0000000D,\n    0x00004924, 0x00004C04, 0x00000002, 0x00050085, 0x0000000D, 0x00006120,\n    0x000056DC, 0x000056DC, 0x00050085, 0x0000000D, 0x00003F39, 0x00002E44,\n    0x00002E44, 0x00050085, 0x0000000D, 0x0000245A, 0x00004924, 0x00004924,\n    0x00050051, 0x0000000D, 0x000056DD, 0x00003151, 0x00000000, 0x00050051,\n    0x0000000D, 0x00002E45, 0x00003151, 0x00000001, 0x00050051, 0x0000000D,\n    0x00004925, 0x00003151, 0x00000002, 0x00050085, 0x0000000D, 0x00006121,\n    0x000056DD, 0x000056DD, 0x00050085, 0x0000000D, 0x00003F3A, 0x00002E45,\n    0x00002E45, 0x00050085, 0x0000000D, 0x0000245B, 0x00004925, 0x00004925,\n    0x00050051, 0x0000000D, 0x000056DE, 0x00003C54, 0x00000000, 0x00050051,\n    0x0000000D, 0x00002E46, 0x00003C54, 0x00000001, 0x00050051, 0x0000000D,\n    0x00004926, 0x00003C54, 0x00000002, 0x00050085, 0x0000000D, 0x00006122,\n    0x000056DE, 0x000056DE, 0x00050085, 0x0000000D, 0x00003F3B, 0x00002E46,\n    0x00002E46, 0x00050085, 0x0000000D, 0x0000245C, 0x00004926, 0x00004926,\n    0x00050051, 0x0000000D, 0x000056DF, 0x00004C05, 0x00000000, 0x00050051,\n    0x0000000D, 0x00002E47, 0x00004C05, 0x00000001, 0x00050051, 0x0000000D,\n    0x00004927, 0x00004C05, 0x00000002, 0x00050085, 0x0000000D, 0x00006123,\n    0x000056DF, 0x000056DF, 0x00050085, 0x0000000D, 0x00003F3C, 0x00002E47,\n    0x00002E47, 0x00050085, 0x0000000D, 0x0000245D, 0x00004927, 0x00004927,\n    0x00050051, 0x0000000D, 0x000056E0, 0x00004C06, 0x00000000, 0x00050051,\n    0x0000000D, 0x00002E48, 0x00004C06, 0x00000001, 0x00050051, 0x0000000D,\n    0x00004928, 0x00004C06, 0x00000002, 0x00050085, 0x0000000D, 0x00006124,\n    0x000056E0, 0x000056E0, 0x00050085, 0x0000000D, 0x00003F3D, 0x00002E48,\n    0x00002E48, 0x00050085, 0x0000000D, 0x0000245E, 0x00004928, 0x00004928,\n    0x00050051, 0x0000000D, 0x000056E1, 0x00004C07, 0x00000000, 0x00050051,\n    0x0000000D, 0x00002E49, 0x00004C07, 0x00000001, 0x00050051, 0x0000000D,\n    0x00004929, 0x00004C07, 0x00000002, 0x00050085, 0x0000000D, 0x00006125,\n    0x000056E1, 0x000056E1, 0x00050085, 0x0000000D, 0x00003F3E, 0x00002E49,\n    0x00002E49, 0x00050085, 0x0000000D, 0x0000245F, 0x00004929, 0x00004929,\n    0x00050051, 0x0000000D, 0x000056E2, 0x00004C08, 0x00000000, 0x00050051,\n    0x0000000D, 0x00002E4A, 0x00004C08, 0x00000001, 0x00050051, 0x0000000D,\n    0x0000492A, 0x00004C08, 0x00000002, 0x00050085, 0x0000000D, 0x00006126,\n    0x000056E2, 0x000056E2, 0x00050085, 0x0000000D, 0x00003F3F, 0x00002E4A,\n    0x00002E4A, 0x00050085, 0x0000000D, 0x00002460, 0x0000492A, 0x0000492A,\n    0x00050051, 0x0000000D, 0x000056E3, 0x00004C0A, 0x00000000, 0x00050051,\n    0x0000000D, 0x00002E4B, 0x00004C0A, 0x00000001, 0x00050051, 0x0000000D,\n    0x0000492B, 0x00004C0A, 0x00000002, 0x00050085, 0x0000000D, 0x00006127,\n    0x000056E3, 0x000056E3, 0x00050085, 0x0000000D, 0x00003F40, 0x00002E4B,\n    0x00002E4B, 0x00050085, 0x0000000D, 0x00002461, 0x0000492B, 0x0000492B,\n    0x00050051, 0x0000000D, 0x000056E4, 0x00004C0B, 0x00000000, 0x00050051,\n    0x0000000D, 0x00002E4C, 0x00004C0B, 0x00000001, 0x00050051, 0x0000000D,\n    0x0000492C, 0x00004C0B, 0x00000002, 0x00050085, 0x0000000D, 0x00006128,\n    0x000056E4, 0x000056E4, 0x00050085, 0x0000000D, 0x00003F41, 0x00002E4C,\n    0x00002E4C, 0x00050085, 0x0000000D, 0x00002462, 0x0000492C, 0x0000492C,\n    0x00050051, 0x0000000D, 0x000056E5, 0x00004C09, 0x00000000, 0x00050051,\n    0x0000000D, 0x00002E4D, 0x00004C09, 0x00000001, 0x00050051, 0x0000000D,\n    0x0000492D, 0x00004C09, 0x00000002, 0x00050085, 0x0000000D, 0x00006129,\n    0x000056E5, 0x000056E5, 0x00050085, 0x0000000D, 0x00003F42, 0x00002E4D,\n    0x00002E4D, 0x00050085, 0x0000000D, 0x00002463, 0x0000492D, 0x0000492D,\n    0x00050051, 0x0000000D, 0x000056E6, 0x000022C3, 0x00000000, 0x00050051,\n    0x0000000D, 0x00002E4E, 0x000022C3, 0x00000001, 0x00050051, 0x0000000D,\n    0x0000492E, 0x000022C3, 0x00000002, 0x00050085, 0x0000000D, 0x0000612A,\n    0x000056E6, 0x000056E6, 0x00050085, 0x0000000D, 0x00003A3E, 0x00002E4E,\n    0x00002E4E, 0x00050085, 0x0000000D, 0x0000218E, 0x0000492E, 0x0000492E,\n    0x0007000C, 0x0000000D, 0x00002A7D, 0x00000001, 0x00000025, 0x00003F3A,\n    0x00003F3B, 0x0007000C, 0x0000000D, 0x0000243C, 0x00000001, 0x00000025,\n    0x00003F38, 0x00002A7D, 0x0007000C, 0x0000000D, 0x00003E4F, 0x00000001,\n    0x00000025, 0x00003F3C, 0x00003F3F, 0x0007000C, 0x0000000D, 0x00002A99,\n    0x00000001, 0x00000025, 0x0000243C, 0x00003E4F, 0x0007000C, 0x0000000D,\n    0x00005EE8, 0x00000001, 0x00000028, 0x00003F3A, 0x00003F3B, 0x0007000C,\n    0x0000000D, 0x00004473, 0x00000001, 0x00000028, 0x00003F38, 0x00005EE8,\n    0x0007000C, 0x0000000D, 0x00005558, 0x00000001, 0x00000028, 0x00003F3C,\n    0x00003F3F, 0x0007000C, 0x0000000D, 0x00001E8F, 0x00000001, 0x00000028,\n    0x00004473, 0x00005558, 0x0007000C, 0x0000000D, 0x000034BF, 0x00000001,\n    0x00000025, 0x00003F3B, 0x00003F3C, 0x0007000C, 0x0000000D, 0x000035FB,\n    0x00000001, 0x00000025, 0x00003F39, 0x000034BF, 0x0007000C, 0x0000000D,\n    0x00003E50, 0x00000001, 0x00000025, 0x00003F3D, 0x00003F40, 0x0007000C,\n    0x0000000D, 0x00002A9A, 0x00000001, 0x00000025, 0x000035FB, 0x00003E50,\n    0x0007000C, 0x0000000D, 0x00005EE9, 0x00000001, 0x00000028, 0x00003F3B,\n    0x00003F3C, 0x0007000C, 0x0000000D, 0x00004474, 0x00000001, 0x00000028,\n    0x00003F39, 0x00005EE9, 0x0007000C, 0x0000000D, 0x00005559, 0x00000001,\n    0x00000028, 0x00003F3D, 0x00003F40, 0x0007000C, 0x0000000D, 0x00001E90,\n    0x00000001, 0x00000028, 0x00004474, 0x00005559, 0x0007000C, 0x0000000D,\n    0x000034C0, 0x00000001, 0x00000025, 0x00003F3E, 0x00003F3F, 0x0007000C,\n    0x0000000D, 0x000035FC, 0x00000001, 0x00000025, 0x00003F3B, 0x000034C0,\n    0x0007000C, 0x0000000D, 0x00003E51, 0x00000001, 0x00000025, 0x00003F40,\n    0x00003F42, 0x0007000C, 0x0000000D, 0x00002A9B, 0x00000001, 0x00000025,\n    0x000035FC, 0x00003E51, 0x0007000C, 0x0000000D, 0x00005EEA, 0x00000001,\n    0x00000028, 0x00003F3E, 0x00003F3F, 0x0007000C, 0x0000000D, 0x00004475,\n    0x00000001, 0x00000028, 0x00003F3B, 0x00005EEA, 0x0007000C, 0x0000000D,\n    0x0000555A, 0x00000001, 0x00000028, 0x00003F40, 0x00003F42, 0x0007000C,\n    0x0000000D, 0x00001E91, 0x00000001, 0x00000028, 0x00004475, 0x0000555A,\n    0x0007000C, 0x0000000D, 0x000034C1, 0x00000001, 0x00000025, 0x00003F3F,\n    0x00003F40, 0x0007000C, 0x0000000D, 0x000035FD, 0x00000001, 0x00000025,\n    0x00003F3C, 0x000034C1, 0x0007000C, 0x0000000D, 0x00003E52, 0x00000001,\n    0x00000025, 0x00003F41, 0x00003A3E, 0x0007000C, 0x0000000D, 0x00002A9C,\n    0x00000001, 0x00000025, 0x000035FD, 0x00003E52, 0x0007000C, 0x0000000D,\n    0x00005EEB, 0x00000001, 0x00000028, 0x00003F3F, 0x00003F40, 0x0007000C,\n    0x0000000D, 0x00004476, 0x00000001, 0x00000028, 0x00003F3C, 0x00005EEB,\n    0x0007000C, 0x0000000D, 0x00005D83, 0x00000001, 0x00000028, 0x00003F41,\n    0x00003A3E, 0x0007000C, 0x0000000D, 0x0000526D, 0x00000001, 0x00000028,\n    0x00004476, 0x00005D83, 0x0004007C, 0x0000000B, 0x00001FF5, 0x00001E8F,\n    0x00050082, 0x0000000B, 0x00002272, 0x00000345, 0x00001FF5, 0x0004007C,\n    0x0000000D, 0x00002699, 0x00002272, 0x0004007C, 0x0000000B, 0x00003AD6,\n    0x00001E90, 0x00050082, 0x0000000B, 0x00001A2E, 0x00000345, 0x00003AD6,\n    0x0004007C, 0x0000000D, 0x0000269A, 0x00001A2E, 0x0004007C, 0x0000000B,\n    0x00003AD7, 0x00001E91, 0x00050082, 0x0000000B, 0x00001A2F, 0x00000345,\n    0x00003AD7, 0x0004007C, 0x0000000D, 0x0000269B, 0x00001A2F, 0x0004007C,\n    0x0000000B, 0x00003AD8, 0x0000526D, 0x00050082, 0x0000000B, 0x00001AB3,\n    0x00000345, 0x00003AD8, 0x0004007C, 0x0000000D, 0x00001941, 0x00001AB3,\n    0x00050083, 0x0000000D, 0x00005E43, 0x0000008A, 0x00001E8F, 0x0007000C,\n    0x0000000D, 0x00005B1C, 0x00000001, 0x00000025, 0x00002A99, 0x00005E43,\n    0x00050085, 0x0000000D, 0x000059FC, 0x00005B1C, 0x00002699, 0x0008000C,\n    0x0000000D, 0x00003EB3, 0x00000001, 0x0000002B, 0x000059FC, 0x00000A0C,\n    0x0000008A, 0x00050083, 0x0000000D, 0x000061AD, 0x0000008A, 0x00001E90,\n    0x0007000C, 0x0000000D, 0x000029C9, 0x00000001, 0x00000025, 0x00002A9A,\n    0x000061AD, 0x00050085, 0x0000000D, 0x000059FD, 0x000029C9, 0x0000269A,\n    0x0008000C, 0x0000000D, 0x00003EB4, 0x00000001, 0x0000002B, 0x000059FD,\n    0x00000A0C, 0x0000008A, 0x00050083, 0x0000000D, 0x000061AE, 0x0000008A,\n    0x00001E91, 0x0007000C, 0x0000000D, 0x000029CA, 0x00000001, 0x00000025,\n    0x00002A9B, 0x000061AE, 0x00050085, 0x0000000D, 0x000059FE, 0x000029CA,\n    0x0000269B, 0x0008000C, 0x0000000D, 0x00003EB5, 0x00000001, 0x0000002B,\n    0x000059FE, 0x00000A0C, 0x0000008A, 0x00050083, 0x0000000D, 0x000061AF,\n    0x0000008A, 0x0000526D, 0x0007000C, 0x0000000D, 0x000029CB, 0x00000001,\n    0x00000025, 0x00002A9C, 0x000061AF, 0x00050085, 0x0000000D, 0x00005977,\n    0x000029CB, 0x00001941, 0x0008000C, 0x0000000D, 0x000050CB, 0x00000001,\n    0x0000002B, 0x00005977, 0x00000A0C, 0x0000008A, 0x0004007C, 0x0000000B,\n    0x00005DCB, 0x00003EB3, 0x000500C2, 0x0000000B, 0x0000564A, 0x00005DCB,\n    0x00000A0D, 0x00050080, 0x0000000B, 0x00005ABD, 0x0000564A, 0x0000020D,\n    0x0004007C, 0x0000000D, 0x00005943, 0x00005ABD, 0x0004007C, 0x0000000B,\n    0x000022CE, 0x00003EB4, 0x000500C2, 0x0000000B, 0x000023E5, 0x000022CE,\n    0x00000A0D, 0x00050080, 0x0000000B, 0x00005ABE, 0x000023E5, 0x0000020D,\n    0x0004007C, 0x0000000D, 0x00005944, 0x00005ABE, 0x0004007C, 0x0000000B,\n    0x000022CF, 0x00003EB5, 0x000500C2, 0x0000000B, 0x000023E6, 0x000022CF,\n    0x00000A0D, 0x00050080, 0x0000000B, 0x00005ABF, 0x000023E6, 0x0000020D,\n    0x0004007C, 0x0000000D, 0x00005945, 0x00005ABF, 0x0004007C, 0x0000000B,\n    0x000022D0, 0x000050CB, 0x000500C2, 0x0000000B, 0x000023E7, 0x000022D0,\n    0x00000A0D, 0x00050080, 0x0000000B, 0x00005AC0, 0x000023E7, 0x0000020D,\n    0x0004007C, 0x0000000D, 0x000054BC, 0x00005AC0, 0x0004007C, 0x0000000D,\n    0x00004C66, 0x000044BF, 0x00050085, 0x0000000D, 0x000049BF, 0x00005943,\n    0x00004C66, 0x00050085, 0x0000000D, 0x0000590B, 0x00005944, 0x00004C66,\n    0x00050085, 0x0000000D, 0x00004BB4, 0x00005945, 0x00004C66, 0x00050085,\n    0x0000000D, 0x0000280F, 0x000054BC, 0x00004C66, 0x00050051, 0x0000000D,\n    0x00003512, 0x00003FA2, 0x00000000, 0x00050083, 0x0000000D, 0x000054D6,\n    0x0000008A, 0x00003512, 0x00050051, 0x0000000D, 0x00002E64, 0x00003FA2,\n    0x00000001, 0x00050083, 0x0000000D, 0x00002B8B, 0x0000008A, 0x00002E64,\n    0x00050085, 0x0000000D, 0x00004506, 0x000054D6, 0x00002B8B, 0x00050085,\n    0x0000000D, 0x0000627C, 0x00003512, 0x00002B8B, 0x00050085, 0x0000000D,\n    0x00004F6A, 0x000054D6, 0x00002E64, 0x00050085, 0x0000000D, 0x0000509E,\n    0x00003512, 0x00002E64, 0x00050083, 0x0000000D, 0x0000471C, 0x00001E8F,\n    0x00002A99, 0x00050081, 0x0000000D, 0x00005B9D, 0x000002C4, 0x0000471C,\n    0x0004007C, 0x0000000B, 0x00002C83, 0x00005B9D, 0x00050082, 0x0000000B,\n    0x00001DFD, 0x00000345, 0x00002C83, 0x0004007C, 0x0000000D, 0x00002097,\n    0x00001DFD, 0x00050085, 0x0000000D, 0x0000447B, 0x00004506, 0x00002097,\n    0x00050083, 0x0000000D, 0x00005097, 0x00001E90, 0x00002A9A, 0x00050081,\n    0x0000000D, 0x00005B9E, 0x000002C4, 0x00005097, 0x0004007C, 0x0000000B,\n    0x00002C84, 0x00005B9E, 0x00050082, 0x0000000B, 0x00001DFE, 0x00000345,\n    0x00002C84, 0x0004007C, 0x0000000D, 0x00002098, 0x00001DFE, 0x00050085,\n    0x0000000D, 0x0000447C, 0x0000627C, 0x00002098, 0x00050083, 0x0000000D,\n    0x00005098, 0x00001E91, 0x00002A9B, 0x00050081, 0x0000000D, 0x00005B9F,\n    0x000002C4, 0x00005098, 0x0004007C, 0x0000000B, 0x00002C85, 0x00005B9F,\n    0x00050082, 0x0000000B, 0x00001DFF, 0x00000345, 0x00002C85, 0x0004007C,\n    0x0000000D, 0x00002099, 0x00001DFF, 0x00050085, 0x0000000D, 0x0000447D,\n    0x00004F6A, 0x00002099, 0x00050083, 0x0000000D, 0x00005099, 0x0000526D,\n    0x00002A9C, 0x00050081, 0x0000000D, 0x00005BA0, 0x000002C4, 0x00005099,\n    0x0004007C, 0x0000000B, 0x00002C86, 0x00005BA0, 0x00050082, 0x0000000B,\n    0x00001E00, 0x00000345, 0x00002C86, 0x0004007C, 0x0000000D, 0x000020BD,\n    0x00001E00, 0x00050085, 0x0000000D, 0x0000436D, 0x0000509E, 0x000020BD,\n    0x00050085, 0x0000000D, 0x0000590C, 0x000049BF, 0x0000447B, 0x00050085,\n    0x0000000D, 0x00004F44, 0x0000590B, 0x0000447C, 0x00050085, 0x0000000D,\n    0x000051F8, 0x00004BB4, 0x0000447D, 0x00050081, 0x0000000D, 0x00003D4A,\n    0x00004F44, 0x000051F8, 0x00050081, 0x0000000D, 0x00005767, 0x00003D4A,\n    0x0000447B, 0x00050085, 0x0000000D, 0x00003135, 0x0000280F, 0x0000436D,\n    0x00050081, 0x0000000D, 0x0000499D, 0x0000590C, 0x00003135, 0x00050081,\n    0x0000000D, 0x00005A1B, 0x0000499D, 0x0000447C, 0x00050081, 0x0000000D,\n    0x00001C3B, 0x0000499D, 0x0000447D, 0x00050081, 0x0000000D, 0x00001C3C,\n    0x00003D4A, 0x0000436D, 0x00050081, 0x0000000D, 0x00001C3D, 0x0000590C,\n    0x00004F44, 0x00050081, 0x0000000D, 0x00001C87, 0x00001C3D, 0x000051F8,\n    0x00050081, 0x0000000D, 0x00001987, 0x00001C87, 0x00003135, 0x00050085,\n    0x0000000D, 0x00003136, 0x00000019, 0x00001987, 0x00050081, 0x0000000D,\n    0x0000499E, 0x00003136, 0x00005767, 0x00050081, 0x0000000D, 0x00005A1C,\n    0x0000499E, 0x00005A1B, 0x00050081, 0x0000000D, 0x00001BDC, 0x00005A1C,\n    0x00001C3B, 0x00050081, 0x0000000D, 0x00001FAF, 0x00001BDC, 0x00001C3C,\n    0x0004007C, 0x0000000B, 0x00002636, 0x00001FAF, 0x00050082, 0x0000000B,\n    0x00001D8B, 0x000000B2, 0x00002636, 0x0004007C, 0x0000000D, 0x000024CB,\n    0x00001D8B, 0x0004007F, 0x0000000D, 0x000023AA, 0x000024CB, 0x00050085,\n    0x0000000D, 0x0000304F, 0x000023AA, 0x00001FAF, 0x00050081, 0x0000000D,\n    0x0000409C, 0x0000304F, 0x00000019, 0x00050085, 0x0000000D, 0x000024E2,\n    0x000024CB, 0x0000409C, 0x00050081, 0x0000000D, 0x00004735, 0x0000611F,\n    0x00006121, 0x00050085, 0x0000000D, 0x000021E2, 0x0000590C, 0x00004735,\n    0x00050085, 0x0000000D, 0x00005EE3, 0x00006120, 0x00004F44, 0x00050081,\n    0x0000000D, 0x00003A4A, 0x000021E2, 0x00005EE3, 0x00050085, 0x0000000D,\n    0x000024E3, 0x00006124, 0x00004F44, 0x00050081, 0x0000000D, 0x000046E9,\n    0x00003A4A, 0x000024E3, 0x00050085, 0x0000000D, 0x000024E4, 0x00006125,\n    0x000051F8, 0x00050081, 0x0000000D, 0x000046EA, 0x000046E9, 0x000024E4,\n    0x00050085, 0x0000000D, 0x000024E5, 0x00006129, 0x000051F8, 0x00050081,\n    0x0000000D, 0x000046EB, 0x000046EA, 0x000024E5, 0x00050085, 0x0000000D,\n    0x000024E6, 0x00006128, 0x00003135, 0x00050081, 0x0000000D, 0x000046EC,\n    0x000046EB, 0x000024E6, 0x00050085, 0x0000000D, 0x000024E7, 0x0000612A,\n    0x00003135, 0x00050081, 0x0000000D, 0x000046ED, 0x000046EC, 0x000024E7,\n    0x00050085, 0x0000000D, 0x000024E8, 0x00006122, 0x00005767, 0x00050081,\n    0x0000000D, 0x000046EE, 0x000046ED, 0x000024E8, 0x00050085, 0x0000000D,\n    0x000024E9, 0x00006123, 0x00005A1B, 0x00050081, 0x0000000D, 0x000046EF,\n    0x000046EE, 0x000024E9, 0x00050085, 0x0000000D, 0x000024EA, 0x00006126,\n    0x00001C3B, 0x00050081, 0x0000000D, 0x000046F0, 0x000046EF, 0x000024EA,\n    0x00050085, 0x0000000D, 0x000024EB, 0x00006127, 0x00001C3C, 0x00050081,\n    0x0000000D, 0x00003E65, 0x000046F0, 0x000024EB, 0x00050085, 0x0000000D,\n    0x00001FC9, 0x00003E65, 0x000024E2, 0x0008000C, 0x0000000D, 0x00003B72,\n    0x00000001, 0x0000002B, 0x00001FC9, 0x00000A0C, 0x0000008A, 0x00050081,\n    0x0000000D, 0x000031DD, 0x00003F38, 0x00003F3A, 0x00050085, 0x0000000D,\n    0x00004489, 0x0000590C, 0x000031DD, 0x00050085, 0x0000000D, 0x00005EE4,\n    0x00003F39, 0x00004F44, 0x00050081, 0x0000000D, 0x00003A4B, 0x00004489,\n    0x00005EE4, 0x00050085, 0x0000000D, 0x000024EC, 0x00003F3D, 0x00004F44,\n    0x00050081, 0x0000000D, 0x000046F1, 0x00003A4B, 0x000024EC, 0x00050085,\n    0x0000000D, 0x000024ED, 0x00003F3E, 0x000051F8, 0x00050081, 0x0000000D,\n    0x000046F2, 0x000046F1, 0x000024ED, 0x00050085, 0x0000000D, 0x000024EE,\n    0x00003F42, 0x000051F8, 0x00050081, 0x0000000D, 0x000046F3, 0x000046F2,\n    0x000024EE, 0x00050085, 0x0000000D, 0x000024EF, 0x00003F41, 0x00003135,\n    0x00050081, 0x0000000D, 0x000046F4, 0x000046F3, 0x000024EF, 0x00050085,\n    0x0000000D, 0x000024F0, 0x00003A3E, 0x00003135, 0x00050081, 0x0000000D,\n    0x000046F5, 0x000046F4, 0x000024F0, 0x00050085, 0x0000000D, 0x000024F1,\n    0x00003F3B, 0x00005767, 0x00050081, 0x0000000D, 0x000046F6, 0x000046F5,\n    0x000024F1, 0x00050085, 0x0000000D, 0x000024F2, 0x00003F3C, 0x00005A1B,\n    0x00050081, 0x0000000D, 0x000046F7, 0x000046F6, 0x000024F2, 0x00050085,\n    0x0000000D, 0x000024F3, 0x00003F3F, 0x00001C3B, 0x00050081, 0x0000000D,\n    0x000046F8, 0x000046F7, 0x000024F3, 0x00050085, 0x0000000D, 0x000024F4,\n    0x00003F40, 0x00001C3C, 0x00050081, 0x0000000D, 0x00003E66, 0x000046F8,\n    0x000024F4, 0x00050085, 0x0000000D, 0x00001FCA, 0x00003E66, 0x000024E2,\n    0x0008000C, 0x0000000D, 0x00003B73, 0x00000001, 0x0000002B, 0x00001FCA,\n    0x00000A0C, 0x0000008A, 0x00050081, 0x0000000D, 0x000031DE, 0x00002459,\n    0x0000245B, 0x00050085, 0x0000000D, 0x0000448A, 0x0000590C, 0x000031DE,\n    0x00050085, 0x0000000D, 0x00005EE5, 0x0000245A, 0x00004F44, 0x00050081,\n    0x0000000D, 0x00003A4C, 0x0000448A, 0x00005EE5, 0x00050085, 0x0000000D,\n    0x000024F5, 0x0000245E, 0x00004F44, 0x00050081, 0x0000000D, 0x000046F9,\n    0x00003A4C, 0x000024F5, 0x00050085, 0x0000000D, 0x000024F6, 0x0000245F,\n    0x000051F8, 0x00050081, 0x0000000D, 0x000046FA, 0x000046F9, 0x000024F6,\n    0x00050085, 0x0000000D, 0x000024F7, 0x00002463, 0x000051F8, 0x00050081,\n    0x0000000D, 0x000046FB, 0x000046FA, 0x000024F7, 0x00050085, 0x0000000D,\n    0x000024F8, 0x00002462, 0x00003135, 0x00050081, 0x0000000D, 0x000046FC,\n    0x000046FB, 0x000024F8, 0x00050085, 0x0000000D, 0x000024F9, 0x0000218E,\n    0x00003135, 0x00050081, 0x0000000D, 0x000046FD, 0x000046FC, 0x000024F9,\n    0x00050085, 0x0000000D, 0x000024FA, 0x0000245C, 0x00005767, 0x00050081,\n    0x0000000D, 0x000046FE, 0x000046FD, 0x000024FA, 0x00050085, 0x0000000D,\n    0x000024FB, 0x0000245D, 0x00005A1B, 0x00050081, 0x0000000D, 0x000046FF,\n    0x000046FE, 0x000024FB, 0x00050085, 0x0000000D, 0x000024FC, 0x00002460,\n    0x00001C3B, 0x00050081, 0x0000000D, 0x00004700, 0x000046FF, 0x000024FC,\n    0x00050085, 0x0000000D, 0x000024FD, 0x00002461, 0x00001C3C, 0x00050081,\n    0x0000000D, 0x00003E67, 0x00004700, 0x000024FD, 0x00050085, 0x0000000D,\n    0x00001C4C, 0x00003E67, 0x000024E2, 0x0008000C, 0x0000000D, 0x0000576C,\n    0x00000001, 0x0000002B, 0x00001C4C, 0x00000A0C, 0x0000008A, 0x00060052,\n    0x0000001D, 0x00005ECE, 0x00003B72, 0x00000002, 0x00000000, 0x00060052,\n    0x0000001D, 0x00002B42, 0x00003B73, 0x00005ECE, 0x00000001, 0x00060052,\n    0x0000001D, 0x00003A55, 0x0000576C, 0x00002B42, 0x00000002, 0x0008004F,\n    0x00000018, 0x0000329B, 0x00003A55, 0x00003A55, 0x00000000, 0x00000001,\n    0x00000002, 0x0006000C, 0x00000018, 0x00001947, 0x00000001, 0x0000001F,\n    0x0000329B, 0x00050051, 0x0000000D, 0x000058D6, 0x00001947, 0x00000000,\n    0x00060052, 0x0000001D, 0x00004D39, 0x000058D6, 0x00000002, 0x00000000,\n    0x00050051, 0x0000000D, 0x00004D8C, 0x00001947, 0x00000001, 0x00060052,\n    0x0000001D, 0x00003F07, 0x00004D8C, 0x00004D39, 0x00000001, 0x00050051,\n    0x0000000D, 0x00004D66, 0x00001947, 0x00000002, 0x00060052, 0x0000001D,\n    0x00004910, 0x00004D66, 0x00003F07, 0x00000002, 0x0008004F, 0x00000018,\n    0x00003E7D, 0x00004910, 0x00004910, 0x00000000, 0x00000001, 0x00000002,\n    0x000500C7, 0x00000011, 0x00003108, 0x000026D2, 0x0000084A, 0x00050051,\n    0x0000000B, 0x0000260D, 0x00003108, 0x00000001, 0x00050084, 0x0000000B,\n    0x000053FA, 0x0000260D, 0x00000A3A, 0x00050051, 0x0000000B, 0x00005B73,\n    0x00003108, 0x00000000, 0x00050080, 0x0000000B, 0x00003142, 0x000053FA,\n    0x00005B73, 0x0003003E, 0x000047EB, 0x000008C2, 0x00050041, 0x0000028A,\n    0x000026E6, 0x000047EB, 0x00003142, 0x0004003D, 0x0000000D, 0x00006234,\n    0x000026E6, 0x00060050, 0x00000018, 0x0000466C, 0x00006234, 0x00006234,\n    0x00006234, 0x00050081, 0x00000018, 0x000053D2, 0x00003E7D, 0x0000466C,\n    0x0008000C, 0x00000018, 0x00004C45, 0x00000001, 0x0000002B, 0x000053D2,\n    0x00000A2C, 0x00000A16, 0x00050051, 0x0000000D, 0x00004189, 0x00004C45,\n    0x00000000, 0x00050051, 0x0000000D, 0x00004CFC, 0x00004C45, 0x00000001,\n    0x00050051, 0x0000000D, 0x00001D30, 0x00004C45, 0x00000002, 0x00070050,\n    0x0000001D, 0x00005788, 0x00004189, 0x00004CFC, 0x00001D30, 0x0000008A,\n    0x0003003E, 0x000014D6, 0x00005788, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/ui/shaders/bytecode/vulkan_spirv/guest_output_ffx_cas_resample_ps.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25213\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint Fragment %main \"main\" %gl_FragCoord %xe_cas_color\n               OpExecutionMode %main OriginUpperLeft\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %gl_FragCoord \"gl_FragCoord\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_cas_output_offset\"\n               OpMemberName %push_const_block_xe 1 \"xe_cas_input_output_size_ratio\"\n               OpMemberName %push_const_block_xe 2 \"xe_cas_sharpness_post_setup\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %xe_cas_color \"xe_cas_color\"\n               OpName %xe_cas_source \"xe_cas_source\"\n               OpDecorate %gl_FragCoord BuiltIn FragCoord\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 16\n               OpMemberDecorate %push_const_block_xe 1 Offset 24\n               OpMemberDecorate %push_const_block_xe 2 Offset 32\n               OpDecorate %xe_cas_color Location 0\n               OpDecorate %xe_cas_source Binding 0\n               OpDecorate %xe_cas_source DescriptorSet 0\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n      %float = OpTypeFloat 32\n       %uint = OpTypeInt 32 0\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n    %v3float = OpTypeVector %float 3\n     %v2uint = OpTypeVector %uint 2\n     %v4uint = OpTypeVector %uint 4\n    %v4float = OpTypeVector %float 4\n%_ptr_Input_v4float = OpTypePointer Input %v4float\n%gl_FragCoord = OpVariable %_ptr_Input_v4float Input\n    %v2float = OpTypeVector %float 2\n%push_const_block_xe = OpTypeStruct %v2int %v2float %float\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n      %int_0 = OpConstant %int 0\n%_ptr_PushConstant_v2int = OpTypePointer PushConstant %v2int\n      %int_1 = OpConstant %int 1\n%_ptr_PushConstant_v2float = OpTypePointer PushConstant %v2float\n  %float_0_5 = OpConstant %float 0.5\n      %int_2 = OpConstant %int 2\n%_ptr_PushConstant_float = OpTypePointer PushConstant %float\n    %float_0 = OpConstant %float 0\n     %uint_1 = OpConstant %uint 1\n    %float_1 = OpConstant %float 1\n%_ptr_Output_v4float = OpTypePointer Output %v4float\n%xe_cas_color = OpVariable %_ptr_Output_v4float Output\n%uint_532432441 = OpConstant %uint 532432441\n%uint_2129690299 = OpConstant %uint 2129690299\n%uint_2129764351 = OpConstant %uint 2129764351\n    %float_2 = OpConstant %float 2\n        %150 = OpTypeImage %float 2D 0 0 0 1 Unknown\n%_ptr_UniformConstant_150 = OpTypePointer UniformConstant %150\n%xe_cas_source = OpVariable %_ptr_UniformConstant_150 UniformConstant\n     %int_n1 = OpConstant %int -1\n       %1803 = OpConstantComposite %v2int %int_0 %int_n1\n       %1812 = OpConstantComposite %v2int %int_1 %int_n1\n       %1806 = OpConstantComposite %v2int %int_n1 %int_0\n       %1824 = OpConstantComposite %v2int %int_1 %int_0\n       %1818 = OpConstantComposite %v2int %int_n1 %int_1\n       %1827 = OpConstantComposite %v2int %int_0 %int_1\n       %1836 = OpConstantComposite %v2int %int_1 %int_1\n       %1833 = OpConstantComposite %v2int %int_2 %int_0\n       %1839 = OpConstantComposite %v2int %int_0 %int_2\n       %1845 = OpConstantComposite %v2int %int_2 %int_1\n       %1848 = OpConstantComposite %v2int %int_1 %int_2\n%float_0_03125 = OpConstant %float 0.03125\n       %1566 = OpConstantComposite %v2float %float_0_5 %float_0_5\n          %2 = OpUndef %v4float\n       %main = OpFunction %void None %1282\n      %24949 = OpLabel\n      %18571 = OpLoad %v4float %gl_FragCoord\n      %14008 = OpVectorShuffle %v2float %18571 %18571 0 1\n      %17656 = OpConvertFToS %v2int %14008\n      %19279 = OpAccessChain %_ptr_PushConstant_v2int %push_consts_xe %int_0\n      %22822 = OpLoad %v2int %19279\n      %23312 = OpISub %v2int %17656 %22822\n       %9938 = OpBitcast %v2uint %23312\n      %20997 = OpAccessChain %_ptr_PushConstant_v2float %push_consts_xe %int_1\n      %22579 = OpLoad %v2float %20997\n      %13397 = OpBitcast %v2uint %22579\n      %12762 = OpVectorTimesScalar %v2float %22579 %float_0_5\n      %24595 = OpFSub %v2float %12762 %1566\n      %17743 = OpBitcast %v2uint %24595\n      %16707 = OpCompositeExtract %uint %13397 0\n      %13283 = OpCompositeExtract %uint %13397 1\n       %7641 = OpCompositeExtract %uint %17743 0\n       %7529 = OpCompositeExtract %uint %17743 1\n      %18241 = OpCompositeConstruct %v4uint %16707 %13283 %7641 %7529\n       %9777 = OpAccessChain %_ptr_PushConstant_float %push_consts_xe %int_2\n      %18808 = OpLoad %float %9777\n      %17599 = OpBitcast %uint %18808\n      %19625 = OpConvertUToF %v2float %9938\n       %8442 = OpVectorShuffle %v2uint %18241 %18241 0 1\n      %11576 = OpBitcast %v2float %8442\n      %20814 = OpFMul %v2float %19625 %11576\n       %8994 = OpVectorShuffle %v2uint %18241 %18241 2 3\n      %11797 = OpBitcast %v2float %8994\n      %20069 = OpFAdd %v2float %20814 %11797\n      %12719 = OpExtInst %v2float %1 Floor %20069\n      %16290 = OpFSub %v2float %20069 %12719\n      %17064 = OpConvertFToS %v2int %12719\n      %20568 = OpIAdd %v2int %17064 %1803\n      %18223 = OpLoad %150 %xe_cas_source\n      %19459 = OpImageFetch %v4float %18223 %20568 Lod %int_0\n      %13347 = OpIAdd %v2int %17064 %1806\n      %14538 = OpLoad %150 %xe_cas_source\n      %12625 = OpImageFetch %v4float %14538 %13347 Lod %int_0\n      %10421 = OpLoad %150 %xe_cas_source\n      %15444 = OpImageFetch %v4float %10421 %17064 Lod %int_0\n      %13348 = OpIAdd %v2int %17064 %1812\n      %15811 = OpLoad %150 %xe_cas_source\n      %19460 = OpImageFetch %v4float %15811 %13348 Lod %int_0\n      %13349 = OpIAdd %v2int %17064 %1824\n      %15812 = OpLoad %150 %xe_cas_source\n      %19461 = OpImageFetch %v4float %15812 %13349 Lod %int_0\n      %13350 = OpIAdd %v2int %17064 %1833\n      %15813 = OpLoad %150 %xe_cas_source\n      %19462 = OpImageFetch %v4float %15813 %13350 Lod %int_0\n      %13351 = OpIAdd %v2int %17064 %1818\n      %15814 = OpLoad %150 %xe_cas_source\n      %19463 = OpImageFetch %v4float %15814 %13351 Lod %int_0\n      %13352 = OpIAdd %v2int %17064 %1827\n      %15815 = OpLoad %150 %xe_cas_source\n      %19464 = OpImageFetch %v4float %15815 %13352 Lod %int_0\n      %13353 = OpIAdd %v2int %17064 %1839\n      %15816 = OpLoad %150 %xe_cas_source\n      %19465 = OpImageFetch %v4float %15816 %13353 Lod %int_0\n      %13354 = OpIAdd %v2int %17064 %1836\n      %15817 = OpLoad %150 %xe_cas_source\n      %19466 = OpImageFetch %v4float %15817 %13354 Lod %int_0\n      %13355 = OpIAdd %v2int %17064 %1845\n      %15818 = OpLoad %150 %xe_cas_source\n      %19467 = OpImageFetch %v4float %15818 %13355 Lod %int_0\n      %13356 = OpIAdd %v2int %17064 %1848\n      %14918 = OpLoad %150 %xe_cas_source\n       %8899 = OpImageFetch %v4float %14918 %13356 Lod %int_0\n      %19729 = OpCompositeExtract %float %19459 0\n       %7025 = OpCompositeExtract %float %19459 1\n      %18723 = OpCompositeExtract %float %19459 2\n      %24863 = OpFMul %float %19729 %19729\n      %16184 = OpFMul %float %7025 %7025\n       %9305 = OpFMul %float %18723 %18723\n      %22236 = OpCompositeExtract %float %19460 0\n      %11844 = OpCompositeExtract %float %19460 1\n      %18724 = OpCompositeExtract %float %19460 2\n      %24864 = OpFMul %float %22236 %22236\n      %16185 = OpFMul %float %11844 %11844\n       %9306 = OpFMul %float %18724 %18724\n      %22237 = OpCompositeExtract %float %12625 0\n      %11845 = OpCompositeExtract %float %12625 1\n      %18725 = OpCompositeExtract %float %12625 2\n      %24865 = OpFMul %float %22237 %22237\n      %16186 = OpFMul %float %11845 %11845\n       %9307 = OpFMul %float %18725 %18725\n      %22238 = OpCompositeExtract %float %15444 0\n      %11846 = OpCompositeExtract %float %15444 1\n      %18726 = OpCompositeExtract %float %15444 2\n      %24866 = OpFMul %float %22238 %22238\n      %16187 = OpFMul %float %11846 %11846\n       %9308 = OpFMul %float %18726 %18726\n      %22239 = OpCompositeExtract %float %19461 0\n      %11847 = OpCompositeExtract %float %19461 1\n      %18727 = OpCompositeExtract %float %19461 2\n      %24867 = OpFMul %float %22239 %22239\n      %16188 = OpFMul %float %11847 %11847\n       %9309 = OpFMul %float %18727 %18727\n      %22240 = OpCompositeExtract %float %19462 0\n      %11848 = OpCompositeExtract %float %19462 1\n      %18728 = OpCompositeExtract %float %19462 2\n      %24868 = OpFMul %float %22240 %22240\n      %16189 = OpFMul %float %11848 %11848\n       %9310 = OpFMul %float %18728 %18728\n      %22241 = OpCompositeExtract %float %19463 0\n      %11849 = OpCompositeExtract %float %19463 1\n      %18729 = OpCompositeExtract %float %19463 2\n      %24869 = OpFMul %float %22241 %22241\n      %16190 = OpFMul %float %11849 %11849\n       %9311 = OpFMul %float %18729 %18729\n      %22242 = OpCompositeExtract %float %19464 0\n      %11850 = OpCompositeExtract %float %19464 1\n      %18730 = OpCompositeExtract %float %19464 2\n      %24870 = OpFMul %float %22242 %22242\n      %16191 = OpFMul %float %11850 %11850\n       %9312 = OpFMul %float %18730 %18730\n      %22243 = OpCompositeExtract %float %19466 0\n      %11851 = OpCompositeExtract %float %19466 1\n      %18731 = OpCompositeExtract %float %19466 2\n      %24871 = OpFMul %float %22243 %22243\n      %16192 = OpFMul %float %11851 %11851\n       %9313 = OpFMul %float %18731 %18731\n      %22244 = OpCompositeExtract %float %19467 0\n      %11852 = OpCompositeExtract %float %19467 1\n      %18732 = OpCompositeExtract %float %19467 2\n      %24872 = OpFMul %float %22244 %22244\n      %16193 = OpFMul %float %11852 %11852\n       %9314 = OpFMul %float %18732 %18732\n      %22245 = OpCompositeExtract %float %19465 0\n      %11853 = OpCompositeExtract %float %19465 1\n      %18733 = OpCompositeExtract %float %19465 2\n      %24873 = OpFMul %float %22245 %22245\n      %16194 = OpFMul %float %11853 %11853\n       %9315 = OpFMul %float %18733 %18733\n      %22246 = OpCompositeExtract %float %8899 0\n      %11854 = OpCompositeExtract %float %8899 1\n      %18734 = OpCompositeExtract %float %8899 2\n      %24874 = OpFMul %float %22246 %22246\n      %14910 = OpFMul %float %11854 %11854\n       %8590 = OpFMul %float %18734 %18734\n      %10877 = OpExtInst %float %1 FMin %16186 %16187\n       %9276 = OpExtInst %float %1 FMin %16184 %10877\n      %15951 = OpExtInst %float %1 FMin %16188 %16191\n      %10905 = OpExtInst %float %1 FMin %9276 %15951\n      %24296 = OpExtInst %float %1 FMax %16186 %16187\n      %17523 = OpExtInst %float %1 FMax %16184 %24296\n      %21848 = OpExtInst %float %1 FMax %16188 %16191\n       %7823 = OpExtInst %float %1 FMax %17523 %21848\n      %13503 = OpExtInst %float %1 FMin %16187 %16188\n      %13819 = OpExtInst %float %1 FMin %16185 %13503\n      %15952 = OpExtInst %float %1 FMin %16189 %16192\n      %10906 = OpExtInst %float %1 FMin %13819 %15952\n      %24297 = OpExtInst %float %1 FMax %16187 %16188\n      %17524 = OpExtInst %float %1 FMax %16185 %24297\n      %21849 = OpExtInst %float %1 FMax %16189 %16192\n       %7824 = OpExtInst %float %1 FMax %17524 %21849\n      %13504 = OpExtInst %float %1 FMin %16190 %16191\n      %13820 = OpExtInst %float %1 FMin %16187 %13504\n      %15953 = OpExtInst %float %1 FMin %16192 %16194\n      %10907 = OpExtInst %float %1 FMin %13820 %15953\n      %24298 = OpExtInst %float %1 FMax %16190 %16191\n      %17525 = OpExtInst %float %1 FMax %16187 %24298\n      %21850 = OpExtInst %float %1 FMax %16192 %16194\n       %7825 = OpExtInst %float %1 FMax %17525 %21850\n      %13505 = OpExtInst %float %1 FMin %16191 %16192\n      %13821 = OpExtInst %float %1 FMin %16188 %13505\n      %15954 = OpExtInst %float %1 FMin %16193 %14910\n      %10908 = OpExtInst %float %1 FMin %13821 %15954\n      %24299 = OpExtInst %float %1 FMax %16191 %16192\n      %17526 = OpExtInst %float %1 FMax %16188 %24299\n      %23939 = OpExtInst %float %1 FMax %16193 %14910\n      %21101 = OpExtInst %float %1 FMax %17526 %23939\n       %8181 = OpBitcast %uint %7823\n       %8818 = OpISub %uint %uint_2129690299 %8181\n       %9881 = OpBitcast %float %8818\n      %15062 = OpBitcast %uint %7824\n       %6702 = OpISub %uint %uint_2129690299 %15062\n       %9882 = OpBitcast %float %6702\n      %15063 = OpBitcast %uint %7825\n       %6703 = OpISub %uint %uint_2129690299 %15063\n       %9883 = OpBitcast %float %6703\n      %15064 = OpBitcast %uint %21101\n       %6835 = OpISub %uint %uint_2129690299 %15064\n       %6465 = OpBitcast %float %6835\n      %24131 = OpFSub %float %float_1 %7823\n      %23324 = OpExtInst %float %1 FMin %10905 %24131\n      %23036 = OpFMul %float %23324 %9881\n      %16051 = OpExtInst %float %1 FClamp %23036 %float_0 %float_1\n      %25005 = OpFSub %float %float_1 %7824\n      %10697 = OpExtInst %float %1 FMin %10906 %25005\n      %23037 = OpFMul %float %10697 %9882\n      %16052 = OpExtInst %float %1 FClamp %23037 %float_0 %float_1\n      %25006 = OpFSub %float %float_1 %7825\n      %10698 = OpExtInst %float %1 FMin %10907 %25006\n      %23038 = OpFMul %float %10698 %9883\n      %16053 = OpExtInst %float %1 FClamp %23038 %float_0 %float_1\n      %25007 = OpFSub %float %float_1 %21101\n      %10699 = OpExtInst %float %1 FMin %10908 %25007\n      %22903 = OpFMul %float %10699 %6465\n      %20683 = OpExtInst %float %1 FClamp %22903 %float_0 %float_1\n      %24011 = OpBitcast %uint %16051\n      %22090 = OpShiftRightLogical %uint %24011 %uint_1\n      %23229 = OpIAdd %uint %22090 %uint_532432441\n      %22851 = OpBitcast %float %23229\n       %8910 = OpBitcast %uint %16052\n       %9189 = OpShiftRightLogical %uint %8910 %uint_1\n      %23230 = OpIAdd %uint %9189 %uint_532432441\n      %22852 = OpBitcast %float %23230\n       %8911 = OpBitcast %uint %16053\n       %9190 = OpShiftRightLogical %uint %8911 %uint_1\n      %23231 = OpIAdd %uint %9190 %uint_532432441\n      %22853 = OpBitcast %float %23231\n       %8912 = OpBitcast %uint %20683\n       %9191 = OpShiftRightLogical %uint %8912 %uint_1\n      %23232 = OpIAdd %uint %9191 %uint_532432441\n      %21692 = OpBitcast %float %23232\n      %19558 = OpBitcast %float %17599\n      %18879 = OpFMul %float %22851 %19558\n      %22795 = OpFMul %float %22852 %19558\n      %19380 = OpFMul %float %22853 %19558\n      %10255 = OpFMul %float %21692 %19558\n      %13586 = OpCompositeExtract %float %16290 0\n      %21718 = OpFSub %float %float_1 %13586\n      %11876 = OpCompositeExtract %float %16290 1\n      %11147 = OpFSub %float %float_1 %11876\n      %17670 = OpFMul %float %21718 %11147\n      %25212 = OpFMul %float %13586 %11147\n      %20330 = OpFMul %float %21718 %11876\n      %20638 = OpFMul %float %13586 %11876\n      %18204 = OpFSub %float %7823 %10905\n      %23453 = OpFAdd %float %float_0_03125 %18204\n      %11395 = OpBitcast %uint %23453\n       %7677 = OpISub %uint %uint_2129690299 %11395\n       %8343 = OpBitcast %float %7677\n      %17531 = OpFMul %float %17670 %8343\n      %20631 = OpFSub %float %7824 %10906\n      %23454 = OpFAdd %float %float_0_03125 %20631\n      %11396 = OpBitcast %uint %23454\n       %7678 = OpISub %uint %uint_2129690299 %11396\n       %8344 = OpBitcast %float %7678\n      %17532 = OpFMul %float %25212 %8344\n      %20632 = OpFSub %float %7825 %10907\n      %23455 = OpFAdd %float %float_0_03125 %20632\n      %11397 = OpBitcast %uint %23455\n       %7679 = OpISub %uint %uint_2129690299 %11397\n       %8345 = OpBitcast %float %7679\n      %17533 = OpFMul %float %20330 %8345\n      %20633 = OpFSub %float %21101 %10908\n      %23456 = OpFAdd %float %float_0_03125 %20633\n      %11398 = OpBitcast %uint %23456\n       %7680 = OpISub %uint %uint_2129690299 %11398\n       %8381 = OpBitcast %float %7680\n      %17261 = OpFMul %float %20638 %8381\n      %22796 = OpFMul %float %18879 %17531\n      %20292 = OpFMul %float %22795 %17532\n      %20984 = OpFMul %float %19380 %17533\n      %15690 = OpFAdd %float %20292 %20984\n      %22375 = OpFAdd %float %15690 %17531\n      %12597 = OpFMul %float %10255 %17261\n      %18845 = OpFAdd %float %22796 %12597\n      %23067 = OpFAdd %float %18845 %17532\n       %7227 = OpFAdd %float %18845 %17533\n       %7228 = OpFAdd %float %15690 %17261\n       %7229 = OpFAdd %float %22796 %20292\n       %7303 = OpFAdd %float %7229 %20984\n       %6535 = OpFAdd %float %7303 %12597\n      %12598 = OpFMul %float %float_2 %6535\n      %18846 = OpFAdd %float %12598 %22375\n      %23068 = OpFAdd %float %18846 %23067\n       %7132 = OpFAdd %float %23068 %7227\n       %8111 = OpFAdd %float %7132 %7228\n       %9782 = OpBitcast %uint %8111\n       %7563 = OpISub %uint %uint_2129764351 %9782\n       %9419 = OpBitcast %float %7563\n       %9130 = OpFNegate %float %9419\n      %12367 = OpFMul %float %9130 %8111\n      %16540 = OpFAdd %float %12367 %float_2\n       %9442 = OpFMul %float %9419 %16540\n      %18229 = OpFAdd %float %24863 %24865\n       %8674 = OpFMul %float %22796 %18229\n      %24291 = OpFMul %float %24864 %20292\n      %14922 = OpFAdd %float %8674 %24291\n       %9443 = OpFMul %float %24868 %20292\n      %18153 = OpFAdd %float %14922 %9443\n       %9444 = OpFMul %float %24869 %20984\n      %18154 = OpFAdd %float %18153 %9444\n       %9445 = OpFMul %float %24873 %20984\n      %18155 = OpFAdd %float %18154 %9445\n       %9446 = OpFMul %float %24872 %12597\n      %18156 = OpFAdd %float %18155 %9446\n       %9447 = OpFMul %float %24874 %12597\n      %18157 = OpFAdd %float %18156 %9447\n       %9448 = OpFMul %float %24866 %22375\n      %18158 = OpFAdd %float %18157 %9448\n       %9449 = OpFMul %float %24867 %23067\n      %18159 = OpFAdd %float %18158 %9449\n       %9450 = OpFMul %float %24870 %7227\n      %18160 = OpFAdd %float %18159 %9450\n       %9451 = OpFMul %float %24871 %7228\n      %15973 = OpFAdd %float %18160 %9451\n       %8137 = OpFMul %float %15973 %9442\n      %15218 = OpExtInst %float %1 FClamp %8137 %float_0 %float_1\n      %12765 = OpFAdd %float %16184 %16186\n      %17545 = OpFMul %float %22796 %12765\n      %24292 = OpFMul %float %16185 %20292\n      %14923 = OpFAdd %float %17545 %24292\n       %9452 = OpFMul %float %16189 %20292\n      %18161 = OpFAdd %float %14923 %9452\n       %9453 = OpFMul %float %16190 %20984\n      %18162 = OpFAdd %float %18161 %9453\n       %9454 = OpFMul %float %16194 %20984\n      %18163 = OpFAdd %float %18162 %9454\n       %9455 = OpFMul %float %16193 %12597\n      %18164 = OpFAdd %float %18163 %9455\n       %9456 = OpFMul %float %14910 %12597\n      %18165 = OpFAdd %float %18164 %9456\n       %9457 = OpFMul %float %16187 %22375\n      %18166 = OpFAdd %float %18165 %9457\n       %9458 = OpFMul %float %16188 %23067\n      %18167 = OpFAdd %float %18166 %9458\n       %9459 = OpFMul %float %16191 %7227\n      %18168 = OpFAdd %float %18167 %9459\n       %9460 = OpFMul %float %16192 %7228\n      %15974 = OpFAdd %float %18168 %9460\n       %8138 = OpFMul %float %15974 %9442\n      %15219 = OpExtInst %float %1 FClamp %8138 %float_0 %float_1\n      %12766 = OpFAdd %float %9305 %9307\n      %17546 = OpFMul %float %22796 %12766\n      %24293 = OpFMul %float %9306 %20292\n      %14924 = OpFAdd %float %17546 %24293\n       %9461 = OpFMul %float %9310 %20292\n      %18169 = OpFAdd %float %14924 %9461\n       %9462 = OpFMul %float %9311 %20984\n      %18170 = OpFAdd %float %18169 %9462\n       %9463 = OpFMul %float %9315 %20984\n      %18171 = OpFAdd %float %18170 %9463\n       %9464 = OpFMul %float %9314 %12597\n      %18172 = OpFAdd %float %18171 %9464\n       %9465 = OpFMul %float %8590 %12597\n      %18173 = OpFAdd %float %18172 %9465\n       %9466 = OpFMul %float %9308 %22375\n      %18174 = OpFAdd %float %18173 %9466\n       %9467 = OpFMul %float %9309 %23067\n      %18175 = OpFAdd %float %18174 %9467\n       %9468 = OpFMul %float %9312 %7227\n      %18176 = OpFAdd %float %18175 %9468\n       %9469 = OpFMul %float %9313 %7228\n      %15975 = OpFAdd %float %18176 %9469\n       %7244 = OpFMul %float %15975 %9442\n      %22380 = OpExtInst %float %1 FClamp %7244 %float_0 %float_1\n      %24270 = OpCompositeInsert %v4float %15218 %2 0\n      %11074 = OpCompositeInsert %v4float %15219 %24270 1\n      %14933 = OpCompositeInsert %v4float %22380 %11074 2\n      %12955 = OpVectorShuffle %v3float %14933 %14933 0 1 2\n       %6452 = OpExtInst %v3float %1 Sqrt %12955\n      %22915 = OpCompositeExtract %float %6452 0\n       %8853 = OpCompositeExtract %float %6452 1\n       %7472 = OpCompositeExtract %float %6452 2\n      %22408 = OpCompositeConstruct %v4float %22915 %8853 %7472 %float_1\n               OpStore %xe_cas_color %22408\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t guest_output_ffx_cas_resample_ps[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x0000627D, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0007000F, 0x00000004,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000C93, 0x000014D6, 0x00030010,\n    0x0000161F, 0x00000007, 0x00030003, 0x00000002, 0x000001CC, 0x00090004,\n    0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F, 0x5F776F6C, 0x72747461,\n    0x74756269, 0x00007365, 0x000B0004, 0x455F4C47, 0x735F5458, 0x6C706D61,\n    0x656C7265, 0x745F7373, 0x75747865, 0x665F6572, 0x74636E75, 0x736E6F69,\n    0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F, 0x70635F45, 0x74735F70,\n    0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365, 0x00006576, 0x00080004,\n    0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63, 0x69645F65, 0x74636572,\n    0x00657669, 0x00040005, 0x0000161F, 0x6E69616D, 0x00000000, 0x00060005,\n    0x00000C93, 0x465F6C67, 0x43676172, 0x64726F6F, 0x00000000, 0x00070005,\n    0x00000418, 0x68737570, 0x6E6F635F, 0x625F7473, 0x6B636F6C, 0x0065785F,\n    0x00090006, 0x00000418, 0x00000000, 0x635F6578, 0x6F5F7361, 0x75707475,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000B0006, 0x00000418, 0x00000001,\n    0x635F6578, 0x695F7361, 0x7475706E, 0x74756F5F, 0x5F747570, 0x657A6973,\n    0x7461725F, 0x00006F69, 0x000A0006, 0x00000418, 0x00000002, 0x635F6578,\n    0x735F7361, 0x70726168, 0x7373656E, 0x736F705F, 0x65735F74, 0x00707574,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00060005, 0x000014D6, 0x635F6578, 0x635F7361, 0x726F6C6F, 0x00000000,\n    0x00060005, 0x0000142B, 0x635F6578, 0x735F7361, 0x6372756F, 0x00000065,\n    0x00040047, 0x00000C93, 0x0000000B, 0x0000000F, 0x00030047, 0x00000418,\n    0x00000002, 0x00050048, 0x00000418, 0x00000000, 0x00000023, 0x00000010,\n    0x00050048, 0x00000418, 0x00000001, 0x00000023, 0x00000018, 0x00050048,\n    0x00000418, 0x00000002, 0x00000023, 0x00000020, 0x00040047, 0x000014D6,\n    0x0000001E, 0x00000000, 0x00040047, 0x0000142B, 0x00000021, 0x00000000,\n    0x00040047, 0x0000142B, 0x00000022, 0x00000000, 0x00020013, 0x00000008,\n    0x00030021, 0x00000502, 0x00000008, 0x00030016, 0x0000000D, 0x00000020,\n    0x00040015, 0x0000000B, 0x00000020, 0x00000000, 0x00040015, 0x0000000C,\n    0x00000020, 0x00000001, 0x00040017, 0x00000012, 0x0000000C, 0x00000002,\n    0x00040017, 0x00000018, 0x0000000D, 0x00000003, 0x00040017, 0x00000011,\n    0x0000000B, 0x00000002, 0x00040017, 0x00000017, 0x0000000B, 0x00000004,\n    0x00040017, 0x0000001D, 0x0000000D, 0x00000004, 0x00040020, 0x0000029A,\n    0x00000001, 0x0000001D, 0x0004003B, 0x0000029A, 0x00000C93, 0x00000001,\n    0x00040017, 0x00000013, 0x0000000D, 0x00000002, 0x0005001E, 0x00000418,\n    0x00000012, 0x00000013, 0x0000000D, 0x00040020, 0x00000695, 0x00000009,\n    0x00000418, 0x0004003B, 0x00000695, 0x00000CE9, 0x00000009, 0x0004002B,\n    0x0000000C, 0x00000A0B, 0x00000000, 0x00040020, 0x0000028F, 0x00000009,\n    0x00000012, 0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001, 0x00040020,\n    0x00000290, 0x00000009, 0x00000013, 0x0004002B, 0x0000000D, 0x000000FC,\n    0x3F000000, 0x0004002B, 0x0000000C, 0x00000A11, 0x00000002, 0x00040020,\n    0x0000028A, 0x00000009, 0x0000000D, 0x0004002B, 0x0000000D, 0x00000A0C,\n    0x00000000, 0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001, 0x0004002B,\n    0x0000000D, 0x0000008A, 0x3F800000, 0x00040020, 0x0000029B, 0x00000003,\n    0x0000001D, 0x0004003B, 0x0000029B, 0x000014D6, 0x00000003, 0x0004002B,\n    0x0000000B, 0x0000020D, 0x1FBC4639, 0x0004002B, 0x0000000B, 0x00000344,\n    0x7EF07EBB, 0x0004002B, 0x0000000B, 0x000000B2, 0x7EF19FFF, 0x0004002B,\n    0x0000000D, 0x00000019, 0x40000000, 0x00090019, 0x00000096, 0x0000000D,\n    0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000,\n    0x00040020, 0x00000313, 0x00000000, 0x00000096, 0x0004003B, 0x00000313,\n    0x0000142B, 0x00000000, 0x0004002B, 0x0000000C, 0x00000A08, 0xFFFFFFFF,\n    0x0005002C, 0x00000012, 0x0000070B, 0x00000A0B, 0x00000A08, 0x0005002C,\n    0x00000012, 0x00000714, 0x00000A0E, 0x00000A08, 0x0005002C, 0x00000012,\n    0x0000070E, 0x00000A08, 0x00000A0B, 0x0005002C, 0x00000012, 0x00000720,\n    0x00000A0E, 0x00000A0B, 0x0005002C, 0x00000012, 0x0000071A, 0x00000A08,\n    0x00000A0E, 0x0005002C, 0x00000012, 0x00000723, 0x00000A0B, 0x00000A0E,\n    0x0005002C, 0x00000012, 0x0000072C, 0x00000A0E, 0x00000A0E, 0x0005002C,\n    0x00000012, 0x00000729, 0x00000A11, 0x00000A0B, 0x0005002C, 0x00000012,\n    0x0000072F, 0x00000A0B, 0x00000A11, 0x0005002C, 0x00000012, 0x00000735,\n    0x00000A11, 0x00000A0E, 0x0005002C, 0x00000012, 0x00000738, 0x00000A0E,\n    0x00000A11, 0x0004002B, 0x0000000D, 0x000002C4, 0x3D000000, 0x0005002C,\n    0x00000013, 0x0000061E, 0x000000FC, 0x000000FC, 0x00030001, 0x0000001D,\n    0x00000002, 0x00050036, 0x00000008, 0x0000161F, 0x00000000, 0x00000502,\n    0x000200F8, 0x00006175, 0x0004003D, 0x0000001D, 0x0000488B, 0x00000C93,\n    0x0007004F, 0x00000013, 0x000036B8, 0x0000488B, 0x0000488B, 0x00000000,\n    0x00000001, 0x0004006E, 0x00000012, 0x000044F8, 0x000036B8, 0x00050041,\n    0x0000028F, 0x00004B4F, 0x00000CE9, 0x00000A0B, 0x0004003D, 0x00000012,\n    0x00005926, 0x00004B4F, 0x00050082, 0x00000012, 0x00005B10, 0x000044F8,\n    0x00005926, 0x0004007C, 0x00000011, 0x000026D2, 0x00005B10, 0x00050041,\n    0x00000290, 0x00005205, 0x00000CE9, 0x00000A0E, 0x0004003D, 0x00000013,\n    0x00005833, 0x00005205, 0x0004007C, 0x00000011, 0x00003455, 0x00005833,\n    0x0005008E, 0x00000013, 0x000031DA, 0x00005833, 0x000000FC, 0x00050083,\n    0x00000013, 0x00006013, 0x000031DA, 0x0000061E, 0x0004007C, 0x00000011,\n    0x0000454F, 0x00006013, 0x00050051, 0x0000000B, 0x00004143, 0x00003455,\n    0x00000000, 0x00050051, 0x0000000B, 0x000033E3, 0x00003455, 0x00000001,\n    0x00050051, 0x0000000B, 0x00001DD9, 0x0000454F, 0x00000000, 0x00050051,\n    0x0000000B, 0x00001D69, 0x0000454F, 0x00000001, 0x00070050, 0x00000017,\n    0x00004741, 0x00004143, 0x000033E3, 0x00001DD9, 0x00001D69, 0x00050041,\n    0x0000028A, 0x00002631, 0x00000CE9, 0x00000A11, 0x0004003D, 0x0000000D,\n    0x00004978, 0x00002631, 0x0004007C, 0x0000000B, 0x000044BF, 0x00004978,\n    0x00040070, 0x00000013, 0x00004CA9, 0x000026D2, 0x0007004F, 0x00000011,\n    0x000020FA, 0x00004741, 0x00004741, 0x00000000, 0x00000001, 0x0004007C,\n    0x00000013, 0x00002D38, 0x000020FA, 0x00050085, 0x00000013, 0x0000514E,\n    0x00004CA9, 0x00002D38, 0x0007004F, 0x00000011, 0x00002322, 0x00004741,\n    0x00004741, 0x00000002, 0x00000003, 0x0004007C, 0x00000013, 0x00002E15,\n    0x00002322, 0x00050081, 0x00000013, 0x00004E65, 0x0000514E, 0x00002E15,\n    0x0006000C, 0x00000013, 0x000031AF, 0x00000001, 0x00000008, 0x00004E65,\n    0x00050083, 0x00000013, 0x00003FA2, 0x00004E65, 0x000031AF, 0x0004006E,\n    0x00000012, 0x000042A8, 0x000031AF, 0x00050080, 0x00000012, 0x00005058,\n    0x000042A8, 0x0000070B, 0x0004003D, 0x00000096, 0x0000472F, 0x0000142B,\n    0x0007005F, 0x0000001D, 0x00004C03, 0x0000472F, 0x00005058, 0x00000002,\n    0x00000A0B, 0x00050080, 0x00000012, 0x00003423, 0x000042A8, 0x0000070E,\n    0x0004003D, 0x00000096, 0x000038CA, 0x0000142B, 0x0007005F, 0x0000001D,\n    0x00003151, 0x000038CA, 0x00003423, 0x00000002, 0x00000A0B, 0x0004003D,\n    0x00000096, 0x000028B5, 0x0000142B, 0x0007005F, 0x0000001D, 0x00003C54,\n    0x000028B5, 0x000042A8, 0x00000002, 0x00000A0B, 0x00050080, 0x00000012,\n    0x00003424, 0x000042A8, 0x00000714, 0x0004003D, 0x00000096, 0x00003DC3,\n    0x0000142B, 0x0007005F, 0x0000001D, 0x00004C04, 0x00003DC3, 0x00003424,\n    0x00000002, 0x00000A0B, 0x00050080, 0x00000012, 0x00003425, 0x000042A8,\n    0x00000720, 0x0004003D, 0x00000096, 0x00003DC4, 0x0000142B, 0x0007005F,\n    0x0000001D, 0x00004C05, 0x00003DC4, 0x00003425, 0x00000002, 0x00000A0B,\n    0x00050080, 0x00000012, 0x00003426, 0x000042A8, 0x00000729, 0x0004003D,\n    0x00000096, 0x00003DC5, 0x0000142B, 0x0007005F, 0x0000001D, 0x00004C06,\n    0x00003DC5, 0x00003426, 0x00000002, 0x00000A0B, 0x00050080, 0x00000012,\n    0x00003427, 0x000042A8, 0x0000071A, 0x0004003D, 0x00000096, 0x00003DC6,\n    0x0000142B, 0x0007005F, 0x0000001D, 0x00004C07, 0x00003DC6, 0x00003427,\n    0x00000002, 0x00000A0B, 0x00050080, 0x00000012, 0x00003428, 0x000042A8,\n    0x00000723, 0x0004003D, 0x00000096, 0x00003DC7, 0x0000142B, 0x0007005F,\n    0x0000001D, 0x00004C08, 0x00003DC7, 0x00003428, 0x00000002, 0x00000A0B,\n    0x00050080, 0x00000012, 0x00003429, 0x000042A8, 0x0000072F, 0x0004003D,\n    0x00000096, 0x00003DC8, 0x0000142B, 0x0007005F, 0x0000001D, 0x00004C09,\n    0x00003DC8, 0x00003429, 0x00000002, 0x00000A0B, 0x00050080, 0x00000012,\n    0x0000342A, 0x000042A8, 0x0000072C, 0x0004003D, 0x00000096, 0x00003DC9,\n    0x0000142B, 0x0007005F, 0x0000001D, 0x00004C0A, 0x00003DC9, 0x0000342A,\n    0x00000002, 0x00000A0B, 0x00050080, 0x00000012, 0x0000342B, 0x000042A8,\n    0x00000735, 0x0004003D, 0x00000096, 0x00003DCA, 0x0000142B, 0x0007005F,\n    0x0000001D, 0x00004C0B, 0x00003DCA, 0x0000342B, 0x00000002, 0x00000A0B,\n    0x00050080, 0x00000012, 0x0000342C, 0x000042A8, 0x00000738, 0x0004003D,\n    0x00000096, 0x00003A46, 0x0000142B, 0x0007005F, 0x0000001D, 0x000022C3,\n    0x00003A46, 0x0000342C, 0x00000002, 0x00000A0B, 0x00050051, 0x0000000D,\n    0x00004D11, 0x00004C03, 0x00000000, 0x00050051, 0x0000000D, 0x00001B71,\n    0x00004C03, 0x00000001, 0x00050051, 0x0000000D, 0x00004923, 0x00004C03,\n    0x00000002, 0x00050085, 0x0000000D, 0x0000611F, 0x00004D11, 0x00004D11,\n    0x00050085, 0x0000000D, 0x00003F38, 0x00001B71, 0x00001B71, 0x00050085,\n    0x0000000D, 0x00002459, 0x00004923, 0x00004923, 0x00050051, 0x0000000D,\n    0x000056DC, 0x00004C04, 0x00000000, 0x00050051, 0x0000000D, 0x00002E44,\n    0x00004C04, 0x00000001, 0x00050051, 0x0000000D, 0x00004924, 0x00004C04,\n    0x00000002, 0x00050085, 0x0000000D, 0x00006120, 0x000056DC, 0x000056DC,\n    0x00050085, 0x0000000D, 0x00003F39, 0x00002E44, 0x00002E44, 0x00050085,\n    0x0000000D, 0x0000245A, 0x00004924, 0x00004924, 0x00050051, 0x0000000D,\n    0x000056DD, 0x00003151, 0x00000000, 0x00050051, 0x0000000D, 0x00002E45,\n    0x00003151, 0x00000001, 0x00050051, 0x0000000D, 0x00004925, 0x00003151,\n    0x00000002, 0x00050085, 0x0000000D, 0x00006121, 0x000056DD, 0x000056DD,\n    0x00050085, 0x0000000D, 0x00003F3A, 0x00002E45, 0x00002E45, 0x00050085,\n    0x0000000D, 0x0000245B, 0x00004925, 0x00004925, 0x00050051, 0x0000000D,\n    0x000056DE, 0x00003C54, 0x00000000, 0x00050051, 0x0000000D, 0x00002E46,\n    0x00003C54, 0x00000001, 0x00050051, 0x0000000D, 0x00004926, 0x00003C54,\n    0x00000002, 0x00050085, 0x0000000D, 0x00006122, 0x000056DE, 0x000056DE,\n    0x00050085, 0x0000000D, 0x00003F3B, 0x00002E46, 0x00002E46, 0x00050085,\n    0x0000000D, 0x0000245C, 0x00004926, 0x00004926, 0x00050051, 0x0000000D,\n    0x000056DF, 0x00004C05, 0x00000000, 0x00050051, 0x0000000D, 0x00002E47,\n    0x00004C05, 0x00000001, 0x00050051, 0x0000000D, 0x00004927, 0x00004C05,\n    0x00000002, 0x00050085, 0x0000000D, 0x00006123, 0x000056DF, 0x000056DF,\n    0x00050085, 0x0000000D, 0x00003F3C, 0x00002E47, 0x00002E47, 0x00050085,\n    0x0000000D, 0x0000245D, 0x00004927, 0x00004927, 0x00050051, 0x0000000D,\n    0x000056E0, 0x00004C06, 0x00000000, 0x00050051, 0x0000000D, 0x00002E48,\n    0x00004C06, 0x00000001, 0x00050051, 0x0000000D, 0x00004928, 0x00004C06,\n    0x00000002, 0x00050085, 0x0000000D, 0x00006124, 0x000056E0, 0x000056E0,\n    0x00050085, 0x0000000D, 0x00003F3D, 0x00002E48, 0x00002E48, 0x00050085,\n    0x0000000D, 0x0000245E, 0x00004928, 0x00004928, 0x00050051, 0x0000000D,\n    0x000056E1, 0x00004C07, 0x00000000, 0x00050051, 0x0000000D, 0x00002E49,\n    0x00004C07, 0x00000001, 0x00050051, 0x0000000D, 0x00004929, 0x00004C07,\n    0x00000002, 0x00050085, 0x0000000D, 0x00006125, 0x000056E1, 0x000056E1,\n    0x00050085, 0x0000000D, 0x00003F3E, 0x00002E49, 0x00002E49, 0x00050085,\n    0x0000000D, 0x0000245F, 0x00004929, 0x00004929, 0x00050051, 0x0000000D,\n    0x000056E2, 0x00004C08, 0x00000000, 0x00050051, 0x0000000D, 0x00002E4A,\n    0x00004C08, 0x00000001, 0x00050051, 0x0000000D, 0x0000492A, 0x00004C08,\n    0x00000002, 0x00050085, 0x0000000D, 0x00006126, 0x000056E2, 0x000056E2,\n    0x00050085, 0x0000000D, 0x00003F3F, 0x00002E4A, 0x00002E4A, 0x00050085,\n    0x0000000D, 0x00002460, 0x0000492A, 0x0000492A, 0x00050051, 0x0000000D,\n    0x000056E3, 0x00004C0A, 0x00000000, 0x00050051, 0x0000000D, 0x00002E4B,\n    0x00004C0A, 0x00000001, 0x00050051, 0x0000000D, 0x0000492B, 0x00004C0A,\n    0x00000002, 0x00050085, 0x0000000D, 0x00006127, 0x000056E3, 0x000056E3,\n    0x00050085, 0x0000000D, 0x00003F40, 0x00002E4B, 0x00002E4B, 0x00050085,\n    0x0000000D, 0x00002461, 0x0000492B, 0x0000492B, 0x00050051, 0x0000000D,\n    0x000056E4, 0x00004C0B, 0x00000000, 0x00050051, 0x0000000D, 0x00002E4C,\n    0x00004C0B, 0x00000001, 0x00050051, 0x0000000D, 0x0000492C, 0x00004C0B,\n    0x00000002, 0x00050085, 0x0000000D, 0x00006128, 0x000056E4, 0x000056E4,\n    0x00050085, 0x0000000D, 0x00003F41, 0x00002E4C, 0x00002E4C, 0x00050085,\n    0x0000000D, 0x00002462, 0x0000492C, 0x0000492C, 0x00050051, 0x0000000D,\n    0x000056E5, 0x00004C09, 0x00000000, 0x00050051, 0x0000000D, 0x00002E4D,\n    0x00004C09, 0x00000001, 0x00050051, 0x0000000D, 0x0000492D, 0x00004C09,\n    0x00000002, 0x00050085, 0x0000000D, 0x00006129, 0x000056E5, 0x000056E5,\n    0x00050085, 0x0000000D, 0x00003F42, 0x00002E4D, 0x00002E4D, 0x00050085,\n    0x0000000D, 0x00002463, 0x0000492D, 0x0000492D, 0x00050051, 0x0000000D,\n    0x000056E6, 0x000022C3, 0x00000000, 0x00050051, 0x0000000D, 0x00002E4E,\n    0x000022C3, 0x00000001, 0x00050051, 0x0000000D, 0x0000492E, 0x000022C3,\n    0x00000002, 0x00050085, 0x0000000D, 0x0000612A, 0x000056E6, 0x000056E6,\n    0x00050085, 0x0000000D, 0x00003A3E, 0x00002E4E, 0x00002E4E, 0x00050085,\n    0x0000000D, 0x0000218E, 0x0000492E, 0x0000492E, 0x0007000C, 0x0000000D,\n    0x00002A7D, 0x00000001, 0x00000025, 0x00003F3A, 0x00003F3B, 0x0007000C,\n    0x0000000D, 0x0000243C, 0x00000001, 0x00000025, 0x00003F38, 0x00002A7D,\n    0x0007000C, 0x0000000D, 0x00003E4F, 0x00000001, 0x00000025, 0x00003F3C,\n    0x00003F3F, 0x0007000C, 0x0000000D, 0x00002A99, 0x00000001, 0x00000025,\n    0x0000243C, 0x00003E4F, 0x0007000C, 0x0000000D, 0x00005EE8, 0x00000001,\n    0x00000028, 0x00003F3A, 0x00003F3B, 0x0007000C, 0x0000000D, 0x00004473,\n    0x00000001, 0x00000028, 0x00003F38, 0x00005EE8, 0x0007000C, 0x0000000D,\n    0x00005558, 0x00000001, 0x00000028, 0x00003F3C, 0x00003F3F, 0x0007000C,\n    0x0000000D, 0x00001E8F, 0x00000001, 0x00000028, 0x00004473, 0x00005558,\n    0x0007000C, 0x0000000D, 0x000034BF, 0x00000001, 0x00000025, 0x00003F3B,\n    0x00003F3C, 0x0007000C, 0x0000000D, 0x000035FB, 0x00000001, 0x00000025,\n    0x00003F39, 0x000034BF, 0x0007000C, 0x0000000D, 0x00003E50, 0x00000001,\n    0x00000025, 0x00003F3D, 0x00003F40, 0x0007000C, 0x0000000D, 0x00002A9A,\n    0x00000001, 0x00000025, 0x000035FB, 0x00003E50, 0x0007000C, 0x0000000D,\n    0x00005EE9, 0x00000001, 0x00000028, 0x00003F3B, 0x00003F3C, 0x0007000C,\n    0x0000000D, 0x00004474, 0x00000001, 0x00000028, 0x00003F39, 0x00005EE9,\n    0x0007000C, 0x0000000D, 0x00005559, 0x00000001, 0x00000028, 0x00003F3D,\n    0x00003F40, 0x0007000C, 0x0000000D, 0x00001E90, 0x00000001, 0x00000028,\n    0x00004474, 0x00005559, 0x0007000C, 0x0000000D, 0x000034C0, 0x00000001,\n    0x00000025, 0x00003F3E, 0x00003F3F, 0x0007000C, 0x0000000D, 0x000035FC,\n    0x00000001, 0x00000025, 0x00003F3B, 0x000034C0, 0x0007000C, 0x0000000D,\n    0x00003E51, 0x00000001, 0x00000025, 0x00003F40, 0x00003F42, 0x0007000C,\n    0x0000000D, 0x00002A9B, 0x00000001, 0x00000025, 0x000035FC, 0x00003E51,\n    0x0007000C, 0x0000000D, 0x00005EEA, 0x00000001, 0x00000028, 0x00003F3E,\n    0x00003F3F, 0x0007000C, 0x0000000D, 0x00004475, 0x00000001, 0x00000028,\n    0x00003F3B, 0x00005EEA, 0x0007000C, 0x0000000D, 0x0000555A, 0x00000001,\n    0x00000028, 0x00003F40, 0x00003F42, 0x0007000C, 0x0000000D, 0x00001E91,\n    0x00000001, 0x00000028, 0x00004475, 0x0000555A, 0x0007000C, 0x0000000D,\n    0x000034C1, 0x00000001, 0x00000025, 0x00003F3F, 0x00003F40, 0x0007000C,\n    0x0000000D, 0x000035FD, 0x00000001, 0x00000025, 0x00003F3C, 0x000034C1,\n    0x0007000C, 0x0000000D, 0x00003E52, 0x00000001, 0x00000025, 0x00003F41,\n    0x00003A3E, 0x0007000C, 0x0000000D, 0x00002A9C, 0x00000001, 0x00000025,\n    0x000035FD, 0x00003E52, 0x0007000C, 0x0000000D, 0x00005EEB, 0x00000001,\n    0x00000028, 0x00003F3F, 0x00003F40, 0x0007000C, 0x0000000D, 0x00004476,\n    0x00000001, 0x00000028, 0x00003F3C, 0x00005EEB, 0x0007000C, 0x0000000D,\n    0x00005D83, 0x00000001, 0x00000028, 0x00003F41, 0x00003A3E, 0x0007000C,\n    0x0000000D, 0x0000526D, 0x00000001, 0x00000028, 0x00004476, 0x00005D83,\n    0x0004007C, 0x0000000B, 0x00001FF5, 0x00001E8F, 0x00050082, 0x0000000B,\n    0x00002272, 0x00000344, 0x00001FF5, 0x0004007C, 0x0000000D, 0x00002699,\n    0x00002272, 0x0004007C, 0x0000000B, 0x00003AD6, 0x00001E90, 0x00050082,\n    0x0000000B, 0x00001A2E, 0x00000344, 0x00003AD6, 0x0004007C, 0x0000000D,\n    0x0000269A, 0x00001A2E, 0x0004007C, 0x0000000B, 0x00003AD7, 0x00001E91,\n    0x00050082, 0x0000000B, 0x00001A2F, 0x00000344, 0x00003AD7, 0x0004007C,\n    0x0000000D, 0x0000269B, 0x00001A2F, 0x0004007C, 0x0000000B, 0x00003AD8,\n    0x0000526D, 0x00050082, 0x0000000B, 0x00001AB3, 0x00000344, 0x00003AD8,\n    0x0004007C, 0x0000000D, 0x00001941, 0x00001AB3, 0x00050083, 0x0000000D,\n    0x00005E43, 0x0000008A, 0x00001E8F, 0x0007000C, 0x0000000D, 0x00005B1C,\n    0x00000001, 0x00000025, 0x00002A99, 0x00005E43, 0x00050085, 0x0000000D,\n    0x000059FC, 0x00005B1C, 0x00002699, 0x0008000C, 0x0000000D, 0x00003EB3,\n    0x00000001, 0x0000002B, 0x000059FC, 0x00000A0C, 0x0000008A, 0x00050083,\n    0x0000000D, 0x000061AD, 0x0000008A, 0x00001E90, 0x0007000C, 0x0000000D,\n    0x000029C9, 0x00000001, 0x00000025, 0x00002A9A, 0x000061AD, 0x00050085,\n    0x0000000D, 0x000059FD, 0x000029C9, 0x0000269A, 0x0008000C, 0x0000000D,\n    0x00003EB4, 0x00000001, 0x0000002B, 0x000059FD, 0x00000A0C, 0x0000008A,\n    0x00050083, 0x0000000D, 0x000061AE, 0x0000008A, 0x00001E91, 0x0007000C,\n    0x0000000D, 0x000029CA, 0x00000001, 0x00000025, 0x00002A9B, 0x000061AE,\n    0x00050085, 0x0000000D, 0x000059FE, 0x000029CA, 0x0000269B, 0x0008000C,\n    0x0000000D, 0x00003EB5, 0x00000001, 0x0000002B, 0x000059FE, 0x00000A0C,\n    0x0000008A, 0x00050083, 0x0000000D, 0x000061AF, 0x0000008A, 0x0000526D,\n    0x0007000C, 0x0000000D, 0x000029CB, 0x00000001, 0x00000025, 0x00002A9C,\n    0x000061AF, 0x00050085, 0x0000000D, 0x00005977, 0x000029CB, 0x00001941,\n    0x0008000C, 0x0000000D, 0x000050CB, 0x00000001, 0x0000002B, 0x00005977,\n    0x00000A0C, 0x0000008A, 0x0004007C, 0x0000000B, 0x00005DCB, 0x00003EB3,\n    0x000500C2, 0x0000000B, 0x0000564A, 0x00005DCB, 0x00000A0D, 0x00050080,\n    0x0000000B, 0x00005ABD, 0x0000564A, 0x0000020D, 0x0004007C, 0x0000000D,\n    0x00005943, 0x00005ABD, 0x0004007C, 0x0000000B, 0x000022CE, 0x00003EB4,\n    0x000500C2, 0x0000000B, 0x000023E5, 0x000022CE, 0x00000A0D, 0x00050080,\n    0x0000000B, 0x00005ABE, 0x000023E5, 0x0000020D, 0x0004007C, 0x0000000D,\n    0x00005944, 0x00005ABE, 0x0004007C, 0x0000000B, 0x000022CF, 0x00003EB5,\n    0x000500C2, 0x0000000B, 0x000023E6, 0x000022CF, 0x00000A0D, 0x00050080,\n    0x0000000B, 0x00005ABF, 0x000023E6, 0x0000020D, 0x0004007C, 0x0000000D,\n    0x00005945, 0x00005ABF, 0x0004007C, 0x0000000B, 0x000022D0, 0x000050CB,\n    0x000500C2, 0x0000000B, 0x000023E7, 0x000022D0, 0x00000A0D, 0x00050080,\n    0x0000000B, 0x00005AC0, 0x000023E7, 0x0000020D, 0x0004007C, 0x0000000D,\n    0x000054BC, 0x00005AC0, 0x0004007C, 0x0000000D, 0x00004C66, 0x000044BF,\n    0x00050085, 0x0000000D, 0x000049BF, 0x00005943, 0x00004C66, 0x00050085,\n    0x0000000D, 0x0000590B, 0x00005944, 0x00004C66, 0x00050085, 0x0000000D,\n    0x00004BB4, 0x00005945, 0x00004C66, 0x00050085, 0x0000000D, 0x0000280F,\n    0x000054BC, 0x00004C66, 0x00050051, 0x0000000D, 0x00003512, 0x00003FA2,\n    0x00000000, 0x00050083, 0x0000000D, 0x000054D6, 0x0000008A, 0x00003512,\n    0x00050051, 0x0000000D, 0x00002E64, 0x00003FA2, 0x00000001, 0x00050083,\n    0x0000000D, 0x00002B8B, 0x0000008A, 0x00002E64, 0x00050085, 0x0000000D,\n    0x00004506, 0x000054D6, 0x00002B8B, 0x00050085, 0x0000000D, 0x0000627C,\n    0x00003512, 0x00002B8B, 0x00050085, 0x0000000D, 0x00004F6A, 0x000054D6,\n    0x00002E64, 0x00050085, 0x0000000D, 0x0000509E, 0x00003512, 0x00002E64,\n    0x00050083, 0x0000000D, 0x0000471C, 0x00001E8F, 0x00002A99, 0x00050081,\n    0x0000000D, 0x00005B9D, 0x000002C4, 0x0000471C, 0x0004007C, 0x0000000B,\n    0x00002C83, 0x00005B9D, 0x00050082, 0x0000000B, 0x00001DFD, 0x00000344,\n    0x00002C83, 0x0004007C, 0x0000000D, 0x00002097, 0x00001DFD, 0x00050085,\n    0x0000000D, 0x0000447B, 0x00004506, 0x00002097, 0x00050083, 0x0000000D,\n    0x00005097, 0x00001E90, 0x00002A9A, 0x00050081, 0x0000000D, 0x00005B9E,\n    0x000002C4, 0x00005097, 0x0004007C, 0x0000000B, 0x00002C84, 0x00005B9E,\n    0x00050082, 0x0000000B, 0x00001DFE, 0x00000344, 0x00002C84, 0x0004007C,\n    0x0000000D, 0x00002098, 0x00001DFE, 0x00050085, 0x0000000D, 0x0000447C,\n    0x0000627C, 0x00002098, 0x00050083, 0x0000000D, 0x00005098, 0x00001E91,\n    0x00002A9B, 0x00050081, 0x0000000D, 0x00005B9F, 0x000002C4, 0x00005098,\n    0x0004007C, 0x0000000B, 0x00002C85, 0x00005B9F, 0x00050082, 0x0000000B,\n    0x00001DFF, 0x00000344, 0x00002C85, 0x0004007C, 0x0000000D, 0x00002099,\n    0x00001DFF, 0x00050085, 0x0000000D, 0x0000447D, 0x00004F6A, 0x00002099,\n    0x00050083, 0x0000000D, 0x00005099, 0x0000526D, 0x00002A9C, 0x00050081,\n    0x0000000D, 0x00005BA0, 0x000002C4, 0x00005099, 0x0004007C, 0x0000000B,\n    0x00002C86, 0x00005BA0, 0x00050082, 0x0000000B, 0x00001E00, 0x00000344,\n    0x00002C86, 0x0004007C, 0x0000000D, 0x000020BD, 0x00001E00, 0x00050085,\n    0x0000000D, 0x0000436D, 0x0000509E, 0x000020BD, 0x00050085, 0x0000000D,\n    0x0000590C, 0x000049BF, 0x0000447B, 0x00050085, 0x0000000D, 0x00004F44,\n    0x0000590B, 0x0000447C, 0x00050085, 0x0000000D, 0x000051F8, 0x00004BB4,\n    0x0000447D, 0x00050081, 0x0000000D, 0x00003D4A, 0x00004F44, 0x000051F8,\n    0x00050081, 0x0000000D, 0x00005767, 0x00003D4A, 0x0000447B, 0x00050085,\n    0x0000000D, 0x00003135, 0x0000280F, 0x0000436D, 0x00050081, 0x0000000D,\n    0x0000499D, 0x0000590C, 0x00003135, 0x00050081, 0x0000000D, 0x00005A1B,\n    0x0000499D, 0x0000447C, 0x00050081, 0x0000000D, 0x00001C3B, 0x0000499D,\n    0x0000447D, 0x00050081, 0x0000000D, 0x00001C3C, 0x00003D4A, 0x0000436D,\n    0x00050081, 0x0000000D, 0x00001C3D, 0x0000590C, 0x00004F44, 0x00050081,\n    0x0000000D, 0x00001C87, 0x00001C3D, 0x000051F8, 0x00050081, 0x0000000D,\n    0x00001987, 0x00001C87, 0x00003135, 0x00050085, 0x0000000D, 0x00003136,\n    0x00000019, 0x00001987, 0x00050081, 0x0000000D, 0x0000499E, 0x00003136,\n    0x00005767, 0x00050081, 0x0000000D, 0x00005A1C, 0x0000499E, 0x00005A1B,\n    0x00050081, 0x0000000D, 0x00001BDC, 0x00005A1C, 0x00001C3B, 0x00050081,\n    0x0000000D, 0x00001FAF, 0x00001BDC, 0x00001C3C, 0x0004007C, 0x0000000B,\n    0x00002636, 0x00001FAF, 0x00050082, 0x0000000B, 0x00001D8B, 0x000000B2,\n    0x00002636, 0x0004007C, 0x0000000D, 0x000024CB, 0x00001D8B, 0x0004007F,\n    0x0000000D, 0x000023AA, 0x000024CB, 0x00050085, 0x0000000D, 0x0000304F,\n    0x000023AA, 0x00001FAF, 0x00050081, 0x0000000D, 0x0000409C, 0x0000304F,\n    0x00000019, 0x00050085, 0x0000000D, 0x000024E2, 0x000024CB, 0x0000409C,\n    0x00050081, 0x0000000D, 0x00004735, 0x0000611F, 0x00006121, 0x00050085,\n    0x0000000D, 0x000021E2, 0x0000590C, 0x00004735, 0x00050085, 0x0000000D,\n    0x00005EE3, 0x00006120, 0x00004F44, 0x00050081, 0x0000000D, 0x00003A4A,\n    0x000021E2, 0x00005EE3, 0x00050085, 0x0000000D, 0x000024E3, 0x00006124,\n    0x00004F44, 0x00050081, 0x0000000D, 0x000046E9, 0x00003A4A, 0x000024E3,\n    0x00050085, 0x0000000D, 0x000024E4, 0x00006125, 0x000051F8, 0x00050081,\n    0x0000000D, 0x000046EA, 0x000046E9, 0x000024E4, 0x00050085, 0x0000000D,\n    0x000024E5, 0x00006129, 0x000051F8, 0x00050081, 0x0000000D, 0x000046EB,\n    0x000046EA, 0x000024E5, 0x00050085, 0x0000000D, 0x000024E6, 0x00006128,\n    0x00003135, 0x00050081, 0x0000000D, 0x000046EC, 0x000046EB, 0x000024E6,\n    0x00050085, 0x0000000D, 0x000024E7, 0x0000612A, 0x00003135, 0x00050081,\n    0x0000000D, 0x000046ED, 0x000046EC, 0x000024E7, 0x00050085, 0x0000000D,\n    0x000024E8, 0x00006122, 0x00005767, 0x00050081, 0x0000000D, 0x000046EE,\n    0x000046ED, 0x000024E8, 0x00050085, 0x0000000D, 0x000024E9, 0x00006123,\n    0x00005A1B, 0x00050081, 0x0000000D, 0x000046EF, 0x000046EE, 0x000024E9,\n    0x00050085, 0x0000000D, 0x000024EA, 0x00006126, 0x00001C3B, 0x00050081,\n    0x0000000D, 0x000046F0, 0x000046EF, 0x000024EA, 0x00050085, 0x0000000D,\n    0x000024EB, 0x00006127, 0x00001C3C, 0x00050081, 0x0000000D, 0x00003E65,\n    0x000046F0, 0x000024EB, 0x00050085, 0x0000000D, 0x00001FC9, 0x00003E65,\n    0x000024E2, 0x0008000C, 0x0000000D, 0x00003B72, 0x00000001, 0x0000002B,\n    0x00001FC9, 0x00000A0C, 0x0000008A, 0x00050081, 0x0000000D, 0x000031DD,\n    0x00003F38, 0x00003F3A, 0x00050085, 0x0000000D, 0x00004489, 0x0000590C,\n    0x000031DD, 0x00050085, 0x0000000D, 0x00005EE4, 0x00003F39, 0x00004F44,\n    0x00050081, 0x0000000D, 0x00003A4B, 0x00004489, 0x00005EE4, 0x00050085,\n    0x0000000D, 0x000024EC, 0x00003F3D, 0x00004F44, 0x00050081, 0x0000000D,\n    0x000046F1, 0x00003A4B, 0x000024EC, 0x00050085, 0x0000000D, 0x000024ED,\n    0x00003F3E, 0x000051F8, 0x00050081, 0x0000000D, 0x000046F2, 0x000046F1,\n    0x000024ED, 0x00050085, 0x0000000D, 0x000024EE, 0x00003F42, 0x000051F8,\n    0x00050081, 0x0000000D, 0x000046F3, 0x000046F2, 0x000024EE, 0x00050085,\n    0x0000000D, 0x000024EF, 0x00003F41, 0x00003135, 0x00050081, 0x0000000D,\n    0x000046F4, 0x000046F3, 0x000024EF, 0x00050085, 0x0000000D, 0x000024F0,\n    0x00003A3E, 0x00003135, 0x00050081, 0x0000000D, 0x000046F5, 0x000046F4,\n    0x000024F0, 0x00050085, 0x0000000D, 0x000024F1, 0x00003F3B, 0x00005767,\n    0x00050081, 0x0000000D, 0x000046F6, 0x000046F5, 0x000024F1, 0x00050085,\n    0x0000000D, 0x000024F2, 0x00003F3C, 0x00005A1B, 0x00050081, 0x0000000D,\n    0x000046F7, 0x000046F6, 0x000024F2, 0x00050085, 0x0000000D, 0x000024F3,\n    0x00003F3F, 0x00001C3B, 0x00050081, 0x0000000D, 0x000046F8, 0x000046F7,\n    0x000024F3, 0x00050085, 0x0000000D, 0x000024F4, 0x00003F40, 0x00001C3C,\n    0x00050081, 0x0000000D, 0x00003E66, 0x000046F8, 0x000024F4, 0x00050085,\n    0x0000000D, 0x00001FCA, 0x00003E66, 0x000024E2, 0x0008000C, 0x0000000D,\n    0x00003B73, 0x00000001, 0x0000002B, 0x00001FCA, 0x00000A0C, 0x0000008A,\n    0x00050081, 0x0000000D, 0x000031DE, 0x00002459, 0x0000245B, 0x00050085,\n    0x0000000D, 0x0000448A, 0x0000590C, 0x000031DE, 0x00050085, 0x0000000D,\n    0x00005EE5, 0x0000245A, 0x00004F44, 0x00050081, 0x0000000D, 0x00003A4C,\n    0x0000448A, 0x00005EE5, 0x00050085, 0x0000000D, 0x000024F5, 0x0000245E,\n    0x00004F44, 0x00050081, 0x0000000D, 0x000046F9, 0x00003A4C, 0x000024F5,\n    0x00050085, 0x0000000D, 0x000024F6, 0x0000245F, 0x000051F8, 0x00050081,\n    0x0000000D, 0x000046FA, 0x000046F9, 0x000024F6, 0x00050085, 0x0000000D,\n    0x000024F7, 0x00002463, 0x000051F8, 0x00050081, 0x0000000D, 0x000046FB,\n    0x000046FA, 0x000024F7, 0x00050085, 0x0000000D, 0x000024F8, 0x00002462,\n    0x00003135, 0x00050081, 0x0000000D, 0x000046FC, 0x000046FB, 0x000024F8,\n    0x00050085, 0x0000000D, 0x000024F9, 0x0000218E, 0x00003135, 0x00050081,\n    0x0000000D, 0x000046FD, 0x000046FC, 0x000024F9, 0x00050085, 0x0000000D,\n    0x000024FA, 0x0000245C, 0x00005767, 0x00050081, 0x0000000D, 0x000046FE,\n    0x000046FD, 0x000024FA, 0x00050085, 0x0000000D, 0x000024FB, 0x0000245D,\n    0x00005A1B, 0x00050081, 0x0000000D, 0x000046FF, 0x000046FE, 0x000024FB,\n    0x00050085, 0x0000000D, 0x000024FC, 0x00002460, 0x00001C3B, 0x00050081,\n    0x0000000D, 0x00004700, 0x000046FF, 0x000024FC, 0x00050085, 0x0000000D,\n    0x000024FD, 0x00002461, 0x00001C3C, 0x00050081, 0x0000000D, 0x00003E67,\n    0x00004700, 0x000024FD, 0x00050085, 0x0000000D, 0x00001C4C, 0x00003E67,\n    0x000024E2, 0x0008000C, 0x0000000D, 0x0000576C, 0x00000001, 0x0000002B,\n    0x00001C4C, 0x00000A0C, 0x0000008A, 0x00060052, 0x0000001D, 0x00005ECE,\n    0x00003B72, 0x00000002, 0x00000000, 0x00060052, 0x0000001D, 0x00002B42,\n    0x00003B73, 0x00005ECE, 0x00000001, 0x00060052, 0x0000001D, 0x00003A55,\n    0x0000576C, 0x00002B42, 0x00000002, 0x0008004F, 0x00000018, 0x0000329B,\n    0x00003A55, 0x00003A55, 0x00000000, 0x00000001, 0x00000002, 0x0006000C,\n    0x00000018, 0x00001934, 0x00000001, 0x0000001F, 0x0000329B, 0x00050051,\n    0x0000000D, 0x00005983, 0x00001934, 0x00000000, 0x00050051, 0x0000000D,\n    0x00002295, 0x00001934, 0x00000001, 0x00050051, 0x0000000D, 0x00001D30,\n    0x00001934, 0x00000002, 0x00070050, 0x0000001D, 0x00005788, 0x00005983,\n    0x00002295, 0x00001D30, 0x0000008A, 0x0003003E, 0x000014D6, 0x00005788,\n    0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/ui/shaders/bytecode/vulkan_spirv/guest_output_ffx_cas_sharpen_dither_ps.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25141\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint Fragment %main \"main\" %gl_FragCoord %xe_cas_color\n               OpExecutionMode %main OriginUpperLeft\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %gl_FragCoord \"gl_FragCoord\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_cas_output_offset\"\n               OpMemberName %push_const_block_xe 1 \"xe_cas_sharpness_post_setup\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %xe_cas_color \"xe_cas_color\"\n               OpName %xe_cas_source \"xe_cas_source\"\n               OpDecorate %gl_FragCoord BuiltIn FragCoord\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 16\n               OpMemberDecorate %push_const_block_xe 1 Offset 24\n               OpDecorate %xe_cas_color Location 0\n               OpDecorate %xe_cas_source Binding 0\n               OpDecorate %xe_cas_source DescriptorSet 0\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n      %float = OpTypeFloat 32\n%_ptr_Function_float = OpTypePointer Function %float\n    %v3float = OpTypeVector %float 3\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n    %float_0 = OpConstant %float 0\n    %float_1 = OpConstant %float 1\n    %uint_15 = OpConstant %uint 15\n   %uint_256 = OpConstant %uint 256\n%_arr_float_uint_256 = OpTypeArray %float %uint_256\n%float_n0_00100337015 = OpConstant %float -0.00100337015\n%float_0_000880821084 = OpConstant %float 0.000880821084\n%float_0_00169270835 = OpConstant %float 0.00169270835\n%float_n0_00155484071 = OpConstant %float -0.00155484071\n%float_0_00127910543 = OpConstant %float 0.00127910543\n%float_n0_000605085806 = OpConstant %float -0.000605085806\n%float_0_00106464466 = OpConstant %float 0.00106464466\n%float_n0_00138633582 = OpConstant %float -0.00138633582\n%float_0_00135569857 = OpConstant %float 0.00135569857\n%float_0_000513174047 = OpConstant %float 0.000513174047\n%float_0_00121783093 = OpConstant %float 0.00121783093\n%float_n0_00160079659 = OpConstant %float -0.00160079659\n%float_0_00058976718 = OpConstant %float 0.00058976718\n%float_n0_00028339462 = OpConstant %float -0.00028339462\n%float_0_00111060054 = OpConstant %float 0.00111060054\n%float_n0_00141697307 = OpConstant %float -0.00141697307\n%float_0_00144761032 = OpConstant %float 0.00144761032\n%float_n0_0005438113 = OpConstant %float -0.0005438113\n%float_0_00013020834 = OpConstant %float 0.00013020834\n%float_n0_0012025123 = OpConstant %float -0.0012025123\n%float_0_000436580885 = OpConstant %float 0.000436580885\n%float_n0_00104932603 = OpConstant %float -0.00104932603\n%float_0_000620404433 = OpConstant %float 0.000620404433\n%float_n0_000482536765 = OpConstant %float -0.000482536765\n%float_0_00187653187 = OpConstant %float 0.00187653187\n%float_n0_00109528191 = OpConstant %float -0.00109528191\n%float_n9_95710798en05 = OpConstant %float -9.95710798e-05\n%float_n0_000528492674 = OpConstant %float -0.000528492674\n%float_0_0014322917 = OpConstant %float 0.0014322917\n%float_n0_00193780637 = OpConstant %float -0.00193780637\n%float_n0_000696997566 = OpConstant %float -0.000696997566\n%float_3_829657en05 = OpConstant %float 3.829657e-05\n%float_0_000712316192 = OpConstant %float 0.000712316192\n%float_n0_00130974269 = OpConstant %float -0.00130974269\n%float_0_00109528191 = OpConstant %float 0.00109528191\n%float_n0_000298713247 = OpConstant %float -0.000298713247\n%float_0_00175398286 = OpConstant %float 0.00175398286\n%float_n0_00167738972 = OpConstant %float -0.00167738972\n%float_0_00147824758 = OpConstant %float 0.00147824758\n%float_n3_829657en05 = OpConstant %float -3.829657e-05\n%float_0_000788909325 = OpConstant %float 0.000788909325\n%float_n0_00183057599 = OpConstant %float -0.00183057599\n%float_0_000298713247 = OpConstant %float 0.000298713247\n%float_0_000988051528 = OpConstant %float 0.000988051528\n%float_n0_00117187505 = OpConstant %float -0.00117187505\n%float_0_00017616422 = OpConstant %float 0.00017616422\n%float_0_00164675247 = OpConstant %float 0.00164675247\n%float_n0_00158547796 = OpConstant %float -0.00158547796\n%float_0_000344669126 = OpConstant %float 0.000344669126\n%float_0_00186121324 = OpConstant %float 0.00186121324\n%float_n0_00176930148 = OpConstant %float -0.00176930148\n%float_n0_000865502458 = OpConstant %float -0.000865502458\n%float_0_000896139711 = OpConstant %float 0.000896139711\n%float_0_000160845593 = OpConstant %float 0.000160845593\n%float_n0_000926776964 = OpConstant %float -0.000926776964\n%float_n0_00152420346 = OpConstant %float -0.00152420346\n%float_n0_000651041686 = OpConstant %float -0.000651041686\n%float_0_00129442406 = OpConstant %float 0.00129442406\n%float_n0_000804227951 = OpConstant %float -0.000804227951\n%float_n0_00146292895 = OpConstant %float -0.00146292895\n%float_0_00179993873 = OpConstant %float 0.00179993873\n%float_n0_000850183831 = OpConstant %float -0.000850183831\n%float_0_000850183831 = OpConstant %float 0.000850183831\n%float_n0_000451899512 = OpConstant %float -0.000451899512\n%float_n0_00106464466 = OpConstant %float -0.00106464466\n%float_n0_000145526967 = OpConstant %float -0.000145526967\n%float_0_000237438726 = OpConstant %float 0.000237438726\n%float_0_00141697307 = OpConstant %float 0.00141697307\n%float_n0_00058976718 = OpConstant %float -0.00058976718\n%float_n0_000191482846 = OpConstant %float -0.000191482846\n%float_0_00160079659 = OpConstant %float 0.00160079659\n%float_0_00101868878 = OpConstant %float 0.00101868878\n%float_0_000405943632 = OpConstant %float 0.000405943632\n%float_n0_000206801473 = OpConstant %float -0.000206801473\n%float_0_00158547796 = OpConstant %float 0.00158547796\n%float_0_000651041686 = OpConstant %float 0.000651041686\n%float_n6_89338267en05 = OpConstant %float -6.89338267e-05\n%float_0_000421262259 = OpConstant %float 0.000421262259\n%float_n0_00164675247 = OpConstant %float -0.00164675247\n%float_0_00137101719 = OpConstant %float 0.00137101719\n%float_0_000926776964 = OpConstant %float 0.000926776964\n%float_n0_000666360313 = OpConstant %float -0.000666360313\n%float_0_00118719367 = OpConstant %float 0.00118719367\n%float_n0_00144761032 = OpConstant %float -0.00144761032\n%float_0_000574448553 = OpConstant %float 0.000574448553\n%float_n0_00189185049 = OpConstant %float -0.00189185049\n%float_0_000758272072 = OpConstant %float 0.000758272072\n%float_n0_00129442406 = OpConstant %float -0.00129442406\n%float_0_00192248775 = OpConstant %float 0.00192248775\n%float_n0_0016620711 = OpConstant %float -0.0016620711\n%float_n0_00103400741 = OpConstant %float -0.00103400741\n%float_n0_000497855421 = OpConstant %float -0.000497855421\n%float_n0_00186121324 = OpConstant %float -0.00186121324\n%float_0_0012025123 = OpConstant %float 0.0012025123\n%float_n0_0003293505 = OpConstant %float -0.0003293505\n%float_n0_00137101719 = OpConstant %float -0.00137101719\n%float_0_00163143384 = OpConstant %float 0.00163143384\n%float_n0_00184589461 = OpConstant %float -0.00184589461\n%float_0_000727634819 = OpConstant %float 0.000727634819\n%float_n0_000911458337 = OpConstant %float -0.000911458337\n%float_0_00181525736 = OpConstant %float 0.00181525736\n%float_n0_00114123779 = OpConstant %float -0.00114123779\n%float_n0_000375306379 = OpConstant %float -0.000375306379\n%float_9_95710798en05 = OpConstant %float 9.95710798e-05\n%float_n0_000742953445 = OpConstant %float -0.000742953445\n%float_0_00117187505 = OpConstant %float 0.00117187505\n%float_6_89338267en05 = OpConstant %float 6.89338267e-05\n%float_0_0014935662 = OpConstant %float 0.0014935662\n%float_0_000972732843 = OpConstant %float 0.000972732843\n%float_n0_000957414217 = OpConstant %float -0.000957414217\n%float_0_00193780637 = OpConstant %float 0.00193780637\n%float_0_000528492674 = OpConstant %float 0.000528492674\n%float_5_36151965en05 = OpConstant %float 5.36151965e-05\n%float_n0_00124846818 = OpConstant %float -0.00124846818\n%float_n0_000268075994 = OpConstant %float -0.000268075994\n%float_0_00153952208 = OpConstant %float 0.00153952208\n%float_n7_65931418en06 = OpConstant %float -7.65931418e-06\n%float_0_000314031873 = OpConstant %float 0.000314031873\n%float_0_00134037994 = OpConstant %float 0.00134037994\n%float_n0_00175398286 = OpConstant %float -0.00175398286\n%float_0_000497855421 = OpConstant %float 0.000497855421\n%float_n0_00118719367 = OpConstant %float -0.00118719367\n%float_0_000773590698 = OpConstant %float 0.000773590698\n%float_n0_00134037994 = OpConstant %float -0.00134037994\n%float_0_000268075994 = OpConstant %float 0.000268075994\n%float_n0_00147824758 = OpConstant %float -0.00147824758\n%float_n0_00013020834 = OpConstant %float -0.00013020834\n%float_n0_000773590698 = OpConstant %float -0.000773590698\n%float_0_00130974269 = OpConstant %float 0.00130974269\n%float_0_000390625006 = OpConstant %float 0.000390625006\n%float_0_000957414217 = OpConstant %float 0.000957414217\n%float_n0_000467218139 = OpConstant %float -0.000467218139\n%float_n0_00153952208 = OpConstant %float -0.00153952208\n%float_0_00103400741 = OpConstant %float 0.00103400741\n%float_n0_000681678939 = OpConstant %float -0.000681678939\n%float_0_00167738972 = OpConstant %float 0.00167738972\n%float_0_00100337015 = OpConstant %float 0.00100337015\n%float_n0_000421262259 = OpConstant %float -0.000421262259\n%float_0_00178462011 = OpConstant %float 0.00178462011\n%float_n0_000237438726 = OpConstant %float -0.000237438726\n%float_n0_000620404433 = OpConstant %float -0.000620404433\n%float_0_0016620711 = OpConstant %float 0.0016620711\n%float_0_000834865205 = OpConstant %float 0.000834865205\n%float_n0_0017233456 = OpConstant %float -0.0017233456\n%float_n0_00107996329 = OpConstant %float -0.00107996329\n%float_0_00176930148 = OpConstant %float 0.00176930148\n%float_n0_000788909325 = OpConstant %float -0.000788909325\n%float_n0_00178462011 = OpConstant %float -0.00178462011\n%float_0_000681678939 = OpConstant %float 0.000681678939\n%float_n0_000988051528 = OpConstant %float -0.000988051528\n%float_n0_00132506131 = OpConstant %float -0.00132506131\n%float_n0_00017616422 = OpConstant %float -0.00017616422\n%float_n0_00150888483 = OpConstant %float -0.00150888483\n%float_0_0003293505 = OpConstant %float 0.0003293505\n%float_n0_001953125 = OpConstant %float -0.001953125\n%float_0_000666360313 = OpConstant %float 0.000666360313\n%float_n0_00161611522 = OpConstant %float -0.00161611522\n%float_0_00115655642 = OpConstant %float 0.00115655642\n%float_0_000451899512 = OpConstant %float 0.000451899512\n%float_n0_000436580885 = OpConstant %float -0.000436580885\n%float_0_000191482846 = OpConstant %float 0.000191482846\n%float_n0_0014935662 = OpConstant %float -0.0014935662\n%float_0_00114123779 = OpConstant %float 0.00114123779\n%float_8_42524532en05 = OpConstant %float 8.42524532e-05\n%float_0_00189185049 = OpConstant %float 0.00189185049\n%float_0_00140165444 = OpConstant %float 0.00140165444\n%float_0_000559129927 = OpConstant %float 0.000559129927\n%float_0_000114889706 = OpConstant %float 0.000114889706\n%float_0_00126378681 = OpConstant %float 0.00126378681\n%float_n0_000574448553 = OpConstant %float -0.000574448553\n%float_n0_000972732843 = OpConstant %float -0.000972732843\n%float_0_00132506131 = OpConstant %float 0.00132506131\n%float_0_000222120099 = OpConstant %float 0.000222120099\n%float_n0_000758272072 = OpConstant %float -0.000758272072\n%float_n0_00135569857 = OpConstant %float -0.00135569857\n%float_0_00146292895 = OpConstant %float 0.00146292895\n%float_0_000865502458 = OpConstant %float 0.000865502458\n%float_n0_000359987753 = OpConstant %float -0.000359987753\n%float_0_0005438113 = OpConstant %float 0.0005438113\n%float_n0_00112591917 = OpConstant %float -0.00112591917\n%float_n0_000252757367 = OpConstant %float -0.000252757367\n%float_n0_000559129927 = OpConstant %float -0.000559129927\n%float_n0_00181525736 = OpConstant %float -0.00181525736\n%float_0_0017233456 = OpConstant %float 0.0017233456\n%float_n0_00115655642 = OpConstant %float -0.00115655642\n%float_0_000742953445 = OpConstant %float 0.000742953445\n%float_0_00157015934 = OpConstant %float 0.00157015934\n%float_n0_000114889706 = OpConstant %float -0.000114889706\n%float_n0_00121783093 = OpConstant %float -0.00121783093\n%float_0_00183057599 = OpConstant %float 0.00183057599\n%float_2_29779416en05 = OpConstant %float 2.29779416e-05\n%float_n0_00192248775 = OpConstant %float -0.00192248775\n%float_0_00173866423 = OpConstant %float 0.00173866423\n%float_n0_000712316192 = OpConstant %float -0.000712316192\n%float_0_00155484071 = OpConstant %float 0.00155484071\n%float_n0_00170802698 = OpConstant %float -0.00170802698\n%float_0_00123314955 = OpConstant %float 0.00123314955\n%float_0_000206801473 = OpConstant %float 0.000206801473\n%float_0_00104932603 = OpConstant %float 0.00104932603\n%float_n0_000727634819 = OpConstant %float -0.000727634819\n%float_n0_00163143384 = OpConstant %float -0.00163143384\n%float_n0_000314031873 = OpConstant %float -0.000314031873\n%float_0_000482536765 = OpConstant %float 0.000482536765\n%float_n0_00179993873 = OpConstant %float -0.00179993873\n%float_0_00094209559 = OpConstant %float 0.00094209559\n%float_n0_000344669126 = OpConstant %float -0.000344669126\n%float_0_000696997566 = OpConstant %float 0.000696997566\n%float_n0_00101868878 = OpConstant %float -0.00101868878\n%float_n0_00157015934 = OpConstant %float -0.00157015934\n%float_n2_29779416en05 = OpConstant %float -2.29779416e-05\n%float_n0_00127910543 = OpConstant %float -0.00127910543\n%float_0_000804227951 = OpConstant %float 0.000804227951\n%float_n0_000896139711 = OpConstant %float -0.000896139711\n%float_n0_0014322917 = OpConstant %float -0.0014322917\n%float_0_000605085806 = OpConstant %float 0.000605085806\n%float_n8_42524532en05 = OpConstant %float -8.42524532e-05\n%float_0_000911458337 = OpConstant %float 0.000911458337\n%float_0_001953125 = OpConstant %float 0.001953125\n%float_n0_00140165444 = OpConstant %float -0.00140165444\n%float_n0_00063572306 = OpConstant %float -0.00063572306\n%float_0_00150888483 = OpConstant %float 0.00150888483\n%float_n0_000819546578 = OpConstant %float -0.000819546578\n%float_0_00124846818 = OpConstant %float 0.00124846818\n%float_0_000252757367 = OpConstant %float 0.000252757367\n%float_0_00152420346 = OpConstant %float 0.00152420346\n%float_0_00112591917 = OpConstant %float 0.00112591917\n%float_0_000359987753 = OpConstant %float 0.000359987753\n%float_n0_000390625006 = OpConstant %float -0.000390625006\n%float_0_00190716912 = OpConstant %float 0.00190716912\n%float_0_00138633582 = OpConstant %float 0.00138633582\n%float_n0_00111060054 = OpConstant %float -0.00111060054\n%float_0_00161611522 = OpConstant %float 0.00161611522\n%float_n0_000880821084 = OpConstant %float -0.000880821084\n%float_0_000145526967 = OpConstant %float 0.000145526967\n%float_0_00107996329 = OpConstant %float 0.00107996329\n%float_n5_36151965en05 = OpConstant %float -5.36151965e-05\n%float_0_00028339462 = OpConstant %float 0.00028339462\n%float_n0_00169270835 = OpConstant %float -0.00169270835\n%float_n0_00126378681 = OpConstant %float -0.00126378681\n%float_n0_000513174047 = OpConstant %float -0.000513174047\n%float_n0_000160845593 = OpConstant %float -0.000160845593\n%float_n0_00187653187 = OpConstant %float -0.00187653187\n%float_n0_000834865205 = OpConstant %float -0.000834865205\n%float_0_00063572306 = OpConstant %float 0.00063572306\n%float_7_65931418en06 = OpConstant %float 7.65931418e-06\n%float_n0_00190716912 = OpConstant %float -0.00190716912\n%float_n0_000222120099 = OpConstant %float -0.000222120099\n%float_0_000375306379 = OpConstant %float 0.000375306379\n%float_n0_00173866423 = OpConstant %float -0.00173866423\n%float_n0_000405943632 = OpConstant %float -0.000405943632\n%float_n0_00123314955 = OpConstant %float -0.00123314955\n%float_0_00170802698 = OpConstant %float 0.00170802698\n%float_n0_00094209559 = OpConstant %float -0.00094209559\n%float_0_000819546578 = OpConstant %float 0.000819546578\n%float_0_00184589461 = OpConstant %float 0.00184589461\n%float_0_000467218139 = OpConstant %float 0.000467218139\n       %2242 = OpConstantComposite %_arr_float_uint_256 %float_n0_00100337015 %float_0_000880821084 %float_0_00169270835 %float_n0_00155484071 %float_0_00127910543 %float_n0_000605085806 %float_0_00106464466 %float_n0_00138633582 %float_0_00135569857 %float_0_000513174047 %float_0_00121783093 %float_n0_00160079659 %float_0_00058976718 %float_n0_00028339462 %float_0_00111060054 %float_n0_00141697307 %float_0_00144761032 %float_n0_0005438113 %float_0_00013020834 %float_n0_0012025123 %float_0_000436580885 %float_n0_00104932603 %float_0_000620404433 %float_n0_000482536765 %float_0_00187653187 %float_n0_00109528191 %float_n9_95710798en05 %float_n0_000528492674 %float_0_0014322917 %float_n0_00193780637 %float_n0_000696997566 %float_3_829657en05 %float_0_000712316192 %float_n0_00130974269 %float_0_00109528191 %float_n0_000298713247 %float_0_00175398286 %float_n0_00167738972 %float_0_00147824758 %float_n3_829657en05 %float_0_000788909325 %float_n0_00183057599 %float_0_000298713247 %float_0_000988051528 %float_n0_00117187505 %float_0_00017616422 %float_0_00164675247 %float_n0_00158547796 %float_0_000344669126 %float_0_00186121324 %float_n0_00176930148 %float_n0_000865502458 %float_0_000896139711 %float_0_000160845593 %float_n0_000926776964 %float_n0_00152420346 %float_n0_000651041686 %float_0_00129442406 %float_n0_000804227951 %float_n0_00146292895 %float_0_00179993873 %float_n0_000850183831 %float_0_000850183831 %float_n0_000451899512 %float_n0_00106464466 %float_n0_000145526967 %float_0_000237438726 %float_0_00141697307 %float_n0_00058976718 %float_n0_000191482846 %float_0_00160079659 %float_0_00101868878 %float_0_000405943632 %float_n0_000206801473 %float_0_00158547796 %float_0_000651041686 %float_n6_89338267en05 %float_0_000421262259 %float_n0_00164675247 %float_0_00137101719 %float_0_000926776964 %float_n0_000666360313 %float_0_00118719367 %float_n0_00144761032 %float_0_000574448553 %float_n0_00189185049 %float_0_000758272072 %float_n0_00129442406 %float_0_00192248775 %float_n0_0016620711 %float_n0_00103400741 %float_n0_000497855421 %float_n0_00186121324 %float_0_0012025123 %float_n0_0003293505 %float_n0_00137101719 %float_0_00163143384 %float_n0_00184589461 %float_0_000727634819 %float_n0_000911458337 %float_0_00181525736 %float_n0_00114123779 %float_n0_000375306379 %float_9_95710798en05 %float_n0_000742953445 %float_0_00117187505 %float_6_89338267en05 %float_0_0014935662 %float_0_000972732843 %float_n0_000957414217 %float_0_00193780637 %float_0_000528492674 %float_5_36151965en05 %float_n0_00124846818 %float_n0_000268075994 %float_0_00153952208 %float_n7_65931418en06 %float_0_000314031873 %float_0_00134037994 %float_n0_00175398286 %float_0_000497855421 %float_n0_00118719367 %float_0_000773590698 %float_n0_00134037994 %float_0_000268075994 %float_n0_00147824758 %float_n0_00013020834 %float_n0_000773590698 %float_0_00130974269 %float_0_000390625006 %float_0_000957414217 %float_n0_000467218139 %float_n0_00153952208 %float_0_00103400741 %float_n0_000681678939 %float_0_00167738972 %float_0_00100337015 %float_n0_000421262259 %float_0_00178462011 %float_n0_000237438726 %float_n0_000620404433 %float_0_0016620711 %float_0_000834865205 %float_n0_0017233456 %float_n0_00107996329 %float_0_00176930148 %float_n0_000788909325 %float_n0_00178462011 %float_0_000681678939 %float_n0_000988051528 %float_n0_00132506131 %float_n0_00017616422 %float_n0_00150888483 %float_0_0003293505 %float_n0_001953125 %float_0_000666360313 %float_n0_00161611522 %float_0_00115655642 %float_0_000451899512 %float_n0_000436580885 %float_0_000191482846 %float_n0_0014935662 %float_0_00114123779 %float_8_42524532en05 %float_0_00189185049 %float_0_00140165444 %float_0_000559129927 %float_0_000114889706 %float_0_00126378681 %float_n0_000574448553 %float_n0_000972732843 %float_0_00132506131 %float_0_000222120099 %float_n0_000758272072 %float_n0_00135569857 %float_0_00146292895 %float_0_000865502458 %float_n0_000359987753 %float_0_0005438113 %float_n0_00112591917 %float_n0_000252757367 %float_n0_000559129927 %float_n0_00181525736 %float_0_0017233456 %float_n0_00115655642 %float_0_000742953445 %float_0_00157015934 %float_n0_000114889706 %float_n0_00121783093 %float_0_00183057599 %float_2_29779416en05 %float_n0_00192248775 %float_0_00173866423 %float_n0_000712316192 %float_0_00155484071 %float_n0_00170802698 %float_0_00123314955 %float_0_000206801473 %float_0_00104932603 %float_n0_000727634819 %float_n0_00163143384 %float_n0_000314031873 %float_0_000482536765 %float_n0_00179993873 %float_0_00094209559 %float_n0_000344669126 %float_0_000696997566 %float_n0_00101868878 %float_n0_00157015934 %float_n2_29779416en05 %float_n0_00127910543 %float_0_000804227951 %float_n0_000896139711 %float_n0_0014322917 %float_0_000605085806 %float_n8_42524532en05 %float_0_000911458337 %float_0_001953125 %float_n0_00140165444 %float_n0_00063572306 %float_0_00150888483 %float_n0_000819546578 %float_0_00124846818 %float_0_000252757367 %float_0_00152420346 %float_0_00112591917 %float_0_000359987753 %float_n0_000390625006 %float_0_00190716912 %float_0_00138633582 %float_n0_00111060054 %float_0_00161611522 %float_n0_000880821084 %float_0_000145526967 %float_0_00107996329 %float_n5_36151965en05 %float_0_00028339462 %float_n0_00169270835 %float_n0_00126378681 %float_n0_000513174047 %float_n0_000160845593 %float_n0_00187653187 %float_n0_000834865205 %float_0_00063572306 %float_7_65931418en06 %float_n0_00190716912 %float_n0_000222120099 %float_0_000375306379 %float_n0_00173866423 %float_n0_000405943632 %float_n0_00123314955 %float_0_00170802698 %float_n0_00094209559 %float_0_000819546578 %float_0_00184589461 %float_0_000467218139\n     %uint_1 = OpConstant %uint 1\n    %uint_16 = OpConstant %uint 16\n%_ptr_Function__arr_float_uint_256 = OpTypePointer Function %_arr_float_uint_256\n    %v4float = OpTypeVector %float 4\n%_ptr_Input_v4float = OpTypePointer Input %v4float\n%gl_FragCoord = OpVariable %_ptr_Input_v4float Input\n    %v2float = OpTypeVector %float 2\n%push_const_block_xe = OpTypeStruct %v2int %float\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n      %int_0 = OpConstant %int 0\n%_ptr_PushConstant_v2int = OpTypePointer PushConstant %v2int\n      %int_1 = OpConstant %int 1\n%_ptr_PushConstant_float = OpTypePointer PushConstant %float\n%_ptr_Output_v4float = OpTypePointer Output %v4float\n%xe_cas_color = OpVariable %_ptr_Output_v4float Output\n%uint_532432441 = OpConstant %uint 532432441\n%uint_2129690299 = OpConstant %uint 2129690299\n%uint_2129764351 = OpConstant %uint 2129764351\n    %float_2 = OpConstant %float 2\n        %151 = OpTypeImage %float 2D 0 0 0 1 Unknown\n%_ptr_UniformConstant_151 = OpTypePointer UniformConstant %151\n%xe_cas_source = OpVariable %_ptr_UniformConstant_151 UniformConstant\n     %int_n1 = OpConstant %int -1\n       %1803 = OpConstantComposite %v2int %int_0 %int_n1\n       %1806 = OpConstantComposite %v2int %int_n1 %int_0\n       %1824 = OpConstantComposite %v2int %int_1 %int_0\n       %1827 = OpConstantComposite %v2int %int_0 %int_1\n    %float_4 = OpConstant %float 4\n       %2122 = OpConstantComposite %v2uint %uint_15 %uint_15\n       %2604 = OpConstantComposite %v3float %float_0 %float_0 %float_0\n       %2582 = OpConstantComposite %v3float %float_1 %float_1 %float_1\n          %2 = OpUndef %v4float\n       %main = OpFunction %void None %1282\n      %24953 = OpLabel\n      %18411 = OpVariable %_ptr_Function__arr_float_uint_256 Function\n      %22087 = OpLoad %v4float %gl_FragCoord\n       %6562 = OpVectorShuffle %v2float %22087 %22087 0 1\n      %17656 = OpConvertFToS %v2int %6562\n      %19279 = OpAccessChain %_ptr_PushConstant_v2int %push_consts_xe %int_0\n      %22822 = OpLoad %v2int %19279\n      %23312 = OpISub %v2int %17656 %22822\n       %9938 = OpBitcast %v2uint %23312\n      %20997 = OpAccessChain %_ptr_PushConstant_float %push_consts_xe %int_1\n      %22237 = OpLoad %float %20997\n      %16454 = OpBitcast %uint %22237\n       %6990 = OpBitcast %v2int %9938\n      %14365 = OpIAdd %v2int %6990 %1803\n      %23057 = OpLoad %151 %xe_cas_source\n      %19459 = OpImageFetch %v4float %23057 %14365 Lod %int_0\n      %13347 = OpIAdd %v2int %6990 %1806\n      %14538 = OpLoad %151 %xe_cas_source\n      %12625 = OpImageFetch %v4float %14538 %13347 Lod %int_0\n      %10421 = OpLoad %151 %xe_cas_source\n      %15444 = OpImageFetch %v4float %10421 %6990 Lod %int_0\n      %13348 = OpIAdd %v2int %6990 %1824\n      %15811 = OpLoad %151 %xe_cas_source\n      %19460 = OpImageFetch %v4float %15811 %13348 Lod %int_0\n      %13349 = OpIAdd %v2int %6990 %1827\n      %14918 = OpLoad %151 %xe_cas_source\n       %8899 = OpImageFetch %v4float %14918 %13349 Lod %int_0\n      %19729 = OpCompositeExtract %float %19459 0\n       %7025 = OpCompositeExtract %float %19459 1\n      %18723 = OpCompositeExtract %float %19459 2\n      %24863 = OpFMul %float %19729 %19729\n      %16184 = OpFMul %float %7025 %7025\n       %9305 = OpFMul %float %18723 %18723\n      %22236 = OpCompositeExtract %float %12625 0\n      %11844 = OpCompositeExtract %float %12625 1\n      %18724 = OpCompositeExtract %float %12625 2\n      %24864 = OpFMul %float %22236 %22236\n      %16185 = OpFMul %float %11844 %11844\n       %9306 = OpFMul %float %18724 %18724\n      %22238 = OpCompositeExtract %float %15444 0\n      %11845 = OpCompositeExtract %float %15444 1\n      %18725 = OpCompositeExtract %float %15444 2\n      %24865 = OpFMul %float %22238 %22238\n      %16186 = OpFMul %float %11845 %11845\n       %9307 = OpFMul %float %18725 %18725\n      %22239 = OpCompositeExtract %float %19460 0\n      %11846 = OpCompositeExtract %float %19460 1\n      %18726 = OpCompositeExtract %float %19460 2\n      %24866 = OpFMul %float %22239 %22239\n      %16187 = OpFMul %float %11846 %11846\n       %9308 = OpFMul %float %18726 %18726\n      %22240 = OpCompositeExtract %float %8899 0\n      %11847 = OpCompositeExtract %float %8899 1\n      %18727 = OpCompositeExtract %float %8899 2\n      %24867 = OpFMul %float %22240 %22240\n      %14910 = OpFMul %float %11847 %11847\n       %8590 = OpFMul %float %18727 %18727\n      %10877 = OpExtInst %float %1 FMin %16186 %16187\n       %9276 = OpExtInst %float %1 FMin %16185 %10877\n      %15951 = OpExtInst %float %1 FMin %16184 %14910\n      %10905 = OpExtInst %float %1 FMin %9276 %15951\n      %24296 = OpExtInst %float %1 FMax %16186 %16187\n      %17523 = OpExtInst %float %1 FMax %16185 %24296\n      %23939 = OpExtInst %float %1 FMax %16184 %14910\n      %21101 = OpExtInst %float %1 FMax %17523 %23939\n       %8181 = OpBitcast %uint %21101\n       %8951 = OpISub %uint %uint_2129690299 %8181\n       %6465 = OpBitcast %float %8951\n      %24131 = OpFSub %float %float_1 %21101\n      %23324 = OpExtInst %float %1 FMin %10905 %24131\n      %22903 = OpFMul %float %23324 %6465\n      %20683 = OpExtInst %float %1 FClamp %22903 %float_0 %float_1\n      %24011 = OpBitcast %uint %20683\n      %22090 = OpShiftRightLogical %uint %24011 %uint_1\n      %23229 = OpIAdd %uint %22090 %uint_532432441\n      %21692 = OpBitcast %float %23229\n      %19558 = OpBitcast %float %16454\n      %18803 = OpFMul %float %21692 %19558\n      %23316 = OpFMul %float %float_4 %18803\n      %16498 = OpFAdd %float %float_1 %23316\n       %6551 = OpBitcast %uint %16498\n       %7563 = OpISub %uint %uint_2129764351 %6551\n       %9419 = OpBitcast %float %7563\n       %9130 = OpFNegate %float %9419\n      %12367 = OpFMul %float %9130 %16498\n      %16540 = OpFAdd %float %12367 %float_2\n       %9366 = OpFMul %float %9419 %16540\n      %18845 = OpFAdd %float %24863 %24864\n      %23143 = OpFAdd %float %18845 %24866\n       %6535 = OpFAdd %float %23143 %24867\n      %12673 = OpFMul %float %18803 %6535\n      %15973 = OpFAdd %float %12673 %24865\n       %8137 = OpFMul %float %15973 %9366\n      %15142 = OpExtInst %float %1 FClamp %8137 %float_0 %float_1\n      %13381 = OpFAdd %float %16184 %16185\n      %12943 = OpFAdd %float %13381 %16187\n       %6536 = OpFAdd %float %12943 %14910\n      %12674 = OpFMul %float %18803 %6536\n      %15974 = OpFAdd %float %12674 %16186\n       %8138 = OpFMul %float %15974 %9366\n      %15143 = OpExtInst %float %1 FClamp %8138 %float_0 %float_1\n      %13382 = OpFAdd %float %9305 %9306\n      %12944 = OpFAdd %float %13382 %9308\n       %6537 = OpFAdd %float %12944 %8590\n      %12675 = OpFMul %float %18803 %6537\n      %15975 = OpFAdd %float %12675 %9307\n       %7244 = OpFMul %float %15975 %9366\n      %22380 = OpExtInst %float %1 FClamp %7244 %float_0 %float_1\n      %24270 = OpCompositeInsert %v4float %15142 %2 0\n      %11074 = OpCompositeInsert %v4float %15143 %24270 1\n      %14933 = OpCompositeInsert %v4float %22380 %11074 2\n      %12955 = OpVectorShuffle %v3float %14933 %14933 0 1 2\n       %6471 = OpExtInst %v3float %1 Sqrt %12955\n      %22742 = OpCompositeExtract %float %6471 0\n      %19769 = OpCompositeInsert %v4float %22742 %2 0\n      %19852 = OpCompositeExtract %float %6471 1\n      %16135 = OpCompositeInsert %v4float %19852 %19769 1\n      %19814 = OpCompositeExtract %float %6471 2\n      %18704 = OpCompositeInsert %v4float %19814 %16135 2\n      %15997 = OpVectorShuffle %v3float %18704 %18704 0 1 2\n      %12552 = OpBitwiseAnd %v2uint %9938 %2122\n       %9741 = OpCompositeExtract %uint %12552 1\n      %21498 = OpIMul %uint %9741 %uint_16\n      %23411 = OpCompositeExtract %uint %12552 0\n      %12610 = OpIAdd %uint %21498 %23411\n               OpStore %18411 %2242\n       %9958 = OpAccessChain %_ptr_Function_float %18411 %12610\n      %25140 = OpLoad %float %9958\n      %18028 = OpCompositeConstruct %v3float %25140 %25140 %25140\n      %21458 = OpFAdd %v3float %15997 %18028\n      %19525 = OpExtInst %v3float %1 FClamp %21458 %2604 %2582\n      %16777 = OpCompositeExtract %float %19525 0\n      %19708 = OpCompositeExtract %float %19525 1\n       %7472 = OpCompositeExtract %float %19525 2\n      %22408 = OpCompositeConstruct %v4float %16777 %19708 %7472 %float_1\n               OpStore %xe_cas_color %22408\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t guest_output_ffx_cas_sharpen_dither_ps[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006235, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0007000F, 0x00000004,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000C93, 0x000014D6, 0x00030010,\n    0x0000161F, 0x00000007, 0x00030003, 0x00000002, 0x000001CC, 0x00090004,\n    0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F, 0x5F776F6C, 0x72747461,\n    0x74756269, 0x00007365, 0x000B0004, 0x455F4C47, 0x735F5458, 0x6C706D61,\n    0x656C7265, 0x745F7373, 0x75747865, 0x665F6572, 0x74636E75, 0x736E6F69,\n    0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F, 0x70635F45, 0x74735F70,\n    0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365, 0x00006576, 0x00080004,\n    0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63, 0x69645F65, 0x74636572,\n    0x00657669, 0x00040005, 0x0000161F, 0x6E69616D, 0x00000000, 0x00060005,\n    0x00000C93, 0x465F6C67, 0x43676172, 0x64726F6F, 0x00000000, 0x00070005,\n    0x000003F2, 0x68737570, 0x6E6F635F, 0x625F7473, 0x6B636F6C, 0x0065785F,\n    0x00090006, 0x000003F2, 0x00000000, 0x635F6578, 0x6F5F7361, 0x75707475,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000A0006, 0x000003F2, 0x00000001,\n    0x635F6578, 0x735F7361, 0x70726168, 0x7373656E, 0x736F705F, 0x65735F74,\n    0x00707574, 0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473,\n    0x00006578, 0x00060005, 0x000014D6, 0x635F6578, 0x635F7361, 0x726F6C6F,\n    0x00000000, 0x00060005, 0x0000142B, 0x635F6578, 0x735F7361, 0x6372756F,\n    0x00000065, 0x00040047, 0x00000C93, 0x0000000B, 0x0000000F, 0x00030047,\n    0x000003F2, 0x00000002, 0x00050048, 0x000003F2, 0x00000000, 0x00000023,\n    0x00000010, 0x00050048, 0x000003F2, 0x00000001, 0x00000023, 0x00000018,\n    0x00040047, 0x000014D6, 0x0000001E, 0x00000000, 0x00040047, 0x0000142B,\n    0x00000021, 0x00000000, 0x00040047, 0x0000142B, 0x00000022, 0x00000000,\n    0x00020013, 0x00000008, 0x00030021, 0x00000502, 0x00000008, 0x00030016,\n    0x0000000D, 0x00000020, 0x00040020, 0x0000028A, 0x00000007, 0x0000000D,\n    0x00040017, 0x00000018, 0x0000000D, 0x00000003, 0x00040015, 0x0000000B,\n    0x00000020, 0x00000000, 0x00040017, 0x00000011, 0x0000000B, 0x00000002,\n    0x00040015, 0x0000000C, 0x00000020, 0x00000001, 0x00040017, 0x00000012,\n    0x0000000C, 0x00000002, 0x0004002B, 0x0000000D, 0x00000A0C, 0x00000000,\n    0x0004002B, 0x0000000D, 0x0000008A, 0x3F800000, 0x0004002B, 0x0000000B,\n    0x00000A37, 0x0000000F, 0x0004002B, 0x0000000B, 0x00000147, 0x00000100,\n    0x0004001C, 0x000003FB, 0x0000000D, 0x00000147, 0x0004002B, 0x0000000D,\n    0x0000010F, 0xBA838384, 0x0004002B, 0x0000000D, 0x00000728, 0x3A66E6E7,\n    0x0004002B, 0x0000000D, 0x00000705, 0x3ADDDDDE, 0x0004002B, 0x0000000D,\n    0x00000A5A, 0xBACBCBCC, 0x0004002B, 0x0000000D, 0x000008DF, 0x3AA7A7A8,\n    0x0004002B, 0x0000000D, 0x00000094, 0xBA1E9E9F, 0x0004002B, 0x0000000D,\n    0x0000034C, 0x3A8B8B8C, 0x0004002B, 0x0000000D, 0x0000087E, 0xBAB5B5B6,\n    0x0004002B, 0x0000000D, 0x0000034D, 0x3AB1B1B2, 0x0004002B, 0x0000000D,\n    0x00000687, 0x3A068687, 0x0004002B, 0x0000000D, 0x000003EB, 0x3A9F9FA0,\n    0x0004002B, 0x0000000D, 0x0000024E, 0xBAD1D1D2, 0x0004002B, 0x0000000D,\n    0x00000726, 0x3A1A9A9B, 0x0004002B, 0x0000000D, 0x00000698, 0xB9949495,\n    0x0004002B, 0x0000000D, 0x00000703, 0x3A919192, 0x0004002B, 0x0000000D,\n    0x00000AF8, 0xBAB9B9BA, 0x0004002B, 0x0000000D, 0x00000ABB, 0x3ABDBDBE,\n    0x0004002B, 0x0000000D, 0x0000026F, 0xBA0E8E8F, 0x0004002B, 0x0000000D,\n    0x000008A8, 0x39088889, 0x0004002B, 0x0000000D, 0x00000565, 0xBA9D9D9E,\n    0x0004002B, 0x0000000D, 0x0000065D, 0x39E4E4E5, 0x0004002B, 0x0000000D,\n    0x000004C6, 0xBA89898A, 0x0004002B, 0x0000000D, 0x00000057, 0x3A22A2A3,\n    0x0004002B, 0x0000000D, 0x0000006A, 0xB9FCFCFD, 0x0004002B, 0x0000000D,\n    0x00000A1E, 0x3AF5F5F6, 0x0004002B, 0x0000000D, 0x0000087D, 0xBA8F8F90,\n    0x0004002B, 0x0000000D, 0x00000959, 0xB8D0D0D1, 0x0004002B, 0x0000000D,\n    0x00000BB8, 0xBA0A8A8B, 0x0004002B, 0x0000000D, 0x0000097E, 0x3ABBBBBC,\n    0x0004002B, 0x0000000D, 0x00000606, 0xBAFDFDFE, 0x0004002B, 0x0000000D,\n    0x000003AD, 0xBA36B6B7, 0x0004002B, 0x0000000D, 0x000000E2, 0x3820A0A1,\n    0x0004002B, 0x0000000D, 0x00000370, 0x3A3ABABB, 0x0004002B, 0x0000000D,\n    0x0000024D, 0xBAABABAC, 0x0004002B, 0x0000000D, 0x000005C6, 0x3A8F8F90,\n    0x0004002B, 0x0000000D, 0x00000B8C, 0xB99C9C9D, 0x0004002B, 0x0000000D,\n    0x00000036, 0x3AE5E5E6, 0x0004002B, 0x0000000D, 0x0000087F, 0xBADBDBDC,\n    0x0004002B, 0x0000000D, 0x00000172, 0x3AC1C1C2, 0x0004002B, 0x0000000D,\n    0x00000399, 0xB820A0A1, 0x0004002B, 0x0000000D, 0x0000040F, 0x3A4ECECF,\n    0x0004002B, 0x0000000D, 0x0000091E, 0xBAEFEFF0, 0x0004002B, 0x0000000D,\n    0x000008D5, 0x399C9C9D, 0x0004002B, 0x0000000D, 0x000008DE, 0x3A818182,\n    0x0004002B, 0x0000000D, 0x000002EB, 0xBA99999A, 0x0004002B, 0x0000000D,\n    0x00000317, 0x3938B8B9, 0x0004002B, 0x0000000D, 0x0000034E, 0x3AD7D7D8,\n    0x0004002B, 0x0000000D, 0x00000111, 0xBACFCFD0, 0x0004002B, 0x0000000D,\n    0x0000002B, 0x39B4B4B5, 0x0004002B, 0x0000000D, 0x000008E1, 0x3AF3F3F4,\n    0x0004002B, 0x0000000D, 0x0000042A, 0xBAE7E7E8, 0x0004002B, 0x0000000D,\n    0x00000765, 0xBA62E2E3, 0x0004002B, 0x0000000D, 0x000009A2, 0x3A6AEAEB,\n    0x0004002B, 0x0000000D, 0x000004F2, 0x3928A8A9, 0x0004002B, 0x0000000D,\n    0x0000058A, 0xBA72F2F3, 0x0004002B, 0x0000000D, 0x000007E0, 0xBAC7C7C8,\n    0x0004002B, 0x0000000D, 0x00000802, 0xBA2AAAAB, 0x0004002B, 0x0000000D,\n    0x00000A1C, 0x3AA9A9AA, 0x0004002B, 0x0000000D, 0x00000940, 0xBA52D2D3,\n    0x0004002B, 0x0000000D, 0x000002EC, 0xBABFBFC0, 0x0004002B, 0x0000000D,\n    0x000003ED, 0x3AEBEBEC, 0x0004002B, 0x0000000D, 0x000004EB, 0xBA5EDEDF,\n    0x0004002B, 0x0000000D, 0x00000234, 0x3A5EDEDF, 0x0004002B, 0x0000000D,\n    0x00000245, 0xB9ECECED, 0x0004002B, 0x0000000D, 0x00000603, 0xBA8B8B8C,\n    0x0004002B, 0x0000000D, 0x00000984, 0xB9189899, 0x0004002B, 0x0000000D,\n    0x0000076E, 0x3978F8F9, 0x0004002B, 0x0000000D, 0x00000841, 0x3AB9B9BA,\n    0x0004002B, 0x0000000D, 0x000009DD, 0xBA1A9A9B, 0x0004002B, 0x0000000D,\n    0x000003F3, 0xB948C8C9, 0x0004002B, 0x0000000D, 0x00000B5A, 0x3AD1D1D2,\n    0x0004002B, 0x0000000D, 0x00000B58, 0x3A858586, 0x0004002B, 0x0000000D,\n    0x00000838, 0x39D4D4D5, 0x0004002B, 0x0000000D, 0x00000218, 0xB958D8D9,\n    0x0004002B, 0x0000000D, 0x00000A1D, 0x3ACFCFD0, 0x0004002B, 0x0000000D,\n    0x0000054B, 0x3A2AAAAB, 0x0004002B, 0x0000000D, 0x00000503, 0xB8909091,\n    0x0004002B, 0x0000000D, 0x00000169, 0x39DCDCDD, 0x0004002B, 0x0000000D,\n    0x00000605, 0xBAD7D7D8, 0x0004002B, 0x0000000D, 0x0000048A, 0x3AB3B3B4,\n    0x0004002B, 0x0000000D, 0x000002D3, 0x3A72F2F3, 0x0004002B, 0x0000000D,\n    0x00000A7C, 0xBA2EAEAF, 0x0004002B, 0x0000000D, 0x00000171, 0x3A9B9B9C,\n    0x0004002B, 0x0000000D, 0x000001AF, 0xBABDBDBE, 0x0004002B, 0x0000000D,\n    0x000004AC, 0x3A169697, 0x0004002B, 0x0000000D, 0x0000024F, 0xBAF7F7F8,\n    0x0004002B, 0x0000000D, 0x00000ADE, 0x3A46C6C7, 0x0004002B, 0x0000000D,\n    0x00000110, 0xBAA9A9AA, 0x0004002B, 0x0000000D, 0x00000212, 0x3AFBFBFC,\n    0x0004002B, 0x0000000D, 0x00000742, 0xBAD9D9DA, 0x0004002B, 0x0000000D,\n    0x00000389, 0xBA878788, 0x0004002B, 0x0000000D, 0x000006C4, 0xBA028283,\n    0x0004002B, 0x0000000D, 0x00000B98, 0xBAF3F3F4, 0x0004002B, 0x0000000D,\n    0x000002AE, 0x3A9D9D9E, 0x0004002B, 0x0000000D, 0x000009B1, 0xB9ACACAD,\n    0x0004002B, 0x0000000D, 0x00000741, 0xBAB3B3B4, 0x0004002B, 0x0000000D,\n    0x00000211, 0x3AD5D5D6, 0x0004002B, 0x0000000D, 0x00000A5B, 0xBAF1F1F2,\n    0x0004002B, 0x0000000D, 0x000005EA, 0x3A3EBEBF, 0x0004002B, 0x0000000D,\n    0x00000310, 0xBA6EEEEF, 0x0004002B, 0x0000000D, 0x0000052A, 0x3AEDEDEE,\n    0x0004002B, 0x0000000D, 0x00000071, 0xBA959596, 0x0004002B, 0x0000000D,\n    0x00000107, 0xB9C4C4C5, 0x0004002B, 0x0000000D, 0x000006A2, 0x38D0D0D1,\n    0x0004002B, 0x0000000D, 0x00000B1B, 0xBA42C2C3, 0x0004002B, 0x0000000D,\n    0x00000034, 0x3A99999A, 0x0004002B, 0x0000000D, 0x0000024B, 0x38909091,\n    0x0004002B, 0x0000000D, 0x000002AF, 0x3AC3C3C4, 0x0004002B, 0x0000000D,\n    0x00000A41, 0x3A7EFEFF, 0x0004002B, 0x0000000D, 0x00000A7E, 0xBA7AFAFB,\n    0x0004002B, 0x0000000D, 0x0000034F, 0x3AFDFDFE, 0x0004002B, 0x0000000D,\n    0x00000901, 0x3A0A8A8B, 0x0004002B, 0x0000000D, 0x00000539, 0x3860E0E1,\n    0x0004002B, 0x0000000D, 0x0000091C, 0xBAA3A3A4, 0x0004002B, 0x0000000D,\n    0x000001A4, 0xB98C8C8D, 0x0004002B, 0x0000000D, 0x00000666, 0x3AC9C9CA,\n    0x0004002B, 0x0000000D, 0x00000833, 0xB7008081, 0x0004002B, 0x0000000D,\n    0x00000206, 0x39A4A4A5, 0x0004002B, 0x0000000D, 0x00000210, 0x3AAFAFB0,\n    0x0004002B, 0x0000000D, 0x000002ED, 0xBAE5E5E6, 0x0004002B, 0x0000000D,\n    0x0000040D, 0x3A028283, 0x0004002B, 0x0000000D, 0x00000428, 0xBA9B9B9C,\n    0x0004002B, 0x0000000D, 0x00000195, 0x3A4ACACB, 0x0004002B, 0x0000000D,\n    0x000004C7, 0xBAAFAFB0, 0x0004002B, 0x0000000D, 0x00000AB0, 0x398C8C8D,\n    0x0004002B, 0x0000000D, 0x00000429, 0xBAC1C1C2, 0x0004002B, 0x0000000D,\n    0x00000B5F, 0xB9088889, 0x0004002B, 0x0000000D, 0x0000044C, 0xBA4ACACB,\n    0x0004002B, 0x0000000D, 0x00000B59, 0x3AABABAC, 0x0004002B, 0x0000000D,\n    0x00000344, 0x39CCCCCD, 0x0004002B, 0x0000000D, 0x000007C7, 0x3A7AFAFB,\n    0x0004002B, 0x0000000D, 0x00000739, 0xB9F4F4F5, 0x0004002B, 0x0000000D,\n    0x0000091D, 0xBAC9C9CA, 0x0004002B, 0x0000000D, 0x000000D2, 0x3A878788,\n    0x0004002B, 0x0000000D, 0x00000133, 0xBA32B2B3, 0x0004002B, 0x0000000D,\n    0x000005C8, 0x3ADBDBDC, 0x0004002B, 0x0000000D, 0x00000A1B, 0x3A838384,\n    0x0004002B, 0x0000000D, 0x00000420, 0xB9DCDCDD, 0x0004002B, 0x0000000D,\n    0x000002B0, 0x3AE9E9EA, 0x0004002B, 0x0000000D, 0x00000A25, 0xB978F8F9,\n    0x0004002B, 0x0000000D, 0x0000030E, 0xBA22A2A3, 0x0004002B, 0x0000000D,\n    0x0000048B, 0x3AD9D9DA, 0x0004002B, 0x0000000D, 0x00000B7D, 0x3A5ADADB,\n    0x0004002B, 0x0000000D, 0x00000073, 0xBAE1E1E2, 0x0004002B, 0x0000000D,\n    0x00000740, 0xBA8D8D8E, 0x0004002B, 0x0000000D, 0x00000173, 0x3AE7E7E8,\n    0x0004002B, 0x0000000D, 0x000006C6, 0xBA4ECECF, 0x0004002B, 0x0000000D,\n    0x00000567, 0xBAE9E9EA, 0x0004002B, 0x0000000D, 0x00000A3F, 0x3A32B2B3,\n    0x0004002B, 0x0000000D, 0x00000B95, 0xBA818182, 0x0004002B, 0x0000000D,\n    0x0000038A, 0xBAADADAE, 0x0004002B, 0x0000000D, 0x000005CE, 0xB938B8B9,\n    0x0004002B, 0x0000000D, 0x000006A3, 0xBAC5C5C6, 0x0004002B, 0x0000000D,\n    0x000006FA, 0x39ACACAD, 0x0004002B, 0x0000000D, 0x00000743, 0xBB000000,\n    0x0004002B, 0x0000000D, 0x000007C5, 0x3A2EAEAF, 0x0004002B, 0x0000000D,\n    0x0000038B, 0xBAD3D3D4, 0x0004002B, 0x0000000D, 0x00000ABA, 0x3A979798,\n    0x0004002B, 0x0000000D, 0x00000B51, 0x39ECECED, 0x0004002B, 0x0000000D,\n    0x00000914, 0xB9E4E4E5, 0x0004002B, 0x0000000D, 0x0000013C, 0x3948C8C9,\n    0x0004002B, 0x0000000D, 0x00000566, 0xBAC3C3C4, 0x0004002B, 0x0000000D,\n    0x0000097D, 0x3A959596, 0x0004002B, 0x0000000D, 0x00000A58, 0x38B0B0B1,\n    0x0004002B, 0x0000000D, 0x00000B5B, 0x3AF7F7F8, 0x0004002B, 0x0000000D,\n    0x00000704, 0x3AB7B7B8, 0x0004002B, 0x0000000D, 0x00000232, 0x3A129293,\n    0x0004002B, 0x0000000D, 0x000002EE, 0x38F0F0F1, 0x0004002B, 0x0000000D,\n    0x000007A2, 0x3AA5A5A6, 0x0004002B, 0x0000000D, 0x00000763, 0xBA169697,\n    0x0004002B, 0x0000000D, 0x00000135, 0xBA7EFEFF, 0x0004002B, 0x0000000D,\n    0x000000D3, 0x3AADADAE, 0x0004002B, 0x0000000D, 0x00000949, 0x3968E8E9,\n    0x0004002B, 0x0000000D, 0x000001D2, 0xBA46C6C7, 0x0004002B, 0x0000000D,\n    0x00000604, 0xBAB1B1B2, 0x0004002B, 0x0000000D, 0x00000035, 0x3ABFBFC0,\n    0x0004002B, 0x0000000D, 0x000004AE, 0x3A62E2E3, 0x0004002B, 0x0000000D,\n    0x000007D6, 0xB9BCBCBD, 0x0004002B, 0x0000000D, 0x00000B7B, 0x3A0E8E8F,\n    0x0004002B, 0x0000000D, 0x00000AF7, 0xBA939394, 0x0004002B, 0x0000000D,\n    0x00000873, 0xB9848485, 0x0004002B, 0x0000000D, 0x000004E9, 0xBA129293,\n    0x0004002B, 0x0000000D, 0x000007E1, 0xBAEDEDEE, 0x0004002B, 0x0000000D,\n    0x0000097F, 0x3AE1E1E2, 0x0004002B, 0x0000000D, 0x000001AE, 0xBA979798,\n    0x0004002B, 0x0000000D, 0x00000864, 0x3A42C2C3, 0x0004002B, 0x0000000D,\n    0x000008E0, 0x3ACDCDCE, 0x0004002B, 0x0000000D, 0x000005A3, 0xB8F0F0F1,\n    0x0004002B, 0x0000000D, 0x000006A4, 0xBA9F9FA0, 0x0004002B, 0x0000000D,\n    0x00000667, 0x3AEFEFF0, 0x0004002B, 0x0000000D, 0x00000961, 0x37C0C0C1,\n    0x0004002B, 0x0000000D, 0x000004C9, 0xBAFBFBFC, 0x0004002B, 0x0000000D,\n    0x00000ABC, 0x3AE3E3E4, 0x0004002B, 0x0000000D, 0x00000627, 0xBA3ABABB,\n    0x0004002B, 0x0000000D, 0x000007A3, 0x3ACBCBCC, 0x0004002B, 0x0000000D,\n    0x00000AF9, 0xBADFDFE0, 0x0004002B, 0x0000000D, 0x00000528, 0x3AA1A1A2,\n    0x0004002B, 0x0000000D, 0x00000B24, 0x3958D8D9, 0x0004002B, 0x0000000D,\n    0x0000020F, 0x3A89898A, 0x0004002B, 0x0000000D, 0x000008A1, 0xBA3EBEBF,\n    0x0004002B, 0x0000000D, 0x000004C8, 0xBAD5D5D6, 0x0004002B, 0x0000000D,\n    0x000004BD, 0xB9A4A4A5, 0x0004002B, 0x0000000D, 0x00000976, 0x39FCFCFD,\n    0x0004002B, 0x0000000D, 0x000006A5, 0xBAEBEBEC, 0x0004002B, 0x0000000D,\n    0x0000054D, 0x3A76F6F7, 0x0004002B, 0x0000000D, 0x000002E2, 0xB9B4B4B5,\n    0x0004002B, 0x0000000D, 0x000000F6, 0x3A36B6B7, 0x0004002B, 0x0000000D,\n    0x0000024C, 0xBA858586, 0x0004002B, 0x0000000D, 0x00000B97, 0xBACDCDCE,\n    0x0004002B, 0x0000000D, 0x00000055, 0xB7C0C0C1, 0x0004002B, 0x0000000D,\n    0x00000B96, 0xBAA7A7A8, 0x0004002B, 0x0000000D, 0x00000689, 0x3A52D2D3,\n    0x0004002B, 0x0000000D, 0x00000096, 0xBA6AEAEB, 0x0004002B, 0x0000000D,\n    0x00000072, 0xBABBBBBC, 0x0004002B, 0x0000000D, 0x000009A0, 0x3A1E9E9F,\n    0x0004002B, 0x0000000D, 0x0000014C, 0xB8B0B0B1, 0x0004002B, 0x0000000D,\n    0x00000059, 0x3A6EEEEF, 0x0004002B, 0x0000000D, 0x0000048C, 0x3B000000,\n    0x0004002B, 0x0000000D, 0x000009BB, 0xBAB7B7B8, 0x0004002B, 0x0000000D,\n    0x00000588, 0xBA26A6A7, 0x0004002B, 0x0000000D, 0x000003EC, 0x3AC5C5C6,\n    0x0004002B, 0x0000000D, 0x00000BBA, 0xBA56D6D7, 0x0004002B, 0x0000000D,\n    0x00000665, 0x3AA3A3A4, 0x0004002B, 0x0000000D, 0x000005BC, 0x39848485,\n    0x0004002B, 0x0000000D, 0x00000529, 0x3AC7C7C8, 0x0004002B, 0x0000000D,\n    0x00000840, 0x3A939394, 0x0004002B, 0x0000000D, 0x0000051F, 0x39BCBCBD,\n    0x0004002B, 0x0000000D, 0x000005FB, 0xB9CCCCCD, 0x0004002B, 0x0000000D,\n    0x000000D5, 0x3AF9F9FA, 0x0004002B, 0x0000000D, 0x000005C7, 0x3AB5B5B6,\n    0x0004002B, 0x0000000D, 0x000009BA, 0xBA919192, 0x0004002B, 0x0000000D,\n    0x000000D4, 0x3AD3D3D4, 0x0004002B, 0x0000000D, 0x000009DF, 0xBA66E6E7,\n    0x0004002B, 0x0000000D, 0x000006CD, 0x39189899, 0x0004002B, 0x0000000D,\n    0x00000489, 0x3A8D8D8E, 0x0004002B, 0x0000000D, 0x000007F0, 0xB860E0E1,\n    0x0004002B, 0x0000000D, 0x000003E1, 0x39949495, 0x0004002B, 0x0000000D,\n    0x000009BC, 0xBADDDDDE, 0x0004002B, 0x0000000D, 0x00000A59, 0xBAA5A5A6,\n    0x0004002B, 0x0000000D, 0x0000093E, 0xBA068687, 0x0004002B, 0x0000000D,\n    0x000007A9, 0xB928A8A9, 0x0004002B, 0x0000000D, 0x00000112, 0xBAF5F5F6,\n    0x0004002B, 0x0000000D, 0x00000271, 0xBA5ADADB, 0x0004002B, 0x0000000D,\n    0x000002D1, 0x3A26A6A7, 0x0004002B, 0x0000000D, 0x0000057C, 0x37008081,\n    0x0004002B, 0x0000000D, 0x0000038C, 0xBAF9F9FA, 0x0004002B, 0x0000000D,\n    0x0000003D, 0xB968E8E9, 0x0004002B, 0x0000000D, 0x00000A13, 0x39C4C4C5,\n    0x0004002B, 0x0000000D, 0x000001B0, 0xBAE3E3E4, 0x0004002B, 0x0000000D,\n    0x00000AEF, 0xB9D4D4D5, 0x0004002B, 0x0000000D, 0x000007DF, 0xBAA1A1A2,\n    0x0004002B, 0x0000000D, 0x00000842, 0x3ADFDFE0, 0x0004002B, 0x0000000D,\n    0x00000804, 0xBA76F6F7, 0x0004002B, 0x0000000D, 0x00000903, 0x3A56D6D7,\n    0x0004002B, 0x0000000D, 0x000007A4, 0x3AF1F1F2, 0x0004002B, 0x0000000D,\n    0x00000482, 0x39F4F4F5, 0x0103002C, 0x000003FB, 0x000008C2, 0x0000010F,\n    0x00000728, 0x00000705, 0x00000A5A, 0x000008DF, 0x00000094, 0x0000034C,\n    0x0000087E, 0x0000034D, 0x00000687, 0x000003EB, 0x0000024E, 0x00000726,\n    0x00000698, 0x00000703, 0x00000AF8, 0x00000ABB, 0x0000026F, 0x000008A8,\n    0x00000565, 0x0000065D, 0x000004C6, 0x00000057, 0x0000006A, 0x00000A1E,\n    0x0000087D, 0x00000959, 0x00000BB8, 0x0000097E, 0x00000606, 0x000003AD,\n    0x000000E2, 0x00000370, 0x0000024D, 0x000005C6, 0x00000B8C, 0x00000036,\n    0x0000087F, 0x00000172, 0x00000399, 0x0000040F, 0x0000091E, 0x000008D5,\n    0x000008DE, 0x000002EB, 0x00000317, 0x0000034E, 0x00000111, 0x0000002B,\n    0x000008E1, 0x0000042A, 0x00000765, 0x000009A2, 0x000004F2, 0x0000058A,\n    0x000007E0, 0x00000802, 0x00000A1C, 0x00000940, 0x000002EC, 0x000003ED,\n    0x000004EB, 0x00000234, 0x00000245, 0x00000603, 0x00000984, 0x0000076E,\n    0x00000841, 0x000009DD, 0x000003F3, 0x00000B5A, 0x00000B58, 0x00000838,\n    0x00000218, 0x00000A1D, 0x0000054B, 0x00000503, 0x00000169, 0x00000605,\n    0x0000048A, 0x000002D3, 0x00000A7C, 0x00000171, 0x000001AF, 0x000004AC,\n    0x0000024F, 0x00000ADE, 0x00000110, 0x00000212, 0x00000742, 0x00000389,\n    0x000006C4, 0x00000B98, 0x000002AE, 0x000009B1, 0x00000741, 0x00000211,\n    0x00000A5B, 0x000005EA, 0x00000310, 0x0000052A, 0x00000071, 0x00000107,\n    0x000006A2, 0x00000B1B, 0x00000034, 0x0000024B, 0x000002AF, 0x00000A41,\n    0x00000A7E, 0x0000034F, 0x00000901, 0x00000539, 0x0000091C, 0x000001A4,\n    0x00000666, 0x00000833, 0x00000206, 0x00000210, 0x000002ED, 0x0000040D,\n    0x00000428, 0x00000195, 0x000004C7, 0x00000AB0, 0x00000429, 0x00000B5F,\n    0x0000044C, 0x00000B59, 0x00000344, 0x000007C7, 0x00000739, 0x0000091D,\n    0x000000D2, 0x00000133, 0x000005C8, 0x00000A1B, 0x00000420, 0x000002B0,\n    0x00000A25, 0x0000030E, 0x0000048B, 0x00000B7D, 0x00000073, 0x00000740,\n    0x00000173, 0x000006C6, 0x00000567, 0x00000A3F, 0x00000B95, 0x0000038A,\n    0x000005CE, 0x000006A3, 0x000006FA, 0x00000743, 0x000007C5, 0x0000038B,\n    0x00000ABA, 0x00000B51, 0x00000914, 0x0000013C, 0x00000566, 0x0000097D,\n    0x00000A58, 0x00000B5B, 0x00000704, 0x00000232, 0x000002EE, 0x000007A2,\n    0x00000763, 0x00000135, 0x000000D3, 0x00000949, 0x000001D2, 0x00000604,\n    0x00000035, 0x000004AE, 0x000007D6, 0x00000B7B, 0x00000AF7, 0x00000873,\n    0x000004E9, 0x000007E1, 0x0000097F, 0x000001AE, 0x00000864, 0x000008E0,\n    0x000005A3, 0x000006A4, 0x00000667, 0x00000961, 0x000004C9, 0x00000ABC,\n    0x00000627, 0x000007A3, 0x00000AF9, 0x00000528, 0x00000B24, 0x0000020F,\n    0x000008A1, 0x000004C8, 0x000004BD, 0x00000976, 0x000006A5, 0x0000054D,\n    0x000002E2, 0x000000F6, 0x0000024C, 0x00000B97, 0x00000055, 0x00000B96,\n    0x00000689, 0x00000096, 0x00000072, 0x000009A0, 0x0000014C, 0x00000059,\n    0x0000048C, 0x000009BB, 0x00000588, 0x000003EC, 0x00000BBA, 0x00000665,\n    0x000005BC, 0x00000529, 0x00000840, 0x0000051F, 0x000005FB, 0x000000D5,\n    0x000005C7, 0x000009BA, 0x000000D4, 0x000009DF, 0x000006CD, 0x00000489,\n    0x000007F0, 0x000003E1, 0x000009BC, 0x00000A59, 0x0000093E, 0x000007A9,\n    0x00000112, 0x00000271, 0x000002D1, 0x0000057C, 0x0000038C, 0x0000003D,\n    0x00000A13, 0x000001B0, 0x00000AEF, 0x000007DF, 0x00000842, 0x00000804,\n    0x00000903, 0x000007A4, 0x00000482, 0x0004002B, 0x0000000B, 0x00000A0D,\n    0x00000001, 0x0004002B, 0x0000000B, 0x00000A3A, 0x00000010, 0x00040020,\n    0x00000678, 0x00000007, 0x000003FB, 0x00040017, 0x0000001D, 0x0000000D,\n    0x00000004, 0x00040020, 0x0000029A, 0x00000001, 0x0000001D, 0x0004003B,\n    0x0000029A, 0x00000C93, 0x00000001, 0x00040017, 0x00000013, 0x0000000D,\n    0x00000002, 0x0004001E, 0x000003F2, 0x00000012, 0x0000000D, 0x00040020,\n    0x0000066F, 0x00000009, 0x000003F2, 0x0004003B, 0x0000066F, 0x00000CE9,\n    0x00000009, 0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000, 0x00040020,\n    0x0000028F, 0x00000009, 0x00000012, 0x0004002B, 0x0000000C, 0x00000A0E,\n    0x00000001, 0x00040020, 0x0000028B, 0x00000009, 0x0000000D, 0x00040020,\n    0x0000029B, 0x00000003, 0x0000001D, 0x0004003B, 0x0000029B, 0x000014D6,\n    0x00000003, 0x0004002B, 0x0000000B, 0x0000020D, 0x1FBC4639, 0x0004002B,\n    0x0000000B, 0x00000345, 0x7EF07EBB, 0x0004002B, 0x0000000B, 0x000000B2,\n    0x7EF19FFF, 0x0004002B, 0x0000000D, 0x00000019, 0x40000000, 0x00090019,\n    0x00000097, 0x0000000D, 0x00000001, 0x00000000, 0x00000000, 0x00000000,\n    0x00000001, 0x00000000, 0x00040020, 0x00000313, 0x00000000, 0x00000097,\n    0x0004003B, 0x00000313, 0x0000142B, 0x00000000, 0x0004002B, 0x0000000C,\n    0x00000A08, 0xFFFFFFFF, 0x0005002C, 0x00000012, 0x0000070B, 0x00000A0B,\n    0x00000A08, 0x0005002C, 0x00000012, 0x0000070E, 0x00000A08, 0x00000A0B,\n    0x0005002C, 0x00000012, 0x00000720, 0x00000A0E, 0x00000A0B, 0x0005002C,\n    0x00000012, 0x00000723, 0x00000A0B, 0x00000A0E, 0x0004002B, 0x0000000D,\n    0x00000B69, 0x40800000, 0x0005002C, 0x00000011, 0x0000084A, 0x00000A37,\n    0x00000A37, 0x0006002C, 0x00000018, 0x00000A2C, 0x00000A0C, 0x00000A0C,\n    0x00000A0C, 0x0006002C, 0x00000018, 0x00000A16, 0x0000008A, 0x0000008A,\n    0x0000008A, 0x00030001, 0x0000001D, 0x00000002, 0x00050036, 0x00000008,\n    0x0000161F, 0x00000000, 0x00000502, 0x000200F8, 0x00006179, 0x0004003B,\n    0x00000678, 0x000047EB, 0x00000007, 0x0004003D, 0x0000001D, 0x00005647,\n    0x00000C93, 0x0007004F, 0x00000013, 0x000019A2, 0x00005647, 0x00005647,\n    0x00000000, 0x00000001, 0x0004006E, 0x00000012, 0x000044F8, 0x000019A2,\n    0x00050041, 0x0000028F, 0x00004B4F, 0x00000CE9, 0x00000A0B, 0x0004003D,\n    0x00000012, 0x00005926, 0x00004B4F, 0x00050082, 0x00000012, 0x00005B10,\n    0x000044F8, 0x00005926, 0x0004007C, 0x00000011, 0x000026D2, 0x00005B10,\n    0x00050041, 0x0000028B, 0x00005205, 0x00000CE9, 0x00000A0E, 0x0004003D,\n    0x0000000D, 0x000056DD, 0x00005205, 0x0004007C, 0x0000000B, 0x00004046,\n    0x000056DD, 0x0004007C, 0x00000012, 0x00001B4E, 0x000026D2, 0x00050080,\n    0x00000012, 0x0000381D, 0x00001B4E, 0x0000070B, 0x0004003D, 0x00000097,\n    0x00005A11, 0x0000142B, 0x0007005F, 0x0000001D, 0x00004C03, 0x00005A11,\n    0x0000381D, 0x00000002, 0x00000A0B, 0x00050080, 0x00000012, 0x00003423,\n    0x00001B4E, 0x0000070E, 0x0004003D, 0x00000097, 0x000038CA, 0x0000142B,\n    0x0007005F, 0x0000001D, 0x00003151, 0x000038CA, 0x00003423, 0x00000002,\n    0x00000A0B, 0x0004003D, 0x00000097, 0x000028B5, 0x0000142B, 0x0007005F,\n    0x0000001D, 0x00003C54, 0x000028B5, 0x00001B4E, 0x00000002, 0x00000A0B,\n    0x00050080, 0x00000012, 0x00003424, 0x00001B4E, 0x00000720, 0x0004003D,\n    0x00000097, 0x00003DC3, 0x0000142B, 0x0007005F, 0x0000001D, 0x00004C04,\n    0x00003DC3, 0x00003424, 0x00000002, 0x00000A0B, 0x00050080, 0x00000012,\n    0x00003425, 0x00001B4E, 0x00000723, 0x0004003D, 0x00000097, 0x00003A46,\n    0x0000142B, 0x0007005F, 0x0000001D, 0x000022C3, 0x00003A46, 0x00003425,\n    0x00000002, 0x00000A0B, 0x00050051, 0x0000000D, 0x00004D11, 0x00004C03,\n    0x00000000, 0x00050051, 0x0000000D, 0x00001B71, 0x00004C03, 0x00000001,\n    0x00050051, 0x0000000D, 0x00004923, 0x00004C03, 0x00000002, 0x00050085,\n    0x0000000D, 0x0000611F, 0x00004D11, 0x00004D11, 0x00050085, 0x0000000D,\n    0x00003F38, 0x00001B71, 0x00001B71, 0x00050085, 0x0000000D, 0x00002459,\n    0x00004923, 0x00004923, 0x00050051, 0x0000000D, 0x000056DC, 0x00003151,\n    0x00000000, 0x00050051, 0x0000000D, 0x00002E44, 0x00003151, 0x00000001,\n    0x00050051, 0x0000000D, 0x00004924, 0x00003151, 0x00000002, 0x00050085,\n    0x0000000D, 0x00006120, 0x000056DC, 0x000056DC, 0x00050085, 0x0000000D,\n    0x00003F39, 0x00002E44, 0x00002E44, 0x00050085, 0x0000000D, 0x0000245A,\n    0x00004924, 0x00004924, 0x00050051, 0x0000000D, 0x000056DE, 0x00003C54,\n    0x00000000, 0x00050051, 0x0000000D, 0x00002E45, 0x00003C54, 0x00000001,\n    0x00050051, 0x0000000D, 0x00004925, 0x00003C54, 0x00000002, 0x00050085,\n    0x0000000D, 0x00006121, 0x000056DE, 0x000056DE, 0x00050085, 0x0000000D,\n    0x00003F3A, 0x00002E45, 0x00002E45, 0x00050085, 0x0000000D, 0x0000245B,\n    0x00004925, 0x00004925, 0x00050051, 0x0000000D, 0x000056DF, 0x00004C04,\n    0x00000000, 0x00050051, 0x0000000D, 0x00002E46, 0x00004C04, 0x00000001,\n    0x00050051, 0x0000000D, 0x00004926, 0x00004C04, 0x00000002, 0x00050085,\n    0x0000000D, 0x00006122, 0x000056DF, 0x000056DF, 0x00050085, 0x0000000D,\n    0x00003F3B, 0x00002E46, 0x00002E46, 0x00050085, 0x0000000D, 0x0000245C,\n    0x00004926, 0x00004926, 0x00050051, 0x0000000D, 0x000056E0, 0x000022C3,\n    0x00000000, 0x00050051, 0x0000000D, 0x00002E47, 0x000022C3, 0x00000001,\n    0x00050051, 0x0000000D, 0x00004927, 0x000022C3, 0x00000002, 0x00050085,\n    0x0000000D, 0x00006123, 0x000056E0, 0x000056E0, 0x00050085, 0x0000000D,\n    0x00003A3E, 0x00002E47, 0x00002E47, 0x00050085, 0x0000000D, 0x0000218E,\n    0x00004927, 0x00004927, 0x0007000C, 0x0000000D, 0x00002A7D, 0x00000001,\n    0x00000025, 0x00003F3A, 0x00003F3B, 0x0007000C, 0x0000000D, 0x0000243C,\n    0x00000001, 0x00000025, 0x00003F39, 0x00002A7D, 0x0007000C, 0x0000000D,\n    0x00003E4F, 0x00000001, 0x00000025, 0x00003F38, 0x00003A3E, 0x0007000C,\n    0x0000000D, 0x00002A99, 0x00000001, 0x00000025, 0x0000243C, 0x00003E4F,\n    0x0007000C, 0x0000000D, 0x00005EE8, 0x00000001, 0x00000028, 0x00003F3A,\n    0x00003F3B, 0x0007000C, 0x0000000D, 0x00004473, 0x00000001, 0x00000028,\n    0x00003F39, 0x00005EE8, 0x0007000C, 0x0000000D, 0x00005D83, 0x00000001,\n    0x00000028, 0x00003F38, 0x00003A3E, 0x0007000C, 0x0000000D, 0x0000526D,\n    0x00000001, 0x00000028, 0x00004473, 0x00005D83, 0x0004007C, 0x0000000B,\n    0x00001FF5, 0x0000526D, 0x00050082, 0x0000000B, 0x000022F7, 0x00000345,\n    0x00001FF5, 0x0004007C, 0x0000000D, 0x00001941, 0x000022F7, 0x00050083,\n    0x0000000D, 0x00005E43, 0x0000008A, 0x0000526D, 0x0007000C, 0x0000000D,\n    0x00005B1C, 0x00000001, 0x00000025, 0x00002A99, 0x00005E43, 0x00050085,\n    0x0000000D, 0x00005977, 0x00005B1C, 0x00001941, 0x0008000C, 0x0000000D,\n    0x000050CB, 0x00000001, 0x0000002B, 0x00005977, 0x00000A0C, 0x0000008A,\n    0x0004007C, 0x0000000B, 0x00005DCB, 0x000050CB, 0x000500C2, 0x0000000B,\n    0x0000564A, 0x00005DCB, 0x00000A0D, 0x00050080, 0x0000000B, 0x00005ABD,\n    0x0000564A, 0x0000020D, 0x0004007C, 0x0000000D, 0x000054BC, 0x00005ABD,\n    0x0004007C, 0x0000000D, 0x00004C66, 0x00004046, 0x00050085, 0x0000000D,\n    0x00004973, 0x000054BC, 0x00004C66, 0x00050085, 0x0000000D, 0x00005B14,\n    0x00000B69, 0x00004973, 0x00050081, 0x0000000D, 0x00004072, 0x0000008A,\n    0x00005B14, 0x0004007C, 0x0000000B, 0x00001997, 0x00004072, 0x00050082,\n    0x0000000B, 0x00001D8B, 0x000000B2, 0x00001997, 0x0004007C, 0x0000000D,\n    0x000024CB, 0x00001D8B, 0x0004007F, 0x0000000D, 0x000023AA, 0x000024CB,\n    0x00050085, 0x0000000D, 0x0000304F, 0x000023AA, 0x00004072, 0x00050081,\n    0x0000000D, 0x0000409C, 0x0000304F, 0x00000019, 0x00050085, 0x0000000D,\n    0x00002496, 0x000024CB, 0x0000409C, 0x00050081, 0x0000000D, 0x0000499D,\n    0x0000611F, 0x00006120, 0x00050081, 0x0000000D, 0x00005A67, 0x0000499D,\n    0x00006122, 0x00050081, 0x0000000D, 0x00001987, 0x00005A67, 0x00006123,\n    0x00050085, 0x0000000D, 0x00003181, 0x00004973, 0x00001987, 0x00050081,\n    0x0000000D, 0x00003E65, 0x00003181, 0x00006121, 0x00050085, 0x0000000D,\n    0x00001FC9, 0x00003E65, 0x00002496, 0x0008000C, 0x0000000D, 0x00003B26,\n    0x00000001, 0x0000002B, 0x00001FC9, 0x00000A0C, 0x0000008A, 0x00050081,\n    0x0000000D, 0x00003445, 0x00003F38, 0x00003F39, 0x00050081, 0x0000000D,\n    0x0000328F, 0x00003445, 0x00003F3B, 0x00050081, 0x0000000D, 0x00001988,\n    0x0000328F, 0x00003A3E, 0x00050085, 0x0000000D, 0x00003182, 0x00004973,\n    0x00001988, 0x00050081, 0x0000000D, 0x00003E66, 0x00003182, 0x00003F3A,\n    0x00050085, 0x0000000D, 0x00001FCA, 0x00003E66, 0x00002496, 0x0008000C,\n    0x0000000D, 0x00003B27, 0x00000001, 0x0000002B, 0x00001FCA, 0x00000A0C,\n    0x0000008A, 0x00050081, 0x0000000D, 0x00003446, 0x00002459, 0x0000245A,\n    0x00050081, 0x0000000D, 0x00003290, 0x00003446, 0x0000245C, 0x00050081,\n    0x0000000D, 0x00001989, 0x00003290, 0x0000218E, 0x00050085, 0x0000000D,\n    0x00003183, 0x00004973, 0x00001989, 0x00050081, 0x0000000D, 0x00003E67,\n    0x00003183, 0x0000245B, 0x00050085, 0x0000000D, 0x00001C4C, 0x00003E67,\n    0x00002496, 0x0008000C, 0x0000000D, 0x0000576C, 0x00000001, 0x0000002B,\n    0x00001C4C, 0x00000A0C, 0x0000008A, 0x00060052, 0x0000001D, 0x00005ECE,\n    0x00003B26, 0x00000002, 0x00000000, 0x00060052, 0x0000001D, 0x00002B42,\n    0x00003B27, 0x00005ECE, 0x00000001, 0x00060052, 0x0000001D, 0x00003A55,\n    0x0000576C, 0x00002B42, 0x00000002, 0x0008004F, 0x00000018, 0x0000329B,\n    0x00003A55, 0x00003A55, 0x00000000, 0x00000001, 0x00000002, 0x0006000C,\n    0x00000018, 0x00001947, 0x00000001, 0x0000001F, 0x0000329B, 0x00050051,\n    0x0000000D, 0x000058D6, 0x00001947, 0x00000000, 0x00060052, 0x0000001D,\n    0x00004D39, 0x000058D6, 0x00000002, 0x00000000, 0x00050051, 0x0000000D,\n    0x00004D8C, 0x00001947, 0x00000001, 0x00060052, 0x0000001D, 0x00003F07,\n    0x00004D8C, 0x00004D39, 0x00000001, 0x00050051, 0x0000000D, 0x00004D66,\n    0x00001947, 0x00000002, 0x00060052, 0x0000001D, 0x00004910, 0x00004D66,\n    0x00003F07, 0x00000002, 0x0008004F, 0x00000018, 0x00003E7D, 0x00004910,\n    0x00004910, 0x00000000, 0x00000001, 0x00000002, 0x000500C7, 0x00000011,\n    0x00003108, 0x000026D2, 0x0000084A, 0x00050051, 0x0000000B, 0x0000260D,\n    0x00003108, 0x00000001, 0x00050084, 0x0000000B, 0x000053FA, 0x0000260D,\n    0x00000A3A, 0x00050051, 0x0000000B, 0x00005B73, 0x00003108, 0x00000000,\n    0x00050080, 0x0000000B, 0x00003142, 0x000053FA, 0x00005B73, 0x0003003E,\n    0x000047EB, 0x000008C2, 0x00050041, 0x0000028A, 0x000026E6, 0x000047EB,\n    0x00003142, 0x0004003D, 0x0000000D, 0x00006234, 0x000026E6, 0x00060050,\n    0x00000018, 0x0000466C, 0x00006234, 0x00006234, 0x00006234, 0x00050081,\n    0x00000018, 0x000053D2, 0x00003E7D, 0x0000466C, 0x0008000C, 0x00000018,\n    0x00004C45, 0x00000001, 0x0000002B, 0x000053D2, 0x00000A2C, 0x00000A16,\n    0x00050051, 0x0000000D, 0x00004189, 0x00004C45, 0x00000000, 0x00050051,\n    0x0000000D, 0x00004CFC, 0x00004C45, 0x00000001, 0x00050051, 0x0000000D,\n    0x00001D30, 0x00004C45, 0x00000002, 0x00070050, 0x0000001D, 0x00005788,\n    0x00004189, 0x00004CFC, 0x00001D30, 0x0000008A, 0x0003003E, 0x000014D6,\n    0x00005788, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/ui/shaders/bytecode/vulkan_spirv/guest_output_ffx_cas_sharpen_ps.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 24950\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint Fragment %main \"main\" %gl_FragCoord %xe_cas_color\n               OpExecutionMode %main OriginUpperLeft\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %gl_FragCoord \"gl_FragCoord\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_cas_output_offset\"\n               OpMemberName %push_const_block_xe 1 \"xe_cas_sharpness_post_setup\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %xe_cas_color \"xe_cas_color\"\n               OpName %xe_cas_source \"xe_cas_source\"\n               OpDecorate %gl_FragCoord BuiltIn FragCoord\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 16\n               OpMemberDecorate %push_const_block_xe 1 Offset 24\n               OpDecorate %xe_cas_color Location 0\n               OpDecorate %xe_cas_source Binding 0\n               OpDecorate %xe_cas_source DescriptorSet 0\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n      %float = OpTypeFloat 32\n       %uint = OpTypeInt 32 0\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n    %v3float = OpTypeVector %float 3\n     %v2uint = OpTypeVector %uint 2\n    %v4float = OpTypeVector %float 4\n%_ptr_Input_v4float = OpTypePointer Input %v4float\n%gl_FragCoord = OpVariable %_ptr_Input_v4float Input\n    %v2float = OpTypeVector %float 2\n%push_const_block_xe = OpTypeStruct %v2int %float\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n      %int_0 = OpConstant %int 0\n%_ptr_PushConstant_v2int = OpTypePointer PushConstant %v2int\n    %float_1 = OpConstant %float 1\n    %float_0 = OpConstant %float 0\n      %int_1 = OpConstant %int 1\n%_ptr_PushConstant_float = OpTypePointer PushConstant %float\n     %uint_1 = OpConstant %uint 1\n%_ptr_Output_v4float = OpTypePointer Output %v4float\n%xe_cas_color = OpVariable %_ptr_Output_v4float Output\n%uint_532432441 = OpConstant %uint 532432441\n%uint_2129690299 = OpConstant %uint 2129690299\n%uint_2129764351 = OpConstant %uint 2129764351\n    %float_2 = OpConstant %float 2\n        %150 = OpTypeImage %float 2D 0 0 0 1 Unknown\n%_ptr_UniformConstant_150 = OpTypePointer UniformConstant %150\n%xe_cas_source = OpVariable %_ptr_UniformConstant_150 UniformConstant\n     %int_n1 = OpConstant %int -1\n       %1803 = OpConstantComposite %v2int %int_0 %int_n1\n       %1806 = OpConstantComposite %v2int %int_n1 %int_0\n       %1824 = OpConstantComposite %v2int %int_1 %int_0\n       %1827 = OpConstantComposite %v2int %int_0 %int_1\n    %float_4 = OpConstant %float 4\n          %2 = OpUndef %v4float\n       %main = OpFunction %void None %1282\n      %24949 = OpLabel\n      %18571 = OpLoad %v4float %gl_FragCoord\n      %14008 = OpVectorShuffle %v2float %18571 %18571 0 1\n      %17656 = OpConvertFToS %v2int %14008\n      %19279 = OpAccessChain %_ptr_PushConstant_v2int %push_consts_xe %int_0\n      %22822 = OpLoad %v2int %19279\n      %23312 = OpISub %v2int %17656 %22822\n       %9938 = OpBitcast %v2uint %23312\n      %20997 = OpAccessChain %_ptr_PushConstant_float %push_consts_xe %int_1\n      %22237 = OpLoad %float %20997\n      %16454 = OpBitcast %uint %22237\n       %6990 = OpBitcast %v2int %9938\n      %14365 = OpIAdd %v2int %6990 %1803\n      %23057 = OpLoad %150 %xe_cas_source\n      %19459 = OpImageFetch %v4float %23057 %14365 Lod %int_0\n      %13347 = OpIAdd %v2int %6990 %1806\n      %14538 = OpLoad %150 %xe_cas_source\n      %12625 = OpImageFetch %v4float %14538 %13347 Lod %int_0\n      %10421 = OpLoad %150 %xe_cas_source\n      %15444 = OpImageFetch %v4float %10421 %6990 Lod %int_0\n      %13348 = OpIAdd %v2int %6990 %1824\n      %15811 = OpLoad %150 %xe_cas_source\n      %19460 = OpImageFetch %v4float %15811 %13348 Lod %int_0\n      %13349 = OpIAdd %v2int %6990 %1827\n      %14918 = OpLoad %150 %xe_cas_source\n       %8899 = OpImageFetch %v4float %14918 %13349 Lod %int_0\n      %19729 = OpCompositeExtract %float %19459 0\n       %7025 = OpCompositeExtract %float %19459 1\n      %18723 = OpCompositeExtract %float %19459 2\n      %24863 = OpFMul %float %19729 %19729\n      %16184 = OpFMul %float %7025 %7025\n       %9305 = OpFMul %float %18723 %18723\n      %22236 = OpCompositeExtract %float %12625 0\n      %11844 = OpCompositeExtract %float %12625 1\n      %18724 = OpCompositeExtract %float %12625 2\n      %24864 = OpFMul %float %22236 %22236\n      %16185 = OpFMul %float %11844 %11844\n       %9306 = OpFMul %float %18724 %18724\n      %22238 = OpCompositeExtract %float %15444 0\n      %11845 = OpCompositeExtract %float %15444 1\n      %18725 = OpCompositeExtract %float %15444 2\n      %24865 = OpFMul %float %22238 %22238\n      %16186 = OpFMul %float %11845 %11845\n       %9307 = OpFMul %float %18725 %18725\n      %22239 = OpCompositeExtract %float %19460 0\n      %11846 = OpCompositeExtract %float %19460 1\n      %18726 = OpCompositeExtract %float %19460 2\n      %24866 = OpFMul %float %22239 %22239\n      %16187 = OpFMul %float %11846 %11846\n       %9308 = OpFMul %float %18726 %18726\n      %22240 = OpCompositeExtract %float %8899 0\n      %11847 = OpCompositeExtract %float %8899 1\n      %18727 = OpCompositeExtract %float %8899 2\n      %24867 = OpFMul %float %22240 %22240\n      %14910 = OpFMul %float %11847 %11847\n       %8590 = OpFMul %float %18727 %18727\n      %10877 = OpExtInst %float %1 FMin %16186 %16187\n       %9276 = OpExtInst %float %1 FMin %16185 %10877\n      %15951 = OpExtInst %float %1 FMin %16184 %14910\n      %10905 = OpExtInst %float %1 FMin %9276 %15951\n      %24296 = OpExtInst %float %1 FMax %16186 %16187\n      %17523 = OpExtInst %float %1 FMax %16185 %24296\n      %23939 = OpExtInst %float %1 FMax %16184 %14910\n      %21101 = OpExtInst %float %1 FMax %17523 %23939\n       %8181 = OpBitcast %uint %21101\n       %8951 = OpISub %uint %uint_2129690299 %8181\n       %6465 = OpBitcast %float %8951\n      %24131 = OpFSub %float %float_1 %21101\n      %23324 = OpExtInst %float %1 FMin %10905 %24131\n      %22903 = OpFMul %float %23324 %6465\n      %20683 = OpExtInst %float %1 FClamp %22903 %float_0 %float_1\n      %24011 = OpBitcast %uint %20683\n      %22090 = OpShiftRightLogical %uint %24011 %uint_1\n      %23229 = OpIAdd %uint %22090 %uint_532432441\n      %21692 = OpBitcast %float %23229\n      %19558 = OpBitcast %float %16454\n      %18803 = OpFMul %float %21692 %19558\n      %23316 = OpFMul %float %float_4 %18803\n      %16498 = OpFAdd %float %float_1 %23316\n       %6551 = OpBitcast %uint %16498\n       %7563 = OpISub %uint %uint_2129764351 %6551\n       %9419 = OpBitcast %float %7563\n       %9130 = OpFNegate %float %9419\n      %12367 = OpFMul %float %9130 %16498\n      %16540 = OpFAdd %float %12367 %float_2\n       %9366 = OpFMul %float %9419 %16540\n      %18845 = OpFAdd %float %24863 %24864\n      %23143 = OpFAdd %float %18845 %24866\n       %6535 = OpFAdd %float %23143 %24867\n      %12673 = OpFMul %float %18803 %6535\n      %15973 = OpFAdd %float %12673 %24865\n       %8137 = OpFMul %float %15973 %9366\n      %15142 = OpExtInst %float %1 FClamp %8137 %float_0 %float_1\n      %13381 = OpFAdd %float %16184 %16185\n      %12943 = OpFAdd %float %13381 %16187\n       %6536 = OpFAdd %float %12943 %14910\n      %12674 = OpFMul %float %18803 %6536\n      %15974 = OpFAdd %float %12674 %16186\n       %8138 = OpFMul %float %15974 %9366\n      %15143 = OpExtInst %float %1 FClamp %8138 %float_0 %float_1\n      %13382 = OpFAdd %float %9305 %9306\n      %12944 = OpFAdd %float %13382 %9308\n       %6537 = OpFAdd %float %12944 %8590\n      %12675 = OpFMul %float %18803 %6537\n      %15975 = OpFAdd %float %12675 %9307\n       %7244 = OpFMul %float %15975 %9366\n      %22380 = OpExtInst %float %1 FClamp %7244 %float_0 %float_1\n      %24270 = OpCompositeInsert %v4float %15142 %2 0\n      %11074 = OpCompositeInsert %v4float %15143 %24270 1\n      %14933 = OpCompositeInsert %v4float %22380 %11074 2\n      %12955 = OpVectorShuffle %v3float %14933 %14933 0 1 2\n       %6452 = OpExtInst %v3float %1 Sqrt %12955\n      %22915 = OpCompositeExtract %float %6452 0\n       %8853 = OpCompositeExtract %float %6452 1\n       %7472 = OpCompositeExtract %float %6452 2\n      %22408 = OpCompositeConstruct %v4float %22915 %8853 %7472 %float_1\n               OpStore %xe_cas_color %22408\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t guest_output_ffx_cas_sharpen_ps[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006176, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0007000F, 0x00000004,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000C93, 0x000014D6, 0x00030010,\n    0x0000161F, 0x00000007, 0x00030003, 0x00000002, 0x000001CC, 0x00090004,\n    0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F, 0x5F776F6C, 0x72747461,\n    0x74756269, 0x00007365, 0x000B0004, 0x455F4C47, 0x735F5458, 0x6C706D61,\n    0x656C7265, 0x745F7373, 0x75747865, 0x665F6572, 0x74636E75, 0x736E6F69,\n    0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F, 0x70635F45, 0x74735F70,\n    0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365, 0x00006576, 0x00080004,\n    0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63, 0x69645F65, 0x74636572,\n    0x00657669, 0x00040005, 0x0000161F, 0x6E69616D, 0x00000000, 0x00060005,\n    0x00000C93, 0x465F6C67, 0x43676172, 0x64726F6F, 0x00000000, 0x00070005,\n    0x000003F2, 0x68737570, 0x6E6F635F, 0x625F7473, 0x6B636F6C, 0x0065785F,\n    0x00090006, 0x000003F2, 0x00000000, 0x635F6578, 0x6F5F7361, 0x75707475,\n    0x666F5F74, 0x74657366, 0x00000000, 0x000A0006, 0x000003F2, 0x00000001,\n    0x635F6578, 0x735F7361, 0x70726168, 0x7373656E, 0x736F705F, 0x65735F74,\n    0x00707574, 0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473,\n    0x00006578, 0x00060005, 0x000014D6, 0x635F6578, 0x635F7361, 0x726F6C6F,\n    0x00000000, 0x00060005, 0x0000142B, 0x635F6578, 0x735F7361, 0x6372756F,\n    0x00000065, 0x00040047, 0x00000C93, 0x0000000B, 0x0000000F, 0x00030047,\n    0x000003F2, 0x00000002, 0x00050048, 0x000003F2, 0x00000000, 0x00000023,\n    0x00000010, 0x00050048, 0x000003F2, 0x00000001, 0x00000023, 0x00000018,\n    0x00040047, 0x000014D6, 0x0000001E, 0x00000000, 0x00040047, 0x0000142B,\n    0x00000021, 0x00000000, 0x00040047, 0x0000142B, 0x00000022, 0x00000000,\n    0x00020013, 0x00000008, 0x00030021, 0x00000502, 0x00000008, 0x00030016,\n    0x0000000D, 0x00000020, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x00040015, 0x0000000C, 0x00000020, 0x00000001, 0x00040017, 0x00000012,\n    0x0000000C, 0x00000002, 0x00040017, 0x00000018, 0x0000000D, 0x00000003,\n    0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040017, 0x0000001D,\n    0x0000000D, 0x00000004, 0x00040020, 0x0000029A, 0x00000001, 0x0000001D,\n    0x0004003B, 0x0000029A, 0x00000C93, 0x00000001, 0x00040017, 0x00000013,\n    0x0000000D, 0x00000002, 0x0004001E, 0x000003F2, 0x00000012, 0x0000000D,\n    0x00040020, 0x0000066F, 0x00000009, 0x000003F2, 0x0004003B, 0x0000066F,\n    0x00000CE9, 0x00000009, 0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000,\n    0x00040020, 0x0000028F, 0x00000009, 0x00000012, 0x0004002B, 0x0000000D,\n    0x0000008A, 0x3F800000, 0x0004002B, 0x0000000D, 0x00000A0C, 0x00000000,\n    0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001, 0x00040020, 0x0000028A,\n    0x00000009, 0x0000000D, 0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001,\n    0x00040020, 0x0000029B, 0x00000003, 0x0000001D, 0x0004003B, 0x0000029B,\n    0x000014D6, 0x00000003, 0x0004002B, 0x0000000B, 0x0000020D, 0x1FBC4639,\n    0x0004002B, 0x0000000B, 0x00000344, 0x7EF07EBB, 0x0004002B, 0x0000000B,\n    0x000000B2, 0x7EF19FFF, 0x0004002B, 0x0000000D, 0x00000019, 0x40000000,\n    0x00090019, 0x00000096, 0x0000000D, 0x00000001, 0x00000000, 0x00000000,\n    0x00000000, 0x00000001, 0x00000000, 0x00040020, 0x00000313, 0x00000000,\n    0x00000096, 0x0004003B, 0x00000313, 0x0000142B, 0x00000000, 0x0004002B,\n    0x0000000C, 0x00000A08, 0xFFFFFFFF, 0x0005002C, 0x00000012, 0x0000070B,\n    0x00000A0B, 0x00000A08, 0x0005002C, 0x00000012, 0x0000070E, 0x00000A08,\n    0x00000A0B, 0x0005002C, 0x00000012, 0x00000720, 0x00000A0E, 0x00000A0B,\n    0x0005002C, 0x00000012, 0x00000723, 0x00000A0B, 0x00000A0E, 0x0004002B,\n    0x0000000D, 0x00000B69, 0x40800000, 0x00030001, 0x0000001D, 0x00000002,\n    0x00050036, 0x00000008, 0x0000161F, 0x00000000, 0x00000502, 0x000200F8,\n    0x00006175, 0x0004003D, 0x0000001D, 0x0000488B, 0x00000C93, 0x0007004F,\n    0x00000013, 0x000036B8, 0x0000488B, 0x0000488B, 0x00000000, 0x00000001,\n    0x0004006E, 0x00000012, 0x000044F8, 0x000036B8, 0x00050041, 0x0000028F,\n    0x00004B4F, 0x00000CE9, 0x00000A0B, 0x0004003D, 0x00000012, 0x00005926,\n    0x00004B4F, 0x00050082, 0x00000012, 0x00005B10, 0x000044F8, 0x00005926,\n    0x0004007C, 0x00000011, 0x000026D2, 0x00005B10, 0x00050041, 0x0000028A,\n    0x00005205, 0x00000CE9, 0x00000A0E, 0x0004003D, 0x0000000D, 0x000056DD,\n    0x00005205, 0x0004007C, 0x0000000B, 0x00004046, 0x000056DD, 0x0004007C,\n    0x00000012, 0x00001B4E, 0x000026D2, 0x00050080, 0x00000012, 0x0000381D,\n    0x00001B4E, 0x0000070B, 0x0004003D, 0x00000096, 0x00005A11, 0x0000142B,\n    0x0007005F, 0x0000001D, 0x00004C03, 0x00005A11, 0x0000381D, 0x00000002,\n    0x00000A0B, 0x00050080, 0x00000012, 0x00003423, 0x00001B4E, 0x0000070E,\n    0x0004003D, 0x00000096, 0x000038CA, 0x0000142B, 0x0007005F, 0x0000001D,\n    0x00003151, 0x000038CA, 0x00003423, 0x00000002, 0x00000A0B, 0x0004003D,\n    0x00000096, 0x000028B5, 0x0000142B, 0x0007005F, 0x0000001D, 0x00003C54,\n    0x000028B5, 0x00001B4E, 0x00000002, 0x00000A0B, 0x00050080, 0x00000012,\n    0x00003424, 0x00001B4E, 0x00000720, 0x0004003D, 0x00000096, 0x00003DC3,\n    0x0000142B, 0x0007005F, 0x0000001D, 0x00004C04, 0x00003DC3, 0x00003424,\n    0x00000002, 0x00000A0B, 0x00050080, 0x00000012, 0x00003425, 0x00001B4E,\n    0x00000723, 0x0004003D, 0x00000096, 0x00003A46, 0x0000142B, 0x0007005F,\n    0x0000001D, 0x000022C3, 0x00003A46, 0x00003425, 0x00000002, 0x00000A0B,\n    0x00050051, 0x0000000D, 0x00004D11, 0x00004C03, 0x00000000, 0x00050051,\n    0x0000000D, 0x00001B71, 0x00004C03, 0x00000001, 0x00050051, 0x0000000D,\n    0x00004923, 0x00004C03, 0x00000002, 0x00050085, 0x0000000D, 0x0000611F,\n    0x00004D11, 0x00004D11, 0x00050085, 0x0000000D, 0x00003F38, 0x00001B71,\n    0x00001B71, 0x00050085, 0x0000000D, 0x00002459, 0x00004923, 0x00004923,\n    0x00050051, 0x0000000D, 0x000056DC, 0x00003151, 0x00000000, 0x00050051,\n    0x0000000D, 0x00002E44, 0x00003151, 0x00000001, 0x00050051, 0x0000000D,\n    0x00004924, 0x00003151, 0x00000002, 0x00050085, 0x0000000D, 0x00006120,\n    0x000056DC, 0x000056DC, 0x00050085, 0x0000000D, 0x00003F39, 0x00002E44,\n    0x00002E44, 0x00050085, 0x0000000D, 0x0000245A, 0x00004924, 0x00004924,\n    0x00050051, 0x0000000D, 0x000056DE, 0x00003C54, 0x00000000, 0x00050051,\n    0x0000000D, 0x00002E45, 0x00003C54, 0x00000001, 0x00050051, 0x0000000D,\n    0x00004925, 0x00003C54, 0x00000002, 0x00050085, 0x0000000D, 0x00006121,\n    0x000056DE, 0x000056DE, 0x00050085, 0x0000000D, 0x00003F3A, 0x00002E45,\n    0x00002E45, 0x00050085, 0x0000000D, 0x0000245B, 0x00004925, 0x00004925,\n    0x00050051, 0x0000000D, 0x000056DF, 0x00004C04, 0x00000000, 0x00050051,\n    0x0000000D, 0x00002E46, 0x00004C04, 0x00000001, 0x00050051, 0x0000000D,\n    0x00004926, 0x00004C04, 0x00000002, 0x00050085, 0x0000000D, 0x00006122,\n    0x000056DF, 0x000056DF, 0x00050085, 0x0000000D, 0x00003F3B, 0x00002E46,\n    0x00002E46, 0x00050085, 0x0000000D, 0x0000245C, 0x00004926, 0x00004926,\n    0x00050051, 0x0000000D, 0x000056E0, 0x000022C3, 0x00000000, 0x00050051,\n    0x0000000D, 0x00002E47, 0x000022C3, 0x00000001, 0x00050051, 0x0000000D,\n    0x00004927, 0x000022C3, 0x00000002, 0x00050085, 0x0000000D, 0x00006123,\n    0x000056E0, 0x000056E0, 0x00050085, 0x0000000D, 0x00003A3E, 0x00002E47,\n    0x00002E47, 0x00050085, 0x0000000D, 0x0000218E, 0x00004927, 0x00004927,\n    0x0007000C, 0x0000000D, 0x00002A7D, 0x00000001, 0x00000025, 0x00003F3A,\n    0x00003F3B, 0x0007000C, 0x0000000D, 0x0000243C, 0x00000001, 0x00000025,\n    0x00003F39, 0x00002A7D, 0x0007000C, 0x0000000D, 0x00003E4F, 0x00000001,\n    0x00000025, 0x00003F38, 0x00003A3E, 0x0007000C, 0x0000000D, 0x00002A99,\n    0x00000001, 0x00000025, 0x0000243C, 0x00003E4F, 0x0007000C, 0x0000000D,\n    0x00005EE8, 0x00000001, 0x00000028, 0x00003F3A, 0x00003F3B, 0x0007000C,\n    0x0000000D, 0x00004473, 0x00000001, 0x00000028, 0x00003F39, 0x00005EE8,\n    0x0007000C, 0x0000000D, 0x00005D83, 0x00000001, 0x00000028, 0x00003F38,\n    0x00003A3E, 0x0007000C, 0x0000000D, 0x0000526D, 0x00000001, 0x00000028,\n    0x00004473, 0x00005D83, 0x0004007C, 0x0000000B, 0x00001FF5, 0x0000526D,\n    0x00050082, 0x0000000B, 0x000022F7, 0x00000344, 0x00001FF5, 0x0004007C,\n    0x0000000D, 0x00001941, 0x000022F7, 0x00050083, 0x0000000D, 0x00005E43,\n    0x0000008A, 0x0000526D, 0x0007000C, 0x0000000D, 0x00005B1C, 0x00000001,\n    0x00000025, 0x00002A99, 0x00005E43, 0x00050085, 0x0000000D, 0x00005977,\n    0x00005B1C, 0x00001941, 0x0008000C, 0x0000000D, 0x000050CB, 0x00000001,\n    0x0000002B, 0x00005977, 0x00000A0C, 0x0000008A, 0x0004007C, 0x0000000B,\n    0x00005DCB, 0x000050CB, 0x000500C2, 0x0000000B, 0x0000564A, 0x00005DCB,\n    0x00000A0D, 0x00050080, 0x0000000B, 0x00005ABD, 0x0000564A, 0x0000020D,\n    0x0004007C, 0x0000000D, 0x000054BC, 0x00005ABD, 0x0004007C, 0x0000000D,\n    0x00004C66, 0x00004046, 0x00050085, 0x0000000D, 0x00004973, 0x000054BC,\n    0x00004C66, 0x00050085, 0x0000000D, 0x00005B14, 0x00000B69, 0x00004973,\n    0x00050081, 0x0000000D, 0x00004072, 0x0000008A, 0x00005B14, 0x0004007C,\n    0x0000000B, 0x00001997, 0x00004072, 0x00050082, 0x0000000B, 0x00001D8B,\n    0x000000B2, 0x00001997, 0x0004007C, 0x0000000D, 0x000024CB, 0x00001D8B,\n    0x0004007F, 0x0000000D, 0x000023AA, 0x000024CB, 0x00050085, 0x0000000D,\n    0x0000304F, 0x000023AA, 0x00004072, 0x00050081, 0x0000000D, 0x0000409C,\n    0x0000304F, 0x00000019, 0x00050085, 0x0000000D, 0x00002496, 0x000024CB,\n    0x0000409C, 0x00050081, 0x0000000D, 0x0000499D, 0x0000611F, 0x00006120,\n    0x00050081, 0x0000000D, 0x00005A67, 0x0000499D, 0x00006122, 0x00050081,\n    0x0000000D, 0x00001987, 0x00005A67, 0x00006123, 0x00050085, 0x0000000D,\n    0x00003181, 0x00004973, 0x00001987, 0x00050081, 0x0000000D, 0x00003E65,\n    0x00003181, 0x00006121, 0x00050085, 0x0000000D, 0x00001FC9, 0x00003E65,\n    0x00002496, 0x0008000C, 0x0000000D, 0x00003B26, 0x00000001, 0x0000002B,\n    0x00001FC9, 0x00000A0C, 0x0000008A, 0x00050081, 0x0000000D, 0x00003445,\n    0x00003F38, 0x00003F39, 0x00050081, 0x0000000D, 0x0000328F, 0x00003445,\n    0x00003F3B, 0x00050081, 0x0000000D, 0x00001988, 0x0000328F, 0x00003A3E,\n    0x00050085, 0x0000000D, 0x00003182, 0x00004973, 0x00001988, 0x00050081,\n    0x0000000D, 0x00003E66, 0x00003182, 0x00003F3A, 0x00050085, 0x0000000D,\n    0x00001FCA, 0x00003E66, 0x00002496, 0x0008000C, 0x0000000D, 0x00003B27,\n    0x00000001, 0x0000002B, 0x00001FCA, 0x00000A0C, 0x0000008A, 0x00050081,\n    0x0000000D, 0x00003446, 0x00002459, 0x0000245A, 0x00050081, 0x0000000D,\n    0x00003290, 0x00003446, 0x0000245C, 0x00050081, 0x0000000D, 0x00001989,\n    0x00003290, 0x0000218E, 0x00050085, 0x0000000D, 0x00003183, 0x00004973,\n    0x00001989, 0x00050081, 0x0000000D, 0x00003E67, 0x00003183, 0x0000245B,\n    0x00050085, 0x0000000D, 0x00001C4C, 0x00003E67, 0x00002496, 0x0008000C,\n    0x0000000D, 0x0000576C, 0x00000001, 0x0000002B, 0x00001C4C, 0x00000A0C,\n    0x0000008A, 0x00060052, 0x0000001D, 0x00005ECE, 0x00003B26, 0x00000002,\n    0x00000000, 0x00060052, 0x0000001D, 0x00002B42, 0x00003B27, 0x00005ECE,\n    0x00000001, 0x00060052, 0x0000001D, 0x00003A55, 0x0000576C, 0x00002B42,\n    0x00000002, 0x0008004F, 0x00000018, 0x0000329B, 0x00003A55, 0x00003A55,\n    0x00000000, 0x00000001, 0x00000002, 0x0006000C, 0x00000018, 0x00001934,\n    0x00000001, 0x0000001F, 0x0000329B, 0x00050051, 0x0000000D, 0x00005983,\n    0x00001934, 0x00000000, 0x00050051, 0x0000000D, 0x00002295, 0x00001934,\n    0x00000001, 0x00050051, 0x0000000D, 0x00001D30, 0x00001934, 0x00000002,\n    0x00070050, 0x0000001D, 0x00005788, 0x00005983, 0x00002295, 0x00001D30,\n    0x0000008A, 0x0003003E, 0x000014D6, 0x00005788, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/ui/shaders/bytecode/vulkan_spirv/guest_output_ffx_fsr_easu_ps.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25264\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint Fragment %main \"main\" %xe_fsr_easu_color %gl_FragCoord\n               OpExecutionMode %main OriginUpperLeft\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_fsr_easu_input_output_size_ratio\"\n               OpMemberName %push_const_block_xe 1 \"xe_fsr_easu_input_size_inv\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %xe_fsr_easu_color \"xe_fsr_easu_color\"\n               OpName %gl_FragCoord \"gl_FragCoord\"\n               OpName %xe_fsr_easu_source \"xe_fsr_easu_source\"\n               OpName %xe_fsr_easu_sampler \"xe_fsr_easu_sampler\"\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 16\n               OpMemberDecorate %push_const_block_xe 1 Offset 24\n               OpDecorate %xe_fsr_easu_color Location 0\n               OpDecorate %gl_FragCoord BuiltIn FragCoord\n               OpDecorate %xe_fsr_easu_source Binding 0\n               OpDecorate %xe_fsr_easu_source DescriptorSet 0\n               OpDecorate %xe_fsr_easu_sampler Binding 1\n               OpDecorate %xe_fsr_easu_sampler DescriptorSet 0\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n      %float = OpTypeFloat 32\n    %v2float = OpTypeVector %float 2\n    %v3float = OpTypeVector %float 3\n    %v4float = OpTypeVector %float 4\n       %uint = OpTypeInt 32 0\n       %bool = OpTypeBool\n     %v2uint = OpTypeVector %uint 2\n     %v4uint = OpTypeVector %uint 4\n%push_const_block_xe = OpTypeStruct %v2float %v2float\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n        %int = OpTypeInt 32 1\n      %int_0 = OpConstant %int 0\n%_ptr_PushConstant_v2float = OpTypePointer PushConstant %v2float\n  %float_0_5 = OpConstant %float 0.5\n    %float_1 = OpConstant %float 1\n   %float_n1 = OpConstant %float -1\n       %1284 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_n1\n      %int_1 = OpConstant %int 1\n    %float_2 = OpConstant %float 2\n       %2460 = OpConstantComposite %v4float %float_n1 %float_2 %float_1 %float_2\n    %float_0 = OpConstant %float 0\n    %float_4 = OpConstant %float 4\n     %uint_1 = OpConstant %uint 1\n%_ptr_PushConstant_float = OpTypePointer PushConstant %float\n     %uint_0 = OpConstant %uint 0\n%_ptr_Output_v4float = OpTypePointer Output %v4float\n%xe_fsr_easu_color = OpVariable %_ptr_Output_v4float Output\n%_ptr_Input_v4float = OpTypePointer Input %v4float\n%gl_FragCoord = OpVariable %_ptr_Input_v4float Input\n%_ptr_Output_float = OpTypePointer Output %float\n     %uint_2 = OpConstant %uint 2\n     %uint_3 = OpConstant %uint 3\n%uint_2129690299 = OpConstant %uint 2129690299\n%uint_1597275508 = OpConstant %uint 1597275508\n        %150 = OpTypeImage %float 2D 0 0 0 1 Unknown\n%_ptr_UniformConstant_150 = OpTypePointer UniformConstant %150\n%xe_fsr_easu_source = OpVariable %_ptr_UniformConstant_150 UniformConstant\n        %508 = OpTypeSampler\n%_ptr_UniformConstant_508 = OpTypePointer UniformConstant %508\n%xe_fsr_easu_sampler = OpVariable %_ptr_UniformConstant_508 UniformConstant\n        %510 = OpTypeSampledImage %150\n      %int_2 = OpConstant %int 2\n%float_0_400000006 = OpConstant %float 0.400000006\n%float_1_5625 = OpConstant %float 1.5625\n%float_n0_5625 = OpConstant %float -0.5625\n%float_3_05175781en05 = OpConstant %float 3.05175781e-05\n %float_n0_5 = OpConstant %float -0.5\n%float_n0_289999992 = OpConstant %float -0.289999992\n        %889 = OpConstantComposite %v2float %float_0 %float_n1\n        %768 = OpConstantComposite %v2float %float_1 %float_n1\n         %73 = OpConstantComposite %v2float %float_n1 %float_1\n        %890 = OpConstantComposite %v2float %float_0 %float_1\n       %2628 = OpConstantComposite %v2float %float_n1 %float_0\n        %769 = OpConstantComposite %v2float %float_1 %float_1\n        %426 = OpConstantComposite %v2float %float_2 %float_1\n       %2981 = OpConstantComposite %v2float %float_2 %float_0\n        %312 = OpConstantComposite %v2float %float_1 %float_0\n        %313 = OpConstantComposite %v2float %float_1 %float_2\n       %1823 = OpConstantComposite %v2float %float_0 %float_2\n       %1566 = OpConstantComposite %v2float %float_0_5 %float_0_5\n        %325 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_0_5\n       %main = OpFunction %void None %1282\n      %23915 = OpLabel\n       %8250 = OpAccessChain %_ptr_PushConstant_v2float %push_consts_xe %int_0\n       %6959 = OpLoad %v2float %8250\n      %13397 = OpBitcast %v2uint %6959\n      %12762 = OpVectorTimesScalar %v2float %6959 %float_0_5\n      %24595 = OpFSub %v2float %12762 %1566\n      %17743 = OpBitcast %v2uint %24595\n      %16707 = OpCompositeExtract %uint %13397 0\n      %13283 = OpCompositeExtract %uint %13397 1\n       %7641 = OpCompositeExtract %uint %17743 0\n       %7529 = OpCompositeExtract %uint %17743 1\n      %18241 = OpCompositeConstruct %v4uint %16707 %13283 %7641 %7529\n       %8922 = OpAccessChain %_ptr_PushConstant_v2float %push_consts_xe %int_1\n       %7921 = OpLoad %v2float %8922\n       %8543 = OpVectorShuffle %v4float %7921 %7921 0 1 0 1\n      %11088 = OpFMul %v4float %1284 %8543\n      %12841 = OpBitcast %v4uint %11088\n      %16717 = OpFMul %v4float %2460 %8543\n      %11573 = OpBitcast %v4uint %16717\n      %20359 = OpAccessChain %_ptr_PushConstant_float %push_consts_xe %int_1 %uint_1\n      %20680 = OpLoad %float %20359\n      %18089 = OpFMul %float %float_4 %20680\n      %19210 = OpBitcast %uint %18089\n      %10864 = OpCompositeConstruct %v4uint %uint_0 %19210 %uint_0 %uint_0\n       %6631 = OpLoad %v4float %gl_FragCoord\n      %14879 = OpVectorShuffle %v2float %6631 %6631 0 1\n      %18060 = OpConvertFToU %v2uint %14879\n      %25263 = OpConvertUToF %v2float %18060\n      %25101 = OpVectorShuffle %v2uint %18241 %18241 0 1\n      %11576 = OpBitcast %v2float %25101\n      %20814 = OpFMul %v2float %25263 %11576\n       %8994 = OpVectorShuffle %v2uint %18241 %18241 2 3\n      %11797 = OpBitcast %v2float %8994\n      %20069 = OpFAdd %v2float %20814 %11797\n      %12130 = OpExtInst %v2float %1 Floor %20069\n      %21577 = OpFSub %v2float %20069 %12130\n      %25184 = OpVectorShuffle %v2uint %12841 %12841 0 1\n      %17214 = OpBitcast %v2float %25184\n      %20815 = OpFMul %v2float %12130 %17214\n       %8995 = OpVectorShuffle %v2uint %12841 %12841 2 3\n      %13062 = OpBitcast %v2float %8995\n      %15444 = OpFAdd %v2float %20815 %13062\n      %16447 = OpVectorShuffle %v2uint %11573 %11573 0 1\n      %16293 = OpBitcast %v2float %16447\n      %15445 = OpFAdd %v2float %15444 %16293\n      %16448 = OpVectorShuffle %v2uint %11573 %11573 2 3\n      %16294 = OpBitcast %v2float %16448\n      %15446 = OpFAdd %v2float %15444 %16294\n      %16449 = OpVectorShuffle %v2uint %10864 %10864 0 1\n      %15951 = OpBitcast %v2float %16449\n      %17361 = OpFAdd %v2float %15444 %15951\n      %21435 = OpLoad %150 %xe_fsr_easu_source\n      %17465 = OpLoad %508 %xe_fsr_easu_sampler\n      %10383 = OpSampledImage %510 %21435 %17465\n      %10424 = OpImageGather %v4float %10383 %15444 %int_0\n      %19276 = OpLoad %150 %xe_fsr_easu_source\n      %13450 = OpLoad %508 %xe_fsr_easu_sampler\n      %10384 = OpSampledImage %510 %19276 %13450\n      %10425 = OpImageGather %v4float %10384 %15444 %int_1\n      %19277 = OpLoad %150 %xe_fsr_easu_source\n      %13451 = OpLoad %508 %xe_fsr_easu_sampler\n      %10385 = OpSampledImage %510 %19277 %13451\n      %10426 = OpImageGather %v4float %10385 %15444 %int_2\n      %19278 = OpLoad %150 %xe_fsr_easu_source\n      %13452 = OpLoad %508 %xe_fsr_easu_sampler\n      %10386 = OpSampledImage %510 %19278 %13452\n      %10427 = OpImageGather %v4float %10386 %15445 %int_0\n      %19279 = OpLoad %150 %xe_fsr_easu_source\n      %13453 = OpLoad %508 %xe_fsr_easu_sampler\n      %10387 = OpSampledImage %510 %19279 %13453\n      %10428 = OpImageGather %v4float %10387 %15445 %int_1\n      %19280 = OpLoad %150 %xe_fsr_easu_source\n      %13454 = OpLoad %508 %xe_fsr_easu_sampler\n      %10388 = OpSampledImage %510 %19280 %13454\n      %10429 = OpImageGather %v4float %10388 %15445 %int_2\n      %19281 = OpLoad %150 %xe_fsr_easu_source\n      %13455 = OpLoad %508 %xe_fsr_easu_sampler\n      %10389 = OpSampledImage %510 %19281 %13455\n      %10430 = OpImageGather %v4float %10389 %15446 %int_0\n      %19282 = OpLoad %150 %xe_fsr_easu_source\n      %13456 = OpLoad %508 %xe_fsr_easu_sampler\n      %10390 = OpSampledImage %510 %19282 %13456\n      %10431 = OpImageGather %v4float %10390 %15446 %int_1\n      %19283 = OpLoad %150 %xe_fsr_easu_source\n      %13457 = OpLoad %508 %xe_fsr_easu_sampler\n      %10391 = OpSampledImage %510 %19283 %13457\n      %10432 = OpImageGather %v4float %10391 %15446 %int_2\n      %19284 = OpLoad %150 %xe_fsr_easu_source\n      %13458 = OpLoad %508 %xe_fsr_easu_sampler\n      %10392 = OpSampledImage %510 %19284 %13458\n      %10433 = OpImageGather %v4float %10392 %17361 %int_0\n      %19285 = OpLoad %150 %xe_fsr_easu_source\n      %13459 = OpLoad %508 %xe_fsr_easu_sampler\n      %10393 = OpSampledImage %510 %19285 %13459\n      %10434 = OpImageGather %v4float %10393 %17361 %int_1\n      %19286 = OpLoad %150 %xe_fsr_easu_source\n      %13460 = OpLoad %508 %xe_fsr_easu_sampler\n      %11751 = OpSampledImage %510 %19286 %13460\n      %18407 = OpImageGather %v4float %11751 %17361 %int_2\n      %21556 = OpFMul %v4float %10426 %325\n      %20200 = OpFMul %v4float %10424 %325\n      %15690 = OpFAdd %v4float %20200 %10425\n      %22451 = OpFAdd %v4float %21556 %15690\n      %11905 = OpFMul %v4float %10429 %325\n      %24215 = OpFMul %v4float %10427 %325\n      %15691 = OpFAdd %v4float %24215 %10428\n      %22452 = OpFAdd %v4float %11905 %15691\n      %11906 = OpFMul %v4float %10432 %325\n      %24216 = OpFMul %v4float %10430 %325\n      %15692 = OpFAdd %v4float %24216 %10431\n      %22453 = OpFAdd %v4float %11906 %15692\n      %11907 = OpFMul %v4float %18407 %325\n      %24217 = OpFMul %v4float %10433 %325\n      %14702 = OpFAdd %v4float %24217 %10434\n      %11388 = OpFAdd %v4float %11907 %14702\n       %7392 = OpCompositeExtract %float %22451 0\n      %14087 = OpCompositeExtract %float %22451 1\n       %7660 = OpCompositeExtract %float %22452 0\n       %7661 = OpCompositeExtract %float %22452 1\n       %7662 = OpCompositeExtract %float %22452 2\n       %7663 = OpCompositeExtract %float %22452 3\n       %7664 = OpCompositeExtract %float %22453 0\n       %7665 = OpCompositeExtract %float %22453 1\n       %7666 = OpCompositeExtract %float %22453 2\n       %7667 = OpCompositeExtract %float %22453 3\n       %7668 = OpCompositeExtract %float %11388 2\n       %8610 = OpCompositeExtract %float %11388 3\n      %18081 = OpCompositeExtract %float %21577 0\n      %12065 = OpFSub %float %float_1 %18081\n      %11876 = OpCompositeExtract %float %21577 1\n      %11109 = OpFSub %float %float_1 %11876\n      %17978 = OpFMul %float %12065 %11109\n      %20578 = OpFSub %float %7667 %7662\n      %11120 = OpFSub %float %7662 %7663\n       %6568 = OpExtInst %float %1 FAbs %20578\n      %13751 = OpExtInst %float %1 FAbs %11120\n      %18456 = OpExtInst %float %1 FMax %6568 %13751\n       %7301 = OpBitcast %uint %18456\n       %8951 = OpISub %uint %uint_2129690299 %7301\n       %8727 = OpBitcast %float %8951\n      %12281 = OpFSub %float %7667 %7663\n      %12070 = OpFMul %float %12281 %17978\n      %17296 = OpExtInst %float %1 FAbs %12281\n      %16149 = OpFMul %float %17296 %8727\n      %21377 = OpExtInst %float %1 FClamp %16149 %float_0 %float_1\n      %18443 = OpFMul %float %21377 %21377\n      %24605 = OpFSub %float %7661 %7662\n      %11121 = OpFSub %float %7662 %7392\n       %6569 = OpExtInst %float %1 FAbs %24605\n      %13752 = OpExtInst %float %1 FAbs %11121\n      %18457 = OpExtInst %float %1 FMax %6569 %13752\n       %7302 = OpBitcast %uint %18457\n       %8952 = OpISub %uint %uint_2129690299 %7302\n       %8728 = OpBitcast %float %8952\n      %12282 = OpFSub %float %7661 %7392\n      %12071 = OpFMul %float %12282 %17978\n      %17297 = OpExtInst %float %1 FAbs %12282\n      %16150 = OpFMul %float %17297 %8728\n      %21339 = OpExtInst %float %1 FClamp %16150 %float_0 %float_1\n      %18827 = OpFMul %float %21339 %21339\n      %23869 = OpFAdd %float %18443 %18827\n       %8712 = OpFMul %float %17978 %23869\n      %21650 = OpFMul %float %18081 %11109\n      %23272 = OpFSub %float %7666 %7667\n       %6930 = OpExtInst %float %1 FAbs %23272\n      %13180 = OpExtInst %float %1 FMax %6930 %6568\n       %7303 = OpBitcast %uint %13180\n       %8953 = OpISub %uint %uint_2129690299 %7303\n       %8729 = OpBitcast %float %8953\n      %14500 = OpFSub %float %7666 %7662\n      %21690 = OpFMul %float %14500 %21650\n       %8619 = OpFAdd %float %12070 %21690\n       %7291 = OpExtInst %float %1 FAbs %14500\n      %12923 = OpFMul %float %7291 %8729\n      %21415 = OpExtInst %float %1 FClamp %12923 %float_0 %float_1\n      %18059 = OpFMul %float %21415 %21415\n      %10822 = OpFMul %float %18059 %21650\n      %15306 = OpFAdd %float %8712 %10822\n      %23187 = OpFSub %float %7664 %7667\n       %7894 = OpFSub %float %7667 %14087\n       %6570 = OpExtInst %float %1 FAbs %23187\n      %13753 = OpExtInst %float %1 FAbs %7894\n      %18458 = OpExtInst %float %1 FMax %6570 %13753\n       %7304 = OpBitcast %uint %18458\n       %8954 = OpISub %uint %uint_2129690299 %7304\n       %8730 = OpBitcast %float %8954\n      %14501 = OpFSub %float %7664 %14087\n      %21691 = OpFMul %float %14501 %21650\n       %8620 = OpFAdd %float %12071 %21691\n       %7292 = OpExtInst %float %1 FAbs %14501\n      %12924 = OpFMul %float %7292 %8730\n      %21416 = OpExtInst %float %1 FClamp %12924 %float_0 %float_1\n      %18061 = OpFMul %float %21416 %21416\n      %10860 = OpFMul %float %18061 %21650\n      %14960 = OpFAdd %float %15306 %10860\n       %9058 = OpFMul %float %12065 %11876\n      %18965 = OpFSub %float %7664 %7661\n      %11122 = OpFSub %float %7661 %7660\n       %6571 = OpExtInst %float %1 FAbs %18965\n      %13754 = OpExtInst %float %1 FAbs %11122\n      %18459 = OpExtInst %float %1 FMax %6571 %13754\n       %7305 = OpBitcast %uint %18459\n       %8955 = OpISub %uint %uint_2129690299 %7305\n       %8731 = OpBitcast %float %8955\n      %14502 = OpFSub %float %7664 %7660\n      %21692 = OpFMul %float %14502 %9058\n       %8621 = OpFAdd %float %8619 %21692\n       %7293 = OpExtInst %float %1 FAbs %14502\n      %12925 = OpFMul %float %7293 %8731\n      %21417 = OpExtInst %float %1 FClamp %12925 %float_0 %float_1\n      %18062 = OpFMul %float %21417 %21417\n      %10823 = OpFMul %float %18062 %9058\n      %13049 = OpFAdd %float %14960 %10823\n      %11654 = OpFSub %float %8610 %7661\n      %10161 = OpExtInst %float %1 FAbs %11654\n      %13181 = OpExtInst %float %1 FMax %10161 %6569\n       %7306 = OpBitcast %uint %13181\n       %8956 = OpISub %uint %uint_2129690299 %7306\n       %8732 = OpBitcast %float %8956\n      %14503 = OpFSub %float %8610 %7662\n      %21693 = OpFMul %float %14503 %9058\n       %8622 = OpFAdd %float %8620 %21693\n       %7294 = OpExtInst %float %1 FAbs %14503\n      %12926 = OpFMul %float %7294 %8732\n      %21418 = OpExtInst %float %1 FClamp %12926 %float_0 %float_1\n      %18063 = OpFMul %float %21418 %21418\n      %10861 = OpFMul %float %18063 %9058\n      %14961 = OpFAdd %float %13049 %10861\n       %6801 = OpFMul %float %18081 %11876\n       %7432 = OpFSub %float %7665 %7664\n       %6931 = OpExtInst %float %1 FAbs %7432\n      %13182 = OpExtInst %float %1 FMax %6931 %6571\n       %7307 = OpBitcast %uint %13182\n       %8957 = OpISub %uint %uint_2129690299 %7307\n       %8733 = OpBitcast %float %8957\n      %14504 = OpFSub %float %7665 %7661\n      %21694 = OpFMul %float %14504 %6801\n       %8623 = OpFAdd %float %8621 %21694\n       %7295 = OpExtInst %float %1 FAbs %14504\n      %12927 = OpFMul %float %7295 %8733\n      %21419 = OpExtInst %float %1 FClamp %12927 %float_0 %float_1\n      %18064 = OpFMul %float %21419 %21419\n      %10824 = OpFMul %float %18064 %6801\n      %13050 = OpFAdd %float %14961 %10824\n      %11655 = OpFSub %float %7668 %7664\n      %10162 = OpExtInst %float %1 FAbs %11655\n      %13183 = OpExtInst %float %1 FMax %10162 %6570\n       %7308 = OpBitcast %uint %13183\n       %8958 = OpISub %uint %uint_2129690299 %7308\n       %8734 = OpBitcast %float %8958\n      %14505 = OpFSub %float %7668 %7667\n      %22978 = OpFMul %float %14505 %6801\n       %7645 = OpFAdd %float %8622 %22978\n      %18651 = OpCompositeConstruct %v2float %8623 %7645\n      %11009 = OpExtInst %float %1 FAbs %14505\n       %8918 = OpFMul %float %11009 %8734\n      %21420 = OpExtInst %float %1 FClamp %8918 %float_0 %float_1\n      %18065 = OpFMul %float %21420 %21420\n      %10862 = OpFMul %float %18065 %6801\n      %14010 = OpFAdd %float %13050 %10862\n      %16758 = OpFMul %v2float %18651 %18651\n      %19922 = OpCompositeExtract %float %16758 0\n      %23580 = OpCompositeExtract %float %16758 1\n      %10499 = OpFAdd %float %19922 %23580\n      %22603 = OpFOrdLessThan %bool %10499 %float_3_05175781en05\n      %22071 = OpBitcast %uint %10499\n      %18491 = OpShiftRightLogical %uint %22071 %uint_1\n      %20312 = OpISub %uint %uint_1597275508 %18491\n       %7636 = OpBitcast %float %20312\n      %20252 = OpSelect %float %22603 %float_1 %7636\n      %18321 = OpSelect %float %22603 %float_1 %8623\n      %15003 = OpCompositeInsert %v2float %18321 %18651 0\n      %13998 = OpCompositeConstruct %v2float %20252 %20252\n      %10076 = OpFMul %v2float %15003 %13998\n      %12149 = OpFMul %float %14010 %float_0_5\n      %10293 = OpFMul %float %12149 %12149\n      %13240 = OpCompositeExtract %float %10076 0\n      %24441 = OpFMul %float %13240 %13240\n      %23570 = OpCompositeExtract %float %10076 1\n      %13842 = OpFMul %float %23570 %23570\n      %17355 = OpFAdd %float %24441 %13842\n      %15136 = OpExtInst %float %1 FAbs %13240\n      %18595 = OpExtInst %float %1 FAbs %23570\n      %18460 = OpExtInst %float %1 FMax %15136 %18595\n       %7309 = OpBitcast %uint %18460\n       %8989 = OpISub %uint %uint_2129690299 %7309\n       %8343 = OpBitcast %float %8989\n      %17607 = OpFMul %float %17355 %8343\n      %20034 = OpFSub %float %17607 %float_1\n       %8944 = OpFMul %float %20034 %10293\n      %19766 = OpFAdd %float %float_1 %8944\n       %8435 = OpFMul %float %float_n0_5 %10293\n       %8327 = OpFAdd %float %float_1 %8435\n      %10727 = OpCompositeConstruct %v2float %19766 %8327\n      %19446 = OpFMul %float %float_n0_289999992 %10293\n       %9267 = OpFAdd %float %float_0_5 %19446\n       %6551 = OpBitcast %uint %9267\n       %6689 = OpISub %uint %uint_2129690299 %6551\n      %16389 = OpBitcast %float %6689\n      %19129 = OpCompositeExtract %float %10427 2\n      %13264 = OpCompositeExtract %float %10428 2\n       %7833 = OpCompositeExtract %float %10429 2\n      %15853 = OpCompositeConstruct %v3float %19129 %13264 %7833\n       %7909 = OpCompositeExtract %float %10430 3\n      %22677 = OpCompositeExtract %float %10431 3\n       %7834 = OpCompositeExtract %float %10432 3\n      %15854 = OpCompositeConstruct %v3float %7909 %22677 %7834\n       %7910 = OpCompositeExtract %float %10427 1\n      %22678 = OpCompositeExtract %float %10428 1\n       %6559 = OpCompositeExtract %float %10429 1\n      %15138 = OpCompositeConstruct %v3float %7910 %22678 %6559\n      %16895 = OpExtInst %v3float %1 FMin %15854 %15138\n      %21831 = OpExtInst %v3float %1 FMin %15853 %16895\n       %8236 = OpCompositeExtract %float %10430 0\n      %11052 = OpCompositeExtract %float %10431 0\n       %6560 = OpCompositeExtract %float %10432 0\n      %15141 = OpCompositeConstruct %v3float %8236 %11052 %6560\n      %10578 = OpExtInst %v3float %1 FMin %21831 %15141\n      %16850 = OpExtInst %v3float %1 FMax %15854 %15138\n      %19744 = OpExtInst %v3float %1 FMax %15853 %16850\n      %18959 = OpExtInst %v3float %1 FMax %19744 %15141\n      %15703 = OpFSub %v2float %889 %21577\n       %8206 = OpCompositeExtract %float %10424 0\n      %15681 = OpCompositeExtract %float %10425 0\n       %7835 = OpCompositeExtract %float %10426 0\n      %16841 = OpCompositeConstruct %v3float %8206 %15681 %7835\n      %17984 = OpCompositeExtract %float %15703 0\n      %17210 = OpFMul %float %17984 %13240\n      %23571 = OpCompositeExtract %float %15703 1\n      %16023 = OpFMul %float %23571 %23570\n      %12840 = OpFAdd %float %17210 %16023\n      %19767 = OpFNegate %float %23570\n      %12403 = OpFMul %float %17984 %19767\n      %21671 = OpFMul %float %23571 %13240\n      %24167 = OpFAdd %float %12403 %21671\n       %9815 = OpCompositeConstruct %v2float %12840 %24167\n       %8850 = OpFMul %v2float %9815 %10727\n      %25080 = OpCompositeExtract %float %8850 0\n      %24442 = OpFMul %float %25080 %25080\n      %23572 = OpCompositeExtract %float %8850 1\n      %13875 = OpFMul %float %23572 %23572\n      %21357 = OpFAdd %float %24442 %13875\n      %10961 = OpExtInst %float %1 FMin %21357 %16389\n      %10077 = OpFMul %float %float_0_400000006 %10961\n      %21594 = OpFAdd %float %10077 %float_n1\n       %9442 = OpFMul %float %9267 %10961\n      %18229 = OpFAdd %float %9442 %float_n1\n       %8750 = OpFMul %float %21594 %21594\n      %23523 = OpFMul %float %18229 %18229\n      %21060 = OpFMul %float %float_1_5625 %8750\n      %15169 = OpFAdd %float %21060 %float_n0_5625\n       %7155 = OpFMul %float %15169 %23523\n       %6433 = OpVectorTimesScalar %v3float %16841 %7155\n      %10536 = OpFSub %v2float %768 %21577\n       %7693 = OpCompositeExtract %float %10424 1\n      %15682 = OpCompositeExtract %float %10425 1\n       %7836 = OpCompositeExtract %float %10426 1\n      %16842 = OpCompositeConstruct %v3float %7693 %15682 %7836\n      %17985 = OpCompositeExtract %float %10536 0\n      %17211 = OpFMul %float %17985 %13240\n      %23573 = OpCompositeExtract %float %10536 1\n      %16137 = OpFMul %float %23573 %23570\n      %11802 = OpFAdd %float %17211 %16137\n       %8674 = OpFMul %float %17985 %19767\n      %23284 = OpFMul %float %23573 %13240\n      %24168 = OpFAdd %float %8674 %23284\n       %9816 = OpCompositeConstruct %v2float %11802 %24168\n       %8851 = OpFMul %v2float %9816 %10727\n      %25081 = OpCompositeExtract %float %8851 0\n      %24443 = OpFMul %float %25081 %25081\n      %23574 = OpCompositeExtract %float %8851 1\n      %13876 = OpFMul %float %23574 %23574\n      %21358 = OpFAdd %float %24443 %13876\n      %10962 = OpExtInst %float %1 FMin %21358 %16389\n      %10078 = OpFMul %float %float_0_400000006 %10962\n      %21595 = OpFAdd %float %10078 %float_n1\n       %9443 = OpFMul %float %9267 %10962\n      %18230 = OpFAdd %float %9443 %float_n1\n       %8751 = OpFMul %float %21595 %21595\n      %23524 = OpFMul %float %18230 %18230\n      %21061 = OpFMul %float %float_1_5625 %8751\n      %15170 = OpFAdd %float %21061 %float_n0_5625\n       %7117 = OpFMul %float %15170 %23524\n       %7691 = OpVectorTimesScalar %v3float %16842 %7117\n       %6954 = OpFAdd %v3float %6433 %7691\n       %6768 = OpFAdd %float %7155 %7117\n      %17304 = OpFSub %v2float %73 %21577\n       %6894 = OpCompositeExtract %float %10427 0\n      %15683 = OpCompositeExtract %float %10428 0\n       %7837 = OpCompositeExtract %float %10429 0\n      %16843 = OpCompositeConstruct %v3float %6894 %15683 %7837\n      %17986 = OpCompositeExtract %float %17304 0\n      %17212 = OpFMul %float %17986 %13240\n      %23575 = OpCompositeExtract %float %17304 1\n      %16138 = OpFMul %float %23575 %23570\n      %11803 = OpFAdd %float %17212 %16138\n       %8675 = OpFMul %float %17986 %19767\n      %23285 = OpFMul %float %23575 %13240\n      %24169 = OpFAdd %float %8675 %23285\n       %9817 = OpCompositeConstruct %v2float %11803 %24169\n       %8852 = OpFMul %v2float %9817 %10727\n      %25082 = OpCompositeExtract %float %8852 0\n      %24444 = OpFMul %float %25082 %25082\n      %23576 = OpCompositeExtract %float %8852 1\n      %13877 = OpFMul %float %23576 %23576\n      %21359 = OpFAdd %float %24444 %13877\n      %10963 = OpExtInst %float %1 FMin %21359 %16389\n      %10079 = OpFMul %float %float_0_400000006 %10963\n      %21596 = OpFAdd %float %10079 %float_n1\n       %9444 = OpFMul %float %9267 %10963\n      %18231 = OpFAdd %float %9444 %float_n1\n       %8752 = OpFMul %float %21596 %21596\n      %23525 = OpFMul %float %18231 %18231\n      %21062 = OpFMul %float %float_1_5625 %8752\n      %15171 = OpFAdd %float %21062 %float_n0_5625\n       %7118 = OpFMul %float %15171 %23525\n       %7692 = OpVectorTimesScalar %v3float %16843 %7118\n       %6955 = OpFAdd %v3float %6954 %7692\n       %6769 = OpFAdd %float %6768 %7118\n      %18292 = OpFSub %v2float %890 %21577\n      %16969 = OpCompositeExtract %float %18292 0\n      %22828 = OpFMul %float %16969 %13240\n      %23577 = OpCompositeExtract %float %18292 1\n      %16139 = OpFMul %float %23577 %23570\n      %11804 = OpFAdd %float %22828 %16139\n       %8676 = OpFMul %float %16969 %19767\n      %23286 = OpFMul %float %23577 %13240\n      %24170 = OpFAdd %float %8676 %23286\n       %9818 = OpCompositeConstruct %v2float %11804 %24170\n       %8853 = OpFMul %v2float %9818 %10727\n      %25083 = OpCompositeExtract %float %8853 0\n      %24445 = OpFMul %float %25083 %25083\n      %23578 = OpCompositeExtract %float %8853 1\n      %13878 = OpFMul %float %23578 %23578\n      %21360 = OpFAdd %float %24445 %13878\n      %10964 = OpExtInst %float %1 FMin %21360 %16389\n      %10080 = OpFMul %float %float_0_400000006 %10964\n      %21597 = OpFAdd %float %10080 %float_n1\n       %9445 = OpFMul %float %9267 %10964\n      %18232 = OpFAdd %float %9445 %float_n1\n       %8753 = OpFMul %float %21597 %21597\n      %23526 = OpFMul %float %18232 %18232\n      %21063 = OpFMul %float %float_1_5625 %8753\n      %15172 = OpFAdd %float %21063 %float_n0_5625\n       %7119 = OpFMul %float %15172 %23526\n       %7694 = OpVectorTimesScalar %v3float %15138 %7119\n       %6878 = OpFAdd %v3float %6955 %7694\n       %7460 = OpFAdd %float %6769 %7119\n      %12922 = OpFNegate %v2float %21577\n      %24422 = OpCompositeExtract %float %12922 0\n       %6988 = OpFMul %float %24422 %13240\n      %23579 = OpCompositeExtract %float %12922 1\n      %16140 = OpFMul %float %23579 %23570\n      %11805 = OpFAdd %float %6988 %16140\n       %8677 = OpFMul %float %24422 %19767\n      %23287 = OpFMul %float %23579 %13240\n      %24171 = OpFAdd %float %8677 %23287\n       %9819 = OpCompositeConstruct %v2float %11805 %24171\n       %8854 = OpFMul %v2float %9819 %10727\n      %25084 = OpCompositeExtract %float %8854 0\n      %24446 = OpFMul %float %25084 %25084\n      %23581 = OpCompositeExtract %float %8854 1\n      %13879 = OpFMul %float %23581 %23581\n      %21361 = OpFAdd %float %24446 %13879\n      %10965 = OpExtInst %float %1 FMin %21361 %16389\n      %10081 = OpFMul %float %float_0_400000006 %10965\n      %21598 = OpFAdd %float %10081 %float_n1\n       %9446 = OpFMul %float %9267 %10965\n      %18233 = OpFAdd %float %9446 %float_n1\n       %8754 = OpFMul %float %21598 %21598\n      %23527 = OpFMul %float %18233 %18233\n      %21064 = OpFMul %float %float_1_5625 %8754\n      %15173 = OpFAdd %float %21064 %float_n0_5625\n       %7120 = OpFMul %float %15173 %23527\n       %7695 = OpVectorTimesScalar %v3float %15853 %7120\n       %6956 = OpFAdd %v3float %6878 %7695\n       %6770 = OpFAdd %float %7460 %7120\n      %17305 = OpFSub %v2float %2628 %21577\n       %6895 = OpCompositeExtract %float %10427 3\n      %15684 = OpCompositeExtract %float %10428 3\n       %7838 = OpCompositeExtract %float %10429 3\n      %16844 = OpCompositeConstruct %v3float %6895 %15684 %7838\n      %17987 = OpCompositeExtract %float %17305 0\n      %17213 = OpFMul %float %17987 %13240\n      %23582 = OpCompositeExtract %float %17305 1\n      %16141 = OpFMul %float %23582 %23570\n      %11806 = OpFAdd %float %17213 %16141\n       %8678 = OpFMul %float %17987 %19767\n      %23288 = OpFMul %float %23582 %13240\n      %24172 = OpFAdd %float %8678 %23288\n       %9820 = OpCompositeConstruct %v2float %11806 %24172\n       %8855 = OpFMul %v2float %9820 %10727\n      %25085 = OpCompositeExtract %float %8855 0\n      %24447 = OpFMul %float %25085 %25085\n      %23583 = OpCompositeExtract %float %8855 1\n      %13880 = OpFMul %float %23583 %23583\n      %21362 = OpFAdd %float %24447 %13880\n      %10966 = OpExtInst %float %1 FMin %21362 %16389\n      %10082 = OpFMul %float %float_0_400000006 %10966\n      %21599 = OpFAdd %float %10082 %float_n1\n       %9447 = OpFMul %float %9267 %10966\n      %18234 = OpFAdd %float %9447 %float_n1\n       %8755 = OpFMul %float %21599 %21599\n      %23528 = OpFMul %float %18234 %18234\n      %21065 = OpFMul %float %float_1_5625 %8755\n      %15174 = OpFAdd %float %21065 %float_n0_5625\n       %7121 = OpFMul %float %15174 %23528\n       %7696 = OpVectorTimesScalar %v3float %16844 %7121\n       %6957 = OpFAdd %v3float %6956 %7696\n       %6771 = OpFAdd %float %6770 %7121\n      %18293 = OpFSub %v2float %769 %21577\n      %16970 = OpCompositeExtract %float %18293 0\n      %22829 = OpFMul %float %16970 %13240\n      %23584 = OpCompositeExtract %float %18293 1\n      %16142 = OpFMul %float %23584 %23570\n      %11807 = OpFAdd %float %22829 %16142\n       %8679 = OpFMul %float %16970 %19767\n      %23289 = OpFMul %float %23584 %13240\n      %24173 = OpFAdd %float %8679 %23289\n       %9821 = OpCompositeConstruct %v2float %11807 %24173\n       %8856 = OpFMul %v2float %9821 %10727\n      %25086 = OpCompositeExtract %float %8856 0\n      %24448 = OpFMul %float %25086 %25086\n      %23585 = OpCompositeExtract %float %8856 1\n      %13881 = OpFMul %float %23585 %23585\n      %21363 = OpFAdd %float %24448 %13881\n      %10967 = OpExtInst %float %1 FMin %21363 %16389\n      %10083 = OpFMul %float %float_0_400000006 %10967\n      %21600 = OpFAdd %float %10083 %float_n1\n       %9448 = OpFMul %float %9267 %10967\n      %18235 = OpFAdd %float %9448 %float_n1\n       %8756 = OpFMul %float %21600 %21600\n      %23529 = OpFMul %float %18235 %18235\n      %21066 = OpFMul %float %float_1_5625 %8756\n      %15175 = OpFAdd %float %21066 %float_n0_5625\n       %7122 = OpFMul %float %15175 %23529\n       %7697 = OpVectorTimesScalar %v3float %15141 %7122\n       %6958 = OpFAdd %v3float %6957 %7697\n       %6772 = OpFAdd %float %6771 %7122\n      %17306 = OpFSub %v2float %426 %21577\n       %6896 = OpCompositeExtract %float %10430 1\n      %15685 = OpCompositeExtract %float %10431 1\n       %7839 = OpCompositeExtract %float %10432 1\n      %16845 = OpCompositeConstruct %v3float %6896 %15685 %7839\n      %17988 = OpCompositeExtract %float %17306 0\n      %17215 = OpFMul %float %17988 %13240\n      %23586 = OpCompositeExtract %float %17306 1\n      %16143 = OpFMul %float %23586 %23570\n      %11808 = OpFAdd %float %17215 %16143\n       %8680 = OpFMul %float %17988 %19767\n      %23290 = OpFMul %float %23586 %13240\n      %24174 = OpFAdd %float %8680 %23290\n       %9822 = OpCompositeConstruct %v2float %11808 %24174\n       %8857 = OpFMul %v2float %9822 %10727\n      %25087 = OpCompositeExtract %float %8857 0\n      %24449 = OpFMul %float %25087 %25087\n      %23587 = OpCompositeExtract %float %8857 1\n      %13882 = OpFMul %float %23587 %23587\n      %21364 = OpFAdd %float %24449 %13882\n      %10968 = OpExtInst %float %1 FMin %21364 %16389\n      %10084 = OpFMul %float %float_0_400000006 %10968\n      %21601 = OpFAdd %float %10084 %float_n1\n       %9449 = OpFMul %float %9267 %10968\n      %18236 = OpFAdd %float %9449 %float_n1\n       %8757 = OpFMul %float %21601 %21601\n      %23530 = OpFMul %float %18236 %18236\n      %21067 = OpFMul %float %float_1_5625 %8757\n      %15176 = OpFAdd %float %21067 %float_n0_5625\n       %7123 = OpFMul %float %15176 %23530\n       %7698 = OpVectorTimesScalar %v3float %16845 %7123\n       %6960 = OpFAdd %v3float %6958 %7698\n       %6773 = OpFAdd %float %6772 %7123\n      %17307 = OpFSub %v2float %2981 %21577\n       %6897 = OpCompositeExtract %float %10430 2\n      %15686 = OpCompositeExtract %float %10431 2\n       %7840 = OpCompositeExtract %float %10432 2\n      %16846 = OpCompositeConstruct %v3float %6897 %15686 %7840\n      %17989 = OpCompositeExtract %float %17307 0\n      %17216 = OpFMul %float %17989 %13240\n      %23588 = OpCompositeExtract %float %17307 1\n      %16144 = OpFMul %float %23588 %23570\n      %11809 = OpFAdd %float %17216 %16144\n       %8681 = OpFMul %float %17989 %19767\n      %23291 = OpFMul %float %23588 %13240\n      %24175 = OpFAdd %float %8681 %23291\n       %9823 = OpCompositeConstruct %v2float %11809 %24175\n       %8858 = OpFMul %v2float %9823 %10727\n      %25088 = OpCompositeExtract %float %8858 0\n      %24450 = OpFMul %float %25088 %25088\n      %23589 = OpCompositeExtract %float %8858 1\n      %13883 = OpFMul %float %23589 %23589\n      %21365 = OpFAdd %float %24450 %13883\n      %10969 = OpExtInst %float %1 FMin %21365 %16389\n      %10085 = OpFMul %float %float_0_400000006 %10969\n      %21602 = OpFAdd %float %10085 %float_n1\n       %9450 = OpFMul %float %9267 %10969\n      %18237 = OpFAdd %float %9450 %float_n1\n       %8758 = OpFMul %float %21602 %21602\n      %23531 = OpFMul %float %18237 %18237\n      %21068 = OpFMul %float %float_1_5625 %8758\n      %15177 = OpFAdd %float %21068 %float_n0_5625\n       %7124 = OpFMul %float %15177 %23531\n       %7699 = OpVectorTimesScalar %v3float %16846 %7124\n       %6961 = OpFAdd %v3float %6960 %7699\n       %6774 = OpFAdd %float %6773 %7124\n      %18294 = OpFSub %v2float %312 %21577\n      %16971 = OpCompositeExtract %float %18294 0\n      %22830 = OpFMul %float %16971 %13240\n      %23590 = OpCompositeExtract %float %18294 1\n      %16145 = OpFMul %float %23590 %23570\n      %11810 = OpFAdd %float %22830 %16145\n       %8682 = OpFMul %float %16971 %19767\n      %23292 = OpFMul %float %23590 %13240\n      %24176 = OpFAdd %float %8682 %23292\n       %9824 = OpCompositeConstruct %v2float %11810 %24176\n       %8859 = OpFMul %v2float %9824 %10727\n      %25089 = OpCompositeExtract %float %8859 0\n      %24451 = OpFMul %float %25089 %25089\n      %23591 = OpCompositeExtract %float %8859 1\n      %13884 = OpFMul %float %23591 %23591\n      %21366 = OpFAdd %float %24451 %13884\n      %10970 = OpExtInst %float %1 FMin %21366 %16389\n      %10086 = OpFMul %float %float_0_400000006 %10970\n      %21603 = OpFAdd %float %10086 %float_n1\n       %9451 = OpFMul %float %9267 %10970\n      %18238 = OpFAdd %float %9451 %float_n1\n       %8759 = OpFMul %float %21603 %21603\n      %23532 = OpFMul %float %18238 %18238\n      %21069 = OpFMul %float %float_1_5625 %8759\n      %15178 = OpFAdd %float %21069 %float_n0_5625\n       %7125 = OpFMul %float %15178 %23532\n       %7700 = OpVectorTimesScalar %v3float %15854 %7125\n       %6962 = OpFAdd %v3float %6961 %7700\n       %6775 = OpFAdd %float %6774 %7125\n      %17308 = OpFSub %v2float %313 %21577\n       %6898 = OpCompositeExtract %float %10433 2\n      %15687 = OpCompositeExtract %float %10434 2\n       %7841 = OpCompositeExtract %float %18407 2\n      %16847 = OpCompositeConstruct %v3float %6898 %15687 %7841\n      %17990 = OpCompositeExtract %float %17308 0\n      %17217 = OpFMul %float %17990 %13240\n      %23592 = OpCompositeExtract %float %17308 1\n      %16146 = OpFMul %float %23592 %23570\n      %11811 = OpFAdd %float %17217 %16146\n       %8683 = OpFMul %float %17990 %19767\n      %23293 = OpFMul %float %23592 %13240\n      %24177 = OpFAdd %float %8683 %23293\n       %9825 = OpCompositeConstruct %v2float %11811 %24177\n       %8860 = OpFMul %v2float %9825 %10727\n      %25090 = OpCompositeExtract %float %8860 0\n      %24452 = OpFMul %float %25090 %25090\n      %23593 = OpCompositeExtract %float %8860 1\n      %13885 = OpFMul %float %23593 %23593\n      %21367 = OpFAdd %float %24452 %13885\n      %10971 = OpExtInst %float %1 FMin %21367 %16389\n      %10087 = OpFMul %float %float_0_400000006 %10971\n      %21604 = OpFAdd %float %10087 %float_n1\n       %9452 = OpFMul %float %9267 %10971\n      %18239 = OpFAdd %float %9452 %float_n1\n       %8760 = OpFMul %float %21604 %21604\n      %23533 = OpFMul %float %18239 %18239\n      %21070 = OpFMul %float %float_1_5625 %8760\n      %15179 = OpFAdd %float %21070 %float_n0_5625\n       %7126 = OpFMul %float %15179 %23533\n       %7701 = OpVectorTimesScalar %v3float %16847 %7126\n       %6963 = OpFAdd %v3float %6962 %7701\n       %6776 = OpFAdd %float %6775 %7126\n      %17309 = OpFSub %v2float %1823 %21577\n       %6899 = OpCompositeExtract %float %10433 3\n      %15688 = OpCompositeExtract %float %10434 3\n       %7842 = OpCompositeExtract %float %18407 3\n      %16848 = OpCompositeConstruct %v3float %6899 %15688 %7842\n      %17991 = OpCompositeExtract %float %17309 0\n      %17218 = OpFMul %float %17991 %13240\n      %23594 = OpCompositeExtract %float %17309 1\n      %16147 = OpFMul %float %23594 %23570\n      %11812 = OpFAdd %float %17218 %16147\n       %8684 = OpFMul %float %17991 %19767\n      %23294 = OpFMul %float %23594 %13240\n      %24178 = OpFAdd %float %8684 %23294\n       %9826 = OpCompositeConstruct %v2float %11812 %24178\n       %8861 = OpFMul %v2float %9826 %10727\n      %25091 = OpCompositeExtract %float %8861 0\n      %24453 = OpFMul %float %25091 %25091\n      %23595 = OpCompositeExtract %float %8861 1\n      %13886 = OpFMul %float %23595 %23595\n      %21368 = OpFAdd %float %24453 %13886\n      %10972 = OpExtInst %float %1 FMin %21368 %16389\n      %10088 = OpFMul %float %float_0_400000006 %10972\n      %21605 = OpFAdd %float %10088 %float_n1\n       %9453 = OpFMul %float %9267 %10972\n      %18240 = OpFAdd %float %9453 %float_n1\n       %8761 = OpFMul %float %21605 %21605\n      %23534 = OpFMul %float %18240 %18240\n      %21071 = OpFMul %float %float_1_5625 %8761\n      %15180 = OpFAdd %float %21071 %float_n0_5625\n       %7127 = OpFMul %float %15180 %23534\n       %7702 = OpVectorTimesScalar %v3float %16848 %7127\n       %7049 = OpFAdd %v3float %6963 %7702\n      %24955 = OpFAdd %float %6776 %7127\n      %15642 = OpFDiv %float %float_1 %24955\n      %16189 = OpCompositeConstruct %v3float %15642 %15642 %15642\n      %17132 = OpFMul %v3float %7049 %16189\n      %18007 = OpExtInst %v3float %1 FMax %10578 %17132\n      %12443 = OpExtInst %v3float %1 FMin %18959 %18007\n       %9794 = OpAccessChain %_ptr_Output_float %xe_fsr_easu_color %uint_0\n      %24795 = OpCompositeExtract %float %12443 0\n               OpStore %9794 %24795\n      %16378 = OpAccessChain %_ptr_Output_float %xe_fsr_easu_color %uint_1\n      %15746 = OpCompositeExtract %float %12443 1\n               OpStore %16378 %15746\n      %16379 = OpAccessChain %_ptr_Output_float %xe_fsr_easu_color %uint_2\n      %15747 = OpCompositeExtract %float %12443 2\n               OpStore %16379 %15747\n      %23295 = OpAccessChain %_ptr_Output_float %xe_fsr_easu_color %uint_3\n               OpStore %23295 %float_1\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t guest_output_ffx_fsr_easu_ps[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x000062B0, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0007000F, 0x00000004,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00001691, 0x00000C93, 0x00030010,\n    0x0000161F, 0x00000007, 0x00030003, 0x00000002, 0x000001CC, 0x00090004,\n    0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F, 0x5F776F6C, 0x72747461,\n    0x74756269, 0x00007365, 0x000B0004, 0x455F4C47, 0x735F5458, 0x6C706D61,\n    0x656C7265, 0x745F7373, 0x75747865, 0x665F6572, 0x74636E75, 0x736E6F69,\n    0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F, 0x70635F45, 0x74735F70,\n    0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365, 0x00006576, 0x00080004,\n    0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63, 0x69645F65, 0x74636572,\n    0x00657669, 0x00040005, 0x0000161F, 0x6E69616D, 0x00000000, 0x00070005,\n    0x00000406, 0x68737570, 0x6E6F635F, 0x625F7473, 0x6B636F6C, 0x0065785F,\n    0x000C0006, 0x00000406, 0x00000000, 0x665F6578, 0x655F7273, 0x5F757361,\n    0x75706E69, 0x756F5F74, 0x74757074, 0x7A69735F, 0x61725F65, 0x006F6974,\n    0x000A0006, 0x00000406, 0x00000001, 0x665F6578, 0x655F7273, 0x5F757361,\n    0x75706E69, 0x69735F74, 0x695F657A, 0x0000766E, 0x00060005, 0x00000CE9,\n    0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578, 0x00070005, 0x00001691,\n    0x665F6578, 0x655F7273, 0x5F757361, 0x6F6C6F63, 0x00000072, 0x00060005,\n    0x00000C93, 0x465F6C67, 0x43676172, 0x64726F6F, 0x00000000, 0x00070005,\n    0x000013C0, 0x665F6578, 0x655F7273, 0x5F757361, 0x72756F73, 0x00006563,\n    0x00070005, 0x00000FFB, 0x665F6578, 0x655F7273, 0x5F757361, 0x706D6173,\n    0x0072656C, 0x00030047, 0x00000406, 0x00000002, 0x00050048, 0x00000406,\n    0x00000000, 0x00000023, 0x00000010, 0x00050048, 0x00000406, 0x00000001,\n    0x00000023, 0x00000018, 0x00040047, 0x00001691, 0x0000001E, 0x00000000,\n    0x00040047, 0x00000C93, 0x0000000B, 0x0000000F, 0x00040047, 0x000013C0,\n    0x00000021, 0x00000000, 0x00040047, 0x000013C0, 0x00000022, 0x00000000,\n    0x00040047, 0x00000FFB, 0x00000021, 0x00000001, 0x00040047, 0x00000FFB,\n    0x00000022, 0x00000000, 0x00020013, 0x00000008, 0x00030021, 0x00000502,\n    0x00000008, 0x00030016, 0x0000000D, 0x00000020, 0x00040017, 0x00000013,\n    0x0000000D, 0x00000002, 0x00040017, 0x00000018, 0x0000000D, 0x00000003,\n    0x00040017, 0x0000001D, 0x0000000D, 0x00000004, 0x00040015, 0x0000000B,\n    0x00000020, 0x00000000, 0x00020014, 0x00000009, 0x00040017, 0x00000011,\n    0x0000000B, 0x00000002, 0x00040017, 0x00000017, 0x0000000B, 0x00000004,\n    0x0004001E, 0x00000406, 0x00000013, 0x00000013, 0x00040020, 0x00000683,\n    0x00000009, 0x00000406, 0x0004003B, 0x00000683, 0x00000CE9, 0x00000009,\n    0x00040015, 0x0000000C, 0x00000020, 0x00000001, 0x0004002B, 0x0000000C,\n    0x00000A0B, 0x00000000, 0x00040020, 0x00000290, 0x00000009, 0x00000013,\n    0x0004002B, 0x0000000D, 0x000000FC, 0x3F000000, 0x0004002B, 0x0000000D,\n    0x0000008A, 0x3F800000, 0x0004002B, 0x0000000D, 0x00000341, 0xBF800000,\n    0x0007002C, 0x0000001D, 0x00000504, 0x0000008A, 0x0000008A, 0x0000008A,\n    0x00000341, 0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001, 0x0004002B,\n    0x0000000D, 0x00000019, 0x40000000, 0x0007002C, 0x0000001D, 0x0000099C,\n    0x00000341, 0x00000019, 0x0000008A, 0x00000019, 0x0004002B, 0x0000000D,\n    0x00000A0C, 0x00000000, 0x0004002B, 0x0000000D, 0x00000B69, 0x40800000,\n    0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001, 0x00040020, 0x0000028A,\n    0x00000009, 0x0000000D, 0x0004002B, 0x0000000B, 0x00000A0A, 0x00000000,\n    0x00040020, 0x0000029A, 0x00000003, 0x0000001D, 0x0004003B, 0x0000029A,\n    0x00001691, 0x00000003, 0x00040020, 0x0000029B, 0x00000001, 0x0000001D,\n    0x0004003B, 0x0000029B, 0x00000C93, 0x00000001, 0x00040020, 0x0000028B,\n    0x00000003, 0x0000000D, 0x0004002B, 0x0000000B, 0x00000A10, 0x00000002,\n    0x0004002B, 0x0000000B, 0x00000A13, 0x00000003, 0x0004002B, 0x0000000B,\n    0x00000344, 0x7EF07EBB, 0x0004002B, 0x0000000B, 0x00000661, 0x5F347D74,\n    0x00090019, 0x00000096, 0x0000000D, 0x00000001, 0x00000000, 0x00000000,\n    0x00000000, 0x00000001, 0x00000000, 0x00040020, 0x00000313, 0x00000000,\n    0x00000096, 0x0004003B, 0x00000313, 0x000013C0, 0x00000000, 0x0002001A,\n    0x000001FC, 0x00040020, 0x00000479, 0x00000000, 0x000001FC, 0x0004003B,\n    0x00000479, 0x00000FFB, 0x00000000, 0x0003001B, 0x000001FE, 0x00000096,\n    0x0004002B, 0x0000000C, 0x00000A11, 0x00000002, 0x0004002B, 0x0000000D,\n    0x00000A93, 0x3ECCCCCD, 0x0004002B, 0x0000000D, 0x000004B3, 0x3FC80000,\n    0x0004002B, 0x0000000D, 0x000000B4, 0xBF100000, 0x0004002B, 0x0000000D,\n    0x00000738, 0x38000000, 0x0004002B, 0x0000000D, 0x000003B3, 0xBF000000,\n    0x0004002B, 0x0000000D, 0x0000075D, 0xBE947AE1, 0x0005002C, 0x00000013,\n    0x00000379, 0x00000A0C, 0x00000341, 0x0005002C, 0x00000013, 0x00000300,\n    0x0000008A, 0x00000341, 0x0005002C, 0x00000013, 0x00000049, 0x00000341,\n    0x0000008A, 0x0005002C, 0x00000013, 0x0000037A, 0x00000A0C, 0x0000008A,\n    0x0005002C, 0x00000013, 0x00000A44, 0x00000341, 0x00000A0C, 0x0005002C,\n    0x00000013, 0x00000301, 0x0000008A, 0x0000008A, 0x0005002C, 0x00000013,\n    0x000001AA, 0x00000019, 0x0000008A, 0x0005002C, 0x00000013, 0x00000BA5,\n    0x00000019, 0x00000A0C, 0x0005002C, 0x00000013, 0x00000138, 0x0000008A,\n    0x00000A0C, 0x0005002C, 0x00000013, 0x00000139, 0x0000008A, 0x00000019,\n    0x0005002C, 0x00000013, 0x0000071F, 0x00000A0C, 0x00000019, 0x0005002C,\n    0x00000013, 0x0000061E, 0x000000FC, 0x000000FC, 0x0007002C, 0x0000001D,\n    0x00000145, 0x000000FC, 0x000000FC, 0x000000FC, 0x000000FC, 0x00050036,\n    0x00000008, 0x0000161F, 0x00000000, 0x00000502, 0x000200F8, 0x00005D6B,\n    0x00050041, 0x00000290, 0x0000203A, 0x00000CE9, 0x00000A0B, 0x0004003D,\n    0x00000013, 0x00001B2F, 0x0000203A, 0x0004007C, 0x00000011, 0x00003455,\n    0x00001B2F, 0x0005008E, 0x00000013, 0x000031DA, 0x00001B2F, 0x000000FC,\n    0x00050083, 0x00000013, 0x00006013, 0x000031DA, 0x0000061E, 0x0004007C,\n    0x00000011, 0x0000454F, 0x00006013, 0x00050051, 0x0000000B, 0x00004143,\n    0x00003455, 0x00000000, 0x00050051, 0x0000000B, 0x000033E3, 0x00003455,\n    0x00000001, 0x00050051, 0x0000000B, 0x00001DD9, 0x0000454F, 0x00000000,\n    0x00050051, 0x0000000B, 0x00001D69, 0x0000454F, 0x00000001, 0x00070050,\n    0x00000017, 0x00004741, 0x00004143, 0x000033E3, 0x00001DD9, 0x00001D69,\n    0x00050041, 0x00000290, 0x000022DA, 0x00000CE9, 0x00000A0E, 0x0004003D,\n    0x00000013, 0x00001EF1, 0x000022DA, 0x0009004F, 0x0000001D, 0x0000215F,\n    0x00001EF1, 0x00001EF1, 0x00000000, 0x00000001, 0x00000000, 0x00000001,\n    0x00050085, 0x0000001D, 0x00002B50, 0x00000504, 0x0000215F, 0x0004007C,\n    0x00000017, 0x00003229, 0x00002B50, 0x00050085, 0x0000001D, 0x0000414D,\n    0x0000099C, 0x0000215F, 0x0004007C, 0x00000017, 0x00002D35, 0x0000414D,\n    0x00060041, 0x0000028A, 0x00004F87, 0x00000CE9, 0x00000A0E, 0x00000A0D,\n    0x0004003D, 0x0000000D, 0x000050C8, 0x00004F87, 0x00050085, 0x0000000D,\n    0x000046A9, 0x00000B69, 0x000050C8, 0x0004007C, 0x0000000B, 0x00004B0A,\n    0x000046A9, 0x00070050, 0x00000017, 0x00002A70, 0x00000A0A, 0x00004B0A,\n    0x00000A0A, 0x00000A0A, 0x0004003D, 0x0000001D, 0x000019E7, 0x00000C93,\n    0x0007004F, 0x00000013, 0x00003A1F, 0x000019E7, 0x000019E7, 0x00000000,\n    0x00000001, 0x0004006D, 0x00000011, 0x0000468C, 0x00003A1F, 0x00040070,\n    0x00000013, 0x000062AF, 0x0000468C, 0x0007004F, 0x00000011, 0x0000620D,\n    0x00004741, 0x00004741, 0x00000000, 0x00000001, 0x0004007C, 0x00000013,\n    0x00002D38, 0x0000620D, 0x00050085, 0x00000013, 0x0000514E, 0x000062AF,\n    0x00002D38, 0x0007004F, 0x00000011, 0x00002322, 0x00004741, 0x00004741,\n    0x00000002, 0x00000003, 0x0004007C, 0x00000013, 0x00002E15, 0x00002322,\n    0x00050081, 0x00000013, 0x00004E65, 0x0000514E, 0x00002E15, 0x0006000C,\n    0x00000013, 0x00002F62, 0x00000001, 0x00000008, 0x00004E65, 0x00050083,\n    0x00000013, 0x00005449, 0x00004E65, 0x00002F62, 0x0007004F, 0x00000011,\n    0x00006260, 0x00003229, 0x00003229, 0x00000000, 0x00000001, 0x0004007C,\n    0x00000013, 0x0000433E, 0x00006260, 0x00050085, 0x00000013, 0x0000514F,\n    0x00002F62, 0x0000433E, 0x0007004F, 0x00000011, 0x00002323, 0x00003229,\n    0x00003229, 0x00000002, 0x00000003, 0x0004007C, 0x00000013, 0x00003306,\n    0x00002323, 0x00050081, 0x00000013, 0x00003C54, 0x0000514F, 0x00003306,\n    0x0007004F, 0x00000011, 0x0000403F, 0x00002D35, 0x00002D35, 0x00000000,\n    0x00000001, 0x0004007C, 0x00000013, 0x00003FA5, 0x0000403F, 0x00050081,\n    0x00000013, 0x00003C55, 0x00003C54, 0x00003FA5, 0x0007004F, 0x00000011,\n    0x00004040, 0x00002D35, 0x00002D35, 0x00000002, 0x00000003, 0x0004007C,\n    0x00000013, 0x00003FA6, 0x00004040, 0x00050081, 0x00000013, 0x00003C56,\n    0x00003C54, 0x00003FA6, 0x0007004F, 0x00000011, 0x00004041, 0x00002A70,\n    0x00002A70, 0x00000000, 0x00000001, 0x0004007C, 0x00000013, 0x00003E4F,\n    0x00004041, 0x00050081, 0x00000013, 0x000043D1, 0x00003C54, 0x00003E4F,\n    0x0004003D, 0x00000096, 0x000053BB, 0x000013C0, 0x0004003D, 0x000001FC,\n    0x00004439, 0x00000FFB, 0x00050056, 0x000001FE, 0x0000288F, 0x000053BB,\n    0x00004439, 0x00060060, 0x0000001D, 0x000028B8, 0x0000288F, 0x00003C54,\n    0x00000A0B, 0x0004003D, 0x00000096, 0x00004B4C, 0x000013C0, 0x0004003D,\n    0x000001FC, 0x0000348A, 0x00000FFB, 0x00050056, 0x000001FE, 0x00002890,\n    0x00004B4C, 0x0000348A, 0x00060060, 0x0000001D, 0x000028B9, 0x00002890,\n    0x00003C54, 0x00000A0E, 0x0004003D, 0x00000096, 0x00004B4D, 0x000013C0,\n    0x0004003D, 0x000001FC, 0x0000348B, 0x00000FFB, 0x00050056, 0x000001FE,\n    0x00002891, 0x00004B4D, 0x0000348B, 0x00060060, 0x0000001D, 0x000028BA,\n    0x00002891, 0x00003C54, 0x00000A11, 0x0004003D, 0x00000096, 0x00004B4E,\n    0x000013C0, 0x0004003D, 0x000001FC, 0x0000348C, 0x00000FFB, 0x00050056,\n    0x000001FE, 0x00002892, 0x00004B4E, 0x0000348C, 0x00060060, 0x0000001D,\n    0x000028BB, 0x00002892, 0x00003C55, 0x00000A0B, 0x0004003D, 0x00000096,\n    0x00004B4F, 0x000013C0, 0x0004003D, 0x000001FC, 0x0000348D, 0x00000FFB,\n    0x00050056, 0x000001FE, 0x00002893, 0x00004B4F, 0x0000348D, 0x00060060,\n    0x0000001D, 0x000028BC, 0x00002893, 0x00003C55, 0x00000A0E, 0x0004003D,\n    0x00000096, 0x00004B50, 0x000013C0, 0x0004003D, 0x000001FC, 0x0000348E,\n    0x00000FFB, 0x00050056, 0x000001FE, 0x00002894, 0x00004B50, 0x0000348E,\n    0x00060060, 0x0000001D, 0x000028BD, 0x00002894, 0x00003C55, 0x00000A11,\n    0x0004003D, 0x00000096, 0x00004B51, 0x000013C0, 0x0004003D, 0x000001FC,\n    0x0000348F, 0x00000FFB, 0x00050056, 0x000001FE, 0x00002895, 0x00004B51,\n    0x0000348F, 0x00060060, 0x0000001D, 0x000028BE, 0x00002895, 0x00003C56,\n    0x00000A0B, 0x0004003D, 0x00000096, 0x00004B52, 0x000013C0, 0x0004003D,\n    0x000001FC, 0x00003490, 0x00000FFB, 0x00050056, 0x000001FE, 0x00002896,\n    0x00004B52, 0x00003490, 0x00060060, 0x0000001D, 0x000028BF, 0x00002896,\n    0x00003C56, 0x00000A0E, 0x0004003D, 0x00000096, 0x00004B53, 0x000013C0,\n    0x0004003D, 0x000001FC, 0x00003491, 0x00000FFB, 0x00050056, 0x000001FE,\n    0x00002897, 0x00004B53, 0x00003491, 0x00060060, 0x0000001D, 0x000028C0,\n    0x00002897, 0x00003C56, 0x00000A11, 0x0004003D, 0x00000096, 0x00004B54,\n    0x000013C0, 0x0004003D, 0x000001FC, 0x00003492, 0x00000FFB, 0x00050056,\n    0x000001FE, 0x00002898, 0x00004B54, 0x00003492, 0x00060060, 0x0000001D,\n    0x000028C1, 0x00002898, 0x000043D1, 0x00000A0B, 0x0004003D, 0x00000096,\n    0x00004B55, 0x000013C0, 0x0004003D, 0x000001FC, 0x00003493, 0x00000FFB,\n    0x00050056, 0x000001FE, 0x00002899, 0x00004B55, 0x00003493, 0x00060060,\n    0x0000001D, 0x000028C2, 0x00002899, 0x000043D1, 0x00000A0E, 0x0004003D,\n    0x00000096, 0x00004B56, 0x000013C0, 0x0004003D, 0x000001FC, 0x00003494,\n    0x00000FFB, 0x00050056, 0x000001FE, 0x00002DE7, 0x00004B56, 0x00003494,\n    0x00060060, 0x0000001D, 0x000047E7, 0x00002DE7, 0x000043D1, 0x00000A11,\n    0x00050085, 0x0000001D, 0x00005434, 0x000028BA, 0x00000145, 0x00050085,\n    0x0000001D, 0x00004EE8, 0x000028B8, 0x00000145, 0x00050081, 0x0000001D,\n    0x00003D4A, 0x00004EE8, 0x000028B9, 0x00050081, 0x0000001D, 0x000057B3,\n    0x00005434, 0x00003D4A, 0x00050085, 0x0000001D, 0x00002E81, 0x000028BD,\n    0x00000145, 0x00050085, 0x0000001D, 0x00005E97, 0x000028BB, 0x00000145,\n    0x00050081, 0x0000001D, 0x00003D4B, 0x00005E97, 0x000028BC, 0x00050081,\n    0x0000001D, 0x000057B4, 0x00002E81, 0x00003D4B, 0x00050085, 0x0000001D,\n    0x00002E82, 0x000028C0, 0x00000145, 0x00050085, 0x0000001D, 0x00005E98,\n    0x000028BE, 0x00000145, 0x00050081, 0x0000001D, 0x00003D4C, 0x00005E98,\n    0x000028BF, 0x00050081, 0x0000001D, 0x000057B5, 0x00002E82, 0x00003D4C,\n    0x00050085, 0x0000001D, 0x00002E83, 0x000047E7, 0x00000145, 0x00050085,\n    0x0000001D, 0x00005E99, 0x000028C1, 0x00000145, 0x00050081, 0x0000001D,\n    0x0000396E, 0x00005E99, 0x000028C2, 0x00050081, 0x0000001D, 0x00002C7C,\n    0x00002E83, 0x0000396E, 0x00050051, 0x0000000D, 0x00001CE0, 0x000057B3,\n    0x00000000, 0x00050051, 0x0000000D, 0x00003707, 0x000057B3, 0x00000001,\n    0x00050051, 0x0000000D, 0x00001DEC, 0x000057B4, 0x00000000, 0x00050051,\n    0x0000000D, 0x00001DED, 0x000057B4, 0x00000001, 0x00050051, 0x0000000D,\n    0x00001DEE, 0x000057B4, 0x00000002, 0x00050051, 0x0000000D, 0x00001DEF,\n    0x000057B4, 0x00000003, 0x00050051, 0x0000000D, 0x00001DF0, 0x000057B5,\n    0x00000000, 0x00050051, 0x0000000D, 0x00001DF1, 0x000057B5, 0x00000001,\n    0x00050051, 0x0000000D, 0x00001DF2, 0x000057B5, 0x00000002, 0x00050051,\n    0x0000000D, 0x00001DF3, 0x000057B5, 0x00000003, 0x00050051, 0x0000000D,\n    0x00001DF4, 0x00002C7C, 0x00000002, 0x00050051, 0x0000000D, 0x000021A2,\n    0x00002C7C, 0x00000003, 0x00050051, 0x0000000D, 0x000046A1, 0x00005449,\n    0x00000000, 0x00050083, 0x0000000D, 0x00002F21, 0x0000008A, 0x000046A1,\n    0x00050051, 0x0000000D, 0x00002E64, 0x00005449, 0x00000001, 0x00050083,\n    0x0000000D, 0x00002B65, 0x0000008A, 0x00002E64, 0x00050085, 0x0000000D,\n    0x0000463A, 0x00002F21, 0x00002B65, 0x00050083, 0x0000000D, 0x00005062,\n    0x00001DF3, 0x00001DEE, 0x00050083, 0x0000000D, 0x00002B70, 0x00001DEE,\n    0x00001DEF, 0x0006000C, 0x0000000D, 0x000019A8, 0x00000001, 0x00000004,\n    0x00005062, 0x0006000C, 0x0000000D, 0x000035B7, 0x00000001, 0x00000004,\n    0x00002B70, 0x0007000C, 0x0000000D, 0x00004818, 0x00000001, 0x00000028,\n    0x000019A8, 0x000035B7, 0x0004007C, 0x0000000B, 0x00001C85, 0x00004818,\n    0x00050082, 0x0000000B, 0x000022F7, 0x00000344, 0x00001C85, 0x0004007C,\n    0x0000000D, 0x00002217, 0x000022F7, 0x00050083, 0x0000000D, 0x00002FF9,\n    0x00001DF3, 0x00001DEF, 0x00050085, 0x0000000D, 0x00002F26, 0x00002FF9,\n    0x0000463A, 0x0006000C, 0x0000000D, 0x00004390, 0x00000001, 0x00000004,\n    0x00002FF9, 0x00050085, 0x0000000D, 0x00003F15, 0x00004390, 0x00002217,\n    0x0008000C, 0x0000000D, 0x00005381, 0x00000001, 0x0000002B, 0x00003F15,\n    0x00000A0C, 0x0000008A, 0x00050085, 0x0000000D, 0x0000480B, 0x00005381,\n    0x00005381, 0x00050083, 0x0000000D, 0x0000601D, 0x00001DED, 0x00001DEE,\n    0x00050083, 0x0000000D, 0x00002B71, 0x00001DEE, 0x00001CE0, 0x0006000C,\n    0x0000000D, 0x000019A9, 0x00000001, 0x00000004, 0x0000601D, 0x0006000C,\n    0x0000000D, 0x000035B8, 0x00000001, 0x00000004, 0x00002B71, 0x0007000C,\n    0x0000000D, 0x00004819, 0x00000001, 0x00000028, 0x000019A9, 0x000035B8,\n    0x0004007C, 0x0000000B, 0x00001C86, 0x00004819, 0x00050082, 0x0000000B,\n    0x000022F8, 0x00000344, 0x00001C86, 0x0004007C, 0x0000000D, 0x00002218,\n    0x000022F8, 0x00050083, 0x0000000D, 0x00002FFA, 0x00001DED, 0x00001CE0,\n    0x00050085, 0x0000000D, 0x00002F27, 0x00002FFA, 0x0000463A, 0x0006000C,\n    0x0000000D, 0x00004391, 0x00000001, 0x00000004, 0x00002FFA, 0x00050085,\n    0x0000000D, 0x00003F16, 0x00004391, 0x00002218, 0x0008000C, 0x0000000D,\n    0x0000535B, 0x00000001, 0x0000002B, 0x00003F16, 0x00000A0C, 0x0000008A,\n    0x00050085, 0x0000000D, 0x0000498B, 0x0000535B, 0x0000535B, 0x00050081,\n    0x0000000D, 0x00005D3D, 0x0000480B, 0x0000498B, 0x00050085, 0x0000000D,\n    0x00002208, 0x0000463A, 0x00005D3D, 0x00050085, 0x0000000D, 0x00005492,\n    0x000046A1, 0x00002B65, 0x00050083, 0x0000000D, 0x00005AE8, 0x00001DF2,\n    0x00001DF3, 0x0006000C, 0x0000000D, 0x00001B12, 0x00000001, 0x00000004,\n    0x00005AE8, 0x0007000C, 0x0000000D, 0x0000337C, 0x00000001, 0x00000028,\n    0x00001B12, 0x000019A8, 0x0004007C, 0x0000000B, 0x00001C87, 0x0000337C,\n    0x00050082, 0x0000000B, 0x000022F9, 0x00000344, 0x00001C87, 0x0004007C,\n    0x0000000D, 0x00002219, 0x000022F9, 0x00050083, 0x0000000D, 0x000038A4,\n    0x00001DF2, 0x00001DEE, 0x00050085, 0x0000000D, 0x000054BA, 0x000038A4,\n    0x00005492, 0x00050081, 0x0000000D, 0x000021AB, 0x00002F26, 0x000054BA,\n    0x0006000C, 0x0000000D, 0x00001C7B, 0x00000001, 0x00000004, 0x000038A4,\n    0x00050085, 0x0000000D, 0x0000327B, 0x00001C7B, 0x00002219, 0x0008000C,\n    0x0000000D, 0x000053A7, 0x00000001, 0x0000002B, 0x0000327B, 0x00000A0C,\n    0x0000008A, 0x00050085, 0x0000000D, 0x0000468B, 0x000053A7, 0x000053A7,\n    0x00050085, 0x0000000D, 0x00002A46, 0x0000468B, 0x00005492, 0x00050081,\n    0x0000000D, 0x00003BCA, 0x00002208, 0x00002A46, 0x00050083, 0x0000000D,\n    0x00005A93, 0x00001DF0, 0x00001DF3, 0x00050083, 0x0000000D, 0x00001ED6,\n    0x00001DF3, 0x00003707, 0x0006000C, 0x0000000D, 0x000019AA, 0x00000001,\n    0x00000004, 0x00005A93, 0x0006000C, 0x0000000D, 0x000035B9, 0x00000001,\n    0x00000004, 0x00001ED6, 0x0007000C, 0x0000000D, 0x0000481A, 0x00000001,\n    0x00000028, 0x000019AA, 0x000035B9, 0x0004007C, 0x0000000B, 0x00001C88,\n    0x0000481A, 0x00050082, 0x0000000B, 0x000022FA, 0x00000344, 0x00001C88,\n    0x0004007C, 0x0000000D, 0x0000221A, 0x000022FA, 0x00050083, 0x0000000D,\n    0x000038A5, 0x00001DF0, 0x00003707, 0x00050085, 0x0000000D, 0x000054BB,\n    0x000038A5, 0x00005492, 0x00050081, 0x0000000D, 0x000021AC, 0x00002F27,\n    0x000054BB, 0x0006000C, 0x0000000D, 0x00001C7C, 0x00000001, 0x00000004,\n    0x000038A5, 0x00050085, 0x0000000D, 0x0000327C, 0x00001C7C, 0x0000221A,\n    0x0008000C, 0x0000000D, 0x000053A8, 0x00000001, 0x0000002B, 0x0000327C,\n    0x00000A0C, 0x0000008A, 0x00050085, 0x0000000D, 0x0000468D, 0x000053A8,\n    0x000053A8, 0x00050085, 0x0000000D, 0x00002A6C, 0x0000468D, 0x00005492,\n    0x00050081, 0x0000000D, 0x00003A70, 0x00003BCA, 0x00002A6C, 0x00050085,\n    0x0000000D, 0x00002362, 0x00002F21, 0x00002E64, 0x00050083, 0x0000000D,\n    0x00004A15, 0x00001DF0, 0x00001DED, 0x00050083, 0x0000000D, 0x00002B72,\n    0x00001DED, 0x00001DEC, 0x0006000C, 0x0000000D, 0x000019AB, 0x00000001,\n    0x00000004, 0x00004A15, 0x0006000C, 0x0000000D, 0x000035BA, 0x00000001,\n    0x00000004, 0x00002B72, 0x0007000C, 0x0000000D, 0x0000481B, 0x00000001,\n    0x00000028, 0x000019AB, 0x000035BA, 0x0004007C, 0x0000000B, 0x00001C89,\n    0x0000481B, 0x00050082, 0x0000000B, 0x000022FB, 0x00000344, 0x00001C89,\n    0x0004007C, 0x0000000D, 0x0000221B, 0x000022FB, 0x00050083, 0x0000000D,\n    0x000038A6, 0x00001DF0, 0x00001DEC, 0x00050085, 0x0000000D, 0x000054BC,\n    0x000038A6, 0x00002362, 0x00050081, 0x0000000D, 0x000021AD, 0x000021AB,\n    0x000054BC, 0x0006000C, 0x0000000D, 0x00001C7D, 0x00000001, 0x00000004,\n    0x000038A6, 0x00050085, 0x0000000D, 0x0000327D, 0x00001C7D, 0x0000221B,\n    0x0008000C, 0x0000000D, 0x000053A9, 0x00000001, 0x0000002B, 0x0000327D,\n    0x00000A0C, 0x0000008A, 0x00050085, 0x0000000D, 0x0000468E, 0x000053A9,\n    0x000053A9, 0x00050085, 0x0000000D, 0x00002A47, 0x0000468E, 0x00002362,\n    0x00050081, 0x0000000D, 0x000032F9, 0x00003A70, 0x00002A47, 0x00050083,\n    0x0000000D, 0x00002D86, 0x000021A2, 0x00001DED, 0x0006000C, 0x0000000D,\n    0x000027B1, 0x00000001, 0x00000004, 0x00002D86, 0x0007000C, 0x0000000D,\n    0x0000337D, 0x00000001, 0x00000028, 0x000027B1, 0x000019A9, 0x0004007C,\n    0x0000000B, 0x00001C8A, 0x0000337D, 0x00050082, 0x0000000B, 0x000022FC,\n    0x00000344, 0x00001C8A, 0x0004007C, 0x0000000D, 0x0000221C, 0x000022FC,\n    0x00050083, 0x0000000D, 0x000038A7, 0x000021A2, 0x00001DEE, 0x00050085,\n    0x0000000D, 0x000054BD, 0x000038A7, 0x00002362, 0x00050081, 0x0000000D,\n    0x000021AE, 0x000021AC, 0x000054BD, 0x0006000C, 0x0000000D, 0x00001C7E,\n    0x00000001, 0x00000004, 0x000038A7, 0x00050085, 0x0000000D, 0x0000327E,\n    0x00001C7E, 0x0000221C, 0x0008000C, 0x0000000D, 0x000053AA, 0x00000001,\n    0x0000002B, 0x0000327E, 0x00000A0C, 0x0000008A, 0x00050085, 0x0000000D,\n    0x0000468F, 0x000053AA, 0x000053AA, 0x00050085, 0x0000000D, 0x00002A6D,\n    0x0000468F, 0x00002362, 0x00050081, 0x0000000D, 0x00003A71, 0x000032F9,\n    0x00002A6D, 0x00050085, 0x0000000D, 0x00001A91, 0x000046A1, 0x00002E64,\n    0x00050083, 0x0000000D, 0x00001D08, 0x00001DF1, 0x00001DF0, 0x0006000C,\n    0x0000000D, 0x00001B13, 0x00000001, 0x00000004, 0x00001D08, 0x0007000C,\n    0x0000000D, 0x0000337E, 0x00000001, 0x00000028, 0x00001B13, 0x000019AB,\n    0x0004007C, 0x0000000B, 0x00001C8B, 0x0000337E, 0x00050082, 0x0000000B,\n    0x000022FD, 0x00000344, 0x00001C8B, 0x0004007C, 0x0000000D, 0x0000221D,\n    0x000022FD, 0x00050083, 0x0000000D, 0x000038A8, 0x00001DF1, 0x00001DED,\n    0x00050085, 0x0000000D, 0x000054BE, 0x000038A8, 0x00001A91, 0x00050081,\n    0x0000000D, 0x000021AF, 0x000021AD, 0x000054BE, 0x0006000C, 0x0000000D,\n    0x00001C7F, 0x00000001, 0x00000004, 0x000038A8, 0x00050085, 0x0000000D,\n    0x0000327F, 0x00001C7F, 0x0000221D, 0x0008000C, 0x0000000D, 0x000053AB,\n    0x00000001, 0x0000002B, 0x0000327F, 0x00000A0C, 0x0000008A, 0x00050085,\n    0x0000000D, 0x00004690, 0x000053AB, 0x000053AB, 0x00050085, 0x0000000D,\n    0x00002A48, 0x00004690, 0x00001A91, 0x00050081, 0x0000000D, 0x000032FA,\n    0x00003A71, 0x00002A48, 0x00050083, 0x0000000D, 0x00002D87, 0x00001DF4,\n    0x00001DF0, 0x0006000C, 0x0000000D, 0x000027B2, 0x00000001, 0x00000004,\n    0x00002D87, 0x0007000C, 0x0000000D, 0x0000337F, 0x00000001, 0x00000028,\n    0x000027B2, 0x000019AA, 0x0004007C, 0x0000000B, 0x00001C8C, 0x0000337F,\n    0x00050082, 0x0000000B, 0x000022FE, 0x00000344, 0x00001C8C, 0x0004007C,\n    0x0000000D, 0x0000221E, 0x000022FE, 0x00050083, 0x0000000D, 0x000038A9,\n    0x00001DF4, 0x00001DF3, 0x00050085, 0x0000000D, 0x000059C2, 0x000038A9,\n    0x00001A91, 0x00050081, 0x0000000D, 0x00001DDD, 0x000021AE, 0x000059C2,\n    0x00050050, 0x00000013, 0x000048DB, 0x000021AF, 0x00001DDD, 0x0006000C,\n    0x0000000D, 0x00002B01, 0x00000001, 0x00000004, 0x000038A9, 0x00050085,\n    0x0000000D, 0x000022D6, 0x00002B01, 0x0000221E, 0x0008000C, 0x0000000D,\n    0x000053AC, 0x00000001, 0x0000002B, 0x000022D6, 0x00000A0C, 0x0000008A,\n    0x00050085, 0x0000000D, 0x00004691, 0x000053AC, 0x000053AC, 0x00050085,\n    0x0000000D, 0x00002A6E, 0x00004691, 0x00001A91, 0x00050081, 0x0000000D,\n    0x000036BA, 0x000032FA, 0x00002A6E, 0x00050085, 0x00000013, 0x00004176,\n    0x000048DB, 0x000048DB, 0x00050051, 0x0000000D, 0x00004DD2, 0x00004176,\n    0x00000000, 0x00050051, 0x0000000D, 0x00005C1C, 0x00004176, 0x00000001,\n    0x00050081, 0x0000000D, 0x00002903, 0x00004DD2, 0x00005C1C, 0x000500B8,\n    0x00000009, 0x0000584B, 0x00002903, 0x00000738, 0x0004007C, 0x0000000B,\n    0x00005637, 0x00002903, 0x000500C2, 0x0000000B, 0x0000483B, 0x00005637,\n    0x00000A0D, 0x00050082, 0x0000000B, 0x00004F58, 0x00000661, 0x0000483B,\n    0x0004007C, 0x0000000D, 0x00001DD4, 0x00004F58, 0x000600A9, 0x0000000D,\n    0x00004F1C, 0x0000584B, 0x0000008A, 0x00001DD4, 0x000600A9, 0x0000000D,\n    0x00004791, 0x0000584B, 0x0000008A, 0x000021AF, 0x00060052, 0x00000013,\n    0x00003A9B, 0x00004791, 0x000048DB, 0x00000000, 0x00050050, 0x00000013,\n    0x000036AE, 0x00004F1C, 0x00004F1C, 0x00050085, 0x00000013, 0x0000275C,\n    0x00003A9B, 0x000036AE, 0x00050085, 0x0000000D, 0x00002F75, 0x000036BA,\n    0x000000FC, 0x00050085, 0x0000000D, 0x00002835, 0x00002F75, 0x00002F75,\n    0x00050051, 0x0000000D, 0x000033B8, 0x0000275C, 0x00000000, 0x00050085,\n    0x0000000D, 0x00005F79, 0x000033B8, 0x000033B8, 0x00050051, 0x0000000D,\n    0x00005C12, 0x0000275C, 0x00000001, 0x00050085, 0x0000000D, 0x00003612,\n    0x00005C12, 0x00005C12, 0x00050081, 0x0000000D, 0x000043CB, 0x00005F79,\n    0x00003612, 0x0006000C, 0x0000000D, 0x00003B20, 0x00000001, 0x00000004,\n    0x000033B8, 0x0006000C, 0x0000000D, 0x000048A3, 0x00000001, 0x00000004,\n    0x00005C12, 0x0007000C, 0x0000000D, 0x0000481C, 0x00000001, 0x00000028,\n    0x00003B20, 0x000048A3, 0x0004007C, 0x0000000B, 0x00001C8D, 0x0000481C,\n    0x00050082, 0x0000000B, 0x0000231D, 0x00000344, 0x00001C8D, 0x0004007C,\n    0x0000000D, 0x00002097, 0x0000231D, 0x00050085, 0x0000000D, 0x000044C7,\n    0x000043CB, 0x00002097, 0x00050083, 0x0000000D, 0x00004E42, 0x000044C7,\n    0x0000008A, 0x00050085, 0x0000000D, 0x000022F0, 0x00004E42, 0x00002835,\n    0x00050081, 0x0000000D, 0x00004D36, 0x0000008A, 0x000022F0, 0x00050085,\n    0x0000000D, 0x000020F3, 0x000003B3, 0x00002835, 0x00050081, 0x0000000D,\n    0x00002087, 0x0000008A, 0x000020F3, 0x00050050, 0x00000013, 0x000029E7,\n    0x00004D36, 0x00002087, 0x00050085, 0x0000000D, 0x00004BF6, 0x0000075D,\n    0x00002835, 0x00050081, 0x0000000D, 0x00002433, 0x000000FC, 0x00004BF6,\n    0x0004007C, 0x0000000B, 0x00001997, 0x00002433, 0x00050082, 0x0000000B,\n    0x00001A21, 0x00000344, 0x00001997, 0x0004007C, 0x0000000D, 0x00004005,\n    0x00001A21, 0x00050051, 0x0000000D, 0x00004AB9, 0x000028BB, 0x00000002,\n    0x00050051, 0x0000000D, 0x000033D0, 0x000028BC, 0x00000002, 0x00050051,\n    0x0000000D, 0x00001E99, 0x000028BD, 0x00000002, 0x00060050, 0x00000018,\n    0x00003DED, 0x00004AB9, 0x000033D0, 0x00001E99, 0x00050051, 0x0000000D,\n    0x00001EE5, 0x000028BE, 0x00000003, 0x00050051, 0x0000000D, 0x00005895,\n    0x000028BF, 0x00000003, 0x00050051, 0x0000000D, 0x00001E9A, 0x000028C0,\n    0x00000003, 0x00060050, 0x00000018, 0x00003DEE, 0x00001EE5, 0x00005895,\n    0x00001E9A, 0x00050051, 0x0000000D, 0x00001EE6, 0x000028BB, 0x00000001,\n    0x00050051, 0x0000000D, 0x00005896, 0x000028BC, 0x00000001, 0x00050051,\n    0x0000000D, 0x0000199F, 0x000028BD, 0x00000001, 0x00060050, 0x00000018,\n    0x00003B22, 0x00001EE6, 0x00005896, 0x0000199F, 0x0007000C, 0x00000018,\n    0x000041FF, 0x00000001, 0x00000025, 0x00003DEE, 0x00003B22, 0x0007000C,\n    0x00000018, 0x00005547, 0x00000001, 0x00000025, 0x00003DED, 0x000041FF,\n    0x00050051, 0x0000000D, 0x0000202C, 0x000028BE, 0x00000000, 0x00050051,\n    0x0000000D, 0x00002B2C, 0x000028BF, 0x00000000, 0x00050051, 0x0000000D,\n    0x000019A0, 0x000028C0, 0x00000000, 0x00060050, 0x00000018, 0x00003B25,\n    0x0000202C, 0x00002B2C, 0x000019A0, 0x0007000C, 0x00000018, 0x00002952,\n    0x00000001, 0x00000025, 0x00005547, 0x00003B25, 0x0007000C, 0x00000018,\n    0x000041D2, 0x00000001, 0x00000028, 0x00003DEE, 0x00003B22, 0x0007000C,\n    0x00000018, 0x00004D20, 0x00000001, 0x00000028, 0x00003DED, 0x000041D2,\n    0x0007000C, 0x00000018, 0x00004A0F, 0x00000001, 0x00000028, 0x00004D20,\n    0x00003B25, 0x00050083, 0x00000013, 0x00003D57, 0x00000379, 0x00005449,\n    0x00050051, 0x0000000D, 0x0000200E, 0x000028B8, 0x00000000, 0x00050051,\n    0x0000000D, 0x00003D41, 0x000028B9, 0x00000000, 0x00050051, 0x0000000D,\n    0x00001E9B, 0x000028BA, 0x00000000, 0x00060050, 0x00000018, 0x000041C9,\n    0x0000200E, 0x00003D41, 0x00001E9B, 0x00050051, 0x0000000D, 0x00004640,\n    0x00003D57, 0x00000000, 0x00050085, 0x0000000D, 0x0000433A, 0x00004640,\n    0x000033B8, 0x00050051, 0x0000000D, 0x00005C13, 0x00003D57, 0x00000001,\n    0x00050085, 0x0000000D, 0x00003E97, 0x00005C13, 0x00005C12, 0x00050081,\n    0x0000000D, 0x00003228, 0x0000433A, 0x00003E97, 0x0004007F, 0x0000000D,\n    0x00004D37, 0x00005C12, 0x00050085, 0x0000000D, 0x00003073, 0x00004640,\n    0x00004D37, 0x00050085, 0x0000000D, 0x000054A7, 0x00005C13, 0x000033B8,\n    0x00050081, 0x0000000D, 0x00005E67, 0x00003073, 0x000054A7, 0x00050050,\n    0x00000013, 0x00002657, 0x00003228, 0x00005E67, 0x00050085, 0x00000013,\n    0x00002292, 0x00002657, 0x000029E7, 0x00050051, 0x0000000D, 0x000061F8,\n    0x00002292, 0x00000000, 0x00050085, 0x0000000D, 0x00005F7A, 0x000061F8,\n    0x000061F8, 0x00050051, 0x0000000D, 0x00005C14, 0x00002292, 0x00000001,\n    0x00050085, 0x0000000D, 0x00003633, 0x00005C14, 0x00005C14, 0x00050081,\n    0x0000000D, 0x0000536D, 0x00005F7A, 0x00003633, 0x0007000C, 0x0000000D,\n    0x00002AD1, 0x00000001, 0x00000025, 0x0000536D, 0x00004005, 0x00050085,\n    0x0000000D, 0x0000275D, 0x00000A93, 0x00002AD1, 0x00050081, 0x0000000D,\n    0x0000545A, 0x0000275D, 0x00000341, 0x00050085, 0x0000000D, 0x000024E2,\n    0x00002433, 0x00002AD1, 0x00050081, 0x0000000D, 0x00004735, 0x000024E2,\n    0x00000341, 0x00050085, 0x0000000D, 0x0000222E, 0x0000545A, 0x0000545A,\n    0x00050085, 0x0000000D, 0x00005BE3, 0x00004735, 0x00004735, 0x00050085,\n    0x0000000D, 0x00005244, 0x000004B3, 0x0000222E, 0x00050081, 0x0000000D,\n    0x00003B41, 0x00005244, 0x000000B4, 0x00050085, 0x0000000D, 0x00001BF3,\n    0x00003B41, 0x00005BE3, 0x0005008E, 0x00000018, 0x00001921, 0x000041C9,\n    0x00001BF3, 0x00050083, 0x00000013, 0x00002928, 0x00000300, 0x00005449,\n    0x00050051, 0x0000000D, 0x00001E0D, 0x000028B8, 0x00000001, 0x00050051,\n    0x0000000D, 0x00003D42, 0x000028B9, 0x00000001, 0x00050051, 0x0000000D,\n    0x00001E9C, 0x000028BA, 0x00000001, 0x00060050, 0x00000018, 0x000041CA,\n    0x00001E0D, 0x00003D42, 0x00001E9C, 0x00050051, 0x0000000D, 0x00004641,\n    0x00002928, 0x00000000, 0x00050085, 0x0000000D, 0x0000433B, 0x00004641,\n    0x000033B8, 0x00050051, 0x0000000D, 0x00005C15, 0x00002928, 0x00000001,\n    0x00050085, 0x0000000D, 0x00003F09, 0x00005C15, 0x00005C12, 0x00050081,\n    0x0000000D, 0x00002E1A, 0x0000433B, 0x00003F09, 0x00050085, 0x0000000D,\n    0x000021E2, 0x00004641, 0x00004D37, 0x00050085, 0x0000000D, 0x00005AF4,\n    0x00005C15, 0x000033B8, 0x00050081, 0x0000000D, 0x00005E68, 0x000021E2,\n    0x00005AF4, 0x00050050, 0x00000013, 0x00002658, 0x00002E1A, 0x00005E68,\n    0x00050085, 0x00000013, 0x00002293, 0x00002658, 0x000029E7, 0x00050051,\n    0x0000000D, 0x000061F9, 0x00002293, 0x00000000, 0x00050085, 0x0000000D,\n    0x00005F7B, 0x000061F9, 0x000061F9, 0x00050051, 0x0000000D, 0x00005C16,\n    0x00002293, 0x00000001, 0x00050085, 0x0000000D, 0x00003634, 0x00005C16,\n    0x00005C16, 0x00050081, 0x0000000D, 0x0000536E, 0x00005F7B, 0x00003634,\n    0x0007000C, 0x0000000D, 0x00002AD2, 0x00000001, 0x00000025, 0x0000536E,\n    0x00004005, 0x00050085, 0x0000000D, 0x0000275E, 0x00000A93, 0x00002AD2,\n    0x00050081, 0x0000000D, 0x0000545B, 0x0000275E, 0x00000341, 0x00050085,\n    0x0000000D, 0x000024E3, 0x00002433, 0x00002AD2, 0x00050081, 0x0000000D,\n    0x00004736, 0x000024E3, 0x00000341, 0x00050085, 0x0000000D, 0x0000222F,\n    0x0000545B, 0x0000545B, 0x00050085, 0x0000000D, 0x00005BE4, 0x00004736,\n    0x00004736, 0x00050085, 0x0000000D, 0x00005245, 0x000004B3, 0x0000222F,\n    0x00050081, 0x0000000D, 0x00003B42, 0x00005245, 0x000000B4, 0x00050085,\n    0x0000000D, 0x00001BCD, 0x00003B42, 0x00005BE4, 0x0005008E, 0x00000018,\n    0x00001E0B, 0x000041CA, 0x00001BCD, 0x00050081, 0x00000018, 0x00001B2A,\n    0x00001921, 0x00001E0B, 0x00050081, 0x0000000D, 0x00001A70, 0x00001BF3,\n    0x00001BCD, 0x00050083, 0x00000013, 0x00004398, 0x00000049, 0x00005449,\n    0x00050051, 0x0000000D, 0x00001AEE, 0x000028BB, 0x00000000, 0x00050051,\n    0x0000000D, 0x00003D43, 0x000028BC, 0x00000000, 0x00050051, 0x0000000D,\n    0x00001E9D, 0x000028BD, 0x00000000, 0x00060050, 0x00000018, 0x000041CB,\n    0x00001AEE, 0x00003D43, 0x00001E9D, 0x00050051, 0x0000000D, 0x00004642,\n    0x00004398, 0x00000000, 0x00050085, 0x0000000D, 0x0000433C, 0x00004642,\n    0x000033B8, 0x00050051, 0x0000000D, 0x00005C17, 0x00004398, 0x00000001,\n    0x00050085, 0x0000000D, 0x00003F0A, 0x00005C17, 0x00005C12, 0x00050081,\n    0x0000000D, 0x00002E1B, 0x0000433C, 0x00003F0A, 0x00050085, 0x0000000D,\n    0x000021E3, 0x00004642, 0x00004D37, 0x00050085, 0x0000000D, 0x00005AF5,\n    0x00005C17, 0x000033B8, 0x00050081, 0x0000000D, 0x00005E69, 0x000021E3,\n    0x00005AF5, 0x00050050, 0x00000013, 0x00002659, 0x00002E1B, 0x00005E69,\n    0x00050085, 0x00000013, 0x00002294, 0x00002659, 0x000029E7, 0x00050051,\n    0x0000000D, 0x000061FA, 0x00002294, 0x00000000, 0x00050085, 0x0000000D,\n    0x00005F7C, 0x000061FA, 0x000061FA, 0x00050051, 0x0000000D, 0x00005C18,\n    0x00002294, 0x00000001, 0x00050085, 0x0000000D, 0x00003635, 0x00005C18,\n    0x00005C18, 0x00050081, 0x0000000D, 0x0000536F, 0x00005F7C, 0x00003635,\n    0x0007000C, 0x0000000D, 0x00002AD3, 0x00000001, 0x00000025, 0x0000536F,\n    0x00004005, 0x00050085, 0x0000000D, 0x0000275F, 0x00000A93, 0x00002AD3,\n    0x00050081, 0x0000000D, 0x0000545C, 0x0000275F, 0x00000341, 0x00050085,\n    0x0000000D, 0x000024E4, 0x00002433, 0x00002AD3, 0x00050081, 0x0000000D,\n    0x00004737, 0x000024E4, 0x00000341, 0x00050085, 0x0000000D, 0x00002230,\n    0x0000545C, 0x0000545C, 0x00050085, 0x0000000D, 0x00005BE5, 0x00004737,\n    0x00004737, 0x00050085, 0x0000000D, 0x00005246, 0x000004B3, 0x00002230,\n    0x00050081, 0x0000000D, 0x00003B43, 0x00005246, 0x000000B4, 0x00050085,\n    0x0000000D, 0x00001BCE, 0x00003B43, 0x00005BE5, 0x0005008E, 0x00000018,\n    0x00001E0C, 0x000041CB, 0x00001BCE, 0x00050081, 0x00000018, 0x00001B2B,\n    0x00001B2A, 0x00001E0C, 0x00050081, 0x0000000D, 0x00001A71, 0x00001A70,\n    0x00001BCE, 0x00050083, 0x00000013, 0x00004774, 0x0000037A, 0x00005449,\n    0x00050051, 0x0000000D, 0x00004249, 0x00004774, 0x00000000, 0x00050085,\n    0x0000000D, 0x0000592C, 0x00004249, 0x000033B8, 0x00050051, 0x0000000D,\n    0x00005C19, 0x00004774, 0x00000001, 0x00050085, 0x0000000D, 0x00003F0B,\n    0x00005C19, 0x00005C12, 0x00050081, 0x0000000D, 0x00002E1C, 0x0000592C,\n    0x00003F0B, 0x00050085, 0x0000000D, 0x000021E4, 0x00004249, 0x00004D37,\n    0x00050085, 0x0000000D, 0x00005AF6, 0x00005C19, 0x000033B8, 0x00050081,\n    0x0000000D, 0x00005E6A, 0x000021E4, 0x00005AF6, 0x00050050, 0x00000013,\n    0x0000265A, 0x00002E1C, 0x00005E6A, 0x00050085, 0x00000013, 0x00002295,\n    0x0000265A, 0x000029E7, 0x00050051, 0x0000000D, 0x000061FB, 0x00002295,\n    0x00000000, 0x00050085, 0x0000000D, 0x00005F7D, 0x000061FB, 0x000061FB,\n    0x00050051, 0x0000000D, 0x00005C1A, 0x00002295, 0x00000001, 0x00050085,\n    0x0000000D, 0x00003636, 0x00005C1A, 0x00005C1A, 0x00050081, 0x0000000D,\n    0x00005370, 0x00005F7D, 0x00003636, 0x0007000C, 0x0000000D, 0x00002AD4,\n    0x00000001, 0x00000025, 0x00005370, 0x00004005, 0x00050085, 0x0000000D,\n    0x00002760, 0x00000A93, 0x00002AD4, 0x00050081, 0x0000000D, 0x0000545D,\n    0x00002760, 0x00000341, 0x00050085, 0x0000000D, 0x000024E5, 0x00002433,\n    0x00002AD4, 0x00050081, 0x0000000D, 0x00004738, 0x000024E5, 0x00000341,\n    0x00050085, 0x0000000D, 0x00002231, 0x0000545D, 0x0000545D, 0x00050085,\n    0x0000000D, 0x00005BE6, 0x00004738, 0x00004738, 0x00050085, 0x0000000D,\n    0x00005247, 0x000004B3, 0x00002231, 0x00050081, 0x0000000D, 0x00003B44,\n    0x00005247, 0x000000B4, 0x00050085, 0x0000000D, 0x00001BCF, 0x00003B44,\n    0x00005BE6, 0x0005008E, 0x00000018, 0x00001E0E, 0x00003B22, 0x00001BCF,\n    0x00050081, 0x00000018, 0x00001ADE, 0x00001B2B, 0x00001E0E, 0x00050081,\n    0x0000000D, 0x00001D24, 0x00001A71, 0x00001BCF, 0x0004007F, 0x00000013,\n    0x0000327A, 0x00005449, 0x00050051, 0x0000000D, 0x00005F66, 0x0000327A,\n    0x00000000, 0x00050085, 0x0000000D, 0x00001B4C, 0x00005F66, 0x000033B8,\n    0x00050051, 0x0000000D, 0x00005C1B, 0x0000327A, 0x00000001, 0x00050085,\n    0x0000000D, 0x00003F0C, 0x00005C1B, 0x00005C12, 0x00050081, 0x0000000D,\n    0x00002E1D, 0x00001B4C, 0x00003F0C, 0x00050085, 0x0000000D, 0x000021E5,\n    0x00005F66, 0x00004D37, 0x00050085, 0x0000000D, 0x00005AF7, 0x00005C1B,\n    0x000033B8, 0x00050081, 0x0000000D, 0x00005E6B, 0x000021E5, 0x00005AF7,\n    0x00050050, 0x00000013, 0x0000265B, 0x00002E1D, 0x00005E6B, 0x00050085,\n    0x00000013, 0x00002296, 0x0000265B, 0x000029E7, 0x00050051, 0x0000000D,\n    0x000061FC, 0x00002296, 0x00000000, 0x00050085, 0x0000000D, 0x00005F7E,\n    0x000061FC, 0x000061FC, 0x00050051, 0x0000000D, 0x00005C1D, 0x00002296,\n    0x00000001, 0x00050085, 0x0000000D, 0x00003637, 0x00005C1D, 0x00005C1D,\n    0x00050081, 0x0000000D, 0x00005371, 0x00005F7E, 0x00003637, 0x0007000C,\n    0x0000000D, 0x00002AD5, 0x00000001, 0x00000025, 0x00005371, 0x00004005,\n    0x00050085, 0x0000000D, 0x00002761, 0x00000A93, 0x00002AD5, 0x00050081,\n    0x0000000D, 0x0000545E, 0x00002761, 0x00000341, 0x00050085, 0x0000000D,\n    0x000024E6, 0x00002433, 0x00002AD5, 0x00050081, 0x0000000D, 0x00004739,\n    0x000024E6, 0x00000341, 0x00050085, 0x0000000D, 0x00002232, 0x0000545E,\n    0x0000545E, 0x00050085, 0x0000000D, 0x00005BE7, 0x00004739, 0x00004739,\n    0x00050085, 0x0000000D, 0x00005248, 0x000004B3, 0x00002232, 0x00050081,\n    0x0000000D, 0x00003B45, 0x00005248, 0x000000B4, 0x00050085, 0x0000000D,\n    0x00001BD0, 0x00003B45, 0x00005BE7, 0x0005008E, 0x00000018, 0x00001E0F,\n    0x00003DED, 0x00001BD0, 0x00050081, 0x00000018, 0x00001B2C, 0x00001ADE,\n    0x00001E0F, 0x00050081, 0x0000000D, 0x00001A72, 0x00001D24, 0x00001BD0,\n    0x00050083, 0x00000013, 0x00004399, 0x00000A44, 0x00005449, 0x00050051,\n    0x0000000D, 0x00001AEF, 0x000028BB, 0x00000003, 0x00050051, 0x0000000D,\n    0x00003D44, 0x000028BC, 0x00000003, 0x00050051, 0x0000000D, 0x00001E9E,\n    0x000028BD, 0x00000003, 0x00060050, 0x00000018, 0x000041CC, 0x00001AEF,\n    0x00003D44, 0x00001E9E, 0x00050051, 0x0000000D, 0x00004643, 0x00004399,\n    0x00000000, 0x00050085, 0x0000000D, 0x0000433D, 0x00004643, 0x000033B8,\n    0x00050051, 0x0000000D, 0x00005C1E, 0x00004399, 0x00000001, 0x00050085,\n    0x0000000D, 0x00003F0D, 0x00005C1E, 0x00005C12, 0x00050081, 0x0000000D,\n    0x00002E1E, 0x0000433D, 0x00003F0D, 0x00050085, 0x0000000D, 0x000021E6,\n    0x00004643, 0x00004D37, 0x00050085, 0x0000000D, 0x00005AF8, 0x00005C1E,\n    0x000033B8, 0x00050081, 0x0000000D, 0x00005E6C, 0x000021E6, 0x00005AF8,\n    0x00050050, 0x00000013, 0x0000265C, 0x00002E1E, 0x00005E6C, 0x00050085,\n    0x00000013, 0x00002297, 0x0000265C, 0x000029E7, 0x00050051, 0x0000000D,\n    0x000061FD, 0x00002297, 0x00000000, 0x00050085, 0x0000000D, 0x00005F7F,\n    0x000061FD, 0x000061FD, 0x00050051, 0x0000000D, 0x00005C1F, 0x00002297,\n    0x00000001, 0x00050085, 0x0000000D, 0x00003638, 0x00005C1F, 0x00005C1F,\n    0x00050081, 0x0000000D, 0x00005372, 0x00005F7F, 0x00003638, 0x0007000C,\n    0x0000000D, 0x00002AD6, 0x00000001, 0x00000025, 0x00005372, 0x00004005,\n    0x00050085, 0x0000000D, 0x00002762, 0x00000A93, 0x00002AD6, 0x00050081,\n    0x0000000D, 0x0000545F, 0x00002762, 0x00000341, 0x00050085, 0x0000000D,\n    0x000024E7, 0x00002433, 0x00002AD6, 0x00050081, 0x0000000D, 0x0000473A,\n    0x000024E7, 0x00000341, 0x00050085, 0x0000000D, 0x00002233, 0x0000545F,\n    0x0000545F, 0x00050085, 0x0000000D, 0x00005BE8, 0x0000473A, 0x0000473A,\n    0x00050085, 0x0000000D, 0x00005249, 0x000004B3, 0x00002233, 0x00050081,\n    0x0000000D, 0x00003B46, 0x00005249, 0x000000B4, 0x00050085, 0x0000000D,\n    0x00001BD1, 0x00003B46, 0x00005BE8, 0x0005008E, 0x00000018, 0x00001E10,\n    0x000041CC, 0x00001BD1, 0x00050081, 0x00000018, 0x00001B2D, 0x00001B2C,\n    0x00001E10, 0x00050081, 0x0000000D, 0x00001A73, 0x00001A72, 0x00001BD1,\n    0x00050083, 0x00000013, 0x00004775, 0x00000301, 0x00005449, 0x00050051,\n    0x0000000D, 0x0000424A, 0x00004775, 0x00000000, 0x00050085, 0x0000000D,\n    0x0000592D, 0x0000424A, 0x000033B8, 0x00050051, 0x0000000D, 0x00005C20,\n    0x00004775, 0x00000001, 0x00050085, 0x0000000D, 0x00003F0E, 0x00005C20,\n    0x00005C12, 0x00050081, 0x0000000D, 0x00002E1F, 0x0000592D, 0x00003F0E,\n    0x00050085, 0x0000000D, 0x000021E7, 0x0000424A, 0x00004D37, 0x00050085,\n    0x0000000D, 0x00005AF9, 0x00005C20, 0x000033B8, 0x00050081, 0x0000000D,\n    0x00005E6D, 0x000021E7, 0x00005AF9, 0x00050050, 0x00000013, 0x0000265D,\n    0x00002E1F, 0x00005E6D, 0x00050085, 0x00000013, 0x00002298, 0x0000265D,\n    0x000029E7, 0x00050051, 0x0000000D, 0x000061FE, 0x00002298, 0x00000000,\n    0x00050085, 0x0000000D, 0x00005F80, 0x000061FE, 0x000061FE, 0x00050051,\n    0x0000000D, 0x00005C21, 0x00002298, 0x00000001, 0x00050085, 0x0000000D,\n    0x00003639, 0x00005C21, 0x00005C21, 0x00050081, 0x0000000D, 0x00005373,\n    0x00005F80, 0x00003639, 0x0007000C, 0x0000000D, 0x00002AD7, 0x00000001,\n    0x00000025, 0x00005373, 0x00004005, 0x00050085, 0x0000000D, 0x00002763,\n    0x00000A93, 0x00002AD7, 0x00050081, 0x0000000D, 0x00005460, 0x00002763,\n    0x00000341, 0x00050085, 0x0000000D, 0x000024E8, 0x00002433, 0x00002AD7,\n    0x00050081, 0x0000000D, 0x0000473B, 0x000024E8, 0x00000341, 0x00050085,\n    0x0000000D, 0x00002234, 0x00005460, 0x00005460, 0x00050085, 0x0000000D,\n    0x00005BE9, 0x0000473B, 0x0000473B, 0x00050085, 0x0000000D, 0x0000524A,\n    0x000004B3, 0x00002234, 0x00050081, 0x0000000D, 0x00003B47, 0x0000524A,\n    0x000000B4, 0x00050085, 0x0000000D, 0x00001BD2, 0x00003B47, 0x00005BE9,\n    0x0005008E, 0x00000018, 0x00001E11, 0x00003B25, 0x00001BD2, 0x00050081,\n    0x00000018, 0x00001B2E, 0x00001B2D, 0x00001E11, 0x00050081, 0x0000000D,\n    0x00001A74, 0x00001A73, 0x00001BD2, 0x00050083, 0x00000013, 0x0000439A,\n    0x000001AA, 0x00005449, 0x00050051, 0x0000000D, 0x00001AF0, 0x000028BE,\n    0x00000001, 0x00050051, 0x0000000D, 0x00003D45, 0x000028BF, 0x00000001,\n    0x00050051, 0x0000000D, 0x00001E9F, 0x000028C0, 0x00000001, 0x00060050,\n    0x00000018, 0x000041CD, 0x00001AF0, 0x00003D45, 0x00001E9F, 0x00050051,\n    0x0000000D, 0x00004644, 0x0000439A, 0x00000000, 0x00050085, 0x0000000D,\n    0x0000433F, 0x00004644, 0x000033B8, 0x00050051, 0x0000000D, 0x00005C22,\n    0x0000439A, 0x00000001, 0x00050085, 0x0000000D, 0x00003F0F, 0x00005C22,\n    0x00005C12, 0x00050081, 0x0000000D, 0x00002E20, 0x0000433F, 0x00003F0F,\n    0x00050085, 0x0000000D, 0x000021E8, 0x00004644, 0x00004D37, 0x00050085,\n    0x0000000D, 0x00005AFA, 0x00005C22, 0x000033B8, 0x00050081, 0x0000000D,\n    0x00005E6E, 0x000021E8, 0x00005AFA, 0x00050050, 0x00000013, 0x0000265E,\n    0x00002E20, 0x00005E6E, 0x00050085, 0x00000013, 0x00002299, 0x0000265E,\n    0x000029E7, 0x00050051, 0x0000000D, 0x000061FF, 0x00002299, 0x00000000,\n    0x00050085, 0x0000000D, 0x00005F81, 0x000061FF, 0x000061FF, 0x00050051,\n    0x0000000D, 0x00005C23, 0x00002299, 0x00000001, 0x00050085, 0x0000000D,\n    0x0000363A, 0x00005C23, 0x00005C23, 0x00050081, 0x0000000D, 0x00005374,\n    0x00005F81, 0x0000363A, 0x0007000C, 0x0000000D, 0x00002AD8, 0x00000001,\n    0x00000025, 0x00005374, 0x00004005, 0x00050085, 0x0000000D, 0x00002764,\n    0x00000A93, 0x00002AD8, 0x00050081, 0x0000000D, 0x00005461, 0x00002764,\n    0x00000341, 0x00050085, 0x0000000D, 0x000024E9, 0x00002433, 0x00002AD8,\n    0x00050081, 0x0000000D, 0x0000473C, 0x000024E9, 0x00000341, 0x00050085,\n    0x0000000D, 0x00002235, 0x00005461, 0x00005461, 0x00050085, 0x0000000D,\n    0x00005BEA, 0x0000473C, 0x0000473C, 0x00050085, 0x0000000D, 0x0000524B,\n    0x000004B3, 0x00002235, 0x00050081, 0x0000000D, 0x00003B48, 0x0000524B,\n    0x000000B4, 0x00050085, 0x0000000D, 0x00001BD3, 0x00003B48, 0x00005BEA,\n    0x0005008E, 0x00000018, 0x00001E12, 0x000041CD, 0x00001BD3, 0x00050081,\n    0x00000018, 0x00001B30, 0x00001B2E, 0x00001E12, 0x00050081, 0x0000000D,\n    0x00001A75, 0x00001A74, 0x00001BD3, 0x00050083, 0x00000013, 0x0000439B,\n    0x00000BA5, 0x00005449, 0x00050051, 0x0000000D, 0x00001AF1, 0x000028BE,\n    0x00000002, 0x00050051, 0x0000000D, 0x00003D46, 0x000028BF, 0x00000002,\n    0x00050051, 0x0000000D, 0x00001EA0, 0x000028C0, 0x00000002, 0x00060050,\n    0x00000018, 0x000041CE, 0x00001AF1, 0x00003D46, 0x00001EA0, 0x00050051,\n    0x0000000D, 0x00004645, 0x0000439B, 0x00000000, 0x00050085, 0x0000000D,\n    0x00004340, 0x00004645, 0x000033B8, 0x00050051, 0x0000000D, 0x00005C24,\n    0x0000439B, 0x00000001, 0x00050085, 0x0000000D, 0x00003F10, 0x00005C24,\n    0x00005C12, 0x00050081, 0x0000000D, 0x00002E21, 0x00004340, 0x00003F10,\n    0x00050085, 0x0000000D, 0x000021E9, 0x00004645, 0x00004D37, 0x00050085,\n    0x0000000D, 0x00005AFB, 0x00005C24, 0x000033B8, 0x00050081, 0x0000000D,\n    0x00005E6F, 0x000021E9, 0x00005AFB, 0x00050050, 0x00000013, 0x0000265F,\n    0x00002E21, 0x00005E6F, 0x00050085, 0x00000013, 0x0000229A, 0x0000265F,\n    0x000029E7, 0x00050051, 0x0000000D, 0x00006200, 0x0000229A, 0x00000000,\n    0x00050085, 0x0000000D, 0x00005F82, 0x00006200, 0x00006200, 0x00050051,\n    0x0000000D, 0x00005C25, 0x0000229A, 0x00000001, 0x00050085, 0x0000000D,\n    0x0000363B, 0x00005C25, 0x00005C25, 0x00050081, 0x0000000D, 0x00005375,\n    0x00005F82, 0x0000363B, 0x0007000C, 0x0000000D, 0x00002AD9, 0x00000001,\n    0x00000025, 0x00005375, 0x00004005, 0x00050085, 0x0000000D, 0x00002765,\n    0x00000A93, 0x00002AD9, 0x00050081, 0x0000000D, 0x00005462, 0x00002765,\n    0x00000341, 0x00050085, 0x0000000D, 0x000024EA, 0x00002433, 0x00002AD9,\n    0x00050081, 0x0000000D, 0x0000473D, 0x000024EA, 0x00000341, 0x00050085,\n    0x0000000D, 0x00002236, 0x00005462, 0x00005462, 0x00050085, 0x0000000D,\n    0x00005BEB, 0x0000473D, 0x0000473D, 0x00050085, 0x0000000D, 0x0000524C,\n    0x000004B3, 0x00002236, 0x00050081, 0x0000000D, 0x00003B49, 0x0000524C,\n    0x000000B4, 0x00050085, 0x0000000D, 0x00001BD4, 0x00003B49, 0x00005BEB,\n    0x0005008E, 0x00000018, 0x00001E13, 0x000041CE, 0x00001BD4, 0x00050081,\n    0x00000018, 0x00001B31, 0x00001B30, 0x00001E13, 0x00050081, 0x0000000D,\n    0x00001A76, 0x00001A75, 0x00001BD4, 0x00050083, 0x00000013, 0x00004776,\n    0x00000138, 0x00005449, 0x00050051, 0x0000000D, 0x0000424B, 0x00004776,\n    0x00000000, 0x00050085, 0x0000000D, 0x0000592E, 0x0000424B, 0x000033B8,\n    0x00050051, 0x0000000D, 0x00005C26, 0x00004776, 0x00000001, 0x00050085,\n    0x0000000D, 0x00003F11, 0x00005C26, 0x00005C12, 0x00050081, 0x0000000D,\n    0x00002E22, 0x0000592E, 0x00003F11, 0x00050085, 0x0000000D, 0x000021EA,\n    0x0000424B, 0x00004D37, 0x00050085, 0x0000000D, 0x00005AFC, 0x00005C26,\n    0x000033B8, 0x00050081, 0x0000000D, 0x00005E70, 0x000021EA, 0x00005AFC,\n    0x00050050, 0x00000013, 0x00002660, 0x00002E22, 0x00005E70, 0x00050085,\n    0x00000013, 0x0000229B, 0x00002660, 0x000029E7, 0x00050051, 0x0000000D,\n    0x00006201, 0x0000229B, 0x00000000, 0x00050085, 0x0000000D, 0x00005F83,\n    0x00006201, 0x00006201, 0x00050051, 0x0000000D, 0x00005C27, 0x0000229B,\n    0x00000001, 0x00050085, 0x0000000D, 0x0000363C, 0x00005C27, 0x00005C27,\n    0x00050081, 0x0000000D, 0x00005376, 0x00005F83, 0x0000363C, 0x0007000C,\n    0x0000000D, 0x00002ADA, 0x00000001, 0x00000025, 0x00005376, 0x00004005,\n    0x00050085, 0x0000000D, 0x00002766, 0x00000A93, 0x00002ADA, 0x00050081,\n    0x0000000D, 0x00005463, 0x00002766, 0x00000341, 0x00050085, 0x0000000D,\n    0x000024EB, 0x00002433, 0x00002ADA, 0x00050081, 0x0000000D, 0x0000473E,\n    0x000024EB, 0x00000341, 0x00050085, 0x0000000D, 0x00002237, 0x00005463,\n    0x00005463, 0x00050085, 0x0000000D, 0x00005BEC, 0x0000473E, 0x0000473E,\n    0x00050085, 0x0000000D, 0x0000524D, 0x000004B3, 0x00002237, 0x00050081,\n    0x0000000D, 0x00003B4A, 0x0000524D, 0x000000B4, 0x00050085, 0x0000000D,\n    0x00001BD5, 0x00003B4A, 0x00005BEC, 0x0005008E, 0x00000018, 0x00001E14,\n    0x00003DEE, 0x00001BD5, 0x00050081, 0x00000018, 0x00001B32, 0x00001B31,\n    0x00001E14, 0x00050081, 0x0000000D, 0x00001A77, 0x00001A76, 0x00001BD5,\n    0x00050083, 0x00000013, 0x0000439C, 0x00000139, 0x00005449, 0x00050051,\n    0x0000000D, 0x00001AF2, 0x000028C1, 0x00000002, 0x00050051, 0x0000000D,\n    0x00003D47, 0x000028C2, 0x00000002, 0x00050051, 0x0000000D, 0x00001EA1,\n    0x000047E7, 0x00000002, 0x00060050, 0x00000018, 0x000041CF, 0x00001AF2,\n    0x00003D47, 0x00001EA1, 0x00050051, 0x0000000D, 0x00004646, 0x0000439C,\n    0x00000000, 0x00050085, 0x0000000D, 0x00004341, 0x00004646, 0x000033B8,\n    0x00050051, 0x0000000D, 0x00005C28, 0x0000439C, 0x00000001, 0x00050085,\n    0x0000000D, 0x00003F12, 0x00005C28, 0x00005C12, 0x00050081, 0x0000000D,\n    0x00002E23, 0x00004341, 0x00003F12, 0x00050085, 0x0000000D, 0x000021EB,\n    0x00004646, 0x00004D37, 0x00050085, 0x0000000D, 0x00005AFD, 0x00005C28,\n    0x000033B8, 0x00050081, 0x0000000D, 0x00005E71, 0x000021EB, 0x00005AFD,\n    0x00050050, 0x00000013, 0x00002661, 0x00002E23, 0x00005E71, 0x00050085,\n    0x00000013, 0x0000229C, 0x00002661, 0x000029E7, 0x00050051, 0x0000000D,\n    0x00006202, 0x0000229C, 0x00000000, 0x00050085, 0x0000000D, 0x00005F84,\n    0x00006202, 0x00006202, 0x00050051, 0x0000000D, 0x00005C29, 0x0000229C,\n    0x00000001, 0x00050085, 0x0000000D, 0x0000363D, 0x00005C29, 0x00005C29,\n    0x00050081, 0x0000000D, 0x00005377, 0x00005F84, 0x0000363D, 0x0007000C,\n    0x0000000D, 0x00002ADB, 0x00000001, 0x00000025, 0x00005377, 0x00004005,\n    0x00050085, 0x0000000D, 0x00002767, 0x00000A93, 0x00002ADB, 0x00050081,\n    0x0000000D, 0x00005464, 0x00002767, 0x00000341, 0x00050085, 0x0000000D,\n    0x000024EC, 0x00002433, 0x00002ADB, 0x00050081, 0x0000000D, 0x0000473F,\n    0x000024EC, 0x00000341, 0x00050085, 0x0000000D, 0x00002238, 0x00005464,\n    0x00005464, 0x00050085, 0x0000000D, 0x00005BED, 0x0000473F, 0x0000473F,\n    0x00050085, 0x0000000D, 0x0000524E, 0x000004B3, 0x00002238, 0x00050081,\n    0x0000000D, 0x00003B4B, 0x0000524E, 0x000000B4, 0x00050085, 0x0000000D,\n    0x00001BD6, 0x00003B4B, 0x00005BED, 0x0005008E, 0x00000018, 0x00001E15,\n    0x000041CF, 0x00001BD6, 0x00050081, 0x00000018, 0x00001B33, 0x00001B32,\n    0x00001E15, 0x00050081, 0x0000000D, 0x00001A78, 0x00001A77, 0x00001BD6,\n    0x00050083, 0x00000013, 0x0000439D, 0x0000071F, 0x00005449, 0x00050051,\n    0x0000000D, 0x00001AF3, 0x000028C1, 0x00000003, 0x00050051, 0x0000000D,\n    0x00003D48, 0x000028C2, 0x00000003, 0x00050051, 0x0000000D, 0x00001EA2,\n    0x000047E7, 0x00000003, 0x00060050, 0x00000018, 0x000041D0, 0x00001AF3,\n    0x00003D48, 0x00001EA2, 0x00050051, 0x0000000D, 0x00004647, 0x0000439D,\n    0x00000000, 0x00050085, 0x0000000D, 0x00004342, 0x00004647, 0x000033B8,\n    0x00050051, 0x0000000D, 0x00005C2A, 0x0000439D, 0x00000001, 0x00050085,\n    0x0000000D, 0x00003F13, 0x00005C2A, 0x00005C12, 0x00050081, 0x0000000D,\n    0x00002E24, 0x00004342, 0x00003F13, 0x00050085, 0x0000000D, 0x000021EC,\n    0x00004647, 0x00004D37, 0x00050085, 0x0000000D, 0x00005AFE, 0x00005C2A,\n    0x000033B8, 0x00050081, 0x0000000D, 0x00005E72, 0x000021EC, 0x00005AFE,\n    0x00050050, 0x00000013, 0x00002662, 0x00002E24, 0x00005E72, 0x00050085,\n    0x00000013, 0x0000229D, 0x00002662, 0x000029E7, 0x00050051, 0x0000000D,\n    0x00006203, 0x0000229D, 0x00000000, 0x00050085, 0x0000000D, 0x00005F85,\n    0x00006203, 0x00006203, 0x00050051, 0x0000000D, 0x00005C2B, 0x0000229D,\n    0x00000001, 0x00050085, 0x0000000D, 0x0000363E, 0x00005C2B, 0x00005C2B,\n    0x00050081, 0x0000000D, 0x00005378, 0x00005F85, 0x0000363E, 0x0007000C,\n    0x0000000D, 0x00002ADC, 0x00000001, 0x00000025, 0x00005378, 0x00004005,\n    0x00050085, 0x0000000D, 0x00002768, 0x00000A93, 0x00002ADC, 0x00050081,\n    0x0000000D, 0x00005465, 0x00002768, 0x00000341, 0x00050085, 0x0000000D,\n    0x000024ED, 0x00002433, 0x00002ADC, 0x00050081, 0x0000000D, 0x00004740,\n    0x000024ED, 0x00000341, 0x00050085, 0x0000000D, 0x00002239, 0x00005465,\n    0x00005465, 0x00050085, 0x0000000D, 0x00005BEE, 0x00004740, 0x00004740,\n    0x00050085, 0x0000000D, 0x0000524F, 0x000004B3, 0x00002239, 0x00050081,\n    0x0000000D, 0x00003B4C, 0x0000524F, 0x000000B4, 0x00050085, 0x0000000D,\n    0x00001BD7, 0x00003B4C, 0x00005BEE, 0x0005008E, 0x00000018, 0x00001E16,\n    0x000041D0, 0x00001BD7, 0x00050081, 0x00000018, 0x00001B89, 0x00001B33,\n    0x00001E16, 0x00050081, 0x0000000D, 0x0000617B, 0x00001A78, 0x00001BD7,\n    0x00050088, 0x0000000D, 0x00003D1A, 0x0000008A, 0x0000617B, 0x00060050,\n    0x00000018, 0x00003F3D, 0x00003D1A, 0x00003D1A, 0x00003D1A, 0x00050085,\n    0x00000018, 0x000042EC, 0x00001B89, 0x00003F3D, 0x0007000C, 0x00000018,\n    0x00004657, 0x00000001, 0x00000028, 0x00002952, 0x000042EC, 0x0007000C,\n    0x00000018, 0x0000309B, 0x00000001, 0x00000025, 0x00004A0F, 0x00004657,\n    0x00050041, 0x0000028B, 0x00002642, 0x00001691, 0x00000A0A, 0x00050051,\n    0x0000000D, 0x000060DB, 0x0000309B, 0x00000000, 0x0003003E, 0x00002642,\n    0x000060DB, 0x00050041, 0x0000028B, 0x00003FFA, 0x00001691, 0x00000A0D,\n    0x00050051, 0x0000000D, 0x00003D82, 0x0000309B, 0x00000001, 0x0003003E,\n    0x00003FFA, 0x00003D82, 0x00050041, 0x0000028B, 0x00003FFB, 0x00001691,\n    0x00000A10, 0x00050051, 0x0000000D, 0x00003D83, 0x0000309B, 0x00000002,\n    0x0003003E, 0x00003FFB, 0x00003D83, 0x00050041, 0x0000028B, 0x00005AFF,\n    0x00001691, 0x00000A13, 0x0003003E, 0x00005AFF, 0x0000008A, 0x000100FD,\n    0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/ui/shaders/bytecode/vulkan_spirv/guest_output_ffx_fsr_rcas_dither_ps.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25152\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint Fragment %main \"main\" %gl_FragCoord %xe_fsr_rcas_color\n               OpExecutionMode %main OriginUpperLeft\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %gl_FragCoord \"gl_FragCoord\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_fsr_rcas_output_offset\"\n               OpMemberName %push_const_block_xe 1 \"xe_fsr_rcas_sharpness_post_setup\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %xe_fsr_rcas_color \"xe_fsr_rcas_color\"\n               OpName %xe_fsr_rcas_source \"xe_fsr_rcas_source\"\n               OpDecorate %gl_FragCoord BuiltIn FragCoord\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 16\n               OpMemberDecorate %push_const_block_xe 1 Offset 24\n               OpDecorate %xe_fsr_rcas_color Location 0\n               OpDecorate %xe_fsr_rcas_source Binding 0\n               OpDecorate %xe_fsr_rcas_source DescriptorSet 0\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n      %float = OpTypeFloat 32\n%_ptr_Function_float = OpTypePointer Function %float\n    %v3float = OpTypeVector %float 3\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n    %v4float = OpTypeVector %float 4\n    %float_0 = OpConstant %float 0\n    %float_1 = OpConstant %float 1\n    %uint_15 = OpConstant %uint 15\n   %uint_256 = OpConstant %uint 256\n%_arr_float_uint_256 = OpTypeArray %float %uint_256\n%float_n0_00100337015 = OpConstant %float -0.00100337015\n%float_0_000880821084 = OpConstant %float 0.000880821084\n%float_0_00169270835 = OpConstant %float 0.00169270835\n%float_n0_00155484071 = OpConstant %float -0.00155484071\n%float_0_00127910543 = OpConstant %float 0.00127910543\n%float_n0_000605085806 = OpConstant %float -0.000605085806\n%float_0_00106464466 = OpConstant %float 0.00106464466\n%float_n0_00138633582 = OpConstant %float -0.00138633582\n%float_0_00135569857 = OpConstant %float 0.00135569857\n%float_0_000513174047 = OpConstant %float 0.000513174047\n%float_0_00121783093 = OpConstant %float 0.00121783093\n%float_n0_00160079659 = OpConstant %float -0.00160079659\n%float_0_00058976718 = OpConstant %float 0.00058976718\n%float_n0_00028339462 = OpConstant %float -0.00028339462\n%float_0_00111060054 = OpConstant %float 0.00111060054\n%float_n0_00141697307 = OpConstant %float -0.00141697307\n%float_0_00144761032 = OpConstant %float 0.00144761032\n%float_n0_0005438113 = OpConstant %float -0.0005438113\n%float_0_00013020834 = OpConstant %float 0.00013020834\n%float_n0_0012025123 = OpConstant %float -0.0012025123\n%float_0_000436580885 = OpConstant %float 0.000436580885\n%float_n0_00104932603 = OpConstant %float -0.00104932603\n%float_0_000620404433 = OpConstant %float 0.000620404433\n%float_n0_000482536765 = OpConstant %float -0.000482536765\n%float_0_00187653187 = OpConstant %float 0.00187653187\n%float_n0_00109528191 = OpConstant %float -0.00109528191\n%float_n9_95710798en05 = OpConstant %float -9.95710798e-05\n%float_n0_000528492674 = OpConstant %float -0.000528492674\n%float_0_0014322917 = OpConstant %float 0.0014322917\n%float_n0_00193780637 = OpConstant %float -0.00193780637\n%float_n0_000696997566 = OpConstant %float -0.000696997566\n%float_3_829657en05 = OpConstant %float 3.829657e-05\n%float_0_000712316192 = OpConstant %float 0.000712316192\n%float_n0_00130974269 = OpConstant %float -0.00130974269\n%float_0_00109528191 = OpConstant %float 0.00109528191\n%float_n0_000298713247 = OpConstant %float -0.000298713247\n%float_0_00175398286 = OpConstant %float 0.00175398286\n%float_n0_00167738972 = OpConstant %float -0.00167738972\n%float_0_00147824758 = OpConstant %float 0.00147824758\n%float_n3_829657en05 = OpConstant %float -3.829657e-05\n%float_0_000788909325 = OpConstant %float 0.000788909325\n%float_n0_00183057599 = OpConstant %float -0.00183057599\n%float_0_000298713247 = OpConstant %float 0.000298713247\n%float_0_000988051528 = OpConstant %float 0.000988051528\n%float_n0_00117187505 = OpConstant %float -0.00117187505\n%float_0_00017616422 = OpConstant %float 0.00017616422\n%float_0_00164675247 = OpConstant %float 0.00164675247\n%float_n0_00158547796 = OpConstant %float -0.00158547796\n%float_0_000344669126 = OpConstant %float 0.000344669126\n%float_0_00186121324 = OpConstant %float 0.00186121324\n%float_n0_00176930148 = OpConstant %float -0.00176930148\n%float_n0_000865502458 = OpConstant %float -0.000865502458\n%float_0_000896139711 = OpConstant %float 0.000896139711\n%float_0_000160845593 = OpConstant %float 0.000160845593\n%float_n0_000926776964 = OpConstant %float -0.000926776964\n%float_n0_00152420346 = OpConstant %float -0.00152420346\n%float_n0_000651041686 = OpConstant %float -0.000651041686\n%float_0_00129442406 = OpConstant %float 0.00129442406\n%float_n0_000804227951 = OpConstant %float -0.000804227951\n%float_n0_00146292895 = OpConstant %float -0.00146292895\n%float_0_00179993873 = OpConstant %float 0.00179993873\n%float_n0_000850183831 = OpConstant %float -0.000850183831\n%float_0_000850183831 = OpConstant %float 0.000850183831\n%float_n0_000451899512 = OpConstant %float -0.000451899512\n%float_n0_00106464466 = OpConstant %float -0.00106464466\n%float_n0_000145526967 = OpConstant %float -0.000145526967\n%float_0_000237438726 = OpConstant %float 0.000237438726\n%float_0_00141697307 = OpConstant %float 0.00141697307\n%float_n0_00058976718 = OpConstant %float -0.00058976718\n%float_n0_000191482846 = OpConstant %float -0.000191482846\n%float_0_00160079659 = OpConstant %float 0.00160079659\n%float_0_00101868878 = OpConstant %float 0.00101868878\n%float_0_000405943632 = OpConstant %float 0.000405943632\n%float_n0_000206801473 = OpConstant %float -0.000206801473\n%float_0_00158547796 = OpConstant %float 0.00158547796\n%float_0_000651041686 = OpConstant %float 0.000651041686\n%float_n6_89338267en05 = OpConstant %float -6.89338267e-05\n%float_0_000421262259 = OpConstant %float 0.000421262259\n%float_n0_00164675247 = OpConstant %float -0.00164675247\n%float_0_00137101719 = OpConstant %float 0.00137101719\n%float_0_000926776964 = OpConstant %float 0.000926776964\n%float_n0_000666360313 = OpConstant %float -0.000666360313\n%float_0_00118719367 = OpConstant %float 0.00118719367\n%float_n0_00144761032 = OpConstant %float -0.00144761032\n%float_0_000574448553 = OpConstant %float 0.000574448553\n%float_n0_00189185049 = OpConstant %float -0.00189185049\n%float_0_000758272072 = OpConstant %float 0.000758272072\n%float_n0_00129442406 = OpConstant %float -0.00129442406\n%float_0_00192248775 = OpConstant %float 0.00192248775\n%float_n0_0016620711 = OpConstant %float -0.0016620711\n%float_n0_00103400741 = OpConstant %float -0.00103400741\n%float_n0_000497855421 = OpConstant %float -0.000497855421\n%float_n0_00186121324 = OpConstant %float -0.00186121324\n%float_0_0012025123 = OpConstant %float 0.0012025123\n%float_n0_0003293505 = OpConstant %float -0.0003293505\n%float_n0_00137101719 = OpConstant %float -0.00137101719\n%float_0_00163143384 = OpConstant %float 0.00163143384\n%float_n0_00184589461 = OpConstant %float -0.00184589461\n%float_0_000727634819 = OpConstant %float 0.000727634819\n%float_n0_000911458337 = OpConstant %float -0.000911458337\n%float_0_00181525736 = OpConstant %float 0.00181525736\n%float_n0_00114123779 = OpConstant %float -0.00114123779\n%float_n0_000375306379 = OpConstant %float -0.000375306379\n%float_9_95710798en05 = OpConstant %float 9.95710798e-05\n%float_n0_000742953445 = OpConstant %float -0.000742953445\n%float_0_00117187505 = OpConstant %float 0.00117187505\n%float_6_89338267en05 = OpConstant %float 6.89338267e-05\n%float_0_0014935662 = OpConstant %float 0.0014935662\n%float_0_000972732843 = OpConstant %float 0.000972732843\n%float_n0_000957414217 = OpConstant %float -0.000957414217\n%float_0_00193780637 = OpConstant %float 0.00193780637\n%float_0_000528492674 = OpConstant %float 0.000528492674\n%float_5_36151965en05 = OpConstant %float 5.36151965e-05\n%float_n0_00124846818 = OpConstant %float -0.00124846818\n%float_n0_000268075994 = OpConstant %float -0.000268075994\n%float_0_00153952208 = OpConstant %float 0.00153952208\n%float_n7_65931418en06 = OpConstant %float -7.65931418e-06\n%float_0_000314031873 = OpConstant %float 0.000314031873\n%float_0_00134037994 = OpConstant %float 0.00134037994\n%float_n0_00175398286 = OpConstant %float -0.00175398286\n%float_0_000497855421 = OpConstant %float 0.000497855421\n%float_n0_00118719367 = OpConstant %float -0.00118719367\n%float_0_000773590698 = OpConstant %float 0.000773590698\n%float_n0_00134037994 = OpConstant %float -0.00134037994\n%float_0_000268075994 = OpConstant %float 0.000268075994\n%float_n0_00147824758 = OpConstant %float -0.00147824758\n%float_n0_00013020834 = OpConstant %float -0.00013020834\n%float_n0_000773590698 = OpConstant %float -0.000773590698\n%float_0_00130974269 = OpConstant %float 0.00130974269\n%float_0_000390625006 = OpConstant %float 0.000390625006\n%float_0_000957414217 = OpConstant %float 0.000957414217\n%float_n0_000467218139 = OpConstant %float -0.000467218139\n%float_n0_00153952208 = OpConstant %float -0.00153952208\n%float_0_00103400741 = OpConstant %float 0.00103400741\n%float_n0_000681678939 = OpConstant %float -0.000681678939\n%float_0_00167738972 = OpConstant %float 0.00167738972\n%float_0_00100337015 = OpConstant %float 0.00100337015\n%float_n0_000421262259 = OpConstant %float -0.000421262259\n%float_0_00178462011 = OpConstant %float 0.00178462011\n%float_n0_000237438726 = OpConstant %float -0.000237438726\n%float_n0_000620404433 = OpConstant %float -0.000620404433\n%float_0_0016620711 = OpConstant %float 0.0016620711\n%float_0_000834865205 = OpConstant %float 0.000834865205\n%float_n0_0017233456 = OpConstant %float -0.0017233456\n%float_n0_00107996329 = OpConstant %float -0.00107996329\n%float_0_00176930148 = OpConstant %float 0.00176930148\n%float_n0_000788909325 = OpConstant %float -0.000788909325\n%float_n0_00178462011 = OpConstant %float -0.00178462011\n%float_0_000681678939 = OpConstant %float 0.000681678939\n%float_n0_000988051528 = OpConstant %float -0.000988051528\n%float_n0_00132506131 = OpConstant %float -0.00132506131\n%float_n0_00017616422 = OpConstant %float -0.00017616422\n%float_n0_00150888483 = OpConstant %float -0.00150888483\n%float_0_0003293505 = OpConstant %float 0.0003293505\n%float_n0_001953125 = OpConstant %float -0.001953125\n%float_0_000666360313 = OpConstant %float 0.000666360313\n%float_n0_00161611522 = OpConstant %float -0.00161611522\n%float_0_00115655642 = OpConstant %float 0.00115655642\n%float_0_000451899512 = OpConstant %float 0.000451899512\n%float_n0_000436580885 = OpConstant %float -0.000436580885\n%float_0_000191482846 = OpConstant %float 0.000191482846\n%float_n0_0014935662 = OpConstant %float -0.0014935662\n%float_0_00114123779 = OpConstant %float 0.00114123779\n%float_8_42524532en05 = OpConstant %float 8.42524532e-05\n%float_0_00189185049 = OpConstant %float 0.00189185049\n%float_0_00140165444 = OpConstant %float 0.00140165444\n%float_0_000559129927 = OpConstant %float 0.000559129927\n%float_0_000114889706 = OpConstant %float 0.000114889706\n%float_0_00126378681 = OpConstant %float 0.00126378681\n%float_n0_000574448553 = OpConstant %float -0.000574448553\n%float_n0_000972732843 = OpConstant %float -0.000972732843\n%float_0_00132506131 = OpConstant %float 0.00132506131\n%float_0_000222120099 = OpConstant %float 0.000222120099\n%float_n0_000758272072 = OpConstant %float -0.000758272072\n%float_n0_00135569857 = OpConstant %float -0.00135569857\n%float_0_00146292895 = OpConstant %float 0.00146292895\n%float_0_000865502458 = OpConstant %float 0.000865502458\n%float_n0_000359987753 = OpConstant %float -0.000359987753\n%float_0_0005438113 = OpConstant %float 0.0005438113\n%float_n0_00112591917 = OpConstant %float -0.00112591917\n%float_n0_000252757367 = OpConstant %float -0.000252757367\n%float_n0_000559129927 = OpConstant %float -0.000559129927\n%float_n0_00181525736 = OpConstant %float -0.00181525736\n%float_0_0017233456 = OpConstant %float 0.0017233456\n%float_n0_00115655642 = OpConstant %float -0.00115655642\n%float_0_000742953445 = OpConstant %float 0.000742953445\n%float_0_00157015934 = OpConstant %float 0.00157015934\n%float_n0_000114889706 = OpConstant %float -0.000114889706\n%float_n0_00121783093 = OpConstant %float -0.00121783093\n%float_0_00183057599 = OpConstant %float 0.00183057599\n%float_2_29779416en05 = OpConstant %float 2.29779416e-05\n%float_n0_00192248775 = OpConstant %float -0.00192248775\n%float_0_00173866423 = OpConstant %float 0.00173866423\n%float_n0_000712316192 = OpConstant %float -0.000712316192\n%float_0_00155484071 = OpConstant %float 0.00155484071\n%float_n0_00170802698 = OpConstant %float -0.00170802698\n%float_0_00123314955 = OpConstant %float 0.00123314955\n%float_0_000206801473 = OpConstant %float 0.000206801473\n%float_0_00104932603 = OpConstant %float 0.00104932603\n%float_n0_000727634819 = OpConstant %float -0.000727634819\n%float_n0_00163143384 = OpConstant %float -0.00163143384\n%float_n0_000314031873 = OpConstant %float -0.000314031873\n%float_0_000482536765 = OpConstant %float 0.000482536765\n%float_n0_00179993873 = OpConstant %float -0.00179993873\n%float_0_00094209559 = OpConstant %float 0.00094209559\n%float_n0_000344669126 = OpConstant %float -0.000344669126\n%float_0_000696997566 = OpConstant %float 0.000696997566\n%float_n0_00101868878 = OpConstant %float -0.00101868878\n%float_n0_00157015934 = OpConstant %float -0.00157015934\n%float_n2_29779416en05 = OpConstant %float -2.29779416e-05\n%float_n0_00127910543 = OpConstant %float -0.00127910543\n%float_0_000804227951 = OpConstant %float 0.000804227951\n%float_n0_000896139711 = OpConstant %float -0.000896139711\n%float_n0_0014322917 = OpConstant %float -0.0014322917\n%float_0_000605085806 = OpConstant %float 0.000605085806\n%float_n8_42524532en05 = OpConstant %float -8.42524532e-05\n%float_0_000911458337 = OpConstant %float 0.000911458337\n%float_0_001953125 = OpConstant %float 0.001953125\n%float_n0_00140165444 = OpConstant %float -0.00140165444\n%float_n0_00063572306 = OpConstant %float -0.00063572306\n%float_0_00150888483 = OpConstant %float 0.00150888483\n%float_n0_000819546578 = OpConstant %float -0.000819546578\n%float_0_00124846818 = OpConstant %float 0.00124846818\n%float_0_000252757367 = OpConstant %float 0.000252757367\n%float_0_00152420346 = OpConstant %float 0.00152420346\n%float_0_00112591917 = OpConstant %float 0.00112591917\n%float_0_000359987753 = OpConstant %float 0.000359987753\n%float_n0_000390625006 = OpConstant %float -0.000390625006\n%float_0_00190716912 = OpConstant %float 0.00190716912\n%float_0_00138633582 = OpConstant %float 0.00138633582\n%float_n0_00111060054 = OpConstant %float -0.00111060054\n%float_0_00161611522 = OpConstant %float 0.00161611522\n%float_n0_000880821084 = OpConstant %float -0.000880821084\n%float_0_000145526967 = OpConstant %float 0.000145526967\n%float_0_00107996329 = OpConstant %float 0.00107996329\n%float_n5_36151965en05 = OpConstant %float -5.36151965e-05\n%float_0_00028339462 = OpConstant %float 0.00028339462\n%float_n0_00169270835 = OpConstant %float -0.00169270835\n%float_n0_00126378681 = OpConstant %float -0.00126378681\n%float_n0_000513174047 = OpConstant %float -0.000513174047\n%float_n0_000160845593 = OpConstant %float -0.000160845593\n%float_n0_00187653187 = OpConstant %float -0.00187653187\n%float_n0_000834865205 = OpConstant %float -0.000834865205\n%float_0_00063572306 = OpConstant %float 0.00063572306\n%float_7_65931418en06 = OpConstant %float 7.65931418e-06\n%float_n0_00190716912 = OpConstant %float -0.00190716912\n%float_n0_000222120099 = OpConstant %float -0.000222120099\n%float_0_000375306379 = OpConstant %float 0.000375306379\n%float_n0_00173866423 = OpConstant %float -0.00173866423\n%float_n0_000405943632 = OpConstant %float -0.000405943632\n%float_n0_00123314955 = OpConstant %float -0.00123314955\n%float_0_00170802698 = OpConstant %float 0.00170802698\n%float_n0_00094209559 = OpConstant %float -0.00094209559\n%float_0_000819546578 = OpConstant %float 0.000819546578\n%float_0_00184589461 = OpConstant %float 0.00184589461\n%float_0_000467218139 = OpConstant %float 0.000467218139\n       %2212 = OpConstantComposite %_arr_float_uint_256 %float_n0_00100337015 %float_0_000880821084 %float_0_00169270835 %float_n0_00155484071 %float_0_00127910543 %float_n0_000605085806 %float_0_00106464466 %float_n0_00138633582 %float_0_00135569857 %float_0_000513174047 %float_0_00121783093 %float_n0_00160079659 %float_0_00058976718 %float_n0_00028339462 %float_0_00111060054 %float_n0_00141697307 %float_0_00144761032 %float_n0_0005438113 %float_0_00013020834 %float_n0_0012025123 %float_0_000436580885 %float_n0_00104932603 %float_0_000620404433 %float_n0_000482536765 %float_0_00187653187 %float_n0_00109528191 %float_n9_95710798en05 %float_n0_000528492674 %float_0_0014322917 %float_n0_00193780637 %float_n0_000696997566 %float_3_829657en05 %float_0_000712316192 %float_n0_00130974269 %float_0_00109528191 %float_n0_000298713247 %float_0_00175398286 %float_n0_00167738972 %float_0_00147824758 %float_n3_829657en05 %float_0_000788909325 %float_n0_00183057599 %float_0_000298713247 %float_0_000988051528 %float_n0_00117187505 %float_0_00017616422 %float_0_00164675247 %float_n0_00158547796 %float_0_000344669126 %float_0_00186121324 %float_n0_00176930148 %float_n0_000865502458 %float_0_000896139711 %float_0_000160845593 %float_n0_000926776964 %float_n0_00152420346 %float_n0_000651041686 %float_0_00129442406 %float_n0_000804227951 %float_n0_00146292895 %float_0_00179993873 %float_n0_000850183831 %float_0_000850183831 %float_n0_000451899512 %float_n0_00106464466 %float_n0_000145526967 %float_0_000237438726 %float_0_00141697307 %float_n0_00058976718 %float_n0_000191482846 %float_0_00160079659 %float_0_00101868878 %float_0_000405943632 %float_n0_000206801473 %float_0_00158547796 %float_0_000651041686 %float_n6_89338267en05 %float_0_000421262259 %float_n0_00164675247 %float_0_00137101719 %float_0_000926776964 %float_n0_000666360313 %float_0_00118719367 %float_n0_00144761032 %float_0_000574448553 %float_n0_00189185049 %float_0_000758272072 %float_n0_00129442406 %float_0_00192248775 %float_n0_0016620711 %float_n0_00103400741 %float_n0_000497855421 %float_n0_00186121324 %float_0_0012025123 %float_n0_0003293505 %float_n0_00137101719 %float_0_00163143384 %float_n0_00184589461 %float_0_000727634819 %float_n0_000911458337 %float_0_00181525736 %float_n0_00114123779 %float_n0_000375306379 %float_9_95710798en05 %float_n0_000742953445 %float_0_00117187505 %float_6_89338267en05 %float_0_0014935662 %float_0_000972732843 %float_n0_000957414217 %float_0_00193780637 %float_0_000528492674 %float_5_36151965en05 %float_n0_00124846818 %float_n0_000268075994 %float_0_00153952208 %float_n7_65931418en06 %float_0_000314031873 %float_0_00134037994 %float_n0_00175398286 %float_0_000497855421 %float_n0_00118719367 %float_0_000773590698 %float_n0_00134037994 %float_0_000268075994 %float_n0_00147824758 %float_n0_00013020834 %float_n0_000773590698 %float_0_00130974269 %float_0_000390625006 %float_0_000957414217 %float_n0_000467218139 %float_n0_00153952208 %float_0_00103400741 %float_n0_000681678939 %float_0_00167738972 %float_0_00100337015 %float_n0_000421262259 %float_0_00178462011 %float_n0_000237438726 %float_n0_000620404433 %float_0_0016620711 %float_0_000834865205 %float_n0_0017233456 %float_n0_00107996329 %float_0_00176930148 %float_n0_000788909325 %float_n0_00178462011 %float_0_000681678939 %float_n0_000988051528 %float_n0_00132506131 %float_n0_00017616422 %float_n0_00150888483 %float_0_0003293505 %float_n0_001953125 %float_0_000666360313 %float_n0_00161611522 %float_0_00115655642 %float_0_000451899512 %float_n0_000436580885 %float_0_000191482846 %float_n0_0014935662 %float_0_00114123779 %float_8_42524532en05 %float_0_00189185049 %float_0_00140165444 %float_0_000559129927 %float_0_000114889706 %float_0_00126378681 %float_n0_000574448553 %float_n0_000972732843 %float_0_00132506131 %float_0_000222120099 %float_n0_000758272072 %float_n0_00135569857 %float_0_00146292895 %float_0_000865502458 %float_n0_000359987753 %float_0_0005438113 %float_n0_00112591917 %float_n0_000252757367 %float_n0_000559129927 %float_n0_00181525736 %float_0_0017233456 %float_n0_00115655642 %float_0_000742953445 %float_0_00157015934 %float_n0_000114889706 %float_n0_00121783093 %float_0_00183057599 %float_2_29779416en05 %float_n0_00192248775 %float_0_00173866423 %float_n0_000712316192 %float_0_00155484071 %float_n0_00170802698 %float_0_00123314955 %float_0_000206801473 %float_0_00104932603 %float_n0_000727634819 %float_n0_00163143384 %float_n0_000314031873 %float_0_000482536765 %float_n0_00179993873 %float_0_00094209559 %float_n0_000344669126 %float_0_000696997566 %float_n0_00101868878 %float_n0_00157015934 %float_n2_29779416en05 %float_n0_00127910543 %float_0_000804227951 %float_n0_000896139711 %float_n0_0014322917 %float_0_000605085806 %float_n8_42524532en05 %float_0_000911458337 %float_0_001953125 %float_n0_00140165444 %float_n0_00063572306 %float_0_00150888483 %float_n0_000819546578 %float_0_00124846818 %float_0_000252757367 %float_0_00152420346 %float_0_00112591917 %float_0_000359987753 %float_n0_000390625006 %float_0_00190716912 %float_0_00138633582 %float_n0_00111060054 %float_0_00161611522 %float_n0_000880821084 %float_0_000145526967 %float_0_00107996329 %float_n5_36151965en05 %float_0_00028339462 %float_n0_00169270835 %float_n0_00126378681 %float_n0_000513174047 %float_n0_000160845593 %float_n0_00187653187 %float_n0_000834865205 %float_0_00063572306 %float_7_65931418en06 %float_n0_00190716912 %float_n0_000222120099 %float_0_000375306379 %float_n0_00173866423 %float_n0_000405943632 %float_n0_00123314955 %float_0_00170802698 %float_n0_00094209559 %float_0_000819546578 %float_0_00184589461 %float_0_000467218139\n    %uint_16 = OpConstant %uint 16\n%_ptr_Function__arr_float_uint_256 = OpTypePointer Function %_arr_float_uint_256\n%_ptr_Input_v4float = OpTypePointer Input %v4float\n%gl_FragCoord = OpVariable %_ptr_Input_v4float Input\n    %v2float = OpTypeVector %float 2\n%push_const_block_xe = OpTypeStruct %v2int %float\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n      %int_0 = OpConstant %int 0\n%_ptr_PushConstant_v2int = OpTypePointer PushConstant %v2int\n      %int_1 = OpConstant %int 1\n%_ptr_PushConstant_float = OpTypePointer PushConstant %float\n%_ptr_Output_v4float = OpTypePointer Output %v4float\n%xe_fsr_rcas_color = OpVariable %_ptr_Output_v4float Output\n%uint_2129764351 = OpConstant %uint 2129764351\n    %float_2 = OpConstant %float 2\n        %151 = OpTypeImage %float 2D 0 0 0 1 Unknown\n%_ptr_UniformConstant_151 = OpTypePointer UniformConstant %151\n%xe_fsr_rcas_source = OpVariable %_ptr_UniformConstant_151 UniformConstant\n     %int_n1 = OpConstant %int -1\n       %1803 = OpConstantComposite %v2int %int_0 %int_n1\n       %1806 = OpConstantComposite %v2int %int_n1 %int_0\n       %1824 = OpConstantComposite %v2int %int_1 %int_0\n       %1827 = OpConstantComposite %v2int %int_0 %int_1\n   %float_n4 = OpConstant %float -4\n    %float_4 = OpConstant %float 4\n%float_n0_1875 = OpConstant %float -0.1875\n       %2122 = OpConstantComposite %v2uint %uint_15 %uint_15\n       %2604 = OpConstantComposite %v3float %float_0 %float_0 %float_0\n       %2582 = OpConstantComposite %v3float %float_1 %float_1 %float_1\n %float_0_25 = OpConstant %float 0.25\n          %2 = OpUndef %v4float\n       %main = OpFunction %void None %1282\n      %24953 = OpLabel\n      %18411 = OpVariable %_ptr_Function__arr_float_uint_256 Function\n      %22087 = OpLoad %v4float %gl_FragCoord\n       %6562 = OpVectorShuffle %v2float %22087 %22087 0 1\n      %17656 = OpConvertFToS %v2int %6562\n      %19279 = OpAccessChain %_ptr_PushConstant_v2int %push_consts_xe %int_0\n      %22822 = OpLoad %v2int %19279\n      %23312 = OpISub %v2int %17656 %22822\n       %9938 = OpBitcast %v2uint %23312\n      %20997 = OpAccessChain %_ptr_PushConstant_float %push_consts_xe %int_1\n      %22237 = OpLoad %float %20997\n      %16454 = OpBitcast %uint %22237\n       %6990 = OpBitcast %v2int %9938\n      %14365 = OpIAdd %v2int %6990 %1803\n      %22164 = OpLoad %151 %xe_fsr_rcas_source\n       %8899 = OpImageFetch %v4float %22164 %14365 Lod %int_0\n      %19729 = OpCompositeExtract %float %8899 0\n       %6930 = OpCompositeExtract %float %8899 1\n      %18220 = OpCompositeExtract %float %8899 2\n      %20349 = OpIAdd %v2int %6990 %1806\n      %16541 = OpLoad %151 %xe_fsr_rcas_source\n       %8900 = OpImageFetch %v4float %16541 %20349 Lod %int_0\n      %19730 = OpCompositeExtract %float %8900 0\n      %24728 = OpCompositeExtract %float %8900 1\n      %11386 = OpCompositeExtract %float %8900 2\n      %16530 = OpLoad %151 %xe_fsr_rcas_source\n      %19121 = OpImageFetch %v4float %16530 %6990 Lod %int_0\n      %19731 = OpCompositeExtract %float %19121 0\n       %6931 = OpCompositeExtract %float %19121 1\n      %18221 = OpCompositeExtract %float %19121 2\n      %20350 = OpIAdd %v2int %6990 %1824\n      %16542 = OpLoad %151 %xe_fsr_rcas_source\n       %8901 = OpImageFetch %v4float %16542 %20350 Lod %int_0\n      %19732 = OpCompositeExtract %float %8901 0\n       %6932 = OpCompositeExtract %float %8901 1\n      %18222 = OpCompositeExtract %float %8901 2\n      %20351 = OpIAdd %v2int %6990 %1827\n      %16543 = OpLoad %151 %xe_fsr_rcas_source\n       %8902 = OpImageFetch %v4float %16543 %20351 Lod %int_0\n      %19733 = OpCompositeExtract %float %8902 0\n      %23834 = OpCompositeExtract %float %8902 1\n       %6945 = OpCompositeExtract %float %8902 2\n      %15372 = OpExtInst %float %1 FMin %19730 %19732\n      %25151 = OpExtInst %float %1 FMin %19729 %15372\n      %15948 = OpExtInst %float %1 FMin %25151 %19733\n      %15949 = OpExtInst %float %1 FMin %24728 %6932\n      %15950 = OpExtInst %float %1 FMin %6930 %15949\n      %15951 = OpExtInst %float %1 FMin %15950 %23834\n      %15952 = OpExtInst %float %1 FMin %11386 %18222\n      %15953 = OpExtInst %float %1 FMin %18220 %15952\n      %10905 = OpExtInst %float %1 FMin %15953 %6945\n      %24296 = OpExtInst %float %1 FMax %19730 %19732\n      %17523 = OpExtInst %float %1 FMax %19729 %24296\n      %21851 = OpExtInst %float %1 FMax %17523 %19733\n      %21852 = OpExtInst %float %1 FMax %24728 %6932\n      %21853 = OpExtInst %float %1 FMax %6930 %21852\n      %21854 = OpExtInst %float %1 FMax %21853 %23834\n      %21855 = OpExtInst %float %1 FMax %11386 %18222\n      %21848 = OpExtInst %float %1 FMax %18220 %21855\n      %10142 = OpExtInst %float %1 FMax %21848 %6945\n      %24762 = OpExtInst %float %1 FMin %15948 %19731\n      %21997 = OpFDiv %float %float_0_25 %21851\n      %10377 = OpFMul %float %24762 %21997\n      %21327 = OpExtInst %float %1 FMin %15951 %6931\n      %17454 = OpFDiv %float %float_0_25 %21854\n      %10378 = OpFMul %float %21327 %17454\n      %21328 = OpExtInst %float %1 FMin %10905 %18221\n      %17457 = OpFDiv %float %float_0_25 %10142\n      %24307 = OpFMul %float %21328 %17457\n      %16512 = OpExtInst %float %1 FMax %21851 %19731\n      %22147 = OpFSub %float %float_1 %16512\n      %13544 = OpFMul %float %float_4 %15948\n      %19323 = OpFAdd %float %13544 %float_n4\n      %20054 = OpFDiv %float %float_1 %19323\n      %20866 = OpFMul %float %22147 %20054\n      %16513 = OpExtInst %float %1 FMax %21854 %6931\n      %22148 = OpFSub %float %float_1 %16513\n      %13545 = OpFMul %float %float_4 %15951\n      %19324 = OpFAdd %float %13545 %float_n4\n      %20055 = OpFDiv %float %float_1 %19324\n      %20867 = OpFMul %float %22148 %20055\n      %16514 = OpExtInst %float %1 FMax %10142 %18221\n      %22149 = OpFSub %float %float_1 %16514\n      %13546 = OpFMul %float %float_4 %10905\n      %19325 = OpFAdd %float %13546 %float_n4\n      %22199 = OpFDiv %float %float_1 %19325\n      %15174 = OpFMul %float %22149 %22199\n      %22356 = OpFNegate %float %10377\n      %23705 = OpExtInst %float %1 FMax %22356 %20866\n      %16409 = OpFNegate %float %10378\n       %9177 = OpExtInst %float %1 FMax %16409 %20867\n      %14264 = OpFNegate %float %24307\n      %12648 = OpExtInst %float %1 FMax %14264 %15174\n      %18923 = OpExtInst %float %1 FMax %9177 %12648\n       %7826 = OpExtInst %float %1 FMax %23705 %18923\n      %10548 = OpExtInst %float %1 FMin %7826 %float_0\n       %8860 = OpExtInst %float %1 FMax %float_n0_1875 %10548\n      %22576 = OpBitcast %float %16454\n      %20919 = OpFMul %float %8860 %22576\n      %23316 = OpFMul %float %float_4 %20919\n      %16498 = OpFAdd %float %23316 %float_1\n       %6551 = OpBitcast %uint %16498\n       %7563 = OpISub %uint %uint_2129764351 %6551\n       %9419 = OpBitcast %float %7563\n       %9130 = OpFNegate %float %9419\n      %12367 = OpFMul %float %9130 %16498\n      %16540 = OpFAdd %float %12367 %float_2\n       %9366 = OpFMul %float %9419 %16540\n      %18845 = OpFAdd %float %19729 %19730\n      %23143 = OpFAdd %float %18845 %19733\n       %6535 = OpFAdd %float %23143 %19732\n      %12673 = OpFMul %float %20919 %6535\n      %18153 = OpFAdd %float %12673 %19731\n       %9367 = OpFMul %float %18153 %9366\n      %18846 = OpFAdd %float %6930 %24728\n      %23144 = OpFAdd %float %18846 %23834\n       %6536 = OpFAdd %float %23144 %6932\n      %12674 = OpFMul %float %20919 %6536\n      %18154 = OpFAdd %float %12674 %6931\n       %9368 = OpFMul %float %18154 %9366\n      %18847 = OpFAdd %float %18220 %11386\n      %23145 = OpFAdd %float %18847 %6945\n       %6537 = OpFAdd %float %23145 %18222\n      %12675 = OpFMul %float %20919 %6537\n      %17260 = OpFAdd %float %12675 %18221\n      %16604 = OpFMul %float %17260 %9366\n      %10663 = OpCompositeInsert %v4float %9367 %2 0\n      %21274 = OpCompositeInsert %v4float %9368 %10663 1\n      %18455 = OpCompositeInsert %v4float %16604 %21274 2\n      %20032 = OpVectorShuffle %v3float %18455 %18455 0 1 2\n      %12552 = OpBitwiseAnd %v2uint %9938 %2122\n       %9741 = OpCompositeExtract %uint %12552 1\n      %21498 = OpIMul %uint %9741 %uint_16\n      %23411 = OpCompositeExtract %uint %12552 0\n      %12610 = OpIAdd %uint %21498 %23411\n               OpStore %18411 %2212\n       %9958 = OpAccessChain %_ptr_Function_float %18411 %12610\n      %25140 = OpLoad %float %9958\n      %18028 = OpCompositeConstruct %v3float %25140 %25140 %25140\n      %21458 = OpFAdd %v3float %20032 %18028\n      %19525 = OpExtInst %v3float %1 FClamp %21458 %2604 %2582\n      %16777 = OpCompositeExtract %float %19525 0\n      %19708 = OpCompositeExtract %float %19525 1\n       %7472 = OpCompositeExtract %float %19525 2\n      %22408 = OpCompositeConstruct %v4float %16777 %19708 %7472 %float_1\n               OpStore %xe_fsr_rcas_color %22408\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t guest_output_ffx_fsr_rcas_dither_ps[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006240, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0007000F, 0x00000004,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000C93, 0x00000CB5, 0x00030010,\n    0x0000161F, 0x00000007, 0x00030003, 0x00000002, 0x000001CC, 0x00090004,\n    0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F, 0x5F776F6C, 0x72747461,\n    0x74756269, 0x00007365, 0x000B0004, 0x455F4C47, 0x735F5458, 0x6C706D61,\n    0x656C7265, 0x745F7373, 0x75747865, 0x665F6572, 0x74636E75, 0x736E6F69,\n    0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F, 0x70635F45, 0x74735F70,\n    0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365, 0x00006576, 0x00080004,\n    0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63, 0x69645F65, 0x74636572,\n    0x00657669, 0x00040005, 0x0000161F, 0x6E69616D, 0x00000000, 0x00060005,\n    0x00000C93, 0x465F6C67, 0x43676172, 0x64726F6F, 0x00000000, 0x00070005,\n    0x000003F2, 0x68737570, 0x6E6F635F, 0x625F7473, 0x6B636F6C, 0x0065785F,\n    0x000A0006, 0x000003F2, 0x00000000, 0x665F6578, 0x725F7273, 0x5F736163,\n    0x7074756F, 0x6F5F7475, 0x65736666, 0x00000074, 0x000C0006, 0x000003F2,\n    0x00000001, 0x665F6578, 0x725F7273, 0x5F736163, 0x72616873, 0x73656E70,\n    0x6F705F73, 0x735F7473, 0x70757465, 0x00000000, 0x00060005, 0x00000CE9,\n    0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578, 0x00070005, 0x00000CB5,\n    0x665F6578, 0x725F7273, 0x5F736163, 0x6F6C6F63, 0x00000072, 0x00070005,\n    0x00000DF7, 0x665F6578, 0x725F7273, 0x5F736163, 0x72756F73, 0x00006563,\n    0x00040047, 0x00000C93, 0x0000000B, 0x0000000F, 0x00030047, 0x000003F2,\n    0x00000002, 0x00050048, 0x000003F2, 0x00000000, 0x00000023, 0x00000010,\n    0x00050048, 0x000003F2, 0x00000001, 0x00000023, 0x00000018, 0x00040047,\n    0x00000CB5, 0x0000001E, 0x00000000, 0x00040047, 0x00000DF7, 0x00000021,\n    0x00000000, 0x00040047, 0x00000DF7, 0x00000022, 0x00000000, 0x00020013,\n    0x00000008, 0x00030021, 0x00000502, 0x00000008, 0x00030016, 0x0000000D,\n    0x00000020, 0x00040020, 0x0000028A, 0x00000007, 0x0000000D, 0x00040017,\n    0x00000018, 0x0000000D, 0x00000003, 0x00040015, 0x0000000B, 0x00000020,\n    0x00000000, 0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00040015,\n    0x0000000C, 0x00000020, 0x00000001, 0x00040017, 0x00000012, 0x0000000C,\n    0x00000002, 0x00040017, 0x0000001D, 0x0000000D, 0x00000004, 0x0004002B,\n    0x0000000D, 0x00000A0C, 0x00000000, 0x0004002B, 0x0000000D, 0x0000008A,\n    0x3F800000, 0x0004002B, 0x0000000B, 0x00000A37, 0x0000000F, 0x0004002B,\n    0x0000000B, 0x00000147, 0x00000100, 0x0004001C, 0x000003DD, 0x0000000D,\n    0x00000147, 0x0004002B, 0x0000000D, 0x0000010F, 0xBA838384, 0x0004002B,\n    0x0000000D, 0x00000728, 0x3A66E6E7, 0x0004002B, 0x0000000D, 0x00000705,\n    0x3ADDDDDE, 0x0004002B, 0x0000000D, 0x00000A5A, 0xBACBCBCC, 0x0004002B,\n    0x0000000D, 0x000008DF, 0x3AA7A7A8, 0x0004002B, 0x0000000D, 0x00000094,\n    0xBA1E9E9F, 0x0004002B, 0x0000000D, 0x0000034C, 0x3A8B8B8C, 0x0004002B,\n    0x0000000D, 0x0000087E, 0xBAB5B5B6, 0x0004002B, 0x0000000D, 0x0000034D,\n    0x3AB1B1B2, 0x0004002B, 0x0000000D, 0x00000687, 0x3A068687, 0x0004002B,\n    0x0000000D, 0x000003EB, 0x3A9F9FA0, 0x0004002B, 0x0000000D, 0x0000024E,\n    0xBAD1D1D2, 0x0004002B, 0x0000000D, 0x00000726, 0x3A1A9A9B, 0x0004002B,\n    0x0000000D, 0x00000698, 0xB9949495, 0x0004002B, 0x0000000D, 0x00000703,\n    0x3A919192, 0x0004002B, 0x0000000D, 0x00000AF8, 0xBAB9B9BA, 0x0004002B,\n    0x0000000D, 0x00000ABB, 0x3ABDBDBE, 0x0004002B, 0x0000000D, 0x0000026F,\n    0xBA0E8E8F, 0x0004002B, 0x0000000D, 0x000008A8, 0x39088889, 0x0004002B,\n    0x0000000D, 0x00000565, 0xBA9D9D9E, 0x0004002B, 0x0000000D, 0x0000065D,\n    0x39E4E4E5, 0x0004002B, 0x0000000D, 0x000004C6, 0xBA89898A, 0x0004002B,\n    0x0000000D, 0x00000057, 0x3A22A2A3, 0x0004002B, 0x0000000D, 0x0000006A,\n    0xB9FCFCFD, 0x0004002B, 0x0000000D, 0x00000A1E, 0x3AF5F5F6, 0x0004002B,\n    0x0000000D, 0x0000087D, 0xBA8F8F90, 0x0004002B, 0x0000000D, 0x00000959,\n    0xB8D0D0D1, 0x0004002B, 0x0000000D, 0x00000BB8, 0xBA0A8A8B, 0x0004002B,\n    0x0000000D, 0x0000097E, 0x3ABBBBBC, 0x0004002B, 0x0000000D, 0x00000606,\n    0xBAFDFDFE, 0x0004002B, 0x0000000D, 0x000003AD, 0xBA36B6B7, 0x0004002B,\n    0x0000000D, 0x000000E2, 0x3820A0A1, 0x0004002B, 0x0000000D, 0x00000370,\n    0x3A3ABABB, 0x0004002B, 0x0000000D, 0x0000024D, 0xBAABABAC, 0x0004002B,\n    0x0000000D, 0x000005C6, 0x3A8F8F90, 0x0004002B, 0x0000000D, 0x00000B8C,\n    0xB99C9C9D, 0x0004002B, 0x0000000D, 0x00000036, 0x3AE5E5E6, 0x0004002B,\n    0x0000000D, 0x0000087F, 0xBADBDBDC, 0x0004002B, 0x0000000D, 0x00000172,\n    0x3AC1C1C2, 0x0004002B, 0x0000000D, 0x00000399, 0xB820A0A1, 0x0004002B,\n    0x0000000D, 0x0000040F, 0x3A4ECECF, 0x0004002B, 0x0000000D, 0x0000091E,\n    0xBAEFEFF0, 0x0004002B, 0x0000000D, 0x000008D5, 0x399C9C9D, 0x0004002B,\n    0x0000000D, 0x000008DE, 0x3A818182, 0x0004002B, 0x0000000D, 0x000002EB,\n    0xBA99999A, 0x0004002B, 0x0000000D, 0x00000317, 0x3938B8B9, 0x0004002B,\n    0x0000000D, 0x0000034E, 0x3AD7D7D8, 0x0004002B, 0x0000000D, 0x00000111,\n    0xBACFCFD0, 0x0004002B, 0x0000000D, 0x0000002B, 0x39B4B4B5, 0x0004002B,\n    0x0000000D, 0x000008E1, 0x3AF3F3F4, 0x0004002B, 0x0000000D, 0x0000042A,\n    0xBAE7E7E8, 0x0004002B, 0x0000000D, 0x00000765, 0xBA62E2E3, 0x0004002B,\n    0x0000000D, 0x000009A2, 0x3A6AEAEB, 0x0004002B, 0x0000000D, 0x000004F2,\n    0x3928A8A9, 0x0004002B, 0x0000000D, 0x0000058A, 0xBA72F2F3, 0x0004002B,\n    0x0000000D, 0x000007E0, 0xBAC7C7C8, 0x0004002B, 0x0000000D, 0x00000802,\n    0xBA2AAAAB, 0x0004002B, 0x0000000D, 0x00000A1C, 0x3AA9A9AA, 0x0004002B,\n    0x0000000D, 0x00000940, 0xBA52D2D3, 0x0004002B, 0x0000000D, 0x000002EC,\n    0xBABFBFC0, 0x0004002B, 0x0000000D, 0x000003ED, 0x3AEBEBEC, 0x0004002B,\n    0x0000000D, 0x000004EB, 0xBA5EDEDF, 0x0004002B, 0x0000000D, 0x00000234,\n    0x3A5EDEDF, 0x0004002B, 0x0000000D, 0x00000245, 0xB9ECECED, 0x0004002B,\n    0x0000000D, 0x00000603, 0xBA8B8B8C, 0x0004002B, 0x0000000D, 0x00000984,\n    0xB9189899, 0x0004002B, 0x0000000D, 0x0000076E, 0x3978F8F9, 0x0004002B,\n    0x0000000D, 0x00000841, 0x3AB9B9BA, 0x0004002B, 0x0000000D, 0x000009DD,\n    0xBA1A9A9B, 0x0004002B, 0x0000000D, 0x000003F3, 0xB948C8C9, 0x0004002B,\n    0x0000000D, 0x00000B5A, 0x3AD1D1D2, 0x0004002B, 0x0000000D, 0x00000B58,\n    0x3A858586, 0x0004002B, 0x0000000D, 0x00000838, 0x39D4D4D5, 0x0004002B,\n    0x0000000D, 0x00000218, 0xB958D8D9, 0x0004002B, 0x0000000D, 0x00000A1D,\n    0x3ACFCFD0, 0x0004002B, 0x0000000D, 0x0000054B, 0x3A2AAAAB, 0x0004002B,\n    0x0000000D, 0x00000503, 0xB8909091, 0x0004002B, 0x0000000D, 0x00000169,\n    0x39DCDCDD, 0x0004002B, 0x0000000D, 0x00000605, 0xBAD7D7D8, 0x0004002B,\n    0x0000000D, 0x0000048A, 0x3AB3B3B4, 0x0004002B, 0x0000000D, 0x000002D3,\n    0x3A72F2F3, 0x0004002B, 0x0000000D, 0x00000A7C, 0xBA2EAEAF, 0x0004002B,\n    0x0000000D, 0x00000171, 0x3A9B9B9C, 0x0004002B, 0x0000000D, 0x000001AF,\n    0xBABDBDBE, 0x0004002B, 0x0000000D, 0x000004AC, 0x3A169697, 0x0004002B,\n    0x0000000D, 0x0000024F, 0xBAF7F7F8, 0x0004002B, 0x0000000D, 0x00000ADE,\n    0x3A46C6C7, 0x0004002B, 0x0000000D, 0x00000110, 0xBAA9A9AA, 0x0004002B,\n    0x0000000D, 0x00000212, 0x3AFBFBFC, 0x0004002B, 0x0000000D, 0x00000742,\n    0xBAD9D9DA, 0x0004002B, 0x0000000D, 0x00000389, 0xBA878788, 0x0004002B,\n    0x0000000D, 0x000006C4, 0xBA028283, 0x0004002B, 0x0000000D, 0x00000B98,\n    0xBAF3F3F4, 0x0004002B, 0x0000000D, 0x000002AE, 0x3A9D9D9E, 0x0004002B,\n    0x0000000D, 0x000009B1, 0xB9ACACAD, 0x0004002B, 0x0000000D, 0x00000741,\n    0xBAB3B3B4, 0x0004002B, 0x0000000D, 0x00000211, 0x3AD5D5D6, 0x0004002B,\n    0x0000000D, 0x00000A5B, 0xBAF1F1F2, 0x0004002B, 0x0000000D, 0x000005EA,\n    0x3A3EBEBF, 0x0004002B, 0x0000000D, 0x00000310, 0xBA6EEEEF, 0x0004002B,\n    0x0000000D, 0x0000052A, 0x3AEDEDEE, 0x0004002B, 0x0000000D, 0x00000071,\n    0xBA959596, 0x0004002B, 0x0000000D, 0x00000107, 0xB9C4C4C5, 0x0004002B,\n    0x0000000D, 0x000006A2, 0x38D0D0D1, 0x0004002B, 0x0000000D, 0x00000B1B,\n    0xBA42C2C3, 0x0004002B, 0x0000000D, 0x00000034, 0x3A99999A, 0x0004002B,\n    0x0000000D, 0x0000024B, 0x38909091, 0x0004002B, 0x0000000D, 0x000002AF,\n    0x3AC3C3C4, 0x0004002B, 0x0000000D, 0x00000A41, 0x3A7EFEFF, 0x0004002B,\n    0x0000000D, 0x00000A7E, 0xBA7AFAFB, 0x0004002B, 0x0000000D, 0x0000034F,\n    0x3AFDFDFE, 0x0004002B, 0x0000000D, 0x00000901, 0x3A0A8A8B, 0x0004002B,\n    0x0000000D, 0x00000539, 0x3860E0E1, 0x0004002B, 0x0000000D, 0x0000091C,\n    0xBAA3A3A4, 0x0004002B, 0x0000000D, 0x000001A4, 0xB98C8C8D, 0x0004002B,\n    0x0000000D, 0x00000666, 0x3AC9C9CA, 0x0004002B, 0x0000000D, 0x00000833,\n    0xB7008081, 0x0004002B, 0x0000000D, 0x00000206, 0x39A4A4A5, 0x0004002B,\n    0x0000000D, 0x00000210, 0x3AAFAFB0, 0x0004002B, 0x0000000D, 0x000002ED,\n    0xBAE5E5E6, 0x0004002B, 0x0000000D, 0x0000040D, 0x3A028283, 0x0004002B,\n    0x0000000D, 0x00000428, 0xBA9B9B9C, 0x0004002B, 0x0000000D, 0x00000195,\n    0x3A4ACACB, 0x0004002B, 0x0000000D, 0x000004C7, 0xBAAFAFB0, 0x0004002B,\n    0x0000000D, 0x00000AB0, 0x398C8C8D, 0x0004002B, 0x0000000D, 0x00000429,\n    0xBAC1C1C2, 0x0004002B, 0x0000000D, 0x00000B5F, 0xB9088889, 0x0004002B,\n    0x0000000D, 0x0000044C, 0xBA4ACACB, 0x0004002B, 0x0000000D, 0x00000B59,\n    0x3AABABAC, 0x0004002B, 0x0000000D, 0x00000344, 0x39CCCCCD, 0x0004002B,\n    0x0000000D, 0x000007C7, 0x3A7AFAFB, 0x0004002B, 0x0000000D, 0x00000739,\n    0xB9F4F4F5, 0x0004002B, 0x0000000D, 0x0000091D, 0xBAC9C9CA, 0x0004002B,\n    0x0000000D, 0x000000D2, 0x3A878788, 0x0004002B, 0x0000000D, 0x00000133,\n    0xBA32B2B3, 0x0004002B, 0x0000000D, 0x000005C8, 0x3ADBDBDC, 0x0004002B,\n    0x0000000D, 0x00000A1B, 0x3A838384, 0x0004002B, 0x0000000D, 0x00000420,\n    0xB9DCDCDD, 0x0004002B, 0x0000000D, 0x000002B0, 0x3AE9E9EA, 0x0004002B,\n    0x0000000D, 0x00000A25, 0xB978F8F9, 0x0004002B, 0x0000000D, 0x0000030E,\n    0xBA22A2A3, 0x0004002B, 0x0000000D, 0x0000048B, 0x3AD9D9DA, 0x0004002B,\n    0x0000000D, 0x00000B7D, 0x3A5ADADB, 0x0004002B, 0x0000000D, 0x00000073,\n    0xBAE1E1E2, 0x0004002B, 0x0000000D, 0x00000740, 0xBA8D8D8E, 0x0004002B,\n    0x0000000D, 0x00000173, 0x3AE7E7E8, 0x0004002B, 0x0000000D, 0x000006C6,\n    0xBA4ECECF, 0x0004002B, 0x0000000D, 0x00000567, 0xBAE9E9EA, 0x0004002B,\n    0x0000000D, 0x00000A3F, 0x3A32B2B3, 0x0004002B, 0x0000000D, 0x00000B95,\n    0xBA818182, 0x0004002B, 0x0000000D, 0x0000038A, 0xBAADADAE, 0x0004002B,\n    0x0000000D, 0x000005CE, 0xB938B8B9, 0x0004002B, 0x0000000D, 0x000006A3,\n    0xBAC5C5C6, 0x0004002B, 0x0000000D, 0x000006FA, 0x39ACACAD, 0x0004002B,\n    0x0000000D, 0x00000743, 0xBB000000, 0x0004002B, 0x0000000D, 0x000007C5,\n    0x3A2EAEAF, 0x0004002B, 0x0000000D, 0x0000038B, 0xBAD3D3D4, 0x0004002B,\n    0x0000000D, 0x00000ABA, 0x3A979798, 0x0004002B, 0x0000000D, 0x00000B51,\n    0x39ECECED, 0x0004002B, 0x0000000D, 0x00000914, 0xB9E4E4E5, 0x0004002B,\n    0x0000000D, 0x0000013C, 0x3948C8C9, 0x0004002B, 0x0000000D, 0x00000566,\n    0xBAC3C3C4, 0x0004002B, 0x0000000D, 0x0000097D, 0x3A959596, 0x0004002B,\n    0x0000000D, 0x00000A58, 0x38B0B0B1, 0x0004002B, 0x0000000D, 0x00000B5B,\n    0x3AF7F7F8, 0x0004002B, 0x0000000D, 0x00000704, 0x3AB7B7B8, 0x0004002B,\n    0x0000000D, 0x00000232, 0x3A129293, 0x0004002B, 0x0000000D, 0x000002EE,\n    0x38F0F0F1, 0x0004002B, 0x0000000D, 0x000007A2, 0x3AA5A5A6, 0x0004002B,\n    0x0000000D, 0x00000763, 0xBA169697, 0x0004002B, 0x0000000D, 0x00000135,\n    0xBA7EFEFF, 0x0004002B, 0x0000000D, 0x000000D3, 0x3AADADAE, 0x0004002B,\n    0x0000000D, 0x00000949, 0x3968E8E9, 0x0004002B, 0x0000000D, 0x000001D2,\n    0xBA46C6C7, 0x0004002B, 0x0000000D, 0x00000604, 0xBAB1B1B2, 0x0004002B,\n    0x0000000D, 0x00000035, 0x3ABFBFC0, 0x0004002B, 0x0000000D, 0x000004AE,\n    0x3A62E2E3, 0x0004002B, 0x0000000D, 0x000007D6, 0xB9BCBCBD, 0x0004002B,\n    0x0000000D, 0x00000B7B, 0x3A0E8E8F, 0x0004002B, 0x0000000D, 0x00000AF7,\n    0xBA939394, 0x0004002B, 0x0000000D, 0x00000873, 0xB9848485, 0x0004002B,\n    0x0000000D, 0x000004E9, 0xBA129293, 0x0004002B, 0x0000000D, 0x000007E1,\n    0xBAEDEDEE, 0x0004002B, 0x0000000D, 0x0000097F, 0x3AE1E1E2, 0x0004002B,\n    0x0000000D, 0x000001AE, 0xBA979798, 0x0004002B, 0x0000000D, 0x00000864,\n    0x3A42C2C3, 0x0004002B, 0x0000000D, 0x000008E0, 0x3ACDCDCE, 0x0004002B,\n    0x0000000D, 0x000005A3, 0xB8F0F0F1, 0x0004002B, 0x0000000D, 0x000006A4,\n    0xBA9F9FA0, 0x0004002B, 0x0000000D, 0x00000667, 0x3AEFEFF0, 0x0004002B,\n    0x0000000D, 0x00000961, 0x37C0C0C1, 0x0004002B, 0x0000000D, 0x000004C9,\n    0xBAFBFBFC, 0x0004002B, 0x0000000D, 0x00000ABC, 0x3AE3E3E4, 0x0004002B,\n    0x0000000D, 0x00000627, 0xBA3ABABB, 0x0004002B, 0x0000000D, 0x000007A3,\n    0x3ACBCBCC, 0x0004002B, 0x0000000D, 0x00000AF9, 0xBADFDFE0, 0x0004002B,\n    0x0000000D, 0x00000528, 0x3AA1A1A2, 0x0004002B, 0x0000000D, 0x00000B24,\n    0x3958D8D9, 0x0004002B, 0x0000000D, 0x0000020F, 0x3A89898A, 0x0004002B,\n    0x0000000D, 0x000008A1, 0xBA3EBEBF, 0x0004002B, 0x0000000D, 0x000004C8,\n    0xBAD5D5D6, 0x0004002B, 0x0000000D, 0x000004BD, 0xB9A4A4A5, 0x0004002B,\n    0x0000000D, 0x00000976, 0x39FCFCFD, 0x0004002B, 0x0000000D, 0x000006A5,\n    0xBAEBEBEC, 0x0004002B, 0x0000000D, 0x0000054D, 0x3A76F6F7, 0x0004002B,\n    0x0000000D, 0x000002E2, 0xB9B4B4B5, 0x0004002B, 0x0000000D, 0x000000F6,\n    0x3A36B6B7, 0x0004002B, 0x0000000D, 0x0000024C, 0xBA858586, 0x0004002B,\n    0x0000000D, 0x00000B97, 0xBACDCDCE, 0x0004002B, 0x0000000D, 0x00000055,\n    0xB7C0C0C1, 0x0004002B, 0x0000000D, 0x00000B96, 0xBAA7A7A8, 0x0004002B,\n    0x0000000D, 0x00000689, 0x3A52D2D3, 0x0004002B, 0x0000000D, 0x00000096,\n    0xBA6AEAEB, 0x0004002B, 0x0000000D, 0x00000072, 0xBABBBBBC, 0x0004002B,\n    0x0000000D, 0x000009A0, 0x3A1E9E9F, 0x0004002B, 0x0000000D, 0x0000014C,\n    0xB8B0B0B1, 0x0004002B, 0x0000000D, 0x00000059, 0x3A6EEEEF, 0x0004002B,\n    0x0000000D, 0x0000048C, 0x3B000000, 0x0004002B, 0x0000000D, 0x000009BB,\n    0xBAB7B7B8, 0x0004002B, 0x0000000D, 0x00000588, 0xBA26A6A7, 0x0004002B,\n    0x0000000D, 0x000003EC, 0x3AC5C5C6, 0x0004002B, 0x0000000D, 0x00000BBA,\n    0xBA56D6D7, 0x0004002B, 0x0000000D, 0x00000665, 0x3AA3A3A4, 0x0004002B,\n    0x0000000D, 0x000005BC, 0x39848485, 0x0004002B, 0x0000000D, 0x00000529,\n    0x3AC7C7C8, 0x0004002B, 0x0000000D, 0x00000840, 0x3A939394, 0x0004002B,\n    0x0000000D, 0x0000051F, 0x39BCBCBD, 0x0004002B, 0x0000000D, 0x000005FB,\n    0xB9CCCCCD, 0x0004002B, 0x0000000D, 0x000000D5, 0x3AF9F9FA, 0x0004002B,\n    0x0000000D, 0x000005C7, 0x3AB5B5B6, 0x0004002B, 0x0000000D, 0x000009BA,\n    0xBA919192, 0x0004002B, 0x0000000D, 0x000000D4, 0x3AD3D3D4, 0x0004002B,\n    0x0000000D, 0x000009DF, 0xBA66E6E7, 0x0004002B, 0x0000000D, 0x000006CD,\n    0x39189899, 0x0004002B, 0x0000000D, 0x00000489, 0x3A8D8D8E, 0x0004002B,\n    0x0000000D, 0x000007F0, 0xB860E0E1, 0x0004002B, 0x0000000D, 0x000003E1,\n    0x39949495, 0x0004002B, 0x0000000D, 0x000009BC, 0xBADDDDDE, 0x0004002B,\n    0x0000000D, 0x00000A59, 0xBAA5A5A6, 0x0004002B, 0x0000000D, 0x0000093E,\n    0xBA068687, 0x0004002B, 0x0000000D, 0x000007A9, 0xB928A8A9, 0x0004002B,\n    0x0000000D, 0x00000112, 0xBAF5F5F6, 0x0004002B, 0x0000000D, 0x00000271,\n    0xBA5ADADB, 0x0004002B, 0x0000000D, 0x000002D1, 0x3A26A6A7, 0x0004002B,\n    0x0000000D, 0x0000057C, 0x37008081, 0x0004002B, 0x0000000D, 0x0000038C,\n    0xBAF9F9FA, 0x0004002B, 0x0000000D, 0x0000003D, 0xB968E8E9, 0x0004002B,\n    0x0000000D, 0x00000A13, 0x39C4C4C5, 0x0004002B, 0x0000000D, 0x000001B0,\n    0xBAE3E3E4, 0x0004002B, 0x0000000D, 0x00000AEF, 0xB9D4D4D5, 0x0004002B,\n    0x0000000D, 0x000007DF, 0xBAA1A1A2, 0x0004002B, 0x0000000D, 0x00000842,\n    0x3ADFDFE0, 0x0004002B, 0x0000000D, 0x00000804, 0xBA76F6F7, 0x0004002B,\n    0x0000000D, 0x00000903, 0x3A56D6D7, 0x0004002B, 0x0000000D, 0x000007A4,\n    0x3AF1F1F2, 0x0004002B, 0x0000000D, 0x00000482, 0x39F4F4F5, 0x0103002C,\n    0x000003DD, 0x000008A4, 0x0000010F, 0x00000728, 0x00000705, 0x00000A5A,\n    0x000008DF, 0x00000094, 0x0000034C, 0x0000087E, 0x0000034D, 0x00000687,\n    0x000003EB, 0x0000024E, 0x00000726, 0x00000698, 0x00000703, 0x00000AF8,\n    0x00000ABB, 0x0000026F, 0x000008A8, 0x00000565, 0x0000065D, 0x000004C6,\n    0x00000057, 0x0000006A, 0x00000A1E, 0x0000087D, 0x00000959, 0x00000BB8,\n    0x0000097E, 0x00000606, 0x000003AD, 0x000000E2, 0x00000370, 0x0000024D,\n    0x000005C6, 0x00000B8C, 0x00000036, 0x0000087F, 0x00000172, 0x00000399,\n    0x0000040F, 0x0000091E, 0x000008D5, 0x000008DE, 0x000002EB, 0x00000317,\n    0x0000034E, 0x00000111, 0x0000002B, 0x000008E1, 0x0000042A, 0x00000765,\n    0x000009A2, 0x000004F2, 0x0000058A, 0x000007E0, 0x00000802, 0x00000A1C,\n    0x00000940, 0x000002EC, 0x000003ED, 0x000004EB, 0x00000234, 0x00000245,\n    0x00000603, 0x00000984, 0x0000076E, 0x00000841, 0x000009DD, 0x000003F3,\n    0x00000B5A, 0x00000B58, 0x00000838, 0x00000218, 0x00000A1D, 0x0000054B,\n    0x00000503, 0x00000169, 0x00000605, 0x0000048A, 0x000002D3, 0x00000A7C,\n    0x00000171, 0x000001AF, 0x000004AC, 0x0000024F, 0x00000ADE, 0x00000110,\n    0x00000212, 0x00000742, 0x00000389, 0x000006C4, 0x00000B98, 0x000002AE,\n    0x000009B1, 0x00000741, 0x00000211, 0x00000A5B, 0x000005EA, 0x00000310,\n    0x0000052A, 0x00000071, 0x00000107, 0x000006A2, 0x00000B1B, 0x00000034,\n    0x0000024B, 0x000002AF, 0x00000A41, 0x00000A7E, 0x0000034F, 0x00000901,\n    0x00000539, 0x0000091C, 0x000001A4, 0x00000666, 0x00000833, 0x00000206,\n    0x00000210, 0x000002ED, 0x0000040D, 0x00000428, 0x00000195, 0x000004C7,\n    0x00000AB0, 0x00000429, 0x00000B5F, 0x0000044C, 0x00000B59, 0x00000344,\n    0x000007C7, 0x00000739, 0x0000091D, 0x000000D2, 0x00000133, 0x000005C8,\n    0x00000A1B, 0x00000420, 0x000002B0, 0x00000A25, 0x0000030E, 0x0000048B,\n    0x00000B7D, 0x00000073, 0x00000740, 0x00000173, 0x000006C6, 0x00000567,\n    0x00000A3F, 0x00000B95, 0x0000038A, 0x000005CE, 0x000006A3, 0x000006FA,\n    0x00000743, 0x000007C5, 0x0000038B, 0x00000ABA, 0x00000B51, 0x00000914,\n    0x0000013C, 0x00000566, 0x0000097D, 0x00000A58, 0x00000B5B, 0x00000704,\n    0x00000232, 0x000002EE, 0x000007A2, 0x00000763, 0x00000135, 0x000000D3,\n    0x00000949, 0x000001D2, 0x00000604, 0x00000035, 0x000004AE, 0x000007D6,\n    0x00000B7B, 0x00000AF7, 0x00000873, 0x000004E9, 0x000007E1, 0x0000097F,\n    0x000001AE, 0x00000864, 0x000008E0, 0x000005A3, 0x000006A4, 0x00000667,\n    0x00000961, 0x000004C9, 0x00000ABC, 0x00000627, 0x000007A3, 0x00000AF9,\n    0x00000528, 0x00000B24, 0x0000020F, 0x000008A1, 0x000004C8, 0x000004BD,\n    0x00000976, 0x000006A5, 0x0000054D, 0x000002E2, 0x000000F6, 0x0000024C,\n    0x00000B97, 0x00000055, 0x00000B96, 0x00000689, 0x00000096, 0x00000072,\n    0x000009A0, 0x0000014C, 0x00000059, 0x0000048C, 0x000009BB, 0x00000588,\n    0x000003EC, 0x00000BBA, 0x00000665, 0x000005BC, 0x00000529, 0x00000840,\n    0x0000051F, 0x000005FB, 0x000000D5, 0x000005C7, 0x000009BA, 0x000000D4,\n    0x000009DF, 0x000006CD, 0x00000489, 0x000007F0, 0x000003E1, 0x000009BC,\n    0x00000A59, 0x0000093E, 0x000007A9, 0x00000112, 0x00000271, 0x000002D1,\n    0x0000057C, 0x0000038C, 0x0000003D, 0x00000A13, 0x000001B0, 0x00000AEF,\n    0x000007DF, 0x00000842, 0x00000804, 0x00000903, 0x000007A4, 0x00000482,\n    0x0004002B, 0x0000000B, 0x00000A3A, 0x00000010, 0x00040020, 0x0000065A,\n    0x00000007, 0x000003DD, 0x00040020, 0x0000029A, 0x00000001, 0x0000001D,\n    0x0004003B, 0x0000029A, 0x00000C93, 0x00000001, 0x00040017, 0x00000013,\n    0x0000000D, 0x00000002, 0x0004001E, 0x000003F2, 0x00000012, 0x0000000D,\n    0x00040020, 0x0000066F, 0x00000009, 0x000003F2, 0x0004003B, 0x0000066F,\n    0x00000CE9, 0x00000009, 0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000,\n    0x00040020, 0x0000028F, 0x00000009, 0x00000012, 0x0004002B, 0x0000000C,\n    0x00000A0E, 0x00000001, 0x00040020, 0x0000028B, 0x00000009, 0x0000000D,\n    0x00040020, 0x0000029B, 0x00000003, 0x0000001D, 0x0004003B, 0x0000029B,\n    0x00000CB5, 0x00000003, 0x0004002B, 0x0000000B, 0x000000B2, 0x7EF19FFF,\n    0x0004002B, 0x0000000D, 0x00000019, 0x40000000, 0x00090019, 0x00000097,\n    0x0000000D, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000001,\n    0x00000000, 0x00040020, 0x00000313, 0x00000000, 0x00000097, 0x0004003B,\n    0x00000313, 0x00000DF7, 0x00000000, 0x0004002B, 0x0000000C, 0x00000A08,\n    0xFFFFFFFF, 0x0005002C, 0x00000012, 0x0000070B, 0x00000A0B, 0x00000A08,\n    0x0005002C, 0x00000012, 0x0000070E, 0x00000A08, 0x00000A0B, 0x0005002C,\n    0x00000012, 0x00000720, 0x00000A0E, 0x00000A0B, 0x0005002C, 0x00000012,\n    0x00000723, 0x00000A0B, 0x00000A0E, 0x0004002B, 0x0000000D, 0x0000025D,\n    0xC0800000, 0x0004002B, 0x0000000D, 0x00000B69, 0x40800000, 0x0004002B,\n    0x0000000D, 0x0000045E, 0xBE400000, 0x0005002C, 0x00000011, 0x0000084A,\n    0x00000A37, 0x00000A37, 0x0006002C, 0x00000018, 0x00000A2C, 0x00000A0C,\n    0x00000A0C, 0x00000A0C, 0x0006002C, 0x00000018, 0x00000A16, 0x0000008A,\n    0x0000008A, 0x0000008A, 0x0004002B, 0x0000000D, 0x0000016E, 0x3E800000,\n    0x00030001, 0x0000001D, 0x00000002, 0x00050036, 0x00000008, 0x0000161F,\n    0x00000000, 0x00000502, 0x000200F8, 0x00006179, 0x0004003B, 0x0000065A,\n    0x000047EB, 0x00000007, 0x0004003D, 0x0000001D, 0x00005647, 0x00000C93,\n    0x0007004F, 0x00000013, 0x000019A2, 0x00005647, 0x00005647, 0x00000000,\n    0x00000001, 0x0004006E, 0x00000012, 0x000044F8, 0x000019A2, 0x00050041,\n    0x0000028F, 0x00004B4F, 0x00000CE9, 0x00000A0B, 0x0004003D, 0x00000012,\n    0x00005926, 0x00004B4F, 0x00050082, 0x00000012, 0x00005B10, 0x000044F8,\n    0x00005926, 0x0004007C, 0x00000011, 0x000026D2, 0x00005B10, 0x00050041,\n    0x0000028B, 0x00005205, 0x00000CE9, 0x00000A0E, 0x0004003D, 0x0000000D,\n    0x000056DD, 0x00005205, 0x0004007C, 0x0000000B, 0x00004046, 0x000056DD,\n    0x0004007C, 0x00000012, 0x00001B4E, 0x000026D2, 0x00050080, 0x00000012,\n    0x0000381D, 0x00001B4E, 0x0000070B, 0x0004003D, 0x00000097, 0x00005694,\n    0x00000DF7, 0x0007005F, 0x0000001D, 0x000022C3, 0x00005694, 0x0000381D,\n    0x00000002, 0x00000A0B, 0x00050051, 0x0000000D, 0x00004D11, 0x000022C3,\n    0x00000000, 0x00050051, 0x0000000D, 0x00001B12, 0x000022C3, 0x00000001,\n    0x00050051, 0x0000000D, 0x0000472C, 0x000022C3, 0x00000002, 0x00050080,\n    0x00000012, 0x00004F7D, 0x00001B4E, 0x0000070E, 0x0004003D, 0x00000097,\n    0x0000409D, 0x00000DF7, 0x0007005F, 0x0000001D, 0x000022C4, 0x0000409D,\n    0x00004F7D, 0x00000002, 0x00000A0B, 0x00050051, 0x0000000D, 0x00004D12,\n    0x000022C4, 0x00000000, 0x00050051, 0x0000000D, 0x00006098, 0x000022C4,\n    0x00000001, 0x00050051, 0x0000000D, 0x00002C7A, 0x000022C4, 0x00000002,\n    0x0004003D, 0x00000097, 0x00004092, 0x00000DF7, 0x0007005F, 0x0000001D,\n    0x00004AB1, 0x00004092, 0x00001B4E, 0x00000002, 0x00000A0B, 0x00050051,\n    0x0000000D, 0x00004D13, 0x00004AB1, 0x00000000, 0x00050051, 0x0000000D,\n    0x00001B13, 0x00004AB1, 0x00000001, 0x00050051, 0x0000000D, 0x0000472D,\n    0x00004AB1, 0x00000002, 0x00050080, 0x00000012, 0x00004F7E, 0x00001B4E,\n    0x00000720, 0x0004003D, 0x00000097, 0x0000409E, 0x00000DF7, 0x0007005F,\n    0x0000001D, 0x000022C5, 0x0000409E, 0x00004F7E, 0x00000002, 0x00000A0B,\n    0x00050051, 0x0000000D, 0x00004D14, 0x000022C5, 0x00000000, 0x00050051,\n    0x0000000D, 0x00001B14, 0x000022C5, 0x00000001, 0x00050051, 0x0000000D,\n    0x0000472E, 0x000022C5, 0x00000002, 0x00050080, 0x00000012, 0x00004F7F,\n    0x00001B4E, 0x00000723, 0x0004003D, 0x00000097, 0x0000409F, 0x00000DF7,\n    0x0007005F, 0x0000001D, 0x000022C6, 0x0000409F, 0x00004F7F, 0x00000002,\n    0x00000A0B, 0x00050051, 0x0000000D, 0x00004D15, 0x000022C6, 0x00000000,\n    0x00050051, 0x0000000D, 0x00005D1A, 0x000022C6, 0x00000001, 0x00050051,\n    0x0000000D, 0x00001B21, 0x000022C6, 0x00000002, 0x0007000C, 0x0000000D,\n    0x00003C0C, 0x00000001, 0x00000025, 0x00004D12, 0x00004D14, 0x0007000C,\n    0x0000000D, 0x0000623F, 0x00000001, 0x00000025, 0x00004D11, 0x00003C0C,\n    0x0007000C, 0x0000000D, 0x00003E4C, 0x00000001, 0x00000025, 0x0000623F,\n    0x00004D15, 0x0007000C, 0x0000000D, 0x00003E4D, 0x00000001, 0x00000025,\n    0x00006098, 0x00001B14, 0x0007000C, 0x0000000D, 0x00003E4E, 0x00000001,\n    0x00000025, 0x00001B12, 0x00003E4D, 0x0007000C, 0x0000000D, 0x00003E4F,\n    0x00000001, 0x00000025, 0x00003E4E, 0x00005D1A, 0x0007000C, 0x0000000D,\n    0x00003E50, 0x00000001, 0x00000025, 0x00002C7A, 0x0000472E, 0x0007000C,\n    0x0000000D, 0x00003E51, 0x00000001, 0x00000025, 0x0000472C, 0x00003E50,\n    0x0007000C, 0x0000000D, 0x00002A99, 0x00000001, 0x00000025, 0x00003E51,\n    0x00001B21, 0x0007000C, 0x0000000D, 0x00005EE8, 0x00000001, 0x00000028,\n    0x00004D12, 0x00004D14, 0x0007000C, 0x0000000D, 0x00004473, 0x00000001,\n    0x00000028, 0x00004D11, 0x00005EE8, 0x0007000C, 0x0000000D, 0x0000555B,\n    0x00000001, 0x00000028, 0x00004473, 0x00004D15, 0x0007000C, 0x0000000D,\n    0x0000555C, 0x00000001, 0x00000028, 0x00006098, 0x00001B14, 0x0007000C,\n    0x0000000D, 0x0000555D, 0x00000001, 0x00000028, 0x00001B12, 0x0000555C,\n    0x0007000C, 0x0000000D, 0x0000555E, 0x00000001, 0x00000028, 0x0000555D,\n    0x00005D1A, 0x0007000C, 0x0000000D, 0x0000555F, 0x00000001, 0x00000028,\n    0x00002C7A, 0x0000472E, 0x0007000C, 0x0000000D, 0x00005558, 0x00000001,\n    0x00000028, 0x0000472C, 0x0000555F, 0x0007000C, 0x0000000D, 0x0000279E,\n    0x00000001, 0x00000028, 0x00005558, 0x00001B21, 0x0007000C, 0x0000000D,\n    0x000060BA, 0x00000001, 0x00000025, 0x00003E4C, 0x00004D13, 0x00050088,\n    0x0000000D, 0x000055ED, 0x0000016E, 0x0000555B, 0x00050085, 0x0000000D,\n    0x00002889, 0x000060BA, 0x000055ED, 0x0007000C, 0x0000000D, 0x0000534F,\n    0x00000001, 0x00000025, 0x00003E4F, 0x00001B13, 0x00050088, 0x0000000D,\n    0x0000442E, 0x0000016E, 0x0000555E, 0x00050085, 0x0000000D, 0x0000288A,\n    0x0000534F, 0x0000442E, 0x0007000C, 0x0000000D, 0x00005350, 0x00000001,\n    0x00000025, 0x00002A99, 0x0000472D, 0x00050088, 0x0000000D, 0x00004431,\n    0x0000016E, 0x0000279E, 0x00050085, 0x0000000D, 0x00005EF3, 0x00005350,\n    0x00004431, 0x0007000C, 0x0000000D, 0x00004080, 0x00000001, 0x00000028,\n    0x0000555B, 0x00004D13, 0x00050083, 0x0000000D, 0x00005683, 0x0000008A,\n    0x00004080, 0x00050085, 0x0000000D, 0x000034E8, 0x00000B69, 0x00003E4C,\n    0x00050081, 0x0000000D, 0x00004B7B, 0x000034E8, 0x0000025D, 0x00050088,\n    0x0000000D, 0x00004E56, 0x0000008A, 0x00004B7B, 0x00050085, 0x0000000D,\n    0x00005182, 0x00005683, 0x00004E56, 0x0007000C, 0x0000000D, 0x00004081,\n    0x00000001, 0x00000028, 0x0000555E, 0x00001B13, 0x00050083, 0x0000000D,\n    0x00005684, 0x0000008A, 0x00004081, 0x00050085, 0x0000000D, 0x000034E9,\n    0x00000B69, 0x00003E4F, 0x00050081, 0x0000000D, 0x00004B7C, 0x000034E9,\n    0x0000025D, 0x00050088, 0x0000000D, 0x00004E57, 0x0000008A, 0x00004B7C,\n    0x00050085, 0x0000000D, 0x00005183, 0x00005684, 0x00004E57, 0x0007000C,\n    0x0000000D, 0x00004082, 0x00000001, 0x00000028, 0x0000279E, 0x0000472D,\n    0x00050083, 0x0000000D, 0x00005685, 0x0000008A, 0x00004082, 0x00050085,\n    0x0000000D, 0x000034EA, 0x00000B69, 0x00002A99, 0x00050081, 0x0000000D,\n    0x00004B7D, 0x000034EA, 0x0000025D, 0x00050088, 0x0000000D, 0x000056B7,\n    0x0000008A, 0x00004B7D, 0x00050085, 0x0000000D, 0x00003B46, 0x00005685,\n    0x000056B7, 0x0004007F, 0x0000000D, 0x00005754, 0x00002889, 0x0007000C,\n    0x0000000D, 0x00005C99, 0x00000001, 0x00000028, 0x00005754, 0x00005182,\n    0x0004007F, 0x0000000D, 0x00004019, 0x0000288A, 0x0007000C, 0x0000000D,\n    0x000023D9, 0x00000001, 0x00000028, 0x00004019, 0x00005183, 0x0004007F,\n    0x0000000D, 0x000037B8, 0x00005EF3, 0x0007000C, 0x0000000D, 0x00003168,\n    0x00000001, 0x00000028, 0x000037B8, 0x00003B46, 0x0007000C, 0x0000000D,\n    0x000049EB, 0x00000001, 0x00000028, 0x000023D9, 0x00003168, 0x0007000C,\n    0x0000000D, 0x00001E92, 0x00000001, 0x00000028, 0x00005C99, 0x000049EB,\n    0x0007000C, 0x0000000D, 0x00002934, 0x00000001, 0x00000025, 0x00001E92,\n    0x00000A0C, 0x0007000C, 0x0000000D, 0x0000229C, 0x00000001, 0x00000028,\n    0x0000045E, 0x00002934, 0x0004007C, 0x0000000D, 0x00005830, 0x00004046,\n    0x00050085, 0x0000000D, 0x000051B7, 0x0000229C, 0x00005830, 0x00050085,\n    0x0000000D, 0x00005B14, 0x00000B69, 0x000051B7, 0x00050081, 0x0000000D,\n    0x00004072, 0x00005B14, 0x0000008A, 0x0004007C, 0x0000000B, 0x00001997,\n    0x00004072, 0x00050082, 0x0000000B, 0x00001D8B, 0x000000B2, 0x00001997,\n    0x0004007C, 0x0000000D, 0x000024CB, 0x00001D8B, 0x0004007F, 0x0000000D,\n    0x000023AA, 0x000024CB, 0x00050085, 0x0000000D, 0x0000304F, 0x000023AA,\n    0x00004072, 0x00050081, 0x0000000D, 0x0000409C, 0x0000304F, 0x00000019,\n    0x00050085, 0x0000000D, 0x00002496, 0x000024CB, 0x0000409C, 0x00050081,\n    0x0000000D, 0x0000499D, 0x00004D11, 0x00004D12, 0x00050081, 0x0000000D,\n    0x00005A67, 0x0000499D, 0x00004D15, 0x00050081, 0x0000000D, 0x00001987,\n    0x00005A67, 0x00004D14, 0x00050085, 0x0000000D, 0x00003181, 0x000051B7,\n    0x00001987, 0x00050081, 0x0000000D, 0x000046E9, 0x00003181, 0x00004D13,\n    0x00050085, 0x0000000D, 0x00002497, 0x000046E9, 0x00002496, 0x00050081,\n    0x0000000D, 0x0000499E, 0x00001B12, 0x00006098, 0x00050081, 0x0000000D,\n    0x00005A68, 0x0000499E, 0x00005D1A, 0x00050081, 0x0000000D, 0x00001988,\n    0x00005A68, 0x00001B14, 0x00050085, 0x0000000D, 0x00003182, 0x000051B7,\n    0x00001988, 0x00050081, 0x0000000D, 0x000046EA, 0x00003182, 0x00001B13,\n    0x00050085, 0x0000000D, 0x00002498, 0x000046EA, 0x00002496, 0x00050081,\n    0x0000000D, 0x0000499F, 0x0000472C, 0x00002C7A, 0x00050081, 0x0000000D,\n    0x00005A69, 0x0000499F, 0x00001B21, 0x00050081, 0x0000000D, 0x00001989,\n    0x00005A69, 0x0000472E, 0x00050085, 0x0000000D, 0x00003183, 0x000051B7,\n    0x00001989, 0x00050081, 0x0000000D, 0x0000436C, 0x00003183, 0x0000472D,\n    0x00050085, 0x0000000D, 0x000040DC, 0x0000436C, 0x00002496, 0x00060052,\n    0x0000001D, 0x000029A7, 0x00002497, 0x00000002, 0x00000000, 0x00060052,\n    0x0000001D, 0x0000531A, 0x00002498, 0x000029A7, 0x00000001, 0x00060052,\n    0x0000001D, 0x00004817, 0x000040DC, 0x0000531A, 0x00000002, 0x0008004F,\n    0x00000018, 0x00004E40, 0x00004817, 0x00004817, 0x00000000, 0x00000001,\n    0x00000002, 0x000500C7, 0x00000011, 0x00003108, 0x000026D2, 0x0000084A,\n    0x00050051, 0x0000000B, 0x0000260D, 0x00003108, 0x00000001, 0x00050084,\n    0x0000000B, 0x000053FA, 0x0000260D, 0x00000A3A, 0x00050051, 0x0000000B,\n    0x00005B73, 0x00003108, 0x00000000, 0x00050080, 0x0000000B, 0x00003142,\n    0x000053FA, 0x00005B73, 0x0003003E, 0x000047EB, 0x000008A4, 0x00050041,\n    0x0000028A, 0x000026E6, 0x000047EB, 0x00003142, 0x0004003D, 0x0000000D,\n    0x00006234, 0x000026E6, 0x00060050, 0x00000018, 0x0000466C, 0x00006234,\n    0x00006234, 0x00006234, 0x00050081, 0x00000018, 0x000053D2, 0x00004E40,\n    0x0000466C, 0x0008000C, 0x00000018, 0x00004C45, 0x00000001, 0x0000002B,\n    0x000053D2, 0x00000A2C, 0x00000A16, 0x00050051, 0x0000000D, 0x00004189,\n    0x00004C45, 0x00000000, 0x00050051, 0x0000000D, 0x00004CFC, 0x00004C45,\n    0x00000001, 0x00050051, 0x0000000D, 0x00001D30, 0x00004C45, 0x00000002,\n    0x00070050, 0x0000001D, 0x00005788, 0x00004189, 0x00004CFC, 0x00001D30,\n    0x0000008A, 0x0003003E, 0x00000CB5, 0x00005788, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/ui/shaders/bytecode/vulkan_spirv/guest_output_ffx_fsr_rcas_ps.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 25152\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint Fragment %main \"main\" %gl_FragCoord %xe_fsr_rcas_color\n               OpExecutionMode %main OriginUpperLeft\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %gl_FragCoord \"gl_FragCoord\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_fsr_rcas_output_offset\"\n               OpMemberName %push_const_block_xe 1 \"xe_fsr_rcas_sharpness_post_setup\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %xe_fsr_rcas_color \"xe_fsr_rcas_color\"\n               OpName %xe_fsr_rcas_source \"xe_fsr_rcas_source\"\n               OpDecorate %gl_FragCoord BuiltIn FragCoord\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 16\n               OpMemberDecorate %push_const_block_xe 1 Offset 24\n               OpDecorate %xe_fsr_rcas_color Location 0\n               OpDecorate %xe_fsr_rcas_source Binding 0\n               OpDecorate %xe_fsr_rcas_source DescriptorSet 0\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n      %float = OpTypeFloat 32\n       %uint = OpTypeInt 32 0\n        %int = OpTypeInt 32 1\n      %v2int = OpTypeVector %int 2\n    %v4float = OpTypeVector %float 4\n     %v2uint = OpTypeVector %uint 2\n%_ptr_Input_v4float = OpTypePointer Input %v4float\n%gl_FragCoord = OpVariable %_ptr_Input_v4float Input\n    %v2float = OpTypeVector %float 2\n%push_const_block_xe = OpTypeStruct %v2int %float\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n      %int_0 = OpConstant %int 0\n%_ptr_PushConstant_v2int = OpTypePointer PushConstant %v2int\n      %int_1 = OpConstant %int 1\n%_ptr_PushConstant_float = OpTypePointer PushConstant %float\n    %float_1 = OpConstant %float 1\n%_ptr_Output_v4float = OpTypePointer Output %v4float\n%xe_fsr_rcas_color = OpVariable %_ptr_Output_v4float Output\n    %float_0 = OpConstant %float 0\n%uint_2129764351 = OpConstant %uint 2129764351\n    %float_2 = OpConstant %float 2\n        %150 = OpTypeImage %float 2D 0 0 0 1 Unknown\n%_ptr_UniformConstant_150 = OpTypePointer UniformConstant %150\n%xe_fsr_rcas_source = OpVariable %_ptr_UniformConstant_150 UniformConstant\n     %int_n1 = OpConstant %int -1\n       %1803 = OpConstantComposite %v2int %int_0 %int_n1\n       %1806 = OpConstantComposite %v2int %int_n1 %int_0\n       %1824 = OpConstantComposite %v2int %int_1 %int_0\n       %1827 = OpConstantComposite %v2int %int_0 %int_1\n   %float_n4 = OpConstant %float -4\n    %float_4 = OpConstant %float 4\n%float_n0_1875 = OpConstant %float -0.1875\n %float_0_25 = OpConstant %float 0.25\n       %main = OpFunction %void None %1282\n      %24949 = OpLabel\n      %18571 = OpLoad %v4float %gl_FragCoord\n      %14008 = OpVectorShuffle %v2float %18571 %18571 0 1\n      %17656 = OpConvertFToS %v2int %14008\n      %19279 = OpAccessChain %_ptr_PushConstant_v2int %push_consts_xe %int_0\n      %22822 = OpLoad %v2int %19279\n      %23312 = OpISub %v2int %17656 %22822\n       %9938 = OpBitcast %v2uint %23312\n      %20997 = OpAccessChain %_ptr_PushConstant_float %push_consts_xe %int_1\n      %22237 = OpLoad %float %20997\n      %16454 = OpBitcast %uint %22237\n       %6990 = OpBitcast %v2int %9938\n      %14365 = OpIAdd %v2int %6990 %1803\n      %22164 = OpLoad %150 %xe_fsr_rcas_source\n       %8899 = OpImageFetch %v4float %22164 %14365 Lod %int_0\n      %19729 = OpCompositeExtract %float %8899 0\n       %6930 = OpCompositeExtract %float %8899 1\n      %18220 = OpCompositeExtract %float %8899 2\n      %20349 = OpIAdd %v2int %6990 %1806\n      %16541 = OpLoad %150 %xe_fsr_rcas_source\n       %8900 = OpImageFetch %v4float %16541 %20349 Lod %int_0\n      %19730 = OpCompositeExtract %float %8900 0\n      %24728 = OpCompositeExtract %float %8900 1\n      %11386 = OpCompositeExtract %float %8900 2\n      %16530 = OpLoad %150 %xe_fsr_rcas_source\n      %19121 = OpImageFetch %v4float %16530 %6990 Lod %int_0\n      %19731 = OpCompositeExtract %float %19121 0\n       %6931 = OpCompositeExtract %float %19121 1\n      %18221 = OpCompositeExtract %float %19121 2\n      %20350 = OpIAdd %v2int %6990 %1824\n      %16542 = OpLoad %150 %xe_fsr_rcas_source\n       %8901 = OpImageFetch %v4float %16542 %20350 Lod %int_0\n      %19732 = OpCompositeExtract %float %8901 0\n       %6932 = OpCompositeExtract %float %8901 1\n      %18222 = OpCompositeExtract %float %8901 2\n      %20351 = OpIAdd %v2int %6990 %1827\n      %16543 = OpLoad %150 %xe_fsr_rcas_source\n       %8902 = OpImageFetch %v4float %16543 %20351 Lod %int_0\n      %19733 = OpCompositeExtract %float %8902 0\n      %23834 = OpCompositeExtract %float %8902 1\n       %6945 = OpCompositeExtract %float %8902 2\n      %15372 = OpExtInst %float %1 FMin %19730 %19732\n      %25151 = OpExtInst %float %1 FMin %19729 %15372\n      %15948 = OpExtInst %float %1 FMin %25151 %19733\n      %15949 = OpExtInst %float %1 FMin %24728 %6932\n      %15950 = OpExtInst %float %1 FMin %6930 %15949\n      %15951 = OpExtInst %float %1 FMin %15950 %23834\n      %15952 = OpExtInst %float %1 FMin %11386 %18222\n      %15953 = OpExtInst %float %1 FMin %18220 %15952\n      %10905 = OpExtInst %float %1 FMin %15953 %6945\n      %24296 = OpExtInst %float %1 FMax %19730 %19732\n      %17523 = OpExtInst %float %1 FMax %19729 %24296\n      %21851 = OpExtInst %float %1 FMax %17523 %19733\n      %21852 = OpExtInst %float %1 FMax %24728 %6932\n      %21853 = OpExtInst %float %1 FMax %6930 %21852\n      %21854 = OpExtInst %float %1 FMax %21853 %23834\n      %21855 = OpExtInst %float %1 FMax %11386 %18222\n      %21848 = OpExtInst %float %1 FMax %18220 %21855\n      %10142 = OpExtInst %float %1 FMax %21848 %6945\n      %24762 = OpExtInst %float %1 FMin %15948 %19731\n      %21997 = OpFDiv %float %float_0_25 %21851\n      %10377 = OpFMul %float %24762 %21997\n      %21327 = OpExtInst %float %1 FMin %15951 %6931\n      %17454 = OpFDiv %float %float_0_25 %21854\n      %10378 = OpFMul %float %21327 %17454\n      %21328 = OpExtInst %float %1 FMin %10905 %18221\n      %17457 = OpFDiv %float %float_0_25 %10142\n      %24307 = OpFMul %float %21328 %17457\n      %16512 = OpExtInst %float %1 FMax %21851 %19731\n      %22147 = OpFSub %float %float_1 %16512\n      %13544 = OpFMul %float %float_4 %15948\n      %19323 = OpFAdd %float %13544 %float_n4\n      %20054 = OpFDiv %float %float_1 %19323\n      %20866 = OpFMul %float %22147 %20054\n      %16513 = OpExtInst %float %1 FMax %21854 %6931\n      %22148 = OpFSub %float %float_1 %16513\n      %13545 = OpFMul %float %float_4 %15951\n      %19324 = OpFAdd %float %13545 %float_n4\n      %20055 = OpFDiv %float %float_1 %19324\n      %20867 = OpFMul %float %22148 %20055\n      %16514 = OpExtInst %float %1 FMax %10142 %18221\n      %22149 = OpFSub %float %float_1 %16514\n      %13546 = OpFMul %float %float_4 %10905\n      %19325 = OpFAdd %float %13546 %float_n4\n      %22199 = OpFDiv %float %float_1 %19325\n      %15174 = OpFMul %float %22149 %22199\n      %22356 = OpFNegate %float %10377\n      %23705 = OpExtInst %float %1 FMax %22356 %20866\n      %16409 = OpFNegate %float %10378\n       %9177 = OpExtInst %float %1 FMax %16409 %20867\n      %14264 = OpFNegate %float %24307\n      %12648 = OpExtInst %float %1 FMax %14264 %15174\n      %18923 = OpExtInst %float %1 FMax %9177 %12648\n       %7826 = OpExtInst %float %1 FMax %23705 %18923\n      %10548 = OpExtInst %float %1 FMin %7826 %float_0\n       %8860 = OpExtInst %float %1 FMax %float_n0_1875 %10548\n      %22576 = OpBitcast %float %16454\n      %20919 = OpFMul %float %8860 %22576\n      %23316 = OpFMul %float %float_4 %20919\n      %16498 = OpFAdd %float %23316 %float_1\n       %6551 = OpBitcast %uint %16498\n       %7563 = OpISub %uint %uint_2129764351 %6551\n       %9419 = OpBitcast %float %7563\n       %9130 = OpFNegate %float %9419\n      %12367 = OpFMul %float %9130 %16498\n      %16540 = OpFAdd %float %12367 %float_2\n       %9366 = OpFMul %float %9419 %16540\n      %18845 = OpFAdd %float %19729 %19730\n      %23143 = OpFAdd %float %18845 %19733\n       %6535 = OpFAdd %float %23143 %19732\n      %12673 = OpFMul %float %20919 %6535\n      %18153 = OpFAdd %float %12673 %19731\n       %9367 = OpFMul %float %18153 %9366\n      %18846 = OpFAdd %float %6930 %24728\n      %23144 = OpFAdd %float %18846 %23834\n       %6536 = OpFAdd %float %23144 %6932\n      %12674 = OpFMul %float %20919 %6536\n      %18154 = OpFAdd %float %12674 %6931\n       %9368 = OpFMul %float %18154 %9366\n      %18847 = OpFAdd %float %18220 %11386\n      %23145 = OpFAdd %float %18847 %6945\n       %6537 = OpFAdd %float %23145 %18222\n      %12675 = OpFMul %float %20919 %6537\n      %17222 = OpFAdd %float %12675 %18221\n      %16570 = OpFMul %float %17222 %9366\n      %14687 = OpCompositeConstruct %v4float %9367 %9368 %16570 %float_1\n               OpStore %xe_fsr_rcas_color %14687\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t guest_output_ffx_fsr_rcas_ps[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006240, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0007000F, 0x00000004,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000C93, 0x00000CB5, 0x00030010,\n    0x0000161F, 0x00000007, 0x00030003, 0x00000002, 0x000001CC, 0x00090004,\n    0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F, 0x5F776F6C, 0x72747461,\n    0x74756269, 0x00007365, 0x000B0004, 0x455F4C47, 0x735F5458, 0x6C706D61,\n    0x656C7265, 0x745F7373, 0x75747865, 0x665F6572, 0x74636E75, 0x736E6F69,\n    0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F, 0x70635F45, 0x74735F70,\n    0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365, 0x00006576, 0x00080004,\n    0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63, 0x69645F65, 0x74636572,\n    0x00657669, 0x00040005, 0x0000161F, 0x6E69616D, 0x00000000, 0x00060005,\n    0x00000C93, 0x465F6C67, 0x43676172, 0x64726F6F, 0x00000000, 0x00070005,\n    0x000003F2, 0x68737570, 0x6E6F635F, 0x625F7473, 0x6B636F6C, 0x0065785F,\n    0x000A0006, 0x000003F2, 0x00000000, 0x665F6578, 0x725F7273, 0x5F736163,\n    0x7074756F, 0x6F5F7475, 0x65736666, 0x00000074, 0x000C0006, 0x000003F2,\n    0x00000001, 0x665F6578, 0x725F7273, 0x5F736163, 0x72616873, 0x73656E70,\n    0x6F705F73, 0x735F7473, 0x70757465, 0x00000000, 0x00060005, 0x00000CE9,\n    0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578, 0x00070005, 0x00000CB5,\n    0x665F6578, 0x725F7273, 0x5F736163, 0x6F6C6F63, 0x00000072, 0x00070005,\n    0x00000DF7, 0x665F6578, 0x725F7273, 0x5F736163, 0x72756F73, 0x00006563,\n    0x00040047, 0x00000C93, 0x0000000B, 0x0000000F, 0x00030047, 0x000003F2,\n    0x00000002, 0x00050048, 0x000003F2, 0x00000000, 0x00000023, 0x00000010,\n    0x00050048, 0x000003F2, 0x00000001, 0x00000023, 0x00000018, 0x00040047,\n    0x00000CB5, 0x0000001E, 0x00000000, 0x00040047, 0x00000DF7, 0x00000021,\n    0x00000000, 0x00040047, 0x00000DF7, 0x00000022, 0x00000000, 0x00020013,\n    0x00000008, 0x00030021, 0x00000502, 0x00000008, 0x00030016, 0x0000000D,\n    0x00000020, 0x00040015, 0x0000000B, 0x00000020, 0x00000000, 0x00040015,\n    0x0000000C, 0x00000020, 0x00000001, 0x00040017, 0x00000012, 0x0000000C,\n    0x00000002, 0x00040017, 0x0000001D, 0x0000000D, 0x00000004, 0x00040017,\n    0x00000011, 0x0000000B, 0x00000002, 0x00040020, 0x0000029A, 0x00000001,\n    0x0000001D, 0x0004003B, 0x0000029A, 0x00000C93, 0x00000001, 0x00040017,\n    0x00000013, 0x0000000D, 0x00000002, 0x0004001E, 0x000003F2, 0x00000012,\n    0x0000000D, 0x00040020, 0x0000066F, 0x00000009, 0x000003F2, 0x0004003B,\n    0x0000066F, 0x00000CE9, 0x00000009, 0x0004002B, 0x0000000C, 0x00000A0B,\n    0x00000000, 0x00040020, 0x0000028F, 0x00000009, 0x00000012, 0x0004002B,\n    0x0000000C, 0x00000A0E, 0x00000001, 0x00040020, 0x0000028A, 0x00000009,\n    0x0000000D, 0x0004002B, 0x0000000D, 0x0000008A, 0x3F800000, 0x00040020,\n    0x0000029B, 0x00000003, 0x0000001D, 0x0004003B, 0x0000029B, 0x00000CB5,\n    0x00000003, 0x0004002B, 0x0000000D, 0x00000A0C, 0x00000000, 0x0004002B,\n    0x0000000B, 0x000000B2, 0x7EF19FFF, 0x0004002B, 0x0000000D, 0x00000018,\n    0x40000000, 0x00090019, 0x00000096, 0x0000000D, 0x00000001, 0x00000000,\n    0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x00040020, 0x00000313,\n    0x00000000, 0x00000096, 0x0004003B, 0x00000313, 0x00000DF7, 0x00000000,\n    0x0004002B, 0x0000000C, 0x00000A08, 0xFFFFFFFF, 0x0005002C, 0x00000012,\n    0x0000070B, 0x00000A0B, 0x00000A08, 0x0005002C, 0x00000012, 0x0000070E,\n    0x00000A08, 0x00000A0B, 0x0005002C, 0x00000012, 0x00000720, 0x00000A0E,\n    0x00000A0B, 0x0005002C, 0x00000012, 0x00000723, 0x00000A0B, 0x00000A0E,\n    0x0004002B, 0x0000000D, 0x0000025D, 0xC0800000, 0x0004002B, 0x0000000D,\n    0x00000B69, 0x40800000, 0x0004002B, 0x0000000D, 0x0000045E, 0xBE400000,\n    0x0004002B, 0x0000000D, 0x0000016E, 0x3E800000, 0x00050036, 0x00000008,\n    0x0000161F, 0x00000000, 0x00000502, 0x000200F8, 0x00006175, 0x0004003D,\n    0x0000001D, 0x0000488B, 0x00000C93, 0x0007004F, 0x00000013, 0x000036B8,\n    0x0000488B, 0x0000488B, 0x00000000, 0x00000001, 0x0004006E, 0x00000012,\n    0x000044F8, 0x000036B8, 0x00050041, 0x0000028F, 0x00004B4F, 0x00000CE9,\n    0x00000A0B, 0x0004003D, 0x00000012, 0x00005926, 0x00004B4F, 0x00050082,\n    0x00000012, 0x00005B10, 0x000044F8, 0x00005926, 0x0004007C, 0x00000011,\n    0x000026D2, 0x00005B10, 0x00050041, 0x0000028A, 0x00005205, 0x00000CE9,\n    0x00000A0E, 0x0004003D, 0x0000000D, 0x000056DD, 0x00005205, 0x0004007C,\n    0x0000000B, 0x00004046, 0x000056DD, 0x0004007C, 0x00000012, 0x00001B4E,\n    0x000026D2, 0x00050080, 0x00000012, 0x0000381D, 0x00001B4E, 0x0000070B,\n    0x0004003D, 0x00000096, 0x00005694, 0x00000DF7, 0x0007005F, 0x0000001D,\n    0x000022C3, 0x00005694, 0x0000381D, 0x00000002, 0x00000A0B, 0x00050051,\n    0x0000000D, 0x00004D11, 0x000022C3, 0x00000000, 0x00050051, 0x0000000D,\n    0x00001B12, 0x000022C3, 0x00000001, 0x00050051, 0x0000000D, 0x0000472C,\n    0x000022C3, 0x00000002, 0x00050080, 0x00000012, 0x00004F7D, 0x00001B4E,\n    0x0000070E, 0x0004003D, 0x00000096, 0x0000409D, 0x00000DF7, 0x0007005F,\n    0x0000001D, 0x000022C4, 0x0000409D, 0x00004F7D, 0x00000002, 0x00000A0B,\n    0x00050051, 0x0000000D, 0x00004D12, 0x000022C4, 0x00000000, 0x00050051,\n    0x0000000D, 0x00006098, 0x000022C4, 0x00000001, 0x00050051, 0x0000000D,\n    0x00002C7A, 0x000022C4, 0x00000002, 0x0004003D, 0x00000096, 0x00004092,\n    0x00000DF7, 0x0007005F, 0x0000001D, 0x00004AB1, 0x00004092, 0x00001B4E,\n    0x00000002, 0x00000A0B, 0x00050051, 0x0000000D, 0x00004D13, 0x00004AB1,\n    0x00000000, 0x00050051, 0x0000000D, 0x00001B13, 0x00004AB1, 0x00000001,\n    0x00050051, 0x0000000D, 0x0000472D, 0x00004AB1, 0x00000002, 0x00050080,\n    0x00000012, 0x00004F7E, 0x00001B4E, 0x00000720, 0x0004003D, 0x00000096,\n    0x0000409E, 0x00000DF7, 0x0007005F, 0x0000001D, 0x000022C5, 0x0000409E,\n    0x00004F7E, 0x00000002, 0x00000A0B, 0x00050051, 0x0000000D, 0x00004D14,\n    0x000022C5, 0x00000000, 0x00050051, 0x0000000D, 0x00001B14, 0x000022C5,\n    0x00000001, 0x00050051, 0x0000000D, 0x0000472E, 0x000022C5, 0x00000002,\n    0x00050080, 0x00000012, 0x00004F7F, 0x00001B4E, 0x00000723, 0x0004003D,\n    0x00000096, 0x0000409F, 0x00000DF7, 0x0007005F, 0x0000001D, 0x000022C6,\n    0x0000409F, 0x00004F7F, 0x00000002, 0x00000A0B, 0x00050051, 0x0000000D,\n    0x00004D15, 0x000022C6, 0x00000000, 0x00050051, 0x0000000D, 0x00005D1A,\n    0x000022C6, 0x00000001, 0x00050051, 0x0000000D, 0x00001B21, 0x000022C6,\n    0x00000002, 0x0007000C, 0x0000000D, 0x00003C0C, 0x00000001, 0x00000025,\n    0x00004D12, 0x00004D14, 0x0007000C, 0x0000000D, 0x0000623F, 0x00000001,\n    0x00000025, 0x00004D11, 0x00003C0C, 0x0007000C, 0x0000000D, 0x00003E4C,\n    0x00000001, 0x00000025, 0x0000623F, 0x00004D15, 0x0007000C, 0x0000000D,\n    0x00003E4D, 0x00000001, 0x00000025, 0x00006098, 0x00001B14, 0x0007000C,\n    0x0000000D, 0x00003E4E, 0x00000001, 0x00000025, 0x00001B12, 0x00003E4D,\n    0x0007000C, 0x0000000D, 0x00003E4F, 0x00000001, 0x00000025, 0x00003E4E,\n    0x00005D1A, 0x0007000C, 0x0000000D, 0x00003E50, 0x00000001, 0x00000025,\n    0x00002C7A, 0x0000472E, 0x0007000C, 0x0000000D, 0x00003E51, 0x00000001,\n    0x00000025, 0x0000472C, 0x00003E50, 0x0007000C, 0x0000000D, 0x00002A99,\n    0x00000001, 0x00000025, 0x00003E51, 0x00001B21, 0x0007000C, 0x0000000D,\n    0x00005EE8, 0x00000001, 0x00000028, 0x00004D12, 0x00004D14, 0x0007000C,\n    0x0000000D, 0x00004473, 0x00000001, 0x00000028, 0x00004D11, 0x00005EE8,\n    0x0007000C, 0x0000000D, 0x0000555B, 0x00000001, 0x00000028, 0x00004473,\n    0x00004D15, 0x0007000C, 0x0000000D, 0x0000555C, 0x00000001, 0x00000028,\n    0x00006098, 0x00001B14, 0x0007000C, 0x0000000D, 0x0000555D, 0x00000001,\n    0x00000028, 0x00001B12, 0x0000555C, 0x0007000C, 0x0000000D, 0x0000555E,\n    0x00000001, 0x00000028, 0x0000555D, 0x00005D1A, 0x0007000C, 0x0000000D,\n    0x0000555F, 0x00000001, 0x00000028, 0x00002C7A, 0x0000472E, 0x0007000C,\n    0x0000000D, 0x00005558, 0x00000001, 0x00000028, 0x0000472C, 0x0000555F,\n    0x0007000C, 0x0000000D, 0x0000279E, 0x00000001, 0x00000028, 0x00005558,\n    0x00001B21, 0x0007000C, 0x0000000D, 0x000060BA, 0x00000001, 0x00000025,\n    0x00003E4C, 0x00004D13, 0x00050088, 0x0000000D, 0x000055ED, 0x0000016E,\n    0x0000555B, 0x00050085, 0x0000000D, 0x00002889, 0x000060BA, 0x000055ED,\n    0x0007000C, 0x0000000D, 0x0000534F, 0x00000001, 0x00000025, 0x00003E4F,\n    0x00001B13, 0x00050088, 0x0000000D, 0x0000442E, 0x0000016E, 0x0000555E,\n    0x00050085, 0x0000000D, 0x0000288A, 0x0000534F, 0x0000442E, 0x0007000C,\n    0x0000000D, 0x00005350, 0x00000001, 0x00000025, 0x00002A99, 0x0000472D,\n    0x00050088, 0x0000000D, 0x00004431, 0x0000016E, 0x0000279E, 0x00050085,\n    0x0000000D, 0x00005EF3, 0x00005350, 0x00004431, 0x0007000C, 0x0000000D,\n    0x00004080, 0x00000001, 0x00000028, 0x0000555B, 0x00004D13, 0x00050083,\n    0x0000000D, 0x00005683, 0x0000008A, 0x00004080, 0x00050085, 0x0000000D,\n    0x000034E8, 0x00000B69, 0x00003E4C, 0x00050081, 0x0000000D, 0x00004B7B,\n    0x000034E8, 0x0000025D, 0x00050088, 0x0000000D, 0x00004E56, 0x0000008A,\n    0x00004B7B, 0x00050085, 0x0000000D, 0x00005182, 0x00005683, 0x00004E56,\n    0x0007000C, 0x0000000D, 0x00004081, 0x00000001, 0x00000028, 0x0000555E,\n    0x00001B13, 0x00050083, 0x0000000D, 0x00005684, 0x0000008A, 0x00004081,\n    0x00050085, 0x0000000D, 0x000034E9, 0x00000B69, 0x00003E4F, 0x00050081,\n    0x0000000D, 0x00004B7C, 0x000034E9, 0x0000025D, 0x00050088, 0x0000000D,\n    0x00004E57, 0x0000008A, 0x00004B7C, 0x00050085, 0x0000000D, 0x00005183,\n    0x00005684, 0x00004E57, 0x0007000C, 0x0000000D, 0x00004082, 0x00000001,\n    0x00000028, 0x0000279E, 0x0000472D, 0x00050083, 0x0000000D, 0x00005685,\n    0x0000008A, 0x00004082, 0x00050085, 0x0000000D, 0x000034EA, 0x00000B69,\n    0x00002A99, 0x00050081, 0x0000000D, 0x00004B7D, 0x000034EA, 0x0000025D,\n    0x00050088, 0x0000000D, 0x000056B7, 0x0000008A, 0x00004B7D, 0x00050085,\n    0x0000000D, 0x00003B46, 0x00005685, 0x000056B7, 0x0004007F, 0x0000000D,\n    0x00005754, 0x00002889, 0x0007000C, 0x0000000D, 0x00005C99, 0x00000001,\n    0x00000028, 0x00005754, 0x00005182, 0x0004007F, 0x0000000D, 0x00004019,\n    0x0000288A, 0x0007000C, 0x0000000D, 0x000023D9, 0x00000001, 0x00000028,\n    0x00004019, 0x00005183, 0x0004007F, 0x0000000D, 0x000037B8, 0x00005EF3,\n    0x0007000C, 0x0000000D, 0x00003168, 0x00000001, 0x00000028, 0x000037B8,\n    0x00003B46, 0x0007000C, 0x0000000D, 0x000049EB, 0x00000001, 0x00000028,\n    0x000023D9, 0x00003168, 0x0007000C, 0x0000000D, 0x00001E92, 0x00000001,\n    0x00000028, 0x00005C99, 0x000049EB, 0x0007000C, 0x0000000D, 0x00002934,\n    0x00000001, 0x00000025, 0x00001E92, 0x00000A0C, 0x0007000C, 0x0000000D,\n    0x0000229C, 0x00000001, 0x00000028, 0x0000045E, 0x00002934, 0x0004007C,\n    0x0000000D, 0x00005830, 0x00004046, 0x00050085, 0x0000000D, 0x000051B7,\n    0x0000229C, 0x00005830, 0x00050085, 0x0000000D, 0x00005B14, 0x00000B69,\n    0x000051B7, 0x00050081, 0x0000000D, 0x00004072, 0x00005B14, 0x0000008A,\n    0x0004007C, 0x0000000B, 0x00001997, 0x00004072, 0x00050082, 0x0000000B,\n    0x00001D8B, 0x000000B2, 0x00001997, 0x0004007C, 0x0000000D, 0x000024CB,\n    0x00001D8B, 0x0004007F, 0x0000000D, 0x000023AA, 0x000024CB, 0x00050085,\n    0x0000000D, 0x0000304F, 0x000023AA, 0x00004072, 0x00050081, 0x0000000D,\n    0x0000409C, 0x0000304F, 0x00000018, 0x00050085, 0x0000000D, 0x00002496,\n    0x000024CB, 0x0000409C, 0x00050081, 0x0000000D, 0x0000499D, 0x00004D11,\n    0x00004D12, 0x00050081, 0x0000000D, 0x00005A67, 0x0000499D, 0x00004D15,\n    0x00050081, 0x0000000D, 0x00001987, 0x00005A67, 0x00004D14, 0x00050085,\n    0x0000000D, 0x00003181, 0x000051B7, 0x00001987, 0x00050081, 0x0000000D,\n    0x000046E9, 0x00003181, 0x00004D13, 0x00050085, 0x0000000D, 0x00002497,\n    0x000046E9, 0x00002496, 0x00050081, 0x0000000D, 0x0000499E, 0x00001B12,\n    0x00006098, 0x00050081, 0x0000000D, 0x00005A68, 0x0000499E, 0x00005D1A,\n    0x00050081, 0x0000000D, 0x00001988, 0x00005A68, 0x00001B14, 0x00050085,\n    0x0000000D, 0x00003182, 0x000051B7, 0x00001988, 0x00050081, 0x0000000D,\n    0x000046EA, 0x00003182, 0x00001B13, 0x00050085, 0x0000000D, 0x00002498,\n    0x000046EA, 0x00002496, 0x00050081, 0x0000000D, 0x0000499F, 0x0000472C,\n    0x00002C7A, 0x00050081, 0x0000000D, 0x00005A69, 0x0000499F, 0x00001B21,\n    0x00050081, 0x0000000D, 0x00001989, 0x00005A69, 0x0000472E, 0x00050085,\n    0x0000000D, 0x00003183, 0x000051B7, 0x00001989, 0x00050081, 0x0000000D,\n    0x00004346, 0x00003183, 0x0000472D, 0x00050085, 0x0000000D, 0x000040BA,\n    0x00004346, 0x00002496, 0x00070050, 0x0000001D, 0x0000395F, 0x00002497,\n    0x00002498, 0x000040BA, 0x0000008A, 0x0003003E, 0x00000CB5, 0x0000395F,\n    0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/ui/shaders/bytecode/vulkan_spirv/guest_output_triangle_strip_rect_vs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 24012\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint Vertex %main \"main\" %_ %gl_VertexIndex\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %gl_PerVertex \"gl_PerVertex\"\n               OpMemberName %gl_PerVertex 0 \"gl_Position\"\n               OpMemberName %gl_PerVertex 1 \"gl_PointSize\"\n               OpMemberName %gl_PerVertex 2 \"gl_ClipDistance\"\n               OpMemberName %gl_PerVertex 3 \"gl_CullDistance\"\n               OpName %_ \"\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_triangle_strip_rect_offset\"\n               OpMemberName %push_const_block_xe 1 \"xe_triangle_strip_rect_size\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpName %gl_VertexIndex \"gl_VertexIndex\"\n               OpDecorate %gl_PerVertex Block\n               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position\n               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize\n               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance\n               OpMemberDecorate %gl_PerVertex 3 BuiltIn CullDistance\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n               OpMemberDecorate %push_const_block_xe 1 Offset 8\n               OpDecorate %gl_VertexIndex BuiltIn VertexIndex\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n       %uint = OpTypeInt 32 0\n     %v2uint = OpTypeVector %uint 2\n      %float = OpTypeFloat 32\n    %v4float = OpTypeVector %float 4\n     %uint_1 = OpConstant %uint 1\n%_arr_float_uint_1 = OpTypeArray %float %uint_1\n%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1 %_arr_float_uint_1\n%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex\n          %_ = OpVariable %_ptr_Output_gl_PerVertex Output\n        %int = OpTypeInt 32 1\n      %int_0 = OpConstant %int 0\n    %v2float = OpTypeVector %float 2\n%push_const_block_xe = OpTypeStruct %v2float %v2float\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_v2float = OpTypePointer PushConstant %v2float\n%_ptr_Input_int = OpTypePointer Input %int\n%gl_VertexIndex = OpVariable %_ptr_Input_int Input\n     %uint_0 = OpConstant %uint 0\n       %1819 = OpConstantComposite %v2uint %uint_0 %uint_1\n      %int_1 = OpConstant %int 1\n    %float_0 = OpConstant %float 0\n    %float_1 = OpConstant %float 1\n%_ptr_Output_v4float = OpTypePointer Output %v4float\n       %1828 = OpConstantComposite %v2uint %uint_1 %uint_1\n       %main = OpFunction %void None %1282\n      %23915 = OpLabel\n       %7053 = OpAccessChain %_ptr_PushConstant_v2float %push_consts_xe %int_0\n      %17516 = OpLoad %v2float %7053\n      %23241 = OpLoad %int %gl_VertexIndex\n       %9480 = OpBitcast %uint %23241\n      %15408 = OpCompositeConstruct %v2uint %9480 %9480\n      %14991 = OpShiftRightLogical %v2uint %15408 %1819\n      %17567 = OpBitwiseAnd %v2uint %14991 %1828\n       %7856 = OpConvertUToF %v2float %17567\n      %12606 = OpAccessChain %_ptr_PushConstant_v2float %push_consts_xe %int_1\n      %24011 = OpLoad %v2float %12606\n      %17243 = OpFMul %v2float %7856 %24011\n      %16594 = OpFAdd %v2float %17516 %17243\n      %10599 = OpCompositeExtract %float %16594 0\n      %13956 = OpCompositeExtract %float %16594 1\n      %18260 = OpCompositeConstruct %v4float %10599 %13956 %float_0 %float_1\n      %12055 = OpAccessChain %_ptr_Output_v4float %_ %int_0\n               OpStore %12055 %18260\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t guest_output_triangle_strip_rect_vs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00005DCC, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0007000F, 0x00000000,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00001342, 0x00001029, 0x00030003,\n    0x00000002, 0x000001CC, 0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F,\n    0x665F6C6F, 0x5F776F6C, 0x72747461, 0x74756269, 0x00007365, 0x000B0004,\n    0x455F4C47, 0x735F5458, 0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865,\n    0x665F6572, 0x74636E75, 0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47,\n    0x4C474F4F, 0x70635F45, 0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F,\n    0x69746365, 0x00006576, 0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45,\n    0x64756C63, 0x69645F65, 0x74636572, 0x00657669, 0x00040005, 0x0000161F,\n    0x6E69616D, 0x00000000, 0x00060005, 0x00000176, 0x505F6C67, 0x65567265,\n    0x78657472, 0x00000000, 0x00060006, 0x00000176, 0x00000000, 0x505F6C67,\n    0x7469736F, 0x006E6F69, 0x00070006, 0x00000176, 0x00000001, 0x505F6C67,\n    0x746E696F, 0x657A6953, 0x00000000, 0x00070006, 0x00000176, 0x00000002,\n    0x435F6C67, 0x4470696C, 0x61747369, 0x0065636E, 0x00070006, 0x00000176,\n    0x00000003, 0x435F6C67, 0x446C6C75, 0x61747369, 0x0065636E, 0x00030005,\n    0x00001342, 0x00000000, 0x00070005, 0x00000406, 0x68737570, 0x6E6F635F,\n    0x625F7473, 0x6B636F6C, 0x0065785F, 0x000B0006, 0x00000406, 0x00000000,\n    0x745F6578, 0x6E616972, 0x5F656C67, 0x69727473, 0x65725F70, 0x6F5F7463,\n    0x65736666, 0x00000074, 0x000A0006, 0x00000406, 0x00000001, 0x745F6578,\n    0x6E616972, 0x5F656C67, 0x69727473, 0x65725F70, 0x735F7463, 0x00657A69,\n    0x00060005, 0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578,\n    0x00060005, 0x00001029, 0x565F6C67, 0x65747265, 0x646E4978, 0x00007865,\n    0x00030047, 0x00000176, 0x00000002, 0x00050048, 0x00000176, 0x00000000,\n    0x0000000B, 0x00000000, 0x00050048, 0x00000176, 0x00000001, 0x0000000B,\n    0x00000001, 0x00050048, 0x00000176, 0x00000002, 0x0000000B, 0x00000003,\n    0x00050048, 0x00000176, 0x00000003, 0x0000000B, 0x00000004, 0x00030047,\n    0x00000406, 0x00000002, 0x00050048, 0x00000406, 0x00000000, 0x00000023,\n    0x00000000, 0x00050048, 0x00000406, 0x00000001, 0x00000023, 0x00000008,\n    0x00040047, 0x00001029, 0x0000000B, 0x0000002A, 0x00020013, 0x00000008,\n    0x00030021, 0x00000502, 0x00000008, 0x00040015, 0x0000000B, 0x00000020,\n    0x00000000, 0x00040017, 0x00000011, 0x0000000B, 0x00000002, 0x00030016,\n    0x0000000D, 0x00000020, 0x00040017, 0x0000001D, 0x0000000D, 0x00000004,\n    0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001, 0x0004001C, 0x0000025C,\n    0x0000000D, 0x00000A0D, 0x0006001E, 0x00000176, 0x0000001D, 0x0000000D,\n    0x0000025C, 0x0000025C, 0x00040020, 0x000003F3, 0x00000003, 0x00000176,\n    0x0004003B, 0x000003F3, 0x00001342, 0x00000003, 0x00040015, 0x0000000C,\n    0x00000020, 0x00000001, 0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000,\n    0x00040017, 0x00000013, 0x0000000D, 0x00000002, 0x0004001E, 0x00000406,\n    0x00000013, 0x00000013, 0x00040020, 0x00000683, 0x00000009, 0x00000406,\n    0x0004003B, 0x00000683, 0x00000CE9, 0x00000009, 0x00040020, 0x00000290,\n    0x00000009, 0x00000013, 0x00040020, 0x00000289, 0x00000001, 0x0000000C,\n    0x0004003B, 0x00000289, 0x00001029, 0x00000001, 0x0004002B, 0x0000000B,\n    0x00000A0A, 0x00000000, 0x0005002C, 0x00000011, 0x0000071B, 0x00000A0A,\n    0x00000A0D, 0x0004002B, 0x0000000C, 0x00000A0E, 0x00000001, 0x0004002B,\n    0x0000000D, 0x00000A0C, 0x00000000, 0x0004002B, 0x0000000D, 0x0000008A,\n    0x3F800000, 0x00040020, 0x0000029A, 0x00000003, 0x0000001D, 0x0005002C,\n    0x00000011, 0x00000724, 0x00000A0D, 0x00000A0D, 0x00050036, 0x00000008,\n    0x0000161F, 0x00000000, 0x00000502, 0x000200F8, 0x00005D6B, 0x00050041,\n    0x00000290, 0x00001B8D, 0x00000CE9, 0x00000A0B, 0x0004003D, 0x00000013,\n    0x0000446C, 0x00001B8D, 0x0004003D, 0x0000000C, 0x00005AC9, 0x00001029,\n    0x0004007C, 0x0000000B, 0x00002508, 0x00005AC9, 0x00050050, 0x00000011,\n    0x00003C30, 0x00002508, 0x00002508, 0x000500C2, 0x00000011, 0x00003A8F,\n    0x00003C30, 0x0000071B, 0x000500C7, 0x00000011, 0x0000449F, 0x00003A8F,\n    0x00000724, 0x00040070, 0x00000013, 0x00001EB0, 0x0000449F, 0x00050041,\n    0x00000290, 0x0000313E, 0x00000CE9, 0x00000A0E, 0x0004003D, 0x00000013,\n    0x00005DCB, 0x0000313E, 0x00050085, 0x00000013, 0x0000435B, 0x00001EB0,\n    0x00005DCB, 0x00050081, 0x00000013, 0x000040D2, 0x0000446C, 0x0000435B,\n    0x00050051, 0x0000000D, 0x00002967, 0x000040D2, 0x00000000, 0x00050051,\n    0x0000000D, 0x00003684, 0x000040D2, 0x00000001, 0x00070050, 0x0000001D,\n    0x00004754, 0x00002967, 0x00003684, 0x00000A0C, 0x0000008A, 0x00050041,\n    0x0000029A, 0x00002F17, 0x00001342, 0x00000A0B, 0x0003003E, 0x00002F17,\n    0x00004754, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/ui/shaders/bytecode/vulkan_spirv/immediate_ps.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 24608\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint Fragment %main \"main\" %xe_out_color %xe_in_color %xe_in_texcoord\n               OpExecutionMode %main OriginUpperLeft\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %xe_out_color \"xe_out_color\"\n               OpName %xe_in_color \"xe_in_color\"\n               OpName %xe_immediate_texture \"xe_immediate_texture\"\n               OpName %xe_in_texcoord \"xe_in_texcoord\"\n               OpDecorate %xe_out_color Location 0\n               OpDecorate %xe_in_color Location 1\n               OpDecorate %xe_immediate_texture Binding 0\n               OpDecorate %xe_immediate_texture DescriptorSet 0\n               OpDecorate %xe_in_texcoord Location 0\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n      %float = OpTypeFloat 32\n    %v4float = OpTypeVector %float 4\n%_ptr_Output_v4float = OpTypePointer Output %v4float\n%xe_out_color = OpVariable %_ptr_Output_v4float Output\n%_ptr_Input_v4float = OpTypePointer Input %v4float\n%xe_in_color = OpVariable %_ptr_Input_v4float Input\n        %150 = OpTypeImage %float 2D 0 0 0 1 Unknown\n        %510 = OpTypeSampledImage %150\n%_ptr_UniformConstant_510 = OpTypePointer UniformConstant %510\n%xe_immediate_texture = OpVariable %_ptr_UniformConstant_510 UniformConstant\n    %v2float = OpTypeVector %float 2\n%_ptr_Input_v2float = OpTypePointer Input %v2float\n%xe_in_texcoord = OpVariable %_ptr_Input_v2float Input\n    %float_0 = OpConstant %float 0\n       %main = OpFunction %void None %1282\n      %24607 = OpLabel\n      %20754 = OpLoad %v4float %xe_in_color\n      %24285 = OpLoad %510 %xe_immediate_texture\n       %8179 = OpLoad %v2float %xe_in_texcoord\n       %6686 = OpImageSampleExplicitLod %v4float %24285 %8179 Lod %float_0\n       %8939 = OpFMul %v4float %20754 %6686\n               OpStore %xe_out_color %8939\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t immediate_ps[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006020, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x0008000F, 0x00000004,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x00000C08, 0x0000171A, 0x00001255,\n    0x00030010, 0x0000161F, 0x00000007, 0x00030003, 0x00000002, 0x000001CC,\n    0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F, 0x5F776F6C,\n    0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47, 0x735F5458,\n    0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572, 0x74636E75,\n    0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F, 0x70635F45,\n    0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365, 0x00006576,\n    0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63, 0x69645F65,\n    0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D, 0x00000000,\n    0x00060005, 0x00000C08, 0x6F5F6578, 0x635F7475, 0x726F6C6F, 0x00000000,\n    0x00050005, 0x0000171A, 0x695F6578, 0x6F635F6E, 0x00726F6C, 0x00080005,\n    0x000016BA, 0x695F6578, 0x64656D6D, 0x65746169, 0x7865745F, 0x65727574,\n    0x00000000, 0x00060005, 0x00001255, 0x695F6578, 0x65745F6E, 0x6F6F6378,\n    0x00006472, 0x00040047, 0x00000C08, 0x0000001E, 0x00000000, 0x00040047,\n    0x0000171A, 0x0000001E, 0x00000001, 0x00040047, 0x000016BA, 0x00000021,\n    0x00000000, 0x00040047, 0x000016BA, 0x00000022, 0x00000000, 0x00040047,\n    0x00001255, 0x0000001E, 0x00000000, 0x00020013, 0x00000008, 0x00030021,\n    0x00000502, 0x00000008, 0x00030016, 0x0000000D, 0x00000020, 0x00040017,\n    0x0000001D, 0x0000000D, 0x00000004, 0x00040020, 0x0000029A, 0x00000003,\n    0x0000001D, 0x0004003B, 0x0000029A, 0x00000C08, 0x00000003, 0x00040020,\n    0x0000029B, 0x00000001, 0x0000001D, 0x0004003B, 0x0000029B, 0x0000171A,\n    0x00000001, 0x00090019, 0x00000096, 0x0000000D, 0x00000001, 0x00000000,\n    0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x0003001B, 0x000001FE,\n    0x00000096, 0x00040020, 0x0000047B, 0x00000000, 0x000001FE, 0x0004003B,\n    0x0000047B, 0x000016BA, 0x00000000, 0x00040017, 0x00000013, 0x0000000D,\n    0x00000002, 0x00040020, 0x00000290, 0x00000001, 0x00000013, 0x0004003B,\n    0x00000290, 0x00001255, 0x00000001, 0x0004002B, 0x0000000D, 0x00000A0C,\n    0x00000000, 0x00050036, 0x00000008, 0x0000161F, 0x00000000, 0x00000502,\n    0x000200F8, 0x0000601F, 0x0004003D, 0x0000001D, 0x00005112, 0x0000171A,\n    0x0004003D, 0x000001FE, 0x00005EDD, 0x000016BA, 0x0004003D, 0x00000013,\n    0x00001FF3, 0x00001255, 0x00070058, 0x0000001D, 0x00001A1E, 0x00005EDD,\n    0x00001FF3, 0x00000002, 0x00000A0C, 0x00050085, 0x0000001D, 0x000022EB,\n    0x00005112, 0x00001A1E, 0x0003003E, 0x00000C08, 0x000022EB, 0x000100FD,\n    0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/ui/shaders/bytecode/vulkan_spirv/immediate_vs.h",
    "content": "// Generated with `xb buildshaders`.\n#if 0\n; SPIR-V\n; Version: 1.0\n; Generator: Khronos Glslang Reference Front End; 11\n; Bound: 24627\n; Schema: 0\n               OpCapability Shader\n          %1 = OpExtInstImport \"GLSL.std.450\"\n               OpMemoryModel Logical GLSL450\n               OpEntryPoint Vertex %main \"main\" %xe_out_texcoord %xe_in_texcoord %xe_out_color %xe_in_color %_ %xe_in_position\n               OpSource GLSL 460\n               OpSourceExtension \"GL_EXT_control_flow_attributes\"\n               OpSourceExtension \"GL_EXT_samplerless_texture_functions\"\n               OpSourceExtension \"GL_GOOGLE_cpp_style_line_directive\"\n               OpSourceExtension \"GL_GOOGLE_include_directive\"\n               OpName %main \"main\"\n               OpName %xe_out_texcoord \"xe_out_texcoord\"\n               OpName %xe_in_texcoord \"xe_in_texcoord\"\n               OpName %xe_out_color \"xe_out_color\"\n               OpName %xe_in_color \"xe_in_color\"\n               OpName %gl_PerVertex \"gl_PerVertex\"\n               OpMemberName %gl_PerVertex 0 \"gl_Position\"\n               OpMemberName %gl_PerVertex 1 \"gl_PointSize\"\n               OpMemberName %gl_PerVertex 2 \"gl_ClipDistance\"\n               OpMemberName %gl_PerVertex 3 \"gl_CullDistance\"\n               OpName %_ \"\"\n               OpName %xe_in_position \"xe_in_position\"\n               OpName %push_const_block_xe \"push_const_block_xe\"\n               OpMemberName %push_const_block_xe 0 \"xe_coordinate_space_size_inv\"\n               OpName %push_consts_xe \"push_consts_xe\"\n               OpDecorate %xe_out_texcoord Location 0\n               OpDecorate %xe_in_texcoord Location 1\n               OpDecorate %xe_out_color Location 1\n               OpDecorate %xe_in_color Location 2\n               OpDecorate %gl_PerVertex Block\n               OpMemberDecorate %gl_PerVertex 0 BuiltIn Position\n               OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize\n               OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance\n               OpMemberDecorate %gl_PerVertex 3 BuiltIn CullDistance\n               OpDecorate %xe_in_position Location 0\n               OpDecorate %push_const_block_xe Block\n               OpMemberDecorate %push_const_block_xe 0 Offset 0\n       %void = OpTypeVoid\n       %1282 = OpTypeFunction %void\n      %float = OpTypeFloat 32\n    %v2float = OpTypeVector %float 2\n%_ptr_Output_v2float = OpTypePointer Output %v2float\n%xe_out_texcoord = OpVariable %_ptr_Output_v2float Output\n%_ptr_Input_v2float = OpTypePointer Input %v2float\n%xe_in_texcoord = OpVariable %_ptr_Input_v2float Input\n    %v4float = OpTypeVector %float 4\n%_ptr_Output_v4float = OpTypePointer Output %v4float\n%xe_out_color = OpVariable %_ptr_Output_v4float Output\n%_ptr_Input_v4float = OpTypePointer Input %v4float\n%xe_in_color = OpVariable %_ptr_Input_v4float Input\n       %uint = OpTypeInt 32 0\n     %uint_1 = OpConstant %uint 1\n%_arr_float_uint_1 = OpTypeArray %float %uint_1\n%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1 %_arr_float_uint_1\n%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex\n          %_ = OpVariable %_ptr_Output_gl_PerVertex Output\n        %int = OpTypeInt 32 1\n      %int_0 = OpConstant %int 0\n%xe_in_position = OpVariable %_ptr_Input_v2float Input\n%push_const_block_xe = OpTypeStruct %v2float\n%_ptr_PushConstant_push_const_block_xe = OpTypePointer PushConstant %push_const_block_xe\n%push_consts_xe = OpVariable %_ptr_PushConstant_push_const_block_xe PushConstant\n%_ptr_PushConstant_v2float = OpTypePointer PushConstant %v2float\n    %float_2 = OpConstant %float 2\n       %2981 = OpConstantComposite %v2float %float_2 %float_2\n    %float_1 = OpConstant %float 1\n        %768 = OpConstantComposite %v2float %float_1 %float_1\n    %float_0 = OpConstant %float 0\n       %main = OpFunction %void None %1282\n      %24626 = OpLabel\n      %20581 = OpLoad %v2float %xe_in_texcoord\n               OpStore %xe_out_texcoord %20581\n      %11060 = OpLoad %v4float %xe_in_color\n               OpStore %xe_out_color %11060\n      %10541 = OpLoad %v2float %xe_in_position\n      %22255 = OpAccessChain %_ptr_PushConstant_v2float %push_consts_xe %int_0\n      %12012 = OpLoad %v2float %22255\n      %17501 = OpFMul %v2float %10541 %12012\n      %13314 = OpFMul %v2float %17501 %2981\n       %6620 = OpFSub %v2float %13314 %768\n      %22715 = OpCompositeExtract %float %6620 0\n      %15569 = OpCompositeExtract %float %6620 1\n      %18260 = OpCompositeConstruct %v4float %22715 %15569 %float_0 %float_1\n      %12055 = OpAccessChain %_ptr_Output_v4float %_ %int_0\n               OpStore %12055 %18260\n               OpReturn\n               OpFunctionEnd\n#endif\n\nconst uint32_t immediate_vs[] = {\n    0x07230203, 0x00010000, 0x0008000B, 0x00006033, 0x00000000, 0x00020011,\n    0x00000001, 0x0006000B, 0x00000001, 0x4C534C47, 0x6474732E, 0x3035342E,\n    0x00000000, 0x0003000E, 0x00000000, 0x00000001, 0x000B000F, 0x00000000,\n    0x0000161F, 0x6E69616D, 0x00000000, 0x0000103F, 0x00001255, 0x00000C08,\n    0x0000171A, 0x00001342, 0x00001562, 0x00030003, 0x00000002, 0x000001CC,\n    0x00090004, 0x455F4C47, 0x635F5458, 0x72746E6F, 0x665F6C6F, 0x5F776F6C,\n    0x72747461, 0x74756269, 0x00007365, 0x000B0004, 0x455F4C47, 0x735F5458,\n    0x6C706D61, 0x656C7265, 0x745F7373, 0x75747865, 0x665F6572, 0x74636E75,\n    0x736E6F69, 0x00000000, 0x000A0004, 0x475F4C47, 0x4C474F4F, 0x70635F45,\n    0x74735F70, 0x5F656C79, 0x656E696C, 0x7269645F, 0x69746365, 0x00006576,\n    0x00080004, 0x475F4C47, 0x4C474F4F, 0x6E695F45, 0x64756C63, 0x69645F65,\n    0x74636572, 0x00657669, 0x00040005, 0x0000161F, 0x6E69616D, 0x00000000,\n    0x00060005, 0x0000103F, 0x6F5F6578, 0x745F7475, 0x6F637865, 0x0064726F,\n    0x00060005, 0x00001255, 0x695F6578, 0x65745F6E, 0x6F6F6378, 0x00006472,\n    0x00060005, 0x00000C08, 0x6F5F6578, 0x635F7475, 0x726F6C6F, 0x00000000,\n    0x00050005, 0x0000171A, 0x695F6578, 0x6F635F6E, 0x00726F6C, 0x00060005,\n    0x000001A3, 0x505F6C67, 0x65567265, 0x78657472, 0x00000000, 0x00060006,\n    0x000001A3, 0x00000000, 0x505F6C67, 0x7469736F, 0x006E6F69, 0x00070006,\n    0x000001A3, 0x00000001, 0x505F6C67, 0x746E696F, 0x657A6953, 0x00000000,\n    0x00070006, 0x000001A3, 0x00000002, 0x435F6C67, 0x4470696C, 0x61747369,\n    0x0065636E, 0x00070006, 0x000001A3, 0x00000003, 0x435F6C67, 0x446C6C75,\n    0x61747369, 0x0065636E, 0x00030005, 0x00001342, 0x00000000, 0x00060005,\n    0x00001562, 0x695F6578, 0x6F705F6E, 0x69746973, 0x00006E6F, 0x00070005,\n    0x000003E5, 0x68737570, 0x6E6F635F, 0x625F7473, 0x6B636F6C, 0x0065785F,\n    0x000B0006, 0x000003E5, 0x00000000, 0x635F6578, 0x64726F6F, 0x74616E69,\n    0x70735F65, 0x5F656361, 0x657A6973, 0x766E695F, 0x00000000, 0x00060005,\n    0x00000CE9, 0x68737570, 0x6E6F635F, 0x5F737473, 0x00006578, 0x00040047,\n    0x0000103F, 0x0000001E, 0x00000000, 0x00040047, 0x00001255, 0x0000001E,\n    0x00000001, 0x00040047, 0x00000C08, 0x0000001E, 0x00000001, 0x00040047,\n    0x0000171A, 0x0000001E, 0x00000002, 0x00030047, 0x000001A3, 0x00000002,\n    0x00050048, 0x000001A3, 0x00000000, 0x0000000B, 0x00000000, 0x00050048,\n    0x000001A3, 0x00000001, 0x0000000B, 0x00000001, 0x00050048, 0x000001A3,\n    0x00000002, 0x0000000B, 0x00000003, 0x00050048, 0x000001A3, 0x00000003,\n    0x0000000B, 0x00000004, 0x00040047, 0x00001562, 0x0000001E, 0x00000000,\n    0x00030047, 0x000003E5, 0x00000002, 0x00050048, 0x000003E5, 0x00000000,\n    0x00000023, 0x00000000, 0x00020013, 0x00000008, 0x00030021, 0x00000502,\n    0x00000008, 0x00030016, 0x0000000D, 0x00000020, 0x00040017, 0x00000013,\n    0x0000000D, 0x00000002, 0x00040020, 0x00000290, 0x00000003, 0x00000013,\n    0x0004003B, 0x00000290, 0x0000103F, 0x00000003, 0x00040020, 0x00000291,\n    0x00000001, 0x00000013, 0x0004003B, 0x00000291, 0x00001255, 0x00000001,\n    0x00040017, 0x0000001D, 0x0000000D, 0x00000004, 0x00040020, 0x0000029A,\n    0x00000003, 0x0000001D, 0x0004003B, 0x0000029A, 0x00000C08, 0x00000003,\n    0x00040020, 0x0000029B, 0x00000001, 0x0000001D, 0x0004003B, 0x0000029B,\n    0x0000171A, 0x00000001, 0x00040015, 0x0000000B, 0x00000020, 0x00000000,\n    0x0004002B, 0x0000000B, 0x00000A0D, 0x00000001, 0x0004001C, 0x00000261,\n    0x0000000D, 0x00000A0D, 0x0006001E, 0x000001A3, 0x0000001D, 0x0000000D,\n    0x00000261, 0x00000261, 0x00040020, 0x00000420, 0x00000003, 0x000001A3,\n    0x0004003B, 0x00000420, 0x00001342, 0x00000003, 0x00040015, 0x0000000C,\n    0x00000020, 0x00000001, 0x0004002B, 0x0000000C, 0x00000A0B, 0x00000000,\n    0x0004003B, 0x00000291, 0x00001562, 0x00000001, 0x0003001E, 0x000003E5,\n    0x00000013, 0x00040020, 0x00000662, 0x00000009, 0x000003E5, 0x0004003B,\n    0x00000662, 0x00000CE9, 0x00000009, 0x00040020, 0x00000292, 0x00000009,\n    0x00000013, 0x0004002B, 0x0000000D, 0x00000018, 0x40000000, 0x0005002C,\n    0x00000013, 0x00000BA5, 0x00000018, 0x00000018, 0x0004002B, 0x0000000D,\n    0x0000008A, 0x3F800000, 0x0005002C, 0x00000013, 0x00000300, 0x0000008A,\n    0x0000008A, 0x0004002B, 0x0000000D, 0x00000A0C, 0x00000000, 0x00050036,\n    0x00000008, 0x0000161F, 0x00000000, 0x00000502, 0x000200F8, 0x00006032,\n    0x0004003D, 0x00000013, 0x00005065, 0x00001255, 0x0003003E, 0x0000103F,\n    0x00005065, 0x0004003D, 0x0000001D, 0x00002B34, 0x0000171A, 0x0003003E,\n    0x00000C08, 0x00002B34, 0x0004003D, 0x00000013, 0x0000292D, 0x00001562,\n    0x00050041, 0x00000292, 0x000056EF, 0x00000CE9, 0x00000A0B, 0x0004003D,\n    0x00000013, 0x00002EEC, 0x000056EF, 0x00050085, 0x00000013, 0x0000445D,\n    0x0000292D, 0x00002EEC, 0x00050085, 0x00000013, 0x00003402, 0x0000445D,\n    0x00000BA5, 0x00050083, 0x00000013, 0x000019DC, 0x00003402, 0x00000300,\n    0x00050051, 0x0000000D, 0x000058BB, 0x000019DC, 0x00000000, 0x00050051,\n    0x0000000D, 0x00003CD1, 0x000019DC, 0x00000001, 0x00070050, 0x0000001D,\n    0x00004754, 0x000058BB, 0x00003CD1, 0x00000A0C, 0x0000008A, 0x00050041,\n    0x0000029A, 0x00002F17, 0x00001342, 0x00000A0B, 0x0003003E, 0x00002F17,\n    0x00004754, 0x000100FD, 0x00010038,\n};\n"
  },
  {
    "path": "src/xenia/ui/shaders/dither_8bpc.xesli",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_SHADERS_DITHER_8BPC_XESLI_\n#define XENIA_UI_SHADERS_DITHER_8BPC_XESLI_\n\n#include \"xesl.xesli\"\n\n#include \"noise.xesli\"\n\nstatic_const_xe float xe_dither_8bpc_noise[] = {\n  // The conversion to 8bpc in the fixed-function output-merger is done as\n  // floor(saturate(color) * 255.0 + 0.5). This dithering function effectively\n  // replaces that 0.5 offset, done for rounding to the nearest, with the noise.\n  // To do that, first, 0.5/255 needs to be subtracted from the color, and\n  // then the noise value `[0, 255/256] / 255` from xe_dither_8bpc_noise needs\n  // to be added. However, due to rounding (because division by 255.0 is\n  // inexact), subtracting 0.5/255 from exact 8-bit integer color values\n  // (including, for instance, 1.0, or 255/255) may result in the result being\n  // smaller than the original exact 8-bit value where the noise value is 0. So,\n  // remapping the noise to the `[0.5/256, 255.5/256] / 255` range. Another way\n  // of preventing rounding issues is doing it manually and returning only exact\n  // integer 8-bit color values divided by 255, but that would assume that the\n  // render target is specifically 8bpc, so it's better to avoid that in case\n  // the window system, for instance, provides a 10bpc render target (for which\n  // dithering is still done here for more consistency between displays, but\n  // some addition precision would still be desirable).\n  XeBlueNoise16x16Values0Until256(1.0f / 256.0f / 255.0f,\n                                  (-0.5f + 0.5f / 256.0f) / 255.0f)\n};\n\nfloat XeDitherOffset8bpc(uint2_xe pixel_coord) {\n  pixel_coord &= 15u;\n  return xe_dither_8bpc_noise[pixel_coord.y * 16u + pixel_coord.x];\n}\n\n#endif  // XENIA_UI_SHADERS_DITHER_8BPC_XESLI_\n"
  },
  {
    "path": "src/xenia/ui/shaders/guest_output_bilinear.ps.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"guest_output_bilinear.xesli\"\n"
  },
  {
    "path": "src/xenia/ui/shaders/guest_output_bilinear.xesli",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xesl.xesli\"\n\n#if XE_GUEST_OUTPUT_DITHER\n  #include \"dither_8bpc.xesli\"\n#endif  // XE_GUEST_OUTPUT_DITHER\n\npush_const_begin_xe(b0, space0)\n  // 16 used by the vertex shader (GLSL push constant offsets are across\n  // stages).\n  block_offset_member_xe(16, c0.x, int2_xe, xe_bilinear_output_offset)\n  block_offset_member_xe(24, c0.z, float2_xe, xe_bilinear_output_size_inv)\npush_const_end_xe\n\nentry_outputs_begin_xe\n  entry_out_target_xe(float4_xe, xe_bilinear_color, 0)\nentry_outputs_end_stage_inputs_begin_xe\nentry_stage_inputs_end_bindings_begin_pixel_xe\n  push_const_binding_xe(buffer(0))\n  entry_binding_next_xe\n  texture_xe(texture_2d_xe, xe_bilinear_source, set=0, binding=0, t0, space0,\n             texture(0))\n  entry_binding_next_xe\n  sampler_state_xe(xe_bilinear_sampler, set=0, binding=1, s0, space0,\n                   sampler(0))\nentry_bindings_end_inputs_begin_xe\n  entry_in_pixel_coord_xe\nentry_inputs_end_code_begin_xe\n{\n  uint2_xe pixel_coord = uint2_xe(int2_xe(in_pixel_coord_xe.xy) -\n                                  push_const_xe(xe_bilinear_output_offset));\n  float4_xe bilinear_color;\n  // + 0.5 so the origin is at the pixel center, and at 1:1 the original pixel\n  // is taken.\n  // Interpolating the four colors in the perceptual space because doing it in\n  // linear space causes, in particular, bright text on a dark background to\n  // become too thick, and aliasing of bright parts on top of dark areas to be\n  // too apparent (4D5307E6 HUD, for example, mainly the edges of the\n  // multiplayer score bars).\n  bilinear_color.rgb =\n      sample_sep_lod_2d_xe(\n          xe_bilinear_source, xe_bilinear_sampler,\n          (float2_xe(pixel_coord) + 0.5f) *\n              push_const_xe(xe_bilinear_output_size_inv),\n          0.0f).rgb;\n  #if XE_GUEST_OUTPUT_DITHER\n    // Clamping because on Vulkan, the surface may specify any format, including\n    // floating-point.\n    bilinear_color.rgb =\n        saturate_xe(bilinear_color.rgb + XeDitherOffset8bpc(pixel_coord));\n  #endif  // XE_GUEST_OUTPUT_DITHER\n  bilinear_color.a = 1.0f;\n  out_xe(xe_bilinear_color) = bilinear_color;\n}\nentry_code_end_xe\n"
  },
  {
    "path": "src/xenia/ui/shaders/guest_output_bilinear_dither.ps.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#define XE_GUEST_OUTPUT_DITHER 1\n#include \"guest_output_bilinear.xesli\"\n"
  },
  {
    "path": "src/xenia/ui/shaders/guest_output_ffx_cas_resample.ps.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"guest_output_ffx_cas_resample.xesli\"\n"
  },
  {
    "path": "src/xenia/ui/shaders/guest_output_ffx_cas_resample.xesli",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xesl.xesli\"\n\n#include \"amd_language.xesli\"\n\n#if XE_GUEST_OUTPUT_DITHER\n  #include \"dither_8bpc.xesli\"\n#endif  // XE_GUEST_OUTPUT_DITHER\n\npush_const_begin_xe(b0, space0)\n  // 16 used by the vertex shader (GLSL push constant offsets are across\n  // stages).\n  block_offset_member_xe(16, c0.x, int2_xe, xe_cas_output_offset)\n  // CasSetup const0.xy.\n  block_offset_member_xe(24, c0.z, float2_xe, xe_cas_input_output_size_ratio)\n  // CasSetup const1.x.\n  block_offset_member_xe(32, c1.x, float, xe_cas_sharpness_post_setup)\npush_const_end_xe\n\n// FIXME(Triang3l): This approach doesn't work for MSL - the texture must be\n// passed explicitly from the entry point's arguments to CasLoad.\n\n// Forward declaration because CasLoad needs xe_cas_source from the entry point\n// bindings.\nvoid CasFilter(out_param_xe(float, pixel_r), out_param_xe(float, pixel_g),\n               out_param_xe(float, pixel_b), uint2_xe pixel_position,\n               uint4_xe const0, uint4_xe const1, bool no_scaling);\n\nentry_outputs_begin_xe\n  entry_out_target_xe(float4_xe, xe_cas_color, 0)\nentry_outputs_end_stage_inputs_begin_xe\nentry_stage_inputs_end_bindings_begin_pixel_xe\n  push_const_binding_xe(buffer(0))\n  entry_binding_next_xe\n  texture_xe(texture_2d_xe, xe_cas_source, set=0, binding=0, t0, space0,\n             texture(0))\nentry_bindings_end_inputs_begin_xe\n  entry_in_pixel_coord_xe\nentry_inputs_end_code_begin_xe\n{\n  uint2_xe pixel_coord = uint2_xe(int2_xe(in_pixel_coord_xe.xy) -\n                                  push_const_xe(xe_cas_output_offset));\n  // CasSetup with smaller push constants usage.\n  uint4_xe cas_const_0 =\n      uint4_xe(\n          float_bits_to_uint_xe(push_const_xe(xe_cas_input_output_size_ratio)),\n          float_bits_to_uint_xe(\n              0.5f * push_const_xe(xe_cas_input_output_size_ratio) - 0.5f));\n  uint4_xe cas_const_1 =\n      uint4_xe(\n          float_bits_to_uint_xe(push_const_xe(xe_cas_sharpness_post_setup)),\n          pack_half_2x16_xe(float2_xe(\n              push_const_xe(xe_cas_sharpness_post_setup), 0.0f)),\n          float_bits_to_uint_xe(8.0f), 0u);\n  float4_xe cas_color;\n  CasFilter(cas_color.r, cas_color.g, cas_color.b, pixel_coord, cas_const_0,\n            cas_const_1, false);\n  // Linear conversion approximation as recommended in the CAS presentation.\n  cas_color.rgb = sqrt(cas_color.rgb);\n  #if XE_GUEST_OUTPUT_DITHER\n    // Clamping because on Vulkan, the surface may specify any format, including\n    // floating-point.\n    cas_color.rgb =\n        saturate_xe(cas_color.rgb + XeDitherOffset8bpc(pixel_coord));\n  #endif  // XE_GUEST_OUTPUT_DITHER\n  // Force alpha to 1 to make sure the surface won't be translucent.\n  cas_color.a = 1.0f;\n  out_xe(xe_cas_color) = cas_color;\n}\nentry_code_end_xe\n\n#define A_GPU 1\n#include \"../../../../third_party/FidelityFX-CAS/ffx-cas/ffx_a.h\"\nfloat3_xe CasLoad(int2_xe p) {\n  return texel_fetch_2d_xe(xe_cas_source, p, 0).rgb;\n}\nvoid CasInput(inout_param_xe(float, r), inout_param_xe(float, g),\n              inout_param_xe(float, b)) {\n  // Linear conversion approximation as recommended in the CAS presentation.\n  r *= r;\n  g *= g;\n  b *= b;\n}\n#include \"../../../../third_party/FidelityFX-CAS/ffx-cas/ffx_cas.h\"\n"
  },
  {
    "path": "src/xenia/ui/shaders/guest_output_ffx_cas_resample_dither.ps.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#define XE_GUEST_OUTPUT_DITHER 1\n#include \"guest_output_ffx_cas_resample.xesli\"\n"
  },
  {
    "path": "src/xenia/ui/shaders/guest_output_ffx_cas_sharpen.ps.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"guest_output_ffx_cas_sharpen.xesli\"\n"
  },
  {
    "path": "src/xenia/ui/shaders/guest_output_ffx_cas_sharpen.xesli",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xesl.xesli\"\n\n#include \"amd_language.xesli\"\n\n#if XE_GUEST_OUTPUT_DITHER\n  #include \"dither_8bpc.xesli\"\n#endif  // XE_GUEST_OUTPUT_DITHER\n\npush_const_begin_xe(b0, space0)\n  // 16 used by the vertex shader (GLSL push constant offsets are across\n  // stages).\n  block_offset_member_xe(16, c0.x, int2_xe, xe_cas_output_offset)\n  // CasSetup const1.x.\n  block_offset_member_xe(24, c0.z, float, xe_cas_sharpness_post_setup)\npush_const_end_xe\n\n// FIXME(Triang3l): This approach doesn't work for MSL - the texture must be\n// passed explicitly from the entry point's arguments to CasLoad.\n\n// Forward declaration because CasLoad needs xe_cas_source from the entry point\n// bindings.\nvoid CasFilter(out_param_xe(float, pixel_r), out_param_xe(float, pixel_g),\n               out_param_xe(float, pixel_b), uint2_xe pixel_position,\n               uint4_xe const0, uint4_xe const1, bool no_scaling);\n\nentry_outputs_begin_xe\n  entry_out_target_xe(float4_xe, xe_cas_color, 0)\nentry_outputs_end_stage_inputs_begin_xe\nentry_stage_inputs_end_bindings_begin_pixel_xe\n  push_const_binding_xe(buffer(0))\n  entry_binding_next_xe\n  texture_xe(texture_2d_xe, xe_cas_source, set=0, binding=0, t0, space0,\n             texture(0))\nentry_bindings_end_inputs_begin_xe\n  entry_in_pixel_coord_xe\nentry_inputs_end_code_begin_xe\n{\n  uint2_xe pixel_coord = uint2_xe(int2_xe(in_pixel_coord_xe.xy) -\n                                  push_const_xe(xe_cas_output_offset));\n  // CasSetup with smaller push constants usage.\n  uint4_xe cas_const_0 =\n      float_bits_to_uint_xe(float4_xe(1.0f, 1.0f, 0.0f, 0.0f));\n  uint4_xe cas_const_1 =\n      uint4_xe(\n          float_bits_to_uint_xe(push_const_xe(xe_cas_sharpness_post_setup)),\n          pack_half_2x16_xe(float2_xe(\n              push_const_xe(xe_cas_sharpness_post_setup), 0.0f)),\n          float_bits_to_uint_xe(8.0f), 0u);\n  float4_xe cas_color;\n  CasFilter(cas_color.r, cas_color.g, cas_color.b, pixel_coord, cas_const_0,\n            cas_const_1, true);\n  // Linear conversion approximation as recommended in the CAS presentation.\n  cas_color.rgb = sqrt(cas_color.rgb);\n  #if XE_GUEST_OUTPUT_DITHER\n    // Clamping because on Vulkan, the surface may specify any format, including\n    // floating-point.\n    cas_color.rgb =\n        saturate_xe(cas_color.rgb + XeDitherOffset8bpc(pixel_coord));\n  #endif  // XE_GUEST_OUTPUT_DITHER\n  // Force alpha to 1 to make sure the surface won't be translucent.\n  cas_color.a = 1.0f;\n  out_xe(xe_cas_color) = cas_color;\n}\nentry_code_end_xe\n\n#define A_GPU 1\n#include \"../../../../third_party/FidelityFX-CAS/ffx-cas/ffx_a.h\"\nfloat3_xe CasLoad(int2_xe p) {\n  return texel_fetch_2d_xe(xe_cas_source, p, 0).rgb;\n}\nvoid CasInput(inout_param_xe(float, r), inout_param_xe(float, g),\n              inout_param_xe(float, b)) {\n  // Linear conversion approximation as recommended in the CAS presentation.\n  r *= r;\n  g *= g;\n  b *= b;\n}\n#include \"../../../../third_party/FidelityFX-CAS/ffx-cas/ffx_cas.h\"\n"
  },
  {
    "path": "src/xenia/ui/shaders/guest_output_ffx_cas_sharpen_dither.ps.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#define XE_GUEST_OUTPUT_DITHER 1\n#include \"guest_output_ffx_cas_sharpen.xesli\"\n"
  },
  {
    "path": "src/xenia/ui/shaders/guest_output_ffx_fsr_easu.ps.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xesl.xesli\"\n\n#include \"amd_language.xesli\"\n\npush_const_begin_xe(b0, space0)\n  // 16 used by the vertex shader (GLSL push constant offsets are across\n  // stages).\n  block_offset_member_xe(16, c0.x, float2_xe,\n                         xe_fsr_easu_input_output_size_ratio)\n  block_offset_member_xe(24, c0.z, float2_xe, xe_fsr_easu_input_size_inv)\npush_const_end_xe\n\n// FIXME(Triang3l): This approach doesn't work for MSL - the texture must be\n// passed explicitly from the entry point's arguments to FsrEasu#F.\n\n// Forward declaration because FsrEasu#F need xe_fsr_easu_source from the entry\n// point bindings.\nvoid FsrEasuF(out_param_xe(float3_xe, pixel), uint2_xe pixel_position,\n              uint4_xe const0, uint4_xe const1, uint4_xe const2,\n              uint4_xe const3);\n\nentry_outputs_begin_xe\n  entry_out_target_xe(float4_xe, xe_fsr_easu_color, 0)\nentry_outputs_end_stage_inputs_begin_xe\nentry_stage_inputs_end_bindings_begin_pixel_xe\n  push_const_binding_xe(buffer(0))\n  entry_binding_next_xe\n  texture_xe(texture_2d_xe, xe_fsr_easu_source, set=0, binding=0, t0, space0,\n             texture(0))\n  entry_binding_next_xe\n  sampler_state_xe(xe_fsr_easu_sampler, set=0, binding=1, s0, space0,\n                   sampler(0))\nentry_bindings_end_inputs_begin_xe\n  entry_in_pixel_coord_xe\nentry_inputs_end_code_begin_xe\n{\n  // FsrEasuCon with smaller push constant usage.\n  uint4_xe easu_const_0 =\n      uint4_xe(\n          float_bits_to_uint_xe(\n              push_const_xe(xe_fsr_easu_input_output_size_ratio)),\n          float_bits_to_uint_xe(\n              0.5f * push_const_xe(xe_fsr_easu_input_output_size_ratio) -\n              0.5f));\n  uint4_xe easu_const_1 =\n      float_bits_to_uint_xe(float4_xe(1.0f, 1.0f, 1.0f, -1.0f) *\n                            push_const_xe(xe_fsr_easu_input_size_inv).xyxy);\n  uint4_xe easu_const_2 =\n      float_bits_to_uint_xe(float4_xe(-1.0f, 2.0f, 1.0f, 2.0f) *\n                            push_const_xe(xe_fsr_easu_input_size_inv).xyxy);\n  uint4_xe easu_const_3 = uint4_xe(\n      float_bits_to_uint_xe(0.0f),\n      float_bits_to_uint_xe(4.0f * push_const_xe(xe_fsr_easu_input_size_inv).y),\n      0u, 0u);\n  FsrEasuF(out_xe(xe_fsr_easu_color).rgb, uint2_xe(in_pixel_coord_xe.xy),\n           easu_const_0, easu_const_1, easu_const_2, easu_const_3);\n  out_xe(xe_fsr_easu_color).a = 1.0f;\n}\nentry_code_end_xe\n\n#define A_GPU 1\n#include \"../../../../third_party/FidelityFX-FSR/ffx-fsr/ffx_a.h\"\n#define FSR_EASU_F 1\nfloat4_xe FsrEasuRF(float2_xe p) {\n  return gather_sep_2d_r_xe(xe_fsr_easu_source, xe_fsr_easu_sampler, p);\n}\nfloat4_xe FsrEasuGF(float2_xe p) {\n  return gather_sep_2d_g_xe(xe_fsr_easu_source, xe_fsr_easu_sampler, p);\n}\nfloat4_xe FsrEasuBF(float2_xe p) {\n  return gather_sep_2d_b_xe(xe_fsr_easu_source, xe_fsr_easu_sampler, p);\n}\n#include \"../../../../third_party/FidelityFX-FSR/ffx-fsr/ffx_fsr1.h\"\n"
  },
  {
    "path": "src/xenia/ui/shaders/guest_output_ffx_fsr_rcas.ps.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"guest_output_ffx_fsr_rcas.xesli\"\n"
  },
  {
    "path": "src/xenia/ui/shaders/guest_output_ffx_fsr_rcas.xesli",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xesl.xesli\"\n\n#include \"amd_language.xesli\"\n\n#if XE_GUEST_OUTPUT_DITHER\n  #include \"dither_8bpc.xesli\"\n#endif  // XE_GUEST_OUTPUT_DITHER\n\npush_const_begin_xe(b0, space0)\n  // 16 used by the vertex shader (GLSL push constant offsets are across\n  // stages).\n  block_offset_member_xe(16, c0.x, int2_xe, xe_fsr_rcas_output_offset)\n  block_offset_member_xe(24, c0.z, float, xe_fsr_rcas_sharpness_post_setup)\npush_const_end_xe\n\n// FIXME(Triang3l): This approach doesn't work for MSL - the texture must be\n// passed explicitly from the entry point's arguments to FsrRcasLoadF.\n\n// Forward declaration because FsrRcasLoadF needs xe_fsr_rcas_source from the\n// entry point bindings.\nvoid FsrRcasF(out_param_xe(float, pixel_r), out_param_xe(float, pixel_g),\n              out_param_xe(float, pixel_b), uint2_xe pixel_position,\n              uint4_xe constants);\n\nentry_outputs_begin_xe\n  entry_out_target_xe(float4_xe, xe_fsr_rcas_color, 0)\nentry_outputs_end_stage_inputs_begin_xe\nentry_stage_inputs_end_bindings_begin_pixel_xe\n  push_const_binding_xe(buffer(0))\n  entry_binding_next_xe\n  texture_xe(texture_2d_xe, xe_fsr_rcas_source, set=0, binding=0, t0, space0,\n             texture(0))\nentry_bindings_end_inputs_begin_xe\n  entry_in_pixel_coord_xe\nentry_inputs_end_code_begin_xe\n{\n  uint2_xe pixel_coord = uint2_xe(int2_xe(in_pixel_coord_xe.xy) -\n                                  push_const_xe(xe_fsr_rcas_output_offset));\n  float sharpness = push_const_xe(xe_fsr_rcas_sharpness_post_setup);\n  // FsrRcasCon with smaller push constant usage.\n  uint4_xe rcas_const =\n      uint4_xe(float_bits_to_uint_xe(sharpness),\n               pack_half_2x16_xe(float2_xe(sharpness, sharpness)), 0u, 0u);\n  float4_xe rcas_color;\n  FsrRcasF(rcas_color.r, rcas_color.g, rcas_color.b, pixel_coord, rcas_const);\n  #if XE_GUEST_OUTPUT_DITHER\n    // Clamping because on Vulkan, the surface may specify any format, including\n    // floating-point.\n    rcas_color.rgb =\n        saturate_xe(rcas_color.rgb + XeDitherOffset8bpc(pixel_coord));\n  #endif  // XE_GUEST_OUTPUT_DITHER\n  // Force alpha to 1 to make sure the surface won't be translucent.\n  rcas_color.a = 1.0f;\n  out_xe(xe_fsr_rcas_color) = rcas_color;\n}\nentry_code_end_xe\n\n#define A_GPU 1\n#include \"../../../../third_party/FidelityFX-FSR/ffx-fsr/ffx_a.h\"\n#define FSR_RCAS_F 1\nfloat4_xe FsrRcasLoadF(int2_xe p) {\n  return float4_xe(texel_fetch_2d_xe(xe_fsr_rcas_source, p, 0).rgb, 1.0f);\n}\nvoid FsrRcasInputF(inout_param_xe(float, r), inout_param_xe(float, g),\n                   inout_param_xe(float, b)) {}\n#include \"../../../../third_party/FidelityFX-FSR/ffx-fsr/ffx_fsr1.h\"\n"
  },
  {
    "path": "src/xenia/ui/shaders/guest_output_ffx_fsr_rcas_dither.ps.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#define XE_GUEST_OUTPUT_DITHER 1\n#include \"guest_output_ffx_fsr_rcas.xesli\"\n"
  },
  {
    "path": "src/xenia/ui/shaders/guest_output_triangle_strip_rect.vs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xesl.xesli\"\n\npush_const_begin_xe(b0, space0)\n  // If the layout is changed, update the base offset in all guest output pixel\n  // shaders!\n  float2_xe xe_triangle_strip_rect_offset;\n  // Can be negative.\n  float2_xe xe_triangle_strip_rect_size;\npush_const_end_xe\n\nentry_outputs_begin_xe\n  entry_out_position_xe\nentry_outputs_end_stage_inputs_begin_xe\nentry_stage_inputs_end_bindings_begin_vertex_xe\n  push_const_binding_xe(buffer(0))\nentry_bindings_end_inputs_begin_xe\n  entry_in_vertex_id_xe\nentry_inputs_end_code_begin_xe\n{\n  out_position_xe =\n      float4_xe(\n          push_const_xe(xe_triangle_strip_rect_offset) +\n              float2_xe((uint_x2_xe(in_vertex_id_xe) >>\n                         uint2_xe(0u, 1u)) & 1u) *\n              push_const_xe(xe_triangle_strip_rect_size),\n          0.0f, 1.0f);\n}\nentry_code_end_xe\n"
  },
  {
    "path": "src/xenia/ui/shaders/immediate.ps.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xesl.xesli\"\n\nentry_outputs_begin_xe\n  entry_out_target_xe(float4_xe, xe_out_color, 0)\nentry_outputs_end_stage_inputs_begin_xe\n  entry_in_stage_xe(float2_xe, xe_in_texcoord, 0, TEXCOORD)\n  entry_in_stage_xe(float4_xe, xe_in_color, 1, COLOR)\nentry_stage_inputs_end_bindings_begin_pixel_xe\n  sampler_xe(sampler_2d_xe, xe_immediate_texture, set=0, binding=0, t0, space0,\n             s0, space0, texture(0), sampler(0))\nentry_bindings_end_inputs_begin_xe\n  entry_in_stage_inputs_xe\nentry_inputs_end_code_begin_xe\n{\n  out_xe(xe_out_color) =\n      in_xe(xe_in_color) *\n      sample_comb_lod_2d_xe(xe_immediate_texture, in_xe(xe_in_texcoord), 0.0f);\n}\nentry_code_end_xe\n"
  },
  {
    "path": "src/xenia/ui/shaders/immediate.vs.xesl",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xesl.xesli\"\n\npush_const_begin_xe(b0, space0)\n  float2_xe xe_coordinate_space_size_inv;\npush_const_end_xe\n\nentry_outputs_begin_xe\n  entry_out_xe(float2_xe, xe_out_texcoord, 0, TEXCOORD)\n  entry_out_xe(float4_xe, xe_out_color, 1, COLOR)\n  entry_out_position_xe\nentry_outputs_end_stage_inputs_begin_xe\n  entry_in_stage_vertex_xe(float2_xe, xe_in_position, 0, POSITION)\n  entry_in_stage_vertex_xe(float2_xe, xe_in_texcoord, 1, TEXCOORD)\n  entry_in_stage_vertex_xe(float4_xe, xe_in_color, 2, COLOR)\nentry_stage_inputs_end_bindings_begin_vertex_xe\n  push_const_binding_xe(buffer(0))\nentry_bindings_end_inputs_begin_xe\n  entry_in_stage_inputs_xe\nentry_inputs_end_code_begin_xe\n{\n  out_xe(xe_out_texcoord) = in_xe(xe_in_texcoord);\n  out_xe(xe_out_color) = in_xe(xe_in_color);\n  out_position_xe =\n      float4_xe(in_xe(xe_in_position) *\n                    push_const_xe(xe_coordinate_space_size_inv) *\n                    float2_xe(2.0f, 2.0f * NDC_DIRECTION_Y_XE) -\n                    float2_xe(1.0f, NDC_DIRECTION_Y_XE),\n                0.0f, 1.0f);\n}\nentry_code_end_xe\n"
  },
  {
    "path": "src/xenia/ui/shaders/noise.xesli",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_SHADERS_NOISE_XESLI_\n#define XENIA_UI_SHADERS_NOISE_XESLI_\n\n#define XeNoiseRow16(scale, offset, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, \\\n                     va, vb, vc, vd, ve, vf)                                \\\n  v0 * scale + offset, v1 * scale + offset, v2 * scale + offset,            \\\n  v3 * scale + offset, v4 * scale + offset, v5 * scale + offset,            \\\n  v6 * scale + offset, v7 * scale + offset, v8 * scale + offset,            \\\n  v9 * scale + offset, va * scale + offset, vb * scale + offset,            \\\n  vc * scale + offset, vd * scale + offset, ve * scale + offset,            \\\n  vf * scale + offset\n\n#define XeBlueNoise16x16Values0Until256(scale, offset)                         \\\n  XeNoiseRow16(scale, offset, 62, 185, 238, 26, 211, 88, 197, 37, 216, 161,    \\\n               207, 23, 166, 109, 200, 35),                                    \\\n  XeNoiseRow16(scale, offset, 222, 92, 136, 49, 156, 59, 168, 96, 250, 56,     \\\n               121, 93, 221, 1, 82, 130),                                      \\\n  XeNoiseRow16(scale, offset, 174, 42, 199, 108, 242, 18, 224, 125, 179, 8,    \\\n               147, 192, 51, 139, 235, 24),                                    \\\n  XeNoiseRow16(scale, offset, 150, 249, 12, 71, 186, 138, 67, 28, 85, 212, 75, \\\n               32, 245, 72, 183, 98),                                          \\\n  XeNoiseRow16(scale, offset, 58, 118, 143, 220, 89, 115, 232, 194, 154, 114,  \\\n               231, 170, 123, 155, 20, 217),                                   \\\n  XeNoiseRow16(scale, offset, 188, 84, 205, 33, 165, 4, 177, 43, 253, 19, 60,  \\\n               95, 6, 206, 106, 38),                                           \\\n  XeNoiseRow16(scale, offset, 234, 7, 175, 68, 246, 53, 103, 134, 79, 204,     \\\n               132, 225, 191, 65, 254, 162),                                   \\\n  XeNoiseRow16(scale, offset, 131, 46, 110, 228, 127, 148, 215, 13, 160, 50,   \\\n               178, 40, 145, 31, 119, 77),                                     \\\n  XeNoiseRow16(scale, offset, 213, 153, 190, 97, 27, 195, 83, 237, 193, 100,   \\\n               244, 112, 87, 236, 182, 15),                                    \\\n  XeNoiseRow16(scale, offset, 57, 243, 76, 11, 172, 63, 41, 116, 29, 149, 0,   \\\n               171, 22, 203, 157, 99),                                         \\\n  XeNoiseRow16(scale, offset, 140, 30, 202, 133, 251, 219, 164, 135, 210, 90,  \\\n               64, 214, 142, 78, 39, 223),                                     \\\n  XeNoiseRow16(scale, offset, 184, 104, 163, 54, 111, 91, 9, 240, 52, 176,     \\\n               230, 120, 48, 247, 129, 2),                                     \\\n  XeNoiseRow16(scale, offset, 241, 81, 229, 16, 208, 141, 196, 80, 21, 107,    \\\n               159, 10, 189, 105, 173, 61),                                    \\\n  XeNoiseRow16(scale, offset, 25, 126, 44, 180, 69, 34, 167, 122, 187, 255,    \\\n               36, 86, 226, 74, 209, 144),                                     \\\n  XeNoiseRow16(scale, offset, 227, 201, 151, 102, 252, 218, 55, 233, 70, 137,  \\\n               198, 124, 146, 17, 45, 94),                                     \\\n  XeNoiseRow16(scale, offset, 117, 5, 73, 169, 128, 3, 113, 152, 14, 101, 47,  \\\n               239, 66, 181, 248, 158)\n\n#endif  // XENIA_UI_SHADERS_NOISE_XESLI_\n"
  },
  {
    "path": "src/xenia/ui/shaders/xesl.xesli",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_SHADERS_XESL_XESLI_\n#define XENIA_UI_SHADERS_XESL_XESLI_\n\n// SHADING_LANGUAGE_GLSL/HLSL/MSL_XE 1 is expected to be defined via compiler\n// arguments.\n\n// Required GLSL extensions:\n// - GL_EXT_control_flow_attributes\n// - GL_EXT_samplerless_texture_functions\n\n// For functions, it's preferable to take the identifiers here from an existing\n// target language, such as GLSL or HLSL, add the `_xe` suffix, rename them from\n// camelCase to snake_case for consistency, and if altering (generalizing or\n// specializing usually) the functionality compared to that of the original\n// function, modify the name accordingly. The preferred name choice from all the\n// shading languages is the name that reflects the functionality the closest,\n// especially if some languages have a narrower input domain (for instance, HLSL\n// has `asuint` that can accept both `float` and `int`, while GLSL has\n// `floatBitsToUint` that accepts only `float` - there are two options here, a\n// `float_bits_to_uint_xe` alias, or `asuint_xe` overloads, but the former\n// describes the operation more precisely, so it's preferred; `lerp_xe` is\n// preferred over `mix_xe` because the former describes how exactly the mixing\n// will be performed), and / or that is the most visually consistent\n// (`float4_xe` over `vec4_xe` because it's a vector of `float`s).\n\n#if SHADING_LANGUAGE_MSL_XE\n  #include <metal_stdlib>\n  using namespace metal;\n#endif\n\n// Vectors.\n\n#if SHADING_LANGUAGE_GLSL_XE\n  #define bool2_xe bvec2\n  #define bool3_xe bvec3\n  #define bool4_xe bvec4\n  #define int2_xe ivec2\n  #define int3_xe ivec3\n  #define int4_xe ivec4\n  #define uint2_xe uvec2\n  #define uint3_xe uvec3\n  #define uint4_xe uvec4\n  #define float2_xe vec2\n  #define float3_xe vec3\n  #define float4_xe vec4\n#else\n  #define bool2_xe bool2\n  #define bool3_xe bool3\n  #define bool4_xe bool4\n  #define int2_xe int2\n  #define int3_xe int3\n  #define int4_xe int4\n  #define uint2_xe uint2\n  #define uint3_xe uint3\n  #define uint4_xe uint4\n  #define float2_xe float2\n  #define float3_xe float3\n  #define float4_xe float4\n#endif  // SHADING_LANGUAGE_GLSL_XE\n\nbool2_xe bool_x2_xe(bool x) { return bool2_xe(x, x); }\nbool3_xe bool_x3_xe(bool x) { return bool3_xe(x, x, x); }\nbool4_xe bool_x4_xe(bool x) { return bool4_xe(x, x, x, x); }\nint2_xe int_x2_xe(int x) { return int2_xe(x, x); }\nint3_xe int_x3_xe(int x) { return int3_xe(x, x, x); }\nint4_xe int_x4_xe(int x) { return int4_xe(x, x, x, x); }\nuint2_xe uint_x2_xe(uint x) { return uint2_xe(x, x); }\nuint3_xe uint_x3_xe(uint x) { return uint3_xe(x, x, x); }\nuint4_xe uint_x4_xe(uint x) { return uint4_xe(x, x, x, x); }\nfloat2_xe float_x2_xe(float x) { return float2_xe(x, x); }\nfloat3_xe float_x3_xe(float x) { return float3_xe(x, x, x); }\nfloat4_xe float_x4_xe(float x) { return float4_xe(x, x, x, x); }\n\n// Declarations.\n//\n// Resource binding is very different between shading languages, so any\n// customizations are fine in it. All binding slots for all APIs, however,\n// should be explicitly specified by the shader for ease of manual lookup and\n// tweaking. They should be alphabetically ordered by the name of the target\n// shading language in the argument lists (GLSL before HLSL). For readability,\n// the `set=` and `binding=` specifiers, and register types and the `space`\n// prefix in HLSL, are exposed to the shader, even though they're redundant.\n//\n// The `_xe_*` suffix (with context-specific suffixes, like `_xe_block`) can be\n// used to create internal derivative identifiers (such as buffer block names\n// from instance names, or separate texture and sampler from a combined\n// texture / sampler for languages not supporting the latter).\n\n// Non-compute shader entry point must be declared as:\n// entry_outputs_begin_xe\n//   - Linked stage outputs.\n//   - Linked system stage outputs (like vertex position).\n//   - System stage outputs.\n// entry_outputs_end_stage_inputs_begin_xe\n//   - Linked stage inputs (vertex attributes, interpolants).\n// entry_stage_inputs_end_bindings_begin_[stage]_xe (vertex, pixel)\n//   Everything here must be separated with entry_binding_next_xe, with no\n//   leading or trailing separators.\n//   - Buffer, texture, sampler bindings.\n// entry_bindings_end_inputs_begin_xe\n// (or entry_bindings_empty_end_inputs_begin_xe if there are no bindings).\n//   Everything here must be separated with entry_input_next_xe, with no leading\n//   or trailing separators.\n//   - entry_in_stage_inputs_xe if any linked stage inputs are used.\n//   - Linked system inputs (like pixel position).\n//   - System inputs.\n// entry_inputs_end_code_begin_xe\n//   - Main function code.\n// entry_code_end_xe\n//\n// Compute shader entry point must be declared as:\n// #define LOCAL_SIZE_X_XE ...\n// #define LOCAL_SIZE_Y_XE ...\n// #define LOCAL_SIZE_Z_XE ...\n// entry_bindings_begin_compute_xe\n//   Everything here must be separated with entry_binding_next_xe, with no\n//   leading or trailing separators.\n//   - Buffer, texture, sampler bindings.\n// entry_bindings_end_inputs_begin_compute_xe\n//   Everything here must be separated with entry_input_next_xe, with no leading\n//   or trailing separators.\n//   - System inputs.\n// entry_inputs_end_code_begin_compute_xe\n//   - Main function code.\n// entry_code_end_compute_xe\n//\n// Bindings are in the entry point because they are passed this way in MSL. For\n// this reason, constant and storage buffer declarations are also split into the\n// declaration itself and the binding (because blocks can't be passed as\n// function arguments in GLSL, for instance, so they must be fully declared\n// before functions referencing them in headers, for example - but in MSL, their\n// structure has to be forward-declared for this purpose, and the reference to\n// the binding should be passed to the function).\n//\n// Note that for the stage inputs / outputs, the order must be the same as in\n// HLSL linkage. For this reason, the position and the fragment coordinate also\n// must be after the stage inputs structure in the input list.\n//\n// Both input / output and binding names may be placed in the global scope in\n// the target language, make sure they don't collide with anything there.\n//\n// In compute shaders, the total group size must not exceed 128 threads (unless\n// the shader is used with the appropriate conditionals), as that's the minimum\n// maxComputeWorkGroupInvocations requirement on Vulkan. 128 threads exactly is\n// the recommended group size overall, especially for shaders not using the\n// group functionality, as it's the maximum wave size supported by DXIL and\n// SPIR-V wave operations, and there are PowerVR GPUs with 128-lane waves, so\n// it provides balance between wave utilization and excess thread (and, on GPUs\n// with smaller waves, wave) count if the size of the actual work domain is not\n// aligned to the group size.\n//\n// System outputs and inputs (declared via the respective entry_out_*_xe and\n// entry_in_*_xe):\n// - Vertex shaders:\n//   - out float4_xe out_position_xe\n//   - in uint in_vertex_id_xe\n// - Pixel shaders:\n//   - in float4_xe in_pixel_coord_xe\n//     in_pixel_coord_xe.w is 1/W if PIXEL_COORD_W_IS_INVERSE_XE, W otherwise.\n// - Compute shaders:\n//   - in uint3_xe in_group_id_xe\n//   - in uint3_xe in_local_thread_id_xe\n//   - in uint3_xe in_global_thread_id_xe\n//   - in uint in_local_thread_index_xe\n#if SHADING_LANGUAGE_GLSL_XE\n  #define entry_out_xe(type, name, index, semantic) \\\n      layout(location=index) out type name;\n  #define entry_out_target_xe(type, name, index) \\\n      layout(location=index) out type name;\n  #define out_xe(name) name\n  #define out_position_xe gl_Position\n  #define entry_in_stage_xe(type, name, index, semantic) \\\n      layout(location=index) in type name;\n  #define entry_bindings_end_inputs_begin_compute_xe                         \\\n      layout(local_size_x=(LOCAL_SIZE_X_XE), local_size_y=(LOCAL_SIZE_Y_XE), \\\n             local_size_z=(LOCAL_SIZE_Z_XE)) in;\n  #define in_xe(name) name\n  #define in_vertex_id_xe (uint(gl_VertexIndex))\n  #define PIXEL_COORD_W_IS_INVERSE_XE 1\n  #define in_pixel_coord_xe gl_FragCoord\n  #define in_group_id_xe gl_WorkGroupID\n  #define in_local_thread_id_xe gl_LocalInvocationID\n  #define in_global_thread_id_xe gl_GlobalInvocationID\n  #define in_local_thread_index_xe gl_LocalInvocationIndex\n  #define entry_inputs_end_code_begin_xe void main() {\n  #define entry_inputs_end_code_begin_compute_xe void main() {\n  #define entry_return_xe return;\n#elif SHADING_LANGUAGE_HLSL_XE\n  #define entry_outputs_begin_xe struct entry_outputs_struct_xe {\n  #define entry_out_xe(type, name, index, semantic) type name : semantic;\n  #define entry_out_target_xe(type, name, index) type name : SV_Target##index;\n  #define out_xe(name) entry_outputs_xe.name\n  #define entry_out_position_xe float4 out_position_var_xe : SV_Position;\n  #define out_position_xe entry_outputs_xe.out_position_var_xe\n  #define entry_outputs_end_stage_inputs_begin_xe \\\n      };                                          \\\n      struct entry_stage_inputs_struct_xe {\n  #define entry_in_stage_xe(type, name, index, semantic) type name : semantic;\n  #define entry_stage_inputs_end_bindings_begin_vertex_xe };\n  #define entry_stage_inputs_end_bindings_begin_pixel_xe };\n  #define entry_bindings_end_inputs_begin_xe entry_outputs_struct_xe main(\n  #define entry_bindings_empty_end_inputs_begin_xe \\\n      entry_outputs_struct_xe main(\n  #define entry_bindings_end_inputs_begin_compute_xe                  \\\n      [numthreads(LOCAL_SIZE_X_XE, LOCAL_SIZE_Y_XE, LOCAL_SIZE_Z_XE)] \\\n      void main(\n  #define entry_input_next_xe ,\n  #define entry_in_stage_inputs_xe \\\n      entry_stage_inputs_struct_xe entry_stage_inputs_xe\n  #define in_xe(name) entry_stage_inputs_xe.name\n  #define entry_in_vertex_id_xe uint in_vertex_id_xe : SV_VertexID\n  #define entry_in_pixel_coord_xe float4_xe in_pixel_coord_xe : SV_Position\n  #define entry_in_group_id_xe uint3_xe in_group_id_xe : SV_GroupID\n  #define entry_in_local_thread_id_xe \\\n      uint3_xe in_local_thread_id_xe : SV_GroupThreadID\n  #define entry_in_global_thread_id_xe \\\n      uint3_xe in_global_thread_id_xe : SV_DispatchThreadID\n  #define entry_in_local_thread_index_xe \\\n      uint in_local_thread_index_xe : SV_GroupIndex\n  #define entry_inputs_end_code_begin_xe \\\n      ) {                                \\\n          entry_outputs_struct_xe entry_outputs_xe;\n  #define entry_inputs_end_code_begin_compute_xe ) {\n  #define entry_return_xe return entry_outputs_xe;\n#elif SHADING_LANGUAGE_MSL_XE\n  #define entry_outputs_begin_xe struct entry_outputs_struct_xe {\n  #define entry_out_xe(type, name, index, semantic) \\\n      type name [[user(semantic)]];\n  #define entry_out_target_xe(type, name, index) type name [[color(index)]];\n  #define out_xe(name) entry_outputs_xe.name\n  #define entry_out_position_xe float4_xe out_position_var_xe [[position]];\n  #define out_position_xe entry_outputs_xe.out_position_var_xe\n  #define entry_outputs_end_stage_inputs_begin_xe \\\n      };                                          \\\n      struct entry_stage_inputs_struct_xe {\n  #define entry_in_stage_xe(type, name, index, semantic) \\\n      type name [[user(semantic)]];\n  #define entry_in_stage_vertex_xe(type, name, index, semantic) \\\n      type name [[attribute(index)]];\n  #define entry_stage_inputs_end_bindings_begin_vertex_xe \\\n      };                                                  \\\n      vertex entry_outputs_struct_xe entry_xe(\n  #define entry_stage_inputs_end_bindings_begin_pixel_xe \\\n      };                                                 \\\n      fragment entry_outputs_struct_xe entry_xe(\n  #define entry_bindings_begin_compute_xe kernel void entry_xe(\n  #define entry_binding_next_xe ,\n  #define entry_bindings_end_inputs_begin_xe ,\n  #define entry_bindings_end_inputs_begin_compute_xe ,\n  #define entry_input_next_xe ,\n  #define entry_in_stage_inputs_xe \\\n      entry_stage_inputs_struct_xe entry_stage_inputs_xe [[stage_in]]\n  #define in_xe(name) entry_stage_inputs_xe.name\n  #define entry_in_vertex_id_xe uint in_vertex_id_xe [[vertex_id]]\n  #define PIXEL_COORD_W_IS_INVERSE_XE 1\n  #define entry_in_pixel_coord_xe float4_xe in_pixel_coord_xe [[position]]\n  #define entry_in_group_id_xe \\\n      uint3_xe in_group_id_xe [[threadgroup_position_in_grid]]\n  #define entry_in_local_thread_id_xe \\\n      uint3_xe in_local_thread_id_xe [[thread_position_in_threadgroup]]\n  #define entry_in_global_thread_id_xe \\\n      uint3_xe in_global_thread_id_xe [[thread_position_in_grid]]\n  #define entry_in_local_thread_index_xe \\\n      uint in_local_thread_index_xe [[thread_index_in_threadgroup]]\n  #define entry_inputs_end_code_begin_xe \\\n      ) {                                \\\n          entry_outputs_struct_xe entry_outputs_xe;\n  #define entry_inputs_end_code_begin_compute_xe ) {\n  #define entry_return_xe return entry_outputs_xe;\n#else\n  #error entry_*_xe not defined for the target language.\n#endif  // SHADING_LANGUAGE_*_XE\n#ifndef entry_outputs_begin_xe\n  #define entry_outputs_begin_xe\n#endif\n#ifndef entry_out_position_xe\n  #define entry_out_position_xe\n#endif\n#ifndef entry_outputs_end_stage_inputs_begin_xe\n  #define entry_outputs_end_stage_inputs_begin_xe\n#endif\n#ifndef entry_in_stage_vertex_xe\n  #define entry_in_stage_vertex_xe(type, name, index, semantic) \\\n      entry_in_stage_xe(type, name, index, semantic)\n#endif\n#ifndef entry_stage_inputs_end_bindings_begin_vertex_xe\n  #define entry_stage_inputs_end_bindings_begin_vertex_xe\n#endif\n#ifndef entry_stage_inputs_end_bindings_begin_pixel_xe\n  #define entry_stage_inputs_end_bindings_begin_pixel_xe\n#endif\n#ifndef entry_bindings_begin_compute_xe\n  #define entry_bindings_begin_compute_xe\n#endif\n#ifndef entry_binding_next_xe\n  #define entry_binding_next_xe\n#endif\n#ifndef entry_bindings_end_inputs_begin_xe\n  #define entry_bindings_end_inputs_begin_xe\n#endif\n#ifndef entry_bindings_empty_end_inputs_begin_xe\n  #define entry_bindings_empty_end_inputs_begin_xe\n#endif\n#ifndef entry_bindings_end_inputs_begin_compute_xe\n  #define entry_bindings_end_inputs_begin_compute_xe\n#endif\n#ifndef entry_input_next_xe\n  #define entry_input_next_xe\n#endif\n#ifndef entry_in_stage_inputs_xe\n  #define entry_in_stage_inputs_xe\n#endif\n#ifndef entry_in_vertex_id_xe\n  #define entry_in_vertex_id_xe\n#endif\n#ifndef entry_in_pixel_coord_xe\n  #define entry_in_pixel_coord_xe\n#endif\n#ifndef entry_in_group_id_xe\n  #define entry_in_group_id_xe\n#endif\n#ifndef entry_in_local_thread_id_xe\n  #define entry_in_local_thread_id_xe\n#endif\n#ifndef entry_in_global_thread_id_xe\n  #define entry_in_global_thread_id_xe\n#endif\n#ifndef entry_in_local_thread_index_xe\n  #define entry_in_local_thread_index_xe\n#endif\n#ifndef entry_code_end_xe\n  #define entry_code_end_xe \\\n        entry_return_xe     \\\n      }\n#endif\n#ifndef entry_code_end_compute_xe\n  #define entry_code_end_compute_xe }\n#endif\n\n// NDC_DIRECTION_Y_XE, assuming a positive viewport height, is:\n// *  1.0 if +out_position_xe.y is towards +in_pixel_coord_xe.y,\n// * -1.0 if +out_position_xe.y is towards -in_pixel_coord_xe.y.\n#if SHADING_LANGUAGE_GLSL_XE\n  #define NDC_DIRECTION_Y_XE 1.0f\n#else\n  #define NDC_DIRECTION_Y_XE -1.0f\n#endif\n\n#if SHADING_LANGUAGE_GLSL_XE\n  // GLSL requires just const for declaring a constant in the global scope.\n  #define static_const_xe const\n#elif SHADING_LANGUAGE_HLSL_XE\n  // HLSL requires static const for declaring a constant in the global scope so\n  // it doesn't go to $Globals instead.\n  #define static_const_xe static const\n#elif SHADING_LANGUAGE_MSL_XE\n  #define static_const_xe constexpr constant\n#else\n  #error static_const_xe not defined for the target language.\n#endif  // SHADING_LANGUAGE_*_XE\n\n#if SHADING_LANGUAGE_GLSL_XE\n  #define block_offset_member_xe(glsl_offset_bytes, hlsl_packoffset, type, \\\n                                 name_element_count)                       \\\n      layout(offset=glsl_offset_bytes) type name_element_count;\n#elif SHADING_LANGUAGE_HLSL_XE\n  #define block_offset_member_xe(glsl_offset_bytes, hlsl_packoffset, type, \\\n                                 name_element_count)                       \\\n      type name_element_count : packoffset(hlsl_packoffset);\n#elif SHADING_LANGUAGE_MSL_XE\n  // Explicit offset is not supported by MSL.\n  #define block_offset_member_xe(glsl_offset_bytes, hlsl_packoffset, type, \\\n                                 name_element_count)                       \\\n      type name_element_count;\n#else\n  #error block_offset_member_xe not defined for the target language.\n#endif  // SHADING_LANGUAGE_*_XE\n\n// Structures of constant and structured buffer bindings must be declared before\n// the entry point declaration.\n\n// Constant buffers and push constants must be manually packed as std140 (which\n// is stricter than HLSL packing) due to the GLSL requirement. This means that\n// 32x4 and 32x3 vectors must start at 16-byte alignment, 32x2 at 8-byte, and a\n// single 32-bit value can be placed immediately after a 32x3 vector (the Vulkan\n// definition of this behavior). Specifically, all alignment padding must be\n// inserted explicitly (or block_offset_member_xe must be used), as by default\n// HLSL doesn't have the alignment requirement, only the rule that elements\n// (array elements, or single non-array members) must not cross 32x4 vector\n// boundaries, so something like float|float3 or float|float2|float will be\n// packed differently in GLSL (float|pad3|float3 or float|pad|float2|float) and\n// HLSL (float|float3 or float|float2|float).\n\n// Constant buffer and push constant member names will be in the global scope in\n// some target languages - they must not collide with anything else there. To\n// access a constant, use constant_xe or push_const_xe.\n\n// Push constants, even though may be spread across multiple constant buffers in\n// the Direct3D 12 API, must be declared in a single structure in XeSL - the\n// reason is that layout qualifiers in GLSL can't be used in regular structures,\n// only in blocks, and sub-blocks can't be declared in a block, so there's no\n// way to create separate identifiers for push constant ranges in GLSL. Though\n// both GLSL and HLSL support anonymous push constants / cbuffers, MSL requires\n// a name for the buffer binding.\n// In GLSL, the offsets in the push constants are global across shader stages.\n// In HLSL, they're local to the specific root constant buffer.\n#if SHADING_LANGUAGE_GLSL_XE\n  #define const_buffer_begin_xe(name, glsl_set, glsl_binding, hlsl_b, \\\n                                hlsl_b_space)                         \\\n      layout(std140, glsl_set, glsl_binding)                          \\\n      uniform name##_xe_block {\n  #define const_buffer_end_xe(name) \\\n      } name;\n  #define constant_xe(const_buffer_name, constant_name) \\\n      const_buffer_name.constant_name\n  #define push_const_begin_xe(hlsl_b, hlsl_b_space) \\\n      layout(push_constant) uniform push_const_block_xe {\n  #define push_const_end_xe \\\n      } push_consts_xe;\n  #define push_const_xe(name) push_consts_xe.name\n#elif SHADING_LANGUAGE_HLSL_XE\n  #define const_buffer_begin_xe(name, glsl_set, glsl_binding, hlsl_b, \\\n                                hlsl_b_space)                         \\\n      cbuffer name : register(hlsl_b, hlsl_b_space) {\n  #define const_buffer_end_xe(name) \\\n      };\n  #define constant_xe(const_buffer_name, constant_name) constant_name\n  #define push_const_begin_xe(hlsl_b, hlsl_b_space) \\\n      cbuffer push_consts_xe : register(hlsl_b, hlsl_b_space) {\n  #define push_const_end_xe \\\n      };\n  #define push_const_xe(name) name\n#elif SHADING_LANGUAGE_MSL_XE\n  #define const_buffer_begin_xe(name, glsl_set, glsl_binding, hlsl_b, \\\n                                hlsl_b_space)                         \\\n      struct name##_xe_struct {\n  #define const_buffer_end_xe(name) \\\n      };\n  #define const_buffer_binding_xe(name, msl_buffer) \\\n      constant name##_xe_struct& name [[msl_buffer]]\n  #define constant_xe(const_buffer_name, constant_name) \\\n      const_buffer_name.constant_name\n  #define push_const_begin_xe(hlsl_b, hlsl_b_space) \\\n      struct push_const_struct_xe {\n  #define push_const_end_xe \\\n      };\n  #define push_const_binding_xe(msl_buffer) \\\n      constant push_const_struct_xe& push_consts_xe [[msl_buffer]]\n  #define push_const_xe(name) push_consts_xe.name\n#else\n  #error Constant buffers not defined for the target language.\n#endif  // SHADING_LANGUAGE_*_XE\n#ifndef const_buffer_binding_xe\n  #define const_buffer_binding_xe(name, msl_buffer)\n#endif\n#ifndef push_const_binding_xe\n  #define push_const_binding_xe(msl_buffer)\n#endif\n\n// Byte buffers represent raw data accessible as `uint` vectors, addressed with\n// a byte offset with some alignment requirement, and implemented as storage\n// buffers on GLSL, byte address buffers on HLSL, and buffer pointers on MSL.\n//\n// These underlying binding types were chosen primarily because of the high\n// range limits they offer, as well as the ability for the compiler and the GPU\n// to take more optimal access paths as it's known that no type conversion would\n// be necessary.\n//\n// In Vulkan, the minimum required `maxStorageBufferRange` is 128 MB, while only\n// 65536 is required for `maxTexelBufferElements`.\n//\n// In Direct3D 11 and 12, the range limit for typed buffers is 2^27 elements\n// (`REQ_BUFFER_RESOURCE_TEXEL_COUNT_2_TO_EXP`), and according to \"Summary of\n// Changes in this Chapter from D3D10 to D3D11.3\" in the chapter 21 \"System\n// Limits on Various Resources\" in the Direct3D 11.3 Functional Specification,\n// this limit also applies to structured buffers. However, the entire resource\n// (up to 2 GB - `REQ_RESOURCE_SIZE_IN_MEGABYTES_EXPRESSION_C_TERM` - in most\n// cases) must be accessible via a byte address buffer.\n//\n// Also, byte address buffers were chosen over structured buffers because 8-byte\n// and 16-byte accesses are common, and the same buffer may need to be accessed\n// with different granularities, however, in Direct3D 11, one buffer can't be\n// accessed with different structure byte strides.\n//\n// Bounds checking is not guaranteed for byte buffers (may be bound via root\n// descriptors on Direct3D 12, and on MSL they're bound as pointers).\n//\n// For 4-aligned byte buffers, loads larger than the alignment of the buffer are\n// supported, with the `u` load expecting the address to be aligned to the\n// buffer alignment, and the `a` load expecting it to be aligned to the size of\n// the loaded data.\n//\n// Declarations of byte buffers (`_declare`) must be outside the entry point,\n// but their bindings (`_binding`) must also be specified in the entry point\n// function signature. This is necessary so byte buffers can be declared and\n// used in header files and in functions declared in them, as they're\n// implemented as buffer blocks in GLSL.\n//\n// The `_impl` definitions are for internal use in this file.\n\n#if SHADING_LANGUAGE_GLSL_XE\n  #define byte_buffer_declare_xe_impl(value_type, name, glsl_set,         \\\n                                      glsl_binding, hlsl_t, hlsl_t_space) \\\n      layout(std430, glsl_set, glsl_binding)                              \\\n      readonly buffer name##_xe_block {                                   \\\n        value_type data[];                                                \\\n      } name;\n  #define byte_buffer_wo_declare_xe_impl(value_type, name, glsl_set,         \\\n                                         glsl_binding, hlsl_t, hlsl_t_space) \\\n      layout(std430, glsl_set, glsl_binding)                                 \\\n      writeonly buffer name##_xe_block {                                     \\\n        value_type data[];                                                   \\\n      } name;\n\n  #define byte_buffer_align4_load4_xe(name, byte_address) \\\n      ((name).data[uint(byte_address) >> 2])\n  #define byte_buffer_align4_load8u_xe(name, byte_address) \\\n      uint2_xe((name).data[uint(byte_address) >> 2],       \\\n               (name).data[(uint(byte_address) >> 2) + 1u])\n  #define byte_buffer_align4_load16u_xe(name, byte_address) \\\n      uint4_xe((name).data[uint(byte_address) >> 2],        \\\n               (name).data[(uint(byte_address) >> 2) + 1u], \\\n               (name).data[(uint(byte_address) >> 2) + 2u], \\\n               (name).data[(uint(byte_address) >> 2) + 3u])\n\n  #define byte_buffer_align8_load8_xe(name, byte_address) \\\n      ((name).data[uint(byte_address) >> 3])\n\n  #define byte_buffer_align16_load16_xe(name, byte_address) \\\n      ((name).data[uint(byte_address) >> 4])\n\n  #define byte_buffer_align4_store4_xe(name, byte_address, value) \\\n      ((name).data[uint(byte_address) >> 2] = (value))\n  #define byte_buffer_align8_store8_xe(name, byte_address, value) \\\n      ((name).data[uint(byte_address) >> 3] = (value))\n  #define byte_buffer_align16_store16_xe(name, byte_address, value) \\\n      ((name).data[uint(byte_address) >> 4] = (value))\n\n#elif SHADING_LANGUAGE_HLSL_XE\n  #define byte_buffer_declare_xe_impl(value_type, name, glsl_set,         \\\n                                      glsl_binding, hlsl_t, hlsl_t_space) \\\n      ByteAddressBuffer name : register(hlsl_t, hlsl_t_space);\n  #define byte_buffer_wo_declare_xe_impl(value_type, name, glsl_set,         \\\n                                         glsl_binding, hlsl_t, hlsl_t_space) \\\n      RWByteAddressBuffer name : register(hlsl_t, hlsl_t_space);\n\n  #define byte_buffer_align4_load4_xe(name, byte_address) \\\n      ((name).Load(uint(byte_address)))\n  #define byte_buffer_align4_load8u_xe(name, byte_address) \\\n      ((name).Load2(uint(byte_address)))\n  #define byte_buffer_align4_load16u_xe(name, byte_address) \\\n      ((name).Load4(uint(byte_address)))\n\n  #define byte_buffer_align8_load8_xe(name, byte_address) \\\n      ((name).Load2(uint(byte_address)))\n\n  #define byte_buffer_align16_load16_xe(name, byte_address) \\\n      ((name).Load4(uint(byte_address)))\n\n  #define byte_buffer_align4_store4_xe(name, byte_address, value) \\\n      ((name).Store(uint(byte_address), value))\n  #define byte_buffer_align8_store8_xe(name, byte_address, value) \\\n      ((name).Store2(uint(byte_address), value))\n  #define byte_buffer_align16_store16_xe(name, byte_address, value) \\\n      ((name).Store4(uint(byte_address), value))\n\n#elif SHADING_LANGUAGE_MSL_XE\n  #define byte_buffer_binding_xe(name, msl_buffer) \\\n      const device char* name [[msl_buffer]]\n  #define byte_buffer_wo_binding_xe(name, msl_buffer) \\\n      device char* name [[msl_buffer]]\n\n  #define byte_buffer_align4_load4_xe(name, byte_address) \\\n      (*reinterpret_cast<const device uint*>(&(name)[(byte_address)]))\n  #define byte_buffer_align4_load8u_xe(name, byte_address)    \\\n      uint2_xe(*reinterpret_cast<const device packed_uint2*>( \\\n                    &(name)[(byte_address)]))\n  #define byte_buffer_align4_load8a_xe(name, byte_address) \\\n      (*reinterpret_cast<const device uint2_xe*>(&(name)[(byte_address)]))\n  #define byte_buffer_align4_load16u_xe(name, byte_address)   \\\n      uint4_xe(*reinterpret_cast<const device packed_uint4*>( \\\n                    &(name)[(byte_address)]))\n  #define byte_buffer_align4_load16a_xe(name, byte_address) \\\n      (*reinterpret_cast<const device uint4_xe*>(&(name)[(byte_address)]))\n\n  #define byte_buffer_align8_load8_xe(name, byte_address) \\\n      (*reinterpret_cast<const device uint2_xe*>(&(name)[(byte_address)]))\n\n  #define byte_buffer_align16_load16_xe(name, byte_address) \\\n      (*reinterpret_cast<const device uint4_xe*>(&(name)[(byte_address)]))\n\n  #define byte_buffer_align4_store4_xe(name, byte_address, value) \\\n      (*reinterpret_cast<device uint*>(&(name)[(byte_address)]) = (value))\n  #define byte_buffer_align8_store8_xe(name, byte_address, value) \\\n      (*reinterpret_cast<device uint2_xe*>(&(name)[(byte_address)]) = (value))\n  #define byte_buffer_align16_store16_xe(name, byte_address, value) \\\n      (*reinterpret_cast<device uint4_xe*>(&(name)[(byte_address)]) = (value))\n\n#else\n  #error Byte buffers not defined for the target language.\n#endif  // SHADING_LANGUAGE_*_XE\n\n#ifndef byte_buffer_declare_xe_impl\n  #define byte_buffer_declare_xe_impl(value_type, name, glsl_set, \\\n                                      glsl_binding, hlsl_t, hlsl_t_space)\n#endif\n#ifndef byte_buffer_binding_xe\n  #define byte_buffer_binding_xe(name, msl_buffer)\n#endif\n#ifndef byte_buffer_wo_declare_xe_impl\n  #define byte_buffer_wo_declare_xe_impl(value_type, name, glsl_set, \\\n                                         glsl_binding, hlsl_t, hlsl_t_space)\n#endif\n#ifndef byte_buffer_wo_binding_xe\n  #define byte_buffer_wo_binding_xe(name, msl_buffer)\n#endif\n\n#ifndef byte_buffer_align4_declare_xe\n  #define byte_buffer_align4_declare_xe(name, glsl_set, glsl_binding, hlsl_t, \\\n                                        hlsl_t_space)                         \\\n      byte_buffer_declare_xe_impl(uint, name, glsl_set, glsl_binding, hlsl_t, \\\n                                  hlsl_t_space)\n#endif\n#ifndef byte_buffer_align4_wo_declare_xe\n  #define byte_buffer_align4_wo_declare_xe(name, glsl_set, glsl_binding,     \\\n                                           hlsl_t, hlsl_t_space)             \\\n      byte_buffer_wo_declare_xe_impl(uint, name, glsl_set, glsl_binding,     \\\n                                     hlsl_t, hlsl_t_space)\n#endif\n\n#ifndef byte_buffer_align8_declare_xe\n  #define byte_buffer_align8_declare_xe(name, glsl_set, glsl_binding, hlsl_t, \\\n                                        hlsl_t_space)                         \\\n      byte_buffer_declare_xe_impl(uint2_xe, name, glsl_set, glsl_binding,     \\\n                                  hlsl_t, hlsl_t_space)\n#endif\n#ifndef byte_buffer_align8_wo_declare_xe\n  #define byte_buffer_align8_wo_declare_xe(name, glsl_set, glsl_binding,     \\\n                                           hlsl_t, hlsl_t_space)             \\\n      byte_buffer_wo_declare_xe_impl(uint2_xe, name, glsl_set, glsl_binding, \\\n                                     hlsl_t, hlsl_t_space)\n#endif\n\n#ifndef byte_buffer_align16_declare_xe\n  #define byte_buffer_align16_declare_xe(name, glsl_set, glsl_binding, hlsl_t, \\\n                                         hlsl_t_space)                         \\\n      byte_buffer_declare_xe_impl(uint4_xe, name, glsl_set, glsl_binding,      \\\n                                  hlsl_t, hlsl_t_space)\n#endif\n#ifndef byte_buffer_align16_wo_declare_xe\n  #define byte_buffer_align16_wo_declare_xe(name, glsl_set, glsl_binding,     \\\n                                            hlsl_t, hlsl_t_space)             \\\n      byte_buffer_wo_declare_xe_impl(uint4_xe, name, glsl_set, glsl_binding, \\\n                                     hlsl_t, hlsl_t_space)\n#endif\n\n#ifndef byte_buffer_align4_load8a_xe\n  #define byte_buffer_align4_load8a_xe byte_buffer_align4_load8u_xe\n#endif\n#ifndef byte_buffer_align4_load16a_xe\n  #define byte_buffer_align4_load16a_xe byte_buffer_align4_load16u_xe\n#endif\n\n// Buffer, texture, sampler and image bindings must be in the entry point\n// bindings declaration.\n// - texture_xe is a separate texture.\n// - sampler_state_xe a separate sampler.\n// - sampler_xe is a combined texture / sampler where available, internally\n//   separate where not.\n#if SHADING_LANGUAGE_GLSL_XE\n  #define COMBINED_TEXTURE_SAMPLER_XE 1\n  // Types.\n  #define texture_buffer_xe textureBuffer\n  #define texture_buffer_uint_xe utextureBuffer\n  #define texture_2d_xe texture2D\n  #define texture_2d_ms_xe texture2DMS\n  #define sampler_2d_xe sampler2D\n  #define image_2d_xe image2D\n  #define image_format_rgb10_a2_xe rgb10_a2\n  #define image_format_rgba16f_xe rgba16f\n  // Binding declarations.\n  #define texture_xe(texture_type, name, glsl_set, glsl_binding, hlsl_t, \\\n                     hlsl_t_space, msl_texture)                          \\\n      layout(glsl_set, glsl_binding) uniform texture_type name;\n  #define sampler_state_xe(name, glsl_set, glsl_binding, hlsl_s, hlsl_s_space, \\\n                           msl_sampler)                                        \\\n      layout(glsl_set, glsl_binding) uniform sampler name;\n  #define sampler_xe(sampler_type, name, glsl_set, glsl_binding, hlsl_t, \\\n                     hlsl_t_space, hlsl_s, hlsl_s_space, msl_texture,    \\\n                     msl_sampler)                                        \\\n      layout(glsl_set, glsl_binding) uniform sampler_type name;\n  #define image_wo_xe(type, format, name, glsl_set, glsl_binding, hlsl_u, \\\n                      hlsl_u_space, msl_texture)                          \\\n      layout(format, glsl_set, glsl_binding) uniform writeonly type name;\n  // Fetching and storing.\n  #define texel_fetch_buffer_xe(texture_name, position) \\\n      texelFetch(texture_name, int(position))\n  #define texel_fetch_2d_xe(texture_name, position, lod) \\\n      texelFetch(texture_name, int2_xe(position), int(lod))\n  #define texel_fetch_2d_ms_xe(texture_name, position, sample_index) \\\n      texelFetch(texture_name, int2_xe(position), int(sample_index))\n  #define sample_sep_lod_2d_xe(texture_name, sampler_name, position, lod) \\\n      textureLod(sampler2D(texture_name, sampler_name), position, lod)\n  #define sample_comb_lod_2d_xe(texture_sampler_name, position, lod) \\\n      textureLod(texture_sampler_name, position, lod)\n  #define gather_sep_2d_r_xe(texture_name, sampler_name, position) \\\n      textureGather(sampler2D(texture_name, sampler_name), position, 0)\n  #define gather_sep_2d_g_xe(texture_name, sampler_name, position) \\\n      textureGather(sampler2D(texture_name, sampler_name), position, 1)\n  #define gather_sep_2d_b_xe(texture_name, sampler_name, position) \\\n      textureGather(sampler2D(texture_name, sampler_name), position, 2)\n  #define gather_sep_2d_a_xe(texture_name, sampler_name, position) \\\n      textureGather(sampler2D(texture_name, sampler_name), position, 3)\n  #define gather_comb_2d_r_xe(texture_sampler_name, position) \\\n      textureGather(texture_sampler_name, position, 0)\n  #define gather_comb_2d_g_xe(texture_sampler_name, position) \\\n      textureGather(texture_sampler_name, position, 1)\n  #define gather_comb_2d_b_xe(texture_sampler_name, position) \\\n      textureGather(texture_sampler_name, position, 2)\n  #define gather_comb_2d_a_xe(texture_sampler_name, position) \\\n      textureGather(texture_sampler_name, position, 3)\n  #define image_store_2d_rgba_xe(name, position, data) \\\n      imageStore(name, int2_xe(position), data)\n#elif SHADING_LANGUAGE_HLSL_XE\n  // Types.\n  #define texture_buffer_xe Buffer<float4_xe>\n  #define texture_buffer_uint_xe Buffer<uint4_xe>\n  #define texture_2d_xe Texture2D<float4_xe>\n  #define texture_2d_ms_xe Texture2DMS<float4_xe>\n  #define image_2d_xe RWTexture2D\n  #define image_format_rgb10_a2_xe unorm float4\n  #define image_format_rgba16f_xe float4\n  // Binding declarations.\n  #define texture_xe(texture_type, name, glsl_set, glsl_binding, hlsl_t, \\\n                     hlsl_t_space, msl_texture)                          \\\n      texture_type name : register(hlsl_t, hlsl_t_space);\n  #define sampler_state_xe(name, glsl_set, glsl_binding, hlsl_s, hlsl_s_space, \\\n                           msl_sampler)                                        \\\n      SamplerState name : register(hlsl_s, hlsl_s_space);\n  #define image_wo_xe(type, format, name, glsl_set, glsl_binding, hlsl_u, \\\n                      hlsl_u_space, msl_texture)                          \\\n      type<format> name : register(hlsl_u, hlsl_u_space);\n  // Fetching and storing.\n  #define texel_fetch_buffer_xe(texture_name, position) \\\n      ((texture_name).Load(int(position)))\n  #define texel_fetch_2d_xe(texture_name, position, lod) \\\n      ((texture_name).Load(int3_xe(position, lod)))\n  #define texel_fetch_2d_ms_xe(texture_name, position, sample_index) \\\n      ((texture_name).Load(int2_xe(position), int(sample_index)))\n  #define sample_sep_lod_2d_xe(texture_name, sampler_name, position, lod) \\\n      ((texture_name).SampleLevel(sampler_name, position, lod))\n  #define gather_sep_2d_r_xe(texture_name, sampler_name, position) \\\n      ((texture_name).GatherRed(sampler_name, position))\n  #define gather_sep_2d_g_xe(texture_name, sampler_name, position) \\\n      ((texture_name).GatherGreen(sampler_name, position))\n  #define gather_sep_2d_b_xe(texture_name, sampler_name, position) \\\n      ((texture_name).GatherBlue(sampler_name, position))\n  #define gather_sep_2d_a_xe(texture_name, sampler_name, position) \\\n      ((texture_name).GatherAlpha(sampler_name, position))\n  #define image_store_2d_rgba_xe(name, position, data) \\\n      ((name)[int2_xe(position)] = (data))\n#elif SHADING_LANGUAGE_MSL_XE\n  // Types.\n  #define texture_buffer_xe texture_buffer<float>\n  #define texture_buffer_uint_xe texture_buffer<uint>\n  #define texture_2d_xe texture2d<float>\n  #define texture_2d_ms_xe texture2d_ms<float>\n  #define image_2d_xe texture2d\n  #define image_format_rgb10_a2_xe float\n  #define image_format_rgba16f_xe float\n  // Binding declarations.\n  #define texture_xe(texture_type, name, glsl_set, glsl_binding, hlsl_t, \\\n                     hlsl_t_space, msl_texture)                          \\\n      texture_type name [[msl_texture]]\n  #define sampler_state_xe(name, glsl_set, glsl_binding, hlsl_s, hlsl_s_space, \\\n                           msl_sampler)                                        \\\n      sampler name [[msl_sampler]]\n  #define image_wo_xe(type, format, name, glsl_set, glsl_binding, hlsl_u, \\\n                      hlsl_u_space, msl_texture)                          \\\n      type<format, access::write> name [[msl_texture]]\n  // Fetching and storing.\n  #define texel_fetch_buffer_xe(texture_name, position) \\\n      ((texture_name).read(uint(position)))\n  #define texel_fetch_2d_xe(texture_name, position, lod) \\\n      ((texture_name).read(uint2_xe(position), uint(lod)))\n  #define texel_fetch_2d_ms_xe(texture_name, position, sample_index) \\\n      ((texture_name).read(uint2_xe(position), uint(sample_index)))\n  #define sample_sep_lod_2d_xe(texture_name, sampler_name, position, lod) \\\n      ((texture_name).sample(sampler_name, position, level(lod)))\n  #define gather_sep_2d_r_xe(texture_name, sampler_name, position) \\\n      ((texture_name).gather(sampler_name, position, int2_xe(0), component::x))\n  #define gather_sep_2d_g_xe(texture_name, sampler_name, position) \\\n      ((texture_name).gather(sampler_name, position, int2_xe(0), component::y))\n  #define gather_sep_2d_b_xe(texture_name, sampler_name, position) \\\n      ((texture_name).gather(sampler_name, position, int2_xe(0), component::z))\n  #define gather_sep_2d_a_xe(texture_name, sampler_name, position) \\\n      ((texture_name).gather(sampler_name, position, int2_xe(0), component::w))\n  #define image_store_2d_rgba_xe(name, position, data) \\\n      ((name).write(data, uint2_xe(position)))\n#else\n  #error Buffers and textures not defined for the target language.\n#endif  // SHADING_LANGUAGE_*_XE\n// If there's no language specialization doing this already, implement combined\n// textures / samplers as separate, with the `_xe_sampler` suffix for samplers.\n// The sampler types become the texture types.\n#if !COMBINED_TEXTURE_SAMPLER_XE\n  #ifndef sampler_2d_xe\n    #define sampler_2d_xe texture_2d_xe\n  #endif\n  #ifndef sampler_xe\n    #define sampler_xe(sampler_type, name, glsl_set, glsl_binding, hlsl_t,   \\\n                       hlsl_t_space, hlsl_s, hlsl_s_space, msl_texture,      \\\n                       msl_sampler)                                          \\\n        texture_xe(sampler_type, name, glsl_set, glsl_binding, hlsl_t,       \\\n                   hlsl_t_space, msl_texture)                                \\\n        entry_binding_next_xe                                                \\\n        sampler_state_xe(name##_xe_sampler, glsl_set, glsl_binding, hlsl_s, \\\n                         hlsl_s_space, msl_sampler)\n  #endif\n  #ifndef sample_comb_lod_2d_xe\n    #define sample_comb_lod_2d_xe(texture_sampler_name, position, lod)         \\\n        sample_sep_lod_2d_xe(texture_sampler_name,                             \\\n                             texture_sampler_name##_xe_sampler, position, lod)\n  #endif\n  #ifndef gather_comb_2d_r_xe\n    #define gather_comb_2d_r_xe(texture_sampler_name, position) \\\n        gather_sep_2d_r_xe(texture_sampler_name,                \\\n                           texture_sampler_name##_xe_sampler, position)\n  #endif\n  #ifndef gather_comb_2d_g_xe\n    #define gather_comb_2d_g_xe(texture_sampler_name, position) \\\n        gather_sep_2d_g_xe(texture_sampler_name,                \\\n                           texture_sampler_name##_xe_sampler, position)\n  #endif\n  #ifndef gather_comb_2d_b_xe\n    #define gather_comb_2d_b_xe(texture_sampler_name, position) \\\n        gather_sep_2d_b_xe(texture_sampler_name,                \\\n                           texture_sampler_name##_xe_sampler, position)\n  #endif\n  #ifndef gather_comb_2d_a_xe\n    #define gather_comb_2d_a_xe(texture_sampler_name, position) \\\n        gather_sep_2d_a_xe(texture_sampler_name,                \\\n                           texture_sampler_name##_xe_sampler, position)\n  #endif\n#endif  // !COMBINED_TEXTURE_SAMPLER_XE\n\n// Passing bindings to functions, and also output and input / output parameters.\n\n#if SHADING_LANGUAGE_MSL_XE\n  #define out_param_xe(type, name) thread type& name\n  #define inout_param_xe(type, name) thread type& name\n#else\n  #define out_param_xe(type, name) out type name\n  #define inout_param_xe(type, name) inout type name\n#endif  // SHADING_LANGUAGE_MSL_XE\n\n#if SHADING_LANGUAGE_MSL_XE\n  // Prototype parameters.\n  #define param_const_buffer_xe(name) constant name##_xe_struct& name\n  #define param_next_after_const_buffer_xe ,\n  #define param_push_consts_xe constant push_const_struct_xe& push_consts_xe\n  #define param_next_after_push_consts_xe ,\n  #define param_byte_buffer_xe(name) const device char* name\n  #define param_byte_buffer_wo_xe(name) device char* name\n  #define param_next_after_byte_buffer_xe ,\n  // Call arguments.\n  #define pass_const_buffer_xe(name) (name)\n  #define pass_next_after_const_buffer_xe ,\n  #define pass_push_consts_xe push_consts_xe\n  #define pass_next_after_push_consts_xe ,\n  #define pass_byte_buffer_xe(name) (name)\n  #define pass_next_after_byte_buffer_xe ,\n#endif  // SHADING_LANGUAGE_*_XE\n\n// Prototype parameters.\n#ifndef param_const_buffer_xe\n  #define param_const_buffer_xe(name)\n#endif\n#ifndef param_next_after_const_buffer_xe\n  #define param_next_after_const_buffer_xe\n#endif\n#ifndef param_push_consts_xe\n  #define param_push_consts_xe\n#endif\n#ifndef param_next_after_push_consts_xe\n  #define param_next_after_push_consts_xe\n#endif\n#ifndef param_byte_buffer_xe\n  #define param_byte_buffer_xe(name)\n#endif\n#ifndef param_byte_buffer_wo_xe\n  #define param_byte_buffer_wo_xe(name)\n#endif\n#ifndef param_next_after_byte_buffer_xe\n  #define param_next_after_byte_buffer_xe\n#endif\n// Call arguments.\n#ifndef pass_const_buffer_xe\n  #define pass_const_buffer_xe(name)\n#endif\n#ifndef pass_next_after_const_buffer_xe\n  #define pass_next_after_const_buffer_xe\n#endif\n#ifndef pass_push_consts_xe\n  #define pass_push_consts_xe\n#endif\n#ifndef pass_next_after_push_consts_xe\n  #define pass_next_after_push_consts_xe\n#endif\n#ifndef pass_byte_buffer_xe\n  #define pass_byte_buffer_xe(name)\n#endif\n#ifndef pass_next_after_byte_buffer_xe\n  #define pass_next_after_byte_buffer_xe\n#endif\n\n// Attributes.\n\n#if SHADING_LANGUAGE_GLSL_XE\n  #define unroll_xe [[unroll]]\n  #define dont_unroll [[dont_unroll]]\n  #define flatten_xe [[flatten]]\n  #define dont_flatten_xe [[dont_flatten]]\n#elif SHADING_LANGUAGE_HLSL_XE\n  #define unroll_xe [unroll]\n  #define dont_unroll [loop]\n  #define flatten_xe [flatten]\n  #define dont_flatten_xe [branch]\n#endif  // SHADING_LANGUAGE_*_XE\n#ifndef unroll_xe\n  #define unroll_xe\n#endif\n#ifndef dont_unroll\n  #define dont_unroll\n#endif\n#ifndef flatten_xe\n  #define flatten_xe\n#endif\n#ifndef dont_flatten_xe\n  #define dont_flatten_xe\n#endif\n\n// Function aliases.\n\n#if SHADING_LANGUAGE_GLSL_XE\n  #define less_than_xe lessThan\n  #define less_than_equal_xe lessThanEqual\n  #define greater_than_xe greaterThan\n  #define greater_than_equal_xe greaterThanEqual\n  #define equal_xe equal\n  #define not_equal_xe notEqual\n  #define not_xe not\n#else\n  #define less_than_xe(x, y) ((x) < (y))\n  #define less_than_equal_xe(x, y) ((x) <= (y))\n  #define greater_than_xe(x, y) ((x) > (y))\n  #define greater_than_equal_xe(x, y) ((x) >= (y))\n  #define equal_xe(x, y) ((x) == (y))\n  #define not_equal_xe(x, y) ((x) != (y))\n  #define not_xe(x) (!(x))\n#endif  // SHADING_LANGUAGE_GLSL_XE\n\n#if SHADING_LANGUAGE_GLSL_XE\n  #define select_xe(condition, true_result, false_result) \\\n      mix(false_result, true_result, condition)\n#elif SHADING_LANGUAGE_HLSL_XE\n  #define select_xe(condition, true_result, false_result) \\\n      ((condition) ? (true_result) : (false_result))\n#elif SHADING_LANGUAGE_MSL_XE\n  #define select_xe(condition, true_result, false_result) \\\n      select(false_result, true_result, condition)\n#else\n  #error select_xe not defined for the target language.\n#endif  // SHADING_LANGUAGE_*_XE\n\n#if SHADING_LANGUAGE_GLSL_XE\n  #define float_bits_to_int_xe floatBitsToInt\n  #define float_bits_to_uint_xe floatBitsToUint\n  #define int_bits_to_float_xe intBitsToFloat\n  #define uint_bits_to_float_xe uintBitsToFloat\n#elif SHADING_LANGUAGE_HLSL_XE\n  // Using functions instead of #define for implicit argument conversion.\n  int float_bits_to_int_xe(float value) { return asint(value); }\n  int2_xe float_bits_to_int_xe(float2_xe value) { return asint(value); }\n  int3_xe float_bits_to_int_xe(float3_xe value) { return asint(value); }\n  int4_xe float_bits_to_int_xe(float4_xe value) { return asint(value); }\n  uint float_bits_to_uint_xe(float value) { return asuint(value); }\n  uint2_xe float_bits_to_uint_xe(float2_xe value) { return asuint(value); }\n  uint3_xe float_bits_to_uint_xe(float3_xe value) { return asuint(value); }\n  uint4_xe float_bits_to_uint_xe(float4_xe value) { return asuint(value); }\n  float int_bits_to_float_xe(int value) { return asfloat(value); }\n  float2_xe int_bits_to_float_xe(int2_xe value) { return asfloat(value); }\n  float3_xe int_bits_to_float_xe(int3_xe value) { return asfloat(value); }\n  float4_xe int_bits_to_float_xe(int4_xe value) { return asfloat(value); }\n  float uint_bits_to_float_xe(uint value) { return asfloat(value); }\n  float2_xe uint_bits_to_float_xe(uint2_xe value) { return asfloat(value); }\n  float3_xe uint_bits_to_float_xe(uint3_xe value) { return asfloat(value); }\n  float4_xe uint_bits_to_float_xe(uint4_xe value) { return asfloat(value); }\n#elif SHADING_LANGUAGE_MSL_XE\n  // Using functions instead of #define for implicit argument conversion.\n  int float_bits_to_int_xe(float value) {\n    return as_type<int>(value);\n  }\n  int2_xe float_bits_to_int_xe(float2_xe value) {\n    return as_type<int2_xe>(value);\n  }\n  int3_xe float_bits_to_int_xe(float3_xe value) {\n    return as_type<int3_xe>(value);\n  }\n  int4_xe float_bits_to_int_xe(float4_xe value) {\n    return as_type<int4_xe>(value);\n  }\n  uint float_bits_to_uint_xe(float value) {\n    return as_type<uint>(value);\n  }\n  uint2_xe float_bits_to_uint_xe(float2_xe value) {\n    return as_type<uint2_xe>(value);\n  }\n  uint3_xe float_bits_to_uint_xe(float3_xe value) {\n    return as_type<uint3_xe>(value);\n  }\n  uint4_xe float_bits_to_uint_xe(float4_xe value) {\n    return as_type<uint4_xe>(value);\n  }\n  float int_bits_to_float_xe(int value) {\n    return as_type<float>(value);\n  }\n  float2_xe int_bits_to_float_xe(int2_xe value) {\n    return as_type<float2_xe>(value);\n  }\n  float3_xe int_bits_to_float_xe(int3_xe value) {\n    return as_type<float3_xe>(value);\n  }\n  float4_xe int_bits_to_float_xe(int4_xe value) {\n    return as_type<float4_xe>(value);\n  }\n  float uint_bits_to_float_xe(uint value) {\n    return as_type<float>(value);\n  }\n  float2_xe uint_bits_to_float_xe(uint2_xe value) {\n    return as_type<float2_xe>(value);\n  }\n  float3_xe uint_bits_to_float_xe(uint3_xe value) {\n    return as_type<float3_xe>(value);\n  }\n  float4_xe uint_bits_to_float_xe(uint4_xe value) {\n    return as_type<float4_xe>(value);\n  }\n#else\n  #error Float bit casting not defined for the target language.\n#endif  // SHADING_LANGUAGE_*_XE\n\n#if SHADING_LANGUAGE_GLSL_XE\n  float saturate_xe(float value) {\n    return clamp(value, 0.0f, 1.0f);\n  }\n  float2_xe saturate_xe(float2_xe value) {\n    return clamp(value, float_x2_xe(0.0f), float_x2_xe(1.0f));\n  }\n  float3_xe saturate_xe(float3_xe value) {\n    return clamp(value, float_x3_xe(0.0f), float_x3_xe(1.0f));\n  }\n  float4_xe saturate_xe(float4_xe value) {\n    return clamp(value, float_x4_xe(0.0f), float_x4_xe(1.0f));\n  }\n#else\n  #define saturate_xe saturate\n#endif  // SHADING_LANGUAGE_GLSL_XE\n\n// Returning a unsigned integer vector. The result is undefined for zero.\n#if SHADING_LANGUAGE_GLSL_XE\n  uint first_one_bit_low_xe(int value) {\n    return uint(findLSB(value));\n  }\n  uint2_xe first_one_bit_low_xe(int2_xe value) {\n    return uint2_xe(findLSB(value));\n  }\n  uint3_xe first_one_bit_low_xe(int3_xe value) {\n    return uint3_xe(findLSB(value));\n  }\n  uint4_xe first_one_bit_low_xe(int4_xe value) {\n    return uint4_xe(findLSB(value));\n  }\n  uint first_one_bit_low_xe(uint value) {\n    return uint(findLSB(value));\n  }\n  uint2_xe first_one_bit_low_xe(uint2_xe value) {\n    return uint2_xe(findLSB(value));\n  }\n  uint3_xe first_one_bit_low_xe(uint3_xe value) {\n    return uint3_xe(findLSB(value));\n  }\n  uint4_xe first_one_bit_low_xe(uint4_xe value) {\n    return uint4_xe(findLSB(value));\n  }\n  // GLSL findMSB finds the highest 0 for a negative value.\n  uint first_one_bit_high_xe(int value) {\n    return uint(findMSB(uint(value)));\n  }\n  uint2_xe first_one_bit_high_xe(int2_xe value) {\n    return uint2_xe(findMSB(uint2_xe(value)));\n  }\n  uint3_xe first_one_bit_high_xe(int3_xe value) {\n    return uint3_xe(findMSB(uint3_xe(value)));\n  }\n  uint4_xe first_one_bit_high_xe(int4_xe value) {\n    return uint4_xe(findMSB(uint4_xe(value)));\n  }\n  uint first_one_bit_high_xe(uint value) {\n    return uint(findMSB(value));\n  }\n  uint2_xe first_one_bit_high_xe(uint2_xe value) {\n    return uint2_xe(findMSB(value));\n  }\n  uint3_xe first_one_bit_high_xe(uint3_xe value) {\n    return uint3_xe(findMSB(value));\n  }\n  uint4_xe first_one_bit_high_xe(uint4_xe value) {\n    return uint4_xe(findMSB(value));\n  }\n#elif SHADING_LANGUAGE_HLSL_XE\n  uint first_one_bit_low_xe(int value) {\n    return uint(firstbitlow(value));\n  }\n  uint2_xe first_one_bit_low_xe(int2_xe value) {\n    return uint2_xe(firstbitlow(value));\n  }\n  uint3_xe first_one_bit_low_xe(int3_xe value) {\n    return uint3_xe(firstbitlow(value));\n  }\n  uint4_xe first_one_bit_low_xe(int4_xe value) {\n    return uint4_xe(firstbitlow(value));\n  }\n  uint first_one_bit_low_xe(uint value) {\n    return firstbitlow(value);\n  }\n  uint2_xe first_one_bit_low_xe(uint2_xe value) {\n    return firstbitlow(value);\n  }\n  uint3_xe first_one_bit_low_xe(uint3_xe value) {\n    return firstbitlow(value);\n  }\n  uint4_xe first_one_bit_low_xe(uint4_xe value) {\n    return firstbitlow(value);\n  }\n  // HLSL firstbithigh finds the highest 0 for a negative value.\n  uint first_one_bit_high_xe(int value) {\n    return uint(firstbithigh(uint(value)));\n  }\n  uint2_xe first_one_bit_high_xe(int2_xe value) {\n    return uint2_xe(firstbithigh(uint2_xe(value)));\n  }\n  uint3_xe first_one_bit_high_xe(int3_xe value) {\n    return uint3_xe(firstbithigh(uint3_xe(value)));\n  }\n  uint4_xe first_one_bit_high_xe(int4_xe value) {\n    return uint4_xe(firstbithigh(uint4_xe(value)));\n  }\n  uint first_one_bit_high_xe(uint value) {\n    return firstbithigh(value);\n  }\n  uint2_xe first_one_bit_high_xe(uint2_xe value) {\n    return firstbithigh(value);\n  }\n  uint3_xe first_one_bit_high_xe(uint3_xe value) {\n    return firstbithigh(value);\n  }\n  uint4_xe first_one_bit_high_xe(uint4_xe value) {\n    return firstbithigh(value);\n  }\n#elif SHADING_LANGUAGE_MSL_XE\n  uint first_one_bit_low_xe(int value) {\n    return uint(ctz(value));\n  }\n  uint2_xe first_one_bit_low_xe(int2_xe value) {\n    return uint2_xe(ctz(value));\n  }\n  uint3_xe first_one_bit_low_xe(int3_xe value) {\n    return uint3_xe(ctz(value));\n  }\n  uint4_xe first_one_bit_low_xe(int4_xe value) {\n    return uint4_xe(ctz(value));\n  }\n  uint first_one_bit_low_xe(uint value) {\n    return ctz(value);\n  }\n  uint2_xe first_one_bit_low_xe(uint2_xe value) {\n    return ctz(value);\n  }\n  uint3_xe first_one_bit_low_xe(uint3_xe value) {\n    return ctz(value);\n  }\n  uint4_xe first_one_bit_low_xe(uint4_xe value) {\n    return ctz(value);\n  }\n  uint first_one_bit_high_xe(int value) {\n    return 32u - uint(clz(value));\n  }\n  uint2_xe first_one_bit_high_xe(int2_xe value) {\n    return uint_x2_xe(32u) - uint2_xe(clz(value));\n  }\n  uint3_xe first_one_bit_high_xe(int3_xe value) {\n    return uint_x3_xe(32u) - uint3_xe(clz(value));\n  }\n  uint4_xe first_one_bit_high_xe(int4_xe value) {\n    return uint_x4_xe(32u) - uint4_xe(clz(value));\n  }\n  uint first_one_bit_high_xe(uint value) {\n    return 32u - clz(value);\n  }\n  uint2_xe first_one_bit_high_xe(uint2_xe value) {\n    return uint_x2_xe(32u) - clz(value);\n  }\n  uint3_xe first_one_bit_high_xe(uint3_xe value) {\n    return uint_x3_xe(32u) - clz(value);\n  }\n  uint4_xe first_one_bit_high_xe(uint4_xe value) {\n    return uint_x4_xe(32u) - clz(value);\n  }\n#else\n  #error Bit count operations not defined for the target language.\n#endif  // SHADING_LANGUAGE_*_XE\n\n#if SHADING_LANGUAGE_GLSL_XE\n  #define pack_half_2x16_xe packHalf2x16\n  #define unpack_half_2x16_xe unpackHalf2x16\n#elif SHADING_LANGUAGE_HLSL_XE\n  uint pack_half_2x16_xe(float2_xe value) {\n    return f32tof16(value.x) | (f32tof16(value.y) << 16u);\n  }\n  float2_xe unpack_half_2x16_xe(uint value) {\n    return f16tof32(uint_x2_xe(value) >> uint2_xe(0u, 16u));\n  }\n#elif SHADING_LANGUAGE_MSL_XE\n  uint pack_half_2x16_xe(float2_xe value) {\n    return uint(as_type<ushort>(half(value.x))) |\n           (uint(as_type<ushort>(half(value.y))) << 16u);\n  }\n  float2_xe unpack_half_2x16_xe(uint value) {\n    return float2_xe(as_type<half2>(ushort2(uint_x2_xe(value) >>\n                                            uint2_xe(0u, 16u))));\n  }\n#else\n  #error pack_half_2x16_xe not defined for the target language.\n#endif  // SHADING_LANGUAGE_*_XE\n\n#endif  // XENIA_UI_SHADERS_XESL_XESLI_\n"
  },
  {
    "path": "src/xenia/ui/surface.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_SURFACE_H_\n#define XENIA_UI_SURFACE_H_\n\n#include <cstdint>\n\n#include \"xenia/base/assert.h\"\n\nnamespace xe {\nnamespace ui {\n\n// Represents a surface that presenting can be performed to.\n// Surface methods can be called only from the UI thread.\n\nclass Surface {\n public:\n  enum TypeIndex {\n    // Within one platform, the more preferable surface types are earlier in\n    // this enumeration, so xe::bit_scan_forward can be used to try creating\n    // surfaces of all types supported by both the graphics provider and the\n    // window.\n    // Android.\n    kTypeIndex_AndroidNativeWindow,\n    // GNU/Linux.\n    kTypeIndex_XcbWindow,\n    // Windows.\n    kTypeIndex_Win32Hwnd,\n  };\n  using TypeFlags = uint32_t;\n  enum : TypeFlags {\n    kTypeFlag_AndroidNativeWindow = TypeFlags(1)\n                                    << kTypeIndex_AndroidNativeWindow,\n    kTypeFlag_XcbWindow = TypeFlags(1) << kTypeIndex_XcbWindow,\n    kTypeFlag_Win32Hwnd = TypeFlags(1) << kTypeIndex_Win32Hwnd,\n  };\n\n  Surface(const Surface& surface) = delete;\n  Surface& operator=(const Surface& surface) = delete;\n  virtual ~Surface() = default;\n\n  virtual TypeIndex GetType() const = 0;\n\n  // Returns the up-to-date size (and true), or zeros (and false) if not ready\n  // to open a presentation connection yet. The size preferably should be\n  // exactly the dimensions of the surface in physical pixels of the display\n  // (without stretching performed by the platform's composition), but even if\n  // stretching happens, it is required that surface pixels have 1:1 aspect\n  // ratio relatively to the physical display.\n  bool GetSize(uint32_t& width_out, uint32_t& height_out) {\n    // If any dimension is 0 (like, resized completely to zero in one direction,\n    // but not in another), the surface is zero-area - don't try to present to\n    // it.\n    uint32_t width, height;\n    if (!GetSizeImpl(width, height) || !width || !height) {\n      width_out = 0;\n      height_out = 0;\n      return false;\n    }\n    width_out = width;\n    height_out = height;\n    return true;\n  }\n\n protected:\n  Surface() = default;\n\n  // Returns the up-to-date size in physical pixels (and true), or zeros (and\n  // optionally false) if not ready to open a presentation connection yet.\n  virtual bool GetSizeImpl(uint32_t& width_out, uint32_t& height_out) const = 0;\n};\n\n}  // namespace ui\n}  // namespace xe\n\n#endif  // XENIA_UI_SURFACE_H_\n"
  },
  {
    "path": "src/xenia/ui/surface_android.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/ui/surface_android.h\"\n\n#include <android/native_window.h>\n\nnamespace xe {\nnamespace ui {\n\nbool AndroidNativeWindowSurface::GetSizeImpl(uint32_t& width_out,\n                                             uint32_t& height_out) const {\n  if (!window_) {\n    return false;\n  }\n  int width = ANativeWindow_getWidth(window_);\n  int height = ANativeWindow_getHeight(window_);\n  // Negative value is returned in case of an error.\n  if (width <= 0 || height <= 0) {\n    return false;\n  }\n  width_out = uint32_t(width);\n  height_out = uint32_t(height);\n  return true;\n}\n\n}  // namespace ui\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/ui/surface_android.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_SURFACE_ANDROID_H_\n#define XENIA_UI_SURFACE_ANDROID_H_\n\n#include <android/native_window.h>\n\n#include \"xenia/ui/surface.h\"\n\nnamespace xe {\nnamespace ui {\n\nclass AndroidNativeWindowSurface : public Surface {\n public:\n  explicit AndroidNativeWindowSurface(ANativeWindow* window)\n      : window_(window) {}\n  TypeIndex GetType() const override { return kTypeIndex_AndroidNativeWindow; }\n  ANativeWindow* window() const { return window_; }\n\n protected:\n  bool GetSizeImpl(uint32_t& width_out, uint32_t& height_out) const override;\n\n private:\n  ANativeWindow* window_;\n};\n\n}  // namespace ui\n}  // namespace xe\n\n#endif  // XENIA_UI_SURFACE_ANDROID_H_\n"
  },
  {
    "path": "src/xenia/ui/surface_gnulinux.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/ui/surface_gnulinux.h\"\n\n#include <cstdlib>\n\nnamespace xe {\nnamespace ui {\n\nbool XcbWindowSurface::GetSizeImpl(uint32_t& width_out,\n                                   uint32_t& height_out) const {\n  xcb_get_geometry_reply_t* reply = xcb_get_geometry_reply(\n      connection_, xcb_get_geometry(connection_, window_), nullptr);\n  if (!reply) {\n    return false;\n  }\n  width_out = reply->width;\n  height_out = reply->height;\n  std::free(reply);\n  return true;\n}\n\n}  // namespace ui\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/ui/surface_gnulinux.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_SURFACE_GNULINUX_H_\n#define XENIA_UI_SURFACE_GNULINUX_H_\n\n#include <xcb/xcb.h>\n\n#include \"xenia/ui/surface.h\"\n\nnamespace xe {\nnamespace ui {\n\nclass XcbWindowSurface final : public Surface {\n public:\n  explicit XcbWindowSurface(xcb_connection_t* connection, xcb_window_t window)\n      : connection_(connection), window_(window) {}\n  TypeIndex GetType() const override { return kTypeIndex_XcbWindow; }\n  xcb_connection_t* connection() const { return connection_; }\n  xcb_window_t window() const { return window_; }\n\n protected:\n  bool GetSizeImpl(uint32_t& width_out, uint32_t& height_out) const override;\n\n private:\n  xcb_connection_t* connection_;\n  xcb_window_t window_;\n};\n\n}  // namespace ui\n}  // namespace xe\n\n#endif  // XENIA_UI_SURFACE_LINUX_H_\n"
  },
  {
    "path": "src/xenia/ui/surface_win.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/ui/surface_win.h\"\n\nnamespace xe {\nnamespace ui {\n\n#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_GAMES)\nbool Win32HwndSurface::GetSizeImpl(uint32_t& width_out,\n                                   uint32_t& height_out) const {\n  RECT client_rect;\n  if (!GetClientRect(hwnd(), &client_rect)) {\n    return false;\n  }\n  // GetClientRect returns a rectangle with 0 origin.\n  width_out = uint32_t(client_rect.right);\n  height_out = uint32_t(client_rect.bottom);\n  return true;\n}\n#endif\n\n}  // namespace ui\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/ui/surface_win.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_SURFACE_WIN_H_\n#define XENIA_UI_SURFACE_WIN_H_\n\n#include <cstdint>\n#include <memory>\n\n#include \"xenia/ui/surface.h\"\n\n// Must be included before Windows headers for things like NOMINMAX.\n#include \"xenia/base/platform_win.h\"\n\nnamespace xe {\nnamespace ui {\n\n#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_GAMES)\nclass Win32HwndSurface final : public Surface {\n public:\n  explicit Win32HwndSurface(HINSTANCE hinstance, HWND hwnd)\n      : hinstance_(hinstance), hwnd_(hwnd) {}\n  TypeIndex GetType() const override { return kTypeIndex_Win32Hwnd; }\n  HINSTANCE hinstance() const { return hinstance_; }\n  HWND hwnd() const { return hwnd_; }\n\n protected:\n  bool GetSizeImpl(uint32_t& width_out, uint32_t& height_out) const override;\n\n private:\n  HINSTANCE hinstance_;\n  HWND hwnd_;\n};\n#endif\n\n}  // namespace ui\n}  // namespace xe\n\n#endif  // XENIA_UI_SURFACE_WIN_H_\n"
  },
  {
    "path": "src/xenia/ui/ui_drawer.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_UI_DRAWER_H_\n#define XENIA_UI_UI_DRAWER_H_\n\n#include <cstdint>\n\nnamespace xe {\nnamespace ui {\n\nclass UIDrawContext;\n\nclass UIDrawer {\n public:\n  // No preparation or finishing callbacks because drawers may register or\n  // unregister each other, so between the loops the list may be different.\n\n  // The draw function may register or unregister drawers (and depending on the\n  // Z order the changes may or may not effect immediately). However, they must\n  // not perform any lifetime management of the presenter and of its connection\n  // to the surface. Ideally drawing should not be changing any state at all,\n  // however, in Dear ImGui, input is handled directly during drawing - any\n  // quitting or resizing, if done in the UI, must be deferred via something\n  // like WindowedAppContext::CallInUIThreadDeferred.\n  virtual void Draw(UIDrawContext& context) = 0;\n};\n\n}  // namespace ui\n}  // namespace xe\n\n#endif  // XENIA_UI_UI_DRAWER_H_\n"
  },
  {
    "path": "src/xenia/ui/ui_event.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_UI_EVENT_H_\n#define XENIA_UI_UI_EVENT_H_\n\n#include <cstdint>\n#include <filesystem>\n\n#include \"xenia/ui/virtual_key.h\"\n\nnamespace xe {\nnamespace ui {\n\nclass Window;\n\nclass UIEvent {\n public:\n  explicit UIEvent(Window* target = nullptr) : target_(target) {}\n  virtual ~UIEvent() = default;\n\n  Window* target() const { return target_; }\n\n private:\n  Window* target_;\n};\n\nclass UISetupEvent : public UIEvent {\n public:\n  explicit UISetupEvent(Window* target = nullptr, bool is_initial_setup = false)\n      : UIEvent(target), is_initial_setup_(is_initial_setup) {}\n\n  bool is_initial_setup() const { return is_initial_setup_; }\n\n private:\n  bool is_initial_setup_;\n};\n\nclass MonitorUpdateEvent : public UISetupEvent {\n public:\n  explicit MonitorUpdateEvent(Window* target,\n                              bool old_monitor_potentially_disconnected,\n                              bool is_initial_setup = false)\n      : UISetupEvent(target, is_initial_setup),\n        old_monitor_potentially_disconnected_(\n            old_monitor_potentially_disconnected) {}\n\n  bool old_monitor_potentially_disconnected() const {\n    return old_monitor_potentially_disconnected_;\n  }\n\n private:\n  bool old_monitor_potentially_disconnected_;\n};\n\nclass FileDropEvent : public UIEvent {\n public:\n  explicit FileDropEvent(Window* target, std::filesystem::path filename)\n      : UIEvent(target), filename_(std::move(filename)) {}\n  ~FileDropEvent() override = default;\n\n  const std::filesystem::path& filename() const { return filename_; }\n\n private:\n  const std::filesystem::path filename_;\n};\n\nclass KeyEvent : public UIEvent {\n public:\n  explicit KeyEvent(Window* target, VirtualKey virtual_key, int repeat_count,\n                    bool prev_state, bool modifier_shift_pressed,\n                    bool modifier_ctrl_pressed, bool modifier_alt_pressed,\n                    bool modifier_super_pressed)\n      : UIEvent(target),\n        virtual_key_(virtual_key),\n        repeat_count_(repeat_count),\n        prev_state_(prev_state),\n        modifier_shift_pressed_(modifier_shift_pressed),\n        modifier_ctrl_pressed_(modifier_ctrl_pressed),\n        modifier_alt_pressed_(modifier_alt_pressed),\n        modifier_super_pressed_(modifier_super_pressed) {}\n  ~KeyEvent() override = default;\n\n  bool is_handled() const { return handled_; }\n  void set_handled(bool value) { handled_ = value; }\n\n  VirtualKey virtual_key() const { return virtual_key_; }\n\n  int repeat_count() const { return repeat_count_; }\n  bool prev_state() const { return prev_state_; }\n\n  bool is_shift_pressed() const { return modifier_shift_pressed_; }\n  bool is_ctrl_pressed() const { return modifier_ctrl_pressed_; }\n  bool is_alt_pressed() const { return modifier_alt_pressed_; }\n  bool is_super_pressed() const { return modifier_super_pressed_; }\n\n private:\n  bool handled_ = false;\n  VirtualKey virtual_key_ = VirtualKey::kNone;\n\n  int repeat_count_ = 0;\n  bool prev_state_ = false;  // Key previously down(true) or up(false)\n\n  bool modifier_shift_pressed_ = false;\n  bool modifier_ctrl_pressed_ = false;\n  bool modifier_alt_pressed_ = false;\n  bool modifier_super_pressed_ = false;\n};\n\nclass MouseEvent : public UIEvent {\n public:\n  enum class Button {\n    kNone = 0,\n    kLeft,\n    kRight,\n    kMiddle,\n    kX1,\n    kX2,\n  };\n\n public:\n  // Matching Windows WHEEL_DELTA.\n  static constexpr uint32_t kScrollPerDetent = 120;\n\n  explicit MouseEvent(Window* target, Button button, int32_t x, int32_t y,\n                      int32_t scroll_x = 0, int32_t scroll_y = 0)\n      : UIEvent(target),\n        button_(button),\n        x_(x),\n        y_(y),\n        scroll_x_(scroll_x),\n        scroll_y_(scroll_y) {}\n  ~MouseEvent() override = default;\n\n  bool is_handled() const { return handled_; }\n  void set_handled(bool value) { handled_ = value; }\n\n  Button button() const { return button_; }\n  int32_t x() const { return x_; }\n  int32_t y() const { return y_; }\n  int32_t scroll_x() const { return scroll_x_; }\n  int32_t scroll_y() const { return scroll_y_; }\n\n private:\n  bool handled_ = false;\n  Button button_;\n  int32_t x_ = 0;\n  int32_t y_ = 0;\n  int32_t scroll_x_ = 0;\n  // Positive is up (away from the user), negative is down (towards the user).\n  int32_t scroll_y_ = 0;\n};\n\nclass TouchEvent : public UIEvent {\n public:\n  enum class Action {\n    kDown,\n    kUp,\n    // Should be treated as an up event, but without performing the usual action\n    // for releasing.\n    kCancel,\n    kMove,\n  };\n\n  // Can be used by event listeners as the value for when there's no current\n  // pointer, for example.\n  static constexpr uint32_t kPointerIDNone = UINT32_MAX;\n\n  explicit TouchEvent(Window* target, uint32_t pointer_id, Action action,\n                      float x, float y)\n      : UIEvent(target),\n        pointer_id_(pointer_id),\n        action_(action),\n        x_(x),\n        y_(y) {}\n\n  bool is_handled() const { return handled_; }\n  void set_handled(bool value) { handled_ = value; }\n\n  uint32_t pointer_id() { return pointer_id_; }\n  Action action() const { return action_; }\n  // Can be outside the boundaries of the surface.\n  float x() const { return x_; }\n  float y() const { return y_; }\n\n private:\n  bool handled_ = false;\n  uint32_t pointer_id_;\n  Action action_;\n  float x_;\n  float y_;\n};\n\n}  // namespace ui\n}  // namespace xe\n\n#endif  // XENIA_UI_UI_EVENT_H_\n"
  },
  {
    "path": "src/xenia/ui/virtual_key.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_VIRTUAL_KEY_H_\n#define XENIA_UI_VIRTUAL_KEY_H_\n\n#include <cstdint>\n\nnamespace xe {\nnamespace ui {\n\n// Windows and Xbox 360 / XInput virtual key enumeration.\n// This is what platform-specific keys should be translated to, for both HID\n// keystroke emulation and Xenia-internal UI events. On Windows, the translation\n// is a simple cast.\n// This is uint16_t as it's WPARAM (which was 16-bit back in Win16 days, where\n// virtual key codes were added), and XINPUT_KEYSTROKE stores the virtual key as\n// a WORD. In some cases (see kPacket), bits above 16 may be used as well, but\n// VK_ on Windows are defined up to 0xFF (0xFE not counting the reserved 0xFF)\n// as of Windows SDK 10.0.19041.0, and XInput virtual key codes are 16-bit.\n// Base virtual key codes as of _WIN32_WINNT 0x0500 (Windows 2000, which the\n// Xbox 360's kernel is based on), virtual key codes added later are marked\n// explicitly as such.\nenum class VirtualKey : uint16_t {\n  // Not a valid key - MapVirtualKey returns zero when there is no translation.\n  kNone,\n\n  kLButton = 0x01,\n  kRButton = 0x02,\n  kCancel = 0x03,   // Control-break.\n  kMButton = 0x04,  // Not contiguous with kLButton and kRButton.\n\n  kXButton1 = 0x05,  // Not contiguous with kLButton and kRButton.\n  kXButton2 = 0x06,  // Not contiguous with kLButton and kRButton.\n\n  kBack = 0x08,  // Backspace.\n  kTab = 0x09,\n\n  kClear = 0x0C,\n  kReturn = 0x0D,  // Enter.\n\n  kShift = 0x10,\n  kControl = 0x11,  // Ctrl.\n  kMenu = 0x12,     // Alt.\n  kPause = 0x13,\n  kCapital = 0x14,  // Caps Lock.\n\n  kKana = 0x15,\n  kHangeul = 0x15,  // Old name.\n  kHangul = 0x15,\n  kImeOn = 0x16,\n  kJunja = 0x17,\n  kFinal = 0x18,\n  kHanja = 0x19,\n  kKanji = 0x19,\n  kImeOff = 0x1A,\n\n  kEscape = 0x1B,\n\n  kConvert = 0x1C,\n  kNonConvert = 0x1D,\n  kAccept = 0x1E,\n  kModeChange = 0x1F,\n\n  kSpace = 0x20,\n  kPrior = 0x21,  // Page Up.\n  kNext = 0x22,   // Page Down.\n  kEnd = 0x23,\n  kHome = 0x24,\n  kLeft = 0x25,\n  kUp = 0x26,\n  kRight = 0x27,\n  kDown = 0x28,\n  kSelect = 0x29,\n  kPrint = 0x2A,\n  kExecute = 0x2B,\n  kSnapshot = 0x2C,\n  kInsert = 0x2D,\n  kDelete = 0x2E,\n  kHelp = 0x2F,\n\n  // Same as ASCII '0' - '9'.\n  k0 = 0x30,\n  k1 = 0x31,\n  k2 = 0x32,\n  k3 = 0x33,\n  k4 = 0x34,\n  k5 = 0x35,\n  k6 = 0x36,\n  k7 = 0x37,\n  k8 = 0x38,\n  k9 = 0x39,\n\n  // Same as ASCII 'A' - 'Z'.\n  kA = 0x41,\n  kB = 0x42,\n  kC = 0x43,\n  kD = 0x44,\n  kE = 0x45,\n  kF = 0x46,\n  kG = 0x47,\n  kH = 0x48,\n  kI = 0x49,\n  kJ = 0x4A,\n  kK = 0x4B,\n  kL = 0x4C,\n  kM = 0x4D,\n  kN = 0x4E,\n  kO = 0x4F,\n  kP = 0x50,\n  kQ = 0x51,\n  kR = 0x52,\n  kS = 0x53,\n  kT = 0x54,\n  kU = 0x55,\n  kV = 0x56,\n  kW = 0x57,\n  kX = 0x58,\n  kY = 0x59,\n  kZ = 0x5A,\n\n  kLWin = 0x5B,\n  kRWin = 0x5C,\n  kApps = 0x5D,\n\n  kSleep = 0x5F,\n\n  kNumpad0 = 0x60,\n  kNumpad1 = 0x61,\n  kNumpad2 = 0x62,\n  kNumpad3 = 0x63,\n  kNumpad4 = 0x64,\n  kNumpad5 = 0x65,\n  kNumpad6 = 0x66,\n  kNumpad7 = 0x67,\n  kNumpad8 = 0x68,\n  kNumpad9 = 0x69,\n  kMultiply = 0x6A,\n  kAdd = 0x6B,\n  kSeparator = 0x6C,\n  kSubtract = 0x6D,\n  kDecimal = 0x6E,\n  kDivide = 0x6F,\n  kF1 = 0x70,\n  kF2 = 0x71,\n  kF3 = 0x72,\n  kF4 = 0x73,\n  kF5 = 0x74,\n  kF6 = 0x75,\n  kF7 = 0x76,\n  kF8 = 0x77,\n  kF9 = 0x78,\n  kF10 = 0x79,\n  kF11 = 0x7A,\n  kF12 = 0x7B,\n  kF13 = 0x7C,\n  kF14 = 0x7D,\n  kF15 = 0x7E,\n  kF16 = 0x7F,\n  kF17 = 0x80,\n  kF18 = 0x81,\n  kF19 = 0x82,\n  kF20 = 0x83,\n  kF21 = 0x84,\n  kF22 = 0x85,\n  kF23 = 0x86,\n  kF24 = 0x87,\n\n  // VK_NAVIGATION_* added in _WIN32_WINNT 0x0604, but marked as reserved in\n  // WinUser.h and not documented on MSDN.\n  kNavigationView = 0x88,\n  kNavigationMenu = 0x89,\n  kNavigationUp = 0x8A,\n  kNavigationDown = 0x8B,\n  kNavigationLeft = 0x8C,\n  kNavigationRight = 0x8D,\n  kNavigationAccept = 0x8E,\n  kNavigationCancel = 0x8F,\n\n  kNumLock = 0x90,\n  kScroll = 0x91,\n\n  // NEC PC-9800 keyboard.\n  kOemNecEqual = 0x92,  // '=' key on the numpad.\n\n  // Fujitsu/OASYS keyboard.\n  kOemFjJisho = 0x92,    // 'Dictionary' key.\n  kOemFjMasshou = 0x93,  // 'Unregister word' key.\n  kOemFjTouroku = 0x94,  // 'Register word' key.\n  kOemFjLOya = 0x95,     // 'Left OYAYUBI' key.\n  kOemFjROya = 0x96,     // 'Right OYAYUBI' key.\n\n  // Left and right Alt, Ctrl and Shift virtual keys.\n  // On Windows (from WinUser.h):\n  // \"Used only as parameters to GetAsyncKeyState() and GetKeyState().\n  //  No other API or message will distinguish left and right keys in this way.\"\n  kLShift = 0xA0,\n  kRShift = 0xA1,\n  kLControl = 0xA2,\n  kRControl = 0xA3,\n  kLMenu = 0xA4,\n  kRMenu = 0xA5,\n\n  kBrowserBack = 0xA6,\n  kBrowserForward = 0xA7,\n  kBrowserRefresh = 0xA8,\n  kBrowserStop = 0xA9,\n  kBrowserSearch = 0xAA,\n  kBrowserFavorites = 0xAB,\n  kBrowserHome = 0xAC,\n\n  kVolumeMute = 0xAD,\n  kVolumeDown = 0xAE,\n  kVolumeUp = 0xAF,\n  kMediaNextTrack = 0xB0,\n  kMediaPrevTrack = 0xB1,\n  kMediaStop = 0xB2,\n  kMediaPlayPause = 0xB3,\n  kLaunchMail = 0xB4,\n  kLaunchMediaSelect = 0xB5,\n  kLaunchApp1 = 0xB6,\n  kLaunchApp2 = 0xB7,\n\n  kOem1 = 0xBA,       // ';:' for the US.\n  kOemPlus = 0xBB,    // '+' for any country.\n  kOemComma = 0xBC,   // ',' for any country.\n  kOemMinus = 0xBD,   // '-' for any country.\n  kOemPeriod = 0xBE,  // '.' for any country.\n  kOem2 = 0xBF,       // '/?' for the US.\n  kOem3 = 0xC0,       // '`~' for the US.\n\n  // VK_GAMEPAD_* (since _WIN32_WINNT 0x0604) virtual key codes are marked as\n  // reserved in WinUser.h and are mostly not documented on MSDN (with the\n  // exception of the Xbox Device Portal Remote Input REST API in the \"UWP on\n  // Xbox One\" section).\n  // Xenia uses VK_PAD_* (kXInputPad*) for HID emulation internally instead\n  // because XInput is the API used for the Xbox 360 controller.\n  // To avoid confusion between VK_GAMEPAD_* and VK_PAD_*, here they are\n  // prefixed with kXboxOne and kXInput respectively.\n  kXboxOneGamepadA = 0xC3,\n  kXboxOneGamepadB = 0xC4,\n  kXboxOneGamepadX = 0xC5,\n  kXboxOneGamepadY = 0xC6,\n  kXboxOneGamepadRightShoulder = 0xC7,\n  kXboxOneGamepadLeftShoulder = 0xC8,\n  kXboxOneGamepadLeftTrigger = 0xC9,\n  kXboxOneGamepadRightTrigger = 0xCA,\n  kXboxOneGamepadDpadUp = 0xCB,\n  kXboxOneGamepadDpadDown = 0xCC,\n  kXboxOneGamepadDpadLeft = 0xCD,\n  kXboxOneGamepadDpadRight = 0xCE,\n  kXboxOneGamepadMenu = 0xCF,\n  kXboxOneGamepadView = 0xD0,\n  kXboxOneGamepadLeftThumbstickButton = 0xD1,\n  kXboxOneGamepadRightThumbstickButton = 0xD2,\n  kXboxOneGamepadLeftThumbstickUp = 0xD3,\n  kXboxOneGamepadLeftThumbstickDown = 0xD4,\n  kXboxOneGamepadLeftThumbstickRight = 0xD5,\n  kXboxOneGamepadLeftThumbstickLeft = 0xD6,\n  kXboxOneGamepadRightThumbstickUp = 0xD7,\n  kXboxOneGamepadRightThumbstickDown = 0xD8,\n  kXboxOneGamepadRightThumbstickRight = 0xD9,\n  kXboxOneGamepadRightThumbstickLeft = 0xDA,\n\n  kOem4 = 0xDB,  // '[{' for the US.\n  kOem5 = 0xDC,  // '\\|' for the US.\n  kOem6 = 0xDD,  // ']}' for the US.\n  kOem7 = 0xDE,  // ''\"' for the US.\n  kOem8 = 0xDF,\n\n  kOemAx = 0xE1,    // 'AX' key on the Japanese AX keyboard.\n  kOem102 = 0xE2,   // \"<>\" or \"\\|\" on the RT 102-key keyboard.\n  kIcoHelp = 0xE3,  // Help key on the Olivetti keyboard (ICO).\n  kIco00 = 0xE4,    // 00 key on the ICO.\n\n  kProcessKey = 0xE5,\n\n  kIcoClear = 0xE6,\n\n  // From MSDN:\n  // \"Used to pass Unicode characters as if they were keystrokes. The VK_PACKET\n  //  key is the low word of a 32-bit Virtual Key value used for non-keyboard\n  //  input methods.\"\n  kPacket = 0xE7,\n\n  // Nokia/Ericsson.\n  kOemReset = 0xE9,\n  kOemJump = 0xEA,\n  kOemPa1 = 0xEB,\n  kOemPa2 = 0xEC,\n  kOemPa3 = 0xED,\n  kOemWsCtrl = 0xEE,\n  kOemCuSel = 0xEF,\n  kOemAttn = 0xF0,\n  kOemFinish = 0xF1,\n  kOemCopy = 0xF2,\n  kOemAuto = 0xF3,\n  kOemEnlW = 0xF4,\n  kOemBackTab = 0xF5,\n\n  kAttn = 0xF6,\n  kCrSel = 0xF7,\n  kExSel = 0xF8,\n  kErEof = 0xF9,\n  kPlay = 0xFA,\n  kZoom = 0xFB,\n  kNoName = 0xFC,\n  kPa1 = 0xFD,\n  kOemClear = 0xFE,\n\n  // VK_PAD_* from XInput.h for XInputGetKeystroke. kXInput prefix added to\n  // distinguish from VK_GAMEPAD_*, added much later for the Xbox One\n  // controller.\n\n  kXInputPadA = 0x5800,\n  kXInputPadB = 0x5801,\n  kXInputPadX = 0x5802,\n  kXInputPadY = 0x5803,\n  // RShoulder before LShoulder, not a typo.\n  kXInputPadRShoulder = 0x5804,\n  kXInputPadLShoulder = 0x5805,\n  kXInputPadLTrigger = 0x5806,\n  kXInputPadRTrigger = 0x5807,\n\n  kXInputPadDpadUp = 0x5810,\n  kXInputPadDpadDown = 0x5811,\n  kXInputPadDpadLeft = 0x5812,\n  kXInputPadDpadRight = 0x5813,\n  kXInputPadStart = 0x5814,\n  kXInputPadBack = 0x5815,\n  kXInputPadLThumbPress = 0x5816,\n  kXInputPadRThumbPress = 0x5817,\n\n  kXInputPadLThumbUp = 0x5820,\n  kXInputPadLThumbDown = 0x5821,\n  kXInputPadLThumbRight = 0x5822,\n  kXInputPadLThumbLeft = 0x5823,\n  kXInputPadLThumbUpLeft = 0x5824,\n  kXInputPadLThumbUpRight = 0x5825,\n  kXInputPadLThumbDownRight = 0x5826,\n  kXInputPadLThumbDownLeft = 0x5827,\n\n  kXInputPadRThumbUp = 0x5830,\n  kXInputPadRThumbDown = 0x5831,\n  kXInputPadRThumbRight = 0x5832,\n  kXInputPadRThumbLeft = 0x5833,\n  kXInputPadRThumbUpLeft = 0x5834,\n  kXInputPadRThumbUpRight = 0x5835,\n  kXInputPadRThumbDownRight = 0x5836,\n  kXInputPadRThumbDownLeft = 0x5837,\n};\n\n}  // namespace ui\n}  // namespace xe\n\n#endif  // XENIA_UI_VIRTUAL_KEY_H_\n"
  },
  {
    "path": "src/xenia/ui/vulkan/functions/device_1_0.inc",
    "content": "// Vulkan 1.0 core device functions used in Xenia.\nXE_UI_VULKAN_FUNCTION(vkAllocateCommandBuffers)\nXE_UI_VULKAN_FUNCTION(vkAllocateDescriptorSets)\nXE_UI_VULKAN_FUNCTION(vkAllocateMemory)\nXE_UI_VULKAN_FUNCTION(vkBeginCommandBuffer)\nXE_UI_VULKAN_FUNCTION(vkBindBufferMemory)\nXE_UI_VULKAN_FUNCTION(vkBindImageMemory)\nXE_UI_VULKAN_FUNCTION(vkCmdBeginRenderPass)\nXE_UI_VULKAN_FUNCTION(vkCmdBindDescriptorSets)\nXE_UI_VULKAN_FUNCTION(vkCmdBindIndexBuffer)\nXE_UI_VULKAN_FUNCTION(vkCmdBindPipeline)\nXE_UI_VULKAN_FUNCTION(vkCmdBindVertexBuffers)\nXE_UI_VULKAN_FUNCTION(vkCmdClearAttachments)\nXE_UI_VULKAN_FUNCTION(vkCmdClearColorImage)\nXE_UI_VULKAN_FUNCTION(vkCmdCopyBuffer)\nXE_UI_VULKAN_FUNCTION(vkCmdCopyBufferToImage)\nXE_UI_VULKAN_FUNCTION(vkCmdCopyImageToBuffer)\nXE_UI_VULKAN_FUNCTION(vkCmdDispatch)\nXE_UI_VULKAN_FUNCTION(vkCmdDraw)\nXE_UI_VULKAN_FUNCTION(vkCmdDrawIndexed)\nXE_UI_VULKAN_FUNCTION(vkCmdEndRenderPass)\nXE_UI_VULKAN_FUNCTION(vkCmdPipelineBarrier)\nXE_UI_VULKAN_FUNCTION(vkCmdPushConstants)\nXE_UI_VULKAN_FUNCTION(vkCmdSetBlendConstants)\nXE_UI_VULKAN_FUNCTION(vkCmdSetDepthBias)\nXE_UI_VULKAN_FUNCTION(vkCmdSetScissor)\nXE_UI_VULKAN_FUNCTION(vkCmdSetStencilCompareMask)\nXE_UI_VULKAN_FUNCTION(vkCmdSetStencilReference)\nXE_UI_VULKAN_FUNCTION(vkCmdSetStencilWriteMask)\nXE_UI_VULKAN_FUNCTION(vkCmdSetViewport)\nXE_UI_VULKAN_FUNCTION(vkCreateBuffer)\nXE_UI_VULKAN_FUNCTION(vkCreateBufferView)\nXE_UI_VULKAN_FUNCTION(vkCreateCommandPool)\nXE_UI_VULKAN_FUNCTION(vkCreateComputePipelines)\nXE_UI_VULKAN_FUNCTION(vkCreateDescriptorPool)\nXE_UI_VULKAN_FUNCTION(vkCreateDescriptorSetLayout)\nXE_UI_VULKAN_FUNCTION(vkCreateFence)\nXE_UI_VULKAN_FUNCTION(vkCreateFramebuffer)\nXE_UI_VULKAN_FUNCTION(vkCreateGraphicsPipelines)\nXE_UI_VULKAN_FUNCTION(vkCreateImage)\nXE_UI_VULKAN_FUNCTION(vkCreateImageView)\nXE_UI_VULKAN_FUNCTION(vkCreatePipelineLayout)\nXE_UI_VULKAN_FUNCTION(vkCreateRenderPass)\nXE_UI_VULKAN_FUNCTION(vkCreateSampler)\nXE_UI_VULKAN_FUNCTION(vkCreateSemaphore)\nXE_UI_VULKAN_FUNCTION(vkCreateShaderModule)\nXE_UI_VULKAN_FUNCTION(vkDestroyBuffer)\nXE_UI_VULKAN_FUNCTION(vkDestroyBufferView)\nXE_UI_VULKAN_FUNCTION(vkDestroyCommandPool)\nXE_UI_VULKAN_FUNCTION(vkDestroyDescriptorPool)\nXE_UI_VULKAN_FUNCTION(vkDestroyDescriptorSetLayout)\nXE_UI_VULKAN_FUNCTION(vkDestroyFence)\nXE_UI_VULKAN_FUNCTION(vkDestroyFramebuffer)\nXE_UI_VULKAN_FUNCTION(vkDestroyImage)\nXE_UI_VULKAN_FUNCTION(vkDestroyImageView)\nXE_UI_VULKAN_FUNCTION(vkDestroyPipeline)\nXE_UI_VULKAN_FUNCTION(vkDestroyPipelineLayout)\nXE_UI_VULKAN_FUNCTION(vkDestroyRenderPass)\nXE_UI_VULKAN_FUNCTION(vkDestroySampler)\nXE_UI_VULKAN_FUNCTION(vkDestroySemaphore)\nXE_UI_VULKAN_FUNCTION(vkDestroyShaderModule)\nXE_UI_VULKAN_FUNCTION(vkEndCommandBuffer)\nXE_UI_VULKAN_FUNCTION(vkFlushMappedMemoryRanges)\nXE_UI_VULKAN_FUNCTION(vkFreeMemory)\nXE_UI_VULKAN_FUNCTION(vkGetBufferMemoryRequirements)\nXE_UI_VULKAN_FUNCTION(vkGetDeviceQueue)\nXE_UI_VULKAN_FUNCTION(vkGetFenceStatus)\nXE_UI_VULKAN_FUNCTION(vkGetImageMemoryRequirements)\nXE_UI_VULKAN_FUNCTION(vkInvalidateMappedMemoryRanges)\nXE_UI_VULKAN_FUNCTION(vkMapMemory)\nXE_UI_VULKAN_FUNCTION(vkResetCommandPool)\nXE_UI_VULKAN_FUNCTION(vkResetDescriptorPool)\nXE_UI_VULKAN_FUNCTION(vkResetFences)\nXE_UI_VULKAN_FUNCTION(vkQueueBindSparse)\nXE_UI_VULKAN_FUNCTION(vkQueueSubmit)\nXE_UI_VULKAN_FUNCTION(vkUnmapMemory)\nXE_UI_VULKAN_FUNCTION(vkUpdateDescriptorSets)\nXE_UI_VULKAN_FUNCTION(vkWaitForFences)\n"
  },
  {
    "path": "src/xenia/ui/vulkan/functions/device_1_1_khr_bind_memory2.inc",
    "content": "// VK_KHR_bind_memory2 functions used in Xenia.\n// Promoted to Vulkan 1.1 core.\nXE_UI_VULKAN_FUNCTION_PROMOTED(vkBindBufferMemory2KHR, vkBindBufferMemory2)\nXE_UI_VULKAN_FUNCTION_PROMOTED(vkBindImageMemory2KHR, vkBindImageMemory2)\n"
  },
  {
    "path": "src/xenia/ui/vulkan/functions/device_1_1_khr_get_memory_requirements2.inc",
    "content": "// VK_KHR_get_memory_requirements2 functions used in Xenia.\n// Promoted to Vulkan 1.1 core.\nXE_UI_VULKAN_FUNCTION_PROMOTED(vkGetBufferMemoryRequirements2KHR,\n                               vkGetBufferMemoryRequirements2)\nXE_UI_VULKAN_FUNCTION_PROMOTED(vkGetImageMemoryRequirements2KHR,\n                               vkGetImageMemoryRequirements2)\n"
  },
  {
    "path": "src/xenia/ui/vulkan/functions/device_1_3_khr_maintenance4.inc",
    "content": "// VK_KHR_maintenance4 functions used in Xenia.\n// Promoted to Vulkan 1.3 core.\nXE_UI_VULKAN_FUNCTION_PROMOTED(vkGetDeviceBufferMemoryRequirementsKHR,\n                               vkGetDeviceBufferMemoryRequirements)\nXE_UI_VULKAN_FUNCTION_PROMOTED(vkGetDeviceImageMemoryRequirementsKHR,\n                               vkGetDeviceImageMemoryRequirements)\n"
  },
  {
    "path": "src/xenia/ui/vulkan/functions/device_khr_swapchain.inc",
    "content": "// VK_KHR_swapchain functions used in Xenia.\nXE_UI_VULKAN_FUNCTION(vkAcquireNextImageKHR)\nXE_UI_VULKAN_FUNCTION(vkCreateSwapchainKHR)\nXE_UI_VULKAN_FUNCTION(vkDestroySwapchainKHR)\nXE_UI_VULKAN_FUNCTION(vkGetSwapchainImagesKHR)\nXE_UI_VULKAN_FUNCTION(vkQueuePresentKHR)\n"
  },
  {
    "path": "src/xenia/ui/vulkan/functions/instance_1_0.inc",
    "content": "// Vulkan 1.0 core instance functions used in Xenia.\nXE_UI_VULKAN_FUNCTION(vkCreateDevice)\nXE_UI_VULKAN_FUNCTION(vkDestroyDevice)\nXE_UI_VULKAN_FUNCTION(vkEnumerateDeviceExtensionProperties)\nXE_UI_VULKAN_FUNCTION(vkEnumeratePhysicalDevices)\nXE_UI_VULKAN_FUNCTION(vkGetDeviceProcAddr)\nXE_UI_VULKAN_FUNCTION(vkGetPhysicalDeviceFeatures)\nXE_UI_VULKAN_FUNCTION(vkGetPhysicalDeviceFormatProperties)\nXE_UI_VULKAN_FUNCTION(vkGetPhysicalDeviceMemoryProperties)\nXE_UI_VULKAN_FUNCTION(vkGetPhysicalDeviceProperties)\nXE_UI_VULKAN_FUNCTION(vkGetPhysicalDeviceQueueFamilyProperties)\n"
  },
  {
    "path": "src/xenia/ui/vulkan/functions/instance_1_1_khr_get_physical_device_properties2.inc",
    "content": "// VK_KHR_get_physical_device_properties2 functions used in Xenia.\n// Promoted to Vulkan 1.1 core.\nXE_UI_VULKAN_FUNCTION_PROMOTED(vkGetPhysicalDeviceFeatures2KHR,\n                               vkGetPhysicalDeviceFeatures2)\nXE_UI_VULKAN_FUNCTION_PROMOTED(vkGetPhysicalDeviceMemoryProperties2KHR,\n                               vkGetPhysicalDeviceMemoryProperties2)\nXE_UI_VULKAN_FUNCTION_PROMOTED(vkGetPhysicalDeviceProperties2KHR,\n                               vkGetPhysicalDeviceProperties2)\n"
  },
  {
    "path": "src/xenia/ui/vulkan/functions/instance_ext_debug_utils.inc",
    "content": "// VK_EXT_debug_utils functions used in Xenia.\nXE_UI_VULKAN_FUNCTION(vkCreateDebugUtilsMessengerEXT)\nXE_UI_VULKAN_FUNCTION(vkDestroyDebugUtilsMessengerEXT)\nXE_UI_VULKAN_FUNCTION(vkSetDebugUtilsObjectNameEXT)\n"
  },
  {
    "path": "src/xenia/ui/vulkan/functions/instance_khr_android_surface.inc",
    "content": "// VK_KHR_android_surface functions used in Xenia.\nXE_UI_VULKAN_FUNCTION(vkCreateAndroidSurfaceKHR)\n"
  },
  {
    "path": "src/xenia/ui/vulkan/functions/instance_khr_surface.inc",
    "content": "// VK_KHR_surface functions used in Xenia.\nXE_UI_VULKAN_FUNCTION(vkDestroySurfaceKHR)\nXE_UI_VULKAN_FUNCTION(vkGetPhysicalDeviceSurfaceCapabilitiesKHR)\nXE_UI_VULKAN_FUNCTION(vkGetPhysicalDeviceSurfaceFormatsKHR)\nXE_UI_VULKAN_FUNCTION(vkGetPhysicalDeviceSurfacePresentModesKHR)\nXE_UI_VULKAN_FUNCTION(vkGetPhysicalDeviceSurfaceSupportKHR)\n"
  },
  {
    "path": "src/xenia/ui/vulkan/functions/instance_khr_win32_surface.inc",
    "content": "// VK_KHR_win32_surface functions used in Xenia.\nXE_UI_VULKAN_FUNCTION(vkCreateWin32SurfaceKHR)\nXE_UI_VULKAN_FUNCTION(vkGetPhysicalDeviceWin32PresentationSupportKHR)\n"
  },
  {
    "path": "src/xenia/ui/vulkan/functions/instance_khr_xcb_surface.inc",
    "content": "// VK_KHR_xcb_surface functions used in Xenia.\nXE_UI_VULKAN_FUNCTION(vkCreateXcbSurfaceKHR)\n"
  },
  {
    "path": "src/xenia/ui/vulkan/linked_type_descriptor_set_allocator.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/ui/vulkan/linked_type_descriptor_set_allocator.h\"\n\n#include <algorithm>\n#include <iterator>\n#include <utility>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/ui/vulkan/vulkan_util.h\"\n\nnamespace xe {\nnamespace ui {\nnamespace vulkan {\n\nvoid LinkedTypeDescriptorSetAllocator::Reset() {\n  const VulkanDevice::Functions& dfn = vulkan_device_->functions();\n  const VkDevice device = vulkan_device_->device();\n  ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyDescriptorPool, device,\n                                         page_usable_latest_.pool);\n  page_usable_latest_.descriptors_remaining.reset();\n  for (const std::pair<const uint32_t, Page>& page_pair : pages_usable_) {\n    dfn.vkDestroyDescriptorPool(device, page_pair.second.pool, nullptr);\n  }\n  pages_usable_.clear();\n  for (VkDescriptorPool pool : pages_full_) {\n    dfn.vkDestroyDescriptorPool(device, pool, nullptr);\n  }\n  pages_full_.clear();\n}\n\nVkDescriptorSet LinkedTypeDescriptorSetAllocator::Allocate(\n    VkDescriptorSetLayout descriptor_set_layout,\n    const VkDescriptorPoolSize* descriptor_counts,\n    uint32_t descriptor_type_count) {\n  assert_not_zero(descriptor_type_count);\n#ifndef NDEBUG\n  for (uint32_t i = 0; i < descriptor_type_count; ++i) {\n    const VkDescriptorPoolSize& descriptor_count_for_type =\n        descriptor_counts[i];\n    assert_not_zero(descriptor_count_for_type.descriptorCount);\n    for (uint32_t j = 0; j < i; ++j) {\n      assert_true(descriptor_counts[j].type != descriptor_count_for_type.type);\n    }\n  }\n#endif\n\n  const VulkanDevice::Functions& dfn = vulkan_device_->functions();\n  const VkDevice device = vulkan_device_->device();\n\n  VkDescriptorSetAllocateInfo descriptor_set_allocate_info;\n  descriptor_set_allocate_info.sType =\n      VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;\n  descriptor_set_allocate_info.pNext = nullptr;\n  descriptor_set_allocate_info.descriptorSetCount = 1;\n  descriptor_set_allocate_info.pSetLayouts = &descriptor_set_layout;\n  VkDescriptorSet descriptor_set;\n\n  // Check if more descriptors have been requested than a page can hold, or\n  // descriptors of types not provided by this allocator, and if that's the\n  // case, create a dedicated pool for this allocation.\n  bool dedicated_descriptor_pool_needed = false;\n  for (uint32_t i = 0; i < descriptor_type_count; ++i) {\n    const VkDescriptorPoolSize& descriptor_count_for_type =\n        descriptor_counts[i];\n    // If the type is one that's not supported by the allocator, a dedicated\n    // pool is required. If it's supported, and the allocator has large enough\n    // pools to hold the requested number of descriptors,\n    // dedicated_descriptor_pool_needed will be set to false for this iteration,\n    // and the loop will continue. Otherwise, if that doesn't happen, a\n    // dedicated pool is required.\n    dedicated_descriptor_pool_needed = true;\n    for (uint32_t j = 0; j < descriptor_pool_size_count_; ++j) {\n      const VkDescriptorPoolSize& descriptor_pool_size =\n          descriptor_pool_sizes_[j];\n      if (descriptor_count_for_type.type != descriptor_pool_size.type) {\n        continue;\n      }\n      if (descriptor_count_for_type.descriptorCount <=\n          descriptor_pool_size.descriptorCount) {\n        // For this type, pages can hold enough descriptors.\n        dedicated_descriptor_pool_needed = false;\n      }\n      break;\n    }\n    if (dedicated_descriptor_pool_needed) {\n      // For at least one requested type, pages can't hold enough descriptors.\n      break;\n    }\n  }\n  if (dedicated_descriptor_pool_needed) {\n    VkDescriptorPoolCreateInfo dedicated_descriptor_pool_create_info;\n    dedicated_descriptor_pool_create_info.sType =\n        VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;\n    dedicated_descriptor_pool_create_info.pNext = nullptr;\n    dedicated_descriptor_pool_create_info.flags = 0;\n    dedicated_descriptor_pool_create_info.maxSets = 1;\n    dedicated_descriptor_pool_create_info.poolSizeCount = descriptor_type_count;\n    dedicated_descriptor_pool_create_info.pPoolSizes = descriptor_counts;\n    VkDescriptorPool dedicated_descriptor_pool;\n    if (dfn.vkCreateDescriptorPool(\n            device, &dedicated_descriptor_pool_create_info, nullptr,\n            &dedicated_descriptor_pool) != VK_SUCCESS) {\n      XELOGE(\n          \"LinkedTypeDescriptorSetAllocator: Failed to create a dedicated \"\n          \"descriptor pool for a descriptor set that is too large for a pool \"\n          \"page\");\n      return VK_NULL_HANDLE;\n    }\n    descriptor_set_allocate_info.descriptorPool = dedicated_descriptor_pool;\n    if (dfn.vkAllocateDescriptorSets(device, &descriptor_set_allocate_info,\n                                     &descriptor_set) != VK_SUCCESS) {\n      XELOGE(\n          \"LinkedTypeDescriptorSetAllocator: Failed to allocate descriptors in \"\n          \"a dedicated pool\");\n      dfn.vkDestroyDescriptorPool(device, dedicated_descriptor_pool, nullptr);\n      return VK_NULL_HANDLE;\n    }\n    pages_full_.push_back(dedicated_descriptor_pool);\n    return descriptor_set;\n  }\n\n  // Try allocating from the latest page an allocation has happened from, to\n  // avoid detaching from the map and re-attaching for every allocation.\n  if (page_usable_latest_.pool != VK_NULL_HANDLE) {\n    assert_not_zero(page_usable_latest_.descriptor_sets_remaining);\n    bool allocate_from_latest_page = true;\n    bool latest_page_becomes_full =\n        page_usable_latest_.descriptor_sets_remaining == 1;\n    for (uint32_t i = 0; i < descriptor_type_count; ++i) {\n      const VkDescriptorPoolSize& descriptor_count_for_type =\n          descriptor_counts[i];\n      for (uint32_t j = 0; j < descriptor_pool_size_count_; ++j) {\n        const VkDescriptorPoolSize& descriptors_remaining_for_type =\n            page_usable_latest_.descriptors_remaining[j];\n        if (descriptor_count_for_type.type !=\n            descriptors_remaining_for_type.type) {\n          continue;\n        }\n        if (descriptor_count_for_type.descriptorCount >=\n            descriptors_remaining_for_type.descriptorCount) {\n          if (descriptor_count_for_type.descriptorCount >\n              descriptors_remaining_for_type.descriptorCount) {\n            allocate_from_latest_page = false;\n            break;\n          }\n          latest_page_becomes_full = true;\n        }\n      }\n      if (!allocate_from_latest_page) {\n        break;\n      }\n    }\n    if (allocate_from_latest_page) {\n      descriptor_set_allocate_info.descriptorPool = page_usable_latest_.pool;\n      if (dfn.vkAllocateDescriptorSets(device, &descriptor_set_allocate_info,\n                                       &descriptor_set) != VK_SUCCESS) {\n        descriptor_set = VK_NULL_HANDLE;\n        // Failed to allocate internally even though there should be enough\n        // space, don't try to allocate from this pool again at all.\n        latest_page_becomes_full = true;\n      }\n      if (latest_page_becomes_full) {\n        pages_full_.push_back(page_usable_latest_.pool);\n        page_usable_latest_.pool = VK_NULL_HANDLE;\n        page_usable_latest_.descriptors_remaining.reset();\n      } else {\n        --page_usable_latest_.descriptor_sets_remaining;\n        for (uint32_t i = 0; i < descriptor_type_count; ++i) {\n          const VkDescriptorPoolSize& descriptor_count_for_type =\n              descriptor_counts[i];\n          for (uint32_t j = 0; j < descriptor_pool_size_count_; ++j) {\n            VkDescriptorPoolSize& descriptors_remaining_for_type =\n                page_usable_latest_.descriptors_remaining[j];\n            if (descriptor_count_for_type.type !=\n                descriptors_remaining_for_type.type) {\n              continue;\n            }\n            descriptors_remaining_for_type.descriptorCount -=\n                descriptor_count_for_type.descriptorCount;\n          }\n        }\n      }\n      if (descriptor_set != VK_NULL_HANDLE) {\n        return descriptor_set;\n      }\n    }\n  }\n\n  // Count the maximum number of descriptors requested for any type to stop\n  // searching for pages once they can't satisfy this requirement.\n  uint32_t max_descriptors_per_type = descriptor_counts[0].descriptorCount;\n  for (uint32_t i = 1; i < descriptor_type_count; ++i) {\n    max_descriptors_per_type = std::max(max_descriptors_per_type,\n                                        descriptor_counts[i].descriptorCount);\n  }\n\n  // If allocating from the latest pool wasn't possible, pick any that has\n  // enough free space. Prefer filling pages that have the most free space as\n  // they can more likely be used for more allocations later.\n  auto page_usable_it_next = pages_usable_.rbegin();\n  while (page_usable_it_next != pages_usable_.rend()) {\n    auto page_usable_it = page_usable_it_next;\n    ++page_usable_it_next;\n    if (page_usable_it->first < max_descriptors_per_type) {\n      // All other pages_usable_ entries have smaller maximum number of free\n      // descriptor for any type (it's the map key).\n      break;\n    }\n    // Check if the page has enough free descriptors for all requested types,\n    // and whether allocating the requested number of descriptors in it will\n    // result in the page becoming full.\n    bool map_page_has_sufficient_space = true;\n    bool map_page_becomes_full =\n        page_usable_it->second.descriptor_sets_remaining == 1;\n    for (uint32_t i = 0; i < descriptor_type_count; ++i) {\n      const VkDescriptorPoolSize& descriptor_count_for_type =\n          descriptor_counts[i];\n      for (uint32_t j = 0; j < descriptor_pool_size_count_; ++j) {\n        const VkDescriptorPoolSize& descriptors_remaining_for_type =\n            page_usable_it->second.descriptors_remaining[j];\n        if (descriptor_count_for_type.type !=\n            descriptors_remaining_for_type.type) {\n          continue;\n        }\n        if (descriptor_count_for_type.descriptorCount >=\n            descriptors_remaining_for_type.descriptorCount) {\n          if (descriptor_count_for_type.descriptorCount >\n              descriptors_remaining_for_type.descriptorCount) {\n            map_page_has_sufficient_space = false;\n            break;\n          }\n          map_page_becomes_full = true;\n        }\n      }\n      if (!map_page_has_sufficient_space) {\n        break;\n      }\n    }\n    if (!map_page_has_sufficient_space) {\n      // Even though the coarse (maximum number of descriptors for any type)\n      // check has passed, for the exact types requested this page doesn't have\n      // sufficient space - try another one.\n      continue;\n    }\n    // Remove the page from the map unconditionally - in case of a successful\n    // allocation, it will have a different number of free descriptors for\n    // different types, thus potentially a new map key (but it will also become\n    // page_usable_latest_ instead even), or will become full, and in case of a\n    // failure to allocate internally even though there still should be enough\n    // space, it should never be allocated from again.\n    Page map_page = std::move(page_usable_it->second);\n    // Convert the reverse iterator to a forward iterator for erasing.\n    pages_usable_.erase(std::next(page_usable_it).base());\n    descriptor_set_allocate_info.descriptorPool = map_page.pool;\n    if (dfn.vkAllocateDescriptorSets(device, &descriptor_set_allocate_info,\n                                     &descriptor_set) != VK_SUCCESS) {\n      descriptor_set = VK_NULL_HANDLE;\n      // Failed to allocate internally even though there should be enough space,\n      // don't try to allocate from this pool again at all.\n      map_page_becomes_full = true;\n    }\n    if (map_page_becomes_full) {\n      map_page.descriptors_remaining.reset();\n      pages_full_.push_back(map_page.pool);\n    } else {\n      --map_page.descriptor_sets_remaining;\n      for (uint32_t i = 0; i < descriptor_type_count; ++i) {\n        const VkDescriptorPoolSize& descriptor_count_for_type =\n            descriptor_counts[i];\n        for (uint32_t j = 0; j < descriptor_pool_size_count_; ++j) {\n          VkDescriptorPoolSize& descriptors_remaining_for_type =\n              map_page.descriptors_remaining[j];\n          if (descriptor_count_for_type.type !=\n              descriptors_remaining_for_type.type) {\n            continue;\n          }\n          descriptors_remaining_for_type.descriptorCount -=\n              descriptor_count_for_type.descriptorCount;\n        }\n      }\n      // Move the latest page that allocation couldn't be done in to the usable\n      // pages to replace it with the new one.\n      if (page_usable_latest_.pool != VK_NULL_HANDLE) {\n        // Calculate the map key (the maximum number of remaining descriptors of\n        // any type).\n        uint32_t latest_page_max_descriptors_remaining =\n            page_usable_latest_.descriptors_remaining[0].descriptorCount;\n        for (uint32_t i = 1; i < descriptor_pool_size_count_; ++i) {\n          latest_page_max_descriptors_remaining = std::max(\n              latest_page_max_descriptors_remaining,\n              page_usable_latest_.descriptors_remaining[i].descriptorCount);\n        }\n        assert_not_zero(latest_page_max_descriptors_remaining);\n        pages_usable_.emplace(latest_page_max_descriptors_remaining,\n                              std::move(page_usable_latest_));\n      }\n      page_usable_latest_ = std::move(map_page);\n    }\n    if (descriptor_set != VK_NULL_HANDLE) {\n      return descriptor_set;\n    }\n  }\n\n  // Try allocating from a new page.\n  // See if the new page has instantly become full.\n  bool new_page_becomes_full = descriptor_sets_per_page_ == 1;\n  for (uint32_t i = 0; !new_page_becomes_full && i < descriptor_type_count;\n       ++i) {\n    const VkDescriptorPoolSize& descriptor_count_for_type =\n        descriptor_counts[i];\n    for (uint32_t j = 0; j < descriptor_pool_size_count_; ++j) {\n      const VkDescriptorPoolSize& descriptors_remaining_for_type =\n          descriptor_pool_sizes_[j];\n      if (descriptor_count_for_type.type !=\n          descriptors_remaining_for_type.type) {\n        continue;\n      }\n      assert_true(descriptor_count_for_type.descriptorCount <=\n                  descriptors_remaining_for_type.descriptorCount);\n      if (descriptor_count_for_type.descriptorCount >=\n          descriptors_remaining_for_type.descriptorCount) {\n        new_page_becomes_full = true;\n        break;\n      }\n    }\n  }\n  // Allocate from a new page. However, if the new page becomes full\n  // immediately, create a dedicated pool instead for the exact number of\n  // descriptors not to leave any unused space in the pool.\n  VkDescriptorPoolCreateInfo new_descriptor_pool_create_info;\n  new_descriptor_pool_create_info.sType =\n      VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;\n  new_descriptor_pool_create_info.pNext = nullptr;\n  new_descriptor_pool_create_info.flags = 0;\n  if (new_page_becomes_full) {\n    new_descriptor_pool_create_info.maxSets = 1;\n    new_descriptor_pool_create_info.poolSizeCount = descriptor_type_count;\n    new_descriptor_pool_create_info.pPoolSizes = descriptor_counts;\n  } else {\n    new_descriptor_pool_create_info.maxSets = descriptor_sets_per_page_;\n    new_descriptor_pool_create_info.poolSizeCount = descriptor_pool_size_count_;\n    new_descriptor_pool_create_info.pPoolSizes = descriptor_pool_sizes_.get();\n  }\n  VkDescriptorPool new_descriptor_pool;\n  if (dfn.vkCreateDescriptorPool(device, &new_descriptor_pool_create_info,\n                                 nullptr, &new_descriptor_pool) != VK_SUCCESS) {\n    XELOGE(\n        \"LinkedTypeDescriptorSetAllocator: Failed to create a descriptor pool\");\n    return VK_NULL_HANDLE;\n  }\n  descriptor_set_allocate_info.descriptorPool = new_descriptor_pool;\n  if (dfn.vkAllocateDescriptorSets(device, &descriptor_set_allocate_info,\n                                   &descriptor_set) != VK_SUCCESS) {\n    XELOGE(\"LinkedTypeDescriptorSetAllocator: Failed to allocate descriptors\");\n    dfn.vkDestroyDescriptorPool(device, new_descriptor_pool, nullptr);\n    return VK_NULL_HANDLE;\n  }\n  if (new_page_becomes_full) {\n    pages_full_.push_back(new_descriptor_pool);\n  } else {\n    // Move the latest page that allocation couldn't be done in to the usable\n    // pages to replace it with the new one.\n    if (page_usable_latest_.pool != VK_NULL_HANDLE) {\n      // Calculate the map key (the maximum number of remaining descriptors of\n      // any type).\n      uint32_t latest_page_max_descriptors_remaining =\n          page_usable_latest_.descriptors_remaining[0].descriptorCount;\n      for (uint32_t i = 1; i < descriptor_pool_size_count_; ++i) {\n        latest_page_max_descriptors_remaining = std::max(\n            latest_page_max_descriptors_remaining,\n            page_usable_latest_.descriptors_remaining[i].descriptorCount);\n      }\n      assert_not_zero(latest_page_max_descriptors_remaining);\n      pages_usable_.emplace(latest_page_max_descriptors_remaining,\n                            std::move(page_usable_latest_));\n    }\n    page_usable_latest_.pool = new_descriptor_pool;\n    page_usable_latest_.descriptors_remaining =\n        std::unique_ptr<VkDescriptorPoolSize[]>(\n            new VkDescriptorPoolSize[descriptor_pool_size_count_]);\n    for (uint32_t i = 0; i < descriptor_pool_size_count_; ++i) {\n      const VkDescriptorPoolSize& descriptor_pool_size_for_type =\n          descriptor_pool_sizes_[i];\n      page_usable_latest_.descriptors_remaining[i] =\n          descriptor_pool_size_for_type;\n      for (uint32_t j = 0; j < descriptor_type_count; ++j) {\n        const VkDescriptorPoolSize& descriptor_count_for_type =\n            descriptor_counts[j];\n        if (descriptor_count_for_type.type !=\n            descriptor_pool_size_for_type.type) {\n          continue;\n        }\n        page_usable_latest_.descriptors_remaining[i].descriptorCount -=\n            descriptor_count_for_type.descriptorCount;\n        break;\n      }\n    }\n    page_usable_latest_.descriptor_sets_remaining =\n        descriptor_sets_per_page_ - 1;\n  }\n  return descriptor_set;\n}\n\n}  // namespace vulkan\n}  // namespace ui\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/ui/vulkan/linked_type_descriptor_set_allocator.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_VULKAN_LINKED_TYPE_DESCRIPTOR_SET_ALLOCATOR_H_\n#define XENIA_UI_VULKAN_LINKED_TYPE_DESCRIPTOR_SET_ALLOCATOR_H_\n\n#include <algorithm>\n#include <cstdint>\n#include <cstring>\n#include <map>\n#include <memory>\n#include <vector>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/ui/vulkan/vulkan_device.h\"\n\nnamespace xe {\nnamespace ui {\nnamespace vulkan {\n\n// Allocates multiple descriptors of in descriptor set layouts consisting of\n// descriptors of types specified during initialization.\n//\n// \"LinkedType\" means that the allocator is designed for allocating descriptor\n// sets containing descriptors of multiple types together - for instance, it\n// will mark the entire page as full even if no space is left in it for just one\n// of the descriptor types (not all at once).\n//\n// The primary usage scenario for this kind of an allocator is allocating image\n// and sampler descriptors in a single descriptor set if they both are actually\n// used in one. It is expected that the ratio of the numbers of descriptors per\n// type specified during the initialization will roughly correspond to the ratio\n// of the numbers of descriptors that will actually be allocated. For instance,\n// if there are approximately 2 images for each 1 sampler, it's recommended to\n// make the image count per page twice the sampler count per page.\n//\n// If some allocations use just one type, and some use just another, completely\n// independently, it's preferable to use separate allocators rather than a\n// single one.\n//\n// This allocator is also suitable for allocating variable-length descriptor\n// sets containing descriptors of just a single type.\n//\n// There's no way to free these descriptors within the allocator object itself,\n// per-layout free lists should be used externally.\nclass LinkedTypeDescriptorSetAllocator {\n public:\n  // Multiple descriptor sizes for the same descriptor type, and zero sizes, are\n  // not allowed.\n  explicit LinkedTypeDescriptorSetAllocator(\n      const VulkanDevice* const vulkan_device,\n      const VkDescriptorPoolSize* const descriptor_sizes,\n      const uint32_t descriptor_size_count,\n      const uint32_t descriptor_sets_per_page)\n      : vulkan_device_(vulkan_device),\n        descriptor_pool_sizes_(new VkDescriptorPoolSize[descriptor_size_count]),\n        descriptor_pool_size_count_(descriptor_size_count),\n        descriptor_sets_per_page_(descriptor_sets_per_page) {\n    assert_not_null(vulkan_device);\n    assert_not_zero(descriptor_size_count);\n    assert_not_zero(descriptor_sets_per_page_);\n#ifndef NDEBUG\n    for (uint32_t i = 0; i < descriptor_size_count; ++i) {\n      const VkDescriptorPoolSize& descriptor_size = descriptor_sizes[i];\n      assert_not_zero(descriptor_size.descriptorCount);\n      for (uint32_t j = 0; j < i; ++j) {\n        assert_true(descriptor_sizes[j].type != descriptor_size.type);\n      }\n    }\n#endif\n    std::memcpy(descriptor_pool_sizes_.get(), descriptor_sizes,\n                sizeof(VkDescriptorPoolSize) * descriptor_size_count);\n  }\n  LinkedTypeDescriptorSetAllocator(\n      const LinkedTypeDescriptorSetAllocator& allocator) = delete;\n  LinkedTypeDescriptorSetAllocator& operator=(\n      const LinkedTypeDescriptorSetAllocator& allocator) = delete;\n  ~LinkedTypeDescriptorSetAllocator() { Reset(); }\n\n  void Reset();\n\n  VkDescriptorSet Allocate(VkDescriptorSetLayout descriptor_set_layout,\n                           const VkDescriptorPoolSize* descriptor_counts,\n                           uint32_t descriptor_type_count);\n\n private:\n  struct Page {\n    VkDescriptorPool pool;\n    std::unique_ptr<VkDescriptorPoolSize[]> descriptors_remaining;\n    uint32_t descriptor_sets_remaining;\n  };\n\n  const VulkanDevice* vulkan_device_;\n\n  std::unique_ptr<VkDescriptorPoolSize[]> descriptor_pool_sizes_;\n  uint32_t descriptor_pool_size_count_;\n  uint32_t descriptor_sets_per_page_;\n\n  std::vector<VkDescriptorPool> pages_full_;\n  // Because allocations must be contiguous, overflow may happen even if a page\n  // still has free descriptors, so multiple pages may have free space.\n  // To avoid removing and re-adding the page to the map that keeps them sorted\n  // (the key is the maximum number of free descriptors remaining across all\n  // types - and lookups need to be made with the maximum of the requested\n  // number of descriptors across all types since it's pointless to check the\n  // pages that can't even potentially fit the largest amount of descriptors of\n  // a requested type, and unlike using the minimum as the key, this doesn't\n  // degenerate if, for example, 0 descriptors are requested for some type - and\n  // it changes at every allocation from a page), instead of always looking for\n  // a free space in the map, maintaining one page outside the map, and\n  // allocation attempts will be made from that page first.\n  std::multimap<uint32_t, Page> pages_usable_;\n  // Doesn't exist if page_usable_latest_.pool == VK_NULL_HANDLE.\n  Page page_usable_latest_ = {};\n};\n\n}  // namespace vulkan\n}  // namespace ui\n}  // namespace xe\n\n#endif  // XENIA_UI_VULKAN_CONNECTED_DESCRIPTOR_SET_ALLOCATOR_H_\n"
  },
  {
    "path": "src/xenia/ui/vulkan/premake5.lua",
    "content": "project_root = \"../../../..\"\ninclude(project_root..\"/tools/build\")\n\ngroup(\"src\")\nproject(\"xenia-ui-vulkan\")\n  uuid(\"4933d81e-1c2c-4d5d-b104-3c0eb9dc2f00\")\n  kind(\"StaticLib\")\n  language(\"C++\")\n  links({\n    \"xenia-base\",\n    \"xenia-ui\",\n  })\n  includedirs({\n    project_root..\"/third_party/Vulkan-Headers/include\",\n  })\n  local_platform_files()\n  local_platform_files(\"functions\")\n  files({\n    \"../shaders/bytecode/vulkan_spirv/*.h\",\n  })\n\ngroup(\"demos\")\nproject(\"xenia-ui-window-vulkan-demo\")\n  uuid(\"97598f13-3177-454c-8e58-c59e2b6ede27\")\n  single_library_windowed_app_kind()\n  language(\"C++\")\n  links({\n    \"fmt\",\n    \"imgui\",\n    \"xenia-base\",\n    \"xenia-ui\",\n    \"xenia-ui-vulkan\",\n  })\n  includedirs({\n    project_root..\"/third_party/Vulkan-Headers/include\",\n  })\n  files({\n    \"../window_demo.cc\",\n    \"vulkan_window_demo.cc\",\n    project_root..\"/src/xenia/ui/windowed_app_main_\"..platform_suffix..\".cc\",\n  })\n  resincludedirs({\n    project_root,\n  })\n\n  filter(\"platforms:Linux\")\n    links({\n      \"X11\",\n      \"xcb\",\n      \"X11-xcb\",\n    })\n"
  },
  {
    "path": "src/xenia/ui/vulkan/single_layout_descriptor_set_pool.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/ui/vulkan/single_layout_descriptor_set_pool.h\"\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/logging.h\"\n\nnamespace xe {\nnamespace ui {\nnamespace vulkan {\n\nSingleLayoutDescriptorSetPool::SingleLayoutDescriptorSetPool(\n    const VulkanDevice* const vulkan_device, const uint32_t pool_set_count,\n    const uint32_t set_layout_descriptor_counts_count,\n    const VkDescriptorPoolSize* const set_layout_descriptor_counts,\n    const VkDescriptorSetLayout set_layout)\n    : vulkan_device_(vulkan_device),\n      pool_set_count_(pool_set_count),\n      set_layout_(set_layout) {\n  assert_not_null(vulkan_device);\n  assert_not_zero(pool_set_count);\n  pool_descriptor_counts_.resize(set_layout_descriptor_counts_count);\n  for (uint32_t i = 0; i < set_layout_descriptor_counts_count; ++i) {\n    VkDescriptorPoolSize& pool_descriptor_type_count =\n        pool_descriptor_counts_[i];\n    const VkDescriptorPoolSize& set_layout_descriptor_type_count =\n        set_layout_descriptor_counts[i];\n    pool_descriptor_type_count.type = set_layout_descriptor_type_count.type;\n    pool_descriptor_type_count.descriptorCount =\n        set_layout_descriptor_type_count.descriptorCount * pool_set_count;\n  }\n}\n\nSingleLayoutDescriptorSetPool::~SingleLayoutDescriptorSetPool() {\n  const VulkanDevice::Functions& dfn = vulkan_device_->functions();\n  const VkDevice device = vulkan_device_->device();\n  if (current_pool_ != VK_NULL_HANDLE) {\n    dfn.vkDestroyDescriptorPool(device, current_pool_, nullptr);\n  }\n  for (VkDescriptorPool pool : full_pools_) {\n    dfn.vkDestroyDescriptorPool(device, pool, nullptr);\n  }\n}\n\nsize_t SingleLayoutDescriptorSetPool::Allocate() {\n  if (!descriptor_sets_free_.empty()) {\n    size_t free_index = descriptor_sets_free_.back();\n    descriptor_sets_free_.pop_back();\n    return free_index;\n  }\n\n  const VulkanDevice::Functions& dfn = vulkan_device_->functions();\n  const VkDevice device = vulkan_device_->device();\n\n  // Two iterations so if vkAllocateDescriptorSets fails even with a non-zero\n  // current_pool_sets_remaining_, another attempt will be made in a new pool.\n  for (uint32_t i = 0; i < 2; ++i) {\n    if (current_pool_ != VK_NULL_HANDLE && !current_pool_sets_remaining_) {\n      full_pools_.push_back(current_pool_);\n      current_pool_ = VK_NULL_HANDLE;\n    }\n    if (current_pool_ == VK_NULL_HANDLE) {\n      VkDescriptorPoolCreateInfo pool_create_info;\n      pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;\n      pool_create_info.pNext = nullptr;\n      pool_create_info.flags = 0;\n      pool_create_info.maxSets = pool_set_count_;\n      pool_create_info.poolSizeCount = uint32_t(pool_descriptor_counts_.size());\n      pool_create_info.pPoolSizes = pool_descriptor_counts_.data();\n      if (dfn.vkCreateDescriptorPool(device, &pool_create_info, nullptr,\n                                     &current_pool_) != VK_SUCCESS) {\n        XELOGE(\n            \"SingleLayoutDescriptorSetPool: Failed to create a descriptor \"\n            \"pool\");\n        return SIZE_MAX;\n      }\n      current_pool_sets_remaining_ = pool_set_count_;\n    }\n\n    VkDescriptorSetAllocateInfo descriptor_set_allocate_info;\n    descriptor_set_allocate_info.sType =\n        VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;\n    descriptor_set_allocate_info.pNext = nullptr;\n    descriptor_set_allocate_info.descriptorPool = current_pool_;\n    descriptor_set_allocate_info.descriptorSetCount = 1;\n    descriptor_set_allocate_info.pSetLayouts = &set_layout_;\n    VkDescriptorSet descriptor_set;\n    if (dfn.vkAllocateDescriptorSets(device, &descriptor_set_allocate_info,\n                                     &descriptor_set) != VK_SUCCESS) {\n      XELOGE(\n          \"SingleLayoutDescriptorSetPool: Failed to allocate a descriptor set\");\n      if (current_pool_sets_remaining_ >= pool_set_count_) {\n        // Failed to allocate in a new pool - something completely wrong, don't\n        // store empty pools as full.\n        dfn.vkDestroyDescriptorPool(device, current_pool_, nullptr);\n        current_pool_ = VK_NULL_HANDLE;\n        return SIZE_MAX;\n      }\n      full_pools_.push_back(current_pool_);\n      current_pool_ = VK_NULL_HANDLE;\n    }\n    --current_pool_sets_remaining_;\n    descriptor_sets_.push_back(descriptor_set);\n    return descriptor_sets_.size() - 1;\n  }\n\n  // Both attempts have failed.\n  return SIZE_MAX;\n}\n\n}  // namespace vulkan\n}  // namespace ui\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/ui/vulkan/single_layout_descriptor_set_pool.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_VULKAN_SINGLE_DESCRIPTOR_SET_POOL_H_\n#define XENIA_UI_VULKAN_SINGLE_DESCRIPTOR_SET_POOL_H_\n\n#include <cstddef>\n#include <cstdint>\n#include <vector>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/ui/vulkan/vulkan_device.h\"\n\nnamespace xe {\nnamespace ui {\nnamespace vulkan {\n\nclass SingleLayoutDescriptorSetPool {\n public:\n  // set_layout_descriptor_counts must contain the numbers of descriptors of\n  // each type in a single set with the layout (the multiplication by the pool\n  // set count will be done internally). The descriptor set layout must not be\n  // destroyed until this object is also destroyed.\n  SingleLayoutDescriptorSetPool(\n      const VulkanDevice* vulkan_device, uint32_t pool_set_count,\n      uint32_t set_layout_descriptor_counts_count,\n      const VkDescriptorPoolSize* set_layout_descriptor_counts,\n      VkDescriptorSetLayout set_layout);\n  ~SingleLayoutDescriptorSetPool();\n\n  // Returns SIZE_MAX in case of a failure.\n  size_t Allocate();\n  void Free(size_t index) {\n    assert_true(index < descriptor_sets_.size());\n    descriptor_sets_free_.push_back(index);\n  }\n  VkDescriptorSet Get(size_t index) const { return descriptor_sets_[index]; }\n\n private:\n  const VulkanDevice* vulkan_device_;\n  uint32_t pool_set_count_;\n  std::vector<VkDescriptorPoolSize> pool_descriptor_counts_;\n  VkDescriptorSetLayout set_layout_;\n\n  std::vector<VkDescriptorPool> full_pools_;\n  VkDescriptorPool current_pool_ = VK_NULL_HANDLE;\n  uint32_t current_pool_sets_remaining_ = 0;\n\n  std::vector<VkDescriptorSet> descriptor_sets_;\n  std::vector<size_t> descriptor_sets_free_;\n};\n\n}  // namespace vulkan\n}  // namespace ui\n}  // namespace xe\n\n#endif  // XENIA_UI_VULKAN_SINGLE_DESCRIPTOR_SET_POOL_H_\n"
  },
  {
    "path": "src/xenia/ui/vulkan/spirv_tools_context.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/ui/vulkan/spirv_tools_context.h\"\n\n#include <cstdlib>\n#include <filesystem>\n#include <string>\n\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/platform.h\"\n\n#if XE_PLATFORM_LINUX\n#include <dlfcn.h>\n#elif XE_PLATFORM_WIN32\n#include \"xenia/base/platform_win.h\"\n#endif\n\nnamespace xe {\nnamespace ui {\nnamespace vulkan {\n\nbool SpirvToolsContext::Initialize(unsigned int spirv_version) {\n  const char* vulkan_sdk_env = std::getenv(\"VULKAN_SDK\");\n  if (!vulkan_sdk_env) {\n    XELOGE(\"SPIRV-Tools: Failed to get the VULKAN_SDK environment variable\");\n    Shutdown();\n    return false;\n  }\n  std::filesystem::path vulkan_sdk_path(vulkan_sdk_env);\n#if XE_PLATFORM_LINUX\n  library_ = dlopen((vulkan_sdk_path / \"bin/libSPIRV-Tools-shared.so\").c_str(),\n                    RTLD_NOW | RTLD_LOCAL);\n  if (!library_) {\n    XELOGE(\n        \"SPIRV-Tools: Failed to load $VULKAN_SDK/bin/libSPIRV-Tools-shared.so\");\n    Shutdown();\n    return false;\n  }\n#elif XE_PLATFORM_WIN32\n  library_ = LoadLibraryW(\n      (vulkan_sdk_path / \"Bin/SPIRV-Tools-shared.dll\").wstring().c_str());\n  if (!library_) {\n    XELOGE(\n        \"SPIRV-Tools: Failed to load %VULKAN_SDK%/Bin/SPIRV-Tools-shared.dll\");\n    Shutdown();\n    return false;\n  }\n#else\n#error No SPIRV-Tools library loading provided for the target platform.\n#endif\n  if (!LoadLibraryFunction(fn_spvContextCreate_, \"spvContextCreate\") ||\n      !LoadLibraryFunction(fn_spvContextDestroy_, \"spvContextDestroy\") ||\n      !LoadLibraryFunction(fn_spvValidateBinary_, \"spvValidateBinary\") ||\n      !LoadLibraryFunction(fn_spvDiagnosticDestroy_, \"spvDiagnosticDestroy\")) {\n    XELOGE(\"SPIRV-Tools: Failed to get library function pointers\");\n    Shutdown();\n    return false;\n  }\n  spv_target_env target_env;\n  if (spirv_version >= 0x10500) {\n    target_env = SPV_ENV_VULKAN_1_2;\n  } else if (spirv_version >= 0x10400) {\n    target_env = SPV_ENV_VULKAN_1_1_SPIRV_1_4;\n  } else if (spirv_version >= 0x10300) {\n    target_env = SPV_ENV_VULKAN_1_1;\n  } else {\n    target_env = SPV_ENV_VULKAN_1_0;\n  }\n  context_ = fn_spvContextCreate_(target_env);\n  if (!context_) {\n    XELOGE(\"SPIRV-Tools: Failed to create a Vulkan 1.0 context\");\n    Shutdown();\n    return false;\n  }\n  return true;\n}\n\nvoid SpirvToolsContext::Shutdown() {\n  if (context_) {\n    fn_spvContextDestroy_(context_);\n    context_ = nullptr;\n  }\n  if (library_) {\n#if XE_PLATFORM_LINUX\n    dlclose(library_);\n#elif XE_PLATFORM_WIN32\n    FreeLibrary(library_);\n#endif\n    library_ = nullptr;\n  }\n}\n\nspv_result_t SpirvToolsContext::Validate(const uint32_t* words,\n                                         size_t num_words,\n                                         std::string* error) const {\n  if (error) {\n    error->clear();\n  }\n  if (!context_) {\n    return SPV_UNSUPPORTED;\n  }\n  spv_diagnostic diagnostic = nullptr;\n  spv_result_t result =\n      fn_spvValidateBinary_(context_, words, num_words, &diagnostic);\n  if (diagnostic) {\n    if (error && diagnostic && diagnostic->error) {\n      *error = diagnostic->error;\n    }\n    fn_spvDiagnosticDestroy_(diagnostic);\n  }\n  return result;\n}\n\n}  // namespace vulkan\n}  // namespace ui\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/ui/vulkan/spirv_tools_context.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_VULKAN_SPIRV_TOOLS_CONTEXT_H_\n#define XENIA_UI_VULKAN_SPIRV_TOOLS_CONTEXT_H_\n\n#include <cstdint>\n#include <string>\n\n#include \"third_party/SPIRV-Tools/include/spirv-tools/libspirv.h\"\n#include \"xenia/base/platform.h\"\n\n#if XE_PLATFORM_LINUX\n#include <dlfcn.h>\n#elif XE_PLATFORM_WIN32\n#include \"xenia/base/platform_win.h\"\n#endif\n\nnamespace xe {\nnamespace ui {\nnamespace vulkan {\n\nclass SpirvToolsContext {\n public:\n  SpirvToolsContext() {}\n  SpirvToolsContext(const SpirvToolsContext& context) = delete;\n  SpirvToolsContext& operator=(const SpirvToolsContext& context) = delete;\n  ~SpirvToolsContext() { Shutdown(); }\n  bool Initialize(unsigned int spirv_version);\n  void Shutdown();\n\n  spv_result_t Validate(const uint32_t* words, size_t num_words,\n                        std::string* error) const;\n\n private:\n#if XE_PLATFORM_LINUX\n  void* library_ = nullptr;\n#elif XE_PLATFORM_WIN32\n  HMODULE library_ = nullptr;\n#endif\n\n  template <typename FunctionPointer>\n  bool LoadLibraryFunction(FunctionPointer& function, const char* name) {\n#if XE_PLATFORM_LINUX\n    function = reinterpret_cast<FunctionPointer>(dlsym(library_, name));\n#elif XE_PLATFORM_WIN32\n    function =\n        reinterpret_cast<FunctionPointer>(GetProcAddress(library_, name));\n#else\n#error No SPIRV-Tools LoadLibraryFunction provided for the target platform.\n#endif\n    return function != nullptr;\n  }\n  decltype(&spvContextCreate) fn_spvContextCreate_ = nullptr;\n  decltype(&spvContextDestroy) fn_spvContextDestroy_ = nullptr;\n  decltype(&spvValidateBinary) fn_spvValidateBinary_ = nullptr;\n  decltype(&spvDiagnosticDestroy) fn_spvDiagnosticDestroy_ = nullptr;\n\n  spv_context context_ = nullptr;\n};\n\n}  // namespace vulkan\n}  // namespace ui\n}  // namespace xe\n\n#endif  // XENIA_UI_VULKAN_SPIRV_TOOLS_CONTEXT_H_\n"
  },
  {
    "path": "src/xenia/ui/vulkan/ui_samplers.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2025 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/ui/vulkan/ui_samplers.h\"\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/logging.h\"\n\nnamespace xe {\nnamespace ui {\nnamespace vulkan {\n\nstd::unique_ptr<UISamplers> UISamplers::Create(\n    const VulkanDevice* const vulkan_device) {\n  assert_not_null(vulkan_device);\n\n  std::unique_ptr<UISamplers> ui_samplers(new UISamplers(vulkan_device));\n\n  const VulkanDevice::Functions& dfn = vulkan_device->functions();\n  const VkDevice device = vulkan_device->device();\n\n  VkSamplerCreateInfo sampler_create_info = {\n      VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO};\n\n  for (int sampler_index = 0; sampler_index < kSamplerCount; ++sampler_index) {\n    if (sampler_index == kSamplerIndexLinearRepeat ||\n        sampler_index == kSamplerIndexLinearClampToEdge) {\n      sampler_create_info.magFilter = VK_FILTER_LINEAR;\n      sampler_create_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_LINEAR;\n    } else {\n      sampler_create_info.magFilter = VK_FILTER_NEAREST;\n      sampler_create_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;\n    }\n    sampler_create_info.minFilter = sampler_create_info.magFilter;\n\n    if (sampler_index == kSamplerIndexNearestClampToEdge ||\n        sampler_index == kSamplerIndexLinearClampToEdge) {\n      sampler_create_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;\n    } else {\n      sampler_create_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_REPEAT;\n    }\n    sampler_create_info.addressModeV = sampler_create_info.addressModeU;\n    sampler_create_info.addressModeW = sampler_create_info.addressModeU;\n\n    const VkResult sampler_create_result =\n        dfn.vkCreateSampler(device, &sampler_create_info, nullptr,\n                            &ui_samplers->samplers_[sampler_index]);\n    if (sampler_create_result != VK_SUCCESS) {\n      XELOGE(\n          \"Failed to create the Vulkan UI sampler with filter {}, addressing \"\n          \"mode {}: {}\",\n          vk::to_string(vk::Filter(sampler_create_info.magFilter)),\n          vk::to_string(\n              vk::SamplerAddressMode(sampler_create_info.addressModeU)),\n          vk::to_string(vk::Result(sampler_create_result)));\n      return nullptr;\n    }\n  }\n\n  return ui_samplers;\n}\n\nUISamplers::~UISamplers() {\n  for (const VkSampler sampler : samplers_) {\n    if (sampler == VK_NULL_HANDLE) {\n      continue;\n    }\n    vulkan_device_->functions().vkDestroySampler(vulkan_device_->device(),\n                                                 sampler, nullptr);\n  }\n}\n\nUISamplers::UISamplers(const VulkanDevice* vulkan_device)\n    : vulkan_device_(vulkan_device) {\n  assert_not_null(vulkan_device);\n\n  samplers_.fill(VK_NULL_HANDLE);\n}\n\n}  // namespace vulkan\n}  // namespace ui\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/ui/vulkan/ui_samplers.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2025 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_VULKAN_VULKAN_UI_SAMPLERS_H_\n#define XENIA_UI_VULKAN_VULKAN_UI_SAMPLERS_H_\n\n#include <array>\n#include <memory>\n\n#include \"xenia/ui/vulkan/vulkan_device.h\"\n\nnamespace xe {\nnamespace ui {\nnamespace vulkan {\n\n/// Samplers that can be used for presentation and UI drawing.\n/// Because maxSamplerAllocationCount can be as low as 4000 (on Nvidia and Intel\n/// GPUs primarily), no other samplers must be created for UI purposes.\n/// The rest of the sampler allocation space on the device must be available to\n/// GPU emulation.\nclass UISamplers {\n public:\n  static std::unique_ptr<UISamplers> Create(const VulkanDevice* vulkan_device);\n\n  UISamplers(const UISamplers&) = delete;\n  UISamplers& operator=(const UISamplers&) = delete;\n  UISamplers(UISamplers&&) = delete;\n  UISamplers& operator=(UISamplers&&) = delete;\n\n  ~UISamplers();\n\n  enum SamplerIndex {\n    kSamplerIndexNearestRepeat,\n    kSamplerIndexNearestClampToEdge,\n    kSamplerIndexLinearRepeat,\n    kSamplerIndexLinearClampToEdge,\n\n    kSamplerCount,\n  };\n\n  const std::array<VkSampler, kSamplerCount>& samplers() const {\n    return samplers_;\n  }\n\n private:\n  explicit UISamplers(const VulkanDevice* vulkan_device);\n\n  const VulkanDevice* vulkan_device_;\n\n  std::array<VkSampler, kSamplerCount> samplers_;\n};\n\n}  // namespace vulkan\n}  // namespace ui\n}  // namespace xe\n\n#endif  // XENIA_UI_VULKAN_VULKAN_UI_SAMPLERS_H_\n"
  },
  {
    "path": "src/xenia/ui/vulkan/vulkan_api.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2025 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_VULKAN_VULKAN_API_H_\n#define XENIA_UI_VULKAN_VULKAN_API_H_\n\n#include \"xenia/base/assert.h\"  // For Vulkan-Hpp.\n#include \"xenia/base/platform.h\"\n\n#ifndef VK_NO_PROTOTYPES\n#define VK_NO_PROTOTYPES\n#endif\n\n#ifndef VK_ENABLE_BETA_EXTENSIONS\n#define VK_ENABLE_BETA_EXTENSIONS\n#endif\n\n#if XE_PLATFORM_ANDROID\n#ifndef VK_USE_PLATFORM_ANDROID_KHR\n#define VK_USE_PLATFORM_ANDROID_KHR\n#endif\n#endif\n\n#if XE_PLATFORM_GNU_LINUX\n#ifndef VK_USE_PLATFORM_XCB_KHR\n#define VK_USE_PLATFORM_XCB_KHR\n#endif\n#endif\n\n#if XE_PLATFORM_WIN32\n// Must be included before including vulkan.h with VK_USE_PLATFORM_WIN32_KHR\n// because it includes Windows.h too.\n#include \"xenia/base/platform_win.h\"\n#ifndef VK_USE_PLATFORM_WIN32_KHR\n#define VK_USE_PLATFORM_WIN32_KHR\n#endif\n#endif\n\n#include \"third_party/Vulkan-Headers/include/vulkan/vulkan.h\"\n\n#include \"third_party/Vulkan-Headers/include/vulkan/vulkan_hpp_macros.hpp\"\n#include \"third_party/Vulkan-Headers/include/vulkan/vulkan_to_string.hpp\"\n\n#endif  // XENIA_UI_VULKAN_VULKAN_API_H_\n"
  },
  {
    "path": "src/xenia/ui/vulkan/vulkan_device.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2025 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/ui/vulkan/vulkan_device.h\"\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/platform.h\"\n\n#include <algorithm>\n#include <cstring>\n#include <string>\n#include <unordered_map>\n#include <vector>\n\nnamespace xe {\nnamespace ui {\nnamespace vulkan {\n\ntemplate <typename Structure, VkStructureType StructureType>\nstruct VulkanFeatures {\n  Structure supported = {StructureType};\n  Structure enabled = {StructureType};\n\n  void Link(VkPhysicalDeviceFeatures2& supported_features_2,\n            VkDeviceCreateInfo& device_create_info) {\n    supported.pNext = supported_features_2.pNext;\n    supported_features_2.pNext = &supported;\n    enabled.pNext = const_cast<void*>(device_create_info.pNext);\n    device_create_info.pNext = &enabled;\n  }\n};\n\nstd::unique_ptr<VulkanDevice> VulkanDevice::CreateIfSupported(\n    const VulkanInstance* const vulkan_instance,\n    const VkPhysicalDevice physical_device, const bool with_gpu_emulation,\n    const bool with_swapchain) {\n  assert_not_null(vulkan_instance);\n  assert_not_null(physical_device);\n\n  const VulkanInstance::Functions& ifn = vulkan_instance->functions();\n\n  // Get supported Vulkan 1.0 properties and features.\n\n  VkPhysicalDeviceProperties properties = {};\n  ifn.vkGetPhysicalDeviceProperties(physical_device, &properties);\n\n  // From the VkApplicationInfo specification:\n  //\n  // \"The Khronos validation layers will treat apiVersion as the highest API\n  // version the application targets, and will validate API usage against the\n  // minimum of that version and the implementation version (instance or device,\n  // depending on context). If an application tries to use functionality from a\n  // greater version than this, a validation error will be triggered.\"\n  //\n  // \"Vulkan 1.0 implementations were required to return\n  // VK_ERROR_INCOMPATIBLE_DRIVER if apiVersion was larger than 1.0.\"\n  //\n  // Make sure that all usages of the API version in Xenia receive the highest\n  // minor version that Xenia has been tested on.\n  // Libraries such as the Vulkan Memory Allocator also may expect a minor\n  // version that is known to them.\n  const uint32_t unclamped_api_version = properties.apiVersion;\n  const uint32_t clamped_api_minor_version = std::min(\n      VK_MAKE_API_VERSION(VK_API_VERSION_VARIANT(unclamped_api_version),\n                          VK_API_VERSION_MAJOR(unclamped_api_version),\n                          VK_API_VERSION_MINOR(unclamped_api_version), 0),\n      vulkan_instance->api_version() >= VK_MAKE_API_VERSION(0, 1, 1, 0)\n          ? kHighestUsedApiMinorVersion\n          : VK_MAKE_API_VERSION(0, 1, 0, 0));\n  properties.apiVersion =\n      VK_MAKE_API_VERSION(VK_API_VERSION_VARIANT(clamped_api_minor_version),\n                          VK_API_VERSION_MAJOR(clamped_api_minor_version),\n                          VK_API_VERSION_MINOR(clamped_api_minor_version),\n                          VK_API_VERSION_PATCH(unclamped_api_version));\n\n  VkPhysicalDeviceFeatures supported_features = {};\n  ifn.vkGetPhysicalDeviceFeatures(physical_device, &supported_features);\n\n  if (with_gpu_emulation) {\n    if (!supported_features.independentBlend) {\n      // Not trivial to work around:\n      // - Affects not only the blend equation, but also the color write mask.\n      // - Can't reuse the blend state of the first attachment for all because\n      //   some attachments may have a format that doesn't support blending.\n      // - Not possible to split the draw into per-attachment draws because of\n      //   depth / stencil.\n      // Not supported only on the proprietary driver for the Qualcomm\n      // Adreno 4xx, where the driver is largely experimental and doesn't expose\n      // a lot of the functionality available in the hardware.\n      XELOGW(\n          \"Vulkan device '{}' doesn't support the independentBlend feature \"\n          \"required for GPU emulation\",\n          properties.deviceName);\n      return nullptr;\n    }\n  }\n\n  // Enable needed extensions.\n\n  std::unique_ptr<VulkanDevice> device(\n      new VulkanDevice(vulkan_instance, physical_device));\n\n  const bool get_physical_device_properties2_supported =\n      vulkan_instance->extensions().ext_1_1_KHR_get_physical_device_properties2;\n\n  // Name pointers from `requested_extensions` will be used in the enabled\n  // extensions vector.\n  std::unordered_map<std::string, bool*> requested_extensions;\n\n  const auto request_promoted_extension =\n      [&](const char* const name, uint32_t const major, uint32_t const minor,\n          bool* const supported_ptr) {\n        assert_not_null(supported_ptr);\n        if (properties.apiVersion >= VK_MAKE_API_VERSION(0, major, minor, 0)) {\n          *supported_ptr = true;\n        } else {\n          requested_extensions.emplace(name, supported_ptr);\n        }\n      };\n\n#define XE_UI_VULKAN_STRUCT_EXTENSION(name) \\\n  requested_extensions.emplace(\"VK_\" #name, &device->extensions_.ext_##name);\n#define XE_UI_VULKAN_LOCAL_EXTENSION(name) \\\n  requested_extensions.emplace(\"VK_\" #name, &ext_##name);\n#define XE_UI_VULKAN_STRUCT_PROMOTED_EXTENSION(name, major, minor) \\\n  request_promoted_extension(                                      \\\n      \"VK_\" #name, major, minor,                                   \\\n      &device->extensions_.ext_##major##_##minor##_##name);\n#define XE_UI_VULKAN_LOCAL_PROMOTED_EXTENSION(name, major, minor) \\\n  request_promoted_extension(\"VK_\" #name, major, minor,           \\\n                             &ext_##major##_##minor##_##name);\n\n  bool ext_KHR_portability_subset = false;\n  bool ext_1_2_KHR_driver_properties = false;\n  if (get_physical_device_properties2_supported) {\n    // #164. Must be enabled according to the specification if the physical\n    // device is a portability subset one.\n    XE_UI_VULKAN_LOCAL_EXTENSION(KHR_portability_subset)\n    // #197\n    XE_UI_VULKAN_LOCAL_PROMOTED_EXTENSION(KHR_driver_properties, 1, 2)\n  }\n\n  // Used by the Vulkan Memory Allocator and potentially by Xenia.\n  // #128.\n  XE_UI_VULKAN_STRUCT_PROMOTED_EXTENSION(KHR_dedicated_allocation, 1, 1)\n  // #147. Also must be enabled for VK_KHR_dedicated_allocation and\n  // VK_KHR_sampler_ycbcr_conversion.\n  XE_UI_VULKAN_STRUCT_PROMOTED_EXTENSION(KHR_get_memory_requirements2, 1, 1)\n  // #158. Also must be enabled for VK_KHR_sampler_ycbcr_conversion.\n  XE_UI_VULKAN_STRUCT_PROMOTED_EXTENSION(KHR_bind_memory2, 1, 1)\n  if (get_physical_device_properties2_supported) {\n    // #238.\n    XE_UI_VULKAN_STRUCT_EXTENSION(EXT_memory_budget)\n  }\n  if (properties.apiVersion >= VK_MAKE_API_VERSION(0, 1, 1, 0)) {\n    // #414.\n    XE_UI_VULKAN_STRUCT_PROMOTED_EXTENSION(KHR_maintenance4, 1, 3)\n  }\n\n  if (with_swapchain) {\n    // #2.\n    XE_UI_VULKAN_STRUCT_EXTENSION(KHR_swapchain)\n  }\n\n  bool ext_1_2_KHR_sampler_mirror_clamp_to_edge = false;\n  bool ext_1_1_KHR_maintenance1 = false;\n  bool ext_1_2_KHR_shader_float_controls = false;\n  bool ext_EXT_fragment_shader_interlock = false;\n  bool ext_1_3_EXT_shader_demote_to_helper_invocation = false;\n  bool ext_EXT_non_seamless_cube_map = false;\n  if (with_gpu_emulation) {\n    // #15.\n    XE_UI_VULKAN_LOCAL_PROMOTED_EXTENSION(KHR_sampler_mirror_clamp_to_edge, 1,\n                                          2)\n    // #70. Must be enabled for VK_KHR_sampler_ycbcr_conversion.\n    XE_UI_VULKAN_LOCAL_PROMOTED_EXTENSION(KHR_maintenance1, 1, 1)\n    // #141.\n    XE_UI_VULKAN_STRUCT_EXTENSION(EXT_shader_stencil_export)\n    // #148.\n    XE_UI_VULKAN_STRUCT_PROMOTED_EXTENSION(KHR_image_format_list, 1, 2)\n    if (get_physical_device_properties2_supported) {\n      // #157.\n      XE_UI_VULKAN_STRUCT_PROMOTED_EXTENSION(KHR_sampler_ycbcr_conversion, 1, 1)\n      // #198. Also must be enabled for VK_KHR_spirv_1_4.\n      XE_UI_VULKAN_LOCAL_PROMOTED_EXTENSION(KHR_shader_float_controls, 1, 2)\n      // #252.\n      XE_UI_VULKAN_LOCAL_EXTENSION(EXT_fragment_shader_interlock)\n      // #277.\n      XE_UI_VULKAN_LOCAL_PROMOTED_EXTENSION(\n          EXT_shader_demote_to_helper_invocation, 1, 3)\n      // #423.\n      XE_UI_VULKAN_LOCAL_EXTENSION(EXT_non_seamless_cube_map)\n    }\n    if (properties.apiVersion >= VK_MAKE_API_VERSION(0, 1, 1, 0)) {\n      // #237.\n      XE_UI_VULKAN_STRUCT_PROMOTED_EXTENSION(KHR_spirv_1_4, 1, 2)\n    }\n  }\n\n#undef XE_UI_VULKAN_STRUCT_EXTENSION\n#undef XE_UI_VULKAN_LOCAL_EXTENSION\n#undef XE_UI_VULKAN_STRUCT_PROMOTED_EXTENSION\n#undef XE_UI_VULKAN_LOCAL_PROMOTED_EXTENSION\n\n  std::vector<const char*> enabled_extensions;\n  {\n    uint32_t supported_extension_count = 0;\n    const VkResult get_supported_extension_count_result =\n        ifn.vkEnumerateDeviceExtensionProperties(\n            physical_device, nullptr, &supported_extension_count, nullptr);\n    if (get_supported_extension_count_result != VK_SUCCESS &&\n        get_supported_extension_count_result != VK_INCOMPLETE) {\n      XELOGW(\"Failed to get the Vulkan device '{}' extension count\",\n             properties.deviceName);\n      return nullptr;\n    }\n    if (supported_extension_count) {\n      std::vector<VkExtensionProperties> supported_extensions(\n          supported_extension_count);\n      if (ifn.vkEnumerateDeviceExtensionProperties(\n              physical_device, nullptr, &supported_extension_count,\n              supported_extensions.data()) != VK_SUCCESS) {\n        XELOGW(\"Failed to get the Vulkan device '{}' extensions\",\n               properties.deviceName);\n        return nullptr;\n      }\n      assert_true(supported_extension_count == supported_extensions.size());\n      for (const VkExtensionProperties& supported_extension :\n           supported_extensions) {\n        const auto requested_extension_it =\n            requested_extensions.find(supported_extension.extensionName);\n        if (requested_extension_it == requested_extensions.cend()) {\n          continue;\n        }\n        assert_not_null(requested_extension_it->second);\n        if (!*requested_extension_it->second) {\n          enabled_extensions.emplace_back(\n              requested_extension_it->first.c_str());\n          *requested_extension_it->second = true;\n        }\n      }\n    }\n  }\n\n  if (with_swapchain && !device->extensions_.ext_KHR_swapchain) {\n    XELOGW(\"Vulkan device '{}' doesn't support swapchains\",\n           properties.deviceName);\n    return nullptr;\n  }\n\n  VkDeviceCreateInfo device_create_info = {\n      VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO};\n\n  device_create_info.enabledExtensionCount =\n      uint32_t(enabled_extensions.size());\n  device_create_info.ppEnabledExtensionNames = enabled_extensions.data();\n\n  // Get supported Vulkan 1.1+ and extension properties and features.\n  //\n  // The property and feature structures are initialized to zero or to the\n  // minimum / maximum requirements for the simplicity of handling unavailable\n  // VK_KHR_get_physical_device_properties2.\n\n  VkPhysicalDeviceProperties2 properties_2 = {\n      VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2};\n\n  VkPhysicalDeviceFeatures2 supported_features_2 = {\n      VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2};\n\n  VulkanFeatures<VkPhysicalDeviceVulkan12Features,\n                 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES>\n      features_1_2;\n  VulkanFeatures<VkPhysicalDeviceVulkan13Features,\n                 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES>\n      features_1_3;\n  VulkanFeatures<\n      VkPhysicalDevicePortabilitySubsetFeaturesKHR,\n      VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR>\n      features_KHR_portability_subset;\n  VkPhysicalDeviceDriverPropertiesKHR properties_1_2_KHR_driver_properties = {\n      VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES};\n  VkPhysicalDeviceFloatControlsProperties\n      properties_1_2_KHR_shader_float_controls = {\n          VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES};\n  VulkanFeatures<\n      VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT,\n      VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT>\n      features_EXT_fragment_shader_interlock;\n  VulkanFeatures<\n      VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT,\n      VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT>\n      features_1_3_EXT_shader_demote_to_helper_invocation;\n  VulkanFeatures<\n      VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT,\n      VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NON_SEAMLESS_CUBE_MAP_FEATURES_EXT>\n      features_EXT_non_seamless_cube_map;\n\n  if (get_physical_device_properties2_supported) {\n    if (properties.apiVersion >= VK_MAKE_API_VERSION(0, 1, 2, 0)) {\n      features_1_2.Link(supported_features_2, device_create_info);\n    }\n    if (properties.apiVersion >= VK_MAKE_API_VERSION(0, 1, 3, 0)) {\n      features_1_3.Link(supported_features_2, device_create_info);\n    } else {\n      if (ext_1_3_EXT_shader_demote_to_helper_invocation) {\n        features_1_3_EXT_shader_demote_to_helper_invocation.Link(\n            supported_features_2, device_create_info);\n      }\n    }\n    if (ext_KHR_portability_subset) {\n      features_KHR_portability_subset.Link(supported_features_2,\n                                           device_create_info);\n    }\n    if (ext_1_2_KHR_driver_properties) {\n      properties_1_2_KHR_driver_properties.pNext = properties_2.pNext;\n      properties_2.pNext = &properties_1_2_KHR_driver_properties;\n    }\n    if (ext_1_2_KHR_shader_float_controls) {\n      properties_1_2_KHR_shader_float_controls.pNext = properties_2.pNext;\n      properties_2.pNext = &properties_1_2_KHR_shader_float_controls;\n    }\n    if (ext_EXT_fragment_shader_interlock) {\n      features_EXT_fragment_shader_interlock.Link(supported_features_2,\n                                                  device_create_info);\n    }\n    if (ext_EXT_non_seamless_cube_map) {\n      features_EXT_non_seamless_cube_map.Link(supported_features_2,\n                                              device_create_info);\n    }\n    ifn.vkGetPhysicalDeviceProperties2(physical_device, &properties_2);\n    ifn.vkGetPhysicalDeviceFeatures2(physical_device, &supported_features_2);\n  }\n\n  uint32_t queue_family_count = 0;\n  ifn.vkGetPhysicalDeviceQueueFamilyProperties(physical_device,\n                                               &queue_family_count, nullptr);\n  std::vector<VkQueueFamilyProperties> queue_families(queue_family_count);\n  ifn.vkGetPhysicalDeviceQueueFamilyProperties(\n      physical_device, &queue_family_count, queue_families.data());\n\n  device->queue_families_.resize(queue_family_count);\n\n  uint32_t first_queue_family_graphics_compute_sparse_binding = UINT32_MAX;\n  uint32_t first_queue_family_graphics_compute = UINT32_MAX;\n  uint32_t first_queue_family_sparse_binding = UINT32_MAX;\n  bool has_presentation_queue_family = false;\n\n  for (uint32_t queue_family_index = 0; queue_family_index < queue_family_count;\n       ++queue_family_index) {\n    QueueFamily& queue_family = device->queue_families_[queue_family_index];\n    const VkQueueFamilyProperties& queue_family_properties =\n        queue_families[queue_family_index];\n\n    const VkQueueFlags queue_unsupported_flags =\n        ~queue_family_properties.queueFlags;\n\n    if (!(queue_unsupported_flags &\n          (VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT))) {\n      first_queue_family_graphics_compute =\n          std::min(queue_family_index, first_queue_family_graphics_compute);\n    }\n\n    if (with_gpu_emulation && supported_features.sparseBinding &&\n        !(queue_unsupported_flags & VK_QUEUE_SPARSE_BINDING_BIT)) {\n      first_queue_family_sparse_binding =\n          std::min(queue_family_index, first_queue_family_sparse_binding);\n      if (!(queue_unsupported_flags &\n            (VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT))) {\n        first_queue_family_graphics_compute_sparse_binding =\n            std::min(queue_family_index,\n                     first_queue_family_graphics_compute_sparse_binding);\n      }\n    }\n\n    if (with_swapchain) {\n#if XE_PLATFORM_WIN32\n      queue_family.may_support_presentation =\n          vulkan_instance->extensions().ext_KHR_win32_surface &&\n          ifn.vkGetPhysicalDeviceWin32PresentationSupportKHR(\n              physical_device, queue_family_index);\n#else\n      queue_family.may_support_presentation = true;\n#endif\n      if (queue_family.may_support_presentation) {\n        queue_family.queues.resize(\n            std::max(size_t(1), queue_family.queues.size()));\n        has_presentation_queue_family = true;\n      }\n    }\n  }\n\n  if (first_queue_family_graphics_compute == UINT32_MAX) {\n    // Not valid according to the Vulkan specification, but for safety.\n    XELOGW(\n        \"Vulkan device '{}' doesn't provide a graphics and compute queue \"\n        \"family\",\n        properties.deviceName);\n    return nullptr;\n  }\n\n  if (with_swapchain && !has_presentation_queue_family) {\n    XELOGW(\n        \"Vulkan device '{}' doesn't provide a queue family that supports \"\n        \"presentation\",\n        properties.deviceName);\n    return nullptr;\n  }\n\n  // Get the queues to create.\n\n  if (first_queue_family_sparse_binding == UINT32_MAX) {\n    // Not valid not to provide a sparse binding queue if the sparseBinding\n    // feature is supported according to the Vulkan specification, but for\n    // safety and simplicity.\n    supported_features.sparseBinding = VK_FALSE;\n  }\n  if (!supported_features.sparseBinding) {\n    supported_features.sparseResidencyBuffer = VK_FALSE;\n    supported_features.sparseResidencyImage2D = VK_FALSE;\n    supported_features.sparseResidencyImage3D = VK_FALSE;\n    supported_features.sparseResidency2Samples = VK_FALSE;\n    supported_features.sparseResidency4Samples = VK_FALSE;\n    supported_features.sparseResidency8Samples = VK_FALSE;\n    supported_features.sparseResidency16Samples = VK_FALSE;\n    supported_features.sparseResidencyAliased = VK_FALSE;\n  }\n\n  // Prefer using one queue for everything whenever possible for simplicity.\n  // TODO(Triang3l): Research if separate queues for purposes like composition,\n  // swapchain image presentation, and sparse binding, may be beneficial.\n\n  if (first_queue_family_graphics_compute_sparse_binding != UINT32_MAX) {\n    device->queue_family_graphics_compute_ =\n        first_queue_family_graphics_compute_sparse_binding;\n    device->queue_family_sparse_binding_ =\n        first_queue_family_graphics_compute_sparse_binding;\n  } else {\n    device->queue_family_graphics_compute_ =\n        first_queue_family_graphics_compute;\n    device->queue_family_sparse_binding_ = first_queue_family_sparse_binding;\n  }\n\n  device->queue_families_[device->queue_family_graphics_compute_].queues.resize(\n      std::max(size_t(1),\n               device->queue_families_[device->queue_family_graphics_compute_]\n                   .queues.size()));\n  if (device->queue_family_sparse_binding_ != UINT32_MAX) {\n    device->queue_families_[device->queue_family_sparse_binding_].queues.resize(\n        std::max(size_t(1),\n                 device->queue_families_[device->queue_family_sparse_binding_]\n                     .queues.size()));\n  }\n\n  size_t max_enabled_queues_per_family = 0;\n  for (const QueueFamily& queue_family : device->queue_families_) {\n    max_enabled_queues_per_family =\n        std::max(queue_family.queues.size(), max_enabled_queues_per_family);\n  }\n  const std::vector<float> queue_priorities(max_enabled_queues_per_family,\n                                            1.0f);\n  std::vector<VkDeviceQueueCreateInfo> queue_create_infos;\n  for (size_t queue_family_index = 0;\n       queue_family_index < device->queue_families_.size();\n       ++queue_family_index) {\n    const QueueFamily& queue_family =\n        device->queue_families_[queue_family_index];\n    if (queue_family.queues.empty()) {\n      continue;\n    }\n    VkDeviceQueueCreateInfo& queue_create_info =\n        queue_create_infos.emplace_back();\n    queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;\n    queue_create_info.pNext = nullptr;\n    queue_create_info.flags = 0;\n    queue_create_info.queueFamilyIndex = uint32_t(queue_family_index);\n    queue_create_info.queueCount = uint32_t(queue_family.queues.size());\n    queue_create_info.pQueuePriorities = queue_priorities.data();\n  }\n  device_create_info.queueCreateInfoCount = uint32_t(queue_create_infos.size());\n  device_create_info.pQueueCreateInfos = queue_create_infos.data();\n\n  // Enable needed features and copy the properties.\n  //\n  // Enabling only actually used features because drivers may take more optimal\n  // paths when certain features are disabled. Also, in VK_EXT_shader_object,\n  // the state that the application must set for the draw depends on which\n  // features are enabled.\n\n  device->properties_.apiVersion = properties.apiVersion;\n  device->properties_.driverVersion = properties.driverVersion;\n  device->properties_.vendorID = properties.vendorID;\n  device->properties_.deviceID = properties.deviceID;\n  std::strcpy(device->properties_.deviceName, properties.deviceName);\n\n  XELOGI(\n      \"Vulkan device '{}': API {}.{}.{} ({}.{} used), vendor 0x{:04X}, device \"\n      \"0x{:04X}, driver version 0x{:X}\",\n      properties.deviceName, VK_VERSION_MAJOR(unclamped_api_version),\n      VK_VERSION_MINOR(unclamped_api_version),\n      VK_VERSION_PATCH(properties.apiVersion),\n      VK_VERSION_MAJOR(properties.apiVersion),\n      VK_VERSION_MINOR(properties.apiVersion), properties.vendorID,\n      properties.deviceID, properties.driverVersion);\n\n  XELOGI(\"Enabled Vulkan device extensions:\");\n  for (uint32_t enabled_extension_index = 0;\n       enabled_extension_index < device_create_info.enabledExtensionCount;\n       ++enabled_extension_index) {\n    XELOGI(\"* {}\",\n           device_create_info.ppEnabledExtensionNames[enabled_extension_index]);\n  }\n\n  XELOGI(\"Vulkan device properties and enabled features:\");\n\n  VkPhysicalDeviceFeatures enabled_features = {};\n  device_create_info.pEnabledFeatures = &enabled_features;\n\n#define XE_UI_VULKAN_LIMIT(name)                     \\\n  device->properties_.name = properties.limits.name; \\\n  XELOGI(\"* \" #name \": {}\", properties.limits.name);\n#define XE_UI_VULKAN_ENUM_LIMIT(name, type)          \\\n  device->properties_.name = properties.limits.name; \\\n  XELOGI(\"* \" #name \": {}\", vk::to_string(vk::type(properties.limits.name)));\n#define XE_UI_VULKAN_FEATURE(name)                    \\\n  enabled_features.name = supported_features.name;    \\\n  device->properties_.name = supported_features.name; \\\n  if (supported_features.name) {                      \\\n    XELOGI(\"* \" #name);                               \\\n  }\n#define XE_UI_VULKAN_PROPERTY_2(structure, name) \\\n  device->properties_.name = structure.name;     \\\n  XELOGI(\"* \" #name \": {}\", structure.name);\n#define XE_UI_VULKAN_ENUM_PROPERTY_2(structure, name, type) \\\n  device->properties_.name = structure.name;                \\\n  XELOGI(\"* \" #name \": {}\", vk::to_string(vk::type(structure.name)));\n#define XE_UI_VULKAN_FEATURE_2(structure, name)        \\\n  structure.enabled.name = structure.supported.name;   \\\n  device->properties_.name = structure.supported.name; \\\n  if (structure.supported.name) {                      \\\n    XELOGI(\"* \" #name);                                \\\n  }\n#define XE_UI_VULKAN_FEATURE_IMPLIED(name) \\\n  device->properties_.name = true;         \\\n  XELOGI(\"* \" #name);\n\n  if (ext_1_2_KHR_driver_properties) {\n    XE_UI_VULKAN_ENUM_PROPERTY_2(properties_1_2_KHR_driver_properties, driverID,\n                                 DriverId);\n    XELOGI(\"* driverName: {}\", properties_1_2_KHR_driver_properties.driverName);\n    if (properties_1_2_KHR_driver_properties.driverInfo[0]) {\n      XELOGI(\"* driverInfo: {}\",\n             properties_1_2_KHR_driver_properties.driverInfo);\n    }\n    XELOGI(\"* conformanceVersion: {}.{}.{}.{}\",\n           properties_1_2_KHR_driver_properties.conformanceVersion.major,\n           properties_1_2_KHR_driver_properties.conformanceVersion.minor,\n           properties_1_2_KHR_driver_properties.conformanceVersion.subminor,\n           properties_1_2_KHR_driver_properties.conformanceVersion.patch);\n  }\n\n  XE_UI_VULKAN_LIMIT(maxImageDimension2D)\n  XE_UI_VULKAN_LIMIT(maxImageDimension3D)\n  XE_UI_VULKAN_LIMIT(maxImageDimensionCube)\n  XE_UI_VULKAN_LIMIT(maxImageArrayLayers)\n  XE_UI_VULKAN_LIMIT(maxStorageBufferRange)\n  XE_UI_VULKAN_LIMIT(maxSamplerAllocationCount)\n  XE_UI_VULKAN_LIMIT(maxPerStageDescriptorSamplers)\n  XE_UI_VULKAN_LIMIT(maxPerStageDescriptorStorageBuffers)\n  XE_UI_VULKAN_LIMIT(maxPerStageDescriptorSampledImages)\n  XE_UI_VULKAN_LIMIT(maxPerStageResources)\n  XE_UI_VULKAN_LIMIT(maxVertexOutputComponents)\n  XE_UI_VULKAN_LIMIT(maxTessellationEvaluationOutputComponents)\n  XE_UI_VULKAN_LIMIT(maxGeometryInputComponents)\n  XE_UI_VULKAN_LIMIT(maxGeometryOutputComponents)\n  XE_UI_VULKAN_LIMIT(maxFragmentInputComponents)\n  XE_UI_VULKAN_LIMIT(maxFragmentCombinedOutputResources)\n  XE_UI_VULKAN_LIMIT(maxSamplerAnisotropy)\n  XE_UI_VULKAN_LIMIT(maxViewportDimensions[0])\n  XE_UI_VULKAN_LIMIT(maxViewportDimensions[1])\n  XE_UI_VULKAN_LIMIT(minUniformBufferOffsetAlignment)\n  XE_UI_VULKAN_LIMIT(minStorageBufferOffsetAlignment)\n  XE_UI_VULKAN_LIMIT(maxFramebufferWidth)\n  XE_UI_VULKAN_LIMIT(maxFramebufferHeight)\n  XE_UI_VULKAN_ENUM_LIMIT(framebufferColorSampleCounts, SampleCountFlags)\n  XE_UI_VULKAN_ENUM_LIMIT(framebufferDepthSampleCounts, SampleCountFlags)\n  XE_UI_VULKAN_ENUM_LIMIT(framebufferStencilSampleCounts, SampleCountFlags)\n  XE_UI_VULKAN_ENUM_LIMIT(framebufferNoAttachmentsSampleCounts,\n                          SampleCountFlags)\n  XE_UI_VULKAN_ENUM_LIMIT(sampledImageColorSampleCounts, SampleCountFlags)\n  XE_UI_VULKAN_ENUM_LIMIT(sampledImageIntegerSampleCounts, SampleCountFlags)\n  XE_UI_VULKAN_ENUM_LIMIT(sampledImageDepthSampleCounts, SampleCountFlags)\n  XE_UI_VULKAN_ENUM_LIMIT(sampledImageStencilSampleCounts, SampleCountFlags)\n  XE_UI_VULKAN_LIMIT(standardSampleLocations)\n  XE_UI_VULKAN_LIMIT(optimalBufferCopyOffsetAlignment)\n  XE_UI_VULKAN_LIMIT(optimalBufferCopyRowPitchAlignment)\n  XE_UI_VULKAN_LIMIT(nonCoherentAtomSize)\n\n  if (with_gpu_emulation) {\n    XE_UI_VULKAN_FEATURE(robustBufferAccess)\n    XE_UI_VULKAN_FEATURE(fullDrawIndexUint32)\n    XE_UI_VULKAN_FEATURE(independentBlend)\n    XE_UI_VULKAN_FEATURE(geometryShader)\n    XE_UI_VULKAN_FEATURE(tessellationShader)\n    XE_UI_VULKAN_FEATURE(sampleRateShading)\n    XE_UI_VULKAN_FEATURE(depthClamp)\n    XE_UI_VULKAN_FEATURE(fillModeNonSolid)\n    XE_UI_VULKAN_FEATURE(samplerAnisotropy)\n    XE_UI_VULKAN_FEATURE(occlusionQueryPrecise)\n    XE_UI_VULKAN_FEATURE(vertexPipelineStoresAndAtomics)\n    XE_UI_VULKAN_FEATURE(fragmentStoresAndAtomics)\n    XE_UI_VULKAN_FEATURE(shaderClipDistance)\n    XE_UI_VULKAN_FEATURE(shaderCullDistance)\n    XE_UI_VULKAN_FEATURE(sparseBinding)\n    XE_UI_VULKAN_FEATURE(sparseResidencyBuffer)\n  }\n\n  if (properties.apiVersion >= VK_MAKE_API_VERSION(0, 1, 2, 0)) {\n    if (with_gpu_emulation) {\n      XE_UI_VULKAN_FEATURE_2(features_1_2, samplerMirrorClampToEdge);\n    }\n  } else {\n    if (ext_1_2_KHR_sampler_mirror_clamp_to_edge) {\n      XE_UI_VULKAN_FEATURE_IMPLIED(samplerMirrorClampToEdge)\n    }\n  }\n\n  if (properties.apiVersion >= VK_MAKE_API_VERSION(0, 1, 3, 0)) {\n    if (with_gpu_emulation) {\n      XE_UI_VULKAN_FEATURE_2(features_1_3, shaderDemoteToHelperInvocation);\n    }\n  } else {\n    if (ext_1_3_EXT_shader_demote_to_helper_invocation) {\n      if (with_gpu_emulation) {\n        XE_UI_VULKAN_FEATURE_2(\n            features_1_3_EXT_shader_demote_to_helper_invocation,\n            shaderDemoteToHelperInvocation);\n      }\n    }\n  }\n\n  if (ext_KHR_portability_subset) {\n    if (with_gpu_emulation) {\n      XE_UI_VULKAN_FEATURE_2(features_KHR_portability_subset,\n                             constantAlphaColorBlendFactors)\n      XE_UI_VULKAN_FEATURE_2(features_KHR_portability_subset,\n                             imageViewFormatReinterpretation)\n      XE_UI_VULKAN_FEATURE_2(features_KHR_portability_subset,\n                             imageViewFormatSwizzle)\n      XE_UI_VULKAN_FEATURE_2(features_KHR_portability_subset, pointPolygons)\n      XE_UI_VULKAN_FEATURE_2(features_KHR_portability_subset,\n                             separateStencilMaskRef)\n      XE_UI_VULKAN_FEATURE_2(features_KHR_portability_subset,\n                             shaderSampleRateInterpolationFunctions)\n      XE_UI_VULKAN_FEATURE_2(features_KHR_portability_subset, triangleFans)\n    }\n  } else {\n    // Not a portability subset device.\n    XE_UI_VULKAN_FEATURE_IMPLIED(constantAlphaColorBlendFactors)\n    XE_UI_VULKAN_FEATURE_IMPLIED(imageViewFormatReinterpretation)\n    XE_UI_VULKAN_FEATURE_IMPLIED(imageViewFormatSwizzle)\n    XE_UI_VULKAN_FEATURE_IMPLIED(pointPolygons)\n    XE_UI_VULKAN_FEATURE_IMPLIED(separateStencilMaskRef)\n    XE_UI_VULKAN_FEATURE_IMPLIED(shaderSampleRateInterpolationFunctions)\n    XE_UI_VULKAN_FEATURE_IMPLIED(triangleFans)\n  }\n\n  if (ext_1_2_KHR_shader_float_controls) {\n    XE_UI_VULKAN_PROPERTY_2(properties_1_2_KHR_shader_float_controls,\n                            shaderSignedZeroInfNanPreserveFloat32);\n    XE_UI_VULKAN_PROPERTY_2(properties_1_2_KHR_shader_float_controls,\n                            shaderDenormFlushToZeroFloat32);\n    XE_UI_VULKAN_PROPERTY_2(properties_1_2_KHR_shader_float_controls,\n                            shaderRoundingModeRTEFloat32);\n  }\n\n  if (ext_EXT_fragment_shader_interlock) {\n    if (with_gpu_emulation) {\n      XE_UI_VULKAN_FEATURE_2(features_EXT_fragment_shader_interlock,\n                             fragmentShaderSampleInterlock)\n      XE_UI_VULKAN_FEATURE_2(features_EXT_fragment_shader_interlock,\n                             fragmentShaderPixelInterlock)\n    }\n  }\n\n  if (ext_EXT_non_seamless_cube_map) {\n    if (with_gpu_emulation) {\n      XE_UI_VULKAN_FEATURE_2(features_EXT_non_seamless_cube_map,\n                             nonSeamlessCubeMap)\n    }\n  }\n\n#undef XE_UI_VULKAN_LIMIT\n#undef XE_UI_VULKAN_ENUM_LIMIT\n#undef XE_UI_VULKAN_FEATURE\n#undef XE_UI_VULKAN_PROPERTY_2\n#undef XE_UI_VULKAN_ENUM_PROPERTY_2\n#undef XE_UI_VULKAN_FEATURE_2\n\n  // Create the device.\n\n  const VkResult device_create_result = ifn.vkCreateDevice(\n      physical_device, &device_create_info, nullptr, &device->device_);\n  if (device_create_result != VK_SUCCESS) {\n    XELOGE(\n        \"Failed to create a Vulkan logical device from the physical device \"\n        \"'{}': {}\",\n        properties.deviceName, vk::to_string(vk::Result(device_create_result)));\n    return nullptr;\n  }\n\n  // Load device functions.\n\n  bool functions_loaded = true;\n\n  Functions& dfn = device->functions_;\n\n#define XE_UI_VULKAN_FUNCTION(name)                                   \\\n  functions_loaded &= (dfn.name = PFN_##name(ifn.vkGetDeviceProcAddr( \\\n                           device->device_, #name))) != nullptr;\n\n  // Vulkan 1.0.\n#include \"xenia/ui/vulkan/functions/device_1_0.inc\"\n\n  // Extensions promoted to a Vulkan version supported by the device.\n#define XE_UI_VULKAN_FUNCTION_PROMOTED(extension_name, core_name) \\\n  functions_loaded &=                                             \\\n      (dfn.core_name = PFN_##core_name(                           \\\n           ifn.vkGetDeviceProcAddr(device->device_, #core_name))) != nullptr;\n  if (properties.apiVersion >= VK_MAKE_API_VERSION(0, 1, 1, 0)) {\n#include \"xenia/ui/vulkan/functions/device_1_1_khr_bind_memory2.inc\"\n#include \"xenia/ui/vulkan/functions/device_1_1_khr_get_memory_requirements2.inc\"\n  }\n  if (properties.apiVersion >= VK_MAKE_API_VERSION(0, 1, 3, 0)) {\n#include \"xenia/ui/vulkan/functions/device_1_3_khr_maintenance4.inc\"\n  }\n#undef XE_UI_VULKAN_FUNCTION_PROMOTED\n\n  // Non-promoted extensions, and extensions promoted to a Vulkan version not\n  // supported by the device.\n#define XE_UI_VULKAN_FUNCTION_PROMOTED(extension_name, core_name) \\\n  functions_loaded &=                                             \\\n      (dfn.core_name = PFN_##core_name(ifn.vkGetDeviceProcAddr(   \\\n           device->device_, #extension_name))) != nullptr;\n  if (properties.apiVersion < VK_MAKE_API_VERSION(0, 1, 1, 0)) {\n    if (device->extensions_.ext_1_1_KHR_get_memory_requirements2) {\n#include \"xenia/ui/vulkan/functions/device_1_1_khr_get_memory_requirements2.inc\"\n    }\n    if (device->extensions_.ext_1_1_KHR_bind_memory2) {\n#include \"xenia/ui/vulkan/functions/device_1_1_khr_bind_memory2.inc\"\n    }\n  }\n  if (properties.apiVersion < VK_MAKE_API_VERSION(0, 1, 3, 0)) {\n    if (device->extensions_.ext_1_3_KHR_maintenance4) {\n#include \"xenia/ui/vulkan/functions/device_1_3_khr_maintenance4.inc\"\n    }\n  }\n  if (device->extensions_.ext_KHR_swapchain) {\n#include \"xenia/ui/vulkan/functions/device_khr_swapchain.inc\"\n  }\n#undef XE_UI_VULKAN_FUNCTION_PROMOTED\n\n#undef XE_UI_VULKAN_FUNCTION\n\n  if (!functions_loaded) {\n    XELOGE(\"Failed to get all Vulkan device function pointers for '{}'\",\n           properties.deviceName);\n    return nullptr;\n  }\n\n  // Get the queues.\n\n  for (size_t queue_family_index = 0;\n       queue_family_index < device->queue_families_.size();\n       ++queue_family_index) {\n    QueueFamily& queue_family = device->queue_families_[queue_family_index];\n    for (size_t queue_index = 0; queue_index < queue_family.queues.size();\n         ++queue_index) {\n      VkQueue queue;\n      dfn.vkGetDeviceQueue(device->device_, uint32_t(queue_family_index),\n                           uint32_t(queue_index), &queue);\n      queue_family.queues[queue_index] = std::make_unique<Queue>(queue);\n    }\n  }\n\n  // Get the memory types.\n\n  VkPhysicalDeviceMemoryProperties memory_properties;\n  ifn.vkGetPhysicalDeviceMemoryProperties(physical_device, &memory_properties);\n  for (uint32_t memory_type_index = 0;\n       memory_type_index < memory_properties.memoryTypeCount;\n       ++memory_type_index) {\n    const uint32_t memory_type_bit = uint32_t(1) << memory_type_index;\n    const VkMemoryPropertyFlags memory_type_flags =\n        memory_properties.memoryTypes[memory_type_index].propertyFlags;\n    if (memory_type_flags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) {\n      device->memory_types_.device_local |= memory_type_bit;\n    }\n    if (memory_type_flags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) {\n      device->memory_types_.host_visible |= memory_type_bit;\n    }\n    if (memory_type_flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) {\n      device->memory_types_.host_coherent |= memory_type_bit;\n    }\n    if (memory_type_flags & VK_MEMORY_PROPERTY_HOST_CACHED_BIT) {\n      device->memory_types_.host_cached |= memory_type_bit;\n    }\n  }\n\n  return device;\n}\n\nVulkanDevice::~VulkanDevice() {\n  if (device_) {\n    vulkan_instance_->functions().vkDestroyDevice(device_, nullptr);\n  }\n}\n\nVulkanDevice::VulkanDevice(const VulkanInstance* const vulkan_instance,\n                           const VkPhysicalDevice physical_device)\n    : vulkan_instance_(vulkan_instance), physical_device_(physical_device) {\n  assert_not_null(vulkan_instance);\n  assert_not_null(physical_device);\n}\n\n}  // namespace vulkan\n}  // namespace ui\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/ui/vulkan/vulkan_device.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2025 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_VULKAN_VULKAN_DEVICE_H_\n#define XENIA_UI_VULKAN_VULKAN_DEVICE_H_\n\n#include <atomic>\n#include <memory>\n#include <mutex>\n#include <vector>\n\n#include \"xenia/ui/vulkan/vulkan_instance.h\"\n\nnamespace xe {\nnamespace ui {\nnamespace vulkan {\n\nclass VulkanDevice {\n public:\n  static std::unique_ptr<VulkanDevice> CreateIfSupported(\n      const VulkanInstance* vulkan_instance, VkPhysicalDevice physical_device,\n      bool with_gpu_emulation, bool with_swapchain);\n\n  VulkanDevice(const VulkanDevice&) = delete;\n  VulkanDevice& operator=(const VulkanDevice&) = delete;\n  VulkanDevice(VulkanDevice&&) = delete;\n  VulkanDevice& operator=(VulkanDevice&&) = delete;\n\n  ~VulkanDevice();\n\n  const VulkanInstance* vulkan_instance() const { return vulkan_instance_; }\n\n  VkPhysicalDevice physical_device() const { return physical_device_; }\n\n  // If functionality from higher API versions is used, increase this.\n  // This is for VkApplicationInfo.\n  // \"apiVersion must be the highest version of Vulkan that the application is\n  // designed to use\"\n  // \"The patch version number specified in apiVersion is ignored when creating\n  // an instance object\"\n  static constexpr uint32_t kHighestUsedApiMinorVersion =\n      VK_MAKE_API_VERSION(0, 1, 3, 0);\n\n  struct Properties {\n    // Vulkan 1.0\n    uint32_t apiVersion = VK_MAKE_API_VERSION(0, 1, 0, 0);\n    uint32_t driverVersion = 0;\n    uint32_t vendorID = 0;\n    uint32_t deviceID = 0;\n    char deviceName[VK_MAX_PHYSICAL_DEVICE_NAME_SIZE] = {};\n\n    uint32_t maxImageDimension2D = 4096;\n    uint32_t maxImageDimension3D = 256;\n    uint32_t maxImageDimensionCube = 4096;\n    uint32_t maxImageArrayLayers = 256;\n    uint32_t maxStorageBufferRange = uint32_t(1) << 27;\n    uint32_t maxSamplerAllocationCount = 4000;\n    uint32_t maxPerStageDescriptorSamplers = 16;\n    uint32_t maxPerStageDescriptorStorageBuffers = 4;\n    uint32_t maxPerStageDescriptorSampledImages = 16;\n    uint32_t maxPerStageResources = 128;\n    uint32_t maxVertexOutputComponents = 64;\n    uint32_t maxTessellationEvaluationOutputComponents = 64;\n    uint32_t maxGeometryInputComponents = 64;\n    uint32_t maxGeometryOutputComponents = 64;\n    uint32_t maxFragmentInputComponents = 64;\n    uint32_t maxFragmentCombinedOutputResources = 4;\n    float maxSamplerAnisotropy = 1.0f;\n    uint32_t maxViewportDimensions[2] = {4096, 4096};\n    VkDeviceSize minUniformBufferOffsetAlignment = 256;\n    VkDeviceSize minStorageBufferOffsetAlignment = 256;\n    uint32_t maxFramebufferWidth = 4096;\n    uint32_t maxFramebufferHeight = 4096;\n    VkSampleCountFlags framebufferColorSampleCounts =\n        VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT;\n    VkSampleCountFlags framebufferDepthSampleCounts =\n        VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT;\n    VkSampleCountFlags framebufferStencilSampleCounts =\n        VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT;\n    VkSampleCountFlags framebufferNoAttachmentsSampleCounts =\n        VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT;\n    VkSampleCountFlags sampledImageColorSampleCounts =\n        VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT;\n    VkSampleCountFlags sampledImageIntegerSampleCounts = VK_SAMPLE_COUNT_1_BIT;\n    VkSampleCountFlags sampledImageDepthSampleCounts =\n        VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT;\n    VkSampleCountFlags sampledImageStencilSampleCounts =\n        VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_4_BIT;\n    bool standardSampleLocations = false;\n    VkDeviceSize optimalBufferCopyOffsetAlignment = 1;\n    VkDeviceSize optimalBufferCopyRowPitchAlignment = 1;\n    VkDeviceSize nonCoherentAtomSize = 256;\n\n    bool robustBufferAccess = false;\n    bool fullDrawIndexUint32 = false;\n    bool independentBlend = false;\n    bool geometryShader = false;\n    bool tessellationShader = false;\n    bool sampleRateShading = false;\n    bool depthClamp = false;\n    bool fillModeNonSolid = false;\n    bool samplerAnisotropy = false;\n    bool occlusionQueryPrecise = false;\n    bool vertexPipelineStoresAndAtomics = false;\n    bool fragmentStoresAndAtomics = false;\n    bool shaderClipDistance = false;\n    bool shaderCullDistance = false;\n    bool sparseBinding = false;\n    bool sparseResidencyBuffer = false;\n\n    // VK_KHR_sampler_mirror_clamp_to_edge (#15, promoted to 1.2)\n\n    bool samplerMirrorClampToEdge = false;\n\n    // VK_KHR_portability_subset (#164)\n\n    bool constantAlphaColorBlendFactors = false;\n    bool imageViewFormatReinterpretation = false;\n    bool imageViewFormatSwizzle = false;\n    bool pointPolygons = false;\n    bool separateStencilMaskRef = false;\n    bool shaderSampleRateInterpolationFunctions = false;\n    bool triangleFans = false;\n\n    // VK_KHR_driver_properties (#197, promoted to 1.2)\n\n    VkDriverId driverID = VkDriverId(0);\n\n    // VK_KHR_shader_float_controls (#198, promoted to 1.2)\n\n    bool shaderSignedZeroInfNanPreserveFloat32 = false;\n    bool shaderDenormFlushToZeroFloat32 = false;\n    bool shaderRoundingModeRTEFloat32 = false;\n\n    // VK_EXT_fragment_shader_interlock (#252)\n\n    bool fragmentShaderSampleInterlock = false;\n    bool fragmentShaderPixelInterlock = false;\n\n    // VK_EXT_shader_demote_to_helper_invocation (#277, promoted to 1.3)\n\n    bool shaderDemoteToHelperInvocation = false;\n\n    // VK_EXT_non_seamless_cube_map (#423)\n\n    bool nonSeamlessCubeMap = false;\n  };\n\n  // Properties of the core API and enabled extensions, and enabled features.\n  // Some supported functionality is enabled conditionally based on the\n  // `with_swapchain` and `with_gpu_emulation` options.\n  const Properties& properties() const { return properties_; }\n\n  // Enabled extensions not fully covered by the device properties and optional\n  // feature flags in the `Properties` structure (primarily those adding API\n  // functionality rather than GPU features). Also set to true if the version of\n  // the Vulkan API they were promoted to it supported (with the\n  // `ext_major_minor_` prefix rather than `ext_`).\n  struct Extensions {\n    bool ext_KHR_swapchain = false;                     // #2\n    bool ext_1_1_KHR_dedicated_allocation = false;      // #128\n    bool ext_EXT_shader_stencil_export = false;         // #141\n    bool ext_1_1_KHR_get_memory_requirements2 = false;  // #147\n    bool ext_1_2_KHR_image_format_list = false;         // #148\n    // Has optional features not implied by this being true.\n    bool ext_1_1_KHR_sampler_ycbcr_conversion = false;  // #157\n    bool ext_1_1_KHR_bind_memory2 = false;              // #158\n    bool ext_1_2_KHR_spirv_1_4 = false;                 // #237\n    bool ext_EXT_memory_budget = false;                 // #238\n    // Has optional features not implied by this being true.\n    bool ext_1_3_KHR_maintenance4 = false;  // #414\n  };\n\n  const Extensions& extensions() const { return extensions_; }\n\n  VkDevice device() const { return device_; }\n\n  struct Functions {\n#define XE_UI_VULKAN_FUNCTION(name) PFN_##name name = nullptr;\n#define XE_UI_VULKAN_FUNCTION_PROMOTED(extension_name, core_name) \\\n  PFN_##core_name core_name = nullptr;\n#include \"xenia/ui/vulkan/functions/device_1_0.inc\"\n    // VK_KHR_swapchain (#2)\n#include \"xenia/ui/vulkan/functions/device_khr_swapchain.inc\"\n    // VK_KHR_get_memory_requirements2 (#147, promoted to 1.1)\n#include \"xenia/ui/vulkan/functions/device_1_1_khr_get_memory_requirements2.inc\"\n    // VK_KHR_bind_memory2 (#158, promoted to 1.1)\n#include \"xenia/ui/vulkan/functions/device_1_1_khr_bind_memory2.inc\"\n    // VK_KHR_maintenance4 (#414, promoted to 1.3)\n#include \"xenia/ui/vulkan/functions/device_1_3_khr_maintenance4.inc\"\n#undef XE_UI_VULKAN_FUNCTION_PROMOTED\n#undef XE_UI_VULKAN_FUNCTION\n  };\n\n  const Functions& functions() const { return functions_; }\n\n  template <typename Object>\n  void SetObjectName(const VkObjectType object_type, const Object object_handle,\n                     const char* const object_name) const {\n    if (!vulkan_instance()->extensions().ext_EXT_debug_utils) {\n      return;\n    }\n    VkDebugUtilsObjectNameInfoEXT object_name_info;\n    object_name_info.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT;\n    object_name_info.pNext = nullptr;\n    object_name_info.objectType = object_type;\n    object_name_info.objectHandle = (uint64_t)object_handle;\n    object_name_info.pObjectName = object_name;\n    vulkan_instance()->functions().vkSetDebugUtilsObjectNameEXT(\n        device(), &object_name_info);\n  }\n\n  struct Queue {\n    // Host access to queues must be externally synchronized in Vulkan.\n    std::recursive_mutex mutex;\n    VkQueue queue = nullptr;\n\n    explicit Queue(const VkQueue queue) : queue(queue) {}\n\n    class Acquisition {\n     public:\n      explicit Acquisition(Queue& queue)\n          : lock_(queue.mutex), queue_(queue.queue) {}\n\n      VkQueue queue() const { return queue_; }\n\n     private:\n      std::unique_lock<std::recursive_mutex> lock_;\n      VkQueue queue_;\n    };\n\n    Acquisition Acquire() { return Acquisition(*this); }\n  };\n\n  struct QueueFamily {\n    VkQueueFlags queue_flags = 0;\n    bool may_support_presentation = false;\n    std::vector<std::unique_ptr<Queue>> queues;\n  };\n\n  const std::vector<QueueFamily>& queue_families() const {\n    return queue_families_;\n  }\n  uint32_t queue_family_graphics_compute() const {\n    return queue_family_graphics_compute_;\n  }\n  // UINT32_MAX if not supported or not enabled.\n  // May be the same as queue_family_graphics_compute().\n  uint32_t queue_family_sparse_binding() const {\n    return queue_family_sparse_binding_;\n  }\n\n  Queue::Acquisition AcquireQueue(const uint32_t queue_family_index,\n                                  const uint32_t queue_index) const {\n    return queue_families()[queue_family_index].queues[queue_index]->Acquire();\n  }\n\n  struct MemoryTypes {\n    uint32_t device_local = 0b0;\n    uint32_t host_visible = 0b0;\n    uint32_t host_coherent = 0b0;\n    uint32_t host_cached = 0b0;\n  };\n\n  const MemoryTypes& memory_types() const { return memory_types_; }\n\n  // Returns whether a device loss has been observed for the first time, so, for\n  // instance, logging of the device loss can be limited only to the location\n  // where it was first caught.\n  bool SetLost() noexcept {\n    return !lost_.exchange(true, std::memory_order_acq_rel);\n  }\n  bool IsLost() const noexcept { return lost_.load(std::memory_order_acquire); }\n\n  VkResult SubmitAndUpdateLost(const VkQueue queue, const uint32_t submit_count,\n                               const VkSubmitInfo* const submits,\n                               const VkFence fence) {\n    const VkResult submit_result =\n        functions().vkQueueSubmit(queue, submit_count, submits, fence);\n    if (submit_result == VK_ERROR_DEVICE_LOST) {\n      SetLost();\n    }\n    return submit_result;\n  }\n\n private:\n  explicit VulkanDevice(const VulkanInstance* vulkan_instance,\n                        VkPhysicalDevice physical_device);\n\n  const VulkanInstance* vulkan_instance_ = nullptr;\n  VkPhysicalDevice physical_device_ = nullptr;\n\n  Properties properties_;\n  Extensions extensions_;\n\n  VkDevice device_ = nullptr;\n\n  Functions functions_;\n\n  std::vector<QueueFamily> queue_families_;\n  uint32_t queue_family_graphics_compute_ = UINT32_MAX;\n  uint32_t queue_family_sparse_binding_ = UINT32_MAX;\n\n  MemoryTypes memory_types_;\n\n  std::atomic<bool> lost_{false};\n};\n\n}  // namespace vulkan\n}  // namespace ui\n}  // namespace xe\n\n#endif  // XENIA_UI_VULKAN_VULKAN_DEVICE_H_\n"
  },
  {
    "path": "src/xenia/ui/vulkan/vulkan_gpu_completion_timeline.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2025 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/ui/vulkan/vulkan_gpu_completion_timeline.h\"\n\n#include <algorithm>\n#include <iterator>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/logging.h\"\n\nnamespace xe {\nnamespace ui {\nnamespace vulkan {\n\nVulkanGPUCompletionTimeline::~VulkanGPUCompletionTimeline() {\n#ifndef NDEBUG\n  assert_zero(fences_acquired_);\n#endif\n\n  if (!pending_submission_fences_.empty()) {\n    if (vulkan_device_->functions().vkWaitForFences(\n            vulkan_device_->device(), 1,\n            &pending_submission_fences_.back().second, VK_TRUE,\n            UINT64_MAX) == VK_ERROR_DEVICE_LOST) {\n      vulkan_device_->SetLost();\n    }\n\n    while (!pending_submission_fences_.empty()) {\n      vulkan_device_->functions().vkDestroyFence(\n          vulkan_device_->device(), pending_submission_fences_.back().second,\n          nullptr);\n      pending_submission_fences_.pop_back();\n    }\n  }\n\n  while (!free_fences_.empty()) {\n    vulkan_device_->functions().vkDestroyFence(vulkan_device_->device(),\n                                               free_fences_.back(), nullptr);\n    free_fences_.pop_back();\n  }\n}\n\nstd::optional<VulkanGPUCompletionTimeline::FenceAcquisition>\nVulkanGPUCompletionTimeline::AcquireFenceForSubmission(\n    VkResult* const result_out_opt) {\n  // Reuse fences if completion was not awaited or updated explicitly.\n  UpdateAndGetCompletedSubmission();\n\n  VkFence fence = VK_NULL_HANDLE;\n\n  if (!free_fences_.empty()) {\n    const VkResult fence_reset_result =\n        vulkan_device_->functions().vkResetFences(vulkan_device_->device(), 1,\n                                                  &free_fences_.back());\n    if (fence_reset_result != VK_SUCCESS) {\n      XELOGE(\"Failed to reset a Vulkan fence: {}\",\n             vk::to_string(vk::Result(fence_reset_result)));\n    } else {\n      fence = free_fences_.back();\n      free_fences_.pop_back();\n    }\n  }\n\n  if (fence == VK_NULL_HANDLE) {\n    const VkFenceCreateInfo fence_create_info = {\n        VK_STRUCTURE_TYPE_FENCE_CREATE_INFO};\n    const VkResult fence_create_result =\n        vulkan_device_->functions().vkCreateFence(\n            vulkan_device_->device(), &fence_create_info, nullptr, &fence);\n    if (fence_create_result != VK_SUCCESS) {\n      XELOGE(\"Failed to create a Vulkan fence: {}\",\n             vk::to_string(vk::Result(fence_create_result)));\n      if (result_out_opt != nullptr) {\n        *result_out_opt = fence_create_result;\n      }\n      return std::nullopt;\n    }\n  }\n\n#ifndef NDEBUG\n  ++fences_acquired_;\n#endif\n\n  if (result_out_opt != nullptr) {\n    *result_out_opt = VK_SUCCESS;\n  }\n  return FenceAcquisition(this, fence);\n}\n\nVkResult VulkanGPUCompletionTimeline::AcquireFenceAndSubmit(\n    const uint32_t queue_family_index, const uint32_t queue_index,\n    const uint32_t submit_count, const VkSubmitInfo* const submits) {\n  VkResult fence_acquire_result;\n  std::optional<FenceAcquisition> fence_acquisition =\n      AcquireFenceForSubmission(&fence_acquire_result);\n  if (!fence_acquisition.has_value()) {\n    return fence_acquire_result;\n  }\n\n  VkResult submit_result;\n  {\n    const VulkanDevice::Queue::Acquisition queue_acquisition =\n        vulkan_device_->AcquireQueue(queue_family_index, queue_index);\n    submit_result = vulkan_device_->SubmitAndUpdateLost(\n        queue_acquisition.queue(), submit_count, submits,\n        fence_acquisition->GetFenceForSubmitting());\n  }\n  if (submit_result != VK_SUCCESS) {\n    fence_acquisition->SetSubmissionFailedOrAborted();\n  }\n  return submit_result;\n}\n\nvoid VulkanGPUCompletionTimeline::UpdateCompletedSubmission() {\n  while (!pending_submission_fences_.empty()) {\n    const VkResult fence_status = vulkan_device_->functions().vkGetFenceStatus(\n        vulkan_device_->device(), pending_submission_fences_.front().second);\n    if (fence_status != VK_SUCCESS) {\n      // Not ready, or an error.\n      if (fence_status == VK_ERROR_DEVICE_LOST) {\n        vulkan_device_->SetLost();\n      }\n      break;\n    }\n    SetCompletedSubmission(pending_submission_fences_.front().first);\n    free_fences_.push_back(pending_submission_fences_.front().second);\n    pending_submission_fences_.pop_front();\n  }\n}\n\nvoid VulkanGPUCompletionTimeline::AwaitSubmissionImpl(\n    const uint64_t awaited_submission) {\n  // According to the Vulkan 1.4.335 specification:\n  // \"The first synchronization scope includes every batch submitted in the same\n  // queue submission command. Fence signal operations that are defined by\n  // vkQueueSubmit or vkQueueSubmit2 additionally include in the first\n  // synchronization scope all commands that occur earlier in submission order.\n  // Fence signal operations that are defined by vkQueueSubmit or vkQueueSubmit2\n  // or vkQueueBindSparse additionally include in the first synchronization\n  // scope any semaphore and fence signal operations that occur earlier in\n  // signal operation order.\"\n  auto submission_end_iterator = pending_submission_fences_.cbegin();\n  while (submission_end_iterator != pending_submission_fences_.cend() &&\n         submission_end_iterator->first <= awaited_submission) {\n    submission_end_iterator = std::next(submission_end_iterator);\n  }\n  if (submission_end_iterator != pending_submission_fences_.cbegin()) {\n    const VkResult fence_wait_result =\n        vulkan_device_->functions().vkWaitForFences(\n            vulkan_device_->device(), 1,\n            &std::prev(submission_end_iterator)->second, VK_TRUE, UINT64_MAX);\n    if (fence_wait_result != VK_SUCCESS) {\n      XELOGE(\"Failed to wait for a Vulkan fence: {}\",\n             vk::to_string(vk::Result(fence_wait_result)));\n      if (fence_wait_result == VK_ERROR_DEVICE_LOST) {\n        vulkan_device_->SetLost();\n      }\n      return;\n    }\n    for (auto free_fence_iterator = pending_submission_fences_.cbegin();\n         free_fence_iterator != submission_end_iterator;\n         free_fence_iterator = std::next(free_fence_iterator)) {\n      free_fences_.push_back(free_fence_iterator->second);\n    }\n    pending_submission_fences_.erase(pending_submission_fences_.cbegin(),\n                                     submission_end_iterator);\n  }\n  if (GetCompletedSubmissionFromLastUpdate() < awaited_submission) {\n    SetCompletedSubmission(awaited_submission);\n  }\n}\n\n}  // namespace vulkan\n}  // namespace ui\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/ui/vulkan/vulkan_gpu_completion_timeline.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2025 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_VULKAN_VULKAN_GPU_COMPLETION_TIMELINE_H_\n#define XENIA_UI_VULKAN_VULKAN_GPU_COMPLETION_TIMELINE_H_\n\n#include <deque>\n#include <optional>\n#include <utility>\n#include <vector>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/ui/gpu_completion_timeline.h\"\n#include \"xenia/ui/vulkan/vulkan_device.h\"\n\nnamespace xe {\nnamespace ui {\nnamespace vulkan {\n\nclass VulkanGPUCompletionTimeline : public GPUCompletionTimeline {\n public:\n  explicit VulkanGPUCompletionTimeline(VulkanDevice* const vulkan_device)\n      : vulkan_device_(vulkan_device) {}\n\n  VulkanGPUCompletionTimeline(const VulkanGPUCompletionTimeline&) = delete;\n  VulkanGPUCompletionTimeline& operator=(const VulkanGPUCompletionTimeline&) =\n      delete;\n  VulkanGPUCompletionTimeline(VulkanGPUCompletionTimeline&&) = delete;\n  VulkanGPUCompletionTimeline& operator=(VulkanGPUCompletionTimeline&&) =\n      delete;\n\n  ~VulkanGPUCompletionTimeline();\n\n  class FenceAcquisition {\n   public:\n    explicit FenceAcquisition(\n        VulkanGPUCompletionTimeline* const completion_timeline,\n        const VkFence fence)\n        : completion_timeline_(completion_timeline), fence_(fence) {\n      assert_not_null(completion_timeline);\n      assert_true(fence != VK_NULL_HANDLE);\n    }\n\n    FenceAcquisition(const FenceAcquisition&) = delete;\n    FenceAcquisition& operator=(const FenceAcquisition&) = delete;\n\n    FenceAcquisition(FenceAcquisition&& other)\n        : completion_timeline_(other.completion_timeline_),\n          fence_(other.fence_),\n          submission_successful_(other.submission_successful_) {\n      other.completion_timeline_ = nullptr;\n      other.fence_ = VK_NULL_HANDLE;\n      other.submission_successful_.reset();\n    }\n\n    FenceAcquisition& operator==(FenceAcquisition&& other) {\n      if (this == &other) {\n        return *this;\n      }\n      completion_timeline_ = other.completion_timeline_;\n      other.completion_timeline_ = nullptr;\n      fence_ = other.fence_;\n      other.fence_ = VK_NULL_HANDLE;\n      submission_successful_ = other.submission_successful_;\n      other.submission_successful_.reset();\n      return *this;\n    }\n\n    ~FenceAcquisition() {\n      if (completion_timeline_ && fence_) {\n#ifndef NDEBUG\n        assert_not_zero(completion_timeline_->fences_acquired_);\n        --completion_timeline_->fences_acquired_;\n#endif\n        if (submission_successful_.value_or(false)) {\n          assert_true(\n              completion_timeline_->pending_submission_fences_.empty() ||\n              completion_timeline_->pending_submission_fences_.front().first <\n                  completion_timeline_->GetUpcomingSubmission());\n          completion_timeline_->pending_submission_fences_.emplace_back(\n              completion_timeline_->GetUpcomingSubmission(), fence_);\n          completion_timeline_->IncrementUpcomingSubmission();\n        } else {\n          completion_timeline_->free_fences_.push_back(fence_);\n        }\n      }\n    }\n\n    VkFence GetFenceForSubmitting() {\n      // Don't mark the fence as used in a submission if already tried to\n      // submit, but failed.\n      assert_true(!submission_successful_.has_value() ||\n                  *submission_successful_);\n      submission_successful_ = true;\n      return fence_;\n    }\n\n    void SetSubmissionFailedOrAborted() { submission_successful_ = false; }\n\n   private:\n    VulkanGPUCompletionTimeline* completion_timeline_ = nullptr;\n\n    VkFence fence_ = VK_NULL_HANDLE;\n\n    std::optional<bool> submission_successful_;\n  };\n\n  // If the submission has succeeded (`GetFenceForSubmitting` was called, but\n  // `SetSubmissionFailedOrAborted` was not), will advance to the next\n  // submission once the acquisition is released.\n  //\n  // It's possible to acquire a fence not right before submitting, but also well\n  // in advance, such as before recording the command buffer, for instance, to\n  // skip recording it if fence acquisition has failed.\n  //\n  // Acquiring a fence also updates the completed submission in order to reuse\n  // fences if this completion timeline is used without regular checks or waits\n  // (for instance, if it's supplementary to another completion timeline, and\n  // awaited only before destroying something).\n  [[nodiscard]] std::optional<FenceAcquisition> AcquireFenceForSubmission(\n      VkResult* result_out_opt = nullptr);\n\n  VkResult AcquireFenceAndSubmit(uint32_t queue_family_index,\n                                 uint32_t queue_index, uint32_t submit_count,\n                                 const VkSubmitInfo* submits);\n\n  void UpdateCompletedSubmission() override;\n\n protected:\n  void AwaitSubmissionImpl(uint64_t awaited_submission) override;\n\n private:\n  VulkanDevice* const vulkan_device_;\n\n  std::vector<VkFence> free_fences_;\n\n  // <Submission index, fence>, in submission index order.\n  std::deque<std::pair<uint64_t, VkFence>> pending_submission_fences_;\n\n#ifndef NDEBUG\n  size_t fences_acquired_ = 0;\n#endif\n};\n\n}  // namespace vulkan\n}  // namespace ui\n}  // namespace xe\n\n#endif  // XENIA_UI_VULKAN_VULKAN_GPU_COMPLETION_TIMELINE_H_\n"
  },
  {
    "path": "src/xenia/ui/vulkan/vulkan_immediate_drawer.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/ui/vulkan/vulkan_immediate_drawer.h\"\n\n#include <algorithm>\n#include <cstring>\n#include <iterator>\n#include <utility>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/ui/vulkan/vulkan_presenter.h\"\n#include \"xenia/ui/vulkan/vulkan_util.h\"\n\nnamespace xe {\nnamespace ui {\nnamespace vulkan {\n\n// Generated with `xb buildshaders`.\nnamespace shaders {\n#include \"xenia/ui/shaders/bytecode/vulkan_spirv/immediate_ps.h\"\n#include \"xenia/ui/shaders/bytecode/vulkan_spirv/immediate_vs.h\"\n}  // namespace shaders\n\nstd::unique_ptr<VulkanImmediateDrawer> VulkanImmediateDrawer::Create(\n    const VulkanDevice* const vulkan_device,\n    const UISamplers* const ui_samplers) {\n  assert_not_null(vulkan_device);\n  assert_not_null(ui_samplers);\n\n  auto immediate_drawer = std::unique_ptr<VulkanImmediateDrawer>(\n      new VulkanImmediateDrawer(vulkan_device, ui_samplers));\n  if (!immediate_drawer->Initialize()) {\n    return nullptr;\n  }\n  return immediate_drawer;\n}\n\nVulkanImmediateDrawer::VulkanImmediateTexture::~VulkanImmediateTexture() {\n  if (immediate_drawer_) {\n    immediate_drawer_->OnImmediateTextureDestroyed(*this);\n  }\n}\n\nVulkanImmediateDrawer::~VulkanImmediateDrawer() {\n  // Await GPU usage completion of all draws and texture uploads (which happen\n  // before draws).\n  auto vulkan_presenter = static_cast<VulkanPresenter*>(presenter());\n  if (vulkan_presenter) {\n    vulkan_presenter->AwaitUISubmissionCompletionFromUIThread(\n        last_paint_submission_index_);\n  }\n\n  const VulkanDevice::Functions& dfn = vulkan_device_->functions();\n  const VkDevice device = vulkan_device_->device();\n\n  util::DestroyAndNullHandle(dfn.vkDestroyPipeline, device, pipeline_line_);\n  util::DestroyAndNullHandle(dfn.vkDestroyPipeline, device, pipeline_triangle_);\n\n  util::DestroyAndNullHandle(dfn.vkDestroyPipelineLayout, device,\n                             pipeline_layout_);\n\n  for (auto& deleted_texture : textures_deleted_) {\n    DestroyTextureResource(deleted_texture.first);\n  }\n  for (SubmittedTextureUploadBuffer& submitted_texture_upload_buffer :\n       texture_upload_buffers_submitted_) {\n    dfn.vkDestroyBuffer(device, submitted_texture_upload_buffer.buffer,\n                        nullptr);\n    dfn.vkFreeMemory(device, submitted_texture_upload_buffer.buffer_memory,\n                     nullptr);\n  }\n  for (PendingTextureUpload& pending_texture_upload :\n       texture_uploads_pending_) {\n    dfn.vkDestroyBuffer(device, pending_texture_upload.buffer, nullptr);\n    dfn.vkFreeMemory(device, pending_texture_upload.buffer_memory, nullptr);\n  }\n  for (VulkanImmediateTexture* texture : textures_) {\n    if (texture->immediate_drawer_ != this) {\n      continue;\n    }\n    texture->immediate_drawer_ = nullptr;\n    DestroyTextureResource(texture->resource_);\n  }\n  if (white_texture_.image != VK_NULL_HANDLE) {\n    DestroyTextureResource(white_texture_);\n  }\n\n  for (TextureDescriptorPool* pool : texture_descriptor_pools_) {\n    dfn.vkDestroyDescriptorPool(device, pool->pool, nullptr);\n    delete pool;\n  }\n  util::DestroyAndNullHandle(dfn.vkDestroyDescriptorSetLayout, device,\n                             texture_descriptor_set_layout_);\n}\n\nVulkanImmediateDrawer::VulkanImmediateDrawer(\n    const VulkanDevice* const vulkan_device,\n    const UISamplers* const ui_samplers)\n    : vulkan_device_(vulkan_device), ui_samplers_(ui_samplers) {\n  assert_not_null(vulkan_device);\n  assert_not_null(ui_samplers);\n}\n\nbool VulkanImmediateDrawer::Initialize() {\n  const VulkanDevice::Functions& dfn = vulkan_device_->functions();\n  const VkDevice device = vulkan_device_->device();\n\n  VkDescriptorSetLayoutBinding texture_descriptor_set_layout_binding;\n  texture_descriptor_set_layout_binding.binding = 0;\n  texture_descriptor_set_layout_binding.descriptorType =\n      VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;\n  texture_descriptor_set_layout_binding.descriptorCount = 1;\n  texture_descriptor_set_layout_binding.stageFlags =\n      VK_SHADER_STAGE_FRAGMENT_BIT;\n  texture_descriptor_set_layout_binding.pImmutableSamplers = nullptr;\n  VkDescriptorSetLayoutCreateInfo texture_descriptor_set_layout_create_info;\n  texture_descriptor_set_layout_create_info.sType =\n      VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;\n  texture_descriptor_set_layout_create_info.pNext = nullptr;\n  texture_descriptor_set_layout_create_info.flags = 0;\n  texture_descriptor_set_layout_create_info.bindingCount = 1;\n  texture_descriptor_set_layout_create_info.pBindings =\n      &texture_descriptor_set_layout_binding;\n  if (dfn.vkCreateDescriptorSetLayout(\n          device, &texture_descriptor_set_layout_create_info, nullptr,\n          &texture_descriptor_set_layout_) != VK_SUCCESS) {\n    XELOGE(\n        \"VulkanImmediateDrawer: Failed to create the combined image sampler \"\n        \"descriptor set layout\");\n    return false;\n  }\n\n  // Create the (1, 1, 1, 1) texture as a replacement when drawing without a\n  // real texture.\n  size_t white_texture_pending_upload_index;\n  if (!CreateTextureResource(1, 1, ImmediateTextureFilter::kNearest, false,\n                             nullptr, white_texture_,\n                             white_texture_pending_upload_index)) {\n    XELOGE(\"VulkanImmediateDrawer: Failed to create a blank texture\");\n    return false;\n  }\n\n  vertex_buffer_pool_ = std::make_unique<VulkanUploadBufferPool>(\n      vulkan_device_,\n      VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);\n\n  VkPushConstantRange push_constant_ranges[1];\n  push_constant_ranges[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;\n  push_constant_ranges[0].offset = offsetof(PushConstants, vertex);\n  push_constant_ranges[0].size = sizeof(PushConstants::Vertex);\n  VkPipelineLayoutCreateInfo pipeline_layout_create_info;\n  pipeline_layout_create_info.sType =\n      VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;\n  pipeline_layout_create_info.pNext = nullptr;\n  pipeline_layout_create_info.flags = 0;\n  pipeline_layout_create_info.setLayoutCount = 1;\n  pipeline_layout_create_info.pSetLayouts = &texture_descriptor_set_layout_;\n  pipeline_layout_create_info.pushConstantRangeCount =\n      uint32_t(xe::countof(push_constant_ranges));\n  pipeline_layout_create_info.pPushConstantRanges = push_constant_ranges;\n  if (dfn.vkCreatePipelineLayout(device, &pipeline_layout_create_info, nullptr,\n                                 &pipeline_layout_) != VK_SUCCESS) {\n    XELOGE(\"VulkanImmediateDrawer: Failed to create the pipeline layout\");\n    return false;\n  }\n\n  // Reset the current state.\n  batch_open_ = false;\n\n  return true;\n}\n\nstd::unique_ptr<ImmediateTexture> VulkanImmediateDrawer::CreateTexture(\n    uint32_t width, uint32_t height, ImmediateTextureFilter filter,\n    bool is_repeated, const uint8_t* data) {\n  assert_not_null(data);\n  auto texture = std::make_unique<VulkanImmediateTexture>(width, height);\n  size_t pending_upload_index;\n  if (CreateTextureResource(width, height, filter, is_repeated, data,\n                            texture->resource_, pending_upload_index)) {\n    // Manage by this immediate drawer.\n    texture->immediate_drawer_ = this;\n    texture->immediate_drawer_index_ = textures_.size();\n    textures_.push_back(texture.get());\n    texture->pending_upload_index_ = pending_upload_index;\n    texture_uploads_pending_[texture->pending_upload_index_].texture =\n        texture.get();\n  }\n  return std::move(texture);\n}\n\nvoid VulkanImmediateDrawer::Begin(UIDrawContext& ui_draw_context,\n                                  float coordinate_space_width,\n                                  float coordinate_space_height) {\n  ImmediateDrawer::Begin(ui_draw_context, coordinate_space_width,\n                         coordinate_space_height);\n\n  assert_false(batch_open_);\n\n  const VulkanUIDrawContext& vulkan_ui_draw_context =\n      static_cast<const VulkanUIDrawContext&>(ui_draw_context);\n\n  // Update the submission index to be used throughout the current immediate\n  // drawer paint.\n  last_paint_submission_index_ =\n      vulkan_ui_draw_context.submission_index_current();\n  last_completed_submission_index_ =\n      vulkan_ui_draw_context.submission_index_completed();\n\n  const VulkanDevice::Functions& dfn = vulkan_device_->functions();\n  const VkDevice device = vulkan_device_->device();\n\n  // Destroy deleted textures.\n  for (auto it = textures_deleted_.begin(); it != textures_deleted_.end();) {\n    if (it->second > last_completed_submission_index_) {\n      ++it;\n      continue;\n    }\n    DestroyTextureResource(it->first);\n    if (std::next(it) != textures_deleted_.end()) {\n      *it = textures_deleted_.back();\n    }\n    textures_deleted_.pop_back();\n  }\n\n  // Release upload buffers for completed texture uploads.\n  auto erase_texture_uploads_end = texture_upload_buffers_submitted_.begin();\n  while (erase_texture_uploads_end != texture_upload_buffers_submitted_.end()) {\n    if (erase_texture_uploads_end->submission_index >\n        last_completed_submission_index_) {\n      break;\n    }\n    dfn.vkDestroyBuffer(device, erase_texture_uploads_end->buffer, nullptr);\n    dfn.vkFreeMemory(device, erase_texture_uploads_end->buffer_memory, nullptr);\n    ++erase_texture_uploads_end;\n  }\n  texture_upload_buffers_submitted_.erase(\n      texture_upload_buffers_submitted_.begin(), erase_texture_uploads_end);\n\n  vertex_buffer_pool_->Reclaim(last_completed_submission_index_);\n\n  // Begin drawing.\n\n  // Update the framebuffer attachment format in the pipelines - may await\n  // submission completion if changing.\n  if (!EnsurePipelinesCreatedForCurrentRenderPass()) {\n    // Failed to create the pipelines - don't draw anything.\n    return;\n  }\n\n  VkCommandBuffer draw_command_buffer =\n      vulkan_ui_draw_context.draw_command_buffer();\n\n  VkViewport viewport;\n  viewport.x = 0.0f;\n  viewport.y = 0.0f;\n  viewport.width = float(vulkan_ui_draw_context.render_target_width());\n  viewport.height = float(vulkan_ui_draw_context.render_target_height());\n  viewport.minDepth = 0.0f;\n  viewport.maxDepth = 1.0f;\n  dfn.vkCmdSetViewport(draw_command_buffer, 0, 1, &viewport);\n  PushConstants::Vertex push_constants_vertex;\n  push_constants_vertex.coordinate_space_size_inv[0] =\n      1.0f / coordinate_space_width;\n  push_constants_vertex.coordinate_space_size_inv[1] =\n      1.0f / coordinate_space_height;\n  dfn.vkCmdPushConstants(draw_command_buffer, pipeline_layout_,\n                         VK_SHADER_STAGE_VERTEX_BIT,\n                         offsetof(PushConstants, vertex),\n                         sizeof(PushConstants::Vertex), &push_constants_vertex);\n  current_scissor_.offset.x = 0;\n  current_scissor_.offset.y = 0;\n  current_scissor_.extent.width = 0;\n  current_scissor_.extent.height = 0;\n\n  current_pipeline_ = VK_NULL_HANDLE;\n  current_texture_descriptor_index_ = UINT32_MAX;\n}\n\nvoid VulkanImmediateDrawer::BeginDrawBatch(const ImmediateDrawBatch& batch) {\n  assert_false(batch_open_);\n\n  const VulkanUIDrawContext& vulkan_ui_draw_context =\n      *static_cast<const VulkanUIDrawContext*>(ui_draw_context());\n  VkCommandBuffer draw_command_buffer =\n      vulkan_ui_draw_context.draw_command_buffer();\n\n  const VulkanDevice::Functions& dfn = vulkan_device_->functions();\n\n  // Bind the vertices.\n  size_t vertex_buffer_size = sizeof(ImmediateVertex) * batch.vertex_count;\n  VkBuffer vertex_buffer;\n  VkDeviceSize vertex_buffer_offset;\n  void* vertex_buffer_mapping = vertex_buffer_pool_->Request(\n      last_paint_submission_index_, vertex_buffer_size, sizeof(float),\n      vertex_buffer, vertex_buffer_offset);\n  if (!vertex_buffer_mapping) {\n    XELOGE(\"VulkanImmediateDrawer: Failed to get a buffer for {} vertices\",\n           batch.vertex_count);\n    return;\n  }\n  std::memcpy(vertex_buffer_mapping, batch.vertices, vertex_buffer_size);\n  dfn.vkCmdBindVertexBuffers(draw_command_buffer, 0, 1, &vertex_buffer,\n                             &vertex_buffer_offset);\n\n  // Bind the indices.\n  batch_has_index_buffer_ = batch.indices != nullptr;\n  if (batch_has_index_buffer_) {\n    size_t index_buffer_size = sizeof(uint16_t) * batch.index_count;\n    VkBuffer index_buffer;\n    VkDeviceSize index_buffer_offset;\n    void* index_buffer_mapping = vertex_buffer_pool_->Request(\n        last_paint_submission_index_, index_buffer_size, sizeof(uint16_t),\n        index_buffer, index_buffer_offset);\n    if (!index_buffer_mapping) {\n      XELOGE(\"VulkanImmediateDrawer: Failed to get a buffer for {} indices\",\n             batch.index_count);\n      return;\n    }\n    std::memcpy(index_buffer_mapping, batch.indices, index_buffer_size);\n    dfn.vkCmdBindIndexBuffer(draw_command_buffer, index_buffer,\n                             index_buffer_offset, VK_INDEX_TYPE_UINT16);\n  }\n\n  batch_open_ = true;\n}\n\nvoid VulkanImmediateDrawer::Draw(const ImmediateDraw& draw) {\n  if (!batch_open_) {\n    // Could have been an error while obtaining the vertex and index buffers,\n    // for instance.\n    return;\n  }\n\n  const VulkanDevice::Functions& dfn = vulkan_device_->functions();\n  const VulkanUIDrawContext& vulkan_ui_draw_context =\n      *static_cast<const VulkanUIDrawContext*>(ui_draw_context());\n  VkCommandBuffer draw_command_buffer =\n      vulkan_ui_draw_context.draw_command_buffer();\n\n  // Get the pipeline for the current primitive type.\n  VkPipeline pipeline;\n  switch (draw.primitive_type) {\n    case ImmediatePrimitiveType::kLines:\n      pipeline = pipeline_line_;\n      break;\n    case ImmediatePrimitiveType::kTriangles:\n      pipeline = pipeline_triangle_;\n      break;\n    default:\n      assert_unhandled_case(draw.primitive_type);\n      return;\n  }\n  if (pipeline == VK_NULL_HANDLE) {\n    // Failed to create the pipeline.\n    return;\n  }\n\n  // Set the scissor rectangle if enabled.\n  VkRect2D scissor;\n  uint32_t scissor_left, scissor_top;\n  if (!ScissorToRenderTarget(draw, scissor_left, scissor_top,\n                             scissor.extent.width, scissor.extent.height)) {\n    // Nothing is visible (zero area is used as the default current_scissor_\n    // value also).\n    return;\n  }\n  scissor.offset.x = int32_t(scissor_left);\n  scissor.offset.y = int32_t(scissor_top);\n  if (current_scissor_.offset.x != scissor.offset.x ||\n      current_scissor_.offset.y != scissor.offset.y ||\n      current_scissor_.extent.width != scissor.extent.width ||\n      current_scissor_.extent.height != scissor.extent.height) {\n    current_scissor_ = scissor;\n    dfn.vkCmdSetScissor(draw_command_buffer, 0, 1, &scissor);\n  }\n\n  // Bind the pipeline for the primitive type if the scissor is not empty.\n  if (current_pipeline_ != pipeline) {\n    current_pipeline_ = pipeline;\n    dfn.vkCmdBindPipeline(draw_command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS,\n                          pipeline);\n  }\n\n  // Bind the texture.\n  uint32_t texture_descriptor_index;\n  VulkanImmediateTexture* texture =\n      static_cast<VulkanImmediateTexture*>(draw.texture);\n  if (texture && texture->immediate_drawer_ == this) {\n    texture_descriptor_index = texture->resource_.descriptor_index;\n    texture->last_usage_submission_ = last_paint_submission_index_;\n  } else {\n    texture_descriptor_index = white_texture_.descriptor_index;\n  }\n  if (current_texture_descriptor_index_ != texture_descriptor_index) {\n    current_texture_descriptor_index_ = texture_descriptor_index;\n    VkDescriptorSet texture_descriptor_set =\n        GetTextureDescriptor(texture_descriptor_index);\n    dfn.vkCmdBindDescriptorSets(\n        draw_command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout_,\n        0, 1, &texture_descriptor_set, 0, nullptr);\n  }\n\n  // Draw.\n  if (batch_has_index_buffer_) {\n    dfn.vkCmdDrawIndexed(draw_command_buffer, draw.count, 1, draw.index_offset,\n                         draw.base_vertex, 0);\n  } else {\n    dfn.vkCmdDraw(draw_command_buffer, draw.count, 1, draw.base_vertex, 0);\n  }\n}\n\nvoid VulkanImmediateDrawer::EndDrawBatch() { batch_open_ = false; }\n\nvoid VulkanImmediateDrawer::End() {\n  assert_false(batch_open_);\n\n  // Upload textures.\n  if (!texture_uploads_pending_.empty()) {\n    VulkanPresenter& vulkan_presenter =\n        *static_cast<VulkanPresenter*>(presenter());\n    VkCommandBuffer setup_command_buffer =\n        vulkan_presenter.AcquireUISetupCommandBufferFromUIThread();\n    if (setup_command_buffer != VK_NULL_HANDLE) {\n      size_t texture_uploads_pending_count = texture_uploads_pending_.size();\n      const VulkanDevice::Functions& dfn = vulkan_device_->functions();\n      const VulkanUIDrawContext& vulkan_ui_draw_context =\n          *static_cast<const VulkanUIDrawContext*>(ui_draw_context());\n\n      // Transition to VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL.\n      std::vector<VkImageMemoryBarrier> image_memory_barriers;\n      image_memory_barriers.reserve(texture_uploads_pending_count);\n      VkImageMemoryBarrier image_memory_barrier;\n      image_memory_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;\n      image_memory_barrier.pNext = nullptr;\n      image_memory_barrier.srcAccessMask = 0;\n      image_memory_barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;\n      image_memory_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;\n      image_memory_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;\n      image_memory_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;\n      image_memory_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;\n      image_memory_barrier.subresourceRange =\n          util::InitializeSubresourceRange();\n      for (const PendingTextureUpload& pending_texture_upload :\n           texture_uploads_pending_) {\n        image_memory_barriers.emplace_back(image_memory_barrier).image =\n            pending_texture_upload.image;\n      }\n      dfn.vkCmdPipelineBarrier(\n          setup_command_buffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,\n          VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, nullptr, 0, nullptr,\n          uint32_t(image_memory_barriers.size()), image_memory_barriers.data());\n\n      // Do transfer operations and transition to\n      // VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, and also mark as used.\n      for (size_t i = 0; i < texture_uploads_pending_count; ++i) {\n        const PendingTextureUpload& pending_texture_upload =\n            texture_uploads_pending_[i];\n        if (pending_texture_upload.buffer != VK_NULL_HANDLE) {\n          // Copying.\n          VkBufferImageCopy copy_region;\n          copy_region.bufferOffset = 0;\n          copy_region.bufferRowLength = pending_texture_upload.width;\n          copy_region.bufferImageHeight = pending_texture_upload.height;\n          copy_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;\n          copy_region.imageSubresource.mipLevel = 0;\n          copy_region.imageSubresource.baseArrayLayer = 0;\n          copy_region.imageSubresource.layerCount = 1;\n          copy_region.imageOffset.x = 0;\n          copy_region.imageOffset.y = 0;\n          copy_region.imageOffset.z = 0;\n          copy_region.imageExtent.width = pending_texture_upload.width;\n          copy_region.imageExtent.height = pending_texture_upload.height;\n          copy_region.imageExtent.depth = 1;\n          dfn.vkCmdCopyBufferToImage(\n              setup_command_buffer, pending_texture_upload.buffer,\n              pending_texture_upload.image,\n              VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &copy_region);\n\n          SubmittedTextureUploadBuffer& submitted_texture_upload_buffer =\n              texture_upload_buffers_submitted_.emplace_back();\n          submitted_texture_upload_buffer.buffer =\n              pending_texture_upload.buffer;\n          submitted_texture_upload_buffer.buffer_memory =\n              pending_texture_upload.buffer_memory;\n          submitted_texture_upload_buffer.submission_index =\n              last_paint_submission_index_;\n        } else {\n          // Clearing (initializing the special empty image).\n          VkClearColorValue white_clear_value;\n          white_clear_value.float32[0] = 1.0f;\n          white_clear_value.float32[1] = 1.0f;\n          white_clear_value.float32[2] = 1.0f;\n          white_clear_value.float32[3] = 1.0f;\n          dfn.vkCmdClearColorImage(\n              setup_command_buffer, pending_texture_upload.image,\n              VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &white_clear_value, 1,\n              &image_memory_barrier.subresourceRange);\n        }\n\n        VkImageMemoryBarrier& image_memory_barrier_current =\n            image_memory_barriers[i];\n        image_memory_barrier_current.srcAccessMask =\n            VK_ACCESS_TRANSFER_WRITE_BIT;\n        image_memory_barrier_current.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;\n        image_memory_barrier_current.oldLayout =\n            VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;\n        image_memory_barrier_current.newLayout =\n            VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;\n\n        if (pending_texture_upload.texture) {\n          pending_texture_upload.texture->last_usage_submission_ =\n              last_paint_submission_index_;\n          pending_texture_upload.texture->pending_upload_index_ = SIZE_MAX;\n        }\n      }\n      dfn.vkCmdPipelineBarrier(\n          setup_command_buffer, VK_PIPELINE_STAGE_TRANSFER_BIT,\n          VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 0, 0, nullptr, 0, nullptr,\n          uint32_t(image_memory_barriers.size()), image_memory_barriers.data());\n\n      texture_uploads_pending_.clear();\n    }\n  }\n\n  vertex_buffer_pool_->FlushWrites();\n\n  ImmediateDrawer::End();\n}\n\nvoid VulkanImmediateDrawer::OnLeavePresenter() {\n  // Leaving the presenter's submission timeline - await GPU usage completion of\n  // all draws and texture uploads (which happen before draws) and reset\n  // submission indices.\n  VulkanPresenter& vulkan_presenter =\n      *static_cast<VulkanPresenter*>(presenter());\n  vulkan_presenter.AwaitUISubmissionCompletionFromUIThread(\n      last_paint_submission_index_);\n\n  for (VulkanImmediateTexture* texture : textures_) {\n    texture->last_usage_submission_ = 0;\n  }\n\n  const VulkanDevice::Functions& dfn = vulkan_device_->functions();\n  const VkDevice device = vulkan_device_->device();\n\n  for (SubmittedTextureUploadBuffer& submitted_texture_upload_buffer :\n       texture_upload_buffers_submitted_) {\n    dfn.vkDestroyBuffer(device, submitted_texture_upload_buffer.buffer,\n                        nullptr);\n    dfn.vkFreeMemory(device, submitted_texture_upload_buffer.buffer_memory,\n                     nullptr);\n  }\n\n  vertex_buffer_pool_->ChangeSubmissionTimeline();\n\n  last_paint_submission_index_ = 0;\n  last_completed_submission_index_ = 0;\n}\n\nbool VulkanImmediateDrawer::EnsurePipelinesCreatedForCurrentRenderPass() {\n  const VulkanUIDrawContext& vulkan_ui_draw_context =\n      *static_cast<const VulkanUIDrawContext*>(ui_draw_context());\n  VkFormat render_pass_format = vulkan_ui_draw_context.render_pass_format();\n\n  if (render_pass_format == pipeline_framebuffer_format_) {\n    // Either created, or failed to create once (don't try to create every\n    // frame).\n    return pipeline_triangle_ != VK_NULL_HANDLE &&\n           pipeline_line_ != VK_NULL_HANDLE;\n  }\n\n  if (last_paint_submission_index_ && pipeline_triangle_ != VK_NULL_HANDLE &&\n      pipeline_line_ != VK_NULL_HANDLE) {\n    // Make sure it's safe to delete the pipelines.\n    VulkanPresenter& vulkan_presenter =\n        *static_cast<VulkanPresenter*>(presenter());\n    vulkan_presenter.AwaitUISubmissionCompletionFromUIThread(\n        last_paint_submission_index_);\n  }\n\n  const VulkanDevice::Functions& dfn = vulkan_device_->functions();\n  const VkDevice device = vulkan_device_->device();\n\n  // Safe to destroy the pipelines now - if the render pass was recreated,\n  // completion of its usage has already been awaited.\n  util::DestroyAndNullHandle(dfn.vkDestroyPipeline, device, pipeline_line_);\n  util::DestroyAndNullHandle(dfn.vkDestroyPipeline, device, pipeline_triangle_);\n  // If creation fails now, don't try to create every frame.\n  pipeline_framebuffer_format_ = render_pass_format;\n\n  // Triangle pipeline.\n\n  VkPipelineShaderStageCreateInfo stages[2] = {};\n  stages[0].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;\n  stages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;\n  stages[0].module = util::CreateShaderModule(\n      vulkan_device_, shaders::immediate_vs, sizeof(shaders::immediate_vs));\n  if (stages[0].module == VK_NULL_HANDLE) {\n    XELOGE(\"VulkanImmediateDrawer: Failed to create the vertex shader module\");\n    return false;\n  }\n  stages[0].pName = \"main\";\n  stages[1].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;\n  stages[1].stage = VK_SHADER_STAGE_FRAGMENT_BIT;\n  stages[1].module = util::CreateShaderModule(\n      vulkan_device_, shaders::immediate_ps, sizeof(shaders::immediate_ps));\n  if (stages[1].module == VK_NULL_HANDLE) {\n    XELOGE(\n        \"VulkanImmediateDrawer: Failed to create the fragment shader module\");\n    dfn.vkDestroyShaderModule(device, stages[0].module, nullptr);\n    return false;\n  }\n  stages[1].pName = \"main\";\n\n  VkVertexInputBindingDescription vertex_input_binding;\n  vertex_input_binding.binding = 0;\n  vertex_input_binding.stride = sizeof(ImmediateVertex);\n  vertex_input_binding.inputRate = VK_VERTEX_INPUT_RATE_VERTEX;\n  VkVertexInputAttributeDescription vertex_input_attributes[3];\n  vertex_input_attributes[0].location = 0;\n  vertex_input_attributes[0].binding = 0;\n  vertex_input_attributes[0].format = VK_FORMAT_R32G32_SFLOAT;\n  vertex_input_attributes[0].offset = offsetof(ImmediateVertex, x);\n  vertex_input_attributes[1].location = 1;\n  vertex_input_attributes[1].binding = 0;\n  vertex_input_attributes[1].format = VK_FORMAT_R32G32_SFLOAT;\n  vertex_input_attributes[1].offset = offsetof(ImmediateVertex, u);\n  vertex_input_attributes[2].location = 2;\n  vertex_input_attributes[2].binding = 0;\n  vertex_input_attributes[2].format = VK_FORMAT_R8G8B8A8_UNORM;\n  vertex_input_attributes[2].offset = offsetof(ImmediateVertex, color);\n  VkPipelineVertexInputStateCreateInfo vertex_input_state;\n  vertex_input_state.sType =\n      VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;\n  vertex_input_state.pNext = nullptr;\n  vertex_input_state.flags = 0;\n  vertex_input_state.vertexBindingDescriptionCount = 1;\n  vertex_input_state.pVertexBindingDescriptions = &vertex_input_binding;\n  vertex_input_state.vertexAttributeDescriptionCount =\n      uint32_t(xe::countof(vertex_input_attributes));\n  vertex_input_state.pVertexAttributeDescriptions = vertex_input_attributes;\n\n  VkPipelineInputAssemblyStateCreateInfo input_assembly_state;\n  input_assembly_state.sType =\n      VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;\n  input_assembly_state.pNext = nullptr;\n  input_assembly_state.flags = 0;\n  input_assembly_state.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;\n  input_assembly_state.primitiveRestartEnable = VK_FALSE;\n\n  VkPipelineViewportStateCreateInfo viewport_state;\n  viewport_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;\n  viewport_state.pNext = nullptr;\n  viewport_state.flags = 0;\n  viewport_state.viewportCount = 1;\n  viewport_state.pViewports = nullptr;\n  viewport_state.scissorCount = 1;\n  viewport_state.pScissors = nullptr;\n\n  VkPipelineRasterizationStateCreateInfo rasterization_state = {};\n  rasterization_state.sType =\n      VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;\n  rasterization_state.polygonMode = VK_POLYGON_MODE_FILL;\n  rasterization_state.cullMode = VK_CULL_MODE_NONE;\n  rasterization_state.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;\n  rasterization_state.lineWidth = 1.0f;\n\n  VkPipelineMultisampleStateCreateInfo multisample_state = {};\n  multisample_state.sType =\n      VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;\n  multisample_state.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;\n\n  VkPipelineColorBlendAttachmentState color_blend_attachment_state;\n  color_blend_attachment_state.blendEnable = VK_TRUE;\n  color_blend_attachment_state.srcColorBlendFactor = VK_BLEND_FACTOR_SRC_ALPHA;\n  color_blend_attachment_state.dstColorBlendFactor =\n      VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;\n  color_blend_attachment_state.colorBlendOp = VK_BLEND_OP_ADD;\n  color_blend_attachment_state.srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE;\n  color_blend_attachment_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_ONE;\n  color_blend_attachment_state.alphaBlendOp = VK_BLEND_OP_ADD;\n  color_blend_attachment_state.colorWriteMask =\n      VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT |\n      VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;\n  VkPipelineColorBlendStateCreateInfo color_blend_state = {};\n  color_blend_state.sType =\n      VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;\n  color_blend_state.attachmentCount = 1;\n  color_blend_state.pAttachments = &color_blend_attachment_state;\n\n  static const VkDynamicState dynamic_states[] = {\n      VK_DYNAMIC_STATE_VIEWPORT,\n      VK_DYNAMIC_STATE_SCISSOR,\n  };\n  VkPipelineDynamicStateCreateInfo dynamic_state;\n  dynamic_state.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;\n  dynamic_state.pNext = nullptr;\n  dynamic_state.flags = 0;\n  dynamic_state.dynamicStateCount = uint32_t(xe::countof(dynamic_states));\n  dynamic_state.pDynamicStates = dynamic_states;\n\n  VkGraphicsPipelineCreateInfo pipeline_create_info;\n  pipeline_create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;\n  pipeline_create_info.pNext = nullptr;\n  pipeline_create_info.flags = VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT;\n  pipeline_create_info.stageCount = uint32_t(xe::countof(stages));\n  pipeline_create_info.pStages = stages;\n  pipeline_create_info.pVertexInputState = &vertex_input_state;\n  pipeline_create_info.pInputAssemblyState = &input_assembly_state;\n  pipeline_create_info.pTessellationState = nullptr;\n  pipeline_create_info.pViewportState = &viewport_state;\n  pipeline_create_info.pRasterizationState = &rasterization_state;\n  pipeline_create_info.pMultisampleState = &multisample_state;\n  pipeline_create_info.pDepthStencilState = nullptr;\n  pipeline_create_info.pColorBlendState = &color_blend_state;\n  pipeline_create_info.pDynamicState = &dynamic_state;\n  pipeline_create_info.layout = pipeline_layout_;\n  pipeline_create_info.renderPass = vulkan_ui_draw_context.render_pass();\n  pipeline_create_info.subpass = 0;\n  pipeline_create_info.basePipelineHandle = VK_NULL_HANDLE;\n  pipeline_create_info.basePipelineIndex = -1;\n  if (dfn.vkCreateGraphicsPipelines(device, VK_NULL_HANDLE, 1,\n                                    &pipeline_create_info, nullptr,\n                                    &pipeline_triangle_) != VK_SUCCESS) {\n    XELOGE(\n        \"VulkanImmediateDrawer: Failed to create the triangle list pipeline\");\n    dfn.vkDestroyShaderModule(device, stages[1].module, nullptr);\n    dfn.vkDestroyShaderModule(device, stages[0].module, nullptr);\n    return false;\n  }\n\n  // Line pipeline.\n\n  input_assembly_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;\n  pipeline_create_info.flags =\n      (pipeline_create_info.flags & ~VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT) |\n      VK_PIPELINE_CREATE_DERIVATIVE_BIT;\n  pipeline_create_info.basePipelineHandle = pipeline_triangle_;\n  VkResult pipeline_line_create_result = dfn.vkCreateGraphicsPipelines(\n      device, VK_NULL_HANDLE, 1, &pipeline_create_info, nullptr,\n      &pipeline_line_);\n  dfn.vkDestroyShaderModule(device, stages[1].module, nullptr);\n  dfn.vkDestroyShaderModule(device, stages[0].module, nullptr);\n  if (pipeline_line_create_result != VK_SUCCESS) {\n    XELOGE(\"VulkanImmediateDrawer: Failed to create the line list pipeline\");\n    dfn.vkDestroyPipeline(device, pipeline_triangle_, nullptr);\n    pipeline_triangle_ = VK_NULL_HANDLE;\n    return false;\n  }\n\n  return true;\n}\n\nuint32_t VulkanImmediateDrawer::AllocateTextureDescriptor() {\n  // Try to reuse a recycled descriptor first.\n  if (texture_descriptor_pool_recycled_first_) {\n    TextureDescriptorPool* pool = texture_descriptor_pool_recycled_first_;\n    assert_not_zero(pool->recycled_bits);\n    uint32_t local_index;\n    xe::bit_scan_forward(pool->recycled_bits, &local_index);\n    pool->recycled_bits &= ~(uint64_t(1) << local_index);\n    if (!pool->recycled_bits) {\n      texture_descriptor_pool_recycled_first_ = pool->recycled_next;\n    }\n    return (pool->index << 6) | local_index;\n  }\n\n  const VulkanDevice::Functions& dfn = vulkan_device_->functions();\n  const VkDevice device = vulkan_device_->device();\n\n  VkDescriptorSetAllocateInfo allocate_info;\n  allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;\n  allocate_info.pNext = nullptr;\n  allocate_info.descriptorSetCount = 1;\n  allocate_info.pSetLayouts = &texture_descriptor_set_layout_;\n\n  // If no recycled, try to create a new allocation within an existing pool with\n  // unallocated descriptors left.\n  while (texture_descriptor_pool_unallocated_first_) {\n    TextureDescriptorPool* pool = texture_descriptor_pool_unallocated_first_;\n    assert_not_zero(pool->unallocated_count);\n    allocate_info.descriptorPool = pool->pool;\n    uint32_t local_index =\n        TextureDescriptorPool::kDescriptorCount - pool->unallocated_count;\n    VkResult allocate_result = dfn.vkAllocateDescriptorSets(\n        device, &allocate_info, &pool->sets[local_index]);\n    if (allocate_result == VK_SUCCESS) {\n      --pool->unallocated_count;\n    } else {\n      // Failed to allocate for some reason, don't try again for this pool.\n      pool->unallocated_count = 0;\n    }\n    if (!pool->unallocated_count) {\n      texture_descriptor_pool_unallocated_first_ = pool->unallocated_next;\n    }\n    if (allocate_result == VK_SUCCESS) {\n      return (pool->index << 6) | local_index;\n    }\n  }\n\n  // Create a new pool and allocate the descriptor from it.\n  VkDescriptorPoolSize descriptor_pool_size;\n  descriptor_pool_size.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;\n  descriptor_pool_size.descriptorCount =\n      TextureDescriptorPool::kDescriptorCount;\n  VkDescriptorPoolCreateInfo descriptor_pool_create_info;\n  descriptor_pool_create_info.sType =\n      VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;\n  descriptor_pool_create_info.pNext = nullptr;\n  descriptor_pool_create_info.flags = 0;\n  descriptor_pool_create_info.maxSets = TextureDescriptorPool::kDescriptorCount;\n  descriptor_pool_create_info.poolSizeCount = 1;\n  descriptor_pool_create_info.pPoolSizes = &descriptor_pool_size;\n  VkDescriptorPool descriptor_pool;\n  if (dfn.vkCreateDescriptorPool(device, &descriptor_pool_create_info, nullptr,\n                                 &descriptor_pool) != VK_SUCCESS) {\n    XELOGE(\n        \"VulkanImmediateDrawer: Failed to create a combined image sampler \"\n        \"descriptor pool with {} descriptors\",\n        TextureDescriptorPool::kDescriptorCount);\n    return UINT32_MAX;\n  }\n  allocate_info.descriptorPool = descriptor_pool;\n  VkDescriptorSet descriptor_set;\n  if (dfn.vkAllocateDescriptorSets(device, &allocate_info, &descriptor_set) !=\n      VK_SUCCESS) {\n    XELOGE(\n        \"VulkanImmediateDrawer: Failed to allocate a combined image sampler \"\n        \"descriptor\");\n    dfn.vkDestroyDescriptorPool(device, descriptor_pool, nullptr);\n    return UINT32_MAX;\n  }\n  TextureDescriptorPool* new_pool = new TextureDescriptorPool;\n  new_pool->pool = descriptor_pool;\n  new_pool->sets[0] = descriptor_set;\n  uint32_t new_pool_index = uint32_t(texture_descriptor_pools_.size());\n  new_pool->index = new_pool_index;\n  new_pool->unallocated_count = TextureDescriptorPool::kDescriptorCount - 1;\n  new_pool->recycled_bits = 0;\n  new_pool->unallocated_next = texture_descriptor_pool_unallocated_first_;\n  texture_descriptor_pool_unallocated_first_ = new_pool;\n  new_pool->recycled_next = nullptr;\n  texture_descriptor_pools_.push_back(new_pool);\n  return new_pool_index << 6;\n}\n\nVkDescriptorSet VulkanImmediateDrawer::GetTextureDescriptor(\n    uint32_t descriptor_index) const {\n  uint32_t pool_index = descriptor_index >> 6;\n  assert_true(pool_index < texture_descriptor_pools_.size());\n  const TextureDescriptorPool* pool = texture_descriptor_pools_[pool_index];\n  uint32_t allocation_index = descriptor_index & 63;\n  assert_true(allocation_index < TextureDescriptorPool::kDescriptorCount -\n                                     pool->unallocated_count);\n  return pool->sets[allocation_index];\n}\n\nvoid VulkanImmediateDrawer::FreeTextureDescriptor(uint32_t descriptor_index) {\n  uint32_t pool_index = descriptor_index >> 6;\n  assert_true(pool_index < texture_descriptor_pools_.size());\n  TextureDescriptorPool* pool = texture_descriptor_pools_[pool_index];\n  uint32_t allocation_index = descriptor_index & 63;\n  assert_true(allocation_index < TextureDescriptorPool::kDescriptorCount -\n                                     pool->unallocated_count);\n  assert_zero(pool->recycled_bits & (uint64_t(1) << allocation_index));\n  if (!pool->recycled_bits) {\n    // Add to the free list if not already in it.\n    pool->recycled_next = texture_descriptor_pool_recycled_first_;\n    texture_descriptor_pool_recycled_first_ = pool;\n  }\n  pool->recycled_bits |= uint64_t(1) << allocation_index;\n}\n\nbool VulkanImmediateDrawer::CreateTextureResource(\n    uint32_t width, uint32_t height, ImmediateTextureFilter filter,\n    bool is_repeated, const uint8_t* data,\n    VulkanImmediateTexture::Resource& resource_out,\n    size_t& pending_upload_index_out) {\n  const VulkanDevice::Functions& dfn = vulkan_device_->functions();\n  const VkDevice device = vulkan_device_->device();\n\n  // Create the image and the descriptor.\n\n  VkImageCreateInfo image_create_info;\n  image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;\n  image_create_info.pNext = nullptr;\n  image_create_info.flags = 0;\n  image_create_info.imageType = VK_IMAGE_TYPE_2D;\n  image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;\n  image_create_info.extent.width = width;\n  image_create_info.extent.height = height;\n  image_create_info.extent.depth = 1;\n  image_create_info.mipLevels = 1;\n  image_create_info.arrayLayers = 1;\n  image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;\n  image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;\n  image_create_info.usage =\n      VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;\n  image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;\n  image_create_info.queueFamilyIndexCount = 0;\n  image_create_info.pQueueFamilyIndices = nullptr;\n  image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;\n  VkImage image;\n  VkDeviceMemory image_memory;\n  if (!util::CreateDedicatedAllocationImage(vulkan_device_, image_create_info,\n                                            util::MemoryPurpose::kDeviceLocal,\n                                            image, image_memory)) {\n    XELOGE(\n        \"VulkanImmediateDrawer: Failed to create an image with dedicated \"\n        \"memory for a {}x{} texture\",\n        width, height);\n    return false;\n  }\n\n  VkImageViewCreateInfo image_view_create_info;\n  image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;\n  image_view_create_info.pNext = nullptr;\n  image_view_create_info.flags = 0;\n  image_view_create_info.image = image;\n  image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;\n  image_view_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;\n  // data == nullptr is a special case for (1, 1, 1, 1), though the image will\n  // be cleared to (1, 1, 1, 1) anyway, just a micro-optimization.\n  VkComponentSwizzle swizzle =\n      (data || !vulkan_device_->properties().imageViewFormatSwizzle)\n          ? VK_COMPONENT_SWIZZLE_IDENTITY\n          : VK_COMPONENT_SWIZZLE_ONE;\n  image_view_create_info.components.r = swizzle;\n  image_view_create_info.components.g = swizzle;\n  image_view_create_info.components.b = swizzle;\n  image_view_create_info.components.a = swizzle;\n  image_view_create_info.subresourceRange = util::InitializeSubresourceRange();\n  VkImageView image_view;\n  if (dfn.vkCreateImageView(device, &image_view_create_info, nullptr,\n                            &image_view) != VK_SUCCESS) {\n    XELOGE(\n        \"VulkanImmediateDrawer: Failed to create an image view for a {}x{} \"\n        \"image\",\n        width, height);\n    dfn.vkDestroyImage(device, image, nullptr);\n    dfn.vkFreeMemory(device, image_memory, nullptr);\n    return false;\n  }\n\n  uint32_t descriptor_index = AllocateTextureDescriptor();\n  if (descriptor_index == UINT32_MAX) {\n    XELOGE(\n        \"VulkanImmediateDrawer: Failed to allocate a descriptor for an image\");\n    dfn.vkDestroyImageView(device, image_view, nullptr);\n    dfn.vkDestroyImage(device, image, nullptr);\n    dfn.vkFreeMemory(device, image_memory, nullptr);\n    return false;\n  }\n  VkDescriptorImageInfo descriptor_image_info;\n  UISamplers::SamplerIndex ui_sampler_index;\n  if (filter == ImmediateTextureFilter::kLinear) {\n    ui_sampler_index = is_repeated ? UISamplers::kSamplerIndexLinearRepeat\n                                   : UISamplers::kSamplerIndexLinearClampToEdge;\n  } else {\n    ui_sampler_index = is_repeated\n                           ? UISamplers::kSamplerIndexNearestRepeat\n                           : UISamplers::kSamplerIndexNearestClampToEdge;\n  }\n  descriptor_image_info.sampler = ui_samplers_->samplers()[ui_sampler_index];\n  descriptor_image_info.imageView = image_view;\n  descriptor_image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;\n  VkWriteDescriptorSet descriptor_write;\n  descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;\n  descriptor_write.pNext = nullptr;\n  descriptor_write.dstSet = GetTextureDescriptor(descriptor_index);\n  descriptor_write.dstBinding = 0;\n  descriptor_write.dstArrayElement = 0;\n  descriptor_write.descriptorCount = 1;\n  descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;\n  descriptor_write.pImageInfo = &descriptor_image_info;\n  descriptor_write.pBufferInfo = nullptr;\n  descriptor_write.pTexelBufferView = nullptr;\n  dfn.vkUpdateDescriptorSets(device, 1, &descriptor_write, 0, nullptr);\n\n  // Create and fill the upload buffer.\n\n  // data == nullptr is a special case for (1, 1, 1, 1), clearing rather than\n  // uploading in this case.\n  VkBuffer upload_buffer = VK_NULL_HANDLE;\n  VkDeviceMemory upload_buffer_memory = VK_NULL_HANDLE;\n  if (data) {\n    size_t data_size = sizeof(uint32_t) * width * height;\n    uint32_t upload_buffer_memory_type;\n    if (!util::CreateDedicatedAllocationBuffer(\n            vulkan_device_, VkDeviceSize(data_size),\n            VK_BUFFER_USAGE_TRANSFER_SRC_BIT, util::MemoryPurpose::kUpload,\n            upload_buffer, upload_buffer_memory, &upload_buffer_memory_type)) {\n      XELOGE(\n          \"VulkanImmediateDrawer: Failed to create an upload buffer for a \"\n          \"{}x{} image\",\n          width, height);\n      FreeTextureDescriptor(descriptor_index);\n      dfn.vkDestroyImageView(device, image_view, nullptr);\n      dfn.vkDestroyImage(device, image, nullptr);\n      dfn.vkFreeMemory(device, image_memory, nullptr);\n      return false;\n    }\n    void* upload_buffer_mapping;\n    if (dfn.vkMapMemory(device, upload_buffer_memory, 0, VK_WHOLE_SIZE, 0,\n                        &upload_buffer_mapping) != VK_SUCCESS) {\n      XELOGE(\n          \"VulkanImmediateDrawer: Failed to map upload buffer memory for a \"\n          \"{}x{} image\",\n          width, height);\n      dfn.vkDestroyBuffer(device, upload_buffer, nullptr);\n      dfn.vkFreeMemory(device, upload_buffer_memory, nullptr);\n      FreeTextureDescriptor(descriptor_index);\n      dfn.vkDestroyImageView(device, image_view, nullptr);\n      dfn.vkDestroyImage(device, image, nullptr);\n      dfn.vkFreeMemory(device, image_memory, nullptr);\n      return false;\n    }\n    std::memcpy(upload_buffer_mapping, data, data_size);\n    util::FlushMappedMemoryRange(vulkan_device_, upload_buffer_memory,\n                                 upload_buffer_memory_type);\n    dfn.vkUnmapMemory(device, upload_buffer_memory);\n  }\n\n  resource_out.image = image;\n  resource_out.memory = image_memory;\n  resource_out.image_view = image_view;\n  resource_out.descriptor_index = descriptor_index;\n\n  pending_upload_index_out = texture_uploads_pending_.size();\n  PendingTextureUpload& pending_upload =\n      texture_uploads_pending_.emplace_back();\n  // The caller will set the ImmedateTexture pointer if needed.\n  pending_upload.texture = nullptr;\n  pending_upload.buffer = upload_buffer;\n  pending_upload.buffer_memory = upload_buffer_memory;\n  pending_upload.image = image;\n  pending_upload.width = width;\n  pending_upload.height = height;\n\n  return true;\n}\n\nvoid VulkanImmediateDrawer::DestroyTextureResource(\n    VulkanImmediateTexture::Resource& resource) {\n  FreeTextureDescriptor(resource.descriptor_index);\n  const VulkanDevice::Functions& dfn = vulkan_device_->functions();\n  const VkDevice device = vulkan_device_->device();\n  dfn.vkDestroyImageView(device, resource.image_view, nullptr);\n  dfn.vkDestroyImage(device, resource.image, nullptr);\n  dfn.vkFreeMemory(device, resource.memory, nullptr);\n}\n\nvoid VulkanImmediateDrawer::OnImmediateTextureDestroyed(\n    VulkanImmediateTexture& texture) {\n  // Remove from the pending uploads.\n  size_t pending_upload_index = texture.pending_upload_index_;\n  if (pending_upload_index != SIZE_MAX) {\n    if (pending_upload_index + 1 < texture_uploads_pending_.size()) {\n      PendingTextureUpload& pending_upload =\n          texture_uploads_pending_[pending_upload_index];\n      pending_upload = texture_uploads_pending_.back();\n      if (pending_upload.texture) {\n        pending_upload.texture->pending_upload_index_ = pending_upload_index;\n      }\n    }\n    texture_uploads_pending_.pop_back();\n  }\n\n  // Remove from the texture list.\n  VulkanImmediateTexture*& texture_at_index =\n      textures_[texture.immediate_drawer_index_];\n  texture_at_index = textures_.back();\n  texture_at_index->immediate_drawer_index_ = texture.immediate_drawer_index_;\n  textures_.pop_back();\n\n  // Destroy immediately or queue for destruction if in use.\n  if (texture.last_usage_submission_ > last_completed_submission_index_) {\n    textures_deleted_.emplace_back(\n        std::make_pair(texture.resource_, texture.last_usage_submission_));\n  } else {\n    DestroyTextureResource(texture.resource_);\n  }\n}\n\n}  // namespace vulkan\n}  // namespace ui\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/ui/vulkan/vulkan_immediate_drawer.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_VULKAN_VULKAN_IMMEDIATE_DRAWER_H_\n#define XENIA_UI_VULKAN_VULKAN_IMMEDIATE_DRAWER_H_\n\n#include <cstddef>\n#include <deque>\n#include <memory>\n#include <utility>\n#include <vector>\n\n#include \"xenia/ui/immediate_drawer.h\"\n#include \"xenia/ui/vulkan/ui_samplers.h\"\n#include \"xenia/ui/vulkan/vulkan_upload_buffer_pool.h\"\n\nnamespace xe {\nnamespace ui {\nnamespace vulkan {\n\nclass VulkanImmediateDrawer : public ImmediateDrawer {\n public:\n  static std::unique_ptr<VulkanImmediateDrawer> Create(\n      const VulkanDevice* vulkan_device, const UISamplers* ui_samplers);\n\n  ~VulkanImmediateDrawer();\n\n  std::unique_ptr<ImmediateTexture> CreateTexture(uint32_t width,\n                                                  uint32_t height,\n                                                  ImmediateTextureFilter filter,\n                                                  bool is_repeated,\n                                                  const uint8_t* data) override;\n\n  void Begin(UIDrawContext& ui_draw_context, float coordinate_space_width,\n             float coordinate_space_height) override;\n  void BeginDrawBatch(const ImmediateDrawBatch& batch) override;\n  void Draw(const ImmediateDraw& draw) override;\n  void EndDrawBatch() override;\n  void End() override;\n\n protected:\n  void OnLeavePresenter() override;\n\n private:\n  struct PushConstants {\n    struct Vertex {\n      float coordinate_space_size_inv[2];\n    } vertex;\n  };\n\n  class VulkanImmediateTexture : public ImmediateTexture {\n   public:\n    struct Resource {\n      VkImage image;\n      VkDeviceMemory memory;\n      VkImageView image_view;\n      uint32_t descriptor_index;\n    };\n\n    VulkanImmediateTexture(uint32_t width, uint32_t height)\n        : ImmediateTexture(width, height), immediate_drawer_(nullptr) {}\n    ~VulkanImmediateTexture() override;\n\n    // If null, this is either a blank texture, or the immediate drawer has been\n    // destroyed.\n    VulkanImmediateDrawer* immediate_drawer_;\n    size_t immediate_drawer_index_;\n    // Invalid if immediate_drawer_ is null, since it's managed by the immediate\n    // drawer.\n    Resource resource_;\n    size_t pending_upload_index_;\n    uint64_t last_usage_submission_ = 0;\n  };\n\n  struct TextureDescriptorPool {\n    // Using uint64_t for recycled bits.\n    static constexpr uint32_t kDescriptorCount = 64;\n    VkDescriptorPool pool;\n    VkDescriptorSet sets[kDescriptorCount];\n    uint32_t index;\n    uint32_t unallocated_count;\n    uint64_t recycled_bits;\n    TextureDescriptorPool* unallocated_next;\n    TextureDescriptorPool* recycled_next;\n  };\n\n  explicit VulkanImmediateDrawer(const VulkanDevice* vulkan_device,\n                                 const UISamplers* ui_samplers);\n  bool Initialize();\n\n  bool EnsurePipelinesCreatedForCurrentRenderPass();\n\n  // Allocates a combined image sampler in a pool and returns its index, or\n  // UINT32_MAX in case of failure.\n  uint32_t AllocateTextureDescriptor();\n  VkDescriptorSet GetTextureDescriptor(uint32_t descriptor_index) const;\n  void FreeTextureDescriptor(uint32_t descriptor_index);\n\n  // If data is null, a (1, 1, 1, 1) image will be created, which can be used as\n  // a replacement when drawing without a real texture.\n  bool CreateTextureResource(uint32_t width, uint32_t height,\n                             ImmediateTextureFilter filter, bool is_repeated,\n                             const uint8_t* data,\n                             VulkanImmediateTexture::Resource& resource_out,\n                             size_t& pending_upload_index_out);\n  void DestroyTextureResource(VulkanImmediateTexture::Resource& resource);\n  void OnImmediateTextureDestroyed(VulkanImmediateTexture& texture);\n\n  const VulkanDevice* vulkan_device_;\n  const UISamplers* ui_samplers_;\n\n  // Combined image sampler pools for textures.\n  VkDescriptorSetLayout texture_descriptor_set_layout_;\n  std::vector<TextureDescriptorPool*> texture_descriptor_pools_;\n  TextureDescriptorPool* texture_descriptor_pool_unallocated_first_ = nullptr;\n  TextureDescriptorPool* texture_descriptor_pool_recycled_first_ = nullptr;\n\n  VulkanImmediateTexture::Resource white_texture_ = {};\n  std::vector<VulkanImmediateTexture*> textures_;\n  struct PendingTextureUpload {\n    // Null for internal resources such as the white texture.\n    VulkanImmediateTexture* texture;\n    // VK_NULL_HANDLE if need to clear rather than to copy.\n    VkBuffer buffer;\n    VkDeviceMemory buffer_memory;\n    VkImage image;\n    uint32_t width;\n    uint32_t height;\n  };\n  std::vector<PendingTextureUpload> texture_uploads_pending_;\n  struct SubmittedTextureUploadBuffer {\n    VkBuffer buffer;\n    VkDeviceMemory buffer_memory;\n    uint64_t submission_index;\n  };\n  std::deque<SubmittedTextureUploadBuffer> texture_upload_buffers_submitted_;\n  // Resource and last usage submission pairs.\n  std::vector<std::pair<VulkanImmediateTexture::Resource, uint64_t>>\n      textures_deleted_;\n\n  std::unique_ptr<VulkanUploadBufferPool> vertex_buffer_pool_;\n\n  VkPipelineLayout pipeline_layout_ = VK_NULL_HANDLE;\n\n  VkFormat pipeline_framebuffer_format_ = VK_FORMAT_UNDEFINED;\n  VkPipeline pipeline_triangle_ = VK_NULL_HANDLE;\n  VkPipeline pipeline_line_ = VK_NULL_HANDLE;\n\n  // The submission index within the current Begin (or the last, if outside\n  // one).\n  uint64_t last_paint_submission_index_ = 0;\n  // Completed submission index as of the latest Begin, to coarsely skip delayed\n  // texture deletion.\n  uint64_t last_completed_submission_index_ = 0;\n\n  VkCommandBuffer current_command_buffer_ = VK_NULL_HANDLE;\n  VkExtent2D current_render_target_extent_;\n  VkRect2D current_scissor_;\n  VkPipeline current_pipeline_;\n  uint32_t current_texture_descriptor_index_;\n  bool batch_open_ = false;\n  bool batch_has_index_buffer_;\n};\n\n}  // namespace vulkan\n}  // namespace ui\n}  // namespace xe\n\n#endif  // XENIA_UI_VULKAN_VULKAN_IMMEDIATE_DRAWER_H_\n"
  },
  {
    "path": "src/xenia/ui/vulkan/vulkan_instance.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2025 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/ui/vulkan/vulkan_instance.h\"\n\n#include <sstream>\n#include <string>\n#include <unordered_map>\n#include <utility>\n#include <vector>\n\n#include \"xenia/base/cvar.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/platform.h\"\n#include \"xenia/ui/vulkan/vulkan_presenter.h\"\n\n#if XE_PLATFORM_LINUX\n#include <dlfcn.h>\n#elif XE_PLATFORM_WIN32\n#include \"xenia/base/platform_win.h\"\n#endif\n\nDEFINE_bool(\n    vulkan_log_debug_messages, true,\n    \"Write Vulkan VK_EXT_debug_utils messages to the Xenia log, as opposed to \"\n    \"the OS debug output.\",\n    \"Vulkan\");\n\nnamespace xe {\nnamespace ui {\nnamespace vulkan {\n\nstd::unique_ptr<VulkanInstance> VulkanInstance::Create(\n    const bool with_surface, const bool try_enable_validation) {\n  std::unique_ptr<VulkanInstance> vulkan_instance(new VulkanInstance());\n\n  // Load the RenderDoc API if connected.\n\n  vulkan_instance->renderdoc_api_ = RenderDocAPI::CreateIfConnected();\n\n  // Load the loader library.\n\n  Functions& ifn = vulkan_instance->functions_;\n\n  bool functions_loaded = true;\n#if XE_PLATFORM_LINUX\n#if XE_PLATFORM_ANDROID\n  const char* const loader_library_name = \"libvulkan.so\";\n#else\n  const char* const loader_library_name = \"libvulkan.so.1\";\n#endif\n  // http://developer.download.nvidia.com/mobile/shield/assets/Vulkan/UsingtheVulkanAPI.pdf\n  vulkan_instance->loader_ = dlopen(loader_library_name, RTLD_NOW | RTLD_LOCAL);\n  if (!vulkan_instance->loader_) {\n    XELOGE(\"Failed to load {}\", loader_library_name);\n    return nullptr;\n  }\n#define XE_VULKAN_LOAD_LOADER_FUNCTION(name)                             \\\n  functions_loaded &=                                                    \\\n      (ifn.name = PFN_##name(dlsym(vulkan_instance->loader_, #name))) != \\\n      nullptr;\n#elif XE_PLATFORM_WIN32\n  vulkan_instance->loader_ = LoadLibraryW(L\"vulkan-1.dll\");\n  if (!vulkan_instance->loader_) {\n    XELOGE(\"Failed to load vulkan-1.dll\");\n    return nullptr;\n  }\n#define XE_VULKAN_LOAD_LOADER_FUNCTION(name)                 \\\n  functions_loaded &= (ifn.name = PFN_##name(GetProcAddress( \\\n                           vulkan_instance->loader_, #name))) != nullptr;\n#else\n#error No Vulkan loader library loading provided for the target platform.\n#endif\n  XE_VULKAN_LOAD_LOADER_FUNCTION(vkGetInstanceProcAddr);\n  XE_VULKAN_LOAD_LOADER_FUNCTION(vkDestroyInstance);\n#undef XE_VULKAN_LOAD_LOADER_FUNCTION\n  if (!functions_loaded) {\n    XELOGE(\"Failed to get Vulkan loader function pointers\");\n    return nullptr;\n  }\n\n  // Load global functions.\n\n  functions_loaded &=\n      (ifn.vkCreateInstance = PFN_vkCreateInstance(\n           ifn.vkGetInstanceProcAddr(nullptr, \"vkCreateInstance\"))) != nullptr;\n  functions_loaded &=\n      (ifn.vkEnumerateInstanceExtensionProperties =\n           PFN_vkEnumerateInstanceExtensionProperties(ifn.vkGetInstanceProcAddr(\n               nullptr, \"vkEnumerateInstanceExtensionProperties\"))) != nullptr;\n  functions_loaded &=\n      (ifn.vkEnumerateInstanceLayerProperties =\n           PFN_vkEnumerateInstanceLayerProperties(ifn.vkGetInstanceProcAddr(\n               nullptr, \"vkEnumerateInstanceLayerProperties\"))) != nullptr;\n  if (!functions_loaded) {\n    XELOGE(\n        \"Failed to get Vulkan global function pointers via \"\n        \"vkGetInstanceProcAddr\");\n    return nullptr;\n  }\n  // Available since Vulkan 1.1. If this is nullptr, it's a Vulkan 1.0 instance.\n  ifn.vkEnumerateInstanceVersion = PFN_vkEnumerateInstanceVersion(\n      ifn.vkGetInstanceProcAddr(nullptr, \"vkEnumerateInstanceVersion\"));\n\n  // Get the API version.\n\n  if (ifn.vkEnumerateInstanceVersion) {\n    ifn.vkEnumerateInstanceVersion(&vulkan_instance->api_version_);\n  }\n\n  // Enable extensions and layers.\n\n  // Name pointers from `requested_extensions` will be used in the enabled\n  // extensions vector.\n  std::unordered_map<std::string, bool*> requested_extensions;\n  if (vulkan_instance->api_version_ >= VK_MAKE_API_VERSION(0, 1, 1, 0)) {\n    vulkan_instance->extensions_.ext_1_1_KHR_get_physical_device_properties2 =\n        true;\n  } else {\n    // #60.\n    requested_extensions.emplace(\n        \"VK_KHR_get_physical_device_properties2\",\n        &vulkan_instance->extensions_\n             .ext_1_1_KHR_get_physical_device_properties2);\n  }\n  // #129.\n  requested_extensions.emplace(\n      \"VK_EXT_debug_utils\", &vulkan_instance->extensions_.ext_EXT_debug_utils);\n  // #395.\n  requested_extensions.emplace(\n      \"VK_KHR_portability_enumeration\",\n      &vulkan_instance->extensions_.ext_KHR_portability_enumeration);\n  if (with_surface) {\n    // #1.\n    requested_extensions.emplace(\"VK_KHR_surface\",\n                                 &vulkan_instance->extensions_.ext_KHR_surface);\n#ifdef VK_USE_PLATFORM_XCB_KHR\n    // #6.\n    requested_extensions.emplace(\n        \"VK_KHR_xcb_surface\",\n        &vulkan_instance->extensions_.ext_KHR_xcb_surface);\n#endif\n#ifdef VK_USE_PLATFORM_ANDROID_KHR\n    // #9.\n    requested_extensions.emplace(\n        \"VK_KHR_android_surface\",\n        &vulkan_instance->extensions_.ext_KHR_android_surface);\n#endif\n#ifdef VK_USE_PLATFORM_WIN32_KHR\n    // #10.\n    requested_extensions.emplace(\n        \"VK_KHR_win32_surface\",\n        &vulkan_instance->extensions_.ext_KHR_win32_surface);\n#endif\n  }\n\n  std::vector<const char*> enabled_extensions;\n\n  std::vector<VkExtensionProperties> supported_implementation_extensions;\n  while (true) {\n    uint32_t supported_implementation_extension_count = 0;\n    const VkResult get_supported_implementation_extension_count_result =\n        ifn.vkEnumerateInstanceExtensionProperties(\n            nullptr, &supported_implementation_extension_count, nullptr);\n    if (get_supported_implementation_extension_count_result != VK_SUCCESS &&\n        get_supported_implementation_extension_count_result != VK_INCOMPLETE) {\n      XELOGW(\"Failed to get the Vulkan instance extension count\");\n      return nullptr;\n    }\n    if (supported_implementation_extension_count) {\n      supported_implementation_extensions.resize(\n          supported_implementation_extension_count);\n      const VkResult get_supported_implementation_extensions_result =\n          ifn.vkEnumerateInstanceExtensionProperties(\n              nullptr, &supported_implementation_extension_count,\n              supported_implementation_extensions.data());\n      if (get_supported_implementation_extensions_result == VK_INCOMPLETE) {\n        continue;\n      }\n      if (get_supported_implementation_extensions_result != VK_SUCCESS) {\n        XELOGW(\"Failed to get the Vulkan instance extensions\");\n        return nullptr;\n      }\n    }\n    supported_implementation_extensions.resize(\n        supported_implementation_extension_count);\n    break;\n  }\n\n  for (const VkExtensionProperties& supported_extension :\n       supported_implementation_extensions) {\n    const auto requested_extension_it =\n        requested_extensions.find(supported_extension.extensionName);\n    if (requested_extension_it == requested_extensions.cend()) {\n      continue;\n    }\n    assert_not_null(requested_extension_it->second);\n    if (!*requested_extension_it->second) {\n      enabled_extensions.emplace_back(requested_extension_it->first.c_str());\n      *requested_extension_it->second = true;\n    }\n  }\n\n  // If enabled layers are not present, will disable all extensions provided by\n  // the layers by truncating the enabled extension vector to this size.\n  const size_t enabled_implementation_extension_count =\n      enabled_extensions.size();\n  std::vector<bool*> enabled_layer_extension_enablement_bools;\n\n  // Name pointers from `requested_layers` will be used in the enabled layer\n  // vector.\n  std::unordered_map<std::string, bool*> requested_layers;\n  bool layer_khronos_validation = false;\n  if (try_enable_validation) {\n    requested_layers.emplace(\"VK_LAYER_KHRONOS_validation\",\n                             &layer_khronos_validation);\n  }\n\n  std::vector<const char*> enabled_layers;\n\n  if (!requested_layers.empty()) {\n    std::vector<VkLayerProperties> available_layers;\n    // \"The list of available layers may change at any time due to actions\n    // outside of the Vulkan implementation\"\n    while (true) {\n      available_layers.clear();\n      uint32_t available_layer_count = 0;\n      const VkResult get_available_layer_count_result =\n          ifn.vkEnumerateInstanceLayerProperties(&available_layer_count,\n                                                 nullptr);\n      if (get_available_layer_count_result != VK_SUCCESS &&\n          get_available_layer_count_result != VK_INCOMPLETE) {\n        break;\n      }\n      if (available_layer_count) {\n        available_layers.resize(available_layer_count);\n        const VkResult get_available_layers_result =\n            ifn.vkEnumerateInstanceLayerProperties(&available_layer_count,\n                                                   available_layers.data());\n        if (get_available_layers_result == VK_INCOMPLETE) {\n          // New layers were added.\n          continue;\n        }\n        if (get_available_layers_result != VK_SUCCESS) {\n          available_layers.clear();\n          break;\n        }\n        // In case the second enumeration returned fewer layers.\n        available_layers.resize(available_layer_count);\n      }\n      break;\n    }\n\n    if (!available_layers.empty()) {\n      std::vector<VkExtensionProperties> supported_layer_extensions;\n\n      for (const VkLayerProperties& available_layer : available_layers) {\n        auto requested_layer_it =\n            requested_layers.find(available_layer.layerName);\n        if (requested_layer_it == requested_layers.cend()) {\n          continue;\n        }\n\n        bool got_layer_extensions = true;\n        // \"Because the list of available layers may change externally between\n        // calls to vkEnumerateInstanceExtensionProperties, two calls may\n        // retrieve different results if a pLayerName is available in one call\n        // but not in another.\"\n        while (true) {\n          uint32_t supported_layer_extension_count = 0;\n          const VkResult get_supported_layer_extension_count_result =\n              ifn.vkEnumerateInstanceExtensionProperties(\n                  nullptr, &supported_layer_extension_count, nullptr);\n          if (get_supported_layer_extension_count_result != VK_SUCCESS &&\n              get_supported_layer_extension_count_result != VK_INCOMPLETE) {\n            got_layer_extensions = false;\n            break;\n          }\n          if (supported_layer_extension_count) {\n            supported_layer_extensions.resize(supported_layer_extension_count);\n            const VkResult get_supported_layer_extensions_result =\n                ifn.vkEnumerateInstanceExtensionProperties(\n                    available_layer.layerName, &supported_layer_extension_count,\n                    supported_layer_extensions.data());\n            if (get_supported_layer_extensions_result == VK_INCOMPLETE) {\n              continue;\n            }\n            if (get_supported_layer_extensions_result != VK_SUCCESS) {\n              got_layer_extensions = false;\n              break;\n            }\n          }\n          supported_layer_extensions.resize(supported_layer_extension_count);\n          break;\n        }\n        if (!got_layer_extensions) {\n          // The layer was possibly removed.\n          continue;\n        }\n\n        for (const VkExtensionProperties& supported_extension :\n             supported_layer_extensions) {\n          const auto requested_extension_it =\n              requested_extensions.find(supported_extension.extensionName);\n          if (requested_extension_it == requested_extensions.cend()) {\n            continue;\n          }\n          assert_not_null(requested_extension_it->second);\n          // Don't add the extension to the enabled vector multiple times if\n          // provided by the implementation itself or by another layer.\n          if (!*requested_extension_it->second) {\n            enabled_extensions.emplace_back(\n                requested_extension_it->first.c_str());\n            enabled_layer_extension_enablement_bools.push_back(\n                requested_layer_it->second);\n            *requested_extension_it->second = true;\n          }\n        }\n\n        assert_not_null(requested_layer_it->second);\n        if (!*requested_layer_it->second) {\n          enabled_layers.emplace_back(requested_layer_it->first.c_str());\n          *requested_layer_it->second = true;\n        }\n      }\n    }\n  }\n\n  // Create the instance.\n\n  VkApplicationInfo application_info;\n  application_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;\n  application_info.pNext = nullptr;\n  application_info.pApplicationName = \"Xenia\";\n  application_info.applicationVersion = 1;\n  application_info.pEngineName = nullptr;\n  application_info.engineVersion = 0;\n  // \"The patch version number specified in apiVersion is ignored when creating\n  // an instance object.\"\n  // \"Vulkan 1.0 implementations were required to return\n  // VK_ERROR_INCOMPATIBLE_DRIVER if apiVersion was larger than 1.0.\"\n  application_info.apiVersion =\n      vulkan_instance->api_version_ >= VK_MAKE_API_VERSION(0, 1, 1, 0)\n          ? VulkanDevice::kHighestUsedApiMinorVersion\n          : VK_MAKE_API_VERSION(0, 1, 0, 0);\n\n  VkInstanceCreateInfo instance_create_info;\n  instance_create_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;\n  instance_create_info.pNext = nullptr;\n  instance_create_info.flags = 0;\n  // VK_KHR_get_physical_device_properties2 is needed to get the portability\n  // subset features.\n  if (vulkan_instance->extensions_.ext_KHR_portability_enumeration &&\n      vulkan_instance->extensions_\n          .ext_1_1_KHR_get_physical_device_properties2) {\n    instance_create_info.flags |=\n        VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR;\n  }\n  instance_create_info.pApplicationInfo = &application_info;\n  instance_create_info.enabledLayerCount = uint32_t(enabled_layers.size());\n  instance_create_info.ppEnabledLayerNames = enabled_layers.data();\n  instance_create_info.enabledExtensionCount =\n      uint32_t(enabled_extensions.size());\n  instance_create_info.ppEnabledExtensionNames = enabled_extensions.data();\n  VkResult instance_create_result = ifn.vkCreateInstance(\n      &instance_create_info, nullptr, &vulkan_instance->instance_);\n\n  if (instance_create_result == VK_ERROR_LAYER_NOT_PRESENT ||\n      instance_create_result == VK_ERROR_EXTENSION_NOT_PRESENT) {\n    // A layer was possibly removed. Try without layers.\n    for (bool* const extension_enablement :\n         enabled_layer_extension_enablement_bools) {\n      *extension_enablement = false;\n    }\n    for (const std::pair<std::string, bool*>& requested_layer :\n         requested_layers) {\n      *requested_layer.second = false;\n    }\n    instance_create_info.enabledLayerCount = 0;\n    instance_create_info.enabledExtensionCount =\n        uint32_t(enabled_implementation_extension_count);\n    instance_create_result = ifn.vkCreateInstance(\n        &instance_create_info, nullptr, &vulkan_instance->instance_);\n  }\n\n  if (instance_create_result != VK_SUCCESS) {\n    XELOGE(\"Failed to create a Vulkan instance: {}\",\n           vk::to_string(vk::Result(instance_create_result)));\n    return nullptr;\n  }\n\n  // Load instance functions.\n\n#define XE_UI_VULKAN_FUNCTION(name)                                     \\\n  functions_loaded &= (ifn.name = PFN_##name(ifn.vkGetInstanceProcAddr( \\\n                           vulkan_instance->instance_, #name))) != nullptr;\n\n  // Vulkan 1.0.\n#include \"xenia/ui/vulkan/functions/instance_1_0.inc\"\n\n  // Extensions promoted to a Vulkan version supported by the instance.\n#define XE_UI_VULKAN_FUNCTION_PROMOTED(extension_name, core_name) \\\n  functions_loaded &=                                             \\\n      (ifn.core_name = PFN_##core_name(ifn.vkGetInstanceProcAddr( \\\n           vulkan_instance->instance_, #core_name))) != nullptr;\n  if (vulkan_instance->api_version_ >= VK_MAKE_API_VERSION(0, 1, 1, 0)) {\n#include \"xenia/ui/vulkan/functions/instance_1_1_khr_get_physical_device_properties2.inc\"\n  }\n#undef XE_UI_VULKAN_FUNCTION_PROMOTED\n\n  // Non-promoted extensions, and extensions promoted to a Vulkan version not\n  // supported by the instance.\n#define XE_UI_VULKAN_FUNCTION_PROMOTED(extension_name, core_name) \\\n  functions_loaded &=                                             \\\n      (ifn.core_name = PFN_##core_name(ifn.vkGetInstanceProcAddr( \\\n           vulkan_instance->instance_, #extension_name))) != nullptr;\n  if (vulkan_instance->api_version_ < VK_MAKE_API_VERSION(0, 1, 1, 0)) {\n    if (vulkan_instance->extensions_\n            .ext_1_1_KHR_get_physical_device_properties2) {\n#include \"xenia/ui/vulkan/functions/instance_1_1_khr_get_physical_device_properties2.inc\"\n    }\n  }\n#ifdef VK_USE_PLATFORM_XCB_KHR\n  if (vulkan_instance->extensions_.ext_KHR_xcb_surface) {\n#include \"xenia/ui/vulkan/functions/instance_khr_xcb_surface.inc\"\n  }\n#endif\n#ifdef VK_USE_PLATFORM_ANDROID_KHR\n  if (vulkan_instance->extensions_.ext_KHR_android_surface) {\n#include \"xenia/ui/vulkan/functions/instance_khr_android_surface.inc\"\n  }\n#endif\n#ifdef VK_USE_PLATFORM_WIN32_KHR\n  if (vulkan_instance->extensions_.ext_KHR_win32_surface) {\n#include \"xenia/ui/vulkan/functions/instance_khr_win32_surface.inc\"\n  }\n#endif\n  if (vulkan_instance->extensions_.ext_KHR_surface) {\n#include \"xenia/ui/vulkan/functions/instance_khr_surface.inc\"\n  }\n  if (vulkan_instance->extensions_.ext_EXT_debug_utils) {\n#include \"xenia/ui/vulkan/functions/instance_ext_debug_utils.inc\"\n  }\n#undef XE_UI_VULKAN_FUNCTION_PROMOTED\n\n#undef XE_UI_VULKAN_FUNCTION\n\n  if (!functions_loaded) {\n    XELOGE(\"Failed to get all Vulkan instance function pointers\");\n    return nullptr;\n  }\n\n  // Check whether a surface can be created.\n\n  if (with_surface && !VulkanPresenter::GetSurfaceTypesSupportedByInstance(\n                          vulkan_instance->extensions_)) {\n    XELOGE(\"The Vulkan instance doesn't support surface types used by Xenia\");\n    return nullptr;\n  }\n\n  // Log instance properties.\n\n  XELOGI(\"Vulkan instance API version {}.{}.{}. Enabled layers and extensions:\",\n         VK_VERSION_MAJOR(vulkan_instance->api_version_),\n         VK_VERSION_MINOR(vulkan_instance->api_version_),\n         VK_VERSION_PATCH(vulkan_instance->api_version_));\n  for (uint32_t enabled_layer_index = 0;\n       enabled_layer_index < instance_create_info.enabledLayerCount;\n       ++enabled_layer_index) {\n    XELOGI(\"* {}\",\n           instance_create_info.ppEnabledLayerNames[enabled_layer_index]);\n  }\n  for (uint32_t enabled_extension_index = 0;\n       enabled_extension_index < instance_create_info.enabledExtensionCount;\n       ++enabled_extension_index) {\n    XELOGI(\n        \"* {}\",\n        instance_create_info.ppEnabledExtensionNames[enabled_extension_index]);\n  }\n\n  // Create the debug messenger if requested and available.\n\n  if (vulkan_instance->extensions_.ext_EXT_debug_utils &&\n      cvars::vulkan_log_debug_messages) {\n    VkDebugUtilsMessengerCreateInfoEXT debug_utils_messenger_create_info = {\n        VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT};\n    if (xe::logging::ShouldLog(xe::LogLevel::Debug)) {\n      debug_utils_messenger_create_info.messageSeverity |=\n          VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT;\n    }\n    if (xe::logging::ShouldLog(xe::LogLevel::Info)) {\n      debug_utils_messenger_create_info.messageSeverity |=\n          VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT;\n    }\n    if (xe::logging::ShouldLog(xe::LogLevel::Warning)) {\n      debug_utils_messenger_create_info.messageSeverity |=\n          VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT;\n    }\n    if (xe::logging::ShouldLog(xe::LogLevel::Error)) {\n      debug_utils_messenger_create_info.messageSeverity |=\n          VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT;\n    }\n    // VUID-VkDebugUtilsMessengerCreateInfoEXT-messageSeverity-requiredbitmask:\n    // \"messageSeverity must not be 0\"\n    if (debug_utils_messenger_create_info.messageSeverity) {\n      debug_utils_messenger_create_info.messageType =\n          VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT |\n          VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT |\n          VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT;\n      debug_utils_messenger_create_info.pfnUserCallback =\n          DebugUtilsMessengerCallback;\n      debug_utils_messenger_create_info.pUserData = vulkan_instance.get();\n      const VkResult debug_utils_messenger_create_result =\n          ifn.vkCreateDebugUtilsMessengerEXT(\n              vulkan_instance->instance_, &debug_utils_messenger_create_info,\n              nullptr, &vulkan_instance->debug_utils_messenger_);\n      if (debug_utils_messenger_create_result != VK_SUCCESS) {\n        XELOGW(\"Failed to create the Vulkan debug utils messenger: {}\",\n               vk::to_string(vk::Result(debug_utils_messenger_create_result)));\n      }\n    }\n  }\n\n  return vulkan_instance;\n}\n\nVulkanInstance::~VulkanInstance() {\n  if (instance_) {\n    if (debug_utils_messenger_ != VK_NULL_HANDLE) {\n      functions_.vkDestroyDebugUtilsMessengerEXT(\n          instance_, debug_utils_messenger_, nullptr);\n    }\n\n    functions_.vkDestroyInstance(instance_, nullptr);\n  }\n\n#if XE_PLATFORM_LINUX\n  if (loader_) {\n    dlclose(loader_);\n  }\n#elif XE_PLATFORM_WIN32\n  if (loader_) {\n    FreeLibrary(loader_);\n  }\n#endif\n}\n\nvoid VulkanInstance::EnumeratePhysicalDevices(\n    std::vector<VkPhysicalDevice>& physical_devices_out) const {\n  physical_devices_out.clear();\n  while (true) {\n    uint32_t physical_device_count = 0;\n    const VkResult get_physical_device_count_result =\n        functions_.vkEnumeratePhysicalDevices(instance_, &physical_device_count,\n                                              nullptr);\n    if ((get_physical_device_count_result != VK_SUCCESS &&\n         get_physical_device_count_result != VK_INCOMPLETE) ||\n        !physical_device_count) {\n      return;\n    }\n    physical_devices_out.resize(physical_device_count);\n    const VkResult get_physical_devices_result =\n        functions_.vkEnumeratePhysicalDevices(instance_, &physical_device_count,\n                                              physical_devices_out.data());\n    if (get_physical_devices_result == VK_INCOMPLETE) {\n      continue;\n    }\n    physical_devices_out.resize(\n        get_physical_devices_result == VK_SUCCESS ? physical_device_count : 0);\n    return;\n  }\n}\n\nVkBool32 VulkanInstance::DebugUtilsMessengerCallback(\n    VkDebugUtilsMessageSeverityFlagBitsEXT message_severity,\n    VkDebugUtilsMessageTypeFlagsEXT message_types,\n    const VkDebugUtilsMessengerCallbackDataEXT* callback_data,\n    [[maybe_unused]] void* user_data) {\n  xe::LogLevel log_level;\n  char log_prefix_char;\n  if (message_severity >= VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT) {\n    log_level = xe::LogLevel::Error;\n    log_prefix_char = xe::logging::kPrefixCharError;\n  } else if (message_severity >=\n             VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT) {\n    log_level = xe::LogLevel::Warning;\n    log_prefix_char = xe::logging::kPrefixCharWarning;\n  } else if (message_severity >= VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT) {\n    log_level = xe::LogLevel::Info;\n    log_prefix_char = xe::logging::kPrefixCharInfo;\n  } else {\n    log_level = xe::LogLevel::Debug;\n    log_prefix_char = xe::logging::kPrefixCharDebug;\n  }\n\n  std::ostringstream log_str;\n\n  log_str << \"Vulkan \"\n          << vk::to_string(\n                 vk::DebugUtilsMessageSeverityFlagBitsEXT(message_severity))\n          << \" (\"\n          << vk::to_string(vk::DebugUtilsMessageTypeFlagsEXT(message_types))\n          << \", ID \" << callback_data->messageIdNumber;\n  if (callback_data->pMessageIdName) {\n    log_str << \": \" << callback_data->pMessageIdName;\n  }\n  log_str << ')';\n\n  if (callback_data->pMessage) {\n    log_str << \": \" << callback_data->pMessage;\n  }\n\n  bool annotations_begun = false;\n  const auto begin_annotation = [&log_str, &annotations_begun]() {\n    log_str << (annotations_begun ? \", \" : \" (\");\n    annotations_begun = true;\n  };\n\n  for (uint32_t queue_label_index = 0;\n       queue_label_index < callback_data->queueLabelCount;\n       ++queue_label_index) {\n    begin_annotation();\n    log_str << \"queue label \" << queue_label_index << \": \"\n            << callback_data->pQueueLabels[queue_label_index].pLabelName;\n  }\n\n  for (uint32_t cmd_buf_label_index = 0;\n       cmd_buf_label_index < callback_data->cmdBufLabelCount;\n       ++cmd_buf_label_index) {\n    begin_annotation();\n    log_str << \"command buffer label \" << cmd_buf_label_index << \": \"\n            << callback_data->pCmdBufLabels[cmd_buf_label_index].pLabelName;\n  }\n\n  for (uint32_t object_index = 0; object_index < callback_data->objectCount;\n       ++object_index) {\n    begin_annotation();\n    const VkDebugUtilsObjectNameInfoEXT& object_info =\n        callback_data->pObjects[object_index];\n    // Lowercase hexadecimal digits in the handle to match the default Vulkan\n    // debug utils messenger.\n    log_str << \"object \" << object_index << \": \"\n            << vk::to_string(vk::ObjectType(object_info.objectType)) << \" 0x\"\n            << std::hex << object_info.objectHandle << std::dec;\n    if (object_info.pObjectName) {\n      log_str << \" '\" << object_info.pObjectName << '\\'';\n    }\n  }\n\n  if (annotations_begun) {\n    log_str << ')';\n  }\n\n  xe::logging::AppendLogLine(log_level, log_prefix_char, log_str.str());\n\n  return VK_FALSE;\n}\n\n}  // namespace vulkan\n}  // namespace ui\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/ui/vulkan/vulkan_instance.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2025 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_VULKAN_VULKAN_INSTANCE_H_\n#define XENIA_UI_VULKAN_VULKAN_INSTANCE_H_\n\n#include <memory>\n#include <vector>\n\n#include \"xenia/base/platform.h\"\n#include \"xenia/ui/renderdoc_api.h\"\n#include \"xenia/ui/vulkan/vulkan_api.h\"\n\n#if XE_PLATFORM_WIN32\n#include \"xenia/base/platform_win.h\"\n#endif\n\nnamespace xe {\nnamespace ui {\nnamespace vulkan {\n\nclass VulkanInstance {\n public:\n  static std::unique_ptr<VulkanInstance> Create(bool with_surface,\n                                                bool try_enable_validation);\n\n  VulkanInstance(const VulkanInstance&) = delete;\n  VulkanInstance& operator=(const VulkanInstance&) = delete;\n  VulkanInstance(VulkanInstance&&) = delete;\n  VulkanInstance& operator=(VulkanInstance&&) = delete;\n\n  ~VulkanInstance();\n\n  // nullptr if RenderDoc is not connected.\n  RenderDocAPI* renderdoc_api() const { return renderdoc_api_.get(); }\n\n  struct Functions {\n    // From the loader module.\n    PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr = nullptr;\n    PFN_vkDestroyInstance vkDestroyInstance = nullptr;\n\n    // From vkGetInstanceProcAddr for nullptr.\n    PFN_vkCreateInstance vkCreateInstance = nullptr;\n    PFN_vkEnumerateInstanceExtensionProperties\n        vkEnumerateInstanceExtensionProperties = nullptr;\n    PFN_vkEnumerateInstanceLayerProperties vkEnumerateInstanceLayerProperties =\n        nullptr;\n    // Vulkan 1.1.\n    PFN_vkEnumerateInstanceVersion vkEnumerateInstanceVersion = nullptr;\n\n    // From vkGetInstanceProcAddr for the instance.\n#define XE_UI_VULKAN_FUNCTION(name) PFN_##name name = nullptr;\n#define XE_UI_VULKAN_FUNCTION_PROMOTED(extension_name, core_name) \\\n  PFN_##core_name core_name = nullptr;\n#include \"xenia/ui/vulkan/functions/instance_1_0.inc\"\n    // VK_KHR_surface (#1)\n#include \"xenia/ui/vulkan/functions/instance_khr_surface.inc\"\n    // VK_KHR_xcb_surface (#6)\n#ifdef VK_USE_PLATFORM_XCB_KHR\n#include \"xenia/ui/vulkan/functions/instance_khr_xcb_surface.inc\"\n#endif\n    // VK_KHR_android_surface (#9)\n#ifdef VK_USE_PLATFORM_ANDROID_KHR\n#include \"xenia/ui/vulkan/functions/instance_khr_android_surface.inc\"\n#endif\n    // VK_KHR_win32_surface (#10)\n#ifdef VK_USE_PLATFORM_WIN32_KHR\n#include \"xenia/ui/vulkan/functions/instance_khr_win32_surface.inc\"\n#endif\n    // VK_KHR_get_physical_device_properties2 (#60, promoted to 1.1)\n#include \"xenia/ui/vulkan/functions/instance_1_1_khr_get_physical_device_properties2.inc\"\n    // VK_EXT_debug_utils (#129)\n#include \"xenia/ui/vulkan/functions/instance_ext_debug_utils.inc\"\n#undef XE_UI_VULKAN_FUNCTION_PROMOTED\n#undef XE_UI_VULKAN_FUNCTION\n  };\n\n  const Functions& functions() const { return functions_; }\n\n  uint32_t api_version() const { return api_version_; }\n\n  // Also set to true if the version of the Vulkan API they were promoted to it\n  // supported (with the `ext_major_minor_` prefix rather than `ext_`).\n  struct Extensions {\n    bool ext_KHR_surface = false;  // #1\n#ifdef VK_USE_PLATFORM_XCB_KHR\n    bool ext_KHR_xcb_surface = false;  // #6\n#endif\n#ifdef VK_USE_PLATFORM_ANDROID_KHR\n    bool ext_KHR_android_surface = false;  // #9\n#endif\n#ifdef VK_USE_PLATFORM_WIN32_KHR\n    bool ext_KHR_win32_surface = false;  // #10\n#endif\n    bool ext_1_1_KHR_get_physical_device_properties2 = false;  // #60\n    bool ext_EXT_debug_utils = false;                          // #129\n    bool ext_KHR_portability_enumeration = false;              // #395\n  };\n\n  const Extensions& extensions() const { return extensions_; }\n\n  VkInstance instance() const { return instance_; }\n\n  void EnumeratePhysicalDevices(\n      std::vector<VkPhysicalDevice>& physical_devices_out) const;\n\n private:\n  explicit VulkanInstance() = default;\n\n  std::unique_ptr<RenderDocAPI> renderdoc_api_;\n\n#if XE_PLATFORM_LINUX\n  void* loader_ = nullptr;\n#elif XE_PLATFORM_WIN32\n  HMODULE loader_ = nullptr;\n#endif\n\n  Functions functions_;\n\n  uint32_t api_version_ = VK_MAKE_API_VERSION(0, 1, 0, 0);\n\n  Extensions extensions_;\n\n  VkInstance instance_ = nullptr;\n\n  static VkBool32 DebugUtilsMessengerCallback(\n      VkDebugUtilsMessageSeverityFlagBitsEXT message_severity,\n      VkDebugUtilsMessageTypeFlagsEXT message_types,\n      const VkDebugUtilsMessengerCallbackDataEXT* callback_data,\n      void* user_data);\n\n  VkDebugUtilsMessengerEXT debug_utils_messenger_ = VK_NULL_HANDLE;\n};\n\n}  // namespace vulkan\n}  // namespace ui\n}  // namespace xe\n\n#endif  // XENIA_UI_VULKAN_VULKAN_INSTANCE_H_\n"
  },
  {
    "path": "src/xenia/ui/vulkan/vulkan_mem_alloc.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n// Implementing VMA in this translation unit.\n#define VMA_IMPLEMENTATION\n#include \"xenia/ui/vulkan/vulkan_mem_alloc.h\"\n\n#include <cstring>\n\n#include \"xenia/base/logging.h\"\n\nnamespace xe {\nnamespace ui {\nnamespace vulkan {\n\nVmaAllocator CreateVmaAllocator(const VulkanDevice* const vulkan_device,\n                                const bool externally_synchronized) {\n  assert_not_null(vulkan_device);\n\n  const VulkanInstance* const vulkan_instance =\n      vulkan_device->vulkan_instance();\n  const VulkanInstance::Functions& ifn = vulkan_instance->functions();\n  const VulkanDevice::Functions& dfn = vulkan_device->functions();\n\n  VmaVulkanFunctions vma_vulkan_functions = {};\n  VmaAllocatorCreateInfo allocator_create_info = {};\n\n  vma_vulkan_functions.vkGetInstanceProcAddr = ifn.vkGetInstanceProcAddr;\n  vma_vulkan_functions.vkGetDeviceProcAddr = ifn.vkGetDeviceProcAddr;\n  vma_vulkan_functions.vkGetPhysicalDeviceProperties =\n      ifn.vkGetPhysicalDeviceProperties;\n  vma_vulkan_functions.vkGetPhysicalDeviceMemoryProperties =\n      ifn.vkGetPhysicalDeviceMemoryProperties;\n  vma_vulkan_functions.vkAllocateMemory = dfn.vkAllocateMemory;\n  vma_vulkan_functions.vkFreeMemory = dfn.vkFreeMemory;\n  vma_vulkan_functions.vkMapMemory = dfn.vkMapMemory;\n  vma_vulkan_functions.vkUnmapMemory = dfn.vkUnmapMemory;\n  vma_vulkan_functions.vkFlushMappedMemoryRanges =\n      dfn.vkFlushMappedMemoryRanges;\n  vma_vulkan_functions.vkInvalidateMappedMemoryRanges =\n      dfn.vkInvalidateMappedMemoryRanges;\n  vma_vulkan_functions.vkBindBufferMemory = dfn.vkBindBufferMemory;\n  vma_vulkan_functions.vkBindImageMemory = dfn.vkBindImageMemory;\n  vma_vulkan_functions.vkGetBufferMemoryRequirements =\n      dfn.vkGetBufferMemoryRequirements;\n  vma_vulkan_functions.vkGetImageMemoryRequirements =\n      dfn.vkGetImageMemoryRequirements;\n  vma_vulkan_functions.vkCreateBuffer = dfn.vkCreateBuffer;\n  vma_vulkan_functions.vkDestroyBuffer = dfn.vkDestroyBuffer;\n  vma_vulkan_functions.vkCreateImage = dfn.vkCreateImage;\n  vma_vulkan_functions.vkDestroyImage = dfn.vkDestroyImage;\n  vma_vulkan_functions.vkCmdCopyBuffer = dfn.vkCmdCopyBuffer;\n  if (vulkan_device->extensions().ext_1_1_KHR_get_memory_requirements2) {\n    vma_vulkan_functions.vkGetBufferMemoryRequirements2KHR =\n        dfn.vkGetBufferMemoryRequirements2;\n    vma_vulkan_functions.vkGetImageMemoryRequirements2KHR =\n        dfn.vkGetImageMemoryRequirements2;\n    if (vulkan_device->extensions().ext_1_1_KHR_dedicated_allocation) {\n      allocator_create_info.flags |=\n          VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT;\n    }\n  }\n  if (vulkan_device->extensions().ext_1_1_KHR_bind_memory2) {\n    vma_vulkan_functions.vkBindBufferMemory2KHR = dfn.vkBindBufferMemory2;\n    vma_vulkan_functions.vkBindImageMemory2KHR = dfn.vkBindImageMemory2;\n    allocator_create_info.flags |= VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT;\n  }\n  if (vulkan_instance->extensions()\n          .ext_1_1_KHR_get_physical_device_properties2) {\n    vma_vulkan_functions.vkGetPhysicalDeviceMemoryProperties2KHR =\n        ifn.vkGetPhysicalDeviceMemoryProperties2;\n    if (vulkan_device->extensions().ext_EXT_memory_budget) {\n      allocator_create_info.flags |= VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT;\n    }\n  }\n  if (vulkan_device->extensions().ext_1_3_KHR_maintenance4) {\n    vma_vulkan_functions.vkGetDeviceBufferMemoryRequirements =\n        dfn.vkGetDeviceBufferMemoryRequirements;\n    vma_vulkan_functions.vkGetDeviceImageMemoryRequirements =\n        dfn.vkGetDeviceImageMemoryRequirements;\n  }\n\n  if (externally_synchronized) {\n    allocator_create_info.flags |=\n        VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT;\n  }\n  allocator_create_info.physicalDevice = vulkan_device->physical_device();\n  allocator_create_info.device = vulkan_device->device();\n  allocator_create_info.pVulkanFunctions = &vma_vulkan_functions;\n  allocator_create_info.instance = vulkan_instance->instance();\n  allocator_create_info.vulkanApiVersion =\n      vulkan_device->properties().apiVersion;\n  VmaAllocator allocator;\n  if (vmaCreateAllocator(&allocator_create_info, &allocator) != VK_SUCCESS) {\n    XELOGE(\"Failed to create a Vulkan Memory Allocator instance\");\n    return VK_NULL_HANDLE;\n  }\n  return allocator;\n}\n\n}  // namespace vulkan\n}  // namespace ui\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/ui/vulkan/vulkan_mem_alloc.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_VULKAN_VULKAN_MEM_ALLOC_H_\n#define XENIA_UI_VULKAN_VULKAN_MEM_ALLOC_H_\n\n// Make sure vulkan.h is included from third_party (rather than from the system\n// include directory) before vk_mem_alloc.h.\n\n#include \"xenia/ui/vulkan/vulkan_device.h\"\n\n#define VMA_STATIC_VULKAN_FUNCTIONS 0\n// Work around the pointer nullability completeness warnings on Clang.\n#ifndef VMA_NULLABLE\n#define VMA_NULLABLE\n#endif\n#ifndef VMA_NOT_NULL\n#define VMA_NOT_NULL\n#endif\n#include \"third_party/VulkanMemoryAllocator/include/vk_mem_alloc.h\"\n\nnamespace xe {\nnamespace ui {\nnamespace vulkan {\n\nVmaAllocator CreateVmaAllocator(const VulkanDevice* vulkan_device,\n                                bool externally_synchronized);\n\n}  // namespace vulkan\n}  // namespace ui\n}  // namespace xe\n\n#endif  // XENIA_UI_VULKAN_VULKAN_MEM_ALLOC_H_"
  },
  {
    "path": "src/xenia/ui/vulkan/vulkan_presenter.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/ui/vulkan/vulkan_presenter.h\"\n\n#include <algorithm>\n#include <cstddef>\n#include <cstdint>\n#include <memory>\n#include <utility>\n#include <vector>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/cvar.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/platform.h\"\n#include \"xenia/ui/vulkan/vulkan_util.h\"\n\n#if XE_PLATFORM_ANDROID\n#include \"xenia/ui/surface_android.h\"\n#endif\n#if XE_PLATFORM_GNU_LINUX\n#include \"xenia/ui/surface_gnulinux.h\"\n#endif\n#if XE_PLATFORM_WIN32\n#include \"xenia/ui/surface_win.h\"\n#endif\n\n// Note: If the priorities in the description are changed, update the actual\n// present mode selection logic.\nDEFINE_bool(\n    vulkan_allow_present_mode_immediate, true,\n    \"When available, allow the immediate presentation mode (1st priority), \"\n    \"offering the lowest latency with the possibility of tearing in certain \"\n    \"cases, and, depending on the configuration, variable refresh rate.\",\n    \"Vulkan\");\nDEFINE_bool(\n    vulkan_allow_present_mode_mailbox, true,\n    \"When available, allow the mailbox presentation mode (2nd priority), \"\n    \"offering low latency without the possibility of tearing.\",\n    \"Vulkan\");\nDEFINE_bool(\n    vulkan_allow_present_mode_fifo_relaxed, true,\n    \"When available, allow the relaxed first-in-first-out presentation mode \"\n    \"(3rd priority), which causes waiting for host display vertical sync, but \"\n    \"may present with tearing if frames don't meet the host display refresh \"\n    \"rate.\",\n    \"Vulkan\");\n\nnamespace xe {\nnamespace ui {\nnamespace vulkan {\n\n// Generated with `xb buildshaders`.\nnamespace shaders {\n#include \"xenia/ui/shaders/bytecode/vulkan_spirv/guest_output_bilinear_dither_ps.h\"\n#include \"xenia/ui/shaders/bytecode/vulkan_spirv/guest_output_bilinear_ps.h\"\n#include \"xenia/ui/shaders/bytecode/vulkan_spirv/guest_output_ffx_cas_resample_dither_ps.h\"\n#include \"xenia/ui/shaders/bytecode/vulkan_spirv/guest_output_ffx_cas_resample_ps.h\"\n#include \"xenia/ui/shaders/bytecode/vulkan_spirv/guest_output_ffx_cas_sharpen_dither_ps.h\"\n#include \"xenia/ui/shaders/bytecode/vulkan_spirv/guest_output_ffx_cas_sharpen_ps.h\"\n#include \"xenia/ui/shaders/bytecode/vulkan_spirv/guest_output_ffx_fsr_easu_ps.h\"\n#include \"xenia/ui/shaders/bytecode/vulkan_spirv/guest_output_ffx_fsr_rcas_dither_ps.h\"\n#include \"xenia/ui/shaders/bytecode/vulkan_spirv/guest_output_ffx_fsr_rcas_ps.h\"\n#include \"xenia/ui/shaders/bytecode/vulkan_spirv/guest_output_triangle_strip_rect_vs.h\"\n}  // namespace shaders\n\nVulkanPresenter::PaintContext::Submission::~Submission() {\n  const VulkanDevice::Functions& dfn = vulkan_device_->functions();\n  const VkDevice device = vulkan_device_->device();\n\n  if (draw_command_pool_ != VK_NULL_HANDLE) {\n    dfn.vkDestroyCommandPool(device, draw_command_pool_, nullptr);\n  }\n\n  if (present_semaphore_ != VK_NULL_HANDLE) {\n    dfn.vkDestroySemaphore(device, present_semaphore_, nullptr);\n  }\n  if (acquire_semaphore_ != VK_NULL_HANDLE) {\n    dfn.vkDestroySemaphore(device, acquire_semaphore_, nullptr);\n  }\n}\n\nbool VulkanPresenter::PaintContext::Submission::Initialize() {\n  const VulkanDevice::Functions& dfn = vulkan_device_->functions();\n  const VkDevice device = vulkan_device_->device();\n\n  VkSemaphoreCreateInfo semaphore_create_info;\n  semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;\n  semaphore_create_info.pNext = nullptr;\n  semaphore_create_info.flags = 0;\n  if (dfn.vkCreateSemaphore(device, &semaphore_create_info, nullptr,\n                            &acquire_semaphore_) != VK_SUCCESS) {\n    XELOGE(\n        \"VulkanPresenter: Failed to create a swapchain image acquisition \"\n        \"semaphore\");\n    return false;\n  }\n  if (dfn.vkCreateSemaphore(device, &semaphore_create_info, nullptr,\n                            &present_semaphore_) != VK_SUCCESS) {\n    XELOGE(\n        \"VulkanPresenter: Failed to create a swapchain image presentation \"\n        \"semaphore\");\n    return false;\n  }\n\n  VkCommandPoolCreateInfo command_pool_create_info;\n  command_pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;\n  command_pool_create_info.pNext = nullptr;\n  command_pool_create_info.flags = VK_COMMAND_POOL_CREATE_TRANSIENT_BIT;\n  command_pool_create_info.queueFamilyIndex =\n      vulkan_device_->queue_family_graphics_compute();\n  if (dfn.vkCreateCommandPool(device, &command_pool_create_info, nullptr,\n                              &draw_command_pool_) != VK_SUCCESS) {\n    XELOGE(\n        \"VulkanPresenter: Failed to create a command pool for drawing to a \"\n        \"swapchain\");\n    return false;\n  }\n  VkCommandBufferAllocateInfo command_buffer_allocate_info;\n  command_buffer_allocate_info.sType =\n      VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;\n  command_buffer_allocate_info.pNext = nullptr;\n  command_buffer_allocate_info.commandPool = draw_command_pool_;\n  command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;\n  command_buffer_allocate_info.commandBufferCount = 1;\n  if (dfn.vkAllocateCommandBuffers(device, &command_buffer_allocate_info,\n                                   &draw_command_buffer_) != VK_SUCCESS) {\n    XELOGE(\n        \"VulkanPresenter: Failed to allocate a command buffer for drawing to a \"\n        \"swapchain\");\n    return false;\n  }\n\n  return true;\n}\n\nVulkanPresenter::~VulkanPresenter() {\n  // Destroy the swapchain after its images are not used for drawing anymore.\n  // This is a confusing part in Vulkan, as vkQueuePresentKHR doesn't signal a\n  // fence clearly indicating when it's safe to destroy a swapchain, so we\n  // assume that its lifetime is tracked internally in the WSI. This is also\n  // done before destroying the semaphore awaited by vkQueuePresentKHR, hoping\n  // that it will prevent the destruction during the semaphore wait in\n  // vkQueuePresentKHR execution (or between the vkQueueSubmit semaphore signal\n  // and the vkQueuePresentKHR semaphore wait).\n  // This will await completion of all paint submissions also.\n  paint_context_.DestroySwapchainAndVulkanSurface();\n\n  // Await completion of the usage of everything before destroying anything\n  // (paint submission completion already awaited).\n  // From most likely the latest to most likely the earliest to be signaled, so\n  // just one sleep will likely be needed.\n  ui_completion_timeline_.AwaitAllSubmissions();\n  guest_output_image_refresher_completion_timeline_.AwaitAllSubmissions();\n\n  const VulkanDevice::Functions& dfn = vulkan_device_->functions();\n  const VkDevice device = vulkan_device_->device();\n\n  if (paint_context_.swapchain_render_pass != VK_NULL_HANDLE) {\n    dfn.vkDestroyRenderPass(device, paint_context_.swapchain_render_pass,\n                            nullptr);\n  }\n\n  for (const PaintContext::UISetupCommandBuffer& ui_setup_command_buffer :\n       paint_context_.ui_setup_command_buffers) {\n    dfn.vkDestroyCommandPool(device, ui_setup_command_buffer.command_pool,\n                             nullptr);\n  }\n\n  for (VkFramebuffer& framebuffer :\n       paint_context_.guest_output_intermediate_framebuffers) {\n    util::DestroyAndNullHandle(dfn.vkDestroyFramebuffer, device, framebuffer);\n  }\n  util::DestroyAndNullHandle(dfn.vkDestroyDescriptorPool, device,\n                             paint_context_.guest_output_descriptor_pool);\n  for (PaintContext::GuestOutputPaintPipeline& guest_output_paint_pipeline :\n       paint_context_.guest_output_paint_pipelines) {\n    util::DestroyAndNullHandle(dfn.vkDestroyPipeline, device,\n                               guest_output_paint_pipeline.swapchain_pipeline);\n    util::DestroyAndNullHandle(\n        dfn.vkDestroyPipeline, device,\n        guest_output_paint_pipeline.intermediate_pipeline);\n  }\n\n  util::DestroyAndNullHandle(dfn.vkDestroyRenderPass, device,\n                             guest_output_intermediate_render_pass_);\n  for (VkShaderModule& shader_module : guest_output_paint_fs_) {\n    util::DestroyAndNullHandle(dfn.vkDestroyShaderModule, device,\n                               shader_module);\n  }\n  util::DestroyAndNullHandle(dfn.vkDestroyShaderModule, device,\n                             guest_output_paint_vs_);\n  for (VkPipelineLayout& pipeline_layout :\n       guest_output_paint_pipeline_layouts_) {\n    util::DestroyAndNullHandle(dfn.vkDestroyPipelineLayout, device,\n                               pipeline_layout);\n  }\n  util::DestroyAndNullHandle(dfn.vkDestroyDescriptorSetLayout, device,\n                             guest_output_paint_image_descriptor_set_layout_);\n}\n\nSurface::TypeFlags VulkanPresenter::GetSurfaceTypesSupportedByInstance(\n    const VulkanInstance::Extensions& instance_extensions) {\n  if (!instance_extensions.ext_KHR_surface) {\n    return 0;\n  }\n  Surface::TypeFlags type_flags = 0;\n#if XE_PLATFORM_ANDROID\n  if (instance_extensions.ext_KHR_android_surface) {\n    type_flags |= Surface::kTypeFlag_AndroidNativeWindow;\n  }\n#endif\n#if XE_PLATFORM_GNU_LINUX\n  if (instance_extensions.ext_KHR_xcb_surface) {\n    type_flags |= Surface::kTypeFlag_XcbWindow;\n  }\n#endif\n#if XE_PLATFORM_WIN32\n  if (instance_extensions.ext_KHR_win32_surface) {\n    type_flags |= Surface::kTypeFlag_Win32Hwnd;\n  }\n#endif\n  return type_flags;\n}\n\nSurface::TypeFlags VulkanPresenter::GetSupportedSurfaceTypes() const {\n  if (!vulkan_device_->extensions().ext_KHR_swapchain) {\n    return 0;\n  }\n  return GetSurfaceTypesSupportedByInstance(\n      vulkan_device_->vulkan_instance()->extensions());\n}\n\nbool VulkanPresenter::CaptureGuestOutput(RawImage& image_out) {\n  std::shared_ptr<GuestOutputImage> guest_output_image;\n  {\n    uint32_t guest_output_mailbox_index;\n    std::unique_lock<std::mutex> guest_output_consumer_lock(\n        ConsumeGuestOutput(guest_output_mailbox_index, nullptr, nullptr));\n    if (guest_output_mailbox_index != UINT32_MAX) {\n      assert_true(guest_output_images_[guest_output_mailbox_index]\n                      .ever_successfully_refreshed);\n      guest_output_image =\n          guest_output_images_[guest_output_mailbox_index].image;\n    }\n    // Incremented the reference count of the guest output image - safe to leave\n    // the consumer critical section now.\n  }\n  if (!guest_output_image) {\n    return false;\n  }\n\n  VkExtent2D image_extent = guest_output_image->extent();\n  size_t pixel_count = size_t(image_extent.width) * image_extent.height;\n  VkDeviceSize buffer_size = VkDeviceSize(sizeof(uint32_t) * pixel_count);\n  VkBuffer buffer;\n  VkDeviceMemory buffer_memory;\n  if (!util::CreateDedicatedAllocationBuffer(\n          vulkan_device_, buffer_size, VK_BUFFER_USAGE_TRANSFER_DST_BIT,\n          util::MemoryPurpose::kReadback, buffer, buffer_memory)) {\n    XELOGE(\"VulkanPresenter: Failed to create the guest output capture buffer\");\n    return false;\n  }\n\n  const VulkanDevice::Functions& dfn = vulkan_device_->functions();\n  const VkDevice device = vulkan_device_->device();\n\n  {\n    VkCommandPoolCreateInfo command_pool_create_info;\n    command_pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;\n    command_pool_create_info.pNext = nullptr;\n    command_pool_create_info.flags = VK_COMMAND_POOL_CREATE_TRANSIENT_BIT;\n    command_pool_create_info.queueFamilyIndex =\n        vulkan_device_->queue_family_graphics_compute();\n    VkCommandPool command_pool;\n    if (dfn.vkCreateCommandPool(device, &command_pool_create_info, nullptr,\n                                &command_pool) != VK_SUCCESS) {\n      XELOGE(\n          \"VulkanPresenter: Failed to create the guest output capturing \"\n          \"command pool\");\n      dfn.vkDestroyBuffer(device, buffer, nullptr);\n      dfn.vkFreeMemory(device, buffer_memory, nullptr);\n      return false;\n    }\n\n    VkCommandBufferAllocateInfo command_buffer_allocate_info;\n    command_buffer_allocate_info.sType =\n        VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;\n    command_buffer_allocate_info.pNext = nullptr;\n    command_buffer_allocate_info.commandPool = command_pool;\n    command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;\n    command_buffer_allocate_info.commandBufferCount = 1;\n    VkCommandBuffer command_buffer;\n    if (dfn.vkAllocateCommandBuffers(device, &command_buffer_allocate_info,\n                                     &command_buffer) != VK_SUCCESS) {\n      XELOGE(\n          \"VulkanPresenter: Failed to allocate the guest output capturing \"\n          \"command buffer\");\n      dfn.vkDestroyCommandPool(device, command_pool, nullptr);\n      dfn.vkDestroyBuffer(device, buffer, nullptr);\n      dfn.vkFreeMemory(device, buffer_memory, nullptr);\n      return false;\n    }\n\n    VkCommandBufferBeginInfo command_buffer_begin_info;\n    command_buffer_begin_info.sType =\n        VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;\n    command_buffer_begin_info.pNext = nullptr;\n    command_buffer_begin_info.flags =\n        VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;\n    command_buffer_begin_info.pInheritanceInfo = nullptr;\n    if (dfn.vkBeginCommandBuffer(command_buffer, &command_buffer_begin_info) !=\n        VK_SUCCESS) {\n      XELOGE(\n          \"VulkanPresenter: Failed to begin recording the guest output \"\n          \"capturing command buffer\");\n      dfn.vkDestroyCommandPool(device, command_pool, nullptr);\n      dfn.vkDestroyBuffer(device, buffer, nullptr);\n      dfn.vkFreeMemory(device, buffer_memory, nullptr);\n      return false;\n    }\n\n    VkImageMemoryBarrier image_memory_barrier;\n    image_memory_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;\n    image_memory_barrier.pNext = nullptr;\n    image_memory_barrier.srcAccessMask = kGuestOutputInternalAccessMask;\n    image_memory_barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;\n    image_memory_barrier.oldLayout = kGuestOutputInternalLayout;\n    image_memory_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;\n    image_memory_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;\n    image_memory_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;\n    image_memory_barrier.image = guest_output_image->image();\n    image_memory_barrier.subresourceRange = util::InitializeSubresourceRange();\n    dfn.vkCmdPipelineBarrier(command_buffer, kGuestOutputInternalStageMask,\n                             VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, nullptr, 0,\n                             nullptr, 1, &image_memory_barrier);\n\n    VkBufferImageCopy buffer_image_copy = {};\n    buffer_image_copy.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;\n    buffer_image_copy.imageSubresource.layerCount = 1;\n    buffer_image_copy.imageExtent.width = image_extent.width;\n    buffer_image_copy.imageExtent.height = image_extent.height;\n    buffer_image_copy.imageExtent.depth = 1;\n    dfn.vkCmdCopyImageToBuffer(command_buffer, guest_output_image->image(),\n                               VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, buffer, 1,\n                               &buffer_image_copy);\n\n    // A fence doesn't guarantee host visibility and availability.\n    VkBufferMemoryBarrier buffer_memory_barrier;\n    buffer_memory_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;\n    buffer_memory_barrier.pNext = nullptr;\n    buffer_memory_barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;\n    buffer_memory_barrier.dstAccessMask = VK_ACCESS_HOST_READ_BIT;\n    buffer_memory_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;\n    buffer_memory_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;\n    buffer_memory_barrier.buffer = buffer;\n    buffer_memory_barrier.offset = 0;\n    buffer_memory_barrier.size = VK_WHOLE_SIZE;\n    std::swap(image_memory_barrier.srcAccessMask,\n              image_memory_barrier.dstAccessMask);\n    std::swap(image_memory_barrier.oldLayout, image_memory_barrier.newLayout);\n    dfn.vkCmdPipelineBarrier(\n        command_buffer, VK_PIPELINE_STAGE_TRANSFER_BIT,\n        VK_PIPELINE_STAGE_HOST_BIT | kGuestOutputInternalStageMask, 0, 0,\n        nullptr, 1, &buffer_memory_barrier, 1, &image_memory_barrier);\n\n    if (dfn.vkEndCommandBuffer(command_buffer) != VK_SUCCESS) {\n      XELOGE(\n          \"VulkanPresenter: Failed to end recording the guest output capturing \"\n          \"command buffer\");\n      dfn.vkDestroyCommandPool(device, command_pool, nullptr);\n      dfn.vkDestroyBuffer(device, buffer, nullptr);\n      dfn.vkFreeMemory(device, buffer_memory, nullptr);\n      return false;\n    }\n\n    {\n      VulkanGPUCompletionTimeline completion_timeline(vulkan_device_);\n      VkSubmitInfo submit_info = {VK_STRUCTURE_TYPE_SUBMIT_INFO};\n      submit_info.commandBufferCount = 1;\n      submit_info.pCommandBuffers = &command_buffer;\n      const VkResult submit_result = completion_timeline.AcquireFenceAndSubmit(\n          vulkan_device_->queue_family_graphics_compute(), 0, 1, &submit_info);\n      if (submit_result != VK_SUCCESS) {\n        XELOGE(\n            \"VulkanPresenter: Failed to submit the guest output capturing \"\n            \"command buffer: {}\",\n            vk::to_string(vk::Result(submit_result)));\n        dfn.vkDestroyCommandPool(device, command_pool, nullptr);\n        dfn.vkDestroyBuffer(device, buffer, nullptr);\n        dfn.vkFreeMemory(device, buffer_memory, nullptr);\n        return false;\n      }\n      // Destroying the completion timeline causes the submission to be awaited.\n    }\n\n    dfn.vkDestroyCommandPool(device, command_pool, nullptr);\n  }\n\n  // Don't need the buffer anymore, just its memory.\n  dfn.vkDestroyBuffer(device, buffer, nullptr);\n\n  void* mapping;\n  if (dfn.vkMapMemory(device, buffer_memory, 0, VK_WHOLE_SIZE, 0, &mapping) !=\n      VK_SUCCESS) {\n    XELOGE(\"VulkanPresenter: Failed to map the guest output capture memory\");\n    dfn.vkFreeMemory(device, buffer_memory, nullptr);\n    return false;\n  }\n\n  image_out.width = image_extent.width;\n  image_out.height = image_extent.height;\n  image_out.stride = sizeof(uint32_t) * image_extent.width;\n  image_out.data.resize(size_t(buffer_size));\n  uint32_t* image_out_pixels =\n      reinterpret_cast<uint32_t*>(image_out.data.data());\n  for (size_t i = 0; i < pixel_count; ++i) {\n    image_out_pixels[i] = Packed10bpcRGBTo8bpcBytes(\n        reinterpret_cast<const uint32_t*>(mapping)[i]);\n  }\n\n  // Unmapping will be done by freeing.\n  dfn.vkFreeMemory(device, buffer_memory, nullptr);\n\n  return true;\n}\n\nVkCommandBuffer VulkanPresenter::AcquireUISetupCommandBufferFromUIThread() {\n  if (paint_context_.ui_setup_command_buffer_current_index != SIZE_MAX) {\n    return paint_context_\n        .ui_setup_command_buffers[paint_context_\n                                      .ui_setup_command_buffer_current_index]\n        .command_buffer;\n  }\n\n  const VulkanDevice::Functions& dfn = vulkan_device_->functions();\n  const VkDevice device = vulkan_device_->device();\n\n  VkCommandBufferBeginInfo command_buffer_begin_info;\n  command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;\n  command_buffer_begin_info.pNext = nullptr;\n  command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;\n  command_buffer_begin_info.pInheritanceInfo = nullptr;\n\n  // Try to reuse an existing command buffer.\n  if (!paint_context_.ui_setup_command_buffers.empty()) {\n    const uint64_t submission_index_completed =\n        ui_completion_timeline_.UpdateAndGetCompletedSubmission();\n    for (size_t i = 0; i < paint_context_.ui_setup_command_buffers.size();\n         ++i) {\n      PaintContext::UISetupCommandBuffer& ui_setup_command_buffer =\n          paint_context_.ui_setup_command_buffers[i];\n      if (ui_setup_command_buffer.last_usage_submission_index >\n          submission_index_completed) {\n        continue;\n      }\n      if (dfn.vkResetCommandPool(device, ui_setup_command_buffer.command_pool,\n                                 0) != VK_SUCCESS) {\n        XELOGE(\"VulkanPresenter: Failed to reset a UI setup command pool\");\n        return VK_NULL_HANDLE;\n      }\n      if (dfn.vkBeginCommandBuffer(ui_setup_command_buffer.command_buffer,\n                                   &command_buffer_begin_info) != VK_SUCCESS) {\n        XELOGE(\n            \"VulkanPresenter: Failed to begin UI setup command buffer \"\n            \"recording\");\n        return VK_NULL_HANDLE;\n      }\n      paint_context_.ui_setup_command_buffer_current_index = i;\n      ui_setup_command_buffer.last_usage_submission_index =\n          ui_completion_timeline_.GetUpcomingSubmission();\n      return ui_setup_command_buffer.command_buffer;\n    }\n  }\n\n  // Create a new command buffer.\n  VkCommandPoolCreateInfo command_pool_create_info;\n  command_pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;\n  command_pool_create_info.pNext = nullptr;\n  command_pool_create_info.flags = VK_COMMAND_POOL_CREATE_TRANSIENT_BIT;\n  command_pool_create_info.queueFamilyIndex =\n      vulkan_device_->queue_family_graphics_compute();\n  VkCommandPool new_command_pool;\n  if (dfn.vkCreateCommandPool(device, &command_pool_create_info, nullptr,\n                              &new_command_pool) != VK_SUCCESS) {\n    XELOGE(\"VulkanPresenter: Failed to create a UI setup command pool\");\n    return VK_NULL_HANDLE;\n  }\n  VkCommandBufferAllocateInfo command_buffer_allocate_info;\n  command_buffer_allocate_info.sType =\n      VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;\n  command_buffer_allocate_info.pNext = nullptr;\n  command_buffer_allocate_info.commandPool = new_command_pool;\n  command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;\n  command_buffer_allocate_info.commandBufferCount = 1;\n  VkCommandBuffer new_command_buffer;\n  if (dfn.vkAllocateCommandBuffers(device, &command_buffer_allocate_info,\n                                   &new_command_buffer) != VK_SUCCESS) {\n    XELOGE(\"VulkanPresenter: Failed to allocate a UI setup command buffer\");\n    dfn.vkDestroyCommandPool(device, new_command_pool, nullptr);\n    return VK_NULL_HANDLE;\n  }\n  if (dfn.vkBeginCommandBuffer(new_command_buffer,\n                               &command_buffer_begin_info) != VK_SUCCESS) {\n    XELOGE(\n        \"VulkanPresenter: Failed to begin UI setup command buffer recording\");\n    dfn.vkDestroyCommandPool(device, new_command_pool, nullptr);\n    return VK_NULL_HANDLE;\n  }\n  paint_context_.ui_setup_command_buffer_current_index =\n      paint_context_.ui_setup_command_buffers.size();\n  paint_context_.ui_setup_command_buffers.emplace_back(\n      new_command_pool, new_command_buffer,\n      ui_completion_timeline_.GetUpcomingSubmission());\n  return new_command_buffer;\n}\n\nPresenter::SurfacePaintConnectResult\nVulkanPresenter::ConnectOrReconnectPaintingToSurfaceFromUIThread(\n    Surface& new_surface, uint32_t new_surface_width,\n    uint32_t new_surface_height, bool was_paintable,\n    bool& is_vsync_implicit_out) {\n  const VulkanInstance* const vulkan_instance =\n      vulkan_device_->vulkan_instance();\n  const VulkanInstance::Functions& ifn = vulkan_instance->functions();\n  const VkInstance instance = vulkan_instance->instance();\n  const VulkanDevice::Functions& dfn = vulkan_device_->functions();\n  const VkDevice device = vulkan_device_->device();\n\n  VkFormat new_swapchain_format;\n\n  // ConnectOrReconnectToSurfaceFromUIThread may be called only for the\n  // ui::Surface of the current swapchain or when the old swapchain and\n  // VkSurface have, if the ui::Surface is the same, try using the existing\n  // VkSurface and creating the swapchain smoothly from the existing one - if\n  // this doesn't succeed, start from scratch.\n  // The retirement or destruction of the swapchain here will also cause\n  // awaiting completion of the usage of the swapchain and the surface on the\n  // GPU.\n  if (paint_context_.vulkan_surface != VK_NULL_HANDLE) {\n    VkSwapchainKHR old_swapchain =\n        paint_context_.PrepareForSwapchainRetirement();\n    bool surface_unusable;\n    paint_context_.swapchain = PaintContext::CreateSwapchainForVulkanSurface(\n        vulkan_device_, paint_context_.vulkan_surface, new_surface_width,\n        new_surface_height, old_swapchain, paint_context_.present_queue_family,\n        new_swapchain_format, paint_context_.swapchain_extent,\n        paint_context_.swapchain_is_fifo, surface_unusable);\n    // Destroy the old swapchain that may be retired now.\n    if (old_swapchain != VK_NULL_HANDLE) {\n      dfn.vkDestroySwapchainKHR(device, old_swapchain, nullptr);\n    }\n    if (paint_context_.swapchain == VK_NULL_HANDLE) {\n      // Couldn't create the swapchain for the existing surface - start over.\n      paint_context_.DestroySwapchainAndVulkanSurface();\n    }\n  }\n\n  // If failed to create the swapchain for the previous surface, recreate the\n  // surface and create the new swapchain.\n  if (paint_context_.swapchain == VK_NULL_HANDLE) {\n    // DestroySwapchainAndVulkanSurface should have been called previously.\n    assert_true(paint_context_.vulkan_surface == VK_NULL_HANDLE);\n    Surface::TypeIndex surface_type = new_surface.GetType();\n    // Check if the surface type is supported according to the Vulkan\n    // extensions.\n    if (!(GetSupportedSurfaceTypes() &\n          (Surface::TypeFlags(1) << surface_type))) {\n      XELOGE(\n          \"VulkanPresenter: Tried to create a Vulkan surface for an \"\n          \"unsupported Xenia surface type\");\n      return SurfacePaintConnectResult::kFailureSurfaceUnusable;\n    }\n    VkResult vulkan_surface_create_result = VK_ERROR_UNKNOWN;\n    switch (surface_type) {\n#if XE_PLATFORM_ANDROID\n      case Surface::kTypeIndex_AndroidNativeWindow: {\n        auto& android_native_window_surface =\n            static_cast<const AndroidNativeWindowSurface&>(new_surface);\n        VkAndroidSurfaceCreateInfoKHR surface_create_info;\n        surface_create_info.sType =\n            VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR;\n        surface_create_info.pNext = nullptr;\n        surface_create_info.flags = 0;\n        surface_create_info.window = android_native_window_surface.window();\n        vulkan_surface_create_result = ifn.vkCreateAndroidSurfaceKHR(\n            instance, &surface_create_info, nullptr,\n            &paint_context_.vulkan_surface);\n      } break;\n#endif\n#if XE_PLATFORM_GNU_LINUX\n      case Surface::kTypeIndex_XcbWindow: {\n        auto& xcb_window_surface =\n            static_cast<const XcbWindowSurface&>(new_surface);\n        VkXcbSurfaceCreateInfoKHR surface_create_info;\n        surface_create_info.sType =\n            VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;\n        surface_create_info.pNext = nullptr;\n        surface_create_info.flags = 0;\n        surface_create_info.connection = xcb_window_surface.connection();\n        surface_create_info.window = xcb_window_surface.window();\n        vulkan_surface_create_result =\n            ifn.vkCreateXcbSurfaceKHR(instance, &surface_create_info, nullptr,\n                                      &paint_context_.vulkan_surface);\n      } break;\n#endif\n#if XE_PLATFORM_WIN32\n      case Surface::kTypeIndex_Win32Hwnd: {\n        auto& win32_hwnd_surface =\n            static_cast<const Win32HwndSurface&>(new_surface);\n        VkWin32SurfaceCreateInfoKHR surface_create_info;\n        surface_create_info.sType =\n            VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR;\n        surface_create_info.pNext = nullptr;\n        surface_create_info.flags = 0;\n        surface_create_info.hinstance = win32_hwnd_surface.hinstance();\n        surface_create_info.hwnd = win32_hwnd_surface.hwnd();\n        vulkan_surface_create_result =\n            ifn.vkCreateWin32SurfaceKHR(instance, &surface_create_info, nullptr,\n                                        &paint_context_.vulkan_surface);\n      } break;\n#endif\n      default:\n        assert_unhandled_case(surface_type);\n        XELOGE(\n            \"VulkanPresenter: Tried to create a Vulkan surface for an \"\n            \"unknown Xenia surface type\");\n        return SurfacePaintConnectResult::kFailureSurfaceUnusable;\n    }\n    if (vulkan_surface_create_result != VK_SUCCESS) {\n      XELOGE(\"VulkanPresenter: Failed to create a Vulkan surface\");\n      return SurfacePaintConnectResult::kFailure;\n    }\n    bool surface_unusable;\n    paint_context_.swapchain = PaintContext::CreateSwapchainForVulkanSurface(\n        vulkan_device_, paint_context_.vulkan_surface, new_surface_width,\n        new_surface_height, VK_NULL_HANDLE, paint_context_.present_queue_family,\n        new_swapchain_format, paint_context_.swapchain_extent,\n        paint_context_.swapchain_is_fifo, surface_unusable);\n    if (paint_context_.swapchain == VK_NULL_HANDLE) {\n      // Failed to create the swapchain for the new Vulkan surface - destroy the\n      // Vulkan surface.\n      ifn.vkDestroySurfaceKHR(instance, paint_context_.vulkan_surface, nullptr);\n      paint_context_.vulkan_surface = VK_NULL_HANDLE;\n      return surface_unusable\n                 ? SurfacePaintConnectResult::kFailureSurfaceUnusable\n                 : SurfacePaintConnectResult::kFailure;\n    }\n    // Successfully attached (at least for now).\n  }\n\n  // From now on, in case of failure,\n  // paint_context_.DestroySwapchainAndVulkanSurface must be called before\n  // returning.\n\n  // Update the render pass to the new format.\n  if (paint_context_.swapchain_render_pass_format != new_swapchain_format) {\n    util::DestroyAndNullHandle(dfn.vkDestroyRenderPass, device,\n                               paint_context_.swapchain_render_pass);\n    paint_context_.swapchain_render_pass_format = new_swapchain_format;\n  }\n  if (paint_context_.swapchain_render_pass == VK_NULL_HANDLE) {\n    VkAttachmentDescription render_pass_attachment;\n    render_pass_attachment.flags = 0;\n    render_pass_attachment.format = new_swapchain_format;\n    render_pass_attachment.samples = VK_SAMPLE_COUNT_1_BIT;\n    render_pass_attachment.loadOp = cvars::present_render_pass_clear\n                                        ? VK_ATTACHMENT_LOAD_OP_CLEAR\n                                        : VK_ATTACHMENT_LOAD_OP_DONT_CARE;\n    render_pass_attachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE;\n    render_pass_attachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;\n    render_pass_attachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;\n    render_pass_attachment.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;\n    render_pass_attachment.finalLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;\n    VkAttachmentReference render_pass_color_attachment;\n    render_pass_color_attachment.attachment = 0;\n    render_pass_color_attachment.layout =\n        VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;\n    VkSubpassDescription render_pass_subpass = {};\n    render_pass_subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;\n    render_pass_subpass.colorAttachmentCount = 1;\n    render_pass_subpass.pColorAttachments = &render_pass_color_attachment;\n    VkSubpassDependency render_pass_dependencies[2];\n    render_pass_dependencies[0].srcSubpass = VK_SUBPASS_EXTERNAL;\n    render_pass_dependencies[0].dstSubpass = 0;\n    // srcStageMask is the semaphore wait stage.\n    render_pass_dependencies[0].srcStageMask =\n        VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;\n    render_pass_dependencies[0].dstStageMask =\n        VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;\n    render_pass_dependencies[0].srcAccessMask = VK_ACCESS_MEMORY_READ_BIT;\n    // The main target can be used for UI drawing at any moment, which requires\n    // blending, so VK_ACCESS_COLOR_ATTACHMENT_READ_BIT is also included.\n    render_pass_dependencies[0].dstAccessMask =\n        VK_ACCESS_COLOR_ATTACHMENT_READ_BIT |\n        VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;\n    render_pass_dependencies[0].dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;\n    render_pass_dependencies[1].srcSubpass = 0;\n    render_pass_dependencies[1].dstSubpass = VK_SUBPASS_EXTERNAL;\n    render_pass_dependencies[1].srcStageMask =\n        VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;\n    // Semaphores are signaled at VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT.\n    render_pass_dependencies[1].dstStageMask =\n        VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;\n    render_pass_dependencies[1].srcAccessMask =\n        VK_ACCESS_COLOR_ATTACHMENT_READ_BIT |\n        VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;\n    render_pass_dependencies[1].dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;\n    render_pass_dependencies[1].dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;\n    VkRenderPassCreateInfo render_pass_create_info;\n    render_pass_create_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;\n    render_pass_create_info.pNext = nullptr;\n    render_pass_create_info.flags = 0;\n    render_pass_create_info.attachmentCount = 1;\n    render_pass_create_info.pAttachments = &render_pass_attachment;\n    render_pass_create_info.subpassCount = 1;\n    render_pass_create_info.pSubpasses = &render_pass_subpass;\n    render_pass_create_info.dependencyCount =\n        uint32_t(xe::countof(render_pass_dependencies));\n    render_pass_create_info.pDependencies = render_pass_dependencies;\n    VkRenderPass new_render_pass;\n    if (dfn.vkCreateRenderPass(device, &render_pass_create_info, nullptr,\n                               &new_render_pass) != VK_SUCCESS) {\n      XELOGE(\n          \"VulkanPresenter: Failed to create the render pass for drawing to \"\n          \"swapchain images\");\n      paint_context_.DestroySwapchainAndVulkanSurface();\n      return SurfacePaintConnectResult::kFailure;\n    }\n    paint_context_.swapchain_render_pass = new_render_pass;\n    paint_context_.swapchain_render_pass_format = new_swapchain_format;\n    paint_context_.swapchain_render_pass_clear_load_op =\n        render_pass_attachment.loadOp == VK_ATTACHMENT_LOAD_OP_CLEAR;\n  }\n\n  // Get the swapchain images.\n  paint_context_.swapchain_images.clear();\n  VkResult swapchain_images_get_result;\n  for (;;) {\n    uint32_t swapchain_image_count =\n        uint32_t(paint_context_.swapchain_images.size());\n    bool swapchain_images_were_empty = !swapchain_image_count;\n    swapchain_images_get_result = dfn.vkGetSwapchainImagesKHR(\n        device, paint_context_.swapchain, &swapchain_image_count,\n        swapchain_images_were_empty ? nullptr\n                                    : paint_context_.swapchain_images.data());\n    // If the original swapchain image count was 0 (first call), SUCCESS is\n    // returned, not INCOMPLETE.\n    if (swapchain_images_get_result == VK_SUCCESS ||\n        swapchain_images_get_result == VK_INCOMPLETE) {\n      paint_context_.swapchain_images.resize(swapchain_image_count);\n      if (swapchain_images_get_result == VK_SUCCESS &&\n          (!swapchain_images_were_empty || !swapchain_image_count)) {\n        break;\n      }\n    } else {\n      break;\n    }\n  }\n  if (swapchain_images_get_result != VK_SUCCESS) {\n    XELOGE(\"VulkanPresenter: Failed to get swapchain images\");\n    paint_context_.DestroySwapchainAndVulkanSurface();\n    return SurfacePaintConnectResult::kFailure;\n  }\n\n  // Create the image views and the framebuffers.\n  assert_true(paint_context_.swapchain_framebuffers.empty());\n  paint_context_.swapchain_framebuffers.reserve(\n      paint_context_.swapchain_images.size());\n  VkImageViewCreateInfo image_view_create_info;\n  image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;\n  image_view_create_info.pNext = nullptr;\n  image_view_create_info.flags = 0;\n  image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;\n  image_view_create_info.format = new_swapchain_format;\n  image_view_create_info.components.r = VK_COMPONENT_SWIZZLE_IDENTITY;\n  image_view_create_info.components.g = VK_COMPONENT_SWIZZLE_IDENTITY;\n  image_view_create_info.components.b = VK_COMPONENT_SWIZZLE_IDENTITY;\n  image_view_create_info.components.a = VK_COMPONENT_SWIZZLE_IDENTITY;\n  image_view_create_info.subresourceRange.aspectMask =\n      VK_IMAGE_ASPECT_COLOR_BIT;\n  image_view_create_info.subresourceRange.baseMipLevel = 0;\n  image_view_create_info.subresourceRange.levelCount = 1;\n  image_view_create_info.subresourceRange.baseArrayLayer = 0;\n  image_view_create_info.subresourceRange.layerCount = 1;\n  VkImageView image_view;\n  VkFramebufferCreateInfo framebuffer_create_info;\n  framebuffer_create_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;\n  framebuffer_create_info.pNext = nullptr;\n  framebuffer_create_info.flags = 0;\n  framebuffer_create_info.renderPass = paint_context_.swapchain_render_pass;\n  framebuffer_create_info.attachmentCount = 1;\n  framebuffer_create_info.pAttachments = &image_view;\n  framebuffer_create_info.width = paint_context_.swapchain_extent.width;\n  framebuffer_create_info.height = paint_context_.swapchain_extent.height;\n  framebuffer_create_info.layers = 1;\n  for (VkImage image : paint_context_.swapchain_images) {\n    image_view_create_info.image = image;\n    if (dfn.vkCreateImageView(device, &image_view_create_info, nullptr,\n                              &image_view) != VK_SUCCESS) {\n      XELOGE(\"VulkanPresenter: Failed to create a swapchain image view\");\n      paint_context_.DestroySwapchainAndVulkanSurface();\n      return SurfacePaintConnectResult::kFailure;\n    }\n    VkFramebuffer framebuffer;\n    if (dfn.vkCreateFramebuffer(device, &framebuffer_create_info, nullptr,\n                                &framebuffer) != VK_SUCCESS) {\n      XELOGE(\"VulkanPresenter: Failed to create a swapchain framebuffer\");\n      dfn.vkDestroyImageView(device, image_view, nullptr);\n      paint_context_.DestroySwapchainAndVulkanSurface();\n      return SurfacePaintConnectResult::kFailure;\n    }\n    paint_context_.swapchain_framebuffers.emplace_back(image_view, framebuffer);\n  }\n\n  is_vsync_implicit_out = paint_context_.swapchain_is_fifo;\n  return SurfacePaintConnectResult::kSuccess;\n}\n\nvoid VulkanPresenter::DisconnectPaintingFromSurfaceFromUIThreadImpl() {\n  paint_context_.DestroySwapchainAndVulkanSurface();\n}\n\nbool VulkanPresenter::RefreshGuestOutputImpl(\n    uint32_t mailbox_index, uint32_t frontbuffer_width,\n    uint32_t frontbuffer_height,\n    std::function<bool(GuestOutputRefreshContext& context)> refresher,\n    bool& is_8bpc_out_ref) {\n  assert_not_zero(frontbuffer_width);\n  assert_not_zero(frontbuffer_height);\n  VkExtent2D max_framebuffer_extent =\n      util::GetMax2DFramebufferExtent(vulkan_device_->properties());\n  if (frontbuffer_width > max_framebuffer_extent.width ||\n      frontbuffer_height > max_framebuffer_extent.height) {\n    // Writing the guest output isn't supposed to rescale, and a guest texture\n    // exceeding the maximum size won't be loadable anyway.\n    return false;\n  }\n\n  GuestOutputImageInstance& image_instance =\n      guest_output_images_[mailbox_index];\n  if (image_instance.image &&\n      (image_instance.image->extent().width != frontbuffer_width ||\n       image_instance.image->extent().height != frontbuffer_height)) {\n    guest_output_image_refresher_completion_timeline_\n        .AwaitSubmissionAndUpdateCompleted(\n            image_instance.last_refresher_submission);\n    image_instance.image.reset();\n  }\n  if (!image_instance.image) {\n    std::unique_ptr<GuestOutputImage> new_image = GuestOutputImage::Create(\n        vulkan_device_, frontbuffer_width, frontbuffer_height);\n    if (!new_image) {\n      return false;\n    }\n    image_instance.SetToNewImage(std::move(new_image),\n                                 guest_output_image_next_version_++);\n  }\n\n  VulkanGuestOutputRefreshContext context(\n      is_8bpc_out_ref, image_instance.image->image(),\n      image_instance.image->view(), image_instance.version,\n      image_instance.ever_successfully_refreshed);\n  bool refresher_succeeded = refresher(context);\n  if (refresher_succeeded) {\n    image_instance.ever_successfully_refreshed = true;\n  }\n  // Even if the refresher has returned false, it still might have submitted\n  // some commands referencing the image. It's better to put an excessive\n  // signal and wait slightly longer, for nothing important, while shutting down\n  // than to destroy the image while it's still in use.\n  image_instance.last_refresher_submission =\n      guest_output_image_refresher_completion_timeline_.GetUpcomingSubmission();\n  // No need to make the refresher signal the fence by itself - signal it here\n  // instead to have more control:\n  // \"Fence signal operations that are defined by vkQueueSubmit additionally\n  //  include in the first synchronization scope all commands that occur earlier\n  //  in submission order.\"\n  const VkResult submit_result =\n      guest_output_image_refresher_completion_timeline_.AcquireFenceAndSubmit(\n          vulkan_device_->queue_family_graphics_compute(), 0, 0, nullptr);\n  if (submit_result != VK_SUCCESS) {\n    XELOGE(\n        \"VulkanPresenter: Failed to submit the guest output image refresh \"\n        \"fence signal: {}\",\n        vk::to_string(vk::Result(submit_result)));\n  }\n  return refresher_succeeded;\n}\n\nVkSwapchainKHR VulkanPresenter::PaintContext::CreateSwapchainForVulkanSurface(\n    const VulkanDevice* vulkan_device, VkSurfaceKHR surface, uint32_t width,\n    uint32_t height, VkSwapchainKHR old_swapchain,\n    uint32_t& present_queue_family_out, VkFormat& image_format_out,\n    VkExtent2D& image_extent_out, bool& is_fifo_out,\n    bool& ui_surface_unusable_out) {\n  ui_surface_unusable_out = false;\n\n  const VulkanInstance::Functions& ifn =\n      vulkan_device->vulkan_instance()->functions();\n  const VkPhysicalDevice physical_device = vulkan_device->physical_device();\n  const VulkanDevice::Functions& dfn = vulkan_device->functions();\n  const VkDevice device = vulkan_device->device();\n\n  // Get surface capabilities.\n  VkSurfaceCapabilitiesKHR surface_capabilities;\n  if (ifn.vkGetPhysicalDeviceSurfaceCapabilitiesKHR(\n          physical_device, surface, &surface_capabilities) != VK_SUCCESS) {\n    XELOGE(\"VulkanPresenter: Failed to get Vulkan surface capabilities\");\n    // Some strange error, try again later.\n    return VK_NULL_HANDLE;\n  }\n\n  // First, check if the surface is not zero-area because in this case, the rest\n  // of the fields in theory may not be informative as the surface doesn't need\n  // to go to presentation anyway, thus there's no need to return real\n  // information, and ui_surface_unusable_out (from which it may not be possible\n  // to recover on certain platforms at all) may be set to true spuriously if\n  // any checks set it to true. VkSurfaceKHR may have zero-area bounds in some\n  // window state cases on Windows, for example. Also clamp the requested size\n  // to the maximum supported by the physical device as long as minImageExtent\n  // in the instance's WSI allows that (if not, there's no way to satisfy both\n  // requirements - the maximum 2D framebuffer size on the specific physical\n  // device, and the minimum swap chain size on the whole instance - fail to\n  // create until the surface becomes smaller).\n  VkExtent2D max_framebuffer_extent =\n      util::GetMax2DFramebufferExtent(vulkan_device->properties());\n  VkExtent2D image_extent;\n  image_extent.width =\n      std::min(std::max(std::min(width, max_framebuffer_extent.width),\n                        surface_capabilities.minImageExtent.width),\n               surface_capabilities.maxImageExtent.width);\n  image_extent.height =\n      std::min(std::max(std::min(height, max_framebuffer_extent.height),\n                        surface_capabilities.minImageExtent.height),\n               surface_capabilities.maxImageExtent.height);\n  if (!image_extent.width || !image_extent.height ||\n      image_extent.width > max_framebuffer_extent.width ||\n      image_extent.height > max_framebuffer_extent.height) {\n    return VK_NULL_HANDLE;\n  }\n\n  // Get the queue family for presentation.\n  uint32_t queue_family_index_present = UINT32_MAX;\n  const std::vector<VulkanDevice::QueueFamily>& queue_families =\n      vulkan_device->queue_families();\n  VkBool32 queue_family_present_supported;\n  // First try the graphics and compute queue, prefer it to avoid the concurrent\n  // image sharing mode.\n  uint32_t queue_family_index_graphics_compute =\n      vulkan_device->queue_family_graphics_compute();\n  const VulkanDevice::QueueFamily& queue_family_graphics_compute =\n      queue_families[queue_family_index_graphics_compute];\n  if (queue_family_graphics_compute.may_support_presentation &&\n      !queue_family_graphics_compute.queues.empty() &&\n      ifn.vkGetPhysicalDeviceSurfaceSupportKHR(\n          physical_device, queue_family_index_graphics_compute, surface,\n          &queue_family_present_supported) == VK_SUCCESS &&\n      queue_family_present_supported) {\n    queue_family_index_present = queue_family_index_graphics_compute;\n  } else {\n    for (uint32_t i = 0; i < uint32_t(queue_families.size()); ++i) {\n      const VulkanDevice::QueueFamily& queue_family = queue_families[i];\n      if (!queue_family.queues.empty() &&\n          queue_family.may_support_presentation &&\n          ifn.vkGetPhysicalDeviceSurfaceSupportKHR(\n              physical_device, i, surface, &queue_family_present_supported) ==\n              VK_SUCCESS &&\n          queue_family_present_supported) {\n        queue_family_index_present = i;\n        break;\n      }\n    }\n  }\n  if (queue_family_index_present == UINT32_MAX) {\n    // Not unusable though - may become presentable if the window (with the same\n    // surface) moved to a different display, for instance.\n    return VK_NULL_HANDLE;\n  }\n\n  // TODO(Triang3l): Support transforms.\n  if (!(surface_capabilities.supportedTransforms &\n        (VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR |\n         VK_SURFACE_TRANSFORM_INHERIT_BIT_KHR))) {\n    XELOGE(\n        \"VulkanPresenter: The surface doesn't support identity or \"\n        \"window-system-controlled transform\");\n    return VK_NULL_HANDLE;\n  }\n\n  // Get the surface format.\n  std::vector<VkSurfaceFormatKHR> surface_formats;\n  VkResult surface_formats_get_result;\n  for (;;) {\n    uint32_t surface_format_count = uint32_t(surface_formats.size());\n    bool surface_formats_were_empty = !surface_format_count;\n    surface_formats_get_result = ifn.vkGetPhysicalDeviceSurfaceFormatsKHR(\n        physical_device, surface, &surface_format_count,\n        surface_formats_were_empty ? nullptr : surface_formats.data());\n    // If the original presentation mode count was 0 (first call), SUCCESS is\n    // returned, not INCOMPLETE.\n    if (surface_formats_get_result == VK_SUCCESS ||\n        surface_formats_get_result == VK_INCOMPLETE) {\n      surface_formats.resize(surface_format_count);\n      if (surface_formats_get_result == VK_SUCCESS &&\n          (!surface_formats_were_empty || !surface_format_count)) {\n        break;\n      }\n    } else {\n      break;\n    }\n  }\n  if (surface_formats_get_result != VK_SUCCESS) {\n    // Assuming any format in case of an error (or as some fallback in case of\n    // specification violation).\n    surface_formats.clear();\n  }\n#if XE_PLATFORM_ANDROID\n  // Android uses R8G8B8A8.\n  static const VkFormat kFormat8888Primary = VK_FORMAT_R8G8B8A8_UNORM;\n  static const VkFormat kFormat8888Secondary = VK_FORMAT_B8G8R8A8_UNORM;\n#else\n  // GNU/Linux X11 and Windows DWM use B8G8R8A8.\n  static const VkFormat kFormat8888Primary = VK_FORMAT_B8G8R8A8_UNORM;\n  static const VkFormat kFormat8888Secondary = VK_FORMAT_R8G8B8A8_UNORM;\n#endif\n  VkSurfaceFormatKHR image_format;\n  if (surface_formats.empty() ||\n      (surface_formats.size() == 1 ||\n       surface_formats[0].format == VK_FORMAT_UNDEFINED)) {\n    // Can choose any format if the implementation specifies only UNDEFINED.\n    image_format.format = kFormat8888Primary;\n    image_format.colorSpace = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR;\n  } else {\n    // Pick the sRGB 8888 format preferred by the OS, fall back to any sRGB\n    // 8888, then to 8888 with an unknown color space, and then to the first\n    // sRGB available, and then to the first.\n    auto format_8888_primary_it = surface_formats.cend();\n    auto format_8888_secondary_it = surface_formats.cend();\n    auto any_non_8888_srgb_it = surface_formats.cend();\n    for (auto it = surface_formats.cbegin(); it != surface_formats.cend();\n         ++it) {\n      if (it->format != kFormat8888Primary &&\n          it->format != kFormat8888Secondary) {\n        if (it->colorSpace == VK_COLOR_SPACE_SRGB_NONLINEAR_KHR &&\n            any_non_8888_srgb_it == surface_formats.cend()) {\n          any_non_8888_srgb_it = it;\n        }\n        continue;\n      }\n      auto& preferred_8888_it = it->format == kFormat8888Primary\n                                    ? format_8888_primary_it\n                                    : format_8888_secondary_it;\n      if (preferred_8888_it == surface_formats.cend()) {\n        // First primary or secondary 8888 encounter.\n        preferred_8888_it = it;\n        continue;\n      }\n      // Is this a better primary or secondary 8888, that is, this is sRGB,\n      // while the previous encounter was not?\n      if (it->colorSpace == VK_COLOR_SPACE_SRGB_NONLINEAR_KHR &&\n          preferred_8888_it->colorSpace != VK_COLOR_SPACE_SRGB_NONLINEAR_KHR) {\n        preferred_8888_it = it;\n      }\n    }\n    if (format_8888_primary_it != surface_formats.cend() &&\n        format_8888_secondary_it != surface_formats.cend()) {\n      // Both the primary and the secondary 8888 formats are available - prefer\n      // sRGB, if both are sRGB or not, prefer the primary format.\n      if (format_8888_primary_it->colorSpace ==\n              VK_COLOR_SPACE_SRGB_NONLINEAR_KHR ||\n          format_8888_secondary_it->colorSpace !=\n              VK_COLOR_SPACE_SRGB_NONLINEAR_KHR) {\n        image_format = *format_8888_primary_it;\n      } else {\n        image_format = *format_8888_secondary_it;\n      }\n    } else if (format_8888_primary_it != surface_formats.cend()) {\n      // Only primary 8888.\n      image_format = *format_8888_primary_it;\n    } else if (format_8888_secondary_it != surface_formats.cend()) {\n      // Only secondary 8888.\n      image_format = *format_8888_secondary_it;\n    } else if (any_non_8888_srgb_it != surface_formats.cend()) {\n      // No 8888, but some sRGB format is available.\n      image_format = *any_non_8888_srgb_it;\n    } else {\n      // Just pick any format.\n      image_format = surface_formats.front();\n    }\n  }\n\n  // Get presentation modes.\n  std::vector<VkPresentModeKHR> present_modes;\n  VkResult present_modes_get_result;\n  for (;;) {\n    uint32_t present_mode_count = uint32_t(present_modes.size());\n    bool present_modes_were_empty = !present_mode_count;\n    present_modes_get_result = ifn.vkGetPhysicalDeviceSurfacePresentModesKHR(\n        physical_device, surface, &present_mode_count,\n        present_modes_were_empty ? nullptr : present_modes.data());\n    // If the original presentation mode count was 0 (first call), SUCCESS is\n    // returned, not INCOMPLETE.\n    if (present_modes_get_result == VK_SUCCESS ||\n        present_modes_get_result == VK_INCOMPLETE) {\n      present_modes.resize(present_mode_count);\n      if (present_modes_get_result == VK_SUCCESS &&\n          (!present_modes_were_empty || !present_mode_count)) {\n        break;\n      }\n    } else {\n      break;\n    }\n  }\n  if (present_modes_get_result != VK_SUCCESS) {\n    // Assuming FIFO only (required everywhere) in case of an error.\n    present_modes.clear();\n  }\n\n  // Create the swapchain.\n  VkSwapchainCreateInfoKHR swapchain_create_info;\n  swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;\n  swapchain_create_info.pNext = nullptr;\n  swapchain_create_info.flags = 0;\n  swapchain_create_info.surface = surface;\n  swapchain_create_info.minImageCount =\n      std::max(kSubmissionCount, surface_capabilities.minImageCount);\n  if (surface_capabilities.maxImageCount) {\n    swapchain_create_info.minImageCount =\n        std::min(swapchain_create_info.minImageCount,\n                 surface_capabilities.maxImageCount);\n  }\n  swapchain_create_info.imageFormat = image_format.format;\n  swapchain_create_info.imageColorSpace = image_format.colorSpace;\n  swapchain_create_info.imageExtent = image_extent;\n  swapchain_create_info.imageArrayLayers = 1;\n  swapchain_create_info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;\n  uint32_t swapchain_queue_family_indices[2];\n  if (queue_family_index_graphics_compute != queue_family_index_present) {\n    // Using concurrent sharing mode to avoid an explicit ownership transfer\n    // before presenting, which would require an additional command buffer\n    // submission with the acquire barrier and a semaphore between the graphics\n    // queue and the present queue. Different queues are an extremely rare case,\n    // and Xenia only uses the swapchain for the final guest output and the\n    // internal UI, so keeping framebuffer compression is not worth the\n    // additional submission complexity and possibly latency.\n    swapchain_queue_family_indices[0] = queue_family_index_graphics_compute;\n    swapchain_queue_family_indices[1] = queue_family_index_present;\n    swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;\n    swapchain_create_info.queueFamilyIndexCount = 2;\n    swapchain_create_info.pQueueFamilyIndices = swapchain_queue_family_indices;\n  } else {\n    swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;\n    swapchain_create_info.queueFamilyIndexCount = 0;\n    swapchain_create_info.pQueueFamilyIndices = nullptr;\n  }\n  swapchain_create_info.preTransform =\n      (surface_capabilities.supportedTransforms &\n       VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR)\n          ? VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR\n          : VK_SURFACE_TRANSFORM_INHERIT_BIT_KHR;\n  // Prefer opaque to avoid blending in the window system, or let that be\n  // specified via the window system if it can't be forced. As a last resort,\n  // just pick any - guest output will write alpha of 1 anyway.\n  if (surface_capabilities.supportedCompositeAlpha &\n      VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR) {\n    swapchain_create_info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;\n  } else if (surface_capabilities.supportedCompositeAlpha &\n             VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR) {\n    swapchain_create_info.compositeAlpha = VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR;\n  } else {\n    uint32_t composite_alpha_shift;\n    if (!xe::bit_scan_forward(\n            uint32_t(surface_capabilities.supportedCompositeAlpha),\n            &composite_alpha_shift)) {\n      // Against the Vulkan specification, but breaks the logic here.\n      XELOGE(\n          \"VulkanPresenter: The surface doesn't support any composite alpha \"\n          \"mode\");\n      return VK_NULL_HANDLE;\n    }\n    swapchain_create_info.compositeAlpha =\n        VkCompositeAlphaFlagBitsKHR(uint32_t(1) << composite_alpha_shift);\n  }\n  // As presentation is usually controlled by the GPU command processor, it's\n  // better to use modes that allow as quick acquisition as possible to avoid\n  // interfering with GPU command processing, and also to allow tearing so\n  // variable refresh rate may be used where it's available.\n  // Note: If the priorities here are changes, update the cvar descriptions.\n  if (cvars::vulkan_allow_present_mode_immediate &&\n      std::find(present_modes.cbegin(), present_modes.cend(),\n                VK_PRESENT_MODE_IMMEDIATE_KHR) != present_modes.cend()) {\n    // Allowing tearing to reduce latency, and possibly variable refresh rate\n    // (though on Windows with borderless fullscreen, GDI copying is used\n    // instead of independent flip, so it's not supported there).\n    swapchain_create_info.presentMode = VK_PRESENT_MODE_IMMEDIATE_KHR;\n  } else if (cvars::vulkan_allow_present_mode_mailbox &&\n             std::find(present_modes.cbegin(), present_modes.cend(),\n                       VK_PRESENT_MODE_MAILBOX_KHR) != present_modes.cend()) {\n    // Allowing dropping frames to reduce latency, but no tearing.\n    swapchain_create_info.presentMode = VK_PRESENT_MODE_MAILBOX_KHR;\n  } else if (cvars::vulkan_allow_present_mode_fifo_relaxed &&\n             std::find(present_modes.cbegin(), present_modes.cend(),\n                       VK_PRESENT_MODE_FIFO_RELAXED_KHR) !=\n                 present_modes.cend()) {\n    // Limiting the frame rate, but lets too long frames cause tearing not to\n    // make the latency even worse.\n    swapchain_create_info.presentMode = VK_PRESENT_MODE_FIFO_RELAXED_KHR;\n  } else {\n    // Highest latency (but always guaranteed to be available).\n    swapchain_create_info.presentMode = VK_PRESENT_MODE_FIFO_KHR;\n  }\n  swapchain_create_info.clipped = VK_TRUE;\n  swapchain_create_info.oldSwapchain = old_swapchain;\n  VkSwapchainKHR swapchain;\n  if (dfn.vkCreateSwapchainKHR(device, &swapchain_create_info, nullptr,\n                               &swapchain) != VK_SUCCESS) {\n    XELOGE(\"VulkanPresenter: Failed to create a swapchain\");\n    return VK_NULL_HANDLE;\n  }\n  XELOGI(\n      \"VulkanPresenter: Created {}x{} swapchain with format {}, color space \"\n      \"{}, presentation mode {}\",\n      swapchain_create_info.imageExtent.width,\n      swapchain_create_info.imageExtent.height,\n      uint32_t(swapchain_create_info.imageFormat),\n      uint32_t(swapchain_create_info.imageColorSpace),\n      uint32_t(swapchain_create_info.presentMode));\n\n  present_queue_family_out = queue_family_index_present;\n  image_format_out = swapchain_create_info.imageFormat;\n  image_extent_out = swapchain_create_info.imageExtent;\n  is_fifo_out =\n      swapchain_create_info.presentMode == VK_PRESENT_MODE_FIFO_KHR ||\n      swapchain_create_info.presentMode == VK_PRESENT_MODE_FIFO_RELAXED_KHR;\n  return swapchain;\n}\n\nVkSwapchainKHR VulkanPresenter::PaintContext::PrepareForSwapchainRetirement() {\n  if (swapchain != VK_NULL_HANDLE) {\n    completion_timeline.AwaitAllSubmissions();\n  }\n  const VulkanDevice::Functions& dfn = vulkan_device->functions();\n  const VkDevice device = vulkan_device->device();\n  for (const SwapchainFramebuffer& framebuffer : swapchain_framebuffers) {\n    dfn.vkDestroyFramebuffer(device, framebuffer.framebuffer, nullptr);\n    dfn.vkDestroyImageView(device, framebuffer.image_view, nullptr);\n  }\n  swapchain_framebuffers.clear();\n  swapchain_images.clear();\n  swapchain_extent.width = 0;\n  swapchain_extent.height = 0;\n  // The old swapchain must be destroyed externally.\n  VkSwapchainKHR old_swapchain = swapchain;\n  swapchain = nullptr;\n  return old_swapchain;\n}\n\nvoid VulkanPresenter::PaintContext::DestroySwapchainAndVulkanSurface() {\n  VkSwapchainKHR old_swapchain = PrepareForSwapchainRetirement();\n  if (old_swapchain != VK_NULL_HANDLE) {\n    vulkan_device->functions().vkDestroySwapchainKHR(vulkan_device->device(),\n                                                     old_swapchain, nullptr);\n  }\n  present_queue_family = UINT32_MAX;\n  if (vulkan_surface != VK_NULL_HANDLE) {\n    const VulkanInstance* vulkan_instance = vulkan_device->vulkan_instance();\n    vulkan_instance->functions().vkDestroySurfaceKHR(\n        vulkan_instance->instance(), vulkan_surface, nullptr);\n    vulkan_surface = VK_NULL_HANDLE;\n  }\n}\n\nVulkanPresenter::GuestOutputImage::~GuestOutputImage() {\n  const VulkanDevice::Functions& dfn = vulkan_device_->functions();\n  const VkDevice device = vulkan_device_->device();\n  if (view_ != VK_NULL_HANDLE) {\n    dfn.vkDestroyImageView(device, view_, nullptr);\n  }\n  if (image_ != VK_NULL_HANDLE) {\n    dfn.vkDestroyImage(device, image_, nullptr);\n  }\n  if (memory_ != VK_NULL_HANDLE) {\n    dfn.vkFreeMemory(device, memory_, nullptr);\n  }\n}\n\nbool VulkanPresenter::GuestOutputImage::Initialize() {\n  VkImageCreateInfo image_create_info;\n  image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;\n  image_create_info.pNext = nullptr;\n  image_create_info.flags = 0;\n  image_create_info.imageType = VK_IMAGE_TYPE_2D;\n  image_create_info.format = kGuestOutputFormat;\n  image_create_info.extent.width = extent_.width;\n  image_create_info.extent.height = extent_.height;\n  image_create_info.extent.depth = 1;\n  image_create_info.mipLevels = 1;\n  image_create_info.arrayLayers = 1;\n  image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;\n  image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;\n  image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT |\n                            VK_IMAGE_USAGE_SAMPLED_BIT |\n                            VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;\n  image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;\n  image_create_info.queueFamilyIndexCount = 0;\n  image_create_info.pQueueFamilyIndices = nullptr;\n  image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;\n  if (!ui::vulkan::util::CreateDedicatedAllocationImage(\n          vulkan_device_, image_create_info,\n          ui::vulkan::util::MemoryPurpose::kDeviceLocal, image_, memory_)) {\n    XELOGE(\"VulkanPresenter: Failed to create a guest output image\");\n    return false;\n  }\n\n  const VulkanDevice::Functions& dfn = vulkan_device_->functions();\n  const VkDevice device = vulkan_device_->device();\n\n  VkImageViewCreateInfo image_view_create_info;\n  image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;\n  image_view_create_info.pNext = nullptr;\n  image_view_create_info.flags = 0;\n  image_view_create_info.image = image_;\n  image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;\n  image_view_create_info.format = kGuestOutputFormat;\n  image_view_create_info.components.r = VK_COMPONENT_SWIZZLE_IDENTITY;\n  image_view_create_info.components.g = VK_COMPONENT_SWIZZLE_IDENTITY;\n  image_view_create_info.components.b = VK_COMPONENT_SWIZZLE_IDENTITY;\n  image_view_create_info.components.a = VK_COMPONENT_SWIZZLE_IDENTITY;\n  image_view_create_info.subresourceRange.aspectMask =\n      VK_IMAGE_ASPECT_COLOR_BIT;\n  image_view_create_info.subresourceRange.baseMipLevel = 0;\n  image_view_create_info.subresourceRange.levelCount = 1;\n  image_view_create_info.subresourceRange.baseArrayLayer = 0;\n  image_view_create_info.subresourceRange.layerCount = 1;\n  if (dfn.vkCreateImageView(device, &image_view_create_info, nullptr, &view_) !=\n      VK_SUCCESS) {\n    XELOGE(\"VulkanPresenter: Failed to create a guest output image view\");\n    return false;\n  }\n\n  return true;\n}\n\nPresenter::PaintResult VulkanPresenter::PaintAndPresentImpl(\n    bool execute_ui_drawers) {\n  // Begin the submission in place of the one not currently potentially used on\n  // the GPU.\n  const uint64_t current_paint_submission_index =\n      paint_context_.completion_timeline.GetUpcomingSubmission();\n  uint64_t paint_submission_count = uint64_t(paint_context_.submissions.size());\n  paint_context_.completion_timeline\n      .AwaitMaxSubmissionsPendingAndUpdateCompleted(paint_submission_count);\n  const PaintContext::Submission& paint_submission =\n      *paint_context_.submissions[current_paint_submission_index %\n                                  paint_submission_count];\n\n  const VulkanDevice::Functions& dfn = vulkan_device_->functions();\n  const VkDevice device = vulkan_device_->device();\n\n  VkCommandPool draw_command_pool = paint_submission.draw_command_pool();\n  if (dfn.vkResetCommandPool(device, draw_command_pool, 0) != VK_SUCCESS) {\n    XELOGE(\n        \"VulkanPresenter: Failed to reset a command buffer for drawing to the \"\n        \"swapchain\");\n    return PaintResult::kNotPresented;\n  }\n\n  VkCommandBuffer draw_command_buffer = paint_submission.draw_command_buffer();\n  VkCommandBufferBeginInfo command_buffer_begin_info;\n  command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;\n  command_buffer_begin_info.pNext = nullptr;\n  command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;\n  command_buffer_begin_info.pInheritanceInfo = nullptr;\n  if (dfn.vkBeginCommandBuffer(draw_command_buffer,\n                               &command_buffer_begin_info) != VK_SUCCESS) {\n    XELOGE(\n        \"VulkanPresenter: Failed to being recording the command buffer for \"\n        \"drawing to the swapchain\");\n    return PaintResult::kNotPresented;\n  }\n  // vkResetCommandPool resets from both initial and recording states, still\n  // safe to return early from this function in case of an error.\n\n  VkSemaphore acquire_semaphore = paint_submission.acquire_semaphore();\n  uint32_t swapchain_image_index;\n  VkResult acquire_result = dfn.vkAcquireNextImageKHR(\n      device, paint_context_.swapchain, UINT64_MAX, acquire_semaphore,\n      VK_NULL_HANDLE, &swapchain_image_index);\n  switch (acquire_result) {\n    case VK_SUCCESS:\n    case VK_SUBOPTIMAL_KHR:\n      break;\n    case VK_ERROR_DEVICE_LOST:\n      XELOGE(\n          \"VulkanPresenter: Failed to acquire the swapchain image as the \"\n          \"device has been lost\");\n      return PaintResult::kGpuLostResponsible;\n    case VK_ERROR_OUT_OF_DATE_KHR:\n    case VK_ERROR_SURFACE_LOST_KHR:\n    case VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT:\n      // Not an error, reporting just as info (may normally occur while resizing\n      // on some platforms).\n      XELOGI(\n          \"VulkanPresenter: Presentation to the swapchain image has been \"\n          \"dropped as the swapchain or the surface has become outdated\");\n      return PaintResult::kNotPresentedConnectionOutdated;\n    default:\n      XELOGE(\"VulkanPresenter: Failed to acquire the swapchain image\");\n      return PaintResult::kNotPresented;\n  }\n\n  // Non-zero extents needed for both the viewport (width must not be zero) and\n  // the guest output rectangle.\n  assert_not_zero(paint_context_.swapchain_extent.width);\n  assert_not_zero(paint_context_.swapchain_extent.height);\n\n  bool swapchain_image_clear_needed = true;\n  VkClearAttachment swapchain_image_clear_attachment;\n  swapchain_image_clear_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;\n  swapchain_image_clear_attachment.colorAttachment = 0;\n  swapchain_image_clear_attachment.clearValue.color.float32[0] = 0.0f;\n  swapchain_image_clear_attachment.clearValue.color.float32[1] = 0.0f;\n  swapchain_image_clear_attachment.clearValue.color.float32[2] = 0.0f;\n  swapchain_image_clear_attachment.clearValue.color.float32[3] = 1.0f;\n\n  VkRenderPassBeginInfo swapchain_render_pass_begin_info;\n  swapchain_render_pass_begin_info.sType =\n      VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;\n  swapchain_render_pass_begin_info.pNext = nullptr;\n  swapchain_render_pass_begin_info.renderPass =\n      paint_context_.swapchain_render_pass;\n  swapchain_render_pass_begin_info.framebuffer =\n      paint_context_.swapchain_framebuffers[swapchain_image_index].framebuffer;\n  swapchain_render_pass_begin_info.renderArea.offset.x = 0;\n  swapchain_render_pass_begin_info.renderArea.offset.y = 0;\n  swapchain_render_pass_begin_info.renderArea.extent =\n      paint_context_.swapchain_extent;\n  swapchain_render_pass_begin_info.clearValueCount = 0;\n  swapchain_render_pass_begin_info.pClearValues = nullptr;\n  if (paint_context_.swapchain_render_pass_clear_load_op) {\n    swapchain_render_pass_begin_info.clearValueCount = 1;\n    swapchain_render_pass_begin_info.pClearValues =\n        &swapchain_image_clear_attachment.clearValue;\n    swapchain_image_clear_needed = false;\n  }\n\n  bool swapchain_image_pass_begun = false;\n\n  GuestOutputProperties guest_output_properties;\n  GuestOutputPaintConfig guest_output_paint_config;\n  std::shared_ptr<GuestOutputImage> guest_output_image;\n  {\n    uint32_t guest_output_mailbox_index;\n    std::unique_lock<std::mutex> guest_output_consumer_lock(\n        ConsumeGuestOutput(guest_output_mailbox_index, &guest_output_properties,\n                           &guest_output_paint_config));\n    if (guest_output_mailbox_index != UINT32_MAX) {\n      assert_true(guest_output_images_[guest_output_mailbox_index]\n                      .ever_successfully_refreshed);\n      guest_output_image =\n          guest_output_images_[guest_output_mailbox_index].image;\n    }\n    // Incremented the reference count of the guest output image - safe to leave\n    // the consumer critical section now as everything here either will be using\n    // the new reference or is exclusively owned by main target painting (and\n    // multiple threads can't paint the main target at the same time).\n  }\n\n  if (guest_output_image) {\n    VkExtent2D max_framebuffer_extent =\n        util::GetMax2DFramebufferExtent(vulkan_device_->properties());\n    GuestOutputPaintFlow guest_output_flow = GetGuestOutputPaintFlow(\n        guest_output_properties, paint_context_.swapchain_extent.width,\n        paint_context_.swapchain_extent.height, max_framebuffer_extent.width,\n        max_framebuffer_extent.height, guest_output_paint_config);\n    if (guest_output_flow.effect_count) {\n      // Store the main target reference to the guest output image so it's not\n      // destroyed while it's still potentially in use by main target painting\n      // queued on the GPU.\n      size_t guest_output_image_paint_ref_index = SIZE_MAX;\n      size_t guest_output_image_paint_ref_new_index = SIZE_MAX;\n      // Try to find the existing reference to the same image, or an already\n      // released (or a taken, but never actually used) slot.\n      for (size_t i = 0;\n           i < paint_context_.guest_output_image_paint_refs.size(); ++i) {\n        const std::pair<uint64_t, std::shared_ptr<GuestOutputImage>>&\n            guest_output_image_paint_ref =\n                paint_context_.guest_output_image_paint_refs[i];\n        if (guest_output_image_paint_ref.second == guest_output_image) {\n          guest_output_image_paint_ref_index = i;\n          break;\n        }\n        if (guest_output_image_paint_ref_new_index == SIZE_MAX &&\n            (!guest_output_image_paint_ref.second ||\n             !guest_output_image_paint_ref.first)) {\n          guest_output_image_paint_ref_new_index = i;\n        }\n      }\n      if (guest_output_image_paint_ref_index == SIZE_MAX) {\n        // New image - store the reference and create the descriptors.\n        if (guest_output_image_paint_ref_new_index == SIZE_MAX) {\n          // Replace the earliest used reference.\n          guest_output_image_paint_ref_new_index = 0;\n          for (size_t i = 1;\n               i < paint_context_.guest_output_image_paint_refs.size(); ++i) {\n            if (paint_context_.guest_output_image_paint_refs[i].first <\n                paint_context_\n                    .guest_output_image_paint_refs\n                        [guest_output_image_paint_ref_new_index]\n                    .first) {\n              guest_output_image_paint_ref_new_index = i;\n            }\n          }\n          // Await the completion of the usage of the old guest output image and\n          // its descriptors.\n          paint_context_.completion_timeline.AwaitSubmissionAndUpdateCompleted(\n              paint_context_\n                  .guest_output_image_paint_refs\n                      [guest_output_image_paint_ref_new_index]\n                  .first);\n        }\n        guest_output_image_paint_ref_index =\n            guest_output_image_paint_ref_new_index;\n        // The actual submission index will be set if the image is actually\n        // used, not dropped due to some error.\n        paint_context_\n            .guest_output_image_paint_refs[guest_output_image_paint_ref_index] =\n            std::make_pair(uint64_t(0), guest_output_image);\n        // Create the descriptors of the new image.\n        VkDescriptorImageInfo guest_output_image_descriptor_image_info;\n        guest_output_image_descriptor_image_info.sampler = VK_NULL_HANDLE;\n        guest_output_image_descriptor_image_info.imageView =\n            guest_output_image->view();\n        guest_output_image_descriptor_image_info.imageLayout =\n            VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;\n        VkWriteDescriptorSet guest_output_image_descriptor_write;\n        guest_output_image_descriptor_write.sType =\n            VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;\n        guest_output_image_descriptor_write.pNext = nullptr;\n        guest_output_image_descriptor_write.dstSet =\n            paint_context_.guest_output_descriptor_sets\n                [PaintContext::kGuestOutputDescriptorSetGuestOutput0Sampled +\n                 guest_output_image_paint_ref_index];\n        guest_output_image_descriptor_write.dstBinding = 0;\n        guest_output_image_descriptor_write.dstArrayElement = 0;\n        guest_output_image_descriptor_write.descriptorCount = 1;\n        guest_output_image_descriptor_write.descriptorType =\n            VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;\n        guest_output_image_descriptor_write.pImageInfo =\n            &guest_output_image_descriptor_image_info;\n        guest_output_image_descriptor_write.pBufferInfo = nullptr;\n        guest_output_image_descriptor_write.pTexelBufferView = nullptr;\n        dfn.vkUpdateDescriptorSets(\n            device, 1, &guest_output_image_descriptor_write, 0, nullptr);\n      }\n\n      // Make sure intermediate textures of the needed size are available, and\n      // unneeded intermediate textures are destroyed.\n      for (size_t i = 0; i < kMaxGuestOutputPaintEffects - 1; ++i) {\n        std::pair<uint32_t, uint32_t> intermediate_needed_size(0, 0);\n        if (i + 1 < guest_output_flow.effect_count) {\n          intermediate_needed_size = guest_output_flow.effect_output_sizes[i];\n        }\n        std::unique_ptr<GuestOutputImage>& intermediate_image_ptr_ref =\n            paint_context_.guest_output_intermediate_images[i];\n        VkExtent2D intermediate_current_extent(\n            intermediate_image_ptr_ref ? intermediate_image_ptr_ref->extent()\n                                       : VkExtent2D{});\n        if (intermediate_current_extent.width !=\n                intermediate_needed_size.first ||\n            intermediate_current_extent.height !=\n                intermediate_needed_size.second) {\n          if (intermediate_needed_size.first &&\n              intermediate_needed_size.second) {\n            // Need to replace immediately as a new image with the requested\n            // size is needed.\n            if (intermediate_image_ptr_ref) {\n              paint_context_.completion_timeline\n                  .AwaitSubmissionAndUpdateCompleted(\n                      paint_context_\n                          .guest_output_intermediate_image_last_submission);\n              intermediate_image_ptr_ref.reset();\n              util::DestroyAndNullHandle(\n                  dfn.vkDestroyFramebuffer, device,\n                  paint_context_.guest_output_intermediate_framebuffers[i]);\n            }\n            // Image.\n            intermediate_image_ptr_ref = GuestOutputImage::Create(\n                vulkan_device_, intermediate_needed_size.first,\n                intermediate_needed_size.second);\n            if (!intermediate_image_ptr_ref) {\n              // Don't display the guest output, and don't try to create more\n              // intermediate textures (only destroy them).\n              guest_output_flow.effect_count = 0;\n              continue;\n            }\n            // Framebuffer.\n            VkImageView intermediate_framebuffer_attachment =\n                intermediate_image_ptr_ref->view();\n            VkFramebufferCreateInfo intermediate_framebuffer_create_info;\n            intermediate_framebuffer_create_info.sType =\n                VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;\n            intermediate_framebuffer_create_info.pNext = nullptr;\n            intermediate_framebuffer_create_info.flags = 0;\n            intermediate_framebuffer_create_info.renderPass =\n                guest_output_intermediate_render_pass_;\n            intermediate_framebuffer_create_info.attachmentCount = 1;\n            intermediate_framebuffer_create_info.pAttachments =\n                &intermediate_framebuffer_attachment;\n            intermediate_framebuffer_create_info.width =\n                intermediate_needed_size.first;\n            intermediate_framebuffer_create_info.height =\n                intermediate_needed_size.second;\n            intermediate_framebuffer_create_info.layers = 1;\n            if (dfn.vkCreateFramebuffer(\n                    device, &intermediate_framebuffer_create_info, nullptr,\n                    &paint_context_\n                         .guest_output_intermediate_framebuffers[i]) !=\n                VK_SUCCESS) {\n              XELOGE(\n                  \"VulkanPresenter: Failed to create a guest output \"\n                  \"intermediate framebuffer\");\n              // Don't display the guest output, and don't try to create more\n              // intermediate textures (only destroy them).\n              guest_output_flow.effect_count = 0;\n              continue;\n            }\n            // Descriptors.\n            VkDescriptorImageInfo intermediate_descriptor_image_info;\n            intermediate_descriptor_image_info.sampler = VK_NULL_HANDLE;\n            intermediate_descriptor_image_info.imageView =\n                intermediate_image_ptr_ref->view();\n            intermediate_descriptor_image_info.imageLayout =\n                VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;\n            VkWriteDescriptorSet intermediate_descriptor_write;\n            intermediate_descriptor_write.sType =\n                VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;\n            intermediate_descriptor_write.pNext = nullptr;\n            intermediate_descriptor_write.dstSet =\n                paint_context_.guest_output_descriptor_sets\n                    [PaintContext ::\n                         kGuestOutputDescriptorSetIntermediate0Sampled +\n                     i];\n            intermediate_descriptor_write.dstBinding = 0;\n            intermediate_descriptor_write.dstArrayElement = 0;\n            intermediate_descriptor_write.descriptorCount = 1;\n            intermediate_descriptor_write.descriptorType =\n                VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;\n            intermediate_descriptor_write.pImageInfo =\n                &intermediate_descriptor_image_info;\n            intermediate_descriptor_write.pBufferInfo = nullptr;\n            intermediate_descriptor_write.pTexelBufferView = nullptr;\n            dfn.vkUpdateDescriptorSets(\n                device, 1, &intermediate_descriptor_write, 0, nullptr);\n          } else {\n            // Was previously needed, but not anymore - destroy when possible.\n            if (intermediate_image_ptr_ref &&\n                paint_context_.completion_timeline\n                        .UpdateAndGetCompletedSubmission() >=\n                    paint_context_\n                        .guest_output_intermediate_image_last_submission) {\n              intermediate_image_ptr_ref.reset();\n              util::DestroyAndNullHandle(\n                  dfn.vkDestroyFramebuffer, device,\n                  paint_context_.guest_output_intermediate_framebuffers[i]);\n            }\n          }\n        }\n      }\n\n      if (guest_output_flow.effect_count) {\n        // Check if all the intermediate effects are supported by the\n        // implementation.\n        for (size_t i = 0; i + 1 < guest_output_flow.effect_count; ++i) {\n          if (paint_context_\n                  .guest_output_paint_pipelines[size_t(\n                      guest_output_flow.effects[i])]\n                  .intermediate_pipeline == VK_NULL_HANDLE) {\n            guest_output_flow.effect_count = 0;\n            break;\n          }\n        }\n        // Ensure the pipeline exists for the final effect drawing to the\n        // swapchain, for the render pass with the up-to-date image format.\n        GuestOutputPaintEffect swapchain_effect =\n            guest_output_flow.effects[guest_output_flow.effect_count - 1];\n        PaintContext::GuestOutputPaintPipeline& swapchain_effect_pipeline =\n            paint_context_\n                .guest_output_paint_pipelines[size_t(swapchain_effect)];\n        if (swapchain_effect_pipeline.swapchain_pipeline != VK_NULL_HANDLE &&\n            swapchain_effect_pipeline.swapchain_format !=\n                paint_context_.swapchain_render_pass_format) {\n          paint_context_.completion_timeline.AwaitSubmissionAndUpdateCompleted(\n              paint_context_.guest_output_image_paint_last_submission);\n          util::DestroyAndNullHandle(\n              dfn.vkDestroyPipeline, device,\n              swapchain_effect_pipeline.swapchain_pipeline);\n        }\n        if (swapchain_effect_pipeline.swapchain_pipeline == VK_NULL_HANDLE) {\n          assert_true(CanGuestOutputPaintEffectBeFinal(swapchain_effect));\n          assert_true(guest_output_paint_fs_[size_t(swapchain_effect)] !=\n                      VK_NULL_HANDLE);\n          swapchain_effect_pipeline.swapchain_pipeline =\n              CreateGuestOutputPaintPipeline(\n                  swapchain_effect, paint_context_.swapchain_render_pass);\n          if (swapchain_effect_pipeline.swapchain_pipeline == VK_NULL_HANDLE) {\n            guest_output_flow.effect_count = 0;\n          }\n        }\n      }\n\n      if (guest_output_flow.effect_count) {\n        // Actually draw the guest output.\n        paint_context_\n            .guest_output_image_paint_refs[guest_output_image_paint_ref_index]\n            .first = current_paint_submission_index;\n        paint_context_.guest_output_image_paint_last_submission =\n            current_paint_submission_index;\n        VkViewport guest_output_viewport;\n        guest_output_viewport.x = 0.0f;\n        guest_output_viewport.y = 0.0f;\n        guest_output_viewport.minDepth = 0.0f;\n        guest_output_viewport.maxDepth = 1.0f;\n        VkRect2D guest_output_scissor;\n        guest_output_scissor.offset.x = 0;\n        guest_output_scissor.offset.y = 0;\n        if (guest_output_flow.effect_count > 1) {\n          paint_context_.guest_output_intermediate_image_last_submission =\n              current_paint_submission_index;\n        }\n        for (size_t i = 0; i < guest_output_flow.effect_count; ++i) {\n          bool is_final_effect = i + 1 >= guest_output_flow.effect_count;\n\n          int32_t effect_rect_x, effect_rect_y;\n          std::pair<uint32_t, uint32_t> effect_rect_size =\n              guest_output_flow.effect_output_sizes[i];\n          if (is_final_effect) {\n            effect_rect_x = guest_output_flow.output_x;\n            effect_rect_y = guest_output_flow.output_y;\n            dfn.vkCmdBeginRenderPass(draw_command_buffer,\n                                     &swapchain_render_pass_begin_info,\n                                     VK_SUBPASS_CONTENTS_INLINE);\n            swapchain_image_pass_begun = true;\n            guest_output_viewport.width =\n                float(paint_context_.swapchain_extent.width);\n            guest_output_viewport.height =\n                float(paint_context_.swapchain_extent.height);\n            guest_output_scissor.extent.width =\n                paint_context_.swapchain_extent.width;\n            guest_output_scissor.extent.height =\n                paint_context_.swapchain_extent.height;\n          } else {\n            effect_rect_x = 0;\n            effect_rect_y = 0;\n            VkRenderPassBeginInfo intermediate_render_pass_begin_info;\n            intermediate_render_pass_begin_info.sType =\n                VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;\n            intermediate_render_pass_begin_info.pNext = nullptr;\n            intermediate_render_pass_begin_info.renderPass =\n                guest_output_intermediate_render_pass_;\n            intermediate_render_pass_begin_info.framebuffer =\n                paint_context_.guest_output_intermediate_framebuffers[i];\n            intermediate_render_pass_begin_info.renderArea.offset.x = 0;\n            intermediate_render_pass_begin_info.renderArea.offset.y = 0;\n            intermediate_render_pass_begin_info.renderArea.extent.width =\n                effect_rect_size.first;\n            intermediate_render_pass_begin_info.renderArea.extent.height =\n                effect_rect_size.second;\n            intermediate_render_pass_begin_info.clearValueCount = 0;\n            intermediate_render_pass_begin_info.pClearValues = nullptr;\n            dfn.vkCmdBeginRenderPass(draw_command_buffer,\n                                     &intermediate_render_pass_begin_info,\n                                     VK_SUBPASS_CONTENTS_INLINE);\n            guest_output_viewport.width = float(effect_rect_size.first);\n            guest_output_viewport.height = float(effect_rect_size.second);\n            guest_output_scissor.extent.width = effect_rect_size.first;\n            guest_output_scissor.extent.height = effect_rect_size.second;\n          }\n          dfn.vkCmdSetViewport(draw_command_buffer, 0, 1,\n                               &guest_output_viewport);\n          dfn.vkCmdSetScissor(draw_command_buffer, 0, 1, &guest_output_scissor);\n\n          GuestOutputPaintEffect effect = guest_output_flow.effects[i];\n\n          const PaintContext::GuestOutputPaintPipeline& effect_pipeline =\n              paint_context_.guest_output_paint_pipelines[size_t(effect)];\n          VkPipeline effect_vulkan_pipeline =\n              is_final_effect ? effect_pipeline.swapchain_pipeline\n                              : effect_pipeline.intermediate_pipeline;\n          assert_true(effect_vulkan_pipeline != VK_NULL_HANDLE);\n          dfn.vkCmdBindPipeline(draw_command_buffer,\n                                VK_PIPELINE_BIND_POINT_GRAPHICS,\n                                effect_vulkan_pipeline);\n\n          GuestOutputPaintPipelineLayoutIndex\n              guest_output_paint_pipeline_layout_index =\n                  GetGuestOutputPaintPipelineLayoutIndex(effect);\n          VkPipelineLayout guest_output_paint_pipeline_layout =\n              guest_output_paint_pipeline_layouts_\n                  [guest_output_paint_pipeline_layout_index];\n\n          PaintContext::GuestOutputDescriptorSet effect_src_descriptor_set;\n          if (i) {\n            effect_src_descriptor_set = PaintContext::GuestOutputDescriptorSet(\n                PaintContext::kGuestOutputDescriptorSetIntermediate0Sampled +\n                (i - 1));\n          } else {\n            effect_src_descriptor_set = PaintContext::GuestOutputDescriptorSet(\n                PaintContext::kGuestOutputDescriptorSetGuestOutput0Sampled +\n                guest_output_image_paint_ref_index);\n          }\n          dfn.vkCmdBindDescriptorSets(\n              draw_command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS,\n              guest_output_paint_pipeline_layout, 0, 1,\n              &paint_context_\n                   .guest_output_descriptor_sets[effect_src_descriptor_set],\n              0, nullptr);\n\n          GuestOutputPaintRectangleConstants effect_rect_constants;\n          float effect_x_to_ndc = 2.0f / guest_output_viewport.width;\n          float effect_y_to_ndc = 2.0f / guest_output_viewport.height;\n          effect_rect_constants.x =\n              -1.0f + float(effect_rect_x) * effect_x_to_ndc;\n          effect_rect_constants.y =\n              -1.0f + float(effect_rect_y) * effect_y_to_ndc;\n          effect_rect_constants.width =\n              float(effect_rect_size.first) * effect_x_to_ndc;\n          effect_rect_constants.height =\n              float(effect_rect_size.second) * effect_y_to_ndc;\n          dfn.vkCmdPushConstants(\n              draw_command_buffer, guest_output_paint_pipeline_layout,\n              VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(effect_rect_constants),\n              &effect_rect_constants);\n\n          uint32_t effect_constants_size = 0;\n          union {\n            BilinearConstants bilinear;\n            CasSharpenConstants cas_sharpen;\n            CasResampleConstants cas_resample;\n            FsrEasuConstants fsr_easu;\n            FsrRcasConstants fsr_rcas;\n          } effect_constants;\n          switch (guest_output_paint_pipeline_layout_index) {\n            case kGuestOutputPaintPipelineLayoutIndexBilinear: {\n              effect_constants_size = sizeof(effect_constants.bilinear);\n              effect_constants.bilinear.Initialize(guest_output_flow, i);\n            } break;\n            case kGuestOutputPaintPipelineLayoutIndexCasSharpen: {\n              effect_constants_size = sizeof(effect_constants.cas_sharpen);\n              effect_constants.cas_sharpen.Initialize(\n                  guest_output_flow, i, guest_output_paint_config);\n            } break;\n            case kGuestOutputPaintPipelineLayoutIndexCasResample: {\n              effect_constants_size = sizeof(effect_constants.cas_resample);\n              effect_constants.cas_resample.Initialize(\n                  guest_output_flow, i, guest_output_paint_config);\n            } break;\n            case kGuestOutputPaintPipelineLayoutIndexFsrEasu: {\n              effect_constants_size = sizeof(effect_constants.fsr_easu);\n              effect_constants.fsr_easu.Initialize(guest_output_flow, i);\n            } break;\n            case kGuestOutputPaintPipelineLayoutIndexFsrRcas: {\n              effect_constants_size = sizeof(effect_constants.fsr_rcas);\n              effect_constants.fsr_rcas.Initialize(guest_output_flow, i,\n                                                   guest_output_paint_config);\n            } break;\n            default:\n              break;\n          }\n          if (effect_constants_size) {\n            dfn.vkCmdPushConstants(\n                draw_command_buffer, guest_output_paint_pipeline_layout,\n                VK_SHADER_STAGE_FRAGMENT_BIT, sizeof(effect_rect_constants),\n                effect_constants_size, &effect_constants);\n          }\n\n          dfn.vkCmdDraw(draw_command_buffer, 4, 1, 0, 0);\n\n          if (is_final_effect) {\n            // Clear the letterbox around the guest output if the guest output\n            // doesn't cover the entire swapchain image.\n            if (swapchain_image_clear_needed &&\n                guest_output_flow.letterbox_clear_rectangle_count) {\n              VkClearRect letterbox_clear_vulkan_rectangles\n                  [GuestOutputPaintFlow::kMaxClearRectangles];\n              for (size_t i = 0;\n                   i < guest_output_flow.letterbox_clear_rectangle_count; ++i) {\n                VkClearRect& letterbox_clear_vulkan_rectangle =\n                    letterbox_clear_vulkan_rectangles[i];\n                const GuestOutputPaintFlow::ClearRectangle&\n                    letterbox_clear_rectangle =\n                        guest_output_flow.letterbox_clear_rectangles[i];\n                letterbox_clear_vulkan_rectangle.rect.offset.x =\n                    int32_t(letterbox_clear_rectangle.x);\n                letterbox_clear_vulkan_rectangle.rect.offset.y =\n                    int32_t(letterbox_clear_rectangle.y);\n                letterbox_clear_vulkan_rectangle.rect.extent.width =\n                    letterbox_clear_rectangle.width;\n                letterbox_clear_vulkan_rectangle.rect.extent.height =\n                    letterbox_clear_rectangle.height;\n                letterbox_clear_vulkan_rectangle.baseArrayLayer = 0;\n                letterbox_clear_vulkan_rectangle.layerCount = 1;\n              }\n              dfn.vkCmdClearAttachments(\n                  draw_command_buffer, 1, &swapchain_image_clear_attachment,\n                  uint32_t(guest_output_flow.letterbox_clear_rectangle_count),\n                  letterbox_clear_vulkan_rectangles);\n            }\n            swapchain_image_clear_needed = false;\n          } else {\n            // Still need the swapchain pass to be open for UI drawing.\n            dfn.vkCmdEndRenderPass(draw_command_buffer);\n          }\n        }\n      }\n    }\n  }\n\n  // Release main target guest output image references that aren't needed\n  // anymore (this is done after various potential guest-output-related main\n  // target completion timeline waits so the completed submission index is the\n  // most actual).\n  uint64_t completed_paint_submission =\n      paint_context_.completion_timeline.UpdateAndGetCompletedSubmission();\n  for (std::pair<uint64_t, std::shared_ptr<GuestOutputImage>>&\n           guest_output_image_paint_ref :\n       paint_context_.guest_output_image_paint_refs) {\n    if (!guest_output_image_paint_ref.second ||\n        guest_output_image_paint_ref.second == guest_output_image) {\n      continue;\n    }\n    if (completed_paint_submission >= guest_output_image_paint_ref.first) {\n      guest_output_image_paint_ref.second.reset();\n    }\n  }\n\n  // If hasn't presented the guest output, begin the pass to clear and, if\n  // needed, to draw the UI.\n  if (!swapchain_image_pass_begun) {\n    dfn.vkCmdBeginRenderPass(draw_command_buffer,\n                             &swapchain_render_pass_begin_info,\n                             VK_SUBPASS_CONTENTS_INLINE);\n  }\n  if (swapchain_image_clear_needed) {\n    VkClearRect swapchain_image_clear_rectangle;\n    swapchain_image_clear_rectangle.rect.offset.x = 0;\n    swapchain_image_clear_rectangle.rect.offset.y = 0;\n    swapchain_image_clear_rectangle.rect.extent =\n        paint_context_.swapchain_extent;\n    swapchain_image_clear_rectangle.baseArrayLayer = 0;\n    swapchain_image_clear_rectangle.layerCount = 1;\n    dfn.vkCmdClearAttachments(draw_command_buffer, 1,\n                              &swapchain_image_clear_attachment, 1,\n                              &swapchain_image_clear_rectangle);\n    swapchain_image_clear_needed = false;\n  }\n\n  if (execute_ui_drawers) {\n    // Draw the UI.\n    VulkanUIDrawContext ui_draw_context(\n        *this, paint_context_.swapchain_extent.width,\n        paint_context_.swapchain_extent.height, draw_command_buffer,\n        ui_completion_timeline_.GetUpcomingSubmission(),\n        ui_completion_timeline_.UpdateAndGetCompletedSubmission(),\n        paint_context_.swapchain_render_pass,\n        paint_context_.swapchain_render_pass_format);\n    ExecuteUIDrawersFromUIThread(ui_draw_context);\n  }\n\n  dfn.vkCmdEndRenderPass(draw_command_buffer);\n\n  dfn.vkEndCommandBuffer(draw_command_buffer);\n\n  VkPipelineStageFlags acquire_semaphore_wait_stage =\n      VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;\n  VkCommandBuffer command_buffers[2];\n  uint32_t command_buffer_count = 0;\n  // UI setup command buffers must be accessed only if execute_ui_drawers is not\n  // null, to identify the UI thread.\n  size_t ui_setup_command_buffer_index =\n      execute_ui_drawers ? paint_context_.ui_setup_command_buffer_current_index\n                         : SIZE_MAX;\n  if (ui_setup_command_buffer_index != SIZE_MAX) {\n    PaintContext::UISetupCommandBuffer& ui_setup_command_buffer =\n        paint_context_.ui_setup_command_buffers[ui_setup_command_buffer_index];\n    dfn.vkEndCommandBuffer(ui_setup_command_buffer.command_buffer);\n    command_buffers[command_buffer_count++] =\n        ui_setup_command_buffer.command_buffer;\n    // Release the current UI setup command buffer regardless of submission\n    // result. Failed submissions (if the UI submission index wasn't incremented\n    // since the previous draw) should be handled by UI drawers themselves by\n    // retrying all the failed work if needed.\n    paint_context_.ui_setup_command_buffer_current_index = SIZE_MAX;\n  }\n  command_buffers[command_buffer_count++] = draw_command_buffer;\n  VkSemaphore present_semaphore = paint_submission.present_semaphore();\n  VkSubmitInfo submit_info;\n  submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;\n  submit_info.pNext = nullptr;\n  submit_info.waitSemaphoreCount = 1;\n  submit_info.pWaitSemaphores = &acquire_semaphore;\n  submit_info.pWaitDstStageMask = &acquire_semaphore_wait_stage;\n  submit_info.commandBufferCount = command_buffer_count;\n  submit_info.pCommandBuffers = command_buffers;\n  submit_info.signalSemaphoreCount = 1;\n  submit_info.pSignalSemaphores = &present_semaphore;\n  const VkResult submit_result =\n      paint_context_.completion_timeline.AcquireFenceAndSubmit(\n          vulkan_device_->queue_family_graphics_compute(), 0, 1, &submit_info);\n  if (submit_result != VK_SUCCESS) {\n    XELOGE(\n        \"VulkanPresenter: Failed to submit the presentation command buffer: {}\",\n        vk::to_string(vk::Result(submit_result)));\n    if (ui_setup_command_buffer_index != SIZE_MAX) {\n      // If failed to submit, make the UI setup command buffer available for\n      // immediate reuse, as the completed submission index won't be updated to\n      // the current index, and failing submissions with setup command buffer\n      // over and over will result in never reusing the setup command buffers.\n      paint_context_.ui_setup_command_buffers[ui_setup_command_buffer_index]\n          .last_usage_submission_index = 0;\n    }\n    // The image is in an acquired state - but now, it will be in it forever.\n    // To avoid that, recreate the swapchain - don't return just kNotPresented.\n    return PaintResult::kNotPresentedConnectionOutdated;\n  }\n  if (execute_ui_drawers) {\n    // Also update the completion timeline providing submission indices to UI\n    // draw callbacks if submission is successful.\n    const VkResult ui_signal_submit_result =\n        ui_completion_timeline_.AcquireFenceAndSubmit(\n            vulkan_device_->queue_family_graphics_compute(), 0, 0, nullptr);\n    if (ui_signal_submit_result != VK_SUCCESS) {\n      XELOGE(\n          \"VulkanPresenter: Failed to submit the UI drawing fence signal: {}\",\n          vk::to_string(vk::Result(ui_signal_submit_result)));\n    }\n  }\n\n  VkPresentInfoKHR present_info;\n  present_info.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;\n  present_info.pNext = nullptr;\n  present_info.waitSemaphoreCount = 1;\n  present_info.pWaitSemaphores = &present_semaphore;\n  present_info.swapchainCount = 1;\n  present_info.pSwapchains = &paint_context_.swapchain;\n  present_info.pImageIndices = &swapchain_image_index;\n  present_info.pResults = nullptr;\n  VkResult present_result;\n  {\n    const VulkanDevice::Queue::Acquisition queue_acquisition =\n        vulkan_device_->AcquireQueue(paint_context_.present_queue_family, 0);\n    present_result =\n        dfn.vkQueuePresentKHR(queue_acquisition.queue(), &present_info);\n  }\n  switch (present_result) {\n    case VK_SUCCESS:\n      return PaintResult::kPresented;\n    case VK_SUBOPTIMAL_KHR:\n      return PaintResult::kPresentedSuboptimal;\n    case VK_ERROR_DEVICE_LOST:\n      XELOGE(\n          \"VulkanPresenter: Failed to present the swapchain image as the \"\n          \"device has been lost\");\n      return PaintResult::kGpuLostResponsible;\n    case VK_ERROR_OUT_OF_DATE_KHR:\n    case VK_ERROR_SURFACE_LOST_KHR:\n    case VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT:\n      // Not an error, reporting just as info (may normally occur while resizing\n      // on some platforms).\n      XELOGI(\n          \"VulkanPresenter: Presentation to the swapchain image has been \"\n          \"dropped as the swapchain or the surface has become outdated\");\n      // Note that the semaphore wait (followed by reset) has been enqueued,\n      // however, this should have no effect on anything here likely.\n      return PaintResult::kNotPresentedConnectionOutdated;\n    default:\n      XELOGE(\"VulkanPresenter: Failed to present the swapchain image\");\n      // The image is in an acquired state - but now, it will be in it forever.\n      // To avoid that, recreate the swapchain - don't return just\n      // kNotPresented.\n      return PaintResult::kNotPresentedConnectionOutdated;\n  }\n}\n\nbool VulkanPresenter::InitializeSurfaceIndependent() {\n  const VulkanDevice::Functions& dfn = vulkan_device_->functions();\n  const VkDevice device = vulkan_device_->device();\n\n  VkDescriptorSetLayoutBinding guest_output_image_sampler_bindings[2];\n  guest_output_image_sampler_bindings[0].binding = 0;\n  guest_output_image_sampler_bindings[0].descriptorType =\n      VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;\n  guest_output_image_sampler_bindings[0].descriptorCount = 1;\n  guest_output_image_sampler_bindings[0].stageFlags =\n      VK_SHADER_STAGE_FRAGMENT_BIT;\n  guest_output_image_sampler_bindings[0].pImmutableSamplers = nullptr;\n  const VkSampler sampler_linear_clamp =\n      ui_samplers_->samplers()[UISamplers::kSamplerIndexLinearClampToEdge];\n  guest_output_image_sampler_bindings[1].binding = 1;\n  guest_output_image_sampler_bindings[1].descriptorType =\n      VK_DESCRIPTOR_TYPE_SAMPLER;\n  guest_output_image_sampler_bindings[1].descriptorCount = 1;\n  guest_output_image_sampler_bindings[1].stageFlags =\n      VK_SHADER_STAGE_FRAGMENT_BIT;\n  guest_output_image_sampler_bindings[1].pImmutableSamplers =\n      &sampler_linear_clamp;\n  VkDescriptorSetLayoutCreateInfo\n      guest_output_paint_image_descriptor_set_layout_create_info;\n  guest_output_paint_image_descriptor_set_layout_create_info.sType =\n      VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;\n  guest_output_paint_image_descriptor_set_layout_create_info.pNext = nullptr;\n  guest_output_paint_image_descriptor_set_layout_create_info.flags = 0;\n  guest_output_paint_image_descriptor_set_layout_create_info.bindingCount =\n      uint32_t(xe::countof(guest_output_image_sampler_bindings));\n  guest_output_paint_image_descriptor_set_layout_create_info.pBindings =\n      guest_output_image_sampler_bindings;\n  if (dfn.vkCreateDescriptorSetLayout(\n          device, &guest_output_paint_image_descriptor_set_layout_create_info,\n          nullptr,\n          &guest_output_paint_image_descriptor_set_layout_) != VK_SUCCESS) {\n    XELOGE(\n        \"VulkanPresenter: Failed to create the guest output image descriptor \"\n        \"set layout\");\n    return false;\n  }\n\n  VkPushConstantRange guest_output_paint_push_constant_ranges[2];\n  VkPushConstantRange& guest_output_paint_push_constant_range_rect =\n      guest_output_paint_push_constant_ranges[0];\n  guest_output_paint_push_constant_range_rect.stageFlags =\n      VK_SHADER_STAGE_VERTEX_BIT;\n  guest_output_paint_push_constant_range_rect.offset = 0;\n  guest_output_paint_push_constant_range_rect.size =\n      sizeof(GuestOutputPaintRectangleConstants);\n  VkPushConstantRange& guest_output_paint_push_constant_range_ffx =\n      guest_output_paint_push_constant_ranges[1];\n  guest_output_paint_push_constant_range_ffx.stageFlags =\n      VK_SHADER_STAGE_FRAGMENT_BIT;\n  guest_output_paint_push_constant_range_ffx.offset =\n      guest_output_paint_push_constant_ranges[0].offset +\n      guest_output_paint_push_constant_ranges[0].size;\n  VkPipelineLayoutCreateInfo guest_output_paint_pipeline_layout_create_info;\n  guest_output_paint_pipeline_layout_create_info.sType =\n      VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;\n  guest_output_paint_pipeline_layout_create_info.pNext = nullptr;\n  guest_output_paint_pipeline_layout_create_info.flags = 0;\n  guest_output_paint_pipeline_layout_create_info.setLayoutCount = 1;\n  guest_output_paint_pipeline_layout_create_info.pSetLayouts =\n      &guest_output_paint_image_descriptor_set_layout_;\n  guest_output_paint_pipeline_layout_create_info.pPushConstantRanges =\n      guest_output_paint_push_constant_ranges;\n  for (size_t i = 0; i < size_t(kGuestOutputPaintPipelineLayoutCount); ++i) {\n    switch (GuestOutputPaintPipelineLayoutIndex(i)) {\n      case kGuestOutputPaintPipelineLayoutIndexBilinear:\n        guest_output_paint_push_constant_range_ffx.size =\n            sizeof(BilinearConstants);\n        break;\n      case kGuestOutputPaintPipelineLayoutIndexCasSharpen:\n        guest_output_paint_push_constant_range_ffx.size =\n            sizeof(CasSharpenConstants);\n        break;\n      case kGuestOutputPaintPipelineLayoutIndexCasResample:\n        guest_output_paint_push_constant_range_ffx.size =\n            sizeof(CasResampleConstants);\n        break;\n      case kGuestOutputPaintPipelineLayoutIndexFsrEasu:\n        guest_output_paint_push_constant_range_ffx.size =\n            sizeof(FsrEasuConstants);\n        break;\n      case kGuestOutputPaintPipelineLayoutIndexFsrRcas:\n        guest_output_paint_push_constant_range_ffx.size =\n            sizeof(FsrRcasConstants);\n        break;\n      default:\n        assert_unhandled_case(GuestOutputPaintPipelineLayoutIndex(i));\n        continue;\n    }\n    guest_output_paint_pipeline_layout_create_info.pushConstantRangeCount =\n        1 + uint32_t(guest_output_paint_push_constant_range_ffx.size != 0);\n    if (dfn.vkCreatePipelineLayout(\n            device, &guest_output_paint_pipeline_layout_create_info, nullptr,\n            &guest_output_paint_pipeline_layouts_[i]) != VK_SUCCESS) {\n      XELOGE(\n          \"VulkanPresenter: Failed to create a guest output presentation \"\n          \"pipeline layout with {} bytes of push constants\",\n          guest_output_paint_push_constant_range_rect.size +\n              guest_output_paint_push_constant_range_ffx.size);\n      return false;\n    }\n  }\n\n  VkShaderModuleCreateInfo shader_module_create_info;\n  shader_module_create_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;\n  shader_module_create_info.pNext = nullptr;\n  shader_module_create_info.flags = 0;\n  shader_module_create_info.codeSize =\n      sizeof(shaders::guest_output_triangle_strip_rect_vs);\n  shader_module_create_info.pCode =\n      shaders::guest_output_triangle_strip_rect_vs;\n  if (dfn.vkCreateShaderModule(device, &shader_module_create_info, nullptr,\n                               &guest_output_paint_vs_) != VK_SUCCESS) {\n    XELOGE(\n        \"VulkanPresenter: Failed to create the guest output presentation \"\n        \"vertex shader module\");\n    return false;\n  }\n  for (size_t i = 0; i < size_t(GuestOutputPaintEffect::kCount); ++i) {\n    GuestOutputPaintEffect guest_output_paint_effect =\n        GuestOutputPaintEffect(i);\n    switch (guest_output_paint_effect) {\n      case GuestOutputPaintEffect::kBilinear:\n        shader_module_create_info.codeSize =\n            sizeof(shaders::guest_output_bilinear_ps);\n        shader_module_create_info.pCode = shaders::guest_output_bilinear_ps;\n        break;\n      case GuestOutputPaintEffect::kBilinearDither:\n        shader_module_create_info.codeSize =\n            sizeof(shaders::guest_output_bilinear_dither_ps);\n        shader_module_create_info.pCode =\n            shaders::guest_output_bilinear_dither_ps;\n        break;\n      case GuestOutputPaintEffect::kCasSharpen:\n        shader_module_create_info.codeSize =\n            sizeof(shaders::guest_output_ffx_cas_sharpen_ps);\n        shader_module_create_info.pCode =\n            shaders::guest_output_ffx_cas_sharpen_ps;\n        break;\n      case GuestOutputPaintEffect::kCasSharpenDither:\n        shader_module_create_info.codeSize =\n            sizeof(shaders::guest_output_ffx_cas_sharpen_dither_ps);\n        shader_module_create_info.pCode =\n            shaders::guest_output_ffx_cas_sharpen_dither_ps;\n        break;\n      case GuestOutputPaintEffect::kCasResample:\n        shader_module_create_info.codeSize =\n            sizeof(shaders::guest_output_ffx_cas_resample_ps);\n        shader_module_create_info.pCode =\n            shaders::guest_output_ffx_cas_resample_ps;\n        break;\n      case GuestOutputPaintEffect::kCasResampleDither:\n        shader_module_create_info.codeSize =\n            sizeof(shaders::guest_output_ffx_cas_resample_dither_ps);\n        shader_module_create_info.pCode =\n            shaders::guest_output_ffx_cas_resample_dither_ps;\n        break;\n      case GuestOutputPaintEffect::kFsrEasu:\n        shader_module_create_info.codeSize =\n            sizeof(shaders::guest_output_ffx_fsr_easu_ps);\n        shader_module_create_info.pCode = shaders::guest_output_ffx_fsr_easu_ps;\n        break;\n      case GuestOutputPaintEffect::kFsrRcas:\n        shader_module_create_info.codeSize =\n            sizeof(shaders::guest_output_ffx_fsr_rcas_ps);\n        shader_module_create_info.pCode = shaders::guest_output_ffx_fsr_rcas_ps;\n        break;\n      case GuestOutputPaintEffect::kFsrRcasDither:\n        shader_module_create_info.codeSize =\n            sizeof(shaders::guest_output_ffx_fsr_rcas_dither_ps);\n        shader_module_create_info.pCode =\n            shaders::guest_output_ffx_fsr_rcas_dither_ps;\n        break;\n      default:\n        // Not supported by this implementation.\n        continue;\n    }\n    if (dfn.vkCreateShaderModule(device, &shader_module_create_info, nullptr,\n                                 &guest_output_paint_fs_[i]) != VK_SUCCESS) {\n      XELOGE(\n          \"VulkanPresenter: Failed to create the guest output painting shader \"\n          \"module for effect {}\",\n          i);\n      return false;\n    }\n  }\n\n  VkAttachmentDescription intermediate_render_pass_attachment;\n  intermediate_render_pass_attachment.flags = 0;\n  intermediate_render_pass_attachment.format = kGuestOutputFormat;\n  intermediate_render_pass_attachment.samples = VK_SAMPLE_COUNT_1_BIT;\n  intermediate_render_pass_attachment.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;\n  intermediate_render_pass_attachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE;\n  intermediate_render_pass_attachment.stencilLoadOp =\n      VK_ATTACHMENT_LOAD_OP_DONT_CARE;\n  intermediate_render_pass_attachment.stencilStoreOp =\n      VK_ATTACHMENT_STORE_OP_DONT_CARE;\n  intermediate_render_pass_attachment.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;\n  intermediate_render_pass_attachment.finalLayout =\n      VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;\n  VkAttachmentReference intermediate_render_pass_color_attachment;\n  intermediate_render_pass_color_attachment.attachment = 0;\n  intermediate_render_pass_color_attachment.layout =\n      VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;\n  VkSubpassDescription intermediate_render_pass_subpass = {};\n  intermediate_render_pass_subpass.pipelineBindPoint =\n      VK_PIPELINE_BIND_POINT_GRAPHICS;\n  intermediate_render_pass_subpass.colorAttachmentCount = 1;\n  intermediate_render_pass_subpass.pColorAttachments =\n      &intermediate_render_pass_color_attachment;\n  VkSubpassDependency intermediate_render_pass_dependencies[2];\n  intermediate_render_pass_dependencies[0].srcSubpass = VK_SUBPASS_EXTERNAL;\n  intermediate_render_pass_dependencies[0].dstSubpass = 0;\n  intermediate_render_pass_dependencies[0].srcStageMask =\n      VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;\n  intermediate_render_pass_dependencies[0].dstStageMask =\n      VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;\n  intermediate_render_pass_dependencies[0].srcAccessMask =\n      VK_ACCESS_SHADER_READ_BIT;\n  intermediate_render_pass_dependencies[0].dstAccessMask =\n      VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;\n  intermediate_render_pass_dependencies[0].dependencyFlags = 0;\n  intermediate_render_pass_dependencies[1].srcSubpass = 0;\n  intermediate_render_pass_dependencies[1].dstSubpass = VK_SUBPASS_EXTERNAL;\n  intermediate_render_pass_dependencies[1].srcStageMask =\n      VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;\n  intermediate_render_pass_dependencies[1].dstStageMask =\n      VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;\n  intermediate_render_pass_dependencies[1].srcAccessMask =\n      VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;\n  intermediate_render_pass_dependencies[1].dstAccessMask =\n      VK_ACCESS_SHADER_READ_BIT;\n  intermediate_render_pass_dependencies[1].dependencyFlags = 0;\n  VkRenderPassCreateInfo intermediate_render_pass_create_info;\n  intermediate_render_pass_create_info.sType =\n      VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;\n  intermediate_render_pass_create_info.pNext = nullptr;\n  intermediate_render_pass_create_info.flags = 0;\n  intermediate_render_pass_create_info.attachmentCount = 1;\n  intermediate_render_pass_create_info.pAttachments =\n      &intermediate_render_pass_attachment;\n  intermediate_render_pass_create_info.subpassCount = 1;\n  intermediate_render_pass_create_info.pSubpasses =\n      &intermediate_render_pass_subpass;\n  intermediate_render_pass_create_info.dependencyCount =\n      uint32_t(xe::countof(intermediate_render_pass_dependencies));\n  intermediate_render_pass_create_info.pDependencies =\n      intermediate_render_pass_dependencies;\n  if (dfn.vkCreateRenderPass(\n          device, &intermediate_render_pass_create_info, nullptr,\n          &guest_output_intermediate_render_pass_) != VK_SUCCESS) {\n    XELOGE(\n        \"VulkanPresenter: Failed to create the guest output intermediate image \"\n        \"render pass\");\n    return false;\n  }\n\n  // Initialize connection-independent parts of the painting context.\n\n  for (size_t i = 0; i < paint_context_.submissions.size(); ++i) {\n    paint_context_.submissions[i] =\n        PaintContext::Submission::Create(vulkan_device_);\n    if (!paint_context_.submissions[i]) {\n      return false;\n    }\n  }\n\n  // Guest output paint pipelines drawing to intermediate images, not depending\n  // on runtime state unlike ones drawing to the swapchain images as those\n  // depend on the swapchain format.\n  for (size_t i = 0; i < size_t(GuestOutputPaintEffect::kCount); ++i) {\n    if (!CanGuestOutputPaintEffectBeIntermediate(GuestOutputPaintEffect(i)) ||\n        guest_output_paint_fs_[i] == VK_NULL_HANDLE) {\n      continue;\n    }\n    VkPipeline guest_output_paint_intermediate_pipeline =\n        CreateGuestOutputPaintPipeline(GuestOutputPaintEffect(i),\n                                       guest_output_intermediate_render_pass_);\n    if (guest_output_paint_intermediate_pipeline == VK_NULL_HANDLE) {\n      return false;\n    }\n    paint_context_.guest_output_paint_pipelines[i].intermediate_pipeline =\n        guest_output_paint_intermediate_pipeline;\n  }\n\n  // Guest output painting descriptor sets.\n  VkDescriptorPoolSize guest_output_paint_descriptor_pool_sizes[2];\n  guest_output_paint_descriptor_pool_sizes[0].type =\n      VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;\n  guest_output_paint_descriptor_pool_sizes[0].descriptorCount =\n      PaintContext::kGuestOutputDescriptorSetCount;\n  // Required even when using immutable samplers, otherwise failing to allocate\n  // descriptor sets (tested on AMD Software: Adrenalin Edition 22.3.2 on\n  // Windows 10 on AMD Radeon RX Vega 10 with Vulkan validation enabled).\n  guest_output_paint_descriptor_pool_sizes[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;\n  guest_output_paint_descriptor_pool_sizes[1].descriptorCount =\n      PaintContext::kGuestOutputDescriptorSetCount;\n  VkDescriptorPoolCreateInfo guest_output_paint_descriptor_pool_create_info;\n  guest_output_paint_descriptor_pool_create_info.sType =\n      VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;\n  guest_output_paint_descriptor_pool_create_info.pNext = nullptr;\n  guest_output_paint_descriptor_pool_create_info.flags = 0;\n  guest_output_paint_descriptor_pool_create_info.maxSets =\n      PaintContext::kGuestOutputDescriptorSetCount;\n  guest_output_paint_descriptor_pool_create_info.poolSizeCount =\n      uint32_t(xe::countof(guest_output_paint_descriptor_pool_sizes));\n  guest_output_paint_descriptor_pool_create_info.pPoolSizes =\n      guest_output_paint_descriptor_pool_sizes;\n  if (dfn.vkCreateDescriptorPool(\n          device, &guest_output_paint_descriptor_pool_create_info, nullptr,\n          &paint_context_.guest_output_descriptor_pool) != VK_SUCCESS) {\n    XELOGE(\n        \"VulkanPresenter: Failed to create the guest output painting \"\n        \"descriptor pool\");\n    return false;\n  }\n  VkDescriptorSetLayout guest_output_paint_descriptor_set_layouts\n      [PaintContext::kGuestOutputDescriptorSetCount];\n  std::fill(guest_output_paint_descriptor_set_layouts,\n            guest_output_paint_descriptor_set_layouts +\n                xe::countof(guest_output_paint_descriptor_set_layouts),\n            guest_output_paint_image_descriptor_set_layout_);\n  VkDescriptorSetAllocateInfo guest_output_paint_descriptor_set_allocate_info;\n  guest_output_paint_descriptor_set_allocate_info.sType =\n      VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;\n  guest_output_paint_descriptor_set_allocate_info.pNext = nullptr;\n  guest_output_paint_descriptor_set_allocate_info.descriptorPool =\n      paint_context_.guest_output_descriptor_pool;\n  guest_output_paint_descriptor_set_allocate_info.descriptorSetCount =\n      PaintContext::kGuestOutputDescriptorSetCount;\n  guest_output_paint_descriptor_set_allocate_info.pSetLayouts =\n      guest_output_paint_descriptor_set_layouts;\n  if (dfn.vkAllocateDescriptorSets(\n          device, &guest_output_paint_descriptor_set_allocate_info,\n          paint_context_.guest_output_descriptor_sets) != VK_SUCCESS) {\n    XELOGE(\n        \"VulkanPresenter: Failed to allocate the guest output painting \"\n        \"descriptor sets\");\n    return false;\n  }\n\n  return InitializeCommonSurfaceIndependent();\n}\n\nVkPipeline VulkanPresenter::CreateGuestOutputPaintPipeline(\n    GuestOutputPaintEffect effect, VkRenderPass render_pass) {\n  VkPipelineShaderStageCreateInfo stages[2] = {};\n  for (uint32_t i = 0; i < 2; ++i) {\n    VkPipelineShaderStageCreateInfo& stage = stages[i];\n    stage.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;\n    stage.stage = i ? VK_SHADER_STAGE_FRAGMENT_BIT : VK_SHADER_STAGE_VERTEX_BIT;\n    stage.pName = \"main\";\n  }\n  stages[0].module = guest_output_paint_vs_;\n  stages[1].module = guest_output_paint_fs_[size_t(effect)];\n  assert_true(stages[1].module != VK_NULL_HANDLE);\n\n  VkPipelineVertexInputStateCreateInfo vertex_input_state = {};\n  vertex_input_state.sType =\n      VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;\n\n  VkPipelineInputAssemblyStateCreateInfo input_assembly_state = {};\n  input_assembly_state.sType =\n      VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;\n  input_assembly_state.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;\n\n  VkPipelineViewportStateCreateInfo viewport_state = {};\n  viewport_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;\n  viewport_state.viewportCount = 1;\n  viewport_state.scissorCount = 1;\n\n  VkPipelineRasterizationStateCreateInfo rasterization_state = {};\n  rasterization_state.sType =\n      VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;\n  rasterization_state.polygonMode = VK_POLYGON_MODE_FILL;\n  rasterization_state.cullMode = VK_CULL_MODE_NONE;\n  rasterization_state.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;\n  rasterization_state.lineWidth = 1.0f;\n\n  VkPipelineMultisampleStateCreateInfo multisample_state = {};\n  multisample_state.sType =\n      VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;\n  multisample_state.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;\n\n  VkPipelineColorBlendAttachmentState color_blend_attachment_state = {};\n  color_blend_attachment_state.colorWriteMask =\n      VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT |\n      VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;\n  VkPipelineColorBlendStateCreateInfo color_blend_state = {};\n  color_blend_state.sType =\n      VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;\n  color_blend_state.attachmentCount = 1;\n  color_blend_state.pAttachments = &color_blend_attachment_state;\n\n  static const VkDynamicState kPipelineDynamicStates[] = {\n      VK_DYNAMIC_STATE_VIEWPORT,\n      VK_DYNAMIC_STATE_SCISSOR,\n  };\n  VkPipelineDynamicStateCreateInfo dynamic_state = {};\n  dynamic_state.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;\n  dynamic_state.dynamicStateCount =\n      uint32_t(xe::countof(kPipelineDynamicStates));\n  dynamic_state.pDynamicStates = kPipelineDynamicStates;\n\n  VkGraphicsPipelineCreateInfo pipeline_create_info;\n  pipeline_create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;\n  pipeline_create_info.pNext = nullptr;\n  pipeline_create_info.flags = 0;\n  pipeline_create_info.stageCount = uint32_t(xe::countof(stages));\n  pipeline_create_info.pStages = stages;\n  pipeline_create_info.pVertexInputState = &vertex_input_state;\n  pipeline_create_info.pInputAssemblyState = &input_assembly_state;\n  pipeline_create_info.pTessellationState = nullptr;\n  pipeline_create_info.pViewportState = &viewport_state;\n  pipeline_create_info.pRasterizationState = &rasterization_state;\n  pipeline_create_info.pMultisampleState = &multisample_state;\n  pipeline_create_info.pDepthStencilState = nullptr;\n  pipeline_create_info.pColorBlendState = &color_blend_state;\n  pipeline_create_info.pDynamicState = &dynamic_state;\n  pipeline_create_info.layout = guest_output_paint_pipeline_layouts_\n      [GetGuestOutputPaintPipelineLayoutIndex(effect)];\n  pipeline_create_info.renderPass = render_pass;\n  pipeline_create_info.subpass = 0;\n  pipeline_create_info.basePipelineHandle = VK_NULL_HANDLE;\n  pipeline_create_info.basePipelineIndex = -1;\n\n  const VulkanDevice::Functions& dfn = vulkan_device_->functions();\n  const VkDevice device = vulkan_device_->device();\n\n  VkPipeline pipeline;\n  if (dfn.vkCreateGraphicsPipelines(device, VK_NULL_HANDLE, 1,\n                                    &pipeline_create_info, nullptr,\n                                    &pipeline) != VK_SUCCESS) {\n    XELOGE(\n        \"VulkanPresenter: Failed to create the guest output painting pipeline \"\n        \"for effect {}\",\n        size_t(effect));\n    return VK_NULL_HANDLE;\n  }\n  return pipeline;\n}\n\n}  // namespace vulkan\n}  // namespace ui\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/ui/vulkan/vulkan_presenter.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_VULKAN_VULKAN_PRESENTER_H_\n#define XENIA_UI_VULKAN_VULKAN_PRESENTER_H_\n\n#include <algorithm>\n#include <array>\n#include <cstddef>\n#include <cstdint>\n#include <memory>\n#include <utility>\n#include <vector>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/ui/presenter.h\"\n#include \"xenia/ui/surface.h\"\n#include \"xenia/ui/vulkan/ui_samplers.h\"\n#include \"xenia/ui/vulkan/vulkan_device.h\"\n#include \"xenia/ui/vulkan/vulkan_gpu_completion_timeline.h\"\n#include \"xenia/ui/vulkan/vulkan_instance.h\"\n\nnamespace xe {\nnamespace ui {\nnamespace vulkan {\n\nclass VulkanUIDrawContext final : public UIDrawContext {\n public:\n  VulkanUIDrawContext(Presenter& presenter, uint32_t render_target_width,\n                      uint32_t render_target_height,\n                      VkCommandBuffer draw_command_buffer,\n                      uint64_t submission_index_current,\n                      uint64_t submission_index_completed,\n                      VkRenderPass render_pass, VkFormat render_pass_format)\n      : UIDrawContext(presenter, render_target_width, render_target_height),\n        draw_command_buffer_(draw_command_buffer),\n        submission_index_current_(submission_index_current),\n        submission_index_completed_(submission_index_completed),\n        render_pass_(render_pass),\n        render_pass_format_(render_pass_format) {}\n\n  VkCommandBuffer draw_command_buffer() const { return draw_command_buffer_; }\n  uint64_t submission_index_current() const {\n    return submission_index_current_;\n  }\n  uint64_t submission_index_completed() const {\n    return submission_index_completed_;\n  }\n  VkRenderPass render_pass() const { return render_pass_; }\n  VkFormat render_pass_format() const { return render_pass_format_; }\n\n private:\n  VkCommandBuffer draw_command_buffer_;\n  uint64_t submission_index_current_;\n  uint64_t submission_index_completed_;\n  // Has 1 subpass with a single render_pass_format_ attachment.\n  VkRenderPass render_pass_;\n  VkFormat render_pass_format_;\n};\n\nclass VulkanPresenter final : public Presenter {\n public:\n  // Maximum number of different guest output image versions still potentially\n  // considered alive that may be given to the refresher - this many instances\n  // of dependent objects (such as framebuffers) may need to be kept by the\n  // refresher across invocations (due to multiple-buffering of guest output\n  // images inside the presenter, different versions may be given even every\n  // invocation), to avoid recreation of dependent objects every frame.\n  static constexpr size_t kMaxActiveGuestOutputImageVersions =\n      kGuestOutputMailboxSize;\n\n  static constexpr VkFormat kGuestOutputFormat =\n      VK_FORMAT_A2B10G10R10_UNORM_PACK32;\n  // The guest output is expected to be acquired and released in this state by\n  // the refresher. The exception is the first write to the current guest output\n  // image - in this case, a barrier is only needed from\n  // VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT without access. Also if the image is\n  // being refreshed for the first time, it's in VK_IMAGE_LAYOUT_UNDEFINED (but\n  // it's safe, and preferred, to transition it from VK_IMAGE_LAYOUT_UNDEFINED\n  // when writing to it in general).\n  static constexpr VkPipelineStageFlagBits kGuestOutputInternalStageMask =\n      VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;\n  static constexpr VkAccessFlags kGuestOutputInternalAccessMask =\n      VK_ACCESS_SHADER_READ_BIT;\n  static constexpr VkImageLayout kGuestOutputInternalLayout =\n      VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;\n\n  // The callback must use the graphics and compute queue 0 of the device.\n  class VulkanGuestOutputRefreshContext final\n      : public GuestOutputRefreshContext {\n   public:\n    VulkanGuestOutputRefreshContext(bool& is_8bpc_out_ref, VkImage image,\n                                    VkImageView image_view,\n                                    uint64_t image_version,\n                                    bool image_ever_written_previously)\n        : GuestOutputRefreshContext(is_8bpc_out_ref),\n          image_(image),\n          image_view_(image_view),\n          image_version_(image_version),\n          image_ever_written_previously_(image_ever_written_previously) {}\n\n    // The format is kGuestOutputFormat.\n    // Supports usage as a color attachment and as a sampled image, as well as\n    // transfer source (but the reason of that is guest output capturing).\n    VkImage image() const { return image_; }\n    VkImageView image_view() const { return image_view_; }\n    uint64_t image_version() const { return image_version_; }\n    // Whether a proper barrier must be done to acquire the image.\n    bool image_ever_written_previously() const {\n      return image_ever_written_previously_;\n    }\n\n   private:\n    VkImage image_;\n    VkImageView image_view_;\n    uint64_t image_version_;\n    bool image_ever_written_previously_;\n  };\n\n  static std::unique_ptr<VulkanPresenter> Create(\n      HostGpuLossCallback host_gpu_loss_callback, VulkanDevice* vulkan_device,\n      const UISamplers* ui_samplers) {\n    auto presenter = std::unique_ptr<VulkanPresenter>(new VulkanPresenter(\n        host_gpu_loss_callback, vulkan_device, ui_samplers));\n    if (!presenter->InitializeSurfaceIndependent()) {\n      return nullptr;\n    }\n    return presenter;\n  }\n\n  ~VulkanPresenter();\n\n  VulkanDevice* vulkan_device() const { return vulkan_device_; }\n\n  static Surface::TypeFlags GetSurfaceTypesSupportedByInstance(\n      const VulkanInstance::Extensions& instance_extensions);\n  Surface::TypeFlags GetSupportedSurfaceTypes() const override;\n\n  bool CaptureGuestOutput(RawImage& image_out) override;\n\n  void AwaitUISubmissionCompletionFromUIThread(uint64_t submission_index) {\n    ui_completion_timeline_.AwaitSubmissionAndUpdateCompleted(submission_index);\n  }\n  VkCommandBuffer AcquireUISetupCommandBufferFromUIThread();\n\n protected:\n  SurfacePaintConnectResult ConnectOrReconnectPaintingToSurfaceFromUIThread(\n      Surface& new_surface, uint32_t new_surface_width,\n      uint32_t new_surface_height, bool was_paintable,\n      bool& is_vsync_implicit_out) override;\n  void DisconnectPaintingFromSurfaceFromUIThreadImpl() override;\n\n  bool RefreshGuestOutputImpl(\n      uint32_t mailbox_index, uint32_t frontbuffer_width,\n      uint32_t frontbuffer_height,\n      std::function<bool(GuestOutputRefreshContext& context)> refresher,\n      bool& is_8bpc_out_ref) override;\n\n  PaintResult PaintAndPresentImpl(bool execute_ui_drawers) override;\n\n private:\n  // Usable for both the guest output image itself and for intermediate images.\n  class GuestOutputImage {\n   public:\n    static std::unique_ptr<GuestOutputImage> Create(\n        const VulkanDevice* const vulkan_device, const uint32_t width,\n        const uint32_t height) {\n      assert_not_zero(width);\n      assert_not_zero(height);\n      auto image = std::unique_ptr<GuestOutputImage>(\n          new GuestOutputImage(vulkan_device, width, height));\n      if (!image->Initialize()) {\n        return nullptr;\n      }\n      return std::move(image);\n    }\n\n    GuestOutputImage(const GuestOutputImage& image) = delete;\n    GuestOutputImage& operator=(const GuestOutputImage& image) = delete;\n    ~GuestOutputImage();\n\n    const VkExtent2D& extent() const { return extent_; }\n\n    VkImage image() const { return image_; }\n    VkDeviceMemory memory() const { return memory_; }\n    VkImageView view() const { return view_; }\n\n   private:\n    GuestOutputImage(const VulkanDevice* const vulkan_device,\n                     const uint32_t width, const uint32_t height)\n        : vulkan_device_(vulkan_device) {\n      extent_.width = width;\n      extent_.height = height;\n    }\n\n    bool Initialize();\n\n    const VulkanDevice* vulkan_device_;\n\n    VkExtent2D extent_;\n    VkImage image_ = VK_NULL_HANDLE;\n    VkDeviceMemory memory_ = VK_NULL_HANDLE;\n    VkImageView view_ = VK_NULL_HANDLE;\n  };\n\n  struct GuestOutputImageInstance {\n    // Refresher-side reference (painting has its own references for the purpose\n    // of destruction only after painting is done on the GPU).\n    std::shared_ptr<GuestOutputImage> image;\n    uint64_t version = UINT64_MAX;\n    uint64_t last_refresher_submission = 0;\n    // For choosing the barrier stage and access mask and layout depending on\n    // whether the image has previously been written. If an image is active\n    // after a refresh, it can be assumed that this is true.\n    bool ever_successfully_refreshed = false;\n\n    void SetToNewImage(const std::shared_ptr<GuestOutputImage>& new_image,\n                       uint64_t new_version) {\n      image = new_image;\n      version = new_version;\n      last_refresher_submission = 0;\n      ever_successfully_refreshed = false;\n    }\n  };\n\n  struct GuestOutputPaintRectangleConstants {\n    union {\n      struct {\n        float x;\n        float y;\n      };\n      float offset[2];\n    };\n    union {\n      struct {\n        float width;\n        float height;\n      };\n      float size[2];\n    };\n  };\n\n  enum GuestOutputPaintPipelineLayoutIndex : size_t {\n    kGuestOutputPaintPipelineLayoutIndexBilinear,\n    kGuestOutputPaintPipelineLayoutIndexCasSharpen,\n    kGuestOutputPaintPipelineLayoutIndexCasResample,\n    kGuestOutputPaintPipelineLayoutIndexFsrEasu,\n    kGuestOutputPaintPipelineLayoutIndexFsrRcas,\n\n    kGuestOutputPaintPipelineLayoutCount,\n  };\n\n  static constexpr GuestOutputPaintPipelineLayoutIndex\n  GetGuestOutputPaintPipelineLayoutIndex(GuestOutputPaintEffect effect) {\n    switch (effect) {\n      case GuestOutputPaintEffect::kBilinear:\n      case GuestOutputPaintEffect::kBilinearDither:\n        return kGuestOutputPaintPipelineLayoutIndexBilinear;\n      case GuestOutputPaintEffect::kCasSharpen:\n      case GuestOutputPaintEffect::kCasSharpenDither:\n        return kGuestOutputPaintPipelineLayoutIndexCasSharpen;\n      case GuestOutputPaintEffect::kCasResample:\n      case GuestOutputPaintEffect::kCasResampleDither:\n        return kGuestOutputPaintPipelineLayoutIndexCasResample;\n      case GuestOutputPaintEffect::kFsrEasu:\n        return kGuestOutputPaintPipelineLayoutIndexFsrEasu;\n      case GuestOutputPaintEffect::kFsrRcas:\n      case GuestOutputPaintEffect::kFsrRcasDither:\n        return kGuestOutputPaintPipelineLayoutIndexFsrRcas;\n      default:\n        assert_unhandled_case(effect);\n        return kGuestOutputPaintPipelineLayoutCount;\n    }\n  }\n\n  struct PaintContext {\n    class Submission {\n     public:\n      static std::unique_ptr<Submission> Create(\n          const VulkanDevice* const vulkan_device) {\n        auto submission =\n            std::unique_ptr<Submission>(new Submission(vulkan_device));\n        if (!submission->Initialize()) {\n          return nullptr;\n        }\n        return submission;\n      }\n\n      Submission(const Submission& submission) = delete;\n      Submission& operator=(const Submission& submission) = delete;\n      ~Submission();\n\n      VkSemaphore acquire_semaphore() const { return acquire_semaphore_; }\n      VkSemaphore present_semaphore() const { return present_semaphore_; }\n      VkCommandPool draw_command_pool() const { return draw_command_pool_; }\n      VkCommandBuffer draw_command_buffer() const {\n        return draw_command_buffer_;\n      }\n\n     private:\n      explicit Submission(const VulkanDevice* const vulkan_device)\n          : vulkan_device_(vulkan_device) {}\n      bool Initialize();\n\n      const VulkanDevice* vulkan_device_;\n      VkSemaphore acquire_semaphore_ = VK_NULL_HANDLE;\n      VkSemaphore present_semaphore_ = VK_NULL_HANDLE;\n      VkCommandPool draw_command_pool_ = VK_NULL_HANDLE;\n      VkCommandBuffer draw_command_buffer_ = VK_NULL_HANDLE;\n    };\n\n    static constexpr uint32_t kSubmissionCount = 3;\n\n    struct GuestOutputPaintPipeline {\n      // Created on initialization.\n      VkPipeline intermediate_pipeline = VK_NULL_HANDLE;\n      // Created during guest output painting (after awaiting the last guest\n      // output paint if outdated and needs to be recreated), when needed, for\n      // the up-to-date render pass that draws to the swapchain with the actual\n      // image format.\n      VkPipeline swapchain_pipeline = VK_NULL_HANDLE;\n      VkFormat swapchain_format = VK_FORMAT_UNDEFINED;\n    };\n\n    enum GuestOutputDescriptorSet : uint32_t {\n      kGuestOutputDescriptorSetGuestOutput0Sampled,\n\n      kGuestOutputDescriptorSetIntermediate0Sampled =\n          kGuestOutputDescriptorSetGuestOutput0Sampled +\n          kGuestOutputMailboxSize,\n\n      kGuestOutputDescriptorSetCount =\n          kGuestOutputDescriptorSetIntermediate0Sampled +\n          kMaxGuestOutputPaintEffects - 1,\n    };\n\n    struct UISetupCommandBuffer {\n      UISetupCommandBuffer(VkCommandPool command_pool,\n                           VkCommandBuffer command_buffer,\n                           uint64_t last_usage_submission_index = 0)\n          : command_pool(command_pool),\n            command_buffer(command_buffer),\n            last_usage_submission_index(last_usage_submission_index) {}\n\n      VkCommandPool command_pool;\n      VkCommandBuffer command_buffer;\n      uint64_t last_usage_submission_index;\n    };\n\n    struct SwapchainFramebuffer {\n      SwapchainFramebuffer(VkImageView image_view, VkFramebuffer framebuffer)\n          : image_view(image_view), framebuffer(framebuffer) {}\n\n      VkImageView image_view;\n      VkFramebuffer framebuffer;\n    };\n\n    explicit PaintContext(VulkanDevice* const vulkan_device)\n        : vulkan_device(vulkan_device), completion_timeline(vulkan_device) {}\n    PaintContext(const PaintContext& paint_context) = delete;\n    PaintContext& operator=(const PaintContext& paint_context) = delete;\n\n    // The old swapchain, if passed, should be assumed to be retired after this\n    // call (though it may fail before the vkCreateSwapchainKHR that will\n    // technically retire it, so it will be in an undefined state), and needs to\n    // be destroyed externally no matter what the result is.\n    static VkSwapchainKHR CreateSwapchainForVulkanSurface(\n        const VulkanDevice* vulkan_device, VkSurfaceKHR surface, uint32_t width,\n        uint32_t height, VkSwapchainKHR old_swapchain,\n        uint32_t& present_queue_family_out, VkFormat& image_format_out,\n        VkExtent2D& image_extent_out, bool& is_fifo_out,\n        bool& ui_surface_unusable_out);\n\n    // Destroys the swapchain and its derivatives, nulls `swapchain` and returns\n    // the original swapchain object, if it existed, for use as oldSwapchain if\n    // needed and for destruction.\n    VkSwapchainKHR PrepareForSwapchainRetirement();\n    // May be called from the destructor of the presenter.\n    void DestroySwapchainAndVulkanSurface();\n\n    // Connection-indepedent.\n\n    VulkanDevice* vulkan_device;\n\n    std::array<std::unique_ptr<PaintContext::Submission>, kSubmissionCount>\n        submissions;\n    VulkanGPUCompletionTimeline completion_timeline;\n\n    std::array<GuestOutputPaintPipeline, size_t(GuestOutputPaintEffect::kCount)>\n        guest_output_paint_pipelines;\n\n    VkDescriptorPool guest_output_descriptor_pool = VK_NULL_HANDLE;\n    // Descriptors are updated while painting if they're out of date.\n    VkDescriptorSet\n        guest_output_descriptor_sets[kGuestOutputDescriptorSetCount];\n\n    // Refreshed and cleaned up during guest output painting. The first is the\n    // paint submission index in which the guest output image (and its\n    // descriptors) was last used, the second is the reference to the image,\n    // which may be null. The indices are not mailbox indices here, rather, if\n    // the reference is not in this array yet, the most outdated reference, if\n    // needed, is replaced with the new one, awaiting the usage completion of\n    // the last paint usage.\n    std::array<std::pair<uint64_t, std::shared_ptr<GuestOutputImage>>,\n               kGuestOutputMailboxSize>\n        guest_output_image_paint_refs;\n    // The latest submission index at which any guest output image was drawn.\n    uint64_t guest_output_image_paint_last_submission = 0;\n\n    // Current intermediate images for guest output painting, refreshed when\n    // painting guest output.\n    std::array<std::unique_ptr<GuestOutputImage>,\n               kMaxGuestOutputPaintEffects - 1>\n        guest_output_intermediate_images;\n    // Created and destroyed alongside the images. UNORM only.\n    std::array<VkFramebuffer, kMaxGuestOutputPaintEffects - 1>\n        guest_output_intermediate_framebuffers = {};\n    uint64_t guest_output_intermediate_image_last_submission = 0;\n\n    // Command buffers optionally executed before the draw command buffer,\n    // outside the painting render pass.\n    std::vector<UISetupCommandBuffer> ui_setup_command_buffers;\n    size_t ui_setup_command_buffer_current_index = SIZE_MAX;\n\n    // Connection-specific.\n\n    // May be reused between connections if the format stays the same.\n    VkRenderPass swapchain_render_pass = VK_NULL_HANDLE;\n    VkFormat swapchain_render_pass_format = VK_FORMAT_UNDEFINED;\n    bool swapchain_render_pass_clear_load_op = false;\n\n    VkSurfaceKHR vulkan_surface = VK_NULL_HANDLE;\n    uint32_t present_queue_family = UINT32_MAX;\n    VkSwapchainKHR swapchain = VK_NULL_HANDLE;\n    VkExtent2D swapchain_extent = {};\n    bool swapchain_is_fifo = false;\n    std::vector<VkImage> swapchain_images;\n    std::vector<SwapchainFramebuffer> swapchain_framebuffers;\n  };\n\n  explicit VulkanPresenter(HostGpuLossCallback host_gpu_loss_callback,\n                           VulkanDevice* vulkan_device,\n                           const UISamplers* ui_samplers)\n      : Presenter(host_gpu_loss_callback),\n        vulkan_device_(vulkan_device),\n        ui_samplers_(ui_samplers),\n        guest_output_image_refresher_completion_timeline_(vulkan_device),\n        ui_completion_timeline_(vulkan_device),\n        paint_context_(vulkan_device) {\n    assert_not_null(vulkan_device);\n    assert_not_null(ui_samplers);\n  }\n\n  bool InitializeSurfaceIndependent();\n\n  [[nodiscard]] VkPipeline CreateGuestOutputPaintPipeline(\n      GuestOutputPaintEffect effect, VkRenderPass render_pass);\n\n  VulkanDevice* vulkan_device_;\n  const UISamplers* ui_samplers_;\n\n  // Static objects for guest output presentation, used only when painting the\n  // main target (can be destroyed only after awaiting main target usage\n  // completion).\n  VkDescriptorSetLayout guest_output_paint_image_descriptor_set_layout_ =\n      VK_NULL_HANDLE;\n  std::array<VkPipelineLayout, kGuestOutputPaintPipelineLayoutCount>\n      guest_output_paint_pipeline_layouts_ = {};\n  VkShaderModule guest_output_paint_vs_ = VK_NULL_HANDLE;\n  std::array<VkShaderModule, size_t(GuestOutputPaintEffect::kCount)>\n      guest_output_paint_fs_ = {};\n  // Not compatible with the swapchain render pass even if the format is the\n  // same due to different dependencies (this is shader read > color\n  // attachment > shader read).\n  VkRenderPass guest_output_intermediate_render_pass_ = VK_NULL_HANDLE;\n\n  // Value monotonically increased every time a new guest output image is\n  // initialized, for recreation of dependent objects such as framebuffers in\n  // the refreshers - saving and comparing the handle in the refresher is not\n  // enough as Create > Destroy > Create may result in the same handle for\n  // actually different objects without the refresher being aware of the\n  // destruction.\n  uint64_t guest_output_image_next_version_ = 0;\n  std::array<GuestOutputImageInstance, kGuestOutputMailboxSize>\n      guest_output_images_;\n  VulkanGPUCompletionTimeline guest_output_image_refresher_completion_timeline_;\n\n  // UI submission completion timeline with the submission index that can be\n  // given to UI drawers (accessible from the UI thread only, at any time).\n  VulkanGPUCompletionTimeline ui_completion_timeline_;\n\n  // Accessible only by painting and by surface connection lifetime management\n  // (ConnectOrReconnectPaintingToSurfaceFromUIThread,\n  // DisconnectPaintingFromSurfaceFromUIThreadImpl) by the thread doing it, as\n  // well as by presenter initialization and shutdown.\n  PaintContext paint_context_;\n};\n\n}  // namespace vulkan\n}  // namespace ui\n}  // namespace xe\n\n#endif  // XENIA_UI_D3D12_D3D12_PRESENTER_H_\n"
  },
  {
    "path": "src/xenia/ui/vulkan/vulkan_provider.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2025 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/ui/vulkan/vulkan_provider.h\"\n\n#include <vector>\n\n#include \"xenia/base/cvar.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/ui/vulkan/vulkan_immediate_drawer.h\"\n#include \"xenia/ui/vulkan/vulkan_presenter.h\"\n\nDEFINE_bool(\n    vulkan_validation, false,\n    \"Enable the Vulkan validation layer (VK_LAYER_KHRONOS_validation). \"\n    \"Messages will be written to the Xenia log if 'vulkan_log_debug_messages' \"\n    \"is enabled, or to the OS debug output otherwise.\",\n    \"Vulkan\");\n\nDEFINE_int32(vulkan_device, -1,\n             \"Index of the preferred Vulkan physical device, or -1 to use any \"\n             \"compatible device.\",\n             \"Vulkan\");\n\nnamespace xe {\nnamespace ui {\nnamespace vulkan {\n\nstd::unique_ptr<VulkanProvider> VulkanProvider::Create(\n    const bool with_gpu_emulation, const bool with_presentation) {\n  std::unique_ptr<VulkanProvider> provider(new VulkanProvider());\n\n  provider->vulkan_instance_ =\n      VulkanInstance::Create(with_presentation, cvars::vulkan_validation);\n  if (!provider->vulkan_instance_) {\n    return nullptr;\n  }\n\n  std::vector<VkPhysicalDevice> physical_devices;\n  provider->vulkan_instance_->EnumeratePhysicalDevices(physical_devices);\n\n  if (physical_devices.empty()) {\n    XELOGW(\"No Vulkan physical devices available\");\n    return nullptr;\n  }\n\n  const VulkanInstance::Functions& ifn =\n      provider->vulkan_instance_->functions();\n\n  XELOGW(\n      \"Available Vulkan physical devices (use the 'vulkan_device' \"\n      \"configuration variable to force a specific device):\");\n  for (size_t physical_device_index = 0;\n       physical_device_index < physical_devices.size();\n       ++physical_device_index) {\n    VkPhysicalDeviceProperties physical_device_properties;\n    ifn.vkGetPhysicalDeviceProperties(physical_devices[physical_device_index],\n                                      &physical_device_properties);\n    XELOGW(\"* {}: {}\", physical_device_index,\n           physical_device_properties.deviceName);\n  }\n\n  const int32_t preferred_physical_device_index = cvars::vulkan_device;\n  if (preferred_physical_device_index >= 0 &&\n      uint32_t(preferred_physical_device_index) < physical_devices.size()) {\n    provider->vulkan_device_ = VulkanDevice::CreateIfSupported(\n        provider->vulkan_instance_.get(),\n        physical_devices[preferred_physical_device_index], with_gpu_emulation,\n        with_presentation);\n  }\n\n  if (!provider->vulkan_device_) {\n    for (const VkPhysicalDevice physical_device : physical_devices) {\n      provider->vulkan_device_ = VulkanDevice::CreateIfSupported(\n          provider->vulkan_instance_.get(), physical_device, with_gpu_emulation,\n          with_presentation);\n      if (provider->vulkan_device_) {\n        break;\n      }\n    }\n\n    if (!provider->vulkan_device_) {\n      XELOGW(\n          \"Couldn't choose a compatible Vulkan physical device or initialize a \"\n          \"Vulkan logical device\");\n      return nullptr;\n    }\n  }\n\n  if (with_presentation) {\n    provider->ui_samplers_ = UISamplers::Create(provider->vulkan_device_.get());\n    if (!provider->ui_samplers_) {\n      return nullptr;\n    }\n  }\n\n  return provider;\n}\n\nstd::unique_ptr<Presenter> VulkanProvider::CreatePresenter(\n    Presenter::HostGpuLossCallback host_gpu_loss_callback) {\n  return VulkanPresenter::Create(host_gpu_loss_callback, vulkan_device(),\n                                 ui_samplers());\n}\n\nstd::unique_ptr<ImmediateDrawer> VulkanProvider::CreateImmediateDrawer() {\n  return VulkanImmediateDrawer::Create(vulkan_device(), ui_samplers());\n}\n\n}  // namespace vulkan\n}  // namespace ui\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/ui/vulkan/vulkan_provider.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2025 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_VULKAN_VULKAN_PROVIDER_H_\n#define XENIA_UI_VULKAN_VULKAN_PROVIDER_H_\n\n#include <memory>\n\n#include \"xenia/ui/graphics_provider.h\"\n#include \"xenia/ui/vulkan/ui_samplers.h\"\n#include \"xenia/ui/vulkan/vulkan_device.h\"\n#include \"xenia/ui/vulkan/vulkan_instance.h\"\n\nnamespace xe {\nnamespace ui {\nnamespace vulkan {\n\nclass VulkanProvider : public GraphicsProvider {\n public:\n  static std::unique_ptr<VulkanProvider> Create(bool with_gpu_emulation,\n                                                bool with_presentation);\n\n  VulkanInstance* vulkan_instance() const { return vulkan_instance_.get(); }\n\n  VulkanDevice* vulkan_device() const { return vulkan_device_.get(); }\n\n  // nullptr if created without presentation support.\n  const UISamplers* ui_samplers() const { return ui_samplers_.get(); }\n\n  std::unique_ptr<Presenter> CreatePresenter(\n      Presenter::HostGpuLossCallback host_gpu_loss_callback =\n          Presenter::FatalErrorHostGpuLossCallback) override;\n\n  std::unique_ptr<ImmediateDrawer> CreateImmediateDrawer() override;\n\n private:\n  explicit VulkanProvider() = default;\n\n  std::unique_ptr<VulkanInstance> vulkan_instance_;\n\n  // Depends on the instance.\n  std::unique_ptr<VulkanDevice> vulkan_device_;\n\n  // Depends on the device.\n  std::unique_ptr<UISamplers> ui_samplers_;\n};\n\n}  // namespace vulkan\n}  // namespace ui\n}  // namespace xe\n\n#endif  // XENIA_UI_VULKAN_VULKAN_PROVIDER_H_\n"
  },
  {
    "path": "src/xenia/ui/vulkan/vulkan_upload_buffer_pool.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/ui/vulkan/vulkan_upload_buffer_pool.h\"\n\n#include <algorithm>\n\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/ui/vulkan/vulkan_util.h\"\n\nnamespace xe {\nnamespace ui {\nnamespace vulkan {\n\n// Host-visible memory sizes are likely to be internally rounded to\n// nonCoherentAtomSize (it's the memory mapping granularity, though as the map\n// or flush range must be clamped to the actual allocation size as a special\n// case, but it's still unlikely that the allocation won't be aligned to it), so\n// try not to waste that padding.\nVulkanUploadBufferPool::VulkanUploadBufferPool(\n    const VulkanDevice* const vulkan_device, const VkBufferUsageFlags usage,\n    const size_t page_size)\n    : GraphicsUploadBufferPool(size_t(\n          xe::round_up(VkDeviceSize(page_size),\n                       vulkan_device->properties().nonCoherentAtomSize))),\n      vulkan_device_(vulkan_device),\n      usage_(usage) {}\n\nuint8_t* VulkanUploadBufferPool::Request(uint64_t submission_index, size_t size,\n                                         size_t alignment, VkBuffer& buffer_out,\n                                         VkDeviceSize& offset_out) {\n  size_t offset;\n  const VulkanPage* page =\n      static_cast<const VulkanPage*>(GraphicsUploadBufferPool::Request(\n          submission_index, size, alignment, offset));\n  if (!page) {\n    return nullptr;\n  }\n  buffer_out = page->buffer_;\n  offset_out = VkDeviceSize(offset);\n  return reinterpret_cast<uint8_t*>(page->mapping_) + offset;\n}\n\nuint8_t* VulkanUploadBufferPool::RequestPartial(uint64_t submission_index,\n                                                size_t size, size_t alignment,\n                                                VkBuffer& buffer_out,\n                                                VkDeviceSize& offset_out,\n                                                VkDeviceSize& size_out) {\n  size_t offset, size_obtained;\n  const VulkanPage* page =\n      static_cast<const VulkanPage*>(GraphicsUploadBufferPool::RequestPartial(\n          submission_index, size, alignment, offset, size_obtained));\n  if (!page) {\n    return nullptr;\n  }\n  buffer_out = page->buffer_;\n  offset_out = VkDeviceSize(offset);\n  size_out = VkDeviceSize(size_obtained);\n  return reinterpret_cast<uint8_t*>(page->mapping_) + offset;\n}\n\nGraphicsUploadBufferPool::Page*\nVulkanUploadBufferPool::CreatePageImplementation() {\n  if (memory_type_ == kMemoryTypeUnavailable) {\n    // Don't try to create everything again and again if totally broken.\n    return nullptr;\n  }\n\n  const VulkanDevice::Functions& dfn = vulkan_device_->functions();\n  const VkDevice device = vulkan_device_->device();\n\n  VkBufferCreateInfo buffer_create_info;\n  buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;\n  buffer_create_info.pNext = nullptr;\n  buffer_create_info.flags = 0;\n  buffer_create_info.size = VkDeviceSize(page_size_);\n  buffer_create_info.usage = usage_;\n  buffer_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;\n  buffer_create_info.queueFamilyIndexCount = 0;\n  buffer_create_info.pQueueFamilyIndices = nullptr;\n  VkBuffer buffer;\n  if (dfn.vkCreateBuffer(device, &buffer_create_info, nullptr, &buffer) !=\n      VK_SUCCESS) {\n    XELOGE(\"Failed to create a Vulkan upload buffer with {} bytes\", page_size_);\n    return nullptr;\n  }\n\n  if (memory_type_ == kMemoryTypeUnknown) {\n    VkMemoryRequirements memory_requirements;\n    dfn.vkGetBufferMemoryRequirements(device, buffer, &memory_requirements);\n    memory_type_ =\n        util::ChooseHostMemoryType(vulkan_device_->memory_types(),\n                                   memory_requirements.memoryTypeBits, false);\n    if (memory_type_ == UINT32_MAX) {\n      XELOGE(\n          \"No host-visible memory types can store an Vulkan upload buffer with \"\n          \"{} bytes\",\n          page_size_);\n      memory_type_ = kMemoryTypeUnavailable;\n      dfn.vkDestroyBuffer(device, buffer, nullptr);\n      return nullptr;\n    }\n    allocation_size_ = memory_requirements.size;\n    if (allocation_size_ > page_size_) {\n      // Try to occupy the allocation padding. If that's going to require even\n      // more memory for some reason, don't.\n      buffer_create_info.size = allocation_size_;\n      VkBuffer buffer_expanded;\n      if (dfn.vkCreateBuffer(device, &buffer_create_info, nullptr,\n                             &buffer_expanded) == VK_SUCCESS) {\n        VkMemoryRequirements memory_requirements_expanded;\n        dfn.vkGetBufferMemoryRequirements(device, buffer_expanded,\n                                          &memory_requirements_expanded);\n        uint32_t memory_type_expanded = util::ChooseHostMemoryType(\n            vulkan_device_->memory_types(), memory_requirements.memoryTypeBits,\n            false);\n        if (memory_requirements_expanded.size <= allocation_size_ &&\n            memory_type_expanded != UINT32_MAX) {\n          page_size_ = size_t(allocation_size_);\n          allocation_size_ = memory_requirements_expanded.size;\n          memory_type_ = memory_type_expanded;\n          dfn.vkDestroyBuffer(device, buffer, nullptr);\n          buffer = buffer_expanded;\n        } else {\n          dfn.vkDestroyBuffer(device, buffer_expanded, nullptr);\n        }\n      }\n    }\n  }\n\n  VkMemoryAllocateInfo memory_allocate_info;\n  VkMemoryAllocateInfo* memory_allocate_info_last = &memory_allocate_info;\n  memory_allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;\n  memory_allocate_info.pNext = nullptr;\n  memory_allocate_info.allocationSize = allocation_size_;\n  memory_allocate_info.memoryTypeIndex = memory_type_;\n  VkMemoryDedicatedAllocateInfo memory_dedicated_allocate_info;\n  if (vulkan_device_->extensions().ext_1_1_KHR_dedicated_allocation) {\n    memory_allocate_info_last->pNext = &memory_dedicated_allocate_info;\n    memory_allocate_info_last = reinterpret_cast<VkMemoryAllocateInfo*>(\n        &memory_dedicated_allocate_info);\n    memory_dedicated_allocate_info.sType =\n        VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO;\n    memory_dedicated_allocate_info.pNext = nullptr;\n    memory_dedicated_allocate_info.image = VK_NULL_HANDLE;\n    memory_dedicated_allocate_info.buffer = buffer;\n  }\n  VkDeviceMemory memory;\n  if (dfn.vkAllocateMemory(device, &memory_allocate_info, nullptr, &memory) !=\n      VK_SUCCESS) {\n    XELOGE(\"Failed to allocate {} bytes of Vulkan upload buffer memory\",\n           allocation_size_);\n    dfn.vkDestroyBuffer(device, buffer, nullptr);\n    return nullptr;\n  }\n\n  if (dfn.vkBindBufferMemory(device, buffer, memory, 0) != VK_SUCCESS) {\n    XELOGE(\"Failed to bind memory to a Vulkan upload buffer with {} bytes\",\n           page_size_);\n    dfn.vkDestroyBuffer(device, buffer, nullptr);\n    dfn.vkFreeMemory(device, memory, nullptr);\n    return nullptr;\n  }\n\n  void* mapping;\n  if (dfn.vkMapMemory(device, memory, 0, VK_WHOLE_SIZE, 0, &mapping) !=\n      VK_SUCCESS) {\n    XELOGE(\"Failed to map {} bytes of Vulkan upload buffer memory\",\n           allocation_size_);\n    dfn.vkDestroyBuffer(device, buffer, nullptr);\n    dfn.vkFreeMemory(device, memory, nullptr);\n    return nullptr;\n  }\n\n  return new VulkanPage(vulkan_device_, buffer, memory, mapping);\n}\n\nvoid VulkanUploadBufferPool::FlushPageWrites(Page* page, size_t offset,\n                                             size_t size) {\n  util::FlushMappedMemoryRange(\n      vulkan_device_, static_cast<const VulkanPage*>(page)->memory_,\n      memory_type_, VkDeviceSize(offset), allocation_size_, VkDeviceSize(size));\n}\n\nVulkanUploadBufferPool::VulkanPage::~VulkanPage() {\n  const VulkanDevice::Functions& dfn = vulkan_device_->functions();\n  const VkDevice device = vulkan_device_->device();\n  dfn.vkDestroyBuffer(device, buffer_, nullptr);\n  // Unmapping is done implicitly when the memory is freed.\n  dfn.vkFreeMemory(device, memory_, nullptr);\n}\n\n}  // namespace vulkan\n}  // namespace ui\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/ui/vulkan/vulkan_upload_buffer_pool.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_VULKAN_VULKAN_UPLOAD_BUFFER_POOL_H_\n#define XENIA_UI_VULKAN_VULKAN_UPLOAD_BUFFER_POOL_H_\n\n#include \"xenia/ui/graphics_upload_buffer_pool.h\"\n#include \"xenia/ui/vulkan/vulkan_device.h\"\n\nnamespace xe {\nnamespace ui {\nnamespace vulkan {\n\nclass VulkanUploadBufferPool : public GraphicsUploadBufferPool {\n public:\n  VulkanUploadBufferPool(const VulkanDevice* vulkan_device,\n                         VkBufferUsageFlags usage,\n                         size_t page_size = kDefaultPageSize);\n\n  uint8_t* Request(uint64_t submission_index, size_t size, size_t alignment,\n                   VkBuffer& buffer_out, VkDeviceSize& offset_out);\n  uint8_t* RequestPartial(uint64_t submission_index, size_t size,\n                          size_t alignment, VkBuffer& buffer_out,\n                          VkDeviceSize& offset_out, VkDeviceSize& size_out);\n\n protected:\n  Page* CreatePageImplementation() override;\n\n  void FlushPageWrites(Page* page, size_t offset, size_t size) override;\n\n private:\n  struct VulkanPage : public Page {\n    // Takes ownership of the buffer and its memory and mapping.\n    VulkanPage(const VulkanDevice* vulkan_device, VkBuffer buffer,\n               VkDeviceMemory memory, void* mapping)\n        : vulkan_device_(vulkan_device),\n          buffer_(buffer),\n          memory_(memory),\n          mapping_(mapping) {}\n    ~VulkanPage() override;\n    const VulkanDevice* vulkan_device_;\n    VkBuffer buffer_;\n    VkDeviceMemory memory_;\n    void* mapping_;\n  };\n\n  const VulkanDevice* vulkan_device_;\n\n  VkDeviceSize allocation_size_;\n  static constexpr uint32_t kMemoryTypeUnknown = UINT32_MAX;\n  static constexpr uint32_t kMemoryTypeUnavailable = kMemoryTypeUnknown - 1;\n  uint32_t memory_type_ = UINT32_MAX;\n\n  VkBufferUsageFlags usage_;\n};\n\n}  // namespace vulkan\n}  // namespace ui\n}  // namespace xe\n\n#endif  // XENIA_UI_VULKAN_VULKAN_UPLOAD_BUFFER_POOL_H_\n"
  },
  {
    "path": "src/xenia/ui/vulkan/vulkan_util.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/ui/vulkan/vulkan_util.h\"\n\n#include <cstdint>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/ui/vulkan/vulkan_device.h\"\n\nnamespace xe {\nnamespace ui {\nnamespace vulkan {\nnamespace util {\n\nvoid FlushMappedMemoryRange(const VulkanDevice* const vulkan_device,\n                            const VkDeviceMemory memory,\n                            const uint32_t memory_type,\n                            const VkDeviceSize offset,\n                            const VkDeviceSize memory_size,\n                            const VkDeviceSize size) {\n  assert_false(size != VK_WHOLE_SIZE && memory_size == VK_WHOLE_SIZE);\n  assert_true(memory_size == VK_WHOLE_SIZE || offset <= memory_size);\n  assert_true(memory_size == VK_WHOLE_SIZE || size <= memory_size - offset);\n  if (!size || (vulkan_device->memory_types().host_coherent &\n                (uint32_t(1) << memory_type))) {\n    return;\n  }\n  VkMappedMemoryRange range;\n  range.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;\n  range.pNext = nullptr;\n  range.memory = memory;\n  range.offset = offset;\n  range.size = size;\n  const VkDeviceSize non_coherent_atom_size =\n      vulkan_device->properties().nonCoherentAtomSize;\n  range.offset = offset / non_coherent_atom_size * non_coherent_atom_size;\n  if (size != VK_WHOLE_SIZE) {\n    range.size = std::min(xe::round_up(offset + size, non_coherent_atom_size),\n                          memory_size) -\n                 range.offset;\n  }\n  vulkan_device->functions().vkFlushMappedMemoryRanges(vulkan_device->device(),\n                                                       1, &range);\n}\n\nbool CreateDedicatedAllocationBuffer(\n    const VulkanDevice* const vulkan_device, const VkDeviceSize size,\n    const VkBufferUsageFlags usage, const MemoryPurpose memory_purpose,\n    VkBuffer& buffer_out, VkDeviceMemory& memory_out,\n    uint32_t* const memory_type_out, VkDeviceSize* const memory_size_out) {\n  const VulkanDevice::Functions& dfn = vulkan_device->functions();\n  const VkDevice device = vulkan_device->device();\n\n  VkBufferCreateInfo buffer_create_info;\n  buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;\n  buffer_create_info.pNext = nullptr;\n  buffer_create_info.flags = 0;\n  buffer_create_info.size = size;\n  buffer_create_info.usage = usage;\n  buffer_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;\n  buffer_create_info.queueFamilyIndexCount = 0;\n  buffer_create_info.pQueueFamilyIndices = nullptr;\n  VkBuffer buffer;\n  if (dfn.vkCreateBuffer(device, &buffer_create_info, nullptr, &buffer) !=\n      VK_SUCCESS) {\n    return false;\n  }\n\n  VkMemoryRequirements memory_requirements;\n  dfn.vkGetBufferMemoryRequirements(device, buffer, &memory_requirements);\n  uint32_t memory_type =\n      ChooseMemoryType(vulkan_device->memory_types(),\n                       memory_requirements.memoryTypeBits, memory_purpose);\n  if (memory_type == UINT32_MAX) {\n    dfn.vkDestroyBuffer(device, buffer, nullptr);\n    return false;\n  }\n\n  VkMemoryAllocateInfo memory_allocate_info;\n  memory_allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;\n  memory_allocate_info.pNext = nullptr;\n  memory_allocate_info.allocationSize = memory_requirements.size;\n  memory_allocate_info.memoryTypeIndex = memory_type;\n  VkMemoryDedicatedAllocateInfo memory_dedicated_allocate_info;\n  if (vulkan_device->extensions().ext_1_1_KHR_dedicated_allocation) {\n    memory_dedicated_allocate_info.pNext = memory_allocate_info.pNext;\n    memory_allocate_info.pNext = &memory_dedicated_allocate_info;\n    memory_dedicated_allocate_info.sType =\n        VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO;\n    memory_dedicated_allocate_info.pNext = nullptr;\n    memory_dedicated_allocate_info.image = VK_NULL_HANDLE;\n    memory_dedicated_allocate_info.buffer = buffer;\n  }\n  VkDeviceMemory memory;\n  if (dfn.vkAllocateMemory(device, &memory_allocate_info, nullptr, &memory) !=\n      VK_SUCCESS) {\n    dfn.vkDestroyBuffer(device, buffer, nullptr);\n    return false;\n  }\n\n  if (dfn.vkBindBufferMemory(device, buffer, memory, 0) != VK_SUCCESS) {\n    dfn.vkDestroyBuffer(device, buffer, nullptr);\n    dfn.vkFreeMemory(device, memory, nullptr);\n    return false;\n  }\n\n  buffer_out = buffer;\n  memory_out = memory;\n  if (memory_type_out) {\n    *memory_type_out = memory_type;\n  }\n  if (memory_size_out) {\n    *memory_size_out = memory_allocate_info.allocationSize;\n  }\n  return true;\n}\n\nbool CreateDedicatedAllocationImage(const VulkanDevice* const vulkan_device,\n                                    const VkImageCreateInfo& create_info,\n                                    const MemoryPurpose memory_purpose,\n                                    VkImage& image_out,\n                                    VkDeviceMemory& memory_out,\n                                    uint32_t* const memory_type_out,\n                                    VkDeviceSize* const memory_size_out) {\n  const VulkanDevice::Functions& dfn = vulkan_device->functions();\n  const VkDevice device = vulkan_device->device();\n\n  VkImage image;\n  if (dfn.vkCreateImage(device, &create_info, nullptr, &image) != VK_SUCCESS) {\n    return false;\n  }\n\n  VkMemoryRequirements memory_requirements;\n  dfn.vkGetImageMemoryRequirements(device, image, &memory_requirements);\n  uint32_t memory_type =\n      ChooseMemoryType(vulkan_device->memory_types(),\n                       memory_requirements.memoryTypeBits, memory_purpose);\n  if (memory_type == UINT32_MAX) {\n    dfn.vkDestroyImage(device, image, nullptr);\n    return false;\n  }\n\n  VkMemoryAllocateInfo memory_allocate_info;\n  memory_allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;\n  memory_allocate_info.pNext = nullptr;\n  memory_allocate_info.allocationSize = memory_requirements.size;\n  memory_allocate_info.memoryTypeIndex = memory_type;\n  VkMemoryDedicatedAllocateInfo memory_dedicated_allocate_info;\n  if (vulkan_device->extensions().ext_1_1_KHR_dedicated_allocation) {\n    memory_dedicated_allocate_info.pNext = memory_allocate_info.pNext;\n    memory_allocate_info.pNext = &memory_dedicated_allocate_info;\n    memory_dedicated_allocate_info.sType =\n        VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO;\n    memory_dedicated_allocate_info.pNext = nullptr;\n    memory_dedicated_allocate_info.image = image;\n    memory_dedicated_allocate_info.buffer = VK_NULL_HANDLE;\n  }\n  VkDeviceMemory memory;\n  if (dfn.vkAllocateMemory(device, &memory_allocate_info, nullptr, &memory) !=\n      VK_SUCCESS) {\n    dfn.vkDestroyImage(device, image, nullptr);\n    return false;\n  }\n\n  if (dfn.vkBindImageMemory(device, image, memory, 0) != VK_SUCCESS) {\n    dfn.vkDestroyImage(device, image, nullptr);\n    dfn.vkFreeMemory(device, memory, nullptr);\n    return false;\n  }\n\n  image_out = image;\n  memory_out = memory;\n  if (memory_type_out) {\n    *memory_type_out = memory_type;\n  }\n  if (memory_size_out) {\n    *memory_size_out = memory_allocate_info.allocationSize;\n  }\n  return true;\n}\n\nVkPipeline CreateComputePipeline(\n    const VulkanDevice* const vulkan_device, const VkPipelineLayout layout,\n    const VkShaderModule shader,\n    const VkSpecializationInfo* const specialization_info,\n    const char* const entry_point) {\n  VkComputePipelineCreateInfo pipeline_create_info;\n  pipeline_create_info.sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO;\n  pipeline_create_info.pNext = nullptr;\n  pipeline_create_info.flags = 0;\n  pipeline_create_info.stage.sType =\n      VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;\n  pipeline_create_info.stage.pNext = nullptr;\n  pipeline_create_info.stage.flags = 0;\n  pipeline_create_info.stage.stage = VK_SHADER_STAGE_COMPUTE_BIT;\n  pipeline_create_info.stage.module = shader;\n  pipeline_create_info.stage.pName = entry_point;\n  pipeline_create_info.stage.pSpecializationInfo = specialization_info;\n  pipeline_create_info.layout = layout;\n  pipeline_create_info.basePipelineHandle = VK_NULL_HANDLE;\n  pipeline_create_info.basePipelineIndex = -1;\n  VkPipeline pipeline;\n  if (vulkan_device->functions().vkCreateComputePipelines(\n          vulkan_device->device(), VK_NULL_HANDLE, 1, &pipeline_create_info,\n          nullptr, &pipeline) != VK_SUCCESS) {\n    return VK_NULL_HANDLE;\n  }\n  return pipeline;\n}\n\nVkPipeline CreateComputePipeline(\n    const VulkanDevice* const vulkan_device, VkPipelineLayout layout,\n    const uint32_t* shader_code, size_t shader_code_size_bytes,\n    const VkSpecializationInfo* specialization_info, const char* entry_point) {\n  const VkShaderModule shader =\n      CreateShaderModule(vulkan_device, shader_code, shader_code_size_bytes);\n  if (shader == VK_NULL_HANDLE) {\n    return VK_NULL_HANDLE;\n  }\n  const VkPipeline pipeline = CreateComputePipeline(\n      vulkan_device, layout, shader, specialization_info, entry_point);\n  vulkan_device->functions().vkDestroyShaderModule(vulkan_device->device(),\n                                                   shader, nullptr);\n  return pipeline;\n}\n\n}  // namespace util\n}  // namespace vulkan\n}  // namespace ui\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/ui/vulkan/vulkan_util.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_VULKAN_VULKAN_UTIL_H_\n#define XENIA_UI_VULKAN_VULKAN_UTIL_H_\n\n#include <algorithm>\n#include <cstdint>\n\n#include \"xenia/base/math.h\"\n#include \"xenia/ui/vulkan/vulkan_device.h\"\n\nnamespace xe {\nnamespace ui {\nnamespace vulkan {\nnamespace util {\n\ntemplate <typename DestroyFunction, typename Object>\ninline bool DestroyAndNullHandle(DestroyFunction* const destroy_function,\n                                 Object& handle) {\n  if (handle != VK_NULL_HANDLE) {\n    destroy_function(handle, nullptr);\n    handle = VK_NULL_HANDLE;\n    return true;\n  }\n  return false;\n}\n\ntemplate <typename DestroyFunction, typename Parent, typename Object>\ninline bool DestroyAndNullHandle(DestroyFunction* const destroy_function,\n                                 const Parent parent, Object& handle) {\n  if (handle != VK_NULL_HANDLE) {\n    destroy_function(parent, handle, nullptr);\n    handle = VK_NULL_HANDLE;\n    return true;\n  }\n  return false;\n}\n\nenum class MemoryPurpose {\n  kDeviceLocal,\n  kUpload,\n  kReadback,\n};\n\ninline uint32_t ChooseHostMemoryType(\n    const VulkanDevice::MemoryTypes& memory_types, uint32_t supported_types,\n    const bool is_readback) {\n  supported_types &= memory_types.host_visible;\n  uint32_t memory_type;\n  // For upload, uncached is preferred so writes do not pollute the CPU cache.\n  // For readback, cached is preferred so multiple CPU reads are fast.\n  // If the preferred caching behavior is not available, pick any host-visible.\n  if (xe::bit_scan_forward(\n          supported_types & (is_readback ? memory_types.host_cached\n                                         : ~memory_types.host_cached),\n          &memory_type) ||\n      xe::bit_scan_forward(supported_types, &memory_type)) {\n    return memory_type;\n  }\n  return UINT32_MAX;\n}\n\ninline uint32_t ChooseMemoryType(const VulkanDevice::MemoryTypes& memory_types,\n                                 const uint32_t supported_types,\n                                 const MemoryPurpose purpose) {\n  switch (purpose) {\n    case MemoryPurpose::kDeviceLocal: {\n      uint32_t memory_type;\n      if (xe::bit_scan_forward(supported_types & memory_types.device_local,\n                               &memory_type)) {\n        return memory_type;\n      }\n      if (xe::bit_scan_forward(supported_types, &memory_type)) {\n        return memory_type;\n      }\n      return UINT32_MAX;\n    } break;\n    case MemoryPurpose::kUpload:\n    case MemoryPurpose::kReadback:\n      return ChooseHostMemoryType(memory_types, supported_types,\n                                  purpose == MemoryPurpose::kReadback);\n    default:\n      assert_unhandled_case(purpose);\n      return UINT32_MAX;\n  }\n}\n\n// Actual memory size is required if explicit size is specified for clamping to\n// the actual memory allocation size while rounding to the non-coherent atom\n// size (offset + size passed to vkFlushMappedMemoryRanges inside this function\n// must be either a multiple of nonCoherentAtomSize (but not exceeding the\n// memory size) or equal to the memory size).\nvoid FlushMappedMemoryRange(const VulkanDevice* vulkan_device,\n                            VkDeviceMemory memory, uint32_t memory_type,\n                            VkDeviceSize offset = 0,\n                            VkDeviceSize memory_size = VK_WHOLE_SIZE,\n                            VkDeviceSize size = VK_WHOLE_SIZE);\n\ninline VkExtent2D GetMax2DFramebufferExtent(\n    const VulkanDevice::Properties& device_properties) {\n  VkExtent2D max_extent;\n  max_extent.width = std::min(device_properties.maxFramebufferWidth,\n                              device_properties.maxImageDimension2D);\n  max_extent.height = std::min(device_properties.maxFramebufferHeight,\n                               device_properties.maxImageDimension2D);\n  return max_extent;\n}\n\ninline VkImageSubresourceRange InitializeSubresourceRange(\n    const VkImageAspectFlags aspect_mask = VK_IMAGE_ASPECT_COLOR_BIT,\n    const uint32_t base_mip_level = 0,\n    const uint32_t level_count = VK_REMAINING_MIP_LEVELS,\n    const uint32_t base_array_layer = 0,\n    const uint32_t layer_count = VK_REMAINING_ARRAY_LAYERS) {\n  VkImageSubresourceRange range;\n  range.aspectMask = aspect_mask;\n  range.baseMipLevel = base_mip_level;\n  range.levelCount = level_count;\n  range.baseArrayLayer = base_array_layer;\n  range.layerCount = layer_count;\n  return range;\n}\n\n// Creates a buffer backed by a dedicated allocation. The allocation size will\n// NOT be aligned to nonCoherentAtomSize - if mapping or flushing not the whole\n// size, memory_size_out must be used for clamping the range.\nbool CreateDedicatedAllocationBuffer(const VulkanDevice* vulkan_device,\n                                     VkDeviceSize size,\n                                     VkBufferUsageFlags usage,\n                                     MemoryPurpose memory_purpose,\n                                     VkBuffer& buffer_out,\n                                     VkDeviceMemory& memory_out,\n                                     uint32_t* memory_type_out = nullptr,\n                                     VkDeviceSize* memory_size_out = nullptr);\n\nbool CreateDedicatedAllocationImage(const VulkanDevice* vulkan_device,\n                                    const VkImageCreateInfo& create_info,\n                                    MemoryPurpose memory_purpose,\n                                    VkImage& image_out,\n                                    VkDeviceMemory& memory_out,\n                                    uint32_t* memory_type_out = nullptr,\n                                    VkDeviceSize* memory_size_out = nullptr);\n\n// Explicitly accepting const uint32_t* to make sure attention is paid to the\n// alignment where this is called for safety on different host architectures.\ninline VkShaderModule CreateShaderModule(\n    const VulkanDevice* const vulkan_device, const uint32_t* const code,\n    const size_t code_size_bytes) {\n  VkShaderModuleCreateInfo shader_module_create_info;\n  shader_module_create_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;\n  shader_module_create_info.pNext = nullptr;\n  shader_module_create_info.flags = 0;\n  shader_module_create_info.codeSize = code_size_bytes;\n  shader_module_create_info.pCode = code;\n  VkShaderModule shader_module;\n  return vulkan_device->functions().vkCreateShaderModule(\n             vulkan_device->device(), &shader_module_create_info, nullptr,\n             &shader_module) == VK_SUCCESS\n             ? shader_module\n             : VK_NULL_HANDLE;\n}\n\nVkPipeline CreateComputePipeline(\n    const VulkanDevice* vulkan_device, VkPipelineLayout layout,\n    VkShaderModule shader,\n    const VkSpecializationInfo* specialization_info = nullptr,\n    const char* entry_point = \"main\");\nVkPipeline CreateComputePipeline(\n    const VulkanDevice* vulkan_device, VkPipelineLayout layout,\n    const uint32_t* shader_code, size_t shader_code_size_bytes,\n    const VkSpecializationInfo* specialization_info = nullptr,\n    const char* entry_point = \"main\");\n\n}  // namespace util\n}  // namespace vulkan\n}  // namespace ui\n}  // namespace xe\n\n#endif  // XENIA_UI_VULKAN_VULKAN_UTIL_H_\n"
  },
  {
    "path": "src/xenia/ui/vulkan/vulkan_window_demo.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include <memory>\n#include <string>\n\n#include \"xenia/ui/vulkan/vulkan_provider.h\"\n#include \"xenia/ui/window_demo.h\"\n#include \"xenia/ui/windowed_app.h\"\n\nnamespace xe {\nnamespace ui {\nnamespace vulkan {\n\nclass VulkanWindowDemoApp final : public WindowDemoApp {\n public:\n  static std::unique_ptr<WindowedApp> Create(WindowedAppContext& app_context) {\n    return std::unique_ptr<WindowedApp>(new VulkanWindowDemoApp(app_context));\n  }\n\n protected:\n  std::unique_ptr<GraphicsProvider> CreateGraphicsProvider() const override;\n\n private:\n  explicit VulkanWindowDemoApp(WindowedAppContext& app_context)\n      : WindowDemoApp(app_context, \"xenia-ui-window-vulkan-demo\") {}\n};\n\nstd::unique_ptr<GraphicsProvider> VulkanWindowDemoApp::CreateGraphicsProvider()\n    const {\n  return VulkanProvider::Create(false, true);\n}\n\n}  // namespace vulkan\n}  // namespace ui\n}  // namespace xe\n\nXE_DEFINE_WINDOWED_APP(xenia_ui_window_vulkan_demo,\n                       xe::ui::vulkan::VulkanWindowDemoApp::Create);\n"
  },
  {
    "path": "src/xenia/ui/window.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/ui/window.h\"\n\n#include <algorithm>\n#include <iterator>\n\n#include \"third_party/imgui/imgui.h\"\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/clock.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/ui/imgui_drawer.h\"\n#include \"xenia/ui/presenter.h\"\n\nnamespace xe {\nnamespace ui {\n\nWindow::Window(WindowedAppContext& app_context, const std::string_view title,\n               uint32_t desired_logical_width, uint32_t desired_logical_height)\n    : app_context_(app_context),\n      title_(title),\n      desired_logical_width_(desired_logical_width),\n      desired_logical_height_(desired_logical_height) {}\n\nWindow::~Window() {\n  // In case the implementation didn't need to call EnterDestructor. Though\n  // that was likely a mistake, so placing an assertion.\n  assert_true(phase_ == Phase::kDeleting);\n  EnterDestructor();\n\n  if (presenter_) {\n    Presenter* old_presenter = presenter_;\n    // Null the pointer to prevent an infinite loop between\n    // SetWindowSurfaceFromUIThread and SetPresenter calling each other.\n    presenter_ = nullptr;\n    old_presenter->SetWindowSurfaceFromUIThread(nullptr, nullptr);\n    presenter_surface_.reset();\n  }\n\n  // Right before destruction has finished, after which no interaction with\n  // *this can be done, notify the destruction receivers that the window is\n  // being destroyed and that *this is not accessible anymore.\n  while (innermost_destruction_receiver_) {\n    innermost_destruction_receiver_->window_ = nullptr;\n    innermost_destruction_receiver_ =\n        innermost_destruction_receiver_->outer_receiver_;\n  }\n}\n\nvoid Window::AddListener(WindowListener* listener) {\n  assert_not_null(listener);\n  // Check if already added.\n  if (std::find(listeners_.cbegin(), listeners_.cend(), listener) !=\n      listeners_.cend()) {\n    return;\n  }\n  listeners_.push_back(listener);\n}\n\nvoid Window::RemoveListener(WindowListener* listener) {\n  assert_not_null(listener);\n  auto it = std::find(listeners_.cbegin(), listeners_.cend(), listener);\n  if (it == listeners_.cend()) {\n    return;\n  }\n  // Actualize the next listener indices after the erasure from the vector.\n  ListenerIterationContext* iteration_context =\n      innermost_listener_iteration_context_;\n  if (iteration_context) {\n    size_t existing_index = size_t(std::distance(listeners_.cbegin(), it));\n    while (iteration_context) {\n      if (iteration_context->next_index > existing_index) {\n        --iteration_context->next_index;\n      }\n      iteration_context = iteration_context->outer_context;\n    }\n  }\n  listeners_.erase(it);\n}\n\nvoid Window::AddInputListener(WindowInputListener* listener, size_t z_order) {\n  assert_not_null(listener);\n  // Check if already added.\n  for (auto it_existing = input_listeners_.rbegin();\n       it_existing != input_listeners_.rend(); ++it_existing) {\n    if (it_existing->second != listener) {\n      continue;\n    }\n    if (it_existing->first == z_order) {\n      return;\n    }\n    // If removing the listener that is the next in a current listener loop,\n    // skip it (in a multimap, only one element iterator is invalidated).\n    InputListenerIterationContext* iteration_context =\n        innermost_input_listener_iteration_context_;\n    while (iteration_context) {\n      if (iteration_context->next_iterator == it_existing) {\n        ++iteration_context->next_iterator;\n      }\n      iteration_context = iteration_context->outer_context;\n    }\n    input_listeners_.erase(std::prev(it_existing.base()));\n    // FIXME(Triang3l): Changing the Z order of an existing listener while\n    // already executing the listeners may cause listeners to be called twice if\n    // the Z order is lowered from one that has already been processed to one\n    // below the current one. Because nested listener calls are supported, a\n    // single last call index can't be associated with a listener to skip it if\n    // calling twice for the same event (a \"not equal to\" comparison of the call\n    // indices will result in the skipping being cancelled in the outer loop if\n    // an inner one is done, a \"greater than\" comparison will cause the inner\n    // loop to effectively terminate all outer ones).\n  }\n  auto it_new = std::prev(\n      std::make_reverse_iterator(input_listeners_.emplace(z_order, listener)));\n  // If adding to layers in between the currently being processed ones (from\n  // highest to lowest) and the previously next, make sure the new listener is\n  // executed too. Execution within one layer, however, happens in the reverse\n  // order of addition, so if adding to the Z layer currently being processed,\n  // the new listener must not be executed within the loop. But, if adding to\n  // the next Z layer after the current one, it must be executed immediately.\n  {\n    InputListenerIterationContext* iteration_context =\n        innermost_input_listener_iteration_context_;\n    while (iteration_context) {\n      if (z_order < iteration_context->current_z_order &&\n          (iteration_context->next_iterator == input_listeners_.crend() ||\n           z_order >= iteration_context->next_iterator->first)) {\n        iteration_context->next_iterator = it_new;\n      }\n      iteration_context = iteration_context->outer_context;\n    }\n  }\n}\n\nvoid Window::RemoveInputListener(WindowInputListener* listener) {\n  assert_not_null(listener);\n  for (auto it_existing = input_listeners_.rbegin();\n       it_existing != input_listeners_.rend(); ++it_existing) {\n    if (it_existing->second != listener) {\n      continue;\n    }\n    // If removing the listener that is the next in a current listener loop,\n    // skip it (in a multimap, only one element iterator is invalidated).\n    InputListenerIterationContext* iteration_context =\n        innermost_input_listener_iteration_context_;\n    while (iteration_context) {\n      if (iteration_context->next_iterator == it_existing) {\n        ++iteration_context->next_iterator;\n      }\n      iteration_context = iteration_context->outer_context;\n    }\n    input_listeners_.erase(std::prev(it_existing.base()));\n    return;\n  }\n}\n\nbool Window::Open() {\n  if (phase_ != Phase::kClosedOpenable) {\n    return true;\n  }\n\n  // For consistency of the behavior of OpenImpl and the initial On*Update\n  // that should be called as a result of it, reset the actual state to its\n  // defaults for a closed window.\n  // Note that this is performed in Open, not after closing, because there's\n  // only one entry point for opening a window, while closing may be done\n  // different ways - by actually closing, by destroying, or by failing to call\n  // OpenImpl - instead of performing this reset in every possible close case,\n  // just returning these defaults from the actual state getters if\n  // HasActualState is false.\n  actual_physical_width_ = 0;\n  actual_physical_height_ = 0;\n  has_focus_ = false;\n  phase_ = Phase::kOpening;\n  bool platform_open_result = OpenImpl();\n  if (!platform_open_result) {\n    phase_ = Phase::kClosedOpenable;\n    return false;\n  }\n  if (phase_ != Phase::kOpening) {\n    // The window was closed mid-opening.\n    return true;\n  }\n  phase_ = Phase::kOpen;\n\n  // Call the listeners (OnOpened with all the new state so the listeners are\n  // aware that they can start interacting with the open Window, and after that,\n  // in case certain listeners don't handle OnOpened, but rather, only need the\n  // more granular callbacks, make sure those callbacks receive the new state\n  // too) for the actual state of the new window (that may be different than the\n  // desired, depending on how the platform has interpreted the desired state).\n  {\n    MonitorUpdateEvent e(this, true, true);\n    OnMonitorUpdate(e);\n  }\n  {\n    UISetupEvent e(this, true);\n    WindowDestructionReceiver destruction_receiver(this);\n    SendEventToListeners([&e](auto listener) { listener->OnOpened(e); },\n                         destruction_receiver);\n    if (destruction_receiver.IsWindowDestroyedOrListenersUncallable()) {\n      return true;\n    }\n    SendEventToListeners([&e](auto listener) { listener->OnDpiChanged(e); },\n                         destruction_receiver);\n    if (destruction_receiver.IsWindowDestroyedOrListenersUncallable()) {\n      return true;\n    }\n    SendEventToListeners([&e](auto listener) { listener->OnResize(e); },\n                         destruction_receiver);\n    if (destruction_receiver.IsWindowDestroyedOrListenersUncallable()) {\n      return true;\n    }\n    if (HasFocus()) {\n      SendEventToListeners([&e](auto listener) { listener->OnGotFocus(e); },\n                           destruction_receiver);\n      if (destruction_receiver.IsWindowDestroyedOrListenersUncallable()) {\n        return true;\n      }\n    }\n  }\n\n  // May now try to create a valid surface (though the window may be in a\n  // minimized state without the possibility of creating a surface, but that\n  // will be resolved by the implementation), after OnDpiChanged and OnResize so\n  // nothing related to painting will be making wrong assumptions about the\n  // size.\n  OnSurfaceChanged(true);\n\n  return true;\n}\n\nvoid Window::SetFullscreen(bool new_fullscreen) {\n  if (fullscreen_ == new_fullscreen) {\n    return;\n  }\n  fullscreen_ = new_fullscreen;\n  if (!CanApplyState()) {\n    return;\n  }\n  WindowDestructionReceiver destruction_receiver(this);\n  ApplyNewFullscreen();\n  if (destruction_receiver.IsWindowDestroyedOrStateInapplicable()) {\n    return;\n  }\n}\n\nvoid Window::SetTitle(const std::string_view new_title) {\n  if (title_ == new_title) {\n    return;\n  }\n  title_ = new_title;\n  if (!CanApplyState()) {\n    return;\n  }\n  WindowDestructionReceiver destruction_receiver(this);\n  ApplyNewTitle();\n  if (destruction_receiver.IsWindowDestroyedOrStateInapplicable()) {\n    return;\n  }\n}\n\nvoid Window::SetIcon(const void* buffer, size_t size) {\n  bool reset = !buffer || !size;\n  WindowDestructionReceiver destruction_receiver(this);\n  LoadAndApplyIcon(reset ? nullptr : buffer, reset ? 0 : size, CanApplyState());\n  if (destruction_receiver.IsWindowDestroyedOrStateInapplicable()) {\n    return;\n  }\n}\n\nvoid Window::SetMainMenu(std::unique_ptr<MenuItem> new_main_menu) {\n  // The primary reason for this comparison (of two unique pointers) is\n  // nullptr == nullptr.\n  if (main_menu_ == new_main_menu) {\n    return;\n  }\n  // Keep the old menu object existing while it's still being detached from\n  // the platform window.\n  std::unique_ptr<MenuItem> old_main_menu = std::move(main_menu_);\n  main_menu_ = std::move(new_main_menu);\n  if (!CanApplyState()) {\n    return;\n  }\n  WindowDestructionReceiver destruction_receiver(this);\n  ApplyNewMainMenu(old_main_menu.get());\n  if (destruction_receiver.IsWindowDestroyedOrStateInapplicable()) {\n    return;\n  }\n}\n\nvoid Window::CompleteMainMenuItemsUpdate() {\n  if (!main_menu_ || !CanApplyState()) {\n    return;\n  }\n  WindowDestructionReceiver destruction_receiver(this);\n  CompleteMainMenuItemsUpdateImpl();\n  if (destruction_receiver.IsWindowDestroyedOrStateInapplicable()) {\n    return;\n  }\n}\n\nvoid Window::SetMainMenuEnabled(bool enabled) {\n  if (!main_menu_) {\n    return;\n  }\n  // Not comparing to the actual enabled state, it's a part of the MenuItem, not\n  // the Window.\n  // In case enabling (or even disabling) causes menu-related events (like\n  // pressing) that may execute callbacks potentially destroying the Window via\n  // the outer architecture.\n  WindowDestructionReceiver destruction_receiver(this);\n  main_menu_->SetEnabled(enabled);\n  if (destruction_receiver.IsWindowDestroyed()) {\n    return;\n  }\n  // Modifying the state of the items, notify the implementation so it makes the\n  // displaying of the main menu consistent.\n  CompleteMainMenuItemsUpdate();\n  if (destruction_receiver.IsWindowDestroyed()) {\n    return;\n  }\n}\n\nvoid Window::CaptureMouse() {\n  ++mouse_capture_request_count_;\n  if (!CanApplyState()) {\n    return;\n  }\n  WindowDestructionReceiver destruction_receiver(this);\n  // Call even if capturing while the mouse is already assumed to be captured,\n  // in case something has released it in the OS.\n  ApplyNewMouseCapture();\n  if (destruction_receiver.IsWindowDestroyedOrStateInapplicable()) {\n    return;\n  }\n}\n\nvoid Window::ReleaseMouse() {\n  assert_not_zero(mouse_capture_request_count_);\n  if (!mouse_capture_request_count_) {\n    return;\n  }\n  if (--mouse_capture_request_count_) {\n    return;\n  }\n  if (!CanApplyState()) {\n    return;\n  }\n  WindowDestructionReceiver destruction_receiver(this);\n  ApplyNewMouseRelease();\n  if (destruction_receiver.IsWindowDestroyedOrStateInapplicable()) {\n    return;\n  }\n}\n\nvoid Window::SetCursorVisibility(CursorVisibility new_cursor_visibility) {\n  if (cursor_visibility_ == new_cursor_visibility) {\n    return;\n  }\n  CursorVisibility old_cursor_visibility = cursor_visibility_;\n  cursor_visibility_ = new_cursor_visibility;\n  if (!CanApplyState()) {\n    return;\n  }\n  WindowDestructionReceiver destruction_receiver(this);\n  ApplyNewCursorVisibility(old_cursor_visibility);\n  if (destruction_receiver.IsWindowDestroyedOrStateInapplicable()) {\n    return;\n  }\n}\n\nvoid Window::Focus() {\n  if (!CanApplyState() || has_focus_) {\n    return;\n  }\n  WindowDestructionReceiver destruction_receiver(this);\n  FocusImpl();\n  if (destruction_receiver.IsWindowDestroyedOrStateInapplicable()) {\n    return;\n  }\n}\n\nvoid Window::SetPresenter(Presenter* presenter) {\n  if (presenter_ == presenter) {\n    return;\n  }\n  if (presenter_) {\n    presenter_->SetWindowSurfaceFromUIThread(nullptr, nullptr);\n    presenter_surface_.reset();\n  }\n  presenter_ = presenter;\n  if (presenter_) {\n    presenter_surface_ = CreateSurface(presenter_->GetSupportedSurfaceTypes());\n    presenter_->SetWindowSurfaceFromUIThread(this, presenter_surface_.get());\n  }\n}\n\nvoid Window::OnSurfaceChanged(bool new_surface_potentially_exists) {\n  if (!presenter_) {\n    return;\n  }\n\n  // Detach the presenter from the old surface before attaching to the new one.\n  if (presenter_surface_) {\n    presenter_->SetWindowSurfaceFromUIThread(this, nullptr);\n    presenter_surface_.reset();\n  }\n\n  if (!new_surface_potentially_exists) {\n    return;\n  }\n\n  presenter_surface_ = CreateSurface(presenter_->GetSupportedSurfaceTypes());\n  if (presenter_surface_) {\n    presenter_->SetWindowSurfaceFromUIThread(this, presenter_surface_.get());\n  }\n}\n\nvoid Window::OnBeforeClose(WindowDestructionReceiver& destruction_receiver) {\n  // Because events are not sent from closed windows, and to make sure the\n  // window isn't closed while its surface is still attached to the presenter,\n  // this must be called before doing what constitutes closing in the platform\n  // implementation, not after.\n\n  bool was_open = phase_ == Phase::kOpen;\n  bool was_open_or_opening = was_open || phase_ == Phase::kOpening;\n  assert_true(was_open_or_opening);\n  if (!was_open_or_opening) {\n    return;\n  }\n\n  if (was_open) {\n    phase_ = Phase::kOpenBeforeClosing;\n\n    // If the window was focused, notify the listeners that focus is being lost\n    // because the window is being closed (the implementation usually wouldn't\n    // be sending any events to the listeners after OnClosing even if the OS\n    // actually sends the focus loss event as part of the closing process).\n    OnFocusUpdate(false, destruction_receiver);\n    if (destruction_receiver.IsWindowDestroyed()) {\n      return;\n    }\n\n    {\n      UIEvent e(this);\n      SendEventToListeners([&e](auto listener) { listener->OnClosing(e); },\n                           destruction_receiver);\n      if (destruction_receiver.IsWindowDestroyed()) {\n        return;\n      }\n    }\n\n    // Disconnect from the surface without connecting to the new one (after the\n    // listeners so they don't try to reconnect afterwards).\n    OnSurfaceChanged(false);\n  }\n\n  phase_ = Phase::kClosing;\n}\n\nvoid Window::OnAfterClose() {\n  assert_true(phase_ == Phase::kClosing);\n  if (phase_ != Phase::kClosing) {\n    return;\n  }\n  phase_ = (innermost_listener_iteration_context_ ||\n            innermost_input_listener_iteration_context_)\n               ? Phase::kClosedLeavingListeners\n               : Phase::kClosedOpenable;\n}\n\nvoid Window::OnDpiChanged(UISetupEvent& e,\n                          WindowDestructionReceiver& destruction_receiver) {\n  SendEventToListeners([&e](auto listener) { listener->OnDpiChanged(e); },\n                       destruction_receiver);\n  if (destruction_receiver.IsWindowDestroyed()) {\n    return;\n  }\n}\n\nvoid Window::OnMonitorUpdate(MonitorUpdateEvent& e) {\n  if (presenter_surface_) {\n    presenter_->OnSurfaceMonitorUpdateFromUIThread(\n        e.old_monitor_potentially_disconnected());\n  }\n}\n\nbool Window::OnActualSizeUpdate(\n    uint32_t new_physical_width, uint32_t new_physical_height,\n    WindowDestructionReceiver& destruction_receiver) {\n  if (actual_physical_width_ == new_physical_width &&\n      actual_physical_height_ == new_physical_height) {\n    return false;\n  }\n  actual_physical_width_ = new_physical_width;\n  actual_physical_height_ = new_physical_height;\n  // The listeners may reference the presenter, update the presenter first.\n  if (presenter_surface_) {\n    presenter_->OnSurfaceResizeFromUIThread();\n  }\n  UISetupEvent e(this);\n  SendEventToListeners([&e](auto listener) { listener->OnResize(e); },\n                       destruction_receiver);\n  if (destruction_receiver.IsWindowDestroyed()) {\n    return true;\n  }\n  return true;\n}\n\nvoid Window::OnFocusUpdate(bool new_has_focus,\n                           WindowDestructionReceiver& destruction_receiver) {\n  if (has_focus_ == new_has_focus) {\n    return;\n  }\n  has_focus_ = new_has_focus;\n  UISetupEvent e(this);\n  if (has_focus_) {\n    SendEventToListeners([&e](auto listener) { listener->OnGotFocus(e); },\n                         destruction_receiver);\n  } else {\n    SendEventToListeners([&e](auto listener) { listener->OnLostFocus(e); },\n                         destruction_receiver);\n  }\n  if (destruction_receiver.IsWindowDestroyed()) {\n    return;\n  }\n}\n\nvoid Window::OnPaint(bool force_paint) {\n  if (is_painting_) {\n    return;\n  }\n  is_painting_ = true;\n  if (presenter_surface_) {\n    presenter_->PaintFromUIThread(force_paint);\n  }\n  is_painting_ = false;\n}\n\nvoid Window::OnFileDrop(FileDropEvent& e,\n                        WindowDestructionReceiver& destruction_receiver) {\n  SendEventToListeners([&e](auto listener) { listener->OnFileDrop(e); },\n                       destruction_receiver);\n  if (destruction_receiver.IsWindowDestroyed()) {\n    return;\n  }\n}\n\nvoid Window::OnKeyDown(KeyEvent& e,\n                       WindowDestructionReceiver& destruction_receiver) {\n  PropagateEventThroughInputListeners(\n      [&e](auto listener) {\n        listener->OnKeyDown(e);\n        return e.is_handled();\n      },\n      destruction_receiver);\n  if (destruction_receiver.IsWindowDestroyed()) {\n    return;\n  }\n}\n\nvoid Window::OnKeyUp(KeyEvent& e,\n                     WindowDestructionReceiver& destruction_receiver) {\n  PropagateEventThroughInputListeners(\n      [&e](auto listener) {\n        listener->OnKeyUp(e);\n        return e.is_handled();\n      },\n      destruction_receiver);\n  if (destruction_receiver.IsWindowDestroyed()) {\n    return;\n  }\n}\n\nvoid Window::OnKeyChar(KeyEvent& e,\n                       WindowDestructionReceiver& destruction_receiver) {\n  PropagateEventThroughInputListeners(\n      [&e](auto listener) {\n        listener->OnKeyChar(e);\n        return e.is_handled();\n      },\n      destruction_receiver);\n  if (destruction_receiver.IsWindowDestroyed()) {\n    return;\n  }\n}\n\nvoid Window::OnMouseDown(MouseEvent& e,\n                         WindowDestructionReceiver& destruction_receiver) {\n  PropagateEventThroughInputListeners(\n      [&e](auto listener) {\n        listener->OnMouseDown(e);\n        return e.is_handled();\n      },\n      destruction_receiver);\n  if (destruction_receiver.IsWindowDestroyed()) {\n    return;\n  }\n}\n\nvoid Window::OnMouseMove(MouseEvent& e,\n                         WindowDestructionReceiver& destruction_receiver) {\n  PropagateEventThroughInputListeners(\n      [&e](auto listener) {\n        listener->OnMouseMove(e);\n        return e.is_handled();\n      },\n      destruction_receiver);\n  if (destruction_receiver.IsWindowDestroyed()) {\n    return;\n  }\n}\n\nvoid Window::OnMouseUp(MouseEvent& e,\n                       WindowDestructionReceiver& destruction_receiver) {\n  PropagateEventThroughInputListeners(\n      [&e](auto listener) {\n        listener->OnMouseUp(e);\n        return e.is_handled();\n      },\n      destruction_receiver);\n  if (destruction_receiver.IsWindowDestroyed()) {\n    return;\n  }\n}\n\nvoid Window::OnMouseWheel(MouseEvent& e,\n                          WindowDestructionReceiver& destruction_receiver) {\n  PropagateEventThroughInputListeners(\n      [&e](auto listener) {\n        listener->OnMouseWheel(e);\n        return e.is_handled();\n      },\n      destruction_receiver);\n  if (destruction_receiver.IsWindowDestroyed()) {\n    return;\n  }\n}\n\nvoid Window::OnTouchEvent(TouchEvent& e,\n                          WindowDestructionReceiver& destruction_receiver) {\n  PropagateEventThroughInputListeners(\n      [&e](auto listener) {\n        listener->OnTouchEvent(e);\n        return e.is_handled();\n      },\n      destruction_receiver);\n  if (destruction_receiver.IsWindowDestroyed()) {\n    return;\n  }\n}\n\nvoid Window::SendEventToListeners(\n    std::function<void(WindowListener*)> fn,\n    WindowDestructionReceiver& destruction_receiver) {\n  if (!CanSendEventsToListeners()) {\n    return;\n  }\n  ListenerIterationContext iteration_context(\n      innermost_listener_iteration_context_);\n  innermost_listener_iteration_context_ = &iteration_context;\n  while (iteration_context.next_index < listeners_.size()) {\n    // iteration_context.next_index may be changed during the execution of the\n    // listener if the list of the listeners is modified by it - don't assume\n    // that after the call iteration_context.next_index will be the same as\n    // iteration_context.next_index + 1 before it.\n    fn(listeners_[iteration_context.next_index++]);\n    if (destruction_receiver.IsWindowDestroyed()) {\n      // The window was destroyed by the listener, can't access anything in\n      // *this anymore, including innermost_listener_iteration_context_ which\n      // has to be left in an indeterminate state.\n      return;\n    }\n    if (!CanSendEventsToListeners()) {\n      // The listener has put the window in a state in which the window can't\n      // send events anymore.\n      break;\n    }\n  }\n  assert_true(innermost_listener_iteration_context_ == &iteration_context);\n  innermost_listener_iteration_context_ =\n      innermost_listener_iteration_context_->outer_context;\n  if (phase_ == Phase::kClosedLeavingListeners &&\n      !innermost_listener_iteration_context_ &&\n      !innermost_input_listener_iteration_context_) {\n    phase_ = Phase::kClosedOpenable;\n  }\n}\n\nvoid Window::PropagateEventThroughInputListeners(\n    std::function<bool(WindowInputListener*)> fn,\n    WindowDestructionReceiver& destruction_receiver) {\n  if (!CanSendEventsToListeners()) {\n    return;\n  }\n  InputListenerIterationContext iteration_context(\n      innermost_input_listener_iteration_context_, input_listeners_.crbegin());\n  innermost_input_listener_iteration_context_ = &iteration_context;\n  while (iteration_context.next_iterator != input_listeners_.crend()) {\n    // The current iterator may be invalidated, and\n    // iteration_context.next_iterator may be changed, during the execution of\n    // the listener if the list of the listeners is modified by it - don't\n    // assume that after the call iteration_context.next_iterator will be the\n    // same as std::next(iteration_context.next_iterator) before it.\n    iteration_context.current_z_order = iteration_context.next_iterator->first;\n    bool event_handled = fn((iteration_context.next_iterator++)->second);\n    if (destruction_receiver.IsWindowDestroyed()) {\n      // The window was destroyed by the listener, can't access anything in\n      // *this anymore, including innermost_listener_iteration_context_ which\n      // has to be left in an indeterminate state.\n      return;\n    }\n    if (event_handled) {\n      break;\n    }\n    if (!CanSendEventsToListeners()) {\n      // The listener has put the window in a state in which the window can't\n      // send events anymore.\n      break;\n    }\n  }\n  assert_true(innermost_input_listener_iteration_context_ ==\n              &iteration_context);\n  innermost_input_listener_iteration_context_ =\n      innermost_input_listener_iteration_context_->outer_context;\n  if (phase_ == Phase::kClosedLeavingListeners &&\n      !innermost_listener_iteration_context_ &&\n      !innermost_input_listener_iteration_context_) {\n    phase_ = Phase::kClosedOpenable;\n  }\n}\n\n}  // namespace ui\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/ui/window.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_WINDOW_H_\n#define XENIA_UI_WINDOW_H_\n\n#include <cstddef>\n#include <cstdint>\n#include <map>\n#include <memory>\n#include <string>\n#include <utility>\n\n#include \"xenia/base/platform.h\"\n#include \"xenia/ui/menu_item.h\"\n#include \"xenia/ui/presenter.h\"\n#include \"xenia/ui/surface.h\"\n#include \"xenia/ui/ui_event.h\"\n#include \"xenia/ui/virtual_key.h\"\n#include \"xenia/ui/window_listener.h\"\n#include \"xenia/ui/windowed_app_context.h\"\n\nnamespace xe {\nnamespace ui {\n\nclass Window {\n public:\n  // Transitions between these phases is sequential and looped (and >= and <=\n  // can be used for openness checks, for closedness checks ! of >= and <= is\n  // needed due to looping), with the exception of kDeleting that may be entered\n  // from any other state (with an assertion for that not being done during\n  // kOpening though as that's extremely dangerous and would require a lot of\n  // handling in OpenImpl on all platforms) as the Window object may be deleted\n  // externally at any moment, and the Window will have no control anymore when\n  // that happens. Another exception is that the window may be closed in the\n  // platform during kOpening - in this case, it will skip kOpenBeforeClosing\n  // and go directly to kClosing and beyond.\n  enum class Phase {\n    // The window hasn't been opened yet, or has been fully closed and can be\n    // reopened.\n    // No native window - external state updates change only the desired state,\n    // don't go to the implementation immediately.\n    // No actual state.\n    // Listeners are not called.\n    kClosedOpenable,\n    // OpenImpl is being invoked, the implementation is performing initial\n    // setup.\n    // External state changes are functionally near-impossible as OpenImpl\n    // mostly isn't able to communicate with external Xenia code that may have\n    // any effect on the Window, to avoid interference during the native window\n    // setup which may be pretty complex - and also, this is the phase in which\n    // the native window is being created, so there's no guarantee that the\n    // native window exists throughout this phase.\n    // However, it's still not strictly enforceable that OpenImpl will not cause\n    // any interaction with the Window - it may happen, for instance, if\n    // OpenImpl causes the OS to execute the pending functions in the\n    // WindowedAppContext that might have been, for example, left over from when\n    // the window was still open last time. Therefore, for the reason of state\n    // consistency within OpenImpl, all external state changes are simply\n    // dropped in this phase.\n    // However, the desired state may be updated by the implementation during\n    // OpenImpl still, but via the Update functions (if the implementation or\n    // the OS, for instance, clamps the size of the window during creation, or\n    // refuses to enter fullscreen).\n    // Actual state is first populated during this phase, and it's readable\n    // (with its level of completeness at the specific point in time) for the\n    // internal purposes of the implementation.\n    // Listeners are not called so the implementation can perform all the setup\n    // without outer interference (the common code calls some to let the\n    // listeners be aware of the initial state when the window enters kOpen\n    // anyway).\n    // Note: Closing may occur in the platform during kOpening - skip\n    // kOpenBeforeClosing in this case while closing.\n    kOpening,\n    // Fully interactive.\n    // The native window exists, external state changes are applied immediately\n    // (or at least immediately requested to be applied shortly after, but the\n    // implementation must make sure that, for instance, if SetFullscreen is\n    // successfully called, but the window will actually enter fullscreen only\n    // at the next platform event loop tick, IsFullscreen will start returning\n    // true immediately).\n    // The desired state can be updated as feedback from the implementation.\n    // Actual state can be retrieved.\n    // Listeners are called.\n    // The only state in which a non-null Surface can be created (it's destroyed\n    // after entering kClosing).\n    kOpen,\n    // OnBeforeClose is being invoked.\n    // The native window still exists, this is mostly like kOpen, but with no\n    // way of creating a Surface (it's becoming destroyed in this state so the\n    // native window can be destroyed safely in the next phase) or recursively\n    // requesting closing - for consistency during closing within the platform,\n    // state changes also behave like in kOpen.\n    // Listeners are still called as normal, primarily because this is where the\n    // OnClosing listener function is invoked, but reopening the window from a\n    // listener is not possible for state consistency during closing.\n    kOpenBeforeClosing,\n    // OnBeforeClose has completed, but OnAfterClose hasn't been called yet for\n    // the implementation to confirm that it has finished destroying the native\n    // window being closed. This state exists to prevent the situation in which\n    // the Window is somehow reopened in the middle of the implementation's\n    // internal work in closing.\n    // The implementation must detach from the native window and destroy it in\n    // this phase.\n    // The native window is being destroyed - external state updates change only\n    // the desired state, don't go to the implementation immediately.\n    // Actual state is still queryable for internal purposes of the\n    // implementation.\n    // Listeners are not called.\n    kClosing,\n    // OnBeforeClose has completed, but the close has occurred from a listener,\n    // and the call stack of listeners still hasn't been exited.\n    // This state exists to prevent the situation in which the Window is being\n    // closed and then reopened in the middle of the implementation's internal\n    // work in event handlers. For example, let's assume putting a window (HWND)\n    // in the fullscreen state requires removing window decorations\n    // (SetWindowLong) and resizing the window (SetWindowPos), both being able\n    // to invoke the resize handler (WM_SIZE) and thus the resize listener. In\n    // this case, consider the following situation:\n    // - SetWindowLong called for HWND.\n    // - WM_SIZE arrives.\n    // - Listener's OnResize called.\n    // - Listener's OnResize does RequestClose, destroying the current HWND.\n    // - Listener's OnResize does Open, creating a new HWND.\n    // - SetWindowPos called for HWND, which is different now.\n    // Here, SetWindowLong will be called for one native window, but then it\n    // will be replaced, and SetWindowPos will be called for a different one.\n    // No native window - external state updates change only the desired state,\n    // don't go to the implementation immediately.\n    // No actual state.\n    // Listeners are not called.\n    kClosedLeavingListeners,\n    // The destructor has been called - should transition into this before doing\n    // anything not only in the common, but in the implementation's destructor\n    // as well. The transition must be done regardless of the previous phase as\n    // there's no way the Window can stop its destruction from now on. This is\n    // mostly similar to kClosedLeavingListeners, except there's no way to leave\n    // this phase.\n    kDeleting,\n  };\n\n  enum class CursorVisibility {\n    kVisible,\n    // Temporarily revealed, hidden if not interacting with the mouse.\n    kAutoHidden,\n    kHidden,\n  };\n\n  static std::unique_ptr<Window> Create(WindowedAppContext& app_context,\n                                        const std::string_view title,\n                                        uint32_t desired_logical_width,\n                                        uint32_t desired_logical_height);\n\n  virtual ~Window();\n\n  WindowedAppContext& app_context() const { return app_context_; }\n\n  Phase phase() const { return phase_; }\n  bool HasActualState() const {\n    // kOpening - for internal use by the implementation.\n    // kOpen, kOpenBeforeClosing - for both external and internal use.\n    // kClosing - for internal use by the implementation.\n    return phase_ >= Phase::kOpening && phase_ <= Phase::kClosing;\n  }\n\n  void AddListener(WindowListener* listener);\n  void RemoveListener(WindowListener* listener);\n  void AddInputListener(WindowInputListener* listener, size_t z_order);\n  void RemoveInputListener(WindowInputListener* listener);\n\n  // `false` is returned only in case of an error while trying to perform the\n  // platform window opening. If the window is already open, or just can't be\n  // reopened in the current phase (as in this case it's assumed that the outer\n  // will handle this situation properly and won't, for instance, leave a\n  // process without windows - it will quit the application in OnBeforeClose of\n  // the window closing of which was initiated before or even during opening,\n  // for instance), `true` is returned. The functions of WindowListeners will be\n  // called only for a newly opened platform window - and the listeners may\n  // close or even destroy the window, in which case this function will still\n  // return `true` to differentiate from an actual error - if it's really\n  // necessary that the platform window is open after the call, check phase()\n  // after calling.\n  bool Open();\n  // The call may or may not close the window immediately, depending on the\n  // platform (phase() may still return an open phase, and events may still be\n  // sent after the call). Use phase() to check if closing has actually\n  // happened immediately.\n  void RequestClose() {\n    // Don't allow external close requests during opening for state consistency\n    // inside OpenImpl (if an internal close happens during OpenImpl, the\n    // implementation will be aware of that at least), and don't allow closing\n    // twice.\n    if (phase_ != Phase::kOpen) {\n      return;\n    }\n    RequestCloseImpl();\n    // Must not doing anything else with *this as callbacks might have been\n    // triggered during closing (if it has actually even happened), and the\n    // Window might have been deleted.\n  }\n\n  // The `public` state setters are for calling from outside.\n  // The implementation must use the public getters to obtain the desired state\n  // while applying, but for updating the actual state, or for overriding the\n  // desired state, the `protected` On*Update functions must be used (overall\n  // the On* functions are for the implementation's feedback).\n\n  virtual uint32_t GetMediumDpi() const { return 96; }\n  uint32_t GetDpi() const {\n    uint32_t dpi = GetLatestDpiImpl();\n    return dpi ? dpi : GetMediumDpi();\n  }\n\n  // Round trips are not guaranteed to return the same results.\n  static constexpr uint32_t ConvertSizeDpi(uint32_t size, uint32_t new_dpi,\n                                           uint32_t old_dpi) {\n    // Always rounding up to prevent zero sizes (unless the input is zero) as\n    // well as gaps at the edge.\n    return uint32_t((uint64_t(size) * new_dpi + (old_dpi - 1)) / old_dpi);\n  }\n  uint32_t SizeToLogical(uint32_t size) const {\n    return ConvertSizeDpi(size, GetMediumDpi(), GetDpi());\n  }\n  uint32_t SizeToPhysical(uint32_t size) const {\n    return ConvertSizeDpi(size, GetDpi(), GetMediumDpi());\n  }\n  static constexpr int32_t ConvertPositionDpi(int32_t position,\n                                              uint32_t new_dpi,\n                                              uint32_t old_dpi) {\n    // Rounding to the nearest mostly similar to Windows MulDiv.\n    // Plus old_dpi / 2 for positive values, minus old_dpi / 2 for negative\n    // values for consistent rounding for both positive and negative values (as\n    // the `/` operator rounds towards zero).\n    // Example:\n    // (-3 - 1) / 3 == -1\n    // (-2 - 1) / 3 == -1\n    // (-1 - 1) / 3 == 0\n    // ---\n    // (0 + 1) / 3 == 0\n    // (1 + 1) / 3 == 0\n    // (2 + 1) / 3 == 1\n    return int32_t((int64_t(position) * new_dpi +\n                    int32_t(old_dpi >> 1) * (position < 0 ? -1 : 1)) /\n                   old_dpi);\n  }\n  int32_t PositionToLogical(int32_t position) const {\n    return ConvertPositionDpi(position, GetMediumDpi(), GetDpi());\n  }\n  int32_t PositionToPhysical(int32_t position) const {\n    return ConvertPositionDpi(position, GetDpi(), GetMediumDpi());\n  }\n\n  // The desired logical size of the window when it's not maximized, regardless\n  // of the current state of the window (maximized, fullscreen, etc.)\n  // The implementation may update it, for instance, to clamp it, or when the\n  // user resizes a non-maximized window.\n  uint32_t GetDesiredLogicalWidth() const { return desired_logical_width_; }\n  uint32_t GetDesiredLogicalHeight() const { return desired_logical_height_; }\n\n  // 0 width or height may be returned even in case of an open window with a\n  // valid non-zero-area surface depending on the platform.\n  uint32_t GetActualPhysicalWidth() const {\n    return HasActualState() ? actual_physical_width_ : 0;\n  }\n  uint32_t GetActualPhysicalHeight() const {\n    return HasActualState() ? actual_physical_height_ : 0;\n  }\n  uint32_t GetActualLogicalWidth() const {\n    return SizeToLogical(GetActualPhysicalWidth());\n  }\n  uint32_t GetActualLogicalHeight() const {\n    return SizeToLogical(GetActualPhysicalHeight());\n  }\n\n  // Desired state stored by the common Window, modifiable both externally and\n  // by the implementation (including from SetFullscreen itself).\n  bool IsFullscreen() const { return fullscreen_; }\n  void SetFullscreen(bool new_fullscreen);\n\n  // Desired state stored by the common Window, externally modifiable, read-only\n  // in the implementation.\n  const std::string& GetTitle() const { return title_; }\n  void SetTitle(const std::string_view new_title);\n\n  // Desired state stored in a platform-dependent way in the implementation,\n  // externally modifiable, read-only by the implementation unless from the\n  // LoadAndApplyIcon implementation. The icon is in Windows .ico format.\n  // Provide null buffer and / or zero size to reset the icon.\n  void SetIcon(const void* buffer, size_t size);\n  void ResetIcon() { SetIcon(nullptr, 0); }\n\n  // Desired state stored by the common Window, externally modifiable, read-only\n  // in the implementation.\n  void SetMainMenu(std::unique_ptr<MenuItem> new_main_menu);\n  void CompleteMainMenuItemsUpdate();\n  void SetMainMenuEnabled(bool enabled);\n\n  // Desired state stored by the common Window, externally modifiable, read-only\n  // in the implementation.\n  bool IsMouseCaptureRequested() const {\n    return mouse_capture_request_count_ != 0;\n  }\n  void CaptureMouse();\n  void ReleaseMouse();\n\n  // Desired state stored by the common Window, externally modifiable, read-only\n  // in the implementation.\n  CursorVisibility GetCursorVisibility() const { return cursor_visibility_; }\n  // Setting this to kAutoHidden from any _other_ visibility should hide the\n  // cursor immediately - for instance, if the external code wants to auto-hide\n  // the cursor in fullscreen, to allow going into the fullscreen mode to hide\n  // the cursor instantly.\n  void SetCursorVisibility(CursorVisibility new_cursor_visibility);\n\n  bool HasFocus() const { return HasActualState() ? has_focus_ : false; }\n  // May be applied in a delayed way or dropped at all, HasFocus will not\n  // necessarily be true immediately.\n  void Focus();\n\n  // TODO(Triang3l): A resize function, primarily for snapping externally to\n  // 1280x720, 1920x1080, and other 1:1 resolutions. It will need to resize the\n  // window (to a desired logical size - the actual physical size is entirely\n  // the feedback of the implementation) in the normal state, and possibly also\n  // un-maximize (and possibly un-fullscreen) it (but this choice will possibly\n  // need to be exposed to the caller). Because it's currently not needed, it's\n  // not implemented to avoid platform-specific complexities regarding\n  // maximization, DPI, etc.\n\n  void SetPresenter(Presenter* presenter);\n\n  // Request repainting of the surface. Can be called from non-UI threads as\n  // long as they know the Surface exists and isn't in the middle of being\n  // changed to another (the synchronization of this fact between the UI thread\n  // and the caller thread must be done externally through OnSurfaceChanged).\n  void RequestPaint() {\n    if (presenter_surface_) {\n      RequestPaintImpl();\n    }\n  }\n  void RequestPresenterUIPaintFromUIThread() {\n    if (presenter_) {\n      presenter_->RequestUIPaintFromUIThread();\n    }\n  }\n\n protected:\n  // The receiver, which must never be instantiated in the Window object itself\n  // (rather, usually it should be created as a local variable, because only\n  // LIFO-ordered creation and deletion of these is supported), that allows\n  // deletion of the Window from within an event handler (which may invoke a\n  // WindowListener, and window listeners are allowed to destroy windows; also\n  // they may execute, for instance, the functions requested to be executed in\n  // the UI thread in the WindowedAppContext, which are also allowed to destroy\n  // windows - because if the former wasn't allowed, the latter would be\n  // required to destroy windows as a result of UI interaction) to be caught by\n  // functions inside the Window in order to stop interacting with `*this` and\n  // returning after this happens.\n  // Note that the receivers are signaled in the *end* of the destruction of the\n  // common Window, when truly nothing can be done with it anymore, so it's safe\n  // to assume that right after the creation of the WindowDestructionReceiver,\n  // it will still be in an unsignaled state even if it's used somewhere in the\n  // destructor. The reason is that the users of the WindowDestructionReceiver\n  // are expected to stop accessing the Window *immediately* once\n  // IsWindowDestroyed becomes `true`, and to leave it in a potentially\n  // indeterminate state - but the code executed subsequently in the destructor\n  // may still use that state meaningfully.\n  class WindowDestructionReceiver {\n   public:\n    explicit WindowDestructionReceiver(Window* window) : window_(window) {\n      if (window_) {\n        outer_receiver_ = window_->innermost_destruction_receiver_;\n        window_->innermost_destruction_receiver_ = this;\n      }\n    }\n\n    ~WindowDestructionReceiver() {\n      // If the window is not null, removal from the stack must happen\n      // regardless of `phase_ == Phase::kDeleting`, because the window\n      // destructor iterates the receivers after EnterDestructor(), and if the\n      // receiver is not removed in this case, the destructor will do\n      // use-after-free.\n      if (window_) {\n        // Only LIFO order is supported (normally through RAII).\n        assert_true(window_->innermost_destruction_receiver_ == this);\n        window_->innermost_destruction_receiver_ = outer_receiver_;\n      }\n    }\n\n    bool IsWindowDestroyed() const { return window_ == nullptr; }\n\n    // Helper functions for common usages of the receiver. Unlike\n    // IsWindowDestroyed, these, however, may return false immediately on\n    // creation.\n    // Primarily for the implementation (most importantly its native event\n    // handler), to stop interacting with the native window given that it was\n    // possible before the function call it's guarded with.\n    bool IsWindowDestroyedOrClosed() const {\n      return IsWindowDestroyed() || window_->IsClosed();\n    }\n    // For guarding Apply* calls if one state setter needs to make multiple of\n    // them (or just detecting if it's okay to call Apply*).\n    bool IsWindowDestroyedOrStateInapplicable() const {\n      return IsWindowDestroyed() || !window_->CanApplyState();\n    }\n    bool IsWindowDestroyedOrListenersUncallable() const {\n      return IsWindowDestroyed() || !window_->CanSendEventsToListeners();\n    }\n\n   private:\n    // The Window must set window_ to nullptr in its destructor.\n    friend Window;\n    Window* window_;\n    WindowDestructionReceiver* outer_receiver_ = nullptr;\n  };\n\n  // Like in the Windows Media Player.\n  // A more modern Windows example, Movies & TV in Windows 11 21H2, has 5000,\n  // but it's too long especially for highly dynamic games.\n  // Implementations may use different values according to the platform's UX\n  // conventions.\n  static constexpr uint32_t kDefaultCursorAutoHideMilliseconds = 3333;\n\n  Window(WindowedAppContext& app_context, const std::string_view title,\n         uint32_t desired_logical_width, uint32_t desired_logical_height);\n\n  // If implementation-specific destruction happens, should be called in the\n  // beginning of the implementation's destructor so the implementation can\n  // destroy the platform window without doing something unsafe in destruction.\n  void EnterDestructor() {\n    phase_ = Phase::kDeleting;\n    // Disconnect from the surface before destroying the window behind it.\n    OnSurfaceChanged(false);\n  }\n\n  // For an open window, the implementation should return the current DPI for\n  // the window. For a non-open one, it should be the closest approximation,\n  // such as the last DPI from an existing window, the system DPI, or just the\n  // medium DPI (0 returned from it will also be treated as medium DPI).\n  virtual uint32_t GetLatestDpiImpl() const { return GetMediumDpi(); }\n\n  // Deletion of the window may (and must) not happen in OpenImpl, the listeners\n  // are deferred, so there's no need to use WindowDestructionReceiver in it.\n  // In case of failure, the implementation must not leave itself in an\n  // indeterminate state, so another attempt to open the window can be made.\n  // The implementation must apply the following desired state if it needs it,\n  // directly (not via Set* methods as they will be dropped during OpenImpl\n  // since the window is not fully open yet):\n  // - Title (GetTitle()).\n  // - Icon (from the last LoadAndApplyIcon call).\n  // - Main menu (GetMainMenu()) and its enablement.\n  // - Desired logical size (GetDesiredLogicalWidth() / Height(), taking into\n  //   account that the main menu, during the initial opening, should not be\n  //   included in this size - it specifies the client area that painting will\n  //   be done to), within the capabilities of the platform (may be clamped by\n  //   the OS, for instance - in this case, OnDesiredLogicalSizeUpdate may be\n  //   called from within OpenImpl to store the clamped size for later).\n  // - Fullscreen (GetFullscreen()) - however, if possible, the calculations\n  //   that would normally be done for a non-fullscreen window in OpenImpl\n  //   should also be done if entering fullscreen, including the menu-related\n  //   ones - first, the usual windowed geometry calculations should be done,\n  //   and then fullscreen should be entered; but preferably still entering\n  //   fullscreen before actually showing a visible window to the user for a\n  //   seamless transition.\n  // - Mouse capture (IsMouseCaptureRequested()).\n  // - Cursor visibility (GetCursorVisibility()).\n  // Also, as a result of the OpenImpl call, these function should be called\n  // (immediately from within OpenImpl directly or indirectly through the native\n  // event handling, or shortly after during the UI main loop) to provide the\n  // initial actual state to the common Window code so it returns the correct\n  // values:\n  // - OnActualSizeUpdate, at least if the window isn't opened as not yet\n  //   visible on screen (otherwise the size will be assumed to be 0x0 until the\n  //   next size update caused by something likely requiring user interaction).\n  // - OnFocusUpdate, at least if the focus has been obtained (otherwise the\n  //   window will be assumed to be not in focus until it goes into the focus\n  //   again).\n  // Also, if some of the desired state that may be updated by the\n  // implementation could not be applied (such as the fullscreen mode), and\n  // certain values of the implementation state are either normally\n  // differentiated within the implementation or are just meaningful considering\n  // the platform's defaults (for instance, the platform inherently supports\n  // only fullscreen, possibly doesn't have a concept of windows at all), it's\n  // recommended to call the appropriate On*Update functions to update the\n  // desired state to the actual one.\n  virtual bool OpenImpl() = 0;\n  virtual void RequestCloseImpl() = 0;\n\n  // Apply* are called only if CanApplyState() is true (unless the function\n  // should do more than just applying, such as also updating the desired state\n  // in a platform-dependent way - see each individual function).\n  // ApplyNew* means that the value has actually been changed to something\n  // different than it was previously.\n  virtual void ApplyNewFullscreen() {}\n  virtual void ApplyNewTitle() {}\n  // can_apply_state_in_current_phase whether the window is in a life cycle\n  // phase that would normally accept Apply calls (the native window surely\n  // exists), since this function may be called in closed states too to update\n  // the desired icon (since it's stored in the implementation) - the\n  // implementation may, however, ignore it and use a more granular check of the\n  // existence of the native window and the safety of updating the icon for\n  // better internal state consistency. The icon is in Windows .ico format. If\n  // the buffer is null or the size is 0, the icon should be reset to the\n  // default one. Returns whether the icon has been updated successfully.\n  virtual void LoadAndApplyIcon(const void* buffer, size_t size,\n                                bool can_apply_state_in_current_phase) {}\n  MenuItem* GetMainMenu() const { return main_menu_.get(); }\n  // May be called to add, replace or remove the main menu.\n  virtual void ApplyNewMainMenu(MenuItem* old_main_menu) {}\n  // If there's main menu, and state can be applied, will be called to make the\n  // implementation's state consistent with the new state of the MenuItems of\n  // the main menu after changes have been made to them.\n  virtual void CompleteMainMenuItemsUpdateImpl() {}\n  // Will be called even if capturing while the mouse is already assumed to be\n  // captured, in case something has released it in the OS.\n  virtual void ApplyNewMouseCapture() {}\n  virtual void ApplyNewMouseRelease() {}\n  virtual void ApplyNewCursorVisibility(\n      CursorVisibility old_cursor_visibility) {}\n  // If state can be applied, this is called to request bringing the window into\n  // focus (and once that's done by the OS, update the actual focus state). Does\n  // nothing otherwise (focus can't be requested before the window is open, a\n  // closed window is always assumed to be not in focus).\n  virtual void FocusImpl() {}\n\n  Presenter* presenter() const { return presenter_; }\n  bool HasSurface() const { return presenter_surface_ != nullptr; }\n  // If new_surface_potentially_exists is false, creation of the new surface for\n  // the window won't be updated, and it may be called from the destructor (via\n  // EnterDestructor to destroy the surface before destroying what it depends\n  // on) as no virtual functions (including CreateSurface) will be called.\n  // This function is nonvirtual itself for this reason as well.\n  void OnSurfaceChanged(bool new_surface_potentially_exists);\n  // Called only for an open window.\n  virtual std::unique_ptr<Surface> CreateSurfaceImpl(\n      Surface::TypeFlags allowed_types) = 0;\n  // Called only if the Surface exists.\n  virtual void RequestPaintImpl() = 0;\n\n  // Will also disconnect the surface if needed.\n  void OnBeforeClose(WindowDestructionReceiver& destruction_receiver);\n  void OnAfterClose();\n\n  // These functions may usually also be called as part of the opening process\n  // from within OpenImpl (directly or through the platform event handler\n  // invoked during it) to actualize the state for the newly createad window,\n  // especially if it's different than the desired one.\n  void OnDpiChanged(UISetupEvent& e,\n                    WindowDestructionReceiver& destruction_receiver);\n  void OnMonitorUpdate(MonitorUpdateEvent& e);\n  // For calling when the platform changes something in the non-maximized,\n  // non-fullscreen size of the window.\n  void OnDesiredLogicalSizeUpdate(uint32_t new_desired_logical_width,\n                                  uint32_t new_desired_logical_height) {\n    desired_logical_width_ = new_desired_logical_width;\n    desired_logical_height_ = new_desired_logical_height;\n  }\n  // If the size of the client area is the same as the currently assumed one\n  // (the desired / last size for a newly opened / reopened window, the last\n  // actual size for an already open window), does nothing and returns false.\n  // Otherwise, updates the size, notifies what depends on the size about the\n  // change, and returns true. Not storing the new size in the UISetupEvent\n  // because a resize listener may request another resize, in which case it will\n  // be outdated - listeners must query the new physical size from the window\n  // explicitly.\n  bool OnActualSizeUpdate(uint32_t new_physical_width,\n                          uint32_t new_physical_height,\n                          WindowDestructionReceiver& destruction_receiver);\n  void OnDesiredFullscreenUpdate(bool new_fullscreen) {\n    fullscreen_ = new_fullscreen;\n  }\n  void OnFocusUpdate(bool new_has_focus,\n                     WindowDestructionReceiver& destruction_receiver);\n\n  // Pass true as force_paint in case the platform can't retain the image from\n  // the previous paint so it won't be skipped if there are no content updates.\n  void OnPaint(bool force_paint = false);\n\n  void OnFileDrop(FileDropEvent& e,\n                  WindowDestructionReceiver& destruction_receiver);\n\n  void OnKeyDown(KeyEvent& e, WindowDestructionReceiver& destruction_receiver);\n  void OnKeyUp(KeyEvent& e, WindowDestructionReceiver& destruction_receiver);\n  void OnKeyChar(KeyEvent& e, WindowDestructionReceiver& destruction_receiver);\n\n  void OnMouseDown(MouseEvent& e,\n                   WindowDestructionReceiver& destruction_receiver);\n  void OnMouseMove(MouseEvent& e,\n                   WindowDestructionReceiver& destruction_receiver);\n  void OnMouseUp(MouseEvent& e,\n                 WindowDestructionReceiver& destruction_receiver);\n  void OnMouseWheel(MouseEvent& e,\n                    WindowDestructionReceiver& destruction_receiver);\n\n  void OnTouchEvent(TouchEvent& e,\n                    WindowDestructionReceiver& destruction_receiver);\n\n private:\n  struct ListenerIterationContext {\n    explicit ListenerIterationContext(ListenerIterationContext* outer_context,\n                                      size_t first_index = 0)\n        : outer_context(outer_context), next_index(first_index) {}\n    // To support nested listener calls, in case a listener does some\n    // interaction with the window that results in more events being triggered\n    // (such as calling Windows API functions that return a result from a\n    // message handled by a window, rather that simply enqueueing the message).\n    ListenerIterationContext* outer_context;\n    // Using indices, not iterators, because after the erasure, the adjustment\n    // must be done for the vector element indices that would be in the iterator\n    // range that would be invalidated.\n    size_t next_index;\n  };\n\n  struct InputListenerIterationContext {\n    explicit InputListenerIterationContext(\n        InputListenerIterationContext* outer_context,\n        std::multimap<size_t, WindowInputListener*>::const_reverse_iterator\n            first_iterator,\n        size_t first_z_order = SIZE_MAX)\n        : outer_context(outer_context),\n          next_iterator(first_iterator),\n          current_z_order(first_z_order) {}\n    // To support nested listener calls.\n    InputListenerIterationContext* outer_context;\n    // Reverse iterator because input handlers with a higher Z order index may\n    // correspond to what's displayed on top of what has a lower Z order index,\n    // so what's higher may consum the event.\n    std::multimap<size_t, WindowInputListener*>::const_reverse_iterator\n        next_iterator;\n    size_t current_z_order;\n  };\n\n  // If the window is closed, the platform native window is either being\n  // destroyed, or doesn't exist anymore, and thus it's in a non-interactive\n  // state.\n  bool IsClosed() const {\n    return phase_ < Phase::kOpening && phase_ > Phase::kOpenBeforeClosing;\n  }\n\n  bool CanApplyState() const {\n    // In kOpening, OpenImpl itself pulls the desired state itself and applies\n    // it, the Apply* functions can't be called and are unsafe to call because\n    // the implementation is an incomplete state, with the platform window\n    // potentially not existing. In kOpenBeforeClosing, as the native window\n    // still hasn't been destroyed and it can receive new state, still allowing\n    // applying new state for more consistency between the desired and the\n    // actual state during the final listener invocation.\n    return phase_ >= Phase::kOpen && phase_ <= Phase::kOpenBeforeClosing;\n  }\n\n  bool CanSendEventsToListeners() const {\n    return phase_ >= Phase::kOpen && phase_ <= Phase::kOpenBeforeClosing;\n  }\n  // The listeners may delete the Window - check the destruction receiver after\n  // calling and stop doing anything accessing *this if that happens.\n  void SendEventToListeners(std::function<void(WindowListener*)> fn,\n                            WindowDestructionReceiver& destruction_receiver);\n  void PropagateEventThroughInputListeners(\n      std::function<bool(WindowInputListener*)> fn,\n      WindowDestructionReceiver& destruction_receiver);\n\n  std::unique_ptr<Surface> CreateSurface(Surface::TypeFlags allowed_types) {\n    // If opening, surface creation is deferred until all the initial setup has\n    // completed. Destruction of the surface is also a part of the closing\n    // process in OnBeforeClose.\n    if (phase_ != Phase::kOpen) {\n      return nullptr;\n    }\n    return CreateSurfaceImpl(allowed_types);\n  }\n\n  WindowedAppContext& app_context_;\n\n  Phase phase_ = Phase::kClosedOpenable;\n  WindowDestructionReceiver* innermost_destruction_receiver_ = nullptr;\n\n  // All currently-attached listeners that get event notifications.\n  std::vector<WindowListener*> listeners_;\n  // Ordered by the Z order, and then by the time of addition (but executed in\n  // reverse order).\n  // Note: All the iteration logic involving this Z ordering must be the same as\n  // in drawing (in the UI drawers in the Presenter), but in reverse.\n  std::multimap<size_t, WindowInputListener*> input_listeners_;\n  // Linked list-based stacks of the contexts of the listener iterations\n  // currently being done, usually allocated on the stack.\n  ListenerIterationContext* innermost_listener_iteration_context_ = nullptr;\n  InputListenerIterationContext* innermost_input_listener_iteration_context_ =\n      nullptr;\n\n  uint32_t desired_logical_width_ = 0;\n  uint32_t desired_logical_height_ = 0;\n  // Set by the implementation via OnActualSizeUpdate (from OpenImpl or from the\n  // platform resize handler).\n  uint32_t actual_physical_width_ = 0;\n  uint32_t actual_physical_height_ = 0;\n\n  bool fullscreen_ = false;\n\n  std::string title_;\n\n  std::unique_ptr<MenuItem> main_menu_;\n\n  uint32_t mouse_capture_request_count_ = 0;\n\n  CursorVisibility cursor_visibility_ = CursorVisibility::kVisible;\n\n  bool has_focus_ = false;\n\n  Presenter* presenter_ = nullptr;\n  std::unique_ptr<Surface> presenter_surface_;\n  // Whether currently in InPaint to prevent recursive painting in case it's\n  // triggered somehow from within painting again, because painting is much more\n  // complex than just a small state update, and recursive painting is\n  // completely unsupported by the Presenter.\n  bool is_painting_ = false;\n};\n\n}  // namespace ui\n}  // namespace xe\n\n#endif  // XENIA_UI_WINDOW_H_\n"
  },
  {
    "path": "src/xenia/ui/window_android.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/ui/window_android.h\"\n\n#include <android/input.h>\n#include <jni.h>\n#include <algorithm>\n#include <cstdint>\n#include <memory>\n#include <utility>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/ui/surface_android.h\"\n#include \"xenia/ui/windowed_app_context_android.h\"\n\nnamespace xe {\nnamespace ui {\n\nstd::unique_ptr<Window> Window::Create(WindowedAppContext& app_context,\n                                       const std::string_view title,\n                                       uint32_t desired_logical_width,\n                                       uint32_t desired_logical_height) {\n  return std::make_unique<AndroidWindow>(\n      app_context, title, desired_logical_width, desired_logical_height);\n}\n\nAndroidWindow::~AndroidWindow() {\n  EnterDestructor();\n  auto& android_app_context =\n      static_cast<AndroidWindowedAppContext&>(app_context());\n  if (android_app_context.GetActivityWindow() == this) {\n    android_app_context.SetActivityWindow(nullptr);\n  }\n}\n\nvoid AndroidWindow::OnActivitySurfaceLayoutChange() {\n  auto& android_app_context =\n      static_cast<const AndroidWindowedAppContext&>(app_context());\n  assert_true(android_app_context.GetActivityWindow() == this);\n  uint32_t physical_width =\n      uint32_t(android_app_context.window_surface_layout_right() -\n               android_app_context.window_surface_layout_left());\n  uint32_t physical_height =\n      uint32_t(android_app_context.window_surface_layout_bottom() -\n               android_app_context.window_surface_layout_top());\n  OnDesiredLogicalSizeUpdate(SizeToLogical(physical_width),\n                             SizeToLogical(physical_height));\n  WindowDestructionReceiver destruction_receiver(this);\n  OnActualSizeUpdate(physical_width, physical_height, destruction_receiver);\n  if (destruction_receiver.IsWindowDestroyedOrClosed()) {\n    return;\n  }\n}\n\nbool AndroidWindow::OnActivitySurfaceMotionEvent(jobject event) {\n  auto& android_app_context =\n      static_cast<const AndroidWindowedAppContext&>(app_context());\n  JNIEnv* jni_env = android_app_context.ui_thread_jni_env();\n  const AndroidWindowedAppContext::JniIDs& jni_ids =\n      android_app_context.jni_ids();\n\n  int32_t source =\n      jni_env->CallIntMethod(event, jni_ids.motion_event_get_source);\n\n  switch (source) {\n    case AINPUT_SOURCE_TOUCHSCREEN: {\n      // Returning true for all touch events regardless of whether they have\n      // been handled to keep receiving touch events for the pointers in the\n      // event (if returning false for a down event, no more events will be sent\n      // for the pointers in it), and also because there are multiple pointers\n      // in a single event, and different handler invocations may result in\n      // different is_handled.\n      WindowDestructionReceiver destruction_receiver(this);\n      int32_t action_and_pointer_index =\n          jni_env->CallIntMethod(event, jni_ids.motion_event_get_action);\n      int32_t action = action_and_pointer_index & AMOTION_EVENT_ACTION_MASK;\n      // For pointer ACTION_POINTER_DOWN and ACTION_POINTER_UP.\n      int32_t pointer_index = (action_and_pointer_index &\n                               AMOTION_EVENT_ACTION_POINTER_INDEX_MASK) >>\n                              AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;\n      if (action == AMOTION_EVENT_ACTION_POINTER_DOWN ||\n          action == AMOTION_EVENT_ACTION_POINTER_UP) {\n        int32_t touch_pointer_index =\n            (action_and_pointer_index &\n             AMOTION_EVENT_ACTION_POINTER_INDEX_MASK) >>\n            AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;\n        TouchEvent e(\n            this,\n            jni_env->CallIntMethod(event, jni_ids.motion_event_get_pointer_id,\n                                   touch_pointer_index),\n            (action == AMOTION_EVENT_ACTION_POINTER_DOWN)\n                ? TouchEvent::Action::kDown\n                : TouchEvent::Action::kUp,\n            jni_env->CallFloatMethod(event, jni_ids.motion_event_get_x,\n                                     pointer_index),\n            jni_env->CallFloatMethod(event, jni_ids.motion_event_get_y,\n                                     pointer_index));\n        OnTouchEvent(e, destruction_receiver);\n        if (destruction_receiver.IsWindowDestroyed()) {\n          return true;\n        }\n      } else {\n        TouchEvent::Action touch_event_action;\n        switch (action) {\n          case AMOTION_EVENT_ACTION_DOWN:\n            touch_event_action = TouchEvent::Action::kDown;\n            break;\n          case AMOTION_EVENT_ACTION_UP:\n            touch_event_action = TouchEvent::Action::kUp;\n            break;\n          case AMOTION_EVENT_ACTION_MOVE:\n            touch_event_action = TouchEvent::Action::kMove;\n            break;\n          case AMOTION_EVENT_ACTION_CANCEL:\n            touch_event_action = TouchEvent::Action::kCancel;\n            break;\n          default:\n            return true;\n        }\n        int32_t touch_pointer_count = jni_env->CallIntMethod(\n            event, jni_ids.motion_event_get_pointer_count);\n        for (int32_t i = 0; i < touch_pointer_count; ++i) {\n          TouchEvent e(\n              this,\n              jni_env->CallIntMethod(event, jni_ids.motion_event_get_pointer_id,\n                                     i),\n              touch_event_action,\n              jni_env->CallFloatMethod(event, jni_ids.motion_event_get_x, i),\n              jni_env->CallFloatMethod(event, jni_ids.motion_event_get_y, i));\n          OnTouchEvent(e, destruction_receiver);\n          if (destruction_receiver.IsWindowDestroyed()) {\n            return true;\n          }\n        }\n      }\n      return true;\n    } break;\n\n    case AINPUT_SOURCE_MOUSE: {\n      WindowDestructionReceiver destruction_receiver(this);\n      // X and Y can be outside the View (have negative coordinates, or beyond\n      // the size of the element), and not only for ACTION_HOVER_EXIT (it's\n      // predeced by ACTION_HOVER_MOVE, at least on Android API level 30, also\n      // with out-of-bounds coordinates), when moving the mouse outside the\n      // View, or when starting moving the mouse when the pointer was previously\n      // outside the View in some cases.\n      int32_t mouse_x =\n          int32_t(xe::clamp_float(jni_env->CallFloatMethod(\n                                      event, jni_ids.motion_event_get_x, 0),\n                                  0.0f, float(GetActualPhysicalWidth())) +\n                  0.5f);\n      int32_t mouse_y =\n          int32_t(xe::clamp_float(jni_env->CallFloatMethod(\n                                      event, jni_ids.motion_event_get_y, 0),\n                                  0.0f, float(GetActualPhysicalHeight())) +\n                  0.5f);\n      static const MouseEvent::Button kMouseEventButtons[] = {\n          MouseEvent::Button::kLeft,   MouseEvent::Button::kRight,\n          MouseEvent::Button::kMiddle, MouseEvent::Button::kX1,\n          MouseEvent::Button::kX2,\n      };\n      static constexpr uint32_t kUsedMouseButtonMask =\n          (UINT32_C(1) << xe::countof(kMouseEventButtons)) - 1;\n      uint32_t new_mouse_button_state = uint32_t(\n          jni_env->CallIntMethod(event, jni_ids.motion_event_get_button_state));\n      // OnMouseUp.\n      uint32_t mouse_buttons_remaining =\n          mouse_button_state_ & ~new_mouse_button_state & kUsedMouseButtonMask;\n      uint32_t mouse_button_index;\n      while (\n          xe::bit_scan_forward(mouse_buttons_remaining, &mouse_button_index)) {\n        mouse_buttons_remaining &= ~(UINT32_C(1) << mouse_button_index);\n        MouseEvent e(this, kMouseEventButtons[mouse_button_index], mouse_x,\n                     mouse_y);\n        OnMouseUp(e, destruction_receiver);\n        if (destruction_receiver.IsWindowDestroyed()) {\n          return true;\n        }\n      }\n      // Generic OnMouseMove regardless of the action since any event can\n      // provide new coordinates.\n      {\n        MouseEvent e(this, MouseEvent::Button::kNone, mouse_x, mouse_y);\n        OnMouseMove(e, destruction_receiver);\n        if (destruction_receiver.IsWindowDestroyed()) {\n          return true;\n        }\n      }\n      // OnMouseWheel.\n      // The axis value may be outside -1...1 if multiple scrolls have occurred\n      // quickly.\n      int32_t scroll_x = int32_t(\n          jni_env->CallFloatMethod(event, jni_ids.motion_event_get_axis_value,\n                                   AMOTION_EVENT_AXIS_HSCROLL, 0) *\n          float(MouseEvent::kScrollPerDetent));\n      int32_t scroll_y = int32_t(\n          jni_env->CallFloatMethod(event, jni_ids.motion_event_get_axis_value,\n                                   AMOTION_EVENT_AXIS_VSCROLL, 0) *\n          float(MouseEvent::kScrollPerDetent));\n      if (scroll_x || scroll_y) {\n        MouseEvent e(this, MouseEvent::Button::kNone, mouse_x, mouse_y,\n                     scroll_x, scroll_y);\n        OnMouseWheel(e, destruction_receiver);\n        if (destruction_receiver.IsWindowDestroyed()) {\n          return true;\n        }\n      }\n      // OnMouseDown.\n      mouse_buttons_remaining =\n          new_mouse_button_state & ~mouse_button_state_ & kUsedMouseButtonMask;\n      while (\n          xe::bit_scan_forward(mouse_buttons_remaining, &mouse_button_index)) {\n        mouse_buttons_remaining &= ~(UINT32_C(1) << mouse_button_index);\n        MouseEvent e(this, kMouseEventButtons[mouse_button_index], mouse_x,\n                     mouse_y);\n        OnMouseDown(e, destruction_receiver);\n        if (destruction_receiver.IsWindowDestroyed()) {\n          return true;\n        }\n      }\n      // Update the button state for state differences.\n      mouse_button_state_ = new_mouse_button_state;\n      return true;\n    } break;\n  }\n\n  return false;\n}\n\nuint32_t AndroidWindow::GetLatestDpiImpl() const {\n  auto& android_app_context =\n      static_cast<const AndroidWindowedAppContext&>(app_context());\n  return android_app_context.GetPixelDensity();\n}\n\nbool AndroidWindow::OpenImpl() {\n  // Reset the input.\n  mouse_button_state_ = 0;\n\n  // The window is a proxy between the main activity and Xenia, so there can be\n  // only one open window for an activity.\n  auto& android_app_context =\n      static_cast<AndroidWindowedAppContext&>(app_context());\n  AndroidWindow* previous_activity_window =\n      android_app_context.GetActivityWindow();\n  assert_null(previous_activity_window);\n  if (previous_activity_window) {\n    // Don't detach the old window as it's assuming it's still attached while\n    // it's in an open phase.\n    return false;\n  }\n  android_app_context.SetActivityWindow(this);\n\n  // Report the initial layout.\n  OnActivitySurfaceLayoutChange();\n\n  return true;\n}\n\nvoid AndroidWindow::RequestCloseImpl() {\n  // Finishing the Activity would cause the entire WindowedAppContext to quit,\n  // which is not the same behavior as on other platforms - the\n  // WindowedAppContext quit is done explicitly by the listeners during\n  // OnClosing if needed (the main Window is potentially being changed to a\n  // different one, for instance). Therefore, only detach the window from the\n  // app context.\n\n  WindowDestructionReceiver destruction_receiver(this);\n  OnBeforeClose(destruction_receiver);\n  if (destruction_receiver.IsWindowDestroyed()) {\n    return;\n  }\n  OnAfterClose();\n\n  auto& android_app_context =\n      static_cast<AndroidWindowedAppContext&>(app_context());\n  if (android_app_context.GetActivityWindow() == this) {\n    android_app_context.SetActivityWindow(nullptr);\n  }\n}\n\nstd::unique_ptr<Surface> AndroidWindow::CreateSurfaceImpl(\n    Surface::TypeFlags allowed_types) {\n  if (allowed_types & Surface::kTypeFlag_AndroidNativeWindow) {\n    auto& android_app_context =\n        static_cast<const AndroidWindowedAppContext&>(app_context());\n    assert_true(android_app_context.GetActivityWindow() == this);\n    ANativeWindow* activity_window_surface =\n        android_app_context.GetWindowSurface();\n    if (activity_window_surface) {\n      return std::make_unique<AndroidNativeWindowSurface>(\n          activity_window_surface);\n    }\n  }\n  return nullptr;\n}\n\nvoid AndroidWindow::RequestPaintImpl() {\n  auto& android_app_context =\n      static_cast<AndroidWindowedAppContext&>(app_context());\n  assert_true(android_app_context.GetActivityWindow() == this);\n  android_app_context.PostInvalidateWindowSurface();\n}\n\nstd::unique_ptr<ui::MenuItem> MenuItem::Create(Type type,\n                                               const std::string& text,\n                                               const std::string& hotkey,\n                                               std::function<void()> callback) {\n  return std::make_unique<AndroidMenuItem>(type, text, hotkey, callback);\n}\n\n}  // namespace ui\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/ui/window_android.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_WINDOW_ANDROID_H_\n#define XENIA_UI_WINDOW_ANDROID_H_\n\n#include <jni.h>\n\n#include \"xenia/ui/menu_item.h\"\n#include \"xenia/ui/window.h\"\n\nnamespace xe {\nnamespace ui {\n\nclass AndroidWindow : public Window {\n public:\n  // Several state-related functions are left unimplemented because the layout\n  // is configured from XML and Java.\n\n  AndroidWindow(WindowedAppContext& app_context, const std::string_view title,\n                uint32_t desired_logical_width, uint32_t desired_logical_height)\n      : Window(app_context, title, desired_logical_width,\n               desired_logical_height) {}\n  ~AndroidWindow();\n\n  uint32_t GetMediumDpi() const override { return 160; }\n\n  void OnActivitySurfaceLayoutChange();\n  bool OnActivitySurfaceMotionEvent(jobject event);\n  void OnActivitySurfaceChanged() { OnSurfaceChanged(true); }\n  void PaintActivitySurface(bool force_paint) { OnPaint(force_paint); }\n\n protected:\n  uint32_t GetLatestDpiImpl() const override;\n\n  bool OpenImpl() override;\n  void RequestCloseImpl() override;\n\n  std::unique_ptr<Surface> CreateSurfaceImpl(\n      Surface::TypeFlags allowed_types) override;\n  void RequestPaintImpl() override;\n\n private:\n  uint32_t mouse_button_state_ = 0;\n};\n\n// Dummy for the menu item - menus are controlled by the layout.\n// TODO(Triang3l): Make something like MenuItem work as the basic common action\n// interface for Java buttons.\nclass AndroidMenuItem final : public MenuItem {\n public:\n  AndroidMenuItem(Type type, const std::string& text, const std::string& hotkey,\n                  std::function<void()> callback)\n      : MenuItem(type, text, hotkey, callback) {}\n};\n\n}  // namespace ui\n}  // namespace xe\n\n#endif  // XENIA_UI_WINDOW_ANDROID_H_\n"
  },
  {
    "path": "src/xenia/ui/window_demo.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include <cstring>\n\n#include \"third_party/imgui/imgui.h\"\n#include \"xenia/base/clock.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/profiling.h\"\n#include \"xenia/base/threading.h\"\n#include \"xenia/ui/graphics_provider.h\"\n#include \"xenia/ui/imgui_dialog.h\"\n#include \"xenia/ui/imgui_drawer.h\"\n#include \"xenia/ui/presenter.h\"\n#include \"xenia/ui/ui_event.h\"\n#include \"xenia/ui/virtual_key.h\"\n#include \"xenia/ui/window.h\"\n#include \"xenia/ui/window_demo.h\"\n\nnamespace xe {\nnamespace ui {\n\nWindowDemoApp::~WindowDemoApp() { Profiler::Shutdown(); }\n\nbool WindowDemoApp::OnInitialize() {\n  Profiler::Initialize();\n  Profiler::ThreadEnter(\"Main\");\n\n  // Create the graphics provider that provides the presenter for the window.\n  graphics_provider_ = CreateGraphicsProvider();\n  if (!graphics_provider_) {\n    XELOGE(\"Failed to initialize the graphics provider\");\n    return false;\n  }\n\n  enum : size_t {\n    kZOrderImGui,\n    kZOrderProfiler,\n    kZOrderWindowDemoInput,\n  };\n\n  // Create the window.\n  window_ = xe::ui::Window::Create(app_context(), GetName(), 1920, 1200);\n  window_->AddListener(&window_listener_);\n  window_->AddInputListener(&window_listener_, kZOrderWindowDemoInput);\n\n  // Main menu.\n  auto main_menu = MenuItem::Create(MenuItem::Type::kNormal);\n  auto file_menu = MenuItem::Create(MenuItem::Type::kPopup, \"&File\");\n  {\n    file_menu->AddChild(\n        MenuItem::Create(MenuItem::Type::kString, \"&Close\", \"Alt+F4\",\n                         [this]() { window_->RequestClose(); }));\n  }\n  main_menu->AddChild(std::move(file_menu));\n  auto debug_menu = MenuItem::Create(MenuItem::Type::kPopup, \"&Debug\");\n  {\n    debug_menu->AddChild(MenuItem::Create(MenuItem::Type::kString,\n                                          \"Toggle Profiler &Display\", \"F3\",\n                                          []() { Profiler::ToggleDisplay(); }));\n    debug_menu->AddChild(MenuItem::Create(MenuItem::Type::kString,\n                                          \"&Pause/Resume Profiler\", \"`\",\n                                          []() { Profiler::TogglePause(); }));\n  }\n  main_menu->AddChild(std::move(debug_menu));\n  window_->SetMainMenu(std::move(main_menu));\n\n  // Open the window once it's configured.\n  if (!window_->Open()) {\n    XELOGE(\"Failed to open the main window\");\n    return false;\n  }\n\n  // Setup drawing to the window.\n\n  presenter_ = graphics_provider_->CreatePresenter();\n  if (!presenter_) {\n    XELOGE(\"Failed to initialize the presenter\");\n    return false;\n  }\n\n  immediate_drawer_ = graphics_provider_->CreateImmediateDrawer();\n  if (!immediate_drawer_) {\n    XELOGE(\"Failed to initialize the immediate drawer\");\n    return false;\n  }\n  immediate_drawer_->SetPresenter(presenter_.get());\n\n  imgui_drawer_ = std::make_unique<ImGuiDrawer>(window_.get(), kZOrderImGui);\n  imgui_drawer_->SetPresenterAndImmediateDrawer(presenter_.get(),\n                                                immediate_drawer_.get());\n  demo_dialog_ = std::make_unique<WindowDemoDialog>(imgui_drawer_.get());\n\n  Profiler::SetUserIO(kZOrderProfiler, window_.get(), presenter_.get(),\n                      immediate_drawer_.get());\n\n  window_->SetPresenter(presenter_.get());\n\n  return true;\n}\n\nvoid WindowDemoApp::WindowDemoWindowListener::OnClosing(UIEvent& e) {\n  app_context_.QuitFromUIThread();\n}\n\nvoid WindowDemoApp::WindowDemoWindowListener::OnKeyDown(KeyEvent& e) {\n  switch (e.virtual_key()) {\n    case VirtualKey::kF3:\n      Profiler::ToggleDisplay();\n      break;\n    default:\n      return;\n  }\n  e.set_handled(true);\n}\n\nvoid WindowDemoApp::WindowDemoDialog::OnDraw(ImGuiIO& io) {\n  ImGui::ShowDemoWindow();\n  ImGui::ShowMetricsWindow();\n}\n\n}  // namespace ui\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/ui/window_demo.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_WINDOW_DEMO_H_\n#define XENIA_UI_WINDOW_DEMO_H_\n\n#include <memory>\n#include <string>\n\n#include \"xenia/ui/graphics_provider.h\"\n#include \"xenia/ui/imgui_dialog.h\"\n#include \"xenia/ui/imgui_drawer.h\"\n#include \"xenia/ui/immediate_drawer.h\"\n#include \"xenia/ui/presenter.h\"\n#include \"xenia/ui/window.h\"\n#include \"xenia/ui/window_listener.h\"\n#include \"xenia/ui/windowed_app.h\"\n\nnamespace xe {\nnamespace ui {\n\nclass WindowDemoApp : public WindowedApp {\n public:\n  ~WindowDemoApp();\n\n  bool OnInitialize() override;\n\n protected:\n  explicit WindowDemoApp(WindowedAppContext& app_context,\n                         const std::string_view name)\n      : WindowedApp(app_context, name), window_listener_(app_context) {}\n\n  virtual std::unique_ptr<GraphicsProvider> CreateGraphicsProvider() const = 0;\n\n private:\n  class WindowDemoWindowListener final : public WindowListener,\n                                         public WindowInputListener {\n   public:\n    explicit WindowDemoWindowListener(WindowedAppContext& app_context)\n        : app_context_(app_context) {}\n\n    void OnClosing(UIEvent& e) override;\n\n    void OnKeyDown(KeyEvent& e) override;\n\n   private:\n    WindowedAppContext& app_context_;\n  };\n\n  class WindowDemoDialog final : public ImGuiDialog {\n   public:\n    explicit WindowDemoDialog(ImGuiDrawer* imgui_drawer)\n        : ImGuiDialog(imgui_drawer) {}\n\n   protected:\n    void OnDraw(ImGuiIO& io) override;\n  };\n\n  WindowDemoWindowListener window_listener_;\n  std::unique_ptr<GraphicsProvider> graphics_provider_;\n  std::unique_ptr<Window> window_;\n  std::unique_ptr<Presenter> presenter_;\n  std::unique_ptr<ImmediateDrawer> immediate_drawer_;\n  std::unique_ptr<ImGuiDrawer> imgui_drawer_;\n  std::unique_ptr<WindowDemoDialog> demo_dialog_;\n};\n\n}  // namespace ui\n}  // namespace xe\n\n#endif  // XENIA_UI_WINDOW_DEMO_H_\n"
  },
  {
    "path": "src/xenia/ui/window_gtk.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include <algorithm>\n#include <string>\n\n#include <X11/Xlib-xcb.h>\n#include <gdk/gdkx.h>\n#include <xcb/xcb.h>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/platform_linux.h\"\n#include \"xenia/ui/surface_gnulinux.h\"\n#include \"xenia/ui/virtual_key.h\"\n#include \"xenia/ui/window_gtk.h\"\n\nnamespace xe {\nnamespace ui {\n\nstd::unique_ptr<Window> Window::Create(WindowedAppContext& app_context,\n                                       const std::string_view title,\n                                       uint32_t desired_logical_width,\n                                       uint32_t desired_logical_height) {\n  return std::make_unique<GTKWindow>(app_context, title, desired_logical_width,\n                                     desired_logical_height);\n}\n\nGTKWindow::GTKWindow(WindowedAppContext& app_context,\n                     const std::string_view title,\n                     uint32_t desired_logical_width,\n                     uint32_t desired_logical_height)\n    : Window(app_context, title, desired_logical_width,\n             desired_logical_height) {}\n\nGTKWindow::~GTKWindow() {\n  EnterDestructor();\n  if (window_) {\n    // Set window_ to null to ignore events from now on since this ui::GTKWindow\n    // is entering an indeterminate state.\n    GtkWidget* window = window_;\n    window_ = nullptr;\n    // Destroying the top-level window also destroys its children.\n    drawing_area_ = nullptr;\n    box_ = nullptr;\n    gtk_widget_destroy(window);\n  }\n}\n\nbool GTKWindow::OpenImpl() {\n  window_ = gtk_window_new(GTK_WINDOW_TOPLEVEL);\n\n  gtk_window_set_title(GTK_WINDOW(window_), GetTitle().c_str());\n\n  // Create the vertical box container for the main menu and the drawing area.\n  box_ = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);\n  gtk_container_add(GTK_CONTAINER(window_), box_);\n\n  // Add the main menu (even if fullscreen was requested, for the initial layout\n  // calculation).\n  const GTKMenuItem* main_menu = static_cast<const GTKMenuItem*>(GetMainMenu());\n  GtkWidget* main_menu_widget = main_menu ? main_menu->handle() : nullptr;\n  if (main_menu_widget) {\n    gtk_box_pack_start(GTK_BOX(box_), main_menu_widget, FALSE, FALSE, 0);\n  }\n\n  // Create the drawing area for creating the surface for, which will be the\n  // client area of the window occupying all the window space not taken by the\n  // main menu.\n  drawing_area_ = gtk_drawing_area_new();\n  gtk_box_pack_end(GTK_BOX(box_), drawing_area_, TRUE, TRUE, 0);\n  // The desired size is the client (drawing) area size. Let GTK auto-size the\n  // entire window around it (as well as the width of the menu actually if it\n  // happens to be bigger - the desired size in the Window will be updated later\n  // to reflect that).\n  gtk_widget_set_size_request(drawing_area_, GetDesiredLogicalWidth(),\n                              GetDesiredLogicalHeight());\n\n  // Attach the event handlers.\n  // Keyboard events are processed by the window, mouse events are processed\n  // within, and by, the drawing (client) area.\n  gtk_widget_set_events(window_, GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK |\n                                     GDK_FOCUS_CHANGE_MASK);\n  gtk_widget_set_events(drawing_area_,\n                        GDK_POINTER_MOTION_MASK | GDK_BUTTON_MOTION_MASK |\n                            GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK |\n                            GDK_SCROLL_MASK);\n  g_signal_connect(G_OBJECT(window_), \"event\",\n                   G_CALLBACK(WindowEventHandlerThunk),\n                   reinterpret_cast<gpointer>(this));\n  g_signal_connect(G_OBJECT(drawing_area_), \"event\",\n                   G_CALLBACK(DrawingAreaEventHandlerThunk),\n                   reinterpret_cast<gpointer>(this));\n  g_signal_connect(G_OBJECT(drawing_area_), \"draw\", G_CALLBACK(DrawHandler),\n                   reinterpret_cast<gpointer>(this));\n\n  // Finally show all the widgets in the window, including the main menu.\n  gtk_widget_show_all(window_);\n\n  // Remove the size request after finishing the initial layout because it makes\n  // it impossible to make the window smaller.\n  gtk_widget_set_size_request(drawing_area_, -1, -1);\n\n  // After setting up the initial layout for non-fullscreen, enter fullscreen if\n  // requested.\n  if (IsFullscreen()) {\n    if (main_menu_widget) {\n      gtk_container_remove(GTK_CONTAINER(box_), main_menu_widget);\n    }\n    gtk_window_fullscreen(GTK_WINDOW(window_));\n  }\n\n  // Make sure the initial state after opening is reported to the common Window\n  // class no matter how GTK sends the events.\n  {\n    WindowDestructionReceiver destruction_receiver(this);\n\n    // TODO(Triang3l): Report the desired client area size.\n\n    GtkAllocation drawing_area_allocation;\n    gtk_widget_get_allocation(drawing_area_, &drawing_area_allocation);\n    OnActualSizeUpdate(uint32_t(drawing_area_allocation.width),\n                       uint32_t(drawing_area_allocation.height),\n                       destruction_receiver);\n    if (destruction_receiver.IsWindowDestroyedOrClosed()) {\n      return true;\n    }\n\n    if (gtk_window_has_toplevel_focus(GTK_WINDOW(window_))) {\n      OnFocusUpdate(true, destruction_receiver);\n      if (destruction_receiver.IsWindowDestroyedOrClosed()) {\n        return true;\n      }\n    }\n  }\n\n  return true;\n}\n\nvoid GTKWindow::RequestCloseImpl() { gtk_window_close(GTK_WINDOW(window_)); }\n\nvoid GTKWindow::ApplyNewFullscreen() {\n  // Various functions here may trigger events that may result in the listeners\n  // being invoked, and potentially cause the destruction of the window or\n  // fullscreen being toggled from inside this function.\n  WindowDestructionReceiver destruction_receiver(this);\n\n  const GTKMenuItem* main_menu = static_cast<const GTKMenuItem*>(GetMainMenu());\n  GtkWidget* main_menu_widget = main_menu ? main_menu->handle() : nullptr;\n\n  // Changing the menu and the fullscreen state may change the size of the\n  // drawing area too, don't handle the resize multiple times (also potentially\n  // with the listeners changing the desired fullscreen if called from the\n  // handling of some event like GDK_CONFIGURE).\n  BeginBatchedSizeUpdate();\n\n  if (IsFullscreen()) {\n    if (main_menu_widget) {\n      gtk_container_remove(GTK_CONTAINER(box_), main_menu_widget);\n      if (destruction_receiver.IsWindowDestroyedOrClosed()) {\n        if (!destruction_receiver.IsWindowDestroyed()) {\n          EndBatchedSizeUpdate(destruction_receiver);\n        }\n        return;\n      }\n    }\n    gtk_window_fullscreen(GTK_WINDOW(window_));\n    if (destruction_receiver.IsWindowDestroyedOrClosed()) {\n      if (!destruction_receiver.IsWindowDestroyed()) {\n        EndBatchedSizeUpdate(destruction_receiver);\n      }\n      return;\n    }\n  } else {\n    gtk_window_unfullscreen(GTK_WINDOW(window_));\n    if (destruction_receiver.IsWindowDestroyedOrClosed()) {\n      if (!destruction_receiver.IsWindowDestroyed()) {\n        EndBatchedSizeUpdate(destruction_receiver);\n      }\n      return;\n    }\n    if (main_menu_widget) {\n      gtk_box_pack_start(GTK_BOX(box_), main_menu_widget, FALSE, FALSE, 0);\n      if (destruction_receiver.IsWindowDestroyedOrClosed()) {\n        if (!destruction_receiver.IsWindowDestroyed()) {\n          EndBatchedSizeUpdate(destruction_receiver);\n        }\n        return;\n      }\n      // If the new menu is used for the first time, it will be in the hidden\n      // state initially. The menu might have been changed while in fullscreen\n      // without having shown it.\n      gtk_widget_show_all(main_menu_widget);\n      if (destruction_receiver.IsWindowDestroyedOrClosed()) {\n        if (!destruction_receiver.IsWindowDestroyed()) {\n          EndBatchedSizeUpdate(destruction_receiver);\n        }\n        return;\n      }\n    }\n  }\n\n  EndBatchedSizeUpdate(destruction_receiver);\n  if (destruction_receiver.IsWindowDestroyedOrClosed()) {\n    return;\n  }\n}\n\nvoid GTKWindow::ApplyNewTitle() {\n  gtk_window_set_title(GTK_WINDOW(window_), GetTitle().c_str());\n}\n\nvoid GTKWindow::ApplyNewMainMenu(MenuItem* old_main_menu) {\n  if (IsFullscreen()) {\n    // The menu will be set when exiting fullscreen.\n    return;\n  }\n  // The fullscreen state may have been changed by some callback invoked, such\n  // as the configure (resize) one, recheck it after making changes also.\n\n  WindowDestructionReceiver destruction_receiver(this);\n\n  // Changing the menu may change the size of the drawing area too, and here the\n  // menu may be changed twice (to detach the old one and to attach the new),\n  // don't handle the resize multiple times.\n  BeginBatchedSizeUpdate();\n\n  if (old_main_menu) {\n    const GTKMenuItem& old_gtk_main_menu =\n        *static_cast<const GTKMenuItem*>(old_main_menu);\n    gtk_container_remove(GTK_CONTAINER(box_), old_gtk_main_menu.handle());\n    if (destruction_receiver.IsWindowDestroyedOrClosed() || IsFullscreen()) {\n      if (!destruction_receiver.IsWindowDestroyed()) {\n        EndBatchedSizeUpdate(destruction_receiver);\n      }\n      return;\n    }\n  }\n\n  const GTKMenuItem* new_main_menu =\n      static_cast<const GTKMenuItem*>(GetMainMenu());\n  if (!new_main_menu) {\n    EndBatchedSizeUpdate(destruction_receiver);\n    return;\n  }\n  GtkWidget* new_main_menu_widget = new_main_menu->handle();\n  gtk_box_pack_start(GTK_BOX(box_), new_main_menu_widget, FALSE, FALSE, 0);\n  if (destruction_receiver.IsWindowDestroyedOrClosed() || IsFullscreen()) {\n    if (!destruction_receiver.IsWindowDestroyed()) {\n      EndBatchedSizeUpdate(destruction_receiver);\n    }\n    return;\n  }\n  // If the new menu is used for the first time, it will be in the hidden state\n  // initially.\n  gtk_widget_show_all(new_main_menu_widget);\n  if (destruction_receiver.IsWindowDestroyedOrClosed() || IsFullscreen()) {\n    if (!destruction_receiver.IsWindowDestroyed()) {\n      EndBatchedSizeUpdate(destruction_receiver);\n    }\n    return;\n  }\n\n  EndBatchedSizeUpdate(destruction_receiver);\n  if (destruction_receiver.IsWindowDestroyedOrClosed()) {\n    return;\n  }\n}\n\nvoid GTKWindow::FocusImpl() { gtk_window_activate_focus(GTK_WINDOW(window_)); }\n\nstd::unique_ptr<Surface> GTKWindow::CreateSurfaceImpl(\n    Surface::TypeFlags allowed_types) {\n  GdkDisplay* display = gtk_widget_get_display(window_);\n  GdkWindow* drawing_area_window = gtk_widget_get_window(drawing_area_);\n  bool type_known = false;\n  bool type_supported_by_display = false;\n  if (allowed_types & Surface::kTypeFlag_XcbWindow) {\n    type_known = true;\n    if (GDK_IS_X11_DISPLAY(display)) {\n      type_supported_by_display = true;\n      return std::make_unique<XcbWindowSurface>(\n          XGetXCBConnection(gdk_x11_display_get_xdisplay(display)),\n          gdk_x11_window_get_xid(drawing_area_window));\n    }\n  }\n  // TODO(Triang3l): Wayland surface.\n  if (type_known && !type_supported_by_display) {\n    XELOGE(\n        \"GTKWindow: The window system of the GTK window is not supported by \"\n        \"Xenia\");\n  }\n  return nullptr;\n}\n\nvoid GTKWindow::RequestPaintImpl() { gtk_widget_queue_draw(drawing_area_); }\n\nvoid GTKWindow::HandleSizeUpdate(\n    WindowDestructionReceiver& destruction_receiver) {\n  if (!drawing_area_) {\n    // Batched size update ended when the window has already been closed, for\n    // instance.\n    return;\n  }\n\n  // TODO(Triang3l): Report the desired client area size.\n\n  GtkAllocation drawing_area_allocation;\n  gtk_widget_get_allocation(drawing_area_, &drawing_area_allocation);\n  OnActualSizeUpdate(uint32_t(drawing_area_allocation.width),\n                     uint32_t(drawing_area_allocation.height),\n                     destruction_receiver);\n  if (destruction_receiver.IsWindowDestroyedOrClosed()) {\n    return;\n  }\n}\n\nvoid GTKWindow::BeginBatchedSizeUpdate() {\n  // It's okay if batched_size_update_contained_* are not false when beginning\n  // a batched update, in case the new batched update was started by a window\n  // listener called from within EndBatchedSizeUpdate.\n  ++batched_size_update_depth_;\n}\n\nvoid GTKWindow::EndBatchedSizeUpdate(\n    WindowDestructionReceiver& destruction_receiver) {\n  assert_not_zero(batched_size_update_depth_);\n  if (--batched_size_update_depth_) {\n    return;\n  }\n  // Resetting batched_size_update_contained_* in closing, not opening, because\n  // a listener may start a new batch, and finish it, and there won't be need to\n  // handle the deferred messages twice.\n  if (batched_size_update_contained_configure_) {\n    batched_size_update_contained_configure_ = false;\n    HandleSizeUpdate(destruction_receiver);\n    if (destruction_receiver.IsWindowDestroyed()) {\n      return;\n    }\n  }\n  if (batched_size_update_contained_draw_) {\n    batched_size_update_contained_draw_ = false;\n    RequestPaint();\n  }\n}\n\nbool GTKWindow::HandleMouse(GdkEvent* event,\n                            WindowDestructionReceiver& destruction_receiver) {\n  MouseEvent::Button button = MouseEvent::Button::kNone;\n  int32_t x = 0;\n  int32_t y = 0;\n  int32_t scroll_x = 0;\n  int32_t scroll_y = 0;\n  switch (event->type) {\n    case GDK_MOTION_NOTIFY: {\n      auto motion_event = reinterpret_cast<const GdkEventMotion*>(event);\n      x = motion_event->x;\n      y = motion_event->y;\n    } break;\n    case GDK_BUTTON_PRESS:\n    case GDK_BUTTON_RELEASE: {\n      auto button_event = reinterpret_cast<const GdkEventButton*>(event);\n      switch (button_event->button) {\n        case 1:\n          button = MouseEvent::Button::kLeft;\n          break;\n        case 2:\n          button = MouseEvent::Button::kMiddle;\n          break;\n        case 3:\n          button = MouseEvent::Button::kRight;\n          break;\n        case 4:\n          button = MouseEvent::Button::kX1;\n          break;\n        case 5:\n          button = MouseEvent::Button::kX2;\n          break;\n        default:\n          // Still handle the movement.\n          break;\n      }\n      x = button_event->x;\n      y = button_event->y;\n    } break;\n    case GDK_SCROLL: {\n      auto scroll_event = reinterpret_cast<const GdkEventScroll*>(event);\n      x = scroll_event->x;\n      y = scroll_event->y;\n      scroll_x = scroll_event->delta_x * MouseEvent::kScrollPerDetent;\n      // In GDK, positive is towards the bottom of the screen, not forward from\n      // the user.\n      scroll_y = -scroll_event->delta_y * MouseEvent::kScrollPerDetent;\n    } break;\n    default:\n      return false;\n  }\n\n  MouseEvent e(this, button, x, y, scroll_x, scroll_y);\n  switch (event->type) {\n    case GDK_MOTION_NOTIFY:\n      OnMouseMove(e, destruction_receiver);\n      break;\n    case GDK_BUTTON_PRESS:\n      OnMouseDown(e, destruction_receiver);\n      break;\n    case GDK_BUTTON_RELEASE:\n      OnMouseUp(e, destruction_receiver);\n      break;\n    case GDK_SCROLL:\n      OnMouseWheel(e, destruction_receiver);\n      break;\n    default:\n      break;\n  }\n  // Returning immediately anyway - no need to check\n  // destruction_receiver.IsWindowDestroyed().\n  return e.is_handled();\n}\n\nbool GTKWindow::HandleKeyboard(\n    GdkEventKey* event, WindowDestructionReceiver& destruction_receiver) {\n  unsigned int modifiers = event->state;\n  bool shift_pressed = modifiers & GDK_SHIFT_MASK;\n  bool ctrl_pressed = modifiers & GDK_CONTROL_MASK;\n  bool alt_pressed = modifiers & GDK_META_MASK;\n  bool super_pressed = modifiers & GDK_SUPER_MASK;\n  uint32_t key_char = gdk_keyval_to_unicode(event->keyval);\n  // TODO(Triang3l): event->hardware_keycode to VirtualKey translation.\n  KeyEvent e(this, VirtualKey(event->hardware_keycode), 1,\n             event->type == GDK_KEY_RELEASE, shift_pressed, ctrl_pressed,\n             alt_pressed, super_pressed);\n  switch (event->type) {\n    case GDK_KEY_PRESS:\n      OnKeyDown(e, destruction_receiver);\n      if (destruction_receiver.IsWindowDestroyedOrClosed()) {\n        return e.is_handled();\n      }\n      if (key_char > 0) {\n        OnKeyChar(e, destruction_receiver);\n      }\n      break;\n    case GDK_KEY_RELEASE:\n      OnKeyUp(e, destruction_receiver);\n      break;\n    default:\n      break;\n  }\n  // Returning immediately anyway - no need to check\n  // destruction_receiver.IsWindowDestroyed().\n  return e.is_handled();\n}\n\ngboolean GTKWindow::WindowEventHandler(GdkEvent* event) {\n  switch (event->type) {\n    case GDK_DELETE:\n    // In case the widget was somehow forcibly destroyed without GDK_DELETE.\n    case GDK_DESTROY: {\n      WindowDestructionReceiver destruction_receiver(this);\n      OnBeforeClose(destruction_receiver);\n      if (destruction_receiver.IsWindowDestroyed()) {\n        break;\n      }\n      // Set window_ to null to ignore events from now on since this\n      // ui::GTKWindow is entering an indeterminate state - this should be done\n      // at some point in closing anyway.\n      GtkWidget* window = window_;\n      window_ = nullptr;\n      // Destroying the top-level window also destroys its children.\n      drawing_area_ = nullptr;\n      box_ = nullptr;\n      if (event->type != GDK_DESTROY) {\n        gtk_widget_destroy(window);\n      }\n      OnAfterClose();\n    } break;\n\n    case GDK_FOCUS_CHANGE: {\n      auto focus_event = reinterpret_cast<const GdkEventFocus*>(event);\n      WindowDestructionReceiver destruction_receiver(this);\n      OnFocusUpdate(bool(focus_event->in), destruction_receiver);\n      if (destruction_receiver.IsWindowDestroyedOrClosed()) {\n        break;\n      }\n    } break;\n\n    case GDK_KEY_PRESS:\n    case GDK_KEY_RELEASE: {\n      WindowDestructionReceiver destruction_receiver(this);\n      HandleKeyboard(reinterpret_cast<GdkEventKey*>(event),\n                     destruction_receiver);\n      if (destruction_receiver.IsWindowDestroyedOrClosed()) {\n        break;\n      }\n    } break;\n\n    default:\n      break;\n  }\n\n  // The window might have been destroyed by the handlers, don't interact with\n  // *this in this function from now on.\n\n  return GDK_EVENT_PROPAGATE;\n}\n\ngboolean GTKWindow::WindowEventHandlerThunk(GtkWidget* widget, GdkEvent* event,\n                                            gpointer user_data) {\n  GTKWindow* window = reinterpret_cast<GTKWindow*>(user_data);\n  if (!window || widget != window->window_ ||\n      reinterpret_cast<const GdkEventAny*>(event)->window !=\n          gtk_widget_get_window(window->window_)) {\n    return GDK_EVENT_PROPAGATE;\n  }\n  return window->WindowEventHandler(event);\n}\n\ngboolean GTKWindow::DrawingAreaEventHandler(GdkEvent* event) {\n  switch (event->type) {\n    case GDK_MOTION_NOTIFY:\n    case GDK_BUTTON_PRESS:\n    case GDK_BUTTON_RELEASE:\n    case GDK_SCROLL: {\n      WindowDestructionReceiver destruction_receiver(this);\n      HandleMouse(event, destruction_receiver);\n      if (destruction_receiver.IsWindowDestroyedOrClosed()) {\n        break;\n      }\n    } break;\n\n    case GDK_CONFIGURE: {\n      if (batched_size_update_depth_) {\n        batched_size_update_contained_configure_ = true;\n      } else {\n        WindowDestructionReceiver destruction_receiver(this);\n        HandleSizeUpdate(destruction_receiver);\n        if (destruction_receiver.IsWindowDestroyedOrClosed()) {\n          break;\n        }\n      }\n    } break;\n    default:\n      break;\n  }\n\n  // The window might have been destroyed by the handlers, don't interact with\n  // *this in this function from now on.\n\n  return GDK_EVENT_PROPAGATE;\n}\n\ngboolean GTKWindow::DrawingAreaEventHandlerThunk(GtkWidget* widget,\n                                                 GdkEvent* event,\n                                                 gpointer user_data) {\n  GTKWindow* window = reinterpret_cast<GTKWindow*>(user_data);\n  if (!window || widget != window->drawing_area_ ||\n      reinterpret_cast<const GdkEventAny*>(event)->window !=\n          gtk_widget_get_window(window->drawing_area_)) {\n    return GDK_EVENT_PROPAGATE;\n  }\n  return window->DrawingAreaEventHandler(event);\n}\n\ngboolean GTKWindow::DrawHandler(GtkWidget* widget, cairo_t* cr,\n                                gpointer user_data) {\n  GTKWindow* window = reinterpret_cast<GTKWindow*>(user_data);\n  if (!window || widget != window->drawing_area_) {\n    return FALSE;\n  }\n  if (window->batched_size_update_depth_) {\n    window->batched_size_update_contained_draw_ = true;\n  } else {\n    window->OnPaint();\n  }\n  return TRUE;\n}\n\nstd::unique_ptr<ui::MenuItem> MenuItem::Create(Type type,\n                                               const std::string& text,\n                                               const std::string& hotkey,\n                                               std::function<void()> callback) {\n  return std::make_unique<GTKMenuItem>(type, text, hotkey, callback);\n}\n\nvoid GTKMenuItem::ActivateHandler(GtkWidget* menu_item, gpointer user_data) {\n  static_cast<GTKMenuItem*>(user_data)->OnSelected();\n  // The menu item might have been destroyed by its OnSelected, don't do\n  // anything with it here from now on.\n}\n\nGTKMenuItem::GTKMenuItem(Type type, const std::string& text,\n                         const std::string& hotkey,\n                         std::function<void()> callback)\n    : MenuItem(type, text, hotkey, std::move(callback)) {\n  std::string label = text;\n  // TODO(dougvj) Would we ever need to escape underscores?\n  // Replace & with _ for gtk to see the memonic\n  std::replace(label.begin(), label.end(), '&', '_');\n  const gchar* gtk_label = reinterpret_cast<const gchar*>(label.c_str());\n  switch (type) {\n    case MenuItem::Type::kNormal:\n    default:\n      menu_ = gtk_menu_bar_new();\n      break;\n    case MenuItem::Type::kPopup:\n      menu_ = gtk_menu_item_new_with_mnemonic(gtk_label);\n      break;\n    case MenuItem::Type::kSeparator:\n      menu_ = gtk_separator_menu_item_new();\n      break;\n    case MenuItem::Type::kString:\n      auto full_name = text;\n      if (!hotkey.empty()) {\n        full_name += \"\\t\" + hotkey;\n      }\n      menu_ = gtk_menu_item_new_with_mnemonic(gtk_label);\n      break;\n  }\n  if (menu_) {\n    // Own the object because it may be detached from and re-attached to a\n    // Window.\n    g_object_ref_sink(menu_);\n    if (GTK_IS_MENU_ITEM(menu_)) {\n      g_signal_connect(menu_, \"activate\", G_CALLBACK(ActivateHandler),\n                       reinterpret_cast<gpointer>(this));\n    }\n  }\n}\n\nGTKMenuItem::~GTKMenuItem() {\n  if (menu_) {\n    g_object_unref(menu_);\n  }\n}\n\nvoid GTKMenuItem::OnChildAdded(MenuItem* generic_child_item) {\n  auto child_item = static_cast<GTKMenuItem*>(generic_child_item);\n  GtkWidget* submenu = nullptr;\n  switch (child_item->type()) {\n    case MenuItem::Type::kNormal:\n      // Nothing special.\n      break;\n    case MenuItem::Type::kPopup:\n      if (GTK_IS_MENU_ITEM(menu_)) {\n        submenu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(menu_));\n        // Get sub menu and if it doesn't exist create it\n        if (submenu == nullptr) {\n          submenu = gtk_menu_new();\n          gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_), submenu);\n        }\n        gtk_menu_shell_append(GTK_MENU_SHELL(submenu), child_item->handle());\n      } else {\n        gtk_menu_shell_append(GTK_MENU_SHELL(menu_), child_item->handle());\n      }\n      break;\n    case MenuItem::Type::kSeparator:\n    case MenuItem::Type::kString:\n      assert(GTK_IS_MENU_ITEM(menu_));\n      // Get sub menu and if it doesn't exist create it\n      submenu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(menu_));\n      if (submenu == nullptr) {\n        submenu = gtk_menu_new();\n        gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_), submenu);\n      }\n      gtk_menu_shell_append(GTK_MENU_SHELL(submenu), child_item->handle());\n      break;\n  }\n}\n\n// TODO(dougvj)\nvoid GTKMenuItem::OnChildRemoved(MenuItem* generic_child_item) {\n  assert_always();\n}\n\n}  // namespace ui\n\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/ui/window_gtk.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_WINDOW_GTK_H_\n#define XENIA_UI_WINDOW_GTK_H_\n\n#include <memory>\n#include <string>\n\n#include <gdk/gdk.h>\n#include <gtk/gtk.h>\n#include <xcb/xcb.h>\n\n#include \"xenia/base/platform_linux.h\"\n#include \"xenia/ui/menu_item.h\"\n#include \"xenia/ui/window.h\"\n\nnamespace xe {\nnamespace ui {\n\nclass GTKWindow : public Window {\n  using super = Window;\n\n public:\n  GTKWindow(WindowedAppContext& app_context, const std::string_view title,\n            uint32_t desired_logical_width, uint32_t desired_logical_height);\n  ~GTKWindow() override;\n\n  // Will be null if the window hasn't been successfully opened yet, or has been\n  // closed.\n  GtkWidget* window() const { return window_; }\n\n protected:\n  bool OpenImpl() override;\n  void RequestCloseImpl() override;\n\n  void ApplyNewFullscreen() override;\n  void ApplyNewTitle() override;\n  void ApplyNewMainMenu(MenuItem* old_main_menu) override;\n  // Mouse capture seems to happen implicitly compared to Windows.\n  void FocusImpl() override;\n\n  std::unique_ptr<Surface> CreateSurfaceImpl(\n      Surface::TypeFlags allowed_types) override;\n  void RequestPaintImpl() override;\n\n private:\n  void HandleSizeUpdate(WindowDestructionReceiver& destruction_receiver);\n  // For updating multiple factors that may influence the window size at once,\n  // without handling the configure event multiple times (that may not only\n  // result in wasted handling, but also in the state potentially changed to an\n  // inconsistent one in the middle of a size update by the listeners).\n  void BeginBatchedSizeUpdate();\n  void EndBatchedSizeUpdate(WindowDestructionReceiver& destruction_receiver);\n\n  // Handling events related to the whole window.\n  bool HandleMouse(GdkEvent* event,\n                   WindowDestructionReceiver& destruction_receiver);\n  bool HandleKeyboard(GdkEventKey* event,\n                      WindowDestructionReceiver& destruction_receiver);\n  gboolean WindowEventHandler(GdkEvent* event);\n  static gboolean WindowEventHandlerThunk(GtkWidget* widget, GdkEvent* event,\n                                          gpointer user_data);\n\n  // Handling events related specifically to the drawing (client) area.\n  gboolean DrawingAreaEventHandler(GdkEvent* event);\n  static gboolean DrawingAreaEventHandlerThunk(GtkWidget* widget,\n                                               GdkEvent* event,\n                                               gpointer user_data);\n  static gboolean DrawHandler(GtkWidget* widget, cairo_t* cr, gpointer data);\n\n  // Non-owning (initially floating) references to the widgets.\n  GtkWidget* window_ = nullptr;\n  GtkWidget* box_ = nullptr;\n  GtkWidget* drawing_area_ = nullptr;\n\n  uint32_t batched_size_update_depth_ = 0;\n  bool batched_size_update_contained_configure_ = false;\n  bool batched_size_update_contained_draw_ = false;\n};\n\nclass GTKMenuItem : public MenuItem {\n public:\n  GTKMenuItem(Type type, const std::string& text, const std::string& hotkey,\n              std::function<void()> callback);\n  ~GTKMenuItem() override;\n\n  GtkWidget* handle() const { return menu_; }\n\n protected:\n  void OnChildAdded(MenuItem* child_item) override;\n  void OnChildRemoved(MenuItem* child_item) override;\n\n private:\n  static void ActivateHandler(GtkWidget* menu_item, gpointer user_data);\n\n  // An owning reference because a menu may be transferred between windows.\n  GtkWidget* menu_ = nullptr;\n};\n\n}  // namespace ui\n}  // namespace xe\n\n#endif  // XENIA_UI_WINDOW_WIN_H_\n"
  },
  {
    "path": "src/xenia/ui/window_listener.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_WINDOW_LISTENER_H_\n#define XENIA_UI_WINDOW_LISTENER_H_\n\n#include \"xenia/ui/ui_event.h\"\n\nnamespace xe {\nnamespace ui {\n\n// Virtual interfaces for types that want to listen for Window events.\n// Use Window::Add[Input]Listener and Window::Remove[Input]Listener to manage\n// active listeners.\n\nclass WindowListener {\n public:\n  virtual ~WindowListener() = default;\n\n  // OnOpened will be followed by various initial setup listeners.\n  virtual void OnOpened(UISetupEvent& e) {}\n  virtual void OnClosing(UIEvent& e) {}\n\n  virtual void OnDpiChanged(UISetupEvent& e) {}\n  virtual void OnResize(UISetupEvent& e) {}\n\n  virtual void OnGotFocus(UISetupEvent& e) {}\n  virtual void OnLostFocus(UISetupEvent& e) {}\n\n  virtual void OnFileDrop(FileDropEvent& e) {}\n};\n\nclass WindowInputListener {\n public:\n  virtual ~WindowInputListener() = default;\n\n  virtual void OnKeyDown(KeyEvent& e) {}\n  virtual void OnKeyUp(KeyEvent& e) {}\n  virtual void OnKeyChar(KeyEvent& e) {}\n\n  virtual void OnMouseDown(MouseEvent& e) {}\n  virtual void OnMouseMove(MouseEvent& e) {}\n  virtual void OnMouseUp(MouseEvent& e) {}\n  virtual void OnMouseWheel(MouseEvent& e) {}\n\n  virtual void OnTouchEvent(TouchEvent& e) {}\n};\n\n}  // namespace ui\n}  // namespace xe\n\n#endif  // XENIA_UI_WINDOW_LISTENER_H_\n"
  },
  {
    "path": "src/xenia/ui/window_win.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/ui/window_win.h\"\n\n#include <algorithm>\n#include <memory>\n#include <string>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/filesystem.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/ui/surface_win.h\"\n\n// Must be included before Windows headers for things like NOMINMAX.\n#include \"xenia/base/platform_win.h\"\n#include \"xenia/ui/virtual_key.h\"\n#include \"xenia/ui/windowed_app_context_win.h\"\n\n#include <ShellScalingApi.h>\n#include <dwmapi.h>\n\nnamespace xe {\nnamespace ui {\n\nstd::unique_ptr<Window> Window::Create(WindowedAppContext& app_context,\n                                       const std::string_view title,\n                                       uint32_t desired_logical_width,\n                                       uint32_t desired_logical_height) {\n  return std::make_unique<Win32Window>(\n      app_context, title, desired_logical_width, desired_logical_height);\n}\n\nWin32Window::Win32Window(WindowedAppContext& app_context,\n                         const std::string_view title,\n                         uint32_t desired_logical_width,\n                         uint32_t desired_logical_height)\n    : Window(app_context, title, desired_logical_width, desired_logical_height),\n      arrow_cursor_(LoadCursor(nullptr, IDC_ARROW)) {\n  dpi_ = GetCurrentSystemDpi();\n}\n\nWin32Window::~Win32Window() {\n  EnterDestructor();\n  if (cursor_auto_hide_timer_) {\n    DeleteTimerQueueTimer(nullptr, cursor_auto_hide_timer_, nullptr);\n    cursor_auto_hide_timer_ = nullptr;\n  }\n  if (hwnd_) {\n    // Set hwnd_ to null to ignore events from now on since this Win32Window is\n    // entering an indeterminate state.\n    HWND hwnd = hwnd_;\n    hwnd_ = nullptr;\n    SetWindowLongPtr(hwnd, GWLP_USERDATA, 0);\n    DestroyWindow(hwnd);\n  }\n  if (icon_) {\n    DestroyIcon(icon_);\n  }\n}\n\nuint32_t Win32Window::GetMediumDpi() const { return USER_DEFAULT_SCREEN_DPI; }\n\nbool Win32Window::OpenImpl() {\n  const Win32WindowedAppContext& win32_app_context =\n      static_cast<const Win32WindowedAppContext&>(app_context());\n  HINSTANCE hinstance = win32_app_context.hinstance();\n\n  static bool has_registered_class = false;\n  if (!has_registered_class) {\n    WNDCLASSEXW wcex;\n    wcex.cbSize = sizeof(wcex);\n    wcex.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;\n    wcex.lpfnWndProc = Win32Window::WndProcThunk;\n    wcex.cbClsExtra = 0;\n    wcex.cbWndExtra = 0;\n    wcex.hInstance = hinstance;\n    wcex.hIcon = LoadIconW(hinstance, L\"MAINICON\");\n    wcex.hIconSm = nullptr;  // LoadIconW(hinstance, L\"MAINICON\");\n    wcex.hCursor = arrow_cursor_;\n    // Matches the black background color of the presenter's painting.\n    wcex.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);\n    wcex.lpszMenuName = nullptr;\n    wcex.lpszClassName = L\"XeniaWindowClass\";\n    if (!RegisterClassExW(&wcex)) {\n      XELOGE(\"RegisterClassEx failed\");\n      return false;\n    }\n    has_registered_class = true;\n  }\n\n  const Win32MenuItem* main_menu =\n      static_cast<const Win32MenuItem*>(GetMainMenu());\n\n  // Setup the initial size for the non-fullscreen window. With per-monitor DPI,\n  // this is also done to be able to obtain the initial window rectangle (with\n  // CW_USEDEFAULT) to get the monitor for the window position, and then to\n  // adjust the normal window size to the new DPI.\n  // Save the initial desired size since it may be modified by the handler of\n  // the WM_SIZE sent during window creation - it's needed for the initial\n  // per-monitor DPI scaling.\n  uint32_t initial_desired_logical_width = GetDesiredLogicalWidth();\n  uint32_t initial_desired_logical_height = GetDesiredLogicalHeight();\n  const Win32WindowedAppContext::PerMonitorDpiV2Api* per_monitor_dpi_v2_api =\n      win32_app_context.per_monitor_dpi_v2_api();\n  const Win32WindowedAppContext::PerMonitorDpiV1Api* per_monitor_dpi_v1_api =\n      win32_app_context.per_monitor_dpi_v1_api();\n  // Even with per-monitor DPI, take the closest approximation (system DPI) to\n  // potentially more accurately determine the initial monitor.\n  dpi_ = GetCurrentSystemDpi();\n  DWORD window_style = WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS;\n  DWORD window_ex_style = WS_EX_APPWINDOW | WS_EX_CONTROLPARENT;\n  RECT window_size_rect;\n  window_size_rect.left = 0;\n  window_size_rect.top = 0;\n  window_size_rect.right = LONG(ConvertSizeDpi(initial_desired_logical_width,\n                                               dpi_, USER_DEFAULT_SCREEN_DPI));\n  window_size_rect.bottom = LONG(ConvertSizeDpi(initial_desired_logical_height,\n                                                dpi_, USER_DEFAULT_SCREEN_DPI));\n  AdjustWindowRectangle(window_size_rect, window_style,\n                        BOOL(main_menu != nullptr), window_ex_style, dpi_);\n  // Create the window. Though WM_NCCREATE will assign to `hwnd_` too, still do\n  // the assignment here to handle the case of a failure after WM_NCCREATE, for\n  // instance.\n  hwnd_ = CreateWindowExW(\n      window_ex_style, L\"XeniaWindowClass\",\n      reinterpret_cast<LPCWSTR>(xe::to_utf16(GetTitle()).c_str()), window_style,\n      CW_USEDEFAULT, CW_USEDEFAULT,\n      window_size_rect.right - window_size_rect.left,\n      window_size_rect.bottom - window_size_rect.top, nullptr, nullptr,\n      hinstance, this);\n  if (!hwnd_) {\n    XELOGE(\"CreateWindowExW failed\");\n    return false;\n  }\n  // For per-monitor DPI, obtain the DPI of the monitor the window was created\n  // on, and adjust the initial normal size for it. If as a result of this\n  // resizing, the window is moved to a different monitor, the WM_DPICHANGED\n  // handler will do the needed correction.\n  uint32_t initial_monitor_dpi = dpi_;\n  if (per_monitor_dpi_v2_api) {\n    initial_monitor_dpi = per_monitor_dpi_v2_api->get_dpi_for_window(hwnd_);\n  } else if (per_monitor_dpi_v1_api) {\n    HMONITOR monitor = MonitorFromWindow(hwnd_, MONITOR_DEFAULTTONEAREST);\n    UINT monitor_dpi_x, monitor_dpi_y;\n    if (monitor && SUCCEEDED(per_monitor_dpi_v1_api->get_dpi_for_monitor(\n                       monitor, MDT_DEFAULT, &monitor_dpi_x, &monitor_dpi_y))) {\n      initial_monitor_dpi = monitor_dpi_x;\n    }\n  }\n  if (dpi_ != initial_monitor_dpi) {\n    dpi_ = initial_monitor_dpi;\n    WINDOWPLACEMENT initial_dpi_placement;\n    // Note that WINDOWPLACEMENT contains workspace coordinates, which are\n    // adjusted to exclude toolbars such as the taskbar - the positions and\n    // rectangle origins there can't be mixed with origins of rectangles in\n    // virtual screen coordinates such as those involved in functions like\n    // GetWindowRect.\n    initial_dpi_placement.length = sizeof(initial_dpi_placement);\n    if (GetWindowPlacement(hwnd_, &initial_dpi_placement)) {\n      window_size_rect.left = 0;\n      window_size_rect.top = 0;\n      window_size_rect.right = LONG(ConvertSizeDpi(\n          initial_desired_logical_width, dpi_, USER_DEFAULT_SCREEN_DPI));\n      window_size_rect.bottom = LONG(ConvertSizeDpi(\n          initial_desired_logical_height, dpi_, USER_DEFAULT_SCREEN_DPI));\n      AdjustWindowRectangle(window_size_rect, window_style,\n                            BOOL(main_menu != nullptr), window_ex_style, dpi_);\n      initial_dpi_placement.rcNormalPosition.right =\n          initial_dpi_placement.rcNormalPosition.left +\n          (window_size_rect.right - window_size_rect.left);\n      initial_dpi_placement.rcNormalPosition.bottom =\n          initial_dpi_placement.rcNormalPosition.top +\n          (window_size_rect.bottom - window_size_rect.top);\n      SetWindowPlacement(hwnd_, &initial_dpi_placement);\n    }\n  }\n\n  // Disable rounded corners starting with Windows 11 (or silently receive and\n  // ignore E_INVALIDARG on Windows versions before 10.0.22000.0), primarily to\n  // preserve all pixels of the guest output.\n  DWM_WINDOW_CORNER_PREFERENCE window_corner_preference = DWMWCP_DONOTROUND;\n  DwmSetWindowAttribute(hwnd_, DWMWA_WINDOW_CORNER_PREFERENCE,\n                        &window_corner_preference,\n                        sizeof(window_corner_preference));\n\n  // Disable flicks.\n  ATOM atom = GlobalAddAtomW(L\"MicrosoftTabletPenServiceProperty\");\n  const DWORD_PTR dwHwndTabletProperty =\n      TABLET_DISABLE_PRESSANDHOLD |    // disables press and hold (right-click)\n                                       // gesture\n      TABLET_DISABLE_PENTAPFEEDBACK |  // disables UI feedback on pen up (waves)\n      TABLET_DISABLE_PENBARRELFEEDBACK |  // disables UI feedback on pen button\n                                          // down (circle)\n      TABLET_DISABLE_FLICKS |  // disables pen flicks (back, forward, drag down,\n                               // drag up)\n      TABLET_DISABLE_TOUCHSWITCH | TABLET_DISABLE_SMOOTHSCROLLING |\n      TABLET_DISABLE_TOUCHUIFORCEON | TABLET_ENABLE_MULTITOUCHDATA;\n  SetPropW(hwnd_, L\"MicrosoftTabletPenServiceProperty\",\n           reinterpret_cast<HANDLE>(dwHwndTabletProperty));\n  GlobalDeleteAtom(atom);\n\n  // Enable file dragging from external sources\n  DragAcceptFiles(hwnd_, true);\n\n  // Apply the initial state from the Window that the window shouldn't be\n  // visibly transitioned to.\n\n  if (icon_) {\n    SendMessageW(hwnd_, WM_SETICON, ICON_BIG, reinterpret_cast<LPARAM>(icon_));\n    SendMessageW(hwnd_, WM_SETICON, ICON_SMALL,\n                 reinterpret_cast<LPARAM>(icon_));\n  }\n\n  if (IsFullscreen()) {\n    // Go fullscreen after setting up everything related to the placement of the\n    // non-fullscreen window.\n    WindowDestructionReceiver destruction_receiver(this);\n    ApplyFullscreenEntry(destruction_receiver);\n    if (destruction_receiver.IsWindowDestroyed()) {\n      return true;\n    }\n  } else {\n    if (main_menu) {\n      SetMenu(hwnd_, main_menu->handle());\n    }\n  }\n\n  // Finally show the window.\n  ShowWindow(hwnd_, SW_SHOWNORMAL);\n\n  // Report the initial actual state after opening, messages for which might\n  // have missed if they were processed during CreateWindowExW when the HWND was\n  // not yet attached to the Win32Window.\n  {\n    WindowDestructionReceiver destruction_receiver(this);\n\n    // Report the desired logical size of the client area in the non-maximized\n    // state after the initial layout setup in Windows.\n    WINDOWPLACEMENT shown_placement;\n    shown_placement.length = sizeof(shown_placement);\n    if (GetWindowPlacement(hwnd_, &shown_placement)) {\n      // Get the size of the non-client area to subtract it from the size of the\n      // entire window in its non-maximized state, to get the client area. For\n      // safety, in case the window is somehow smaller than its non-client area\n      // (AdjustWindowRect is not exact in various cases also, such as when the\n      // menu becomes multiline), clamp to 0.\n      RECT non_client_area_rect = {};\n      AdjustWindowRectangle(non_client_area_rect);\n      OnDesiredLogicalSizeUpdate(\n          SizeToLogical(uint32_t(std::max(\n              (shown_placement.rcNormalPosition.right -\n               shown_placement.rcNormalPosition.left) -\n                  (non_client_area_rect.right - non_client_area_rect.left),\n              LONG(0)))),\n          SizeToLogical(uint32_t(std::max(\n              (shown_placement.rcNormalPosition.bottom -\n               shown_placement.rcNormalPosition.top) -\n                  (non_client_area_rect.bottom - non_client_area_rect.top),\n              LONG(0)))));\n    }\n\n    // Report the actual physical size in the current state.\n    // GetClientRect returns a rectangle with 0 origin.\n    RECT shown_client_rect;\n    if (GetClientRect(hwnd_, &shown_client_rect)) {\n      OnActualSizeUpdate(uint32_t(shown_client_rect.right),\n                         uint32_t(shown_client_rect.bottom),\n                         destruction_receiver);\n      if (destruction_receiver.IsWindowDestroyedOrClosed()) {\n        return true;\n      }\n    }\n\n    OnFocusUpdate(GetFocus() == hwnd_, destruction_receiver);\n    if (destruction_receiver.IsWindowDestroyedOrClosed()) {\n      return true;\n    }\n  }\n\n  // Apply the initial state from the Window that involves interaction with the\n  // user.\n\n  if (IsMouseCaptureRequested()) {\n    SetCapture(hwnd_);\n  }\n\n  cursor_currently_auto_hidden_ = false;\n  CursorVisibility cursor_visibility = GetCursorVisibility();\n  if (cursor_visibility != CursorVisibility::kVisible) {\n    if (cursor_visibility == CursorVisibility::kAutoHidden) {\n      if (!GetCursorPos(&cursor_auto_hide_last_screen_pos_)) {\n        cursor_auto_hide_last_screen_pos_.x = LONG_MAX;\n        cursor_auto_hide_last_screen_pos_.y = LONG_MAX;\n      }\n      cursor_currently_auto_hidden_ = true;\n    }\n    // OnFocusUpdate needs to be done before this.\n    SetCursorIfFocusedOnClientArea(nullptr);\n  }\n\n  return true;\n}\n\nvoid Win32Window::RequestCloseImpl() {\n  // Note that CloseWindow doesn't close the window, rather, it only minimizes\n  // it - need to send WM_CLOSE to let the Win32Window WndProc perform all the\n  // shutdown.\n  SendMessageW(hwnd_, WM_CLOSE, 0, 0);\n  // The window might have been deleted by the close handler, don't do anything\n  // with *this anymore (if that's needed, use a WindowDestructionReceiver).\n}\n\nuint32_t Win32Window::GetLatestDpiImpl() const {\n  // hwnd_ may be null in this function, but the latest DPI is stored in a\n  // variable anyway.\n  return dpi_;\n}\n\nvoid Win32Window::ApplyNewFullscreen() {\n  // Various functions here may send messages that may result in the\n  // listeners being invoked, and potentially cause the destruction of the\n  // window or fullscreen being toggled from inside this function.\n  WindowDestructionReceiver destruction_receiver(this);\n  if (IsFullscreen()) {\n    ApplyFullscreenEntry(destruction_receiver);\n    if (destruction_receiver.IsWindowDestroyedOrClosed()) {\n      return;\n    }\n  } else {\n    // Changing the style and the menu may change the size too, don't handle\n    // the resize multiple times (also potentially with the listeners changing\n    // the desired fullscreen if called from the handling of some message like\n    // WM_SIZE).\n    BeginBatchedSizeUpdate();\n\n    // Reinstate the non-client area.\n    SetWindowLong(hwnd_, GWL_STYLE,\n                  GetWindowLong(hwnd_, GWL_STYLE) | WS_OVERLAPPEDWINDOW);\n    if (destruction_receiver.IsWindowDestroyedOrClosed()) {\n      if (!destruction_receiver.IsWindowDestroyed()) {\n        EndBatchedSizeUpdate(destruction_receiver);\n      }\n      return;\n    }\n    const Win32MenuItem* main_menu =\n        static_cast<const Win32MenuItem*>(GetMainMenu());\n    if (main_menu) {\n      SetMenu(hwnd_, main_menu->handle());\n      if (destruction_receiver.IsWindowDestroyedOrClosed()) {\n        if (!destruction_receiver.IsWindowDestroyed()) {\n          EndBatchedSizeUpdate(destruction_receiver);\n        }\n        return;\n      }\n    }\n\n    // For some reason, WM_DPICHANGED is not sent when the window is borderless\n    // fullscreen with per-monitor DPI awareness v1 (on Windows versions since\n    // Windows 8.1 before Windows 10 1703) - refresh the current DPI explicitly.\n    dpi_ = GetCurrentDpi();\n    if (dpi_ != pre_fullscreen_dpi_) {\n      // Rescale the pre-fullscreen non-maximized window size to the new DPI as\n      // WM_DPICHANGED with the new rectangle was received for the fullscreen\n      // window size, not the windowed one. Simulating the behavior of the\n      // automatic resizing when changing the scale in the Windows settings (as\n      // of Windows 11 21H2 at least), which keeps the physical top-left origin\n      // of the entire window including the non-client area, but rescales the\n      // size.\n      // Note that WINDOWPLACEMENT contains workspace coordinates, which are\n      // adjusted to exclude toolbars such as the taskbar - the positions and\n      // rectangle origins there can't be mixed with origins of rectangles in\n      // virtual screen coordinates such as those involved in functions like\n      // GetWindowRect.\n      RECT new_dpi_rect;\n      new_dpi_rect.left = 0;\n      new_dpi_rect.top = 0;\n      new_dpi_rect.right = LONG(ConvertSizeDpi(\n          pre_fullscreen_normal_client_width_, dpi_, pre_fullscreen_dpi_));\n      new_dpi_rect.bottom = LONG(ConvertSizeDpi(\n          pre_fullscreen_normal_client_height_, dpi_, pre_fullscreen_dpi_));\n      AdjustWindowRectangle(new_dpi_rect);\n      pre_fullscreen_placement_.rcNormalPosition.right =\n          pre_fullscreen_placement_.rcNormalPosition.left +\n          (new_dpi_rect.right - new_dpi_rect.left);\n      pre_fullscreen_placement_.rcNormalPosition.bottom =\n          pre_fullscreen_placement_.rcNormalPosition.top +\n          (new_dpi_rect.bottom - new_dpi_rect.top);\n    }\n    SetWindowPlacement(hwnd_, &pre_fullscreen_placement_);\n    if (destruction_receiver.IsWindowDestroyedOrClosed()) {\n      if (!destruction_receiver.IsWindowDestroyed()) {\n        EndBatchedSizeUpdate(destruction_receiver);\n      }\n      return;\n    }\n\n    // https://devblogs.microsoft.com/oldnewthing/20131017-00/?p=2903\n    SetWindowPos(hwnd_, nullptr, 0, 0, 0, 0,\n                 SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER |\n                     SWP_FRAMECHANGED);\n    if (destruction_receiver.IsWindowDestroyedOrClosed()) {\n      if (!destruction_receiver.IsWindowDestroyed()) {\n        EndBatchedSizeUpdate(destruction_receiver);\n      }\n      return;\n    }\n\n    EndBatchedSizeUpdate(destruction_receiver);\n    if (destruction_receiver.IsWindowDestroyedOrClosed()) {\n      return;\n    }\n  }\n}\n\nvoid Win32Window::ApplyNewTitle() {\n  SetWindowTextW(hwnd_,\n                 reinterpret_cast<LPCWSTR>(xe::to_utf16(GetTitle()).c_str()));\n}\n\nvoid Win32Window::LoadAndApplyIcon(const void* buffer, size_t size,\n                                   bool can_apply_state_in_current_phase) {\n  bool reset = !buffer || !size;\n\n  HICON new_icon, new_icon_small;\n  if (reset) {\n    if (!icon_) {\n      // The icon is already the default one.\n      return;\n    }\n    if (!hwnd_) {\n      // Don't need to get the actual icon from the class if there's nothing to\n      // set it for yet (and there's no HWND to get it from, and the class may\n      // have not been registered yet also).\n      DestroyIcon(icon_);\n      icon_ = nullptr;\n      return;\n    }\n    new_icon = reinterpret_cast<HICON>(GetClassLongPtrW(hwnd_, GCLP_HICON));\n    new_icon_small =\n        reinterpret_cast<HICON>(GetClassLongPtrW(hwnd_, GCLP_HICONSM));\n    // Not caring if it's null in the class, accepting anything the class\n    // specifies.\n  } else {\n    new_icon = CreateIconFromResourceEx(\n        static_cast<PBYTE>(const_cast<void*>(buffer)), DWORD(size), TRUE,\n        0x00030000, 0, 0, LR_DEFAULTCOLOR | LR_DEFAULTSIZE);\n    if (!new_icon) {\n      return;\n    }\n    new_icon_small = new_icon;\n  }\n\n  if (hwnd_) {\n    SendMessageW(hwnd_, WM_SETICON, ICON_BIG,\n                 reinterpret_cast<LPARAM>(new_icon));\n    SendMessageW(hwnd_, WM_SETICON, ICON_SMALL,\n                 reinterpret_cast<LPARAM>(new_icon_small));\n  }\n\n  // The old icon is not in use anymore, safe to destroy it now.\n  if (icon_) {\n    DestroyIcon(icon_);\n    icon_ = nullptr;\n  }\n\n  if (!reset) {\n    assert_true(new_icon_small == new_icon);\n    icon_ = new_icon;\n  }\n}\n\nvoid Win32Window::ApplyNewMainMenu(MenuItem* old_main_menu) {\n  if (IsFullscreen()) {\n    // The menu will be set when exiting fullscreen.\n    return;\n  }\n  const Win32MenuItem* main_menu =\n      static_cast<const Win32MenuItem*>(GetMainMenu());\n  WindowDestructionReceiver destruction_receiver(this);\n  SetMenu(hwnd_, main_menu ? main_menu->handle() : nullptr);\n  if (destruction_receiver.IsWindowDestroyedOrClosed()) {\n    return;\n  }\n}\n\nvoid Win32Window::CompleteMainMenuItemsUpdateImpl() {\n  if (IsFullscreen()) {\n    return;\n  }\n  DrawMenuBar(hwnd_);\n}\n\nvoid Win32Window::ApplyNewMouseCapture() {\n  WindowDestructionReceiver destruction_receiver(this);\n  SetCapture(hwnd_);\n  if (destruction_receiver.IsWindowDestroyedOrClosed()) {\n    return;\n  }\n}\n\nvoid Win32Window::ApplyNewMouseRelease() {\n  if (GetCapture() != hwnd_) {\n    return;\n  }\n  WindowDestructionReceiver destruction_receiver(this);\n  ReleaseCapture();\n  if (destruction_receiver.IsWindowDestroyedOrClosed()) {\n    return;\n  }\n}\n\nvoid Win32Window::ApplyNewCursorVisibility(\n    CursorVisibility old_cursor_visibility) {\n  CursorVisibility new_cursor_visibility = GetCursorVisibility();\n  cursor_currently_auto_hidden_ = false;\n  if (new_cursor_visibility == CursorVisibility::kAutoHidden) {\n    if (!GetCursorPos(&cursor_auto_hide_last_screen_pos_)) {\n      cursor_auto_hide_last_screen_pos_.x = LONG_MAX;\n      cursor_auto_hide_last_screen_pos_.y = LONG_MAX;\n    }\n    cursor_currently_auto_hidden_ = true;\n  } else if (old_cursor_visibility == CursorVisibility::kAutoHidden) {\n    if (cursor_auto_hide_timer_) {\n      DeleteTimerQueueTimer(nullptr, cursor_auto_hide_timer_, nullptr);\n      cursor_auto_hide_timer_ = nullptr;\n    }\n  }\n  SetCursorIfFocusedOnClientArea(\n      new_cursor_visibility == CursorVisibility::kVisible ? arrow_cursor_\n                                                          : nullptr);\n}\n\nvoid Win32Window::FocusImpl() { SetFocus(hwnd_); }\n\nstd::unique_ptr<Surface> Win32Window::CreateSurfaceImpl(\n    Surface::TypeFlags allowed_types) {\n  HINSTANCE hInstance =\n      static_cast<const Win32WindowedAppContext&>(app_context()).hinstance();\n  if (allowed_types & Surface::kTypeFlag_Win32Hwnd) {\n    return std::make_unique<Win32HwndSurface>(hInstance, hwnd_);\n  }\n  return nullptr;\n}\n\nvoid Win32Window::RequestPaintImpl() { InvalidateRect(hwnd_, nullptr, FALSE); }\n\nBOOL Win32Window::AdjustWindowRectangle(RECT& rect, DWORD style, BOOL menu,\n                                        DWORD ex_style, UINT dpi) const {\n  const Win32WindowedAppContext& win32_app_context =\n      static_cast<const Win32WindowedAppContext&>(app_context());\n  const Win32WindowedAppContext::PerMonitorDpiV2Api* per_monitor_dpi_v2_api =\n      win32_app_context.per_monitor_dpi_v2_api();\n  if (per_monitor_dpi_v2_api) {\n    return per_monitor_dpi_v2_api->adjust_window_rect_ex_for_dpi(\n        &rect, style, menu, ex_style, dpi);\n  }\n  // Before per-monitor DPI v2, there was no rescaling of the non-client\n  // area at runtime at all, so throughout the execution of the process it will\n  // behave the same regardless of the DPI.\n  return AdjustWindowRectEx(&rect, style, menu, ex_style);\n}\n\nBOOL Win32Window::AdjustWindowRectangle(RECT& rect) const {\n  if (!hwnd_) {\n    return FALSE;\n  }\n  return AdjustWindowRectangle(rect, GetWindowLong(hwnd_, GWL_STYLE),\n                               BOOL(GetMainMenu() != nullptr),\n                               GetWindowLong(hwnd_, GWL_EXSTYLE), dpi_);\n}\n\nuint32_t Win32Window::GetCurrentSystemDpi() const {\n  const Win32WindowedAppContext& win32_app_context =\n      static_cast<const Win32WindowedAppContext&>(app_context());\n  const Win32WindowedAppContext::PerMonitorDpiV2Api* per_monitor_dpi_v2_api =\n      win32_app_context.per_monitor_dpi_v2_api();\n  if (per_monitor_dpi_v2_api) {\n    return per_monitor_dpi_v2_api->get_dpi_for_system();\n  }\n\n  HDC screen_hdc = GetDC(nullptr);\n  if (!screen_hdc) {\n    return USER_DEFAULT_SCREEN_DPI;\n  }\n  // According to MSDN, x and y are identical.\n  int logical_pixels_x = GetDeviceCaps(screen_hdc, LOGPIXELSX);\n  ReleaseDC(nullptr, screen_hdc);\n  return uint32_t(logical_pixels_x);\n}\n\nuint32_t Win32Window::GetCurrentDpi() const {\n  if (hwnd_) {\n    const Win32WindowedAppContext& win32_app_context =\n        static_cast<const Win32WindowedAppContext&>(app_context());\n\n    const Win32WindowedAppContext::PerMonitorDpiV2Api* per_monitor_dpi_v2_api =\n        win32_app_context.per_monitor_dpi_v2_api();\n    if (per_monitor_dpi_v2_api) {\n      return per_monitor_dpi_v2_api->get_dpi_for_window(hwnd_);\n    }\n\n    const Win32WindowedAppContext::PerMonitorDpiV1Api* per_monitor_dpi_v1_api =\n        win32_app_context.per_monitor_dpi_v1_api();\n    if (per_monitor_dpi_v1_api) {\n      HMONITOR monitor = MonitorFromWindow(hwnd_, MONITOR_DEFAULTTONEAREST);\n      UINT monitor_dpi_x, monitor_dpi_y;\n      if (monitor &&\n          SUCCEEDED(per_monitor_dpi_v1_api->get_dpi_for_monitor(\n              monitor, MDT_DEFAULT, &monitor_dpi_x, &monitor_dpi_y))) {\n        // According to MSDN, x and y are identical.\n        return monitor_dpi_x;\n      }\n    }\n  }\n\n  return GetCurrentSystemDpi();\n}\n\nvoid Win32Window::ApplyFullscreenEntry(\n    WindowDestructionReceiver& destruction_receiver) {\n  if (!IsFullscreen()) {\n    return;\n  }\n\n  // https://blogs.msdn.com/b/oldnewthing/archive/2010/04/12/9994016.aspx\n  // No reason to use MONITOR_DEFAULTTOPRIMARY instead of\n  // MONITOR_DEFAULTTONEAREST, however.\n  pre_fullscreen_dpi_ = dpi_;\n  pre_fullscreen_placement_.length = sizeof(pre_fullscreen_placement_);\n  HMONITOR monitor;\n  MONITORINFO monitor_info;\n  monitor_info.cbSize = sizeof(monitor_info);\n  if (!GetWindowPlacement(hwnd_, &pre_fullscreen_placement_) ||\n      !(monitor = MonitorFromWindow(hwnd_, MONITOR_DEFAULTTONEAREST)) ||\n      !GetMonitorInfo(monitor, &monitor_info)) {\n    OnDesiredFullscreenUpdate(false);\n    return;\n  }\n  // Preserve values for DPI rescaling of the window in the non-maximized state\n  // if DPI is changed mid-fullscreen.\n  // Get the size of the non-client area to subtract it from the size of the\n  // entire window in its non-maximized state, to get the client area. For\n  // safety, in case the window is somehow smaller than its non-client area\n  // (AdjustWindowRect is not exact in various cases also, such as when the menu\n  // becomes multiline), clamp to 0.\n  RECT non_client_area_rect = {};\n  AdjustWindowRectangle(non_client_area_rect);\n  pre_fullscreen_normal_client_width_ = uint32_t(\n      std::max((pre_fullscreen_placement_.rcNormalPosition.right -\n                pre_fullscreen_placement_.rcNormalPosition.left) -\n                   (non_client_area_rect.right - non_client_area_rect.left),\n               LONG(0)));\n  pre_fullscreen_normal_client_height_ = uint32_t(\n      std::max((pre_fullscreen_placement_.rcNormalPosition.bottom -\n                pre_fullscreen_placement_.rcNormalPosition.top) -\n                   (non_client_area_rect.bottom - non_client_area_rect.top),\n               LONG(0)));\n\n  // Changing the style and the menu may change the size too, don't handle the\n  // resize multiple times (also potentially with the listeners changing the\n  // desired fullscreen if called from the handling of some message like\n  // WM_SIZE).\n  BeginBatchedSizeUpdate();\n\n  // Remove the non-client area.\n  if (GetMainMenu()) {\n    SetMenu(hwnd_, nullptr);\n    if (destruction_receiver.IsWindowDestroyedOrClosed()) {\n      if (!destruction_receiver.IsWindowDestroyed()) {\n        EndBatchedSizeUpdate(destruction_receiver);\n      }\n      return;\n    }\n  }\n  SetWindowLong(hwnd_, GWL_STYLE,\n                GetWindowLong(hwnd_, GWL_STYLE) & ~DWORD(WS_OVERLAPPEDWINDOW));\n  if (destruction_receiver.IsWindowDestroyedOrClosed()) {\n    if (!destruction_receiver.IsWindowDestroyed()) {\n      EndBatchedSizeUpdate(destruction_receiver);\n    }\n    return;\n  }\n\n  // Resize the window to fullscreen. It is important that this is done _after_\n  // disabling the decorations and the menu, to make sure that composition will\n  // not have to be done for the new size of the window at all, so independent,\n  // low-latency presentation is possible immediately - if the window was\n  // involved in composition, it may stay composed persistently until some other\n  // state change that sometimes helps, sometimes doesn't, even if it becomes\n  // borderless fullscreen again - this occurs sometimes at least on Windows 11\n  // 21H2 on Nvidia GeForce GTX 1070 on driver version 472.12.\n  SetWindowPos(hwnd_, HWND_TOP, monitor_info.rcMonitor.left,\n               monitor_info.rcMonitor.top,\n               monitor_info.rcMonitor.right - monitor_info.rcMonitor.left,\n               monitor_info.rcMonitor.bottom - monitor_info.rcMonitor.top,\n               SWP_NOOWNERZORDER | SWP_FRAMECHANGED);\n  if (destruction_receiver.IsWindowDestroyedOrClosed()) {\n    if (!destruction_receiver.IsWindowDestroyed()) {\n      EndBatchedSizeUpdate(destruction_receiver);\n    }\n    return;\n  }\n\n  EndBatchedSizeUpdate(destruction_receiver);\n  if (destruction_receiver.IsWindowDestroyedOrClosed()) {\n    return;\n  }\n}\n\nvoid Win32Window::HandleSizeUpdate(\n    WindowDestructionReceiver& destruction_receiver) {\n  if (!hwnd_) {\n    // Batched size update ended when the window has already been closed, for\n    // instance.\n    return;\n  }\n\n  {\n    MonitorUpdateEvent e(this, false);\n    OnMonitorUpdate(e);\n  }\n\n  // For the desired size in the normal, not maximized and not fullscreen state.\n  if (!IsFullscreen()) {\n    WINDOWPLACEMENT window_placement;\n    window_placement.length = sizeof(window_placement);\n    if (GetWindowPlacement(hwnd_, &window_placement)) {\n      // window_placement.rcNormalPosition is the entire window's rectangle, not\n      // only the client area - convert to client.\n      // https://devblogs.microsoft.com/oldnewthing/20131017-00/?p=2903\n      // For safety, in case the window is somehow smaller than its non-client\n      // area (AdjustWindowRect is not exact in various cases also, such as when\n      // the menu becomes multiline), clamp to 0.\n      RECT non_client_area_rect = {};\n      if (AdjustWindowRectangle(non_client_area_rect)) {\n        OnDesiredLogicalSizeUpdate(\n            SizeToLogical(uint32_t(std::max(\n                (window_placement.rcNormalPosition.right -\n                 window_placement.rcNormalPosition.left) -\n                    (non_client_area_rect.right - non_client_area_rect.left),\n                LONG(0)))),\n            SizeToLogical(uint32_t(std::max(\n                (window_placement.rcNormalPosition.bottom -\n                 window_placement.rcNormalPosition.top) -\n                    (non_client_area_rect.bottom - non_client_area_rect.top),\n                LONG(0)))));\n      }\n    }\n  }\n\n  // For the actual state.\n  // GetClientRect returns a rectangle with 0 origin.\n  RECT client_rect;\n  if (GetClientRect(hwnd_, &client_rect)) {\n    OnActualSizeUpdate(uint32_t(client_rect.right),\n                       uint32_t(client_rect.bottom), destruction_receiver);\n    if (destruction_receiver.IsWindowDestroyedOrClosed()) {\n      return;\n    }\n  }\n}\n\nvoid Win32Window::BeginBatchedSizeUpdate() {\n  // It's okay if batched_size_update_contained_* are not false when beginning\n  // a batched update, in case the new batched update was started by a window\n  // listener called from within EndBatchedSizeUpdate.\n  ++batched_size_update_depth_;\n}\n\nvoid Win32Window::EndBatchedSizeUpdate(\n    WindowDestructionReceiver& destruction_receiver) {\n  assert_not_zero(batched_size_update_depth_);\n  if (--batched_size_update_depth_) {\n    return;\n  }\n  // Resetting batched_size_update_contained_* in closing, not opening, because\n  // a listener may start a new batch, and finish it, and there won't be need to\n  // handle the deferred messages twice.\n  if (batched_size_update_contained_wm_size_) {\n    batched_size_update_contained_wm_size_ = false;\n    HandleSizeUpdate(destruction_receiver);\n    if (destruction_receiver.IsWindowDestroyed()) {\n      return;\n    }\n  }\n  if (batched_size_update_contained_wm_paint_) {\n    batched_size_update_contained_wm_paint_ = false;\n    RequestPaint();\n  }\n}\n\nbool Win32Window::HandleMouse(UINT message, WPARAM wParam, LPARAM lParam,\n                              WindowDestructionReceiver& destruction_receiver) {\n  // Mouse messages usually contain the position in the client area in lParam,\n  // but WM_MOUSEWHEEL is an exception, it passes the screen position.\n  int32_t message_x = GET_X_LPARAM(lParam);\n  int32_t message_y = GET_Y_LPARAM(lParam);\n  bool message_pos_is_screen = message == WM_MOUSEWHEEL;\n\n  POINT client_pos = {message_x, message_y};\n  if (message_pos_is_screen) {\n    ScreenToClient(hwnd_, &client_pos);\n  }\n\n  if (GetCursorVisibility() == CursorVisibility::kAutoHidden) {\n    POINT screen_pos = {message_x, message_y};\n    if (message_pos_is_screen || ClientToScreen(hwnd_, &screen_pos)) {\n      if (screen_pos.x != cursor_auto_hide_last_screen_pos_.x ||\n          screen_pos.y != cursor_auto_hide_last_screen_pos_.y) {\n        // WM_MOUSEMOVE messages followed by WM_SETCURSOR may be sent for\n        // reasons not always involving actual mouse movement performed by the\n        // user. They're sent when the position of the cursor relative to the\n        // client area has been changed, as well as other events related to\n        // window management (including when creating the window), even when not\n        // interacting with the OS. These should not be revealing the cursor.\n        // Only revealing it if the mouse has actually been moved.\n        cursor_currently_auto_hidden_ = false;\n        SetCursorAutoHideTimer();\n        // There's no need to SetCursor here, mouse messages relevant to the\n        // cursor within the window are always followed by WM_SETCURSOR.\n        cursor_auto_hide_last_screen_pos_ = screen_pos;\n      }\n    }\n  }\n\n  MouseEvent::Button button = MouseEvent::Button::kNone;\n  int32_t scroll_y = 0;\n  switch (message) {\n    case WM_LBUTTONDOWN:\n    case WM_LBUTTONUP:\n      button = MouseEvent::Button::kLeft;\n      break;\n    case WM_RBUTTONDOWN:\n    case WM_RBUTTONUP:\n      button = MouseEvent::Button::kRight;\n      break;\n    case WM_MBUTTONDOWN:\n    case WM_MBUTTONUP:\n      button = MouseEvent::Button::kMiddle;\n      break;\n    case WM_XBUTTONDOWN:\n    case WM_XBUTTONUP:\n      switch (GET_XBUTTON_WPARAM(wParam)) {\n        case XBUTTON1:\n          button = MouseEvent::Button::kX1;\n          break;\n        case XBUTTON2:\n          button = MouseEvent::Button::kX2;\n          break;\n        default:\n          // Still handle the movement.\n          break;\n      }\n      break;\n    case WM_MOUSEMOVE:\n      button = MouseEvent::Button::kNone;\n      break;\n    case WM_MOUSEWHEEL:\n      button = MouseEvent::Button::kNone;\n      static_assert(\n          MouseEvent::kScrollPerDetent == WHEEL_DELTA,\n          \"Assuming the Windows scroll amount can be passed directly to \"\n          \"MouseEvent\");\n      scroll_y = GET_WHEEL_DELTA_WPARAM(wParam);\n      break;\n    default:\n      return false;\n  }\n\n  MouseEvent e(this, button, client_pos.x, client_pos.y, 0, scroll_y);\n  switch (message) {\n    case WM_LBUTTONDOWN:\n    case WM_RBUTTONDOWN:\n    case WM_MBUTTONDOWN:\n    case WM_XBUTTONDOWN:\n      OnMouseDown(e, destruction_receiver);\n      break;\n    case WM_LBUTTONUP:\n    case WM_RBUTTONUP:\n    case WM_MBUTTONUP:\n    case WM_XBUTTONUP:\n      OnMouseUp(e, destruction_receiver);\n      break;\n    case WM_MOUSEMOVE:\n      OnMouseMove(e, destruction_receiver);\n      break;\n    case WM_MOUSEWHEEL:\n      OnMouseWheel(e, destruction_receiver);\n      break;\n    default:\n      break;\n  }\n  // Returning immediately anyway - no need to check\n  // destruction_receiver.IsWindowDestroyed().\n  return e.is_handled();\n}\n\nbool Win32Window::HandleKeyboard(\n    UINT message, WPARAM wParam, LPARAM lParam,\n    WindowDestructionReceiver& destruction_receiver) {\n  KeyEvent e(this, VirtualKey(wParam), lParam & 0xFFFF,\n             !!(lParam & (LPARAM(1) << 30)), !!(GetKeyState(VK_SHIFT) & 0x80),\n             !!(GetKeyState(VK_CONTROL) & 0x80),\n             !!(GetKeyState(VK_MENU) & 0x80), !!(GetKeyState(VK_LWIN) & 0x80));\n  switch (message) {\n    case WM_KEYDOWN:\n      OnKeyDown(e, destruction_receiver);\n      break;\n    case WM_KEYUP:\n      OnKeyUp(e, destruction_receiver);\n      break;\n    case WM_CHAR:\n      OnKeyChar(e, destruction_receiver);\n      break;\n    default:\n      break;\n  }\n  // Returning immediately anyway - no need to check\n  // destruction_receiver.IsWindowDestroyed().\n  return e.is_handled();\n}\n\nvoid Win32Window::SetCursorIfFocusedOnClientArea(HCURSOR cursor) const {\n  if (!HasFocus()) {\n    return;\n  }\n  POINT cursor_pos;\n  if (!GetCursorPos(&cursor_pos)) {\n    return;\n  }\n  if (WindowFromPoint(cursor_pos) == hwnd_ &&\n      SendMessage(hwnd_, WM_NCHITTEST, 0,\n                  MAKELONG(cursor_pos.x, cursor_pos.y)) == HTCLIENT) {\n    SetCursor(cursor);\n  }\n}\n\nvoid Win32Window::SetCursorAutoHideTimer() {\n  // Reset the timer by deleting the old timer and creating the new one.\n  // ChangeTimerQueueTimer doesn't work if the timer has already expired.\n  if (cursor_auto_hide_timer_) {\n    DeleteTimerQueueTimer(nullptr, cursor_auto_hide_timer_, nullptr);\n    cursor_auto_hide_timer_ = nullptr;\n  }\n  // After making sure that the callback is not callable anymore\n  // (DeleteTimerQueueTimer waits for the completion of the callback if it has\n  // been called already, or cancels it if it's hasn't), update the most recent\n  // message revision.\n  last_cursor_auto_hide_queued = last_cursor_auto_hide_signaled + 1;\n  CreateTimerQueueTimer(&cursor_auto_hide_timer_, nullptr,\n                        AutoHideCursorTimerCallback, this,\n                        kDefaultCursorAutoHideMilliseconds, 0,\n                        WT_EXECUTEINTIMERTHREAD | WT_EXECUTEONLYONCE);\n}\n\nvoid Win32Window::AutoHideCursorTimerCallback(void* parameter,\n                                              BOOLEAN timer_or_wait_fired) {\n  if (!timer_or_wait_fired) {\n    // Not a timer callback.\n    return;\n  }\n  Win32Window& window = *static_cast<Win32Window*>(parameter);\n  window.last_cursor_auto_hide_signaled = window.last_cursor_auto_hide_queued;\n  SendMessage(window.hwnd_, kUserMessageAutoHideCursor,\n              window.last_cursor_auto_hide_signaled, 0);\n}\n\nLRESULT Win32Window::WndProc(HWND hWnd, UINT message, WPARAM wParam,\n                             LPARAM lParam) {\n  if (message >= WM_MOUSEFIRST && message <= WM_MOUSELAST) {\n    WindowDestructionReceiver destruction_receiver(this);\n    // Returning immediately anyway - no need to check\n    // destruction_receiver.IsWindowDestroyed() afterwards.\n    return HandleMouse(message, wParam, lParam, destruction_receiver)\n               ? 0\n               : DefWindowProc(hWnd, message, wParam, lParam);\n  }\n  if (message >= WM_KEYFIRST && message <= WM_KEYLAST) {\n    WindowDestructionReceiver destruction_receiver(this);\n    // Returning immediately anyway - no need to check\n    // destruction_receiver.IsWindowDestroyed() afterwards.\n    return HandleKeyboard(message, wParam, lParam, destruction_receiver)\n               ? 0\n               : DefWindowProc(hWnd, message, wParam, lParam);\n  }\n\n  switch (message) {\n    case WM_CLOSE:\n    // In case the Windows window was somehow forcibly destroyed without\n    // WM_CLOSE.\n    case WM_DESTROY: {\n      if (cursor_auto_hide_timer_) {\n        DeleteTimerQueueTimer(nullptr, cursor_auto_hide_timer_, nullptr);\n        cursor_auto_hide_timer_ = nullptr;\n      }\n      {\n        WindowDestructionReceiver destruction_receiver(this);\n        OnBeforeClose(destruction_receiver);\n        if (destruction_receiver.IsWindowDestroyed()) {\n          break;\n        }\n      }\n      // Set hwnd_ to null to ignore events from now on since this Win32Window\n      // is entering an indeterminate state - this should be done at some point\n      // in closing anyway.\n      hwnd_ = nullptr;\n      SetWindowLongPtr(hWnd, GWLP_USERDATA, 0);\n      if (message != WM_DESTROY) {\n        DestroyWindow(hWnd);\n      }\n      OnAfterClose();\n    } break;\n\n    case WM_DROPFILES: {\n      HDROP drop_handle = reinterpret_cast<HDROP>(wParam);\n      auto drop_count = DragQueryFileW(drop_handle, 0xFFFFFFFFu, nullptr, 0);\n      if (drop_count > 0) {\n        // Get required buffer size\n        UINT path_size = DragQueryFileW(drop_handle, 0, nullptr, 0);\n        if (path_size > 0 && path_size < 0xFFFFFFFFu) {\n          std::u16string path;\n          ++path_size;             // Ensure space for the null terminator\n          path.resize(path_size);  // Reserve space\n          // Only getting first file dropped (other files ignored)\n          path_size =\n              DragQueryFileW(drop_handle, 0, (LPWSTR)&path[0], path_size);\n          if (path_size > 0) {\n            path.resize(path_size);  // Will drop the null terminator\n            FileDropEvent e(this, xe::to_path(path));\n            WindowDestructionReceiver destruction_receiver(this);\n            OnFileDrop(e, destruction_receiver);\n            if (destruction_receiver.IsWindowDestroyedOrClosed()) {\n              DragFinish(drop_handle);\n              break;\n            }\n          }\n        }\n      }\n      DragFinish(drop_handle);\n    } break;\n\n    case WM_MOVE: {\n      OnMonitorUpdate(MonitorUpdateEvent(this, false));\n    } break;\n\n    case WM_SIZE: {\n      if (batched_size_update_depth_) {\n        batched_size_update_contained_wm_size_ = true;\n      } else {\n        WindowDestructionReceiver destruction_receiver(this);\n        HandleSizeUpdate(destruction_receiver);\n        if (destruction_receiver.IsWindowDestroyedOrClosed()) {\n          break;\n        }\n      }\n    } break;\n\n    case WM_PAINT: {\n      if (batched_size_update_depth_) {\n        // Avoid painting an outdated surface during a batched size update when\n        // WM_SIZE handling is deferred.\n        batched_size_update_contained_wm_paint_ = true;\n      } else {\n        ValidateRect(hwnd_, nullptr);\n        OnPaint();\n      }\n      // Custom painting via OnPaint - don't pass to DefWindowProc.\n      return 0;\n    } break;\n\n    case WM_ERASEBKGND: {\n      if (HasSurface()) {\n        // Don't erase between paints because painting may be dropped if nothing\n        // has changed since the last one.\n        return 0;\n      }\n    } break;\n\n    case WM_DISPLAYCHANGE: {\n      OnMonitorUpdate(MonitorUpdateEvent(this, true));\n    } break;\n\n    case WM_DPICHANGED: {\n      // Note that for some reason, WM_DPICHANGED is not sent when the window is\n      // borderless fullscreen with per-monitor DPI awareness v1.\n\n      dpi_ = GetCurrentDpi();\n\n      WindowDestructionReceiver destruction_receiver(this);\n\n      {\n        UISetupEvent e(this);\n        OnDpiChanged(e, destruction_receiver);\n        // The window might have been closed by the handler, check hwnd_ too\n        // since it's needed below.\n        if (destruction_receiver.IsWindowDestroyedOrClosed()) {\n          break;\n        }\n      }\n\n      auto rect = reinterpret_cast<const RECT*>(lParam);\n      if (rect) {\n        // SetWindowPos arguments according to WM_DPICHANGED MSDN documentation.\n        // https://docs.microsoft.com/en-us/windows/win32/hidpi/wm-dpichanged\n        // There's no need to handle the maximized state any special way (by\n        // updating the window placement instead of the window position in this\n        // case, for instance), as Windows (by design) restores the window when\n        // changing the DPI to a new one.\n        SetWindowPos(hwnd_, nullptr, int(rect->left), int(rect->top),\n                     int(rect->right - rect->left),\n                     int(rect->bottom - rect->top),\n                     SWP_NOZORDER | SWP_NOACTIVATE);\n        if (destruction_receiver.IsWindowDestroyedOrClosed()) {\n          break;\n        }\n      }\n    } break;\n\n    case WM_KILLFOCUS: {\n      WindowDestructionReceiver destruction_receiver(this);\n      OnFocusUpdate(false, destruction_receiver);\n      if (destruction_receiver.IsWindowDestroyedOrClosed()) {\n        break;\n      }\n    } break;\n\n    case WM_SETFOCUS: {\n      WindowDestructionReceiver destruction_receiver(this);\n      OnFocusUpdate(true, destruction_receiver);\n      if (destruction_receiver.IsWindowDestroyedOrClosed()) {\n        break;\n      }\n    } break;\n\n    case WM_SETCURSOR: {\n      if (reinterpret_cast<HWND>(wParam) == hwnd_ && HasFocus() &&\n          LOWORD(lParam) == HTCLIENT) {\n        switch (GetCursorVisibility()) {\n          case CursorVisibility::kAutoHidden: {\n            // Always revealing the cursor in case of events like clicking, but\n            // WM_MOUSEMOVE messages may be sent for reasons not always\n            // involving actual mouse movement performed by the user. Revealing\n            // the cursor in case of movement is done in HandleMouse instead.\n            if (HIWORD(lParam) != WM_MOUSEMOVE) {\n              cursor_currently_auto_hidden_ = false;\n              SetCursorAutoHideTimer();\n            }\n            if (cursor_currently_auto_hidden_) {\n              SetCursor(nullptr);\n              return TRUE;\n            }\n          } break;\n          case CursorVisibility::kHidden:\n            SetCursor(nullptr);\n            return TRUE;\n          default:\n            break;\n        }\n      }\n      // For the non-client area, and for visible cursor, letting normal\n      // processing happen, setting the cursor to an arrow or to something\n      // specific to non-client parts of the window.\n    } break;\n\n    case kUserMessageAutoHideCursor: {\n      // Recheck the cursor visibility - the callback might have been called\n      // before or while the timer is deleted. Also ignore messages from\n      // outdated mouse interactions.\n      if (GetCursorVisibility() == CursorVisibility::kAutoHidden &&\n          wParam == last_cursor_auto_hide_queued) {\n        // The timer object is not needed anymore.\n        if (cursor_auto_hide_timer_) {\n          DeleteTimerQueueTimer(nullptr, cursor_auto_hide_timer_, nullptr);\n          cursor_auto_hide_timer_ = nullptr;\n        }\n        cursor_currently_auto_hidden_ = true;\n        SetCursorIfFocusedOnClientArea(nullptr);\n      }\n      return 0;\n    } break;\n\n    case WM_TABLET_QUERYSYSTEMGESTURESTATUS:\n      return\n          // disables press and hold (right-click) gesture\n          TABLET_DISABLE_PRESSANDHOLD |\n          // disables UI feedback on pen up (waves)\n          TABLET_DISABLE_PENTAPFEEDBACK |\n          // disables UI feedback on pen button down (circle)\n          TABLET_DISABLE_PENBARRELFEEDBACK |\n          // disables pen flicks (back, forward, drag down, drag up)\n          TABLET_DISABLE_FLICKS | TABLET_DISABLE_TOUCHSWITCH |\n          TABLET_DISABLE_SMOOTHSCROLLING | TABLET_DISABLE_TOUCHUIFORCEON |\n          TABLET_ENABLE_MULTITOUCHDATA;\n\n    case WM_MENUCOMMAND: {\n      MENUINFO menu_info = {0};\n      menu_info.cbSize = sizeof(menu_info);\n      menu_info.fMask = MIM_MENUDATA;\n      GetMenuInfo(HMENU(lParam), &menu_info);\n      auto parent_item = reinterpret_cast<Win32MenuItem*>(menu_info.dwMenuData);\n      auto child_item =\n          reinterpret_cast<Win32MenuItem*>(parent_item->child(wParam));\n      assert_not_null(child_item);\n      WindowDestructionReceiver destruction_receiver(this);\n      child_item->OnSelected();\n      if (destruction_receiver.IsWindowDestroyed()) {\n        break;\n      }\n      // The menu item might have been destroyed by its OnSelected, don't do\n      // anything with it here from now on.\n    } break;\n  }\n\n  // The window might have been destroyed by the handlers, don't interact with\n  // *this in this function from now on.\n\n  // Passing the original hWnd argument rather than hwnd_ as the window might\n  // have been closed or destroyed by a handler, making hwnd_ null even though\n  // DefWindowProc still needs to be called to propagate the closing-related\n  // messages needed by Windows, or inaccessible (due to use-after-free) at all.\n  return DefWindowProc(hWnd, message, wParam, lParam);\n}\n\nLRESULT CALLBACK Win32Window::WndProcThunk(HWND hWnd, UINT message,\n                                           WPARAM wParam, LPARAM lParam) {\n  if (hWnd) {\n    Win32Window* window = nullptr;\n    if (message == WM_NCCREATE) {\n      auto create_struct = reinterpret_cast<LPCREATESTRUCT>(lParam);\n      window = reinterpret_cast<Win32Window*>(create_struct->lpCreateParams);\n      SetWindowLongPtr(hWnd, GWLP_USERDATA, (__int3264)(LONG_PTR)window);\n      // Don't miss any messages (as they may have effect on the actual state\n      // stored in Win32Window) sent before the completion of CreateWindowExW\n      // dropped because `window->hwnd_ != hWnd`, when the result of\n      // CreateWindowExW still hasn't been assigned to `hwnd_` (however, don't\n      // reattach this window to a closed window if WM_NCCREATE was somehow sent\n      // to a window being closed).\n      if (window->phase() == Phase::kOpening) {\n        assert_true(!window->hwnd_ || window->hwnd_ == hWnd);\n        window->hwnd_ = hWnd;\n      }\n      // Enable non-client area DPI scaling for AdjustWindowRectExForDpi to work\n      // correctly between Windows 10 1607 (when AdjustWindowRectExForDpi and\n      // EnableNonClientDpiScaling were added) and 1703 (when per-monitor\n      // awareness version 2 was added with automatically enabled non-client\n      // area DPI scaling).\n      const Win32WindowedAppContext& win32_app_context =\n          static_cast<const Win32WindowedAppContext&>(window->app_context());\n      const Win32WindowedAppContext::PerMonitorDpiV2Api*\n          per_monitor_dpi_v2_api = win32_app_context.per_monitor_dpi_v2_api();\n      if (per_monitor_dpi_v2_api) {\n        per_monitor_dpi_v2_api->enable_non_client_dpi_scaling(hWnd);\n      }\n      // Already fully handled, no need to call Win32Window::WndProc.\n    } else {\n      window =\n          reinterpret_cast<Win32Window*>(GetWindowLongPtr(hWnd, GWLP_USERDATA));\n      if (window && window->hwnd_ == hWnd) {\n        return window->WndProc(hWnd, message, wParam, lParam);\n      }\n    }\n  }\n  return DefWindowProc(hWnd, message, wParam, lParam);\n}\n\nstd::unique_ptr<ui::MenuItem> MenuItem::Create(Type type,\n                                               const std::string& text,\n                                               const std::string& hotkey,\n                                               std::function<void()> callback) {\n  return std::make_unique<Win32MenuItem>(type, text, hotkey, callback);\n}\n\nWin32MenuItem::Win32MenuItem(Type type, const std::string& text,\n                             const std::string& hotkey,\n                             std::function<void()> callback)\n    : MenuItem(type, text, hotkey, std::move(callback)) {\n  switch (type) {\n    case MenuItem::Type::kNormal:\n      handle_ = CreateMenu();\n      break;\n    case MenuItem::Type::kPopup:\n      handle_ = CreatePopupMenu();\n      break;\n    default:\n      // May just be a placeholder.\n      break;\n  }\n  if (handle_) {\n    MENUINFO menu_info = {0};\n    menu_info.cbSize = sizeof(menu_info);\n    menu_info.fMask = MIM_MENUDATA | MIM_STYLE;\n    menu_info.dwMenuData = ULONG_PTR(this);\n    menu_info.dwStyle = MNS_NOTIFYBYPOS;\n    SetMenuInfo(handle_, &menu_info);\n  }\n}\n\nWin32MenuItem::~Win32MenuItem() {\n  if (handle_) {\n    DestroyMenu(handle_);\n  }\n}\n\nvoid Win32MenuItem::SetEnabled(bool enabled) {\n  UINT enable_flags = MF_BYPOSITION | (enabled ? MF_ENABLED : MF_GRAYED);\n  UINT i = 0;\n  for (auto iter = children_.begin(); iter != children_.end(); ++iter, ++i) {\n    EnableMenuItem(handle_, i, enable_flags);\n  }\n}\n\nvoid Win32MenuItem::OnChildAdded(MenuItem* generic_child_item) {\n  auto child_item = static_cast<Win32MenuItem*>(generic_child_item);\n\n  switch (child_item->type()) {\n    case MenuItem::Type::kNormal:\n      // Nothing special.\n      break;\n    case MenuItem::Type::kPopup:\n      AppendMenuW(\n          handle_, MF_POPUP, reinterpret_cast<UINT_PTR>(child_item->handle()),\n          reinterpret_cast<LPCWSTR>(xe::to_utf16(child_item->text()).c_str()));\n      break;\n    case MenuItem::Type::kSeparator:\n      AppendMenuW(handle_, MF_SEPARATOR, UINT_PTR(child_item->handle_), 0);\n      break;\n    case MenuItem::Type::kString:\n      auto full_name = child_item->text();\n      if (!child_item->hotkey().empty()) {\n        full_name += \"\\t\" + child_item->hotkey();\n      }\n      AppendMenuW(handle_, MF_STRING, UINT_PTR(child_item->handle_),\n                  reinterpret_cast<LPCWSTR>(xe::to_utf16(full_name).c_str()));\n      break;\n  }\n}\n\nvoid Win32MenuItem::OnChildRemoved(MenuItem* generic_child_item) {}\n\n}  // namespace ui\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/ui/window_win.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_WINDOW_WIN_H_\n#define XENIA_UI_WINDOW_WIN_H_\n\n#include <memory>\n#include <string>\n\n#include \"xenia/ui/menu_item.h\"\n#include \"xenia/ui/window.h\"\n\n// Must be included before Windows headers for things like NOMINMAX.\n#include \"xenia/base/platform_win.h\"\n\n#include \"xenia/ui/dxgi_include_win.h\"\n\n#include <ShellScalingApi.h>\n\nnamespace xe {\nnamespace ui {\n\nclass Win32Window : public Window {\n  using super = Window;\n\n public:\n  Win32Window(WindowedAppContext& app_context, const std::string_view title,\n              uint32_t desired_logical_width, uint32_t desired_logical_height);\n  ~Win32Window() override;\n\n  // Will be null if the window hasn't been successfully opened yet, or has been\n  // closed.\n  HWND hwnd() const { return hwnd_; }\n\n  uint32_t GetMediumDpi() const override;\n\n protected:\n  bool OpenImpl() override;\n  void RequestCloseImpl() override;\n\n  uint32_t GetLatestDpiImpl() const override;\n\n  void ApplyNewFullscreen() override;\n  void ApplyNewTitle() override;\n  void LoadAndApplyIcon(const void* buffer, size_t size,\n                        bool can_apply_state_in_current_phase) override;\n  void ApplyNewMainMenu(MenuItem* old_main_menu) override;\n  void CompleteMainMenuItemsUpdateImpl() override;\n  void ApplyNewMouseCapture() override;\n  void ApplyNewMouseRelease() override;\n  void ApplyNewCursorVisibility(\n      CursorVisibility old_cursor_visibility) override;\n  void FocusImpl() override;\n\n  std::unique_ptr<Surface> CreateSurfaceImpl(\n      Surface::TypeFlags allowed_types) override;\n  void RequestPaintImpl() override;\n\n private:\n  enum : UINT {\n    kUserMessageAutoHideCursor = WM_USER,\n  };\n\n  BOOL AdjustWindowRectangle(RECT& rect, DWORD style, BOOL menu, DWORD ex_style,\n                             UINT dpi) const;\n  BOOL AdjustWindowRectangle(RECT& rect) const;\n\n  uint32_t GetCurrentSystemDpi() const;\n  uint32_t GetCurrentDpi() const;\n\n  void ApplyFullscreenEntry(WindowDestructionReceiver& destruction_receiver);\n\n  void HandleSizeUpdate(WindowDestructionReceiver& destruction_receiver);\n  // For updating multiple factors that may influence the window size at once,\n  // without handling WM_SIZE multiple times (that may not only result in wasted\n  // handling, but also in the state potentially changed to an inconsistent one\n  // in the middle of a size update by the listeners).\n  void BeginBatchedSizeUpdate();\n  void EndBatchedSizeUpdate(WindowDestructionReceiver& destruction_receiver);\n\n  bool HandleMouse(UINT message, WPARAM wParam, LPARAM lParam,\n                   WindowDestructionReceiver& destruction_receiver);\n  bool HandleKeyboard(UINT message, WPARAM wParam, LPARAM lParam,\n                      WindowDestructionReceiver& destruction_receiver);\n\n  void SetCursorIfFocusedOnClientArea(HCURSOR cursor) const;\n  void SetCursorAutoHideTimer();\n  static void NTAPI AutoHideCursorTimerCallback(void* parameter,\n                                                BOOLEAN timer_or_wait_fired);\n\n  static LRESULT CALLBACK WndProcThunk(HWND hWnd, UINT message, WPARAM wParam,\n                                       LPARAM lParam);\n  // This can't handle messages sent during CreateWindow (hwnd_ still not\n  // assigned to) or after nulling hwnd_ in closing / deleting.\n  virtual LRESULT WndProc(HWND hWnd, UINT message, WPARAM wParam,\n                          LPARAM lParam);\n\n  HCURSOR arrow_cursor_ = nullptr;\n\n  HICON icon_ = nullptr;\n\n  uint32_t dpi_ = USER_DEFAULT_SCREEN_DPI;\n\n  // hwnd_ may be accessed by the cursor hiding timer callback from a separate\n  // thread, but the timer can be active only with a valid window anyway.\n  HWND hwnd_ = nullptr;\n\n  uint32_t batched_size_update_depth_ = 0;\n  bool batched_size_update_contained_wm_size_ = false;\n  bool batched_size_update_contained_wm_paint_ = false;\n\n  uint32_t pre_fullscreen_dpi_;\n  WINDOWPLACEMENT pre_fullscreen_placement_;\n  // The client area part of pre_fullscreen_placement_.rcNormalPosition, saved\n  // in case something effecting the behavior of AdjustWindowRectEx for the\n  // non-fullscreen state is changed mid-fullscreen (for instance, the menu is\n  // toggled), so a new AdjustWindowRectExForDpi call for the old DPI, but with\n  // the other state different than the old one, while exiting fullscreen, won't\n  // cause anomalies like negative size.\n  uint32_t pre_fullscreen_normal_client_width_;\n  uint32_t pre_fullscreen_normal_client_height_;\n\n  // Must be the screen position, not the client position, so it's possible to\n  // immediately hide the cursor, for instance, when switching to fullscreen\n  // (and thus changing the client area top-left corner, resulting in\n  // WM_MOUSEMOVE being sent, which would instantly reveal the cursor because of\n  // that relative position change).\n  POINT cursor_auto_hide_last_screen_pos_ = {LONG_MAX, LONG_MAX};\n  // Using a timer queue timer for hiding the cursor rather than WM_TIMER\n  // because the latter is a very low-priority message which is never received\n  // if WM_PAINT messages are sent continuously (invalidating the window right\n  // after painting).\n  HANDLE cursor_auto_hide_timer_ = nullptr;\n  // Last hiding case numbers for skipping of obsolete cursor hiding messages\n  // (both WM_MOUSEMOVE and the hiding message have been sent, for instance, and\n  // WM_MOUSEMOVE hasn't been handled yet, or the cursor visibility state has\n  // been changed). The queued index is read, and the signaled index is written,\n  // by the timer callback, which is executed outside the message thread, so\n  // before modifying the queued number, or reading the signaled number, in the\n  // message thread, delete the timer (deleting the timer awaits cancels the\n  // callback if it hasn't been invoked yet, or awaits it if it has). Use\n  // equality comparison for safe rollover handling.\n  WPARAM last_cursor_auto_hide_queued = 0;\n  WPARAM last_cursor_auto_hide_signaled = 0;\n  // Whether the cursor has been hidden after the expiration of the timer, and\n  // hasn't been revealed yet.\n  bool cursor_currently_auto_hidden_ = false;\n};\n\nclass Win32MenuItem : public MenuItem {\n public:\n  Win32MenuItem(Type type, const std::string& text, const std::string& hotkey,\n                std::function<void()> callback);\n  ~Win32MenuItem() override;\n\n  HMENU handle() const { return handle_; }\n\n  void SetEnabled(bool enabled) override;\n\n  using MenuItem::OnSelected;\n\n protected:\n  void OnChildAdded(MenuItem* child_item) override;\n  void OnChildRemoved(MenuItem* child_item) override;\n\n private:\n  HMENU handle_ = nullptr;\n};\n\n}  // namespace ui\n}  // namespace xe\n\n#endif  // XENIA_UI_WINDOW_WIN_H_\n"
  },
  {
    "path": "src/xenia/ui/windowed_app.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/ui/windowed_app.h\"\n\n#include <string>\n#include <unordered_map>\n\nnamespace xe {\nnamespace ui {\n\n#if XE_UI_WINDOWED_APPS_IN_LIBRARY\n// A zero-initialized pointer to remove dependence on the initialization order\n// of the map relatively to the app creator proxies.\nstd::unordered_map<std::string, WindowedApp::Creator>* WindowedApp::creators_;\n#endif  // XE_UI_WINDOWED_APPS_IN_LIBRARY\n\n}  // namespace ui\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/ui/windowed_app.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_WINDOWED_APP_H_\n#define XENIA_UI_WINDOWED_APP_H_\n\n#include <cstddef>\n#include <memory>\n#include <string>\n#include <unordered_map>\n#include <utility>\n#include <vector>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/platform.h\"\n#include \"xenia/ui/windowed_app_context.h\"\n\n#if XE_PLATFORM_ANDROID\n// Multiple apps in a single library instead of separate executables.\n#define XE_UI_WINDOWED_APPS_IN_LIBRARY 1\n#endif\n\nnamespace xe {\nnamespace ui {\n\n// Interface between the platform's entry points (in the main, UI, thread that\n// also runs the message loop) and the app that implements it.\nclass WindowedApp {\n public:\n  // WindowedApps are expected to provide a static creation function, for\n  // creating an instance of the class (which may be called before\n  // initialization of platform-specific parts, should preferably be as simple\n  // as possible).\n\n  using Creator = std::unique_ptr<xe::ui::WindowedApp> (*)(\n      xe::ui::WindowedAppContext& app_context);\n\n  WindowedApp(const WindowedApp& app) = delete;\n  WindowedApp& operator=(const WindowedApp& app) = delete;\n  virtual ~WindowedApp() = default;\n\n  WindowedAppContext& app_context() const { return app_context_; }\n\n  // Same as the executable (project), xenia-library-app.\n  const std::string& GetName() const { return name_; }\n  const std::string& GetPositionalOptionsUsage() const {\n    return positional_options_usage_;\n  }\n  const std::vector<std::string>& GetPositionalOptions() const {\n    return positional_options_;\n  }\n\n  // Called once before receiving other lifecycle callback invocations. Cvars\n  // will be initialized with the launch arguments. Returns whether the app has\n  // been initialized successfully (otherwise platform-specific code must call\n  // OnDestroy and refuse to continue running the app).\n  virtual bool OnInitialize() = 0;\n  // See OnDestroy for more info.\n  void InvokeOnDestroy() {\n    // For safety and convenience of referencing objects owned by the app in\n    // pending functions queued in or after OnInitialize, make sure they are\n    // executed before telling the app that destruction needs to happen.\n    app_context().ExecutePendingFunctionsFromUIThread();\n    OnDestroy();\n  }\n\n protected:\n  // Positional options should be initialized in the constructor if needed.\n  // Cvars will not have been initialized with the arguments at the moment of\n  // construction (as the result depends on construction).\n  explicit WindowedApp(\n      WindowedAppContext& app_context, const std::string_view name,\n      const std::string_view positional_options_usage = std::string_view())\n      : app_context_(app_context),\n        name_(name),\n        positional_options_usage_(positional_options_usage) {}\n\n  // For calling from the constructor.\n  void AddPositionalOption(const std::string_view option) {\n    positional_options_.emplace_back(option);\n  }\n\n  // OnDestroy entry point may be called (through InvokeOnDestroy) by the\n  // platform-specific lifecycle interface at request of either the app itself\n  // or the OS - thus should be possible for the lifecycle interface to call at\n  // any moment (not from inside other lifecycle callbacks though). The app will\n  // also be destroyed when that happens, so the destructor will also be called\n  // (but this is more safe with respect to exceptions). This is only guaranteed\n  // to be called if OnInitialize has already happened (successfully or not) -\n  // in case of an error before initialization, the destructor may be called\n  // alone as well. Context's pending functions will be executed before the\n  // call, so it's safe to destroy dependencies of them here (though it may\n  // still be possible to add more pending functions here depending on whether\n  // the context was explicitly shut down before this is invoked).\n  virtual void OnDestroy() {}\n\n private:\n  WindowedAppContext& app_context_;\n\n  std::string name_;\n  std::string positional_options_usage_;\n  std::vector<std::string> positional_options_;\n\n#if XE_UI_WINDOWED_APPS_IN_LIBRARY\n public:\n  class CreatorRegistration {\n   public:\n    CreatorRegistration(const std::string_view identifier, Creator creator) {\n      if (!creators_) {\n        // Will be deleted by the last creator registration's destructor, no\n        // need for a library destructor.\n        creators_ = new std::unordered_map<std::string, WindowedApp::Creator>;\n      }\n      iterator_inserted_ = creators_->emplace(identifier, creator);\n      assert_true(iterator_inserted_.second);\n    }\n\n    ~CreatorRegistration() {\n      if (iterator_inserted_.second) {\n        creators_->erase(iterator_inserted_.first);\n        if (creators_->empty()) {\n          delete creators_;\n        }\n      }\n    }\n\n   private:\n    std::pair<std::unordered_map<std::string, Creator>::iterator, bool>\n        iterator_inserted_;\n  };\n\n  static Creator GetCreator(const std::string& identifier) {\n    if (!creators_) {\n      return nullptr;\n    }\n    auto it = creators_->find(identifier);\n    return it != creators_->end() ? it->second : nullptr;\n  }\n\n private:\n  static std::unordered_map<std::string, Creator>* creators_;\n#endif  // XE_UI_WINDOWED_APPS_IN_LIBRARY\n};\n\n#if XE_UI_WINDOWED_APPS_IN_LIBRARY\n// Multiple apps in a single library.\n#define XE_DEFINE_WINDOWED_APP(identifier, creator)                          \\\n  namespace xe {                                                             \\\n  namespace ui {                                                             \\\n  namespace windowed_app_creator_registrations {                             \\\n  xe::ui::WindowedApp::CreatorRegistration identifier(#identifier, creator); \\\n  }                                                                          \\\n  }                                                                          \\\n  }\n#else\n// Separate executables for each app.\nstd::unique_ptr<WindowedApp> (*GetWindowedAppCreator())(\n    WindowedAppContext& app_context);\n#define XE_DEFINE_WINDOWED_APP(identifier, creator)              \\\n  xe::ui::WindowedApp::Creator xe::ui::GetWindowedAppCreator() { \\\n    return creator;                                              \\\n  }\n#endif  // XE_UI_WINDOWED_APPS_IN_LIBRARY\n\n}  // namespace ui\n}  // namespace xe\n\n#endif  // XENIA_UI_WINDOWED_APP_H_\n"
  },
  {
    "path": "src/xenia/ui/windowed_app_context.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/ui/windowed_app_context.h\"\n\n#include <utility>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/threading.h\"\n\nnamespace xe {\nnamespace ui {\n\nWindowedAppContext::~WindowedAppContext() {\n  // The UI thread is responsible for managing the lifetime of the context.\n  assert_true(IsInUIThread());\n\n  // It's okay to destroy the context from a platform's internal UI loop\n  // callback, primarily on platforms where the loop is run by the OS itself,\n  // and the context can't be created and destroyed in a RAII way, rather, it's\n  // created in an initialization handler and destroyed in a shutdown handler\n  // called by the OS. However, destruction must not be done from within the\n  // queued functions - as in this case, the pending function container, the\n  // mutex, will be accessed after having been destroyed already.\n\n  // Make sure CallInUIThreadDeferred doesn't call\n  // NotifyUILoopOfPendingFunctions, which is virtual.\n  is_in_destructor_ = true;\n  // Make sure the final ExecutePendingFunctionsFromUIThread doesn't call\n  // PlatformQuitFromUIThread, which is virtual.\n  has_quit_ = true;\n\n  // Platform-specific quit is expected to be performed by the subclass (the\n  // order of it vs. the final ExecutePendingFunctionsFromUIThread shouldn't\n  // matter anymore, the implementation may assume that no pending functions\n  // will be requested for execution specifically via the platform-specific\n  // loop, as there should be no more references to the context in other\n  // threads), can't call the virtual PlatformQuitFromUIThread anymore.\n  ExecutePendingFunctionsFromUIThread(true);\n}\n\nbool WindowedAppContext::CallInUIThreadDeferred(\n    std::function<void()> function) {\n  {\n    std::unique_lock<std::mutex> pending_functions_lock(\n        pending_functions_mutex_);\n    if (!pending_functions_accepted_) {\n      // Will not be called as the loop will not be executed anymore.\n      return false;\n    }\n    pending_functions_.emplace_back(std::move(function));\n  }\n  // Notify unconditionally, even if currently running pending functions. It's\n  // possible for pending functions themselves to run inner platform message\n  // loops, such as when displaying dialogs - in this case, the notification is\n  // needed to run the new function from such an inner loop. A modal loop can be\n  // started even in leftovers happening during the quit, where there's still\n  // opportunity for enqueueing and executing new pending functions - so only\n  // checking if called in the destructor (it's safe to check this without\n  // locking a mutex as it's assumed that if the object is already being\n  // destroyed, no other threads can have references to it - any access would\n  // result in a race condition anyway) as the subclass has already been\n  // destroyed. Having pending_functions_mutex_ unlocked also means that\n  // NotifyUILoopOfPendingFunctions may be done while the UI thread is calling\n  // or has already called PlatformQuitFromUIThread - but it's better than\n  // keeping pending_functions_mutex_ locked as NotifyUILoopOfPendingFunctions\n  // may be implemented as pushing to a fixed-size pipe, in which case it will\n  // have to wait until free space is available, but if the UI thread tries to\n  // lock the mutex afterwards to execute pending functions (and encouters\n  // contention), nothing will be able to receive from the pipe anymore and thus\n  // free the space, causing a deadlock.\n  if (!is_in_destructor_) {\n    NotifyUILoopOfPendingFunctions();\n  }\n  return true;\n}\n\nbool WindowedAppContext::CallInUIThread(std::function<void()> function) {\n  if (IsInUIThread()) {\n    // The intention is just to make sure the code is executed in the UI thread,\n    // don't defer execution if no need to.\n    function();\n    return true;\n  }\n  return CallInUIThreadDeferred(std::move(function));\n}\n\nbool WindowedAppContext::CallInUIThreadSynchronous(\n    std::function<void()> function) {\n  if (IsInUIThread()) {\n    // Prevent deadlock if called from the UI thread.\n    function();\n    return true;\n  }\n  xe::threading::Fence fence;\n  if (!CallInUIThreadDeferred([&function, &fence]() {\n        function();\n        fence.Signal();\n      })) {\n    return false;\n  }\n  fence.Wait();\n  return true;\n}\n\nvoid WindowedAppContext::QuitFromUIThread() {\n  assert_true(IsInUIThread());\n  bool has_quit_previously = has_quit_;\n  // Make sure PlatformQuitFromUIThread is called only once, not from nested\n  // pending function execution during the quit - otherwise it will be called\n  // when it's still possible to add new pending functions. This isn't as wrong\n  // as calling PlatformQuitFromUIThread from the destructor, but still a part\n  // of the contract for simplicity.\n  has_quit_ = true;\n  // Executing pending function unconditionally because it's the contract of\n  // this method that functions are executed immediately.\n  ExecutePendingFunctionsFromUIThread(true);\n  if (has_quit_previously) {\n    // Potentially calling QuitFromUIThread from inside a pending function (in\n    // the worst and dangerous case, from a pending function executed in the\n    // destructor - and PlatformQuitFromUIThread is virtual).\n    return;\n  }\n  // Call the platform-specific shutdown while letting it assume that no new\n  // functions will be queued anymore (but NotifyUILoopOfPendingFunctions may\n  // still be called after PlatformQuitFromUIThread as the two are not\n  // interlocked). This is different than the order in the destruction, but\n  // there this assumption is ensured by the expectation that there should be no\n  // more references to the context in other threads that would allow queueing\n  // new functions with calling NotifyUILoopOfPendingFunctions.\n  PlatformQuitFromUIThread();\n}\n\nvoid WindowedAppContext::ExecutePendingFunctionsFromUIThread(bool is_final) {\n  assert_true(IsInUIThread());\n  std::unique_lock<std::mutex> pending_functions_lock(pending_functions_mutex_);\n  while (!pending_functions_.empty()) {\n    // Removing the function from the queue before executing it, as the function\n    // itself may call ExecutePendingFunctionsFromUIThread - if it's kept, the\n    // inner loop will try to execute it again, resulting in potentially endless\n    // recursion, and even if it's terminated, each level will be trying to\n    // remove the same function from the queue - instead, actually removing\n    // other functions, or even beyond the end of the queue.\n    std::function<void()> function = std::move(pending_functions_.front());\n    pending_functions_.pop_front();\n    // Call the function with the lock released as it may take an indefinitely\n    // long time to execute if it opens some dialog (possibly with its own\n    // platform message loop), and in that case, without unlocking, no other\n    // thread would be able to add new pending functions (which would result in\n    // unintended waits for user input). This also allows using std::mutex\n    // instead of std::recursive_mutex.\n    pending_functions_lock.unlock();\n    function();\n    pending_functions_lock.lock();\n  }\n  if (is_final) {\n    // Atomically with completion of the pending functions loop, disallow adding\n    // new functions after executing the existing ones - it was possible to\n    // enqueue new functions from the leftover ones as there still was\n    // opportunity to call them, so it wasn't necessary to disallow adding\n    // before executing, but now new functions will potentially never be\n    // executed. This is done even if this is just an inner pending functions\n    // execution and there's still potential possibility of adding and executing\n    // new functions in the outer loops - for simplicity and consistency (so\n    // QuitFromUIThread's behavior doesn't depend as much on the location of the\n    // call - inside a pending function or from some system callback of the\n    // window), assuming after a PlatformQuitFromUIThread call, it's not\n    // possible to add new pending functions anymore.\n    pending_functions_accepted_ = false;\n  }\n}\n\n}  // namespace ui\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/ui/windowed_app_context.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_WINDOWED_APP_CONTEXT_H_\n#define XENIA_UI_WINDOWED_APP_CONTEXT_H_\n\n#include <cstdint>\n#include <deque>\n#include <functional>\n#include <mutex>\n#include <thread>\n\n#include \"xenia/base/assert.h\"\n\nnamespace xe {\nnamespace ui {\n\n// Context for inputs provided by the entry point and interacting with the\n// platform's UI loop, to be implemented by platforms.\nclass WindowedAppContext {\n public:\n  WindowedAppContext(const WindowedAppContext& context) = delete;\n  WindowedAppContext& operator=(const WindowedAppContext& context) = delete;\n  virtual ~WindowedAppContext();\n\n  // The thread where the object is created will be assumed to be the UI thread,\n  // for the purpose of being able to perform CallInUIThreadSynchronous before\n  // running the loop.\n  bool IsInUIThread() const {\n    return std::this_thread::get_id() == ui_thread_id_;\n  }\n\n  // CallInUIThreadDeferred and CallInUIThread are fire and forget - will be\n  // executed at some point the future when the UI thread is running the loop\n  // and is not busy doing other things.\n  // Therefore, references to objects in the function may outlive the owners of\n  // those objects, so use-after-free is very easy to create if not being\n  // careful enough.\n  // There are two solutions to this issue:\n  // - Signaling a fence in the function, awaiting it before destroying objects\n  //   referenced by the function (works for shutdown from non-UI threads, or\n  //   for CallInUIThread, but not CallInUIThreadDeferred, in the UI thread).\n  // - Calling ExecutePendingFunctionsFromUIThread in the UI thread before\n  //   destroying objects referenced by the function (works for shutdown from\n  //   the UI thread, though CallInUIThreadSynchronous doing\n  //   ExecutePendingFunctionsFromUIThread is also an option for shutdown from\n  //   any thread).\n  // (These are not required if all the called function is doing is triggering a\n  // quit with the context pointer captured by value, as the only object\n  // involved will be the context itself, with a pointer that is valid until\n  // it's destroyed - the most late location of the pending function execution\n  // possible.)\n  // Returning true if the function has been enqueued (it will be called at some\n  // point, at worst, before exiting the loop) or called immediately, false if\n  // it was dropped (if calling after exiting the loop).\n  // It's okay to enqueue functions from queued functions already being\n  // executed. As execution may be happening during the destruction of the\n  // context as well, in this case, CallInUIThreadDeferred must make sure it\n  // doesn't call anything virtual in the destructor.\n\n  // Enqueues the function regardless of the current thread. Won't necessarily\n  // be executed directly from the platform main loop as\n  // ExecutePendingFunctionsFromUIThread may be called anywhere (for instance,\n  // to await pending functions before destroying what they are referencing).\n  bool CallInUIThreadDeferred(std::function<void()> function);\n  // Executes the function immediately if already in the UI thread, enqueues it\n  // otherwise.\n  bool CallInUIThread(std::function<void()> function);\n  bool CallInUIThreadSynchronous(std::function<void()> function);\n  // It's okay to call this function from the queued functions themselves (such\n  // as in the case of waiting for a pending async CallInUIThreadDeferred\n  // described above - the wait may be done inside a CallInUIThreadSynchronous\n  // function safely).\n  void ExecutePendingFunctionsFromUIThread() {\n    ExecutePendingFunctionsFromUIThread(false);\n  }\n\n  // If on the target platform, the program itself is supposed to run the UI\n  // loop, this may be checked before doing blocking message waits as an\n  // additional safety measure beyond what PlatformQuitFromUIThread guarantees,\n  // and if true, the loop should be terminated (pending function will already\n  // have been executed). This doesn't imply that pending functions have been\n  // executed in all contexts, however - they can be executing from quitting\n  // itself (in the worst case, in the destructor where virtual methods can't be\n  // called), and in this case, this will be returning true.\n  bool HasQuitFromUIThread() const {\n    assert_true(IsInUIThread());\n    return has_quit_;\n  }\n\n  // Immediately disallows adding new pending UI functions, executes the already\n  // queued ones, and makes sure that the UI loop is aware that it was asked to\n  // stop running. This must not destroy the context or the app directly - the\n  // actual app shutdown will be initiated at some point outside the scope of\n  // app's callbacks. May call virtual functions - invoke\n  // ExecutePendingFunctionsFromUIThread(true) in the destructor instead, and\n  // use the platform-specific destructor to invoke the needed\n  // PlatformQuitFromUIThread logic (it should be safe, in case of destruction,\n  // to perform platform-specific quit request logic before the common part -\n  // NotifyUILoopOfPendingFunctions won't be called after the platform-specific\n  // quit request logic in this case anyway as destruction expects that there\n  // are no references to the object in other threads). Safe to call from within\n  // pending functions - requesting quit from non-UI threads is possible via\n  // methods like CallInUIThreadSynchronous. For deferred, rather than\n  // immediate, quitting from the UI thread, CallInUIThreadDeferred may be used\n  // (but the context pointer should be captured by value not to require\n  // explicit completion forcing in case the storage of the pointer is lost\n  // before the function is called).\n  void QuitFromUIThread();\n  // Callable from any thread. This is a special case where a completely\n  // fire-and-forget CallInUIThreadDeferred is safe, as the function only\n  // references nonvirtual functions of the context itself, and will be called\n  // at most from the destructor. No need to return the result - it doesn't\n  // matter if has quit already or not, as that's the intention anyway.\n  void RequestDeferredQuit() {\n    CallInUIThreadDeferred([this] { QuitFromUIThread(); });\n  }\n\n protected:\n  WindowedAppContext() : ui_thread_id_(std::this_thread::get_id()) {}\n\n  // Can be called from any thread (including the UI thread) to ask the OS to\n  // run an iteration of the UI loop (with or without processing internal UI\n  // messages, this is platform-dependent) so pending functions will be executed\n  // at some point. pending_functions_mutex_ will not be locked when this is\n  // called (to make sure that, for example, the caller, waiting for space in\n  // the OS's message queue, such as in case of a Linux pipe, won't be blocking\n  // the UI thread that has started executing pending messages while pumping\n  // that pipe, resulting in a deadlock) - implementations don't directly see\n  // anything protected by it anyway, and a spurious notification shouldn't be\n  // causing any damage, this is similar to how condition variables can be\n  // signaled outside the critical section (signaling inside the critical\n  // section may also cause contention if the thread waiting is woken up quickly\n  // enough). This, however, means that NotifyUILoopOfPendingFunctions may be\n  // called in a non-UI thread after the final pending message processing\n  // followed by PlatformQuitFromUIThread in the UI thread - so it can still be\n  // called after a quit.\n  virtual void NotifyUILoopOfPendingFunctions() = 0;\n\n  // Called when requesting a quit in the UI thread to tell the platform that\n  // the UI loop needs to be terminated. The pending function queue is assumed\n  // to be empty before this is called, and no new pending functions can be\n  // added (but NotifyUILoopOfPendingFunctions may still be called as it's not\n  // mutually exclusive with PlatformQuitFromUIThread - if this matters, the\n  // platform implementation itself should be resolving this case).\n  virtual void PlatformQuitFromUIThread() = 0;\n\n  std::thread::id ui_thread_id_;\n\n private:\n  // May be called with is_final == true from the destructor - must not call\n  // anything virtual in this case.\n  void ExecutePendingFunctionsFromUIThread(bool is_final);\n\n  // Accessible by the UI thread.\n  bool has_quit_ = false;\n  bool is_in_destructor_ = false;\n\n  // Synchronizes producers with each other and with the consumer, as well as\n  // all of them with the pending_functions_accepted_ variable which indicates\n  // whether shutdown has not been performed yet, as after the shutdown, no new\n  // functions will be executed anymore, therefore no new function should be\n  // queued, as it will never be called (thus CallInUIThreadSynchronous for it\n  // will never return, for instance).\n  std::mutex pending_functions_mutex_;\n  std::deque<std::function<void()>> pending_functions_;\n  // Protected by pending_functions_mutex_, writable by the UI thread, readable\n  // by any thread. Must be set to false before exiting the main platform loop,\n  // but before that, all pending functions must be executed no matter what, as\n  // they may need to signal fences currently being awaited (like the\n  // CallInUIThreadSynchronous fence).\n  bool pending_functions_accepted_ = true;\n};\n\n}  // namespace ui\n}  // namespace xe\n\n#endif  // XENIA_UI_WINDOWED_APP_CONTEXT_H_\n"
  },
  {
    "path": "src/xenia/ui/windowed_app_context_android.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/ui/windowed_app_context_android.h\"\n\n#include <android/asset_manager_jni.h>\n#include <android/configuration.h>\n#include <android/log.h>\n#include <android/looper.h>\n#include <android/native_window.h>\n#include <android/native_window_jni.h>\n#include <fcntl.h>\n#include <jni.h>\n#include <unistd.h>\n#include <array>\n#include <cstdint>\n#include <cstring>\n\n#include \"xenia/base/assert.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/main_android.h\"\n#include \"xenia/ui/window_android.h\"\n#include \"xenia/ui/windowed_app.h\"\n\nnamespace xe {\nnamespace ui {\n\nvoid AndroidWindowedAppContext::NotifyUILoopOfPendingFunctions() {\n  // Don't check ui_thread_looper_callback_registered_, as it's owned\n  // exclusively by the UI thread, while this may be called by any, and in case\n  // of a pipe error, the callback will be invoked by the looper, which will\n  // trigger all the necessary shutdown, and the pending functions will be\n  // called anyway by the shutdown.\n  UIThreadLooperCallbackCommand command =\n      UIThreadLooperCallbackCommand::kExecutePendingFunctions;\n  if (write(ui_thread_looper_callback_pipe_[1], &command, sizeof(command)) !=\n      sizeof(command)) {\n    XELOGE(\n        \"AndroidWindowedAppContext: Failed to write a pending function \"\n        \"execution command to the UI thread looper callback pipe\");\n    return;\n  }\n  ALooper_wake(ui_thread_looper_);\n}\n\nvoid AndroidWindowedAppContext::PlatformQuitFromUIThread() {\n  // All the shutdown will be done in onDestroy of the activity.\n  if (activity_ && activity_method_finish_) {\n    ui_thread_jni_env_->CallVoidMethod(activity_, activity_method_finish_);\n  }\n}\n\nvoid AndroidWindowedAppContext::PostInvalidateWindowSurface() {\n  // May be called from non-UI threads.\n  JNIEnv* jni_env = GetAndroidThreadJniEnv();\n  if (!jni_env) {\n    return;\n  }\n  jni_env->CallVoidMethod(activity_,\n                          activity_method_post_invalidate_window_surface_);\n}\n\nAndroidWindowedAppContext*\nAndroidWindowedAppContext::JniActivityInitializeWindowedAppOnCreate(\n    JNIEnv* jni_env, jobject activity, jstring windowed_app_identifier,\n    jobject asset_manager) {\n  WindowedApp::Creator app_creator;\n  {\n    const char* windowed_app_identifier_c_str =\n        jni_env->GetStringUTFChars(windowed_app_identifier, nullptr);\n    if (!windowed_app_identifier_c_str) {\n      __android_log_write(\n          ANDROID_LOG_ERROR, \"AndroidWindowedAppContext\",\n          \"Failed to get the UTF-8 string for the windowed app identifier\");\n      return nullptr;\n    }\n    app_creator = WindowedApp::GetCreator(windowed_app_identifier_c_str);\n    if (!app_creator) {\n      __android_log_print(ANDROID_LOG_ERROR, \"AndroidWindowedAppContext\",\n                          \"Failed to get the creator for the windowed app %s\",\n                          windowed_app_identifier_c_str);\n      jni_env->ReleaseStringUTFChars(windowed_app_identifier,\n                                     windowed_app_identifier_c_str);\n      return nullptr;\n    }\n    jni_env->ReleaseStringUTFChars(windowed_app_identifier,\n                                   windowed_app_identifier_c_str);\n  }\n\n  AndroidWindowedAppContext* app_context = new AndroidWindowedAppContext;\n  if (!app_context->Initialize(jni_env, activity, asset_manager)) {\n    delete app_context;\n    return nullptr;\n  }\n\n  if (!app_context->InitializeApp(app_creator)) {\n    // InitializeApp might have sent commands to the UI thread looper callback\n    // pipe, perform deferred destruction.\n    app_context->RequestDestruction();\n    return nullptr;\n  }\n\n  return app_context;\n}\n\nvoid AndroidWindowedAppContext::JniActivityOnDestroy() {\n  if (app_) {\n    app_->InvokeOnDestroy();\n    app_.reset();\n  }\n  // Expecting that the destruction of the app will destroy the window as well,\n  // no need to notify it explicitly.\n  assert_null(activity_window_);\n  RequestDestruction();\n}\n\nvoid AndroidWindowedAppContext::JniActivityOnWindowSurfaceLayoutChange(\n    jint left, jint top, jint right, jint bottom) {\n  window_surface_layout_left_ = left;\n  window_surface_layout_top_ = top;\n  window_surface_layout_right_ = right;\n  window_surface_layout_bottom_ = bottom;\n  if (activity_window_) {\n    activity_window_->OnActivitySurfaceLayoutChange();\n  }\n}\n\nbool AndroidWindowedAppContext::JniActivityOnWindowSurfaceMotionEvent(\n    jobject event) {\n  return activity_window_ &&\n         activity_window_->OnActivitySurfaceMotionEvent(event);\n}\n\nvoid AndroidWindowedAppContext::JniActivityOnWindowSurfaceChanged(\n    jobject window_surface_object) {\n  // Detach from the old surface.\n  if (window_surface_) {\n    ANativeWindow* old_window_surface = window_surface_;\n    window_surface_ = nullptr;\n    if (activity_window_) {\n      activity_window_->OnActivitySurfaceChanged();\n    }\n    ANativeWindow_release(old_window_surface);\n  }\n  if (!window_surface_object) {\n    return;\n  }\n  window_surface_ =\n      ANativeWindow_fromSurface(ui_thread_jni_env_, window_surface_object);\n  if (!window_surface_) {\n    return;\n  }\n  if (activity_window_) {\n    activity_window_->OnActivitySurfaceChanged();\n  }\n}\n\nvoid AndroidWindowedAppContext::JniActivityPaintWindow(bool force_paint) {\n  if (!activity_window_) {\n    return;\n  }\n  activity_window_->PaintActivitySurface(force_paint);\n}\n\nAndroidWindowedAppContext::~AndroidWindowedAppContext() { Shutdown(); }\n\nbool AndroidWindowedAppContext::Initialize(JNIEnv* ui_thread_jni_env,\n                                           jobject activity,\n                                           jobject asset_manager) {\n  // Xenia logging is not initialized yet - use __android_log_write or\n  // __android_log_print until InitializeAndroidAppFromMainThread is done.\n\n  ui_thread_jni_env_ = ui_thread_jni_env;\n\n  // Initialize the asset manager for retrieving the current configuration.\n  asset_manager_jobject_ = ui_thread_jni_env_->NewGlobalRef(asset_manager);\n  if (!asset_manager_jobject_) {\n    __android_log_write(\n        ANDROID_LOG_ERROR, \"AndroidWindowedAppContext\",\n        \"Failed to create a global reference to the asset manager\");\n    Shutdown();\n    return false;\n  }\n  asset_manager_ =\n      AAssetManager_fromJava(ui_thread_jni_env_, asset_manager_jobject_);\n  if (!asset_manager_) {\n    __android_log_write(ANDROID_LOG_ERROR, \"AndroidWindowedAppContext\",\n                        \"Failed to create get the AAssetManager\");\n    Shutdown();\n    return false;\n  }\n\n  // Get the initial configuration.\n  configuration_ = AConfiguration_new();\n  if (!configuration_) {\n    __android_log_write(ANDROID_LOG_ERROR, \"AndroidWindowedAppContext\",\n                        \"Failed to create an AConfiguration\");\n    Shutdown();\n    return false;\n  }\n  AConfiguration_fromAssetManager(configuration_, asset_manager_);\n\n  // Get the activity class, needed for the application context here, and for\n  // other activity interaction later.\n  {\n    jclass activity_class_local_ref =\n        ui_thread_jni_env_->GetObjectClass(activity);\n    if (!activity_class_local_ref) {\n      __android_log_write(ANDROID_LOG_ERROR, \"AndroidWindowedAppContext\",\n                          \"Failed to get the activity class\");\n      Shutdown();\n      return false;\n    }\n    activity_class_ = reinterpret_cast<jclass>(ui_thread_jni_env_->NewGlobalRef(\n        reinterpret_cast<jobject>(activity_class_local_ref)));\n    ui_thread_jni_env_->DeleteLocalRef(\n        reinterpret_cast<jobject>(activity_class_local_ref));\n  }\n  if (!activity_class_) {\n    __android_log_write(\n        ANDROID_LOG_ERROR, \"AndroidWindowedAppContext\",\n        \"Failed to create a global reference to the activity class\");\n    Shutdown();\n    return false;\n  }\n\n  // Get activity methods needed for initialization.\n  jmethodID activity_get_application_context = ui_thread_jni_env_->GetMethodID(\n      activity_class_, \"getApplicationContext\", \"()Landroid/content/Context;\");\n  if (!activity_get_application_context) {\n    __android_log_write(\n        ANDROID_LOG_ERROR, \"AndroidWindowedAppContext\",\n        \"Failed to get the getApplicationContext method of the activity\");\n    Shutdown();\n    return false;\n  }\n  jmethodID activity_get_intent = ui_thread_jni_env_->GetMethodID(\n      activity_class_, \"getIntent\", \"()Landroid/content/Intent;\");\n  if (!activity_get_intent) {\n    __android_log_write(ANDROID_LOG_ERROR, \"AndroidWindowedAppContext\",\n                        \"Failed to get the getIntent method of the activity\");\n    Shutdown();\n    return false;\n  }\n\n  // Get the application context.\n  jobject application_context_init_ref = ui_thread_jni_env_->CallObjectMethod(\n      activity, activity_get_application_context);\n  if (!application_context_init_ref) {\n    __android_log_write(\n        ANDROID_LOG_ERROR, \"AndroidWindowedAppContext\",\n        \"Failed to get the application context from the activity\");\n    Shutdown();\n    return false;\n  }\n\n  // Get the launch arguments.\n  jobject launch_arguments_bundle_init_ref = nullptr;\n  {\n    jobject intent_init_ref =\n        ui_thread_jni_env_->CallObjectMethod(activity, activity_get_intent);\n    if (!intent_init_ref) {\n      __android_log_write(\n          ANDROID_LOG_ERROR, \"AndroidWindowedAppContext\",\n          \"Failed to get the intent that has started the activity\");\n    } else {\n      jclass intent_class = ui_thread_jni_env_->GetObjectClass(intent_init_ref);\n      if (!intent_class) {\n        __android_log_write(ANDROID_LOG_ERROR, \"AndroidWindowedAppContext\",\n                            \"Failed to get the intent class\");\n      } else {\n        jmethodID intent_get_bundle_extra = ui_thread_jni_env_->GetMethodID(\n            intent_class, \"getBundleExtra\",\n            \"(Ljava/lang/String;)Landroid/os/Bundle;\");\n        if (!intent_get_bundle_extra) {\n          __android_log_write(\n              ANDROID_LOG_ERROR, \"AndroidWindowedAppContext\",\n              \"Failed to get the getBundleExtra method of the intent\");\n        } else {\n          jstring launch_arguments_extra_name =\n              ui_thread_jni_env_->NewStringUTF(\n                  \"jp.xenia.emulator.WindowedAppActivity.EXTRA_CVARS\");\n          if (!launch_arguments_extra_name) {\n            __android_log_write(\n                ANDROID_LOG_ERROR, \"AndroidWindowedAppContext\",\n                \"Failed to create the launch arguments intent extra data name \"\n                \"string\");\n          } else {\n            launch_arguments_bundle_init_ref =\n                ui_thread_jni_env_->CallObjectMethod(\n                    intent_init_ref, intent_get_bundle_extra,\n                    launch_arguments_extra_name);\n            ui_thread_jni_env_->DeleteLocalRef(launch_arguments_extra_name);\n          }\n        }\n        ui_thread_jni_env_->DeleteLocalRef(intent_class);\n      }\n      ui_thread_jni_env_->DeleteLocalRef(intent_init_ref);\n    }\n  }\n\n  // Initialize Xenia globals that may depend on the base globals and logging.\n  xe::InitializeAndroidAppFromMainThread(\n      AConfiguration_getSdkVersion(configuration_), ui_thread_jni_env_,\n      application_context_init_ref, launch_arguments_bundle_init_ref);\n  android_base_initialized_ = true;\n  if (launch_arguments_bundle_init_ref) {\n    ui_thread_jni_env_->DeleteLocalRef(launch_arguments_bundle_init_ref);\n  }\n  ui_thread_jni_env_->DeleteLocalRef(application_context_init_ref);\n\n  // Initialize common windowed app JNI IDs.\n  {\n    jclass motion_event_class_local_ref =\n        ui_thread_jni_env_->FindClass(\"android/view/MotionEvent\");\n    if (!motion_event_class_local_ref) {\n      XELOGE(\n          \"AndroidWindowedAppContext: Failed to find the motion event class\");\n      Shutdown();\n      return false;\n    }\n    motion_event_class_ =\n        reinterpret_cast<jclass>(ui_thread_jni_env_->NewGlobalRef(\n            reinterpret_cast<jobject>(motion_event_class_local_ref)));\n    ui_thread_jni_env_->DeleteLocalRef(\n        reinterpret_cast<jobject>(motion_event_class_local_ref));\n  }\n  if (!motion_event_class_) {\n    XELOGE(\n        \"AndroidWindowedAppContext: Failed to create a global reference to the \"\n        \"motion event class\");\n    Shutdown();\n    return false;\n  }\n  bool motion_event_ids_obtained = true;\n  motion_event_ids_obtained &=\n      (jni_ids_.motion_event_get_action = ui_thread_jni_env_->GetMethodID(\n           motion_event_class_, \"getAction\", \"()I\")) != nullptr;\n  motion_event_ids_obtained &=\n      (jni_ids_.motion_event_get_axis_value = ui_thread_jni_env_->GetMethodID(\n           motion_event_class_, \"getAxisValue\", \"(II)F\")) != nullptr;\n  motion_event_ids_obtained &=\n      (jni_ids_.motion_event_get_button_state = ui_thread_jni_env_->GetMethodID(\n           motion_event_class_, \"getButtonState\", \"()I\")) != nullptr;\n  motion_event_ids_obtained &=\n      (jni_ids_.motion_event_get_pointer_id = ui_thread_jni_env_->GetMethodID(\n           motion_event_class_, \"getPointerId\", \"(I)I\")) != nullptr;\n  motion_event_ids_obtained &=\n      (jni_ids_.motion_event_get_pointer_count =\n           ui_thread_jni_env_->GetMethodID(\n               motion_event_class_, \"getPointerCount\", \"()I\")) != nullptr;\n  motion_event_ids_obtained &=\n      (jni_ids_.motion_event_get_source = ui_thread_jni_env_->GetMethodID(\n           motion_event_class_, \"getSource\", \"()I\")) != nullptr;\n  motion_event_ids_obtained &=\n      (jni_ids_.motion_event_get_x = ui_thread_jni_env_->GetMethodID(\n           motion_event_class_, \"getX\", \"(I)F\")) != nullptr;\n  motion_event_ids_obtained &=\n      (jni_ids_.motion_event_get_y = ui_thread_jni_env_->GetMethodID(\n           motion_event_class_, \"getY\", \"(I)F\")) != nullptr;\n  if (!motion_event_ids_obtained) {\n    XELOGE(\n        \"AndroidWindowedAppContext: Failed to get the motion event class IDs\");\n    Shutdown();\n    return false;\n  }\n\n  // Initialize interfacing with the WindowedAppActivity.\n  activity_ = ui_thread_jni_env_->NewGlobalRef(activity);\n  if (!activity_) {\n    XELOGE(\n        \"AndroidWindowedAppContext: Failed to create a global reference to the \"\n        \"activity\");\n    Shutdown();\n    return false;\n  }\n  bool activity_ids_obtained = true;\n  activity_ids_obtained &=\n      (activity_method_finish_ = ui_thread_jni_env_->GetMethodID(\n           activity_class_, \"finish\", \"()V\")) != nullptr;\n  activity_ids_obtained &=\n      (activity_method_post_invalidate_window_surface_ =\n           ui_thread_jni_env_->GetMethodID(\n               activity_class_, \"postInvalidateWindowSurface\", \"()V\")) !=\n      nullptr;\n  if (!activity_ids_obtained) {\n    XELOGE(\"AndroidWindowedAppContext: Failed to get the activity class IDs\");\n    Shutdown();\n    return false;\n  }\n\n  // Initialize sending commands to the UI thread looper callback, for\n  // requesting function calls in the UI thread.\n  ui_thread_looper_ = ALooper_forThread();\n  // The context may be created only in the UI thread, which must have an\n  // internal looper.\n  assert_not_null(ui_thread_looper_);\n  if (!ui_thread_looper_) {\n    XELOGE(\"AndroidWindowedAppContext: Failed to get the UI thread looper\");\n    Shutdown();\n    return false;\n  }\n  // The looper can be woken up by other threads, so acquiring it. Shutdown\n  // assumes that if ui_thread_looper_ is not null, it has been acquired.\n  ALooper_acquire(ui_thread_looper_);\n  if (pipe(ui_thread_looper_callback_pipe_.data())) {\n    XELOGE(\n        \"AndroidWindowedAppContext: Failed to create the UI thread looper \"\n        \"callback pipe\");\n    Shutdown();\n    return false;\n  }\n  if (ALooper_addFd(ui_thread_looper_, ui_thread_looper_callback_pipe_[0],\n                    ALOOPER_POLL_CALLBACK, ALOOPER_EVENT_INPUT,\n                    UIThreadLooperCallback, this) != 1) {\n    XELOGE(\n        \"AndroidWindowedAppContext: Failed to add the callback to the UI \"\n        \"thread looper\");\n    Shutdown();\n    return false;\n  }\n  ui_thread_looper_callback_registered_ = true;\n\n  return true;\n}\n\nvoid AndroidWindowedAppContext::Shutdown() {\n  if (app_) {\n    app_->InvokeOnDestroy();\n    app_.reset();\n  }\n\n  // The app should destroy the window, but make sure everything is cleaned up\n  // anyway.\n  assert_null(activity_window_);\n  activity_window_ = nullptr;\n\n  if (ui_thread_looper_callback_registered_) {\n    ALooper_removeFd(ui_thread_looper_, ui_thread_looper_callback_pipe_[0]);\n    ui_thread_looper_callback_registered_ = false;\n  }\n  for (int& pipe_fd : ui_thread_looper_callback_pipe_) {\n    if (pipe_fd == -1) {\n      continue;\n    }\n    close(pipe_fd);\n    pipe_fd = -1;\n  }\n  if (ui_thread_looper_) {\n    ALooper_release(ui_thread_looper_);\n    ui_thread_looper_ = nullptr;\n  }\n\n  activity_method_post_invalidate_window_surface_ = nullptr;\n  activity_method_finish_ = nullptr;\n  if (activity_) {\n    ui_thread_jni_env_->DeleteGlobalRef(activity_);\n    activity_ = nullptr;\n  }\n\n  std::memset(&jni_ids_, 0, sizeof(jni_ids_));\n  if (motion_event_class_) {\n    ui_thread_jni_env_->DeleteGlobalRef(motion_event_class_);\n    motion_event_class_ = nullptr;\n  }\n\n  if (android_base_initialized_) {\n    xe::ShutdownAndroidAppFromMainThread();\n    android_base_initialized_ = false;\n  }\n\n  if (activity_class_) {\n    ui_thread_jni_env_->DeleteGlobalRef(\n        reinterpret_cast<jobject>(activity_class_));\n    activity_class_ = nullptr;\n  }\n\n  if (configuration_) {\n    AConfiguration_delete(configuration_);\n    configuration_ = nullptr;\n  }\n\n  asset_manager_ = nullptr;\n  if (asset_manager_jobject_) {\n    ui_thread_jni_env_->DeleteGlobalRef(asset_manager_jobject_);\n    asset_manager_jobject_ = nullptr;\n  }\n\n  ui_thread_jni_env_ = nullptr;\n}\n\nvoid AndroidWindowedAppContext::RequestDestruction() {\n  // According to ALooper_removeFd documentation:\n  // \"...it is possible for the callback to already be running or for it to run\n  //  one last time if the file descriptor was already signalled. Calling code\n  //  is responsible for ensuring that this case is safely handled. For example,\n  //  if the callback takes care of removing itself during its own execution\n  //  either by returning 0 or by calling this method...\"\n  // If the looper callback is registered, the pipe may have pending commands,\n  // and thus the callback may still be called with the pointer to the context\n  // as the user data.\n  if (!ui_thread_looper_callback_registered_) {\n    delete this;\n    return;\n  }\n  UIThreadLooperCallbackCommand command =\n      UIThreadLooperCallbackCommand::kDestroy;\n  if (write(ui_thread_looper_callback_pipe_[1], &command, sizeof(command)) !=\n      sizeof(command)) {\n    XELOGE(\n        \"AndroidWindowedAppContext: Failed to write a destruction command to \"\n        \"the UI thread looper callback pipe\");\n    delete this;\n    return;\n  }\n  ALooper_wake(ui_thread_looper_);\n}\n\nint AndroidWindowedAppContext::UIThreadLooperCallback(int fd, int events,\n                                                      void* data) {\n  // In case of errors, destruction of the pipe (most importantly the write end)\n  // must not be done here immediately as other threads, which may still be\n  // sending commands, would not be aware of that.\n  auto app_context = static_cast<AndroidWindowedAppContext*>(data);\n  if (events &\n      (ALOOPER_EVENT_ERROR | ALOOPER_EVENT_HANGUP | ALOOPER_EVENT_INVALID)) {\n    // Will return 0 to unregister self, this file descriptor is not usable\n    // anymore, so let everything potentially referencing it in QuitFromUIThread\n    // know.\n    app_context->ui_thread_looper_callback_registered_ = false;\n    XELOGE(\n        \"AndroidWindowedAppContext: The UI thread looper callback pipe file \"\n        \"descriptor has encountered an error condition during polling\");\n    app_context->QuitFromUIThread();\n    return 0;\n  }\n  if (!(events & ALOOPER_EVENT_INPUT)) {\n    // Spurious callback call. Need a non-empty pipe.\n    return 1;\n  }\n  // Process one command with a blocking `read`. The callback will be invoked\n  // again and again if there is still data after this read.\n  UIThreadLooperCallbackCommand command;\n  switch (read(fd, &command, sizeof(command))) {\n    case sizeof(command):\n      break;\n    case -1:\n      // Will return 0 to unregister self, this file descriptor is not usable\n      // anymore, so let everything potentially referencing it in\n      // QuitFromUIThread know.\n      app_context->ui_thread_looper_callback_registered_ = false;\n      XELOGE(\n          \"AndroidWindowedAppContext: The UI thread looper callback pipe file \"\n          \"descriptor has encountered an error condition during reading\");\n      app_context->QuitFromUIThread();\n      return 0;\n    default:\n      // Something like incomplete data - shouldn't be happening, but not a\n      // reported error.\n      return 1;\n  }\n  switch (command) {\n    case UIThreadLooperCallbackCommand::kDestroy:\n      // Final destruction requested. Will unregister self by returning 0, so\n      // set ui_thread_looper_callback_registered_ to false so Shutdown won't\n      // try to unregister it too.\n      app_context->ui_thread_looper_callback_registered_ = false;\n      delete app_context;\n      return 0;\n    case UIThreadLooperCallbackCommand::kExecutePendingFunctions:\n      app_context->ExecutePendingFunctionsFromUIThread();\n      break;\n  }\n  return 1;\n}\n\nbool AndroidWindowedAppContext::InitializeApp(std::unique_ptr<WindowedApp> (\n    *app_creator)(WindowedAppContext& app_context)) {\n  assert_null(app_);\n  app_ = app_creator(*this);\n  if (!app_->OnInitialize()) {\n    app_->InvokeOnDestroy();\n    app_.reset();\n    return false;\n  }\n  return true;\n}\n\n}  // namespace ui\n}  // namespace xe\n\nextern \"C\" {\n\nJNIEXPORT jlong JNICALL\nJava_jp_xenia_emulator_WindowedAppActivity_initializeWindowedAppOnCreate(\n    JNIEnv* jni_env, jobject activity, jstring windowed_app_identifier,\n    jobject asset_manager) {\n  return reinterpret_cast<jlong>(\n      xe::ui::AndroidWindowedAppContext ::\n          JniActivityInitializeWindowedAppOnCreate(\n              jni_env, activity, windowed_app_identifier, asset_manager));\n}\n\nJNIEXPORT void JNICALL\nJava_jp_xenia_emulator_WindowedAppActivity_onDestroyNative(\n    JNIEnv* jni_env, jobject activity, jlong app_context_ptr) {\n  reinterpret_cast<xe::ui::AndroidWindowedAppContext*>(app_context_ptr)\n      ->JniActivityOnDestroy();\n}\n\nJNIEXPORT void JNICALL\nJava_jp_xenia_emulator_WindowedAppActivity_onWindowSurfaceLayoutChange(\n    JNIEnv* jni_env, jobject activity, jlong app_context_ptr, jint left,\n    jint top, jint right, jint bottom) {\n  reinterpret_cast<xe::ui::AndroidWindowedAppContext*>(app_context_ptr)\n      ->JniActivityOnWindowSurfaceLayoutChange(left, top, right, bottom);\n}\n\nJNIEXPORT jboolean JNICALL\nJava_jp_xenia_emulator_WindowedAppActivity_onWindowSurfaceMotionEvent(\n    JNIEnv* jni_env, jobject activity, jlong app_context_ptr, jobject event) {\n  return jboolean(\n      reinterpret_cast<xe::ui::AndroidWindowedAppContext*>(app_context_ptr)\n          ->JniActivityOnWindowSurfaceMotionEvent(event));\n}\n\nJNIEXPORT void JNICALL\nJava_jp_xenia_emulator_WindowedAppActivity_onWindowSurfaceChanged(\n    JNIEnv* jni_env, jobject activity, jlong app_context_ptr,\n    jobject window_surface_object) {\n  reinterpret_cast<xe::ui::AndroidWindowedAppContext*>(app_context_ptr)\n      ->JniActivityOnWindowSurfaceChanged(window_surface_object);\n}\n\nJNIEXPORT void JNICALL Java_jp_xenia_emulator_WindowedAppActivity_paintWindow(\n    JNIEnv* jni_env, jobject activity, jlong app_context_ptr,\n    jboolean force_paint) {\n  reinterpret_cast<xe::ui::AndroidWindowedAppContext*>(app_context_ptr)\n      ->JniActivityPaintWindow(bool(force_paint));\n}\n\n}  // extern \"C\"\n"
  },
  {
    "path": "src/xenia/ui/windowed_app_context_android.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_WINDOWED_APP_CONTEXT_ANDROID_H_\n#define XENIA_UI_WINDOWED_APP_CONTEXT_ANDROID_H_\n\n#include <android/asset_manager.h>\n#include <android/configuration.h>\n#include <android/looper.h>\n#include <android/native_window.h>\n#include <jni.h>\n#include <array>\n#include <memory>\n\n#include \"xenia/ui/windowed_app_context.h\"\n\nnamespace xe {\nnamespace ui {\n\nclass AndroidWindow;\nclass WindowedApp;\n\nclass AndroidWindowedAppContext final : public WindowedAppContext {\n public:\n  // Precached JNI references and IDs that may be used for windowed app purposes\n  // by external code.\n  struct JniIDs {\n    // android.view.MotionEvent.\n    jmethodID motion_event_get_action;\n    jmethodID motion_event_get_axis_value;\n    jmethodID motion_event_get_button_state;\n    jmethodID motion_event_get_pointer_count;\n    jmethodID motion_event_get_pointer_id;\n    jmethodID motion_event_get_source;\n    jmethodID motion_event_get_x;\n    jmethodID motion_event_get_y;\n  };\n\n  WindowedApp* app() const { return app_.get(); }\n\n  void NotifyUILoopOfPendingFunctions() override;\n\n  void PlatformQuitFromUIThread() override;\n\n  JNIEnv* ui_thread_jni_env() const { return ui_thread_jni_env_; }\n\n  uint32_t GetPixelDensity() const {\n    return configuration_ ? uint32_t(AConfiguration_getDensity(configuration_))\n                          : 160;\n  }\n\n  const JniIDs& jni_ids() const { return jni_ids_; }\n\n  int32_t window_surface_layout_left() const {\n    return window_surface_layout_left_;\n  }\n  int32_t window_surface_layout_top() const {\n    return window_surface_layout_top_;\n  }\n  int32_t window_surface_layout_right() const {\n    return window_surface_layout_right_;\n  }\n  int32_t window_surface_layout_bottom() const {\n    return window_surface_layout_bottom_;\n  }\n\n  ANativeWindow* GetWindowSurface() const { return window_surface_; }\n  void PostInvalidateWindowSurface();\n\n  // The single Window instance that will be receiving window callbacks.\n  // Multiple windows cannot be created as one activity or fragment can have\n  // only one layout. This window acts purely as a proxy between the activity\n  // and the Xenia logic. May be done during Window destruction, so must not\n  // interact with it.\n  AndroidWindow* GetActivityWindow() const { return activity_window_; }\n  void SetActivityWindow(AndroidWindow* window) { activity_window_ = window; }\n\n  // For calling from WindowedAppActivity native methods.\n  static AndroidWindowedAppContext* JniActivityInitializeWindowedAppOnCreate(\n      JNIEnv* jni_env, jobject activity, jstring windowed_app_identifier,\n      jobject asset_manager);\n  void JniActivityOnDestroy();\n  void JniActivityOnWindowSurfaceLayoutChange(jint left, jint top, jint right,\n                                              jint bottom);\n  bool JniActivityOnWindowSurfaceMotionEvent(jobject event);\n  void JniActivityOnWindowSurfaceChanged(jobject window_surface_object);\n  void JniActivityPaintWindow(bool force_paint);\n\n private:\n  enum class UIThreadLooperCallbackCommand : uint8_t {\n    kDestroy,\n    kExecutePendingFunctions,\n  };\n\n  AndroidWindowedAppContext() = default;\n\n  // Don't delete this object directly externally if successfully initialized as\n  // the looper may still execute the callback for pending commands after an\n  // external ALooper_removeFd, and the callback receives a pointer to the\n  // context - deletion must be deferred and done in the callback itself.\n  // Defined in the translation unit where WindowedApp is complete because of\n  // std::unique_ptr.\n  ~AndroidWindowedAppContext();\n\n  bool Initialize(JNIEnv* ui_thread_jni_env, jobject activity,\n                  jobject asset_manager);\n  void Shutdown();\n\n  // Call this function instead of deleting the object directly, so if needed,\n  // deletion will be deferred until the callback (receiving a pointer to the\n  // context) can no longer be executed by the looper (will be done inside the\n  // callback).\n  void RequestDestruction();\n\n  static int UIThreadLooperCallback(int fd, int events, void* data);\n\n  bool InitializeApp(std::unique_ptr<WindowedApp> (*app_creator)(\n      WindowedAppContext& app_context));\n\n  JNIEnv* ui_thread_jni_env_ = nullptr;\n\n  // The object reference must be held by the app according to\n  // AAssetManager_fromJava documentation.\n  jobject asset_manager_jobject_ = nullptr;\n  AAssetManager* asset_manager_ = nullptr;\n\n  AConfiguration* configuration_ = nullptr;\n\n  jclass activity_class_ = nullptr;\n\n  bool android_base_initialized_ = false;\n\n  jclass motion_event_class_ = nullptr;\n  JniIDs jni_ids_ = {};\n\n  jobject activity_ = nullptr;\n  jmethodID activity_method_finish_ = nullptr;\n  jmethodID activity_method_post_invalidate_window_surface_ = nullptr;\n\n  // May be read by non-UI threads in NotifyUILoopOfPendingFunctions.\n  ALooper* ui_thread_looper_ = nullptr;\n  // [1] (the write file descriptor) may be referenced as read-only by non-UI\n  // threads in NotifyUILoopOfPendingFunctions.\n  std::array<int, 2> ui_thread_looper_callback_pipe_{-1, -1};\n  bool ui_thread_looper_callback_registered_ = false;\n\n  int32_t window_surface_layout_left_ = 0;\n  int32_t window_surface_layout_top_ = 0;\n  int32_t window_surface_layout_right_ = 0;\n  int32_t window_surface_layout_bottom_ = 0;\n\n  ANativeWindow* window_surface_ = nullptr;\n\n  AndroidWindow* activity_window_ = nullptr;\n\n  std::unique_ptr<WindowedApp> app_;\n};\n\n}  // namespace ui\n}  // namespace xe\n\n#endif  // XENIA_UI_WINDOWED_APP_CONTEXT_ANDROID_H_\n"
  },
  {
    "path": "src/xenia/ui/windowed_app_context_gtk.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/ui/windowed_app_context_gtk.h\"\n\n#include <gdk/gdk.h>\n#include <glib.h>\n#include <gtk/gtk.h>\n\nnamespace xe {\nnamespace ui {\n\nGTKWindowedAppContext::~GTKWindowedAppContext() {\n  // Remove the idle sources as their data pointer (to this context) is now\n  // outdated.\n  if (quit_idle_pending_) {\n    g_source_remove(quit_idle_pending_);\n  }\n  if (pending_functions_idle_pending_) {\n    g_source_remove(pending_functions_idle_pending_);\n  }\n}\n\nvoid GTKWindowedAppContext::NotifyUILoopOfPendingFunctions() {\n  std::lock_guard<std::mutex> pending_functions_idle_pending_lock(\n      pending_functions_idle_pending_mutex_);\n  if (!pending_functions_idle_pending_) {\n    pending_functions_idle_pending_ =\n        gdk_threads_add_idle(PendingFunctionsSourceFunc, this);\n  }\n}\n\nvoid GTKWindowedAppContext::PlatformQuitFromUIThread() {\n  if (quit_idle_pending_ || !gtk_main_level()) {\n    return;\n  }\n  gtk_main_quit();\n  // Quit from all loops in the context, current inner, upcoming inner (this is\n  // why the idle function is added even at the main level of 1), until we can\n  // return to the tail of RunMainGTKLoop.\n  quit_idle_pending_ = gdk_threads_add_idle(QuitSourceFunc, this);\n}\n\nvoid GTKWindowedAppContext::RunMainGTKLoop() {\n  // For safety, in case the quit request somehow happened before the loop.\n  if (HasQuitFromUIThread()) {\n    return;\n  }\n  assert_zero(gtk_main_level());\n  gtk_main();\n  // Something else - not QuitFromUIThread - might have done gtk_main_quit for\n  // the outer loop. If it has exited for some reason, let the context know, so\n  // pending function won't be added pointlessly.\n  QuitFromUIThread();\n  // Don't interfere with main loops of other contexts that will possibly be\n  // executed in this thread later (if this is not the only app that will be\n  // executed in this process, for example, or if some WindowedAppContext-less\n  // dialog is opened after the windowed app has quit) - cancel the scheduled\n  // quit chain as we have quit already.\n  if (quit_idle_pending_) {\n    g_source_remove(quit_idle_pending_);\n    quit_idle_pending_ = 0;\n  }\n}\n\ngboolean GTKWindowedAppContext::PendingFunctionsSourceFunc(gpointer data) {\n  auto& app_context = *static_cast<GTKWindowedAppContext*>(data);\n  // Allow new pending function notifications to be made, and stop tracking the\n  // lifetime of the idle source that is already being executed and thus\n  // removed. This must be done before executing the functions (if done after,\n  // notifications may be missed if they happen between the execution of the\n  // functions and the reset of pending_functions_idle_pending_).\n  {\n    std::lock_guard<std::mutex> pending_functions_idle_pending_lock(\n        app_context.pending_functions_idle_pending_mutex_);\n    app_context.pending_functions_idle_pending_ = 0;\n  }\n  app_context.ExecutePendingFunctionsFromUIThread();\n  return G_SOURCE_REMOVE;\n}\n\ngboolean GTKWindowedAppContext::QuitSourceFunc(gpointer data) {\n  auto app_context = static_cast<GTKWindowedAppContext*>(data);\n  guint main_level = gtk_main_level();\n  assert_not_zero(main_level);\n  if (!main_level) {\n    app_context->quit_idle_pending_ = 0;\n    return G_SOURCE_REMOVE;\n  }\n  gtk_main_quit();\n  // Quit from all loops in the context, current inner, upcoming inner (this is\n  // why the idle function is added even at the main level of 1), until we can\n  // return to the tail of RunMainGTKLoop.\n  app_context->quit_idle_pending_ =\n      gdk_threads_add_idle(QuitSourceFunc, app_context);\n  return G_SOURCE_REMOVE;\n}\n\n}  // namespace ui\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/ui/windowed_app_context_gtk.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_WINDOWED_APP_CONTEXT_GTK_H_\n#define XENIA_UI_WINDOWED_APP_CONTEXT_GTK_H_\n\n#include <glib.h>\n#include <mutex>\n\n#include \"xenia/ui/windowed_app_context.h\"\n\nnamespace xe {\nnamespace ui {\n\nclass GTKWindowedAppContext final : public WindowedAppContext {\n public:\n  GTKWindowedAppContext() = default;\n  ~GTKWindowedAppContext();\n\n  void NotifyUILoopOfPendingFunctions() override;\n\n  void PlatformQuitFromUIThread() override;\n\n  void RunMainGTKLoop();\n\n private:\n  static gboolean PendingFunctionsSourceFunc(gpointer data);\n\n  static gboolean QuitSourceFunc(gpointer data);\n\n  std::mutex pending_functions_idle_pending_mutex_;\n  guint pending_functions_idle_pending_ = 0;\n\n  guint quit_idle_pending_ = 0;\n};\n\n}  // namespace ui\n}  // namespace xe\n\n#endif  // XENIA_UI_WINDOWED_APP_CONTEXT_GTK_H_\n"
  },
  {
    "path": "src/xenia/ui/windowed_app_context_win.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/ui/windowed_app_context_win.h\"\n\n#include <cstdlib>\n\n#include \"xenia/base/platform_win.h\"\n\nnamespace xe {\nnamespace ui {\n\nbool Win32WindowedAppContext::pending_functions_window_class_registered_;\n\nWin32WindowedAppContext::~Win32WindowedAppContext() {\n  if (pending_functions_hwnd_) {\n    DestroyWindow(pending_functions_hwnd_);\n  }\n  if (user32_module_) {\n    FreeLibrary(user32_module_);\n  }\n  if (shcore_module_) {\n    FreeLibrary(shcore_module_);\n  }\n}\n\nbool Win32WindowedAppContext::Initialize() {\n  // Logging possibly not initialized in this function yet.\n\n  // Obtain function pointers that may be used for windows if available.\n  shcore_module_ = LoadLibraryW(L\"SHCore.dll\");\n  if (shcore_module_) {\n    per_monitor_dpi_v1_api_available_ = true;\n    per_monitor_dpi_v1_api_available_ &=\n        (*reinterpret_cast<void**>(\n             &per_monitor_dpi_v1_api_.get_dpi_for_monitor) =\n             GetProcAddress(shcore_module_, \"GetDpiForMonitor\")) != nullptr;\n  }\n  user32_module_ = LoadLibraryW(L\"user32.dll\");\n  if (user32_module_) {\n    per_monitor_dpi_v2_api_available_ = true;\n    per_monitor_dpi_v2_api_available_ &=\n        (*reinterpret_cast<void**>(\n             &per_monitor_dpi_v2_api_.adjust_window_rect_ex_for_dpi) =\n             GetProcAddress(user32_module_, \"AdjustWindowRectExForDpi\")) !=\n        nullptr;\n    per_monitor_dpi_v2_api_available_ &=\n        (*reinterpret_cast<void**>(\n             &per_monitor_dpi_v2_api_.enable_non_client_dpi_scaling) =\n             GetProcAddress(user32_module_, \"EnableNonClientDpiScaling\")) !=\n        nullptr;\n    per_monitor_dpi_v2_api_available_ &=\n        (*reinterpret_cast<void**>(\n             &per_monitor_dpi_v2_api_.get_dpi_for_system) =\n             GetProcAddress(user32_module_, \"GetDpiForSystem\")) != nullptr;\n    per_monitor_dpi_v2_api_available_ &=\n        (*reinterpret_cast<void**>(\n             &per_monitor_dpi_v2_api_.get_dpi_for_window) =\n             GetProcAddress(user32_module_, \"GetDpiForWindow\")) != nullptr;\n  }\n\n  // Create the message-only window for executing pending functions - using a\n  // window instead of executing them between iterations so non-main message\n  // loops, such as Windows modals, can execute pending functions too.\n  static const WCHAR kPendingFunctionsWindowClassName[] =\n      L\"XeniaPendingFunctionsWindowClass\";\n  if (!pending_functions_window_class_registered_) {\n    WNDCLASSEXW pending_functions_window_class = {};\n    pending_functions_window_class.cbSize =\n        sizeof(pending_functions_window_class);\n    pending_functions_window_class.lpfnWndProc = PendingFunctionsWndProc;\n    pending_functions_window_class.hInstance = hinstance_;\n    pending_functions_window_class.lpszClassName =\n        kPendingFunctionsWindowClassName;\n    if (!RegisterClassExW(&pending_functions_window_class)) {\n      return false;\n    }\n    pending_functions_window_class_registered_ = true;\n  }\n  pending_functions_hwnd_ = CreateWindowExW(\n      0, kPendingFunctionsWindowClassName, L\"Xenia Pending Functions\",\n      WS_OVERLAPPED, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,\n      HWND_MESSAGE, nullptr, hinstance_, this);\n  if (!pending_functions_hwnd_) {\n    return false;\n  }\n\n  return true;\n}\n\nvoid Win32WindowedAppContext::NotifyUILoopOfPendingFunctions() {\n  while (!PostMessageW(pending_functions_hwnd_,\n                       kPendingFunctionsWindowClassMessageExecute, 0, 0)) {\n    Sleep(1);\n  }\n}\n\nvoid Win32WindowedAppContext::PlatformQuitFromUIThread() {\n  // Send WM_QUIT to whichever loop happens to process it - may be the loop of a\n  // built-in modal window, which is unaware of HasQuitFromUIThread, don't let\n  // it delay quitting indefinitely.\n  PostQuitMessage(EXIT_SUCCESS);\n}\n\nint Win32WindowedAppContext::RunMainMessageLoop() {\n  int result = EXIT_SUCCESS;\n  MSG message;\n  // The HasQuitFromUIThread check is not absolutely required, but for\n  // additional safety in case WM_QUIT is not received for any reason.\n  while (!HasQuitFromUIThread()) {\n    BOOL message_result = GetMessageW(&message, nullptr, 0, 0);\n    if (message_result == 0 || message_result == -1) {\n      // WM_QUIT (0 - this is the primary message loop, no need to resend, also\n      // contains the result from PostQuitMessage in wParam) or an error\n      // (-1). Quitting the context will run the pending functions. Getting\n      // WM_QUIT doesn't imply that QuitFromUIThread has been called already, it\n      // may originate in some place other than PlatformQuitFromUIThread as\n      // well - call it to finish everything including the pending functions.\n      QuitFromUIThread();\n      result = message_result ? EXIT_FAILURE : int(message.wParam);\n      break;\n    }\n    TranslateMessage(&message);\n    DispatchMessageW(&message);\n  }\n  return result;\n}\n\nLRESULT CALLBACK Win32WindowedAppContext::PendingFunctionsWndProc(\n    HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) {\n  if (message == WM_CLOSE) {\n    // Need the window for the entire context's lifetime, don't allow anything\n    // to close it.\n    return 0;\n  }\n  if (message == WM_NCCREATE) {\n    SetWindowLongPtrW(\n        hwnd, GWLP_USERDATA,\n        reinterpret_cast<LONG_PTR>(\n            reinterpret_cast<const CREATESTRUCTW*>(lparam)->lpCreateParams));\n  } else {\n    auto app_context = reinterpret_cast<Win32WindowedAppContext*>(\n        GetWindowLongPtrW(hwnd, GWLP_USERDATA));\n    if (app_context) {\n      switch (message) {\n        case WM_DESTROY:\n          // The message-only window owned by the context is being destroyed,\n          // thus the context won't be able to execute pending functions\n          // anymore - can't continue functioning normally.\n          app_context->QuitFromUIThread();\n          break;\n        case kPendingFunctionsWindowClassMessageExecute:\n          app_context->ExecutePendingFunctionsFromUIThread();\n          return 0;\n        default:\n          break;\n      }\n    }\n  }\n  return DefWindowProcW(hwnd, message, wparam, lparam);\n}\n\n}  // namespace ui\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/ui/windowed_app_context_win.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2022 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_UI_WINDOWED_APP_CONTEXT_WIN_H_\n#define XENIA_UI_WINDOWED_APP_CONTEXT_WIN_H_\n\n#include <memory>\n\n#include \"xenia/base/platform_win.h\"\n#include \"xenia/ui/windowed_app_context.h\"\n\n// For per-monitor DPI awareness v1.\n#include <ShellScalingApi.h>\n\nnamespace xe {\nnamespace ui {\n\nclass Win32WindowedAppContext final : public WindowedAppContext {\n public:\n  // clang-format off\n  struct PerMonitorDpiV1Api {\n    HRESULT (STDAPICALLTYPE* get_dpi_for_monitor)(\n        HMONITOR hmonitor, MONITOR_DPI_TYPE dpi_type, UINT* dpi_x, UINT* dpi_y);\n  };\n  struct PerMonitorDpiV2Api {\n    // Important note: Even though per-monitor DPI awareness version 2\n    // inherently has automatic non-client area DPI scaling, PMv2 was added in\n    // Windows 10 1703. However, these functions were added earlier, in 1607.\n    // While we haven't tested the actual behavior on 1607 and this is just a\n    // guess, still, before using AdjustWindowRectExForDpi for the window DPI,\n    // make sure that EnableNonClientDpiScaling is called for the window in its\n    // WM_NCCREATE handler to enable automatic non-client DPI scaling on PMv1 on\n    // 1607, so AdjustWindowRectExForDpi (which doesn't have a window argument\n    // so it can't know whether automatic scaling is enabled for it) will likely\n    // return values that reflect the actual size of the non-client area of the\n    // window (otherwise, for instance, \"un-adjusting\" the actual window\n    // rectangle using AdjustWindowRectExForDpi may result in a negative client\n    // area size if the DPI passed to it is larger than the DPI actually used\n    // for the non-client area).\n    BOOL (WINAPI* adjust_window_rect_ex_for_dpi)(\n        LPRECT rect, DWORD style, BOOL menu, DWORD ex_style, UINT dpi);\n    BOOL (WINAPI* enable_non_client_dpi_scaling)(HWND hwnd);\n    UINT (WINAPI* get_dpi_for_system)();\n    UINT (WINAPI* get_dpi_for_window)(HWND hwnd);\n  };\n  // clang-format on\n\n  // Must call Initialize and check its result after creating to be able to\n  // perform pending function calls.\n  explicit Win32WindowedAppContext(HINSTANCE hinstance, int show_cmd)\n      : hinstance_(hinstance), show_cmd_(show_cmd) {}\n  ~Win32WindowedAppContext();\n\n  bool Initialize();\n\n  HINSTANCE hinstance() const { return hinstance_; }\n  int show_cmd() const { return show_cmd_; }\n\n  void NotifyUILoopOfPendingFunctions() override;\n\n  void PlatformQuitFromUIThread() override;\n\n  int RunMainMessageLoop();\n\n  // Per-monitor DPI awareness version 2 is expected to be enabled via the\n  // manifest, as that's the recommended way, which also doesn't require calling\n  // SetProcessDpiAwareness before doing anything that may depend on DPI\n  // awareness (so it's safe to use any Windows APIs before what would be\n  // supposed to initialize it).\n  // Windows 8.1 per-monitor DPI awareness version 1.\n  const PerMonitorDpiV1Api* per_monitor_dpi_v1_api() const {\n    return per_monitor_dpi_v1_api_available_ ? &per_monitor_dpi_v1_api_\n                                             : nullptr;\n  }\n  // Windows 10 1607 per-monitor DPI awareness API, also heavily used for\n  // per-monitor DPI awareness version 2 functionality added in Windows 10 1703.\n  const PerMonitorDpiV2Api* per_monitor_dpi_v2_api() const {\n    return per_monitor_dpi_v2_api_available_ ? &per_monitor_dpi_v2_api_\n                                             : nullptr;\n  }\n\n private:\n  enum : UINT {\n    kPendingFunctionsWindowClassMessageExecute = WM_USER,\n  };\n\n  static LRESULT CALLBACK PendingFunctionsWndProc(HWND hwnd, UINT message,\n                                                  WPARAM wparam, LPARAM lparam);\n\n  HINSTANCE hinstance_;\n  int show_cmd_;\n\n  HMODULE shcore_module_ = nullptr;\n  HMODULE user32_module_ = nullptr;\n  PerMonitorDpiV1Api per_monitor_dpi_v1_api_ = {};\n  PerMonitorDpiV2Api per_monitor_dpi_v2_api_ = {};\n  bool per_monitor_dpi_v1_api_available_ = false;\n  bool per_monitor_dpi_v2_api_available_ = false;\n\n  static bool pending_functions_window_class_registered_;\n  HWND pending_functions_hwnd_ = nullptr;\n};\n\n}  // namespace ui\n}  // namespace xe\n\n#endif  // XENIA_UI_WINDOWED_APP_CONTEXT_WIN_H_\n"
  },
  {
    "path": "src/xenia/ui/windowed_app_main_android.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n// Not needed - no single entry point, the event loop is polled by the OS.\n"
  },
  {
    "path": "src/xenia/ui/windowed_app_main_posix.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include <gtk/gtk.h>\n#include <cstdio>\n#include <cstdlib>\n#include <memory>\n\n#include \"xenia/base/cvar.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/ui/windowed_app.h\"\n#include \"xenia/ui/windowed_app_context_gtk.h\"\n\nextern \"C\" int main(int argc_pre_gtk, char** argv_pre_gtk) {\n  // Before touching anything GTK+, make sure that when running on Wayland,\n  // we'll still get an X11 (Xwayland) window\n  setenv(\"GDK_BACKEND\", \"x11\", 1);\n\n  // Initialize GTK+, which will handle and remove its own arguments from argv.\n  // Both GTK+ and Xenia use --option=value argument format (see man\n  // gtk-options), however, it's meaningless to try to parse the same argument\n  // both as a GTK+ one and as a cvar. Make GTK+ options take precedence in case\n  // of a name collision, as there's an alternative way of setting Xenia options\n  // (the config).\n  int argc_post_gtk = argc_pre_gtk;\n  char** argv_post_gtk = argv_pre_gtk;\n  if (!gtk_init_check(&argc_post_gtk, &argv_post_gtk)) {\n    // Logging has not been initialized yet.\n    std::fputs(\"Failed to initialize GTK+\\n\", stderr);\n    return EXIT_FAILURE;\n  }\n\n  int result;\n\n  {\n    xe::ui::GTKWindowedAppContext app_context;\n\n    std::unique_ptr<xe::ui::WindowedApp> app =\n        xe::ui::GetWindowedAppCreator()(app_context);\n\n    cvar::ParseLaunchArguments(argc_post_gtk, argv_post_gtk,\n                               app->GetPositionalOptionsUsage(),\n                               app->GetPositionalOptions());\n\n    // Initialize logging. Needs parsed cvars.\n    xe::InitializeLogging(app->GetName());\n\n    if (app->OnInitialize()) {\n      app_context.RunMainGTKLoop();\n      result = EXIT_SUCCESS;\n    } else {\n      result = EXIT_FAILURE;\n    }\n\n    app->InvokeOnDestroy();\n  }\n\n  // Logging may still be needed in the destructors.\n  xe::ShutdownLogging();\n\n  return result;\n}\n"
  },
  {
    "path": "src/xenia/ui/windowed_app_main_win.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include <cstdlib>\n#include <memory>\n\n#include \"xenia/base/console.h\"\n#include \"xenia/base/cvar.h\"\n#include \"xenia/base/main_win.h\"\n#include \"xenia/base/platform_win.h\"\n#include \"xenia/ui/windowed_app.h\"\n#include \"xenia/ui/windowed_app_context_win.h\"\n\nDEFINE_bool(enable_console, false, \"Open a console window with the main window\",\n            \"General\");\n\nint WINAPI wWinMain(HINSTANCE hinstance, HINSTANCE hinstance_prev,\n                    LPWSTR command_line, int show_cmd) {\n  int result;\n\n  {\n    xe::ui::Win32WindowedAppContext app_context(hinstance, show_cmd);\n    // TODO(Triang3l): Initialize creates a window. Set DPI awareness via the\n    // manifest.\n    if (!app_context.Initialize()) {\n      return EXIT_FAILURE;\n    }\n\n    std::unique_ptr<xe::ui::WindowedApp> app =\n        xe::ui::GetWindowedAppCreator()(app_context);\n\n    if (!xe::ParseWin32LaunchArguments(false, app->GetPositionalOptionsUsage(),\n                                       app->GetPositionalOptions(), nullptr)) {\n      return EXIT_FAILURE;\n    }\n\n    // TODO(Triang3l): Rework this, need to initialize the console properly,\n    // disable has_console_attached_ by default in windowed apps, and attach\n    // only if needed.\n    if (cvars::enable_console) {\n      xe::AttachConsole();\n    }\n\n    // Initialize COM on the UI thread with the apartment-threaded concurrency\n    // model, so dialogs can be used.\n    if (FAILED(CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED))) {\n      return EXIT_FAILURE;\n    }\n\n    xe::InitializeWin32App(app->GetName());\n\n    result =\n        app->OnInitialize() ? app_context.RunMainMessageLoop() : EXIT_FAILURE;\n\n    app->InvokeOnDestroy();\n  }\n\n  // Logging may still be needed in the destructors.\n  xe::ShutdownWin32App();\n\n  CoUninitialize();\n\n  return result;\n}\n"
  },
  {
    "path": "src/xenia/vfs/device.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/vfs/device.h\"\n\n#include \"xenia/base/logging.h\"\n\nnamespace xe {\nnamespace vfs {\n\nDevice::Device(const std::string_view mount_path) : mount_path_(mount_path) {}\nDevice::~Device() = default;\n\n}  // namespace vfs\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/vfs/device.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_VFS_DEVICE_H_\n#define XENIA_VFS_DEVICE_H_\n\n#include <memory>\n#include <string>\n\n#include \"xenia/base/mutex.h\"\n#include \"xenia/base/string_buffer.h\"\n#include \"xenia/vfs/entry.h\"\n\nnamespace xe {\nnamespace vfs {\n\nclass Device {\n public:\n  explicit Device(const std::string_view mount_path);\n  virtual ~Device();\n\n  virtual bool Initialize() = 0;\n\n  const std::string& mount_path() const { return mount_path_; }\n  virtual bool is_read_only() const { return true; }\n\n  virtual void Dump(StringBuffer* string_buffer) = 0;\n  virtual Entry* ResolvePath(const std::string_view path) = 0;\n\n  virtual const std::string& name() const = 0;\n  virtual uint32_t attributes() const = 0;\n  virtual uint32_t component_name_max_length() const = 0;\n\n  virtual uint32_t total_allocation_units() const = 0;\n  virtual uint32_t available_allocation_units() const = 0;\n  virtual uint32_t sectors_per_allocation_unit() const = 0;\n  virtual uint32_t bytes_per_sector() const = 0;\n\n protected:\n  xe::global_critical_region global_critical_region_;\n  std::string mount_path_;\n};\n\n}  // namespace vfs\n}  // namespace xe\n\n#endif  // XENIA_VFS_DEVICE_H_\n"
  },
  {
    "path": "src/xenia/vfs/devices/disc_image_device.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/vfs/devices/disc_image_device.h\"\n\n#include \"xenia/base/literals.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/vfs/devices/disc_image_entry.h\"\n\nnamespace xe {\nnamespace vfs {\n\nusing namespace xe::literals;\n\nconst size_t kXESectorSize = 2_KiB;\n\nDiscImageDevice::DiscImageDevice(const std::string_view mount_path,\n                                 const std::filesystem::path& host_path)\n    : Device(mount_path), name_(\"GDFX\"), host_path_(host_path) {}\n\nDiscImageDevice::~DiscImageDevice() = default;\n\nbool DiscImageDevice::Initialize() {\n  mmap_ = MappedMemory::Open(host_path_, MappedMemory::Mode::kRead);\n  if (!mmap_) {\n    XELOGE(\"Disc image could not be mapped\");\n    return false;\n  }\n\n  ParseState state = {0};\n  state.ptr = mmap_->data();\n  state.size = mmap_->size();\n  auto result = Verify(&state);\n  if (result != Error::kSuccess) {\n    XELOGE(\"Failed to verify disc image header: {}\", result);\n    return false;\n  }\n\n  result = ReadAllEntries(&state, state.ptr + state.root_offset);\n  if (result != Error::kSuccess) {\n    XELOGE(\"Failed to read all GDFX entries: {}\", result);\n    return false;\n  }\n\n  return true;\n}\n\nvoid DiscImageDevice::Dump(StringBuffer* string_buffer) {\n  auto global_lock = global_critical_region_.Acquire();\n  root_entry_->Dump(string_buffer, 0);\n}\n\nEntry* DiscImageDevice::ResolvePath(const std::string_view path) {\n  // The filesystem will have stripped our prefix off already, so the path will\n  // be in the form:\n  // some\\PATH.foo\n  XELOGFS(\"DiscImageDevice::ResolvePath({})\", path);\n  return root_entry_->ResolvePath(path);\n}\n\nDiscImageDevice::Error DiscImageDevice::Verify(ParseState* state) {\n  // Find sector 32 of the game partition - try at a few points.\n  static const size_t likely_offsets[] = {\n      0x00000000, 0x0000FB20, 0x00020600, 0x02080000, 0x0FD90000,\n  };\n  bool magic_found = false;\n  for (size_t n = 0; n < xe::countof(likely_offsets); n++) {\n    state->game_offset = likely_offsets[n];\n    if (VerifyMagic(state, state->game_offset + (32 * kXESectorSize))) {\n      magic_found = true;\n      break;\n    }\n  }\n  if (!magic_found) {\n    // File doesn't have the magic values - likely not a real GDFX source.\n    return Error::kErrorFileMismatch;\n  }\n\n  // Read sector 32 to get FS state.\n  if (state->size < state->game_offset + (32 * kXESectorSize)) {\n    return Error::kErrorReadError;\n  }\n  uint8_t* fs_ptr = state->ptr + state->game_offset + (32 * kXESectorSize);\n  state->root_sector = xe::load<uint32_t>(fs_ptr + 20);\n  state->root_size = xe::load<uint32_t>(fs_ptr + 24);\n  state->root_offset =\n      state->game_offset + (state->root_sector * kXESectorSize);\n  if (state->root_size < 13 || state->root_size > 32_MiB) {\n    return Error::kErrorDamagedFile;\n  }\n\n  return Error::kSuccess;\n}\n\nbool DiscImageDevice::VerifyMagic(ParseState* state, size_t offset) {\n  if (offset >= state->size) {\n    return false;\n  }\n\n  // Simple check to see if the given offset contains the magic value.\n  return std::memcmp(state->ptr + offset, \"MICROSOFT*XBOX*MEDIA\", 20) == 0;\n}\n\nDiscImageDevice::Error DiscImageDevice::ReadAllEntries(\n    ParseState* state, const uint8_t* root_buffer) {\n  auto root_entry = new DiscImageEntry(this, nullptr, \"\", mmap_.get());\n  root_entry->attributes_ = kFileAttributeDirectory;\n  root_entry_ = std::unique_ptr<Entry>(root_entry);\n\n  if (!ReadEntry(state, root_buffer, 0, root_entry)) {\n    return Error::kErrorOutOfMemory;\n  }\n\n  return Error::kSuccess;\n}\n\nbool DiscImageDevice::ReadEntry(ParseState* state, const uint8_t* buffer,\n                                uint16_t entry_ordinal,\n                                DiscImageEntry* parent) {\n  const uint8_t* p = buffer + (entry_ordinal * 4);\n\n  uint16_t node_l = xe::load<uint16_t>(p + 0);\n  uint16_t node_r = xe::load<uint16_t>(p + 2);\n  size_t sector = xe::load<uint32_t>(p + 4);\n  size_t length = xe::load<uint32_t>(p + 8);\n  uint8_t attributes = xe::load<uint8_t>(p + 12);\n  uint8_t name_length = xe::load<uint8_t>(p + 13);\n  auto name_buffer = reinterpret_cast<const char*>(p + 14);\n\n  if (node_l && !ReadEntry(state, buffer, node_l, parent)) {\n    return false;\n  }\n\n  auto name = std::string(name_buffer, name_length);\n\n  auto entry = DiscImageEntry::Create(this, parent, name, mmap_.get());\n  entry->attributes_ = attributes | kFileAttributeReadOnly;\n  entry->size_ = length;\n  entry->allocation_size_ = xe::round_up(length, bytes_per_sector());\n\n  // Set to January 1, 1970 (UTC) in 100-nanosecond intervals\n  entry->create_timestamp_ = 10000 * 11644473600000LL;\n  entry->access_timestamp_ = 10000 * 11644473600000LL;\n  entry->write_timestamp_ = 10000 * 11644473600000LL;\n\n  if (attributes & kFileAttributeDirectory) {\n    // Folder.\n    entry->data_offset_ = 0;\n    entry->data_size_ = 0;\n    if (length) {\n      // Not a leaf - read in children.\n      if (state->size < state->game_offset + (sector * kXESectorSize)) {\n        // Out of bounds read.\n        return false;\n      }\n      // Read child list.\n      uint8_t* folder_ptr =\n          state->ptr + state->game_offset + (sector * kXESectorSize);\n      if (!ReadEntry(state, folder_ptr, 0, entry.get())) {\n        return false;\n      }\n    }\n  } else {\n    // File.\n    entry->data_offset_ = state->game_offset + (sector * kXESectorSize);\n    entry->data_size_ = length;\n  }\n\n  // Add to parent.\n  parent->children_.emplace_back(std::move(entry));\n\n  // Read next file in the list.\n  if (node_r && !ReadEntry(state, buffer, node_r, parent)) {\n    return false;\n  }\n\n  return true;\n}\n\n}  // namespace vfs\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/vfs/devices/disc_image_device.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_VFS_DEVICES_DISC_IMAGE_DEVICE_H_\n#define XENIA_VFS_DEVICES_DISC_IMAGE_DEVICE_H_\n\n#include <memory>\n#include <string>\n\n#include \"xenia/base/mapped_memory.h\"\n#include \"xenia/vfs/device.h\"\n\nnamespace xe {\nnamespace vfs {\n\nclass DiscImageEntry;\n\nclass DiscImageDevice : public Device {\n public:\n  DiscImageDevice(const std::string_view mount_path,\n                  const std::filesystem::path& host_path);\n  ~DiscImageDevice() override;\n\n  bool Initialize() override;\n  void Dump(StringBuffer* string_buffer) override;\n  Entry* ResolvePath(const std::string_view path) override;\n\n  const std::string& name() const override { return name_; }\n  uint32_t attributes() const override { return 0; }\n  uint32_t component_name_max_length() const override { return 255; }\n\n  uint32_t total_allocation_units() const override {\n    return uint32_t(mmap_->size() / sectors_per_allocation_unit() /\n                    bytes_per_sector());\n  }\n  uint32_t available_allocation_units() const override { return 0; }\n  uint32_t sectors_per_allocation_unit() const override { return 1; }\n  uint32_t bytes_per_sector() const override { return 0x200; }\n\n private:\n  enum class Error {\n    kSuccess = 0,\n    kErrorOutOfMemory = -1,\n    kErrorReadError = -10,\n    kErrorFileMismatch = -30,\n    kErrorDamagedFile = -31,\n  };\n\n  std::string name_;\n  std::filesystem::path host_path_;\n  std::unique_ptr<Entry> root_entry_;\n  std::unique_ptr<MappedMemory> mmap_;\n\n  typedef struct {\n    uint8_t* ptr;\n    size_t size;         // Size (bytes) of total image.\n    size_t game_offset;  // Offset (bytes) of game partition.\n    size_t root_sector;  // Offset (sector) of root.\n    size_t root_offset;  // Offset (bytes) of root.\n    size_t root_size;    // Size (bytes) of root.\n  } ParseState;\n\n  Error Verify(ParseState* state);\n  bool VerifyMagic(ParseState* state, size_t offset);\n  Error ReadAllEntries(ParseState* state, const uint8_t* root_buffer);\n  bool ReadEntry(ParseState* state, const uint8_t* buffer,\n                 uint16_t entry_ordinal, DiscImageEntry* parent);\n};\n\n}  // namespace vfs\n}  // namespace xe\n\n#endif  // XENIA_VFS_DEVICES_DISC_IMAGE_DEVICE_H_\n"
  },
  {
    "path": "src/xenia/vfs/devices/disc_image_entry.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/vfs/devices/disc_image_entry.h\"\n\n#include <algorithm>\n\n#include \"xenia/base/math.h\"\n#include \"xenia/vfs/devices/disc_image_file.h\"\n\nnamespace xe {\nnamespace vfs {\n\nDiscImageEntry::DiscImageEntry(Device* device, Entry* parent,\n                               const std::string_view path, MappedMemory* mmap)\n    : Entry(device, parent, path),\n      mmap_(mmap),\n      data_offset_(0),\n      data_size_(0) {}\n\nDiscImageEntry::~DiscImageEntry() = default;\n\nstd::unique_ptr<DiscImageEntry> DiscImageEntry::Create(\n    Device* device, Entry* parent, const std::string_view name,\n    MappedMemory* mmap) {\n  auto path = xe::utf8::join_guest_paths(parent->path(), name);\n  auto entry = std::make_unique<DiscImageEntry>(device, parent, path, mmap);\n  return std::move(entry);\n}\n\nX_STATUS DiscImageEntry::Open(uint32_t desired_access, File** out_file) {\n  *out_file = new DiscImageFile(desired_access, this);\n  return X_STATUS_SUCCESS;\n}\n\nstd::unique_ptr<MappedMemory> DiscImageEntry::OpenMapped(\n    MappedMemory::Mode mode, size_t offset, size_t length) {\n  if (mode != MappedMemory::Mode::kRead) {\n    // Only allow reads.\n    return nullptr;\n  }\n\n  size_t real_offset = data_offset_ + offset;\n  size_t real_length = length ? std::min(length, data_size_) : data_size_;\n  return mmap_->Slice(real_offset, real_length);\n}\n\n}  // namespace vfs\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/vfs/devices/disc_image_entry.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_VFS_DEVICES_DISC_IMAGE_ENTRY_H_\n#define XENIA_VFS_DEVICES_DISC_IMAGE_ENTRY_H_\n\n#include <string>\n#include <vector>\n\n#include \"xenia/base/mapped_memory.h\"\n#include \"xenia/vfs/entry.h\"\n\nnamespace xe {\nnamespace vfs {\n\nclass DiscImageDevice;\n\nclass DiscImageEntry : public Entry {\n public:\n  DiscImageEntry(Device* device, Entry* parent, const std::string_view path,\n                 MappedMemory* mmap);\n  ~DiscImageEntry() override;\n\n  static std::unique_ptr<DiscImageEntry> Create(Device* device, Entry* parent,\n                                                const std::string_view name,\n                                                MappedMemory* mmap);\n\n  MappedMemory* mmap() const { return mmap_; }\n  size_t data_offset() const { return data_offset_; }\n  size_t data_size() const { return data_size_; }\n\n  X_STATUS Open(uint32_t desired_access, File** out_file) override;\n\n  bool can_map() const override { return true; }\n  std::unique_ptr<MappedMemory> OpenMapped(MappedMemory::Mode mode,\n                                           size_t offset,\n                                           size_t length) override;\n\n private:\n  friend class DiscImageDevice;\n\n  MappedMemory* mmap_;\n  size_t data_offset_;\n  size_t data_size_;\n};\n\n}  // namespace vfs\n}  // namespace xe\n\n#endif  // XENIA_VFS_DEVICES_DISC_IMAGE_ENTRY_H_\n"
  },
  {
    "path": "src/xenia/vfs/devices/disc_image_file.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/vfs/devices/disc_image_file.h\"\n\n#include <algorithm>\n\n#include \"xenia/vfs/devices/disc_image_entry.h\"\n\nnamespace xe {\nnamespace vfs {\n\nDiscImageFile::DiscImageFile(uint32_t file_access, DiscImageEntry* entry)\n    : File(file_access, entry), entry_(entry) {}\n\nDiscImageFile::~DiscImageFile() = default;\n\nvoid DiscImageFile::Destroy() { delete this; }\n\nX_STATUS DiscImageFile::ReadSync(void* buffer, size_t buffer_length,\n                                 size_t byte_offset, size_t* out_bytes_read) {\n  if (byte_offset >= entry_->size()) {\n    return X_STATUS_END_OF_FILE;\n  }\n  size_t real_offset = entry_->data_offset() + byte_offset;\n  size_t real_length =\n      std::min(buffer_length, entry_->data_size() - byte_offset);\n  std::memcpy(buffer, entry_->mmap()->data() + real_offset, real_length);\n  *out_bytes_read = real_length;\n  return X_STATUS_SUCCESS;\n}\n\n}  // namespace vfs\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/vfs/devices/disc_image_file.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_VFS_DEVICES_DISC_IMAGE_FILE_H_\n#define XENIA_VFS_DEVICES_DISC_IMAGE_FILE_H_\n\n#include \"xenia/vfs/file.h\"\n\nnamespace xe {\nnamespace vfs {\n\nclass DiscImageEntry;\n\nclass DiscImageFile : public File {\n public:\n  DiscImageFile(uint32_t file_access, DiscImageEntry* entry);\n  ~DiscImageFile() override;\n\n  void Destroy() override;\n\n  X_STATUS ReadSync(void* buffer, size_t buffer_length, size_t byte_offset,\n                    size_t* out_bytes_read) override;\n  X_STATUS WriteSync(const void* buffer, size_t buffer_length,\n                     size_t byte_offset, size_t* out_bytes_written) override {\n    return X_STATUS_ACCESS_DENIED;\n  }\n  X_STATUS SetLength(size_t length) override { return X_STATUS_ACCESS_DENIED; }\n\n private:\n  DiscImageEntry* entry_;\n};\n\n}  // namespace vfs\n}  // namespace xe\n\n#endif  // XENIA_VFS_DEVICES_DISC_IMAGE_FILE_H_\n"
  },
  {
    "path": "src/xenia/vfs/devices/host_path_device.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/vfs/devices/host_path_device.h\"\n\n#include \"xenia/base/filesystem.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/kernel/xfile.h\"\n#include \"xenia/vfs/devices/host_path_entry.h\"\n\nnamespace xe {\nnamespace vfs {\n\nHostPathDevice::HostPathDevice(const std::string_view mount_path,\n                               const std::filesystem::path& host_path,\n                               bool read_only)\n    : Device(mount_path),\n      name_(\"STFS\"),\n      host_path_(host_path),\n      read_only_(read_only) {}\n\nHostPathDevice::~HostPathDevice() = default;\n\nbool HostPathDevice::Initialize() {\n  if (!std::filesystem::exists(host_path_)) {\n    if (!read_only_) {\n      // Create the path.\n      std::filesystem::create_directories(host_path_);\n    } else {\n      XELOGE(\"Host path does not exist\");\n      return false;\n    }\n  }\n\n  auto root_entry = new HostPathEntry(this, nullptr, \"\", host_path_);\n  root_entry->attributes_ = kFileAttributeDirectory;\n  root_entry_ = std::unique_ptr<Entry>(root_entry);\n  PopulateEntry(root_entry);\n\n  return true;\n}\n\nvoid HostPathDevice::Dump(StringBuffer* string_buffer) {\n  auto global_lock = global_critical_region_.Acquire();\n  root_entry_->Dump(string_buffer, 0);\n}\n\nEntry* HostPathDevice::ResolvePath(const std::string_view path) {\n  // The filesystem will have stripped our prefix off already, so the path will\n  // be in the form:\n  // some\\PATH.foo\n  XELOGFS(\"HostPathDevice::ResolvePath({})\", path);\n  return root_entry_->ResolvePath(path);\n}\n\nvoid HostPathDevice::PopulateEntry(HostPathEntry* parent_entry) {\n  auto child_infos = xe::filesystem::ListFiles(parent_entry->host_path());\n  for (auto& child_info : child_infos) {\n    auto child = HostPathEntry::Create(\n        this, parent_entry, parent_entry->host_path() / child_info.name,\n        child_info);\n    parent_entry->children_.push_back(std::unique_ptr<Entry>(child));\n\n    if (child_info.type == xe::filesystem::FileInfo::Type::kDirectory) {\n      PopulateEntry(child);\n    }\n  }\n}\n\n}  // namespace vfs\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/vfs/devices/host_path_device.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_VFS_DEVICES_HOST_PATH_DEVICE_H_\n#define XENIA_VFS_DEVICES_HOST_PATH_DEVICE_H_\n\n#include <string>\n\n#include \"xenia/vfs/device.h\"\n\nnamespace xe {\nnamespace vfs {\n\nclass HostPathEntry;\n\nclass HostPathDevice : public Device {\n public:\n  HostPathDevice(const std::string_view mount_path,\n                 const std::filesystem::path& host_path, bool read_only);\n  ~HostPathDevice() override;\n\n  bool Initialize() override;\n  void Dump(StringBuffer* string_buffer) override;\n  Entry* ResolvePath(const std::string_view path) override;\n\n  bool is_read_only() const override { return read_only_; }\n\n  const std::string& name() const override { return name_; }\n  uint32_t attributes() const override { return 0; }\n  uint32_t component_name_max_length() const override { return 40; }\n\n  uint32_t total_allocation_units() const override { return 128 * 1024; }\n  uint32_t available_allocation_units() const override { return 128 * 1024; }\n  uint32_t sectors_per_allocation_unit() const override { return 1; }\n  uint32_t bytes_per_sector() const override { return 0x200; }\n\n private:\n  void PopulateEntry(HostPathEntry* parent_entry);\n\n  std::string name_;\n  std::filesystem::path host_path_;\n  std::unique_ptr<Entry> root_entry_;\n  bool read_only_;\n};\n\n}  // namespace vfs\n}  // namespace xe\n\n#endif  // XENIA_VFS_DEVICES_HOST_PATH_DEVICE_H_\n"
  },
  {
    "path": "src/xenia/vfs/devices/host_path_entry.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/vfs/devices/host_path_entry.h\"\n\n#include \"xenia/base/filesystem.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/mapped_memory.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/string.h\"\n#include \"xenia/vfs/device.h\"\n#include \"xenia/vfs/devices/host_path_file.h\"\n\nnamespace xe {\nnamespace vfs {\n\nHostPathEntry::HostPathEntry(Device* device, Entry* parent,\n                             const std::string_view path,\n                             const std::filesystem::path& host_path)\n    : Entry(device, parent, path), host_path_(host_path) {}\n\nHostPathEntry::~HostPathEntry() = default;\n\nHostPathEntry* HostPathEntry::Create(Device* device, Entry* parent,\n                                     const std::filesystem::path& full_path,\n                                     xe::filesystem::FileInfo file_info) {\n  auto path = xe::utf8::join_guest_paths(parent->path(),\n                                         xe::path_to_utf8(file_info.name));\n  auto entry = new HostPathEntry(device, parent, path, full_path);\n\n  entry->create_timestamp_ = file_info.create_timestamp;\n  entry->access_timestamp_ = file_info.access_timestamp;\n  entry->write_timestamp_ = file_info.write_timestamp;\n  if (file_info.type == xe::filesystem::FileInfo::Type::kDirectory) {\n    entry->attributes_ = kFileAttributeDirectory;\n  } else {\n    entry->attributes_ = kFileAttributeNormal;\n    if (device->is_read_only()) {\n      entry->attributes_ |= kFileAttributeReadOnly;\n    }\n    entry->size_ = file_info.total_size;\n    entry->allocation_size_ =\n        xe::round_up(file_info.total_size, device->bytes_per_sector());\n  }\n  return entry;\n}\n\nX_STATUS HostPathEntry::Open(uint32_t desired_access, File** out_file) {\n  if (is_read_only() && (desired_access & (FileAccess::kFileWriteData |\n                                           FileAccess::kFileAppendData))) {\n    XELOGE(\"Attempting to open file for write access on read-only device\");\n    return X_STATUS_ACCESS_DENIED;\n  }\n  auto file_handle =\n      xe::filesystem::FileHandle::OpenExisting(host_path_, desired_access);\n  if (!file_handle) {\n    // TODO(benvanik): pick correct response.\n    return X_STATUS_NO_SUCH_FILE;\n  }\n  *out_file = new HostPathFile(desired_access, this, std::move(file_handle));\n  return X_STATUS_SUCCESS;\n}\n\nstd::unique_ptr<MappedMemory> HostPathEntry::OpenMapped(MappedMemory::Mode mode,\n                                                        size_t offset,\n                                                        size_t length) {\n  return MappedMemory::Open(host_path_, mode, offset, length);\n}\n\nstd::unique_ptr<Entry> HostPathEntry::CreateEntryInternal(\n    const std::string_view name, uint32_t attributes) {\n  auto full_path = host_path_ / xe::to_path(name);\n  if (attributes & kFileAttributeDirectory) {\n    if (!std::filesystem::create_directories(full_path)) {\n      return nullptr;\n    }\n  } else {\n    auto file = xe::filesystem::OpenFile(full_path, \"wb\");\n    if (!file) {\n      return nullptr;\n    }\n    fclose(file);\n  }\n  xe::filesystem::FileInfo file_info;\n  if (!xe::filesystem::GetInfo(full_path, &file_info)) {\n    return nullptr;\n  }\n  return std::unique_ptr<Entry>(\n      HostPathEntry::Create(device_, this, full_path, file_info));\n}\n\nbool HostPathEntry::DeleteEntryInternal(Entry* entry) {\n  auto full_path = host_path_ / xe::to_path(entry->name());\n  std::error_code ec;  // avoid exception on remove/remove_all failure\n  if (entry->attributes() & kFileAttributeDirectory) {\n    // Delete entire directory and contents.\n    auto removed = std::filesystem::remove_all(full_path, ec);\n    return removed >= 1 && removed != static_cast<std::uintmax_t>(-1);\n  } else {\n    // Delete file.\n    return !std::filesystem::is_directory(full_path) &&\n           std::filesystem::remove(full_path, ec);\n  }\n}\n\nvoid HostPathEntry::update() {\n  xe::filesystem::FileInfo file_info;\n  if (!xe::filesystem::GetInfo(host_path_, &file_info)) {\n    return;\n  }\n  if (file_info.type == xe::filesystem::FileInfo::Type::kFile) {\n    size_ = file_info.total_size;\n    allocation_size_ =\n        xe::round_up(file_info.total_size, device()->bytes_per_sector());\n  }\n}\n\n}  // namespace vfs\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/vfs/devices/host_path_entry.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_VFS_DEVICES_HOST_PATH_ENTRY_H_\n#define XENIA_VFS_DEVICES_HOST_PATH_ENTRY_H_\n\n#include <string>\n\n#include \"xenia/base/filesystem.h\"\n#include \"xenia/vfs/entry.h\"\n\nnamespace xe {\nnamespace vfs {\n\nclass HostPathDevice;\n\nclass HostPathEntry : public Entry {\n public:\n  HostPathEntry(Device* device, Entry* parent, const std::string_view path,\n                const std::filesystem::path& host_path);\n  ~HostPathEntry() override;\n\n  static HostPathEntry* Create(Device* device, Entry* parent,\n                               const std::filesystem::path& full_path,\n                               xe::filesystem::FileInfo file_info);\n\n  const std::filesystem::path& host_path() { return host_path_; }\n\n  X_STATUS Open(uint32_t desired_access, File** out_file) override;\n\n  bool can_map() const override { return true; }\n  std::unique_ptr<MappedMemory> OpenMapped(MappedMemory::Mode mode,\n                                           size_t offset,\n                                           size_t length) override;\n  void update() override;\n\n private:\n  friend class HostPathDevice;\n\n  std::unique_ptr<Entry> CreateEntryInternal(const std::string_view name,\n                                             uint32_t attributes) override;\n  bool DeleteEntryInternal(Entry* entry) override;\n\n  std::filesystem::path host_path_;\n};\n\n}  // namespace vfs\n}  // namespace xe\n\n#endif  // XENIA_VFS_DEVICES_HOST_PATH_ENTRY_H_\n"
  },
  {
    "path": "src/xenia/vfs/devices/host_path_file.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/vfs/devices/host_path_file.h\"\n\n#include \"xenia/vfs/devices/host_path_entry.h\"\n\nnamespace xe {\nnamespace vfs {\n\nHostPathFile::HostPathFile(\n    uint32_t file_access, HostPathEntry* entry,\n    std::unique_ptr<xe::filesystem::FileHandle> file_handle)\n    : File(file_access, entry), file_handle_(std::move(file_handle)) {}\n\nHostPathFile::~HostPathFile() = default;\n\nvoid HostPathFile::Destroy() { delete this; }\n\nX_STATUS HostPathFile::ReadSync(void* buffer, size_t buffer_length,\n                                size_t byte_offset, size_t* out_bytes_read) {\n  if (!(file_access_ &\n        (FileAccess::kGenericRead | FileAccess::kFileReadData))) {\n    return X_STATUS_ACCESS_DENIED;\n  }\n\n  if (file_handle_->Read(byte_offset, buffer, buffer_length, out_bytes_read)) {\n    return X_STATUS_SUCCESS;\n  } else {\n    return X_STATUS_END_OF_FILE;\n  }\n}\n\nX_STATUS HostPathFile::WriteSync(const void* buffer, size_t buffer_length,\n                                 size_t byte_offset,\n                                 size_t* out_bytes_written) {\n  if (!(file_access_ & (FileAccess::kGenericWrite | FileAccess::kFileWriteData |\n                        FileAccess::kFileAppendData))) {\n    return X_STATUS_ACCESS_DENIED;\n  }\n\n  if (file_handle_->Write(byte_offset, buffer, buffer_length,\n                          out_bytes_written)) {\n    return X_STATUS_SUCCESS;\n  } else {\n    return X_STATUS_END_OF_FILE;\n  }\n}\n\nX_STATUS HostPathFile::SetLength(size_t length) {\n  if (!(file_access_ &\n        (FileAccess::kGenericWrite | FileAccess::kFileWriteData))) {\n    return X_STATUS_ACCESS_DENIED;\n  }\n\n  if (file_handle_->SetLength(length)) {\n    return X_STATUS_SUCCESS;\n  } else {\n    return X_STATUS_END_OF_FILE;\n  }\n}\n\n}  // namespace vfs\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/vfs/devices/host_path_file.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_VFS_DEVICES_HOST_PATH_FILE_H_\n#define XENIA_VFS_DEVICES_HOST_PATH_FILE_H_\n\n#include <string>\n\n#include \"xenia/base/filesystem.h\"\n#include \"xenia/vfs/file.h\"\n\nnamespace xe {\nnamespace vfs {\n\nclass HostPathEntry;\n\nclass HostPathFile : public File {\n public:\n  HostPathFile(uint32_t file_access, HostPathEntry* entry,\n               std::unique_ptr<xe::filesystem::FileHandle> file_handle);\n  ~HostPathFile() override;\n\n  void Destroy() override;\n\n  X_STATUS ReadSync(void* buffer, size_t buffer_length, size_t byte_offset,\n                    size_t* out_bytes_read) override;\n  X_STATUS WriteSync(const void* buffer, size_t buffer_length,\n                     size_t byte_offset, size_t* out_bytes_written) override;\n  X_STATUS SetLength(size_t length) override;\n\n private:\n  std::unique_ptr<xe::filesystem::FileHandle> file_handle_;\n};\n\n}  // namespace vfs\n}  // namespace xe\n\n#endif  // XENIA_VFS_DEVICES_HOST_PATH_FILE_H_\n"
  },
  {
    "path": "src/xenia/vfs/devices/null_device.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/vfs/devices/null_device.h\"\n\n#include \"xenia/base/filesystem.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/string.h\"\n#include \"xenia/kernel/xfile.h\"\n#include \"xenia/vfs/devices/null_entry.h\"\n\nnamespace xe {\nnamespace vfs {\n\nNullDevice::NullDevice(const std::string& mount_path,\n                       const std::initializer_list<std::string>& null_paths)\n    : Device(mount_path), null_paths_(null_paths), name_(\"NullDevice\") {}\n\nNullDevice::~NullDevice() = default;\n\nbool NullDevice::Initialize() {\n  auto root_entry = new NullEntry(this, nullptr, mount_path_);\n  root_entry->attributes_ = kFileAttributeDirectory;\n  root_entry_ = std::unique_ptr<Entry>(root_entry);\n\n  for (auto path : null_paths_) {\n    auto child = NullEntry::Create(this, root_entry, path);\n    root_entry->children_.push_back(std::unique_ptr<Entry>(child));\n  }\n  return true;\n}\n\nvoid NullDevice::Dump(StringBuffer* string_buffer) {\n  auto global_lock = global_critical_region_.Acquire();\n  root_entry_->Dump(string_buffer, 0);\n}\n\nEntry* NullDevice::ResolvePath(const std::string_view path) {\n  XELOGFS(\"NullDevice::ResolvePath({})\", path);\n\n  auto root = root_entry_.get();\n  if (path.empty()) {\n    return root_entry_.get();\n  }\n\n  for (auto& child : root->children()) {\n    if (!xe_strcasecmp(child->path().c_str(), path.data())) {\n      return child.get();\n    }\n  }\n\n  return nullptr;\n}\n\n}  // namespace vfs\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/vfs/devices/null_device.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_VFS_DEVICES_NULL_DEVICE_H_\n#define XENIA_VFS_DEVICES_NULL_DEVICE_H_\n\n#include <string>\n\n#include \"xenia/vfs/device.h\"\n\nnamespace xe {\nnamespace vfs {\n\nclass NullEntry;\n\nclass NullDevice : public Device {\n public:\n  NullDevice(const std::string& mount_path,\n             const std::initializer_list<std::string>& null_paths);\n  ~NullDevice() override;\n\n  bool Initialize() override;\n  void Dump(StringBuffer* string_buffer) override;\n  Entry* ResolvePath(const std::string_view path) override;\n\n  bool is_read_only() const override { return false; }\n\n  const std::string& name() const override { return name_; }\n  uint32_t attributes() const override { return 0; }\n  uint32_t component_name_max_length() const override { return 40; }\n\n  uint32_t total_allocation_units() const override { return 0x10; }\n  uint32_t available_allocation_units() const override { return 0x10; }\n\n  // STFC/cache code seems to require the product of the next two to equal\n  // 0x10000\n  uint32_t sectors_per_allocation_unit() const override { return 0x80; }\n\n  // STFC requires <= 0x1000\n  uint32_t bytes_per_sector() const override { return 0x200; }\n\n private:\n  std::string name_;\n  std::unique_ptr<Entry> root_entry_;\n  std::vector<std::string> null_paths_;\n};\n\n}  // namespace vfs\n}  // namespace xe\n\n#endif  // XENIA_VFS_DEVICES_NULL_DEVICE_H_\n"
  },
  {
    "path": "src/xenia/vfs/devices/null_entry.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/vfs/devices/null_entry.h\"\n\n#include \"xenia/base/filesystem.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/mapped_memory.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/base/string.h\"\n#include \"xenia/vfs/device.h\"\n#include \"xenia/vfs/devices/null_file.h\"\n\nnamespace xe {\nnamespace vfs {\n\nNullEntry::NullEntry(Device* device, Entry* parent, std::string path)\n    : Entry(device, parent, path) {}\n\nNullEntry::~NullEntry() = default;\n\nNullEntry* NullEntry::Create(Device* device, Entry* parent,\n                             const std::string& path) {\n  auto entry = new NullEntry(device, parent, path);\n\n  entry->create_timestamp_ = 0;\n  entry->access_timestamp_ = 0;\n  entry->write_timestamp_ = 0;\n\n  entry->attributes_ = kFileAttributeNormal;\n\n  entry->size_ = 0;\n  entry->allocation_size_ = 0;\n  return entry;\n}\n\nX_STATUS NullEntry::Open(uint32_t desired_access, File** out_file) {\n  if (is_read_only() && (desired_access & (FileAccess::kFileWriteData |\n                                           FileAccess::kFileAppendData))) {\n    XELOGE(\"Attempting to open file for write access on read-only device\");\n    return X_STATUS_ACCESS_DENIED;\n  }\n\n  *out_file = new NullFile(desired_access, this);\n  return X_STATUS_SUCCESS;\n}\n\n}  // namespace vfs\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/vfs/devices/null_entry.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_VFS_DEVICES_NULL_ENTRY_H_\n#define XENIA_VFS_DEVICES_NULL_ENTRY_H_\n\n#include <string>\n\n#include \"xenia/base/filesystem.h\"\n#include \"xenia/vfs/entry.h\"\n\nnamespace xe {\nnamespace vfs {\n\nclass NullDevice;\n\nclass NullEntry : public Entry {\n public:\n  NullEntry(Device* device, Entry* parent, std::string path);\n  ~NullEntry() override;\n\n  static NullEntry* Create(Device* device, Entry* parent,\n                           const std::string& path);\n\n  X_STATUS Open(uint32_t desired_access, File** out_file) override;\n\n  bool can_map() const override { return false; }\n\n private:\n  friend class NullDevice;\n};\n\n}  // namespace vfs\n}  // namespace xe\n\n#endif  // XENIA_VFS_DEVICES_NULL_ENTRY_H_\n"
  },
  {
    "path": "src/xenia/vfs/devices/null_file.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/vfs/devices/null_file.h\"\n\n#include \"xenia/vfs/devices/null_entry.h\"\n\nnamespace xe {\nnamespace vfs {\n\nNullFile::NullFile(uint32_t file_access, NullEntry* entry)\n    : File(file_access, entry) {}\n\nNullFile::~NullFile() = default;\n\nvoid NullFile::Destroy() { delete this; }\n\nX_STATUS NullFile::ReadSync(void* buffer, size_t buffer_length,\n                            size_t byte_offset, size_t* out_bytes_read) {\n  if (!(file_access_ & FileAccess::kFileReadData)) {\n    return X_STATUS_ACCESS_DENIED;\n  }\n\n  return X_STATUS_SUCCESS;\n}\n\nX_STATUS NullFile::WriteSync(const void* buffer, size_t buffer_length,\n                             size_t byte_offset, size_t* out_bytes_written) {\n  if (!(file_access_ &\n        (FileAccess::kFileWriteData | FileAccess::kFileAppendData))) {\n    return X_STATUS_ACCESS_DENIED;\n  }\n\n  return X_STATUS_SUCCESS;\n}\n\nX_STATUS NullFile::SetLength(size_t length) {\n  if (!(file_access_ & FileAccess::kFileWriteData)) {\n    return X_STATUS_ACCESS_DENIED;\n  }\n\n  return X_STATUS_SUCCESS;\n}\n\n}  // namespace vfs\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/vfs/devices/null_file.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_VFS_DEVICES_NULL_FILE_H_\n#define XENIA_VFS_DEVICES_NULL_FILE_H_\n\n#include <string>\n\n#include \"xenia/base/filesystem.h\"\n#include \"xenia/vfs/file.h\"\n\nnamespace xe {\nnamespace vfs {\n\nclass NullEntry;\n\nclass NullFile : public File {\n public:\n  NullFile(uint32_t file_access, NullEntry* entry);\n  ~NullFile() override;\n\n  void Destroy() override;\n\n  X_STATUS ReadSync(void* buffer, size_t buffer_length, size_t byte_offset,\n                    size_t* out_bytes_read) override;\n  X_STATUS WriteSync(const void* buffer, size_t buffer_length,\n                     size_t byte_offset, size_t* out_bytes_written) override;\n  X_STATUS SetLength(size_t length) override;\n};\n\n}  // namespace vfs\n}  // namespace xe\n\n#endif  // XENIA_VFS_DEVICES_NULL_FILE_H_\n"
  },
  {
    "path": "src/xenia/vfs/devices/stfs_container_device.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/vfs/devices/stfs_container_device.h\"\n\n#include <algorithm>\n#include <queue>\n#include <vector>\n\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/vfs/devices/stfs_container_entry.h\"\n\nnamespace xe {\nnamespace vfs {\n\nStfsContainerDevice::StfsContainerDevice(const std::string_view mount_path,\n                                         const std::filesystem::path& host_path)\n    : Device(mount_path),\n      name_(\"STFS\"),\n      host_path_(host_path),\n      files_total_size_(),\n      svod_base_offset_(),\n      header_(),\n      svod_layout_(),\n      blocks_per_hash_table_(1),\n      block_step{0, 0} {}\n\nStfsContainerDevice::~StfsContainerDevice() { CloseFiles(); }\n\nbool StfsContainerDevice::Initialize() {\n  // Resolve a valid STFS file if a directory is given.\n  if (std::filesystem::is_directory(host_path_) &&\n      !ResolveFromFolder(host_path_)) {\n    XELOGE(\"Could not resolve an STFS container given path {}\",\n           xe::path_to_utf8(host_path_));\n    return false;\n  }\n\n  if (!std::filesystem::exists(host_path_)) {\n    XELOGE(\"Path to STFS container does not exist: {}\",\n           xe::path_to_utf8(host_path_));\n    return false;\n  }\n\n  // Open the data file(s)\n  auto open_result = OpenFiles();\n  if (open_result != Error::kSuccess) {\n    XELOGE(\"Failed to open STFS container: {}\", open_result);\n    return false;\n  }\n\n  switch (header_.metadata.volume_type) {\n    case XContentVolumeType::kStfs:\n      return ReadSTFS() == Error::kSuccess;\n      break;\n    case XContentVolumeType::kSvod:\n      return ReadSVOD() == Error::kSuccess;\n    default:\n      XELOGE(\"Unknown XContent volume type: {}\",\n             xe::byte_swap(uint32_t(header_.metadata.volume_type.value)));\n      return false;\n  }\n}\n\nStfsContainerDevice::Error StfsContainerDevice::OpenFiles() {\n  // Map the file containing the STFS Header and read it.\n  XELOGI(\"Loading STFS header file: {}\", xe::path_to_utf8(host_path_));\n\n  auto header_file = xe::filesystem::OpenFile(host_path_, \"rb\");\n  if (!header_file) {\n    XELOGE(\"Error opening STFS header file.\");\n    return Error::kErrorReadError;\n  }\n\n  auto header_result = ReadHeaderAndVerify(header_file);\n  if (header_result != Error::kSuccess) {\n    XELOGE(\"Error reading STFS header: {}\", header_result);\n    fclose(header_file);\n    files_total_size_ = 0;\n    return header_result;\n  }\n\n  // If the STFS package is a single file, the header is self contained and\n  // we don't need to map any extra files.\n  // NOTE: data_file_count is 0 for STFS and 1 for SVOD\n  if (header_.metadata.data_file_count <= 1) {\n    XELOGI(\"STFS container is a single file.\");\n    files_.emplace(std::make_pair(0, header_file));\n    return Error::kSuccess;\n  }\n\n  // If the STFS package is multi-file, it is an SVOD system. We need to map\n  // the files in the .data folder and can discard the header.\n  auto data_fragment_path = host_path_;\n  data_fragment_path += \".data\";\n  if (!std::filesystem::exists(data_fragment_path)) {\n    XELOGE(\"STFS container is multi-file, but path {} does not exist.\",\n           xe::path_to_utf8(data_fragment_path));\n    return Error::kErrorFileMismatch;\n  }\n\n  // Ensure data fragment files are sorted\n  auto fragment_files = filesystem::ListFiles(data_fragment_path);\n  std::sort(fragment_files.begin(), fragment_files.end(),\n            [](filesystem::FileInfo& left, filesystem::FileInfo& right) {\n              return left.name < right.name;\n            });\n\n  if (fragment_files.size() != header_.metadata.data_file_count) {\n    XELOGE(\"SVOD expecting {} data fragments, but {} are present.\",\n           header_.metadata.data_file_count, fragment_files.size());\n    return Error::kErrorFileMismatch;\n  }\n\n  for (size_t i = 0; i < fragment_files.size(); i++) {\n    auto& fragment = fragment_files.at(i);\n    auto path = fragment.path / fragment.name;\n    auto file = xe::filesystem::OpenFile(path, \"rb\");\n    if (!file) {\n      XELOGI(\"Failed to map SVOD file {}.\", xe::path_to_utf8(path));\n      CloseFiles();\n      return Error::kErrorReadError;\n    }\n\n    xe::filesystem::Seek(file, 0L, SEEK_END);\n    files_total_size_ += xe::filesystem::Tell(file);\n    // no need to seek back, any reads from this file will seek first anyway\n    files_.emplace(std::make_pair(i, file));\n  }\n  XELOGI(\"SVOD successfully mapped {} files.\", fragment_files.size());\n  return Error::kSuccess;\n}\n\nvoid StfsContainerDevice::CloseFiles() {\n  for (auto& file : files_) {\n    fclose(file.second);\n  }\n  files_.clear();\n  files_total_size_ = 0;\n}\n\nvoid StfsContainerDevice::Dump(StringBuffer* string_buffer) {\n  auto global_lock = global_critical_region_.Acquire();\n  root_entry_->Dump(string_buffer, 0);\n}\n\nEntry* StfsContainerDevice::ResolvePath(const std::string_view path) {\n  // The filesystem will have stripped our prefix off already, so the path will\n  // be in the form:\n  // some\\PATH.foo\n  XELOGFS(\"StfsContainerDevice::ResolvePath({})\", path);\n  return root_entry_->ResolvePath(path);\n}\n\nStfsContainerDevice::Error StfsContainerDevice::ReadHeaderAndVerify(\n    FILE* header_file) {\n  // Check size of the file is enough to store an STFS header\n  xe::filesystem::Seek(header_file, 0L, SEEK_END);\n  files_total_size_ = xe::filesystem::Tell(header_file);\n  xe::filesystem::Seek(header_file, 0L, SEEK_SET);\n\n  if (sizeof(StfsHeader) > files_total_size_) {\n    return Error::kErrorTooSmall;\n  }\n\n  // Read header & check signature\n  if (fread(&header_, sizeof(StfsHeader), 1, header_file) != 1) {\n    return Error::kErrorReadError;\n  }\n\n  if (!header_.header.is_magic_valid()) {\n    // Unexpected format.\n    return Error::kErrorFileMismatch;\n  }\n\n  // Pre-calculate some values used in block number calculations\n  if (header_.metadata.volume_type == XContentVolumeType::kStfs) {\n    blocks_per_hash_table_ =\n        header_.metadata.volume_descriptor.stfs.flags.bits.read_only_format ? 1\n                                                                            : 2;\n\n    block_step[0] = kBlocksPerHashLevel[0] + blocks_per_hash_table_;\n    block_step[1] = kBlocksPerHashLevel[1] +\n                    ((kBlocksPerHashLevel[0] + 1) * blocks_per_hash_table_);\n  }\n\n  return Error::kSuccess;\n}\n\nStfsContainerDevice::Error StfsContainerDevice::ReadSVOD() {\n  // SVOD Systems can have different layouts. The root block is\n  // denoted by the magic \"MICROSOFT*XBOX*MEDIA\" and is always in\n  // the first \"actual\" data fragment of the system.\n  auto& svod_header = files_.at(0);\n  const char* MEDIA_MAGIC = \"MICROSOFT*XBOX*MEDIA\";\n\n  uint8_t magic_buf[20];\n  size_t magic_offset;\n\n  // Check for EDGF layout\n  if (header_.metadata.volume_descriptor.svod.features.bits\n          .enhanced_gdf_layout) {\n    // The STFS header has specified that this SVOD system uses the EGDF layout.\n    // We can expect the magic block to be located immediately after the hash\n    // blocks. We also offset block address calculation by 0x1000 by shifting\n    // block indices by +0x2.\n    xe::filesystem::Seek(svod_header, 0x2000, SEEK_SET);\n    if (fread(magic_buf, 1, countof(magic_buf), svod_header) !=\n        countof(magic_buf)) {\n      XELOGE(\"ReadSVOD failed to read SVOD magic at 0x2000\");\n      return Error::kErrorReadError;\n    }\n\n    if (std::memcmp(magic_buf, MEDIA_MAGIC, 20) == 0) {\n      svod_base_offset_ = 0x0000;\n      magic_offset = 0x2000;\n      svod_layout_ = SvodLayoutType::kEnhancedGDF;\n      XELOGI(\"SVOD uses an EGDF layout. Magic block present at 0x2000.\");\n    } else {\n      XELOGE(\"SVOD uses an EGDF layout, but the magic block was not found.\");\n      return Error::kErrorFileMismatch;\n    }\n  } else {\n    xe::filesystem::Seek(svod_header, 0x12000, SEEK_SET);\n    if (fread(magic_buf, 1, countof(magic_buf), svod_header) !=\n        countof(magic_buf)) {\n      XELOGE(\"ReadSVOD failed to read SVOD magic at 0x12000\");\n      return Error::kErrorReadError;\n    }\n    if (std::memcmp(magic_buf, MEDIA_MAGIC, 20) == 0) {\n      // If the SVOD's magic block is at 0x12000, it is likely using an XSF\n      // layout. This is usually due to converting the game using a third-party\n      // tool, as most of them use a nulled XSF as a template.\n\n      svod_base_offset_ = 0x10000;\n      magic_offset = 0x12000;\n\n      // Check for XSF Header\n      const char* XSF_MAGIC = \"XSF\";\n      xe::filesystem::Seek(svod_header, 0x2000, SEEK_SET);\n      if (fread(magic_buf, 1, 3, svod_header) != 3) {\n        XELOGE(\"ReadSVOD failed to read SVOD XSF magic at 0x2000\");\n        return Error::kErrorReadError;\n      }\n      if (std::memcmp(magic_buf, XSF_MAGIC, 3) == 0) {\n        svod_layout_ = SvodLayoutType::kXSF;\n        XELOGI(\"SVOD uses an XSF layout. Magic block present at 0x12000.\");\n        XELOGI(\"Game was likely converted using a third-party tool.\");\n      } else {\n        svod_layout_ = SvodLayoutType::kUnknown;\n        XELOGI(\"SVOD appears to use an XSF layout, but no header is present.\");\n        XELOGI(\"SVOD magic block found at 0x12000\");\n      }\n    } else {\n      xe::filesystem::Seek(svod_header, 0xD000, SEEK_SET);\n      if (fread(magic_buf, 1, countof(magic_buf), svod_header) !=\n          countof(magic_buf)) {\n        XELOGE(\"ReadSVOD failed to read SVOD magic at 0xD000\");\n        return Error::kErrorReadError;\n      }\n      if (std::memcmp(magic_buf, MEDIA_MAGIC, 20) == 0) {\n        // If the SVOD's magic block is at 0xD000, it most likely means that it\n        // is a single-file system. The STFS Header is 0xB000 bytes , and the\n        // remaining 0x2000 is from hash tables. In most cases, these will be\n        // STFS, not SVOD.\n\n        svod_base_offset_ = 0xB000;\n        magic_offset = 0xD000;\n\n        // Check for single file system\n        if (header_.metadata.data_file_count == 1) {\n          svod_layout_ = SvodLayoutType::kSingleFile;\n          XELOGI(\"SVOD is a single file. Magic block present at 0xD000.\");\n        } else {\n          svod_layout_ = SvodLayoutType::kUnknown;\n          XELOGE(\n              \"SVOD is not a single file, but the magic block was found at \"\n              \"0xD000.\");\n        }\n      } else {\n        XELOGE(\"Could not locate SVOD magic block.\");\n        return Error::kErrorReadError;\n      }\n    }\n  }\n\n  // Parse the root directory\n  xe::filesystem::Seek(svod_header, magic_offset + 0x14, SEEK_SET);\n\n  struct {\n    uint32_t block;\n    uint32_t size;\n    uint32_t creation_date;\n    uint32_t creation_time;\n  } root_data;\n  static_assert_size(root_data, 0x10);\n\n  if (fread(&root_data, sizeof(root_data), 1, svod_header) != 1) {\n    XELOGE(\"ReadSVOD failed to read root block data at 0x{X}\",\n           magic_offset + 0x14);\n    return Error::kErrorReadError;\n  }\n\n  uint64_t root_creation_timestamp =\n      decode_fat_timestamp(root_data.creation_date, root_data.creation_time);\n\n  auto root_entry = new StfsContainerEntry(this, nullptr, \"\", &files_);\n  root_entry->attributes_ = kFileAttributeDirectory;\n  root_entry->access_timestamp_ = root_creation_timestamp;\n  root_entry->create_timestamp_ = root_creation_timestamp;\n  root_entry->write_timestamp_ = root_creation_timestamp;\n  root_entry_ = std::unique_ptr<Entry>(root_entry);\n\n  // Traverse all child entries\n  return ReadEntrySVOD(root_data.block, 0, root_entry);\n}\n\nStfsContainerDevice::Error StfsContainerDevice::ReadEntrySVOD(\n    uint32_t block, uint32_t ordinal, StfsContainerEntry* parent) {\n  // For games with a large amount of files, the ordinal offset can overrun\n  // the current block and potentially hit a hash block.\n  size_t ordinal_offset = ordinal * 0x4;\n  size_t block_offset = ordinal_offset / 0x800;\n  size_t true_ordinal_offset = ordinal_offset % 0x800;\n\n  // Calculate the file & address of the block\n  size_t entry_address, entry_file;\n  BlockToOffsetSVOD(block + block_offset, &entry_address, &entry_file);\n  entry_address += true_ordinal_offset;\n\n  // Read directory entry\n  auto& file = files_.at(entry_file);\n  xe::filesystem::Seek(file, entry_address, SEEK_SET);\n\n#pragma pack(push, 1)\n  struct {\n    uint16_t node_l;\n    uint16_t node_r;\n    uint32_t data_block;\n    uint32_t length;\n    uint8_t attributes;\n    uint8_t name_length;\n  } dir_entry;\n  static_assert_size(dir_entry, 0xE);\n#pragma pack(pop)\n\n  if (fread(&dir_entry, sizeof(dir_entry), 1, file) != 1) {\n    XELOGE(\"ReadEntrySVOD failed to read directory entry at 0x{X}\",\n           entry_address);\n    return Error::kErrorReadError;\n  }\n\n  auto name_buffer = std::make_unique<char[]>(dir_entry.name_length);\n  if (fread(name_buffer.get(), 1, dir_entry.name_length, file) !=\n      dir_entry.name_length) {\n    XELOGE(\"ReadEntrySVOD failed to read directory entry name at 0x{X}\",\n           entry_address);\n    return Error::kErrorReadError;\n  }\n\n  auto name = std::string(name_buffer.get(), dir_entry.name_length);\n\n  // Read the left node\n  if (dir_entry.node_l) {\n    auto node_result = ReadEntrySVOD(block, dir_entry.node_l, parent);\n    if (node_result != Error::kSuccess) {\n      return node_result;\n    }\n  }\n\n  // Read file & address of block's data\n  size_t data_address, data_file;\n  BlockToOffsetSVOD(dir_entry.data_block, &data_address, &data_file);\n\n  // Create the entry\n  // NOTE: SVOD entries don't have timestamps for individual files, which can\n  //       cause issues when decrypting games. Using the root entry's timestamp\n  //       solves this issues.\n  auto entry = StfsContainerEntry::Create(this, parent, name, &files_);\n  if (dir_entry.attributes & kFileAttributeDirectory) {\n    // Entry is a directory\n    entry->attributes_ = kFileAttributeDirectory | kFileAttributeReadOnly;\n    entry->data_offset_ = 0;\n    entry->data_size_ = 0;\n    entry->block_ = block;\n    entry->access_timestamp_ = root_entry_->create_timestamp();\n    entry->create_timestamp_ = root_entry_->create_timestamp();\n    entry->write_timestamp_ = root_entry_->create_timestamp();\n\n    if (dir_entry.length) {\n      // If length is greater than 0, traverse the directory's children\n      auto directory_result =\n          ReadEntrySVOD(dir_entry.data_block, 0, entry.get());\n      if (directory_result != Error::kSuccess) {\n        return directory_result;\n      }\n    }\n  } else {\n    // Entry is a file\n    entry->attributes_ = kFileAttributeNormal | kFileAttributeReadOnly;\n    entry->size_ = dir_entry.length;\n    entry->allocation_size_ = xe::round_up(dir_entry.length, kBlockSize);\n    entry->data_offset_ = data_address;\n    entry->data_size_ = dir_entry.length;\n    entry->block_ = dir_entry.data_block;\n    entry->access_timestamp_ = root_entry_->create_timestamp();\n    entry->create_timestamp_ = root_entry_->create_timestamp();\n    entry->write_timestamp_ = root_entry_->create_timestamp();\n\n    // Fill in all block records, sector by sector.\n    if (entry->attributes() & X_FILE_ATTRIBUTE_NORMAL) {\n      uint32_t block_index = dir_entry.data_block;\n      size_t remaining_size = xe::round_up(dir_entry.length, 0x800);\n\n      size_t last_record = -1;\n      size_t last_offset = -1;\n      while (remaining_size) {\n        const size_t BLOCK_SIZE = 0x800;\n\n        size_t offset, file_index;\n        BlockToOffsetSVOD(block_index, &offset, &file_index);\n\n        block_index++;\n        remaining_size -= BLOCK_SIZE;\n\n        if (offset - last_offset == 0x800) {\n          // Consecutive, so append to last entry.\n          entry->block_list_[last_record].length += BLOCK_SIZE;\n          last_offset = offset;\n          continue;\n        }\n\n        entry->block_list_.push_back({file_index, offset, BLOCK_SIZE});\n        last_record = entry->block_list_.size() - 1;\n        last_offset = offset;\n      }\n    }\n  }\n\n  parent->children_.emplace_back(std::move(entry));\n\n  // Read the right node.\n  if (dir_entry.node_r) {\n    auto node_result = ReadEntrySVOD(block, dir_entry.node_r, parent);\n    if (node_result != Error::kSuccess) {\n      return node_result;\n    }\n  }\n\n  return Error::kSuccess;\n}\n\nvoid StfsContainerDevice::BlockToOffsetSVOD(size_t block, size_t* out_address,\n                                            size_t* out_file_index) {\n  // SVOD Systems use hash blocks for integrity checks. These hash blocks\n  // cause blocks to be discontinuous in memory, and must be accounted for.\n  //  - Each data block is 0x800 bytes in length\n  //  - Every group of 0x198 data blocks is preceded a Level0 hash table.\n  //    Level0 tables contain 0xCC hashes, each representing two data blocks.\n  //    The total size of each Level0 hash table is 0x1000 bytes in length.\n  //  - Every 0xA1C4 Level0 hash tables is preceded by a Level1 hash table.\n  //    Level1 tables contain 0xCB hashes, each representing two Level0 hashes.\n  //    The total size of each Level1 hash table is 0x1000 bytes in length.\n  //  - Files are split into fragments of 0xA290000 bytes in length,\n  //    consisting of 0x14388 data blocks, 0xCB Level0 hash tables, and 0x1\n  //    Level1 hash table.\n\n  const size_t BLOCK_SIZE = 0x800;\n  const size_t HASH_BLOCK_SIZE = 0x1000;\n  const size_t BLOCKS_PER_L0_HASH = 0x198;\n  const size_t HASHES_PER_L1_HASH = 0xA1C4;\n  const size_t BLOCKS_PER_FILE = 0x14388;\n  const size_t MAX_FILE_SIZE = 0xA290000;\n  const size_t BLOCK_OFFSET =\n      header_.metadata.volume_descriptor.svod.start_data_block();\n\n  // Resolve the true block address and file index\n  size_t true_block = block - (BLOCK_OFFSET * 2);\n  if (svod_layout_ == SvodLayoutType::kEnhancedGDF) {\n    // EGDF has an 0x1000 byte offset, which is two blocks\n    true_block += 0x2;\n  }\n\n  size_t file_block = true_block % BLOCKS_PER_FILE;\n  size_t file_index = true_block / BLOCKS_PER_FILE;\n  size_t offset = 0;\n\n  // Calculate offset caused by Level0 Hash Tables\n  size_t level0_table_count = (file_block / BLOCKS_PER_L0_HASH) + 1;\n  offset += level0_table_count * HASH_BLOCK_SIZE;\n\n  // Calculate offset caused by Level1 Hash Tables\n  size_t level1_table_count = (level0_table_count / HASHES_PER_L1_HASH) + 1;\n  offset += level1_table_count * HASH_BLOCK_SIZE;\n\n  // For single-file SVOD layouts, include the size of the header in the offset.\n  if (svod_layout_ == SvodLayoutType::kSingleFile) {\n    offset += svod_base_offset_;\n  }\n\n  size_t block_address = (file_block * BLOCK_SIZE) + offset;\n\n  // If the offset causes the block address to overrun the file, round it.\n  if (block_address >= MAX_FILE_SIZE) {\n    file_index += 1;\n    block_address %= MAX_FILE_SIZE;\n    block_address += 0x2000;\n  }\n\n  *out_address = block_address;\n  *out_file_index = file_index;\n}\n\nStfsContainerDevice::Error StfsContainerDevice::ReadSTFS() {\n  auto& file = files_.at(0);\n\n  auto root_entry = new StfsContainerEntry(this, nullptr, \"\", &files_);\n  root_entry->attributes_ = kFileAttributeDirectory;\n  root_entry_ = std::unique_ptr<Entry>(root_entry);\n\n  std::vector<StfsContainerEntry*> all_entries;\n\n  // Load all listings.\n  StfsDirectoryBlock directory;\n\n  auto& descriptor = header_.metadata.volume_descriptor.stfs;\n  uint32_t table_block_index = descriptor.file_table_block_number();\n  size_t n = 0;\n  for (n = 0; n < descriptor.file_table_block_count; n++) {\n    auto offset = BlockToOffsetSTFS(table_block_index);\n    xe::filesystem::Seek(file, offset, SEEK_SET);\n\n    if (fread(&directory, sizeof(StfsDirectoryBlock), 1, file) != 1) {\n      XELOGE(\"ReadSTFS failed to read directory block at 0x{X}\", offset);\n      return Error::kErrorReadError;\n    }\n\n    for (size_t m = 0; m < kEntriesPerDirectoryBlock; m++) {\n      auto& dir_entry = directory.entries[m];\n\n      if (dir_entry.name[0] == 0) {\n        // Done.\n        break;\n      }\n\n      StfsContainerEntry* parent_entry = nullptr;\n      if (dir_entry.directory_index == 0xFFFF) {\n        parent_entry = root_entry;\n      } else {\n        parent_entry = all_entries[dir_entry.directory_index];\n      }\n\n      std::string name(reinterpret_cast<const char*>(dir_entry.name),\n                       dir_entry.flags.name_length & 0x3F);\n      auto entry =\n          StfsContainerEntry::Create(this, parent_entry, name, &files_);\n\n      if (dir_entry.flags.directory) {\n        entry->attributes_ = kFileAttributeDirectory;\n      } else {\n        entry->attributes_ = kFileAttributeNormal | kFileAttributeReadOnly;\n        entry->data_offset_ = BlockToOffsetSTFS(dir_entry.start_block_number());\n        entry->data_size_ = dir_entry.length;\n      }\n      entry->size_ = dir_entry.length;\n      entry->allocation_size_ = xe::round_up(dir_entry.length, kBlockSize);\n\n      entry->create_timestamp_ =\n          decode_fat_timestamp(dir_entry.create_date, dir_entry.create_time);\n      entry->write_timestamp_ = decode_fat_timestamp(dir_entry.modified_date,\n                                                     dir_entry.modified_time);\n      entry->access_timestamp_ = entry->write_timestamp_;\n\n      all_entries.push_back(entry.get());\n\n      // Fill in all block records.\n      // It's easier to do this now and just look them up later, at the cost\n      // of some memory. Nasty chain walk.\n      // TODO(benvanik): optimize if flags.contiguous is set.\n      if (entry->attributes() & X_FILE_ATTRIBUTE_NORMAL) {\n        uint32_t block_index = dir_entry.start_block_number();\n        size_t remaining_size = dir_entry.length;\n        while (remaining_size && block_index != kEndOfChain) {\n          size_t block_size =\n              std::min(static_cast<size_t>(kBlockSize), remaining_size);\n          size_t offset = BlockToOffsetSTFS(block_index);\n          entry->block_list_.push_back({0, offset, block_size});\n          remaining_size -= block_size;\n          auto block_hash = GetBlockHash(block_index);\n          block_index = block_hash->level0_next_block();\n        }\n\n        if (remaining_size) {\n          // Loop above must have exited prematurely, bad hash tables?\n          XELOGW(\n              \"STFS file {} only found {} bytes for file, expected {} ({} \"\n              \"bytes missing)\",\n              name, dir_entry.length - remaining_size, dir_entry.length,\n              remaining_size);\n          assert_always();\n        }\n\n        // Check that the number of blocks retrieved from hash entries matches\n        // the block count read from the file entry\n        if (entry->block_list_.size() != dir_entry.allocated_data_blocks()) {\n          XELOGW(\n              \"STFS failed to read correct block-chain for entry {}, read {} \"\n              \"blocks, expected {}\",\n              entry->name_, entry->block_list_.size(),\n              dir_entry.allocated_data_blocks());\n          assert_always();\n        }\n      }\n\n      parent_entry->children_.emplace_back(std::move(entry));\n    }\n\n    auto block_hash = GetBlockHash(table_block_index);\n    table_block_index = block_hash->level0_next_block();\n    if (table_block_index == kEndOfChain) {\n      break;\n    }\n  }\n\n  if (n + 1 != descriptor.file_table_block_count) {\n    XELOGW(\"STFS read {} file table blocks, but STFS headers expected {}!\",\n           n + 1, descriptor.file_table_block_count);\n    assert_always();\n  }\n\n  return Error::kSuccess;\n}\n\nsize_t StfsContainerDevice::BlockToOffsetSTFS(uint64_t block_index) const {\n  // For every level there is a hash table\n  // Level 0: hash table of next 170 blocks\n  // Level 1: hash table of next 170 hash tables\n  // Level 2: hash table of next 170 level 1 hash tables\n  // And so on...\n  uint64_t base = kBlocksPerHashLevel[0];\n  uint64_t block = block_index;\n  for (uint32_t i = 0; i < 3; i++) {\n    block += ((block_index + base) / base) * blocks_per_hash_table_;\n    if (block_index < base) {\n      break;\n    }\n\n    base *= kBlocksPerHashLevel[0];\n  }\n\n  return xe::round_up(header_.header.header_size, kBlockSize) + (block << 12);\n}\n\nuint32_t StfsContainerDevice::BlockToHashBlockNumberSTFS(\n    uint32_t block_index, uint32_t hash_level) const {\n  uint32_t block = 0;\n  if (hash_level == 0) {\n    if (block_index < kBlocksPerHashLevel[0]) {\n      return 0;\n    }\n\n    block = (block_index / kBlocksPerHashLevel[0]) * block_step[0];\n    block +=\n        ((block_index / kBlocksPerHashLevel[1]) + 1) * blocks_per_hash_table_;\n\n    if (block_index < kBlocksPerHashLevel[1]) {\n      return block;\n    }\n\n    return block + blocks_per_hash_table_;\n  }\n\n  if (hash_level == 1) {\n    if (block_index < kBlocksPerHashLevel[1]) {\n      return block_step[0];\n    }\n\n    block = (block_index / kBlocksPerHashLevel[1]) * block_step[1];\n    return block + blocks_per_hash_table_;\n  }\n\n  // Level 2 is always at blockStep1\n  return block_step[1];\n}\n\nsize_t StfsContainerDevice::BlockToHashBlockOffsetSTFS(\n    uint32_t block_index, uint32_t hash_level) const {\n  uint64_t block = BlockToHashBlockNumberSTFS(block_index, hash_level);\n  return xe::round_up(header_.header.header_size, kBlockSize) + (block << 12);\n}\n\nconst StfsHashEntry* StfsContainerDevice::GetBlockHash(uint32_t block_index) {\n  auto& file = files_.at(0);\n\n  auto& descriptor = header_.metadata.volume_descriptor.stfs;\n\n  // Offset for selecting the secondary hash block, in packages that have them\n  uint32_t secondary_table_offset =\n      descriptor.flags.bits.root_active_index ? kBlockSize : 0;\n\n  auto hash_offset_lv0 = BlockToHashBlockOffsetSTFS(block_index, 0);\n  if (!cached_hash_tables_.count(hash_offset_lv0)) {\n    // If this is read_only_format then it doesn't contain secondary blocks, no\n    // need to check upper hash levels\n    if (descriptor.flags.bits.read_only_format) {\n      secondary_table_offset = 0;\n    } else {\n      // Not a read-only package, need to check each levels active index flag to\n      // see if we need to use secondary block or not\n\n      // Check level1 table if package has it\n      if (descriptor.total_block_count > kBlocksPerHashLevel[0]) {\n        auto hash_offset_lv1 = BlockToHashBlockOffsetSTFS(block_index, 1);\n\n        if (!cached_hash_tables_.count(hash_offset_lv1)) {\n          // Check level2 table if package has it\n          if (descriptor.total_block_count > kBlocksPerHashLevel[1]) {\n            auto hash_offset_lv2 = BlockToHashBlockOffsetSTFS(block_index, 2);\n\n            if (!cached_hash_tables_.count(hash_offset_lv2)) {\n              xe::filesystem::Seek(\n                  file, hash_offset_lv2 + secondary_table_offset, SEEK_SET);\n\n              StfsHashTable table_lv2;\n              if (fread(&table_lv2, sizeof(StfsHashTable), 1, file) != 1) {\n                XELOGE(\"GetBlockHash failed to read level2 hash table at 0x{X}\",\n                       hash_offset_lv2 + secondary_table_offset);\n                return nullptr;\n              }\n              cached_hash_tables_[hash_offset_lv2] = table_lv2;\n            }\n\n            auto record =\n                (block_index / kBlocksPerHashLevel[1]) % kBlocksPerHashLevel[0];\n            auto record_data =\n                &cached_hash_tables_[hash_offset_lv2].entries[record];\n            secondary_table_offset =\n                record_data->levelN_active_index() ? kBlockSize : 0;\n          }\n\n          xe::filesystem::Seek(file, hash_offset_lv1 + secondary_table_offset,\n                               SEEK_SET);\n\n          StfsHashTable table_lv1;\n          if (fread(&table_lv1, sizeof(StfsHashTable), 1, file) != 1) {\n            XELOGE(\"GetBlockHash failed to read level1 hash table at 0x{X}\",\n                   hash_offset_lv1 + secondary_table_offset);\n            return nullptr;\n          }\n          cached_hash_tables_[hash_offset_lv1] = table_lv1;\n        }\n\n        auto record =\n            (block_index / kBlocksPerHashLevel[0]) % kBlocksPerHashLevel[0];\n        auto record_data =\n            &cached_hash_tables_[hash_offset_lv1].entries[record];\n        secondary_table_offset =\n            record_data->levelN_active_index() ? kBlockSize : 0;\n      }\n    }\n\n    xe::filesystem::Seek(file, hash_offset_lv0 + secondary_table_offset,\n                         SEEK_SET);\n\n    StfsHashTable table_lv0;\n    if (fread(&table_lv0, sizeof(StfsHashTable), 1, file) != 1) {\n      XELOGE(\"GetBlockHash failed to read level0 hash table at 0x{X}\",\n             hash_offset_lv0 + secondary_table_offset);\n      return nullptr;\n    }\n    cached_hash_tables_[hash_offset_lv0] = table_lv0;\n  }\n\n  auto record = block_index % kBlocksPerHashLevel[0];\n  auto record_data = &cached_hash_tables_[hash_offset_lv0].entries[record];\n\n  return record_data;\n}\n\nXContentPackageType StfsContainerDevice::ReadMagic(\n    const std::filesystem::path& path) {\n  auto map = MappedMemory::Open(path, MappedMemory::Mode::kRead, 0, 4);\n  return XContentPackageType(xe::load_and_swap<uint32_t>(map->data()));\n}\n\nbool StfsContainerDevice::ResolveFromFolder(const std::filesystem::path& path) {\n  // Scan through folders until a file with magic is found\n  std::queue<filesystem::FileInfo> queue;\n\n  filesystem::FileInfo folder;\n  filesystem::GetInfo(host_path_, &folder);\n  queue.push(folder);\n\n  while (!queue.empty()) {\n    auto current_file = queue.front();\n    queue.pop();\n\n    if (current_file.type == filesystem::FileInfo::Type::kDirectory) {\n      auto path = current_file.path / current_file.name;\n      auto child_files = filesystem::ListFiles(path);\n      for (auto file : child_files) {\n        queue.push(file);\n      }\n    } else {\n      // Try to read the file's magic\n      auto path = current_file.path / current_file.name;\n      auto magic = ReadMagic(path);\n\n      if (magic == XContentPackageType::kCon ||\n          magic == XContentPackageType::kLive ||\n          magic == XContentPackageType::kPirs) {\n        host_path_ = current_file.path / current_file.name;\n        XELOGI(\"STFS Package found: {}\", xe::path_to_utf8(host_path_));\n        return true;\n      }\n    }\n  }\n\n  if (host_path_ == path) {\n    // Could not find a suitable container file\n    return false;\n  }\n  return true;\n}\n\n}  // namespace vfs\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/vfs/devices/stfs_container_device.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_VFS_DEVICES_STFS_CONTAINER_DEVICE_H_\n#define XENIA_VFS_DEVICES_STFS_CONTAINER_DEVICE_H_\n\n#include <map>\n#include <memory>\n#include <string>\n#include <unordered_map>\n\n#include \"xenia/base/math.h\"\n#include \"xenia/base/string_util.h\"\n#include \"xenia/kernel/util/xex2_info.h\"\n#include \"xenia/vfs/device.h\"\n#include \"xenia/vfs/devices/stfs_xbox.h\"\n\nnamespace xe {\nnamespace vfs {\n\n// https://free60project.github.io/wiki/STFS.html\n\nclass StfsContainerEntry;\n\nclass StfsContainerDevice : public Device {\n public:\n  const static uint32_t kBlockSize = 0x1000;\n\n  StfsContainerDevice(const std::string_view mount_path,\n                      const std::filesystem::path& host_path);\n  ~StfsContainerDevice() override;\n\n  bool Initialize() override;\n\n  bool is_read_only() const override {\n    return header_.metadata.volume_type != XContentVolumeType::kStfs ||\n           header_.metadata.volume_descriptor.stfs.flags.bits.read_only_format;\n  }\n\n  void Dump(StringBuffer* string_buffer) override;\n  Entry* ResolvePath(const std::string_view path) override;\n\n  const std::string& name() const override { return name_; }\n  uint32_t attributes() const override { return 0; }\n  uint32_t component_name_max_length() const override { return 40; }\n\n  uint32_t total_allocation_units() const override {\n    if (header_.metadata.volume_type == XContentVolumeType::kStfs) {\n      return header_.metadata.volume_descriptor.stfs.total_block_count;\n    }\n\n    return uint32_t(data_size() / sectors_per_allocation_unit() /\n                    bytes_per_sector());\n  }\n  uint32_t available_allocation_units() const override {\n    if (!is_read_only()) {\n      auto& descriptor = header_.metadata.volume_descriptor.stfs;\n      return kBlocksPerHashLevel[2] -\n             (descriptor.total_block_count - descriptor.free_block_count);\n    }\n    return 0;\n  }\n  uint32_t sectors_per_allocation_unit() const override { return 8; }\n  uint32_t bytes_per_sector() const override { return 0x200; }\n\n  size_t data_size() const {\n    if (header_.header.header_size) {\n      if (header_.metadata.volume_type == XContentVolumeType::kStfs) {\n        return header_.metadata.volume_descriptor.stfs.total_block_count *\n               kBlockSize;\n      }\n      return files_total_size_ -\n             xe::round_up(header_.header.header_size, kBlockSize);\n    }\n    return files_total_size_ - sizeof(StfsHeader);\n  }\n\n private:\n  const uint32_t kBlocksPerHashLevel[3] = {170, 28900, 4913000};\n  const uint32_t kEndOfChain = 0xFFFFFF;\n  const uint32_t kEntriesPerDirectoryBlock =\n      kBlockSize / sizeof(StfsDirectoryEntry);\n\n  enum class Error {\n    kSuccess = 0,\n    kErrorOutOfMemory = -1,\n    kErrorReadError = -10,\n    kErrorFileMismatch = -30,\n    kErrorDamagedFile = -31,\n    kErrorTooSmall = -32,\n  };\n\n  enum class SvodLayoutType {\n    kUnknown = 0x0,\n    kEnhancedGDF = 0x1,\n    kXSF = 0x2,\n    kSingleFile = 0x4,\n  };\n\n  XContentPackageType ReadMagic(const std::filesystem::path& path);\n  bool ResolveFromFolder(const std::filesystem::path& path);\n\n  Error OpenFiles();\n  void CloseFiles();\n\n  Error ReadHeaderAndVerify(FILE* header_file);\n\n  Error ReadSVOD();\n  Error ReadEntrySVOD(uint32_t sector, uint32_t ordinal,\n                      StfsContainerEntry* parent);\n  void BlockToOffsetSVOD(size_t sector, size_t* address, size_t* file_index);\n\n  Error ReadSTFS();\n  size_t BlockToOffsetSTFS(uint64_t block_index) const;\n  uint32_t BlockToHashBlockNumberSTFS(uint32_t block_index,\n                                      uint32_t hash_level) const;\n  size_t BlockToHashBlockOffsetSTFS(uint32_t block_index,\n                                    uint32_t hash_level) const;\n\n  const StfsHashEntry* GetBlockHash(uint32_t block_index);\n\n  std::string name_;\n  std::filesystem::path host_path_;\n\n  std::map<size_t, FILE*> files_;\n  size_t files_total_size_;\n\n  size_t svod_base_offset_;\n\n  std::unique_ptr<Entry> root_entry_;\n  StfsHeader header_;\n  SvodLayoutType svod_layout_;\n  uint32_t blocks_per_hash_table_;\n  uint32_t block_step[2];\n\n  std::unordered_map<size_t, StfsHashTable> cached_hash_tables_;\n};\n\n}  // namespace vfs\n}  // namespace xe\n\n#endif  // XENIA_VFS_DEVICES_STFS_CONTAINER_DEVICE_H_\n"
  },
  {
    "path": "src/xenia/vfs/devices/stfs_container_entry.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/vfs/devices/stfs_container_entry.h\"\n#include \"xenia/base/math.h\"\n#include \"xenia/vfs/devices/stfs_container_file.h\"\n\n#include <map>\n\nnamespace xe {\nnamespace vfs {\n\nStfsContainerEntry::StfsContainerEntry(Device* device, Entry* parent,\n                                       const std::string_view path,\n                                       MultiFileHandles* files)\n    : Entry(device, parent, path),\n      files_(files),\n      data_offset_(0),\n      data_size_(0),\n      block_(0) {}\n\nStfsContainerEntry::~StfsContainerEntry() = default;\n\nstd::unique_ptr<StfsContainerEntry> StfsContainerEntry::Create(\n    Device* device, Entry* parent, const std::string_view name,\n    MultiFileHandles* files) {\n  auto path = xe::utf8::join_guest_paths(parent->path(), name);\n  auto entry =\n      std::make_unique<StfsContainerEntry>(device, parent, path, files);\n\n  return std::move(entry);\n}\n\nX_STATUS StfsContainerEntry::Open(uint32_t desired_access, File** out_file) {\n  *out_file = new StfsContainerFile(desired_access, this);\n  return X_STATUS_SUCCESS;\n}\n\n}  // namespace vfs\n}  // namespace xe"
  },
  {
    "path": "src/xenia/vfs/devices/stfs_container_entry.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_VFS_DEVICES_STFS_CONTAINER_ENTRY_H_\n#define XENIA_VFS_DEVICES_STFS_CONTAINER_ENTRY_H_\n\n#include <map>\n#include <string>\n#include <vector>\n\n#include \"xenia/vfs/entry.h\"\n#include \"xenia/vfs/file.h\"\n\nnamespace xe {\nnamespace vfs {\ntypedef std::map<size_t, FILE*> MultiFileHandles;\n\nclass StfsContainerDevice;\n\nclass StfsContainerEntry : public Entry {\n public:\n  StfsContainerEntry(Device* device, Entry* parent, const std::string_view path,\n                     MultiFileHandles* files);\n  ~StfsContainerEntry() override;\n\n  static std::unique_ptr<StfsContainerEntry> Create(Device* device,\n                                                    Entry* parent,\n                                                    const std::string_view name,\n                                                    MultiFileHandles* files);\n\n  MultiFileHandles* files() const { return files_; }\n  size_t data_offset() const { return data_offset_; }\n  size_t data_size() const { return data_size_; }\n  size_t block() const { return block_; }\n\n  X_STATUS Open(uint32_t desired_access, File** out_file) override;\n\n  struct BlockRecord {\n    size_t file;\n    size_t offset;\n    size_t length;\n  };\n  const std::vector<BlockRecord>& block_list() const { return block_list_; }\n\n private:\n  friend class StfsContainerDevice;\n\n  MultiFileHandles* files_;\n  size_t data_offset_;\n  size_t data_size_;\n  size_t block_;\n  std::vector<BlockRecord> block_list_;\n};\n\n}  // namespace vfs\n}  // namespace xe\n\n#endif  // XENIA_VFS_DEVICES_STFS_CONTAINER_ENTRY_H_"
  },
  {
    "path": "src/xenia/vfs/devices/stfs_container_file.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/vfs/devices/stfs_container_file.h\"\n\n#include <algorithm>\n#include <cmath>\n\n#include \"xenia/base/math.h\"\n#include \"xenia/vfs/devices/stfs_container_entry.h\"\n\nnamespace xe {\nnamespace vfs {\n\nStfsContainerFile::StfsContainerFile(uint32_t file_access,\n                                     StfsContainerEntry* entry)\n    : File(file_access, entry), entry_(entry) {}\n\nStfsContainerFile::~StfsContainerFile() = default;\n\nvoid StfsContainerFile::Destroy() { delete this; }\n\nX_STATUS StfsContainerFile::ReadSync(void* buffer, size_t buffer_length,\n                                     size_t byte_offset,\n                                     size_t* out_bytes_read) {\n  if (byte_offset >= entry_->size()) {\n    return X_STATUS_END_OF_FILE;\n  }\n\n  size_t src_offset = 0;\n  uint8_t* p = reinterpret_cast<uint8_t*>(buffer);\n  size_t remaining_length =\n      std::min(buffer_length, entry_->size() - byte_offset);\n\n  *out_bytes_read = 0;\n  for (size_t i = 0; i < entry_->block_list().size(); i++) {\n    auto& record = entry_->block_list()[i];\n    if (src_offset + record.length <= byte_offset) {\n      // Doesn't begin in this region. Skip it.\n      src_offset += record.length;\n      continue;\n    }\n\n    size_t read_offset =\n        (byte_offset > src_offset) ? byte_offset - src_offset : 0;\n    size_t read_length =\n        std::min(record.length - read_offset, remaining_length);\n\n    auto& file = entry_->files()->at(record.file);\n    xe::filesystem::Seek(file, record.offset + read_offset, SEEK_SET);\n    auto num_read = fread(p, 1, read_length, file);\n\n    *out_bytes_read += num_read;\n    p += num_read;\n    src_offset += record.length;\n    remaining_length -= read_length;\n    if (remaining_length == 0) {\n      break;\n    }\n  }\n\n  return X_STATUS_SUCCESS;\n}\n\n}  // namespace vfs\n}  // namespace xe"
  },
  {
    "path": "src/xenia/vfs/devices/stfs_container_file.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2014 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_VFS_DEVICES_STFS_CONTAINER_FILE_H_\n#define XENIA_VFS_DEVICES_STFS_CONTAINER_FILE_H_\n\n#include \"xenia/vfs/file.h\"\n\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace vfs {\n\nclass StfsContainerEntry;\n\nclass StfsContainerFile : public File {\n public:\n  StfsContainerFile(uint32_t file_access, StfsContainerEntry* entry);\n  ~StfsContainerFile() override;\n\n  void Destroy() override;\n\n  X_STATUS ReadSync(void* buffer, size_t buffer_length, size_t byte_offset,\n                    size_t* out_bytes_read) override;\n  X_STATUS WriteSync(const void* buffer, size_t buffer_length,\n                     size_t byte_offset, size_t* out_bytes_written) override {\n    return X_STATUS_ACCESS_DENIED;\n  }\n  X_STATUS SetLength(size_t length) override { return X_STATUS_ACCESS_DENIED; }\n\n private:\n  StfsContainerEntry* entry_;\n};\n\n}  // namespace vfs\n}  // namespace xe\n\n#endif  // XENIA_VFS_DEVICES_STFS_CONTAINER_FILE_H_\n"
  },
  {
    "path": "src/xenia/vfs/devices/stfs_xbox.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_VFS_DEVICES_STFS_XBOX_H_\n#define XENIA_VFS_DEVICES_STFS_XBOX_H_\n\n#include <time.h>\n\n#include \"xenia/xbox.h\"\n#include \"xenia/base/string_util.h\"\n#include \"xenia/kernel/util/xex2_info.h\"\n\nnamespace xe {\nnamespace vfs {\n\n// Convert FAT timestamp to 100-nanosecond intervals since January 1, 1601 (UTC)\ninline uint64_t decode_fat_timestamp(const uint32_t date, const uint32_t time) {\n  struct tm tm = {0};\n  // 80 is the difference between 1980 (FAT) and 1900 (tm);\n  tm.tm_year = ((0xFE00 & date) >> 9) + 80;\n  tm.tm_mon = ((0x01E0 & date) >> 5) - 1;\n  tm.tm_mday = (0x001F & date) >> 0;\n  tm.tm_hour = (0xF800 & time) >> 11;\n  tm.tm_min = (0x07E0 & time) >> 5;\n  tm.tm_sec = (0x001F & time) << 1;  // the value stored in 2-seconds intervals\n  tm.tm_isdst = 0;\n\n#if XE_PLATFORM_WIN32\n  time_t timet = _mkgmtime(&tm);\n#else\n  time_t timet = timegm(&tm);\n#endif\n\n  if (timet == -1) {\n    return 0;\n  }\n  // 11644473600LL is a difference between 1970 and 1601\n  return (timet + 11644473600LL) * 10000000;\n}\n\n// Structs used for interchange between Xenia and actual Xbox360 kernel/XAM\n\ninline uint32_t load_uint24_be(const uint8_t* p) {\n  return (uint32_t(p[0]) << 16) | (uint32_t(p[1]) << 8) | uint32_t(p[2]);\n}\ninline uint32_t load_uint24_le(const uint8_t* p) {\n  return (uint32_t(p[2]) << 16) | (uint32_t(p[1]) << 8) | uint32_t(p[0]);\n}\ninline void store_uint24_le(uint8_t* p, uint32_t value) {\n  p[2] = uint8_t((value >> 16) & 0xFF);\n  p[1] = uint8_t((value >> 8) & 0xFF);\n  p[0] = uint8_t(value & 0xFF);\n}\n\nenum class XContentPackageType : uint32_t {\n  kCon = 0x434F4E20,\n  kPirs = 0x50495253,\n  kLive = 0x4C495645,\n};\n\nenum class XContentVolumeType : uint32_t {\n  kStfs = 0,\n  kSvod = 1,\n};\n\n/* STFS structures */\n#pragma pack(push, 1)\nstruct StfsVolumeDescriptor {\n  uint8_t descriptor_length;\n  uint8_t version;\n  union {\n    uint8_t as_byte;\n    struct {\n      uint8_t read_only_format : 1;  // if set, only uses a single backing-block\n                                     // per hash table (no resiliency),\n                                     // otherwise uses two\n      uint8_t root_active_index : 1;  // if set, uses secondary backing-block\n                                      // for the highest-level hash table\n\n      uint8_t directory_overallocated : 1;\n      uint8_t directory_index_bounds_valid : 1;\n    } bits;\n  } flags;\n  uint16_t file_table_block_count;\n  uint8_t file_table_block_number_raw[3];\n  uint8_t top_hash_table_hash[0x14];\n  be<uint32_t> total_block_count;\n  be<uint32_t> free_block_count;\n\n  uint32_t file_table_block_number() const {\n    return load_uint24_le(file_table_block_number_raw);\n  }\n\n  void set_file_table_block_number(uint32_t value) {\n    store_uint24_le(file_table_block_number_raw, value);\n  }\n\n  bool is_valid() const {\n    return descriptor_length == sizeof(StfsVolumeDescriptor);\n  }\n};\nstatic_assert_size(StfsVolumeDescriptor, 0x24);\n#pragma pack(pop)\n\nenum class StfsHashState : uint8_t {\n  kFree = 0,   // unallocated but doesn't exist in package (needs to expand)?\n  kFree2 = 1,  // unallocated but exists in package?\n  kInUse = 2,\n};\n\nstruct StfsHashEntry {\n  uint8_t sha1[0x14];\n\n  xe::be<uint32_t> info_raw;\n\n  uint32_t level0_next_block() const { return info_raw & 0xFFFFFF; }\n  void set_level0_next_block(uint32_t value) {\n    info_raw = (info_raw & ~0xFFFFFF) | (value & 0xFFFFFF);\n  }\n\n  StfsHashState level0_allocation_state() const {\n    return StfsHashState(uint8_t(((info_raw & 0xC0000000) >> 30) & 0xFF));\n  }\n  void set_level0_allocation_state(StfsHashState value) {\n    info_raw = (info_raw & ~0xC0000000) | (uint32_t(value) << 30);\n  }\n\n  uint32_t levelN_num_blocks_free() const { return info_raw & 0x7FFF; }\n  void set_levelN_num_blocks_free(uint32_t value) {\n    info_raw = (info_raw & ~0x7FFF) | (value & 0x7FFF);\n  }\n\n  uint32_t levelN_num_blocks_unk() const {\n    return ((info_raw & 0x3FFF8000) >> 15) & 0x7FFF;\n  }\n  void set_levelN_num_blocks_unk(uint32_t value) {\n    info_raw = (info_raw & ~0x3FFF8000) | ((value & 0x7FFF) << 15);\n  }\n\n  bool levelN_active_index() const { return (info_raw & 0x40000000) != 0; }\n  void set_levelN_active_index(bool value) {\n    info_raw = (info_raw & ~0x40000000) | (value ? 0x40000000 : 0);\n  }\n\n  bool levelN_writeable() const { return (info_raw & 0x80000000) != 0; }\n  void set_levelN_writeable(bool value) {\n    info_raw = (info_raw & ~0x80000000) | (value ? 0x80000000 : 0);\n  }\n};\nstatic_assert_size(StfsHashEntry, 0x18);\n\nstruct StfsHashTable {\n  StfsHashEntry entries[170];\n  xe::be<uint32_t> num_blocks;  // num L0 blocks covered by this table?\n  uint8_t padding[12];\n};\nstatic_assert_size(StfsHashTable, 0x1000);\n\nstruct StfsDirectoryEntry {\n  char name[40];\n\n  struct {\n    uint8_t name_length : 6;\n    uint8_t contiguous : 1;\n    uint8_t directory : 1;\n  } flags;\n\n  uint8_t valid_data_blocks_raw[3];\n  uint8_t allocated_data_blocks_raw[3];\n  uint8_t start_block_number_raw[3];\n\n  be<uint16_t> directory_index;\n\n  be<uint32_t> length;\n\n  be<uint16_t> create_date;\n  be<uint16_t> create_time;\n  be<uint16_t> modified_date;\n  be<uint16_t> modified_time;\n\n  uint32_t valid_data_blocks() const {\n    return load_uint24_le(valid_data_blocks_raw);\n  }\n\n  void set_valid_data_blocks(uint32_t value) {\n    store_uint24_le(valid_data_blocks_raw, value);\n  }\n\n  uint32_t allocated_data_blocks() const {\n    return load_uint24_le(allocated_data_blocks_raw);\n  }\n\n  void set_allocated_data_blocks(uint32_t value) {\n    store_uint24_le(allocated_data_blocks_raw, value);\n  }\n\n  uint32_t start_block_number() const {\n    return load_uint24_le(start_block_number_raw);\n  }\n\n  void set_start_block_number(uint32_t value) {\n    store_uint24_le(start_block_number_raw, value);\n  }\n};\nstatic_assert_size(StfsDirectoryEntry, 0x40);\n\nstruct StfsDirectoryBlock {\n  StfsDirectoryEntry entries[0x40];\n};\nstatic_assert_size(StfsDirectoryBlock, 0x1000);\n\n/* SVOD structures */\nstruct SvodDeviceDescriptor {\n  uint8_t descriptor_length;\n  uint8_t block_cache_element_count;\n  uint8_t worker_thread_processor;\n  uint8_t worker_thread_priority;\n  uint8_t first_fragment_hash_entry[0x14];\n  union {\n    uint8_t as_byte;\n    struct {\n      uint8_t must_be_zero_for_future_usage : 6;\n      uint8_t enhanced_gdf_layout : 1;\n      uint8_t zero_for_downlevel_clients : 1;\n    } bits;\n  } features;\n  uint8_t num_data_blocks_raw[3];\n  uint8_t start_data_block_raw[3];\n  uint8_t reserved[5];\n\n  uint32_t num_data_blocks() { return load_uint24_le(num_data_blocks_raw); }\n\n  uint32_t start_data_block() { return load_uint24_le(start_data_block_raw); }\n};\nstatic_assert_size(SvodDeviceDescriptor, 0x24);\n\n/* XContent structures */\nstruct XContentLicense {\n  be<uint64_t> licensee_id;\n  be<uint32_t> license_bits;\n  be<uint32_t> license_flags;\n};\nstatic_assert_size(XContentLicense, 0x10);\n\nstruct XContentMediaData {\n  uint8_t series_id[0x10];\n  uint8_t season_id[0x10];\n  be<uint16_t> season_number;\n  be<uint16_t> episode_number;\n};\nstatic_assert_size(XContentMediaData, 0x24);\n\nstruct XContentAvatarAssetData {\n  be<uint32_t> sub_category;\n  be<uint32_t> colorizable;\n  uint8_t asset_id[0x10];\n  uint8_t skeleton_version_mask;\n  uint8_t reserved[0xB];\n};\nstatic_assert_size(XContentAvatarAssetData, 0x24);\n\nstruct XContentAttributes {\n  uint8_t profile_transfer : 1;\n  uint8_t device_transfer : 1;\n  uint8_t move_only_transfer : 1;\n  uint8_t kinect_enabled : 1;\n  uint8_t disable_network_storage : 1;\n  uint8_t deep_link_supported : 1;\n  uint8_t reserved : 2;\n};\nstatic_assert_size(XContentAttributes, 1);\n\n#pragma pack(push, 1)\nstruct XContentMetadata {\n  static const uint32_t kThumbLengthV1 = 0x4000;\n  static const uint32_t kThumbLengthV2 = 0x3D00;\n\n  static const uint32_t kNumLanguagesV1 = 9;\n  // metadata_version 2 adds 3 languages inside thumbnail/title_thumbnail space\n  static const uint32_t kNumLanguagesV2 = 12;\n\n  be<XContentType> content_type;\n  be<uint32_t> metadata_version;\n  be<uint64_t> content_size;\n  xex2_opt_execution_info execution_info;\n  uint8_t console_id[5];\n  be<uint64_t> profile_id;\n  union {\n    StfsVolumeDescriptor stfs;\n    SvodDeviceDescriptor svod;\n  } volume_descriptor;\n  be<uint32_t> data_file_count;\n  be<uint64_t> data_file_size;\n  be<XContentVolumeType> volume_type;\n  be<uint64_t> online_creator;\n  be<uint32_t> category;\n  uint8_t reserved2[0x20];\n  union {\n    XContentMediaData media_data;\n    XContentAvatarAssetData avatar_asset_data;\n  } metadata_v2;\n  uint8_t device_id[0x14];\n  union {\n    be<uint16_t> uint[kNumLanguagesV1][128];\n    char16_t chars[kNumLanguagesV1][128];\n  } display_name_raw;\n  union {\n    be<uint16_t> uint[kNumLanguagesV1][128];\n    char16_t chars[kNumLanguagesV1][128];\n  } description_raw;\n  union {\n    be<uint16_t> uint[64];\n    char16_t chars[64];\n  } publisher_raw;\n  union {\n    be<uint16_t> uint[64];\n    char16_t chars[64];\n  } title_name_raw;\n  union {\n    uint8_t as_byte;\n    XContentAttributes bits;\n  } flags;\n  be<uint32_t> thumbnail_size;\n  be<uint32_t> title_thumbnail_size;\n  uint8_t thumbnail[kThumbLengthV2];\n  union {\n    be<uint16_t> uint[kNumLanguagesV2 - kNumLanguagesV1][128];\n    char16_t chars[kNumLanguagesV2 - kNumLanguagesV1][128];\n  } display_name_ex_raw;\n  uint8_t title_thumbnail[kThumbLengthV2];\n  union {\n    be<uint16_t> uint[kNumLanguagesV2 - kNumLanguagesV1][128];\n    char16_t chars[kNumLanguagesV2 - kNumLanguagesV1][128];\n  } description_ex_raw;\n\n  std::u16string display_name(XLanguage language) const {\n    uint32_t lang_id = uint32_t(language) - 1;\n\n    if (lang_id >= kNumLanguagesV2) {\n      assert_always();\n      // no room for this lang, read from english slot..\n      lang_id = uint32_t(XLanguage::kEnglish) - 1;\n    }\n\n    const be<uint16_t>* str = 0;\n    if (lang_id >= 0 && lang_id < kNumLanguagesV1) {\n      str = display_name_raw.uint[lang_id];\n    } else if (lang_id >= kNumLanguagesV1 && lang_id < kNumLanguagesV2 &&\n               metadata_version >= 2) {\n      str = display_name_ex_raw.uint[lang_id - kNumLanguagesV1];\n    }\n\n    if (!str) {\n      // Invalid language ID?\n      assert_always();\n      return u\"\";\n    }\n\n    return load_and_swap<std::u16string>(str);\n  }\n\n  std::u16string description(XLanguage language) const {\n    uint32_t lang_id = uint32_t(language) - 1;\n\n    if (lang_id >= kNumLanguagesV2) {\n      assert_always();\n      // no room for this lang, read from english slot..\n      lang_id = uint32_t(XLanguage::kEnglish) - 1;\n    }\n\n    const be<uint16_t>* str = 0;\n    if (lang_id >= 0 && lang_id < kNumLanguagesV1) {\n      str = description_raw.uint[lang_id];\n    } else if (lang_id >= kNumLanguagesV1 && lang_id < kNumLanguagesV2 &&\n               metadata_version >= 2) {\n      str = description_ex_raw.uint[lang_id - kNumLanguagesV1];\n    }\n\n    if (!str) {\n      // Invalid language ID?\n      assert_always();\n      return u\"\";\n    }\n\n    return load_and_swap<std::u16string>(str);\n  }\n\n  std::u16string publisher() const {\n    return load_and_swap<std::u16string>(publisher_raw.uint);\n  }\n\n  std::u16string title_name() const {\n    return load_and_swap<std::u16string>(title_name_raw.uint);\n  }\n\n  bool set_display_name(XLanguage language, const std::u16string_view value) {\n    uint32_t lang_id = uint32_t(language) - 1;\n\n    if (lang_id >= kNumLanguagesV2) {\n      assert_always();\n      // no room for this lang, store in english slot..\n      lang_id = uint32_t(XLanguage::kEnglish) - 1;\n    }\n\n    char16_t* str = 0;\n    if (lang_id >= 0 && lang_id < kNumLanguagesV1) {\n      str = display_name_raw.chars[lang_id];\n    } else if (lang_id >= kNumLanguagesV1 && lang_id < kNumLanguagesV2 &&\n               metadata_version >= 2) {\n      str = display_name_ex_raw.chars[lang_id - kNumLanguagesV1];\n    }\n\n    if (!str) {\n      // Invalid language ID?\n      assert_always();\n      return false;\n    }\n\n    string_util::copy_and_swap_truncating(str, value,\n                                          countof(display_name_raw.chars[0]));\n    return true;\n  }\n\n  bool set_description(XLanguage language, const std::u16string_view value) {\n    uint32_t lang_id = uint32_t(language) - 1;\n\n    if (lang_id >= kNumLanguagesV2) {\n      assert_always();\n      // no room for this lang, store in english slot..\n      lang_id = uint32_t(XLanguage::kEnglish) - 1;\n    }\n\n    char16_t* str = 0;\n    if (lang_id >= 0 && lang_id < kNumLanguagesV1) {\n      str = description_raw.chars[lang_id];\n    } else if (lang_id >= kNumLanguagesV1 && lang_id < kNumLanguagesV2 &&\n               metadata_version >= 2) {\n      str = description_ex_raw.chars[lang_id - kNumLanguagesV1];\n    }\n\n    if (!str) {\n      // Invalid language ID?\n      assert_always();\n      return false;\n    }\n\n    string_util::copy_and_swap_truncating(str, value,\n                                          countof(description_raw.chars[0]));\n    return true;\n  }\n\n  void set_publisher(const std::u16string_view value) {\n    string_util::copy_and_swap_truncating(publisher_raw.chars, value,\n                                          countof(publisher_raw.chars));\n  }\n\n  void set_title_name(const std::u16string_view value) {\n    string_util::copy_and_swap_truncating(title_name_raw.chars, value,\n                                          countof(title_name_raw.chars));\n  }\n};\nstatic_assert_size(XContentMetadata, 0x93D6);\n\nstruct XContentHeader {\n  be<XContentPackageType> magic;\n  uint8_t signature[0x228];\n  XContentLicense licenses[0x10];\n  uint8_t content_id[0x14];\n  be<uint32_t> header_size;\n\n  bool is_magic_valid() const {\n    return magic == XContentPackageType::kCon ||\n           magic == XContentPackageType::kLive ||\n           magic == XContentPackageType::kPirs;\n  }\n};\nstatic_assert_size(XContentHeader, 0x344);\n#pragma pack(pop)\n\nstruct StfsHeader {\n  XContentHeader header;\n  XContentMetadata metadata;\n  // TODO: title/system updates contain more data after XContentMetadata, seems\n  // to affect header.header_size\n};\nstatic_assert_size(StfsHeader, 0x971A);\n\n}  // namespace vfs\n}  // namespace xe\n\n#endif  // XENIA_VFS_DEVICES_STFS_XBOX_H_\n"
  },
  {
    "path": "src/xenia/vfs/entry.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/vfs/entry.h\"\n\n#include \"xenia/base/filesystem.h\"\n#include \"xenia/base/string.h\"\n#include \"xenia/vfs/device.h\"\n\nnamespace xe {\nnamespace vfs {\n\nEntry::Entry(Device* device, Entry* parent, const std::string_view path)\n    : device_(device),\n      parent_(parent),\n      path_(path),\n      attributes_(0),\n      size_(0),\n      allocation_size_(0),\n      create_timestamp_(0),\n      access_timestamp_(0),\n      write_timestamp_(0) {\n  assert_not_null(device);\n  absolute_path_ = xe::utf8::join_guest_paths(device->mount_path(), path);\n  name_ = xe::utf8::find_name_from_guest_path(path);\n}\n\nEntry::~Entry() = default;\n\nvoid Entry::Dump(xe::StringBuffer* string_buffer, int indent) {\n  for (int i = 0; i < indent; ++i) {\n    string_buffer->Append(' ');\n  }\n  string_buffer->Append(name());\n  string_buffer->Append('\\n');\n  for (auto& child : children_) {\n    child->Dump(string_buffer, indent + 2);\n  }\n}\n\nbool Entry::is_read_only() const { return device_->is_read_only(); }\n\nEntry* Entry::GetChild(const std::string_view name) {\n  auto global_lock = global_critical_region_.Acquire();\n  auto it = std::find_if(children_.cbegin(), children_.cend(),\n                         [&](const auto& child) {\n                           return xe::utf8::equal_case(child->name(), name);\n                         });\n  if (it == children_.cend()) {\n    return nullptr;\n  }\n  return (*it).get();\n}\n\nEntry* Entry::ResolvePath(const std::string_view path) {\n  // Walk the path, one separator at a time.\n  Entry* entry = this;\n  for (auto& part : xe::utf8::split_path(path)) {\n    entry = entry->GetChild(part);\n    if (!entry) {\n      // Not found.\n      return nullptr;\n    }\n  }\n  return entry;\n}\n\nEntry* Entry::IterateChildren(const xe::filesystem::WildcardEngine& engine,\n                              size_t* current_index) {\n  auto global_lock = global_critical_region_.Acquire();\n  while (*current_index < children_.size()) {\n    auto& child = children_[*current_index];\n    *current_index = *current_index + 1;\n    if (engine.Match(child->name())) {\n      return child.get();\n    }\n  }\n  return nullptr;\n}\n\nEntry* Entry::CreateEntry(const std::string_view name, uint32_t attributes) {\n  auto global_lock = global_critical_region_.Acquire();\n  if (is_read_only()) {\n    return nullptr;\n  }\n  if (GetChild(name)) {\n    // Already exists.\n    return nullptr;\n  }\n  auto entry = CreateEntryInternal(name, attributes);\n  if (!entry) {\n    return nullptr;\n  }\n  children_.push_back(std::move(entry));\n  // TODO(benvanik): resort? would break iteration?\n  Touch();\n  return children_.back().get();\n}\n\nbool Entry::Delete(Entry* entry) {\n  auto global_lock = global_critical_region_.Acquire();\n  if (is_read_only()) {\n    return false;\n  }\n  if (entry->parent() != this) {\n    return false;\n  }\n  if (!DeleteEntryInternal(entry)) {\n    return false;\n  }\n  for (auto it = children_.begin(); it != children_.end(); ++it) {\n    if (it->get() == entry) {\n      children_.erase(it);\n      break;\n    }\n  }\n  Touch();\n  return true;\n}\n\nbool Entry::Delete() {\n  assert_not_null(parent_);\n  return parent_->Delete(this);\n}\n\nvoid Entry::Touch() {\n  // TODO(benvanik): update timestamps.\n}\n\n}  // namespace vfs\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/vfs/entry.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_VFS_ENTRY_H_\n#define XENIA_VFS_ENTRY_H_\n\n#include <memory>\n#include <string>\n#include <vector>\n\n#include \"xenia/base/filesystem.h\"\n#include \"xenia/base/filesystem_wildcard.h\"\n#include \"xenia/base/mapped_memory.h\"\n#include \"xenia/base/mutex.h\"\n#include \"xenia/base/string_buffer.h\"\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace kernel {\nclass KernelState;\nclass XFile;\n}  // namespace kernel\n}  // namespace xe\n\nnamespace xe {\nnamespace vfs {\n\nclass Device;\nclass File;\n\n// Matches https://source.winehq.org/source/include/winternl.h#1591.\nenum class FileAction {\n  kSuperseded = 0,\n  kOpened = 1,\n  kCreated = 2,\n  kOverwritten = 3,\n  kExists = 4,\n  kDoesNotExist = 5,\n};\n\nenum class FileDisposition {\n  // If exist replace, else create.\n  kSuperscede = 0,\n  // If exist open, else error.\n  kOpen = 1,\n  // If exist error, else create.\n  kCreate = 2,\n  // If exist open, else create.\n  kOpenIf = 3,\n  // If exist open and overwrite, else error.\n  kOverwrite = 4,\n  // If exist open and overwrite, else create.\n  kOverwriteIf = 5,\n};\n\n// Reuse xe::filesystem definition.\nusing FileAccess = xe::filesystem::FileAccess;\n\nenum FileAttributeFlags : uint32_t {\n  kFileAttributeNone = 0x0000,\n  kFileAttributeReadOnly = 0x0001,\n  kFileAttributeHidden = 0x0002,\n  kFileAttributeSystem = 0x0004,\n  kFileAttributeDirectory = 0x0010,\n  kFileAttributeArchive = 0x0020,\n  kFileAttributeDevice = 0x0040,\n  kFileAttributeNormal = 0x0080,\n  kFileAttributeTemporary = 0x0100,\n  kFileAttributeCompressed = 0x0800,\n  kFileAttributeEncrypted = 0x4000,\n};\n\nclass Entry {\n public:\n  virtual ~Entry();\n\n  void Dump(xe::StringBuffer* string_buffer, int indent);\n\n  Device* device() const { return device_; }\n  Entry* parent() const { return parent_; }\n  const std::string& path() const { return path_; }\n  const std::string& absolute_path() const { return absolute_path_; }\n  const std::string& name() const { return name_; }\n  uint32_t attributes() const { return attributes_; }\n  size_t size() const { return size_; }\n  size_t allocation_size() const { return allocation_size_; }\n  uint64_t create_timestamp() const { return create_timestamp_; }\n  uint64_t access_timestamp() const { return access_timestamp_; }\n  uint64_t write_timestamp() const { return write_timestamp_; }\n\n  bool is_read_only() const;\n\n  Entry* GetChild(const std::string_view name);\n  Entry* ResolvePath(const std::string_view path);\n\n  const std::vector<std::unique_ptr<Entry>>& children() const {\n    return children_;\n  }\n  size_t child_count() const { return children_.size(); }\n  Entry* IterateChildren(const xe::filesystem::WildcardEngine& engine,\n                         size_t* current_index);\n\n  Entry* CreateEntry(const std::string_view name, uint32_t attributes);\n  bool Delete(Entry* entry);\n  bool Delete();\n  void Touch();\n\n  // If successful, out_file points to a new file. When finished, call\n  // file->Destroy()\n  virtual X_STATUS Open(uint32_t desired_access, File** out_file) = 0;\n\n  virtual bool can_map() const { return false; }\n  virtual std::unique_ptr<MappedMemory> OpenMapped(MappedMemory::Mode mode,\n                                                   size_t offset = 0,\n                                                   size_t length = 0) {\n    return nullptr;\n  }\n  virtual void update() { return; }\n\n protected:\n  Entry(Device* device, Entry* parent, const std::string_view path);\n\n  virtual std::unique_ptr<Entry> CreateEntryInternal(\n      const std::string_view name, uint32_t attributes) {\n    return nullptr;\n  }\n  virtual bool DeleteEntryInternal(Entry* entry) { return false; }\n\n  xe::global_critical_region global_critical_region_;\n  Device* device_;\n  Entry* parent_;\n  std::string path_;\n  std::string absolute_path_;\n  std::string name_;\n  uint32_t attributes_;  // FileAttributeFlags\n  size_t size_;\n  size_t allocation_size_;\n  uint64_t create_timestamp_;\n  uint64_t access_timestamp_;\n  uint64_t write_timestamp_;\n  std::vector<std::unique_ptr<Entry>> children_;\n};\n\n}  // namespace vfs\n}  // namespace xe\n\n#endif  // XENIA_VFS_ENTRY_H_\n"
  },
  {
    "path": "src/xenia/vfs/file.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2015 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_VFS_FILE_H_\n#define XENIA_VFS_FILE_H_\n\n#include <cstdint>\n\n#include \"xenia/xbox.h\"\n\nnamespace xe {\nnamespace vfs {\n\nclass Entry;\n\nclass File {\n public:\n  File(uint32_t file_access, Entry* entry)\n      : file_access_(file_access), entry_(entry) {}\n  virtual ~File() = default;\n\n  virtual void Destroy() = 0;\n\n  virtual X_STATUS ReadSync(void* buffer, size_t buffer_length,\n                            size_t byte_offset, size_t* out_bytes_read) = 0;\n  virtual X_STATUS WriteSync(const void* buffer, size_t buffer_length,\n                             size_t byte_offset, size_t* out_bytes_written) = 0;\n\n  // TODO: Parameters\n  virtual X_STATUS ReadAsync(void* buffer, size_t buffer_length,\n                             size_t byte_offset, size_t* out_bytes_read) {\n    return X_STATUS_NOT_IMPLEMENTED;\n  }\n\n  // TODO: Parameters\n  virtual X_STATUS WriteAsync(const void* buffer, size_t buffer_length,\n                              size_t byte_offset, size_t* out_bytes_written) {\n    return X_STATUS_NOT_IMPLEMENTED;\n  }\n\n  virtual X_STATUS SetLength(size_t length) { return X_STATUS_NOT_IMPLEMENTED; }\n\n  // xe::filesystem::FileAccess\n  uint32_t file_access() const { return file_access_; }\n  const Entry* entry() const { return entry_; }\n  Entry* entry() { return entry_; }\n\n protected:\n  // xe::filesystem::FileAccess\n  uint32_t file_access_ = 0;\n  Entry* entry_ = nullptr;\n};\n\n}  // namespace vfs\n}  // namespace xe\n\n#endif  // XENIA_VFS_FILE_H_"
  },
  {
    "path": "src/xenia/vfs/premake5.lua",
    "content": "project_root = \"../../..\"\ninclude(project_root..\"/tools/build\")\n\ngroup(\"src\")\nproject(\"xenia-vfs\")\n  uuid(\"395c8abd-4dc9-46ed-af7a-c2b9b68a3a98\")\n  kind(\"StaticLib\")\n  language(\"C++\")\n  links({\n    \"xenia-base\",\n  })\n  defines({\n  })\n  recursive_platform_files()\n  removefiles({\"vfs_dump.cc\"})\n\nproject(\"xenia-vfs-dump\")\n  uuid(\"2EF270C7-41A8-4D0E-ACC5-59693A9CCE32\")\n  kind(\"ConsoleApp\")\n  language(\"C++\")\n  links({\n    \"fmt\",\n    \"xenia-base\",\n    \"xenia-vfs\",\n  })\n  defines({})\n\n  files({\n    \"vfs_dump.cc\",\n    project_root..\"/src/xenia/base/console_app_main_\"..platform_suffix..\".cc\",\n  })\n  resincludedirs({\n    project_root,\n  })\ninclude(\"testing\")\n\n"
  },
  {
    "path": "src/xenia/vfs/testing/premake5.lua",
    "content": "project_root = \"../../../..\"\ninclude(project_root..\"/tools/build\")\n\ntest_suite(\"xenia-vfs-tests\", project_root, \".\", {\n  links = {\n    \"xenia-vfs\",\n  },\n})\n"
  },
  {
    "path": "src/xenia/vfs/testing/vfs_test.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2023 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/vfs/devices/stfs_xbox.h\"\n\n#include \"third_party/catch/include/catch.hpp\"\n\nnamespace xe::vfs::test {\n\nTEST_CASE(\"STFS Decode date and time\", \"[stfs_decode]\") {\n  SECTION(\"10 June 2022 19:46:00 UTC - Decode\") {\n    const uint16_t date = 0x54CA;\n    const uint16_t time = 0x9DBD;\n    const uint64_t result = 132993639580000000;\n\n    const uint64_t timestamp = decode_fat_timestamp(date, time);\n\n    REQUIRE(timestamp == result);\n  }\n}\n\n}  // namespace xe::vfs::test\n"
  },
  {
    "path": "src/xenia/vfs/vfs_dump.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include <queue>\n#include <string>\n#include <vector>\n\n#include \"xenia/base/console_app_main.h\"\n#include \"xenia/base/cvar.h\"\n#include \"xenia/base/literals.h\"\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/math.h\"\n\n#include \"xenia/vfs/devices/stfs_container_device.h\"\n#include \"xenia/vfs/file.h\"\n\nnamespace xe {\nnamespace vfs {\n\nusing namespace xe::literals;\n\nDEFINE_transient_path(source, \"\", \"Specifies the file to dump from.\",\n                      \"General\");\n\nDEFINE_transient_path(dump_path, \"\",\n                      \"Specifies the directory to dump files to.\", \"General\");\n\nint vfs_dump_main(const std::vector<std::string>& args) {\n  if (cvars::source.empty() || cvars::dump_path.empty()) {\n    XELOGE(\"Usage: {} [source] [dump_path]\", xe::path_to_utf8(args[0]));\n    return 1;\n  }\n\n  std::filesystem::path base_path = cvars::dump_path;\n  std::unique_ptr<vfs::Device> device;\n\n  // TODO: Flags specifying the type of device.\n  device = std::make_unique<vfs::StfsContainerDevice>(\"\", cvars::source);\n  if (!device->Initialize()) {\n    XELOGE(\"Failed to initialize device\");\n    return 1;\n  }\n\n  // Run through all the files, breadth-first style.\n  std::queue<vfs::Entry*> queue;\n  auto root = device->ResolvePath(\"/\");\n  queue.push(root);\n\n  // Allocate a buffer when needed.\n  size_t buffer_size = 0;\n  uint8_t* buffer = nullptr;\n\n  while (!queue.empty()) {\n    auto entry = queue.front();\n    queue.pop();\n    for (auto& entry : entry->children()) {\n      queue.push(entry.get());\n    }\n\n    XELOGI(\"{}\", entry->path());\n    auto dest_name = base_path / xe::to_path(entry->path());\n    if (entry->attributes() & kFileAttributeDirectory) {\n      std::filesystem::create_directories(dest_name);\n      continue;\n    }\n\n    vfs::File* in_file = nullptr;\n    if (entry->Open(FileAccess::kFileReadData, &in_file) != X_STATUS_SUCCESS) {\n      continue;\n    }\n\n    auto file = xe::filesystem::OpenFile(dest_name, \"wb\");\n    if (!file) {\n      in_file->Destroy();\n      continue;\n    }\n\n    if (entry->can_map()) {\n      auto map = entry->OpenMapped(xe::MappedMemory::Mode::kRead);\n      fwrite(map->data(), map->size(), 1, file);\n      map->Close();\n    } else {\n      // Can't map the file into memory. Read it into a temporary buffer.\n      if (!buffer || entry->size() > buffer_size) {\n        // Resize the buffer.\n        if (buffer) {\n          delete[] buffer;\n        }\n\n        // Allocate a buffer rounded up to the nearest 512MB.\n        buffer_size = xe::round_up(entry->size(), 512_MiB);\n        buffer = new uint8_t[buffer_size];\n      }\n\n      size_t bytes_read = 0;\n      in_file->ReadSync(buffer, entry->size(), 0, &bytes_read);\n      fwrite(buffer, bytes_read, 1, file);\n    }\n\n    fclose(file);\n    in_file->Destroy();\n  }\n\n  if (buffer) {\n    delete[] buffer;\n  }\n\n  return 0;\n}\n\n}  // namespace vfs\n}  // namespace xe\n\nXE_DEFINE_CONSOLE_APP(\"xenia-vfs-dump\", xe::vfs::vfs_dump_main,\n                      \"[source] [dump_path]\", \"source\", \"dump_path\");\n"
  },
  {
    "path": "src/xenia/vfs/virtual_file_system.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include \"xenia/vfs/virtual_file_system.h\"\n\n#include \"xenia/base/logging.h\"\n#include \"xenia/base/string.h\"\n#include \"xenia/kernel/xfile.h\"\n\nnamespace xe {\nnamespace vfs {\n\nVirtualFileSystem::VirtualFileSystem() {}\n\nVirtualFileSystem::~VirtualFileSystem() {\n  // Delete all devices.\n  // This will explode if anyone is still using data from them.\n  devices_.clear();\n  symlinks_.clear();\n}\n\nbool VirtualFileSystem::RegisterDevice(std::unique_ptr<Device> device) {\n  auto global_lock = global_critical_region_.Acquire();\n  devices_.emplace_back(std::move(device));\n  return true;\n}\n\nbool VirtualFileSystem::UnregisterDevice(const std::string_view path) {\n  auto global_lock = global_critical_region_.Acquire();\n  for (auto it = devices_.begin(); it != devices_.end(); ++it) {\n    if ((*it)->mount_path() == path) {\n      XELOGD(\"Unregistered device: {}\", (*it)->mount_path());\n      devices_.erase(it);\n      return true;\n    }\n  }\n  return false;\n}\n\nbool VirtualFileSystem::RegisterSymbolicLink(const std::string_view path,\n                                             const std::string_view target) {\n  auto global_lock = global_critical_region_.Acquire();\n  symlinks_.insert({std::string(path), std::string(target)});\n  XELOGD(\"Registered symbolic link: {} => {}\", path, target);\n\n  return true;\n}\n\nbool VirtualFileSystem::UnregisterSymbolicLink(const std::string_view path) {\n  auto global_lock = global_critical_region_.Acquire();\n  auto it = std::find_if(\n      symlinks_.cbegin(), symlinks_.cend(),\n      [&](const auto& s) { return xe::utf8::equal_case(path, s.first); });\n  if (it == symlinks_.end()) {\n    return false;\n  }\n  XELOGD(\"Unregistered symbolic link: {} => {}\", it->first, it->second);\n\n  symlinks_.erase(it);\n  return true;\n}\n\nbool VirtualFileSystem::FindSymbolicLink(const std::string_view path,\n                                         std::string& target) {\n  auto it = std::find_if(\n      symlinks_.cbegin(), symlinks_.cend(),\n      [&](const auto& s) { return xe::utf8::starts_with_case(path, s.first); });\n  if (it == symlinks_.cend()) {\n    return false;\n  }\n  target = (*it).second;\n  return true;\n}\n\nbool VirtualFileSystem::ResolveSymbolicLink(const std::string_view path,\n                                            std::string& result) {\n  result = path;\n  bool was_resolved = false;\n  while (true) {\n    auto it =\n        std::find_if(symlinks_.cbegin(), symlinks_.cend(), [&](const auto& s) {\n          return xe::utf8::starts_with_case(result, s.first);\n        });\n    if (it == symlinks_.cend()) {\n      break;\n    }\n    // Found symlink!\n    auto target_path = (*it).second;\n    auto relative_path = result.substr((*it).first.size());\n    result = target_path + relative_path;\n    was_resolved = true;\n  }\n  return was_resolved;\n}\n\nEntry* VirtualFileSystem::ResolvePath(const std::string_view path) {\n  auto global_lock = global_critical_region_.Acquire();\n\n  // Resolve relative paths\n  auto normalized_path(xe::utf8::canonicalize_guest_path(path));\n\n  // Resolve symlinks.\n  std::string resolved_path;\n  if (ResolveSymbolicLink(normalized_path, resolved_path)) {\n    normalized_path = resolved_path;\n  }\n\n  // Find the device.\n  auto it =\n      std::find_if(devices_.cbegin(), devices_.cend(), [&](const auto& d) {\n        return xe::utf8::starts_with(normalized_path, d->mount_path());\n      });\n  if (it == devices_.cend()) {\n    // Supress logging the error for ShaderDumpxe:\\CompareBackEnds as this is\n    // not an actual problem nor something we care about.\n    if (path != \"ShaderDumpxe:\\\\CompareBackEnds\") {\n      XELOGE(\"ResolvePath({}) failed - device not found\", path);\n    }\n    return nullptr;\n  }\n\n  const auto& device = *it;\n  auto relative_path = normalized_path.substr(device->mount_path().size());\n  return device->ResolvePath(relative_path);\n}\n\nEntry* VirtualFileSystem::CreatePath(const std::string_view path,\n                                     uint32_t attributes) {\n  // Create all required directories recursively.\n  auto path_parts = xe::utf8::split_path(path);\n  if (path_parts.empty()) {\n    return nullptr;\n  }\n  auto partial_path = std::string(path_parts[0]);\n  auto partial_entry = ResolvePath(partial_path);\n  if (!partial_entry) {\n    return nullptr;\n  }\n  auto parent_entry = partial_entry;\n  for (size_t i = 1; i < path_parts.size() - 1; ++i) {\n    partial_path = xe::utf8::join_guest_paths(partial_path, path_parts[i]);\n    auto child_entry = ResolvePath(partial_path);\n    if (!child_entry) {\n      child_entry =\n          parent_entry->CreateEntry(path_parts[i], kFileAttributeDirectory);\n    }\n    if (!child_entry) {\n      return nullptr;\n    }\n    parent_entry = child_entry;\n  }\n  return parent_entry->CreateEntry(path_parts[path_parts.size() - 1],\n                                   attributes);\n}\n\nbool VirtualFileSystem::DeletePath(const std::string_view path) {\n  auto entry = ResolvePath(path);\n  if (!entry) {\n    return false;\n  }\n  auto parent = entry->parent();\n  if (!parent) {\n    // Can't delete root.\n    return false;\n  }\n  return parent->Delete(entry);\n}\n\nX_STATUS VirtualFileSystem::OpenFile(Entry* root_entry,\n                                     const std::string_view path,\n                                     FileDisposition creation_disposition,\n                                     uint32_t desired_access, bool is_directory,\n                                     bool is_non_directory, File** out_file,\n                                     FileAction* out_action) {\n  // TODO(gibbed): should 'is_directory' remain as a bool or should it be\n  // flipped to a generic FileAttributeFlags?\n\n  // Cleanup access.\n  if (desired_access & FileAccess::kGenericRead) {\n    desired_access |= FileAccess::kFileReadData;\n  }\n  if (desired_access & FileAccess::kGenericWrite) {\n    desired_access |= FileAccess::kFileWriteData;\n  }\n  if (desired_access & FileAccess::kGenericAll) {\n    desired_access |= FileAccess::kFileReadData | FileAccess::kFileWriteData;\n  }\n\n  // Lookup host device/parent path.\n  // If no device or parent, fail.\n  Entry* parent_entry = nullptr;\n  Entry* entry = nullptr;\n\n  auto base_path = xe::utf8::find_base_guest_path(path);\n  if (!base_path.empty()) {\n    parent_entry = !root_entry ? ResolvePath(base_path)\n                               : root_entry->ResolvePath(base_path);\n    if (!parent_entry) {\n      *out_action = FileAction::kDoesNotExist;\n      return X_STATUS_NO_SUCH_FILE;\n    }\n\n    auto file_name = xe::utf8::find_name_from_guest_path(path);\n    entry = parent_entry->GetChild(file_name);\n  } else {\n    entry = !root_entry ? ResolvePath(path) : root_entry->GetChild(path);\n  }\n\n  if (entry) {\n    if (entry->attributes() & kFileAttributeDirectory && is_non_directory) {\n      return X_STATUS_FILE_IS_A_DIRECTORY;\n    }\n  }\n\n  // Check if exists (if we need it to), or that it doesn't (if it shouldn't).\n  switch (creation_disposition) {\n    case FileDisposition::kOpen:\n    case FileDisposition::kOverwrite:\n      // Must exist.\n      if (!entry) {\n        *out_action = FileAction::kDoesNotExist;\n        return X_STATUS_NO_SUCH_FILE;\n      }\n      break;\n    case FileDisposition::kCreate:\n      // Must not exist.\n      if (entry) {\n        *out_action = FileAction::kExists;\n        return X_STATUS_OBJECT_NAME_COLLISION;\n      }\n      break;\n    default:\n      // Either way, ok.\n      break;\n  }\n\n  // Verify permissions.\n  bool wants_write = desired_access & FileAccess::kFileWriteData ||\n                     desired_access & FileAccess::kFileAppendData;\n  if (wants_write && ((parent_entry && parent_entry->is_read_only()) ||\n                      (entry && entry->is_read_only()))) {\n    // Fail if read only device and wants write.\n    // return X_STATUS_ACCESS_DENIED;\n    // TODO(benvanik): figure out why games are opening read-only files with\n    // write modes.\n    assert_always();\n    XELOGW(\"Attempted to open the file/dir for create/write\");\n    desired_access = FileAccess::kGenericRead | FileAccess::kFileReadData;\n  }\n\n  bool created = false;\n  if (!entry) {\n    // Remember that we are creating this new, instead of replacing.\n    created = true;\n    *out_action = FileAction::kCreated;\n  } else {\n    // May need to delete, if it exists.\n    switch (creation_disposition) {\n      case FileDisposition::kCreate:\n        // Shouldn't be possible to hit this.\n        assert_always();\n        return X_STATUS_ACCESS_DENIED;\n      case FileDisposition::kSuperscede:\n        // Replace (by delete + recreate).\n        if (!entry->Delete()) {\n          return X_STATUS_ACCESS_DENIED;\n        }\n        entry = nullptr;\n        *out_action = FileAction::kSuperseded;\n        break;\n      case FileDisposition::kOpen:\n      case FileDisposition::kOpenIf:\n        // Normal open.\n        *out_action = FileAction::kOpened;\n        break;\n      case FileDisposition::kOverwrite:\n      case FileDisposition::kOverwriteIf:\n        // Overwrite (we do by delete + recreate).\n        if (!entry->Delete()) {\n          return X_STATUS_ACCESS_DENIED;\n        }\n        entry = nullptr;\n        *out_action = FileAction::kOverwritten;\n        break;\n    }\n  }\n  if (!entry) {\n    // Create if needed (either new or as a replacement).\n    entry = CreatePath(\n        path, !is_directory ? kFileAttributeNormal : kFileAttributeDirectory);\n    if (!entry) {\n      return X_STATUS_ACCESS_DENIED;\n    }\n  }\n\n  // Open.\n  auto result = entry->Open(desired_access, out_file);\n  if (XFAILED(result)) {\n    *out_action = FileAction::kDoesNotExist;\n  }\n  return result;\n}\n\n}  // namespace vfs\n}  // namespace xe\n"
  },
  {
    "path": "src/xenia/vfs/virtual_file_system.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2013 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_VFS_VIRTUAL_FILE_SYSTEM_H_\n#define XENIA_VFS_VIRTUAL_FILE_SYSTEM_H_\n\n#include <memory>\n#include <string>\n#include <unordered_map>\n#include <vector>\n\n#include \"xenia/base/mutex.h\"\n#include \"xenia/vfs/device.h\"\n#include \"xenia/vfs/entry.h\"\n#include \"xenia/vfs/file.h\"\n\nnamespace xe {\nnamespace vfs {\n\nclass VirtualFileSystem {\n public:\n  VirtualFileSystem();\n  ~VirtualFileSystem();\n\n  bool RegisterDevice(std::unique_ptr<Device> device);\n  bool UnregisterDevice(const std::string_view path);\n\n  bool RegisterSymbolicLink(const std::string_view path,\n                            const std::string_view target);\n  bool UnregisterSymbolicLink(const std::string_view path);\n  bool FindSymbolicLink(const std::string_view path, std::string& target);\n\n  Entry* ResolvePath(const std::string_view path);\n\n  Entry* CreatePath(const std::string_view path, uint32_t attributes);\n  bool DeletePath(const std::string_view path);\n\n  X_STATUS OpenFile(Entry* root_entry, const std::string_view path,\n                    FileDisposition creation_disposition,\n                    uint32_t desired_access, bool is_directory,\n                    bool is_non_directory, File** out_file,\n                    FileAction* out_action);\n\n private:\n  xe::global_critical_region global_critical_region_;\n  std::vector<std::unique_ptr<Device>> devices_;\n  std::unordered_map<std::string, std::string> symlinks_;\n\n  bool ResolveSymbolicLink(const std::string_view path, std::string& result);\n};\n\n}  // namespace vfs\n}  // namespace xe\n\n#endif  // XENIA_VFS_VIRTUAL_FILE_SYSTEM_H_\n"
  },
  {
    "path": "src/xenia/xbox.h",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2020 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#ifndef XENIA_XBOX_H_\n#define XENIA_XBOX_H_\n\n#include <string>\n\n#include \"xenia/base/memory.h\"\n\n// TODO(benvanik): split this header, cleanup, etc.\n// clang-format off\n\nnamespace xe {\n\n#pragma pack(push, 4)\n\ntypedef uint32_t X_HANDLE;\n#define X_INVALID_HANDLE_VALUE ((X_HANDLE)-1)\n\n// TODO(benvanik): type all of this so we get some safety.\n\n// NT_STATUS (STATUS_*)\n// https://msdn.microsoft.com/en-us/library/cc704588.aspx\n// Adding as needed.\ntypedef uint32_t X_STATUS;\n#define XSUCCEEDED(s)     ((s & 0xC0000000) == 0)\n#define XFAILED(s)        (!XSUCCEEDED(s))\n#define X_STATUS_SUCCESS                                ((X_STATUS)0x00000000L)\n#define X_STATUS_ABANDONED_WAIT_0                       ((X_STATUS)0x00000080L)\n#define X_STATUS_USER_APC                               ((X_STATUS)0x000000C0L)\n#define X_STATUS_ALERTED                                ((X_STATUS)0x00000101L)\n#define X_STATUS_TIMEOUT                                ((X_STATUS)0x00000102L)\n#define X_STATUS_PENDING                                ((X_STATUS)0x00000103L)\n#define X_STATUS_OBJECT_NAME_EXISTS                     ((X_STATUS)0x40000000L)\n#define X_STATUS_TIMER_RESUME_IGNORED                   ((X_STATUS)0x40000025L)\n#define X_STATUS_BUFFER_OVERFLOW                        ((X_STATUS)0x80000005L)\n#define X_STATUS_NO_MORE_FILES                          ((X_STATUS)0x80000006L)\n#define X_STATUS_UNSUCCESSFUL                           ((X_STATUS)0xC0000001L)\n#define X_STATUS_NOT_IMPLEMENTED                        ((X_STATUS)0xC0000002L)\n#define X_STATUS_INVALID_INFO_CLASS                     ((X_STATUS)0xC0000003L)\n#define X_STATUS_INFO_LENGTH_MISMATCH                   ((X_STATUS)0xC0000004L)\n#define X_STATUS_ACCESS_VIOLATION                       ((X_STATUS)0xC0000005L)\n#define X_STATUS_INVALID_HANDLE                         ((X_STATUS)0xC0000008L)\n#define X_STATUS_INVALID_PARAMETER                      ((X_STATUS)0xC000000DL)\n#define X_STATUS_NO_SUCH_FILE                           ((X_STATUS)0xC000000FL)\n#define X_STATUS_END_OF_FILE                            ((X_STATUS)0xC0000011L)\n#define X_STATUS_NO_MEMORY                              ((X_STATUS)0xC0000017L)\n#define X_STATUS_ALREADY_COMMITTED                      ((X_STATUS)0xC0000021L)\n#define X_STATUS_ACCESS_DENIED                          ((X_STATUS)0xC0000022L)\n#define X_STATUS_BUFFER_TOO_SMALL                       ((X_STATUS)0xC0000023L)\n#define X_STATUS_OBJECT_TYPE_MISMATCH                   ((X_STATUS)0xC0000024L)\n#define X_STATUS_OBJECT_NAME_INVALID                    ((X_STATUS)0xC0000033L)\n#define X_STATUS_OBJECT_NAME_NOT_FOUND                  ((X_STATUS)0xC0000034L)\n#define X_STATUS_OBJECT_NAME_COLLISION                  ((X_STATUS)0xC0000035L)\n#define X_STATUS_INVALID_PAGE_PROTECTION                ((X_STATUS)0xC0000045L)\n#define X_STATUS_MUTANT_NOT_OWNED                       ((X_STATUS)0xC0000046L)\n#define X_STATUS_PROCEDURE_NOT_FOUND                    ((X_STATUS)0xC000007AL)\n#define X_STATUS_INSUFFICIENT_RESOURCES                 ((X_STATUS)0xC000009AL)\n#define X_STATUS_MEMORY_NOT_ALLOCATED                   ((X_STATUS)0xC00000A0L)\n#define X_STATUS_FILE_IS_A_DIRECTORY                    ((X_STATUS)0xC00000BAL)\n#define X_STATUS_NOT_SUPPORTED                          ((X_STATUS)0xC00000BBL)\n#define X_STATUS_INVALID_PARAMETER_1                    ((X_STATUS)0xC00000EFL)\n#define X_STATUS_INVALID_PARAMETER_2                    ((X_STATUS)0xC00000F0L)\n#define X_STATUS_INVALID_PARAMETER_3                    ((X_STATUS)0xC00000F1L)\n#define X_STATUS_DLL_NOT_FOUND                          ((X_STATUS)0xC0000135L)\n#define X_STATUS_ENTRYPOINT_NOT_FOUND                   ((X_STATUS)0xC0000139L)\n#define X_STATUS_MAPPED_ALIGNMENT                       ((X_STATUS)0xC0000220L)\n#define X_STATUS_NOT_FOUND                              ((X_STATUS)0xC0000225L)\n#define X_STATUS_DRIVER_ORDINAL_NOT_FOUND               ((X_STATUS)0xC0000262L)\n#define X_STATUS_DRIVER_ENTRYPOINT_NOT_FOUND            ((X_STATUS)0xC0000263L)\n\n// Win32 error codes (ERROR_*)\n// https://msdn.microsoft.com/en-us/library/windows/desktop/ms681381(v=vs.85).aspx\n// Adding as needed.\ntypedef uint32_t X_RESULT;\n#define X_FACILITY_WIN32 0x0007\n#define X_RESULT_FROM_WIN32(x) ((X_RESULT)(x))\n\n#define X_ERROR_SUCCESS                         X_RESULT_FROM_WIN32(0x00000000L)\n#define X_ERROR_FILE_NOT_FOUND                  X_RESULT_FROM_WIN32(0x00000002L)\n#define X_ERROR_PATH_NOT_FOUND                  X_RESULT_FROM_WIN32(0x00000003L)\n#define X_ERROR_ACCESS_DENIED                   X_RESULT_FROM_WIN32(0x00000005L)\n#define X_ERROR_INVALID_HANDLE                  X_RESULT_FROM_WIN32(0x00000006L)\n#define X_ERROR_NO_MORE_FILES                   X_RESULT_FROM_WIN32(0x00000012L)\n#define X_ERROR_INVALID_PARAMETER               X_RESULT_FROM_WIN32(0x00000057L)\n#define X_ERROR_INSUFFICIENT_BUFFER             X_RESULT_FROM_WIN32(0x0000007AL)\n#define X_ERROR_INVALID_NAME                    X_RESULT_FROM_WIN32(0x0000007BL)\n#define X_ERROR_BAD_ARGUMENTS                   X_RESULT_FROM_WIN32(0x000000A0L)\n#define X_ERROR_BUSY                            X_RESULT_FROM_WIN32(0x000000AAL)\n#define X_ERROR_ALREADY_EXISTS                  X_RESULT_FROM_WIN32(0x000000B7L)\n#define X_ERROR_IO_INCOMPLETE                   X_RESULT_FROM_WIN32(0x000003E4L)\n#define X_ERROR_IO_PENDING                      X_RESULT_FROM_WIN32(0x000003E5L)\n#define X_ERROR_DEVICE_NOT_CONNECTED            X_RESULT_FROM_WIN32(0x0000048FL)\n#define X_ERROR_NOT_FOUND                       X_RESULT_FROM_WIN32(0x00000490L)\n#define X_ERROR_CANCELLED                       X_RESULT_FROM_WIN32(0x000004C7L)\n#define X_ERROR_NOT_LOGGED_ON                   X_RESULT_FROM_WIN32(0x000004DDL)\n#define X_ERROR_NO_SUCH_USER                    X_RESULT_FROM_WIN32(0x00000525L)\n#define X_ERROR_FUNCTION_FAILED                 X_RESULT_FROM_WIN32(0x0000065BL)\n#define X_ERROR_EMPTY                           X_RESULT_FROM_WIN32(0x000010D2L)\n\n// HRESULT codes\ntypedef uint32_t X_HRESULT;\n#define X_HRESULT_FROM_WIN32(x) ((int32_t)(x) <= 0 \\\n                                  ? (static_cast<X_HRESULT>(x)) \\\n                                  : (static_cast<X_HRESULT>(((x) & 0xFFFF) | (X_FACILITY_WIN32 << 16) | \\\n                                    0x80000000L)))\n\n#define X_E_FALSE                               static_cast<X_HRESULT>(0x80000000L)\n#define X_E_SUCCESS                             X_HRESULT_FROM_WIN32(X_ERROR_SUCCESS)\n#define X_E_FAIL                                static_cast<X_HRESULT>(0x80004005L)\n#define X_E_NO_MORE_FILES                       X_HRESULT_FROM_WIN32(X_ERROR_NO_MORE_FILES)\n#define X_E_INVALIDARG                          X_HRESULT_FROM_WIN32(X_ERROR_INVALID_PARAMETER)\n#define X_E_DEVICE_NOT_CONNECTED                X_HRESULT_FROM_WIN32(X_ERROR_DEVICE_NOT_CONNECTED)\n#define X_E_NOTFOUND                            X_HRESULT_FROM_WIN32(X_ERROR_NOT_FOUND)\n#define X_E_NO_SUCH_USER                        X_HRESULT_FROM_WIN32(X_ERROR_NO_SUCH_USER)\n\n// MEM_*, used by NtAllocateVirtualMemory\nenum X_MEM : uint32_t {\n  X_MEM_COMMIT      = 0x00001000,\n  X_MEM_RESERVE     = 0x00002000,\n  X_MEM_DECOMMIT    = 0x00004000,\n  X_MEM_RELEASE     = 0x00008000,\n  X_MEM_FREE        = 0x00010000,\n  X_MEM_PRIVATE     = 0x00020000,\n  X_MEM_RESET       = 0x00080000,\n  X_MEM_TOP_DOWN    = 0x00100000,\n  X_MEM_NOZERO      = 0x00800000,\n  X_MEM_LARGE_PAGES = 0x20000000,\n  X_MEM_HEAP        = 0x40000000,\n  X_MEM_16MB_PAGES  = 0x80000000  // from Valve SDK\n};\n\n// PAGE_*, used by NtAllocateVirtualMemory\nenum X_PAGE : uint32_t {\n  X_PAGE_NOACCESS          = 0x00000001,\n  X_PAGE_READONLY          = 0x00000002,\n  X_PAGE_READWRITE         = 0x00000004,\n  X_PAGE_WRITECOPY         = 0x00000008,\n  X_PAGE_EXECUTE           = 0x00000010,\n  X_PAGE_EXECUTE_READ      = 0x00000020,\n  X_PAGE_EXECUTE_READWRITE = 0x00000040,\n  X_PAGE_EXECUTE_WRITECOPY = 0x00000080,\n  X_PAGE_GUARD             = 0x00000100,\n  X_PAGE_NOCACHE           = 0x00000200,\n  X_PAGE_WRITECOMBINE      = 0x00000400\n};\n\n// Sockets/networking.\n#define X_INVALID_SOCKET (uint32_t)(~0)\n#define X_SOCKET_ERROR (uint32_t)(-1)\n\n// clang-format on\n\nenum X_FILE_ATTRIBUTES : uint32_t {\n  X_FILE_ATTRIBUTE_NONE = 0x0000,\n  X_FILE_ATTRIBUTE_READONLY = 0x0001,\n  X_FILE_ATTRIBUTE_HIDDEN = 0x0002,\n  X_FILE_ATTRIBUTE_SYSTEM = 0x0004,\n  X_FILE_ATTRIBUTE_DIRECTORY = 0x0010,\n  X_FILE_ATTRIBUTE_ARCHIVE = 0x0020,\n  X_FILE_ATTRIBUTE_DEVICE = 0x0040,\n  X_FILE_ATTRIBUTE_NORMAL = 0x0080,\n  X_FILE_ATTRIBUTE_TEMPORARY = 0x0100,\n  X_FILE_ATTRIBUTE_COMPRESSED = 0x0800,\n  X_FILE_ATTRIBUTE_ENCRYPTED = 0x4000,\n};\n\n// Known as XOVERLAPPED to 360 code.\nstruct XAM_OVERLAPPED {\n  xe::be<uint32_t> result;              // 0x0\n  xe::be<uint32_t> length;              // 0x4\n  xe::be<uint32_t> context;             // 0x8\n  xe::be<uint32_t> event;               // 0xC\n  xe::be<uint32_t> completion_routine;  // 0x10\n  xe::be<uint32_t> completion_context;  // 0x14\n  xe::be<uint32_t> extended_error;      // 0x18\n};\n\ninline uint32_t XOverlappedGetResult(void* ptr) {\n  auto p = reinterpret_cast<uint32_t*>(ptr);\n  return xe::load_and_swap<uint32_t>(&p[0]);\n}\ninline void XOverlappedSetResult(void* ptr, uint32_t value) {\n  auto p = reinterpret_cast<uint32_t*>(ptr);\n  xe::store_and_swap<uint32_t>(&p[0], value);\n}\ninline uint32_t XOverlappedGetLength(void* ptr) {\n  auto p = reinterpret_cast<uint32_t*>(ptr);\n  return xe::load_and_swap<uint32_t>(&p[1]);\n}\ninline void XOverlappedSetLength(void* ptr, uint32_t value) {\n  auto p = reinterpret_cast<uint32_t*>(ptr);\n  xe::store_and_swap<uint32_t>(&p[1], value);\n}\ninline uint32_t XOverlappedGetContext(void* ptr) {\n  auto p = reinterpret_cast<uint32_t*>(ptr);\n  return xe::load_and_swap<uint32_t>(&p[2]);\n}\ninline void XOverlappedSetContext(void* ptr, uint32_t value) {\n  auto p = reinterpret_cast<uint32_t*>(ptr);\n  xe::store_and_swap<uint32_t>(&p[2], value);\n}\ninline X_HANDLE XOverlappedGetEvent(void* ptr) {\n  auto p = reinterpret_cast<uint32_t*>(ptr);\n  return xe::load_and_swap<uint32_t>(&p[3]);\n}\ninline uint32_t XOverlappedGetCompletionRoutine(void* ptr) {\n  auto p = reinterpret_cast<uint32_t*>(ptr);\n  return xe::load_and_swap<uint32_t>(&p[4]);\n}\ninline uint32_t XOverlappedGetCompletionContext(void* ptr) {\n  auto p = reinterpret_cast<uint32_t*>(ptr);\n  return xe::load_and_swap<uint32_t>(&p[5]);\n}\ninline void XOverlappedSetExtendedError(void* ptr, uint32_t value) {\n  auto p = reinterpret_cast<uint32_t*>(ptr);\n  xe::store_and_swap<uint32_t>(&p[6], value);\n}\n\nstruct X_ANSI_STRING {\n  xe::be<uint16_t> length;\n  xe::be<uint16_t> maximum_length;\n  xe::be<uint32_t> pointer;\n\n  void reset() {\n    length = 0;\n    maximum_length = 0;\n    pointer = 0;\n  }\n};\nstatic_assert_size(X_ANSI_STRING, 8);\n\nstruct X_UNICODE_STRING {\n  xe::be<uint16_t> length;          // 0x0\n  xe::be<uint16_t> maximum_length;  // 0x2\n  xe::be<uint32_t> pointer;         // 0x4\n\n  void reset() {\n    length = 0;\n    maximum_length = 0;\n    pointer = 0;\n  }\n};\nstatic_assert_size(X_UNICODE_STRING, 8);\n\n// https://pastebin.com/SMypYikG\ntypedef uint32_t XNotificationID;\n\n// https://github.com/CodeAsm/ffplay360/blob/master/Common/XTLOnPC.h\nstruct X_VIDEO_MODE {\n  be<uint32_t> display_width;\n  be<uint32_t> display_height;\n  be<uint32_t> is_interlaced;\n  be<uint32_t> is_widescreen;\n  be<uint32_t> is_hi_def;\n  be<float> refresh_rate;\n  be<uint32_t> video_standard;\n  be<uint32_t> unknown_0x8a;\n  be<uint32_t> unknown_0x01;\n  be<uint32_t> reserved[3];\n};\nstatic_assert_size(X_VIDEO_MODE, 48);\n\n// https://docs.microsoft.com/en-us/windows/win32/api/ntdef/ns-ntdef-list_entry\nstruct X_LIST_ENTRY {\n  be<uint32_t> flink_ptr;  // next entry / head\n  be<uint32_t> blink_ptr;  // previous entry / head\n};\nstatic_assert_size(X_LIST_ENTRY, 8);\n\nstruct X_SINGLE_LIST_ENTRY {\n  be<uint32_t> next;  // 0x0 pointer to next entry\n};\nstatic_assert_size(X_SINGLE_LIST_ENTRY, 4);\n\n// https://www.nirsoft.net/kernel_struct/vista/SLIST_HEADER.html\nstruct X_SLIST_HEADER {\n  X_SINGLE_LIST_ENTRY next;  // 0x0\n  be<uint16_t> depth;        // 0x4\n  be<uint16_t> sequence;     // 0x6\n};\nstatic_assert_size(X_SLIST_HEADER, 8);\n\n// https://msdn.microsoft.com/en-us/library/windows/hardware/ff550671(v=vs.85).aspx\nstruct X_IO_STATUS_BLOCK {\n  union {\n    xe::be<X_STATUS> status;\n    xe::be<uint32_t> pointer;\n  };\n  xe::be<uint32_t> information;\n};\n\nstruct X_EX_TITLE_TERMINATE_REGISTRATION {\n  xe::be<uint32_t> notification_routine;  // 0x0\n  xe::be<uint32_t> priority;              // 0x4\n  X_LIST_ENTRY list_entry;                // 0x8 ??\n};\nstatic_assert_size(X_EX_TITLE_TERMINATE_REGISTRATION, 16);\n\nstruct X_OBJECT_ATTRIBUTES {\n  xe::be<uint32_t> root_directory;  // 0x0\n  xe::be<uint32_t> name_ptr;        // 0x4 PANSI_STRING\n  xe::be<uint32_t> attributes;      // 0xC\n};\n\n// https://msdn.microsoft.com/en-us/library/windows/desktop/aa363082.aspx\ntypedef struct {\n  // Renamed due to a collision with exception_code from Windows excpt.h.\n  xe::be<uint32_t> code;\n  xe::be<uint32_t> exception_flags;\n  xe::be<uint32_t> exception_record;\n  xe::be<uint32_t> exception_address;\n  xe::be<uint32_t> number_parameters;\n  xe::be<uint32_t> exception_information[15];\n} X_EXCEPTION_RECORD;\nstatic_assert_size(X_EXCEPTION_RECORD, 0x50);\n\n#pragma pack(pop)\n\n// Found by dumping the kSectionStringTable sections of various games:\n// and the language list at\n// https://free60project.github.io/wiki/Profile_Account/\nenum class XLanguage : uint32_t {\n  kInvalid = 0,\n  kEnglish = 1,\n  kJapanese = 2,\n  kGerman = 3,\n  kFrench = 4,\n  kSpanish = 5,\n  kItalian = 6,\n  kKorean = 7,\n  kTChinese = 8,\n  kPortuguese = 9,\n  kSChinese = 10,\n  kPolish = 11,\n  kRussian = 12,\n  // STFS headers can't support any more languages than these\n  kMaxLanguages = 13\n};\n\nenum class XContentType : uint32_t {\n  kSavedGame = 0x00000001,\n  kMarketplaceContent = 0x00000002,\n  kPublisher = 0x00000003,\n  kXbox360Title = 0x00001000,\n  kIptvPauseBuffer = 0x00002000,\n  kXNACommunity = 0x00003000,\n  kInstalledGame = 0x00004000,\n  kXboxTitle = 0x00005000,\n  kSocialTitle = 0x00006000,\n  kGamesOnDemand = 0x00007000,\n  kSUStoragePack = 0x00008000,\n  kAvatarItem = 0x00009000,\n  kProfile = 0x00010000,\n  kGamerPicture = 0x00020000,\n  kTheme = 0x00030000,\n  kCacheFile = 0x00040000,\n  kStorageDownload = 0x00050000,\n  kXboxSavedGame = 0x00060000,\n  kXboxDownload = 0x00070000,\n  kGameDemo = 0x00080000,\n  kVideo = 0x00090000,\n  kGameTitle = 0x000A0000,\n  kInstaller = 0x000B0000,\n  kGameTrailer = 0x000C0000,\n  kArcadeTitle = 0x000D0000,\n  kXNA = 0x000E0000,\n  kLicenseStore = 0x000F0000,\n  kMovie = 0x00100000,\n  kTV = 0x00200000,\n  kMusicVideo = 0x00300000,\n  kGameVideo = 0x00400000,\n  kPodcastVideo = 0x00500000,\n  kViralVideo = 0x00600000,\n  kCommunityGame = 0x02000000,\n};\n\n}  // namespace xe\n\n// clang-format on\n\n#endif  // XENIA_XBOX_H_\n"
  },
  {
    "path": "third_party/.clang-format",
    "content": "DisableFormat: true\nSortIncludes: false\n"
  },
  {
    "path": "third_party/SDL2-static.lua",
    "content": "-- This project resembles the build configuration on Windows only.\ngroup(\"third_party\")\nproject(\"SDL2\")\n  uuid(\"65878768-95A1-4E7B-8DFB-B23A09E0DE7C\")\n  kind(\"StaticLib\")\n  language(\"C\")\n\n  defines({\n    \"HAVE_LIBC\",\n  })\n  links({\n    \"setupapi.lib\",\n    \"winmm.lib\",\n    \"imm32.lib\",\n    \"version.lib\",\n  })\n  includedirs({\n    \"SDL2/include\",\n  })\n  files({\n    -- 1:1 from SDL2/VisualC/SDL/SDL.vcxproj file\n\n    \"SDL2/include/begin_code.h\",\n    \"SDL2/include/close_code.h\",\n    \"SDL2/include/SDL.h\",\n    \"SDL2/include/SDL_assert.h\",\n    \"SDL2/include/SDL_atomic.h\",\n    \"SDL2/include/SDL_audio.h\",\n    \"SDL2/include/SDL_bits.h\",\n    \"SDL2/include/SDL_blendmode.h\",\n    \"SDL2/include/SDL_clipboard.h\",\n    \"SDL2/include/SDL_config.h\",\n    \"SDL2/include/SDL_config_windows.h\",\n    \"SDL2/include/SDL_copying.h\",\n    \"SDL2/include/SDL_cpuinfo.h\",\n    \"SDL2/include/SDL_egl.h\",\n    \"SDL2/include/SDL_endian.h\",\n    \"SDL2/include/SDL_error.h\",\n    \"SDL2/include/SDL_events.h\",\n    \"SDL2/include/SDL_filesystem.h\",\n    \"SDL2/include/SDL_gamecontroller.h\",\n    \"SDL2/include/SDL_gesture.h\",\n    \"SDL2/include/SDL_guid.h\",\n    \"SDL2/include/SDL_haptic.h\",\n    \"SDL2/include/SDL_hints.h\",\n    \"SDL2/include/SDL_hidapi.h\",\n    \"SDL2/include/SDL_joystick.h\",\n    \"SDL2/include/SDL_keyboard.h\",\n    \"SDL2/include/SDL_keycode.h\",\n    \"SDL2/include/SDL_loadso.h\",\n    \"SDL2/include/SDL_locale.h\",\n    \"SDL2/include/SDL_log.h\",\n    \"SDL2/include/SDL_main.h\",\n    \"SDL2/include/SDL_messagebox.h\",\n    \"SDL2/include/SDL_metal.h\",\n    \"SDL2/include/SDL_misc.h\",\n    \"SDL2/include/SDL_mouse.h\",\n    \"SDL2/include/SDL_mutex.h\",\n    \"SDL2/include/SDL_name.h\",\n    \"SDL2/include/SDL_opengl.h\",\n    \"SDL2/include/SDL_opengl_glext.h\",\n    \"SDL2/include/SDL_opengles.h\",\n    \"SDL2/include/SDL_opengles2.h\",\n    \"SDL2/include/SDL_opengles2_gl2.h\",\n    \"SDL2/include/SDL_opengles2_gl2ext.h\",\n    \"SDL2/include/SDL_opengles2_gl2platform.h\",\n    \"SDL2/include/SDL_opengles2_khrplatform.h\",\n    \"SDL2/include/SDL_pixels.h\",\n    \"SDL2/include/SDL_platform.h\",\n    \"SDL2/include/SDL_power.h\",\n    \"SDL2/include/SDL_quit.h\",\n    \"SDL2/include/SDL_rect.h\",\n    \"SDL2/include/SDL_render.h\",\n    \"SDL2/include/SDL_revision.h\",\n    \"SDL2/include/SDL_rwops.h\",\n    \"SDL2/include/SDL_scancode.h\",\n    \"SDL2/include/SDL_sensor.h\",\n    \"SDL2/include/SDL_shape.h\",\n    \"SDL2/include/SDL_stdinc.h\",\n    \"SDL2/include/SDL_surface.h\",\n    \"SDL2/include/SDL_system.h\",\n    \"SDL2/include/SDL_syswm.h\",\n    \"SDL2/include/SDL_test.h\",\n    \"SDL2/include/SDL_test_assert.h\",\n    \"SDL2/include/SDL_test_common.h\",\n    \"SDL2/include/SDL_test_compare.h\",\n    \"SDL2/include/SDL_test_crc32.h\",\n    \"SDL2/include/SDL_test_font.h\",\n    \"SDL2/include/SDL_test_fuzzer.h\",\n    \"SDL2/include/SDL_test_harness.h\",\n    \"SDL2/include/SDL_test_images.h\",\n    \"SDL2/include/SDL_test_log.h\",\n    \"SDL2/include/SDL_test_md5.h\",\n    \"SDL2/include/SDL_test_memory.h\",\n    \"SDL2/include/SDL_test_random.h\",\n    \"SDL2/include/SDL_thread.h\",\n    \"SDL2/include/SDL_timer.h\",\n    \"SDL2/include/SDL_touch.h\",\n    \"SDL2/include/SDL_types.h\",\n    \"SDL2/include/SDL_version.h\",\n    \"SDL2/include/SDL_video.h\",\n    \"SDL2/include/SDL_vulkan.h\",\n    \"SDL2/src/audio/directsound/SDL_directsound.h\",\n    \"SDL2/src/audio/disk/SDL_diskaudio.h\",\n    \"SDL2/src/audio/dummy/SDL_dummyaudio.h\",\n    \"SDL2/src/audio/SDL_audio_c.h\",\n    \"SDL2/src/audio/SDL_audiodev_c.h\",\n    \"SDL2/src/audio/SDL_sysaudio.h\",\n    \"SDL2/src/audio/SDL_wave.h\",\n    \"SDL2/src/audio/wasapi/SDL_wasapi.h\",\n    \"SDL2/src/audio/winmm/SDL_winmm.h\",\n    \"SDL2/src/core/windows/SDL_directx.h\",\n    \"SDL2/src/core/windows/SDL_hid.h\",\n    \"SDL2/src/core/windows/SDL_immdevice.h\",\n    \"SDL2/src/core/windows/SDL_windows.h\",\n    \"SDL2/src/core/windows/SDL_xinput.h\",\n    \"SDL2/src/dynapi/SDL_dynapi.h\",\n    \"SDL2/src/dynapi/SDL_dynapi_overrides.h\",\n    \"SDL2/src/dynapi/SDL_dynapi_procs.h\",\n    \"SDL2/src/events/blank_cursor.h\",\n    \"SDL2/src/events/default_cursor.h\",\n    \"SDL2/src/events/scancodes_windows.h\",\n    \"SDL2/src/events/SDL_clipboardevents_c.h\",\n    \"SDL2/src/events/SDL_displayevents_c.h\",\n    \"SDL2/src/events/SDL_dropevents_c.h\",\n    \"SDL2/src/events/SDL_events_c.h\",\n    \"SDL2/src/events/SDL_gesture_c.h\",\n    \"SDL2/src/events/SDL_keyboard_c.h\",\n    \"SDL2/src/events/SDL_mouse_c.h\",\n    \"SDL2/src/events/SDL_touch_c.h\",\n    \"SDL2/src/events/SDL_windowevents_c.h\",\n    \"SDL2/src/haptic/SDL_haptic_c.h\",\n    \"SDL2/src/haptic/SDL_syshaptic.h\",\n    \"SDL2/src/haptic/windows/SDL_dinputhaptic_c.h\",\n    \"SDL2/src/haptic/windows/SDL_windowshaptic_c.h\",\n    \"SDL2/src/haptic/windows/SDL_xinputhaptic_c.h\",\n    \"SDL2/src/hidapi/hidapi/hidapi.h\",\n    \"SDL2/src/hidapi/SDL_hidapi_c.h\",\n    \"SDL2/src/joystick/controller_type.h\",\n    \"SDL2/src/joystick/hidapi/SDL_hidapijoystick_c.h\",\n    \"SDL2/src/joystick/hidapi/SDL_hidapi_rumble.h\",\n    \"SDL2/src/joystick/SDL_gamecontrollerdb.h\",\n    \"SDL2/src/joystick/SDL_joystick_c.h\",\n    \"SDL2/src/joystick/SDL_sysjoystick.h\",\n    \"SDL2/src/joystick/usb_ids.h\",\n    \"SDL2/src/joystick/virtual/SDL_virtualjoystick_c.h\",\n    \"SDL2/src/joystick/windows/SDL_dinputjoystick_c.h\",\n    \"SDL2/src/joystick/windows/SDL_rawinputjoystick_c.h\",\n    \"SDL2/src/joystick/windows/SDL_windowsjoystick_c.h\",\n    \"SDL2/src/joystick/windows/SDL_xinputjoystick_c.h\",\n    \"SDL2/src/libm/math_libm.h\",\n    \"SDL2/src/libm/math_private.h\",\n    \"SDL2/src/locale/SDL_syslocale.h\",\n    \"SDL2/src/misc/SDL_sysurl.h\",\n    \"SDL2/src/power/SDL_syspower.h\",\n    \"SDL2/src/render/direct3d11/SDL_shaders_d3d11.h\",\n    \"SDL2/src/render/direct3d12/SDL_shaders_d3d12.h\",\n    \"SDL2/src/render/direct3d/SDL_shaders_d3d.h\",\n    \"SDL2/src/render/opengles2/SDL_gles2funcs.h\",\n    \"SDL2/src/render/opengles2/SDL_shaders_gles2.h\",\n    \"SDL2/src/render/opengl/SDL_glfuncs.h\",\n    \"SDL2/src/render/opengl/SDL_shaders_gl.h\",\n    \"SDL2/src/render/SDL_d3dmath.h\",\n    \"SDL2/src/render/SDL_sysrender.h\",\n    \"SDL2/src/render/SDL_yuv_sw_c.h\",\n    \"SDL2/src/render/software/SDL_blendfillrect.h\",\n    \"SDL2/src/render/software/SDL_blendline.h\",\n    \"SDL2/src/render/software/SDL_blendpoint.h\",\n    \"SDL2/src/render/software/SDL_draw.h\",\n    \"SDL2/src/render/software/SDL_drawline.h\",\n    \"SDL2/src/render/software/SDL_drawpoint.h\",\n    \"SDL2/src/render/software/SDL_render_sw_c.h\",\n    \"SDL2/src/render/software/SDL_rotate.h\",\n    \"SDL2/src/render/software/SDL_triangle.h\",\n    \"SDL2/src/SDL_assert_c.h\",\n    \"SDL2/src/SDL_dataqueue.h\",\n    \"SDL2/src/SDL_error_c.h\",\n    \"SDL2/src/SDL_guid.c\",\n    \"SDL2/src/SDL_hints_c.h\",\n    \"SDL2/src/SDL_internal.h\",\n    \"SDL2/src/SDL_list.h\",\n    \"SDL2/src/SDL_log_c.h\",\n    \"SDL2/src/sensor/dummy/SDL_dummysensor.h\",\n    \"SDL2/src/sensor/SDL_sensor_c.h\",\n    \"SDL2/src/sensor/SDL_syssensor.h\",\n    \"SDL2/src/sensor/windows/SDL_windowssensor.h\",\n    \"SDL2/src/thread/SDL_systhread.h\",\n    \"SDL2/src/thread/SDL_thread_c.h\",\n    \"SDL2/src/thread/generic/SDL_syscond_c.h\",\n    \"SDL2/src/thread/windows/SDL_sysmutex_c.h\",\n    \"SDL2/src/thread/windows/SDL_systhread_c.h\",\n    \"SDL2/src/timer/SDL_timer_c.h\",\n    \"SDL2/src/video/dummy/SDL_nullevents_c.h\",\n    \"SDL2/src/video/dummy/SDL_nullframebuffer_c.h\",\n    \"SDL2/src/video/dummy/SDL_nullvideo.h\",\n    \"SDL2/src/video/khronos/vulkan/vk_icd.h\",\n    \"SDL2/src/video/khronos/vulkan/vk_layer.h\",\n    \"SDL2/src/video/khronos/vulkan/vk_platform.h\",\n    \"SDL2/src/video/khronos/vulkan/vk_sdk_platform.h\",\n    \"SDL2/src/video/khronos/vulkan/vulkan.h\",\n    \"SDL2/src/video/khronos/vulkan/vulkan.hpp\",\n    \"SDL2/src/video/khronos/vulkan/vulkan_android.h\",\n    \"SDL2/src/video/khronos/vulkan/vulkan_beta.h\",\n    \"SDL2/src/video/khronos/vulkan/vulkan_core.h\",\n    \"SDL2/src/video/khronos/vulkan/vulkan_directfb.h\",\n    \"SDL2/src/video/khronos/vulkan/vulkan_fuchsia.h\",\n    \"SDL2/src/video/khronos/vulkan/vulkan_ggp.h\",\n    \"SDL2/src/video/khronos/vulkan/vulkan_ios.h\",\n    \"SDL2/src/video/khronos/vulkan/vulkan_macos.h\",\n    \"SDL2/src/video/khronos/vulkan/vulkan_metal.h\",\n    \"SDL2/src/video/khronos/vulkan/vulkan_vi.h\",\n    \"SDL2/src/video/khronos/vulkan/vulkan_wayland.h\",\n    \"SDL2/src/video/khronos/vulkan/vulkan_win32.h\",\n    \"SDL2/src/video/khronos/vulkan/vulkan_xcb.h\",\n    \"SDL2/src/video/khronos/vulkan/vulkan_xlib.h\",\n    \"SDL2/src/video/khronos/vulkan/vulkan_xlib_xrandr.h\",\n    \"SDL2/src/video/SDL_blit.h\",\n    \"SDL2/src/video/SDL_blit_auto.h\",\n    \"SDL2/src/video/SDL_blit_copy.h\",\n    \"SDL2/src/video/SDL_blit_slow.h\",\n    \"SDL2/src/video/SDL_egl_c.h\",\n    \"SDL2/src/video/SDL_pixels_c.h\",\n    \"SDL2/src/video/SDL_rect_c.h\",\n    \"SDL2/src/video/SDL_RLEaccel_c.h\",\n    \"SDL2/src/video/SDL_shape_internals.h\",\n    \"SDL2/src/video/SDL_sysvideo.h\",\n    \"SDL2/src/video/SDL_vulkan_internal.h\",\n    \"SDL2/src/video/SDL_yuv_c.h\",\n    \"SDL2/src/video/windows/SDL_msctf.h\",\n    \"SDL2/src/video/windows/SDL_vkeys.h\",\n    \"SDL2/src/video/windows/SDL_windowsclipboard.h\",\n    \"SDL2/src/video/windows/SDL_windowsevents.h\",\n    \"SDL2/src/video/windows/SDL_windowsframebuffer.h\",\n    \"SDL2/src/video/windows/SDL_windowskeyboard.h\",\n    \"SDL2/src/video/windows/SDL_windowsmessagebox.h\",\n    \"SDL2/src/video/windows/SDL_windowsmodes.h\",\n    \"SDL2/src/video/windows/SDL_windowsmouse.h\",\n    \"SDL2/src/video/windows/SDL_windowsopengl.h\",\n    \"SDL2/src/video/windows/SDL_windowsopengles.h\",\n    \"SDL2/src/video/windows/SDL_windowsshape.h\",\n    \"SDL2/src/video/windows/SDL_windowstaskdialog.h\",\n    \"SDL2/src/video/windows/SDL_windowsvideo.h\",\n    \"SDL2/src/video/windows/SDL_windowsvulkan.h\",\n    \"SDL2/src/video/windows/SDL_windowswindow.h\",\n    \"SDL2/src/video/windows/wmmsg.h\",\n    \"SDL2/src/video/yuv2rgb/yuv_rgb.h\",\n    \"SDL2/src/video/yuv2rgb/yuv_rgb_sse_func.h\",\n    \"SDL2/src/video/yuv2rgb/yuv_rgb_std_func.h\",\n\n    \"SDL2/src/atomic/SDL_atomic.c\",\n    \"SDL2/src/atomic/SDL_spinlock.c\",\n    \"SDL2/src/audio/directsound/SDL_directsound.c\",\n    \"SDL2/src/audio/disk/SDL_diskaudio.c\",\n    \"SDL2/src/audio/dummy/SDL_dummyaudio.c\",\n    \"SDL2/src/audio/SDL_audio.c\",\n    \"SDL2/src/audio/SDL_audiocvt.c\",\n    \"SDL2/src/audio/SDL_audiodev.c\",\n    \"SDL2/src/audio/SDL_audiotypecvt.c\",\n    \"SDL2/src/audio/SDL_mixer.c\",\n    \"SDL2/src/audio/SDL_wave.c\",\n    \"SDL2/src/audio/winmm/SDL_winmm.c\",\n    \"SDL2/src/audio/wasapi/SDL_wasapi.c\",\n    \"SDL2/src/audio/wasapi/SDL_wasapi_win32.c\",\n    \"SDL2/src/core/windows/SDL_hid.c\",\n    \"SDL2/src/core/windows/SDL_immdevice.c\",\n    \"SDL2/src/core/windows/SDL_windows.c\",\n    \"SDL2/src/core/windows/SDL_xinput.c\",\n    \"SDL2/src/cpuinfo/SDL_cpuinfo.c\",\n    \"SDL2/src/dynapi/SDL_dynapi.c\",\n    \"SDL2/src/events/SDL_clipboardevents.c\",\n    \"SDL2/src/events/SDL_displayevents.c\",\n    \"SDL2/src/events/SDL_dropevents.c\",\n    \"SDL2/src/events/SDL_events.c\",\n    \"SDL2/src/events/SDL_gesture.c\",\n    \"SDL2/src/events/SDL_keyboard.c\",\n    \"SDL2/src/events/SDL_mouse.c\",\n    \"SDL2/src/events/SDL_quit.c\",\n    \"SDL2/src/events/SDL_touch.c\",\n    \"SDL2/src/events/SDL_windowevents.c\",\n    \"SDL2/src/file/SDL_rwops.c\",\n    \"SDL2/src/filesystem/windows/SDL_sysfilesystem.c\",\n    \"SDL2/src/haptic/dummy/SDL_syshaptic.c\",\n    \"SDL2/src/haptic/SDL_haptic.c\",\n    \"SDL2/src/haptic/windows/SDL_dinputhaptic.c\",\n    \"SDL2/src/haptic/windows/SDL_windowshaptic.c\",\n    \"SDL2/src/haptic/windows/SDL_xinputhaptic.c\",\n    \"SDL2/src/hidapi/SDL_hidapi.c\",\n    \"SDL2/src/joystick/controller_type.c\",\n    \"SDL2/src/joystick/dummy/SDL_sysjoystick.c\",\n    \"SDL2/src/joystick/hidapi/SDL_hidapijoystick.c\",\n    \"SDL2/src/joystick/hidapi/SDL_hidapi_combined.c\",\n    \"SDL2/src/joystick/hidapi/SDL_hidapi_gamecube.c\",\n    \"SDL2/src/joystick/hidapi/SDL_hidapi_luna.c\",\n    \"SDL2/src/joystick/hidapi/SDL_hidapi_ps4.c\",\n    \"SDL2/src/joystick/hidapi/SDL_hidapi_ps5.c\",\n    \"SDL2/src/joystick/hidapi/SDL_hidapi_rumble.c\",\n    \"SDL2/src/joystick/hidapi/SDL_hidapi_shield.c\",\n    \"SDL2/src/joystick/hidapi/SDL_hidapi_stadia.c\",\n    \"SDL2/src/joystick/hidapi/SDL_hidapi_switch.c\",\n    \"SDL2/src/joystick/hidapi/SDL_hidapi_xbox360.c\",\n    \"SDL2/src/joystick/hidapi/SDL_hidapi_xbox360w.c\",\n    \"SDL2/src/joystick/hidapi/SDL_hidapi_xboxone.c\",\n    \"SDL2/src/joystick/SDL_gamecontroller.c\",\n    \"SDL2/src/joystick/SDL_joystick.c\",\n    \"SDL2/src/joystick/virtual/SDL_virtualjoystick.c\",\n    \"SDL2/src/joystick/windows/SDL_dinputjoystick.c\",\n    \"SDL2/src/joystick/windows/SDL_rawinputjoystick.c\",\n    \"SDL2/src/joystick/windows/SDL_windowsjoystick.c\",\n    \"SDL2/src/joystick/windows/SDL_windows_gaming_input.c\",\n    \"SDL2/src/joystick/windows/SDL_xinputjoystick.c\",\n    \"SDL2/src/libm/e_atan2.c\",\n    \"SDL2/src/libm/e_exp.c\",\n    \"SDL2/src/libm/e_fmod.c\",\n    \"SDL2/src/libm/e_log.c\",\n    \"SDL2/src/libm/e_log10.c\",\n    \"SDL2/src/libm/e_pow.c\",\n    \"SDL2/src/libm/e_rem_pio2.c\",\n    \"SDL2/src/libm/e_sqrt.c\",\n    \"SDL2/src/libm/k_cos.c\",\n    \"SDL2/src/libm/k_rem_pio2.c\",\n    \"SDL2/src/libm/k_sin.c\",\n    \"SDL2/src/libm/k_tan.c\",\n    \"SDL2/src/libm/s_atan.c\",\n    \"SDL2/src/libm/s_copysign.c\",\n    \"SDL2/src/libm/s_cos.c\",\n    \"SDL2/src/libm/s_fabs.c\",\n    \"SDL2/src/libm/s_floor.c\",\n    \"SDL2/src/libm/s_scalbn.c\",\n    \"SDL2/src/libm/s_sin.c\",\n    \"SDL2/src/libm/s_tan.c\",\n    \"SDL2/src/loadso/windows/SDL_sysloadso.c\",\n    \"SDL2/src/locale/SDL_locale.c\",\n    \"SDL2/src/locale/windows/SDL_syslocale.c\",\n    \"SDL2/src/misc/SDL_url.c\",\n    \"SDL2/src/misc/windows/SDL_sysurl.c\",\n    \"SDL2/src/power/SDL_power.c\",\n    \"SDL2/src/power/windows/SDL_syspower.c\",\n    \"SDL2/src/render/direct3d11/SDL_shaders_d3d11.c\",\n    \"SDL2/src/render/direct3d12/SDL_render_d3d12.c\",\n    \"SDL2/src/render/direct3d12/SDL_shaders_d3d12.c\",\n    \"SDL2/src/render/direct3d/SDL_render_d3d.c\",\n    \"SDL2/src/render/direct3d11/SDL_render_d3d11.c\",\n    \"SDL2/src/render/direct3d/SDL_shaders_d3d.c\",\n    \"SDL2/src/render/opengl/SDL_render_gl.c\",\n    \"SDL2/src/render/opengl/SDL_shaders_gl.c\",\n    \"SDL2/src/render/opengles2/SDL_render_gles2.c\",\n    \"SDL2/src/render/opengles2/SDL_shaders_gles2.c\",\n    \"SDL2/src/render/SDL_d3dmath.c\",\n    \"SDL2/src/render/SDL_render.c\",\n    \"SDL2/src/render/SDL_yuv_sw.c\",\n    \"SDL2/src/render/software/SDL_blendfillrect.c\",\n    \"SDL2/src/render/software/SDL_blendline.c\",\n    \"SDL2/src/render/software/SDL_blendpoint.c\",\n    \"SDL2/src/render/software/SDL_drawline.c\",\n    \"SDL2/src/render/software/SDL_drawpoint.c\",\n    \"SDL2/src/render/software/SDL_render_sw.c\",\n    \"SDL2/src/render/software/SDL_rotate.c\",\n    \"SDL2/src/render/software/SDL_triangle.c\",\n    \"SDL2/src/SDL.c\",\n    \"SDL2/src/SDL_assert.c\",\n    \"SDL2/src/SDL_dataqueue.c\",\n    \"SDL2/src/SDL_list.c\",\n    \"SDL2/src/SDL_error.c\",\n    \"SDL2/src/SDL_hints.c\",\n    \"SDL2/src/SDL_log.c\",\n    \"SDL2/src/SDL_utils.c\",\n    \"SDL2/src/sensor/dummy/SDL_dummysensor.c\",\n    \"SDL2/src/sensor/SDL_sensor.c\",\n    \"SDL2/src/sensor/windows/SDL_windowssensor.c\",\n    \"SDL2/src/stdlib/SDL_crc16.c\",\n    \"SDL2/src/stdlib/SDL_crc32.c\",\n    \"SDL2/src/stdlib/SDL_getenv.c\",\n    \"SDL2/src/stdlib/SDL_iconv.c\",\n    \"SDL2/src/stdlib/SDL_malloc.c\",\n    \"SDL2/src/stdlib/SDL_mslibc.c\",\n    \"SDL2/src/stdlib/SDL_qsort.c\",\n    \"SDL2/src/stdlib/SDL_stdlib.c\",\n    \"SDL2/src/stdlib/SDL_string.c\",\n    \"SDL2/src/stdlib/SDL_strtokr.c\",\n    \"SDL2/src/thread/generic/SDL_syscond.c\",\n    \"SDL2/src/thread/SDL_thread.c\",\n    \"SDL2/src/thread/windows/SDL_syscond_cv.c\",\n    \"SDL2/src/thread/windows/SDL_sysmutex.c\",\n    \"SDL2/src/thread/windows/SDL_syssem.c\",\n    \"SDL2/src/thread/windows/SDL_systhread.c\",\n    \"SDL2/src/thread/windows/SDL_systls.c\",\n    \"SDL2/src/timer/SDL_timer.c\",\n    \"SDL2/src/timer/windows/SDL_systimer.c\",\n    \"SDL2/src/video/dummy/SDL_nullevents.c\",\n    \"SDL2/src/video/dummy/SDL_nullframebuffer.c\",\n    \"SDL2/src/video/dummy/SDL_nullvideo.c\",\n    \"SDL2/src/video/SDL_blit.c\",\n    \"SDL2/src/video/SDL_blit_0.c\",\n    \"SDL2/src/video/SDL_blit_1.c\",\n    \"SDL2/src/video/SDL_blit_A.c\",\n    \"SDL2/src/video/SDL_blit_auto.c\",\n    \"SDL2/src/video/SDL_blit_copy.c\",\n    \"SDL2/src/video/SDL_blit_N.c\",\n    \"SDL2/src/video/SDL_blit_slow.c\",\n    \"SDL2/src/video/SDL_bmp.c\",\n    \"SDL2/src/video/SDL_clipboard.c\",\n    \"SDL2/src/video/SDL_egl.c\",\n    \"SDL2/src/video/SDL_fillrect.c\",\n    \"SDL2/src/video/SDL_pixels.c\",\n    \"SDL2/src/video/SDL_rect.c\",\n    \"SDL2/src/video/SDL_RLEaccel.c\",\n    \"SDL2/src/video/SDL_shape.c\",\n    \"SDL2/src/video/SDL_stretch.c\",\n    \"SDL2/src/video/SDL_surface.c\",\n    \"SDL2/src/video/SDL_video.c\",\n    \"SDL2/src/video/SDL_vulkan_utils.c\",\n    \"SDL2/src/video/SDL_yuv.c\",\n    \"SDL2/src/video/windows/SDL_windowsclipboard.c\",\n    \"SDL2/src/video/windows/SDL_windowsevents.c\",\n    \"SDL2/src/video/windows/SDL_windowsframebuffer.c\",\n    \"SDL2/src/video/windows/SDL_windowskeyboard.c\",\n    \"SDL2/src/video/windows/SDL_windowsmessagebox.c\",\n    \"SDL2/src/video/windows/SDL_windowsmodes.c\",\n    \"SDL2/src/video/windows/SDL_windowsmouse.c\",\n    \"SDL2/src/video/windows/SDL_windowsopengl.c\",\n    \"SDL2/src/video/windows/SDL_windowsopengles.c\",\n    \"SDL2/src/video/windows/SDL_windowsshape.c\",\n    \"SDL2/src/video/windows/SDL_windowsvideo.c\",\n    \"SDL2/src/video/windows/SDL_windowsvulkan.c\",\n    \"SDL2/src/video/windows/SDL_windowswindow.c\",\n    \"SDL2/src/video/yuv2rgb/yuv_rgb.c\",\n  })\n"
  },
  {
    "path": "third_party/SDL2.lua",
    "content": "--\n-- On Linux we build against the system version (libsdl2-dev for building),\n-- since SDL2 is our robust API there like DirectX is on Windows.\n--\n\nlocal sdl2_sys_includedirs = {}\nlocal third_party_path = os.getcwd()\n\nif os.istarget(\"windows\") then\n  -- build ourselves\n  include(\"SDL2-static.lua\")\nelse\n  -- use system libraries\n  local result, code, what = os.outputof(\"sdl2-config --cflags\")\n  if result then\n    for inc in string.gmatch(result, \"-I([%S]+)\") do\n      table.insert(sdl2_sys_includedirs, inc)\n    end\n  else\n    error(\"Failed to run 'sdl2-config'. Are libsdl2 development files installed?\")\n  end\nend\n\n\n--\n-- Call this function in project scope to include the SDL2 headers.\n--\nfunction sdl2_include()\n  filter(\"platforms:Windows\")\n    includedirs({\n      path.getrelative(\".\", third_party_path) .. \"/SDL2/include\",\n    })\n  filter(\"platforms:Linux or platforms:Mac\")\n    includedirs(sdl2_sys_includedirs)\n  filter({})\nend\n"
  },
  {
    "path": "third_party/aes_128.lua",
    "content": "group(\"third_party\")\nproject(\"aes_128\")\n  uuid(\"b50458bf-dd83-4c1a-8cad-61f5fbbfd720\")\n  kind(\"StaticLib\")\n  language(\"C\")\n  defines({\n    \"_LIB\",\n  })\n  includedirs({\n    \"aes_128\",\n  })\n  files({\n    \"aes_128/aes.h\",\n    \"aes_128/unroll/aes.c\",\n  })\n"
  },
  {
    "path": "third_party/binutils/README.md",
    "content": "The patch found in this folder is for the binutils-2.24 snapshot.\nIt's a rebase of Sebastian Biallas' ancient patch that was never upstreamed into\nmainline binutils: https://sourceware.org/ml/binutils/2007-03/msg00366.html\n\nYou can find a snapshot of 2.24 here:\nhttp://mirrors.kernel.org/sourceware/binutils/releases/binutils-2.24.tar.gz\n\nBuild on cygwin with: `bash -x -o igncr build.sh`\n"
  },
  {
    "path": "third_party/binutils/build.sh",
    "content": "#!/usr/bin/env bash\nset -e\n\nTHIS_SCRIPT_DIR=$( cd \"$( dirname \"$0\" )\" && pwd )\n\nSNAPSHOT_VERSION=2.24\necho \"\"\necho \"Building binutils from snapshot version $SNAPSHOT_VERSION...\"\n\necho \"\"\necho \"Ensure you have the following packages installed:\"\necho \"  build-essential texinfo flex bison\"\n\necho \"\"\necho \"Removing old output...\"\nrm -rf ./bin\nrm -rf ./powerpc-none-elf\nrm -rf ./share\n\nSNAPSHOT_FILE=binutils-$SNAPSHOT_VERSION.tar.gz\nif [ ! -f $SNAPSHOT_FILE ]; then\n  echo \"\"\n  echo \"Grabbing binutils snapshot $SNAPSHOT_FILE...\"\n  curl -nv http://mirrors.kernel.org/sourceware/binutils/releases/$SNAPSHOT_FILE > $SNAPSHOT_FILE\nelse\n  echo \"\"\n  echo \"Reusing existing binutils snapshot file $SNAPSHOT_FILE...\"\nfi\n\necho \"\"\necho \"Extracting binutils snapshot $SNAPSHOT_FILE...\"\ntar zxf $SNAPSHOT_FILE\n\ncd binutils-$SNAPSHOT_VERSION/\n\necho \"\"\necho \"Patching binutils with vmx128 support...\"\npatch -p0 < $THIS_SCRIPT_DIR/binutils-$SNAPSHOT_VERSION-vmx128.patch\n\necho \"\"\necho \"Running ./configure...\"\n./configure \\\n    --disable-debug \\\n    --disable-dependency-tracking \\\n    --disable-werror \\\n    --enable-interwork \\\n    --enable-multilib \\\n    --target=powerpc-none-elf \\\n    --with-gnu-ld \\\n    --with-gnu-as \\\n    --prefix=$THIS_SCRIPT_DIR\n\necho \"\"\necho \"Running make...\"\nmake\n\necho \"\"\necho \"Running make install...\"\nmake install\n\ncd ..\n\necho \"\"\necho \"Cleaning up binutils build temp\"\n#rm -rf ./binutils-$SNAPSHOT_VERSION\n"
  },
  {
    "path": "third_party/capstone.lua",
    "content": "group(\"third_party\")\nproject(\"capstone\")\n  uuid(\"b3a89f7e-bb02-4945-ae75-219caed6afa2\")\n  kind(\"StaticLib\")\n  language(\"C\")\n  defines({\n    \"CAPSTONE_X86_ATT_DISABLE\",\n    \"CAPSTONE_DIET_NO\",\n    \"CAPSTONE_X86_REDUCE_NO\",\n    \"CAPSTONE_HAS_X86\",\n    \"CAPSTONE_USE_SYS_DYN_MEM\",\n    \"_LIB\",\n  })\n  includedirs({\n    \"capstone\",\n    \"capstone/include\",\n  })\n  files({\n    \"capstone/cs.c\",\n    \"capstone/cs_priv.h\",\n    \"capstone/LEB128.h\",\n    \"capstone/MathExtras.h\",\n    \"capstone/MCDisassembler.h\",\n    \"capstone/MCFixedLenDisassembler.h\",\n    \"capstone/MCInst.c\",\n    \"capstone/MCInst.h\",\n    \"capstone/MCInstrDesc.c\",\n    \"capstone/MCInstrDesc.h\",\n    \"capstone/MCRegisterInfo.c\",\n    \"capstone/MCRegisterInfo.h\",\n    \"capstone/SStream.c\",\n    \"capstone/SStream.h\",\n    \"capstone/utils.c\",\n    \"capstone/utils.h\",\n\n    \"capstone/arch/X86/*.c\",\n    \"capstone/arch/X86/*.h\",\n    \"capstone/arch/X86/*.inc\",\n  })\n  force_compile_as_c({\n    \"capstone/**.c\",\n    \"capstone/arch/X86/**.c\",\n  })\n"
  },
  {
    "path": "third_party/clang-format/LICENSE.TXT",
    "content": "==============================================================================\nLLVM Release License\n==============================================================================\nUniversity of Illinois/NCSA\nOpen Source License\n\nCopyright (c) 2007-2016 University of Illinois at Urbana-Champaign.\nAll rights reserved.\n\nDeveloped by:\n\n    LLVM Team\n\n    University of Illinois at Urbana-Champaign\n\n    http://llvm.org\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal with\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimers.\n\n    * Redistributions in binary form must reproduce the above copyright notice,\n      this list of conditions and the following disclaimers in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the names of the LLVM Team, University of Illinois at\n      Urbana-Champaign, nor the names of its contributors may be used to\n      endorse or promote products derived from this Software without specific\n      prior written permission.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE\nCONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE\nSOFTWARE.\n\n==============================================================================\nThe LLVM software contains code written by third parties.  Such software will\nhave its own individual LICENSE.TXT file in the directory in which it appears.\nThis file will describe the copyrights, license, and restrictions which apply\nto that code.\n\nThe disclaimer of warranty in the University of Illinois Open Source License\napplies to all code in the LLVM Distribution, and nothing in any of the\nother licenses gives permission to use the names of the LLVM Team or the\nUniversity of Illinois to endorse or promote products derived from this\nSoftware.\n\nThe following pieces of software have additional or alternate copyrights,\nlicenses, and/or restrictions:\n\nProgram             Directory\n-------             ---------\n<none yet>\n\n"
  },
  {
    "path": "third_party/clang-format/clang-format-bbedit.applescript",
    "content": "-- In this file, change \"/path/to/\" to the path where you installed clang-format\n-- and save it to ~/Library/Application Support/BBEdit/Scripts. You can then\n-- select the script from the Script menu and clang-format will format the\n-- selection. Note that you can rename the menu item by renaming the script, and\n-- can assign the menu item a keyboard shortcut in the BBEdit preferences, under\n-- Menus & Shortcuts.\non urlToPOSIXPath(theURL)\n\treturn do shell script \"python -c \\\"import urllib, urlparse, sys; print urllib.unquote(urlparse.urlparse(sys.argv[1])[2])\\\" \" & quoted form of theURL\nend urlToPOSIXPath\n\ntell application \"BBEdit\"\n\tset selectionOffset to characterOffset of selection\n\tset selectionLength to length of selection\n\tset fileURL to URL of text document 1\nend tell\n\nset filePath to urlToPOSIXPath(fileURL)\nset newContents to do shell script \"/path/to/clang-format -offset=\" & selectionOffset & \" -length=\" & selectionLength & \" \" & quoted form of filePath\n\ntell application \"BBEdit\"\n\t-- \"set contents of text document 1 to newContents\" scrolls to the bottom while\n\t-- replacing a selection flashes a bit but doesn't affect the scroll position.\n\tset currentLength to length of contents of text document 1\n\tselect characters 1 thru currentLength of text document 1\n\tset text of selection to newContents\n\tselect characters selectionOffset thru (selectionOffset + selectionLength - 1) of text document 1\nend tell\n"
  },
  {
    "path": "third_party/clang-format/clang-format-diff.py",
    "content": "#!/usr/bin/env python3\n#\n#===- clang-format-diff.py - ClangFormat Diff Reformatter ----*- python -*--===#\n#\n#                     The LLVM Compiler Infrastructure\n#\n# This file is distributed under the University of Illinois Open Source\n# License. See LICENSE.TXT for details.\n#\n#===------------------------------------------------------------------------===#\n\nr\"\"\"\nClangFormat Diff Reformatter\n============================\n\nThis script reads input from a unified diff and reformats all the changed\nlines. This is useful to reformat all the lines touched by a specific patch.\nExample usage for git/svn users:\n\n  git diff -U0 --no-color HEAD^ | clang-format-diff.py -p1 -i\n  svn diff --diff-cmd=diff -x-U0 | clang-format-diff.py -i\n\n\"\"\"\n\nimport argparse\nimport difflib\nimport re\nimport string\nimport subprocess\nimport StringIO\nimport sys\n\n\ndef main():\n  parser = argparse.ArgumentParser(description=\n                                   'Reformat changed lines in diff. Without -i '\n                                   'option just output the diff that would be '\n                                   'introduced.')\n  parser.add_argument('-i', action='store_true', default=False,\n                      help='apply edits to files instead of displaying a diff')\n  parser.add_argument('-p', metavar='NUM', default=0,\n                      help='strip the smallest prefix containing P slashes')\n  parser.add_argument('-regex', metavar='PATTERN', default=None,\n                      help='custom pattern selecting file paths to reformat '\n                      '(case sensitive, overrides -iregex)')\n  parser.add_argument('-iregex', metavar='PATTERN', default=\n                      r'.*\\.(cpp|cc|c\\+\\+|cxx|c|cl|h|hpp|m|mm|inc|js|ts|proto'\n                      r'|protodevel|java)',\n                      help='custom pattern selecting file paths to reformat '\n                      '(case insensitive, overridden by -regex)')\n  parser.add_argument('-sort-includes', action='store_true', default=False,\n                      help='let clang-format sort include blocks')\n  parser.add_argument('-v', '--verbose', action='store_true',\n                      help='be more verbose, ineffective without -i')\n  parser.add_argument('-style',\n                      help='formatting style to apply (LLVM, Google, Chromium, '\n                      'Mozilla, WebKit)')\n  parser.add_argument('-binary', default='clang-format',\n                      help='location of binary to use for clang-format')\n  args = parser.parse_args()\n\n  # Extract changed lines for each file.\n  filename = None\n  lines_by_file = {}\n  for line in sys.stdin:\n    match = re.search('^\\+\\+\\+\\ (.*?/){%s}(\\S*)' % args.p, line)\n    if match:\n      filename = match.group(2)\n    if filename == None:\n      continue\n\n    if args.regex is not None:\n      if not re.match('^%s$' % args.regex, filename):\n        continue\n    else:\n      if not re.match('^%s$' % args.iregex, filename, re.IGNORECASE):\n        continue\n\n    match = re.search('^@@.*\\+(\\d+)(,(\\d+))?', line)\n    if match:\n      start_line = int(match.group(1))\n      line_count = 1\n      if match.group(3):\n        line_count = int(match.group(3))\n      if line_count == 0:\n        continue\n      end_line = start_line + line_count - 1;\n      lines_by_file.setdefault(filename, []).extend(\n          ['-lines', str(start_line) + ':' + str(end_line)])\n\n  # Reformat files containing changes in place.\n  for filename, lines in lines_by_file.iteritems():\n    if args.i and args.verbose:\n      print 'Formatting', filename\n    command = [args.binary, filename]\n    if args.i:\n      command.append('-i')\n    if args.sort_includes:\n      command.append('-sort-includes')\n    command.extend(lines)\n    if args.style:\n      command.extend(['-style', args.style])\n    p = subprocess.Popen(command, stdout=subprocess.PIPE,\n                         stderr=None, stdin=subprocess.PIPE)\n    stdout, stderr = p.communicate()\n    if p.returncode != 0:\n      sys.exit(p.returncode);\n\n    if not args.i:\n      with open(filename) as f:\n        code = f.readlines()\n      formatted_code = StringIO.StringIO(stdout).readlines()\n      diff = difflib.unified_diff(code, formatted_code,\n                                  filename, filename,\n                                  '(before formatting)', '(after formatting)')\n      diff_string = string.join(diff, '')\n      if len(diff_string) > 0:\n        sys.stdout.write(diff_string)\n\nif __name__ == '__main__':\n  main()\n"
  },
  {
    "path": "third_party/clang-format/clang-format-sublime.py",
    "content": "# This file is a minimal clang-format sublime-integration. To install:\n# - Change 'binary' if clang-format is not on the path (see below).\n# - Put this file into your sublime Packages directory, e.g. on Linux:\n#     ~/.config/sublime-text-2/Packages/User/clang-format-sublime.py\n# - Add a key binding:\n#     { \"keys\": [\"ctrl+shift+c\"], \"command\": \"clang_format\" },\n#\n# With this integration you can press the bound key and clang-format will\n# format the current lines and selections for all cursor positions. The lines\n# or regions are extended to the next bigger syntactic entities.\n#\n# It operates on the current, potentially unsaved buffer and does not create\n# or save any files. To revert a formatting, just undo.\n\nfrom __future__ import print_function\nimport sublime\nimport sublime_plugin\nimport subprocess\n\n# Change this to the full path if clang-format is not on the path.\nbinary = 'clang-format'\n\n# Change this to format according to other formatting styles. See the output of\n# 'clang-format --help' for a list of supported styles. The default looks for\n# a '.clang-format' or '_clang-format' file to indicate the style that should be\n# used.\nstyle = 'file'\n\nclass ClangFormatCommand(sublime_plugin.TextCommand):\n  def run(self, edit):\n    encoding = self.view.encoding()\n    if encoding == 'Undefined':\n      encoding = 'utf-8'\n    regions = []\n    command = [binary, '-style', style]\n    for region in self.view.sel():\n      regions.append(region)\n      region_offset = min(region.a, region.b)\n      region_length = abs(region.b - region.a)\n      command.extend(['-offset', str(region_offset),\n                      '-length', str(region_length),\n                      '-assume-filename', str(self.view.file_name())])\n    old_viewport_position = self.view.viewport_position()\n    buf = self.view.substr(sublime.Region(0, self.view.size()))\n    p = subprocess.Popen(command, stdout=subprocess.PIPE,\n                         stderr=subprocess.PIPE, stdin=subprocess.PIPE)\n    output, error = p.communicate(buf.encode(encoding))\n    if error:\n      print(error)\n    self.view.replace(\n        edit, sublime.Region(0, self.view.size()),\n        output.decode(encoding))\n    self.view.sel().clear()\n    for region in regions:\n      self.view.sel().add(region)\n    # FIXME: Without the 10ms delay, the viewport sometimes jumps.\n    sublime.set_timeout(lambda: self.view.set_viewport_position(\n      old_viewport_position, False), 10)\n"
  },
  {
    "path": "third_party/clang-format/clang-format.el",
    "content": ";;; clang-format.el --- Format code using clang-format  -*- lexical-binding: t; -*-\n\n;; Keywords: tools, c\n;; Package-Requires: ((cl-lib \"0.3\"))\n\n;;; Commentary:\n\n;; This package allows to filter code through clang-format to fix its formatting.\n;; clang-format is a tool that formats C/C++/Obj-C code according to a set of\n;; style options, see <http://clang.llvm.org/docs/ClangFormatStyleOptions.html>.\n;; Note that clang-format 3.4 or newer is required.\n\n;; clang-format.el is available via MELPA and can be installed via\n;;\n;;   M-x package-install clang-format\n;;\n;; when (\"melpa\" . \"http://melpa.org/packages/\") is included in\n;; `package-archives'.  Alternatively, ensure the directory of this\n;; file is in your `load-path' and add\n;;\n;;   (require 'clang-format)\n;;\n;; to your .emacs configuration.\n\n;; You may also want to bind `clang-format-region' to a key:\n;;\n;;   (global-set-key [C-M-tab] 'clang-format-region)\n\n;;; Code:\n\n(require 'cl-lib)\n(require 'xml)\n\n(defgroup clang-format nil\n  \"Format code using clang-format.\"\n  :group 'tools)\n\n(defcustom clang-format-executable\n  (or (executable-find \"clang-format\")\n      \"clang-format\")\n  \"Location of the clang-format executable.\n\nA string containing the name or the full path of the executable.\"\n  :group 'clang-format\n  :type '(file :must-match t)\n  :risky t)\n\n(defcustom clang-format-style \"file\"\n  \"Style argument to pass to clang-format.\n\nBy default clang-format will load the style configuration from\na file named .clang-format located in one of the parent directories\nof the buffer.\"\n  :group 'clang-format\n  :type 'string\n  :safe #'stringp)\n(make-variable-buffer-local 'clang-format-style)\n\n(defun clang-format--extract (xml-node)\n  \"Extract replacements and cursor information from XML-NODE.\"\n  (unless (and (listp xml-node) (eq (xml-node-name xml-node) 'replacements))\n    (error \"Expected <replacements> node\"))\n  (let ((nodes (xml-node-children xml-node))\n        (incomplete-format (xml-get-attribute xml-node 'incomplete_format))\n        replacements\n        cursor)\n    (dolist (node nodes)\n      (when (listp node)\n        (let* ((children (xml-node-children node))\n               (text (car children)))\n          (cl-case (xml-node-name node)\n            ('replacement\n             (let* ((offset (xml-get-attribute-or-nil node 'offset))\n                    (length (xml-get-attribute-or-nil node 'length)))\n               (when (or (null offset) (null length))\n                 (error \"<replacement> node does not have offset and length attributes\"))\n               (when (cdr children)\n                 (error \"More than one child node in <replacement> node\"))\n\n               (setq offset (string-to-number offset))\n               (setq length (string-to-number length))\n               (push (list offset length text) replacements)))\n            ('cursor\n             (setq cursor (string-to-number text)))))))\n\n    ;; Sort by decreasing offset, length.\n    (setq replacements (sort (delq nil replacements)\n                             (lambda (a b)\n                               (or (> (car a) (car b))\n                                   (and (= (car a) (car b))\n                                        (> (cadr a) (cadr b)))))))\n\n    (list replacements cursor (string= incomplete-format \"true\"))))\n\n(defun clang-format--replace (offset length &optional text)\n  \"Replace the region defined by OFFSET and LENGTH with TEXT.\nOFFSET and LENGTH are measured in bytes, not characters.  OFFSET\nis a zero-based file offset, assuming ‘utf-8-unix’ coding.\"\n  (let ((start (clang-format--filepos-to-bufferpos offset 'exact 'utf-8-unix))\n        (end (clang-format--filepos-to-bufferpos (+ offset length) 'exact\n                                                 'utf-8-unix)))\n    (goto-char start)\n    (delete-region start end)\n    (when text\n      (insert text))))\n\n;; ‘bufferpos-to-filepos’ and ‘filepos-to-bufferpos’ are new in Emacs 25.1.\n;; Provide fallbacks for older versions.\n(defalias 'clang-format--bufferpos-to-filepos\n  (if (fboundp 'bufferpos-to-filepos)\n      'bufferpos-to-filepos\n    (lambda (position &optional _quality _coding-system)\n      (1- (position-bytes position)))))\n\n(defalias 'clang-format--filepos-to-bufferpos\n  (if (fboundp 'filepos-to-bufferpos)\n      'filepos-to-bufferpos\n    (lambda (byte &optional _quality _coding-system)\n      (byte-to-position (1+ byte)))))\n\n;;;###autoload\n(defun clang-format-region (start end &optional style)\n  \"Use clang-format to format the code between START and END according to STYLE.\nIf called interactively uses the region or the current statement if there\nis no active region.  If no style is given uses `clang-format-style'.\"\n  (interactive\n   (if (use-region-p)\n       (list (region-beginning) (region-end))\n     (list (point) (point))))\n\n  (unless style\n    (setq style clang-format-style))\n\n  (let ((file-start (clang-format--bufferpos-to-filepos start 'approximate\n                                                        'utf-8-unix))\n        (file-end (clang-format--bufferpos-to-filepos end 'approximate\n                                                      'utf-8-unix))\n        (cursor (clang-format--bufferpos-to-filepos (point) 'exact 'utf-8-unix))\n        (temp-buffer (generate-new-buffer \" *clang-format-temp*\"))\n        (temp-file (make-temp-file \"clang-format\"))\n        ;; Output is XML, which is always UTF-8.  Input encoding should match\n        ;; the encoding used to convert between buffer and file positions,\n        ;; otherwise the offsets calculated above are off.  For simplicity, we\n        ;; always use ‘utf-8-unix’ and ignore the buffer coding system.\n        (default-process-coding-system '(utf-8-unix . utf-8-unix)))\n    (unwind-protect\n        (let ((status (call-process-region\n                       nil nil clang-format-executable\n                       nil `(,temp-buffer ,temp-file) nil\n\n                       \"-output-replacements-xml\"\n                       \"-assume-filename\" (or (buffer-file-name) \"\")\n                       \"-style\" style\n                       \"-offset\" (number-to-string file-start)\n                       \"-length\" (number-to-string (- file-end file-start))\n                       \"-cursor\" (number-to-string cursor)))\n              (stderr (with-temp-buffer\n                        (unless (zerop (cadr (insert-file-contents temp-file)))\n                          (insert \": \"))\n                        (buffer-substring-no-properties\n                         (point-min) (line-end-position)))))\n          (cond\n           ((stringp status)\n            (error \"(clang-format killed by signal %s%s)\" status stderr))\n           ((not (zerop status))\n            (error \"(clang-format failed with code %d%s)\" status stderr)))\n\n          (cl-destructuring-bind (replacements cursor incomplete-format)\n              (with-current-buffer temp-buffer\n                (clang-format--extract (car (xml-parse-region))))\n            (save-excursion\n              (dolist (rpl replacements)\n                (apply #'clang-format--replace rpl)))\n            (when cursor\n              (goto-char (clang-format--filepos-to-bufferpos cursor 'exact\n                                                             'utf-8-unix)))\n            (if incomplete-format\n                (message \"(clang-format: incomplete (syntax errors)%s)\" stderr)\n              (message \"(clang-format: success%s)\" stderr))))\n      (delete-file temp-file)\n      (when (buffer-name temp-buffer) (kill-buffer temp-buffer)))))\n\n;;;###autoload\n(defun clang-format-buffer (&optional style)\n  \"Use clang-format to format the current buffer according to STYLE.\"\n  (interactive)\n  (clang-format-region (point-min) (point-max) style))\n\n;;;###autoload\n(defalias 'clang-format 'clang-format-region)\n\n(provide 'clang-format)\n;;; clang-format.el ends here\n"
  },
  {
    "path": "third_party/clang-format/clang-format.py",
    "content": "# This file is a minimal clang-format vim-integration. To install:\n# - Change 'binary' if clang-format is not on the path (see below).\n# - Add to your .vimrc:\n#\n#   map <C-I> :pyf <path-to-this-file>/clang-format.py<cr>\n#   imap <C-I> <c-o>:pyf <path-to-this-file>/clang-format.py<cr>\n#\n# The first line enables clang-format for NORMAL and VISUAL mode, the second\n# line adds support for INSERT mode. Change \"C-I\" to another binding if you\n# need clang-format on a different key (C-I stands for Ctrl+i).\n#\n# With this integration you can press the bound key and clang-format will\n# format the current line in NORMAL and INSERT mode or the selected region in\n# VISUAL mode. The line or region is extended to the next bigger syntactic\n# entity.\n#\n# You can also pass in the variable \"l:lines\" to choose the range for\n# formatting. This variable can either contain \"<start line>:<end line>\" or\n# \"all\" to format the full file. So, to format the full file, write a function\n# like:\n# :function FormatFile()\n# :  let l:lines=\"all\"\n# :  pyf <path-to-this-file>/clang-format.py\n# :endfunction\n#\n# It operates on the current, potentially unsaved buffer and does not create\n# or save any files. To revert a formatting, just undo.\nfrom __future__ import print_function\n\nimport difflib\nimport json\nimport platform\nimport subprocess\nimport sys\nimport vim\n\n# set g:clang_format_path to the path to clang-format if it is not on the path\n# Change this to the full path if clang-format is not on the path.\nbinary = 'clang-format'\nif vim.eval('exists(\"g:clang_format_path\")') == \"1\":\n  binary = vim.eval('g:clang_format_path')\n\n# Change this to format according to other formatting styles. See the output of\n# 'clang-format --help' for a list of supported styles. The default looks for\n# a '.clang-format' or '_clang-format' file to indicate the style that should be\n# used.\nstyle = 'file'\nfallback_style = None\nif vim.eval('exists(\"g:clang_format_fallback_style\")') == \"1\":\n  fallback_style = vim.eval('g:clang_format_fallback_style')\n\ndef get_buffer(encoding):\n  if platform.python_version_tuple()[0] == '3':\n    return vim.current.buffer\n  return [ line.decode(encoding) for line in vim.current.buffer ]\n\ndef main():\n  # Get the current text.\n  encoding = vim.eval(\"&encoding\")\n  buf = get_buffer(encoding)\n  text = '\\n'.join(buf)\n\n  # Determine range to format.\n  if vim.eval('exists(\"l:lines\")') == '1':\n    lines = vim.eval('l:lines')\n  elif vim.eval('exists(\"l:formatdiff\")') == '1':\n    with open(vim.current.buffer.name, 'r') as f:\n      ondisk = f.read().splitlines();\n    sequence = difflib.SequenceMatcher(None, ondisk, vim.current.buffer)\n    lines = []\n    for op in reversed(sequence.get_opcodes()):\n      if op[0] not in ['equal', 'delete']:\n        lines += ['-lines', '%s:%s' % (op[3] + 1, op[4])]\n    if lines == []:\n      return\n  else:\n    lines = ['-lines', '%s:%s' % (vim.current.range.start + 1,\n                                  vim.current.range.end + 1)]\n\n  # Determine the cursor position.\n  cursor = int(vim.eval('line2byte(line(\".\"))+col(\".\")')) - 2\n  if cursor < 0:\n    print('Couldn\\'t determine cursor position. Is your file empty?')\n    return\n\n  # Avoid flashing an ugly, ugly cmd prompt on Windows when invoking clang-format.\n  startupinfo = None\n  if sys.platform.startswith('win32'):\n    startupinfo = subprocess.STARTUPINFO()\n    startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW\n    startupinfo.wShowWindow = subprocess.SW_HIDE\n\n  # Call formatter.\n  command = [binary, '-style', style, '-cursor', str(cursor)]\n  if lines != 'all':\n    command += lines\n  if fallback_style:\n    command.extend(['-fallback-style', fallback_style])\n  if vim.current.buffer.name:\n    command.extend(['-assume-filename', vim.current.buffer.name])\n  p = subprocess.Popen(command,\n                       stdout=subprocess.PIPE, stderr=subprocess.PIPE,\n                       stdin=subprocess.PIPE, startupinfo=startupinfo)\n  stdout, stderr = p.communicate(input=text.encode(encoding))\n\n  # If successful, replace buffer contents.\n  if stderr:\n    print(stderr)\n\n  if not stdout:\n    print(\n        'No output from clang-format (crashed?).\\n'\n        'Please report to bugs.llvm.org.'\n    )\n  else:\n    lines = stdout.decode(encoding).split('\\n')\n    output = json.loads(lines[0])\n    lines = lines[1:]\n    sequence = difflib.SequenceMatcher(None, buf, lines)\n    for op in reversed(sequence.get_opcodes()):\n      if op[0] is not 'equal':\n        vim.current.buffer[op[1]:op[2]] = lines[op[3]:op[4]]\n    if output.get('IncompleteFormat'):\n      print('clang-format: incomplete (syntax errors)')\n    vim.command('goto %d' % (output['Cursor'] + 1))\n\nmain()\n"
  },
  {
    "path": "third_party/clang-format/git-clang-format",
    "content": "#!/usr/bin/env python3\n#\n#===- git-clang-format - ClangFormat Git Integration ---------*- python -*--===#\n#\n#                     The LLVM Compiler Infrastructure\n#\n# This file is distributed under the University of Illinois Open Source\n# License. See LICENSE.TXT for details.\n#\n#===------------------------------------------------------------------------===#\n\nr\"\"\"                                                                             \nclang-format git integration                                                     \n============================                                                     \n                                                                                 \nThis file provides a clang-format integration for git. Put it somewhere in your  \npath and ensure that it is executable. Then, \"git clang-format\" will invoke      \nclang-format on the changes in current files or a specific commit.               \n                                                                                 \nFor further details, run:                                                        \ngit clang-format -h                                                              \n                                                                                 \nRequires Python 2.7 or Python 3                                                  \n\"\"\"               \n\nfrom __future__ import print_function\nimport argparse\nimport collections\nimport contextlib\nimport errno\nimport os\nimport re\nimport subprocess\nimport sys\n\nusage = 'git clang-format [OPTIONS] [<commit>] [<commit>] [--] [<file>...]'\n\ndesc = '''\nIf zero or one commits are given, run clang-format on all lines that differ\nbetween the working directory and <commit>, which defaults to HEAD.  Changes are\nonly applied to the working directory.\n\nIf two commits are given (requires --diff), run clang-format on all lines in the\nsecond <commit> that differ from the first <commit>.\n\nThe following git-config settings set the default of the corresponding option:\n  clangFormat.binary\n  clangFormat.commit\n  clangFormat.extension\n  clangFormat.style\n'''\n\n# Name of the temporary index file in which save the output of clang-format.\n# This file is created within the .git directory.\ntemp_index_basename = 'clang-format-index'\n\n\nRange = collections.namedtuple('Range', 'start, count')\n\n\ndef main():\n  config = load_git_config()\n\n  # In order to keep '--' yet allow options after positionals, we need to\n  # check for '--' ourselves.  (Setting nargs='*' throws away the '--', while\n  # nargs=argparse.REMAINDER disallows options after positionals.)\n  argv = sys.argv[1:]\n  try:\n    idx = argv.index('--')\n  except ValueError:\n    dash_dash = []\n  else:\n    dash_dash = argv[idx:]\n    argv = argv[:idx]\n\n  default_extensions = ','.join([\n      # From clang/lib/Frontend/FrontendOptions.cpp, all lower case\n      'c', 'h',  # C\n      'm',  # ObjC\n      'mm',  # ObjC++\n      'cc', 'cp', 'cpp', 'c++', 'cxx', 'hpp',  # C++\n      # Other languages that clang-format supports\n      'proto', 'protodevel',  # Protocol Buffers\n      'java',  # Java\n      'js',  # JavaScript\n      'ts',  # TypeScript\n      ])\n\n  p = argparse.ArgumentParser(\n    usage=usage, formatter_class=argparse.RawDescriptionHelpFormatter,\n    description=desc)\n  p.add_argument('--binary',\n                 default=config.get('clangformat.binary', 'clang-format'),\n                 help='path to clang-format'),\n  p.add_argument('--commit',\n                 default=config.get('clangformat.commit', 'HEAD'),\n                 help='default commit to use if none is specified'),\n  p.add_argument('--diff', action='store_true',\n                 help='print a diff instead of applying the changes')\n  p.add_argument('--extensions',\n                 default=config.get('clangformat.extensions',\n                                    default_extensions),\n                 help=('comma-separated list of file extensions to format, '\n                       'excluding the period and case-insensitive')),\n  p.add_argument('-f', '--force', action='store_true',\n                 help='allow changes to unstaged files')\n  p.add_argument('-p', '--patch', action='store_true',\n                 help='select hunks interactively')\n  p.add_argument('-q', '--quiet', action='count', default=0,\n                 help='print less information')\n  p.add_argument('--style',\n                 default=config.get('clangformat.style', None),\n                 help='passed to clang-format'),\n  p.add_argument('-v', '--verbose', action='count', default=0,\n                 help='print extra information')\n  # We gather all the remaining positional arguments into 'args' since we need\n  # to use some heuristics to determine whether or not <commit> was present.\n  # However, to print pretty messages, we make use of metavar and help.\n  p.add_argument('args', nargs='*', metavar='<commit>',\n                 help='revision from which to compute the diff')\n  p.add_argument('ignored', nargs='*', metavar='<file>...',\n                 help='if specified, only consider differences in these files')\n  opts = p.parse_args(argv)\n\n  opts.verbose -= opts.quiet\n  del opts.quiet\n\n  commits, files = interpret_args(opts.args, dash_dash, opts.commit)\n  if len(commits) > 1:\n    if not opts.diff:\n      die('--diff is required when two commits are given')\n  else:\n    if len(commits) > 2:\n      die('at most two commits allowed; %d given' % len(commits))\n  changed_lines = compute_diff_and_extract_lines(commits, files)\n  if opts.verbose >= 1:\n    ignored_files = set(changed_lines)\n  filter_by_extension(changed_lines, opts.extensions.lower().split(','))\n  if opts.verbose >= 1:\n    ignored_files.difference_update(changed_lines)\n    if ignored_files:\n      print('Ignoring changes in the following files (wrong extension):')\n      for filename in ignored_files:\n        print('    %s' % filename)\n    if changed_lines:\n      print('Running clang-format on the following files:')\n      for filename in changed_lines:\n        print('    %s' % filename)\n  if not changed_lines:\n    print('no modified files to format')\n    return\n  # The computed diff outputs absolute paths, so we must cd before accessing\n  # those files.\n  cd_to_toplevel()\n  if len(commits) > 1:\n    old_tree = commits[1]\n    new_tree = run_clang_format_and_save_to_tree(changed_lines,\n                                                 revision=commits[1],\n                                                 binary=opts.binary,\n                                                 style=opts.style)\n  else:\n    old_tree = create_tree_from_workdir(changed_lines)\n    new_tree = run_clang_format_and_save_to_tree(changed_lines,\n                                                 binary=opts.binary,\n                                                 style=opts.style)\n  if opts.verbose >= 1:\n    print('old tree: %s' % old_tree)\n    print('new tree: %s' % new_tree)\n  if old_tree == new_tree:\n    if opts.verbose >= 0:\n      print('clang-format did not modify any files')\n  elif opts.diff:\n    print_diff(old_tree, new_tree)\n  else:\n    changed_files = apply_changes(old_tree, new_tree, force=opts.force,\n                                  patch_mode=opts.patch)\n    if (opts.verbose >= 0 and not opts.patch) or opts.verbose >= 1:\n      print('changed files:')\n      for filename in changed_files:\n        print('    %s' % filename)\n\n\ndef load_git_config(non_string_options=None):\n  \"\"\"Return the git configuration as a dictionary.\n\n  All options are assumed to be strings unless in `non_string_options`, in which\n  is a dictionary mapping option name (in lower case) to either \"--bool\" or\n  \"--int\".\"\"\"\n  if non_string_options is None:\n    non_string_options = {}\n  out = {}\n  for entry in run('git', 'config', '--list', '--null').split('\\0'):\n    if entry:\n      name, value = entry.split('\\n', 1)\n      if name in non_string_options:\n        value = run('git', 'config', non_string_options[name], name)\n      out[name] = value\n  return out\n\n\ndef interpret_args(args, dash_dash, default_commit):\n  \"\"\"Interpret `args` as \"[commits] [--] [files]\" and return (commits, files).\n\n  It is assumed that \"--\" and everything that follows has been removed from\n  args and placed in `dash_dash`.\n\n  If \"--\" is present (i.e., `dash_dash` is non-empty), the arguments to its\n  left (if present) are taken as commits.  Otherwise, the arguments are checked\n  from left to right if they are commits or files.  If commits are not given,\n  a list with `default_commit` is used.\"\"\"\n  if dash_dash:\n    if len(args) == 0:\n      commits = [default_commit]\n    else:\n      commits = args\n    for commit in commits:\n      object_type = get_object_type(commit)\n      if object_type not in ('commit', 'tag'):\n        if object_type is None:\n          die(\"'%s' is not a commit\" % commit)\n        else:\n          die(\"'%s' is a %s, but a commit was expected\" % (commit, object_type))\n    files = dash_dash[1:]\n  elif args:\n    commits = []\n    while args:\n      if not disambiguate_revision(args[0]):\n        break\n      commits.append(args.pop(0))\n    if not commits:\n      commits = [default_commit]\n    files = args\n  else:\n    commits = [default_commit]\n    files = []\n  return commits, files\n\n\ndef disambiguate_revision(value):\n  \"\"\"Returns True if `value` is a revision, False if it is a file, or dies.\"\"\"\n  # If `value` is ambiguous (neither a commit nor a file), the following\n  # command will die with an appropriate error message.\n  run('git', 'rev-parse', value, verbose=False)\n  object_type = get_object_type(value)\n  if object_type is None:\n    return False\n  if object_type in ('commit', 'tag'):\n    return True\n  die('`%s` is a %s, but a commit or filename was expected' %\n      (value, object_type))\n\n\ndef get_object_type(value):\n  \"\"\"Returns a string description of an object's type, or None if it is not\n  a valid git object.\"\"\"\n  cmd = ['git', 'cat-file', '-t', value]\n  p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)\n  stdout, stderr = p.communicate()\n  if p.returncode != 0:\n    return None\n  return convert_string(stdout.strip())\n\n\ndef compute_diff_and_extract_lines(commits, files):\n  \"\"\"Calls compute_diff() followed by extract_lines().\"\"\"\n  diff_process = compute_diff(commits, files)\n  changed_lines = extract_lines(diff_process.stdout)\n  diff_process.stdout.close()\n  diff_process.wait()\n  if diff_process.returncode != 0:\n    # Assume error was already printed to stderr.\n    sys.exit(2)\n  return changed_lines\n\n\ndef compute_diff(commits, files):\n  \"\"\"Return a subprocess object producing the diff from `commits`.\n\n  The return value's `stdin` file object will produce a patch with the\n  differences between the working directory and the first commit if a single\n  one was specified, or the difference between both specified commits, filtered\n  on `files` (if non-empty).  Zero context lines are used in the patch.\"\"\"\n  git_tool = 'diff-index'\n  if len(commits) > 1:\n    git_tool = 'diff-tree'\n  cmd = ['git', git_tool, '-p', '-U0'] + commits + ['--']\n  cmd.extend(files)\n  p = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE)\n  p.stdin.close()\n  return p\n\n\ndef extract_lines(patch_file):\n  \"\"\"Extract the changed lines in `patch_file`.\n\n  The return value is a dictionary mapping filename to a list of (start_line,\n  line_count) pairs.\n\n  The input must have been produced with ``-U0``, meaning unidiff format with\n  zero lines of context.  The return value is a dict mapping filename to a\n  list of line `Range`s.\"\"\"\n  matches = {}\n  for line in patch_file:\n    line = convert_string(line)\n    match = re.search(r'^\\+\\+\\+\\ [^/]+/(.*)', line)\n    if match:\n      filename = match.group(1).rstrip('\\r\\n')\n    match = re.search(r'^@@ -[0-9,]+ \\+(\\d+)(,(\\d+))?', line)\n    if match:\n      start_line = int(match.group(1))\n      line_count = 1\n      if match.group(3):\n        line_count = int(match.group(3))\n      if line_count > 0:\n        matches.setdefault(filename, []).append(Range(start_line, line_count))\n  return matches\n\n\ndef filter_by_extension(dictionary, allowed_extensions):\n  \"\"\"Delete every key in `dictionary` that doesn't have an allowed extension.\n\n  `allowed_extensions` must be a collection of lowercase file extensions,\n  excluding the period.\"\"\"\n  allowed_extensions = frozenset(allowed_extensions)\n  for filename in list(dictionary.keys()):\n    base_ext = filename.rsplit('.', 1)\n    if len(base_ext) == 1 and '' in allowed_extensions:\n        continue\n    if len(base_ext) == 1 or base_ext[1].lower() not in allowed_extensions:\n      del dictionary[filename]\n\n\ndef cd_to_toplevel():\n  \"\"\"Change to the top level of the git repository.\"\"\"\n  toplevel = run('git', 'rev-parse', '--show-toplevel')\n  os.chdir(toplevel)\n\n\ndef create_tree_from_workdir(filenames):\n  \"\"\"Create a new git tree with the given files from the working directory.\n\n  Returns the object ID (SHA-1) of the created tree.\"\"\"\n  return create_tree(filenames, '--stdin')\n\n\ndef run_clang_format_and_save_to_tree(changed_lines, revision=None,\n                                      binary='clang-format', style=None):\n  \"\"\"Run clang-format on each file and save the result to a git tree.\n\n  Returns the object ID (SHA-1) of the created tree.\"\"\"\n  def iteritems(container):\n      try:\n          return container.iteritems() # Python 2\n      except AttributeError:\n          return container.items() # Python 3\n  def index_info_generator():\n    for filename, line_ranges in iteritems(changed_lines):\n      if revision:\n        git_metadata_cmd = ['git', 'ls-tree',\n                            '%s:%s' % (revision, os.path.dirname(filename)),\n                            os.path.basename(filename)]\n        git_metadata = subprocess.Popen(git_metadata_cmd, stdin=subprocess.PIPE,\n                                        stdout=subprocess.PIPE)\n        stdout = git_metadata.communicate()[0]\n        mode = oct(int(stdout.split()[0], 8))\n      else:\n        mode = oct(os.stat(filename).st_mode)\n      # Adjust python3 octal format so that it matches what git expects\n      if mode.startswith('0o'):\n          mode = '0' + mode[2:]\n      blob_id = clang_format_to_blob(filename, line_ranges,\n                                     revision=revision,\n                                     binary=binary,\n                                     style=style)\n      yield '%s %s\\t%s' % (mode, blob_id, filename)\n  return create_tree(index_info_generator(), '--index-info')\n\n\ndef create_tree(input_lines, mode):\n  \"\"\"Create a tree object from the given input.\n\n  If mode is '--stdin', it must be a list of filenames.  If mode is\n  '--index-info' is must be a list of values suitable for \"git update-index\n  --index-info\", such as \"<mode> <SP> <sha1> <TAB> <filename>\".  Any other mode\n  is invalid.\"\"\"\n  assert mode in ('--stdin', '--index-info')\n  cmd = ['git', 'update-index', '--add', '-z', mode]\n  with temporary_index_file():\n    p = subprocess.Popen(cmd, stdin=subprocess.PIPE)\n    for line in input_lines:\n      p.stdin.write(to_bytes('%s\\0' % line))\n    p.stdin.close()\n    if p.wait() != 0:\n      die('`%s` failed' % ' '.join(cmd))\n    tree_id = run('git', 'write-tree')\n    return tree_id\n\n\ndef clang_format_to_blob(filename, line_ranges, revision=None,\n                         binary='clang-format', style=None):\n  \"\"\"Run clang-format on the given file and save the result to a git blob.\n\n  Runs on the file in `revision` if not None, or on the file in the working\n  directory if `revision` is None.\n\n  Returns the object ID (SHA-1) of the created blob.\"\"\"\n  clang_format_cmd = [binary]\n  if style:\n    clang_format_cmd.extend(['-style='+style])\n  clang_format_cmd.extend([\n      '-lines=%s:%s' % (start_line, start_line+line_count-1)\n      for start_line, line_count in line_ranges])\n  if revision:\n    clang_format_cmd.extend(['-assume-filename='+filename])\n    git_show_cmd = ['git', 'cat-file', 'blob', '%s:%s' % (revision, filename)]\n    git_show = subprocess.Popen(git_show_cmd, stdin=subprocess.PIPE,\n                                stdout=subprocess.PIPE)\n    git_show.stdin.close()\n    clang_format_stdin = git_show.stdout\n  else:\n    clang_format_cmd.extend([filename])\n    git_show = None\n    clang_format_stdin = subprocess.PIPE\n  try:\n    clang_format = subprocess.Popen(clang_format_cmd, stdin=clang_format_stdin,\n                                    stdout=subprocess.PIPE)\n    if clang_format_stdin == subprocess.PIPE:\n      clang_format_stdin = clang_format.stdin\n  except OSError as e:\n    if e.errno == errno.ENOENT:\n      die('cannot find executable \"%s\"' % binary)\n    else:\n      raise\n  clang_format_stdin.close()\n  hash_object_cmd = ['git', 'hash-object', '-w', '--path='+filename, '--stdin']\n  hash_object = subprocess.Popen(hash_object_cmd, stdin=clang_format.stdout,\n                                 stdout=subprocess.PIPE)\n  clang_format.stdout.close()\n  stdout = hash_object.communicate()[0]\n  if hash_object.returncode != 0:\n    die('`%s` failed' % ' '.join(hash_object_cmd))\n  if clang_format.wait() != 0:\n    die('`%s` failed' % ' '.join(clang_format_cmd))\n  if git_show and git_show.wait() != 0:\n    die('`%s` failed' % ' '.join(git_show_cmd))\n  return convert_string(stdout).rstrip('\\r\\n')\n\n\n@contextlib.contextmanager\ndef temporary_index_file(tree=None):\n  \"\"\"Context manager for setting GIT_INDEX_FILE to a temporary file and deleting\n  the file afterward.\"\"\"\n  index_path = create_temporary_index(tree)\n  old_index_path = os.environ.get('GIT_INDEX_FILE')\n  os.environ['GIT_INDEX_FILE'] = index_path\n  try:\n    yield\n  finally:\n    if old_index_path is None:\n      del os.environ['GIT_INDEX_FILE']\n    else:\n      os.environ['GIT_INDEX_FILE'] = old_index_path\n    os.remove(index_path)\n\n\ndef create_temporary_index(tree=None):\n  \"\"\"Create a temporary index file and return the created file's path.\n\n  If `tree` is not None, use that as the tree to read in.  Otherwise, an\n  empty index is created.\"\"\"\n  gitdir = run('git', 'rev-parse', '--git-dir')\n  path = os.path.join(gitdir, temp_index_basename)\n  if tree is None:\n    tree = '--empty'\n  run('git', 'read-tree', '--index-output='+path, tree)\n  return path\n\n\ndef print_diff(old_tree, new_tree):\n  \"\"\"Print the diff between the two trees to stdout.\"\"\"\n  # We use the porcelain 'diff' and not plumbing 'diff-tree' because the output\n  # is expected to be viewed by the user, and only the former does nice things\n  # like color and pagination.\n  #\n  # We also only print modified files since `new_tree` only contains the files\n  # that were modified, so unmodified files would show as deleted without the\n  # filter.\n  subprocess.check_call(['git', 'diff', '--diff-filter=M', old_tree, new_tree,\n                         '--'])\n\n\ndef apply_changes(old_tree, new_tree, force=False, patch_mode=False):\n  \"\"\"Apply the changes in `new_tree` to the working directory.\n\n  Bails if there are local changes in those files and not `force`.  If\n  `patch_mode`, runs `git checkout --patch` to select hunks interactively.\"\"\"\n  changed_files = run('git', 'diff-tree', '--diff-filter=M', '-r', '-z',\n                      '--name-only', old_tree,\n                      new_tree).rstrip('\\0').split('\\0')\n  if not force:\n    unstaged_files = run('git', 'diff-files', '--name-status', *changed_files)\n    if unstaged_files:\n      print('The following files would be modified but '\n                'have unstaged changes:', file=sys.stderr)\n      print(unstaged_files, file=sys.stderr)\n      print('Please commit, stage, or stash them first.', file=sys.stderr)\n      sys.exit(2)\n  if patch_mode:\n    # In patch mode, we could just as well create an index from the new tree\n    # and checkout from that, but then the user will be presented with a\n    # message saying \"Discard ... from worktree\".  Instead, we use the old\n    # tree as the index and checkout from new_tree, which gives the slightly\n    # better message, \"Apply ... to index and worktree\".  This is not quite\n    # right, since it won't be applied to the user's index, but oh well.\n    with temporary_index_file(old_tree):\n      subprocess.check_call(['git', 'checkout', '--patch', new_tree])\n    index_tree = old_tree\n  else:\n    with temporary_index_file(new_tree):\n      run('git', 'checkout-index', '-a', '-f')\n  return changed_files\n\n\ndef run(*args, **kwargs):\n  stdin = kwargs.pop('stdin', to_bytes(''))\n  verbose = kwargs.pop('verbose', True)\n  strip = kwargs.pop('strip', True)\n  for name in kwargs:\n    raise TypeError(\"run() got an unexpected keyword argument '%s'\" % name)\n  p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE,\n                       stdin=subprocess.PIPE)\n  stdout, stderr = p.communicate(input=stdin)\n\n  stdout = convert_string(stdout)\n  stderr = convert_string(stderr)\n\n  if p.returncode == 0:\n    if stderr:\n      if verbose:\n        print('`%s` printed to stderr:' % ' '.join(args), file=sys.stderr)\n      print(stderr.rstrip(), file=sys.stderr)\n    if strip:\n      stdout = stdout.rstrip('\\r\\n')\n    return stdout\n  if verbose:\n    print('`%s` returned %s' % (' '.join(args), p.returncode), file=sys.stderr)\n  if stderr:\n    print(stderr.rstrip(), file=sys.stderr)\n  sys.exit(2)\n\n\ndef die(message):\n  print('error:', message, file=sys.stderr)\n  sys.exit(2)\n\n\ndef to_bytes(str_input):\n    # Encode to UTF-8 to get binary data.\n    if isinstance(str_input, bytes):\n        return str_input\n    return str_input.encode('utf-8')\n\n\ndef to_string(bytes_input):\n    if isinstance(bytes_input, str):\n        return bytes_input\n    return bytes_input.encode('utf-8')\n\n\ndef convert_string(bytes_input):\n    try:\n        return to_string(bytes_input.decode('utf-8'))\n    except AttributeError: # 'str' object has no attribute 'decode'.\n        return str(bytes_input)\n    except UnicodeError:\n        return str(bytes_input)\n\nif __name__ == '__main__':\n  main()\n"
  },
  {
    "path": "third_party/cpptoml.lua",
    "content": "group(\"third_party\")\nproject(\"cpptoml\")\n  uuid(\"1e86cc51-3f8b-476d-9249-3b200424846b\")\n  if os.istarget(\"android\") then\n    -- ndk-build only supports StaticLib and SharedLib.\n    kind(\"StaticLib\")\n  else\n    kind(\"Utility\")\n  end\n  language(\"C++\")\n  files({\n    \"cpptoml/include/cpptoml.h\",\n  })\n"
  },
  {
    "path": "third_party/crypto/TinySHA1.hpp",
    "content": "/*\n *\n * TinySHA1 - a header only implementation of the SHA1 algorithm in C++. Based\n * on the implementation in boost::uuid::details.\n *\n * SHA1 Wikipedia Page: http://en.wikipedia.org/wiki/SHA-1\n *\n * Copyright (c) 2012-22 SAURAV MOHAPATRA <mohaps@gmail.com>\n *\n * Permission to use, copy, modify, and distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * Taken from https://github.com/mohaps/TinySHA1\n * Modified for use by Xenia\n */\n#ifndef _TINY_SHA1_HPP_\n#define _TINY_SHA1_HPP_\n\n#include <cstdio>\n#include <cstdlib>\n#include <cstring>\n#include <stdint.h>\n\nnamespace sha1 {\nclass SHA1 {\n public:\n  typedef uint32_t digest32_t[5];\n  typedef uint8_t digest8_t[20];\n  inline static uint32_t LeftRotate(uint32_t value, size_t count) {\n    return (value << count) ^ (value >> (32 - count));\n  }\n  SHA1() { reset(); }\n  virtual ~SHA1() {}\n  SHA1(const SHA1& s) { *this = s; }\n  const SHA1& operator=(const SHA1& s) {\n    memcpy(m_digest, s.m_digest, 5 * sizeof(uint32_t));\n    memcpy(m_block, s.m_block, 64);\n    m_blockByteIndex = s.m_blockByteIndex;\n    m_byteCount = s.m_byteCount;\n\n    return *this;\n  }\n\n  SHA1& init(const uint32_t digest[5], const uint8_t block[64],\n             uint32_t count) {\n    std::memcpy(m_digest, digest, 20);\n    std::memcpy(m_block, block, count % 64);\n    m_byteCount = count;\n    m_blockByteIndex = count % 64;\n\n    return *this;\n  }\n\n  const uint32_t* getDigest() const { return m_digest; }\n  const uint8_t* getBlock() const { return m_block; }\n  size_t getBlockByteIndex() const { return m_blockByteIndex; }\n  size_t getByteCount() const { return m_byteCount; }\n\n  SHA1& reset() {\n    m_digest[0] = 0x67452301;\n    m_digest[1] = 0xEFCDAB89;\n    m_digest[2] = 0x98BADCFE;\n    m_digest[3] = 0x10325476;\n    m_digest[4] = 0xC3D2E1F0;\n    m_blockByteIndex = 0;\n    m_byteCount = 0;\n    return *this;\n  }\n\n  SHA1& processByte(uint8_t octet) {\n    this->m_block[this->m_blockByteIndex++] = octet;\n    ++this->m_byteCount;\n    if (m_blockByteIndex == 64) {\n      this->m_blockByteIndex = 0;\n      processBlock();\n    }\n\n    return *this;\n  }\n\n  SHA1& processBlock(const void* const start, const void* const end) {\n    const uint8_t* begin = static_cast<const uint8_t*>(start);\n    const uint8_t* finish = static_cast<const uint8_t*>(end);\n    while (begin != finish) {\n      processByte(*begin);\n      begin++;\n    }\n    return *this;\n  }\n\n  SHA1& processBytes(const void* const data, size_t len) {\n    const uint8_t* block = static_cast<const uint8_t*>(data);\n    processBlock(block, block + len);\n    return *this;\n  }\n\n  const uint32_t* finalize(digest32_t digest) {\n    size_t bitCount = this->m_byteCount * 8;\n    processByte(0x80);\n    if (this->m_blockByteIndex > 56) {\n      while (m_blockByteIndex != 0) {\n        processByte(0);\n      }\n      while (m_blockByteIndex < 56) {\n        processByte(0);\n      }\n    } else {\n      while (m_blockByteIndex < 56) {\n        processByte(0);\n      }\n    }\n    processByte(0);\n    processByte(0);\n    processByte(0);\n    processByte(0);\n    processByte(static_cast<unsigned char>((bitCount >> 24) & 0xFF));\n    processByte(static_cast<unsigned char>((bitCount >> 16) & 0xFF));\n    processByte(static_cast<unsigned char>((bitCount >> 8) & 0xFF));\n    processByte(static_cast<unsigned char>((bitCount)&0xFF));\n\n    memcpy(digest, m_digest, 5 * sizeof(uint32_t));\n    return digest;\n  }\n\n  const uint8_t* finalize(digest8_t digest) {\n    digest32_t d32;\n    finalize(d32);\n    size_t di = 0;\n    digest[di++] = ((d32[0] >> 24) & 0xFF);\n    digest[di++] = ((d32[0] >> 16) & 0xFF);\n    digest[di++] = ((d32[0] >> 8) & 0xFF);\n    digest[di++] = ((d32[0]) & 0xFF);\n\n    digest[di++] = ((d32[1] >> 24) & 0xFF);\n    digest[di++] = ((d32[1] >> 16) & 0xFF);\n    digest[di++] = ((d32[1] >> 8) & 0xFF);\n    digest[di++] = ((d32[1]) & 0xFF);\n\n    digest[di++] = ((d32[2] >> 24) & 0xFF);\n    digest[di++] = ((d32[2] >> 16) & 0xFF);\n    digest[di++] = ((d32[2] >> 8) & 0xFF);\n    digest[di++] = ((d32[2]) & 0xFF);\n\n    digest[di++] = ((d32[3] >> 24) & 0xFF);\n    digest[di++] = ((d32[3] >> 16) & 0xFF);\n    digest[di++] = ((d32[3] >> 8) & 0xFF);\n    digest[di++] = ((d32[3]) & 0xFF);\n\n    digest[di++] = ((d32[4] >> 24) & 0xFF);\n    digest[di++] = ((d32[4] >> 16) & 0xFF);\n    digest[di++] = ((d32[4] >> 8) & 0xFF);\n    digest[di++] = ((d32[4]) & 0xFF);\n    return digest;\n  }\n\n protected:\n  void processBlock() {\n    uint32_t w[80];\n    for (size_t i = 0; i < 16; i++) {\n      w[i] = (m_block[i * 4 + 0] << 24);\n      w[i] |= (m_block[i * 4 + 1] << 16);\n      w[i] |= (m_block[i * 4 + 2] << 8);\n      w[i] |= (m_block[i * 4 + 3]);\n    }\n    for (size_t i = 16; i < 80; i++) {\n      w[i] = LeftRotate((w[i - 3] ^ w[i - 8] ^ w[i - 14] ^ w[i - 16]), 1);\n    }\n\n    uint32_t a = m_digest[0];\n    uint32_t b = m_digest[1];\n    uint32_t c = m_digest[2];\n    uint32_t d = m_digest[3];\n    uint32_t e = m_digest[4];\n\n    for (std::size_t i = 0; i < 80; ++i) {\n      uint32_t f = 0;\n      uint32_t k = 0;\n\n      if (i < 20) {\n        f = (b & c) | (~b & d);\n        k = 0x5A827999;\n      } else if (i < 40) {\n        f = b ^ c ^ d;\n        k = 0x6ED9EBA1;\n      } else if (i < 60) {\n        f = (b & c) | (b & d) | (c & d);\n        k = 0x8F1BBCDC;\n      } else {\n        f = b ^ c ^ d;\n        k = 0xCA62C1D6;\n      }\n      uint32_t temp = LeftRotate(a, 5) + f + e + k + w[i];\n      e = d;\n      d = c;\n      c = LeftRotate(b, 30);\n      b = a;\n      a = temp;\n    }\n\n    m_digest[0] += a;\n    m_digest[1] += b;\n    m_digest[2] += c;\n    m_digest[3] += d;\n    m_digest[4] += e;\n  }\n\n private:\n  digest32_t m_digest;\n  uint8_t m_block[64];\n  size_t m_blockByteIndex;\n  size_t m_byteCount;\n};\n}\n#endif\n"
  },
  {
    "path": "third_party/crypto/des/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2014 Faraz Fallahi\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n"
  },
  {
    "path": "third_party/crypto/des/README.md",
    "content": "cppDES\n======\n\nTaken from [this repository](https://github.com/fffaraz/cppDES)\n\nModified for use by Xenia."
  },
  {
    "path": "third_party/crypto/des/des.cpp",
    "content": "#include \"des.h\"\n#include \"des_key.h\"\n#include \"des_data.h\"\n#include \"des_lookup.h\"\n\n#include <memory>\n\n//#pragma GCC push_options\n#ifndef _MSC_VER\n#pragma GCC optimize (\"unroll-loops\")\n#endif\n\nDES::DES(ui64 key)\n{\n    keygen(key);\n}\n\nDES::DES(ui64* sub_key)\n{\n  set_sub_key(sub_key);\n}\n\nvoid DES::set_sub_key(ui64 *sub_key)\n{\n  std::memcpy(this->sub_key, sub_key, 128);\n}\n\nui64 DES::encrypt(ui64 block)\n{\n    return des(block, false);\n}\n\nui64 DES::decrypt(ui64 block)\n{\n    return des(block, true);\n}\n\nui64 DES::encrypt(ui64 block, ui64 key)\n{\n    DES des(key);\n    return des.des(block, false);\n}\n\nui64 DES::decrypt(ui64 block, ui64 key)\n{\n    DES des(key);\n    return des.des(block, true);\n}\n\nvoid DES::keygen(ui64 key)\n{\n    // initial key schedule calculation\n    ui64 permuted_choice_1 = 0; // 56 bits\n    for (ui8 i = 0; i < 56; i++)\n    {\n        permuted_choice_1 <<= 1;\n        permuted_choice_1 |= (key >> (64-PC1[i])) & LB64_MASK;\n    }\n\n    // 28 bits\n    ui32 C = (ui32) ((permuted_choice_1 >> 28) & 0x000000000fffffff);\n    ui32 D = (ui32)  (permuted_choice_1 & 0x000000000fffffff);\n\n    // Calculation of the 16 keys\n    for (ui8 i = 0; i < 16; i++)\n    {\n        // key schedule, shifting Ci and Di\n        for (ui8 j = 0; j < ITERATION_SHIFT[i]; j++)\n        {\n            C = (0x0fffffff & (C << 1)) | (0x00000001 & (C >> 27));\n            D = (0x0fffffff & (D << 1)) | (0x00000001 & (D >> 27));\n        }\n\n        ui64 permuted_choice_2 = (((ui64) C) << 28) | (ui64) D;\n\n        sub_key[i] = 0; // 48 bits (2*24)\n        for (ui8 j = 0; j < 48; j++)\n        {\n            sub_key[i] <<= 1;\n            sub_key[i] |= (permuted_choice_2 >> (56-PC2[j])) & LB64_MASK;\n        }\n    }\n}\n\nui64 DES::des(ui64 block, bool mode)\n{\n    // applying initial permutation\n    block = ip(block);\n\n    // dividing T' into two 32-bit parts\n    ui32 L = (ui32) (block >> 32) & L64_MASK;\n    ui32 R = (ui32) (block & L64_MASK);\n\n    // 16 rounds\n    for (ui8 i = 0; i < 16; i++)\n    {\n        ui32 F = mode ? f(R, sub_key[15-i]) : f(R, sub_key[i]);\n        feistel(L, R, F);\n    }\n\n    // swapping the two parts\n    block = (((ui64) R) << 32) | (ui64) L;\n    // applying final permutation\n    return fp(block);\n}\n\nui64 DES::ip(ui64 block)\n{\n    // initial permutation\n    ui64 result = 0;\n    for (ui8 i = 0; i < 64; i++)\n    {\n        result <<= 1;\n        result |= (block >> (64-IP[i])) & LB64_MASK;\n    }\n    return result;\n}\n\nui64 DES::fp(ui64 block)\n{\n    // inverse initial permutation\n    ui64 result = 0;\n    for (ui8 i = 0; i < 64; i++)\n    {\n        result <<= 1;\n        result |= (block >> (64-FP[i])) & LB64_MASK;\n    }\n    return result;\n}\n\nvoid DES::feistel(ui32 &L, ui32 &R, ui32 F)\n{\n    ui32 temp = R;\n    R = L ^ F;\n    L = temp;\n}\n\nui32 DES::f(ui32 R, ui64 k) // f(R,k) function\n{\n    // applying expansion permutation and returning 48-bit data\n    ui64 s_input = 0;\n    for (ui8 i = 0; i < 48; i++)\n    {\n        s_input <<= 1;\n        s_input |= (ui64) ((R >> (32-EXPANSION[i])) & LB32_MASK);\n    }\n\n    // XORing expanded Ri with Ki, the round key\n    s_input = s_input ^ k;\n\n    // applying S-Boxes function and returning 32-bit data\n    ui32 s_output = 0;\n    for (ui8 i = 0; i < 8; i++)\n    {\n        // Outer bits\n        char row = (char) ((s_input & (0x0000840000000000 >> 6*i)) >> (42-6*i));\n        row = (row >> 4) | (row & 0x01);\n\n        // Middle 4 bits of input\n        char column = (char) ((s_input & (0x0000780000000000 >> 6*i)) >> (43-6*i));\n\n        s_output <<= 4;\n        s_output |= (ui32) (SBOX[i][16*row + column] & 0x0f);\n    }\n\n    // applying the round permutation\n    ui32 f_result = 0;\n    for (ui8 i = 0; i < 32; i++)\n    {\n        f_result <<= 1;\n        f_result |= (s_output >> (32 - PBOX[i])) & LB32_MASK;\n    }\n\n    return f_result;\n}\n\n//#pragma GCC pop_options\n"
  },
  {
    "path": "third_party/crypto/des/des.h",
    "content": "#ifndef DES_H\n#define DES_H\n\n#include <cstdint>\n\ntypedef uint64_t ui64;\ntypedef uint32_t ui32;\ntypedef uint8_t ui8;\n\nclass DES\n{\npublic:\n    DES(ui64 key);\n    DES(ui64 *sub_key);\n    ui64 des(ui64 block, bool mode);\n\n    ui64 encrypt(ui64 block);\n    ui64 decrypt(ui64 block);\n\n    static ui64 encrypt(ui64 block, ui64 key);\n    static ui64 decrypt(ui64 block, ui64 key);\n\n    static void set_parity(ui8 *key, int length, ui8 *out) {\n      for (int i = 0; i < length; i++) {\n        ui8 parity = key[i];\n\n        parity ^= parity >> 4;\n        parity ^= parity >> 2;\n        parity ^= parity >> 1;\n\n        out[i] = (key[i] & 0xFE) | (~parity & 1);\n      }\n    }\n\n    const ui64 *get_sub_key() const { return sub_key; }\n    void set_sub_key(ui64 *key);\n\nprotected:\n    void keygen(ui64 key);\n\n    ui64 ip(ui64 block);\n    ui64 fp(ui64 block);\n\n    void feistel(ui32 &L, ui32 &R, ui32 F);\n    ui32 f(ui32 R, ui64 k);\n\nprivate:\n    ui64 sub_key[16]; // 48 bits each\n};\n\n#endif // DES_H\n"
  },
  {
    "path": "third_party/crypto/des/des3.h",
    "content": "#ifndef DES3_H\n#define DES3_H\n\n#include \"des.h\"\n\nclass DES3\n{\npublic:\n    DES3(ui64 k1, ui64 k2, ui64 k3) : des{ DES(k1), DES(k2), DES(k3) } {}\n    DES3(ui64* sk1, ui64* sk2, ui64* sk3) : des{ DES(sk1), DES(sk2), DES(sk3) } {}\n\n    inline ui64 encrypt(ui64 block)\n    {\n      return des[2].encrypt(des[1].decrypt(des[0].encrypt(block)));\n    }\n\n    inline ui64 decrypt(ui64 block)\n    {\n      return des[0].decrypt(des[1].encrypt(des[2].decrypt(block)));\n    }\n\n    inline ui64 crypt(ui64 block, bool bEncrypt)\n    {\n      if (bEncrypt)\n      {\n        return encrypt(block);\n      }\n      else\n      {\n        return decrypt(block);\n      }\n    }\n\n    inline DES* getDES() { return des; }\n\nprivate:\n    DES des[3];\n};\n\n#endif // DES3_H\n"
  },
  {
    "path": "third_party/crypto/des/des_data.h",
    "content": "#ifndef DES_DATA_H\n#define DES_DATA_H\n\n#define LB32_MASK 0x00000001\n#define LB64_MASK 0x0000000000000001\n#define L64_MASK  0x00000000ffffffff\n\n// Initial Permutation Table [8*8]\nstatic const char IP[] =\n{\n    58, 50, 42, 34, 26, 18, 10, 2,\n    60, 52, 44, 36, 28, 20, 12, 4,\n    62, 54, 46, 38, 30, 22, 14, 6,\n    64, 56, 48, 40, 32, 24, 16, 8,\n    57, 49, 41, 33, 25, 17,  9, 1,\n    59, 51, 43, 35, 27, 19, 11, 3,\n    61, 53, 45, 37, 29, 21, 13, 5,\n    63, 55, 47, 39, 31, 23, 15, 7\n};\n\n// Inverse Initial Permutation Table [8*8]\nstatic const char FP[] =\n{\n    40, 8, 48, 16, 56, 24, 64, 32,\n    39, 7, 47, 15, 55, 23, 63, 31,\n    38, 6, 46, 14, 54, 22, 62, 30,\n    37, 5, 45, 13, 53, 21, 61, 29,\n    36, 4, 44, 12, 52, 20, 60, 28,\n    35, 3, 43, 11, 51, 19, 59, 27,\n    34, 2, 42, 10, 50, 18, 58, 26,\n    33, 1, 41,  9, 49, 17, 57, 25\n};\n\n// Expansion table [6*8]\nstatic const char EXPANSION[] =\n{\n    32,  1,  2,  3,  4,  5,\n     4,  5,  6,  7,  8,  9,\n     8,  9, 10, 11, 12, 13,\n    12, 13, 14, 15, 16, 17,\n    16, 17, 18, 19, 20, 21,\n    20, 21, 22, 23, 24, 25,\n    24, 25, 26, 27, 28, 29,\n    28, 29, 30, 31, 32,  1\n};\n\n// The S-Box tables [8*16*4]\nstatic const char SBOX[8][64] =\n{\n    {\n        // S1\n        14,  4, 13,  1,  2, 15, 11,  8,  3, 10,  6, 12,  5,  9,  0,  7,\n         0, 15,  7,  4, 14,  2, 13,  1, 10,  6, 12, 11,  9,  5,  3,  8,\n         4,  1, 14,  8, 13,  6,  2, 11, 15, 12,  9,  7,  3, 10,  5,  0,\n        15, 12,  8,  2,  4,  9,  1,  7,  5, 11,  3, 14, 10,  0,  6, 13\n    },\n    {\n        // S2\n        15,  1,  8, 14,  6, 11,  3,  4,  9,  7,  2, 13, 12,  0,  5, 10,\n         3, 13,  4,  7, 15,  2,  8, 14, 12,  0,  1, 10,  6,  9, 11,  5,\n         0, 14,  7, 11, 10,  4, 13,  1,  5,  8, 12,  6,  9,  3,  2, 15,\n        13,  8, 10,  1,  3, 15,  4,  2, 11,  6,  7, 12,  0,  5, 14,  9\n    },\n    {\n        // S3\n        10,  0,  9, 14,  6,  3, 15,  5,  1, 13, 12,  7, 11,  4,  2,  8,\n        13,  7,  0,  9,  3,  4,  6, 10,  2,  8,  5, 14, 12, 11, 15,  1,\n        13,  6,  4,  9,  8, 15,  3,  0, 11,  1,  2, 12,  5, 10, 14,  7,\n         1, 10, 13,  0,  6,  9,  8,  7,  4, 15, 14,  3, 11,  5,  2, 12\n    },\n    {\n        // S4\n         7, 13, 14,  3,  0,  6,  9, 10,  1,  2,  8,  5, 11, 12,  4, 15,\n        13,  8, 11,  5,  6, 15,  0,  3,  4,  7,  2, 12,  1, 10, 14,  9,\n        10,  6,  9,  0, 12, 11,  7, 13, 15,  1,  3, 14,  5,  2,  8,  4,\n         3, 15,  0,  6, 10,  1, 13,  8,  9,  4,  5, 11, 12,  7,  2, 14\n    },\n    {\n        // S5\n         2, 12,  4,  1,  7, 10, 11,  6,  8,  5,  3, 15, 13,  0, 14,  9,\n        14, 11,  2, 12,  4,  7, 13,  1,  5,  0, 15, 10,  3,  9,  8,  6,\n         4,  2,  1, 11, 10, 13,  7,  8, 15,  9, 12,  5,  6,  3,  0, 14,\n        11,  8, 12,  7,  1, 14,  2, 13,  6, 15,  0,  9, 10,  4,  5,  3\n    },\n    {\n        // S6\n        12,  1, 10, 15,  9,  2,  6,  8,  0, 13,  3,  4, 14,  7,  5, 11,\n        10, 15,  4,  2,  7, 12,  9,  5,  6,  1, 13, 14,  0, 11,  3,  8,\n         9, 14, 15,  5,  2,  8, 12,  3,  7,  0,  4, 10,  1, 13, 11,  6,\n         4,  3,  2, 12,  9,  5, 15, 10, 11, 14,  1,  7,  6,  0,  8, 13\n    },\n    {\n        // S7\n         4, 11,  2, 14, 15,  0,  8, 13,  3, 12,  9,  7,  5, 10,  6,  1,\n        13,  0, 11,  7,  4,  9,  1, 10, 14,  3,  5, 12,  2, 15,  8,  6,\n         1,  4, 11, 13, 12,  3,  7, 14, 10, 15,  6,  8,  0,  5,  9,  2,\n         6, 11, 13,  8,  1,  4, 10,  7,  9,  5,  0, 15, 14,  2,  3, 12\n    },\n    {\n        // S8\n        13,  2,  8,  4,  6, 15, 11,  1, 10,  9,  3, 14,  5,  0, 12,  7,\n         1, 15, 13,  8, 10,  3,  7,  4, 12,  5,  6, 11,  0, 14,  9,  2,\n         7, 11,  4,  1,  9, 12, 14,  2,  0,  6, 10, 13, 15,  3,  5,  8,\n         2,  1, 14,  7,  4, 10,  8, 13, 15, 12,  9,  0,  3,  5,  6, 11\n    }\n};\n\n// Post S-Box permutation [4*8]\nstatic const char PBOX[] =\n{\n    16,  7, 20, 21,\n    29, 12, 28, 17,\n     1, 15, 23, 26,\n     5, 18, 31, 10,\n     2,  8, 24, 14,\n    32, 27,  3,  9,\n    19, 13, 30,  6,\n    22, 11,  4, 25\n};\n\n#endif // DES_DATA_H\n"
  },
  {
    "path": "third_party/crypto/des/des_key.h",
    "content": "#ifndef DES_KEY_H\n#define DES_KEY_H\n\n// Permuted Choice 1 Table [7*8]\nstatic const char PC1[] =\n{\n    57, 49, 41, 33, 25, 17,  9,\n     1, 58, 50, 42, 34, 26, 18,\n    10,  2, 59, 51, 43, 35, 27,\n    19, 11,  3, 60, 52, 44, 36,\n\n    63, 55, 47, 39, 31, 23, 15,\n     7, 62, 54, 46, 38, 30, 22,\n    14,  6, 61, 53, 45, 37, 29,\n    21, 13,  5, 28, 20, 12,  4\n};\n\n// Permuted Choice 2 Table [6*8]\nstatic const char PC2[] =\n{\n    14, 17, 11, 24,  1,  5,\n     3, 28, 15,  6, 21, 10,\n    23, 19, 12,  4, 26,  8,\n    16,  7, 27, 20, 13,  2,\n    41, 52, 31, 37, 47, 55,\n    30, 40, 51, 45, 33, 48,\n    44, 49, 39, 56, 34, 53,\n    46, 42, 50, 36, 29, 32\n};\n\n// Iteration Shift Array\nstatic const char ITERATION_SHIFT[] =\n{\n//  1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16\n    1,  1,  2,  2,  2,  2,  2,  2,  1,  2,  2,  2,  2,  2,  2,  1\n};\n\n#endif // DES_KEY_H\n"
  },
  {
    "path": "third_party/crypto/des/des_lookup.h",
    "content": "#ifndef DES_LOOKUP_H\n#define DES_LOOKUP_H\n\n#endif // DES_LOOKUP_H\n"
  },
  {
    "path": "third_party/crypto/des/descbc.h",
    "content": "#ifndef DESCBC_H\n#define DESCBC_H\n\n#include \"des.h\"\n\nclass DESCBC\n{\npublic:\n    DESCBC(ui64 key, ui64 iv) : des(key), iv(iv), last_block(iv) {}\n    inline ui64 encrypt(ui64 block)\n    {\n      last_block = des.encrypt(block ^ last_block);\n      return last_block;\n    }\n\n    inline ui64 decrypt(ui64 block)\n    {\n      ui64 result = des.decrypt(block) ^ last_block;\n      last_block = block;\n      return result;\n    }\n\n    inline void reset()\n    {\n      last_block = iv;\n    }\n\nprivate:\n    DES des;\n    ui64 iv;\n    ui64 last_block;\n};\n\n#endif // DESCBC_H\n"
  },
  {
    "path": "third_party/crypto/rc4.c",
    "content": "/*\n* rc4.c\n*\n* Copyright (c) 1996-2000 Whistle Communications, Inc.\n* All rights reserved.\n*\n* Subject to the following obligations and disclaimer of warranty, use and\n* redistribution of this software, in source or object code forms, with or\n* without modifications are expressly permitted by Whistle Communications;\n* provided, however, that:\n* 1. Any and all reproductions of the source or object code must include the\n*    copyright notice above and the following disclaimer of warranties; and\n* 2. No rights are granted, in any manner or form, to use Whistle\n*    Communications, Inc. trademarks, including the mark \"WHISTLE\n*    COMMUNICATIONS\" on advertising, endorsements, or otherwise except as\n*    such appears in the above copyright notice or in the software.\n*\n* THIS SOFTWARE IS BEING PROVIDED BY WHISTLE COMMUNICATIONS \"AS IS\", AND\n* TO THE MAXIMUM EXTENT PERMITTED BY LAW, WHISTLE COMMUNICATIONS MAKES NO\n* REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, REGARDING THIS SOFTWARE,\n* INCLUDING WITHOUT LIMITATION, ANY AND ALL IMPLIED WARRANTIES OF\n* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.\n* WHISTLE COMMUNICATIONS DOES NOT WARRANT, GUARANTEE, OR MAKE ANY\n* REPRESENTATIONS REGARDING THE USE OF, OR THE RESULTS OF THE USE OF THIS\n* SOFTWARE IN TERMS OF ITS CORRECTNESS, ACCURACY, RELIABILITY OR OTHERWISE.\n* IN NO EVENT SHALL WHISTLE COMMUNICATIONS BE LIABLE FOR ANY DAMAGES\n* RESULTING FROM OR ARISING OUT OF ANY USE OF THIS SOFTWARE, INCLUDING\n* WITHOUT LIMITATION, ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,\n* PUNITIVE, OR CONSEQUENTIAL DAMAGES, PROCUREMENT OF SUBSTITUTE GOODS OR\n* SERVICES, LOSS OF USE, DATA OR PROFITS, HOWEVER CAUSED AND UNDER ANY\n* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n* THIS SOFTWARE, EVEN IF WHISTLE COMMUNICATIONS IS ADVISED OF THE POSSIBILITY\n* OF SUCH DAMAGE.\n*/\n\n#include \"rc4.h\"\n\nstatic __inline void swap_bytes(uint8_t *a, uint8_t *b) {\n  uint8_t temp;\n\n  temp = *a;\n  *a = *b;\n  *b = temp;\n}\n\n/*\n* Initialize an RC4 state buffer using the supplied key,\n* which can have arbitrary length.\n*/\nvoid rc4_init(struct rc4_state *const state, const uint8_t *key, int keylen) {\n  uint8_t j;\n  int i;\n\n  /* Initialize state with identity permutation */\n  for (i = 0; i < 256; i++) state->perm[i] = (uint8_t)i;\n  state->index1 = 0;\n  state->index2 = 0;\n\n  /* Randomize the permutation using key data */\n  for (j = i = 0; i < 256; i++) {\n    j += state->perm[i] + key[i % keylen];\n    swap_bytes(&state->perm[i], &state->perm[j]);\n  }\n}\n\n/*\n* Encrypt some data using the supplied RC4 state buffer.\n* The input and output buffers may be the same buffer.\n* Since RC4 is a stream cypher, this function is used\n* for both encryption and decryption.\n*/\nvoid rc4_crypt(struct rc4_state *const state, const uint8_t *inbuf,\n               uint8_t *outbuf, int buflen) {\n  int i;\n  uint8_t j;\n\n  for (i = 0; i < buflen; i++) {\n    /* Update modification indicies */\n    state->index1++;\n    state->index2 += state->perm[state->index1];\n\n    /* Modify permutation */\n    swap_bytes(&state->perm[state->index1], &state->perm[state->index2]);\n\n    /* Encrypt/decrypt next byte */\n    j = state->perm[state->index1] + state->perm[state->index2];\n    outbuf[i] = inbuf[i] ^ state->perm[j];\n  }\n}\n"
  },
  {
    "path": "third_party/crypto/rc4.h",
    "content": "/*\n* rc4.h\n*\n* Copyright (c) 1996-2000 Whistle Communications, Inc.\n* All rights reserved.\n*\n* Subject to the following obligations and disclaimer of warranty, use and\n* redistribution of this software, in source or object code forms, with or\n* without modifications are expressly permitted by Whistle Communications;\n* provided, however, that:\n* 1. Any and all reproductions of the source or object code must include the\n*    copyright notice above and the following disclaimer of warranties; and\n* 2. No rights are granted, in any manner or form, to use Whistle\n*    Communications, Inc. trademarks, including the mark \"WHISTLE\n*    COMMUNICATIONS\" on advertising, endorsements, or otherwise except as\n*    such appears in the above copyright notice or in the software.\n*\n* THIS SOFTWARE IS BEING PROVIDED BY WHISTLE COMMUNICATIONS \"AS IS\", AND\n* TO THE MAXIMUM EXTENT PERMITTED BY LAW, WHISTLE COMMUNICATIONS MAKES NO\n* REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, REGARDING THIS SOFTWARE,\n* INCLUDING WITHOUT LIMITATION, ANY AND ALL IMPLIED WARRANTIES OF\n* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.\n* WHISTLE COMMUNICATIONS DOES NOT WARRANT, GUARANTEE, OR MAKE ANY\n* REPRESENTATIONS REGARDING THE USE OF, OR THE RESULTS OF THE USE OF THIS\n* SOFTWARE IN TERMS OF ITS CORRECTNESS, ACCURACY, RELIABILITY OR OTHERWISE.\n* IN NO EVENT SHALL WHISTLE COMMUNICATIONS BE LIABLE FOR ANY DAMAGES\n* RESULTING FROM OR ARISING OUT OF ANY USE OF THIS SOFTWARE, INCLUDING\n* WITHOUT LIMITATION, ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,\n* PUNITIVE, OR CONSEQUENTIAL DAMAGES, PROCUREMENT OF SUBSTITUTE GOODS OR\n* SERVICES, LOSS OF USE, DATA OR PROFITS, HOWEVER CAUSED AND UNDER ANY\n* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n* THIS SOFTWARE, EVEN IF WHISTLE COMMUNICATIONS IS ADVISED OF THE POSSIBILITY\n* OF SUCH DAMAGE.\n*/\n\n#ifndef _SYS_CRYPTO_RC4_RC4_H_\n#define _SYS_CRYPTO_RC4_RC4_H_\n\nstruct rc4_state {\n  uint8_t perm[256];\n  uint8_t index1;\n  uint8_t index2;\n};\n\nvoid rc4_init(struct rc4_state *state, const uint8_t *key, int keylen);\nvoid rc4_crypt(struct rc4_state *state, const uint8_t *inbuf, uint8_t *outbuf,\n               int buflen);\n\n#endif\n"
  },
  {
    "path": "third_party/crypto/rijndael-alg-fst.c",
    "content": "/**\n * rijndael-alg-fst.c\n *\n * @version 3.0 (December 2000)\n *\n * Optimised ANSI C code for the Rijndael cipher (now AES)\n *\n * @author Vincent Rijmen <vincent.rijmen@esat.kuleuven.ac.be>\n * @author Antoon Bosselaers <antoon.bosselaers@esat.kuleuven.ac.be>\n * @author Paulo Barreto <paulo.barreto@terra.com.br>\n *\n * This code is hereby placed in the public domain.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\n * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\n * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n#include <assert.h>\n#include <stdlib.h>\n\n#include \"rijndael-alg-fst.h\"\n\n/*\nTe0[x] = S [x].[02, 01, 01, 03];\nTe1[x] = S [x].[03, 02, 01, 01];\nTe2[x] = S [x].[01, 03, 02, 01];\nTe3[x] = S [x].[01, 01, 03, 02];\nTe4[x] = S [x].[01, 01, 01, 01];\n\nTd0[x] = Si[x].[0e, 09, 0d, 0b];\nTd1[x] = Si[x].[0b, 0e, 09, 0d];\nTd2[x] = Si[x].[0d, 0b, 0e, 09];\nTd3[x] = Si[x].[09, 0d, 0b, 0e];\nTd4[x] = Si[x].[01, 01, 01, 01];\n*/\n\nstatic const u32 Te0[256] = {\n    0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU,\n    0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U,\n    0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU,\n    0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU,\n    0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U,\n    0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU,\n    0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU,\n    0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU,\n    0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU,\n    0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU,\n    0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U,\n    0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU,\n    0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU,\n    0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U,\n    0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU,\n    0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU,\n    0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU,\n    0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU,\n    0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU,\n    0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U,\n    0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU,\n    0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU,\n    0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU,\n    0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU,\n    0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U,\n    0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U,\n    0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U,\n    0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U,\n    0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU,\n    0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U,\n    0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U,\n    0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU,\n    0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU,\n    0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U,\n    0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U,\n    0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U,\n    0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU,\n    0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U,\n    0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU,\n    0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U,\n    0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU,\n    0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U,\n    0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U,\n    0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU,\n    0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U,\n    0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U,\n    0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U,\n    0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U,\n    0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U,\n    0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U,\n    0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U,\n    0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U,\n    0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU,\n    0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U,\n    0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U,\n    0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U,\n    0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U,\n    0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U,\n    0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U,\n    0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU,\n    0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U,\n    0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U,\n    0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U,\n    0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU,\n};\nstatic const u32 Te1[256] = {\n    0xa5c66363U, 0x84f87c7cU, 0x99ee7777U, 0x8df67b7bU,\n    0x0dfff2f2U, 0xbdd66b6bU, 0xb1de6f6fU, 0x5491c5c5U,\n    0x50603030U, 0x03020101U, 0xa9ce6767U, 0x7d562b2bU,\n    0x19e7fefeU, 0x62b5d7d7U, 0xe64dababU, 0x9aec7676U,\n    0x458fcacaU, 0x9d1f8282U, 0x4089c9c9U, 0x87fa7d7dU,\n    0x15effafaU, 0xebb25959U, 0xc98e4747U, 0x0bfbf0f0U,\n    0xec41adadU, 0x67b3d4d4U, 0xfd5fa2a2U, 0xea45afafU,\n    0xbf239c9cU, 0xf753a4a4U, 0x96e47272U, 0x5b9bc0c0U,\n    0xc275b7b7U, 0x1ce1fdfdU, 0xae3d9393U, 0x6a4c2626U,\n    0x5a6c3636U, 0x417e3f3fU, 0x02f5f7f7U, 0x4f83ccccU,\n    0x5c683434U, 0xf451a5a5U, 0x34d1e5e5U, 0x08f9f1f1U,\n    0x93e27171U, 0x73abd8d8U, 0x53623131U, 0x3f2a1515U,\n    0x0c080404U, 0x5295c7c7U, 0x65462323U, 0x5e9dc3c3U,\n    0x28301818U, 0xa1379696U, 0x0f0a0505U, 0xb52f9a9aU,\n    0x090e0707U, 0x36241212U, 0x9b1b8080U, 0x3ddfe2e2U,\n    0x26cdebebU, 0x694e2727U, 0xcd7fb2b2U, 0x9fea7575U,\n    0x1b120909U, 0x9e1d8383U, 0x74582c2cU, 0x2e341a1aU,\n    0x2d361b1bU, 0xb2dc6e6eU, 0xeeb45a5aU, 0xfb5ba0a0U,\n    0xf6a45252U, 0x4d763b3bU, 0x61b7d6d6U, 0xce7db3b3U,\n    0x7b522929U, 0x3edde3e3U, 0x715e2f2fU, 0x97138484U,\n    0xf5a65353U, 0x68b9d1d1U, 0x00000000U, 0x2cc1ededU,\n    0x60402020U, 0x1fe3fcfcU, 0xc879b1b1U, 0xedb65b5bU,\n    0xbed46a6aU, 0x468dcbcbU, 0xd967bebeU, 0x4b723939U,\n    0xde944a4aU, 0xd4984c4cU, 0xe8b05858U, 0x4a85cfcfU,\n    0x6bbbd0d0U, 0x2ac5efefU, 0xe54faaaaU, 0x16edfbfbU,\n    0xc5864343U, 0xd79a4d4dU, 0x55663333U, 0x94118585U,\n    0xcf8a4545U, 0x10e9f9f9U, 0x06040202U, 0x81fe7f7fU,\n    0xf0a05050U, 0x44783c3cU, 0xba259f9fU, 0xe34ba8a8U,\n    0xf3a25151U, 0xfe5da3a3U, 0xc0804040U, 0x8a058f8fU,\n    0xad3f9292U, 0xbc219d9dU, 0x48703838U, 0x04f1f5f5U,\n    0xdf63bcbcU, 0xc177b6b6U, 0x75afdadaU, 0x63422121U,\n    0x30201010U, 0x1ae5ffffU, 0x0efdf3f3U, 0x6dbfd2d2U,\n    0x4c81cdcdU, 0x14180c0cU, 0x35261313U, 0x2fc3ececU,\n    0xe1be5f5fU, 0xa2359797U, 0xcc884444U, 0x392e1717U,\n    0x5793c4c4U, 0xf255a7a7U, 0x82fc7e7eU, 0x477a3d3dU,\n    0xacc86464U, 0xe7ba5d5dU, 0x2b321919U, 0x95e67373U,\n    0xa0c06060U, 0x98198181U, 0xd19e4f4fU, 0x7fa3dcdcU,\n    0x66442222U, 0x7e542a2aU, 0xab3b9090U, 0x830b8888U,\n    0xca8c4646U, 0x29c7eeeeU, 0xd36bb8b8U, 0x3c281414U,\n    0x79a7dedeU, 0xe2bc5e5eU, 0x1d160b0bU, 0x76addbdbU,\n    0x3bdbe0e0U, 0x56643232U, 0x4e743a3aU, 0x1e140a0aU,\n    0xdb924949U, 0x0a0c0606U, 0x6c482424U, 0xe4b85c5cU,\n    0x5d9fc2c2U, 0x6ebdd3d3U, 0xef43acacU, 0xa6c46262U,\n    0xa8399191U, 0xa4319595U, 0x37d3e4e4U, 0x8bf27979U,\n    0x32d5e7e7U, 0x438bc8c8U, 0x596e3737U, 0xb7da6d6dU,\n    0x8c018d8dU, 0x64b1d5d5U, 0xd29c4e4eU, 0xe049a9a9U,\n    0xb4d86c6cU, 0xfaac5656U, 0x07f3f4f4U, 0x25cfeaeaU,\n    0xafca6565U, 0x8ef47a7aU, 0xe947aeaeU, 0x18100808U,\n    0xd56fbabaU, 0x88f07878U, 0x6f4a2525U, 0x725c2e2eU,\n    0x24381c1cU, 0xf157a6a6U, 0xc773b4b4U, 0x5197c6c6U,\n    0x23cbe8e8U, 0x7ca1ddddU, 0x9ce87474U, 0x213e1f1fU,\n    0xdd964b4bU, 0xdc61bdbdU, 0x860d8b8bU, 0x850f8a8aU,\n    0x90e07070U, 0x427c3e3eU, 0xc471b5b5U, 0xaacc6666U,\n    0xd8904848U, 0x05060303U, 0x01f7f6f6U, 0x121c0e0eU,\n    0xa3c26161U, 0x5f6a3535U, 0xf9ae5757U, 0xd069b9b9U,\n    0x91178686U, 0x5899c1c1U, 0x273a1d1dU, 0xb9279e9eU,\n    0x38d9e1e1U, 0x13ebf8f8U, 0xb32b9898U, 0x33221111U,\n    0xbbd26969U, 0x70a9d9d9U, 0x89078e8eU, 0xa7339494U,\n    0xb62d9b9bU, 0x223c1e1eU, 0x92158787U, 0x20c9e9e9U,\n    0x4987ceceU, 0xffaa5555U, 0x78502828U, 0x7aa5dfdfU,\n    0x8f038c8cU, 0xf859a1a1U, 0x80098989U, 0x171a0d0dU,\n    0xda65bfbfU, 0x31d7e6e6U, 0xc6844242U, 0xb8d06868U,\n    0xc3824141U, 0xb0299999U, 0x775a2d2dU, 0x111e0f0fU,\n    0xcb7bb0b0U, 0xfca85454U, 0xd66dbbbbU, 0x3a2c1616U,\n};\nstatic const u32 Te2[256] = {\n    0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU,\n    0xf20dfff2U, 0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U,\n    0x30506030U, 0x01030201U, 0x67a9ce67U, 0x2b7d562bU,\n    0xfe19e7feU, 0xd762b5d7U, 0xabe64dabU, 0x769aec76U,\n    0xca458fcaU, 0x829d1f82U, 0xc94089c9U, 0x7d87fa7dU,\n    0xfa15effaU, 0x59ebb259U, 0x47c98e47U, 0xf00bfbf0U,\n    0xadec41adU, 0xd467b3d4U, 0xa2fd5fa2U, 0xafea45afU,\n    0x9cbf239cU, 0xa4f753a4U, 0x7296e472U, 0xc05b9bc0U,\n    0xb7c275b7U, 0xfd1ce1fdU, 0x93ae3d93U, 0x266a4c26U,\n    0x365a6c36U, 0x3f417e3fU, 0xf702f5f7U, 0xcc4f83ccU,\n    0x345c6834U, 0xa5f451a5U, 0xe534d1e5U, 0xf108f9f1U,\n    0x7193e271U, 0xd873abd8U, 0x31536231U, 0x153f2a15U,\n    0x040c0804U, 0xc75295c7U, 0x23654623U, 0xc35e9dc3U,\n    0x18283018U, 0x96a13796U, 0x050f0a05U, 0x9ab52f9aU,\n    0x07090e07U, 0x12362412U, 0x809b1b80U, 0xe23ddfe2U,\n    0xeb26cdebU, 0x27694e27U, 0xb2cd7fb2U, 0x759fea75U,\n    0x091b1209U, 0x839e1d83U, 0x2c74582cU, 0x1a2e341aU,\n    0x1b2d361bU, 0x6eb2dc6eU, 0x5aeeb45aU, 0xa0fb5ba0U,\n    0x52f6a452U, 0x3b4d763bU, 0xd661b7d6U, 0xb3ce7db3U,\n    0x297b5229U, 0xe33edde3U, 0x2f715e2fU, 0x84971384U,\n    0x53f5a653U, 0xd168b9d1U, 0x00000000U, 0xed2cc1edU,\n    0x20604020U, 0xfc1fe3fcU, 0xb1c879b1U, 0x5bedb65bU,\n    0x6abed46aU, 0xcb468dcbU, 0xbed967beU, 0x394b7239U,\n    0x4ade944aU, 0x4cd4984cU, 0x58e8b058U, 0xcf4a85cfU,\n    0xd06bbbd0U, 0xef2ac5efU, 0xaae54faaU, 0xfb16edfbU,\n    0x43c58643U, 0x4dd79a4dU, 0x33556633U, 0x85941185U,\n    0x45cf8a45U, 0xf910e9f9U, 0x02060402U, 0x7f81fe7fU,\n    0x50f0a050U, 0x3c44783cU, 0x9fba259fU, 0xa8e34ba8U,\n    0x51f3a251U, 0xa3fe5da3U, 0x40c08040U, 0x8f8a058fU,\n    0x92ad3f92U, 0x9dbc219dU, 0x38487038U, 0xf504f1f5U,\n    0xbcdf63bcU, 0xb6c177b6U, 0xda75afdaU, 0x21634221U,\n    0x10302010U, 0xff1ae5ffU, 0xf30efdf3U, 0xd26dbfd2U,\n    0xcd4c81cdU, 0x0c14180cU, 0x13352613U, 0xec2fc3ecU,\n    0x5fe1be5fU, 0x97a23597U, 0x44cc8844U, 0x17392e17U,\n    0xc45793c4U, 0xa7f255a7U, 0x7e82fc7eU, 0x3d477a3dU,\n    0x64acc864U, 0x5de7ba5dU, 0x192b3219U, 0x7395e673U,\n    0x60a0c060U, 0x81981981U, 0x4fd19e4fU, 0xdc7fa3dcU,\n    0x22664422U, 0x2a7e542aU, 0x90ab3b90U, 0x88830b88U,\n    0x46ca8c46U, 0xee29c7eeU, 0xb8d36bb8U, 0x143c2814U,\n    0xde79a7deU, 0x5ee2bc5eU, 0x0b1d160bU, 0xdb76addbU,\n    0xe03bdbe0U, 0x32566432U, 0x3a4e743aU, 0x0a1e140aU,\n    0x49db9249U, 0x060a0c06U, 0x246c4824U, 0x5ce4b85cU,\n    0xc25d9fc2U, 0xd36ebdd3U, 0xacef43acU, 0x62a6c462U,\n    0x91a83991U, 0x95a43195U, 0xe437d3e4U, 0x798bf279U,\n    0xe732d5e7U, 0xc8438bc8U, 0x37596e37U, 0x6db7da6dU,\n    0x8d8c018dU, 0xd564b1d5U, 0x4ed29c4eU, 0xa9e049a9U,\n    0x6cb4d86cU, 0x56faac56U, 0xf407f3f4U, 0xea25cfeaU,\n    0x65afca65U, 0x7a8ef47aU, 0xaee947aeU, 0x08181008U,\n    0xbad56fbaU, 0x7888f078U, 0x256f4a25U, 0x2e725c2eU,\n    0x1c24381cU, 0xa6f157a6U, 0xb4c773b4U, 0xc65197c6U,\n    0xe823cbe8U, 0xdd7ca1ddU, 0x749ce874U, 0x1f213e1fU,\n    0x4bdd964bU, 0xbddc61bdU, 0x8b860d8bU, 0x8a850f8aU,\n    0x7090e070U, 0x3e427c3eU, 0xb5c471b5U, 0x66aacc66U,\n    0x48d89048U, 0x03050603U, 0xf601f7f6U, 0x0e121c0eU,\n    0x61a3c261U, 0x355f6a35U, 0x57f9ae57U, 0xb9d069b9U,\n    0x86911786U, 0xc15899c1U, 0x1d273a1dU, 0x9eb9279eU,\n    0xe138d9e1U, 0xf813ebf8U, 0x98b32b98U, 0x11332211U,\n    0x69bbd269U, 0xd970a9d9U, 0x8e89078eU, 0x94a73394U,\n    0x9bb62d9bU, 0x1e223c1eU, 0x87921587U, 0xe920c9e9U,\n    0xce4987ceU, 0x55ffaa55U, 0x28785028U, 0xdf7aa5dfU,\n    0x8c8f038cU, 0xa1f859a1U, 0x89800989U, 0x0d171a0dU,\n    0xbfda65bfU, 0xe631d7e6U, 0x42c68442U, 0x68b8d068U,\n    0x41c38241U, 0x99b02999U, 0x2d775a2dU, 0x0f111e0fU,\n    0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU, 0x163a2c16U,\n};\nstatic const u32 Te3[256] = {\n\n    0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U,\n    0xf2f20dffU, 0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U,\n    0x30305060U, 0x01010302U, 0x6767a9ceU, 0x2b2b7d56U,\n    0xfefe19e7U, 0xd7d762b5U, 0xababe64dU, 0x76769aecU,\n    0xcaca458fU, 0x82829d1fU, 0xc9c94089U, 0x7d7d87faU,\n    0xfafa15efU, 0x5959ebb2U, 0x4747c98eU, 0xf0f00bfbU,\n    0xadadec41U, 0xd4d467b3U, 0xa2a2fd5fU, 0xafafea45U,\n    0x9c9cbf23U, 0xa4a4f753U, 0x727296e4U, 0xc0c05b9bU,\n    0xb7b7c275U, 0xfdfd1ce1U, 0x9393ae3dU, 0x26266a4cU,\n    0x36365a6cU, 0x3f3f417eU, 0xf7f702f5U, 0xcccc4f83U,\n    0x34345c68U, 0xa5a5f451U, 0xe5e534d1U, 0xf1f108f9U,\n    0x717193e2U, 0xd8d873abU, 0x31315362U, 0x15153f2aU,\n    0x04040c08U, 0xc7c75295U, 0x23236546U, 0xc3c35e9dU,\n    0x18182830U, 0x9696a137U, 0x05050f0aU, 0x9a9ab52fU,\n    0x0707090eU, 0x12123624U, 0x80809b1bU, 0xe2e23ddfU,\n    0xebeb26cdU, 0x2727694eU, 0xb2b2cd7fU, 0x75759feaU,\n    0x09091b12U, 0x83839e1dU, 0x2c2c7458U, 0x1a1a2e34U,\n    0x1b1b2d36U, 0x6e6eb2dcU, 0x5a5aeeb4U, 0xa0a0fb5bU,\n    0x5252f6a4U, 0x3b3b4d76U, 0xd6d661b7U, 0xb3b3ce7dU,\n    0x29297b52U, 0xe3e33eddU, 0x2f2f715eU, 0x84849713U,\n    0x5353f5a6U, 0xd1d168b9U, 0x00000000U, 0xeded2cc1U,\n    0x20206040U, 0xfcfc1fe3U, 0xb1b1c879U, 0x5b5bedb6U,\n    0x6a6abed4U, 0xcbcb468dU, 0xbebed967U, 0x39394b72U,\n    0x4a4ade94U, 0x4c4cd498U, 0x5858e8b0U, 0xcfcf4a85U,\n    0xd0d06bbbU, 0xefef2ac5U, 0xaaaae54fU, 0xfbfb16edU,\n    0x4343c586U, 0x4d4dd79aU, 0x33335566U, 0x85859411U,\n    0x4545cf8aU, 0xf9f910e9U, 0x02020604U, 0x7f7f81feU,\n    0x5050f0a0U, 0x3c3c4478U, 0x9f9fba25U, 0xa8a8e34bU,\n    0x5151f3a2U, 0xa3a3fe5dU, 0x4040c080U, 0x8f8f8a05U,\n    0x9292ad3fU, 0x9d9dbc21U, 0x38384870U, 0xf5f504f1U,\n    0xbcbcdf63U, 0xb6b6c177U, 0xdada75afU, 0x21216342U,\n    0x10103020U, 0xffff1ae5U, 0xf3f30efdU, 0xd2d26dbfU,\n    0xcdcd4c81U, 0x0c0c1418U, 0x13133526U, 0xecec2fc3U,\n    0x5f5fe1beU, 0x9797a235U, 0x4444cc88U, 0x1717392eU,\n    0xc4c45793U, 0xa7a7f255U, 0x7e7e82fcU, 0x3d3d477aU,\n    0x6464acc8U, 0x5d5de7baU, 0x19192b32U, 0x737395e6U,\n    0x6060a0c0U, 0x81819819U, 0x4f4fd19eU, 0xdcdc7fa3U,\n    0x22226644U, 0x2a2a7e54U, 0x9090ab3bU, 0x8888830bU,\n    0x4646ca8cU, 0xeeee29c7U, 0xb8b8d36bU, 0x14143c28U,\n    0xdede79a7U, 0x5e5ee2bcU, 0x0b0b1d16U, 0xdbdb76adU,\n    0xe0e03bdbU, 0x32325664U, 0x3a3a4e74U, 0x0a0a1e14U,\n    0x4949db92U, 0x06060a0cU, 0x24246c48U, 0x5c5ce4b8U,\n    0xc2c25d9fU, 0xd3d36ebdU, 0xacacef43U, 0x6262a6c4U,\n    0x9191a839U, 0x9595a431U, 0xe4e437d3U, 0x79798bf2U,\n    0xe7e732d5U, 0xc8c8438bU, 0x3737596eU, 0x6d6db7daU,\n    0x8d8d8c01U, 0xd5d564b1U, 0x4e4ed29cU, 0xa9a9e049U,\n    0x6c6cb4d8U, 0x5656faacU, 0xf4f407f3U, 0xeaea25cfU,\n    0x6565afcaU, 0x7a7a8ef4U, 0xaeaee947U, 0x08081810U,\n    0xbabad56fU, 0x787888f0U, 0x25256f4aU, 0x2e2e725cU,\n    0x1c1c2438U, 0xa6a6f157U, 0xb4b4c773U, 0xc6c65197U,\n    0xe8e823cbU, 0xdddd7ca1U, 0x74749ce8U, 0x1f1f213eU,\n    0x4b4bdd96U, 0xbdbddc61U, 0x8b8b860dU, 0x8a8a850fU,\n    0x707090e0U, 0x3e3e427cU, 0xb5b5c471U, 0x6666aaccU,\n    0x4848d890U, 0x03030506U, 0xf6f601f7U, 0x0e0e121cU,\n    0x6161a3c2U, 0x35355f6aU, 0x5757f9aeU, 0xb9b9d069U,\n    0x86869117U, 0xc1c15899U, 0x1d1d273aU, 0x9e9eb927U,\n    0xe1e138d9U, 0xf8f813ebU, 0x9898b32bU, 0x11113322U,\n    0x6969bbd2U, 0xd9d970a9U, 0x8e8e8907U, 0x9494a733U,\n    0x9b9bb62dU, 0x1e1e223cU, 0x87879215U, 0xe9e920c9U,\n    0xcece4987U, 0x5555ffaaU, 0x28287850U, 0xdfdf7aa5U,\n    0x8c8c8f03U, 0xa1a1f859U, 0x89898009U, 0x0d0d171aU,\n    0xbfbfda65U, 0xe6e631d7U, 0x4242c684U, 0x6868b8d0U,\n    0x4141c382U, 0x9999b029U, 0x2d2d775aU, 0x0f0f111eU,\n    0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU, 0x16163a2cU,\n};\nstatic const u32 Te4[256] = {\n    0x63636363U, 0x7c7c7c7cU, 0x77777777U, 0x7b7b7b7bU,\n    0xf2f2f2f2U, 0x6b6b6b6bU, 0x6f6f6f6fU, 0xc5c5c5c5U,\n    0x30303030U, 0x01010101U, 0x67676767U, 0x2b2b2b2bU,\n    0xfefefefeU, 0xd7d7d7d7U, 0xababababU, 0x76767676U,\n    0xcacacacaU, 0x82828282U, 0xc9c9c9c9U, 0x7d7d7d7dU,\n    0xfafafafaU, 0x59595959U, 0x47474747U, 0xf0f0f0f0U,\n    0xadadadadU, 0xd4d4d4d4U, 0xa2a2a2a2U, 0xafafafafU,\n    0x9c9c9c9cU, 0xa4a4a4a4U, 0x72727272U, 0xc0c0c0c0U,\n    0xb7b7b7b7U, 0xfdfdfdfdU, 0x93939393U, 0x26262626U,\n    0x36363636U, 0x3f3f3f3fU, 0xf7f7f7f7U, 0xccccccccU,\n    0x34343434U, 0xa5a5a5a5U, 0xe5e5e5e5U, 0xf1f1f1f1U,\n    0x71717171U, 0xd8d8d8d8U, 0x31313131U, 0x15151515U,\n    0x04040404U, 0xc7c7c7c7U, 0x23232323U, 0xc3c3c3c3U,\n    0x18181818U, 0x96969696U, 0x05050505U, 0x9a9a9a9aU,\n    0x07070707U, 0x12121212U, 0x80808080U, 0xe2e2e2e2U,\n    0xebebebebU, 0x27272727U, 0xb2b2b2b2U, 0x75757575U,\n    0x09090909U, 0x83838383U, 0x2c2c2c2cU, 0x1a1a1a1aU,\n    0x1b1b1b1bU, 0x6e6e6e6eU, 0x5a5a5a5aU, 0xa0a0a0a0U,\n    0x52525252U, 0x3b3b3b3bU, 0xd6d6d6d6U, 0xb3b3b3b3U,\n    0x29292929U, 0xe3e3e3e3U, 0x2f2f2f2fU, 0x84848484U,\n    0x53535353U, 0xd1d1d1d1U, 0x00000000U, 0xededededU,\n    0x20202020U, 0xfcfcfcfcU, 0xb1b1b1b1U, 0x5b5b5b5bU,\n    0x6a6a6a6aU, 0xcbcbcbcbU, 0xbebebebeU, 0x39393939U,\n    0x4a4a4a4aU, 0x4c4c4c4cU, 0x58585858U, 0xcfcfcfcfU,\n    0xd0d0d0d0U, 0xefefefefU, 0xaaaaaaaaU, 0xfbfbfbfbU,\n    0x43434343U, 0x4d4d4d4dU, 0x33333333U, 0x85858585U,\n    0x45454545U, 0xf9f9f9f9U, 0x02020202U, 0x7f7f7f7fU,\n    0x50505050U, 0x3c3c3c3cU, 0x9f9f9f9fU, 0xa8a8a8a8U,\n    0x51515151U, 0xa3a3a3a3U, 0x40404040U, 0x8f8f8f8fU,\n    0x92929292U, 0x9d9d9d9dU, 0x38383838U, 0xf5f5f5f5U,\n    0xbcbcbcbcU, 0xb6b6b6b6U, 0xdadadadaU, 0x21212121U,\n    0x10101010U, 0xffffffffU, 0xf3f3f3f3U, 0xd2d2d2d2U,\n    0xcdcdcdcdU, 0x0c0c0c0cU, 0x13131313U, 0xececececU,\n    0x5f5f5f5fU, 0x97979797U, 0x44444444U, 0x17171717U,\n    0xc4c4c4c4U, 0xa7a7a7a7U, 0x7e7e7e7eU, 0x3d3d3d3dU,\n    0x64646464U, 0x5d5d5d5dU, 0x19191919U, 0x73737373U,\n    0x60606060U, 0x81818181U, 0x4f4f4f4fU, 0xdcdcdcdcU,\n    0x22222222U, 0x2a2a2a2aU, 0x90909090U, 0x88888888U,\n    0x46464646U, 0xeeeeeeeeU, 0xb8b8b8b8U, 0x14141414U,\n    0xdedededeU, 0x5e5e5e5eU, 0x0b0b0b0bU, 0xdbdbdbdbU,\n    0xe0e0e0e0U, 0x32323232U, 0x3a3a3a3aU, 0x0a0a0a0aU,\n    0x49494949U, 0x06060606U, 0x24242424U, 0x5c5c5c5cU,\n    0xc2c2c2c2U, 0xd3d3d3d3U, 0xacacacacU, 0x62626262U,\n    0x91919191U, 0x95959595U, 0xe4e4e4e4U, 0x79797979U,\n    0xe7e7e7e7U, 0xc8c8c8c8U, 0x37373737U, 0x6d6d6d6dU,\n    0x8d8d8d8dU, 0xd5d5d5d5U, 0x4e4e4e4eU, 0xa9a9a9a9U,\n    0x6c6c6c6cU, 0x56565656U, 0xf4f4f4f4U, 0xeaeaeaeaU,\n    0x65656565U, 0x7a7a7a7aU, 0xaeaeaeaeU, 0x08080808U,\n    0xbabababaU, 0x78787878U, 0x25252525U, 0x2e2e2e2eU,\n    0x1c1c1c1cU, 0xa6a6a6a6U, 0xb4b4b4b4U, 0xc6c6c6c6U,\n    0xe8e8e8e8U, 0xddddddddU, 0x74747474U, 0x1f1f1f1fU,\n    0x4b4b4b4bU, 0xbdbdbdbdU, 0x8b8b8b8bU, 0x8a8a8a8aU,\n    0x70707070U, 0x3e3e3e3eU, 0xb5b5b5b5U, 0x66666666U,\n    0x48484848U, 0x03030303U, 0xf6f6f6f6U, 0x0e0e0e0eU,\n    0x61616161U, 0x35353535U, 0x57575757U, 0xb9b9b9b9U,\n    0x86868686U, 0xc1c1c1c1U, 0x1d1d1d1dU, 0x9e9e9e9eU,\n    0xe1e1e1e1U, 0xf8f8f8f8U, 0x98989898U, 0x11111111U,\n    0x69696969U, 0xd9d9d9d9U, 0x8e8e8e8eU, 0x94949494U,\n    0x9b9b9b9bU, 0x1e1e1e1eU, 0x87878787U, 0xe9e9e9e9U,\n    0xcecececeU, 0x55555555U, 0x28282828U, 0xdfdfdfdfU,\n    0x8c8c8c8cU, 0xa1a1a1a1U, 0x89898989U, 0x0d0d0d0dU,\n    0xbfbfbfbfU, 0xe6e6e6e6U, 0x42424242U, 0x68686868U,\n    0x41414141U, 0x99999999U, 0x2d2d2d2dU, 0x0f0f0f0fU,\n    0xb0b0b0b0U, 0x54545454U, 0xbbbbbbbbU, 0x16161616U,\n};\nstatic const u32 Td0[256] = {\n    0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U,\n    0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U,\n    0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U,\n    0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU,\n    0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U,\n    0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U,\n    0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU,\n    0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U,\n    0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU,\n    0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U,\n    0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U,\n    0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U,\n    0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U,\n    0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU,\n    0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U,\n    0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU,\n    0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U,\n    0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU,\n    0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U,\n    0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U,\n    0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U,\n    0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU,\n    0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U,\n    0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU,\n    0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U,\n    0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU,\n    0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U,\n    0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU,\n    0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU,\n    0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U,\n    0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU,\n    0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U,\n    0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU,\n    0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U,\n    0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U,\n    0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U,\n    0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU,\n    0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U,\n    0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U,\n    0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU,\n    0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U,\n    0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U,\n    0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U,\n    0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U,\n    0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U,\n    0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU,\n    0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U,\n    0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U,\n    0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U,\n    0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U,\n    0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U,\n    0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU,\n    0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU,\n    0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU,\n    0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU,\n    0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U,\n    0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U,\n    0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU,\n    0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU,\n    0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U,\n    0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU,\n    0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U,\n    0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U,\n    0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U,\n};\nstatic const u32 Td1[256] = {\n    0x5051f4a7U, 0x537e4165U, 0xc31a17a4U, 0x963a275eU,\n    0xcb3bab6bU, 0xf11f9d45U, 0xabacfa58U, 0x934be303U,\n    0x552030faU, 0xf6ad766dU, 0x9188cc76U, 0x25f5024cU,\n    0xfc4fe5d7U, 0xd7c52acbU, 0x80263544U, 0x8fb562a3U,\n    0x49deb15aU, 0x6725ba1bU, 0x9845ea0eU, 0xe15dfec0U,\n    0x02c32f75U, 0x12814cf0U, 0xa38d4697U, 0xc66bd3f9U,\n    0xe7038f5fU, 0x9515929cU, 0xebbf6d7aU, 0xda955259U,\n    0x2dd4be83U, 0xd3587421U, 0x2949e069U, 0x448ec9c8U,\n    0x6a75c289U, 0x78f48e79U, 0x6b99583eU, 0xdd27b971U,\n    0xb6bee14fU, 0x17f088adU, 0x66c920acU, 0xb47dce3aU,\n    0x1863df4aU, 0x82e51a31U, 0x60975133U, 0x4562537fU,\n    0xe0b16477U, 0x84bb6baeU, 0x1cfe81a0U, 0x94f9082bU,\n    0x58704868U, 0x198f45fdU, 0x8794de6cU, 0xb7527bf8U,\n    0x23ab73d3U, 0xe2724b02U, 0x57e31f8fU, 0x2a6655abU,\n    0x07b2eb28U, 0x032fb5c2U, 0x9a86c57bU, 0xa5d33708U,\n    0xf2302887U, 0xb223bfa5U, 0xba02036aU, 0x5ced1682U,\n    0x2b8acf1cU, 0x92a779b4U, 0xf0f307f2U, 0xa14e69e2U,\n    0xcd65daf4U, 0xd50605beU, 0x1fd13462U, 0x8ac4a6feU,\n    0x9d342e53U, 0xa0a2f355U, 0x32058ae1U, 0x75a4f6ebU,\n    0x390b83ecU, 0xaa4060efU, 0x065e719fU, 0x51bd6e10U,\n    0xf93e218aU, 0x3d96dd06U, 0xaedd3e05U, 0x464de6bdU,\n    0xb591548dU, 0x0571c45dU, 0x6f0406d4U, 0xff605015U,\n    0x241998fbU, 0x97d6bde9U, 0xcc894043U, 0x7767d99eU,\n    0xbdb0e842U, 0x8807898bU, 0x38e7195bU, 0xdb79c8eeU,\n    0x47a17c0aU, 0xe97c420fU, 0xc9f8841eU, 0x00000000U,\n    0x83098086U, 0x48322bedU, 0xac1e1170U, 0x4e6c5a72U,\n    0xfbfd0effU, 0x560f8538U, 0x1e3daed5U, 0x27362d39U,\n    0x640a0fd9U, 0x21685ca6U, 0xd19b5b54U, 0x3a24362eU,\n    0xb10c0a67U, 0x0f9357e7U, 0xd2b4ee96U, 0x9e1b9b91U,\n    0x4f80c0c5U, 0xa261dc20U, 0x695a774bU, 0x161c121aU,\n    0x0ae293baU, 0xe5c0a02aU, 0x433c22e0U, 0x1d121b17U,\n    0x0b0e090dU, 0xadf28bc7U, 0xb92db6a8U, 0xc8141ea9U,\n    0x8557f119U, 0x4caf7507U, 0xbbee99ddU, 0xfda37f60U,\n    0x9ff70126U, 0xbc5c72f5U, 0xc544663bU, 0x345bfb7eU,\n    0x768b4329U, 0xdccb23c6U, 0x68b6edfcU, 0x63b8e4f1U,\n    0xcad731dcU, 0x10426385U, 0x40139722U, 0x2084c611U,\n    0x7d854a24U, 0xf8d2bb3dU, 0x11aef932U, 0x6dc729a1U,\n    0x4b1d9e2fU, 0xf3dcb230U, 0xec0d8652U, 0xd077c1e3U,\n    0x6c2bb316U, 0x99a970b9U, 0xfa119448U, 0x2247e964U,\n    0xc4a8fc8cU, 0x1aa0f03fU, 0xd8567d2cU, 0xef223390U,\n    0xc787494eU, 0xc1d938d1U, 0xfe8ccaa2U, 0x3698d40bU,\n    0xcfa6f581U, 0x28a57adeU, 0x26dab78eU, 0xa43fadbfU,\n    0xe42c3a9dU, 0x0d507892U, 0x9b6a5fccU, 0x62547e46U,\n    0xc2f68d13U, 0xe890d8b8U, 0x5e2e39f7U, 0xf582c3afU,\n    0xbe9f5d80U, 0x7c69d093U, 0xa96fd52dU, 0xb3cf2512U,\n    0x3bc8ac99U, 0xa710187dU, 0x6ee89c63U, 0x7bdb3bbbU,\n    0x09cd2678U, 0xf46e5918U, 0x01ec9ab7U, 0xa8834f9aU,\n    0x65e6956eU, 0x7eaaffe6U, 0x0821bccfU, 0xe6ef15e8U,\n    0xd9bae79bU, 0xce4a6f36U, 0xd4ea9f09U, 0xd629b07cU,\n    0xaf31a4b2U, 0x312a3f23U, 0x30c6a594U, 0xc035a266U,\n    0x37744ebcU, 0xa6fc82caU, 0xb0e090d0U, 0x1533a7d8U,\n    0x4af10498U, 0xf741ecdaU, 0x0e7fcd50U, 0x2f1791f6U,\n    0x8d764dd6U, 0x4d43efb0U, 0x54ccaa4dU, 0xdfe49604U,\n    0xe39ed1b5U, 0x1b4c6a88U, 0xb8c12c1fU, 0x7f466551U,\n    0x049d5eeaU, 0x5d018c35U, 0x73fa8774U, 0x2efb0b41U,\n    0x5ab3671dU, 0x5292dbd2U, 0x33e91056U, 0x136dd647U,\n    0x8c9ad761U, 0x7a37a10cU, 0x8e59f814U, 0x89eb133cU,\n    0xeecea927U, 0x35b761c9U, 0xede11ce5U, 0x3c7a47b1U,\n    0x599cd2dfU, 0x3f55f273U, 0x791814ceU, 0xbf73c737U,\n    0xea53f7cdU, 0x5b5ffdaaU, 0x14df3d6fU, 0x867844dbU,\n    0x81caaff3U, 0x3eb968c4U, 0x2c382434U, 0x5fc2a340U,\n    0x72161dc3U, 0x0cbce225U, 0x8b283c49U, 0x41ff0d95U,\n    0x7139a801U, 0xde080cb3U, 0x9cd8b4e4U, 0x906456c1U,\n    0x617bcb84U, 0x70d532b6U, 0x74486c5cU, 0x42d0b857U,\n};\nstatic const u32 Td2[256] = {\n    0xa75051f4U, 0x65537e41U, 0xa4c31a17U, 0x5e963a27U,\n    0x6bcb3babU, 0x45f11f9dU, 0x58abacfaU, 0x03934be3U,\n    0xfa552030U, 0x6df6ad76U, 0x769188ccU, 0x4c25f502U,\n    0xd7fc4fe5U, 0xcbd7c52aU, 0x44802635U, 0xa38fb562U,\n    0x5a49deb1U, 0x1b6725baU, 0x0e9845eaU, 0xc0e15dfeU,\n    0x7502c32fU, 0xf012814cU, 0x97a38d46U, 0xf9c66bd3U,\n    0x5fe7038fU, 0x9c951592U, 0x7aebbf6dU, 0x59da9552U,\n    0x832dd4beU, 0x21d35874U, 0x692949e0U, 0xc8448ec9U,\n    0x896a75c2U, 0x7978f48eU, 0x3e6b9958U, 0x71dd27b9U,\n    0x4fb6bee1U, 0xad17f088U, 0xac66c920U, 0x3ab47dceU,\n    0x4a1863dfU, 0x3182e51aU, 0x33609751U, 0x7f456253U,\n    0x77e0b164U, 0xae84bb6bU, 0xa01cfe81U, 0x2b94f908U,\n    0x68587048U, 0xfd198f45U, 0x6c8794deU, 0xf8b7527bU,\n    0xd323ab73U, 0x02e2724bU, 0x8f57e31fU, 0xab2a6655U,\n    0x2807b2ebU, 0xc2032fb5U, 0x7b9a86c5U, 0x08a5d337U,\n    0x87f23028U, 0xa5b223bfU, 0x6aba0203U, 0x825ced16U,\n    0x1c2b8acfU, 0xb492a779U, 0xf2f0f307U, 0xe2a14e69U,\n    0xf4cd65daU, 0xbed50605U, 0x621fd134U, 0xfe8ac4a6U,\n    0x539d342eU, 0x55a0a2f3U, 0xe132058aU, 0xeb75a4f6U,\n    0xec390b83U, 0xefaa4060U, 0x9f065e71U, 0x1051bd6eU,\n\n    0x8af93e21U, 0x063d96ddU, 0x05aedd3eU, 0xbd464de6U,\n    0x8db59154U, 0x5d0571c4U, 0xd46f0406U, 0x15ff6050U,\n    0xfb241998U, 0xe997d6bdU, 0x43cc8940U, 0x9e7767d9U,\n    0x42bdb0e8U, 0x8b880789U, 0x5b38e719U, 0xeedb79c8U,\n    0x0a47a17cU, 0x0fe97c42U, 0x1ec9f884U, 0x00000000U,\n    0x86830980U, 0xed48322bU, 0x70ac1e11U, 0x724e6c5aU,\n    0xfffbfd0eU, 0x38560f85U, 0xd51e3daeU, 0x3927362dU,\n    0xd9640a0fU, 0xa621685cU, 0x54d19b5bU, 0x2e3a2436U,\n    0x67b10c0aU, 0xe70f9357U, 0x96d2b4eeU, 0x919e1b9bU,\n    0xc54f80c0U, 0x20a261dcU, 0x4b695a77U, 0x1a161c12U,\n    0xba0ae293U, 0x2ae5c0a0U, 0xe0433c22U, 0x171d121bU,\n    0x0d0b0e09U, 0xc7adf28bU, 0xa8b92db6U, 0xa9c8141eU,\n    0x198557f1U, 0x074caf75U, 0xddbbee99U, 0x60fda37fU,\n    0x269ff701U, 0xf5bc5c72U, 0x3bc54466U, 0x7e345bfbU,\n    0x29768b43U, 0xc6dccb23U, 0xfc68b6edU, 0xf163b8e4U,\n    0xdccad731U, 0x85104263U, 0x22401397U, 0x112084c6U,\n    0x247d854aU, 0x3df8d2bbU, 0x3211aef9U, 0xa16dc729U,\n    0x2f4b1d9eU, 0x30f3dcb2U, 0x52ec0d86U, 0xe3d077c1U,\n    0x166c2bb3U, 0xb999a970U, 0x48fa1194U, 0x642247e9U,\n    0x8cc4a8fcU, 0x3f1aa0f0U, 0x2cd8567dU, 0x90ef2233U,\n    0x4ec78749U, 0xd1c1d938U, 0xa2fe8ccaU, 0x0b3698d4U,\n    0x81cfa6f5U, 0xde28a57aU, 0x8e26dab7U, 0xbfa43fadU,\n    0x9de42c3aU, 0x920d5078U, 0xcc9b6a5fU, 0x4662547eU,\n    0x13c2f68dU, 0xb8e890d8U, 0xf75e2e39U, 0xaff582c3U,\n    0x80be9f5dU, 0x937c69d0U, 0x2da96fd5U, 0x12b3cf25U,\n    0x993bc8acU, 0x7da71018U, 0x636ee89cU, 0xbb7bdb3bU,\n    0x7809cd26U, 0x18f46e59U, 0xb701ec9aU, 0x9aa8834fU,\n    0x6e65e695U, 0xe67eaaffU, 0xcf0821bcU, 0xe8e6ef15U,\n    0x9bd9bae7U, 0x36ce4a6fU, 0x09d4ea9fU, 0x7cd629b0U,\n    0xb2af31a4U, 0x23312a3fU, 0x9430c6a5U, 0x66c035a2U,\n    0xbc37744eU, 0xcaa6fc82U, 0xd0b0e090U, 0xd81533a7U,\n    0x984af104U, 0xdaf741ecU, 0x500e7fcdU, 0xf62f1791U,\n    0xd68d764dU, 0xb04d43efU, 0x4d54ccaaU, 0x04dfe496U,\n    0xb5e39ed1U, 0x881b4c6aU, 0x1fb8c12cU, 0x517f4665U,\n    0xea049d5eU, 0x355d018cU, 0x7473fa87U, 0x412efb0bU,\n    0x1d5ab367U, 0xd25292dbU, 0x5633e910U, 0x47136dd6U,\n    0x618c9ad7U, 0x0c7a37a1U, 0x148e59f8U, 0x3c89eb13U,\n    0x27eecea9U, 0xc935b761U, 0xe5ede11cU, 0xb13c7a47U,\n    0xdf599cd2U, 0x733f55f2U, 0xce791814U, 0x37bf73c7U,\n    0xcdea53f7U, 0xaa5b5ffdU, 0x6f14df3dU, 0xdb867844U,\n    0xf381caafU, 0xc43eb968U, 0x342c3824U, 0x405fc2a3U,\n    0xc372161dU, 0x250cbce2U, 0x498b283cU, 0x9541ff0dU,\n    0x017139a8U, 0xb3de080cU, 0xe49cd8b4U, 0xc1906456U,\n    0x84617bcbU, 0xb670d532U, 0x5c74486cU, 0x5742d0b8U,\n};\nstatic const u32 Td3[256] = {\n    0xf4a75051U, 0x4165537eU, 0x17a4c31aU, 0x275e963aU,\n    0xab6bcb3bU, 0x9d45f11fU, 0xfa58abacU, 0xe303934bU,\n    0x30fa5520U, 0x766df6adU, 0xcc769188U, 0x024c25f5U,\n    0xe5d7fc4fU, 0x2acbd7c5U, 0x35448026U, 0x62a38fb5U,\n    0xb15a49deU, 0xba1b6725U, 0xea0e9845U, 0xfec0e15dU,\n    0x2f7502c3U, 0x4cf01281U, 0x4697a38dU, 0xd3f9c66bU,\n    0x8f5fe703U, 0x929c9515U, 0x6d7aebbfU, 0x5259da95U,\n    0xbe832dd4U, 0x7421d358U, 0xe0692949U, 0xc9c8448eU,\n    0xc2896a75U, 0x8e7978f4U, 0x583e6b99U, 0xb971dd27U,\n    0xe14fb6beU, 0x88ad17f0U, 0x20ac66c9U, 0xce3ab47dU,\n    0xdf4a1863U, 0x1a3182e5U, 0x51336097U, 0x537f4562U,\n    0x6477e0b1U, 0x6bae84bbU, 0x81a01cfeU, 0x082b94f9U,\n    0x48685870U, 0x45fd198fU, 0xde6c8794U, 0x7bf8b752U,\n    0x73d323abU, 0x4b02e272U, 0x1f8f57e3U, 0x55ab2a66U,\n    0xeb2807b2U, 0xb5c2032fU, 0xc57b9a86U, 0x3708a5d3U,\n    0x2887f230U, 0xbfa5b223U, 0x036aba02U, 0x16825cedU,\n    0xcf1c2b8aU, 0x79b492a7U, 0x07f2f0f3U, 0x69e2a14eU,\n    0xdaf4cd65U, 0x05bed506U, 0x34621fd1U, 0xa6fe8ac4U,\n    0x2e539d34U, 0xf355a0a2U, 0x8ae13205U, 0xf6eb75a4U,\n    0x83ec390bU, 0x60efaa40U, 0x719f065eU, 0x6e1051bdU,\n    0x218af93eU, 0xdd063d96U, 0x3e05aeddU, 0xe6bd464dU,\n    0x548db591U, 0xc45d0571U, 0x06d46f04U, 0x5015ff60U,\n    0x98fb2419U, 0xbde997d6U, 0x4043cc89U, 0xd99e7767U,\n    0xe842bdb0U, 0x898b8807U, 0x195b38e7U, 0xc8eedb79U,\n    0x7c0a47a1U, 0x420fe97cU, 0x841ec9f8U, 0x00000000U,\n    0x80868309U, 0x2bed4832U, 0x1170ac1eU, 0x5a724e6cU,\n    0x0efffbfdU, 0x8538560fU, 0xaed51e3dU, 0x2d392736U,\n    0x0fd9640aU, 0x5ca62168U, 0x5b54d19bU, 0x362e3a24U,\n    0x0a67b10cU, 0x57e70f93U, 0xee96d2b4U, 0x9b919e1bU,\n    0xc0c54f80U, 0xdc20a261U, 0x774b695aU, 0x121a161cU,\n    0x93ba0ae2U, 0xa02ae5c0U, 0x22e0433cU, 0x1b171d12U,\n    0x090d0b0eU, 0x8bc7adf2U, 0xb6a8b92dU, 0x1ea9c814U,\n    0xf1198557U, 0x75074cafU, 0x99ddbbeeU, 0x7f60fda3U,\n    0x01269ff7U, 0x72f5bc5cU, 0x663bc544U, 0xfb7e345bU,\n    0x4329768bU, 0x23c6dccbU, 0xedfc68b6U, 0xe4f163b8U,\n    0x31dccad7U, 0x63851042U, 0x97224013U, 0xc6112084U,\n    0x4a247d85U, 0xbb3df8d2U, 0xf93211aeU, 0x29a16dc7U,\n    0x9e2f4b1dU, 0xb230f3dcU, 0x8652ec0dU, 0xc1e3d077U,\n    0xb3166c2bU, 0x70b999a9U, 0x9448fa11U, 0xe9642247U,\n    0xfc8cc4a8U, 0xf03f1aa0U, 0x7d2cd856U, 0x3390ef22U,\n    0x494ec787U, 0x38d1c1d9U, 0xcaa2fe8cU, 0xd40b3698U,\n    0xf581cfa6U, 0x7ade28a5U, 0xb78e26daU, 0xadbfa43fU,\n    0x3a9de42cU, 0x78920d50U, 0x5fcc9b6aU, 0x7e466254U,\n    0x8d13c2f6U, 0xd8b8e890U, 0x39f75e2eU, 0xc3aff582U,\n    0x5d80be9fU, 0xd0937c69U, 0xd52da96fU, 0x2512b3cfU,\n    0xac993bc8U, 0x187da710U, 0x9c636ee8U, 0x3bbb7bdbU,\n    0x267809cdU, 0x5918f46eU, 0x9ab701ecU, 0x4f9aa883U,\n    0x956e65e6U, 0xffe67eaaU, 0xbccf0821U, 0x15e8e6efU,\n    0xe79bd9baU, 0x6f36ce4aU, 0x9f09d4eaU, 0xb07cd629U,\n    0xa4b2af31U, 0x3f23312aU, 0xa59430c6U, 0xa266c035U,\n    0x4ebc3774U, 0x82caa6fcU, 0x90d0b0e0U, 0xa7d81533U,\n    0x04984af1U, 0xecdaf741U, 0xcd500e7fU, 0x91f62f17U,\n    0x4dd68d76U, 0xefb04d43U, 0xaa4d54ccU, 0x9604dfe4U,\n    0xd1b5e39eU, 0x6a881b4cU, 0x2c1fb8c1U, 0x65517f46U,\n    0x5eea049dU, 0x8c355d01U, 0x877473faU, 0x0b412efbU,\n    0x671d5ab3U, 0xdbd25292U, 0x105633e9U, 0xd647136dU,\n    0xd7618c9aU, 0xa10c7a37U, 0xf8148e59U, 0x133c89ebU,\n    0xa927eeceU, 0x61c935b7U, 0x1ce5ede1U, 0x47b13c7aU,\n    0xd2df599cU, 0xf2733f55U, 0x14ce7918U, 0xc737bf73U,\n    0xf7cdea53U, 0xfdaa5b5fU, 0x3d6f14dfU, 0x44db8678U,\n    0xaff381caU, 0x68c43eb9U, 0x24342c38U, 0xa3405fc2U,\n    0x1dc37216U, 0xe2250cbcU, 0x3c498b28U, 0x0d9541ffU,\n    0xa8017139U, 0x0cb3de08U, 0xb4e49cd8U, 0x56c19064U,\n    0xcb84617bU, 0x32b670d5U, 0x6c5c7448U, 0xb85742d0U,\n};\nstatic const u32 Td4[256] = {\n    0x52525252U, 0x09090909U, 0x6a6a6a6aU, 0xd5d5d5d5U,\n    0x30303030U, 0x36363636U, 0xa5a5a5a5U, 0x38383838U,\n    0xbfbfbfbfU, 0x40404040U, 0xa3a3a3a3U, 0x9e9e9e9eU,\n    0x81818181U, 0xf3f3f3f3U, 0xd7d7d7d7U, 0xfbfbfbfbU,\n    0x7c7c7c7cU, 0xe3e3e3e3U, 0x39393939U, 0x82828282U,\n    0x9b9b9b9bU, 0x2f2f2f2fU, 0xffffffffU, 0x87878787U,\n    0x34343434U, 0x8e8e8e8eU, 0x43434343U, 0x44444444U,\n    0xc4c4c4c4U, 0xdedededeU, 0xe9e9e9e9U, 0xcbcbcbcbU,\n    0x54545454U, 0x7b7b7b7bU, 0x94949494U, 0x32323232U,\n    0xa6a6a6a6U, 0xc2c2c2c2U, 0x23232323U, 0x3d3d3d3dU,\n    0xeeeeeeeeU, 0x4c4c4c4cU, 0x95959595U, 0x0b0b0b0bU,\n    0x42424242U, 0xfafafafaU, 0xc3c3c3c3U, 0x4e4e4e4eU,\n    0x08080808U, 0x2e2e2e2eU, 0xa1a1a1a1U, 0x66666666U,\n    0x28282828U, 0xd9d9d9d9U, 0x24242424U, 0xb2b2b2b2U,\n    0x76767676U, 0x5b5b5b5bU, 0xa2a2a2a2U, 0x49494949U,\n    0x6d6d6d6dU, 0x8b8b8b8bU, 0xd1d1d1d1U, 0x25252525U,\n    0x72727272U, 0xf8f8f8f8U, 0xf6f6f6f6U, 0x64646464U,\n    0x86868686U, 0x68686868U, 0x98989898U, 0x16161616U,\n    0xd4d4d4d4U, 0xa4a4a4a4U, 0x5c5c5c5cU, 0xccccccccU,\n    0x5d5d5d5dU, 0x65656565U, 0xb6b6b6b6U, 0x92929292U,\n    0x6c6c6c6cU, 0x70707070U, 0x48484848U, 0x50505050U,\n    0xfdfdfdfdU, 0xededededU, 0xb9b9b9b9U, 0xdadadadaU,\n    0x5e5e5e5eU, 0x15151515U, 0x46464646U, 0x57575757U,\n    0xa7a7a7a7U, 0x8d8d8d8dU, 0x9d9d9d9dU, 0x84848484U,\n    0x90909090U, 0xd8d8d8d8U, 0xababababU, 0x00000000U,\n    0x8c8c8c8cU, 0xbcbcbcbcU, 0xd3d3d3d3U, 0x0a0a0a0aU,\n    0xf7f7f7f7U, 0xe4e4e4e4U, 0x58585858U, 0x05050505U,\n    0xb8b8b8b8U, 0xb3b3b3b3U, 0x45454545U, 0x06060606U,\n    0xd0d0d0d0U, 0x2c2c2c2cU, 0x1e1e1e1eU, 0x8f8f8f8fU,\n    0xcacacacaU, 0x3f3f3f3fU, 0x0f0f0f0fU, 0x02020202U,\n    0xc1c1c1c1U, 0xafafafafU, 0xbdbdbdbdU, 0x03030303U,\n    0x01010101U, 0x13131313U, 0x8a8a8a8aU, 0x6b6b6b6bU,\n    0x3a3a3a3aU, 0x91919191U, 0x11111111U, 0x41414141U,\n    0x4f4f4f4fU, 0x67676767U, 0xdcdcdcdcU, 0xeaeaeaeaU,\n    0x97979797U, 0xf2f2f2f2U, 0xcfcfcfcfU, 0xcecececeU,\n    0xf0f0f0f0U, 0xb4b4b4b4U, 0xe6e6e6e6U, 0x73737373U,\n    0x96969696U, 0xacacacacU, 0x74747474U, 0x22222222U,\n    0xe7e7e7e7U, 0xadadadadU, 0x35353535U, 0x85858585U,\n    0xe2e2e2e2U, 0xf9f9f9f9U, 0x37373737U, 0xe8e8e8e8U,\n    0x1c1c1c1cU, 0x75757575U, 0xdfdfdfdfU, 0x6e6e6e6eU,\n    0x47474747U, 0xf1f1f1f1U, 0x1a1a1a1aU, 0x71717171U,\n    0x1d1d1d1dU, 0x29292929U, 0xc5c5c5c5U, 0x89898989U,\n    0x6f6f6f6fU, 0xb7b7b7b7U, 0x62626262U, 0x0e0e0e0eU,\n    0xaaaaaaaaU, 0x18181818U, 0xbebebebeU, 0x1b1b1b1bU,\n    0xfcfcfcfcU, 0x56565656U, 0x3e3e3e3eU, 0x4b4b4b4bU,\n    0xc6c6c6c6U, 0xd2d2d2d2U, 0x79797979U, 0x20202020U,\n    0x9a9a9a9aU, 0xdbdbdbdbU, 0xc0c0c0c0U, 0xfefefefeU,\n    0x78787878U, 0xcdcdcdcdU, 0x5a5a5a5aU, 0xf4f4f4f4U,\n    0x1f1f1f1fU, 0xddddddddU, 0xa8a8a8a8U, 0x33333333U,\n    0x88888888U, 0x07070707U, 0xc7c7c7c7U, 0x31313131U,\n    0xb1b1b1b1U, 0x12121212U, 0x10101010U, 0x59595959U,\n    0x27272727U, 0x80808080U, 0xececececU, 0x5f5f5f5fU,\n    0x60606060U, 0x51515151U, 0x7f7f7f7fU, 0xa9a9a9a9U,\n    0x19191919U, 0xb5b5b5b5U, 0x4a4a4a4aU, 0x0d0d0d0dU,\n    0x2d2d2d2dU, 0xe5e5e5e5U, 0x7a7a7a7aU, 0x9f9f9f9fU,\n    0x93939393U, 0xc9c9c9c9U, 0x9c9c9c9cU, 0xefefefefU,\n    0xa0a0a0a0U, 0xe0e0e0e0U, 0x3b3b3b3bU, 0x4d4d4d4dU,\n    0xaeaeaeaeU, 0x2a2a2a2aU, 0xf5f5f5f5U, 0xb0b0b0b0U,\n    0xc8c8c8c8U, 0xebebebebU, 0xbbbbbbbbU, 0x3c3c3c3cU,\n    0x83838383U, 0x53535353U, 0x99999999U, 0x61616161U,\n    0x17171717U, 0x2b2b2b2bU, 0x04040404U, 0x7e7e7e7eU,\n    0xbabababaU, 0x77777777U, 0xd6d6d6d6U, 0x26262626U,\n    0xe1e1e1e1U, 0x69696969U, 0x14141414U, 0x63636363U,\n    0x55555555U, 0x21212121U, 0x0c0c0c0cU, 0x7d7d7d7dU,\n};\nstatic const u32 rcon[] = {\n\t0x01000000, 0x02000000, 0x04000000, 0x08000000,\n\t0x10000000, 0x20000000, 0x40000000, 0x80000000,\n\t0x1B000000, 0x36000000, /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */\n};\n\n#define SWAP(x) (_lrotl(x, 8) & 0x00ff00ff | _lrotr(x, 8) & 0xff00ff00)\n\n#ifdef _MSC_VER\n#define GETU32(p) SWAP(*((u32 *)(p)))\n#define PUTU32(ct, st) { *((u32 *)(ct)) = SWAP((st)); }\n#else\n#define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ ((u32)(pt)[2] <<  8) ^ ((u32)(pt)[3]))\n#define PUTU32(ct, st) { (ct)[0] = (u8)((st) >> 24); (ct)[1] = (u8)((st) >> 16); (ct)[2] = (u8)((st) >>  8); (ct)[3] = (u8)(st); }\n#endif\n\n/**\n * Expand the cipher key into the encryption key schedule.\n *\n * @return\tthe number of rounds for the given cipher key size.\n */\nint rijndaelKeySetupEnc(u32 rk[/*4*(Nr + 1)*/], const u8 cipherKey[], int keyBits) {\n   \tint i = 0;\n\tu32 temp;\n\n\trk[0] = GETU32(cipherKey     );\n\trk[1] = GETU32(cipherKey +  4);\n\trk[2] = GETU32(cipherKey +  8);\n\trk[3] = GETU32(cipherKey + 12);\n\tif (keyBits == 128) {\n\t\tfor (;;) {\n\t\t\ttemp  = rk[3];\n\t\t\trk[4] = rk[0] ^\n\t\t\t\t(Te4[(temp >> 16) & 0xff] & 0xff000000) ^\n\t\t\t\t(Te4[(temp >>  8) & 0xff] & 0x00ff0000) ^\n\t\t\t\t(Te4[(temp      ) & 0xff] & 0x0000ff00) ^\n\t\t\t\t(Te4[(temp >> 24)       ] & 0x000000ff) ^\n\t\t\t\trcon[i];\n\t\t\trk[5] = rk[1] ^ rk[4];\n\t\t\trk[6] = rk[2] ^ rk[5];\n\t\t\trk[7] = rk[3] ^ rk[6];\n\t\t\tif (++i == 10) {\n\t\t\t\treturn 10;\n\t\t\t}\n\t\t\trk += 4;\n\t\t}\n\t}\n\trk[4] = GETU32(cipherKey + 16);\n\trk[5] = GETU32(cipherKey + 20);\n\tif (keyBits == 192) {\n\t\tfor (;;) {\n\t\t\ttemp = rk[ 5];\n\t\t\trk[ 6] = rk[ 0] ^\n\t\t\t\t(Te4[(temp >> 16) & 0xff] & 0xff000000) ^\n\t\t\t\t(Te4[(temp >>  8) & 0xff] & 0x00ff0000) ^\n\t\t\t\t(Te4[(temp      ) & 0xff] & 0x0000ff00) ^\n\t\t\t\t(Te4[(temp >> 24)       ] & 0x000000ff) ^\n\t\t\t\trcon[i];\n\t\t\trk[ 7] = rk[ 1] ^ rk[ 6];\n\t\t\trk[ 8] = rk[ 2] ^ rk[ 7];\n\t\t\trk[ 9] = rk[ 3] ^ rk[ 8];\n\t\t\tif (++i == 8) {\n\t\t\t\treturn 12;\n\t\t\t}\n\t\t\trk[10] = rk[ 4] ^ rk[ 9];\n\t\t\trk[11] = rk[ 5] ^ rk[10];\n\t\t\trk += 6;\n\t\t}\n\t}\n\trk[6] = GETU32(cipherKey + 24);\n\trk[7] = GETU32(cipherKey + 28);\n\tif (keyBits == 256) {\n        for (;;) {\n        \ttemp = rk[ 7];\n        \trk[ 8] = rk[ 0] ^\n        \t\t(Te4[(temp >> 16) & 0xff] & 0xff000000) ^\n        \t\t(Te4[(temp >>  8) & 0xff] & 0x00ff0000) ^\n        \t\t(Te4[(temp      ) & 0xff] & 0x0000ff00) ^\n        \t\t(Te4[(temp >> 24)       ] & 0x000000ff) ^\n        \t\trcon[i];\n        \trk[ 9] = rk[ 1] ^ rk[ 8];\n        \trk[10] = rk[ 2] ^ rk[ 9];\n        \trk[11] = rk[ 3] ^ rk[10];\n\t\t\tif (++i == 7) {\n\t\t\t\treturn 14;\n\t\t\t}\n        \ttemp = rk[11];\n        \trk[12] = rk[ 4] ^\n        \t\t(Te4[(temp >> 24)       ] & 0xff000000) ^\n        \t\t(Te4[(temp >> 16) & 0xff] & 0x00ff0000) ^\n        \t\t(Te4[(temp >>  8) & 0xff] & 0x0000ff00) ^\n        \t\t(Te4[(temp      ) & 0xff] & 0x000000ff);\n        \trk[13] = rk[ 5] ^ rk[12];\n        \trk[14] = rk[ 6] ^ rk[13];\n        \trk[15] = rk[ 7] ^ rk[14];\n\n\t\t\trk += 8;\n        }\n\t}\n\treturn 0;\n}\n\n/**\n * Expand the cipher key into the decryption key schedule.\n *\n * @return\tthe number of rounds for the given cipher key size.\n */\nint rijndaelKeySetupDec(u32 rk[/*4*(Nr + 1)*/], const u8 cipherKey[], int keyBits) {\n\tint Nr, i, j;\n\tu32 temp;\n\n\t/* expand the cipher key: */\n\tNr = rijndaelKeySetupEnc(rk, cipherKey, keyBits);\n\t/* invert the order of the round keys: */\n\tfor (i = 0, j = 4*Nr; i < j; i += 4, j -= 4) {\n\t\ttemp = rk[i    ]; rk[i    ] = rk[j    ]; rk[j    ] = temp;\n\t\ttemp = rk[i + 1]; rk[i + 1] = rk[j + 1]; rk[j + 1] = temp;\n\t\ttemp = rk[i + 2]; rk[i + 2] = rk[j + 2]; rk[j + 2] = temp;\n\t\ttemp = rk[i + 3]; rk[i + 3] = rk[j + 3]; rk[j + 3] = temp;\n\t}\n\t/* apply the inverse MixColumn transform to all round keys but the first and the last: */\n\tfor (i = 1; i < Nr; i++) {\n\t\trk += 4;\n\t\trk[0] =\n\t\t\tTd0[Te4[(rk[0] >> 24)       ] & 0xff] ^\n\t\t\tTd1[Te4[(rk[0] >> 16) & 0xff] & 0xff] ^\n\t\t\tTd2[Te4[(rk[0] >>  8) & 0xff] & 0xff] ^\n\t\t\tTd3[Te4[(rk[0]      ) & 0xff] & 0xff];\n\t\trk[1] =\n\t\t\tTd0[Te4[(rk[1] >> 24)       ] & 0xff] ^\n\t\t\tTd1[Te4[(rk[1] >> 16) & 0xff] & 0xff] ^\n\t\t\tTd2[Te4[(rk[1] >>  8) & 0xff] & 0xff] ^\n\t\t\tTd3[Te4[(rk[1]      ) & 0xff] & 0xff];\n\t\trk[2] =\n\t\t\tTd0[Te4[(rk[2] >> 24)       ] & 0xff] ^\n\t\t\tTd1[Te4[(rk[2] >> 16) & 0xff] & 0xff] ^\n\t\t\tTd2[Te4[(rk[2] >>  8) & 0xff] & 0xff] ^\n\t\t\tTd3[Te4[(rk[2]      ) & 0xff] & 0xff];\n\t\trk[3] =\n\t\t\tTd0[Te4[(rk[3] >> 24)       ] & 0xff] ^\n\t\t\tTd1[Te4[(rk[3] >> 16) & 0xff] & 0xff] ^\n\t\t\tTd2[Te4[(rk[3] >>  8) & 0xff] & 0xff] ^\n\t\t\tTd3[Te4[(rk[3]      ) & 0xff] & 0xff];\n\t}\n\treturn Nr;\n}\n\nvoid rijndaelEncrypt(const u32 rk[/*4*(Nr + 1)*/], int Nr, const u8 pt[16], u8 ct[16]) {\n\tu32 s0, s1, s2, s3, t0, t1, t2, t3;\n#ifndef FULL_UNROLL\n    int r;\n#endif /* ?FULL_UNROLL */\n\n    /*\n\t * map byte array block to cipher state\n\t * and add initial round key:\n\t */\n\ts0 = GETU32(pt     ) ^ rk[0];\n\ts1 = GETU32(pt +  4) ^ rk[1];\n\ts2 = GETU32(pt +  8) ^ rk[2];\n\ts3 = GETU32(pt + 12) ^ rk[3];\n#ifdef FULL_UNROLL\n    /* round 1: */\n   \tt0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[ 4];\n   \tt1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[ 5];\n   \tt2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[ 6];\n   \tt3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[ 7];\n   \t/* round 2: */\n   \ts0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[ 8];\n   \ts1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[ 9];\n   \ts2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[10];\n   \ts3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[11];\n    /* round 3: */\n   \tt0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[12];\n   \tt1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[13];\n   \tt2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[14];\n   \tt3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[15];\n   \t/* round 4: */\n   \ts0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[16];\n   \ts1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[17];\n   \ts2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[18];\n   \ts3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[19];\n    /* round 5: */\n   \tt0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[20];\n   \tt1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[21];\n   \tt2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[22];\n   \tt3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[23];\n   \t/* round 6: */\n   \ts0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[24];\n   \ts1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[25];\n   \ts2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[26];\n   \ts3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[27];\n    /* round 7: */\n   \tt0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[28];\n   \tt1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[29];\n   \tt2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[30];\n   \tt3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[31];\n   \t/* round 8: */\n   \ts0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[32];\n   \ts1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[33];\n   \ts2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[34];\n   \ts3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[35];\n    /* round 9: */\n   \tt0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[36];\n   \tt1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[37];\n   \tt2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[38];\n   \tt3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[39];\n    if (Nr > 10) {\n        /* round 10: */\n        s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[40];\n        s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[41];\n        s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[42];\n        s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[43];\n        /* round 11: */\n        t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[44];\n        t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[45];\n        t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[46];\n        t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[47];\n        if (Nr > 12) {\n            /* round 12: */\n            s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[48];\n            s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[49];\n            s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[50];\n            s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[51];\n            /* round 13: */\n            t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[52];\n            t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[53];\n            t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[54];\n            t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[55];\n        }\n    }\n    rk += Nr << 2;\n#else  /* !FULL_UNROLL */\n    /*\n\t * Nr - 1 full rounds:\n\t */\n    r = Nr >> 1;\n    for (;;) {\n        t0 =\n            Te0[(s0 >> 24)       ] ^\n            Te1[(s1 >> 16) & 0xff] ^\n            Te2[(s2 >>  8) & 0xff] ^\n            Te3[(s3      ) & 0xff] ^\n            rk[4];\n        t1 =\n            Te0[(s1 >> 24)       ] ^\n            Te1[(s2 >> 16) & 0xff] ^\n            Te2[(s3 >>  8) & 0xff] ^\n            Te3[(s0      ) & 0xff] ^\n            rk[5];\n        t2 =\n            Te0[(s2 >> 24)       ] ^\n            Te1[(s3 >> 16) & 0xff] ^\n            Te2[(s0 >>  8) & 0xff] ^\n            Te3[(s1      ) & 0xff] ^\n            rk[6];\n        t3 =\n            Te0[(s3 >> 24)       ] ^\n            Te1[(s0 >> 16) & 0xff] ^\n            Te2[(s1 >>  8) & 0xff] ^\n            Te3[(s2      ) & 0xff] ^\n            rk[7];\n\n        rk += 8;\n        if (--r == 0) {\n            break;\n        }\n\n        s0 =\n            Te0[(t0 >> 24)       ] ^\n            Te1[(t1 >> 16) & 0xff] ^\n            Te2[(t2 >>  8) & 0xff] ^\n            Te3[(t3      ) & 0xff] ^\n            rk[0];\n        s1 =\n            Te0[(t1 >> 24)       ] ^\n            Te1[(t2 >> 16) & 0xff] ^\n            Te2[(t3 >>  8) & 0xff] ^\n            Te3[(t0      ) & 0xff] ^\n            rk[1];\n        s2 =\n            Te0[(t2 >> 24)       ] ^\n            Te1[(t3 >> 16) & 0xff] ^\n            Te2[(t0 >>  8) & 0xff] ^\n            Te3[(t1      ) & 0xff] ^\n            rk[2];\n        s3 =\n            Te0[(t3 >> 24)       ] ^\n            Te1[(t0 >> 16) & 0xff] ^\n            Te2[(t1 >>  8) & 0xff] ^\n            Te3[(t2      ) & 0xff] ^\n            rk[3];\n    }\n#endif /* ?FULL_UNROLL */\n    /*\n\t * apply last round and\n\t * map cipher state to byte array block:\n\t */\n\ts0 =\n\t\t(Te4[(t0 >> 24)       ] & 0xff000000) ^\n\t\t(Te4[(t1 >> 16) & 0xff] & 0x00ff0000) ^\n\t\t(Te4[(t2 >>  8) & 0xff] & 0x0000ff00) ^\n\t\t(Te4[(t3      ) & 0xff] & 0x000000ff) ^\n\t\trk[0];\n\tPUTU32(ct     , s0);\n\ts1 =\n\t\t(Te4[(t1 >> 24)       ] & 0xff000000) ^\n\t\t(Te4[(t2 >> 16) & 0xff] & 0x00ff0000) ^\n\t\t(Te4[(t3 >>  8) & 0xff] & 0x0000ff00) ^\n\t\t(Te4[(t0      ) & 0xff] & 0x000000ff) ^\n\t\trk[1];\n\tPUTU32(ct +  4, s1);\n\ts2 =\n\t\t(Te4[(t2 >> 24)       ] & 0xff000000) ^\n\t\t(Te4[(t3 >> 16) & 0xff] & 0x00ff0000) ^\n\t\t(Te4[(t0 >>  8) & 0xff] & 0x0000ff00) ^\n\t\t(Te4[(t1      ) & 0xff] & 0x000000ff) ^\n\t\trk[2];\n\tPUTU32(ct +  8, s2);\n\ts3 =\n\t\t(Te4[(t3 >> 24)       ] & 0xff000000) ^\n\t\t(Te4[(t0 >> 16) & 0xff] & 0x00ff0000) ^\n\t\t(Te4[(t1 >>  8) & 0xff] & 0x0000ff00) ^\n\t\t(Te4[(t2      ) & 0xff] & 0x000000ff) ^\n\t\trk[3];\n\tPUTU32(ct + 12, s3);\n}\n\nvoid rijndaelDecrypt(const u32 rk[/*4*(Nr + 1)*/], int Nr, const u8 ct[16], u8 pt[16]) {\n\tu32 s0, s1, s2, s3, t0, t1, t2, t3;\n#ifndef FULL_UNROLL\n    int r;\n#endif /* ?FULL_UNROLL */\n\n    /*\n\t * map byte array block to cipher state\n\t * and add initial round key:\n\t */\n    s0 = GETU32(ct     ) ^ rk[0];\n    s1 = GETU32(ct +  4) ^ rk[1];\n    s2 = GETU32(ct +  8) ^ rk[2];\n    s3 = GETU32(ct + 12) ^ rk[3];\n#ifdef FULL_UNROLL\n    /* round 1: */\n    t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[ 4];\n    t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[ 5];\n    t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[ 6];\n    t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[ 7];\n    /* round 2: */\n    s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[ 8];\n    s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[ 9];\n    s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[10];\n    s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[11];\n    /* round 3: */\n    t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[12];\n    t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[13];\n    t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[14];\n    t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[15];\n    /* round 4: */\n    s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[16];\n    s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[17];\n    s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[18];\n    s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[19];\n    /* round 5: */\n    t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[20];\n    t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[21];\n    t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[22];\n    t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[23];\n    /* round 6: */\n    s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[24];\n    s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[25];\n    s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[26];\n    s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[27];\n    /* round 7: */\n    t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[28];\n    t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[29];\n    t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[30];\n    t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[31];\n    /* round 8: */\n    s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[32];\n    s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[33];\n    s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[34];\n    s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[35];\n    /* round 9: */\n    t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[36];\n    t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[37];\n    t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[38];\n    t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[39];\n    if (Nr > 10) {\n        /* round 10: */\n        s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[40];\n        s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[41];\n        s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[42];\n        s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[43];\n        /* round 11: */\n        t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[44];\n        t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[45];\n        t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[46];\n        t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[47];\n        if (Nr > 12) {\n            /* round 12: */\n            s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >>  8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[48];\n            s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >>  8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[49];\n            s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >>  8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[50];\n            s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >>  8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[51];\n            /* round 13: */\n            t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >>  8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[52];\n            t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >>  8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[53];\n            t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >>  8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[54];\n            t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >>  8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[55];\n        }\n    }\n\trk += Nr << 2;\n#else  /* !FULL_UNROLL */\n    /*\n     * Nr - 1 full rounds:\n     */\n    r = Nr >> 1;\n    for (;;) {\n        t0 =\n            Td0[(s0 >> 24)       ] ^\n            Td1[(s3 >> 16) & 0xff] ^\n            Td2[(s2 >>  8) & 0xff] ^\n            Td3[(s1      ) & 0xff] ^\n            rk[4];\n        t1 =\n            Td0[(s1 >> 24)       ] ^\n            Td1[(s0 >> 16) & 0xff] ^\n            Td2[(s3 >>  8) & 0xff] ^\n            Td3[(s2      ) & 0xff] ^\n            rk[5];\n        t2 =\n            Td0[(s2 >> 24)       ] ^\n            Td1[(s1 >> 16) & 0xff] ^\n            Td2[(s0 >>  8) & 0xff] ^\n            Td3[(s3      ) & 0xff] ^\n            rk[6];\n        t3 =\n            Td0[(s3 >> 24)       ] ^\n            Td1[(s2 >> 16) & 0xff] ^\n            Td2[(s1 >>  8) & 0xff] ^\n            Td3[(s0      ) & 0xff] ^\n            rk[7];\n\n        rk += 8;\n        if (--r == 0) {\n            break;\n        }\n\n        s0 =\n            Td0[(t0 >> 24)       ] ^\n            Td1[(t3 >> 16) & 0xff] ^\n            Td2[(t2 >>  8) & 0xff] ^\n            Td3[(t1      ) & 0xff] ^\n            rk[0];\n        s1 =\n            Td0[(t1 >> 24)       ] ^\n            Td1[(t0 >> 16) & 0xff] ^\n            Td2[(t3 >>  8) & 0xff] ^\n            Td3[(t2      ) & 0xff] ^\n            rk[1];\n        s2 =\n            Td0[(t2 >> 24)       ] ^\n            Td1[(t1 >> 16) & 0xff] ^\n            Td2[(t0 >>  8) & 0xff] ^\n            Td3[(t3      ) & 0xff] ^\n            rk[2];\n        s3 =\n            Td0[(t3 >> 24)       ] ^\n            Td1[(t2 >> 16) & 0xff] ^\n            Td2[(t1 >>  8) & 0xff] ^\n            Td3[(t0      ) & 0xff] ^\n            rk[3];\n    }\n#endif /* ?FULL_UNROLL */\n    /*\n\t * apply last round and\n\t * map cipher state to byte array block:\n\t */\n   \ts0 =\n   \t\t(Td4[(t0 >> 24)       ] & 0xff000000) ^\n   \t\t(Td4[(t3 >> 16) & 0xff] & 0x00ff0000) ^\n   \t\t(Td4[(t2 >>  8) & 0xff] & 0x0000ff00) ^\n   \t\t(Td4[(t1      ) & 0xff] & 0x000000ff) ^\n   \t\trk[0];\n\tPUTU32(pt     , s0);\n   \ts1 =\n   \t\t(Td4[(t1 >> 24)       ] & 0xff000000) ^\n   \t\t(Td4[(t0 >> 16) & 0xff] & 0x00ff0000) ^\n   \t\t(Td4[(t3 >>  8) & 0xff] & 0x0000ff00) ^\n   \t\t(Td4[(t2      ) & 0xff] & 0x000000ff) ^\n   \t\trk[1];\n\tPUTU32(pt +  4, s1);\n   \ts2 =\n   \t\t(Td4[(t2 >> 24)       ] & 0xff000000) ^\n   \t\t(Td4[(t1 >> 16) & 0xff] & 0x00ff0000) ^\n   \t\t(Td4[(t0 >>  8) & 0xff] & 0x0000ff00) ^\n   \t\t(Td4[(t3      ) & 0xff] & 0x000000ff) ^\n   \t\trk[2];\n\tPUTU32(pt +  8, s2);\n   \ts3 =\n   \t\t(Td4[(t3 >> 24)       ] & 0xff000000) ^\n   \t\t(Td4[(t2 >> 16) & 0xff] & 0x00ff0000) ^\n   \t\t(Td4[(t1 >>  8) & 0xff] & 0x0000ff00) ^\n   \t\t(Td4[(t0      ) & 0xff] & 0x000000ff) ^\n   \t\trk[3];\n\tPUTU32(pt + 12, s3);\n}\n\n#ifdef INTERMEDIATE_VALUE_KAT\n\nvoid rijndaelEncryptRound(const u32 rk[/*4*(Nr + 1)*/], int Nr, u8 block[16], int rounds) {\n\tint r;\n\tu32 s0, s1, s2, s3, t0, t1, t2, t3;\n\n    /*\n\t * map byte array block to cipher state\n\t * and add initial round key:\n\t */\n\ts0 = GETU32(block     ) ^ rk[0];\n\ts1 = GETU32(block +  4) ^ rk[1];\n\ts2 = GETU32(block +  8) ^ rk[2];\n\ts3 = GETU32(block + 12) ^ rk[3];\n    rk += 4;\n\n    /*\n\t * Nr - 1 full rounds:\n\t */\n\tfor (r = (rounds < Nr ? rounds : Nr - 1); r > 0; r--) {\n\t\tt0 =\n\t\t\tTe0[(s0 >> 24)       ] ^\n\t\t\tTe1[(s1 >> 16) & 0xff] ^\n\t\t\tTe2[(s2 >>  8) & 0xff] ^\n\t\t\tTe3[(s3      ) & 0xff] ^\n\t\t\trk[0];\n\t\tt1 =\n\t\t\tTe0[(s1 >> 24)       ] ^\n\t\t\tTe1[(s2 >> 16) & 0xff] ^\n\t\t\tTe2[(s3 >>  8) & 0xff] ^\n\t\t\tTe3[(s0      ) & 0xff] ^\n\t\t\trk[1];\n\t\tt2 =\n\t\t\tTe0[(s2 >> 24)       ] ^\n\t\t\tTe1[(s3 >> 16) & 0xff] ^\n\t\t\tTe2[(s0 >>  8) & 0xff] ^\n\t\t\tTe3[(s1      ) & 0xff] ^\n\t\t\trk[2];\n\t\tt3 =\n\t\t\tTe0[(s3 >> 24)       ] ^\n\t\t\tTe1[(s0 >> 16) & 0xff] ^\n\t\t\tTe2[(s1 >>  8) & 0xff] ^\n\t\t\tTe3[(s2      ) & 0xff] ^\n\t\t\trk[3];\n\n\t\ts0 = t0;\n\t\ts1 = t1;\n\t\ts2 = t2;\n\t\ts3 = t3;\n\t\trk += 4;\n\n    }\n\n    /*\n\t * apply last round and\n\t * map cipher state to byte array block:\n\t */\n\tif (rounds == Nr) {\n    \tt0 =\n    \t\t(Te4[(s0 >> 24)       ] & 0xff000000) ^\n    \t\t(Te4[(s1 >> 16) & 0xff] & 0x00ff0000) ^\n    \t\t(Te4[(s2 >>  8) & 0xff] & 0x0000ff00) ^\n    \t\t(Te4[(s3      ) & 0xff] & 0x000000ff) ^\n    \t\trk[0];\n    \tt1 =\n    \t\t(Te4[(s1 >> 24)       ] & 0xff000000) ^\n    \t\t(Te4[(s2 >> 16) & 0xff] & 0x00ff0000) ^\n    \t\t(Te4[(s3 >>  8) & 0xff] & 0x0000ff00) ^\n    \t\t(Te4[(s0      ) & 0xff] & 0x000000ff) ^\n    \t\trk[1];\n    \tt2 =\n    \t\t(Te4[(s2 >> 24)       ] & 0xff000000) ^\n    \t\t(Te4[(s3 >> 16) & 0xff] & 0x00ff0000) ^\n    \t\t(Te4[(s0 >>  8) & 0xff] & 0x0000ff00) ^\n    \t\t(Te4[(s1      ) & 0xff] & 0x000000ff) ^\n    \t\trk[2];\n    \tt3 =\n    \t\t(Te4[(s3 >> 24)       ] & 0xff000000) ^\n    \t\t(Te4[(s0 >> 16) & 0xff] & 0x00ff0000) ^\n    \t\t(Te4[(s1 >>  8) & 0xff] & 0x0000ff00) ^\n    \t\t(Te4[(s2      ) & 0xff] & 0x000000ff) ^\n    \t\trk[3];\n\n\t\ts0 = t0;\n\t\ts1 = t1;\n\t\ts2 = t2;\n\t\ts3 = t3;\n\t}\n\n\tPUTU32(block     , s0);\n\tPUTU32(block +  4, s1);\n\tPUTU32(block +  8, s2);\n\tPUTU32(block + 12, s3);\n}\n\nvoid rijndaelDecryptRound(const u32 rk[/*4*(Nr + 1)*/], int Nr, u8 block[16], int rounds) {\n\tint r;\n\tu32 s0, s1, s2, s3, t0, t1, t2, t3;\n\n    /*\n\t * map byte array block to cipher state\n\t * and add initial round key:\n\t */\n\ts0 = GETU32(block     ) ^ rk[0];\n\ts1 = GETU32(block +  4) ^ rk[1];\n\ts2 = GETU32(block +  8) ^ rk[2];\n\ts3 = GETU32(block + 12) ^ rk[3];\n    rk += 4;\n\n    /*\n\t * Nr - 1 full rounds:\n\t */\n\tfor (r = (rounds < Nr ? rounds : Nr) - 1; r > 0; r--) {\n\t\tt0 =\n\t\t\tTd0[(s0 >> 24)       ] ^\n\t\t\tTd1[(s3 >> 16) & 0xff] ^\n\t\t\tTd2[(s2 >>  8) & 0xff] ^\n\t\t\tTd3[(s1      ) & 0xff] ^\n\t\t\trk[0];\n\t\tt1 =\n\t\t\tTd0[(s1 >> 24)       ] ^\n\t\t\tTd1[(s0 >> 16) & 0xff] ^\n\t\t\tTd2[(s3 >>  8) & 0xff] ^\n\t\t\tTd3[(s2      ) & 0xff] ^\n\t\t\trk[1];\n\t\tt2 =\n\t\t\tTd0[(s2 >> 24)       ] ^\n\t\t\tTd1[(s1 >> 16) & 0xff] ^\n\t\t\tTd2[(s0 >>  8) & 0xff] ^\n\t\t\tTd3[(s3      ) & 0xff] ^\n\t\t\trk[2];\n\t\tt3 =\n\t\t\tTd0[(s3 >> 24)       ] ^\n\t\t\tTd1[(s2 >> 16) & 0xff] ^\n\t\t\tTd2[(s1 >>  8) & 0xff] ^\n\t\t\tTd3[(s0      ) & 0xff] ^\n\t\t\trk[3];\n\n\t\ts0 = t0;\n\t\ts1 = t1;\n\t\ts2 = t2;\n\t\ts3 = t3;\n\t\trk += 4;\n\n    }\n\n    /*\n\t * complete the last round and\n\t * map cipher state to byte array block:\n\t */\n\tt0 =\n\t\t(Td4[(s0 >> 24)       ] & 0xff000000) ^\n\t\t(Td4[(s3 >> 16) & 0xff] & 0x00ff0000) ^\n\t\t(Td4[(s2 >>  8) & 0xff] & 0x0000ff00) ^\n\t\t(Td4[(s1      ) & 0xff] & 0x000000ff);\n\tt1 =\n\t\t(Td4[(s1 >> 24)       ] & 0xff000000) ^\n\t\t(Td4[(s0 >> 16) & 0xff] & 0x00ff0000) ^\n\t\t(Td4[(s3 >>  8) & 0xff] & 0x0000ff00) ^\n\t\t(Td4[(s2      ) & 0xff] & 0x000000ff);\n\tt2 =\n\t\t(Td4[(s2 >> 24)       ] & 0xff000000) ^\n\t\t(Td4[(s1 >> 16) & 0xff] & 0x00ff0000) ^\n\t\t(Td4[(s0 >>  8) & 0xff] & 0x0000ff00) ^\n\t\t(Td4[(s3      ) & 0xff] & 0x000000ff);\n\tt3 =\n\t\t(Td4[(s3 >> 24)       ] & 0xff000000) ^\n\t\t(Td4[(s2 >> 16) & 0xff] & 0x00ff0000) ^\n\t\t(Td4[(s1 >>  8) & 0xff] & 0x0000ff00) ^\n\t\t(Td4[(s0      ) & 0xff] & 0x000000ff);\n\n\tif (rounds == Nr) {\n\t    t0 ^= rk[0];\n\t    t1 ^= rk[1];\n\t    t2 ^= rk[2];\n\t    t3 ^= rk[3];\n\t}\n\n\tPUTU32(block     , t0);\n\tPUTU32(block +  4, t1);\n\tPUTU32(block +  8, t2);\n\tPUTU32(block + 12, t3);\n}\n\n#endif /* INTERMEDIATE_VALUE_KAT */\n"
  },
  {
    "path": "third_party/crypto/rijndael-alg-fst.h",
    "content": "/**\n * rijndael-alg-fst.h\n *\n * @version 3.0 (December 2000)\n *\n * Optimised ANSI C code for the Rijndael cipher (now AES)\n *\n * @author Vincent Rijmen <vincent.rijmen@esat.kuleuven.ac.be>\n * @author Antoon Bosselaers <antoon.bosselaers@esat.kuleuven.ac.be>\n * @author Paulo Barreto <paulo.barreto@terra.com.br>\n *\n * This code is hereby placed in the public domain.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\n * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\n * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n#ifndef __RIJNDAEL_ALG_FST_H\n#define __RIJNDAEL_ALG_FST_H\n\n#define MAXKC\t(256/32)\n#define MAXKB\t(256/8)\n#define MAXNR\t14\n\ntypedef unsigned char\tu8;\t\ntypedef unsigned short\tu16;\t\ntypedef unsigned int\tu32;\n\nint rijndaelKeySetupEnc(u32 rk[/*4*(Nr + 1)*/], const u8 cipherKey[], int keyBits);\nint rijndaelKeySetupDec(u32 rk[/*4*(Nr + 1)*/], const u8 cipherKey[], int keyBits);\nvoid rijndaelEncrypt(const u32 rk[/*4*(Nr + 1)*/], int Nr, const u8 pt[16], u8 ct[16]);\nvoid rijndaelDecrypt(const u32 rk[/*4*(Nr + 1)*/], int Nr, const u8 ct[16], u8 pt[16]);\n\n#ifdef INTERMEDIATE_VALUE_KAT\nvoid rijndaelEncryptRound(const u32 rk[/*4*(Nr + 1)*/], int Nr, u8 block[16], int rounds);\nvoid rijndaelDecryptRound(const u32 rk[/*4*(Nr + 1)*/], int Nr, u8 block[16], int rounds);\n#endif /* INTERMEDIATE_VALUE_KAT */\n\n#endif /* __RIJNDAEL_ALG_FST_H */\n"
  },
  {
    "path": "third_party/crypto/sha256.cpp",
    "content": "// //////////////////////////////////////////////////////////\n// sha256.cpp\n// Copyright (c) 2014,2015 Stephan Brumme. All rights reserved.\n// see http://create.stephan-brumme.com/disclaimer.html\n//\n// Altered for use in Xenia. Licensed under zlib license when acquired.\n\n#include \"sha256.h\"\n\n// big endian architectures need #define __BYTE_ORDER __BIG_ENDIAN\n#ifndef _MSC_VER\n#include <endian.h>\n#endif\n\nnamespace sha256 {\n\n/// same as reset()\nSHA256::SHA256() { reset(); }\n\n/// restart\nvoid SHA256::reset() {\n  m_numBytes = 0;\n  m_bufferSize = 0;\n\n  // according to RFC 1321\n  m_hash[0] = 0x6a09e667;\n  m_hash[1] = 0xbb67ae85;\n  m_hash[2] = 0x3c6ef372;\n  m_hash[3] = 0xa54ff53a;\n  m_hash[4] = 0x510e527f;\n  m_hash[5] = 0x9b05688c;\n  m_hash[6] = 0x1f83d9ab;\n  m_hash[7] = 0x5be0cd19;\n}\n\nnamespace {\ninline uint32_t rotate(uint32_t a, uint32_t c) {\n  return (a >> c) | (a << (32 - c));\n}\n\ninline uint32_t swap(uint32_t x) {\n#if defined(__GNUC__) || defined(__clang__)\n  return __builtin_bswap32(x);\n#endif\n#ifdef MSC_VER\n  return _byteswap_ulong(x);\n#endif\n\n  return (x >> 24) | ((x >> 8) & 0x0000FF00) | ((x << 8) & 0x00FF0000) |\n         (x << 24);\n}\n\n// mix functions for processBlock()\ninline uint32_t f1(uint32_t e, uint32_t f, uint32_t g) {\n  uint32_t term1 = rotate(e, 6) ^ rotate(e, 11) ^ rotate(e, 25);\n  uint32_t term2 = (e & f) ^ (~e & g);  //(g ^ (e & (f ^ g)))\n  return term1 + term2;\n}\n\ninline uint32_t f2(uint32_t a, uint32_t b, uint32_t c) {\n  uint32_t term1 = rotate(a, 2) ^ rotate(a, 13) ^ rotate(a, 22);\n  uint32_t term2 = ((a | b) & c) | (a & b);  //(a & (b ^ c)) ^ (b & c);\n  return term1 + term2;\n}\n}\n\n/// process 64 bytes\nvoid SHA256::processBlock(const void* data) {\n  // get last hash\n  uint32_t a = m_hash[0];\n  uint32_t b = m_hash[1];\n  uint32_t c = m_hash[2];\n  uint32_t d = m_hash[3];\n  uint32_t e = m_hash[4];\n  uint32_t f = m_hash[5];\n  uint32_t g = m_hash[6];\n  uint32_t h = m_hash[7];\n\n  // data represented as 16x 32-bit words\n  const uint32_t* input = (uint32_t*)data;\n  // convert to big endian\n  uint32_t words[64];\n  int i;\n  for (i = 0; i < 16; i++)\n#if defined(__BYTE_ORDER) && (__BYTE_ORDER != 0) && \\\n    (__BYTE_ORDER == __BIG_ENDIAN)\n    words[i] = input[i];\n#else\n    words[i] = swap(input[i]);\n#endif\n\n  uint32_t x, y;  // temporaries\n\n  // first round\n  x = h + f1(e, f, g) + 0x428a2f98 + words[0];\n  y = f2(a, b, c);\n  d += x;\n  h = x + y;\n  x = g + f1(d, e, f) + 0x71374491 + words[1];\n  y = f2(h, a, b);\n  c += x;\n  g = x + y;\n  x = f + f1(c, d, e) + 0xb5c0fbcf + words[2];\n  y = f2(g, h, a);\n  b += x;\n  f = x + y;\n  x = e + f1(b, c, d) + 0xe9b5dba5 + words[3];\n  y = f2(f, g, h);\n  a += x;\n  e = x + y;\n  x = d + f1(a, b, c) + 0x3956c25b + words[4];\n  y = f2(e, f, g);\n  h += x;\n  d = x + y;\n  x = c + f1(h, a, b) + 0x59f111f1 + words[5];\n  y = f2(d, e, f);\n  g += x;\n  c = x + y;\n  x = b + f1(g, h, a) + 0x923f82a4 + words[6];\n  y = f2(c, d, e);\n  f += x;\n  b = x + y;\n  x = a + f1(f, g, h) + 0xab1c5ed5 + words[7];\n  y = f2(b, c, d);\n  e += x;\n  a = x + y;\n\n  // secound round\n  x = h + f1(e, f, g) + 0xd807aa98 + words[8];\n  y = f2(a, b, c);\n  d += x;\n  h = x + y;\n  x = g + f1(d, e, f) + 0x12835b01 + words[9];\n  y = f2(h, a, b);\n  c += x;\n  g = x + y;\n  x = f + f1(c, d, e) + 0x243185be + words[10];\n  y = f2(g, h, a);\n  b += x;\n  f = x + y;\n  x = e + f1(b, c, d) + 0x550c7dc3 + words[11];\n  y = f2(f, g, h);\n  a += x;\n  e = x + y;\n  x = d + f1(a, b, c) + 0x72be5d74 + words[12];\n  y = f2(e, f, g);\n  h += x;\n  d = x + y;\n  x = c + f1(h, a, b) + 0x80deb1fe + words[13];\n  y = f2(d, e, f);\n  g += x;\n  c = x + y;\n  x = b + f1(g, h, a) + 0x9bdc06a7 + words[14];\n  y = f2(c, d, e);\n  f += x;\n  b = x + y;\n  x = a + f1(f, g, h) + 0xc19bf174 + words[15];\n  y = f2(b, c, d);\n  e += x;\n  a = x + y;\n\n  // extend to 24 words\n  for (; i < 24; i++)\n    words[i] = words[i - 16] +\n               (rotate(words[i - 15], 7) ^ rotate(words[i - 15], 18) ^\n                (words[i - 15] >> 3)) +\n               words[i - 7] + (rotate(words[i - 2], 17) ^\n                               rotate(words[i - 2], 19) ^ (words[i - 2] >> 10));\n\n  // third round\n  x = h + f1(e, f, g) + 0xe49b69c1 + words[16];\n  y = f2(a, b, c);\n  d += x;\n  h = x + y;\n  x = g + f1(d, e, f) + 0xefbe4786 + words[17];\n  y = f2(h, a, b);\n  c += x;\n  g = x + y;\n  x = f + f1(c, d, e) + 0x0fc19dc6 + words[18];\n  y = f2(g, h, a);\n  b += x;\n  f = x + y;\n  x = e + f1(b, c, d) + 0x240ca1cc + words[19];\n  y = f2(f, g, h);\n  a += x;\n  e = x + y;\n  x = d + f1(a, b, c) + 0x2de92c6f + words[20];\n  y = f2(e, f, g);\n  h += x;\n  d = x + y;\n  x = c + f1(h, a, b) + 0x4a7484aa + words[21];\n  y = f2(d, e, f);\n  g += x;\n  c = x + y;\n  x = b + f1(g, h, a) + 0x5cb0a9dc + words[22];\n  y = f2(c, d, e);\n  f += x;\n  b = x + y;\n  x = a + f1(f, g, h) + 0x76f988da + words[23];\n  y = f2(b, c, d);\n  e += x;\n  a = x + y;\n\n  // extend to 32 words\n  for (; i < 32; i++)\n    words[i] = words[i - 16] +\n               (rotate(words[i - 15], 7) ^ rotate(words[i - 15], 18) ^\n                (words[i - 15] >> 3)) +\n               words[i - 7] + (rotate(words[i - 2], 17) ^\n                               rotate(words[i - 2], 19) ^ (words[i - 2] >> 10));\n\n  // fourth round\n  x = h + f1(e, f, g) + 0x983e5152 + words[24];\n  y = f2(a, b, c);\n  d += x;\n  h = x + y;\n  x = g + f1(d, e, f) + 0xa831c66d + words[25];\n  y = f2(h, a, b);\n  c += x;\n  g = x + y;\n  x = f + f1(c, d, e) + 0xb00327c8 + words[26];\n  y = f2(g, h, a);\n  b += x;\n  f = x + y;\n  x = e + f1(b, c, d) + 0xbf597fc7 + words[27];\n  y = f2(f, g, h);\n  a += x;\n  e = x + y;\n  x = d + f1(a, b, c) + 0xc6e00bf3 + words[28];\n  y = f2(e, f, g);\n  h += x;\n  d = x + y;\n  x = c + f1(h, a, b) + 0xd5a79147 + words[29];\n  y = f2(d, e, f);\n  g += x;\n  c = x + y;\n  x = b + f1(g, h, a) + 0x06ca6351 + words[30];\n  y = f2(c, d, e);\n  f += x;\n  b = x + y;\n  x = a + f1(f, g, h) + 0x14292967 + words[31];\n  y = f2(b, c, d);\n  e += x;\n  a = x + y;\n\n  // extend to 40 words\n  for (; i < 40; i++)\n    words[i] = words[i - 16] +\n               (rotate(words[i - 15], 7) ^ rotate(words[i - 15], 18) ^\n                (words[i - 15] >> 3)) +\n               words[i - 7] + (rotate(words[i - 2], 17) ^\n                               rotate(words[i - 2], 19) ^ (words[i - 2] >> 10));\n\n  // fifth round\n  x = h + f1(e, f, g) + 0x27b70a85 + words[32];\n  y = f2(a, b, c);\n  d += x;\n  h = x + y;\n  x = g + f1(d, e, f) + 0x2e1b2138 + words[33];\n  y = f2(h, a, b);\n  c += x;\n  g = x + y;\n  x = f + f1(c, d, e) + 0x4d2c6dfc + words[34];\n  y = f2(g, h, a);\n  b += x;\n  f = x + y;\n  x = e + f1(b, c, d) + 0x53380d13 + words[35];\n  y = f2(f, g, h);\n  a += x;\n  e = x + y;\n  x = d + f1(a, b, c) + 0x650a7354 + words[36];\n  y = f2(e, f, g);\n  h += x;\n  d = x + y;\n  x = c + f1(h, a, b) + 0x766a0abb + words[37];\n  y = f2(d, e, f);\n  g += x;\n  c = x + y;\n  x = b + f1(g, h, a) + 0x81c2c92e + words[38];\n  y = f2(c, d, e);\n  f += x;\n  b = x + y;\n  x = a + f1(f, g, h) + 0x92722c85 + words[39];\n  y = f2(b, c, d);\n  e += x;\n  a = x + y;\n\n  // extend to 48 words\n  for (; i < 48; i++)\n    words[i] = words[i - 16] +\n               (rotate(words[i - 15], 7) ^ rotate(words[i - 15], 18) ^\n                (words[i - 15] >> 3)) +\n               words[i - 7] + (rotate(words[i - 2], 17) ^\n                               rotate(words[i - 2], 19) ^ (words[i - 2] >> 10));\n\n  // sixth round\n  x = h + f1(e, f, g) + 0xa2bfe8a1 + words[40];\n  y = f2(a, b, c);\n  d += x;\n  h = x + y;\n  x = g + f1(d, e, f) + 0xa81a664b + words[41];\n  y = f2(h, a, b);\n  c += x;\n  g = x + y;\n  x = f + f1(c, d, e) + 0xc24b8b70 + words[42];\n  y = f2(g, h, a);\n  b += x;\n  f = x + y;\n  x = e + f1(b, c, d) + 0xc76c51a3 + words[43];\n  y = f2(f, g, h);\n  a += x;\n  e = x + y;\n  x = d + f1(a, b, c) + 0xd192e819 + words[44];\n  y = f2(e, f, g);\n  h += x;\n  d = x + y;\n  x = c + f1(h, a, b) + 0xd6990624 + words[45];\n  y = f2(d, e, f);\n  g += x;\n  c = x + y;\n  x = b + f1(g, h, a) + 0xf40e3585 + words[46];\n  y = f2(c, d, e);\n  f += x;\n  b = x + y;\n  x = a + f1(f, g, h) + 0x106aa070 + words[47];\n  y = f2(b, c, d);\n  e += x;\n  a = x + y;\n\n  // extend to 56 words\n  for (; i < 56; i++)\n    words[i] = words[i - 16] +\n               (rotate(words[i - 15], 7) ^ rotate(words[i - 15], 18) ^\n                (words[i - 15] >> 3)) +\n               words[i - 7] + (rotate(words[i - 2], 17) ^\n                               rotate(words[i - 2], 19) ^ (words[i - 2] >> 10));\n\n  // seventh round\n  x = h + f1(e, f, g) + 0x19a4c116 + words[48];\n  y = f2(a, b, c);\n  d += x;\n  h = x + y;\n  x = g + f1(d, e, f) + 0x1e376c08 + words[49];\n  y = f2(h, a, b);\n  c += x;\n  g = x + y;\n  x = f + f1(c, d, e) + 0x2748774c + words[50];\n  y = f2(g, h, a);\n  b += x;\n  f = x + y;\n  x = e + f1(b, c, d) + 0x34b0bcb5 + words[51];\n  y = f2(f, g, h);\n  a += x;\n  e = x + y;\n  x = d + f1(a, b, c) + 0x391c0cb3 + words[52];\n  y = f2(e, f, g);\n  h += x;\n  d = x + y;\n  x = c + f1(h, a, b) + 0x4ed8aa4a + words[53];\n  y = f2(d, e, f);\n  g += x;\n  c = x + y;\n  x = b + f1(g, h, a) + 0x5b9cca4f + words[54];\n  y = f2(c, d, e);\n  f += x;\n  b = x + y;\n  x = a + f1(f, g, h) + 0x682e6ff3 + words[55];\n  y = f2(b, c, d);\n  e += x;\n  a = x + y;\n\n  // extend to 64 words\n  for (; i < 64; i++)\n    words[i] = words[i - 16] +\n               (rotate(words[i - 15], 7) ^ rotate(words[i - 15], 18) ^\n                (words[i - 15] >> 3)) +\n               words[i - 7] + (rotate(words[i - 2], 17) ^\n                               rotate(words[i - 2], 19) ^ (words[i - 2] >> 10));\n\n  // eigth round\n  x = h + f1(e, f, g) + 0x748f82ee + words[56];\n  y = f2(a, b, c);\n  d += x;\n  h = x + y;\n  x = g + f1(d, e, f) + 0x78a5636f + words[57];\n  y = f2(h, a, b);\n  c += x;\n  g = x + y;\n  x = f + f1(c, d, e) + 0x84c87814 + words[58];\n  y = f2(g, h, a);\n  b += x;\n  f = x + y;\n  x = e + f1(b, c, d) + 0x8cc70208 + words[59];\n  y = f2(f, g, h);\n  a += x;\n  e = x + y;\n  x = d + f1(a, b, c) + 0x90befffa + words[60];\n  y = f2(e, f, g);\n  h += x;\n  d = x + y;\n  x = c + f1(h, a, b) + 0xa4506ceb + words[61];\n  y = f2(d, e, f);\n  g += x;\n  c = x + y;\n  x = b + f1(g, h, a) + 0xbef9a3f7 + words[62];\n  y = f2(c, d, e);\n  f += x;\n  b = x + y;\n  x = a + f1(f, g, h) + 0xc67178f2 + words[63];\n  y = f2(b, c, d);\n  e += x;\n  a = x + y;\n\n  // update hash\n  m_hash[0] += a;\n  m_hash[1] += b;\n  m_hash[2] += c;\n  m_hash[3] += d;\n  m_hash[4] += e;\n  m_hash[5] += f;\n  m_hash[6] += g;\n  m_hash[7] += h;\n}\n\n/// add arbitrary number of bytes\nvoid SHA256::add(const void* data, size_t numBytes) {\n  const uint8_t* current = (const uint8_t*)data;\n\n  if (m_bufferSize > 0) {\n    while (numBytes > 0 && m_bufferSize < BlockSize) {\n      m_buffer[m_bufferSize++] = *current++;\n      numBytes--;\n    }\n  }\n\n  // full buffer\n  if (m_bufferSize == BlockSize) {\n    processBlock(m_buffer);\n    m_numBytes += BlockSize;\n    m_bufferSize = 0;\n  }\n\n  // no more data ?\n  if (numBytes == 0) return;\n\n  // process full blocks\n  while (numBytes >= BlockSize) {\n    processBlock(current);\n    current += BlockSize;\n    m_numBytes += BlockSize;\n    numBytes -= BlockSize;\n  }\n\n  // keep remaining bytes in buffer\n  while (numBytes > 0) {\n    m_buffer[m_bufferSize++] = *current++;\n    numBytes--;\n  }\n}\n\n/// process final block, less than 64 bytes\nvoid SHA256::processBuffer() {\n  // the input bytes are considered as bits strings, where the first bit is the\n  // most significant bit of the byte\n\n  // - append \"1\" bit to message\n  // - append \"0\" bits until message length in bit mod 512 is 448\n  // - append length as 64 bit integer\n\n  // number of bits\n  size_t paddedLength = m_bufferSize * 8;\n\n  // plus one bit set to 1 (always appended)\n  paddedLength++;\n\n  // number of bits must be (numBits % 512) = 448\n  size_t lower11Bits = paddedLength & 511;\n  if (lower11Bits <= 448)\n    paddedLength += 448 - lower11Bits;\n  else\n    paddedLength += 512 + 448 - lower11Bits;\n  // convert from bits to bytes\n  paddedLength /= 8;\n\n  // only needed if additional data flows over into a second block\n  unsigned char extra[BlockSize];\n\n  // append a \"1\" bit, 128 => binary 10000000\n  if (m_bufferSize < BlockSize)\n    m_buffer[m_bufferSize] = 128;\n  else\n    extra[0] = 128;\n\n  size_t i;\n  for (i = m_bufferSize + 1; i < BlockSize; i++) m_buffer[i] = 0;\n  for (; i < paddedLength; i++) extra[i - BlockSize] = 0;\n\n  // add message length in bits as 64 bit number\n  uint64_t msgBits = 8 * (m_numBytes + m_bufferSize);\n  // find right position\n  unsigned char* addLength;\n  if (paddedLength < BlockSize)\n    addLength = m_buffer + paddedLength;\n  else\n    addLength = extra + paddedLength - BlockSize;\n\n  // must be big endian\n  *addLength++ = (unsigned char)((msgBits >> 56) & 0xFF);\n  *addLength++ = (unsigned char)((msgBits >> 48) & 0xFF);\n  *addLength++ = (unsigned char)((msgBits >> 40) & 0xFF);\n  *addLength++ = (unsigned char)((msgBits >> 32) & 0xFF);\n  *addLength++ = (unsigned char)((msgBits >> 24) & 0xFF);\n  *addLength++ = (unsigned char)((msgBits >> 16) & 0xFF);\n  *addLength++ = (unsigned char)((msgBits >> 8) & 0xFF);\n  *addLength = (unsigned char)(msgBits & 0xFF);\n\n  // process blocks\n  processBlock(m_buffer);\n  // flowed over into a second block ?\n  if (paddedLength > BlockSize) processBlock(extra);\n}\n\n/// return latest hash as 64 hex characters\nstd::string SHA256::getHash() {\n  // compute hash (as raw bytes)\n  unsigned char rawHash[HashBytes];\n  getHash(rawHash);\n\n  // convert to hex string\n  std::string result;\n  result.reserve(2 * HashBytes);\n  for (int i = 0; i < HashBytes; i++) {\n    static const char dec2hex[16 + 1] = \"0123456789abcdef\";\n    result += dec2hex[(rawHash[i] >> 4) & 15];\n    result += dec2hex[rawHash[i] & 15];\n  }\n\n  return result;\n}\n\n/// return latest hash as bytes\nvoid SHA256::getHash(unsigned char buffer[SHA256::HashBytes]) {\n  // save old hash if buffer is partially filled\n  uint32_t oldHash[HashValues];\n  for (int i = 0; i < HashValues; i++) oldHash[i] = m_hash[i];\n\n  // process remaining bytes\n  processBuffer();\n\n  unsigned char* current = buffer;\n  for (int i = 0; i < HashValues; i++) {\n    *current++ = (m_hash[i] >> 24) & 0xFF;\n    *current++ = (m_hash[i] >> 16) & 0xFF;\n    *current++ = (m_hash[i] >> 8) & 0xFF;\n    *current++ = m_hash[i] & 0xFF;\n\n    // restore old hash\n    m_hash[i] = oldHash[i];\n  }\n}\n\n/// compute SHA256 of a memory block\nstd::string SHA256::operator()(const void* data, size_t numBytes) {\n  reset();\n  add(data, numBytes);\n  return getHash();\n}\n\n/// compute SHA256 of a string, excluding final zero\nstd::string SHA256::operator()(const std::string& text) {\n  reset();\n  add(text.c_str(), text.size());\n  return getHash();\n}\n\n}"
  },
  {
    "path": "third_party/crypto/sha256.h",
    "content": "// //////////////////////////////////////////////////////////\n// sha256.h\n// Copyright (c) 2014,2015 Stephan Brumme. All rights reserved.\n// see http://create.stephan-brumme.com/disclaimer.html\n//\n// Altered for use in Xenia. Licensed under zlib license when acquired.\n\n#pragma once\n\n#include <cstdint>\n#include <string>\n\nnamespace sha256 {\n\n/// compute SHA256 hash\n/** Usage:\n    SHA256 sha256;\n    std::string myHash  = sha256(\"Hello World\");     // std::string\n    std::string myHash2 = sha256(\"How are you\", 11); // arbitrary data, 11 bytes\n\n    // or in a streaming fashion:\n\n    SHA256 sha256;\n    while (more data available)\n      sha256.add(pointer to fresh data, number of new bytes);\n    std::string myHash3 = sha256.getHash();\n  */\nclass SHA256 {\n public:\n  /// split into 64 byte blocks (=> 512 bits), hash is 32 bytes long\n  enum { BlockSize = 512 / 8, HashBytes = 32 };\n\n  /// same as reset()\n  SHA256();\n\n  /// compute SHA256 of a memory block\n  std::string operator()(const void* data, size_t numBytes);\n  /// compute SHA256 of a string, excluding final zero\n  std::string operator()(const std::string& text);\n\n  /// add arbitrary number of bytes\n  void add(const void* data, size_t numBytes);\n\n  /// return latest hash as 64 hex characters\n  std::string getHash();\n  /// return latest hash as bytes\n  void getHash(unsigned char buffer[HashBytes]);\n\n  uint8_t* getBuffer() { return m_buffer; }\n  uint32_t* getHashValues() { return m_hash; }\n\n  size_t getTotalSize() const { return m_numBytes + m_bufferSize; }\n  void setTotalSize(size_t size) {\n    m_bufferSize = size & (BlockSize - 1);\n    m_numBytes = size & ~(BlockSize - 1);\n  }\n\n  /// restart\n  void reset();\n\n private:\n  /// process 64 bytes\n  void processBlock(const void* data);\n  /// process everything left in the internal buffer\n  void processBuffer();\n\n  /// size of processed data in bytes\n  uint64_t m_numBytes;\n  /// valid bytes in m_buffer\n  size_t m_bufferSize;\n  /// bytes not processed yet\n  uint8_t m_buffer[BlockSize];\n\n  enum { HashValues = HashBytes / 4 };\n  /// hash, stored as integers\n  uint32_t m_hash[HashValues];\n};\n\n};  // namespace sha256"
  },
  {
    "path": "third_party/cxxopts.lua",
    "content": "group(\"third_party\")\nproject(\"cxxopts\")\n  uuid(\"8b68cbe8-2da4-4f28-be14-9352eafa3168\")\n  if os.istarget(\"android\") then\n    -- ndk-build only supports StaticLib and SharedLib.\n    kind(\"StaticLib\")\n  else\n    kind(\"Utility\")\n  end\n  language(\"C++\")\n  files({\n    \"cxxopts/include/cxxopts.hpp\",\n  })\n  warnings(\"Off\")\n"
  },
  {
    "path": "third_party/discord-rpc.lua",
    "content": "group(\"third_party\")\nproject(\"discord-rpc\")\n  uuid(\"012f6131-efc0-4abd-852d-a33640732d4c\")\n  kind(\"StaticLib\")\n  language(\"C++\")\n  links({\n  })\n  defines({\n    \"_LIB\",\n  })\n  includedirs({\n    \"discord-rpc/include\",\n    \"rapidjson/include\"\n  })\n  files({\n    \"discord-rpc/src/connection.h\",\n    \"discord-rpc/src/discord_rpc.cpp\",\n    \"discord-rpc/src/msg_queue.h\",\n    \"discord-rpc/src/rpc_connection.cpp\",\n    \"discord-rpc/src/rpc_connection.h\",\n    \"discord-rpc/src/serialization.cpp\",\n    \"discord-rpc/src/serialization.h\"\n  })\n  filter(\"platforms:Linux\")\n    files({\n      \"discord-rpc/src/connection_unix.cpp\",\n      \"discord-rpc/src/discord_register_linux.cpp\"\n    })\n  filter(\"platforms:Mac\")\n    files({\n      \"discord-rpc/src/discord_register_osx.m\"\n    })\n  filter(\"platforms:Windows\")\n    files({\n      \"discord-rpc/src/connection_win.cpp\",\n      \"discord-rpc/src/discord_register_win.cpp\"\n    })"
  },
  {
    "path": "third_party/dxbc/DXBCChecksum.cpp",
    "content": "// Xenia: removed Windows.h dependency.\n\n//=====================================================================\n// Copyright 2008-2016 (c), Advanced Micro Devices, Inc. All rights reserved.\n//\n/// \\author AMD Developer Tools Team\n/// \\file DXBCChecksum.cpp\n///\n//=====================================================================\n\n//=====================================================================\n// $Id: //devtools/main/Common/Src/ShaderUtils/DX10/DXBCChecksum.cpp#4 $\n//\n// Last checkin:  $DateTime: 2016/04/18 06:01:26 $\n// Last edited by: $Author:  AMD Developer Tools Team\n//=====================================================================\n// Free for all implementation of the MD5 hash algorithm\n\n/*\n**********************************************************************\n** DXBCChecksum.cpp                                                     **\n**                                                                  **\n** - Modified by Seth Sowerby, November 2007                        **\n**   Modified to match DXBC checksum algorithm used by Microsoft    **\n**                                                                  **\n**********************************************************************\n*/\n\n/*\n**********************************************************************\n** MD5.cpp                                                          **\n**                                                                  **\n** - Style modified by Tony Ray, January 2001                       **\n**   Added support for randomizing initialization constants         **\n** - Style modified by Dominik Reichl, April 2003                   **\n**   Optimized code                                                 **\n**                                                                  **\n**********************************************************************\n*/\n\n/*\n **********************************************************************\n ** MD5.c                                                            **\n ** RSA Data Security, Inc. MD5 Message Digest Algorithm             **\n ** Created: 2/17/90 RLR                                             **\n ** Revised: 1/91 SRD,AJ,BSK,JT Reference C Version                  **\n **********************************************************************\n */\n\n/*\n **********************************************************************\n ** Copyright (C) 1990, RSA Data Security, Inc. All rights reserved. **\n **                                                                  **\n ** License to copy and use this software is granted provided that   **\n ** it is identified as the \"RSA Data Security, Inc. MD5 Message     **\n ** Digest Algorithm\" in all material mentioning or referencing this **\n ** software or this function.                                       **\n **                                                                  **\n ** License is also granted to make and use derivative works         **\n ** provided that such works are identified as \"derived from the RSA **\n ** Data Security, Inc. MD5 Message Digest Algorithm\" in all         **\n ** material mentioning or referencing the derived work.             **\n **                                                                  **\n ** RSA Data Security, Inc. makes no representations concerning      **\n ** either the merchantability of this software or the suitability   **\n ** of this software for any particular purpose.  It is provided \"as **\n ** is\" without express or implied warranty of any kind.             **\n **                                                                  **\n ** These notices must be retained in any copies of any part of this **\n ** documentation and/or software.                                   **\n **********************************************************************\n */\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include \"DXBCChecksum.h\"\n\n/* Padding */\nstatic unsigned char MD5_PADDING[64] =\n{\n    0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00\n};\n\n/* MD5_F, MD5_G and MD5_H are basic MD5 functions: selection, majority, parity */\n#define MD5_F(x, y, z) (((x) & (y)) | ((~x) & (z)))\n#define MD5_G(x, y, z) (((x) & (z)) | ((y) & (~z)))\n#define MD5_H(x, y, z) ((x) ^ (y) ^ (z))\n#define MD5_I(x, y, z) ((y) ^ ((x) | (~z)))\n\n/* ROTATE_LEFT rotates x left n bits */\n#ifndef ROTATE_LEFT\n    #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))\n#endif\n\n/* MD5_FF, MD5_GG, MD5_HH, and MD5_II transformations for rounds 1, 2, 3, and 4 */\n/* Rotation is separate from addition to prevent recomputation */\n#define MD5_FF(a, b, c, d, x, s, ac) {(a) += MD5_F ((b), (c), (d)) + (x) + (UINT4)(ac); (a) = ROTATE_LEFT ((a), (s)); (a) += (b); }\n#define MD5_GG(a, b, c, d, x, s, ac) {(a) += MD5_G ((b), (c), (d)) + (x) + (UINT4)(ac); (a) = ROTATE_LEFT ((a), (s)); (a) += (b); }\n#define MD5_HH(a, b, c, d, x, s, ac) {(a) += MD5_H ((b), (c), (d)) + (x) + (UINT4)(ac); (a) = ROTATE_LEFT ((a), (s)); (a) += (b); }\n#define MD5_II(a, b, c, d, x, s, ac) {(a) += MD5_I ((b), (c), (d)) + (x) + (UINT4)(ac); (a) = ROTATE_LEFT ((a), (s)); (a) += (b); }\n\n/* Constants for transformation */\n#define MD5_S11 7  /* Round 1 */\n#define MD5_S12 12\n#define MD5_S13 17\n#define MD5_S14 22\n#define MD5_S21 5  /* Round 2 */\n#define MD5_S22 9\n#define MD5_S23 14\n#define MD5_S24 20\n#define MD5_S31 4  /* Round 3 */\n#define MD5_S32 11\n#define MD5_S33 16\n#define MD5_S34 23\n#define MD5_S41 6  /* Round 4 */\n#define MD5_S42 10\n#define MD5_S43 15\n#define MD5_S44 21\n\n/* Typedef a 32 bit type */\n#ifndef UINT4\n    typedef unsigned int UINT4;\n#endif\n\n/* Data structure for MD5 (Message Digest) computation */\ntypedef struct\n{\n    UINT4 i[2];                   /* Number of _bits_ handled mod 2^64 */\n    UINT4 buf[4];                                    /* Scratch buffer */\n    unsigned char in[64];                              /* Input buffer */\n    unsigned char digest[16];     /* Actual digest after MD5Final call */\n} MD5_CTX;\n\nstatic void MD5_Transform(UINT4* buf, UINT4* in);\n\nvoid MD5Init(MD5_CTX* mdContext, unsigned long pseudoRandomNumber = 0);\nvoid MD5Update(MD5_CTX* mdContext, unsigned char* inBuf, unsigned int inLen);\nvoid MD5Final(MD5_CTX* mdContext);\n\n/* Basic MD5 step. MD5_Transform buf based on in */\nstatic void MD5_Transform(UINT4* buf, UINT4* in)\n{\n    UINT4 a = buf[0], b = buf[1], c = buf[2], d = buf[3];\n\n    /* Round 1 */\n    MD5_FF(a, b, c, d, in[ 0], MD5_S11, (UINT4) 3614090360u);      /* 1 */\n    MD5_FF(d, a, b, c, in[ 1], MD5_S12, (UINT4) 3905402710u);      /* 2 */\n    MD5_FF(c, d, a, b, in[ 2], MD5_S13, (UINT4)  606105819u);      /* 3 */\n    MD5_FF(b, c, d, a, in[ 3], MD5_S14, (UINT4) 3250441966u);      /* 4 */\n    MD5_FF(a, b, c, d, in[ 4], MD5_S11, (UINT4) 4118548399u);      /* 5 */\n    MD5_FF(d, a, b, c, in[ 5], MD5_S12, (UINT4) 1200080426u);      /* 6 */\n    MD5_FF(c, d, a, b, in[ 6], MD5_S13, (UINT4) 2821735955u);      /* 7 */\n    MD5_FF(b, c, d, a, in[ 7], MD5_S14, (UINT4) 4249261313u);      /* 8 */\n    MD5_FF(a, b, c, d, in[ 8], MD5_S11, (UINT4) 1770035416u);      /* 9 */\n    MD5_FF(d, a, b, c, in[ 9], MD5_S12, (UINT4) 2336552879u);      /* 10 */\n    MD5_FF(c, d, a, b, in[10], MD5_S13, (UINT4) 4294925233u);      /* 11 */\n    MD5_FF(b, c, d, a, in[11], MD5_S14, (UINT4) 2304563134u);      /* 12 */\n    MD5_FF(a, b, c, d, in[12], MD5_S11, (UINT4) 1804603682u);      /* 13 */\n    MD5_FF(d, a, b, c, in[13], MD5_S12, (UINT4) 4254626195u);      /* 14 */\n    MD5_FF(c, d, a, b, in[14], MD5_S13, (UINT4) 2792965006u);      /* 15 */\n    MD5_FF(b, c, d, a, in[15], MD5_S14, (UINT4) 1236535329u);      /* 16 */\n\n    /* Round 2 */\n    MD5_GG(a, b, c, d, in[ 1], MD5_S21, (UINT4) 4129170786u);      /* 17 */\n    MD5_GG(d, a, b, c, in[ 6], MD5_S22, (UINT4) 3225465664u);      /* 18 */\n    MD5_GG(c, d, a, b, in[11], MD5_S23, (UINT4)  643717713u);      /* 19 */\n    MD5_GG(b, c, d, a, in[ 0], MD5_S24, (UINT4) 3921069994u);      /* 20 */\n    MD5_GG(a, b, c, d, in[ 5], MD5_S21, (UINT4) 3593408605u);      /* 21 */\n    MD5_GG(d, a, b, c, in[10], MD5_S22, (UINT4)   38016083u);      /* 22 */\n    MD5_GG(c, d, a, b, in[15], MD5_S23, (UINT4) 3634488961u);      /* 23 */\n    MD5_GG(b, c, d, a, in[ 4], MD5_S24, (UINT4) 3889429448u);      /* 24 */\n    MD5_GG(a, b, c, d, in[ 9], MD5_S21, (UINT4)  568446438u);      /* 25 */\n    MD5_GG(d, a, b, c, in[14], MD5_S22, (UINT4) 3275163606u);      /* 26 */\n    MD5_GG(c, d, a, b, in[ 3], MD5_S23, (UINT4) 4107603335u);      /* 27 */\n    MD5_GG(b, c, d, a, in[ 8], MD5_S24, (UINT4) 1163531501u);      /* 28 */\n    MD5_GG(a, b, c, d, in[13], MD5_S21, (UINT4) 2850285829u);      /* 29 */\n    MD5_GG(d, a, b, c, in[ 2], MD5_S22, (UINT4) 4243563512u);      /* 30 */\n    MD5_GG(c, d, a, b, in[ 7], MD5_S23, (UINT4) 1735328473u);      /* 31 */\n    MD5_GG(b, c, d, a, in[12], MD5_S24, (UINT4) 2368359562u);      /* 32 */\n\n    /* Round 3 */\n    MD5_HH(a, b, c, d, in[ 5], MD5_S31, (UINT4) 4294588738u);      /* 33 */\n    MD5_HH(d, a, b, c, in[ 8], MD5_S32, (UINT4) 2272392833u);      /* 34 */\n    MD5_HH(c, d, a, b, in[11], MD5_S33, (UINT4) 1839030562u);      /* 35 */\n    MD5_HH(b, c, d, a, in[14], MD5_S34, (UINT4) 4259657740u);      /* 36 */\n    MD5_HH(a, b, c, d, in[ 1], MD5_S31, (UINT4) 2763975236u);      /* 37 */\n    MD5_HH(d, a, b, c, in[ 4], MD5_S32, (UINT4) 1272893353u);      /* 38 */\n    MD5_HH(c, d, a, b, in[ 7], MD5_S33, (UINT4) 4139469664u);      /* 39 */\n    MD5_HH(b, c, d, a, in[10], MD5_S34, (UINT4) 3200236656u);      /* 40 */\n    MD5_HH(a, b, c, d, in[13], MD5_S31, (UINT4)  681279174u);      /* 41 */\n    MD5_HH(d, a, b, c, in[ 0], MD5_S32, (UINT4) 3936430074u);      /* 42 */\n    MD5_HH(c, d, a, b, in[ 3], MD5_S33, (UINT4) 3572445317u);      /* 43 */\n    MD5_HH(b, c, d, a, in[ 6], MD5_S34, (UINT4)   76029189u);      /* 44 */\n    MD5_HH(a, b, c, d, in[ 9], MD5_S31, (UINT4) 3654602809u);      /* 45 */\n    MD5_HH(d, a, b, c, in[12], MD5_S32, (UINT4) 3873151461u);      /* 46 */\n    MD5_HH(c, d, a, b, in[15], MD5_S33, (UINT4)  530742520u);      /* 47 */\n    MD5_HH(b, c, d, a, in[ 2], MD5_S34, (UINT4) 3299628645u);      /* 48 */\n\n    /* Round 4 */\n    MD5_II(a, b, c, d, in[ 0], MD5_S41, (UINT4) 4096336452u);      /* 49 */\n    MD5_II(d, a, b, c, in[ 7], MD5_S42, (UINT4) 1126891415u);      /* 50 */\n    MD5_II(c, d, a, b, in[14], MD5_S43, (UINT4) 2878612391u);      /* 51 */\n    MD5_II(b, c, d, a, in[ 5], MD5_S44, (UINT4) 4237533241u);      /* 52 */\n    MD5_II(a, b, c, d, in[12], MD5_S41, (UINT4) 1700485571u);      /* 53 */\n    MD5_II(d, a, b, c, in[ 3], MD5_S42, (UINT4) 2399980690u);      /* 54 */\n    MD5_II(c, d, a, b, in[10], MD5_S43, (UINT4) 4293915773u);      /* 55 */\n    MD5_II(b, c, d, a, in[ 1], MD5_S44, (UINT4) 2240044497u);      /* 56 */\n    MD5_II(a, b, c, d, in[ 8], MD5_S41, (UINT4) 1873313359u);      /* 57 */\n    MD5_II(d, a, b, c, in[15], MD5_S42, (UINT4) 4264355552u);      /* 58 */\n    MD5_II(c, d, a, b, in[ 6], MD5_S43, (UINT4) 2734768916u);      /* 59 */\n    MD5_II(b, c, d, a, in[13], MD5_S44, (UINT4) 1309151649u);      /* 60 */\n    MD5_II(a, b, c, d, in[ 4], MD5_S41, (UINT4) 4149444226u);      /* 61 */\n    MD5_II(d, a, b, c, in[11], MD5_S42, (UINT4) 3174756917u);      /* 62 */\n    MD5_II(c, d, a, b, in[ 2], MD5_S43, (UINT4)  718787259u);      /* 63 */\n    MD5_II(b, c, d, a, in[ 9], MD5_S44, (UINT4) 3951481745u);      /* 64 */\n\n    buf[0] += a;\n    buf[1] += b;\n    buf[2] += c;\n    buf[3] += d;\n}\n\n// Set pseudoRandomNumber to zero for RFC MD5 implementation\nvoid MD5Init(MD5_CTX* mdContext, unsigned long pseudoRandomNumber)\n{\n    mdContext->i[0] = mdContext->i[1] = (UINT4)0;\n\n    /* Load magic initialization constants */\n    mdContext->buf[0] = (UINT4)0x67452301 + (pseudoRandomNumber * 11);\n    mdContext->buf[1] = (UINT4)0xefcdab89 + (pseudoRandomNumber * 71);\n    mdContext->buf[2] = (UINT4)0x98badcfe + (pseudoRandomNumber * 37);\n    mdContext->buf[3] = (UINT4)0x10325476 + (pseudoRandomNumber * 97);\n}\n\nvoid MD5Update(MD5_CTX* mdContext, unsigned char* inBuf, unsigned int inLen)\n{\n    UINT4 in[16];\n    int mdi = 0;\n    unsigned int i = 0, ii = 0;\n\n    /* Compute number of bytes mod 64 */\n    mdi = (int)((mdContext->i[0] >> 3) & 0x3F);\n\n    /* Update number of bits */\n    if ((mdContext->i[0] + ((UINT4)inLen << 3)) < mdContext->i[0])\n    {\n        mdContext->i[1]++;\n    }\n\n    mdContext->i[0] += ((UINT4)inLen << 3);\n    mdContext->i[1] += ((UINT4)inLen >> 29);\n\n    while (inLen--)\n    {\n        /* Add new character to buffer, increment mdi */\n        mdContext->in[mdi++] = *inBuf++;\n\n        /* Transform if necessary */\n        if (mdi == 0x40)\n        {\n            for (i = 0, ii = 0; i < 16; i++, ii += 4)\n                in[i] = (((UINT4)mdContext->in[ii + 3]) << 24) |\n                        (((UINT4)mdContext->in[ii + 2]) << 16) |\n                        (((UINT4)mdContext->in[ii + 1]) << 8) |\n                        ((UINT4)mdContext->in[ii]);\n\n            MD5_Transform(mdContext->buf, in);\n            mdi = 0;\n        }\n    }\n}\n\nvoid MD5Final(MD5_CTX* mdContext)\n{\n    UINT4 in[16];\n    int mdi = 0;\n    unsigned int i = 0, ii = 0, padLen = 0;\n\n    /* Save number of bits */\n    unsigned int numberOfBits = mdContext->i[0];\n\n    /* Pad out to 56 mod 64 */\n    padLen = (mdi < 56) ? (56 - mdi) : (120 - mdi);\n\n    MD5Update(mdContext, (unsigned char*) &numberOfBits, 4);\n\n    /* Compute number of bytes mod 64 */\n    mdi = (int)((mdContext->i[0] >> 3) & 0x3F);\n\n    /* Pad out to 56 mod 64 */\n    padLen = (mdi < 56) ? (56 - mdi) : (120 - mdi);\n    MD5Update(mdContext, MD5_PADDING, padLen);\n\n    ((UINT4*)mdContext->in)[15] = (numberOfBits >> 2) | 1;\n    // MD5Update (mdContext, (unsigned char*) terminator, 8);\n\n    memcpy(in, mdContext->in, 64);\n    /* Append length in bits and transform */\n    /*\n       for (i = 0, ii = 0; i < 14; i++, ii += 4)\n          in[i] = (((UINT4)mdContext->in[ii+3]) << 24) |\n             (((UINT4)mdContext->in[ii+2]) << 16) |\n             (((UINT4)mdContext->in[ii+1]) <<  8) |\n             ((UINT4)mdContext->in[ii]);\n    */\n    MD5_Transform(mdContext->buf, in);\n\n    /* Store buffer in digest */\n    for (i = 0, ii = 0; i < 4; i++, ii += 4)\n    {\n        mdContext->digest[ii]   = (unsigned char)(mdContext->buf[i]        & 0xFF);\n        mdContext->digest[ii + 1] = (unsigned char)((mdContext->buf[i] >>  8) & 0xFF);\n        mdContext->digest[ii + 2] = (unsigned char)((mdContext->buf[i] >> 16) & 0xFF);\n        mdContext->digest[ii + 3] = (unsigned char)((mdContext->buf[i] >> 24) & 0xFF);\n    }\n}\n\nstatic const unsigned int dwHashOffset = 0x14;\n\nvoid CalculateDXBCChecksum(unsigned char* pData, unsigned int dwSize, unsigned int dwHash[4])\n{\n    MD5_CTX md5Ctx;\n    MD5Init(&md5Ctx, 0);\n\n    // Skip the start of the shader header\n    dwSize -= dwHashOffset;\n    pData += dwHashOffset;\n\n    unsigned int dwNumberOfBits = dwSize * 8;\n\n    // First we hash all the full chunks available\n    unsigned int dwFullChunksSize = dwSize & 0xffffffc0;\n    MD5Update(&md5Ctx, pData, dwFullChunksSize);\n\n    unsigned int dwLastChunkSize = dwSize - dwFullChunksSize;\n    unsigned int dwPaddingSize = 64  - dwLastChunkSize;\n    unsigned char* pLastChunkData = pData + dwFullChunksSize;\n\n    if (dwLastChunkSize >= 56)\n    {\n        MD5Update(&md5Ctx, pLastChunkData, dwLastChunkSize);\n\n        /* Pad out to 56 mod 64 */\n        MD5Update(&md5Ctx, MD5_PADDING, dwPaddingSize);\n\n        // Pass in the number of bits\n        UINT4 in[16];\n        memset(in, 0, sizeof(in));\n        in[0] = dwNumberOfBits;\n        in[15] = (dwNumberOfBits >> 2) | 1;\n\n        MD5_Transform(md5Ctx.buf, in);\n    }\n    else\n    {\n        // Pass in the number of bits\n        MD5Update(&md5Ctx, (unsigned char*) &dwNumberOfBits, 4);\n\n        if (dwLastChunkSize)\n        {\n            MD5Update(&md5Ctx, pLastChunkData, dwLastChunkSize);\n        }\n\n\n        // Adjust for the space used for dwNumberOfBits\n        dwLastChunkSize += sizeof(unsigned int);\n        dwPaddingSize -= sizeof(unsigned int);\n\n        /* Pad out to 56 mod 64 */\n        memcpy(&md5Ctx.in[dwLastChunkSize], MD5_PADDING, dwPaddingSize);\n\n        ((UINT4*)md5Ctx.in)[15] = (dwNumberOfBits >> 2) | 1;\n\n        UINT4 in[16];\n        memcpy(in, md5Ctx.in, 64);\n\n        MD5_Transform(md5Ctx.buf, in);\n    }\n\n    memcpy(dwHash, md5Ctx.buf, 4 * sizeof(unsigned int));\n}"
  },
  {
    "path": "third_party/dxbc/DXBCChecksum.h",
    "content": "// Xenia: removed Windows.h dependency.\n\n//=====================================================================\n// Copyright 2008-2016 (c), Advanced Micro Devices, Inc. All rights reserved.\n//\n/// \\author AMD Developer Tools Team\n/// \\file DXBCChecksum.h\n///\n//=====================================================================\n\n//=====================================================================\n// $Id: //devtools/main/Common/Src/ShaderUtils/DX10/DXBCChecksum.h#4 $\n//\n// Last checkin:  $DateTime: 2016/04/18 06:01:26 $\n// Last edited by: $Author:  AMD Developer Tools Team\n//=====================================================================\n\n#pragma once\n#ifndef DXBCCHECKSUM_H\n#define DXBCCHECKSUM_H\n\n/*\n **********************************************************************\n ** MD5.h                                                            **\n **                                                                  **\n ** - Style modified by Tony Ray, January 2001                       **\n **   Added support for randomizing initialization constants         **\n ** - Style modified by Dominik Reichl, September 2002               **\n **   Optimized code                                                 **\n **                                                                  **\n **********************************************************************\n */\n\n/*\n **********************************************************************\n ** MD5.h -- Header file for implementation of MD5                   **\n ** RSA Data Security, Inc. MD5 Message Digest Algorithm             **\n ** Created: 2/17/90 RLR                                             **\n ** Revised: 12/27/90 SRD,AJ,BSK,JT Reference C version              **\n ** Revised (for MD5): RLR 4/27/91                                   **\n **   -- G modified to have y&~z instead of y&z                      **\n **   -- FF, GG, HH modified to add in last register done            **\n **   -- Access pattern: round 2 works mod 5, round 3 works mod 3    **\n **   -- distinct additive constant for each step                    **\n **   -- round 4 added, working mod 7                                **\n **********************************************************************\n */\n\n/*\n **********************************************************************\n ** Copyright (C) 1990, RSA Data Security, Inc. All rights reserved. **\n **                                                                  **\n ** License to copy and use this software is granted provided that   **\n ** it is identified as the \"RSA Data Security, Inc. MD5 Message     **\n ** Digest Algorithm\" in all material mentioning or referencing this **\n ** software or this function.                                       **\n **                                                                  **\n ** License is also granted to make and use derivative works         **\n ** provided that such works are identified as \"derived from the RSA **\n ** Data Security, Inc. MD5 Message Digest Algorithm\" in all         **\n ** material mentioning or referencing the derived work.             **\n **                                                                  **\n ** RSA Data Security, Inc. makes no representations concerning      **\n ** either the merchantability of this software or the suitability   **\n ** of this software for any particular purpose.  It is provided \"as **\n ** is\" without express or implied warranty of any kind.             **\n **                                                                  **\n ** These notices must be retained in any copies of any part of this **\n ** documentation and/or software.                                   **\n **********************************************************************\n */\n\n/// Calculate the DXBC checksum for the provided chunk of memory.\n/// \\param[in] pData    A pointer to the memory to checksum.\n/// \\param[in] dwSize   The size of the memory to checksum.\n/// \\param[out] dwHash  A DWORD array to copy the calculated check sum into.\nvoid CalculateDXBCChecksum(unsigned char* pData, unsigned int dwSize, unsigned int dwHash[4]);\n\n#endif // DXBCCHECKSUM_H\n"
  },
  {
    "path": "third_party/dxbc.lua",
    "content": "group(\"third_party\")\nproject(\"dxbc\")\n  uuid(\"c96688ca-51ca-406e-aeef-068734a67abe\")\n  kind(\"StaticLib\")\n  language(\"C++\")\n  links({\n  })\n  defines({\n    \"_LIB\",\n  })\n  includedirs({\n    \"dxbc\",\n  })\n  files({\n    \"dxbc/DXBCChecksum.cpp\",\n    \"dxbc/DXBCChecksum.h\",\n  })\n"
  },
  {
    "path": "third_party/fmt.lua",
    "content": "group(\"third_party\")\nproject(\"fmt\")\n  uuid(\"b9ff4b2c-b438-42a9-971e-e0c19a711a13\")\n  kind(\"StaticLib\")\n  language(\"C++\")\n  links({\n  })\n  defines({\n    \"_LIB\",\n  })\n  includedirs({\n    \"fmt/include\",\n  })\n  files({\n    \"fmt/src/format.cc\",\n    \"fmt/src/os.cc\"\n  })\n"
  },
  {
    "path": "third_party/fxaa/FXAA3_11.h",
    "content": "//----------------------------------------------------------------------------------\n// File:        es3-kepler\\FXAA/FXAA3_11.h\n// SDK Version: v2.11 \n// Email:       gameworks@nvidia.com\n// Site:        http://developer.nvidia.com/\n//\n// Copyright (c) 2014-2015, NVIDIA CORPORATION. All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions\n// are met:\n//  * Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//  * Redistributions in binary form must reproduce the above copyright\n//    notice, this list of conditions and the following disclaimer in the\n//    documentation and/or other materials provided with the distribution.\n//  * Neither the name of NVIDIA CORPORATION nor the names of its\n//    contributors may be used to endorse or promote products derived\n//    from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY\n// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n// PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY\n// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n//----------------------------------------------------------------------------------\n/*============================================================================\n\n\n                    NVIDIA FXAA 3.11 by TIMOTHY LOTTES\n\n------------------------------------------------------------------------------\n                           INTEGRATION CHECKLIST\n------------------------------------------------------------------------------\n(1.)\nIn the shader source, setup defines for the desired configuration.\nWhen providing multiple shaders (for different presets),\nsimply setup the defines differently in multiple files.\nExample,\n\n  #define FXAA_PC 1\n  #define FXAA_HLSL_5 1\n  #define FXAA_QUALITY__PRESET 12\n\nOr,\n\n  #define FXAA_360 1\n  \nOr,\n\n  #define FXAA_PS3 1\n  \nEtc.\n\n(2.)\nThen include this file,\n\n  #include \"Fxaa3_11.h\"\n\n(3.)\nThen call the FXAA pixel shader from within your desired shader.\nLook at the FXAA Quality FxaaPixelShader() for docs on inputs.\nAs for FXAA 3.11 all inputs for all shaders are the same \nto enable easy porting between platforms.\n\n  return FxaaPixelShader(...);\n\n(4.)\nInsure pass prior to FXAA outputs RGBL (see next section).\nOr use,\n\n  #define FXAA_GREEN_AS_LUMA 1\n\n(5.)\nSetup engine to provide the following constants\nwhich are used in the FxaaPixelShader() inputs,\n\n  FxaaFloat2 fxaaQualityRcpFrame,\n  FxaaFloat4 fxaaConsoleRcpFrameOpt,\n  FxaaFloat4 fxaaConsoleRcpFrameOpt2,\n  FxaaFloat4 fxaaConsole360RcpFrameOpt2,\n  FxaaFloat fxaaQualitySubpix,\n  FxaaFloat fxaaQualityEdgeThreshold,\n  FxaaFloat fxaaQualityEdgeThresholdMin,\n  FxaaFloat fxaaConsoleEdgeSharpness,\n  FxaaFloat fxaaConsoleEdgeThreshold,\n  FxaaFloat fxaaConsoleEdgeThresholdMin,\n  FxaaFloat4 fxaaConsole360ConstDir\n\nLook at the FXAA Quality FxaaPixelShader() for docs on inputs.\n\n(6.)\nHave FXAA vertex shader run as a full screen triangle,\nand output \"pos\" and \"fxaaConsolePosPos\" \nsuch that inputs in the pixel shader provide,\n\n  // {xy} = center of pixel\n  FxaaFloat2 pos,\n\n  // {xy__} = upper left of pixel\n  // {__zw} = lower right of pixel\n  FxaaFloat4 fxaaConsolePosPos,\n\n(7.)\nInsure the texture sampler(s) used by FXAA are set to bilinear filtering.\n\n\n------------------------------------------------------------------------------\n                    INTEGRATION - RGBL AND COLORSPACE\n------------------------------------------------------------------------------\nFXAA3 requires RGBL as input unless the following is set, \n\n  #define FXAA_GREEN_AS_LUMA 1\n\nIn which case the engine uses green in place of luma,\nand requires RGB input is in a non-linear colorspace.\n\nRGB should be LDR (low dynamic range).\nSpecifically do FXAA after tonemapping.\n\nRGB data as returned by a texture fetch can be non-linear,\nor linear when FXAA_GREEN_AS_LUMA is not set.\nNote an \"sRGB format\" texture counts as linear,\nbecause the result of a texture fetch is linear data.\nRegular \"RGBA8\" textures in the sRGB colorspace are non-linear.\n\nIf FXAA_GREEN_AS_LUMA is not set,\nluma must be stored in the alpha channel prior to running FXAA.\nThis luma should be in a perceptual space (could be gamma 2.0).\nExample pass before FXAA where output is gamma 2.0 encoded,\n\n  color.rgb = ToneMap(color.rgb); // linear color output\n  color.rgb = sqrt(color.rgb);    // gamma 2.0 color output\n  return color;\n\nTo use FXAA,\n\n  color.rgb = ToneMap(color.rgb);  // linear color output\n  color.rgb = sqrt(color.rgb);     // gamma 2.0 color output\n  color.a = dot(color.rgb, FxaaFloat3(0.299, 0.587, 0.114)); // compute luma\n  return color;\n\nAnother example where output is linear encoded,\nsay for instance writing to an sRGB formated render target,\nwhere the render target does the conversion back to sRGB after blending,\n\n  color.rgb = ToneMap(color.rgb); // linear color output\n  return color;\n\nTo use FXAA,\n\n  color.rgb = ToneMap(color.rgb); // linear color output\n  color.a = sqrt(dot(color.rgb, FxaaFloat3(0.299, 0.587, 0.114))); // compute luma\n  return color;\n\nGetting luma correct is required for the algorithm to work correctly.\n\n\n------------------------------------------------------------------------------\n                          BEING LINEARLY CORRECT?\n------------------------------------------------------------------------------\nApplying FXAA to a framebuffer with linear RGB color will look worse.\nThis is very counter intuitive, but happends to be true in this case.\nThe reason is because dithering artifacts will be more visiable \nin a linear colorspace.\n\n\n------------------------------------------------------------------------------\n                             COMPLEX INTEGRATION\n------------------------------------------------------------------------------\nQ. What if the engine is blending into RGB before wanting to run FXAA?\n\nA. In the last opaque pass prior to FXAA,\n   have the pass write out luma into alpha.\n   Then blend into RGB only.\n   FXAA should be able to run ok\n   assuming the blending pass did not any add aliasing.\n   This should be the common case for particles and common blending passes.\n\nA. Or use FXAA_GREEN_AS_LUMA.\n\n============================================================================*/\n\n/*============================================================================\n\n                             INTEGRATION KNOBS\n\n============================================================================*/\n//\n// FXAA_PS3 and FXAA_360 choose the console algorithm (FXAA3 CONSOLE).\n// FXAA_360_OPT is a prototype for the new optimized 360 version.\n//\n// 1 = Use API.\n// 0 = Don't use API.\n//\n/*--------------------------------------------------------------------------*/\n#ifndef FXAA_PS3\n    #define FXAA_PS3 0\n#endif\n/*--------------------------------------------------------------------------*/\n#ifndef FXAA_360\n    #define FXAA_360 0\n#endif\n/*--------------------------------------------------------------------------*/\n#ifndef FXAA_360_OPT\n    #define FXAA_360_OPT 0\n#endif\n/*==========================================================================*/\n#ifndef FXAA_PC\n    //\n    // FXAA Quality\n    // The high quality PC algorithm.\n    //\n    #define FXAA_PC 0\n#endif\n/*--------------------------------------------------------------------------*/\n#ifndef FXAA_PC_CONSOLE\n    //\n    // The console algorithm for PC is included\n    // for developers targeting really low spec machines.\n    // Likely better to just run FXAA_PC, and use a really low preset.\n    //\n    #define FXAA_PC_CONSOLE 0\n#endif\n/*--------------------------------------------------------------------------*/\n#ifndef FXAA_GLSL_120\n    #define FXAA_GLSL_120 0\n#endif\n/*--------------------------------------------------------------------------*/\n#ifndef FXAA_GLSL_130\n    #define FXAA_GLSL_130 0\n#endif\n/*--------------------------------------------------------------------------*/\n#ifndef FXAA_HLSL_3\n    #define FXAA_HLSL_3 0\n#endif\n/*--------------------------------------------------------------------------*/\n#ifndef FXAA_HLSL_4\n    #define FXAA_HLSL_4 0\n#endif\n/*--------------------------------------------------------------------------*/\n#ifndef FXAA_HLSL_5\n    #define FXAA_HLSL_5 0\n#endif\n/*==========================================================================*/\n#ifndef FXAA_GREEN_AS_LUMA\n    //\n    // For those using non-linear color,\n    // and either not able to get luma in alpha, or not wanting to,\n    // this enables FXAA to run using green as a proxy for luma.\n    // So with this enabled, no need to pack luma in alpha.\n    //\n    // This will turn off AA on anything which lacks some amount of green.\n    // Pure red and blue or combination of only R and B, will get no AA.\n    //\n    // Might want to lower the settings for both,\n    //    fxaaConsoleEdgeThresholdMin\n    //    fxaaQualityEdgeThresholdMin\n    // In order to insure AA does not get turned off on colors \n    // which contain a minor amount of green.\n    //\n    // 1 = On.\n    // 0 = Off.\n    //\n    #define FXAA_GREEN_AS_LUMA 0\n#endif\n/*--------------------------------------------------------------------------*/\n#ifndef FXAA_EARLY_EXIT\n    //\n    // Controls algorithm's early exit path.\n    // On PS3 turning this ON adds 2 cycles to the shader.\n    // On 360 turning this OFF adds 10ths of a millisecond to the shader.\n    // Turning this off on console will result in a more blurry image.\n    // So this defaults to on.\n    //\n    // 1 = On.\n    // 0 = Off.\n    //\n    #define FXAA_EARLY_EXIT 1\n#endif\n/*--------------------------------------------------------------------------*/\n#ifndef FXAA_DISCARD\n    //\n    // Only valid for PC OpenGL currently.\n    // Probably will not work when FXAA_GREEN_AS_LUMA = 1.\n    //\n    // 1 = Use discard on pixels which don't need AA.\n    //     For APIs which enable concurrent TEX+ROP from same surface.\n    // 0 = Return unchanged color on pixels which don't need AA.\n    //\n    #define FXAA_DISCARD 0\n#endif\n/*--------------------------------------------------------------------------*/\n#ifndef FXAA_FAST_PIXEL_OFFSET\n    //\n    // Used for GLSL 120 only.\n    //\n    // 1 = GL API supports fast pixel offsets\n    // 0 = do not use fast pixel offsets\n    //\n    #ifdef GL_EXT_gpu_shader4\n        #define FXAA_FAST_PIXEL_OFFSET 1\n    #endif\n    #ifdef GL_NV_gpu_shader5\n        #define FXAA_FAST_PIXEL_OFFSET 1\n    #endif\n    #ifdef GL_ARB_gpu_shader5\n        #define FXAA_FAST_PIXEL_OFFSET 1\n    #endif\n    #ifndef FXAA_FAST_PIXEL_OFFSET\n        #define FXAA_FAST_PIXEL_OFFSET 0\n    #endif\n#endif\n/*--------------------------------------------------------------------------*/\n#ifndef FXAA_GATHER4_ALPHA\n    //\n    // 1 = API supports gather4 on alpha channel.\n    // 0 = API does not support gather4 on alpha channel.\n    //\n    #if (FXAA_HLSL_5 == 1)\n        #define FXAA_GATHER4_ALPHA 1\n    #endif\n    #ifdef GL_ARB_gpu_shader5\n        #define FXAA_GATHER4_ALPHA 1\n    #endif\n    #ifdef GL_NV_gpu_shader5\n        #define FXAA_GATHER4_ALPHA 1\n    #endif\n    #ifndef FXAA_GATHER4_ALPHA\n        #define FXAA_GATHER4_ALPHA 0\n    #endif\n#endif\n\n/*============================================================================\n                      FXAA CONSOLE PS3 - TUNING KNOBS\n============================================================================*/\n#ifndef FXAA_CONSOLE__PS3_EDGE_SHARPNESS\n    //\n    // Consoles the sharpness of edges on PS3 only.\n    // Non-PS3 tuning is done with shader input.\n    //\n    // Due to the PS3 being ALU bound,\n    // there are only two safe values here: 4 and 8.\n    // These options use the shaders ability to a free *|/ by 2|4|8.\n    //\n    // 8.0 is sharper\n    // 4.0 is softer\n    // 2.0 is really soft (good for vector graphics inputs)\n    //\n    #if 1\n        #define FXAA_CONSOLE__PS3_EDGE_SHARPNESS 8.0\n    #endif\n    #if 0\n        #define FXAA_CONSOLE__PS3_EDGE_SHARPNESS 4.0\n    #endif\n    #if 0\n        #define FXAA_CONSOLE__PS3_EDGE_SHARPNESS 2.0\n    #endif\n#endif\n/*--------------------------------------------------------------------------*/\n#ifndef FXAA_CONSOLE__PS3_EDGE_THRESHOLD\n    //\n    // Only effects PS3.\n    // Non-PS3 tuning is done with shader input.\n    //\n    // The minimum amount of local contrast required to apply algorithm.\n    // The console setting has a different mapping than the quality setting.\n    //\n    // This only applies when FXAA_EARLY_EXIT is 1.\n    //\n    // Due to the PS3 being ALU bound,\n    // there are only two safe values here: 0.25 and 0.125.\n    // These options use the shaders ability to a free *|/ by 2|4|8.\n    //\n    // 0.125 leaves less aliasing, but is softer\n    // 0.25 leaves more aliasing, and is sharper\n    //\n    #if 1\n        #define FXAA_CONSOLE__PS3_EDGE_THRESHOLD 0.125\n    #else\n        #define FXAA_CONSOLE__PS3_EDGE_THRESHOLD 0.25\n    #endif\n#endif\n\n/*============================================================================\n                        FXAA QUALITY - TUNING KNOBS\n------------------------------------------------------------------------------\nNOTE the other tuning knobs are now in the shader function inputs!\n============================================================================*/\n#ifndef FXAA_QUALITY__PRESET\n    //\n    // Choose the quality preset.\n    // This needs to be compiled into the shader as it effects code.\n    // Best option to include multiple presets is to \n    // in each shader define the preset, then include this file.\n    // \n    // OPTIONS\n    // -----------------------------------------------------------------------\n    // 10 to 15 - default medium dither (10=fastest, 15=highest quality)\n    // 20 to 29 - less dither, more expensive (20=fastest, 29=highest quality)\n    // 39       - no dither, very expensive \n    //\n    // NOTES\n    // -----------------------------------------------------------------------\n    // 12 = slightly faster then FXAA 3.9 and higher edge quality (default)\n    // 13 = about same speed as FXAA 3.9 and better than 12\n    // 23 = closest to FXAA 3.9 visually and performance wise\n    //  _ = the lowest digit is directly related to performance\n    // _  = the highest digit is directly related to style\n    // \n    #define FXAA_QUALITY__PRESET 12\n#endif\n\n\n/*============================================================================\n\n                           FXAA QUALITY - PRESETS\n\n============================================================================*/\n\n/*============================================================================\n                     FXAA QUALITY - MEDIUM DITHER PRESETS\n============================================================================*/\n#if (FXAA_QUALITY__PRESET == 10)\n    #define FXAA_QUALITY__PS 3\n    #define FXAA_QUALITY__P0 1.5\n    #define FXAA_QUALITY__P1 3.0\n    #define FXAA_QUALITY__P2 12.0\n#endif\n/*--------------------------------------------------------------------------*/\n#if (FXAA_QUALITY__PRESET == 11)\n    #define FXAA_QUALITY__PS 4\n    #define FXAA_QUALITY__P0 1.0\n    #define FXAA_QUALITY__P1 1.5\n    #define FXAA_QUALITY__P2 3.0\n    #define FXAA_QUALITY__P3 12.0\n#endif\n/*--------------------------------------------------------------------------*/\n#if (FXAA_QUALITY__PRESET == 12)\n    #define FXAA_QUALITY__PS 5\n    #define FXAA_QUALITY__P0 1.0\n    #define FXAA_QUALITY__P1 1.5\n    #define FXAA_QUALITY__P2 2.0\n    #define FXAA_QUALITY__P3 4.0\n    #define FXAA_QUALITY__P4 12.0\n#endif\n/*--------------------------------------------------------------------------*/\n#if (FXAA_QUALITY__PRESET == 13)\n    #define FXAA_QUALITY__PS 6\n    #define FXAA_QUALITY__P0 1.0\n    #define FXAA_QUALITY__P1 1.5\n    #define FXAA_QUALITY__P2 2.0\n    #define FXAA_QUALITY__P3 2.0\n    #define FXAA_QUALITY__P4 4.0\n    #define FXAA_QUALITY__P5 12.0\n#endif\n/*--------------------------------------------------------------------------*/\n#if (FXAA_QUALITY__PRESET == 14)\n    #define FXAA_QUALITY__PS 7\n    #define FXAA_QUALITY__P0 1.0\n    #define FXAA_QUALITY__P1 1.5\n    #define FXAA_QUALITY__P2 2.0\n    #define FXAA_QUALITY__P3 2.0\n    #define FXAA_QUALITY__P4 2.0\n    #define FXAA_QUALITY__P5 4.0\n    #define FXAA_QUALITY__P6 12.0\n#endif\n/*--------------------------------------------------------------------------*/\n#if (FXAA_QUALITY__PRESET == 15)\n    #define FXAA_QUALITY__PS 8\n    #define FXAA_QUALITY__P0 1.0\n    #define FXAA_QUALITY__P1 1.5\n    #define FXAA_QUALITY__P2 2.0\n    #define FXAA_QUALITY__P3 2.0\n    #define FXAA_QUALITY__P4 2.0\n    #define FXAA_QUALITY__P5 2.0\n    #define FXAA_QUALITY__P6 4.0\n    #define FXAA_QUALITY__P7 12.0\n#endif\n\n/*============================================================================\n                     FXAA QUALITY - LOW DITHER PRESETS\n============================================================================*/\n#if (FXAA_QUALITY__PRESET == 20)\n    #define FXAA_QUALITY__PS 3\n    #define FXAA_QUALITY__P0 1.5\n    #define FXAA_QUALITY__P1 2.0\n    #define FXAA_QUALITY__P2 8.0\n#endif\n/*--------------------------------------------------------------------------*/\n#if (FXAA_QUALITY__PRESET == 21)\n    #define FXAA_QUALITY__PS 4\n    #define FXAA_QUALITY__P0 1.0\n    #define FXAA_QUALITY__P1 1.5\n    #define FXAA_QUALITY__P2 2.0\n    #define FXAA_QUALITY__P3 8.0\n#endif\n/*--------------------------------------------------------------------------*/\n#if (FXAA_QUALITY__PRESET == 22)\n    #define FXAA_QUALITY__PS 5\n    #define FXAA_QUALITY__P0 1.0\n    #define FXAA_QUALITY__P1 1.5\n    #define FXAA_QUALITY__P2 2.0\n    #define FXAA_QUALITY__P3 2.0\n    #define FXAA_QUALITY__P4 8.0\n#endif\n/*--------------------------------------------------------------------------*/\n#if (FXAA_QUALITY__PRESET == 23)\n    #define FXAA_QUALITY__PS 6\n    #define FXAA_QUALITY__P0 1.0\n    #define FXAA_QUALITY__P1 1.5\n    #define FXAA_QUALITY__P2 2.0\n    #define FXAA_QUALITY__P3 2.0\n    #define FXAA_QUALITY__P4 2.0\n    #define FXAA_QUALITY__P5 8.0\n#endif\n/*--------------------------------------------------------------------------*/\n#if (FXAA_QUALITY__PRESET == 24)\n    #define FXAA_QUALITY__PS 7\n    #define FXAA_QUALITY__P0 1.0\n    #define FXAA_QUALITY__P1 1.5\n    #define FXAA_QUALITY__P2 2.0\n    #define FXAA_QUALITY__P3 2.0\n    #define FXAA_QUALITY__P4 2.0\n    #define FXAA_QUALITY__P5 3.0\n    #define FXAA_QUALITY__P6 8.0\n#endif\n/*--------------------------------------------------------------------------*/\n#if (FXAA_QUALITY__PRESET == 25)\n    #define FXAA_QUALITY__PS 8\n    #define FXAA_QUALITY__P0 1.0\n    #define FXAA_QUALITY__P1 1.5\n    #define FXAA_QUALITY__P2 2.0\n    #define FXAA_QUALITY__P3 2.0\n    #define FXAA_QUALITY__P4 2.0\n    #define FXAA_QUALITY__P5 2.0\n    #define FXAA_QUALITY__P6 4.0\n    #define FXAA_QUALITY__P7 8.0\n#endif\n/*--------------------------------------------------------------------------*/\n#if (FXAA_QUALITY__PRESET == 26)\n    #define FXAA_QUALITY__PS 9\n    #define FXAA_QUALITY__P0 1.0\n    #define FXAA_QUALITY__P1 1.5\n    #define FXAA_QUALITY__P2 2.0\n    #define FXAA_QUALITY__P3 2.0\n    #define FXAA_QUALITY__P4 2.0\n    #define FXAA_QUALITY__P5 2.0\n    #define FXAA_QUALITY__P6 2.0\n    #define FXAA_QUALITY__P7 4.0\n    #define FXAA_QUALITY__P8 8.0\n#endif\n/*--------------------------------------------------------------------------*/\n#if (FXAA_QUALITY__PRESET == 27)\n    #define FXAA_QUALITY__PS 10\n    #define FXAA_QUALITY__P0 1.0\n    #define FXAA_QUALITY__P1 1.5\n    #define FXAA_QUALITY__P2 2.0\n    #define FXAA_QUALITY__P3 2.0\n    #define FXAA_QUALITY__P4 2.0\n    #define FXAA_QUALITY__P5 2.0\n    #define FXAA_QUALITY__P6 2.0\n    #define FXAA_QUALITY__P7 2.0\n    #define FXAA_QUALITY__P8 4.0\n    #define FXAA_QUALITY__P9 8.0\n#endif\n/*--------------------------------------------------------------------------*/\n#if (FXAA_QUALITY__PRESET == 28)\n    #define FXAA_QUALITY__PS 11\n    #define FXAA_QUALITY__P0 1.0\n    #define FXAA_QUALITY__P1 1.5\n    #define FXAA_QUALITY__P2 2.0\n    #define FXAA_QUALITY__P3 2.0\n    #define FXAA_QUALITY__P4 2.0\n    #define FXAA_QUALITY__P5 2.0\n    #define FXAA_QUALITY__P6 2.0\n    #define FXAA_QUALITY__P7 2.0\n    #define FXAA_QUALITY__P8 2.0\n    #define FXAA_QUALITY__P9 4.0\n    #define FXAA_QUALITY__P10 8.0\n#endif\n/*--------------------------------------------------------------------------*/\n#if (FXAA_QUALITY__PRESET == 29)\n    #define FXAA_QUALITY__PS 12\n    #define FXAA_QUALITY__P0 1.0\n    #define FXAA_QUALITY__P1 1.5\n    #define FXAA_QUALITY__P2 2.0\n    #define FXAA_QUALITY__P3 2.0\n    #define FXAA_QUALITY__P4 2.0\n    #define FXAA_QUALITY__P5 2.0\n    #define FXAA_QUALITY__P6 2.0\n    #define FXAA_QUALITY__P7 2.0\n    #define FXAA_QUALITY__P8 2.0\n    #define FXAA_QUALITY__P9 2.0\n    #define FXAA_QUALITY__P10 4.0\n    #define FXAA_QUALITY__P11 8.0\n#endif\n\n/*============================================================================\n                     FXAA QUALITY - EXTREME QUALITY\n============================================================================*/\n#if (FXAA_QUALITY__PRESET == 39)\n    #define FXAA_QUALITY__PS 12\n    #define FXAA_QUALITY__P0 1.0\n    #define FXAA_QUALITY__P1 1.0\n    #define FXAA_QUALITY__P2 1.0\n    #define FXAA_QUALITY__P3 1.0\n    #define FXAA_QUALITY__P4 1.0\n    #define FXAA_QUALITY__P5 1.5\n    #define FXAA_QUALITY__P6 2.0\n    #define FXAA_QUALITY__P7 2.0\n    #define FXAA_QUALITY__P8 2.0\n    #define FXAA_QUALITY__P9 2.0\n    #define FXAA_QUALITY__P10 4.0\n    #define FXAA_QUALITY__P11 8.0\n#endif\n\n\n\n/*============================================================================\n\n                                API PORTING\n\n============================================================================*/\n#if (FXAA_GLSL_120 == 1) || (FXAA_GLSL_130 == 1)\n    #define FxaaBool bool\n    #define FxaaDiscard discard\n    #define FxaaFloat float\n    #define FxaaFloat2 vec2\n    #define FxaaFloat3 vec3\n    #define FxaaFloat4 vec4\n    #define FxaaHalf float\n    #define FxaaHalf2 vec2\n    #define FxaaHalf3 vec3\n    #define FxaaHalf4 vec4\n    #define FxaaInt2 ivec2\n    #define FxaaSat(x) clamp(x, 0.0, 1.0)\n    #define FxaaTex sampler2D\n#else\n    #define FxaaBool bool\n    #define FxaaDiscard clip(-1)\n    #define FxaaFloat float\n    #define FxaaFloat2 float2\n    #define FxaaFloat3 float3\n    #define FxaaFloat4 float4\n    #define FxaaHalf half\n    #define FxaaHalf2 half2\n    #define FxaaHalf3 half3\n    #define FxaaHalf4 half4\n    #define FxaaSat(x) saturate(x)\n#endif\n/*--------------------------------------------------------------------------*/\n#if (FXAA_GLSL_120 == 1)\n    // Requires,\n    //  #version 120\n    // And at least,\n    //  #extension GL_EXT_gpu_shader4 : enable\n    //  (or set FXAA_FAST_PIXEL_OFFSET 1 to work like DX9)\n    #define FxaaTexTop(t, p) texture2DLod(t, p, 0.0)\n    #if (FXAA_FAST_PIXEL_OFFSET == 1)\n        #define FxaaTexOff(t, p, o, r) texture2DLodOffset(t, p, 0.0, o)\n    #else\n        #define FxaaTexOff(t, p, o, r) texture2DLod(t, p + (o * r), 0.0)\n    #endif\n    #if (FXAA_GATHER4_ALPHA == 1)\n        // use #extension GL_ARB_gpu_shader5 : enable\n        #define FxaaTexAlpha4(t, p) textureGather(t, p, 3)\n        #define FxaaTexOffAlpha4(t, p, o) textureGatherOffset(t, p, o, 3)\n        #define FxaaTexGreen4(t, p) textureGather(t, p, 1)\n        #define FxaaTexOffGreen4(t, p, o) textureGatherOffset(t, p, o, 1)\n    #endif\n#endif\n/*--------------------------------------------------------------------------*/\n#if (FXAA_GLSL_130 == 1)\n    // Requires \"#version 130\" or better\n    #define FxaaTexTop(t, p) textureLod(t, p, 0.0)\n    #define FxaaTexOff(t, p, o, r) textureLodOffset(t, p, 0.0, o)\n    #if (FXAA_GATHER4_ALPHA == 1)\n        // use #extension GL_ARB_gpu_shader5 : enable\n        #define FxaaTexAlpha4(t, p) textureGather(t, p, 3)\n        #define FxaaTexOffAlpha4(t, p, o) textureGatherOffset(t, p, o, 3)\n        #define FxaaTexGreen4(t, p) textureGather(t, p, 1)\n        #define FxaaTexOffGreen4(t, p, o) textureGatherOffset(t, p, o, 1)\n    #endif\n#endif\n/*--------------------------------------------------------------------------*/\n#if (FXAA_HLSL_3 == 1) || (FXAA_360 == 1) || (FXAA_PS3 == 1)\n    #define FxaaInt2 float2\n    #define FxaaTex sampler2D\n    #define FxaaTexTop(t, p) tex2Dlod(t, float4(p, 0.0, 0.0))\n    #define FxaaTexOff(t, p, o, r) tex2Dlod(t, float4(p + (o * r), 0, 0))\n#endif\n/*--------------------------------------------------------------------------*/\n#if (FXAA_HLSL_4 == 1)\n    #define FxaaInt2 int2\n    struct FxaaTex { SamplerState smpl; Texture2D tex; };\n    #define FxaaTexTop(t, p) t.tex.SampleLevel(t.smpl, p, 0.0)\n    #define FxaaTexOff(t, p, o, r) t.tex.SampleLevel(t.smpl, p, 0.0, o)\n#endif\n/*--------------------------------------------------------------------------*/\n#if (FXAA_HLSL_5 == 1)\n    #define FxaaInt2 int2\n    struct FxaaTex { SamplerState smpl; Texture2D tex; };\n    #define FxaaTexTop(t, p) t.tex.SampleLevel(t.smpl, p, 0.0)\n    #define FxaaTexOff(t, p, o, r) t.tex.SampleLevel(t.smpl, p, 0.0, o)\n    #define FxaaTexAlpha4(t, p) t.tex.GatherAlpha(t.smpl, p)\n    #define FxaaTexOffAlpha4(t, p, o) t.tex.GatherAlpha(t.smpl, p, o)\n    #define FxaaTexGreen4(t, p) t.tex.GatherGreen(t.smpl, p)\n    #define FxaaTexOffGreen4(t, p, o) t.tex.GatherGreen(t.smpl, p, o)\n#endif\n\n\n/*============================================================================\n                   GREEN AS LUMA OPTION SUPPORT FUNCTION\n============================================================================*/\n#if (FXAA_GREEN_AS_LUMA == 0)\n    FxaaFloat FxaaLuma(FxaaFloat4 rgba) { return rgba.w; }\n#else\n    FxaaFloat FxaaLuma(FxaaFloat4 rgba) { return rgba.y; }\n#endif    \n\n\n\n\n/*============================================================================\n\n                             FXAA3 QUALITY - PC\n\n============================================================================*/\n#if (FXAA_PC == 1)\n/*--------------------------------------------------------------------------*/\nFxaaFloat4 FxaaPixelShader(\n    //\n    // Use noperspective interpolation here (turn off perspective interpolation).\n    // {xy} = center of pixel\n    FxaaFloat2 pos,\n    //\n    // Used only for FXAA Console, and not used on the 360 version.\n    // Use noperspective interpolation here (turn off perspective interpolation).\n    // {xy__} = upper left of pixel\n    // {__zw} = lower right of pixel\n    FxaaFloat4 fxaaConsolePosPos,\n    //\n    // Input color texture.\n    // {rgb_} = color in linear or perceptual color space\n    // if (FXAA_GREEN_AS_LUMA == 0)\n    //     {___a} = luma in perceptual color space (not linear)\n    FxaaTex tex,\n    //\n    // Only used on the optimized 360 version of FXAA Console.\n    // For everything but 360, just use the same input here as for \"tex\".\n    // For 360, same texture, just alias with a 2nd sampler.\n    // This sampler needs to have an exponent bias of -1.\n    FxaaTex fxaaConsole360TexExpBiasNegOne,\n    //\n    // Only used on the optimized 360 version of FXAA Console.\n    // For everything but 360, just use the same input here as for \"tex\".\n    // For 360, same texture, just alias with a 3nd sampler.\n    // This sampler needs to have an exponent bias of -2.\n    FxaaTex fxaaConsole360TexExpBiasNegTwo,\n    //\n    // Only used on FXAA Quality.\n    // This must be from a constant/uniform.\n    // {x_} = 1.0/screenWidthInPixels\n    // {_y} = 1.0/screenHeightInPixels\n    FxaaFloat2 fxaaQualityRcpFrame,\n    //\n    // Only used on FXAA Console.\n    // This must be from a constant/uniform.\n    // This effects sub-pixel AA quality and inversely sharpness.\n    //   Where N ranges between,\n    //     N = 0.50 (default)\n    //     N = 0.33 (sharper)\n    // {x___} = -N/screenWidthInPixels  \n    // {_y__} = -N/screenHeightInPixels\n    // {__z_} =  N/screenWidthInPixels  \n    // {___w} =  N/screenHeightInPixels \n    FxaaFloat4 fxaaConsoleRcpFrameOpt,\n    //\n    // Only used on FXAA Console.\n    // Not used on 360, but used on PS3 and PC.\n    // This must be from a constant/uniform.\n    // {x___} = -2.0/screenWidthInPixels  \n    // {_y__} = -2.0/screenHeightInPixels\n    // {__z_} =  2.0/screenWidthInPixels  \n    // {___w} =  2.0/screenHeightInPixels \n    FxaaFloat4 fxaaConsoleRcpFrameOpt2,\n    //\n    // Only used on FXAA Console.\n    // Only used on 360 in place of fxaaConsoleRcpFrameOpt2.\n    // This must be from a constant/uniform.\n    // {x___} =  8.0/screenWidthInPixels  \n    // {_y__} =  8.0/screenHeightInPixels\n    // {__z_} = -4.0/screenWidthInPixels  \n    // {___w} = -4.0/screenHeightInPixels \n    FxaaFloat4 fxaaConsole360RcpFrameOpt2,\n    //\n    // Only used on FXAA Quality.\n    // This used to be the FXAA_QUALITY__SUBPIX define.\n    // It is here now to allow easier tuning.\n    // Choose the amount of sub-pixel aliasing removal.\n    // This can effect sharpness.\n    //   1.00 - upper limit (softer)\n    //   0.75 - default amount of filtering\n    //   0.50 - lower limit (sharper, less sub-pixel aliasing removal)\n    //   0.25 - almost off\n    //   0.00 - completely off\n    FxaaFloat fxaaQualitySubpix,\n    //\n    // Only used on FXAA Quality.\n    // This used to be the FXAA_QUALITY__EDGE_THRESHOLD define.\n    // It is here now to allow easier tuning.\n    // The minimum amount of local contrast required to apply algorithm.\n    //   0.333 - too little (faster)\n    //   0.250 - low quality\n    //   0.166 - default\n    //   0.125 - high quality \n    //   0.063 - overkill (slower)\n    FxaaFloat fxaaQualityEdgeThreshold,\n    //\n    // Only used on FXAA Quality.\n    // This used to be the FXAA_QUALITY__EDGE_THRESHOLD_MIN define.\n    // It is here now to allow easier tuning.\n    // Trims the algorithm from processing darks.\n    //   0.0833 - upper limit (default, the start of visible unfiltered edges)\n    //   0.0625 - high quality (faster)\n    //   0.0312 - visible limit (slower)\n    // Special notes when using FXAA_GREEN_AS_LUMA,\n    //   Likely want to set this to zero.\n    //   As colors that are mostly not-green\n    //   will appear very dark in the green channel!\n    //   Tune by looking at mostly non-green content,\n    //   then start at zero and increase until aliasing is a problem.\n    FxaaFloat fxaaQualityEdgeThresholdMin,\n    // \n    // Only used on FXAA Console.\n    // This used to be the FXAA_CONSOLE__EDGE_SHARPNESS define.\n    // It is here now to allow easier tuning.\n    // This does not effect PS3, as this needs to be compiled in.\n    //   Use FXAA_CONSOLE__PS3_EDGE_SHARPNESS for PS3.\n    //   Due to the PS3 being ALU bound,\n    //   there are only three safe values here: 2 and 4 and 8.\n    //   These options use the shaders ability to a free *|/ by 2|4|8.\n    // For all other platforms can be a non-power of two.\n    //   8.0 is sharper (default!!!)\n    //   4.0 is softer\n    //   2.0 is really soft (good only for vector graphics inputs)\n    FxaaFloat fxaaConsoleEdgeSharpness,\n    //\n    // Only used on FXAA Console.\n    // This used to be the FXAA_CONSOLE__EDGE_THRESHOLD define.\n    // It is here now to allow easier tuning.\n    // This does not effect PS3, as this needs to be compiled in.\n    //   Use FXAA_CONSOLE__PS3_EDGE_THRESHOLD for PS3.\n    //   Due to the PS3 being ALU bound,\n    //   there are only two safe values here: 1/4 and 1/8.\n    //   These options use the shaders ability to a free *|/ by 2|4|8.\n    // The console setting has a different mapping than the quality setting.\n    // Other platforms can use other values.\n    //   0.125 leaves less aliasing, but is softer (default!!!)\n    //   0.25 leaves more aliasing, and is sharper\n    FxaaFloat fxaaConsoleEdgeThreshold,\n    //\n    // Only used on FXAA Console.\n    // This used to be the FXAA_CONSOLE__EDGE_THRESHOLD_MIN define.\n    // It is here now to allow easier tuning.\n    // Trims the algorithm from processing darks.\n    // The console setting has a different mapping than the quality setting.\n    // This only applies when FXAA_EARLY_EXIT is 1.\n    // This does not apply to PS3, \n    // PS3 was simplified to avoid more shader instructions.\n    //   0.06 - faster but more aliasing in darks\n    //   0.05 - default\n    //   0.04 - slower and less aliasing in darks\n    // Special notes when using FXAA_GREEN_AS_LUMA,\n    //   Likely want to set this to zero.\n    //   As colors that are mostly not-green\n    //   will appear very dark in the green channel!\n    //   Tune by looking at mostly non-green content,\n    //   then start at zero and increase until aliasing is a problem.\n    FxaaFloat fxaaConsoleEdgeThresholdMin,\n    //    \n    // Extra constants for 360 FXAA Console only.\n    // Use zeros or anything else for other platforms.\n    // These must be in physical constant registers and NOT immedates.\n    // Immedates will result in compiler un-optimizing.\n    // {xyzw} = float4(1.0, -1.0, 0.25, -0.25)\n    FxaaFloat4 fxaaConsole360ConstDir\n) {\n/*--------------------------------------------------------------------------*/\n    FxaaFloat2 posM;\n    posM.x = pos.x;\n    posM.y = pos.y;\n    #if (FXAA_GATHER4_ALPHA == 1)\n        #if (FXAA_DISCARD == 0)\n            FxaaFloat4 rgbyM = FxaaTexTop(tex, posM);\n            #if (FXAA_GREEN_AS_LUMA == 0)\n                #define lumaM rgbyM.w\n            #else\n                #define lumaM rgbyM.y\n            #endif\n        #endif\n        #if (FXAA_GREEN_AS_LUMA == 0)\n            FxaaFloat4 luma4A = FxaaTexAlpha4(tex, posM);\n            FxaaFloat4 luma4B = FxaaTexOffAlpha4(tex, posM, FxaaInt2(-1, -1));\n        #else\n            FxaaFloat4 luma4A = FxaaTexGreen4(tex, posM);\n            FxaaFloat4 luma4B = FxaaTexOffGreen4(tex, posM, FxaaInt2(-1, -1));\n        #endif\n        #if (FXAA_DISCARD == 1)\n            #define lumaM luma4A.w\n        #endif\n        #define lumaE luma4A.z\n        #define lumaS luma4A.x\n        #define lumaSE luma4A.y\n        #define lumaNW luma4B.w\n        #define lumaN luma4B.z\n        #define lumaW luma4B.x\n    #else\n        FxaaFloat4 rgbyM = FxaaTexTop(tex, posM);\n        #if (FXAA_GREEN_AS_LUMA == 0)\n            #define lumaM rgbyM.w\n        #else\n            #define lumaM rgbyM.y\n        #endif\n        FxaaFloat lumaS = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 0, 1), fxaaQualityRcpFrame.xy));\n        FxaaFloat lumaE = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 1, 0), fxaaQualityRcpFrame.xy));\n        FxaaFloat lumaN = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 0,-1), fxaaQualityRcpFrame.xy));\n        FxaaFloat lumaW = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(-1, 0), fxaaQualityRcpFrame.xy));\n    #endif\n/*--------------------------------------------------------------------------*/\n    FxaaFloat maxSM = max(lumaS, lumaM);\n    FxaaFloat minSM = min(lumaS, lumaM);\n    FxaaFloat maxESM = max(lumaE, maxSM);\n    FxaaFloat minESM = min(lumaE, minSM);\n    FxaaFloat maxWN = max(lumaN, lumaW);\n    FxaaFloat minWN = min(lumaN, lumaW);\n    FxaaFloat rangeMax = max(maxWN, maxESM);\n    FxaaFloat rangeMin = min(minWN, minESM);\n    FxaaFloat rangeMaxScaled = rangeMax * fxaaQualityEdgeThreshold;\n    FxaaFloat range = rangeMax - rangeMin;\n    FxaaFloat rangeMaxClamped = max(fxaaQualityEdgeThresholdMin, rangeMaxScaled);\n    FxaaBool earlyExit = range < rangeMaxClamped;\n/*--------------------------------------------------------------------------*/\n    if(earlyExit)\n        #if (FXAA_DISCARD == 1)\n            FxaaDiscard;\n        #else\n            return rgbyM;\n        #endif\n/*--------------------------------------------------------------------------*/\n    #if (FXAA_GATHER4_ALPHA == 0)\n        FxaaFloat lumaNW = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(-1,-1), fxaaQualityRcpFrame.xy));\n        FxaaFloat lumaSE = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 1, 1), fxaaQualityRcpFrame.xy));\n        FxaaFloat lumaNE = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2( 1,-1), fxaaQualityRcpFrame.xy));\n        FxaaFloat lumaSW = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(-1, 1), fxaaQualityRcpFrame.xy));\n    #else\n        FxaaFloat lumaNE = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(1, -1), fxaaQualityRcpFrame.xy));\n        FxaaFloat lumaSW = FxaaLuma(FxaaTexOff(tex, posM, FxaaInt2(-1, 1), fxaaQualityRcpFrame.xy));\n    #endif\n/*--------------------------------------------------------------------------*/\n    FxaaFloat lumaNS = lumaN + lumaS;\n    FxaaFloat lumaWE = lumaW + lumaE;\n    FxaaFloat subpixRcpRange = 1.0/range;\n    FxaaFloat subpixNSWE = lumaNS + lumaWE;\n    FxaaFloat edgeHorz1 = (-2.0 * lumaM) + lumaNS;\n    FxaaFloat edgeVert1 = (-2.0 * lumaM) + lumaWE;\n/*--------------------------------------------------------------------------*/\n    FxaaFloat lumaNESE = lumaNE + lumaSE;\n    FxaaFloat lumaNWNE = lumaNW + lumaNE;\n    FxaaFloat edgeHorz2 = (-2.0 * lumaE) + lumaNESE;\n    FxaaFloat edgeVert2 = (-2.0 * lumaN) + lumaNWNE;\n/*--------------------------------------------------------------------------*/\n    FxaaFloat lumaNWSW = lumaNW + lumaSW;\n    FxaaFloat lumaSWSE = lumaSW + lumaSE;\n    FxaaFloat edgeHorz4 = (abs(edgeHorz1) * 2.0) + abs(edgeHorz2);\n    FxaaFloat edgeVert4 = (abs(edgeVert1) * 2.0) + abs(edgeVert2);\n    FxaaFloat edgeHorz3 = (-2.0 * lumaW) + lumaNWSW;\n    FxaaFloat edgeVert3 = (-2.0 * lumaS) + lumaSWSE;\n    FxaaFloat edgeHorz = abs(edgeHorz3) + edgeHorz4;\n    FxaaFloat edgeVert = abs(edgeVert3) + edgeVert4;\n/*--------------------------------------------------------------------------*/\n    FxaaFloat subpixNWSWNESE = lumaNWSW + lumaNESE;\n    FxaaFloat lengthSign = fxaaQualityRcpFrame.x;\n    FxaaBool horzSpan = edgeHorz >= edgeVert;\n    FxaaFloat subpixA = subpixNSWE * 2.0 + subpixNWSWNESE;\n/*--------------------------------------------------------------------------*/\n    if(!horzSpan) lumaN = lumaW;\n    if(!horzSpan) lumaS = lumaE;\n    if(horzSpan) lengthSign = fxaaQualityRcpFrame.y;\n    FxaaFloat subpixB = (subpixA * (1.0/12.0)) - lumaM;\n/*--------------------------------------------------------------------------*/\n    FxaaFloat gradientN = lumaN - lumaM;\n    FxaaFloat gradientS = lumaS - lumaM;\n    FxaaFloat lumaNN = lumaN + lumaM;\n    FxaaFloat lumaSS = lumaS + lumaM;\n    FxaaBool pairN = abs(gradientN) >= abs(gradientS);\n    FxaaFloat gradient = max(abs(gradientN), abs(gradientS));\n    if(pairN) lengthSign = -lengthSign;\n    FxaaFloat subpixC = FxaaSat(abs(subpixB) * subpixRcpRange);\n/*--------------------------------------------------------------------------*/\n    FxaaFloat2 posB;\n    posB.x = posM.x;\n    posB.y = posM.y;\n    FxaaFloat2 offNP;\n    offNP.x = (!horzSpan) ? 0.0 : fxaaQualityRcpFrame.x;\n    offNP.y = ( horzSpan) ? 0.0 : fxaaQualityRcpFrame.y;\n    if(!horzSpan) posB.x += lengthSign * 0.5;\n    if( horzSpan) posB.y += lengthSign * 0.5;\n/*--------------------------------------------------------------------------*/\n    FxaaFloat2 posN;\n    posN.x = posB.x - offNP.x * FXAA_QUALITY__P0;\n    posN.y = posB.y - offNP.y * FXAA_QUALITY__P0;\n    FxaaFloat2 posP;\n    posP.x = posB.x + offNP.x * FXAA_QUALITY__P0;\n    posP.y = posB.y + offNP.y * FXAA_QUALITY__P0;\n    FxaaFloat subpixD = ((-2.0)*subpixC) + 3.0;\n    FxaaFloat lumaEndN = FxaaLuma(FxaaTexTop(tex, posN));\n    FxaaFloat subpixE = subpixC * subpixC;\n    FxaaFloat lumaEndP = FxaaLuma(FxaaTexTop(tex, posP));\n/*--------------------------------------------------------------------------*/\n    if(!pairN) lumaNN = lumaSS;\n    FxaaFloat gradientScaled = gradient * 1.0/4.0;\n    FxaaFloat lumaMM = lumaM - lumaNN * 0.5;\n    FxaaFloat subpixF = subpixD * subpixE;\n    FxaaBool lumaMLTZero = lumaMM < 0.0;\n/*--------------------------------------------------------------------------*/\n    lumaEndN -= lumaNN * 0.5;\n    lumaEndP -= lumaNN * 0.5;\n    FxaaBool doneN = abs(lumaEndN) >= gradientScaled;\n    FxaaBool doneP = abs(lumaEndP) >= gradientScaled;\n    if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P1;\n    if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P1;\n    FxaaBool doneNP = (!doneN) || (!doneP);\n    if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P1;\n    if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P1;\n/*--------------------------------------------------------------------------*/\n    if(doneNP) {\n        if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));\n        if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));\n        if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\n        if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\n        doneN = abs(lumaEndN) >= gradientScaled;\n        doneP = abs(lumaEndP) >= gradientScaled;\n        if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P2;\n        if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P2;\n        doneNP = (!doneN) || (!doneP);\n        if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P2;\n        if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P2;\n/*--------------------------------------------------------------------------*/\n        #if (FXAA_QUALITY__PS > 3)\n        if(doneNP) {\n            if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));\n            if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));\n            if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\n            if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\n            doneN = abs(lumaEndN) >= gradientScaled;\n            doneP = abs(lumaEndP) >= gradientScaled;\n            if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P3;\n            if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P3;\n            doneNP = (!doneN) || (!doneP);\n            if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P3;\n            if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P3;\n/*--------------------------------------------------------------------------*/\n            #if (FXAA_QUALITY__PS > 4)\n            if(doneNP) {\n                if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));\n                if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));\n                if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\n                if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\n                doneN = abs(lumaEndN) >= gradientScaled;\n                doneP = abs(lumaEndP) >= gradientScaled;\n                if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P4;\n                if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P4;\n                doneNP = (!doneN) || (!doneP);\n                if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P4;\n                if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P4;\n/*--------------------------------------------------------------------------*/\n                #if (FXAA_QUALITY__PS > 5)\n                if(doneNP) {\n                    if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));\n                    if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));\n                    if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\n                    if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\n                    doneN = abs(lumaEndN) >= gradientScaled;\n                    doneP = abs(lumaEndP) >= gradientScaled;\n                    if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P5;\n                    if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P5;\n                    doneNP = (!doneN) || (!doneP);\n                    if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P5;\n                    if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P5;\n/*--------------------------------------------------------------------------*/\n                    #if (FXAA_QUALITY__PS > 6)\n                    if(doneNP) {\n                        if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));\n                        if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));\n                        if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\n                        if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\n                        doneN = abs(lumaEndN) >= gradientScaled;\n                        doneP = abs(lumaEndP) >= gradientScaled;\n                        if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P6;\n                        if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P6;\n                        doneNP = (!doneN) || (!doneP);\n                        if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P6;\n                        if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P6;\n/*--------------------------------------------------------------------------*/\n                        #if (FXAA_QUALITY__PS > 7)\n                        if(doneNP) {\n                            if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));\n                            if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));\n                            if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\n                            if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\n                            doneN = abs(lumaEndN) >= gradientScaled;\n                            doneP = abs(lumaEndP) >= gradientScaled;\n                            if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P7;\n                            if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P7;\n                            doneNP = (!doneN) || (!doneP);\n                            if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P7;\n                            if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P7;\n/*--------------------------------------------------------------------------*/\n    #if (FXAA_QUALITY__PS > 8)\n    if(doneNP) {\n        if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));\n        if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));\n        if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\n        if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\n        doneN = abs(lumaEndN) >= gradientScaled;\n        doneP = abs(lumaEndP) >= gradientScaled;\n        if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P8;\n        if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P8;\n        doneNP = (!doneN) || (!doneP);\n        if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P8;\n        if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P8;\n/*--------------------------------------------------------------------------*/\n        #if (FXAA_QUALITY__PS > 9)\n        if(doneNP) {\n            if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));\n            if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));\n            if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\n            if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\n            doneN = abs(lumaEndN) >= gradientScaled;\n            doneP = abs(lumaEndP) >= gradientScaled;\n            if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P9;\n            if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P9;\n            doneNP = (!doneN) || (!doneP);\n            if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P9;\n            if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P9;\n/*--------------------------------------------------------------------------*/\n            #if (FXAA_QUALITY__PS > 10)\n            if(doneNP) {\n                if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));\n                if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));\n                if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\n                if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\n                doneN = abs(lumaEndN) >= gradientScaled;\n                doneP = abs(lumaEndP) >= gradientScaled;\n                if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P10;\n                if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P10;\n                doneNP = (!doneN) || (!doneP);\n                if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P10;\n                if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P10;\n/*--------------------------------------------------------------------------*/\n                #if (FXAA_QUALITY__PS > 11)\n                if(doneNP) {\n                    if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));\n                    if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));\n                    if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\n                    if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\n                    doneN = abs(lumaEndN) >= gradientScaled;\n                    doneP = abs(lumaEndP) >= gradientScaled;\n                    if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P11;\n                    if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P11;\n                    doneNP = (!doneN) || (!doneP);\n                    if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P11;\n                    if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P11;\n/*--------------------------------------------------------------------------*/\n                    #if (FXAA_QUALITY__PS > 12)\n                    if(doneNP) {\n                        if(!doneN) lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy));\n                        if(!doneP) lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy));\n                        if(!doneN) lumaEndN = lumaEndN - lumaNN * 0.5;\n                        if(!doneP) lumaEndP = lumaEndP - lumaNN * 0.5;\n                        doneN = abs(lumaEndN) >= gradientScaled;\n                        doneP = abs(lumaEndP) >= gradientScaled;\n                        if(!doneN) posN.x -= offNP.x * FXAA_QUALITY__P12;\n                        if(!doneN) posN.y -= offNP.y * FXAA_QUALITY__P12;\n                        doneNP = (!doneN) || (!doneP);\n                        if(!doneP) posP.x += offNP.x * FXAA_QUALITY__P12;\n                        if(!doneP) posP.y += offNP.y * FXAA_QUALITY__P12;\n/*--------------------------------------------------------------------------*/\n                    }\n                    #endif\n/*--------------------------------------------------------------------------*/\n                }\n                #endif\n/*--------------------------------------------------------------------------*/\n            }\n            #endif\n/*--------------------------------------------------------------------------*/\n        }\n        #endif\n/*--------------------------------------------------------------------------*/\n    }\n    #endif\n/*--------------------------------------------------------------------------*/\n                        }\n                        #endif\n/*--------------------------------------------------------------------------*/\n                    }\n                    #endif\n/*--------------------------------------------------------------------------*/\n                }\n                #endif\n/*--------------------------------------------------------------------------*/\n            }\n            #endif\n/*--------------------------------------------------------------------------*/\n        }\n        #endif\n/*--------------------------------------------------------------------------*/\n    }\n/*--------------------------------------------------------------------------*/\n    FxaaFloat dstN = posM.x - posN.x;\n    FxaaFloat dstP = posP.x - posM.x;\n    if(!horzSpan) dstN = posM.y - posN.y;\n    if(!horzSpan) dstP = posP.y - posM.y;\n/*--------------------------------------------------------------------------*/\n    FxaaBool goodSpanN = (lumaEndN < 0.0) != lumaMLTZero;\n    FxaaFloat spanLength = (dstP + dstN);\n    FxaaBool goodSpanP = (lumaEndP < 0.0) != lumaMLTZero;\n    FxaaFloat spanLengthRcp = 1.0/spanLength;\n/*--------------------------------------------------------------------------*/\n    FxaaBool directionN = dstN < dstP;\n    FxaaFloat dst = min(dstN, dstP);\n    FxaaBool goodSpan = directionN ? goodSpanN : goodSpanP;\n    FxaaFloat subpixG = subpixF * subpixF;\n    FxaaFloat pixelOffset = (dst * (-spanLengthRcp)) + 0.5;\n    FxaaFloat subpixH = subpixG * fxaaQualitySubpix;\n/*--------------------------------------------------------------------------*/\n    FxaaFloat pixelOffsetGood = goodSpan ? pixelOffset : 0.0;\n    FxaaFloat pixelOffsetSubpix = max(pixelOffsetGood, subpixH);\n    if(!horzSpan) posM.x += pixelOffsetSubpix * lengthSign;\n    if( horzSpan) posM.y += pixelOffsetSubpix * lengthSign;\n    #if (FXAA_DISCARD == 1)\n        return FxaaTexTop(tex, posM);\n    #else\n        return FxaaFloat4(FxaaTexTop(tex, posM).xyz, lumaM);\n    #endif\n}\n/*==========================================================================*/\n#endif\n\n\n\n\n/*============================================================================\n\n                         FXAA3 CONSOLE - PC VERSION\n                         \n------------------------------------------------------------------------------\nInstead of using this on PC, I'd suggest just using FXAA Quality with\n    #define FXAA_QUALITY__PRESET 10\nOr \n    #define FXAA_QUALITY__PRESET 20\nEither are higher qualilty and almost as fast as this on modern PC GPUs.\n============================================================================*/\n#if (FXAA_PC_CONSOLE == 1)\n/*--------------------------------------------------------------------------*/\nFxaaFloat4 FxaaPixelShader(\n    // See FXAA Quality FxaaPixelShader() source for docs on Inputs!\n    FxaaFloat2 pos,\n    FxaaFloat4 fxaaConsolePosPos,\n    FxaaTex tex,\n    FxaaTex fxaaConsole360TexExpBiasNegOne,\n    FxaaTex fxaaConsole360TexExpBiasNegTwo,\n    FxaaFloat2 fxaaQualityRcpFrame,\n    FxaaFloat4 fxaaConsoleRcpFrameOpt,\n    FxaaFloat4 fxaaConsoleRcpFrameOpt2,\n    FxaaFloat4 fxaaConsole360RcpFrameOpt2,\n    FxaaFloat fxaaQualitySubpix,\n    FxaaFloat fxaaQualityEdgeThreshold,\n    FxaaFloat fxaaQualityEdgeThresholdMin,\n    FxaaFloat fxaaConsoleEdgeSharpness,\n    FxaaFloat fxaaConsoleEdgeThreshold,\n    FxaaFloat fxaaConsoleEdgeThresholdMin,\n    FxaaFloat4 fxaaConsole360ConstDir\n) {\n/*--------------------------------------------------------------------------*/\n    FxaaFloat lumaNw = FxaaLuma(FxaaTexTop(tex, fxaaConsolePosPos.xy));\n    FxaaFloat lumaSw = FxaaLuma(FxaaTexTop(tex, fxaaConsolePosPos.xw));\n    FxaaFloat lumaNe = FxaaLuma(FxaaTexTop(tex, fxaaConsolePosPos.zy));\n    FxaaFloat lumaSe = FxaaLuma(FxaaTexTop(tex, fxaaConsolePosPos.zw));\n/*--------------------------------------------------------------------------*/\n    FxaaFloat4 rgbyM = FxaaTexTop(tex, pos.xy);\n    #if (FXAA_GREEN_AS_LUMA == 0)\n        FxaaFloat lumaM = rgbyM.w;\n    #else\n        FxaaFloat lumaM = rgbyM.y;\n    #endif\n/*--------------------------------------------------------------------------*/\n    FxaaFloat lumaMaxNwSw = max(lumaNw, lumaSw);\n    lumaNe += 1.0/384.0;\n    FxaaFloat lumaMinNwSw = min(lumaNw, lumaSw);\n/*--------------------------------------------------------------------------*/\n    FxaaFloat lumaMaxNeSe = max(lumaNe, lumaSe);\n    FxaaFloat lumaMinNeSe = min(lumaNe, lumaSe);\n/*--------------------------------------------------------------------------*/\n    FxaaFloat lumaMax = max(lumaMaxNeSe, lumaMaxNwSw);\n    FxaaFloat lumaMin = min(lumaMinNeSe, lumaMinNwSw);\n/*--------------------------------------------------------------------------*/\n    FxaaFloat lumaMaxScaled = lumaMax * fxaaConsoleEdgeThreshold;\n/*--------------------------------------------------------------------------*/\n    FxaaFloat lumaMinM = min(lumaMin, lumaM);\n    FxaaFloat lumaMaxScaledClamped = max(fxaaConsoleEdgeThresholdMin, lumaMaxScaled);\n    FxaaFloat lumaMaxM = max(lumaMax, lumaM);\n    FxaaFloat dirSwMinusNe = lumaSw - lumaNe;\n    FxaaFloat lumaMaxSubMinM = lumaMaxM - lumaMinM;\n    FxaaFloat dirSeMinusNw = lumaSe - lumaNw;\n    if(lumaMaxSubMinM < lumaMaxScaledClamped) return rgbyM;\n/*--------------------------------------------------------------------------*/\n    FxaaFloat2 dir;\n    dir.x = dirSwMinusNe + dirSeMinusNw;\n    dir.y = dirSwMinusNe - dirSeMinusNw;\n/*--------------------------------------------------------------------------*/\n    FxaaFloat2 dir1 = normalize(dir.xy);\n    FxaaFloat4 rgbyN1 = FxaaTexTop(tex, pos.xy - dir1 * fxaaConsoleRcpFrameOpt.zw);\n    FxaaFloat4 rgbyP1 = FxaaTexTop(tex, pos.xy + dir1 * fxaaConsoleRcpFrameOpt.zw);\n/*--------------------------------------------------------------------------*/\n    FxaaFloat dirAbsMinTimesC = min(abs(dir1.x), abs(dir1.y)) * fxaaConsoleEdgeSharpness;\n    FxaaFloat2 dir2 = clamp(dir1.xy / dirAbsMinTimesC, -2.0, 2.0);\n/*--------------------------------------------------------------------------*/\n    FxaaFloat4 rgbyN2 = FxaaTexTop(tex, pos.xy - dir2 * fxaaConsoleRcpFrameOpt2.zw);\n    FxaaFloat4 rgbyP2 = FxaaTexTop(tex, pos.xy + dir2 * fxaaConsoleRcpFrameOpt2.zw);\n/*--------------------------------------------------------------------------*/\n    FxaaFloat4 rgbyA = rgbyN1 + rgbyP1;\n    FxaaFloat4 rgbyB = ((rgbyN2 + rgbyP2) * 0.25) + (rgbyA * 0.25);\n/*--------------------------------------------------------------------------*/\n    #if (FXAA_GREEN_AS_LUMA == 0)\n        FxaaBool twoTap = (rgbyB.w < lumaMin) || (rgbyB.w > lumaMax);\n    #else\n        FxaaBool twoTap = (rgbyB.y < lumaMin) || (rgbyB.y > lumaMax);\n    #endif\n    if(twoTap) rgbyB.xyz = rgbyA.xyz * 0.5;\n    return rgbyB; }\n/*==========================================================================*/\n#endif\n\n\n\n/*============================================================================\n\n                      FXAA3 CONSOLE - 360 PIXEL SHADER \n\n------------------------------------------------------------------------------\nThis optimized version thanks to suggestions from Andy Luedke.\nShould be fully tex bound in all cases.\nAs of the FXAA 3.11 release, I have still not tested this code,\nhowever I fixed a bug which was in both FXAA 3.9 and FXAA 3.10.\nAnd note this is replacing the old unoptimized version.\nIf it does not work, please let me know so I can fix it.\n============================================================================*/\n#if (FXAA_360 == 1)\n/*--------------------------------------------------------------------------*/\n[reduceTempRegUsage(4)]\nfloat4 FxaaPixelShader(\n    // See FXAA Quality FxaaPixelShader() source for docs on Inputs!\n    FxaaFloat2 pos,\n    FxaaFloat4 fxaaConsolePosPos,\n    FxaaTex tex,\n    FxaaTex fxaaConsole360TexExpBiasNegOne,\n    FxaaTex fxaaConsole360TexExpBiasNegTwo,\n    FxaaFloat2 fxaaQualityRcpFrame,\n    FxaaFloat4 fxaaConsoleRcpFrameOpt,\n    FxaaFloat4 fxaaConsoleRcpFrameOpt2,\n    FxaaFloat4 fxaaConsole360RcpFrameOpt2,\n    FxaaFloat fxaaQualitySubpix,\n    FxaaFloat fxaaQualityEdgeThreshold,\n    FxaaFloat fxaaQualityEdgeThresholdMin,\n    FxaaFloat fxaaConsoleEdgeSharpness,\n    FxaaFloat fxaaConsoleEdgeThreshold,\n    FxaaFloat fxaaConsoleEdgeThresholdMin,\n    FxaaFloat4 fxaaConsole360ConstDir\n) {\n/*--------------------------------------------------------------------------*/\n    float4 lumaNwNeSwSe;\n    #if (FXAA_GREEN_AS_LUMA == 0)\n        asm { \n            tfetch2D lumaNwNeSwSe.w___, tex, pos.xy, OffsetX = -0.5, OffsetY = -0.5, UseComputedLOD=false\n            tfetch2D lumaNwNeSwSe._w__, tex, pos.xy, OffsetX =  0.5, OffsetY = -0.5, UseComputedLOD=false\n            tfetch2D lumaNwNeSwSe.__w_, tex, pos.xy, OffsetX = -0.5, OffsetY =  0.5, UseComputedLOD=false\n            tfetch2D lumaNwNeSwSe.___w, tex, pos.xy, OffsetX =  0.5, OffsetY =  0.5, UseComputedLOD=false\n        };\n    #else\n        asm { \n            tfetch2D lumaNwNeSwSe.y___, tex, pos.xy, OffsetX = -0.5, OffsetY = -0.5, UseComputedLOD=false\n            tfetch2D lumaNwNeSwSe._y__, tex, pos.xy, OffsetX =  0.5, OffsetY = -0.5, UseComputedLOD=false\n            tfetch2D lumaNwNeSwSe.__y_, tex, pos.xy, OffsetX = -0.5, OffsetY =  0.5, UseComputedLOD=false\n            tfetch2D lumaNwNeSwSe.___y, tex, pos.xy, OffsetX =  0.5, OffsetY =  0.5, UseComputedLOD=false\n        };\n    #endif\n/*--------------------------------------------------------------------------*/\n    lumaNwNeSwSe.y += 1.0/384.0;\n    float2 lumaMinTemp = min(lumaNwNeSwSe.xy, lumaNwNeSwSe.zw);\n    float2 lumaMaxTemp = max(lumaNwNeSwSe.xy, lumaNwNeSwSe.zw);\n    float lumaMin = min(lumaMinTemp.x, lumaMinTemp.y);\n    float lumaMax = max(lumaMaxTemp.x, lumaMaxTemp.y);\n/*--------------------------------------------------------------------------*/\n    float4 rgbyM = tex2Dlod(tex, float4(pos.xy, 0.0, 0.0));\n    #if (FXAA_GREEN_AS_LUMA == 0)\n        float lumaMinM = min(lumaMin, rgbyM.w);\n        float lumaMaxM = max(lumaMax, rgbyM.w);\n    #else\n        float lumaMinM = min(lumaMin, rgbyM.y);\n        float lumaMaxM = max(lumaMax, rgbyM.y);\n    #endif        \n    if((lumaMaxM - lumaMinM) < max(fxaaConsoleEdgeThresholdMin, lumaMax * fxaaConsoleEdgeThreshold)) return rgbyM;\n/*--------------------------------------------------------------------------*/\n    float2 dir;\n    dir.x = dot(lumaNwNeSwSe, fxaaConsole360ConstDir.yyxx);\n    dir.y = dot(lumaNwNeSwSe, fxaaConsole360ConstDir.xyxy);\n    dir = normalize(dir);\n/*--------------------------------------------------------------------------*/\n    float4 dir1 = dir.xyxy * fxaaConsoleRcpFrameOpt.xyzw;\n/*--------------------------------------------------------------------------*/\n    float4 dir2;\n    float dirAbsMinTimesC = min(abs(dir.x), abs(dir.y)) * fxaaConsoleEdgeSharpness;\n    dir2 = saturate(fxaaConsole360ConstDir.zzww * dir.xyxy / dirAbsMinTimesC + 0.5);\n    dir2 = dir2 * fxaaConsole360RcpFrameOpt2.xyxy + fxaaConsole360RcpFrameOpt2.zwzw;\n/*--------------------------------------------------------------------------*/\n    float4 rgbyN1 = tex2Dlod(fxaaConsole360TexExpBiasNegOne, float4(pos.xy + dir1.xy, 0.0, 0.0));\n    float4 rgbyP1 = tex2Dlod(fxaaConsole360TexExpBiasNegOne, float4(pos.xy + dir1.zw, 0.0, 0.0));\n    float4 rgbyN2 = tex2Dlod(fxaaConsole360TexExpBiasNegTwo, float4(pos.xy + dir2.xy, 0.0, 0.0));\n    float4 rgbyP2 = tex2Dlod(fxaaConsole360TexExpBiasNegTwo, float4(pos.xy + dir2.zw, 0.0, 0.0));\n/*--------------------------------------------------------------------------*/\n    float4 rgbyA = rgbyN1 + rgbyP1;\n    float4 rgbyB = rgbyN2 + rgbyP2 + rgbyA * 0.5;\n/*--------------------------------------------------------------------------*/\n    float4 rgbyR = ((FxaaLuma(rgbyB) - lumaMax) > 0.0) ? rgbyA : rgbyB; \n    rgbyR = ((FxaaLuma(rgbyB) - lumaMin) > 0.0) ? rgbyR : rgbyA; \n    return rgbyR; }\n/*==========================================================================*/\n#endif\n\n\n\n/*============================================================================\n\n         FXAA3 CONSOLE - OPTIMIZED PS3 PIXEL SHADER (NO EARLY EXIT)\n\n==============================================================================\nThe code below does not exactly match the assembly.\nI have a feeling that 12 cycles is possible, but was not able to get there.\nMight have to increase register count to get full performance.\nNote this shader does not use perspective interpolation.\n\nUse the following cgc options,\n\n  --fenable-bx2 --fastmath --fastprecision --nofloatbindings\n\n------------------------------------------------------------------------------\n                             NVSHADERPERF OUTPUT\n------------------------------------------------------------------------------\nFor reference and to aid in debug, output of NVShaderPerf should match this,\n\nShader to schedule:\n  0: texpkb h0.w(TRUE), v5.zyxx, #0\n  2: addh h2.z(TRUE), h0.w, constant(0.001953, 0.000000, 0.000000, 0.000000).x\n  4: texpkb h0.w(TRUE), v5.xwxx, #0\n  6: addh h0.z(TRUE), -h2, h0.w\n  7: texpkb h1.w(TRUE), v5, #0\n  9: addh h0.x(TRUE), h0.z, -h1.w\n 10: addh h3.w(TRUE), h0.z, h1\n 11: texpkb h2.w(TRUE), v5.zwzz, #0\n 13: addh h0.z(TRUE), h3.w, -h2.w\n 14: addh h0.x(TRUE), h2.w, h0\n 15: nrmh h1.xz(TRUE), h0_n\n 16: minh_m8 h0.x(TRUE), |h1|, |h1.z|\n 17: maxh h4.w(TRUE), h0, h1\n 18: divx h2.xy(TRUE), h1_n.xzzw, h0_n\n 19: movr r1.zw(TRUE), v4.xxxy\n 20: madr r2.xz(TRUE), -h1, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).zzww, r1.zzww\n 22: minh h5.w(TRUE), h0, h1\n 23: texpkb h0(TRUE), r2.xzxx, #0\n 25: madr r0.zw(TRUE), h1.xzxz, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w), r1\n 27: maxh h4.x(TRUE), h2.z, h2.w\n 28: texpkb h1(TRUE), r0.zwzz, #0\n 30: addh_d2 h1(TRUE), h0, h1\n 31: madr r0.xy(TRUE), -h2, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).xyxx, r1.zwzz\n 33: texpkb h0(TRUE), r0, #0\n 35: minh h4.z(TRUE), h2, h2.w\n 36: fenct TRUE\n 37: madr r1.xy(TRUE), h2, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).xyxx, r1.zwzz\n 39: texpkb h2(TRUE), r1, #0\n 41: addh_d2 h0(TRUE), h0, h2\n 42: maxh h2.w(TRUE), h4, h4.x\n 43: minh h2.x(TRUE), h5.w, h4.z\n 44: addh_d2 h0(TRUE), h0, h1\n 45: slth h2.x(TRUE), h0.w, h2\n 46: sgth h2.w(TRUE), h0, h2\n 47: movh h0(TRUE), h0\n 48: addx.c0 rc(TRUE), h2, h2.w\n 49: movh h0(c0.NE.x), h1\n\nIPU0 ------ Simplified schedule: --------\nPass |  Unit  |  uOp |  PC:  Op\n-----+--------+------+-------------------------\n   1 | SCT0/1 |  mov |   0:  TXLr h0.w, g[TEX1].zyxx, const.xxxx, TEX0;\n     |    TEX |  txl |   0:  TXLr h0.w, g[TEX1].zyxx, const.xxxx, TEX0;\n     |   SCB1 |  add |   2:  ADDh h2.z, h0.--w-, const.--x-;\n     |        |      |\n   2 | SCT0/1 |  mov |   4:  TXLr h0.w, g[TEX1].xwxx, const.xxxx, TEX0;\n     |    TEX |  txl |   4:  TXLr h0.w, g[TEX1].xwxx, const.xxxx, TEX0;\n     |   SCB1 |  add |   6:  ADDh h0.z,-h2, h0.--w-;\n     |        |      |\n   3 | SCT0/1 |  mov |   7:  TXLr h1.w, g[TEX1], const.xxxx, TEX0;\n     |    TEX |  txl |   7:  TXLr h1.w, g[TEX1], const.xxxx, TEX0;\n     |   SCB0 |  add |   9:  ADDh h0.x, h0.z---,-h1.w---;\n     |   SCB1 |  add |  10:  ADDh h3.w, h0.---z, h1;\n     |        |      |\n   4 | SCT0/1 |  mov |  11:  TXLr h2.w, g[TEX1].zwzz, const.xxxx, TEX0;\n     |    TEX |  txl |  11:  TXLr h2.w, g[TEX1].zwzz, const.xxxx, TEX0;\n     |   SCB0 |  add |  14:  ADDh h0.x, h2.w---, h0;\n     |   SCB1 |  add |  13:  ADDh h0.z, h3.--w-,-h2.--w-;\n     |        |      |\n   5 |   SCT1 |  mov |  15:  NRMh h1.xz, h0;\n     |    SRB |  nrm |  15:  NRMh h1.xz, h0;\n     |   SCB0 |  min |  16:  MINh*8 h0.x, |h1|, |h1.z---|;\n     |   SCB1 |  max |  17:  MAXh h4.w, h0, h1;\n     |        |      |\n   6 |   SCT0 |  div |  18:  DIVx h2.xy, h1.xz--, h0;\n     |   SCT1 |  mov |  19:  MOVr r1.zw, g[TEX0].--xy;\n     |   SCB0 |  mad |  20:  MADr r2.xz,-h1, const.z-w-, r1.z-w-;\n     |   SCB1 |  min |  22:  MINh h5.w, h0, h1;\n     |        |      |\n   7 | SCT0/1 |  mov |  23:  TXLr h0, r2.xzxx, const.xxxx, TEX0;\n     |    TEX |  txl |  23:  TXLr h0, r2.xzxx, const.xxxx, TEX0;\n     |   SCB0 |  max |  27:  MAXh h4.x, h2.z---, h2.w---;\n     |   SCB1 |  mad |  25:  MADr r0.zw, h1.--xz, const, r1;\n     |        |      |\n   8 | SCT0/1 |  mov |  28:  TXLr h1, r0.zwzz, const.xxxx, TEX0;\n     |    TEX |  txl |  28:  TXLr h1, r0.zwzz, const.xxxx, TEX0;\n     | SCB0/1 |  add |  30:  ADDh/2 h1, h0, h1;\n     |        |      |\n   9 |   SCT0 |  mad |  31:  MADr r0.xy,-h2, const.xy--, r1.zw--;\n     |   SCT1 |  mov |  33:  TXLr h0, r0, const.zzzz, TEX0;\n     |    TEX |  txl |  33:  TXLr h0, r0, const.zzzz, TEX0;\n     |   SCB1 |  min |  35:  MINh h4.z, h2, h2.--w-;\n     |        |      |\n  10 |   SCT0 |  mad |  37:  MADr r1.xy, h2, const.xy--, r1.zw--;\n     |   SCT1 |  mov |  39:  TXLr h2, r1, const.zzzz, TEX0;\n     |    TEX |  txl |  39:  TXLr h2, r1, const.zzzz, TEX0;\n     | SCB0/1 |  add |  41:  ADDh/2 h0, h0, h2;\n     |        |      |\n  11 |   SCT0 |  min |  43:  MINh h2.x, h5.w---, h4.z---;\n     |   SCT1 |  max |  42:  MAXh h2.w, h4, h4.---x;\n     | SCB0/1 |  add |  44:  ADDh/2 h0, h0, h1;\n     |        |      |\n  12 |   SCT0 |  set |  45:  SLTh h2.x, h0.w---, h2;\n     |   SCT1 |  set |  46:  SGTh h2.w, h0, h2;\n     | SCB0/1 |  mul |  47:  MOVh h0, h0;\n     |        |      |\n  13 |   SCT0 |  mad |  48:  ADDxc0_s rc, h2, h2.w---;\n     | SCB0/1 |  mul |  49:  MOVh h0(NE0.xxxx), h1;\n \nPass   SCT  TEX  SCB\n  1:   0% 100%  25%\n  2:   0% 100%  25%\n  3:   0% 100%  50%\n  4:   0% 100%  50%\n  5:   0%   0%  50%\n  6: 100%   0%  75%\n  7:   0% 100%  75%\n  8:   0% 100% 100%\n  9:   0% 100%  25%\n 10:   0% 100% 100%\n 11:  50%   0% 100%\n 12:  50%   0% 100%\n 13:  25%   0% 100%\n\nMEAN:  17%  61%  67%\n\nPass   SCT0  SCT1   TEX  SCB0  SCB1\n  1:    0%    0%  100%    0%  100%\n  2:    0%    0%  100%    0%  100%\n  3:    0%    0%  100%  100%  100%\n  4:    0%    0%  100%  100%  100%\n  5:    0%    0%    0%  100%  100%\n  6:  100%  100%    0%  100%  100%\n  7:    0%    0%  100%  100%  100%\n  8:    0%    0%  100%  100%  100%\n  9:    0%    0%  100%    0%  100%\n 10:    0%    0%  100%  100%  100%\n 11:  100%  100%    0%  100%  100%\n 12:  100%  100%    0%  100%  100%\n 13:  100%    0%    0%  100%  100%\n\nMEAN:   30%   23%   61%   76%  100%\nFragment Performance Setup: Driver RSX Compiler, GPU RSX, Flags 0x5\nResults 13 cycles, 3 r regs, 923,076,923 pixels/s\n============================================================================*/\n#if (FXAA_PS3 == 1) && (FXAA_EARLY_EXIT == 0)\n/*--------------------------------------------------------------------------*/\n#pragma regcount 7\n#pragma disablepc all\n#pragma option O3\n#pragma option OutColorPrec=fp16\n#pragma texformat default RGBA8\n/*==========================================================================*/\nhalf4 FxaaPixelShader(\n    // See FXAA Quality FxaaPixelShader() source for docs on Inputs!\n    FxaaFloat2 pos,\n    FxaaFloat4 fxaaConsolePosPos,\n    FxaaTex tex,\n    FxaaTex fxaaConsole360TexExpBiasNegOne,\n    FxaaTex fxaaConsole360TexExpBiasNegTwo,\n    FxaaFloat2 fxaaQualityRcpFrame,\n    FxaaFloat4 fxaaConsoleRcpFrameOpt,\n    FxaaFloat4 fxaaConsoleRcpFrameOpt2,\n    FxaaFloat4 fxaaConsole360RcpFrameOpt2,\n    FxaaFloat fxaaQualitySubpix,\n    FxaaFloat fxaaQualityEdgeThreshold,\n    FxaaFloat fxaaQualityEdgeThresholdMin,\n    FxaaFloat fxaaConsoleEdgeSharpness,\n    FxaaFloat fxaaConsoleEdgeThreshold,\n    FxaaFloat fxaaConsoleEdgeThresholdMin,\n    FxaaFloat4 fxaaConsole360ConstDir\n) {\n/*--------------------------------------------------------------------------*/\n// (1)\n    half4 dir;\n    half4 lumaNe = h4tex2Dlod(tex, half4(fxaaConsolePosPos.zy, 0, 0));\n    #if (FXAA_GREEN_AS_LUMA == 0)\n        lumaNe.w += half(1.0/512.0);\n        dir.x = -lumaNe.w;\n        dir.z = -lumaNe.w;\n    #else\n        lumaNe.y += half(1.0/512.0);\n        dir.x = -lumaNe.y;\n        dir.z = -lumaNe.y;\n    #endif\n/*--------------------------------------------------------------------------*/\n// (2)\n    half4 lumaSw = h4tex2Dlod(tex, half4(fxaaConsolePosPos.xw, 0, 0));\n    #if (FXAA_GREEN_AS_LUMA == 0)\n        dir.x += lumaSw.w;\n        dir.z += lumaSw.w;\n    #else\n        dir.x += lumaSw.y;\n        dir.z += lumaSw.y;\n    #endif        \n/*--------------------------------------------------------------------------*/\n// (3)\n    half4 lumaNw = h4tex2Dlod(tex, half4(fxaaConsolePosPos.xy, 0, 0));\n    #if (FXAA_GREEN_AS_LUMA == 0)\n        dir.x -= lumaNw.w;\n        dir.z += lumaNw.w;\n    #else\n        dir.x -= lumaNw.y;\n        dir.z += lumaNw.y;\n    #endif\n/*--------------------------------------------------------------------------*/\n// (4)\n    half4 lumaSe = h4tex2Dlod(tex, half4(fxaaConsolePosPos.zw, 0, 0));\n    #if (FXAA_GREEN_AS_LUMA == 0)\n        dir.x += lumaSe.w;\n        dir.z -= lumaSe.w;\n    #else\n        dir.x += lumaSe.y;\n        dir.z -= lumaSe.y;\n    #endif\n/*--------------------------------------------------------------------------*/\n// (5)\n    half4 dir1_pos;\n    dir1_pos.xy = normalize(dir.xyz).xz;\n    half dirAbsMinTimesC = min(abs(dir1_pos.x), abs(dir1_pos.y)) * half(FXAA_CONSOLE__PS3_EDGE_SHARPNESS);\n/*--------------------------------------------------------------------------*/\n// (6)\n    half4 dir2_pos;\n    dir2_pos.xy = clamp(dir1_pos.xy / dirAbsMinTimesC, half(-2.0), half(2.0));\n    dir1_pos.zw = pos.xy;\n    dir2_pos.zw = pos.xy;\n    half4 temp1N;\n    temp1N.xy = dir1_pos.zw - dir1_pos.xy * fxaaConsoleRcpFrameOpt.zw;\n/*--------------------------------------------------------------------------*/\n// (7)\n    temp1N = h4tex2Dlod(tex, half4(temp1N.xy, 0.0, 0.0));\n    half4 rgby1;\n    rgby1.xy = dir1_pos.zw + dir1_pos.xy * fxaaConsoleRcpFrameOpt.zw;\n/*--------------------------------------------------------------------------*/\n// (8)\n    rgby1 = h4tex2Dlod(tex, half4(rgby1.xy, 0.0, 0.0));\n    rgby1 = (temp1N + rgby1) * 0.5;\n/*--------------------------------------------------------------------------*/\n// (9)\n    half4 temp2N;\n    temp2N.xy = dir2_pos.zw - dir2_pos.xy * fxaaConsoleRcpFrameOpt2.zw;\n    temp2N = h4tex2Dlod(tex, half4(temp2N.xy, 0.0, 0.0));\n/*--------------------------------------------------------------------------*/\n// (10)\n    half4 rgby2;\n    rgby2.xy = dir2_pos.zw + dir2_pos.xy * fxaaConsoleRcpFrameOpt2.zw;\n    rgby2 = h4tex2Dlod(tex, half4(rgby2.xy, 0.0, 0.0));\n    rgby2 = (temp2N + rgby2) * 0.5;\n/*--------------------------------------------------------------------------*/\n// (11)\n    // compilier moves these scalar ops up to other cycles\n    #if (FXAA_GREEN_AS_LUMA == 0)\n        half lumaMin = min(min(lumaNw.w, lumaSw.w), min(lumaNe.w, lumaSe.w));\n        half lumaMax = max(max(lumaNw.w, lumaSw.w), max(lumaNe.w, lumaSe.w));\n    #else\n        half lumaMin = min(min(lumaNw.y, lumaSw.y), min(lumaNe.y, lumaSe.y));\n        half lumaMax = max(max(lumaNw.y, lumaSw.y), max(lumaNe.y, lumaSe.y));\n    #endif        \n    rgby2 = (rgby2 + rgby1) * 0.5;\n/*--------------------------------------------------------------------------*/\n// (12)\n    #if (FXAA_GREEN_AS_LUMA == 0)\n        bool twoTapLt = rgby2.w < lumaMin;\n        bool twoTapGt = rgby2.w > lumaMax;\n    #else\n        bool twoTapLt = rgby2.y < lumaMin;\n        bool twoTapGt = rgby2.y > lumaMax;\n    #endif\n/*--------------------------------------------------------------------------*/\n// (13)\n    if(twoTapLt || twoTapGt) rgby2 = rgby1;\n/*--------------------------------------------------------------------------*/\n    return rgby2; }\n/*==========================================================================*/\n#endif\n\n\n\n/*============================================================================\n\n       FXAA3 CONSOLE - OPTIMIZED PS3 PIXEL SHADER (WITH EARLY EXIT)\n\n==============================================================================\nThe code mostly matches the assembly.\nI have a feeling that 14 cycles is possible, but was not able to get there.\nMight have to increase register count to get full performance.\nNote this shader does not use perspective interpolation.\n\nUse the following cgc options,\n\n --fenable-bx2 --fastmath --fastprecision --nofloatbindings\n\nUse of FXAA_GREEN_AS_LUMA currently adds a cycle (16 clks).\nWill look at fixing this for FXAA 3.12.\n------------------------------------------------------------------------------\n                             NVSHADERPERF OUTPUT\n------------------------------------------------------------------------------\nFor reference and to aid in debug, output of NVShaderPerf should match this,\n\nShader to schedule:\n  0: texpkb h0.w(TRUE), v5.zyxx, #0\n  2: addh h2.y(TRUE), h0.w, constant(0.001953, 0.000000, 0.000000, 0.000000).x\n  4: texpkb h1.w(TRUE), v5.xwxx, #0\n  6: addh h0.x(TRUE), h1.w, -h2.y\n  7: texpkb h2.w(TRUE), v5.zwzz, #0\n  9: minh h4.w(TRUE), h2.y, h2\n 10: maxh h5.x(TRUE), h2.y, h2.w\n 11: texpkb h0.w(TRUE), v5, #0\n 13: addh h3.w(TRUE), -h0, h0.x\n 14: addh h0.x(TRUE), h0.w, h0\n 15: addh h0.z(TRUE), -h2.w, h0.x\n 16: addh h0.x(TRUE), h2.w, h3.w\n 17: minh h5.y(TRUE), h0.w, h1.w\n 18: nrmh h2.xz(TRUE), h0_n\n 19: minh_m8 h2.w(TRUE), |h2.x|, |h2.z|\n 20: divx h4.xy(TRUE), h2_n.xzzw, h2_n.w\n 21: movr r1.zw(TRUE), v4.xxxy\n 22: maxh h2.w(TRUE), h0, h1\n 23: fenct TRUE\n 24: madr r0.xy(TRUE), -h2.xzzw, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).zwzz, r1.zwzz\n 26: texpkb h0(TRUE), r0, #0\n 28: maxh h5.x(TRUE), h2.w, h5\n 29: minh h5.w(TRUE), h5.y, h4\n 30: madr r1.xy(TRUE), h2.xzzw, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).zwzz, r1.zwzz\n 32: texpkb h2(TRUE), r1, #0\n 34: addh_d2 h2(TRUE), h0, h2\n 35: texpkb h1(TRUE), v4, #0\n 37: maxh h5.y(TRUE), h5.x, h1.w\n 38: minh h4.w(TRUE), h1, h5\n 39: madr r0.xy(TRUE), -h4, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).xyxx, r1.zwzz\n 41: texpkb h0(TRUE), r0, #0\n 43: addh_m8 h5.z(TRUE), h5.y, -h4.w\n 44: madr r2.xy(TRUE), h4, constant(cConst5.x, cConst5.y, cConst5.z, cConst5.w).xyxx, r1.zwzz\n 46: texpkb h3(TRUE), r2, #0\n 48: addh_d2 h0(TRUE), h0, h3\n 49: addh_d2 h3(TRUE), h0, h2\n 50: movh h0(TRUE), h3\n 51: slth h3.x(TRUE), h3.w, h5.w\n 52: sgth h3.w(TRUE), h3, h5.x\n 53: addx.c0 rc(TRUE), h3.x, h3\n 54: slth.c0 rc(TRUE), h5.z, h5\n 55: movh h0(c0.NE.w), h2\n 56: movh h0(c0.NE.x), h1\n\nIPU0 ------ Simplified schedule: --------\nPass |  Unit  |  uOp |  PC:  Op\n-----+--------+------+-------------------------\n   1 | SCT0/1 |  mov |   0:  TXLr h0.w, g[TEX1].zyxx, const.xxxx, TEX0;\n     |    TEX |  txl |   0:  TXLr h0.w, g[TEX1].zyxx, const.xxxx, TEX0;\n     |   SCB0 |  add |   2:  ADDh h2.y, h0.-w--, const.-x--;\n     |        |      |\n   2 | SCT0/1 |  mov |   4:  TXLr h1.w, g[TEX1].xwxx, const.xxxx, TEX0;\n     |    TEX |  txl |   4:  TXLr h1.w, g[TEX1].xwxx, const.xxxx, TEX0;\n     |   SCB0 |  add |   6:  ADDh h0.x, h1.w---,-h2.y---;\n     |        |      |\n   3 | SCT0/1 |  mov |   7:  TXLr h2.w, g[TEX1].zwzz, const.xxxx, TEX0;\n     |    TEX |  txl |   7:  TXLr h2.w, g[TEX1].zwzz, const.xxxx, TEX0;\n     |   SCB0 |  max |  10:  MAXh h5.x, h2.y---, h2.w---;\n     |   SCB1 |  min |   9:  MINh h4.w, h2.---y, h2;\n     |        |      |\n   4 | SCT0/1 |  mov |  11:  TXLr h0.w, g[TEX1], const.xxxx, TEX0;\n     |    TEX |  txl |  11:  TXLr h0.w, g[TEX1], const.xxxx, TEX0;\n     |   SCB0 |  add |  14:  ADDh h0.x, h0.w---, h0;\n     |   SCB1 |  add |  13:  ADDh h3.w,-h0, h0.---x;\n     |        |      |\n   5 |   SCT0 |  mad |  16:  ADDh h0.x, h2.w---, h3.w---;\n     |   SCT1 |  mad |  15:  ADDh h0.z,-h2.--w-, h0.--x-;\n     |   SCB0 |  min |  17:  MINh h5.y, h0.-w--, h1.-w--;\n     |        |      |\n   6 |   SCT1 |  mov |  18:  NRMh h2.xz, h0;\n     |    SRB |  nrm |  18:  NRMh h2.xz, h0;\n     |   SCB1 |  min |  19:  MINh*8 h2.w, |h2.---x|, |h2.---z|;\n     |        |      |\n   7 |   SCT0 |  div |  20:  DIVx h4.xy, h2.xz--, h2.ww--;\n     |   SCT1 |  mov |  21:  MOVr r1.zw, g[TEX0].--xy;\n     |   SCB1 |  max |  22:  MAXh h2.w, h0, h1;\n     |        |      |\n   8 |   SCT0 |  mad |  24:  MADr r0.xy,-h2.xz--, const.zw--, r1.zw--;\n     |   SCT1 |  mov |  26:  TXLr h0, r0, const.xxxx, TEX0;\n     |    TEX |  txl |  26:  TXLr h0, r0, const.xxxx, TEX0;\n     |   SCB0 |  max |  28:  MAXh h5.x, h2.w---, h5;\n     |   SCB1 |  min |  29:  MINh h5.w, h5.---y, h4;\n     |        |      |\n   9 |   SCT0 |  mad |  30:  MADr r1.xy, h2.xz--, const.zw--, r1.zw--;\n     |   SCT1 |  mov |  32:  TXLr h2, r1, const.xxxx, TEX0;\n     |    TEX |  txl |  32:  TXLr h2, r1, const.xxxx, TEX0;\n     | SCB0/1 |  add |  34:  ADDh/2 h2, h0, h2;\n     |        |      |\n  10 | SCT0/1 |  mov |  35:  TXLr h1, g[TEX0], const.xxxx, TEX0;\n     |    TEX |  txl |  35:  TXLr h1, g[TEX0], const.xxxx, TEX0;\n     |   SCB0 |  max |  37:  MAXh h5.y, h5.-x--, h1.-w--;\n     |   SCB1 |  min |  38:  MINh h4.w, h1, h5;\n     |        |      |\n  11 |   SCT0 |  mad |  39:  MADr r0.xy,-h4, const.xy--, r1.zw--;\n     |   SCT1 |  mov |  41:  TXLr h0, r0, const.zzzz, TEX0;\n     |    TEX |  txl |  41:  TXLr h0, r0, const.zzzz, TEX0;\n     |   SCB0 |  mad |  44:  MADr r2.xy, h4, const.xy--, r1.zw--;\n     |   SCB1 |  add |  43:  ADDh*8 h5.z, h5.--y-,-h4.--w-;\n     |        |      |\n  12 | SCT0/1 |  mov |  46:  TXLr h3, r2, const.xxxx, TEX0;\n     |    TEX |  txl |  46:  TXLr h3, r2, const.xxxx, TEX0;\n     | SCB0/1 |  add |  48:  ADDh/2 h0, h0, h3;\n     |        |      |\n  13 | SCT0/1 |  mad |  49:  ADDh/2 h3, h0, h2;\n     | SCB0/1 |  mul |  50:  MOVh h0, h3;\n     |        |      |\n  14 |   SCT0 |  set |  51:  SLTh h3.x, h3.w---, h5.w---;\n     |   SCT1 |  set |  52:  SGTh h3.w, h3, h5.---x;\n     |   SCB0 |  set |  54:  SLThc0 rc, h5.z---, h5;\n     |   SCB1 |  add |  53:  ADDxc0_s rc, h3.---x, h3;\n     |        |      |\n  15 | SCT0/1 |  mul |  55:  MOVh h0(NE0.wwww), h2;\n     | SCB0/1 |  mul |  56:  MOVh h0(NE0.xxxx), h1;\n \nPass   SCT  TEX  SCB\n  1:   0% 100%  25%\n  2:   0% 100%  25%\n  3:   0% 100%  50%\n  4:   0% 100%  50%\n  5:  50%   0%  25%\n  6:   0%   0%  25%\n  7: 100%   0%  25%\n  8:   0% 100%  50%\n  9:   0% 100% 100%\n 10:   0% 100%  50%\n 11:   0% 100%  75%\n 12:   0% 100% 100%\n 13: 100%   0% 100%\n 14:  50%   0%  50%\n 15: 100%   0% 100%\n\nMEAN:  26%  60%  56%\n\nPass   SCT0  SCT1   TEX  SCB0  SCB1\n  1:    0%    0%  100%  100%    0%\n  2:    0%    0%  100%  100%    0%\n  3:    0%    0%  100%  100%  100%\n  4:    0%    0%  100%  100%  100%\n  5:  100%  100%    0%  100%    0%\n  6:    0%    0%    0%    0%  100%\n  7:  100%  100%    0%    0%  100%\n  8:    0%    0%  100%  100%  100%\n  9:    0%    0%  100%  100%  100%\n 10:    0%    0%  100%  100%  100%\n 11:    0%    0%  100%  100%  100%\n 12:    0%    0%  100%  100%  100%\n 13:  100%  100%    0%  100%  100%\n 14:  100%  100%    0%  100%  100%\n 15:  100%  100%    0%  100%  100%\n\nMEAN:   33%   33%   60%   86%   80%\nFragment Performance Setup: Driver RSX Compiler, GPU RSX, Flags 0x5\nResults 15 cycles, 3 r regs, 800,000,000 pixels/s\n============================================================================*/\n#if (FXAA_PS3 == 1) && (FXAA_EARLY_EXIT == 1)\n/*--------------------------------------------------------------------------*/\n#pragma regcount 7\n#pragma disablepc all\n#pragma option O2\n#pragma option OutColorPrec=fp16\n#pragma texformat default RGBA8\n/*==========================================================================*/\nhalf4 FxaaPixelShader(\n    // See FXAA Quality FxaaPixelShader() source for docs on Inputs!\n    FxaaFloat2 pos,\n    FxaaFloat4 fxaaConsolePosPos,\n    FxaaTex tex,\n    FxaaTex fxaaConsole360TexExpBiasNegOne,\n    FxaaTex fxaaConsole360TexExpBiasNegTwo,\n    FxaaFloat2 fxaaQualityRcpFrame,\n    FxaaFloat4 fxaaConsoleRcpFrameOpt,\n    FxaaFloat4 fxaaConsoleRcpFrameOpt2,\n    FxaaFloat4 fxaaConsole360RcpFrameOpt2,\n    FxaaFloat fxaaQualitySubpix,\n    FxaaFloat fxaaQualityEdgeThreshold,\n    FxaaFloat fxaaQualityEdgeThresholdMin,\n    FxaaFloat fxaaConsoleEdgeSharpness,\n    FxaaFloat fxaaConsoleEdgeThreshold,\n    FxaaFloat fxaaConsoleEdgeThresholdMin,\n    FxaaFloat4 fxaaConsole360ConstDir\n) {\n/*--------------------------------------------------------------------------*/\n// (1)\n    half4 rgbyNe = h4tex2Dlod(tex, half4(fxaaConsolePosPos.zy, 0, 0));\n    #if (FXAA_GREEN_AS_LUMA == 0)\n        half lumaNe = rgbyNe.w + half(1.0/512.0);\n    #else\n        half lumaNe = rgbyNe.y + half(1.0/512.0);\n    #endif\n/*--------------------------------------------------------------------------*/\n// (2)\n    half4 lumaSw = h4tex2Dlod(tex, half4(fxaaConsolePosPos.xw, 0, 0));\n    #if (FXAA_GREEN_AS_LUMA == 0)\n        half lumaSwNegNe = lumaSw.w - lumaNe;\n    #else\n        half lumaSwNegNe = lumaSw.y - lumaNe;\n    #endif\n/*--------------------------------------------------------------------------*/\n// (3)\n    half4 lumaNw = h4tex2Dlod(tex, half4(fxaaConsolePosPos.xy, 0, 0));\n    #if (FXAA_GREEN_AS_LUMA == 0)\n        half lumaMaxNwSw = max(lumaNw.w, lumaSw.w);\n        half lumaMinNwSw = min(lumaNw.w, lumaSw.w);\n    #else\n        half lumaMaxNwSw = max(lumaNw.y, lumaSw.y);\n        half lumaMinNwSw = min(lumaNw.y, lumaSw.y);\n    #endif\n/*--------------------------------------------------------------------------*/\n// (4)\n    half4 lumaSe = h4tex2Dlod(tex, half4(fxaaConsolePosPos.zw, 0, 0));\n    #if (FXAA_GREEN_AS_LUMA == 0)\n        half dirZ =  lumaNw.w + lumaSwNegNe;\n        half dirX = -lumaNw.w + lumaSwNegNe;\n    #else\n        half dirZ =  lumaNw.y + lumaSwNegNe;\n        half dirX = -lumaNw.y + lumaSwNegNe;\n    #endif\n/*--------------------------------------------------------------------------*/\n// (5)\n    half3 dir;\n    dir.y = 0.0;\n    #if (FXAA_GREEN_AS_LUMA == 0)\n        dir.x =  lumaSe.w + dirX;\n        dir.z = -lumaSe.w + dirZ;\n        half lumaMinNeSe = min(lumaNe, lumaSe.w);\n    #else\n        dir.x =  lumaSe.y + dirX;\n        dir.z = -lumaSe.y + dirZ;\n        half lumaMinNeSe = min(lumaNe, lumaSe.y);\n    #endif\n/*--------------------------------------------------------------------------*/\n// (6)\n    half4 dir1_pos;\n    dir1_pos.xy = normalize(dir).xz;\n    half dirAbsMinTimes8 = min(abs(dir1_pos.x), abs(dir1_pos.y)) * half(FXAA_CONSOLE__PS3_EDGE_SHARPNESS);\n/*--------------------------------------------------------------------------*/\n// (7)\n    half4 dir2_pos;\n    dir2_pos.xy = clamp(dir1_pos.xy / dirAbsMinTimes8, half(-2.0), half(2.0));\n    dir1_pos.zw = pos.xy;\n    dir2_pos.zw = pos.xy;\n    #if (FXAA_GREEN_AS_LUMA == 0)\n        half lumaMaxNeSe = max(lumaNe, lumaSe.w);\n    #else\n        half lumaMaxNeSe = max(lumaNe, lumaSe.y);\n    #endif\n/*--------------------------------------------------------------------------*/\n// (8)\n    half4 temp1N;\n    temp1N.xy = dir1_pos.zw - dir1_pos.xy * fxaaConsoleRcpFrameOpt.zw;\n    temp1N = h4tex2Dlod(tex, half4(temp1N.xy, 0.0, 0.0));\n    half lumaMax = max(lumaMaxNwSw, lumaMaxNeSe);\n    half lumaMin = min(lumaMinNwSw, lumaMinNeSe);\n/*--------------------------------------------------------------------------*/\n// (9)\n    half4 rgby1;\n    rgby1.xy = dir1_pos.zw + dir1_pos.xy * fxaaConsoleRcpFrameOpt.zw;\n    rgby1 = h4tex2Dlod(tex, half4(rgby1.xy, 0.0, 0.0));\n    rgby1 = (temp1N + rgby1) * 0.5;\n/*--------------------------------------------------------------------------*/\n// (10)\n    half4 rgbyM = h4tex2Dlod(tex, half4(pos.xy, 0.0, 0.0));\n    #if (FXAA_GREEN_AS_LUMA == 0)\n        half lumaMaxM = max(lumaMax, rgbyM.w);\n        half lumaMinM = min(lumaMin, rgbyM.w);\n    #else\n        half lumaMaxM = max(lumaMax, rgbyM.y);\n        half lumaMinM = min(lumaMin, rgbyM.y);\n    #endif\n/*--------------------------------------------------------------------------*/\n// (11)\n    half4 temp2N;\n    temp2N.xy = dir2_pos.zw - dir2_pos.xy * fxaaConsoleRcpFrameOpt2.zw;\n    temp2N = h4tex2Dlod(tex, half4(temp2N.xy, 0.0, 0.0));\n    half4 rgby2;\n    rgby2.xy = dir2_pos.zw + dir2_pos.xy * fxaaConsoleRcpFrameOpt2.zw;\n    half lumaRangeM = (lumaMaxM - lumaMinM) / FXAA_CONSOLE__PS3_EDGE_THRESHOLD;\n/*--------------------------------------------------------------------------*/\n// (12)\n    rgby2 = h4tex2Dlod(tex, half4(rgby2.xy, 0.0, 0.0));\n    rgby2 = (temp2N + rgby2) * 0.5;\n/*--------------------------------------------------------------------------*/\n// (13)\n    rgby2 = (rgby2 + rgby1) * 0.5;\n/*--------------------------------------------------------------------------*/\n// (14)\n    #if (FXAA_GREEN_AS_LUMA == 0)\n        bool twoTapLt = rgby2.w < lumaMin;\n        bool twoTapGt = rgby2.w > lumaMax;\n    #else\n        bool twoTapLt = rgby2.y < lumaMin;\n        bool twoTapGt = rgby2.y > lumaMax;\n    #endif\n    bool earlyExit = lumaRangeM < lumaMax;\n    bool twoTap = twoTapLt || twoTapGt;\n/*--------------------------------------------------------------------------*/\n// (15)\n    if(twoTap) rgby2 = rgby1;\n    if(earlyExit) rgby2 = rgbyM;\n/*--------------------------------------------------------------------------*/\n    return rgby2; }\n/*==========================================================================*/\n#endif\n"
  },
  {
    "path": "third_party/fxaa/LICENSE",
    "content": "BSD 3-Clause License\n\nCopyright (c) 2014-2015, NVIDIA CORPORATION. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions\nare met:\n\n  * Redistributions of source code must retain the above copyright\n    notice, this list of conditions and the following disclaimer.\n\n  * Redistributions in binary form must reproduce the above copyright\n    notice, this list of conditions and the following disclaimer in the\n    documentation and/or other materials provided with the distribution.\n\n  * Neither the name of NVIDIA CORPORATION nor the names of its\n    contributors may be used to endorse or promote products derived\n    from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR\nCONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\nEXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\nPROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\nPROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY\nOF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "third_party/glslang-spirv.lua",
    "content": "group(\"third_party\")\nproject(\"glslang-spirv\")\n  uuid(\"1cc8f45e-91e2-4daf-a55e-666bf8b5e6b2\")\n  kind(\"StaticLib\")\n  language(\"C++\")\n  links({\n  })\n  defines({\n    \"_LIB\",\n  })\n  includedirs({\n  })\n  files({\n    \"glslang/SPIRV/bitutils.h\",\n    \"glslang/SPIRV/disassemble.cpp\",\n    \"glslang/SPIRV/disassemble.h\",\n    \"glslang/SPIRV/doc.cpp\",\n    \"glslang/SPIRV/doc.h\",\n    \"glslang/SPIRV/GLSL.ext.AMD.h\",\n    \"glslang/SPIRV/GLSL.ext.EXT.h\",\n    \"glslang/SPIRV/GLSL.ext.KHR.h\",\n    \"glslang/SPIRV/GLSL.ext.NV.h\",\n    \"glslang/SPIRV/GLSL.std.450.h\",\n    -- Disabled because GLSL is not used.\n    -- \"glslang/SPIRV/GlslangToSpv.cpp\",\n    -- \"glslang/SPIRV/GlslangToSpv.h\",\n    \"glslang/SPIRV/hex_float.h\",\n    \"glslang/SPIRV/InReadableOrder.cpp\",\n    \"glslang/SPIRV/Logger.cpp\",\n    \"glslang/SPIRV/Logger.h\",\n    \"glslang/SPIRV/NonSemanticDebugPrintf.h\",\n    \"glslang/SPIRV/spirv.hpp\",\n    \"glslang/SPIRV/SpvBuilder.cpp\",\n    \"glslang/SPIRV/SpvBuilder.h\",\n    \"glslang/SPIRV/spvIR.h\",\n    -- Disabled because of spirv-tools dependency.\n    -- \"glslang/SPIRV/SpvPostProcess.cpp\",\n    \"glslang/SPIRV/SPVRemapper.cpp\",\n    \"glslang/SPIRV/SPVRemapper.h\",\n    -- Disabled because of spirv-tools dependency.\n    -- \"glslang/SPIRV/SpvTools.cpp\",\n    -- \"glslang/SPIRV/SpvTools.h\",\n  })\n"
  },
  {
    "path": "third_party/google-styleguide/cpplint/README",
    "content": "This is automated checker to make sure a C++ file follows Google's C++ style\nguide (http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml). As it\nheavily relies on regular expressions, cpplint.py won't catch all violations of\nthe style guide and will very occasionally report a false positive. There is a\nlist of things we currently don't handle very well at the top of cpplint.py,\nand we welcome patches to improve it.\n\nThe linting tool takes a list of files as input. For full usage instructions,\nplease see the output of:\n\n  ./cpplint.py --help\n\nUnit tests are provided in cpplint_unittest.py. This file can safely be ignored\nby end users who have downloaded this package and only want to run the lint\ntool.\n\n---\n\ncpplint.py and its corresponding unit tests are Copyright (C) 2009 Google Inc.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "third_party/google-styleguide/cpplint/cpplint.py",
    "content": "#!/usr/bin/python\n#\n# Copyright (c) 2009 Google Inc. All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#    * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#    * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#    * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Does google-lint on c++ files.\n\nThe goal of this script is to identify places in the code that *may*\nbe in non-compliance with google style.  It does not attempt to fix\nup these problems -- the point is to educate.  It does also not\nattempt to find all problems, or to ensure that everything it does\nfind is legitimately a problem.\n\nIn particular, we can get very confused by /* and // inside strings!\nWe do a small hack, which is to ignore //'s with \"'s after them on the\nsame line, but it is far from perfect (in either direction).\n\"\"\"\n\nimport codecs\nimport copy\nimport getopt\nimport math  # for log\nimport os\nimport re\nimport sre_compile\nimport string\nimport sys\nimport unicodedata\n\n\n_USAGE = \"\"\"\nSyntax: cpplint.py [--verbose=#] [--output=vs7] [--filter=-x,+y,...]\n                   [--counting=total|toplevel|detailed] [--root=subdir]\n                   [--linelength=digits]\n        <file> [file] ...\n\n  The style guidelines this tries to follow are those in\n    http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml\n\n  Every problem is given a confidence score from 1-5, with 5 meaning we are\n  certain of the problem, and 1 meaning it could be a legitimate construct.\n  This will miss some errors, and is not a substitute for a code review.\n\n  To suppress false-positive errors of a certain category, add a\n  'NOLINT(category)' comment to the line.  NOLINT or NOLINT(*)\n  suppresses errors of all categories on that line.\n\n  The files passed in will be linted; at least one file must be provided.\n  Default linted extensions are .cc, .cpp, .cu, .cuh and .h.  Change the\n  extensions with the --extensions flag.\n\n  Flags:\n\n    output=vs7\n      By default, the output is formatted to ease emacs parsing.  Visual Studio\n      compatible output (vs7) may also be used.  Other formats are unsupported.\n\n    verbose=#\n      Specify a number 0-5 to restrict errors to certain verbosity levels.\n\n    filter=-x,+y,...\n      Specify a comma-separated list of category-filters to apply: only\n      error messages whose category names pass the filters will be printed.\n      (Category names are printed with the message and look like\n      \"[whitespace/indent]\".)  Filters are evaluated left to right.\n      \"-FOO\" and \"FOO\" means \"do not print categories that start with FOO\".\n      \"+FOO\" means \"do print categories that start with FOO\".\n\n      Examples: --filter=-whitespace,+whitespace/braces\n                --filter=whitespace,runtime/printf,+runtime/printf_format\n                --filter=-,+build/include_what_you_use\n\n      To see a list of all the categories used in cpplint, pass no arg:\n         --filter=\n\n    counting=total|toplevel|detailed\n      The total number of errors found is always printed. If\n      'toplevel' is provided, then the count of errors in each of\n      the top-level categories like 'build' and 'whitespace' will\n      also be printed. If 'detailed' is provided, then a count\n      is provided for each category like 'build/class'.\n\n    root=subdir\n      The root directory used for deriving header guard CPP variable.\n      By default, the header guard CPP variable is calculated as the relative\n      path to the directory that contains .git, .hg, or .svn.  When this flag\n      is specified, the relative path is calculated from the specified\n      directory. If the specified directory does not exist, this flag is\n      ignored.\n\n      Examples:\n        Assuming that src/.git exists, the header guard CPP variables for\n        src/chrome/browser/ui/browser.h are:\n\n        No flag => CHROME_BROWSER_UI_BROWSER_H_\n        --root=chrome => BROWSER_UI_BROWSER_H_\n        --root=chrome/browser => UI_BROWSER_H_\n\n    linelength=digits\n      This is the allowed line length for the project. The default value is\n      80 characters.\n\n      Examples:\n        --linelength=120\n\n    extensions=extension,extension,...\n      The allowed file extensions that cpplint will check\n\n      Examples:\n        --extensions=hpp,cpp\n\"\"\"\n\n# We categorize each error message we print.  Here are the categories.\n# We want an explicit list so we can list them all in cpplint --filter=.\n# If you add a new error message with a new category, add it to the list\n# here!  cpplint_unittest.py should tell you if you forget to do this.\n_ERROR_CATEGORIES = [\n  'build/class',\n  'build/c++11',\n  'build/deprecated',\n  'build/endif_comment',\n  'build/explicit_make_pair',\n  'build/forward_decl',\n  'build/header_guard',\n  'build/include',\n  'build/include_alpha',\n  'build/include_order',\n  'build/include_what_you_use',\n  'build/namespaces',\n  'build/printf_format',\n  'build/storage_class',\n  'legal/copyright',\n  'readability/alt_tokens',\n  'readability/braces',\n  'readability/casting',\n  'readability/check',\n  'readability/constructors',\n  'readability/fn_size',\n  'readability/function',\n  'readability/multiline_comment',\n  'readability/multiline_string',\n  'readability/namespace',\n  'readability/nolint',\n  'readability/nul',\n  'readability/streams',\n  'readability/todo',\n  'readability/utf8',\n  'runtime/arrays',\n  'runtime/casting',\n  'runtime/explicit',\n  'runtime/int',\n  'runtime/init',\n  'runtime/invalid_increment',\n  'runtime/member_string_references',\n  'runtime/memset',\n  'runtime/operator',\n  'runtime/printf',\n  'runtime/printf_format',\n  'runtime/references',\n  'runtime/string',\n  'runtime/threadsafe_fn',\n  'runtime/vlog',\n  'whitespace/blank_line',\n  'whitespace/braces',\n  'whitespace/comma',\n  'whitespace/comments',\n  'whitespace/empty_conditional_body',\n  'whitespace/empty_loop_body',\n  'whitespace/end_of_line',\n  'whitespace/ending_newline',\n  'whitespace/forcolon',\n  'whitespace/indent',\n  'whitespace/line_length',\n  'whitespace/newline',\n  'whitespace/operators',\n  'whitespace/parens',\n  'whitespace/semicolon',\n  'whitespace/tab',\n  'whitespace/todo'\n  ]\n\n# The default state of the category filter. This is overridden by the --filter=\n# flag. By default all errors are on, so only add here categories that should be\n# off by default (i.e., categories that must be enabled by the --filter= flags).\n# All entries here should start with a '-' or '+', as in the --filter= flag.\n_DEFAULT_FILTERS = ['-build/include_alpha']\n\n# We used to check for high-bit characters, but after much discussion we\n# decided those were OK, as long as they were in UTF-8 and didn't represent\n# hard-coded international strings, which belong in a separate i18n file.\n\n# C++ headers\n_CPP_HEADERS = frozenset([\n    # Legacy\n    'algobase.h',\n    'algo.h',\n    'alloc.h',\n    'builtinbuf.h',\n    'bvector.h',\n    'complex.h',\n    'defalloc.h',\n    'deque.h',\n    'editbuf.h',\n    'fstream.h',\n    'function.h',\n    'hash_map',\n    'hash_map.h',\n    'hash_set',\n    'hash_set.h',\n    'hashtable.h',\n    'heap.h',\n    'indstream.h',\n    'iomanip.h',\n    'iostream.h',\n    'istream.h',\n    'iterator.h',\n    'list.h',\n    'map.h',\n    'multimap.h',\n    'multiset.h',\n    'ostream.h',\n    'pair.h',\n    'parsestream.h',\n    'pfstream.h',\n    'procbuf.h',\n    'pthread_alloc',\n    'pthread_alloc.h',\n    'rope',\n    'rope.h',\n    'ropeimpl.h',\n    'set.h',\n    'slist',\n    'slist.h',\n    'stack.h',\n    'stdiostream.h',\n    'stl_alloc.h',\n    'stl_relops.h',\n    'streambuf.h',\n    'stream.h',\n    'strfile.h',\n    'strstream.h',\n    'tempbuf.h',\n    'tree.h',\n    'type_traits.h',\n    'vector.h',\n    # 17.6.1.2 C++ library headers\n    'algorithm',\n    'array',\n    'atomic',\n    'bitset',\n    'chrono',\n    'codecvt',\n    'complex',\n    'condition_variable',\n    'deque',\n    'exception',\n    'forward_list',\n    'fstream',\n    'functional',\n    'future',\n    'initializer_list',\n    'iomanip',\n    'ios',\n    'iosfwd',\n    'iostream',\n    'istream',\n    'iterator',\n    'limits',\n    'list',\n    'locale',\n    'map',\n    'memory',\n    'mutex',\n    'new',\n    'numeric',\n    'ostream',\n    'queue',\n    'random',\n    'ratio',\n    'regex',\n    'set',\n    'sstream',\n    'stack',\n    'stdexcept',\n    'streambuf',\n    'string',\n    'strstream',\n    'system_error',\n    'thread',\n    'tuple',\n    'typeindex',\n    'typeinfo',\n    'type_traits',\n    'unordered_map',\n    'unordered_set',\n    'utility',\n    'valarray',\n    'vector',\n    # 17.6.1.2 C++ headers for C library facilities\n    'cassert',\n    'ccomplex',\n    'cctype',\n    'cerrno',\n    'cfenv',\n    'cfloat',\n    'cinttypes',\n    'ciso646',\n    'climits',\n    'clocale',\n    'cmath',\n    'csetjmp',\n    'csignal',\n    'cstdalign',\n    'cstdarg',\n    'cstdbool',\n    'cstddef',\n    'cstdint',\n    'cstdio',\n    'cstdlib',\n    'cstring',\n    'ctgmath',\n    'ctime',\n    'cuchar',\n    'cwchar',\n    'cwctype',\n    ])\n\n\n# Assertion macros.  These are defined in base/logging.h and\n# testing/base/gunit.h.  Note that the _M versions need to come first\n# for substring matching to work.\n_CHECK_MACROS = [\n    'DCHECK', 'CHECK',\n    'EXPECT_TRUE_M', 'EXPECT_TRUE',\n    'ASSERT_TRUE_M', 'ASSERT_TRUE',\n    'EXPECT_FALSE_M', 'EXPECT_FALSE',\n    'ASSERT_FALSE_M', 'ASSERT_FALSE',\n    ]\n\n# Replacement macros for CHECK/DCHECK/EXPECT_TRUE/EXPECT_FALSE\n_CHECK_REPLACEMENT = dict([(m, {}) for m in _CHECK_MACROS])\n\nfor op, replacement in [('==', 'EQ'), ('!=', 'NE'),\n                        ('>=', 'GE'), ('>', 'GT'),\n                        ('<=', 'LE'), ('<', 'LT')]:\n  _CHECK_REPLACEMENT['DCHECK'][op] = 'DCHECK_%s' % replacement\n  _CHECK_REPLACEMENT['CHECK'][op] = 'CHECK_%s' % replacement\n  _CHECK_REPLACEMENT['EXPECT_TRUE'][op] = 'EXPECT_%s' % replacement\n  _CHECK_REPLACEMENT['ASSERT_TRUE'][op] = 'ASSERT_%s' % replacement\n  _CHECK_REPLACEMENT['EXPECT_TRUE_M'][op] = 'EXPECT_%s_M' % replacement\n  _CHECK_REPLACEMENT['ASSERT_TRUE_M'][op] = 'ASSERT_%s_M' % replacement\n\nfor op, inv_replacement in [('==', 'NE'), ('!=', 'EQ'),\n                            ('>=', 'LT'), ('>', 'LE'),\n                            ('<=', 'GT'), ('<', 'GE')]:\n  _CHECK_REPLACEMENT['EXPECT_FALSE'][op] = 'EXPECT_%s' % inv_replacement\n  _CHECK_REPLACEMENT['ASSERT_FALSE'][op] = 'ASSERT_%s' % inv_replacement\n  _CHECK_REPLACEMENT['EXPECT_FALSE_M'][op] = 'EXPECT_%s_M' % inv_replacement\n  _CHECK_REPLACEMENT['ASSERT_FALSE_M'][op] = 'ASSERT_%s_M' % inv_replacement\n\n# Alternative tokens and their replacements.  For full list, see section 2.5\n# Alternative tokens [lex.digraph] in the C++ standard.\n#\n# Digraphs (such as '%:') are not included here since it's a mess to\n# match those on a word boundary.\n_ALT_TOKEN_REPLACEMENT = {\n    'and': '&&',\n    'bitor': '|',\n    'or': '||',\n    'xor': '^',\n    'compl': '~',\n    'bitand': '&',\n    'and_eq': '&=',\n    'or_eq': '|=',\n    'xor_eq': '^=',\n    'not': '!',\n    'not_eq': '!='\n    }\n\n# Compile regular expression that matches all the above keywords.  The \"[ =()]\"\n# bit is meant to avoid matching these keywords outside of boolean expressions.\n#\n# False positives include C-style multi-line comments and multi-line strings\n# but those have always been troublesome for cpplint.\n_ALT_TOKEN_REPLACEMENT_PATTERN = re.compile(\n    r'[ =()](' + ('|'.join(_ALT_TOKEN_REPLACEMENT.keys())) + r')(?=[ (]|$)')\n\n\n# These constants define types of headers for use with\n# _IncludeState.CheckNextIncludeOrder().\n_C_SYS_HEADER = 1\n_CPP_SYS_HEADER = 2\n_LIKELY_MY_HEADER = 3\n_POSSIBLE_MY_HEADER = 4\n_OTHER_HEADER = 5\n\n# These constants define the current inline assembly state\n_NO_ASM = 0       # Outside of inline assembly block\n_INSIDE_ASM = 1   # Inside inline assembly block\n_END_ASM = 2      # Last line of inline assembly block\n_BLOCK_ASM = 3    # The whole block is an inline assembly block\n\n# Match start of assembly blocks\n_MATCH_ASM = re.compile(r'^\\s*(?:asm|_asm|__asm|__asm__)'\n                        r'(?:\\s+(volatile|__volatile__))?'\n                        r'\\s*[{(]')\n\n\n_regexp_compile_cache = {}\n\n# Finds occurrences of NOLINT or NOLINT(...).\n_RE_SUPPRESSION = re.compile(r'\\bNOLINT\\b(\\([^)]*\\))?')\n\n# {str, set(int)}: a map from error categories to sets of linenumbers\n# on which those errors are expected and should be suppressed.\n_error_suppressions = {}\n\n# The root directory used for deriving header guard CPP variable.\n# This is set by --root flag.\n_root = None\n\n# The allowed line length of files.\n# This is set by --linelength flag.\n_line_length = 80\n\n# The allowed extensions for file names\n# This is set by --extensions flag.\n_valid_extensions = set(['cc', 'h', 'cpp', 'cu', 'cuh'])\n\ndef ParseNolintSuppressions(filename, raw_line, linenum, error):\n  \"\"\"Updates the global list of error-suppressions.\n\n  Parses any NOLINT comments on the current line, updating the global\n  error_suppressions store.  Reports an error if the NOLINT comment\n  was malformed.\n\n  Args:\n    filename: str, the name of the input file.\n    raw_line: str, the line of input text, with comments.\n    linenum: int, the number of the current line.\n    error: function, an error handler.\n  \"\"\"\n  # FIXME(adonovan): \"NOLINT(\" is misparsed as NOLINT(*).\n  matched = _RE_SUPPRESSION.search(raw_line)\n  if matched:\n    category = matched.group(1)\n    if category in (None, '(*)'):  # => \"suppress all\"\n      _error_suppressions.setdefault(None, set()).add(linenum)\n    else:\n      if category.startswith('(') and category.endswith(')'):\n        category = category[1:-1]\n        if category in _ERROR_CATEGORIES:\n          _error_suppressions.setdefault(category, set()).add(linenum)\n        else:\n          error(filename, linenum, 'readability/nolint', 5,\n                'Unknown NOLINT error category: %s' % category)\n\n\ndef ResetNolintSuppressions():\n  \"Resets the set of NOLINT suppressions to empty.\"\n  _error_suppressions.clear()\n\n\ndef IsErrorSuppressedByNolint(category, linenum):\n  \"\"\"Returns true if the specified error category is suppressed on this line.\n\n  Consults the global error_suppressions map populated by\n  ParseNolintSuppressions/ResetNolintSuppressions.\n\n  Args:\n    category: str, the category of the error.\n    linenum: int, the current line number.\n  Returns:\n    bool, True iff the error should be suppressed due to a NOLINT comment.\n  \"\"\"\n  return (linenum in _error_suppressions.get(category, set()) or\n          linenum in _error_suppressions.get(None, set()))\n\n\ndef Match(pattern, s):\n  \"\"\"Matches the string with the pattern, caching the compiled regexp.\"\"\"\n  # The regexp compilation caching is inlined in both Match and Search for\n  # performance reasons; factoring it out into a separate function turns out\n  # to be noticeably expensive.\n  if pattern not in _regexp_compile_cache:\n    _regexp_compile_cache[pattern] = sre_compile.compile(pattern)\n  return _regexp_compile_cache[pattern].match(s)\n\n\ndef ReplaceAll(pattern, rep, s):\n  \"\"\"Replaces instances of pattern in a string with a replacement.\n\n  The compiled regex is kept in a cache shared by Match and Search.\n\n  Args:\n    pattern: regex pattern\n    rep: replacement text\n    s: search string\n\n  Returns:\n    string with replacements made (or original string if no replacements)\n  \"\"\"\n  if pattern not in _regexp_compile_cache:\n    _regexp_compile_cache[pattern] = sre_compile.compile(pattern)\n  return _regexp_compile_cache[pattern].sub(rep, s)\n\n\ndef Search(pattern, s):\n  \"\"\"Searches the string for the pattern, caching the compiled regexp.\"\"\"\n  if pattern not in _regexp_compile_cache:\n    _regexp_compile_cache[pattern] = sre_compile.compile(pattern)\n  return _regexp_compile_cache[pattern].search(s)\n\n\nclass _IncludeState(dict):\n  \"\"\"Tracks line numbers for includes, and the order in which includes appear.\n\n  As a dict, an _IncludeState object serves as a mapping between include\n  filename and line number on which that file was included.\n\n  Call CheckNextIncludeOrder() once for each header in the file, passing\n  in the type constants defined above. Calls in an illegal order will\n  raise an _IncludeError with an appropriate error message.\n\n  \"\"\"\n  # self._section will move monotonically through this set. If it ever\n  # needs to move backwards, CheckNextIncludeOrder will raise an error.\n  _INITIAL_SECTION = 0\n  _MY_H_SECTION = 1\n  _C_SECTION = 2\n  _CPP_SECTION = 3\n  _OTHER_H_SECTION = 4\n\n  _TYPE_NAMES = {\n      _C_SYS_HEADER: 'C system header',\n      _CPP_SYS_HEADER: 'C++ system header',\n      _LIKELY_MY_HEADER: 'header this file implements',\n      _POSSIBLE_MY_HEADER: 'header this file may implement',\n      _OTHER_HEADER: 'other header',\n      }\n  _SECTION_NAMES = {\n      _INITIAL_SECTION: \"... nothing. (This can't be an error.)\",\n      _MY_H_SECTION: 'a header this file implements',\n      _C_SECTION: 'C system header',\n      _CPP_SECTION: 'C++ system header',\n      _OTHER_H_SECTION: 'other header',\n      }\n\n  def __init__(self):\n    dict.__init__(self)\n    self.ResetSection()\n\n  def ResetSection(self):\n    # The name of the current section.\n    self._section = self._INITIAL_SECTION\n    # The path of last found header.\n    self._last_header = ''\n\n  def SetLastHeader(self, header_path):\n    self._last_header = header_path\n\n  def CanonicalizeAlphabeticalOrder(self, header_path):\n    \"\"\"Returns a path canonicalized for alphabetical comparison.\n\n    - replaces \"-\" with \"_\" so they both cmp the same.\n    - removes '-inl' since we don't require them to be after the main header.\n    - lowercase everything, just in case.\n\n    Args:\n      header_path: Path to be canonicalized.\n\n    Returns:\n      Canonicalized path.\n    \"\"\"\n    return header_path.replace('-inl.h', '.h').replace('-', '_').lower()\n\n  def IsInAlphabeticalOrder(self, clean_lines, linenum, header_path):\n    \"\"\"Check if a header is in alphabetical order with the previous header.\n\n    Args:\n      clean_lines: A CleansedLines instance containing the file.\n      linenum: The number of the line to check.\n      header_path: Canonicalized header to be checked.\n\n    Returns:\n      Returns true if the header is in alphabetical order.\n    \"\"\"\n    # If previous section is different from current section, _last_header will\n    # be reset to empty string, so it's always less than current header.\n    #\n    # If previous line was a blank line, assume that the headers are\n    # intentionally sorted the way they are.\n    if (self._last_header > header_path and\n        not Match(r'^\\s*$', clean_lines.elided[linenum - 1])):\n      return False\n    return True\n\n  def CheckNextIncludeOrder(self, header_type):\n    \"\"\"Returns a non-empty error message if the next header is out of order.\n\n    This function also updates the internal state to be ready to check\n    the next include.\n\n    Args:\n      header_type: One of the _XXX_HEADER constants defined above.\n\n    Returns:\n      The empty string if the header is in the right order, or an\n      error message describing what's wrong.\n\n    \"\"\"\n    error_message = ('Found %s after %s' %\n                     (self._TYPE_NAMES[header_type],\n                      self._SECTION_NAMES[self._section]))\n\n    last_section = self._section\n\n    if header_type == _C_SYS_HEADER:\n      if self._section <= self._C_SECTION:\n        self._section = self._C_SECTION\n      else:\n        self._last_header = ''\n        return error_message\n    elif header_type == _CPP_SYS_HEADER:\n      if self._section <= self._CPP_SECTION:\n        self._section = self._CPP_SECTION\n      else:\n        self._last_header = ''\n        return error_message\n    elif header_type == _LIKELY_MY_HEADER:\n      if self._section <= self._MY_H_SECTION:\n        self._section = self._MY_H_SECTION\n      else:\n        self._section = self._OTHER_H_SECTION\n    elif header_type == _POSSIBLE_MY_HEADER:\n      if self._section <= self._MY_H_SECTION:\n        self._section = self._MY_H_SECTION\n      else:\n        # This will always be the fallback because we're not sure\n        # enough that the header is associated with this file.\n        self._section = self._OTHER_H_SECTION\n    else:\n      assert header_type == _OTHER_HEADER\n      self._section = self._OTHER_H_SECTION\n\n    if last_section != self._section:\n      self._last_header = ''\n\n    return ''\n\n\nclass _CppLintState(object):\n  \"\"\"Maintains module-wide state..\"\"\"\n\n  def __init__(self):\n    self.verbose_level = 1  # global setting.\n    self.error_count = 0    # global count of reported errors\n    # filters to apply when emitting error messages\n    self.filters = _DEFAULT_FILTERS[:]\n    self.counting = 'total'  # In what way are we counting errors?\n    self.errors_by_category = {}  # string to int dict storing error counts\n\n    # output format:\n    # \"emacs\" - format that emacs can parse (default)\n    # \"vs7\" - format that Microsoft Visual Studio 7 can parse\n    self.output_format = 'emacs'\n\n  def SetOutputFormat(self, output_format):\n    \"\"\"Sets the output format for errors.\"\"\"\n    self.output_format = output_format\n\n  def SetVerboseLevel(self, level):\n    \"\"\"Sets the module's verbosity, and returns the previous setting.\"\"\"\n    last_verbose_level = self.verbose_level\n    self.verbose_level = level\n    return last_verbose_level\n\n  def SetCountingStyle(self, counting_style):\n    \"\"\"Sets the module's counting options.\"\"\"\n    self.counting = counting_style\n\n  def SetFilters(self, filters):\n    \"\"\"Sets the error-message filters.\n\n    These filters are applied when deciding whether to emit a given\n    error message.\n\n    Args:\n      filters: A string of comma-separated filters (eg \"+whitespace/indent\").\n               Each filter should start with + or -; else we die.\n\n    Raises:\n      ValueError: The comma-separated filters did not all start with '+' or '-'.\n                  E.g. \"-,+whitespace,-whitespace/indent,whitespace/badfilter\"\n    \"\"\"\n    # Default filters always have less priority than the flag ones.\n    self.filters = _DEFAULT_FILTERS[:]\n    for filt in filters.split(','):\n      clean_filt = filt.strip()\n      if clean_filt:\n        self.filters.append(clean_filt)\n    for filt in self.filters:\n      if not (filt.startswith('+') or filt.startswith('-')):\n        raise ValueError('Every filter in --filters must start with + or -'\n                         ' (%s does not)' % filt)\n\n  def ResetErrorCounts(self):\n    \"\"\"Sets the module's error statistic back to zero.\"\"\"\n    self.error_count = 0\n    self.errors_by_category = {}\n\n  def IncrementErrorCount(self, category):\n    \"\"\"Bumps the module's error statistic.\"\"\"\n    self.error_count += 1\n    if self.counting in ('toplevel', 'detailed'):\n      if self.counting != 'detailed':\n        category = category.split('/')[0]\n      if category not in self.errors_by_category:\n        self.errors_by_category[category] = 0\n      self.errors_by_category[category] += 1\n\n  def PrintErrorCounts(self):\n    \"\"\"Print a summary of errors by category, and the total.\"\"\"\n    for category, count in self.errors_by_category.iteritems():\n      sys.stderr.write('Category \\'%s\\' errors found: %d\\n' %\n                       (category, count))\n    sys.stderr.write('Total errors found: %d\\n' % self.error_count)\n\n_cpplint_state = _CppLintState()\n\n\ndef _OutputFormat():\n  \"\"\"Gets the module's output format.\"\"\"\n  return _cpplint_state.output_format\n\n\ndef _SetOutputFormat(output_format):\n  \"\"\"Sets the module's output format.\"\"\"\n  _cpplint_state.SetOutputFormat(output_format)\n\n\ndef _VerboseLevel():\n  \"\"\"Returns the module's verbosity setting.\"\"\"\n  return _cpplint_state.verbose_level\n\n\ndef _SetVerboseLevel(level):\n  \"\"\"Sets the module's verbosity, and returns the previous setting.\"\"\"\n  return _cpplint_state.SetVerboseLevel(level)\n\n\ndef _SetCountingStyle(level):\n  \"\"\"Sets the module's counting options.\"\"\"\n  _cpplint_state.SetCountingStyle(level)\n\n\ndef _Filters():\n  \"\"\"Returns the module's list of output filters, as a list.\"\"\"\n  return _cpplint_state.filters\n\n\ndef _SetFilters(filters):\n  \"\"\"Sets the module's error-message filters.\n\n  These filters are applied when deciding whether to emit a given\n  error message.\n\n  Args:\n    filters: A string of comma-separated filters (eg \"whitespace/indent\").\n             Each filter should start with + or -; else we die.\n  \"\"\"\n  _cpplint_state.SetFilters(filters)\n\n\nclass _FunctionState(object):\n  \"\"\"Tracks current function name and the number of lines in its body.\"\"\"\n\n  _NORMAL_TRIGGER = 250  # for --v=0, 500 for --v=1, etc.\n  _TEST_TRIGGER = 400    # about 50% more than _NORMAL_TRIGGER.\n\n  def __init__(self):\n    self.in_a_function = False\n    self.lines_in_function = 0\n    self.current_function = ''\n\n  def Begin(self, function_name):\n    \"\"\"Start analyzing function body.\n\n    Args:\n      function_name: The name of the function being tracked.\n    \"\"\"\n    self.in_a_function = True\n    self.lines_in_function = 0\n    self.current_function = function_name\n\n  def Count(self):\n    \"\"\"Count line in current function body.\"\"\"\n    if self.in_a_function:\n      self.lines_in_function += 1\n\n  def Check(self, error, filename, linenum):\n    \"\"\"Report if too many lines in function body.\n\n    Args:\n      error: The function to call with any errors found.\n      filename: The name of the current file.\n      linenum: The number of the line to check.\n    \"\"\"\n    if Match(r'T(EST|est)', self.current_function):\n      base_trigger = self._TEST_TRIGGER\n    else:\n      base_trigger = self._NORMAL_TRIGGER\n    trigger = base_trigger * 2**_VerboseLevel()\n\n    if self.lines_in_function > trigger:\n      error_level = int(math.log(self.lines_in_function / base_trigger, 2))\n      # 50 => 0, 100 => 1, 200 => 2, 400 => 3, 800 => 4, 1600 => 5, ...\n      if error_level > 5:\n        error_level = 5\n      error(filename, linenum, 'readability/fn_size', error_level,\n            'Small and focused functions are preferred:'\n            ' %s has %d non-comment lines'\n            ' (error triggered by exceeding %d lines).'  % (\n                self.current_function, self.lines_in_function, trigger))\n\n  def End(self):\n    \"\"\"Stop analyzing function body.\"\"\"\n    self.in_a_function = False\n\n\nclass _IncludeError(Exception):\n  \"\"\"Indicates a problem with the include order in a file.\"\"\"\n  pass\n\n\nclass FileInfo:\n  \"\"\"Provides utility functions for filenames.\n\n  FileInfo provides easy access to the components of a file's path\n  relative to the project root.\n  \"\"\"\n\n  def __init__(self, filename):\n    self._filename = filename\n\n  def FullName(self):\n    \"\"\"Make Windows paths like Unix.\"\"\"\n    return os.path.abspath(self._filename).replace('\\\\', '/')\n\n  def RepositoryName(self):\n    \"\"\"FullName after removing the local path to the repository.\n\n    If we have a real absolute path name here we can try to do something smart:\n    detecting the root of the checkout and truncating /path/to/checkout from\n    the name so that we get header guards that don't include things like\n    \"C:\\Documents and Settings\\...\" or \"/home/username/...\" in them and thus\n    people on different computers who have checked the source out to different\n    locations won't see bogus errors.\n    \"\"\"\n    fullname = self.FullName()\n\n    if os.path.exists(fullname):\n      project_dir = os.path.dirname(fullname)\n\n      if os.path.exists(os.path.join(project_dir, \".svn\")):\n        # If there's a .svn file in the current directory, we recursively look\n        # up the directory tree for the top of the SVN checkout\n        root_dir = project_dir\n        one_up_dir = os.path.dirname(root_dir)\n        while os.path.exists(os.path.join(one_up_dir, \".svn\")):\n          root_dir = os.path.dirname(root_dir)\n          one_up_dir = os.path.dirname(one_up_dir)\n\n        prefix = os.path.commonprefix([root_dir, project_dir])\n        return fullname[len(prefix) + 1:]\n\n      # Not SVN <= 1.6? Try to find a git, hg, or svn top level directory by\n      # searching up from the current path.\n      root_dir = os.path.dirname(fullname)\n      while (root_dir != os.path.dirname(root_dir) and\n             not os.path.exists(os.path.join(root_dir, \".git\")) and\n             not os.path.exists(os.path.join(root_dir, \".hg\")) and\n             not os.path.exists(os.path.join(root_dir, \".svn\"))):\n        root_dir = os.path.dirname(root_dir)\n\n      if (os.path.exists(os.path.join(root_dir, \".git\")) or\n          os.path.exists(os.path.join(root_dir, \".hg\")) or\n          os.path.exists(os.path.join(root_dir, \".svn\"))):\n        prefix = os.path.commonprefix([root_dir, project_dir])\n        return fullname[len(prefix) + 1:]\n\n    # Don't know what to do; header guard warnings may be wrong...\n    return fullname\n\n  def Split(self):\n    \"\"\"Splits the file into the directory, basename, and extension.\n\n    For 'chrome/browser/browser.cc', Split() would\n    return ('chrome/browser', 'browser', '.cc')\n\n    Returns:\n      A tuple of (directory, basename, extension).\n    \"\"\"\n\n    googlename = self.RepositoryName()\n    project, rest = os.path.split(googlename)\n    return (project,) + os.path.splitext(rest)\n\n  def BaseName(self):\n    \"\"\"File base name - text after the final slash, before the final period.\"\"\"\n    return self.Split()[1]\n\n  def Extension(self):\n    \"\"\"File extension - text following the final period.\"\"\"\n    return self.Split()[2]\n\n  def NoExtension(self):\n    \"\"\"File has no source file extension.\"\"\"\n    return '/'.join(self.Split()[0:2])\n\n  def IsSource(self):\n    \"\"\"File has a source file extension.\"\"\"\n    return self.Extension()[1:] in ('c', 'cc', 'cpp', 'cxx')\n\n\ndef _ShouldPrintError(category, confidence, linenum):\n  \"\"\"If confidence >= verbose, category passes filter and is not suppressed.\"\"\"\n\n  # There are three ways we might decide not to print an error message:\n  # a \"NOLINT(category)\" comment appears in the source,\n  # the verbosity level isn't high enough, or the filters filter it out.\n  if IsErrorSuppressedByNolint(category, linenum):\n    return False\n\n  if confidence < _cpplint_state.verbose_level:\n    return False\n\n  is_filtered = False\n  for one_filter in _Filters():\n    if one_filter.startswith('-'):\n      if category.startswith(one_filter[1:]):\n        is_filtered = True\n    elif one_filter.startswith('+'):\n      if category.startswith(one_filter[1:]):\n        is_filtered = False\n    else:\n      assert False  # should have been checked for in SetFilter.\n  if is_filtered:\n    return False\n\n  return True\n\n\ndef Error(filename, linenum, category, confidence, message):\n  \"\"\"Logs the fact we've found a lint error.\n\n  We log where the error was found, and also our confidence in the error,\n  that is, how certain we are this is a legitimate style regression, and\n  not a misidentification or a use that's sometimes justified.\n\n  False positives can be suppressed by the use of\n  \"cpplint(category)\"  comments on the offending line.  These are\n  parsed into _error_suppressions.\n\n  Args:\n    filename: The name of the file containing the error.\n    linenum: The number of the line containing the error.\n    category: A string used to describe the \"category\" this bug\n      falls under: \"whitespace\", say, or \"runtime\".  Categories\n      may have a hierarchy separated by slashes: \"whitespace/indent\".\n    confidence: A number from 1-5 representing a confidence score for\n      the error, with 5 meaning that we are certain of the problem,\n      and 1 meaning that it could be a legitimate construct.\n    message: The error message.\n  \"\"\"\n  if _ShouldPrintError(category, confidence, linenum):\n    _cpplint_state.IncrementErrorCount(category)\n    if _cpplint_state.output_format == 'vs7':\n      sys.stderr.write('%s(%s):  %s  [%s] [%d]\\n' % (\n          filename, linenum, message, category, confidence))\n    elif _cpplint_state.output_format == 'eclipse':\n      sys.stderr.write('%s:%s: warning: %s  [%s] [%d]\\n' % (\n          filename, linenum, message, category, confidence))\n    else:\n      sys.stderr.write('%s:%s:  %s  [%s] [%d]\\n' % (\n          filename, linenum, message, category, confidence))\n\n\n# Matches standard C++ escape sequences per 2.13.2.3 of the C++ standard.\n_RE_PATTERN_CLEANSE_LINE_ESCAPES = re.compile(\n    r'\\\\([abfnrtv?\"\\\\\\']|\\d+|x[0-9a-fA-F]+)')\n# Match a single C style comment on the same line.\n_RE_PATTERN_C_COMMENTS = r'/\\*(?:[^*]|\\*(?!/))*\\*/'\n# Matches multi-line C style comments.\n# This RE is a little bit more complicated than one might expect, because we\n# have to take care of space removals tools so we can handle comments inside\n# statements better.\n# The current rule is: We only clear spaces from both sides when we're at the\n# end of the line. Otherwise, we try to remove spaces from the right side,\n# if this doesn't work we try on left side but only if there's a non-character\n# on the right.\n_RE_PATTERN_CLEANSE_LINE_C_COMMENTS = re.compile(\n    r'(\\s*' + _RE_PATTERN_C_COMMENTS + r'\\s*$|' +\n    _RE_PATTERN_C_COMMENTS + r'\\s+|' +\n    r'\\s+' + _RE_PATTERN_C_COMMENTS + r'(?=\\W)|' +\n    _RE_PATTERN_C_COMMENTS + r')')\n\n\ndef IsCppString(line):\n  \"\"\"Does line terminate so, that the next symbol is in string constant.\n\n  This function does not consider single-line nor multi-line comments.\n\n  Args:\n    line: is a partial line of code starting from the 0..n.\n\n  Returns:\n    True, if next character appended to 'line' is inside a\n    string constant.\n  \"\"\"\n\n  line = line.replace(r'\\\\', 'XX')  # after this, \\\\\" does not match to \\\"\n  return ((line.count('\"') - line.count(r'\\\"') - line.count(\"'\\\"'\")) & 1) == 1\n\n\ndef CleanseRawStrings(raw_lines):\n  \"\"\"Removes C++11 raw strings from lines.\n\n    Before:\n      static const char kData[] = R\"(\n          multi-line string\n          )\";\n\n    After:\n      static const char kData[] = \"\"\n          (replaced by blank line)\n          \"\";\n\n  Args:\n    raw_lines: list of raw lines.\n\n  Returns:\n    list of lines with C++11 raw strings replaced by empty strings.\n  \"\"\"\n\n  delimiter = None\n  lines_without_raw_strings = []\n  for line in raw_lines:\n    if delimiter:\n      # Inside a raw string, look for the end\n      end = line.find(delimiter)\n      if end >= 0:\n        # Found the end of the string, match leading space for this\n        # line and resume copying the original lines, and also insert\n        # a \"\" on the last line.\n        leading_space = Match(r'^(\\s*)\\S', line)\n        line = leading_space.group(1) + '\"\"' + line[end + len(delimiter):]\n        delimiter = None\n      else:\n        # Haven't found the end yet, append a blank line.\n        line = '\"\"'\n\n    # Look for beginning of a raw string, and replace them with\n    # empty strings.  This is done in a loop to handle multiple raw\n    # strings on the same line.\n    while delimiter is None:\n      # Look for beginning of a raw string.\n      # See 2.14.15 [lex.string] for syntax.\n      matched = Match(r'^(.*)\\b(?:R|u8R|uR|UR|LR)\"([^\\s\\\\()]*)\\((.*)$', line)\n      if matched:\n        delimiter = ')' + matched.group(2) + '\"'\n\n        end = matched.group(3).find(delimiter)\n        if end >= 0:\n          # Raw string ended on same line\n          line = (matched.group(1) + '\"\"' +\n                  matched.group(3)[end + len(delimiter):])\n          delimiter = None\n        else:\n          # Start of a multi-line raw string\n          line = matched.group(1) + '\"\"'\n      else:\n        break\n\n    lines_without_raw_strings.append(line)\n\n  # TODO(unknown): if delimiter is not None here, we might want to\n  # emit a warning for unterminated string.\n  return lines_without_raw_strings\n\n\ndef FindNextMultiLineCommentStart(lines, lineix):\n  \"\"\"Find the beginning marker for a multiline comment.\"\"\"\n  while lineix < len(lines):\n    if lines[lineix].strip().startswith('/*'):\n      # Only return this marker if the comment goes beyond this line\n      if lines[lineix].strip().find('*/', 2) < 0:\n        return lineix\n    lineix += 1\n  return len(lines)\n\n\ndef FindNextMultiLineCommentEnd(lines, lineix):\n  \"\"\"We are inside a comment, find the end marker.\"\"\"\n  while lineix < len(lines):\n    if lines[lineix].strip().endswith('*/'):\n      return lineix\n    lineix += 1\n  return len(lines)\n\n\ndef RemoveMultiLineCommentsFromRange(lines, begin, end):\n  \"\"\"Clears a range of lines for multi-line comments.\"\"\"\n  # Having // dummy comments makes the lines non-empty, so we will not get\n  # unnecessary blank line warnings later in the code.\n  for i in range(begin, end):\n    lines[i] = '// dummy'\n\n\ndef RemoveMultiLineComments(filename, lines, error):\n  \"\"\"Removes multiline (c-style) comments from lines.\"\"\"\n  lineix = 0\n  while lineix < len(lines):\n    lineix_begin = FindNextMultiLineCommentStart(lines, lineix)\n    if lineix_begin >= len(lines):\n      return\n    lineix_end = FindNextMultiLineCommentEnd(lines, lineix_begin)\n    if lineix_end >= len(lines):\n      error(filename, lineix_begin + 1, 'readability/multiline_comment', 5,\n            'Could not find end of multi-line comment')\n      return\n    RemoveMultiLineCommentsFromRange(lines, lineix_begin, lineix_end + 1)\n    lineix = lineix_end + 1\n\n\ndef CleanseComments(line):\n  \"\"\"Removes //-comments and single-line C-style /* */ comments.\n\n  Args:\n    line: A line of C++ source.\n\n  Returns:\n    The line with single-line comments removed.\n  \"\"\"\n  commentpos = line.find('//')\n  if commentpos != -1 and not IsCppString(line[:commentpos]):\n    line = line[:commentpos].rstrip()\n  # get rid of /* ... */\n  return _RE_PATTERN_CLEANSE_LINE_C_COMMENTS.sub('', line)\n\n\nclass CleansedLines(object):\n  \"\"\"Holds 3 copies of all lines with different preprocessing applied to them.\n\n  1) elided member contains lines without strings and comments,\n  2) lines member contains lines without comments, and\n  3) raw_lines member contains all the lines without processing.\n  All these three members are of <type 'list'>, and of the same length.\n  \"\"\"\n\n  def __init__(self, lines):\n    self.elided = []\n    self.lines = []\n    self.raw_lines = lines\n    self.num_lines = len(lines)\n    self.lines_without_raw_strings = CleanseRawStrings(lines)\n    for linenum in range(len(self.lines_without_raw_strings)):\n      self.lines.append(CleanseComments(\n          self.lines_without_raw_strings[linenum]))\n      elided = self._CollapseStrings(self.lines_without_raw_strings[linenum])\n      self.elided.append(CleanseComments(elided))\n\n  def NumLines(self):\n    \"\"\"Returns the number of lines represented.\"\"\"\n    return self.num_lines\n\n  @staticmethod\n  def _CollapseStrings(elided):\n    \"\"\"Collapses strings and chars on a line to simple \"\" or '' blocks.\n\n    We nix strings first so we're not fooled by text like '\"http://\"'\n\n    Args:\n      elided: The line being processed.\n\n    Returns:\n      The line with collapsed strings.\n    \"\"\"\n    if _RE_PATTERN_INCLUDE.match(elided):\n      return elided\n\n    # Remove escaped characters first to make quote/single quote collapsing\n    # basic.  Things that look like escaped characters shouldn't occur\n    # outside of strings and chars.\n    elided = _RE_PATTERN_CLEANSE_LINE_ESCAPES.sub('', elided)\n\n    # Replace quoted strings and digit separators.  Both single quotes\n    # and double quotes are processed in the same loop, otherwise\n    # nested quotes wouldn't work.\n    collapsed = ''\n    while True:\n      # Find the first quote character\n      match = Match(r'^([^\\'\"]*)([\\'\"])(.*)$', elided)\n      if not match:\n        collapsed += elided\n        break\n      head, quote, tail = match.groups()\n\n      if quote == '\"':\n        # Collapse double quoted strings\n        second_quote = tail.find('\"')\n        if second_quote >= 0:\n          collapsed += head + '\"\"'\n          elided = tail[second_quote + 1:]\n        else:\n          # Unmatched double quote, don't bother processing the rest\n          # of the line since this is probably a multiline string.\n          collapsed += elided\n          break\n      else:\n        # Found single quote, check nearby text to eliminate digit separators.\n        #\n        # There is no special handling for floating point here, because\n        # the integer/fractional/exponent parts would all be parsed\n        # correctly as long as there are digits on both sides of the\n        # separator.  So we are fine as long as we don't see something\n        # like \"0.'3\" (gcc 4.9.0 will not allow this literal).\n        if Search(r'\\b(?:0[bBxX]?|[1-9])[0-9a-fA-F]*$', head):\n          match_literal = Match(r'^((?:\\'?[0-9a-zA-Z_])*)(.*)$', \"'\" + tail)\n          collapsed += head + match_literal.group(1).replace(\"'\", '')\n          elided = match_literal.group(2)\n        else:\n          second_quote = tail.find('\\'')\n          if second_quote >= 0:\n            collapsed += head + \"''\"\n            elided = tail[second_quote + 1:]\n          else:\n            # Unmatched single quote\n            collapsed += elided\n            break\n\n    return collapsed\n\n\ndef FindEndOfExpressionInLine(line, startpos, stack):\n  \"\"\"Find the position just after the end of current parenthesized expression.\n\n  Args:\n    line: a CleansedLines line.\n    startpos: start searching at this position.\n    stack: nesting stack at startpos.\n\n  Returns:\n    On finding matching end: (index just after matching end, None)\n    On finding an unclosed expression: (-1, None)\n    Otherwise: (-1, new stack at end of this line)\n  \"\"\"\n  for i in xrange(startpos, len(line)):\n    char = line[i]\n    if char in '([{':\n      # Found start of parenthesized expression, push to expression stack\n      stack.append(char)\n    elif char == '<':\n      # Found potential start of template argument list\n      if i > 0 and line[i - 1] == '<':\n        # Left shift operator\n        if stack and stack[-1] == '<':\n          stack.pop()\n          if not stack:\n            return (-1, None)\n      elif i > 0 and Search(r'\\boperator\\s*$', line[0:i]):\n        # operator<, don't add to stack\n        continue\n      else:\n        # Tentative start of template argument list\n        stack.append('<')\n    elif char in ')]}':\n      # Found end of parenthesized expression.\n      #\n      # If we are currently expecting a matching '>', the pending '<'\n      # must have been an operator.  Remove them from expression stack.\n      while stack and stack[-1] == '<':\n        stack.pop()\n      if not stack:\n        return (-1, None)\n      if ((stack[-1] == '(' and char == ')') or\n          (stack[-1] == '[' and char == ']') or\n          (stack[-1] == '{' and char == '}')):\n        stack.pop()\n        if not stack:\n          return (i + 1, None)\n      else:\n        # Mismatched parentheses\n        return (-1, None)\n    elif char == '>':\n      # Found potential end of template argument list.\n\n      # Ignore \"->\" and operator functions\n      if (i > 0 and\n          (line[i - 1] == '-' or Search(r'\\boperator\\s*$', line[0:i - 1]))):\n        continue\n\n      # Pop the stack if there is a matching '<'.  Otherwise, ignore\n      # this '>' since it must be an operator.\n      if stack:\n        if stack[-1] == '<':\n          stack.pop()\n          if not stack:\n            return (i + 1, None)\n    elif char == ';':\n      # Found something that look like end of statements.  If we are currently\n      # expecting a '>', the matching '<' must have been an operator, since\n      # template argument list should not contain statements.\n      while stack and stack[-1] == '<':\n        stack.pop()\n      if not stack:\n        return (-1, None)\n\n  # Did not find end of expression or unbalanced parentheses on this line\n  return (-1, stack)\n\n\ndef CloseExpression(clean_lines, linenum, pos):\n  \"\"\"If input points to ( or { or [ or <, finds the position that closes it.\n\n  If lines[linenum][pos] points to a '(' or '{' or '[' or '<', finds the\n  linenum/pos that correspond to the closing of the expression.\n\n  TODO(unknown): cpplint spends a fair bit of time matching parentheses.\n  Ideally we would want to index all opening and closing parentheses once\n  and have CloseExpression be just a simple lookup, but due to preprocessor\n  tricks, this is not so easy.\n\n  Args:\n    clean_lines: A CleansedLines instance containing the file.\n    linenum: The number of the line to check.\n    pos: A position on the line.\n\n  Returns:\n    A tuple (line, linenum, pos) pointer *past* the closing brace, or\n    (line, len(lines), -1) if we never find a close.  Note we ignore\n    strings and comments when matching; and the line we return is the\n    'cleansed' line at linenum.\n  \"\"\"\n\n  line = clean_lines.elided[linenum]\n  if (line[pos] not in '({[<') or Match(r'<[<=]', line[pos:]):\n    return (line, clean_lines.NumLines(), -1)\n\n  # Check first line\n  (end_pos, stack) = FindEndOfExpressionInLine(line, pos, [])\n  if end_pos > -1:\n    return (line, linenum, end_pos)\n\n  # Continue scanning forward\n  while stack and linenum < clean_lines.NumLines() - 1:\n    linenum += 1\n    line = clean_lines.elided[linenum]\n    (end_pos, stack) = FindEndOfExpressionInLine(line, 0, stack)\n    if end_pos > -1:\n      return (line, linenum, end_pos)\n\n  # Did not find end of expression before end of file, give up\n  return (line, clean_lines.NumLines(), -1)\n\n\ndef FindStartOfExpressionInLine(line, endpos, stack):\n  \"\"\"Find position at the matching start of current expression.\n\n  This is almost the reverse of FindEndOfExpressionInLine, but note\n  that the input position and returned position differs by 1.\n\n  Args:\n    line: a CleansedLines line.\n    endpos: start searching at this position.\n    stack: nesting stack at endpos.\n\n  Returns:\n    On finding matching start: (index at matching start, None)\n    On finding an unclosed expression: (-1, None)\n    Otherwise: (-1, new stack at beginning of this line)\n  \"\"\"\n  i = endpos\n  while i >= 0:\n    char = line[i]\n    if char in ')]}':\n      # Found end of expression, push to expression stack\n      stack.append(char)\n    elif char == '>':\n      # Found potential end of template argument list.\n      #\n      # Ignore it if it's a \"->\" or \">=\" or \"operator>\"\n      if (i > 0 and\n          (line[i - 1] == '-' or\n           Match(r'\\s>=\\s', line[i - 1:]) or\n           Search(r'\\boperator\\s*$', line[0:i]))):\n        i -= 1\n      else:\n        stack.append('>')\n    elif char == '<':\n      # Found potential start of template argument list\n      if i > 0 and line[i - 1] == '<':\n        # Left shift operator\n        i -= 1\n      else:\n        # If there is a matching '>', we can pop the expression stack.\n        # Otherwise, ignore this '<' since it must be an operator.\n        if stack and stack[-1] == '>':\n          stack.pop()\n          if not stack:\n            return (i, None)\n    elif char in '([{':\n      # Found start of expression.\n      #\n      # If there are any unmatched '>' on the stack, they must be\n      # operators.  Remove those.\n      while stack and stack[-1] == '>':\n        stack.pop()\n      if not stack:\n        return (-1, None)\n      if ((char == '(' and stack[-1] == ')') or\n          (char == '[' and stack[-1] == ']') or\n          (char == '{' and stack[-1] == '}')):\n        stack.pop()\n        if not stack:\n          return (i, None)\n      else:\n        # Mismatched parentheses\n        return (-1, None)\n    elif char == ';':\n      # Found something that look like end of statements.  If we are currently\n      # expecting a '<', the matching '>' must have been an operator, since\n      # template argument list should not contain statements.\n      while stack and stack[-1] == '>':\n        stack.pop()\n      if not stack:\n        return (-1, None)\n\n    i -= 1\n\n  return (-1, stack)\n\n\ndef ReverseCloseExpression(clean_lines, linenum, pos):\n  \"\"\"If input points to ) or } or ] or >, finds the position that opens it.\n\n  If lines[linenum][pos] points to a ')' or '}' or ']' or '>', finds the\n  linenum/pos that correspond to the opening of the expression.\n\n  Args:\n    clean_lines: A CleansedLines instance containing the file.\n    linenum: The number of the line to check.\n    pos: A position on the line.\n\n  Returns:\n    A tuple (line, linenum, pos) pointer *at* the opening brace, or\n    (line, 0, -1) if we never find the matching opening brace.  Note\n    we ignore strings and comments when matching; and the line we\n    return is the 'cleansed' line at linenum.\n  \"\"\"\n  line = clean_lines.elided[linenum]\n  if line[pos] not in ')}]>':\n    return (line, 0, -1)\n\n  # Check last line\n  (start_pos, stack) = FindStartOfExpressionInLine(line, pos, [])\n  if start_pos > -1:\n    return (line, linenum, start_pos)\n\n  # Continue scanning backward\n  while stack and linenum > 0:\n    linenum -= 1\n    line = clean_lines.elided[linenum]\n    (start_pos, stack) = FindStartOfExpressionInLine(line, len(line) - 1, stack)\n    if start_pos > -1:\n      return (line, linenum, start_pos)\n\n  # Did not find start of expression before beginning of file, give up\n  return (line, 0, -1)\n\n\ndef CheckForCopyright(filename, lines, error):\n  \"\"\"Logs an error if no Copyright message appears at the top of the file.\"\"\"\n\n  # We'll say it should occur by line 10. Don't forget there's a\n  # dummy line at the front.\n  for line in xrange(1, min(len(lines), 11)):\n    if re.search(r'Copyright', lines[line], re.I): break\n  else:                       # means no copyright line was found\n    error(filename, 0, 'legal/copyright', 5,\n          'No copyright message found.  '\n          'You should have a line: \"Copyright [year] <Copyright Owner>\"')\n\n\ndef GetIndentLevel(line):\n  \"\"\"Return the number of leading spaces in line.\n\n  Args:\n    line: A string to check.\n\n  Returns:\n    An integer count of leading spaces, possibly zero.\n  \"\"\"\n  indent = Match(r'^( *)\\S', line)\n  if indent:\n    return len(indent.group(1))\n  else:\n    return 0\n\n\ndef GetHeaderGuardCPPVariable(filename):\n  \"\"\"Returns the CPP variable that should be used as a header guard.\n\n  Args:\n    filename: The name of a C++ header file.\n\n  Returns:\n    The CPP variable that should be used as a header guard in the\n    named file.\n\n  \"\"\"\n\n  # Restores original filename in case that cpplint is invoked from Emacs's\n  # flymake.\n  filename = re.sub(r'_flymake\\.h$', '.h', filename)\n  filename = re.sub(r'/\\.flymake/([^/]*)$', r'/\\1', filename)\n\n  fileinfo = FileInfo(filename)\n  file_path_from_root = fileinfo.RepositoryName()\n  if _root:\n    file_path_from_root = re.sub('^' + _root + '\\/', '', file_path_from_root)\n  return re.sub(r'[-./\\s]', '_', file_path_from_root).upper() + '_'\n\n\ndef CheckForHeaderGuard(filename, lines, error):\n  \"\"\"Checks that the file contains a header guard.\n\n  Logs an error if no #ifndef header guard is present.  For other\n  headers, checks that the full pathname is used.\n\n  Args:\n    filename: The name of the C++ header file.\n    lines: An array of strings, each representing a line of the file.\n    error: The function to call with any errors found.\n  \"\"\"\n\n  cppvar = GetHeaderGuardCPPVariable(filename)\n\n  ifndef = None\n  ifndef_linenum = 0\n  define = None\n  endif = None\n  endif_linenum = 0\n  for linenum, line in enumerate(lines):\n    linesplit = line.split()\n    if len(linesplit) >= 2:\n      # find the first occurrence of #ifndef and #define, save arg\n      if not ifndef and linesplit[0] == '#ifndef':\n        # set ifndef to the header guard presented on the #ifndef line.\n        ifndef = linesplit[1]\n        ifndef_linenum = linenum\n      if not define and linesplit[0] == '#define':\n        define = linesplit[1]\n    # find the last occurrence of #endif, save entire line\n    if line.startswith('#endif'):\n      endif = line\n      endif_linenum = linenum\n\n  if not ifndef:\n    error(filename, 0, 'build/header_guard', 5,\n          'No #ifndef header guard found, suggested CPP variable is: %s' %\n          cppvar)\n    return\n\n  if not define:\n    error(filename, 0, 'build/header_guard', 5,\n          'No #define header guard found, suggested CPP variable is: %s' %\n          cppvar)\n    return\n\n  # The guard should be PATH_FILE_H_, but we also allow PATH_FILE_H__\n  # for backward compatibility.\n  if ifndef != cppvar:\n    error_level = 0\n    if ifndef != cppvar + '_':\n      error_level = 5\n\n    ParseNolintSuppressions(filename, lines[ifndef_linenum], ifndef_linenum,\n                            error)\n    error(filename, ifndef_linenum, 'build/header_guard', error_level,\n          '#ifndef header guard has wrong style, please use: %s' % cppvar)\n\n  if define != ifndef:\n    error(filename, 0, 'build/header_guard', 5,\n          '#ifndef and #define don\\'t match, suggested CPP variable is: %s' %\n          cppvar)\n    return\n\n  if endif != ('#endif  // %s' % cppvar):\n    error_level = 0\n    if endif != ('#endif  // %s' % (cppvar + '_')):\n      error_level = 5\n\n    ParseNolintSuppressions(filename, lines[endif_linenum], endif_linenum,\n                            error)\n    error(filename, endif_linenum, 'build/header_guard', error_level,\n          '#endif line should be \"#endif  // %s\"' % cppvar)\n\n\ndef CheckForBadCharacters(filename, lines, error):\n  \"\"\"Logs an error for each line containing bad characters.\n\n  Two kinds of bad characters:\n\n  1. Unicode replacement characters: These indicate that either the file\n  contained invalid UTF-8 (likely) or Unicode replacement characters (which\n  it shouldn't).  Note that it's possible for this to throw off line\n  numbering if the invalid UTF-8 occurred adjacent to a newline.\n\n  2. NUL bytes.  These are problematic for some tools.\n\n  Args:\n    filename: The name of the current file.\n    lines: An array of strings, each representing a line of the file.\n    error: The function to call with any errors found.\n  \"\"\"\n  for linenum, line in enumerate(lines):\n    if u'\\ufffd' in line:\n      error(filename, linenum, 'readability/utf8', 5,\n            'Line contains invalid UTF-8 (or Unicode replacement character).')\n    if '\\0' in line:\n      error(filename, linenum, 'readability/nul', 5, 'Line contains NUL byte.')\n\n\ndef CheckForNewlineAtEOF(filename, lines, error):\n  \"\"\"Logs an error if there is no newline char at the end of the file.\n\n  Args:\n    filename: The name of the current file.\n    lines: An array of strings, each representing a line of the file.\n    error: The function to call with any errors found.\n  \"\"\"\n\n  # The array lines() was created by adding two newlines to the\n  # original file (go figure), then splitting on \\n.\n  # To verify that the file ends in \\n, we just have to make sure the\n  # last-but-two element of lines() exists and is empty.\n  if len(lines) < 3 or lines[-2]:\n    error(filename, len(lines) - 2, 'whitespace/ending_newline', 5,\n          'Could not find a newline character at the end of the file.')\n\n\ndef CheckForMultilineCommentsAndStrings(filename, clean_lines, linenum, error):\n  \"\"\"Logs an error if we see /* ... */ or \"...\" that extend past one line.\n\n  /* ... */ comments are legit inside macros, for one line.\n  Otherwise, we prefer // comments, so it's ok to warn about the\n  other.  Likewise, it's ok for strings to extend across multiple\n  lines, as long as a line continuation character (backslash)\n  terminates each line. Although not currently prohibited by the C++\n  style guide, it's ugly and unnecessary. We don't do well with either\n  in this lint program, so we warn about both.\n\n  Args:\n    filename: The name of the current file.\n    clean_lines: A CleansedLines instance containing the file.\n    linenum: The number of the line to check.\n    error: The function to call with any errors found.\n  \"\"\"\n  line = clean_lines.elided[linenum]\n\n  # Remove all \\\\ (escaped backslashes) from the line. They are OK, and the\n  # second (escaped) slash may trigger later \\\" detection erroneously.\n  line = line.replace('\\\\\\\\', '')\n\n  if line.count('/*') > line.count('*/'):\n    error(filename, linenum, 'readability/multiline_comment', 5,\n          'Complex multi-line /*...*/-style comment found. '\n          'Lint may give bogus warnings.  '\n          'Consider replacing these with //-style comments, '\n          'with #if 0...#endif, '\n          'or with more clearly structured multi-line comments.')\n\n  if (line.count('\"') - line.count('\\\\\"')) % 2:\n    error(filename, linenum, 'readability/multiline_string', 5,\n          'Multi-line string (\"...\") found.  This lint script doesn\\'t '\n          'do well with such strings, and may give bogus warnings.  '\n          'Use C++11 raw strings or concatenation instead.')\n\n\n# (non-threadsafe name, thread-safe alternative, validation pattern)\n#\n# The validation pattern is used to eliminate false positives such as:\n#  _rand();               // false positive due to substring match.\n#  ->rand();              // some member function rand().\n#  ACMRandom rand(seed);  // some variable named rand.\n#  ISAACRandom rand();    // another variable named rand.\n#\n# Basically we require the return value of these functions to be used\n# in some expression context on the same line by matching on some\n# operator before the function name.  This eliminates constructors and\n# member function calls.\n_UNSAFE_FUNC_PREFIX = r'(?:[-+*/=%^&|(<]\\s*|>\\s+)'\n_THREADING_LIST = (\n    ('asctime(', 'asctime_r(', _UNSAFE_FUNC_PREFIX + r'asctime\\([^)]+\\)'),\n    ('ctime(', 'ctime_r(', _UNSAFE_FUNC_PREFIX + r'ctime\\([^)]+\\)'),\n    ('getgrgid(', 'getgrgid_r(', _UNSAFE_FUNC_PREFIX + r'getgrgid\\([^)]+\\)'),\n    ('getgrnam(', 'getgrnam_r(', _UNSAFE_FUNC_PREFIX + r'getgrnam\\([^)]+\\)'),\n    ('getlogin(', 'getlogin_r(', _UNSAFE_FUNC_PREFIX + r'getlogin\\(\\)'),\n    ('getpwnam(', 'getpwnam_r(', _UNSAFE_FUNC_PREFIX + r'getpwnam\\([^)]+\\)'),\n    ('getpwuid(', 'getpwuid_r(', _UNSAFE_FUNC_PREFIX + r'getpwuid\\([^)]+\\)'),\n    ('gmtime(', 'gmtime_r(', _UNSAFE_FUNC_PREFIX + r'gmtime\\([^)]+\\)'),\n    ('localtime(', 'localtime_r(', _UNSAFE_FUNC_PREFIX + r'localtime\\([^)]+\\)'),\n    ('rand(', 'rand_r(', _UNSAFE_FUNC_PREFIX + r'rand\\(\\)'),\n    ('strtok(', 'strtok_r(',\n     _UNSAFE_FUNC_PREFIX + r'strtok\\([^)]+\\)'),\n    ('ttyname(', 'ttyname_r(', _UNSAFE_FUNC_PREFIX + r'ttyname\\([^)]+\\)'),\n    )\n\n\ndef CheckPosixThreading(filename, clean_lines, linenum, error):\n  \"\"\"Checks for calls to thread-unsafe functions.\n\n  Much code has been originally written without consideration of\n  multi-threading. Also, engineers are relying on their old experience;\n  they have learned posix before threading extensions were added. These\n  tests guide the engineers to use thread-safe functions (when using\n  posix directly).\n\n  Args:\n    filename: The name of the current file.\n    clean_lines: A CleansedLines instance containing the file.\n    linenum: The number of the line to check.\n    error: The function to call with any errors found.\n  \"\"\"\n  line = clean_lines.elided[linenum]\n  for single_thread_func, multithread_safe_func, pattern in _THREADING_LIST:\n    # Additional pattern matching check to confirm that this is the\n    # function we are looking for\n    if Search(pattern, line):\n      error(filename, linenum, 'runtime/threadsafe_fn', 2,\n            'Consider using ' + multithread_safe_func +\n            '...) instead of ' + single_thread_func +\n            '...) for improved thread safety.')\n\n\ndef CheckVlogArguments(filename, clean_lines, linenum, error):\n  \"\"\"Checks that VLOG() is only used for defining a logging level.\n\n  For example, VLOG(2) is correct. VLOG(INFO), VLOG(WARNING), VLOG(ERROR), and\n  VLOG(FATAL) are not.\n\n  Args:\n    filename: The name of the current file.\n    clean_lines: A CleansedLines instance containing the file.\n    linenum: The number of the line to check.\n    error: The function to call with any errors found.\n  \"\"\"\n  line = clean_lines.elided[linenum]\n  if Search(r'\\bVLOG\\((INFO|ERROR|WARNING|DFATAL|FATAL)\\)', line):\n    error(filename, linenum, 'runtime/vlog', 5,\n          'VLOG() should be used with numeric verbosity level.  '\n          'Use LOG() if you want symbolic severity levels.')\n\n# Matches invalid increment: *count++, which moves pointer instead of\n# incrementing a value.\n_RE_PATTERN_INVALID_INCREMENT = re.compile(\n    r'^\\s*\\*\\w+(\\+\\+|--);')\n\n\ndef CheckInvalidIncrement(filename, clean_lines, linenum, error):\n  \"\"\"Checks for invalid increment *count++.\n\n  For example following function:\n  void increment_counter(int* count) {\n    *count++;\n  }\n  is invalid, because it effectively does count++, moving pointer, and should\n  be replaced with ++*count, (*count)++ or *count += 1.\n\n  Args:\n    filename: The name of the current file.\n    clean_lines: A CleansedLines instance containing the file.\n    linenum: The number of the line to check.\n    error: The function to call with any errors found.\n  \"\"\"\n  line = clean_lines.elided[linenum]\n  if _RE_PATTERN_INVALID_INCREMENT.match(line):\n    error(filename, linenum, 'runtime/invalid_increment', 5,\n          'Changing pointer instead of value (or unused value of operator*).')\n\n\nclass _BlockInfo(object):\n  \"\"\"Stores information about a generic block of code.\"\"\"\n\n  def __init__(self, seen_open_brace):\n    self.seen_open_brace = seen_open_brace\n    self.open_parentheses = 0\n    self.inline_asm = _NO_ASM\n\n  def CheckBegin(self, filename, clean_lines, linenum, error):\n    \"\"\"Run checks that applies to text up to the opening brace.\n\n    This is mostly for checking the text after the class identifier\n    and the \"{\", usually where the base class is specified.  For other\n    blocks, there isn't much to check, so we always pass.\n\n    Args:\n      filename: The name of the current file.\n      clean_lines: A CleansedLines instance containing the file.\n      linenum: The number of the line to check.\n      error: The function to call with any errors found.\n    \"\"\"\n    pass\n\n  def CheckEnd(self, filename, clean_lines, linenum, error):\n    \"\"\"Run checks that applies to text after the closing brace.\n\n    This is mostly used for checking end of namespace comments.\n\n    Args:\n      filename: The name of the current file.\n      clean_lines: A CleansedLines instance containing the file.\n      linenum: The number of the line to check.\n      error: The function to call with any errors found.\n    \"\"\"\n    pass\n\n  def IsBlockInfo(self):\n    \"\"\"Returns true if this block is a _BlockInfo.\n\n    This is convenient for verifying that an object is an instance of\n    a _BlockInfo, but not an instance of any of the derived classes.\n\n    Returns:\n      True for this class, False for derived classes.\n    \"\"\"\n    return self.__class__ == _BlockInfo\n\n\nclass _ExternCInfo(_BlockInfo):\n  \"\"\"Stores information about an 'extern \"C\"' block.\"\"\"\n\n  def __init__(self):\n    _BlockInfo.__init__(self, True)\n\n\nclass _ClassInfo(_BlockInfo):\n  \"\"\"Stores information about a class.\"\"\"\n\n  def __init__(self, name, class_or_struct, clean_lines, linenum):\n    _BlockInfo.__init__(self, False)\n    self.name = name\n    self.starting_linenum = linenum\n    self.is_derived = False\n    if class_or_struct == 'struct':\n      self.access = 'public'\n      self.is_struct = True\n    else:\n      self.access = 'private'\n      self.is_struct = False\n\n    # Remember initial indentation level for this class.  Using raw_lines here\n    # instead of elided to account for leading comments.\n    self.class_indent = GetIndentLevel(clean_lines.raw_lines[linenum])\n\n    # Try to find the end of the class.  This will be confused by things like:\n    #   class A {\n    #   } *x = { ...\n    #\n    # But it's still good enough for CheckSectionSpacing.\n    self.last_line = 0\n    depth = 0\n    for i in range(linenum, clean_lines.NumLines()):\n      line = clean_lines.elided[i]\n      depth += line.count('{') - line.count('}')\n      if not depth:\n        self.last_line = i\n        break\n\n  def CheckBegin(self, filename, clean_lines, linenum, error):\n    # Look for a bare ':'\n    if Search('(^|[^:]):($|[^:])', clean_lines.elided[linenum]):\n      self.is_derived = True\n\n  def CheckEnd(self, filename, clean_lines, linenum, error):\n    # Check that closing brace is aligned with beginning of the class.\n    # Only do this if the closing brace is indented by only whitespaces.\n    # This means we will not check single-line class definitions.\n    indent = Match(r'^( *)\\}', clean_lines.elided[linenum])\n    if indent and len(indent.group(1)) != self.class_indent:\n      if self.is_struct:\n        parent = 'struct ' + self.name\n      else:\n        parent = 'class ' + self.name\n      error(filename, linenum, 'whitespace/indent', 3,\n            'Closing brace should be aligned with beginning of %s' % parent)\n\n\nclass _NamespaceInfo(_BlockInfo):\n  \"\"\"Stores information about a namespace.\"\"\"\n\n  def __init__(self, name, linenum):\n    _BlockInfo.__init__(self, False)\n    self.name = name or ''\n    self.starting_linenum = linenum\n\n  def CheckEnd(self, filename, clean_lines, linenum, error):\n    \"\"\"Check end of namespace comments.\"\"\"\n    line = clean_lines.raw_lines[linenum]\n\n    # Check how many lines is enclosed in this namespace.  Don't issue\n    # warning for missing namespace comments if there aren't enough\n    # lines.  However, do apply checks if there is already an end of\n    # namespace comment and it's incorrect.\n    #\n    # TODO(unknown): We always want to check end of namespace comments\n    # if a namespace is large, but sometimes we also want to apply the\n    # check if a short namespace contained nontrivial things (something\n    # other than forward declarations).  There is currently no logic on\n    # deciding what these nontrivial things are, so this check is\n    # triggered by namespace size only, which works most of the time.\n    if (linenum - self.starting_linenum < 10\n        and not Match(r'};*\\s*(//|/\\*).*\\bnamespace\\b', line)):\n      return\n\n    # Look for matching comment at end of namespace.\n    #\n    # Note that we accept C style \"/* */\" comments for terminating\n    # namespaces, so that code that terminate namespaces inside\n    # preprocessor macros can be cpplint clean.\n    #\n    # We also accept stuff like \"// end of namespace <name>.\" with the\n    # period at the end.\n    #\n    # Besides these, we don't accept anything else, otherwise we might\n    # get false negatives when existing comment is a substring of the\n    # expected namespace.\n    if self.name:\n      # Named namespace\n      if not Match((r'};*\\s*(//|/\\*).*\\bnamespace\\s+' + re.escape(self.name) +\n                    r'[\\*/\\.\\\\\\s]*$'),\n                   line):\n        error(filename, linenum, 'readability/namespace', 5,\n              'Namespace should be terminated with \"// namespace %s\"' %\n              self.name)\n    else:\n      # Anonymous namespace\n      if not Match(r'};*\\s*(//|/\\*).*\\bnamespace[\\*/\\.\\\\\\s]*$', line):\n        # If \"// namespace anonymous\" or \"// anonymous namespace (more text)\",\n        # mention \"// anonymous namespace\" as an acceptable form\n        if Match(r'}.*\\b(namespace anonymous|anonymous namespace)\\b', line):\n          error(filename, linenum, 'readability/namespace', 5,\n                'Anonymous namespace should be terminated with \"// namespace\"'\n                ' or \"// anonymous namespace\"')\n        else:\n          error(filename, linenum, 'readability/namespace', 5,\n                'Anonymous namespace should be terminated with \"// namespace\"')\n\n\nclass _PreprocessorInfo(object):\n  \"\"\"Stores checkpoints of nesting stacks when #if/#else is seen.\"\"\"\n\n  def __init__(self, stack_before_if):\n    # The entire nesting stack before #if\n    self.stack_before_if = stack_before_if\n\n    # The entire nesting stack up to #else\n    self.stack_before_else = []\n\n    # Whether we have already seen #else or #elif\n    self.seen_else = False\n\n\nclass NestingState(object):\n  \"\"\"Holds states related to parsing braces.\"\"\"\n\n  def __init__(self):\n    # Stack for tracking all braces.  An object is pushed whenever we\n    # see a \"{\", and popped when we see a \"}\".  Only 3 types of\n    # objects are possible:\n    # - _ClassInfo: a class or struct.\n    # - _NamespaceInfo: a namespace.\n    # - _BlockInfo: some other type of block.\n    self.stack = []\n\n    # Top of the previous stack before each Update().\n    #\n    # Because the nesting_stack is updated at the end of each line, we\n    # had to do some convoluted checks to find out what is the current\n    # scope at the beginning of the line.  This check is simplified by\n    # saving the previous top of nesting stack.\n    #\n    # We could save the full stack, but we only need the top.  Copying\n    # the full nesting stack would slow down cpplint by ~10%.\n    self.previous_stack_top = []\n\n    # Stack of _PreprocessorInfo objects.\n    self.pp_stack = []\n\n  def SeenOpenBrace(self):\n    \"\"\"Check if we have seen the opening brace for the innermost block.\n\n    Returns:\n      True if we have seen the opening brace, False if the innermost\n      block is still expecting an opening brace.\n    \"\"\"\n    return (not self.stack) or self.stack[-1].seen_open_brace\n\n  def InNamespaceBody(self):\n    \"\"\"Check if we are currently one level inside a namespace body.\n\n    Returns:\n      True if top of the stack is a namespace block, False otherwise.\n    \"\"\"\n    return self.stack and isinstance(self.stack[-1], _NamespaceInfo)\n\n  def InExternC(self):\n    \"\"\"Check if we are currently one level inside an 'extern \"C\"' block.\n\n    Returns:\n      True if top of the stack is an extern block, False otherwise.\n    \"\"\"\n    return self.stack and isinstance(self.stack[-1], _ExternCInfo)\n\n  def InClassDeclaration(self):\n    \"\"\"Check if we are currently one level inside a class or struct declaration.\n\n    Returns:\n      True if top of the stack is a class/struct, False otherwise.\n    \"\"\"\n    return self.stack and isinstance(self.stack[-1], _ClassInfo)\n\n  def InAsmBlock(self):\n    \"\"\"Check if we are currently one level inside an inline ASM block.\n\n    Returns:\n      True if the top of the stack is a block containing inline ASM.\n    \"\"\"\n    return self.stack and self.stack[-1].inline_asm != _NO_ASM\n\n  def InTemplateArgumentList(self, clean_lines, linenum, pos):\n    \"\"\"Check if current position is inside template argument list.\n\n    Args:\n      clean_lines: A CleansedLines instance containing the file.\n      linenum: The number of the line to check.\n      pos: position just after the suspected template argument.\n    Returns:\n      True if (linenum, pos) is inside template arguments.\n    \"\"\"\n    while linenum < clean_lines.NumLines():\n      # Find the earliest character that might indicate a template argument\n      line = clean_lines.elided[linenum]\n      match = Match(r'^[^{};=\\[\\]\\.<>]*(.)', line[pos:])\n      if not match:\n        linenum += 1\n        pos = 0\n        continue\n      token = match.group(1)\n      pos += len(match.group(0))\n\n      # These things do not look like template argument list:\n      #   class Suspect {\n      #   class Suspect x; }\n      if token in ('{', '}', ';'): return False\n\n      # These things look like template argument list:\n      #   template <class Suspect>\n      #   template <class Suspect = default_value>\n      #   template <class Suspect[]>\n      #   template <class Suspect...>\n      if token in ('>', '=', '[', ']', '.'): return True\n\n      # Check if token is an unmatched '<'.\n      # If not, move on to the next character.\n      if token != '<':\n        pos += 1\n        if pos >= len(line):\n          linenum += 1\n          pos = 0\n        continue\n\n      # We can't be sure if we just find a single '<', and need to\n      # find the matching '>'.\n      (_, end_line, end_pos) = CloseExpression(clean_lines, linenum, pos - 1)\n      if end_pos < 0:\n        # Not sure if template argument list or syntax error in file\n        return False\n      linenum = end_line\n      pos = end_pos\n    return False\n\n  def UpdatePreprocessor(self, line):\n    \"\"\"Update preprocessor stack.\n\n    We need to handle preprocessors due to classes like this:\n      #ifdef SWIG\n      struct ResultDetailsPageElementExtensionPoint {\n      #else\n      struct ResultDetailsPageElementExtensionPoint : public Extension {\n      #endif\n\n    We make the following assumptions (good enough for most files):\n    - Preprocessor condition evaluates to true from #if up to first\n      #else/#elif/#endif.\n\n    - Preprocessor condition evaluates to false from #else/#elif up\n      to #endif.  We still perform lint checks on these lines, but\n      these do not affect nesting stack.\n\n    Args:\n      line: current line to check.\n    \"\"\"\n    if Match(r'^\\s*#\\s*(if|ifdef|ifndef)\\b', line):\n      # Beginning of #if block, save the nesting stack here.  The saved\n      # stack will allow us to restore the parsing state in the #else case.\n      self.pp_stack.append(_PreprocessorInfo(copy.deepcopy(self.stack)))\n    elif Match(r'^\\s*#\\s*(else|elif)\\b', line):\n      # Beginning of #else block\n      if self.pp_stack:\n        if not self.pp_stack[-1].seen_else:\n          # This is the first #else or #elif block.  Remember the\n          # whole nesting stack up to this point.  This is what we\n          # keep after the #endif.\n          self.pp_stack[-1].seen_else = True\n          self.pp_stack[-1].stack_before_else = copy.deepcopy(self.stack)\n\n        # Restore the stack to how it was before the #if\n        self.stack = copy.deepcopy(self.pp_stack[-1].stack_before_if)\n      else:\n        # TODO(unknown): unexpected #else, issue warning?\n        pass\n    elif Match(r'^\\s*#\\s*endif\\b', line):\n      # End of #if or #else blocks.\n      if self.pp_stack:\n        # If we saw an #else, we will need to restore the nesting\n        # stack to its former state before the #else, otherwise we\n        # will just continue from where we left off.\n        if self.pp_stack[-1].seen_else:\n          # Here we can just use a shallow copy since we are the last\n          # reference to it.\n          self.stack = self.pp_stack[-1].stack_before_else\n        # Drop the corresponding #if\n        self.pp_stack.pop()\n      else:\n        # TODO(unknown): unexpected #endif, issue warning?\n        pass\n\n  # TODO(unknown): Update() is too long, but we will refactor later.\n  def Update(self, filename, clean_lines, linenum, error):\n    \"\"\"Update nesting state with current line.\n\n    Args:\n      filename: The name of the current file.\n      clean_lines: A CleansedLines instance containing the file.\n      linenum: The number of the line to check.\n      error: The function to call with any errors found.\n    \"\"\"\n    line = clean_lines.elided[linenum]\n\n    # Remember top of the previous nesting stack.\n    #\n    # The stack is always pushed/popped and not modified in place, so\n    # we can just do a shallow copy instead of copy.deepcopy.  Using\n    # deepcopy would slow down cpplint by ~28%.\n    if self.stack:\n      self.previous_stack_top = self.stack[-1]\n    else:\n      self.previous_stack_top = None\n\n    # Update pp_stack\n    self.UpdatePreprocessor(line)\n\n    # Count parentheses.  This is to avoid adding struct arguments to\n    # the nesting stack.\n    if self.stack:\n      inner_block = self.stack[-1]\n      depth_change = line.count('(') - line.count(')')\n      inner_block.open_parentheses += depth_change\n\n      # Also check if we are starting or ending an inline assembly block.\n      if inner_block.inline_asm in (_NO_ASM, _END_ASM):\n        if (depth_change != 0 and\n            inner_block.open_parentheses == 1 and\n            _MATCH_ASM.match(line)):\n          # Enter assembly block\n          inner_block.inline_asm = _INSIDE_ASM\n        else:\n          # Not entering assembly block.  If previous line was _END_ASM,\n          # we will now shift to _NO_ASM state.\n          inner_block.inline_asm = _NO_ASM\n      elif (inner_block.inline_asm == _INSIDE_ASM and\n            inner_block.open_parentheses == 0):\n        # Exit assembly block\n        inner_block.inline_asm = _END_ASM\n\n    # Consume namespace declaration at the beginning of the line.  Do\n    # this in a loop so that we catch same line declarations like this:\n    #   namespace proto2 { namespace bridge { class MessageSet; } }\n    while True:\n      # Match start of namespace.  The \"\\b\\s*\" below catches namespace\n      # declarations even if it weren't followed by a whitespace, this\n      # is so that we don't confuse our namespace checker.  The\n      # missing spaces will be flagged by CheckSpacing.\n      namespace_decl_match = Match(r'^\\s*namespace\\b\\s*([:\\w]+)?(.*)$', line)\n      if not namespace_decl_match:\n        break\n\n      new_namespace = _NamespaceInfo(namespace_decl_match.group(1), linenum)\n      self.stack.append(new_namespace)\n\n      line = namespace_decl_match.group(2)\n      if line.find('{') != -1:\n        new_namespace.seen_open_brace = True\n        line = line[line.find('{') + 1:]\n\n    # Look for a class declaration in whatever is left of the line\n    # after parsing namespaces.  The regexp accounts for decorated classes\n    # such as in:\n    #   class LOCKABLE API Object {\n    #   };\n    class_decl_match = Match(\n        r'^(\\s*(?:template\\s*<[\\w\\s<>,:]*>\\s*)?'\n        r'(class|struct)\\s+(?:[A-Z_]+\\s+)*(\\w+(?:::\\w+)*))'\n        r'(.*)$', line)\n    if (class_decl_match and\n        (not self.stack or self.stack[-1].open_parentheses == 0)):\n      # We do not want to accept classes that are actually template arguments:\n      #   template <class Ignore1,\n      #             class Ignore2 = Default<Args>,\n      #             template <Args> class Ignore3>\n      #   void Function() {};\n      #\n      # To avoid template argument cases, we scan forward and look for\n      # an unmatched '>'.  If we see one, assume we are inside a\n      # template argument list.\n      end_declaration = len(class_decl_match.group(1))\n      if not self.InTemplateArgumentList(clean_lines, linenum, end_declaration):\n        self.stack.append(_ClassInfo(\n            class_decl_match.group(3), class_decl_match.group(2),\n            clean_lines, linenum))\n        line = class_decl_match.group(4)\n\n    # If we have not yet seen the opening brace for the innermost block,\n    # run checks here.\n    if not self.SeenOpenBrace():\n      self.stack[-1].CheckBegin(filename, clean_lines, linenum, error)\n\n    # Update access control if we are inside a class/struct\n    if self.stack and isinstance(self.stack[-1], _ClassInfo):\n      classinfo = self.stack[-1]\n      access_match = Match(\n          r'^(.*)\\b(public|private|protected|signals)(\\s+(?:slots\\s*)?)?'\n          r':(?:[^:]|$)',\n          line)\n      if access_match:\n        classinfo.access = access_match.group(2)\n\n        # Check that access keywords are indented +1 space.  Skip this\n        # check if the keywords are not preceded by whitespaces.\n        indent = access_match.group(1)\n        if (len(indent) != classinfo.class_indent + 1 and\n            Match(r'^\\s*$', indent)):\n          if classinfo.is_struct:\n            parent = 'struct ' + classinfo.name\n          else:\n            parent = 'class ' + classinfo.name\n          slots = ''\n          if access_match.group(3):\n            slots = access_match.group(3)\n          error(filename, linenum, 'whitespace/indent', 3,\n                '%s%s: should be indented +1 space inside %s' % (\n                    access_match.group(2), slots, parent))\n\n    # Consume braces or semicolons from what's left of the line\n    while True:\n      # Match first brace, semicolon, or closed parenthesis.\n      matched = Match(r'^[^{;)}]*([{;)}])(.*)$', line)\n      if not matched:\n        break\n\n      token = matched.group(1)\n      if token == '{':\n        # If namespace or class hasn't seen a opening brace yet, mark\n        # namespace/class head as complete.  Push a new block onto the\n        # stack otherwise.\n        if not self.SeenOpenBrace():\n          self.stack[-1].seen_open_brace = True\n        elif Match(r'^extern\\s*\"[^\"]*\"\\s*\\{', line):\n          self.stack.append(_ExternCInfo())\n        else:\n          self.stack.append(_BlockInfo(True))\n          if _MATCH_ASM.match(line):\n            self.stack[-1].inline_asm = _BLOCK_ASM\n\n      elif token == ';' or token == ')':\n        # If we haven't seen an opening brace yet, but we already saw\n        # a semicolon, this is probably a forward declaration.  Pop\n        # the stack for these.\n        #\n        # Similarly, if we haven't seen an opening brace yet, but we\n        # already saw a closing parenthesis, then these are probably\n        # function arguments with extra \"class\" or \"struct\" keywords.\n        # Also pop these stack for these.\n        if not self.SeenOpenBrace():\n          self.stack.pop()\n      else:  # token == '}'\n        # Perform end of block checks and pop the stack.\n        if self.stack:\n          self.stack[-1].CheckEnd(filename, clean_lines, linenum, error)\n          self.stack.pop()\n      line = matched.group(2)\n\n  def InnermostClass(self):\n    \"\"\"Get class info on the top of the stack.\n\n    Returns:\n      A _ClassInfo object if we are inside a class, or None otherwise.\n    \"\"\"\n    for i in range(len(self.stack), 0, -1):\n      classinfo = self.stack[i - 1]\n      if isinstance(classinfo, _ClassInfo):\n        return classinfo\n    return None\n\n  def CheckCompletedBlocks(self, filename, error):\n    \"\"\"Checks that all classes and namespaces have been completely parsed.\n\n    Call this when all lines in a file have been processed.\n    Args:\n      filename: The name of the current file.\n      error: The function to call with any errors found.\n    \"\"\"\n    # Note: This test can result in false positives if #ifdef constructs\n    # get in the way of brace matching. See the testBuildClass test in\n    # cpplint_unittest.py for an example of this.\n    for obj in self.stack:\n      if isinstance(obj, _ClassInfo):\n        error(filename, obj.starting_linenum, 'build/class', 5,\n              'Failed to find complete declaration of class %s' %\n              obj.name)\n      elif isinstance(obj, _NamespaceInfo):\n        error(filename, obj.starting_linenum, 'build/namespaces', 5,\n              'Failed to find complete declaration of namespace %s' %\n              obj.name)\n\n\ndef CheckForNonStandardConstructs(filename, clean_lines, linenum,\n                                  nesting_state, error):\n  r\"\"\"Logs an error if we see certain non-ANSI constructs ignored by gcc-2.\n\n  Complain about several constructs which gcc-2 accepts, but which are\n  not standard C++.  Warning about these in lint is one way to ease the\n  transition to new compilers.\n  - put storage class first (e.g. \"static const\" instead of \"const static\").\n  - \"%lld\" instead of %qd\" in printf-type functions.\n  - \"%1$d\" is non-standard in printf-type functions.\n  - \"\\%\" is an undefined character escape sequence.\n  - text after #endif is not allowed.\n  - invalid inner-style forward declaration.\n  - >? and <? operators, and their >?= and <?= cousins.\n\n  Additionally, check for constructor/destructor style violations and reference\n  members, as it is very convenient to do so while checking for\n  gcc-2 compliance.\n\n  Args:\n    filename: The name of the current file.\n    clean_lines: A CleansedLines instance containing the file.\n    linenum: The number of the line to check.\n    nesting_state: A NestingState instance which maintains information about\n                   the current stack of nested blocks being parsed.\n    error: A callable to which errors are reported, which takes 4 arguments:\n           filename, line number, error level, and message\n  \"\"\"\n\n  # Remove comments from the line, but leave in strings for now.\n  line = clean_lines.lines[linenum]\n\n  if Search(r'printf\\s*\\(.*\".*%[-+ ]?\\d*q', line):\n    error(filename, linenum, 'runtime/printf_format', 3,\n          '%q in format strings is deprecated.  Use %ll instead.')\n\n  if Search(r'printf\\s*\\(.*\".*%\\d+\\$', line):\n    error(filename, linenum, 'runtime/printf_format', 2,\n          '%N$ formats are unconventional.  Try rewriting to avoid them.')\n\n  # Remove escaped backslashes before looking for undefined escapes.\n  line = line.replace('\\\\\\\\', '')\n\n  if Search(r'(\"|\\').*\\\\(%|\\[|\\(|{)', line):\n    error(filename, linenum, 'build/printf_format', 3,\n          '%, [, (, and { are undefined character escapes.  Unescape them.')\n\n  # For the rest, work with both comments and strings removed.\n  line = clean_lines.elided[linenum]\n\n  if Search(r'\\b(const|volatile|void|char|short|int|long'\n            r'|float|double|signed|unsigned'\n            r'|schar|u?int8|u?int16|u?int32|u?int64)'\n            r'\\s+(register|static|extern|typedef)\\b',\n            line):\n    error(filename, linenum, 'build/storage_class', 5,\n          'Storage class (static, extern, typedef, etc) should be first.')\n\n  if Match(r'\\s*#\\s*endif\\s*[^/\\s]+', line):\n    error(filename, linenum, 'build/endif_comment', 5,\n          'Uncommented text after #endif is non-standard.  Use a comment.')\n\n  if Match(r'\\s*class\\s+(\\w+\\s*::\\s*)+\\w+\\s*;', line):\n    error(filename, linenum, 'build/forward_decl', 5,\n          'Inner-style forward declarations are invalid.  Remove this line.')\n\n  if Search(r'(\\w+|[+-]?\\d+(\\.\\d*)?)\\s*(<|>)\\?=?\\s*(\\w+|[+-]?\\d+)(\\.\\d*)?',\n            line):\n    error(filename, linenum, 'build/deprecated', 3,\n          '>? and <? (max and min) operators are non-standard and deprecated.')\n\n  if Search(r'^\\s*const\\s*string\\s*&\\s*\\w+\\s*;', line):\n    # TODO(unknown): Could it be expanded safely to arbitrary references,\n    # without triggering too many false positives? The first\n    # attempt triggered 5 warnings for mostly benign code in the regtest, hence\n    # the restriction.\n    # Here's the original regexp, for the reference:\n    # type_name = r'\\w+((\\s*::\\s*\\w+)|(\\s*<\\s*\\w+?\\s*>))?'\n    # r'\\s*const\\s*' + type_name + '\\s*&\\s*\\w+\\s*;'\n    error(filename, linenum, 'runtime/member_string_references', 2,\n          'const string& members are dangerous. It is much better to use '\n          'alternatives, such as pointers or simple constants.')\n\n  # Everything else in this function operates on class declarations.\n  # Return early if the top of the nesting stack is not a class, or if\n  # the class head is not completed yet.\n  classinfo = nesting_state.InnermostClass()\n  if not classinfo or not classinfo.seen_open_brace:\n    return\n\n  # The class may have been declared with namespace or classname qualifiers.\n  # The constructor and destructor will not have those qualifiers.\n  base_classname = classinfo.name.split('::')[-1]\n\n  # Look for single-argument constructors that aren't marked explicit.\n  # Technically a valid construct, but against style.\n  args = Match(r'\\s+(?:inline\\s+)?%s\\s*\\(([^,()]+)\\)'\n               % re.escape(base_classname),\n               line)\n  if (args and\n      args.group(1) != 'void' and\n      not Search(r'\\bstd::initializer_list\\b', args.group(1)) and\n      not Match(r'(const\\s+)?%s(\\s+const)?\\s*(?:<\\w+>\\s*)?&'\n                % re.escape(base_classname), args.group(1).strip())):\n    error(filename, linenum, 'runtime/explicit', 5,\n          'Single-argument constructors should be marked explicit.')\n\n\ndef CheckSpacingForFunctionCall(filename, clean_lines, linenum, error):\n  \"\"\"Checks for the correctness of various spacing around function calls.\n\n  Args:\n    filename: The name of the current file.\n    clean_lines: A CleansedLines instance containing the file.\n    linenum: The number of the line to check.\n    error: The function to call with any errors found.\n  \"\"\"\n  line = clean_lines.elided[linenum]\n\n  # Since function calls often occur inside if/for/while/switch\n  # expressions - which have their own, more liberal conventions - we\n  # first see if we should be looking inside such an expression for a\n  # function call, to which we can apply more strict standards.\n  fncall = line    # if there's no control flow construct, look at whole line\n  for pattern in (r'\\bif\\s*\\((.*)\\)\\s*{',\n                  r'\\bfor\\s*\\((.*)\\)\\s*{',\n                  r'\\bwhile\\s*\\((.*)\\)\\s*[{;]',\n                  r'\\bswitch\\s*\\((.*)\\)\\s*{'):\n    match = Search(pattern, line)\n    if match:\n      fncall = match.group(1)    # look inside the parens for function calls\n      break\n\n  # Except in if/for/while/switch, there should never be space\n  # immediately inside parens (eg \"f( 3, 4 )\").  We make an exception\n  # for nested parens ( (a+b) + c ).  Likewise, there should never be\n  # a space before a ( when it's a function argument.  I assume it's a\n  # function argument when the char before the whitespace is legal in\n  # a function name (alnum + _) and we're not starting a macro. Also ignore\n  # pointers and references to arrays and functions coz they're too tricky:\n  # we use a very simple way to recognize these:\n  # \" (something)(maybe-something)\" or\n  # \" (something)(maybe-something,\" or\n  # \" (something)[something]\"\n  # Note that we assume the contents of [] to be short enough that\n  # they'll never need to wrap.\n  if (  # Ignore control structures.\n      not Search(r'\\b(if|for|while|switch|return|new|delete|catch|sizeof)\\b',\n                 fncall) and\n      # Ignore pointers/references to functions.\n      not Search(r' \\([^)]+\\)\\([^)]*(\\)|,$)', fncall) and\n      # Ignore pointers/references to arrays.\n      not Search(r' \\([^)]+\\)\\[[^\\]]+\\]', fncall)):\n    if Search(r'\\w\\s*\\(\\s(?!\\s*\\\\$)', fncall):      # a ( used for a fn call\n      error(filename, linenum, 'whitespace/parens', 4,\n            'Extra space after ( in function call')\n    elif Search(r'\\(\\s+(?!(\\s*\\\\)|\\()', fncall):\n      error(filename, linenum, 'whitespace/parens', 2,\n            'Extra space after (')\n    if (Search(r'\\w\\s+\\(', fncall) and\n        not Search(r'#\\s*define|typedef|using\\s+\\w+\\s*=', fncall) and\n        not Search(r'\\w\\s+\\((\\w+::)*\\*\\w+\\)\\(', fncall)):\n      # TODO(unknown): Space after an operator function seem to be a common\n      # error, silence those for now by restricting them to highest verbosity.\n      if Search(r'\\boperator_*\\b', line):\n        error(filename, linenum, 'whitespace/parens', 0,\n              'Extra space before ( in function call')\n      else:\n        error(filename, linenum, 'whitespace/parens', 4,\n              'Extra space before ( in function call')\n    # If the ) is followed only by a newline or a { + newline, assume it's\n    # part of a control statement (if/while/etc), and don't complain\n    if Search(r'[^)]\\s+\\)\\s*[^{\\s]', fncall):\n      # If the closing parenthesis is preceded by only whitespaces,\n      # try to give a more descriptive error message.\n      if Search(r'^\\s+\\)', fncall):\n        error(filename, linenum, 'whitespace/parens', 2,\n              'Closing ) should be moved to the previous line')\n      else:\n        error(filename, linenum, 'whitespace/parens', 2,\n              'Extra space before )')\n\n\ndef IsBlankLine(line):\n  \"\"\"Returns true if the given line is blank.\n\n  We consider a line to be blank if the line is empty or consists of\n  only white spaces.\n\n  Args:\n    line: A line of a string.\n\n  Returns:\n    True, if the given line is blank.\n  \"\"\"\n  return not line or line.isspace()\n\n\ndef CheckForFunctionLengths(filename, clean_lines, linenum,\n                            function_state, error):\n  \"\"\"Reports for long function bodies.\n\n  For an overview why this is done, see:\n  http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Write_Short_Functions\n\n  Uses a simplistic algorithm assuming other style guidelines\n  (especially spacing) are followed.\n  Only checks unindented functions, so class members are unchecked.\n  Trivial bodies are unchecked, so constructors with huge initializer lists\n  may be missed.\n  Blank/comment lines are not counted so as to avoid encouraging the removal\n  of vertical space and comments just to get through a lint check.\n  NOLINT *on the last line of a function* disables this check.\n\n  Args:\n    filename: The name of the current file.\n    clean_lines: A CleansedLines instance containing the file.\n    linenum: The number of the line to check.\n    function_state: Current function name and lines in body so far.\n    error: The function to call with any errors found.\n  \"\"\"\n  lines = clean_lines.lines\n  line = lines[linenum]\n  joined_line = ''\n\n  starting_func = False\n  regexp = r'(\\w(\\w|::|\\*|\\&|\\s)*)\\('  # decls * & space::name( ...\n  match_result = Match(regexp, line)\n  if match_result:\n    # If the name is all caps and underscores, figure it's a macro and\n    # ignore it, unless it's TEST or TEST_F.\n    function_name = match_result.group(1).split()[-1]\n    if function_name == 'TEST' or function_name == 'TEST_F' or (\n        not Match(r'[A-Z_]+$', function_name)):\n      starting_func = True\n\n  if starting_func:\n    body_found = False\n    for start_linenum in xrange(linenum, clean_lines.NumLines()):\n      start_line = lines[start_linenum]\n      joined_line += ' ' + start_line.lstrip()\n      if Search(r'(;|})', start_line):  # Declarations and trivial functions\n        body_found = True\n        break                              # ... ignore\n      elif Search(r'{', start_line):\n        body_found = True\n        function = Search(r'((\\w|:)*)\\(', line).group(1)\n        if Match(r'TEST', function):    # Handle TEST... macros\n          parameter_regexp = Search(r'(\\(.*\\))', joined_line)\n          if parameter_regexp:             # Ignore bad syntax\n            function += parameter_regexp.group(1)\n        else:\n          function += '()'\n        function_state.Begin(function)\n        break\n    if not body_found:\n      # No body for the function (or evidence of a non-function) was found.\n      error(filename, linenum, 'readability/fn_size', 5,\n            'Lint failed to find start of function body.')\n  elif Match(r'^\\}\\s*$', line):  # function end\n    function_state.Check(error, filename, linenum)\n    function_state.End()\n  elif not Match(r'^\\s*$', line):\n    function_state.Count()  # Count non-blank/non-comment lines.\n\n\n_RE_PATTERN_TODO = re.compile(r'^//(\\s*)TODO(\\(.+?\\))?:?(\\s|$)?')\n\n\ndef CheckComment(line, filename, linenum, next_line_start, error):\n  \"\"\"Checks for common mistakes in comments.\n\n  Args:\n    line: The line in question.\n    filename: The name of the current file.\n    linenum: The number of the line to check.\n    next_line_start: The first non-whitespace column of the next line.\n    error: The function to call with any errors found.\n  \"\"\"\n  commentpos = line.find('//')\n  if commentpos != -1:\n    # Check if the // may be in quotes.  If so, ignore it\n    # Comparisons made explicit for clarity -- pylint: disable=g-explicit-bool-comparison\n    if (line.count('\"', 0, commentpos) -\n        line.count('\\\\\"', 0, commentpos)) % 2 == 0:   # not in quotes\n      # Allow one space for new scopes, two spaces otherwise:\n      if (not (Match(r'^.*{ *//', line) and next_line_start == commentpos) and\n          ((commentpos >= 1 and\n            line[commentpos-1] not in string.whitespace) or\n           (commentpos >= 2 and\n            line[commentpos-2] not in string.whitespace))):\n        error(filename, linenum, 'whitespace/comments', 2,\n              'At least two spaces is best between code and comments')\n\n      # Checks for common mistakes in TODO comments.\n      comment = line[commentpos:]\n      match = _RE_PATTERN_TODO.match(comment)\n      if match:\n        # One whitespace is correct; zero whitespace is handled elsewhere.\n        leading_whitespace = match.group(1)\n        if len(leading_whitespace) > 1:\n          error(filename, linenum, 'whitespace/todo', 2,\n                'Too many spaces before TODO')\n\n        username = match.group(2)\n        if not username:\n          error(filename, linenum, 'readability/todo', 2,\n                'Missing username in TODO; it should look like '\n                '\"// TODO(my_username): Stuff.\"')\n\n        middle_whitespace = match.group(3)\n        # Comparisons made explicit for correctness -- pylint: disable=g-explicit-bool-comparison\n        if middle_whitespace != ' ' and middle_whitespace != '':\n          error(filename, linenum, 'whitespace/todo', 2,\n                'TODO(my_username) should be followed by a space')\n\n      # If the comment contains an alphanumeric character, there\n      # should be a space somewhere between it and the //.\n      if Match(r'//[^ ]*\\w', comment):\n        error(filename, linenum, 'whitespace/comments', 4,\n              'Should have a space between // and comment')\n\ndef CheckAccess(filename, clean_lines, linenum, nesting_state, error):\n  \"\"\"Checks for improper use of DISALLOW* macros.\n\n  Args:\n    filename: The name of the current file.\n    clean_lines: A CleansedLines instance containing the file.\n    linenum: The number of the line to check.\n    nesting_state: A NestingState instance which maintains information about\n                   the current stack of nested blocks being parsed.\n    error: The function to call with any errors found.\n  \"\"\"\n  line = clean_lines.elided[linenum]  # get rid of comments and strings\n\n  matched = Match((r'\\s*(DISALLOW_COPY_AND_ASSIGN|'\n                   r'DISALLOW_EVIL_CONSTRUCTORS|'\n                   r'DISALLOW_IMPLICIT_CONSTRUCTORS)'), line)\n  if not matched:\n    return\n  if nesting_state.stack and isinstance(nesting_state.stack[-1], _ClassInfo):\n    if nesting_state.stack[-1].access != 'private':\n      error(filename, linenum, 'readability/constructors', 3,\n            '%s must be in the private: section' % matched.group(1))\n\n  else:\n    # Found DISALLOW* macro outside a class declaration, or perhaps it\n    # was used inside a function when it should have been part of the\n    # class declaration.  We could issue a warning here, but it\n    # probably resulted in a compiler error already.\n    pass\n\n\ndef CheckSpacing(filename, clean_lines, linenum, nesting_state, error):\n  \"\"\"Checks for the correctness of various spacing issues in the code.\n\n  Things we check for: spaces around operators, spaces after\n  if/for/while/switch, no spaces around parens in function calls, two\n  spaces between code and comment, don't start a block with a blank\n  line, don't end a function with a blank line, don't add a blank line\n  after public/protected/private, don't have too many blank lines in a row.\n\n  Args:\n    filename: The name of the current file.\n    clean_lines: A CleansedLines instance containing the file.\n    linenum: The number of the line to check.\n    nesting_state: A NestingState instance which maintains information about\n                   the current stack of nested blocks being parsed.\n    error: The function to call with any errors found.\n  \"\"\"\n\n  # Don't use \"elided\" lines here, otherwise we can't check commented lines.\n  # Don't want to use \"raw\" either, because we don't want to check inside C++11\n  # raw strings,\n  raw = clean_lines.lines_without_raw_strings\n  line = raw[linenum]\n\n  # Before nixing comments, check if the line is blank for no good\n  # reason.  This includes the first line after a block is opened, and\n  # blank lines at the end of a function (ie, right before a line like '}'\n  #\n  # Skip all the blank line checks if we are immediately inside a\n  # namespace body.  In other words, don't issue blank line warnings\n  # for this block:\n  #   namespace {\n  #\n  #   }\n  #\n  # A warning about missing end of namespace comments will be issued instead.\n  #\n  # Also skip blank line checks for 'extern \"C\"' blocks, which are formatted\n  # like namespaces.\n  if (IsBlankLine(line) and\n      not nesting_state.InNamespaceBody() and\n      not nesting_state.InExternC()):\n    elided = clean_lines.elided\n    prev_line = elided[linenum - 1]\n    prevbrace = prev_line.rfind('{')\n    # TODO(unknown): Don't complain if line before blank line, and line after,\n    #                both start with alnums and are indented the same amount.\n    #                This ignores whitespace at the start of a namespace block\n    #                because those are not usually indented.\n    if prevbrace != -1 and prev_line[prevbrace:].find('}') == -1:\n      # OK, we have a blank line at the start of a code block.  Before we\n      # complain, we check if it is an exception to the rule: The previous\n      # non-empty line has the parameters of a function header that are indented\n      # 4 spaces (because they did not fit in a 80 column line when placed on\n      # the same line as the function name).  We also check for the case where\n      # the previous line is indented 6 spaces, which may happen when the\n      # initializers of a constructor do not fit into a 80 column line.\n      exception = False\n      if Match(r' {6}\\w', prev_line):  # Initializer list?\n        # We are looking for the opening column of initializer list, which\n        # should be indented 4 spaces to cause 6 space indentation afterwards.\n        search_position = linenum-2\n        while (search_position >= 0\n               and Match(r' {6}\\w', elided[search_position])):\n          search_position -= 1\n        exception = (search_position >= 0\n                     and elided[search_position][:5] == '    :')\n      else:\n        # Search for the function arguments or an initializer list.  We use a\n        # simple heuristic here: If the line is indented 4 spaces; and we have a\n        # closing paren, without the opening paren, followed by an opening brace\n        # or colon (for initializer lists) we assume that it is the last line of\n        # a function header.  If we have a colon indented 4 spaces, it is an\n        # initializer list.\n        exception = (Match(r' {4}\\w[^\\(]*\\)\\s*(const\\s*)?(\\{\\s*$|:)',\n                           prev_line)\n                     or Match(r' {4}:', prev_line))\n\n      if not exception:\n        error(filename, linenum, 'whitespace/blank_line', 2,\n              'Redundant blank line at the start of a code block '\n              'should be deleted.')\n    # Ignore blank lines at the end of a block in a long if-else\n    # chain, like this:\n    #   if (condition1) {\n    #     // Something followed by a blank line\n    #\n    #   } else if (condition2) {\n    #     // Something else\n    #   }\n    if linenum + 1 < clean_lines.NumLines():\n      next_line = raw[linenum + 1]\n      if (next_line\n          and Match(r'\\s*}', next_line)\n          and next_line.find('} else ') == -1):\n        error(filename, linenum, 'whitespace/blank_line', 3,\n              'Redundant blank line at the end of a code block '\n              'should be deleted.')\n\n    matched = Match(r'\\s*(public|protected|private):', prev_line)\n    if matched:\n      error(filename, linenum, 'whitespace/blank_line', 3,\n            'Do not leave a blank line after \"%s:\"' % matched.group(1))\n\n  # Next, check comments\n  next_line_start = 0\n  if linenum + 1 < clean_lines.NumLines():\n    next_line = raw[linenum + 1]\n    next_line_start = len(next_line) - len(next_line.lstrip())\n  CheckComment(line, filename, linenum, next_line_start, error)\n\n  # get rid of comments and strings\n  line = clean_lines.elided[linenum]\n\n  # You shouldn't have spaces before your brackets, except maybe after\n  # 'delete []' or 'return []() {};'\n  if Search(r'\\w\\s+\\[', line) and not Search(r'(?:delete|return)\\s+\\[', line):\n    error(filename, linenum, 'whitespace/braces', 5,\n          'Extra space before [')\n\n  # In range-based for, we wanted spaces before and after the colon, but\n  # not around \"::\" tokens that might appear.\n  if (Search(r'for *\\(.*[^:]:[^: ]', line) or\n      Search(r'for *\\(.*[^: ]:[^:]', line)):\n    error(filename, linenum, 'whitespace/forcolon', 2,\n          'Missing space around colon in range-based for loop')\n\n\ndef CheckOperatorSpacing(filename, clean_lines, linenum, error):\n  \"\"\"Checks for horizontal spacing around operators.\n\n  Args:\n    filename: The name of the current file.\n    clean_lines: A CleansedLines instance containing the file.\n    linenum: The number of the line to check.\n    error: The function to call with any errors found.\n  \"\"\"\n  line = clean_lines.elided[linenum]\n\n  # Don't try to do spacing checks for operator methods.  Do this by\n  # replacing the troublesome characters with something else,\n  # preserving column position for all other characters.\n  #\n  # The replacement is done repeatedly to avoid false positives from\n  # operators that call operators.\n  while True:\n    match = Match(r'^(.*\\boperator\\b)(\\S+)(\\s*\\(.*)$', line)\n    if match:\n      line = match.group(1) + ('_' * len(match.group(2))) + match.group(3)\n    else:\n      break\n\n  # We allow no-spaces around = within an if: \"if ( (a=Foo()) == 0 )\".\n  # Otherwise not.  Note we only check for non-spaces on *both* sides;\n  # sometimes people put non-spaces on one side when aligning ='s among\n  # many lines (not that this is behavior that I approve of...)\n  if Search(r'[\\w.]=[\\w.]', line) and not Search(r'\\b(if|while) ', line):\n    error(filename, linenum, 'whitespace/operators', 4,\n          'Missing spaces around =')\n\n  # It's ok not to have spaces around binary operators like + - * /, but if\n  # there's too little whitespace, we get concerned.  It's hard to tell,\n  # though, so we punt on this one for now.  TODO.\n\n  # You should always have whitespace around binary operators.\n  #\n  # Check <= and >= first to avoid false positives with < and >, then\n  # check non-include lines for spacing around < and >.\n  #\n  # If the operator is followed by a comma, assume it's be used in a\n  # macro context and don't do any checks.  This avoids false\n  # positives.\n  #\n  # Note that && is not included here.  Those are checked separately\n  # in CheckRValueReference\n  match = Search(r'[^<>=!\\s](==|!=|<=|>=|\\|\\|)[^<>=!\\s,;\\)]', line)\n  if match:\n    error(filename, linenum, 'whitespace/operators', 3,\n          'Missing spaces around %s' % match.group(1))\n  elif not Match(r'#.*include', line):\n    # Look for < that is not surrounded by spaces.  This is only\n    # triggered if both sides are missing spaces, even though\n    # technically should should flag if at least one side is missing a\n    # space.  This is done to avoid some false positives with shifts.\n    match = Match(r'^(.*[^\\s<])<[^\\s=<,]', line)\n    if match:\n      (_, _, end_pos) = CloseExpression(\n          clean_lines, linenum, len(match.group(1)))\n      if end_pos <= -1:\n        error(filename, linenum, 'whitespace/operators', 3,\n              'Missing spaces around <')\n\n    # Look for > that is not surrounded by spaces.  Similar to the\n    # above, we only trigger if both sides are missing spaces to avoid\n    # false positives with shifts.\n    match = Match(r'^(.*[^-\\s>])>[^\\s=>,]', line)\n    if match:\n      (_, _, start_pos) = ReverseCloseExpression(\n          clean_lines, linenum, len(match.group(1)))\n      if start_pos <= -1:\n        error(filename, linenum, 'whitespace/operators', 3,\n              'Missing spaces around >')\n\n  # We allow no-spaces around << when used like this: 10<<20, but\n  # not otherwise (particularly, not when used as streams)\n  # We also allow operators following an opening parenthesis, since\n  # those tend to be macros that deal with operators.\n  match = Search(r'(operator|\\S)(?:L|UL|ULL|l|ul|ull)?<<([^\\s,=])', line)\n  if (match and match.group(1) != '(' and\n      not (match.group(1).isdigit() and match.group(2).isdigit()) and\n      not (match.group(1) == 'operator' and match.group(2) == ';')):\n    error(filename, linenum, 'whitespace/operators', 3,\n          'Missing spaces around <<')\n\n  # We allow no-spaces around >> for almost anything.  This is because\n  # C++11 allows \">>\" to close nested templates, which accounts for\n  # most cases when \">>\" is not followed by a space.\n  #\n  # We still warn on \">>\" followed by alpha character, because that is\n  # likely due to \">>\" being used for right shifts, e.g.:\n  #   value >> alpha\n  #\n  # When \">>\" is used to close templates, the alphanumeric letter that\n  # follows would be part of an identifier, and there should still be\n  # a space separating the template type and the identifier.\n  #   type<type<type>> alpha\n  match = Search(r'>>[a-zA-Z_]', line)\n  if match:\n    error(filename, linenum, 'whitespace/operators', 3,\n          'Missing spaces around >>')\n\n  # There shouldn't be space around unary operators\n  match = Search(r'(!\\s|~\\s|[\\s]--[\\s;]|[\\s]\\+\\+[\\s;])', line)\n  if match:\n    error(filename, linenum, 'whitespace/operators', 4,\n          'Extra space for operator %s' % match.group(1))\n\n\ndef CheckParenthesisSpacing(filename, clean_lines, linenum, error):\n  \"\"\"Checks for horizontal spacing around parentheses.\n\n  Args:\n    filename: The name of the current file.\n    clean_lines: A CleansedLines instance containing the file.\n    linenum: The number of the line to check.\n    error: The function to call with any errors found.\n  \"\"\"\n  line = clean_lines.elided[linenum]\n\n  # No spaces after an if, while, switch, or for\n  match = Search(r' (if\\(|for\\(|while\\(|switch\\()', line)\n  if match:\n    error(filename, linenum, 'whitespace/parens', 5,\n          'Missing space before ( in %s' % match.group(1))\n\n  # For if/for/while/switch, the left and right parens should be\n  # consistent about how many spaces are inside the parens, and\n  # there should either be zero or one spaces inside the parens.\n  # We don't want: \"if ( foo)\" or \"if ( foo   )\".\n  # Exception: \"for ( ; foo; bar)\" and \"for (foo; bar; )\" are allowed.\n  match = Search(r'\\b(if|for|while|switch)\\s*'\n                 r'\\(([ ]*)(.).*[^ ]+([ ]*)\\)\\s*{\\s*$',\n                 line)\n  if match:\n    if len(match.group(2)) != len(match.group(4)):\n      if not (match.group(3) == ';' and\n              len(match.group(2)) == 1 + len(match.group(4)) or\n              not match.group(2) and Search(r'\\bfor\\s*\\(.*; \\)', line)):\n        error(filename, linenum, 'whitespace/parens', 5,\n              'Mismatching spaces inside () in %s' % match.group(1))\n    if len(match.group(2)) not in [0, 1]:\n      error(filename, linenum, 'whitespace/parens', 5,\n            'Should have zero or one spaces inside ( and ) in %s' %\n            match.group(1))\n\n\ndef CheckCommaSpacing(filename, clean_lines, linenum, error):\n  \"\"\"Checks for horizontal spacing near commas and semicolons.\n\n  Args:\n    filename: The name of the current file.\n    clean_lines: A CleansedLines instance containing the file.\n    linenum: The number of the line to check.\n    error: The function to call with any errors found.\n  \"\"\"\n  raw = clean_lines.lines_without_raw_strings\n  line = clean_lines.elided[linenum]\n\n  # You should always have a space after a comma (either as fn arg or operator)\n  #\n  # This does not apply when the non-space character following the\n  # comma is another comma, since the only time when that happens is\n  # for empty macro arguments.\n  #\n  # We run this check in two passes: first pass on elided lines to\n  # verify that lines contain missing whitespaces, second pass on raw\n  # lines to confirm that those missing whitespaces are not due to\n  # elided comments.\n  if Search(r',[^,\\s]', line) and Search(r',[^,\\s]', raw[linenum]):\n    error(filename, linenum, 'whitespace/comma', 3,\n          'Missing space after ,')\n\n  # You should always have a space after a semicolon\n  # except for few corner cases\n  # TODO(unknown): clarify if 'if (1) { return 1;}' is requires one more\n  # space after ;\n  if Search(r';[^\\s};\\\\)/]', line):\n    error(filename, linenum, 'whitespace/semicolon', 3,\n          'Missing space after ;')\n\n\ndef CheckBracesSpacing(filename, clean_lines, linenum, error):\n  \"\"\"Checks for horizontal spacing near commas.\n\n  Args:\n    filename: The name of the current file.\n    clean_lines: A CleansedLines instance containing the file.\n    linenum: The number of the line to check.\n    error: The function to call with any errors found.\n  \"\"\"\n  line = clean_lines.elided[linenum]\n\n  # Except after an opening paren, or after another opening brace (in case of\n  # an initializer list, for instance), you should have spaces before your\n  # braces. And since you should never have braces at the beginning of a line,\n  # this is an easy test.\n  match = Match(r'^(.*[^ ({]){', line)\n  if match:\n    # Try a bit harder to check for brace initialization.  This\n    # happens in one of the following forms:\n    #   Constructor() : initializer_list_{} { ... }\n    #   Constructor{}.MemberFunction()\n    #   Type variable{};\n    #   FunctionCall(type{}, ...);\n    #   LastArgument(..., type{});\n    #   LOG(INFO) << type{} << \" ...\";\n    #   map_of_type[{...}] = ...;\n    #   ternary = expr ? new type{} : nullptr;\n    #   OuterTemplate<InnerTemplateConstructor<Type>{}>\n    #\n    # We check for the character following the closing brace, and\n    # silence the warning if it's one of those listed above, i.e.\n    # \"{.;,)<>]:\".\n    #\n    # To account for nested initializer list, we allow any number of\n    # closing braces up to \"{;,)<\".  We can't simply silence the\n    # warning on first sight of closing brace, because that would\n    # cause false negatives for things that are not initializer lists.\n    #   Silence this:         But not this:\n    #     Outer{                if (...) {\n    #       Inner{...}            if (...){  // Missing space before {\n    #     };                    }\n    #\n    # There is a false negative with this approach if people inserted\n    # spurious semicolons, e.g. \"if (cond){};\", but we will catch the\n    # spurious semicolon with a separate check.\n    (endline, endlinenum, endpos) = CloseExpression(\n        clean_lines, linenum, len(match.group(1)))\n    trailing_text = ''\n    if endpos > -1:\n      trailing_text = endline[endpos:]\n    for offset in xrange(endlinenum + 1,\n                         min(endlinenum + 3, clean_lines.NumLines() - 1)):\n      trailing_text += clean_lines.elided[offset]\n    if not Match(r'^[\\s}]*[{.;,)<>\\]:]', trailing_text):\n      error(filename, linenum, 'whitespace/braces', 5,\n            'Missing space before {')\n\n  # Make sure '} else {' has spaces.\n  if Search(r'}else', line):\n    error(filename, linenum, 'whitespace/braces', 5,\n          'Missing space before else')\n\n  # You shouldn't have a space before a semicolon at the end of the line.\n  # There's a special case for \"for\" since the style guide allows space before\n  # the semicolon there.\n  if Search(r':\\s*;\\s*$', line):\n    error(filename, linenum, 'whitespace/semicolon', 5,\n          'Semicolon defining empty statement. Use {} instead.')\n  elif Search(r'^\\s*;\\s*$', line):\n    error(filename, linenum, 'whitespace/semicolon', 5,\n          'Line contains only semicolon. If this should be an empty statement, '\n          'use {} instead.')\n  elif (Search(r'\\s+;\\s*$', line) and\n        not Search(r'\\bfor\\b', line)):\n    error(filename, linenum, 'whitespace/semicolon', 5,\n          'Extra space before last semicolon. If this should be an empty '\n          'statement, use {} instead.')\n\n\ndef IsDecltype(clean_lines, linenum, column):\n  \"\"\"Check if the token ending on (linenum, column) is decltype().\n\n  Args:\n    clean_lines: A CleansedLines instance containing the file.\n    linenum: the number of the line to check.\n    column: end column of the token to check.\n  Returns:\n    True if this token is decltype() expression, False otherwise.\n  \"\"\"\n  (text, _, start_col) = ReverseCloseExpression(clean_lines, linenum, column)\n  if start_col < 0:\n    return False\n  if Search(r'\\bdecltype\\s*$', text[0:start_col]):\n    return True\n  return False\n\n\ndef IsTemplateParameterList(clean_lines, linenum, column):\n  \"\"\"Check if the token ending on (linenum, column) is the end of template<>.\n\n  Args:\n    clean_lines: A CleansedLines instance containing the file.\n    linenum: the number of the line to check.\n    column: end column of the token to check.\n  Returns:\n    True if this token is end of a template parameter list, False otherwise.\n  \"\"\"\n  (_, startline, startpos) = ReverseCloseExpression(\n      clean_lines, linenum, column)\n  if (startpos > -1 and\n      Search(r'\\btemplate\\s*$', clean_lines.elided[startline][0:startpos])):\n    return True\n  return False\n\n\ndef IsRValueType(clean_lines, nesting_state, linenum, column):\n  \"\"\"Check if the token ending on (linenum, column) is a type.\n\n  Assumes that text to the right of the column is \"&&\" or a function\n  name.\n\n  Args:\n    clean_lines: A CleansedLines instance containing the file.\n    nesting_state: A NestingState instance which maintains information about\n                   the current stack of nested blocks being parsed.\n    linenum: the number of the line to check.\n    column: end column of the token to check.\n  Returns:\n    True if this token is a type, False if we are not sure.\n  \"\"\"\n  prefix = clean_lines.elided[linenum][0:column]\n\n  # Get one word to the left.  If we failed to do so, this is most\n  # likely not a type, since it's unlikely that the type name and \"&&\"\n  # would be split across multiple lines.\n  match = Match(r'^(.*)(\\b\\w+|[>*)&])\\s*$', prefix)\n  if not match:\n    return False\n\n  # Check text following the token.  If it's \"&&>\" or \"&&,\" or \"&&...\", it's\n  # most likely a rvalue reference used inside a template.\n  suffix = clean_lines.elided[linenum][column:]\n  if Match(r'&&\\s*(?:[>,]|\\.\\.\\.)', suffix):\n    return True\n\n  # Check for simple type and end of templates:\n  #   int&& variable\n  #   vector<int>&& variable\n  #\n  # Because this function is called recursively, we also need to\n  # recognize pointer and reference types:\n  #   int* Function()\n  #   int& Function()\n  if match.group(2) in ['char', 'char16_t', 'char32_t', 'wchar_t', 'bool',\n                        'short', 'int', 'long', 'signed', 'unsigned',\n                        'float', 'double', 'void', 'auto', '>', '*', '&']:\n    return True\n\n  # If we see a close parenthesis, look for decltype on the other side.\n  # decltype would unambiguously identify a type, anything else is\n  # probably a parenthesized expression and not a type.\n  if match.group(2) == ')':\n    return IsDecltype(\n        clean_lines, linenum, len(match.group(1)) + len(match.group(2)) - 1)\n\n  # Check for casts and cv-qualifiers.\n  #   match.group(1)  remainder\n  #   --------------  ---------\n  #   const_cast<     type&&\n  #   const           type&&\n  #   type            const&&\n  if Search(r'\\b(?:const_cast\\s*<|static_cast\\s*<|dynamic_cast\\s*<|'\n            r'reinterpret_cast\\s*<|\\w+\\s)\\s*$',\n            match.group(1)):\n    return True\n\n  # Look for a preceding symbol that might help differentiate the context.\n  # These are the cases that would be ambiguous:\n  #   match.group(1)  remainder\n  #   --------------  ---------\n  #   Call         (   expression &&\n  #   Declaration  (   type&&\n  #   sizeof       (   type&&\n  #   if           (   expression &&\n  #   while        (   expression &&\n  #   for          (   type&&\n  #   for(         ;   expression &&\n  #   statement    ;   type&&\n  #   block        {   type&&\n  #   constructor  {   expression &&\n  start = linenum\n  line = match.group(1)\n  match_symbol = None\n  while start >= 0:\n    # We want to skip over identifiers and commas to get to a symbol.\n    # Commas are skipped so that we can find the opening parenthesis\n    # for function parameter lists.\n    match_symbol = Match(r'^(.*)([^\\w\\s,])[\\w\\s,]*$', line)\n    if match_symbol:\n      break\n    start -= 1\n    line = clean_lines.elided[start]\n\n  if not match_symbol:\n    # Probably the first statement in the file is an rvalue reference\n    return True\n\n  if match_symbol.group(2) == '}':\n    # Found closing brace, probably an indicate of this:\n    #   block{} type&&\n    return True\n\n  if match_symbol.group(2) == ';':\n    # Found semicolon, probably one of these:\n    #   for(; expression &&\n    #   statement; type&&\n\n    # Look for the previous 'for(' in the previous lines.\n    before_text = match_symbol.group(1)\n    for i in xrange(start - 1, max(start - 6, 0), -1):\n      before_text = clean_lines.elided[i] + before_text\n    if Search(r'for\\s*\\([^{};]*$', before_text):\n      # This is the condition inside a for-loop\n      return False\n\n    # Did not find a for-init-statement before this semicolon, so this\n    # is probably a new statement and not a condition.\n    return True\n\n  if match_symbol.group(2) == '{':\n    # Found opening brace, probably one of these:\n    #   block{ type&& = ... ; }\n    #   constructor{ expression && expression }\n\n    # Look for a closing brace or a semicolon.  If we see a semicolon\n    # first, this is probably a rvalue reference.\n    line = clean_lines.elided[start][0:len(match_symbol.group(1)) + 1]\n    end = start\n    depth = 1\n    while True:\n      for ch in line:\n        if ch == ';':\n          return True\n        elif ch == '{':\n          depth += 1\n        elif ch == '}':\n          depth -= 1\n          if depth == 0:\n            return False\n      end += 1\n      if end >= clean_lines.NumLines():\n        break\n      line = clean_lines.elided[end]\n    # Incomplete program?\n    return False\n\n  if match_symbol.group(2) == '(':\n    # Opening parenthesis.  Need to check what's to the left of the\n    # parenthesis.  Look back one extra line for additional context.\n    before_text = match_symbol.group(1)\n    if linenum > 1:\n      before_text = clean_lines.elided[linenum - 1] + before_text\n    before_text = match_symbol.group(1)\n\n    # Patterns that are likely to be types:\n    #   [](type&&\n    #   for (type&&\n    #   sizeof(type&&\n    #   operator=(type&&\n    #\n    if Search(r'(?:\\]|\\bfor|\\bsizeof|\\boperator\\s*\\S+\\s*)\\s*$', before_text):\n      return True\n\n    # Patterns that are likely to be expressions:\n    #   if (expression &&\n    #   while (expression &&\n    #   : initializer(expression &&\n    #   , initializer(expression &&\n    #   ( FunctionCall(expression &&\n    #   + FunctionCall(expression &&\n    #   + (expression &&\n    #\n    # The last '+' represents operators such as '+' and '-'.\n    if Search(r'(?:\\bif|\\bwhile|[-+=%^(<!?:,&*]\\s*)$', before_text):\n      return False\n\n    # Something else.  Check that tokens to the left look like\n    #   return_type function_name\n    match_func = Match(r'^(.*)\\s+\\w(?:\\w|::)*(?:<[^<>]*>)?\\s*$',\n                       match_symbol.group(1))\n    if match_func:\n      # Check for constructors, which don't have return types.\n      if Search(r'\\bexplicit$', match_func.group(1)):\n        return True\n      implicit_constructor = Match(r'\\s*(\\w+)\\((?:const\\s+)?(\\w+)', prefix)\n      if (implicit_constructor and\n          implicit_constructor.group(1) == implicit_constructor.group(2)):\n        return True\n      return IsRValueType(clean_lines, nesting_state, linenum,\n                          len(match_func.group(1)))\n\n    # Nothing before the function name.  If this is inside a block scope,\n    # this is probably a function call.\n    return not (nesting_state.previous_stack_top and\n                nesting_state.previous_stack_top.IsBlockInfo())\n\n  if match_symbol.group(2) == '>':\n    # Possibly a closing bracket, check that what's on the other side\n    # looks like the start of a template.\n    return IsTemplateParameterList(\n        clean_lines, start, len(match_symbol.group(1)))\n\n  # Some other symbol, usually something like \"a=b&&c\".  This is most\n  # likely not a type.\n  return False\n\n\ndef IsRValueAllowed(clean_lines, linenum):\n  \"\"\"Check if RValue reference is allowed within some range of lines.\n\n  Args:\n    clean_lines: A CleansedLines instance containing the file.\n    linenum: The number of the line to check.\n  Returns:\n    True if line is within the region where RValue references are allowed.\n  \"\"\"\n  for i in xrange(linenum, 0, -1):\n    line = clean_lines.elided[i]\n    if Match(r'GOOGLE_ALLOW_RVALUE_REFERENCES_(?:PUSH|POP)', line):\n      if not line.endswith('PUSH'):\n        return False\n      for j in xrange(linenum, clean_lines.NumLines(), 1):\n        line = clean_lines.elided[j]\n        if Match(r'GOOGLE_ALLOW_RVALUE_REFERENCES_(?:PUSH|POP)', line):\n          return line.endswith('POP')\n  return False\n\n\ndef CheckRValueReference(filename, clean_lines, linenum, nesting_state, error):\n  \"\"\"Check for rvalue references.\n\n  Args:\n    filename: The name of the current file.\n    clean_lines: A CleansedLines instance containing the file.\n    linenum: The number of the line to check.\n    nesting_state: A NestingState instance which maintains information about\n                   the current stack of nested blocks being parsed.\n    error: The function to call with any errors found.\n  \"\"\"\n  # Find lines missing spaces around &&.\n  # TODO(unknown): currently we don't check for rvalue references\n  # with spaces surrounding the && to avoid false positives with\n  # boolean expressions.\n  line = clean_lines.elided[linenum]\n  match = Match(r'^(.*\\S)&&', line)\n  if not match:\n    match = Match(r'(.*)&&\\S', line)\n  if (not match) or '(&&)' in line or Search(r'\\boperator\\s*$', match.group(1)):\n    return\n\n  # Either poorly formed && or an rvalue reference, check the context\n  # to get a more accurate error message.  Mostly we want to determine\n  # if what's to the left of \"&&\" is a type or not.\n  and_pos = len(match.group(1))\n  if IsRValueType(clean_lines, nesting_state, linenum, and_pos):\n    if not IsRValueAllowed(clean_lines, linenum):\n      error(filename, linenum, 'build/c++11', 3,\n            'RValue references are an unapproved C++ feature.')\n  else:\n    error(filename, linenum, 'whitespace/operators', 3,\n          'Missing spaces around &&')\n\n\ndef CheckSectionSpacing(filename, clean_lines, class_info, linenum, error):\n  \"\"\"Checks for additional blank line issues related to sections.\n\n  Currently the only thing checked here is blank line before protected/private.\n\n  Args:\n    filename: The name of the current file.\n    clean_lines: A CleansedLines instance containing the file.\n    class_info: A _ClassInfo objects.\n    linenum: The number of the line to check.\n    error: The function to call with any errors found.\n  \"\"\"\n  # Skip checks if the class is small, where small means 25 lines or less.\n  # 25 lines seems like a good cutoff since that's the usual height of\n  # terminals, and any class that can't fit in one screen can't really\n  # be considered \"small\".\n  #\n  # Also skip checks if we are on the first line.  This accounts for\n  # classes that look like\n  #   class Foo { public: ... };\n  #\n  # If we didn't find the end of the class, last_line would be zero,\n  # and the check will be skipped by the first condition.\n  if (class_info.last_line - class_info.starting_linenum <= 24 or\n      linenum <= class_info.starting_linenum):\n    return\n\n  matched = Match(r'\\s*(public|protected|private):', clean_lines.lines[linenum])\n  if matched:\n    # Issue warning if the line before public/protected/private was\n    # not a blank line, but don't do this if the previous line contains\n    # \"class\" or \"struct\".  This can happen two ways:\n    #  - We are at the beginning of the class.\n    #  - We are forward-declaring an inner class that is semantically\n    #    private, but needed to be public for implementation reasons.\n    # Also ignores cases where the previous line ends with a backslash as can be\n    # common when defining classes in C macros.\n    prev_line = clean_lines.lines[linenum - 1]\n    if (not IsBlankLine(prev_line) and\n        not Search(r'\\b(class|struct)\\b', prev_line) and\n        not Search(r'\\\\$', prev_line)):\n      # Try a bit harder to find the beginning of the class.  This is to\n      # account for multi-line base-specifier lists, e.g.:\n      #   class Derived\n      #       : public Base {\n      end_class_head = class_info.starting_linenum\n      for i in range(class_info.starting_linenum, linenum):\n        if Search(r'\\{\\s*$', clean_lines.lines[i]):\n          end_class_head = i\n          break\n      if end_class_head < linenum - 1:\n        error(filename, linenum, 'whitespace/blank_line', 3,\n              '\"%s:\" should be preceded by a blank line' % matched.group(1))\n\n\ndef GetPreviousNonBlankLine(clean_lines, linenum):\n  \"\"\"Return the most recent non-blank line and its line number.\n\n  Args:\n    clean_lines: A CleansedLines instance containing the file contents.\n    linenum: The number of the line to check.\n\n  Returns:\n    A tuple with two elements.  The first element is the contents of the last\n    non-blank line before the current line, or the empty string if this is the\n    first non-blank line.  The second is the line number of that line, or -1\n    if this is the first non-blank line.\n  \"\"\"\n\n  prevlinenum = linenum - 1\n  while prevlinenum >= 0:\n    prevline = clean_lines.elided[prevlinenum]\n    if not IsBlankLine(prevline):     # if not a blank line...\n      return (prevline, prevlinenum)\n    prevlinenum -= 1\n  return ('', -1)\n\n\ndef CheckBraces(filename, clean_lines, linenum, error):\n  \"\"\"Looks for misplaced braces (e.g. at the end of line).\n\n  Args:\n    filename: The name of the current file.\n    clean_lines: A CleansedLines instance containing the file.\n    linenum: The number of the line to check.\n    error: The function to call with any errors found.\n  \"\"\"\n\n  line = clean_lines.elided[linenum]        # get rid of comments and strings\n\n  if Match(r'\\s*{\\s*$', line):\n    # We allow an open brace to start a line in the case where someone is using\n    # braces in a block to explicitly create a new scope, which is commonly used\n    # to control the lifetime of stack-allocated variables.  Braces are also\n    # used for brace initializers inside function calls.  We don't detect this\n    # perfectly: we just don't complain if the last non-whitespace character on\n    # the previous non-blank line is ',', ';', ':', '(', '{', or '}', or if the\n    # previous line starts a preprocessor block.\n    prevline = GetPreviousNonBlankLine(clean_lines, linenum)[0]\n    if (not Search(r'[,;:}{(]\\s*$', prevline) and\n        not Match(r'\\s*#', prevline)):\n      error(filename, linenum, 'whitespace/braces', 4,\n            '{ should almost always be at the end of the previous line')\n\n  # An else clause should be on the same line as the preceding closing brace.\n  if Match(r'\\s*else\\b\\s*(?:if\\b|\\{|$)', line):\n    prevline = GetPreviousNonBlankLine(clean_lines, linenum)[0]\n    if Match(r'\\s*}\\s*$', prevline):\n      error(filename, linenum, 'whitespace/newline', 4,\n            'An else should appear on the same line as the preceding }')\n\n  # If braces come on one side of an else, they should be on both.\n  # However, we have to worry about \"else if\" that spans multiple lines!\n  if Search(r'else if\\s*\\(', line):       # could be multi-line if\n    brace_on_left = bool(Search(r'}\\s*else if\\s*\\(', line))\n    # find the ( after the if\n    pos = line.find('else if')\n    pos = line.find('(', pos)\n    if pos > 0:\n      (endline, _, endpos) = CloseExpression(clean_lines, linenum, pos)\n      brace_on_right = endline[endpos:].find('{') != -1\n      if brace_on_left != brace_on_right:    # must be brace after if\n        error(filename, linenum, 'readability/braces', 5,\n              'If an else has a brace on one side, it should have it on both')\n  elif Search(r'}\\s*else[^{]*$', line) or Match(r'[^}]*else\\s*{', line):\n    error(filename, linenum, 'readability/braces', 5,\n          'If an else has a brace on one side, it should have it on both')\n\n  # Likewise, an else should never have the else clause on the same line\n  if Search(r'\\belse [^\\s{]', line) and not Search(r'\\belse if\\b', line):\n    error(filename, linenum, 'whitespace/newline', 4,\n          'Else clause should never be on same line as else (use 2 lines)')\n\n  # In the same way, a do/while should never be on one line\n  if Match(r'\\s*do [^\\s{]', line):\n    error(filename, linenum, 'whitespace/newline', 4,\n          'do/while clauses should not be on a single line')\n\n  # Check single-line if/else bodies. The style guide says 'curly braces are not\n  # required for single-line statements'. We additionally allow multi-line,\n  # single statements, but we reject anything with more than one semicolon in\n  # it. This means that the first semicolon after the if should be at the end of\n  # its line, and the line after that should have an indent level equal to or\n  # lower than the if. We also check for ambiguous if/else nesting without\n  # braces.\n  if_else_match = Search(r'\\b(if\\s*\\(|else\\b)', line)\n  if if_else_match and not Match(r'\\s*#', line):\n    if_indent = GetIndentLevel(line)\n    endline, endlinenum, endpos = line, linenum, if_else_match.end()\n    if_match = Search(r'\\bif\\s*\\(', line)\n    if if_match:\n      # This could be a multiline if condition, so find the end first.\n      pos = if_match.end() - 1\n      (endline, endlinenum, endpos) = CloseExpression(clean_lines, linenum, pos)\n    # Check for an opening brace, either directly after the if or on the next\n    # line. If found, this isn't a single-statement conditional.\n    if (not Match(r'\\s*{', endline[endpos:])\n        and not (Match(r'\\s*$', endline[endpos:])\n                 and endlinenum < (len(clean_lines.elided) - 1)\n                 and Match(r'\\s*{', clean_lines.elided[endlinenum + 1]))):\n      while (endlinenum < len(clean_lines.elided)\n             and ';' not in clean_lines.elided[endlinenum][endpos:]):\n        endlinenum += 1\n        endpos = 0\n      if endlinenum < len(clean_lines.elided):\n        endline = clean_lines.elided[endlinenum]\n        # We allow a mix of whitespace and closing braces (e.g. for one-liner\n        # methods) and a single \\ after the semicolon (for macros)\n        endpos = endline.find(';')\n        if not Match(r';[\\s}]*(\\\\?)$', endline[endpos:]):\n          # Semicolon isn't the last character, there's something trailing\n          error(filename, linenum, 'readability/braces', 4,\n                'If/else bodies with multiple statements require braces')\n        elif endlinenum < len(clean_lines.elided) - 1:\n          # Make sure the next line is dedented\n          next_line = clean_lines.elided[endlinenum + 1]\n          next_indent = GetIndentLevel(next_line)\n          # With ambiguous nested if statements, this will error out on the\n          # if that *doesn't* match the else, regardless of whether it's the\n          # inner one or outer one.\n          if (if_match and Match(r'\\s*else\\b', next_line)\n              and next_indent != if_indent):\n            error(filename, linenum, 'readability/braces', 4,\n                  'Else clause should be indented at the same level as if. '\n                  'Ambiguous nested if/else chains require braces.')\n          elif next_indent > if_indent:\n            error(filename, linenum, 'readability/braces', 4,\n                  'If/else bodies with multiple statements require braces')\n\n\ndef CheckTrailingSemicolon(filename, clean_lines, linenum, error):\n  \"\"\"Looks for redundant trailing semicolon.\n\n  Args:\n    filename: The name of the current file.\n    clean_lines: A CleansedLines instance containing the file.\n    linenum: The number of the line to check.\n    error: The function to call with any errors found.\n  \"\"\"\n\n  line = clean_lines.elided[linenum]\n\n  # Block bodies should not be followed by a semicolon.  Due to C++11\n  # brace initialization, there are more places where semicolons are\n  # required than not, so we use a whitelist approach to check these\n  # rather than a blacklist.  These are the places where \"};\" should\n  # be replaced by just \"}\":\n  # 1. Some flavor of block following closing parenthesis:\n  #    for (;;) {};\n  #    while (...) {};\n  #    switch (...) {};\n  #    Function(...) {};\n  #    if (...) {};\n  #    if (...) else if (...) {};\n  #\n  # 2. else block:\n  #    if (...) else {};\n  #\n  # 3. const member function:\n  #    Function(...) const {};\n  #\n  # 4. Block following some statement:\n  #    x = 42;\n  #    {};\n  #\n  # 5. Block at the beginning of a function:\n  #    Function(...) {\n  #      {};\n  #    }\n  #\n  #    Note that naively checking for the preceding \"{\" will also match\n  #    braces inside multi-dimensional arrays, but this is fine since\n  #    that expression will not contain semicolons.\n  #\n  # 6. Block following another block:\n  #    while (true) {}\n  #    {};\n  #\n  # 7. End of namespaces:\n  #    namespace {};\n  #\n  #    These semicolons seems far more common than other kinds of\n  #    redundant semicolons, possibly due to people converting classes\n  #    to namespaces.  For now we do not warn for this case.\n  #\n  # Try matching case 1 first.\n  match = Match(r'^(.*\\)\\s*)\\{', line)\n  if match:\n    # Matched closing parenthesis (case 1).  Check the token before the\n    # matching opening parenthesis, and don't warn if it looks like a\n    # macro.  This avoids these false positives:\n    #  - macro that defines a base class\n    #  - multi-line macro that defines a base class\n    #  - macro that defines the whole class-head\n    #\n    # But we still issue warnings for macros that we know are safe to\n    # warn, specifically:\n    #  - TEST, TEST_F, TEST_P, MATCHER, MATCHER_P\n    #  - TYPED_TEST\n    #  - INTERFACE_DEF\n    #  - EXCLUSIVE_LOCKS_REQUIRED, SHARED_LOCKS_REQUIRED, LOCKS_EXCLUDED:\n    #\n    # We implement a whitelist of safe macros instead of a blacklist of\n    # unsafe macros, even though the latter appears less frequently in\n    # google code and would have been easier to implement.  This is because\n    # the downside for getting the whitelist wrong means some extra\n    # semicolons, while the downside for getting the blacklist wrong\n    # would result in compile errors.\n    #\n    # In addition to macros, we also don't want to warn on compound\n    # literals and lambdas.\n    closing_brace_pos = match.group(1).rfind(')')\n    opening_parenthesis = ReverseCloseExpression(\n        clean_lines, linenum, closing_brace_pos)\n    if opening_parenthesis[2] > -1:\n      line_prefix = opening_parenthesis[0][0:opening_parenthesis[2]]\n      macro = Search(r'\\b([A-Z_]+)\\s*$', line_prefix)\n      func = Match(r'^(.*\\])\\s*$', line_prefix)\n      if ((macro and\n           macro.group(1) not in (\n               'TEST', 'TEST_F', 'MATCHER', 'MATCHER_P', 'TYPED_TEST',\n               'EXCLUSIVE_LOCKS_REQUIRED', 'SHARED_LOCKS_REQUIRED',\n               'LOCKS_EXCLUDED', 'INTERFACE_DEF')) or\n          (func and not Search(r'\\boperator\\s*\\[\\s*\\]', func.group(1))) or\n          Search(r'\\s+=\\s*$', line_prefix)):\n        match = None\n    if (match and\n        opening_parenthesis[1] > 1 and\n        Search(r'\\]\\s*$', clean_lines.elided[opening_parenthesis[1] - 1])):\n      # Multi-line lambda-expression\n      match = None\n\n  else:\n    # Try matching cases 2-3.\n    match = Match(r'^(.*(?:else|\\)\\s*const)\\s*)\\{', line)\n    if not match:\n      # Try matching cases 4-6.  These are always matched on separate lines.\n      #\n      # Note that we can't simply concatenate the previous line to the\n      # current line and do a single match, otherwise we may output\n      # duplicate warnings for the blank line case:\n      #   if (cond) {\n      #     // blank line\n      #   }\n      prevline = GetPreviousNonBlankLine(clean_lines, linenum)[0]\n      if prevline and Search(r'[;{}]\\s*$', prevline):\n        match = Match(r'^(\\s*)\\{', line)\n\n  # Check matching closing brace\n  if match:\n    (endline, endlinenum, endpos) = CloseExpression(\n        clean_lines, linenum, len(match.group(1)))\n    if endpos > -1 and Match(r'^\\s*;', endline[endpos:]):\n      # Current {} pair is eligible for semicolon check, and we have found\n      # the redundant semicolon, output warning here.\n      #\n      # Note: because we are scanning forward for opening braces, and\n      # outputting warnings for the matching closing brace, if there are\n      # nested blocks with trailing semicolons, we will get the error\n      # messages in reversed order.\n      error(filename, endlinenum, 'readability/braces', 4,\n            \"You don't need a ; after a }\")\n\n\ndef CheckEmptyBlockBody(filename, clean_lines, linenum, error):\n  \"\"\"Look for empty loop/conditional body with only a single semicolon.\n\n  Args:\n    filename: The name of the current file.\n    clean_lines: A CleansedLines instance containing the file.\n    linenum: The number of the line to check.\n    error: The function to call with any errors found.\n  \"\"\"\n\n  # Search for loop keywords at the beginning of the line.  Because only\n  # whitespaces are allowed before the keywords, this will also ignore most\n  # do-while-loops, since those lines should start with closing brace.\n  #\n  # We also check \"if\" blocks here, since an empty conditional block\n  # is likely an error.\n  line = clean_lines.elided[linenum]\n  matched = Match(r'\\s*(for|while|if)\\s*\\(', line)\n  if matched:\n    # Find the end of the conditional expression\n    (end_line, end_linenum, end_pos) = CloseExpression(\n        clean_lines, linenum, line.find('('))\n\n    # Output warning if what follows the condition expression is a semicolon.\n    # No warning for all other cases, including whitespace or newline, since we\n    # have a separate check for semicolons preceded by whitespace.\n    if end_pos >= 0 and Match(r';', end_line[end_pos:]):\n      if matched.group(1) == 'if':\n        error(filename, end_linenum, 'whitespace/empty_conditional_body', 5,\n              'Empty conditional bodies should use {}')\n      else:\n        error(filename, end_linenum, 'whitespace/empty_loop_body', 5,\n              'Empty loop bodies should use {} or continue')\n\n\ndef FindCheckMacro(line):\n  \"\"\"Find a replaceable CHECK-like macro.\n\n  Args:\n    line: line to search on.\n  Returns:\n    (macro name, start position), or (None, -1) if no replaceable\n    macro is found.\n  \"\"\"\n  for macro in _CHECK_MACROS:\n    i = line.find(macro)\n    if i >= 0:\n      # Find opening parenthesis.  Do a regular expression match here\n      # to make sure that we are matching the expected CHECK macro, as\n      # opposed to some other macro that happens to contain the CHECK\n      # substring.\n      matched = Match(r'^(.*\\b' + macro + r'\\s*)\\(', line)\n      if not matched:\n        continue\n      return (macro, len(matched.group(1)))\n  return (None, -1)\n\n\ndef CheckCheck(filename, clean_lines, linenum, error):\n  \"\"\"Checks the use of CHECK and EXPECT macros.\n\n  Args:\n    filename: The name of the current file.\n    clean_lines: A CleansedLines instance containing the file.\n    linenum: The number of the line to check.\n    error: The function to call with any errors found.\n  \"\"\"\n\n  # Decide the set of replacement macros that should be suggested\n  lines = clean_lines.elided\n  (check_macro, start_pos) = FindCheckMacro(lines[linenum])\n  if not check_macro:\n    return\n\n  # Find end of the boolean expression by matching parentheses\n  (last_line, end_line, end_pos) = CloseExpression(\n      clean_lines, linenum, start_pos)\n  if end_pos < 0:\n    return\n  if linenum == end_line:\n    expression = lines[linenum][start_pos + 1:end_pos - 1]\n  else:\n    expression = lines[linenum][start_pos + 1:]\n    for i in xrange(linenum + 1, end_line):\n      expression += lines[i]\n    expression += last_line[0:end_pos - 1]\n\n  # Parse expression so that we can take parentheses into account.\n  # This avoids false positives for inputs like \"CHECK((a < 4) == b)\",\n  # which is not replaceable by CHECK_LE.\n  lhs = ''\n  rhs = ''\n  operator = None\n  while expression:\n    matched = Match(r'^\\s*(<<|<<=|>>|>>=|->\\*|->|&&|\\|\\||'\n                    r'==|!=|>=|>|<=|<|\\()(.*)$', expression)\n    if matched:\n      token = matched.group(1)\n      if token == '(':\n        # Parenthesized operand\n        expression = matched.group(2)\n        (end, _) = FindEndOfExpressionInLine(expression, 0, ['('])\n        if end < 0:\n          return  # Unmatched parenthesis\n        lhs += '(' + expression[0:end]\n        expression = expression[end:]\n      elif token in ('&&', '||'):\n        # Logical and/or operators.  This means the expression\n        # contains more than one term, for example:\n        #   CHECK(42 < a && a < b);\n        #\n        # These are not replaceable with CHECK_LE, so bail out early.\n        return\n      elif token in ('<<', '<<=', '>>', '>>=', '->*', '->'):\n        # Non-relational operator\n        lhs += token\n        expression = matched.group(2)\n      else:\n        # Relational operator\n        operator = token\n        rhs = matched.group(2)\n        break\n    else:\n      # Unparenthesized operand.  Instead of appending to lhs one character\n      # at a time, we do another regular expression match to consume several\n      # characters at once if possible.  Trivial benchmark shows that this\n      # is more efficient when the operands are longer than a single\n      # character, which is generally the case.\n      matched = Match(r'^([^-=!<>()&|]+)(.*)$', expression)\n      if not matched:\n        matched = Match(r'^(\\s*\\S)(.*)$', expression)\n        if not matched:\n          break\n      lhs += matched.group(1)\n      expression = matched.group(2)\n\n  # Only apply checks if we got all parts of the boolean expression\n  if not (lhs and operator and rhs):\n    return\n\n  # Check that rhs do not contain logical operators.  We already know\n  # that lhs is fine since the loop above parses out && and ||.\n  if rhs.find('&&') > -1 or rhs.find('||') > -1:\n    return\n\n  # At least one of the operands must be a constant literal.  This is\n  # to avoid suggesting replacements for unprintable things like\n  # CHECK(variable != iterator)\n  #\n  # The following pattern matches decimal, hex integers, strings, and\n  # characters (in that order).\n  lhs = lhs.strip()\n  rhs = rhs.strip()\n  match_constant = r'^([-+]?(\\d+|0[xX][0-9a-fA-F]+)[lLuU]{0,3}|\".*\"|\\'.*\\')$'\n  if Match(match_constant, lhs) or Match(match_constant, rhs):\n    # Note: since we know both lhs and rhs, we can provide a more\n    # descriptive error message like:\n    #   Consider using CHECK_EQ(x, 42) instead of CHECK(x == 42)\n    # Instead of:\n    #   Consider using CHECK_EQ instead of CHECK(a == b)\n    #\n    # We are still keeping the less descriptive message because if lhs\n    # or rhs gets long, the error message might become unreadable.\n    error(filename, linenum, 'readability/check', 2,\n          'Consider using %s instead of %s(a %s b)' % (\n              _CHECK_REPLACEMENT[check_macro][operator],\n              check_macro, operator))\n\n\ndef CheckAltTokens(filename, clean_lines, linenum, error):\n  \"\"\"Check alternative keywords being used in boolean expressions.\n\n  Args:\n    filename: The name of the current file.\n    clean_lines: A CleansedLines instance containing the file.\n    linenum: The number of the line to check.\n    error: The function to call with any errors found.\n  \"\"\"\n  line = clean_lines.elided[linenum]\n\n  # Avoid preprocessor lines\n  if Match(r'^\\s*#', line):\n    return\n\n  # Last ditch effort to avoid multi-line comments.  This will not help\n  # if the comment started before the current line or ended after the\n  # current line, but it catches most of the false positives.  At least,\n  # it provides a way to workaround this warning for people who use\n  # multi-line comments in preprocessor macros.\n  #\n  # TODO(unknown): remove this once cpplint has better support for\n  # multi-line comments.\n  if line.find('/*') >= 0 or line.find('*/') >= 0:\n    return\n\n  for match in _ALT_TOKEN_REPLACEMENT_PATTERN.finditer(line):\n    error(filename, linenum, 'readability/alt_tokens', 2,\n          'Use operator %s instead of %s' % (\n              _ALT_TOKEN_REPLACEMENT[match.group(1)], match.group(1)))\n\n\ndef GetLineWidth(line):\n  \"\"\"Determines the width of the line in column positions.\n\n  Args:\n    line: A string, which may be a Unicode string.\n\n  Returns:\n    The width of the line in column positions, accounting for Unicode\n    combining characters and wide characters.\n  \"\"\"\n  if isinstance(line, unicode):\n    width = 0\n    for uc in unicodedata.normalize('NFC', line):\n      if unicodedata.east_asian_width(uc) in ('W', 'F'):\n        width += 2\n      elif not unicodedata.combining(uc):\n        width += 1\n    return width\n  else:\n    return len(line)\n\n\ndef CheckStyle(filename, clean_lines, linenum, file_extension, nesting_state,\n               error):\n  \"\"\"Checks rules from the 'C++ style rules' section of cppguide.html.\n\n  Most of these rules are hard to test (naming, comment style), but we\n  do what we can.  In particular we check for 2-space indents, line lengths,\n  tab usage, spaces inside code, etc.\n\n  Args:\n    filename: The name of the current file.\n    clean_lines: A CleansedLines instance containing the file.\n    linenum: The number of the line to check.\n    file_extension: The extension (without the dot) of the filename.\n    nesting_state: A NestingState instance which maintains information about\n                   the current stack of nested blocks being parsed.\n    error: The function to call with any errors found.\n  \"\"\"\n\n  # Don't use \"elided\" lines here, otherwise we can't check commented lines.\n  # Don't want to use \"raw\" either, because we don't want to check inside C++11\n  # raw strings,\n  raw_lines = clean_lines.lines_without_raw_strings\n  line = raw_lines[linenum]\n\n  if line.find('\\t') != -1:\n    error(filename, linenum, 'whitespace/tab', 1,\n          'Tab found; better to use spaces')\n\n  # One or three blank spaces at the beginning of the line is weird; it's\n  # hard to reconcile that with 2-space indents.\n  # NOTE: here are the conditions rob pike used for his tests.  Mine aren't\n  # as sophisticated, but it may be worth becoming so:  RLENGTH==initial_spaces\n  # if(RLENGTH > 20) complain = 0;\n  # if(match($0, \" +(error|private|public|protected):\")) complain = 0;\n  # if(match(prev, \"&& *$\")) complain = 0;\n  # if(match(prev, \"\\\\|\\\\| *$\")) complain = 0;\n  # if(match(prev, \"[\\\",=><] *$\")) complain = 0;\n  # if(match($0, \" <<\")) complain = 0;\n  # if(match(prev, \" +for \\\\(\")) complain = 0;\n  # if(prevodd && match(prevprev, \" +for \\\\(\")) complain = 0;\n  scope_or_label_pattern = r'\\s*\\w+\\s*:\\s*\\\\?$'\n  classinfo = nesting_state.InnermostClass()\n  initial_spaces = 0\n  cleansed_line = clean_lines.elided[linenum]\n  while initial_spaces < len(line) and line[initial_spaces] == ' ':\n    initial_spaces += 1\n  if line and line[-1].isspace():\n    error(filename, linenum, 'whitespace/end_of_line', 4,\n          'Line ends in whitespace.  Consider deleting these extra spaces.')\n  # There are certain situations we allow one space, notably for\n  # section labels, and also lines containing multi-line raw strings.\n  elif ((initial_spaces == 1 or initial_spaces == 3) and\n        not Match(scope_or_label_pattern, cleansed_line) and\n        not (clean_lines.raw_lines[linenum] != line and\n             Match(r'^\\s*\"\"', line))):\n    error(filename, linenum, 'whitespace/indent', 3,\n          'Weird number of spaces at line-start.  '\n          'Are you using a 2-space indent?')\n\n  # Check if the line is a header guard.\n  is_header_guard = False\n  if file_extension == 'h':\n    cppvar = GetHeaderGuardCPPVariable(filename)\n    if (line.startswith('#ifndef %s' % cppvar) or\n        line.startswith('#define %s' % cppvar) or\n        line.startswith('#endif  // %s' % cppvar)):\n      is_header_guard = True\n  # #include lines and header guards can be long, since there's no clean way to\n  # split them.\n  #\n  # URLs can be long too.  It's possible to split these, but it makes them\n  # harder to cut&paste.\n  #\n  # The \"$Id:...$\" comment may also get very long without it being the\n  # developers fault.\n  if (not line.startswith('#include') and not is_header_guard and\n      not Match(r'^\\s*//.*http(s?)://\\S*$', line) and\n      not Match(r'^// \\$Id:.*#[0-9]+ \\$$', line)):\n    line_width = GetLineWidth(line)\n    extended_length = int((_line_length * 1.25))\n    if line_width > extended_length:\n      error(filename, linenum, 'whitespace/line_length', 4,\n            'Lines should very rarely be longer than %i characters' %\n            extended_length)\n    elif line_width > _line_length:\n      error(filename, linenum, 'whitespace/line_length', 2,\n            'Lines should be <= %i characters long' % _line_length)\n\n  if (cleansed_line.count(';') > 1 and\n      # for loops are allowed two ;'s (and may run over two lines).\n      cleansed_line.find('for') == -1 and\n      (GetPreviousNonBlankLine(clean_lines, linenum)[0].find('for') == -1 or\n       GetPreviousNonBlankLine(clean_lines, linenum)[0].find(';') != -1) and\n      # It's ok to have many commands in a switch case that fits in 1 line\n      not ((cleansed_line.find('case ') != -1 or\n            cleansed_line.find('default:') != -1) and\n           cleansed_line.find('break;') != -1)):\n    error(filename, linenum, 'whitespace/newline', 0,\n          'More than one command on the same line')\n\n  # Some more style checks\n  CheckBraces(filename, clean_lines, linenum, error)\n  CheckTrailingSemicolon(filename, clean_lines, linenum, error)\n  CheckEmptyBlockBody(filename, clean_lines, linenum, error)\n  CheckAccess(filename, clean_lines, linenum, nesting_state, error)\n  CheckSpacing(filename, clean_lines, linenum, nesting_state, error)\n  CheckOperatorSpacing(filename, clean_lines, linenum, error)\n  CheckParenthesisSpacing(filename, clean_lines, linenum, error)\n  CheckCommaSpacing(filename, clean_lines, linenum, error)\n  CheckBracesSpacing(filename, clean_lines, linenum, error)\n  CheckSpacingForFunctionCall(filename, clean_lines, linenum, error)\n  CheckRValueReference(filename, clean_lines, linenum, nesting_state, error)\n  CheckCheck(filename, clean_lines, linenum, error)\n  CheckAltTokens(filename, clean_lines, linenum, error)\n  classinfo = nesting_state.InnermostClass()\n  if classinfo:\n    CheckSectionSpacing(filename, clean_lines, classinfo, linenum, error)\n\n\n_RE_PATTERN_INCLUDE_NEW_STYLE = re.compile(r'#include +\"[^/]+\\.h\"')\n_RE_PATTERN_INCLUDE = re.compile(r'^\\s*#\\s*include\\s*([<\"])([^>\"]*)[>\"].*$')\n# Matches the first component of a filename delimited by -s and _s. That is:\n#  _RE_FIRST_COMPONENT.match('foo').group(0) == 'foo'\n#  _RE_FIRST_COMPONENT.match('foo.cc').group(0) == 'foo'\n#  _RE_FIRST_COMPONENT.match('foo-bar_baz.cc').group(0) == 'foo'\n#  _RE_FIRST_COMPONENT.match('foo_bar-baz.cc').group(0) == 'foo'\n_RE_FIRST_COMPONENT = re.compile(r'^[^-_.]+')\n\n\ndef _DropCommonSuffixes(filename):\n  \"\"\"Drops common suffixes like _test.cc or -inl.h from filename.\n\n  For example:\n    >>> _DropCommonSuffixes('foo/foo-inl.h')\n    'foo/foo'\n    >>> _DropCommonSuffixes('foo/bar/foo.cc')\n    'foo/bar/foo'\n    >>> _DropCommonSuffixes('foo/foo_internal.h')\n    'foo/foo'\n    >>> _DropCommonSuffixes('foo/foo_unusualinternal.h')\n    'foo/foo_unusualinternal'\n\n  Args:\n    filename: The input filename.\n\n  Returns:\n    The filename with the common suffix removed.\n  \"\"\"\n  for suffix in ('test.cc', 'regtest.cc', 'unittest.cc',\n                 'inl.h', 'impl.h', 'internal.h'):\n    if (filename.endswith(suffix) and len(filename) > len(suffix) and\n        filename[-len(suffix) - 1] in ('-', '_')):\n      return filename[:-len(suffix) - 1]\n  return os.path.splitext(filename)[0]\n\n\ndef _IsTestFilename(filename):\n  \"\"\"Determines if the given filename has a suffix that identifies it as a test.\n\n  Args:\n    filename: The input filename.\n\n  Returns:\n    True if 'filename' looks like a test, False otherwise.\n  \"\"\"\n  if (filename.endswith('_test.cc') or\n      filename.endswith('_unittest.cc') or\n      filename.endswith('_regtest.cc')):\n    return True\n  else:\n    return False\n\n\ndef _ClassifyInclude(fileinfo, include, is_system):\n  \"\"\"Figures out what kind of header 'include' is.\n\n  Args:\n    fileinfo: The current file cpplint is running over. A FileInfo instance.\n    include: The path to a #included file.\n    is_system: True if the #include used <> rather than \"\".\n\n  Returns:\n    One of the _XXX_HEADER constants.\n\n  For example:\n    >>> _ClassifyInclude(FileInfo('foo/foo.cc'), 'stdio.h', True)\n    _C_SYS_HEADER\n    >>> _ClassifyInclude(FileInfo('foo/foo.cc'), 'string', True)\n    _CPP_SYS_HEADER\n    >>> _ClassifyInclude(FileInfo('foo/foo.cc'), 'foo/foo.h', False)\n    _LIKELY_MY_HEADER\n    >>> _ClassifyInclude(FileInfo('foo/foo_unknown_extension.cc'),\n    ...                  'bar/foo_other_ext.h', False)\n    _POSSIBLE_MY_HEADER\n    >>> _ClassifyInclude(FileInfo('foo/foo.cc'), 'foo/bar.h', False)\n    _OTHER_HEADER\n  \"\"\"\n  # This is a list of all standard c++ header files, except\n  # those already checked for above.\n  is_cpp_h = include in _CPP_HEADERS\n\n  if is_system:\n    if is_cpp_h:\n      return _CPP_SYS_HEADER\n    else:\n      return _C_SYS_HEADER\n\n  # If the target file and the include we're checking share a\n  # basename when we drop common extensions, and the include\n  # lives in . , then it's likely to be owned by the target file.\n  target_dir, target_base = (\n      os.path.split(_DropCommonSuffixes(fileinfo.RepositoryName())))\n  include_dir, include_base = os.path.split(_DropCommonSuffixes(include))\n  if target_base == include_base and (\n      include_dir == target_dir or\n      include_dir == os.path.normpath(target_dir + '/../public')):\n    return _LIKELY_MY_HEADER\n\n  # If the target and include share some initial basename\n  # component, it's possible the target is implementing the\n  # include, so it's allowed to be first, but we'll never\n  # complain if it's not there.\n  target_first_component = _RE_FIRST_COMPONENT.match(target_base)\n  include_first_component = _RE_FIRST_COMPONENT.match(include_base)\n  if (target_first_component and include_first_component and\n      target_first_component.group(0) ==\n      include_first_component.group(0)):\n    return _POSSIBLE_MY_HEADER\n\n  return _OTHER_HEADER\n\n\n\ndef CheckIncludeLine(filename, clean_lines, linenum, include_state, error):\n  \"\"\"Check rules that are applicable to #include lines.\n\n  Strings on #include lines are NOT removed from elided line, to make\n  certain tasks easier. However, to prevent false positives, checks\n  applicable to #include lines in CheckLanguage must be put here.\n\n  Args:\n    filename: The name of the current file.\n    clean_lines: A CleansedLines instance containing the file.\n    linenum: The number of the line to check.\n    include_state: An _IncludeState instance in which the headers are inserted.\n    error: The function to call with any errors found.\n  \"\"\"\n  fileinfo = FileInfo(filename)\n  line = clean_lines.lines[linenum]\n\n  # \"include\" should use the new style \"foo/bar.h\" instead of just \"bar.h\"\n  if _RE_PATTERN_INCLUDE_NEW_STYLE.search(line):\n    error(filename, linenum, 'build/include', 4,\n          'Include the directory when naming .h files')\n\n  # we shouldn't include a file more than once. actually, there are a\n  # handful of instances where doing so is okay, but in general it's\n  # not.\n  match = _RE_PATTERN_INCLUDE.search(line)\n  if match:\n    include = match.group(2)\n    is_system = (match.group(1) == '<')\n    if include in include_state:\n      error(filename, linenum, 'build/include', 4,\n            '\"%s\" already included at %s:%s' %\n            (include, filename, include_state[include]))\n    else:\n      include_state[include] = linenum\n\n      # We want to ensure that headers appear in the right order:\n      # 1) for foo.cc, foo.h  (preferred location)\n      # 2) c system files\n      # 3) cpp system files\n      # 4) for foo.cc, foo.h  (deprecated location)\n      # 5) other google headers\n      #\n      # We classify each include statement as one of those 5 types\n      # using a number of techniques. The include_state object keeps\n      # track of the highest type seen, and complains if we see a\n      # lower type after that.\n      error_message = include_state.CheckNextIncludeOrder(\n          _ClassifyInclude(fileinfo, include, is_system))\n      if error_message:\n        error(filename, linenum, 'build/include_order', 4,\n              '%s. Should be: %s.h, c system, c++ system, other.' %\n              (error_message, fileinfo.BaseName()))\n      canonical_include = include_state.CanonicalizeAlphabeticalOrder(include)\n      if not include_state.IsInAlphabeticalOrder(\n          clean_lines, linenum, canonical_include):\n        error(filename, linenum, 'build/include_alpha', 4,\n              'Include \"%s\" not in alphabetical order' % include)\n      include_state.SetLastHeader(canonical_include)\n\n  # Look for any of the stream classes that are part of standard C++.\n  match = _RE_PATTERN_INCLUDE.match(line)\n  if match:\n    include = match.group(2)\n    if Match(r'(f|ind|io|i|o|parse|pf|stdio|str|)?stream$', include):\n      # Many unit tests use cout, so we exempt them.\n      if not _IsTestFilename(filename):\n        # Suggest a different header for ostream\n        if include == 'ostream':\n          error(filename, linenum, 'readability/streams', 3,\n                'For logging, include \"base/logging.h\" instead of <ostream>.')\n        else:\n          error(filename, linenum, 'readability/streams', 3,\n                'Streams are highly discouraged.')\n\n\ndef _GetTextInside(text, start_pattern):\n  r\"\"\"Retrieves all the text between matching open and close parentheses.\n\n  Given a string of lines and a regular expression string, retrieve all the text\n  following the expression and between opening punctuation symbols like\n  (, [, or {, and the matching close-punctuation symbol. This properly nested\n  occurrences of the punctuations, so for the text like\n    printf(a(), b(c()));\n  a call to _GetTextInside(text, r'printf\\(') will return 'a(), b(c())'.\n  start_pattern must match string having an open punctuation symbol at the end.\n\n  Args:\n    text: The lines to extract text. Its comments and strings must be elided.\n           It can be single line and can span multiple lines.\n    start_pattern: The regexp string indicating where to start extracting\n                   the text.\n  Returns:\n    The extracted text.\n    None if either the opening string or ending punctuation could not be found.\n  \"\"\"\n  # TODO(unknown): Audit cpplint.py to see what places could be profitably\n  # rewritten to use _GetTextInside (and use inferior regexp matching today).\n\n  # Give opening punctuations to get the matching close-punctuations.\n  matching_punctuation = {'(': ')', '{': '}', '[': ']'}\n  closing_punctuation = set(matching_punctuation.itervalues())\n\n  # Find the position to start extracting text.\n  match = re.search(start_pattern, text, re.M)\n  if not match:  # start_pattern not found in text.\n    return None\n  start_position = match.end(0)\n\n  assert start_position > 0, (\n      'start_pattern must ends with an opening punctuation.')\n  assert text[start_position - 1] in matching_punctuation, (\n      'start_pattern must ends with an opening punctuation.')\n  # Stack of closing punctuations we expect to have in text after position.\n  punctuation_stack = [matching_punctuation[text[start_position - 1]]]\n  position = start_position\n  while punctuation_stack and position < len(text):\n    if text[position] == punctuation_stack[-1]:\n      punctuation_stack.pop()\n    elif text[position] in closing_punctuation:\n      # A closing punctuation without matching opening punctuations.\n      return None\n    elif text[position] in matching_punctuation:\n      punctuation_stack.append(matching_punctuation[text[position]])\n    position += 1\n  if punctuation_stack:\n    # Opening punctuations left without matching close-punctuations.\n    return None\n  # punctuations match.\n  return text[start_position:position - 1]\n\n\n# Patterns for matching call-by-reference parameters.\n#\n# Supports nested templates up to 2 levels deep using this messy pattern:\n#   < (?: < (?: < [^<>]*\n#               >\n#           |   [^<>] )*\n#         >\n#     |   [^<>] )*\n#   >\n_RE_PATTERN_IDENT = r'[_a-zA-Z]\\w*'  # =~ [[:alpha:]][[:alnum:]]*\n_RE_PATTERN_TYPE = (\n    r'(?:const\\s+)?(?:typename\\s+|class\\s+|struct\\s+|union\\s+|enum\\s+)?'\n    r'(?:\\w|'\n    r'\\s*<(?:<(?:<[^<>]*>|[^<>])*>|[^<>])*>|'\n    r'::)+')\n# A call-by-reference parameter ends with '& identifier'.\n_RE_PATTERN_REF_PARAM = re.compile(\n    r'(' + _RE_PATTERN_TYPE + r'(?:\\s*(?:\\bconst\\b|[*]))*\\s*'\n    r'&\\s*' + _RE_PATTERN_IDENT + r')\\s*(?:=[^,()]+)?[,)]')\n# A call-by-const-reference parameter either ends with 'const& identifier'\n# or looks like 'const type& identifier' when 'type' is atomic.\n_RE_PATTERN_CONST_REF_PARAM = (\n    r'(?:.*\\s*\\bconst\\s*&\\s*' + _RE_PATTERN_IDENT +\n    r'|const\\s+' + _RE_PATTERN_TYPE + r'\\s*&\\s*' + _RE_PATTERN_IDENT + r')')\n\n\ndef CheckLanguage(filename, clean_lines, linenum, file_extension,\n                  include_state, nesting_state, error):\n  \"\"\"Checks rules from the 'C++ language rules' section of cppguide.html.\n\n  Some of these rules are hard to test (function overloading, using\n  uint32 inappropriately), but we do the best we can.\n\n  Args:\n    filename: The name of the current file.\n    clean_lines: A CleansedLines instance containing the file.\n    linenum: The number of the line to check.\n    file_extension: The extension (without the dot) of the filename.\n    include_state: An _IncludeState instance in which the headers are inserted.\n    nesting_state: A NestingState instance which maintains information about\n                   the current stack of nested blocks being parsed.\n    error: The function to call with any errors found.\n  \"\"\"\n  # If the line is empty or consists of entirely a comment, no need to\n  # check it.\n  line = clean_lines.elided[linenum]\n  if not line:\n    return\n\n  match = _RE_PATTERN_INCLUDE.search(line)\n  if match:\n    CheckIncludeLine(filename, clean_lines, linenum, include_state, error)\n    return\n\n  # Reset include state across preprocessor directives.  This is meant\n  # to silence warnings for conditional includes.\n  if Match(r'^\\s*#\\s*(?:ifdef|elif|else|endif)\\b', line):\n    include_state.ResetSection()\n\n  # Make Windows paths like Unix.\n  fullname = os.path.abspath(filename).replace('\\\\', '/')\n\n  # Perform other checks now that we are sure that this is not an include line\n  CheckCasts(filename, clean_lines, linenum, error)\n  CheckGlobalStatic(filename, clean_lines, linenum, error)\n  CheckPrintf(filename, clean_lines, linenum, error)\n\n  if file_extension == 'h':\n    # TODO(unknown): check that 1-arg constructors are explicit.\n    #                How to tell it's a constructor?\n    #                (handled in CheckForNonStandardConstructs for now)\n    # TODO(unknown): check that classes have DISALLOW_EVIL_CONSTRUCTORS\n    #                (level 1 error)\n    pass\n\n  # Check if people are using the verboten C basic types.  The only exception\n  # we regularly allow is \"unsigned short port\" for port.\n  if Search(r'\\bshort port\\b', line):\n    if not Search(r'\\bunsigned short port\\b', line):\n      error(filename, linenum, 'runtime/int', 4,\n            'Use \"unsigned short\" for ports, not \"short\"')\n  else:\n    match = Search(r'\\b(short|long(?! +double)|long long)\\b', line)\n    if match:\n      error(filename, linenum, 'runtime/int', 4,\n            'Use int16/int64/etc, rather than the C type %s' % match.group(1))\n\n  # Check if some verboten operator overloading is going on\n  # TODO(unknown): catch out-of-line unary operator&:\n  #   class X {};\n  #   int operator&(const X& x) { return 42; }  // unary operator&\n  # The trick is it's hard to tell apart from binary operator&:\n  #   class Y { int operator&(const Y& x) { return 23; } }; // binary operator&\n  if Search(r'\\boperator\\s*&\\s*\\(\\s*\\)', line):\n    error(filename, linenum, 'runtime/operator', 4,\n          'Unary operator& is dangerous.  Do not use it.')\n\n  # Check for suspicious usage of \"if\" like\n  # } if (a == b) {\n  if Search(r'\\}\\s*if\\s*\\(', line):\n    error(filename, linenum, 'readability/braces', 4,\n          'Did you mean \"else if\"? If not, start a new line for \"if\".')\n\n  # Check for potential format string bugs like printf(foo).\n  # We constrain the pattern not to pick things like DocidForPrintf(foo).\n  # Not perfect but it can catch printf(foo.c_str()) and printf(foo->c_str())\n  # TODO(unknown): Catch the following case. Need to change the calling\n  # convention of the whole function to process multiple line to handle it.\n  #   printf(\n  #       boy_this_is_a_really_long_variable_that_cannot_fit_on_the_prev_line);\n  printf_args = _GetTextInside(line, r'(?i)\\b(string)?printf\\s*\\(')\n  if printf_args:\n    match = Match(r'([\\w.\\->()]+)$', printf_args)\n    if match and match.group(1) != '__VA_ARGS__':\n      function_name = re.search(r'\\b((?:string)?printf)\\s*\\(',\n                                line, re.I).group(1)\n      error(filename, linenum, 'runtime/printf', 4,\n            'Potential format string bug. Do %s(\"%%s\", %s) instead.'\n            % (function_name, match.group(1)))\n\n  # Check for potential memset bugs like memset(buf, sizeof(buf), 0).\n  match = Search(r'memset\\s*\\(([^,]*),\\s*([^,]*),\\s*0\\s*\\)', line)\n  if match and not Match(r\"^''|-?[0-9]+|0x[0-9A-Fa-f]$\", match.group(2)):\n    error(filename, linenum, 'runtime/memset', 4,\n          'Did you mean \"memset(%s, 0, %s)\"?'\n          % (match.group(1), match.group(2)))\n\n  if Search(r'\\busing namespace\\b', line):\n    error(filename, linenum, 'build/namespaces', 5,\n          'Do not use namespace using-directives.  '\n          'Use using-declarations instead.')\n\n  # Detect variable-length arrays.\n  match = Match(r'\\s*(.+::)?(\\w+) [a-z]\\w*\\[(.+)];', line)\n  if (match and match.group(2) != 'return' and match.group(2) != 'delete' and\n      match.group(3).find(']') == -1):\n    # Split the size using space and arithmetic operators as delimiters.\n    # If any of the resulting tokens are not compile time constants then\n    # report the error.\n    tokens = re.split(r'\\s|\\+|\\-|\\*|\\/|<<|>>]', match.group(3))\n    is_const = True\n    skip_next = False\n    for tok in tokens:\n      if skip_next:\n        skip_next = False\n        continue\n\n      if Search(r'sizeof\\(.+\\)', tok): continue\n      if Search(r'arraysize\\(\\w+\\)', tok): continue\n\n      tok = tok.lstrip('(')\n      tok = tok.rstrip(')')\n      if not tok: continue\n      if Match(r'\\d+', tok): continue\n      if Match(r'0[xX][0-9a-fA-F]+', tok): continue\n      if Match(r'k[A-Z0-9]\\w*', tok): continue\n      if Match(r'(.+::)?k[A-Z0-9]\\w*', tok): continue\n      if Match(r'(.+::)?[A-Z][A-Z0-9_]*', tok): continue\n      # A catch all for tricky sizeof cases, including 'sizeof expression',\n      # 'sizeof(*type)', 'sizeof(const type)', 'sizeof(struct StructName)'\n      # requires skipping the next token because we split on ' ' and '*'.\n      if tok.startswith('sizeof'):\n        skip_next = True\n        continue\n      is_const = False\n      break\n    if not is_const:\n      error(filename, linenum, 'runtime/arrays', 1,\n            'Do not use variable-length arrays.  Use an appropriately named '\n            \"('k' followed by CamelCase) compile-time constant for the size.\")\n\n  # If DISALLOW_EVIL_CONSTRUCTORS, DISALLOW_COPY_AND_ASSIGN, or\n  # DISALLOW_IMPLICIT_CONSTRUCTORS is present, then it should be the last thing\n  # in the class declaration.\n  match = Match(\n      (r'\\s*'\n       r'(DISALLOW_(EVIL_CONSTRUCTORS|COPY_AND_ASSIGN|IMPLICIT_CONSTRUCTORS))'\n       r'\\(.*\\);$'),\n      line)\n  if match and linenum + 1 < clean_lines.NumLines():\n    next_line = clean_lines.elided[linenum + 1]\n    # We allow some, but not all, declarations of variables to be present\n    # in the statement that defines the class.  The [\\w\\*,\\s]* fragment of\n    # the regular expression below allows users to declare instances of\n    # the class or pointers to instances, but not less common types such\n    # as function pointers or arrays.  It's a tradeoff between allowing\n    # reasonable code and avoiding trying to parse more C++ using regexps.\n    if not Search(r'^\\s*}[\\w\\*,\\s]*;', next_line):\n      error(filename, linenum, 'readability/constructors', 3,\n            match.group(1) + ' should be the last thing in the class')\n\n  # Check for use of unnamed namespaces in header files.  Registration\n  # macros are typically OK, so we allow use of \"namespace {\" on lines\n  # that end with backslashes.\n  if (file_extension == 'h'\n      and Search(r'\\bnamespace\\s*{', line)\n      and line[-1] != '\\\\'):\n    error(filename, linenum, 'build/namespaces', 4,\n          'Do not use unnamed namespaces in header files.  See '\n          'http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Namespaces'\n          ' for more information.')\n\n\ndef CheckGlobalStatic(filename, clean_lines, linenum, error):\n  \"\"\"Check for unsafe global or static objects.\n\n  Args:\n    filename: The name of the current file.\n    clean_lines: A CleansedLines instance containing the file.\n    linenum: The number of the line to check.\n    error: The function to call with any errors found.\n  \"\"\"\n  line = clean_lines.elided[linenum]\n\n  # Check for people declaring static/global STL strings at the top level.\n  # This is dangerous because the C++ language does not guarantee that\n  # globals with constructors are initialized before the first access.\n  match = Match(\n      r'((?:|static +)(?:|const +))string +([a-zA-Z0-9_:]+)\\b(.*)',\n      line)\n  # Remove false positives:\n  # - String pointers (as opposed to values).\n  #    string *pointer\n  #    const string *pointer\n  #    string const *pointer\n  #    string *const pointer\n  #\n  # - Functions and template specializations.\n  #    string Function<Type>(...\n  #    string Class<Type>::Method(...\n  #\n  # - Operators.  These are matched separately because operator names\n  #   cross non-word boundaries, and trying to match both operators\n  #   and functions at the same time would decrease accuracy of\n  #   matching identifiers.\n  #    string Class::operator*()\n  if (match and\n      not Search(r'\\bstring\\b(\\s+const)?\\s*\\*\\s*(const\\s+)?\\w', line) and\n      not Search(r'\\boperator\\W', line) and\n      not Match(r'\\s*(<.*>)?(::[a-zA-Z0-9_]+)?\\s*\\(([^\"]|$)', match.group(3))):\n    error(filename, linenum, 'runtime/string', 4,\n          'For a static/global string constant, use a C style string instead: '\n          '\"%schar %s[]\".' %\n          (match.group(1), match.group(2)))\n\n  if Search(r'\\b([A-Za-z0-9_]*_)\\(\\1\\)', line):\n    error(filename, linenum, 'runtime/init', 4,\n          'You seem to be initializing a member variable with itself.')\n\n\ndef CheckPrintf(filename, clean_lines, linenum, error):\n  \"\"\"Check for printf related issues.\n\n  Args:\n    filename: The name of the current file.\n    clean_lines: A CleansedLines instance containing the file.\n    linenum: The number of the line to check.\n    error: The function to call with any errors found.\n  \"\"\"\n  line = clean_lines.elided[linenum]\n\n  # When snprintf is used, the second argument shouldn't be a literal.\n  match = Search(r'snprintf\\s*\\(([^,]*),\\s*([0-9]*)\\s*,', line)\n  if match and match.group(2) != '0':\n    # If 2nd arg is zero, snprintf is used to calculate size.\n    error(filename, linenum, 'runtime/printf', 3,\n          'If you can, use sizeof(%s) instead of %s as the 2nd arg '\n          'to snprintf.' % (match.group(1), match.group(2)))\n\n  # Check if some verboten C functions are being used.\n  if Search(r'\\bsprintf\\b', line):\n    error(filename, linenum, 'runtime/printf', 5,\n          'Never use sprintf. Use snprintf instead.')\n  match = Search(r'\\b(strcpy|strcat)\\b', line)\n  if match:\n    error(filename, linenum, 'runtime/printf', 4,\n          'Almost always, snprintf is better than %s' % match.group(1))\n\n\ndef IsDerivedFunction(clean_lines, linenum):\n  \"\"\"Check if current line contains an inherited function.\n\n  Args:\n    clean_lines: A CleansedLines instance containing the file.\n    linenum: The number of the line to check.\n  Returns:\n    True if current line contains a function with \"override\"\n    virt-specifier.\n  \"\"\"\n  # Look for leftmost opening parenthesis on current line\n  opening_paren = clean_lines.elided[linenum].find('(')\n  if opening_paren < 0: return False\n\n  # Look for \"override\" after the matching closing parenthesis\n  line, _, closing_paren = CloseExpression(clean_lines, linenum, opening_paren)\n  return closing_paren >= 0 and Search(r'\\boverride\\b', line[closing_paren:])\n\n\ndef IsInitializerList(clean_lines, linenum):\n  \"\"\"Check if current line is inside constructor initializer list.\n\n  Args:\n    clean_lines: A CleansedLines instance containing the file.\n    linenum: The number of the line to check.\n  Returns:\n    True if current line appears to be inside constructor initializer\n    list, False otherwise.\n  \"\"\"\n  for i in xrange(linenum, 1, -1):\n    line = clean_lines.elided[i]\n    if i == linenum:\n      remove_function_body = Match(r'^(.*)\\{\\s*$', line)\n      if remove_function_body:\n        line = remove_function_body.group(1)\n\n    if Search(r'\\s:\\s*\\w+[({]', line):\n      # A lone colon tend to indicate the start of a constructor\n      # initializer list.  It could also be a ternary operator, which\n      # also tend to appear in constructor initializer lists as\n      # opposed to parameter lists.\n      return True\n    if Search(r'\\}\\s*,\\s*$', line):\n      # A closing brace followed by a comma is probably the end of a\n      # brace-initialized member in constructor initializer list.\n      return True\n    if Search(r'[{};]\\s*$', line):\n      # Found one of the following:\n      # - A closing brace or semicolon, probably the end of the previous\n      #   function.\n      # - An opening brace, probably the start of current class or namespace.\n      #\n      # Current line is probably not inside an initializer list since\n      # we saw one of those things without seeing the starting colon.\n      return False\n\n  # Got to the beginning of the file without seeing the start of\n  # constructor initializer list.\n  return False\n\n\ndef CheckForNonConstReference(filename, clean_lines, linenum,\n                              nesting_state, error):\n  \"\"\"Check for non-const references.\n\n  Separate from CheckLanguage since it scans backwards from current\n  line, instead of scanning forward.\n\n  Args:\n    filename: The name of the current file.\n    clean_lines: A CleansedLines instance containing the file.\n    linenum: The number of the line to check.\n    nesting_state: A NestingState instance which maintains information about\n                   the current stack of nested blocks being parsed.\n    error: The function to call with any errors found.\n  \"\"\"\n  # Do nothing if there is no '&' on current line.\n  line = clean_lines.elided[linenum]\n  if '&' not in line:\n    return\n\n  # If a function is inherited, current function doesn't have much of\n  # a choice, so any non-const references should not be blamed on\n  # derived function.\n  if IsDerivedFunction(clean_lines, linenum):\n    return\n\n  # Long type names may be broken across multiple lines, usually in one\n  # of these forms:\n  #   LongType\n  #       ::LongTypeContinued &identifier\n  #   LongType::\n  #       LongTypeContinued &identifier\n  #   LongType<\n  #       ...>::LongTypeContinued &identifier\n  #\n  # If we detected a type split across two lines, join the previous\n  # line to current line so that we can match const references\n  # accordingly.\n  #\n  # Note that this only scans back one line, since scanning back\n  # arbitrary number of lines would be expensive.  If you have a type\n  # that spans more than 2 lines, please use a typedef.\n  if linenum > 1:\n    previous = None\n    if Match(r'\\s*::(?:[\\w<>]|::)+\\s*&\\s*\\S', line):\n      # previous_line\\n + ::current_line\n      previous = Search(r'\\b((?:const\\s*)?(?:[\\w<>]|::)+[\\w<>])\\s*$',\n                        clean_lines.elided[linenum - 1])\n    elif Match(r'\\s*[a-zA-Z_]([\\w<>]|::)+\\s*&\\s*\\S', line):\n      # previous_line::\\n + current_line\n      previous = Search(r'\\b((?:const\\s*)?(?:[\\w<>]|::)+::)\\s*$',\n                        clean_lines.elided[linenum - 1])\n    if previous:\n      line = previous.group(1) + line.lstrip()\n    else:\n      # Check for templated parameter that is split across multiple lines\n      endpos = line.rfind('>')\n      if endpos > -1:\n        (_, startline, startpos) = ReverseCloseExpression(\n            clean_lines, linenum, endpos)\n        if startpos > -1 and startline < linenum:\n          # Found the matching < on an earlier line, collect all\n          # pieces up to current line.\n          line = ''\n          for i in xrange(startline, linenum + 1):\n            line += clean_lines.elided[i].strip()\n\n  # Check for non-const references in function parameters.  A single '&' may\n  # found in the following places:\n  #   inside expression: binary & for bitwise AND\n  #   inside expression: unary & for taking the address of something\n  #   inside declarators: reference parameter\n  # We will exclude the first two cases by checking that we are not inside a\n  # function body, including one that was just introduced by a trailing '{'.\n  # TODO(unknown): Doesn't account for 'catch(Exception& e)' [rare].\n  if (nesting_state.previous_stack_top and\n      not (isinstance(nesting_state.previous_stack_top, _ClassInfo) or\n           isinstance(nesting_state.previous_stack_top, _NamespaceInfo))):\n    # Not at toplevel, not within a class, and not within a namespace\n    return\n\n  # Avoid preprocessors\n  if Search(r'\\\\\\s*$', line):\n    return\n\n  # Avoid constructor initializer lists\n  if IsInitializerList(clean_lines, linenum):\n    return\n\n  # We allow non-const references in a few standard places, like functions\n  # called \"swap()\" or iostream operators like \"<<\" or \">>\".  Do not check\n  # those function parameters.\n  #\n  # We also accept & in static_assert, which looks like a function but\n  # it's actually a declaration expression.\n  whitelisted_functions = (r'(?:[sS]wap(?:<\\w:+>)?|'\n                           r'operator\\s*[<>][<>]|'\n                           r'static_assert|COMPILE_ASSERT'\n                           r')\\s*\\(')\n  if Search(whitelisted_functions, line):\n    return\n  elif not Search(r'\\S+\\([^)]*$', line):\n    # Don't see a whitelisted function on this line.  Actually we\n    # didn't see any function name on this line, so this is likely a\n    # multi-line parameter list.  Try a bit harder to catch this case.\n    for i in xrange(2):\n      if (linenum > i and\n          Search(whitelisted_functions, clean_lines.elided[linenum - i - 1])):\n        return\n\n  decls = ReplaceAll(r'{[^}]*}', ' ', line)  # exclude function body\n  for parameter in re.findall(_RE_PATTERN_REF_PARAM, decls):\n    if not Match(_RE_PATTERN_CONST_REF_PARAM, parameter):\n      error(filename, linenum, 'runtime/references', 2,\n            'Is this a non-const reference? '\n            'If so, make const or use a pointer: ' +\n            ReplaceAll(' *<', '<', parameter))\n\n\ndef CheckCasts(filename, clean_lines, linenum, error):\n  \"\"\"Various cast related checks.\n\n  Args:\n    filename: The name of the current file.\n    clean_lines: A CleansedLines instance containing the file.\n    linenum: The number of the line to check.\n    error: The function to call with any errors found.\n  \"\"\"\n  line = clean_lines.elided[linenum]\n\n  # Check to see if they're using an conversion function cast.\n  # I just try to capture the most common basic types, though there are more.\n  # Parameterless conversion functions, such as bool(), are allowed as they are\n  # probably a member operator declaration or default constructor.\n  match = Search(\n      r'(\\bnew\\s+|\\S<\\s*(?:const\\s+)?)?\\b'\n      r'(int|float|double|bool|char|int32|uint32|int64|uint64)'\n      r'(\\([^)].*)', line)\n  expecting_function = ExpectingFunctionArgs(clean_lines, linenum)\n  if match and not expecting_function:\n    matched_type = match.group(2)\n\n    # matched_new_or_template is used to silence two false positives:\n    # - New operators\n    # - Template arguments with function types\n    #\n    # For template arguments, we match on types immediately following\n    # an opening bracket without any spaces.  This is a fast way to\n    # silence the common case where the function type is the first\n    # template argument.  False negative with less-than comparison is\n    # avoided because those operators are usually followed by a space.\n    #\n    #   function<double(double)>   // bracket + no space = false positive\n    #   value < double(42)         // bracket + space = true positive\n    matched_new_or_template = match.group(1)\n\n    # Other things to ignore:\n    # - Function pointers\n    # - Casts to pointer types\n    # - Placement new\n    # - Alias declarations\n    matched_funcptr = match.group(3)\n    if (matched_new_or_template is None and\n        not (matched_funcptr and\n             (Match(r'\\((?:[^() ]+::\\s*\\*\\s*)?[^() ]+\\)\\s*\\(',\n                    matched_funcptr) or\n              matched_funcptr.startswith('(*)'))) and\n        not Match(r'\\s*using\\s+\\S+\\s*=\\s*' + matched_type, line) and\n        not Search(r'new\\(\\S+\\)\\s*' + matched_type, line)):\n      error(filename, linenum, 'readability/casting', 4,\n            'Using deprecated casting style.  '\n            'Use static_cast<%s>(...) instead' %\n            matched_type)\n\n  if not expecting_function:\n    CheckCStyleCast(filename, linenum, line, clean_lines.raw_lines[linenum],\n                    'static_cast',\n                    r'\\((int|float|double|bool|char|u?int(16|32|64))\\)', error)\n\n  # This doesn't catch all cases. Consider (const char * const)\"hello\".\n  #\n  # (char *) \"foo\" should always be a const_cast (reinterpret_cast won't\n  # compile).\n  if CheckCStyleCast(filename, linenum, line, clean_lines.raw_lines[linenum],\n                     'const_cast', r'\\((char\\s?\\*+\\s?)\\)\\s*\"', error):\n    pass\n  else:\n    # Check pointer casts for other than string constants\n    CheckCStyleCast(filename, linenum, line, clean_lines.raw_lines[linenum],\n                    'reinterpret_cast', r'\\((\\w+\\s?\\*+\\s?)\\)', error)\n\n  # In addition, we look for people taking the address of a cast.  This\n  # is dangerous -- casts can assign to temporaries, so the pointer doesn't\n  # point where you think.\n  match = Search(\n      r'(?:&\\(([^)]+)\\)[\\w(])|'\n      r'(?:&(static|dynamic|down|reinterpret)_cast\\b)', line)\n  if match and match.group(1) != '*':\n    # Try a better error message when the & is bound to something\n    # dereferenced by the casted pointer, as opposed to the casted\n    # pointer itself.\n    parenthesis_error = False\n    match = Match(r'^(.*&(?:static|dynamic|down|reinterpret)_cast\\b)<', line)\n    if match:\n      _, y1, x1 = CloseExpression(clean_lines, linenum, len(match.group(1)))\n      if x1 >= 0 and clean_lines.elided[y1][x1] == '(':\n        _, y2, x2 = CloseExpression(clean_lines, y1, x1)\n        if x2 >= 0:\n          extended_line = clean_lines.elided[y2][x2:]\n          if y2 < clean_lines.NumLines() - 1:\n            extended_line += clean_lines.elided[y2 + 1]\n          if Match(r'\\s*(?:->|\\[)', extended_line):\n            parenthesis_error = True\n\n    if parenthesis_error:\n      error(filename, linenum, 'readability/casting', 4,\n            ('Are you taking an address of something dereferenced '\n             'from a cast?  Wrapping the dereferenced expression in '\n             'parentheses will make the binding more obvious'))\n    else:\n      error(filename, linenum, 'runtime/casting', 4,\n            ('Are you taking an address of a cast?  '\n             'This is dangerous: could be a temp var.  '\n             'Take the address before doing the cast, rather than after'))\n\n\ndef CheckCStyleCast(filename, linenum, line, raw_line, cast_type, pattern,\n                    error):\n  \"\"\"Checks for a C-style cast by looking for the pattern.\n\n  Args:\n    filename: The name of the current file.\n    linenum: The number of the line to check.\n    line: The line of code to check.\n    raw_line: The raw line of code to check, with comments.\n    cast_type: The string for the C++ cast to recommend.  This is either\n      reinterpret_cast, static_cast, or const_cast, depending.\n    pattern: The regular expression used to find C-style casts.\n    error: The function to call with any errors found.\n\n  Returns:\n    True if an error was emitted.\n    False otherwise.\n  \"\"\"\n  match = Search(pattern, line)\n  if not match:\n    return False\n\n  # Exclude lines with keywords that tend to look like casts, and also\n  # macros which are generally troublesome.\n  if Match(r'.*\\b(?:sizeof|alignof|alignas|[A-Z_]+)\\s*$',\n           line[0:match.start(1) - 1]):\n    return False\n\n  # operator++(int) and operator--(int)\n  if (line[0:match.start(1) - 1].endswith(' operator++') or\n      line[0:match.start(1) - 1].endswith(' operator--')):\n    return False\n\n  # A single unnamed argument for a function tends to look like old\n  # style cast.  If we see those, don't issue warnings for deprecated\n  # casts, instead issue warnings for unnamed arguments where\n  # appropriate.\n  #\n  # These are things that we want warnings for, since the style guide\n  # explicitly require all parameters to be named:\n  #   Function(int);\n  #   Function(int) {\n  #   ConstMember(int) const;\n  #   ConstMember(int) const {\n  #   ExceptionMember(int) throw (...);\n  #   ExceptionMember(int) throw (...) {\n  #   PureVirtual(int) = 0;\n  #\n  # These are functions of some sort, where the compiler would be fine\n  # if they had named parameters, but people often omit those\n  # identifiers to reduce clutter:\n  #   (FunctionPointer)(int);\n  #   (FunctionPointer)(int) = value;\n  #   Function((function_pointer_arg)(int))\n  #   <TemplateArgument(int)>;\n  #   <(FunctionPointerTemplateArgument)(int)>;\n  remainder = line[match.end(0):]\n  if Match(r'^\\s*(?:;|const\\b|throw\\b|final\\b|override\\b|=|>|\\{|\\))',\n           remainder):\n    # Looks like an unnamed parameter.\n\n    # Don't warn on any kind of template arguments.\n    if Match(r'^\\s*>', remainder):\n      return False\n\n    # Don't warn on assignments to function pointers, but keep warnings for\n    # unnamed parameters to pure virtual functions.  Note that this pattern\n    # will also pass on assignments of \"0\" to function pointers, but the\n    # preferred values for those would be \"nullptr\" or \"NULL\".\n    matched_zero = Match(r'^\\s=\\s*(\\S+)\\s*;', remainder)\n    if matched_zero and matched_zero.group(1) != '0':\n      return False\n\n    # Don't warn on function pointer declarations.  For this we need\n    # to check what came before the \"(type)\" string.\n    if Match(r'.*\\)\\s*$', line[0:match.start(0)]):\n      return False\n\n    # Don't warn if the parameter is named with block comments, e.g.:\n    #  Function(int /*unused_param*/);\n    if '/*' in raw_line:\n      return False\n\n    # Passed all filters, issue warning here.\n    error(filename, linenum, 'readability/function', 3,\n          'All parameters should be named in a function')\n    return True\n\n  # At this point, all that should be left is actual casts.\n  error(filename, linenum, 'readability/casting', 4,\n        'Using C-style cast.  Use %s<%s>(...) instead' %\n        (cast_type, match.group(1)))\n\n  return True\n\n\ndef ExpectingFunctionArgs(clean_lines, linenum):\n  \"\"\"Checks whether where function type arguments are expected.\n\n  Args:\n    clean_lines: A CleansedLines instance containing the file.\n    linenum: The number of the line to check.\n\n  Returns:\n    True if the line at 'linenum' is inside something that expects arguments\n    of function types.\n  \"\"\"\n  line = clean_lines.elided[linenum]\n  return (Match(r'^\\s*MOCK_(CONST_)?METHOD\\d+(_T)?\\(', line) or\n          (linenum >= 2 and\n           (Match(r'^\\s*MOCK_(?:CONST_)?METHOD\\d+(?:_T)?\\((?:\\S+,)?\\s*$',\n                  clean_lines.elided[linenum - 1]) or\n            Match(r'^\\s*MOCK_(?:CONST_)?METHOD\\d+(?:_T)?\\(\\s*$',\n                  clean_lines.elided[linenum - 2]) or\n            Search(r'\\bstd::m?function\\s*\\<\\s*$',\n                   clean_lines.elided[linenum - 1]))))\n\n\n_HEADERS_CONTAINING_TEMPLATES = (\n    ('<deque>', ('deque',)),\n    ('<functional>', ('unary_function', 'binary_function',\n                      'plus', 'minus', 'multiplies', 'divides', 'modulus',\n                      'negate',\n                      'equal_to', 'not_equal_to', 'greater', 'less',\n                      'greater_equal', 'less_equal',\n                      'logical_and', 'logical_or', 'logical_not',\n                      'unary_negate', 'not1', 'binary_negate', 'not2',\n                      'bind1st', 'bind2nd',\n                      'pointer_to_unary_function',\n                      'pointer_to_binary_function',\n                      'ptr_fun',\n                      'mem_fun_t', 'mem_fun', 'mem_fun1_t', 'mem_fun1_ref_t',\n                      'mem_fun_ref_t',\n                      'const_mem_fun_t', 'const_mem_fun1_t',\n                      'const_mem_fun_ref_t', 'const_mem_fun1_ref_t',\n                      'mem_fun_ref',\n                     )),\n    ('<limits>', ('numeric_limits',)),\n    ('<list>', ('list',)),\n    ('<map>', ('map', 'multimap',)),\n    ('<memory>', ('allocator',)),\n    ('<queue>', ('queue', 'priority_queue',)),\n    ('<set>', ('set', 'multiset',)),\n    ('<stack>', ('stack',)),\n    ('<string>', ('char_traits', 'basic_string',)),\n    ('<utility>', ('pair',)),\n    ('<vector>', ('vector',)),\n\n    # gcc extensions.\n    # Note: std::hash is their hash, ::hash is our hash\n    ('<hash_map>', ('hash_map', 'hash_multimap',)),\n    ('<hash_set>', ('hash_set', 'hash_multiset',)),\n    ('<slist>', ('slist',)),\n    )\n\n_RE_PATTERN_STRING = re.compile(r'\\bstring\\b')\n\n_re_pattern_algorithm_header = []\nfor _template in ('copy', 'max', 'min', 'min_element', 'sort', 'swap',\n                  'transform'):\n  # Match max<type>(..., ...), max(..., ...), but not foo->max, foo.max or\n  # type::max().\n  _re_pattern_algorithm_header.append(\n      (re.compile(r'[^>.]\\b' + _template + r'(<.*?>)?\\([^\\)]'),\n       _template,\n       '<algorithm>'))\n\n_re_pattern_templates = []\nfor _header, _templates in _HEADERS_CONTAINING_TEMPLATES:\n  for _template in _templates:\n    _re_pattern_templates.append(\n        (re.compile(r'(\\<|\\b)' + _template + r'\\s*\\<'),\n         _template + '<>',\n         _header))\n\n\ndef FilesBelongToSameModule(filename_cc, filename_h):\n  \"\"\"Check if these two filenames belong to the same module.\n\n  The concept of a 'module' here is a as follows:\n  foo.h, foo-inl.h, foo.cc, foo_test.cc and foo_unittest.cc belong to the\n  same 'module' if they are in the same directory.\n  some/path/public/xyzzy and some/path/internal/xyzzy are also considered\n  to belong to the same module here.\n\n  If the filename_cc contains a longer path than the filename_h, for example,\n  '/absolute/path/to/base/sysinfo.cc', and this file would include\n  'base/sysinfo.h', this function also produces the prefix needed to open the\n  header. This is used by the caller of this function to more robustly open the\n  header file. We don't have access to the real include paths in this context,\n  so we need this guesswork here.\n\n  Known bugs: tools/base/bar.cc and base/bar.h belong to the same module\n  according to this implementation. Because of this, this function gives\n  some false positives. This should be sufficiently rare in practice.\n\n  Args:\n    filename_cc: is the path for the .cc file\n    filename_h: is the path for the header path\n\n  Returns:\n    Tuple with a bool and a string:\n    bool: True if filename_cc and filename_h belong to the same module.\n    string: the additional prefix needed to open the header file.\n  \"\"\"\n\n  if not filename_cc.endswith('.cc'):\n    return (False, '')\n  filename_cc = filename_cc[:-len('.cc')]\n  if filename_cc.endswith('_unittest'):\n    filename_cc = filename_cc[:-len('_unittest')]\n  elif filename_cc.endswith('_test'):\n    filename_cc = filename_cc[:-len('_test')]\n  filename_cc = filename_cc.replace('/public/', '/')\n  filename_cc = filename_cc.replace('/internal/', '/')\n\n  if not filename_h.endswith('.h'):\n    return (False, '')\n  filename_h = filename_h[:-len('.h')]\n  if filename_h.endswith('-inl'):\n    filename_h = filename_h[:-len('-inl')]\n  filename_h = filename_h.replace('/public/', '/')\n  filename_h = filename_h.replace('/internal/', '/')\n\n  files_belong_to_same_module = filename_cc.endswith(filename_h)\n  common_path = ''\n  if files_belong_to_same_module:\n    common_path = filename_cc[:-len(filename_h)]\n  return files_belong_to_same_module, common_path\n\n\ndef UpdateIncludeState(filename, include_state, io=codecs):\n  \"\"\"Fill up the include_state with new includes found from the file.\n\n  Args:\n    filename: the name of the header to read.\n    include_state: an _IncludeState instance in which the headers are inserted.\n    io: The io factory to use to read the file. Provided for testability.\n\n  Returns:\n    True if a header was succesfully added. False otherwise.\n  \"\"\"\n  headerfile = None\n  try:\n    headerfile = io.open(filename, 'r', 'utf8', 'replace')\n  except IOError:\n    return False\n  linenum = 0\n  for line in headerfile:\n    linenum += 1\n    clean_line = CleanseComments(line)\n    match = _RE_PATTERN_INCLUDE.search(clean_line)\n    if match:\n      include = match.group(2)\n      # The value formatting is cute, but not really used right now.\n      # What matters here is that the key is in include_state.\n      include_state.setdefault(include, '%s:%d' % (filename, linenum))\n  return True\n\n\ndef CheckForIncludeWhatYouUse(filename, clean_lines, include_state, error,\n                              io=codecs):\n  \"\"\"Reports for missing stl includes.\n\n  This function will output warnings to make sure you are including the headers\n  necessary for the stl containers and functions that you use. We only give one\n  reason to include a header. For example, if you use both equal_to<> and\n  less<> in a .h file, only one (the latter in the file) of these will be\n  reported as a reason to include the <functional>.\n\n  Args:\n    filename: The name of the current file.\n    clean_lines: A CleansedLines instance containing the file.\n    include_state: An _IncludeState instance.\n    error: The function to call with any errors found.\n    io: The IO factory to use to read the header file. Provided for unittest\n        injection.\n  \"\"\"\n  required = {}  # A map of header name to linenumber and the template entity.\n                 # Example of required: { '<functional>': (1219, 'less<>') }\n\n  for linenum in xrange(clean_lines.NumLines()):\n    line = clean_lines.elided[linenum]\n    if not line or line[0] == '#':\n      continue\n\n    # String is special -- it is a non-templatized type in STL.\n    matched = _RE_PATTERN_STRING.search(line)\n    if matched:\n      # Don't warn about strings in non-STL namespaces:\n      # (We check only the first match per line; good enough.)\n      prefix = line[:matched.start()]\n      if prefix.endswith('std::') or not prefix.endswith('::'):\n        required['<string>'] = (linenum, 'string')\n\n    for pattern, template, header in _re_pattern_algorithm_header:\n      if pattern.search(line):\n        required[header] = (linenum, template)\n\n    # The following function is just a speed up, no semantics are changed.\n    if not '<' in line:  # Reduces the cpu time usage by skipping lines.\n      continue\n\n    for pattern, template, header in _re_pattern_templates:\n      if pattern.search(line):\n        required[header] = (linenum, template)\n\n  # The policy is that if you #include something in foo.h you don't need to\n  # include it again in foo.cc. Here, we will look at possible includes.\n  # Let's copy the include_state so it is only messed up within this function.\n  include_state = include_state.copy()\n\n  # Did we find the header for this file (if any) and succesfully load it?\n  header_found = False\n\n  # Use the absolute path so that matching works properly.\n  abs_filename = FileInfo(filename).FullName()\n\n  # For Emacs's flymake.\n  # If cpplint is invoked from Emacs's flymake, a temporary file is generated\n  # by flymake and that file name might end with '_flymake.cc'. In that case,\n  # restore original file name here so that the corresponding header file can be\n  # found.\n  # e.g. If the file name is 'foo_flymake.cc', we should search for 'foo.h'\n  # instead of 'foo_flymake.h'\n  abs_filename = re.sub(r'_flymake\\.cc$', '.cc', abs_filename)\n\n  # include_state is modified during iteration, so we iterate over a copy of\n  # the keys.\n  header_keys = include_state.keys()\n  for header in header_keys:\n    (same_module, common_path) = FilesBelongToSameModule(abs_filename, header)\n    fullpath = common_path + header\n    if same_module and UpdateIncludeState(fullpath, include_state, io):\n      header_found = True\n\n  # If we can't find the header file for a .cc, assume it's because we don't\n  # know where to look. In that case we'll give up as we're not sure they\n  # didn't include it in the .h file.\n  # TODO(unknown): Do a better job of finding .h files so we are confident that\n  # not having the .h file means there isn't one.\n  if filename.endswith('.cc') and not header_found:\n    return\n\n  # All the lines have been processed, report the errors found.\n  for required_header_unstripped in required:\n    template = required[required_header_unstripped][1]\n    if required_header_unstripped.strip('<>\"') not in include_state:\n      error(filename, required[required_header_unstripped][0],\n            'build/include_what_you_use', 4,\n            'Add #include ' + required_header_unstripped + ' for ' + template)\n\n\n_RE_PATTERN_EXPLICIT_MAKEPAIR = re.compile(r'\\bmake_pair\\s*<')\n\n\ndef CheckMakePairUsesDeduction(filename, clean_lines, linenum, error):\n  \"\"\"Check that make_pair's template arguments are deduced.\n\n  G++ 4.6 in C++11 mode fails badly if make_pair's template arguments are\n  specified explicitly, and such use isn't intended in any case.\n\n  Args:\n    filename: The name of the current file.\n    clean_lines: A CleansedLines instance containing the file.\n    linenum: The number of the line to check.\n    error: The function to call with any errors found.\n  \"\"\"\n  line = clean_lines.elided[linenum]\n  match = _RE_PATTERN_EXPLICIT_MAKEPAIR.search(line)\n  if match:\n    error(filename, linenum, 'build/explicit_make_pair',\n          4,  # 4 = high confidence\n          'For C++11-compatibility, omit template arguments from make_pair'\n          ' OR use pair directly OR if appropriate, construct a pair directly')\ndef CheckDefaultLambdaCaptures(filename, clean_lines, linenum, error):\n  \"\"\"Check that default lambda captures are not used.\n\n  Args:\n    filename: The name of the current file.\n    clean_lines: A CleansedLines instance containing the file.\n    linenum: The number of the line to check.\n    error: The function to call with any errors found.\n  \"\"\"\n  line = clean_lines.elided[linenum]\n\n  # A lambda introducer specifies a default capture if it starts with \"[=\"\n  # or if it starts with \"[&\" _not_ followed by an identifier.\n  match = Match(r'^(.*)\\[\\s*(?:=|&[^\\w])', line)\n  if match:\n    # Found a potential error, check what comes after the lambda-introducer.\n    # If it's not open parenthesis (for lambda-declarator) or open brace\n    # (for compound-statement), it's not a lambda.\n    line, _, pos = CloseExpression(clean_lines, linenum, len(match.group(1)))\n    if pos >= 0 and Match(r'^\\s*[{(]', line[pos:]):\n      error(filename, linenum, 'build/c++11',\n            4,  # 4 = high confidence\n            'Default lambda captures are an unapproved C++ feature.')\n\n\n\n\ndef ProcessLine(filename, file_extension, clean_lines, line,\n                include_state, function_state, nesting_state, error,\n                extra_check_functions=[]):\n  \"\"\"Processes a single line in the file.\n\n  Args:\n    filename: Filename of the file that is being processed.\n    file_extension: The extension (dot not included) of the file.\n    clean_lines: An array of strings, each representing a line of the file,\n                 with comments stripped.\n    line: Number of line being processed.\n    include_state: An _IncludeState instance in which the headers are inserted.\n    function_state: A _FunctionState instance which counts function lines, etc.\n    nesting_state: A NestingState instance which maintains information about\n                   the current stack of nested blocks being parsed.\n    error: A callable to which errors are reported, which takes 4 arguments:\n           filename, line number, error level, and message\n    extra_check_functions: An array of additional check functions that will be\n                           run on each source line. Each function takes 4\n                           arguments: filename, clean_lines, line, error\n  \"\"\"\n  raw_lines = clean_lines.raw_lines\n  ParseNolintSuppressions(filename, raw_lines[line], line, error)\n  nesting_state.Update(filename, clean_lines, line, error)\n  if nesting_state.InAsmBlock(): return\n  CheckForFunctionLengths(filename, clean_lines, line, function_state, error)\n  CheckForMultilineCommentsAndStrings(filename, clean_lines, line, error)\n  CheckStyle(filename, clean_lines, line, file_extension, nesting_state, error)\n  CheckLanguage(filename, clean_lines, line, file_extension, include_state,\n                nesting_state, error)\n  CheckForNonConstReference(filename, clean_lines, line, nesting_state, error)\n  CheckForNonStandardConstructs(filename, clean_lines, line,\n                                nesting_state, error)\n  CheckVlogArguments(filename, clean_lines, line, error)\n  CheckPosixThreading(filename, clean_lines, line, error)\n  CheckInvalidIncrement(filename, clean_lines, line, error)\n  CheckMakePairUsesDeduction(filename, clean_lines, line, error)\n  CheckDefaultLambdaCaptures(filename, clean_lines, line, error)\n  for check_fn in extra_check_functions:\n    check_fn(filename, clean_lines, line, error)\n\ndef FlagCxx11Features(filename, clean_lines, linenum, error):\n  \"\"\"Flag those c++11 features that we only allow in certain places.\n\n  Args:\n    filename: The name of the current file.\n    clean_lines: A CleansedLines instance containing the file.\n    linenum: The number of the line to check.\n    error: The function to call with any errors found.\n  \"\"\"\n  line = clean_lines.elided[linenum]\n\n  # Flag unapproved C++11 headers.\n  include = Match(r'\\s*#\\s*include\\s+[<\"]([^<\"]+)[\">]', line)\n  if include and include.group(1) in ('cfenv',\n                                      'condition_variable',\n                                      'fenv.h',\n                                      'future',\n                                      'mutex',\n                                      'thread',\n                                      'chrono',\n                                      'ratio',\n                                      'regex',\n                                      'system_error',\n                                     ):\n    error(filename, linenum, 'build/c++11', 5,\n          ('<%s> is an unapproved C++11 header.') % include.group(1))\n\n  # The only place where we need to worry about C++11 keywords and library\n  # features in preprocessor directives is in macro definitions.\n  if Match(r'\\s*#', line) and not Match(r'\\s*#\\s*define\\b', line): return\n\n  # These are classes and free functions.  The classes are always\n  # mentioned as std::*, but we only catch the free functions if\n  # they're not found by ADL.  They're alphabetical by header.\n  for top_name in (\n      # type_traits\n      'alignment_of',\n      'aligned_union',\n\n      # utility\n      'forward',\n      ):\n    if Search(r'\\bstd::%s\\b' % top_name, line):\n      error(filename, linenum, 'build/c++11', 5,\n            ('std::%s is an unapproved C++11 class or function.  Send c-style '\n             'an example of where it would make your code more readable, and '\n             'they may let you use it.') % top_name)\n\n\ndef ProcessFileData(filename, file_extension, lines, error,\n                    extra_check_functions=[]):\n  \"\"\"Performs lint checks and reports any errors to the given error function.\n\n  Args:\n    filename: Filename of the file that is being processed.\n    file_extension: The extension (dot not included) of the file.\n    lines: An array of strings, each representing a line of the file, with the\n           last element being empty if the file is terminated with a newline.\n    error: A callable to which errors are reported, which takes 4 arguments:\n           filename, line number, error level, and message\n    extra_check_functions: An array of additional check functions that will be\n                           run on each source line. Each function takes 4\n                           arguments: filename, clean_lines, line, error\n  \"\"\"\n  lines = (['// marker so line numbers and indices both start at 1'] + lines +\n           ['// marker so line numbers end in a known way'])\n\n  include_state = _IncludeState()\n  function_state = _FunctionState()\n  nesting_state = NestingState()\n\n  ResetNolintSuppressions()\n\n  CheckForCopyright(filename, lines, error)\n\n  if file_extension == 'h':\n    CheckForHeaderGuard(filename, lines, error)\n\n  RemoveMultiLineComments(filename, lines, error)\n  clean_lines = CleansedLines(lines)\n  for line in xrange(clean_lines.NumLines()):\n    ProcessLine(filename, file_extension, clean_lines, line,\n                include_state, function_state, nesting_state, error,\n                extra_check_functions)\n    FlagCxx11Features(filename, clean_lines, line, error)\n  nesting_state.CheckCompletedBlocks(filename, error)\n\n  CheckForIncludeWhatYouUse(filename, clean_lines, include_state, error)\n\n  # We check here rather than inside ProcessLine so that we see raw\n  # lines rather than \"cleaned\" lines.\n  CheckForBadCharacters(filename, lines, error)\n\n  CheckForNewlineAtEOF(filename, lines, error)\n\n\ndef ProcessFile(filename, vlevel, extra_check_functions=[]):\n  \"\"\"Does google-lint on a single file.\n\n  Args:\n    filename: The name of the file to parse.\n\n    vlevel: The level of errors to report.  Every error of confidence\n    >= verbose_level will be reported.  0 is a good default.\n\n    extra_check_functions: An array of additional check functions that will be\n                           run on each source line. Each function takes 4\n                           arguments: filename, clean_lines, line, error\n  \"\"\"\n\n  _SetVerboseLevel(vlevel)\n\n  lf_lines = []\n  crlf_lines = []\n  try:\n    # Support the UNIX convention of using \"-\" for stdin.  Note that\n    # we are not opening the file with universal newline support\n    # (which codecs doesn't support anyway), so the resulting lines do\n    # contain trailing '\\r' characters if we are reading a file that\n    # has CRLF endings.\n    # If after the split a trailing '\\r' is present, it is removed\n    # below.\n    if filename == '-':\n      lines = codecs.StreamReaderWriter(sys.stdin,\n                                        codecs.getreader('utf8'),\n                                        codecs.getwriter('utf8'),\n                                        'replace').read().split('\\n')\n    else:\n      lines = codecs.open(filename, 'r', 'utf8', 'replace').read().split('\\n')\n\n    # Remove trailing '\\r'.\n    # The -1 accounts for the extra trailing blank line we get from split()\n    for linenum in range(len(lines) - 1):\n      if lines[linenum].endswith('\\r'):\n        lines[linenum] = lines[linenum].rstrip('\\r')\n        crlf_lines.append(linenum + 1)\n      else:\n        lf_lines.append(linenum + 1)\n\n  except IOError:\n    sys.stderr.write(\n        \"Skipping input '%s': Can't open for reading\\n\" % filename)\n    return\n\n  # Note, if no dot is found, this will give the entire filename as the ext.\n  file_extension = filename[filename.rfind('.') + 1:]\n\n  # When reading from stdin, the extension is unknown, so no cpplint tests\n  # should rely on the extension.\n  if filename != '-' and file_extension not in _valid_extensions:\n    sys.stderr.write('Ignoring %s; not a valid file name '\n                     '(%s)\\n' % (filename, ', '.join(_valid_extensions)))\n  else:\n    ProcessFileData(filename, file_extension, lines, Error,\n                    extra_check_functions)\n\n    # If end-of-line sequences are a mix of LF and CR-LF, issue\n    # warnings on the lines with CR.\n    #\n    # Don't issue any warnings if all lines are uniformly LF or CR-LF,\n    # since critique can handle these just fine, and the style guide\n    # doesn't dictate a particular end of line sequence.\n    #\n    # We can't depend on os.linesep to determine what the desired\n    # end-of-line sequence should be, since that will return the\n    # server-side end-of-line sequence.\n    if lf_lines and crlf_lines:\n      # Warn on every line with CR.  An alternative approach might be to\n      # check whether the file is mostly CRLF or just LF, and warn on the\n      # minority, we bias toward LF here since most tools prefer LF.\n      for linenum in crlf_lines:\n        Error(filename, linenum, 'whitespace/newline', 1,\n              'Unexpected \\\\r (^M) found; better to use only \\\\n')\n\n  sys.stderr.write('Done processing %s\\n' % filename)\n\n\ndef PrintUsage(message):\n  \"\"\"Prints a brief usage string and exits, optionally with an error message.\n\n  Args:\n    message: The optional error message.\n  \"\"\"\n  sys.stderr.write(_USAGE)\n  if message:\n    sys.exit('\\nFATAL ERROR: ' + message)\n  else:\n    sys.exit(1)\n\n\ndef PrintCategories():\n  \"\"\"Prints a list of all the error-categories used by error messages.\n\n  These are the categories used to filter messages via --filter.\n  \"\"\"\n  sys.stderr.write(''.join('  %s\\n' % cat for cat in _ERROR_CATEGORIES))\n  sys.exit(0)\n\n\ndef ParseArguments(args):\n  \"\"\"Parses the command line arguments.\n\n  This may set the output format and verbosity level as side-effects.\n\n  Args:\n    args: The command line arguments:\n\n  Returns:\n    The list of filenames to lint.\n  \"\"\"\n  try:\n    (opts, filenames) = getopt.getopt(args, '', ['help', 'output=', 'verbose=',\n                                                 'counting=',\n                                                 'filter=',\n                                                 'root=',\n                                                 'linelength=',\n                                                 'extensions='])\n  except getopt.GetoptError:\n    PrintUsage('Invalid arguments.')\n\n  verbosity = _VerboseLevel()\n  output_format = _OutputFormat()\n  filters = ''\n  counting_style = ''\n\n  for (opt, val) in opts:\n    if opt == '--help':\n      PrintUsage(None)\n    elif opt == '--output':\n      if val not in ('emacs', 'vs7', 'eclipse'):\n        PrintUsage('The only allowed output formats are emacs, vs7 and eclipse.')\n      output_format = val\n    elif opt == '--verbose':\n      verbosity = int(val)\n    elif opt == '--filter':\n      filters = val\n      if not filters:\n        PrintCategories()\n    elif opt == '--counting':\n      if val not in ('total', 'toplevel', 'detailed'):\n        PrintUsage('Valid counting options are total, toplevel, and detailed')\n      counting_style = val\n    elif opt == '--root':\n      global _root\n      _root = val\n    elif opt == '--linelength':\n      global _line_length\n      try:\n          _line_length = int(val)\n      except ValueError:\n          PrintUsage('Line length must be digits.')\n    elif opt == '--extensions':\n      global _valid_extensions\n      try:\n          _valid_extensions = set(val.split(','))\n      except ValueError:\n          PrintUsage('Extensions must be comma seperated list.')\n\n  if not filenames:\n    PrintUsage('No files were specified.')\n\n  _SetOutputFormat(output_format)\n  _SetVerboseLevel(verbosity)\n  _SetFilters(filters)\n  _SetCountingStyle(counting_style)\n\n  return filenames\n\n\ndef main():\n  filenames = ParseArguments(sys.argv[1:])\n\n  # Change stderr to write with replacement characters so we don't die\n  # if we try to print something containing non-ASCII characters.\n  sys.stderr = codecs.StreamReaderWriter(sys.stderr,\n                                         codecs.getreader('utf8'),\n                                         codecs.getwriter('utf8'),\n                                         'replace')\n\n  _cpplint_state.ResetErrorCounts()\n  for filename in filenames:\n    ProcessFile(filename, _cpplint_state.verbose_level)\n  _cpplint_state.PrintErrorCounts()\n\n  sys.exit(_cpplint_state.error_count > 0)\n\n\nif __name__ == '__main__':\n  main()\n"
  },
  {
    "path": "third_party/half/ChangeLog.txt",
    "content": "Release Notes\n=============\n\n1.11.0 release (2013-11-16):\n----------------------------\n\n- Made tie-breaking behaviour in round to nearest configurable by \n  `HALF_ROUND_TIES_TO_EVEN` macro.\n- Completed support for all C++11 mathematical functions even if single-\n  precision versions from `<cmath>` are unsupported.\n- Fixed inability to disable support for C++11 mathematical functions on \n  *VC++ 2013*.\n\n\n1.10.0 release (2013-11-09):\n----------------------------\n\n- Made default rounding mode configurable by `HALF_ROUND_STYLE` macro.\n- Added support for non-IEEE single-precision implementations.\n- Added `HALF_ENABLE_CPP11_TYPE_TRAITS` preprocessor flag for checking \n  support for C++11 type traits and TMP features.\n- Restricted `half_cast` to support built-in arithmetic types only.\n- Changed behaviour of `half_cast` to respect rounding mode when casting \n  to/from integer types.\n\n\n1.9.2 release (2013-11-01):\n---------------------------\n\n- Tested for *gcc 4.8*.\n- Tested and fixed for *VC++ 2013*.\n- Removed unnecessary warnings in *MSVC*.\n\n\n1.9.1 release (2013-08-08):\n---------------------------\n\n- Fixed problems with older gcc and MSVC versions.\n- Small fix to non-C++11 implementations of `remainder` and `remquo`.\n\n\n1.9.0 release (2013-08-07):\n---------------------------\n\n- Changed behaviour of `nearbyint`, `rint`, `lrint` and `llrint` to use \n  rounding mode of half-precision implementation (which is \n  truncating/indeterminate) instead of single-precision rounding mode.\n- Added support for more C++11 mathematical functions even if single-\n  precision versions from `<cmath>` are unsupported, in particular \n  `remainder`, `remquo` and `cbrt`.\n- Minor implementation changes.\n\n\n1.8.1 release (2013-01-22):\n---------------------------\n\n- Fixed bug resulting in multiple definitions of the `nanh` function due to \n  a missing `inline` specification.\n\n\n1.8.0 release (2013-01-19):\n---------------------------\n\n- Added support for more C++11 mathematical functions even if single-\n  precision versions from `<cmath>` are unsupported, in particular \n  exponential and logarithm functions, hyperbolic area functions and the \n  hypotenuse function.\n- Made `fma` function use default implementation if single-precision version\n  from `<cmath>` is not faster and thus `FP_FAST_FMAH` to be defined always.\n- Fixed overload resolution issues when invoking certain mathematical \n  functions by unqualified calls.\n\n\n1.7.0 release (2012-10-26):\n---------------------------\n\n- Added support for C++11 `noexcept` specifiers.\n- Changed C++11 `long long` to be supported on *VC++ 2003* and up.\n\n\n1.6.1 release (2012-09-13):\n---------------------------\n\n- Made `fma` and `fdim` functions available even if corresponding \n  single-precision functions are not.\n\n\n1.6.0 release (2012-09-12):\n---------------------------\n\n- Added `HALF_ENABLE_CPP11_LONG_LONG` to control support for `long long` \n  integers and corresponding mathematical functions.\n- Fixed C++98 compatibility on non-VC compilers.\n\n\n1.5.1 release (2012-08-17):\n---------------------------\n\n- Recorrected `std::numeric_limits::round_style` to always return \n  `std::round_indeterminate`, due to overflow-handling deviating from \n  correct round-toward-zero behaviour.\n\n\n1.5.0 release (2012-08-16):\n---------------------------\n\n- Added `half_cast` for explicitly casting between half and any type \n  convertible to/from `float` and allowing the explicit specification of \n  the rounding mode to use.\n\n\n1.4.0 release (2012-08-12):\n---------------------------\n\n- Added support for C++11 generalized constant expressions (`constexpr`).\n\n\n1.3.1 release (2012-08-11):\n---------------------------\n\n- Fixed requirement for `std::signbit` and `std::isnan` (even if C++11 \n  `<cmath>` functions disabled) on non-VC compilers.\n\n\n1.3.0 release (2012-08-10):\n---------------------------\n\n- Made requirement for `<cstdint>` and `static_assert` optional and thus \n  made the library C++98-compatible.\n- Made support for C++11 features user-overridable through explicit \n  definition of corresponding preprocessor symbols to either 0 or 1.\n- Renamed `HALF_ENABLE_HASH` to `HALF_ENABLE_CPP11_HASH` in correspondence \n  with other C++11 preprocessor symbols.\n\n\n1.2.0 release (2012-08-07):\n---------------------------\n\n- Added proper preprocessor definitions for `HUGE_VALH` and `FP_FAST_FMAH` \n  in correspondence with their single-precision counterparts from `<cmath>`.\n- Fixed internal preprocessor macros to be properly undefined after use.\n\n\n1.1.2 release (2012-08-07):\n---------------------------\n\n- Revised `std::numeric_limits::round_style` to return \n  `std::round_toward_zero` if the `float` version also does and \n  `std::round_indeterminate` otherwise.\n- Fixed `std::numeric_limits::round_error` to reflect worst-case round \n  toward zero behaviour.\n\n\n1.1.1 release (2012-08-06):\n---------------------------\n\n- Fixed `std::numeric_limits::min` to return smallest positive normal \n  number, instead of subnormal number.\n- Fixed `std::numeric_limits::round_style` to return \n  `std::round_indeterminate` due to mixture of separately rounded \n  single-precision arithmetics with truncating single-to-half conversions.\n\n\n1.1.0 release (2012-08-06):\n---------------------------\n\n- Added half-precision literals.\n\n\n1.0.0 release (2012-08-05):\n---------------------------\n\n- First release.\n"
  },
  {
    "path": "third_party/half/LICENSE.txt",
    "content": "The MIT License\n\nCopyright (c) 2012-2013 Christian Rau\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "third_party/half/README.txt",
    "content": "HALF-PRECISION FLOATING POINT LIBRARY (Version 1.11.0)\n------------------------------------------------------\n\nThis is a C++ header-only library to provide an IEEE 754 conformant 16-bit \nhalf-precision floating point type along with corresponding arithmetic \noperators, type conversions and common mathematical functions. It aims for both \nefficiency and ease of use, trying to accurately mimic the behaviour of the \nbuiltin floating point types at the best performance possible.\n\n\nINSTALLATION AND REQUIREMENTS\n-----------------------------\n\nComfortably enough, the library consists of just a single header file \ncontaining all the functionality, which can be directly included by your \nprojects, without the neccessity to build anything or link to anything.\n\nWhereas this library is fully C++98-compatible, it can profit from certain \nC++11 features. Support for those features is checked automatically at compile \n(or rather preprocessing) time, but can be explicitly enabled or disabled by \ndefining the corresponding preprocessor symbols to either 1 or 0 yourself. This \nis useful when the automatic detection fails (for more exotic implementations) \nor when a feature should be explicitly disabled:\n\n  - 'long long' integer type for mathematical functions returning 'long long' \n    results (enabled for VC++ 2003 and newer, gcc and clang, overridable with \n    'HALF_ENABLE_CPP11_LONG_LONG').\n\n  - Static assertions for extended compile-time checks (enabled for VC++ 2010, \n    gcc 4.3, clang 2.9 and newer, overridable with 'HALF_ENABLE_CPP11_STATIC_ASSERT').\n\n  - Generalized constant expressions (enabled for gcc 4.6, clang 3.1 and newer, \n    overridable with 'HALF_ENABLE_CPP11_CONSTEXPR').\n\n  - noexcept exception specifications (enabled for gcc 4.6, clang 3.0 and newer, \n    overridable with 'HALF_ENABLE_CPP11_NOEXCEPT').\n\n  - User-defined literals for half-precision literals to work (enabled for \n    gcc 4.7, clang 3.1 and newer, overridable with 'HALF_ENABLE_CPP11_USER_LITERALS').\n\n  - Type traits and template meta-programming features from <type_traits> \n    (enabled for VC++ 2010, libstdc++ 4.3, libc++ and newer, overridable with \n    'HALF_ENABLE_CPP11_TYPE_TRAITS').\n\n  - Special integer types from <cstdint> (enabled for VC++ 2010, libstdc++ 4.3, \n    libc++ and newer, overridable with 'HALF_ENABLE_CPP11_CSTDINT').\n\n  - Certain C++11 single-precision mathematical functions from <cmath> for \n    an improved implementation of their half-precision counterparts to work \n    (enabled for VC++ 2013, libstdc++ 4.3, libc++ and newer, overridable with \n    'HALF_ENABLE_CPP11_CMATH').\n\n  - Hash functor 'std::hash' from <functional> (enabled for VC++ 2010, \n    libstdc++ 4.3, libc++ and newer, overridable with 'HALF_ENABLE_CPP11_HASH').\n\nThe library has been tested successfully with Visual C++ 2005-2013, gcc 4.4-4.8 \nand clang 3.1. Please contact me if you have any problems, suggestions or even \njust success testing it on other platforms.\n\n\nDOCUMENTATION\n-------------\n\nHere follow some general words about the usage of the library and its \nimplementation. For a complete documentation of its iterface look at the \ncorresponding website http://half.sourceforge.net. You may also generate the \ncomplete developer documentation from the library's only include file's doxygen \ncomments, but this is more relevant to developers rather than mere users (for \nreasons described below).\n\nBASIC USAGE\n\nTo make use of the library just include its only header file half.hpp, which \ndefines all half-precision functionality inside the 'half_float' namespace. The \nactual 16-bit half-precision data type is represented by the 'half' type. This \ntype behaves like the builtin floating point types as much as possible, \nsupporting the usual arithmetic, comparison and streaming operators, which \nmakes its use pretty straight-forward:\n\n    using half_float::half;\n    half a(3.4), b(5);\n    half c = a * b;\n    c += 3;\n    if(c > a)\n\t    std::cout << c << std::endl;\n\nAdditionally the 'half_float' namespace also defines half-precision versions \nfor all mathematical functions of the C++ standard library, which can be used \ndirectly through ADL:\n\n    half a(-3.14159);\n    half s = sin(abs(a));\n    long l = lround(s);\n\nYou may also specify explicit half-precision literals, since the library \nprovides a user-defined literal inside the 'half_float::literal' namespace, \nwhich you just need to import (assuming support for C++11 user-defined literals):\n\n    using namespace half_float::literal;\n    half x = 1.0_h;\n\nFurthermore the library provides proper specializations for \n'std::numeric_limits', defining various implementation properties, and \n'std::hash' for hashing half-precision numbers (assuming support for C++11 \n'std::hash'). Similar to the corresponding preprocessor symbols from <cmath> \nthe library also defines the 'HUGE_VALH' constant and maybe the 'FP_FAST_FMAH' \nsymbol.\n\nCONVERSIONS\n\nThe half is explicitly constructible/convertible from a single-precision float \nargument. Thus it is also explicitly constructible/convertible from any type \nimplicitly convertible to float, but constructing it from types like double or \nint will involve the usual warnings arising when implicitly converting those to \nfloat because of the lost precision. On the one hand those warnings are \nintentional, because converting those types to half neccessarily also reduces \nprecision. But on the other hand they are raised for explicit conversions from \nthose types, when the user knows what he is doing. So if those warnings keep \nbugging you, then you won't get around first explicitly converting to float \nbefore converting to half, or use the 'half_cast' described below. In addition \nyou can also directly assign float values to halfs.\n\nIn contrast to the float-to-half conversion, which reduces precision, the \nconversion from half to float (and thus to any other type implicitly \nconvertible to float) is implicit, because all values represetable with \nhalf-precision are also representable with single-precision. This way the \nhalf-to-float conversion behaves similar to the builtin float-to-double \nconversion and all arithmetic expressions involving both half-precision and \nsingle-precision arguments will be of single-precision type. This way you can \nalso directly use the mathematical functions of the C++ standard library, \nthough in this case you will invoke the single-precision versions which will \nalso return single-precision values, which is (even if maybe performing the \nexact same computation, see below) not as conceptually clean when working in a \nhalf-precision environment.\n\nThe default rounding mode for conversions from float to half uses truncation \n(round toward zero, but mapping overflows to infinity) for rounding values not \nrepresentable exactly in half-precision. This is the fastest rounding possible \nand is usually sufficient. But by redefining the 'HALF_ROUND_STYLE' \npreprocessor symbol (before including half.hpp) this default can be overridden \nwith one of the other standard rounding modes using their respective constants \nor the equivalent values of 'std::float_round_style' (it can even be \nsynchronized with the underlying single-precision implementation by defining it \nto 'std::numeric_limits<float>::round_style'):\n\n  - 'std::round_indeterminate' or -1 for the fastest rounding (default).\n\n  - 'std::round_toward_zero' or 0 for rounding toward zero.\n\n  - std::round_to_nearest' or 1 for rounding to the nearest value.\n\n  - std::round_toward_infinity' or 2 for rounding toward positive infinity.\n\n  - std::round_toward_neg_infinity' or 3 for rounding toward negative infinity.\n\nIn addition to changing the overall default rounding mode one can also use the \n'half_cast'. This converts between half and any built-in arithmetic type using \na configurable rounding mode (or the default rounding mode if none is \nspecified). In addition to a configurable rounding mode, 'half_cast' has two \nother differences to a mere 'static_cast': (1) Floating point types are \nexplicitly cast to float before being converted to half-precision and thus any \nwarnings for narrowing conversions are suppressed. (2) Conversions to/from \ninteger types are performed directly using the given rounding mode, without any \nintermediate conversion to/from float.\n\n    half a = half_cast<half>(4.2);\n    half b = half_cast<half,std::numeric_limits<float>::round_style>(4.2f);\n    assert( half_cast<int, std::round_to_nearest>( 0.7_h )     == 1 );\n    assert( half_cast<half,std::round_toward_zero>( 4097 )     == 4096.0_h );\n    assert( half_cast<half,std::round_toward_infinity>( 4097 ) == 4100.0_h );\n\nWhen using round to nearest (either as default or thorugh 'half_cast') ties are \nby default resolved by rounding them away from zero (and thus equal to the \nbehaviour of the 'round' function). But by redefining the \n'HALF_ROUND_TIES_TO_EVEN' preprocessor symbol to 1 (before including half.hpp) \nthis default can be changed to the slightly slower but less biased and more \nIEEE-conformant behaviour of rounding half-way cases to the nearest even value.\n\n    #define HALF_ROUND_TIES_TO_EVEN 1\n    #include <half.hpp>\n    ...\n    assert( half_cast<int,std::round_to_nearest>(3.5_h) \n         == half_cast<int,std::round_to_nearest>(4.5_h) );\n\nIMPLEMENTATION\n\nFor performance reasons (and ease of implementation) many of the mathematical \nfunctions provided by the library as well as all arithmetic operations are \nactually carried out in single-precision under the hood, calling to the C++ \nstandard library implementations of those functions whenever appropriate, \nmeaning the arguments are converted to floats and the result back to half. But \nto reduce the conversion overhead as much as possible any temporary values \ninside of lengthy expressions are kept in single-precision as long as possible, \nwhile still maintaining a strong half-precision type to the outside world. Only \nwhen finally assigning the value to a half or calling a function that works \ndirectly on halfs is the actual conversion done (or never, when further \nconverting the result to float.\n\nThis approach has two implications. First of all you have to treat the \nlibrary's documentation at http://half.sourceforge.net as a simplified version, \ndescribing the behaviour of the library as if implemented this way. The actual \nargument and return types of functions and operators may involve other internal \ntypes (feel free to generate the exact developer documentation from the Doxygen \ncomments in the library's header file if you really need to). But nevertheless \nthe behaviour is exactly like specified in the documentation. The other \nimplication is, that in the presence of rounding errors or over-/underflows \narithmetic expressions may produce different results when compared to \nconverting to half-precision after each individual operation:\n\n    half a = (std::numeric_limits<half>::max() * 2.0_h) / 2.0_h; // a = MAX\n    half b = std::numeric_limits<half>::max() * 2.0_h;           // b = INF\n    b /= 2.0_h;                                                  // b stays INF\n\nBut this should only be a problem in very few cases. One last word has to be \nsaid when talking about performance. Even with its efforts in reducing \nconversion overhead as much as possible, the software half-precision \nimplementation can most probably not beat the direct use of single-precision \ncomputations. Usually using actual float values for all computations and \ntemproraries and using halfs only for storage is the recommended way. On the \none hand this somehow makes the provided mathematical functions obsolete \n(especially in light of the implicit conversion from half to float), but \nnevertheless the goal of this library was to provide a complete and \nconceptually clean half-precision implementation, to which the standard \nmathematical functions belong, even if usually not needed.\n\nIEEE CONFORMANCE\n\nThe half type uses the standard IEEE representation with 1 sign bit, 5 exponent \nbits and 10 mantissa bits (11 when counting the hidden bit). It supports all \ntypes of special values, like subnormal values, infinity and NaNs. But there \nare some limitations to the complete conformance to the IEEE 754 standard:\n\n  - The implementation does not differentiate between signalling and quiet \n    NaNs, this means operations on halfs are not specified to trap on \n    signalling NaNs (though they may, see last point).\n\n  - Though arithmetic operations are internally rounded to single-precision \n    using the underlying single-precision implementation's current rounding \n    mode, those values are then converted to half-precision using the default \n    half-precision rounding mode (changed by defining 'HALF_ROUND_STYLE' \n    accordingly). This mixture of rounding modes is also the reason why \n    'std::numeric_limits<half>::round_style' may actually return \n    'std::round_indeterminate' when half- and single-precision rounding modes \n    don't match.\n\n  - Because of internal truncation it may also be that certain single-precision \n    NaNs will be wrongly converted to half-precision infinity, though this is \n    very unlikely to happen, since most single-precision implementations don't \n    tend to only set the lowest bits of a NaN mantissa.\n\n  - The implementation does not provide any floating point exceptions, thus \n    arithmetic operations or mathematical functions are not specified to invoke \n    proper floating point exceptions. But due to many functions implemented in \n    single-precision, those may still invoke floating point exceptions of the \n    underlying single-precision implementation.\n\nSome of those points could have been circumvented by controlling the floating \npoint environment using <cfenv> or implementing a similar exception mechanism. \nBut this would have required excessive runtime checks giving two high an impact \non performance for something that is rarely ever needed. If you really need to \nrely on proper floating point exceptions, it is recommended to explicitly \nperform computations using the built-in floating point types to be on the safe \nside. In the same way, if you really need to rely on a particular rounding \nbehaviour, it is recommended to either use single-precision computations and \nexplicitly convert the result to half-precision using 'half_cast' and \nspecifying the desired rounding mode, or synchronize the default half-precision \nrounding mode to the rounding mode of the single-precision implementation (most \nlikely 'HALF_ROUND_STYLE=1', 'HALF_ROUND_TIES_TO_EVEN=1'). But this is really \nconsidered an expert-scenario that should be used only when necessary, since \nactually working with half-precision usually comes with a certain \ntolerance/ignorance of exactness considerations and proper rounding comes with \na certain performance cost.\n\n\nCREDITS AND CONTACT\n-------------------\n\nThis library is developed by CHRISTIAN RAU and released under the MIT License \n(see LICENSE.txt). If you have any questions or problems with it, feel free to \ncontact me at rauy@users.sourceforge.net.\n\nAdditional credit goes to JEROEN VAN DER ZIJP for his paper on \"Fast Half Float \nConversions\", whose algorithms have been used in the library for converting \nbetween half-precision and single-precision values.\n"
  },
  {
    "path": "third_party/half/include/half.hpp",
    "content": "// half - IEEE 754-based half-precision floating point library.\n//\n// Copyright (c) 2012-2013 Christian Rau <rauy@users.sourceforge.net>\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation \n// files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, \n// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the \n// Software is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE \n// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR \n// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, \n// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// Version 1.11.0\n\n/// \\file\n/// Main header file for half precision functionality.\n\n#ifndef HALF_HALF_HPP\n#define HALF_HALF_HPP\n\n/// Combined gcc version number.\n#define HALF_GNUC_VERSION (__GNUC__*100+__GNUC_MINOR__)\n\n//check C++11 language features\n#if defined(__clang__)\t\t\t\t\t\t\t\t\t\t//clang\n\t#if __has_feature(cxx_static_assert) && !defined(HALF_ENABLE_CPP11_STATIC_ASSERT)\n\t\t#define HALF_ENABLE_CPP11_STATIC_ASSERT 1\n\t#endif\n\t#if __has_feature(cxx_constexpr) && !defined(HALF_ENABLE_CPP11_CONSTEXPR)\n\t\t#define HALF_ENABLE_CPP11_CONSTEXPR 1\n\t#endif\n\t#if __has_feature(cxx_noexcept) && !defined(HALF_ENABLE_CPP11_NOEXCEPT)\n\t\t#define HALF_ENABLE_CPP11_NOEXCEPT 1\n\t#endif\n\t#if __has_feature(cxx_user_literals) && !defined(HALF_ENABLE_CPP11_USER_LITERALS)\n\t\t#define HALF_ENABLE_CPP11_USER_LITERALS 1\n\t#endif\n\t#if (defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L) && !defined(HALF_ENABLE_CPP11_LONG_LONG)\n\t\t#define HALF_ENABLE_CPP11_LONG_LONG 1\n\t#endif\n/*#elif defined(__INTEL_COMPILER)\t\t\t\t\t\t\t\t//Intel C++\n\t#if __INTEL_COMPILER >= 1100 && !defined(HALF_ENABLE_CPP11_STATIC_ASSERT)\t\t????????\n\t\t#define HALF_ENABLE_CPP11_STATIC_ASSERT 1\n\t#endif\n\t#if __INTEL_COMPILER >= 1300 && !defined(HALF_ENABLE_CPP11_CONSTEXPR)\t\t\t????????\n\t\t#define HALF_ENABLE_CPP11_CONSTEXPR 1\n\t#endif\n\t#if __INTEL_COMPILER >= 1300 && !defined(HALF_ENABLE_CPP11_NOEXCEPT)\t\t\t????????\n\t\t#define HALF_ENABLE_CPP11_NOEXCEPT 1\n\t#endif\n\t#if __INTEL_COMPILER >= 1100 && !defined(HALF_ENABLE_CPP11_LONG_LONG)\t\t\t????????\n\t\t#define HALF_ENABLE_CPP11_LONG_LONG 1\n\t#endif*/\n#elif defined(__GNUC__)\t\t\t\t\t\t\t\t\t\t//gcc\n\t#if defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L\n\t\t#if HALF_GNUC_VERSION >= 403 && !defined(HALF_ENABLE_CPP11_STATIC_ASSERT)\n\t\t\t#define HALF_ENABLE_CPP11_STATIC_ASSERT 1\n\t\t#endif\n\t\t#if HALF_GNUC_VERSION >= 406 && !defined(HALF_ENABLE_CPP11_CONSTEXPR)\n\t\t\t#define HALF_ENABLE_CPP11_CONSTEXPR 1\n\t\t#endif\n\t\t#if HALF_GNUC_VERSION >= 406 && !defined(HALF_ENABLE_CPP11_NOEXCEPT)\n\t\t\t#define HALF_ENABLE_CPP11_NOEXCEPT 1\n\t\t#endif\n\t\t#if HALF_GNUC_VERSION >= 407 && !defined(HALF_ENABLE_CPP11_USER_LITERALS)\n\t\t\t#define HALF_ENABLE_CPP11_USER_LITERALS 1\n\t\t#endif\n\t\t#if !defined(HALF_ENABLE_CPP11_LONG_LONG)\n\t\t\t#define HALF_ENABLE_CPP11_LONG_LONG 1\n\t\t#endif\n\t#endif\n#elif defined(_MSC_VER)\t\t\t\t\t\t\t\t\t\t//Visual C++\n\t#if _MSC_VER >= 1600 && !defined(HALF_ENABLE_CPP11_STATIC_ASSERT)\n\t\t#define HALF_ENABLE_CPP11_STATIC_ASSERT 1\n\t#endif\n\t#if _MSC_VER >= 1310 && !defined(HALF_ENABLE_CPP11_LONG_LONG)\n\t\t#define HALF_ENABLE_CPP11_LONG_LONG 1\n\t#endif\n\t#define HALF_POP_WARNINGS 1\n\t#pragma warning(push)\n\t#pragma warning(disable : 4099 4127 4146)\t//struct vs class, constant in if, negative unsigned\n#endif\n\n//check C++11 library features\n#include <utility>\n#if defined(_LIBCPP_VERSION)\t\t\t\t\t\t\t\t//libc++\n\t#if defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103\n\t\t#ifndef HALF_ENABLE_CPP11_TYPE_TRAITS\n\t\t\t#define HALF_ENABLE_CPP11_TYPE_TRAITS 1\n\t\t#endif\n\t\t#ifndef HALF_ENABLE_CPP11_CSTDINT\n\t\t\t#define HALF_ENABLE_CPP11_CSTDINT 1\n\t\t#endif\n\t\t#ifndef HALF_ENABLE_CPP11_CMATH\n\t\t\t#define HALF_ENABLE_CPP11_CMATH 1\n\t\t#endif\n\t\t#ifndef HALF_ENABLE_CPP11_HASH\n\t\t\t#define HALF_ENABLE_CPP11_HASH 1\n\t\t#endif\n\t#endif\n#elif defined(__GLIBCXX__)\t\t\t\t\t\t\t\t\t//libstdc++\n\t#if defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103\n\t\t#ifdef __clang__\n\t\t\t#if __GLIBCXX__ >= 20080606 && !defined(HALF_ENABLE_CPP11_TYPE_TRAITS)\n\t\t\t\t#define HALF_ENABLE_CPP11_TYPE_TRAITS 1\n\t\t\t#endif\n\t\t\t#if __GLIBCXX__ >= 20080606 && !defined(HALF_ENABLE_CPP11_CSTDINT)\n\t\t\t\t#define HALF_ENABLE_CPP11_CSTDINT 1\n\t\t\t#endif\n\t\t\t#if __GLIBCXX__ >= 20080606 && !defined(HALF_ENABLE_CPP11_CMATH)\n\t\t\t\t#define HALF_ENABLE_CPP11_CMATH 1\n\t\t\t#endif\n\t\t\t#if __GLIBCXX__ >= 20080606 && !defined(HALF_ENABLE_CPP11_HASH)\n\t\t\t\t#define HALF_ENABLE_CPP11_HASH 1\n\t\t\t#endif\n\t\t#else\n\t\t\t#if HALF_GNUC_VERSION >= 403 && !defined(HALF_ENABLE_CPP11_CSTDINT)\n\t\t\t\t#define HALF_ENABLE_CPP11_CSTDINT 1\n\t\t\t#endif\n\t\t\t#if HALF_GNUC_VERSION >= 403 && !defined(HALF_ENABLE_CPP11_CMATH)\n\t\t\t\t#define HALF_ENABLE_CPP11_CMATH 1\n\t\t\t#endif\n\t\t\t#if HALF_GNUC_VERSION >= 403 && !defined(HALF_ENABLE_CPP11_HASH)\n\t\t\t\t#define HALF_ENABLE_CPP11_HASH 1\n\t\t\t#endif\n\t\t#endif\n\t#endif\n#elif defined(_CPPLIB_VER)\t\t\t\t\t\t\t\t\t//Dinkumware/Visual C++\n\t#if _CPPLIB_VER >= 520\n\t\t#ifndef HALF_ENABLE_CPP11_TYPE_TRAITS\n\t\t\t#define HALF_ENABLE_CPP11_TYPE_TRAITS 1\n\t\t#endif\n\t\t#ifndef HALF_ENABLE_CPP11_CSTDINT\n\t\t\t#define HALF_ENABLE_CPP11_CSTDINT 1\n\t\t#endif\n\t\t#ifndef HALF_ENABLE_CPP11_HASH\n\t\t\t#define HALF_ENABLE_CPP11_HASH 1\n\t\t#endif\n\t#endif\n\t#if _CPPLIB_VER >= 610\n\t\t#ifndef HALF_ENABLE_CPP11_CMATH\n\t\t\t#define HALF_ENABLE_CPP11_CMATH 1\n\t\t#endif\n\t#endif\n#endif\n#undef HALF_GNUC_VERSION\n\n//support constexpr\n#if HALF_ENABLE_CPP11_CONSTEXPR\n\t#define HALF_CONSTEXPR\t\t\tconstexpr\n\t#define HALF_CONSTEXPR_CONST\tconstexpr\n#else\n\t#define HALF_CONSTEXPR\n\t#define HALF_CONSTEXPR_CONST\tconst\n#endif\n\n//support noexcept\n#if HALF_ENABLE_CPP11_NOEXCEPT\n\t#define HALF_NOEXCEPT\tnoexcept\n\t#define HALF_NOTHROW\tnoexcept\n#else\n\t#define HALF_NOEXCEPT\n\t#define HALF_NOTHROW\tthrow()\n#endif\n\n#include <algorithm>\n#include <iostream>\n#include <limits>\n#include <climits>\n#include <cmath>\n#include <cstring>\n#if HALF_ENABLE_CPP11_TYPE_TRAITS\n\t#include <type_traits>\n#endif\n#if HALF_ENABLE_CPP11_CSTDINT\n\t#include <cstdint>\n#endif\n#if HALF_ENABLE_CPP11_HASH\n\t#include <functional>\n#endif\n\n\n/// Default rounding mode.\n/// This specifies the rounding mode used for all conversions between [half](\\ref half_float::half)s and `float`s as well as \n/// for the half_cast() if not specifying a rounding mode explicitly. It can be redefined (before including half.hpp) to one \n/// of the standard rounding modes using their respective constants or the equivalent values of `std::float_round_style`:\n///\n/// `std::float_round_style`         | value | rounding\n/// ---------------------------------|-------|-------------------------\n/// `std::round_indeterminate`       | -1    | fastest (default)\n/// `std::round_toward_zero`         | 0     | toward zero\n/// `std::round_to_nearest`          | 1     | to nearest\n/// `std::round_toward_infinity`     | 2     | toward positive infinity\n/// `std::round_toward_neg_infinity` | 3     | toward negative infinity\n///\n/// By default this is set to `-1` (`std::round_indeterminate`), which uses truncation (round toward zero, but with overflows \n/// set to infinity) and is the fastest rounding mode possible. It can even be set to `std::numeric_limits<float>::round_style` \n/// to synchronize the rounding mode with that of the underlying single-precision implementation.\n#ifndef HALF_ROUND_STYLE\n\t#define HALF_ROUND_STYLE\t-1\t\t\t// = std::round_indeterminate\n#endif\n\n/// Tie-breaking behaviour for round to nearest.\n/// This specifies if ties in round to nearest should be resolved by rounding to the nearest even value. By default this is \n/// defined to `0` resulting in the faster but slightly more biased behaviour of rounding away from zero in half-way cases (and \n/// thus equal to the round() function), but can be redefined to `1` (before including half.hpp) if more IEEE-conformant \n/// behaviour is needed.\n#ifndef HALF_ROUND_TIES_TO_EVEN\n\t#define HALF_ROUND_TIES_TO_EVEN\t0\t\t// ties away from zero\n#endif\n\n/// Value signaling overflow.\n/// In correspondence with `HUGE_VAL[F|L]` from `<cmath>` this symbol expands to a positive value signaling the overflow of an \n/// operation, in particular it just evaluates to positive infinity.\n#define HUGE_VALH\tstd::numeric_limits<half_float::half>::infinity()\n\n/// Fast half-precision fma function.\n/// This symbol is only defined if the fma() function generally executes as fast as, or faster than, a separate \n/// half-precision multiplication followed by an addition. Due to the internal single-precision implementation of all \n/// arithmetic operations, this is in fact always the case.\n#define FP_FAST_FMAH\t1\n\n#ifndef FP_ILOGB0\n\t#define FP_ILOGB0\t\tINT_MIN\n#endif\n#ifndef FP_ILOGBNAN\n\t#define FP_ILOGBNAN\t\tINT_MAX\n#endif\n#ifndef FP_SUBNORMAL\n\t#define FP_SUBNORMAL\t0\n#endif\n#ifndef FP_ZERO\n\t#define FP_ZERO\t\t\t1\n#endif\n#ifndef FP_NAN\n\t#define FP_NAN\t\t\t2\n#endif\n#ifndef FP_INFINITE\n\t#define FP_INFINITE\t\t3\n#endif\n#ifndef FP_NORMAL\n\t#define FP_NORMAL\t\t4\n#endif\n\n\n/// Main namespace for half precision functionality.\n/// This namespace contains all the functionality provided by the library.\nnamespace half_float\n{\n\tclass half;\n\n\t/// \\internal\n\t/// \\brief Implementation details.\n\tnamespace detail\n\t{\n\t#if HALF_ENABLE_CPP11_TYPE_TRAITS\n\t\t/// Conditional type.\n\t\ttemplate<bool B,typename T,typename F> struct conditional : std::conditional<B,T,F> {};\n\n\t\t/// Helper for tag dispatching.\n\t\ttemplate<bool B> struct bool_type : std::integral_constant<bool,B> {};\n\t\tusing std::true_type;\n\t\tusing std::false_type;\n\n\t\t/// Type traits for floating point types.\n\t\ttemplate<typename T> struct is_float : std::is_floating_point<T> {};\n\t#else\n\t\t/// Conditional type.\n\t\ttemplate<bool,typename T,typename> struct conditional { typedef T type; };\n\t\ttemplate<typename T,typename F> struct conditional<false,T,F> { typedef F type; };\n\n\t\t/// Helper for tag dispatching.\n\t\ttemplate<bool> struct bool_type {};\n\t\ttypedef bool_type<true> true_type;\n\t\ttypedef bool_type<false> false_type;\n\n\t\t/// Type traits for floating point types.\n\t\ttemplate<typename> struct is_float : false_type {};\n\t\ttemplate<typename T> struct is_float<const T> : is_float<T> {};\n\t\ttemplate<typename T> struct is_float<volatile T> : is_float<T> {};\n\t\ttemplate<typename T> struct is_float<const volatile T> : is_float<T> {};\n\t\ttemplate<> struct is_float<float> : true_type {};\n\t\ttemplate<> struct is_float<double> : true_type {};\n\t\ttemplate<> struct is_float<long double> : true_type {};\n\t#endif\n\n\t#if HALF_ENABLE_CPP11_CSTDINT\n\t\t/// Unsigned integer of (at least) 16 bits width.\n\t\ttypedef std::uint_least16_t uint16;\n\n\t\t/// Unsigned integer of (at least) 32 bits width.\n\t\ttypedef std::uint_least32_t uint32;\n\n\t\t/// Fastest signed integer capable of holding all values of type uint16.\n\t\ttypedef std::int_fast32_t int17;\n\t#else\n\t\t/// Unsigned integer of (at least) 16 bits width.\n\t\ttypedef unsigned short uint16;\n\n\t\t/// Unsigned integer of (at least) 32 bits width.\n\t\ttypedef conditional<std::numeric_limits<unsigned int>::digits>=32,unsigned int,unsigned long>::type uint32;\n\n\t\t/// Fastest signed integer capable of holding all values of type uint16.\n\t\ttypedef conditional<std::numeric_limits<int>::digits>=16,int,long>::type int17;\n\t#endif\n\n\t\t/// Tag type for binary construction.\n\t\tstruct binary_t {};\n\n\t\t/// Tag for binary construction.\n\t\tHALF_CONSTEXPR_CONST binary_t binary = binary_t();\n\n\t\t/// Temporary half-precision expression.\n\t\t/// This class represents a half-precision expression which just stores a single-precision value internally.\n\t\tstruct expr\n\t\t{\n\t\t\t/// Conversion constructor.\n\t\t\t/// \\param f single-precision value to convert\n\t\t\texplicit HALF_CONSTEXPR expr(float f) : value_(f) {}\n\n\t\t\t/// Conversion to single-precision.\n\t\t\t/// \\return single precision value representing expression value\n\t\t\tHALF_CONSTEXPR operator float() const { return value_; }\n\n\t\tprivate:\n\t\t\t/// Internal expression value stored in single-precision.\n\t\t\tfloat value_;\n\t\t};\n\n\t\t/// SFINAE helper for generic half-precision functions.\n\t\t/// This class template has to be specialized for each valid combination of argument types to provide a corresponding \n\t\t/// `type` member equivalent to \\a T.\n\t\t/// \\tparam T type to return\n\t\ttemplate<typename T,typename,typename=void,typename=void> struct enable {};\n\t\ttemplate<typename T> struct enable<T,half,void,void> { typedef T type; };\n\t\ttemplate<typename T> struct enable<T,expr,void,void> { typedef T type; };\n\t\ttemplate<typename T> struct enable<T,half,half,void> { typedef T type; };\n\t\ttemplate<typename T> struct enable<T,half,expr,void> { typedef T type; };\n\t\ttemplate<typename T> struct enable<T,expr,half,void> { typedef T type; };\n\t\ttemplate<typename T> struct enable<T,expr,expr,void> { typedef T type; };\n\t\ttemplate<typename T> struct enable<T,half,half,half> { typedef T type; };\n\t\ttemplate<typename T> struct enable<T,half,half,expr> { typedef T type; };\n\t\ttemplate<typename T> struct enable<T,half,expr,half> { typedef T type; };\n\t\ttemplate<typename T> struct enable<T,half,expr,expr> { typedef T type; };\n\t\ttemplate<typename T> struct enable<T,expr,half,half> { typedef T type; };\n\t\ttemplate<typename T> struct enable<T,expr,half,expr> { typedef T type; };\n\t\ttemplate<typename T> struct enable<T,expr,expr,half> { typedef T type; };\n\t\ttemplate<typename T> struct enable<T,expr,expr,expr> { typedef T type; };\n\n\t\t/// Return type for specialized generic 2-argument half-precision functions.\n\t\t/// This class template has to be specialized for each valid combination of argument types to provide a corresponding \n\t\t/// `type` member denoting the appropriate return type.\n\t\t/// \\tparam T first argument type\n\t\t/// \\tparam U first argument type\n\t\ttemplate<typename T,typename U> struct result : enable<expr,T,U> {};\n\t\ttemplate<> struct result<half,half> { typedef half type; };\n\n\t\t/// \\name Classification helpers\n\t\t/// \\{\n\n\t\t/// Check for infinity.\n\t\t/// \\tparam T argument type (builtin floating point type)\n\t\t/// \\param arg value to query\n\t\t/// \\retval true if infinity\n\t\t/// \\retval false else\n\t\ttemplate<typename T> bool builtin_isinf(T arg)\n\t\t{\n\t\t#if HALF_ENABLE_CPP11_CMATH\n\t\t\treturn std::isinf(arg);\n\t\t#elif defined(_MSC_VER)\n\t\t\treturn !_finite(static_cast<double>(arg)) && !_isnan(static_cast<double>(arg));\n\t\t#else\n\t\t\treturn arg == std::numeric_limits<T>::infinity() || arg == -std::numeric_limits<T>::infinity();\n\t\t#endif\n\t\t}\n\n\t\t/// Check for NaN.\n\t\t/// \\tparam T argument type (builtin floating point type)\n\t\t/// \\param arg value to query\n\t\t/// \\retval true if not a number\n\t\t/// \\retval false else\n\t\ttemplate<typename T> bool builtin_isnan(T arg)\n\t\t{\n\t\t#if HALF_ENABLE_CPP11_CMATH\n\t\t\treturn std::isnan(arg);\n\t\t#elif defined(_MSC_VER)\n\t\t\treturn _isnan(static_cast<double>(arg)) != 0;\n\t\t#else\n\t\t\treturn arg != arg;\n\t\t#endif\n\t\t}\n\n\t\t/// Check sign.\n\t\t/// \\tparam T argument type (builtin floating point type)\n\t\t/// \\param arg value to query\n\t\t/// \\retval true if signbit set\n\t\t/// \\retval false else\n\t\ttemplate<typename T> bool builtin_signbit(T arg)\n\t\t{\n\t\t#if HALF_ENABLE_CPP11_CMATH\n\t\t\treturn std::signbit(arg);\n\t\t#else\n\t\t\treturn arg < T() || (arg == T() && T(1)/arg < T());\n\t\t#endif\n\t\t}\n\n\t\t/// \\}\n\t\t/// \\name Conversion\n\t\t/// \\{\n\n\t\t/// Convert IEEE single-precision to half-precision.\n\t\t/// Credit for this goes to [Jeroen van der Zijp](ftp://ftp.fox-toolkit.org/pub/fasthalffloatconversion.pdf).\n\t\t/// \\tparam R rounding mode to use, `std::round_indeterminate` for fastest rounding\n\t\t/// \\param value single-precision value\n\t\t/// \\return binary representation of half-precision value\n\t\ttemplate<std::float_round_style R> uint16 float2half_impl(float value, true_type)\n\t\t{\n\t\t#if HALF_ENABLE_CPP11_STATIC_ASSERT\n\t\t\tstatic_assert(std::numeric_limits<float>::is_iec559, \"float to half conversion needs IEEE 754 conformant 'float' type\");\n\t\t\tstatic_assert(sizeof(uint32)==sizeof(float), \"float to half conversion needs unsigned integer type of exactly the size of a 'float'\");\n\t\t#endif\n\t\t\tstatic const uint16 base_table[512] = { \n\t\t\t\t0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, \n\t\t\t\t0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, \n\t\t\t\t0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, \n\t\t\t\t0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, \n\t\t\t\t0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, \n\t\t\t\t0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, \n\t\t\t\t0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100, \n\t\t\t\t0x0200, 0x0400, 0x0800, 0x0C00, 0x1000, 0x1400, 0x1800, 0x1C00, 0x2000, 0x2400, 0x2800, 0x2C00, 0x3000, 0x3400, 0x3800, 0x3C00, \n\t\t\t\t0x4000, 0x4400, 0x4800, 0x4C00, 0x5000, 0x5400, 0x5800, 0x5C00, 0x6000, 0x6400, 0x6800, 0x6C00, 0x7000, 0x7400, 0x7800, 0x7C00, \n\t\t\t\t0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, \n\t\t\t\t0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, \n\t\t\t\t0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, \n\t\t\t\t0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, \n\t\t\t\t0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, \n\t\t\t\t0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, \n\t\t\t\t0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, 0x7C00, \n\t\t\t\t0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, \n\t\t\t\t0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, \n\t\t\t\t0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, \n\t\t\t\t0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, \n\t\t\t\t0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, \n\t\t\t\t0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, \n\t\t\t\t0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8001, 0x8002, 0x8004, 0x8008, 0x8010, 0x8020, 0x8040, 0x8080, 0x8100, \n\t\t\t\t0x8200, 0x8400, 0x8800, 0x8C00, 0x9000, 0x9400, 0x9800, 0x9C00, 0xA000, 0xA400, 0xA800, 0xAC00, 0xB000, 0xB400, 0xB800, 0xBC00, \n\t\t\t\t0xC000, 0xC400, 0xC800, 0xCC00, 0xD000, 0xD400, 0xD800, 0xDC00, 0xE000, 0xE400, 0xE800, 0xEC00, 0xF000, 0xF400, 0xF800, 0xFC00, \n\t\t\t\t0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, \n\t\t\t\t0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, \n\t\t\t\t0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, \n\t\t\t\t0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, \n\t\t\t\t0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, \n\t\t\t\t0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, \n\t\t\t\t0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00, 0xFC00 };\n\t\t\tstatic const unsigned char shift_table[512] = { \n\t\t\t\t24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, \n\t\t\t\t24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, \n\t\t\t\t24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, \n\t\t\t\t24, 24, 24, 24, 24, 24, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, \n\t\t\t\t13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, \n\t\t\t\t24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, \n\t\t\t\t24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, \n\t\t\t\t24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 13, \n\t\t\t\t24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, \n\t\t\t\t24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, \n\t\t\t\t24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, \n\t\t\t\t24, 24, 24, 24, 24, 24, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, \n\t\t\t\t13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, \n\t\t\t\t24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, \n\t\t\t\t24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, \n\t\t\t\t24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 13 };\n\t\t\tuint32 bits;// = *reinterpret_cast<uint32*>(&value);\t\t//violating strict aliasing!\n\t\t\tstd::memcpy(&bits, &value, sizeof(float));\n\t\t\tuint16 hbits = base_table[bits>>23] + static_cast<uint16>((bits&0x7FFFFF)>>shift_table[bits>>23]);\n\t\t\tif(R == std::round_to_nearest)\n\t\t\t\thbits += (((bits&0x7FFFFF)>>(shift_table[bits>>23]-1))|(((bits>>23)&0xFF)==102)) & ((hbits&0x7C00)!=0x7C00)\n\t\t\t\t#if HALF_ROUND_TIES_TO_EVEN\n\t\t\t\t\t& (((((static_cast<uint32>(1)<<(shift_table[bits>>23]-1))-1)&bits)!=0)|hbits)\n\t\t\t\t#endif\n\t\t\t\t;\n\t\t\telse if(R == std::round_toward_zero)\n\t\t\t\thbits -= ((hbits&0x7FFF)==0x7C00) & ~shift_table[bits>>23];\n\t\t\telse if(R == std::round_toward_infinity)\n\t\t\t\thbits += ((((bits&0x7FFFFF&((static_cast<uint32>(1)<<(shift_table[bits>>23]))-1))!=0)|(((bits>>23)<=102)&\n\t\t\t\t\t((bits>>23)!=0)))&(hbits<0x7C00)) - ((hbits==0xFC00)&((bits>>23)!=511));\n\t\t\telse if(R == std::round_toward_neg_infinity)\n\t\t\t\thbits += ((((bits&0x7FFFFF&((static_cast<uint32>(1)<<(shift_table[bits>>23]))-1))!=0)|(((bits>>23)<=358)&\n\t\t\t\t\t((bits>>23)!=256)))&(hbits<0xFC00)&(hbits>>15)) - ((hbits==0x7C00)&((bits>>23)!=255));\n\t\t\treturn hbits;\n\t\t}\n\n\t\t/// Convert non-IEEE single-precision to half-precision.\n\t\t/// \\param value single-precision value\n\t\t/// \\return binary representation of half-precision value\n\t\ttemplate<std::float_round_style R> uint16 float2half_impl(float value, false_type)\n\t\t{\n\t\t\tuint16 hbits = builtin_signbit(value) << 15;\n\t\t\tif(value == 0.0f)\n\t\t\t\treturn hbits;\n\t\t\tif(builtin_isnan(value))\n\t\t\t\treturn hbits | 0x7FFF;\n\t\t\tif(builtin_isinf(value))\n\t\t\t\treturn hbits | 0x7C00;\n\t\t\tint exp;\n\t\t\tstd::frexp(value, &exp);\n\t\t\tif(exp > 16)\n\t\t\t{\n\t\t\t\tif(R == std::round_toward_zero)\n\t\t\t\t\treturn hbits | 0x7BFF;\n\t\t\t\telse if(R == std::round_toward_infinity)\n\t\t\t\t\treturn hbits | 0x7C00 - (hbits>>15);\n\t\t\t\telse if(R == std::round_toward_neg_infinity)\n\t\t\t\t\treturn hbits | 0x7BFF + (hbits>>15);\n\t\t\t\treturn hbits | 0x7C00;\n\t\t\t}\n\t\t\tif(exp < -13)\n\t\t\t\tvalue = std::ldexp(value, 24);\n\t\t\telse\n\t\t\t{\n\t\t\t\tvalue = std::ldexp(value, 11-exp);\n\t\t\t\thbits |= ((exp+14)<<10);\n\t\t\t}\n\t\t\tint ival = static_cast<int>(value);\n\t\t\thbits |= static_cast<uint16>(std::abs(ival)&0x3FF);\n\t\t\tif(R == std::round_to_nearest)\n\t\t\t{\n\t\t\t\tfloat diff = std::abs(value-static_cast<float>(ival));\n\t\t\t\t#if HALF_ROUND_TIES_TO_EVEN\n\t\t\t\t\thbits += (diff>0.5f) | ((diff==0.5f)&hbits);\n\t\t\t\t#else\n\t\t\t\t\thbits += diff >= 0.5f;\n\t\t\t\t#endif\n\t\t\t}\n\t\t\telse if(R == std::round_toward_infinity)\n\t\t\t\thbits += value > static_cast<float>(ival);\n\t\t\telse if(R == std::round_toward_neg_infinity)\n\t\t\t\thbits += value < static_cast<float>(ival);\n\t\t\treturn hbits;\n\t\t}\n\n\t\t/// Convert single-precision to half-precision.\n\t\t/// \\param value single-precision value\n\t\t/// \\return binary representation of half-precision value\n\t\ttemplate<std::float_round_style R> uint16 float2half(float value)\n\t\t{\n\t\t\treturn float2half_impl<R>(value, bool_type<std::numeric_limits<float>::is_iec559&&sizeof(uint32)==sizeof(float)>());\n\t\t}\n\n\t\t/// Convert integer to half-precision floating point.\n\t\t/// \\tparam R rounding mode to use, `std::round_indeterminate` for fastest rounding\n\t\t/// \\tparam S `true` if value negative, `false` else\n\t\t/// \\tparam T type to convert (builtin integer type)\n\t\t/// \\param value non-negative integral value\n\t\t/// \\return binary representation of half-precision value\n\t\ttemplate<std::float_round_style R,bool S,typename T> uint16 int2half_impl(T value)\n\t\t{\n\t\t\tif(S)\n\t\t\t\tvalue = -value;\n\t\t\tuint16 bits = S << 15;\n\t\t\tif(value > 65504)\n\t\t\t{\n\t\t\t\tif(R == std::round_toward_infinity)\n\t\t\t\t\tbits |= 0x7C00 - S;\n\t\t\t\telse if(R == std::round_toward_neg_infinity)\n\t\t\t\t\tbits |= 0x7BFF + S;\n\t\t\t\telse\n\t\t\t\t\tbits |= 0x7BFF + (R!=std::round_toward_zero);\n\t\t\t}\n\t\t\telse if(value)\n\t\t\t{\n\t\t\t\tunsigned int m = value, exp = 25;\n\t\t\t\tfor(; m<0x400; m<<=1,--exp) ;\n\t\t\t\tfor(; m>0x7FF; m>>=1,++exp) ;\n\t\t\t\tbits |= (exp<<10) | (m&0x3FF);\n\t\t\t\tif(exp > 25)\n\t\t\t\t{\n\t\t\t\t\tif(R == std::round_to_nearest)\n\t\t\t\t\t\tbits += (value>>(exp-26)) & 1\n\t\t\t\t\t\t#if HALF_ROUND_TIES_TO_EVEN\n\t\t\t\t\t\t\t& (((((1<<(exp-26))-1)&value)!=0)|bits)\n\t\t\t\t\t\t#endif\n\t\t\t\t\t\t;\n\t\t\t\t\telse if(R == std::round_toward_infinity)\n\t\t\t\t\t\tbits += ((value&((1<<(exp-25))-1))!=0) & !S;\n\t\t\t\t\telse if(R == std::round_toward_neg_infinity)\n\t\t\t\t\t\tbits += ((value&((1<<(exp-25))-1))!=0) & S;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn bits;\n\t\t}\n\n\t\t/// Convert integer to half-precision floating point.\n\t\t/// \\tparam R rounding mode to use, `std::round_indeterminate` for fastest rounding\n\t\t/// \\tparam T type to convert (builtin integer type)\n\t\t/// \\param value integral value\n\t\t/// \\return binary representation of half-precision value\n\t\ttemplate<std::float_round_style R,typename T> uint16 int2half(T value)\n\t\t{\n\t\t\treturn (value<0) ? int2half_impl<R,true>(value) : int2half_impl<R,false>(value);\n\t\t}\n\n\t\t/// Convert half-precision to IEEE single-precision.\n\t\t/// Credit for this goes to [Jeroen van der Zijp](ftp://ftp.fox-toolkit.org/pub/fasthalffloatconversion.pdf).\n\t\t/// \\param value binary representation of half-precision value\n\t\t/// \\return single-precision value\n\t\tinline float half2float_impl(uint16 value, true_type)\n\t\t{\n\t\t#if HALF_ENABLE_CPP11_STATIC_ASSERT\n\t\t\tstatic_assert(std::numeric_limits<float>::is_iec559, \"half to float conversion needs IEEE 754 conformant 'float' type\");\n\t\t\tstatic_assert(sizeof(uint32)==sizeof(float), \"half to float conversion needs unsigned integer type of exactly the size of a 'float'\");\n\t\t#endif\n\t\t\tstatic const uint32 mantissa_table[2048] = { \n\t\t\t\t0x00000000, 0x33800000, 0x34000000, 0x34400000, 0x34800000, 0x34A00000, 0x34C00000, 0x34E00000, 0x35000000, 0x35100000, 0x35200000, 0x35300000, 0x35400000, 0x35500000, 0x35600000, 0x35700000, \n\t\t\t\t0x35800000, 0x35880000, 0x35900000, 0x35980000, 0x35A00000, 0x35A80000, 0x35B00000, 0x35B80000, 0x35C00000, 0x35C80000, 0x35D00000, 0x35D80000, 0x35E00000, 0x35E80000, 0x35F00000, 0x35F80000, \n\t\t\t\t0x36000000, 0x36040000, 0x36080000, 0x360C0000, 0x36100000, 0x36140000, 0x36180000, 0x361C0000, 0x36200000, 0x36240000, 0x36280000, 0x362C0000, 0x36300000, 0x36340000, 0x36380000, 0x363C0000, \n\t\t\t\t0x36400000, 0x36440000, 0x36480000, 0x364C0000, 0x36500000, 0x36540000, 0x36580000, 0x365C0000, 0x36600000, 0x36640000, 0x36680000, 0x366C0000, 0x36700000, 0x36740000, 0x36780000, 0x367C0000, \n\t\t\t\t0x36800000, 0x36820000, 0x36840000, 0x36860000, 0x36880000, 0x368A0000, 0x368C0000, 0x368E0000, 0x36900000, 0x36920000, 0x36940000, 0x36960000, 0x36980000, 0x369A0000, 0x369C0000, 0x369E0000, \n\t\t\t\t0x36A00000, 0x36A20000, 0x36A40000, 0x36A60000, 0x36A80000, 0x36AA0000, 0x36AC0000, 0x36AE0000, 0x36B00000, 0x36B20000, 0x36B40000, 0x36B60000, 0x36B80000, 0x36BA0000, 0x36BC0000, 0x36BE0000, \n\t\t\t\t0x36C00000, 0x36C20000, 0x36C40000, 0x36C60000, 0x36C80000, 0x36CA0000, 0x36CC0000, 0x36CE0000, 0x36D00000, 0x36D20000, 0x36D40000, 0x36D60000, 0x36D80000, 0x36DA0000, 0x36DC0000, 0x36DE0000, \n\t\t\t\t0x36E00000, 0x36E20000, 0x36E40000, 0x36E60000, 0x36E80000, 0x36EA0000, 0x36EC0000, 0x36EE0000, 0x36F00000, 0x36F20000, 0x36F40000, 0x36F60000, 0x36F80000, 0x36FA0000, 0x36FC0000, 0x36FE0000, \n\t\t\t\t0x37000000, 0x37010000, 0x37020000, 0x37030000, 0x37040000, 0x37050000, 0x37060000, 0x37070000, 0x37080000, 0x37090000, 0x370A0000, 0x370B0000, 0x370C0000, 0x370D0000, 0x370E0000, 0x370F0000, \n\t\t\t\t0x37100000, 0x37110000, 0x37120000, 0x37130000, 0x37140000, 0x37150000, 0x37160000, 0x37170000, 0x37180000, 0x37190000, 0x371A0000, 0x371B0000, 0x371C0000, 0x371D0000, 0x371E0000, 0x371F0000, \n\t\t\t\t0x37200000, 0x37210000, 0x37220000, 0x37230000, 0x37240000, 0x37250000, 0x37260000, 0x37270000, 0x37280000, 0x37290000, 0x372A0000, 0x372B0000, 0x372C0000, 0x372D0000, 0x372E0000, 0x372F0000, \n\t\t\t\t0x37300000, 0x37310000, 0x37320000, 0x37330000, 0x37340000, 0x37350000, 0x37360000, 0x37370000, 0x37380000, 0x37390000, 0x373A0000, 0x373B0000, 0x373C0000, 0x373D0000, 0x373E0000, 0x373F0000, \n\t\t\t\t0x37400000, 0x37410000, 0x37420000, 0x37430000, 0x37440000, 0x37450000, 0x37460000, 0x37470000, 0x37480000, 0x37490000, 0x374A0000, 0x374B0000, 0x374C0000, 0x374D0000, 0x374E0000, 0x374F0000, \n\t\t\t\t0x37500000, 0x37510000, 0x37520000, 0x37530000, 0x37540000, 0x37550000, 0x37560000, 0x37570000, 0x37580000, 0x37590000, 0x375A0000, 0x375B0000, 0x375C0000, 0x375D0000, 0x375E0000, 0x375F0000, \n\t\t\t\t0x37600000, 0x37610000, 0x37620000, 0x37630000, 0x37640000, 0x37650000, 0x37660000, 0x37670000, 0x37680000, 0x37690000, 0x376A0000, 0x376B0000, 0x376C0000, 0x376D0000, 0x376E0000, 0x376F0000, \n\t\t\t\t0x37700000, 0x37710000, 0x37720000, 0x37730000, 0x37740000, 0x37750000, 0x37760000, 0x37770000, 0x37780000, 0x37790000, 0x377A0000, 0x377B0000, 0x377C0000, 0x377D0000, 0x377E0000, 0x377F0000, \n\t\t\t\t0x37800000, 0x37808000, 0x37810000, 0x37818000, 0x37820000, 0x37828000, 0x37830000, 0x37838000, 0x37840000, 0x37848000, 0x37850000, 0x37858000, 0x37860000, 0x37868000, 0x37870000, 0x37878000, \n\t\t\t\t0x37880000, 0x37888000, 0x37890000, 0x37898000, 0x378A0000, 0x378A8000, 0x378B0000, 0x378B8000, 0x378C0000, 0x378C8000, 0x378D0000, 0x378D8000, 0x378E0000, 0x378E8000, 0x378F0000, 0x378F8000, \n\t\t\t\t0x37900000, 0x37908000, 0x37910000, 0x37918000, 0x37920000, 0x37928000, 0x37930000, 0x37938000, 0x37940000, 0x37948000, 0x37950000, 0x37958000, 0x37960000, 0x37968000, 0x37970000, 0x37978000, \n\t\t\t\t0x37980000, 0x37988000, 0x37990000, 0x37998000, 0x379A0000, 0x379A8000, 0x379B0000, 0x379B8000, 0x379C0000, 0x379C8000, 0x379D0000, 0x379D8000, 0x379E0000, 0x379E8000, 0x379F0000, 0x379F8000, \n\t\t\t\t0x37A00000, 0x37A08000, 0x37A10000, 0x37A18000, 0x37A20000, 0x37A28000, 0x37A30000, 0x37A38000, 0x37A40000, 0x37A48000, 0x37A50000, 0x37A58000, 0x37A60000, 0x37A68000, 0x37A70000, 0x37A78000, \n\t\t\t\t0x37A80000, 0x37A88000, 0x37A90000, 0x37A98000, 0x37AA0000, 0x37AA8000, 0x37AB0000, 0x37AB8000, 0x37AC0000, 0x37AC8000, 0x37AD0000, 0x37AD8000, 0x37AE0000, 0x37AE8000, 0x37AF0000, 0x37AF8000, \n\t\t\t\t0x37B00000, 0x37B08000, 0x37B10000, 0x37B18000, 0x37B20000, 0x37B28000, 0x37B30000, 0x37B38000, 0x37B40000, 0x37B48000, 0x37B50000, 0x37B58000, 0x37B60000, 0x37B68000, 0x37B70000, 0x37B78000, \n\t\t\t\t0x37B80000, 0x37B88000, 0x37B90000, 0x37B98000, 0x37BA0000, 0x37BA8000, 0x37BB0000, 0x37BB8000, 0x37BC0000, 0x37BC8000, 0x37BD0000, 0x37BD8000, 0x37BE0000, 0x37BE8000, 0x37BF0000, 0x37BF8000, \n\t\t\t\t0x37C00000, 0x37C08000, 0x37C10000, 0x37C18000, 0x37C20000, 0x37C28000, 0x37C30000, 0x37C38000, 0x37C40000, 0x37C48000, 0x37C50000, 0x37C58000, 0x37C60000, 0x37C68000, 0x37C70000, 0x37C78000, \n\t\t\t\t0x37C80000, 0x37C88000, 0x37C90000, 0x37C98000, 0x37CA0000, 0x37CA8000, 0x37CB0000, 0x37CB8000, 0x37CC0000, 0x37CC8000, 0x37CD0000, 0x37CD8000, 0x37CE0000, 0x37CE8000, 0x37CF0000, 0x37CF8000, \n\t\t\t\t0x37D00000, 0x37D08000, 0x37D10000, 0x37D18000, 0x37D20000, 0x37D28000, 0x37D30000, 0x37D38000, 0x37D40000, 0x37D48000, 0x37D50000, 0x37D58000, 0x37D60000, 0x37D68000, 0x37D70000, 0x37D78000, \n\t\t\t\t0x37D80000, 0x37D88000, 0x37D90000, 0x37D98000, 0x37DA0000, 0x37DA8000, 0x37DB0000, 0x37DB8000, 0x37DC0000, 0x37DC8000, 0x37DD0000, 0x37DD8000, 0x37DE0000, 0x37DE8000, 0x37DF0000, 0x37DF8000, \n\t\t\t\t0x37E00000, 0x37E08000, 0x37E10000, 0x37E18000, 0x37E20000, 0x37E28000, 0x37E30000, 0x37E38000, 0x37E40000, 0x37E48000, 0x37E50000, 0x37E58000, 0x37E60000, 0x37E68000, 0x37E70000, 0x37E78000, \n\t\t\t\t0x37E80000, 0x37E88000, 0x37E90000, 0x37E98000, 0x37EA0000, 0x37EA8000, 0x37EB0000, 0x37EB8000, 0x37EC0000, 0x37EC8000, 0x37ED0000, 0x37ED8000, 0x37EE0000, 0x37EE8000, 0x37EF0000, 0x37EF8000, \n\t\t\t\t0x37F00000, 0x37F08000, 0x37F10000, 0x37F18000, 0x37F20000, 0x37F28000, 0x37F30000, 0x37F38000, 0x37F40000, 0x37F48000, 0x37F50000, 0x37F58000, 0x37F60000, 0x37F68000, 0x37F70000, 0x37F78000, \n\t\t\t\t0x37F80000, 0x37F88000, 0x37F90000, 0x37F98000, 0x37FA0000, 0x37FA8000, 0x37FB0000, 0x37FB8000, 0x37FC0000, 0x37FC8000, 0x37FD0000, 0x37FD8000, 0x37FE0000, 0x37FE8000, 0x37FF0000, 0x37FF8000, \n\t\t\t\t0x38000000, 0x38004000, 0x38008000, 0x3800C000, 0x38010000, 0x38014000, 0x38018000, 0x3801C000, 0x38020000, 0x38024000, 0x38028000, 0x3802C000, 0x38030000, 0x38034000, 0x38038000, 0x3803C000, \n\t\t\t\t0x38040000, 0x38044000, 0x38048000, 0x3804C000, 0x38050000, 0x38054000, 0x38058000, 0x3805C000, 0x38060000, 0x38064000, 0x38068000, 0x3806C000, 0x38070000, 0x38074000, 0x38078000, 0x3807C000, \n\t\t\t\t0x38080000, 0x38084000, 0x38088000, 0x3808C000, 0x38090000, 0x38094000, 0x38098000, 0x3809C000, 0x380A0000, 0x380A4000, 0x380A8000, 0x380AC000, 0x380B0000, 0x380B4000, 0x380B8000, 0x380BC000, \n\t\t\t\t0x380C0000, 0x380C4000, 0x380C8000, 0x380CC000, 0x380D0000, 0x380D4000, 0x380D8000, 0x380DC000, 0x380E0000, 0x380E4000, 0x380E8000, 0x380EC000, 0x380F0000, 0x380F4000, 0x380F8000, 0x380FC000, \n\t\t\t\t0x38100000, 0x38104000, 0x38108000, 0x3810C000, 0x38110000, 0x38114000, 0x38118000, 0x3811C000, 0x38120000, 0x38124000, 0x38128000, 0x3812C000, 0x38130000, 0x38134000, 0x38138000, 0x3813C000, \n\t\t\t\t0x38140000, 0x38144000, 0x38148000, 0x3814C000, 0x38150000, 0x38154000, 0x38158000, 0x3815C000, 0x38160000, 0x38164000, 0x38168000, 0x3816C000, 0x38170000, 0x38174000, 0x38178000, 0x3817C000, \n\t\t\t\t0x38180000, 0x38184000, 0x38188000, 0x3818C000, 0x38190000, 0x38194000, 0x38198000, 0x3819C000, 0x381A0000, 0x381A4000, 0x381A8000, 0x381AC000, 0x381B0000, 0x381B4000, 0x381B8000, 0x381BC000, \n\t\t\t\t0x381C0000, 0x381C4000, 0x381C8000, 0x381CC000, 0x381D0000, 0x381D4000, 0x381D8000, 0x381DC000, 0x381E0000, 0x381E4000, 0x381E8000, 0x381EC000, 0x381F0000, 0x381F4000, 0x381F8000, 0x381FC000, \n\t\t\t\t0x38200000, 0x38204000, 0x38208000, 0x3820C000, 0x38210000, 0x38214000, 0x38218000, 0x3821C000, 0x38220000, 0x38224000, 0x38228000, 0x3822C000, 0x38230000, 0x38234000, 0x38238000, 0x3823C000, \n\t\t\t\t0x38240000, 0x38244000, 0x38248000, 0x3824C000, 0x38250000, 0x38254000, 0x38258000, 0x3825C000, 0x38260000, 0x38264000, 0x38268000, 0x3826C000, 0x38270000, 0x38274000, 0x38278000, 0x3827C000, \n\t\t\t\t0x38280000, 0x38284000, 0x38288000, 0x3828C000, 0x38290000, 0x38294000, 0x38298000, 0x3829C000, 0x382A0000, 0x382A4000, 0x382A8000, 0x382AC000, 0x382B0000, 0x382B4000, 0x382B8000, 0x382BC000, \n\t\t\t\t0x382C0000, 0x382C4000, 0x382C8000, 0x382CC000, 0x382D0000, 0x382D4000, 0x382D8000, 0x382DC000, 0x382E0000, 0x382E4000, 0x382E8000, 0x382EC000, 0x382F0000, 0x382F4000, 0x382F8000, 0x382FC000, \n\t\t\t\t0x38300000, 0x38304000, 0x38308000, 0x3830C000, 0x38310000, 0x38314000, 0x38318000, 0x3831C000, 0x38320000, 0x38324000, 0x38328000, 0x3832C000, 0x38330000, 0x38334000, 0x38338000, 0x3833C000, \n\t\t\t\t0x38340000, 0x38344000, 0x38348000, 0x3834C000, 0x38350000, 0x38354000, 0x38358000, 0x3835C000, 0x38360000, 0x38364000, 0x38368000, 0x3836C000, 0x38370000, 0x38374000, 0x38378000, 0x3837C000, \n\t\t\t\t0x38380000, 0x38384000, 0x38388000, 0x3838C000, 0x38390000, 0x38394000, 0x38398000, 0x3839C000, 0x383A0000, 0x383A4000, 0x383A8000, 0x383AC000, 0x383B0000, 0x383B4000, 0x383B8000, 0x383BC000, \n\t\t\t\t0x383C0000, 0x383C4000, 0x383C8000, 0x383CC000, 0x383D0000, 0x383D4000, 0x383D8000, 0x383DC000, 0x383E0000, 0x383E4000, 0x383E8000, 0x383EC000, 0x383F0000, 0x383F4000, 0x383F8000, 0x383FC000, \n\t\t\t\t0x38400000, 0x38404000, 0x38408000, 0x3840C000, 0x38410000, 0x38414000, 0x38418000, 0x3841C000, 0x38420000, 0x38424000, 0x38428000, 0x3842C000, 0x38430000, 0x38434000, 0x38438000, 0x3843C000, \n\t\t\t\t0x38440000, 0x38444000, 0x38448000, 0x3844C000, 0x38450000, 0x38454000, 0x38458000, 0x3845C000, 0x38460000, 0x38464000, 0x38468000, 0x3846C000, 0x38470000, 0x38474000, 0x38478000, 0x3847C000, \n\t\t\t\t0x38480000, 0x38484000, 0x38488000, 0x3848C000, 0x38490000, 0x38494000, 0x38498000, 0x3849C000, 0x384A0000, 0x384A4000, 0x384A8000, 0x384AC000, 0x384B0000, 0x384B4000, 0x384B8000, 0x384BC000, \n\t\t\t\t0x384C0000, 0x384C4000, 0x384C8000, 0x384CC000, 0x384D0000, 0x384D4000, 0x384D8000, 0x384DC000, 0x384E0000, 0x384E4000, 0x384E8000, 0x384EC000, 0x384F0000, 0x384F4000, 0x384F8000, 0x384FC000, \n\t\t\t\t0x38500000, 0x38504000, 0x38508000, 0x3850C000, 0x38510000, 0x38514000, 0x38518000, 0x3851C000, 0x38520000, 0x38524000, 0x38528000, 0x3852C000, 0x38530000, 0x38534000, 0x38538000, 0x3853C000, \n\t\t\t\t0x38540000, 0x38544000, 0x38548000, 0x3854C000, 0x38550000, 0x38554000, 0x38558000, 0x3855C000, 0x38560000, 0x38564000, 0x38568000, 0x3856C000, 0x38570000, 0x38574000, 0x38578000, 0x3857C000, \n\t\t\t\t0x38580000, 0x38584000, 0x38588000, 0x3858C000, 0x38590000, 0x38594000, 0x38598000, 0x3859C000, 0x385A0000, 0x385A4000, 0x385A8000, 0x385AC000, 0x385B0000, 0x385B4000, 0x385B8000, 0x385BC000, \n\t\t\t\t0x385C0000, 0x385C4000, 0x385C8000, 0x385CC000, 0x385D0000, 0x385D4000, 0x385D8000, 0x385DC000, 0x385E0000, 0x385E4000, 0x385E8000, 0x385EC000, 0x385F0000, 0x385F4000, 0x385F8000, 0x385FC000, \n\t\t\t\t0x38600000, 0x38604000, 0x38608000, 0x3860C000, 0x38610000, 0x38614000, 0x38618000, 0x3861C000, 0x38620000, 0x38624000, 0x38628000, 0x3862C000, 0x38630000, 0x38634000, 0x38638000, 0x3863C000, \n\t\t\t\t0x38640000, 0x38644000, 0x38648000, 0x3864C000, 0x38650000, 0x38654000, 0x38658000, 0x3865C000, 0x38660000, 0x38664000, 0x38668000, 0x3866C000, 0x38670000, 0x38674000, 0x38678000, 0x3867C000, \n\t\t\t\t0x38680000, 0x38684000, 0x38688000, 0x3868C000, 0x38690000, 0x38694000, 0x38698000, 0x3869C000, 0x386A0000, 0x386A4000, 0x386A8000, 0x386AC000, 0x386B0000, 0x386B4000, 0x386B8000, 0x386BC000, \n\t\t\t\t0x386C0000, 0x386C4000, 0x386C8000, 0x386CC000, 0x386D0000, 0x386D4000, 0x386D8000, 0x386DC000, 0x386E0000, 0x386E4000, 0x386E8000, 0x386EC000, 0x386F0000, 0x386F4000, 0x386F8000, 0x386FC000, \n\t\t\t\t0x38700000, 0x38704000, 0x38708000, 0x3870C000, 0x38710000, 0x38714000, 0x38718000, 0x3871C000, 0x38720000, 0x38724000, 0x38728000, 0x3872C000, 0x38730000, 0x38734000, 0x38738000, 0x3873C000, \n\t\t\t\t0x38740000, 0x38744000, 0x38748000, 0x3874C000, 0x38750000, 0x38754000, 0x38758000, 0x3875C000, 0x38760000, 0x38764000, 0x38768000, 0x3876C000, 0x38770000, 0x38774000, 0x38778000, 0x3877C000, \n\t\t\t\t0x38780000, 0x38784000, 0x38788000, 0x3878C000, 0x38790000, 0x38794000, 0x38798000, 0x3879C000, 0x387A0000, 0x387A4000, 0x387A8000, 0x387AC000, 0x387B0000, 0x387B4000, 0x387B8000, 0x387BC000, \n\t\t\t\t0x387C0000, 0x387C4000, 0x387C8000, 0x387CC000, 0x387D0000, 0x387D4000, 0x387D8000, 0x387DC000, 0x387E0000, 0x387E4000, 0x387E8000, 0x387EC000, 0x387F0000, 0x387F4000, 0x387F8000, 0x387FC000, \n\t\t\t\t0x38000000, 0x38002000, 0x38004000, 0x38006000, 0x38008000, 0x3800A000, 0x3800C000, 0x3800E000, 0x38010000, 0x38012000, 0x38014000, 0x38016000, 0x38018000, 0x3801A000, 0x3801C000, 0x3801E000, \n\t\t\t\t0x38020000, 0x38022000, 0x38024000, 0x38026000, 0x38028000, 0x3802A000, 0x3802C000, 0x3802E000, 0x38030000, 0x38032000, 0x38034000, 0x38036000, 0x38038000, 0x3803A000, 0x3803C000, 0x3803E000, \n\t\t\t\t0x38040000, 0x38042000, 0x38044000, 0x38046000, 0x38048000, 0x3804A000, 0x3804C000, 0x3804E000, 0x38050000, 0x38052000, 0x38054000, 0x38056000, 0x38058000, 0x3805A000, 0x3805C000, 0x3805E000, \n\t\t\t\t0x38060000, 0x38062000, 0x38064000, 0x38066000, 0x38068000, 0x3806A000, 0x3806C000, 0x3806E000, 0x38070000, 0x38072000, 0x38074000, 0x38076000, 0x38078000, 0x3807A000, 0x3807C000, 0x3807E000, \n\t\t\t\t0x38080000, 0x38082000, 0x38084000, 0x38086000, 0x38088000, 0x3808A000, 0x3808C000, 0x3808E000, 0x38090000, 0x38092000, 0x38094000, 0x38096000, 0x38098000, 0x3809A000, 0x3809C000, 0x3809E000, \n\t\t\t\t0x380A0000, 0x380A2000, 0x380A4000, 0x380A6000, 0x380A8000, 0x380AA000, 0x380AC000, 0x380AE000, 0x380B0000, 0x380B2000, 0x380B4000, 0x380B6000, 0x380B8000, 0x380BA000, 0x380BC000, 0x380BE000, \n\t\t\t\t0x380C0000, 0x380C2000, 0x380C4000, 0x380C6000, 0x380C8000, 0x380CA000, 0x380CC000, 0x380CE000, 0x380D0000, 0x380D2000, 0x380D4000, 0x380D6000, 0x380D8000, 0x380DA000, 0x380DC000, 0x380DE000, \n\t\t\t\t0x380E0000, 0x380E2000, 0x380E4000, 0x380E6000, 0x380E8000, 0x380EA000, 0x380EC000, 0x380EE000, 0x380F0000, 0x380F2000, 0x380F4000, 0x380F6000, 0x380F8000, 0x380FA000, 0x380FC000, 0x380FE000, \n\t\t\t\t0x38100000, 0x38102000, 0x38104000, 0x38106000, 0x38108000, 0x3810A000, 0x3810C000, 0x3810E000, 0x38110000, 0x38112000, 0x38114000, 0x38116000, 0x38118000, 0x3811A000, 0x3811C000, 0x3811E000, \n\t\t\t\t0x38120000, 0x38122000, 0x38124000, 0x38126000, 0x38128000, 0x3812A000, 0x3812C000, 0x3812E000, 0x38130000, 0x38132000, 0x38134000, 0x38136000, 0x38138000, 0x3813A000, 0x3813C000, 0x3813E000, \n\t\t\t\t0x38140000, 0x38142000, 0x38144000, 0x38146000, 0x38148000, 0x3814A000, 0x3814C000, 0x3814E000, 0x38150000, 0x38152000, 0x38154000, 0x38156000, 0x38158000, 0x3815A000, 0x3815C000, 0x3815E000, \n\t\t\t\t0x38160000, 0x38162000, 0x38164000, 0x38166000, 0x38168000, 0x3816A000, 0x3816C000, 0x3816E000, 0x38170000, 0x38172000, 0x38174000, 0x38176000, 0x38178000, 0x3817A000, 0x3817C000, 0x3817E000, \n\t\t\t\t0x38180000, 0x38182000, 0x38184000, 0x38186000, 0x38188000, 0x3818A000, 0x3818C000, 0x3818E000, 0x38190000, 0x38192000, 0x38194000, 0x38196000, 0x38198000, 0x3819A000, 0x3819C000, 0x3819E000, \n\t\t\t\t0x381A0000, 0x381A2000, 0x381A4000, 0x381A6000, 0x381A8000, 0x381AA000, 0x381AC000, 0x381AE000, 0x381B0000, 0x381B2000, 0x381B4000, 0x381B6000, 0x381B8000, 0x381BA000, 0x381BC000, 0x381BE000, \n\t\t\t\t0x381C0000, 0x381C2000, 0x381C4000, 0x381C6000, 0x381C8000, 0x381CA000, 0x381CC000, 0x381CE000, 0x381D0000, 0x381D2000, 0x381D4000, 0x381D6000, 0x381D8000, 0x381DA000, 0x381DC000, 0x381DE000, \n\t\t\t\t0x381E0000, 0x381E2000, 0x381E4000, 0x381E6000, 0x381E8000, 0x381EA000, 0x381EC000, 0x381EE000, 0x381F0000, 0x381F2000, 0x381F4000, 0x381F6000, 0x381F8000, 0x381FA000, 0x381FC000, 0x381FE000, \n\t\t\t\t0x38200000, 0x38202000, 0x38204000, 0x38206000, 0x38208000, 0x3820A000, 0x3820C000, 0x3820E000, 0x38210000, 0x38212000, 0x38214000, 0x38216000, 0x38218000, 0x3821A000, 0x3821C000, 0x3821E000, \n\t\t\t\t0x38220000, 0x38222000, 0x38224000, 0x38226000, 0x38228000, 0x3822A000, 0x3822C000, 0x3822E000, 0x38230000, 0x38232000, 0x38234000, 0x38236000, 0x38238000, 0x3823A000, 0x3823C000, 0x3823E000, \n\t\t\t\t0x38240000, 0x38242000, 0x38244000, 0x38246000, 0x38248000, 0x3824A000, 0x3824C000, 0x3824E000, 0x38250000, 0x38252000, 0x38254000, 0x38256000, 0x38258000, 0x3825A000, 0x3825C000, 0x3825E000, \n\t\t\t\t0x38260000, 0x38262000, 0x38264000, 0x38266000, 0x38268000, 0x3826A000, 0x3826C000, 0x3826E000, 0x38270000, 0x38272000, 0x38274000, 0x38276000, 0x38278000, 0x3827A000, 0x3827C000, 0x3827E000, \n\t\t\t\t0x38280000, 0x38282000, 0x38284000, 0x38286000, 0x38288000, 0x3828A000, 0x3828C000, 0x3828E000, 0x38290000, 0x38292000, 0x38294000, 0x38296000, 0x38298000, 0x3829A000, 0x3829C000, 0x3829E000, \n\t\t\t\t0x382A0000, 0x382A2000, 0x382A4000, 0x382A6000, 0x382A8000, 0x382AA000, 0x382AC000, 0x382AE000, 0x382B0000, 0x382B2000, 0x382B4000, 0x382B6000, 0x382B8000, 0x382BA000, 0x382BC000, 0x382BE000, \n\t\t\t\t0x382C0000, 0x382C2000, 0x382C4000, 0x382C6000, 0x382C8000, 0x382CA000, 0x382CC000, 0x382CE000, 0x382D0000, 0x382D2000, 0x382D4000, 0x382D6000, 0x382D8000, 0x382DA000, 0x382DC000, 0x382DE000, \n\t\t\t\t0x382E0000, 0x382E2000, 0x382E4000, 0x382E6000, 0x382E8000, 0x382EA000, 0x382EC000, 0x382EE000, 0x382F0000, 0x382F2000, 0x382F4000, 0x382F6000, 0x382F8000, 0x382FA000, 0x382FC000, 0x382FE000, \n\t\t\t\t0x38300000, 0x38302000, 0x38304000, 0x38306000, 0x38308000, 0x3830A000, 0x3830C000, 0x3830E000, 0x38310000, 0x38312000, 0x38314000, 0x38316000, 0x38318000, 0x3831A000, 0x3831C000, 0x3831E000, \n\t\t\t\t0x38320000, 0x38322000, 0x38324000, 0x38326000, 0x38328000, 0x3832A000, 0x3832C000, 0x3832E000, 0x38330000, 0x38332000, 0x38334000, 0x38336000, 0x38338000, 0x3833A000, 0x3833C000, 0x3833E000, \n\t\t\t\t0x38340000, 0x38342000, 0x38344000, 0x38346000, 0x38348000, 0x3834A000, 0x3834C000, 0x3834E000, 0x38350000, 0x38352000, 0x38354000, 0x38356000, 0x38358000, 0x3835A000, 0x3835C000, 0x3835E000, \n\t\t\t\t0x38360000, 0x38362000, 0x38364000, 0x38366000, 0x38368000, 0x3836A000, 0x3836C000, 0x3836E000, 0x38370000, 0x38372000, 0x38374000, 0x38376000, 0x38378000, 0x3837A000, 0x3837C000, 0x3837E000, \n\t\t\t\t0x38380000, 0x38382000, 0x38384000, 0x38386000, 0x38388000, 0x3838A000, 0x3838C000, 0x3838E000, 0x38390000, 0x38392000, 0x38394000, 0x38396000, 0x38398000, 0x3839A000, 0x3839C000, 0x3839E000, \n\t\t\t\t0x383A0000, 0x383A2000, 0x383A4000, 0x383A6000, 0x383A8000, 0x383AA000, 0x383AC000, 0x383AE000, 0x383B0000, 0x383B2000, 0x383B4000, 0x383B6000, 0x383B8000, 0x383BA000, 0x383BC000, 0x383BE000, \n\t\t\t\t0x383C0000, 0x383C2000, 0x383C4000, 0x383C6000, 0x383C8000, 0x383CA000, 0x383CC000, 0x383CE000, 0x383D0000, 0x383D2000, 0x383D4000, 0x383D6000, 0x383D8000, 0x383DA000, 0x383DC000, 0x383DE000, \n\t\t\t\t0x383E0000, 0x383E2000, 0x383E4000, 0x383E6000, 0x383E8000, 0x383EA000, 0x383EC000, 0x383EE000, 0x383F0000, 0x383F2000, 0x383F4000, 0x383F6000, 0x383F8000, 0x383FA000, 0x383FC000, 0x383FE000, \n\t\t\t\t0x38400000, 0x38402000, 0x38404000, 0x38406000, 0x38408000, 0x3840A000, 0x3840C000, 0x3840E000, 0x38410000, 0x38412000, 0x38414000, 0x38416000, 0x38418000, 0x3841A000, 0x3841C000, 0x3841E000, \n\t\t\t\t0x38420000, 0x38422000, 0x38424000, 0x38426000, 0x38428000, 0x3842A000, 0x3842C000, 0x3842E000, 0x38430000, 0x38432000, 0x38434000, 0x38436000, 0x38438000, 0x3843A000, 0x3843C000, 0x3843E000, \n\t\t\t\t0x38440000, 0x38442000, 0x38444000, 0x38446000, 0x38448000, 0x3844A000, 0x3844C000, 0x3844E000, 0x38450000, 0x38452000, 0x38454000, 0x38456000, 0x38458000, 0x3845A000, 0x3845C000, 0x3845E000, \n\t\t\t\t0x38460000, 0x38462000, 0x38464000, 0x38466000, 0x38468000, 0x3846A000, 0x3846C000, 0x3846E000, 0x38470000, 0x38472000, 0x38474000, 0x38476000, 0x38478000, 0x3847A000, 0x3847C000, 0x3847E000, \n\t\t\t\t0x38480000, 0x38482000, 0x38484000, 0x38486000, 0x38488000, 0x3848A000, 0x3848C000, 0x3848E000, 0x38490000, 0x38492000, 0x38494000, 0x38496000, 0x38498000, 0x3849A000, 0x3849C000, 0x3849E000, \n\t\t\t\t0x384A0000, 0x384A2000, 0x384A4000, 0x384A6000, 0x384A8000, 0x384AA000, 0x384AC000, 0x384AE000, 0x384B0000, 0x384B2000, 0x384B4000, 0x384B6000, 0x384B8000, 0x384BA000, 0x384BC000, 0x384BE000, \n\t\t\t\t0x384C0000, 0x384C2000, 0x384C4000, 0x384C6000, 0x384C8000, 0x384CA000, 0x384CC000, 0x384CE000, 0x384D0000, 0x384D2000, 0x384D4000, 0x384D6000, 0x384D8000, 0x384DA000, 0x384DC000, 0x384DE000, \n\t\t\t\t0x384E0000, 0x384E2000, 0x384E4000, 0x384E6000, 0x384E8000, 0x384EA000, 0x384EC000, 0x384EE000, 0x384F0000, 0x384F2000, 0x384F4000, 0x384F6000, 0x384F8000, 0x384FA000, 0x384FC000, 0x384FE000, \n\t\t\t\t0x38500000, 0x38502000, 0x38504000, 0x38506000, 0x38508000, 0x3850A000, 0x3850C000, 0x3850E000, 0x38510000, 0x38512000, 0x38514000, 0x38516000, 0x38518000, 0x3851A000, 0x3851C000, 0x3851E000, \n\t\t\t\t0x38520000, 0x38522000, 0x38524000, 0x38526000, 0x38528000, 0x3852A000, 0x3852C000, 0x3852E000, 0x38530000, 0x38532000, 0x38534000, 0x38536000, 0x38538000, 0x3853A000, 0x3853C000, 0x3853E000, \n\t\t\t\t0x38540000, 0x38542000, 0x38544000, 0x38546000, 0x38548000, 0x3854A000, 0x3854C000, 0x3854E000, 0x38550000, 0x38552000, 0x38554000, 0x38556000, 0x38558000, 0x3855A000, 0x3855C000, 0x3855E000, \n\t\t\t\t0x38560000, 0x38562000, 0x38564000, 0x38566000, 0x38568000, 0x3856A000, 0x3856C000, 0x3856E000, 0x38570000, 0x38572000, 0x38574000, 0x38576000, 0x38578000, 0x3857A000, 0x3857C000, 0x3857E000, \n\t\t\t\t0x38580000, 0x38582000, 0x38584000, 0x38586000, 0x38588000, 0x3858A000, 0x3858C000, 0x3858E000, 0x38590000, 0x38592000, 0x38594000, 0x38596000, 0x38598000, 0x3859A000, 0x3859C000, 0x3859E000, \n\t\t\t\t0x385A0000, 0x385A2000, 0x385A4000, 0x385A6000, 0x385A8000, 0x385AA000, 0x385AC000, 0x385AE000, 0x385B0000, 0x385B2000, 0x385B4000, 0x385B6000, 0x385B8000, 0x385BA000, 0x385BC000, 0x385BE000, \n\t\t\t\t0x385C0000, 0x385C2000, 0x385C4000, 0x385C6000, 0x385C8000, 0x385CA000, 0x385CC000, 0x385CE000, 0x385D0000, 0x385D2000, 0x385D4000, 0x385D6000, 0x385D8000, 0x385DA000, 0x385DC000, 0x385DE000, \n\t\t\t\t0x385E0000, 0x385E2000, 0x385E4000, 0x385E6000, 0x385E8000, 0x385EA000, 0x385EC000, 0x385EE000, 0x385F0000, 0x385F2000, 0x385F4000, 0x385F6000, 0x385F8000, 0x385FA000, 0x385FC000, 0x385FE000, \n\t\t\t\t0x38600000, 0x38602000, 0x38604000, 0x38606000, 0x38608000, 0x3860A000, 0x3860C000, 0x3860E000, 0x38610000, 0x38612000, 0x38614000, 0x38616000, 0x38618000, 0x3861A000, 0x3861C000, 0x3861E000, \n\t\t\t\t0x38620000, 0x38622000, 0x38624000, 0x38626000, 0x38628000, 0x3862A000, 0x3862C000, 0x3862E000, 0x38630000, 0x38632000, 0x38634000, 0x38636000, 0x38638000, 0x3863A000, 0x3863C000, 0x3863E000, \n\t\t\t\t0x38640000, 0x38642000, 0x38644000, 0x38646000, 0x38648000, 0x3864A000, 0x3864C000, 0x3864E000, 0x38650000, 0x38652000, 0x38654000, 0x38656000, 0x38658000, 0x3865A000, 0x3865C000, 0x3865E000, \n\t\t\t\t0x38660000, 0x38662000, 0x38664000, 0x38666000, 0x38668000, 0x3866A000, 0x3866C000, 0x3866E000, 0x38670000, 0x38672000, 0x38674000, 0x38676000, 0x38678000, 0x3867A000, 0x3867C000, 0x3867E000, \n\t\t\t\t0x38680000, 0x38682000, 0x38684000, 0x38686000, 0x38688000, 0x3868A000, 0x3868C000, 0x3868E000, 0x38690000, 0x38692000, 0x38694000, 0x38696000, 0x38698000, 0x3869A000, 0x3869C000, 0x3869E000, \n\t\t\t\t0x386A0000, 0x386A2000, 0x386A4000, 0x386A6000, 0x386A8000, 0x386AA000, 0x386AC000, 0x386AE000, 0x386B0000, 0x386B2000, 0x386B4000, 0x386B6000, 0x386B8000, 0x386BA000, 0x386BC000, 0x386BE000, \n\t\t\t\t0x386C0000, 0x386C2000, 0x386C4000, 0x386C6000, 0x386C8000, 0x386CA000, 0x386CC000, 0x386CE000, 0x386D0000, 0x386D2000, 0x386D4000, 0x386D6000, 0x386D8000, 0x386DA000, 0x386DC000, 0x386DE000, \n\t\t\t\t0x386E0000, 0x386E2000, 0x386E4000, 0x386E6000, 0x386E8000, 0x386EA000, 0x386EC000, 0x386EE000, 0x386F0000, 0x386F2000, 0x386F4000, 0x386F6000, 0x386F8000, 0x386FA000, 0x386FC000, 0x386FE000, \n\t\t\t\t0x38700000, 0x38702000, 0x38704000, 0x38706000, 0x38708000, 0x3870A000, 0x3870C000, 0x3870E000, 0x38710000, 0x38712000, 0x38714000, 0x38716000, 0x38718000, 0x3871A000, 0x3871C000, 0x3871E000, \n\t\t\t\t0x38720000, 0x38722000, 0x38724000, 0x38726000, 0x38728000, 0x3872A000, 0x3872C000, 0x3872E000, 0x38730000, 0x38732000, 0x38734000, 0x38736000, 0x38738000, 0x3873A000, 0x3873C000, 0x3873E000, \n\t\t\t\t0x38740000, 0x38742000, 0x38744000, 0x38746000, 0x38748000, 0x3874A000, 0x3874C000, 0x3874E000, 0x38750000, 0x38752000, 0x38754000, 0x38756000, 0x38758000, 0x3875A000, 0x3875C000, 0x3875E000, \n\t\t\t\t0x38760000, 0x38762000, 0x38764000, 0x38766000, 0x38768000, 0x3876A000, 0x3876C000, 0x3876E000, 0x38770000, 0x38772000, 0x38774000, 0x38776000, 0x38778000, 0x3877A000, 0x3877C000, 0x3877E000, \n\t\t\t\t0x38780000, 0x38782000, 0x38784000, 0x38786000, 0x38788000, 0x3878A000, 0x3878C000, 0x3878E000, 0x38790000, 0x38792000, 0x38794000, 0x38796000, 0x38798000, 0x3879A000, 0x3879C000, 0x3879E000, \n\t\t\t\t0x387A0000, 0x387A2000, 0x387A4000, 0x387A6000, 0x387A8000, 0x387AA000, 0x387AC000, 0x387AE000, 0x387B0000, 0x387B2000, 0x387B4000, 0x387B6000, 0x387B8000, 0x387BA000, 0x387BC000, 0x387BE000, \n\t\t\t\t0x387C0000, 0x387C2000, 0x387C4000, 0x387C6000, 0x387C8000, 0x387CA000, 0x387CC000, 0x387CE000, 0x387D0000, 0x387D2000, 0x387D4000, 0x387D6000, 0x387D8000, 0x387DA000, 0x387DC000, 0x387DE000, \n\t\t\t\t0x387E0000, 0x387E2000, 0x387E4000, 0x387E6000, 0x387E8000, 0x387EA000, 0x387EC000, 0x387EE000, 0x387F0000, 0x387F2000, 0x387F4000, 0x387F6000, 0x387F8000, 0x387FA000, 0x387FC000, 0x387FE000 };\n\t\t\tstatic const uint32 exponent_table[64] = { \n\t\t\t\t0x00000000, 0x00800000, 0x01000000, 0x01800000, 0x02000000, 0x02800000, 0x03000000, 0x03800000, 0x04000000, 0x04800000, 0x05000000, 0x05800000, 0x06000000, 0x06800000, 0x07000000, 0x07800000, \n\t\t\t\t0x08000000, 0x08800000, 0x09000000, 0x09800000, 0x0A000000, 0x0A800000, 0x0B000000, 0x0B800000, 0x0C000000, 0x0C800000, 0x0D000000, 0x0D800000, 0x0E000000, 0x0E800000, 0x0F000000, 0x47800000, \n\t\t\t\t0x80000000, 0x80800000, 0x81000000, 0x81800000, 0x82000000, 0x82800000, 0x83000000, 0x83800000, 0x84000000, 0x84800000, 0x85000000, 0x85800000, 0x86000000, 0x86800000, 0x87000000, 0x87800000, \n\t\t\t\t0x88000000, 0x88800000, 0x89000000, 0x89800000, 0x8A000000, 0x8A800000, 0x8B000000, 0x8B800000, 0x8C000000, 0x8C800000, 0x8D000000, 0x8D800000, 0x8E000000, 0x8E800000, 0x8F000000, 0xC7800000 };\n\t\t\tstatic const unsigned short offset_table[64] = { \n\t\t\t\t   0, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, \n\t\t\t\t   0, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024 };\n\t\t\tuint32 bits = mantissa_table[offset_table[value>>10]+(value&0x3FF)] + exponent_table[value>>10];\n//\t\t\tuint32 bits = mantissa_table[(((value&0x7C00)!=0)<<10)+(value&0x3FF)] + exponent_table[value>>10];\n//\t\t\treturn *reinterpret_cast<float*>(&bits);\t\t\t//violating strict aliasing!\n\t\t\tfloat out;\n\t\t\tstd::memcpy(&out, &bits, sizeof(float));\n\t\t\treturn out;\n\t\t}\n\n\t\t/// Convert half-precision to non-IEEE single-precision.\n\t\t/// \\param value binary representation of half-precision value\n\t\t/// \\return single-precision value\n\t\tinline float half2float_impl(uint16 value, false_type)\n\t\t{\n\t\t\tfloat out;\n\t\t\tint abs = value & 0x7FFF;\n\t\t\tif(abs > 0x7C00)\n\t\t\t\tout = std::numeric_limits<float>::has_quiet_NaN ? std::numeric_limits<float>::quiet_NaN() : 0.0f;\n\t\t\telse if(abs == 0x7C00)\n\t\t\t\tout = std::numeric_limits<float>::has_infinity ? std::numeric_limits<float>::infinity() : std::numeric_limits<float>::max();\n\t\t\telse if(abs > 0x3FF)\n\t\t\t\tout = std::ldexp(static_cast<float>((value&0x3FF)|0x400), (abs>>10)-25);\n\t\t\telse\n\t\t\t\tout = std::ldexp(static_cast<float>(abs), -24);\n\t\t\treturn (value&0x8000) ? -out : out;\n\t\t}\n\n\t\t/// Convert half-precision to single-precision.\n\t\t/// \\param value binary representation of half-precision value\n\t\t/// \\return single-precision value\n\t\tinline float half2float(uint16 value)\n\t\t{\n\t\t\treturn half2float_impl(value, bool_type<std::numeric_limits<float>::is_iec559&&sizeof(uint32)==sizeof(float)>());\n\t\t}\n\n\t\t/// Convert half-precision floating point to integer.\n\t\t/// \\tparam R rounding mode to use, `std::round_indeterminate` for fastest rounding\n\t\t/// \\tparam E `true` for round to even, `false` for round away from zero\n\t\t/// \\tparam T type to convert to (buitlin integer type with at least 16 bits precision, excluding any implicit sign bits)\n\t\t/// \\param value binary representation of half-precision value\n\t\t/// \\return integral value\n\t\ttemplate<std::float_round_style R,bool E,typename T> T half2int_impl(uint16 value)\n\t\t{\n\t\t\tunsigned int e = value & 0x7FFF;\n\t\t\tif(e >= 0x7C00)\n\t\t\t\treturn (value&0x8000) ? std::numeric_limits<T>::min() : std::numeric_limits<T>::max();\n\t\t\tif(e < 0x3800)\n\t\t\t{\n\t\t\t\tif(R == std::round_toward_infinity)\n\t\t\t\t\treturn T(~(value>>15)&(e!=0));\n\t\t\t\telse if(R == std::round_toward_neg_infinity)\n\t\t\t\t\treturn -T(value>0x8000);\n\t\t\t\treturn T();\n\t\t\t}\n\t\t\tint17 m = (value&0x3FF) | 0x400;\n\t\t\te >>= 10;\n\t\t\tif(e < 25)\n\t\t\t{\n\t\t\t\tif(R == std::round_indeterminate || R == std::round_toward_zero)\n\t\t\t\t\tm >>= 25 - e;\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif(R == std::round_to_nearest)\n\t\t\t\t\t\tm += (1<<(24-e)) - (~(m>>(25-e))&E);\n\t\t\t\t\telse if(R == std::round_toward_infinity)\n\t\t\t\t\t\tm += ((value>>15)-1) & ((1<<(25-e))-1U);\n\t\t\t\t\telse if(R == std::round_toward_neg_infinity)\n\t\t\t\t\t\tm += -(value>>15) & ((1<<(25-e))-1U);\n\t\t\t\t\tm >>= 25 - e;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t\tm <<= e - 25;\n//\t\t\tif(std::numeric_limits<T>::digits < 16)\n//\t\t\t\treturn std::min(std::max(m, static_cast<int17>(std::numeric_limits<T>::min())), static_cast<int17>(std::numeric_limits<T>::max()));\n\t\t\treturn static_cast<T>((value&0x8000) ? -m : m);\n\t\t}\n\n\t\t/// Convert half-precision floating point to integer.\n\t\t/// \\tparam R rounding mode to use, `std::round_indeterminate` for fastest rounding\n\t\t/// \\tparam T type to convert to (buitlin integer type with at least 16 bits precision, excluding any implicit sign bits)\n\t\t/// \\param value binary representation of half-precision value\n\t\t/// \\return integral value\n\t\ttemplate<std::float_round_style R,typename T> T half2int(uint16 value) { return half2int_impl<R,HALF_ROUND_TIES_TO_EVEN,T>(value); }\n\n\t\t/// Convert half-precision floating point to integer using round-to-nearest-away-from-zero.\n\t\t/// \\tparam T type to convert to (buitlin integer type with at least 16 bits precision, excluding any implicit sign bits)\n\t\t/// \\param value binary representation of half-precision value\n\t\t/// \\return integral value\n\t\ttemplate<typename T> T half2int_up(uint16 value) { return half2int_impl<std::round_to_nearest,0,T>(value); }\n\n\t\t/// Round half-precision number to nearest integer value.\n\t\t/// \\tparam R rounding mode to use, `std::round_indeterminate` for fastest rounding\n\t\t/// \\tparam E `true` for round to even, `false` for round away from zero\n\t\t/// \\param value binary representation of half-precision value\n\t\t/// \\return half-precision bits for nearest integral value\n\t\ttemplate<std::float_round_style R,bool E> uint16 round_half_impl(uint16 value)\n\t\t{\n\t\t\tunsigned int e = value & 0x7FFF;\n\t\t\tuint16 result = value;\n\t\t\tif(e < 0x3C00)\n\t\t\t{\n\t\t\t\tresult &= 0x8000;\n\t\t\t\tif(R == std::round_to_nearest)\n\t\t\t\t\tresult |= 0x3C00U & -(e>=(0x3800+E));\n\t\t\t\telse if(R == std::round_toward_infinity)\n\t\t\t\t\tresult |= 0x3C00U & -(~(value>>15)&(e!=0));\n\t\t\t\telse if(R == std::round_toward_neg_infinity)\n\t\t\t\t\tresult |= 0x3C00U & -(value>0x8000);\n\t\t\t}\n\t\t\telse if(e < 0x6400)\n\t\t\t{\n\t\t\t\te = 25 - (e>>10);\n\t\t\t\tunsigned int mask = (1<<e) - 1;\n\t\t\t\tif(R == std::round_to_nearest)\n\t\t\t\t\tresult += (1<<(e-1)) - (~(result>>e)&E);\n\t\t\t\telse if(R == std::round_toward_infinity)\n\t\t\t\t\tresult += mask & ((value>>15)-1);\n\t\t\t\telse if(R == std::round_toward_neg_infinity)\n\t\t\t\t\tresult += mask & -(value>>15);\n\t\t\t\tresult &= ~mask;\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\n\t\t/// Round half-precision number to nearest integer value.\n\t\t/// \\tparam R rounding mode to use, `std::round_indeterminate` for fastest rounding\n\t\t/// \\param value binary representation of half-precision value\n\t\t/// \\return half-precision bits for nearest integral value\n\t\ttemplate<std::float_round_style R> uint16 round_half(uint16 value) { return round_half_impl<R,HALF_ROUND_TIES_TO_EVEN>(value); }\n\n\t\t/// Round half-precision number to nearest integer value using round-to-nearest-away-from-zero.\n\t\t/// \\param value binary representation of half-precision value\n\t\t/// \\return half-precision bits for nearest integral value\n\t\tinline uint16 round_half_up(uint16 value) { return round_half_impl<std::round_to_nearest,0>(value); }\n\t\t/// \\}\n\n\t\tstruct functions;\n\t\ttemplate<typename> struct unary_specialized;\n\t\ttemplate<typename,typename> struct binary_specialized;\n\t\ttemplate<typename,typename,std::float_round_style> struct half_caster;\n\t}\n\n\t/// Half-precision floating point type.\n\t/// This class implements an IEEE-conformant half-precision floating point type with the usual arithmetic operators and \n\t/// conversions. It is implicitly convertible to single-precision floating point, which makes artihmetic expressions and \n\t/// functions with mixed-type operands to be of the most precise operand type. Additionally all arithmetic operations \n\t/// (and many mathematical functions) are carried out in single-precision internally. All conversions from single- to \n\t/// half-precision are done using truncation (round towards zero), but temporary results inside chained arithmetic \n\t/// expressions are kept in single-precision as long as possible (while of course still maintaining a strong half-precision type).\n\t///\n\t/// According to the C++98/03 definition, the half type is not a POD type. But according to C++11's less strict and \n\t/// extended definitions it is both a standard layout type and a trivially copyable type (even if not a POD type), which \n\t/// means it can be standard-conformantly copied using raw binary copies. But in this context some more words about the \n\t/// actual size of the type. Although the half is representing an IEEE 16-bit type, it does not neccessarily have to be of \n\t/// exactly 16-bits size. But on any reasonable implementation the actual binary representation of this type will most \n\t/// probably not ivolve any additional \"magic\" or padding beyond the simple binary representation of the underlying 16-bit \n\t/// IEEE number, even if not strictly guaranteed by the standard. But even then it only has an actual size of 16 bits if \n\t/// your C++ implementation supports an unsigned integer type of exactly 16 bits width. But this should be the case on \n\t/// nearly any reasonable platform.\n\t///\n\t/// So if your C++ implementation is not totally exotic or imposes special alignment requirements, it is a reasonable \n\t/// assumption that the data of a half is just comprised of the 2 bytes of the underlying IEEE representation.\n\tclass half\n\t{\n\t\tfriend struct detail::functions;\n\t\tfriend struct detail::unary_specialized<half>;\n\t\tfriend struct detail::binary_specialized<half,half>;\n\t\ttemplate<typename,typename,std::float_round_style> friend struct detail::half_caster;\n\t\tfriend class std::numeric_limits<half>;\n\t#if HALF_ENABLE_CPP11_HASH\n\t\tfriend struct std::hash<half>;\n\t#endif\n\n\tpublic:\n\t\t/// Default constructor.\n\t\t/// This initializes the half to 0. Although this does not match the builtin types' default-initialization semantics \n\t\t/// and may be less efficient than no initialization, it is needed to provide proper value-initialization semantics.\n\t\tHALF_CONSTEXPR half() : data_() {}\n\n\t\t/// Copy constructor.\n\t\t/// \\tparam T type of concrete half expression\n\t\t/// \\param rhs half expression to copy from\n\t\thalf(detail::expr rhs) : data_(detail::float2half<round_style>(rhs)) {}\n\n\t\t/// Conversion constructor.\n\t\t/// \\param rhs float to convert\n\t\texplicit half(float rhs) : data_(detail::float2half<round_style>(rhs)) {}\n\t\n\t\t/// Conversion to single-precision.\n\t\t/// \\return single precision value representing expression value\n\t\toperator float() const { return detail::half2float(data_); }\n\n\t\t/// Assignment operator.\n\t\t/// \\tparam T type of concrete half expression\n\t\t/// \\param rhs half expression to copy from\n\t\t/// \\return reference to this half\n\t\thalf& operator=(detail::expr rhs) { return *this = static_cast<float>(rhs); }\n\n\t\t/// Arithmetic assignment.\n\t\t/// \\tparam T type of concrete half expression\n\t\t/// \\param rhs half expression to add\n\t\t/// \\return reference to this half\n\t\ttemplate<typename T> typename detail::enable<half&,T>::type operator+=(T rhs) { return *this += static_cast<float>(rhs); }\n\n\t\t/// Arithmetic assignment.\n\t\t/// \\tparam T type of concrete half expression\n\t\t/// \\param rhs half expression to subtract\n\t\t/// \\return reference to this half\n\t\ttemplate<typename T> typename detail::enable<half&,T>::type operator-=(T rhs) { return *this -= static_cast<float>(rhs); }\n\n\t\t/// Arithmetic assignment.\n\t\t/// \\tparam T type of concrete half expression\n\t\t/// \\param rhs half expression to multiply with\n\t\t/// \\return reference to this half\n\t\ttemplate<typename T> typename detail::enable<half&,T>::type operator*=(T rhs) { return *this *= static_cast<float>(rhs); }\n\n\t\t/// Arithmetic assignment.\n\t\t/// \\tparam T type of concrete half expression\n\t\t/// \\param rhs half expression to divide by\n\t\t/// \\return reference to this half\n\t\ttemplate<typename T> typename detail::enable<half&,T>::type operator/=(T rhs) { return *this /= static_cast<float>(rhs); }\n\n\t\t/// Assignment operator.\n\t\t/// \\param rhs single-precision value to copy from\n\t\t/// \\return reference to this half\n\t\thalf& operator=(float rhs) { data_ = detail::float2half<round_style>(rhs); return *this; }\n\n\t\t/// Arithmetic assignment.\n\t\t/// \\param rhs single-precision value to add\n\t\t/// \\return reference to this half\n\t\thalf& operator+=(float rhs) { data_ = detail::float2half<round_style>(detail::half2float(data_)+rhs); return *this; }\n\n\t\t/// Arithmetic assignment.\n\t\t/// \\param rhs single-precision value to subtract\n\t\t/// \\return reference to this half\n\t\thalf& operator-=(float rhs) { data_ = detail::float2half<round_style>(detail::half2float(data_)-rhs); return *this; }\n\n\t\t/// Arithmetic assignment.\n\t\t/// \\param rhs single-precision value to multiply with\n\t\t/// \\return reference to this half\n\t\thalf& operator*=(float rhs) { data_ = detail::float2half<round_style>(detail::half2float(data_)*rhs); return *this; }\n\n\t\t/// Arithmetic assignment.\n\t\t/// \\param rhs single-precision value to divide by\n\t\t/// \\return reference to this half\n\t\thalf& operator/=(float rhs) { data_ = detail::float2half<round_style>(detail::half2float(data_)/rhs); return *this; }\n\n\t\t/// Prefix increment.\n\t\t/// \\return incremented half value\n\t\thalf& operator++() { return *this += 1.0f; }\n\n\t\t/// Prefix decrement.\n\t\t/// \\return decremented half value\n\t\thalf& operator--() { return *this -= 1.0f; }\n\n\t\t/// Postfix increment.\n\t\t/// \\return non-incremented half value\n\t\thalf operator++(int) { half out(*this); ++*this; return out; }\n\n\t\t/// Postfix decrement.\n\t\t/// \\return non-decremented half value\n\t\thalf operator--(int) { half out(*this); --*this; return out; }\n\t\n\tprivate:\n\t\t/// Rounding mode to use (always `std::round_indeterminate`)\n\t\tstatic const std::float_round_style round_style = (std::float_round_style)(HALF_ROUND_STYLE);\n\n\t\t/// Constructor.\n\t\t/// \\param bits binary representation to set half to\n\t\tHALF_CONSTEXPR half(detail::binary_t, detail::uint16 bits) : data_(bits) {}\n\n\t\t/// Internal binary representation\n\t\tdetail::uint16 data_;\n\t};\n\n#if HALF_ENABLE_CPP11_USER_LITERALS\n\t/// Library-defined half-precision literals.\n\t/// Import this namespace to enable half-precision floating point literals:\n\t/// ~~~~{.cpp}\n\t/// using namespace half_float::literal;\n\t/// half_float::half = 4.2_h;\n\t/// ~~~~\n\tnamespace literal\n\t{\n\t\t/// Half literal.\n\t\t/// While this returns an actual half-precision value, half literals can unfortunately not be constant expressions due \n\t\t/// to rather involved single-to-half conversion.\n\t\t/// \\param value literal value\n\t\t/// \\return half with given value (if representable)\n\t\tinline half operator \"\" _h(long double value) { return half(static_cast<float>(value)); }\n\t}\n#endif\n\n\tnamespace detail\n\t{\n\t\t/// Wrapper implementing unspecialized half-precision functions.\n\t\tstruct functions\n\t\t{\n\t\t\t/// Addition implementation.\n\t\t\t/// \\param x first operand\n\t\t\t/// \\param y second operand\n\t\t\t/// \\return Half-precision sum stored in single-precision\n\t\t\tstatic expr plus(float x, float y) { return expr(x+y); }\n\n\t\t\t/// Subtraction implementation.\n\t\t\t/// \\param x first operand\n\t\t\t/// \\param y second operand\n\t\t\t/// \\return Half-precision difference stored in single-precision\n\t\t\tstatic expr minus(float x, float y) { return expr(x-y); }\n\n\t\t\t/// Multiplication implementation.\n\t\t\t/// \\param x first operand\n\t\t\t/// \\param y second operand\n\t\t\t/// \\return Half-precision product stored in single-precision\n\t\t\tstatic expr multiplies(float x, float y) { return expr(x*y); }\n\n\t\t\t/// Division implementation.\n\t\t\t/// \\param x first operand\n\t\t\t/// \\param y second operand\n\t\t\t/// \\return Half-precision quotient stored in single-precision\n\t\t\tstatic expr divides(float x, float y) { return expr(x/y); }\n\n\t\t\t/// Output implementation.\n\t\t\t/// \\param out stream to write to\n\t\t\t/// \\param arg value to write\n\t\t\t/// \\return reference to stream\n\t\t\ttemplate<typename charT,typename traits> static std::basic_ostream<charT,traits>& write(std::basic_ostream<charT,traits> &out, float arg) { return out << arg; }\n\n\t\t\t/// Input implementation.\n\t\t\t/// \\param in stream to read from\n\t\t\t/// \\param arg half to read into\n\t\t\t/// \\return reference to stream\n\t\t\ttemplate<typename charT,typename traits> static std::basic_istream<charT,traits>& read(std::basic_istream<charT,traits> &in, half &arg)\n\t\t\t{\n\t\t\t\tfloat f;\n\t\t\t\tif(in >> f)\n\t\t\t\t\targ = f;\n\t\t\t\treturn in;\n\t\t\t}\n\n\t\t\t/// Modulo implementation.\n\t\t\t/// \\param x first operand\n\t\t\t/// \\param y second operand\n\t\t\t/// \\return Half-precision division remainder stored in single-precision\n\t\t\tstatic expr fmod(float x, float y) { return expr(std::fmod(x, y)); }\n\n\t\t\t/// Remainder implementation.\n\t\t\t/// \\param x first operand\n\t\t\t/// \\param y second operand\n\t\t\t/// \\return Half-precision division remainder stored in single-precision\n\t\t\tstatic expr remainder(float x, float y)\n\t\t\t{\n\t\t\t#if HALF_ENABLE_CPP11_CMATH\n\t\t\t\treturn expr(std::remainder(x, y));\n\t\t\t#else\n\t\t\t\tif(builtin_isnan(x) || builtin_isnan(y))\n\t\t\t\t\treturn expr(std::numeric_limits<float>::quiet_NaN());\n\t\t\t\tfloat ax = std::fabs(x), ay = std::fabs(y);\n\t\t\t\tif(ax >= 65536.0f || ay < std::ldexp(1.0f, -24))\n\t\t\t\t\treturn expr(std::numeric_limits<float>::quiet_NaN());\n\t\t\t\tif(ay >= 65536.0f)\n\t\t\t\t\treturn expr(x);\n\t\t\t\tif(ax == ay)\n\t\t\t\t\treturn expr(builtin_signbit(x) ? -0.0f : 0.0f);\n\t\t\t\tax = std::fmod(ax, ay+ay);\n\t\t\t\tfloat y2 = 0.5f * ay;\n\t\t\t\tif(ax > y2)\n\t\t\t\t{\n\t\t\t\t\tax -= ay;\n\t\t\t\t\tif(ax >= y2)\n\t\t\t\t\t\tax -= ay;\n\t\t\t\t}\n\t\t\t\treturn expr(builtin_signbit(x) ? -ax : ax);\n\t\t\t#endif\n\t\t\t}\n\n\t\t\t/// Remainder implementation.\n\t\t\t/// \\param x first operand\n\t\t\t/// \\param y second operand\n\t\t\t/// \\param quo address to store quotient bits at\n\t\t\t/// \\return Half-precision division remainder stored in single-precision\n\t\t\tstatic expr remquo(float x, float y, int *quo)\n\t\t\t{\n\t\t\t#if HALF_ENABLE_CPP11_CMATH\n\t\t\t\treturn expr(std::remquo(x, y, quo));\n\t\t\t#else\n\t\t\t\tif(builtin_isnan(x) || builtin_isnan(y))\n\t\t\t\t\treturn expr(std::numeric_limits<float>::quiet_NaN());\n\t\t\t\tbool sign = builtin_signbit(x), qsign = static_cast<bool>(sign^builtin_signbit(y));\n\t\t\t\tfloat ax = std::fabs(x), ay = std::fabs(y);\n\t\t\t\tif(ax >= 65536.0f || ay < std::ldexp(1.0f, -24))\n\t\t\t\t\treturn expr(std::numeric_limits<float>::quiet_NaN());\n\t\t\t\tif(ay >= 65536.0f)\n\t\t\t\t\treturn expr(x);\n\t\t\t\tif(ax == ay)\n\t\t\t\t\treturn *quo = qsign ? -1 : 1, expr(sign ? -0.0f : 0.0f);\n\t\t\t\tax = std::fmod(ax, 8.0f*ay);\n\t\t\t\tint cquo = 0;\n\t\t\t\tif(ax >= 4.0f * ay)\n\t\t\t\t{\n\t\t\t\t\tax -= 4.0f * ay;\n\t\t\t\t\tcquo += 4;\n\t\t\t\t}\n\t\t\t\tif(ax >= 2.0f * ay)\n\t\t\t\t{\n\t\t\t\t\tax -= 2.0f * ay;\n\t\t\t\t\tcquo += 2;\n\t\t\t\t}\n\t\t\t\tfloat y2 = 0.5f * ay;\n\t\t\t\tif(ax > y2)\n\t\t\t\t{\n\t\t\t\t\tax -= ay;\n\t\t\t\t\t++cquo;\n\t\t\t\t\tif(ax >= y2)\n\t\t\t\t\t{\n\t\t\t\t\t\tax -= ay;\n\t\t\t\t\t\t++cquo;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn *quo = qsign ? -cquo : cquo, expr(sign ? -ax : ax);\n\t\t\t#endif\n\t\t\t}\n\n\t\t\t/// Positive difference implementation.\n\t\t\t/// \\param x first operand\n\t\t\t/// \\param y second operand\n\t\t\t/// \\return Positive difference stored in single-precision\n\t\t\tstatic expr fdim(float x, float y)\n\t\t\t{\n\t\t\t#if HALF_ENABLE_CPP11_CMATH\n\t\t\t\treturn expr(std::fdim(x, y));\n\t\t\t#else\n\t\t\t\treturn expr((x<=y) ? 0.0f : (x-y));\n\t\t\t#endif\n\t\t\t}\n\n\t\t\t/// Fused multiply-add implementation.\n\t\t\t/// \\param x first operand\n\t\t\t/// \\param y second operand\n\t\t\t/// \\param z third operand\n\t\t\t/// \\return \\a x * \\a y + \\a z stored in single-precision\n\t\t\tstatic expr fma(float x, float y, float z)\n\t\t\t{\n\t\t\t#if HALF_ENABLE_CPP11_CMATH && defined(FP_FAST_FMAF)\n\t\t\t\treturn expr(std::fma(x, y, z));\n\t\t\t#else\n\t\t\t\treturn expr(x*y+z);\n\t\t\t#endif\n\t\t\t}\n\n\t\t\t/// Get NaN.\n\t\t\t/// \\return Half-precision quiet NaN\n\t\t\tstatic half nanh(const char*) { return half(binary, 0x7FFF); }\n\n\t\t\t/// Exponential implementation.\n\t\t\t/// \\param arg function argument\n\t\t\t/// \\return function value stored in single-preicision\n\t\t\tstatic expr exp(float arg) { return expr(std::exp(arg)); }\n\n\t\t\t/// Exponential implementation.\n\t\t\t/// \\param arg function argument\n\t\t\t/// \\return function value stored in single-preicision\n\t\t\tstatic expr expm1(float arg)\n\t\t\t{\n\t\t\t#if HALF_ENABLE_CPP11_CMATH\n\t\t\t\treturn expr(std::expm1(arg));\n\t\t\t#else\n\t\t\t\treturn expr(static_cast<float>(std::exp(static_cast<double>(arg))-1.0));\n\t\t\t#endif\n\t\t\t}\n\n\t\t\t/// Binary exponential implementation.\n\t\t\t/// \\param arg function argument\n\t\t\t/// \\return function value stored in single-preicision\n\t\t\tstatic expr exp2(float arg)\n\t\t\t{\n\t\t\t#if HALF_ENABLE_CPP11_CMATH\n\t\t\t\treturn expr(std::exp2(arg));\n\t\t\t#else\n\t\t\t\treturn expr(static_cast<float>(std::exp(arg*0.69314718055994530941723212145818)));\n\t\t\t#endif\n\t\t\t}\n\n\t\t\t/// Logarithm implementation.\n\t\t\t/// \\param arg function argument\n\t\t\t/// \\return function value stored in single-preicision\n\t\t\tstatic expr log(float arg) { return expr(std::log(arg)); }\n\n\t\t\t/// Common logarithm implementation.\n\t\t\t/// \\param arg function argument\n\t\t\t/// \\return function value stored in single-preicision\n\t\t\tstatic expr log10(float arg) { return expr(std::log10(arg)); }\n\n\t\t\t/// Logarithm implementation.\n\t\t\t/// \\param arg function argument\n\t\t\t/// \\return function value stored in single-preicision\n\t\t\tstatic expr log1p(float arg)\n\t\t\t{\n\t\t\t#if HALF_ENABLE_CPP11_CMATH\n\t\t\t\treturn expr(std::log1p(arg));\n\t\t\t#else\n\t\t\t\treturn expr(static_cast<float>(std::log(1.0+arg)));\n\t\t\t#endif\n\t\t\t}\n\n\t\t\t/// Binary logarithm implementation.\n\t\t\t/// \\param arg function argument\n\t\t\t/// \\return function value stored in single-preicision\n\t\t\tstatic expr log2(float arg)\n\t\t\t{\n\t\t\t#if HALF_ENABLE_CPP11_CMATH\n\t\t\t\treturn expr(std::log2(arg));\n\t\t\t#else\n\t\t\t\treturn expr(static_cast<float>(std::log(static_cast<double>(arg))*1.4426950408889634073599246810019));\n\t\t\t#endif\n\t\t\t}\n\n\t\t\t/// Square root implementation.\n\t\t\t/// \\param arg function argument\n\t\t\t/// \\return function value stored in single-preicision\n\t\t\tstatic expr sqrt(float arg) { return expr(std::sqrt(arg)); }\n\n\t\t\t/// Cubic root implementation.\n\t\t\t/// \\param arg function argument\n\t\t\t/// \\return function value stored in single-preicision\n\t\t\tstatic expr cbrt(float arg)\n\t\t\t{\n\t\t\t#if HALF_ENABLE_CPP11_CMATH\n\t\t\t\treturn expr(std::cbrt(arg));\n\t\t\t#else\n\t\t\t\tif(builtin_isnan(arg) || builtin_isinf(arg))\n\t\t\t\t\treturn expr(arg);\n\t\t\t\treturn expr(builtin_signbit(arg) ? -static_cast<float>(std::pow(std::fabs(static_cast<double>(arg)), 1.0/3.0)) : \n\t\t\t\t\tstatic_cast<float>(std::pow(static_cast<double>(arg), 1.0/3.0)));\n\t\t\t#endif\n\t\t\t}\n\n\t\t\t/// Hypotenuse implementation.\n\t\t\t/// \\param x first argument\n\t\t\t/// \\param y second argument\n\t\t\t/// \\return function value stored in single-preicision\n\t\t\tstatic expr hypot(float x, float y)\n\t\t\t{\n\t\t\t#if HALF_ENABLE_CPP11_CMATH\n\t\t\t\treturn expr(std::hypot(x, y));\n\t\t\t#else\n\t\t\t\treturn expr((builtin_isinf(x) || builtin_isinf(y)) ? std::numeric_limits<float>::infinity() : \n\t\t\t\t\tstatic_cast<float>(std::sqrt(static_cast<double>(x)*x+static_cast<double>(y)*y)));\n\t\t\t#endif\n\t\t\t}\n\n\t\t\t/// Power implementation.\n\t\t\t/// \\param base value to exponentiate\n\t\t\t/// \\param exp power to expontiate to\n\t\t\t/// \\return function value stored in single-preicision\n\t\t\tstatic expr pow(float base, float exp) { return expr(std::pow(base, exp)); }\n\n\t\t\t/// Sine implementation.\n\t\t\t/// \\param arg function argument\n\t\t\t/// \\return function value stored in single-preicision\n\t\t\tstatic expr sin(float arg) { return expr(std::sin(arg)); }\n\n\t\t\t/// Cosine implementation.\n\t\t\t/// \\param arg function argument\n\t\t\t/// \\return function value stored in single-preicision\n\t\t\tstatic expr cos(float arg) { return expr(std::cos(arg)); }\n\n\t\t\t/// Tan implementation.\n\t\t\t/// \\param arg function argument\n\t\t\t/// \\return function value stored in single-preicision\n\t\t\tstatic expr tan(float arg) { return expr(std::tan(arg)); }\n\n\t\t\t/// Arc sine implementation.\n\t\t\t/// \\param arg function argument\n\t\t\t/// \\return function value stored in single-preicision\n\t\t\tstatic expr asin(float arg) { return expr(std::asin(arg)); }\n\n\t\t\t/// Arc cosine implementation.\n\t\t\t/// \\param arg function argument\n\t\t\t/// \\return function value stored in single-preicision\n\t\t\tstatic expr acos(float arg) { return expr(std::acos(arg)); }\n\n\t\t\t/// Arc tangent implementation.\n\t\t\t/// \\param arg function argument\n\t\t\t/// \\return function value stored in single-preicision\n\t\t\tstatic expr atan(float arg) { return expr(std::atan(arg)); }\n\n\t\t\t/// Arc tangent implementation.\n\t\t\t/// \\param x first argument\n\t\t\t/// \\param y second argument\n\t\t\t/// \\return function value stored in single-preicision\n\t\t\tstatic expr atan2(float x, float y) { return expr(std::atan2(x, y)); }\n\n\t\t\t/// Hyperbolic sine implementation.\n\t\t\t/// \\param arg function argument\n\t\t\t/// \\return function value stored in single-preicision\n\t\t\tstatic expr sinh(float arg) { return expr(std::sinh(arg)); }\n\n\t\t\t/// Hyperbolic cosine implementation.\n\t\t\t/// \\param arg function argument\n\t\t\t/// \\return function value stored in single-preicision\n\t\t\tstatic expr cosh(float arg) { return expr(std::cosh(arg)); }\n\n\t\t\t/// Hyperbolic tangent implementation.\n\t\t\t/// \\param arg function argument\n\t\t\t/// \\return function value stored in single-preicision\n\t\t\tstatic expr tanh(float arg) { return expr(std::tanh(arg)); }\n\n\t\t\t/// Hyperbolic area sine implementation.\n\t\t\t/// \\param arg function argument\n\t\t\t/// \\return function value stored in single-preicision\n\t\t\tstatic expr asinh(float arg)\n\t\t\t{\n\t\t\t#if HALF_ENABLE_CPP11_CMATH\n\t\t\t\treturn expr(std::asinh(arg));\n\t\t\t#else\n\t\t\t\treturn expr((arg==-std::numeric_limits<float>::infinity()) ? arg : static_cast<float>(std::log(arg+std::sqrt(arg*arg+1.0))));\n\t\t\t#endif\n\t\t\t}\n\n\t\t\t/// Hyperbolic area cosine implementation.\n\t\t\t/// \\param arg function argument\n\t\t\t/// \\return function value stored in single-preicision\n\t\t\tstatic expr acosh(float arg)\n\t\t\t{\n\t\t\t#if HALF_ENABLE_CPP11_CMATH\n\t\t\t\treturn expr(std::acosh(arg));\n\t\t\t#else\n\t\t\t\treturn expr((arg<-1.0f) ? std::numeric_limits<float>::quiet_NaN() : static_cast<float>(std::log(arg+std::sqrt(arg*arg-1.0))));\n\t\t\t#endif\n\t\t\t}\n\n\t\t\t/// Hyperbolic area tangent implementation.\n\t\t\t/// \\param arg function argument\n\t\t\t/// \\return function value stored in single-preicision\n\t\t\tstatic expr atanh(float arg)\n\t\t\t{\n\t\t\t#if HALF_ENABLE_CPP11_CMATH\n\t\t\t\treturn expr(std::atanh(arg));\n\t\t\t#else\n\t\t\t\treturn expr(static_cast<float>(0.5*std::log((1.0+arg)/(1.0-arg))));\n\t\t\t#endif\n\t\t\t}\n\n\t\t\t/// Error function implementation.\n\t\t\t/// \\param arg function argument\n\t\t\t/// \\return function value stored in single-preicision\n\t\t\tstatic expr erf(float arg)\n\t\t\t{\n\t\t\t#if HALF_ENABLE_CPP11_CMATH\n\t\t\t\treturn expr(std::erf(arg));\n\t\t\t#else\n\t\t\t\treturn expr(static_cast<float>(erf(static_cast<double>(arg))));\n\t\t\t#endif\n\t\t\t}\n\n\t\t\t/// Complementary implementation.\n\t\t\t/// \\param arg function argument\n\t\t\t/// \\return function value stored in single-preicision\n\t\t\tstatic expr erfc(float arg)\n\t\t\t{\n\t\t\t#if HALF_ENABLE_CPP11_CMATH\n\t\t\t\treturn expr(std::erfc(arg));\n\t\t\t#else\n\t\t\t\treturn expr(static_cast<float>(1.0-erf(static_cast<double>(arg))));\n\t\t\t#endif\n\t\t\t}\n\n\t\t\t/// Gamma logarithm implementation.\n\t\t\t/// \\param arg function argument\n\t\t\t/// \\return function value stored in single-preicision\n\t\t\tstatic expr lgamma(float arg)\n\t\t\t{\n\t\t\t#if HALF_ENABLE_CPP11_CMATH\n\t\t\t\treturn expr(std::lgamma(arg));\n\t\t\t#else\n\t\t\t\tif(builtin_isinf(arg))\n\t\t\t\t\treturn expr(std::numeric_limits<float>::infinity());\n\t\t\t\tdouble z = static_cast<double>(arg);\n\t\t\t\tif(z < 0)\n\t\t\t\t{\n\t\t\t\t\tdouble i, f = std::modf(-z, &i);\n\t\t\t\t\tif(f == 0.0)\n\t\t\t\t\t\treturn expr(std::numeric_limits<float>::infinity());\n\t\t\t\t\treturn expr(static_cast<float>(1.1447298858494001741434273513531-std::log(std::abs(std::sin(3.1415926535897932384626433832795*f)))-lgamma(1.0-z)));\n\t\t\t\t}\n//\t\t\t\tif(z < 8.0)\n\t\t\t\t\treturn expr(static_cast<float>(lgamma(static_cast<double>(arg))));\n\t\t\t\treturn expr(static_cast<float>(0.5*(1.8378770664093454835606594728112-std::log(z))+z*(std::log(z+1.0/(12.0*z-1.0/(10.0*z)-1.0))-1.0)));\n\t\t\t#endif\n\t\t\t}\n\n\t\t\t/// Gamma implementation.\n\t\t\t/// \\param arg function argument\n\t\t\t/// \\return function value stored in single-preicision\n\t\t\tstatic expr tgamma(float arg)\n\t\t\t{\n\t\t\t#if HALF_ENABLE_CPP11_CMATH\n\t\t\t\treturn expr(std::tgamma(arg));\n\t\t\t#else\n\t\t\t\tdouble z = static_cast<double>(arg);\n\t\t\t\tif(z == 0.0)\n\t\t\t\t\treturn builtin_signbit(z) ? expr(-std::numeric_limits<float>::infinity()) : expr(std::numeric_limits<float>::infinity());\n\t\t\t\tif(z < 0.0)\n\t\t\t\t{\n\t\t\t\t\tdouble i, f = std::modf(-z, &i);\n\t\t\t\t\tif(f == 0.0)\n\t\t\t\t\t\treturn expr(std::numeric_limits<float>::quiet_NaN());\n\t\t\t\t\tdouble sign = (std::fmod(i, 2.0)==0.0) ? -1.0 : 1.0;\n\t\t\t\t\treturn expr(static_cast<float>(sign*3.1415926535897932384626433832795/(std::sin(3.1415926535897932384626433832795*f)*std::exp(lgamma(1.0-z)))));\n\t\t\t\t}\n\t\t\t\tif(builtin_isinf(arg))\n\t\t\t\t\treturn expr(arg);\n//\t\t\t\tif(arg < 8.0f)\n\t\t\t\t\treturn expr(static_cast<float>(std::exp(lgamma(z))));\n\t\t\t\treturn expr(static_cast<float>(std::sqrt(6.283185307179586476925286766559/z)*std::pow(0.36787944117144232159552377016146*(z+1.0/(12.0*z-1.0/(10.0*z))), z)));\n\t\t\t#endif\n\t\t\t}\n\n\t\t\t/// Floor implementation.\n\t\t\t/// \\param arg value to round\n\t\t\t/// \\return rounded value\n\t\t\tstatic half floor(half arg) { return half(binary, round_half<std::round_toward_neg_infinity>(arg.data_)); }\n\n\t\t\t/// Ceiling implementation.\n\t\t\t/// \\param arg value to round\n\t\t\t/// \\return rounded value\n\t\t\tstatic half ceil(half arg) { return half(binary, round_half<std::round_toward_infinity>(arg.data_)); }\n\n\t\t\t/// Truncation implementation.\n\t\t\t/// \\param arg value to round\n\t\t\t/// \\return rounded value\n\t\t\tstatic half trunc(half arg) { return half(binary, round_half<std::round_toward_zero>(arg.data_)); }\n\n\t\t\t/// Nearest integer implementation.\n\t\t\t/// \\param arg value to round\n\t\t\t/// \\return rounded value\n\t\t\tstatic half round(half arg) { return half(binary, round_half_up(arg.data_)); }\n\n\t\t\t/// Nearest integer implementation.\n\t\t\t/// \\param arg value to round\n\t\t\t/// \\return rounded value\n\t\t\tstatic long lround(half arg) { return detail::half2int_up<long>(arg.data_); }\n\n\t\t\t/// Nearest integer implementation.\n\t\t\t/// \\param arg value to round\n\t\t\t/// \\return rounded value\n\t\t\tstatic half rint(half arg) { return half(binary, round_half<half::round_style>(arg.data_)); }\n\n\t\t\t/// Nearest integer implementation.\n\t\t\t/// \\param arg value to round\n\t\t\t/// \\return rounded value\n\t\t\tstatic long lrint(half arg) { return detail::half2int<half::round_style,long>(arg.data_); }\n\n\t\t#if HALF_ENABLE_CPP11_LONG_LONG\n\t\t\t/// Nearest integer implementation.\n\t\t\t/// \\param arg value to round\n\t\t\t/// \\return rounded value\n\t\t\tstatic long long llround(half arg) { return detail::half2int_up<long long>(arg.data_); }\n\n\t\t\t/// Nearest integer implementation.\n\t\t\t/// \\param arg value to round\n\t\t\t/// \\return rounded value\n\t\t\tstatic long long llrint(half arg) { return detail::half2int<half::round_style,long long>(arg.data_); }\n\t\t#endif\n\n\t\t\t/// Decompression implementation.\n\t\t\t/// \\param arg number to decompress\n\t\t\t/// \\param exp address to store exponent at\n\t\t\t/// \\return normalized significant\n\t\t\tstatic half frexp(half arg, int *exp)\n\t\t\t{\n\t\t\t\tunsigned int m = arg.data_ & 0x7FFF;\n\t\t\t\tif(m >= 0x7C00 || !m)\n\t\t\t\t\treturn *exp = 0, arg;\n\t\t\t\tint e = m >> 10;\n\t\t\t\tif(!e)\n\t\t\t\t\tfor(m<<=1; m<0x400; m<<=1,--e) ;\n\t\t\t\treturn *exp = e-14, half(binary, static_cast<uint16>((arg.data_&0x8000)|0x3800|(m&0x3FF)));\n\t\t\t}\n\n\t\t\t/// Decompression implementation.\n\t\t\t/// \\param arg number to decompress\n\t\t\t/// \\param iptr address to store integer part at\n\t\t\t/// \\return fractional part\n\t\t\tstatic half modf(half arg, half *iptr)\n\t\t\t{\n\t\t\t\tunsigned int e = arg.data_ & 0x7C00;\n\t\t\t\tif(e > 0x6000)\n\t\t\t\t\treturn *iptr = arg, (e==0x7C00&&(arg.data_&0x3FF)) ? arg : half(binary, arg.data_&0x8000);\n\t\t\t\tif(e < 0x3C00)\n\t\t\t\t\treturn iptr->data_ = arg.data_ & 0x8000, arg;\n\t\t\t\te >>= 10;\n\t\t\t\tunsigned int mask = (1<<(25-e)) - 1, m = arg.data_ & mask;\n\t\t\t\tiptr->data_ = arg.data_ & ~mask;\n\t\t\t\tif(!m)\n\t\t\t\t\treturn half(binary, arg.data_&0x8000);\n\t\t\t\tfor(; m<0x400; m<<=1,--e) ;\n\t\t\t\treturn half(binary, static_cast<uint16>((arg.data_&0x8000)|(e<<10)|(m&0x3FF)));\n\t\t\t}\n\n\t\t\t/// Scaling implementation.\n\t\t\t/// \\param arg number to scale\n\t\t\t/// \\param exp power of two to scale by\n\t\t\t/// \\return scaled number\n\t\t\tstatic half scalbln(half arg, long exp)\n\t\t\t{\n\t\t\t\tlong e = arg.data_ & 0x7C00;\n\t\t\t\tif(e == 0x7C00)\n\t\t\t\t\treturn arg;\n\t\t\t\tunsigned int m = arg.data_ & 0x3FF;\n\t\t\t\tif(e >>= 10)\n\t\t\t\t\tm |= 0x400;\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif(!m)\n\t\t\t\t\t\treturn arg;\n\t\t\t\t\tfor(m<<=1; m<0x400; m<<=1,--e) ;\n\t\t\t\t}\n\t\t\t\te += exp;\n\t\t\t\tuint16 value = arg.data_ & 0x8000;\n\t\t\t\tif(e > 30)\n\t\t\t\t{\n\t\t\t\t\tif(half::round_style == std::round_toward_zero)\n\t\t\t\t\t\tvalue |= 0x7BFF;\n\t\t\t\t\telse if(half::round_style == std::round_toward_infinity)\n\t\t\t\t\t\tvalue |= 0x7C00 - (value>>15);\n\t\t\t\t\telse if(half::round_style == std::round_toward_neg_infinity)\n\t\t\t\t\t\tvalue |= 0x7BFF + (value>>15);\n\t\t\t\t\telse\n\t\t\t\t\t\tvalue |= 0x7C00;\n\t\t\t\t}\n\t\t\t\telse if(e > 0)\n\t\t\t\t\tvalue |= (e<<10) | (m&0x3FF);\n\t\t\t\telse if(e > -11)\n\t\t\t\t{\n\t\t\t\t\tif(half::round_style == std::round_to_nearest)\n\t\t\t\t\t{\n\t\t\t\t\t\tm += 1 << -e;\n\t\t\t\t\t#if HALF_ROUND_TIES_TO_EVEN\n\t\t\t\t\t\tm -= (m>>(1-e)) & 1;\n\t\t\t\t\t#endif\n\t\t\t\t\t}\n\t\t\t\t\telse if(half::round_style == std::round_toward_infinity)\n\t\t\t\t\t\tm += ((value>>15)-1) & ((1<<(1-e))-1U);\n\t\t\t\t\telse if(half::round_style == std::round_toward_neg_infinity)\n\t\t\t\t\t\tm += -(value>>15) & ((1<<(1-e))-1U);\n\t\t\t\t\tvalue |= m >> (1-e);\n\t\t\t\t}\n\t\t\t\telse if(half::round_style == std::round_toward_infinity)\n\t\t\t\t\tvalue |= ((value>>15)-1) & 1;\n\t\t\t\telse if(half::round_style == std::round_toward_neg_infinity)\n\t\t\t\t\tvalue |= value >> 15;\n\t\t\t\treturn half(binary, value);\n\t\t\t}\n\n\t\t\t/// Exponent implementation.\n\t\t\t/// \\param arg number to query\n\t\t\t/// \\return floating point exponent\n\t\t\tstatic int ilogb(half arg)\n\t\t\t{\n\t\t\t\tint exp = arg.data_ & 0x7FFF;\n\t\t\t\tif(!exp)\n\t\t\t\t\treturn FP_ILOGB0;\n\t\t\t\tif(exp < 0x7C00)\n\t\t\t\t{\n\t\t\t\t\tif(!(exp>>=10))\n\t\t\t\t\t\tfor(unsigned int m=(arg.data_&0x3FF); m<0x200; m<<=1,--exp) ;\n\t\t\t\t\treturn exp - 15;\n\t\t\t\t}\n\t\t\t\tif(exp > 0x7C00)\n\t\t\t\t\treturn FP_ILOGBNAN;\n\t\t\t\treturn INT_MAX;\n\t\t\t}\n\n\t\t\t/// Exponent implementation.\n\t\t\t/// \\param arg number to query\n\t\t\t/// \\return floating point exponent\n\t\t\tstatic half logb(half arg)\n\t\t\t{\n\t\t\t\tint exp = arg.data_ & 0x7FFF;\n\t\t\t\tif(!exp)\n\t\t\t\t\treturn half(binary, 0xFC00);\n\t\t\t\tif(exp < 0x7C00)\n\t\t\t\t{\n\t\t\t\t\tif(!(exp>>=10))\n\t\t\t\t\t\tfor(unsigned int m=(arg.data_&0x3FF); m<0x200; m<<=1,--exp) ;\n\t\t\t\t\treturn half(static_cast<float>(exp-15));\n\t\t\t\t}\n\t\t\t\tif(exp > 0x7C00)\n\t\t\t\t\treturn arg;\n\t\t\t\treturn half(binary, 0x7C00);\n\t\t\t}\n\n\t\t\t/// Enumeration implementation.\n\t\t\t/// \\param from number to increase/decrease\n\t\t\t/// \\param to direction to enumerate into\n\t\t\t/// \\return next representable number\n\t\t\tstatic half nextafter(half from, half to)\n\t\t\t{\n\t\t\t\tuint16 fabs = from.data_ & 0x7FFF, tabs = to.data_ & 0x7FFF;\n\t\t\t\tif(fabs > 0x7C00)\n\t\t\t\t\treturn from;\n\t\t\t\tif(tabs > 0x7C00 || from.data_ == to.data_ || !(fabs|tabs))\n\t\t\t\t\treturn to;\n\t\t\t\tif(!fabs)\n\t\t\t\t\treturn half(binary, (to.data_&0x8000)+1);\n\t\t\t\tbool lt = (signbit(from) ? (static_cast<int17>(0x8000)-from.data_) : static_cast<int17>(from.data_)) < \n\t\t\t\t\t(signbit(to) ? (static_cast<int17>(0x8000)-to.data_) : static_cast<int17>(to.data_));\n\t\t\t\treturn half(binary, from.data_+(((from.data_>>15)^static_cast<uint16>(lt))<<1)-1);\n\t\t\t}\n\n\t\t\t/// Enumeration implementation.\n\t\t\t/// \\param from number to increase/decrease\n\t\t\t/// \\param to direction to enumerate into\n\t\t\t/// \\return next representable number\n\t\t\tstatic half nexttoward(half from, long double to)\n\t\t\t{\n\t\t\t\tif(isnan(from))\n\t\t\t\t\treturn from;\n\t\t\t\tlong double lfrom = static_cast<long double>(from);\n\t\t\t\tif(builtin_isnan(to) || lfrom == to)\n\t\t\t\t\treturn half(static_cast<float>(to));\n\t\t\t\tif(!(from.data_&0x7FFF))\n\t\t\t\t\treturn half(binary, (static_cast<detail::uint16>(builtin_signbit(to))<<15)+1);\n\t\t\t\treturn half(binary, from.data_+(((from.data_>>15)^static_cast<uint16>(lfrom<to))<<1)-1);\n\t\t\t}\n\n\t\t\t/// Sign implementation\n\t\t\t/// \\param x first operand\n\t\t\t/// \\param y second operand\n\t\t\t/// \\return composed value\n\t\t\tstatic half copysign(half x, half y) { return half(binary, x.data_^((x.data_^y.data_)&0x8000)); }\n\n\t\t\t/// Classification implementation.\n\t\t\t/// \\param arg value to classify\n\t\t\t/// \\retval true if infinite number\n\t\t\t/// \\retval false else\n\t\t\tstatic int fpclassify(half arg)\n\t\t\t{\n\t\t\t\tunsigned int abs = arg.data_ & 0x7FFF;\n\t\t\t\tif(abs > 0x7C00)\n\t\t\t\t\treturn FP_NAN;\n\t\t\t\tif(abs == 0x7C00)\n\t\t\t\t\treturn FP_INFINITE;\n\t\t\t\tif(abs > 0x3FF)\n\t\t\t\t\treturn FP_NORMAL;\n\t\t\t\treturn abs ? FP_SUBNORMAL : FP_ZERO;\n\t\t\t}\n\n\t\t\t/// Classification implementation.\n\t\t\t/// \\param arg value to classify\n\t\t\t/// \\retval true if finite number\n\t\t\t/// \\retval false else\n\t\t\tstatic bool isfinite(half arg) { return (arg.data_&0x7C00) != 0x7C00; }\n\n\t\t\t/// Classification implementation.\n\t\t\t/// \\param arg value to classify\n\t\t\t/// \\retval true if infinite number\n\t\t\t/// \\retval false else\n\t\t\tstatic bool isinf(half arg) { return (arg.data_&0x7FFF) == 0x7C00; }\n\n\t\t\t/// Classification implementation.\n\t\t\t/// \\param arg value to classify\n\t\t\t/// \\retval true if not a number\n\t\t\t/// \\retval false else\n\t\t\tstatic bool isnan(half arg) { return (arg.data_&0x7FFF) > 0x7C00; }\n\n\t\t\t/// Classification implementation.\n\t\t\t/// \\param arg value to classify\n\t\t\t/// \\retval true if normal number\n\t\t\t/// \\retval false else\n\t\t\tstatic bool isnormal(half arg) { return ((arg.data_&0x7C00)!=0) & ((arg.data_&0x7C00)!=0x7C00); }\n\n\t\t\t/// Sign bit implementation.\n\t\t\t/// \\param arg value to check\n\t\t\t/// \\retval true if signed\n\t\t\t/// \\retval false if unsigned\n\t\t\tstatic bool signbit(half arg) { return (arg.data_&0x8000) != 0; }\n\n\t\t\t/// Comparison implementation.\n\t\t\t/// \\param x first operand\n\t\t\t/// \\param y second operand\n\t\t\t/// \\retval true if operands equal\n\t\t\t/// \\retval false else\n\t\t\tstatic bool isequal(half x, half y) { return (x.data_==y.data_ || !((x.data_|y.data_)&0x7FFF)) && !isnan(x); }\n\n\t\t\t/// Comparison implementation.\n\t\t\t/// \\param x first operand\n\t\t\t/// \\param y second operand\n\t\t\t/// \\retval true if operands not equal\n\t\t\t/// \\retval false else\n\t\t\tstatic bool isnotequal(half x, half y) { return (x.data_!=y.data_ && ((x.data_|y.data_)&0x7FFF)) || isnan(x); }\n\n\t\t\t/// Comparison implementation.\n\t\t\t/// \\param x first operand\n\t\t\t/// \\param y second operand\n\t\t\t/// \\retval true if \\a x > \\a y\n\t\t\t/// \\retval false else\n\t\t\tstatic bool isgreater(half x, half y) { return !isnan(x) && !isnan(y) && ((signbit(x) ? (static_cast<int17>(0x8000)-x.data_) : \n\t\t\t\tstatic_cast<int17>(x.data_)) > (signbit(y) ? (static_cast<int17>(0x8000)-y.data_) : static_cast<int17>(y.data_))); }\n\n\t\t\t/// Comparison implementation.\n\t\t\t/// \\param x first operand\n\t\t\t/// \\param y second operand\n\t\t\t/// \\retval true if \\a x >= \\a y\n\t\t\t/// \\retval false else\n\t\t\tstatic bool isgreaterequal(half x, half y) { return !isnan(x) && !isnan(y) && ((signbit(x) ? (static_cast<int17>(0x8000)-x.data_) : \n\t\t\t\tstatic_cast<int17>(x.data_)) >= (signbit(y) ? (static_cast<int17>(0x8000)-y.data_) : static_cast<int17>(y.data_))); }\n\n\t\t\t/// Comparison implementation.\n\t\t\t/// \\param x first operand\n\t\t\t/// \\param y second operand\n\t\t\t/// \\retval true if \\a x < \\a y\n\t\t\t/// \\retval false else\n\t\t\tstatic bool isless(half x, half y) { return !isnan(x) && !isnan(y) && ((signbit(x) ? (static_cast<int17>(0x8000)-x.data_) : \n\t\t\t\tstatic_cast<int17>(x.data_)) < (signbit(y) ? (static_cast<int17>(0x8000)-y.data_) : static_cast<int17>(y.data_))); }\n\n\t\t\t/// Comparison implementation.\n\t\t\t/// \\param x first operand\n\t\t\t/// \\param y second operand\n\t\t\t/// \\retval true if \\a x <= \\a y\n\t\t\t/// \\retval false else\n\t\t\tstatic bool islessequal(half x, half y) { return !isnan(x) && !isnan(y) && ((signbit(x) ? (static_cast<int17>(0x8000)-x.data_) : \n\t\t\t\tstatic_cast<int17>(x.data_)) <= (signbit(y) ? (static_cast<int17>(0x8000)-y.data_) : static_cast<int17>(y.data_))); }\n\n\t\t\t/// Comparison implementation.\n\t\t\t/// \\param x first operand\n\t\t\t/// \\param y second operand\n\t\t\t/// \\retval true neither \\a x > \\a y nor \\a x < \\a y\n\t\t\t/// \\retval false else\n\t\t\tstatic bool islessgreater(half x, half y)\n\t\t\t{\n\t\t\t\tif(isnan(x) || isnan(y))\n\t\t\t\t\treturn false;\n\t\t\t\tint17 a = signbit(x) ? (static_cast<int17>(0x8000)-x.data_) : static_cast<int17>(x.data_);\n\t\t\t\tint17 b = signbit(y) ? (static_cast<int17>(0x8000)-y.data_) : static_cast<int17>(y.data_);\n\t\t\t\treturn a < b || a > b;\n\t\t\t}\n\n\t\t\t/// Comparison implementation.\n\t\t\t/// \\param x first operand\n\t\t\t/// \\param y second operand\n\t\t\t/// \\retval true if operand unordered\n\t\t\t/// \\retval false else\n\t\t\tstatic bool isunordered(half x, half y) { return isnan(x) || isnan(y); }\n\n\t\tprivate:\n\t\t\tstatic double erf(double arg)\n\t\t\t{\n\t\t\t\tif(builtin_isinf(arg))\n\t\t\t\t\treturn (arg<0.0) ? -1.0 : 1.0;\n\t\t\t\tdouble x2 = static_cast<double>(arg) * static_cast<double>(arg), ax2 = 0.147 * x2;\n\t\t\t\tdouble value = std::sqrt(1.0-std::exp(-x2*(1.2732395447351626861510701069801+ax2)/(1.0+ax2)));\n\t\t\t\treturn builtin_signbit(arg) ? -value : value;\n\t\t\t}\n\n\t\t\tstatic double lgamma(double arg)\n\t\t\t{\n\t\t\t\tdouble v = 1.0;\n\t\t\t\tfor(; arg<8.0; ++arg) v *= arg;\n\t\t\t\tdouble w = 1.0 / (arg * arg);\n\t\t\t\treturn (((((((-0.02955065359477124183006535947712*w+0.00641025641025641025641025641026)*w+\n\t\t\t\t\t-0.00191752691752691752691752691753)*w+8.4175084175084175084175084175084e-4)*w+\n\t\t\t\t\t-5.952380952380952380952380952381e-4)*w+7.9365079365079365079365079365079e-4)*w+\n\t\t\t\t\t-0.00277777777777777777777777777778)*w+0.08333333333333333333333333333333)/arg + \n\t\t\t\t\t0.91893853320467274178032973640562 - std::log(v) - arg + (arg-0.5) * std::log(arg);\n\t\t\t}\n\t\t};\n\n\t\t/// Wrapper for unary half-precision functions needing specialization for individual argument types.\n\t\t/// \\tparam T argument type\n\t\ttemplate<typename T> struct unary_specialized\n\t\t{\n\t\t\t/// Negation implementation.\n\t\t\t/// \\param arg value to negate\n\t\t\t/// \\return negated value\n\t\t\tstatic HALF_CONSTEXPR half negate(half arg) { return half(binary, arg.data_^0x8000); }\n\n\t\t\t/// Absolute value implementation.\n\t\t\t/// \\param arg function argument\n\t\t\t/// \\return absolute value\n\t\t\tstatic half fabs(half arg) { return half(binary, arg.data_&0x7FFF); }\n\t\t};\n\t\ttemplate<> struct unary_specialized<expr>\n\t\t{\n\t\t\tstatic HALF_CONSTEXPR expr negate(float arg) { return expr(-arg); }\n\t\t\tstatic expr fabs(float arg) { return expr(std::fabs(arg)); }\n\t\t};\n\n\t\t/// Wrapper for binary half-precision functions needing specialization for individual argument types.\n\t\t/// \\tparam T first argument type\n\t\t/// \\tparam U first argument type\n\t\ttemplate<typename T,typename U> struct binary_specialized\n\t\t{\n\t\t\t/// Minimum implementation.\n\t\t\t/// \\param x first operand\n\t\t\t/// \\param y second operand\n\t\t\t/// \\return minimum value\n\t\t\tstatic expr fmin(float x, float y)\n\t\t\t{\n\t\t\t#if HALF_ENABLE_CPP11_CMATH\n\t\t\t\treturn expr(std::fmin(x, y));\n\t\t\t#else\n\t\t\t\tif(builtin_isnan(x))\n\t\t\t\t\treturn expr(y);\n\t\t\t\tif(builtin_isnan(y))\n\t\t\t\t\treturn expr(x);\n\t\t\t\treturn expr(std::min(x, y));\n\t\t\t#endif\n\t\t\t}\n\n\t\t\t/// Maximum implementation.\n\t\t\t/// \\param x first operand\n\t\t\t/// \\param y second operand\n\t\t\t/// \\return maximum value\n\t\t\tstatic expr fmax(float x, float y)\n\t\t\t{\n\t\t\t#if HALF_ENABLE_CPP11_CMATH\n\t\t\t\treturn expr(std::fmax(x, y));\n\t\t\t#else\n\t\t\t\tif(builtin_isnan(x))\n\t\t\t\t\treturn expr(y);\n\t\t\t\tif(builtin_isnan(y))\n\t\t\t\t\treturn expr(x);\n\t\t\t\treturn expr(std::max(x, y));\n\t\t\t#endif\n\t\t\t}\n\t\t};\n\t\ttemplate<> struct binary_specialized<half,half>\n\t\t{\n\t\t\tstatic half fmin(half x, half y)\n\t\t\t{\n\t\t\t\tif(functions::isnan(x))\n\t\t\t\t\treturn y;\n\t\t\t\tif(functions::isnan(y))\n\t\t\t\t\treturn x;\n\t\t\t\treturn ((functions::signbit(x) ? (static_cast<int17>(0x8000)-x.data_) : static_cast<int17>(x.data_)) >\n\t\t\t\t\t\t(functions::signbit(y) ? (static_cast<int17>(0x8000)-y.data_) : static_cast<int17>(y.data_))) ? y : x;\n\t\t\t}\n\t\t\tstatic half fmax(half x, half y)\n\t\t\t{\n\t\t\t\tif(functions::isnan(x))\n\t\t\t\t\treturn y;\n\t\t\t\tif(functions::isnan(y))\n\t\t\t\t\treturn x;\n\t\t\t\treturn ((functions::signbit(x) ? (static_cast<int17>(0x8000)-x.data_) : static_cast<int17>(x.data_)) <\n\t\t\t\t\t\t(functions::signbit(y) ? (static_cast<int17>(0x8000)-y.data_) : static_cast<int17>(y.data_))) ? y : x;\n\t\t\t}\n\t\t};\n\n\t\t/// Helper class for half casts.\n\t\t/// This class template has to be specialized for all valid cast argument to define an appropriate static `cast` member \n\t\t/// function and a corresponding `type` member denoting its return type.\n\t\t/// \\tparam T destination type\n\t\t/// \\tparam U source type\n\t\t/// \\tparam R rounding mode to use\n\t\ttemplate<typename T,typename U,std::float_round_style R=(std::float_round_style)(HALF_ROUND_STYLE)> struct half_caster {};\n\t\ttemplate<typename U,std::float_round_style R> struct half_caster<half,U,R>\n\t\t{\n\t\t#if HALF_ENABLE_CPP11_STATIC_ASSERT && HALF_ENABLE_CPP11_TYPE_TRAITS\n\t\t\tstatic_assert(std::is_arithmetic<U>::value, \"half_cast from non-arithmetic type unsupported\");\n\t\t#endif\n\n\t\t\ttypedef half type;\n\t\t\tstatic half cast(U arg) { return cast_impl(arg, is_float<U>()); };\n\n\t\tprivate:\n\t\t\tstatic half cast_impl(U arg, true_type) { return half(binary, float2half<R>(static_cast<float>(arg))); }\n\t\t\tstatic half cast_impl(U arg, false_type) { return half(binary, int2half<R>(arg)); }\n\t\t};\n\t\ttemplate<typename T,std::float_round_style R> struct half_caster<T,half,R>\n\t\t{\n\t\t#if HALF_ENABLE_CPP11_STATIC_ASSERT && HALF_ENABLE_CPP11_TYPE_TRAITS\n\t\t\tstatic_assert(std::is_arithmetic<T>::value, \"half_cast to non-arithmetic type unsupported\");\n\t\t#endif\n\n\t\t\ttypedef T type;\n\t\t\ttemplate<typename U> static T cast(U arg) { return cast_impl(arg, is_float<T>()); }\n\n\t\tprivate:\n\t\t\tstatic T cast_impl(float arg, true_type) { return static_cast<T>(arg); }\n\t\t\tstatic T cast_impl(half arg, false_type) { return half2int<R,T>(arg.data_); }\n\t\t};\n\t\ttemplate<typename T,std::float_round_style R> struct half_caster<T,expr,R> : public half_caster<T,half,R> {};\n\t\ttemplate<std::float_round_style R> struct half_caster<half,half,R>\n\t\t{\n\t\t\ttypedef half type;\n\t\t\tstatic half cast(half arg) { return arg; }\n\t\t};\n\t\ttemplate<std::float_round_style R> struct half_caster<half,expr,R> : public half_caster<half,half,R> {};\n\n\t\t/// \\name Comparison operators\n\t\t/// \\{\n\n\t\t/// Comparison for equality.\n\t\t/// \\param x first operand\n\t\t/// \\param y second operand\n\t\t/// \\retval true if operands equal\n\t\t/// \\retval false else\n\t\ttemplate<typename T,typename U> typename enable<bool,T,U>::type operator==(T x, U y) { return functions::isequal(x, y); }\n\n\t\t/// Comparison for inequality.\n\t\t/// \\param x first operand\n\t\t/// \\param y second operand\n\t\t/// \\retval true if operands not equal\n\t\t/// \\retval false else\n\t\ttemplate<typename T,typename U> typename enable<bool,T,U>::type operator!=(T x, U y) { return functions::isnotequal(x, y); }\n\n\t\t/// Comparison for less than.\n\t\t/// \\param x first operand\n\t\t/// \\param y second operand\n\t\t/// \\retval true if \\a x less than \\a y\n\t\t/// \\retval false else\n\t\ttemplate<typename T,typename U> typename enable<bool,T,U>::type operator<(T x, U y) { return functions::isless(x, y); }\n\n\t\t/// Comparison for greater than.\n\t\t/// \\param x first operand\n\t\t/// \\param y second operand\n\t\t/// \\retval true if \\a x greater than \\a y\n\t\t/// \\retval false else\n\t\ttemplate<typename T,typename U> typename enable<bool,T,U>::type operator>(T x, U y) { return functions::isgreater(x, y); }\n\n\t\t/// Comparison for less equal.\n\t\t/// \\param x first operand\n\t\t/// \\param y second operand\n\t\t/// \\retval true if \\a x less equal \\a y\n\t\t/// \\retval false else\n\t\ttemplate<typename T,typename U> typename enable<bool,T,U>::type operator<=(T x, U y) { return functions::islessequal(x, y); }\n\n\t\t/// Comparison for greater equal.\n\t\t/// \\param x first operand\n\t\t/// \\param y second operand\n\t\t/// \\retval true if \\a x greater equal \\a y\n\t\t/// \\retval false else\n\t\ttemplate<typename T,typename U> typename enable<bool,T,U>::type operator>=(T x, U y) { return functions::isgreaterequal(x, y); }\n\n\t\t/// \\}\n\t\t/// \\name Arithmetic operators\n\t\t/// \\{\n\n\t\t/// Add halfs.\n\t\t/// \\param x left operand\n\t\t/// \\param y right operand\n\t\t/// \\return sum of half expressions\n\t\ttemplate<typename T,typename U> typename enable<expr,T,U>::type operator+(T x, U y) { return functions::plus(x, y); }\n\n\t\t/// Subtract halfs.\n\t\t/// \\param x left operand\n\t\t/// \\param y right operand\n\t\t/// \\return difference of half expressions\n\t\ttemplate<typename T,typename U> typename enable<expr,T,U>::type operator-(T x, U y) { return functions::minus(x, y); }\n\n\t\t/// Multiply halfs.\n\t\t/// \\param x left operand\n\t\t/// \\param y right operand\n\t\t/// \\return product of half expressions\n\t\ttemplate<typename T,typename U> typename enable<expr,T,U>::type operator*(T x, U y) { return functions::multiplies(x, y); }\n\n\t\t/// Divide halfs.\n\t\t/// \\param x left operand\n\t\t/// \\param y right operand\n\t\t/// \\return quotient of half expressions\n\t\ttemplate<typename T,typename U> typename enable<expr,T,U>::type operator/(T x, U y) { return functions::divides(x, y); }\n\n\t\t/// Identity.\n\t\t/// \\param arg operand\n\t\t/// \\return uncahnged operand\n\t\ttemplate<typename T> HALF_CONSTEXPR typename enable<T,T>::type operator+(T arg) { return arg; }\n\n\t\t/// Negation.\n\t\t/// \\param arg operand\n\t\t/// \\return negated operand\n\t\ttemplate<typename T> HALF_CONSTEXPR typename enable<T,T>::type operator-(T arg) { return unary_specialized<T>::negate(arg); }\n\n\t\t/// \\}\n\t\t/// \\name Input and output\n\t\t/// \\{\n\n\t\t/// Output operator.\n\t\t/// \\param out output stream to write into\n\t\t/// \\param arg half expression to write\n\t\t/// \\return reference to output stream\n\t\ttemplate<typename T,typename charT,typename traits> typename enable<std::basic_ostream<charT,traits>&,T>::type\n\t\t\toperator<<(std::basic_ostream<charT,traits> &out, T arg) { return functions::write(out, arg); }\n\n\t\t/// Input operator.\n\t\t/// \\param in input stream to read from\n\t\t/// \\param arg half to read into\n\t\t/// \\return reference to input stream\n\t\ttemplate<typename charT,typename traits> std::basic_istream<charT,traits>&\n\t\t\toperator>>(std::basic_istream<charT,traits> &in, half &arg) { return functions::read(in, arg); }\n\n\t\t/// \\}\n\t\t/// \\name Basic mathematical operations\n\t\t/// \\{\n\n\t\t/// Absolute value.\n\t\t/// \\param arg operand\n\t\t/// \\return absolute value of \\a arg\n//\t\ttemplate<typename T> typename enable<T,T>::type abs(T arg) { return unary_specialized<T>::fabs(arg); }\n\t\tinline half abs(half arg) { return unary_specialized<half>::fabs(arg); }\n\t\tinline expr abs(expr arg) { return unary_specialized<expr>::fabs(arg); }\n\n\t\t/// Absolute value.\n\t\t/// \\param arg operand\n\t\t/// \\return absolute value of \\a arg\n//\t\ttemplate<typename T> typename enable<T,T>::type fabs(T arg) { return unary_specialized<T>::fabs(arg); }\n\t\tinline half fabs(half arg) { return unary_specialized<half>::fabs(arg); }\n\t\tinline expr fabs(expr arg) { return unary_specialized<expr>::fabs(arg); }\n\n\t\t/// Remainder of division.\n\t\t/// \\param x first operand\n\t\t/// \\param y second operand\n\t\t/// \\return remainder of floating point division.\n//\t\ttemplate<typename T,typename U> typename enable<expr,T,U>::type fmod(T x, U y) { return functions::fmod(x, y); }\n\t\tinline expr fmod(half x, half y) { return functions::fmod(x, y); }\n\t\tinline expr fmod(half x, expr y) { return functions::fmod(x, y); }\n\t\tinline expr fmod(expr x, half y) { return functions::fmod(x, y); }\n\t\tinline expr fmod(expr x, expr y) { return functions::fmod(x, y); }\n\n\t\t/// Remainder of division.\n\t\t/// \\param x first operand\n\t\t/// \\param y second operand\n\t\t/// \\return remainder of floating point division.\n//\t\ttemplate<typename T,typename U> typename enable<expr,T,U>::type remainder(T x, U y) { return functions::remainder(x, y); }\n\t\tinline expr remainder(half x, half y) { return functions::remainder(x, y); }\n\t\tinline expr remainder(half x, expr y) { return functions::remainder(x, y); }\n\t\tinline expr remainder(expr x, half y) { return functions::remainder(x, y); }\n\t\tinline expr remainder(expr x, expr y) { return functions::remainder(x, y); }\n\n\t\t/// Remainder of division.\n\t\t/// \\param x first operand\n\t\t/// \\param y second operand\n\t\t/// \\param quo address to store some bits of quotient at\n\t\t/// \\return remainder of floating point division.\n//\t\ttemplate<typename T,typename U> typename enable<expr,T,U>::type remquo(T x, U y, int *quo) { return functions::remquo(x, y, quo); }\n\t\tinline expr remquo(half x, half y, int *quo) { return functions::remquo(x, y, quo); }\n\t\tinline expr remquo(half x, expr y, int *quo) { return functions::remquo(x, y, quo); }\n\t\tinline expr remquo(expr x, half y, int *quo) { return functions::remquo(x, y, quo); }\n\t\tinline expr remquo(expr x, expr y, int *quo) { return functions::remquo(x, y, quo); }\n\n\t\t/// Fused multiply add.\n\t\t/// \\param x first operand\n\t\t/// \\param y second operand\n\t\t/// \\param z third operand\n\t\t/// \\return ( \\a x * \\a y ) + \\a z rounded as one operation.\n//\t\ttemplate<typename T,typename U,typename V> typename enable<expr,T,U,V>::type fma(T x, U y, V z) { return functions::fma(x, y, z); }\n\t\tinline expr fma(half x, half y, half z) { return functions::fma(x, y, z); }\n\t\tinline expr fma(half x, half y, expr z) { return functions::fma(x, y, z); }\n\t\tinline expr fma(half x, expr y, half z) { return functions::fma(x, y, z); }\n\t\tinline expr fma(half x, expr y, expr z) { return functions::fma(x, y, z); }\n\t\tinline expr fma(expr x, half y, half z) { return functions::fma(x, y, z); }\n\t\tinline expr fma(expr x, half y, expr z) { return functions::fma(x, y, z); }\n\t\tinline expr fma(expr x, expr y, half z) { return functions::fma(x, y, z); }\n\t\tinline expr fma(expr x, expr y, expr z) { return functions::fma(x, y, z); }\n\n\t\t/// Maximum of half expressions.\n\t\t/// \\param x first operand\n\t\t/// \\param y second operand\n\t\t/// \\return maximum of operands\n//\t\ttemplate<typename T,typename U> typename result<T,U>::type fmax(T x, U y) { return binary_specialized<T,U>::fmax(x, y); }\n\t\tinline half fmax(half x, half y) { return binary_specialized<half,half>::fmax(x, y); }\n\t\tinline expr fmax(half x, expr y) { return binary_specialized<half,expr>::fmax(x, y); }\n\t\tinline expr fmax(expr x, half y) { return binary_specialized<expr,half>::fmax(x, y); }\n\t\tinline expr fmax(expr x, expr y) { return binary_specialized<expr,expr>::fmax(x, y); }\n\n\t\t/// Minimum of half expressions.\n\t\t/// \\param x first operand\n\t\t/// \\param y second operand\n\t\t/// \\return minimum of operands\n//\t\ttemplate<typename T,typename U> typename result<T,U>::type fmin(T x, U y) { return binary_specialized<T,U>::fmin(x, y); }\n\t\tinline half fmin(half x, half y) { return binary_specialized<half,half>::fmin(x, y); }\n\t\tinline expr fmin(half x, expr y) { return binary_specialized<half,expr>::fmin(x, y); }\n\t\tinline expr fmin(expr x, half y) { return binary_specialized<expr,half>::fmin(x, y); }\n\t\tinline expr fmin(expr x, expr y) { return binary_specialized<expr,expr>::fmin(x, y); }\n\n\t\t/// Positive difference.\n\t\t/// \\param x first operand\n\t\t/// \\param y second operand\n\t\t/// \\return \\a x - \\a y or 0 if difference negative\n//\t\ttemplate<typename T,typename U> typename enable<expr,T,U>::type fdim(T x, U y) { return functions::fdim(x, y); }\n\t\tinline expr fdim(half x, half y) { return functions::fdim(x, y); }\n\t\tinline expr fdim(half x, expr y) { return functions::fdim(x, y); }\n\t\tinline expr fdim(expr x, half y) { return functions::fdim(x, y); }\n\t\tinline expr fdim(expr x, expr y) { return functions::fdim(x, y); }\n\n\t\t/// Get NaN value.\n\t\t/// \\param arg descriptive string (ignored)\n\t\t/// \\return quiet NaN\n\t\tinline half nanh(const char *arg) { return functions::nanh(arg); }\n\n\t\t/// \\}\n\t\t/// \\name Exponential functions\n\t\t/// \\{\n\n\t\t/// Exponential function.\n\t\t/// \\param arg function argument\n\t\t/// \\return e raised to \\a arg\n//\t\ttemplate<typename T> typename enable<expr,T>::type exp(T arg) { return functions::exp(arg); }\n\t\tinline expr exp(half arg) { return functions::exp(arg); }\n\t\tinline expr exp(expr arg) { return functions::exp(arg); }\n\n\t\t/// Exponential minus one.\n\t\t/// \\param arg function argument\n\t\t/// \\return e raised to \\a arg subtracted by 1\n//\t\ttemplate<typename T> typename enable<expr,T>::type expm1(T arg) { return functions::expm1(arg); }\n\t\tinline expr expm1(half arg) { return functions::expm1(arg); }\n\t\tinline expr expm1(expr arg) { return functions::expm1(arg); }\n\n\t\t/// Binary exponential.\n\t\t/// \\param arg function argument\n\t\t/// \\return 2 raised to \\a arg\n//\t\ttemplate<typename T> typename enable<expr,T>::type exp2(T arg) { return functions::exp2(arg); }\n\t\tinline expr exp2(half arg) { return functions::exp2(arg); }\n\t\tinline expr exp2(expr arg) { return functions::exp2(arg); }\n\n\t\t/// Natural logorithm.\n\t\t/// \\param arg function argument\n\t\t/// \\return logarithm of \\a arg to base e\n//\t\ttemplate<typename T> typename enable<expr,T>::type log(T arg) { return functions::log(arg); }\n\t\tinline expr log(half arg) { return functions::log(arg); }\n\t\tinline expr log(expr arg) { return functions::log(arg); }\n\n\t\t/// Common logorithm.\n\t\t/// \\param arg function argument\n\t\t/// \\return logarithm of \\a arg to base 10\n//\t\ttemplate<typename T> typename enable<expr,T>::type log10(T arg) { return functions::log10(arg); }\n\t\tinline expr log10(half arg) { return functions::log10(arg); }\n\t\tinline expr log10(expr arg) { return functions::log10(arg); }\n\n\t\t/// Natural logorithm.\n\t\t/// \\param arg function argument\n\t\t/// \\return logarithm of \\a arg plus 1 to base e\n//\t\ttemplate<typename T> typename enable<expr,T>::type log1p(T arg) { return functions::log1p(arg); }\n\t\tinline expr log1p(half arg) { return functions::log1p(arg); }\n\t\tinline expr log1p(expr arg) { return functions::log1p(arg); }\n\n\t\t/// Binary logorithm.\n\t\t/// \\param arg function argument\n\t\t/// \\return logarithm of \\a arg to base 2\n//\t\ttemplate<typename T> typename enable<expr,T>::type log2(T arg) { return functions::log2(arg); }\n\t\tinline expr log2(half arg) { return functions::log2(arg); }\n\t\tinline expr log2(expr arg) { return functions::log2(arg); }\n\n\t\t/// \\}\n\t\t/// \\name Power functions\n\t\t/// \\{\n\n\t\t/// Square root.\n\t\t/// \\param arg function argument\n\t\t/// \\return square root of \\a arg\n//\t\ttemplate<typename T> typename enable<expr,T>::type sqrt(T arg) { return functions::sqrt(arg); }\n\t\tinline expr sqrt(half arg) { return functions::sqrt(arg); }\n\t\tinline expr sqrt(expr arg) { return functions::sqrt(arg); }\n\n\t\t/// Cubic root.\n\t\t/// \\param arg function argument\n\t\t/// \\return cubic root of \\a arg\n//\t\ttemplate<typename T> typename enable<expr,T>::type cbrt(T arg) { return functions::cbrt(arg); }\n\t\tinline expr cbrt(half arg) { return functions::cbrt(arg); }\n\t\tinline expr cbrt(expr arg) { return functions::cbrt(arg); }\n\n\t\t/// Hypotenuse function.\n\t\t/// \\param x first argument\n\t\t/// \\param y second argument\n\t\t/// \\return square root of sum of squares without internal over- or underflows\n//\t\ttemplate<typename T,typename U> typename enable<expr,T,U>::type hypot(T x, U y) { return functions::hypot(x, y); }\n\t\tinline expr hypot(half x, half y) { return functions::hypot(x, y); }\n\t\tinline expr hypot(half x, expr y) { return functions::hypot(x, y); }\n\t\tinline expr hypot(expr x, half y) { return functions::hypot(x, y); }\n\t\tinline expr hypot(expr x, expr y) { return functions::hypot(x, y); }\n\n\t\t/// Power function.\n\t\t/// \\param base first argument\n\t\t/// \\param exp second argument\n\t\t/// \\return \\a base raised to \\a exp\n//\t\ttemplate<typename T,typename U> typename enable<expr,T,U>::type pow(T base, U exp) { return functions::pow(base, exp); }\n\t\tinline expr pow(half base, half exp) { return functions::pow(base, exp); }\n\t\tinline expr pow(half base, expr exp) { return functions::pow(base, exp); }\n\t\tinline expr pow(expr base, half exp) { return functions::pow(base, exp); }\n\t\tinline expr pow(expr base, expr exp) { return functions::pow(base, exp); }\n\n\t\t/// \\}\n\t\t/// \\name Trigonometric functions\n\t\t/// \\{\n\n\t\t/// Sine function.\n\t\t/// \\param arg function argument\n\t\t/// \\return sine value of \\a arg\n//\t\ttemplate<typename T> typename enable<expr,T>::type sin(T arg) { return functions::sin(arg); }\n\t\tinline expr sin(half arg) { return functions::sin(arg); }\n\t\tinline expr sin(expr arg) { return functions::sin(arg); }\n\n\t\t/// Cosine function.\n\t\t/// \\param arg function argument\n\t\t/// \\return cosine value of \\a arg\n//\t\ttemplate<typename T> typename enable<expr,T>::type cos(T arg) { return functions::cos(arg); }\n\t\tinline expr cos(half arg) { return functions::cos(arg); }\n\t\tinline expr cos(expr arg) { return functions::cos(arg); }\n\n\t\t/// Tangent function.\n\t\t/// \\param arg function argument\n\t\t/// \\return tangent value of \\a arg\n//\t\ttemplate<typename T> typename enable<expr,T>::type tan(T arg) { return functions::tan(arg); }\n\t\tinline expr tan(half arg) { return functions::tan(arg); }\n\t\tinline expr tan(expr arg) { return functions::tan(arg); }\n\n\t\t/// Arc sine.\n\t\t/// \\param arg function argument\n\t\t/// \\return arc sine value of \\a arg\n//\t\ttemplate<typename T> typename enable<expr,T>::type asin(T arg) { return functions::asin(arg); }\n\t\tinline expr asin(half arg) { return functions::asin(arg); }\n\t\tinline expr asin(expr arg) { return functions::asin(arg); }\n\n\t\t/// Arc cosine function.\n\t\t/// \\param arg function argument\n\t\t/// \\return arc cosine value of \\a arg\n//\t\ttemplate<typename T> typename enable<expr,T>::type acos(T arg) { return functions::acos(arg); }\n\t\tinline expr acos(half arg) { return functions::acos(arg); }\n\t\tinline expr acos(expr arg) { return functions::acos(arg); }\n\n\t\t/// Arc tangent function.\n\t\t/// \\param arg function argument\n\t\t/// \\return arc tangent value of \\a arg\n//\t\ttemplate<typename T> typename enable<expr,T>::type atan(T arg) { return functions::atan(arg); }\n\t\tinline expr atan(half arg) { return functions::atan(arg); }\n\t\tinline expr atan(expr arg) { return functions::atan(arg); }\n\n\t\t/// Arc tangent function.\n\t\t/// \\param x first argument\n\t\t/// \\param y second argument\n\t\t/// \\return arc tangent value\n//\t\ttemplate<typename T,typename U> typename enable<expr,T,U>::type atan2(T x, U y) { return functions::atan2(x, y); }\n\t\tinline expr atan2(half x, half y) { return functions::atan2(x, y); }\n\t\tinline expr atan2(half x, expr y) { return functions::atan2(x, y); }\n\t\tinline expr atan2(expr x, half y) { return functions::atan2(x, y); }\n\t\tinline expr atan2(expr x, expr y) { return functions::atan2(x, y); }\n\n\t\t/// \\}\n\t\t/// \\name Hyperbolic functions\n\t\t/// \\{\n\n\t\t/// Hyperbolic sine.\n\t\t/// \\param arg function argument\n\t\t/// \\return hyperbolic sine value of \\a arg\n//\t\ttemplate<typename T> typename enable<expr,T>::type sinh(T arg) { return functions::sinh(arg); }\n\t\tinline expr sinh(half arg) { return functions::sinh(arg); }\n\t\tinline expr sinh(expr arg) { return functions::sinh(arg); }\n\n\t\t/// Hyperbolic cosine.\n\t\t/// \\param arg function argument\n\t\t/// \\return hyperbolic cosine value of \\a arg\n//\t\ttemplate<typename T> typename enable<expr,T>::type cosh(T arg) { return functions::cosh(arg); }\n\t\tinline expr cosh(half arg) { return functions::cosh(arg); }\n\t\tinline expr cosh(expr arg) { return functions::cosh(arg); }\n\n\t\t/// Hyperbolic tangent.\n\t\t/// \\param arg function argument\n\t\t/// \\return hyperbolic tangent value of \\a arg\n//\t\ttemplate<typename T> typename enable<expr,T>::type tanh(T arg) { return functions::tanh(arg); }\n\t\tinline expr tanh(half arg) { return functions::tanh(arg); }\n\t\tinline expr tanh(expr arg) { return functions::tanh(arg); }\n\n\t\t/// Hyperbolic area sine.\n\t\t/// \\param arg function argument\n\t\t/// \\return area sine value of \\a arg\n//\t\ttemplate<typename T> typename enable<expr,T>::type asinh(T arg) { return functions::asinh(arg); }\n\t\tinline expr asinh(half arg) { return functions::asinh(arg); }\n\t\tinline expr asinh(expr arg) { return functions::asinh(arg); }\n\n\t\t/// Hyperbolic area cosine.\n\t\t/// \\param arg function argument\n\t\t/// \\return area cosine value of \\a arg\n//\t\ttemplate<typename T> typename enable<expr,T>::type acosh(T arg) { return functions::acosh(arg); }\n\t\tinline expr acosh(half arg) { return functions::acosh(arg); }\n\t\tinline expr acosh(expr arg) { return functions::acosh(arg); }\n\n\t\t/// Hyperbolic area tangent.\n\t\t/// \\param arg function argument\n\t\t/// \\return area tangent value of \\a arg\n//\t\ttemplate<typename T> typename enable<expr,T>::type atanh(T arg) { return functions::atanh(arg); }\n\t\tinline expr atanh(half arg) { return functions::atanh(arg); }\n\t\tinline expr atanh(expr arg) { return functions::atanh(arg); }\n\n\t\t/// \\}\n\t\t/// \\name Error and gamma functions\n\t\t/// \\{\n\n\t\t/// Error function.\n\t\t/// \\param arg function argument\n\t\t/// \\return error function value of \\a arg\n//\t\ttemplate<typename T> typename enable<expr,T>::type erf(T arg) { return functions::erf(arg); }\n\t\tinline expr erf(half arg) { return functions::erf(arg); }\n\t\tinline expr erf(expr arg) { return functions::erf(arg); }\n\n\t\t/// Complementary error function.\n\t\t/// \\param arg function argument\n\t\t/// \\return 1 minus error function value of \\a arg\n//\t\ttemplate<typename T> typename enable<expr,T>::type erfc(T arg) { return functions::erfc(arg); }\n\t\tinline expr erfc(half arg) { return functions::erfc(arg); }\n\t\tinline expr erfc(expr arg) { return functions::erfc(arg); }\n\n\t\t/// Natural logarithm of gamma function.\n\t\t/// \\param arg function argument\n\t\t/// \\return natural logarith of gamma function for \\a arg\n//\t\ttemplate<typename T> typename enable<expr,T>::type lgamma(T arg) { return functions::lgamma(arg); }\n\t\tinline expr lgamma(half arg) { return functions::lgamma(arg); }\n\t\tinline expr lgamma(expr arg) { return functions::lgamma(arg); }\n\n\t\t/// Gamma function.\n\t\t/// \\param arg function argument\n\t\t/// \\return gamma function value of \\a arg\n//\t\ttemplate<typename T> typename enable<expr,T>::type tgamma(T arg) { return functions::tgamma(arg); }\n\t\tinline expr tgamma(half arg) { return functions::tgamma(arg); }\n\t\tinline expr tgamma(expr arg) { return functions::tgamma(arg); }\n\n\t\t/// \\}\n\t\t/// \\name Rounding\n\t\t/// \\{\n\n\t\t/// Nearest integer not less than half value.\n\t\t/// \\param arg half to round\n\t\t/// \\return nearest integer not less than \\a arg\n//\t\ttemplate<typename T> typename enable<half,T>::type ceil(T arg) { return functions::ceil(arg); }\n\t\tinline half ceil(half arg) { return functions::ceil(arg); }\n\t\tinline half ceil(expr arg) { return functions::ceil(arg); }\n\n\t\t/// Nearest integer not greater than half value.\n\t\t/// \\param arg half to round\n\t\t/// \\return nearest integer not greater than \\a arg\n//\t\ttemplate<typename T> typename enable<half,T>::type floor(T arg) { return functions::floor(arg); }\n\t\tinline half floor(half arg) { return functions::floor(arg); }\n\t\tinline half floor(expr arg) { return functions::floor(arg); }\n\n\t\t/// Nearest integer not greater in magnitude than half value.\n\t\t/// \\param arg half to round\n\t\t/// \\return nearest integer not greater in magnitude than \\a arg\n//\t\ttemplate<typename T> typename enable<half,T>::type trunc(T arg) { return functions::trunc(arg); }\n\t\tinline half trunc(half arg) { return functions::trunc(arg); }\n\t\tinline half trunc(expr arg) { return functions::trunc(arg); }\n\n\t\t/// Nearest integer.\n\t\t/// \\param arg half to round\n\t\t/// \\return nearest integer, rounded away from zero in half-way cases\n//\t\ttemplate<typename T> typename enable<half,T>::type round(T arg) { return functions::round(arg); }\n\t\tinline half round(half arg) { return functions::round(arg); }\n\t\tinline half round(expr arg) { return functions::round(arg); }\n\n\t\t/// Nearest integer.\n\t\t/// \\param arg half to round\n\t\t/// \\return nearest integer, rounded away from zero in half-way cases\n//\t\ttemplate<typename T> typename enable<long,T>::type lround(T arg) { return functions::lround(arg); }\n\t\tinline long lround(half arg) { return functions::lround(arg); }\n\t\tinline long lround(expr arg) { return functions::lround(arg); }\n\n\t\t/// Nearest integer using half's internal rounding mode.\n\t\t/// \\param arg half expression to round\n\t\t/// \\return nearest integer using default rounding mode\n//\t\ttemplate<typename T> typename enable<half,T>::type nearbyint(T arg) { return functions::nearbyint(arg); }\n\t\tinline half nearbyint(half arg) { return functions::rint(arg); }\n\t\tinline half nearbyint(expr arg) { return functions::rint(arg); }\n\n\t\t/// Nearest integer using half's internal rounding mode.\n\t\t/// \\param arg half expression to round\n\t\t/// \\return nearest integer using default rounding mode\n//\t\ttemplate<typename T> typename enable<half,T>::type rint(T arg) { return functions::rint(arg); }\n\t\tinline half rint(half arg) { return functions::rint(arg); }\n\t\tinline half rint(expr arg) { return functions::rint(arg); }\n\n\t\t/// Nearest integer using half's internal rounding mode.\n\t\t/// \\param arg half expression to round\n\t\t/// \\return nearest integer using default rounding mode\n//\t\ttemplate<typename T> typename enable<long,T>::type lrint(T arg) { return functions::lrint(arg); }\n\t\tinline long lrint(half arg) { return functions::lrint(arg); }\n\t\tinline long lrint(expr arg) { return functions::lrint(arg); }\n\t#if HALF_ENABLE_CPP11_LONG_LONG\n\t\t/// Nearest integer.\n\t\t/// \\param arg half to round\n\t\t/// \\return nearest integer, rounded away from zero in half-way cases\n//\t\ttemplate<typename T> typename enable<long long,T>::type llround(T arg) { return functions::llround(arg); }\n\t\tinline long long llround(half arg) { return functions::llround(arg); }\n\t\tinline long long llround(expr arg) { return functions::llround(arg); }\n\n\t\t/// Nearest integer using half's internal rounding mode.\n\t\t/// \\param arg half expression to round\n\t\t/// \\return nearest integer using default rounding mode\n//\t\ttemplate<typename T> typename enable<long long,T>::type llrint(T arg) { return functions::llrint(arg); }\n\t\tinline long long llrint(half arg) { return functions::llrint(arg); }\n\t\tinline long long llrint(expr arg) { return functions::llrint(arg); }\n\t#endif\n\n\t\t/// \\}\n\t\t/// \\name Floating point manipulation\n\t\t/// \\{\n\n\t\t/// Decompress floating point number.\n\t\t/// \\param arg number to decompress\n\t\t/// \\param exp address to store exponent at\n\t\t/// \\return significant in range [0.5, 1)\n//\t\ttemplate<typename T> typename enable<half,T>::type frexp(T arg, int *exp) { return functions::frexp(arg, exp); }\n\t\tinline half frexp(half arg, int *exp) { return functions::frexp(arg, exp); }\n\t\tinline half frexp(expr arg, int *exp) { return functions::frexp(arg, exp); }\n\n\t\t/// Multiply by power of two.\n\t\t/// \\param arg number to modify\n\t\t/// \\param exp power of two to multiply with\n\t\t/// \\return \\a arg multplied by 2 raised to \\a exp\n//\t\ttemplate<typename T> typename enable<half,T>::type ldexp(T arg, int exp) { return functions::scalbln(arg, exp); }\n\t\tinline half ldexp(half arg, int exp) { return functions::scalbln(arg, exp); }\n\t\tinline half ldexp(expr arg, int exp) { return functions::scalbln(arg, exp); }\n\n\t\t/// Extract integer and fractional parts.\n\t\t/// \\param arg number to decompress\n\t\t/// \\param iptr address to store integer part at\n\t\t/// \\return fractional part\n//\t\ttemplate<typename T> typename enable<half,T>::type modf(T arg, half *iptr) { return functions::modf(arg, iptr); }\n\t\tinline half modf(half arg, half *iptr) { return functions::modf(arg, iptr); }\n\t\tinline half modf(expr arg, half *iptr) { return functions::modf(arg, iptr); }\n\n\t\t/// Multiply by power of two.\n\t\t/// \\param arg number to modify\n\t\t/// \\param exp power of two to multiply with\n\t\t/// \\return \\a arg multplied by 2 raised to \\a exp\n//\t\ttemplate<typename T> typename enable<half,T>::type scalbn(T arg, int exp) { return functions::scalbln(arg, exp); }\n\t\tinline half scalbn(half arg, int exp) { return functions::scalbln(arg, exp); }\n\t\tinline half scalbn(expr arg, int exp) { return functions::scalbln(arg, exp); }\n\n\t\t/// Multiply by power of two.\n\t\t/// \\param arg number to modify\n\t\t/// \\param exp power of two to multiply with\n\t\t/// \\return \\a arg multplied by 2 raised to \\a exp\t\n//\t\ttemplate<typename T> typename enable<half,T>::type scalbln(T arg, long exp) { return functions::scalbln(arg, exp); }\n\t\tinline half scalbln(half arg, long exp) { return functions::scalbln(arg, exp); }\n\t\tinline half scalbln(expr arg, long exp) { return functions::scalbln(arg, exp); }\n\n\t\t/// Extract exponent.\n\t\t/// \\param arg number to query\n\t\t/// \\return floating point exponent\n\t\t/// \\retval FP_ILOGB0 for zero\n\t\t/// \\retval FP_ILOGBNAN for NaN\n\t\t/// \\retval MAX_INT for infinity\n//\t\ttemplate<typename T> typename enable<int,T>::type ilogb(T arg) { return functions::ilogb(arg); }\n\t\tinline int ilogb(half arg) { return functions::ilogb(arg); }\n\t\tinline int ilogb(expr arg) { return functions::ilogb(arg); }\n\n\t\t/// Extract exponent.\n\t\t/// \\param arg number to query\n\t\t/// \\return floating point exponent\n//\t\ttemplate<typename T> typename enable<half,T>::type logb(T arg) { return functions::logb(arg); }\n\t\tinline half logb(half arg) { return functions::logb(arg); }\n\t\tinline half logb(expr arg) { return functions::logb(arg); }\n\n\t\t/// Next representable value.\n\t\t/// \\param from value to compute next representable value for\n\t\t/// \\param to direction towards which to compute next value\n\t\t/// \\return next representable value after \\a from in direction towards \\a to\n//\t\ttemplate<typename T,typename U> typename enable<half,T,U>::type nextafter(T from, U to) { return functions::nextafter(from, to); }\n\t\tinline half nextafter(half from, half to) { return functions::nextafter(from, to); }\n\t\tinline half nextafter(half from, expr to) { return functions::nextafter(from, to); }\n\t\tinline half nextafter(expr from, half to) { return functions::nextafter(from, to); }\n\t\tinline half nextafter(expr from, expr to) { return functions::nextafter(from, to); }\n\n\t\t/// Next representable value.\n\t\t/// \\param from value to compute next representable value for\n\t\t/// \\param to direction towards which to compute next value\n\t\t/// \\return next representable value after \\a from in direction towards \\a to\n//\t\ttemplate<typename T> typename enable<half,T>::type nexttoward(T from, long double to) { return functions::nexttoward(from, to); }\n\t\tinline half nexttoward(half from, long double to) { return functions::nexttoward(from, to); }\n\t\tinline half nexttoward(expr from, long double to) { return functions::nexttoward(from, to); }\n\n\t\t/// Take sign.\n\t\t/// \\param x value to change sign for\n\t\t/// \\param y value to take sign from\n\t\t/// \\return value equal to \\a x in magnitude and to \\a y in sign\n//\t\ttemplate<typename T,typename U> typename enable<half,T,U>::type copysign(T x, U y) { return functions::copysign(x, y); }\n\t\tinline half copysign(half x, half y) { return functions::copysign(x, y); }\n\t\tinline half copysign(half x, expr y) { return functions::copysign(x, y); }\n\t\tinline half copysign(expr x, half y) { return functions::copysign(x, y); }\n\t\tinline half copysign(expr x, expr y) { return functions::copysign(x, y); }\n\n\t\t/// \\}\n\t\t/// \\name Floating point classification\n\t\t/// \\{\n\n\n\t\t/// Classify floating point value.\n\t\t/// \\param arg number to classify\n\t\t/// \\retval FP_ZERO for positive and negative zero\n\t\t/// \\retval FP_SUBNORMAL for subnormal numbers\n\t\t/// \\retval FP_INFINITY for positive and negative infinity\n\t\t/// \\retval FP_NAN for NaNs\n\t\t/// \\retval FP_NORMAL for all other (normal) values\n//\t\ttemplate<typename T> typename enable<int,T>::type fpclassify(T arg) { return functions::fpclassify(arg); }\n\t\tinline int fpclassify(half arg) { return functions::fpclassify(arg); }\n\t\tinline int fpclassify(expr arg) { return functions::fpclassify(arg); }\n\n\t\t/// Check if finite number.\n\t\t/// \\param arg number to check\n\t\t/// \\retval true if neither infinity nor NaN\n\t\t/// \\retval false else\n//\t\ttemplate<typename T> typename enable<bool,T>::type isfinite(T arg) { return functions::isfinite(arg); }\n\t\tinline bool isfinite(half arg) { return functions::isfinite(arg); }\n\t\tinline bool isfinite(expr arg) { return functions::isfinite(arg); }\n\n\t\t/// Check for infinity.\n\t\t/// \\param arg number to check\n\t\t/// \\retval true for positive or negative infinity\n\t\t/// \\retval false else\n//\t\ttemplate<typename T> typename enable<bool,T>::type isinf(T arg) { return functions::isinf(arg); }\n\t\tinline bool isinf(half arg) { return functions::isinf(arg); }\n\t\tinline bool isinf(expr arg) { return functions::isinf(arg); }\n\n\t\t/// Check for NaN.\n\t\t/// \\param arg number to check\n\t\t/// \\retval true for NaNs\n\t\t/// \\retval false else\n//\t\ttemplate<typename T> typename enable<bool,T>::type isnan(T arg) { return functions::isnan(arg); }\n\t\tinline bool isnan(half arg) { return functions::isnan(arg); }\n\t\tinline bool isnan(expr arg) { return functions::isnan(arg); }\n\n\t\t/// Check if normal number.\n\t\t/// \\param arg number to check\n\t\t/// \\retval true if normal number\n\t\t/// \\retval false if either subnormal, zero, infinity or NaN\n//\t\ttemplate<typename T> typename enable<bool,T>::type isnormal(T arg) { return functions::isnormal(arg); }\n\t\tinline bool isnormal(half arg) { return functions::isnormal(arg); }\n\t\tinline bool isnormal(expr arg) { return functions::isnormal(arg); }\n\n\t\t/// Check sign.\n\t\t/// \\param arg number to check\n\t\t/// \\retval true for negative number\n\t\t/// \\retval false for positive number\n//\t\ttemplate<typename T> typename enable<bool,T>::type signbit(T arg) { return functions::signbit(arg); }\n\t\tinline bool signbit(half arg) { return functions::signbit(arg); }\n\t\tinline bool signbit(expr arg) { return functions::signbit(arg); }\n\n\t\t/// \\}\n\t\t/// \\name Comparison\n\t\t/// \\{\n\n\t\t/// Comparison for greater than.\n\t\t/// \\param x first operand\n\t\t/// \\param y second operand\n\t\t/// \\retval true if \\a x greater than \\a y\n\t\t/// \\retval false else\n//\t\ttemplate<typename T,typename U> typename enable<bool,T,U>::type isgreater(T x, U y) { return functions::isgreater(x, y); }\n\t\tinline bool isgreater(half x, half y) { return functions::isgreater(x, y); }\n\t\tinline bool isgreater(half x, expr y) { return functions::isgreater(x, y); }\n\t\tinline bool isgreater(expr x, half y) { return functions::isgreater(x, y); }\n\t\tinline bool isgreater(expr x, expr y) { return functions::isgreater(x, y); }\n\n\t\t/// Comparison for greater equal.\n\t\t/// \\param x first operand\n\t\t/// \\param y second operand\n\t\t/// \\retval true if \\a x greater equal \\a y\n\t\t/// \\retval false else\n//\t\ttemplate<typename T,typename U> typename enable<bool,T,U>::type isgreaterequal(T x, U y) { return functions::isgreaterequal(x, y); }\n\t\tinline bool isgreaterequal(half x, half y) { return functions::isgreaterequal(x, y); }\n\t\tinline bool isgreaterequal(half x, expr y) { return functions::isgreaterequal(x, y); }\n\t\tinline bool isgreaterequal(expr x, half y) { return functions::isgreaterequal(x, y); }\n\t\tinline bool isgreaterequal(expr x, expr y) { return functions::isgreaterequal(x, y); }\n\n\t\t/// Comparison for less than.\n\t\t/// \\param x first operand\n\t\t/// \\param y second operand\n\t\t/// \\retval true if \\a x less than \\a y\n\t\t/// \\retval false else\n//\t\ttemplate<typename T,typename U> typename enable<bool,T,U>::type isless(T x, U y) { return functions::isless(x, y); }\n\t\tinline bool isless(half x, half y) { return functions::isless(x, y); }\n\t\tinline bool isless(half x, expr y) { return functions::isless(x, y); }\n\t\tinline bool isless(expr x, half y) { return functions::isless(x, y); }\n\t\tinline bool isless(expr x, expr y) { return functions::isless(x, y); }\n\n\t\t/// Comparison for less equal.\n\t\t/// \\param x first operand\n\t\t/// \\param y second operand\n\t\t/// \\retval true if \\a x less equal \\a y\n\t\t/// \\retval false else\n//\t\ttemplate<typename T,typename U> typename enable<bool,T,U>::type islessequal(T x, U y) { return functions::islessequal(x, y); }\n\t\tinline bool islessequal(half x, half y) { return functions::islessequal(x, y); }\n\t\tinline bool islessequal(half x, expr y) { return functions::islessequal(x, y); }\n\t\tinline bool islessequal(expr x, half y) { return functions::islessequal(x, y); }\n\t\tinline bool islessequal(expr x, expr y) { return functions::islessequal(x, y); }\n\n\t\t/// Comarison for less or greater.\n\t\t/// \\param x first operand\n\t\t/// \\param y second operand\n\t\t/// \\retval true if either less or greater\n\t\t/// \\retval false else\n//\t\ttemplate<typename T,typename U> typename enable<bool,T,U>::type islessgreater(T x, U y) { return functions::islessgreater(x, y); }\n\t\tinline bool islessgreater(half x, half y) { return functions::islessgreater(x, y); }\n\t\tinline bool islessgreater(half x, expr y) { return functions::islessgreater(x, y); }\n\t\tinline bool islessgreater(expr x, half y) { return functions::islessgreater(x, y); }\n\t\tinline bool islessgreater(expr x, expr y) { return functions::islessgreater(x, y); }\n\n\t\t/// Check if unordered.\n\t\t/// \\param x first operand\n\t\t/// \\param y second operand\n\t\t/// \\retval true if unordered (one or two NaN operands)\n\t\t/// \\retval false else\n//\t\ttemplate<typename T,typename U> typename enable<bool,T,U>::type isunordered(T x, U y) { return functions::isunordered(x, y); }\n\t\tinline bool isunordered(half x, half y) { return functions::isunordered(x, y); }\n\t\tinline bool isunordered(half x, expr y) { return functions::isunordered(x, y); }\n\t\tinline bool isunordered(expr x, half y) { return functions::isunordered(x, y); }\n\t\tinline bool isunordered(expr x, expr y) { return functions::isunordered(x, y); }\n\n\t\t/// \\name Casting\n\t\t/// \\{\n\n\t\t/// Cast to or from half-precision floating point number.\n\t\t/// This casts between [half](\\ref half_float::half) and any built-in arithmetic type. Floating point types are \n\t\t/// converted via an explicit cast to/from `float` (using the rounding mode of the built-in single precision \n\t\t/// implementation) and thus any possible warnings due to an otherwise implicit conversion to/from `float` will be \n\t\t/// suppressed. Integer types are converted directly using the given rounding mode, without any roundtrip over `float` \n\t\t/// that a `static_cast` would otherwise do. It uses the default rounding mode.\n\t\t///\n\t\t/// Using this cast with neither of the two types being a [half](\\ref half_float::half) or with any of the two types \n\t\t/// not being a built-in arithmetic type (apart from [half](\\ref half_float::half), of course) results in a compiler \n\t\t/// error and casting between [half](\\ref half_float::half)s is just a no-op.\n\t\t/// \\tparam T destination type (half or built-in arithmetic type)\n\t\t/// \\tparam U source type (half or built-in arithmetic type)\n\t\t/// \\param arg value to cast\n\t\t/// \\return \\a arg converted to destination type\n\t\ttemplate<typename T,typename U> typename half_caster<T,U>::type half_cast(U arg) { return half_caster<T,U>::cast(arg); }\n\n\t\t/// Cast to or from half-precision floating point number.\n\t\t/// This casts between [half](\\ref half_float::half) and any built-in arithmetic type. Floating point types are \n\t\t/// converted via an explicit cast to/from `float` (using the rounding mode of the built-in single precision \n\t\t/// implementation) and thus any possible warnings due to an otherwise implicit conversion to/from `float` will be \n\t\t/// suppressed. Integer types are converted directly using the given rounding mode, without any roundtrip over `float` \n\t\t/// that a `static_cast` would otherwise do.\n\t\t///\n\t\t/// Using this cast with neither of the two types being a [half](\\ref half_float::half) or with any of the two types \n\t\t/// not being a built-in arithmetic type (apart from [half](\\ref half_float::half), of course) results in a compiler \n\t\t/// error and casting between [half](\\ref half_float::half)s is just a no-op.\n\t\t/// \\tparam T destination type (half or built-in arithmetic type)\n\t\t/// \\tparam R rounding mode to use.\n\t\t/// \\tparam U source type (half or built-in arithmetic type)\n\t\t/// \\param arg value to cast\n\t\t/// \\return \\a arg converted to destination type\n\t\ttemplate<typename T,std::float_round_style R,typename U> typename half_caster<T,U,R>::type half_cast(U arg)\n\t\t\t{ return half_caster<T,U,R>::cast(arg); }\n\t\t/// \\}\n\t}\n\n\tusing detail::operator==;\n\tusing detail::operator!=;\n\tusing detail::operator<;\n\tusing detail::operator>;\n\tusing detail::operator<=;\n\tusing detail::operator>=;\n\tusing detail::operator+;\n\tusing detail::operator-;\n\tusing detail::operator*;\n\tusing detail::operator/;\n\tusing detail::operator<<;\n\tusing detail::operator>>;\n\n\tusing detail::abs;\n\tusing detail::fabs;\n\tusing detail::fmod;\n\tusing detail::remainder;\n\tusing detail::remquo;\n\tusing detail::fma;\n\tusing detail::fmax;\n\tusing detail::fmin;\n\tusing detail::fdim;\n\tusing detail::nanh;\n\tusing detail::exp;\n\tusing detail::expm1;\n\tusing detail::exp2;\n\tusing detail::log;\n\tusing detail::log10;\n\tusing detail::log1p;\n\tusing detail::log2;\n\tusing detail::sqrt;\n\tusing detail::cbrt;\n\tusing detail::hypot;\n\tusing detail::pow;\n\tusing detail::sin;\n\tusing detail::cos;\n\tusing detail::tan;\n\tusing detail::asin;\n\tusing detail::acos;\n\tusing detail::atan;\n\tusing detail::atan2;\n\tusing detail::sinh;\n\tusing detail::cosh;\n\tusing detail::tanh;\n\tusing detail::asinh;\n\tusing detail::acosh;\n\tusing detail::atanh;\n\tusing detail::erf;\n\tusing detail::erfc;\n\tusing detail::lgamma;\n\tusing detail::tgamma;\n\tusing detail::ceil;\n\tusing detail::floor;\n\tusing detail::trunc;\n\tusing detail::round;\n\tusing detail::lround;\n\tusing detail::nearbyint;\n\tusing detail::rint;\n\tusing detail::lrint;\n#if HALF_ENABLE_CPP11_LONG_LONG\n\tusing detail::llround;\n\tusing detail::llrint;\n#endif\n\tusing detail::frexp;\n\tusing detail::ldexp;\n\tusing detail::modf;\n\tusing detail::scalbn;\n\tusing detail::scalbln;\n\tusing detail::ilogb;\n\tusing detail::logb;\n\tusing detail::nextafter;\n\tusing detail::nexttoward;\n\tusing detail::copysign;\n\tusing detail::fpclassify;\n\tusing detail::isfinite;\n\tusing detail::isinf;\n\tusing detail::isnan;\n\tusing detail::isnormal;\n\tusing detail::signbit;\n\tusing detail::isgreater;\n\tusing detail::isgreaterequal;\n\tusing detail::isless;\n\tusing detail::islessequal;\n\tusing detail::islessgreater;\n\tusing detail::isunordered;\n\n\tusing detail::half_cast;\n}\n\n\n/// Extensions to the C++ standard library.\nnamespace std\n{\n\t/// Numeric limits for half-precision floats.\n\t/// Because of the underlying single-precision implementation of many operations, it inherits some properties from \n\t/// `std::numeric_limits<float>`.\n\ttemplate<> class numeric_limits<half_float::half> : public numeric_limits<float>\n\t{\n\tpublic:\n\t\t/// Supports signed values.\n\t\tstatic HALF_CONSTEXPR_CONST bool is_signed = true;\n\n\t\t/// Is not exact.\n\t\tstatic HALF_CONSTEXPR_CONST bool is_exact = false;\n\n\t\t/// Doesn't provide modulo arithmetic.\n\t\tstatic HALF_CONSTEXPR_CONST bool is_modulo = false;\n\n\t\t/// IEEE conformant.\n\t\tstatic HALF_CONSTEXPR_CONST bool is_iec559 = true;\n\n\t\t/// Supports infinity.\n\t\tstatic HALF_CONSTEXPR_CONST bool has_infinity = true;\n\n\t\t/// Supports quiet NaNs.\n\t\tstatic HALF_CONSTEXPR_CONST bool has_quiet_NaN = true;\n\n\t\t/// Supports subnormal values.\n\t\tstatic HALF_CONSTEXPR_CONST float_denorm_style has_denorm = denorm_present;\n\n\t\t/// Rounding mode.\n\t\t/// Due to the mix of internal single-precision computations (using the rounding mode of the underlying \n\t\t/// single-precision implementation) with explicit truncation of the single-to-half conversions, the actual rounding \n\t\t/// mode is indeterminate.\n\t\tstatic HALF_CONSTEXPR_CONST float_round_style round_style = (std::numeric_limits<float>::round_style==\n\t\t\thalf_float::half::round_style) ? half_float::half::round_style : round_indeterminate;\n\n\t\t/// Significant digits.\n\t\tstatic HALF_CONSTEXPR_CONST int digits = 11;\n\n\t\t/// Significant decimal digits.\n\t\tstatic HALF_CONSTEXPR_CONST int digits10 = 3;\n\n\t\t/// Required decimal digits to represent all possible values.\n\t\tstatic HALF_CONSTEXPR_CONST int max_digits10 = 5;\n\n\t\t/// Number base.\n\t\tstatic HALF_CONSTEXPR_CONST int radix = 2;\n\n\t\t/// One more than smallest exponent.\n\t\tstatic HALF_CONSTEXPR_CONST int min_exponent = -13;\n\n\t\t/// Smallest normalized representable power of 10.\n\t\tstatic HALF_CONSTEXPR_CONST int min_exponent10 = -4;\n\n\t\t/// One more than largest exponent\n\t\tstatic HALF_CONSTEXPR_CONST int max_exponent = 16;\n\n\t\t/// Largest finitely representable power of 10.\n\t\tstatic HALF_CONSTEXPR_CONST int max_exponent10 = 4;\n\n\t\t/// Smallest positive normal value.\n\t\tstatic HALF_CONSTEXPR half_float::half min() HALF_NOTHROW { return half_float::half(half_float::detail::binary, 0x0400); }\n\n\t\t/// Smallest finite value.\n\t\tstatic HALF_CONSTEXPR half_float::half lowest() HALF_NOTHROW { return half_float::half(half_float::detail::binary, 0xFBFF); }\n\n\t\t/// Largest finite value.\n\t\tstatic HALF_CONSTEXPR half_float::half max() HALF_NOTHROW { return half_float::half(half_float::detail::binary, 0x7BFF); }\n\n\t\t/// Difference between one and next representable value.\n\t\tstatic HALF_CONSTEXPR half_float::half epsilon() HALF_NOTHROW { return half_float::half(half_float::detail::binary, 0x1400); }\n\n\t\t/// Maximum rounding error.\n\t\tstatic HALF_CONSTEXPR half_float::half round_error() HALF_NOTHROW\n\t\t\t{ return half_float::half(half_float::detail::binary, (round_style==std::round_to_nearest) ? 0x3800 : 0x3C00); }\n\n\t\t/// Positive infinity.\n\t\tstatic HALF_CONSTEXPR half_float::half infinity() HALF_NOTHROW { return half_float::half(half_float::detail::binary, 0x7C00); }\n\n\t\t/// Quiet NaN.\n\t\tstatic HALF_CONSTEXPR half_float::half quiet_NaN() HALF_NOTHROW { return half_float::half(half_float::detail::binary, 0x7FFF); }\n\n\t\t/// Signalling NaN.\n\t\tstatic HALF_CONSTEXPR half_float::half signaling_NaN() HALF_NOTHROW { return half_float::half(half_float::detail::binary, 0x7DFF); }\n\n\t\t/// Smallest positive subnormal value.\n\t\tstatic HALF_CONSTEXPR half_float::half denorm_min() HALF_NOTHROW { return half_float::half(half_float::detail::binary, 0x0001); }\n\t};\n\n#if HALF_ENABLE_CPP11_HASH\n\t/// Hash function for half-precision floats.\n\t/// This is only defined if C++11 `std::hash` is supported and enabled.\n\ttemplate<> struct hash<half_float::half> //: unary_function<half_float::half,size_t>\n\t{\n\t\t/// Type of function argument.\n\t\ttypedef half_float::half argument_type;\n\n\t\t/// Function return type.\n\t\ttypedef size_t result_type;\n\n\t\t/// Compute hash function.\n\t\t/// \\param arg half to hash\n\t\t/// \\return hash value\n\t\tresult_type operator()(argument_type arg) const\n\t\t\t{ return hash<half_float::detail::uint16>()(static_cast<unsigned int>(arg.data_)&-(arg.data_!=0x8000)); }\n\t};\n#endif\n}\n\n\n#undef HALF_CONSTEXPR\n#undef HALF_CONSTEXPR_CONST\n#undef HALF_NOEXCEPT\n#undef HALF_NOTHROW\n#ifdef HALF_POP_WARNINGS\n\t#pragma warning(pop)\n\t#undef HALF_POP_WARNINGS\n#endif\n\n#endif\n"
  },
  {
    "path": "third_party/imgui.lua",
    "content": "group(\"third_party\")\nproject(\"imgui\")\n  uuid(\"ed9271c4-b0a1-42ef-8403-067b11bf49d0\")\n  kind(\"StaticLib\")\n  language(\"C++\")\n  links({\n  })\n  defines({\n    \"_LIB\",\n  })\n  includedirs({\n    \"imgui\",\n  })\n  files({\n    \"imgui/imconfig.h\",\n    \"imgui/imgui.cpp\",\n    \"imgui/imgui.h\",\n    \"imgui/imgui_draw.cpp\",\n    \"imgui/imgui_demo.cpp\",\n    \"imgui/imgui_internal.h\",\n    \"imgui/imgui_tables.cpp\",\n    \"imgui/imgui_widgets.cpp\",\n    \"imgui/imstb_rectpack.h\",\n    \"imgui/imstb_textedit.h\",\n    \"imgui/imstb_truetype.h\",\n  })\n"
  },
  {
    "path": "third_party/llvm/LICENSE.txt",
    "content": "==============================================================================\nLLVM Release License\n==============================================================================\nUniversity of Illinois/NCSA\nOpen Source License\n\nCopyright (c) 2003-2014 University of Illinois at Urbana-Champaign.\nAll rights reserved.\n\nDeveloped by:\n\n    LLVM Team\n\n    University of Illinois at Urbana-Champaign\n\n    http://llvm.org\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal with\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimers.\n\n    * Redistributions in binary form must reproduce the above copyright notice,\n      this list of conditions and the following disclaimers in the\n      documentation and/or other materials provided with the distribution.\n\n    * Neither the names of the LLVM Team, University of Illinois at\n      Urbana-Champaign, nor the names of its contributors may be used to\n      endorse or promote products derived from this Software without specific\n      prior written permission.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE\nCONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE\nSOFTWARE.\n\n==============================================================================\nCopyrights and Licenses for Third Party Software Distributed with LLVM:\n==============================================================================\nThe LLVM software contains code written by third parties.  Such software will\nhave its own individual LICENSE.TXT file in the directory in which it appears.\nThis file will describe the copyrights, license, and restrictions which apply\nto that code.\n\nThe disclaimer of warranty in the University of Illinois Open Source License\napplies to all code in the LLVM Distribution, and nothing in any of the\nother licenses gives permission to use the names of the LLVM Team or the\nUniversity of Illinois to endorse or promote products derived from this\nSoftware.\n\nThe following pieces of software have additional or alternate copyrights,\nlicenses, and/or restrictions:\n\nProgram             Directory\n-------             ---------\nAutoconf            llvm/autoconf\n                    llvm/projects/ModuleMaker/autoconf\n                    llvm/projects/sample/autoconf\nGoogle Test         llvm/utils/unittest/googletest\nOpenBSD regex       llvm/lib/Support/{reg*, COPYRIGHT.regex}\npyyaml tests        llvm/test/YAMLParser/{*.data, LICENSE.TXT}\nARM contributions   llvm/lib/Target/ARM/LICENSE.TXT\nmd5 contributions   llvm/lib/Support/MD5.cpp llvm/include/llvm/Support/MD5.h\n"
  },
  {
    "path": "third_party/llvm/dummy.cc",
    "content": "// here just to keep gyp happy\n"
  },
  {
    "path": "third_party/llvm/include/llvm/ADT/BitVector.h",
    "content": "//===- llvm/ADT/BitVector.h - Bit vectors -----------------------*- C++ -*-===//\n//\n//                     The LLVM Compiler Infrastructure\n//\n// This file is distributed under the University of Illinois Open Source\n// License. See LICENSE.TXT for details.\n//\n//===----------------------------------------------------------------------===//\n//\n// This file implements the BitVector class.\n//\n//===----------------------------------------------------------------------===//\n\n#ifndef LLVM_ADT_BITVECTOR_H\n#define LLVM_ADT_BITVECTOR_H\n\n#include \"llvm/Support/Compiler.h\"\n#ifdef LLVM_IGNORE_XENIA\n#include \"llvm/Support/ErrorHandling.h\"\n#else\n#define llvm_unreachable(msg) assert(false)\n#endif // LLVM_IGNORE_XENIA\n#include \"llvm/Support/MathExtras.h\"\n#include <algorithm>\n#include <cassert>\n#include <climits>\n#include <cstdlib>\n\nnamespace llvm {\n\nclass BitVector {\n  typedef unsigned long BitWord;\n\n  enum { BITWORD_SIZE = (unsigned)sizeof(BitWord) * CHAR_BIT };\n\n  BitWord  *Bits;        // Actual bits.\n  unsigned Size;         // Size of bitvector in bits.\n  unsigned Capacity;     // Size of allocated memory in BitWord.\n\npublic:\n  // Encapsulation of a single bit.\n  class reference {\n    friend class BitVector;\n\n    BitWord *WordRef;\n    unsigned BitPos;\n\n    reference();  // Undefined\n\n  public:\n    reference(BitVector &b, unsigned Idx) {\n      WordRef = &b.Bits[Idx / BITWORD_SIZE];\n      BitPos = Idx % BITWORD_SIZE;\n    }\n\n    ~reference() {}\n\n    reference &operator=(reference t) {\n      *this = bool(t);\n      return *this;\n    }\n\n    reference& operator=(bool t) {\n      if (t)\n        *WordRef |= 1L << BitPos;\n      else\n        *WordRef &= ~(1L << BitPos);\n      return *this;\n    }\n\n    operator bool() const {\n      return ((*WordRef) & (1L << BitPos)) ? true : false;\n    }\n  };\n\n\n  /// BitVector default ctor - Creates an empty bitvector.\n  BitVector() : Size(0), Capacity(0) {\n    Bits = 0;\n  }\n\n  /// BitVector ctor - Creates a bitvector of specified number of bits. All\n  /// bits are initialized to the specified value.\n  explicit BitVector(unsigned s, bool t = false) : Size(s) {\n    Capacity = NumBitWords(s);\n    Bits = (BitWord *)std::malloc(Capacity * sizeof(BitWord));\n    init_words(Bits, Capacity, t);\n    if (t)\n      clear_unused_bits();\n  }\n\n  /// BitVector copy ctor.\n  BitVector(const BitVector &RHS) : Size(RHS.size()) {\n    if (Size == 0) {\n      Bits = 0;\n      Capacity = 0;\n      return;\n    }\n\n    Capacity = NumBitWords(RHS.size());\n    Bits = (BitWord *)std::malloc(Capacity * sizeof(BitWord));\n    std::memcpy(Bits, RHS.Bits, Capacity * sizeof(BitWord));\n  }\n\n#if LLVM_HAS_RVALUE_REFERENCES\n  BitVector(BitVector &&RHS)\n    : Bits(RHS.Bits), Size(RHS.Size), Capacity(RHS.Capacity) {\n    RHS.Bits = 0;\n  }\n#endif\n\n  ~BitVector() {\n    std::free(Bits);\n  }\n\n  /// empty - Tests whether there are no bits in this bitvector.\n  bool empty() const { return Size == 0; }\n\n  /// size - Returns the number of bits in this bitvector.\n  unsigned size() const { return Size; }\n\n  /// count - Returns the number of bits which are set.\n  unsigned count() const {\n    unsigned NumBits = 0;\n    for (unsigned i = 0; i < NumBitWords(size()); ++i)\n      if (sizeof(BitWord) == 4)\n        NumBits += CountPopulation_32((uint32_t)Bits[i]);\n      else if (sizeof(BitWord) == 8)\n        NumBits += CountPopulation_64(Bits[i]);\n      else\n        llvm_unreachable(\"Unsupported!\");\n    return NumBits;\n  }\n\n  /// any - Returns true if any bit is set.\n  bool any() const {\n    for (unsigned i = 0; i < NumBitWords(size()); ++i)\n      if (Bits[i] != 0)\n        return true;\n    return false;\n  }\n\n  /// all - Returns true if all bits are set.\n  bool all() const {\n    for (unsigned i = 0; i < Size / BITWORD_SIZE; ++i)\n      if (Bits[i] != ~0UL)\n        return false;\n\n    // If bits remain check that they are ones. The unused bits are always zero.\n    if (unsigned Remainder = Size % BITWORD_SIZE)\n      return Bits[Size / BITWORD_SIZE] == (1UL << Remainder) - 1;\n\n    return true;\n  }\n\n  /// none - Returns true if none of the bits are set.\n  bool none() const {\n    return !any();\n  }\n\n  /// find_first - Returns the index of the first set bit, -1 if none\n  /// of the bits are set.\n  int find_first() const {\n    for (unsigned i = 0; i < NumBitWords(size()); ++i)\n      if (Bits[i] != 0) {\n        if (sizeof(BitWord) == 4)\n          return i * BITWORD_SIZE + countTrailingZeros((uint32_t)Bits[i]);\n        if (sizeof(BitWord) == 8)\n          return i * BITWORD_SIZE + countTrailingZeros(Bits[i]);\n        llvm_unreachable(\"Unsupported!\");\n      }\n    return -1;\n  }\n\n  /// find_next - Returns the index of the next set bit following the\n  /// \"Prev\" bit. Returns -1 if the next set bit is not found.\n  int find_next(unsigned Prev) const {\n    ++Prev;\n    if (Prev >= Size)\n      return -1;\n\n    unsigned WordPos = Prev / BITWORD_SIZE;\n    unsigned BitPos = Prev % BITWORD_SIZE;\n    BitWord Copy = Bits[WordPos];\n    // Mask off previous bits.\n    Copy &= ~0UL << BitPos;\n\n    if (Copy != 0) {\n      if (sizeof(BitWord) == 4)\n        return WordPos * BITWORD_SIZE + countTrailingZeros((uint32_t)Copy);\n      if (sizeof(BitWord) == 8)\n        return WordPos * BITWORD_SIZE + countTrailingZeros(Copy);\n      llvm_unreachable(\"Unsupported!\");\n    }\n\n    // Check subsequent words.\n    for (unsigned i = WordPos+1; i < NumBitWords(size()); ++i)\n      if (Bits[i] != 0) {\n        if (sizeof(BitWord) == 4)\n          return i * BITWORD_SIZE + countTrailingZeros((uint32_t)Bits[i]);\n        if (sizeof(BitWord) == 8)\n          return i * BITWORD_SIZE + countTrailingZeros(Bits[i]);\n        llvm_unreachable(\"Unsupported!\");\n      }\n    return -1;\n  }\n\n  /// clear - Clear all bits.\n  void clear() {\n    Size = 0;\n  }\n\n  /// resize - Grow or shrink the bitvector.\n  void resize(unsigned N, bool t = false) {\n    if (N > Capacity * BITWORD_SIZE) {\n      unsigned OldCapacity = Capacity;\n      grow(N);\n      init_words(&Bits[OldCapacity], (Capacity-OldCapacity), t);\n    }\n\n    // Set any old unused bits that are now included in the BitVector. This\n    // may set bits that are not included in the new vector, but we will clear\n    // them back out below.\n    if (N > Size)\n      set_unused_bits(t);\n\n    // Update the size, and clear out any bits that are now unused\n    unsigned OldSize = Size;\n    Size = N;\n    if (t || N < OldSize)\n      clear_unused_bits();\n  }\n\n  void reserve(unsigned N) {\n    if (N > Capacity * BITWORD_SIZE)\n      grow(N);\n  }\n\n  // Set, reset, flip\n  BitVector &set() {\n    init_words(Bits, Capacity, true);\n    clear_unused_bits();\n    return *this;\n  }\n\n  BitVector &set(unsigned Idx) {\n    Bits[Idx / BITWORD_SIZE] |= 1L << (Idx % BITWORD_SIZE);\n    return *this;\n  }\n\n  /// set - Efficiently set a range of bits in [I, E)\n  BitVector &set(unsigned I, unsigned E) {\n    assert(I <= E && \"Attempted to set backwards range!\");\n    assert(E <= size() && \"Attempted to set out-of-bounds range!\");\n\n    if (I == E) return *this;\n\n    if (I / BITWORD_SIZE == E / BITWORD_SIZE) {\n      BitWord EMask = 1UL << (E % BITWORD_SIZE);\n      BitWord IMask = 1UL << (I % BITWORD_SIZE);\n      BitWord Mask = EMask - IMask;\n      Bits[I / BITWORD_SIZE] |= Mask;\n      return *this;\n    }\n\n    BitWord PrefixMask = ~0UL << (I % BITWORD_SIZE);\n    Bits[I / BITWORD_SIZE] |= PrefixMask;\n    I = RoundUpToAlignment(I, BITWORD_SIZE);\n\n    for (; I + BITWORD_SIZE <= E; I += BITWORD_SIZE)\n      Bits[I / BITWORD_SIZE] = ~0UL;\n\n    BitWord PostfixMask = (1UL << (E % BITWORD_SIZE)) - 1;\n    if (I < E)\n      Bits[I / BITWORD_SIZE] |= PostfixMask;\n\n    return *this;\n  }\n\n  BitVector &reset() {\n    init_words(Bits, Capacity, false);\n    return *this;\n  }\n\n  BitVector &reset(unsigned Idx) {\n    Bits[Idx / BITWORD_SIZE] &= ~(1L << (Idx % BITWORD_SIZE));\n    return *this;\n  }\n\n  /// reset - Efficiently reset a range of bits in [I, E)\n  BitVector &reset(unsigned I, unsigned E) {\n    assert(I <= E && \"Attempted to reset backwards range!\");\n    assert(E <= size() && \"Attempted to reset out-of-bounds range!\");\n\n    if (I == E) return *this;\n\n    if (I / BITWORD_SIZE == E / BITWORD_SIZE) {\n      BitWord EMask = 1UL << (E % BITWORD_SIZE);\n      BitWord IMask = 1UL << (I % BITWORD_SIZE);\n      BitWord Mask = EMask - IMask;\n      Bits[I / BITWORD_SIZE] &= ~Mask;\n      return *this;\n    }\n\n    BitWord PrefixMask = ~0UL << (I % BITWORD_SIZE);\n    Bits[I / BITWORD_SIZE] &= ~PrefixMask;\n    I = RoundUpToAlignment(I, BITWORD_SIZE);\n\n    for (; I + BITWORD_SIZE <= E; I += BITWORD_SIZE)\n      Bits[I / BITWORD_SIZE] = 0UL;\n\n    BitWord PostfixMask = (1UL << (E % BITWORD_SIZE)) - 1;\n    if (I < E)\n      Bits[I / BITWORD_SIZE] &= ~PostfixMask;\n\n    return *this;\n  }\n\n  BitVector &flip() {\n    for (unsigned i = 0; i < NumBitWords(size()); ++i)\n      Bits[i] = ~Bits[i];\n    clear_unused_bits();\n    return *this;\n  }\n\n  BitVector &flip(unsigned Idx) {\n    Bits[Idx / BITWORD_SIZE] ^= 1L << (Idx % BITWORD_SIZE);\n    return *this;\n  }\n\n  // Indexing.\n  reference operator[](unsigned Idx) {\n    assert (Idx < Size && \"Out-of-bounds Bit access.\");\n    return reference(*this, Idx);\n  }\n\n  bool operator[](unsigned Idx) const {\n    assert (Idx < Size && \"Out-of-bounds Bit access.\");\n    BitWord Mask = 1L << (Idx % BITWORD_SIZE);\n    return (Bits[Idx / BITWORD_SIZE] & Mask) != 0;\n  }\n\n  bool test(unsigned Idx) const {\n    return (*this)[Idx];\n  }\n\n  /// Test if any common bits are set.\n  bool anyCommon(const BitVector &RHS) const {\n    unsigned ThisWords = NumBitWords(size());\n    unsigned RHSWords  = NumBitWords(RHS.size());\n    for (unsigned i = 0, e = std::min(ThisWords, RHSWords); i != e; ++i)\n      if (Bits[i] & RHS.Bits[i])\n        return true;\n    return false;\n  }\n\n  // Comparison operators.\n  bool operator==(const BitVector &RHS) const {\n    unsigned ThisWords = NumBitWords(size());\n    unsigned RHSWords  = NumBitWords(RHS.size());\n    unsigned i;\n    for (i = 0; i != std::min(ThisWords, RHSWords); ++i)\n      if (Bits[i] != RHS.Bits[i])\n        return false;\n\n    // Verify that any extra words are all zeros.\n    if (i != ThisWords) {\n      for (; i != ThisWords; ++i)\n        if (Bits[i])\n          return false;\n    } else if (i != RHSWords) {\n      for (; i != RHSWords; ++i)\n        if (RHS.Bits[i])\n          return false;\n    }\n    return true;\n  }\n\n  bool operator!=(const BitVector &RHS) const {\n    return !(*this == RHS);\n  }\n\n  /// Intersection, union, disjoint union.\n  BitVector &operator&=(const BitVector &RHS) {\n    unsigned ThisWords = NumBitWords(size());\n    unsigned RHSWords  = NumBitWords(RHS.size());\n    unsigned i;\n    for (i = 0; i != std::min(ThisWords, RHSWords); ++i)\n      Bits[i] &= RHS.Bits[i];\n\n    // Any bits that are just in this bitvector become zero, because they aren't\n    // in the RHS bit vector.  Any words only in RHS are ignored because they\n    // are already zero in the LHS.\n    for (; i != ThisWords; ++i)\n      Bits[i] = 0;\n\n    return *this;\n  }\n\n  /// reset - Reset bits that are set in RHS. Same as *this &= ~RHS.\n  BitVector &reset(const BitVector &RHS) {\n    unsigned ThisWords = NumBitWords(size());\n    unsigned RHSWords  = NumBitWords(RHS.size());\n    unsigned i;\n    for (i = 0; i != std::min(ThisWords, RHSWords); ++i)\n      Bits[i] &= ~RHS.Bits[i];\n    return *this;\n  }\n\n  /// test - Check if (This - RHS) is zero.\n  /// This is the same as reset(RHS) and any().\n  bool test(const BitVector &RHS) const {\n    unsigned ThisWords = NumBitWords(size());\n    unsigned RHSWords  = NumBitWords(RHS.size());\n    unsigned i;\n    for (i = 0; i != std::min(ThisWords, RHSWords); ++i)\n      if ((Bits[i] & ~RHS.Bits[i]) != 0)\n        return true;\n\n    for (; i != ThisWords ; ++i)\n      if (Bits[i] != 0)\n        return true;\n\n    return false;\n  }\n\n  BitVector &operator|=(const BitVector &RHS) {\n    if (size() < RHS.size())\n      resize(RHS.size());\n    for (size_t i = 0, e = NumBitWords(RHS.size()); i != e; ++i)\n      Bits[i] |= RHS.Bits[i];\n    return *this;\n  }\n\n  BitVector &operator^=(const BitVector &RHS) {\n    if (size() < RHS.size())\n      resize(RHS.size());\n    for (size_t i = 0, e = NumBitWords(RHS.size()); i != e; ++i)\n      Bits[i] ^= RHS.Bits[i];\n    return *this;\n  }\n\n  // Assignment operator.\n  const BitVector &operator=(const BitVector &RHS) {\n    if (this == &RHS) return *this;\n\n    Size = RHS.size();\n    unsigned RHSWords = NumBitWords(Size);\n    if (Size <= Capacity * BITWORD_SIZE) {\n      if (Size)\n        std::memcpy(Bits, RHS.Bits, RHSWords * sizeof(BitWord));\n      clear_unused_bits();\n      return *this;\n    }\n\n    // Grow the bitvector to have enough elements.\n    Capacity = RHSWords;\n    BitWord *NewBits = (BitWord *)std::malloc(Capacity * sizeof(BitWord));\n    std::memcpy(NewBits, RHS.Bits, Capacity * sizeof(BitWord));\n\n    // Destroy the old bits.\n    std::free(Bits);\n    Bits = NewBits;\n\n    return *this;\n  }\n\n#if LLVM_HAS_RVALUE_REFERENCES\n  const BitVector &operator=(BitVector &&RHS) {\n    if (this == &RHS) return *this;\n\n    std::free(Bits);\n    Bits = RHS.Bits;\n    Size = RHS.Size;\n    Capacity = RHS.Capacity;\n\n    RHS.Bits = 0;\n\n    return *this;\n  }\n#endif\n\n  void swap(BitVector &RHS) {\n    std::swap(Bits, RHS.Bits);\n    std::swap(Size, RHS.Size);\n    std::swap(Capacity, RHS.Capacity);\n  }\n\n  //===--------------------------------------------------------------------===//\n  // Portable bit mask operations.\n  //===--------------------------------------------------------------------===//\n  //\n  // These methods all operate on arrays of uint32_t, each holding 32 bits. The\n  // fixed word size makes it easier to work with literal bit vector constants\n  // in portable code.\n  //\n  // The LSB in each word is the lowest numbered bit.  The size of a portable\n  // bit mask is always a whole multiple of 32 bits.  If no bit mask size is\n  // given, the bit mask is assumed to cover the entire BitVector.\n\n  /// setBitsInMask - Add '1' bits from Mask to this vector. Don't resize.\n  /// This computes \"*this |= Mask\".\n  void setBitsInMask(const uint32_t *Mask, unsigned MaskWords = ~0u) {\n    applyMask<true, false>(Mask, MaskWords);\n  }\n\n  /// clearBitsInMask - Clear any bits in this vector that are set in Mask.\n  /// Don't resize. This computes \"*this &= ~Mask\".\n  void clearBitsInMask(const uint32_t *Mask, unsigned MaskWords = ~0u) {\n    applyMask<false, false>(Mask, MaskWords);\n  }\n\n  /// setBitsNotInMask - Add a bit to this vector for every '0' bit in Mask.\n  /// Don't resize.  This computes \"*this |= ~Mask\".\n  void setBitsNotInMask(const uint32_t *Mask, unsigned MaskWords = ~0u) {\n    applyMask<true, true>(Mask, MaskWords);\n  }\n\n  /// clearBitsNotInMask - Clear a bit in this vector for every '0' bit in Mask.\n  /// Don't resize.  This computes \"*this &= Mask\".\n  void clearBitsNotInMask(const uint32_t *Mask, unsigned MaskWords = ~0u) {\n    applyMask<false, true>(Mask, MaskWords);\n  }\n\nprivate:\n  unsigned NumBitWords(unsigned S) const {\n    return (S + BITWORD_SIZE-1) / BITWORD_SIZE;\n  }\n\n  // Set the unused bits in the high words.\n  void set_unused_bits(bool t = true) {\n    //  Set high words first.\n    unsigned UsedWords = NumBitWords(Size);\n    if (Capacity > UsedWords)\n      init_words(&Bits[UsedWords], (Capacity-UsedWords), t);\n\n    //  Then set any stray high bits of the last used word.\n    unsigned ExtraBits = Size % BITWORD_SIZE;\n    if (ExtraBits) {\n      BitWord ExtraBitMask = ~0UL << ExtraBits;\n      if (t)\n        Bits[UsedWords-1] |= ExtraBitMask;\n      else\n        Bits[UsedWords-1] &= ~ExtraBitMask;\n    }\n  }\n\n  // Clear the unused bits in the high words.\n  void clear_unused_bits() {\n    set_unused_bits(false);\n  }\n\n  void grow(unsigned NewSize) {\n    Capacity = std::max(NumBitWords(NewSize), Capacity * 2);\n    Bits = (BitWord *)std::realloc(Bits, Capacity * sizeof(BitWord));\n\n    clear_unused_bits();\n  }\n\n  void init_words(BitWord *B, unsigned NumWords, bool t) {\n    memset(B, 0 - (int)t, NumWords*sizeof(BitWord));\n  }\n\n  template<bool AddBits, bool InvertMask>\n  void applyMask(const uint32_t *Mask, unsigned MaskWords) {\n    assert(BITWORD_SIZE % 32 == 0 && \"Unsupported BitWord size.\");\n    MaskWords = std::min(MaskWords, (size() + 31) / 32);\n    const unsigned Scale = BITWORD_SIZE / 32;\n    unsigned i;\n    for (i = 0; MaskWords >= Scale; ++i, MaskWords -= Scale) {\n      BitWord BW = Bits[i];\n      // This inner loop should unroll completely when BITWORD_SIZE > 32.\n      for (unsigned b = 0; b != BITWORD_SIZE; b += 32) {\n        uint32_t M = *Mask++;\n        if (InvertMask) M = ~M;\n        if (AddBits) BW |=   BitWord(M) << b;\n        else         BW &= ~(BitWord(M) << b);\n      }\n      Bits[i] = BW;\n    }\n    for (unsigned b = 0; MaskWords; b += 32, --MaskWords) {\n      uint32_t M = *Mask++;\n      if (InvertMask) M = ~M;\n      if (AddBits) Bits[i] |=   BitWord(M) << b;\n      else         Bits[i] &= ~(BitWord(M) << b);\n    }\n    if (AddBits)\n      clear_unused_bits();\n  }\n};\n\n} // End llvm namespace\n\nnamespace std {\n  /// Implement std::swap in terms of BitVector swap.\n  inline void\n  swap(llvm::BitVector &LHS, llvm::BitVector &RHS) {\n    LHS.swap(RHS);\n  }\n}\n\n#endif\n"
  },
  {
    "path": "third_party/llvm/include/llvm/Support/Compiler.h",
    "content": "//===-- llvm/Support/Compiler.h - Compiler abstraction support --*- C++ -*-===//\n//\n//                     The LLVM Compiler Infrastructure\n//\n// This file is distributed under the University of Illinois Open Source\n// License. See LICENSE.TXT for details.\n//\n//===----------------------------------------------------------------------===//\n//\n// This file defines several macros, based on the current compiler.  This allows\n// use of compiler-specific features in a way that remains portable.\n//\n//===----------------------------------------------------------------------===//\n\n#ifndef LLVM_SUPPORT_COMPILER_H\n#define LLVM_SUPPORT_COMPILER_H\n\n//#include \"llvm/Config/llvm-config.h\"\n\n#ifndef __has_feature\n# define __has_feature(x) 0\n#endif\n\n#ifndef __has_extension\n# define __has_extension(x) 0\n#endif\n\n#ifndef __has_attribute\n# define __has_attribute(x) 0\n#endif\n\n#ifndef __has_builtin\n# define __has_builtin(x) 0\n#endif\n\n/// \\macro __GNUC_PREREQ\n/// \\brief Defines __GNUC_PREREQ if glibc's features.h isn't available.\n#ifndef __GNUC_PREREQ\n# if defined(__GNUC__) && defined(__GNUC_MINOR__)\n#  define __GNUC_PREREQ(maj, min) \\\n    ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))\n# else\n#  define __GNUC_PREREQ(maj, min) 0\n# endif\n#endif\n\n/// \\macro LLVM_MSC_PREREQ\n/// \\brief Is the compiler MSVC of at least the specified version?\n/// The common \\param version values to check for are:\n///  * 1600: Microsoft Visual Studio 2010 / 10.0\n///  * 1700: Microsoft Visual Studio 2012 / 11.0\n///  * 1800: Microsoft Visual Studio 2013 / 12.0\n#ifdef _MSC_VER\n#define LLVM_MSC_PREREQ(version) (_MSC_VER >= (version))\n#else\n#define LLVM_MSC_PREREQ(version) 0\n#endif\n\n/// \\brief Does the compiler support r-value references?\n/// This implies that <utility> provides the one-argument std::move;  it\n/// does not imply the existence of any other C++ library features.\n#if __has_feature(cxx_rvalue_references) || \\\n    defined(__GXX_EXPERIMENTAL_CXX0X__) || LLVM_MSC_PREREQ(1600)\n#define LLVM_HAS_RVALUE_REFERENCES 1\n#else\n#define LLVM_HAS_RVALUE_REFERENCES 0\n#endif\n\n/// \\brief Does the compiler support r-value reference *this?\n///\n/// Sadly, this is separate from just r-value reference support because GCC\n/// implemented everything but this thus far. No release of GCC yet has support\n/// for this feature so it is enabled with Clang only.\n/// FIXME: This should change to a version check when GCC grows support for it.\n#if __has_feature(cxx_rvalue_references)\n#define LLVM_HAS_RVALUE_REFERENCE_THIS 1\n#else\n#define LLVM_HAS_RVALUE_REFERENCE_THIS 0\n#endif\n\n/// \\macro LLVM_HAS_CXX11_TYPETRAITS\n/// \\brief Does the compiler have the C++11 type traits.\n///\n/// #include <type_traits>\n///\n/// * enable_if\n/// * {true,false}_type\n/// * is_constructible\n/// * etc...\n#if defined(__GXX_EXPERIMENTAL_CXX0X__) || LLVM_MSC_PREREQ(1700)\n#define LLVM_HAS_CXX11_TYPETRAITS 1\n#else\n#define LLVM_HAS_CXX11_TYPETRAITS 0\n#endif\n\n/// \\macro LLVM_HAS_CXX11_STDLIB\n/// \\brief Does the compiler have the C++11 standard library.\n///\n/// Implies LLVM_HAS_RVALUE_REFERENCES, LLVM_HAS_CXX11_TYPETRAITS\n#if defined(__GXX_EXPERIMENTAL_CXX0X__) || LLVM_MSC_PREREQ(1700)\n#define LLVM_HAS_CXX11_STDLIB 1\n#else\n#define LLVM_HAS_CXX11_STDLIB 0\n#endif\n\n/// \\macro LLVM_HAS_VARIADIC_TEMPLATES\n/// \\brief Does this compiler support variadic templates.\n///\n/// Implies LLVM_HAS_RVALUE_REFERENCES and the existence of std::forward.\n#if __has_feature(cxx_variadic_templates) || LLVM_MSC_PREREQ(1800)\n# define LLVM_HAS_VARIADIC_TEMPLATES 1\n#else\n# define LLVM_HAS_VARIADIC_TEMPLATES 0\n#endif\n\n/// llvm_move - Expands to ::std::move if the compiler supports\n/// r-value references; otherwise, expands to the argument.\n#if LLVM_HAS_RVALUE_REFERENCES\n#define llvm_move(value) (::std::move(value))\n#else\n#define llvm_move(value) (value)\n#endif\n\n/// Expands to '&' if r-value references are supported.\n///\n/// This can be used to provide l-value/r-value overrides of member functions.\n/// The r-value override should be guarded by LLVM_HAS_RVALUE_REFERENCE_THIS\n#if LLVM_HAS_RVALUE_REFERENCE_THIS\n#define LLVM_LVALUE_FUNCTION &\n#else\n#define LLVM_LVALUE_FUNCTION\n#endif\n\n/// LLVM_DELETED_FUNCTION - Expands to = delete if the compiler supports it.\n/// Use to mark functions as uncallable. Member functions with this should\n/// be declared private so that some behavior is kept in C++03 mode.\n///\n/// class DontCopy {\n/// private:\n///   DontCopy(const DontCopy&) LLVM_DELETED_FUNCTION;\n///   DontCopy &operator =(const DontCopy&) LLVM_DELETED_FUNCTION;\n/// public:\n///   ...\n/// };\n#if __has_feature(cxx_deleted_functions) || \\\n    defined(__GXX_EXPERIMENTAL_CXX0X__) || LLVM_MSC_PREREQ(1800)\n#define LLVM_DELETED_FUNCTION = delete\n#else\n#define LLVM_DELETED_FUNCTION\n#endif\n\n/// LLVM_FINAL - Expands to 'final' if the compiler supports it.\n/// Use to mark classes or virtual methods as final.\n#if __has_feature(cxx_override_control) || \\\n    defined(__GXX_EXPERIMENTAL_CXX0X__) || LLVM_MSC_PREREQ(1700)\n#define LLVM_FINAL final\n#else\n#define LLVM_FINAL\n#endif\n\n/// LLVM_OVERRIDE - Expands to 'override' if the compiler supports it.\n/// Use to mark virtual methods as overriding a base class method.\n#if __has_feature(cxx_override_control) || \\\n    defined(__GXX_EXPERIMENTAL_CXX0X__) || LLVM_MSC_PREREQ(1700)\n#define LLVM_OVERRIDE override\n#else\n#define LLVM_OVERRIDE\n#endif\n\n#if __has_feature(cxx_constexpr) || defined(__GXX_EXPERIMENTAL_CXX0X__)\n# define LLVM_CONSTEXPR constexpr\n#else\n# define LLVM_CONSTEXPR\n#endif\n\n/// LLVM_LIBRARY_VISIBILITY - If a class marked with this attribute is linked\n/// into a shared library, then the class should be private to the library and\n/// not accessible from outside it.  Can also be used to mark variables and\n/// functions, making them private to any shared library they are linked into.\n/// On PE/COFF targets, library visibility is the default, so this isn't needed.\n#if (__has_attribute(visibility) || __GNUC_PREREQ(4, 0)) &&                    \\\n    !defined(__MINGW32__) && !defined(__CYGWIN__) && !defined(LLVM_ON_WIN32)\n#define LLVM_LIBRARY_VISIBILITY __attribute__ ((visibility(\"hidden\")))\n#else\n#define LLVM_LIBRARY_VISIBILITY\n#endif\n\n#if __has_attribute(used) || __GNUC_PREREQ(3, 1)\n#define LLVM_ATTRIBUTE_USED __attribute__((__used__))\n#else\n#define LLVM_ATTRIBUTE_USED\n#endif\n\n#if __has_attribute(warn_unused_result) || __GNUC_PREREQ(3, 4)\n#define LLVM_ATTRIBUTE_UNUSED_RESULT __attribute__((__warn_unused_result__))\n#else\n#define LLVM_ATTRIBUTE_UNUSED_RESULT\n#endif\n\n// Some compilers warn about unused functions. When a function is sometimes\n// used or not depending on build settings (e.g. a function only called from\n// within \"assert\"), this attribute can be used to suppress such warnings.\n//\n// However, it shouldn't be used for unused *variables*, as those have a much\n// more portable solution:\n//   (void)unused_var_name;\n// Prefer cast-to-void wherever it is sufficient.\n#if __has_attribute(unused) || __GNUC_PREREQ(3, 1)\n#define LLVM_ATTRIBUTE_UNUSED __attribute__((__unused__))\n#else\n#define LLVM_ATTRIBUTE_UNUSED\n#endif\n\n// FIXME: Provide this for PE/COFF targets.\n#if (__has_attribute(weak) || __GNUC_PREREQ(4, 0)) &&                          \\\n    (!defined(__MINGW32__) && !defined(__CYGWIN__) && !defined(LLVM_ON_WIN32))\n#define LLVM_ATTRIBUTE_WEAK __attribute__((__weak__))\n#else\n#define LLVM_ATTRIBUTE_WEAK\n#endif\n\n// Prior to clang 3.2, clang did not accept any spelling of\n// __has_attribute(const), so assume it is supported.\n#if defined(__clang__) || defined(__GNUC__)\n// aka 'CONST' but following LLVM Conventions.\n#define LLVM_READNONE __attribute__((__const__))\n#else\n#define LLVM_READNONE\n#endif\n\n#if __has_attribute(pure) || defined(__GNUC__)\n// aka 'PURE' but following LLVM Conventions.\n#define LLVM_READONLY __attribute__((__pure__))\n#else\n#define LLVM_READONLY\n#endif\n\n#if __has_builtin(__builtin_expect) || __GNUC_PREREQ(4, 0)\n#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)\n#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)\n#else\n#define LLVM_LIKELY(EXPR) (EXPR)\n#define LLVM_UNLIKELY(EXPR) (EXPR)\n#endif\n\n// C++ doesn't support 'extern template' of template specializations.  GCC does,\n// but requires __extension__ before it.  In the header, use this:\n//   EXTERN_TEMPLATE_INSTANTIATION(class foo<bar>);\n// in the .cpp file, use this:\n//   TEMPLATE_INSTANTIATION(class foo<bar>);\n#ifdef __GNUC__\n#define EXTERN_TEMPLATE_INSTANTIATION(X) __extension__ extern template X\n#define TEMPLATE_INSTANTIATION(X) template X\n#else\n#define EXTERN_TEMPLATE_INSTANTIATION(X)\n#define TEMPLATE_INSTANTIATION(X)\n#endif\n\n/// LLVM_ATTRIBUTE_NOINLINE - On compilers where we have a directive to do so,\n/// mark a method \"not for inlining\".\n#if __has_attribute(noinline) || __GNUC_PREREQ(3, 4)\n#define LLVM_ATTRIBUTE_NOINLINE __attribute__((noinline))\n#elif defined(_MSC_VER)\n#define LLVM_ATTRIBUTE_NOINLINE __declspec(noinline)\n#else\n#define LLVM_ATTRIBUTE_NOINLINE\n#endif\n\n/// LLVM_ATTRIBUTE_ALWAYS_INLINE - On compilers where we have a directive to do\n/// so, mark a method \"always inline\" because it is performance sensitive. GCC\n/// 3.4 supported this but is buggy in various cases and produces unimplemented\n/// errors, just use it in GCC 4.0 and later.\n#if __has_attribute(always_inline) || __GNUC_PREREQ(4, 0)\n#define LLVM_ATTRIBUTE_ALWAYS_INLINE inline __attribute__((always_inline))\n#elif defined(_MSC_VER)\n#define LLVM_ATTRIBUTE_ALWAYS_INLINE __forceinline\n#else\n#define LLVM_ATTRIBUTE_ALWAYS_INLINE\n#endif\n\n#ifdef __GNUC__\n#define LLVM_ATTRIBUTE_NORETURN __attribute__((noreturn))\n#elif defined(_MSC_VER)\n#define LLVM_ATTRIBUTE_NORETURN __declspec(noreturn)\n#else\n#define LLVM_ATTRIBUTE_NORETURN\n#endif\n\n/// LLVM_EXTENSION - Support compilers where we have a keyword to suppress\n/// pedantic diagnostics.\n#ifdef __GNUC__\n#define LLVM_EXTENSION __extension__\n#else\n#define LLVM_EXTENSION\n#endif\n\n// LLVM_ATTRIBUTE_DEPRECATED(decl, \"message\")\n#if __has_feature(attribute_deprecated_with_message)\n# define LLVM_ATTRIBUTE_DEPRECATED(decl, message) \\\n  decl __attribute__((deprecated(message)))\n#elif defined(__GNUC__)\n# define LLVM_ATTRIBUTE_DEPRECATED(decl, message) \\\n  decl __attribute__((deprecated))\n#elif defined(_MSC_VER)\n# define LLVM_ATTRIBUTE_DEPRECATED(decl, message) \\\n  __declspec(deprecated(message)) decl\n#else\n# define LLVM_ATTRIBUTE_DEPRECATED(decl, message) \\\n  decl\n#endif\n\n/// LLVM_BUILTIN_UNREACHABLE - On compilers which support it, expands\n/// to an expression which states that it is undefined behavior for the\n/// compiler to reach this point.  Otherwise is not defined.\n#if __has_builtin(__builtin_unreachable) || __GNUC_PREREQ(4, 5)\n# define LLVM_BUILTIN_UNREACHABLE __builtin_unreachable()\n#elif defined(_MSC_VER)\n# define LLVM_BUILTIN_UNREACHABLE __assume(false)\n#endif\n\n/// LLVM_BUILTIN_TRAP - On compilers which support it, expands to an expression\n/// which causes the program to exit abnormally.\n#if __has_builtin(__builtin_trap) || __GNUC_PREREQ(4, 3)\n# define LLVM_BUILTIN_TRAP __builtin_trap()\n#else\n# define LLVM_BUILTIN_TRAP *(volatile int*)0x11 = 0\n#endif\n\n/// \\macro LLVM_ASSUME_ALIGNED\n/// \\brief Returns a pointer with an assumed alignment.\n#if __has_builtin(__builtin_assume_aligned) && __GNUC_PREREQ(4, 7)\n# define LLVM_ASSUME_ALIGNED(p, a) __builtin_assume_aligned(p, a)\n#elif defined(LLVM_BUILTIN_UNREACHABLE)\n// As of today, clang does not support __builtin_assume_aligned.\n# define LLVM_ASSUME_ALIGNED(p, a) \\\n           (((uintptr_t(p) % (a)) == 0) ? (p) : (LLVM_BUILTIN_UNREACHABLE, (p)))\n#else\n# define LLVM_ASSUME_ALIGNED(p, a) (p)\n#endif\n\n/// \\macro LLVM_FUNCTION_NAME\n/// \\brief Expands to __func__ on compilers which support it.  Otherwise,\n/// expands to a compiler-dependent replacement.\n#if defined(_MSC_VER)\n# define LLVM_FUNCTION_NAME __FUNCTION__\n#else\n# define LLVM_FUNCTION_NAME __func__\n#endif\n\n#if defined(HAVE_SANITIZER_MSAN_INTERFACE_H)\n# include <sanitizer/msan_interface.h>\n#else\n# define __msan_allocated_memory(p, size)\n# define __msan_unpoison(p, size)\n#endif\n\n/// \\macro LLVM_MEMORY_SANITIZER_BUILD\n/// \\brief Whether LLVM itself is built with MemorySanitizer instrumentation.\n#if __has_feature(memory_sanitizer)\n# define LLVM_MEMORY_SANITIZER_BUILD 1\n#else\n# define LLVM_MEMORY_SANITIZER_BUILD 0\n#endif\n\n/// \\macro LLVM_ADDRESS_SANITIZER_BUILD\n/// \\brief Whether LLVM itself is built with AddressSanitizer instrumentation.\n#if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__)\n# define LLVM_ADDRESS_SANITIZER_BUILD 1\n#else\n# define LLVM_ADDRESS_SANITIZER_BUILD 0\n#endif\n\n/// \\macro LLVM_IS_UNALIGNED_ACCESS_FAST\n/// \\brief Is unaligned memory access fast on the host machine.\n///\n/// Don't specialize on alignment for platforms where unaligned memory accesses\n/// generates the same code as aligned memory accesses for common types.\n#if defined(_M_AMD64) || defined(_M_IX86) || defined(__amd64) || \\\n    defined(__amd64__) || defined(__x86_64) || defined(__x86_64__) || \\\n    defined(_X86_) || defined(__i386) || defined(__i386__)\n# define LLVM_IS_UNALIGNED_ACCESS_FAST 1\n#else\n# define LLVM_IS_UNALIGNED_ACCESS_FAST 0\n#endif\n\n/// \\macro LLVM_EXPLICIT\n/// \\brief Expands to explicit on compilers which support explicit conversion\n/// operators. Otherwise expands to nothing.\n#if __has_feature(cxx_explicit_conversions) || \\\n    defined(__GXX_EXPERIMENTAL_CXX0X__) || LLVM_MSC_PREREQ(1800)\n#define LLVM_EXPLICIT explicit\n#else\n#define LLVM_EXPLICIT\n#endif\n\n/// \\macro LLVM_STATIC_ASSERT\n/// \\brief Expands to C/C++'s static_assert on compilers which support it.\n#if __has_feature(cxx_static_assert) || \\\n    defined(__GXX_EXPERIMENTAL_CXX0X__) || LLVM_MSC_PREREQ(1600)\n# define LLVM_STATIC_ASSERT(expr, msg) static_assert(expr, msg)\n#elif __has_feature(c_static_assert)\n# define LLVM_STATIC_ASSERT(expr, msg) _Static_assert(expr, msg)\n#elif __has_extension(c_static_assert)\n# define LLVM_STATIC_ASSERT(expr, msg) LLVM_EXTENSION _Static_assert(expr, msg)\n#else\n# define LLVM_STATIC_ASSERT(expr, msg)\n#endif\n\n/// \\macro LLVM_ENUM_INT_TYPE\n/// \\brief Expands to colon followed by the given integral type on compilers\n/// which support C++11 strong enums.  This can be used to make enums unsigned\n/// with MSVC.\n#if __has_feature(cxx_strong_enums) || LLVM_MSC_PREREQ(1600)\n# define LLVM_ENUM_INT_TYPE(intty) : intty\n#else\n# define LLVM_ENUM_INT_TYPE(intty)\n#endif\n\n/// \\brief Does the compiler support C++11 semantics for strongly typed forward\n/// declared enums?\n#if __has_feature(cxx_strong_enums) || LLVM_MSC_PREREQ(1700)\n#define LLVM_HAS_STRONG_ENUMS 1\n#else\n#define LLVM_HAS_STRONG_ENUMS 0\n#endif\n\n/// \\brief Does the compiler support generalized initializers (using braced\n/// lists and std::initializer_list).  While clang may claim it supports general\n/// initializers, if we're using MSVC's headers, we might not have a usable\n/// std::initializer list type from the STL.  Disable this for now.\n#if __has_feature(cxx_generalized_initializers) && !defined(_MSC_VER)\n#define LLVM_HAS_INITIALIZER_LISTS 1\n#else\n#define LLVM_HAS_INITIALIZER_LISTS 0\n#endif\n\n/// \\brief Mark debug helper function definitions like dump() that should not be\n/// stripped from debug builds.\n// FIXME: Move this to a private config.h as it's not usable in public headers.\n#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)\n#define LLVM_DUMP_METHOD LLVM_ATTRIBUTE_NOINLINE LLVM_ATTRIBUTE_USED\n#else\n#define LLVM_DUMP_METHOD LLVM_ATTRIBUTE_NOINLINE\n#endif\n\n#endif\n"
  },
  {
    "path": "third_party/llvm/include/llvm/Support/MathExtras.h",
    "content": "//===-- llvm/Support/MathExtras.h - Useful math functions -------*- C++ -*-===//\n//\n//                     The LLVM Compiler Infrastructure\n//\n// This file is distributed under the University of Illinois Open Source\n// License. See LICENSE.TXT for details.\n//\n//===----------------------------------------------------------------------===//\n//\n// This file contains some functions that are useful for math stuff.\n//\n//===----------------------------------------------------------------------===//\n\n#ifndef LLVM_SUPPORT_MATHEXTRAS_H\n#define LLVM_SUPPORT_MATHEXTRAS_H\n\n#include \"llvm/Support/Compiler.h\"\n#ifdef IGNORED_LLVM_XENIA\n#include \"llvm/Support/SwapByteOrder.h\"\n#endif  // IGNORED_LLVM_XENIA\n#include <cmath>\n#include <cstring>\n#include \"llvm/Support/type_traits.h\"\n\n#ifdef _MSC_VER\n#include <intrin.h>\n#include <limits>\n#endif\n\nnamespace llvm {\n/// \\brief The behavior an operation has on an input of 0.\nenum ZeroBehavior {\n  /// \\brief The returned value is undefined.\n  ZB_Undefined,\n  /// \\brief The returned value is numeric_limits<T>::max()\n  ZB_Max,\n  /// \\brief The returned value is numeric_limits<T>::digits\n  ZB_Width\n};\n\n/// \\brief Count number of 0's from the least significant bit to the most\n///   stopping at the first 1.\n///\n/// Only unsigned integral types are allowed.\n///\n/// \\param ZB the behavior on an input of 0. Only ZB_Width and ZB_Undefined are\n///   valid arguments.\ntemplate <typename T>\ntypename enable_if_c<std::numeric_limits<T>::is_integer &&\n                     !std::numeric_limits<T>::is_signed, std::size_t>::type\ncountTrailingZeros(T Val, ZeroBehavior ZB = ZB_Width) {\n  (void)ZB;\n\n  if (!Val)\n    return std::numeric_limits<T>::digits;\n  if (Val & 0x1)\n    return 0;\n\n  // Bisection method.\n  std::size_t ZeroBits = 0;\n  T Shift = std::numeric_limits<T>::digits >> 1;\n  T Mask = std::numeric_limits<T>::max() >> Shift;\n  while (Shift) {\n    if ((Val & Mask) == 0) {\n      Val >>= Shift;\n      ZeroBits |= Shift;\n    }\n    Shift >>= 1;\n    Mask >>= Shift;\n  }\n  return ZeroBits;\n}\n\n// Disable signed.\ntemplate <typename T>\ntypename enable_if_c<std::numeric_limits<T>::is_integer &&\n                     std::numeric_limits<T>::is_signed, std::size_t>::type\ncountTrailingZeros(T Val, ZeroBehavior ZB = ZB_Width) LLVM_DELETED_FUNCTION;\n\n#if __GNUC__ >= 4 || _MSC_VER\ntemplate <>\ninline std::size_t countTrailingZeros<uint32_t>(uint32_t Val, ZeroBehavior ZB) {\n  if (ZB != ZB_Undefined && Val == 0)\n    return 32;\n\n#if __has_builtin(__builtin_ctz) || __GNUC_PREREQ(4, 0)\n  return __builtin_ctz(Val);\n#elif _MSC_VER\n  unsigned long Index;\n  _BitScanForward(&Index, Val);\n  return Index;\n#endif\n}\n\n#if !defined(_MSC_VER) || defined(_M_X64)\ntemplate <>\ninline std::size_t countTrailingZeros<uint64_t>(uint64_t Val, ZeroBehavior ZB) {\n  if (ZB != ZB_Undefined && Val == 0)\n    return 64;\n\n#if __has_builtin(__builtin_ctzll) || __GNUC_PREREQ(4, 0)\n  return __builtin_ctzll(Val);\n#elif _MSC_VER\n  unsigned long Index;\n  _BitScanForward64(&Index, Val);\n  return Index;\n#endif\n}\n#endif\n#endif\n\n/// \\brief Count number of 0's from the most significant bit to the least\n///   stopping at the first 1.\n///\n/// Only unsigned integral types are allowed.\n///\n/// \\param ZB the behavior on an input of 0. Only ZB_Width and ZB_Undefined are\n///   valid arguments.\ntemplate <typename T>\ntypename enable_if_c<std::numeric_limits<T>::is_integer &&\n                     !std::numeric_limits<T>::is_signed, std::size_t>::type\ncountLeadingZeros(T Val, ZeroBehavior ZB = ZB_Width) {\n  (void)ZB;\n\n  if (!Val)\n    return std::numeric_limits<T>::digits;\n\n  // Bisection method.\n  std::size_t ZeroBits = 0;\n  for (T Shift = std::numeric_limits<T>::digits >> 1; Shift; Shift >>= 1) {\n    T Tmp = Val >> Shift;\n    if (Tmp)\n      Val = Tmp;\n    else\n      ZeroBits |= Shift;\n  }\n  return ZeroBits;\n}\n\n// Disable signed.\ntemplate <typename T>\ntypename enable_if_c<std::numeric_limits<T>::is_integer &&\n                     std::numeric_limits<T>::is_signed, std::size_t>::type\ncountLeadingZeros(T Val, ZeroBehavior ZB = ZB_Width) LLVM_DELETED_FUNCTION;\n\n#if __GNUC__ >= 4 || _MSC_VER\ntemplate <>\ninline std::size_t countLeadingZeros<uint32_t>(uint32_t Val, ZeroBehavior ZB) {\n  if (ZB != ZB_Undefined && Val == 0)\n    return 32;\n\n#if __has_builtin(__builtin_clz) || __GNUC_PREREQ(4, 0)\n  return __builtin_clz(Val);\n#elif _MSC_VER\n  unsigned long Index;\n  _BitScanReverse(&Index, Val);\n  return Index ^ 31;\n#endif\n}\n\n#if !defined(_MSC_VER) || defined(_M_X64)\ntemplate <>\ninline std::size_t countLeadingZeros<uint64_t>(uint64_t Val, ZeroBehavior ZB) {\n  if (ZB != ZB_Undefined && Val == 0)\n    return 64;\n\n#if __has_builtin(__builtin_clzll) || __GNUC_PREREQ(4, 0)\n  return __builtin_clzll(Val);\n#elif _MSC_VER\n  unsigned long Index;\n  _BitScanReverse64(&Index, Val);\n  return Index ^ 63;\n#endif\n}\n#endif\n#endif\n\n/// \\brief Get the index of the first set bit starting from the least\n///   significant bit.\n///\n/// Only unsigned integral types are allowed.\n///\n/// \\param ZB the behavior on an input of 0. Only ZB_Max and ZB_Undefined are\n///   valid arguments.\ntemplate <typename T>\ntypename enable_if_c<std::numeric_limits<T>::is_integer &&\n                     !std::numeric_limits<T>::is_signed, T>::type\nfindFirstSet(T Val, ZeroBehavior ZB = ZB_Max) {\n  if (ZB == ZB_Max && Val == 0)\n    return std::numeric_limits<T>::max();\n\n  return countTrailingZeros(Val, ZB_Undefined);\n}\n\n// Disable signed.\ntemplate <typename T>\ntypename enable_if_c<std::numeric_limits<T>::is_integer &&\n                     std::numeric_limits<T>::is_signed, T>::type\nfindFirstSet(T Val, ZeroBehavior ZB = ZB_Max) LLVM_DELETED_FUNCTION;\n\n/// \\brief Get the index of the last set bit starting from the least\n///   significant bit.\n///\n/// Only unsigned integral types are allowed.\n///\n/// \\param ZB the behavior on an input of 0. Only ZB_Max and ZB_Undefined are\n///   valid arguments.\ntemplate <typename T>\ntypename enable_if_c<std::numeric_limits<T>::is_integer &&\n                     !std::numeric_limits<T>::is_signed, T>::type\nfindLastSet(T Val, ZeroBehavior ZB = ZB_Max) {\n  if (ZB == ZB_Max && Val == 0)\n    return std::numeric_limits<T>::max();\n\n  // Use ^ instead of - because both gcc and llvm can remove the associated ^\n  // in the __builtin_clz intrinsic on x86.\n  return countLeadingZeros(Val, ZB_Undefined) ^\n         (std::numeric_limits<T>::digits - 1);\n}\n\n// Disable signed.\ntemplate <typename T>\ntypename enable_if_c<std::numeric_limits<T>::is_integer &&\n                     std::numeric_limits<T>::is_signed, T>::type\nfindLastSet(T Val, ZeroBehavior ZB = ZB_Max) LLVM_DELETED_FUNCTION;\n\n/// \\brief Macro compressed bit reversal table for 256 bits.\n///\n/// http://graphics.stanford.edu/~seander/bithacks.html#BitReverseTable\nstatic const unsigned char BitReverseTable256[256] = {\n#define R2(n) n, n + 2 * 64, n + 1 * 64, n + 3 * 64\n#define R4(n) R2(n), R2(n + 2 * 16), R2(n + 1 * 16), R2(n + 3 * 16)\n#define R6(n) R4(n), R4(n + 2 * 4), R4(n + 1 * 4), R4(n + 3 * 4)\n  R6(0), R6(2), R6(1), R6(3)\n};\n\n/// \\brief Reverse the bits in \\p Val.\ntemplate <typename T>\nT reverseBits(T Val) {\n  unsigned char in[sizeof(Val)];\n  unsigned char out[sizeof(Val)];\n  std::memcpy(in, &Val, sizeof(Val));\n  for (unsigned i = 0; i < sizeof(Val); ++i)\n    out[(sizeof(Val) - i) - 1] = BitReverseTable256[in[i]];\n  std::memcpy(&Val, out, sizeof(Val));\n  return Val;\n}\n\n// NOTE: The following support functions use the _32/_64 extensions instead of\n// type overloading so that signed and unsigned integers can be used without\n// ambiguity.\n\n/// Hi_32 - This function returns the high 32 bits of a 64 bit value.\ninline uint32_t Hi_32(uint64_t Value) {\n  return static_cast<uint32_t>(Value >> 32);\n}\n\n/// Lo_32 - This function returns the low 32 bits of a 64 bit value.\ninline uint32_t Lo_32(uint64_t Value) {\n  return static_cast<uint32_t>(Value);\n}\n\n/// isInt - Checks if an integer fits into the given bit width.\ntemplate<unsigned N>\ninline bool isInt(int64_t x) {\n  return N >= 64 || (-(INT64_C(1)<<(N-1)) <= x && x < (INT64_C(1)<<(N-1)));\n}\n// Template specializations to get better code for common cases.\ntemplate<>\ninline bool isInt<8>(int64_t x) {\n  return static_cast<int8_t>(x) == x;\n}\ntemplate<>\ninline bool isInt<16>(int64_t x) {\n  return static_cast<int16_t>(x) == x;\n}\ntemplate<>\ninline bool isInt<32>(int64_t x) {\n  return static_cast<int32_t>(x) == x;\n}\n\n/// isShiftedInt<N,S> - Checks if a signed integer is an N bit number shifted\n///                     left by S.\ntemplate<unsigned N, unsigned S>\ninline bool isShiftedInt(int64_t x) {\n  return isInt<N+S>(x) && (x % (1<<S) == 0);\n}\n\n/// isUInt - Checks if an unsigned integer fits into the given bit width.\ntemplate<unsigned N>\ninline bool isUInt(uint64_t x) {\n  return N >= 64 || x < (UINT64_C(1)<<(N));\n}\n// Template specializations to get better code for common cases.\ntemplate<>\ninline bool isUInt<8>(uint64_t x) {\n  return static_cast<uint8_t>(x) == x;\n}\ntemplate<>\ninline bool isUInt<16>(uint64_t x) {\n  return static_cast<uint16_t>(x) == x;\n}\ntemplate<>\ninline bool isUInt<32>(uint64_t x) {\n  return static_cast<uint32_t>(x) == x;\n}\n\n/// isShiftedUInt<N,S> - Checks if a unsigned integer is an N bit number shifted\n///                     left by S.\ntemplate<unsigned N, unsigned S>\ninline bool isShiftedUInt(uint64_t x) {\n  return isUInt<N+S>(x) && (x % (1<<S) == 0);\n}\n\n/// isUIntN - Checks if an unsigned integer fits into the given (dynamic)\n/// bit width.\ninline bool isUIntN(unsigned N, uint64_t x) {\n  return x == (x & (~0ULL >> (64 - N)));\n}\n\n/// isIntN - Checks if an signed integer fits into the given (dynamic)\n/// bit width.\ninline bool isIntN(unsigned N, int64_t x) {\n  return N >= 64 || (-(INT64_C(1)<<(N-1)) <= x && x < (INT64_C(1)<<(N-1)));\n}\n\n/// isMask_32 - This function returns true if the argument is a sequence of ones\n/// starting at the least significant bit with the remainder zero (32 bit\n/// version).   Ex. isMask_32(0x0000FFFFU) == true.\ninline bool isMask_32(uint32_t Value) {\n  return Value && ((Value + 1) & Value) == 0;\n}\n\n/// isMask_64 - This function returns true if the argument is a sequence of ones\n/// starting at the least significant bit with the remainder zero (64 bit\n/// version).\ninline bool isMask_64(uint64_t Value) {\n  return Value && ((Value + 1) & Value) == 0;\n}\n\n/// isShiftedMask_32 - This function returns true if the argument contains a\n/// sequence of ones with the remainder zero (32 bit version.)\n/// Ex. isShiftedMask_32(0x0000FF00U) == true.\ninline bool isShiftedMask_32(uint32_t Value) {\n  return isMask_32((Value - 1) | Value);\n}\n\n/// isShiftedMask_64 - This function returns true if the argument contains a\n/// sequence of ones with the remainder zero (64 bit version.)\ninline bool isShiftedMask_64(uint64_t Value) {\n  return isMask_64((Value - 1) | Value);\n}\n\n/// isPowerOf2_32 - This function returns true if the argument is a power of\n/// two > 0. Ex. isPowerOf2_32(0x00100000U) == true (32 bit edition.)\ninline bool isPowerOf2_32(uint32_t Value) {\n  return Value && !(Value & (Value - 1));\n}\n\n/// isPowerOf2_64 - This function returns true if the argument is a power of two\n/// > 0 (64 bit edition.)\ninline bool isPowerOf2_64(uint64_t Value) {\n  return Value && !(Value & (Value - int64_t(1L)));\n}\n\n#ifdef IGNORED_LLVM_XENIA\n/// ByteSwap_16 - This function returns a byte-swapped representation of the\n/// 16-bit argument, Value.\ninline uint16_t ByteSwap_16(uint16_t Value) {\n  return sys::SwapByteOrder_16(Value);\n}\n\n/// ByteSwap_32 - This function returns a byte-swapped representation of the\n/// 32-bit argument, Value.\ninline uint32_t ByteSwap_32(uint32_t Value) {\n  return sys::SwapByteOrder_32(Value);\n}\n\n/// ByteSwap_64 - This function returns a byte-swapped representation of the\n/// 64-bit argument, Value.\ninline uint64_t ByteSwap_64(uint64_t Value) {\n  return sys::SwapByteOrder_64(Value);\n}\n#endif  // IGNORED_LLVM_XENIA\n\n/// CountLeadingOnes_32 - this function performs the operation of\n/// counting the number of ones from the most significant bit to the first zero\n/// bit.  Ex. CountLeadingOnes_32(0xFF0FFF00) == 8.\n/// Returns 32 if the word is all ones.\ninline unsigned CountLeadingOnes_32(uint32_t Value) {\n  return countLeadingZeros(~Value);\n}\n\n/// CountLeadingOnes_64 - This function performs the operation\n/// of counting the number of ones from the most significant bit to the first\n/// zero bit (64 bit edition.)\n/// Returns 64 if the word is all ones.\ninline unsigned CountLeadingOnes_64(uint64_t Value) {\n  return countLeadingZeros(~Value);\n}\n\n/// CountTrailingOnes_32 - this function performs the operation of\n/// counting the number of ones from the least significant bit to the first zero\n/// bit.  Ex. CountTrailingOnes_32(0x00FF00FF) == 8.\n/// Returns 32 if the word is all ones.\ninline unsigned CountTrailingOnes_32(uint32_t Value) {\n  return countTrailingZeros(~Value);\n}\n\n/// CountTrailingOnes_64 - This function performs the operation\n/// of counting the number of ones from the least significant bit to the first\n/// zero bit (64 bit edition.)\n/// Returns 64 if the word is all ones.\ninline unsigned CountTrailingOnes_64(uint64_t Value) {\n  return countTrailingZeros(~Value);\n}\n\n/// CountPopulation_32 - this function counts the number of set bits in a value.\n/// Ex. CountPopulation(0xF000F000) = 8\n/// Returns 0 if the word is zero.\ninline unsigned CountPopulation_32(uint32_t Value) {\n#if __GNUC__ >= 4\n  return __builtin_popcount(Value);\n#else\n  uint32_t v = Value - ((Value >> 1) & 0x55555555);\n  v = (v & 0x33333333) + ((v >> 2) & 0x33333333);\n  return ((v + (v >> 4) & 0xF0F0F0F) * 0x1010101) >> 24;\n#endif\n}\n\n/// CountPopulation_64 - this function counts the number of set bits in a value,\n/// (64 bit edition.)\ninline unsigned CountPopulation_64(uint64_t Value) {\n#if __GNUC__ >= 4\n  return __builtin_popcountll(Value);\n#else\n  uint64_t v = Value - ((Value >> 1) & 0x5555555555555555ULL);\n  v = (v & 0x3333333333333333ULL) + ((v >> 2) & 0x3333333333333333ULL);\n  v = (v + (v >> 4)) & 0x0F0F0F0F0F0F0F0FULL;\n  return unsigned((uint64_t)(v * 0x0101010101010101ULL) >> 56);\n#endif\n}\n\n/// Log2_32 - This function returns the floor log base 2 of the specified value,\n/// -1 if the value is zero. (32 bit edition.)\n/// Ex. Log2_32(32) == 5, Log2_32(1) == 0, Log2_32(0) == -1, Log2_32(6) == 2\ninline unsigned Log2_32(uint32_t Value) {\n  return 31 - countLeadingZeros(Value);\n}\n\n/// Log2_64 - This function returns the floor log base 2 of the specified value,\n/// -1 if the value is zero. (64 bit edition.)\ninline unsigned Log2_64(uint64_t Value) {\n  return 63 - countLeadingZeros(Value);\n}\n\n/// Log2_32_Ceil - This function returns the ceil log base 2 of the specified\n/// value, 32 if the value is zero. (32 bit edition).\n/// Ex. Log2_32_Ceil(32) == 5, Log2_32_Ceil(1) == 0, Log2_32_Ceil(6) == 3\ninline unsigned Log2_32_Ceil(uint32_t Value) {\n  return 32 - countLeadingZeros(Value - 1);\n}\n\n/// Log2_64_Ceil - This function returns the ceil log base 2 of the specified\n/// value, 64 if the value is zero. (64 bit edition.)\ninline unsigned Log2_64_Ceil(uint64_t Value) {\n  return 64 - countLeadingZeros(Value - 1);\n}\n\n/// GreatestCommonDivisor64 - Return the greatest common divisor of the two\n/// values using Euclid's algorithm.\ninline uint64_t GreatestCommonDivisor64(uint64_t A, uint64_t B) {\n  while (B) {\n    uint64_t T = B;\n    B = A % B;\n    A = T;\n  }\n  return A;\n}\n\n/// BitsToDouble - This function takes a 64-bit integer and returns the bit\n/// equivalent double.\ninline double BitsToDouble(uint64_t Bits) {\n  union {\n    uint64_t L;\n    double D;\n  } T;\n  T.L = Bits;\n  return T.D;\n}\n\n/// BitsToFloat - This function takes a 32-bit integer and returns the bit\n/// equivalent float.\ninline float BitsToFloat(uint32_t Bits) {\n  union {\n    uint32_t I;\n    float F;\n  } T;\n  T.I = Bits;\n  return T.F;\n}\n\n/// DoubleToBits - This function takes a double and returns the bit\n/// equivalent 64-bit integer.  Note that copying doubles around\n/// changes the bits of NaNs on some hosts, notably x86, so this\n/// routine cannot be used if these bits are needed.\ninline uint64_t DoubleToBits(double Double) {\n  union {\n    uint64_t L;\n    double D;\n  } T;\n  T.D = Double;\n  return T.L;\n}\n\n/// FloatToBits - This function takes a float and returns the bit\n/// equivalent 32-bit integer.  Note that copying floats around\n/// changes the bits of NaNs on some hosts, notably x86, so this\n/// routine cannot be used if these bits are needed.\ninline uint32_t FloatToBits(float Float) {\n  union {\n    uint32_t I;\n    float F;\n  } T;\n  T.F = Float;\n  return T.I;\n}\n\n/// Platform-independent wrappers for the C99 isnan() function.\nint IsNAN(float f);\nint IsNAN(double d);\n\n/// Platform-independent wrappers for the C99 isinf() function.\nint IsInf(float f);\nint IsInf(double d);\n\n/// MinAlign - A and B are either alignments or offsets.  Return the minimum\n/// alignment that may be assumed after adding the two together.\ninline uint64_t MinAlign(uint64_t A, uint64_t B) {\n  // The largest power of 2 that divides both A and B.\n  //\n  // Replace \"-Value\" by \"1+~Value\" in the following commented code to avoid\n  // MSVC warning C4146\n  //    return (A | B) & -(A | B);\n  return (A | B) & (1 + ~(A | B));\n}\n\n/// NextPowerOf2 - Returns the next power of two (in 64-bits)\n/// that is strictly greater than A.  Returns zero on overflow.\ninline uint64_t NextPowerOf2(uint64_t A) {\n  A |= (A >> 1);\n  A |= (A >> 2);\n  A |= (A >> 4);\n  A |= (A >> 8);\n  A |= (A >> 16);\n  A |= (A >> 32);\n  return A + 1;\n}\n\n/// Returns the power of two which is less than or equal to the given value.\n/// Essentially, it is a floor operation across the domain of powers of two.\ninline uint64_t PowerOf2Floor(uint64_t A) {\n  if (!A) return 0;\n  return 1ull << (63 - countLeadingZeros(A, ZB_Undefined));\n}\n\n/// Returns the next integer (mod 2**64) that is greater than or equal to\n/// \\p Value and is a multiple of \\p Align. \\p Align must be non-zero.\n///\n/// Examples:\n/// \\code\n///   RoundUpToAlignment(5, 8) = 8\n///   RoundUpToAlignment(17, 8) = 24\n///   RoundUpToAlignment(~0LL, 8) = 0\n/// \\endcode\ninline uint64_t RoundUpToAlignment(uint64_t Value, uint64_t Align) {\n  return ((Value + Align - 1) / Align) * Align;\n}\n\n/// Returns the offset to the next integer (mod 2**64) that is greater than\n/// or equal to \\p Value and is a multiple of \\p Align. \\p Align must be\n/// non-zero.\ninline uint64_t OffsetToAlignment(uint64_t Value, uint64_t Align) {\n  return RoundUpToAlignment(Value, Align) - Value;\n}\n\n/// abs64 - absolute value of a 64-bit int.  Not all environments support\n/// \"abs\" on whatever their name for the 64-bit int type is.  The absolute\n/// value of the largest negative number is undefined, as with \"abs\".\ninline int64_t abs64(int64_t x) {\n  return (x < 0) ? -x : x;\n}\n\n/// SignExtend32 - Sign extend B-bit number x to 32-bit int.\n/// Usage int32_t r = SignExtend32<5>(x);\ntemplate <unsigned B> inline int32_t SignExtend32(uint32_t x) {\n  return int32_t(x << (32 - B)) >> (32 - B);\n}\n\n/// \\brief Sign extend number in the bottom B bits of X to a 32-bit int.\n/// Requires 0 < B <= 32.\ninline int32_t SignExtend32(uint32_t X, unsigned B) {\n  return int32_t(X << (32 - B)) >> (32 - B);\n}\n\n/// SignExtend64 - Sign extend B-bit number x to 64-bit int.\n/// Usage int64_t r = SignExtend64<5>(x);\ntemplate <unsigned B> inline int64_t SignExtend64(uint64_t x) {\n  return int64_t(x << (64 - B)) >> (64 - B);\n}\n\n/// \\brief Sign extend number in the bottom B bits of X to a 64-bit int.\n/// Requires 0 < B <= 64.\ninline int64_t SignExtend64(uint64_t X, unsigned B) {\n  return int64_t(X << (64 - B)) >> (64 - B);\n}\n\n#if defined(_MSC_VER)\n  // Visual Studio defines the HUGE_VAL class of macros using purposeful\n  // constant arithmetic overflow, which it then warns on when encountered.\n  const float huge_valf = std::numeric_limits<float>::infinity();\n#else\n  const float huge_valf = HUGE_VALF;\n#endif\n} // End llvm namespace\n\n#endif\n"
  },
  {
    "path": "third_party/llvm/include/llvm/Support/type_traits.h",
    "content": "//===- llvm/Support/type_traits.h - Simplfied type traits -------*- C++ -*-===//\n//\n//                     The LLVM Compiler Infrastructure\n//\n// This file is distributed under the University of Illinois Open Source\n// License. See LICENSE.TXT for details.\n//\n//===----------------------------------------------------------------------===//\n//\n// This file provides a template class that determines if a type is a class or\n// not. The basic mechanism, based on using the pointer to member function of\n// a zero argument to a function was \"boosted\" from the boost type_traits\n// library. See http://www.boost.org/ for all the gory details.\n//\n//===----------------------------------------------------------------------===//\n\n#ifndef LLVM_SUPPORT_TYPE_TRAITS_H\n#define LLVM_SUPPORT_TYPE_TRAITS_H\n\n//#include \"llvm/Support/DataTypes.h\"\n#include <cstddef>\n#include <utility>\n\n#ifndef __has_feature\n#define LLVM_DEFINED_HAS_FEATURE\n#define __has_feature(x) 0\n#endif\n\n// This is actually the conforming implementation which works with abstract\n// classes.  However, enough compilers have trouble with it that most will use\n// the one in boost/type_traits/object_traits.hpp. This implementation actually\n// works with VC7.0, but other interactions seem to fail when we use it.\n\nnamespace llvm {\n\nnamespace dont_use\n{\n    // These two functions should never be used. They are helpers to\n    // the is_class template below. They cannot be located inside\n    // is_class because doing so causes at least GCC to think that\n    // the value of the \"value\" enumerator is not constant. Placing\n    // them out here (for some strange reason) allows the sizeof\n    // operator against them to magically be constant. This is\n    // important to make the is_class<T>::value idiom zero cost. it\n    // evaluates to a constant 1 or 0 depending on whether the\n    // parameter T is a class or not (respectively).\n    template<typename T> char is_class_helper(void(T::*)());\n    template<typename T> double is_class_helper(...);\n}\n\ntemplate <typename T>\nstruct is_class\n{\n  // is_class<> metafunction due to Paul Mensonides (leavings@attbi.com). For\n  // more details:\n  // http://groups.google.com/groups?hl=en&selm=000001c1cc83%24e154d5e0%247772e50c%40c161550a&rnum=1\npublic:\n  static const bool value =\n      sizeof(char) == sizeof(dont_use::is_class_helper<T>(0));\n};\n\n\n/// isPodLike - This is a type trait that is used to determine whether a given\n/// type can be copied around with memcpy instead of running ctors etc.\ntemplate <typename T>\nstruct isPodLike {\n#if __has_feature(is_trivially_copyable)\n  // If the compiler supports the is_trivially_copyable trait use it, as it\n  // matches the definition of isPodLike closely.\n  static const bool value = __is_trivially_copyable(T);\n#else\n  // If we don't know anything else, we can (at least) assume that all non-class\n  // types are PODs.\n  static const bool value = !is_class<T>::value;\n#endif\n};\n\n// std::pair's are pod-like if their elements are.\ntemplate<typename T, typename U>\nstruct isPodLike<std::pair<T, U> > {\n  static const bool value = isPodLike<T>::value && isPodLike<U>::value;\n};\n\n\ntemplate <class T, T v>\nstruct integral_constant {\n  typedef T value_type;\n  static const value_type value = v;\n  typedef integral_constant<T,v> type;\n  operator value_type() { return value; }\n};\n\ntypedef integral_constant<bool, true> true_type;\ntypedef integral_constant<bool, false> false_type;\n\n/// \\brief Metafunction that determines whether the two given types are\n/// equivalent.\ntemplate<typename T, typename U> struct is_same       : public false_type {};\ntemplate<typename T>             struct is_same<T, T> : public true_type {};\n\n/// \\brief Metafunction that removes const qualification from a type.\ntemplate <typename T> struct remove_const          { typedef T type; };\ntemplate <typename T> struct remove_const<const T> { typedef T type; };\n\n/// \\brief Metafunction that removes volatile qualification from a type.\ntemplate <typename T> struct remove_volatile             { typedef T type; };\ntemplate <typename T> struct remove_volatile<volatile T> { typedef T type; };\n\n/// \\brief Metafunction that removes both const and volatile qualification from\n/// a type.\ntemplate <typename T> struct remove_cv {\n  typedef typename remove_const<typename remove_volatile<T>::type>::type type;\n};\n\n/// \\brief Helper to implement is_integral metafunction.\ntemplate <typename T> struct is_integral_impl           : false_type {};\ntemplate <> struct is_integral_impl<         bool>      : true_type {};\ntemplate <> struct is_integral_impl<         char>      : true_type {};\ntemplate <> struct is_integral_impl<  signed char>      : true_type {};\ntemplate <> struct is_integral_impl<unsigned char>      : true_type {};\ntemplate <> struct is_integral_impl<         wchar_t>   : true_type {};\ntemplate <> struct is_integral_impl<         short>     : true_type {};\ntemplate <> struct is_integral_impl<unsigned short>     : true_type {};\ntemplate <> struct is_integral_impl<         int>       : true_type {};\ntemplate <> struct is_integral_impl<unsigned int>       : true_type {};\ntemplate <> struct is_integral_impl<         long>      : true_type {};\ntemplate <> struct is_integral_impl<unsigned long>      : true_type {};\ntemplate <> struct is_integral_impl<         long long> : true_type {};\ntemplate <> struct is_integral_impl<unsigned long long> : true_type {};\n\n/// \\brief Metafunction that determines whether the given type is an integral\n/// type.\ntemplate <typename T>\nstruct is_integral : is_integral_impl<T> {};\n\n/// \\brief Metafunction to remove reference from a type.\ntemplate <typename T> struct remove_reference { typedef T type; };\ntemplate <typename T> struct remove_reference<T&> { typedef T type; };\n\n/// \\brief Metafunction that determines whether the given type is a pointer\n/// type.\ntemplate <typename T> struct is_pointer : false_type {};\ntemplate <typename T> struct is_pointer<T*> : true_type {};\ntemplate <typename T> struct is_pointer<T* const> : true_type {};\ntemplate <typename T> struct is_pointer<T* volatile> : true_type {};\ntemplate <typename T> struct is_pointer<T* const volatile> : true_type {};\n\n/// \\brief Metafunction that determines wheather the given type is a reference.\ntemplate <typename T> struct is_reference : false_type {};\ntemplate <typename T> struct is_reference<T&> : true_type {};\n\n/// \\brief Metafunction that determines whether the given type is either an\n/// integral type or an enumeration type.\n///\n/// Note that this accepts potentially more integral types than we whitelist\n/// above for is_integral because it is based on merely being convertible\n/// implicitly to an integral type.\ntemplate <typename T> class is_integral_or_enum {\n  // Provide an overload which can be called with anything implicitly\n  // convertible to an unsigned long long. This should catch integer types and\n  // enumeration types at least. We blacklist classes with conversion operators\n  // below.\n  static double check_int_convertible(unsigned long long);\n  static char check_int_convertible(...);\n\n  typedef typename remove_reference<T>::type UnderlyingT;\n  static UnderlyingT &nonce_instance;\n\npublic:\n  static const bool\n    value = (!is_class<UnderlyingT>::value && !is_pointer<UnderlyingT>::value &&\n             !is_same<UnderlyingT, float>::value &&\n             !is_same<UnderlyingT, double>::value &&\n             sizeof(char) != sizeof(check_int_convertible(nonce_instance)));\n};\n\n// enable_if_c - Enable/disable a template based on a metafunction\ntemplate<bool Cond, typename T = void>\nstruct enable_if_c {\n  typedef T type;\n};\n\ntemplate<typename T> struct enable_if_c<false, T> { };\n\n// enable_if - Enable/disable a template based on a metafunction\ntemplate<typename Cond, typename T = void>\nstruct enable_if : public enable_if_c<Cond::value, T> { };\n\nnamespace dont_use {\n  template<typename Base> char base_of_helper(const volatile Base*);\n  template<typename Base> double base_of_helper(...);\n}\n\n/// is_base_of - Metafunction to determine whether one type is a base class of\n/// (or identical to) another type.\ntemplate<typename Base, typename Derived>\nstruct is_base_of {\n  static const bool value\n    = is_class<Base>::value && is_class<Derived>::value &&\n      sizeof(char) == sizeof(dont_use::base_of_helper<Base>((Derived*)0));\n};\n\n// remove_pointer - Metafunction to turn Foo* into Foo.  Defined in\n// C++0x [meta.trans.ptr].\ntemplate <typename T> struct remove_pointer { typedef T type; };\ntemplate <typename T> struct remove_pointer<T*> { typedef T type; };\ntemplate <typename T> struct remove_pointer<T*const> { typedef T type; };\ntemplate <typename T> struct remove_pointer<T*volatile> { typedef T type; };\ntemplate <typename T> struct remove_pointer<T*const volatile> {\n    typedef T type; };\n\n// If T is a pointer, just return it. If it is not, return T&.\ntemplate<typename T, typename Enable = void>\nstruct add_lvalue_reference_if_not_pointer { typedef T &type; };\n\ntemplate<typename T>\nstruct add_lvalue_reference_if_not_pointer<T,\n                                     typename enable_if<is_pointer<T> >::type> {\n  typedef T type;\n};\n\n// If T is a pointer to X, return a pointer to const X. If it is not, return\n// const T.\ntemplate<typename T, typename Enable = void>\nstruct add_const_past_pointer { typedef const T type; };\n\ntemplate<typename T>\nstruct add_const_past_pointer<T, typename enable_if<is_pointer<T> >::type> {\n  typedef const typename remove_pointer<T>::type *type;\n};\n\ntemplate <bool, typename T, typename F>\nstruct conditional { typedef T type; };\n\ntemplate <typename T, typename F>\nstruct conditional<false, T, F> { typedef F type; };\n\n}\n\n#ifdef LLVM_DEFINED_HAS_FEATURE\n#undef __has_feature\n#endif\n\n#endif\n"
  },
  {
    "path": "third_party/microprofile/README.md",
    "content": "# microprofile\n\nMicroProfile is a embeddable profiler in a single file, written in C++\n\nIt can display profile information in the application, or by generating captures via a minimal built in webserver.\n\n# Dependencies\nMicroprofile supports generating compressed captures using miniz(http:/code.google.com/miniz).\n\n# License\nLicensed using unlicense.org\n\n# Screenshot\n![Microprofile in action](https://pbs.twimg.com/media/BnvzublCEAA0Mqf.png:large)\n"
  },
  {
    "path": "third_party/microprofile/microprofile.h",
    "content": "#pragma once\n// This is free and unencumbered software released into the public domain.\n// Anyone is free to copy, modify, publish, use, compile, sell, or\n// distribute this software, either in source code form or as a compiled\n// binary, for any purpose, commercial or non-commercial, and by any\n// means.\n// In jurisdictions that recognize copyright laws, the author or authors\n// of this software dedicate any and all copyright interest in the\n// software to the public domain. We make this dedication for the benefit\n// of the public at large and to the detriment of our heirs and\n// successors. We intend this dedication to be an overt act of\n// relinquishment in perpetuity of all present and future rights to this\n// software under copyright law.\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n// IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR\n// OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\n// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n// OTHER DEALINGS IN THE SOFTWARE.\n// For more information, please refer to <http://unlicense.org/>\n//\n// ***********************************************************************\n//\n//\n//\n//\n// Howto:\n// Call these functions from your code:\n//  MicroProfileOnThreadCreate\n//  MicroProfileMouseButton\n//  MicroProfileMousePosition \n//  MicroProfileModKey\n//  MicroProfileFlip  \t\t\t\t<-- Call this once per frame\n//  MicroProfileDraw  \t\t\t\t<-- Call this once per frame\n//  MicroProfileToggleDisplayMode \t<-- Bind to a key to toggle profiling\n//  MicroProfileTogglePause\t\t\t<-- Bind to a key to toggle pause\n//\n// Use these macros in your code in blocks you want to time:\n//\n// \tMICROPROFILE_DECLARE\n// \tMICROPROFILE_DEFINE\n// \tMICROPROFILE_DECLARE_GPU\n// \tMICROPROFILE_DEFINE_GPU\n// \tMICROPROFILE_SCOPE\n// \tMICROPROFILE_SCOPEI\n// \tMICROPROFILE_SCOPEGPU\n// \tMICROPROFILE_SCOPEGPUI\n//  MICROPROFILE_META\n//  MICROPROFILE_LABEL\n//  MICROPROFILE_LABELF\n//\n//\tUsage:\n//\n//\t{\n//\t\tMICROPROFILE_SCOPEI(\"GroupName\", \"TimerName\", nColorRgb):\n// \t\t..Code to be timed..\n//  }\n//\n//\tMICROPROFILE_DECLARE / MICROPROFILE_DEFINE allows defining groups in a shared place, to ensure sorting of the timers\n//\n//  (in global scope)\n//  MICROPROFILE_DEFINE(g_ProfileFisk, \"Fisk\", \"Skalle\", nSomeColorRgb);\n//\n//  (in some other file)\n//  MICROPROFILE_DECLARE(g_ProfileFisk);\n//\n//  void foo(){\n//  \tMICROPROFILE_SCOPE(g_ProfileFisk);\n//  }\n//\n//  Once code is instrumented the gui is activeted by calling MicroProfileToggleDisplayMode or by clicking in the upper left corner of\n//  the screen\n//\n// The following functions must be implemented before the profiler is usable\n//  debug render:\n// \t\tvoid MicroProfileDrawText(int nX, int nY, uint32_t nColor, const char* pText, uint32_t nNumCharacters);\n// \t\tvoid MicroProfileDrawBox(int nX, int nY, int nX1, int nY1, uint32_t nColor, MicroProfileBoxType = MicroProfileBoxTypeFlat);\n// \t\tvoid MicroProfileDrawLine2D(uint32_t nVertices, float* pVertices, uint32_t nColor);\n//  Gpu time stamps: (See below for d3d/opengl helper)\n// \t\tuint32_t MicroProfileGpuInsertTimer(void* pContext);\n// \t\tuint64_t MicroProfileGpuGetTimeStamp(uint32_t nKey);\n// \t\tuint64_t MicroProfileTicksPerSecondGpu();\n//  threading:\n//      const char* MicroProfileGetThreadName(); Threadnames in detailed view\n//\n// Default implementations of Gpu timestamp functions:\n// \t\tOpenGL:\n// \t\t\tin .c file where MICROPROFILE_IMPL is defined:\n//   \t\t#define MICROPROFILE_GPU_TIMERS_GL 1\n// \t\t\tcall MicroProfileGpuInitGL() on startup\n//\t\tD3D11:\n// \t\t\tin .c file where MICROPROFILE_IMPL is defined:\n//   \t\t#define MICROPROFILE_GPU_TIMERS_D3D11 1\n// \t\t\tcall MicroProfileGpuInitD3D11(Device) on startup\n//\t\tD3D12:\n// \t\t\tin .c file where MICROPROFILE_IMPL is defined:\n//   \t\t#define MICROPROFILE_GPU_TIMERS_D3D12 1\n// \t\t\tcall MicroProfileGpuInitD3D12(Device, CommandQueue) on startup\n//\t\t\tsingle-threaded: call MicroProfileGpuSetContext(CommandList) every frame before issuing GPU markers\n//\t\t\tmulti-threaded:\n//\t\t\t\t#define MICROPROFILE_GPU_TIMERS_MULTITHREADED 1\n//\t\t\t\ton recording thread before using command list, call MicroProfileGpuBegin(CommandList)\n//\t\t\t\ton recording thread after you're done with command list, call work = MicroProfileGpuEnd()\n//\t\t\t\twhen replaying, call MicroProfileGpuSubmit(work) in the same order as ExecuteCommandLists\n//\t\tVulkan:\n// \t\t\tin .c file where MICROPROFILE_IMPL is defined:\n//   \t\t#define MICROPROFILE_GPU_TIMERS_VK 1\n// \t\t\tcall MicroProfileGpuInitVK(Device, PhysicalDevice, Queue) on startup\n// \t\t\tthe rest is the same as for D3D12\n//\n// Limitations:\n//  GPU timestamps can only be inserted from one thread.\n\n\n\n#ifndef MICROPROFILE_ENABLED\n#define MICROPROFILE_ENABLED 1\n#endif\n\n#include <stdint.h>\ntypedef uint64_t MicroProfileToken;\ntypedef uint16_t MicroProfileGroupId;\n\n#if 0 == MICROPROFILE_ENABLED\n\n#define MICROPROFILE_DECLARE(var)\n#define MICROPROFILE_DEFINE(var, group, name, color)\n#define MICROPROFILE_DECLARE_GPU(var)\n#define MICROPROFILE_DEFINE_GPU(var, name, color)\n#define MICROPROFILE_SCOPE(var) do{}while(0)\n#define MICROPROFILE_SCOPE_TOKEN(token) do{} while(0)\n#define MICROPROFILE_SCOPEI(group, name, color) do{}while(0)\n#define MICROPROFILE_SCOPEGPU(var) do{}while(0)\n#define MICROPROFILE_SCOPEGPUI(name, color) do{}while(0)\n#define MICROPROFILE_META_CPU(name, count)\n#define MICROPROFILE_META_GPU(name, count)\n#define MICROPROFILE_LABEL(group, name) do{}while(0)\n#define MICROPROFILE_LABELF(group, name, ...) do{}while(0)\n#define MICROPROFILE_COUNTER_ADD(name, count) do{} while(0)\n#define MICROPROFILE_COUNTER_SUB(name, count) do{} while(0)\n#define MICROPROFILE_COUNTER_SET(name, count) do{} while(0)\n#define MICROPROFILE_COUNTER_SET_LIMIT(name, count) do{} while(0)\n#define MICROPROFILE_COUNTER_CONFIG(name, type, limit, flags) do{} while(0)\n\n#define MICROPROFILE_FORCEENABLECPUGROUP(s) do{} while(0)\n#define MICROPROFILE_FORCEDISABLECPUGROUP(s) do{} while(0)\n#define MICROPROFILE_FORCEENABLEGPUGROUP(s) do{} while(0)\n#define MICROPROFILE_FORCEDISABLEGPUGROUP(s) do{} while(0)\n\n#define MicroProfileGetTime(group, name) 0.f\n#define MicroProfileOnThreadCreate(foo) do{}while(0)\n#define MicroProfileFlip() do{}while(0)\n#define MicroProfileSetAggregateFrames(a) do{}while(0)\n#define MicroProfileGetAggregateFrames() 0\n#define MicroProfileGetCurrentAggregateFrames() 0\n#define MicroProfileTogglePause() do{}while(0)\n#define MicroProfileShutdown() do{}while(0)\n#define MicroProfileSetForceEnable(a) do{} while(0)\n#define MicroProfileGetForceEnable() false\n#define MicroProfileSetEnableAllGroups(a) do{} while(0)\n#define MicroProfileEnableCategory(a) do{} while(0)\n#define MicroProfileDisableCategory(a) do{} while(0)\n#define MicroProfileGetEnableAllGroups() false\n#define MicroProfileSetForceMetaCounters(a)\n#define MicroProfileGetForceMetaCounters() 0\n#define MicroProfileEnableMetaCounter(c) do{} while(0)\n#define MicroProfileDisableMetaCounter(c) do{} while(0)\n#define MicroProfileContextSwitchTraceStart() do{} while(0)\n#define MicroProfileContextSwitchTraceStop() do{} while(0)\n#define MicroProfileDumpFile(path,type,frames) do{} while(0)\n#define MicroProfileWebServerStart() do{} while(0)\n#define MicroProfileWebServerStop() do{} while(0)\n#define MicroProfileWebServerPort() 0\n\n#define MicroProfileGpuSetContext(c) do{} while(0)\n#define MicroProfileGpuBegin(c) do{} while(0)\n#define MicroProfileGpuEnd() 0\n#define MicroProfileGpuSubmit(w) do{} while(0)\n\n#else\n\n#include <stdint.h>\n#include <string.h>\n\n#ifndef MICROPROFILE_NOCXX11\n#include <thread>\n#include <mutex>\n#include <atomic>\n#endif\n\n#ifndef MICROPROFILE_API\n#define MICROPROFILE_API\n#endif\n\nMICROPROFILE_API int64_t MicroProfileTicksPerSecondCpu();\n\n\n#if defined(__APPLE__)\n#include <mach/mach.h>\n#include <mach/mach_time.h>\n#include <unistd.h>\n#include <libkern/OSAtomic.h>\n#include <TargetConditionals.h>\n\n#define MP_TICK() mach_absolute_time()\ninline int64_t MicroProfileTicksPerSecondCpu()\n{\n\tstatic int64_t nTicksPerSecond = 0;\t\n\tif(nTicksPerSecond == 0) \n\t{\n\t\tmach_timebase_info_data_t sTimebaseInfo;\t\n\t\tmach_timebase_info(&sTimebaseInfo);\n\t\tnTicksPerSecond = 1000000000ll * sTimebaseInfo.denom / sTimebaseInfo.numer;\n\t}\n\treturn nTicksPerSecond;\n}\ninline uint64_t MicroProfileGetCurrentThreadId()\n{\t\n\tuint64_t tid;\n\tpthread_threadid_np(nullptr, &tid);\n\treturn tid;\n}\n\n#define MP_BREAK() __builtin_trap()\n#if __has_feature(tls)\n#define MP_THREAD_LOCAL __thread\n#endif\n#define MP_STRCASECMP strcasecmp\n#define MP_GETCURRENTTHREADID() MicroProfileGetCurrentThreadId()\ntypedef uint64_t MicroProfileThreadIdType;\n#define MP_GETCURRENTPROCESSID() getpid()\ntypedef uint32_t MicroProfileProcessIdType;\n#elif defined(_WIN32)\nint64_t MicroProfileGetTick();\n#define MP_TICK() MicroProfileGetTick()\n#define MP_BREAK() __debugbreak()\n#define MP_THREAD_LOCAL __declspec(thread)\n#define MP_STRCASECMP _stricmp\n#define MP_GETCURRENTTHREADID() GetCurrentThreadId()\ntypedef uint32_t MicroProfileThreadIdType;\n#define MP_GETCURRENTPROCESSID() GetCurrentProcessId()\ntypedef uint32_t MicroProfileProcessIdType;\n\n#elif defined(__linux__)\n#include <unistd.h>\n#include <time.h>\ninline int64_t MicroProfileTicksPerSecondCpu()\n{\n\treturn 1000000000ll;\n}\n\ninline int64_t MicroProfileGetTick()\n{\n\ttimespec ts;\n\tclock_gettime(CLOCK_REALTIME, &ts);\n\treturn 1000000000ll * ts.tv_sec + ts.tv_nsec;\n}\n#define MP_TICK() MicroProfileGetTick()\n#define MP_BREAK() __builtin_trap()\n#ifndef __ANDROID__ // __thread is incompatible with ffunction-sections/fdata-sections\n#define MP_THREAD_LOCAL __thread\n#endif\n#define MP_STRCASECMP strcasecmp\n#define MP_GETCURRENTTHREADID() (uint64_t)pthread_self()\ntypedef uint64_t MicroProfileThreadIdType;\n#define MP_GETCURRENTPROCESSID() getpid()\ntypedef uint32_t MicroProfileProcessIdType;\n#endif\n\n\n#ifndef MP_GETCURRENTTHREADID \n#define MP_GETCURRENTTHREADID() 0\ntypedef uint32_t MicroProfileThreadIdType;\n#endif\n\n#ifndef MP_GETCURRENTPROCESSID\n#define MP_GETCURRENTPROCESSID() 0\ntypedef uint32_t MicroProfileProcessIdType;\n#endif\n\n#ifndef MP_ASSERT\n#define MP_ASSERT(a) do{if(!(a)){MP_BREAK();} }while(0)\n#endif\n\n#define MICROPROFILE_DECLARE(var) extern MicroProfileToken g_mp_##var\n#define MICROPROFILE_DEFINE(var, group, name, color) MicroProfileToken g_mp_##var = MicroProfileGetToken(group, name, color, MicroProfileTokenTypeCpu)\n#define MICROPROFILE_DECLARE_GPU(var) extern MicroProfileToken g_mp_##var\n#define MICROPROFILE_DEFINE_GPU(var, name, color) MicroProfileToken g_mp_##var = MicroProfileGetToken(\"GPU\", name, color, MicroProfileTokenTypeGpu)\n#define MICROPROFILE_TOKEN_PASTE0(a, b) a ## b\n#define MICROPROFILE_TOKEN_PASTE(a, b)  MICROPROFILE_TOKEN_PASTE0(a,b)\n#define MICROPROFILE_SCOPE(var) MicroProfileScopeHandler MICROPROFILE_TOKEN_PASTE(foo, __LINE__)(g_mp_##var)\n#define MICROPROFILE_SCOPE_TOKEN(token) MicroProfileScopeHandler MICROPROFILE_TOKEN_PASTE(foo, __LINE__)(token)\n#define MICROPROFILE_SCOPEI(group, name, color) static MicroProfileToken MICROPROFILE_TOKEN_PASTE(g_mp,__LINE__) = MicroProfileGetToken(group, name, color, MicroProfileTokenTypeCpu); MicroProfileScopeHandler MICROPROFILE_TOKEN_PASTE(foo,__LINE__)( MICROPROFILE_TOKEN_PASTE(g_mp,__LINE__))\n#define MICROPROFILE_SCOPEGPU(var) MicroProfileScopeHandler MICROPROFILE_TOKEN_PASTE(foo, __LINE__)(g_mp_##var)\n#define MICROPROFILE_SCOPEGPUI(name, color) static MicroProfileToken MICROPROFILE_TOKEN_PASTE(g_mp,__LINE__) = MicroProfileGetToken(\"GPU\", name, color,  MicroProfileTokenTypeGpu); MicroProfileScopeHandler MICROPROFILE_TOKEN_PASTE(foo,__LINE__)( MICROPROFILE_TOKEN_PASTE(g_mp,__LINE__))\n#define MICROPROFILE_META_CPU(name, count) static MicroProfileToken MICROPROFILE_TOKEN_PASTE(g_mp_meta,__LINE__) = MicroProfileGetMetaToken(name); MicroProfileMetaUpdate(MICROPROFILE_TOKEN_PASTE(g_mp_meta,__LINE__), count, MicroProfileTokenTypeCpu)\n#define MICROPROFILE_META_GPU(name, count) static MicroProfileToken MICROPROFILE_TOKEN_PASTE(g_mp_meta,__LINE__) = MicroProfileGetMetaToken(name); MicroProfileMetaUpdate(MICROPROFILE_TOKEN_PASTE(g_mp_meta,__LINE__), count, MicroProfileTokenTypeGpu)\n#define MICROPROFILE_LABEL(group, name) static MicroProfileToken MICROPROFILE_TOKEN_PASTE(g_mp,__LINE__) = MicroProfileGetLabelToken(group); MicroProfileLabel(MICROPROFILE_TOKEN_PASTE(g_mp,__LINE__), name)\n#define MICROPROFILE_LABELF(group, name, ...) static MicroProfileToken MICROPROFILE_TOKEN_PASTE(g_mp,__LINE__) = MicroProfileGetLabelToken(group); MicroProfileLabelFormat(MICROPROFILE_TOKEN_PASTE(g_mp,__LINE__), name, ## __VA_ARGS__)\n#define MICROPROFILE_COUNTER_ADD(name, count) static MicroProfileToken MICROPROFILE_TOKEN_PASTE(g_mp_counter,__LINE__) = MicroProfileGetCounterToken(name); MicroProfileCounterAdd(MICROPROFILE_TOKEN_PASTE(g_mp_counter,__LINE__), count)\n#define MICROPROFILE_COUNTER_SUB(name, count) static MicroProfileToken MICROPROFILE_TOKEN_PASTE(g_mp_counter,__LINE__) = MicroProfileGetCounterToken(name); MicroProfileCounterAdd(MICROPROFILE_TOKEN_PASTE(g_mp_counter,__LINE__), -(int64_t)count)\n#define MICROPROFILE_COUNTER_SET(name, count) static MicroProfileToken MICROPROFILE_TOKEN_PASTE(g_mp_counter,__LINE__) = MicroProfileGetCounterToken(name); MicroProfileCounterSet(MICROPROFILE_TOKEN_PASTE(g_mp_counter,__LINE__), count)\n#define MICROPROFILE_COUNTER_SET_LIMIT(name, count) static MicroProfileToken MICROPROFILE_TOKEN_PASTE(g_mp_counter,__LINE__) = MicroProfileGetCounterToken(name); MicroProfileCounterSetLimit(MICROPROFILE_TOKEN_PASTE(g_mp_counter,__LINE__), count)\n#define MICROPROFILE_COUNTER_CONFIG(name, type, limit, flags) MicroProfileCounterConfig(name, type, limit, flags\n\n#ifndef MICROPROFILE_USE_THREAD_NAME_CALLBACK\n#define MICROPROFILE_USE_THREAD_NAME_CALLBACK 0\n#endif\n\n#ifndef MICROPROFILE_PER_THREAD_BUFFER_SIZE\n#define MICROPROFILE_PER_THREAD_BUFFER_SIZE (2048<<10)\n#endif\n\n#ifndef MICROPROFILE_PER_THREAD_GPU_BUFFER_SIZE\n#define MICROPROFILE_PER_THREAD_GPU_BUFFER_SIZE (1024<<10)\n#endif\n\n#ifndef MICROPROFILE_MAX_FRAME_HISTORY\n#define MICROPROFILE_MAX_FRAME_HISTORY 512\n#endif\n\n#ifndef MICROPROFILE_PRINTF\n#define MICROPROFILE_PRINTF printf\n#endif\n\n#ifndef MICROPROFILE_META_MAX\n#define MICROPROFILE_META_MAX 8\n#endif\n\n#ifndef MICROPROFILE_WEBSERVER_PORT\n#define MICROPROFILE_WEBSERVER_PORT 1338\n#endif\n\n#ifndef MICROPROFILE_WEBSERVER\n#define MICROPROFILE_WEBSERVER 1\n#endif\n\n#ifndef MICROPROFILE_WEBSERVER_FRAMES\n#define MICROPROFILE_WEBSERVER_FRAMES 30\n#endif\n\n#ifndef MICROPROFILE_WEBSERVER_SOCKET_BUFFER_SIZE\n#define MICROPROFILE_WEBSERVER_SOCKET_BUFFER_SIZE (16<<10)\n#endif\n\n#ifndef MICROPROFILE_LABEL_BUFFER_SIZE\n#define MICROPROFILE_LABEL_BUFFER_SIZE (1024<<10)\n#endif\n\n#ifndef MICROPROFILE_GPU_MAX_QUERIES\n#define MICROPROFILE_GPU_MAX_QUERIES (8<<10)\n#endif\n\n#ifndef MICROPROFILE_GPU_FRAME_DELAY\n#define MICROPROFILE_GPU_FRAME_DELAY 3\n#endif\n\n#ifndef MICROPROFILE_NAME_MAX_LEN\n#define MICROPROFILE_NAME_MAX_LEN 64\n#endif\n\n#ifndef MICROPROFILE_LABEL_MAX_LEN\n#define MICROPROFILE_LABEL_MAX_LEN 256\n#endif\n\n#ifndef MICROPROFILE_EMBED_HTML\n#define MICROPROFILE_EMBED_HTML 1\n#endif\n\n#ifndef MICROPROFILE_GPU_TIMERS_MULTITHREADED\n#define MICROPROFILE_GPU_TIMERS_MULTITHREADED 0\n#endif\n\n#define MICROPROFILE_FORCEENABLECPUGROUP(s) MicroProfileForceEnableGroup(s, MicroProfileTokenTypeCpu)\n#define MICROPROFILE_FORCEDISABLECPUGROUP(s) MicroProfileForceDisableGroup(s, MicroProfileTokenTypeCpu)\n#define MICROPROFILE_FORCEENABLEGPUGROUP(s) MicroProfileForceEnableGroup(s, MicroProfileTokenTypeGpu)\n#define MICROPROFILE_FORCEDISABLEGPUGROUP(s) MicroProfileForceDisableGroup(s, MicroProfileTokenTypeGpu)\n\n#define MICROPROFILE_INVALID_TICK ((uint64_t)-1)\n#define MICROPROFILE_GROUP_MASK_ALL 0xffffffffffff\n\n\n#define MICROPROFILE_INVALID_TOKEN (uint64_t)0\n\nenum MicroProfileTokenType\n{\n\tMicroProfileTokenTypeCpu,\n\tMicroProfileTokenTypeGpu,\n};\n\nenum MicroProfileBoxType\n{\n\tMicroProfileBoxTypeBar,\n\tMicroProfileBoxTypeFlat,\n};\n\nenum MicroProfileDumpType\n{\n\tMicroProfileDumpTypeHtml,\n\tMicroProfileDumpTypeCsv\n};\n\n#ifdef __GNUC__\n#define MICROPROFILE_FORMAT(a, b) __attribute__((format(printf, a, b)))\n#else\n#define MICROPROFILE_FORMAT(a, b)\n#endif\n\nstruct MicroProfile;\n\nMICROPROFILE_API void MicroProfileInit();\nMICROPROFILE_API void MicroProfileShutdown();\nMICROPROFILE_API MicroProfileToken MicroProfileFindToken(const char* sGroup, const char* sName);\nMICROPROFILE_API MicroProfileToken MicroProfileGetToken(const char* sGroup, const char* sName, uint32_t nColor, MicroProfileTokenType Token = MicroProfileTokenTypeCpu);\nMICROPROFILE_API MicroProfileToken MicroProfileGetLabelToken(const char* sGroup, MicroProfileTokenType Token = MicroProfileTokenTypeCpu);\nMICROPROFILE_API MicroProfileToken MicroProfileGetMetaToken(const char* pName);\nMICROPROFILE_API MicroProfileToken MicroProfileGetCounterToken(const char* pName);\nMICROPROFILE_API void MicroProfileMetaUpdate(MicroProfileToken, int nCount, MicroProfileTokenType eTokenType);\nMICROPROFILE_API void MicroProfileCounterAdd(MicroProfileToken nToken, int64_t nCount);\nMICROPROFILE_API void MicroProfileCounterSet(MicroProfileToken nToken, int64_t nCount);\nMICROPROFILE_API void MicroProfileCounterSetLimit(MicroProfileToken nToken, int64_t nCount);\nMICROPROFILE_API void MicroProfileCounterConfig(const char* pCounterName, uint32_t nFormat, int64_t nLimit, uint32_t nFlags);\nMICROPROFILE_API uint64_t MicroProfileEnter(MicroProfileToken nToken);\nMICROPROFILE_API void MicroProfileLeave(MicroProfileToken nToken, uint64_t nTick);\nMICROPROFILE_API void MicroProfileLabel(MicroProfileToken nToken, const char* pName);\nMICROPROFILE_FORMAT(2, 3) MICROPROFILE_API void MicroProfileLabelFormat(MicroProfileToken nToken, const char* pName, ...);\nMICROPROFILE_API void MicroProfileLabelFormatV(MicroProfileToken nToken, const char* pName, va_list args);\ninline uint16_t MicroProfileGetTimerIndex(MicroProfileToken t){ return (t&0xffff); }\ninline uint64_t MicroProfileGetGroupMask(MicroProfileToken t){ return ((t>>16)&MICROPROFILE_GROUP_MASK_ALL);}\ninline MicroProfileToken MicroProfileMakeToken(uint64_t nGroupMask, uint16_t nTimer){ return (nGroupMask<<16) | nTimer;}\n\nMICROPROFILE_API void MicroProfileFlip(); //! call once per frame.\nMICROPROFILE_API void MicroProfileTogglePause();\nMICROPROFILE_API void MicroProfileForceEnableGroup(const char* pGroup, MicroProfileTokenType Type);\nMICROPROFILE_API void MicroProfileForceDisableGroup(const char* pGroup, MicroProfileTokenType Type);\nMICROPROFILE_API float MicroProfileGetTime(const char* pGroup, const char* pName);\n\nMICROPROFILE_API void MicroProfileOnThreadCreate(const char* pThreadName); //should be called from newly created threads\nMICROPROFILE_API void MicroProfileOnThreadExit(); //call on exit to reuse log\nMICROPROFILE_API void MicroProfileSetForceEnable(bool bForceEnable);\nMICROPROFILE_API bool MicroProfileGetForceEnable();\nMICROPROFILE_API void MicroProfileSetEnableAllGroups(bool bEnable); \nMICROPROFILE_API void MicroProfileEnableCategory(const char* pCategory); \nMICROPROFILE_API void MicroProfileDisableCategory(const char* pCategory); \nMICROPROFILE_API bool MicroProfileGetEnableAllGroups();\nMICROPROFILE_API void MicroProfileSetForceMetaCounters(bool bEnable); \nMICROPROFILE_API bool MicroProfileGetForceMetaCounters();\nMICROPROFILE_API void MicroProfileEnableMetaCounter(const char* pMet);\nMICROPROFILE_API void MicroProfileDisableMetaCounter(const char* pMet);\nMICROPROFILE_API void MicroProfileSetAggregateFrames(int frames);\nMICROPROFILE_API int MicroProfileGetAggregateFrames();\nMICROPROFILE_API int MicroProfileGetCurrentAggregateFrames();\nMICROPROFILE_API MicroProfile* MicroProfileGet();\nMICROPROFILE_API void MicroProfileGetRange(uint32_t nPut, uint32_t nGet, uint32_t nRange[2][2]);\nMICROPROFILE_API std::recursive_mutex& MicroProfileGetMutex();\n\nMICROPROFILE_API void MicroProfileContextSwitchTraceStart();\nMICROPROFILE_API void MicroProfileContextSwitchTraceStop();\n\nstruct MicroProfileThreadInfo\n{\n\tMicroProfileProcessIdType nProcessId;\n\tMicroProfileThreadIdType nThreadId;\n};\n\nMICROPROFILE_API void MicroProfileContextSwitchSearch(uint32_t* pContextSwitchStart, uint32_t* pContextSwitchEnd, uint64_t nBaseTicksCpu, uint64_t nBaseTicksEndCpu);\nMICROPROFILE_API uint32_t MicroProfileContextSwitchGatherThreads(uint32_t nContextSwitchStart, uint32_t nContextSwitchEnd, MicroProfileThreadInfo* Threads, uint32_t* nNumThreadsBase);\n\nMICROPROFILE_API const char* MicroProfileGetProcessName(MicroProfileProcessIdType nId, char* Buffer, uint32_t nSize);\n\nMICROPROFILE_API void MicroProfileDumpFile(const char* pPath, MicroProfileDumpType eType, uint32_t nFrames);\nMICROPROFILE_API int MicroProfileFormatCounter(int eFormat, int64_t nCounter, char* pOut, uint32_t nBufferSize);\n\nMICROPROFILE_API void MicroProfileWebServerStart();\nMICROPROFILE_API void MicroProfileWebServerStop();\nMICROPROFILE_API uint32_t MicroProfileWebServerPort();\n\nMICROPROFILE_API void MicroProfileGpuInitGL();\nMICROPROFILE_API void MicroProfileGpuInitD3D11(struct ID3D11Device* pDevice);\nMICROPROFILE_API void MicroProfileGpuInitD3D12(struct ID3D12Device* pDevice, struct ID3D12CommandQueue* pCommandQueue);\nMICROPROFILE_API void MicroProfileGpuInitVK(struct VkDevice_T* pDevice, struct VkPhysicalDevice_T* pPhysicalDevice, struct VkQueue_T* pQueue);\nMICROPROFILE_API void MicroProfileGpuShutdown();\n\nMICROPROFILE_API void MicroProfileGpuSetContext(void* pContext);\nMICROPROFILE_API void MicroProfileGpuBegin(void* pContext);\nMICROPROFILE_API uint64_t MicroProfileGpuEnd();\nMICROPROFILE_API void MicroProfileGpuSubmit(uint64_t nWork);\n\nMICROPROFILE_API uint32_t MicroProfileGpuInsertTimer(void* pContext);\nMICROPROFILE_API uint64_t MicroProfileGpuGetTimeStamp(uint32_t nKey);\nMICROPROFILE_API uint64_t MicroProfileTicksPerSecondGpu();\nMICROPROFILE_API uint32_t MicroProfileGpuFlip();\nMICROPROFILE_API bool MicroProfileGetGpuTickReference(int64_t* pOutCpu, int64_t* pOutGpu);\n\n#if MICROPROFILE_USE_THREAD_NAME_CALLBACK\nMICROPROFILE_API const char* MicroProfileGetThreadName();\n#else\n#define MicroProfileGetThreadName() \"<Unknown>\"\n#endif\n\n#if !defined(MICROPROFILE_THREAD_NAME_FROM_ID)\n#define MICROPROFILE_THREAD_NAME_FROM_ID(a) \"\"\n#endif\n\nstruct MicroProfileScopeHandler\n{\n\tMicroProfileToken nToken;\n\tuint64_t nTick;\n\tMicroProfileScopeHandler(MicroProfileToken Token):nToken(Token)\n\t{\n\t\tnTick = MicroProfileEnter(nToken);\n\t}\n\t~MicroProfileScopeHandler()\n\t{\n\t\tMicroProfileLeave(nToken, nTick);\n\t}\n};\n\n#define MICROPROFILE_MAX_COUNTERS 512\n#define MICROPROFILE_MAX_COUNTER_NAME_CHARS (MICROPROFILE_MAX_COUNTERS*16)\n\n#define MICROPROFILE_MAX_GROUPS 48 //dont bump! no. of bits used it bitmask\n#define MICROPROFILE_MAX_CATEGORIES 16\n#define MICROPROFILE_MAX_GRAPHS 5\n#define MICROPROFILE_GRAPH_HISTORY 128\n#define MICROPROFILE_BUFFER_SIZE ((MICROPROFILE_PER_THREAD_BUFFER_SIZE)/sizeof(MicroProfileLogEntry))\n#define MICROPROFILE_GPU_BUFFER_SIZE ((MICROPROFILE_PER_THREAD_GPU_BUFFER_SIZE)/sizeof(MicroProfileLogEntry))\n#define MICROPROFILE_GPU_FRAMES ((MICROPROFILE_GPU_FRAME_DELAY)+1)\n#define MICROPROFILE_MAX_CONTEXT_SWITCH_THREADS 256\n#define MICROPROFILE_STACK_MAX 32\n//#define MICROPROFILE_MAX_PRESETS 5\n#define MICROPROFILE_ANIM_DELAY_PRC 0.5f\n#define MICROPROFILE_GAP_TIME 50 //extra ms to fetch to close timers from earlier frames\n\n\n#ifndef MICROPROFILE_MAX_TIMERS\n#define MICROPROFILE_MAX_TIMERS 1024\n#endif\n\n#ifndef MICROPROFILE_MAX_THREADS\n#define MICROPROFILE_MAX_THREADS 32\n#endif \n\n#ifndef MICROPROFILE_UNPACK_RED\n#define MICROPROFILE_UNPACK_RED(c) ((c)>>16)\n#endif\n\n#ifndef MICROPROFILE_UNPACK_GREEN\n#define MICROPROFILE_UNPACK_GREEN(c) ((c)>>8)\n#endif\n\n#ifndef MICROPROFILE_UNPACK_BLUE\n#define MICROPROFILE_UNPACK_BLUE(c) ((c))\n#endif\n\n#ifndef MICROPROFILE_DEFAULT_PRESET\n#define MICROPROFILE_DEFAULT_PRESET \"Default\"\n#endif\n\n\n#ifndef MICROPROFILE_CONTEXT_SWITCH_TRACE \n#if defined(_WIN32) \n#define MICROPROFILE_CONTEXT_SWITCH_TRACE 1\n#elif defined(__APPLE__) && !TARGET_OS_IPHONE\n#define MICROPROFILE_CONTEXT_SWITCH_TRACE 1\n#else\n#define MICROPROFILE_CONTEXT_SWITCH_TRACE 0\n#endif\n#endif\n\n#if MICROPROFILE_CONTEXT_SWITCH_TRACE\n#define MICROPROFILE_CONTEXT_SWITCH_BUFFER_SIZE (128*1024) //2mb with 16 byte entry size\n#else\n#define MICROPROFILE_CONTEXT_SWITCH_BUFFER_SIZE (1)\n#endif\n\n#ifndef MICROPROFILE_MINIZ\n#define MICROPROFILE_MINIZ 0\n#endif\n\n#ifndef MICROPROFILE_COUNTER_HISTORY\n#define MICROPROFILE_COUNTER_HISTORY 1\n#endif\n\n#ifdef _WIN32\n#include <basetsd.h>\ntypedef UINT_PTR MpSocket;\n#else\ntypedef int MpSocket;\n#endif\n\ntypedef std::thread* MicroProfileThread;\n\nenum MicroProfileDrawMask\n{\n\tMP_DRAW_OFF\t\t\t= 0x0,\n\tMP_DRAW_BARS\t\t= 0x1,\n\tMP_DRAW_DETAILED\t= 0x2,\n\tMP_DRAW_COUNTERS\t= 0x3,\n\tMP_DRAW_FRAME\t\t= 0x4,\n\tMP_DRAW_HIDDEN\t\t= 0x5,\n\tMP_DRAW_SIZE\t\t= 0x6,\n};\n\nenum MicroProfileDrawBarsMask\n{\n\tMP_DRAW_TIMERS \t\t\t\t= 0x1,\t\n\tMP_DRAW_AVERAGE\t\t\t\t= 0x2,\t\n\tMP_DRAW_MAX\t\t\t\t\t= 0x4,\t\n\tMP_DRAW_MIN\t\t\t\t\t= 0x8,\n\tMP_DRAW_CALL_COUNT\t\t\t= 0x10,\n\tMP_DRAW_TIMERS_EXCLUSIVE \t= 0x20,\n\tMP_DRAW_AVERAGE_EXCLUSIVE \t= 0x40,\t\n\tMP_DRAW_MAX_EXCLUSIVE\t\t= 0x80,\n\tMP_DRAW_META_FIRST\t\t\t= 0x100,\n\tMP_DRAW_ALL \t\t\t\t= 0xffffffff,\n\n};\n\nenum MicroProfileCounterFormat\n{\n\tMICROPROFILE_COUNTER_FORMAT_DEFAULT,\n\tMICROPROFILE_COUNTER_FORMAT_BYTES,\n};\n\nenum MicroProfileCounterFlags\n{\n\tMICROPROFILE_COUNTER_FLAG_NONE \t\t\t= 0,\n\tMICROPROFILE_COUNTER_FLAG_DETAILED\t\t= 0x1,\n\tMICROPROFILE_COUNTER_FLAG_DETAILED_GRAPH= 0x2,\n\t//internal:\n\tMICROPROFILE_COUNTER_FLAG_INTERNAL_MASK = ~0x3,\n\tMICROPROFILE_COUNTER_FLAG_HAS_LIMIT \t= 0x4,\n\tMICROPROFILE_COUNTER_FLAG_CLOSED\t\t= 0x8,\n\tMICROPROFILE_COUNTER_FLAG_MANUAL_SWAP\t= 0x10,\n\tMICROPROFILE_COUNTER_FLAG_LEAF\t\t\t= 0x20,\n};\n\ntypedef uint64_t MicroProfileLogEntry;\n\nstruct MicroProfileTimer\n{\n\tuint64_t nTicks;\n\tuint32_t nCount;\n};\n\nstruct MicroProfileCategory\n{\n\tchar pName[MICROPROFILE_NAME_MAX_LEN];\n\tuint64_t nGroupMask;\n};\n\nstruct MicroProfileGroupInfo\n{\n\tchar pName[MICROPROFILE_NAME_MAX_LEN];\n\tuint32_t nNameLen;\n\tuint32_t nGroupIndex;\n\tuint32_t nNumTimers;\n\tuint32_t nMaxTimerNameLen;\n\tuint32_t nColor;\n\tuint32_t nCategory;\n\tMicroProfileTokenType Type;\n};\n\nstruct MicroProfileTimerInfo\n{\n\tMicroProfileToken nToken;\n\tuint32_t nTimerIndex;\n\tuint32_t nGroupIndex;\n\tchar pName[MICROPROFILE_NAME_MAX_LEN];\n\tuint32_t nNameLen;\n\tuint32_t nColor;\n\tbool bGraph;\n};\n\nstruct MicroProfileCounterInfo\n{\n\tint nParent;\n\tint nSibling;\n\tint nFirstChild;\n\tuint16_t nNameLen;\n\tuint8_t nLevel;\n\tchar* pName;\n\tuint32_t nFlags;\n\tint64_t nLimit;\n\tMicroProfileCounterFormat eFormat;\n};\n\nstruct MicroProfileCounterHistory\n{\n\tuint32_t nPut;\n\tuint64_t nHistory[MICROPROFILE_GRAPH_HISTORY];\n};\n\nstruct MicroProfileGraphState\n{\n\tint64_t nHistory[MICROPROFILE_GRAPH_HISTORY];\n\tMicroProfileToken nToken;\n\tint32_t nKey;\n};\n\nstruct MicroProfileContextSwitch\n{\n\tMicroProfileThreadIdType nThreadOut;\n\tMicroProfileThreadIdType nThreadIn;\n\tMicroProfileProcessIdType nProcessIn;\n\tint64_t nCpu : 8;\n\tint64_t nTicks : 56;\n};\n\n\nstruct MicroProfileFrameState\n{\n\tint64_t nFrameStartCpu;\n\tint64_t nFrameStartGpu;\n\tuint32_t nFrameStartGpuTimer;\n\tuint32_t nLogStart[MICROPROFILE_MAX_THREADS];\n};\n\nstruct MicroProfileThreadLog\n{\n\tMicroProfileLogEntry*\tLog;\n\tstd::atomic<uint32_t>\tnPut;\n\tstd::atomic<uint32_t>\tnGet;\n\n\tMicroProfileLogEntry*\tLogGpu;\n\tstd::atomic<uint32_t>\tnPutGpu;\n\tuint32_t\t\t\t\tnStartGpu;\n\tuint32_t\t\t\t\tbActiveGpu;\n\tvoid*\t\t\t\t\tpContextGpu;\n\n\tuint32_t \t\t\t\tnActive;\n\tuint32_t \t\t\t\tnGpu;\n\tMicroProfileThreadIdType nThreadId;\n\tuint32_t \t\t\t\tnLogIndex;\n\n\tuint32_t\t\t\t\tnStack[MICROPROFILE_STACK_MAX];\n\tint64_t\t\t\t\t\tnChildTickStack[MICROPROFILE_STACK_MAX];\n\tuint32_t\t\t\t\tnStackPos;\n\n\n\tuint8_t\t\t\t\t\tnGroupStackPos[MICROPROFILE_MAX_GROUPS];\n\tint64_t \t\t\t\tnGroupTicks[MICROPROFILE_MAX_GROUPS];\n\tint64_t \t\t\t\tnAggregateGroupTicks[MICROPROFILE_MAX_GROUPS];\n\tenum\n\t{\n\t\tTHREAD_MAX_LEN = 64,\n\t};\n\tchar\t\t\t\t\tThreadName[64];\n\n\tint \t\t\t\t\tnFreeListNext;\n};\n\nstruct MicroProfileGpu\n{\n\tvoid (*Shutdown)();\n\tuint32_t (*Flip)();\n\tuint32_t (*InsertTimer)(void* pContext);\n\tuint64_t (*GetTimeStamp)(uint32_t nIndex);\n\tuint64_t (*GetTicksPerSecond)();\n\tbool (*GetTickReference)(int64_t* pOutCpu, int64_t* pOutGpu);\n};\n\nstruct MicroProfile\n{\n\tuint32_t nTotalTimers;\n\tuint32_t nGroupCount;\n\tuint32_t nCategoryCount;\n\tuint32_t nAggregateClear;\n\tuint32_t nAggregateFlip;\n\tuint32_t nAggregateFlipCount;\n\tuint32_t nAggregateFrames;\n\n\tuint64_t nAggregateFlipTick;\n\t\n\tuint32_t nDisplay;\n\tuint32_t nBars;\n\tuint64_t nActiveGroup;\n\tuint32_t nActiveBars;\n\n\tuint64_t nForceGroup;\n\tuint32_t nForceEnable;\n\tuint32_t nForceMetaCounters;\n\n\tuint64_t nForceGroupUI;\n\tuint64_t nActiveGroupWanted;\n\tuint32_t nAllGroupsWanted;\n\tuint32_t nAllThreadsWanted;\n\n\tuint32_t nOverflow;\n\n\tuint64_t nGroupMask;\n\tuint64_t nGroupMaskGpu;\n\tuint32_t nRunning;\n\tuint32_t nToggleRunning;\n\tuint32_t nMaxGroupSize;\n\tuint32_t nDumpFileNextFrame;\n\tuint32_t nAutoClearFrames;\n\tMicroProfileDumpType eDumpType;\n\tuint32_t nDumpFrames;\n\tchar DumpPath[512];\n\n\tint64_t nPauseTicks;\n\n\tfloat fReferenceTime;\n\tfloat fRcpReferenceTime;\n\n\tMicroProfileCategory\tCategoryInfo[MICROPROFILE_MAX_CATEGORIES];\n\tMicroProfileGroupInfo \tGroupInfo[MICROPROFILE_MAX_GROUPS];\n\tMicroProfileTimerInfo \tTimerInfo[MICROPROFILE_MAX_TIMERS];\n\tuint8_t\t\t\t\t\tTimerToGroup[MICROPROFILE_MAX_TIMERS];\n\t\n\tMicroProfileTimer \t\tAccumTimers[MICROPROFILE_MAX_TIMERS];\n\tuint64_t\t\t\t\tAccumMaxTimers[MICROPROFILE_MAX_TIMERS];\n\tuint64_t\t\t\t\tAccumMinTimers[MICROPROFILE_MAX_TIMERS];\n\tuint64_t\t\t\t\tAccumTimersExclusive[MICROPROFILE_MAX_TIMERS];\n\tuint64_t\t\t\t\tAccumMaxTimersExclusive[MICROPROFILE_MAX_TIMERS];\n\n\tMicroProfileTimer \t\tFrame[MICROPROFILE_MAX_TIMERS];\n\tuint64_t\t\t\t\tFrameExclusive[MICROPROFILE_MAX_TIMERS];\n\n\tMicroProfileTimer \t\tAggregate[MICROPROFILE_MAX_TIMERS];\n\tuint64_t\t\t\t\tAggregateMax[MICROPROFILE_MAX_TIMERS];\t\n\tuint64_t\t\t\t\tAggregateMin[MICROPROFILE_MAX_TIMERS];\n\tuint64_t\t\t\t\tAggregateExclusive[MICROPROFILE_MAX_TIMERS];\n\tuint64_t\t\t\t\tAggregateMaxExclusive[MICROPROFILE_MAX_TIMERS];\n\n\n\tuint64_t \t\t\t\tFrameGroup[MICROPROFILE_MAX_GROUPS];\n\tuint64_t \t\t\t\tAccumGroup[MICROPROFILE_MAX_GROUPS];\n\tuint64_t \t\t\t\tAccumGroupMax[MICROPROFILE_MAX_GROUPS];\n\t\n\tuint64_t \t\t\t\tAggregateGroup[MICROPROFILE_MAX_GROUPS];\n\tuint64_t \t\t\t\tAggregateGroupMax[MICROPROFILE_MAX_GROUPS];\n\n\n\tstruct \n\t{\n\t\tuint64_t nCounters[MICROPROFILE_MAX_TIMERS];\n\n\t\tuint64_t nAccum[MICROPROFILE_MAX_TIMERS];\n\t\tuint64_t nAccumMax[MICROPROFILE_MAX_TIMERS];\n\n\t\tuint64_t nAggregate[MICROPROFILE_MAX_TIMERS];\n\t\tuint64_t nAggregateMax[MICROPROFILE_MAX_TIMERS];\n\n\t\tuint64_t nSum;\n\t\tuint64_t nSumAccum;\n\t\tuint64_t nSumAccumMax;\n\t\tuint64_t nSumAggregate;\n\t\tuint64_t nSumAggregateMax;\n\n\t\tconst char* pName;\n\t} MetaCounters[MICROPROFILE_META_MAX];\n\n\tMicroProfileGraphState\tGraph[MICROPROFILE_MAX_GRAPHS];\n\tuint32_t\t\t\t\tnGraphPut;\n\n\tuint32_t\t\t\t\tnThreadActive[MICROPROFILE_MAX_THREADS];\n\tMicroProfileThreadLog* \tPool[MICROPROFILE_MAX_THREADS];\n\tuint32_t\t\t\t\tnNumLogs;\n\tuint32_t \t\t\t\tnMemUsage;\n\tint \t\t\t\t\tnFreeListHead;\n\n\tuint32_t \t\t\t\tnFrameCurrent;\n\tuint32_t \t\t\t\tnFrameCurrentIndex;\n\tuint32_t \t\t\t\tnFramePut;\n\tuint64_t\t\t\t\tnFramePutIndex;\n\n\tMicroProfileFrameState Frames[MICROPROFILE_MAX_FRAME_HISTORY];\n\n\tuint64_t\t\t\t\tnFlipTicks;\n\tuint64_t\t\t\t\tnFlipAggregate;\n\tuint64_t\t\t\t\tnFlipMax;\n\tuint64_t\t\t\t\tnFlipAggregateDisplay;\n\tuint64_t\t\t\t\tnFlipMaxDisplay;\n\n\tMicroProfileThread \t\t\tContextSwitchThread;\n\tbool  \t\t\t\t\t\tbContextSwitchRunning;\n\tbool\t\t\t\t\t\tbContextSwitchStart;\n\tbool\t\t\t\t\t\tbContextSwitchStop;\n\tbool\t\t\t\t\t\tbContextSwitchAllThreads;\n\tbool\t\t\t\t\t\tbContextSwitchNoBars;\n\tuint32_t\t\t\t\t\tnContextSwitchUsage;\n\tuint32_t\t\t\t\t\tnContextSwitchLastPut;\n\n\tint64_t\t\t\t\t\t\tnContextSwitchHoverTickIn;\n\tint64_t\t\t\t\t\t\tnContextSwitchHoverTickOut;\n\tuint32_t\t\t\t\t\tnContextSwitchHoverThread;\n\tuint32_t\t\t\t\t\tnContextSwitchHoverThreadBefore;\n\tuint32_t\t\t\t\t\tnContextSwitchHoverThreadAfter;\n\tuint8_t\t\t\t\t\t\tnContextSwitchHoverCpu;\n\tuint8_t\t\t\t\t\t\tnContextSwitchHoverCpuNext;\n\n\tuint32_t\t\t\t\t\tnContextSwitchPut;\t\n\tMicroProfileContextSwitch \tContextSwitch[MICROPROFILE_CONTEXT_SWITCH_BUFFER_SIZE];\n\n\tMicroProfileThread\t\t\tWebServerThread;\n\n\tMpSocket \t\t\t\t\tWebServerSocket;\n\tuint32_t\t\t\t\t\tnWebServerPort;\n\n\tchar\t\t\t\t\t\tWebServerBuffer[MICROPROFILE_WEBSERVER_SOCKET_BUFFER_SIZE];\n\tuint32_t\t\t\t\t\tnWebServerPut;\n\tuint64_t \t\t\t\t\tnWebServerDataSent;\n\n\tstd::atomic<char*>\t\t\tLabelBuffer;\n\tstd::atomic<uint64_t>\t\tnLabelPut;\n\n\tchar \t\t\t\t\t\tCounterNames[MICROPROFILE_MAX_COUNTER_NAME_CHARS];\n\tMicroProfileCounterInfo \tCounterInfo[MICROPROFILE_MAX_COUNTERS];\n\tuint32_t\t\t\t\t\tnNumCounters;\n\tuint32_t\t\t\t\t\tnCounterNamePos;\n\tstd::atomic<int64_t> \t\tCounters[MICROPROFILE_MAX_COUNTERS];\n\n#if MICROPROFILE_COUNTER_HISTORY // uses 1kb per allocated counter. 512kb for default counter count\n\tuint32_t\t\t\t\t\tnCounterHistoryPut;\n\tint64_t \t\t\t\t\tnCounterHistory[MICROPROFILE_GRAPH_HISTORY][MICROPROFILE_MAX_COUNTERS]; //flipped to make swapping cheap, drawing more expensive.\n\tint64_t \t\t\t\t\tnCounterMax[MICROPROFILE_MAX_COUNTERS];\n\tint64_t \t\t\t\t\tnCounterMin[MICROPROFILE_MAX_COUNTERS];\t\n#endif\n\n\tuint32_t\t\t\t\t\tnGpuFrameTimer;\n\tMicroProfileGpu\t\t\t\tGPU;\n};\n\n#define MP_LOG_TICK_MASK  0x0000ffffffffffff\n#define MP_LOG_INDEX_MASK 0x1fff000000000000\n#define MP_LOG_BEGIN_MASK 0xe000000000000000\n#define MP_LOG_GPU_EXTRA 0x4\n#define MP_LOG_LABEL 0x3\n#define MP_LOG_META 0x2\n#define MP_LOG_ENTER 0x1\n#define MP_LOG_LEAVE 0x0\n\n\ninline uint64_t MicroProfileLogType(MicroProfileLogEntry Index)\n{\n\treturn ((MP_LOG_BEGIN_MASK & Index)>>61) & 0x7;\n}\n\ninline uint64_t MicroProfileLogTimerIndex(MicroProfileLogEntry Index)\n{\n\treturn (MP_LOG_INDEX_MASK & Index)>>48;\n}\n\ninline MicroProfileLogEntry MicroProfileMakeLogIndex(uint64_t nBegin, MicroProfileToken nToken, int64_t nTick)\n{\n\treturn (nBegin<<61) | (MP_LOG_INDEX_MASK&(nToken<<48)) | (MP_LOG_TICK_MASK&nTick);\n} \n\ninline int64_t MicroProfileLogTickDifference(MicroProfileLogEntry Start, MicroProfileLogEntry End)\n{\n\tuint64_t nStart = Start;\n\tuint64_t nEnd = End;\n\tint64_t nDifference = ((nEnd<<16) - (nStart<<16)); \n\treturn nDifference >> 16;\n}\n\ninline int64_t MicroProfileLogGetTick(MicroProfileLogEntry e)\n{\n\treturn MP_LOG_TICK_MASK & e;\n}\n\ninline int64_t MicroProfileLogSetTick(MicroProfileLogEntry e, int64_t nTick)\n{\n\treturn (MP_LOG_TICK_MASK & nTick) | (e & ~MP_LOG_TICK_MASK);\n}\n\ntemplate<typename T>\nT MicroProfileMin(T a, T b)\n{ return a < b ? a : b; }\n\ntemplate<typename T>\nT MicroProfileMax(T a, T b)\n{ return a > b ? a : b; }\ntemplate<typename T>\nT MicroProfileClamp(T a, T min_, T max_)\n{ return MicroProfileMin(max_, MicroProfileMax(min_, a));  }\n\ninline int64_t MicroProfileMsToTick(float fMs, int64_t nTicksPerSecond)\n{\n\treturn (int64_t)(fMs*0.001f*nTicksPerSecond);\n}\n\ninline float MicroProfileTickToMsMultiplier(int64_t nTicksPerSecond)\n{\n\treturn 1000.f / nTicksPerSecond;\n}\n\ninline uint16_t MicroProfileGetGroupIndex(MicroProfileToken t)\n{\n\treturn (uint16_t)MicroProfileGet()->TimerToGroup[MicroProfileGetTimerIndex(t)];\n}\n\n\n\n#ifdef MICROPROFILE_IMPL\n\n#ifdef _WIN32\n#define WIN32_LEAN_AND_MEAN\n#include <windows.h>\n#define snprintf _snprintf\n\n#pragma warning(push)\n#pragma warning(disable: 4244)\nint64_t MicroProfileTicksPerSecondCpu()\n{\n\tstatic int64_t nTicksPerSecond = 0;\t\n\tif(nTicksPerSecond == 0) \n\t{\n\t\tQueryPerformanceFrequency((LARGE_INTEGER*)&nTicksPerSecond);\n\t}\n\treturn nTicksPerSecond;\n}\nint64_t MicroProfileGetTick()\n{\n\tint64_t ticks;\n\tQueryPerformanceCounter((LARGE_INTEGER*)&ticks);\n\treturn ticks;\n}\n\n#endif\n\n#if MICROPROFILE_WEBSERVER || MICROPROFILE_CONTEXT_SWITCH_TRACE\ntypedef void* (*MicroProfileThreadFunc)(void*);\n\ninline void MicroProfileThreadStart(MicroProfileThread* pThread, MicroProfileThreadFunc Func)\n{\n\t*pThread = new std::thread(Func, nullptr);\n}\ninline void MicroProfileThreadJoin(MicroProfileThread* pThread)\n{\n\t(*pThread)->join();\n\tdelete *pThread;\n\t*pThread = nullptr;\n}\n#endif\n\n#if MICROPROFILE_WEBSERVER\n\n#ifdef _WIN32\n#if defined(_WINSOCKAPI_) && !defined(_WINSOCK2API_)\n#error WinSock.h has already been included; microprofile requires WinSock2\n#endif\n#include <WinSock2.h>\n#pragma comment(lib, \"ws2_32.lib\")\n#define MP_INVALID_SOCKET(f) (f == INVALID_SOCKET)\n#endif\n\n#if defined(__APPLE__) || defined(__linux__)\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <arpa/inet.h>\n#include <ifaddrs.h>\n#include <fcntl.h>\n#define MP_INVALID_SOCKET(f) (f < 0)\n#endif\n\n#endif \n\n#include <stdlib.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <math.h>\n#include <algorithm>\n\n\n#ifndef MICROPROFILE_DEBUG\n#define MICROPROFILE_DEBUG 0\n#endif\n\n\n#define S g_MicroProfile\n\nMicroProfile g_MicroProfile;\nMicroProfileThreadLog*\t\t\tg_MicroProfileGpuLog = 0;\n\n#ifndef MP_THREAD_LOCAL\nstatic pthread_key_t g_MicroProfileThreadLogKey;\nstatic pthread_once_t g_MicroProfileThreadLogKeyOnce = PTHREAD_ONCE_INIT;\nstatic void MicroProfileCreateThreadLogKey()\n{\n\tpthread_key_create(&g_MicroProfileThreadLogKey, NULL);\n}\n#else\nMP_THREAD_LOCAL MicroProfileThreadLog* g_MicroProfileThreadLog = 0;\n#endif\n\nstatic bool g_bUseLock = false; /// This is used because windows does not support using mutexes under dll init(which is where global initialization is handled)\n\n\nMICROPROFILE_DEFINE(g_MicroProfileFlip, \"MicroProfile\", \"MicroProfileFlip\", 0x3355ee);\nMICROPROFILE_DEFINE(g_MicroProfileThreadLoop, \"MicroProfile\", \"ThreadLoop\", 0x3355ee);\nMICROPROFILE_DEFINE(g_MicroProfileClear, \"MicroProfile\", \"Clear\", 0x3355ee);\nMICROPROFILE_DEFINE(g_MicroProfileAccumulate, \"MicroProfile\", \"Accumulate\", 0x3355ee);\nMICROPROFILE_DEFINE(g_MicroProfileContextSwitchSearch,\"MicroProfile\", \"ContextSwitchSearch\", 0xDD7300);\nMICROPROFILE_DEFINE(g_MicroProfileWebServerUpdate,\"MicroProfile\", \"WebServerUpdate\", 0xDD7300);\n\ninline std::recursive_mutex& MicroProfileMutex()\n{\n\tstatic std::recursive_mutex Mutex;\n\treturn Mutex;\n}\nstd::recursive_mutex& MicroProfileGetMutex()\n{\n\treturn MicroProfileMutex();\n}\n\nMICROPROFILE_API MicroProfile* MicroProfileGet()\n{\n\treturn &g_MicroProfile;\n}\n\n\nMicroProfileThreadLog* MicroProfileCreateThreadLog(const char* pName);\n\n\nvoid MicroProfileInit()\n{\n\tstd::recursive_mutex& mutex = MicroProfileMutex();\n\tbool bUseLock = g_bUseLock;\n\tif(bUseLock)\n\t\tmutex.lock();\n\tstatic bool bOnce = true;\n\tif(bOnce)\n\t{\n\t\tbOnce = false;\n\t\tmemset(&S, 0, sizeof(S));\n\t\tS.nMemUsage = sizeof(S);\n\t\tfor(int i = 0; i < MICROPROFILE_MAX_GROUPS; ++i)\n\t\t{\n\t\t\tS.GroupInfo[i].pName[0] = '\\0';\n\t\t}\n\t\tfor(int i = 0; i < MICROPROFILE_MAX_CATEGORIES; ++i)\n\t\t{\n\t\t\tS.CategoryInfo[i].pName[0] = '\\0';\n\t\t\tS.CategoryInfo[i].nGroupMask = 0;\n\t\t}\n\t\tstrcpy(&S.CategoryInfo[0].pName[0], \"default\");\n\t\tS.nCategoryCount = 1;\n\t\tfor(int i = 0; i < MICROPROFILE_MAX_TIMERS; ++i)\n\t\t{\n\t\t\tS.TimerInfo[i].pName[0] = '\\0';\n\t\t}\n\t\tS.nGroupCount = 0;\n\t\tS.nAggregateFlipTick = MP_TICK();\n\t\tS.nBars = MP_DRAW_AVERAGE | MP_DRAW_MAX | MP_DRAW_CALL_COUNT;\n\t\tS.nActiveGroup = 0;\n\t\tS.nActiveBars = 0;\n\t\tS.nForceGroup = 0;\n\t\tS.nAllGroupsWanted = 0;\n\t\tS.nActiveGroupWanted = 0;\n\t\tS.nAllThreadsWanted = 1;\n\t\tS.nAggregateFlip = 60;\n\t\tS.nTotalTimers = 0;\n\t\tfor(uint32_t i = 0; i < MICROPROFILE_MAX_GRAPHS; ++i)\n\t\t{\n\t\t\tS.Graph[i].nToken = MICROPROFILE_INVALID_TOKEN;\n\t\t}\n\t\tS.nRunning = 1;\n\t\tS.fReferenceTime = 33.33f;\n\t\tS.fRcpReferenceTime = 1.f / S.fReferenceTime;\n\t\tS.nFreeListHead = -1;\n\t\tint64_t nTick = MP_TICK();\n\t\tfor(int i = 0; i < MICROPROFILE_MAX_FRAME_HISTORY; ++i)\n\t\t{\n\t\t\tS.Frames[i].nFrameStartCpu = nTick;\n\t\t\tS.Frames[i].nFrameStartGpu = 0;\n\t\t\tS.Frames[i].nFrameStartGpuTimer = (uint32_t)-1;\n\t\t}\n\n#if MICROPROFILE_COUNTER_HISTORY\n\t\tS.nCounterHistoryPut = 0;\n\t\tfor(uint32_t i = 0; i < MICROPROFILE_MAX_COUNTERS; ++i)\n\t\t{\n\t\t\tS.nCounterMin[i] = 0x7fffffffffffffff;\n\t\t\tS.nCounterMax[i] = 0x8000000000000000;\n\t\t}\n#endif\n\n\t\tS.nGpuFrameTimer = (uint32_t)-1;\n\n\t\tMicroProfileThreadLog* pGpu = MicroProfileCreateThreadLog(\"GPU\");\n\t\tg_MicroProfileGpuLog = pGpu;\n\t\tMP_ASSERT(S.Pool[0] == pGpu);\n\t\tpGpu->nGpu = 1;\n\t\tpGpu->nThreadId = 0;\n\t}\n\tif(bUseLock)\n\t\tmutex.unlock();\n}\n\nvoid MicroProfileShutdown()\n{\n\tstd::lock_guard<std::recursive_mutex> Lock(MicroProfileMutex());\n\tMicroProfileWebServerStop();\n\tMicroProfileContextSwitchTraceStop();\n\tMicroProfileGpuShutdown();\n}\n\n#ifndef MP_THREAD_LOCAL\ninline MicroProfileThreadLog* MicroProfileGetThreadLog()\n{\n\tpthread_once(&g_MicroProfileThreadLogKeyOnce, MicroProfileCreateThreadLogKey);\n\treturn (MicroProfileThreadLog*)pthread_getspecific(g_MicroProfileThreadLogKey);\n}\n\ninline void MicroProfileSetThreadLog(MicroProfileThreadLog* pLog)\n{\n\tpthread_once(&g_MicroProfileThreadLogKeyOnce, MicroProfileCreateThreadLogKey);\n\tpthread_setspecific(g_MicroProfileThreadLogKey, pLog);\n}\n#else\nMicroProfileThreadLog* MicroProfileGetThreadLog()\n{\n\treturn g_MicroProfileThreadLog;\n}\ninline void MicroProfileSetThreadLog(MicroProfileThreadLog* pLog)\n{\n\tg_MicroProfileThreadLog = pLog;\n}\n#endif\n\n\nMicroProfileThreadLog* MicroProfileCreateThreadLog(const char* pName)\n{\n\tMicroProfileThreadLog* pLog = 0;\n\tuint32_t nLogIndex = 0;\n\tif(S.nFreeListHead != -1)\n\t{\n\t\tnLogIndex = S.nFreeListHead;\n\t\tpLog = S.Pool[nLogIndex];\n\t\tMP_ASSERT(pLog->nPut.load() == 0);\n\t\tMP_ASSERT(pLog->nGet.load() == 0);\n\t\tS.nFreeListHead = S.Pool[S.nFreeListHead]->nFreeListNext;\n\t}\n\telse if(S.nNumLogs == MICROPROFILE_MAX_THREADS)\n\t{\n\t\treturn nullptr;\n\t}\n\telse\n\t{\n\t\tnLogIndex = S.nNumLogs;\n\t\tpLog = new MicroProfileThreadLog;\n\t\tS.nMemUsage += sizeof(MicroProfileThreadLog);\n\t\tS.Pool[S.nNumLogs++] = pLog;\t\n\t}\n\tmemset(pLog, 0, sizeof(*pLog));\n\tpLog->nLogIndex = nLogIndex;\n\tint len = (int)strlen(pName);\n\tint maxlen = sizeof(pLog->ThreadName)-1;\n\tlen = len < maxlen ? len : maxlen;\n\tmemcpy(&pLog->ThreadName[0], pName, len);\n\tpLog->ThreadName[len] = '\\0';\n\tpLog->nThreadId = MP_GETCURRENTTHREADID();\n\tpLog->nFreeListNext = -1;\n\tpLog->nActive = 1;\n\treturn pLog;\n}\n\nvoid MicroProfileOnThreadCreate(const char* pThreadName)\n{\n\tg_bUseLock = true;\n\tMicroProfileInit();\n\tstd::lock_guard<std::recursive_mutex> Lock(MicroProfileMutex());\n\tif(MicroProfileGetThreadLog() == 0)\n\t{\n\t\tMicroProfileThreadLog* pLog = MicroProfileCreateThreadLog(pThreadName ? pThreadName : MicroProfileGetThreadName());\n\t\tMP_ASSERT(pLog);\n\t\tMicroProfileSetThreadLog(pLog);\n\t}\n}\n\nvoid MicroProfileOnThreadExit()\n{\n\tstd::lock_guard<std::recursive_mutex> Lock(MicroProfileMutex());\n\tMicroProfileThreadLog* pLog = MicroProfileGetThreadLog();\n\tif(pLog)\n\t{\n\t\tint32_t nLogIndex = -1;\n\t\tfor(int i = 0; i < MICROPROFILE_MAX_THREADS; ++i)\n\t\t{\n\t\t\tif(pLog == S.Pool[i])\n\t\t\t{\n\t\t\t\tnLogIndex = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tMP_ASSERT(nLogIndex < MICROPROFILE_MAX_THREADS && nLogIndex > 0);\n\t\tpLog->nFreeListNext = S.nFreeListHead;\n\t\tpLog->nActive = 0;\n\t\tpLog->nPut.store(0);\n\t\tpLog->nGet.store(0);\n\t\tpLog->nPutGpu.store(0);\n\t\tS.nFreeListHead = nLogIndex;\n\t\tfor(int i = 0; i < MICROPROFILE_MAX_FRAME_HISTORY; ++i)\n\t\t{\n\t\t\tS.Frames[i].nLogStart[nLogIndex] = 0;\n\t\t}\n\t\tmemset(pLog->nGroupStackPos, 0, sizeof(pLog->nGroupStackPos));\n\t\tmemset(pLog->nGroupTicks, 0, sizeof(pLog->nGroupTicks));\n\n\t\tif(pLog->Log)\n\t\t{\n\t\t\tdelete[] pLog->Log;\n\t\t\tpLog->Log = 0;\n\t\t\tS.nMemUsage -= sizeof(MicroProfileLogEntry) * MICROPROFILE_BUFFER_SIZE;\n\t\t}\n\n\t\tif(pLog->LogGpu)\n\t\t{\n\t\t\tdelete[] pLog->LogGpu;\n\t\t\tpLog->LogGpu = 0;\n\t\t\tS.nMemUsage -= sizeof(MicroProfileLogEntry) * MICROPROFILE_GPU_BUFFER_SIZE;\n\t\t}\n\n\t\tMicroProfileSetThreadLog(0);\n\t}\n}\n\nMicroProfileThreadLog* MicroProfileGetOrCreateThreadLog()\n{\n\tMicroProfileThreadLog* pLog = MicroProfileGetThreadLog();\n\n\tif (!pLog)\n\t{\n\t\tMicroProfileOnThreadCreate(nullptr);\n\t\tpLog = MicroProfileGetThreadLog();\n\t}\n\n\treturn pLog;\n}\n\nstruct MicroProfileScopeLock\n{\n\tbool bUseLock;\n\tstd::recursive_mutex& m;\n\tMicroProfileScopeLock(std::recursive_mutex& m) : bUseLock(g_bUseLock), m(m)\n\t{\n\t\tif(bUseLock)\n\t\t\tm.lock();\n\t}\n\t~MicroProfileScopeLock()\n\t{\n\t\tif(bUseLock)\n\t\t\tm.unlock();\n\t}\n};\n\nMicroProfileToken MicroProfileFindToken(const char* pGroup, const char* pName)\n{\n\tMicroProfileInit();\n\tMicroProfileScopeLock L(MicroProfileMutex());\n\tfor(uint32_t i = 0; i < S.nTotalTimers; ++i)\n\t{\n\t\tif(!MP_STRCASECMP(pName, S.TimerInfo[i].pName) && !MP_STRCASECMP(pGroup, S.GroupInfo[S.TimerToGroup[i]].pName))\n\t\t{\n\t\t\treturn S.TimerInfo[i].nToken;\n\t\t}\n\t}\n\treturn MICROPROFILE_INVALID_TOKEN;\n}\n\nuint16_t MicroProfileGetGroup(const char* pGroup, MicroProfileTokenType Type)\n{\n\tfor(uint32_t i = 0; i < S.nGroupCount; ++i)\n\t{\n\t\tif(!MP_STRCASECMP(pGroup, S.GroupInfo[i].pName))\n\t\t{\n\t\t\treturn i;\n\t\t}\n\t}\n\n\tuint16_t nGroupIndex = S.nGroupCount++;\n\tMP_ASSERT(nGroupIndex < MICROPROFILE_MAX_GROUPS);\n\n\tsize_t nLen = strlen(pGroup);\n\tif(nLen > MICROPROFILE_NAME_MAX_LEN-1)\n\t\tnLen = MICROPROFILE_NAME_MAX_LEN-1;\n\tmemcpy(&S.GroupInfo[nGroupIndex].pName[0], pGroup, nLen);\n\tS.GroupInfo[nGroupIndex].pName[nLen] = '\\0';\n\tS.GroupInfo[nGroupIndex].nNameLen = (uint32_t)nLen;\n\n\tS.GroupInfo[nGroupIndex].nNumTimers = 0;\n\tS.GroupInfo[nGroupIndex].nGroupIndex = nGroupIndex;\n\tS.GroupInfo[nGroupIndex].Type = Type;\n\tS.GroupInfo[nGroupIndex].nMaxTimerNameLen = 0;\n\tS.GroupInfo[nGroupIndex].nColor = 0x88888888;\n\tS.GroupInfo[nGroupIndex].nCategory = 0;\n\n\tS.CategoryInfo[0].nGroupMask |= 1ll << nGroupIndex;\n\tS.nGroupMask |= 1ll << nGroupIndex;\n\tS.nGroupMaskGpu |= uint64_t(Type == MicroProfileTokenTypeGpu) << nGroupIndex;\n\n\tif ((S.nRunning || S.nForceEnable) && S.nAllGroupsWanted)\n\t\tS.nActiveGroup |= 1ll << nGroupIndex;\n\n\treturn nGroupIndex;\n}\n\nMicroProfileToken MicroProfileGetToken(const char* pGroup, const char* pName, uint32_t nColor, MicroProfileTokenType Type)\n{\n\tMicroProfileInit();\n\tMicroProfileScopeLock L(MicroProfileMutex());\n\tMicroProfileToken ret = MicroProfileFindToken(pGroup, pName);\n\tif(ret != MICROPROFILE_INVALID_TOKEN)\n\t\treturn ret;\n\tif(S.nTotalTimers == MICROPROFILE_MAX_TIMERS)\n\t\treturn MICROPROFILE_INVALID_TOKEN;\n\tuint16_t nGroupIndex = MicroProfileGetGroup(pGroup, Type);\n\tuint16_t nTimerIndex = (uint16_t)(S.nTotalTimers++);\n\tuint64_t nGroupMask = 1ll << nGroupIndex;\n\tMicroProfileToken nToken = MicroProfileMakeToken(nGroupMask, nTimerIndex);\n\tS.GroupInfo[nGroupIndex].nNumTimers++;\n\tS.GroupInfo[nGroupIndex].nMaxTimerNameLen = MicroProfileMax(S.GroupInfo[nGroupIndex].nMaxTimerNameLen, (uint32_t)strlen(pName));\n\tMP_ASSERT(S.GroupInfo[nGroupIndex].Type == Type); //dont mix cpu & gpu timers in the same group\n\tS.nMaxGroupSize = MicroProfileMax(S.nMaxGroupSize, S.GroupInfo[nGroupIndex].nNumTimers);\n\tS.TimerInfo[nTimerIndex].nToken = nToken;\n\tuint32_t nLen = (uint32_t)strlen(pName);\n\tif(nLen > MICROPROFILE_NAME_MAX_LEN-1)\n\t\tnLen = MICROPROFILE_NAME_MAX_LEN-1;\n\tmemcpy(&S.TimerInfo[nTimerIndex].pName, pName, nLen);\n\n\tif(nColor == 0xffffffff)\n\t{\n\t\t// http://www.two4u.com/color/small-txt.html with some omissions\n\t\tstatic const int kDebugColors[] =\n\t\t{\n\t\t\t0x70DB93, 0xB5A642, 0x5F9F9F, 0xB87333, 0x4F6F4F, 0x9932CD,\n\t\t\t0x871F78, 0x855E42, 0x545454, 0x8E2323, 0x238E23, 0xCD7F32,\n\t\t\t0xDBDB70, 0x527F76, 0x9F9F5F, 0x8E236B, 0xFF2F4F, 0xCFB53B,\n\t\t\t0xFF7F00, 0xDB70DB, 0x5959AB, 0x8C1717, 0x238E68, 0x6B4226,\n\t\t\t0x8E6B23, 0x007FFF, 0x00FF7F, 0x236B8E, 0x38B0DE, 0xDB9370,\n\t\t\t0xCC3299, 0x99CC32,\n\t\t};\n\n\t\t// djb2\n\t\tunsigned int result = 5381;\n\t\tfor (const char* i = pGroup; *i; ++i)\n\t\t\tresult = result * 33 ^ *i;\n\t\tfor (const char* i = pName; *i; ++i)\n\t\t\tresult = result * 33 ^ *i;\n\n\t\tnColor = kDebugColors[result % (sizeof(kDebugColors) / sizeof(kDebugColors[0]))];\n\t}\n\n\tS.TimerInfo[nTimerIndex].pName[nLen] = '\\0';\n\tS.TimerInfo[nTimerIndex].nNameLen = nLen;\n\tS.TimerInfo[nTimerIndex].nColor = nColor&0xffffff;\n\tS.TimerInfo[nTimerIndex].nGroupIndex = nGroupIndex;\n\tS.TimerInfo[nTimerIndex].nTimerIndex = nTimerIndex;\n\tS.TimerToGroup[nTimerIndex] = nGroupIndex;\n\treturn nToken;\n}\n\nMicroProfileToken MicroProfileGetLabelToken(const char* pGroup, MicroProfileTokenType Type)\n{\n\tMicroProfileInit();\n\tMicroProfileScopeLock L(MicroProfileMutex());\n\n\tuint16_t nGroupIndex = MicroProfileGetGroup(pGroup, Type);\n\tuint64_t nGroupMask = 1ll << nGroupIndex;\n\tMicroProfileToken nToken = MicroProfileMakeToken(nGroupMask, 0);\n\n\treturn nToken;\n}\n\nMicroProfileToken MicroProfileGetMetaToken(const char* pName)\n{\n\tMicroProfileInit();\n\tMicroProfileScopeLock L(MicroProfileMutex());\n\tfor(uint32_t i = 0; i < MICROPROFILE_META_MAX; ++i)\n\t{\n\t\tif(!S.MetaCounters[i].pName)\n\t\t{\n\t\t\tS.MetaCounters[i].pName = pName;\n\t\t\treturn i;\n\t\t}\n\t\telse if(!MP_STRCASECMP(pName, S.MetaCounters[i].pName))\n\t\t{\n\t\t\treturn i;\n\t\t}\n\t}\n\tMP_ASSERT(0);//out of slots, increase MICROPROFILE_META_MAX\n\treturn (MicroProfileToken)-1;\n}\n\nconst char* MicroProfileNextName(const char* pName, char* pNameOut, uint32_t* nSubNameLen)\n{\n\tuint32_t nMaxLen = MICROPROFILE_NAME_MAX_LEN-1;\n\tconst char* pRet = 0;\n\tbool bDone = false;\n\tuint32_t nChars = 0;\n\tfor(uint32_t i = 0; i < nMaxLen && !bDone; ++i)\n\t{\n\t\tchar c = *pName++;\n\t\tswitch(c)\n\t\t{\n\t\t\tcase 0:\n\t\t\t\tbDone = true;\n\t\t\t\tbreak;\n\t\t\tcase '\\\\':\n\t\t\tcase '/':\n\t\t\t\tif(nChars)\n\t\t\t\t{\n\t\t\t\t\tbDone = true;\n\t\t\t\t\tpRet = pName;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tnChars++;\n\t\t\t\t*pNameOut++ = c;\n\t\t}\n\t}\n\t*nSubNameLen = nChars;\n\t*pNameOut = '\\0';\n\treturn pRet;\n}\n\n\nconst char* MicroProfileCounterFullName(int nCounter)\n{\n\tstatic char Buffer[1024];\n\tint nNodes[32];\n\tint nIndex = 0;\n\tdo\n\t{\n\t\tnNodes[nIndex++] = nCounter;\n\t\tnCounter = S.CounterInfo[nCounter].nParent;\n\t}while(nCounter >= 0);\n\tint nOffset = 0;\n\twhile(nIndex >= 0 && nOffset < (int)sizeof(Buffer)-2)\n\t{\n\t\tuint32_t nLen = S.CounterInfo[nNodes[nIndex]].nNameLen + nOffset;// < sizeof(Buffer)-1 \n\t\tnLen = MicroProfileMin((uint32_t)(sizeof(Buffer) - 2 - nOffset), nLen);\n\t\tmemcpy(&Buffer[nOffset], S.CounterInfo[nNodes[nIndex]].pName, nLen);\n\n\t\tnOffset += S.CounterInfo[nNodes[nIndex]].nNameLen+1;\n\t\tif(nIndex)\n\t\t{\n\t\t\tBuffer[nOffset++] = '/';\n\t\t}\n\t\tnIndex--;\n\t}\n\treturn &Buffer[0];\n}\n\nint MicroProfileGetCounterTokenByParent(int nParent, const char* pName)\n{\n\tfor(uint32_t i = 0; i < S.nNumCounters; ++i)\n\t{\n\t\tif(nParent == S.CounterInfo[i].nParent && !MP_STRCASECMP(S.CounterInfo[i].pName, pName))\n\t\t{\n\t\t\treturn i;\n\t\t}\n\t}\n\tMicroProfileToken nResult = S.nNumCounters++;\n\tS.CounterInfo[nResult].nParent = nParent;\n\tS.CounterInfo[nResult].nSibling = -1;\n\tS.CounterInfo[nResult].nFirstChild = -1;\n\tS.CounterInfo[nResult].nFlags = 0;\n\tS.CounterInfo[nResult].eFormat = MICROPROFILE_COUNTER_FORMAT_DEFAULT;\n\tS.CounterInfo[nResult].nLimit = 0;\n\tint nLen = (int)strlen(pName)+1;\n\n\tMP_ASSERT(nLen + S.nCounterNamePos <= MICROPROFILE_MAX_COUNTER_NAME_CHARS);\n\tuint32_t nPos = S.nCounterNamePos;\n\tS.nCounterNamePos += nLen;\n\tmemcpy(&S.CounterNames[nPos], pName, nLen);\n\tS.CounterInfo[nResult].nNameLen = nLen-1;\n\tS.CounterInfo[nResult].pName = &S.CounterNames[nPos];\n\tif(nParent >= 0)\n\t{\n\t\tS.CounterInfo[nResult].nSibling = S.CounterInfo[nParent].nFirstChild;\n\t\tS.CounterInfo[nResult].nLevel = S.CounterInfo[nParent].nLevel + 1;\n\t\tS.CounterInfo[nParent].nFirstChild = nResult;\n\t}\n\telse\n\t{\n\t\tS.CounterInfo[nResult].nLevel = 0;\n\t}\n\n\treturn nResult;\n}\n\nMicroProfileToken MicroProfileGetCounterToken(const char* pName)\n{\n\tMicroProfileInit();\n\tMicroProfileScopeLock L(MicroProfileMutex());\n\tchar SubName[MICROPROFILE_NAME_MAX_LEN];\n\tint nResult = -1;\n\tdo\n\t{\n\t\tuint32_t nLen = 0;\n\t\tpName = MicroProfileNextName(pName, &SubName[0], &nLen);\n\t\tif(0 == nLen)\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t\tnResult = MicroProfileGetCounterTokenByParent(nResult, SubName);\n\n\t}while(pName != 0);\n\tS.CounterInfo[nResult].nFlags |= MICROPROFILE_COUNTER_FLAG_LEAF;\n\n\tMP_ASSERT(nResult >= 0);\n\treturn nResult;\n}\n\ninline void MicroProfileLogPut(MicroProfileToken nToken_, uint64_t nTick, uint64_t nBegin, MicroProfileThreadLog* pLog)\n{\n\tMP_ASSERT(pLog != 0); //this assert is hit if MicroProfileOnCreateThread is not called\n\tMP_ASSERT(pLog->nActive);\n\tuint32_t nPos = pLog->nPut.load(std::memory_order_relaxed);\n\tuint32_t nNextPos = (nPos+1) % MICROPROFILE_BUFFER_SIZE;\n\tif(nNextPos == pLog->nGet.load(std::memory_order_relaxed))\n\t{\n\t\tS.nOverflow = 100;\n\t}\n\telse\n\t{\n\t\tif(!pLog->Log)\n\t\t{\n\t\t\tpLog->Log = new MicroProfileLogEntry[MICROPROFILE_BUFFER_SIZE];\n\t\t\tmemset(pLog->Log, 0, sizeof(MicroProfileLogEntry) * MICROPROFILE_BUFFER_SIZE);\n\t\t\tS.nMemUsage += sizeof(MicroProfileLogEntry) * MICROPROFILE_BUFFER_SIZE;\n\t\t}\n\t\tpLog->Log[nPos] = MicroProfileMakeLogIndex(nBegin, nToken_, nTick);\n\t\tpLog->nPut.store(nNextPos, std::memory_order_release);\n\t}\n}\n\ninline void MicroProfileLogPutGpu(MicroProfileToken nToken_, uint64_t nTick, uint64_t nBegin, MicroProfileThreadLog* pLog)\n{\n#if MICROPROFILE_GPU_TIMERS_MULTITHREADED\n\tMP_ASSERT(pLog != 0); //this assert is hit if MicroProfileOnCreateThread is not called\n\tMP_ASSERT(pLog->nActive);\n\tuint32_t nPos = pLog->nPutGpu.load(std::memory_order_relaxed);\n\tif(nPos >= MICROPROFILE_GPU_BUFFER_SIZE)\n\t{\n\t\tS.nOverflow = 100;\n\t}\n\telse\n\t{\n\t\tif(!pLog->LogGpu)\n\t\t{\n\t\t\tpLog->LogGpu = new MicroProfileLogEntry[MICROPROFILE_GPU_BUFFER_SIZE];\n\t\t\tmemset(pLog->LogGpu, 0, sizeof(MicroProfileLogEntry) * MICROPROFILE_GPU_BUFFER_SIZE);\n\t\t\tS.nMemUsage += sizeof(MicroProfileLogEntry) * MICROPROFILE_GPU_BUFFER_SIZE;\n\t\t}\n\t\tpLog->LogGpu[nPos] = MicroProfileMakeLogIndex(nBegin, nToken_, nTick);\n\t\tpLog->nPutGpu.store(nPos + 1, std::memory_order_release);\n\t}\n#else\n\t(void)pLog;\n\n\tMicroProfileLogPut(nToken_, nTick, nBegin, g_MicroProfileGpuLog);\n#endif\n}\n\nuint64_t MicroProfileEnter(MicroProfileToken nToken_)\n{\n\tuint64_t nGroupMask = MicroProfileGetGroupMask(nToken_);\n\tif(nGroupMask & S.nActiveGroup)\n\t{\n\t\tif (MicroProfileThreadLog* pLog = MicroProfileGetOrCreateThreadLog())\n\t\t{\n\t\t\tif (nGroupMask & S.nGroupMaskGpu)\n\t\t\t{\n\t\t\t\tuint32_t nTimer = MicroProfileGpuInsertTimer(pLog->pContextGpu);\n\t\t\t\tif (nTimer != (uint32_t)-1)\n\t\t\t\t{\n\t\t\t\t\tMicroProfileLogPutGpu(nToken_, nTimer, MP_LOG_ENTER, pLog);\n\t\t\t\t\tMicroProfileLogPutGpu(pLog->nLogIndex, MP_TICK(), MP_LOG_GPU_EXTRA, pLog);\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tuint64_t nTick = MP_TICK();\n\t\t\t\tMicroProfileLogPut(nToken_, nTick, MP_LOG_ENTER, pLog);\n\t\t\t\treturn nTick;\n\t\t\t}\n\t\t}\n\t}\n\treturn MICROPROFILE_INVALID_TICK;\n}\n\nuint64_t MicroProfileAllocateLabel(const char* pName)\n{\n\tchar* pLabelBuffer = S.LabelBuffer.load(std::memory_order_consume);\n\tif(!pLabelBuffer)\n\t{\n\t\tMicroProfileScopeLock L(MicroProfileMutex());\n\n\t\tpLabelBuffer = S.LabelBuffer.load(std::memory_order_consume);\n\t\tif(!pLabelBuffer)\n\t\t{\n\t\t\tpLabelBuffer = new char[MICROPROFILE_LABEL_BUFFER_SIZE + MICROPROFILE_LABEL_MAX_LEN];\n\t\t\tmemset(pLabelBuffer, 0, MICROPROFILE_LABEL_BUFFER_SIZE + MICROPROFILE_LABEL_MAX_LEN);\n\t\t\tS.nMemUsage += MICROPROFILE_LABEL_BUFFER_SIZE + MICROPROFILE_LABEL_MAX_LEN;\n\n\t\t\tS.LabelBuffer.store(pLabelBuffer, std::memory_order_release);\n\t\t}\n\t}\n\n\tsize_t nLen = strlen(pName);\n\n\tif(nLen > MICROPROFILE_LABEL_MAX_LEN - 1)\n\t\tnLen = MICROPROFILE_LABEL_MAX_LEN - 1;\n\n\tuint64_t nLabel = S.nLabelPut.fetch_add(nLen + 1, std::memory_order_relaxed);\n\tchar* pLabel = &pLabelBuffer[nLabel % MICROPROFILE_LABEL_BUFFER_SIZE];\n\n\tmemcpy(pLabel, pName, nLen);\n\tpLabel[nLen] = 0;\n\n\treturn nLabel;\n}\n\nvoid MicroProfilePutLabel(MicroProfileToken nToken_, const char* pName)\n{\n\tif (MicroProfileThreadLog* pLog = MicroProfileGetThreadLog())\n\t{\n\t\tuint64_t nLabel = MicroProfileAllocateLabel(pName);\n\t\tuint64_t nGroupMask = MicroProfileGetGroupMask(nToken_);\n\n\t\tif (nGroupMask & S.nGroupMaskGpu)\n\t\t\tMicroProfileLogPutGpu(nToken_, nLabel, MP_LOG_LABEL, pLog);\n\t\telse\n\t\t\tMicroProfileLogPut(nToken_, nLabel, MP_LOG_LABEL, pLog);\n\t}\n}\n\nvoid MicroProfileCounterAdd(MicroProfileToken nToken, int64_t nCount)\n{\n\tMP_ASSERT(nToken < S.nNumCounters);\n\tS.Counters[nToken].fetch_add(nCount);\n}\nvoid MicroProfileCounterSet(MicroProfileToken nToken, int64_t nCount)\n{\n\tMP_ASSERT(nToken < S.nNumCounters);\n\tS.Counters[nToken].store(nCount);\n}\nvoid MicroProfileCounterSetLimit(MicroProfileToken nToken, int64_t nCount)\n{\n\tMP_ASSERT(nToken < S.nNumCounters);\n\tS.CounterInfo[nToken].nLimit = nCount;\n}\n\nvoid MicroProfileCounterConfig(const char* pName, uint32_t eFormat, int64_t nLimit, uint32_t nFlags)\n{\n\tMicroProfileToken nToken = MicroProfileGetCounterToken(pName);\n\tS.CounterInfo[nToken].eFormat = (MicroProfileCounterFormat)eFormat;\n\tS.CounterInfo[nToken].nLimit = nLimit;\n\tS.CounterInfo[nToken].nFlags |= (nFlags & ~MICROPROFILE_COUNTER_FLAG_INTERNAL_MASK);\n}\n\nconst char* MicroProfileGetLabel(uint64_t nLabel)\n{\n\tchar* pLabelBuffer = S.LabelBuffer.load(std::memory_order_relaxed);\n\tuint64_t nLabelPut = S.nLabelPut.load(std::memory_order_relaxed);\n\n\tMP_ASSERT(pLabelBuffer && nLabel < nLabelPut);\n\n\tif (nLabelPut - nLabel > MICROPROFILE_LABEL_BUFFER_SIZE)\n\t\treturn 0;\n\telse\n\t\treturn &pLabelBuffer[nLabel % MICROPROFILE_LABEL_BUFFER_SIZE];\n}\n\nvoid MicroProfileLabel(MicroProfileToken nToken_, const char* pName)\n{\n\tif(MicroProfileGetGroupMask(nToken_) & S.nActiveGroup)\n\t{\n\t\tMicroProfilePutLabel(nToken_, pName);\n\t}\n}\n\nvoid MicroProfileLabelFormat(MicroProfileToken nToken_, const char* pName, ...)\n{\n\tva_list args;\n\tva_start(args, pName);\n\tMicroProfileLabelFormatV(nToken_, pName, args);\n\tva_end(args);\n}\n\nvoid MicroProfileLabelFormatV(MicroProfileToken nToken_, const char* pName, va_list args)\n{\n\tif(MicroProfileGetGroupMask(nToken_) & S.nActiveGroup)\n\t{\n\t\tchar buffer[MICROPROFILE_LABEL_MAX_LEN];\n\t\tvsnprintf(buffer, sizeof(buffer)-1, pName, args);\n\n\t\tbuffer[sizeof(buffer)-1] = 0;\n\n\t\tMicroProfilePutLabel(nToken_, buffer);\n\t}\n}\n\nvoid MicroProfileMetaUpdate(MicroProfileToken nToken, int nCount, MicroProfileTokenType eTokenType)\n{\n\tif((MP_DRAW_META_FIRST<<nToken) & S.nActiveBars)\n\t{\n\t\tif (MicroProfileThreadLog* pLog = MicroProfileGetThreadLog())\n\t\t{\n\t\t\tMP_ASSERT(nToken < MICROPROFILE_META_MAX);\n\n\t\t\tif (MicroProfileTokenTypeGpu == eTokenType)\n\t\t\t\tMicroProfileLogPutGpu(nToken, nCount, MP_LOG_META, pLog);\n\t\t\telse\n\t\t\t\tMicroProfileLogPut(nToken, nCount, MP_LOG_META, pLog);\n\t\t}\n\t}\n}\n\nvoid MicroProfileLeave(MicroProfileToken nToken_, uint64_t nTickStart)\n{\n\tif(MICROPROFILE_INVALID_TICK != nTickStart)\n\t{\n\t\tif (MicroProfileThreadLog* pLog = MicroProfileGetOrCreateThreadLog())\n\t\t{\n\t\t\tuint64_t nGroupMask = MicroProfileGetGroupMask(nToken_);\n\n\t\t\tif (nGroupMask & S.nGroupMaskGpu)\n\t\t\t{\n\t\t\t\tuint32_t nTimer = MicroProfileGpuInsertTimer(pLog->pContextGpu);\n\t\t\t\tMicroProfileLogPutGpu(nToken_, nTimer, MP_LOG_LEAVE, pLog);\n\t\t\t\tMicroProfileLogPutGpu(pLog->nLogIndex, MP_TICK(), MP_LOG_GPU_EXTRA, pLog);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tuint64_t nTick = MP_TICK();\n\t\t\t\tMicroProfileLogPut(nToken_, nTick, MP_LOG_LEAVE, pLog);\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid MicroProfileContextSwitchPut(MicroProfileContextSwitch* pContextSwitch)\n{\n\tif(S.nRunning || pContextSwitch->nTicks <= S.nPauseTicks)\n\t{\n\t\tuint32_t nPut = S.nContextSwitchPut;\n\t\tS.ContextSwitch[nPut] = *pContextSwitch;\n\t\tS.nContextSwitchPut = (S.nContextSwitchPut+1) % MICROPROFILE_CONTEXT_SWITCH_BUFFER_SIZE;\n\t}\n}\n\n\nvoid MicroProfileGetRange(uint32_t nPut, uint32_t nGet, uint32_t nRange[2][2])\n{\n\tif(nPut > nGet)\n\t{\n\t\tnRange[0][0] = nGet;\n\t\tnRange[0][1] = nPut;\n\t\tnRange[1][0] = nRange[1][1] = 0;\n\t}\n\telse if(nPut != nGet)\n\t{\n\t\tMP_ASSERT(nGet != MICROPROFILE_BUFFER_SIZE);\n\t\tuint32_t nCountEnd = MICROPROFILE_BUFFER_SIZE - nGet;\n\t\tnRange[0][0] = nGet;\n\t\tnRange[0][1] = nGet + nCountEnd;\n\t\tnRange[1][0] = 0;\n\t\tnRange[1][1] = nPut;\n\t}\n}\n\nvoid MicroProfileDumpToFile();\n\nvoid MicroProfileFlipGpu()\n{\n\tstd::lock_guard<std::recursive_mutex> Lock(MicroProfileMutex());\n\n\tfor (uint32_t i = 0; i < MICROPROFILE_MAX_THREADS; ++i)\n\t{\n\t\tif (S.Pool[i])\n\t\t{\n\t\t\tMP_ASSERT(!S.Pool[i]->bActiveGpu);\n\n\t\t\tS.Pool[i]->nPutGpu.store(0);\n\t\t}\n\t}\n\n\tS.nGpuFrameTimer = MicroProfileGpuFlip();\n}\n\nvoid MicroProfileFlipCpu()\n{\n\tstd::lock_guard<std::recursive_mutex> Lock(MicroProfileMutex());\n\n\n\tif(S.nToggleRunning)\n\t{\n\t\tS.nRunning = !S.nRunning;\n\t\tif(!S.nRunning)\n\t\t\tS.nPauseTicks = MP_TICK();\n\t\tS.nToggleRunning = 0;\n\t\tfor(uint32_t i = 0; i < MICROPROFILE_MAX_THREADS; ++i)\n\t\t{\n\t\t\tMicroProfileThreadLog* pLog = S.Pool[i];\n\t\t\tif(pLog)\n\t\t\t{\n\t\t\t\tpLog->nStackPos = 0;\n\t\t\t}\n\t\t}\n\t}\n\tuint32_t nAggregateClear = S.nAggregateClear || S.nAutoClearFrames, nAggregateFlip = 0;\n\tif(S.nDumpFileNextFrame)\n\t{\n\t\tMicroProfileDumpToFile();\n\t\tS.nDumpFileNextFrame = 0;\n\t\tS.nAutoClearFrames = MICROPROFILE_GPU_FRAME_DELAY + 3; //hide spike from dumping webpage\n\t}\n\n\tif(S.nAutoClearFrames)\n\t{\n\t\tnAggregateClear = 1;\n\t\tnAggregateFlip = 1;\n\t\tS.nAutoClearFrames -= 1;\n\t}\n\n\n\tif(S.nRunning || S.nForceEnable)\n\t{\n\t\tS.nFramePutIndex++;\n\t\tS.nFramePut = (S.nFramePut+1) % MICROPROFILE_MAX_FRAME_HISTORY;\n\t\tMP_ASSERT((S.nFramePutIndex % MICROPROFILE_MAX_FRAME_HISTORY) == S.nFramePut);\n\t\tS.nFrameCurrent = (S.nFramePut + MICROPROFILE_MAX_FRAME_HISTORY - MICROPROFILE_GPU_FRAME_DELAY - 1) % MICROPROFILE_MAX_FRAME_HISTORY;\n\t\tS.nFrameCurrentIndex++;\n\t\tuint32_t nFrameNext = (S.nFrameCurrent+1) % MICROPROFILE_MAX_FRAME_HISTORY;\n\n\t\tuint32_t nContextSwitchPut = S.nContextSwitchPut;\n\t\tif(S.nContextSwitchLastPut < nContextSwitchPut)\n\t\t{\n\t\t\tS.nContextSwitchUsage = (nContextSwitchPut - S.nContextSwitchLastPut);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tS.nContextSwitchUsage = MICROPROFILE_CONTEXT_SWITCH_BUFFER_SIZE - S.nContextSwitchLastPut + nContextSwitchPut;\n\t\t}\n\t\tS.nContextSwitchLastPut = nContextSwitchPut;\n\n\t\tMicroProfileFrameState* pFramePut = &S.Frames[S.nFramePut];\n\t\tMicroProfileFrameState* pFrameCurrent = &S.Frames[S.nFrameCurrent];\n\t\tMicroProfileFrameState* pFrameNext = &S.Frames[nFrameNext];\n\t\t\n\t\tpFramePut->nFrameStartCpu = MP_TICK();\n\t\tpFramePut->nFrameStartGpuTimer = S.nGpuFrameTimer;\n\n\t\tif(pFrameCurrent->nFrameStartGpuTimer != (uint32_t)-1)\n\t\t{\n\t\t\tuint64_t nTick = MicroProfileGpuGetTimeStamp(pFrameCurrent->nFrameStartGpuTimer);\n\n\t\t\tpFrameCurrent->nFrameStartGpu = (nTick == MICROPROFILE_INVALID_TICK) ? 0 : nTick;\n\t\t}\n\n\t\tuint64_t nFrameStartCpu = pFrameCurrent->nFrameStartCpu;\n\t\tuint64_t nFrameEndCpu = pFrameNext->nFrameStartCpu;\n\n\t\t{\n\t\t\tuint64_t nTick = nFrameEndCpu - nFrameStartCpu;\n\t\t\tS.nFlipTicks = nTick;\n\t\t\tS.nFlipAggregate += nTick;\n\t\t\tS.nFlipMax = MicroProfileMax(S.nFlipMax, nTick);\n\t\t}\n\n\t\tuint8_t* pTimerToGroup = &S.TimerToGroup[0];\n\t\tfor(uint32_t i = 0; i < MICROPROFILE_MAX_THREADS; ++i)\n\t\t{\n\t\t\tMicroProfileThreadLog* pLog = S.Pool[i];\n\t\t\tif(!pLog)\n\t\t\t{\n\t\t\t\tpFramePut->nLogStart[i] = 0;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tuint32_t nPut = pLog->nPut.load(std::memory_order_acquire);\n\t\t\t\tpFramePut->nLogStart[i] = nPut;\n\t\t\t\tMP_ASSERT(nPut< MICROPROFILE_BUFFER_SIZE);\n\t\t\t\t//need to keep last frame around to close timers. timers more than 1 frame old is ditched.\n\t\t\t\tpLog->nGet.store(nPut, std::memory_order_relaxed);\n\t\t\t}\n\t\t}\n\n\t\tif(S.nRunning)\n\t\t{\n\t\t\tuint64_t* pFrameGroup = &S.FrameGroup[0];\n\t\t\t{\n\t\t\t\tMICROPROFILE_SCOPE(g_MicroProfileClear);\n\t\t\t\tfor(uint32_t i = 0; i < S.nTotalTimers; ++i)\n\t\t\t\t{\n\t\t\t\t\tS.Frame[i].nTicks = 0;\n\t\t\t\t\tS.Frame[i].nCount = 0;\n\t\t\t\t\tS.FrameExclusive[i] = 0;\n\t\t\t\t}\n\t\t\t\tfor(uint32_t i = 0; i < MICROPROFILE_MAX_GROUPS; ++i)\n\t\t\t\t{\n\t\t\t\t\tpFrameGroup[i] = 0;\n\t\t\t\t}\n\t\t\t\tfor(uint32_t j = 0; j < MICROPROFILE_META_MAX; ++j)\n\t\t\t\t{\n\t\t\t\t\tif(S.MetaCounters[j].pName && 0 != (S.nActiveBars & (MP_DRAW_META_FIRST<<j)))\n\t\t\t\t\t{\n\t\t\t\t\t\tauto& Meta = S.MetaCounters[j];\n\t\t\t\t\t\tfor(uint32_t i = 0; i < S.nTotalTimers; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tMeta.nCounters[i] = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}\n\t\t\t{\n\t\t\t\tMICROPROFILE_SCOPE(g_MicroProfileThreadLoop);\n\t\t\t\tfor(uint32_t i = 0; i < MICROPROFILE_MAX_THREADS; ++i)\n\t\t\t\t{\n\t\t\t\t\tMicroProfileThreadLog* pLog = S.Pool[i];\n\t\t\t\t\tif(!pLog) \n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tuint8_t* pGroupStackPos = &pLog->nGroupStackPos[0];\n\t\t\t\t\tint64_t nGroupTicks[MICROPROFILE_MAX_GROUPS] = {0};\n\n\n\t\t\t\t\tuint32_t nPut = pFrameNext->nLogStart[i];\n\t\t\t\t\tuint32_t nGet = pFrameCurrent->nLogStart[i];\n\t\t\t\t\tuint32_t nRange[2][2] = { {0, 0}, {0, 0}, };\n\t\t\t\t\tMicroProfileGetRange(nPut, nGet, nRange);\n\n\n\t\t\t\t\t//fetch gpu results.\n\t\t\t\t\tif(pLog->nGpu)\n\t\t\t\t\t{\n\t\t\t\t\t\tuint64_t nLastTick = pFrameCurrent->nFrameStartGpu;\n\n\t\t\t\t\t\tfor(uint32_t j = 0; j < 2; ++j)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tuint32_t nStart = nRange[j][0];\n\t\t\t\t\t\t\tuint32_t nEnd = nRange[j][1];\n\t\t\t\t\t\t\tfor(uint32_t k = nStart; k < nEnd; ++k)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tMicroProfileLogEntry L = pLog->Log[k];\n\n\t\t\t\t\t\t\t\tint Type = MicroProfileLogType(L);\n\n\t\t\t\t\t\t\t\tif(Type == MP_LOG_ENTER || Type == MP_LOG_LEAVE)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tuint32_t nTimer = MicroProfileLogGetTick(L);\n\t\t\t\t\t\t\t\t\tuint64_t nTick = MicroProfileGpuGetTimeStamp(nTimer);\n\n\t\t\t\t\t\t\t\t\tif(nTick != MICROPROFILE_INVALID_TICK)\n\t\t\t\t\t\t\t\t\t\tnLastTick = nTick;\n\n\t\t\t\t\t\t\t\t\tpLog->Log[k] = MicroProfileLogSetTick(L, nLastTick);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\tuint32_t* pStack = &pLog->nStack[0];\n\t\t\t\t\tint64_t* pChildTickStack = &pLog->nChildTickStack[0];\n\t\t\t\t\tuint32_t nStackPos = pLog->nStackPos;\n\n\t\t\t\t\tfor(uint32_t j = 0; j < 2; ++j)\n\t\t\t\t\t{\n\t\t\t\t\t\tuint32_t nStart = nRange[j][0];\n\t\t\t\t\t\tuint32_t nEnd = nRange[j][1];\n\t\t\t\t\t\tfor(uint32_t k = nStart; k < nEnd; ++k)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tMicroProfileLogEntry LE = pLog->Log[k];\n\t\t\t\t\t\t\tuint64_t nType = MicroProfileLogType(LE);\n\n\t\t\t\t\t\t\tif(MP_LOG_ENTER == nType)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tint nTimer = MicroProfileLogTimerIndex(LE);\n\t\t\t\t\t\t\t\tuint8_t nGroup = pTimerToGroup[nTimer];\n\t\t\t\t\t\t\t\tMP_ASSERT(nStackPos < MICROPROFILE_STACK_MAX);\n\t\t\t\t\t\t\t\tMP_ASSERT(nGroup < MICROPROFILE_MAX_GROUPS);\n\t\t\t\t\t\t\t\tpGroupStackPos[nGroup]++;\n\t\t\t\t\t\t\t\tpStack[nStackPos++] = k;\n\t\t\t\t\t\t\t\tpChildTickStack[nStackPos] = 0;\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if(MP_LOG_META == nType)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif(nStackPos)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tint64_t nMetaIndex = MicroProfileLogTimerIndex(LE);\n\t\t\t\t\t\t\t\t\tint64_t nMetaCount = MicroProfileLogGetTick(LE);\n\t\t\t\t\t\t\t\t\tMP_ASSERT(nMetaIndex < MICROPROFILE_META_MAX);\n\t\t\t\t\t\t\t\t\tint64_t nCounter = MicroProfileLogTimerIndex(pLog->Log[pStack[nStackPos-1]]);\n\t\t\t\t\t\t\t\t\tS.MetaCounters[nMetaIndex].nCounters[nCounter] += nMetaCount;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if(MP_LOG_LEAVE == nType)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tint nTimer = MicroProfileLogTimerIndex(LE);\n\t\t\t\t\t\t\t\tuint8_t nGroup = pTimerToGroup[nTimer];\n\t\t\t\t\t\t\t\tMP_ASSERT(nGroup < MICROPROFILE_MAX_GROUPS);\n\t\t\t\t\t\t\t\tif(nStackPos)\n\t\t\t\t\t\t\t\t{\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tint64_t nTickStart = pLog->Log[pStack[nStackPos-1]];\n\t\t\t\t\t\t\t\t\tint64_t nTicks = MicroProfileLogTickDifference(nTickStart, LE);\n\t\t\t\t\t\t\t\t\tint64_t nChildTicks = pChildTickStack[nStackPos];\n\t\t\t\t\t\t\t\t\tnStackPos--;\n\t\t\t\t\t\t\t\t\tpChildTickStack[nStackPos] += nTicks;\n\n\t\t\t\t\t\t\t\t\tuint32_t nTimerIndex = MicroProfileLogTimerIndex(LE);\n\t\t\t\t\t\t\t\t\tS.Frame[nTimerIndex].nTicks += nTicks;\n\t\t\t\t\t\t\t\t\tS.FrameExclusive[nTimerIndex] += (nTicks-nChildTicks);\n\t\t\t\t\t\t\t\t\tS.Frame[nTimerIndex].nCount += 1;\n\n\t\t\t\t\t\t\t\t\tMP_ASSERT(nGroup < MICROPROFILE_MAX_GROUPS);\n\t\t\t\t\t\t\t\t\tuint8_t nGroupStackPos = pGroupStackPos[nGroup];\n\t\t\t\t\t\t\t\t\tif(nGroupStackPos)\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tnGroupStackPos--;\n\t\t\t\t\t\t\t\t\t\tif(0 == nGroupStackPos)\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tnGroupTicks[nGroup] += nTicks;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tpGroupStackPos[nGroup] = nGroupStackPos;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tfor(uint32_t i = 0; i < MICROPROFILE_MAX_GROUPS; ++i)\n\t\t\t\t\t{\n\t\t\t\t\t\tpLog->nGroupTicks[i] += nGroupTicks[i];\n\t\t\t\t\t\tpFrameGroup[i] += nGroupTicks[i];\n\t\t\t\t\t}\n\t\t\t\t\tpLog->nStackPos = nStackPos;\n\t\t\t\t}\n\t\t\t}\n\t\t\t{\n\t\t\t\tMICROPROFILE_SCOPE(g_MicroProfileAccumulate);\n\t\t\t\tfor(uint32_t i = 0; i < S.nTotalTimers; ++i)\n\t\t\t\t{\n\t\t\t\t\tS.AccumTimers[i].nTicks += S.Frame[i].nTicks;\t\t\t\t\n\t\t\t\t\tS.AccumTimers[i].nCount += S.Frame[i].nCount;\n\t\t\t\t\tS.AccumMaxTimers[i] = MicroProfileMax(S.AccumMaxTimers[i], S.Frame[i].nTicks);\n\t\t\t\t\tS.AccumMinTimers[i] = MicroProfileMin(S.AccumMinTimers[i], S.Frame[i].nTicks);\n\t\t\t\t\tS.AccumTimersExclusive[i] += S.FrameExclusive[i];\t\t\t\t\n\t\t\t\t\tS.AccumMaxTimersExclusive[i] = MicroProfileMax(S.AccumMaxTimersExclusive[i], S.FrameExclusive[i]);\n\t\t\t\t}\n\n\t\t\t\tfor(uint32_t i = 0; i < MICROPROFILE_MAX_GROUPS; ++i)\n\t\t\t\t{\n\t\t\t\t\tS.AccumGroup[i] += pFrameGroup[i];\n\t\t\t\t\tS.AccumGroupMax[i] = MicroProfileMax(S.AccumGroupMax[i], pFrameGroup[i]);\n\t\t\t\t}\n\n\t\t\t\tfor(uint32_t j = 0; j < MICROPROFILE_META_MAX; ++j)\n\t\t\t\t{\n\t\t\t\t\tif(S.MetaCounters[j].pName && 0 != (S.nActiveBars & (MP_DRAW_META_FIRST<<j)))\n\t\t\t\t\t{\n\t\t\t\t\t\tauto& Meta = S.MetaCounters[j];\n\t\t\t\t\t\tuint64_t nSum = 0;;\n\t\t\t\t\t\tfor(uint32_t i = 0; i < S.nTotalTimers; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tuint64_t nCounter = Meta.nCounters[i];\n\t\t\t\t\t\t\tMeta.nAccumMax[i] = MicroProfileMax(Meta.nAccumMax[i], nCounter);\n\t\t\t\t\t\t\tMeta.nAccum[i] += nCounter;\n\t\t\t\t\t\t\tnSum += nCounter;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tMeta.nSumAccum += nSum;\n\t\t\t\t\t\tMeta.nSumAccumMax = MicroProfileMax(Meta.nSumAccumMax, nSum);\n\t\t\t\t\t}\n\t\t\t\t}\t\t\t\n\t\t\t}\n\t\t\tfor(uint32_t i = 0; i < MICROPROFILE_MAX_GRAPHS; ++i)\n\t\t\t{\n\t\t\t\tif(S.Graph[i].nToken != MICROPROFILE_INVALID_TOKEN)\n\t\t\t\t{\n\t\t\t\t\tMicroProfileToken nToken = S.Graph[i].nToken;\n\t\t\t\t\tS.Graph[i].nHistory[S.nGraphPut] = S.Frame[MicroProfileGetTimerIndex(nToken)].nTicks;\n\t\t\t\t}\n\t\t\t}\n\t\t\tS.nGraphPut = (S.nGraphPut+1) % MICROPROFILE_GRAPH_HISTORY;\n\n\t\t}\n\n\n\t\tif(S.nRunning && S.nAggregateFlip <= ++S.nAggregateFlipCount)\n\t\t{\n\t\t\tnAggregateFlip = 1;\n\t\t\tif(S.nAggregateFlip) // if 0 accumulate indefinitely\n\t\t\t{\n\t\t\t\tnAggregateClear = 1;\n\t\t\t}\n\t\t}\n\t}\n\tif(nAggregateFlip)\n\t{\n\t\tmemcpy(&S.Aggregate[0], &S.AccumTimers[0], sizeof(S.Aggregate[0]) * S.nTotalTimers);\n\t\tmemcpy(&S.AggregateMax[0], &S.AccumMaxTimers[0], sizeof(S.AggregateMax[0]) * S.nTotalTimers);\n\t\tmemcpy(&S.AggregateMin[0], &S.AccumMinTimers[0], sizeof(S.AggregateMin[0]) * S.nTotalTimers);\n\t\tmemcpy(&S.AggregateExclusive[0], &S.AccumTimersExclusive[0], sizeof(S.AggregateExclusive[0]) * S.nTotalTimers);\n\t\tmemcpy(&S.AggregateMaxExclusive[0], &S.AccumMaxTimersExclusive[0], sizeof(S.AggregateMaxExclusive[0]) * S.nTotalTimers);\n\n\t\tmemcpy(&S.AggregateGroup[0], &S.AccumGroup[0], sizeof(S.AggregateGroup));\n\t\tmemcpy(&S.AggregateGroupMax[0], &S.AccumGroupMax[0], sizeof(S.AggregateGroup));\t\t\n\n\t\tfor(uint32_t i = 0; i < MICROPROFILE_MAX_THREADS; ++i)\n\t\t{\n\t\t\tMicroProfileThreadLog* pLog = S.Pool[i];\n\t\t\tif(!pLog) \n\t\t\t\tcontinue;\n\t\t\t\n\t\t\tmemcpy(&pLog->nAggregateGroupTicks[0], &pLog->nGroupTicks[0], sizeof(pLog->nAggregateGroupTicks));\n\t\t\t\n\t\t\tif(nAggregateClear)\n\t\t\t{\n\t\t\t\tmemset(&pLog->nGroupTicks[0], 0, sizeof(pLog->nGroupTicks));\n\t\t\t}\n\t\t}\n\n\t\tfor(uint32_t j = 0; j < MICROPROFILE_META_MAX; ++j)\n\t\t{\n\t\t\tif(S.MetaCounters[j].pName && 0 != (S.nActiveBars & (MP_DRAW_META_FIRST<<j)))\n\t\t\t{\n\t\t\t\tauto& Meta = S.MetaCounters[j];\n\t\t\t\tmemcpy(&Meta.nAggregateMax[0], &Meta.nAccumMax[0], sizeof(Meta.nAggregateMax[0]) * S.nTotalTimers);\n\t\t\t\tmemcpy(&Meta.nAggregate[0], &Meta.nAccum[0], sizeof(Meta.nAggregate[0]) * S.nTotalTimers);\n\t\t\t\tMeta.nSumAggregate = Meta.nSumAccum;\n\t\t\t\tMeta.nSumAggregateMax = Meta.nSumAccumMax;\n\t\t\t\tif(nAggregateClear)\n\t\t\t\t{\n\t\t\t\t\tmemset(&Meta.nAccumMax[0], 0, sizeof(Meta.nAccumMax[0]) * S.nTotalTimers);\n\t\t\t\t\tmemset(&Meta.nAccum[0], 0, sizeof(Meta.nAccum[0]) * S.nTotalTimers);\n\t\t\t\t\tMeta.nSumAccum = 0;\n\t\t\t\t\tMeta.nSumAccumMax = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\n\n\n\n\t\tS.nAggregateFrames = S.nAggregateFlipCount;\n\t\tS.nFlipAggregateDisplay = S.nFlipAggregate;\n\t\tS.nFlipMaxDisplay = S.nFlipMax;\n\t\tif(nAggregateClear)\n\t\t{\n\t\t\tmemset(&S.AccumTimers[0], 0, sizeof(S.Aggregate[0]) * S.nTotalTimers);\n\t\t\tmemset(&S.AccumMaxTimers[0], 0, sizeof(S.AccumMaxTimers[0]) * S.nTotalTimers);\n\t\t\tmemset(&S.AccumMinTimers[0], 0xFF, sizeof(S.AccumMinTimers[0]) * S.nTotalTimers);\n\t\t\tmemset(&S.AccumTimersExclusive[0], 0, sizeof(S.AggregateExclusive[0]) * S.nTotalTimers);\n\t\t\tmemset(&S.AccumMaxTimersExclusive[0], 0, sizeof(S.AccumMaxTimersExclusive[0]) * S.nTotalTimers);\n\t\t\tmemset(&S.AccumGroup[0], 0, sizeof(S.AggregateGroup));\n\t\t\tmemset(&S.AccumGroupMax[0], 0, sizeof(S.AggregateGroup));\t\t\n\n\t\t\tS.nAggregateFlipCount = 0;\n\t\t\tS.nFlipAggregate = 0;\n\t\t\tS.nFlipMax = 0;\n\n\t\t\tS.nAggregateFlipTick = MP_TICK();\n\t\t}\n\n\t\t#if MICROPROFILE_COUNTER_HISTORY\n\t\tint64_t* pDest = &S.nCounterHistory[S.nCounterHistoryPut][0];\n\t\tS.nCounterHistoryPut = (S.nCounterHistoryPut+1) % MICROPROFILE_GRAPH_HISTORY;\n\t\tfor(uint32_t i = 0; i < S.nNumCounters; ++i)\n\t\t{\n\t\t\tif(0 != (S.CounterInfo[i].nFlags & MICROPROFILE_COUNTER_FLAG_DETAILED))\n\t\t\t{\n\t\t\t\tuint64_t nValue = S.Counters[i].load(std::memory_order_relaxed);\n\t\t\t\tpDest[i] = nValue;\n\t\t\t\tS.nCounterMin[i] = MicroProfileMin(S.nCounterMin[i], (int64_t)nValue);\n\t\t\t\tS.nCounterMax[i] = MicroProfileMax(S.nCounterMax[i], (int64_t)nValue);\n\t\t\t}\n\t\t}\n\t\t#endif\n\t}\n\tS.nAggregateClear = 0;\n\n\tuint64_t nNewActiveGroup = 0;\n\tif (S.nRunning || S.nForceEnable)\n\t\tnNewActiveGroup = S.nAllGroupsWanted ? S.nGroupMask : S.nActiveGroupWanted;\n\tnNewActiveGroup |= S.nForceGroup;\n\tnNewActiveGroup |= S.nForceGroupUI;\n\tif(S.nActiveGroup != nNewActiveGroup)\n\t\tS.nActiveGroup = nNewActiveGroup;\n\n\tuint32_t nNewActiveBars = 0;\n\tif (S.nRunning || S.nForceEnable)\n\t\tnNewActiveBars = S.nBars;\n\tif(S.nForceMetaCounters)\n\t{\n\t\tfor(int i = 0; i < MICROPROFILE_META_MAX; ++i)\n\t\t{\n\t\t\tif(S.MetaCounters[i].pName)\n\t\t\t{\n\t\t\t\tnNewActiveBars |= (MP_DRAW_META_FIRST<<i);\n\t\t\t}\n\t\t}\n\t}\n\tif(nNewActiveBars != S.nActiveBars)\n\t\tS.nActiveBars = nNewActiveBars;\n}\n\nvoid MicroProfileFlip()\n{\n\tMICROPROFILE_SCOPE(g_MicroProfileFlip);\n\n\tMicroProfileFlipGpu();\n\tMicroProfileFlipCpu();\n}\n\nvoid MicroProfileGpuSetContext(void* pContext)\n{\n\tif(MicroProfileThreadLog* pLog = MicroProfileGetOrCreateThreadLog())\n\t{\n\t\tpLog->pContextGpu = pContext;\n\t}\n}\n\nvoid MicroProfileGpuBegin(void* pContext)\n{\n\tif(MicroProfileThreadLog* pLog = MicroProfileGetOrCreateThreadLog())\n\t{\n\t\tMP_ASSERT(!pLog->bActiveGpu);\n\n\t\tpLog->pContextGpu = pContext;\n\t\tpLog->nStartGpu = pLog->nPutGpu.load();\n\t\tpLog->bActiveGpu = 1;\n\t}\n}\n\nuint64_t MicroProfileGpuEnd()\n{\n\tif(MicroProfileThreadLog* pLog = MicroProfileGetThreadLog())\n\t{\n\t\tMP_ASSERT(pLog->bActiveGpu);\n\n\t\tuint32_t nStartGpu = pLog->nStartGpu;\n\t\tuint32_t nPutGpu = pLog->nPutGpu.load();\n\t\tMP_ASSERT(nPutGpu >= nStartGpu);\n\n\t\tpLog->pContextGpu = 0;\n\t\tpLog->nStartGpu = nPutGpu;\n\t\tpLog->bActiveGpu = 0;\n\n\t\tMP_ASSERT(MICROPROFILE_GPU_BUFFER_SIZE <= 1 << 24);\n\n\t\treturn (uint64_t(pLog->nLogIndex) << 48) | (uint64_t(nStartGpu) << 24) | uint64_t(nPutGpu);\n\t}\n\treturn 0;\n}\n\nvoid MicroProfileGpuSubmit(uint64_t nWork)\n{\n\tif (!nWork)\n\t\treturn;\n\n\tuint32_t nLogIndex = (nWork >> 48) & 0xffff;\n\tuint32_t nStart = (nWork >> 24) & 0xffffff;\n\tuint32_t nEnd = nWork & 0xffffff;\n\n\tMP_ASSERT(nLogIndex < MICROPROFILE_MAX_THREADS);\n\tMP_ASSERT(nStart <= nEnd);\n\n\tMicroProfileThreadLog* pLog = S.Pool[nLogIndex];\n\tif (!pLog)\n\t\treturn;\n\n\tMP_ASSERT(nEnd <= pLog->nStartGpu);\n\n\tfor (uint32_t i = nStart; i < nEnd; ++i)\n\t{\n\t\tMicroProfileLogEntry LE = pLog->LogGpu[i];\n\n\t\tMicroProfileLogPut(MicroProfileLogTimerIndex(LE), MicroProfileLogGetTick(LE), MicroProfileLogType(LE), g_MicroProfileGpuLog);\n\t}\n}\n\nvoid MicroProfileSetForceEnable(bool bEnable)\n{\n\tS.nForceEnable = bEnable ? 1 : 0;\n}\nbool MicroProfileGetForceEnable()\n{\n\treturn S.nForceEnable != 0;\n}\n\nvoid MicroProfileSetEnableAllGroups(bool bEnableAllGroups)\n{\n\tS.nAllGroupsWanted = bEnableAllGroups ? 1 : 0;\n}\n\nvoid MicroProfileEnableCategory(const char* pCategory, bool bEnabled)\n{\n\tint nCategoryIndex = -1;\n\tfor(uint32_t i = 0; i < S.nCategoryCount; ++i)\n\t{\n\t\tif(!MP_STRCASECMP(pCategory, S.CategoryInfo[i].pName))\n\t\t{\n\t\t\tnCategoryIndex = (int)i;\n\t\t\tbreak;\n\t\t}\n\t}\n\tif(nCategoryIndex >= 0)\n\t{\n\t\tif(bEnabled)\n\t\t{\n\t\t\tS.nActiveGroupWanted |= S.CategoryInfo[nCategoryIndex].nGroupMask;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tS.nActiveGroupWanted &= ~S.CategoryInfo[nCategoryIndex].nGroupMask;\n\t\t}\n\t}\n}\n\n\nvoid MicroProfileEnableCategory(const char* pCategory)\n{\n\tMicroProfileEnableCategory(pCategory, true);\n}\nvoid MicroProfileDisableCategory(const char* pCategory)\n{\n\tMicroProfileEnableCategory(pCategory, false);\n}\n\nbool MicroProfileGetEnableAllGroups()\n{\n\treturn 0 != S.nAllGroupsWanted;\n}\n\nvoid MicroProfileSetForceMetaCounters(bool bForce)\n{\n\tS.nForceMetaCounters = bForce ? 1 : 0;\n}\n\nbool MicroProfileGetForceMetaCounters()\n{\n\treturn 0 != S.nForceMetaCounters;\n}\n\nvoid MicroProfileEnableMetaCounter(const char* pMeta)\n{\n\tfor(uint32_t i = 0; i < MICROPROFILE_META_MAX; ++i)\n\t{\n\t\tif(S.MetaCounters[i].pName && 0 == MP_STRCASECMP(S.MetaCounters[i].pName, pMeta))\n\t\t{\n\t\t\tS.nBars |= (MP_DRAW_META_FIRST<<i);\n\t\t\treturn;\n\t\t}\n\t}\n}\nvoid MicroProfileDisableMetaCounter(const char* pMeta)\n{\n\tfor(uint32_t i = 0; i < MICROPROFILE_META_MAX; ++i)\n\t{\n\t\tif(S.MetaCounters[i].pName && 0 == MP_STRCASECMP(S.MetaCounters[i].pName, pMeta))\n\t\t{\n\t\t\tS.nBars &= ~(MP_DRAW_META_FIRST<<i);\n\t\t\treturn;\n\t\t}\n\t}\n}\n\n\nvoid MicroProfileSetAggregateFrames(int nFrames)\n{\n\tS.nAggregateFlip = (uint32_t)nFrames;\n\tif(0 == nFrames)\n\t{\n\t\tS.nAggregateClear = 1;\n\t}\n}\n\nint MicroProfileGetAggregateFrames()\n{\n\treturn S.nAggregateFlip;\n}\n\nint MicroProfileGetCurrentAggregateFrames()\n{\n\treturn int(S.nAggregateFlip ? S.nAggregateFlip : S.nAggregateFlipCount);\n}\n\n\nvoid MicroProfileForceEnableGroup(const char* pGroup, MicroProfileTokenType Type)\n{\n\tMicroProfileInit();\n\tstd::lock_guard<std::recursive_mutex> Lock(MicroProfileMutex());\n\tuint16_t nGroup = MicroProfileGetGroup(pGroup, Type);\n\tS.nForceGroup |= (1ll << nGroup);\n}\n\nvoid MicroProfileForceDisableGroup(const char* pGroup, MicroProfileTokenType Type)\n{\n\tMicroProfileInit();\n\tstd::lock_guard<std::recursive_mutex> Lock(MicroProfileMutex());\n\tuint16_t nGroup = MicroProfileGetGroup(pGroup, Type);\n\tS.nForceGroup &= ~(1ll << nGroup);\n}\n\n\nvoid MicroProfileCalcAllTimers(float* pTimers, float* pAverage, float* pMax, float* pMin, float* pCallAverage, float* pExclusive, float* pAverageExclusive, float* pMaxExclusive, float* pTotal, uint32_t nSize)\n{\n\tfor(uint32_t i = 0; i < S.nTotalTimers && i < nSize; ++i)\n\t{\n\t\tconst uint32_t nGroupId = S.TimerInfo[i].nGroupIndex;\n\t\tconst float fToMs = MicroProfileTickToMsMultiplier(S.GroupInfo[nGroupId].Type == MicroProfileTokenTypeGpu ? MicroProfileTicksPerSecondGpu() : MicroProfileTicksPerSecondCpu());\n\t\tuint32_t nTimer = i;\n\t\tuint32_t nIdx = i * 2;\n\t\tuint32_t nAggregateFrames = S.nAggregateFrames ? S.nAggregateFrames : 1;\n\t\tuint32_t nAggregateCount = S.Aggregate[nTimer].nCount ? S.Aggregate[nTimer].nCount : 1;\n\t\tfloat fToPrc = S.fRcpReferenceTime;\n\t\tfloat fMs = fToMs * (S.Frame[nTimer].nTicks);\n\t\tfloat fPrc = MicroProfileMin(fMs * fToPrc, 1.f);\n\t\tfloat fAverageMs = fToMs * (S.Aggregate[nTimer].nTicks / nAggregateFrames);\n\t\tfloat fAveragePrc = MicroProfileMin(fAverageMs * fToPrc, 1.f);\n\t\tfloat fMaxMs = fToMs * (S.AggregateMax[nTimer]);\n\t\tfloat fMaxPrc = MicroProfileMin(fMaxMs * fToPrc, 1.f);\n\t\tfloat fMinMs = fToMs * (S.AggregateMin[nTimer] != uint64_t(-1) ? S.AggregateMin[nTimer] : 0);\n\t\tfloat fMinPrc = MicroProfileMin(fMinMs * fToPrc, 1.f);\n\t\tfloat fCallAverageMs = fToMs * (S.Aggregate[nTimer].nTicks / nAggregateCount);\n\t\tfloat fCallAveragePrc = MicroProfileMin(fCallAverageMs * fToPrc, 1.f);\n\t\tfloat fMsExclusive = fToMs * (S.FrameExclusive[nTimer]);\n\t\tfloat fPrcExclusive = MicroProfileMin(fMsExclusive * fToPrc, 1.f);\n\t\tfloat fAverageMsExclusive = fToMs * (S.AggregateExclusive[nTimer] / nAggregateFrames);\n\t\tfloat fAveragePrcExclusive = MicroProfileMin(fAverageMsExclusive * fToPrc, 1.f);\n\t\tfloat fMaxMsExclusive = fToMs * (S.AggregateMaxExclusive[nTimer]);\n\t\tfloat fMaxPrcExclusive = MicroProfileMin(fMaxMsExclusive * fToPrc, 1.f);\n\t\tfloat fTotalMs = fToMs * S.Aggregate[nTimer].nTicks;\n\t\tpTimers[nIdx] = fMs;\n\t\tpTimers[nIdx+1] = fPrc;\n\t\tpAverage[nIdx] = fAverageMs;\n\t\tpAverage[nIdx+1] = fAveragePrc;\n\t\tpMax[nIdx] = fMaxMs;\n\t\tpMax[nIdx+1] = fMaxPrc;\n\t\tpMin[nIdx] = fMinMs;\n\t\tpMin[nIdx + 1] = fMinPrc;\n\t\tpCallAverage[nIdx] = fCallAverageMs;\n\t\tpCallAverage[nIdx+1] = fCallAveragePrc;\n\t\tpExclusive[nIdx] = fMsExclusive;\n\t\tpExclusive[nIdx+1] = fPrcExclusive;\n\t\tpAverageExclusive[nIdx] = fAverageMsExclusive;\n\t\tpAverageExclusive[nIdx+1] = fAveragePrcExclusive;\n\t\tpMaxExclusive[nIdx] = fMaxMsExclusive;\n\t\tpMaxExclusive[nIdx+1] = fMaxPrcExclusive;\n\t\tpTotal[nIdx] = fTotalMs;\n\t\tpTotal[nIdx+1] = 0.f;\n\t}\n}\n\nvoid MicroProfileTogglePause()\n{\n\tS.nToggleRunning = 1;\n}\n\nfloat MicroProfileGetTime(const char* pGroup, const char* pName)\n{\n\tMicroProfileToken nToken = MicroProfileFindToken(pGroup, pName);\n\tif(nToken == MICROPROFILE_INVALID_TOKEN)\n\t{\n\t\treturn 0.f;\n\t}\n\tuint32_t nTimerIndex = MicroProfileGetTimerIndex(nToken);\n\tuint32_t nGroupIndex = MicroProfileGetGroupIndex(nToken);\n\tfloat fToMs = MicroProfileTickToMsMultiplier(S.GroupInfo[nGroupIndex].Type == MicroProfileTokenTypeGpu ? MicroProfileTicksPerSecondGpu() : MicroProfileTicksPerSecondCpu());\n\treturn S.Frame[nTimerIndex].nTicks * fToMs;\n}\n\n\nint MicroProfileFormatCounter(int eFormat, int64_t nCounter, char* pOut, uint32_t nBufferSize)\n{\n\tif (!nCounter)\n\t{\n\t\tpOut[0] = '0';\n\t\tpOut[1] = '\\0';\n\t\treturn 1;\n\t}\n\tint nLen = 0;\n\tchar* pBase = pOut;\n\tchar* pTmp = pOut;\n\tchar* pEnd = pOut + nBufferSize;\n\n\tswitch (eFormat)\n\t{\n\tcase MICROPROFILE_COUNTER_FORMAT_DEFAULT:\n\t{\n\t\tint nNegative = 0;\n\t\tif(nCounter < 0)\n\t\t{\n\t\t\tnCounter = -nCounter;\n\t\t\tnNegative = 1;\n\t\t}\n\t\tint nSeperate = 0;\n\t\twhile (nCounter)\n\t\t{\n\t\t\tif (nSeperate)\n\t\t\t{\n\t\t\t\t*pTmp++ = ' ';\n\t\t\t}\n\t\t\tnSeperate = 1;\n\t\t\tfor (uint32_t i = 0; nCounter && i < 3; ++i)\n\t\t\t{\n\t\t\t\tint nDigit = nCounter % 10;\n\t\t\t\tnCounter /= 10;\n\t\t\t\t*pTmp++ = '0' + nDigit;\n\t\t\t}\n\t\t}\n\t\tif(nNegative)\n\t\t{\n\t\t\t*pTmp++ = '-';\n\t\t}\n\t\tnLen = pTmp - pOut;\n\t\t--pTmp;\n\t\tMP_ASSERT(pTmp <= pEnd);\n\t\twhile (pTmp > pOut) //reverse string\n\t\t{\n\t\t\tchar c = *pTmp;\n\t\t\t*pTmp = *pOut;\n\t\t\t*pOut = c;\n\t\t\tpTmp--;\n\t\t\tpOut++;\n\t\t}\n\t}\n\tbreak;\n\tcase MICROPROFILE_COUNTER_FORMAT_BYTES:\n\t{\n\t\tconst char* pExt[] = { \"b\",\"kb\",\"mb\",\"gb\",\"tb\",\"pb\", \"eb\",\"zb\", \"yb\" };\n\t\tsize_t nNumExt = sizeof(pExt) / sizeof(pExt[0]);\n\t\tint64_t nShift = 0;\n\t\tint64_t nDivisor = 1;\n\t\tint64_t nCountShifted = nCounter >> 10;\n\t\twhile (nCountShifted)\n\t\t{\n\t\t\tnDivisor <<= 10;\n\t\t\tnCountShifted >>= 10;\n\t\t\tnShift++;\n\t\t}\n\t\tMP_ASSERT(nShift < (int64_t)nNumExt);\n\t\tif (nShift)\n\t\t{\n\t\t\tnLen = snprintf(pOut, nBufferSize - 1, \"%3.2f%s\", (double)nCounter / nDivisor, pExt[nShift]);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tnLen = snprintf(pOut, nBufferSize - 1, \"%lld%s\", (long long)nCounter, pExt[nShift]);\n\t\t}\n\t}\n\tbreak;\n\t}\n\tpBase[nLen] = '\\0';\n\n\treturn nLen;\n}\n\ntypedef void MicroProfileWriteCallback(void* Handle, size_t size, const char* pData);\n\nvoid MicroProfileDumpFile(const char* pPath, MicroProfileDumpType eType, uint32_t nFrames)\n{\n\tsize_t nLen = strlen(pPath);\n\tif(nLen > sizeof(S.DumpPath)-1)\n\t{\n\t\treturn;\n\t}\n\tmemcpy(S.DumpPath, pPath, nLen+1);\n\tS.nDumpFileNextFrame = 1;\n\tS.eDumpType = eType;\n\tS.nDumpFrames = nFrames;\n}\n\nMICROPROFILE_FORMAT(3, 4) void MicroProfilePrintf(MicroProfileWriteCallback CB, void* Handle, const char* pFmt, ...)\n{\n\tchar buffer[4096];\n\tva_list args;\n\tva_start (args, pFmt);\n#ifdef _WIN32\n\tsize_t size = vsprintf_s(buffer, pFmt, args);\n#else\n\tsize_t size = vsnprintf(buffer, sizeof(buffer)-1,  pFmt, args);\n#endif\n\tCB(Handle, size, &buffer[0]);\n\tva_end (args);\n}\n\nvoid MicroProfilePrintUIntComma(MicroProfileWriteCallback CB, void* Handle, uint64_t nData)\n{\n\tchar Buffer[32];\n\n\tuint32_t nOffset = sizeof(Buffer);\n\tBuffer[--nOffset] = ',';\n\n\tif(nData < 10)\n\t{\n\t\tBuffer[--nOffset] = '0' + nData;\n\t}\n\telse\n\t{\n\t\tdo\n\t\t{\n\t\t\tBuffer[--nOffset] = \"0123456789abcdef\"[nData & 0xf];\n\t\t\tnData >>= 4;\n\t\t}\n\t\twhile(nData);\n\n\t\tBuffer[--nOffset] = 'x';\n\t\tBuffer[--nOffset] = '0';\n\t}\n\n\tCB(Handle, sizeof(Buffer) - nOffset, &Buffer[nOffset]);\n}\n\nvoid MicroProfilePrintString(MicroProfileWriteCallback CB, void* Handle, const char* pData)\n{\n\tCB(Handle, strlen(pData), pData);\n}\n\nvoid MicroProfileDumpCsv(MicroProfileWriteCallback CB, void* Handle, int nMaxFrames)\n{\n\t(void)nMaxFrames;\n\n\tuint32_t nAggregateFrames = S.nAggregateFrames ? S.nAggregateFrames : 1;\n\tfloat fToMsCPU = MicroProfileTickToMsMultiplier(MicroProfileTicksPerSecondCpu());\n\tfloat fToMsGPU = MicroProfileTickToMsMultiplier(MicroProfileTicksPerSecondGpu());\n\n\tMicroProfilePrintf(CB, Handle, \"frames,%d\\n\", nAggregateFrames);\n\tMicroProfilePrintf(CB, Handle, \"group,name,average,max,callaverage\\n\");\n\n\tuint32_t nNumTimers = S.nTotalTimers;\n\tuint32_t nBlockSize = 2 * nNumTimers;\n\tfloat* pTimers = (float*)alloca(nBlockSize * 9 * sizeof(float));\n\tfloat* pAverage = pTimers + nBlockSize;\n\tfloat* pMax = pTimers + 2 * nBlockSize;\n\tfloat* pMin = pTimers + 3 * nBlockSize;\n\tfloat* pCallAverage = pTimers + 4 * nBlockSize;\n\tfloat* pTimersExclusive = pTimers + 5 * nBlockSize;\n\tfloat* pAverageExclusive = pTimers + 6 * nBlockSize;\n\tfloat* pMaxExclusive = pTimers + 7 * nBlockSize;\n\tfloat* pTotal = pTimers + 8 * nBlockSize;\n\n\tMicroProfileCalcAllTimers(pTimers, pAverage, pMax, pMin, pCallAverage, pTimersExclusive, pAverageExclusive, pMaxExclusive, pTotal, nNumTimers);\n\n\tfor(uint32_t i = 0; i < S.nTotalTimers; ++i)\n\t{\n\t\tuint32_t nIdx = i * 2;\n\t\tMicroProfilePrintf(CB, Handle, \"\\\"%s\\\",\\\"%s\\\",%f,%f,%f\\n\", S.TimerInfo[i].pName, S.GroupInfo[S.TimerInfo[i].nGroupIndex].pName, pAverage[nIdx], pMax[nIdx], pCallAverage[nIdx]);\n\t}\n\n\tMicroProfilePrintf(CB, Handle, \"\\n\\n\");\n\n\tMicroProfilePrintf(CB, Handle, \"group,average,max,total\\n\");\n\tfor(uint32_t j = 0; j < MICROPROFILE_MAX_GROUPS; ++j)\n\t{\n\t\tconst char* pGroupName = S.GroupInfo[j].pName;\n\t\tfloat fToMs =  S.GroupInfo[j].Type == MicroProfileTokenTypeGpu ? fToMsGPU : fToMsCPU;\n\t\tif(pGroupName[0] != '\\0')\n\t\t{\n\t\t\tMicroProfilePrintf(CB, Handle, \"\\\"%s\\\",%.3f,%.3f,%.3f\\n\", pGroupName, fToMs * S.AggregateGroup[j] / nAggregateFrames, fToMs * S.AggregateGroup[j] / nAggregateFrames, fToMs * S.AggregateGroup[j]);\n\t\t}\n\t}\n\n\tMicroProfilePrintf(CB, Handle, \"\\n\\n\");\n\tMicroProfilePrintf(CB, Handle, \"group,thread,average,total\\n\");\n\tfor(uint32_t j = 0; j < MICROPROFILE_MAX_GROUPS; ++j)\n\t{\n\t\tfor(uint32_t i = 0; i < S.nNumLogs; ++i)\n\t\t{\n\t\t\tif(S.Pool[i])\n\t\t\t{\n\t\t\t\tconst char* pThreadName = &S.Pool[i]->ThreadName[0];\n\t\t\t\t// MicroProfilePrintf(CB, Handle, \"var ThreadGroupTime%d = [\", i);\n\t\t\t\tfloat fToMs = S.Pool[i]->nGpu ? fToMsGPU : fToMsCPU;\n\t\t\t\t{\n\t\t\t\t\tuint64_t nTicks = S.Pool[i]->nAggregateGroupTicks[j];\n\t\t\t\t\tfloat fTime = nTicks / nAggregateFrames * fToMs;\n\t\t\t\t\tfloat fTimeTotal = nTicks * fToMs;\n\t\t\t\t\tif(fTimeTotal > 0.01f)\n\t\t\t\t\t{\n\t\t\t\t\t\tconst char* pGroupName = S.GroupInfo[j].pName;\n\t\t\t\t\t\tMicroProfilePrintf(CB, Handle, \"\\\"%s\\\",\\\"%s\\\",%.3f,%.3f\\n\", pGroupName, pThreadName, fTime, fTimeTotal);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tMicroProfilePrintf(CB, Handle, \"\\n\\n\");\n\tMicroProfilePrintf(CB, Handle, \"frametimecpu\\n\");\n\n\tconst uint32_t nCount = MICROPROFILE_MAX_FRAME_HISTORY - MICROPROFILE_GPU_FRAME_DELAY - 3;\n\tconst uint32_t nStart = S.nFrameCurrent;\n\tfor(uint32_t i = nCount; i > 0; i--)\n\t{\n\t\tuint32_t nFrame = (nStart + MICROPROFILE_MAX_FRAME_HISTORY - i) % MICROPROFILE_MAX_FRAME_HISTORY;\n\t\tuint32_t nFrameNext = (nStart + MICROPROFILE_MAX_FRAME_HISTORY - i + 1) % MICROPROFILE_MAX_FRAME_HISTORY;\n\t\tuint64_t nTicks = S.Frames[nFrameNext].nFrameStartCpu - S.Frames[nFrame].nFrameStartCpu;\n\t\tMicroProfilePrintf(CB, Handle, \"%f,\", nTicks * fToMsCPU);\n\t}\n\tMicroProfilePrintf(CB, Handle, \"\\n\");\n\n\tMicroProfilePrintf(CB, Handle, \"\\n\\n\");\n\tMicroProfilePrintf(CB, Handle, \"frametimegpu\\n\");\n\n\tfor(uint32_t i = nCount; i > 0; i--)\n\t{\n\t\tuint32_t nFrame = (nStart + MICROPROFILE_MAX_FRAME_HISTORY - i) % MICROPROFILE_MAX_FRAME_HISTORY;\n\t\tuint32_t nFrameNext = (nStart + MICROPROFILE_MAX_FRAME_HISTORY - i + 1) % MICROPROFILE_MAX_FRAME_HISTORY;\n\t\tuint64_t nTicks = S.Frames[nFrameNext].nFrameStartGpu - S.Frames[nFrame].nFrameStartGpu;\n\t\tMicroProfilePrintf(CB, Handle, \"%f,\", nTicks * fToMsGPU);\n\t}\n\tMicroProfilePrintf(CB, Handle, \"\\n\\n\");\n\tMicroProfilePrintf(CB, Handle, \"Meta\\n\");//only single frame snapshot\n\tMicroProfilePrintf(CB, Handle, \"name,average,max,total\\n\");\n\tfor(int j = 0; j < MICROPROFILE_META_MAX; ++j)\n\t{\n\t\tif(S.MetaCounters[j].pName)\n\t\t{\n\t\t\tMicroProfilePrintf(CB, Handle, \"\\\"%s\\\",%f,%lld,%lld\\n\",S.MetaCounters[j].pName, S.MetaCounters[j].nSumAggregate / (float)nAggregateFrames, (long long)S.MetaCounters[j].nSumAggregateMax, (long long)S.MetaCounters[j].nSumAggregate);\n\t\t}\n\t}\n}\n\n#if MICROPROFILE_EMBED_HTML\nextern const char* g_MicroProfileHtml_begin[];\nextern size_t g_MicroProfileHtml_begin_sizes[];\nextern size_t g_MicroProfileHtml_begin_count;\nextern const char* g_MicroProfileHtml_end[];\nextern size_t g_MicroProfileHtml_end_sizes[];\nextern size_t g_MicroProfileHtml_end_count;\n\n\nvoid MicroProfileDumpHtml(MicroProfileWriteCallback CB, void* Handle, int nMaxFrames, const char* pHost)\n{\n\tuint32_t nRunning = S.nRunning;\n\tS.nRunning = 0;\n\t//stall pushing of timers\n\tuint64_t nActiveGroup = S.nActiveGroup;\n\tS.nActiveGroup = 0;\n\tS.nPauseTicks = MP_TICK();\n\n\n\tfor(size_t i = 0; i < g_MicroProfileHtml_begin_count; ++i)\n\t{\n\t\tCB(Handle, g_MicroProfileHtml_begin_sizes[i]-1, g_MicroProfileHtml_begin[i]);\n\t}\n\t//dump info\n\tuint64_t nTicks = MP_TICK();\n\n\tfloat fToMsCPU = MicroProfileTickToMsMultiplier(MicroProfileTicksPerSecondCpu());\n\tfloat fToMsGPU = MicroProfileTickToMsMultiplier(MicroProfileTicksPerSecondGpu());\n\tfloat fAggregateMs = fToMsCPU * (nTicks - S.nAggregateFlipTick);\n\tMicroProfilePrintf(CB, Handle, \"var DumpHost = '%s';\\n\", pHost ? pHost : \"\");\n\ttime_t CaptureTime;\n\ttime(&CaptureTime);\n\tMicroProfilePrintf(CB, Handle, \"var DumpUtcCaptureTime = %ld;\\n\", CaptureTime);\n\tMicroProfilePrintf(CB, Handle, \"var AggregateInfo = {'Frames':%d, 'Time':%f};\\n\", S.nAggregateFrames, fAggregateMs);\n\n\t//categories\n\tMicroProfilePrintf(CB, Handle, \"var CategoryInfo = Array(%d);\\n\",S.nCategoryCount);\n\tfor(uint32_t i = 0; i < S.nCategoryCount; ++i)\n\t{\n\t\tMicroProfilePrintf(CB, Handle, \"CategoryInfo[%d] = \\\"%s\\\";\\n\", i, S.CategoryInfo[i].pName);\n\t}\n\n\t//groups\n\tMicroProfilePrintf(CB, Handle, \"var GroupInfo = Array(%d);\\n\\n\",S.nGroupCount);\n\tuint32_t nAggregateFrames = S.nAggregateFrames ? S.nAggregateFrames : 1;\n\n\tfor(uint32_t i = 0; i < S.nGroupCount; ++i)\n\t{\n\t\tMP_ASSERT(i == S.GroupInfo[i].nGroupIndex);\n\t\tfloat fToMs = S.GroupInfo[i].Type == MicroProfileTokenTypeCpu ? fToMsCPU : fToMsGPU;\n\t\tuint32_t nColor = S.TimerInfo[i].nColor;\n\t\tMicroProfilePrintf(CB, Handle, \"GroupInfo[%d] = MakeGroup(%d, \\\"%s\\\", %d, %d, %d, %f, %f, %f, '#%06x');\\n\", \n\t\t\tS.GroupInfo[i].nGroupIndex, \n\t\t\tS.GroupInfo[i].nGroupIndex, \n\t\t\tS.GroupInfo[i].pName, \n\t\t\tS.GroupInfo[i].nCategory, \n\t\t\tS.GroupInfo[i].nNumTimers, \n\t\t\tS.GroupInfo[i].Type == MicroProfileTokenTypeGpu?1:0, \n\t\t\tfToMs * S.AggregateGroup[i], \n\t\t\tfToMs * S.AggregateGroup[i] / nAggregateFrames, \n\t\t\tfToMs * S.AggregateGroupMax[i],\n\t\t\t((MICROPROFILE_UNPACK_RED(nColor) & 0xff) << 16) | ((MICROPROFILE_UNPACK_GREEN(nColor) & 0xff) << 8) | (MICROPROFILE_UNPACK_BLUE(nColor) & 0xff));\n\t}\n\t//timers\n\n\tuint32_t nNumTimers = S.nTotalTimers;\n\tuint32_t nBlockSize = 2 * nNumTimers;\n\tfloat* pTimers = (float*)alloca(nBlockSize * 9 * sizeof(float));\n\tfloat* pAverage = pTimers + nBlockSize;\n\tfloat* pMax = pTimers + 2 * nBlockSize;\n\tfloat* pMin = pTimers + 3 * nBlockSize;\n\tfloat* pCallAverage = pTimers + 4 * nBlockSize;\n\tfloat* pTimersExclusive = pTimers + 5 * nBlockSize;\n\tfloat* pAverageExclusive = pTimers + 6 * nBlockSize;\n\tfloat* pMaxExclusive = pTimers + 7 * nBlockSize;\n\tfloat* pTotal = pTimers + 8 * nBlockSize;\n\n\tMicroProfileCalcAllTimers(pTimers, pAverage, pMax, pMin, pCallAverage, pTimersExclusive, pAverageExclusive, pMaxExclusive, pTotal, nNumTimers);\n\n\tMicroProfilePrintf(CB, Handle, \"\\nvar TimerInfo = Array(%d);\\n\\n\", S.nTotalTimers);\n\tfor(uint32_t i = 0; i < S.nTotalTimers; ++i)\n\t{\n\t\tuint32_t nIdx = i * 2;\n\t\tMP_ASSERT(i == S.TimerInfo[i].nTimerIndex);\n\n\t\tuint32_t nColor = S.TimerInfo[i].nColor;\n\t\tuint32_t nColorDark = (nColor >> 1) & ~0x80808080;\n\t\tMicroProfilePrintf(CB, Handle, \"TimerInfo[%d] = MakeTimer(%d, \\\"%s\\\", %d, '#%06x','#%06x', %f, %f, %f, %f, %f, %f, %d, %f,\\n\",\n\t\t\tS.TimerInfo[i].nTimerIndex, S.TimerInfo[i].nTimerIndex, S.TimerInfo[i].pName, S.TimerInfo[i].nGroupIndex, \n\t\t\t((MICROPROFILE_UNPACK_RED(nColor) & 0xff) << 16) | ((MICROPROFILE_UNPACK_GREEN(nColor) & 0xff) << 8) | (MICROPROFILE_UNPACK_BLUE(nColor) & 0xff),\n\t\t\t((MICROPROFILE_UNPACK_RED(nColorDark) & 0xff) << 16) | ((MICROPROFILE_UNPACK_GREEN(nColorDark) & 0xff) << 8) | (MICROPROFILE_UNPACK_BLUE(nColorDark) & 0xff),\n\t\t\tpAverage[nIdx],\n\t\t\tpMax[nIdx],\n\t\t\tpMin[nIdx],\n\t\t\tpAverageExclusive[nIdx],\n\t\t\tpMaxExclusive[nIdx],\n\t\t\tpCallAverage[nIdx],\n\t\t\tS.Aggregate[i].nCount,\n\t\t\tpTotal[nIdx]);\n\n\t\tMicroProfilePrintString(CB, Handle, \"\\t[\");\n\t\tfor(int j = 0; j < MICROPROFILE_META_MAX; ++j)\n\t\t{\n\t\t\tif(S.MetaCounters[j].pName)\n\t\t\t{\n\t\t\t\tMicroProfilePrintUIntComma(CB, Handle, S.MetaCounters[j].nCounters[i]);\n\t\t\t}\n\t\t}\n\t\tMicroProfilePrintString(CB, Handle, \"],[\");\n\t\tfor(int j = 0; j < MICROPROFILE_META_MAX; ++j)\n\t\t{\n\t\t\tif(S.MetaCounters[j].pName)\n\t\t\t{\n\t\t\t\tMicroProfilePrintUIntComma(CB, Handle, S.MetaCounters[j].nAggregate[i]);\n\t\t\t}\n\t\t}\n\t\tMicroProfilePrintString(CB, Handle, \"],[\");\n\t\tfor(int j = 0; j < MICROPROFILE_META_MAX; ++j)\n\t\t{\n\t\t\tif(S.MetaCounters[j].pName)\n\t\t\t{\n\t\t\t\tMicroProfilePrintUIntComma(CB, Handle, S.MetaCounters[j].nAggregateMax[i]);\n\t\t\t}\n\t\t}\n\t\tMicroProfilePrintString(CB, Handle, \"]);\\n\");\n\t}\n\n\tMicroProfilePrintString(CB, Handle, \"\\nvar ThreadNames = [\");\n\tfor(uint32_t i = 0; i < S.nNumLogs; ++i)\n\t{\n\t\tif(S.Pool[i])\n\t\t{\n\t\t\tMicroProfilePrintf(CB, Handle, \"'%s',\", S.Pool[i]->ThreadName);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tMicroProfilePrintf(CB, Handle, \"'Thread %d',\", i);\n\t\t}\n\t}\n\tMicroProfilePrintString(CB, Handle, \"];\\n\\n\");\n\n\n\tMicroProfilePrintString(CB, Handle, \"\\nvar ThreadIds = [\");\n\tfor(uint32_t i = 0; i < S.nNumLogs; ++i)\n\t{\n\t\tMicroProfileThreadIdType nThreadId = S.Pool[i] ? S.Pool[i]->nThreadId : 0;\n\t\tMicroProfilePrintUIntComma(CB, Handle, nThreadId);\n\t}\n\tMicroProfilePrintString(CB, Handle, \"];\\n\\n\");\n\n\n\tMicroProfilePrintString(CB, Handle, \"\\nvar ThreadGpu = [\");\n\tfor(uint32_t i = 0; i < S.nNumLogs; ++i)\n\t{\n\t\tuint32_t nGpu = S.Pool[i] ? S.Pool[i]->nGpu : 0;\n\t\tMicroProfilePrintUIntComma(CB, Handle, nGpu);\n\t}\n\tMicroProfilePrintString(CB, Handle, \"];\\n\\n\");\n\n\n\tMicroProfilePrintString(CB, Handle, \"\\nvar ThreadGroupTimeArray = [\\n\");\n\tfor(uint32_t i = 0; i < S.nNumLogs; ++i)\n\t{\n\t\tif(S.Pool[i])\n\t\t{\n\t\t\tfloat fToMs = S.Pool[i]->nGpu ? fToMsGPU : fToMsCPU;\n\t\t\tMicroProfilePrintf(CB, Handle, \"MakeTimes(%e,[\", fToMs);\n\t\t\tfor(uint32_t j = 0; j < MICROPROFILE_MAX_GROUPS; ++j)\n\t\t\t{\n\t\t\t\tMicroProfilePrintUIntComma(CB, Handle, S.Pool[i]->nAggregateGroupTicks[j]);\n\t\t\t}\n\t\t\tMicroProfilePrintString(CB, Handle, \"]),\\n\");\n\t\t}\n\t}\n\tMicroProfilePrintString(CB, Handle, \"];\");\n\n\n\tMicroProfilePrintString(CB, Handle, \"\\nvar MetaNames = [\");\n\tfor(int i = 0; i < MICROPROFILE_META_MAX; ++i)\n\t{\n\t\tif(S.MetaCounters[i].pName)\n\t\t{\n\t\t\tMicroProfilePrintf(CB, Handle, \"'%s',\", S.MetaCounters[i].pName);\n\t\t}\n\t}\n\tMicroProfilePrintString(CB, Handle, \"];\\n\\n\");\n\n\tMicroProfilePrintString(CB, Handle, \"\\nvar CounterInfo = [\");\n\tfor(uint32_t i = 0; i < S.nNumCounters; ++i)\n\t{\n\t\tint64_t nCounter = S.Counters[i].load();\n\t\tint64_t nLimit = S.CounterInfo[i].nLimit;\n\t\tfloat fCounterPrc = 0.f;\n\t\tfloat fBoxPrc = 1.f;\n\t\tif(nLimit)\n\t\t{\n\t\t\tfCounterPrc = (float)nCounter / nLimit;\n\t\t\tif(fCounterPrc>1.f)\n\t\t\t{\n\t\t\t\tfBoxPrc = 1.f / fCounterPrc;\n\t\t\t\tfCounterPrc = 1.f;\n\t\t\t}\n\t\t}\n\n\t\tint64_t nCounterMin = 0, nCounterMax = 0;\n\n\t#if MICROPROFILE_COUNTER_HISTORY\n\t\tnCounterMin = S.nCounterMin[i];\n\t\tnCounterMax = S.nCounterMax[i];\n\t#endif\n\n\t\tchar Formatted[64];\n\t\tchar FormattedLimit[64];\n\t\tMicroProfileFormatCounter(S.CounterInfo[i].eFormat, nCounter, Formatted, sizeof(Formatted)-1);\n\t\tMicroProfileFormatCounter(S.CounterInfo[i].eFormat, S.CounterInfo[i].nLimit, FormattedLimit, sizeof(FormattedLimit)-1);\n\t\tMicroProfilePrintf(CB, Handle, \"MakeCounter(%d, %d, %d, %d, %d, '%s', %lld, %lld, %lld, '%s', %lld, '%s', %d, %f, %f, [\",\n\t\t\ti,\n\t\t\tS.CounterInfo[i].nParent,\n\t\t\tS.CounterInfo[i].nSibling,\n \t \t\tS.CounterInfo[i].nFirstChild,\n \t \t\tS.CounterInfo[i].nLevel,\n\t\t\tS.CounterInfo[i].pName,\n\t\t\t(long long)nCounter,\n\t\t\t(long long)nCounterMin,\n\t\t\t(long long)nCounterMax,\n\t\t\tFormatted,\n\t\t\t(long long)nLimit,\n\t\t\tFormattedLimit,\n\t\t\tS.CounterInfo[i].eFormat == MICROPROFILE_COUNTER_FORMAT_BYTES ? 1 : 0, \n\t\t\tfCounterPrc,\n\t\t\tfBoxPrc\n\t\t\t);\n\n\t#if MICROPROFILE_COUNTER_HISTORY\n\t\tif(0 != (S.CounterInfo[i].nFlags & MICROPROFILE_COUNTER_FLAG_DETAILED))\n\t\t{\n\t\t\tuint32_t nBaseIndex = S.nCounterHistoryPut;\n\t\t\tfor(uint32_t j = 0; j < MICROPROFILE_GRAPH_HISTORY; ++j)\n\t\t\t{\n\t\t\t\tuint32_t nHistoryIndex = (nBaseIndex + j) % MICROPROFILE_GRAPH_HISTORY;\n\t\t\t\tint64_t nValue = MicroProfileClamp(S.nCounterHistory[nHistoryIndex][i], nCounterMin, nCounterMax);\n\t\t\t\tMicroProfilePrintUIntComma(CB, Handle, nValue - nCounterMin);\n\t\t\t}\n\t\t}\n\t#endif\n\n\t\tMicroProfilePrintString(CB, Handle, \"]),\\n\");\n\t}\n\tMicroProfilePrintString(CB, Handle, \"];\\n\\n\");\n\n\n\tuint32_t nNumFrames = (MICROPROFILE_MAX_FRAME_HISTORY - MICROPROFILE_GPU_FRAME_DELAY - 3); //leave a few to not overwrite\n\tnNumFrames = MicroProfileMin(nNumFrames, (uint32_t)nMaxFrames);\n\n\n\tuint32_t nFirstFrame = (S.nFrameCurrent + MICROPROFILE_MAX_FRAME_HISTORY - nNumFrames) % MICROPROFILE_MAX_FRAME_HISTORY;\n\tuint32_t nLastFrame = (nFirstFrame + nNumFrames) % MICROPROFILE_MAX_FRAME_HISTORY;\n\tMP_ASSERT(nLastFrame == (S.nFrameCurrent % MICROPROFILE_MAX_FRAME_HISTORY));\n\tMP_ASSERT(nFirstFrame < MICROPROFILE_MAX_FRAME_HISTORY);\n\tMP_ASSERT(nLastFrame  < MICROPROFILE_MAX_FRAME_HISTORY);\n\tconst int64_t nTickStart = S.Frames[nFirstFrame].nFrameStartCpu;\n\tconst int64_t nTickEnd = S.Frames[nLastFrame].nFrameStartCpu;\n\tint64_t nTickStartGpu = S.Frames[nFirstFrame].nFrameStartGpu;\n\n\tint64_t nTicksPerSecondCpu = MicroProfileTicksPerSecondCpu();\n\tint64_t nTicksPerSecondGpu = MicroProfileTicksPerSecondGpu();\n\n\tint64_t nTickReferenceCpu = 0, nTickReferenceGpu = 0;\n\t// Can't just call GetGpuTickReference off main thread...\n\tif(0 && MicroProfileGetGpuTickReference(&nTickReferenceCpu, &nTickReferenceGpu))\n\t{\n\t\tnTickStartGpu = (nTickStart - nTickReferenceCpu) * (double(nTicksPerSecondGpu) / double(nTicksPerSecondCpu)) + nTickReferenceGpu;\n\t}\n\n#if MICROPROFILE_DEBUG\n\tprintf(\"dumping %d frames\\n\", nNumFrames);\n\tprintf(\"dumping frame %d to %d\\n\", nFirstFrame, nLastFrame);\n#endif\n\n\n\tuint32_t* nTimerCounter = (uint32_t*)alloca(sizeof(uint32_t)* S.nTotalTimers);\n\tmemset(nTimerCounter, 0, sizeof(uint32_t) * S.nTotalTimers);\n\n\tMicroProfilePrintf(CB, Handle, \"var Frames = Array(%d);\\n\", nNumFrames);\n\tfor(uint32_t i = 0; i < nNumFrames; ++i)\n\t{\n\t\tuint32_t nFrameIndex = (nFirstFrame + i) % MICROPROFILE_MAX_FRAME_HISTORY;\n\t\tuint32_t nFrameIndexNext = (nFrameIndex + 1) % MICROPROFILE_MAX_FRAME_HISTORY;\n\n\t\tMicroProfilePrintf(CB, Handle, \"var tt%d = [\\n\", i);\n\t\tfor(uint32_t j = 0; j < S.nNumLogs; ++j)\n\t\t{\n\t\t\tMicroProfileThreadLog* pLog = S.Pool[j];\n\t\t\tuint32_t nLogStart = S.Frames[nFrameIndex].nLogStart[j];\n\t\t\tuint32_t nLogEnd = S.Frames[nFrameIndexNext].nLogStart[j];\n\n\t\t\tMicroProfilePrintString(CB, Handle, \"[\");\n\t\t\tfor(uint32_t k = nLogStart; k != nLogEnd; k = (k+1) % MICROPROFILE_BUFFER_SIZE)\n\t\t\t{\n\t\t\t\tuint32_t nLogType = MicroProfileLogType(pLog->Log[k]);\n\t\t\t\tif(nLogType == MP_LOG_META)\n\t\t\t\t{\n\t\t\t\t\t//for meta, store the count + 8, which is the tick part\n\t\t\t\t\tnLogType = 8 + MicroProfileLogGetTick(pLog->Log[k]);\n\t\t\t\t}\n\t\t\t\tMicroProfilePrintUIntComma(CB, Handle, nLogType);\n\t\t\t}\n\t\t\tMicroProfilePrintString(CB, Handle, \"],\\n\");\n\t\t}\n\t\tMicroProfilePrintString(CB, Handle, \"];\\n\");\n\n\t\tMicroProfilePrintf(CB, Handle, \"var ts%d = [\\n\", i);\n\t\tfor(uint32_t j = 0; j < S.nNumLogs; ++j)\n\t\t{\n\t\t\tMicroProfileThreadLog* pLog = S.Pool[j];\n\t\t\tuint32_t nLogStart = S.Frames[nFrameIndex].nLogStart[j];\n\t\t\tuint32_t nLogEnd = S.Frames[nFrameIndexNext].nLogStart[j];\n\n\t\t\tint64_t nStartTick = pLog->nGpu ? nTickStartGpu : nTickStart;\n\t\t\tfloat fToMs = pLog->nGpu ? fToMsGPU : fToMsCPU;\n\n\t\t\tif(pLog->nGpu)\n\t\t\t\tMicroProfilePrintf(CB, Handle, \"MakeTimesExtra(%e,%e,tt%d[%d],[\", fToMs, fToMsCPU, i, j);\n\t\t\telse\n\t\t\t\tMicroProfilePrintf(CB, Handle, \"MakeTimes(%e,[\", fToMs);\n\t\t\tfor(uint32_t k = nLogStart; k != nLogEnd; k = (k+1) % MICROPROFILE_BUFFER_SIZE)\n\t\t\t{\n\t\t\t\tuint32_t nLogType = MicroProfileLogType(pLog->Log[k]);\n\t\t\t\tuint64_t nTick =\n\t\t\t\t\t(nLogType == MP_LOG_ENTER || nLogType == MP_LOG_LEAVE)\n\t\t\t\t\t? MicroProfileLogTickDifference(nStartTick, pLog->Log[k])\n\t\t\t\t\t: (nLogType == MP_LOG_GPU_EXTRA)\n\t\t\t\t\t? MicroProfileLogTickDifference(nTickStart, pLog->Log[k])\n\t\t\t\t\t: 0;\n\t\t\t\tMicroProfilePrintUIntComma(CB, Handle, nTick);\n\t\t\t}\n\t\t\tMicroProfilePrintString(CB, Handle, \"]),\\n\");\n\t\t}\n\t\tMicroProfilePrintString(CB, Handle, \"];\\n\");\n\n\t\tMicroProfilePrintf(CB, Handle, \"var ti%d = [\\n\", i);\n\t\tfor(uint32_t j = 0; j < S.nNumLogs; ++j)\n\t\t{\n\t\t\tMicroProfileThreadLog* pLog = S.Pool[j];\n\t\t\tuint32_t nLogStart = S.Frames[nFrameIndex].nLogStart[j];\n\t\t\tuint32_t nLogEnd = S.Frames[nFrameIndexNext].nLogStart[j];\n\n\t\t\tuint32_t nLabelIndex = 0;\n\t\t\tMicroProfilePrintString(CB, Handle, \"[\");\n\t\t\tfor(uint32_t k = nLogStart; k != nLogEnd; k = (k+1) % MICROPROFILE_BUFFER_SIZE)\n\t\t\t{\n\t\t\t\tuint32_t nLogType = MicroProfileLogType(pLog->Log[k]);\n\t\t\t\tuint32_t nTimerIndex = (uint32_t)MicroProfileLogTimerIndex(pLog->Log[k]);\n\t\t\t\tuint32_t nIndex = (nLogType == MP_LOG_LABEL) ? nLabelIndex++ : nTimerIndex;\n\t\t\t\tMicroProfilePrintUIntComma(CB, Handle, nIndex);\n\n\t\t\t\tif(nLogType == MP_LOG_ENTER)\n\t\t\t\t\tnTimerCounter[nTimerIndex]++;\n\t\t\t}\n\t\t\tMicroProfilePrintString(CB, Handle, \"],\\n\");\n\t\t}\n\t\tMicroProfilePrintString(CB, Handle, \"];\\n\");\n\n\t\tMicroProfilePrintf(CB, Handle, \"var tl%d = [\\n\", i);\n\t\tfor(uint32_t j = 0; j < S.nNumLogs; ++j)\n\t\t{\n\t\t\tMicroProfileThreadLog* pLog = S.Pool[j];\n\t\t\tuint32_t nLogStart = S.Frames[nFrameIndex].nLogStart[j];\n\t\t\tuint32_t nLogEnd = S.Frames[nFrameIndexNext].nLogStart[j];\n\n\t\t\tMicroProfilePrintString(CB, Handle, \"[\");\n\t\t\tfor(uint32_t k = nLogStart; k != nLogEnd; k = (k+1) % MICROPROFILE_BUFFER_SIZE)\n\t\t\t{\n\t\t\t\tuint32_t nLogType = MicroProfileLogType(pLog->Log[k]);\n\t\t\t\tif(nLogType == MP_LOG_LABEL)\n\t\t\t\t{\n\t\t\t\t\tuint64_t nLabel = MicroProfileLogGetTick(pLog->Log[k]);\n\t\t\t\t\tconst char* pLabelName = MicroProfileGetLabel(nLabel);\n\n\t\t\t\t\tif(pLabelName)\n\t\t\t\t\t{\n\t\t\t\t\t\tMicroProfilePrintString(CB, Handle, \"\\\"\");\n\t\t\t\t\t\tMicroProfilePrintString(CB, Handle, pLabelName);\n\t\t\t\t\t\tMicroProfilePrintString(CB, Handle, \"\\\",\");\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tMicroProfilePrintString(CB, Handle, \"null,\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tMicroProfilePrintString(CB, Handle, \"],\\n\");\n\t\t}\n\t\tMicroProfilePrintString(CB, Handle, \"];\\n\");\n\n\t\tint64_t nFrameStart = S.Frames[nFrameIndex].nFrameStartCpu;\n\t\tint64_t nFrameEnd = S.Frames[nFrameIndexNext].nFrameStartCpu;\n\t\tint64_t nFrameStartGpu = S.Frames[nFrameIndex].nFrameStartGpu;\n\t\tint64_t nFrameEndGpu = S.Frames[nFrameIndexNext].nFrameStartGpu;\n\n\t\tfloat fToMs = MicroProfileTickToMsMultiplier(nTicksPerSecondCpu);\n\t\tfloat fFrameMs = MicroProfileLogTickDifference(nTickStart, nFrameStart) * fToMs;\n\t\tfloat fFrameEndMs = MicroProfileLogTickDifference(nTickStart, nFrameEnd) * fToMs;\n\t\tfloat fFrameGpuMs = MicroProfileLogTickDifference(nTickStartGpu, nFrameStartGpu) * fToMsGPU;\n\t\tfloat fFrameGpuEndMs = MicroProfileLogTickDifference(nTickStartGpu, nFrameEndGpu) * fToMsGPU;\n\n\t\tMicroProfilePrintf(CB, Handle, \"Frames[%d] = MakeFrame(%d, %f, %f, %f, %f, ts%d, tt%d, ti%d, tl%d);\\n\", i, 0, fFrameMs, fFrameEndMs, fFrameGpuMs, fFrameGpuEndMs, i, i, i, i);\n\t}\n\n\n\tuint32_t nContextSwitchStart = 0;\n\tuint32_t nContextSwitchEnd = 0;\n\tMicroProfileContextSwitchSearch(&nContextSwitchStart, &nContextSwitchEnd, nTickStart, nTickEnd);\n\n\tMicroProfilePrintString(CB, Handle, \"var CSwitchThreadInOutCpu = [\\n\");\n\tfor(uint32_t j = nContextSwitchStart; j != nContextSwitchEnd; j = (j+1) % MICROPROFILE_CONTEXT_SWITCH_BUFFER_SIZE)\n\t{\n\t\tMicroProfileContextSwitch CS = S.ContextSwitch[j];\n\t\tint nCpu = CS.nCpu;\n\t\tMicroProfilePrintUIntComma(CB, Handle, CS.nThreadIn);\n\t\tMicroProfilePrintUIntComma(CB, Handle, CS.nThreadOut);\n\t\tMicroProfilePrintUIntComma(CB, Handle, nCpu);\n\t}\n\tMicroProfilePrintString(CB, Handle, \"];\\n\");\n\n\tMicroProfilePrintString(CB, Handle, \"var CSwitchTime = [\\n\");\n\tfloat fToMsCpu = MicroProfileTickToMsMultiplier(MicroProfileTicksPerSecondCpu());\n\tfor(uint32_t j = nContextSwitchStart; j != nContextSwitchEnd; j = (j+1) % MICROPROFILE_CONTEXT_SWITCH_BUFFER_SIZE)\n\t{\n\t\tMicroProfileContextSwitch CS = S.ContextSwitch[j];\n\t\tfloat fTime = MicroProfileLogTickDifference(nTickStart, CS.nTicks) * fToMsCpu;\n\t\tMicroProfilePrintf(CB, Handle, \"%f,\", fTime);\n\t}\n\tMicroProfilePrintString(CB, Handle, \"];\\n\");\n\n\tMicroProfileThreadInfo Threads[MICROPROFILE_MAX_CONTEXT_SWITCH_THREADS];\n\tuint32_t nNumThreadsBase = 0;\n\tuint32_t nNumThreads = MicroProfileContextSwitchGatherThreads(nContextSwitchStart, nContextSwitchEnd, Threads, &nNumThreadsBase);\n\n\tMicroProfilePrintString(CB, Handle, \"var CSwitchThreads = {\");\n\n\tfor (uint32_t i = 0; i < nNumThreads; ++i)\n\t{\n\t\tchar Name[256];\n\t\tconst char* pProcessName = MicroProfileGetProcessName(Threads[i].nProcessId, Name, sizeof(Name));\n\n\t\tconst char* p1 = i < nNumThreadsBase ? S.Pool[i]->ThreadName : \"?\";\n\t\tconst char* p2 = pProcessName ? pProcessName : \"?\";\n\n\t\tMicroProfilePrintf(CB, Handle, \"%lld:{\\'tid\\':%lld,\\'pid\\':%lld,\\'t\\':\\'%s\\',\\'p\\':\\'%s\\'},\",\n\t\t\t(long long)Threads[i].nThreadId,\n\t\t\t(long long)Threads[i].nThreadId,\n\t\t\t(long long)Threads[i].nProcessId,\n\t\t\tp1, p2\n\t\t\t);\n\t}\n\n\tMicroProfilePrintString(CB, Handle, \"};\\n\");\n\n\tfor(size_t i = 0; i < g_MicroProfileHtml_end_count; ++i)\n\t{\n\t\tCB(Handle, g_MicroProfileHtml_end_sizes[i]-1, g_MicroProfileHtml_end[i]);\n\t}\n\n\tuint32_t* nGroupCounter = (uint32_t*)alloca(sizeof(uint32_t)* S.nGroupCount);\n\n\tmemset(nGroupCounter, 0, sizeof(uint32_t) * S.nGroupCount);\n\tfor(uint32_t i = 0; i < S.nTotalTimers; ++i)\n\t{\n\t\tuint32_t nGroupIndex = S.TimerInfo[i].nGroupIndex;\n\t\tnGroupCounter[nGroupIndex] += nTimerCounter[i];\n\t}\n\n\tuint32_t* nGroupCounterSort = (uint32_t*)alloca(sizeof(uint32_t)* S.nGroupCount);\n\tuint32_t* nTimerCounterSort = (uint32_t*)alloca(sizeof(uint32_t)* S.nTotalTimers);\n\tfor(uint32_t i = 0; i < S.nGroupCount; ++i)\n\t{\n\t\tnGroupCounterSort[i] = i;\n\t}\n\tfor(uint32_t i = 0; i < S.nTotalTimers; ++i)\n\t{\n\t\tnTimerCounterSort[i] = i;\n\t}\n\tstd::sort(nGroupCounterSort, nGroupCounterSort + S.nGroupCount, \n\t\t[nGroupCounter](const uint32_t l, const uint32_t r)\n\t\t{\n\t\t\treturn nGroupCounter[l] > nGroupCounter[r];\n\t\t}\n\t);\n\n\tstd::sort(nTimerCounterSort, nTimerCounterSort + S.nTotalTimers, \n\t\t[nTimerCounter](const uint32_t l, const uint32_t r)\n\t\t{\n\t\t\treturn nTimerCounter[l] > nTimerCounter[r];\n\t\t}\n\t);\n\n\tMicroProfilePrintf(CB, Handle, \"\\n<!--\\nMarker Per Group\\n\");\n\tfor(uint32_t i = 0; i < S.nGroupCount; ++i)\n\t{\n\t\tuint32_t idx = nGroupCounterSort[i];\n\t\tMicroProfilePrintf(CB, Handle, \"%8d:%s\\n\", nGroupCounter[idx], S.GroupInfo[idx].pName);\n\t}\n\tMicroProfilePrintf(CB, Handle, \"Marker Per Timer\\n\");\n\tfor(uint32_t i = 0; i < S.nTotalTimers; ++i)\n\t{\n\t\tuint32_t idx = nTimerCounterSort[i];\n\t\tMicroProfilePrintf(CB, Handle, \"%8d:%s(%s)\\n\", nTimerCounter[idx], S.TimerInfo[idx].pName, S.GroupInfo[S.TimerInfo[idx].nGroupIndex].pName);\n\t}\n\tMicroProfilePrintf(CB, Handle, \"\\n-->\\n\");\n\n\tS.nActiveGroup = nActiveGroup;\n\tS.nRunning = nRunning;\n\n#if MICROPROFILE_DEBUG\n\tint64_t nTicksEnd = MP_TICK();\n\tfloat fMs = fToMsCpu * (nTicksEnd - S.nPauseTicks);\n\tprintf(\"html dump took %6.2fms\\n\", fMs);\n#endif\n}\n#else\nvoid MicroProfileDumpHtml(MicroProfileWriteCallback CB, void* Handle, int nMaxFrames, const char* pHost)\n{\n\tMicroProfilePrintString(CB, Handle, \"HTML output is disabled because MICROPROFILE_EMBED_HTML is 0\\n\");\n}\n#endif\n\nvoid MicroProfileWriteFile(void* Handle, size_t nSize, const char* pData)\n{\n\tfwrite(pData, nSize, 1, (FILE*)Handle);\n}\n\nvoid MicroProfileDumpToFile()\n{\n\tstd::lock_guard<std::recursive_mutex> Lock(MicroProfileMutex());\n\n\tFILE* F = fopen(S.DumpPath, \"w\");\n\tif(F)\n\t{\n\t\tif(S.eDumpType == MicroProfileDumpTypeHtml)\n\t\t\tMicroProfileDumpHtml(MicroProfileWriteFile, F, S.nDumpFrames, 0);\n\t\telse if(S.eDumpType == MicroProfileDumpTypeCsv)\n\t\t\tMicroProfileDumpCsv(MicroProfileWriteFile, F, S.nDumpFrames);\n\n\t\tfclose(F);\n\t}\n}\n\n#if MICROPROFILE_WEBSERVER\nuint32_t MicroProfileWebServerPort()\n{\n\treturn S.nWebServerPort;\n}\n\nvoid MicroProfileSendSocket(MpSocket Socket, const char* pData, size_t nSize)\n{\n#ifdef MSG_NOSIGNAL\n\tint nFlags = MSG_NOSIGNAL;\n#else\n\tint nFlags = 0;\n#endif\n\n\tsend(Socket, pData, (int)nSize, nFlags);\n}\n\nvoid MicroProfileFlushSocket(MpSocket Socket)\n{\n\tif(S.nWebServerPut)\n\t{\n\t\tMicroProfileSendSocket(Socket, &S.WebServerBuffer[0], S.nWebServerPut);\n\t\tS.nWebServerPut = 0;\n\t}\n}\n\nvoid MicroProfileWriteSocket(void* Handle, size_t nSize, const char* pData)\n{\n\tMpSocket Socket = *(MpSocket*)Handle;\n\tif(nSize > MICROPROFILE_WEBSERVER_SOCKET_BUFFER_SIZE / 2)\n\t{\n\t\tMicroProfileFlushSocket(Socket);\n\t\tMicroProfileSendSocket(Socket, pData, nSize);\n\t}\n\telse\n\t{\n\t\tmemcpy(&S.WebServerBuffer[S.nWebServerPut], pData, nSize);\n\t\tS.nWebServerPut += (uint32_t)nSize;\n\t\tif(S.nWebServerPut > MICROPROFILE_WEBSERVER_SOCKET_BUFFER_SIZE/2)\n\t\t{\n\t\t\tMicroProfileFlushSocket(Socket);\n\t\t}\n\t}\n\n\tS.nWebServerDataSent += nSize;\n}\n\n#if MICROPROFILE_MINIZ\n#ifndef MICROPROFILE_COMPRESS_BUFFER_SIZE\n#define MICROPROFILE_COMPRESS_BUFFER_SIZE (256<<10)\n#endif\n\n#define MICROPROFILE_COMPRESS_CHUNK (MICROPROFILE_COMPRESS_BUFFER_SIZE/2)\nstruct MicroProfileCompressedSocketState\n{\n\tunsigned char DeflateOut[MICROPROFILE_COMPRESS_CHUNK];\n\tunsigned char DeflateIn[MICROPROFILE_COMPRESS_CHUNK];\n\tmz_stream Stream;\n\tMpSocket Socket;\n\tuint32_t nSize;\n\tuint32_t nCompressedSize;\n\tuint32_t nFlushes;\n\tuint32_t nMemmoveBytes;\n};\n\nvoid MicroProfileCompressedSocketFlush(MicroProfileCompressedSocketState* pState)\n{\n\tmz_stream& Stream = pState->Stream;\n\tunsigned char* pSendStart = &pState->DeflateOut[0];\n\tunsigned char* pSendEnd = &pState->DeflateOut[MICROPROFILE_COMPRESS_CHUNK - Stream.avail_out];\n\tif(pSendStart != pSendEnd)\n\t{\n\t\tMicroProfileSendSocket(pState->Socket, (char*)pSendStart, pSendEnd - pSendStart);\n\t\tpState->nCompressedSize += pSendEnd - pSendStart;\n\t}\n\tStream.next_out = &pState->DeflateOut[0];\n\tStream.avail_out = MICROPROFILE_COMPRESS_CHUNK;\n\n}\nvoid MicroProfileCompressedSocketStart(MicroProfileCompressedSocketState* pState, MpSocket Socket)\n{\n\tmz_stream& Stream = pState->Stream;\n\tmemset(&Stream, 0, sizeof(Stream));\n\tStream.next_out = &pState->DeflateOut[0];\n\tStream.avail_out = MICROPROFILE_COMPRESS_CHUNK;\n\tStream.next_in = &pState->DeflateIn[0];\n\tStream.avail_in = 0;\n\tmz_deflateInit(&Stream, MZ_DEFAULT_COMPRESSION);\n\tpState->Socket = Socket;\n\tpState->nSize = 0;\n\tpState->nCompressedSize = 0;\n\tpState->nFlushes = 0;\n\tpState->nMemmoveBytes = 0;\n\n}\nvoid MicroProfileCompressedSocketFinish(MicroProfileCompressedSocketState* pState)\n{\n\tmz_stream& Stream = pState->Stream;\n\tMicroProfileCompressedSocketFlush(pState);\n\tint r = mz_deflate(&Stream, MZ_FINISH);\n\tMP_ASSERT(r == MZ_STREAM_END);\n\tMicroProfileCompressedSocketFlush(pState);\n\tr = mz_deflateEnd(&Stream);\n\tMP_ASSERT(r == MZ_OK);\n}\n\nvoid MicroProfileCompressedWriteSocket(void* Handle, size_t nSize, const char* pData)\n{\n\tMicroProfileCompressedSocketState* pState = (MicroProfileCompressedSocketState*)Handle;\n\tmz_stream& Stream = pState->Stream;\n\tconst unsigned char* pDeflateInEnd = Stream.next_in + Stream.avail_in;\n\tconst unsigned char* pDeflateInStart = &pState->DeflateIn[0];\n\tconst unsigned char* pDeflateInRealEnd = &pState->DeflateIn[MICROPROFILE_COMPRESS_CHUNK];\t\n\tpState->nSize += nSize;\n\tif(nSize <= pDeflateInRealEnd - pDeflateInEnd)\n\t{\n\t\tmemcpy((void*)pDeflateInEnd, pData, nSize);\n\t\tStream.avail_in += nSize;\n\t\tMP_ASSERT(Stream.next_in + Stream.avail_in <= pDeflateInRealEnd);\n\t\treturn;\n\t}\n\tint Flush = 0;\n\twhile(nSize)\n\t{\n\t\tpDeflateInEnd = Stream.next_in + Stream.avail_in;\n\t\tif(Flush)\n\t\t{\n\t\t\tpState->nFlushes++;\n\t\t\tMicroProfileCompressedSocketFlush(pState);\n\t\t\tpDeflateInRealEnd = &pState->DeflateIn[MICROPROFILE_COMPRESS_CHUNK];\t\n\t\t\tif(pDeflateInEnd == pDeflateInRealEnd)\n\t\t\t{\n\t\t\t\tif(Stream.avail_in)\n\t\t\t\t{\n\t\t\t\t\tMP_ASSERT(pDeflateInStart != Stream.next_in);\n\t\t\t\t\tmemmove((void*)pDeflateInStart, Stream.next_in, Stream.avail_in);\n\t\t\t\t\tpState->nMemmoveBytes += Stream.avail_in;\n\t\t\t\t}\n\t\t\t\tStream.next_in = pDeflateInStart;\n\t\t\t\tpDeflateInEnd = Stream.next_in + Stream.avail_in;\n\t\t\t}\n\t\t}\n\t\tsize_t nSpace = pDeflateInRealEnd - pDeflateInEnd;\n\t\tsize_t nBytes = MicroProfileMin(nSpace, nSize);\n\t\tMP_ASSERT(nBytes + pDeflateInEnd <= pDeflateInRealEnd);\n\t\tmemcpy((void*)pDeflateInEnd, pData, nBytes); \n\t\tStream.avail_in += nBytes;\n\t\tnSize -= nBytes;\n\t\tpData += nBytes;\n\t\tint r = mz_deflate(&Stream, MZ_NO_FLUSH);\n\t\tFlush = r == MZ_BUF_ERROR || nBytes == 0 || Stream.avail_out == 0 ? 1 : 0;\n\t\tMP_ASSERT(r == MZ_BUF_ERROR || r == MZ_OK);\n\t\tif(r == MZ_BUF_ERROR)\n\t\t{\n\t\t\tr = mz_deflate(&Stream, MZ_SYNC_FLUSH);\n\t\t}\n\t}\n}\n#endif\n\nvoid* MicroProfileWebServerUpdate(void*);\nvoid MicroProfileWebServerUpdateStop();\n\nvoid MicroProfileWebServerHello(int nPort)\n{\n\tuint32_t nInterfaces = 0;\n\n\t// getifaddrs hangs on some versions of Android so disable IP address scanning\n#if (defined(__APPLE__) || defined(__linux__)) && !defined(__ANDROID__)\n\tstruct ifaddrs* ifal;\n\tif(getifaddrs(&ifal) == 0 && ifal)\n\t{\n\t\tfor(struct ifaddrs* ifa = ifal; ifa; ifa = ifa->ifa_next)\n\t\t{\n\t\t\tif(ifa->ifa_addr && ifa->ifa_addr->sa_family == AF_INET)\n\t\t\t{\n\t\t\t\tvoid* pAddress = &((struct sockaddr_in *)ifa->ifa_addr)->sin_addr;\n\t\t\t\tchar Ip[INET_ADDRSTRLEN];\n\t\t\t\tif(inet_ntop(AF_INET, pAddress, Ip, sizeof(Ip)))\n\t\t\t\t{\n\t\t\t\t\tMICROPROFILE_PRINTF(\"MicroProfile: Web server started on %s:%d\\n\", Ip, nPort);\n\t\t\t\t\tnInterfaces++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfreeifaddrs(ifal);\n\t}\n#endif\n\n\tif(nInterfaces == 0)\n\t{\n\t\tMICROPROFILE_PRINTF(\"MicroProfile: Web server started on port %d\\n\", nPort);\n\t}\n}\n\nvoid MicroProfileWebServerStart()\n{\n\tif(!S.WebServerThread)\n\t{\n\t\tMicroProfileThreadStart(&S.WebServerThread, MicroProfileWebServerUpdate);\n\t}\n}\n\nvoid MicroProfileWebServerStop()\n{\n\tif(S.WebServerThread)\n\t{\n\t\tMicroProfileWebServerUpdateStop();\n\t\tMicroProfileThreadJoin(&S.WebServerThread);\n\t}\n}\n\nconst char* MicroProfileParseHeader(char* pRequest, const char* pPrefix)\n{\n\tsize_t nRequestSize = strlen(pRequest);\n\tsize_t nPrefixSize = strlen(pPrefix);\n\n\tfor(uint32_t i = 0; i < nRequestSize; ++i)\n\t{\n\t\tif((i == 0 || pRequest[i-1] == '\\n') && strncmp(&pRequest[i], pPrefix, nPrefixSize) == 0)\n\t\t{\n\t\t\tchar* pResult = &pRequest[i + nPrefixSize];\n\t\t\tsize_t nResultSize = strcspn(pResult, \" \\r\\n\");\n\n\t\t\tpResult[nResultSize] = '\\0';\n\t\t\treturn pResult;\n\t\t}\n\t}\n\n\treturn 0;\n}\n\nint MicroProfileParseGet(const char* pGet)\n{\n\tconst char* pStart = pGet;\n\twhile(*pGet != '\\0')\n\t{\n\t\tif(*pGet < '0' || *pGet > '9')\n\t\t\treturn 0;\n\t\tpGet++;\n\t}\n\tint nFrames = atoi(pStart);\n\tif(nFrames)\n\t{\n\t\treturn nFrames;\n\t}\n\telse\n\t{\n\t\treturn MICROPROFILE_WEBSERVER_FRAMES;\n\t}\n}\n\nvoid MicroProfileWebServerHandleRequest(MpSocket Connection)\n{\n\tchar Request[8192];\n\tint nReceived = recv(Connection, Request, sizeof(Request)-1, 0);\n\tif(nReceived <= 0)\n\t\treturn;\n\tRequest[nReceived] = 0;\n\n\tstd::lock_guard<std::recursive_mutex> Lock(MicroProfileMutex());\n\n\tMICROPROFILE_SCOPE(g_MicroProfileWebServerUpdate);\n\n#if MICROPROFILE_MINIZ\n#define MICROPROFILE_HTML_HEADER \"HTTP/1.0 200 OK\\r\\nContent-Type: text/html\\r\\nContent-Encoding: deflate\\r\\nExpires: Tue, 01 Jan 2199 16:00:00 GMT\\r\\n\\r\\n\"\n#else\n#define MICROPROFILE_HTML_HEADER \"HTTP/1.0 200 OK\\r\\nContent-Type: text/html\\r\\nExpires: Tue, 01 Jan 2199 16:00:00 GMT\\r\\n\\r\\n\"\n#endif\n\n\tconst char* pUrl = MicroProfileParseHeader(Request, \"GET /\");\n\tif(!pUrl)\n\t\treturn;\n\n\tint nFrames = MicroProfileParseGet(pUrl);\n\tif(nFrames <= 0)\n\t\treturn;\n\n\tconst char* pHost = MicroProfileParseHeader(Request, \"Host: \");\n\n\tuint64_t nTickStart = MP_TICK();\n\tMicroProfileSendSocket(Connection, MICROPROFILE_HTML_HEADER, sizeof(MICROPROFILE_HTML_HEADER)-1);\n\tuint64_t nDataStart = S.nWebServerDataSent;\n\tS.nWebServerPut = 0;\n#if 0 == MICROPROFILE_MINIZ\n\tMicroProfileDumpHtml(MicroProfileWriteSocket, &Connection, nFrames, pHost);\n\tuint64_t nDataEnd = S.nWebServerDataSent;\n\tuint64_t nTickEnd = MP_TICK();\n\tuint64_t nDiff = (nTickEnd - nTickStart);\n\tfloat fMs = MicroProfileTickToMsMultiplier(MicroProfileTicksPerSecondCpu()) * nDiff;\n\tint nKb = ((nDataEnd-nDataStart)>>10) + 1;\n\tMicroProfilePrintf(MicroProfileWriteSocket, &Connection, \"\\n<!-- Sent %dkb in %.2fms-->\\n\\n\",nKb, fMs);\n\tMicroProfileFlushSocket(Connection);\n#else\n\tMicroProfileCompressedSocketState CompressState;\n\tMicroProfileCompressedSocketStart(&CompressState, Connection);\n\tMicroProfileDumpHtml(MicroProfileCompressedWriteSocket, &CompressState, nFrames, pHost);\n\tS.nWebServerDataSent += CompressState.nSize;\n\tuint64_t nDataEnd = S.nWebServerDataSent;\n\tuint64_t nTickEnd = MP_TICK();\n\tuint64_t nDiff = (nTickEnd - nTickStart);\n\tfloat fMs = MicroProfileTickToMsMultiplier(MicroProfileTicksPerSecondCpu()) * nDiff;\n\tint nKb = ((nDataEnd-nDataStart)>>10) + 1;\n\tint nCompressedKb = ((CompressState.nCompressedSize)>>10) + 1;\n\tMicroProfilePrintf(MicroProfileCompressedWriteSocket, &CompressState, \"\\n<!-- Sent %dkb(compressed %dkb) in %.2fms-->\\n\\n\", nKb, nCompressedKb, fMs);\n\tMicroProfileCompressedSocketFinish(&CompressState);\n\tMicroProfileFlushSocket(Connection);\n#endif\n}\n\nvoid MicroProfileWebServerCloseSocket(MpSocket Connection)\n{\n#ifdef _WIN32\n\tclosesocket(Connection);\n#else\n\tshutdown(Connection,SHUT_RDWR);\n\tclose(Connection);\n#endif\n}\n\nvoid* MicroProfileWebServerUpdate(void*)\n{\n#ifdef _WIN32\n\tWSADATA wsa;\n\tif(WSAStartup(MAKEWORD(2, 2), &wsa))\n\t\treturn 0;\n#endif\n\n\tS.WebServerSocket = socket(PF_INET, SOCK_STREAM, 6);\n\tMP_ASSERT(!MP_INVALID_SOCKET(S.WebServerSocket));\n\n\tuint32_t nPortBegin = MICROPROFILE_WEBSERVER_PORT;\n\tuint32_t nPortEnd = nPortBegin + 20;\n\n\tstruct sockaddr_in Addr; \n\tAddr.sin_family = AF_INET; \n\tAddr.sin_addr.s_addr = INADDR_ANY; \n\tfor(uint32_t nPort = nPortBegin; nPort < nPortEnd; ++nPort)\n\t{\n\t\tAddr.sin_port = htons(nPort);\n\t\tif(0 == ::bind(S.WebServerSocket, (sockaddr*)&Addr, sizeof(Addr)))\n\t\t{\n\t\t\tS.nWebServerPort = nPort;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif(S.nWebServerPort)\n\t{\n\t\tMicroProfileWebServerHello(S.nWebServerPort);\n\n\t\tlisten(S.WebServerSocket, 8);\n\n\t\tfor (;;)\n\t\t{\n\t\t\tMpSocket Connection = accept(S.WebServerSocket, 0, 0);\n\t\t\tif(MP_INVALID_SOCKET(Connection)) break;\n\n\t\t#ifdef SO_NOSIGPIPE\n\t\t\tint nConnectionOption = 1;\n\t\t\tsetsockopt(Connection, SOL_SOCKET, SO_NOSIGPIPE, &nConnectionOption, sizeof(nConnectionOption));\n\t\t#endif\n\n\t\t\tMicroProfileWebServerHandleRequest(Connection);\n\n\t\t\tMicroProfileWebServerCloseSocket(Connection);\n\t\t}\n\n\t\tS.nWebServerPort = 0;\n\t}\n\telse\n\t{\n\t\tMICROPROFILE_PRINTF(\"MicroProfile: Web server could not start: no free ports in range [%d..%d)\\n\", nPortBegin, nPortEnd);\n\t}\n\n#ifdef _WIN32\n\tWSACleanup();\n#endif\n\n\treturn 0;\n}\n\nvoid MicroProfileWebServerUpdateStop()\n{\n\tMicroProfileWebServerCloseSocket(S.WebServerSocket);\n}\n#else\nvoid MicroProfileWebServerStart()\n{\n}\n\nvoid MicroProfileWebServerStop()\n{\n}\n\nuint32_t MicroProfileWebServerPort()\n{\n\treturn 0;\n}\n#endif\n\n\n#if MICROPROFILE_CONTEXT_SWITCH_TRACE\n//functions that need to be implemented per platform.\nvoid* MicroProfileTraceThread(void* unused);\n\nvoid MicroProfileContextSwitchTraceStart()\n{\n\tif(!S.ContextSwitchThread)\n\t{\n\t\tMicroProfileThreadStart(&S.ContextSwitchThread, MicroProfileTraceThread);\n\t}\n}\n\nvoid MicroProfileContextSwitchTraceStop()\n{\n\tif(S.ContextSwitchThread)\n\t{\n\t\tS.bContextSwitchStop = true;\n\t\tMicroProfileThreadJoin(&S.ContextSwitchThread);\n\t\tS.bContextSwitchStop = false;\n\t}\n}\n\nvoid MicroProfileContextSwitchSearch(uint32_t* pContextSwitchStart, uint32_t* pContextSwitchEnd, uint64_t nBaseTicksCpu, uint64_t nBaseTicksEndCpu)\n{\n\tMICROPROFILE_SCOPE(g_MicroProfileContextSwitchSearch);\n\tuint32_t nContextSwitchPut = S.nContextSwitchPut;\n\tuint64_t nContextSwitchStart, nContextSwitchEnd;\n\tnContextSwitchStart = nContextSwitchEnd = (nContextSwitchPut + MICROPROFILE_CONTEXT_SWITCH_BUFFER_SIZE - 1) % MICROPROFILE_CONTEXT_SWITCH_BUFFER_SIZE;\t\t\n\tint64_t nSearchEnd = nBaseTicksEndCpu + MicroProfileMsToTick(30.f, MicroProfileTicksPerSecondCpu());\n\tint64_t nSearchBegin = nBaseTicksCpu - MicroProfileMsToTick(30.f, MicroProfileTicksPerSecondCpu());\n\tfor(uint32_t i = 0; i < MICROPROFILE_CONTEXT_SWITCH_BUFFER_SIZE; ++i)\n\t{\n\t\tuint32_t nIndex = (nContextSwitchPut + MICROPROFILE_CONTEXT_SWITCH_BUFFER_SIZE - (i+1)) % MICROPROFILE_CONTEXT_SWITCH_BUFFER_SIZE;\n\t\tMicroProfileContextSwitch& CS = S.ContextSwitch[nIndex];\n\t\tif(CS.nTicks > nSearchEnd)\n\t\t{\n\t\t\tnContextSwitchEnd = nIndex;\n\t\t}\n\t\tif(CS.nTicks > nSearchBegin)\n\t\t{\n\t\t\tnContextSwitchStart = nIndex;\n\t\t}\n\t}\n\t*pContextSwitchStart = nContextSwitchStart;\n\t*pContextSwitchEnd = nContextSwitchEnd;\n}\n\nuint32_t MicroProfileContextSwitchGatherThreads(uint32_t nContextSwitchStart, uint32_t nContextSwitchEnd, MicroProfileThreadInfo* Threads, uint32_t* nNumThreadsBase)\n{\n\tMicroProfileProcessIdType nCurrentProcessId = MP_GETCURRENTPROCESSID();\n\n\tuint32_t nNumThreads = 0;\n\tfor(uint32_t i = 0; i < MICROPROFILE_MAX_THREADS && S.Pool[i]; ++i)\n\t{\n\t\tThreads[nNumThreads].nProcessId = nCurrentProcessId;\n\t\tThreads[nNumThreads].nThreadId = S.Pool[i]->nThreadId;\n\t\tnNumThreads++;\n\t}\n\n\t*nNumThreadsBase = nNumThreads;\n\n\tfor(uint32_t i = nContextSwitchStart; i != nContextSwitchEnd; i = (i+1) % MICROPROFILE_CONTEXT_SWITCH_BUFFER_SIZE)\n\t{\n\t\tMicroProfileContextSwitch CS = S.ContextSwitch[i];\n\t\tMicroProfileThreadIdType nThreadId = CS.nThreadIn;\n\t\tif(nThreadId)\n\t\t{\n\t\t\tMicroProfileProcessIdType nProcessId = CS.nProcessIn;\n\n\t\t\tbool bSeen = false;\n\t\t\tfor(uint32_t j = 0; j < nNumThreads; ++j)\n\t\t\t{\n\t\t\t\tif(Threads[j].nThreadId == nThreadId && Threads[j].nProcessId == nProcessId)\n\t\t\t\t{\n\t\t\t\t\tbSeen = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(!bSeen)\n\t\t\t{\n\t\t\t\tThreads[nNumThreads].nProcessId = nProcessId;\n\t\t\t\tThreads[nNumThreads].nThreadId = nThreadId;\n\t\t\t\tnNumThreads++;\n\t\t\t}\n\t\t}\n\t\tif(nNumThreads == MICROPROFILE_MAX_CONTEXT_SWITCH_THREADS)\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn nNumThreads;\n}\n\n#if defined(_WIN32)\n#include <psapi.h>\n#pragma comment(lib, \"psapi.lib\")\n\nconst char* MicroProfileGetProcessName(MicroProfileProcessIdType nId, char* Buffer, uint32_t nSize)\n{\n\tif(HANDLE Handle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, nId))\n\t{\n\t\tDWORD nResult = GetModuleBaseNameA(Handle, nullptr, Buffer, nSize);\n\t\tCloseHandle(Handle);\n\n\t\treturn nResult ? Buffer : nullptr;\n\t}\n\treturn nullptr;\n}\n\nvoid* MicroProfileTraceThread(void* unused)\n{\n\twhile(!S.bContextSwitchStop)\n\t{\n\t\tFILE* pFile = fopen(\"\\\\\\\\.\\\\pipe\\\\microprofile-contextswitch\", \"rb\");\n\t\tif(!pFile)\n\t\t{\n\t\t\tSleep(1000);\n\t\t\tcontinue;\n\t\t}\n\n\t\tS.bContextSwitchRunning = true;\n\n\t\tMicroProfileContextSwitch Buffer[1024];\n\n\t\twhile(!ferror(pFile) && !S.bContextSwitchStop)\n\t\t{\n\t\t\tsize_t nCount = fread(Buffer, sizeof(MicroProfileContextSwitch), ARRAYSIZE(Buffer), pFile);\n\n\t\t\tfor(size_t i = 0; i < nCount; ++i)\n\t\t\t\tMicroProfileContextSwitchPut(&Buffer[i]);\n\t\t}\n\n\t\tfclose(pFile);\n\n\t\tS.bContextSwitchRunning = false;\n\t}\n\n\treturn 0;\n}\n#elif defined(__APPLE__)\n#include <sys/time.h>\n#include <libproc.h>\n\nconst char* MicroProfileGetProcessName(MicroProfileProcessIdType nId, char* Buffer, uint32_t nSize)\n{\n\tchar Path[PATH_MAX];\n\tif(proc_pidpath(nId, Path, sizeof(Path)) == 0)\n\t\treturn nullptr;\n\n\tchar* pSlash = strrchr(Path, '/');\n\tchar* pName = pSlash ? pSlash + 1 : Path;\n\n\tstrncpy(Buffer, pName, nSize-1);\n\tBuffer[nSize-1] = 0;\n\n\treturn Buffer;\n}\n\nvoid* MicroProfileTraceThread(void*)\n{\n\twhile(!S.bContextSwitchStop)\n\t{\n\t\tFILE* pFile = fopen(\"/tmp/microprofile-contextswitch\", \"r\");\n\t\tif(!pFile)\n\t\t{\n\t\t\tusleep(1000000);\n\t\t\tcontinue;\n\t\t}\n\n\t\tS.bContextSwitchRunning = true;\n\n\t\tchar* pLine = 0;\n\t\tsize_t cap = 0;\n\t\tsize_t len = 0;\n\n\t\tuint32_t nLastThread[MICROPROFILE_MAX_CONTEXT_SWITCH_THREADS] = {0};\n\n\t\twhile((len = getline(&pLine, &cap, pFile))>0 && !S.bContextSwitchStop)\n\t\t{\n\t\t\tif(strncmp(pLine, \"MPTD \", 5) != 0)\n\t\t\t\tcontinue;\n\n\t\t\tchar* pos = pLine + 4;\n\t\t\tuint32_t cpu = strtol(pos + 1, &pos, 16);\n\t\t\tuint32_t pid = strtol(pos + 1, &pos, 16);\n\t\t\tuint32_t tid = strtol(pos + 1, &pos, 16);\n\t\t\tint64_t timestamp = strtoll(pos + 1, &pos, 16);\n\n\t\t\tif(cpu < MICROPROFILE_MAX_CONTEXT_SWITCH_THREADS)\n\t\t\t{\n\t\t\t\tMicroProfileContextSwitch Switch;\n\n\t\t\t\tSwitch.nThreadOut = nLastThread[cpu];\n\t\t\t\tSwitch.nThreadIn = tid;\n\t\t\t\tSwitch.nProcessIn = pid;\n\t\t\t\tSwitch.nCpu = cpu;\n\t\t\t\tSwitch.nTicks = timestamp;\n\t\t\t\tMicroProfileContextSwitchPut(&Switch);\n\n\t\t\t\tnLastThread[cpu] = tid;\n\t\t\t}\n\t\t}\n\n\t\tfclose(pFile);\n\n\t\tS.bContextSwitchRunning = false;\n\t}\n\n\treturn 0;\n}\n#endif\n#else\nvoid MicroProfileContextSwitchTraceStart()\n{\n}\n\nvoid MicroProfileContextSwitchTraceStop()\n{\n}\n\nvoid MicroProfileContextSwitchSearch(uint32_t* pContextSwitchStart, uint32_t* pContextSwitchEnd, uint64_t nBaseTicksCpu, uint64_t nBaseTicksEndCpu)\n{\n\t(void)nBaseTicksCpu;\n\t(void)nBaseTicksEndCpu;\n\n\t*pContextSwitchStart = 0;\n\t*pContextSwitchEnd = 0;\n}\n\nuint32_t MicroProfileContextSwitchGatherThreads(uint32_t nContextSwitchStart, uint32_t nContextSwitchEnd, MicroProfileThreadInfo* Threads, uint32_t* nNumThreadsBase)\n{\n\t(void)nContextSwitchStart;\n\t(void)nContextSwitchEnd;\n\t(void)Threads;\n\n\t*nNumThreadsBase = 0;\n\treturn 0;\n}\n\nconst char* MicroProfileGetProcessName(MicroProfileProcessIdType nId, char* Buffer, uint32_t nSize)\n{\n\t(void)nId;\n\t(void)Buffer;\n\t(void)nSize;\n\n\treturn nullptr;\n}\n#endif\n\nvoid MicroProfileGpuShutdown()\n{\n\tif(!S.GPU.Shutdown)\n\t\treturn;\n\n\tS.GPU.Shutdown();\n\n\tmemset(&S.GPU, 0, sizeof(S.GPU));\n}\n\nuint32_t MicroProfileGpuFlip()\n{\n\tif(!S.GPU.Flip)\n\t\treturn (uint32_t)-1;\n\n\treturn S.GPU.Flip();\n}\n\nuint32_t MicroProfileGpuInsertTimer(void* pContext)\n{\n\tif(!S.GPU.InsertTimer)\n\t\treturn (uint32_t)-1;\n\n\treturn S.GPU.InsertTimer(pContext);\n}\n\nuint64_t MicroProfileGpuGetTimeStamp(uint32_t nIndex)\n{\n\tif(!S.GPU.GetTimeStamp)\n\t\treturn MICROPROFILE_INVALID_TICK;\n\n\tif(nIndex == (uint32_t)-1)\n\t\treturn MICROPROFILE_INVALID_TICK;\n\n\treturn S.GPU.GetTimeStamp(nIndex);\n}\n\nuint64_t MicroProfileTicksPerSecondGpu()\n{\n\tif (!S.GPU.GetTicksPerSecond)\n\t\treturn 1000000000ll;\n\n\treturn S.GPU.GetTicksPerSecond();\n}\n\nbool MicroProfileGetGpuTickReference(int64_t* pOutCpu, int64_t* pOutGpu)\n{\n\tif(!S.GPU.GetTickReference)\n\t\treturn false;\n\n\treturn S.GPU.GetTickReference(pOutCpu, pOutGpu);\n}\n\n#define MICROPROFILE_GPU_STATE_DECL(API) \\\n\tvoid MicroProfileGpuInitState##API(); \\\n\tMicroProfileGpuTimerState##API g_MicroProfileGPU_##API;\n\n#define MICROPROFILE_GPU_STATE_IMPL(API) \\\n\tvoid MicroProfileGpuInitState##API() \\\n\t{ \\\n\t\tMP_ASSERT(!S.GPU.Shutdown); \\\n\t\tmemset(&g_MicroProfileGPU_##API, 0, sizeof(g_MicroProfileGPU_##API)); \\\n\t\tS.GPU.Shutdown = MicroProfileGpuShutdown##API; \\\n\t\tS.GPU.Flip = MicroProfileGpuFlip##API; \\\n\t\tS.GPU.InsertTimer = MicroProfileGpuInsertTimer##API; \\\n\t\tS.GPU.GetTimeStamp = MicroProfileGpuGetTimeStamp##API; \\\n\t\tS.GPU.GetTicksPerSecond = MicroProfileTicksPerSecondGpu##API; \\\n\t\tS.GPU.GetTickReference = MicroProfileGetGpuTickReference##API; \\\n\t}\n\n#if MICROPROFILE_GPU_TIMERS_D3D11\n#ifndef D3D11_SDK_VERSION\n#include <d3d11.h>\n#endif\n\nstruct MicroProfileGpuTimerStateD3D11\n{\n\tID3D11DeviceContext* pDeviceContext;\n\tID3D11Query* pQueries[MICROPROFILE_GPU_MAX_QUERIES];\n\tID3D11Query* pRateQuery;\n\tID3D11Query* pSyncQuery;\n\n\tuint64_t nFrame;\n\tstd::atomic<uint32_t> nFramePut;\n\n\tuint32_t nSubmitted[MICROPROFILE_GPU_FRAMES];\n\tuint64_t nResults[MICROPROFILE_GPU_MAX_QUERIES];\n\n\tuint32_t nRateQueryIssue;\n\tuint64_t nQueryFrequency;\n};\n\nMICROPROFILE_GPU_STATE_DECL(D3D11)\n\nvoid MicroProfileGpuInitD3D11(ID3D11Device* pDevice)\n{\n\tMicroProfileGpuInitStateD3D11();\n\n\tMicroProfileGpuTimerStateD3D11& GPU = g_MicroProfileGPU_D3D11;\n\n\tpDevice->GetImmediateContext(&GPU.pDeviceContext);\n\n\tD3D11_QUERY_DESC Desc;\n\tDesc.MiscFlags = 0;\n\tDesc.Query = D3D11_QUERY_TIMESTAMP;\n\tfor(uint32_t i = 0; i < MICROPROFILE_GPU_MAX_QUERIES; ++i)\n\t{\n\t\tHRESULT hr = pDevice->CreateQuery(&Desc, &GPU.pQueries[i]);\n\t\tMP_ASSERT(hr == S_OK);\n\t}\n\n\tHRESULT hr = pDevice->CreateQuery(&Desc, &GPU.pSyncQuery);\n\tMP_ASSERT(hr == S_OK);\n\n\tDesc.Query = D3D11_QUERY_TIMESTAMP_DISJOINT;\n\thr = pDevice->CreateQuery(&Desc, &GPU.pRateQuery);\n\tMP_ASSERT(hr == S_OK);\n}\n\nvoid MicroProfileGpuShutdownD3D11()\n{\n\tMicroProfileGpuTimerStateD3D11& GPU = g_MicroProfileGPU_D3D11;\n\n\tfor(uint32_t i = 0; i < MICROPROFILE_GPU_MAX_QUERIES; ++i)\n\t{\n\t\tGPU.pQueries[i]->Release();\n\t\tGPU.pQueries[i] = 0;\n\t}\n\n\tGPU.pRateQuery->Release();\n\tGPU.pRateQuery = 0;\n\n\tGPU.pSyncQuery->Release();\n\tGPU.pSyncQuery = 0;\n\n\tGPU.pDeviceContext->Release();\n\tGPU.pDeviceContext = 0;\n}\n\nuint32_t MicroProfileGpuFlipD3D11()\n{\n\tMicroProfileGpuTimerStateD3D11& GPU = g_MicroProfileGPU_D3D11;\n\n\tif (!GPU.pDeviceContext) return (uint32_t)-1;\n\n\tuint32_t nFrameQueries = MICROPROFILE_GPU_MAX_QUERIES / MICROPROFILE_GPU_FRAMES;\n\n\t// Submit current frame\n\tuint32_t nFrameIndex = GPU.nFrame % MICROPROFILE_GPU_FRAMES;\n\tuint32_t nFramePut = MicroProfileMin(GPU.nFramePut.load(), nFrameQueries);\n\n\tGPU.nSubmitted[nFrameIndex] = nFramePut;\n\tGPU.nFramePut.store(0);\n\tGPU.nFrame++;\n\n\t// Fetch frame results\n\tif (GPU.nFrame >= MICROPROFILE_GPU_FRAMES)\n\t{\n\t\tuint64_t nPendingFrame = GPU.nFrame - MICROPROFILE_GPU_FRAMES;\n\t\tuint32_t nPendingFrameIndex = nPendingFrame % MICROPROFILE_GPU_FRAMES;\n\n\t\tfor(uint32_t i = 0; i < GPU.nSubmitted[nPendingFrameIndex]; ++i)\n\t\t{\n\t\t\tuint32_t nQueryIndex = nPendingFrameIndex * nFrameQueries + i;\n\t\t\tMP_ASSERT(nQueryIndex < MICROPROFILE_GPU_MAX_QUERIES);\n\n\t\t\tuint64_t nResult = 0;\n\n\t\t\tHRESULT hr;\n\t\t\tdo hr = GPU.pDeviceContext->GetData(GPU.pQueries[nQueryIndex], &nResult, sizeof(nResult), 0);\n\t\t\twhile(hr == S_FALSE);\n\n\t\t\tGPU.nResults[nQueryIndex] = (hr == S_OK) ? nResult : MICROPROFILE_INVALID_TICK;\n\t\t}\n\t}\n\n\t// Update timestamp frequency\n\tif(GPU.nRateQueryIssue == 0)\n\t{\n\t\tGPU.pDeviceContext->Begin(GPU.pRateQuery);\n\t\tGPU.nRateQueryIssue = 1;\n\t}\n\telse if(GPU.nRateQueryIssue == 1)\n\t{\n\t\tGPU.pDeviceContext->End(GPU.pRateQuery);\n\t\tGPU.nRateQueryIssue = 2;\n\t}\n\telse\n\t{\n\t\tD3D11_QUERY_DATA_TIMESTAMP_DISJOINT Result;\n\t\tif(S_OK == GPU.pDeviceContext->GetData(GPU.pRateQuery, &Result, sizeof(Result), D3D11_ASYNC_GETDATA_DONOTFLUSH))\n\t\t{\n\t\t\tGPU.nQueryFrequency = Result.Frequency;\n\t\t\tGPU.nRateQueryIssue = 0;\n\t\t}\n\t}\n\n\treturn MicroProfileGpuInsertTimer(0);\n}\n\nuint32_t MicroProfileGpuInsertTimerD3D11(void* pContext)\n{\n\tMicroProfileGpuTimerStateD3D11& GPU = g_MicroProfileGPU_D3D11;\n\n\tuint32_t nFrameQueries = MICROPROFILE_GPU_MAX_QUERIES / MICROPROFILE_GPU_FRAMES;\n\n\tuint32_t nIndex = GPU.nFramePut.fetch_add(1);\n\tif(nIndex >= nFrameQueries)\n\t\treturn (uint32_t)-1;\n\n\tuint32_t nQueryIndex = (GPU.nFrame % MICROPROFILE_GPU_FRAMES) * nFrameQueries + nIndex;\n\n\tGPU.pDeviceContext->End(GPU.pQueries[nQueryIndex]);\n\n\treturn nQueryIndex;\n}\n\nuint64_t MicroProfileGpuGetTimeStampD3D11(uint32_t nIndex)\n{\n\tMicroProfileGpuTimerStateD3D11& GPU = g_MicroProfileGPU_D3D11;\n\n\treturn GPU.nResults[nIndex];\n}\n\nuint64_t MicroProfileTicksPerSecondGpuD3D11()\n{\n\tMicroProfileGpuTimerStateD3D11& GPU = g_MicroProfileGPU_D3D11;\n\n\treturn GPU.nQueryFrequency ? GPU.nQueryFrequency : 1000000000ll;\n}\n\nbool MicroProfileGetGpuTickReferenceD3D11(int64_t* pOutCpu, int64_t* pOutGpu)\n{\n\tMicroProfileGpuTimerStateD3D11& GPU = g_MicroProfileGPU_D3D11;\n\n\tGPU.pDeviceContext->End(GPU.pSyncQuery);\n\n\tuint64_t nResult = 0;\n\n\tHRESULT hr;\n\tdo hr = GPU.pDeviceContext->GetData(GPU.pSyncQuery, &nResult, sizeof(nResult), 0);\n\twhile(hr == S_FALSE);\n\n\tif (hr != S_OK) return false;\n\n\t*pOutCpu = MP_TICK();\n\t*pOutGpu = nResult;\n\n\treturn true;\n}\n\nMICROPROFILE_GPU_STATE_IMPL(D3D11)\n#endif\n\n#if MICROPROFILE_GPU_TIMERS_D3D12\n#ifndef D3D12_MAJOR_VERSION\n#include <d3d12.h>\n#endif\n\nstruct MicroProfileGpuTimerStateD3D12\n{\n\tID3D12CommandQueue* pCommandQueue;\n\tID3D12QueryHeap* pHeap;\n\tID3D12Resource* pBuffer;\n\tID3D12GraphicsCommandList* pCommandLists[MICROPROFILE_GPU_FRAMES];\n\tID3D12CommandAllocator* pCommandAllocators[MICROPROFILE_GPU_FRAMES];\n\tID3D12Fence* pFence;\n\tvoid* pFenceEvent;\n\n\tuint64_t nFrame;\n\tstd::atomic<uint32_t> nFramePut;\n\n\tuint32_t nSubmitted[MICROPROFILE_GPU_FRAMES];\n\tuint64_t nResults[MICROPROFILE_GPU_MAX_QUERIES];\n\tuint64_t nQueryFrequency;\n};\n\nMICROPROFILE_GPU_STATE_DECL(D3D12)\n\nvoid MicroProfileGpuInitD3D12(ID3D12Device* pDevice, ID3D12CommandQueue* pCommandQueue)\n{\n\tMicroProfileGpuInitStateD3D12();\n\n\tMicroProfileGpuTimerStateD3D12& GPU = g_MicroProfileGPU_D3D12;\n\n\tGPU.pCommandQueue = pCommandQueue;\n\n\tHRESULT hr;\n\n\tD3D12_QUERY_HEAP_DESC HeapDesc;\n\tHeapDesc.Type = D3D12_QUERY_HEAP_TYPE_TIMESTAMP;\n\tHeapDesc.Count = MICROPROFILE_GPU_MAX_QUERIES;\n\tHeapDesc.NodeMask = 0;\n\n\tD3D12_HEAP_PROPERTIES HeapProperties;\n\tHeapProperties.Type = D3D12_HEAP_TYPE_READBACK;\n\tHeapProperties.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN;\n\tHeapProperties.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN;\n\tHeapProperties.CreationNodeMask = 1;\n\tHeapProperties.VisibleNodeMask = 1;\n\n\tD3D12_RESOURCE_DESC ResourceDesc;\n\tResourceDesc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER;\n\tResourceDesc.Alignment = 0;\n\tResourceDesc.Width = MICROPROFILE_GPU_MAX_QUERIES * sizeof(uint64_t);\n\tResourceDesc.Height = 1;\n\tResourceDesc.DepthOrArraySize = 1;\n\tResourceDesc.MipLevels = 1;\n\tResourceDesc.Format = DXGI_FORMAT_UNKNOWN;\n\tResourceDesc.SampleDesc.Count = 1;\n\tResourceDesc.SampleDesc.Quality = 0;\n\tResourceDesc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR;\n\tResourceDesc.Flags = D3D12_RESOURCE_FLAG_NONE;\n\n\thr = pDevice->CreateQueryHeap(&HeapDesc, IID_PPV_ARGS(&GPU.pHeap));\n\tMP_ASSERT(hr == S_OK);\n\thr = pDevice->CreateCommittedResource(&HeapProperties, D3D12_HEAP_FLAG_NONE, &ResourceDesc, D3D12_RESOURCE_STATE_COPY_DEST, nullptr, IID_PPV_ARGS(&GPU.pBuffer));\n\tMP_ASSERT(hr == S_OK);\n\thr = pDevice->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&GPU.pFence));\n\tMP_ASSERT(hr == S_OK);\n\tGPU.pFenceEvent = CreateEvent(nullptr, false, false, nullptr);\n\tMP_ASSERT(GPU.pFenceEvent != INVALID_HANDLE_VALUE);\n\n\tfor (uint32_t i = 0; i < MICROPROFILE_GPU_FRAMES; ++i)\n\t{\n\t\thr = pDevice->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT, IID_PPV_ARGS(&GPU.pCommandAllocators[i]));\n\t\tMP_ASSERT(hr == S_OK);\n\t\thr = pDevice->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, GPU.pCommandAllocators[i], nullptr, IID_PPV_ARGS(&GPU.pCommandLists[i]));\n\t\tMP_ASSERT(hr == S_OK);\n\t\thr = GPU.pCommandLists[i]->Close();\n\t\tMP_ASSERT(hr == S_OK);\n\t}\n\n\thr = pCommandQueue->GetTimestampFrequency(&GPU.nQueryFrequency);\n\tMP_ASSERT(hr == S_OK);\n}\n\nvoid MicroProfileGpuShutdownD3D12()\n{\n\tMicroProfileGpuTimerStateD3D12& GPU = g_MicroProfileGPU_D3D12;\n\n\tif(!GPU.pCommandQueue)\n\t\treturn;\n\n\tif (GPU.nFrame > 0)\n\t{\n\t\tGPU.pFence->SetEventOnCompletion(GPU.nFrame, GPU.pFenceEvent);\n\t\tWaitForSingleObject(GPU.pFenceEvent, INFINITE);\n\t}\n\n\tfor (uint32_t i = 0; i < MICROPROFILE_GPU_FRAMES; ++i)\n\t{\n\t\tGPU.pCommandLists[i]->Release();\n\t\tGPU.pCommandLists[i] = 0;\n\n\t\tGPU.pCommandAllocators[i]->Release();\n\t\tGPU.pCommandAllocators[i] = 0;\n\t}\n\n\tGPU.pHeap->Release();\n\tGPU.pHeap = 0;\n\n\tGPU.pBuffer->Release();\n\tGPU.pBuffer = 0;\n\n\tGPU.pFence->Release();\n\tGPU.pFence = 0;\n\n\tCloseHandle(GPU.pFenceEvent);\n\tGPU.pFenceEvent = 0;\n\n\tGPU.pCommandQueue = 0;\n}\n\nuint32_t MicroProfileGpuFlipD3D12()\n{\n\tMicroProfileGpuTimerStateD3D12& GPU = g_MicroProfileGPU_D3D12;\n\n\tuint32_t nFrameQueries = MICROPROFILE_GPU_MAX_QUERIES / MICROPROFILE_GPU_FRAMES;\n\n\t// Submit current frame\n\tuint32_t nFrameIndex = GPU.nFrame % MICROPROFILE_GPU_FRAMES;\n\tuint32_t nFrameStart = nFrameIndex * nFrameQueries;\n\n\tID3D12CommandAllocator* pCommandAllocator = GPU.pCommandAllocators[nFrameIndex];\n\tID3D12GraphicsCommandList* pCommandList = GPU.pCommandLists[nFrameIndex];\n\n\tpCommandAllocator->Reset();\n\tpCommandList->Reset(pCommandAllocator, nullptr);\n\n\tuint32_t nFrameTimeStamp = MicroProfileGpuInsertTimer(pCommandList);\n\n\tuint32_t nFramePut = MicroProfileMin(GPU.nFramePut.load(), nFrameQueries);\n\n\tif (nFramePut)\n\t\tpCommandList->ResolveQueryData(GPU.pHeap, D3D12_QUERY_TYPE_TIMESTAMP, nFrameStart, nFramePut, GPU.pBuffer, nFrameStart * sizeof(int64_t));\n\n\tpCommandList->Close();\n\n\tID3D12CommandList* pList = pCommandList;\n\tGPU.pCommandQueue->ExecuteCommandLists(1, &pList);\n\tGPU.pCommandQueue->Signal(GPU.pFence, GPU.nFrame + 1);\n\n\tGPU.nSubmitted[nFrameIndex] = nFramePut;\n\tGPU.nFramePut.store(0);\n\tGPU.nFrame++;\n\n\t// Fetch frame results\n\tif (GPU.nFrame >= MICROPROFILE_GPU_FRAMES)\n\t{\n\t\tuint64_t nPendingFrame = GPU.nFrame - MICROPROFILE_GPU_FRAMES;\n\t\tuint32_t nPendingFrameIndex = nPendingFrame % MICROPROFILE_GPU_FRAMES;\n\n\t\tGPU.pFence->SetEventOnCompletion(nPendingFrame + 1, GPU.pFenceEvent);\n\t\tWaitForSingleObject(GPU.pFenceEvent, INFINITE);\n\n\t\tuint32_t nPendingFrameStart = nPendingFrameIndex * nFrameQueries;\n\t\tuint32_t nPendingFrameCount = GPU.nSubmitted[nPendingFrameIndex];\n\n\t\tif (nPendingFrameCount)\n\t\t{\n\t\t\tvoid* pData = 0;\n\t\t\tD3D12_RANGE Range = { nPendingFrameStart * sizeof(uint64_t), (nPendingFrameStart + nPendingFrameCount) * sizeof(uint64_t) };\n\n\t\t\tHRESULT hr = GPU.pBuffer->Map(0, &Range, &pData);\n\t\t\tMP_ASSERT(hr == S_OK);\n\n\t\t\tmemcpy(&GPU.nResults[nPendingFrameStart], (uint64_t*)pData + nPendingFrameStart, nPendingFrameCount * sizeof(uint64_t));\n\n\t\t\tGPU.pBuffer->Unmap(0, 0);\n\t\t}\n\t}\n\n\treturn nFrameTimeStamp;\n}\n\nuint32_t MicroProfileGpuInsertTimerD3D12(void* pContext)\n{\n\tMicroProfileGpuTimerStateD3D12& GPU = g_MicroProfileGPU_D3D12;\n\n\tif (!pContext) return (uint32_t)-1;\n\n\tuint32_t nFrameQueries = MICROPROFILE_GPU_MAX_QUERIES / MICROPROFILE_GPU_FRAMES;\n\n\tuint32_t nIndex = GPU.nFramePut.fetch_add(1);\n\tif(nIndex >= nFrameQueries) return (uint32_t)-1;\n\n\tuint32_t nQueryIndex = (GPU.nFrame % MICROPROFILE_GPU_FRAMES) * nFrameQueries + nIndex;\n\n\t((ID3D12GraphicsCommandList*)pContext)->EndQuery(GPU.pHeap, D3D12_QUERY_TYPE_TIMESTAMP, nQueryIndex);\n\n\treturn nQueryIndex;\n}\n\nuint64_t MicroProfileGpuGetTimeStampD3D12(uint32_t nIndex)\n{\n\tMicroProfileGpuTimerStateD3D12& GPU = g_MicroProfileGPU_D3D12;\n\n\treturn GPU.nResults[nIndex];\n}\n\nuint64_t MicroProfileTicksPerSecondGpuD3D12()\n{\n\tMicroProfileGpuTimerStateD3D12& GPU = g_MicroProfileGPU_D3D12;\n\n\treturn GPU.nQueryFrequency ? GPU.nQueryFrequency : 1000000000ll;\n}\n\nbool MicroProfileGetGpuTickReferenceD3D12(int64_t* pOutCpu, int64_t* pOutGpu)\n{\n\tMicroProfileGpuTimerStateD3D12& GPU = g_MicroProfileGPU_D3D12;\n\n\treturn SUCCEEDED(GPU.pCommandQueue->GetClockCalibration((uint64_t*)pOutGpu, (uint64_t*)pOutCpu));\n}\n\nMICROPROFILE_GPU_STATE_IMPL(D3D12)\n#endif\n\n#if MICROPROFILE_GPU_TIMERS_GL\n#ifndef GL_TIMESTAMP\n#ifdef __APPLE__\n#include <OpenGL/gl3.h>\n#else\n#error You must include OpenGL headers for GPU timers to work\n#endif\n#endif\n\nstruct MicroProfileGpuTimerStateGL\n{\n\tint32_t nTimestampBits;\n\tuint32_t nQueries[MICROPROFILE_GPU_MAX_QUERIES];\n\n\tuint64_t nFrame;\n\tstd::atomic<uint32_t> nFramePut;\n\n\tuint64_t nTimerOffset[MICROPROFILE_GPU_FRAMES];\n\tuint32_t nSubmitted[MICROPROFILE_GPU_FRAMES];\n\tuint64_t nResults[MICROPROFILE_GPU_MAX_QUERIES];\n};\n\nMICROPROFILE_GPU_STATE_DECL(GL)\n\nvoid MicroProfileGpuInitGL()\n{\n\tMicroProfileGpuInitStateGL();\n\n\tMicroProfileGpuTimerStateGL& GPU = g_MicroProfileGPU_GL;\n\n\tglGetQueryiv(GL_TIMESTAMP, GL_QUERY_COUNTER_BITS, &GPU.nTimestampBits);\n\n#ifdef __APPLE__\n\t// OSX GL driver (incorrectly) issues GL_INVALID_ENUM when querying the timestamp bits\n\tglGetError();\n#endif\n\n\tglGenQueries(MICROPROFILE_GPU_MAX_QUERIES, &GPU.nQueries[0]);\n}\n\nvoid MicroProfileGpuShutdownGL()\n{\n\tMicroProfileGpuTimerStateGL& GPU = g_MicroProfileGPU_GL;\n\n\tglDeleteQueries(MICROPROFILE_GPU_MAX_QUERIES, &GPU.nQueries[0]);\n}\n\nuint32_t MicroProfileGpuFlipGL()\n{\n\tMicroProfileGpuTimerStateGL& GPU = g_MicroProfileGPU_GL;\n\n\tuint32_t nFrameQueries = MICROPROFILE_GPU_MAX_QUERIES / MICROPROFILE_GPU_FRAMES;\n\n\t// Submit current frame\n\tuint32_t nFrameIndex = GPU.nFrame % MICROPROFILE_GPU_FRAMES;\n\tuint32_t nFramePut = MicroProfileMin(GPU.nFramePut.load(), nFrameQueries);\n\n\tif(!GPU.nTimestampBits && nFramePut > 0)\n\t\tglEndQuery(GL_TIME_ELAPSED);\n\n\tGPU.nTimerOffset[nFrameIndex] = MP_TICK() * (double(MicroProfileTicksPerSecondGpu()) / double(MicroProfileTicksPerSecondCpu()));\n\tGPU.nSubmitted[nFrameIndex] = nFramePut;\n\tGPU.nFramePut.store(0);\n\tGPU.nFrame++;\n\n\t// Fetch frame results\n\tif (GPU.nFrame >= MICROPROFILE_GPU_FRAMES)\n\t{\n\t\tuint64_t nPendingFrame = GPU.nFrame - MICROPROFILE_GPU_FRAMES;\n\t\tuint32_t nPendingFrameIndex = nPendingFrame % MICROPROFILE_GPU_FRAMES;\n\t\tuint64_t nTimerOffset = GPU.nTimerOffset[nPendingFrameIndex];\n\n\t\tfor(uint32_t i = 0; i < GPU.nSubmitted[nPendingFrameIndex]; ++i)\n\t\t{\n\t\t\tuint32_t nQueryIndex = nPendingFrameIndex * nFrameQueries + i;\n\t\t\tMP_ASSERT(nQueryIndex < MICROPROFILE_GPU_MAX_QUERIES);\n\n\t\t\tuint64_t nResult = 0;\n\t\t\tglGetQueryObjectui64v(GPU.nQueries[nQueryIndex], GL_QUERY_RESULT, &nResult);\n\n\t\t\tif(GPU.nTimestampBits)\n\t\t\t{\n\t\t\t\tGPU.nResults[nQueryIndex] = nResult;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tGPU.nResults[nQueryIndex] = nTimerOffset;\n\t\t\t\tnTimerOffset += nResult;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn MicroProfileGpuInsertTimer(0);\n}\n\nuint32_t MicroProfileGpuInsertTimerGL(void* pContext)\n{\n\tMicroProfileGpuTimerStateGL& GPU = g_MicroProfileGPU_GL;\n\n\t(void)pContext;\n\n\tuint32_t nFrameQueries = MICROPROFILE_GPU_MAX_QUERIES / MICROPROFILE_GPU_FRAMES;\n\n\tuint32_t nIndex = GPU.nFramePut.fetch_add(1);\n\tif(nIndex >= nFrameQueries) return (uint32_t)-1;\n\n\tuint32_t nQueryIndex = (GPU.nFrame % MICROPROFILE_GPU_FRAMES) * nFrameQueries + nIndex;\n\n\tif(!GPU.nTimestampBits && nIndex > 0)\n\t\tglEndQuery(GL_TIME_ELAPSED);\n\n\tif(GPU.nTimestampBits)\n\t\tglQueryCounter(GPU.nQueries[nQueryIndex], GL_TIMESTAMP);\n\telse\n\t\tglBeginQuery(GL_TIME_ELAPSED, GPU.nQueries[nQueryIndex]);\n\n\treturn nQueryIndex;\n}\n\nuint64_t MicroProfileGpuGetTimeStampGL(uint32_t nIndex)\n{\n\tMicroProfileGpuTimerStateGL& GPU = g_MicroProfileGPU_GL;\n\n\treturn GPU.nResults[nIndex];\n}\n\nuint64_t MicroProfileTicksPerSecondGpuGL()\n{\n\treturn 1000000000ll;\n}\n\nbool MicroProfileGetGpuTickReferenceGL(int64_t* pOutCpu, int64_t* pOutGpu)\n{\n\tMicroProfileGpuTimerStateGL& GPU = g_MicroProfileGPU_GL;\n\n\tif(GPU.nTimestampBits)\n\t{\n\t\tint64_t nGpuTimeStamp = 0;\n\t\tglGetInteger64v(GL_TIMESTAMP, &nGpuTimeStamp);\n\n\t\tif(nGpuTimeStamp)\n\t\t{\n\t\t\t*pOutCpu = MP_TICK();\n\t\t\t*pOutGpu = nGpuTimeStamp;\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\telse\n\t{\n\t\t*pOutCpu = MP_TICK();\n\t\t*pOutGpu = MP_TICK() * (double(MicroProfileTicksPerSecondGpu()) / double(MicroProfileTicksPerSecondCpu()));\n\t\treturn true;\n\t}\n}\n\nMICROPROFILE_GPU_STATE_IMPL(GL)\n#endif\n\n#if MICROPROFILE_GPU_TIMERS_VK\n#ifndef VK_HEADER_VERSION\n#include <vulkan/vulkan.h>\n#endif\n\nstruct MicroProfileGpuTimerStateVK\n{\n\tVkDevice pDevice;\n\tVkQueue pQueue;\n\tVkQueryPool pQueryPool;\n\tVkCommandPool pCommandPool;\n\tVkCommandBuffer pCommandBuffers[MICROPROFILE_GPU_FRAMES];\n\tVkFence pFences[MICROPROFILE_GPU_FRAMES];\n\n\tVkCommandBuffer pReferenceCommandBuffer;\n\tuint32_t nReferenceQuery;\n\n\tuint64_t nFrame;\n\tstd::atomic<uint32_t> nFramePut;\n\n\tuint32_t nSubmitted[MICROPROFILE_GPU_FRAMES];\n\tuint64_t nResults[MICROPROFILE_GPU_MAX_QUERIES];\n\tuint64_t nQueryFrequency;\n};\n\nMICROPROFILE_GPU_STATE_DECL(VK)\n\nvoid MicroProfileGpuInitVK(VkDevice pDevice, VkPhysicalDevice pPhysicalDevice, VkQueue pQueue)\n{\n\tMicroProfileGpuInitStateVK();\n\n\tMicroProfileGpuTimerStateVK& GPU = g_MicroProfileGPU_VK;\n\n\tVkPhysicalDeviceProperties Properties;\n\tvkGetPhysicalDeviceProperties(pPhysicalDevice, &Properties);\n\n\tGPU.pDevice = pDevice;\n\tGPU.pQueue = pQueue;\n\n\tVkQueryPoolCreateInfo queryPoolInfo = {};\n\tqueryPoolInfo.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;\n\tqueryPoolInfo.queryType = VK_QUERY_TYPE_TIMESTAMP;\n\tqueryPoolInfo.queryCount = MICROPROFILE_GPU_MAX_QUERIES + 1; // reference query\n\n\tVkResult res = vkCreateQueryPool(pDevice, &queryPoolInfo, nullptr, &GPU.pQueryPool);\n\tMP_ASSERT(res == VK_SUCCESS);\n\n\tVkCommandPoolCreateInfo commandPoolInfo = {};\n\tcommandPoolInfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;\n\tcommandPoolInfo.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;\n\tcommandPoolInfo.queueFamilyIndex = 0;\n\n\tres = vkCreateCommandPool(pDevice, &commandPoolInfo, nullptr, &GPU.pCommandPool);\n\tMP_ASSERT(res == VK_SUCCESS);\n\n\tVkCommandBuffer pCommandBuffers[MICROPROFILE_GPU_FRAMES + 1] = {};\n\n\tVkCommandBufferAllocateInfo commandBufferInfo = {};\n\tcommandBufferInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;\n\tcommandBufferInfo.commandPool = GPU.pCommandPool;\n\tcommandBufferInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;\n\tcommandBufferInfo.commandBufferCount = sizeof(pCommandBuffers) / sizeof(pCommandBuffers[0]);\n\n\tres = vkAllocateCommandBuffers(pDevice, &commandBufferInfo, pCommandBuffers);\n\tMP_ASSERT(res == VK_SUCCESS);\n\n\tVkFenceCreateInfo fenceInfo = {};\n\tfenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;\n\n\tfor (uint32_t i = 0; i < MICROPROFILE_GPU_FRAMES; ++i)\n\t{\n\t\tGPU.pCommandBuffers[i] = pCommandBuffers[i];\n\n\t\tres = vkCreateFence(pDevice, &fenceInfo, nullptr, &GPU.pFences[i]);\n\t\tMP_ASSERT(res == VK_SUCCESS);\n\t}\n\n\tGPU.pReferenceCommandBuffer = pCommandBuffers[MICROPROFILE_GPU_FRAMES];\n\tGPU.nReferenceQuery = MICROPROFILE_GPU_MAX_QUERIES; // reference query\n\n\tGPU.nQueryFrequency = 1e9 / Properties.limits.timestampPeriod;\n}\n\nvoid MicroProfileGpuShutdownVK()\n{\n\tMicroProfileGpuTimerStateVK& GPU = g_MicroProfileGPU_VK;\n\n\tif (GPU.nFrame > 0)\n\t{\n\t\tuint32_t nFrameIndex = (GPU.nFrame - 1) % MICROPROFILE_GPU_FRAMES;\n\n\t\tVkResult res = vkWaitForFences(GPU.pDevice, 1, &GPU.pFences[nFrameIndex], VK_TRUE, UINT64_MAX);\n\t\tMP_ASSERT(res == VK_SUCCESS);\n\t}\n\n\tfor (uint32_t i = 0; i < MICROPROFILE_GPU_FRAMES; ++i)\n\t{\n\t\tvkDestroyFence(GPU.pDevice, GPU.pFences[i], nullptr);\n\t\tGPU.pFences[i] = 0;\n\t}\n\n\tvkDestroyCommandPool(GPU.pDevice, GPU.pCommandPool, nullptr);\n\tmemset(GPU.pCommandBuffers, 0, sizeof(GPU.pCommandBuffers));\n\tGPU.pCommandPool = 0;\n\n\tvkDestroyQueryPool(GPU.pDevice, GPU.pQueryPool, nullptr);\n\tGPU.pQueryPool = 0;\n\n\tGPU.pQueue = 0;\n\tGPU.pDevice = 0;\n}\n\nuint32_t MicroProfileGpuFlipVK()\n{\n\tMicroProfileGpuTimerStateVK& GPU = g_MicroProfileGPU_VK;\n\n\tuint32_t nFrameQueries = MICROPROFILE_GPU_MAX_QUERIES / MICROPROFILE_GPU_FRAMES;\n\n\t// Submit current frame\n\tuint32_t nFrameIndex = GPU.nFrame % MICROPROFILE_GPU_FRAMES;\n\tuint32_t nFrameStart = nFrameIndex * nFrameQueries;\n\n\tVkCommandBuffer pCommandBuffer = GPU.pCommandBuffers[nFrameIndex];\n\n\tVkCommandBufferBeginInfo commandBufferBeginInfo = {};\n\tcommandBufferBeginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;\n\tcommandBufferBeginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;\n\n\tVkResult res = vkBeginCommandBuffer(pCommandBuffer, &commandBufferBeginInfo);\n\tMP_ASSERT(res == VK_SUCCESS);\n\n\tuint32_t nFrameTimeStamp = MicroProfileGpuInsertTimer(pCommandBuffer);\n\tuint32_t nFramePut = MicroProfileMin(GPU.nFramePut.load(), nFrameQueries);\n\n\tres = vkEndCommandBuffer(pCommandBuffer);\n\tMP_ASSERT(res == VK_SUCCESS);\n\n\tVkSubmitInfo submitInfo = {};\n\tsubmitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;\n\tsubmitInfo.commandBufferCount = 1;\n\tsubmitInfo.pCommandBuffers = &pCommandBuffer;\n\n\tres = vkQueueSubmit(GPU.pQueue, 1, &submitInfo, GPU.pFences[nFrameIndex]);\n\tMP_ASSERT(res == VK_SUCCESS);\n\n\tGPU.nSubmitted[nFrameIndex] = nFramePut;\n\tGPU.nFramePut.store(0);\n\tGPU.nFrame++;\n\n\t// Fetch frame results\n\tif (GPU.nFrame >= MICROPROFILE_GPU_FRAMES)\n\t{\n\t\tuint64_t nPendingFrame = GPU.nFrame - MICROPROFILE_GPU_FRAMES;\n\t\tuint32_t nPendingFrameIndex = nPendingFrame % MICROPROFILE_GPU_FRAMES;\n\n\t\tres = vkWaitForFences(GPU.pDevice, 1, &GPU.pFences[nPendingFrameIndex], VK_TRUE, UINT64_MAX);\n\t\tMP_ASSERT(res == VK_SUCCESS);\n\n\t\tres = vkResetFences(GPU.pDevice, 1, &GPU.pFences[nPendingFrameIndex]);\n\t\tMP_ASSERT(res == VK_SUCCESS);\n\n\t\tuint32_t nPendingFrameStart = nPendingFrameIndex * nFrameQueries;\n\t\tuint32_t nPendingFrameCount = GPU.nSubmitted[nPendingFrameIndex];\n\n\t\tif (nPendingFrameCount)\n\t\t{\n\t\t\tres = vkGetQueryPoolResults(GPU.pDevice, GPU.pQueryPool,\n\t\t\t\tnPendingFrameStart, nPendingFrameCount,\n\t\t\t\tnPendingFrameCount * sizeof(uint64_t), &GPU.nResults[nPendingFrameStart],\n\t\t\t\tsizeof(uint64_t), VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WAIT_BIT);\n\t\t\tMP_ASSERT(res == VK_SUCCESS);\n\t\t}\n\t}\n\n\treturn nFrameTimeStamp;\n}\n\nuint32_t MicroProfileGpuInsertTimerVK(void* pContext)\n{\n\tMicroProfileGpuTimerStateVK& GPU = g_MicroProfileGPU_VK;\n\n\tuint32_t nFrameQueries = MICROPROFILE_GPU_MAX_QUERIES / MICROPROFILE_GPU_FRAMES;\n\n\tuint32_t nIndex = GPU.nFramePut.fetch_add(1);\n\tif(nIndex >= nFrameQueries) return (uint32_t)-1;\n\n\tuint32_t nQueryIndex = (GPU.nFrame % MICROPROFILE_GPU_FRAMES) * nFrameQueries + nIndex;\n\n\tvkCmdWriteTimestamp((VkCommandBuffer)pContext, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, GPU.pQueryPool, nQueryIndex);\n\n\treturn nQueryIndex;\n}\n\nuint64_t MicroProfileGpuGetTimeStampVK(uint32_t nIndex)\n{\n\tMicroProfileGpuTimerStateVK& GPU = g_MicroProfileGPU_VK;\n\n\treturn GPU.nResults[nIndex];\n}\n\nuint64_t MicroProfileTicksPerSecondGpuVK()\n{\n\tMicroProfileGpuTimerStateVK& GPU = g_MicroProfileGPU_VK;\n\n\treturn GPU.nQueryFrequency ? GPU.nQueryFrequency : 1000000000ll;\n}\n\nbool MicroProfileGetGpuTickReferenceVK(int64_t* pOutCpu, int64_t* pOutGpu)\n{\n\tMicroProfileGpuTimerStateVK& GPU = g_MicroProfileGPU_VK;\n\n\tVkCommandBuffer pCommandBuffer = GPU.pReferenceCommandBuffer;\n\tuint32_t nQueryIndex = GPU.nReferenceQuery;\n\n\tVkCommandBufferBeginInfo commandBufferBeginInfo = {};\n\tcommandBufferBeginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;\n\tcommandBufferBeginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;\n\n\tVkResult res = vkBeginCommandBuffer(pCommandBuffer, &commandBufferBeginInfo);\n\tMP_ASSERT(res == VK_SUCCESS);\n\n\tvkCmdWriteTimestamp(pCommandBuffer, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, GPU.pQueryPool, nQueryIndex);\n\n\tres = vkEndCommandBuffer(pCommandBuffer);\n\tMP_ASSERT(res == VK_SUCCESS);\n\n\tVkSubmitInfo submitInfo = {};\n\tsubmitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;\n\tsubmitInfo.commandBufferCount = 1;\n\tsubmitInfo.pCommandBuffers = &pCommandBuffer;\n\n\tres = vkQueueSubmit(GPU.pQueue, 1, &submitInfo, VK_NULL_HANDLE);\n\tMP_ASSERT(res == VK_SUCCESS);\n\n\tres = vkQueueWaitIdle(GPU.pQueue);\n\tMP_ASSERT(res == VK_SUCCESS);\n\n\t*pOutCpu = MP_TICK();\n\n\tres = vkGetQueryPoolResults(GPU.pDevice, GPU.pQueryPool, nQueryIndex, 1, sizeof(uint64_t), pOutGpu, sizeof(uint64_t), VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WAIT_BIT);\n\tMP_ASSERT(res == VK_SUCCESS);\n\n\treturn true;\n}\n\nMICROPROFILE_GPU_STATE_IMPL(VK)\n#endif\n\n#undef S\n\n#ifdef _WIN32\n#pragma warning(pop)\n#endif\n\n#if MICROPROFILE_EMBED_HTML\n#include \"microprofilehtml.h\"\n#endif //MICROPROFILE_EMBED_HTML\n\n#endif\n#endif\n"
  },
  {
    "path": "third_party/microprofile/microprofiledraw.h",
    "content": "// This is free and unencumbered software released into the public domain.\n// Anyone is free to copy, modify, publish, use, compile, sell, or\n// distribute this software, either in source code form or as a compiled\n// binary, for any purpose, commercial or non-commercial, and by any\n// means.\n// In jurisdictions that recognize copyright laws, the author or authors\n// of this software dedicate any and all copyright interest in the\n// software to the public domain. We make this dedication for the benefit\n// of the public at large and to the detriment of our heirs and\n// successors. We intend this dedication to be an overt act of\n// relinquishment in perpetuity of all present and future rights to this\n// software under copyright law.\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n// IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR\n// OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\n// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n// OTHER DEALINGS IN THE SOFTWARE.\n// For more information, please refer to <http://unlicense.org/>\n\n#ifndef MICROPROFILE_ENABLED\n#error \"microprofile.h must be included before including microprofiledraw.h\"\n#endif\n\n#ifndef MICROPROFILEDRAW_ENABLED\n#define MICROPROFILEDRAW_ENABLED MICROPROFILE_ENABLED\n#endif\n\n#ifndef MICROPROFILEDRAW_API\n#define MICROPROFILEDRAW_API\n#endif\n\n#if MICROPROFILEDRAW_ENABLED\nMICROPROFILEDRAW_API void MicroProfileDrawInitGL();\n\nMICROPROFILEDRAW_API void MicroProfileRender(uint32_t nWidth, uint32_t nHeight, float fScale);\n\nMICROPROFILEDRAW_API void MicroProfileBeginDraw(uint32_t nWidth, uint32_t nHeight, float* pfProjection);\nMICROPROFILEDRAW_API void MicroProfileBeginDraw(uint32_t nWidth, uint32_t nHeight, float fScale);\nMICROPROFILEDRAW_API void MicroProfileEndDraw();\n\n#ifdef MICROPROFILEDRAW_IMPL\nstruct MicroProfileDrawVertex\n{\n\tfloat nX;\n\tfloat nY;\n\tuint32_t nColor;\n\tfloat fU;\n\tfloat fV;\n};\n\nstruct MicroProfileDrawCommand\n{\n\tuint32_t nCommand;\n\tuint32_t nNumVertices;\n};\n\nstruct MicroProfileDrawContext\n{\n\tenum\n\t{\n\t\tMAX_COMMANDS = 32,\n\t\tMAX_VERTICES = 16384,\n\t};\n\n\tbool bInitialized;\n\n\tGLuint nVAO;\n\tGLuint nVertexBuffer;\n\tGLuint nProgram;\n\tGLuint nTexture;\n\n\tint nAttributePosition;\n\tint nAttributeColor;\n\tint nAttributeTexture;\n\tint nUniformProjectionMatrix;\n\n\tuint32_t nVertexPos;\n\tuint32_t nCommandPos;\n\n\tMicroProfileDrawVertex nVertices[MAX_VERTICES];\n\tMicroProfileDrawCommand nCommands[MAX_COMMANDS];\n};\n\nMicroProfileDrawContext g_MicroProfileDraw;\n\n#define Q0(d, member, v) d[0].member = v\n#define Q1(d, member, v) d[1].member = v; d[3].member = v\n#define Q2(d, member, v) d[4].member = v\n#define Q3(d, member, v) d[2].member = v; d[5].member = v\n\n#define FONT_TEX_X 1024\n#define FONT_TEX_Y 9\n#define FONT_SIZE (FONT_TEX_X*FONT_TEX_Y * 4)\n\nnamespace\n{\n\textern const uint8_t g_MicroProfileFont[];\n\textern const uint16_t g_MicroProfileFontDescription[]; \n\n\textern const char g_MicroProfileVertexShader_110[];\n\textern const char g_MicroProfileFragmentShader_110[];\n\n\textern const char g_MicroProfileVertexShader_150[];\n\textern const char g_MicroProfileFragmentShader_150[];\n}\n\nbool MicroProfileCompileShader(GLuint* pnHandle, int nType, const char* pShader)\n{\n\t*pnHandle = glCreateShader(nType);\n\tglShaderSource(*pnHandle, 1, &pShader, 0);\n\tglCompileShader(*pnHandle);\n\n\tGLint compiled = 0;\n\tglGetShaderiv(*pnHandle, GL_COMPILE_STATUS, &compiled);\n\n\tif(!compiled)\n\t{\n\t\tchar temp[4096];\n\t\tglGetShaderInfoLog(*pnHandle, 4096, NULL, temp);\n\t\tprintf(\"SHADER FAILED TO COMPILE:\\n%s\\n\", temp);\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\nbool MicroProfileLinkProgram(GLuint* pnHandle, GLuint nVertexShader, GLuint nFragmentShader)\n{\n\t*pnHandle = glCreateProgram();\n\tglAttachShader(*pnHandle, nVertexShader);\n\tglAttachShader(*pnHandle, nFragmentShader);\n\tglLinkProgram(*pnHandle);\n\n\tGLint linked = 0;\n\tglGetProgramiv(*pnHandle, GL_LINK_STATUS, &linked);\n\n\tif(!linked)\n\t{\n\t\tchar temp[4096];\n\t\tglGetProgramInfoLog(*pnHandle, 4096, NULL, temp);\n\t\tprintf(\"PROGRAM FAILED TO LINK:\\n%s\\n\", temp);\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\nvoid MicroProfileDrawInitGL()\n{\n\tMicroProfileDrawContext& S = g_MicroProfileDraw;\n\n\tMP_ASSERT(!S.bInitialized);\n\n\tconst GLubyte* pGLVersion = glGetString(GL_VERSION);\n\tconst GLubyte* pGLSLVersion = glGetString(GL_SHADING_LANGUAGE_VERSION);\n\n\tint nGLVersion = (pGLVersion[0] - '0') * 10 + (pGLVersion[2] - '0');\n\tint nGLSLVersion = (pGLSLVersion[0] - '0') * 100 + (pGLSLVersion[2] - '0') * 10 + (pGLSLVersion[3] - '0');\n\n\tglGenBuffers(1, &S.nVertexBuffer);\n\tglBindBuffer(GL_ARRAY_BUFFER, S.nVertexBuffer);\n\tglBufferData(GL_ARRAY_BUFFER, sizeof(S.nVertices), 0, GL_STREAM_DRAW);\n\tglBindBuffer(GL_ARRAY_BUFFER, 0);\n\n\tif (nGLVersion >= 3)\n\t\tglGenVertexArrays(1, &S.nVAO);\n\telse\n\t\tS.nVAO = 0;\n\n\tGLuint nVertexShader;\n\tif(!MicroProfileCompileShader(&nVertexShader, GL_VERTEX_SHADER, nGLSLVersion >= 150 ? g_MicroProfileVertexShader_150 : g_MicroProfileVertexShader_110))\n\t\treturn;\n\n\tGLuint nFragmentShader;\n\tif(!MicroProfileCompileShader(&nFragmentShader, GL_FRAGMENT_SHADER, nGLSLVersion >= 150 ? g_MicroProfileFragmentShader_150 : g_MicroProfileFragmentShader_110))\n\t\treturn;\n\n\tif(!MicroProfileLinkProgram(&S.nProgram, nVertexShader, nFragmentShader))\n\t\treturn;\n\n\tS.nAttributePosition = glGetAttribLocation(S.nProgram, \"VertexIn\");\n\tS.nAttributeColor = glGetAttribLocation(S.nProgram, \"ColorIn\");\n\tS.nAttributeTexture = glGetAttribLocation(S.nProgram, \"TCIn\");\n\n\tS.nUniformProjectionMatrix = glGetUniformLocation(S.nProgram, \"ProjectionMatrix\");\n\n\tglUseProgram(S.nProgram);\n\tglUniform1i(glGetUniformLocation(S.nProgram, \"Texture\"), 0);\n\tglUniform1f(glGetUniformLocation(S.nProgram, \"RcpFontHeight\"), 1.f / FONT_TEX_Y);\n\tglUseProgram(0);\n\n\tuint32_t* pUnpacked = (uint32_t*)alloca(FONT_SIZE);\n\tint idx = 0;\n\tint end = FONT_TEX_X * FONT_TEX_Y / 8;\n\tfor(int i = 0; i < end; i++)\n\t{\n\t\tunsigned char pValue = g_MicroProfileFont[i];\n\t\tfor(int j = 0; j < 8; ++j)\n\t\t{\n\t\t\tpUnpacked[idx++] = pValue & 0x80 ? (uint32_t)-1 : 0;\n\t\t\tpValue <<= 1;\n\t\t}\n\t}\n\n\tpUnpacked[idx-1] = 0xffffffff;\n\n\tuint32_t* p4 = &pUnpacked[0];\n\tglGenTextures(1, &S.nTexture);\n\tglBindTexture(GL_TEXTURE_2D, S.nTexture);\n\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);\n\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);     \n\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);\n\tglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);\n\tglTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, FONT_TEX_X, FONT_TEX_Y, 0, GL_RGBA, GL_UNSIGNED_BYTE, &p4[0]);\n\tglBindTexture(GL_TEXTURE_2D, 0);\n\n\tS.bInitialized = true;\n}\n\nvoid MicroProfileBeginDraw(uint32_t nWidth, uint32_t nHeight, float* pfProjection)\n{\n\t(void)nWidth;\n\t(void)nHeight;\n\n\tMicroProfileDrawContext& S = g_MicroProfileDraw;\n\n\tif (!S.bInitialized)\n\t\treturn;\n\n\tglEnable(GL_BLEND);\n\tglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);\n\tglDisable(GL_DEPTH_TEST);\n\tglDisable(GL_CULL_FACE);\n\n\tif (S.nVAO)\n\t\tglBindVertexArray(S.nVAO);\n\n\tglUseProgram(S.nProgram);\n\tglUniformMatrix4fv(S.nUniformProjectionMatrix, 1, 0, pfProjection);\n\n\tglActiveTexture(GL_TEXTURE0);\n\tglBindTexture(GL_TEXTURE_2D, S.nTexture);\n\n\tglBindBuffer(GL_ARRAY_BUFFER, S.nVertexBuffer);\n\n\tint nStride = sizeof(MicroProfileDrawVertex);\n\n\tglVertexAttribPointer(S.nAttributePosition, 2, GL_FLOAT, 0, nStride, (void*)(offsetof(MicroProfileDrawVertex, nX)));\n\tglVertexAttribPointer(S.nAttributeColor, 4, GL_UNSIGNED_BYTE, GL_TRUE, nStride, (void*)(offsetof(MicroProfileDrawVertex, nColor)));\n\tglVertexAttribPointer(S.nAttributeTexture, 2, GL_FLOAT, 0, nStride, (void*)(offsetof(MicroProfileDrawVertex, fU)));\n\n\tglEnableVertexAttribArray(S.nAttributePosition);\n\tglEnableVertexAttribArray(S.nAttributeColor);\n\tglEnableVertexAttribArray(S.nAttributeTexture);\n\n\tS.nVertexPos = 0;\n\tS.nCommandPos = 0;\n}\n\nvoid MicroProfileBeginDraw(uint32_t nWidth, uint32_t nHeight, float fScale)\n{\n\tMicroProfileDrawContext& S = g_MicroProfileDraw;\n\n\tif (!S.bInitialized)\n\t\treturn;\n\n\tfloat left = 0.f;\n\tfloat right = nWidth / fScale;\n\tfloat bottom = nHeight / fScale;\n\tfloat top = 0.f;\n\tfloat near_plane = -1.f;\n\tfloat far_plane = 1.f;\n\n\tfloat projection[16] = {};\n\n\tprojection[0] = 2.0f / (right - left);\n\tprojection[5] = 2.0f / (top - bottom);\n\tprojection[10] = -2.0f / (far_plane - near_plane);\n\tprojection[12] = - (right + left) / (right - left);\n\tprojection[13] = - (top + bottom) / (top - bottom);\n\tprojection[14] = - (far_plane + near_plane) / (far_plane - near_plane);\n\tprojection[15] = 1.f;\n\n\tMicroProfileBeginDraw(nWidth, nHeight, projection);\n}\n\nvoid MicroProfileFlush()\n{\n\tMicroProfileDrawContext& S = g_MicroProfileDraw;\n\n\tif(S.nVertexPos == 0)\n\t\treturn;\n\n\tMICROPROFILE_SCOPEI(\"MicroProfile\", \"Flush\", 0xffff3456);\n\n\tglBufferSubData(GL_ARRAY_BUFFER, 0, S.nVertexPos * sizeof(MicroProfileDrawVertex), S.nVertices);\n\n\tint nOffset = 0;\n\n\tfor(int i = 0; i < int(S.nCommandPos); ++i)\n\t{\n\t\tint nCount = S.nCommands[i].nNumVertices;\n\t\tglDrawArrays(S.nCommands[i].nCommand, nOffset, nCount);\n\t\tnOffset += nCount;\n\t}\n\n\tS.nVertexPos = 0;\n\tS.nCommandPos = 0;\n}\n\nMicroProfileDrawVertex* MicroProfilePushVertices(uint32_t nCommand, int nCount)\n{\n\tMP_ASSERT(nCount <= MicroProfileDrawContext::MAX_VERTICES);\n\n\tMicroProfileDrawContext& S = g_MicroProfileDraw;\n\n\tif(S.nVertexPos + nCount > MicroProfileDrawContext::MAX_VERTICES)\n\t\tMicroProfileFlush();\n\n\tif(S.nCommandPos && S.nCommands[S.nCommandPos-1].nCommand == nCommand)\n\t{\n\t\tS.nCommands[S.nCommandPos-1].nNumVertices += nCount;\n\t}\n\telse\n\t{\n\t\tif (S.nCommandPos == MicroProfileDrawContext::MAX_COMMANDS)\n\t\t\tMicroProfileFlush();\n\n\t\tS.nCommands[S.nCommandPos].nCommand = nCommand;\n\t\tS.nCommands[S.nCommandPos].nNumVertices = nCount;\n\t\tS.nCommandPos++;\n\t}\n\n\tuint32_t nOut = S.nVertexPos;\n\tS.nVertexPos += nCount;\n\n\treturn &S.nVertices[nOut];\n}\n\nvoid MicroProfileEndDraw()\n{\n\tMicroProfileDrawContext& S = g_MicroProfileDraw;\n\n\tif (!S.bInitialized)\n\t\treturn;\n\n\tMicroProfileFlush();\n\n\tglDisableVertexAttribArray(S.nAttributePosition);\n\tglDisableVertexAttribArray(S.nAttributeColor);\n\tglDisableVertexAttribArray(S.nAttributeTexture);\n\n\tglBindBuffer(GL_ARRAY_BUFFER, 0);\n\tglUseProgram(0);\n\n\tif (S.nVAO)\n\t\tglBindVertexArray(0);\n\n\tglDisable(GL_BLEND);\n}\n\nvoid MicroProfileRender(uint32_t nWidth, uint32_t nHeight, float fScale)\n{\n\tMicroProfileBeginDraw(nWidth, nHeight, fScale);\n\tMicroProfileDraw(nWidth, nHeight);\n\tMicroProfileEndDraw();\n}\n\nvoid MicroProfileDrawText(int nX, int nY, uint32_t nColor, const char* pText, uint32_t nLen)\n{\n\tMICROPROFILE_SCOPEI(\"MicroProfile\", \"TextDraw\", 0xff88ee);\n\n\tconst float fOffsetU = 5.f / 1024.f;\n\tMP_ASSERT(nLen <= strlen(pText));\n\tfloat fX = (float)nX;\n\tfloat fY = (float)nY;\n\tfloat fY2 = fY + (MICROPROFILE_TEXT_HEIGHT+1);\n\n\tMicroProfileDrawVertex* pVertex = MicroProfilePushVertices(GL_TRIANGLES, 6 * nLen);\n\tif (!pVertex) return;\n\n\tconst char* pStr = pText;\n\tnColor = 0xff000000|((nColor&0xff)<<16)|(nColor&0xff00)|((nColor>>16)&0xff);\n\n\tfor(uint32_t j = 0; j < nLen; ++j)\n\t{\n\t\tint16_t nOffset = g_MicroProfileFontDescription[uint8_t(*pStr++)];\n\t\tfloat fOffset = nOffset / 1024.f;\n\t\tQ0(pVertex,nX, fX);\n\t\tQ0(pVertex,nY, fY);\n\t\tQ0(pVertex,nColor, nColor);\n\t\tQ0(pVertex,fU, fOffset);\n\t\tQ0(pVertex,fV, 0.f);\n\t\t\n\t\tQ1(pVertex, nX, fX+MICROPROFILE_TEXT_WIDTH);\n\t\tQ1(pVertex, nY, fY);\n\t\tQ1(pVertex, nColor, nColor);\n\t\tQ1(pVertex, fU, fOffset+fOffsetU);\n\t\tQ1(pVertex, fV, 0.f);\n\n\t\tQ2(pVertex, nX, fX+MICROPROFILE_TEXT_WIDTH);\n\t\tQ2(pVertex, nY, fY2);\n\t\tQ2(pVertex, nColor, nColor);\n\t\tQ2(pVertex, fU, fOffset+fOffsetU);\n\t\tQ2(pVertex, fV, 1.f);\n\n\n\t\tQ3(pVertex, nX, fX);\n\t\tQ3(pVertex, nY, fY2);\n\t\tQ3(pVertex, nColor, nColor);\n\t\tQ3(pVertex, fU, fOffset);\n\t\tQ3(pVertex, fV, 1.f);\n\n\t\tfX += MICROPROFILE_TEXT_WIDTH+1;\n\t\tpVertex += 6;\n\t}\n}\nvoid MicroProfileDrawBox(int nX0, int nY0, int nX1, int nY1, uint32_t nColor, MicroProfileBoxType Type)\n{\n\tMicroProfileDrawVertex* pVertex = MicroProfilePushVertices(GL_TRIANGLES, 6);\n\tif (!pVertex) return;\n\n\tif(Type == MicroProfileBoxTypeFlat)\n\t{\n\t\tnColor = ((nColor&0xff)<<16)|((nColor>>16)&0xff)|(0xff00ff00&nColor);\n\t\tQ0(pVertex, nX, (float)nX0);\n\t\tQ0(pVertex, nY, (float)nY0);\n\t\tQ0(pVertex, nColor, nColor);\n\t\tQ0(pVertex, fU, 2.f);\n\t\tQ0(pVertex, fV, 2.f);\n\t\tQ1(pVertex, nX, (float)nX1);\n\t\tQ1(pVertex, nY, (float)nY0);\n\t\tQ1(pVertex, nColor, nColor);\n\t\tQ1(pVertex, fU, 2.f);\n\t\tQ1(pVertex, fV, 2.f);\n\t\tQ2(pVertex, nX, (float)nX1);\n\t\tQ2(pVertex, nY, (float)nY1);\n\t\tQ2(pVertex, nColor, nColor);\n\t\tQ2(pVertex, fU, 2.f);\n\t\tQ2(pVertex, fV, 2.f);\n\t\tQ3(pVertex, nX, (float)nX0);\n\t\tQ3(pVertex, nY, (float)nY1);\n\t\tQ3(pVertex, nColor, nColor);\n\t\tQ3(pVertex, fU, 2.f);\n\t\tQ3(pVertex, fV, 2.f);\n\t}\n\telse\n\t{\n\t\tuint32_t r = 0xff & (nColor>>16);\n\t\tuint32_t g = 0xff & (nColor>>8);\n\t\tuint32_t b = 0xff & nColor;\n\t\tuint32_t nMax = MicroProfileMax(MicroProfileMax(MicroProfileMax(r, g), b), 30u);\n\t\tuint32_t nMin = MicroProfileMin(MicroProfileMin(MicroProfileMin(r, g), b), 180u);\n\n\t\tuint32_t r0 = 0xff & ((r + nMax)/2);\n\t\tuint32_t g0 = 0xff & ((g + nMax)/2);\n\t\tuint32_t b0 = 0xff & ((b + nMax)/2);\n\n\t\tuint32_t r1 = 0xff & ((r+nMin)/2);\n\t\tuint32_t g1 = 0xff & ((g+nMin)/2);\n\t\tuint32_t b1 = 0xff & ((b+nMin)/2);\n\t\tuint32_t nColor0 = (r0<<0)|(g0<<8)|(b0<<16)|(0xff000000&nColor);\n\t\tuint32_t nColor1 = (r1<<0)|(g1<<8)|(b1<<16)|(0xff000000&nColor);\n\t\tQ0(pVertex, nX, (float)nX0);\n\t\tQ0(pVertex, nY, (float)nY0);\n\t\tQ0(pVertex, nColor, nColor0);\n\t\tQ0(pVertex, fU, 2.f);\n\t\tQ0(pVertex, fV, 2.f);\n\t\tQ1(pVertex, nX, (float)nX1);\n\t\tQ1(pVertex, nY, (float)nY0);\n\t\tQ1(pVertex, nColor, nColor0);\n\t\tQ1(pVertex, fU, 3.f);\n\t\tQ1(pVertex, fV, 2.f);\n\t\tQ2(pVertex, nX, (float)nX1);\n\t\tQ2(pVertex, nY, (float)nY1);\n\t\tQ2(pVertex, nColor, nColor1);\n\t\tQ2(pVertex, fU, 3.f);\n\t\tQ2(pVertex, fV, 3.f);\n\t\tQ3(pVertex, nX, (float)nX0);\n\t\tQ3(pVertex, nY, (float)nY1);\n\t\tQ3(pVertex, nColor, nColor1);\n\t\tQ3(pVertex, fU, 2.f);\n\t\tQ3(pVertex, fV, 3.f);\n\t}\n}\n\n\nvoid MicroProfileDrawLine2D(uint32_t nVertices, float* pVertices, uint32_t nColor)\n{\n\tif(!nVertices) return;\n\n\tMicroProfileDrawVertex* pVertex = MicroProfilePushVertices(GL_LINES, 2*(nVertices-1));\n\tnColor = ((nColor&0xff)<<16)|(nColor&0xff00ff00)|((nColor>>16)&0xff);\n\tfor(uint32_t i = 0; i < nVertices-1; ++i)\n\t{\n\t\tpVertex[0].nX = pVertices[i*2];\n\t\tpVertex[0].nY = pVertices[i*2+1] ;\n\t\tpVertex[0].nColor = nColor;\n\t\tpVertex[0].fU = 2.f;\n\t\tpVertex[0].fV = 2.f;\n\t\tpVertex[1].nX = pVertices[(i+1)*2];\n\t\tpVertex[1].nY = pVertices[(i+1)*2+1] ;\n\t\tpVertex[1].nColor = nColor;\n\t\tpVertex[1].fU = 2.f;\n\t\tpVertex[1].fV = 2.f;\n\t\tpVertex += 2;\n\t}\n}\n\nnamespace\n{\n\tconst char g_MicroProfileVertexShader_110[] =\n\t\t\"#version 110\\n\\\n\t\tuniform mat4 ProjectionMatrix; \\\n\t\tattribute vec3 VertexIn; attribute vec4 ColorIn; attribute vec2 TCIn; \\\n\t\tvarying vec2 TC; varying vec4 Color; \\\n\t\tvoid main() { Color = ColorIn; TC = TCIn; gl_Position = ProjectionMatrix * vec4(VertexIn, 1.0); }\";\n\n\tconst char g_MicroProfileVertexShader_150[] =\n\t\t\"#version 150\\n\\\n\t\tuniform mat4 ProjectionMatrix; \\\n\t\tin vec3 VertexIn; in vec4 ColorIn; in vec2 TCIn; \\\n\t\tout vec2 TC; out vec4 Color; \\\n\t\tvoid main() { Color = ColorIn; TC = TCIn; gl_Position = ProjectionMatrix * vec4(VertexIn, 1.0); }\";\n\n\tconst char g_MicroProfileFragmentShader_110[] =\n\t\t\"#version 110\\n\\\n\t\tuniform sampler2D Texture; uniform float RcpFontHeight; \\\n\t\tvarying vec2 TC; varying vec4 Color; \\\n\t\tvoid main() { \\\n\t\t\tvec4 c0 = texture2D(Texture, TC.xy); \\\n\t\t\tvec4 c1 = texture2D(Texture, TC.xy + vec2(0.0, RcpFontHeight)); \\\n\t\t\tgl_FragColor = c0.w < 0.5 ? vec4(0, 0, 0, c1.w) : c0 * Color; \\\n\t\t} \\\n\t\";\n\n\tconst char g_MicroProfileFragmentShader_150[] =\n\t\t\"#version 150\\n\\\n\t\tuniform sampler2D Texture; uniform float RcpFontHeight; \\\n\t\tin vec2 TC; in vec4 Color; \\\n\t\tout vec4 result; \\\n\t\tvoid main() { \\\n\t\t\tvec4 c0 = texture(Texture, TC.xy); \\\n\t\t\tvec4 c1 = texture(Texture, TC.xy + vec2(0.0, RcpFontHeight)); \\\n\t\t\tresult = c0.w < 0.5 ? vec4(0, 0, 0, c1.w) : c0 * Color; \\\n\t\t} \\\n\t\";\n\n\tconst uint16_t g_MicroProfileFontDescription[] =\n\t{\n\t\t0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,\n\t\t0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,\n\t\t0x0ce,0x201,0x209,0x211,0x219,0x221,0x229,0x231,0x239,0x241,0x249,0x251,0x259,0x261,0x269,0x271,\n\t\t0x1b1,0x1b9,0x1c1,0x1c9,0x1d1,0x1d9,0x1e1,0x1e9,0x1f1,0x1f9,0x279,0x281,0x289,0x291,0x299,0x2a1,\n\t\t0x2a9,0x001,0x009,0x011,0x019,0x021,0x029,0x031,0x039,0x041,0x049,0x051,0x059,0x061,0x069,0x071,\n\t\t0x079,0x081,0x089,0x091,0x099,0x0a1,0x0a9,0x0b1,0x0b9,0x0c1,0x0c9,0x2b1,0x2b9,0x2c1,0x2c9,0x2d1,\n\t\t0x0ce,0x0d9,0x0e1,0x0e9,0x0f1,0x0f9,0x101,0x109,0x111,0x119,0x121,0x129,0x131,0x139,0x141,0x149,\n\t\t0x151,0x159,0x161,0x169,0x171,0x179,0x181,0x189,0x191,0x199,0x1a1,0x2d9,0x2e1,0x2e9,0x2f1,0x0ce,\n\t\t0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,\n\t\t0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,\n\t\t0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,\n\t\t0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,\n\t\t0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,\n\t\t0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,\n\t\t0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,\n\t\t0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,0x0ce,\n\t};\n\n\tconst uint8_t g_MicroProfileFont[] = \n\t{\n\t\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t\t0x10,0x78,0x38,0x78,0x7c,0x7c,0x3c,0x44,0x38,0x04,0x44,0x40,0x44,0x44,0x38,0x78,\n\t\t0x38,0x78,0x38,0x7c,0x44,0x44,0x44,0x44,0x44,0x7c,0x00,0x00,0x40,0x00,0x04,0x00,\n\t\t0x18,0x00,0x40,0x10,0x08,0x40,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,\n\t\t0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x10,0x38,0x7c,0x08,0x7c,0x1c,0x7c,0x38,0x38,\n\t\t0x10,0x28,0x28,0x10,0x00,0x20,0x10,0x08,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,\n\t\t0x00,0x04,0x00,0x20,0x38,0x38,0x70,0x00,0x1c,0x10,0x00,0x1c,0x10,0x70,0x30,0x00,\n\t\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t\t0x28,0x44,0x44,0x44,0x40,0x40,0x40,0x44,0x10,0x04,0x48,0x40,0x6c,0x44,0x44,0x44,\n\t\t0x44,0x44,0x44,0x10,0x44,0x44,0x44,0x44,0x44,0x04,0x00,0x00,0x40,0x00,0x04,0x00,\n\t\t0x24,0x00,0x40,0x00,0x00,0x40,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,\n\t\t0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x30,0x44,0x04,0x18,0x40,0x20,0x04,0x44,0x44,\n\t\t0x10,0x28,0x28,0x3c,0x44,0x50,0x10,0x10,0x08,0x54,0x10,0x00,0x00,0x00,0x04,0x00,\n\t\t0x00,0x08,0x00,0x10,0x44,0x44,0x40,0x40,0x04,0x28,0x00,0x30,0x10,0x18,0x58,0x00,\n\t\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t\t0x44,0x44,0x40,0x44,0x40,0x40,0x40,0x44,0x10,0x04,0x50,0x40,0x54,0x64,0x44,0x44,\n\t\t0x44,0x44,0x40,0x10,0x44,0x44,0x44,0x28,0x28,0x08,0x00,0x38,0x78,0x3c,0x3c,0x38,\n\t\t0x20,0x38,0x78,0x30,0x18,0x44,0x10,0x6c,0x78,0x38,0x78,0x3c,0x5c,0x3c,0x3c,0x44,\n\t\t0x44,0x44,0x44,0x44,0x7c,0x00,0x4c,0x10,0x04,0x08,0x28,0x78,0x40,0x08,0x44,0x44,\n\t\t0x10,0x00,0x7c,0x50,0x08,0x50,0x00,0x20,0x04,0x38,0x10,0x00,0x00,0x00,0x08,0x10,\n\t\t0x10,0x10,0x7c,0x08,0x08,0x54,0x40,0x20,0x04,0x44,0x00,0x30,0x10,0x18,0x00,0x00,\n\t\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t\t0x44,0x78,0x40,0x44,0x78,0x78,0x40,0x7c,0x10,0x04,0x60,0x40,0x54,0x54,0x44,0x78,\n\t\t0x44,0x78,0x38,0x10,0x44,0x44,0x54,0x10,0x10,0x10,0x00,0x04,0x44,0x40,0x44,0x44,\n\t\t0x78,0x44,0x44,0x10,0x08,0x48,0x10,0x54,0x44,0x44,0x44,0x44,0x60,0x40,0x10,0x44,\n\t\t0x44,0x44,0x28,0x44,0x08,0x00,0x54,0x10,0x18,0x18,0x48,0x04,0x78,0x10,0x38,0x3c,\n\t\t0x10,0x00,0x28,0x38,0x10,0x20,0x00,0x20,0x04,0x10,0x7c,0x00,0x7c,0x00,0x10,0x00,\n\t\t0x00,0x20,0x00,0x04,0x10,0x5c,0x40,0x10,0x04,0x00,0x00,0x60,0x10,0x0c,0x00,0x00,\n\t\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t\t0x7c,0x44,0x40,0x44,0x40,0x40,0x4c,0x44,0x10,0x04,0x50,0x40,0x44,0x4c,0x44,0x40,\n\t\t0x54,0x50,0x04,0x10,0x44,0x44,0x54,0x28,0x10,0x20,0x00,0x3c,0x44,0x40,0x44,0x7c,\n\t\t0x20,0x44,0x44,0x10,0x08,0x70,0x10,0x54,0x44,0x44,0x44,0x44,0x40,0x38,0x10,0x44,\n\t\t0x44,0x54,0x10,0x44,0x10,0x00,0x64,0x10,0x20,0x04,0x7c,0x04,0x44,0x20,0x44,0x04,\n\t\t0x10,0x00,0x7c,0x14,0x20,0x54,0x00,0x20,0x04,0x38,0x10,0x10,0x00,0x00,0x20,0x10,\n\t\t0x10,0x10,0x7c,0x08,0x10,0x58,0x40,0x08,0x04,0x00,0x00,0x30,0x10,0x18,0x00,0x00,\n\t\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t\t0x44,0x44,0x44,0x44,0x40,0x40,0x44,0x44,0x10,0x44,0x48,0x40,0x44,0x44,0x44,0x40,\n\t\t0x48,0x48,0x44,0x10,0x44,0x28,0x6c,0x44,0x10,0x40,0x00,0x44,0x44,0x40,0x44,0x40,\n\t\t0x20,0x3c,0x44,0x10,0x08,0x48,0x10,0x54,0x44,0x44,0x44,0x44,0x40,0x04,0x12,0x4c,\n\t\t0x28,0x54,0x28,0x3c,0x20,0x00,0x44,0x10,0x40,0x44,0x08,0x44,0x44,0x20,0x44,0x08,\n\t\t0x00,0x00,0x28,0x78,0x44,0x48,0x00,0x10,0x08,0x54,0x10,0x10,0x00,0x00,0x40,0x00,\n\t\t0x10,0x08,0x00,0x10,0x00,0x40,0x40,0x04,0x04,0x00,0x00,0x30,0x10,0x18,0x00,0x00,\n\t\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t\t0x44,0x78,0x38,0x78,0x7c,0x40,0x3c,0x44,0x38,0x38,0x44,0x7c,0x44,0x44,0x38,0x40,\n\t\t0x34,0x44,0x38,0x10,0x38,0x10,0x44,0x44,0x10,0x7c,0x00,0x3c,0x78,0x3c,0x3c,0x3c,\n\t\t0x20,0x04,0x44,0x38,0x48,0x44,0x38,0x44,0x44,0x38,0x78,0x3c,0x40,0x78,0x0c,0x34,\n\t\t0x10,0x6c,0x44,0x04,0x7c,0x00,0x38,0x38,0x7c,0x38,0x08,0x38,0x38,0x20,0x38,0x70,\n\t\t0x10,0x00,0x28,0x10,0x00,0x34,0x00,0x08,0x10,0x10,0x00,0x20,0x00,0x10,0x00,0x00,\n\t\t0x20,0x04,0x00,0x20,0x10,0x3c,0x70,0x00,0x1c,0x00,0x7c,0x1c,0x10,0x70,0x00,0x00,\n\t\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t\t0x00,0x38,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x40,0x04,0x00,0x00,0x00,0x00,\n\t\t0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t\t0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n\t};\n}\n#endif\n#endif\n"
  },
  {
    "path": "third_party/microprofile/microprofilehtml.h",
    "content": "///start file generated from microprofile.html\n#ifdef MICROPROFILE_EMBED_HTML\nconst char g_MicroProfileHtml_begin_0[] =\n\"<!DOCTYPE HTML>\\n\"\n\"<html>\\n\"\n\"<head>\\n\"\n\"<title>MicroProfile Capture</title>\\n\"\n\"<style>\\n\"\n\"/* about css: http://bit.ly/1eMQ42U */\\n\"\n\"body {margin: 0px;padding: 0px; font: 12px Courier New;background-color:#474747; color:white;overflow:hidden;}\\n\"\n\"ul {list-style-type: none;margin: 0;padding: 0;}\\n\"\n\"li{display: inline; float:left;border:5px; position:relative;text-align:center;}\\n\"\n\"a {\\n\"\n\"    float:left;\\n\"\n\"    text-decoration:none;\\n\"\n\"    display: inline;\\n\"\n\"    text-align: center;\\n\"\n\"\tpadding:5px;\\n\"\n\"\tpadding-bottom:0px;\\n\"\n\"\tpadding-top:0px;\\n\"\n\"    color: #FFFFFF;\\n\"\n\"    background-color: #474747;\\n\"\n\"}\\n\"\n\"a:hover, a:active{\\n\"\n\"\tbackground-color: #000000;\\n\"\n\"}\\n\"\n\"\\n\"\n\"ul ul {\\n\"\n\"    position:absolute;\\n\"\n\"    left:0;\\n\"\n\"    top:100%;\\n\"\n\"    margin-left:-999em;\\n\"\n\"}\\n\"\n\"li:hover ul {\\n\"\n\"    margin-left:0;\\n\"\n\"    margin-right:0;\\n\"\n\"}\\n\"\n\"ul li ul{ display:block;float:none;width:100%;}\\n\"\n\"ul li ul li{ display:block;float:none;width:100%;}\\n\"\n\"li li a{ display:block;float:none;width:100%;text-align:left;}\\n\"\n\"#nav li:hover div {margin-left:0;}\\n\"\n\".help {position:absolute;z-index:5;text-align:left;padding:2px;margin-left:-999em;background-color: #313131;width:300px;}\\n\"\n\".helpstart {position:absolute;z-index:5;text-align:left;padding:2px;background-color: #313131;width:300px;display:none}\\n\"\n\".root {z-index:1;position:absolute;top:0px;left:0px;}\\n\"\n\".filterinput0{position:fixed;bottom:10px;left:25px;background-color: #313131}\\n\"\n\".filterinput1{position:fixed;bottom:10px;left:175px;background-color: #313131}\\n\"\n\"</style>\\n\"\n\"</head>\\n\"\n\"<body style=\\\"\\\">\\n\"\n\"<div id=\\'filterinput\\'>\\n\"\n\"<div class=\\\"filterinput0\\\">Group<br><input type=\\\"text\\\" id=\\\"filtergroup\\\"></div>\\n\"\n\"<div class=\\\"filterinput1\\\">Timer/Thread<br><input type=\\\"text\\\" id=\\\"filtertimer\\\"></div>\\n\"\n\"</div>\\n\"\n\"<canvas id=\\\"History\\\" height=\\\"70\\\" style=\\\"background-color:#474747;margin:0px;padding:0px;\\\"></canvas><canvas id=\\\"DetailedView\\\" height=\\\"200\\\" style=\\\"background-color:#474747;margin:0px;padding:0px;\\\"></canvas>\\n\"\n\"<div id=\\\"root\\\" class=\\\"root\\\">\\n\"\n\"<ul id=\\\"nav\\\">\\n\"\n\"<li><a href=\\\"javascript:void(0)\\\" onclick=\\\"ToggleDebugMode();\\\">?</a>\\n\"\n\"<div class=\\\"helpstart\\\" id=\\\"helpwindow\\\" style=\\\"left:20px;top:20px\\\">\\n\"\n\"History View:<br>\\n\"\n\"Click + Drag: Pan View<br>\\n\"\n\"Right Click + Drag : Zoom on region<br>\\n\"\n\"Click Frame : Center on frame<br>\\n\"\n\"<hr>\\n\"\n\"Main View:<br>\\n\"\n\"Ctrl + Mouse up/down: Zoom<br>\\n\"\n\"Mousewheel : Zoom<br>\\n\"\n\"Right Click + Drag: Select region<br>\\n\"\n\"Ctrl + Shift + Drag: Select region<br>\\n\"\n\"Space: Zoom to Selection<br>\\n\"\n\"Ctrl + Drag: Pan<br>\\n\"\n\"Click + Drag: Pan<br>\\n\"\n\"alt or z: Toggle ToolTip<br>\\n\"\n\"<hr>\\n\"\n\"Detailed View:<br>\\n\"\n\"Tab: Go To Worst Instance<br>\\n\"\n\"Left/Right Arrow: Next/Prev Instance<br>\\n\"\n\"<hr>\\n\"\n\"Timer Views:<br>\\n\"\n\"Tab: go to filtering<br>\\n\"\n\"Esc: Exit &amp; Clear filter\\n\"\n\"<hr>\\n\"\n\"<table style=\\\"width:100%\\\">\\n\"\n\"<tr>\\n\"\n\"<td width=\\\"50%\\\" align=\\\"left\\\"><a href=\\'javascript:void(0)\\' onclick=\\\"ShowHelp(0, 0);\\\">Close</a></td>\\n\"\n\"<td width=\\\"50%\\\" align=\\\"right\\\"><a href=\\'javascript:void(0)\\' onclick=\\\"ShowHelp(0, 1);\\\">Close, Never Show</a></td>\\n\"\n\"</tr>\\n\"\n\"</table>\\n\"\n\"</div>\\n\"\n\"<div class=\\\"help\\\" id=\\\"divFrameInfo\\\" style=\\\"left:20px;top:300px;width:auto;\\\">\\n\"\n\"</div>\\n\"\n\"</li>\\n\"\n\"<li><a id=\\'ModeSubMenuText\\'>Mode</a>\\n\"\n\"    <ul id=\\'ModeSubMenu\\'>\\n\"\n\"\t\t<li><a href=\\\"javascript:void(0)\\\" onclick=\\\"SetMode(\\'timers\\', 0);\\\" id=\\\"buttonTimers\\\">Timers</a></li>\\n\"\n\"\t\t<li><a href=\\\"javascript:void(0)\\\" onclick=\\\"SetMode(\\'timers\\', 1);\\\" id=\\\"buttonGroups\\\">Groups</a></li> \\n\"\n\"\t\t<li><a href=\\\"javascript:void(0)\\\" onclick=\\\"SetMode(\\'timers\\', 2);\\\" id=\\\"buttonThreads\\\">Threads</a></li>\\n\"\n\"\t\t<li><a href=\\\"javascript:void(0)\\\" onclick=\\\"SetMode(\\'detailed\\', 0);\\\" id=\\\"buttonDetailed\\\">Detailed</a></li>\\n\"\n\"\t\t<li><a href=\\\"javascript:void(0)\\\" onclick=\\\"SetMode(\\'counters\\', 0);\\\" id=\\\"buttonCounters\\\">Counters</a></li>\\n\"\n\"\t</ul>\\n\"\n\"</li>\\n\"\n\"<li><a>Reference</a>\\n\"\n\"    <ul id=\\'ReferenceSubMenu\\'>\\n\"\n\"        <li><a href=\\\"javascript:void(0)\\\" onclick=\\\"SetReferenceTime(\\'5ms\\');\\\">5ms</a></li>\\n\"\n\"        <li><a href=\\\"javascript:void(0)\\\" onclick=\\\"SetReferenceTime(\\'10ms\\');\\\">10ms</a></li>\\n\"\n\"        <li><a href=\\\"javascript:void(0)\\\" onclick=\\\"SetReferenceTime(\\'15ms\\');\\\">15ms</a></li>\\n\"\n\"        <li><a href=\\\"javascript:void(0)\\\" onclick=\\\"SetReferenceTime(\\'20ms\\');\\\">20ms</a></li>\\n\"\n\"        <li><a href=\\\"javascript:void(0)\\\" onclick=\\\"SetReferenceTime(\\'33ms\\');\\\">33ms</a></li>\\n\"\n\"        <li><a href=\\\"javascript:void(0)\\\" onclick=\\\"SetReferenceTime(\\'50ms\\');\\\">50ms</a></li>\\n\"\n\"        <li><a href=\\\"javascript:void(0)\\\" onclick=\\\"SetReferenceTime(\\'100ms\\');\\\">100ms</a></li>\\n\"\n\"        <li><a href=\\\"javascript:void(0)\\\" onclick=\\\"SetReferenceTime(\\'250ms\\');\\\">250ms</a></li>\\n\"\n\"        <li><a href=\\\"javascript:void(0)\\\" onclick=\\\"SetReferenceTime(\\'500ms\\');\\\">500ms</a></li>\\n\"\n\"        <li><a href=\\\"javascript:void(0)\\\" onclick=\\\"SetReferenceTime(\\'1000ms\\');\\\">1000ms</a></li>\\n\"\n\"    </ul>\\n\"\n\"</li>\\n\"\n\"<li id=\\\"ilThreads\\\"><a>Threads</a>\\n\"\n\"    <ul id=\\\"ThreadSubMenu\\\">\\n\"\n\"        <li><a href=\\\"javascript:void(0)\\\" onclick=\\\"ToggleThread();\\\">All</a></li>\\n\"\n\"        <li><a>---</a></li>\\n\"\n\"    </ul>\\n\"\n\"</li>\\n\"\n\"<li id=\\\"ilGroups\\\"><a>Groups</a>\\n\"\n\"    <ul id=\\\"GroupSubMenu\\\">\\n\"\n\"        <li><a href=\\\"javascript:void(0)\\\" onclick=\\\"ToggleGroup();\\\">All</a></li>\\n\"\n\"        <li><a>---</a></li>\\n\"\n\"    </ul>\\n\"\n\"</li>\\n\"\n\"<li id=\\\"ilOptions\\\"><a>Options&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</a>\\n\"\n\"    <ul id=\\'OptionsMenu\\'>\\n\"\n\"        <li><a href=\\\"javascript:void(0)\\\" onclick=\\\"ToggleContextSwitch();\\\">Context Switch</a></li>\\n\"\n\"\t\t<li><a href=\\\"javascript:void(0)\\\" onclick=\\\"ToggleDisableMerge();\\\">MergeDisable</a></li>\\n\"\n\"\t\t<li><a href=\\\"javascript:void(0)\\\" onclick=\\\"ToggleDisableLod();\\\">LodDisable</a></li>\\n\"\n\"\t\t<li id=\\'GroupColors\\'><a href=\\\"javascript:void(0)\\\" onclick=\\\"ToggleGroupColors();\\\">Group Colors</a></li>\\n\"\n\"        <li id=\\'TimersMeta\\'><a href=\\\"javascript:void(0)\\\" onclick=\\\"ToggleTimersMeta();\\\">Meta</a></li>\\n\"\n\"        <li id=\\'ShowHelp\\'><a href=\\\"javascript:void(0)\\\" onclick=\\\"ShowHelp(1,1);\\\">Help</a></li>\\n\"\n\"<!--      \t<li><a href=\\\"javascript:void(0)\\\" onclick=\\\"ToggleDebug();\\\">DEBUG</a></li> -->\\n\"\n\"    </ul>\\n\"\n\"</li>\\n\"\n\"</ul>\\n\"\n\"</div>\\n\"\n\"<script>\\n\"\n\"function InvertColor(hexTripletColor) {\\n\"\n\"\tvar color = hexTripletColor;\\n\"\n\"\tcolor = color.substring(1); // remove #\\n\"\n\"\tcolor = parseInt(color, 16); // convert to integer\\n\"\n\"\tvar R = ((color >> 16) % 256)/255.0;\\n\"\n\"\tvar G = ((color >> 8) % 256)/255.0;\\n\"\n\"\tvar B = ((color >> 0) % 256)/255.0;\\n\"\n\"\tvar lum = (0.2126*R + 0.7152*G + 0.0722*B);\\n\"\n\"\tif(lum < 0.7)\\n\"\n\"\t{\\n\"\n\"\t\treturn \\'#ffffff\\';\\n\"\n\"\t}\\n\"\n\"\telse\\n\"\n\"\t{\\n\"\n\"\t\treturn \\'#333333\\';\\n\"\n\"\t}\\n\"\n\"}\\n\"\n\"function InvertColorIndex(hexTripletColor) {\\n\"\n\"\tvar color = hexTripletColor;\\n\"\n\"\tcolor = color.substring(1); // remove #\\n\"\n\"\tcolor = parseInt(color, 16); // convert to integer\\n\"\n\"\tvar R = ((color >> 16) % 256)/255.0;\\n\"\n\"\tvar G = ((color >> 8) % 256)/255.0;\\n\"\n\"\tvar B = ((color >> 0) % 256)/255.0;\\n\"\n\"\tvar lum = (0.2126*R + 0.7152*G + 0.0722*B);\\n\"\n\"\tif(lum < 0.7)\\n\"\n\"\t{\\n\"\n\"\t\treturn 0;\\n\"\n\"\t}\\n\"\n\"\telse\\n\"\n\"\t{\\n\"\n\"\t\treturn 1;\\n\"\n\"\t}\\n\"\n\"}\\n\"\n\"function MakeGroup(id, name, category, numtimers, isgpu, total, average, max, color)\\n\"\n\"{\\n\"\n\"\tvar group = {\\\"id\\\":id, \\\"name\\\":name, \\\"category\\\":category, \\\"numtimers\\\":numtimers, \\\"isgpu\\\":isgpu, \\\"total\\\": total, \\\"average\\\" : average, \\\"max\\\" : max, \\\"color\\\":color};\\n\"\n\"\treturn group;\\n\"\n\"}\\n\"\n\"\\n\"\n\"function MakeTimer(id, name, group, color, colordark, average, max, min, exclaverage, exclmax, callaverage, callcount, total, meta, metaagg, metamax)\\n\"\n\"{\\n\"\n\"\tvar timer = {\\\"id\\\":id, \\\"name\\\":name, \\\"namelabel\\\":name.startsWith(\\\"$\\\"), \\\"color\\\":color, \\\"colordark\\\":colordark,\\\"timercolor\\\":color, \\\"textcolor\\\":InvertColor(color), \\\"group\\\":group, \\\"average\\\":average, \\\"max\\\":max, \\\"min\\\":min, \\\"exclaverage\\\":exclaverage, \\\"exclmax\\\":exclmax, \\\"callaverage\\\":callaverage, \\\"callcount\\\":callcount, \\\"total\\\":total, \\\"meta\\\":meta, \\\"textcolorindex\\\":InvertColorIndex(color), \\\"metaagg\\\":metaagg, \\\"metamax\\\":metamax, \\\"worst\\\":0, \\\"worststart\\\":0, \\\"worstend\\\":0};\\n\"\n\"\treturn timer;\\n\"\n\"}\\n\"\n\"\\n\"\n\"function MakeTimes(scale, ts)\\n\"\n\"{\\n\"\n\"\tfor(var i = 0; i < ts.length; ++i)\\n\"\n\"\t{\\n\"\n\"\t\tts[i] *= scale;\\n\"\n\"\t}\\n\"\n\"\treturn ts;\\n\"\n\"}\\n\"\n\"\\n\"\n\"function MakeTimesExtra(scale, scaleextra, tt, ts)\\n\"\n\"{\\n\"\n\"\tfor(var i = 0; i < ts.length; ++i)\\n\"\n\"\t{\\n\"\n\"\t\tts[i] *= (tt[i] == 4) ? scaleextra : scale;\\n\"\n\"\t}\\n\"\n\"\treturn ts;\\n\"\n\"}\\n\"\n\"\\n\"\n\"function MakeFrame(id, framestart, frameend, framestartgpu, frameendgpu, ts, tt, ti, tl)\\n\"\n\"{\\n\"\n\"\tvar frame = {\\\"id\\\":id, \\\"framestart\\\":framestart, \\\"frameend\\\":frameend, \\\"framestartgpu\\\":framestartgpu, \\\"frameendgpu\\\":frameendgpu, \\\"ts\\\":ts, \\\"tt\\\":tt, \\\"ti\\\":ti, \\\"tl\\\":tl};\\n\"\n\"\treturn frame;\\n\"\n\"}\\n\"\n\"\\n\"\n\"function MakeCounter(id, parent, sibling, firstchild, level, name, value, minvalue, maxvalue, formatted, limit, formattedlimit, format, counterprc, boxprc, historydata)\\n\"\n\"{\\n\"\n\"\tvar historyprcoffset = (minvalue < 0) ? -minvalue : 0;\\n\"\n\"\tvar historyprcscale = 1 / (maxvalue + historyprcoffset);\\n\"\n\"\\n\"\n\"\tvar historyprc = new Array(historydata.length);\\n\"\n\"\tfor(var i = 0; i < historydata.length; ++i)\\n\"\n\"\t{\\n\"\n\"\t\thistorydata[i] += minvalue;\\n\"\n\"\t\thistoryprc[i] = (historydata[i] + historyprcoffset) * historyprcscale;\\n\"\n\"\t}\\n\"\n\"\\n\"\n\"\tvar counter = { \\\"id\\\":id, \\\"parent\\\":parent, \\\"sibling\\\":sibling, \\\"firstchild\\\":firstchild, \\\"level\\\": level, \\\"name\\\":name, \\\"value\\\":value, \\\"formatted\\\":formatted, \\\"limit\\\":limit, \\\"formattedlimit\\\":formattedlimit, \\\"format\\\":format, \\\"counterprc\\\":counterprc, \\\"boxprc\\\":boxprc, \\\"historyprc\\\": historyprc, \\\"historydata\\\":historydata, \\\"minvalue\\\":minvalue, \\\"maxvalue\\\":maxvalue};\\n\"\n\"\treturn counter;\\n\"\n\"}\\n\"\n\"\\n\"\n\"\\n\"\n\"\";\n\nconst size_t g_MicroProfileHtml_begin_0_size = sizeof(g_MicroProfileHtml_begin_0);\nconst char* g_MicroProfileHtml_begin[] = {\n&g_MicroProfileHtml_begin_0[0],\n};\nsize_t g_MicroProfileHtml_begin_sizes[] = {\nsizeof(g_MicroProfileHtml_begin_0),\n};\nsize_t g_MicroProfileHtml_begin_count = 1;\nconst char g_MicroProfileHtml_end_0[] =\n\"\\n\"\n\"\\n\"\n\"var CanvasDetailedView = document.getElementById(\\'DetailedView\\');\\n\"\n\"var CanvasHistory = document.getElementById(\\'History\\');\\n\"\n\"var CanvasDetailedOffscreen = document.createElement(\\'canvas\\');\\n\"\n\"var FilterInputGroup = document.getElementById(\\'filtergroup\\');\\n\"\n\"var FilterInputTimer = document.getElementById(\\'filtertimer\\');\\n\"\n\"var FilterInputGroupString = null;\\n\"\n\"var FilterInputTimerString = null;\\n\"\n\"var FilterInputArray = [FilterInputGroup, FilterInputTimer];\\n\"\n\"var FilterGroup = null;\\n\"\n\"var FilterTimer = null;\\n\"\n\"var g_Msg = \\'0\\';\\n\"\n\"\\n\"\n\"var Initialized = 0;\\n\"\n\"var fDetailedOffset = Frames[0].framestart;\\n\"\n\"var fDetailedRange = Frames[0].frameend - fDetailedOffset;\\n\"\n\"var nWidth = CanvasDetailedView.width;\\n\"\n\"var nHeight = CanvasDetailedView.height;\\n\"\n\"var ReferenceTime = 33;\\n\"\n\"var nHistoryHeight = 70;\\n\"\n\"var nOffsetY = 0;\\n\"\n\"var nOffsetBarsX = 0;\\n\"\n\"var nOffsetBarsY = 0;\\n\"\n\"var nOffsetCountersY = 0;\\n\"\n\"var nBarsWidth = 80;\\n\"\n\"var NameWidth = 200;\\n\"\n\"var MouseButtonState = [0,0,0,0,0,0,0,0];\\n\"\n\"var KeyShiftDown = 0;\\n\"\n\"var MouseDragButton = 0;\\n\"\n\"var KeyCtrlDown = 0;\\n\"\n\"var ToolTip = 1; //0: off, 1: default, 2: flipped\\n\"\n\"var DetailedViewMouseX = 0;\\n\"\n\"var DetailedViewMouseY = 0;\\n\"\n\"var HistoryViewMouseX = -1;\\n\"\n\"var HistoryViewMouseY = -1;\\n\"\n\"var MouseHistory = 0;\\n\"\n\"var MouseDetailed = 0;\\n\"\n\"var FontHeight = 10;\\n\"\n\"var FontWidth = 1;\\n\"\n\"var FontAscent = 3; //Set manually\\n\"\n\"var Font = \\'Bold \\' + FontHeight + \\'px Courier New\\';\\n\"\n\"var FontFlash = \\'Bold \\' + 35 + \\'px Courier New\\';\\n\"\n\"var BoxHeight = FontHeight + 2;\\n\"\n\"var ThreadsActive = new Object();\\n\"\n\"var ThreadsAllActive = 1;\\n\"\n\"var GroupsActive = new Object();\\n\"\n\"var GroupsAllActive = 1;\\n\"\n\"var nMinWidth = 0.01;//subpixel width\\n\"\n\"var nMinWidthPan = 1.0;//subpixel width when panning\\n\"\n\"var nContextSwitchEnabled = 1;\\n\"\n\"var DisableLod = 0;\\n\"\n\"var DisableMerge = 0;\\n\"\n\"var GroupColors = 0;\\n\"\n\"var nModDown = 0;\\n\"\n\"var g_MSG = \\'no\\';\\n\"\n\"var nDrawCount = 0;\\n\"\n\"var nBackColors = [\\'#474747\\', \\'#313131\\' ];\\n\"\n\"var nBackColorOffset = \\'#606060\\';\\n\"\n\"var CSwitchColors =[\\\"#9DD8AF\\\",\\\"#D7B6DA\\\",\\\"#EAAC76\\\",\\\"#DBDA61\\\",\\\"#8AD5E1\\\",\\\"#8CE48B\\\",\\\"#C4D688\\\",\\\"#57E5C4\\\"];//generated by http://tools.medialab.sciences-po.fr/iwanthue/index.php\\n\"\n\"var CSwitchHeight = 5;\\n\"\n\"var FRAME_HISTORY_COLOR_CPU = \\'#ff7f27\\';\\n\"\n\"var FRAME_HISTORY_COLOR_GPU = \\'#ffffff\\';\\n\"\n\"var ZOOM_TIME = 0.5;\\n\"\n\"var AnimationActive = false;\\n\"\n\"var nHoverCSCpu = -1;\\n\"\n\"var nHoverCSCpuNext = -1;\\n\"\n\"var nHoverCSToolTip = null;\\n\"\n\"var nHoverToken = -1;\\n\"\n\"var nHoverFrame = -1;\\n\"\n\"var nHoverTokenIndex = -1;\\n\"\n\"var nHoverTokenLogIndex = -1;\\n\"\n\"var nHoverCounter = 0;\\n\"\n\"var nHoverCounterDelta = 8;\\n\"\n\"var nHoverTokenNext = -1;\\n\"\n\"var nHoverTokenLogIndexNext = -1;\\n\"\n\"var nHoverTokenIndexNext = -1;\\n\"\n\"var nHoverCounter = -1;\\n\"\n\"var nHoverTokenDrawn = -1;\\n\"\n\"var nHideHelp = 0;\\n\"\n\"var fFrameScale = 33.33;\\n\"\n\"var SortColumn = 0;\\n\"\n\"var SortColumnOrderFlip = 0;\\n\"\n\"var SortColumnMouseOver = null;\\n\"\n\"var SortColumnMouseOverNext = null;\\n\"\n\"\\n\"\n\"function RangeInit()\\n\"\n\"{\\n\"\n\"\treturn {\\\"Begin\\\":-1, \\\"End\\\":-1, \\\"YBegin\\\":-1, \\\"YEnd\\\":-1, \\\"Thread\\\": -1 , \\\"Index\\\": -1};\\n\"\n\"}\\n\"\n\"function RangeValid(Range)\\n\"\n\"{\\n\"\n\"\treturn Range.Begin < Range.End;\\n\"\n\"}\\n\"\n\"function RangeCopy(Dst, Src)\\n\"\n\"{\\n\"\n\"\tDst.Begin = Src.Begin;\\n\"\n\"\tDst.End = Src.End;\\n\"\n\"\tDst.YBegin = Src.YBegin;\\n\"\n\"\tDst.YEnd = Src.YEnd;\\n\"\n\"\tDst.Thread = Src.Thread;\\n\"\n\"}\\n\"\n\"var RangeCpu = RangeInit();\\n\"\n\"var RangeGpu = RangeInit();\\n\"\n\"var RangeSelect = RangeInit();\\n\"\n\"\\n\"\n\"var RangeCpuNext = RangeInit();\\n\"\n\"var RangeGpuNext = RangeInit();\\n\"\n\"\\n\"\n\"var RangeCpuHistory = RangeInit();\\n\"\n\"var RangeGpuHistory = RangeInit();\\n\"\n\"\\n\"\n\"var fRangeBegin = 0;\\n\"\n\"var fRangeEnd = -1;\\n\"\n\"var fRangeThreadId = -1;\\n\"\n\"var fRangeThreadIdNext = -1;\\n\"\n\"var fRangeBeginNext = 0;\\n\"\n\"var fRangeEndNext = 0;\\n\"\n\"var fRangeBeginGpuNext = 0;\\n\"\n\"var fRangeEndGpuNext = 0;\\n\"\n\"var fRangeBeginHistory = -1;\\n\"\n\"var fRangeEndHistory = -1;\\n\"\n\"var fRangeBeginHistoryGpu = -1;\\n\"\n\"var fRangeEndHistoryGpu = -1;\\n\"\n\"var fRangeBeginSelect = 0;\\n\"\n\"var fRangeEndSelect = -1;\\n\"\n\"var ThreadY;\\n\"\n\"\\n\"\n\"var ModeDetailed = 0;\\n\"\n\"var ModeTimers = 1;\\n\"\n\"var ModeCounters = 2;\\n\"\n\"var Mode = ModeDetailed;\\n\"\n\"\\n\"\n\"var DebugDrawQuadCount = 0;\\n\"\n\"var DebugDrawTextCount = 0;\\n\"\n\"var ProfileMode = 0;\\n\"\n\"var ProfileRedraw0 = 0;\\n\"\n\"var ProfileRedraw1 = 0;\\n\"\n\"var ProfileRedraw2 = 0;\\n\"\n\"var ProfileFps = 0;\\n\"\n\"var ProfileFpsAggr = 0;\\n\"\n\"var ProfileFpsCount = 0;\\n\"\n\"var ProfileLastTimeStamp = new Date();\\n\"\n\"\\n\"\n\"var CSwitchCache = {};\\n\"\n\"var CSwitchOnlyThreads = [];\\n\"\n\"var ProfileData = {};\\n\"\n\"var ProfileStackTime = {};\\n\"\n\"var ProfileStackName = {};\\n\"\n\"var Debug = 1;\\n\"\n\"\\n\"\n\"var g_MaxStack = Array();\\n\"\n\"var g_TypeArray;\\n\"\n\"var g_TimeArray;\\n\"\n\"var g_IndexArray;\\n\"\n\"var g_LabelArray;\\n\"\n\"var LodData = new Array();\\n\"\n\"var NumLodSplits = 10;\\n\"\n\"var SplitMin = 100;\\n\"\n\"var SPLIT_LIMIT = 1e20;\\n\"\n\"var DPR = 1;\\n\"\n\"var DetailedRedrawState = {};\\n\"\n\"var OffscreenData;\\n\"\n\"var DetailedFrameCounter = 0;\\n\"\n\"var Invalidate = 0;\\n\"\n\"var GroupOrder = Array();\\n\"\n\"var ThreadOrder = Array();\\n\"\n\"var TimersGroups = 0;\\n\"\n\"var TimersMeta = 1;\\n\"\n\"var MetaLengths = Array();\\n\"\n\"var MetaLengthsAvg = Array();\\n\"\n\"var MetaLengthsMax = Array();\\n\"\n\"\\n\"\n\"var ZoomActive = 0;\\n\"\n\"\\n\"\n\"var StrGroup = \\\"Group\\\";\\n\"\n\"var StrThread = \\\"Thread\\\";\\n\"\n\"var StrTimer = \\\"Timer\\\";\\n\"\n\"var StrAverage = \\\"Average\\\";\\n\"\n\"var StrMax = \\\"Max\\\";\\n\"\n\"var StrTotal = \\\"Total\\\";\\n\"\n\"var StrMin = \\\"Min\\\";\\n\"\n\"var StrCallAverage = \\\"Call Average\\\";\\n\"\n\"var StrCount = \\\"Count\\\";\\n\"\n\"var StrExclAverage = \\\"Excl Average\\\";\\n\"\n\"var StrExclMax = \\\"Excl Max\\\";\\n\"\n\"\\n\"\n\"\\n\"\n\"function ProfileModeClear()\\n\"\n\"{\\n\"\n\"\tif(ProfileMode)\\n\"\n\"\t{\\n\"\n\"\t\tProfileData = new Object();\\n\"\n\"\t\tProfileStackTime = new Array();\\n\"\n\"\t\tProfileStackName = new Array();\\n\"\n\"\t}\\n\"\n\"}\\n\"\n\"function ProfileEnter(Name)\\n\"\n\"{\\n\"\n\"\tif(ProfileMode)\\n\"\n\"\t{\\n\"\n\"\t\tProfileStackTime.push(new Date());\\n\"\n\"\t\tProfileStackName.push(Name);\\n\"\n\"\t}\\n\"\n\"}\\n\"\n\"function ProfileLeave()\\n\"\n\"{\\n\"\n\"\tif(ProfileMode)\\n\"\n\"\t{\\n\"\n\"\t\tvar Time = new Date();\\n\"\n\"\t\tvar Delta = Time - ProfileStackTime.pop();\\n\"\n\"\t\tvar Name = ProfileStackName.pop();\\n\"\n\"\t\tvar Obj = ProfileData[Name];\\n\"\n\"\t\tif(!Obj)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tObj = new Object();\\n\"\n\"\t\t\tObj.Count = 0;\\n\"\n\"\t\t\tObj.Name = Name;\\n\"\n\"\t\t\tObj.Time = 0;\\n\"\n\"\t\t\tProfileData[Name] = Obj;\\n\"\n\"\t\t}\\n\"\n\"\t\tObj.Time += Delta;\\n\"\n\"\t\tObj.Count += 1;\\n\"\n\"\t}\\n\"\n\"}\\n\"\n\"\\n\"\n\"function ProfilePlot(s)\\n\"\n\"{\\n\"\n\"\tif(ProfileMode)\\n\"\n\"\t{\\n\"\n\"\t\tvar A = ProfileData.Plot;\\n\"\n\"\t\tif(!A)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tProfileData.Plot = Array();\\n\"\n\"\t\t\tA = ProfileData.Plot;\\n\"\n\"\t\t}\\n\"\n\"\t\tif(A.length<10)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tA.push(s);\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"}\\n\"\n\"function ProfileModeDump()\\n\"\n\"{\\n\"\n\"\tfor(var idx in ProfileData)\\n\"\n\"\t{\\n\"\n\"\t\tvar Timer = ProfileData[idx];\\n\"\n\"\t\tconsole.log(Timer.Name + \\\" \\\" + Timer.Time + \\\"ms \\\" + Timer.Count);\\n\"\n\"\t}\\n\"\n\"\\n\"\n\"}\\n\"\n\"function ProfileModeDraw(Canvas)\\n\"\n\"{\\n\"\n\"\tif(ProfileMode)\\n\"\n\"\t{\\n\"\n\"\t\tvar StringArray = [];\\n\"\n\"\t\tfor(var idx in ProfileData)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tif(idx == \\\"Plot\\\")\\n\"\n\"\t\t\t\tcontinue;\\n\"\n\"\t\t\tvar Timer = ProfileData[idx];\\n\"\n\"\t\t\tStringArray.push(Timer.Name);\\n\"\n\"\t\t\tStringArray.push(Timer.Time + \\\"ms\\\");\\n\"\n\"\t\t\tStringArray.push(\\\"#\\\");\\n\"\n\"\t\t\tStringArray.push(\\\"\\\" + Timer.Count);\\n\"\n\"\t\t}\\n\"\n\"\t\tStringArray.push(\\\"debug\\\");\\n\"\n\"\t\tStringArray.push(Debug);\\n\"\n\"\t\tvar Time = new Date();\\n\"\n\"\t\tvar Delta = Time - ProfileLastTimeStamp;\\n\"\n\"\t\tProfileLastTimeStamp = Time;\\n\"\n\"\t\tStringArray.push(\\\"Frame Delta\\\");\\n\"\n\"\t\tStringArray.push(Delta + \\\"ms\\\");\\n\"\n\"\t\tif(ProfileMode == 2)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tProfileFpsAggr += Delta;\\n\"\n\"\t\t\tProfileFpsCount ++ ;\\n\"\n\"\t\t\tvar AggrFrames = 10;\\n\"\n\"\t\t\tif(ProfileFpsCount == AggrFrames)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tProfileFps = 1000 / (ProfileFpsAggr / AggrFrames);\\n\"\n\"\t\t\t\tProfileFpsAggr = 0;\\n\"\n\"\t\t\t\tProfileFpsCount = 0;\\n\"\n\"\t\t\t}\\n\"\n\"\t\t\tStringArray.push(\\\"FPS\\\");\\n\"\n\"\t\t\tStringArray.push(\\\"\\\" + ProfileFps.toFixed(2));\\n\"\n\"\t\t}\\n\"\n\"\t\tStringArray.push(\\\"ProfileRedraw0\\\");\\n\"\n\"\t\tStringArray.push(\\\"\\\" + ProfileRedraw0);\\n\"\n\"\t\tStringArray.push(\\\"ProfileRedraw1\\\");\\n\"\n\"\t\tStringArray.push(\\\"\\\" + ProfileRedraw1);\\n\"\n\"\t\tStringArray.push(\\\"ProfileRedraw2\\\");\\n\"\n\"\t\tStringArray.push(\\\"\\\" + ProfileRedraw2);\\n\"\n\"\t\tProfileRedraw0 = 0;\\n\"\n\"\t\tProfileRedraw1 = 0;\\n\"\n\"\t\tProfileRedraw2 = 0;\\n\"\n\"\\n\"\n\"\\n\"\n\"\t\tfor(var i = 0; i < ProfileData.Plot; ++i)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tStringArray.push(\\\"\\\");\\n\"\n\"\t\t\tStringArray.push(ProfileData.Plot[i]);\\n\"\n\"\t\t}\\n\"\n\"\t\tProfileData.Plot = Array();\\n\"\n\"\t\tDrawToolTip(StringArray, Canvas, 0, 200);\\n\"\n\"\t}\\n\"\n\"}\\n\"\n\"\\n\"\n\"function ToggleDebugMode()\\n\"\n\"{\\n\"\n\"\tProfileMode = (ProfileMode+1)%4;\\n\"\n\"\tconsole.log(\\'Toggle Debug Mode \\' + ProfileMode);\\n\"\n\"}\\n\"\n\"\\n\"\n\"function DetailedTotal()\\n\"\n\"{\\n\"\n\"\tvar Total = 0;\\n\"\n\"\tfor(var i = 0; i < Frames.length; i++)\\n\"\n\"\t{\\n\"\n\"\t\tvar frfr = Frames[i];\\n\"\n\"\t\tTotal += frfr.frameend - frfr.framestart;\\n\"\n\"\t}\\n\"\n\"\treturn Total;\\n\"\n\"}\\n\"\n\"\\n\"\n\"function InitFrameInfo()\\n\"\n\"{\\n\"\n\"\\n\"\n\"\tvar div = document.getElementById(\\'divFrameInfo\\');\\n\"\n\"\tvar txt = \\'\\';\\n\"\n\"\ttxt = txt + \\'Timers View\\' + \\'<br>\\';\\n\"\n\"\ttxt = txt + \\'Frames:\\' + AggregateInfo.Frames +\\'<br>\\';\\n\"\n\"\ttxt = txt + \\'Time:\\' + AggregateInfo.Time.toFixed(2) +\\'ms<br>\\';\\n\"\n\"\ttxt = txt + \\'<hr>\\';\\n\"\n\"\ttxt = txt + \\'Detailed View\\' + \\'<br>\\';\\n\"\n\"\ttxt = txt + \\'Frames:\\' + Frames.length +\\'<br>\\';\\n\"\n\"\ttxt = txt + \\'Time:\\' + DetailedTotal().toFixed(2) +\\'ms<br>\\';\\n\"\n\"\tdiv.innerHTML = txt;\\n\"\n\"}\\n\"\n\"function InitGroups()\\n\"\n\"{\\n\"\n\"\tfor(groupid in GroupInfo)\\n\"\n\"\t{\\n\"\n\"\t\tvar TimerArray = Array();\\n\"\n\"\t\tfor(timerid in TimerInfo)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tif(TimerInfo[timerid].group == groupid)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tTimerArray.push(timerid);\\n\"\n\"\t\t\t}\\n\"\n\"\t\t}\\n\"\n\"\t\tGroupInfo[groupid].TimerArray = TimerArray;\\n\"\n\"\t}\\n\"\n\"}\\n\"\n\"\\n\"\n\"function InitThreadMenu()\\n\"\n\"{\\n\"\n\"\tvar ulThreadMenu = document.getElementById(\\'ThreadSubMenu\\');\\n\"\n\"\tvar MaxLen = 7;\\n\"\n\"\tThreadOrder = CreateOrderArray(ThreadNames, function(a){return a;});\\n\"\n\"\tfor(var idx in ThreadOrder)\\n\"\n\"\t{\\n\"\n\"\t\tvar name = ThreadNames[ThreadOrder[idx]];\\n\"\n\"\t\tvar li = document.createElement(\\'li\\');\\n\"\n\"\t\tif(name.length > MaxLen)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tMaxLen = name.length;\\n\"\n\"\t\t}\\n\"\n\"\t\tli.innerText = name;\\n\"\n\"\t\tvar asText = li.innerHTML;\\n\"\n\"\t\tvar html = \\'<a href=\\\"javascript:void(0)\\\" onclick=\\\"ToggleThread(\\\\'\\' + name + \\'\\\\');\\\">\\' + asText + \\'</a>\\';\\n\"\n\"\t\tli.innerHTML = html;\\n\"\n\"\t\tulThreadMenu.appendChild(li);\\n\"\n\"\t}\\n\"\n\"\tvar LenStr = (5+(1+MaxLen) * (1+FontWidth)) + \\'px\\';\\n\"\n\"\tvar Lis = ulThreadMenu.getElementsByTagName(\\'li\\');\\n\"\n\"\tfor(var i = 0; i < Lis.length; ++i)\\n\"\n\"\t{\\n\"\n\"\t\tLis[i].style[\\'width\\'] = LenStr;\\n\"\n\"\t}\\n\"\n\"}\\n\"\n\"\\n\"\n\"function UpdateThreadMenu()\\n\"\n\"{\\n\"\n\"\tvar ulThreadMenu = document.getElementById(\\'ThreadSubMenu\\');\\n\"\n\"\tvar as = ulThreadMenu.getElementsByTagName(\\'a\\');\\n\"\n\"\tfor(var i = 0; i < as.length; ++i)\\n\"\n\"\t{\\n\"\n\"\t\tvar elem = as[i];\\n\"\n\"\t\tvar inner = elem.innerText;\\n\"\n\"\t\tvar bActive = false;\\n\"\n\"\t\tif(i < 2)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tif(inner == \\'All\\')\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tbActive = ThreadsAllActive;\\n\"\n\"\t\t\t}\\n\"\n\"\t\t}\\n\"\n\"\t\telse\\n\"\n\"\t\t{\\n\"\n\"\t\t\tbActive = ThreadsActive[inner];\\n\"\n\"\t\t}\\n\"\n\"\t\tif(bActive)\\n\"\n\"\t\t{\\n\"\n\"\t\t\telem.style[\\'text-decoration\\'] = \\'underline\\';\\n\"\n\"\t\t}\\n\"\n\"\t\telse\\n\"\n\"\t\t{\\n\"\n\"\t\t\telem.style[\\'text-decoration\\'] = \\'none\\';\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"}\\n\"\n\"\\n\"\n\"function ToggleThread(ThreadName)\\n\"\n\"{\\n\"\n\"\tif(ThreadName)\\n\"\n\"\t{\\n\"\n\"\t\tif(ThreadsActive[ThreadName])\\n\"\n\"\t\t{\\n\"\n\"\t\t\tThreadsActive[ThreadName] = false;\\n\"\n\"\t\t}\\n\"\n\"\t\telse\\n\"\n\"\t\t{\\n\"\n\"\t\t\tThreadsActive[ThreadName] = true;\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"\telse\\n\"\n\"\t{\\n\"\n\"\t\tif(ThreadsAllActive)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tThreadsAllActive = 0;\\n\"\n\"\t\t}\\n\"\n\"\t\telse\\n\"\n\"\t\t{\\n\"\n\"\t\t\tThreadsAllActive = 1;\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"\tInvalidate = 0;\\n\"\n\"\tUpdateThreadMenu();\\n\"\n\"\tWriteCookie();\\n\"\n\"\tDraw(1);\\n\"\n\"\\n\"\n\"}\\n\"\n\"\\n\"\n\"function CreateOrderArray(Source, NameFunc)\\n\"\n\"{\\n\"\n\"\tvar Temp = Array(Source.length);\\n\"\n\"\tfor(var i = 0; i < Source.length; ++i)\\n\"\n\"\t{\\n\"\n\"\t\tTemp[i] = {};\\n\"\n\"\t\tTemp[i].index = i;\\n\"\n\"\t\tTemp[i].namezz = NameFunc(Source[i]).toLowerCase();\\n\"\n\"\t}\\n\"\n\"\tTemp.sort(function(l, r)\\n\"\n\"\t{ \\n\"\n\"\t\tif(r.namezz<l.namezz)\\n\"\n\"\t\t\t{return 1;}\\n\"\n\"\t\tif(l.namezz<r.namezz)\\n\"\n\"\t\t\t{return -1;} \\n\"\n\"\t\treturn 0;\\n\"\n\"\t} );\\n\"\n\"\tvar OrderArray = Array(Source.length);\\n\"\n\"\tfor(var i = 0; i < Source.length; ++i)\\n\"\n\"\t{\\n\"\n\"\t\tOrderArray[i] = Temp[i].index;\\n\"\n\"\t}\\n\"\n\"\treturn OrderArray;\\n\"\n\"}\\n\"\n\"\\n\"\n\"\\n\"\n\"function InitGroupMenu()\\n\"\n\"{\\n\"\n\"\tvar ulGroupMenu = document.getElementById(\\'GroupSubMenu\\');\\n\"\n\"\tvar MaxLen = 7;\\n\"\n\"\tvar MenuArray = Array();\\n\"\n\"\tfor(var i = 0; i < GroupInfo.length; ++i)\\n\"\n\"\t{\\n\"\n\"\t\tvar x = {};\\n\"\n\"\t\tx.IsCategory = 0;\\n\"\n\"\t\tx.category = GroupInfo[i].category;\\n\"\n\"\t\tx.name = GroupInfo[i].name;\\n\"\n\"\t\tx.index = i;\\n\"\n\"\t\tMenuArray.push(x);\\n\"\n\"\t}\\n\"\n\"\tfor(var i = 0; i < CategoryInfo.length; ++i)\\n\"\n\"\t{\\n\"\n\"\t\tvar x = {};\\n\"\n\"\t\tx.IsCategory = 1;\\n\"\n\"\t\tx.category = i;\\n\"\n\"\t\tx.name = CategoryInfo[i];\\n\"\n\"\t\tx.index = i;\\n\"\n\"\t\tMenuArray.push(x);\\n\"\n\"\t}\\n\"\n\"\tvar OrderFunction = function(a){ return a.category + \\\"__\\\" + a.name; };\\n\"\n\"\tvar OrderFunctionMenu = function(a){ return a.IsCategory ? (a.category + \\'\\') : (a.category + \\\"__\\\" + a.name); };\\n\"\n\"\tGroupOrder = CreateOrderArray(GroupInfo, OrderFunction);\\n\"\n\"\tvar MenuOrder = CreateOrderArray(MenuArray, OrderFunctionMenu);\\n\"\n\"\\n\"\n\"\tfor(var idx in MenuOrder)\\n\"\n\"\t{\\n\"\n\"\t\tvar MenuItem = MenuArray[MenuOrder[idx]];\\n\"\n\"\t\tvar name = MenuItem.name;\\n\"\n\"\t\tvar li = document.createElement(\\'li\\');\\n\"\n\"\t\tif(name.length > MaxLen)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tMaxLen = name.length;\\n\"\n\"\t\t}\\n\"\n\"\t\tvar jsfunc = \\'\\';\\n\"\n\"\t\tif(MenuItem.IsCategory)\\n\"\n\"\t\t{\t\t\t\t\\n\"\n\"\t\t\tli.innerText = \\'[\\' + name + \\']\\';\\n\"\n\"\t\t\tjsfunc = \\\"ToggleCategory\\\";\\n\"\n\"\t\t}\\n\"\n\"\t\telse\\n\"\n\"\t\t{\\n\"\n\"\t\t\tli.innerText = name;\\n\"\n\"\t\t\tjsfunc = \\\"ToggleGroup\\\";\\n\"\n\"\t\t}\\n\"\n\"\t\tvar asText = li.innerHTML;\\n\"\n\"\t\tvar html = \\'<a href=\\\"javascript:void(0)\\\" onclick=\\\"\\' + jsfunc + \\'(\\\\'\\' + name + \\'\\\\');\\\">\\' + asText + \\'</a>\\';\\n\"\n\"\t\tli.innerHTML = html;\\n\"\n\"\t\tulGroupMenu.appendChild(li);\\n\"\n\"\t}\\n\"\n\"\tvar LenStr = (5+(1+MaxLen) * FontWidth) + \\'px\\';\\n\"\n\"\tvar Lis = ulGroupMenu.getElementsByTagName(\\'li\\');\\n\"\n\"\tfor(var i = 0; i < Lis.length; ++i)\\n\"\n\"\t{\\n\"\n\"\t\tLis[i].style[\\'width\\'] = LenStr;\\n\"\n\"\t}\\n\"\n\"\tUpdateGroupMenu();\\n\"\n\"}\\n\"\n\"\\n\"\n\"function UpdateGroupMenu()\\n\"\n\"{\\n\"\n\"\tvar ulThreadMenu = document.getElementById(\\'GroupSubMenu\\');\\n\"\n\"\tvar as = ulThreadMenu.getElementsByTagName(\\'a\\');\\n\"\n\"\tfor(var i = 0; i < as.length; ++i)\\n\"\n\"\t{\\n\"\n\"\t\tvar elem = as[i];\\n\"\n\"\t\tvar inner = elem.innerText;\\n\"\n\"\t\tvar bActive = false;\\n\"\n\"\t\tif(i < 2)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tif(inner == \\'All\\')\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tbActive = GroupsAllActive;\\n\"\n\"\t\t\t}\\n\"\n\"\t\t}\\n\"\n\"\t\telse\\n\"\n\"\t\t{\\n\"\n\"\t\t\tvar CategoryString = inner.length>2 ? inner.substring(1, inner.length-2) : \\\"\\\";\\n\"\n\"\t\t\tvar CategoryIdx = CategoryIndex(CategoryString);\\n\"\n\"\t\t\tif(inner[0] == \\'[\\' && inner[inner.length-1] == \\']\\' && CategoryIdx >= 0)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tbActive = IsCategoryActive(CategoryIdx);\\n\"\n\"\t\t\t}\\n\"\n\"\t\t\telse\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tbActive = GroupsActive[inner];\\n\"\n\"\t\t\t}\\n\"\n\"\t\t}\\n\"\n\"\t\tif(bActive)\\n\"\n\"\t\t{\\n\"\n\"\t\t\telem.style[\\'text-decoration\\'] = \\'underline\\';\\n\"\n\"\t\t}\\n\"\n\"\t\telse\\n\"\n\"\t\t{\\n\"\n\"\t\t\telem.style[\\'text-decoration\\'] = \\'none\\';\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"}\\n\"\n\"function CategoryIndex(CategoryName)\\n\"\n\"{\\n\"\n\"\tfor(var i = 0; i < CategoryInfo.length; ++i)\\n\"\n\"\t{\\n\"\n\"\t\tif(CategoryInfo[i] == CategoryName)\\n\"\n\"\t\t{\\n\"\n\"\t\t\treturn i;\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"\treturn -1;\\n\"\n\"}\\n\"\n\"function IsCategoryActive(CategoryIdx)\\n\"\n\"{\\n\"\n\"\tfor(var i = 0; i < GroupInfo.length; ++i)\\n\"\n\"\t{\\n\"\n\"\t\tif(GroupInfo[i].category == CategoryIdx)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tvar Name = GroupInfo[i].name;\\n\"\n\"\t\t\tif(!GroupsActive[Name])\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\treturn false;\\n\"\n\"\t\t\t}\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"\treturn true;\\n\"\n\"\\n\"\n\"}\\n\"\n\"function ToggleCategory(CategoryName)\\n\"\n\"{\\n\"\n\"\tvar CategoryIdx = CategoryIndex(CategoryName);\\n\"\n\"\tif(CategoryIdx < 0)\\n\"\n\"\t\treturn;\\n\"\n\"\tvar CategoryActive = IsCategoryActive(CategoryIdx);\\n\"\n\"\tfor(var i = 0; i < GroupInfo.length; ++i)\\n\"\n\"\t{\\n\"\n\"\t\tif(GroupInfo[i].category == CategoryIdx)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tvar Name = GroupInfo[i].name;\\n\"\n\"\t\t\tif(CategoryActive)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tGroupsActive[Name] = false;\\n\"\n\"\t\t\t}\\n\"\n\"\t\t\telse\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tGroupsActive[Name] = true;\\n\"\n\"\t\t\t}\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"\tUpdateGroupMenu();\\n\"\n\"\tWriteCookie();\\n\"\n\"\tRequestRedraw();\\n\"\n\"}\\n\"\n\"\\n\"\n\"function ToggleGroup(GroupName)\\n\"\n\"{\\n\"\n\"\tif(GroupName)\\n\"\n\"\t{\\n\"\n\"\t\tif(GroupsActive[GroupName])\\n\"\n\"\t\t{\\n\"\n\"\t\t\tGroupsActive[GroupName] = false;\\n\"\n\"\t\t}\\n\"\n\"\t\telse\\n\"\n\"\t\t{\\n\"\n\"\t\t\tGroupsActive[GroupName] = true;\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"\telse\\n\"\n\"\t{\\n\"\n\"\t\tif(GroupsAllActive)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tGroupsAllActive = 0;\\n\"\n\"\t\t}\\n\"\n\"\t\telse\\n\"\n\"\t\t{\\n\"\n\"\t\t\tGroupsAllActive = 1;\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"\tUpdateGroupMenu();\\n\"\n\"\tWriteCookie();\\n\"\n\"\tRequestRedraw();\\n\"\n\"}\\n\"\n\"function UpdateGroupColors()\\n\"\n\"{\\n\"\n\"\tfor(var i = 0; i < TimerInfo.length; ++i)\\n\"\n\"\t{\\n\"\n\"\t\tif(GroupColors)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tTimerInfo[i].color = GroupInfo[TimerInfo[i].group].color;\\n\"\n\"\t\t}\\n\"\n\"\t\telse\\n\"\n\"\t\t{\\n\"\n\"\t\t\tTimerInfo[i].color = TimerInfo[i].timercolor;\\n\"\n\"\t\t}\\n\"\n\"\t\tTimerInfo[i].textcolorindex = InvertColorIndex(TimerInfo[i].color);\\n\"\n\"\t}\\n\"\n\"}\\n\"\n\"\\n\"\n\"function ToggleGroupColors()\\n\"\n\"{\\n\"\n\"\tGroupColors = !GroupColors;\\n\"\n\"\tUpdateGroupColors();\\n\"\n\"\tUpdateOptionsMenu();\\n\"\n\"\tWriteCookie();\\n\"\n\"\tRequestRedraw();\\n\"\n\"}\\n\"\n\"\\n\"\n\"function UpdateOptionsMenu()\\n\"\n\"{\\n\"\n\"\tvar ulTimersMeta = document.getElementById(\\'TimersMeta\\');\\n\"\n\"\tulTimersMeta.style[\\'text-decoration\\'] = TimersMeta ? \\'underline\\' : \\'none\\';\\n\"\n\"\tvar ulGroupColors = document.getElementById(\\'GroupColors\\');\\n\"\n\"\tulGroupColors.style[\\'text-decoration\\'] = GroupColors ? \\'underline\\' : \\'none\\';\\n\"\n\"}\\n\"\n\"\\n\"\n\"function ToggleTimersMeta()\\n\"\n\"{\\n\"\n\"\tTimersMeta = TimersMeta ? 0 : 1;\\n\"\n\"\tWriteCookie();\\n\"\n\"\tUpdateOptionsMenu();\\n\"\n\"\tRequestRedraw();\\n\"\n\"}\\n\"\n\"\\n\"\n\"function ShowHelp(Show, Forever)\\n\"\n\"{\\n\"\n\"\tvar HelpWindow = document.getElementById(\\'helpwindow\\');\\n\"\n\"\tif(Show)\\n\"\n\"\t{\\n\"\n\"\t\tHelpWindow.style[\\'display\\'] = \\'block\\';\\n\"\n\"\t}\\n\"\n\"\telse\\n\"\n\"\t{\\n\"\n\"\t\tHelpWindow.style[\\'display\\'] = \\'none\\';\\n\"\n\"\t}\\n\"\n\"\tif(Forever)\\n\"\n\"\t{\\n\"\n\"\t\tnHideHelp = Show ? 0 : 1;\\n\"\n\"\t\tWriteCookie();\\n\"\n\"\t}\\n\"\n\"}\\n\"\n\"function SetMode(NewMode, Groups)\\n\"\n\"{\\n\"\n\"\tvar buttonTimers = document.getElementById(\\'buttonTimers\\');\\n\"\n\"\tvar buttonDetailed = document.getElementById(\\'buttonDetailed\\');\\n\"\n\"\tvar buttonGroups = document.getElementById(\\'buttonGroups\\');\\n\"\n\"\tvar buttonThreads = document.getElementById(\\'buttonThreads\\');\\n\"\n\"\tvar buttonCounters = document.getElementById(\\'buttonCounters\\');\\n\"\n\"\tvar ilThreads = document.getElementById(\\'ilThreads\\');\\n\"\n\"\tvar ilGroups = document.getElementById(\\'ilGroups\\');\\n\"\n\"\tvar ModeElement = null;\\n\"\n\"\tbuttonTimers.style[\\'text-decoration\\'] = \\'none\\';\\n\"\n\"\tbuttonGroups.style[\\'text-decoration\\'] = \\'none\\';\\n\"\n\"\tbuttonThreads.style[\\'text-decoration\\'] = \\'none\\';\\n\"\n\"\tbuttonDetailed.style[\\'text-decoration\\'] = \\'none\\';\\n\"\n\"\tbuttonCounters.style[\\'text-decoration\\'] = \\'none\\';\\n\"\n\"\\n\"\n\"\\n\"\n\"\tif(NewMode == \\'counters\\' || NewMode == ModeCounters)\\n\"\n\"\t{\\n\"\n\"\t\tbuttonCounters.style[\\'text-decoration\\'] = \\'underline\\';\\n\"\n\"\t\tilThreads.style[\\'display\\'] = \\'none\\';\\n\"\n\"\t\tilGroups.style[\\'display\\'] = \\'none\\';\\n\"\n\"\t\tMode = ModeCounters;\\n\"\n\"\t\tModeElement = buttonCounters;\\n\"\n\"\\n\"\n\"\t}\\n\"\n\"\telse if(NewMode == \\'timers\\' || NewMode == ModeTimers)\\n\"\n\"\t{\\n\"\n\"\t\tTimersGroups = Groups;\\n\"\n\"\t\tbuttonTimers.style[\\'text-decoration\\'] = TimersGroups ? \\'none\\' : \\'underline\\';\\n\"\n\"\t\tbuttonGroups.style[\\'text-decoration\\'] = TimersGroups == 1 ? \\'underline\\' : \\'none\\';\\n\"\n\"\t\tbuttonThreads.style[\\'text-decoration\\'] = TimersGroups == 2 ? \\'underline\\' : \\'none\\';\\n\"\n\"\t\tbuttonDetailed.style[\\'text-decoration\\'] = \\'none\\';\\n\"\n\"\t\tif(TimersGroups == 0)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tilThreads.style[\\'display\\'] = \\'none\\';\\n\"\n\"\t\t}\\n\"\n\"\t\telse\\n\"\n\"\t\t{\\n\"\n\"\t\t\tilThreads.style[\\'display\\'] = \\'block\\';\\n\"\n\"\t\t}\\n\"\n\"\t\tilGroups.style[\\'display\\'] = \\'block\\';\\n\"\n\"\t\tMode = ModeTimers;\\n\"\n\"\t\tModeElement = TimersGroups == 2 ? buttonThreads : TimersGroups == 1 ? buttonGroups : buttonTimers;\\n\"\n\"\\n\"\n\"\t}\\n\"\n\"\telse if(NewMode == \\'detailed\\' || NewMode == ModeDetailed)\\n\"\n\"\t{\\n\"\n\"\t\tbuttonDetailed.style[\\'text-decoration\\'] = \\'underline\\';\\n\"\n\"\t\\n\"\n\"\t\tilThreads.style[\\'display\\'] = \\'block\\';\\n\"\n\"\t\tilGroups.style[\\'display\\'] = \\'none\\';\\n\"\n\"\t\tMode = ModeDetailed;\\n\"\n\"\t\tModeElement = buttonDetailed;\\n\"\n\"\t}\\n\"\n\"\tvar ModeSubMenuText = document.getElementById(\\'ModeSubMenuText\\');\\n\"\n\"\tModeSubMenuText.innerText = \\'Mode[\\' + ModeElement.innerText + \\']\\';\\n\"\n\"\\n\"\n\"\tif(Mode == ModeTimers)\\n\"\n\"\t{\\n\"\n\"\t\tSetFilterInput(FilterInputGroupString, FilterInputTimerString);\\n\"\n\"\t}\\n\"\n\"\telse\\n\"\n\"\t{\\n\"\n\"\t\tShowFilterInput(0);\\n\"\n\"\t}\\n\"\n\"\\n\"\n\"\tWriteCookie();\\n\"\n\"\tRequestRedraw();\\n\"\n\"\\n\"\n\"}\\n\"\n\"\\n\"\n\"function SetReferenceTime(TimeString)\\n\"\n\"{\\n\"\n\"\tReferenceTime = parseInt(TimeString);\\n\"\n\"\tvar ReferenceMenu = document.getElementById(\\'ReferenceSubMenu\\');\\n\"\n\"\tvar Links = ReferenceMenu.getElementsByTagName(\\'a\\');\\n\"\n\"\tfor(var i = 0; i < Links.length; ++i)\\n\"\n\"\t{\\n\"\n\"\t\tif(Links[i].innerHTML.match(\\'^\\' + TimeString))\\n\"\n\"\t\t{\\n\"\n\"\t\t\tLinks[i].style[\\'text-decoration\\'] = \\'underline\\';\\n\"\n\"\t\t}\\n\"\n\"\t\telse\\n\"\n\"\t\t{\\n\"\n\"\t\t\tLinks[i].style[\\'text-decoration\\'] = \\'none\\';\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"\tWriteCookie();\\n\"\n\"\tRequestRedraw();\\n\"\n\"\\n\"\n\"}\\n\"\n\"\\n\"\n\"function ToggleContextSwitch()\\n\"\n\"{\\n\"\n\"\tSetContextSwitch(nContextSwitchEnabled ? 0 : 1);\\n\"\n\"}\\n\"\n\"function SetContextSwitch(Enabled)\\n\"\n\"{\\n\"\n\"\tnContextSwitchEnabled = Enabled ? 1 : 0;\\n\"\n\"\tvar ReferenceMenu = document.getElementById(\\'OptionsMenu\\');\\n\"\n\"\tvar Links = ReferenceMenu.getElementsByTagName(\\'a\\');\\n\"\n\"\tLinks[0].style[\\'text-decoration\\'] = nContextSwitchEnabled ? \\'underline\\' : \\'none\\';\\n\"\n\"\tWriteCookie();\\n\"\n\"\tRequestRedraw();\\n\"\n\"}\\n\"\n\"\\n\"\n\"function ToggleDebug()\\n\"\n\"{\\n\"\n\"\tDebug = (Debug + 1) % 2;\\n\"\n\"}\\n\"\n\"\\n\"\n\"function ToggleDisableMerge()\\n\"\n\"{\\n\"\n\"\tDisableMerge = DisableMerge ? 0 : 1;\\n\"\n\"\tvar ReferenceMenu = document.getElementById(\\'OptionsMenu\\');\\n\"\n\"\tvar Links = ReferenceMenu.getElementsByTagName(\\'a\\');\\n\"\n\"\tif(DisableMerge)\\n\"\n\"\t{\\n\"\n\"\t\tLinks[1].style[\\'text-decoration\\'] = \\'underline\\';\\n\"\n\"\t}\\n\"\n\"\telse\\n\"\n\"\t{\\n\"\n\"\t\tLinks[1].style[\\'text-decoration\\'] = \\'none\\';\\n\"\n\"\t}\\n\"\n\"\\n\"\n\"}\\n\"\n\"\\n\"\n\"function ToggleDisableLod()\\n\"\n\"{\\n\"\n\"\tDisableLod = DisableLod ? 0 : 1;\\n\"\n\"\tvar ReferenceMenu = document.getElementById(\\'OptionsMenu\\');\\n\"\n\"\tvar Links = ReferenceMenu.getElementsByTagName(\\'a\\');\\n\"\n\"\tif(DisableLod)\\n\"\n\"\t{\\n\"\n\"\t\tLinks[2].style[\\'text-decoration\\'] = \\'underline\\';\\n\"\n\"\t}\\n\"\n\"\telse\\n\"\n\"\t{\\n\"\n\"\t\tLinks[2].style[\\'text-decoration\\'] = \\'none\\';\\n\"\n\"\t}\\n\"\n\"\\n\"\n\"}\\n\"\n\"\\n\"\n\"function GatherHoverMetaCounters(TimerIndex, StartIndex, nLog, nFrameLast)\\n\"\n\"{\\n\"\n\"\tvar HoverInfo = new Object();\\n\"\n\"\tvar StackPos = 1;\\n\"\n\"\t//search backwards, count meta counters \\n\"\n\"\tfor(var i = nFrameLast; i >= 0; i--)\\n\"\n\"\t{\\n\"\n\"\t\tvar fr = Frames[i];\\n\"\n\"\t\tvar ts = fr.ts[nLog];\\n\"\n\"\t\tvar ti = fr.ti[nLog];\\n\"\n\"\t\tvar tt = fr.tt[nLog];\\n\"\n\"\t\tvar start = i == nFrameLast ? StartIndex-1 : ts.length-1;\\n\"\n\"\\n\"\n\"\t\tfor(var j = start; j >= 0; j--)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tvar type = tt[j];\\n\"\n\"\t\t\tvar index = ti[j];\\n\"\n\"\t\t\tvar time = ts[j];\\n\"\n\"\t\t\tif(type == 1)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tStackPos--;\\n\"\n\"\t\t\t\tif(StackPos == 0 && index == TimerIndex)\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\treturn HoverInfo;\\n\"\n\"\t\t\t\t}\\n\"\n\"\t\t\t}\\n\"\n\"\t\t\telse if(type == 0)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tStackPos++;\\n\"\n\"\t\t\t}\\n\"\n\"\t\t\telse if(type >= 8)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tvar nMetaCount = type - 8;\\n\"\n\"\t\t\t\tvar nMetaIndex = MetaNames[index];\\n\"\n\"\t\t\t\tif(nMetaIndex in HoverInfo)\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\tHoverInfo[nMetaIndex] += nMetaCount;\\n\"\n\"\t\t\t\t}\\n\"\n\"\t\t\t\telse\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\tHoverInfo[nMetaIndex] = nMetaCount;\\n\"\n\"\t\t\t\t}\\n\"\n\"\t\t\t}\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"}\\n\"\n\"\\n\"\n\"function GatherHoverLabels(TimerIndex, StartIndex, nLog, nFrameLast)\\n\"\n\"{\\n\"\n\"\tvar HoverInfo = [];\\n\"\n\"\tvar StackPos = 1;\\n\"\n\"\t//search backwards, aggregate labels\\n\"\n\"\tfor(var i = nFrameLast; i >= 0; i--)\\n\"\n\"\t{\\n\"\n\"\t\tvar fr = Frames[i];\\n\"\n\"\t\tvar ts = fr.ts[nLog];\\n\"\n\"\t\tvar ti = fr.ti[nLog];\\n\"\n\"\t\tvar tt = fr.tt[nLog];\\n\"\n\"\t\tvar tl = fr.tl[nLog];\\n\"\n\"\t\tvar start = i == nFrameLast ? StartIndex-1 : ts.length-1;\\n\"\n\"\\n\"\n\"\t\tfor(var j = start; j >= 0; j--)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tvar type = tt[j];\\n\"\n\"\t\t\tvar index = ti[j];\\n\"\n\"\t\t\tvar time = ts[j];\\n\"\n\"\t\t\tif(type == 1)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tStackPos--;\\n\"\n\"\t\t\t\tif(StackPos == 0 && index == TimerIndex)\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\treturn HoverInfo.reverse();\\n\"\n\"\t\t\t\t}\\n\"\n\"\t\t\t}\\n\"\n\"\t\t\telse if(type == 0)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tStackPos++;\\n\"\n\"\t\t\t}\\n\"\n\"\t\t\telse if (type == 3 && StackPos == 1)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tvar Label = tl[index];\\n\"\n\"\t\t\t\tHoverInfo.push(Label ? Label : \\\"??\\\");\\n\"\n\"\t\t\t}\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"}\\n\"\n\"\\n\"\n\"function CalculateTimers(GroupInfo, TimerInfo, nFrameFirst, nFrameLast, nToken, nGroup)\\n\"\n\"{\\n\"\n\"\tif(!nFrameFirst || nFrameFirst < 0)\\n\"\n\"\t\tnFrameFirst = 0;\\n\"\n\"\tif(!nFrameLast || nFrameLast > Frames.length)\\n\"\n\"\t\tnFrameLast = Frames.length;\\n\"\n\"\tvar FrameCount = nFrameLast - nFrameFirst;\\n\"\n\"\tif(0 == FrameCount)\\n\"\n\"\t\treturn;\\n\"\n\"\tfor(var j = 0; j < GroupInfo.length; j++)\\n\"\n\"\t{\\n\"\n\"\t\tGroupInfo[j].Sum = 0;\\n\"\n\"\t\tGroupInfo[j].FrameMax = 0;\\n\"\n\"\t}\\n\"\n\"\tfor(var j = 0; j < TimerInfo.length; j++)\\n\"\n\"\t{\\n\"\n\"\t\tTimerInfo[j].CallCount = 0;\\n\"\n\"\t\tTimerInfo[j].Sum = 0;\\n\"\n\"\t\tTimerInfo[j].ExclusiveSum = 0;\\n\"\n\"\t\tTimerInfo[j].Max = 0;\\n\"\n\"\t\tTimerInfo[j].FrameMax = 0;\\n\"\n\"\t\tTimerInfo[j].ExclusiveFrameMax = 0;\\n\"\n\"\t}\\n\"\n\"\\n\"\n\"\tvar nNumLogs = Frames[0].ts.length;\\n\"\n\"\tvar StackPosArray = Array(nNumLogs);\\n\"\n\"\tvar StackArray = Array(nNumLogs);\\n\"\n\"\tvar StackChildArray = Array(nNumLogs);\\n\"\n\"\tvar GroupPosArray = Array(nNumLogs);\\n\"\n\"\tfor(var i = 0; i < nNumLogs; ++i)\\n\"\n\"\t{\\n\"\n\"\t\tStackPosArray[i] = 0;\\n\"\n\"\t\tStackArray[i] = Array(20);\\n\"\n\"\t\tStackChildArray[i] = Array(20);\\n\"\n\"\t\tGroupPosArray[i] = Array(GroupInfo.length);\\n\"\n\"\\n\"\n\"\t\tvar GroupPos = GroupPosArray[i];\\n\"\n\"\t\tfor(var j = 0; j < GroupInfo.length; j++)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tGroupPos[j] = 0;\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"\\n\"\n\"\tfor(var i = nFrameFirst; i < nFrameLast; i++)\\n\"\n\"\t{\\n\"\n\"\t\tfor(var j = 0; j < GroupInfo.length; j++)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tGroupInfo[j].FrameSum = 0;\\n\"\n\"\t\t}\\n\"\n\"\t\tfor(var j = 0; j < TimerInfo.length; j++)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tTimerInfo[j].FrameSum = 0;\\n\"\n\"\t\t\tTimerInfo[j].ExclusiveFrameSum = 0;\\n\"\n\"\t\t}\\n\"\n\"\\n\"\n\"\t\tvar fr = Frames[i];\\n\"\n\"\t\tfor(nLog = 0; nLog < nNumLogs; nLog++)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tvar StackPos = StackPosArray[nLog];\\n\"\n\"\t\t\tvar Stack = StackArray[nLog];\\n\"\n\"\t\t\tvar StackChild = StackChildArray[nLog];\\n\"\n\"\t\t\tvar GroupPos = GroupPosArray[nLog];\\n\"\n\"\t\t\tvar ts = fr.ts[nLog];\\n\"\n\"\t\t\tvar ti = fr.ti[nLog];\\n\"\n\"\t\t\tvar tt = fr.tt[nLog];\\n\"\n\"\t\t\tvar count = ts.length;\\n\"\n\"\t\t\tfor(j = 0; j < count; j++)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tvar type = tt[j];\\n\"\n\"\t\t\t\tvar index = ti[j];\\n\"\n\"\t\t\t\tvar time = ts[j];\\n\"\n\"\t\t\t\tif(type == 1) //enter\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\t//push\\n\"\n\"\t\t\t\t\tStack[StackPos] = time;\\n\"\n\"\t\t\t\t\tStackPos++;\\n\"\n\"\t\t\t\t\tStackChild[StackPos] = 0;\\n\"\n\"\\n\"\n\"\t\t\t\t\tvar groupid = TimerInfo[index].group;\\n\"\n\"\t\t\t\t\tGroupPos[groupid]++;\\n\"\n\"\t\t\t\t}\\n\"\n\"\t\t\t\telse if(type == 0) // leave\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\tvar TimeDelta, TimeDeltaExclusive, TimeStart;\\n\"\n\"\t\t\t\t\tif(StackPos>0)\\n\"\n\"\t\t\t\t\t{\\n\"\n\"\t\t\t\t\t\tStackPos--;\\n\"\n\"\t\t\t\t\t\tTimeStart = Stack[StackPos];\\n\"\n\"\t\t\t\t\t\tTimeDelta = time - Stack[StackPos];\\n\"\n\"\t\t\t\t\t\tTimeDeltaExclusive = TimeDelta - StackChild[StackPos+1];\\n\"\n\"\t\t\t\t\t\tStackChild[StackPos] += TimeDelta;\\n\"\n\"\t\t\t\t\t}\\n\"\n\"\t\t\t\t\telse\\n\"\n\"\t\t\t\t\t{\\n\"\n\"\t\t\t\t\t\tTimeStart = Frames[nFrameFirst].framestart;\\n\"\n\"\t\t\t\t\t\tTimeDelta = time - Frames[nFrameFirst].framestart;\\n\"\n\"\t\t\t\t\t\tTimeDeltaExclusive = TimeDelta;\\n\"\n\"\t\t\t\t\t}\\n\"\n\"\\n\"\n\"\t\t\t\t\tif(nToken < 0 || nToken == index)\\n\"\n\"\t\t\t\t\t{\\n\"\n\"\t\t\t\t\t\tTimerInfo[index].CallCount++;\\n\"\n\"\t\t\t\t\t\tTimerInfo[index].FrameSum += TimeDelta;\\n\"\n\"\t\t\t\t\t\tTimerInfo[index].ExclusiveFrameSum += TimeDeltaExclusive;\\n\"\n\"\t\t\t\t\t\tTimerInfo[index].Sum += TimeDelta;\\n\"\n\"\t\t\t\t\t\tTimerInfo[index].ExclusiveSum += TimeDeltaExclusive;\\n\"\n\"\t\t\t\t\t\tif(TimeDelta > TimerInfo[index].Max)\\n\"\n\"\t\t\t\t\t\t{\\n\"\n\"\t\t\t\t\t\t\tTimerInfo[index].Max = TimeDelta;\\n\"\n\"\t\t\t\t\t\t\tTimerInfo[index].worst = TimeDelta;\\n\"\n\"\t\t\t\t\t\t\tTimerInfo[index].worststart = TimeStart;\\n\"\n\"\t\t\t\t\t\t\tTimerInfo[index].worstend = time;\\n\"\n\"\t\t\t\t\t\t\tTimerInfo[index].worstthread = nLog;\\n\"\n\"\t\t\t\t\t\t}\\n\"\n\"\t\t\t\t\t}\\n\"\n\"\\n\"\n\"\t\t\t\t\tvar groupid = TimerInfo[index].group;\\n\"\n\"\t\t\t\t\tif(nGroup < 0 || nGroup == groupid)\\n\"\n\"\t\t\t\t\t{\\n\"\n\"\t\t\t\t\t\tif(GroupPos[groupid] > 0)\\n\"\n\"\t\t\t\t\t\t{\\n\"\n\"\t\t\t\t\t\t\tGroupPos[groupid]--;\\n\"\n\"\t\t\t\t\t\t}\\n\"\n\"\t\t\t\t\t\tif(GroupPos[groupid] == 0)\\n\"\n\"\t\t\t\t\t\t{\\n\"\n\"\t\t\t\t\t\t\tGroupInfo[groupid].Sum += TimeDelta;\\n\"\n\"\t\t\t\t\t\t\tGroupInfo[groupid].FrameSum += TimeDelta;\\n\"\n\"\t\t\t\t\t\t}\\n\"\n\"\t\t\t\t\t}\\n\"\n\"\t\t\t\t}\\n\"\n\"\t\t\t\telse\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\t//meta\\n\"\n\"\t\t\t\t}\\n\"\n\"\t\t\t}\\n\"\n\"\t\t\tStackPosArray[nLog] = StackPos;\\n\"\n\"\t\t}\\n\"\n\"\t\tfor(var j = 0; j < GroupInfo.length; j++)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tif(GroupInfo[j].FrameSum > GroupInfo[j].FrameMax)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tGroupInfo[j].FrameMax = GroupInfo[j].FrameSum;\\n\"\n\"\t\t\t}\\n\"\n\"\t\t}\\n\"\n\"\t\tfor(var j = 0; j < TimerInfo.length; j++)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tif(TimerInfo[j].FrameSum > TimerInfo[j].FrameMax)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tTimerInfo[j].FrameMax = TimerInfo[j].FrameSum;\\n\"\n\"\t\t\t}\\n\"\n\"\t\t\tif(TimerInfo[j].ExclusiveFrameSum > TimerInfo[j].ExclusiveFrameMax)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tTimerInfo[j].ExclusiveFrameMax = TimerInfo[j].ExclusiveFrameSum;\\n\"\n\"\t\t\t}\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"\\n\"\n\"\tfor(var j = 0; j < GroupInfo.length; j++)\\n\"\n\"\t{\\n\"\n\"\t\tGroupInfo[j].FrameAverage = (GroupInfo[j].Sum / FrameCount);\\n\"\n\"\t}\\n\"\n\"\tfor(var j = 0; j < TimerInfo.length; j++)\\n\"\n\"\t{\\n\"\n\"\t\tTimerInfo[j].CallAverage = (TimerInfo[j].Sum / TimerInfo[j].CallCount);\\n\"\n\"\t\tTimerInfo[j].FrameAverage = (TimerInfo[j].Sum / FrameCount);\\n\"\n\"\t\tTimerInfo[j].ExclusiveFrameAverage = (TimerInfo[j].ExclusiveSum / FrameCount);\\n\"\n\"\t}\\n\"\n\"}\\n\"\n\"\\n\"\n\"function PreprocessCalculateAllTimers()\\n\"\n\"{\\n\"\n\"\tProfileEnter(\\\"PreprocessCalculateAllTimers\\\");\\n\"\n\"\tCalculateTimers(GroupInfo, TimerInfo, 0, Frames.length, -1, -1);\\n\"\n\"\tProfileLeave();\\n\"\n\"}\\n\"\n\"\\n\"\n\"var FlashFrames = 10;\\n\"\n\"var FlashFrameCounter = 0;\\n\"\n\"var FlashMessage = \\'\\';\\n\"\n\"function TimeString(Diff)\\n\"\n\"{\\n\"\n\"\tvar DiffString = \\\"0 sec\\\";\\n\"\n\"\tvar DiffTable = [1,60,60*60,60*60*24];\\n\"\n\"\tvar DiffNameTable = [\\\"sec\\\", \\\"min\\\", \\\"hr\\\", \\\"day\\\"];\\n\"\n\"\tfor(var i = 0; i < DiffTable.length; ++i)\\n\"\n\"\t{\\n\"\n\"\t\tif(Diff >= DiffTable[i])\\n\"\n\"\t\t{\\n\"\n\"\t\t\tDiffString = Math.floor(Diff / DiffTable[i]) + \\\" \\\" + DiffNameTable[i];\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"\treturn DiffString;\\n\"\n\"\\n\"\n\"}\\n\"\n\"function ShowFlashMessage(Message, FrameCount)\\n\"\n\"{\\n\"\n\"\tFlashMessage = Message;\\n\"\n\"\tFlashFrameCounter = FrameCount;\\n\"\n\"}\\n\"\n\"function OnPageReady()\\n\"\n\"{\\n\"\n\"\tvar DumpDate = DumpUtcCaptureTime;\\n\"\n\"\tvar CurrentDate = Date.now() / 1000;\\n\"\n\"\tvar Diff = CurrentDate - DumpDate;\\n\"\n\"\tvar Limit = 10*60;//flash old message when loading captures older than 10 minutes \\n\"\n\"\tif(Diff > Limit)\\n\"\n\"\t{\\n\"\n\"\t\tShowFlashMessage(\\\"Captured \\\" + TimeString(Diff) + \\\" ago\\\", 100);\\n\"\n\"\t}\\n\"\n\"\tif(!nHideHelp)\\n\"\n\"\t{\\n\"\n\"\t\tShowHelp(1,0);\\n\"\n\"\t}\\n\"\n\"}\\n\"\n\"\\n\"\n\"function DrawFlashMessage(context)\\n\"\n\"{\\n\"\n\"\tif(FlashFrameCounter > 0)\\n\"\n\"\t{\\n\"\n\"\t\tif(FlashFrameCounter>1)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tvar FlashPrc = Math.sin(FlashFrameCounter / FlashFrames);\\n\"\n\"\t\t\tcontext.font = FontFlash;\\n\"\n\"\t\t\tcontext.globalAlpha = FlashPrc * 0.35 + 0.5;\\n\"\n\"\t\t\tcontext.textAlign = \\'center\\';\\n\"\n\"\t\t\tcontext.fillStyle = \\'red\\';\\n\"\n\"\t\t\tcontext.fillText(FlashMessage, nWidth * 0.5, 50);\\n\"\n\"\t\t\tcontext.globalAlpha = 1;\\n\"\n\"\t\t\tcontext.textAlign = \\'left\\';\\n\"\n\"\t\t\tcontext.font = Font;\\n\"\n\"\t\t}\\n\"\n\"\t\tFlashFrameCounter -= 1;\\n\"\n\"\\n\"\n\"\t}\\n\"\n\"}\\n\"\n\"\\n\"\n\"function DrawCaptureInfo(context)\\n\"\n\"{\\n\"\n\"\tcontext.fillStyle = \\'white\\';\\n\"\n\"\tcontext.textAlign = \\'right\\';\\n\"\n\"\tcontext.font = Font;\\n\"\n\"\tvar DumpDate = DumpUtcCaptureTime;\\n\"\n\"\tvar CurrentDate = Date.now() / 1000;\\n\"\n\"\tvar Diff = CurrentDate - DumpDate;\\n\"\n\"\tvar DiffString = TimeString(Diff) + \\\" ago\\\";\\n\"\n\"\tcontext.fillText(new Date(DumpDate*1000).toLocaleString(), nWidth, FontHeight);\\n\"\n\"\tif(Mode == ModeTimers)\\n\"\n\"\t{\\n\"\n\"\t\tcontext.fillText(\\\"Timer Frames: \\\" + AggregateInfo.Frames, nWidth, FontHeight*2);\\n\"\n\"\t}\\n\"\n\"\telse\\n\"\n\"\t{\\n\"\n\"\t\tcontext.fillText(\\\"Detailed Frames \\\"+ Frames.length, nWidth, FontHeight*2);\\n\"\n\"\t}\\n\"\n\"\tcontext.fillText(DumpHost, nWidth, FontHeight*3);\\n\"\n\"\tcontext.fillText(DiffString, nWidth, FontHeight*4);\\n\"\n\"\tcontext.textAlign = \\'left\\';\\n\"\n\"\tDrawFlashMessage(context);\\n\"\n\"}\\n\"\n\"\\n\"\n\"function DrawDetailedFrameHistory()\\n\"\n\"{\\n\"\n\"\tProfileEnter(\\\"DrawDetailedFrameHistory\\\");\\n\"\n\"\tvar x = HistoryViewMouseX;\\n\"\n\"\\n\"\n\"\tvar context = CanvasHistory.getContext(\\'2d\\');\\n\"\n\"\tcontext.clearRect(0, 0, CanvasHistory.width, CanvasHistory.height);\\n\"\n\"\\n\"\n\"\tvar fHeight = nHistoryHeight;\\n\"\n\"\tvar fWidth = nWidth / Frames.length;\\n\"\n\"\tvar fHeightScale = fHeight / ReferenceTime;\\n\"\n\"\tvar fX = 0;\\n\"\n\"\tvar FrameIndex = -1;\\n\"\n\"\tvar MouseDragging = MouseDragState != MouseDragOff;\\n\"\n\"\tRangeCpuHistory = RangeInit();\\n\"\n\"\tRangeGpuHistory = RangeInit()\\n\"\n\"\\n\"\n\"\tvar FrameFirst = -1;\\n\"\n\"\tvar FrameLast = nWidth;\\n\"\n\"\tvar fDetailedOffsetEnd = fDetailedOffset + fDetailedRange;\\n\"\n\"\tfor(i = 0; i < Frames.length; i++)\\n\"\n\"\t{\\n\"\n\"\t\tvar fMs = Frames[i].frameend - Frames[i].framestart;\\n\"\n\"\t\tif(fDetailedOffset <= Frames[i].frameend && fDetailedOffset >= Frames[i].framestart)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tvar lerp = (fDetailedOffset - Frames[i].framestart) / (Frames[i].frameend - Frames[i].framestart);\\n\"\n\"\t\t\tFrameFirst = fX + fWidth * lerp;\\n\"\n\"\t\t}\\n\"\n\"\t\tif(fDetailedOffsetEnd <= Frames[i].frameend && fDetailedOffsetEnd >= Frames[i].framestart)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tvar lerp = (fDetailedOffsetEnd - Frames[i].framestart) / (Frames[i].frameend - Frames[i].framestart);\\n\"\n\"\t\t\tFrameLast = fX + fWidth * lerp;\\n\"\n\"\t\t}\\n\"\n\"\t\tvar fH = fHeightScale * fMs;\\n\"\n\"\t\tvar bMouse = x > fX && x < fX + fWidth;\\n\"\n\"\t\tif(bMouse && !MouseDragging)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tcontext.fillStyle = FRAME_HISTORY_COLOR_GPU;\\n\"\n\"\t\t\tRangeCpuHistory.Begin = Frames[i].framestart;\\n\"\n\"\t\t\tRangeCpuHistory.End = Frames[i].frameend;\\n\"\n\"\t\t\tif(Frames[i].framestartgpu)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tRangeGpuHistory.Begin = Frames[i].framestartgpu;\\n\"\n\"\t\t\t\tRangeGpuHistory.End = Frames[i].frameendgpu;\\n\"\n\"\t\t\t}\\n\"\n\"\t\t\tFrameIndex = i;\\n\"\n\"\t\t}\\n\"\n\"\t\telse\\n\"\n\"\t\t{\\n\"\n\"\t\t\tcontext.fillStyle = FRAME_HISTORY_COLOR_CPU;\\n\"\n\"\t\t}\\n\"\n\"\t\tcontext.fillRect(fX, fHeight - fH, fWidth-1, fH);\\n\"\n\"\t\tfX += fWidth;\\n\"\n\"\t}\\n\"\n\"\\n\"\n\"\tvar fRangeHistoryBegin = FrameFirst;\\n\"\n\"\tvar fRangeHistoryEnd = FrameLast;\\n\"\n\"\tvar X = fRangeHistoryBegin;\\n\"\n\"\tvar Y = 0;\\n\"\n\"\tvar W = fRangeHistoryEnd - fRangeHistoryBegin;\\n\"\n\"\tcontext.globalAlpha = 0.35;\\n\"\n\"\tcontext.fillStyle = \\'#009900\\';\\n\"\n\"\tcontext.fillRect(X, Y, W, fHeight);\\n\"\n\"\tcontext.globalAlpha = 1;\\n\"\n\"\tcontext.strokeStyle = \\'#00ff00\\';\\n\"\n\"\tcontext.beginPath();\\n\"\n\"\tcontext.moveTo(X, Y);\\n\"\n\"\tcontext.lineTo(X, Y+fHeight);\\n\"\n\"\tcontext.moveTo(X+W, Y);\\n\"\n\"\tcontext.lineTo(X+W, Y+fHeight);\\n\"\n\"\tcontext.stroke();\\n\"\n\"\\n\"\n\"\\n\"\n\"\\n\"\n\"\\n\"\n\"\tDrawCaptureInfo(context);\\n\"\n\"\\n\"\n\"\tif(FrameIndex>=0 && !MouseDragging)\\n\"\n\"\t{\\n\"\n\"\t\tvar StringArray = [];\\n\"\n\"\t\tStringArray.push(\\\"Frame\\\");\\n\"\n\"\t\tStringArray.push(\\\"\\\" + FrameIndex);\\n\"\n\"\t\tStringArray.push(\\\"Time\\\");\\n\"\n\"\t\tStringArray.push(\\\"\\\" + (Frames[FrameIndex].frameend - Frames[FrameIndex].framestart).toFixed(3));\\n\"\n\"\\n\"\n\"\t\tDrawToolTip(StringArray, CanvasHistory, HistoryViewMouseX, HistoryViewMouseY+20);\\n\"\n\"\\n\"\n\"\t}\\n\"\n\"\tProfileLeave();\\n\"\n\"}\\n\"\n\"function TimeToMsString(Time)\\n\"\n\"{\\n\"\n\"\treturn Time.toFixed(3) + \\\"ms\\\";\\n\"\n\"}\\n\"\n\"function TimeToString(Time)\\n\"\n\"{\\n\"\n\"\tif(Time > 1000)\\n\"\n\"\t{\\n\"\n\"\t\treturn (Time/1000.0).toFixed(0) +\\\"s\\\";\\n\"\n\"\t}\\n\"\n\"\telse if(Time > 0.9)\\n\"\n\"\t{\\n\"\n\"\t\treturn Time.toFixed(0) + \\\"ms\\\";\\n\"\n\"\t}\\n\"\n\"\telse if(Time > 0.0009)\\n\"\n\"\t{\\n\"\n\"\t\treturn (Time*1000).toFixed(0) + \\\"us\\\";\\n\"\n\"\t}\\n\"\n\"\telse\\n\"\n\"\t{\\n\"\n\"\t\treturn (Time*1000000).toFixed(0) + \\\"ns\\\";\\n\"\n\"\t}\\n\"\n\"}\\n\"\n\"\\n\"\n\"function DrawDetailedBackground(context)\\n\"\n\"{\\n\"\n\"\tvar fMs = fDetailedRange;\\n\"\n\"\tvar fMsEnd = fMs + fDetailedOffset;\\n\"\n\"\tvar fMsToScreen = nWidth / fMs;\\n\"\n\"\tvar fRate = Math.floor(2*((Math.log(fMs)/Math.log(10))-1))/2;\\n\"\n\"\tvar fStep = Math.pow(10, fRate);\\n\"\n\"\tvar fRcpStep = 1.0 / fStep;\\n\"\n\"\tvar nColorIndex = Math.floor(fDetailedOffset * fRcpStep) % 2;\\n\"\n\"\tif(nColorIndex < 0)\\n\"\n\"\t\tnColorIndex = -nColorIndex;\\n\"\n\"\tvar fStart = Math.floor(fDetailedOffset * fRcpStep) * fStep;\\n\"\n\"\tvar fHeight = CanvasDetailedView.height;\\n\"\n\"\tvar fScaleX = nWidth / fDetailedRange; \\n\"\n\"\tvar HeaderString = TimeToString(fStep);\\n\"\n\"\tcontext.textAlign = \\'center\\';\\n\"\n\"\tfor(f = fStart; f < fMsEnd; )\\n\"\n\"\t{\\n\"\n\"\t\tvar fNext = f + fStep;\\n\"\n\"\t\tvar X = (f - fDetailedOffset) * fScaleX;\\n\"\n\"\t\tvar W = (fNext-f)*fScaleX;\\n\"\n\"\t\tcontext.fillStyle = nBackColors[nColorIndex];\\n\"\n\"\t\tcontext.fillRect(X, 0, W+2, fHeight);\\n\"\n\"\t\tnColorIndex = 1 - nColorIndex;\\n\"\n\"\t\tcontext.fillStyle = \\'#777777\\'\\n\"\n\"\t\tcontext.fillText(HeaderString, X + W * 0.5, 10);\\n\"\n\"\t\tcontext.fillText(HeaderString, X + W * 0.5, nHeight - 10);\\n\"\n\"\t\tf = fNext;\\n\"\n\"\t}\\n\"\n\"\tcontext.textAlign = \\'left\\';\\n\"\n\"\tvar fScaleX = nWidth / fDetailedRange; \\n\"\n\"\tcontext.globalAlpha = 0.5;\\n\"\n\"\tcontext.strokeStyle = \\'#bbbbbb\\';\\n\"\n\"\tcontext.beginPath();\\n\"\n\"\tfor(var i = 0; i < Frames.length; i++)\\n\"\n\"\t{\\n\"\n\"\t\tvar frfr = Frames[i];\\n\"\n\"\t\tif(frfr.frameend < fDetailedOffset || frfr.framestart > fDetailedOffset + fDetailedRange)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tcontinue;\\n\"\n\"\t\t}\\n\"\n\"\t\tvar X = (frfr.framestart - fDetailedOffset) * fScaleX;\\n\"\n\"\t\tif(X >= 0 && X < nWidth)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tcontext.moveTo(X, 0);\\n\"\n\"\t\t\tcontext.lineTo(X, nHeight);\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"\tcontext.stroke();\\n\"\n\"\tcontext.globalAlpha = 1;\\n\"\n\"\\n\"\n\"}\\n\"\n\"function DrawToolTip(StringArray, Canvas, x, y, color)\\n\"\n\"{\\n\"\n\"\tvar context = Canvas.getContext(\\'2d\\');\\n\"\n\"\tcontext.font = Font;\\n\"\n\"\tvar WidthArray = Array(StringArray.length);\\n\"\n\"\tvar nMaxWidth = 0;\\n\"\n\"\tvar nHeight = 0;\\n\"\n\"\tfor(i = 0; i < StringArray.length; i += 2)\\n\"\n\"\t{\\n\"\n\"\t\tvar nWidth0 = context.measureText(StringArray[i]).width;\\n\"\n\"\t\tvar nWidth1 = context.measureText(StringArray[i+1]).width;\\n\"\n\"\t\tvar nSum = nWidth0 + nWidth1;\\n\"\n\"\t\tWidthArray[i] = nWidth0;\\n\"\n\"\t\tWidthArray[i+1] = nWidth1;\\n\"\n\"\t\tif(nSum > nMaxWidth)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tnMaxWidth = nSum;\\n\"\n\"\t\t}\\n\"\n\"\t\tnHeight += BoxHeight;\\n\"\n\"\t}\\n\"\n\"\tnMaxWidth += 15;\\n\"\n\"\t//bounds check.\\n\"\n\"\tvar CanvasRect = Canvas.getBoundingClientRect();\\n\"\n\"\tif(y + nHeight > CanvasRect.height)\\n\"\n\"\t{\\n\"\n\"\t\ty = CanvasRect.height - nHeight;\\n\"\n\"\t\tx += 20;\\n\"\n\"\t}\\n\"\n\"\tif(x + nMaxWidth > CanvasRect.width)\\n\"\n\"\t{\\n\"\n\"\t\tx = CanvasRect.width - nMaxWidth;\\n\"\n\"\t}\\n\"\n\"\\n\"\n\"\tcontext.fillStyle = color ? color : \\'black\\';\\n\"\n\"\tcontext.fillRect(x-2, y-1, nMaxWidth+4, nHeight+2);\\n\"\n\"\tcontext.fillStyle = \\'black\\';\\n\"\n\"\tcontext.fillRect(x-1, y, nMaxWidth+2, nHeight);\\n\"\n\"\tcontext.fillStyle = \\'white\\';\\n\"\n\"\\n\"\n\"\tvar XPos = x;\\n\"\n\"\tvar XPosRight = x + nMaxWidth;\\n\"\n\"\tvar YPos = y + BoxHeight-2;\\n\"\n\"\tfor(i = 0; i < StringArray.length; i += 2)\\n\"\n\"\t{\\n\"\n\"\t\tcontext.fi\";\n\nconst size_t g_MicroProfileHtml_end_0_size = sizeof(g_MicroProfileHtml_end_0);\nconst char g_MicroProfileHtml_end_1[] =\n\"llText(StringArray[i], XPos, YPos);\\n\"\n\"\t\tcontext.fillText(StringArray[i+1], XPosRight - WidthArray[i+1], YPos);\\n\"\n\"\t\tYPos += BoxHeight;\\n\"\n\"\t}\\n\"\n\"}\\n\"\n\"function CloneObject(obj)\\n\"\n\"{\\n\"\n\"\tvar copy = new Object();\\n\"\n\"\tfor(var attr in obj)\\n\"\n\"\t{\\n\"\n\"\t\tif(obj.hasOwnProperty(attr))\\n\"\n\"\t\t{\\n\"\n\"\t\t\tcopy[attr] = obj[attr];\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"\treturn copy;\\n\"\n\"}\\n\"\n\"function CloneArray(arr)\\n\"\n\"{\\n\"\n\"\tvar result = Array(arr.length);\\n\"\n\"\tfor(var i = 0; i < arr.length; ++i)\\n\"\n\"\t{\\n\"\n\"\t\tresult[i] = CloneObject(arr[i]);\\n\"\n\"\t}\\n\"\n\"\treturn result;\\n\"\n\"}\\n\"\n\"function DrawHoverToolTip()\\n\"\n\"{\\n\"\n\"\tif(!ToolTip)\\n\"\n\"\t{\\n\"\n\"\t\treturn;\\n\"\n\"\t}\\n\"\n\"\tProfileEnter(\\\"DrawHoverToolTip\\\");\\n\"\n\"\tif(nHoverToken != -1)\\n\"\n\"\t{\\n\"\n\"\t\tvar StringArray = [];\\n\"\n\"\\n\"\n\"\t\tvar Timer = TimerInfo[nHoverToken];\\n\"\n\"\t\tvar Group = GroupInfo[Timer.group];\\n\"\n\"\\n\"\n\"\t\tvar bShowTimers = Mode == ModeTimers;\\n\"\n\"\t\tif(ToolTip == 2)\\n\"\n\"\t\t{ //0: off, 1: default, 2: flipped\\n\"\n\"\t\t\tbShowTimers = !bShowTimers;\\n\"\n\"\t\t}\\n\"\n\"\t\tif(bShowTimers || nHoverFrame == -1)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tStringArray.push(\\\"Timer:\\\");\\n\"\n\"\t\t\tStringArray.push(Timer.name);\\n\"\n\"\\n\"\n\"\t\t\tStringArray.push(\\\"\\\");\\n\"\n\"\t\t\tStringArray.push(\\\"\\\");\\n\"\n\"\\n\"\n\"\t\t\tStringArray.push(\\\"Average:\\\");\\n\"\n\"\t\t\tStringArray.push(Timer.average.toFixed(3)+\\\"ms\\\");\\n\"\n\"\t\t\tStringArray.push(\\\"Max:\\\");\\n\"\n\"\t\t\tStringArray.push(Timer.max.toFixed(3)+\\\"ms\\\");\\n\"\n\"\\n\"\n\"\t\t\tStringArray.push(\\\"\\\");\\n\"\n\"\t\t\tStringArray.push(\\\"\\\");\\n\"\n\"\\n\"\n\"\t\t\tStringArray.push(\\\"Exclusive Average:\\\");\\n\"\n\"\t\t\tStringArray.push(Timer.exclaverage.toFixed(3)+\\\"ms\\\");\\n\"\n\"\t\t\tStringArray.push(\\\"Exclusive Max:\\\");\\n\"\n\"\t\t\tStringArray.push(Timer.exclmax.toFixed(3)+\\\"ms\\\");\\n\"\n\"\\n\"\n\"\t\t\tStringArray.push(\\\"\\\");\\n\"\n\"\t\t\tStringArray.push(\\\"\\\");\\n\"\n\"\\n\"\n\"\t\t\tStringArray.push(\\\"Call Average:\\\");\\n\"\n\"\t\t\tStringArray.push(Timer.callaverage.toFixed(3)+\\\"ms\\\");\\n\"\n\"\t\t\tStringArray.push(\\\"Call Count:\\\");\\n\"\n\"\t\t\tStringArray.push((Timer.callcount / AggregateInfo.Frames).toFixed(2));\\n\"\n\"\\n\"\n\"\t\t\tStringArray.push(\\\"\\\");\\n\"\n\"\t\t\tStringArray.push(\\\"\\\");\\n\"\n\"\\n\"\n\"\t\t\tStringArray.push(\\\"Group:\\\");\\n\"\n\"\t\t\tStringArray.push(Group.name);\\n\"\n\"\t\t\tStringArray.push(\\\"Frame Average:\\\");\\n\"\n\"\t\t\tStringArray.push(Group.average.toFixed(3)+\\\"ms\\\");\\n\"\n\"\t\t\tStringArray.push(\\\"Frame Max:\\\");\\n\"\n\"\t\t\tStringArray.push(Group.max.toFixed(3)+\\\"ms\\\");\\n\"\n\"\t\t}\\n\"\n\"\t\telse\\n\"\n\"\t\t{\\n\"\n\"\t\t\tvar FrameGroupInfo = CloneArray(GroupInfo);\\n\"\n\"\t\t\tvar FrameTimerInfo = CloneArray(TimerInfo);\\n\"\n\"\\n\"\n\"\t\t\tCalculateTimers(FrameGroupInfo, FrameTimerInfo, nHoverFrame, nHoverFrame+1, nHoverToken, Timer.group);\\n\"\n\"\\n\"\n\"\t\t\tvar GroupTime = FrameGroupInfo[Timer.group];\\n\"\n\"\t\t\tvar FrameTime = FrameTimerInfo[nHoverToken];\\n\"\n\"\\n\"\n\"\t\t\tStringArray.push(\\\"Timer:\\\");\\n\"\n\"\t\t\tStringArray.push(Timer.name);\\n\"\n\"\t\t\tStringArray.push(\\\"Time:\\\");\\n\"\n\"\t\t\tStringArray.push((Group.isgpu ? RangeGpu.End-RangeGpu.Begin : RangeCpu.End-RangeCpu.Begin).toFixed(3)+\\\"ms\\\");\\n\"\n\"\\n\"\n\"\t\t\tStringArray.push(\\\"\\\");\\n\"\n\"\t\t\tStringArray.push(\\\"\\\");\\n\"\n\"\\n\"\n\"\t\t\tStringArray.push(\\\"Frame Time:\\\");\\n\"\n\"\t\t\tStringArray.push(FrameTime.Sum.toFixed(3)+\\\"ms\\\");\\n\"\n\"\t\t\tStringArray.push(\\\"Average:\\\");\\n\"\n\"\t\t\tStringArray.push(Timer.FrameAverage.toFixed(3)+\\\"ms\\\");\\n\"\n\"\t\t\tStringArray.push(\\\"Max:\\\");\\n\"\n\"\t\t\tStringArray.push(Timer.FrameMax.toFixed(3)+\\\"ms\\\");\\n\"\n\"\\n\"\n\"\t\t\tStringArray.push(\\\"\\\");\\n\"\n\"\t\t\tStringArray.push(\\\"\\\");\\n\"\n\"\\n\"\n\"\t\t\tStringArray.push(\\\"Call Average:\\\");\\n\"\n\"\t\t\tStringArray.push(Timer.CallAverage.toFixed(3)+\\\"ms\\\");\\n\"\n\"\t\t\tStringArray.push(\\\"Call Count:\\\");\\n\"\n\"\t\t\tStringArray.push((Timer.CallCount / Frames.length).toFixed(2));\\n\"\n\"\\n\"\n\"\t\t\tStringArray.push(\\\"\\\");\\n\"\n\"\t\t\tStringArray.push(\\\"\\\");\\n\"\n\"\\n\"\n\"\t\t\tStringArray.push(\\\"Exclusive Frame Time:\\\");\\n\"\n\"\t\t\tStringArray.push(FrameTime.ExclusiveSum.toFixed(3)+\\\"ms\\\");\\n\"\n\"\t\t\tStringArray.push(\\\"Exclusive Average:\\\");\\n\"\n\"\t\t\tStringArray.push(Timer.ExclusiveFrameAverage.toFixed(3)+\\\"ms\\\");\\n\"\n\"\t\t\tStringArray.push(\\\"Exclusive Max:\\\");\\n\"\n\"\t\t\tStringArray.push(Timer.ExclusiveFrameMax.toFixed(3)+\\\"ms\\\");\\n\"\n\"\\n\"\n\"\t\t\tStringArray.push(\\\"\\\");\\n\"\n\"\t\t\tStringArray.push(\\\"\\\");\\n\"\n\"\\n\"\n\"\t\t\tStringArray.push(\\\"Group:\\\");\\n\"\n\"\t\t\tStringArray.push(Group.name);\\n\"\n\"\t\t\tStringArray.push(\\\"Frame Time:\\\");\\n\"\n\"\t\t\tStringArray.push(GroupTime.Sum.toFixed(3)+\\\"ms\\\");\\n\"\n\"\t\t\tStringArray.push(\\\"Frame Average:\\\");\\n\"\n\"\t\t\tStringArray.push(Group.FrameAverage.toFixed(3)+\\\"ms\\\");\\n\"\n\"\t\t\tStringArray.push(\\\"Frame Max:\\\");\\n\"\n\"\t\t\tStringArray.push(Group.FrameMax.toFixed(3)+\\\"ms\\\");\\n\"\n\"\\n\"\n\"\t\t\tvar HoverMeta = GatherHoverMetaCounters(nHoverToken, nHoverTokenIndex, nHoverTokenLogIndex, nHoverFrame);\\n\"\n\"\t\t\tvar HeaderMeta = 0;\\n\"\n\"\t\t\tfor(index in HoverMeta)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tif(0 == HeaderMeta)\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\tHeaderMeta = 1;\\n\"\n\"\t\t\t\t\tStringArray.push(\\\"\\\");\\n\"\n\"\t\t\t\t\tStringArray.push(\\\"\\\");\\n\"\n\"\t\t\t\t}\\n\"\n\"\t\t\t\tStringArray.push(\\\"\\\"+index);\\n\"\n\"\t\t\t\tStringArray.push(\\\"\\\"+HoverMeta[index]);\\n\"\n\"\t\t\t}\\n\"\n\"\\n\"\n\"\t\t\tvar HoverLabel = GatherHoverLabels(nHoverToken, nHoverTokenIndex, nHoverTokenLogIndex, nHoverFrame);\\n\"\n\"\t\t\tif(HoverLabel.length > 0)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tStringArray.push(\\\"\\\");\\n\"\n\"\t\t\t\tStringArray.push(\\\"\\\");\\n\"\n\"\\n\"\n\"\t\t\t\tfor(index in HoverLabel)\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\tStringArray.push(\\\"Label:\\\")\\n\"\n\"\t\t\t\t\tStringArray.push(HoverLabel[index]);\\n\"\n\"\t\t\t\t}\\n\"\n\"\t\t\t}\\n\"\n\"\t\t}\\n\"\n\"\t\tDrawToolTip(StringArray, CanvasDetailedView, DetailedViewMouseX, DetailedViewMouseY+20, Timer.color);\\n\"\n\"\t}\\n\"\n\"\telse if(nHoverCSCpu >= 0)\\n\"\n\"\t{\\n\"\n\"\t\tvar StringArray = [];\\n\"\n\"\t\tStringArray.push(\\\"Context Switch\\\");\\n\"\n\"\t\tStringArray.push(\\\"\\\");\\n\"\n\"\t\tStringArray.push(\\\"\\\");\\n\"\n\"\t\tStringArray.push(\\\"\\\");\\n\"\n\"\t\tStringArray.push(\\\"Cpu\\\");\\n\"\n\"\t\tStringArray.push(\\\"\\\" + nHoverCSCpu);\\n\"\n\"\t\tStringArray.push(\\\"Begin\\\");\\n\"\n\"\t\tStringArray.push(\\\"\\\" + RangeCpu.Begin);\\n\"\n\"\t\tStringArray.push(\\\"End\\\");\\n\"\n\"\t\tStringArray.push(\\\"\\\" + RangeCpu.End);\\n\"\n\"\t\tDrawToolTip(StringArray, CanvasDetailedView, DetailedViewMouseX, DetailedViewMouseY+20);\\n\"\n\"\t}\\n\"\n\"\tProfileLeave();\\n\"\n\"}\\n\"\n\"\\n\"\n\"function FormatMeta(Value, Dec)\\n\"\n\"{\\n\"\n\"\tif(!Value)\\n\"\n\"\t{\\n\"\n\"\t\tValue = \\\"0\\\";\\n\"\n\"\t}\\n\"\n\"\telse\\n\"\n\"\t{\\n\"\n\"\t\tValue = \\'\\' + Value.toFixed(Dec);\\n\"\n\"\t}\\n\"\n\"\treturn Value;\\n\"\n\"}\\n\"\n\"\\n\"\n\"function DrawBarView()\\n\"\n\"{\\n\"\n\"\tProfileEnter(\\\"DrawBarView\\\");\\n\"\n\"\tInvalidate++;\\n\"\n\"\tnHoverToken = -1;\\n\"\n\"\tnHoverFrame = -1;\\n\"\n\"\tvar context = CanvasDetailedView.getContext(\\'2d\\');\\n\"\n\"\tcontext.clearRect(0, 0, nWidth, nHeight);\\n\"\n\"\\n\"\n\"\tvar Height = BoxHeight;\\n\"\n\"\tvar Width = nWidth;\\n\"\n\"\\n\"\n\"\t//clamp offset to prevent scrolling into the void\\n\"\n\"\tvar nTotalRows = 0;\\n\"\n\"\tfor(var groupid in GroupInfo)\\n\"\n\"\t{\\n\"\n\"\t\tif(GroupsAllActive || GroupsActive[GroupInfo[groupid].name])\\n\"\n\"\t\t{\\n\"\n\"\t\t\tnTotalRows += GroupInfo[groupid].TimerArray.length + 1;\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"\tvar nTotalRowPixels = nTotalRows * Height;\\n\"\n\"\tvar nFrameRows = nHeight - BoxHeight;\\n\"\n\"\tif(nOffsetBarsY + nFrameRows > nTotalRowPixels && nTotalRowPixels > nFrameRows)\\n\"\n\"\t{\\n\"\n\"\t\tnOffsetBarsY = nTotalRowPixels - nFrameRows;\\n\"\n\"\t}\\n\"\n\"\\n\"\n\"\\n\"\n\"\tvar Y = -nOffsetBarsY + BoxHeight;\\n\"\n\"\tif(TimersGroups)\\n\"\n\"\t{\\n\"\n\"\t\tnOffsetBarsX = 0;\\n\"\n\"\t}\\n\"\n\"\tvar XBase = -nOffsetBarsX;\\n\"\n\"\tvar nColorIndex = 0;\\n\"\n\"\\n\"\n\"\tcontext.fillStyle = \\'white\\';\\n\"\n\"\tcontext.font = Font;\\n\"\n\"\tvar bMouseIn = 0;\\n\"\n\"\tvar RcpReferenceTime = 1.0 / ReferenceTime;\\n\"\n\"\tvar CountWidth = 8 * FontWidth;\\n\"\n\"\tvar nMetaLen = TimerInfo[0].meta.length;\\n\"\n\"\tvar nMetaCharacters = 10;\\n\"\n\"\tvar InnerBoxHeight = BoxHeight-2;\\n\"\n\"\tvar TimerLen = 8; //todo: fix max digits.\\n\"\n\"\tvar TimerWidth = TimerLen * FontWidth;\\n\"\n\"\tvar nWidthBars = nBarsWidth+2;\\n\"\n\"\tvar nWidthMs = TimerWidth+2+10;\\n\"\n\"\\n\"\n\"\\n\"\n\"\\n\"\n\"\tfor(var i = 0; i < nMetaLen; ++i)\\n\"\n\"\t{\\n\"\n\"\t\tif(nMetaCharacters < MetaNames[i].length)\\n\"\n\"\t\t\tnMetaCharacters = MetaNames[i].length;\\n\"\n\"\t}\\n\"\n\"\tvar nWidthMeta = nMetaCharacters * FontWidth + 6;\\n\"\n\"\tfunction HeaderMouseHandle(XBegin, X, Header)\\n\"\n\"\t{\\n\"\n\"\t\tvar bMouseIn = DetailedViewMouseY >= 0 && DetailedViewMouseY < BoxHeight && DetailedViewMouseX < X && DetailedViewMouseX > XBegin;\\n\"\n\"\t\tif(bMouseIn)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tSortColumnMouseOverNext = Header;\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"\tfunction HeaderString(Header)\\n\"\n\"\t{\\n\"\n\"\t\tif(Header == SortColumnMouseOver)\\n\"\n\"\t\t{\\n\"\n\"\t\t\treturn Header + (SortColumnOrderFlip ? \\'<\\' : \\'>\\');\\n\"\n\"\t\t}\\n\"\n\"\t\telse\\n\"\n\"\t\t{\\n\"\n\"\t\t\treturn Header;\\n\"\n\"\t\t}\\n\"\n\"\\n\"\n\"\t}\\n\"\n\"\tfunction DrawHeaderSplit(Header)\\n\"\n\"\t{\\n\"\n\"\t\tcontext.fillStyle = \\'white\\';\\n\"\n\"\t\tcontext.fillText(HeaderString(Header), X, Height-FontAscent);\\n\"\n\"\t\tvar XBegin = X;\\n\"\n\"\t\tX += nWidthBars;\\n\"\n\"\t\tcontext.fillStyle = nBackColorOffset;\\n\"\n\"\t\tX += nWidthMs;\\n\"\n\"\\n\"\n\"\t\tif(X >= NameWidth)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tcontext.fillRect(X-3, 0, 1, nHeight);\\n\"\n\"\t\t}\\n\"\n\"\\n\"\n\"\t\tHeaderMouseHandle(XBegin, X, Header);\\n\"\n\"\t}\\n\"\n\"\tfunction DrawHeaderSplitSingle(Header, Width)\\n\"\n\"\t{\\n\"\n\"\t\tcontext.fillStyle = \\'white\\';\\n\"\n\"\t\tcontext.fillText(HeaderString(Header), X, Height-FontAscent);\\n\"\n\"\t\tvar XBegin = X;\\n\"\n\"\t\tX += Width;\\n\"\n\"\t\tcontext.fillStyle = nBackColorOffset;\\n\"\n\"\t\tif(X >= NameWidth)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tcontext.fillRect(X-3, 0, 1, nHeight);\\n\"\n\"\t\t}\\n\"\n\"\t\tHeaderMouseHandle(XBegin, X, Header);\\n\"\n\"\t}\\n\"\n\"\tfunction DrawHeaderSplitLeftRight(HeaderLeft, HeaderRight, Width)\\n\"\n\"\t{\\n\"\n\"\t\tcontext.textAlign = \\'left\\';\\n\"\n\"\t\tcontext.fillStyle = \\'white\\';\\n\"\n\"\t\tcontext.fillText(HeaderLeft, X, Height-FontAscent);\\n\"\n\"\t\tvar XBegin = X;\\n\"\n\"\t\tX += Width;\\n\"\n\"\t\tcontext.textAlign = \\'right\\';\\n\"\n\"\t\tcontext.fillText(HeaderRight, X-5, Height-FontAscent);\\n\"\n\"\t\tcontext.textAlign = \\'left\\';\\n\"\n\"\t\tcontext.fillStyle = nBackColorOffset;\\n\"\n\"\t\tif(X >= NameWidth)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tcontext.fillRect(X-3, 0, 1, nHeight);\\n\"\n\"\t\t}\\n\"\n\"\t\tHeaderMouseHandle(XBegin, X, HeaderLeft);\\n\"\n\"\t}\\n\"\n\"\tfunction DrawTimer(Value, Color)\\n\"\n\"\t{\\n\"\n\"\t\tvar Prc = Value * RcpReferenceTime;\\n\"\n\"\t\tvar YText = Y+Height-FontAscent;\\n\"\n\"\t\tif(Prc > 1)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tPrc = 1;\\n\"\n\"\t\t}\\n\"\n\"\t\tcontext.fillStyle = Color;\\n\"\n\"\t\tcontext.fillRect(X+1, Y+1, Prc * nBarsWidth, InnerBoxHeight);\\n\"\n\"\t\tX += nWidthBars;\\n\"\n\"\t\tcontext.fillStyle = \\'white\\';\\n\"\n\"\t\tcontext.fillText((\\\"      \\\" + Value.toFixed(2)).slice(-TimerLen), X, YText);\\n\"\n\"\t\tX += nWidthMs;\\n\"\n\"\t}\\n\"\n\"\tfunction DrawMeta(Value, Width, Dec, YText)\\n\"\n\"\t{\\n\"\n\"\t\tValue = FormatMeta(Value, Dec);\\n\"\n\"\t\tX += (FontWidth*Width);\\n\"\n\"\t\tcontext.textAlign = \\'right\\';\\n\"\n\"\t\tcontext.fillText(Value, X-FontWidth, YText);\\n\"\n\"\t\tcontext.textAlign = \\'left\\';\\n\"\n\"\t}\\n\"\n\"\\n\"\n\"\\n\"\n\"\\n\"\n\"\tfunction DrawTimerRow(timerid, showgroup)\\n\"\n\"\t{\\n\"\n\"\t\tvar Timer = TimerInfo[timerid];\\n\"\n\"\t\tvar Average = Timer.average;\\n\"\n\"\t\tvar Max = Timer.max;\\n\"\n\"\t\tvar Min = Timer.min;\\n\"\n\"\t\tvar ExclusiveMax = Timer.exclmax;\\n\"\n\"\t\tvar ExclusiveAverage = Timer.exclaverage;\\n\"\n\"\t\tvar CallAverage = Timer.callaverage;\\n\"\n\"\t\tvar CallCount = Timer.callcount;\\n\"\n\"\t\tvar YText = Y+Height-FontAscent;\\n\"\n\"\t\tX = NameWidth + XBase;\\n\"\n\"\\n\"\n\"\t\tnColorIndex = 1-nColorIndex;\\n\"\n\"\t\tbMouseIn = DetailedViewMouseY >= Y && DetailedViewMouseY < Y + BoxHeight;\\n\"\n\"\t\tif(bMouseIn)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tnHoverToken = timerid;\\n\"\n\"\t\t}\\n\"\n\"\t\tcontext.fillStyle = bMouseIn ? nBackColorOffset : nBackColors[nColorIndex];\\n\"\n\"\t\tcontext.fillRect(0, Y, Width, FontHeight+2);\\n\"\n\"\\n\"\n\"\t\tDrawTimer(Average, Timer.color);\\n\"\n\"\t\tDrawTimer(Max,Timer.color);\\n\"\n\"\t\tDrawTimer(Timer.total,Timer.color);\\n\"\n\"\t\tDrawTimer(Min,Timer.color);\\n\"\n\"\t\tDrawTimer(CallAverage,Timer.color);\\n\"\n\"\t\tcontext.fillStyle = \\'white\\';\\n\"\n\"\t\tcontext.fillText(CallCount, X, YText);\\n\"\n\"\t\tX += CountWidth;\\n\"\n\"\t\tDrawTimer(ExclusiveAverage,Timer.color);\\n\"\n\"\t\tDrawTimer(ExclusiveMax,Timer.color);\\n\"\n\"\\n\"\n\"\t\tif(TimersMeta)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tcontext.fillStyle = \\'white\\';\\n\"\n\"\t\t\tfor(var j = 0; j < nMetaLen; ++j)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tDrawMeta(Timer.meta[j], MetaLengths[j], 0, YText);\\n\"\n\"\t\t\t\tDrawMeta(Timer.metaagg[j]/AggregateInfo.Frames, MetaLengthsAvg[j], 2, YText);\\n\"\n\"\t\t\t\tDrawMeta(Timer.metamax[j], MetaLengthsMax[j], 0, YText);\\n\"\n\"\t\t\t}\\n\"\n\"\t\t}\\n\"\n\"\t\tcontext.fillStyle = bMouseIn ? nBackColorOffset : nBackColors[nColorIndex];\\n\"\n\"\t\tcontext.fillRect(0, Y, NameWidth, Height);\\n\"\n\"\t\tcontext.textAlign = \\'right\\';\\n\"\n\"\t\tcontext.fillStyle = Timer.color;\\n\"\n\"\t\tcontext.fillText(Timer.name, NameWidth - 5, YText);\\n\"\n\"\t\tcontext.textAlign = \\'left\\';\\n\"\n\"\t\tif(showgroup)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tcontext.fillStyle = \\'white\\';\\n\"\n\"\t\t\tcontext.fillText(GroupInfo[Timer.group].name, 1, YText);\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"\tfunction FilterMatch(FilterArray, value)\\n\"\n\"\t{\\n\"\n\"\t\tif(!FilterArray)\\n\"\n\"\t\t\treturn true;\\n\"\n\"\t\tfor(var i = 0; i < FilterArray.length; ++i)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tvar res = value.search(FilterArray[i]);\\n\"\n\"\t\t\tif(res<0)\\n\"\n\"\t\t\t\treturn false;\\n\"\n\"\t\t}\\n\"\n\"\t\treturn true;\\n\"\n\"\t}\\n\"\n\"\tif(SortColumn)\\n\"\n\"\t{\\n\"\n\"\t\tvar OrderArray = new Array(TimerInfo.length);\\n\"\n\"\t\tvar KeyArray = new Array(TimerInfo.length);\\n\"\n\"\t\tfor(var idx in GroupOrder)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tvar Group = GroupInfo[idx];\\n\"\n\"\t\t\tif((GroupsAllActive || GroupsActive[Group.name]) && FilterMatch(FilterGroup, Group.name))\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tvar TimerArray = Group.TimerArray;\\n\"\n\"\t\t\t\tfor(var timerindex in TimerArray)\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\tvar timerid = TimerArray[timerindex];\\n\"\n\"\t\t\t\t\tif(FilterMatch(FilterTimer, TimerInfo[timerid].name))\\n\"\n\"\t\t\t\t\t{\\n\"\n\"\t\t\t\t\t\tOrderArray.push(timerid);\\n\"\n\"\t\t\t\t\t}\\n\"\n\"\t\t\t\t}\\n\"\n\"\t\t\t}\\n\"\n\"\t\t}\\n\"\n\"\t\tvar KeyFunc = null;\\n\"\n\"\t\tswitch(SortColumn)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tcase 1: KeyFunc = function (a) { return TimerInfo[a].average; }; break;\\n\"\n\"\t\t\tcase 2: KeyFunc = function (a) { return TimerInfo[a].max; }; break;\\n\"\n\"\t\t\tcase 3: KeyFunc = function (a) { return TimerInfo[a].total; }; break;\\n\"\n\"\t\t\tcase 4: KeyFunc = function (a) { return TimerInfo[a].min; }; break;\\n\"\n\"\t\t\tcase 5: KeyFunc = function (a) { return TimerInfo[a].callaverage; }; break;\\n\"\n\"\t\t\tcase 6: KeyFunc = function (a) { return TimerInfo[a].callcount; }; break;\\n\"\n\"\t\t\tcase 7: KeyFunc = function (a) { return TimerInfo[a].exclaverage; }; break;\\n\"\n\"\t\t\tcase 8: KeyFunc = function (a) { return TimerInfo[a].exclmax; }; break;\\n\"\n\"\t\t}\\n\"\n\"\\n\"\n\"\t\tvar Flip = SortColumnOrderFlip == 1 ? -1 : 1;\\n\"\n\"\t\tOrderArray.sort(function(a,b) { return Flip * (KeyFunc(b) - KeyFunc(a)); } );\\n\"\n\"\\n\"\n\"\t\tfor(var i in OrderArray)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tDrawTimerRow(OrderArray[i], 1);\\n\"\n\"\t\t\tY += Height;\\n\"\n\"\t\t}\t\t\t\\n\"\n\"\\n\"\n\"\t}\\n\"\n\"\telse if(2 == TimersGroups)\\n\"\n\"\t{\\n\"\n\"\t\tfor(var i = 0; i < ThreadNames.length; ++i)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tif((ThreadsActive[ThreadNames[i]] || ThreadsAllActive) && FilterMatch(FilterTimer, ThreadNames[i]))\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tvar X = 0;\\n\"\n\"\t\t\t\tvar YText = Y+Height-FontAscent;\\n\"\n\"\t\t\t\tbMouseIn = DetailedViewMouseY >= Y && DetailedViewMouseY < Y + BoxHeight;\\n\"\n\"\t\t\t\tnColorIndex = 1-nColorIndex;\\n\"\n\"\t\t\t\tcontext.fillStyle = bMouseIn ? nBackColorOffset : nBackColors[nColorIndex];\\n\"\n\"\t\t\t\tcontext.fillRect(0, Y, Width, FontHeight+2);\\n\"\n\"\t\t\t\tvar ThreadColor = CSwitchColors[i % CSwitchColors.length];\\n\"\n\"\t\t\t\tcontext.fillStyle = ThreadColor;\\n\"\n\"\t\t\t\tcontext.fillText(ThreadNames[i], 1, YText);\\n\"\n\"\t\t\t\tcontext.textAlign = \\'left\\';\\n\"\n\"\t\t\t\tY += Height;\\n\"\n\"\t\t\t\tfor(var idx in GroupOrder)\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\tvar groupid = GroupOrder[idx];\\n\"\n\"\t\t\t\t\tvar Group = GroupInfo[groupid];\\n\"\n\"\t\t\t\t\tvar PerThreadTimerTotal = ThreadGroupTimeArray[i][groupid];\\n\"\n\"\t\t\t\t\tvar PerThreadTimer = PerThreadTimerTotal / AggregateInfo.Frames;\\n\"\n\"\t\t\t\t\tif((PerThreadTimer > 0.0001|| PerThreadTimerTotal>0.1) && (GroupsAllActive || GroupsActive[Group.name]) && FilterMatch(FilterGroup, Group.name))\\n\"\n\"\t\t\t\t\t{\\n\"\n\"\t\t\t\t\t\tvar GColor = GroupColors ? GroupInfo[groupid].color : \\'white\\';\\n\"\n\"\t\t\t\t\t\tvar X = 0;\\n\"\n\"\t\t\t\t\t\tnColorIndex = 1-nColorIndex;\\n\"\n\"\t\t\t\t\t\tbMouseIn = DetailedViewMouseY >= Y && DetailedViewMouseY < Y + BoxHeight;\\n\"\n\"\t\t\t\t\t\tcontext.fillStyle = bMouseIn ? nBackColorOffset : nBackColors[nColorIndex];\\n\"\n\"\t\t\t\t\t\tcontext.fillRect(0, Y, Width, nHeight);\\n\"\n\"\t\t\t\t\t\tcontext.fillStyle = GColor;\\n\"\n\"\t\t\t\t\t\tcontext.textAlign = \\'right\\';\\n\"\n\"\t\t\t\t\t\tcontext.fillText(Group.name, NameWidth - 5, Y+Height-FontAscent);\\n\"\n\"\t\t\t\t\t\tcontext.textAlign = \\'left\\';\\n\"\n\"\t\t\t\t\t\tX += NameWidth;\\n\"\n\"\t\t\t\t\t\tDrawTimer(PerThreadTimer, GColor);\\n\"\n\"\t\t\t\t\t\tX += nWidthBars + nWidthMs;\t\\n\"\n\"\t\t\t\t\t\tDrawTimer(PerThreadTimerTotal, GColor);\\n\"\n\"\\n\"\n\"\t\t\t\t\t\tY += Height;\\n\"\n\"\t\t\t\t\t}\\n\"\n\"\t\t\t\t}\\n\"\n\"\t\t\t}\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"\telse\\n\"\n\"\t{\\n\"\n\"\t\tfor(var idx in GroupOrder)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tvar groupid = GroupOrder[idx];\\n\"\n\"\t\t\tvar Group = GroupInfo[groupid];\\n\"\n\"\t\t\tvar GColor = GroupColors ? GroupInfo[groupid].color : \\'white\\';\\n\"\n\"\t\t\tif((GroupsAllActive || GroupsActive[Group.name]) && FilterMatch(FilterGroup, Group.name))\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tvar TimerArray = Group.TimerArray;\\n\"\n\"\t\t\t\tvar X = XBase;\\n\"\n\"\t\t\t\tnColorIndex = 1-nColorIndex;\\n\"\n\"\t\t\t\tbMouseIn = DetailedViewMouseY >= Y && DetailedViewMouseY < Y + BoxHeight;\\n\"\n\"\t\t\t\tcontext.fillStyle = bMouseIn ? nBackColorOffset : nBackColors[nColorIndex];\\n\"\n\"\t\t\t\tcontext.fillRect(0, Y, Width, FontHeight+2);\\n\"\n\"\t\t\t\tcontext.fillStyle = GColor;\\n\"\n\"\t\t\t\tcontext.fillText(Group.name, 1, Y+Height-FontAscent);\\n\"\n\"\t\t\t\tX += NameWidth;\\n\"\n\"\t\t\t\tDrawTimer(Group.average, GColor);\\n\"\n\"\t\t\t\tDrawTimer(Group.max, GColor);\\n\"\n\"\t\t\t\tDrawTimer(Group.total, GColor);\\n\"\n\"\\n\"\n\"\t\t\t\tcontext.fillStyle = bMouseIn ? nBackColorOffset : nBackColors[nColorIndex];\\n\"\n\"\t\t\t\tcontext.fillRect(0, Y, NameWidth, FontHeight+2);\\n\"\n\"\t\t\t\tcontext.fillStyle = GColor;\\n\"\n\"\t\t\t\tcontext.fillText(Group.name, 1, Y+Height-FontAscent);\\n\"\n\"\\n\"\n\"\\n\"\n\"\\n\"\n\"\t\t\t\tY += Height;\\n\"\n\"\t\t\t\tif(TimersGroups)\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\tfor(var i = 0; i < ThreadNames.length; ++i)\\n\"\n\"\t\t\t\t\t{\\n\"\n\"\t\t\t\t\t\tvar PerThreadTimerTotal = ThreadGroupTimeArray[i][groupid];\\n\"\n\"\t\t\t\t\t\tvar PerThreadTimer = PerThreadTimerTotal / AggregateInfo.Frames;\\n\"\n\"\t\t\t\t\t\tif((PerThreadTimer > 0.0001|| PerThreadTimerTotal>0.1) && (ThreadsActive[ThreadNames[i]] || ThreadsAllActive) && FilterMatch(FilterTimer, ThreadNames[i]))\\n\"\n\"\t\t\t\t\t\t{\\n\"\n\"\t\t\t\t\t\t\tvar YText = Y+Height-FontAscent;\\n\"\n\"\t\t\t\t\t\t\tbMouseIn = DetailedViewMouseY >= Y && DetailedViewMouseY < Y + BoxHeight;\\n\"\n\"\t\t\t\t\t\t\tnColorIndex = 1-nColorIndex;\\n\"\n\"\t\t\t\t\t\t\tcontext.fillStyle = bMouseIn ? nBackColorOffset : nBackColors[nColorIndex];\\n\"\n\"\t\t\t\t\t\t\tcontext.fillRect(0, Y, Width, FontHeight+2);\\n\"\n\"\t\t\t\t\t\t\tvar ThreadColor = CSwitchColors[i % CSwitchColors.length];\\n\"\n\"\t\t\t\t\t\t\tcontext.fillStyle = ThreadColor;\\n\"\n\"\t\t\t\t\t\t\tcontext.textAlign = \\'right\\';\\n\"\n\"\t\t\t\t\t\t\tcontext.fillText(ThreadNames[i], NameWidth - 5, YText);\\n\"\n\"\t\t\t\t\t\t\tcontext.textAlign = \\'left\\';\\n\"\n\"\t\t\t\t\t\t\tX = NameWidth;\\n\"\n\"\t\t\t\t\t\t\tDrawTimer(PerThreadTimer, ThreadColor);\\n\"\n\"\t\t\t\t\t\t\tX += nWidthBars + nWidthMs;\t\\n\"\n\"\t\t\t\t\t\t\tDrawTimer(PerThreadTimerTotal, ThreadColor);\\n\"\n\"\t\t\t\t\t\t\tY += Height;\\n\"\n\"\t\t\t\t\t\t}\\n\"\n\"\t\t\t\t\t}\\n\"\n\"\t\t\t\t}\\n\"\n\"\t\t\t\telse\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\tfor(var timerindex in TimerArray)\\n\"\n\"\t\t\t\t\t{\\n\"\n\"\t\t\t\t\t\tvar timerid = TimerArray[timerindex];\\n\"\n\"\t\t\t\t\t\tif(FilterMatch(FilterTimer, TimerInfo[timerid].name))\\n\"\n\"\t\t\t\t\t\t{\\n\"\n\"\t\t\t\t\t\t\tDrawTimerRow(timerid, 0);\\n\"\n\"\t\t\t\t\t\t\tY += Height;\\n\"\n\"\t\t\t\t\t\t}\\n\"\n\"\t\t\t\t\t}\t\t\t\\n\"\n\"\t\t\t\t}\\n\"\n\"\t\t\t}\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"\tX = 0;\\n\"\n\"\tcontext.fillStyle = nBackColorOffset;\\n\"\n\"\tcontext.fillRect(0, 0, Width, Height);\\n\"\n\"\tcontext.fillStyle = \\'white\\';\\n\"\n\"\tSortColumnMouseOverNext = null;\\n\"\n\"\\n\"\n\"\tif(TimersGroups)\\n\"\n\"\t{\\n\"\n\"\t\tif(2 == TimersGroups)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tDrawHeaderSplitLeftRight(StrThread, StrGroup, NameWidth);\\n\"\n\"\t\t\tDrawHeaderSplit(StrAverage);\\n\"\n\"\t\t}\\n\"\n\"\t\telse\\n\"\n\"\t\t{\\n\"\n\"\t\t\tDrawHeaderSplitLeftRight(StrGroup, StrThread, NameWidth);\\n\"\n\"\t\t\tDrawHeaderSplit(StrAverage);\\n\"\n\"\t\t\tDrawHeaderSplit(StrMax);\\n\"\n\"\t\t\tDrawHeaderSplit(StrTotal);\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"\telse\\n\"\n\"\t{\\n\"\n\"\t\tX = NameWidth + XBase;\\n\"\n\"\t\tDrawHeaderSplit(StrAverage);\\n\"\n\"\t\tDrawHeaderSplit(StrMax);\\n\"\n\"\t\tDrawHeaderSplit(StrTotal);\\n\"\n\"\t\tDrawHeaderSplit(StrMin);\\n\"\n\"\t\tDrawHeaderSplit(StrCallAverage);\\n\"\n\"\t\tDrawHeaderSplitSingle(StrCount, CountWidth);\\n\"\n\"\t\tDrawHeaderSplit(StrExclAverage);\\n\"\n\"\t\tDrawHeaderSplit(StrExclMax);\\n\"\n\"\t\tif(TimersMeta)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tfor(var i = 0; i < nMetaLen; ++i)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tDrawHeaderSplitSingle(MetaNames[i], MetaLengths[i] * FontWidth);\\n\"\n\"\t\t\t\tDrawHeaderSplitSingle(MetaNames[i] + \\\" Avg\\\", MetaLengthsAvg[i] * FontWidth);\\n\"\n\"\t\t\t\tDrawHeaderSplitSingle(MetaNames[i] + \\\" Max\\\", MetaLengthsMax[i] * FontWidth);\\n\"\n\"\t\t\t}\\n\"\n\"\t\t}\\n\"\n\"\t\tX = 0;\\n\"\n\"\t\tcontext.fillStyle = nBackColorOffset;\\n\"\n\"\t\tcontext.fillRect(0, 0, NameWidth, Height);\\n\"\n\"\t\tcontext.fillStyle = \\'white\\';\\n\"\n\"\t\\n\"\n\"\t\tDrawHeaderSplitLeftRight(StrGroup, StrTimer, NameWidth);\\n\"\n\"\t\\n\"\n\"\t}\\n\"\n\"\\n\"\n\"\tProfileLeave();\\n\"\n\"}\\n\"\n\"\\n\"\n\"var CounterNameWidth = 100;\\n\"\n\"var CounterValueWidth = 100;\\n\"\n\"var CounterLimitWidth = 100;\\n\"\n\"\\n\"\n\"var FormatCounterDefault = 0;\\n\"\n\"var FormatCounterBytes = 1;\\n\"\n\"var FormatCounterBytesExt = [ \\\"b\\\",\\\"kb\\\",\\\"mb\\\",\\\"gb\\\",\\\"tb\\\",\\\"pb\\\", \\\"eb\\\",\\\"zb\\\", \\\"yb\\\" ];\\n\"\n\"\\n\"\n\"function FormatCounter(Format, Counter)\\n\"\n\"{\\n\"\n\"\tif(!Counter)\\n\"\n\"\t{\\n\"\n\"\t\treturn \\'0\\';\\n\"\n\"\t}\\n\"\n\"\tvar Negative = 0;\\n\"\n\"\tif(Counter < 0)\\n\"\n\"\t{\\n\"\n\"\t\tCounter = -Counter;\\n\"\n\"\t\tNegative = 1;\\n\"\n\"\t\tif(Counter < 0) // handle INT_MIN\\n\"\n\"\t\t{\\n\"\n\"\t\t\tCounter = -(Counter+1);\\n\"\n\"\t\t\tif(Counter < 0)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\treturn \\'?\\';\\n\"\n\"\t\t\t}\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"\tvar str = Negative ? \\'-\\' :\\'\\' ;\\n\"\n\"\tif(Format == FormatCounterDefault)\\n\"\n\"\t{\\n\"\n\"\t\tvar Seperate = 0;\\n\"\n\"\t\tvar result = \\'\\';\\n\"\n\"\t\twhile (Counter)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tif (Seperate)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tresult += \\'.\\';\\n\"\n\"\t\t\t}\\n\"\n\"\t\t\tSeperate = 1;\\n\"\n\"\t\t\tfor (var i = 0; Counter && i < 3; ++i)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tvar Digit = Math.floor(Counter % 10);\\n\"\n\"\t\t\t\tCounter = Math.floor(Counter / 10);\\n\"\n\"\t\t\t\tresult += \\'\\' + Digit;\\n\"\n\"\t\t\t}\\n\"\n\"\t\t}\\n\"\n\"\\n\"\n\"\t\tfor(var i = 0; i < result.length; ++i)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tstr += result[result.length-1-i];\\n\"\n\"\t\t}\\n\"\n\"\t\treturn str;\\n\"\n\"\t}\\n\"\n\"\telse if(Format == FormatCounterBytes)\\n\"\n\"\t{\\n\"\n\"\t\tvar Shift = 0;\\n\"\n\"\t\tvar Divisor = 1;\\n\"\n\"\t\tvar CountShifted = Counter >> 10;\\n\"\n\"\t\twhile(CountShifted)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tDivisor <<= 10;\\n\"\n\"\t\t\tCountShifted >>= 10;\\n\"\n\"\t\t\tShift++;\\n\"\n\"\t\t}\\n\"\n\"\t\tif(Shift)\\n\"\n\"\t\t{\\n\"\n\"\t\t\treturn str + (Counter / Divisor).toFixed(2) + \\'\\' + FormatCounterBytesExt[Shift];\\n\"\n\"\t\t}\\n\"\n\"\t\telse\\n\"\n\"\t\t{\\n\"\n\"\t\t\treturn str + Counter.toFixed(2) + \\'\\' + FormatCounterBytesExt[0];\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"\treturn \\'?\\'\\n\"\n\"}\\n\"\n\"function DrawCounterView()\\n\"\n\"{\\n\"\n\"\tProfileEnter(\\\"DrawCounterView\\\");\\n\"\n\"\tInvalidate++;\\n\"\n\"\tnHoverToken = -1;\\n\"\n\"\tnHoverFrame = -1;\\n\"\n\"\tvar context = CanvasDetailedView.getContext(\\'2d\\');\\n\"\n\"\tcontext.clearRect(0, 0, nWidth, nHeight);\\n\"\n\"\\n\"\n\"\tvar Height = BoxHeight;\\n\"\n\"\tvar Width = nWidth;\\n\"\n\"\t//clamp offset to prevent scrolling into the void\\n\"\n\"\tvar nTotalRows = CounterInfo.length;\\n\"\n\"\tvar nTotalRowPixels = nTotalRows * Height;\\n\"\n\"\tvar nFrameRows = nHeight - BoxHeight;\\n\"\n\"\tif(nOffsetCountersY + nFrameRows > nTotalRowPixels && nTotalRowPixels > nFrameRows)\\n\"\n\"\t{\\n\"\n\"\t\tnOffsetCountersY = nTotalRowPixels - nFrameRows;\\n\"\n\"\t}\\n\"\n\"\\n\"\n\"\tvar CounterNameWidthTemp = 10;\\n\"\n\"\tvar CounterValueWidthTemp = 10;\\n\"\n\"\tvar CounterLimitWidthTemp = 10;\\n\"\n\"\\n\"\n\"\tvar CounterWidth = 150;\\n\"\n\"\tvar Y = -nOffsetCountersY + BoxHeight;\\n\"\n\"\tvar X = 0;\\n\"\n\"\tvar nColorIndex = 0;\\n\"\n\"\tcontext.fillStyle = \\'white\\';\\n\"\n\"\tcontext.font = Font;\\n\"\n\"\tvar bMouseIn = 0;\\n\"\n\"\tfunction DrawHeaderSplitSingle(Header, Width)\\n\"\n\"\t{\\n\"\n\"\t\tcontext.fillStyle = \\'white\\';\\n\"\n\"\t\tcontext.fillText(Header, X, Height-FontAscent);\\n\"\n\"\t\tX += Width;\\n\"\n\"\t\tcontext.fillStyle = nBackColorOffset;\\n\"\n\"\t\tcontext.fillRect(X-3, 0, 1, nHeight);\\n\"\n\"\t}\\n\"\n\"\tfunction DrawHeaderSplitSingleRight(Header, Width)\\n\"\n\"\t{\\n\"\n\"\t\tX += Width;\\n\"\n\"\t\tcontext.fillStyle = \\'white\\';\\n\"\n\"\t\tcontext.textAlign  = \\'right\\';\\n\"\n\"\t\tcontext.fillText(Header, X - FontWidth, Height-FontAscent);\\n\"\n\"\t\tcontext.fillStyle = nBackColorOffset;\\n\"\n\"\t\tcontext.fillRect(X, 0, 1, nHeight);\\n\"\n\"\t\tcontext.textAlign  = \\'left\\';\\n\"\n\"\t}\\n\"\n\"\tvar TimerLen = 6;\\n\"\n\"\tvar TimerWidth = TimerLen * FontWidth;\\n\"\n\"\tnHoverCounter = -1;\\n\"\n\"\tfunction CounterIndent(Level)\\n\"\n\"\t{\\n\"\n\"\t\treturn Level * 4 * FontWidth;\\n\"\n\"\t}\\n\"\n\"\tfunction Max(a, b)\\n\"\n\"\t{\\n\"\n\"\t\treturn a > b ? a : b;\\n\"\n\"\t}\\n\"\n\"\\n\"\n\"\tfunction DrawCounterRecursive(Index)\\n\"\n\"\t{\\n\"\n\"\t\tvar Counter = CounterInfo[Index];\\n\"\n\"\t\tvar Indent = CounterIndent(Counter.level);\\n\"\n\"\t\tCounterNameWidthTemp = Max(CounterNameWidthTemp, Counter.name.length+1 + Indent / (FontWidth+1));\\n\"\n\"\t\tCounterValueWidthTemp = Max(CounterValueWidthTemp, Counter.formatted.length);\\n\"\n\"\t\tCounterLimitWidthTemp = Max(CounterLimitWidthTemp, Counter.formattedlimit.length);\\n\"\n\"\\n\"\n\"\t\tvar X = 0;\\n\"\n\"\t\tnColorIndex = 1-nColorIndex;\\n\"\n\"\t\tvar HeightExpanded = Counter.Expanded ? Height * 5 : Height\\n\"\n\"\\n\"\n\"\t\tbMouseIn = DetailedViewMouseY >= Y && DetailedViewMouseY < Y + HeightExpanded;\\n\"\n\"\t\tif(bMouseIn)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tnHoverCounter = Index;\\n\"\n\"\t\t}\\n\"\n\"\t\tvar bgcolor = bMouseIn ? nBackColorOffset : nBackColors[nColorIndex];\\n\"\n\"\t\tcontext.fillStyle = bgcolor;\\n\"\n\"\t\tcontext.fillRect(0, Y, Width, HeightExpanded);\\n\"\n\"\t\tcontext.fillStyle = \\'white\\';\\n\"\n\"\t\tvar c = Counter.closed ? \\'*\\' : \\' \\';\\n\"\n\"\t\tcontext.fillText(c + Counter.name, Indent, Y+Height-FontAscent);\\n\"\n\"\t\tX += CounterNameWidth;\\n\"\n\"\t\tX += CounterValueWidth - FontWidth;\\n\"\n\"\t\tcontext.textAlign = \\'right\\';\\n\"\n\"\t\tcontext.fillText(Counter.formatted, X, Y+Height-FontAscent);\\n\"\n\"\t\tcontext.textAlign = \\'left\\';\\n\"\n\"\t\tX += FontWidth * 4;\\n\"\n\"\t\tvar Y0 = Y + 1;\\n\"\n\"\t\tif(Counter.limit != 0)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tcontext.fillText(Counter.formattedlimit, X, Y+Height-FontAscent);\\n\"\n\"\t\t\tX += CounterLimitWidth;\\n\"\n\"\t\t\tvar X0 = X + 1;\\n\"\n\"\t\t\tcontext.fillStyle = \\'white\\';\\n\"\n\"\t\t\tcontext.fillRect(X0, Y0, Counter.boxprc * (CounterWidth-2), Height-2);\\n\"\n\"\t\t\tcontext.fillStyle = bgcolor;\\n\"\n\"\t\t\tcontext.fillRect(X0+1, Y0+1, Counter.boxprc * (CounterWidth-4), Height-4);\\n\"\n\"\t\t\tcontext.fillStyle = \\'cyan\\';\\n\"\n\"\t\t\tcontext.fillRect(X0+1, Y0+1, Counter.counterprc * (CounterWidth-4), Height-4);\\n\"\n\"\t\t\tX += CounterWidth + 10;\\n\"\n\"\t\t}\\n\"\n\"\t\telse\\n\"\n\"\t\t{\\n\"\n\"\t\t\tX += CounterLimitWidth;\\n\"\n\"\t\t\tX += CounterWidth + 10;\\n\"\n\"\t\t}\\n\"\n\"\t\tif(Counter.historydata.length > 0)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tvar Prc = Counter.historyprc;\\n\"\n\"\t\t\tvar Data = Counter.historydata;\\n\"\n\"\\n\"\n\"\t\t\tcontext.fillStyle = \\'cyan\\';\\n\"\n\"\t\t\tcontext.strokeStyle = \\'cyan\\';\\n\"\n\"\t\t\tcontext.globalAlpha = 0.5;\\n\"\n\"\t\t\tcontext.beginPath();\\n\"\n\"\t\t\tvar x = X;\\n\"\n\"\t\t\tvar YBase = Y0 + HeightExpanded-1;\\n\"\n\"\t\t\tvar YOffset = -(HeightExpanded-2);\\n\"\n\"\\n\"\n\"\t\t\tcontext.moveTo(X, Y0);\\n\"\n\"\t\t\tfor(var i = 0; i < Prc.length; ++i)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tcontext.moveTo(x, YBase);\\n\"\n\"\t\t\t\tcontext.lineTo(x, YBase + Prc[i] * YOffset);\\n\"\n\"\\n\"\n\"\t\t\t\tx += 1;\\n\"\n\"\t\t\t}\\n\"\n\"\t\t\tcontext.stroke();\\n\"\n\"\\n\"\n\"\t\t\tx = X;\\n\"\n\"\t\t\tcontext.globalAlpha = 1.0;\\n\"\n\"\t\t\tcontext.beginPath();\\n\"\n\"\t\t\tcontext.moveTo(X, YBase);\\n\"\n\"\\n\"\n\"\t\t\tfor(var i = 0; i < Prc.length; ++i)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tcontext.lineTo(x, YBase + Prc[i] * YOffset);\\n\"\n\"\t\t\t\tx += 1;\\n\"\n\"\t\t\t}\\n\"\n\"\t\t\tcontext.stroke();\\n\"\n\"\t\t\tif(bMouseIn)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tvar MouseGraphX = Math.floor(DetailedViewMouseX - X);\\n\"\n\"\t\t\t\tif(MouseGraphX >= 0 && MouseGraphX < Data.length)\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\tcontext.fillStyle = \\'white\\';\\n\"\n\"\t\t\t\t\tvar Formatted = FormatCounter(Counter.format, Data[MouseGraphX]);\\n\"\n\"\t\t\t\t\tcontext.fillText(Formatted, X, Y+Height-FontAscent);\\n\"\n\"\t\t\t\t}\\n\"\n\"\t\t\t\tcontext.strokeStyle = \\'orange\\';\\n\"\n\"\t\t\t\tcontext.beginPath();\\n\"\n\"\t\t\t\tvar CrossX = X + MouseGraphX;\\n\"\n\"\t\t\t\tvar CrossY = YBase + Prc[MouseGraphX] * YOffset;\\n\"\n\"\t\t\t\tcontext.moveTo(CrossX-2, CrossY-2);\\n\"\n\"\t\t\t\tcontext.lineTo(CrossX+2, CrossY+2);\\n\"\n\"\t\t\t\tcontext.moveTo(CrossX+2, CrossY-2);\\n\"\n\"\t\t\t\tcontext.lineTo(CrossX-2, CrossY+2);\\n\"\n\"\t\t\t\tcontext.stroke();\\n\"\n\"\\n\"\n\"\t\t\t}\\n\"\n\"\t\t\tX += Prc.length + 5;\\n\"\n\"\t\t\tcontext.fillStyle = \\'white\\';\\n\"\n\"\t\t\tcontext.fillText( FormatCounter(Counter.format, Counter.minvalue), X, Y + Height - FontAscent);\\n\"\n\"\t\t\tX += CounterWidth + 5;\\n\"\n\"\t\t\tcontext.fillText( FormatCounter(Counter.format, Counter.maxvalue), X, Y + Height - FontAscent);\\n\"\n\"\t\t\tX += CounterWidth + 5;\\n\"\n\"\t\t}\\n\"\n\"\\n\"\n\"\t\tY += HeightExpanded;\\n\"\n\"\\n\"\n\"\t\tif(!Counter.closed)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tvar ChildIndex = Counter.firstchild;\\n\"\n\"\t\t\twhile(ChildIndex != -1)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tDrawCounterRecursive(ChildIndex);\\n\"\n\"\t\t\t\tChildIndex = CounterInfo[ChildIndex].sibling;\\n\"\n\"\t\t\t}\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"\\n\"\n\"\tfor(var i = 0; i < CounterInfo.length; ++i)\\n\"\n\"\t{\\n\"\n\"\t\tif(CounterInfo[i].parent == -1)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tDrawCounterRecursive(i);\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"\\n\"\n\"\tX = 0;\\n\"\n\"\tcontext.fillStyle = nBackColorOffset;\\n\"\n\"\tcontext.fillRect(0, 0, Width, Height);\\n\"\n\"\tcontext.fillStyle = \\'white\\';\\n\"\n\"\tDrawHeaderSplitSingle(\\'Name\\', CounterNameWidth);\\n\"\n\"\tDrawHeaderSplitSingleRight(\\'Value\\', CounterValueWidth + (FontWidth+1));\\n\"\n\"\tDrawHeaderSplitSingle(\\'Limit\\', CounterLimitWidth + CounterWidth + 3 * (FontWidth+1));\\n\"\n\"\\n\"\n\"\\n\"\n\"\\n\"\n\"\\n\"\n\"\\n\"\n\"\tvar CounterNameWidthNew = CounterNameWidthTemp * (FontWidth+1);\\n\"\n\"\tvar CounterValueWidthNew = CounterValueWidthTemp * (FontWidth+1);\\n\"\n\"\tvar CounterLimitWidthNew = CounterLimitWidthTemp * (FontWidth+1);\\n\"\n\"\tif(CounterNameWidthNew != CounterNameWidth || CounterValueWidthNew != CounterValueWidth || CounterLimitWidthNew != CounterLimitWidth)\\n\"\n\"\t{\\n\"\n\"\t\t// console.log(\\'requesting redraw 0\\' + CounterNameWidthNew + \\'= \\' + CounterNameWidth );\\n\"\n\"\t\t// console.log(\\'requesting redraw 1\\' + CounterValueWidthNew + \\'= \\' + CounterValueWidth );\\n\"\n\"\t\t// console.log(\\'requesting redraw 2\\' + CounterLimitWidthNew + \\'= \\' + CounterLimitWidth );\\n\"\n\"\t\tCounterNameWidth = CounterNameWidthNew;\\n\"\n\"\t\tCounterValueWidth = CounterValueWidthNew;\\n\"\n\"\t\tCounterLimitWidth = CounterLimitWidthNew;\\n\"\n\"\t\tInvalidate = 0;\\n\"\n\"\t}\\n\"\n\"\\n\"\n\"\tProfileLeave();\\n\"\n\"}\\n\"\n\"\\n\"\n\"\\n\"\n\"//preprocess context switch data to contain array per thread\\n\"\n\"function PreprocessContextSwitchCacheItem(ThreadId)\\n\"\n\"{\\n\"\n\"\tvar CSObject = CSwitchCache[ThreadId];\\n\"\n\"\tif(ThreadId > 0 && !CSObject)\\n\"\n\"\t{\\n\"\n\"\t\tCSArrayIn = new Array();\\n\"\n\"\t\tCSArrayOut = new Array();\\n\"\n\"\t\tCSArrayCpu = new Array();\\n\"\n\"\t\tvar nCount = CSwitchTime.length;\\n\"\n\"\t\tvar j = 0;\\n\"\n\"\t\tvar TimeIn = -1.0;\\n\"\n\"\t\tfor(var i = 0; i < nCount; ++i)\\n\"\n\"\t\t{\t\\n\"\n\"\t\t\tvar ThreadIn = CSwitchThreadInOutCpu[j];\\n\"\n\"\t\t\tvar ThreadOut = CSwitchThreadInOutCpu[j+1];\\n\"\n\"\t\t\tvar Cpu = CSwitchThreadInOutCpu[j+2];\\n\"\n\"\t\t\tif(TimeIn < 0)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tif(ThreadIn == ThreadId)\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\tTimeIn = CSwitchTime[i];\\n\"\n\"\t\t\t\t}\\n\"\n\"\t\t\t}\\n\"\n\"\t\t\telse\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tif(ThreadOut == ThreadId)\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\tvar TimeOut = CSwitchTime[i];\\n\"\n\"\t\t\t\t\tCSArrayIn.push(TimeIn);\\n\"\n\"\t\t\t\t\tCSArrayOut.push(TimeOut);\\n\"\n\"\t\t\t\t\tCSArrayCpu.push(Cpu);\\n\"\n\"\t\t\t\t\tTimeIn = -1;\\n\"\n\"\t\t\t\t}\\n\"\n\"\t\t\t}\\n\"\n\"\t\t\tj += 3;\\n\"\n\"\t\t}\\n\"\n\"\t\tCSObject = new Object();\\n\"\n\"\t\tCSObject.Size = CSArrayIn.length;\\n\"\n\"\t\tCSObject.In = CSArrayIn;\\n\"\n\"\t\tCSObject.Out = CSArrayOut;\\n\"\n\"\t\tCSObject.Cpu = CSArrayCpu;\\n\"\n\"\t\tCSwitchCache[ThreadId] = CSObject;\\n\"\n\"\t}\\n\"\n\"\\n\"\n\"}\\n\"\n\"function PreprocessContextSwitchCache()\\n\"\n\"{\\n\"\n\"\tProfileEnter(\\\"PreprocessContextSwitchCache\\\");\\n\"\n\"\tvar AllThreads = {};\\n\"\n\"\tvar nCount = CSwitchTime.length;\\n\"\n\"\tfor(var i = 0; i < nCount; ++i)\\n\"\n\"\t{\t\\n\"\n\"\t\tvar nThreadIn = CSwitchThreadInOutCpu[i];\\n\"\n\"\t\tif(!AllThreads[nThreadIn])\\n\"\n\"\t\t{\\n\"\n\"\t\t    AllThreads[nThreadIn] = \\'\\' + nThreadIn;\\n\"\n\"\t\t    var FoundThread = false;\\n\"\n\"\t\t    for(var i = 0; i < ThreadIds.length; ++i)\\n\"\n\"\t\t    {\\n\"\n\"\t\t        if(ThreadIds[i] == nThreadIn)\\n\"\n\"\t\t        {\\n\"\n\"\t\t            FoundThread = true;\\n\"\n\"\t\t        }\\n\"\n\"\t\t    }\\n\"\n\"\t\t    if(!FoundThread)\\n\"\n\"\t\t    {\\n\"\n\"\t\t        CSwitchOnlyThreads.push(nThreadIn);\\n\"\n\"\t\t    }\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"\tfor(var i = 0; i < CSwitchOnlyThreads.length; ++i)\\n\"\n\"\t{\\n\"\n\"\t\tPreprocessContextSwitchCacheItem(CSwitchOnlyThreads[i]);\\n\"\n\"\t}\\n\"\n\"\tfor(var i = 0; i < ThreadIds.length; ++i)\\n\"\n\"\t{\\n\"\n\"\t\tPreprocessContextSwitchCacheItem(ThreadIds[i]);\t\\n\"\n\"\t}\\n\"\n\"\tfunction HandleMissingThread(a)\\n\"\n\"\t{\\n\"\n\"\t\tif(!CSwitchThreads[a])\\n\"\n\"\t\t{\\n\"\n\"\t\t\tCSwitchThreads[a] = {\\'tid\\':a, \\'pid\\':-1, \\'t\\':\\'?\\', \\'p\\':\\'?\\'}\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"\tfunction CompareThreadInfo(a, b)\\n\"\n\"\t{\\n\"\n\"\t\tif(a.pid != b.pid)\\n\"\n\"\t\t\treturn b.pid - a.pid;\\n\"\n\"\t\telse\\n\"\n\"\t\t\treturn a.tid - b.tid;\\n\"\n\"\t}\\n\"\n\"\tCSwitchOnlyThreads.sort( function(a, b){ \\n\"\n\"\t\tHandleMissingThread(a);\\n\"\n\"\t\tHandleMissingThread(b);\\n\"\n\"\t\treturn CompareThreadInfo(CSwitchThreads[a], CSwitchThreads[b]); \\n\"\n\"\t} );\\n\"\n\"\\n\"\n\"\tProfileLeave();\\n\"\n\"}\\n\"\n\"\\n\"\n\"function DrawContextSwitchBars(context, ThreadId, fScaleX, fOffsetY, fDetailedOffset, nHoverColor, MinWidth, bDrawEnabled)\\n\"\n\"{\\n\"\n\"\tProfileEnter(\\\"DrawContextSwitchBars\\\");\\n\"\n\"\tvar CSObject = CSwitchCache[ThreadId];\\n\"\n\"\tif(CSObject)\\n\"\n\"\t{\\n\"\n\"\t\tvar Size = CSObject.Size;\t\t\\n\"\n\"\t\tvar In = CSObject.In;\\n\"\n\"\t\tvar Out = CSObject.Out;\\n\"\n\"\t\tvar Cpu = CSObject.Cpu;\\n\"\n\"\t\tvar nNumColors = CSwitchColors.length;\\n\"\n\"\t\tfor(var i = 0; i < Size; ++i)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tvar TimeIn = In[i];\\n\"\n\"\t\t\tvar TimeOut = Out[i];\\n\"\n\"\t\t\tvar ActiveCpu = Cpu[i];\\n\"\n\"\\n\"\n\"\t\t\tvar X = (TimeIn - fDetailedOffset) * fScaleX;\\n\"\n\"\t\t\tif(X > nWidth)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tbreak;\\n\"\n\"\t\t\t}\\n\"\n\"\t\t\tvar W = (TimeOut - TimeIn) * fScaleX;\\n\"\n\"\t\t\tif(W > MinWidth && X+W > 0)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tif(nHoverCSCpu == ActiveCpu || bDrawEnabled)\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\tif(nHoverCSCpu == ActiveCpu)\\n\"\n\"\t\t\t\t\t{\\n\"\n\"\t\t\t\t\t\tcontext.fillStyle = nHoverColor;\\n\"\n\"\t\t\t\t\t}\\n\"\n\"\t\t\t\t\telse\\n\"\n\"\t\t\t\t\t{\\n\"\n\"\t\t\t\t\t\tcontext.fillStyle = CSwitchColors[ActiveCpu % nNumColors];\\n\"\n\"\t\t\t\t\t}\\n\"\n\"\t\t\t\t\tcontext.fillRect(X, fOffsetY, W, CSwitchHeight);\\n\"\n\"\t\t\t\t}\\n\"\n\"\t\t\t\tif(DetailedViewMouseX >= X && DetailedViewMouseX <= X+W && DetailedViewMouseY < fOffsetY+CSwitchHeight && DetailedViewMouseY >= fOffsetY)\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\tnHoverCSCpuNext = ActiveCpu;\\n\"\n\"\t\t\t\t\tRangeCpuNext.Begin = TimeIn;\\n\"\n\"\t\t\t\t\tRangeCpuNext.End = TimeOut;\\n\"\n\"\t\t\t\t\tRangeCpuNext.Thread = ThreadId;\\n\"\n\"\t\t\t\t\tRangeGpuNext.Begin = RangeGpuNext.End = -1;\\n\"\n\"\t\t\t\t}\\n\"\n\"\t\t\t}\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"\tProfileLeave();\\n\"\n\"}\\n\"\n\"\\n\"\n\"function SetHoverToken(nToken, nIndex, nLog)\\n\"\n\"{\\n\"\n\"\tfor(var i = Frames.length-1; i >= 0; --i)\\n\"\n\"\t{\\n\"\n\"\t\tvar IndexStart = LodData[0].LogStart[i][nLog];\\n\"\n\"\t\tif(nIndex >= IndexStart)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tnHoverFrame = i;\\n\"\n\"\t\t\tnHoverTokenNext = nToken;\\n\"\n\"\t\t\tnHoverTokenIndexNext = nIndex - IndexStart;\\n\"\n\"\t\t\tnHoverTokenLogIndexNext = nLog;\\n\"\n\"\t\t\tbreak;\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"}\\n\"\n\"\\n\"\n\"function DrawDetailedView(context, MinWidth, bDrawEnabled)\\n\"\n\"{\\n\"\n\"\tif(bDrawEnabled)\\n\"\n\"\t{\\n\"\n\"\t\tDrawDetailedBackground(context);\\n\"\n\"\t}\\n\"\n\"\\n\"\n\"\tvar colors = [ \\'#ff0000\\', \\'#ff00ff\\', \\'#ffff00\\'];\\n\"\n\"\\n\"\n\"\tvar fScaleX = nWidth / fDetailedRange; \\n\"\n\"\tvar fOffsetY = -nOffsetY + BoxHeight;\\n\"\n\"\tnHoverTokenNext = -1;\\n\"\n\"\tnHoverTokenLogIndexNext = -1;\\n\"\n\"\tnHoverTokenIndexNext = -1;\\n\"\n\"\tnHoverCounter += nHoverCounterDelta;\\n\"\n\"\tif(nHoverCounter >= 255) \\n\"\n\"\t{\\n\"\n\"\t\tnHoverCounter = 255;\\n\"\n\"\t\tnHoverCounterDelta = -nHoverCounterDelta;\\n\"\n\"\t}\\n\"\n\"\tif(nHoverCounter < 128) \\n\"\n\"\t{\\n\"\n\"\t\tnHoverCounter = 128;\\n\"\n\"\t\tnHoverCounterDelta = -nHoverCounterDelta;\\n\"\n\"\t}\\n\"\n\"\tvar nHoverHigh = nHoverCounter.toString(16);\\n\"\n\"\tvar nHoverLow = (127+255-nHoverCounter).toString(16);\\n\"\n\"\tvar nHoverColor = \\'#\\' + nHoverHigh + nHoverHigh + nHoverHigh;\\n\"\n\"\\n\"\n\"\tcontext.fillStyle = \\'black\\';\\n\"\n\"\tcontext.font = Font;\\n\"\n\"\tvar nNumLogs = Frames[0].ts.length;\\n\"\n\"\tvar fTimeEnd = fDetailedOffset + fDetailedRange;\\n\"\n\"\\n\"\n\"\tvar FirstFrame = 0;\\n\"\n\"\tfor(var i = 0; i < Frames.length ; i++)\\n\"\n\"\t{\\n\"\n\"\t\tif(Frames[i].frameend < fDetailedOffset)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tFirstFrame = i;\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"\tvar nMinTimeMs = MinWidth / fScaleX;\\n\"\n\"\t{\\n\"\n\"\\n\"\n\"\t\tvar Batches = new Array(TimerInfo.length);\\n\"\n\"\t\tvar BatchesTxt = Array();\\n\"\n\"\t\tvar BatchesTxtPos = Array();\\n\"\n\"\t\tvar BatchesTxtColor = [\\'#ffffff\\', \\'#333333\\'];\\n\"\n\"\t\tif(!ThreadY)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tThreadY = new Array(ThreadNames.length+1);\\n\"\n\"\t\t}\\n\"\n\"\\n\"\n\"\t\tfor(var i = 0; i < 2; ++i)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tBatchesTxt[i] = Array();\\n\"\n\"\t\t\tBatchesTxtPos[i] = Array();\\n\"\n\"\t\t}\\n\"\n\"\t\tfor(var i = 0; i < Batches.length; ++i)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tBatches[i] = Array();\\n\"\n\"\t\t}\\n\"\n\"\t\tfor(nLog = 0; nLog < nNumLogs; nLog++)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tvar ThreadName = ThreadNames[nLog];\\n\"\n\"\t\t\tThreadY[nLog] = fOffsetY;\\n\"\n\"\t\t\tif(ThreadsAllActive || ThreadsActive[ThreadName])\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tvar LodIndex = 0;\\n\"\n\"\t\t\t\tvar MinDelta = 0;\\n\"\n\"\t\t\t\tvar NextLod = 1;\\n\"\n\"\t\t\t\twhile(NextLod < LodData.length && LodData[NextLod].MinDelta[nLog] < nMinTimeMs)\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\tLodIndex = NextLod;\\n\"\n\"\t\t\t\t\tNextLod = NextLod + 1;\\n\"\n\"\t\t\t\t\tMinDelta = LodData[LodIndex].MinDelta[nLog];\\n\"\n\"\t\t\t\t}\\n\"\n\"\t\t\t\tif(LodIndex == LodData.length)\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\tLodIndex = LodData.length-1;\\n\"\n\"\t\t\t\t}\\n\"\n\"\t\t\t\tif(DisableLod)\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\tLodIndex = 0;\\n\"\n\"\t\t\t\t}\\n\"\n\"\\n\"\n\"\t\t\t\tcontext.fillStyle = \\'white\\';\\n\"\n\"\t\t\t\tfOffsetY += BoxHeight;\\n\"\n\"\t\t\t\tcontext.fillText(ThreadName, 0, fOffsetY);\\n\"\n\"\t\t\t\tif(nContextSwitchEnabled)\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\tDrawContextSwitchBars(context, ThreadIds[nLog], fScaleX, fOffsetY, fDetailedOffset, nHoverColor, MinWidth, bDrawEnabled);\\n\"\n\"\t\t\t\t\tfOffsetY += CSwitchHeight+1;\\n\"\n\"\t\t\t\t}\\n\"\n\"\t\t\t\tvar MaxDepth = 1;\\n\"\n\"\t\t\t\tvar StackPos = 0;\\n\"\n\"\t\t\t\tvar Stack = Array(20);\\n\"\n\"\t\t\t\tvar Lod = LodData[LodIndex];\\n\"\n\"\\n\"\n\"\t\t\t\tvar TypeArray = g_TypeArray[nLog];\\n\"\n\"\t\t\t\tvar TimeArray = g_TimeArray[nLog];\\n\"\n\"\t\t\t\tvar IndexArray = g_IndexArray[nLog];\\n\"\n\"\t\t\t\tvar LabelArray = g_LabelArray[nLog];\\n\"\n\"\t\t\t\tvar GlobalArray = Lod.GlobalArray[nLog];\\n\"\n\"\\n\"\n\"\t\t\t\tvar LocalFirstFrame = Frames[FirstFrame].FirstFrameIndex[nLog];\\n\"\n\"\t\t\t\tvar IndexStart = Lod.LogStart[LocalFirstFrame][nLog];\\n\"\n\"\t\t\t\tvar IndexEnd = GlobalArray.length;\\n\"\n\"\\n\"\n\"\t\t\t\tfor(var j = IndexStart; j < IndexEnd; ++j)\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\tvar glob = GlobalArray[j];\\n\"\n\"\t\t\t\t\tvar type = TypeArray[glob];\\n\"\n\"\t\t\t\t\tvar index = IndexArray[glob];\\n\"\n\"\t\t\t\t\tvar time = TimeArray[glob];\\n\"\n\"\t\t\t\t\tif(type == 1)\\n\"\n\"\t\t\t\t\t{\\n\"\n\"\t\t\t\t\t\tStack[StackPos] = glob;\\n\"\n\"\t\t\t\t\t\tStackPos++;\\n\"\n\"\t\t\t\t\t\tif(StackPos > MaxDepth)\\n\"\n\"\t\t\t\t\t\t{\\n\"\n\"\t\t\t\t\t\t\tMaxDepth = StackPos;\\n\"\n\"\t\t\t\t\t\t}\\n\"\n\"\t\t\t\t\t}\\n\"\n\"\t\t\t\t\telse if(type == 0)\\n\"\n\"\t\t\t\t\t{\\n\"\n\"\t\t\t\t\t\tif(StackPos>0)\\n\"\n\"\t\t\t\t\t\t{\\n\"\n\"\t\t\t\t\t\t\tStackPos--;\\n\"\n\"\\n\"\n\"\t\t\t\t\t\t\tvar globstart = Stack[StackPos];\\n\"\n\"\t\t\t\t\t\t\tvar timestart = TimeArray[globstart];\\n\"\n\"\t\t\t\t\t\t\tvar timeend = time;\\n\"\n\"\t\t\t\t\t\t\tvar X = (timestart - fDetailedOffset) * fScaleX;\\n\"\n\"\t\t\t\t\t\t\tvar Y = fOffsetY + StackPos * BoxHeight;\\n\"\n\"\t\t\t\t\t\t\tvar W = (timeend-timestart)*fScaleX;\\n\"\n\"\\n\"\n\"\t\t\t\t\t\t\tif(W > MinWidth && X < nWidth && X+W > 0)\\n\"\n\"\t\t\";\n\nconst size_t g_MicroProfileHtml_end_1_size = sizeof(g_MicroProfileHtml_end_1);\nconst char g_MicroProfileHtml_end_2[] =\n\"\t\t\t\t\t{\\n\"\n\"\t\t\t\t\t\t\t\tif(bDrawEnabled || index == nHoverToken)\\n\"\n\"\t\t\t\t\t\t\t\t{\\n\"\n\"\t\t\t\t\t\t\t\t\tBatches[index].push(X);\\n\"\n\"\t\t\t\t\t\t\t\t\tBatches[index].push(Y);\\n\"\n\"\t\t\t\t\t\t\t\t\tBatches[index].push(W);\\n\"\n\"\t\t\t\t\t\t\t\t\tDebugDrawQuadCount++;\\n\"\n\"\\n\"\n\"\t\t\t\t\t\t\t\t\tvar XText = X < 0 ? 0 : X;\\n\"\n\"\t\t\t\t\t\t\t\t\tvar WText = W - (XText-X);\\n\"\n\"\t\t\t\t\t\t\t\t\tif(XText + WText > nWidth)\\n\"\n\"\t\t\t\t\t\t\t\t\t{\\n\"\n\"\t\t\t\t\t\t\t\t\t\tWText = nWidth - XText;\\n\"\n\"\t\t\t\t\t\t\t\t\t}\\n\"\n\"\t\t\t\t\t\t\t\t\tvar Name = LabelArray[globstart] ? LabelArray[globstart] : TimerInfo[index].name;\\n\"\n\"\t\t\t\t\t\t\t\t\tvar BarTextLen = Math.floor((WText-2)/FontWidth);\\n\"\n\"\t\t\t\t\t\t\t\t\tvar TimeText = TimeToMsString(timeend-timestart);\\n\"\n\"\t\t\t\t\t\t\t\t\tvar TimeTextLen = TimeText.length;\\n\"\n\"\\n\"\n\"\t\t\t\t\t\t\t\t\tif(BarTextLen >= 2)\\n\"\n\"\t\t\t\t\t\t\t\t\t{\\n\"\n\"\t\t\t\t\t\t\t\t\t\tif(BarTextLen < Name.length)\\n\"\n\"\t\t\t\t\t\t\t\t\t\t\tName = Name.substr(0, BarTextLen);\\n\"\n\"\t\t\t\t\t\t\t\t\t\tvar txtidx = TimerInfo[index].textcolorindex;\\n\"\n\"\t\t\t\t\t\t\t\t\t\tvar YPos = Y+BoxHeight-FontAscent;\\n\"\n\"\t\t\t\t\t\t\t\t\t\tBatchesTxt[txtidx].push(Name);\\n\"\n\"\t\t\t\t\t\t\t\t\t\tBatchesTxtPos[txtidx].push(XText+2);\\n\"\n\"\\n\"\n\"\t\t\t\t\t\t\t\t\t\tBatchesTxtPos[txtidx].push(YPos);\\n\"\n\"\t\t\t\t\t\t\t\t\t\tDebugDrawTextCount++;\\n\"\n\"\t\t\t\t\t\t\t\t\t\tif(BarTextLen - Name.length > TimeTextLen)\\n\"\n\"\t\t\t\t\t\t\t\t\t\t{\\n\"\n\"\t\t\t\t\t\t\t\t\t\t\tBatchesTxt[txtidx].push(TimeText);\\n\"\n\"\t\t\t\t\t\t\t\t\t\t\tBatchesTxtPos[txtidx].push(XText+WText-2 - TimeTextLen * FontWidth);\\n\"\n\"\t\t\t\t\t\t\t\t\t\t\tBatchesTxtPos[txtidx].push(YPos);\\n\"\n\"\t\t\t\t\t\t\t\t\t\t\tDebugDrawTextCount++;\\n\"\n\"\t\t\t\t\t\t\t\t\t\t}\\n\"\n\"\\n\"\n\"\t\t\t\t\t\t\t\t\t}\\n\"\n\"\t\t\t\t\t\t\t\t}\\n\"\n\"\\n\"\n\"\t\t\t\t\t\t\t\tif(DetailedViewMouseX >= X && DetailedViewMouseX <= X+W && DetailedViewMouseY < Y+BoxHeight && DetailedViewMouseY >= Y)\\n\"\n\"\t\t\t\t\t\t\t\t{\\n\"\n\"\t\t\t\t\t\t\t\t\tRangeCpuNext.Begin = timestart;\\n\"\n\"\t\t\t\t\t\t\t\t\tRangeCpuNext.End = timeend;\\n\"\n\"\t\t\t\t\t\t\t\t\tRangeCpuNext.Thread = nLog;\\n\"\n\"\\n\"\n\"\t\t\t\t\t\t\t\t\tif(TypeArray[globstart+1] == 4 && TypeArray[glob+1] == 4)\\n\"\n\"\t\t\t\t\t\t\t\t\t{\\n\"\n\"\t\t\t\t\t\t\t\t\t\tRangeGpuNext.Begin = RangeCpuNext.Begin;\\n\"\n\"\t\t\t\t\t\t\t\t\t\tRangeGpuNext.End = RangeCpuNext.End;\\n\"\n\"\t\t\t\t\t\t\t\t\t\tRangeGpuNext.Thread = nLog;\\n\"\n\"\t\t\t\t\t\t\t\t\t\t//cpu tick is stored following\\n\"\n\"\t\t\t\t\t\t\t\t\t\tRangeCpuNext.Begin = TimeArray[globstart+1];\\n\"\n\"\t\t\t\t\t\t\t\t\t\tRangeCpuNext.End = TimeArray[glob+1];\\n\"\n\"\t\t\t\t\t\t\t\t\t\tRangeCpuNext.Thread = IndexArray[globstart+1];\\n\"\n\"\t\t\t\t\t\t\t\t\t}\\n\"\n\"\t\t\t\t\t\t\t\t\telse\\n\"\n\"\t\t\t\t\t\t\t\t\t{\\n\"\n\"\t\t\t\t\t\t\t\t\t\tRangeGpuNext.Begin = -1;\\n\"\n\"\t\t\t\t\t\t\t\t\t\tRangeGpuNext.End = -1\\n\"\n\"\t\t\t\t\t\t\t\t\t}\\n\"\n\"\\n\"\n\"\t\t\t\t\t\t\t\t\tSetHoverToken(index, glob, nLog)\\n\"\n\"\t\t\t\t\t\t\t\t}\\n\"\n\"\t\t\t\t\t\t\t}\\n\"\n\"\t\t\t\t\t\t\tif(StackPos == 0 && time > fTimeEnd)\\n\"\n\"\t\t\t\t\t\t\t\tbreak;\t\t\t\t\t\t\t\t\t\t\t\\n\"\n\"\t\t\t\t\t\t}\\n\"\n\"\t\t\t\t\t}\\n\"\n\"\t\t\t\t}\\n\"\n\"\t\t\t\tfOffsetY += (1+g_MaxStack[nLog]) * BoxHeight;\\n\"\n\"\t\t\t}\\n\"\n\"\t\t\tThreadY[nLog+1] = fOffsetY;\\n\"\n\"\t\t}\\n\"\n\"\\n\"\n\"\t\tif(nContextSwitchEnabled) //non instrumented threads.\\n\"\n\"\t\t{\\n\"\n\"\t\t\tvar CurrentPid = -112;\\n\"\n\"\t\t\tvar ContextSwitchThreads = CSwitchOnlyThreads;\\n\"\n\"\t\t\tfunction DrawHeader(str, X, Y)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tvar width = str.length * FontWidth;\\n\"\n\"\t\t\t\tcontext.globalAlpha = 0.5;\\n\"\n\"\t\t\t\tcontext.fillStyle = \\'grey\\';\\n\"\n\"\t\t\t\tcontext.fillRect(X, Y-FontHeight + 2, width, FontHeight);\\n\"\n\"\t\t\t\tcontext.globalAlpha = 1.0;\\n\"\n\"\t\t\t\tcontext.fillStyle = \\'white\\';\\n\"\n\"\t\t\t\tcontext.fillText(str, X, Y);\\n\"\n\"\\n\"\n\"\\n\"\n\"\t\t\t}\\n\"\n\"\t\t\tfor(var i = 0; i < ContextSwitchThreads.length; ++i)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tvar ThreadId = ContextSwitchThreads[i];\\n\"\n\"\t\t\t\tvar ThreadName = \\'\\' + ThreadId;\\n\"\n\"\t\t\t\tvar TI = CSwitchThreads[ThreadId];\\n\"\n\"\\n\"\n\"\t\t\t\tif(TI)\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\tif(CurrentPid != TI.pid)\\n\"\n\"\t\t\t\t\t{\\n\"\n\"\t\t\t\t\t\tfOffsetY += BoxHeight + 1;\\n\"\n\"\t\t\t\t\t\tCurrentPid = TI.pid;\\n\"\n\"\t\t\t\t\t\tvar str = TI.pid.toString(16) +\\':\\' +TI.p;\\n\"\n\"\t\t\t\t\t\tDrawHeader(str, 0, fOffsetY+5);\\n\"\n\"\t\t\t\t\t\tfOffsetY += BoxHeight + 1;\\n\"\n\"\t\t\t\t\t}\\n\"\n\"\t\t\t\t}\\n\"\n\"\\n\"\n\"\t\t\t\tDrawContextSwitchBars(context, ThreadId, fScaleX, fOffsetY, fDetailedOffset, nHoverColor, MinWidth, bDrawEnabled);\\n\"\n\"\\n\"\n\"\t\t\t\tif(TI)\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\tDrawHeader(TI.tid.toString(16) +\\':\\' +TI.t, 10, fOffsetY+5);\\n\"\n\"\t\t\t\t}\\n\"\n\"\t\t\t\tfOffsetY += BoxHeight + 1;\\n\"\n\"\t\t\t}\\n\"\n\"\t\t}\\n\"\n\"\\n\"\n\"\\n\"\n\"\t\t{\\n\"\n\"\t\t\tfor(var i = 0; i < Batches.length; ++i)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tvar a = Batches[i];\\n\"\n\"\t\t\t\tif(a.length)\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\tif(!DisableMerge)\\n\"\n\"\t\t\t\t\t{\\n\"\n\"\t\t\t\t\t\tfor(var j = 0; j < a.length; j += 3)\\n\"\n\"\t\t\t\t\t\t{\t\t\t\t\t\t\\n\"\n\"\t\t\t\t\t\t\tvar X = a[j];\\n\"\n\"\t\t\t\t\t\t\tvar Y = a[j+1];\\n\"\n\"\t\t\t\t\t\t\tvar BaseWidth = j + 2;\\n\"\n\"\t\t\t\t\t\t\tvar W = a[BaseWidth];\\n\"\n\"\t\t\t\t\t\t\twhile(j+1 < a.length && W < 1)\\n\"\n\"\t\t\t\t\t\t\t{\\n\"\n\"\t\t\t\t\t\t\t\tvar jnext = j+3;\\n\"\n\"\t\t\t\t\t\t\t\tvar XNext = a[jnext];\\n\"\n\"\t\t\t\t\t\t\t\tvar YNext = a[jnext+1];\\n\"\n\"\t\t\t\t\t\t\t\tvar WNext = a[jnext+2];\\n\"\n\"\t\t\t\t\t\t\t\tvar Delta = XNext - (X+W);\\n\"\n\"\t\t\t\t\t\t\t\tvar YDelta = Math.abs(Y - YNext);\t\t\t\t\t\t\t\\n\"\n\"\t\t\t\t\t\t\t\tif(Delta < 0.3 && YDelta < 0.5 && WNext < 1)\\n\"\n\"\t\t\t\t\t\t\t\t{\\n\"\n\"\t\t\t\t\t\t\t\t\tW = (XNext+WNext) - X;\\n\"\n\"\t\t\t\t\t\t\t\t\ta[BaseWidth] = W;\\n\"\n\"\t\t\t\t\t\t\t\t\ta[jnext+2] = 0;\\n\"\n\"\t\t\t\t\t\t\t\t\tj += 3;\\n\"\n\"\t\t\t\t\t\t\t\t}\\n\"\n\"\t\t\t\t\t\t\t\telse\\n\"\n\"\t\t\t\t\t\t\t\t{\\n\"\n\"\t\t\t\t\t\t\t\t\tbreak;\\n\"\n\"\t\t\t\t\t\t\t\t}\\n\"\n\"\\n\"\n\"\t\t\t\t\t\t\t}\\n\"\n\"\t\t\t\t\t\t}\\n\"\n\"\t\t\t\t\t}\\n\"\n\"\t\t\t\t\tvar off = 0.7;\\n\"\n\"\t\t\t\t\tvar off2 = 2*off;\\n\"\n\"\t\t\t\t\tcontext.fillStyle = TimerInfo[i].colordark;\\n\"\n\"\t\t\t\t\tfor(var j = 0; j < a.length; j += 3)\\n\"\n\"\t\t\t\t\t{\t\t\t\t\t\t\\n\"\n\"\t\t\t\t\t\tvar X = a[j];\\n\"\n\"\t\t\t\t\t\tvar Y = a[j+1];\\n\"\n\"\t\t\t\t\t\tvar W = a[j+2];\\n\"\n\"\t\t\t\t\t\tif(W >= 1)\\n\"\n\"\t\t\t\t\t\t{\\n\"\n\"\t\t\t\t\t\t\tcontext.fillRect(X, Y, W, BoxHeight-1);\\n\"\n\"\t\t\t\t\t\t}\\n\"\n\"\t\t\t\t\t}\\n\"\n\"\t\\n\"\n\"\\n\"\n\"\t\t\t\t\tif(i == nHoverToken)\\n\"\n\"\t\t\t\t\t{\\n\"\n\"\t\t\t\t\t\tcontext.fillStyle = nHoverColor;\\n\"\n\"\t\t\t\t\t}\\n\"\n\"\t\t\t\t\telse\\n\"\n\"\t\t\t\t\t{\\n\"\n\"\t\t\t\t\t\tcontext.fillStyle = TimerInfo[i].color;\\n\"\n\"\t\t\t\t\t}\\n\"\n\"\t\t\t\t\tfor(var j = 0; j < a.length; j += 3)\\n\"\n\"\t\t\t\t\t{\t\t\t\t\t\t\\n\"\n\"\t\t\t\t\t\tvar X = a[j];\\n\"\n\"\t\t\t\t\t\tvar Y = a[j+1];\\n\"\n\"\t\t\t\t\t\tvar W = a[j+2];\\n\"\n\"\t\t\t\t\t\tif(W > 0)\\n\"\n\"\t\t\t\t\t\t{\\n\"\n\"\t\t\t\t\t\t\tcontext.fillRect(X+off, Y+off, W-off2, BoxHeight-1-off2);\\n\"\n\"\t\t\t\t\t\t}\\n\"\n\"\t\t\t\t\t}\\n\"\n\"\t\t\t\t}\\n\"\n\"\t\t\t}\t\\n\"\n\"\t\t}\\n\"\n\"\t\tfor(var i = 0; i < BatchesTxt.length; ++i)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tcontext.fillStyle = BatchesTxtColor[i];\\n\"\n\"\t\t\tvar TxtArray = BatchesTxt[i];\\n\"\n\"\t\t\tvar PosArray = BatchesTxtPos[i];\\n\"\n\"\t\t\tfor(var j = 0; j < TxtArray.length; ++j)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tvar k = j * 2;\\n\"\n\"\t\t\t\tcontext.fillText(TxtArray[j], PosArray[k],PosArray[k+1]);\\n\"\n\"\t\t\t}\\n\"\n\"\t\t}\\n\"\n\"\\n\"\n\"\t}\\n\"\n\"}\\n\"\n\"function DrawTextBox(context, text, x, y, align)\\n\"\n\"{\\n\"\n\"\tvar textsize = context.measureText(text).width;\\n\"\n\"\tvar offsetx = 0;\\n\"\n\"\tvar offsety = -FontHeight;\\n\"\n\"\tif(align == \\'center\\')\\n\"\n\"\t{\\n\"\n\"\t\toffsetx = -textsize / 2.0;\\n\"\n\"\t}\\n\"\n\"\telse if(align == \\'right\\')\\n\"\n\"\t{\\n\"\n\"\t\toffsetx = -textsize;\\n\"\n\"\t}\\n\"\n\"\tcontext.fillStyle = nBackColors[0];\\n\"\n\"\tcontext.fillRect(x + offsetx, y + offsety, textsize+2, FontHeight + 2);\\n\"\n\"\tcontext.fillStyle = \\'white\\';\\n\"\n\"\tcontext.fillText(text, x, y);\\n\"\n\"\\n\"\n\"}\\n\"\n\"function DrawRange(context, Range, ColorBack, ColorFront, Name)\\n\"\n\"{\\n\"\n\"\tvar fBegin = Range.Begin;\\n\"\n\"\tvar fEnd = Range.End;\\n\"\n\"\tvar OffsetTop = Range.YBegin;\\n\"\n\"\tvar OffsetBottom = Range.YEnd;\\n\"\n\"\tif(fBegin < fEnd)\\n\"\n\"\t{\\n\"\n\"\t\tvar MarginTop = 0.5 * FontHeight;\\n\"\n\"\t\tvar MarginBottom = nHeight - 1.5 * FontHeight;\\n\"\n\"\t\tif(OffsetTop < MarginTop)\\n\"\n\"\t\t\tOffsetTop = MarginTop;\\n\"\n\"\t\tif(OffsetBottom > MarginBottom)\\n\"\n\"\t\t\tOffsetBottom = MarginBottom;\\n\"\n\"\t\tvar fRulerOffset = FontHeight * 0.5;\\n\"\n\"\t\tvar fScaleX = nWidth / fDetailedRange; \\n\"\n\"\t\tvar X = (fBegin - fDetailedOffset) * fScaleX;\\n\"\n\"\t\tvar YSpace = (FontHeight+2);\\n\"\n\"\t\tvar Y = OffsetTop;\\n\"\n\"\t\tvar YBottom = OffsetBottom;\\n\"\n\"\t\tvar W = (fEnd - fBegin) * fScaleX;\\n\"\n\"\t\tcontext.globalAlpha = 0.1;\\n\"\n\"\t\tcontext.fillStyle = ColorBack;\\n\"\n\"\t\tcontext.fillRect(X, OffsetTop + fRulerOffset, W, OffsetBottom - OffsetTop);\\n\"\n\"\t\tcontext.globalAlpha = 1;\\n\"\n\"\t\tcontext.strokeStyle = ColorFront;\\n\"\n\"\t\tcontext.beginPath();\\n\"\n\"\t\tcontext.moveTo(X, 0);\\n\"\n\"\t\tcontext.lineTo(X, nHeight);\\n\"\n\"\t\tcontext.moveTo(X+W, 0);\\n\"\n\"\t\tcontext.lineTo(X+W, nHeight);\\n\"\n\"\t\tcontext.stroke();\\n\"\n\"\t\tvar Duration = (fEnd - fBegin).toFixed(2) + \\\"ms\\\";\\n\"\n\"\t\tvar Center = ((fBegin + fEnd) / 2.0) - fDetailedOffset;\\n\"\n\"\t\tvar DurationWidth = context.measureText(Duration+ \\\"   \\\").width;\\n\"\n\"\\n\"\n\"\t\tcontext.fillStyle = \\'white\\';\\n\"\n\"\t\tcontext.textAlign = \\'right\\';\\n\"\n\"\t\tvar TextPosY = Y + YSpace;\\n\"\n\"\t\tDrawTextBox(context, fBegin.toFixed(2), X-3, TextPosY, \\'right\\');\\n\"\n\"\t\tvar YS = [Y, YBottom];\\n\"\n\"\t\tfor(var i = 0; i < YS.length; ++i)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tvar Y = YS[i];\\n\"\n\"\t\t\tvar Y0 = Y + fRulerOffset;\\n\"\n\"\t\t\tvar W0 = W - DurationWidth + FontWidth*1.5;\\n\"\n\"\t\t\tif(W0 > 6)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tcontext.textAlign = \\'center\\';\\n\"\n\"\t\t\t\tDrawTextBox(context, Duration,Center * fScaleX, Y + YSpace, \\'center\\');\\n\"\n\"\t\t\t\tW0 = W0 / 2.0;\\n\"\n\"\t\t\t\tvar X0 = X + W0;\\n\"\n\"\t\t\t\tvar X1 = X + W - W0;\\n\"\n\"\t\t\t\tcontext.strokeStyle = ColorFront;\\n\"\n\"\t\t\t\tcontext.beginPath();\\n\"\n\"\t\t\t\tcontext.moveTo(X, Y0);\\n\"\n\"\t\t\t\tcontext.lineTo(X0, Y0);\\n\"\n\"\t\t\t\tcontext.moveTo(X0, Y0-2);\\n\"\n\"\t\t\t\tcontext.lineTo(X0, Y0+2);\\n\"\n\"\t\t\t\tcontext.moveTo(X1, Y0-2);\\n\"\n\"\t\t\t\tcontext.lineTo(X1, Y0+2);\\n\"\n\"\t\t\t\tcontext.moveTo(X1, Y0);\\n\"\n\"\t\t\t\tcontext.lineTo(X + W, Y0);\\n\"\n\"\t\t\t\tcontext.stroke();\\n\"\n\"\t\t\t}\\n\"\n\"\t\t\telse\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tif(i == 1)\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\tcontext.textAlign = \\'right\\';\\n\"\n\"\t\t\t\t\tDrawTextBox(context, Duration, X - 3, Y0, \\'right\\');\\n\"\n\"\t\t\t\t\tcontext.textAlign = \\'left\\';\\n\"\n\"\t\t\t\t\tDrawTextBox(context, Duration, X + W + 2, Y0, \\'left\\');\\n\"\n\"\t\t\t\t}\\n\"\n\"\t\t\t\tcontext.strokeStyle = ColorFront;\\n\"\n\"\t\t\t\tcontext.beginPath();\\n\"\n\"\t\t\t\tcontext.moveTo(X, Y0);\\n\"\n\"\t\t\t\tcontext.lineTo(X+W, Y0);\\n\"\n\"\t\t\t\tcontext.stroke();\\n\"\n\"\t\t\t}\\n\"\n\"\t\t}\\n\"\n\"\t\tcontext.textAlign = \\'left\\';\\n\"\n\"\t\tDrawTextBox(context, fEnd.toFixed(2), X + W + 2, TextPosY, \\'left\\');\\n\"\n\"\t\tDrawTextBox(context, Name, X + W + 2, OffsetTop + YSpace + FontHeight, \\'left\\');\\n\"\n\"\t}\\n\"\n\"\treturn 1;\\n\"\n\"}\\n\"\n\"\\n\"\n\"function DrawDetailed(Animation)\\n\"\n\"{\\n\"\n\"\tif(AnimationActive != Animation || !Initialized)\\n\"\n\"\t{\\n\"\n\"\t\treturn;\\n\"\n\"\t}\\n\"\n\"\tProfileEnter(\\\"DrawDetailed\\\");\\n\"\n\"\tDebugDrawQuadCount = 0;\\n\"\n\"\tDebugDrawTextCount = 0;\\n\"\n\"\tnHoverCSCpuNext = -1;\\n\"\n\"\\n\"\n\"\tRangeCpuNext = RangeInit();\\n\"\n\"\tRangeGpuNext = RangeInit();\\n\"\n\"\tRangeGpu = RangeInit();\\n\"\n\"\\n\"\n\"\tvar start = new Date();\\n\"\n\"\tnDrawCount++;\\n\"\n\"\\n\"\n\"\tvar context = CanvasDetailedView.getContext(\\'2d\\');\\n\"\n\"\tvar offscreen = CanvasDetailedOffscreen.getContext(\\'2d\\');\\n\"\n\"\tvar fScaleX = nWidth / fDetailedRange; \\n\"\n\"\tvar fOffsetY = -nOffsetY + BoxHeight;\\n\"\n\"\\n\"\n\"\tif(DetailedRedrawState.fOffsetY == fOffsetY && DetailedRedrawState.fDetailedOffset == fDetailedOffset && DetailedRedrawState.fDetailedRange == fDetailedRange && !KeyCtrlDown && !KeyShiftDown && !MouseDragButton)\\n\"\n\"\t{\\n\"\n\"\t\tInvalidate++;\\n\"\n\"\t}\\n\"\n\"\telse\\n\"\n\"\t{\\n\"\n\"\t\tInvalidate = 0;\\n\"\n\"\t\tDetailedRedrawState.fOffsetY = fOffsetY;\\n\"\n\"\t\tDetailedRedrawState.fDetailedOffset = fDetailedOffset;\\n\"\n\"\t\tDetailedRedrawState.fDetailedRange = fDetailedRange;\\n\"\n\"\t}\\n\"\n\"\tif(nHoverTokenDrawn != nHoverToken)\\n\"\n\"\t{\\n\"\n\"\t\tInvalidate = 1;\\n\"\n\"\t}\\n\"\n\"\tnHoverTokenDrawn = nHoverToken;\\n\"\n\"\tif(Invalidate == 0) //when panning, only draw bars that are a certain width to keep decent framerate\\n\"\n\"\t{\\n\"\n\"\t\tcontext.clearRect(0, 0, CanvasDetailedView.width, CanvasDetailedView.height);\\n\"\n\"\t\tDrawDetailedView(context, nMinWidthPan, true);\\n\"\n\"\t\tProfileRedraw0++;\\n\"\n\"\t}\\n\"\n\"\telse if(Invalidate == 1) //draw full and store\\n\"\n\"\t{\\n\"\n\"\t\toffscreen.clearRect(0, 0, CanvasDetailedView.width, CanvasDetailedView.height);\\n\"\n\"\t\tDrawDetailedView(offscreen, nMinWidth, true);\\n\"\n\"\t\tOffscreenData = offscreen.getImageData(0, 0, CanvasDetailedOffscreen.width, CanvasDetailedOffscreen.height);\\n\"\n\"\t\tProfileRedraw1++;\\n\"\n\"\t}\\n\"\n\"\telse//reuse stored result untill next time viewport is changed.\\n\"\n\"\t{\\n\"\n\"\t\tcontext.clearRect(0, 0, CanvasDetailedView.width, CanvasDetailedView.height);\\n\"\n\"\t\tcontext.putImageData(OffscreenData, 0, 0);\\n\"\n\"\t\tDrawDetailedView(context, nMinWidth, false);\\n\"\n\"\t\tProfileRedraw2++;\\n\"\n\"\t}\\n\"\n\"\\n\"\n\"\tif(KeyShiftDown || KeyCtrlDown || MouseDragButton || MouseDragSelectRange() || ZoomActive)\\n\"\n\"\t{\\n\"\n\"\t\tnHoverToken = -1;\\n\"\n\"\t\tnHoverTokenIndex = -1;\\n\"\n\"\t\tnHoverTokenLogIndex = -1;\\n\"\n\"\t\tRangeCpu = RangeInit();\\n\"\n\"\t\tRangeGpu = RangeInit();\\n\"\n\"\t}\\n\"\n\"\telse\\n\"\n\"\t{\\n\"\n\"\t\tnHoverToken = nHoverTokenNext;\\n\"\n\"\t\tnHoverTokenIndex = nHoverTokenIndexNext;\\n\"\n\"\t\tnHoverTokenLogIndex = nHoverTokenLogIndexNext;\\n\"\n\"\t\tif(RangeValid(RangeCpuHistory))\\n\"\n\"\t\t{\\n\"\n\"\t\t\tRangeCopy(RangeCpu, RangeCpuHistory);\\n\"\n\"\t\t\tRangeCopy(RangeGpu, RangeGpuHistory);\\n\"\n\"\t\t}\\n\"\n\"\t\telse\\n\"\n\"\t\t{\\n\"\n\"\t\t\tRangeCopy(RangeCpu, RangeCpuNext);\\n\"\n\"\t\t\tRangeCopy(RangeGpu, RangeGpuNext);\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"\\n\"\n\"\tDrawTextBox(context, TimeToMsString(fDetailedOffset), 0, FontHeight, \\'left\\');\\n\"\n\"\tcontext.textAlign = \\'right\\';\\n\"\n\"\tDrawTextBox(context, TimeToMsString(fDetailedOffset + fDetailedRange), nWidth, FontHeight, \\'right\\');\\n\"\n\"\tcontext.textAlign = \\'left\\';\\n\"\n\"\\n\"\n\"\tvar YBegin = ThreadY[fRangeThreadIdNext];\\n\"\n\"\tvar YEnd = ThreadY[fRangeThreadIdNext+1];\\n\"\n\"\tvar YBeginGpu = YBegin;\\n\"\n\"\tvar YEndGpu = YEnd;\\n\"\n\"\tfunction RangeSet(R)\\n\"\n\"\t{\\n\"\n\"\t\tif(R.Thread >= 0)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tR.YBegin = ThreadY[R.Thread];\\n\"\n\"\t\t\tR.YEnd = ThreadY[R.Thread + 1];\\n\"\n\"\t\t}\\n\"\n\"\t\telse\\n\"\n\"\t\t{\\n\"\n\"\t\t\tR.YBegin = 0;\\n\"\n\"\t\t\tR.YEnd = nHeight;\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"\tRangeSet(RangeSelect);\\n\"\n\"\tRangeSet(RangeCpu);\\n\"\n\"\tRangeSet(RangeGpu);\\n\"\n\"\tvar Offset = 0;\\n\"\n\"\tOffset = DrawRange(context, RangeSelect, \\'#59d0ff\\', \\'#00ddff\\', \\\"Selection\\\");\\n\"\n\"\tOffset = DrawRange(context, RangeCpu, \\'#009900\\', \\'#00ff00\\', \\\"Cpu\\\");\\n\"\n\"\tOffset = DrawRange(context, RangeGpu, \\'#996600\\', \\'#775500\\', \\\"Gpu\\\");\\n\"\n\"\\n\"\n\"\tnHoverCSCpu = nHoverCSCpuNext;\\n\"\n\"\tProfileLeave();\\n\"\n\"}\\n\"\n\"function ZoomToHighlight(NoGpu)\\n\"\n\"{\\n\"\n\"\tif(RangeValid(RangeGpu) && !NoGpu)\\n\"\n\"\t{\\n\"\n\"\t\tZoomTo(RangeGpu.Begin, RangeGpu.End);\\n\"\n\"\t}\\n\"\n\"\telse if(RangeValid(RangeCpu))\\n\"\n\"\t{\\n\"\n\"\t\tZoomTo(RangeCpu.Begin, RangeCpu.End);\\n\"\n\"\t}\\n\"\n\"\tRangeCpu = RangeInit();\\n\"\n\"\tRangeGpu = RangeInit();\\n\"\n\"}\\n\"\n\"\\n\"\n\"function MoveToNext(Direction) //1 forward, -1 backwards\\n\"\n\"{\\n\"\n\"\tvar fTimeBegin, fTimeEnd, nLog;\\n\"\n\"\tvar Index = nHoverToken;\\n\"\n\"\\n\"\n\"\tif(nHoverToken != -1 && nHoverTokenLogIndex != -1)\\n\"\n\"\t{\\n\"\n\"\t\tfTimeBegin = RangeCpu.Begin;\\n\"\n\"\t\tfTimeEnd = RangeCpu.End;\\n\"\n\"\t\tnLog = nHoverTokenLogIndex;\\n\"\n\"\t}\\n\"\n\"\telse if(RangeValid(RangeSelect))\\n\"\n\"\t{\\n\"\n\"\t\tfTimeBegin = RangeSelect.Begin;\\n\"\n\"\t\tfTimeEnd = RangeSelect.End;\\n\"\n\"\t\tnLog = RangeSelect.Thread;\\n\"\n\"\t\tIndex = RangeSelect.Index;\\n\"\n\"\t}\\n\"\n\"\telse\\n\"\n\"\t{\\n\"\n\"\t\treturn;\\n\"\n\"\t}\\n\"\n\"\tif(nLog<0)\\n\"\n\"\t{\\n\"\n\"\t\treturn;\\n\"\n\"\t}\\n\"\n\"\tvar Forward = Direction && Direction < 0 ? 0 : 1;\\n\"\n\"\tvar bFound = false;\\n\"\n\"\tvar nStackPos = 0;\\n\"\n\"\tvar fResultTimeBegin, fResultTimeEnd;\\n\"\n\"\tvar TypeBegin = Forward ? 1 : 0;\\n\"\n\"\tvar TypeEnd = Forward ? 0 : 1;\\n\"\n\"\tvar SearchTimeBegin = Forward ? fTimeBegin : fTimeEnd;\\n\"\n\"\\n\"\n\"\tvar istart = Forward ? 0 : Frames.length-1;\\n\"\n\"\tvar iend = Forward ? Frames.length : -1;\\n\"\n\"\tvar idelta = Forward ? 1 : -1;\\n\"\n\"\tfor(var i = istart; i != iend; i += idelta)\\n\"\n\"\t{\\n\"\n\"\t\tvar fr = Frames[i];\\n\"\n\"\t\tvar ts = fr.ts[nLog];\\n\"\n\"\t\tvar ti = fr.ti[nLog];\\n\"\n\"\t\tvar tt = fr.tt[nLog];\\n\"\n\"\t\tvar jstart = Forward ? 0 : ts.length-1;\\n\"\n\"\t\tvar jend = Forward ? ts.length : -1;\\n\"\n\"\t\tvar jdelta = Forward ? 1 : -1;\\n\"\n\"\t\tfor(var j = jstart; j != jend; j += jdelta)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tif(!bFound)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tif(tt[j] == TypeBegin && Index == ti[j])\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\tif(SearchTimeBegin == ts[j])\\n\"\n\"\t\t\t\t\t{\\n\"\n\"\t\t\t\t\t\tbFound = true;\\n\"\n\"\t\t\t\t\t}\\n\"\n\"\t\t\t\t}\\n\"\n\"\t\t\t}\\n\"\n\"\t\t\telse\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tif(Index == ti[j])\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\tvar type = tt[j];\\n\"\n\"\t\t\t\t\tif(type == TypeBegin)\\n\"\n\"\t\t\t\t\t{\\n\"\n\"\t\t\t\t\t\tif(0 == nStackPos)\\n\"\n\"\t\t\t\t\t\t{\\n\"\n\"\t\t\t\t\t\t\tfResultTimeBegin = ts[j];\\n\"\n\"\t\t\t\t\t\t}\\n\"\n\"\t\t\t\t\t\tnStackPos++;\\n\"\n\"\t\t\t\t\t}\\n\"\n\"\t\t\t\t\telse if(type == TypeEnd && nStackPos)\\n\"\n\"\t\t\t\t\t{\\n\"\n\"\t\t\t\t\t\tnStackPos--;\\n\"\n\"\t\t\t\t\t\tif(0 == nStackPos)\\n\"\n\"\t\t\t\t\t\t{\\n\"\n\"\t\t\t\t\t\t\tfResultTimeEnd = ts[j];\\n\"\n\"\t\t\t\t\t\t\tif(0 == Forward)\\n\"\n\"\t\t\t\t\t\t\t{\\n\"\n\"\t\t\t\t\t\t\t\tvar Tmp = fResultTimeBegin;\\n\"\n\"\t\t\t\t\t\t\t\tfResultTimeBegin = fResultTimeEnd;\\n\"\n\"\t\t\t\t\t\t\t\tfResultTimeEnd = Tmp;\\n\"\n\"\t\t\t\t\t\t\t}\\n\"\n\"\t\t\t\t\t\t\tRangeSelect.Begin = fResultTimeBegin;\\n\"\n\"\t\t\t\t\t\t\tRangeSelect.End = fResultTimeEnd;\\n\"\n\"\t\t\t\t\t\t\tRangeSelect.Thread = nLog;\\n\"\n\"\t\t\t\t\t\t\tRangeSelect.Index = Index;\\n\"\n\"\t\t\t\t\t\t\tMoveTo(fResultTimeBegin,fResultTimeEnd);\\n\"\n\"\t\t\t\t\t\t\treturn;\\n\"\n\"\t\t\t\t\t\t}\\n\"\n\"\t\t\t\t\t}\\n\"\n\"\t\t\t\t}\\n\"\n\"\t\t\t}\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"}\\n\"\n\"\\n\"\n\"function MoveTo(fMoveBegin, fMoveEnd, YTop, YBottom)\\n\"\n\"{\\n\"\n\"\tvar nOffsetYBottom = YBottom - nHeight;\\n\"\n\"\tvar nOffsetYDest = nOffsetY;\\n\"\n\"\tif(nOffsetYDest < nOffsetYBottom)\\n\"\n\"\t{\\n\"\n\"\t\tnOffsetYDest = nOffsetYBottom;\\n\"\n\"\t}\\n\"\n\"\tif(nOffsetYDest > YTop)\\n\"\n\"\t{\\n\"\n\"\t\tnOffsetYDest = YTop;\\n\"\n\"\t}\\n\"\n\"\tvar fRange = fDetailedRange;\\n\"\n\"\tvar fMinRange = (fMoveEnd-fMoveBegin) * 2.0;\\n\"\n\"\tif(fRange < fMinRange)\\n\"\n\"\t{\\n\"\n\"\t\tfRange = fMinRange;\\n\"\n\"\t}\\n\"\n\"\tvar fMoveCenter = (fMoveBegin + fMoveEnd) * 0.5;\\n\"\n\"\tfMoveBegin = fMoveCenter - 0.5 * fRange;\\n\"\n\"\tfMoveEnd = fMoveCenter + 0.5 * fRange;\\n\"\n\"\tvar nOffset;\\n\"\n\"\tif(nOffsetYDest != nOffsetY)\\n\"\n\"\t\tnOffset = nOffsetYDest;\\n\"\n\"\tZoomTo(fMoveBegin, fMoveEnd, nOffsetYDest, -1);\\n\"\n\"}\\n\"\n\"function ZoomTo(fZoomBegin, fZoomEnd, OffsetYDest, ZoomTime)\\n\"\n\"{\\n\"\n\"\tif(fZoomBegin < fZoomEnd)\\n\"\n\"\t{\\n\"\n\"\t\tAnimationActive = true;\\n\"\n\"\t\tvar fDetailedOffsetOriginal = fDetailedOffset;\\n\"\n\"\t\tvar fDetailedRangeOriginal = fDetailedRange;\\n\"\n\"\t\tvar fDetailedOffsetTarget = fZoomBegin;\\n\"\n\"\t\tvar fDetailedRangeTarget = fZoomEnd - fZoomBegin;\\n\"\n\"\t\tvar OffsetYOriginal = nOffsetY;\\n\"\n\"\t\tvar OffsetYTarget = OffsetYDest;\\n\"\n\"\t\tvar TimestampStart = new Date();\\n\"\n\"\t\tvar count = 0;\\n\"\n\"\t\tif(!ZoomTime)\\n\"\n\"\t\t{\t\t\t\\n\"\n\"\t\t\tZoomTime = ZOOM_TIME;\\n\"\n\"\t\t}\\n\"\n\"\\n\"\n\"\t\tfunction ZoomFunc(Timestamp)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tZoomActive = 1;\\n\"\n\"\t\t\tvar fPrc = (new Date() - TimestampStart) / (ZoomTime * 1000.0);\\n\"\n\"\t\t\tif(fPrc > 1.0 || ZoomTime < 0.01)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tfPrc = 1.0;\\n\"\n\"\t\t\t}\\n\"\n\"\t\t\tfPrc = Math.pow(fPrc, 0.3);\\n\"\n\"\t\t\tfDetailedOffset = fDetailedOffsetOriginal + (fDetailedOffsetTarget - fDetailedOffsetOriginal) * fPrc;\\n\"\n\"\t\t\tfDetailedRange = fDetailedRangeOriginal + (fDetailedRangeTarget - fDetailedRangeOriginal) * fPrc;\\n\"\n\"\t\t\tif(OffsetYDest)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tnOffsetY = OffsetYOriginal + (OffsetYTarget - OffsetYOriginal) * fPrc;\\n\"\n\"\t\t\t}\\n\"\n\"\t\t\tDrawDetailed(true);\\n\"\n\"\t\t\tif(fPrc >= 1.0)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tAnimationActive = false;\\n\"\n\"\t\t\t\tfDetailedOffset = fDetailedOffsetTarget;\\n\"\n\"\t\t\t\tfDetailedRange = fDetailedRangeTarget;\\n\"\n\"\t\t\t\tif(OffsetYDest)\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\tnOffsetY = OffsetYTarget;\\n\"\n\"\t\t\t\t}\\n\"\n\"\t\t\t}\\n\"\n\"\t\t\telse\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\trequestAnimationFrame(ZoomFunc);\\n\"\n\"\t\t\t}\\n\"\n\"\t\t}\\n\"\n\"\t\trequestAnimationFrame(ZoomFunc);\\n\"\n\"\t}\\n\"\n\"}\\n\"\n\"function RequestRedraw()\\n\"\n\"{\\n\"\n\"\tInvalidate = 0;\\n\"\n\"\tDraw(1);\\n\"\n\"}\\n\"\n\"function Draw(RedrawMode)\\n\"\n\"{\\n\"\n\"\tif(ProfileMode)\\n\"\n\"\t{\\n\"\n\"\t\tProfileModeClear();\\n\"\n\"\t\tProfileEnter(\\\"Total\\\");\\n\"\n\"\t}\\n\"\n\"\tif(RedrawMode == 1)\\n\"\n\"\t{\\n\"\n\"\t\tif(Mode == ModeTimers)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tDrawBarView();\\n\"\n\"\t\t\tDrawHoverToolTip();\\n\"\n\"\t\t}\\n\"\n\"\t\telse if(Mode == ModeDetailed)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tDrawDetailed(false);\\n\"\n\"\t\t\tDrawHoverToolTip();\\n\"\n\"\t\t}\\n\"\n\"\t\telse if(Mode == ModeCounters)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tDrawCounterView();\\n\"\n\"\t\t\tDrawHoverToolTip();\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"\tDrawDetailedFrameHistory();\\n\"\n\"\\n\"\n\"\tif(ProfileMode)\\n\"\n\"\t{\\n\"\n\"\t\tProfileLeave();\\n\"\n\"\t\tProfileModeDraw(CanvasDetailedView);\\n\"\n\"\t}\\n\"\n\"}\\n\"\n\"\\n\"\n\"function AutoRedraw(Timestamp)\\n\"\n\"{\\n\"\n\"\tvar RedrawMode = 0;\\n\"\n\"\tif(Mode == ModeDetailed)\\n\"\n\"\t{\\n\"\n\"\t\tif(ProfileMode == 2 || ((nHoverCSCpu >= 0 || nHoverToken != -1) && !KeyCtrlDown && !KeyShiftDown && !MouseDragButton)||(Invalidate<2 && !KeyCtrlDown && !KeyShiftDown && !MouseDragButton))\\n\"\n\"\t\t{\\n\"\n\"\t\t\tRedrawMode = 1;\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"\telse\\n\"\n\"\t{\\n\"\n\"\t\tif(Invalidate < 1)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tRedrawMode = 1;\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"\tif(RedrawMode)\\n\"\n\"\t{\\n\"\n\"\t\tDraw(RedrawMode);\\n\"\n\"\t}\\n\"\n\"\telse if(FlashFrameCounter>0)\\n\"\n\"\t{\\n\"\n\"\t\tDraw(0);\\n\"\n\"\t}\\n\"\n\"\trequestAnimationFrame(AutoRedraw);\\n\"\n\"}\\n\"\n\"\\n\"\n\"\\n\"\n\"function ZoomGraph(nZoom)\\n\"\n\"{\\n\"\n\"\tvar fOldRange = fDetailedRange;\\n\"\n\"\tif(nZoom>0)\\n\"\n\"\t{\\n\"\n\"\t\tfDetailedRange *= Math.pow(nModDown ? 1.40 : 1.03, nZoom);\\n\"\n\"\t}\\n\"\n\"\telse\\n\"\n\"\t{\\n\"\n\"\t\tvar fNewDetailedRange = fDetailedRange / Math.pow((nModDown ? 1.40 : 1.03), -nZoom);\\n\"\n\"\t\tif(fNewDetailedRange < 0.0001) //100ns\\n\"\n\"\t\t\tfNewDetailedRange = 0.0001;\\n\"\n\"\t\tfDetailedRange = fNewDetailedRange;\\n\"\n\"\t}\\n\"\n\"\\n\"\n\"\tvar fDiff = fOldRange - fDetailedRange;\\n\"\n\"\tvar fMousePrc = DetailedViewMouseX / nWidth;\\n\"\n\"\tif(fMousePrc < 0)\\n\"\n\"\t{\\n\"\n\"\t\tfMousePrc = 0;\\n\"\n\"\t}\\n\"\n\"\tfDetailedOffset += fDiff * fMousePrc;\\n\"\n\"\\n\"\n\"}\\n\"\n\"\\n\"\n\"function MeasureFont()\\n\"\n\"{\\n\"\n\"\tvar context = CanvasDetailedView.getContext(\\'2d\\');\\n\"\n\"\tcontext.font = Font;\\n\"\n\"\tFontWidth = context.measureText(\\'W\\').width;\\n\"\n\"\\n\"\n\"}\\n\"\n\"function ResizeCanvas() \\n\"\n\"{\\n\"\n\"\tnWidth = window.innerWidth;\\n\"\n\"\tnHeight = window.innerHeight - CanvasHistory.height-2;\\n\"\n\"\tDPR = window.devicePixelRatio;\\n\"\n\"\\n\"\n\"\tif(DPR)\\n\"\n\"\t{\\n\"\n\"\t\tCanvasDetailedView.style.width = nWidth + \\'px\\'; \\n\"\n\"\t\tCanvasDetailedView.style.height = nHeight + \\'px\\';\\n\"\n\"\t\tCanvasDetailedView.width = nWidth * DPR;\\n\"\n\"\t\tCanvasDetailedView.height = nHeight * DPR;\\n\"\n\"\t\tCanvasHistory.style.width = window.innerWidth + \\'px\\';\\n\"\n\"\t\tCanvasHistory.style.height = 70 + \\'px\\';\\n\"\n\"\t\tCanvasHistory.width = window.innerWidth * DPR;\\n\"\n\"\t\tCanvasHistory.height = 70 * DPR;\\n\"\n\"\t\tCanvasHistory.getContext(\\'2d\\').scale(DPR,DPR);\\n\"\n\"\t\tCanvasDetailedView.getContext(\\'2d\\').scale(DPR,DPR);\\n\"\n\"\\n\"\n\"\t\tCanvasDetailedOffscreen.style.width = nWidth + \\'px\\';\\n\"\n\"\t\tCanvasDetailedOffscreen.style.height = nHeight + \\'px\\';\\n\"\n\"\t\tCanvasDetailedOffscreen.width = nWidth * DPR;\\n\"\n\"\t\tCanvasDetailedOffscreen.height = nHeight * DPR;\\n\"\n\"\t\tCanvasDetailedOffscreen.getContext(\\'2d\\').scale(DPR,DPR);\\n\"\n\"\\n\"\n\"\t}\\n\"\n\"\telse\\n\"\n\"\t{\\n\"\n\"\t\tDPR = 1;\\n\"\n\"\t\tCanvasDetailedView.width = nWidth;\\n\"\n\"\t\tCanvasDetailedView.height = nHeight;\\n\"\n\"\t\tCanvasDetailedOffscreen.width = nWidth;\\n\"\n\"\t\tCanvasDetailedOffscreen.height = nHeight;\\n\"\n\"\t\tCanvasHistory.width = window.innerWidth;\\n\"\n\"\t}\\n\"\n\"\tRequestRedraw();\\n\"\n\"}\\n\"\n\"\\n\"\n\"var MouseDragOff = 0;\\n\"\n\"var MouseDragDown = 1;\\n\"\n\"var MouseDragUp = 2;\\n\"\n\"var MouseDragMove = 3;\\n\"\n\"var MouseDragState = MouseDragOff;\\n\"\n\"var MouseDragTarget = 0;\\n\"\n\"var MouseDragButton = 0;\\n\"\n\"var MouseDragKeyShift = 0;\\n\"\n\"var MouseDragKeyCtrl = 0;\\n\"\n\"var MouseDragX = 0;\\n\"\n\"var MouseDragY = 0;\\n\"\n\"var MouseDragXLast = 0;\\n\"\n\"var MouseDragYLast = 0;\\n\"\n\"var MouseDragXStart = 0;\\n\"\n\"var MouseDragYStart = 0;\\n\"\n\"\\n\"\n\"function clamp(number, min, max)\\n\"\n\"{\\n\"\n\"  return Math.max(min, Math.min(number, max));\\n\"\n\"}\\n\"\n\"\\n\"\n\"function MouseDragPan()\\n\"\n\"{\\n\"\n\"\treturn MouseDragButton == 1 || MouseDragKeyShift;\\n\"\n\"}\\n\"\n\"function MouseDragSelectRange()\\n\"\n\"{\\n\"\n\"\treturn MouseDragState == MouseDragMove && (MouseDragButton == 3 || (MouseDragKeyShift && MouseDragKeyCtrl));\\n\"\n\"}\\n\"\n\"function MouseHandleDrag()\\n\"\n\"{\\n\"\n\"\tif(MouseDragTarget == CanvasDetailedView)\\n\"\n\"\t{\\n\"\n\"\t\tif(Mode == ModeDetailed)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tif(MouseDragSelectRange())\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tvar xStart = MouseDragXStart;\\n\"\n\"\t\t\t\tvar xEnd = MouseDragX;\\n\"\n\"\t\t\t\tif(xStart > xEnd)\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\tvar Temp = xStart;\\n\"\n\"\t\t\t\t\txStart = xEnd;\\n\"\n\"\t\t\t\t\txEnd = Temp;\\n\"\n\"\t\t\t\t}\\n\"\n\"\t\t\t\tif(xEnd - xStart > 1)\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\tRangeCpu.Begin = fDetailedOffset + fDetailedRange * (xStart / nWidth);\\n\"\n\"\t\t\t\t\tRangeCpu.End = fDetailedOffset + fDetailedRange * (xEnd / nWidth);\\n\"\n\"\t\t\t\t\tRangeSelect.Begin = fDetailedOffset + fDetailedRange * (xStart / nWidth);\\n\"\n\"\t\t\t\t\tRangeSelect.End = fDetailedOffset + fDetailedRange * (xEnd / nWidth);\\n\"\n\"\t\t\t\t\tRangeSelect.Thread = -1;\\n\"\n\"\t\t\t\t\tRangeSelect.Index = -1;\\n\"\n\"\t\t\t\t}\\n\"\n\"\t\t\t}\\n\"\n\"\t\t\telse if(MouseDragPan())\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tvar X = MouseDragX - MouseDragXLast;\\n\"\n\"\t\t\t\tvar Y = MouseDragY - MouseDragYLast;\\n\"\n\"\t\t\t\tif(X)\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\tfDetailedOffset += -X * fDetailedRange / nWidth;\\n\"\n\"\t\t\t\t}\\n\"\n\"\t\t\t\tnOffsetY -= Y;\\n\"\n\"\t\t\t\tif(nOffsetY < 0)\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\tnOffsetY = 0;\\n\"\n\"\t\t\t\t}\\n\"\n\"\t\t\t}\\n\"\n\"\t\t\telse if(MouseDragKeyCtrl)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tif(MouseDragY != MouseDragYLast)\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\tZoomGraph(MouseDragY - MouseDragYLast);\\n\"\n\"\t\t\t\t}\\n\"\n\"\t\t\t}\\n\"\n\"\t\t}\\n\"\n\"\t\telse if(Mode == ModeTimers)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tif(MouseDragKeyShift || MouseDragButton == 1)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tvar X = MouseDragX - MouseDragXLast;\\n\"\n\"\t\t\t\tvar Y = MouseDragY - MouseDragYLast;\\n\"\n\"\t\t\t\tnOffsetBarsY -= Y;\\n\"\n\"\t\t\t\tnOffsetBarsX -= X;\\n\"\n\"\t\t\t\tif(nOffsetBarsY < 0)\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\tnOffsetBarsY = 0;\\n\"\n\"\t\t\t\t}\\n\"\n\"\t\t\t\tif(nOffsetBarsX < 0)\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\tnOffsetBarsX = 0;\\n\"\n\"\t\t\t\t}\\n\"\n\"\t\t\t}\\n\"\n\"\t\t}\\n\"\n\"\t\telse if(Mode == ModeCounters)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tif(MouseDragKeyShift || MouseDragButton == 1)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tvar Y = MouseDragY - MouseDragYLast;\\n\"\n\"\t\t\t\tnOffsetCountersY -= Y;\\n\"\n\"\t\t\t\tif(nOffsetCountersY < 0)\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\tnOffsetCountersY = 0;\\n\"\n\"\t\t\t\t}\\n\"\n\"\t\t\t}\\n\"\n\"\t\t}\\n\"\n\"\\n\"\n\"\t}\\n\"\n\"\telse if(MouseDragTarget == CanvasHistory)\\n\"\n\"\t{\\n\"\n\"\t\tfunction HistoryFrameTime(x)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tvar NumFrames = Frames.length;\\n\"\n\"\t\t\tvar fBarWidth = nWidth / NumFrames;\\n\"\n\"\t\t\tvar Index = clamp(Math.floor(NumFrames * x / nWidth), 0, NumFrames-1);\\n\"\n\"\t\t\tvar Lerp = clamp((x/fBarWidth - Index) , 0, 1);\\n\"\n\"\t\t\tvar time = Frames[Index].framestart + (Frames[Index].frameend - Frames[Index].framestart) * Lerp;\\n\"\n\"\t\t\treturn time;\\n\"\n\"\t\t}\\n\"\n\"\t\tif(MouseDragSelectRange())\\n\"\n\"\t\t{\\n\"\n\"\t\t\tRangeCpu = RangeInit();\\n\"\n\"\t\t\tRangeGpu = RangeInit();\\n\"\n\"\\n\"\n\"\t\t\tvar xStart = MouseDragXStart;\\n\"\n\"\t\t\tvar xEnd = MouseDragX;\\n\"\n\"\t\t\tif(xStart > xEnd)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tvar Temp = xStart;\\n\"\n\"\t\t\t\txStart = xEnd;\\n\"\n\"\t\t\t\txEnd = Temp;\\n\"\n\"\t\t\t}\\n\"\n\"\t\t\tif(xEnd - xStart > 2)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tvar timestart = HistoryFrameTime(xStart);\\n\"\n\"\t\t\t\tvar timeend = HistoryFrameTime(xEnd);\\n\"\n\"\t\t\t\tfDetailedOffset = timestart;\\n\"\n\"\t\t\t\tfDetailedRange = timeend-timestart;\\n\"\n\"\t\t\t}\\n\"\n\"\t\t}\\n\"\n\"\t\telse if(MouseDragPan())\\n\"\n\"\t\t{\\n\"\n\"\t\t\tvar Time = HistoryFrameTime(MouseDragX);\\n\"\n\"\t\t\tfDetailedOffset = Time - fDetailedRange / 2.0;\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"}\\n\"\n\"function MouseHandleDragEnd()\\n\"\n\"{\\n\"\n\"\tif(MouseDragTarget == CanvasDetailedView)\\n\"\n\"\t{\\n\"\n\"\\n\"\n\"\t}\\n\"\n\"\telse if(MouseDragTarget == CanvasHistory)\\n\"\n\"\t{\\n\"\n\"\t\tif(!MouseDragSelectRange() && !MouseDragPan())\\n\"\n\"\t\t{\\n\"\n\"\t\t\tZoomToHighlight(1);\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"}\\n\"\n\"\\n\"\n\"function MouseHandleDragClick()\\n\"\n\"{\\n\"\n\"\tif(MouseDragTarget == CanvasDetailedView)\\n\"\n\"\t{\\n\"\n\"\t\tif(Mode == ModeCounters)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tif(nHoverCounter != -1)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tif(CounterInfo[nHoverCounter].firstchild != -1)\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\tCounterInfo[nHoverCounter].closed = !CounterInfo[nHoverCounter].closed;\\n\"\n\"\t\t\t\t}\\n\"\n\"\t\t\t\telse\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\tCounterInfo[nHoverCounter].Expanded = !CounterInfo[nHoverCounter].Expanded;\\n\"\n\"\t\t\t\t}\\n\"\n\"\t\t\t\tDraw(1);\\n\"\n\"\t\t\t}\\n\"\n\"\t\t}\\n\"\n\"\t\telse\\n\"\n\"\t\t{\\n\"\n\"\t\t\tZoomToHighlight();\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"\telse if(MouseDragTarget == CanvasHistory)\\n\"\n\"\t{\\n\"\n\"\t\tif(Mode == ModeDetailed)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tZoomToHighlight(1);\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"}\\n\"\n\"\\n\"\n\"function MapMouseButton(event)\\n\"\n\"{\\n\"\n\"\tif(event.button == 1 || event.which == 1)\\n\"\n\"\t{\\n\"\n\"\t\treturn 1;\\n\"\n\"\t}\\n\"\n\"\telse if(event.button == 3 || event.which == 3)\\n\"\n\"\t{\\n\"\n\"\t\treturn 3;\\n\"\n\"\t}\\n\"\n\"\telse\\n\"\n\"\t{\\n\"\n\"\t\treturn 0;\\n\"\n\"\t}\\n\"\n\"}\\n\"\n\"\\n\"\n\"function MouseDragReset()\\n\"\n\"{\\n\"\n\"\tMouseDragState = MouseDragOff;\\n\"\n\"\tMouseDragTarget = 0;\\n\"\n\"\tMouseDragKeyShift = 0;\\n\"\n\"\tMouseDragKeyCtrl = 0;\\n\"\n\"\tMouseDragButton = 0;\\n\"\n\"}\\n\"\n\"function MouseDragKeyUp()\\n\"\n\"{\\n\"\n\"\tif((MouseDragKeyShift && !KeyShiftDown) || (MouseDragKeyCtrl && !KeyCtrlDown))\\n\"\n\"\t{\\n\"\n\"\t\tMouseHandleDragEnd();\\n\"\n\"\t\tMouseDragReset();\\n\"\n\"\t}\\n\"\n\"}\\n\"\n\"function MouseDrag(Source, Event)\\n\"\n\"{\\n\"\n\"\tif(Source == MouseDragOff || (MouseDragTarget && MouseDragTarget != Event.target))\\n\"\n\"\t{\\n\"\n\"\t\tMouseDragReset();\\n\"\n\"\t\treturn;\\n\"\n\"\t}\\n\"\n\"\\n\"\n\"\tvar LocalRect = Event.target.getBoundingClientRect();\\n\"\n\"\tMouseDragX = Event.clientX - LocalRect.left;\\n\"\n\"\tMouseDragY = Event.clientY - LocalRect.top;\\n\"\n\"\tif(MouseDragState == MouseDragMove)\\n\"\n\"\t{\\n\"\n\"\t\tvar dx = Math.abs(MouseDragX - MouseDragXStart);\\n\"\n\"\t\tvar dy = Math.abs(MouseDragY - MouseDragYStart);\\n\"\n\"\t\tif((Source == MouseDragUp && MapMouseButton(Event) == MouseDragButton) ||\\n\"\n\"\t\t\t(MouseDragKeyCtrl && !KeyCtrlDown) ||\\n\"\n\"\t\t\t(MouseDragKeyShift && !KeyShiftDown))\\n\"\n\"\t\t{\\n\"\n\"\t\t\tMouseHandleDragEnd();\\n\"\n\"\t\t\tMouseDragReset();\\n\"\n\"\t\t\treturn;\\n\"\n\"\t\t}\\n\"\n\"\t\telse\\n\"\n\"\t\t{\\n\"\n\"\t\t\tMouseHandleDrag();\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"\telse if(MouseDragState == MouseDragOff)\\n\"\n\"\t{\\n\"\n\"\t\tif(Source == MouseDragDown || KeyShiftDown || KeyCtrlDown)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tMouseDragTarget = Event.target;\\n\"\n\"\t\t\tMouseDragButton = MapMouseButton(Event);\\n\"\n\"\t\t\tMouseDragState = MouseDragDown;\\n\"\n\"\t\t\tMouseDragXStart = MouseDragX;\\n\"\n\"\t\t\tMouseDragYStart = MouseDragY;\\n\"\n\"\t\t\tMouseDragKeyCtrl = 0;\\n\"\n\"\t\t\tMouseDragKeyShift = 0;\\n\"\n\"\\n\"\n\"\t\t\tif(KeyShiftDown || KeyCtrlDown)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tMouseDragKeyShift = KeyShiftDown;\\n\"\n\"\t\t\t\tMouseDragKeyCtrl = KeyCtrlDown;\\n\"\n\"\t\t\t\tMouseDragState = MouseDragMove;\\n\"\n\"\t\t\t}\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"\telse if(MouseDragState == MouseDragDown)\\n\"\n\"\t{\\n\"\n\"\t\tif(Source == MouseDragUp)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tMouseHandleDragClick();\\n\"\n\"\t\t\tMouseDragReset();\\n\"\n\"\t\t}\\n\"\n\"\t\telse if(Source == MouseDragMove)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tvar dx = Math.abs(MouseDragX - MouseDragXStart);\\n\"\n\"\t\t\tvar dy = Math.abs(MouseDragY - MouseDragYStart);\\n\"\n\"\t\t\tif(dx+dy>1)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tMouseDragState = MouseDragMove;\\n\"\n\"\t\t\t}\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"\tMouseDragXLast = MouseDragX;\\n\"\n\"\tMouseDragYLast = MouseDragY;\\n\"\n\"}\\n\"\n\"\\n\"\n\"function MouseMove(evt)\\n\"\n\"{\\n\"\n\"    evt.preventDefault();\\n\"\n\"    ZoomActive = 0;\\n\"\n\"    MouseDrag(MouseDragMove, evt);\\n\"\n\" \tMouseHistory = 0;\\n\"\n\"\tMouseDetailed = 0;\\n\"\n\"\tHistoryViewMouseX = HistoryViewMouseY = -1;\\n\"\n\"\tvar rect = evt.target.getBoundingClientRect();\\n\"\n\"\tvar x = evt.clientX - rect.left;\\n\"\n\"\tvar y = evt.clientY - rect.top;\\n\"\n\"\tif(evt.target == CanvasDetailedView)\\n\"\n\"\t{\\n\"\n\"\t\tif(!MouseDragSelectRange())\\n\"\n\"\t\t{\\n\"\n\"\t\t\tRangeCpu = RangeInit();\\n\"\n\"\t\t}\\n\"\n\"\t\tDetailedViewMouseX = x;\\n\"\n\"\t\tDetailedViewMouseY = y;\\n\"\n\"\t}\\n\"\n\"\telse if(evt.target = CanvasHistory)\\n\"\n\"\t{\\n\"\n\"\t\tvar Rect = CanvasHistory.getBoundingClientRect();\\n\"\n\"\t\tHistoryViewMouseX = x;\\n\"\n\"\t\tHistoryViewMouseY = y;\\n\"\n\"\t}\\n\"\n\"\tDraw(1);\\n\"\n\"}\\n\"\n\"\\n\"\n\"function MouseButton(bPressed, evt)\\n\"\n\"{\\n\"\n\"    evt.preventDefault();\\n\"\n\"\tMouseDrag(bPressed ? MouseDragDown : MouseDragUp, evt);\\n\"\n\"\tif(!bPressed)\\n\"\n\"\t{\\n\"\n\"\t\tif(SortColumnMouseOverNext)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tif(SortColumnMouseOverNext == SortColumnMouseOver)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tSortColumnOrderFlip =  1 - SortColumnOrderFlip;\\n\"\n\"\t\t\t}\\n\"\n\"\t\t\telse\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tSortColumnOrderFlip = 0;\\n\"\n\"\t\t\t}\\n\"\n\"\\n\"\n\"\t\t\tSortColumnMouseOver = SortColumnMouseOverNext;\\n\"\n\"\t\t\tSortColumnMouseOverNext = null;\\n\"\n\"\t\t\tif(SortColumnMouseOver == StrAverage)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tSortColumn = 1;\\n\"\n\"\t\t\t}\\n\"\n\"\t\t\telse if(SortColumnMouseOver == StrMax)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tSortColumn = 2;\\n\"\n\"\t\t\t}\\n\"\n\"\t\t\telse if(SortColumnMouseOver == StrTotal)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tSortColumn = 3;\\n\"\n\"\t\t\t}\\n\"\n\"\t\t\telse if(SortColumnMouseOver == StrMin)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tSortColumn = 4;\\n\"\n\"\t\t\t}\\n\"\n\"\t\t\telse if(SortColumnMouseOver == StrCallAverage)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tSortColumn = 5;\\n\"\n\"\t\t\t}\\n\"\n\"\t\t\telse if(SortColumnMouseOver == StrCount)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tSortColumn = 6;\\n\"\n\"\t\t\t}\\n\"\n\"\t\t\telse if(SortColumnMouseOver == StrExclAverage)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tSortColumn = 7;\\n\"\n\"\t\t\t}\\n\"\n\"\t\t\telse if(SortColumnMouseOver == StrExclMax)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tSortColumn = 8;\\n\"\n\"\t\t\t}\\n\"\n\"\t\t\telse if(SortColumnMouseOver == StrGroup)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tSortColumn = 0;\\n\"\n\"\t\t\t}\\n\"\n\"\t\t\tRequestRedraw();\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"}\\n\"\n\"\\n\"\n\"function MouseOut(evt)\\n\"\n\"{\\n\"\n\"\tMouseDrag(MouseDragOff, evt);\\n\"\n\"\tKeyCtrlDown = 0;\\n\"\n\"\tKeyShiftDown = 0;\\n\"\n\"\tMouseDragButton = 0;\\n\"\n\"\tnHoverToken = -1;\\n\"\n\"\tRangeCpu = RangeInit();\\n\"\n\"}\\n\"\n\"\\n\"\n\"function MouseWheel(e)\\n\"\n\"{\\n\"\n\"    var e = window.event || e;\\n\"\n\"    var delta = (e.wheelDelta || e.detail * (-120));\\n\"\n\"    ZoomGraph((-4 * delta / 120.0) | 0);\\n\"\n\"    Draw(1);\\n\"\n\"}\\n\"\n\"function ShowFilterInput(bShow)\\n\"\n\"{\\n\"\n\"\tif(bShow)\\n\"\n\"\t{\\n\"\n\"\t\tdocument.getElementById(\\'filterinput\\').style[\\'display\\'] = \\'block\\';\\n\"\n\"\t}\\n\"\n\"\telse\\n\"\n\"\t{\\n\"\n\"\t\tdocument.getElementById(\\'filterinput\\').style[\\'display\\'] = \\'none\\';\\n\"\n\"\t}\\n\"\n\"}\\n\"\n\"\\n\"\n\"function SetFilterInput(group, timer)\\n\"\n\"{\\n\"\n\"\tFilterInputGroupString = group;\\n\"\n\"\tFilterInputTimerString = timer;\\n\"\n\"\tFilterInputGroup.value = group?group:\\'\\';\\n\"\n\"\tFilterInputTimer.value = timer?timer:\\'\\';\\n\"\n\"\tFilterUpdate();\\n\"\n\"\tif(group || timer)\\n\"\n\"\t{\\n\"\n\"\t\tShowFilterInput(1);\\n\"\n\"\t}\\n\"\n\"\telse\\n\"\n\"\t{\\n\"\n\"\t\tShowFilterInput(0);\\n\"\n\"\t}\\n\"\n\"\\n\"\n\"}\\n\"\n\"\\n\"\n\"function ToggleFilterInput(escape)\\n\"\n\"{\\n\"\n\"\tvar ActiveElement = -1;\\n\"\n\"\tfor(var i = 0; i < FilterInputArray.length; ++i)\\n\"\n\"\t{\\n\"\n\"\t\tif(FilterInputArray[i] == document.activeElement)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tActiveElement = i;\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"\tvar OldActiveElement = ActiveElement;\\n\"\n\"\tif(ActiveElement >= 0)\\n\"\n\"\t{\\n\"\n\"\t\tFilterInputArray[ActiveElement].blur();\\n\"\n\"\t}\\n\"\n\"\tActiveElement++;\\n\"\n\"\tif(!escape)\\n\"\n\"\t{\\n\"\n\"\t\tif(ActiveElement < FilterInputArray.length)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tShowFilterInput(1);\\n\"\n\"\t\t\tFilterInputArray[ActiveElement].focus();\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"\telse\\n\"\n\"\t{\\n\"\n\"\t\tif(-1 == OldActiveElement)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tSetFilterInput();\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"}\\n\"\n\"\\n\"\n\"function KeyUp(evt)\\n\"\n\"{\\n\"\n\"\tif(evt.keyCode == 39)\\n\"\n\"\t{\\n\"\n\"\t\tMoveToNext(1);\\n\"\n\"\t}\\n\"\n\"\tif(evt.keyCode == 37)\\n\"\n\"\t{\\n\"\n\"\t\tMoveToNext(-1);\\n\"\n\"\t}\\n\"\n\"\tif(evt.keyCode == 17)\\n\"\n\"\t{\\n\"\n\"\t\tKeyCtrlDown = 0;\\n\"\n\"\t\tMouseDragKeyUp();\\n\"\n\"\t}\\n\"\n\"\telse if(evt.keyCode == 16)\\n\"\n\"\t{\\n\"\n\"\t\tKeyShiftDown = 0;\\n\"\n\"\t\tMouseDragKeyUp();\\n\"\n\"\t}\\n\"\n\"\tif(evt.keyCode == 32)\\n\"\n\"\t{\\n\"\n\"\t\tif(RangeSelect.Begin < RangeSelect.End)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tZoomTo(RangeSelect.Begin, RangeSelect.End);\\n\"\n\"\t\t\tRangeSelect = RangeInit();\\n\"\n\"\t\t\tMouseHandleDragEnd();\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"\tif(evt.keyCode == 9)\\n\"\n\"\t{\\n\"\n\"\t\tevt.preventDefault();\\n\"\n\"\t\tif(Mode == ModeDetailed)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tvar Token = nHoverToken;\\n\"\n\"\t\t\tif(Token == -1 && RangeValid(RangeSelect) && RangeSelect.Index >= 0)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tToken = RangeSelect.Index;\\n\"\n\"\t\t\t}\\n\"\n\"\t\t\tif(Token != -1 && Token < TimerInfo.length)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tvar start = TimerInfo[Token].worststart;\\n\"\n\"\t\t\t\tvar end = TimerInfo[Token].worstend;\\n\"\n\"\t\t\t\tRangeSelect.Begin = start;\\n\"\n\"\t\t\t\tRangeSelect.End = end;\\n\"\n\"\t\t\t\tRangeSelect.Thread = TimerInfo[Token].worstthread;\\n\"\n\"\t\t\t\tRangeSelect.Index = Token;\\n\"\n\"\t\t\t\tShowFlashMessage(\\'Worst: \\' + (end-start).toFixed(2) + \\'ms\\', 100);\\n\"\n\"\t\t\t\tMoveTo(RangeSelect.Begin, RangeSelect.End, ThreadY[RangeSelect.Thread] + nOffsetY, ThreadY[RangeSelect.Thread+1] + nOffsetY);\\n\"\n\"\t\t\t\tMouseHandleDragEnd();\\n\"\n\"\t\t\t}\\n\"\n\"\t\t}\\n\"\n\"\t\telse if(Mode == ModeTimers)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tToggleFilterInput(0);\\n\"\n\"\t\t\tevt.preventDefault();\\n\"\n\"\t\t}\\n\"\n\"\\n\"\n\"\t}\\n\"\n\"\tif(evt.keyCode == 27)\\n\"\n\"\t{\\n\"\n\"\t\tRangeSelect = RangeInit();\\n\"\n\"\t\tSortColumn = 0;\\n\"\n\"\t\tSortColumnMouseOver = \\\"\\\";\\n\"\n\"\t\tif(Mode == ModeTimers)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tToggleFilterInput(1);\\n\"\n\"\t\t\tevt.preventDefault();\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"\\n\"\n\"\tif(evt.keyCode == 18 || evt.keyCode == 90) // z/tab to toggle tooltip\\n\"\n\"\t{\\n\"\n\"\t\tToolTip = (ToolTip+1)%3; //0: off, 1: default, 2: flipped\\n\"\n\"\t\tvar ToolTipStr = \\'Off\\';\\n\"\n\"\t\tvar bShowTimers = Mode == ModeTimers;\\n\"\n\"\t\tif(ToolTip == 2)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tbShowTimers = !bShowTimers;\\n\"\n\"\t\t}\\n\"\n\"\t\tif(ToolTip)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tif(bShowTimers)\\n\"\n\"\t\t\t\tToolTipStr = \\\"Timers\\\";\\n\"\n\"\t\t\telse\\n\"\n\"\t\t\t\tToolTipStr = \\\"Detailed\\\";\\n\"\n\"\t\t}\\n\"\n\"\t\tShowFlashMessage(\\'ToolTip: \\' + ToolTipStr, 100);\\n\"\n\"\t}\\n\"\n\"\\n\"\n\"\\n\"\n\"\tInvalidate = 0;\\n\"\n\"}\\n\"\n\"function CreateFilter(Filter)\\n\"\n\"{\\n\"\n\"\tif(!Filter || Filter.length == 0)\\n\"\n\"\t{\\n\"\n\"\t\treturn null;\\n\"\n\"\t}\\n\"\n\"\tFilter = Filter.split(\\' \\');\\n\"\n\"\tfor(var i = 0; i < Filter.length; ++i)\\n\"\n\"\t{\\n\"\n\"\t\tFilter[i] = new RegExp(Filter[i], \\\"i\\\");\\n\"\n\"\t}\\n\"\n\"\treturn Filter;\\n\"\n\"}\\n\"\n\"function FilterKeyUp()\\n\"\n\"{\\n\"\n\"\tFilterInputTimerString = FilterInputTimer.value;\\n\"\n\"\tFilterInputGroupString = FilterInputGroup.value;\\n\"\n\"\tFilterUpdate();\\n\"\n\"}\\n\"\n\"\\n\"\n\"function FilterUpdate()\\n\"\n\"{\\n\"\n\"\tFilterTimer = CreateFilter(FilterInputTimerString);\\n\"\n\"\tFilterGroup = CreateFilter(FilterInputGroupString);\\n\"\n\"}\\n\"\n\"\\n\"\n\"function KeyDown(evt)\\n\"\n\"{\\n\"\n\"\tif(evt.keyCode == 17)\\n\"\n\"\t{\\n\"\n\"\t\tKeyCtrlDown = 1;\\n\"\n\"\t}\\n\"\n\"\telse if(evt.keyCode == 16)\\n\"\n\"\t{\\n\"\n\"\t\tKeyShiftDown = 1;\\n\"\n\"\t}\\n\"\n\"\telse if(evt.keyCode == 9)\\n\"\n\"\t{\\n\"\n\"\t\tevt.preventDefault();\\n\"\n\"\t}\\n\"\n\"\tInvalidate = 0;\\n\"\n\"}\\n\"\n\"\\n\"\n\"function ReadCookie()\\n\"\n\"{\\n\"\n\"\tvar result = document.cookie.match(/fisk=([^;]+)/);\\n\"\n\"\tvar NewMode = ModeDetailed;\\n\"\n\"\tvar ReferenceTimeString = \\'33ms\\';\\n\"\n\"\tif(result && result.length > 0)\\n\"\n\"\t{\\n\"\n\"\t\tvar Obj = JSON.parse(result[1]);\\n\"\n\"\t\tif(Obj.Mode)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tNewMode = Obj.Mode;\\n\"\n\"\t\t}\\n\"\n\"\t\tif(Obj.ReferenceTime)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tReferenceTimeString = Obj.ReferenceTime;\\n\"\n\"\t\t}\\n\"\n\"\t\tif(Obj.ThreadsAllActive || Obj.ThreadsAllActive == 0 || Obj.ThreadsAllActive == false)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tThreadsAllActive = Obj.ThreadsAllActive;\\n\"\n\"\t\t}\\n\"\n\"\t\telse\\n\"\n\"\t\t{\\n\"\n\"\t\t\tThreadsAllActive = 1;\\n\"\n\"\t\t}\\n\"\n\"\t\tif(Obj.ThreadsActive)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tThreadsActive = Obj.ThreadsActive;\\n\"\n\"\t\t}\\n\"\n\"\t\tif(Obj.GroupsAllActive || Obj.GroupsAllActive == 0 || Obj.GroupsAllActive)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tGroupsAllActive = Obj.GroupsAllActive;\\n\"\n\"\t\t}\\n\"\n\"\t\telse\\n\"\n\"\t\t{\\n\"\n\"\t\t\tGroupsAllActive = 1;\\n\"\n\"\t\t}\\n\"\n\"\t\tif(Obj.GroupsActive)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tGroupsActive = Obj.GroupsActive;\\n\"\n\"\t\t}\\n\"\n\"\t\tif(Obj.nContextSwitchEnabled)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tnContextSwitchEnabled = Obj.nContextSwitchEnabled; \\n\"\n\"\t\t}\\n\"\n\"\t\telse\\n\"\n\"\t\t{\\n\"\n\"\t\t\tnContextSwitchEnabled = 1;\\n\"\n\"\t\t}\\n\"\n\"\t\tif(Obj.GroupColors)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tGroupColors = Obj.GroupColors;\\n\"\n\"\t\t}\\n\"\n\"\t\telse\\n\"\n\"\t\t{\\n\"\n\"\t\t\tGroupColors = 0;\\n\"\n\"\t\t}\\n\"\n\"\t\tif(Obj.nHideHelp)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tnHideHelp = 1;\\n\"\n\"\t\t}\\n\"\n\"\t\tTimersGroups = Obj.TimersGroups?Obj.TimersGroups:0;\\n\"\n\"\t\tTimersMeta = Obj.TimersMeta?0:1;\\n\"\n\"\t}\\n\"\n\"\tSetContextSwitch(nContextSwitchEnabled);\\n\"\n\"\tSetMode(NewMode, TimersGroups);\\n\"\n\"\tSetReferenceTime(ReferenceTimeString);\\n\"\n\"\tUpdateOptionsMenu();\\n\"\n\"\tUpdateGroupColors();\\n\"\n\"}\\n\"\n\"function WriteCookie()\\n\"\n\"{\\n\"\n\"\tvar Obj = new Object();\\n\"\n\"\tObj.Mode = Mode;\\n\"\n\"\tObj.ReferenceTime = ReferenceTime + \\'ms\\';\\n\"\n\"\tObj.ThreadsActive = ThreadsActive;\\n\"\n\"\tObj.ThreadsAllActive = ThreadsAllActive;\\n\"\n\"\tObj.GroupsActive = GroupsActive;\\n\"\n\"\tObj.GroupsAllActive = GroupsAllActive;\\n\"\n\"\tObj.nContextSwitchEnabled = nContextSwitchEnabled;\\n\"\n\"\tObj.TimersGroups = TimersGroups?TimersGroups:0;\\n\"\n\"\tObj.TimersMeta = TimersMeta?0:1;\\n\"\n\"\tObj.GroupColors = GroupColors;\\n\"\n\"\tif(nHideHelp)\\n\"\n\"\t{\\n\"\n\"\t\tObj.nHideHelp = 1;\\n\"\n\"\t}\\n\"\n\"\tvar date = new Date();\\n\"\n\"\tdate.setFullYear(2099);\\n\"\n\"\tvar cookie = \\'fisk=\\' + JSON.stringify(Obj) + \\';expires=\\' + date;\\n\"\n\"\tdocument.cookie = cookie;\\n\"\n\"}\\n\"\n\"\\n\"\n\"var mousewheelevt = (/Firefox/i.test(navigator.userAgent)) ? \\\"DOMMouseScroll\\\" : \\\"mousewheel\\\" //FF doesn\\'t recogniz\";\n\nconst size_t g_MicroProfileHtml_end_2_size = sizeof(g_MicroProfileHtml_end_2);\nconst char g_MicroProfileHtml_end_3[] =\n\"e mousewheel as of FF3.x\\n\"\n\"\\n\"\n\"CanvasDetailedView.addEventListener(\\'mousemove\\', MouseMove, false);\\n\"\n\"CanvasDetailedView.addEventListener(\\'mousedown\\', function(evt) { MouseButton(true, evt); });\\n\"\n\"CanvasDetailedView.addEventListener(\\'mouseup\\', function(evt) { MouseButton(false, evt); } );\\n\"\n\"CanvasDetailedView.addEventListener(\\'mouseout\\', MouseOut);\\n\"\n\"CanvasDetailedView.addEventListener(\\\"contextmenu\\\", function (e) { e.preventDefault(); }, false);\\n\"\n\"CanvasDetailedView.addEventListener(mousewheelevt, MouseWheel, false);\\n\"\n\"CanvasHistory.addEventListener(\\'mousemove\\', MouseMove);\\n\"\n\"CanvasHistory.addEventListener(\\'mousedown\\', function(evt) { MouseButton(true, evt); });\\n\"\n\"CanvasHistory.addEventListener(\\'mouseup\\', function(evt) { MouseButton(false, evt); } );\\n\"\n\"CanvasHistory.addEventListener(\\'mouseout\\', MouseOut);\\n\"\n\"CanvasHistory.addEventListener(\\\"contextmenu\\\", function (e) { e.preventDefault(); }, false);\\n\"\n\"CanvasHistory.addEventListener(mousewheelevt, MouseWheel, false);\\n\"\n\"FilterInputTimer.addEventListener(\\'keyup\\', FilterKeyUp);\\n\"\n\"FilterInputGroup.addEventListener(\\'keyup\\', FilterKeyUp);\\n\"\n\"window.addEventListener(\\'keydown\\', KeyDown);\\n\"\n\"window.addEventListener(\\'keyup\\', KeyUp);\\n\"\n\"window.addEventListener(\\'resize\\', ResizeCanvas, false);\\n\"\n\"\\n\"\n\"\\n\"\n\"\\n\"\n\"\\n\"\n\"function CalcAverage()\\n\"\n\"{\\n\"\n\"\tvar Sum = 0;\\n\"\n\"\tvar Count = 0;\\n\"\n\"\tfor(nLog = 0; nLog < nNumLogs; nLog++)\\n\"\n\"\t{\\n\"\n\"\t\tStackPos = 0;\\n\"\n\"\t\tfor(var i = 0; i < Frames.length; i++)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tvar Frame_ = Frames[i];\t\t\t\\n\"\n\"\t\t\tvar tt = Frame_.tt[nLog];\\n\"\n\"\t\t\tvar ts = Frame_.ts[nLog];\\n\"\n\"\\n\"\n\"\t\t\tvar count = tt.length;\\n\"\n\"\t\t\tfor(var j = 0; j < count; j++)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tvar type = tt[j];\\n\"\n\"\t\t\t\tvar time = ts[j];\\n\"\n\"\t\t\t\tif(type == 1)\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\tStack[StackPos] = time;//store the frame which it comes from\\n\"\n\"\t\t\t\t\tStackPos++;\\n\"\n\"\t\t\t\t}\\n\"\n\"\t\t\t\telse if(type == 0)\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\tif(StackPos>0)\\n\"\n\"\t\t\t\t\t{\\n\"\n\"\\n\"\n\"\t\t\t\t\t\tStackPos--;\\n\"\n\"\t\t\t\t\t\tvar localtime = time - Stack[StackPos];\\n\"\n\"\t\t\t\t\t\tCount++;\\n\"\n\"\t\t\t\t\t\tSum += localtime;\\n\"\n\"\t\t\t\t\t}\\n\"\n\"\t\t\t\t}\\n\"\n\"\t\t\t}\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"\treturn Sum / Count;\\n\"\n\"\\n\"\n\"}\\n\"\n\"\\n\"\n\"function MakeLod(index, MinDelta, GlobalArray, LogStart)\\n\"\n\"{\\n\"\n\"\tif(LodData[index])\\n\"\n\"\t{\\n\"\n\"\t\tconsole.log(\\\"error!!\\\");\\n\"\n\"\t}\\n\"\n\"\tvar o = new Object();\\n\"\n\"\to.MinDelta = MinDelta;\\n\"\n\"\to.GlobalArray = GlobalArray;\\n\"\n\"\to.LogStart = LogStart;\\n\"\n\"\tLodData[index] = o;\\n\"\n\"}\\n\"\n\"\\n\"\n\"function PreprocessBuildSplitArray()\\n\"\n\"{\\n\"\n\"\tvar nNumLogs = Frames[0].ts.length;\\n\"\n\"\\n\"\n\"\tProfileEnter(\\\"PreprocessBuildSplitArray\\\");\\n\"\n\"\tvar SplitArrays = new Array(nNumLogs);\\n\"\n\"\\n\"\n\"\tfor(nLog = 0; nLog < nNumLogs; nLog++)\\n\"\n\"\t{\\n\"\n\"\t\tvar MaxDepth = 1;\\n\"\n\"\t\tvar StackPos = 0;\\n\"\n\"\t\tvar Stack = Array(20);\\n\"\n\"\t\tvar TypeArray = g_TypeArray[nLog];\\n\"\n\"\t\tvar TimeArray = g_TimeArray[nLog];\\n\"\n\"\t\tvar DeltaTimes = new Array(TypeArray.length);\\n\"\n\"\\n\"\n\"\t\tfor(var j = 0; j < TypeArray.length; ++j)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tvar type = TypeArray[j];\\n\"\n\"\t\t\tvar time = TimeArray[j];\\n\"\n\"\t\t\tif(type == 1)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\t//push\\n\"\n\"\t\t\t\tStack[StackPos] = time;\\n\"\n\"\t\t\t\tStackPos++;\\n\"\n\"\t\t\t}\\n\"\n\"\t\t\telse if(type == 0)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tif(StackPos>0)\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\tStackPos--;\\n\"\n\"\t\t\t\t\tDeltaTimes[j] = time - Stack[StackPos];\\n\"\n\"\t\t\t\t}\\n\"\n\"\t\t\t\telse\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\tDeltaTimes[j] = 0;\\n\"\n\"\t\t\t\t}\\n\"\n\"\t\t\t}\\n\"\n\"\t\t}\\n\"\n\"\t\tDeltaTimes.sort(function(a,b){return b-a;});\\n\"\n\"\t\tvar SplitArray = Array(NumLodSplits);\\n\"\n\"\t\tvar SplitIndex = DeltaTimes.length;\\n\"\n\"\\n\"\n\"\t\tvar j = 0;\\n\"\n\"\t\tfor(j = 0; j < NumLodSplits; ++j)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tSplitIndex = Math.floor(SplitIndex / 2);\\n\"\n\"\t\t\twhile(SplitIndex > 0 && !DeltaTimes[SplitIndex])\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tSplitIndex--;\\n\"\n\"\t\t\t}\\n\"\n\"\t\t\tif(SplitIndex < SplitMin)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tbreak;\\n\"\n\"\t\t\t}\\n\"\n\"\t\t\t//search.. if 0\\n\"\n\"\t\t\tvar SplitTime = DeltaTimes[SplitIndex];\\n\"\n\"\t\t\tif(SplitTime>=0)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tSplitArray[j] = SplitTime;\\n\"\n\"\t\t\t}\\n\"\n\"\t\t\telse\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tSplitArray[j] = SPLIT_LIMIT;\\n\"\n\"\t\t\t}\\n\"\n\"\t\t\tif(j>0)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tconsole.assert(SplitArray[j-1] <= SplitArray[j], \\\"must be less\\\");\\n\"\n\"\t\t\t}\\n\"\n\"\\n\"\n\"\t\t}\\n\"\n\"\t\tfor(; j < NumLodSplits; ++j)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tSplitArray[j] = SPLIT_LIMIT;\\n\"\n\"\t\t}\\n\"\n\"\\n\"\n\"\\n\"\n\"\t\tSplitArrays[nLog] = SplitArray;\\n\"\n\"\t}\\n\"\n\"\tProfileLeave();\\n\"\n\"\treturn SplitArrays;\\n\"\n\"}\\n\"\n\"\\n\"\n\"function PreprocessBuildDurationArray()\\n\"\n\"{\\n\"\n\"\tvar nNumLogs = Frames[0].ts.length;\\n\"\n\"\tProfileEnter(\\\"PreprocessBuildDurationArray\\\");\\n\"\n\"\tvar DurationArrays = new Array(nNumLogs);\\n\"\n\"\tfor(nLog = 0; nLog < nNumLogs; ++nLog)\\n\"\n\"\t{\\n\"\n\"\t\tvar MaxDepth = 1;\\n\"\n\"\t\tvar StackPos = 0;\\n\"\n\"\t\tvar Stack = Array(20);\\n\"\n\"\t\tvar StackIndex = Array(20);\\n\"\n\"\t\tvar TypeArray = g_TypeArray[nLog];\\n\"\n\"\t\tvar TimeArray = g_TimeArray[nLog];\\n\"\n\"\t\tvar DurationArray = Array(g_TypeArray[nLog].length);\\n\"\n\"\t\tfor(var j = 0; j < TypeArray.length; ++j)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tvar type = TypeArray[j];\\n\"\n\"\t\t\tvar time = TimeArray[j];\\n\"\n\"\t\t\tif(type == 1)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\t//push\\n\"\n\"\t\t\t\tStack[StackPos] = time;\\n\"\n\"\t\t\t\tStackIndex[StackPos] = j;\\n\"\n\"\t\t\t\tStackPos++;\\n\"\n\"\t\t\t}\\n\"\n\"\t\t\telse if(type == 0)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tif(StackPos>0)\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\tStackPos--;\\n\"\n\"\t\t\t\t\tvar Duration = time - Stack[StackPos];\\n\"\n\"\t\t\t\t\tDurationArray[StackIndex[StackPos]] = Duration;\\n\"\n\"\t\t\t\t\tDurationArray[j] = Duration;\\n\"\n\"\t\t\t\t}\\n\"\n\"\t\t\t\telse\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\tDurationArray[j] = 0;\\n\"\n\"\t\t\t\t}\\n\"\n\"\t\t\t}\\n\"\n\"\t\t}\\n\"\n\"\t\tfor(var j = 0; j < StackPos; ++j)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tDurationArray[j] = 0;\\n\"\n\"\t\t}\\n\"\n\"\t\tDurationArrays[nLog] = DurationArray;\\n\"\n\"\t}\\n\"\n\"\tProfileLeave();\\n\"\n\"\treturn DurationArrays;\\n\"\n\"\\n\"\n\"}\\n\"\n\"function PreprocessLods()\\n\"\n\"{\\n\"\n\"\tProfileEnter(\\\"PreprocessLods\\\");\\n\"\n\"\tvar nNumLogs = Frames[0].ts.length;\\n\"\n\"\tvar SplitArrays = PreprocessBuildSplitArray();\\n\"\n\"\tvar DurationArrays = PreprocessBuildDurationArray();\\n\"\n\"\tvar Source = LodData[0];\\n\"\n\"\tvar SourceLogStart = Source.LogStart;\\n\"\n\"\tvar NumFrames = SourceLogStart.length;\\n\"\n\"\\n\"\n\"\tfor(var i = 0; i < NumLodSplits-1; ++i)\\n\"\n\"\t{\\n\"\n\"\t\tvar DestLogStart = Array(SourceLogStart.length);\\n\"\n\"\t\tfor(var j = 0; j < DestLogStart.length; ++j)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tDestLogStart[j] = Array(nNumLogs);\\n\"\n\"\t\t}\\n\"\n\"\t\tvar MinDelta = Array(nNumLogs);\\n\"\n\"\t\tvar GlobalArray = Array(nNumLogs);\\n\"\n\"\\n\"\n\"\t\tfor(nLog = 0; nLog < nNumLogs; ++nLog)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tvar Duration = DurationArrays[nLog];\\n\"\n\"\t\t\tvar SplitTime = SplitArrays[nLog][i];\\n\"\n\"\\n\"\n\"\t\t\tMinDelta[nLog] = SplitTime;\\n\"\n\"\t\t\tif(SplitTime < SPLIT_LIMIT)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tvar SourceCount = Duration.length;\\n\"\n\"\t\t\t\tvar DestGlobalArray = Array();\\n\"\n\"\t\t\t\tvar RemapArray = Array(SourceCount);\\n\"\n\"\\n\"\n\"\t\t\t\tfor(var j = 0; j < SourceCount; ++j)\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\tRemapArray[j] = DestGlobalArray.length;\\n\"\n\"\t\t\t\t\tif(Duration[j] >= SplitTime)\\n\"\n\"\t\t\t\t\t{\\n\"\n\"\t\t\t\t\t\tDestGlobalArray.push(j);\\n\"\n\"\t\t\t\t\t}\\n\"\n\"\t\t\t\t}\\n\"\n\"\t\t\t\tGlobalArray[nLog] = DestGlobalArray;\\n\"\n\"\t\t\t\tfor(var j = 0; j < NumFrames; ++j)\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\tvar OldStart = SourceLogStart[j][nLog];\\n\"\n\"\t\t\t\t\tvar NewStart = RemapArray[OldStart];\\n\"\n\"\t\t\t\t\tvar FrameArray = DestLogStart[j];\\n\"\n\"\t\t\t\t\tFrameArray[nLog] = NewStart;\\n\"\n\"\t\t\t\t}\\n\"\n\"\t\t\t}\\n\"\n\"\t\t\telse\\n\"\n\"\t\t\t{\\n\"\n\"\\n\"\n\"\t\t\t\tfor(var j = 0; j < NumFrames; ++j)\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\tvar FrameArray = DestLogStart[j];\\n\"\n\"\t\\n\"\n\"\t\t\t\t\tFrameArray[nLog] = 0;\\n\"\n\"\t\t\t\t}\\n\"\n\"\\n\"\n\"\t\t\t}\\n\"\n\"\\n\"\n\"\t\t}\\n\"\n\"\t\tMakeLod(i+1, MinDelta, GlobalArray, DestLogStart);\\n\"\n\"\t}\\n\"\n\"\tProfileLeave();\\n\"\n\"}\\n\"\n\"function PreprocessGlobalArray()\\n\"\n\"{\\n\"\n\"\tProfileEnter(\\\"PreprocessGlobalArray\\\");\\n\"\n\"\tvar nNumLogs = Frames[0].ts.length;\\n\"\n\"\tvar CaptureStart = Frames[0].framestart;\\n\"\n\"\tvar CaptureEnd = Frames[Frames.length-1].frameend;\\n\"\n\"\tg_GlobalArray = new Array(nNumLogs);\\n\"\n\"\tg_TypeArray = new Array(nNumLogs);\\n\"\n\"\tg_TimeArray = new Array(nNumLogs);\\n\"\n\"\tg_IndexArray = new Array(nNumLogs);\\n\"\n\"\tg_LabelArray = new Array(nNumLogs);\\n\"\n\"\tvar StackPos = 0;\\n\"\n\"\tvar Stack = Array(20);\\n\"\n\"\tvar LogStartArray = new Array(Frames.length);\\n\"\n\"\tfor(var i = 0; i < Frames.length; i++)\\n\"\n\"\t{\\n\"\n\"\t\tFrames[i].LogStart = new Array(nNumLogs);\t\\n\"\n\"\t\tLogStartArray[i] = Frames[i].LogStart;\\n\"\n\"\\n\"\n\"\t\tFrames[i].LogEnd = new Array(nNumLogs);\\n\"\n\"\t}\\n\"\n\"\tvar MinDelta = Array(nNumLogs);\\n\"\n\"\tfor(nLog = 0; nLog < nNumLogs; nLog++)\\n\"\n\"\t{\\n\"\n\"\t\tMinDelta[nLog] = 0;\\n\"\n\"\t\tvar Discard = 0;\\n\"\n\"\t\tvar GlobalArray = new Array();\\n\"\n\"\t\tvar TypeArray = new Array();\\n\"\n\"\t\tvar TimeArray = new Array();\\n\"\n\"\t\tvar IndexArray = new Array();\\n\"\n\"\t\tvar LabelArray = new Array();\\n\"\n\"\t\tfor(var i = 0; i < Frames.length; i++)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tvar Frame_ = Frames[i];\t\\n\"\n\"\t\t\tFrame_.LogStart[nLog] = TimeArray.length;\\n\"\n\"\t\t\tvar FrameDiscard = (ThreadGpu[nLog] ? Frame_.frameendgpu : Frame_.frameend) + 33;//if timestamps are more than 33ms after current frame, we assume buffer has wrapped.\\n\"\n\"\t\t\tvar tt = Frame_.tt[nLog];\\n\"\n\"\t\t\tvar ts = Frame_.ts[nLog];\\n\"\n\"\t\t\tvar ti = Frame_.ti[nLog];\\n\"\n\"\t\t\tvar tl = Frame_.tl[nLog];\\n\"\n\"\t\t\tvar len = tt.length;\\n\"\n\"\t\t\tvar DiscardLast = 0;\\n\"\n\"\t\t\tfor(var xx = 0; xx < len; ++xx)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tvar Skip = (tt[xx] == 4) ? DiscardLast : ts[xx] > FrameDiscard;\\n\"\n\"\t\t\t\tif(Skip)\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\tDiscard++;\\n\"\n\"\t\t\t\t\tDiscardLast = 1;\\n\"\n\"\t\t\t\t}\\n\"\n\"\t\t\t\telse\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\tDiscardLast = 0;\\n\"\n\"\t\t\t\t\tGlobalArray.push(TypeArray.length);\\n\"\n\"\t\t\t\t\tTypeArray.push(tt[xx]);\\n\"\n\"\t\t\t\t\tTimeArray.push(ts[xx]);\\n\"\n\"\t\t\t\t\tIndexArray.push(ti[xx]);\\n\"\n\"\\n\"\n\"\t\t\t\t\t// Use label after the region instead of the region name for some regions\\n\"\n\"\t\t\t\t\tvar Label = null;\\n\"\n\"\t\t\t\t\tif(xx + 1 < len && tt[xx] == 1 && tt[xx+1] == 3 && TimerInfo[ti[xx]].namelabel)\\n\"\n\"\t\t\t\t\t{\\n\"\n\"\t\t\t\t\t\tLabel = tl[ti[xx+1]];\\n\"\n\"\t\t\t\t\t}\\n\"\n\"\\n\"\n\"\t\t\t\t\tLabelArray.push(Label);\\n\"\n\"\t\t\t\t}\\n\"\n\"\t\t\t}\\n\"\n\"\t\t\tFrame_.LogEnd[nLog] = TimeArray.length;\\n\"\n\"\t\t}\\n\"\n\"\t\tg_GlobalArray[nLog] = GlobalArray;\\n\"\n\"\t\tg_TypeArray[nLog] = TypeArray;\\n\"\n\"\t\tg_TimeArray[nLog] = TimeArray;\\n\"\n\"\t\tg_IndexArray[nLog] = IndexArray;\\n\"\n\"\t\tg_LabelArray[nLog] = LabelArray;\\n\"\n\"\t\tif(Discard)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tconsole.log(\\'discarded \\' + Discard + \\' markers from \\' + ThreadNames[nLog]);\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"\tMakeLod(0, MinDelta, g_GlobalArray, LogStartArray);\\n\"\n\"\tProfileLeave();\\n\"\n\"}\\n\"\n\"\\n\"\n\"function PreprocessFindFirstFrames()\\n\"\n\"{\\n\"\n\"\tProfileEnter(\\\"PreprocesFindFirstFrames\\\");\\n\"\n\"\t//create arrays that show how far back we need to start search in order to get all markers.\\n\"\n\"\tvar nNumLogs = Frames[0].ts.length;\\n\"\n\"\tfor(var i = 0; i < Frames.length; i++)\\n\"\n\"\t{\\n\"\n\"\t\tFrames[i].FirstFrameIndex = new Array(nNumLogs);\\n\"\n\"\t}\\n\"\n\"\\n\"\n\"\tvar StackPos = 0;\\n\"\n\"\tvar Stack = Array(20);\\n\"\n\"\tg_MaxStack = Array(nNumLogs);\\n\"\n\"\t\\n\"\n\"\tfor(nLog = 0; nLog < nNumLogs; nLog++)\\n\"\n\"\t{\\n\"\n\"\t\tvar MaxStack = 0;\\n\"\n\"\t\tStackPos = 0;\\n\"\n\"\t\tfor(var i = 0; i < Frames.length; i++)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tvar Frame_ = Frames[i];\t\t\t\\n\"\n\"\t\t\tvar tt = Frame_.tt[nLog];\\n\"\n\"\t\t\tvar count = tt.length;\\n\"\n\"\\n\"\n\"\t\t\tvar FirstFrame = i;\\n\"\n\"\t\t\tif(StackPos>0)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tFirstFrame = Stack[0];\\n\"\n\"\t\t\t}\\n\"\n\"\t\t\tFrames[i].FirstFrameIndex[nLog] = FirstFrame;\\n\"\n\"\\n\"\n\"\t\t\tfor(var j = 0; j < count; j++)\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tvar type = tt[j];\\n\"\n\"\t\t\t\tif(type == 1)\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\tStack[StackPos] = i;//store the frame which it comes from\\n\"\n\"\t\t\t\t\tStackPos++;\\n\"\n\"\t\t\t\t\tif(StackPos > MaxStack)\\n\"\n\"\t\t\t\t\t{\\n\"\n\"\t\t\t\t\t\tMaxStack = StackPos;\\n\"\n\"\t\t\t\t\t}\\n\"\n\"\t\t\t\t}\\n\"\n\"\t\t\t\telse if(type == 0)\\n\"\n\"\t\t\t\t{\\n\"\n\"\t\t\t\t\tif(StackPos>0)\\n\"\n\"\t\t\t\t\t{\\n\"\n\"\t\t\t\t\t\tStackPos--;\\n\"\n\"\t\t\t\t\t}\\n\"\n\"\t\t\t\t}\\n\"\n\"\t\t\t}\\n\"\n\"\t\t}\\n\"\n\"\t\tg_MaxStack[nLog] = MaxStack;\\n\"\n\"\t}\\n\"\n\"\tProfileLeave();\\n\"\n\"}\\n\"\n\"function PreprocessMeta()\\n\"\n\"{\\n\"\n\"\tMetaLengths = Array(MetaNames.length);\\n\"\n\"\tMetaLengthsAvg = Array(MetaNames.length);\\n\"\n\"\tMetaLengthsMax = Array(MetaNames.length);\\n\"\n\"\tfor(var i = 0; i < MetaNames.length; ++i)\\n\"\n\"\t{\\n\"\n\"\t\tMetaLengths[i] = MetaNames[i].length+1;\\n\"\n\"\t\tMetaLengthsAvg[i] = MetaNames[i].length+5;\\n\"\n\"\t\tMetaLengthsMax[i] = MetaNames[i].length+5;\\n\"\n\"\t\tif(MetaLengths[i]<12)\\n\"\n\"\t\t\tMetaLengths[i] = 12;\\n\"\n\"\t\tif(MetaLengthsAvg[i]<12)\\n\"\n\"\t\t\tMetaLengthsAvg[i] = 12;\\n\"\n\"\t\tif(MetaLengthsMax[i]<12)\\n\"\n\"\t\t\tMetaLengthsMax[i] = 12;\\n\"\n\"\t}\\n\"\n\"\tfor(var i = 0; i < TimerInfo.length; ++i)\\n\"\n\"\t{\\n\"\n\"\t\tvar Timer = TimerInfo[i];\\n\"\n\"\t\tfor(var j = 0; j < MetaNames.length; ++j)\\n\"\n\"\t\t{\\n\"\n\"\t\t\tvar Len = FormatMeta(Timer.meta[j],0).length + 2;\\n\"\n\"\t\t\tvar LenAvg = FormatMeta(Timer.meta[j],2).length + 2;\\n\"\n\"\t\t\tvar LenMax = FormatMeta(Timer.meta[j],0).length + 2;\\n\"\n\"\t\t\tif(Len > MetaLengths[j])\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tMetaLengths[j] = Len;\\n\"\n\"\t\t\t}\\n\"\n\"\t\t\tif(LenAvg > MetaLengthsAvg[j])\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tMetaLengthsAvg[j] = LenAvg;\\n\"\n\"\t\t\t}\\n\"\n\"\t\t\tif(LenMax > MetaLengthsMax[j])\\n\"\n\"\t\t\t{\\n\"\n\"\t\t\t\tMetaLengthsMax[j] = LenMax;\\n\"\n\"\t\t\t}\\n\"\n\"\t\t}\\n\"\n\"\t}\\n\"\n\"}\\n\"\n\"\\n\"\n\"function Preprocess()\\n\"\n\"{\\n\"\n\"\tvar ProfileModeOld = ProfileMode;\\n\"\n\"\tProfileMode = 1;\\n\"\n\"\tProfileModeClear();\\n\"\n\"\tProfileEnter(\\\"Preprocess\\\");\\n\"\n\"\tPreprocessCalculateAllTimers();\\n\"\n\"\tPreprocessFindFirstFrames();\\n\"\n\"\tPreprocessGlobalArray();\\n\"\n\"\tPreprocessLods();\\n\"\n\"\tPreprocessMeta();\\n\"\n\"\tPreprocessContextSwitchCache();\\n\"\n\"\tProfileLeave();\\n\"\n\"\tProfileModeDump();\\n\"\n\"\tProfileMode = ProfileModeOld;\\n\"\n\"\tInitialized = 1;\\n\"\n\"}\\n\"\n\"\\n\"\n\"InitGroups();\\n\"\n\"ReadCookie();\\n\"\n\"MeasureFont()\\n\"\n\"InitThreadMenu();\\n\"\n\"InitGroupMenu();\\n\"\n\"InitFrameInfo();\\n\"\n\"UpdateThreadMenu();\\n\"\n\"ResizeCanvas();\\n\"\n\"Preprocess();\\n\"\n\"OnPageReady();\\n\"\n\"Draw(1);\\n\"\n\"AutoRedraw();\\n\"\n\"\\n\"\n\"</script>\\n\"\n\"</body>\\n\"\n\"</html>\\n\"\n\"\";\n\nconst size_t g_MicroProfileHtml_end_3_size = sizeof(g_MicroProfileHtml_end_3);\nconst char* g_MicroProfileHtml_end[] = {\n&g_MicroProfileHtml_end_0[0],\n&g_MicroProfileHtml_end_1[0],\n&g_MicroProfileHtml_end_2[0],\n&g_MicroProfileHtml_end_3[0],\n};\nsize_t g_MicroProfileHtml_end_sizes[] = {\nsizeof(g_MicroProfileHtml_end_0),\nsizeof(g_MicroProfileHtml_end_1),\nsizeof(g_MicroProfileHtml_end_2),\nsizeof(g_MicroProfileHtml_end_3),\n};\nsize_t g_MicroProfileHtml_end_count = 4;\n#endif //MICROPROFILE_EMBED_HTML\n\n///end file generated from  microprofile.html\n"
  },
  {
    "path": "third_party/microprofile/microprofileui.h",
    "content": "#pragma once\n// This is free and unencumbered software released into the public domain.\n// Anyone is free to copy, modify, publish, use, compile, sell, or\n// distribute this software, either in source code form or as a compiled\n// binary, for any purpose, commercial or non-commercial, and by any\n// means.\n// In jurisdictions that recognize copyright laws, the author or authors\n// of this software dedicate any and all copyright interest in the\n// software to the public domain. We make this dedication for the benefit\n// of the public at large and to the detriment of our heirs and\n// successors. We intend this dedication to be an overt act of\n// relinquishment in perpetuity of all present and future rights to this\n// software under copyright law.\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n// IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR\n// OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\n// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n// OTHER DEALINGS IN THE SOFTWARE.\n// For more information, please refer to <http://unlicense.org/>\n//\n// ***********************************************************************\n//\n//\n//\n\n\n#ifndef MICROPROFILE_ENABLED\n#error \"microprofile.h must be included before including microprofileui.h\"\n#endif\n\n#ifndef MICROPROFILEUI_ENABLED\n#define MICROPROFILEUI_ENABLED MICROPROFILE_ENABLED\n#endif\n\n#ifndef MICROPROFILEUI_API\n#define MICROPROFILEUI_API\n#endif\n\n\n#if 0 == MICROPROFILEUI_ENABLED \n#define MicroProfileMouseButton(foo, bar) do{}while(0)\n#define MicroProfileMousePosition(foo, bar, z) do{}while(0)\n#define MicroProfileModKey(key) do{}while(0)\n#define MicroProfileDraw(foo, bar) do{}while(0)\n#define MicroProfileIsDrawing() 0\n#define MicroProfileToggleDisplayMode() do{}while(0)\n#define MicroProfileSetDisplayMode(f) do{}while(0)\n#else\n\n#ifndef MICROPROFILE_DRAWCURSOR\n#define MICROPROFILE_DRAWCURSOR 0\n#endif\n\n#ifndef MICROPROFILE_DETAILED_BAR_NAMES\n#define MICROPROFILE_DETAILED_BAR_NAMES 1\n#endif\n\n#ifndef MICROPROFILE_TEXT_WIDTH\n#define MICROPROFILE_TEXT_WIDTH 5\n#endif\n\n#ifndef MICROPROFILE_TEXT_HEIGHT\n#define MICROPROFILE_TEXT_HEIGHT 8\n#endif\n\n#ifndef MICROPROFILE_DETAILED_BAR_HEIGHT\n#define MICROPROFILE_DETAILED_BAR_HEIGHT 12\n#endif\n\n#ifndef MICROPROFILE_DETAILED_CONTEXT_SWITCH_HEIGHT\n#define MICROPROFILE_DETAILED_CONTEXT_SWITCH_HEIGHT 7\n#endif\n\n#ifndef MICROPROFILE_GRAPH_WIDTH\n#define MICROPROFILE_GRAPH_WIDTH 256\n#endif\n\n#ifndef MICROPROFILE_GRAPH_HEIGHT\n#define MICROPROFILE_GRAPH_HEIGHT 256\n#endif\n\n#ifndef MICROPROFILE_BORDER_SIZE \n#define MICROPROFILE_BORDER_SIZE 1\n#endif\n\n#ifndef MICROPROFILE_HELP_LEFT\n#define MICROPROFILE_HELP_LEFT \"Left-Click\"\n#endif\n\n#ifndef MICROPROFILE_HELP_RIGHT\n#define MICROPROFILE_HELP_RIGHT \"Right-Click\"\n#endif\n\n#ifndef MICROPROFILE_HELP_MOD\n#define MICROPROFILE_HELP_MOD \"Mod\"\n#endif\n\n#ifndef MICROPROFILE_BAR_WIDTH\n#define MICROPROFILE_BAR_WIDTH 100\n#endif\n\n#ifndef MICROPROFILE_CUSTOM_MAX\n#define MICROPROFILE_CUSTOM_MAX 8 \n#endif\n\n#ifndef MICROPROFILE_CUSTOM_MAX_TIMERS\n#define MICROPROFILE_CUSTOM_MAX_TIMERS 64\n#endif\n\n#ifndef MICROPROFILE_CUSTOM_PADDING\n#define MICROPROFILE_CUSTOM_PADDING 12\n#endif\n\n\n#define MICROPROFILE_FRAME_HISTORY_HEIGHT 50\n#define MICROPROFILE_FRAME_HISTORY_WIDTH 7\n#define MICROPROFILE_FRAME_HISTORY_COLOR_CPU 0xffff7f27 //255 127 39\n#define MICROPROFILE_FRAME_HISTORY_COLOR_GPU 0xff37a0ee //55 160 238\n#define MICROPROFILE_FRAME_HISTORY_COLOR_HIGHTLIGHT 0x7733bb44\n#define MICROPROFILE_FRAME_COLOR_HIGHTLIGHT 0x20009900\n#define MICROPROFILE_FRAME_COLOR_HIGHTLIGHT_GPU 0x20996600\n#define MICROPROFILE_NUM_FRAMES (MICROPROFILE_MAX_FRAME_HISTORY - (MICROPROFILE_GPU_FRAME_DELAY+1))\n\n#define MICROPROFILE_TOOLTIP_MAX_STRINGS (32 + MICROPROFILE_MAX_GROUPS*2)\n#define MICROPROFILE_TOOLTIP_STRING_BUFFER_SIZE (4*1024)\n#define MICROPROFILE_TOOLTIP_MAX_LOCKED 3\n\n#define MICROPROFILE_COUNTER_INDENT 4\n#define MICROPROFILE_COUNTER_WIDTH 100\n\n\n\nenum\n{\n\tMICROPROFILE_CUSTOM_BARS = 0x1,\n\tMICROPROFILE_CUSTOM_BAR_SOURCE_MAX = 0x2,\n\tMICROPROFILE_CUSTOM_BAR_SOURCE_AVG = 0,\n\tMICROPROFILE_CUSTOM_STACK = 0x4,\n\tMICROPROFILE_CUSTOM_STACK_SOURCE_MAX = 0x8,\n\tMICROPROFILE_CUSTOM_STACK_SOURCE_AVG = 0,\n};\n\n\nMICROPROFILEUI_API void MicroProfileDraw(uint32_t nWidth, uint32_t nHeight); //! call if drawing microprofilers\nMICROPROFILEUI_API bool MicroProfileIsDrawing();\nMICROPROFILEUI_API void MicroProfileToggleGraph(MicroProfileToken nToken);\nMICROPROFILEUI_API bool MicroProfileDrawGraph(uint32_t nScreenWidth, uint32_t nScreenHeight);\nMICROPROFILEUI_API void MicroProfileToggleDisplayMode(); //switch between off, bars, detailed\nMICROPROFILEUI_API void MicroProfileSetDisplayMode(int); //switch between off, bars, detailed\nMICROPROFILEUI_API void MicroProfileClearGraph();\nMICROPROFILEUI_API void MicroProfileMousePosition(uint32_t nX, uint32_t nY, int nWheelDelta);\nMICROPROFILEUI_API void MicroProfileModKey(uint32_t nKeyState);\nMICROPROFILEUI_API void MicroProfileMouseButton(uint32_t nLeft, uint32_t nRight);\nMICROPROFILEUI_API void MicroProfileDrawLineVertical(int nX, int nTop, int nBottom, uint32_t nColor);\nMICROPROFILEUI_API void MicroProfileDrawLineHorizontal(int nLeft, int nRight, int nY, uint32_t nColor);\nMICROPROFILEUI_API void MicroProfileLoadPreset(const char* pSuffix);\nMICROPROFILEUI_API void MicroProfileSavePreset(const char* pSuffix);\n\nMICROPROFILEUI_API void MicroProfileDrawText(int nX, int nY, uint32_t nColor, const char* pText, uint32_t nNumCharacters);\nMICROPROFILEUI_API void MicroProfileDrawBox(int nX, int nY, int nX1, int nY1, uint32_t nColor, MicroProfileBoxType = MicroProfileBoxTypeFlat);\nMICROPROFILEUI_API void MicroProfileDrawLine2D(uint32_t nVertices, float* pVertices, uint32_t nColor);\nMICROPROFILEUI_API void MicroProfileDumpTimers();\n\nMICROPROFILEUI_API void MicroProfileInitUI();\n\nMICROPROFILEUI_API void MicroProfileCustomGroupToggle(const char* pCustomName);\nMICROPROFILEUI_API void MicroProfileCustomGroupEnable(const char* pCustomName);\nMICROPROFILEUI_API void MicroProfileCustomGroupEnable(uint32_t nIndex);\nMICROPROFILEUI_API void MicroProfileCustomGroupDisable();\nMICROPROFILEUI_API void MicroProfileCustomGroup(const char* pCustomName, uint32_t nMaxTimers, uint32_t nAggregateFlip, float fReferenceTime, uint32_t nFlags);\nMICROPROFILEUI_API void MicroProfileCustomGroupAddTimer(const char* pCustomName, const char* pGroup, const char* pTimer);\n\n#ifdef MICROPROFILEUI_IMPL\n#ifdef _WIN32\n#define snprintf _snprintf\n#endif\n#include <cstdlib>\n#include <cstdarg>\n#include <cmath>\n#include <algorithm>\n\nMICROPROFILE_DEFINE(g_MicroProfileDetailed, \"MicroProfile\", \"Detailed View\", 0x8888000);\nMICROPROFILE_DEFINE(g_MicroProfileDrawGraph, \"MicroProfile\", \"Draw Graph\", 0xff44ee00);\nMICROPROFILE_DEFINE(g_MicroProfileDrawBarView, \"MicroProfile\", \"DrawBarView\", 0x00dd77);\nMICROPROFILE_DEFINE(g_MicroProfileDraw,\"MicroProfile\", \"Draw\", 0x737373);\n\n\nstruct MicroProfileStringArray\n{\n\tconst char* ppStrings[MICROPROFILE_TOOLTIP_MAX_STRINGS];\n\tchar Buffer[MICROPROFILE_TOOLTIP_STRING_BUFFER_SIZE];\n\tchar* pBufferPos;\n\tuint32_t nNumStrings;\n};\n\nstruct MicroProfileGroupMenuItem\n{\n\tuint32_t nIsCategory;\n\tuint32_t nCategoryIndex;\n\tuint32_t nIndex;\n\tconst char* pName;\n};\n\nstruct MicroProfileCustom\n{\n\tchar pName[MICROPROFILE_NAME_MAX_LEN];\n\tuint32_t nFlags;\n\tuint32_t nAggregateFlip;\t\n\tuint32_t nNumTimers;\n\tuint32_t nMaxTimers;\n\tuint64_t nGroupMask;\n\tfloat fReference;\n\tuint64_t* pTimers;\n};\n\nstruct SOptionDesc\n{\n\tSOptionDesc(){}\n\tSOptionDesc(uint8_t nSubType, uint8_t nIndex, const char* fmt, ...):nSubType(nSubType), nIndex(nIndex)\n\t{\n\t\tva_list args;\n\t\tva_start (args, fmt);\n\t\tvsprintf(Text, fmt, args);\n\t\tva_end(args);\n\t}\n\tchar Text[32];\n\tuint8_t nSubType;\n\tuint8_t nIndex;\n\tbool bSelected;\n};\nstatic uint32_t g_MicroProfileAggregatePresets[] = {0, 10, 20, 30, 60, 120};\nstatic float g_MicroProfileReferenceTimePresets[] = {5.f, 10.f, 15.f,20.f, 33.33f, 66.66f, 100.f, 250.f, 500.f, 1000.f};\nstatic uint32_t g_MicroProfileOpacityPresets[] = {0x40, 0x80, 0xc0, 0xff};\nstatic const char* g_MicroProfilePresetNames[] = \n{\n\tMICROPROFILE_DEFAULT_PRESET,\n\t\"Render\",\n\t\"GPU\",\n\t\"Lighting\",\n\t\"AI\",\n\t\"Visibility\",\n\t\"Sound\",\n};\n\nenum\n{\n\tMICROPROFILE_NUM_REFERENCE_PRESETS = sizeof(g_MicroProfileReferenceTimePresets)/sizeof(g_MicroProfileReferenceTimePresets[0]),\n\tMICROPROFILE_NUM_OPACITY_PRESETS = sizeof(g_MicroProfileOpacityPresets)/sizeof(g_MicroProfileOpacityPresets[0]),\n#if MICROPROFILE_CONTEXT_SWITCH_TRACE\n\tMICROPROFILE_OPTION_SIZE = MICROPROFILE_NUM_REFERENCE_PRESETS + MICROPROFILE_NUM_OPACITY_PRESETS * 2 + 2 + 6,\n#else\n\tMICROPROFILE_OPTION_SIZE = MICROPROFILE_NUM_REFERENCE_PRESETS + MICROPROFILE_NUM_OPACITY_PRESETS * 2 + 2 + 3,\n#endif\n};\n\nstruct MicroProfileUI\n{\n\t//menu/mouse over stuff\n\tuint64_t nHoverToken;\n\tint64_t  nHoverTime;\n\tint \t nHoverFrame;\n#if MICROPROFILE_DEBUG\n\tuint64_t nHoverAddressEnter;\n\tuint64_t nHoverAddressLeave;\n#endif\n\n\tuint32_t nWidth;\n\tuint32_t nHeight;\n\n\tint nOffsetX[MP_DRAW_SIZE];\n\tint nOffsetY[MP_DRAW_SIZE];\n\n\tfloat fDetailedOffset; //display offset relative to start of latest displayable frame.\n\tfloat fDetailedRange; //no. of ms to display\n\tfloat fDetailedOffsetTarget;\n\tfloat fDetailedRangeTarget;\n\tuint32_t nOpacityBackground;\n\tuint32_t nOpacityForeground;\n\tbool bShowSpikes;\n\n\n\n\tuint32_t \t\t\t\tnMouseX;\n\tuint32_t \t\t\t\tnMouseY;\n\tuint32_t \t\t\t\tnMouseDownX;\n\tuint32_t \t\t\t\tnMouseDownY;\n\tint\t\t\t\t\t\tnMouseWheelDelta;\n\tuint32_t\t\t\t\tnMouseDownLeft;\n\tuint32_t\t\t\t\tnMouseDownRight;\n\tuint32_t \t\t\t\tnMouseLeft;\n\tuint32_t \t\t\t\tnMouseRight;\n\tuint32_t \t\t\t\tnMouseLeftMod;\n\tuint32_t \t\t\t\tnMouseRightMod;\n\tuint32_t\t\t\t\tnModDown;\n\tuint32_t \t\t\t\tnActiveMenu;\n\n\tMicroProfileLogEntry* pDisplayMouseOver;\n\n\tint64_t\t\t\t\t\tnRangeBegin;\n\tint64_t\t\t\t\t\tnRangeEnd;\n\tint64_t\t\t\t\t\tnRangeBeginGpu;\n\tint64_t\t\t\t\t\tnRangeEndGpu;\n\tuint32_t\t\t\t\tnRangeBeginIndex;\n\tuint32_t \t\t\t\tnRangeEndIndex;\n\tMicroProfileThreadLog* \tpRangeLog;\n\tuint32_t\t\t\t\tnHoverColor;\n\tuint32_t\t\t\t\tnHoverColorShared;\n\n\tint64_t\t\t\t\t\tnTickReferenceCpu;\n\tint64_t\t\t\t\t\tnTickReferenceGpu;\n\n\tMicroProfileStringArray LockedToolTips[MICROPROFILE_TOOLTIP_MAX_LOCKED];\t\n\tuint32_t  \t\t\t\tnLockedToolTipColor[MICROPROFILE_TOOLTIP_MAX_LOCKED];\t\n\tint \t\t\t\t\tLockedToolTipFront;\n\n\tMicroProfileGroupMenuItem \tGroupMenu[MICROPROFILE_MAX_GROUPS + MICROPROFILE_MAX_CATEGORIES];\n\tuint32_t \t\t\t\t\tGroupMenuCount;\n\n\n\tuint32_t\t\t\t\t\tnCustomActive;\n\tuint32_t\t\t\t\t\tnCustomTimerCount;\n\tuint32_t \t\t\t\t\tnCustomCount;\n\tMicroProfileCustom \t\t\tCustom[MICROPROFILE_CUSTOM_MAX];\n\tuint64_t\t\t\t\t\tCustomTimer[MICROPROFILE_CUSTOM_MAX_TIMERS];\n\t\n\tSOptionDesc Options[MICROPROFILE_OPTION_SIZE];\n\n\tuint32_t nCounterWidth;\n\tuint32_t nLimitWidth;\n\tuint32_t nCounterWidthTemp;\n\tuint32_t nLimitWidthTemp;\n\n\n};\n\nMicroProfileUI g_MicroProfileUI;\n#define UI g_MicroProfileUI\nstatic uint32_t g_nMicroProfileBackColors[2] = {  0x474747, 0x313131 };\n#define MICROPROFILE_NUM_CONTEXT_SWITCH_COLORS 16\nstatic uint32_t g_nMicroProfileContextSwitchThreadColors[MICROPROFILE_NUM_CONTEXT_SWITCH_COLORS] = //palette generated by http://tools.medialab.sciences-po.fr/iwanthue/index.php\n{\n\t0x63607B,\n\t0x755E2B,\n\t0x326A55,\n\t0x523135,\n\t0x904F42,\n\t0x87536B,\n\t0x346875,\n\t0x5E6046,\n\t0x35404C,\n\t0x224038,\n\t0x413D1E,\n\t0x5E3A26,\n\t0x5D6161,\n\t0x4C6234,\n\t0x7D564F,\n\t0x5C4352,\n};\n\n\nvoid MicroProfileInitUI()\n{\n\tstatic bool bInitialized = false;\n\tif(!bInitialized)\n\t{\n\t\tbInitialized = true;\n\t\tmemset(&g_MicroProfileUI, 0, sizeof(g_MicroProfileUI));\n\t\tUI.nActiveMenu = (uint32_t)-1;\n\t\tUI.fDetailedOffsetTarget = UI.fDetailedOffset = 0.f;\n\t\tUI.fDetailedRangeTarget = UI.fDetailedRange = 50.f;\n\n\t\tUI.nOpacityBackground = 0xff<<24;\n\t\tUI.nOpacityForeground = 0xff<<24;\n\n\t\tUI.bShowSpikes = false;\n\n\t\tUI.nWidth = 100;\n\t\tUI.nHeight = 100;\n\n\t\tUI.nCustomActive = (uint32_t)-1;\n\t\tUI.nCustomTimerCount = 0;\n\t\tUI.nCustomCount = 0;\n\n\t\tint nIndex = 0;\n\t\tUI.Options[nIndex++] = SOptionDesc(0xff, 0, \"%s\", \"Reference\");\n\t\tfor(int i = 0; i < MICROPROFILE_NUM_REFERENCE_PRESETS; ++i)\n\t\t{\n\t\t\tUI.Options[nIndex++] = SOptionDesc(0, i, \"  %6.2fms\", g_MicroProfileReferenceTimePresets[i]);\n\t\t}\n\t\tUI.Options[nIndex++] = SOptionDesc(0xff, 0, \"%s\", \"BG Opacity\");\t\t\n\t\tfor(int i = 0; i < MICROPROFILE_NUM_OPACITY_PRESETS; ++i)\n\t\t{\n\t\t\tUI.Options[nIndex++] = SOptionDesc(1, i, \"  %7d%%\", (i+1)*25);\n\t\t}\n\t\tUI.Options[nIndex++] = SOptionDesc(0xff, 0, \"%s\", \"FG Opacity\");\t\t\n\t\tfor(int i = 0; i < MICROPROFILE_NUM_OPACITY_PRESETS; ++i)\n\t\t{\n\t\t\tUI.Options[nIndex++] = SOptionDesc(2, i, \"  %7d%%\", (i+1)*25);\n\t\t}\n\t\tUI.Options[nIndex++] = SOptionDesc(0xff, 0, \"%s\", \"Spike Display\");\t\t\n\t\tUI.Options[nIndex++] = SOptionDesc(3, 0, \"%s\", \"  Enable\");\n\n#if MICROPROFILE_CONTEXT_SWITCH_TRACE\n\t\tUI.Options[nIndex++] = SOptionDesc(0xff, 0, \"%s\", \"CSwitch Trace\");\t\t\n\t\tUI.Options[nIndex++] = SOptionDesc(4, 0, \"%s\", \"  All Threads\");\n\t\tUI.Options[nIndex++] = SOptionDesc(4, 1, \"%s\", \"  No Bars\");\n#endif\n\t\tMP_ASSERT(nIndex == MICROPROFILE_OPTION_SIZE);\n\n\t\tUI.nCounterWidth = 100;\n\t\tUI.nLimitWidth = 100;\n\t\tUI.nCounterWidthTemp = 100;\n\t\tUI.nLimitWidthTemp = 100;\n\n\t}\n}\n\nvoid MicroProfileSetDisplayMode(int nValue)\n{\n\tMicroProfile& S = *MicroProfileGet();\n\tnValue = nValue >= 0 && nValue < MP_DRAW_SIZE ? nValue : S.nDisplay;\n\tS.nDisplay = nValue;\n\tUI.nOffsetY[S.nDisplay] = 0;\n}\n\nvoid MicroProfileToggleDisplayMode()\n{\n\tMicroProfile& S = *MicroProfileGet();\n\tS.nDisplay = (S.nDisplay + 1) % MP_DRAW_SIZE;\n\tUI.nOffsetY[S.nDisplay] = 0;\n}\n\n\nvoid MicroProfileStringArrayClear(MicroProfileStringArray* pArray)\n{\n\tpArray->nNumStrings = 0;\n\tpArray->pBufferPos = &pArray->Buffer[0];\n}\n\nvoid MicroProfileStringArrayAddLiteral(MicroProfileStringArray* pArray, const char* pLiteral)\n{\n\tMP_ASSERT(pArray->nNumStrings < MICROPROFILE_TOOLTIP_MAX_STRINGS);\n\tpArray->ppStrings[pArray->nNumStrings++] = pLiteral;\n}\n\nMICROPROFILE_FORMAT(2, 3) void MicroProfileStringArrayFormat(MicroProfileStringArray* pArray, const char* fmt, ...)\n{\n\tMP_ASSERT(pArray->nNumStrings < MICROPROFILE_TOOLTIP_MAX_STRINGS);\n\tpArray->ppStrings[pArray->nNumStrings++] = pArray->pBufferPos;\n\tva_list args;\n\tva_start (args, fmt);\n\tpArray->pBufferPos += 1 + vsprintf(pArray->pBufferPos, fmt, args);\n\tva_end(args);\n\tMP_ASSERT(pArray->pBufferPos < pArray->Buffer + MICROPROFILE_TOOLTIP_STRING_BUFFER_SIZE);\n}\nvoid MicroProfileStringArrayCopy(MicroProfileStringArray* pDest, MicroProfileStringArray* pSrc)\n{\n\tmemcpy(&pDest->ppStrings[0], &pSrc->ppStrings[0], sizeof(pDest->ppStrings));\n\tmemcpy(&pDest->Buffer[0], &pSrc->Buffer[0], sizeof(pDest->Buffer));\n\tfor(uint32_t i = 0; i < MICROPROFILE_TOOLTIP_MAX_STRINGS; ++i)\n\t{\n\t\tif(i < pSrc->nNumStrings)\n\t\t{\n\t\t\tif(pSrc->ppStrings[i] >= &pSrc->Buffer[0] && pSrc->ppStrings[i] < &pSrc->Buffer[0] + MICROPROFILE_TOOLTIP_STRING_BUFFER_SIZE)\n\t\t\t{\n\t\t\t\tpDest->ppStrings[i] += &pDest->Buffer[0] - &pSrc->Buffer[0];\n\t\t\t}\n\t\t}\n\t}\n\tpDest->nNumStrings = pSrc->nNumStrings;\n}\n\nvoid MicroProfileFloatWindowSize(const char** ppStrings, uint32_t nNumStrings, uint32_t* pColors, uint32_t& nWidth, uint32_t& nHeight, uint32_t* pStringLengths = 0)\n{\n\tuint32_t* nStringLengths = pStringLengths ? pStringLengths : (uint32_t*)alloca(nNumStrings * sizeof(uint32_t));\n\tuint32_t nTextCount = nNumStrings/2;\n\tfor(uint32_t i = 0; i < nTextCount; ++i)\n\t{\n\t\tuint32_t i0 = i * 2;\n\t\tuint32_t s0, s1;\n\t\tnStringLengths[i0] = s0 = (uint32_t)strlen(ppStrings[i0]);\n\t\tnStringLengths[i0+1] = s1 = (uint32_t)strlen(ppStrings[i0+1]);\n\t\tnWidth = MicroProfileMax(s0+s1, nWidth);\n\t}\n\tnWidth = (MICROPROFILE_TEXT_WIDTH+1) * (2+nWidth) + 2 * MICROPROFILE_BORDER_SIZE;\n\tif(pColors)\n\t\tnWidth += MICROPROFILE_TEXT_WIDTH + 1;\n\tnHeight = (MICROPROFILE_TEXT_HEIGHT+1) * nTextCount + 2 * MICROPROFILE_BORDER_SIZE;\n}\n\nvoid MicroProfileDrawFloatWindow(uint32_t nX, uint32_t nY, const char** ppStrings, uint32_t nNumStrings, uint32_t nColor, uint32_t* pColors = 0)\n{\n\tuint32_t nWidth = 0, nHeight = 0;\n\tuint32_t* nStringLengths = (uint32_t*)alloca(nNumStrings * sizeof(uint32_t));\n\tMicroProfileFloatWindowSize(ppStrings, nNumStrings, pColors, nWidth, nHeight, nStringLengths);\n\tuint32_t nTextCount = nNumStrings/2;\n\tif(nX + nWidth > UI.nWidth)\n\t\tnX = UI.nWidth - nWidth;\n\tif(nY + nHeight > UI.nHeight)\n\t\tnY = UI.nHeight - nHeight;\n\tMicroProfileDrawBox(nX-1, nY-1, nX + nWidth+1, nY + nHeight+1, 0xff000000|nColor);\n\tMicroProfileDrawBox(nX, nY, nX + nWidth, nY + nHeight, 0xff000000);\n\tif(pColors)\n\t{\n\t\tnX += MICROPROFILE_TEXT_WIDTH+1;\n\t\tnWidth -= MICROPROFILE_TEXT_WIDTH+1;\n\t}\n\tfor(uint32_t i = 0; i < nTextCount; ++i)\n\t{\n\t\tint i0 = i * 2;\n\t\tif(pColors)\n\t\t{\n\t\t\tMicroProfileDrawBox(nX-MICROPROFILE_TEXT_WIDTH, nY, nX, nY + MICROPROFILE_TEXT_WIDTH, pColors[i]|0xff000000);\n\t\t}\n\t\tMicroProfileDrawText(nX + 1, nY + 1, (uint32_t)-1, ppStrings[i0], (uint32_t)strlen(ppStrings[i0]));\n\t\tMicroProfileDrawText(nX + nWidth - nStringLengths[i0+1] * (MICROPROFILE_TEXT_WIDTH+1), nY + 1, (uint32_t)-1, ppStrings[i0+1], (uint32_t)strlen(ppStrings[i0+1]));\n\t\tnY += (MICROPROFILE_TEXT_HEIGHT+1);\n\t}\n}\n\nvoid MicroProfileDrawTextBackground(uint32_t nX, uint32_t nY, uint32_t nColor, uint32_t nBgColor, const char* pString, uint32_t nStrLen)\n{\n\tuint32_t nWidth = (MICROPROFILE_TEXT_WIDTH + 1) * (nStrLen) + 2 * MICROPROFILE_BORDER_SIZE;\n\tuint32_t nHeight = (MICROPROFILE_TEXT_HEIGHT + 1) ;\n\tMicroProfileDrawBox(nX, nY, nX + nWidth, nY + nHeight, nBgColor);\n\tMicroProfileDrawText(nX, nY, nColor, pString, nStrLen);\n}\n\nvoid MicroProfileToolTipMeta(MicroProfileStringArray* pToolTip)\n{\n\tMicroProfile& S = *MicroProfileGet();\n\tif(UI.nRangeBeginIndex != UI.nRangeEndIndex && UI.pRangeLog)\n\t{\n\t\tuint64_t nMetaSum[MICROPROFILE_META_MAX] = {0};\n\t\tuint64_t nMetaSumInclusive[MICROPROFILE_META_MAX] = {0};\n\t\tint nStackDepth = 0;\n\t\tuint32_t nRange[2][2];\n\t\tMicroProfileThreadLog* pLog = UI.pRangeLog;\n\n\n\t\tMicroProfileGetRange(UI.nRangeEndIndex, UI.nRangeBeginIndex, nRange);\n\t\tfor(uint32_t i = 0; i < 2; ++i)\n\t\t{\n\t\t\tuint32_t nStart = nRange[i][0];\n\t\t\tuint32_t nEnd = nRange[i][1];\n\t\t\tfor(uint32_t j = nStart; j < nEnd; ++j)\n\t\t\t{\n\t\t\t\tMicroProfileLogEntry LE = pLog->Log[j];\n\t\t\t\tuint64_t nType = MicroProfileLogType(LE);\n\t\t\t\tswitch(nType)\n\t\t\t\t{\n\t\t\t\tcase MP_LOG_META:\n\t\t\t\t\t{\n\t\t\t\t\t\tint64_t nMetaIndex = MicroProfileLogTimerIndex(LE);\n\t\t\t\t\t\tint64_t nMetaCount = MicroProfileLogGetTick(LE);\n\t\t\t\t\t\tMP_ASSERT(nMetaIndex < MICROPROFILE_META_MAX);\n\t\t\t\t\t\tif(nStackDepth>1)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tnMetaSumInclusive[nMetaIndex] += nMetaCount;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tnMetaSum[nMetaIndex] += nMetaCount;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase MP_LOG_LEAVE:\n\t\t\t\t\tif(nStackDepth)\n\t\t\t\t\t{\n\t\t\t\t\t\tnStackDepth--;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(int i = 0; i < MICROPROFILE_META_MAX; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tnMetaSumInclusive[i] += nMetaSum[i];\n\t\t\t\t\t\t\tnMetaSum[i] = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase MP_LOG_ENTER:\n\t\t\t\t\tnStackDepth++;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\t\tbool bSpaced = false;\n\t\tfor(int i = 0; i < MICROPROFILE_META_MAX; ++i)\n\t\t{\n\t\t\tif(S.MetaCounters[i].pName && (nMetaSum[i]||nMetaSumInclusive[i]))\n\t\t\t{\n\t\t\t\tif(!bSpaced)\n\t\t\t\t{\n\t\t\t\t\tbSpaced = true;\n\t\t\t\t\tMicroProfileStringArrayAddLiteral(pToolTip, \"\");\n\t\t\t\t\tMicroProfileStringArrayAddLiteral(pToolTip, \"\");\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\tMicroProfileStringArrayFormat(pToolTip, \"%s excl\", S.MetaCounters[i].pName);\n\t\t\t\tMicroProfileStringArrayFormat(pToolTip, \"%5lld\", (long long)nMetaSum[i]);\n\t\t\t\tMicroProfileStringArrayFormat(pToolTip, \"%s incl\", S.MetaCounters[i].pName);\n\t\t\t\tMicroProfileStringArrayFormat(pToolTip, \"%5lld\", (long long)(nMetaSum[i] + nMetaSumInclusive[i]));\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid MicroProfileToolTipLabel(MicroProfileStringArray* pToolTip)\n{\n\tif(UI.nRangeBeginIndex != UI.nRangeEndIndex && UI.pRangeLog)\n\t{\n\t\tbool bSpaced = false;\n\t\tint nStackDepth = 0;\n\t\tuint32_t nRange[2][2];\n\t\tMicroProfileThreadLog* pLog = UI.pRangeLog;\n\n\t\tMicroProfileGetRange(UI.nRangeEndIndex, UI.nRangeBeginIndex, nRange);\n\t\tfor(uint32_t i = 0; i < 2; ++i)\n\t\t{\n\t\t\tuint32_t nStart = nRange[i][0];\n\t\t\tuint32_t nEnd = nRange[i][1];\n\t\t\tfor(uint32_t j = nStart; j < nEnd; ++j)\n\t\t\t{\n\t\t\t\tMicroProfileLogEntry LE = pLog->Log[j];\n\t\t\t\tuint64_t nType = MicroProfileLogType(LE);\n\t\t\t\tswitch(nType)\n\t\t\t\t{\n\t\t\t\tcase MP_LOG_LABEL:\n\t\t\t\t\t{\n\t\t\t\t\t\tif(nStackDepth == 1)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tuint64_t nLabel = MicroProfileLogGetTick(LE);\n\t\t\t\t\t\t\tconst char* pLabelName = MicroProfileGetLabel(nLabel);\n\n\t\t\t\t\t\t\tif (!bSpaced)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tbSpaced = true;\n\t\t\t\t\t\t\t\tMicroProfileStringArrayAddLiteral(pToolTip, \"\");\n\t\t\t\t\t\t\t\tMicroProfileStringArrayAddLiteral(pToolTip, \"\");\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (pToolTip->nNumStrings + 2 <= MICROPROFILE_TOOLTIP_MAX_STRINGS)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tMicroProfileStringArrayAddLiteral(pToolTip, \"Label:\");\n\t\t\t\t\t\t\t\tMicroProfileStringArrayAddLiteral(pToolTip, pLabelName ? pLabelName : \"??\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase MP_LOG_LEAVE:\n\t\t\t\t\tif(nStackDepth)\n\t\t\t\t\t{\n\t\t\t\t\t\tnStackDepth--;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase MP_LOG_ENTER:\n\t\t\t\t\tnStackDepth++;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid MicroProfileDrawFloatTooltip(uint32_t nX, uint32_t nY, uint32_t nToken, uint64_t nTime)\n{\n\tMicroProfile& S = *MicroProfileGet();\n\n\tuint32_t nIndex = MicroProfileGetTimerIndex(nToken);\n\tuint32_t nAggregateFrames = S.nAggregateFrames ? S.nAggregateFrames : 1;\n\tuint32_t nAggregateCount = S.Aggregate[nIndex].nCount ? S.Aggregate[nIndex].nCount : 1;\n\n\tuint32_t nGroupId = MicroProfileGetGroupIndex(nToken);\n\tuint32_t nTimerId = MicroProfileGetTimerIndex(nToken);\n\tbool bGpu = S.GroupInfo[nGroupId].Type == MicroProfileTokenTypeGpu;\n\n\tfloat fToMs = MicroProfileTickToMsMultiplier(bGpu ? MicroProfileTicksPerSecondGpu() : MicroProfileTicksPerSecondCpu());\n\n\tfloat fMs = fToMs * (nTime);\n\tfloat fFrameMs = fToMs * (S.Frame[nIndex].nTicks);\n\tfloat fAverage = fToMs * (S.Aggregate[nIndex].nTicks/nAggregateFrames);\n\tfloat fCallAverage = fToMs * (S.Aggregate[nIndex].nTicks / nAggregateCount);\n\tfloat fMax = fToMs * (S.AggregateMax[nIndex]);\n\tfloat fMin = fToMs * (S.AggregateMin[nIndex]);\n\n\tfloat fFrameMsExclusive = fToMs * (S.FrameExclusive[nIndex]);\n\tfloat fAverageExclusive = fToMs * (S.AggregateExclusive[nIndex]/nAggregateFrames);\n\tfloat fMaxExclusive = fToMs * (S.AggregateMaxExclusive[nIndex]);\n\n\tfloat fGroupAverage = fToMs * (S.AggregateGroup[nGroupId] / nAggregateFrames);\n\tfloat fGroupMax = fToMs * (S.AggregateGroupMax[nGroupId]);\n\tfloat fGroup = fToMs * (S.FrameGroup[nGroupId]);\n\n\n\tMicroProfileStringArray ToolTip;\n\tMicroProfileStringArrayClear(&ToolTip);\n\tconst char* pGroupName = S.GroupInfo[nGroupId].pName;\n\tconst char* pTimerName = S.TimerInfo[nTimerId].pName;\n\tMicroProfileStringArrayAddLiteral(&ToolTip, \"Timer:\");\n\tMicroProfileStringArrayFormat(&ToolTip, \"%s\", pTimerName);\n\n#if MICROPROFILE_DEBUG\n\tMicroProfileStringArrayFormat(&ToolTip,\"0x%p\", UI.nHoverAddressEnter);\n\tMicroProfileStringArrayFormat(&ToolTip,\"0x%p\", UI.nHoverAddressLeave);\n#endif\n\t\n\tif(nTime != (uint64_t)0)\n\t{\n\t\tMicroProfileStringArrayAddLiteral(&ToolTip, \"Time:\");\n\t\tMicroProfileStringArrayFormat(&ToolTip,\"%6.3fms\",  fMs);\n\t\tMicroProfileStringArrayAddLiteral(&ToolTip, \"\");\n\t\tMicroProfileStringArrayAddLiteral(&ToolTip, \"\");\n\t}\n\n\tMicroProfileStringArrayAddLiteral(&ToolTip, \"Frame Time:\");\n\tMicroProfileStringArrayFormat(&ToolTip,\"%6.3fms\",  fFrameMs);\n\n\tMicroProfileStringArrayAddLiteral(&ToolTip, \"Average:\");\n\tMicroProfileStringArrayFormat(&ToolTip,\"%6.3fms\",  fAverage);\n\n\tMicroProfileStringArrayAddLiteral(&ToolTip, \"Max:\");\n\tMicroProfileStringArrayFormat(&ToolTip,\"%6.3fms\",  fMax);\n\t\n\tMicroProfileStringArrayAddLiteral(&ToolTip, \"Min:\");\n\tMicroProfileStringArrayFormat(&ToolTip, \"%6.3fms\", fMin);\n\n\tMicroProfileStringArrayAddLiteral(&ToolTip, \"\");\n\tMicroProfileStringArrayAddLiteral(&ToolTip, \"\");\n\n\tMicroProfileStringArrayAddLiteral(&ToolTip, \"Call Average:\");\n\tMicroProfileStringArrayFormat(&ToolTip,\"%6.3fms\",  fCallAverage);\n\n\tMicroProfileStringArrayAddLiteral(&ToolTip, \"Call Count:\");\n\tMicroProfileStringArrayFormat(&ToolTip, \"%6.2f\",  double(nAggregateCount) / nAggregateFrames);\n\n\tMicroProfileStringArrayAddLiteral(&ToolTip, \"\");\n\tMicroProfileStringArrayAddLiteral(&ToolTip, \"\");\n\n\tMicroProfileStringArrayAddLiteral(&ToolTip, \"Exclusive Frame Time:\");\n\tMicroProfileStringArrayFormat(&ToolTip, \"%6.3fms\",  fFrameMsExclusive);\n\n\tMicroProfileStringArrayAddLiteral(&ToolTip, \"Exclusive Average:\");\n\tMicroProfileStringArrayFormat(&ToolTip, \"%6.3fms\",  fAverageExclusive);\n\n\tMicroProfileStringArrayAddLiteral(&ToolTip, \"Exclusive Max:\");\n\tMicroProfileStringArrayFormat(&ToolTip, \"%6.3fms\",  fMaxExclusive);\n\n\tMicroProfileStringArrayAddLiteral(&ToolTip, \"\");\n\tMicroProfileStringArrayAddLiteral(&ToolTip, \"\");\n\t\n\tMicroProfileStringArrayAddLiteral(&ToolTip, \"Group:\");\n\tMicroProfileStringArrayFormat(&ToolTip, \"%s\", pGroupName);\n\tMicroProfileStringArrayAddLiteral(&ToolTip, \"Frame Time:\");\n\tMicroProfileStringArrayFormat(&ToolTip, \"%6.3f\", fGroup);\n\tMicroProfileStringArrayAddLiteral(&ToolTip, \"Frame Average:\");\n\tMicroProfileStringArrayFormat(&ToolTip, \"%6.3f\", fGroupAverage);\n\tMicroProfileStringArrayAddLiteral(&ToolTip, \"Frame Max:\");\n\tMicroProfileStringArrayFormat(&ToolTip, \"%6.3f\", fGroupMax);\n\n\n\n\n\tMicroProfileToolTipMeta(&ToolTip);\n\tMicroProfileToolTipLabel(&ToolTip);\n\n\n\tMicroProfileDrawFloatWindow(nX, nY+20, &ToolTip.ppStrings[0], ToolTip.nNumStrings, S.TimerInfo[nTimerId].nColor);\n\n\tif(UI.nMouseLeftMod)\n\t{\n\t\tint nIndex = (g_MicroProfileUI.LockedToolTipFront + MICROPROFILE_TOOLTIP_MAX_LOCKED - 1) % MICROPROFILE_TOOLTIP_MAX_LOCKED;\n\t\tg_MicroProfileUI.nLockedToolTipColor[nIndex] = S.TimerInfo[nTimerId].nColor;\n\t\tMicroProfileStringArrayCopy(&g_MicroProfileUI.LockedToolTips[nIndex], &ToolTip);\n\t\tg_MicroProfileUI.LockedToolTipFront = nIndex;\n\n\t}\n}\n\nint64_t MicroProfileGetGpuTickSync(int64_t nTickCpu, int64_t nTickGpu)\n{\n\tif(UI.nTickReferenceCpu && UI.nTickReferenceGpu)\n\t{\n\t\tint64_t nTicksPerSecondCpu = MicroProfileTicksPerSecondCpu();\n\t\tint64_t nTicksPerSecondGpu = MicroProfileTicksPerSecondGpu();\n\n\t\treturn (nTickCpu - UI.nTickReferenceCpu) * int64_t(double(nTicksPerSecondGpu) / double(nTicksPerSecondCpu)) + UI.nTickReferenceGpu;\n\t}\n\telse\n\t{\n\t\treturn nTickGpu;\n\t}\n}\n\nvoid MicroProfileZoomTo(int64_t nTickStart, int64_t nTickEnd, MicroProfileTokenType eToken)\n{\n\tMicroProfile& S = *MicroProfileGet();\n\n\tbool bGpu = eToken == MicroProfileTokenTypeGpu;\n\tint64_t nStartCpu = S.Frames[S.nFrameCurrent].nFrameStartCpu;\n\tint64_t nStart = bGpu ? MicroProfileGetGpuTickSync(nStartCpu, S.Frames[S.nFrameCurrent].nFrameStartGpu) : nStartCpu;\n\tuint64_t nFrequency = bGpu ? MicroProfileTicksPerSecondGpu() : MicroProfileTicksPerSecondCpu();\n\n\tfloat fToMs = MicroProfileTickToMsMultiplier(nFrequency);\n\tUI.fDetailedOffsetTarget = MicroProfileLogTickDifference(nStart, nTickStart) * fToMs;\n\tUI.fDetailedRangeTarget = MicroProfileMax(MicroProfileLogTickDifference(nTickStart, nTickEnd) * fToMs, 0.01f); // clamp to 10us\n}\n\nvoid MicroProfileCenter(int64_t nTickCenter)\n{\n\tMicroProfile& S = *MicroProfileGet();\n\tint64_t nStart = S.Frames[S.nFrameCurrent].nFrameStartCpu;\n\tfloat fToMs = MicroProfileTickToMsMultiplier(MicroProfileTicksPerSecondCpu());\n\tfloat fCenter = MicroProfileLogTickDifference(nStart, nTickCenter) * fToMs;\n\tUI.fDetailedOffsetTarget = UI.fDetailedOffset = fCenter - 0.5f * UI.fDetailedRange;\n}\n\n#if MICROPROFILE_DEBUG\nuint64_t* g_pMicroProfileDumpStart = 0;\nuint64_t* g_pMicroProfileDumpEnd = 0;\nvoid MicroProfileDebugDumpRange()\n{\n\tMicroProfile& S = *MicroProfileGet();\n\tif(g_pMicroProfileDumpStart != g_pMicroProfileDumpEnd)\n\t{\n\t\tuint64_t* pStart = g_pMicroProfileDumpStart;\n\t\tuint64_t* pEnd = g_pMicroProfileDumpEnd;\n\t\twhile(pStart != pEnd)\n\t\t{\n\t\t\tuint64_t nTick = MicroProfileLogGetTick(*pStart);\n\t\t\tuint64_t nToken = MicroProfileLogTimerIndex(*pStart);\n\t\t\tuint32_t nTimerId = MicroProfileGetTimerIndex(nToken);\n\t\n\t\t\tconst char* pTimerName = S.TimerInfo[nTimerId].pName;\n\t\t\tchar buffer[256];\n\t\t\tuint64_t type = MicroProfileLogType(*pStart);\n\n\t\t\tconst char* pBegin = type == MP_LOG_LEAVE ? \"END\" : \n\t\t\t\t(type == MP_LOG_ENTER ? \"BEGIN\" : \"META\");\n\t\t\tsnprintf(buffer, 255, \"DUMP 0x%p: %s :: %\" PRIx64 \": %s\\n\", pStart, pBegin,  nTick, pTimerName);\n#ifdef _WIN32\n\t\t\tOutputDebugString(buffer);\n#else\n\t\t\tprintf(\"%s\", buffer);\n#endif\n\t\t\tpStart++;\n\t\t}\n\n\t\tg_pMicroProfileDumpStart = g_pMicroProfileDumpEnd;\n\t}\n}\n#define MP_DEBUG_DUMP_RANGE() MicroProfileDebugDumpRange()\n#else\n#define MP_DEBUG_DUMP_RANGE() do{} while(0)\n#endif\n\n#define MICROPROFILE_HOVER_DIST 0.5f\n\nvoid MicroProfileDrawDetailedContextSwitchBars(uint32_t nY, uint32_t nThreadId, uint32_t nContextSwitchStart, uint32_t nContextSwitchEnd, int64_t nBaseTicks, uint32_t nBaseY)\n{\n\tMicroProfile& S = *MicroProfileGet();\n\tint64_t nTickIn = -1;\n\tuint32_t nThreadBefore = -1;\n\tfloat fToMs = MicroProfileTickToMsMultiplier(MicroProfileTicksPerSecondCpu());\n\tfloat fMsToScreen = UI.nWidth / UI.fDetailedRange;\n\tfloat fMouseX = (float)UI.nMouseX;\n\tfloat fMouseY = (float)UI.nMouseY;\n\n\tint nLineDrawn = -1;\n\n\tfor(uint32_t j = nContextSwitchStart; j != nContextSwitchEnd; j = (j+1) % MICROPROFILE_CONTEXT_SWITCH_BUFFER_SIZE)\n\t{\n\t\tMP_ASSERT(j < MICROPROFILE_CONTEXT_SWITCH_BUFFER_SIZE);\n\t\tMicroProfileContextSwitch CS = S.ContextSwitch[j];\n\n\t\tif(nTickIn == -1)\n\t\t{\n\t\t\tif(CS.nThreadIn == nThreadId)\n\t\t\t{\n\t\t\t\tnTickIn = CS.nTicks;\n\t\t\t\tnThreadBefore = CS.nThreadOut;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(CS.nThreadOut == nThreadId)\n\t\t\t{\n\t\t\t\tint64_t nTickOut = CS.nTicks;\n\t\t\t\tfloat fMsStart = fToMs * MicroProfileLogTickDifference(nBaseTicks, nTickIn);\n\t\t\t\tfloat fMsEnd = fToMs * MicroProfileLogTickDifference(nBaseTicks, nTickOut);\n\t\t\t\tif(fMsStart <= fMsEnd)\n\t\t\t\t{\n\t\t\t\t\tfloat fXStart = fMsStart * fMsToScreen;\n\t\t\t\t\tfloat fXEnd = fMsEnd * fMsToScreen;\n\t\t\t\t\tfloat fYStart = (float)nY;\n\t\t\t\t\tfloat fYEnd = fYStart + (MICROPROFILE_DETAILED_CONTEXT_SWITCH_HEIGHT);\n\t\t\t\t\tuint32_t nColor = g_nMicroProfileContextSwitchThreadColors[CS.nCpu%MICROPROFILE_NUM_CONTEXT_SWITCH_COLORS];\n\t\t\t\t\tfloat fXDist = MicroProfileMax(fXStart - fMouseX, fMouseX - fXEnd);\n\t\t\t\t\tbool bHover = fXDist < MICROPROFILE_HOVER_DIST && fYStart <= fMouseY && fMouseY <= fYEnd && nBaseY < fMouseY;\n\t\t\t\t\tif(bHover)\n\t\t\t\t\t{\n\t\t\t\t\t\tUI.nRangeBegin = nTickIn;\n\t\t\t\t\t\tUI.nRangeEnd = nTickOut;\n\t\t\t\t\t\tS.nContextSwitchHoverTickIn = nTickIn;\n\t\t\t\t\t\tS.nContextSwitchHoverTickOut = nTickOut;\n\t\t\t\t\t\tS.nContextSwitchHoverThread = CS.nThreadOut;\n\t\t\t\t\t\tS.nContextSwitchHoverThreadBefore = nThreadBefore;\n\t\t\t\t\t\tS.nContextSwitchHoverThreadAfter = CS.nThreadIn;\n\t\t\t\t\t\tS.nContextSwitchHoverCpuNext = CS.nCpu;\n\t\t\t\t\t\tnColor = UI.nHoverColor;\n\t\t\t\t\t}\n\t\t\t\t\tif(CS.nCpu == S.nContextSwitchHoverCpu)\n\t\t\t\t\t{\n\t\t\t\t\t\tnColor = UI.nHoverColorShared;\n\t\t\t\t\t}\n\n\t\t\t\t\tuint32_t nIntegerWidth = (uint32_t)(fXEnd - fXStart);\n\t\t\t\t\tif(nIntegerWidth)\n\t\t\t\t\t{\n\t\t\t\t\t\tMicroProfileDrawBox((int)fXStart, (int)fYStart, (int)fXEnd, (int)fYEnd, nColor|UI.nOpacityForeground, MicroProfileBoxTypeFlat);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tfloat fXAvg = 0.5f * (fXStart + fXEnd);\n\t\t\t\t\t\tint nLineX = (int)floor(fXAvg+0.5f);\n\n\t\t\t\t\t\tif(nLineDrawn != nLineX)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tnLineDrawn = nLineX;\n\t\t\t\t\t\t\tMicroProfileDrawLineVertical(nLineX, (int)(fYStart + 0.5f), (int)(fYEnd + 0.5f), nColor|UI.nOpacityForeground);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tnTickIn = -1;\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid MicroProfileWriteThreadHeader(uint32_t nY, MicroProfileThreadIdType ThreadId, const char* pNamedThread, const char* pThreadModule)\n{\n\tchar Buffer[512];\n\tint nStrLen = 0;\n\tif(pThreadModule)\n\t{\n\t\tnStrLen = snprintf(Buffer, sizeof(Buffer) - 1, \"%04x: %s [%s]\", (uint32_t)ThreadId, pNamedThread ? pNamedThread : \"\", pThreadModule);\n\t}\n\telse\n\t{\n\t\tnStrLen = snprintf(Buffer, sizeof(Buffer) - 1, \"%04x: %s\", (uint32_t)ThreadId, pNamedThread ? pNamedThread : \"\");\n\t}\n\tMicroProfileDrawTextBackground(10, nY, 0xffffff, 0x88777777, Buffer, nStrLen);\n}\n\nuint32_t MicroProfileWriteProcessHeader(uint32_t nY, uint32_t nProcessId)\n{\n\tchar Name[256];\n\tconst char* pProcessName = MicroProfileGetProcessName(nProcessId, Name, sizeof(Name));\n\n\tchar Buffer[512];\n\tnY += MICROPROFILE_TEXT_HEIGHT + 1;\n\tint nStrLen = 0;\n\tif(pProcessName)\n\t{\n\t\tnStrLen = snprintf(Buffer, sizeof(Buffer) - 1, \"* %04x: %s\", nProcessId, pProcessName);\n\t}\n\telse\n\t{\n\t\tnStrLen = snprintf(Buffer, sizeof(Buffer) - 1, \"* %04x\", nProcessId);\n\t}\n\tMicroProfileDrawTextBackground(0, nY, 0xffffff, 0x88777777, Buffer, nStrLen);\n\tnY += MICROPROFILE_TEXT_HEIGHT + 1;\n\treturn nY;\n}\n\nvoid MicroProfileGetFrameRange(int64_t nTicks, int64_t nTicksEnd, int32_t nLogIndex, uint32_t* nFrameBegin, uint32_t* nFrameEnd)\n{\n\tMicroProfile& S = *MicroProfileGet();\n\n\tbool bGpu = (nLogIndex >= 0) ? S.Pool[nLogIndex]->nGpu != 0 : false;\n\tuint32_t nPut = (nLogIndex >= 0) ? S.Pool[nLogIndex]->nPut.load(std::memory_order_relaxed) : 0;\n\n\tuint32_t nBegin = S.nFrameCurrent;\n\n\tfor(uint32_t i = 0; i < MICROPROFILE_MAX_FRAME_HISTORY - MICROPROFILE_GPU_FRAME_DELAY; ++i)\n\t{\n\t\tuint32_t nFrame = (S.nFrameCurrent + MICROPROFILE_MAX_FRAME_HISTORY - i) % MICROPROFILE_MAX_FRAME_HISTORY;\n\n\t\tif(nLogIndex >= 0)\n\t\t{\n\t\t\tuint32_t nCurrStart = S.Frames[nBegin].nLogStart[nLogIndex];\n\t\t\tuint32_t nPrevStart = S.Frames[nFrame].nLogStart[nLogIndex];\n\t\t\tbool bOverflow = (nPrevStart <= nCurrStart) ? (nPut >= nPrevStart && nPut < nCurrStart) : (nPut < nCurrStart || nPut >= nPrevStart);\n\t\t\tif(bOverflow)\n\t\t\t\tbreak;\n\t\t}\n\n\t\tnBegin = nFrame;\n\t\tif((bGpu ? S.Frames[nBegin].nFrameStartGpu : S.Frames[nBegin].nFrameStartCpu) <= nTicks)\n\t\t\tbreak;\n\t}\n\n\tuint32_t nEnd = nBegin;\n\n\twhile (nEnd != S.nFrameCurrent)\n\t{\n\t\tnEnd = (nEnd + 1) % MICROPROFILE_MAX_FRAME_HISTORY;\n\t\tif((bGpu ? S.Frames[nEnd].nFrameStartGpu : S.Frames[nEnd].nFrameStartCpu) >= nTicksEnd)\n\t\t\tbreak;\n\t}\n\n\t*nFrameBegin = nBegin;\n\t*nFrameEnd = nEnd;\n}\n\nvoid MicroProfileDrawDetailedBars(uint32_t nWidth, uint32_t nHeight, int nBaseY, int nSelectedFrame)\n{\n\tMicroProfile& S = *MicroProfileGet();\n\tMP_DEBUG_DUMP_RANGE();\n\tint nY = nBaseY - UI.nOffsetY[MP_DRAW_DETAILED];\n\tint64_t nNumBoxes = 0;\n\tint64_t nNumLines = 0;\n\n\tUI.nRangeBegin = 0; \n\tUI.nRangeEnd = 0;\n\tUI.nRangeBeginGpu = 0;\n\tUI.nRangeEndGpu = 0;\n\tUI.nRangeBeginIndex = UI.nRangeEndIndex = 0;\n\tUI.pRangeLog = 0;\n\n\tint64_t nFrameStartCpu = S.Frames[S.nFrameCurrent].nFrameStartCpu;\n\tint64_t nFrameStartGpu = S.Frames[S.nFrameCurrent].nFrameStartGpu;\n\tint64_t nTicksPerSecondCpu = MicroProfileTicksPerSecondCpu();\n\tint64_t nTicksPerSecondGpu = MicroProfileTicksPerSecondGpu();\n\tfloat fToMsCpu = MicroProfileTickToMsMultiplier(nTicksPerSecondCpu);\n\tfloat fToMsGpu = MicroProfileTickToMsMultiplier(nTicksPerSecondGpu);\n\n\tif(!S.nRunning && UI.nTickReferenceCpu < nFrameStartCpu)\n\t{\n\t\tint64_t nRefCpu = 0, nRefGpu = 0;\n\t\tif(MicroProfileGetGpuTickReference(&nRefCpu, &nRefGpu))\n\t\t{\n\t\t\tUI.nTickReferenceCpu = nRefCpu;\n\t\t\tUI.nTickReferenceGpu = nRefGpu;\n\t\t}\n\t}\n\n\tfloat fDetailedOffset = UI.fDetailedOffset;\n\tfloat fDetailedRange = UI.fDetailedRange;\n\n\tint64_t nDetailedOffsetTicksCpu = MicroProfileMsToTick(fDetailedOffset, MicroProfileTicksPerSecondCpu());\n\tint64_t nDetailedOffsetTicksGpu = MicroProfileMsToTick(fDetailedOffset, MicroProfileTicksPerSecondGpu());\n\tint64_t nBaseTicksCpu = nDetailedOffsetTicksCpu + nFrameStartCpu;\n\tint64_t nBaseTicksGpu = MicroProfileGetGpuTickSync(nBaseTicksCpu, nDetailedOffsetTicksGpu + nFrameStartGpu);\n\tint64_t nBaseTicksEndCpu = nBaseTicksCpu + MicroProfileMsToTick(fDetailedRange, MicroProfileTicksPerSecondCpu());\n\tint64_t nBaseTicksEndGpu = nBaseTicksGpu + MicroProfileMsToTick(fDetailedRange, MicroProfileTicksPerSecondGpu());\n\n\tuint32_t nFrameBegin, nFrameEnd;\n\tMicroProfileGetFrameRange(nBaseTicksCpu, nBaseTicksEndCpu, -1, &nFrameBegin, &nFrameEnd);\n\n\tfloat fMsBase = fToMsCpu * nDetailedOffsetTicksCpu;\n\tfloat fMs = fDetailedRange;\n\tfloat fMsEnd = fMs + fMsBase;\n\tfloat fWidth = (float)nWidth;\n\tfloat fMsToScreen = fWidth / fMs;\n\n\tfor(uint32_t i = nFrameBegin; i != nFrameEnd; i = (i+1) % MICROPROFILE_MAX_FRAME_HISTORY)\n\t{\n\t\tuint64_t nTickStart = S.Frames[i].nFrameStartCpu;\n\t\tfloat fMsStart = fToMsCpu * MicroProfileLogTickDifference(nBaseTicksCpu, nTickStart);\n\t\tfloat fXStart = fMsStart * fMsToScreen;\n\n\t\tMicroProfileDrawLineVertical((int)fXStart, nBaseY, nBaseY + nHeight, UI.nOpacityForeground | 0xbbbbbb);\n\t}\n\n\t{\n\t\tfloat fRate = floor(2*(log10(fMs)-1))/2;\n\t\tfloat fStep = powf(10.f, fRate);\n\t\tfloat fRcpStep = 1.f / fStep;\n\t\tint nColorIndex = (int)(floor(fMsBase*fRcpStep));\n\t\tfloat fStart = floor(fMsBase*fRcpStep) * fStep;\n\n\t\tchar StepLabel[64] = \"\";\n\t\tif(fStep >= 0.005 && fStep <= 1000)\n\t\t{\n\t\t\tif(fStep >= 1)\n\t\t\t\tsprintf(StepLabel, \"%.3gms\", fStep);\n\t\t\telse\n\t\t\t\tsprintf(StepLabel, \"%.2fms\", fStep);\n\t\t}\n\n\t\tuint32_t nStepLabelLength = (uint32_t)strlen(StepLabel);\n\t\tfloat fStepLabelOffset = (fStep*fMsToScreen-nStepLabelLength*(MICROPROFILE_TEXT_WIDTH+1))/2;\n\n\t\tfor(float f = fStart; f < fMsEnd; )\n\t\t{\n\t\t\tfloat fStart = f;\n\t\t\tfloat fNext = f + fStep;\n\t\t\tMicroProfileDrawBox((int)((fStart-fMsBase) * fMsToScreen), nBaseY, (int)((fNext-fMsBase) * fMsToScreen+1), nBaseY + nHeight, UI.nOpacityBackground | g_nMicroProfileBackColors[nColorIndex++ & 1]);\n\n\t\t\tif(nStepLabelLength)\n\t\t\t\tMicroProfileDrawText((int)((fStart-fMsBase) * fMsToScreen + fStepLabelOffset), nBaseY, UI.nOpacityForeground | 0x808080, StepLabel, nStepLabelLength);\n\n\t\t\tf = fNext;\n\t\t}\n\t}\n\n\tnY += MICROPROFILE_TEXT_HEIGHT+1;\n\tMicroProfileLogEntry* pMouseOver = UI.pDisplayMouseOver;\n\tMicroProfileLogEntry* pMouseOverNext = 0;\n\tuint64_t nMouseOverToken = pMouseOver ? MicroProfileLogTimerIndex(*pMouseOver) : MICROPROFILE_INVALID_TOKEN;\n\tfloat fMouseX = (float)UI.nMouseX;\n\tfloat fMouseY = (float)UI.nMouseY;\n\tuint64_t nHoverToken = MICROPROFILE_INVALID_TOKEN;\n\tint64_t nHoverTime = 0;\n\n\tstatic int nHoverCounter = 155;\n\tstatic int nHoverCounterDelta = 10;\n\tnHoverCounter += nHoverCounterDelta;\n\tif(nHoverCounter >= 245)\n\t\tnHoverCounterDelta = -10;\n\telse if(nHoverCounter < 100)\n\t\tnHoverCounterDelta = 10;\n\tUI.nHoverColor = (nHoverCounter<<24)|(nHoverCounter<<16)|(nHoverCounter<<8)|nHoverCounter;\n\tuint32_t nHoverCounterShared = nHoverCounter>>2;\n\tUI.nHoverColorShared = (nHoverCounterShared<<24)|(nHoverCounterShared<<16)|(nHoverCounterShared<<8)|nHoverCounterShared;\n\n\tuint32_t nLinesDrawn[MICROPROFILE_STACK_MAX]={0};\n\n\tS.nContextSwitchHoverThread = S.nContextSwitchHoverThreadAfter = S.nContextSwitchHoverThreadBefore = -1;\n\n\tuint32_t nContextSwitchStart = -1;\n\tuint32_t nContextSwitchEnd = -1;\n\tS.nContextSwitchHoverCpuNext = 0xff;\n\tS.nContextSwitchHoverTickIn = -1;\n\tS.nContextSwitchHoverTickOut = -1;\n\tif(S.bContextSwitchRunning)\n\t{\n\t\tMicroProfileContextSwitchSearch(&nContextSwitchStart, &nContextSwitchEnd, nBaseTicksCpu, nBaseTicksEndCpu);\n\t}\n\n\tuint64_t nActiveGroup = S.nAllGroupsWanted ? S.nGroupMask : S.nActiveGroupWanted;\n\n\tbool bSkipBarView = S.bContextSwitchRunning && S.bContextSwitchNoBars;\n\n\tif(!bSkipBarView)\n\t{\n\t\tfor(uint32_t i = 0; i < MICROPROFILE_MAX_THREADS; ++i)\n\t\t{\n\t\t\tMicroProfileThreadLog* pLog = S.Pool[i];\n\t\t\tif(!pLog)\n\t\t\t\tcontinue;\n\n\t\t\tbool bGpu = pLog->nGpu != 0;\n\t\t\tfloat fToMs = bGpu ? fToMsGpu : fToMsCpu;\n\t\t\tint64_t nBaseTicks = bGpu ? nBaseTicksGpu : nBaseTicksCpu;\n\t\t\tint64_t nBaseTicksEnd = bGpu ? nBaseTicksEndGpu : nBaseTicksEndCpu;\n\t\t\tMicroProfileThreadIdType nThreadId = pLog->nThreadId;\n\n\t\t\tint64_t nGapTime = (bGpu ? MicroProfileTicksPerSecondGpu() : MicroProfileTicksPerSecondCpu()) * MICROPROFILE_GAP_TIME / 1000;\n\n\t\t\tuint32_t nLogFrameBegin, nLogFrameEnd;\n\t\t\tMicroProfileGetFrameRange(nBaseTicks - nGapTime, nBaseTicksEnd + nGapTime, i, &nLogFrameBegin, &nLogFrameEnd);\n\n\t\t\tuint32_t nGet = S.Frames[nLogFrameBegin].nLogStart[i];\n\t\t\tuint32_t nPut = nLogFrameEnd == S.nFrameCurrent ? pLog->nPut.load(std::memory_order_relaxed) : S.Frames[nLogFrameEnd].nLogStart[i];\n\t\t\tif(nPut == nGet)\n\t\t\t\tcontinue;\n\n\t\t\tuint32_t nRange[2][2] = { {0, 0}, {0, 0}, };\n\t\t\tMicroProfileGetRange(nPut, nGet, nRange);\n\n\t\t\tuint32_t nMaxStackDepth = 0;\n\n\t\t\tnY += 3;\n\t\t\tMicroProfileWriteThreadHeader(nY, nThreadId, &pLog->ThreadName[0], nullptr);\n\t\t\tnY += 3;\n\t\t\tnY += MICROPROFILE_TEXT_HEIGHT + 1;\n\n\t\t\tif(S.bContextSwitchRunning)\n\t\t\t{\n\t\t\t\tMicroProfileDrawDetailedContextSwitchBars(nY, pLog->nThreadId, nContextSwitchStart, nContextSwitchEnd, nBaseTicks, nBaseY);\n\t\t\t\tnY -= MICROPROFILE_DETAILED_BAR_HEIGHT;\n\t\t\t\tnY += MICROPROFILE_DETAILED_CONTEXT_SWITCH_HEIGHT+1;\n\t\t\t}\n\n\t\t\tuint32_t nYDelta = MICROPROFILE_DETAILED_BAR_HEIGHT;\n\t\t\tuint32_t nStack[MICROPROFILE_STACK_MAX];\n\t\t\tuint32_t nStackPos = 0;\n\t\t\tfor(uint32_t j = 0; j < 2; ++j)\n\t\t\t{\n\t\t\t\tuint32_t nStart = nRange[j][0];\n\t\t\t\tuint32_t nEnd = nRange[j][1];\n\t\t\t\tfor(uint32_t k = nStart; k < nEnd; ++k)\n\t\t\t\t{\n\t\t\t\t\tMicroProfileLogEntry* pEntry = pLog->Log + k;\n\t\t\t\t\tuint64_t nType = MicroProfileLogType(*pEntry);\n\t\t\t\t\tif(MP_LOG_ENTER == nType)\n\t\t\t\t\t{\n\t\t\t\t\t\tMP_ASSERT(nStackPos < MICROPROFILE_STACK_MAX);\n\t\t\t\t\t\tnStack[nStackPos++] = k;\n\t\t\t\t\t}\n\t\t\t\t\telse if(MP_LOG_META == nType)\n\t\t\t\t\t{\n\n\t\t\t\t\t}\n\t\t\t\t\telse if(MP_LOG_LEAVE == nType)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(0 == nStackPos)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tMicroProfileLogEntry* pEntryEnter = pLog->Log + nStack[nStackPos-1];\n\t\t\t\t\t\tif(MicroProfileLogTimerIndex(*pEntryEnter) != MicroProfileLogTimerIndex(*pEntry))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t//uprintf(\"mismatch %llx %llx\\n\", pEntryEnter->nToken, pEntry->nToken);\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tint64_t nTickStart = MicroProfileLogGetTick(*pEntryEnter);\n\t\t\t\t\t\tint64_t nTickEnd = MicroProfileLogGetTick(*pEntry);\n\t\t\t\t\t\tuint64_t nTimerIndex = MicroProfileLogTimerIndex(*pEntry);\n\t\t\t\t\t\tuint32_t nColor = S.TimerInfo[nTimerIndex].nColor;\n\t\t\t\t\t\tif(!(nActiveGroup & (1ull << S.TimerInfo[nTimerIndex].nGroupIndex)))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tnStackPos--;\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(nMouseOverToken == nTimerIndex)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif(pEntry == pMouseOver)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tnColor = UI.nHoverColor;\n\t\t\t\t\t\t\t\tif(bGpu)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tUI.nRangeBeginGpu = *pEntryEnter;\n\t\t\t\t\t\t\t\t\tUI.nRangeEndGpu = *pEntry;\n\t\t\t\t\t\t\t\t\tuint32_t nCpuBegin = (nStack[nStackPos-1] + 1) % MICROPROFILE_BUFFER_SIZE;\n\t\t\t\t\t\t\t\t\tuint32_t nCpuEnd = (k + 1) % MICROPROFILE_BUFFER_SIZE;\n\t\t\t\t\t\t\t\t\tMicroProfileLogEntry LogCpuBegin = pLog->Log[nCpuBegin];\n\t\t\t\t\t\t\t\t\tMicroProfileLogEntry LogCpuEnd = pLog->Log[nCpuEnd];\n\t\t\t\t\t\t\t\t\tif(MicroProfileLogType(LogCpuBegin) == MP_LOG_GPU_EXTRA && MicroProfileLogType(LogCpuEnd) == MP_LOG_GPU_EXTRA)\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tUI.nRangeBegin = LogCpuBegin;\n\t\t\t\t\t\t\t\t\t\tUI.nRangeEnd = LogCpuEnd;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tUI.nRangeBeginIndex = nStack[nStackPos-1];\n\t\t\t\t\t\t\t\t\tUI.nRangeEndIndex = k;\n\t\t\t\t\t\t\t\t\tUI.pRangeLog = pLog;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tUI.nRangeBegin = *pEntryEnter;\n\t\t\t\t\t\t\t\t\tUI.nRangeEnd = *pEntry;\n\t\t\t\t\t\t\t\t\tUI.nRangeBeginIndex = nStack[nStackPos-1];\n\t\t\t\t\t\t\t\t\tUI.nRangeEndIndex = k;\n\t\t\t\t\t\t\t\t\tUI.pRangeLog = pLog;\n\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tnColor = UI.nHoverColorShared;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst char* pName = S.TimerInfo[nTimerIndex].pName;\n\t\t\t\t\t\tuint32_t nNameLen = S.TimerInfo[nTimerIndex].nNameLen;\n\n\t\t\t\t\t\tif (pName[0] == '$' && pEntryEnter < pEntry && MicroProfileLogType(pEntryEnter[1 + bGpu]) == MP_LOG_LABEL)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tconst char* pLabel = MicroProfileGetLabel(MicroProfileLogGetTick(pEntryEnter[1 + bGpu]));\n\n\t\t\t\t\t\t\tif (pLabel)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpName = pLabel;\n\t\t\t\t\t\t\t\tnNameLen = (uint32_t)strlen(pLabel);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tnMaxStackDepth = MicroProfileMax(nMaxStackDepth, nStackPos);\n\t\t\t\t\t\tfloat fMsStart = fToMs * MicroProfileLogTickDifference(nBaseTicks, nTickStart);\n\t\t\t\t\t\tfloat fMsEnd = fToMs * MicroProfileLogTickDifference(nBaseTicks, nTickEnd);\n\t\t\t\t\t\tfloat fXStart = fMsStart * fMsToScreen;\n\t\t\t\t\t\tfloat fXEnd = fMsEnd * fMsToScreen;\n\t\t\t\t\t\tfloat fYStart = (float)(nY + nStackPos * nYDelta);\n\t\t\t\t\t\tfloat fYEnd = fYStart + (MICROPROFILE_DETAILED_BAR_HEIGHT);\n\t\t\t\t\t\tfloat fXDist = MicroProfileMax(fXStart - fMouseX, fMouseX - fXEnd);\n\t\t\t\t\t\tbool bHover = fXDist < MICROPROFILE_HOVER_DIST && fYStart <= fMouseY && fMouseY <= fYEnd && nBaseY < fMouseY;\n\t\t\t\t\t\tuint32_t nIntegerWidth = (uint32_t)(fXEnd - fXStart);\n\t\t\t\t\t\tif(nIntegerWidth)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif(bHover && UI.nActiveMenu == (uint32_t)-1)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tnHoverToken = MicroProfileLogTimerIndex(*pEntry);\n\t#if MICROPROFILE_DEBUG\n\t\t\t\t\t\t\t\tUI.nHoverAddressEnter = (uint64_t)pEntryEnter;\n\t\t\t\t\t\t\t\tUI.nHoverAddressLeave = (uint64_t)pEntry;\n\t#endif\n\t\t\t\t\t\t\t\tnHoverTime = MicroProfileLogTickDifference(nTickStart, nTickEnd);\n\t\t\t\t\t\t\t\tpMouseOverNext = pEntry;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tMicroProfileDrawBox((int)fXStart, (int)fYStart, (int)fXEnd, (int)fYEnd, nColor|UI.nOpacityForeground, MicroProfileBoxTypeBar);\n#if MICROPROFILE_DETAILED_BAR_NAMES\n\t\t\t\t\t\t\tif(nIntegerWidth>3*MICROPROFILE_TEXT_WIDTH)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfloat fXStartText = MicroProfileMax(fXStart, 0.f);\n\t\t\t\t\t\t\t\tint nTextWidth = (int)(fXEnd - fXStartText);\n\t\t\t\t\t\t\t\tint nCharacters = (nTextWidth - MICROPROFILE_TEXT_WIDTH) / (MICROPROFILE_TEXT_WIDTH+1);\n\t\t\t\t\t\t\t\tif(nCharacters>0)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tMicroProfileDrawText((int)(fXStartText+1), (int)(fYStart+1), -1, pName, MicroProfileMin<uint32_t>(nNameLen, nCharacters));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n#endif\n\t\t\t\t\t\t\t++nNumBoxes;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfloat fXAvg = 0.5f * (fXStart + fXEnd);\n\t\t\t\t\t\t\tint nLineX = (int)floor(fXAvg+0.5f);\n\t\t\t\t\t\t\tif(nLineX != (int)nLinesDrawn[nStackPos])\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif(bHover && UI.nActiveMenu == (uint32_t)-1)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tnHoverToken = (uint32_t)MicroProfileLogTimerIndex(*pEntry);\n\t\t\t\t\t\t\t\t\tnHoverTime = MicroProfileLogTickDifference(nTickStart, nTickEnd);\n\t\t\t\t\t\t\t\t\tpMouseOverNext = pEntry;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tnLinesDrawn[nStackPos] = nLineX;\n\t\t\t\t\t\t\t\tMicroProfileDrawLineVertical(nLineX, (int)(fYStart + 0.5f), (int)(fYEnd + 0.5f), nColor|UI.nOpacityForeground);\n\t\t\t\t\t\t\t\t++nNumLines;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tnStackPos--;\n\n\t\t\t\t\t\tif(0 == nStackPos && MicroProfileLogTickDifference(nTickEnd, nBaseTicksEnd) < 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tnY += nMaxStackDepth * nYDelta + MICROPROFILE_DETAILED_BAR_HEIGHT+1;\n\t\t}\n\t}\n\tif(S.bContextSwitchRunning && (S.bContextSwitchAllThreads||S.bContextSwitchNoBars))\n\t{\n\t\tuint32_t nContextSwitchSearchEnd = S.bContextSwitchAllThreads ? nContextSwitchEnd : nContextSwitchStart;\n\n\t\tMicroProfileThreadInfo Threads[MICROPROFILE_MAX_CONTEXT_SWITCH_THREADS];\n\t\tuint32_t nNumThreadsBase = 0;\n\t\tuint32_t nNumThreads = MicroProfileContextSwitchGatherThreads(nContextSwitchStart, nContextSwitchSearchEnd, Threads, &nNumThreadsBase);\n\n\t\tstd::sort(&Threads[nNumThreadsBase], &Threads[nNumThreads],\n\t\t\t\t\t[](const MicroProfileThreadInfo& l, const MicroProfileThreadInfo& r)\n\t\t{\n\t\t\treturn l.nProcessId == r.nProcessId ? l.nThreadId < r.nThreadId : l.nProcessId > r.nProcessId;\n\t\t});\n\n\t\tuint32_t nStart = nNumThreadsBase;\n\t\tif(S.bContextSwitchNoBars)\n\t\t\tnStart = 0;\n\t\tMicroProfileProcessIdType nLastProcessId = MP_GETCURRENTPROCESSID();\n\t\tfor(uint32_t i = nStart; i < nNumThreads; ++i)\n\t\t{\n\t\t\tMicroProfileThreadInfo tt = Threads[i];\n\t\t\tif(tt.nThreadId)\n\t\t\t{\n\t\t\t\tif (nLastProcessId != tt.nProcessId)\n\t\t\t\t{\n\t\t\t\t\tnY = MicroProfileWriteProcessHeader(nY, (uint32_t)tt.nProcessId);\n\t\t\t\t\tnLastProcessId = tt.nProcessId;\n\t\t\t\t}\n\n\t\t\t\tMicroProfileDrawDetailedContextSwitchBars(nY + 2, tt.nThreadId, nContextSwitchStart, nContextSwitchEnd, nBaseTicksCpu, nBaseY);\n\n\t\t\t\tMicroProfileWriteThreadHeader(nY, tt.nThreadId, i < nNumThreadsBase ? &S.Pool[i]->ThreadName[0] : nullptr, nullptr);\n\t\t\t\tnY += MICROPROFILE_TEXT_HEIGHT + 1;\n\t\t\t}\n\t\t}\n\t}\n\n\tS.nContextSwitchHoverCpu = S.nContextSwitchHoverCpuNext;\n\n\n\n\n\tUI.pDisplayMouseOver = pMouseOverNext;\n\n\tif(!S.nRunning)\n\t{\n\t\tif(nHoverToken != MICROPROFILE_INVALID_TOKEN && nHoverTime)\n\t\t{\n\t\t\tUI.nHoverToken = nHoverToken;\n\t\t\tUI.nHoverTime = nHoverTime;\n\t\t}\n\n\t\tif(nSelectedFrame != -1)\n\t\t{\n\t\t\tUI.nRangeBegin = S.Frames[nSelectedFrame].nFrameStartCpu;\n\t\t\tUI.nRangeEnd = S.Frames[(nSelectedFrame+1)%MICROPROFILE_MAX_FRAME_HISTORY].nFrameStartCpu;\n\t\t\tUI.nRangeBeginGpu = S.Frames[nSelectedFrame].nFrameStartGpu;\n\t\t\tUI.nRangeEndGpu = S.Frames[(nSelectedFrame+1)%MICROPROFILE_MAX_FRAME_HISTORY].nFrameStartGpu;\n\t\t}\n\t\tif(UI.nRangeBegin != UI.nRangeEnd)\n\t\t{\n\t\t\tfloat fMsStart = fToMsCpu * MicroProfileLogTickDifference(nBaseTicksCpu, UI.nRangeBegin);\n\t\t\tfloat fMsEnd = fToMsCpu * MicroProfileLogTickDifference(nBaseTicksCpu, UI.nRangeEnd);\n\t\t\tfloat fXStart = fMsStart * fMsToScreen;\n\t\t\tfloat fXEnd = fMsEnd * fMsToScreen;\t\n\t\t\tMicroProfileDrawBox((int)fXStart, nBaseY, (int)fXEnd, nHeight, MICROPROFILE_FRAME_COLOR_HIGHTLIGHT, MicroProfileBoxTypeFlat);\n\t\t\tMicroProfileDrawLineVertical((int)fXStart, nBaseY, nHeight, MICROPROFILE_FRAME_COLOR_HIGHTLIGHT | 0x44000000);\n\t\t\tMicroProfileDrawLineVertical((int)fXEnd, nBaseY, nHeight, MICROPROFILE_FRAME_COLOR_HIGHTLIGHT | 0x44000000);\n\n\t\t\tfMsStart += fDetailedOffset;\n\t\t\tfMsEnd += fDetailedOffset;\n\t\t\tchar sBuffer[32];\n\t\t\tuint32_t nLenStart = snprintf(sBuffer, sizeof(sBuffer)-1, \"%.2fms\", fMsStart);\n\t\t\tfloat fStartTextWidth = (float)((1+MICROPROFILE_TEXT_WIDTH) * nLenStart);\n\t\t\tfloat fStartTextX = fXStart - fStartTextWidth - 2;\n\t\t\tMicroProfileDrawBox((int)fStartTextX, nBaseY, (int)(fStartTextX + fStartTextWidth + 2), MICROPROFILE_TEXT_HEIGHT + 2 + nBaseY, 0x33000000, MicroProfileBoxTypeFlat);\n\t\t\tMicroProfileDrawText((int)fStartTextX+1, nBaseY, (uint32_t)-1, sBuffer, nLenStart);\n\t\t\tuint32_t nLenEnd = snprintf(sBuffer, sizeof(sBuffer)-1, \"%.2fms\", fMsEnd);\n\t\t\tMicroProfileDrawBox((int)(fXEnd+1), nBaseY, (int)(fXEnd+1+(1+MICROPROFILE_TEXT_WIDTH) * nLenEnd + 3), MICROPROFILE_TEXT_HEIGHT + 2 + nBaseY, 0x33000000, MicroProfileBoxTypeFlat);\n\t\t\tMicroProfileDrawText((int)(fXEnd+2), nBaseY+1, (uint32_t)-1, sBuffer, nLenEnd);\n\n\t\t\tif(UI.nMouseRight)\n\t\t\t{\n\t\t\t\tMicroProfileZoomTo(UI.nRangeBegin, UI.nRangeEnd, MicroProfileTokenTypeCpu);\n\t\t\t}\n\t\t}\n\n\t\tif(UI.nRangeBeginGpu != UI.nRangeEndGpu)\n\t\t{\n\t\t\tfloat fMsStart = fToMsGpu * MicroProfileLogTickDifference(nBaseTicksGpu, UI.nRangeBeginGpu);\n\t\t\tfloat fMsEnd = fToMsGpu * MicroProfileLogTickDifference(nBaseTicksGpu, UI.nRangeEndGpu);\n\t\t\tfloat fXStart = fMsStart * fMsToScreen;\n\t\t\tfloat fXEnd = fMsEnd * fMsToScreen;\t\n\t\t\tMicroProfileDrawBox((int)fXStart, nBaseY, (int)fXEnd, nHeight, MICROPROFILE_FRAME_COLOR_HIGHTLIGHT_GPU, MicroProfileBoxTypeFlat);\n\t\t\tMicroProfileDrawLineVertical((int)fXStart, nBaseY, nHeight, MICROPROFILE_FRAME_COLOR_HIGHTLIGHT_GPU | 0x44000000);\n\t\t\tMicroProfileDrawLineVertical((int)fXEnd, nBaseY, nHeight, MICROPROFILE_FRAME_COLOR_HIGHTLIGHT_GPU | 0x44000000);\n\n\t\t\tnBaseY += MICROPROFILE_TEXT_HEIGHT+1;\n\n\t\t\tfMsStart += fDetailedOffset;\n\t\t\tfMsEnd += fDetailedOffset;\n\t\t\tchar sBuffer[32];\n\t\t\tuint32_t nLenStart = snprintf(sBuffer, sizeof(sBuffer)-1, \"%.2fms\", fMsStart);\n\t\t\tfloat fStartTextWidth = (float)((1+MICROPROFILE_TEXT_WIDTH) * nLenStart);\n\t\t\tfloat fStartTextX = fXStart - fStartTextWidth - 2;\n\t\t\tMicroProfileDrawBox((int)fStartTextX, nBaseY, (int)(fStartTextX + fStartTextWidth + 2), MICROPROFILE_TEXT_HEIGHT + 2 + nBaseY, 0x33000000, MicroProfileBoxTypeFlat);\n\t\t\tMicroProfileDrawText((int)(fStartTextX+1), nBaseY, (uint32_t)-1, sBuffer, nLenStart);\n\t\t\tuint32_t nLenEnd = snprintf(sBuffer, sizeof(sBuffer)-1, \"%.2fms\", fMsEnd);\n\t\t\tMicroProfileDrawBox((int)(fXEnd+1), nBaseY, (int)(fXEnd+1+(1+MICROPROFILE_TEXT_WIDTH) * nLenEnd + 3), MICROPROFILE_TEXT_HEIGHT + 2 + nBaseY, 0x33000000, MicroProfileBoxTypeFlat);\n\t\t\tMicroProfileDrawText((int)(fXEnd+2), nBaseY+1, (uint32_t)-1, sBuffer, nLenEnd);\n\n\t\t\tif(UI.nMouseRight)\n\t\t\t{\n\t\t\t\tMicroProfileZoomTo(UI.nRangeBeginGpu, UI.nRangeEndGpu, MicroProfileTokenTypeGpu);\n\t\t\t}\n\t\t}\n\t}\n}\n\n\nvoid MicroProfileDrawDetailedFrameHistory(uint32_t nWidth, uint32_t nHeight, uint32_t nBaseY, uint32_t nSelectedFrame)\n{\n\t(void)nHeight;\n\n\tMicroProfile& S = *MicroProfileGet();\n\n\tconst uint32_t nBarHeight = MICROPROFILE_FRAME_HISTORY_HEIGHT;\n\tfloat fBaseX = (float)nWidth;\n\tfloat fDx = fBaseX / MICROPROFILE_NUM_FRAMES;\n\n\tuint32_t nLastIndex =  (S.nFrameCurrent+1) % MICROPROFILE_MAX_FRAME_HISTORY;\n\tMicroProfileDrawBox(0, nBaseY, nWidth, nBaseY+MICROPROFILE_FRAME_HISTORY_HEIGHT, 0xff000000 | g_nMicroProfileBackColors[0], MicroProfileBoxTypeFlat);\n\tfloat fToMs = MicroProfileTickToMsMultiplier(MicroProfileTicksPerSecondCpu()) * S.fRcpReferenceTime;\n\tfloat fToMsGpu = MicroProfileTickToMsMultiplier(MicroProfileTicksPerSecondGpu()) * S.fRcpReferenceTime;\n\n\t\n\tMicroProfileFrameState* pFrameCurrent = &S.Frames[S.nFrameCurrent];\n\tuint64_t nFrameStartCpu = pFrameCurrent->nFrameStartCpu;\n\tint64_t nDetailedOffsetTicksCpu = MicroProfileMsToTick(UI.fDetailedOffset, MicroProfileTicksPerSecondCpu());\n\tint64_t nCpuStart = nDetailedOffsetTicksCpu + nFrameStartCpu;\n\tint64_t nCpuEnd = nCpuStart + MicroProfileMsToTick(UI.fDetailedRange, MicroProfileTicksPerSecondCpu());;\n\n\n\tfloat fSelectionStart = (float)nWidth;\n\tfloat fSelectionEnd = 0.f;\n\tfor(uint32_t i = 0; i < MICROPROFILE_NUM_FRAMES; ++i)\n\t{\n\t\tuint32_t nIndex = (S.nFrameCurrent + MICROPROFILE_MAX_FRAME_HISTORY - i) % MICROPROFILE_MAX_FRAME_HISTORY;\n\t\tMicroProfileFrameState* pCurrent = &S.Frames[nIndex];\n\t\tMicroProfileFrameState* pNext = &S.Frames[nLastIndex];\n\t\t\n\t\tint64_t nTicks = pNext->nFrameStartCpu - pCurrent->nFrameStartCpu;\n\t\tint64_t nTicksGpu = pNext->nFrameStartGpu - pCurrent->nFrameStartGpu;\n\t\tfloat fScale = fToMs * nTicks;\n\t\tfloat fScaleGpu = fToMsGpu * nTicksGpu;\n\t\tfScale = fScale > 1.f ? 0.f : 1.f - fScale;\n\t\tfScaleGpu = fScaleGpu > 1.f ? 0.f : 1.f - fScaleGpu;\n\t\tfloat fXEnd = fBaseX;\n\t\tfloat fXStart = fBaseX - fDx;\n\t\tfBaseX = fXStart;\n\t\tuint32_t nColor = MICROPROFILE_FRAME_HISTORY_COLOR_CPU;\n\t\tif(nIndex == nSelectedFrame)\n\t\t\tnColor = (uint32_t)-1;\n\t\tMicroProfileDrawBox((int)fXStart, (int)(nBaseY + fScale * nBarHeight), (int)fXEnd, nBaseY+MICROPROFILE_FRAME_HISTORY_HEIGHT, nColor, MicroProfileBoxTypeBar);\n\t\tif(pNext->nFrameStartCpu > nCpuStart)\n\t\t{\n\t\t\tfSelectionStart = fXStart;\n\t\t}\n\t\tif(pCurrent->nFrameStartCpu < nCpuEnd && fSelectionEnd == 0.f)\n\t\t{\n\t\t\tfSelectionEnd = fXEnd;\n\t\t}\n\t\tnLastIndex = nIndex;\n\t}\n\tMicroProfileDrawBox((int)fSelectionStart, nBaseY, (int)fSelectionEnd, nBaseY+MICROPROFILE_FRAME_HISTORY_HEIGHT, MICROPROFILE_FRAME_HISTORY_COLOR_HIGHTLIGHT, MicroProfileBoxTypeFlat);\n}\nvoid MicroProfileDrawDetailedView(uint32_t nWidth, uint32_t nHeight, bool bDrawBars)\n{\n\tMicroProfile& S = *MicroProfileGet();\n\n\tMICROPROFILE_SCOPE(g_MicroProfileDetailed);\n\tuint32_t nBaseY = MICROPROFILE_TEXT_HEIGHT + 1;\n\n\tint nSelectedFrame = -1;\n\tif(UI.nMouseY > nBaseY && UI.nMouseY <= nBaseY + MICROPROFILE_FRAME_HISTORY_HEIGHT && UI.nActiveMenu == (uint32_t)-1)\n\t{\n\n\t\tnSelectedFrame = ((MICROPROFILE_NUM_FRAMES) * (UI.nWidth-UI.nMouseX) / UI.nWidth);\n\t\tnSelectedFrame = (S.nFrameCurrent + MICROPROFILE_MAX_FRAME_HISTORY - nSelectedFrame) % MICROPROFILE_MAX_FRAME_HISTORY;\n\t\tUI.nHoverFrame = nSelectedFrame;\n\t\tif(UI.nMouseRight)\n\t\t{\n\t\t\tint64_t nRangeBegin = S.Frames[nSelectedFrame].nFrameStartCpu;\n\t\t\tint64_t nRangeEnd = S.Frames[(nSelectedFrame+1)%MICROPROFILE_MAX_FRAME_HISTORY].nFrameStartCpu;\n\t\t\tMicroProfileZoomTo(nRangeBegin, nRangeEnd, MicroProfileTokenTypeCpu);\n\t\t}\n\t\tif(UI.nMouseDownLeft)\n\t\t{\n\t\t\tuint64_t nFrac = (1024 * (MICROPROFILE_NUM_FRAMES) * (UI.nMouseX) / UI.nWidth) % 1024;\n\t\t\tint64_t nRangeBegin = S.Frames[nSelectedFrame].nFrameStartCpu;\n\t\t\tint64_t nRangeEnd = S.Frames[(nSelectedFrame+1)%MICROPROFILE_MAX_FRAME_HISTORY].nFrameStartCpu;\n\t\t\tMicroProfileCenter(nRangeBegin + (nRangeEnd-nRangeBegin) * nFrac / 1024);\n\t\t}\n\t}\n\telse\n\t{\n\t\tUI.nHoverFrame = -1;\n\t}\n\n\tif (bDrawBars)\n\t{\n\t\tMicroProfileDrawDetailedBars(nWidth, nHeight, nBaseY + MICROPROFILE_FRAME_HISTORY_HEIGHT, nSelectedFrame);\n\t}\n\n\tMicroProfileDrawDetailedFrameHistory(nWidth, nHeight, nBaseY, nSelectedFrame);\n}\nvoid MicroProfileDrawTextRight(uint32_t nX, uint32_t nY, uint32_t nColor, const char* pStr, uint32_t nStrLen)\n{\n\tMicroProfileDrawText(nX - nStrLen * (MICROPROFILE_TEXT_WIDTH+1), nY, nColor, pStr, nStrLen);\n}\nvoid MicroProfileDrawHeader(int32_t nX, uint32_t nWidth, const char* pName)\n{\n\tif(pName)\n\t{\n\t\tMicroProfileDrawBox(nX-8, MICROPROFILE_TEXT_HEIGHT + 2, nX + nWidth+5, MICROPROFILE_TEXT_HEIGHT + 2 + (MICROPROFILE_TEXT_HEIGHT+1), 0xff000000|g_nMicroProfileBackColors[1]);\n\t\tMicroProfileDrawText(nX, MICROPROFILE_TEXT_HEIGHT + 2, (uint32_t)-1, pName, (uint32_t)strlen(pName));\n\t}\n}\n\n\ntypedef void (*MicroProfileLoopGroupCallback)(uint32_t nTimer, uint32_t nIdx, uint32_t nX, uint32_t nY, void* pData);\n\nvoid MicroProfileLoopActiveGroupsDraw(int32_t nX, int32_t nY, MicroProfileLoopGroupCallback CB, void* pData)\n{\n\tMicroProfile& S = *MicroProfileGet();\n\tnY += MICROPROFILE_TEXT_HEIGHT + 2;\n\tuint64_t nGroup = S.nAllGroupsWanted ? S.nGroupMask : S.nActiveGroupWanted;\n\tuint32_t nCount = 0;\n\tfor(uint32_t j = 0; j < MICROPROFILE_MAX_GROUPS; ++j)\n\t{\n\t\tuint64_t nMask = 1ll << j;\n\t\tif(nMask & nGroup)\n\t\t{\n\t\t\tnY += MICROPROFILE_TEXT_HEIGHT + 1;\n\t\t\tfor(uint32_t i = 0; i < S.nTotalTimers;++i)\n\t\t\t{\n\t\t\t\tuint64_t nTokenMask = MicroProfileGetGroupMask(S.TimerInfo[i].nToken);\n\t\t\t\tif(nTokenMask & nMask)\n\t\t\t\t{\n\t\t\t\t\tif(nY >= 0)\n\t\t\t\t\t\tCB(i, nCount, nX, nY, pData);\n\t\t\t\t\t\n\t\t\t\t\tnCount += 2;\n\t\t\t\t\tnY += MICROPROFILE_TEXT_HEIGHT + 1;\n\n\t\t\t\t\tif(nY > (int)UI.nHeight)\n\t\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t}\n\t}\n}\n\n\nvoid MicroProfileCalcTimers(float* pTimers, float* pAverage, float* pMax, float* pMin, float* pCallAverage, float* pExclusive, float* pAverageExclusive, float* pMaxExclusive, uint64_t nGroup, uint32_t nSize)\n{\n\tMicroProfile& S = *MicroProfileGet();\n\n\tuint32_t nCount = 0;\n\tuint64_t nMask = 1;\n\n\tfor(uint32_t j = 0; j < MICROPROFILE_MAX_GROUPS; ++j)\n\t{\n\t\tif(nMask & nGroup)\n\t\t{\n\t\t\tconst float fToMs = MicroProfileTickToMsMultiplier(S.GroupInfo[j].Type == MicroProfileTokenTypeGpu ? MicroProfileTicksPerSecondGpu() : MicroProfileTicksPerSecondCpu());\n\t\t\tfor(uint32_t i = 0; i < S.nTotalTimers;++i)\n\t\t\t{\n\t\t\t\tuint64_t nTokenMask = MicroProfileGetGroupMask(S.TimerInfo[i].nToken);\n\t\t\t\tif(nTokenMask & nMask)\n\t\t\t\t{\n\t\t\t\t\tMP_ASSERT(nCount + 2 <= nSize);\n\t\t\t\t\t{\n\t\t\t\t\t\tuint32_t nTimer = i;\n\t\t\t\t\t\tuint32_t nIdx = nCount;\n\t\t\t\t\t\tuint32_t nAggregateFrames = S.nAggregateFrames ? S.nAggregateFrames : 1;\n\t\t\t\t\t\tuint32_t nAggregateCount = S.Aggregate[nTimer].nCount ? S.Aggregate[nTimer].nCount : 1;\n\t\t\t\t\t\tfloat fToPrc = S.fRcpReferenceTime;\n\t\t\t\t\t\tfloat fMs = fToMs * (S.Frame[nTimer].nTicks);\n\t\t\t\t\t\tfloat fPrc = MicroProfileMin(fMs * fToPrc, 1.f);\n\t\t\t\t\t\tfloat fAverageMs = fToMs * (S.Aggregate[nTimer].nTicks / nAggregateFrames);\n\t\t\t\t\t\tfloat fAveragePrc = MicroProfileMin(fAverageMs * fToPrc, 1.f);\n\t\t\t\t\t\tfloat fMaxMs = fToMs * (S.AggregateMax[nTimer]);\n\t\t\t\t\t\tfloat fMaxPrc = MicroProfileMin(fMaxMs * fToPrc, 1.f);\n\t\t\t\t\t\tfloat fMinMs = fToMs * (S.AggregateMin[nTimer] != uint64_t(-1) ? S.AggregateMin[nTimer] : 0);\n\t\t\t\t\t\tfloat fMinPrc = MicroProfileMin(fMinMs * fToPrc, 1.f);\n\t\t\t\t\t\tfloat fCallAverageMs = fToMs * (S.Aggregate[nTimer].nTicks / nAggregateCount);\n\t\t\t\t\t\tfloat fCallAveragePrc = MicroProfileMin(fCallAverageMs * fToPrc, 1.f);\n\t\t\t\t\t\tfloat fMsExclusive = fToMs * (S.FrameExclusive[nTimer]);\n\t\t\t\t\t\tfloat fPrcExclusive = MicroProfileMin(fMsExclusive * fToPrc, 1.f);\n\t\t\t\t\t\tfloat fAverageMsExclusive = fToMs * (S.AggregateExclusive[nTimer] / nAggregateFrames);\n\t\t\t\t\t\tfloat fAveragePrcExclusive = MicroProfileMin(fAverageMsExclusive * fToPrc, 1.f);\n\t\t\t\t\t\tfloat fMaxMsExclusive = fToMs * (S.AggregateMaxExclusive[nTimer]);\n\t\t\t\t\t\tfloat fMaxPrcExclusive = MicroProfileMin(fMaxMsExclusive * fToPrc, 1.f);\n\t\t\t\t\t\tpTimers[nIdx] = fMs;\n\t\t\t\t\t\tpTimers[nIdx+1] = fPrc;\n\t\t\t\t\t\tpAverage[nIdx] = fAverageMs;\n\t\t\t\t\t\tpAverage[nIdx+1] = fAveragePrc;\n\t\t\t\t\t\tpMax[nIdx] = fMaxMs;\n\t\t\t\t\t\tpMax[nIdx+1] = fMaxPrc;\n\t\t\t\t\t\tpMin[nIdx] = fMinMs;\n\t\t\t\t\t\tpMin[nIdx + 1] = fMinPrc;\n\t\t\t\t\t\tpCallAverage[nIdx] = fCallAverageMs;\n\t\t\t\t\t\tpCallAverage[nIdx+1] = fCallAveragePrc;\n\t\t\t\t\t\tpExclusive[nIdx] = fMsExclusive;\n\t\t\t\t\t\tpExclusive[nIdx+1] = fPrcExclusive;\n\t\t\t\t\t\tpAverageExclusive[nIdx] = fAverageMsExclusive;\n\t\t\t\t\t\tpAverageExclusive[nIdx+1] = fAveragePrcExclusive;\n\t\t\t\t\t\tpMaxExclusive[nIdx] = fMaxMsExclusive;\n\t\t\t\t\t\tpMaxExclusive[nIdx+1] = fMaxPrcExclusive;\n\t\t\t\t\t}\n\t\t\t\t\tnCount += 2;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tnMask <<= 1ll;\n\t}\n}\n\n#define SBUF_MAX 32\n\nvoid MicroProfileDrawBarArrayCallback(uint32_t nTimer, uint32_t nIdx, uint32_t nX, uint32_t nY, void* pExtra)\n{\n\tconst uint32_t nHeight = MICROPROFILE_TEXT_HEIGHT;\t\n\tconst uint32_t nTextWidth = 6 * (1+MICROPROFILE_TEXT_WIDTH);\n\tconst float fWidth = (float)MICROPROFILE_BAR_WIDTH;\n\n\tfloat* pTimers = ((float**)pExtra)[0];\n\tfloat* pTimers2 = ((float**)pExtra)[1];\n\tMicroProfile& S = *MicroProfileGet();\n\tchar sBuffer[SBUF_MAX];\n\tif (pTimers2 && pTimers2[nIdx] > 0.1f)\n\t\tsnprintf(sBuffer, SBUF_MAX-1, \"%5.2f %3.1fx\", pTimers[nIdx], pTimers[nIdx] / pTimers2[nIdx]);\n\telse\n\t\tsnprintf(sBuffer, SBUF_MAX-1, \"%5.2f\", pTimers[nIdx]);\n\tif (!pTimers2)\n\t\tMicroProfileDrawBox(nX + nTextWidth, nY, (int)(nX + nTextWidth + fWidth * pTimers[nIdx+1]), nY + nHeight, UI.nOpacityForeground|S.TimerInfo[nTimer].nColor, MicroProfileBoxTypeBar);\n\tMicroProfileDrawText(nX, nY, (uint32_t)-1, sBuffer, (uint32_t)strlen(sBuffer));\t\t\n}\n\n\nuint32_t MicroProfileDrawBarArray(int32_t nX, int32_t nY, float* pTimers, const char* pName, uint32_t nTotalHeight, float* pTimers2 = NULL)\n{\n\tconst uint32_t nTextWidth = 6 * (1+MICROPROFILE_TEXT_WIDTH);\n\tconst uint32_t nWidth = MICROPROFILE_BAR_WIDTH;\n\n\tMicroProfileDrawLineVertical(nX-5, 0, nTotalHeight+nY, UI.nOpacityBackground|g_nMicroProfileBackColors[0]|g_nMicroProfileBackColors[1]);\n\tfloat* pTimersArray[2] = {pTimers, pTimers2};\n\tMicroProfileLoopActiveGroupsDraw(nX, nY, MicroProfileDrawBarArrayCallback, pTimersArray);\n\tMicroProfileDrawHeader(nX, nTextWidth + nWidth, pName);\n\treturn nWidth + 5 + nTextWidth;\n\n}\nvoid MicroProfileDrawBarCallCountCallback(uint32_t nTimer, uint32_t nIdx, uint32_t nX, uint32_t nY, void* pExtra)\n{\n\t(void)nIdx;\n\t(void)pExtra;\n\n\tMicroProfile& S = *MicroProfileGet();\n\tchar sBuffer[SBUF_MAX];\n\tint nLen = snprintf(sBuffer, SBUF_MAX-1, \"%5d\", S.Frame[nTimer].nCount);//fix\n\tMicroProfileDrawText(nX, nY, (uint32_t)-1, sBuffer, nLen);\n}\n\nuint32_t MicroProfileDrawBarCallCount(int32_t nX, int32_t nY, const char* pName)\n{\n\tMicroProfileLoopActiveGroupsDraw(nX, nY, MicroProfileDrawBarCallCountCallback, 0);\n\tconst uint32_t nTextWidth = 6 * MICROPROFILE_TEXT_WIDTH;\n\tMicroProfileDrawHeader(nX, 5 + nTextWidth, pName);\n\treturn 5 + nTextWidth;\n}\n\nstruct MicroProfileMetaAverageArgs\n{\n\tuint64_t* pCounters;\n\tfloat fRcpFrames;\n};\n\nvoid MicroProfileDrawBarMetaAverageCallback(uint32_t nTimer, uint32_t nIdx, uint32_t nX, uint32_t nY, void* pExtra)\n{\n\t(void)nIdx;\n\n\tMicroProfileMetaAverageArgs* pArgs = (MicroProfileMetaAverageArgs*)pExtra;\n\tuint64_t* pCounters = pArgs->pCounters;\n\tfloat fRcpFrames = pArgs->fRcpFrames;\n\tchar sBuffer[SBUF_MAX];\n\tint nLen = snprintf(sBuffer, SBUF_MAX-1, \"%5.2f\", pCounters[nTimer] * fRcpFrames);\n\tMicroProfileDrawText(nX - nLen * (MICROPROFILE_TEXT_WIDTH+1), nY, (uint32_t)-1, sBuffer, nLen);\n}\n\nuint32_t MicroProfileDrawBarMetaAverage(int32_t nX, int32_t nY, uint64_t* pCounters, const char* pName, uint32_t nTotalHeight)\n{\n\tif(!pName)\n\t\treturn 0;\n\tMicroProfileDrawLineVertical(nX-5, 0, nTotalHeight+nY, UI.nOpacityBackground|g_nMicroProfileBackColors[0]|g_nMicroProfileBackColors[1]);\n\tuint32_t nTextWidth = (1+MICROPROFILE_TEXT_WIDTH) * MicroProfileMax<uint32_t>(6, (uint32_t)strlen(pName));\n\tfloat fRcpFrames = 1.f / (MicroProfileGet()->nAggregateFrames ? MicroProfileGet()->nAggregateFrames : 1);\n\tMicroProfileMetaAverageArgs Args = {pCounters, fRcpFrames};\n\tMicroProfileLoopActiveGroupsDraw(nX + nTextWidth, nY, MicroProfileDrawBarMetaAverageCallback, &Args);\n\tMicroProfileDrawHeader(nX, 5 + nTextWidth, pName);\t\n\treturn 5 + nTextWidth;\n}\n\n\nvoid MicroProfileDrawBarMetaCountCallback(uint32_t nTimer, uint32_t nIdx, uint32_t nX, uint32_t nY, void* pExtra)\n{\n\t(void)nIdx;\n\n\tuint64_t* pCounters = (uint64_t*)pExtra;\n\tchar sBuffer[SBUF_MAX];\n\tint nLen = snprintf(sBuffer, SBUF_MAX-1, \"%5lld\", (long long)pCounters[nTimer]);\n\tMicroProfileDrawText(nX - nLen * (MICROPROFILE_TEXT_WIDTH+1), nY, (uint32_t)-1, sBuffer, nLen);\t\n}\n\nuint32_t MicroProfileDrawBarMetaCount(int32_t nX, int32_t nY, uint64_t* pCounters, const char* pName, uint32_t nTotalHeight)\n{\n\tif(!pName)\n\t\treturn 0;\n\n\tMicroProfileDrawLineVertical(nX-5, 0, nTotalHeight+nY, UI.nOpacityBackground|g_nMicroProfileBackColors[0]|g_nMicroProfileBackColors[1]);\n\tuint32_t nTextWidth = (1+MICROPROFILE_TEXT_WIDTH) * MicroProfileMax<uint32_t>(6, (uint32_t)strlen(pName));\n\tMicroProfileLoopActiveGroupsDraw(nX + nTextWidth, nY, MicroProfileDrawBarMetaCountCallback, pCounters);\n\tMicroProfileDrawHeader(nX, 5 + nTextWidth, pName);\n\treturn 5 + nTextWidth;\n}\n\nvoid MicroProfileDrawBarLegendCallback(uint32_t nTimer, uint32_t nIdx, uint32_t nX, uint32_t nY, void* pExtra)\n{\n\t(void)nIdx;\n\t(void)pExtra;\n\n\tMicroProfile& S = *MicroProfileGet();\n\tif (S.TimerInfo[nTimer].bGraph)\n\t{\n\t\tMicroProfileDrawText(nX, nY, S.TimerInfo[nTimer].nColor, \">\", 1);\n\t}\n\tMicroProfileDrawTextRight(nX, nY, S.TimerInfo[nTimer].nColor, S.TimerInfo[nTimer].pName, (uint32_t)strlen(S.TimerInfo[nTimer].pName));\n\tif(UI.nMouseY >= nY && UI.nMouseY < nY + MICROPROFILE_TEXT_HEIGHT+1)\n\t{\n\t\tUI.nHoverToken = nTimer;\n\t\tUI.nHoverTime = 0;\n\t}\n}\n\nuint32_t MicroProfileDrawBarLegend(int32_t nX, int32_t nY, uint32_t nTotalHeight, uint32_t nMaxWidth)\n{\n\tMicroProfileDrawLineVertical(nX-5, nY, nTotalHeight, UI.nOpacityBackground | g_nMicroProfileBackColors[0]|g_nMicroProfileBackColors[1]);\n\tMicroProfileLoopActiveGroupsDraw(nMaxWidth, nY, MicroProfileDrawBarLegendCallback, 0);\n\treturn nX;\n}\n\nbool MicroProfileDrawGraph(uint32_t nScreenWidth, uint32_t nScreenHeight)\n{\n\tMicroProfile& S = *MicroProfileGet();\n\n\tMICROPROFILE_SCOPE(g_MicroProfileDrawGraph);\n\tbool bEnabled = false;\n\tfor(uint32_t i = 0; i < MICROPROFILE_MAX_GRAPHS; ++i)\n\t\tif(S.Graph[i].nToken != MICROPROFILE_INVALID_TOKEN)\n\t\t\tbEnabled = true;\n\tif(!bEnabled)\n\t\treturn false;\n\t\n\tuint32_t nX = nScreenWidth - MICROPROFILE_GRAPH_WIDTH;\n\tuint32_t nY = nScreenHeight - MICROPROFILE_GRAPH_HEIGHT;\n\tMicroProfileDrawBox(nX, nY, nX + MICROPROFILE_GRAPH_WIDTH, nY + MICROPROFILE_GRAPH_HEIGHT, 0x88000000 | g_nMicroProfileBackColors[0]);\n\tbool bMouseOver = UI.nMouseX >= nX && UI.nMouseY >= nY;\n\tfloat fMouseXPrc =(float(UI.nMouseX - nX)) / MICROPROFILE_GRAPH_WIDTH;\n\tif(bMouseOver)\n\t{\n\t\tfloat fXAvg = fMouseXPrc * MICROPROFILE_GRAPH_WIDTH + nX;\n\t\tMicroProfileDrawLineVertical((int)fXAvg, nY, nY + MICROPROFILE_GRAPH_HEIGHT, (uint32_t)-1);\n\t}\n\n\t\n\tfloat fY = (float)nScreenHeight;\n\tfloat fDX = MICROPROFILE_GRAPH_WIDTH * 1.f / MICROPROFILE_GRAPH_HISTORY;  \n\tfloat fDY = MICROPROFILE_GRAPH_HEIGHT;\n\tuint32_t nPut = S.nGraphPut;\n\tfloat* pGraphData = (float*)alloca(sizeof(float)* MICROPROFILE_GRAPH_HISTORY*2);\n\tfor(uint32_t i = 0; i < MICROPROFILE_MAX_GRAPHS; ++i)\n\t{\n\t\tif(S.Graph[i].nToken != MICROPROFILE_INVALID_TOKEN)\n\t\t{\n\t\t\tuint32_t nGroupId = MicroProfileGetGroupIndex(S.Graph[i].nToken);\n\t\t\tbool bGpu = S.GroupInfo[nGroupId].Type == MicroProfileTokenTypeGpu;\n\t\t\tfloat fToMs = MicroProfileTickToMsMultiplier(bGpu ? MicroProfileTicksPerSecondGpu() : MicroProfileTicksPerSecondCpu());\n\t\t\tfloat fToPrc = fToMs * S.fRcpReferenceTime * 3 / 4;\n\n\t\t\tfloat fX = (float)nX;\n\t\t\tfor(uint32_t j = 0; j < MICROPROFILE_GRAPH_HISTORY; ++j)\n\t\t\t{\n\t\t\t\tfloat fWeigth = MicroProfileMin(fToPrc * (S.Graph[i].nHistory[(j+nPut)%MICROPROFILE_GRAPH_HISTORY]), 1.f);\n\t\t\t\tpGraphData[(j*2)] = fX;\n\t\t\t\tpGraphData[(j*2)+1] = fY - fDY * fWeigth;\n\t\t\t\tfX += fDX;\n\t\t\t}\n\t\t\tMicroProfileDrawLine2D(MICROPROFILE_GRAPH_HISTORY, pGraphData, UI.nOpacityForeground|S.TimerInfo[MicroProfileGetTimerIndex(S.Graph[i].nToken)].nColor);\n\t\t}\n\t}\n\t{\n\t\tfloat fY1 = 0.25f * MICROPROFILE_GRAPH_HEIGHT + nY;\n\t\tfloat fY2 = 0.50f * MICROPROFILE_GRAPH_HEIGHT + nY;\n\t\tfloat fY3 = 0.75f * MICROPROFILE_GRAPH_HEIGHT + nY;\n\t\tMicroProfileDrawLineHorizontal(nX, nX + MICROPROFILE_GRAPH_WIDTH, (int)fY1, 0xffdd4444);\n\t\tMicroProfileDrawLineHorizontal(nX, nX + MICROPROFILE_GRAPH_WIDTH, (int)fY2, 0xff000000 | g_nMicroProfileBackColors[0]);\n\t\tMicroProfileDrawLineHorizontal(nX, nX + MICROPROFILE_GRAPH_WIDTH, (int)fY3, 0xff000000 | g_nMicroProfileBackColors[0]);\n\n\t\tchar buf[32];\n\t\tint nLen = snprintf(buf, sizeof(buf)-1, \"%5.2fms\", S.fReferenceTime);\n\t\tMicroProfileDrawText(nX+1, (int)(fY1 - (2+MICROPROFILE_TEXT_HEIGHT)), (uint32_t)-1, buf, nLen);\n\t}\n\n\n\n\tif(bMouseOver)\n\t{\n\t\tuint32_t pColors[MICROPROFILE_MAX_GRAPHS];\n\t\tMicroProfileStringArray Strings;\n\t\tMicroProfileStringArrayClear(&Strings);\n\t\tuint32_t nTextCount = 0;\n\t\tuint32_t nGraphIndex = (S.nGraphPut + MICROPROFILE_GRAPH_HISTORY - int(MICROPROFILE_GRAPH_HISTORY*(1.f - fMouseXPrc))) % MICROPROFILE_GRAPH_HISTORY;\n\n\t\tuint32_t nX = UI.nMouseX;\n\t\tuint32_t nY = UI.nMouseY + 20;\n\n\t\tfor(uint32_t i = 0; i < MICROPROFILE_MAX_GRAPHS; ++i)\n\t\t{\n\t\t\tif(S.Graph[i].nToken != MICROPROFILE_INVALID_TOKEN)\n\t\t\t{\n\t\t\t\tuint32_t nGroupId = MicroProfileGetGroupIndex(S.Graph[i].nToken);\n\t\t\t\tbool bGpu = S.GroupInfo[nGroupId].Type == MicroProfileTokenTypeGpu;\n\t\t\t\tfloat fToMs = MicroProfileTickToMsMultiplier(bGpu ? MicroProfileTicksPerSecondGpu() : MicroProfileTicksPerSecondCpu());\n\t\t\t\tuint32_t nIndex = MicroProfileGetTimerIndex(S.Graph[i].nToken);\n\t\t\t\tuint32_t nColor = S.TimerInfo[nIndex].nColor;\n\t\t\t\tconst char* pName = S.TimerInfo[nIndex].pName;\n\t\t\t\tpColors[nTextCount++] = nColor;\n\t\t\t\tMicroProfileStringArrayAddLiteral(&Strings, pName);\n\t\t\t\tMicroProfileStringArrayFormat(&Strings, \"%5.2fms\", fToMs * (S.Graph[i].nHistory[nGraphIndex]));\n\t\t\t}\n\t\t}\n\t\tif(nTextCount)\n\t\t{\n\t\t\tMicroProfileDrawFloatWindow(nX, nY, Strings.ppStrings, Strings.nNumStrings, 0, pColors);\n\t\t}\n\n\t\tif(UI.nMouseRight)\n\t\t{\n\t\t\tfor(uint32_t i = 0; i < MICROPROFILE_MAX_GRAPHS; ++i)\n\t\t\t{\n\t\t\t\tS.Graph[i].nToken = MICROPROFILE_INVALID_TOKEN;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn bMouseOver;\n}\n\nvoid MicroProfileDumpTimers()\n{\n\tMicroProfile& S = *MicroProfileGet();\n\n\tuint64_t nActiveGroup = S.nGroupMask;\n\n\tuint32_t nNumTimers = S.nTotalTimers;\n\tuint32_t nBlockSize = 2 * nNumTimers;\n\tfloat* pTimers = (float*)alloca(nBlockSize * 8 * sizeof(float));\n\tfloat* pAverage = pTimers + nBlockSize;\n\tfloat* pMax = pTimers + 2 * nBlockSize;\n\tfloat* pMin = pTimers + 3 * nBlockSize;\n\tfloat* pCallAverage = pTimers + 4 * nBlockSize;\n\tfloat* pTimersExclusive = pTimers + 5 * nBlockSize;\n\tfloat* pAverageExclusive = pTimers + 6 * nBlockSize;\n\tfloat* pMaxExclusive = pTimers + 7 * nBlockSize;\n\tMicroProfileCalcTimers(pTimers, pAverage, pMax, pMin, pCallAverage, pTimersExclusive, pAverageExclusive, pMaxExclusive, nActiveGroup, nBlockSize);\n\n\tMICROPROFILE_PRINTF(\"%11s, \", \"Time\");\n\tMICROPROFILE_PRINTF(\"%11s, \", \"Average\");\n\tMICROPROFILE_PRINTF(\"%11s, \", \"Max\");\n\tMICROPROFILE_PRINTF(\"%11s, \", \"Min\");\n\tMICROPROFILE_PRINTF(\"%11s, \", \"Call Avg\");\n\tMICROPROFILE_PRINTF(\"%9s, \", \"Count\");\n\tMICROPROFILE_PRINTF(\"%11s, \", \"Excl\");\n\tMICROPROFILE_PRINTF(\"%11s, \", \"Avg Excl\");\n\tMICROPROFILE_PRINTF(\"%11s, \\n\", \"Max Excl\");\n\n\tfor(uint32_t j = 0; j < MICROPROFILE_MAX_GROUPS; ++j)\n\t{\n\t\tuint64_t nMask = 1ll << j;\n\t\tif(nMask & nActiveGroup)\n\t\t{\n\t\t\tMICROPROFILE_PRINTF(\"%s\\n\", S.GroupInfo[j].pName);\n\t\t\tfor(uint32_t i = 0; i < S.nTotalTimers;++i)\n\t\t\t{\n\t\t\t\tuint64_t nTokenMask = MicroProfileGetGroupMask(S.TimerInfo[i].nToken);\n\t\t\t\tif(nTokenMask & nMask)\n\t\t\t\t{\n\t\t\t\t\tuint32_t nIdx = i * 2;\n\t\t\t\t\tMICROPROFILE_PRINTF(\"%9.2fms, \", pTimers[nIdx]);\n\t\t\t\t\tMICROPROFILE_PRINTF(\"%9.2fms, \", pAverage[nIdx]);\n\t\t\t\t\tMICROPROFILE_PRINTF(\"%9.2fms, \", pMax[nIdx]);\n\t\t\t\t\tMICROPROFILE_PRINTF(\"%9.2fms, \", pMin[nIdx]);\n\t\t\t\t\tMICROPROFILE_PRINTF(\"%9.2fms, \", pCallAverage[nIdx]);\n\t\t\t\t\tMICROPROFILE_PRINTF(\"%9d, \", S.Frame[i].nCount);\n\t\t\t\t\tMICROPROFILE_PRINTF(\"%9.2fms, \", pTimersExclusive[nIdx]);\n\t\t\t\t\tMICROPROFILE_PRINTF(\"%9.2fms, \", pAverageExclusive[nIdx]);\n\t\t\t\t\tMICROPROFILE_PRINTF(\"%9.2fms, \", pMaxExclusive[nIdx]);\n\t\t\t\t\tMICROPROFILE_PRINTF(\"%s\\n\", S.TimerInfo[i].pName);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n\nuint32_t MicroProfileDrawCounterRecursive(uint32_t nIndex, uint32_t nY, uint32_t nOffset, uint32_t nTimerWidth)\n{\n\tMicroProfile& S = *MicroProfileGet();\n\tuint8_t bGraphDetailed = 0 != (S.CounterInfo[nIndex].nFlags & MICROPROFILE_COUNTER_FLAG_DETAILED_GRAPH);\n\tuint32_t nRows = bGraphDetailed ? 5 : 1;\n\tconst uint32_t nHeight = MICROPROFILE_TEXT_HEIGHT;\n\tconst uint32_t nCounterWidth = UI.nCounterWidth;\n\tconst uint32_t nLimitWidth = UI.nLimitWidth;\n\n\tuint32_t nY0 = nY + nOffset * (nHeight+1);\n\tuint32_t nBackHeight = (nHeight+1) * nRows;\n\n\tMicroProfileCounterInfo& CI = S.CounterInfo[nIndex];\n\tbool bInside = (UI.nActiveMenu == (uint32_t)-1) && ((UI.nMouseY >= nY0) && (UI.nMouseY < (nY0 + nBackHeight)));\n\tuint32_t nTotalWidth = nTimerWidth + nCounterWidth * 3 + MICROPROFILE_COUNTER_WIDTH + nLimitWidth + 4 * (MICROPROFILE_TEXT_WIDTH+1)\n\t+ 4 + MICROPROFILE_GRAPH_HISTORY;\n\tuint32_t nBackColor = 0xff000000 | (g_nMicroProfileBackColors[nOffset & 1] + ((bInside) ? 0x002c2c2c : 0));\n\tMicroProfileDrawBox(0, nY0, nTotalWidth, nY0 + nBackHeight +1, nBackColor);\n\tuint32_t nIndent = MICROPROFILE_COUNTER_INDENT*CI.nLevel * (MICROPROFILE_TEXT_WIDTH+1);\n\tif(CI.nFirstChild != -1 && 0 != (CI.nFlags & MICROPROFILE_COUNTER_FLAG_CLOSED))\n\t{\n\t\tMicroProfileDrawText(nIndent, nY0, 0xffffffff, \"*\", 1);\n\t}\n\n\tMicroProfileDrawText(nIndent + MICROPROFILE_TEXT_WIDTH+1, nY0, 0xffffffff, CI.pName, CI.nNameLen);\n\tchar buffer[64];\n\tint64_t nCounterValue = S.Counters[nIndex].load();\n\tuint32_t nX = nTimerWidth + nCounterWidth;\n\tint nLen = MicroProfileFormatCounter(S.CounterInfo[nIndex].eFormat, nCounterValue, buffer, sizeof(buffer));\n\tUI.nCounterWidthTemp = MicroProfileMax((uint32_t)nLen, UI.nCounterWidthTemp);\n\tif(0 != nCounterValue || 0 != (CI.nFlags & MICROPROFILE_COUNTER_FLAG_LEAF))\n\t{\n\t\tMicroProfileDrawTextRight(nX, nY0, 0xffffffff, buffer, nLen);\n\t}\n\tint64_t nLimit = S.CounterInfo[nIndex].nLimit;\n\tif(nLimit)\n\t{\n\t\tnX += MICROPROFILE_TEXT_WIDTH+1;\n\t\tMicroProfileDrawText(nX, nY0, 0xffffffff, \"/\", 1);\n\t\tnX += 2 * (MICROPROFILE_TEXT_WIDTH+1);\n\t\tint nLen = MicroProfileFormatCounter(S.CounterInfo[nIndex].eFormat, nLimit, buffer, sizeof(buffer));\n\t\tUI.nLimitWidthTemp = MicroProfileMax(UI.nLimitWidthTemp, (uint32_t)nLen);\n\t\tMicroProfileDrawText(nX, nY0, 0xffffffff, buffer, nLen);\n\t\tnX += nLimitWidth;\n\t\tnY0 += 1;\n\n\t\tfloat fCounterPrc = (float)nCounterValue / nLimit;\n\t\tfCounterPrc = MicroProfileMax(fCounterPrc, 0.f);\n\t\tfloat fBoxPrc = 1.f;\n\t\tif(fCounterPrc>1.f)\n\t\t{\n\t\t\tfBoxPrc = 1.f / fCounterPrc;\n\t\t\tfCounterPrc = 1.f;\n\t\t}\n\n\t\tMicroProfileDrawBox(nX, nY0, nX + (int)(fBoxPrc * MICROPROFILE_COUNTER_WIDTH), nY0 + nHeight, 0xffffffff, MicroProfileBoxTypeFlat);\n\t\tMicroProfileDrawBox(nX+1, nY0+1, nX + MICROPROFILE_COUNTER_WIDTH - 1, nY0 + nHeight - 1, nBackColor, MicroProfileBoxTypeFlat);\n\t\tMicroProfileDrawBox(nX+1, nY0+1, nX + (int)(fCounterPrc * (MICROPROFILE_COUNTER_WIDTH - 1)), nY0 + nHeight - 1, 0xff0088ff, MicroProfileBoxTypeFlat);\n\t\tnX += MICROPROFILE_COUNTER_WIDTH + 5;\n\t}\n\telse\n\t{\n\t\tnX += MICROPROFILE_TEXT_WIDTH+1;\n\t\tnX += 2 * (MICROPROFILE_TEXT_WIDTH+1);\n\t\tnX += nLimitWidth;\n\t\tnX += MICROPROFILE_COUNTER_WIDTH + 5;\n\t}\n\n\tif(bInside && (UI.nMouseLeft || UI.nMouseRight))\n\t{\n\t\tif(UI.nMouseX > nX)\n\t\t{\n\t\t\tif(UI.nMouseRight)\n\t\t\t{\n\t\t\t\tCI.nFlags &= ~MICROPROFILE_COUNTER_FLAG_DETAILED;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// toggle through detailed & detailed graph\n\t\t\t\tif(CI.nFlags & MICROPROFILE_COUNTER_FLAG_DETAILED)\n\t\t\t\t{\n\t\t\t\t\tCI.nFlags ^= MICROPROFILE_COUNTER_FLAG_DETAILED_GRAPH;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tCI.nFlags |= MICROPROFILE_COUNTER_FLAG_DETAILED;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(0 == (CI.nFlags & MICROPROFILE_COUNTER_FLAG_DETAILED))\n\t\t\t{\n\t\t\t\tCI.nFlags &= ~MICROPROFILE_COUNTER_FLAG_DETAILED_GRAPH;\n\t\t\t}\n\t\t}\n\t\telse if(UI.nMouseLeft)\n\t\t{\n\t\t\tCI.nFlags ^= MICROPROFILE_COUNTER_FLAG_CLOSED;\n\t\t}\n\t}\n\n#if MICROPROFILE_COUNTER_HISTORY\n\tif(0 != (CI.nFlags & MICROPROFILE_COUNTER_FLAG_DETAILED))\n\t{\n\t\tstatic float pGraphData[MICROPROFILE_GRAPH_HISTORY*2];\n\t\tstatic float pGraphFillData[MICROPROFILE_GRAPH_HISTORY*4];\n\n\t\tint32_t nMouseGraph = UI.nMouseX - nX;\n\n\n\t\tint64_t nCounterMax = S.nCounterMax[nIndex];\n\t\tint64_t nCounterMin = S.nCounterMin[nIndex];\n\t\tuint32_t nBaseIndex = S.nCounterHistoryPut;\n\t\tfloat fX = (float)nX;\n\n\t\tint64_t nCounterHeightBase = nCounterMax;\n\t\tint64_t nCounterOffset = 0;\n\t\tif(nCounterMin < 0)\n\t\t{\n\t\t\tnCounterHeightBase = nCounterMax - nCounterMin;\n\t\t\tnCounterOffset = -nCounterMin;\n\t\t}\n\t\tconst int32_t nGraphHeight = nRows * nHeight;\n\t\tdouble fRcpMax = nGraphHeight * 1.0 / nCounterHeightBase;\n\t\tconst int32_t nYOffset = nY0 + (bGraphDetailed ? 3 : 1);\n\t\tconst int32_t nYBottom = nGraphHeight + nYOffset;\n\t\tfor(uint32_t i = 0; i < MICROPROFILE_GRAPH_HISTORY; ++i)\n\t\t{\n\t\t\tuint32_t nHistoryIndex = (nBaseIndex + i) % MICROPROFILE_GRAPH_HISTORY;\n\t\t\tint64_t nValue = MicroProfileClamp(S.nCounterHistory[nHistoryIndex][nIndex], nCounterMin, nCounterMax);\n\t\t\tfloat fPrc = nGraphHeight - (float)((double)(nValue+nCounterOffset) * fRcpMax);\n\t\t\tpGraphData[(i*2)] = fX;\n\t\t\tpGraphData[(i*2)+1] = nYOffset + fPrc;\n\n\t\t\tpGraphFillData[(i*4) + 0] = fX;\n\t\t\tpGraphFillData[(i*4) + 1] = nYOffset + fPrc;\n\t\t\tpGraphFillData[(i*4) + 2] = fX;\n\t\t\tpGraphFillData[(i*4) + 3] = (float)nYBottom;\n\n\t\t\tfX += 1;\n\t\t}\n\t\tMicroProfileDrawLine2D(MICROPROFILE_GRAPH_HISTORY*2, pGraphFillData, 0x330088ff);\n\t\tMicroProfileDrawLine2D(MICROPROFILE_GRAPH_HISTORY, pGraphData, 0xff0088ff);\n\n\t\tif(nMouseGraph < MICROPROFILE_GRAPH_HISTORY && bInside && nCounterMin <= nCounterMax)\n\t\t{\n\t\t\tuint32_t nMouseX = nX + nMouseGraph;\n\t\t\tfloat fMouseX = (float)nMouseX;\n\t\t\tuint32_t nHistoryIndex = (nBaseIndex + nMouseGraph) % MICROPROFILE_GRAPH_HISTORY;\n\t\t\tint64_t nValue = MicroProfileClamp(S.nCounterHistory[nHistoryIndex][nIndex], nCounterMin, nCounterMax);\n\t\t\tfloat fPrc = nGraphHeight - (float)((double)(nValue+nCounterOffset) * fRcpMax);\n\t\t\tfloat fCursor[4];\n\t\t\tfCursor[0] = fMouseX-2.f;\n\t\t\tfCursor[1] = nYOffset + fPrc + 2.f;\n\t\t\tfCursor[2] = fMouseX+2.f;\n\t\t\tfCursor[3] = nYOffset + fPrc - 2.f;\n\t\t\tMicroProfileDrawLine2D(2, fCursor, 0xddff8800);\n\t\t\tfCursor[0] = fMouseX+2.f;\n\t\t\tfCursor[1] = nYOffset + fPrc + 2.f;\n\t\t\tfCursor[2] = fMouseX-2.f;\n\t\t\tfCursor[3] = nYOffset + fPrc - 2.f;\n\t\t\tMicroProfileDrawLine2D(2, fCursor, 0xddff8800);\n\t\t\tint nLen = MicroProfileFormatCounter(S.CounterInfo[nIndex].eFormat, nValue, buffer, sizeof(buffer));\n\t\t\tMicroProfileDrawText(nX, nY0, 0xffffffff, buffer, nLen);\n\t\t}\n\n\n\t\tnX += MICROPROFILE_GRAPH_HISTORY + 5;\n\t\tif(nCounterMin <= nCounterMax)\n\t\t{\n\t\t\tint nLen = MicroProfileFormatCounter(S.CounterInfo[nIndex].eFormat, nCounterMin, buffer, sizeof(buffer));\n\t\t\tMicroProfileDrawText(nX, nY0, 0xffffffff, buffer, nLen);\n\t\t\tnX += nCounterWidth;\n\t\t\tnLen = MicroProfileFormatCounter(S.CounterInfo[nIndex].eFormat, nCounterMax, buffer, sizeof(buffer));\n\t\t\tMicroProfileDrawText(nX, nY0, 0xffffffff, buffer, nLen);\n\t\t}\n\n\t}\n#endif\n\n\tnOffset += nRows;\n\tif(0 == (CI.nFlags & MICROPROFILE_COUNTER_FLAG_CLOSED))\n\t{\n\t\tint nChild = CI.nFirstChild;\t\n\t\twhile(nChild != -1)\n\t\t{\n\t\t\tnOffset = MicroProfileDrawCounterRecursive(nChild, nY, nOffset, nTimerWidth);\n\t\t\tnChild = S.CounterInfo[nChild].nSibling;\n\t\t}\n\t}\n\n\n\treturn nOffset;\n}\n\nvoid MicroProfileDrawCounterView(uint32_t nScreenWidth, uint32_t nScreenHeight)\n{\n\t(void)nScreenWidth;\n\t(void)nScreenHeight;\n\n\tMicroProfile& S = *MicroProfileGet();\n\tMICROPROFILE_SCOPE(g_MicroProfileDrawBarView);\n\n\tUI.nCounterWidthTemp = 7;\n\tUI.nLimitWidthTemp = 7;\n\tconst uint32_t nHeight = MICROPROFILE_TEXT_HEIGHT;\n\tuint32_t nTimerWidth = 7 * (MICROPROFILE_TEXT_WIDTH+1);\n\tfor(uint32_t i = 0; i < S.nNumCounters; ++i)\n\t{\n\t\tuint32_t nWidth = (2+S.CounterInfo[i].nNameLen + MICROPROFILE_COUNTER_INDENT*S.CounterInfo[i].nLevel) * (MICROPROFILE_TEXT_WIDTH+1);\n\t\tnTimerWidth = MicroProfileMax(nTimerWidth, nWidth);\n\t}\n\tuint32_t nX = nTimerWidth + UI.nOffsetX[MP_DRAW_COUNTERS];\n\tuint32_t nY = nHeight + 3 - UI.nOffsetY[MP_DRAW_COUNTERS];\t\n\tuint32_t nNumCounters = S.nNumCounters;\n\tnX = 0;\n\tnY = (2*nHeight) + 3 - UI.nOffsetY[MP_DRAW_COUNTERS];\t\n\tuint32_t nOffset = 0;\n\tfor(uint32_t i = 0; i < nNumCounters; ++i)\n\t{\n\t\tif(S.CounterInfo[i].nParent == -1)\n\t\t{\n\t\t\tnOffset = MicroProfileDrawCounterRecursive(i, nY, nOffset, nTimerWidth);\n\t\t}\n\t}\n\tnX = 0;\n\tMicroProfileDrawHeader(nX, nTimerWidth, \"Name\");\n\tnX += nTimerWidth;\n\tMicroProfileDrawHeader(nX, UI.nCounterWidth + 1 * (MICROPROFILE_TEXT_WIDTH*3), \"Value\");\n\tnX += UI.nCounterWidth;\n\tnX += 1 * (MICROPROFILE_TEXT_WIDTH*3);\n\tMicroProfileDrawHeader(nX, UI.nLimitWidth + MICROPROFILE_COUNTER_WIDTH, \"Limit\");\n\tnX += UI.nLimitWidth + MICROPROFILE_COUNTER_WIDTH + 4;\n\tMicroProfileDrawHeader(nX, MICROPROFILE_GRAPH_HISTORY, \"Graph\");\n\tnX += MICROPROFILE_GRAPH_HISTORY + 4;\n\tMicroProfileDrawHeader(nX, UI.nCounterWidth , \"Min\");\n\tnX += UI.nCounterWidth;\n\tMicroProfileDrawHeader(nX, UI.nCounterWidth , \"Max\");\n\tnX += UI.nCounterWidth;\n\tuint32_t nTotalWidth = nX;//nTimerWidth + UI.nCounterWidth + MICROPROFILE_COUNTER_WIDTH + UI.nLimitWidth + 3 * (MICROPROFILE_TEXT_WIDTH+1);\n\n\n\n\tMicroProfileDrawLineVertical(nTimerWidth-2, 0, nOffset*(nHeight+1)+nY, UI.nOpacityBackground|g_nMicroProfileBackColors[0]|g_nMicroProfileBackColors[1]);\n\tMicroProfileDrawLineHorizontal(0, nTotalWidth, 2*MICROPROFILE_TEXT_HEIGHT + 3, UI.nOpacityBackground|g_nMicroProfileBackColors[0]|g_nMicroProfileBackColors[1]);\n\n\tUI.nCounterWidth = (1+UI.nCounterWidthTemp) * (MICROPROFILE_TEXT_WIDTH+1);\n\tUI.nLimitWidth = (1+UI.nLimitWidthTemp) * (MICROPROFILE_TEXT_WIDTH+1);\n\n}\n\n\n\nvoid MicroProfileDrawBarView(uint32_t nScreenWidth, uint32_t nScreenHeight)\n{\n\t(void)nScreenWidth;\n\t(void)nScreenHeight;\n\n\tMicroProfile& S = *MicroProfileGet();\n\n\tuint64_t nActiveGroup = S.nAllGroupsWanted ? S.nGroupMask : S.nActiveGroupWanted;\n\tif(!nActiveGroup)\n\t\treturn;\n\tMICROPROFILE_SCOPE(g_MicroProfileDrawBarView);\n\n\tconst uint32_t nHeight = MICROPROFILE_TEXT_HEIGHT;\n\tint nColorIndex = 0;\n\tuint32_t nMaxTimerNameLen = 1;\n\tuint32_t nNumTimers = 0;\n\tuint32_t nNumGroups = 0;\n\tfor(uint32_t j = 0; j < MICROPROFILE_MAX_GROUPS; ++j)\n\t{\n\t\tif(nActiveGroup & (1ll << j))\n\t\t{\n\t\t\tnNumTimers += S.GroupInfo[j].nNumTimers;\n\t\t\tnNumGroups += 1;\n\t\t\tnMaxTimerNameLen = MicroProfileMax(nMaxTimerNameLen, S.GroupInfo[j].nMaxTimerNameLen);\n\t\t}\n\t}\n\tuint32_t nTimerWidth = 2+(4+nMaxTimerNameLen) * (MICROPROFILE_TEXT_WIDTH+1);\n\tuint32_t nX = nTimerWidth + UI.nOffsetX[MP_DRAW_BARS];\n\tuint32_t nY = nHeight + 3 - UI.nOffsetY[MP_DRAW_BARS];\t\n\tuint32_t nBlockSize = 2 * nNumTimers;\n\tfloat* pTimers = (float*)alloca(nBlockSize * 8 * sizeof(float));\n\tfloat* pAverage = pTimers + nBlockSize;\n\tfloat* pMax = pTimers + 2 * nBlockSize;\n\tfloat* pMin = pTimers + 3 * nBlockSize;\n\tfloat* pCallAverage = pTimers + 4 * nBlockSize;\n\tfloat* pTimersExclusive = pTimers + 5 * nBlockSize;\n\tfloat* pAverageExclusive = pTimers + 6 * nBlockSize;\n\tfloat* pMaxExclusive = pTimers + 7 * nBlockSize;\n\tMicroProfileCalcTimers(pTimers, pAverage, pMax, pMin, pCallAverage, pTimersExclusive, pAverageExclusive, pMaxExclusive, nActiveGroup, nBlockSize);\n\tuint32_t nWidth = 0;\n\t{\n\t\tuint32_t nMetaIndex = 0;\n\t\tfor(uint32_t i = 1; i ; i <<= 1)\n\t\t{\n\t\t\tif(S.nBars & i)\n\t\t\t{\n\t\t\t\tif(i >= MP_DRAW_META_FIRST)\n\t\t\t\t{\n\t\t\t\t\tif(nMetaIndex < MICROPROFILE_META_MAX && S.MetaCounters[nMetaIndex].pName)\n\t\t\t\t\t{\n\t\t\t\t\t\tuint32_t nStrWidth = (uint32_t)strlen(S.MetaCounters[nMetaIndex].pName);\n\t\t\t\t\t\tif(S.nBars & MP_DRAW_TIMERS)\n\t\t\t\t\t\t\tnWidth += 6 + (1+MICROPROFILE_TEXT_WIDTH) * (nStrWidth);\n\t\t\t\t\t\tif(S.nBars & MP_DRAW_AVERAGE)\n\t\t\t\t\t\t\tnWidth += 6 + (1+MICROPROFILE_TEXT_WIDTH) * (nStrWidth + 4);\n\t\t\t\t\t\tif(S.nBars & MP_DRAW_MAX)\n\t\t\t\t\t\t\tnWidth += 6 + (1+MICROPROFILE_TEXT_WIDTH) * (nStrWidth + 4);\n\t\t\t\t\t\tif (S.nBars & MP_DRAW_MIN)\n\t\t\t\t\t\t\tnWidth += 6 + (1 + MICROPROFILE_TEXT_WIDTH) * (nStrWidth + 4);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tnWidth += MICROPROFILE_BAR_WIDTH + 6 + 6 * (1+MICROPROFILE_TEXT_WIDTH);\n\t\t\t\t\tif(i & MP_DRAW_CALL_COUNT)\n\t\t\t\t\t\tnWidth += 6 + 6 * MICROPROFILE_TEXT_WIDTH;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(i >= MP_DRAW_META_FIRST)\n\t\t\t{\n\t\t\t\t++nMetaIndex;\n\t\t\t}\n\t\t}\n\t\tnWidth += (1+nMaxTimerNameLen) * (MICROPROFILE_TEXT_WIDTH+1);\n\t\tfor(uint32_t i = 0; i < nNumTimers+nNumGroups+1; ++i)\n\t\t{\n\t\t\tuint32_t nY0 = nY + i * (nHeight + 1);\n\t\t\tbool bInside = (UI.nActiveMenu == (uint32_t)-1) && ((UI.nMouseY >= nY0) && (UI.nMouseY < (nY0 + nHeight + 1)));\n\t\t\tMicroProfileDrawBox(nX, nY0, nWidth+nX, nY0 + (nHeight+1)+1, UI.nOpacityBackground | (g_nMicroProfileBackColors[nColorIndex++ & 1] + ((bInside) ? 0x002c2c2c : 0)));\n\t\t}\n\t\tnX += 10;\n\t}\n\tint nTotalHeight = (nNumTimers+nNumGroups+1) * (nHeight+1);\n\tuint32_t nLegendOffset = 1;\n\tif(S.nBars & MP_DRAW_TIMERS)\t\t\n\t\tnX += MicroProfileDrawBarArray(nX, nY, pTimers, \"Time\", nTotalHeight) + 1;\n\tif(S.nBars & MP_DRAW_AVERAGE)\t\t\n\t\tnX += MicroProfileDrawBarArray(nX, nY, pAverage, \"Average\", nTotalHeight) + 1;\n\tif(S.nBars & MP_DRAW_MAX)\t\t\n\t\tnX += MicroProfileDrawBarArray(nX, nY, pMax, (!UI.bShowSpikes) ? \"Max Time\" : \"Max Time, Spike\", nTotalHeight, UI.bShowSpikes ? pAverage : NULL) + 1;\n\tif (S.nBars & MP_DRAW_MIN)\n\t\tnX += MicroProfileDrawBarArray(nX, nY, pMin, (!UI.bShowSpikes) ? \"Min Time\" : \"Min Time, Spike\", nTotalHeight, UI.bShowSpikes ? pAverage : NULL) + 1;\n\tif(S.nBars & MP_DRAW_CALL_COUNT)\t\t\n\t{\n\t\tnX += MicroProfileDrawBarArray(nX, nY, pCallAverage, \"Call Average\", nTotalHeight) + 1;\n\t\tnX += MicroProfileDrawBarCallCount(nX, nY, \"Count\") + 1; \n\t}\n\tif(S.nBars & MP_DRAW_TIMERS_EXCLUSIVE)\t\t\n\t\tnX += MicroProfileDrawBarArray(nX, nY, pTimersExclusive, \"Exclusive Time\", nTotalHeight) + 1;\n\tif(S.nBars & MP_DRAW_AVERAGE_EXCLUSIVE)\t\t\n\t\tnX += MicroProfileDrawBarArray(nX, nY, pAverageExclusive, \"Exclusive Average\", nTotalHeight) + 1;\n\tif(S.nBars & MP_DRAW_MAX_EXCLUSIVE)\t\t\n\t\tnX += MicroProfileDrawBarArray(nX, nY, pMaxExclusive, (!UI.bShowSpikes) ? \"Exclusive Max Time\" :\"Excl Max Time, Spike\", nTotalHeight, UI.bShowSpikes ? pAverageExclusive : NULL) + 1;\n\n\tfor(int i = 0; i < MICROPROFILE_META_MAX; ++i)\n\t{\n\t\tif(0 != (S.nBars & (MP_DRAW_META_FIRST<<i)) && S.MetaCounters[i].pName)\n\t\t{\n\t\t\tuint32_t nBufferSize = (uint32_t)strlen(S.MetaCounters[i].pName) + 32;\n\t\t\tchar* buffer = (char*)alloca(nBufferSize);\n\t\t\tif(S.nBars & MP_DRAW_TIMERS)\n\t\t\t\tnX += MicroProfileDrawBarMetaCount(nX, nY, &S.MetaCounters[i].nCounters[0], S.MetaCounters[i].pName, nTotalHeight) + 1; \n\t\t\tif(S.nBars & MP_DRAW_AVERAGE)\n\t\t\t{\n\t\t\t\tsnprintf(buffer, nBufferSize-1, \"%s Avg\", S.MetaCounters[i].pName);\n\t\t\t\tnX += MicroProfileDrawBarMetaAverage(nX, nY, &S.MetaCounters[i].nAggregate[0], buffer, nTotalHeight) + 1; \n\t\t\t}\n\t\t\tif(S.nBars & MP_DRAW_MAX)\t\t\t\t\n\t\t\t{\n\t\t\t\tsnprintf(buffer, nBufferSize-1, \"%s Max\", S.MetaCounters[i].pName);\n\t\t\t\tnX += MicroProfileDrawBarMetaCount(nX, nY, &S.MetaCounters[i].nAggregateMax[0], buffer, nTotalHeight) + 1; \n\t\t\t}\n\t\t}\n\t}\n\tnX = 0;\n\tnY = nHeight + 3 - UI.nOffsetY[MP_DRAW_BARS];\t\n\tfor(uint32_t i = 0; i < nNumTimers+nNumGroups+1; ++i)\n\t{\n\t\tuint32_t nY0 = nY + i * (nHeight + 1);\n\t\tbool bInside = (UI.nActiveMenu == (uint32_t)-1) && ((UI.nMouseY >= nY0) && (UI.nMouseY < (nY0 + nHeight + 1)));\n\t\tMicroProfileDrawBox(nX, nY0, nTimerWidth, nY0 + (nHeight+1)+1, 0xff000000 | (g_nMicroProfileBackColors[nColorIndex++ & 1] + ((bInside) ? 0x002c2c2c : 0)));\n\t}\n\tnX += MicroProfileDrawBarLegend(nX, nY, nTotalHeight, nTimerWidth-5) + 1;\n\n\tfor(uint32_t j = 0; j < MICROPROFILE_MAX_GROUPS; ++j)\n\t{\n\t\tif(nActiveGroup & (1ll << j))\n\t\t{\n\t\t\tMicroProfileDrawText(nX, nY + (1+nHeight) * nLegendOffset, (uint32_t)-1, S.GroupInfo[j].pName, S.GroupInfo[j].nNameLen);\n\t\t\tnLegendOffset += S.GroupInfo[j].nNumTimers+1;\n\t\t}\n\t}\n\tMicroProfileDrawHeader(nX, nTimerWidth-5, \"Group\");\n\tMicroProfileDrawTextRight(nTimerWidth-3, MICROPROFILE_TEXT_HEIGHT + 2, (uint32_t)-1, \"Timer\", 5);\n\tMicroProfileDrawLineVertical(nTimerWidth, 0, nTotalHeight+nY, UI.nOpacityBackground|g_nMicroProfileBackColors[0]|g_nMicroProfileBackColors[1]);\n\tMicroProfileDrawLineHorizontal(0, nWidth, 2*MICROPROFILE_TEXT_HEIGHT + 3, UI.nOpacityBackground|g_nMicroProfileBackColors[0]|g_nMicroProfileBackColors[1]);\n}\n\ntypedef const char* (*MicroProfileSubmenuCallback)(int, bool* bSelected); \ntypedef void (*MicroProfileClickCallback)(int);\n\nconst char* MicroProfileUIMenuMode(int nIndex, bool* bSelected)\n{\n\tMicroProfile& S = *MicroProfileGet();\n\tswitch(nIndex)\n\t{\n\t\tcase 0: \n\t\t\t*bSelected = S.nDisplay == MP_DRAW_DETAILED;\n\t\t\treturn \"Detailed\";\n\t\tcase 1:\n\t\t\t*bSelected = S.nDisplay == MP_DRAW_BARS;\n\t\t\treturn \"Timers\";\n\t\tcase 2:\n\t\t\t*bSelected = S.nDisplay == MP_DRAW_COUNTERS; \n\t\t\treturn \"Counters\";\n\t\tcase 3:\n\t\t\t*bSelected = S.nDisplay == MP_DRAW_FRAME; \n\t\t\treturn \"Frame\";\n\t\tcase 4:\n\t\t\t*bSelected = S.nDisplay == MP_DRAW_HIDDEN; \n\t\t\treturn \"Hidden\";\n\t\tcase 5:\n\t\t\t*bSelected = false; \n\t\t\treturn \"Off\";\n\t\tcase 6:\n\t\t\t*bSelected = false;\n\t\t\treturn \"------\";\n\t\tcase 7:\n\t\t\t*bSelected = S.nForceEnable != 0;\n\t\t\treturn \"Force Enable\";\n\n\t\tdefault: return 0;\n\t}\n}\n\nconst char* MicroProfileUIMenuGroups(int nIndex, bool* bSelected)\n{\n\tMicroProfile& S = *MicroProfileGet();\n\t*bSelected = false;\n\tif(nIndex == 0)\n\t{\n\t\t*bSelected = S.nAllGroupsWanted != 0;\n\t\treturn \"[ALL]\";\n\t}\n\telse\n\t{\n\t\tnIndex = nIndex-1;\n\t\tif(nIndex < (int)UI.GroupMenuCount)\n\t\t{\n\t\t\tMicroProfileGroupMenuItem& Item = UI.GroupMenu[nIndex];\n\t\t\tstatic char buffer[MICROPROFILE_NAME_MAX_LEN+32];\n\t\t\tif(Item.nIsCategory)\n\t\t\t{\n\t\t\t\tuint64_t nGroupMask = S.CategoryInfo[Item.nIndex].nGroupMask;\n\t\t\t\t*bSelected = nGroupMask == (nGroupMask & S.nActiveGroupWanted);\n\t\t\t\tsnprintf(buffer, sizeof(buffer)-1, \"[%s]\", Item.pName);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t*bSelected = 0 != (S.nActiveGroupWanted & (1ll << Item.nIndex));\n\t\t\t\tsnprintf(buffer, sizeof(buffer)-1, \"   %s\", Item.pName);\n\t\t\t}\n\t\t\treturn buffer;\n\t\t}\n\t\treturn 0;\n\t}\t\n}\n\nconst char* MicroProfileUIMenuAggregate(int nIndex, bool* bSelected)\n{\n\tMicroProfile& S = *MicroProfileGet();\n\tint nNumPresets = (int)sizeof(g_MicroProfileAggregatePresets) / (int)sizeof(g_MicroProfileAggregatePresets[0]);\n\tif(nIndex < nNumPresets)\n\t{\n\t\tint val = g_MicroProfileAggregatePresets[nIndex];\n\t\t*bSelected = (int)S.nAggregateFlip == val;\n\t\tif(0 == val)\n\t\t\treturn \"Infinite\";\n\t\telse\n\t\t{\n\t\t\tstatic char buf[128];\n\t\t\tsnprintf(buf, sizeof(buf)-1, \"%7d\", val);\n\t\t\treturn buf;\n\t\t}\n\t}\n\treturn 0;\n\n}\n\nconst char* MicroProfileUIMenuTimers(int nIndex, bool* bSelected)\n{\n\tMicroProfile& S = *MicroProfileGet();\n\n\tif(nIndex < 8)\n\t{\n\t\tstatic const char* kNames[] = { \"Time\", \"Average\", \"Max\", \"Min\", \"Call Count\", \"Exclusive Timers\", \"Exclusive Average\", \"Exclusive Max\" };\n\n\t\t*bSelected = 0 != (S.nBars & (1 << nIndex));\n\t\treturn kNames[nIndex];\n\t}\n\telse if(nIndex == 8)\n\t{\n\t\t*bSelected = false;\n\t\treturn \"------\";\n\t}\n\telse\n\t{\n\t\tint nMetaIndex = nIndex - 9;\n\t\tif(nMetaIndex < MICROPROFILE_META_MAX)\n\t\t{\n\t\t\t*bSelected = 0 != (S.nBars & (MP_DRAW_META_FIRST << nMetaIndex));\n\t\t\treturn S.MetaCounters[nMetaIndex].pName;\n\t\t}\n\t}\n\treturn 0;\t\n}\n\nconst char* MicroProfileUIMenuOptions(int nIndex, bool* bSelected)\n{\n\tMicroProfile& S = *MicroProfileGet();\n\tif(nIndex >= MICROPROFILE_OPTION_SIZE) return 0;\n\tswitch(UI.Options[nIndex].nSubType)\n\t{\n\tcase 0:\n\t\t*bSelected = S.fReferenceTime == g_MicroProfileReferenceTimePresets[UI.Options[nIndex].nIndex];\n\t\tbreak;\n\tcase 1:\n\t\t*bSelected = UI.nOpacityBackground>>24 == g_MicroProfileOpacityPresets[UI.Options[nIndex].nIndex];\n\t\tbreak;\n\tcase 2:\n\t\t*bSelected = UI.nOpacityForeground>>24 == g_MicroProfileOpacityPresets[UI.Options[nIndex].nIndex];\t\t\t\t\n\t\tbreak;\n\tcase 3:\n\t\t*bSelected = UI.bShowSpikes;\n\t\tbreak;\n#if MICROPROFILE_CONTEXT_SWITCH_TRACE\n\tcase 4:\n\t\t{\n\t\t\tswitch(UI.Options[nIndex].nIndex)\n\t\t\t{\n\t\t\tcase 0:\n\t\t\t\t*bSelected = S.bContextSwitchAllThreads;\n\t\t\t\tbreak;\n\t\t\tcase 1: \n\t\t\t\t*bSelected = S.bContextSwitchNoBars;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tbreak;\n#endif\n\t}\n\treturn UI.Options[nIndex].Text;\n}\n\nconst char* MicroProfileUIMenuPreset(int nIndex, bool* bSelected)\n{\n\tstatic char buf[128];\n\t*bSelected = false;\n\tint nNumPresets = sizeof(g_MicroProfilePresetNames) / sizeof(g_MicroProfilePresetNames[0]);\n\tint nIndexSave = nIndex - nNumPresets - 1;\n\tif(nIndex == nNumPresets)\n\t\treturn \"--\";\n\telse if(nIndexSave >=0 && nIndexSave <nNumPresets)\n\t{\n\t\tsnprintf(buf, sizeof(buf)-1, \"Save '%s'\", g_MicroProfilePresetNames[nIndexSave]);\n\t\treturn buf;\n\t}\n\telse if(nIndex < nNumPresets)\n\t{\n\t\tsnprintf(buf, sizeof(buf)-1, \"Load '%s'\", g_MicroProfilePresetNames[nIndex]);\n\t\treturn buf;\n\t}\n\telse\n\t{\n\t\treturn 0;\n\t}\n}\n\nconst char* MicroProfileUIMenuCustom(int nIndex, bool* bSelected)\n{\n\tif((uint32_t)-1 == UI.nCustomActive)\n\t{\n\t\t*bSelected = nIndex == 0;\n\t}\n\telse\n\t{\n\t\t*bSelected = nIndex-2 == (int)UI.nCustomActive;\n\t}\n\tswitch(nIndex)\n\t{\n\tcase 0: return \"Disable\";\n\tcase 1: return \"--\";\n\tdefault:\n\t\tnIndex -= 2;\n\t\tif(nIndex < (int)UI.nCustomCount)\n\t\t{\n\t\t\treturn UI.Custom[nIndex].pName;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\t}\n}\n\nconst char* MicroProfileUIMenuDump(int nIndex, bool* bSelected)\n{\n\tstatic char buf[128];\n\t*bSelected = false;\n\n\tif(nIndex < 5)\n\t{\n\t\tsnprintf(buf, sizeof(buf)-1, \"%d frames\", 32 << nIndex);\n\t\treturn buf;\n\t}\n\telse\n\t{\n\t\treturn 0;\n\t}\n}\n\nvoid MicroProfileUIClickMode(int nIndex)\n{\n\tMicroProfile& S = *MicroProfileGet();\t\t\t\n\tswitch(nIndex)\n\t{\n\t\tcase 0:\n\t\t\tS.nDisplay = MP_DRAW_DETAILED;\n\t\t\tbreak;\n\t\tcase 1:\n\t\t\tS.nDisplay = MP_DRAW_BARS;\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tS.nDisplay = MP_DRAW_COUNTERS;\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tS.nDisplay = MP_DRAW_FRAME;\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\tS.nDisplay = MP_DRAW_HIDDEN;\n\t\t\tbreak;\n\t\tcase 5:\n\t\t\tS.nDisplay = 0;\n\t\t\tbreak;\n\t\tcase 6:\n\t\t\tbreak;\n\t\tcase 7:\n\t\t\tS.nForceEnable = !S.nForceEnable;\n\t\t\tbreak;\n\t}\n}\n\nvoid MicroProfileUIClickGroups(int nIndex)\n{\n\tMicroProfile& S = *MicroProfileGet();\t\t\t\n\tif(nIndex == 0)\n\t\tS.nAllGroupsWanted = 1-S.nAllGroupsWanted;\n\telse\n\t{\n\t\tnIndex -= 1;\n\t\tif(nIndex < (int)UI.GroupMenuCount)\n\t\t{\n\t\t\tMicroProfileGroupMenuItem& Item = UI.GroupMenu[nIndex];\n\t\t\tif(Item.nIsCategory)\n\t\t\t{\n\t\t\t\tuint64_t nGroupMask = S.CategoryInfo[Item.nIndex].nGroupMask;\n\t\t\t\tif(nGroupMask != (nGroupMask & S.nActiveGroupWanted))\n\t\t\t\t{\n\t\t\t\t\tS.nActiveGroupWanted |= nGroupMask;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tS.nActiveGroupWanted &= ~nGroupMask;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tMP_ASSERT(Item.nIndex < S.nGroupCount);\n\t\t\t\tS.nActiveGroupWanted ^= (1ll << Item.nIndex);\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid MicroProfileUIClickAggregate(int nIndex)\n{\n\tMicroProfile& S = *MicroProfileGet();\t\t\t\n\tS.nAggregateFlip = g_MicroProfileAggregatePresets[nIndex];\n\tif(0 == S.nAggregateFlip)\n\t{\n\t\tS.nAggregateClear = 1;\n\t}\n}\n\nvoid MicroProfileUIClickTimers(int nIndex)\n{\n\tMicroProfile& S = *MicroProfileGet();\n\n\tif(nIndex < 8)\n\t{\n\t\tS.nBars ^= (1 << nIndex);\n\t}\n\telse if(nIndex != 8)\n\t{\n\t\tint nMetaIndex = nIndex - 9;\n\t\tif(nMetaIndex < MICROPROFILE_META_MAX)\n\t\t{\n\t\t\tS.nBars ^= (MP_DRAW_META_FIRST << nMetaIndex);\n\t\t}\n\t}\n}\n\nvoid MicroProfileUIClickOptions(int nIndex)\n{\n\tMicroProfile& S = *MicroProfileGet();\t\t\t\n\tswitch(UI.Options[nIndex].nSubType)\n\t{\n\tcase 0:\n\t\tS.fReferenceTime = g_MicroProfileReferenceTimePresets[UI.Options[nIndex].nIndex];\n\t\tS.fRcpReferenceTime = 1.f / S.fReferenceTime;\n\t\tbreak;\n\tcase 1:\n\t\tUI.nOpacityBackground = g_MicroProfileOpacityPresets[UI.Options[nIndex].nIndex]<<24;\n\t\tbreak;\n\tcase 2:\n\t\tUI.nOpacityForeground = g_MicroProfileOpacityPresets[UI.Options[nIndex].nIndex]<<24;\n\t\tbreak;\n\tcase 3:\n\t\tUI.bShowSpikes = !UI.bShowSpikes;\n\t\tbreak;\n#if MICROPROFILE_CONTEXT_SWITCH_TRACE\n\tcase 4:\n\t\t{\n\t\t\tswitch(UI.Options[nIndex].nIndex)\n\t\t\t{\n\t\t\tcase 0:\n\t\t\t\tS.bContextSwitchAllThreads = !S.bContextSwitchAllThreads;\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\tS.bContextSwitchNoBars= !S.bContextSwitchNoBars;\n\t\t\t\tbreak;\n\n\t\t\t}\n\t\t}\n\t\tbreak;\n#endif\n\t}\n}\n\nvoid MicroProfileUIClickPreset(int nIndex)\n{\n\tint nNumPresets = sizeof(g_MicroProfilePresetNames) / sizeof(g_MicroProfilePresetNames[0]);\n\tint nIndexSave = nIndex - nNumPresets - 1;\n\tif(nIndexSave >= 0 && nIndexSave < nNumPresets)\n\t{\n\t\tMicroProfileSavePreset(g_MicroProfilePresetNames[nIndexSave]);\n\t}\n\telse if(nIndex >= 0 && nIndex < nNumPresets)\n\t{\n\t\tMicroProfileLoadPreset(g_MicroProfilePresetNames[nIndex]);\n\t}\n}\n\nvoid MicroProfileUIClickCustom(int nIndex)\n{\n\tif(nIndex == 0)\n\t{\n\t\tMicroProfileCustomGroupDisable();\n\t}\n\telse\n\t{\n\t\tMicroProfileCustomGroupEnable(nIndex-2);\n\t}\n}\n\nvoid MicroProfileUIClickDump(int nIndex)\n{\n\ttime_t t = time(0);\n\n\tchar Name[128] = {};\n\tstrftime(Name, sizeof(Name), \"microprofile-%Y%m%d-%H%M%S.html\", localtime(&t));\n\n\tchar Path[512] = {};\n\tconst char* pHome = getenv(\"HOME\");\n\tconst char* pHomeDrive = getenv(\"HOMEDRIVE\");\n\tconst char* pHomePath = getenv(\"HOMEPATH\");\n\tif(pHome)\n\t{\n\t\tsnprintf(Path, sizeof(Path)-1, \"%s/%s\", pHome, Name);\n\t}\n\telse if(pHomeDrive && pHomePath)\n\t{\n\t\tsnprintf(Path, sizeof(Path)-1, \"%s%s/%s\", pHomeDrive, pHomePath, Name);\n\t}\n\telse\n\t{\n\t\tsnprintf(Path, sizeof(Path)-1, \"%s\", Name);\n\t}\n\n\tMicroProfileDumpFile(Path, MicroProfileDumpTypeHtml, 32 << nIndex);\n}\n\nvoid MicroProfileDrawMenu(uint32_t nWidth, uint32_t nHeight)\n{\n\t(void)nWidth;\n\t(void)nHeight;\n\n\tMicroProfile& S = *MicroProfileGet();\n\n\tuint32_t nX = 0;\n\tuint32_t nY = 0;\n#define SBUF_SIZE 256\n\tchar buffer[256];\n\tMicroProfileDrawBox(nX, nY, nX + nWidth, nY + (MICROPROFILE_TEXT_HEIGHT+1)+1, 0xff000000|g_nMicroProfileBackColors[1]);\n\n#define MICROPROFILE_MENU_MAX 16\n\tconst char* pMenuText[MICROPROFILE_MENU_MAX] = {0};\n\tuint32_t \tnMenuX[MICROPROFILE_MENU_MAX] = {0};\n\tuint32_t nNumMenuItems = 0;\n\n\tint nLen = snprintf(buffer, 127, \"MicroProfile\");\n\tMicroProfileDrawText(nX, nY, (uint32_t)-1, buffer, nLen);\n\tnX += (sizeof(\"MicroProfile\")+2) * (MICROPROFILE_TEXT_WIDTH+1);\n\tpMenuText[nNumMenuItems++] = \"Mode\";\n\tpMenuText[nNumMenuItems++] = \"Groups\";\n\tchar AggregateText[64];\n\tsnprintf(AggregateText, sizeof(AggregateText)-1, \"Aggregate[%d]\", S.nAggregateFlip ? S.nAggregateFlip : S.nAggregateFlipCount);\n\tpMenuText[nNumMenuItems++] = &AggregateText[0];\n\tpMenuText[nNumMenuItems++] = \"Timers\";\n\tpMenuText[nNumMenuItems++] = \"Options\";\n\tpMenuText[nNumMenuItems++] = \"Preset\";\n\tpMenuText[nNumMenuItems++] = \"Custom\";\n\tpMenuText[nNumMenuItems++] = \"Dump\";\n\tconst int nPauseIndex = nNumMenuItems;\n\tpMenuText[nNumMenuItems++] = S.nRunning ? \"Pause\" : \"Unpause\";\n\tpMenuText[nNumMenuItems++] = \"Help\";\n\n\tif(S.nOverflow)\n\t{\n\t\tpMenuText[nNumMenuItems++] = \"!BUFFERSFULL!\";\n\t}\n\n\n\tif(UI.GroupMenuCount != S.nGroupCount + S.nCategoryCount)\n\t{\n\t\tUI.GroupMenuCount = S.nGroupCount + S.nCategoryCount;\n\t\tfor(uint32_t i = 0; i < S.nCategoryCount; ++i)\n\t\t{\n\t\t\tUI.GroupMenu[i].nIsCategory = 1;\n\t\t\tUI.GroupMenu[i].nCategoryIndex = i;\n\t\t\tUI.GroupMenu[i].nIndex = i;\n\t\t\tUI.GroupMenu[i].pName = S.CategoryInfo[i].pName;\n\t\t}\n\t\tfor(uint32_t i = 0; i < S.nGroupCount; ++i)\n\t\t{\n\t\t\tuint32_t idx = i + S.nCategoryCount;\n\t\t\tUI.GroupMenu[idx].nIsCategory = 0;\n\t\t\tUI.GroupMenu[idx].nCategoryIndex = S.GroupInfo[i].nCategory;\n\t\t\tUI.GroupMenu[idx].nIndex = i;\n\t\t\tUI.GroupMenu[idx].pName = S.GroupInfo[i].pName;\n\t\t}\n\t\tstd::sort(&UI.GroupMenu[0], &UI.GroupMenu[UI.GroupMenuCount], \n\t\t\t[] (const MicroProfileGroupMenuItem& l, const MicroProfileGroupMenuItem& r) -> bool\n\t\t\t{\n\t\t\t\tif(l.nCategoryIndex < r.nCategoryIndex)\n\t\t\t\t{\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\telse if(r.nCategoryIndex < l.nCategoryIndex)\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif(r.nIsCategory || l.nIsCategory)\n\t\t\t\t{\n\t\t\t\t\treturn l.nIsCategory > r.nIsCategory;\n\t\t\t\t}\n\t\t\t\treturn MP_STRCASECMP(l.pName, r.pName)<0;\n\t\t\t}\n\t\t);\n\t}\n\n\tMicroProfileSubmenuCallback GroupCallback[MICROPROFILE_MENU_MAX] = \n\t{\n\t\tMicroProfileUIMenuMode,\n\t\tMicroProfileUIMenuGroups,\n\t\tMicroProfileUIMenuAggregate,\n\t\tMicroProfileUIMenuTimers,\n\t\tMicroProfileUIMenuOptions,\n\t\tMicroProfileUIMenuPreset,\n\t\tMicroProfileUIMenuCustom,\n\t\tMicroProfileUIMenuDump,\n\t};\n\n\tMicroProfileClickCallback CBClick[MICROPROFILE_MENU_MAX] =\n\t{\n\t\tMicroProfileUIClickMode,\n\t\tMicroProfileUIClickGroups,\n\t\tMicroProfileUIClickAggregate,\n\t\tMicroProfileUIClickTimers,\n\t\tMicroProfileUIClickOptions,\n\t\tMicroProfileUIClickPreset,\n\t\tMicroProfileUIClickCustom,\n\t\tMicroProfileUIClickDump,\n\t};\n\n\n\tuint32_t nSelectMenu = (uint32_t)-1;\n\tfor(uint32_t i = 0; i < nNumMenuItems; ++i)\n\t{\n\t\tnMenuX[i] = nX;\n\t\tuint32_t nLen = (uint32_t)strlen(pMenuText[i]);\n\t\tuint32_t nEnd = nX + nLen * (MICROPROFILE_TEXT_WIDTH+1);\n\t\tif(UI.nMouseY <= MICROPROFILE_TEXT_HEIGHT && UI.nMouseX <= nEnd && UI.nMouseX >= nX)\n\t\t{\n\t\t\tMicroProfileDrawBox(nX-1, nY, nX + nLen * (MICROPROFILE_TEXT_WIDTH+1), nY +(MICROPROFILE_TEXT_HEIGHT+1)+1, 0xff888888);\n\t\t\tnSelectMenu = i;\n\t\t\tif((UI.nMouseLeft || UI.nMouseRight) && (int)i == nPauseIndex)\n\t\t\t{\n\t\t\t\tS.nToggleRunning = 1;\n\t\t\t}\n\t\t}\n\t\tMicroProfileDrawText(nX, nY, (uint32_t)-1, pMenuText[i], (uint32_t)strlen(pMenuText[i]));\n\t\tnX += (nLen+1) * (MICROPROFILE_TEXT_WIDTH+1);\n\t}\n\tuint32_t nMenu = nSelectMenu != (uint32_t)-1 ? nSelectMenu : UI.nActiveMenu;\n\tUI.nActiveMenu = nSelectMenu;\n\tif((uint32_t)-1 != nMenu && GroupCallback[nMenu])\n\t{\n\t\tnX = nMenuX[nMenu];\n\t\tnY += MICROPROFILE_TEXT_HEIGHT+1;\n\t\tMicroProfileSubmenuCallback CB = GroupCallback[nMenu];\n\t\tint nNumLines = 0;\n\t\tbool bSelected = false;\n\t\tconst char* pString = CB(nNumLines, &bSelected);\n\t\tuint32_t nWidth = 0, nHeight = 0;\n\t\twhile(pString)\n\t\t{\n\t\t\tnWidth = MicroProfileMax<int>(nWidth, (int)strlen(pString));\n\t\t\tnNumLines++;\n\t\t\tpString = CB(nNumLines, &bSelected);\n\t\t}\n\t\tnWidth = (2+nWidth) * (MICROPROFILE_TEXT_WIDTH+1);\n\t\tnHeight = nNumLines * (MICROPROFILE_TEXT_HEIGHT+1);\n\t\tif(UI.nMouseY <= nY + nHeight+0 && UI.nMouseY >= nY-0 && UI.nMouseX <= nX + nWidth + 0 && UI.nMouseX >= nX - 0)\n\t\t{\n\t\t\tUI.nActiveMenu = nMenu;\n\t\t}\n\t\tMicroProfileDrawBox(nX, nY, nX + nWidth, nY + nHeight, 0xff000000|g_nMicroProfileBackColors[1]);\n\t\tfor(int i = 0; i < nNumLines; ++i)\n\t\t{\n\t\t\tbool bSelected = false;\n\t\t\tconst char* pString = CB(i, &bSelected);\n\t\t\tif(UI.nMouseY >= nY && UI.nMouseY < nY + MICROPROFILE_TEXT_HEIGHT + 1)\n\t\t\t{\n\t\t\t\tif((UI.nMouseLeft || UI.nMouseRight) && CBClick[nMenu])\n\t\t\t\t{\n\t\t\t\t\tCBClick[nMenu](i);\n\t\t\t\t}\n\t\t\t\tMicroProfileDrawBox(nX, nY, nX + nWidth, nY + MICROPROFILE_TEXT_HEIGHT + 1, 0xff888888);\n\t\t\t}\n\t\t\tint nLen = snprintf(buffer, SBUF_SIZE-1, \"%c %s\", bSelected ? '*' : ' ' ,pString);\n\t\t\tMicroProfileDrawText(nX, nY, (uint32_t)-1, buffer, nLen);\n\t\t\tnY += MICROPROFILE_TEXT_HEIGHT+1;\n\t\t}\n\t}\n\n\t{\n\t\tstatic char FrameTimeMessage[64];\n\t\tfloat fToMs = MicroProfileTickToMsMultiplier(MicroProfileTicksPerSecondCpu());\n\t\tuint32_t nAggregateFrames = S.nAggregateFrames ? S.nAggregateFrames : 1;\n\t\tfloat fMs = fToMs * (S.nFlipTicks);\n\t\tfloat fAverageMs = fToMs * (S.nFlipAggregateDisplay / nAggregateFrames);\n\t\tfloat fMaxMs = fToMs * S.nFlipMaxDisplay;\n\t\tint nLen = snprintf(FrameTimeMessage, sizeof(FrameTimeMessage)-1, \"Time[%6.2f] Avg[%6.2f] Max[%6.2f]\", fMs, fAverageMs, fMaxMs);\n\t\tpMenuText[nNumMenuItems++] = &FrameTimeMessage[0];\n\t\tMicroProfileDrawText(nWidth - nLen * (MICROPROFILE_TEXT_WIDTH+1), 0, -1, FrameTimeMessage, nLen);\n\t}\n}\n\n\nvoid MicroProfileMoveGraph()\n{\n\n\tint nZoom = UI.nMouseWheelDelta;\n\tint nPanX = 0;\n\tint nPanY = 0;\n\tstatic int X = 0, Y = 0;\n\tif(UI.nMouseDownLeft && !UI.nModDown)\n\t{\n\t\tnPanX = UI.nMouseX - X;\n\t\tnPanY = UI.nMouseY - Y;\n\t}\n\tX = UI.nMouseX;\n\tY = UI.nMouseY;\n\n\tif(nZoom)\n\t{\n\t\tfloat fOldRange = UI.fDetailedRange;\n\t\tif(nZoom>0)\n\t\t{\n\t\t\tUI.fDetailedRangeTarget = UI.fDetailedRange *= UI.nModDown ? 1.40f : 1.05f;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfloat fNewDetailedRange = UI.fDetailedRange / (UI.nModDown ? 1.40f : 1.05f);\n\t\t\tif(fNewDetailedRange < 1e-4f) //100ns\n\t\t\t\tfNewDetailedRange = 1e-4f;\n\t\t\tUI.fDetailedRangeTarget = UI.fDetailedRange = fNewDetailedRange;\n\t\t}\n\n\t\tfloat fDiff = fOldRange - UI.fDetailedRange;\n\t\tfloat fMousePrc = MicroProfileMax((float)UI.nMouseX / UI.nWidth ,0.f);\n\t\tUI.fDetailedOffsetTarget = UI.fDetailedOffset += fDiff * fMousePrc;\n\n\t}\n\tif(nPanX)\n\t{\n\t\tUI.fDetailedOffsetTarget = UI.fDetailedOffset += -nPanX * UI.fDetailedRange / UI.nWidth;\n\t}\n\tint nMode = MicroProfileGet()->nDisplay;\n\tif(nMode < MP_DRAW_SIZE)\n\t{\n\t\tUI.nOffsetY[nMode] -= nPanY;\n\t\tUI.nOffsetX[nMode] += nPanX;\n\t\tif(UI.nOffsetX[nMode] > 0)\n\t\t\tUI.nOffsetX[nMode] = 0;\n\t\tif(UI.nOffsetY[nMode] < 0)\n\t\t\tUI.nOffsetY[nMode] = 0;\n\t}\n}\n\nvoid MicroProfileDrawCustom(uint32_t nWidth, uint32_t nHeight)\n{\n\t(void)nWidth;\n\n\tif((uint32_t)-1 != UI.nCustomActive)\n\t{\n\t\tMicroProfile& S = *MicroProfileGet();\n\t\tMP_ASSERT(UI.nCustomActive < MICROPROFILE_CUSTOM_MAX);\n\t\tMicroProfileCustom* pCustom = &UI.Custom[UI.nCustomActive];\n\t\tuint32_t nCount = pCustom->nNumTimers;\n\t\tuint32_t nAggregateFrames = S.nAggregateFrames ? S.nAggregateFrames : 1;\n\t\tuint32_t nExtraOffset = 1 + ((pCustom->nFlags & MICROPROFILE_CUSTOM_STACK) != 0 ? 3 : 0);\n\t\tuint32_t nOffsetYBase = nHeight - (nExtraOffset+nCount)* (1+MICROPROFILE_TEXT_HEIGHT) - MICROPROFILE_CUSTOM_PADDING;\n\t\tuint32_t nOffsetY = nOffsetYBase;\n\t\tfloat fReference = pCustom->fReference;\n\t\tfloat fRcpReference = 1.f / fReference;\n\t\tuint32_t nReducedWidth = UI.nWidth - 2*MICROPROFILE_CUSTOM_PADDING - MICROPROFILE_GRAPH_WIDTH;\n\n\t\tchar Buffer[MICROPROFILE_NAME_MAX_LEN*2+1];\n\t\tfloat* pTime = (float*)alloca(sizeof(float)*nCount);\n\t\tfloat* pTimeAvg = (float*)alloca(sizeof(float)*nCount);\n\t\tfloat* pTimeMax = (float*)alloca(sizeof(float)*nCount);\n\t\tuint32_t* pColors = (uint32_t*)alloca(sizeof(uint32_t)*nCount);\n\t\tuint32_t nMaxOffsetX = 0;\n\t\tMicroProfileDrawBox(MICROPROFILE_CUSTOM_PADDING-1, nOffsetY-1, MICROPROFILE_CUSTOM_PADDING+nReducedWidth+1, UI.nHeight - MICROPROFILE_CUSTOM_PADDING+1, 0x88000000|g_nMicroProfileBackColors[0]);\n\n\t\tfor(uint32_t i = 0; i < nCount; ++i)\n\t\t{\n\t\t\tuint16_t nTimerIndex = MicroProfileGetTimerIndex(pCustom->pTimers[i]);\n\t\t\tuint16_t nGroupIndex = MicroProfileGetGroupIndex(pCustom->pTimers[i]);\n\t\t\tfloat fToMs = MicroProfileTickToMsMultiplier(S.GroupInfo[nGroupIndex].Type == MicroProfileTokenTypeGpu ? MicroProfileTicksPerSecondGpu() : MicroProfileTicksPerSecondCpu());\n\t\t\tpTime[i] = S.Frame[nTimerIndex].nTicks * fToMs;\n\t\t\tpTimeAvg[i] = fToMs * (S.Aggregate[nTimerIndex].nTicks / nAggregateFrames);\n\t\t\tpTimeMax[i] = fToMs * (S.AggregateMax[nTimerIndex]);\n\t\t\tpColors[i] = S.TimerInfo[nTimerIndex].nColor;\n\t\t}\n\n\t\tMicroProfileDrawText(MICROPROFILE_CUSTOM_PADDING + 3*MICROPROFILE_TEXT_WIDTH, nOffsetY, (uint32_t)-1, \"Avg\", sizeof(\"Avg\")-1);\n\t\tMicroProfileDrawText(MICROPROFILE_CUSTOM_PADDING + 13*MICROPROFILE_TEXT_WIDTH, nOffsetY, (uint32_t)-1, \"Max\", sizeof(\"Max\")-1);\n\t\tfor(uint32_t i = 0; i < nCount; ++i)\n\t\t{\n\t\t\tnOffsetY += (1+MICROPROFILE_TEXT_HEIGHT);\n\t\t\tuint16_t nTimerIndex = MicroProfileGetTimerIndex(pCustom->pTimers[i]);\n\t\t\tuint16_t nGroupIndex = MicroProfileGetGroupIndex(pCustom->pTimers[i]);\n\t\t\tMicroProfileTimerInfo* pTimerInfo = &S.TimerInfo[nTimerIndex];\n\t\t\tint nSize;\n\t\t\tuint32_t nOffsetX = MICROPROFILE_CUSTOM_PADDING;\n\t\t\tnSize = snprintf(Buffer, sizeof(Buffer)-1, \"%6.2f\", pTimeAvg[i]);\n\t\t\tMicroProfileDrawText(nOffsetX, nOffsetY, (uint32_t)-1, Buffer, nSize);\n\t\t\tnOffsetX += (nSize+2) * (MICROPROFILE_TEXT_WIDTH+1);\n\t\t\tnSize = snprintf(Buffer, sizeof(Buffer)-1, \"%6.2f\", pTimeMax[i]);\n\t\t\tMicroProfileDrawText(nOffsetX, nOffsetY, (uint32_t)-1, Buffer, nSize);\n\t\t\tnOffsetX += (nSize+2) * (MICROPROFILE_TEXT_WIDTH+1);\n\t\t\tnSize = snprintf(Buffer, sizeof(Buffer)-1, \"%s:%s\", S.GroupInfo[nGroupIndex].pName, pTimerInfo->pName);\n\t\t\tMicroProfileDrawText(nOffsetX, nOffsetY, pTimerInfo->nColor, Buffer, nSize);\n\t\t\tnOffsetX += (nSize+2) * (MICROPROFILE_TEXT_WIDTH+1);\n\t\t\tnMaxOffsetX = MicroProfileMax(nMaxOffsetX, nOffsetX);\n\t\t}\n\t\tuint32_t nMaxWidth = nReducedWidth- nMaxOffsetX;\n\n\t\tif(pCustom->nFlags & MICROPROFILE_CUSTOM_BARS)\n\t\t{\n\t\t\tnOffsetY = nOffsetYBase;\n\t\t\tfloat* pMs = pCustom->nFlags & MICROPROFILE_CUSTOM_BAR_SOURCE_MAX ? pTimeMax : pTimeAvg;\n\t\t\tconst char* pString = pCustom->nFlags & MICROPROFILE_CUSTOM_BAR_SOURCE_MAX ? \"Max\" : \"Avg\";\n\t\t\tMicroProfileDrawText(nMaxOffsetX, nOffsetY, (uint32_t)-1, pString, (uint32_t)strlen(pString));\n\t\t\tint nSize = snprintf(Buffer, sizeof(Buffer)-1, \"%6.2fms\", fReference);\n\t\t\tMicroProfileDrawText(nReducedWidth - (1+nSize) * (MICROPROFILE_TEXT_WIDTH+1), nOffsetY, (uint32_t)-1, Buffer, nSize);\n\t\t\tfor(uint32_t i = 0; i < nCount; ++i)\n\t\t\t{\n\t\t\t\tnOffsetY += (1+MICROPROFILE_TEXT_HEIGHT);\n\t\t\t\tuint32_t nWidth = MicroProfileMin(nMaxWidth, (uint32_t)(nMaxWidth * pMs[i] * fRcpReference));\n\t\t\t\tMicroProfileDrawBox(nMaxOffsetX, nOffsetY, nMaxOffsetX+nWidth, nOffsetY+MICROPROFILE_TEXT_HEIGHT, pColors[i]|0xff000000);\n\t\t\t}\n\t\t}\n\t\tif(pCustom->nFlags & MICROPROFILE_CUSTOM_STACK)\n\t\t{\n\t\t\tnOffsetY += 2*(1+MICROPROFILE_TEXT_HEIGHT);\n\t\t\tconst char* pString = pCustom->nFlags & MICROPROFILE_CUSTOM_STACK_SOURCE_MAX ? \"Max\" : \"Avg\";\n\t\t\tMicroProfileDrawText(MICROPROFILE_CUSTOM_PADDING, nOffsetY, (uint32_t)-1, pString, (uint32_t)strlen(pString));\n\t\t\tint nSize = snprintf(Buffer, sizeof(Buffer)-1, \"%6.2fms\", fReference);\n\t\t\tMicroProfileDrawText(nReducedWidth - (1+nSize) * (MICROPROFILE_TEXT_WIDTH+1), nOffsetY, (uint32_t)-1, Buffer, nSize);\n\t\t\tnOffsetY += (1+MICROPROFILE_TEXT_HEIGHT);\n\t\t\tfloat fPosX = MICROPROFILE_CUSTOM_PADDING;\n\t\t\tfloat* pMs = pCustom->nFlags & MICROPROFILE_CUSTOM_STACK_SOURCE_MAX ? pTimeMax : pTimeAvg;\n\t\t\tfor(uint32_t i = 0; i < nCount; ++i)\n\t\t\t{\n\t\t\t\tfloat fWidth = pMs[i] * fRcpReference * nReducedWidth;\n\t\t\t\tuint32_t nX = (uint32_t)fPosX;\n\t\t\t\tfPosX += fWidth;\n\t\t\t\tuint32_t nXEnd = (uint32_t)fPosX;\n\t\t\t\tif(nX < nXEnd)\n\t\t\t\t{\n\t\t\t\t\tMicroProfileDrawBox(nX, nOffsetY, nXEnd, nOffsetY+MICROPROFILE_TEXT_HEIGHT, pColors[i]|0xff000000);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\nvoid MicroProfileDraw(uint32_t nWidth, uint32_t nHeight)\n{\n\tMICROPROFILE_SCOPE(g_MicroProfileDraw);\n\tMicroProfile& S = *MicroProfileGet();\n\n\t{\n\t\tstatic int once = 0;\n\t\tif(0 == once)\n\t\t{\t\n\t\t\tstd::recursive_mutex& m = MicroProfileGetMutex();\n\t\t\tm.lock();\n\t\t\tMicroProfileInitUI();\n\t\t\tuint32_t nDisplay = S.nDisplay;\n\t\t\tMicroProfileLoadPreset(MICROPROFILE_DEFAULT_PRESET);\n\t\t\tonce++;\n\t\t\tS.nDisplay = nDisplay;// dont load display, just state\n\t\t\tm.unlock();\n\n\t\t}\n\t}\n\n\n\tif(S.nDisplay)\n\t{\n\t\tstd::recursive_mutex& m = MicroProfileGetMutex();\n\t\tm.lock();\n\t\tUI.nWidth = nWidth;\n\t\tUI.nHeight = nHeight;\n\t\tUI.nHoverToken = MICROPROFILE_INVALID_TOKEN;\n\t\tUI.nHoverTime = 0;\n\t\tUI.nHoverFrame = -1;\n\t\tif(S.nDisplay != MP_DRAW_DETAILED)\n\t\t\tS.nContextSwitchHoverThread = S.nContextSwitchHoverThreadAfter = S.nContextSwitchHoverThreadBefore = -1;\n\t\tMicroProfileMoveGraph();\n\n\n\t\tif(S.nDisplay == MP_DRAW_DETAILED || S.nDisplay == MP_DRAW_FRAME)\n\t\t{\n\t\t\tMicroProfileDrawDetailedView(nWidth, nHeight, /* bDrawBars= */ S.nDisplay == MP_DRAW_DETAILED);\n\t\t}\n\t\telse if(S.nDisplay == MP_DRAW_BARS && S.nBars)\n\t\t{\n\t\t\tMicroProfileDrawBarView(nWidth, nHeight);\n\t\t}\n\t\telse if(S.nDisplay == MP_DRAW_COUNTERS)\n\t\t{\n\t\t\tMicroProfileDrawCounterView(nWidth, nHeight);\n\t\t}\n\t\t\n\t\tMicroProfileDrawMenu(nWidth, nHeight);\n\t\tbool bMouseOverGraph = MicroProfileDrawGraph(nWidth, nHeight);\n\t\tMicroProfileDrawCustom(nWidth, nHeight);\n\t\tbool bHidden = S.nDisplay == MP_DRAW_HIDDEN;\n\t\tif(!bHidden)\n\t\t{\n\t\t\tuint32_t nLockedToolTipX = 3;\n\t\t\tbool bDeleted = false;\n\t\t\tfor(int i = 0; i < MICROPROFILE_TOOLTIP_MAX_LOCKED; ++i)\n\t\t\t{\n\t\t\t\tint nIndex = (g_MicroProfileUI.LockedToolTipFront + i) % MICROPROFILE_TOOLTIP_MAX_LOCKED;\n\t\t\t\tif(g_MicroProfileUI.LockedToolTips[nIndex].ppStrings[0])\n\t\t\t\t{\n\t\t\t\t\tuint32_t nToolTipWidth = 0, nToolTipHeight = 0;\n\t\t\t\t\tMicroProfileFloatWindowSize(g_MicroProfileUI.LockedToolTips[nIndex].ppStrings, g_MicroProfileUI.LockedToolTips[nIndex].nNumStrings, 0, nToolTipWidth, nToolTipHeight, 0);\n\t\t\t\t\tuint32_t nStartY = nHeight - nToolTipHeight - 2;\n\t\t\t\t\tif(!bDeleted && UI.nMouseY > nStartY && UI.nMouseX > nLockedToolTipX && UI.nMouseX <= nLockedToolTipX + nToolTipWidth && (UI.nMouseLeft || UI.nMouseRight) )\n\t\t\t\t\t{\n\t\t\t\t\t\tbDeleted = true;\n\t\t\t\t\t\tint j = i;\n\t\t\t\t\t\tfor(; j < MICROPROFILE_TOOLTIP_MAX_LOCKED-1; ++j)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tint nIndex0 = (g_MicroProfileUI.LockedToolTipFront + j) % MICROPROFILE_TOOLTIP_MAX_LOCKED;\n\t\t\t\t\t\t\tint nIndex1 = (g_MicroProfileUI.LockedToolTipFront + j+1) % MICROPROFILE_TOOLTIP_MAX_LOCKED;\n\t\t\t\t\t\t\tMicroProfileStringArrayCopy(&g_MicroProfileUI.LockedToolTips[nIndex0], &g_MicroProfileUI.LockedToolTips[nIndex1]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tMicroProfileStringArrayClear(&g_MicroProfileUI.LockedToolTips[(g_MicroProfileUI.LockedToolTipFront + j) % MICROPROFILE_TOOLTIP_MAX_LOCKED]);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tMicroProfileDrawFloatWindow(nLockedToolTipX, nHeight-nToolTipHeight-2, &g_MicroProfileUI.LockedToolTips[nIndex].ppStrings[0], g_MicroProfileUI.LockedToolTips[nIndex].nNumStrings, g_MicroProfileUI.nLockedToolTipColor[nIndex]);\n\t\t\t\t\t\tnLockedToolTipX += nToolTipWidth + 4;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(UI.nActiveMenu == 9)\n\t\t\t{\n\t\t\t\tif(S.nDisplay & MP_DRAW_DETAILED)\n\t\t\t\t{\n\t\t\t\t\tMicroProfileStringArray DetailedHelp;\n\t\t\t\t\tMicroProfileStringArrayClear(&DetailedHelp);\n\t\t\t\t\tMicroProfileStringArrayFormat(&DetailedHelp, \"%s\", MICROPROFILE_HELP_LEFT);\n\t\t\t\t\tMicroProfileStringArrayAddLiteral(&DetailedHelp, \"Toggle Graph\");\n\t\t\t\t\tMicroProfileStringArrayFormat(&DetailedHelp, \"%s\", MICROPROFILE_HELP_RIGHT);\n\t\t\t\t\tMicroProfileStringArrayAddLiteral(&DetailedHelp, \"Zoom\");\n\t\t\t\t\tMicroProfileStringArrayFormat(&DetailedHelp, \"%s + %s\", MICROPROFILE_HELP_MOD, MICROPROFILE_HELP_LEFT);\n\t\t\t\t\tMicroProfileStringArrayAddLiteral(&DetailedHelp, \"Lock Tooltip\");\n\t\t\t\t\tMicroProfileStringArrayAddLiteral(&DetailedHelp, \"Drag\");\n\t\t\t\t\tMicroProfileStringArrayAddLiteral(&DetailedHelp, \"Pan View\");\n\t\t\t\t\tMicroProfileStringArrayAddLiteral(&DetailedHelp, \"Mouse Wheel\");\n\t\t\t\t\tMicroProfileStringArrayAddLiteral(&DetailedHelp, \"Zoom\");\n\t\t\t\t\tMicroProfileDrawFloatWindow(nWidth, MICROPROFILE_FRAME_HISTORY_HEIGHT+20, DetailedHelp.ppStrings, DetailedHelp.nNumStrings, 0xff777777);\n\n\t\t\t\t\tMicroProfileStringArray DetailedHistoryHelp;\n\t\t\t\t\tMicroProfileStringArrayClear(&DetailedHistoryHelp);\n\t\t\t\t\tMicroProfileStringArrayFormat(&DetailedHistoryHelp, \"%s\", MICROPROFILE_HELP_LEFT);\n\t\t\t\t\tMicroProfileStringArrayAddLiteral(&DetailedHistoryHelp, \"Center View\");\n\t\t\t\t\tMicroProfileStringArrayFormat(&DetailedHistoryHelp, \"%s\", MICROPROFILE_HELP_RIGHT);\n\t\t\t\t\tMicroProfileStringArrayAddLiteral(&DetailedHistoryHelp, \"Zoom to frame\");\n\t\t\t\t\tMicroProfileDrawFloatWindow(nWidth, 20, DetailedHistoryHelp.ppStrings, DetailedHistoryHelp.nNumStrings, 0xff777777);\n\n\n\n\t\t\t\t}\n\t\t\t\telse if(0 != (S.nDisplay & MP_DRAW_BARS) && S.nBars)\n\t\t\t\t{\n\t\t\t\t\tMicroProfileStringArray BarHelp;\n\t\t\t\t\tMicroProfileStringArrayClear(&BarHelp);\n\t\t\t\t\tMicroProfileStringArrayFormat(&BarHelp, \"%s\", MICROPROFILE_HELP_LEFT);\n\t\t\t\t\tMicroProfileStringArrayAddLiteral(&BarHelp, \"Toggle Graph\");\n\t\t\t\t\tMicroProfileStringArrayFormat(&BarHelp, \"%s + %s\", MICROPROFILE_HELP_MOD, MICROPROFILE_HELP_LEFT);\n\t\t\t\t\tMicroProfileStringArrayAddLiteral(&BarHelp, \"Lock Tooltip\");\n\t\t\t\t\tMicroProfileStringArrayAddLiteral(&BarHelp, \"Drag\");\n\t\t\t\t\tMicroProfileStringArrayAddLiteral(&BarHelp, \"Pan View\");\n\t\t\t\t\tMicroProfileDrawFloatWindow(nWidth, MICROPROFILE_FRAME_HISTORY_HEIGHT+20, BarHelp.ppStrings, BarHelp.nNumStrings, 0xff777777);\n\n\t\t\t\t}\n\t\t\t\tMicroProfileStringArray Debug;\n\t\t\t\tMicroProfileStringArrayClear(&Debug);\n\t\t\t\tMicroProfileStringArrayAddLiteral(&Debug, \"Memory Usage\");\n\t\t\t\tMicroProfileStringArrayFormat(&Debug, \"%4.2fmb\", S.nMemUsage / (1024.f * 1024.f));\n#if MICROPROFILE_WEBSERVER\n\t\t\t\tMicroProfileStringArrayAddLiteral(&Debug, \"Web Server Port\");\n\t\t\t\tMicroProfileStringArrayFormat(&Debug, \"%d\", MicroProfileWebServerPort());\n#endif\n\t\t\t\tuint32_t nFrameNext = (S.nFrameCurrent+1) % MICROPROFILE_MAX_FRAME_HISTORY;\n\t\t\t\tMicroProfileFrameState* pFrameCurrent = &S.Frames[S.nFrameCurrent];\n\t\t\t\tMicroProfileFrameState* pFrameNext = &S.Frames[nFrameNext];\n\n\n\t\t\t\tMicroProfileStringArrayAddLiteral(&Debug, \"\");\n\t\t\t\tMicroProfileStringArrayAddLiteral(&Debug, \"\");\n\t\t\t\tMicroProfileStringArrayAddLiteral(&Debug, \"Usage\");\n\t\t\t\tMicroProfileStringArrayAddLiteral(&Debug, \"markers [frames] \");\n\n#if MICROPROFILE_CONTEXT_SWITCH_TRACE\n\t\t\t\tMicroProfileStringArrayAddLiteral(&Debug, \"Context Switch\");\n\t\t\t\tMicroProfileStringArrayFormat(&Debug, \"%9d [%7d]\", S.nContextSwitchUsage, MICROPROFILE_CONTEXT_SWITCH_BUFFER_SIZE / S.nContextSwitchUsage );\n#endif\n\n\t\t\t\tfor(int i = 0; i < MICROPROFILE_MAX_THREADS; ++i)\n\t\t\t\t{\n\t\t\t\t\tif(pFrameCurrent->nLogStart[i] && S.Pool[i])\n\t\t\t\t\t{\n\t\t\t\t\t\tuint32_t nEnd = pFrameNext->nLogStart[i];\n\t\t\t\t\t\tuint32_t nStart = pFrameCurrent->nLogStart[i];\n\t\t\t\t\t\tuint32_t nUsage = nStart <= nEnd ? (nEnd - nStart) : (nEnd + MICROPROFILE_BUFFER_SIZE - nStart);\n\t\t\t\t\t\tuint32_t nFrameSupport = (nUsage == 0) ? MICROPROFILE_BUFFER_SIZE : MICROPROFILE_BUFFER_SIZE / nUsage;\n\t\t\t\t\t\tMicroProfileStringArrayFormat(&Debug, \"%s\", &S.Pool[i]->ThreadName[0]);\n\t\t\t\t\t\tMicroProfileStringArrayFormat(&Debug, \"%9d [%7d]\", nUsage, nFrameSupport);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tMicroProfileDrawFloatWindow(0, nHeight-10, Debug.ppStrings, Debug.nNumStrings, 0xff777777);\n\t\t\t}\n\n\n\n\t\t\tif(UI.nActiveMenu == (uint32_t)-1 && !bMouseOverGraph)\n\t\t\t{\n\t\t\t\tif(UI.nHoverToken != MICROPROFILE_INVALID_TOKEN)\n\t\t\t\t{\n\t\t\t\t\tMicroProfileDrawFloatTooltip(UI.nMouseX, UI.nMouseY, (uint32_t)UI.nHoverToken, UI.nHoverTime);\n\t\t\t\t}\n\t\t\t\telse if(S.nContextSwitchHoverThreadAfter != (uint32_t)-1 && S.nContextSwitchHoverThreadBefore != (uint32_t)-1)\n\t\t\t\t{\n\t\t\t\t\tfloat fToMs = MicroProfileTickToMsMultiplier(MicroProfileTicksPerSecondCpu());\n\t\t\t\t\tMicroProfileStringArray ToolTip;\n\t\t\t\t\tMicroProfileStringArrayClear(&ToolTip);\n\t\t\t\t\tMicroProfileStringArrayAddLiteral(&ToolTip, \"Context Switch\");\n\t\t\t\t\tMicroProfileStringArrayFormat(&ToolTip, \"%04x\", S.nContextSwitchHoverThread);\t\t\t\t\t\n\t\t\t\t\tMicroProfileStringArrayAddLiteral(&ToolTip, \"Before\");\n\t\t\t\t\tMicroProfileStringArrayFormat(&ToolTip, \"%04x\", S.nContextSwitchHoverThreadBefore);\n\t\t\t\t\tMicroProfileStringArrayAddLiteral(&ToolTip, \"After\");\n\t\t\t\t\tMicroProfileStringArrayFormat(&ToolTip, \"%04x\", S.nContextSwitchHoverThreadAfter);\t\t\t\t\t\n\t\t\t\t\tMicroProfileStringArrayAddLiteral(&ToolTip, \"Duration\");\n\t\t\t\t\tint64_t nDifference = MicroProfileLogTickDifference(S.nContextSwitchHoverTickIn, S.nContextSwitchHoverTickOut);\n\t\t\t\t\tMicroProfileStringArrayFormat(&ToolTip, \"%6.2fms\", fToMs * nDifference );\n\t\t\t\t\tMicroProfileStringArrayAddLiteral(&ToolTip, \"CPU\");\n\t\t\t\t\tMicroProfileStringArrayFormat(&ToolTip, \"%d\", S.nContextSwitchHoverCpu);\n\t\t\t\t\tMicroProfileDrawFloatWindow(UI.nMouseX, UI.nMouseY+20, &ToolTip.ppStrings[0], ToolTip.nNumStrings, -1);\n\n\n\t\t\t\t}\n\t\t\t\telse if(UI.nHoverFrame != -1)\n\t\t\t\t{\n\t\t\t\t\tuint32_t nNextFrame = (UI.nHoverFrame+1)%MICROPROFILE_MAX_FRAME_HISTORY;\n\t\t\t\t\tint64_t nTick = S.Frames[UI.nHoverFrame].nFrameStartCpu;\n\t\t\t\t\tint64_t nTickNext = S.Frames[nNextFrame].nFrameStartCpu;\n\t\t\t\t\tint64_t nTickGpu = S.Frames[UI.nHoverFrame].nFrameStartGpu;\n\t\t\t\t\tint64_t nTickNextGpu = S.Frames[nNextFrame].nFrameStartGpu;\n\n\t\t\t\t\tfloat fToMs = MicroProfileTickToMsMultiplier(MicroProfileTicksPerSecondCpu());\n\t\t\t\t\tfloat fToMsGpu = MicroProfileTickToMsMultiplier(MicroProfileTicksPerSecondGpu());\n\t\t\t\t\tfloat fMs = fToMs * (nTickNext - nTick);\n\t\t\t\t\tfloat fMsGpu = fToMsGpu * (nTickNextGpu - nTickGpu);\n\t\t\t\t\tMicroProfileStringArray ToolTip;\n\t\t\t\t\tMicroProfileStringArrayClear(&ToolTip);\n\t\t\t\t\tMicroProfileStringArrayFormat(&ToolTip, \"Frame %d\", UI.nHoverFrame);\n\t#if MICROPROFILE_DEBUG\n\t\t\t\t\tMicroProfileStringArrayFormat(&ToolTip, \"%p\", &S.Frames[UI.nHoverFrame]);\n\t#else\n\t\t\t\t\tMicroProfileStringArrayAddLiteral(&ToolTip, \"\");\n\t#endif\n\t\t\t\t\tMicroProfileStringArrayAddLiteral(&ToolTip, \"CPU Time\");\n\t\t\t\t\tMicroProfileStringArrayFormat(&ToolTip, \"%6.2fms\", fMs);\n\t\t\t\t\tMicroProfileStringArrayAddLiteral(&ToolTip, \"GPU Time\");\n\t\t\t\t\tMicroProfileStringArrayFormat(&ToolTip, \"%6.2fms\", fMsGpu);\n\t\t\t\t\t#if MICROPROFILE_DEBUG\n\t\t\t\t\tfor(int i = 0; i < MICROPROFILE_MAX_THREADS; ++i)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(S.Frames[UI.nHoverFrame].nLogStart[i])\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tMicroProfileStringArrayFormat(&ToolTip, \"%d\", i);\n\t\t\t\t\t\t\tMicroProfileStringArrayFormat(&ToolTip, \"%d\", S.Frames[UI.nHoverFrame].nLogStart[i]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t#endif\n\t\t\t\t\tMicroProfileDrawFloatWindow(UI.nMouseX, UI.nMouseY+20, &ToolTip.ppStrings[0], ToolTip.nNumStrings, -1);\n\t\t\t\t}\n\t\t\t\tif(UI.nMouseLeft)\n\t\t\t\t{\n\t\t\t\t\tif(UI.nHoverToken != MICROPROFILE_INVALID_TOKEN)\n\t\t\t\t\t\tMicroProfileToggleGraph(UI.nHoverToken);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n#if MICROPROFILE_DRAWCURSOR\n\t\t{\n\t\t\tfloat fCursor[8] = \n\t\t\t{\n\t\t\t\tfloat(MicroProfileMax(0, (int)UI.nMouseX-3)), float(UI.nMouseY),\n\t\t\t\tfloat(MicroProfileMin(nWidth, UI.nMouseX+3)), float(UI.nMouseY),\n\t\t\t\tfloat(UI.nMouseX), float(MicroProfileMax((int)UI.nMouseY-3, 0)),\n\t\t\t\tfloat(UI.nMouseX), float(MicroProfileMin(nHeight, UI.nMouseY+3)),\n\t\t\t};\n\t\t\tMicroProfileDrawLine2D(2, &fCursor[0], 0xff00ff00);\n\t\t\tMicroProfileDrawLine2D(2, &fCursor[4], 0xff00ff00);\n\t\t}\n#endif\n\t\tm.unlock();\n\t}\n\telse if(UI.nCustomActive != (uint32_t)-1)\n\t{\n\t\tstd::recursive_mutex& m = MicroProfileGetMutex();\n\t\tm.lock();\n\t\tMicroProfileDrawGraph(nWidth, nHeight);\n\t\tMicroProfileDrawCustom(nWidth, nHeight);\n\t\tm.unlock();\n\n\t}\n\tUI.nMouseLeft = UI.nMouseRight = 0;\n\tUI.nMouseLeftMod = UI.nMouseRightMod = 0;\n\tUI.nMouseWheelDelta = 0;\n\tif(S.nOverflow)\n\t\tS.nOverflow--;\n\n\tUI.fDetailedOffset = UI.fDetailedOffset + (UI.fDetailedOffsetTarget - UI.fDetailedOffset) * MICROPROFILE_ANIM_DELAY_PRC;\n\tUI.fDetailedRange = UI.fDetailedRange + (UI.fDetailedRangeTarget - UI.fDetailedRange) * MICROPROFILE_ANIM_DELAY_PRC;\n\n\n}\n\nbool MicroProfileIsDrawing()\n{\n\tMicroProfile& S = *MicroProfileGet();\t\n\treturn S.nDisplay != 0;\n}\n\nvoid MicroProfileToggleGraph(MicroProfileToken nToken)\n{\n\tMicroProfile& S = *MicroProfileGet();\n\tuint32_t nTimerId = MicroProfileGetTimerIndex(nToken);\n\tnToken &= 0xffff;\n\tint32_t nMinSort = 0x7fffffff;\n\tint32_t nFreeIndex = -1;\n\tint32_t nMinIndex = 0;\n\tint32_t nMaxSort = 0x80000000;\n\tfor(uint32_t i = 0; i < MICROPROFILE_MAX_GRAPHS; ++i)\n\t{\n\t\tif(S.Graph[i].nToken == MICROPROFILE_INVALID_TOKEN)\n\t\t\tnFreeIndex = i;\n\t\tif(S.Graph[i].nToken == nToken)\n\t\t{\n\t\t\tS.Graph[i].nToken = MICROPROFILE_INVALID_TOKEN;\n\t\t\tS.TimerInfo[nTimerId].bGraph = false;\n\t\t\treturn;\n\t\t}\n\t\tif(S.Graph[i].nKey < nMinSort)\n\t\t{\n\t\t\tnMinSort = S.Graph[i].nKey;\n\t\t\tnMinIndex = i;\n\t\t}\n\t\tif(S.Graph[i].nKey > nMaxSort)\n\t\t{\n\t\t\tnMaxSort = S.Graph[i].nKey;\n\t\t}\n\t}\n\tint nIndex = nFreeIndex > -1 ? nFreeIndex : nMinIndex;\n\tif (nFreeIndex == -1)\n\t{\n\t\tuint32_t idx = MicroProfileGetTimerIndex(S.Graph[nIndex].nToken);\n\t\tS.TimerInfo[idx].bGraph = false;\n\t}\n\tS.Graph[nIndex].nToken = nToken;\n\tS.Graph[nIndex].nKey = nMaxSort+1;\n\tmemset(&S.Graph[nIndex].nHistory[0], 0, sizeof(S.Graph[nIndex].nHistory));\n\tS.TimerInfo[nTimerId].bGraph = true;\n}\n\n\nvoid MicroProfileMousePosition(uint32_t nX, uint32_t nY, int nWheelDelta)\n{\n\tUI.nMouseX = nX;\n\tUI.nMouseY = nY;\n\tUI.nMouseWheelDelta = nWheelDelta;\n}\n\nvoid MicroProfileModKey(uint32_t nKeyState)\n{\n\tUI.nModDown = nKeyState ? 1 : 0;\n}\n\nvoid MicroProfileClearGraph()\n{\n\tMicroProfile& S = *MicroProfileGet();\t\n\tfor(uint32_t i = 0; i < MICROPROFILE_MAX_GRAPHS; ++i)\n\t{\n\t\tif(S.Graph[i].nToken != 0)\n\t\t{\n\t\t\tS.Graph[i].nToken = MICROPROFILE_INVALID_TOKEN;\n\t\t}\n\t}\n}\n\nvoid MicroProfileMouseButton(uint32_t nLeft, uint32_t nRight)\n{\n\tbool bCanRelease = abs((int)(UI.nMouseDownX - UI.nMouseX)) + abs((int)(UI.nMouseDownY - UI.nMouseY)) < 3;\n\n\tif(0 == nLeft && UI.nMouseDownLeft && bCanRelease)\n\t{\n\t\tif(UI.nModDown)\n\t\t\tUI.nMouseLeftMod = 1;\n\t\telse\n\t\t\tUI.nMouseLeft = 1;\n\t}\n\n\tif(0 == nRight && UI.nMouseDownRight && bCanRelease)\n\t{\n\t\tif(UI.nModDown)\n\t\t\tUI.nMouseRightMod = 1;\n\t\telse\n\t\t\tUI.nMouseRight = 1;\n\t}\n\tif((nLeft || nRight) && !(UI.nMouseDownLeft || UI.nMouseDownRight))\n\t{\n\t\tUI.nMouseDownX = UI.nMouseX;\n\t\tUI.nMouseDownY = UI.nMouseY;\n\t}\n\n\tUI.nMouseDownLeft = nLeft;\n\tUI.nMouseDownRight = nRight;\n\t\n}\n\nvoid MicroProfileDrawLineVertical(int nX, int nTop, int nBottom, uint32_t nColor)\n{\n\tMicroProfileDrawBox(nX, nTop, nX + 1, nBottom, nColor);\n}\n\nvoid MicroProfileDrawLineHorizontal(int nLeft, int nRight, int nY, uint32_t nColor)\n{\n\tMicroProfileDrawBox(nLeft, nY, nRight, nY + 1, nColor);\n}\n\n\n\n#include <stdio.h>\n\n#define MICROPROFILE_PRESET_HEADER_MAGIC 0x28586813\n#define MICROPROFILE_PRESET_HEADER_VERSION 0x00000102\nstruct MicroProfilePresetHeader\n{\n\tuint32_t nMagic;\n\tuint32_t nVersion;\n\t//groups, threads, aggregate, reference frame, graphs timers\n\tuint32_t nGroups[MICROPROFILE_MAX_GROUPS];\n\tuint32_t nThreads[MICROPROFILE_MAX_THREADS];\n\tuint32_t nGraphName[MICROPROFILE_MAX_GRAPHS];\n\tuint32_t nGraphGroupName[MICROPROFILE_MAX_GRAPHS];\n\tuint32_t nAllGroupsWanted;\n\tuint32_t nAllThreadsWanted;\n\tuint32_t nAggregateFlip;\n\tfloat fReferenceTime;\n\tuint32_t nBars;\n\tuint32_t nDisplay;\n\tuint32_t nOpacityBackground;\n\tuint32_t nOpacityForeground;\n\tuint32_t nShowSpikes;\n};\n\n#ifndef MICROPROFILE_PRESET_FILENAME_FUNC\n#define MICROPROFILE_PRESET_FILENAME_FUNC MicroProfilePresetFilename\nstatic const char* MicroProfilePresetFilename(const char* pSuffix)\n{\n\tstatic char filename[512];\n\tsnprintf(filename, sizeof(filename)-1, \".microprofilepreset.%s\", pSuffix);\n\treturn filename;\n}\n#endif\n\nvoid MicroProfileSavePreset(const char* pPresetName)\n{\n\tstd::lock_guard<std::recursive_mutex> Lock(MicroProfileGetMutex());\n\tFILE* F = fopen(MICROPROFILE_PRESET_FILENAME_FUNC(pPresetName), \"wb\");\n\tif(!F) return;\n\n\tMicroProfile& S = *MicroProfileGet();\n\n\tMicroProfilePresetHeader Header;\n\tmemset(&Header, 0, sizeof(Header));\n\tHeader.nAggregateFlip = S.nAggregateFlip;\n\tHeader.nBars = S.nBars;\n\tHeader.fReferenceTime = S.fReferenceTime;\n\tHeader.nAllGroupsWanted = S.nAllGroupsWanted;\n\tHeader.nAllThreadsWanted = S.nAllThreadsWanted;\n\tHeader.nMagic = MICROPROFILE_PRESET_HEADER_MAGIC;\n\tHeader.nVersion = MICROPROFILE_PRESET_HEADER_VERSION;\n\tHeader.nDisplay = S.nDisplay;\n\tHeader.nOpacityBackground = UI.nOpacityBackground;\n\tHeader.nOpacityForeground = UI.nOpacityForeground;\n\tHeader.nShowSpikes = UI.bShowSpikes ? 1 : 0;\n\tfwrite(&Header, sizeof(Header), 1, F);\n\tuint64_t nMask = 1;\n\tfor(uint32_t i = 0; i < MICROPROFILE_MAX_GROUPS; ++i)\n\t{\n\t\tif(S.nActiveGroupWanted & nMask)\n\t\t{\n\t\t\tuint32_t offset = ftell(F);\n\t\t\tconst char* pName = S.GroupInfo[i].pName;\n\t\t\tint nLen = (int)strlen(pName)+1;\n\t\t\tfwrite(pName, nLen, 1, F);\n\t\t\tHeader.nGroups[i] = offset;\n\t\t}\n\t\tnMask <<= 1;\n\t}\n\tfor(uint32_t i = 0; i < MICROPROFILE_MAX_THREADS; ++i)\n\t{\n\t\tMicroProfileThreadLog* pLog = S.Pool[i];\n\t\tif(pLog && S.nThreadActive[i])\n\t\t{\n\t\t\tuint32_t nOffset = ftell(F);\n\t\t\tconst char* pName = &pLog->ThreadName[0];\n\t\t\tint nLen = (int)strlen(pName)+1;\n\t\t\tfwrite(pName, nLen, 1, F);\n\t\t\tHeader.nThreads[i] = nOffset;\n\t\t}\n\t}\n\tfor(uint32_t i = 0; i < MICROPROFILE_MAX_GRAPHS; ++i)\n\t{\n\t\tMicroProfileToken nToken = S.Graph[i].nToken;\n\t\tif(nToken != MICROPROFILE_INVALID_TOKEN)\n\t\t{\n\t\t\tuint32_t nGroupIndex = MicroProfileGetGroupIndex(nToken);\n\t\t\tuint32_t nTimerIndex = MicroProfileGetTimerIndex(nToken);\n\t\t\tconst char* pGroupName = S.GroupInfo[nGroupIndex].pName;\n\t\t\tconst char* pTimerName = S.TimerInfo[nTimerIndex].pName;\n\t\t\tMP_ASSERT(pGroupName);\n\t\t\tMP_ASSERT(pTimerName);\n\t\t\tint nGroupLen = (int)strlen(pGroupName)+1;\n\t\t\tint nTimerLen = (int)strlen(pTimerName)+1;\n\n\t\t\tuint32_t nOffsetGroup = ftell(F);\n\t\t\tfwrite(pGroupName, nGroupLen, 1, F);\n\t\t\tuint32_t nOffsetTimer = ftell(F);\n\t\t\tfwrite(pTimerName, nTimerLen, 1, F);\n\t\t\tHeader.nGraphName[i] = nOffsetTimer;\n\t\t\tHeader.nGraphGroupName[i] = nOffsetGroup;\n\t\t}\n\t}\n\tfseek(F, 0, SEEK_SET);\n\tfwrite(&Header, sizeof(Header), 1, F);\n\n\tfclose(F);\n\n}\n\n\n\nvoid MicroProfileLoadPreset(const char* pSuffix)\n{\n\tstd::lock_guard<std::recursive_mutex> Lock(MicroProfileGetMutex());\n\tFILE* F = fopen(MICROPROFILE_PRESET_FILENAME_FUNC(pSuffix), \"rb\");\n\tif(!F)\n\t{\n\t \treturn;\n\t}\n\tfseek(F, 0, SEEK_END);\n\tint nSize = ftell(F);\n\tchar* const pBuffer = (char*)alloca(nSize);\n\tfseek(F, 0, SEEK_SET);\n\tint nRead = (int)fread(pBuffer, nSize, 1, F);\n\tfclose(F);\n\tif(1 != nRead)\n\t\treturn;\n\n\tMicroProfile& S = *MicroProfileGet();\n\t\n\tMicroProfilePresetHeader& Header = *(MicroProfilePresetHeader*)pBuffer;\n\n\tif(Header.nMagic != MICROPROFILE_PRESET_HEADER_MAGIC || Header.nVersion != MICROPROFILE_PRESET_HEADER_VERSION)\n\t{\n\t\treturn;\n\t}\n\n\tS.nAggregateFlip = Header.nAggregateFlip;\n\tS.nBars = Header.nBars;\n\tS.fReferenceTime = Header.fReferenceTime;\n\tS.fRcpReferenceTime = 1.f / Header.fReferenceTime;\n\tS.nAllGroupsWanted = Header.nAllGroupsWanted;\n\tS.nAllThreadsWanted = Header.nAllThreadsWanted;\n\tS.nDisplay = Header.nDisplay;\n\tS.nActiveGroupWanted = 0;\n\tUI.nOpacityBackground = Header.nOpacityBackground;\n\tUI.nOpacityForeground = Header.nOpacityForeground;\n\tUI.bShowSpikes = Header.nShowSpikes == 1;\n\n\tmemset(&S.nThreadActive[0], 0, sizeof(S.nThreadActive));\n\n\tfor(uint32_t i = 0; i < MICROPROFILE_MAX_GROUPS; ++i)\n\t{\n\t\tif(Header.nGroups[i])\n\t\t{\n\t\t\tconst char* pGroupName = pBuffer + Header.nGroups[i];\t\n\t\t\tfor(uint32_t j = 0; j < MICROPROFILE_MAX_GROUPS; ++j)\n\t\t\t{\n\t\t\t\tif(0 == MP_STRCASECMP(pGroupName, S.GroupInfo[j].pName))\n\t\t\t\t{\n\t\t\t\t\tS.nActiveGroupWanted |= (1ll << j);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tfor(uint32_t i = 0; i < MICROPROFILE_MAX_THREADS; ++i)\n\t{\n\t\tif(Header.nThreads[i])\n\t\t{\n\t\t\tconst char* pThreadName = pBuffer + Header.nThreads[i];\n\t\t\tfor(uint32_t j = 0; j < MICROPROFILE_MAX_THREADS; ++j)\n\t\t\t{\n\t\t\t\tMicroProfileThreadLog* pLog = S.Pool[j];\n\t\t\t\tif(pLog && 0 == MP_STRCASECMP(pThreadName, &pLog->ThreadName[0]))\n\t\t\t\t{\n\t\t\t\t\tS.nThreadActive[j] = 1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tfor(uint32_t i = 0; i < MICROPROFILE_MAX_GRAPHS; ++i)\n\t{\n\t\tMicroProfileToken nPrevToken = S.Graph[i].nToken;\n\t\tS.Graph[i].nToken = MICROPROFILE_INVALID_TOKEN;\n\t\tif(Header.nGraphName[i] && Header.nGraphGroupName[i])\n\t\t{\n\t\t\tconst char* pGraphName = pBuffer + Header.nGraphName[i];\n\t\t\tconst char* pGraphGroupName = pBuffer + Header.nGraphGroupName[i];\n\t\t\tfor(uint32_t j = 0; j < S.nTotalTimers; ++j)\n\t\t\t{\n\t\t\t\tuint64_t nGroupIndex = S.TimerInfo[j].nGroupIndex;\n\t\t\t\tif(0 == MP_STRCASECMP(pGraphName, S.TimerInfo[j].pName) && 0 == MP_STRCASECMP(pGraphGroupName, S.GroupInfo[nGroupIndex].pName))\n\t\t\t\t{\n\t\t\t\t\tMicroProfileToken nToken = MicroProfileMakeToken(1ll << nGroupIndex, (uint16_t)j);\n\t\t\t\t\tS.Graph[i].nToken = nToken;\t\t\t// note: group index is stored here but is checked without in MicroProfileToggleGraph()!\n\t\t\t\t\tS.TimerInfo[j].bGraph = true;\n\t\t\t\t\tif(nToken != nPrevToken)\n\t\t\t\t\t{\n\t\t\t\t\t\tmemset(&S.Graph[i].nHistory, 0, sizeof(S.Graph[i].nHistory));\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nuint32_t MicroProfileCustomGroupFind(const char* pCustomName)\n{\n\tfor(uint32_t i = 0; i < UI.nCustomCount; ++i)\n\t{\n\t\tif(!MP_STRCASECMP(pCustomName, UI.Custom[i].pName))\n\t\t{\n\t\t\treturn i;\n\t\t}\n\t}\n\treturn (uint32_t)-1;\n}\n\nuint32_t MicroProfileCustomGroup(const char* pCustomName)\n{\n\tfor(uint32_t i = 0; i < UI.nCustomCount; ++i)\n\t{\n\t\tif(!MP_STRCASECMP(pCustomName, UI.Custom[i].pName))\n\t\t{\n\t\t\treturn i;\n\t\t}\n\t}\n\tMP_ASSERT(UI.nCustomCount < MICROPROFILE_CUSTOM_MAX);\n\tuint32_t nIndex = UI.nCustomCount;\n\tUI.nCustomCount++;\n\tmemset(&UI.Custom[nIndex], 0, sizeof(UI.Custom[nIndex]));\n\tuint32_t nLen = (uint32_t)strlen(pCustomName);\n\tif(nLen > MICROPROFILE_NAME_MAX_LEN-1)\n\t\tnLen = MICROPROFILE_NAME_MAX_LEN-1;\n\tmemcpy(&UI.Custom[nIndex].pName[0], pCustomName, nLen);\n\tUI.Custom[nIndex].pName[nLen] = '\\0';\n\treturn nIndex;\n}\nvoid MicroProfileCustomGroup(const char* pCustomName, uint32_t nMaxTimers, uint32_t nAggregateFlip, float fReferenceTime, uint32_t nFlags)\n{\n\tuint32_t nIndex = MicroProfileCustomGroup(pCustomName);\n\tMP_ASSERT(UI.Custom[nIndex].pTimers == 0);//only call once!\n\tUI.Custom[nIndex].pTimers = &UI.CustomTimer[UI.nCustomTimerCount];\n\tUI.Custom[nIndex].nMaxTimers = nMaxTimers;\n\tUI.Custom[nIndex].fReference = fReferenceTime;\n\tUI.nCustomTimerCount += nMaxTimers;\t\n\tMP_ASSERT(UI.nCustomTimerCount <= MICROPROFILE_CUSTOM_MAX_TIMERS); //bump MICROPROFILE_CUSTOM_MAX_TIMERS\n\tUI.Custom[nIndex].nFlags = nFlags;\n\tUI.Custom[nIndex].nAggregateFlip = nAggregateFlip;\n}\n\nvoid MicroProfileCustomGroupEnable(uint32_t nIndex)\n{\n\tif(nIndex < UI.nCustomCount)\n\t{\n\t\tMicroProfile& S = *MicroProfileGet();\n\t\tS.nForceGroupUI = UI.Custom[nIndex].nGroupMask;\n\t\tMicroProfileSetAggregateFrames(UI.Custom[nIndex].nAggregateFlip);\n\t\tS.fReferenceTime = UI.Custom[nIndex].fReference;\n\t\tS.fRcpReferenceTime = 1.f / UI.Custom[nIndex].fReference;\n\t\tUI.nCustomActive = nIndex;\n\n\t\tfor(uint32_t i = 0; i < MICROPROFILE_MAX_GRAPHS; ++i)\n\t\t{\n\t\t\tif(S.Graph[i].nToken != MICROPROFILE_INVALID_TOKEN)\n\t\t\t{\n\t\t\t\tuint32_t nTimerId = MicroProfileGetTimerIndex(S.Graph[i].nToken);\n\t\t\t\tS.TimerInfo[nTimerId].bGraph = false;\n\t\t\t\tS.Graph[i].nToken = MICROPROFILE_INVALID_TOKEN;\n\t\t\t}\n\t\t}\n\n\t\tfor(uint32_t i = 0; i < UI.Custom[nIndex].nNumTimers; ++i)\n\t\t{\n\t\t\tif(i == MICROPROFILE_MAX_GRAPHS)\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tS.Graph[i].nToken = UI.Custom[nIndex].pTimers[i];\n\t\t\tS.Graph[i].nKey = i;\n\t\t\tuint32_t nTimerId = MicroProfileGetTimerIndex(S.Graph[i].nToken);\n\t\t\tS.TimerInfo[nTimerId].bGraph = true;\n\t\t}\n\t}\n}\n\nvoid MicroProfileCustomGroupToggle(const char* pCustomName)\n{\n\tuint32_t nIndex = MicroProfileCustomGroupFind(pCustomName);\n\tif(nIndex == (uint32_t)-1 || nIndex == UI.nCustomActive)\n\t{\n\t\tMicroProfileCustomGroupDisable();\n\t}\n\telse\n\t{\n\t\tMicroProfileCustomGroupEnable(nIndex);\n\t}\n}\n\nvoid MicroProfileCustomGroupEnable(const char* pCustomName)\n{\n\tuint32_t nIndex = MicroProfileCustomGroupFind(pCustomName);\n\tMicroProfileCustomGroupEnable(nIndex);\n}\nvoid MicroProfileCustomGroupDisable()\n{\n\tMicroProfile& S = *MicroProfileGet();\n\tS.nForceGroupUI = 0;\n\tUI.nCustomActive = (uint32_t)-1;\n}\n\nvoid MicroProfileCustomGroupAddTimer(const char* pCustomName, const char* pGroup, const char* pTimer)\n{\n\tuint32_t nIndex = MicroProfileCustomGroupFind(pCustomName);\n\tif((uint32_t)-1 == nIndex)\n\t{\n\t\treturn;\n\t}\n\tuint32_t nTimerIndex = UI.Custom[nIndex].nNumTimers;\n\tMP_ASSERT(nTimerIndex < UI.Custom[nIndex].nMaxTimers);\n\tuint64_t nToken = MicroProfileFindToken(pGroup, pTimer);\n\tMP_ASSERT(nToken != MICROPROFILE_INVALID_TOKEN); //Timer must be registered first.\n\tUI.Custom[nIndex].pTimers[nTimerIndex] = nToken;\t\n\tuint16_t nGroup = MicroProfileGetGroupIndex(nToken);\n\tUI.Custom[nIndex].nGroupMask |= (1ll << nGroup);\n\tUI.Custom[nIndex].nNumTimers++;\n}\n\n#undef UI\n\n#endif\n#endif\n"
  },
  {
    "path": "third_party/mspack/COPYING.LIB",
    "content": "\t\t  GNU LESSER GENERAL PUBLIC LICENSE\n\t\t       Version 2.1, February 1999\n\n Copyright (C) 1991, 1999 Free Software Foundation, Inc.\n     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n[This is the first released version of the Lesser GPL.  It also counts\n as the successor of the GNU Library Public License, version 2, hence\n the version number 2.1.]\n\n\t\t\t    Preamble\n\n  The licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicenses are intended to guarantee your freedom to share and change\nfree software--to make sure the software is free for all its users.\n\n  This license, the Lesser General Public License, applies to some\nspecially designated software packages--typically libraries--of the\nFree Software Foundation and other authors who decide to use it.  You\ncan use it too, but we suggest you first think carefully about whether\nthis license or the ordinary General Public License is the better\nstrategy to use in any particular case, based on the explanations below.\n\n  When we speak of free software, we are referring to freedom of use,\nnot price.  Our General Public Licenses are designed to make sure that\nyou have the freedom to distribute copies of free software (and charge\nfor this service if you wish); that you receive source code or can get\nit if you want it; that you can change the software and use pieces of\nit in new free programs; and that you are informed that you can do\nthese things.\n\n  To protect your rights, we need to make restrictions that forbid\ndistributors to deny you these rights or to ask you to surrender these\nrights.  These restrictions translate to certain responsibilities for\nyou if you distribute copies of the library or if you modify it.\n\n  For example, if you distribute copies of the library, whether gratis\nor for a fee, you must give the recipients all the rights that we gave\nyou.  You must make sure that they, too, receive or can get the source\ncode.  If you link other code with the library, you must provide\ncomplete object files to the recipients, so that they can relink them\nwith the library after making changes to the library and recompiling\nit.  And you must show them these terms so they know their rights.\n\n  We protect your rights with a two-step method: (1) we copyright the\nlibrary, and (2) we offer you this license, which gives you legal\npermission to copy, distribute and/or modify the library.\n\n  To protect each distributor, we want to make it very clear that\nthere is no warranty for the free library.  Also, if the library is\nmodified by someone else and passed on, the recipients should know\nthat what they have is not the original version, so that the original\nauthor's reputation will not be affected by problems that might be\nintroduced by others.\n\f\n  Finally, software patents pose a constant threat to the existence of\nany free program.  We wish to make sure that a company cannot\neffectively restrict the users of a free program by obtaining a\nrestrictive license from a patent holder.  Therefore, we insist that\nany patent license obtained for a version of the library must be\nconsistent with the full freedom of use specified in this license.\n\n  Most GNU software, including some libraries, is covered by the\nordinary GNU General Public License.  This license, the GNU Lesser\nGeneral Public License, applies to certain designated libraries, and\nis quite different from the ordinary General Public License.  We use\nthis license for certain libraries in order to permit linking those\nlibraries into non-free programs.\n\n  When a program is linked with a library, whether statically or using\na shared library, the combination of the two is legally speaking a\ncombined work, a derivative of the original library.  The ordinary\nGeneral Public License therefore permits such linking only if the\nentire combination fits its criteria of freedom.  The Lesser General\nPublic License permits more lax criteria for linking other code with\nthe library.\n\n  We call this license the \"Lesser\" General Public License because it\ndoes Less to protect the user's freedom than the ordinary General\nPublic License.  It also provides other free software developers Less\nof an advantage over competing non-free programs.  These disadvantages\nare the reason we use the ordinary General Public License for many\nlibraries.  However, the Lesser license provides advantages in certain\nspecial circumstances.\n\n  For example, on rare occasions, there may be a special need to\nencourage the widest possible use of a certain library, so that it becomes\na de-facto standard.  To achieve this, non-free programs must be\nallowed to use the library.  A more frequent case is that a free\nlibrary does the same job as widely used non-free libraries.  In this\ncase, there is little to gain by limiting the free library to free\nsoftware only, so we use the Lesser General Public License.\n\n  In other cases, permission to use a particular library in non-free\nprograms enables a greater number of people to use a large body of\nfree software.  For example, permission to use the GNU C Library in\nnon-free programs enables many more people to use the whole GNU\noperating system, as well as its variant, the GNU/Linux operating\nsystem.\n\n  Although the Lesser General Public License is Less protective of the\nusers' freedom, it does ensure that the user of a program that is\nlinked with the Library has the freedom and the wherewithal to run\nthat program using a modified version of the Library.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.  Pay close attention to the difference between a\n\"work based on the library\" and a \"work that uses the library\".  The\nformer contains code derived from the library, whereas the latter must\nbe combined with the library in order to run.\n\f\n\t\t  GNU LESSER GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License Agreement applies to any software library or other\nprogram which contains a notice placed by the copyright holder or\nother authorized party saying it may be distributed under the terms of\nthis Lesser General Public License (also called \"this License\").\nEach licensee is addressed as \"you\".\n\n  A \"library\" means a collection of software functions and/or data\nprepared so as to be conveniently linked with application programs\n(which use some of those functions and data) to form executables.\n\n  The \"Library\", below, refers to any such software library or work\nwhich has been distributed under these terms.  A \"work based on the\nLibrary\" means either the Library or any derivative work under\ncopyright law: that is to say, a work containing the Library or a\nportion of it, either verbatim or with modifications and/or translated\nstraightforwardly into another language.  (Hereinafter, translation is\nincluded without limitation in the term \"modification\".)\n\n  \"Source code\" for a work means the preferred form of the work for\nmaking modifications to it.  For a library, complete source code means\nall the source code for all modules it contains, plus any associated\ninterface definition files, plus the scripts used to control compilation\nand installation of the library.\n\n  Activities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning a program using the Library is not restricted, and output from\nsuch a program is covered only if its contents constitute a work based\non the Library (independent of the use of the Library in a tool for\nwriting it).  Whether that is true depends on what the Library does\nand what the program that uses the Library does.\n  \n  1. You may copy and distribute verbatim copies of the Library's\ncomplete source code as you receive it, in any medium, provided that\nyou conspicuously and appropriately publish on each copy an\nappropriate copyright notice and disclaimer of warranty; keep intact\nall the notices that refer to this License and to the absence of any\nwarranty; and distribute a copy of this License along with the\nLibrary.\n\n  You may charge a fee for the physical act of transferring a copy,\nand you may at your option offer warranty protection in exchange for a\nfee.\n\f\n  2. You may modify your copy or copies of the Library or any portion\nof it, thus forming a work based on the Library, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) The modified work must itself be a software library.\n\n    b) You must cause the files modified to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    c) You must cause the whole of the work to be licensed at no\n    charge to all third parties under the terms of this License.\n\n    d) If a facility in the modified Library refers to a function or a\n    table of data to be supplied by an application program that uses\n    the facility, other than as an argument passed when the facility\n    is invoked, then you must make a good faith effort to ensure that,\n    in the event an application does not supply such function or\n    table, the facility still operates, and performs whatever part of\n    its purpose remains meaningful.\n\n    (For example, a function in a library to compute square roots has\n    a purpose that is entirely well-defined independent of the\n    application.  Therefore, Subsection 2d requires that any\n    application-supplied function or table used by this function must\n    be optional: if the application does not supply it, the square\n    root function must still compute square roots.)\n\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Library,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Library, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote\nit.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Library.\n\nIn addition, mere aggregation of another work not based on the Library\nwith the Library (or with a work based on the Library) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may opt to apply the terms of the ordinary GNU General Public\nLicense instead of this License to a given copy of the Library.  To do\nthis, you must alter all the notices that refer to this License, so\nthat they refer to the ordinary GNU General Public License, version 2,\ninstead of to this License.  (If a newer version than version 2 of the\nordinary GNU General Public License has appeared, then you can specify\nthat version instead if you wish.)  Do not make any other change in\nthese notices.\n\f\n  Once this change is made in a given copy, it is irreversible for\nthat copy, so the ordinary GNU General Public License applies to all\nsubsequent copies and derivative works made from that copy.\n\n  This option is useful when you wish to copy part of the code of\nthe Library into a program that is not a library.\n\n  4. You may copy and distribute the Library (or a portion or\nderivative of it, under Section 2) in object code or executable form\nunder the terms of Sections 1 and 2 above provided that you accompany\nit with the complete corresponding machine-readable source code, which\nmust be distributed under the terms of Sections 1 and 2 above on a\nmedium customarily used for software interchange.\n\n  If distribution of object code is made by offering access to copy\nfrom a designated place, then offering equivalent access to copy the\nsource code from the same place satisfies the requirement to\ndistribute the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\n  5. A program that contains no derivative of any portion of the\nLibrary, but is designed to work with the Library by being compiled or\nlinked with it, is called a \"work that uses the Library\".  Such a\nwork, in isolation, is not a derivative work of the Library, and\ntherefore falls outside the scope of this License.\n\n  However, linking a \"work that uses the Library\" with the Library\ncreates an executable that is a derivative of the Library (because it\ncontains portions of the Library), rather than a \"work that uses the\nlibrary\".  The executable is therefore covered by this License.\nSection 6 states terms for distribution of such executables.\n\n  When a \"work that uses the Library\" uses material from a header file\nthat is part of the Library, the object code for the work may be a\nderivative work of the Library even though the source code is not.\nWhether this is true is especially significant if the work can be\nlinked without the Library, or if the work is itself a library.  The\nthreshold for this to be true is not precisely defined by law.\n\n  If such an object file uses only numerical parameters, data\nstructure layouts and accessors, and small macros and small inline\nfunctions (ten lines or less in length), then the use of the object\nfile is unrestricted, regardless of whether it is legally a derivative\nwork.  (Executables containing this object code plus portions of the\nLibrary will still fall under Section 6.)\n\n  Otherwise, if the work is a derivative of the Library, you may\ndistribute the object code for the work under the terms of Section 6.\nAny executables containing that work also fall under Section 6,\nwhether or not they are linked directly with the Library itself.\n\f\n  6. As an exception to the Sections above, you may also combine or\nlink a \"work that uses the Library\" with the Library to produce a\nwork containing portions of the Library, and distribute that work\nunder terms of your choice, provided that the terms permit\nmodification of the work for the customer's own use and reverse\nengineering for debugging such modifications.\n\n  You must give prominent notice with each copy of the work that the\nLibrary is used in it and that the Library and its use are covered by\nthis License.  You must supply a copy of this License.  If the work\nduring execution displays copyright notices, you must include the\ncopyright notice for the Library among them, as well as a reference\ndirecting the user to the copy of this License.  Also, you must do one\nof these things:\n\n    a) Accompany the work with the complete corresponding\n    machine-readable source code for the Library including whatever\n    changes were used in the work (which must be distributed under\n    Sections 1 and 2 above); and, if the work is an executable linked\n    with the Library, with the complete machine-readable \"work that\n    uses the Library\", as object code and/or source code, so that the\n    user can modify the Library and then relink to produce a modified\n    executable containing the modified Library.  (It is understood\n    that the user who changes the contents of definitions files in the\n    Library will not necessarily be able to recompile the application\n    to use the modified definitions.)\n\n    b) Use a suitable shared library mechanism for linking with the\n    Library.  A suitable mechanism is one that (1) uses at run time a\n    copy of the library already present on the user's computer system,\n    rather than copying library functions into the executable, and (2)\n    will operate properly with a modified version of the library, if\n    the user installs one, as long as the modified version is\n    interface-compatible with the version that the work was made with.\n\n    c) Accompany the work with a written offer, valid for at\n    least three years, to give the same user the materials\n    specified in Subsection 6a, above, for a charge no more\n    than the cost of performing this distribution.\n\n    d) If distribution of the work is made by offering access to copy\n    from a designated place, offer equivalent access to copy the above\n    specified materials from the same place.\n\n    e) Verify that the user has already received a copy of these\n    materials or that you have already sent this user a copy.\n\n  For an executable, the required form of the \"work that uses the\nLibrary\" must include any data and utility programs needed for\nreproducing the executable from it.  However, as a special exception,\nthe materials to be distributed need not include anything that is\nnormally distributed (in either source or binary form) with the major\ncomponents (compiler, kernel, and so on) of the operating system on\nwhich the executable runs, unless that component itself accompanies\nthe executable.\n\n  It may happen that this requirement contradicts the license\nrestrictions of other proprietary libraries that do not normally\naccompany the operating system.  Such a contradiction means you cannot\nuse both them and the Library together in an executable that you\ndistribute.\n\f\n  7. You may place library facilities that are a work based on the\nLibrary side-by-side in a single library together with other library\nfacilities not covered by this License, and distribute such a combined\nlibrary, provided that the separate distribution of the work based on\nthe Library and of the other library facilities is otherwise\npermitted, and provided that you do these two things:\n\n    a) Accompany the combined library with a copy of the same work\n    based on the Library, uncombined with any other library\n    facilities.  This must be distributed under the terms of the\n    Sections above.\n\n    b) Give prominent notice with the combined library of the fact\n    that part of it is a work based on the Library, and explaining\n    where to find the accompanying uncombined form of the same work.\n\n  8. You may not copy, modify, sublicense, link with, or distribute\nthe Library except as expressly provided under this License.  Any\nattempt otherwise to copy, modify, sublicense, link with, or\ndistribute the Library is void, and will automatically terminate your\nrights under this License.  However, parties who have received copies,\nor rights, from you under this License will not have their licenses\nterminated so long as such parties remain in full compliance.\n\n  9. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Library or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Library (or any work based on the\nLibrary), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Library or works based on it.\n\n  10. Each time you redistribute the Library (or any work based on the\nLibrary), the recipient automatically receives a license from the\noriginal licensor to copy, distribute, link with or modify the Library\nsubject to these terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties with\nthis License.\n\f\n  11. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Library at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Library by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Library.\n\nIf any portion of this section is held invalid or unenforceable under any\nparticular circumstance, the balance of the section is intended to apply,\nand the section as a whole is intended to apply in other circumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\n  12. If the distribution and/or use of the Library is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Library under this License may add\nan explicit geographical distribution limitation excluding those countries,\nso that distribution is permitted only in or among countries not thus\nexcluded.  In such case, this License incorporates the limitation as if\nwritten in the body of this License.\n\n  13. The Free Software Foundation may publish revised and/or new\nversions of the Lesser General Public License from time to time.\nSuch new versions will be similar in spirit to the present version,\nbut may differ in detail to address new problems or concerns.\n\nEach version is given a distinguishing version number.  If the Library\nspecifies a version number of this License which applies to it and\n\"any later version\", you have the option of following the terms and\nconditions either of that version or of any later version published by\nthe Free Software Foundation.  If the Library does not specify a\nlicense version number, you may choose any version ever published by\nthe Free Software Foundation.\n\f\n  14. If you wish to incorporate parts of the Library into other free\nprograms whose distribution conditions are incompatible with these,\nwrite to the author to ask for permission.  For software which is\ncopyrighted by the Free Software Foundation, write to the Free\nSoftware Foundation; we sometimes make exceptions for this.  Our\ndecision will be guided by the two goals of preserving the free status\nof all derivatives of our free software and of promoting the sharing\nand reuse of software generally.\n\n\t\t\t    NO WARRANTY\n\n  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO\nWARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.\nEXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR\nOTHER PARTIES PROVIDE THE LIBRARY \"AS IS\" WITHOUT WARRANTY OF ANY\nKIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE\nLIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME\nTHE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN\nWRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY\nAND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU\nFOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR\nCONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE\nLIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING\nRENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A\nFAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF\nSUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH\nDAMAGES.\n\n\t\t     END OF TERMS AND CONDITIONS\n\f\n           How to Apply These Terms to Your New Libraries\n\n  If you develop a new library, and you want it to be of the greatest\npossible use to the public, we recommend making it free software that\neveryone can redistribute and change.  You can do so by permitting\nredistribution under these terms (or, alternatively, under the terms of the\nordinary General Public License).\n\n  To apply these terms, attach the following notices to the library.  It is\nsafest to attach them to the start of each source file to most effectively\nconvey the exclusion of warranty; and each file should have at least the\n\"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the library's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This library is free software; you can redistribute it and/or\n    modify it under the terms of the GNU Lesser General Public\n    License as published by the Free Software Foundation; either\n    version 2.1 of the License, or (at your option) any later version.\n\n    This library is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n    Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public\n    License along with this library; if not, write to the Free Software\n    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\nAlso add information on how to contact you by electronic and paper mail.\n\nYou should also get your employer (if you work as a programmer) or your\nschool, if any, to sign a \"copyright disclaimer\" for the library, if\nnecessary.  Here is a sample; alter the names:\n\n  Yoyodyne, Inc., hereby disclaims all copyright interest in the\n  library `Frob' (a library for tweaking knobs) written by James Random Hacker.\n\n  <signature of Ty Coon>, 1 April 1990\n  Ty Coon, President of Vice\n\nThat's all there is to it!\n\n\n"
  },
  {
    "path": "third_party/mspack/config.h",
    "content": "/* config.h.in.  Generated from configure.ac by autoheader.  */\n\n/* Turn debugging mode on? */\n#undef DEBUG\n\n/* Define to 1 if you have the <dlfcn.h> header file. */\n#undef HAVE_DLFCN_H\n\n/* Define to 1 if fseeko (and presumably ftello) exists and is declared. */\n#undef HAVE_FSEEKO\n\n/* Define to 1 if you have the <inttypes.h> header file. */\n#define HAVE_INTTYPES_H 1\n\n/* Define to 1 if you have the <memory.h> header file. */\n#undef HAVE_MEMORY_H\n\n/* Define to 1 if you have the `mkdir' function. */\n#undef HAVE_MKDIR\n\n/* Define to 1 if you have the <stdint.h> header file. */\n#define HAVE_STDINT_H 1\n\n/* Define to 1 if you have the <stdlib.h> header file. */\n#define HAVE_STDLIB_H 1\n\n/* Define to 1 if you have the <strings.h> header file. */\n#undef HAVE_STRINGS_H\n\n/* Define to 1 if you have the <string.h> header file. */\n#define HAVE_STRING_H 1\n\n/* Define to 1 if you have the <sys/stat.h> header file. */\n#undef HAVE_SYS_STAT_H\n\n/* Define to 1 if you have the <sys/types.h> header file. */\n#undef HAVE_SYS_TYPES_H\n\n/* Define to 1 if you have the `towlower' function. */\n#undef HAVE_TOWLOWER\n\n/* Define to 1 if you have the <unistd.h> header file. */\n#undef HAVE_UNISTD_H\n\n/* Define to 1 if you have the `_mkdir' function. */\n#undef HAVE__MKDIR\n\n/* Define to the sub-directory where libtool stores uninstalled libraries. */\n#undef LT_OBJDIR\n\n/* Define if mkdir takes only one argument. */\n#undef MKDIR_TAKES_ONE_ARG\n\n/* Name of package */\n#undef PACKAGE\n\n/* Define to the address where bug reports for this package should be sent. */\n#undef PACKAGE_BUGREPORT\n\n/* Define to the full name of this package. */\n#undef PACKAGE_NAME\n\n/* Define to the full name and version of this package. */\n#undef PACKAGE_STRING\n\n/* Define to the one symbol short name of this package. */\n#undef PACKAGE_TARNAME\n\n/* Define to the home page for this package. */\n#undef PACKAGE_URL\n\n/* Define to the version of this package. */\n#undef PACKAGE_VERSION\n\n/* The size of `off_t', as computed by sizeof. */\n#undef SIZEOF_OFF_T\n\n/* Define to 1 if you have the ANSI C header files. */\n#undef STDC_HEADERS\n\n/* Version number of package */\n#undef VERSION\n\n/* Enable large inode numbers on Mac OS X 10.5.  */\n#ifndef _DARWIN_USE_64_BIT_INODE\n# define _DARWIN_USE_64_BIT_INODE 1\n#endif\n\n/* Number of bits in a file offset, on hosts where this is settable. */\n#undef _FILE_OFFSET_BITS\n\n/* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */\n#undef _LARGEFILE_SOURCE\n\n/* Define for large files, on AIX-style hosts. */\n#undef _LARGE_FILES\n\n/* Define to empty if `const' does not conform to ANSI C. */\n#undef const\n\n/* Define to `__inline__' or `__inline' if that's what the C compiler\n   calls it, or to nothing if 'inline' is not supported under any name.  */\n#ifndef __cplusplus\n#undef inline\n#endif\n\n/* Define to `int' if <sys/types.h> does not define. */\n#undef mode_t\n\n/* Define to `long int' if <sys/types.h> does not define. */\n#undef off_t\n\n/* Define to `unsigned int' if <sys/types.h> does not define. */\n#undef size_t\n"
  },
  {
    "path": "third_party/mspack/logging.cc",
    "content": "#include \"xenia/base/logging.h\"\n\n#include <cstdarg>\n\nextern \"C\" void xenia_log(const char* fmt, ...) {\n  char buffer[128];\n  va_list args;\n  va_start(args, fmt);\n  vsnprintf(buffer, sizeof(buffer), fmt, args);\n  va_end(args);\n  XELOGW(\"mspack: {}\", buffer);\n}\n"
  },
  {
    "path": "third_party/mspack/lzx.h",
    "content": "/* This file is part of libmspack.\n * (C) 2003-2013 Stuart Caie.\n *\n * The LZX method was created by Jonathan Forbes and Tomi Poutanen, adapted\n * by Microsoft Corporation.\n *\n * libmspack is free software; you can redistribute it and/or modify it under\n * the terms of the GNU Lesser General Public License (LGPL) version 2.1\n *\n * For further details, see the file COPYING.LIB distributed with libmspack\n */\n\n#ifndef MSPACK_LZX_H\n#define MSPACK_LZX_H 1\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* LZX compression / decompression definitions */\n\n/* some constants defined by the LZX specification */\n#define LZX_MIN_MATCH                (2)\n#define LZX_MAX_MATCH                (257)\n#define LZX_NUM_CHARS                (256)\n#define LZX_BLOCKTYPE_INVALID        (0)   /* also blocktypes 4-7 invalid */\n#define LZX_BLOCKTYPE_VERBATIM       (1)\n#define LZX_BLOCKTYPE_ALIGNED        (2)\n#define LZX_BLOCKTYPE_UNCOMPRESSED   (3)\n#define LZX_PRETREE_NUM_ELEMENTS     (20)\n#define LZX_ALIGNED_NUM_ELEMENTS     (8)   /* aligned offset tree #elements */\n#define LZX_NUM_PRIMARY_LENGTHS      (7)   /* this one missing from spec! */\n#define LZX_NUM_SECONDARY_LENGTHS    (249) /* length tree #elements */\n\n/* LZX huffman defines: tweak tablebits as desired */\n#define LZX_PRETREE_MAXSYMBOLS  (LZX_PRETREE_NUM_ELEMENTS)\n#define LZX_PRETREE_TABLEBITS   (6)\n#define LZX_MAINTREE_MAXSYMBOLS (LZX_NUM_CHARS + 290*8)\n#define LZX_MAINTREE_TABLEBITS  (12)\n#define LZX_LENGTH_MAXSYMBOLS   (LZX_NUM_SECONDARY_LENGTHS+1)\n#define LZX_LENGTH_TABLEBITS    (12)\n#define LZX_ALIGNED_MAXSYMBOLS  (LZX_ALIGNED_NUM_ELEMENTS)\n#define LZX_ALIGNED_TABLEBITS   (7)\n#define LZX_LENTABLE_SAFETY (64)  /* table decoding overruns are allowed */\n\n#define LZX_FRAME_SIZE (32768) /* the size of a frame in LZX */\n\nstruct lzxd_stream {\n  struct mspack_system *sys;      /* I/O routines                            */\n  struct mspack_file   *input;    /* input file handle                       */\n  struct mspack_file   *output;   /* output file handle                      */\n\n  off_t   offset;                 /* number of bytes actually output         */\n  off_t   length;                 /* overall decompressed length of stream   */\n\n  unsigned char *window;          /* decoding window                         */\n  unsigned int   window_size;     /* window size                             */\n  unsigned int   ref_data_size;   /* LZX DELTA reference data size           */\n  unsigned int   num_offsets;     /* number of match_offset entries in table */\n  unsigned int   window_posn;     /* decompression offset within window      */\n  unsigned int   frame_posn;      /* current frame offset within in window   */\n  unsigned int   frame;           /* the number of 32kb frames processed     */\n  unsigned int   reset_interval;  /* which frame do we reset the compressor? */\n\n  unsigned int   R0, R1, R2;      /* for the LRU offset system               */\n  unsigned int   block_length;    /* uncompressed length of this LZX block   */\n  unsigned int   block_remaining; /* uncompressed bytes still left to decode */\n\n  signed int     intel_filesize;  /* magic header value used for transform   */\n  signed int     intel_curpos;    /* current offset in transform space       */\n\n  unsigned char  intel_started;   /* has intel E8 decoding started?          */\n  unsigned char  block_type;      /* type of the current block               */\n  unsigned char  header_read;     /* have we started decoding at all yet?    */\n  unsigned char  input_end;       /* have we reached the end of input?       */\n  unsigned char  is_delta;        /* does stream follow LZX DELTA spec?      */\n\n  int error;\n\n  /* I/O buffering */\n  unsigned char *inbuf, *i_ptr, *i_end, *o_ptr, *o_end;\n  unsigned int  bit_buffer, bits_left, inbuf_size;\n\n  /* huffman code lengths */\n  unsigned char PRETREE_len  [LZX_PRETREE_MAXSYMBOLS  + LZX_LENTABLE_SAFETY];\n  unsigned char MAINTREE_len [LZX_MAINTREE_MAXSYMBOLS + LZX_LENTABLE_SAFETY];\n  unsigned char LENGTH_len   [LZX_LENGTH_MAXSYMBOLS   + LZX_LENTABLE_SAFETY];\n  unsigned char ALIGNED_len  [LZX_ALIGNED_MAXSYMBOLS  + LZX_LENTABLE_SAFETY];\n\n  /* huffman decoding tables */\n  unsigned short PRETREE_table [(1 << LZX_PRETREE_TABLEBITS) +\n                                (LZX_PRETREE_MAXSYMBOLS * 2)];\n  unsigned short MAINTREE_table[(1 << LZX_MAINTREE_TABLEBITS) +\n                                (LZX_MAINTREE_MAXSYMBOLS * 2)];\n  unsigned short LENGTH_table  [(1 << LZX_LENGTH_TABLEBITS) +\n                                (LZX_LENGTH_MAXSYMBOLS * 2)];\n  unsigned short ALIGNED_table [(1 << LZX_ALIGNED_TABLEBITS) +\n                                (LZX_ALIGNED_MAXSYMBOLS * 2)];\n  unsigned char LENGTH_empty;\n\n  /* this is used purely for doing the intel E8 transform */\n  unsigned char  e8_buf[LZX_FRAME_SIZE];\n};\n\n/**\n * Allocates and initialises LZX decompression state for decoding an LZX\n * stream.\n *\n * This routine uses system->alloc() to allocate memory. If memory\n * allocation fails, or the parameters to this function are invalid,\n * NULL is returned.\n *\n * @param system             an mspack_system structure used to read from\n *                           the input stream and write to the output\n *                           stream, also to allocate and free memory.\n * @param input              an input stream with the LZX data.\n * @param output             an output stream to write the decoded data to.\n * @param window_bits        the size of the decoding window, which must be\n *                           between 15 and 21 inclusive for regular LZX\n *                           data, or between 17 and 25 inclusive for\n *                           LZX DELTA data.\n * @param reset_interval     the interval at which the LZX bitstream is\n *                           reset, in multiples of LZX frames (32678\n *                           bytes), e.g. a value of 2 indicates the input\n *                           stream resets after every 65536 output bytes.\n *                           A value of 0 indicates that the bitstream never\n *                           resets, such as in CAB LZX streams.\n * @param input_buffer_size  the number of bytes to use as an input\n *                           bitstream buffer.\n * @param output_length      the length in bytes of the entirely\n *                           decompressed output stream, if known in\n *                           advance. It is used to correctly perform the\n *                           Intel E8 transformation, which must stop 6\n *                           bytes before the very end of the\n *                           decompressed stream. It is not otherwise used\n *                           or adhered to. If the full decompressed\n *                           length is known in advance, set it here.\n *                           If it is NOT known, use the value 0, and call\n *                           lzxd_set_output_length() once it is\n *                           known. If never set, 4 of the final 6 bytes\n *                           of the output stream may be incorrect.\n * @param is_delta           should be zero for all regular LZX data,\n *                           non-zero for LZX DELTA encoded data.\n * @return a pointer to an initialised lzxd_stream structure, or NULL if\n * there was not enough memory or parameters to the function were wrong.\n */\nextern struct lzxd_stream *lzxd_init(struct mspack_system *system,\n                                     struct mspack_file *input,\n                                     struct mspack_file *output,\n                                     int window_bits,\n                                     int reset_interval,\n                                     int input_buffer_size,\n                                     off_t output_length,\n                                     char is_delta);\n\n/* see description of output_length in lzxd_init() */\nextern void lzxd_set_output_length(struct lzxd_stream *lzx,\n                                   off_t output_length);\n\n/**\n * Reads LZX DELTA reference data into the window and allows\n * lzxd_decompress() to reference it.\n *\n * Call this before the first call to lzxd_decompress().\n\n * @param lzx    the LZX stream to apply this reference data to\n * @param system an mspack_system implementation to use with the\n *               input param. Only read() will be called.\n * @param input  an input file handle to read reference data using\n *               system->read().\n * @param length the length of the reference data. Cannot be longer\n *               than the LZX window size.\n * @return an error code, or MSPACK_ERR_OK if successful\n */\nextern int lzxd_set_reference_data(struct lzxd_stream *lzx,\n                                   struct mspack_system *system,\n                                   struct mspack_file *input,\n                                   unsigned int length);\n\n/**\n * Decompresses entire or partial LZX streams.\n *\n * The number of bytes of data that should be decompressed is given as the\n * out_bytes parameter. If more bytes are decoded than are needed, they\n * will be kept over for a later invocation.\n *\n * The output bytes will be passed to the system->write() function given in\n * lzxd_init(), using the output file handle given in lzxd_init(). More than\n * one call may be made to system->write().\n\n * Input bytes will be read in as necessary using the system->read()\n * function given in lzxd_init(), using the input file handle given in\n * lzxd_init().  This will continue until system->read() returns 0 bytes,\n * or an error. Errors will be passed out of the function as\n * MSPACK_ERR_READ errors.  Input streams should convey an \"end of input\n * stream\" by refusing to supply all the bytes that LZX asks for when they\n * reach the end of the stream, rather than return an error code.\n *\n * If any error code other than MSPACK_ERR_OK is returned, the stream\n * should be considered unusable and lzxd_decompress() should not be\n * called again on this stream.\n *\n * @param lzx       LZX decompression state, as allocated by lzxd_init().\n * @param out_bytes the number of bytes of data to decompress.\n * @return an error code, or MSPACK_ERR_OK if successful\n */\nextern int lzxd_decompress(struct lzxd_stream *lzx, off_t out_bytes);\n\n/**\n * Frees all state associated with an LZX data stream. This will call\n * system->free() using the system pointer given in lzxd_init().\n *\n * @param lzx LZX decompression state to free.\n */\nvoid lzxd_free(struct lzxd_stream *lzx);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "third_party/mspack/lzxd.c",
    "content": "/* This file is part of libmspack.\n * (C) 2003-2013 Stuart Caie.\n *\n * The LZX method was created by Jonathan Forbes and Tomi Poutanen, adapted\n * by Microsoft Corporation.\n *\n * libmspack is free software; you can redistribute it and/or modify it under\n * the terms of the GNU Lesser General Public License (LGPL) version 2.1\n *\n * For further details, see the file COPYING.LIB distributed with libmspack\n */\n\n/* LZX decompression implementation */\n\n#include <system.h>\n#include <lzx.h>\n\nextern void xenia_log(const char*, ...);\n\n#undef D\n#define D(x) do { xenia_log x; } while (0);\n\n/* Microsoft's LZX document (in cab-sdk.exe) and their implementation\n * of the com.ms.util.cab Java package do not concur.\n *\n * In the LZX document, there is a table showing the correlation between\n * window size and the number of position slots. It states that the 1MB\n * window = 40 slots and the 2MB window = 42 slots. In the implementation,\n * 1MB = 42 slots, 2MB = 50 slots. The actual calculation is 'find the\n * first slot whose position base is equal to or more than the required\n * window size'. This would explain why other tables in the document refer\n * to 50 slots rather than 42.\n *\n * The constant NUM_PRIMARY_LENGTHS used in the decompression pseudocode\n * is not defined in the specification.\n *\n * The LZX document does not state the uncompressed block has an\n * uncompressed length field. Where does this length field come from, so\n * we can know how large the block is? The implementation has it as the 24\n * bits following after the 3 blocktype bits, before the alignment\n * padding.\n *\n * The LZX document states that aligned offset blocks have their aligned\n * offset huffman tree AFTER the main and length trees. The implementation\n * suggests that the aligned offset tree is BEFORE the main and length\n * trees.\n *\n * The LZX document decoding algorithm states that, in an aligned offset\n * block, if an extra_bits value is 1, 2 or 3, then that number of bits\n * should be read and the result added to the match offset. This is\n * correct for 1 and 2, but not 3, where just a huffman symbol (using the\n * aligned tree) should be read.\n *\n * Regarding the E8 preprocessing, the LZX document states 'No translation\n * may be performed on the last 6 bytes of the input block'. This is\n * correct.  However, the pseudocode provided checks for the *E8 leader*\n * up to the last 6 bytes. If the leader appears between -10 and -7 bytes\n * from the end, this would cause the next four bytes to be modified, at\n * least one of which would be in the last 6 bytes, which is not allowed\n * according to the spec.\n *\n * The specification states that the huffman trees must always contain at\n * least one element. However, many CAB files contain blocks where the\n * length tree is completely empty (because there are no matches), and\n * this is expected to succeed.\n *\n * The errors in LZX documentation appear have been corrected in the\n * new documentation for the LZX DELTA format.\n *\n *     http://msdn.microsoft.com/en-us/library/cc483133.aspx\n *\n * However, this is a different format, an extension of regular LZX.\n * I have noticed the following differences, there may be more:\n *\n * The maximum window size has increased from 2MB to 32MB. This also\n * increases the maximum number of position slots, etc.\n *\n * If the match length is 257 (the maximum possible), this signals\n * a further length decoding step, that allows for matches up to\n * 33024 bytes long.\n *\n * The format now allows for \"reference data\", supplied by the caller.\n * If match offsets go further back than the number of bytes\n * decompressed so far, that is them accessing the reference data.\n */\n\n/* import bit-reading macros and code */\n#define BITS_TYPE struct lzxd_stream\n#define BITS_VAR lzx\n#define BITS_ORDER_MSB\n#define READ_BYTES do {                 \\\n    unsigned char b0, b1;               \\\n    READ_IF_NEEDED; b0 = *i_ptr++;      \\\n    READ_IF_NEEDED; b1 = *i_ptr++;      \\\n    INJECT_BITS((b1 << 8) | b0, 16);    \\\n} while (0)\n#include <readbits.h>\n\n/* import huffman-reading macros and code */\n#define TABLEBITS(tbl)      LZX_##tbl##_TABLEBITS\n#define MAXSYMBOLS(tbl)     LZX_##tbl##_MAXSYMBOLS\n#define HUFF_TABLE(tbl,idx) lzx->tbl##_table[idx]\n#define HUFF_LEN(tbl,idx)   lzx->tbl##_len[idx]\n#define HUFF_ERROR          return lzx->error = MSPACK_ERR_DECRUNCH\n#include <readhuff.h>\n\n/* BUILD_TABLE(tbl) builds a huffman lookup table from code lengths */\n#define BUILD_TABLE(tbl)                                                \\\n    if (make_decode_table(MAXSYMBOLS(tbl), TABLEBITS(tbl),              \\\n                          &HUFF_LEN(tbl,0), &HUFF_TABLE(tbl,0)))        \\\n    {                                                                   \\\n        D((\"failed to build %s table\", #tbl))                           \\\n        return lzx->error = MSPACK_ERR_DECRUNCH;                        \\\n    }\n\n#define BUILD_TABLE_MAYBE_EMPTY(tbl) do {                               \\\n    lzx->tbl##_empty = 0;                                               \\\n    if (make_decode_table(MAXSYMBOLS(tbl), TABLEBITS(tbl),              \\\n                          &HUFF_LEN(tbl,0), &HUFF_TABLE(tbl,0)))        \\\n    {                                                                   \\\n        for (i = 0; i < MAXSYMBOLS(tbl); i++) {                         \\\n            if (HUFF_LEN(tbl, i) > 0) {                                 \\\n                D((\"failed to build %s table\", #tbl))                   \\\n                return lzx->error = MSPACK_ERR_DECRUNCH;                \\\n            }                                                           \\\n        }                                                               \\\n        /* empty tree - allow it, but don't decode symbols with it */   \\\n        lzx->tbl##_empty = 1;                                           \\\n    }                                                                   \\\n} while (0)\n\n/* READ_LENGTHS(tablename, first, last) reads in code lengths for symbols\n * first to last in the given table. The code lengths are stored in their\n * own special LZX way.\n */\n#define READ_LENGTHS(tbl, first, last) do {             \\\n  STORE_BITS;                                           \\\n  if (lzxd_read_lens(lzx, &HUFF_LEN(tbl, 0), (first),   \\\n    (unsigned int)(last))) return lzx->error;           \\\n  RESTORE_BITS;                                         \\\n} while (0)\n\nstatic int lzxd_read_lens(struct lzxd_stream *lzx, unsigned char *lens,\n                          unsigned int first, unsigned int last)\n{\n  /* bit buffer and huffman symbol decode variables */\n  unsigned int bit_buffer;\n  int bits_left, i;\n  unsigned short sym;\n  unsigned char *i_ptr, *i_end;\n\n  unsigned int x, y;\n  int z;\n\n  RESTORE_BITS;\n  \n  /* read lengths for pretree (20 symbols, lengths stored in fixed 4 bits) */\n  for (x = 0; x < 20; x++) {\n    READ_BITS(y, 4);\n    lzx->PRETREE_len[x] = y;\n  }\n  BUILD_TABLE(PRETREE);\n\n  for (x = first; x < last; ) {\n    READ_HUFFSYM(PRETREE, z);\n    if (z == 17) {\n      /* code = 17, run of ([read 4 bits]+4) zeros */\n      READ_BITS(y, 4); y += 4;\n      while (y--) lens[x++] = 0;\n    }\n    else if (z == 18) {\n      /* code = 18, run of ([read 5 bits]+20) zeros */\n      READ_BITS(y, 5); y += 20;\n      while (y--) lens[x++] = 0;\n    }\n    else if (z == 19) {\n      /* code = 19, run of ([read 1 bit]+4) [read huffman symbol] */\n      READ_BITS(y, 1); y += 4;\n      READ_HUFFSYM(PRETREE, z);\n      z = lens[x] - z; if (z < 0) z += 17;\n      while (y--) lens[x++] = z;\n    }\n    else {\n      /* code = 0 to 16, delta current length entry */\n      z = lens[x] - z; if (z < 0) z += 17;\n      lens[x++] = z;\n    }\n  }\n\n  STORE_BITS;\n\n  return MSPACK_ERR_OK;\n}\n\n/* LZX static data tables:\n *\n * LZX uses 'position slots' to represent match offsets.  For every match,\n * a small 'position slot' number and a small offset from that slot are\n * encoded instead of one large offset.\n *\n * The number of slots is decided by how many are needed to encode the\n * largest offset for a given window size. This is easy when the gap between\n * slots is less than 128Kb, it's a linear relationship. But when extra_bits\n * reaches its limit of 17 (because LZX can only ensure reading 17 bits of\n * data at a time), we can only jump 128Kb at a time and have to start\n * using more and more position slots as each window size doubles.\n *\n * position_base[] is an index to the position slot bases\n *\n * extra_bits[] states how many bits of offset-from-base data is needed.\n *\n * They are calculated as follows:\n * extra_bits[i] = 0 where i < 4\n * extra_bits[i] = floor(i/2)-1 where i >= 4 && i < 36\n * extra_bits[i] = 17 where i >= 36\n * position_base[0] = 0\n * position_base[i] = position_base[i-1] + (1 << extra_bits[i-1])\n */\nstatic const unsigned int position_slots[11] = {\n    30, 32, 34, 36, 38, 42, 50, 66, 98, 162, 290\n};\nstatic const unsigned char extra_bits[36] = {\n    0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8,\n    9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16\n};\nstatic const unsigned int position_base[290] = {\n    0, 1, 2, 3, 4, 6, 8, 12, 16, 24, 32, 48, 64, 96, 128, 192, 256, 384, 512,\n    768, 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576, 32768,\n    49152, 65536, 98304, 131072, 196608, 262144, 393216, 524288, 655360,\n    786432, 917504, 1048576, 1179648, 1310720, 1441792, 1572864, 1703936,\n    1835008, 1966080, 2097152, 2228224, 2359296, 2490368, 2621440, 2752512,\n    2883584, 3014656, 3145728, 3276800, 3407872, 3538944, 3670016, 3801088,\n    3932160, 4063232, 4194304, 4325376, 4456448, 4587520, 4718592, 4849664,\n    4980736, 5111808, 5242880, 5373952, 5505024, 5636096, 5767168, 5898240,\n    6029312, 6160384, 6291456, 6422528, 6553600, 6684672, 6815744, 6946816,\n    7077888, 7208960, 7340032, 7471104, 7602176, 7733248, 7864320, 7995392,\n    8126464, 8257536, 8388608, 8519680, 8650752, 8781824, 8912896, 9043968,\n    9175040, 9306112, 9437184, 9568256, 9699328, 9830400, 9961472, 10092544,\n    10223616, 10354688, 10485760, 10616832, 10747904, 10878976, 11010048,\n    11141120, 11272192, 11403264, 11534336, 11665408, 11796480, 11927552,\n    12058624, 12189696, 12320768, 12451840, 12582912, 12713984, 12845056,\n    12976128, 13107200, 13238272, 13369344, 13500416, 13631488, 13762560,\n    13893632, 14024704, 14155776, 14286848, 14417920, 14548992, 14680064,\n    14811136, 14942208, 15073280, 15204352, 15335424, 15466496, 15597568,\n    15728640, 15859712, 15990784, 16121856, 16252928, 16384000, 16515072,\n    16646144, 16777216, 16908288, 17039360, 17170432, 17301504, 17432576,\n    17563648, 17694720, 17825792, 17956864, 18087936, 18219008, 18350080,\n    18481152, 18612224, 18743296, 18874368, 19005440, 19136512, 19267584,\n    19398656, 19529728, 19660800, 19791872, 19922944, 20054016, 20185088,\n    20316160, 20447232, 20578304, 20709376, 20840448, 20971520, 21102592,\n    21233664, 21364736, 21495808, 21626880, 21757952, 21889024, 22020096,\n    22151168, 22282240, 22413312, 22544384, 22675456, 22806528, 22937600,\n    23068672, 23199744, 23330816, 23461888, 23592960, 23724032, 23855104,\n    23986176, 24117248, 24248320, 24379392, 24510464, 24641536, 24772608,\n    24903680, 25034752, 25165824, 25296896, 25427968, 25559040, 25690112,\n    25821184, 25952256, 26083328, 26214400, 26345472, 26476544, 26607616,\n    26738688, 26869760, 27000832, 27131904, 27262976, 27394048, 27525120,\n    27656192, 27787264, 27918336, 28049408, 28180480, 28311552, 28442624,\n    28573696, 28704768, 28835840, 28966912, 29097984, 29229056, 29360128,\n    29491200, 29622272, 29753344, 29884416, 30015488, 30146560, 30277632,\n    30408704, 30539776, 30670848, 30801920, 30932992, 31064064, 31195136,\n    31326208, 31457280, 31588352, 31719424, 31850496, 31981568, 32112640,\n    32243712, 32374784, 32505856, 32636928, 32768000, 32899072, 33030144,\n    33161216, 33292288, 33423360\n};\n\nstatic void lzxd_reset_state(struct lzxd_stream *lzx) {\n  int i;\n\n  lzx->R0              = 1;\n  lzx->R1              = 1;\n  lzx->R2              = 1;\n  lzx->header_read     = 0;\n  lzx->block_remaining = 0;\n  lzx->block_type      = LZX_BLOCKTYPE_INVALID;\n\n  /* initialise tables to 0 (because deltas will be applied to them) */\n  for (i = 0; i < LZX_MAINTREE_MAXSYMBOLS; i++) lzx->MAINTREE_len[i] = 0;\n  for (i = 0; i < LZX_LENGTH_MAXSYMBOLS; i++)   lzx->LENGTH_len[i]   = 0;\n}\n\n/*-------- main LZX code --------*/\n\nstruct lzxd_stream *lzxd_init(struct mspack_system *system,\n                              struct mspack_file *input,\n                              struct mspack_file *output,\n                              int window_bits,\n                              int reset_interval,\n                              int input_buffer_size,\n                              off_t output_length,\n                              char is_delta)\n{\n  unsigned int window_size = 1 << window_bits;\n  struct lzxd_stream *lzx;\n\n  if (!system) return NULL;\n\n  /* LZX DELTA window sizes are between 2^17 (128KiB) and 2^25 (32MiB),\n   * regular LZX windows are between 2^15 (32KiB) and 2^21 (2MiB)\n   */\n  if (is_delta) {\n      if (window_bits < 17 || window_bits > 25) return NULL;\n  }\n  else {\n      if (window_bits < 15 || window_bits > 21) return NULL;\n  }\n\n  if (reset_interval < 0 || output_length < 0) {\n      D((\"reset interval or output length < 0\"))\n      return NULL;\n  }\n\n  /* round up input buffer size to multiple of two */\n  input_buffer_size = (input_buffer_size + 1) & -2;\n  if (input_buffer_size < 2) return NULL;\n\n  /* allocate decompression state */\n  if (!(lzx = (struct lzxd_stream *) system->alloc(system, sizeof(struct lzxd_stream)))) {\n    return NULL;\n  }\n\n  /* allocate decompression window and input buffer */\n  lzx->window = (unsigned char *) system->alloc(system, (size_t) window_size);\n  lzx->inbuf  = (unsigned char *) system->alloc(system, (size_t) input_buffer_size);\n  if (!lzx->window || !lzx->inbuf) {\n    system->free(lzx->window);\n    system->free(lzx->inbuf);\n    system->free(lzx);\n    return NULL;\n  }\n\n  /* initialise decompression state */\n  lzx->sys             = system;\n  lzx->input           = input;\n  lzx->output          = output;\n  lzx->offset          = 0;\n  lzx->length          = output_length;\n\n  lzx->inbuf_size      = input_buffer_size;\n  lzx->window_size     = 1 << window_bits;\n  lzx->ref_data_size   = 0;\n  lzx->window_posn     = 0;\n  lzx->frame_posn      = 0;\n  lzx->frame           = 0;\n  lzx->reset_interval  = reset_interval;\n  lzx->intel_filesize  = 0;\n  lzx->intel_curpos    = 0;\n  lzx->intel_started   = 0;\n  lzx->error           = MSPACK_ERR_OK;\n  lzx->num_offsets     = position_slots[window_bits - 15] << 3;\n  lzx->is_delta        = is_delta;\n\n  lzx->o_ptr = lzx->o_end = &lzx->e8_buf[0];\n  lzxd_reset_state(lzx);\n  INIT_BITS;\n  return lzx;\n}\n\nint lzxd_set_reference_data(struct lzxd_stream *lzx,\n                            struct mspack_system *system,\n                            struct mspack_file *input,\n                            unsigned int length)\n{\n    if (!lzx) return MSPACK_ERR_ARGS;\n\n    if (!lzx->is_delta) {\n        D((\"only LZX DELTA streams support reference data\"))\n        return MSPACK_ERR_ARGS;\n    }\n    if (lzx->offset) {\n        D((\"too late to set reference data after decoding starts\"))\n        return MSPACK_ERR_ARGS;\n    }\n    if (length > lzx->window_size) {\n        D((\"reference length (%u) is longer than the window\", length))\n        return MSPACK_ERR_ARGS;\n    }\n    if (length > 0 && (!system || !input)) {\n        D((\"length > 0 but no system or input\"))\n        return MSPACK_ERR_ARGS;\n    }\n\n    lzx->ref_data_size = length;\n    if (length > 0) {\n        /* copy reference data */\n        unsigned char *pos = &lzx->window[lzx->window_size - length];\n        int bytes = system->read(input, pos, length);\n        /* length can't be more than 2^25, so no signedness problem */\n        if (bytes < (int)length) return MSPACK_ERR_READ;\n    }\n    lzx->ref_data_size = length;\n    return MSPACK_ERR_OK;\n}\n\nvoid lzxd_set_output_length(struct lzxd_stream *lzx, off_t out_bytes) {\n  if (lzx && out_bytes > 0) lzx->length = out_bytes;\n}\n\nint lzxd_decompress(struct lzxd_stream *lzx, off_t out_bytes) {\n  /* bitstream and huffman reading variables */\n  unsigned int bit_buffer;\n  int bits_left, i=0;\n  unsigned char *i_ptr, *i_end;\n  unsigned short sym;\n\n  int match_length, length_footer, extra, verbatim_bits, bytes_todo;\n  int this_run, main_element, aligned_bits, j, warned = 0;\n  unsigned char *window, *runsrc, *rundest, buf[12];\n  unsigned int frame_size=0, end_frame, match_offset, window_posn;\n  unsigned int R0, R1, R2;\n\n  /* easy answers */\n  if (!lzx || (out_bytes < 0)) return MSPACK_ERR_ARGS;\n  if (lzx->error) return lzx->error;\n\n  /* flush out any stored-up bytes before we begin */\n  i = (int)(lzx->o_end - lzx->o_ptr);\n  if ((off_t) i > out_bytes) i = (int) out_bytes;\n  if (i) {\n    if (lzx->sys->write(lzx->output, lzx->o_ptr, i) != i) {\n      return lzx->error = MSPACK_ERR_WRITE;\n    }\n    lzx->o_ptr  += i;\n    lzx->offset += i;\n    out_bytes   -= i;\n  }\n  if (out_bytes == 0) return MSPACK_ERR_OK;\n\n  /* restore local state */\n  RESTORE_BITS;\n  window = lzx->window;\n  window_posn = lzx->window_posn;\n  R0 = lzx->R0;\n  R1 = lzx->R1;\n  R2 = lzx->R2;\n\n  end_frame = (unsigned int)((lzx->offset + out_bytes) / LZX_FRAME_SIZE) + 1;\n\n  while (lzx->frame < end_frame) {\n    /* have we reached the reset interval? (if there is one?) */\n    if (lzx->reset_interval && ((lzx->frame % lzx->reset_interval) == 0)) {\n      if (lzx->block_remaining) {\n        /* this is a file format error, we can make a best effort to extract what we can */\n        D((\"%d bytes remaining at reset interval\", lzx->block_remaining))\n        if (!warned) {\n          lzx->sys->message(NULL, \"WARNING; invalid reset interval detected during LZX decompression\");\n          warned++;\n        }\n      }\n\n      /* re-read the intel header and reset the huffman lengths */\n      lzxd_reset_state(lzx);\n      R0 = lzx->R0;\n      R1 = lzx->R1;\n      R2 = lzx->R2;\n    }\n\n    /* LZX DELTA format has chunk_size, not present in LZX format */\n    if (lzx->is_delta) {\n      ENSURE_BITS(16);\n      REMOVE_BITS(16);\n    }\n\n    /* read header if necessary */\n    if (!lzx->header_read) {\n      /* read 1 bit. if bit=0, intel filesize = 0.\n       * if bit=1, read intel filesize (32 bits) */\n      j = 0; READ_BITS(i, 1); if (i) { READ_BITS(i, 16); READ_BITS(j, 16); }\n      lzx->intel_filesize = (i << 16) | j;\n      lzx->header_read = 1;\n    } \n\n    /* calculate size of frame: all frames are 32k except the final frame\n     * which is 32kb or less. this can only be calculated when lzx->length\n     * has been filled in. */\n    frame_size = LZX_FRAME_SIZE;\n    if (lzx->length && (lzx->length - lzx->offset) < (off_t)frame_size) {\n      frame_size = lzx->length - lzx->offset;\n    }\n\n    /* decode until one more frame is available */\n    bytes_todo = lzx->frame_posn + frame_size - window_posn;\n    while (bytes_todo > 0) {\n      /* initialise new block, if one is needed */\n      if (lzx->block_remaining == 0) {\n        /* realign if previous block was an odd-sized UNCOMPRESSED block */\n        if ((lzx->block_type == LZX_BLOCKTYPE_UNCOMPRESSED) &&\n            (lzx->block_length & 1))\n        {\n          READ_IF_NEEDED;\n          i_ptr++;\n        }\n\n        /* read block type (3 bits) and block length (24 bits) */\n        READ_BITS(lzx->block_type, 3);\n        READ_BITS(i, 16); READ_BITS(j, 8);\n        lzx->block_remaining = lzx->block_length = (i << 8) | j;\n        /*D((\"new block t%d len %u\", lzx->block_type, lzx->block_length))*/\n\n        /* read individual block headers */\n        switch (lzx->block_type) {\n        case LZX_BLOCKTYPE_ALIGNED:\n          /* read lengths of and build aligned huffman decoding tree */\n          for (i = 0; i < 8; i++) { READ_BITS(j, 3); lzx->ALIGNED_len[i] = j; }\n          BUILD_TABLE(ALIGNED);\n          /* rest of aligned header is same as verbatim */ /*@fallthrough@*/\n        case LZX_BLOCKTYPE_VERBATIM:\n          /* read lengths of and build main huffman decoding tree */\n          READ_LENGTHS(MAINTREE, 0, 256);\n          READ_LENGTHS(MAINTREE, 256, LZX_NUM_CHARS + lzx->num_offsets);\n          BUILD_TABLE(MAINTREE);\n          /* if the literal 0xE8 is anywhere in the block... */\n          if (lzx->MAINTREE_len[0xE8] != 0) lzx->intel_started = 1;\n          /* read lengths of and build lengths huffman decoding tree */\n          READ_LENGTHS(LENGTH, 0, LZX_NUM_SECONDARY_LENGTHS);\n          BUILD_TABLE_MAYBE_EMPTY(LENGTH);\n          break;\n\n        case LZX_BLOCKTYPE_UNCOMPRESSED:\n          /* because we can't assume otherwise */\n          lzx->intel_started = 1;\n\n          /* read 1-16 (not 0-15) bits to align to bytes */\n          if (bits_left == 0) ENSURE_BITS(16);\n          bits_left = 0; bit_buffer = 0;\n\n          /* read 12 bytes of stored R0 / R1 / R2 values */\n          for (rundest = &buf[0], i = 0; i < 12; i++) {\n            READ_IF_NEEDED;\n            *rundest++ = *i_ptr++;\n          }\n          R0 = buf[0] | (buf[1] << 8) | (buf[2]  << 16) | (buf[3]  << 24);\n          R1 = buf[4] | (buf[5] << 8) | (buf[6]  << 16) | (buf[7]  << 24);\n          R2 = buf[8] | (buf[9] << 8) | (buf[10] << 16) | (buf[11] << 24);\n          break;\n\n        default:\n          D((\"bad block type\"))\n          return lzx->error = MSPACK_ERR_DECRUNCH;\n        }\n      }\n\n      /* decode more of the block:\n       * run = min(what's available, what's needed) */\n      this_run = lzx->block_remaining;\n      if (this_run > bytes_todo) this_run = bytes_todo;\n\n      /* assume we decode exactly this_run bytes, for now */\n      bytes_todo           -= this_run;\n      lzx->block_remaining -= this_run;\n\n      /* decode at least this_run bytes */\n      switch (lzx->block_type) {\n      case LZX_BLOCKTYPE_VERBATIM:\n        while (this_run > 0) {\n          READ_HUFFSYM(MAINTREE, main_element);\n          if (main_element < LZX_NUM_CHARS) {\n            /* literal: 0 to LZX_NUM_CHARS-1 */\n            window[window_posn++] = main_element;\n            this_run--;\n          }\n          else {\n            /* match: LZX_NUM_CHARS + ((slot<<3) | length_header (3 bits)) */\n            main_element -= LZX_NUM_CHARS;\n\n            /* get match length */\n            match_length = main_element & LZX_NUM_PRIMARY_LENGTHS;\n            if (match_length == LZX_NUM_PRIMARY_LENGTHS) {\n              if (lzx->LENGTH_empty) {\n                D((\"LENGTH symbol needed but tree is empty\"))\n                return lzx->error = MSPACK_ERR_DECRUNCH;\n              }\n              READ_HUFFSYM(LENGTH, length_footer);\n              match_length += length_footer;\n            }\n            match_length += LZX_MIN_MATCH;\n\n            /* get match offset */\n            switch ((match_offset = (main_element >> 3))) {\n            case 0: match_offset = R0;                                  break;\n            case 1: match_offset = R1; R1=R0;        R0 = match_offset; break;\n            case 2: match_offset = R2; R2=R0;        R0 = match_offset; break;\n            case 3: match_offset = 1;  R2=R1; R1=R0; R0 = match_offset; break;\n            default:\n              extra = (match_offset >= 36) ? 17 : extra_bits[match_offset];\n              READ_BITS(verbatim_bits, extra);\n              match_offset = position_base[match_offset] - 2 + verbatim_bits;\n              R2 = R1; R1 = R0; R0 = match_offset;\n            }\n\n            /* LZX DELTA uses max match length to signal even longer match */\n            if (match_length == LZX_MAX_MATCH && lzx->is_delta) {\n                int extra_len = 0;\n                ENSURE_BITS(3); /* 4 entry huffman tree */\n                if (PEEK_BITS(1) == 0) {\n                    REMOVE_BITS(1); /* '0' -> 8 extra length bits */\n                    READ_BITS(extra_len, 8);\n                }\n                else if (PEEK_BITS(2) == 2) {\n                    REMOVE_BITS(2); /* '10' -> 10 extra length bits + 0x100 */\n                    READ_BITS(extra_len, 10);\n                    extra_len += 0x100;\n                }\n                else if (PEEK_BITS(3) == 6) {\n                    REMOVE_BITS(3); /* '110' -> 12 extra length bits + 0x500 */\n                    READ_BITS(extra_len, 12);\n                    extra_len += 0x500;\n                }\n                else {\n                    REMOVE_BITS(3); /* '111' -> 15 extra length bits */\n                    READ_BITS(extra_len, 15);\n                }\n                match_length += extra_len;\n            }\n\n            if ((window_posn + match_length) > lzx->window_size) {\n              D((\"match ran over window wrap\"))\n              return lzx->error = MSPACK_ERR_DECRUNCH;\n            }\n            \n            /* copy match */\n            rundest = &window[window_posn];\n            i = match_length;\n            /* does match offset wrap the window? */\n            if (match_offset > window_posn) {\n              if ((off_t)match_offset > lzx->offset &&\n                  (match_offset - window_posn) > lzx->ref_data_size)\n              {\n                D((\"match offset beyond LZX stream\"))\n                return lzx->error = MSPACK_ERR_DECRUNCH;\n              }\n              /* j = length from match offset to end of window */\n              j = match_offset - window_posn;\n              if (j > (int) lzx->window_size) {\n                D((\"match offset beyond window boundaries\"))\n                return lzx->error = MSPACK_ERR_DECRUNCH;\n              }\n              runsrc = &window[lzx->window_size - j];\n              if (j < i) {\n                /* if match goes over the window edge, do two copy runs */\n                i -= j; while (j-- > 0) *rundest++ = *runsrc++;\n                runsrc = window;\n              }\n              while (i-- > 0) *rundest++ = *runsrc++;\n            }\n            else {\n              runsrc = rundest - match_offset;\n              while (i-- > 0) *rundest++ = *runsrc++;\n            }\n\n            this_run    -= match_length;\n            window_posn += match_length;\n          }\n        } /* while (this_run > 0) */\n        break;\n\n      case LZX_BLOCKTYPE_ALIGNED:\n        while (this_run > 0) {\n          READ_HUFFSYM(MAINTREE, main_element);\n          if (main_element < LZX_NUM_CHARS) {\n            /* literal: 0 to LZX_NUM_CHARS-1 */\n            window[window_posn++] = main_element;\n            this_run--;\n          }\n          else {\n            /* match: LZX_NUM_CHARS + ((slot<<3) | length_header (3 bits)) */\n            main_element -= LZX_NUM_CHARS;\n\n            /* get match length */\n            match_length = main_element & LZX_NUM_PRIMARY_LENGTHS;\n            if (match_length == LZX_NUM_PRIMARY_LENGTHS) {\n              if (lzx->LENGTH_empty) {\n                D((\"LENGTH symbol needed but tree is empty\"))\n                return lzx->error = MSPACK_ERR_DECRUNCH;\n              } \n              READ_HUFFSYM(LENGTH, length_footer);\n              match_length += length_footer;\n            }\n            match_length += LZX_MIN_MATCH;\n\n            /* get match offset */\n            switch ((match_offset = (main_element >> 3))) {\n            case 0: match_offset = R0;                             break;\n            case 1: match_offset = R1; R1 = R0; R0 = match_offset; break;\n            case 2: match_offset = R2; R2 = R0; R0 = match_offset; break;\n            default:\n              extra = (match_offset >= 36) ? 17 : extra_bits[match_offset];\n              match_offset = position_base[match_offset] - 2;\n              if (extra > 3) {\n                /* verbatim and aligned bits */\n                extra -= 3;\n                READ_BITS(verbatim_bits, extra);\n                match_offset += (verbatim_bits << 3);\n                READ_HUFFSYM(ALIGNED, aligned_bits);\n                match_offset += aligned_bits;\n              }\n              else if (extra == 3) {\n                /* aligned bits only */\n                READ_HUFFSYM(ALIGNED, aligned_bits);\n                match_offset += aligned_bits;\n              }\n              else if (extra > 0) { /* extra==1, extra==2 */\n                /* verbatim bits only */\n                READ_BITS(verbatim_bits, extra);\n                match_offset += verbatim_bits;\n              }\n              else /* extra == 0 */ {\n                /* ??? not defined in LZX specification! */\n                match_offset = 1;\n              }\n              /* update repeated offset LRU queue */\n              R2 = R1; R1 = R0; R0 = match_offset;\n            }\n\n            /* LZX DELTA uses max match length to signal even longer match */\n            if (match_length == LZX_MAX_MATCH && lzx->is_delta) {\n                int extra_len = 0;\n                ENSURE_BITS(3); /* 4 entry huffman tree */\n                if (PEEK_BITS(1) == 0) {\n                    REMOVE_BITS(1); /* '0' -> 8 extra length bits */\n                    READ_BITS(extra_len, 8);\n                }\n                else if (PEEK_BITS(2) == 2) {\n                    REMOVE_BITS(2); /* '10' -> 10 extra length bits + 0x100 */\n                    READ_BITS(extra_len, 10);\n                    extra_len += 0x100;\n                }\n                else if (PEEK_BITS(3) == 6) {\n                    REMOVE_BITS(3); /* '110' -> 12 extra length bits + 0x500 */\n                    READ_BITS(extra_len, 12);\n                    extra_len += 0x500;\n                }\n                else {\n                    REMOVE_BITS(3); /* '111' -> 15 extra length bits */\n                    READ_BITS(extra_len, 15);\n                }\n                match_length += extra_len;\n            }\n\n            if ((window_posn + match_length) > lzx->window_size) {\n              D((\"match ran over window wrap\"))\n              return lzx->error = MSPACK_ERR_DECRUNCH;\n            }\n\n            /* copy match */\n            rundest = &window[window_posn];\n            i = match_length;\n            /* does match offset wrap the window? */\n            if (match_offset > window_posn) {\n              if ((off_t)match_offset > lzx->offset &&\n                  (match_offset - window_posn) > lzx->ref_data_size)\n              {\n                D((\"match offset beyond LZX stream\"))\n                return lzx->error = MSPACK_ERR_DECRUNCH;\n              }\n              /* j = length from match offset to end of window */\n              j = match_offset - window_posn;\n              if (j > (int) lzx->window_size) {\n                D((\"match offset beyond window boundaries\"))\n                return lzx->error = MSPACK_ERR_DECRUNCH;\n              }\n              runsrc = &window[lzx->window_size - j];\n              if (j < i) {\n                /* if match goes over the window edge, do two copy runs */\n                i -= j; while (j-- > 0) *rundest++ = *runsrc++;\n                runsrc = window;\n              }\n              while (i-- > 0) *rundest++ = *runsrc++;\n            }\n            else {\n              runsrc = rundest - match_offset;\n              while (i-- > 0) *rundest++ = *runsrc++;\n            }\n\n            this_run    -= match_length;\n            window_posn += match_length;\n          }\n        } /* while (this_run > 0) */\n        break;\n\n      case LZX_BLOCKTYPE_UNCOMPRESSED:\n        /* as this_run is limited not to wrap a frame, this also means it\n         * won't wrap the window (as the window is a multiple of 32k) */\n        rundest = &window[window_posn];\n        window_posn += this_run;\n        while (this_run > 0) {\n          if ((i = (int)(i_end - i_ptr)) == 0) {\n            READ_IF_NEEDED;\n          }\n          else {\n            if (i > this_run) i = this_run;\n            lzx->sys->copy(i_ptr, rundest, (size_t) i);\n            rundest  += i;\n            i_ptr    += i;\n            this_run -= i;\n          }\n        }\n        break;\n\n      default:\n        return lzx->error = MSPACK_ERR_DECRUNCH; /* might as well */\n      }\n\n      /* did the final match overrun our desired this_run length? */\n      if (this_run < 0) {\n        if ((unsigned int)(-this_run) > lzx->block_remaining) {\n          D((\"overrun went past end of block by %d (%d remaining)\",\n             -this_run, lzx->block_remaining ))\n          return lzx->error = MSPACK_ERR_DECRUNCH;\n        }\n        lzx->block_remaining -= -this_run;\n      }\n    } /* while (bytes_todo > 0) */\n\n    /* streams don't extend over frame boundaries */\n    if ((window_posn - lzx->frame_posn) != frame_size) {\n      D((\"decode beyond output frame limits! %d != %d\",\n         window_posn - lzx->frame_posn, frame_size))\n      return lzx->error = MSPACK_ERR_DECRUNCH;\n    }\n\n    /* re-align input bitstream */\n    if (bits_left > 0) ENSURE_BITS(16);\n    if (bits_left & 15) REMOVE_BITS(bits_left & 15);\n\n    /* check that we've used all of the previous frame first */\n    if (lzx->o_ptr != lzx->o_end) {\n      D((\"%ld avail bytes, new %d frame\",\n          (long)(lzx->o_end - lzx->o_ptr), frame_size))\n      return lzx->error = MSPACK_ERR_DECRUNCH;\n    }\n\n    /* does this intel block _really_ need decoding? */\n    if (lzx->intel_started && lzx->intel_filesize &&\n        (lzx->frame <= 32768) && (frame_size > 10))\n    {\n      unsigned char *data    = &lzx->e8_buf[0];\n      unsigned char *dataend = &lzx->e8_buf[frame_size - 10];\n      signed int curpos      = lzx->intel_curpos;\n      signed int filesize    = lzx->intel_filesize;\n      signed int abs_off, rel_off;\n\n      /* copy e8 block to the e8 buffer and tweak if needed */\n      lzx->o_ptr = data;\n      lzx->sys->copy(&lzx->window[lzx->frame_posn], data, frame_size);\n\n      while (data < dataend) {\n        if (*data++ != 0xE8) { curpos++; continue; }\n        abs_off = data[0] | (data[1]<<8) | (data[2]<<16) | (data[3]<<24);\n        if ((abs_off >= -curpos) && (abs_off < filesize)) {\n          rel_off = (abs_off >= 0) ? abs_off - curpos : abs_off + filesize;\n          data[0] = (unsigned char) rel_off;\n          data[1] = (unsigned char) (rel_off >> 8);\n          data[2] = (unsigned char) (rel_off >> 16);\n          data[3] = (unsigned char) (rel_off >> 24);\n        }\n        data += 4;\n        curpos += 5;\n      }\n      lzx->intel_curpos += frame_size;\n    }\n    else {\n      lzx->o_ptr = &lzx->window[lzx->frame_posn];\n      if (lzx->intel_filesize) lzx->intel_curpos += frame_size;\n    }\n    lzx->o_end = &lzx->o_ptr[frame_size];\n\n    /* write a frame */\n    i = (out_bytes < (off_t)frame_size) ? (unsigned int)out_bytes : frame_size;\n    if (lzx->sys->write(lzx->output, lzx->o_ptr, i) != i) {\n      return lzx->error = MSPACK_ERR_WRITE;\n    }\n    lzx->o_ptr  += i;\n    lzx->offset += i;\n    out_bytes   -= i;\n\n    /* advance frame start position */\n    lzx->frame_posn += frame_size;\n    lzx->frame++;\n\n    /* wrap window / frame position pointers */\n    if (window_posn == lzx->window_size)     window_posn = 0;\n    if (lzx->frame_posn == lzx->window_size) lzx->frame_posn = 0;\n\n  } /* while (lzx->frame < end_frame) */\n\n  if (out_bytes) {\n    D((\"bytes left to output\"))\n    return lzx->error = MSPACK_ERR_DECRUNCH;\n  }\n\n  /* store local state */\n  STORE_BITS;\n  lzx->window_posn = window_posn;\n  lzx->R0 = R0;\n  lzx->R1 = R1;\n  lzx->R2 = R2;\n\n  return MSPACK_ERR_OK;\n}\n\nvoid lzxd_free(struct lzxd_stream *lzx) {\n  struct mspack_system *sys;\n  if (lzx) {\n    sys = lzx->sys;\n    sys->free(lzx->inbuf);\n    sys->free(lzx->window);\n    sys->free(lzx);\n  }\n}\n"
  },
  {
    "path": "third_party/mspack/mspack.h",
    "content": "/* libmspack -- a library for working with Microsoft compression formats.\n * (C) 2003-2016 Stuart Caie <kyzer@cabextract.org.uk>\n *\n * libmspack is free software; you can redistribute it and/or modify it under\n * the terms of the GNU Lesser General Public License (LGPL) version 2.1\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n */\n\n/** \\mainpage\n *\n * \\section intro Introduction\n *\n * libmspack is a library which provides compressors and decompressors,\n * archivers and dearchivers for Microsoft compression formats.\n *\n * \\section formats Formats supported\n *\n * The following file formats are supported:\n * - SZDD files, which use LZSS compression\n * - KWAJ files, which use LZSS, LZSS+Huffman or deflate compression\n * - .HLP (MS Help) files, which use LZSS compression\n * - .CAB (MS Cabinet) files, which use deflate, LZX or Quantum compression\n * - .CHM (HTML Help) files, which use LZX compression\n * - .LIT (MS EBook) files, which use LZX compression and DES encryption\n * - .LZX (Exchange Offline Addressbook) files, which use LZX compression\n *\n * To determine the capabilities of the library, and the binary\n * compatibility version of any particular compressor or decompressor, use\n * the mspack_version() function. The UNIX library interface version is\n * defined as the highest-versioned library component.\n *\n * \\section starting Getting started\n *\n * The macro MSPACK_SYS_SELFTEST() should be used to ensure the library can\n * be used. In particular, it checks if the caller is using 32-bit file I/O\n * when the library is compiled for 64-bit file I/O and vice versa.\n *\n * If compiled normally, the library includes basic file I/O and memory\n * management functionality using the standard C library. This can be\n * customised and replaced entirely by creating a mspack_system structure.\n *\n * A compressor or decompressor for the required format must be\n * instantiated before it can be used. Each construction function takes\n * one parameter, which is either a pointer to a custom mspack_system\n * structure, or NULL to use the default. The instantiation returned, if\n * not NULL, contains function pointers (methods) to work with the given\n * file format.\n * \n * For compression:\n * - mspack_create_cab_compressor() creates a mscab_compressor\n * - mspack_create_chm_compressor() creates a mschm_compressor\n * - mspack_create_lit_compressor() creates a mslit_compressor\n * - mspack_create_hlp_compressor() creates a mshlp_compressor\n * - mspack_create_szdd_compressor() creates a msszdd_compressor\n * - mspack_create_kwaj_compressor() creates a mskwaj_compressor\n * - mspack_create_oab_compressor() creates a msoab_compressor\n *\n * For decompression:\n * - mspack_create_cab_decompressor() creates a mscab_decompressor\n * - mspack_create_chm_decompressor() creates a mschm_decompressor\n * - mspack_create_lit_decompressor() creates a mslit_decompressor\n * - mspack_create_hlp_decompressor() creates a mshlp_decompressor\n * - mspack_create_szdd_decompressor() creates a msszdd_decompressor\n * - mspack_create_kwaj_decompressor() creates a mskwaj_decompressor\n * - mspack_create_oab_decompressor() creates a msoab_decompressor\n *\n * Once finished working with a format, each kind of\n * compressor/decompressor has its own specific destructor:\n * - mspack_destroy_cab_compressor()\n * - mspack_destroy_cab_decompressor()\n * - mspack_destroy_chm_compressor()\n * - mspack_destroy_chm_decompressor()\n * - mspack_destroy_lit_compressor()\n * - mspack_destroy_lit_decompressor()\n * - mspack_destroy_hlp_compressor()\n * - mspack_destroy_hlp_decompressor()\n * - mspack_destroy_szdd_compressor()\n * - mspack_destroy_szdd_decompressor()\n * - mspack_destroy_kwaj_compressor()\n * - mspack_destroy_kwaj_decompressor()\n * - mspack_destroy_oab_compressor()\n * - mspack_destroy_oab_decompressor()\n *\n * Destroying a compressor or decompressor does not destroy any objects,\n * structures or handles that have been created using that compressor or\n * decompressor. Ensure that everything created or opened is destroyed or\n * closed before compressor/decompressor is itself destroyed.\n *\n * \\section errors Error codes\n *\n * All compressors and decompressors use the same set of error codes. Most\n * methods return an error code directly. For methods which do not\n * return error codes directly, the error code can be obtained with the\n * last_error() method.\n *\n * - #MSPACK_ERR_OK is used to indicate success. This error code is defined\n *   as zero, all other code are non-zero.\n * - #MSPACK_ERR_ARGS indicates that a method was called with inappropriate\n *   arguments.\n * - #MSPACK_ERR_OPEN indicates that mspack_system::open() failed.\n * - #MSPACK_ERR_READ indicates that mspack_system::read() failed.\n * - #MSPACK_ERR_WRITE indicates that mspack_system::write() failed.\n * - #MSPACK_ERR_SEEK indicates that mspack_system::seek() failed.\n * - #MSPACK_ERR_NOMEMORY indicates that mspack_system::alloc() failed.\n * - #MSPACK_ERR_SIGNATURE indicates that the file being read does not\n *   have the correct \"signature\". It is probably not a valid file for\n *   whatever format is being read.\n * - #MSPACK_ERR_DATAFORMAT indicates that the file being used or read\n *   is corrupt.\n * - #MSPACK_ERR_CHECKSUM indicates that a data checksum has failed.\n * - #MSPACK_ERR_CRUNCH indicates an error occured during compression.\n * - #MSPACK_ERR_DECRUNCH indicates an error occured during decompression.\n *\n * \\section threading Multi-threading\n *\n * libmspack methods are reentrant and multithreading-safe when each\n * thread has its own compressor or decompressor.\n\n * You should not call multiple methods simultaneously on a single\n * compressor or decompressor instance.\n *\n * If this may happen, you can either use one compressor or\n * decompressor per thread, or you can use your preferred lock,\n * semaphore or mutex library to ensure no more than one method on a\n * compressor/decompressor is called simultaneously. libmspack will\n * not do this locking for you.\n *\n * Example of incorrect behaviour:\n * - thread 1 calls mspack_create_cab_decompressor()\n * - thread 1 calls open()\n * - thread 1 calls extract() for one file\n * - thread 2 simultaneously calls extract() for another file\n *\n * Correct behaviour:\n * - thread 1 calls mspack_create_cab_decompressor()\n * - thread 2 calls mspack_create_cab_decompressor()\n * - thread 1 calls its own open() / extract()\n * - thread 2 simultaneously calls its own open() / extract()\n *\n * Also correct behaviour:\n * - thread 1 calls mspack_create_cab_decompressor()\n * - thread 1 locks a mutex for with the decompressor before\n *   calling any methods on it, and unlocks the mutex after each\n *   method returns.\n * - thread 1 can share the results of open() with thread 2, and both\n *   can call extract(), provided they both guard against simultaneous\n *   use of extract(), and any other methods, with the mutex\n */\n\n#ifndef LIB_MSPACK_H\n#define LIB_MSPACK_H 1\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include <sys/types.h>\n#include <stdlib.h>\n\n/**\n * System self-test function, to ensure both library and calling program\n * can use one another.\n *\n * A result of MSPACK_ERR_OK means the library and caller are\n * compatible. Any other result indicates that the library and caller are\n * not compatible and should not be used. In particular, a value of\n * MSPACK_ERR_SEEK means the library and caller use different off_t\n * datatypes.\n *\n * It should be used like so:\n *\n * @code\n * int selftest_result;\n * MSPACK_SYS_SELFTEST(selftest_result);\n * if (selftest_result != MSPACK_ERR_OK) {\n *   fprintf(stderr, \"incompatible with this build of libmspack\\n\");\n *   exit(0);\n * }\n * @endcode\n *\n * @param  result   an int variable to store the result of the self-test\n */\n#define MSPACK_SYS_SELFTEST(result)  do { \\\n  (result) = mspack_sys_selftest_internal(sizeof(off_t)); \\\n} while (0)\n\n/** Part of the MSPACK_SYS_SELFTEST() macro, must not be used directly. */\nextern int mspack_sys_selftest_internal(int);\n\n/**\n * Enquire about the binary compatibility version of a specific interface in\n * the library. Currently, the following interfaces are defined:\n *\n * - #MSPACK_VER_LIBRARY: the overall library\n * - #MSPACK_VER_SYSTEM: the mspack_system interface\n * - #MSPACK_VER_MSCABD: the mscab_decompressor interface\n * - #MSPACK_VER_MSCABC: the mscab_compressor interface\n * - #MSPACK_VER_MSCHMD: the mschm_decompressor interface\n * - #MSPACK_VER_MSCHMC: the mschm_compressor interface\n * - #MSPACK_VER_MSLITD: the mslit_decompressor interface\n * - #MSPACK_VER_MSLITC: the mslit_compressor interface\n * - #MSPACK_VER_MSHLPD: the mshlp_decompressor interface\n * - #MSPACK_VER_MSHLPC: the mshlp_compressor interface\n * - #MSPACK_VER_MSSZDDD: the msszdd_decompressor interface\n * - #MSPACK_VER_MSSZDDC: the msszdd_compressor interface\n * - #MSPACK_VER_MSKWAJD: the mskwaj_decompressor interface\n * - #MSPACK_VER_MSKWAJC: the mskwaj_compressor interface\n * - #MSPACK_VER_MSOABD: the msoab_decompressor interface\n * - #MSPACK_VER_MSOABC: the msoab_compressor interface\n *\n * The result of the function should be interpreted as follows:\n * - -1: this interface is completely unknown to the library\n * - 0: this interface is known, but non-functioning\n * - 1: this interface has all basic functionality\n * - 2, 3, ...: this interface has additional functionality, clearly marked\n *   in the documentation as \"version 2\", \"version 3\" and so on.\n *\n * @param entity the interface to request current version of\n * @return the version of the requested interface\n */\nextern int mspack_version(int entity);\n\n/** Pass to mspack_version() to get the overall library version */\n#define MSPACK_VER_LIBRARY   (0)\n/** Pass to mspack_version() to get the mspack_system version */\n#define MSPACK_VER_SYSTEM    (1)\n/** Pass to mspack_version() to get the mscab_decompressor version */\n#define MSPACK_VER_MSCABD    (2)\n/** Pass to mspack_version() to get the mscab_compressor version */\n#define MSPACK_VER_MSCABC    (3)\n/** Pass to mspack_version() to get the mschm_decompressor version */\n#define MSPACK_VER_MSCHMD    (4)\n/** Pass to mspack_version() to get the mschm_compressor version */\n#define MSPACK_VER_MSCHMC    (5)\n/** Pass to mspack_version() to get the mslit_decompressor version */\n#define MSPACK_VER_MSLITD    (6)\n/** Pass to mspack_version() to get the mslit_compressor version */\n#define MSPACK_VER_MSLITC    (7)\n/** Pass to mspack_version() to get the mshlp_decompressor version */\n#define MSPACK_VER_MSHLPD    (8)\n/** Pass to mspack_version() to get the mshlp_compressor version */\n#define MSPACK_VER_MSHLPC    (9)\n/** Pass to mspack_version() to get the msszdd_decompressor version */\n#define MSPACK_VER_MSSZDDD   (10)\n/** Pass to mspack_version() to get the msszdd_compressor version */\n#define MSPACK_VER_MSSZDDC   (11)\n/** Pass to mspack_version() to get the mskwaj_decompressor version */\n#define MSPACK_VER_MSKWAJD   (12)\n/** Pass to mspack_version() to get the mskwaj_compressor version */\n#define MSPACK_VER_MSKWAJC   (13)\n/** Pass to mspack_version() to get the msoab_decompressor version */\n#define MSPACK_VER_MSOABD    (14)\n/** Pass to mspack_version() to get the msoab_compressor version */\n#define MSPACK_VER_MSOABC    (15)\n\n/* --- file I/O abstraction ------------------------------------------------ */\n\n/**\n * A structure which abstracts file I/O and memory management.\n *\n * The library always uses the mspack_system structure for interaction\n * with the file system and to allocate, free and copy all memory. It also\n * uses it to send literal messages to the library user.\n *\n * When the library is compiled normally, passing NULL to a compressor or\n * decompressor constructor will result in a default mspack_system being\n * used, where all methods are implemented with the standard C library.\n * However, all constructors support being given a custom created\n * mspack_system structure, with the library user's own methods. This\n * allows for more abstract interaction, such as reading and writing files\n * directly to memory, or from a network socket or pipe.\n *\n * Implementors of an mspack_system structure should read all\n * documentation entries for every structure member, and write methods\n * which conform to those standards.\n */\nstruct mspack_system {\n  /**\n   * Opens a file for reading, writing, appending or updating.\n   *\n   * @param self     a self-referential pointer to the mspack_system\n   *                 structure whose open() method is being called. If\n   *                 this pointer is required by close(), read(), write(),\n   *                 seek() or tell(), it should be stored in the result\n   *                 structure at this time.\n   * @param filename the file to be opened. It is passed directly from the\n   *                 library caller without being modified, so it is up to\n   *                 the caller what this parameter actually represents.\n   * @param mode     one of #MSPACK_SYS_OPEN_READ (open an existing file\n   *                 for reading), #MSPACK_SYS_OPEN_WRITE (open a new file\n   *                 for writing), #MSPACK_SYS_OPEN_UPDATE (open an existing\n   *                 file for reading/writing from the start of the file) or\n   *                 #MSPACK_SYS_OPEN_APPEND (open an existing file for\n   *                 reading/writing from the end of the file)\n   * @return a pointer to a mspack_file structure. This structure officially\n   *         contains no members, its true contents are up to the\n   *         mspack_system implementor. It should contain whatever is needed\n   *         for other mspack_system methods to operate. Returning the NULL\n   *         pointer indicates an error condition.\n   * @see close(), read(), write(), seek(), tell(), message()\n   */\n  struct mspack_file * (*open)(struct mspack_system *self,\n                               const char *filename,\n                               int mode);\n\n  /**\n   * Closes a previously opened file. If any memory was allocated for this\n   * particular file handle, it should be freed at this time.\n   * \n   * @param file the file to close\n   * @see open()\n   */\n  void (*close)(struct mspack_file *file);\n\n  /**\n   * Reads a given number of bytes from an open file.\n   *\n   * @param file    the file to read from\n   * @param buffer  the location where the read bytes should be stored\n   * @param bytes   the number of bytes to read from the file.\n   * @return the number of bytes successfully read (this can be less than\n   *         the number requested), zero to mark the end of file, or less\n   *         than zero to indicate an error. The library does not \"retry\"\n   *         reads and assumes short reads are due to EOF, so you should\n   *         avoid returning short reads because of transient errors.\n   * @see open(), write()\n   */\n  int (*read)(struct mspack_file *file,\n              void *buffer,\n              int bytes);\n\n  /**\n   * Writes a given number of bytes to an open file.\n   *\n   * @param file    the file to write to\n   * @param buffer  the location where the written bytes should be read from\n   * @param bytes   the number of bytes to write to the file.\n   * @return the number of bytes successfully written, this can be less\n   *         than the number requested. Zero or less can indicate an error\n   *         where no bytes at all could be written. All cases where less\n   *         bytes were written than requested are considered by the library\n   *         to be an error.\n   * @see open(), read()\n   */\n  int (*write)(struct mspack_file *file,\n               void *buffer,\n               int bytes);\n\n  /**\n   * Seeks to a specific file offset within an open file.\n   *\n   * Sometimes the library needs to know the length of a file. It does\n   * this by seeking to the end of the file with seek(file, 0,\n   * MSPACK_SYS_SEEK_END), then calling tell(). Implementations may want\n   * to make a special case for this.\n   *\n   * Due to the potentially varying 32/64 bit datatype off_t on some\n   * architectures, the #MSPACK_SYS_SELFTEST macro MUST be used before\n   * using the library. If not, the error caused by the library passing an\n   * inappropriate stackframe to seek() is subtle and hard to trace.\n   *\n   * @param file   the file to be seeked\n   * @param offset an offset to seek, measured in bytes\n   * @param mode   one of #MSPACK_SYS_SEEK_START (the offset should be\n   *               measured from the start of the file), #MSPACK_SYS_SEEK_CUR\n   *               (the offset should be measured from the current file offset)\n   *               or #MSPACK_SYS_SEEK_END (the offset should be measured from\n   *               the end of the file)\n   * @return zero for success, non-zero for an error\n   * @see open(), tell()\n   */\n  int (*seek)(struct mspack_file *file,\n              off_t offset,\n              int mode);\n\n  /**\n   * Returns the current file position (in bytes) of the given file.\n   *\n   * @param file the file whose file position is wanted\n   * @return the current file position of the file\n   * @see open(), seek()\n   */\n  off_t (*tell)(struct mspack_file *file);\n  \n  /**\n   * Used to send messages from the library to the user.\n   *\n   * Occasionally, the library generates warnings or other messages in\n   * plain english to inform the human user. These are informational only\n   * and can be ignored if not wanted.\n   *\n   * @param file   may be a file handle returned from open() if this message\n   *               pertains to a specific open file, or NULL if not related to\n   *               a specific file.\n   * @param format a printf() style format string. It does NOT include a\n   *               trailing newline.\n   * @see open()\n   */\n  void (*message)(struct mspack_file *file,\n                  const char *format,\n                  ...);\n\n  /**\n   * Allocates memory.\n   *\n   * @param self     a self-referential pointer to the mspack_system\n   *                 structure whose alloc() method is being called.\n   * @param bytes    the number of bytes to allocate\n   * @result a pointer to the requested number of bytes, or NULL if\n   *         not enough memory is available\n   * @see free()\n   */\n  void * (*alloc)(struct mspack_system *self,\n                  size_t bytes);\n  \n  /**\n   * Frees memory.\n   * \n   * @param ptr the memory to be freed. NULL is accepted and ignored.\n   * @see alloc()\n   */\n  void (*free)(void *ptr);\n\n  /**\n   * Copies from one region of memory to another.\n   * \n   * The regions of memory are guaranteed not to overlap, are usually less\n   * than 256 bytes, and may not be aligned. Please note that the source\n   * parameter comes before the destination parameter, unlike the standard\n   * C function memcpy().\n   *\n   * @param src   the region of memory to copy from\n   * @param dest  the region of memory to copy to\n   * @param bytes the size of the memory region, in bytes\n   */\n  void (*copy)(void *src,\n               void *dest,\n               size_t bytes);\n\n  /**\n   * A null pointer to mark the end of mspack_system. It must equal NULL.\n   *\n   * Should the mspack_system structure extend in the future, this NULL\n   * will be seen, rather than have an invalid method pointer called.\n   */\n  void *null_ptr;\n};\n\n/** mspack_system::open() mode: open existing file for reading. */\n#define MSPACK_SYS_OPEN_READ   (0)\n/** mspack_system::open() mode: open new file for writing */\n#define MSPACK_SYS_OPEN_WRITE  (1)\n/** mspack_system::open() mode: open existing file for writing */\n#define MSPACK_SYS_OPEN_UPDATE (2)\n/** mspack_system::open() mode: open existing file for writing */\n#define MSPACK_SYS_OPEN_APPEND (3)\n\n/** mspack_system::seek() mode: seek relative to start of file */\n#define MSPACK_SYS_SEEK_START  (0)\n/** mspack_system::seek() mode: seek relative to current offset */\n#define MSPACK_SYS_SEEK_CUR    (1)\n/** mspack_system::seek() mode: seek relative to end of file */\n#define MSPACK_SYS_SEEK_END    (2)\n\n/** \n * A structure which represents an open file handle. The contents of this\n * structure are determined by the implementation of the\n * mspack_system::open() method.\n */\nstruct mspack_file {\n  int dummy;\n};\n\n/* --- error codes --------------------------------------------------------- */\n\n/** Error code: no error */\n#define MSPACK_ERR_OK          (0)\n/** Error code: bad arguments to method */\n#define MSPACK_ERR_ARGS        (1)\n/** Error code: error opening file */\n#define MSPACK_ERR_OPEN        (2)\n/** Error code: error reading file */\n#define MSPACK_ERR_READ        (3)\n/** Error code: error writing file */\n#define MSPACK_ERR_WRITE       (4)\n/** Error code: seek error */\n#define MSPACK_ERR_SEEK        (5)\n/** Error code: out of memory */\n#define MSPACK_ERR_NOMEMORY    (6)\n/** Error code: bad \"magic id\" in file */\n#define MSPACK_ERR_SIGNATURE   (7)\n/** Error code: bad or corrupt file format */\n#define MSPACK_ERR_DATAFORMAT  (8)\n/** Error code: bad checksum or CRC */\n#define MSPACK_ERR_CHECKSUM    (9)\n/** Error code: error during compression */\n#define MSPACK_ERR_CRUNCH      (10)\n/** Error code: error during decompression */\n#define MSPACK_ERR_DECRUNCH    (11)\n\n/* --- functions available in library -------------------------------------- */\n\n/** Creates a new CAB compressor.\n * @param sys a custom mspack_system structure, or NULL to use the default\n * @return a #mscab_compressor or NULL\n */\nextern struct mscab_compressor *\n  mspack_create_cab_compressor(struct mspack_system *sys);\n\n/** Creates a new CAB decompressor.\n * @param sys a custom mspack_system structure, or NULL to use the default\n * @return a #mscab_decompressor or NULL\n */\nextern struct mscab_decompressor *\n  mspack_create_cab_decompressor(struct mspack_system *sys);\n\n/** Destroys an existing CAB compressor.\n * @param self the #mscab_compressor to destroy\n */\nextern void mspack_destroy_cab_compressor(struct mscab_compressor *self);\n\n/** Destroys an existing CAB decompressor.\n * @param self the #mscab_decompressor to destroy\n */\nextern void mspack_destroy_cab_decompressor(struct mscab_decompressor *self);\n\n\n/** Creates a new CHM compressor.\n * @param sys a custom mspack_system structure, or NULL to use the default\n * @return a #mschm_compressor or NULL\n */\nextern struct mschm_compressor *\n  mspack_create_chm_compressor(struct mspack_system *sys);\n\n/** Creates a new CHM decompressor.\n * @param sys a custom mspack_system structure, or NULL to use the default\n * @return a #mschm_decompressor or NULL\n */\nextern struct mschm_decompressor *\n  mspack_create_chm_decompressor(struct mspack_system *sys);\n\n/** Destroys an existing CHM compressor.\n * @param self the #mschm_compressor to destroy\n */\nextern void mspack_destroy_chm_compressor(struct mschm_compressor *self);\n\n/** Destroys an existing CHM decompressor.\n * @param self the #mschm_decompressor to destroy\n */\nextern void mspack_destroy_chm_decompressor(struct mschm_decompressor *self);\n\n\n/** Creates a new LIT compressor.\n * @param sys a custom mspack_system structure, or NULL to use the default\n * @return a #mslit_compressor or NULL\n */\nextern struct mslit_compressor *\n  mspack_create_lit_compressor(struct mspack_system *sys);\n\n/** Creates a new LIT decompressor.\n * @param sys a custom mspack_system structure, or NULL to use the default\n * @return a #mslit_decompressor or NULL\n */\nextern struct mslit_decompressor *\n  mspack_create_lit_decompressor(struct mspack_system *sys);\n\n/** Destroys an existing LIT compressor.\n * @param self the #mslit_compressor to destroy\n */\nextern void mspack_destroy_lit_compressor(struct mslit_compressor *self);\n\n/** Destroys an existing LIT decompressor.\n * @param self the #mslit_decompressor to destroy\n */\nextern void mspack_destroy_lit_decompressor(struct mslit_decompressor *self);\n\n\n/** Creates a new HLP compressor.\n * @param sys a custom mspack_system structure, or NULL to use the default\n * @return a #mshlp_compressor or NULL\n */\nextern struct mshlp_compressor *\n  mspack_create_hlp_compressor(struct mspack_system *sys);\n\n/** Creates a new HLP decompressor.\n * @param sys a custom mspack_system structure, or NULL to use the default\n * @return a #mshlp_decompressor or NULL\n */\nextern struct mshlp_decompressor *\n  mspack_create_hlp_decompressor(struct mspack_system *sys);\n\n/** Destroys an existing hlp compressor.\n * @param self the #mshlp_compressor to destroy\n */\nextern void mspack_destroy_hlp_compressor(struct mshlp_compressor *self);\n\n/** Destroys an existing hlp decompressor.\n * @param self the #mshlp_decompressor to destroy\n */\nextern void mspack_destroy_hlp_decompressor(struct mshlp_decompressor *self);\n\n\n/** Creates a new SZDD compressor.\n * @param sys a custom mspack_system structure, or NULL to use the default\n * @return a #msszdd_compressor or NULL\n */\nextern struct msszdd_compressor *\n  mspack_create_szdd_compressor(struct mspack_system *sys);\n\n/** Creates a new SZDD decompressor.\n * @param sys a custom mspack_system structure, or NULL to use the default\n * @return a #msszdd_decompressor or NULL\n */\nextern struct msszdd_decompressor *\n  mspack_create_szdd_decompressor(struct mspack_system *sys);\n\n/** Destroys an existing SZDD compressor.\n * @param self the #msszdd_compressor to destroy\n */\nextern void mspack_destroy_szdd_compressor(struct msszdd_compressor *self);\n\n/** Destroys an existing SZDD decompressor.\n * @param self the #msszdd_decompressor to destroy\n */\nextern void mspack_destroy_szdd_decompressor(struct msszdd_decompressor *self);\n\n\n/** Creates a new KWAJ compressor.\n * @param sys a custom mspack_system structure, or NULL to use the default\n * @return a #mskwaj_compressor or NULL\n */\nextern struct mskwaj_compressor *\n  mspack_create_kwaj_compressor(struct mspack_system *sys);\n\n/** Creates a new KWAJ decompressor.\n * @param sys a custom mspack_system structure, or NULL to use the default\n * @return a #mskwaj_decompressor or NULL\n */\nextern struct mskwaj_decompressor *\n  mspack_create_kwaj_decompressor(struct mspack_system *sys);\n\n/** Destroys an existing KWAJ compressor.\n * @param self the #mskwaj_compressor to destroy\n */\nextern void mspack_destroy_kwaj_compressor(struct mskwaj_compressor *self);\n\n/** Destroys an existing KWAJ decompressor.\n * @param self the #mskwaj_decompressor to destroy\n */\nextern void mspack_destroy_kwaj_decompressor(struct mskwaj_decompressor *self);\n\n\n/** Creates a new OAB compressor.\n * @param sys a custom mspack_system structure, or NULL to use the default\n * @return a #msoab_compressor or NULL\n */\nextern struct msoab_compressor *\n  mspack_create_oab_compressor(struct mspack_system *sys);\n\n/** Creates a new OAB decompressor.\n * @param sys a custom mspack_system structure, or NULL to use the default\n * @return a #msoab_decompressor or NULL\n */\nextern struct msoab_decompressor *\n  mspack_create_oab_decompressor(struct mspack_system *sys);\n\n/** Destroys an existing OAB compressor.\n * @param self the #msoab_compressor to destroy\n */\nextern void mspack_destroy_oab_compressor(struct msoab_compressor *self);\n\n/** Destroys an existing OAB decompressor.\n * @param self the #msoab_decompressor to destroy\n */\nextern void mspack_destroy_oab_decompressor(struct msoab_decompressor *self);\n\n\n/* --- support for .CAB (MS Cabinet) file format --------------------------- */\n\n/**\n * A structure which represents a single cabinet file.\n *\n * All fields are READ ONLY.\n *\n * If this cabinet is part of a merged cabinet set, the #files and #folders\n * fields are common to all cabinets in the set, and will be identical.\n *\n * @see mscab_decompressor::open(), mscab_decompressor::close(),\n *      mscab_decompressor::search()\n */\nstruct mscabd_cabinet {\n  /**\n   * The next cabinet in a chained list, if this cabinet was opened with\n   * mscab_decompressor::search(). May be NULL to mark the end of the\n   * list.\n   */\n  struct mscabd_cabinet *next;\n\n  /**\n   * The filename of the cabinet. More correctly, the filename of the\n   * physical file that the cabinet resides in. This is given by the\n   * library user and may be in any format.\n   */\n  const char *filename;\n  \n  /** The file offset of cabinet within the physical file it resides in. */\n  off_t base_offset;\n\n  /** The length of the cabinet file in bytes. */\n  unsigned int length;\n\n  /** The previous cabinet in a cabinet set, or NULL. */\n  struct mscabd_cabinet *prevcab;\n\n  /** The next cabinet in a cabinet set, or NULL. */\n  struct mscabd_cabinet *nextcab;\n\n  /** The filename of the previous cabinet in a cabinet set, or NULL. */\n  char *prevname;\n\n  /** The filename of the next cabinet in a cabinet set, or NULL. */\n  char *nextname;\n\n  /** The name of the disk containing the previous cabinet in a cabinet\n   * set, or NULL.\n   */\n  char *previnfo;\n\n  /** The name of the disk containing the next cabinet in a cabinet set,\n   * or NULL.\n   */\n  char *nextinfo;\n\n  /** A list of all files in the cabinet or cabinet set. */\n  struct mscabd_file *files;\n\n  /** A list of all folders in the cabinet or cabinet set. */\n  struct mscabd_folder *folders;\n\n  /** \n   * The set ID of the cabinet. All cabinets in the same set should have\n   * the same set ID.\n   */\n  unsigned short set_id;\n\n  /**\n   * The index number of the cabinet within the set. Numbering should\n   * start from 0 for the first cabinet in the set, and increment by 1 for\n   * each following cabinet.\n   */\n  unsigned short set_index;\n\n  /**\n   * The number of bytes reserved in the header area of the cabinet.\n   *\n   * If this is non-zero and flags has MSCAB_HDR_RESV set, this data can\n   * be read by the calling application. It is of the given length,\n   * located at offset (base_offset + MSCAB_HDR_RESV_OFFSET) in the\n   * cabinet file.\n   *\n   * @see flags\n   */\n  unsigned short header_resv;\n\n  /**\n   * Header flags.\n   *\n   * - MSCAB_HDR_PREVCAB indicates the cabinet is part of a cabinet set, and\n   *                     has a predecessor cabinet.\n   * - MSCAB_HDR_NEXTCAB indicates the cabinet is part of a cabinet set, and\n   *                     has a successor cabinet.\n   * - MSCAB_HDR_RESV indicates the cabinet has reserved header space.\n   *\n   * @see prevname, previnfo, nextname, nextinfo, header_resv\n   */\n  int flags;\n};\n\n/** Offset from start of cabinet to the reserved header data (if present). */\n#define MSCAB_HDR_RESV_OFFSET (0x28)\n\n/** Cabinet header flag: cabinet has a predecessor */\n#define MSCAB_HDR_PREVCAB (0x01)\n/** Cabinet header flag: cabinet has a successor */\n#define MSCAB_HDR_NEXTCAB (0x02)\n/** Cabinet header flag: cabinet has reserved header space */\n#define MSCAB_HDR_RESV    (0x04)\n\n/**\n * A structure which represents a single folder in a cabinet or cabinet set.\n *\n * All fields are READ ONLY.\n *\n * A folder is a single compressed stream of data. When uncompressed, it\n * holds the data of one or more files. A folder may be split across more\n * than one cabinet.\n */\nstruct mscabd_folder {\n  /**\n   * A pointer to the next folder in this cabinet or cabinet set, or NULL\n   * if this is the final folder.\n   */\n  struct mscabd_folder *next;\n\n  /** \n   * The compression format used by this folder.\n   *\n   * The macro MSCABD_COMP_METHOD() should be used on this field to get\n   * the algorithm used. The macro MSCABD_COMP_LEVEL() should be used to get\n   * the \"compression level\".\n   *\n   * @see MSCABD_COMP_METHOD(), MSCABD_COMP_LEVEL()\n   */\n  int comp_type;\n\n  /**\n   * The total number of data blocks used by this folder. This includes\n   * data blocks present in other files, if this folder spans more than\n   * one cabinet.\n   */\n  unsigned int num_blocks;\n};\n\n/**\n * Returns the compression method used by a folder.\n *\n * @param comp_type a mscabd_folder::comp_type value\n * @return one of #MSCAB_COMP_NONE, #MSCAB_COMP_MSZIP, #MSCAB_COMP_QUANTUM\n *         or #MSCAB_COMP_LZX\n */\n#define MSCABD_COMP_METHOD(comp_type) ((comp_type) & 0x0F)\n/**\n * Returns the compression level used by a folder.\n *\n * @param comp_type a mscabd_folder::comp_type value\n * @return the compression level. This is only defined by LZX and Quantum\n *         compression\n */\n#define MSCABD_COMP_LEVEL(comp_type) (((comp_type) >> 8) & 0x1F)\n\n/** Compression mode: no compression. */\n#define MSCAB_COMP_NONE       (0)\n/** Compression mode: MSZIP (deflate) compression. */\n#define MSCAB_COMP_MSZIP      (1)\n/** Compression mode: Quantum compression */\n#define MSCAB_COMP_QUANTUM    (2)\n/** Compression mode: LZX compression */\n#define MSCAB_COMP_LZX        (3)\n\n/**\n * A structure which represents a single file in a cabinet or cabinet set.\n *\n * All fields are READ ONLY.\n */\nstruct mscabd_file {\n  /**\n   * The next file in the cabinet or cabinet set, or NULL if this is the\n   * final file.\n   */\n  struct mscabd_file *next;\n\n  /**\n   * The filename of the file.\n   *\n   * A null terminated string of up to 255 bytes in length, it may be in\n   * either ISO-8859-1 or UTF8 format, depending on the file attributes.\n   *\n   * @see attribs\n   */\n  char *filename;\n\n  /** The uncompressed length of the file, in bytes. */\n  unsigned int length;\n\n  /**\n   * File attributes.\n   *\n   * The following attributes are defined:\n   * - #MSCAB_ATTRIB_RDONLY indicates the file is write protected.\n   * - #MSCAB_ATTRIB_HIDDEN indicates the file is hidden.\n   * - #MSCAB_ATTRIB_SYSTEM indicates the file is a operating system file.\n   * - #MSCAB_ATTRIB_ARCH indicates the file is \"archived\".\n   * - #MSCAB_ATTRIB_EXEC indicates the file is an executable program.\n   * - #MSCAB_ATTRIB_UTF_NAME indicates the filename is in UTF8 format rather\n   *   than ISO-8859-1.\n   */\n  int attribs;\n\n  /** File's last modified time, hour field. */\n  char time_h;\n  /** File's last modified time, minute field. */\n  char time_m;\n  /** File's last modified time, second field. */\n  char time_s;\n\n  /** File's last modified date, day field. */\n  char date_d;\n  /** File's last modified date, month field. */\n  char date_m;\n  /** File's last modified date, year field. */\n  int date_y;\n\n  /** A pointer to the folder that contains this file. */\n  struct mscabd_folder *folder;\n\n  /** The uncompressed offset of this file in its folder. */\n  unsigned int offset;\n};\n\n/** mscabd_file::attribs attribute: file is read-only. */\n#define MSCAB_ATTRIB_RDONLY   (0x01)\n/** mscabd_file::attribs attribute: file is hidden. */\n#define MSCAB_ATTRIB_HIDDEN   (0x02)\n/** mscabd_file::attribs attribute: file is an operating system file. */\n#define MSCAB_ATTRIB_SYSTEM   (0x04)\n/** mscabd_file::attribs attribute: file is \"archived\". */\n#define MSCAB_ATTRIB_ARCH     (0x20)\n/** mscabd_file::attribs attribute: file is an executable program. */\n#define MSCAB_ATTRIB_EXEC     (0x40)\n/** mscabd_file::attribs attribute: filename is UTF8, not ISO-8859-1. */\n#define MSCAB_ATTRIB_UTF_NAME (0x80)\n\n/** mscab_decompressor::set_param() parameter: search buffer size. */\n#define MSCABD_PARAM_SEARCHBUF (0)\n/** mscab_decompressor::set_param() parameter: repair MS-ZIP streams? */\n#define MSCABD_PARAM_FIXMSZIP  (1)\n/** mscab_decompressor::set_param() parameter: size of decompression buffer */\n#define MSCABD_PARAM_DECOMPBUF (2)\n/** mscab_decompressor::set_param() parameter: salvage data from bad cabinets?\n * If enabled, open() will skip file with bad folder indices or filenames\n * rather than reject the whole cabinet, and extract() will limit rather than\n * reject files with invalid offsets and lengths, and bad data block checksums\n * will be ignored. Available only in CAB decoder version 2 and above.\n */\n#define MSCABD_PARAM_SALVAGE   (3)\n\n/** TODO */\nstruct mscab_compressor {\n  int dummy; \n};\n\n/**\n * A decompressor for .CAB (Microsoft Cabinet) files\n *\n * All fields are READ ONLY.\n *\n * @see mspack_create_cab_decompressor(), mspack_destroy_cab_decompressor()\n */\nstruct mscab_decompressor {\n  /**\n   * Opens a cabinet file and reads its contents.\n   *\n   * If the file opened is a valid cabinet file, all headers will be read\n   * and a mscabd_cabinet structure will be returned, with a full list of\n   * folders and files.\n   *\n   * In the case of an error occuring, NULL is returned and the error code\n   * is available from last_error().\n   *\n   * The filename pointer should be considered \"in use\" until close() is\n   * called on the cabinet.\n   *\n   * @param  self     a self-referential pointer to the mscab_decompressor\n   *                  instance being called\n   * @param  filename the filename of the cabinet file. This is passed\n   *                  directly to mspack_system::open().\n   * @return a pointer to a mscabd_cabinet structure, or NULL on failure\n   * @see close(), search(), last_error()\n   */\n  struct mscabd_cabinet * (*open) (struct mscab_decompressor *self,\n                                   const char *filename);\n\n  /**\n   * Closes a previously opened cabinet or cabinet set.\n   *\n   * This closes a cabinet, all cabinets associated with it via the\n   * mscabd_cabinet::next, mscabd_cabinet::prevcab and\n   * mscabd_cabinet::nextcab pointers, and all folders and files. All\n   * memory used by these entities is freed.\n   *\n   * The cabinet pointer is now invalid and cannot be used again. All\n   * mscabd_folder and mscabd_file pointers from that cabinet or cabinet\n   * set are also now invalid, and cannot be used again.\n   *\n   * If the cabinet pointer given was created using search(), it MUST be\n   * the cabinet pointer returned by search() and not one of the later\n   * cabinet pointers further along the mscabd_cabinet::next chain.\n\n   * If extra cabinets have been added using append() or prepend(), these\n   * will all be freed, even if the cabinet pointer given is not the first\n   * cabinet in the set. Do NOT close() more than one cabinet in the set.\n   *\n   * The mscabd_cabinet::filename is not freed by the library, as it is\n   * not allocated by the library. The caller should free this itself if\n   * necessary, before it is lost forever.\n   *\n   * @param  self     a self-referential pointer to the mscab_decompressor\n   *                  instance being called\n   * @param  cab      the cabinet to close\n   * @see open(), search(), append(), prepend()\n   */\n  void (*close)(struct mscab_decompressor *self,\n                struct mscabd_cabinet *cab);\n\n  /**\n   * Searches a regular file for embedded cabinets.\n   *\n   * This opens a normal file with the given filename and will search the\n   * entire file for embedded cabinet files\n   *\n   * If any cabinets are found, the equivalent of open() is called on each\n   * potential cabinet file at the offset it was found. All successfully\n   * open()ed cabinets are kept in a list.\n   *\n   * The first cabinet found will be returned directly as the result of\n   * this method. Any further cabinets found will be chained in a list\n   * using the mscabd_cabinet::next field.\n   *\n   * In the case of an error occuring anywhere other than the simulated\n   * open(), NULL is returned and the error code is available from\n   * last_error().\n   *\n   * If no error occurs, but no cabinets can be found in the file, NULL is\n   * returned and last_error() returns MSPACK_ERR_OK.\n   *\n   * The filename pointer should be considered in use until close() is\n   * called on the cabinet.\n   *\n   * close() should only be called on the result of search(), not on any\n   * subsequent cabinets in the mscabd_cabinet::next chain.\n   *\n   * @param  self     a self-referential pointer to the mscab_decompressor\n   *                  instance being called\n   * @param  filename the filename of the file to search for cabinets. This\n   *                  is passed directly to mspack_system::open().\n   * @return a pointer to a mscabd_cabinet structure, or NULL\n   * @see close(), open(), last_error()\n   */\n  struct mscabd_cabinet * (*search) (struct mscab_decompressor *self,\n                                     const char *filename);\n\n  /**\n   * Appends one mscabd_cabinet to another, forming or extending a cabinet\n   * set.\n   *\n   * This will attempt to append one cabinet to another such that\n   * <tt>(cab->nextcab == nextcab) && (nextcab->prevcab == cab)</tt> and\n   * any folders split between the two cabinets are merged.\n   *\n   * The cabinets MUST be part of a cabinet set -- a cabinet set is a\n   * cabinet that spans more than one physical cabinet file on disk -- and\n   * must be appropriately matched.\n   *\n   * It can be determined if a cabinet has further parts to load by\n   * examining the mscabd_cabinet::flags field:\n   *\n   * - if <tt>(flags & MSCAB_HDR_PREVCAB)</tt> is non-zero, there is a\n   *   predecessor cabinet to open() and prepend(). Its MS-DOS\n   *   case-insensitive filename is mscabd_cabinet::prevname\n   * - if <tt>(flags & MSCAB_HDR_NEXTCAB)</tt> is non-zero, there is a\n   *   successor cabinet to open() and append(). Its MS-DOS case-insensitive\n   *   filename is mscabd_cabinet::nextname\n   *\n   * If the cabinets do not match, an error code will be returned. Neither\n   * cabinet has been altered, and both should be closed seperately.\n   *\n   * Files and folders in a cabinet set are a single entity. All cabinets\n   * in a set use the same file list, which is updated as cabinets in the\n   * set are added. All pointers to mscabd_folder and mscabd_file\n   * structures in either cabinet must be discarded and re-obtained after\n   * merging.\n   *\n   * @param  self     a self-referential pointer to the mscab_decompressor\n   *                  instance being called\n   * @param  cab      the cabinet which will be appended to,\n   *                  predecessor of nextcab\n   * @param  nextcab  the cabinet which will be appended,\n   *                  successor of cab\n   * @return an error code, or MSPACK_ERR_OK if successful\n   * @see prepend(), open(), close()\n   */\n  int (*append) (struct mscab_decompressor *self,\n                 struct mscabd_cabinet *cab,\n                 struct mscabd_cabinet *nextcab);\n\n  /**\n   * Prepends one mscabd_cabinet to another, forming or extending a\n   * cabinet set.\n   *\n   * This will attempt to prepend one cabinet to another, such that\n   * <tt>(cab->prevcab == prevcab) && (prevcab->nextcab == cab)</tt>. In\n   * all other respects, it is identical to append(). See append() for the\n   * full documentation.\n   *\n   * @param  self     a self-referential pointer to the mscab_decompressor\n   *                  instance being called\n   * @param  cab      the cabinet which will be prepended to,\n   *                  successor of prevcab\n   * @param  prevcab  the cabinet which will be prepended,\n   *                  predecessor of cab\n   * @return an error code, or MSPACK_ERR_OK if successful\n   * @see append(), open(), close()\n   */\n  int (*prepend) (struct mscab_decompressor *self,\n                  struct mscabd_cabinet *cab,\n                  struct mscabd_cabinet *prevcab);\n\n  /**\n   * Extracts a file from a cabinet or cabinet set.\n   *\n   * This extracts a compressed file in a cabinet and writes it to the given\n   * filename.\n   *\n   * The MS-DOS filename of the file, mscabd_file::filename, is NOT USED\n   * by extract(). The caller must examine this MS-DOS filename, copy and\n   * change it as necessary, create directories as necessary, and provide\n   * the correct filename as a parameter, which will be passed unchanged\n   * to the decompressor's mspack_system::open()\n   *\n   * If the file belongs to a split folder in a multi-part cabinet set,\n   * and not enough parts of the cabinet set have been loaded and appended\n   * or prepended, an error will be returned immediately.\n   *\n   * @param  self     a self-referential pointer to the mscab_decompressor\n   *                  instance being called\n   * @param  file     the file to be decompressed\n   * @param  filename the filename of the file being written to\n   * @return an error code, or MSPACK_ERR_OK if successful\n   */\n  int (*extract)(struct mscab_decompressor *self,\n                 struct mscabd_file *file,\n                 const char *filename);\n\n  /**\n   * Sets a CAB decompression engine parameter.\n   *\n   * The following parameters are defined:\n   * - #MSCABD_PARAM_SEARCHBUF: How many bytes should be allocated as a\n   *   buffer when using search()? The minimum value is 4.  The default\n   *   value is 32768.\n   * - #MSCABD_PARAM_FIXMSZIP: If non-zero, extract() will ignore bad\n   *   checksums and recover from decompression errors in MS-ZIP\n   *   compressed folders. The default value is 0 (don't recover).\n   * - #MSCABD_PARAM_DECOMPBUF: How many bytes should be used as an input\n   *   bit buffer by decompressors? The minimum value is 4. The default\n   *   value is 4096.\n   *\n   * @param  self     a self-referential pointer to the mscab_decompressor\n   *                  instance being called\n   * @param  param    the parameter to set\n   * @param  value    the value to set the parameter to\n   * @return MSPACK_ERR_OK if all is OK, or MSPACK_ERR_ARGS if there\n   *         is a problem with either parameter or value.\n   * @see search(), extract()\n   */\n  int (*set_param)(struct mscab_decompressor *self,\n                   int param,\n                   int value);\n\n  /**\n   * Returns the error code set by the most recently called method.\n   *\n   * This is useful for open() and search(), which do not return an error\n   * code directly.\n   *\n   * @param  self     a self-referential pointer to the mscab_decompressor\n   *                  instance being called\n   * @return the most recent error code\n   * @see open(), search()\n   */\n  int (*last_error)(struct mscab_decompressor *self);\n};\n\n/* --- support for .CHM (HTMLHelp) file format ----------------------------- */\n\n/**\n * A structure which represents a file to be placed in a CHM helpfile.\n *\n * A contiguous array of these structures should be passed to\n * mschm_compressor::generate(). The array list is terminated with an\n * entry whose mschmc_file::section field is set to #MSCHMC_ENDLIST, the\n * other fields in this entry are ignored.\n */\nstruct mschmc_file {\n  /** One of #MSCHMC_ENDLIST, #MSCHMC_UNCOMP or #MSCHMC_MSCOMP. */\n  int section;\n\n  /** The filename of the source file that will be added to the CHM. This\n   * is passed directly to mspack_system::open(). */\n  const char *filename;\n\n  /** The full path and filename of the file within the CHM helpfile, a\n   * UTF-1 encoded null-terminated string. */\n  char *chm_filename;\n\n  /** The length of the file, in bytes. This will be adhered to strictly\n   * and a read error will be issued if this many bytes cannot be read\n   * from the real file at CHM generation time. */\n  off_t length;\n};\n\n/**\n * A structure which represents a section of a CHM helpfile.\n *\n * All fields are READ ONLY.\n *\n * Not used directly, but used as a generic base type for\n * mschmd_sec_uncompressed and mschmd_sec_mscompressed.\n */\nstruct mschmd_section {\n  /** A pointer to the CHM helpfile that contains this section. */\n  struct mschmd_header *chm;\n\n  /**\n   * The section ID. Either 0 for the uncompressed section\n   * mschmd_sec_uncompressed, or 1 for the LZX compressed section\n   * mschmd_sec_mscompressed. No other section IDs are known.\n   */\n  unsigned int id;\n};\n\n/**\n * A structure which represents the uncompressed section of a CHM helpfile.\n * \n * All fields are READ ONLY.\n */\nstruct mschmd_sec_uncompressed {\n  /** Generic section data. */\n  struct mschmd_section base;\n\n  /** The file offset of where this section begins in the CHM helpfile. */\n  off_t offset;\n};\n\n/**\n * A structure which represents the LZX compressed section of a CHM helpfile. \n * \n * All fields are READ ONLY.\n */\nstruct mschmd_sec_mscompressed {\n  /** Generic section data. */\n  struct mschmd_section base;\n\n  /** A pointer to the meta-file which represents all LZX compressed data. */\n  struct mschmd_file *content;\n\n  /** A pointer to the file which contains the LZX control data. */\n  struct mschmd_file *control;\n\n  /** A pointer to the file which contains the LZX reset table. */\n  struct mschmd_file *rtable;\n\n  /** A pointer to the file which contains the LZX span information.\n   * Available only in CHM decoder version 2 and above.\n   */\n  struct mschmd_file *spaninfo;\n};\n\n/**\n * A structure which represents a CHM helpfile.\n * \n * All fields are READ ONLY.\n */\nstruct mschmd_header {\n  /** The version of the CHM file format used in this file. */\n  unsigned int version;\n\n  /**\n   * The \"timestamp\" of the CHM helpfile. \n   *\n   * It is the lower 32 bits of a 64-bit value representing the number of\n   * centiseconds since 1601-01-01 00:00:00 UTC, plus 42. It is not useful\n   * as a timestamp, but it is useful as a semi-unique ID.\n   */\n  unsigned int timestamp;\n      \n  /**\n   * The default Language and Country ID (LCID) of the user who ran the\n   * HTMLHelp Compiler. This is not the language of the CHM file itself.\n   */\n  unsigned int language;\n\n  /**\n   * The filename of the CHM helpfile. This is given by the library user\n   * and may be in any format.\n   */\n  const char *filename;\n\n  /** The length of the CHM helpfile, in bytes. */\n  off_t length;\n\n  /** A list of all non-system files in the CHM helpfile. */\n  struct mschmd_file *files;\n\n  /**\n   * A list of all system files in the CHM helpfile.\n   *\n   * System files are files which begin with \"::\". They are meta-files\n   * generated by the CHM creation process.\n   */\n  struct mschmd_file *sysfiles;\n\n  /** The section 0 (uncompressed) data in this CHM helpfile. */\n  struct mschmd_sec_uncompressed sec0;\n\n  /** The section 1 (MSCompressed) data in this CHM helpfile. */\n  struct mschmd_sec_mscompressed sec1;\n\n  /** The file offset of the first PMGL/PMGI directory chunk. */\n  off_t dir_offset;\n\n  /** The number of PMGL/PMGI directory chunks in this CHM helpfile. */\n  unsigned int num_chunks;\n\n  /** The size of each PMGL/PMGI chunk, in bytes. */\n  unsigned int chunk_size;\n\n  /** The \"density\" of the quick-reference section in PMGL/PMGI chunks. */\n  unsigned int density;\n\n  /** The depth of the index tree.\n   *\n   * - if 1, there are no PMGI chunks, only PMGL chunks.\n   * - if 2, there is 1 PMGI chunk. All chunk indices point to PMGL chunks.\n   * - if 3, the root PMGI chunk points to secondary PMGI chunks, which in\n   *         turn point to PMGL chunks.\n   * - and so on...\n   */\n  unsigned int depth;\n\n  /**\n   * The number of the root PMGI chunk.\n   *\n   * If there is no index in the CHM helpfile, this will be 0xFFFFFFFF.\n   */\n  unsigned int index_root;\n\n  /**\n   * The number of the first PMGL chunk. Usually zero.\n   * Available only in CHM decoder version 2 and above.\n   */\n  unsigned int first_pmgl;\n\n  /**\n   * The number of the last PMGL chunk. Usually num_chunks-1.\n   * Available only in CHM decoder version 2 and above.\n   */\n  unsigned int last_pmgl;\n\n  /**\n   * A cache of loaded chunks, filled in by mschm_decoder::fast_find().\n   * Available only in CHM decoder version 2 and above.\n   */\n  unsigned char **chunk_cache;\n};\n\n/**\n * A structure which represents a file stored in a CHM helpfile.\n * \n * All fields are READ ONLY.\n */\nstruct mschmd_file {\n  /**\n   * A pointer to the next file in the list, or NULL if this is the final\n   * file.\n   */\n  struct mschmd_file *next;\n\n  /**\n   * A pointer to the section that this file is located in. Indirectly,\n   * it also points to the CHM helpfile the file is located in.\n   */\n  struct mschmd_section *section;\n\n  /** The offset within the section data that this file is located at. */\n  off_t offset;\n\n  /** The length of this file, in bytes */\n  off_t length;\n\n  /** The filename of this file -- a null terminated string in UTF-8. */\n  char *filename;\n};\n\n/** mschmc_file::section value: end of CHM file list */\n#define MSCHMC_ENDLIST   (0)\n/** mschmc_file::section value: this file is in the Uncompressed section */\n#define MSCHMC_UNCOMP    (1)\n/** mschmc_file::section value: this file is in the MSCompressed section */\n#define MSCHMC_MSCOMP    (2)\n \n/** mschm_compressor::set_param() parameter: \"timestamp\" header */\n#define MSCHMC_PARAM_TIMESTAMP  (0)\n/** mschm_compressor::set_param() parameter: \"language\" header */\n#define MSCHMC_PARAM_LANGUAGE   (1)\n/** mschm_compressor::set_param() parameter: LZX window size */\n#define MSCHMC_PARAM_LZXWINDOW  (2)\n/** mschm_compressor::set_param() parameter: intra-chunk quickref density */\n#define MSCHMC_PARAM_DENSITY    (3)\n/** mschm_compressor::set_param() parameter: whether to create indices */\n#define MSCHMC_PARAM_INDEX      (4)\n\n/**\n * A compressor for .CHM (Microsoft HTMLHelp) files.\n *\n * All fields are READ ONLY.\n *\n * @see mspack_create_chm_compressor(), mspack_destroy_chm_compressor()\n */\nstruct mschm_compressor {\n  /**\n   * Generates a CHM help file.\n   *\n   * The help file will contain up to two sections, an Uncompressed\n   * section and potentially an MSCompressed (LZX compressed)\n   * section.\n   *\n   * While the contents listing of a CHM file is always in lexical order,\n   * the file list passed in will be taken as the correct order for files\n   * within the sections.  It is in your interest to place similar files\n   * together for better compression.\n   *\n   * There are two modes of generation, to use a temporary file or not to\n   * use one. See use_temporary_file() for the behaviour of generate() in\n   * these two different modes.\n   *\n   * @param  self        a self-referential pointer to the mschm_compressor\n   *                     instance being called\n   * @param  file_list   an array of mschmc_file structures, terminated\n   *                     with an entry whose mschmc_file::section field is\n   *                     #MSCHMC_ENDLIST. The order of the list is\n   *                     preserved within each section. The length of any\n   *                     mschmc_file::chm_filename string cannot exceed\n   *                     roughly 4096 bytes. Each source file must be able\n   *                     to supply as many bytes as given in the\n   *                     mschmc_file::length field.\n   * @param  output_file the file to write the generated CHM helpfile to.\n   *                     This is passed directly to mspack_system::open()\n   * @return an error code, or MSPACK_ERR_OK if successful\n   * @see use_temporary_file() set_param()\n   */\n  int (*generate)(struct mschm_compressor *self,\n                  struct mschmc_file file_list[],\n                  const char *output_file);\n\n  /**\n   * Specifies whether a temporary file is used during CHM generation.\n   *\n   * The CHM file format includes data about the compressed section (such\n   * as its overall size) that is stored in the output CHM file prior to\n   * the compressed section itself. This unavoidably requires that the\n   * compressed section has to be generated, before these details can be\n   * set. There are several ways this can be handled. Firstly, the\n   * compressed section could be generated entirely in memory before\n   * writing any of the output CHM file. This approach is not used in\n   * libmspack, as the compressed section can exceed the addressable\n   * memory space on most architectures.\n   *\n   * libmspack has two options, either to write these unknowable sections\n   * with blank data, generate the compressed section, then re-open the\n   * output file for update once the compressed section has been\n   * completed, or to write the compressed section to a temporary file,\n   * then write the entire output file at once, performing a simple\n   * file-to-file copy for the compressed section.\n   *\n   * The simple solution of buffering the entire compressed section in\n   * memory can still be used, if desired. As the temporary file's\n   * filename is passed directly to mspack_system::open(), it is possible\n   * for a custom mspack_system implementation to hold this file in memory,\n   * without writing to a disk.\n   *\n   * If a temporary file is set, generate() performs the following\n   * sequence of events: the temporary file is opened for writing, the\n   * compression algorithm writes to the temporary file, the temporary\n   * file is closed.  Then the output file is opened for writing and the\n   * temporary file is re-opened for reading. The output file is written\n   * and the temporary file is read from. Both files are then closed. The\n   * temporary file itself is not deleted. If that is desired, the\n   * temporary file should be deleted after the completion of generate(),\n   * if it exists.\n   *\n   * If a temporary file is set not to be used, generate() performs the\n   * following sequence of events: the output file is opened for writing,\n   * then it is written and closed. The output file is then re-opened for\n   * update, the appropriate sections are seek()ed to and re-written, then\n   * the output file is closed.\n   *\n   * @param  self          a self-referential pointer to the\n   *                       mschm_compressor instance being called\n   * @param  use_temp_file non-zero if the temporary file should be used,\n   *                       zero if the temporary file should not be used.\n   * @param  temp_file     a file to temporarily write compressed data to,\n   *                       before opening it for reading and copying the\n   *                       contents to the output file. This is passed\n   *                       directly to mspack_system::open().\n   * @return an error code, or MSPACK_ERR_OK if successful\n   * @see generate()\n   */\n  int (*use_temporary_file)(struct mschm_compressor *self,\n                            int use_temp_file,\n                            const char *temp_file);\n  /**\n   * Sets a CHM compression engine parameter.\n   *\n   * The following parameters are defined:\n\n   * - #MSCHMC_PARAM_TIMESTAMP: Sets the \"timestamp\" of the CHM file\n   *   generated. This is not a timestamp, see mschmd_header::timestamp\n   *   for a description. If this timestamp is 0, generate() will use its\n   *   own algorithm for making a unique ID, based on the lengths and\n   *   names of files in the CHM itself. Defaults to 0, any value between\n   *   0 and (2^32)-1 is valid.\n   * - #MSCHMC_PARAM_LANGUAGE: Sets the \"language\" of the CHM file\n   *   generated.  This is not the language used in the CHM file, but the\n   *   language setting of the user who ran the HTMLHelp compiler. It\n   *   defaults to 0x0409. The valid range is between 0x0000 and 0x7F7F.\n   * - #MSCHMC_PARAM_LZXWINDOW: Sets the size of the LZX history window,\n   *   which is also the interval at which the compressed data stream can be\n   *   randomly accessed. The value is not a size in bytes, but a power of\n   *   two. The default value is 16 (which makes the window 2^16 bytes, or\n   *   64 kilobytes), the valid range is from 15 (32 kilobytes) to 21 (2\n   *   megabytes).\n   * - #MSCHMC_PARAM_DENSITY: Sets the \"density\" of quick reference\n   *   entries stored at the end of directory listing chunk. Each chunk is\n   *   4096 bytes in size, and contains as many file entries as there is\n   *   room for. At the other end of the chunk, a list of \"quick reference\"\n   *   pointers is included. The offset of every 'N'th file entry is given a\n   *   quick reference, where N = (2^density) + 1. The default density is\n   *   2. The smallest density is 0 (N=2), the maximum is 10 (N=1025). As\n   *   each file entry requires at least 5 bytes, the maximum number of\n   *   entries in a single chunk is roughly 800, so the maximum value 10\n   *   can be used to indicate there are no quickrefs at all.\n   * - #MSCHMC_PARAM_INDEX: Sets whether or not to include quick lookup\n   *   index chunk(s), in addition to normal directory listing chunks. A\n   *   value of zero means no index chunks will be created, a non-zero value\n   *   means index chunks will be created. The default is zero, \"don't\n   *   create an index\".\n   *\n   * @param  self     a self-referential pointer to the mschm_compressor\n   *                  instance being called\n   * @param  param    the parameter to set\n   * @param  value    the value to set the parameter to\n   * @return MSPACK_ERR_OK if all is OK, or MSPACK_ERR_ARGS if there\n   *         is a problem with either parameter or value.\n   * @see generate()\n   */\n  int (*set_param)(struct mschm_compressor *self,\n                   int param,\n                   unsigned int value);\n\n  /**\n   * Returns the error code set by the most recently called method.\n   *\n   * @param  self     a self-referential pointer to the mschm_compressor\n   *                  instance being called\n   * @return the most recent error code\n   * @see set_param(), generate()\n   */\n  int (*last_error)(struct mschm_compressor *self);\n};\n\n/**\n * A decompressor for .CHM (Microsoft HTMLHelp) files\n *\n * All fields are READ ONLY.\n *\n * @see mspack_create_chm_decompressor(), mspack_destroy_chm_decompressor()\n */\nstruct mschm_decompressor {\n  /**\n   * Opens a CHM helpfile and reads its contents.\n   *\n   * If the file opened is a valid CHM helpfile, all headers will be read\n   * and a mschmd_header structure will be returned, with a full list of\n   * files.\n   *\n   * In the case of an error occuring, NULL is returned and the error code\n   * is available from last_error().\n   *\n   * The filename pointer should be considered \"in use\" until close() is\n   * called on the CHM helpfile.\n   *\n   * @param  self     a self-referential pointer to the mschm_decompressor\n   *                  instance being called\n   * @param  filename the filename of the CHM helpfile. This is passed\n   *                  directly to mspack_system::open().\n   * @return a pointer to a mschmd_header structure, or NULL on failure\n   * @see close()\n   */\n  struct mschmd_header *(*open)(struct mschm_decompressor *self,\n                                const char *filename);\n\n  /**\n   * Closes a previously opened CHM helpfile.\n   *\n   * This closes a CHM helpfile, frees the mschmd_header and all\n   * mschmd_file structures associated with it (if any). This works on\n   * both helpfiles opened with open() and helpfiles opened with\n   * fast_open().\n   *\n   * The CHM header pointer is now invalid and cannot be used again. All\n   * mschmd_file pointers referencing that CHM are also now invalid, and\n   * cannot be used again.\n   *\n   * @param  self     a self-referential pointer to the mschm_decompressor\n   *                  instance being called\n   * @param  chm      the CHM helpfile to close\n   * @see open(), fast_open()\n   */\n  void (*close)(struct mschm_decompressor *self,\n                struct mschmd_header *chm);\n\n  /**\n   * Extracts a file from a CHM helpfile.\n   *\n   * This extracts a file from a CHM helpfile and writes it to the given\n   * filename. The filename of the file, mscabd_file::filename, is not\n   * used by extract(), but can be used by the caller as a guide for\n   * constructing an appropriate filename.\n   *\n   * This method works both with files found in the mschmd_header::files\n   * and mschmd_header::sysfiles list and mschmd_file structures generated\n   * on the fly by fast_find().\n   *\n   * @param  self     a self-referential pointer to the mschm_decompressor\n   *                  instance being called\n   * @param  file     the file to be decompressed\n   * @param  filename the filename of the file being written to\n   * @return an error code, or MSPACK_ERR_OK if successful\n   */\n  int (*extract)(struct mschm_decompressor *self,\n                 struct mschmd_file *file,\n                 const char *filename);\n\n  /**\n   * Returns the error code set by the most recently called method.\n   *\n   * This is useful for open() and fast_open(), which do not return an\n   * error code directly.\n   *\n   * @param  self     a self-referential pointer to the mschm_decompressor\n   *                  instance being called\n   * @return the most recent error code\n   * @see open(), extract()\n   */\n  int (*last_error)(struct mschm_decompressor *self);\n\n  /**\n   * Opens a CHM helpfile quickly.\n   *\n   * If the file opened is a valid CHM helpfile, only essential headers\n   * will be read. A mschmd_header structure will be still be returned, as\n   * with open(), but the mschmd_header::files field will be NULL. No\n   * files details will be automatically read.  The fast_find() method\n   * must be used to obtain file details.\n   *\n   * In the case of an error occuring, NULL is returned and the error code\n   * is available from last_error().\n   *\n   * The filename pointer should be considered \"in use\" until close() is\n   * called on the CHM helpfile.\n   *\n   * @param  self     a self-referential pointer to the mschm_decompressor\n   *                  instance being called\n   * @param  filename the filename of the CHM helpfile. This is passed\n   *                  directly to mspack_system::open().\n   * @return a pointer to a mschmd_header structure, or NULL on failure\n   * @see open(), close(), fast_find(), extract()\n   */\n  struct mschmd_header *(*fast_open)(struct mschm_decompressor *self,\n                                     const char *filename);\n\n  /**\n   * Finds file details quickly.\n   *\n   * Instead of reading all CHM helpfile headers and building a list of\n   * files, fast_open() and fast_find() are intended for finding file\n   * details only when they are needed. The CHM file format includes an\n   * on-disk file index to allow this.\n   *\n   * Given a case-sensitive filename, fast_find() will search the on-disk\n   * index for that file.\n   *\n   * If the file was found, the caller-provided mschmd_file structure will\n   * be filled out like so:\n   * - section: the correct value for the found file\n   * - offset: the correct value for the found file\n   * - length: the correct value for the found file\n   * - all other structure elements: NULL or 0\n   *\n   * If the file was not found, MSPACK_ERR_OK will still be returned as the\n   * result, but the caller-provided structure will be filled out like so:\n   * - section: NULL\n   * - offset: 0\n   * - length: 0\n   * - all other structure elements: NULL or 0\n   *\n   * This method is intended to be used in conjunction with CHM helpfiles\n   * opened with fast_open(), but it also works with helpfiles opened\n   * using the regular open().\n   *\n   * @param  self     a self-referential pointer to the mschm_decompressor\n   *                  instance being called\n   * @param  chm      the CHM helpfile to search for the file\n   * @param  filename the filename of the file to search for\n   * @param  f_ptr    a pointer to a caller-provded mschmd_file structure\n   * @param  f_size   <tt>sizeof(struct mschmd_file)</tt>\n   * @return an error code, or MSPACK_ERR_OK if successful\n   * @see open(), close(), fast_find(), extract()\n   */\n  int (*fast_find)(struct mschm_decompressor *self,\n                   struct mschmd_header *chm,\n                   const char *filename,\n                   struct mschmd_file *f_ptr,\n                   int f_size);\n};\n\n/* --- support for .LIT (EBook) file format -------------------------------- */\n\n/** TODO */\nstruct mslit_compressor {\n  int dummy; \n};\n\n/** TODO */\nstruct mslit_decompressor {\n  int dummy; \n};\n\n\n/* --- support for .HLP (MS Help) file format ------------------------------ */\n\n/** TODO */\nstruct mshlp_compressor {\n  int dummy; \n};\n\n/** TODO */\nstruct mshlp_decompressor {\n  int dummy; \n};\n\n\n/* --- support for SZDD file format ---------------------------------------- */\n\n/** msszdd_compressor::set_param() parameter: the missing character */\n#define MSSZDDC_PARAM_MISSINGCHAR (0)\n\n/** msszddd_header::format value - a regular SZDD file */\n#define MSSZDD_FMT_NORMAL (0)\n\n/** msszddd_header::format value - a special QBasic SZDD file */\n#define MSSZDD_FMT_QBASIC (1)\n\n/**\n * A structure which represents an SZDD compressed file.\n *\n * All fields are READ ONLY.\n */\nstruct msszddd_header {\n  /** The file format; either #MSSZDD_FMT_NORMAL or #MSSZDD_FMT_QBASIC */\n  int format;\n\n  /** The amount of data in the SZDD file once uncompressed. */\n  off_t length;\n\n  /**\n   * The last character in the filename, traditionally replaced with an\n   * underscore to show the file is compressed. The null character is used\n   * to show that this character has not been stored (e.g. because the\n   * filename is not known). Generally, only characters that may appear in\n   * an MS-DOS filename (except \".\") are valid.\n   */\n  char missing_char;\n};\n\n/**\n * A compressor for the SZDD file format.\n *\n * All fields are READ ONLY.\n *\n * @see mspack_create_szdd_compressor(), mspack_destroy_szdd_compressor()\n */\nstruct msszdd_compressor {\n  /**\n   * Reads an input file and creates a compressed output file in the\n   * SZDD compressed file format. The SZDD compression format is quick\n   * but gives poor compression. It is possible for the compressed output\n   * file to be larger than the input file.\n   *\n   * Conventionally, SZDD compressed files have the final character in\n   * their filename replaced with an underscore, to show they are\n   * compressed.  The missing character is stored in the compressed file\n   * itself. This is due to the restricted filename conventions of MS-DOS,\n   * most operating systems, such as UNIX, simply append another file\n   * extension to the existing filename. As mspack does not deal with\n   * filenames, this is left up to you. If you wish to set the missing\n   * character stored in the file header, use set_param() with the\n   * #MSSZDDC_PARAM_MISSINGCHAR parameter.\n   *\n   * \"Stream\" compression (where the length of the input data is not\n   * known) is not possible. The length of the input data is stored in the\n   * header of the SZDD file and must therefore be known before any data\n   * is compressed. Due to technical limitations of the file format, the\n   * maximum size of uncompressed file that will be accepted is 2147483647\n   * bytes.\n   *\n   * @param  self    a self-referential pointer to the msszdd_compressor\n   *                 instance being called\n   * @param  input   the name of the file to compressed. This is passed\n   *                 passed directly to mspack_system::open()\n   * @param  output  the name of the file to write compressed data to.\n   *                 This is passed directly to mspack_system::open().\n   * @param  length  the length of the uncompressed file, or -1 to indicate\n   *                 that this should be determined automatically by using\n   *                 mspack_system::seek() on the input file.\n   * @return an error code, or MSPACK_ERR_OK if successful\n   * @see set_param()\n   */\n  int (*compress)(struct msszdd_compressor *self,\n                  const char *input,\n                  const char *output,\n                  off_t length);\n\n  /**\n   * Sets an SZDD compression engine parameter.\n   *\n   * The following parameters are defined:\n\n   * - #MSSZDDC_PARAM_CHARACTER: the \"missing character\", the last character\n   *   in the uncompressed file's filename, which is traditionally replaced\n   *   with an underscore to show the file is compressed. Traditionally,\n   *   this can only be a character that is a valid part of an MS-DOS,\n   *   filename, but libmspack permits any character between 0x00 and 0xFF\n   *   to be stored. 0x00 is the default, and it represents \"no character\n   *   stored\".\n   *\n   * @param  self     a self-referential pointer to the msszdd_compressor\n   *                  instance being called\n   * @param  param    the parameter to set\n   * @param  value    the value to set the parameter to\n   * @return MSPACK_ERR_OK if all is OK, or MSPACK_ERR_ARGS if there\n   *         is a problem with either parameter or value.\n   * @see compress()\n   */\n  int (*set_param)(struct msszdd_compressor *self,\n                   int param,\n                   unsigned int value);\n\n  /**\n   * Returns the error code set by the most recently called method.\n   *\n   * @param  self     a self-referential pointer to the msszdd_compressor\n   *                  instance being called\n   * @return the most recent error code\n   * @see compress()\n   */\n  int (*last_error)(struct mschm_decompressor *self);\n};\n\n/**\n * A decompressor for SZDD compressed files.\n *\n * All fields are READ ONLY.\n *\n * @see mspack_create_szdd_decompressor(), mspack_destroy_szdd_decompressor()\n */\nstruct msszdd_decompressor {\n  /**\n   * Opens a SZDD file and reads the header.\n   *\n   * If the file opened is a valid SZDD file, all headers will be read and\n   * a msszddd_header structure will be returned.\n   *\n   * In the case of an error occuring, NULL is returned and the error code\n   * is available from last_error().\n   *\n   * The filename pointer should be considered \"in use\" until close() is\n   * called on the SZDD file.\n   *\n   * @param  self     a self-referential pointer to the msszdd_decompressor\n   *                  instance being called\n   * @param  filename the filename of the SZDD compressed file. This is\n   *                  passed directly to mspack_system::open().\n   * @return a pointer to a msszddd_header structure, or NULL on failure\n   * @see close()\n   */\n  struct msszddd_header *(*open)(struct msszdd_decompressor *self,\n                                 const char *filename);\n\n  /**\n   * Closes a previously opened SZDD file.\n   *\n   * This closes a SZDD file and frees the msszddd_header associated with\n   * it.\n   *\n   * The SZDD header pointer is now invalid and cannot be used again.\n   *\n   * @param  self     a self-referential pointer to the msszdd_decompressor\n   *                  instance being called\n   * @param  szdd     the SZDD file to close\n   * @see open()\n   */\n  void (*close)(struct msszdd_decompressor *self,\n                struct msszddd_header *szdd);\n\n  /**\n   * Extracts the compressed data from a SZDD file.\n   *\n   * This decompresses the compressed SZDD data stream and writes it to\n   * an output file.\n   *\n   * @param  self     a self-referential pointer to the msszdd_decompressor\n   *                  instance being called\n   * @param  szdd     the SZDD file to extract data from\n   * @param  filename the filename to write the decompressed data to. This\n   *                  is passed directly to mspack_system::open().\n   * @return an error code, or MSPACK_ERR_OK if successful\n   */\n  int (*extract)(struct msszdd_decompressor *self,\n                 struct msszddd_header *szdd,\n                 const char *filename);\n\n  /**\n   * Decompresses an SZDD file to an output file in one step.\n   *\n   * This opens an SZDD file as input, reads the header, then decompresses\n   * the compressed data immediately to an output file, finally closing\n   * both the input and output file. It is more convenient to use than\n   * open() then extract() then close(), if you do not need to know the\n   * SZDD output size or missing character.\n   *\n   * @param  self     a self-referential pointer to the msszdd_decompressor\n   *                  instance being called\n   * @param  input    the filename of the input SZDD file. This is passed\n   *                  directly to mspack_system::open().\n   * @param  output   the filename to write the decompressed data to. This\n   *                  is passed directly to mspack_system::open().\n   * @return an error code, or MSPACK_ERR_OK if successful\n   */\n  int (*decompress)(struct msszdd_decompressor *self,\n                    const char *input,\n                    const char *output);\n\n  /**\n   * Returns the error code set by the most recently called method.\n   *\n   * This is useful for open() which does not return an\n   * error code directly.\n   *\n   * @param  self     a self-referential pointer to the msszdd_decompressor\n   *                  instance being called\n   * @return the most recent error code\n   * @see open(), extract(), decompress()\n   */\n  int (*last_error)(struct msszdd_decompressor *self);\n};\n\n/* --- support for KWAJ file format ---------------------------------------- */\n\n/** mskwaj_compressor::set_param() parameter: compression type */\n#define MSKWAJC_PARAM_COMP_TYPE  (0)\n\n/** mskwaj_compressor::set_param() parameter: include the length of the\n * uncompressed file in the header?\n */\n#define MSKWAJC_PARAM_INCLUDE_LENGTH (1)\n\n/** KWAJ compression type: no compression. */\n#define MSKWAJ_COMP_NONE (0)\n/** KWAJ compression type: no compression, 0xFF XOR \"encryption\". */\n#define MSKWAJ_COMP_XOR (1)\n/** KWAJ compression type: LZSS (same method as SZDD) */\n#define MSKWAJ_COMP_SZDD (2)\n/** KWAJ compression type: LZ+Huffman compression */\n#define MSKWAJ_COMP_LZH (3)\n/** KWAJ compression type: MSZIP */\n#define MSKWAJ_COMP_MSZIP (4)\n\n/** KWAJ optional header flag: decompressed file length is included */\n#define MSKWAJ_HDR_HASLENGTH (0x01)\n\n/** KWAJ optional header flag: unknown 2-byte structure is included */\n#define MSKWAJ_HDR_HASUNKNOWN1 (0x02)\n\n/** KWAJ optional header flag: unknown multi-sized structure is included */\n#define MSKWAJ_HDR_HASUNKNOWN2 (0x04)\n\n/** KWAJ optional header flag: file name (no extension) is included */\n#define MSKWAJ_HDR_HASFILENAME (0x08)\n\n/** KWAJ optional header flag: file extension is included */\n#define MSKWAJ_HDR_HASFILEEXT (0x10)\n\n/** KWAJ optional header flag: extra text is included */\n#define MSKWAJ_HDR_HASEXTRATEXT (0x20)\n\n/**\n * A structure which represents an KWAJ compressed file.\n *\n * All fields are READ ONLY.\n */\nstruct mskwajd_header {\n  /** The compression type; should be one of #MSKWAJ_COMP_NONE,\n   * #MSKWAJ_COMP_XOR, #MSKWAJ_COMP_SZDD or #MSKWAJ_COMP_LZH\n   */\n  unsigned short comp_type;\n\n  /** The offset in the file where the compressed data stream begins */\n  off_t data_offset;\n\n  /** Flags indicating which optional headers were included. */\n  int headers;\n\n  /** The amount of uncompressed data in the file, or 0 if not present. */\n  off_t length;\n\n  /** output filename, or NULL if not present */\n  char *filename;\n\n  /** extra uncompressed data (usually text) in the header.\n   * This data can contain nulls so use extra_length to get the size.\n   */\n  char *extra;\n\n  /** length of extra uncompressed data in the header */\n  unsigned short extra_length;\n};\n\n/**\n * A compressor for the KWAJ file format.\n *\n * All fields are READ ONLY.\n *\n * @see mspack_create_kwaj_compressor(), mspack_destroy_kwaj_compressor()\n */\nstruct mskwaj_compressor {\n  /**\n   * Reads an input file and creates a compressed output file in the\n   * KWAJ compressed file format. The KWAJ compression format is quick\n   * but gives poor compression. It is possible for the compressed output\n   * file to be larger than the input file.\n   *\n   * @param  self    a self-referential pointer to the mskwaj_compressor\n   *                 instance being called\n   * @param  input   the name of the file to compressed. This is passed\n   *                 passed directly to mspack_system::open()\n   * @param  output  the name of the file to write compressed data to.\n   *                 This is passed directly to mspack_system::open().\n   * @param  length  the length of the uncompressed file, or -1 to indicate\n   *                 that this should be determined automatically by using\n   *                 mspack_system::seek() on the input file.\n   * @return an error code, or MSPACK_ERR_OK if successful\n   * @see set_param()\n   */\n  int (*compress)(struct mskwaj_compressor *self,\n                  const char *input,\n                  const char *output,\n                  off_t length);\n\n  /**\n   * Sets an KWAJ compression engine parameter.\n   *\n   * The following parameters are defined:\n   *\n   * - #MSKWAJC_PARAM_COMP_TYPE: the compression method to use. Must\n   *   be one of #MSKWAJC_COMP_NONE, #MSKWAJC_COMP_XOR, #MSKWAJ_COMP_SZDD\n   *   or #MSKWAJ_COMP_LZH. The default is #MSKWAJ_COMP_LZH.\n   *\n   * - #MSKWAJC_PARAM_INCLUDE_LENGTH: a boolean; should the compressed\n   *   output file should include the uncompressed length of the input\n   *   file in the header? This adds 4 bytes to the size of the output\n   *   file. A value of zero says \"no\", non-zero says \"yes\". The default\n   *   is \"no\".\n   *\n   * @param  self     a self-referential pointer to the mskwaj_compressor\n   *                  instance being called\n   * @param  param    the parameter to set\n   * @param  value    the value to set the parameter to\n   * @return MSPACK_ERR_OK if all is OK, or MSPACK_ERR_ARGS if there\n   *         is a problem with either parameter or value.\n   * @see generate()\n   */\n  int (*set_param)(struct mskwaj_compressor *self,\n                   int param,\n                   unsigned int value);\n\n\n  /**\n   * Sets the original filename of the file before compression,\n   * which will be stored in the header of the output file.\n   *\n   * The filename should be a null-terminated string, it must be an\n   * MS-DOS \"8.3\" type filename (up to 8 bytes for the filename, then\n   * optionally a \".\" and up to 3 bytes for a filename extension).\n   *\n   * If NULL is passed as the filename, no filename is included in the\n   * header. This is the default.\n   *\n   * @param  self     a self-referential pointer to the mskwaj_compressor\n   *                  instance being called\n   * @param  filename the original filename to use\n   * @return MSPACK_ERR_OK if all is OK, or MSPACK_ERR_ARGS if the\n   *         filename is too long\n   */\n  int (*set_filename)(struct mskwaj_compressor *self,\n                      const char *filename);\n\n  /**\n   * Sets arbitrary data that will be stored in the header of the\n   * output file, uncompressed. It can be up to roughly 64 kilobytes,\n   * as the overall size of the header must not exceed 65535 bytes.\n   * The data can contain null bytes if desired.\n   *\n   * If NULL is passed as the data pointer, or zero is passed as the\n   * length, no extra data is included in the header. This is the\n   * default.\n   *\n   * @param  self     a self-referential pointer to the mskwaj_compressor\n   *                  instance being called\n   * @param  data     a pointer to the data to be stored in the header\n   * @param  bytes    the length of the data in bytes\n   * @return MSPACK_ERR_OK if all is OK, or MSPACK_ERR_ARGS extra data\n   *         is too long\n   */\n  int (*set_extra_data)(struct mskwaj_compressor *self,\n                        void *data,\n                        size_t bytes);\n\n  /**\n   * Returns the error code set by the most recently called method.\n   *\n   * @param  self     a self-referential pointer to the mskwaj_compressor\n   *                  instance being called\n   * @return the most recent error code\n   * @see compress()\n   */\n  int (*last_error)(struct mschm_decompressor *self);\n};\n\n/**\n * A decompressor for KWAJ compressed files.\n *\n * All fields are READ ONLY.\n *\n * @see mspack_create_kwaj_decompressor(), mspack_destroy_kwaj_decompressor()\n */\nstruct mskwaj_decompressor {\n  /**\n   * Opens a KWAJ file and reads the header.\n   *\n   * If the file opened is a valid KWAJ file, all headers will be read and\n   * a mskwajd_header structure will be returned.\n   *\n   * In the case of an error occuring, NULL is returned and the error code\n   * is available from last_error().\n   *\n   * The filename pointer should be considered \"in use\" until close() is\n   * called on the KWAJ file.\n   *\n   * @param  self     a self-referential pointer to the mskwaj_decompressor\n   *                  instance being called\n   * @param  filename the filename of the KWAJ compressed file. This is\n   *                  passed directly to mspack_system::open().\n   * @return a pointer to a mskwajd_header structure, or NULL on failure\n   * @see close()\n   */\n  struct mskwajd_header *(*open)(struct mskwaj_decompressor *self,\n                                 const char *filename);\n\n  /**\n   * Closes a previously opened KWAJ file.\n   *\n   * This closes a KWAJ file and frees the mskwajd_header associated\n   * with it. The KWAJ header pointer is now invalid and cannot be\n   * used again.\n   *\n   * @param  self     a self-referential pointer to the mskwaj_decompressor\n   *                  instance being called\n   * @param  kwaj     the KWAJ file to close\n   * @see open()\n   */\n  void (*close)(struct mskwaj_decompressor *self,\n                struct mskwajd_header *kwaj);\n\n  /**\n   * Extracts the compressed data from a KWAJ file.\n   *\n   * This decompresses the compressed KWAJ data stream and writes it to\n   * an output file.\n   *\n   * @param  self     a self-referential pointer to the mskwaj_decompressor\n   *                  instance being called\n   * @param  kwaj     the KWAJ file to extract data from\n   * @param  filename the filename to write the decompressed data to. This\n   *                  is passed directly to mspack_system::open().\n   * @return an error code, or MSPACK_ERR_OK if successful\n   */\n  int (*extract)(struct mskwaj_decompressor *self,\n                 struct mskwajd_header *kwaj,\n                 const char *filename);\n\n  /**\n   * Decompresses an KWAJ file to an output file in one step.\n   *\n   * This opens an KWAJ file as input, reads the header, then decompresses\n   * the compressed data immediately to an output file, finally closing\n   * both the input and output file. It is more convenient to use than\n   * open() then extract() then close(), if you do not need to know the\n   * KWAJ output size or output filename.\n   *\n   * @param  self     a self-referential pointer to the mskwaj_decompressor\n   *                  instance being called\n   * @param  input    the filename of the input KWAJ file. This is passed\n   *                  directly to mspack_system::open().\n   * @param  output   the filename to write the decompressed data to. This\n   *                  is passed directly to mspack_system::open().\n   * @return an error code, or MSPACK_ERR_OK if successful\n   */\n  int (*decompress)(struct mskwaj_decompressor *self,\n                    const char *input,\n                    const char *output);\n\n  /**\n   * Returns the error code set by the most recently called method.\n   *\n   * This is useful for open() which does not return an\n   * error code directly.\n   *\n   * @param  self     a self-referential pointer to the mskwaj_decompressor\n   *                  instance being called\n   * @return the most recent error code\n   * @see open(), search()\n   */\n  int (*last_error)(struct mskwaj_decompressor *self);\n};\n\n/* --- support for .LZX (Offline Address Book) file format ----------------- */\n\n/**\n * A compressor for the Offline Address Book (OAB) format.\n *\n * All fields are READ ONLY.\n *\n * @see mspack_create_oab_compressor(), mspack_destroy_oab_compressor()\n */\nstruct msoab_compressor {\n  /**\n   * Compress a full OAB file.\n   *\n   * The input file will be read and the compressed contents written to the\n   * output file.\n   *\n   * @param  self     a self-referential pointer to the msoab_decompressor\n   *                  instance being called\n   * @param  input    the filename of the input file. This is passed\n   *                  directly to mspack_system::open().\n   * @param  output   the filename of the output file. This is passed\n   *                  directly to mspack_system::open().\n   * @return an error code, or MSPACK_ERR_OK if successful\n   */\n  int (*compress) (struct msoab_compressor *self,\n                   const char *input,\n                   const char *output);\n\n  /**\n   * Generate a compressed incremental OAB patch file.\n   *\n   * The two uncompressed files \"input\" and \"base\" will be read, and an\n   * incremental patch to generate \"input\" from \"base\" will be written to\n   * the output file.\n   *\n   * @param  self     a self-referential pointer to the msoab_compressor\n   *                  instance being called\n   * @param  input    the filename of the input file containing the new\n   *                  version of its contents. This is passed directly\n   *                  to mspack_system::open().\n   * @param  base     the filename of the original base file containing\n   *                  the old version of its contents, against which the\n   *                  incremental patch shall generated. This is passed\n   *                  directly to mspack_system::open().\n   * @param  output   the filename of the output file. This is passed\n   *                  directly to mspack_system::open().\n   * @return an error code, or MSPACK_ERR_OK if successful\n   */\n  int (*compress_incremental) (struct msoab_compressor *self,\n                               const char *input,\n                               const char *base,\n                               const char *output);\n};\n\n/**\n * A decompressor for .LZX (Offline Address Book) files\n *\n * All fields are READ ONLY.\n *\n * @see mspack_create_oab_decompressor(), mspack_destroy_oab_decompressor()\n */\nstruct msoab_decompressor {\n  /**\n   * Decompresses a full Offline Address Book file.\n   *\n   * If the input file is a valid compressed Offline Address Book file, \n   * it will be read and the decompressed contents will be written to\n   * the output file.\n   *\n   * @param  self     a self-referential pointer to the msoab_decompressor\n   *                  instance being called\n   * @param  input    the filename of the input file. This is passed\n   *                  directly to mspack_system::open().\n   * @param  output   the filename of the output file. This is passed\n   *                  directly to mspack_system::open().\n   * @return an error code, or MSPACK_ERR_OK if successful\n   */\n  int (*decompress) (struct msoab_decompressor *self,\n                     const char *input,\n                     const char *output);\n\n  /**\n   * Decompresses an Offline Address Book with an incremental patch file.\n   *\n   * This requires both a full UNCOMPRESSED Offline Address Book file to\n   * act as the \"base\", and a compressed incremental patch file as input.\n   * If the input file is valid, it will be decompressed with reference to\n   * the base file, and the decompressed contents will be written to the\n   * output file.\n   *\n   * There is no way to tell what the right base file is for the given\n   * incremental patch, but if you get it wrong, this will usually result\n   * in incorrect data being decompressed, which will then fail a checksum\n   * test.\n   *\n   * @param  self     a self-referential pointer to the msoab_decompressor\n   *                  instance being called\n   * @param  input    the filename of the input file. This is passed\n   *                  directly to mspack_system::open().\n   * @param  base     the filename of the base file to which the\n   *                  incremental patch shall be applied. This is passed\n   *                  directly to mspack_system::open().\n   * @param  output   the filename of the output file. This is passed\n   *                  directly to mspack_system::open().\n   * @return an error code, or MSPACK_ERR_OK if successful\n   */\n  int (*decompress_incremental) (struct msoab_decompressor *self,\n                                 const char *input,\n                                 const char *base,\n                                 const char *output);\n};\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "third_party/mspack/readbits.h",
    "content": "/* This file is part of libmspack.\n * (C) 2003-2010 Stuart Caie.\n *\n * libmspack is free software; you can redistribute it and/or modify it under\n * the terms of the GNU Lesser General Public License (LGPL) version 2.1\n *\n * For further details, see the file COPYING.LIB distributed with libmspack\n */\n\n#ifndef MSPACK_READBITS_H\n#define MSPACK_READBITS_H 1\n\n/* this header defines macros that read data streams by\n * the individual bits\n *\n * INIT_BITS         initialises bitstream state in state structure\n * STORE_BITS        stores bitstream state in state structure\n * RESTORE_BITS      restores bitstream state from state structure\n * ENSURE_BITS(n)    ensure there are at least N bits in the bit buffer\n * READ_BITS(var,n)  takes N bits from the buffer and puts them in var\n * PEEK_BITS(n)      extracts without removing N bits from the bit buffer\n * REMOVE_BITS(n)    removes N bits from the bit buffer\n *\n * READ_BITS simply calls ENSURE_BITS, PEEK_BITS and REMOVE_BITS,\n * which means it's limited to reading the number of bits you can\n * ensure at any one time. It also fails if asked to read zero bits.\n * If you need to read zero bits, or more bits than can be ensured in\n * one go, use READ_MANY_BITS instead.\n *\n * These macros have variable names baked into them, so to use them\n * you have to define some macros:\n * - BITS_TYPE: the type name of your state structure\n * - BITS_VAR: the variable that points to your state structure\n * - define BITS_ORDER_MSB if bits are read from the MSB, or\n *   define BITS_ORDER_LSB if bits are read from the LSB\n * - READ_BYTES: some code that reads more data into the bit buffer,\n *   it should use READ_IF_NEEDED (calls read_input if the byte buffer\n *   is empty), then INJECT_BITS(data,n) to put data from the byte\n *   buffer into the bit buffer.\n *\n * You also need to define some variables and structure members:\n * - unsigned char *i_ptr;    // current position in the byte buffer\n * - unsigned char *i_end;    // end of the byte buffer\n * - unsigned int bit_buffer; // the bit buffer itself\n * - unsigned int bits_left;  // number of bits remaining\n *\n * If you use read_input() and READ_IF_NEEDED, they also expect these\n * structure members:\n * - struct mspack_system *sys;  // to access sys->read()\n * - unsigned int error;         // to record/return read errors\n * - unsigned char input_end;    // to mark reaching the EOF\n * - unsigned char *inbuf;       // the input byte buffer\n * - unsigned int inbuf_size;    // the size of the input byte buffer\n *\n * Your READ_BYTES implementation should read data from *i_ptr and\n * put them in the bit buffer. READ_IF_NEEDED will call read_input()\n * if i_ptr reaches i_end, and will fill up inbuf and set i_ptr to\n * the start of inbuf and i_end to the end of inbuf.\n *\n * If you're reading in MSB order, the routines work by using the area\n * beyond the MSB and the LSB of the bit buffer as a free source of\n * zeroes when shifting. This avoids having to mask any bits. So we\n * have to know the bit width of the bit buffer variable. We use\n * <limits.h> and CHAR_BIT to find the size of the bit buffer in bits.\n *\n * If you are reading in LSB order, bits need to be masked. Normally\n * this is done by computing the mask: N bits are masked by the value\n * (1<<N)-1). However, you can define BITS_LSB_TABLE to use a lookup\n * table instead of computing this. This adds two new macros,\n * PEEK_BITS_T and READ_BITS_T which work the same way as PEEK_BITS\n * and READ_BITS, except they use this lookup table. This is useful if\n * you need to look up a number of bits that are only known at\n * runtime, so the bit mask can't be turned into a constant by the\n * compiler.\n\n * The bit buffer datatype should be at least 32 bits wide: it must be\n * possible to ENSURE_BITS(17), so it must be possible to add 16 new bits\n * to the bit buffer when the bit buffer already has 1 to 15 bits left.\n */\n\n#ifndef BITS_VAR\n# error \"define BITS_VAR as the state structure poiner variable name\"\n#endif\n#ifndef BITS_TYPE\n# error \"define BITS_TYPE as the state structure type\"\n#endif\n#if defined(BITS_ORDER_MSB) && defined(BITS_ORDER_LSB)\n# error \"you must define either BITS_ORDER_MSB or BITS_ORDER_LSB\"\n#else\n# if !(defined(BITS_ORDER_MSB) || defined(BITS_ORDER_LSB))\n#  error \"you must define BITS_ORDER_MSB or BITS_ORDER_LSB\"\n# endif\n#endif\n\n#if HAVE_LIMITS_H\n# include <limits.h>\n#endif\n#ifndef CHAR_BIT\n# define CHAR_BIT (8)\n#endif\n#define BITBUF_WIDTH (sizeof(bit_buffer) * CHAR_BIT)\n\n#define INIT_BITS do {                          \\\n    BITS_VAR->i_ptr      = &BITS_VAR->inbuf[0]; \\\n    BITS_VAR->i_end      = &BITS_VAR->inbuf[0]; \\\n    BITS_VAR->bit_buffer = 0;                   \\\n    BITS_VAR->bits_left  = 0;                   \\\n    BITS_VAR->input_end  = 0;                   \\\n} while (0)\n\n#define STORE_BITS do {                 \\\n    BITS_VAR->i_ptr      = i_ptr;       \\\n    BITS_VAR->i_end      = i_end;       \\\n    BITS_VAR->bit_buffer = bit_buffer;  \\\n    BITS_VAR->bits_left  = bits_left;   \\\n} while (0)\n\n#define RESTORE_BITS do {               \\\n    i_ptr      = BITS_VAR->i_ptr;       \\\n    i_end      = BITS_VAR->i_end;       \\\n    bit_buffer = BITS_VAR->bit_buffer;  \\\n    bits_left  = BITS_VAR->bits_left;   \\\n} while (0)\n\n#define ENSURE_BITS(nbits) do {                 \\\n    while (bits_left < (nbits)) READ_BYTES;     \\\n} while (0)\n\n#define READ_BITS(val, nbits) do {              \\\n    ENSURE_BITS(nbits);                         \\\n    (val) = PEEK_BITS(nbits);                   \\\n    REMOVE_BITS(nbits);                         \\\n} while (0)\n\n#define READ_MANY_BITS(val, bits) do {                          \\\n    unsigned char needed = (bits), bitrun;                      \\\n    (val) = 0;                                                  \\\n    while (needed > 0) {                                        \\\n        if (bits_left <= (BITBUF_WIDTH - 16)) READ_BYTES;       \\\n        bitrun = (bits_left < needed) ? bits_left : needed;     \\\n        (val) = ((val) << bitrun) | PEEK_BITS(bitrun);          \\\n        REMOVE_BITS(bitrun);                                    \\\n        needed -= bitrun;                                       \\\n    }                                                           \\\n} while (0)\n\n#ifdef BITS_ORDER_MSB\n# define PEEK_BITS(nbits)   (bit_buffer >> (BITBUF_WIDTH - (nbits)))\n# define REMOVE_BITS(nbits) ((bit_buffer <<= (nbits)), (bits_left -= (nbits)))\n# define INJECT_BITS(bitdata,nbits) ((bit_buffer |= \\\n    (bitdata) << (BITBUF_WIDTH - (nbits) - bits_left)), (bits_left += (nbits)))\n#else /* BITS_ORDER_LSB */\n# define PEEK_BITS(nbits)   (bit_buffer & ((1 << (nbits))-1))\n# define REMOVE_BITS(nbits) ((bit_buffer >>= (nbits)), (bits_left -= (nbits)))\n# define INJECT_BITS(bitdata,nbits) ((bit_buffer |= \\\n    (bitdata) << bits_left), (bits_left += (nbits)))\n#endif\n\n#ifdef BITS_LSB_TABLE\n/* lsb_bit_mask[n] = (1 << n) - 1 */\nstatic const unsigned short lsb_bit_mask[17] = {\n    0x0000, 0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff,\n    0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff\n};\n# define PEEK_BITS_T(nbits) (bit_buffer & lsb_bit_mask[(nbits)])\n# define READ_BITS_T(val, nbits) do {   \\\n    ENSURE_BITS(nbits);                 \\\n    (val) = PEEK_BITS_T(nbits);         \\\n    REMOVE_BITS(nbits);                 \\\n} while (0)\n#endif\n\n#ifndef BITS_NO_READ_INPUT\n# define READ_IF_NEEDED do {            \\\n    if (i_ptr >= i_end) {               \\\n        if (read_input(BITS_VAR))       \\\n            return BITS_VAR->error;     \\\n        i_ptr = BITS_VAR->i_ptr;        \\\n        i_end = BITS_VAR->i_end;        \\\n    }                                   \\\n} while (0)\n\nstatic int read_input(BITS_TYPE *p) {\n    int read = p->sys->read(p->input, &p->inbuf[0], (int)p->inbuf_size);\n    if (read < 0) return p->error = MSPACK_ERR_READ;\n\n    /* we might overrun the input stream by asking for bits we don't use,\n     * so fake 2 more bytes at the end of input */\n    if (read == 0) {\n        if (p->input_end) {\n            D((\"out of input bytes\"))\n            return p->error = MSPACK_ERR_READ;\n        }\n        else {\n            read = 2;\n            p->inbuf[0] = p->inbuf[1] = 0;\n            p->input_end = 1;\n        }\n    }\n\n    /* update i_ptr and i_end */\n    p->i_ptr = &p->inbuf[0];\n    p->i_end = &p->inbuf[read];\n    return MSPACK_ERR_OK;\n}\n#endif\n#endif\n"
  },
  {
    "path": "third_party/mspack/readhuff.h",
    "content": "/* This file is part of libmspack.\n * (C) 2003-2014 Stuart Caie.\n *\n * libmspack is free software; you can redistribute it and/or modify it under\n * the terms of the GNU Lesser General Public License (LGPL) version 2.1\n *\n * For further details, see the file COPYING.LIB distributed with libmspack\n */\n\n#ifndef MSPACK_READHUFF_H\n#define MSPACK_READHUFF_H 1\n\n/* This implements a fast Huffman tree decoding system. */\n\n#if !(defined(BITS_ORDER_MSB) || defined(BITS_ORDER_LSB))\n# error \"readhuff.h is used in conjunction with readbits.h, include that first\"\n#endif\n#if !(defined(TABLEBITS) && defined(MAXSYMBOLS))\n# error \"define TABLEBITS(tbl) and MAXSYMBOLS(tbl) before using readhuff.h\"\n#endif\n#if !(defined(HUFF_TABLE) && defined(HUFF_LEN))\n# error \"define HUFF_TABLE(tbl) and HUFF_LEN(tbl) before using readhuff.h\"\n#endif\n#ifndef HUFF_ERROR\n# error \"define HUFF_ERROR before using readhuff.h\"\n#endif\n#ifndef HUFF_MAXBITS\n# define HUFF_MAXBITS 16\n#endif\n\n/* Decodes the next huffman symbol from the input bitstream into var.\n * Do not use this macro on a table unless build_decode_table() succeeded.\n */\n#define READ_HUFFSYM(tbl, var) do {                     \\\n    ENSURE_BITS(HUFF_MAXBITS);                          \\\n    sym = HUFF_TABLE(tbl, PEEK_BITS(TABLEBITS(tbl)));   \\\n    if (sym >= MAXSYMBOLS(tbl)) HUFF_TRAVERSE(tbl);     \\\n    (var) = sym;                                        \\\n    i = HUFF_LEN(tbl, sym);                             \\\n    REMOVE_BITS(i);                                     \\\n} while (0)\n\n#ifdef BITS_ORDER_LSB\n# define HUFF_TRAVERSE(tbl) do {                        \\\n    i = TABLEBITS(tbl) - 1;                             \\\n    do {                                                \\\n        if (i++ > HUFF_MAXBITS) HUFF_ERROR;             \\\n        sym = HUFF_TABLE(tbl,                           \\\n            (sym << 1) | ((bit_buffer >> i) & 1));      \\\n    } while (sym >= MAXSYMBOLS(tbl));                   \\\n} while (0)\n#else\n#define HUFF_TRAVERSE(tbl) do {                         \\\n    i = 1 << (BITBUF_WIDTH - TABLEBITS(tbl));           \\\n    do {                                                \\\n        if ((i >>= 1) == 0) HUFF_ERROR;                 \\\n        sym = HUFF_TABLE(tbl,                           \\\n            (sym << 1) | ((bit_buffer & i) ? 1 : 0));   \\\n    } while (sym >= MAXSYMBOLS(tbl));                   \\\n} while (0)\n#endif\n\n/* make_decode_table(nsyms, nbits, length[], table[])\n *\n * This function was originally coded by David Tritscher.\n * It builds a fast huffman decoding table from\n * a canonical huffman code lengths table.\n *\n * nsyms  = total number of symbols in this huffman tree.\n * nbits  = any symbols with a code length of nbits or less can be decoded\n *          in one lookup of the table.\n * length = A table to get code lengths from [0 to nsyms-1]\n * table  = The table to fill up with decoded symbols and pointers.\n *          Should be ((1<<nbits) + (nsyms*2)) in length.\n *\n * Returns 0 for OK or 1 for error\n */\nstatic int make_decode_table(unsigned int nsyms, unsigned int nbits,\n                             unsigned char *length, unsigned short *table)\n{\n    register unsigned short sym, next_symbol;\n    register unsigned int leaf, fill;\n#ifdef BITS_ORDER_LSB\n    register unsigned int reverse;\n#endif\n    register unsigned char bit_num;\n    unsigned int pos         = 0; /* the current position in the decode table */\n    unsigned int table_mask  = 1 << nbits;\n    unsigned int bit_mask    = table_mask >> 1; /* don't do 0 length codes */\n\n    /* fill entries for codes short enough for a direct mapping */\n    for (bit_num = 1; bit_num <= nbits; bit_num++) {\n        for (sym = 0; sym < nsyms; sym++) {\n            if (length[sym] != bit_num) continue;\n#ifdef BITS_ORDER_MSB\n            leaf = pos;\n#else\n            /* reverse the significant bits */\n            fill = length[sym]; reverse = pos >> (nbits - fill); leaf = 0;\n            do {leaf <<= 1; leaf |= reverse & 1; reverse >>= 1;} while (--fill);\n#endif\n\n            if((pos += bit_mask) > table_mask) return 1; /* table overrun */\n\n            /* fill all possible lookups of this symbol with the symbol itself */\n#ifdef BITS_ORDER_MSB\n            for (fill = bit_mask; fill-- > 0;) table[leaf++] = sym;\n#else\n            fill = bit_mask; next_symbol = 1 << bit_num;\n            do { table[leaf] = sym; leaf += next_symbol; } while (--fill);\n#endif\n        }\n        bit_mask >>= 1;\n    }\n\n    /* exit with success if table is now complete */\n    if (pos == table_mask) return 0;\n\n    /* mark all remaining table entries as unused */\n    for (sym = pos; sym < table_mask; sym++) {\n#ifdef BITS_ORDER_MSB\n        table[sym] = 0xFFFF;\n#else\n        reverse = sym; leaf = 0; fill = nbits;\n        do { leaf <<= 1; leaf |= reverse & 1; reverse >>= 1; } while (--fill);\n        table[leaf] = 0xFFFF;\n#endif\n    }\n\n    /* next_symbol = base of allocation for long codes */\n    next_symbol = ((table_mask >> 1) < nsyms) ? nsyms : (table_mask >> 1);\n\n    /* give ourselves room for codes to grow by up to 16 more bits.\n     * codes now start at bit nbits+16 and end at (nbits+16-codelength) */\n    pos <<= 16;\n    table_mask <<= 16;\n    bit_mask = 1 << 15;\n\n    for (bit_num = nbits+1; bit_num <= HUFF_MAXBITS; bit_num++) {\n        for (sym = 0; sym < nsyms; sym++) {\n            if (length[sym] != bit_num) continue;\n            if (pos >= table_mask) return 1; /* table overflow */\n\n#ifdef BITS_ORDER_MSB\n            leaf = pos >> 16;\n#else\n            /* leaf = the first nbits of the code, reversed */\n            reverse = pos >> 16; leaf = 0; fill = nbits;\n            do {leaf <<= 1; leaf |= reverse & 1; reverse >>= 1;} while (--fill);\n#endif\n            for (fill = 0; fill < (bit_num - nbits); fill++) {\n                /* if this path hasn't been taken yet, 'allocate' two entries */\n                if (table[leaf] == 0xFFFF) {\n                    table[(next_symbol << 1)     ] = 0xFFFF;\n                    table[(next_symbol << 1) + 1 ] = 0xFFFF;\n                    table[leaf] = next_symbol++;\n                }\n\n                /* follow the path and select either left or right for next bit */\n                leaf = table[leaf] << 1;\n                if ((pos >> (15-fill)) & 1) leaf++;\n            }\n            table[leaf] = sym;\n            pos += bit_mask;\n        }\n        bit_mask >>= 1;\n    }\n\n    /* full table? */\n    return (pos == table_mask) ? 0 : 1;\n}\n#endif\n"
  },
  {
    "path": "third_party/mspack/system.c",
    "content": "/* This file is part of libmspack.\n * (C) 2003-2004 Stuart Caie.\n *\n * libmspack is free software; you can redistribute it and/or modify it under\n * the terms of the GNU Lesser General Public License (LGPL) version 2.1\n *\n * For further details, see the file COPYING.LIB distributed with libmspack\n */\n\n#ifdef HAVE_CONFIG_H\n# include <config.h>\n#endif\n\n#include <system.h>\n\n#if !LARGEFILE_SUPPORT\nconst char *largefile_msg = \"library not compiled to support large files.\";\n#endif\n\n\nint mspack_version(int entity) {\n  switch (entity) {\n   /* CHM decoder version 1 -> 2 changes:\n    * - added mschmd_sec_mscompressed::spaninfo\n    * - added mschmd_header::first_pmgl\n    * - added mschmd_header::last_pmgl\n    * - added mschmd_header::chunk_cache;\n    */\n  case MSPACK_VER_MSCHMD:\n  /* CAB decoder version 1 -> 2 changes:\n   * - added MSCABD_PARAM_SALVAGE\n   */\n  case MSPACK_VER_MSCABD:\n    return 2;\n  case MSPACK_VER_LIBRARY:\n  case MSPACK_VER_SYSTEM:\n  case MSPACK_VER_MSSZDDD:\n  case MSPACK_VER_MSKWAJD:\n  case MSPACK_VER_MSOABD:\n    return 1;\n  case MSPACK_VER_MSCABC:\n  case MSPACK_VER_MSCHMC:\n  case MSPACK_VER_MSLITD:\n  case MSPACK_VER_MSLITC:\n  case MSPACK_VER_MSHLPD:\n  case MSPACK_VER_MSHLPC:\n  case MSPACK_VER_MSSZDDC:\n  case MSPACK_VER_MSKWAJC:\n  case MSPACK_VER_MSOABC:\n    return 0;\n  }\n  return -1;\n}\n\nint mspack_sys_selftest_internal(int offt_size) {\n  return (sizeof(off_t) == offt_size) ? MSPACK_ERR_OK : MSPACK_ERR_SEEK;\n}\n\n/* validates a system structure */\nint mspack_valid_system(struct mspack_system *sys) {\n  return (sys != NULL) && (sys->open != NULL) && (sys->close != NULL) &&\n    (sys->read != NULL) && (sys->write != NULL) && (sys->seek != NULL) &&\n    (sys->tell != NULL) && (sys->message != NULL) && (sys->alloc != NULL) &&\n    (sys->free != NULL) && (sys->copy != NULL) && (sys->null_ptr == NULL);\n}\n\n/* returns the length of a file opened for reading */\nint mspack_sys_filelen(struct mspack_system *system,\n                       struct mspack_file *file, off_t *length)\n{\n  off_t current;\n\n  if (!system || !file || !length) return MSPACK_ERR_OPEN;\n\n  /* get current offset */\n  current = system->tell(file);\n\n  /* seek to end of file */\n  if (system->seek(file, (off_t) 0, MSPACK_SYS_SEEK_END)) {\n    return MSPACK_ERR_SEEK;\n  }\n\n  /* get offset of end of file */\n  *length = system->tell(file);\n\n  /* seek back to original offset */\n  if (system->seek(file, current, MSPACK_SYS_SEEK_START)) {\n    return MSPACK_ERR_SEEK;\n  }\n\n  return MSPACK_ERR_OK;\n}\n\n\n\n/* definition of mspack_default_system -- if the library is compiled with\n * MSPACK_NO_DEFAULT_SYSTEM, no default system will be provided. Otherwise,\n * an appropriate default system (e.g. the standard C library, or some native\n * API calls)\n */\n\n#ifdef MSPACK_NO_DEFAULT_SYSTEM\nstruct mspack_system *mspack_default_system = NULL;\n#else\n\n/* implementation of mspack_default_system for standard C library */\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <stdarg.h>\n\nstruct mspack_file_p {\n  FILE *fh;\n  const char *name;\n};\n\nstatic struct mspack_file *msp_open(struct mspack_system *self,\n                                    const char *filename, int mode)\n{\n  struct mspack_file_p *fh;\n  const char *fmode;\n\n  switch (mode) {\n  case MSPACK_SYS_OPEN_READ:   fmode = \"rb\";  break;\n  case MSPACK_SYS_OPEN_WRITE:  fmode = \"wb\";  break;\n  case MSPACK_SYS_OPEN_UPDATE: fmode = \"r+b\"; break;\n  case MSPACK_SYS_OPEN_APPEND: fmode = \"ab\";  break;\n  default: return NULL;\n  }\n\n  if ((fh = (struct mspack_file_p *) malloc(sizeof(struct mspack_file_p)))) {\n    fh->name = filename;\n    if ((fh->fh = fopen(filename, fmode))) return (struct mspack_file *) fh;\n    free(fh);\n  }\n  return NULL;\n}\n\nstatic void msp_close(struct mspack_file *file) {\n  struct mspack_file_p *self = (struct mspack_file_p *) file;\n  if (self) {\n    fclose(self->fh);\n    free(self);\n  }\n}\n\nstatic int msp_read(struct mspack_file *file, void *buffer, int bytes) {\n  struct mspack_file_p *self = (struct mspack_file_p *) file;\n  if (self && buffer && bytes >= 0) {\n    size_t count = fread(buffer, 1, (size_t) bytes, self->fh);\n    if (!ferror(self->fh)) return (int) count;\n  }\n  return -1;\n}\n\nstatic int msp_write(struct mspack_file *file, void *buffer, int bytes) {\n  struct mspack_file_p *self = (struct mspack_file_p *) file;\n  if (self && buffer && bytes >= 0) {\n    size_t count = fwrite(buffer, 1, (size_t) bytes, self->fh);\n    if (!ferror(self->fh)) return (int) count;\n  }\n  return -1;\n}\n\nstatic int msp_seek(struct mspack_file *file, off_t offset, int mode) {\n  struct mspack_file_p *self = (struct mspack_file_p *) file;\n  if (self) {\n    switch (mode) {\n    case MSPACK_SYS_SEEK_START: mode = SEEK_SET; break;\n    case MSPACK_SYS_SEEK_CUR:   mode = SEEK_CUR; break;\n    case MSPACK_SYS_SEEK_END:   mode = SEEK_END; break;\n    default: return -1;\n    }\n#if HAVE_FSEEKO\n    return fseeko(self->fh, offset, mode);\n#else\n    return fseek(self->fh, offset, mode);\n#endif\n  }\n  return -1;\n}\n\nstatic off_t msp_tell(struct mspack_file *file) {\n  struct mspack_file_p *self = (struct mspack_file_p *) file;\n#if HAVE_FSEEKO\n  return (self) ? (off_t) ftello(self->fh) : 0;\n#else\n  return (self) ? (off_t) ftell(self->fh) : 0;\n#endif\n}\n\nstatic void msp_msg(struct mspack_file *file, const char *format, ...) {\n  va_list ap;\n  if (file) fprintf(stderr, \"%s: \", ((struct mspack_file_p *) file)->name);\n  va_start(ap, format);\n  vfprintf(stderr, format, ap);\n  va_end(ap);\n  fputc((int) '\\n', stderr);\n  fflush(stderr);\n}\n\nstatic void *msp_alloc(struct mspack_system *self, size_t bytes) {\n#if DEBUG\n  /* make uninitialised data obvious */\n  char *buf = malloc(bytes + 8);\n  if (buf) memset(buf, 0xDC, bytes);\n  *((size_t *)buf) = bytes;\n  return &buf[8];\n#else\n  return malloc(bytes);\n#endif\n}\n\nstatic void msp_free(void *buffer) {\n#if DEBUG\n  char *buf = buffer;\n  size_t bytes;\n  if (buf) {\n    buf -= 8;\n    bytes = *((size_t *)buf);\n    /* make freed data obvious */\n    memset(buf, 0xED, bytes);\n    free(buf);\n  }\n#else\n  free(buffer);\n#endif\n}\n\nstatic void msp_copy(void *src, void *dest, size_t bytes) {\n  memcpy(dest, src, bytes);\n}\n\nstatic struct mspack_system msp_system = {\n  &msp_open, &msp_close, &msp_read,  &msp_write, &msp_seek,\n  &msp_tell, &msp_msg, &msp_alloc, &msp_free, &msp_copy, NULL\n};\n\nstruct mspack_system *mspack_default_system = &msp_system;\n\n#endif\n"
  },
  {
    "path": "third_party/mspack/system.h",
    "content": "/* This file is part of libmspack.\n * (C) 2003-2018 Stuart Caie.\n *\n * libmspack is free software; you can redistribute it and/or modify it under\n * the terms of the GNU Lesser General Public License (LGPL) version 2.1\n *\n * For further details, see the file COPYING.LIB distributed with libmspack\n */\n\n#ifndef MSPACK_SYSTEM_H\n#define MSPACK_SYSTEM_H 1\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* ensure config.h is read before mspack.h */\n#ifdef HAVE_CONFIG_H\n# include <config.h>\n#endif\n\n#include <mspack.h>\n\n/* assume <string.h> exists */\n#include <string.h>\n\n/* fix for problem with GCC 4 and glibc (thanks to Ville Skytta)\n * http://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=150429\n */\n#ifdef read\n# undef read\n#endif\n\n/* Old GCCs don't have __func__, but __FUNCTION__:\n * http://gcc.gnu.org/onlinedocs/gcc/Function-Names.html\n */\n#if __STDC_VERSION__ < 199901L\n# if __GNUC__ >= 2\n#  define __func__ __FUNCTION__\n# else\n#  define __func__ \"<unknown>\"\n# endif\n#endif\n\n#if DEBUG\n# include <stdio.h>\n# define D(x) do { printf(\"%s:%d (%s) \",__FILE__, __LINE__, __func__); \\\n                   printf x ; fputc('\\n', stdout); fflush(stdout);} while (0);\n#else\n# define D(x)\n#endif\n\n/* CAB supports searching through files over 4GB in size, and the CHM file\n * format actively uses 64-bit offsets. These can only be fully supported\n * if the system the code runs on supports large files. If not, the library\n * will work as normal using only 32-bit arithmetic, but if an offset\n * greater than 2GB is detected, an error message indicating the library\n * can't support the file should be printed.\n */\n#if HAVE_INTTYPES_H\n# include <inttypes.h>\n#else\n# define PRId64 \"lld\"\n# define PRIu64 \"llu\"\n# define PRId32 \"ld\"\n# define PRIu32 \"lu\"\n#endif\n\n#include <limits.h>\n#if ((defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS >= 64) || \\\n     (defined(FILESIZEBITS)      && FILESIZEBITS      >= 64) || \\\n     defined(_LARGEFILE_SOURCE) || defined(_LARGEFILE64_SOURCE) || \\\n     SIZEOF_OFF_T >= 8)\n# define LARGEFILE_SUPPORT 1\n# define LD PRId64\n# define LU PRIu64\n#else\nextern const char *largefile_msg;\n# define LD PRId32\n# define LU PRIu32\n#endif\n\n/* endian-neutral reading of little-endian data */\n#define __egi32(a,n) ( ((((unsigned char *) a)[n+3]) << 24) | \\\n                       ((((unsigned char *) a)[n+2]) << 16) | \\\n                       ((((unsigned char *) a)[n+1]) <<  8) | \\\n                       ((((unsigned char *) a)[n+0])))\n#define EndGetI64(a) ((((unsigned long long int) __egi32(a,4)) << 32) | \\\n                      ((unsigned int) __egi32(a,0)))\n#define EndGetI32(a) __egi32(a,0)\n#define EndGetI16(a) ((((a)[1])<<8)|((a)[0]))\n\n/* endian-neutral reading of big-endian data */\n#define EndGetM32(a) (((((unsigned char *) a)[0]) << 24) | \\\n                      ((((unsigned char *) a)[1]) << 16) | \\\n                      ((((unsigned char *) a)[2]) <<  8) | \\\n                      ((((unsigned char *) a)[3])))\n#define EndGetM16(a) ((((a)[0])<<8)|((a)[1]))\n\nextern struct mspack_system *mspack_default_system;\n\n/* returns the length of a file opened for reading */\nextern int mspack_sys_filelen(struct mspack_system *system,\n                              struct mspack_file *file, off_t *length);\n\n/* validates a system structure */\nextern int mspack_valid_system(struct mspack_system *sys);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "third_party/mspack.lua",
    "content": "group(\"third_party\")\nproject(\"mspack\")\n  uuid(\"0881692A-75A1-4E7B-87D8-BB9108CEDEA4\")\n  kind(\"StaticLib\")\n  language(\"C++\")\n  links({\n    \"xenia-base\",\n  })\n  defines({\n    \"_LIB\",\n    \"HAVE_CONFIG_H\",\n  })\n  removedefines({\n    \"_UNICODE\",\n    \"UNICODE\",\n  })\n  includedirs({\n      \"mspack\",\n  })\n  files({\n      \"mspack/logging.cc\",\n      \"mspack/lzx.h\",\n      \"mspack/lzxd.c\",\n      \"mspack/mspack.h\",\n      \"mspack/readbits.h\",\n      \"mspack/readhuff.h\",\n      \"mspack/system.c\",\n      \"mspack/system.h\",\n  })\n\n  filter(\"platforms:Windows\")\n    defines({\n    })\n  filter(\"platforms:Linux\")\n    defines({\n    })\n"
  },
  {
    "path": "third_party/pe/pe_image.h",
    "content": "/* Xenia: minor tweaks to bring up to date with winnt.h */\n\n/* Copyright (c) Microsoft Corporation. All rights reserved. */\n/* NT image format (to be used when the Win32 SDK version of WINNT.H cannot) */\n\n#ifndef UNALIGNED\n/* BUGBUG fixme */\n#define UNALIGNED\n#endif\n\n#ifdef _MSC_VER\n#pragma pack (1)\n#endif\n\n// MODIFIED: on Windows a few definitions aren't in WINNT\n#ifdef IMAGE_NT_SIGNATURE\n#define IMAGE_SIZEOF_NT_OPTIONAL_HEADER      224\n#define IMAGE_FILE_MACHINE_POWERPCBE         0x01F2  // IBM PowerPC Big-Endian\n#endif\n\n/*  Skip if WINNT.H already included.  We check IMAGE_NT_SIGNATURE instead of _WINNT_,\n *  because WinCE's version of WINNT.H defines _WINNT_ but it doesn't include everything here\n */\n#ifndef IMAGE_NT_SIGNATURE\n\n#define IMAGE_DOS_SIGNATURE                 0x5A4D      /* MZ */\n#define IMAGE_OS2_SIGNATURE                 0x454E      /* NE */\n#define IMAGE_OS2_SIGNATURE_LE              0x454C      /* LE */\n#define IMAGE_NT_SIGNATURE                  0x00004550  /* PE00 */\n\ntypedef struct _IMAGE_DOS_HEADER {      /* DOS .EXE header */\n    uint16_t   e_magic;                     /* Magic number */\n    uint16_t   e_cblp;                      /* Bytes on last page of file */\n    uint16_t   e_cp;                        /* Pages in file */\n    uint16_t   e_crlc;                      /* Relocations */\n    uint16_t   e_cparhdr;                   /* Size of header in paragraphs */\n    uint16_t   e_minalloc;                  /* Minimum extra paragraphs needed */\n    uint16_t   e_maxalloc;                  /* Maximum extra paragraphs needed */\n    uint16_t   e_ss;                        /* Initial (relative) SS value */\n    uint16_t   e_sp;                        /* Initial SP value */\n    uint16_t   e_csum;                      /* Checksum */\n    uint16_t   e_ip;                        /* Initial IP value */\n    uint16_t   e_cs;                        /* Initial (relative) CS value */\n    uint16_t   e_lfarlc;                    /* File address of relocation table */\n    uint16_t   e_ovno;                      /* Overlay number */\n    uint16_t   e_res[4];                    /* Reserved words */\n    uint16_t   e_oemid;                     /* OEM identifier (for e_oeminfo) */\n    uint16_t   e_oeminfo;                   /* OEM information; e_oemid specific */\n    uint16_t   e_res2[10];                  /* Reserved words */\n    int32_t   e_lfanew;                    /* File address of new exe header */\n  } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;\n\ntypedef struct _IMAGE_OS2_HEADER {      /* OS/2 .EXE header */\n    uint16_t   ne_magic;                    /* Magic number */\n    int8_t    ne_ver;                      /* Version number */\n    int8_t    ne_rev;                      /* Revision number */\n    uint16_t   ne_enttab;                   /* Offset of Entry Table */\n    uint16_t   ne_cbenttab;                 /* Number of bytes in Entry Table */\n    int32_t   ne_crc;                      /* Checksum of whole file */\n    uint16_t   ne_flags;                    /* Flag word */\n    uint16_t   ne_autodata;                 /* Automatic data segment number */\n    uint16_t   ne_heap;                     /* Initial heap allocation */\n    uint16_t   ne_stack;                    /* Initial stack allocation */\n    int32_t   ne_csip;                     /* Initial CS:IP setting */\n    int32_t   ne_sssp;                     /* Initial SS:SP setting */\n    uint16_t   ne_cseg;                     /* Count of file segments */\n    uint16_t   ne_cmod;                     /* Entries in Module Reference Table */\n    uint16_t   ne_cbnrestab;                /* Size of non-resident name table */\n    uint16_t   ne_segtab;                   /* Offset of Segment Table */\n    uint16_t   ne_rsrctab;                  /* Offset of Resource Table */\n    uint16_t   ne_restab;                   /* Offset of resident name table */\n    uint16_t   ne_modtab;                   /* Offset of Module Reference Table */\n    uint16_t   ne_imptab;                   /* Offset of Imported Names Table */\n    int32_t   ne_nrestab;                  /* Offset of Non-resident Names Table */\n    uint16_t   ne_cmovent;                  /* Count of movable entries */\n    uint16_t   ne_align;                    /* Segment alignment shift count */\n    uint16_t   ne_cres;                     /* Count of resource segments */\n    uint8_t   ne_exetyp;                   /* Target Operating system */\n    uint8_t   ne_flagsothers;              /* Other .EXE flags */\n    uint16_t   ne_pretthunks;               /* offset to return thunks */\n    uint16_t   ne_psegrefbytes;             /* offset to segment ref. bytes */\n    uint16_t   ne_swaparea;                 /* Minimum code swap area size */\n    uint16_t   ne_expver;                   /* Expected Windows version number */\n  } IMAGE_OS2_HEADER, *PIMAGE_OS2_HEADER;\n\n/*\n * File header format.\n */\n\ntypedef struct _IMAGE_FILE_HEADER {\n    uint16_t    Machine;\n    uint16_t    NumberOfSections;\n    uint32_t   TimeDateStamp;\n    uint32_t   PointerToSymbolTable;\n    uint32_t   NumberOfSymbols;\n    uint16_t    SizeOfOptionalHeader;\n    uint16_t    Characteristics;\n} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;\n\n#define IMAGE_SIZEOF_FILE_HEADER             20\n\n#define IMAGE_FILE_RELOCS_STRIPPED           0x0001  /* Relocation info stripped from file. */\n#define IMAGE_FILE_EXECUTABLE_IMAGE          0x0002  /* File is executable  (i.e. no unresolved externel references). */\n#define IMAGE_FILE_LINE_NUMS_STRIPPED        0x0004  /* Line nunbers stripped from file. */\n#define IMAGE_FILE_LOCAL_SYMS_STRIPPED       0x0008  /* Local symbols stripped from file. */\n#define IMAGE_FILE_MINIMAL_OBJECT            0x0010  /* Reserved. */\n#define IMAGE_FILE_UPDATE_OBJECT             0x0020  /* Reserved. */\n#define IMAGE_FILE_16BIT_MACHINE             0x0040  /* 16 bit word machine. */\n#define IMAGE_FILE_BYTES_REVERSED_LO         0x0080  /* Bytes of machine word are reversed. */\n#define IMAGE_FILE_32BIT_MACHINE             0x0100  /* 32 bit word machine. */\n#define IMAGE_FILE_DEBUG_STRIPPED            0x0200  /* Debugging info stripped from file in .DBG file */\n#define IMAGE_FILE_PATCH                     0x0400  /* Reserved. */\n#define IMAGE_FILE_SYSTEM                    0x1000  /* System File. */\n#define IMAGE_FILE_DLL                       0x2000  /* File is a DLL. */\n#define IMAGE_FILE_BYTES_REVERSED_HI         0x8000  /* Bytes of machine word are reversed. */\n\n#define IMAGE_FILE_MACHINE_UNKNOWN           0\n#define IMAGE_FILE_MACHINE_I860              0x14d   /* Intel 860. */\n#define IMAGE_FILE_MACHINE_I386              0x14c   /* Intel 386. */\n#define IMAGE_FILE_MACHINE_R3000             0x162   /* MIPS little-endian, 0540 big-endian */\n#define IMAGE_FILE_MACHINE_R4000             0x166   /* MIPS little-endian */\n#define IMAGE_FILE_MACHINE_R10000            0x0168  // MIPS little-endian\n#define IMAGE_FILE_MACHINE_ALPHA             0x184   /* Alpha_AXP */\n#define IMAGE_FILE_MACHINE_POWERPC           0x01F0  // IBM PowerPC Little-Endian\n#define IMAGE_FILE_MACHINE_POWERPCBE         0x01F2  // IBM PowerPC Big-Endian\n#define IMAGE_FILE_MACHINE_SH3               0x01a2  // SH3 little-endian\n#define IMAGE_FILE_MACHINE_SH3E              0x01a4  // SH3E little-endian\n#define IMAGE_FILE_MACHINE_SH4               0x01a6  // SH4 little-endian\n#define IMAGE_FILE_MACHINE_ARM               0x01c0  // ARM Little-Endian\n#define IMAGE_FILE_MACHINE_THUMB             0x01c2\n#define IMAGE_FILE_MACHINE_IA64              0x0200  // Intel 64\n#define IMAGE_FILE_MACHINE_MIPS16            0x0266  // MIPS\n#define IMAGE_FILE_MACHINE_MIPSFPU           0x0366  // MIPS\n#define IMAGE_FILE_MACHINE_MIPSFPU16         0x0466  // MIPS\n#define IMAGE_FILE_MACHINE_ALPHA64           0x0284  // ALPHA64\n#define IMAGE_FILE_MACHINE_AXP64             IMAGE_FILE_MACHINE_ALPHA64\n#define IMAGE_FILE_MACHINE_CEF               0xC0EF\n\n/*\n * Directory format.\n */\n\ntypedef struct _IMAGE_DATA_DIRECTORY {\n    uint32_t   VirtualAddress;\n    uint32_t   Size;\n} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;\n\n#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES    16\n\n/*\n * Optional header format.\n */\n\ntypedef struct _IMAGE_OPTIONAL_HEADER {\n    /*\n     * Standard fields.\n     */\n\n    uint16_t    Magic;\n    uint8_t    MajorLinkerVersion;\n    uint8_t    MinorLinkerVersion;\n    uint32_t   SizeOfCode;\n    uint32_t   SizeOfInitializedData;\n    uint32_t   SizeOfUninitializedData;\n    uint32_t   AddressOfEntryPoint;\n    uint32_t   BaseOfCode;\n    uint32_t   BaseOfData;\n\n    /*\n     * NT additional fields.\n     */\n\n    uint32_t   ImageBase;\n    uint32_t   SectionAlignment;\n    uint32_t   FileAlignment;\n    uint16_t    MajorOperatingSystemVersion;\n    uint16_t    MinorOperatingSystemVersion;\n    uint16_t    MajorImageVersion;\n    uint16_t    MinorImageVersion;\n    uint16_t    MajorSubsystemVersion;\n    uint16_t    MinorSubsystemVersion;\n    uint32_t   Reserved1;\n    uint32_t   SizeOfImage;\n    uint32_t   SizeOfHeaders;\n    uint32_t   CheckSum;\n    uint16_t    Subsystem;\n    uint16_t    DllCharacteristics;\n    uint32_t   SizeOfStackReserve;\n    uint32_t   SizeOfStackCommit;\n    uint32_t   SizeOfHeapReserve;\n    uint32_t   SizeOfHeapCommit;\n    uint32_t   LoaderFlags;\n    uint32_t   NumberOfRvaAndSizes;\n    IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];\n} IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER;\n\ntypedef IMAGE_OPTIONAL_HEADER IMAGE_OPTIONAL_HEADER32;\n\n#define IMAGE_SIZEOF_STD_OPTIONAL_HEADER      28\n#define IMAGE_SIZEOF_NT_OPTIONAL_HEADER      224\n\n#define IMAGE_NT_OPTIONAL_HDR32_MAGIC       0x10b\n\n#ifdef _WIN64\n#define IMAGE_NT_OPTIONAL_HDR_MAGIC         IMAGE_NT_OPTIONAL_HDR64_MAGIC\n#else\n#define IMAGE_NT_OPTIONAL_HDR_MAGIC         IMAGE_NT_OPTIONAL_HDR32_MAGIC\n#endif\n\ntypedef struct _IMAGE_NT_HEADERS {\n    uint32_t Signature;\n    IMAGE_FILE_HEADER FileHeader;\n    IMAGE_OPTIONAL_HEADER OptionalHeader;\n} IMAGE_NT_HEADERS, *PIMAGE_NT_HEADERS;\n\ntypedef IMAGE_NT_HEADERS IMAGE_NT_HEADERS32;\n\n#define IMAGE_FIRST_SECTION( ntheader ) ((PIMAGE_SECTION_HEADER)        \\\n    ((uint8_t*)ntheader +                                               \\\n     offsetof( IMAGE_NT_HEADERS, OptionalHeader ) +                     \\\n     ((PIMAGE_NT_HEADERS)(ntheader))->FileHeader.SizeOfOptionalHeader   \\\n    ))\n\n\n/* Subsystem Values */\n\n#define IMAGE_SUBSYSTEM_UNKNOWN              0   /* Unknown subsystem. */\n#define IMAGE_SUBSYSTEM_NATIVE               1   /* Image doesn't require a subsystem. */\n#define IMAGE_SUBSYSTEM_WINDOWS_GUI          2   /* Image runs in the Windows GUI subsystem. */\n#define IMAGE_SUBSYSTEM_WINDOWS_CUI          3   /* Image runs in the Windows character subsystem. */\n#define IMAGE_SUBSYSTEM_OS2_CUI              5   /* image runs in the OS/2 character subsystem. */\n#define IMAGE_SUBSYSTEM_POSIX_CUI            7   /* image run  in the Posix character subsystem. */\n#define IMAGE_SUBSYSTEM_XBOX                14\n\n/* Dll Characteristics */\n\n#define IMAGE_LIBRARY_PROCESS_INIT           1   /* Dll has a process initialization routine. */\n#define IMAGE_LIBRARY_PROCESS_TERM           2   /* Dll has a thread termination routine. */\n#define IMAGE_LIBRARY_THREAD_INIT            4   /* Dll has a thread initialization routine. */\n#define IMAGE_LIBRARY_THREAD_TERM            8   /* Dll has a thread termination routine. */\n\n/*\n * Loader Flags\n */\n\n#define IMAGE_LOADER_FLAGS_BREAK_ON_LOAD    0x00000001\n#define IMAGE_LOADER_FLAGS_DEBUG_ON_LOAD    0x00000002\n\n\n/* Directory Entries */\n\n#define IMAGE_DIRECTORY_ENTRY_EXPORT         0   /* Export Directory */\n#define IMAGE_DIRECTORY_ENTRY_IMPORT         1   /* Import Directory */\n#define IMAGE_DIRECTORY_ENTRY_RESOURCE       2   /* Resource Directory */\n#define IMAGE_DIRECTORY_ENTRY_EXCEPTION      3   /* Exception Directory */\n#define IMAGE_DIRECTORY_ENTRY_SECURITY       4   /* Security Directory */\n#define IMAGE_DIRECTORY_ENTRY_BASERELOC      5   /* Base Relocation Table */\n#define IMAGE_DIRECTORY_ENTRY_DEBUG          6   /* Debug Directory */\n#define IMAGE_DIRECTORY_ENTRY_COPYRIGHT      7   /* Description String */\n#define IMAGE_DIRECTORY_ENTRY_GLOBALPTR      8   /* Machine Value (MIPS GP) */\n#define IMAGE_DIRECTORY_ENTRY_TLS            9   /* TLS Directory */\n#define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG   10   /* Load Configuration Directory */\n\n#ifdef USES_COMPLUS20\n#define IMAGE_DIRECTORY_ENTRY_COMHEADER     14   /* COM+ data */\n#endif\n\n\n/*\n * Section header format.\n */\n\n#define IMAGE_SIZEOF_SHORT_NAME              8\n\ntypedef struct _IMAGE_SECTION_HEADER {\n    uint8_t    Name[IMAGE_SIZEOF_SHORT_NAME];\n    union {\n            uint32_t   PhysicalAddress;\n            uint32_t   VirtualSize;\n    } Misc;\n    uint32_t   VirtualAddress;\n    uint32_t   SizeOfRawData;\n    uint32_t   PointerToRawData;\n    uint32_t   PointerToRelocations;\n    uint32_t   PointerToLinenumbers;\n    uint16_t    NumberOfRelocations;\n    uint16_t    NumberOfLinenumbers;\n    uint32_t   Characteristics;\n} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;\n\n#define IMAGE_SIZEOF_SECTION_HEADER          40\n\n#define IMAGE_SCN_TYPE_REGULAR               0x00000000  /*\n#define IMAGE_SCN_TYPE_DUMMY                 0x00000001  // Reserved. */\n#define IMAGE_SCN_TYPE_NO_LOAD               0x00000002  /* Reserved. */\n#define IMAGE_SCN_TYPE_GROUPED               0x00000004  /* Used for 16-bit offset code. */\n#define IMAGE_SCN_TYPE_NO_PAD                0x00000008  /* Reserved. */\n#define IMAGE_SCN_TYPE_COPY                  0x00000010  /* Reserved. */\n\n#define IMAGE_SCN_CNT_CODE                   0x00000020  /* Section contains code. */\n#define IMAGE_SCN_CNT_INITIALIZED_DATA       0x00000040  /* Section contains initialized data. */\n#define IMAGE_SCN_CNT_UNINITIALIZED_DATA     0x00000080  /* Section contains uninitialized data. */\n\n#define IMAGE_SCN_LNK_OTHER                  0x00000100  /* Reserved. */\n#define IMAGE_SCN_LNK_INFO                   0x00000200  /* Section contains comments or some other type of information. */\n#define IMAGE_SCN_LNK_OVERLAY                0x00000400  /* Section contains an overlay. */\n#define IMAGE_SCN_LNK_REMOVE                 0x00000800  /* Section contents will not become part of image. */\n#define IMAGE_SCN_LNK_COMDAT                 0x00001000  /* Section contents comdat. */\n\n#define IMAGE_SCN_ALIGN_1BYTES               0x00100000\n#define IMAGE_SCN_ALIGN_2BYTES               0x00200000\n#define IMAGE_SCN_ALIGN_4BYTES               0x00300000\n#define IMAGE_SCN_ALIGN_8BYTES               0x00400000\n#define IMAGE_SCN_ALIGN_16BYTES              0x00500000  /* Default alignment if no others are specified. */\n#define IMAGE_SCN_ALIGN_32BYTES              0x00600000\n#define IMAGE_SCN_ALIGN_64BYTES              0x00700000\n\n#define IMAGE_SCN_MEM_DISCARDABLE            0x02000000  /* Section can be discarded. */\n#define IMAGE_SCN_MEM_NOT_CACHED             0x04000000  /* Section is not cachable. */\n#define IMAGE_SCN_MEM_NOT_PAGED              0x08000000  /* Section is not pageable. */\n#define IMAGE_SCN_MEM_SHARED                 0x10000000  /* Section is shareable. */\n#define IMAGE_SCN_MEM_EXECUTE                0x20000000  /* Section is executable. */\n#define IMAGE_SCN_MEM_READ                   0x40000000  /* Section is readable. */\n#define IMAGE_SCN_MEM_WRITE                  0x80000000  /* Section is writeable. */\n\n/*\n * Symbol format.\n */\n\ntypedef struct _IMAGE_SYMBOL {\n    union {\n        uint8_t    ShortName[8];\n        struct {\n            uint32_t   Short;     /* if 0, use LongName */\n            uint32_t   Long;      /* offset into string table */\n        } Name;\n        uint8_t*   LongName[2];\n    } N;\n    uint32_t    Value;\n    int16_t     SectionNumber;\n    uint16_t    Type;\n    uint8_t     StorageClass;\n    uint8_t     NumberOfAuxSymbols;\n} IMAGE_SYMBOL;\ntypedef IMAGE_SYMBOL UNALIGNED *PIMAGE_SYMBOL;\n\n#define IMAGE_SIZEOF_SYMBOL                  18\n\n/*\n * Section values.\n *\n * Symbols have a section number of the section in which they are\n * defined. Otherwise, section numbers have the following meanings:\n */\n\n#define IMAGE_SYM_UNDEFINED           (int16 )0           /* Symbol is undefined or is common. */\n#define IMAGE_SYM_ABSOLUTE            (int16 )-1          /* Symbol is an absolute value. */\n#define IMAGE_SYM_DEBUG               (int16 )-2          /* Symbol is a special debug item. */\n\n/*\n * Type (fundamental) values.\n */\n\n#define IMAGE_SYM_TYPE_NULL                  0           /* no type. */\n#define IMAGE_SYM_TYPE_VOID                  1\n#define IMAGE_SYM_TYPE_CHAR                  2           /* type character. */\n#define IMAGE_SYM_TYPE_SHORT                 3           /* type short integer. */\n#define IMAGE_SYM_TYPE_INT                   4\n#define IMAGE_SYM_TYPE_LONG                  5\n#define IMAGE_SYM_TYPE_FLOAT                 6\n#define IMAGE_SYM_TYPE_DOUBLE                7\n#define IMAGE_SYM_TYPE_STRUCT                8\n#define IMAGE_SYM_TYPE_UNION                 9\n#define IMAGE_SYM_TYPE_ENUM                  10          /* enumeration. */\n#define IMAGE_SYM_TYPE_MOE                   11          /* member of enumeration. */\n#define IMAGE_SYM_TYPE_UCHAR                 12\n#define IMAGE_SYM_TYPE_USHORT                13\n#define IMAGE_SYM_TYPE_UINT                  14\n#define IMAGE_SYM_TYPE_ULONG                 15\n\n/*\n * Type (derived) values.\n */\n\n#define IMAGE_SYM_DTYPE_NULL                 0           /* no derived type. */\n#define IMAGE_SYM_DTYPE_POINTER              1           /* pointer. */\n#define IMAGE_SYM_DTYPE_FUNCTION             2           /* function. */\n#define IMAGE_SYM_DTYPE_ARRAY                3           /* array. */\n\n/*\n * Storage classes.\n */\n\n#define IMAGE_SYM_CLASS_END_OF_FUNCTION      (uint8_t )-1\n#define IMAGE_SYM_CLASS_NULL                 0\n#define IMAGE_SYM_CLASS_AUTOMATIC            1\n#define IMAGE_SYM_CLASS_EXTERNAL             2\n#define IMAGE_SYM_CLASS_STATIC               3\n#define IMAGE_SYM_CLASS_REGISTER             4\n#define IMAGE_SYM_CLASS_EXTERNAL_DEF         5\n#define IMAGE_SYM_CLASS_LABEL                6\n#define IMAGE_SYM_CLASS_UNDEFINED_LABEL      7\n#define IMAGE_SYM_CLASS_MEMBER_OF_STRUCT     8\n#define IMAGE_SYM_CLASS_ARGUMENT             9\n#define IMAGE_SYM_CLASS_STRUCT_TAG           10\n#define IMAGE_SYM_CLASS_MEMBER_OF_UNION      11\n#define IMAGE_SYM_CLASS_UNION_TAG            12\n#define IMAGE_SYM_CLASS_TYPE_DEFINITION      13\n#define IMAGE_SYM_CLASS_UNDEFINED_STATIC     14\n#define IMAGE_SYM_CLASS_ENUM_TAG             15\n#define IMAGE_SYM_CLASS_MEMBER_OF_ENUM       16\n#define IMAGE_SYM_CLASS_REGISTER_PARAM       17\n#define IMAGE_SYM_CLASS_BIT_FIELD            18\n#define IMAGE_SYM_CLASS_BLOCK                100\n#define IMAGE_SYM_CLASS_FUNCTION             101\n#define IMAGE_SYM_CLASS_END_OF_STRUCT        102\n#define IMAGE_SYM_CLASS_FILE                 103\n#define IMAGE_SYM_CLASS_SECTION              104\n#define IMAGE_SYM_CLASS_WEAK_EXTERNAL        105\n\n/* type packing constants */\n\n#define N_BTMASK                            017\n#define N_TMASK                             060\n#define N_TMASK1                            0300\n#define N_TMASK2                            0360\n#define N_BTSHFT                            4\n#define N_TSHIFT                            2\n\n/* MACROS */\n\n/* Basic Type of  x */\n#define BTYPE(x) ((x) & N_BTMASK)\n\n/* Is x a pointer? */\n#ifndef ISPTR\n#define ISPTR(x) (((x) & N_TMASK) == (IMAGE_SYM_DTYPE_POINTER << N_BTSHFT))\n#endif\n\n/* Is x a function? */\n#ifndef ISFCN\n#define ISFCN(x) (((x) & N_TMASK) == (IMAGE_SYM_DTYPE_FUNCTION << N_BTSHFT))\n#endif\n\n/* Is x an array? */\n\n#ifndef ISARY\n#define ISARY(x) (((x) & N_TMASK) == (IMAGE_SYM_DTYPE_ARRAY << N_BTSHFT))\n#endif\n\n/* Is x a structure, union, or enumeration TAG? */\n#ifndef ISTAG\n#define ISTAG(x) ((x)==IMAGE_SYM_CLASS_STRUCT_TAG || (x)==IMAGE_SYM_CLASS_UNION_TAG || (x)==IMAGE_SYM_CLASS_ENUM_TAG)\n#endif\n\n#ifndef INCREF\n#define INCREF(x) ((((x)&~N_BTMASK)<<N_TSHIFT)|(IMAGE_SYM_DTYPE_POINTER<<N_BTSHFT)|((x)&N_BTMASK))\n#endif\n#ifndef DECREF\n#define DECREF(x) ((((x)>>N_TSHIFT)&~N_BTMASK)|((x)&N_BTMASK))\n#endif\n\n/*\n * Auxiliary entry format.\n */\n\ntypedef union _IMAGE_AUX_SYMBOL {\n    struct {\n        uint32_t    TagIndex;                      /* struct, union, or enum tag index */\n        union {\n            struct {\n                uint16_t    Linenumber;             /* declaration line number */\n                uint16_t    Size;                   /* size of struct, union, or enum */\n            } LnSz;\n           uint32_t    TotalSize;\n        } Misc;\n        union {\n            struct {                            /* if ISFCN, tag, or .bb */\n                uint32_t    PointerToLinenumber;\n                uint32_t    PointerToNextFunction;\n            } Function;\n            struct {                            /* if ISARY, up to 4 dimen. */\n                uint16_t     Dimension[4];\n            } Array;\n        } FcnAry;\n        uint16_t    TvIndex;                        /* tv index */\n    } Sym;\n    struct {\n        uint8_t    Name[IMAGE_SIZEOF_SYMBOL];\n    } File;\n    struct {\n        uint32_t   Length;                         /* section length */\n        uint16_t    NumberOfRelocations;            /* number of relocation entries */\n        uint16_t    NumberOfLinenumbers;            /* number of line numbers */\n        uint32_t   CheckSum;                       /* checksum for communal */\n        int16_t    Number;                         /* section number to associate with */\n        uint8_t    Selection;                      /* communal selection type */\n    } Section;\n} IMAGE_AUX_SYMBOL;\ntypedef IMAGE_AUX_SYMBOL UNALIGNED *PIMAGE_AUX_SYMBOL;\n\n#define IMAGE_SIZEOF_AUX_SYMBOL              18\n\n/*\n * Communal selection types.\n */\n\n#define IMAGE_COMDAT_SELECT_UNKNOWN        0\n#define IMAGE_COMDAT_SELECT_NODUPLICATES   1\n#define IMAGE_COMDAT_SELECT_ANY            2\n#define IMAGE_COMDAT_SELECT_SAME_SIZE      3\n#define IMAGE_COMDAT_SELECT_EXACT_MATCH    4\n#define IMAGE_COMDAT_SELECT_ASSOCIATIVE    5\n\n#define IMAGE_WEAK_EXTERN_SEARCH_UNKNOWN   0\n#define IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY 1\n#define IMAGE_WEAK_EXTERN_SEARCH_LIBRARY   2\n\n\n/*\n * Relocation format.\n */\n\ntypedef struct _IMAGE_RELOCATION {\n    uint32_t   VirtualAddress;\n    uint32_t   SymbolTableIndex;\n    uint16_t    Type;\n} IMAGE_RELOCATION;\ntypedef IMAGE_RELOCATION UNALIGNED *PIMAGE_RELOCATION;\n\n#define IMAGE_SIZEOF_RELOCATION              10\n\n/*\n * I860 relocation types.\n */\n\n#define IMAGE_REL_I860_ABSOLUTE              0           /* Reference is absolute, no relocation is necessary */\n#define IMAGE_REL_I860_DIR32                 06          /* Direct 32-bit reference to the symbols virtual address */\n#define IMAGE_REL_I860_DIR32NB               07\n#define IMAGE_REL_I860_SECTION               012\n#define IMAGE_REL_I860_SECREL                013\n#define IMAGE_REL_I860_PAIR                  034\n#define IMAGE_REL_I860_HIGH                  036\n#define IMAGE_REL_I860_LOW0                  037\n#define IMAGE_REL_I860_LOW1                  040\n#define IMAGE_REL_I860_LOW2                  041\n#define IMAGE_REL_I860_LOW3                  042\n#define IMAGE_REL_I860_LOW4                  043\n#define IMAGE_REL_I860_SPLIT0                044\n#define IMAGE_REL_I860_SPLIT1                045\n#define IMAGE_REL_I860_SPLIT2                046\n#define IMAGE_REL_I860_HIGHADJ               047\n#define IMAGE_REL_I860_BRADDR                050\n\n/*\n * I386 relocation types.\n */\n\n#define IMAGE_REL_I386_ABSOLUTE              0           /* Reference is absolute, no relocation is necessary */\n#define IMAGE_REL_I386_DIR16                 01          /* Direct 16-bit reference to the symbols virtual address */\n#define IMAGE_REL_I386_REL16                 02          /* PC-relative 16-bit reference to the symbols virtual address */\n#define IMAGE_REL_I386_DIR32                 06          /* Direct 32-bit reference to the symbols virtual address */\n#define IMAGE_REL_I386_DIR32NB               07          /* Direct 32-bit reference to the symbols virtual address, base not included */\n#define IMAGE_REL_I386_SEG12                 011         /* Direct 16-bit reference to the segment-selector bits of a 32-bit virtual address */\n#define IMAGE_REL_I386_SECTION               012\n#define IMAGE_REL_I386_SECREL                013\n#define IMAGE_REL_I386_REL32                 024         /* PC-relative 32-bit reference to the symbols virtual address */\n\n/*\n * MIPS relocation types.\n */\n\n#define IMAGE_REL_MIPS_ABSOLUTE              0           /* Reference is absolute, no relocation is necessary */\n#define IMAGE_REL_MIPS_REFHALF               01\n#define IMAGE_REL_MIPS_REFWORD               02\n#define IMAGE_REL_MIPS_JMPADDR               03\n#define IMAGE_REL_MIPS_REFHI                 04\n#define IMAGE_REL_MIPS_REFLO                 05\n#define IMAGE_REL_MIPS_GPREL                 06\n#define IMAGE_REL_MIPS_LITERAL               07\n#define IMAGE_REL_MIPS_SECTION               012\n#define IMAGE_REL_MIPS_SECREL                013\n#define IMAGE_REL_MIPS_REFWORDNB             042\n#define IMAGE_REL_MIPS_PAIR                  045\n\n/*\n * Alpha Relocation types.\n */\n\n#define IMAGE_REL_ALPHA_ABSOLUTE             0x0\n#define IMAGE_REL_ALPHA_REFLONG              0x1\n#define IMAGE_REL_ALPHA_REFQUAD              0x2\n#define IMAGE_REL_ALPHA_GPREL32              0x3\n#define IMAGE_REL_ALPHA_LITERAL              0x4\n#define IMAGE_REL_ALPHA_LITUSE               0x5\n#define IMAGE_REL_ALPHA_GPDISP               0x6\n#define IMAGE_REL_ALPHA_BRADDR               0x7\n#define IMAGE_REL_ALPHA_HINT                 0x8\n#define IMAGE_REL_ALPHA_INLINE_REFLONG       0x9\n#define IMAGE_REL_ALPHA_REFHI                0xA\n#define IMAGE_REL_ALPHA_REFLO                0xB\n#define IMAGE_REL_ALPHA_PAIR                 0xC\n#define IMAGE_REL_ALPHA_MATCH                0xD\n#define IMAGE_REL_ALPHA_SECTION              0xE\n#define IMAGE_REL_ALPHA_SECREL               0xF\n#define IMAGE_REL_ALPHA_REFLONGNB            0x10\n\n/*\n * Based relocation format.\n */\n\ntypedef struct _IMAGE_BASE_RELOCATION {\n    uint32_t   VirtualAddress;\n    uint32_t   SizeOfBlock;\n/*  uint16_t    TypeOffset[1]; */\n} IMAGE_BASE_RELOCATION, *PIMAGE_BASE_RELOCATION;\n\n#define IMAGE_SIZEOF_BASE_RELOCATION         8\n\n/*\n * Based relocation types.\n */\n\n#define IMAGE_REL_BASED_ABSOLUTE              0\n#define IMAGE_REL_BASED_HIGH                  1\n#define IMAGE_REL_BASED_LOW                   2\n#define IMAGE_REL_BASED_HIGHLOW               3\n#define IMAGE_REL_BASED_HIGHADJ               4\n#define IMAGE_REL_BASED_MIPS_JMPADDR          5\n#define IMAGE_REL_BASED_I860_BRADDR           6\n#define IMAGE_REL_BASED_I860_SPLIT            7\n\n/*\n * Line number format.\n */\n\ntypedef struct _IMAGE_LINENUMBER {\n    union {\n        uint32_t   SymbolTableIndex;                       /* Symbol table index of function name if Linenumber is 0. */\n        uint32_t   VirtualAddress;                         /* Virtual address of line number. */\n    } Type;\n    uint16_t    Linenumber;                                 /* Line number. */\n} IMAGE_LINENUMBER;\ntypedef IMAGE_LINENUMBER UNALIGNED *PIMAGE_LINENUMBER;\n\n#define IMAGE_SIZEOF_LINENUMBER              6\n\n/*\n * Archive format.\n */\n\n#define IMAGE_ARCHIVE_START_SIZE             8\n#define IMAGE_ARCHIVE_START                  \"!<arch>\\n\"\n#define IMAGE_ARCHIVE_END                    \"`\\n\"\n#define IMAGE_ARCHIVE_PAD                    \"\\n\"\n#define IMAGE_ARCHIVE_LINKER_MEMBER          \"/               \"\n#define IMAGE_ARCHIVE_LONGNAMES_MEMBER       \"//              \"\n\ntypedef struct _IMAGE_ARCHIVE_MEMBER_HEADER {\n    uint8_t     Name[16];                                  /* File member name - `/' terminated. */\n    uint8_t     Date[12];                                  /* File member date - decimal. */\n    uint8_t     UserID[6];                                 /* File member user id - decimal. */\n    uint8_t     GroupID[6];                                /* File member group id - decimal. */\n    uint8_t     Mode[8];                                   /* File member mode - octal. */\n    uint8_t     Size[10];                                  /* File member size - decimal. */\n    uint8_t     EndHeader[2];                              /* String to end header. */\n} IMAGE_ARCHIVE_MEMBER_HEADER, *PIMAGE_ARCHIVE_MEMBER_HEADER;\n\n#define IMAGE_SIZEOF_ARCHIVE_MEMBER_HDR      60\n\n/*\n * DLL support.\n */\n\n/*\n * Export Format\n */\n\ntypedef struct _IMAGE_EXPORT_DIRECTORY {\n    uint32_t   Characteristics;\n    uint32_t   TimeDateStamp;\n    uint16_t   MajorVersion;\n    uint16_t   MinorVersion;\n    uint32_t   Name;\n    uint32_t   Base;\n    uint32_t   NumberOfFunctions;\n    uint32_t   NumberOfNames;\n    uint32_t   **AddressOfFunctions;\n    uint32_t   **AddressOfNames;\n    uint16_t   **AddressOfNameOrdinals;\n} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;\n\n/*\n * Import Format\n */\n\ntypedef struct _IMAGE_IMPORT_BY_NAME {\n    uint16_t    Hint;\n    uint8_t    Name[1];\n} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;\n\ntypedef struct _IMAGE_THUNK_DATA {\n    union {\n        uint32_t *Function;\n        uint32_t Ordinal;\n        PIMAGE_IMPORT_BY_NAME AddressOfData;\n    } u1;\n} IMAGE_THUNK_DATA, *PIMAGE_THUNK_DATA;\n\n#define IMAGE_ORDINAL_FLAG 0x80000000\n#define IMAGE_SNAP_BY_ORDINAL(Ordinal) ((Ordinal & IMAGE_ORDINAL_FLAG) != 0)\n#define IMAGE_ORDINAL(Ordinal) (Ordinal & 0xffff)\n\ntypedef struct _IMAGE_IMPORT_DESCRIPTOR {\n    uint32_t   Characteristics;\n    uint32_t   TimeDateStamp;\n    uint32_t   ForwarderChain;\n    uint32_t   Name;\n    PIMAGE_THUNK_DATA FirstThunk;\n} IMAGE_IMPORT_DESCRIPTOR, *PIMAGE_IMPORT_DESCRIPTOR;\n\n/*\n * Thread Local Storage\n */\n\ntypedef void (*PIMAGE_TLS_CALLBACK) (\n    void* DllHandle,\n    uint32_t Reason,\n    void* Reserved\n    );\n\ntypedef struct _IMAGE_TLS_DIRECTORY {\n    uint32_t   StartAddressOfRawData;\n    uint32_t   EndAddressOfRawData;\n    uint32_t   *AddressOfIndex;\n    PIMAGE_TLS_CALLBACK *AddressOfCallBacks;\n    uint32_t   SizeOfZeroFill;\n    uint32_t   Characteristics;\n} IMAGE_TLS_DIRECTORY, *PIMAGE_TLS_DIRECTORY;\n\n\n/*\n * Resource Format.\n */\n\n/*\n * Resource directory consists of two counts, following by a variable length\n * array of directory entries.  The first count is the number of entries at\n * beginning of the array that have actual names associated with each entry.\n * The entries are in ascending order, case insensitive strings.  The second\n * count is the number of entries that immediately follow the named entries.\n * This second count identifies the number of entries that have 31-bit integer\n * Ids as their name.  These entries are also sorted in ascending order.\n *\n * This structure allows fast lookup by either name or number, but for any\n * given resource entry only one form of lookup is supported, not both.\n * This is consistant with the syntax of the .RC file and the .RES file.\n */\n\ntypedef struct _IMAGE_RESOURCE_DIRECTORY {\n    uint32_t   Characteristics;\n    uint32_t   TimeDateStamp;\n    uint16_t    MajorVersion;\n    uint16_t    MinorVersion;\n    uint16_t    NumberOfNamedEntries;\n    uint16_t    NumberOfIdEntries;\n/*  IMAGE_RESOURCE_DIRECTORY_ENTRY DirectoryEntries[]; */\n} IMAGE_RESOURCE_DIRECTORY, *PIMAGE_RESOURCE_DIRECTORY;\n\n#define IMAGE_RESOURCE_NAME_IS_STRING        0x80000000\n#define IMAGE_RESOURCE_DATA_IS_DIRECTORY     0x80000000\n\n/*\n * Each directory contains the 32-bit Name of the entry and an offset,\n * relative to the beginning of the resource directory of the data associated\n * with this directory entry.  If the name of the entry is an actual text\n * string instead of an integer Id, then the high order bit of the name field\n * is set to one and the low order 31-bits are an offset, relative to the\n * beginning of the resource directory of the string, which is of type\n * IMAGE_RESOURCE_DIRECTORY_STRING.  Otherwise the high bit is clear and the\n * low-order 31-bits are the integer Id that identify this resource directory\n * entry. If the directory entry is yet another resource directory (i.e. a\n * subdirectory), then the high order bit of the offset field will be\n * set to indicate this.  Otherwise the high bit is clear and the offset\n * field points to a resource data entry.\n */\n\ntypedef struct _IMAGE_RESOURCE_DIRECTORY_ENTRY {\n    uint32_t   Name;\n    uint32_t   OffsetToData;\n} IMAGE_RESOURCE_DIRECTORY_ENTRY, *PIMAGE_RESOURCE_DIRECTORY_ENTRY;\n\n/*\n * For resource directory entries that have actual string names, the Name\n * field of the directory entry points to an object of the following type.\n * All of these string objects are stored together after the last resource\n * directory entry and before the first resource data object.  This minimizes\n * the impact of these variable length objects on the alignment of the fixed\n * size directory entry objects.\n */\n\ntypedef struct _IMAGE_RESOURCE_DIRECTORY_STRING {\n    uint16_t    Length;\n    char    NameString[ 1 ];\n} IMAGE_RESOURCE_DIRECTORY_STRING, *PIMAGE_RESOURCE_DIRECTORY_STRING;\n\n\ntypedef struct _IMAGE_RESOURCE_DIR_STRING_U {\n    uint16_t      Length;\n    wchar_t NameString[ 1 ];\n} IMAGE_RESOURCE_DIR_STRING_U, *PIMAGE_RESOURCE_DIR_STRING_U;\n\n/*\n * Each resource data entry describes a leaf node in the resource directory\n * tree.  It contains an offset, relative to the beginning of the resource\n * directory of the data for the resource, a size field that gives the number\n * of bytes of data at that offset, a CodePage that should be used when\n * decoding code point values within the resource data.  Typically for new\n * applications the code page would be the unicode code page.\n */\n\ntypedef struct _IMAGE_RESOURCE_DATA_ENTRY {\n    uint32_t   OffsetToData;\n    uint32_t   Size;\n    uint32_t   CodePage;\n    uint32_t   Reserved;\n} IMAGE_RESOURCE_DATA_ENTRY, *PIMAGE_RESOURCE_DATA_ENTRY;\n\n/*\n * Load Configuration Directory Entry\n */\n\ntypedef struct _IMAGE_LOAD_CONFIG_DIRECTORY {\n    uint32_t   Characteristics;\n    uint32_t   TimeDateStamp;\n    uint16_t    MajorVersion;\n    uint16_t    MinorVersion;\n    uint32_t   GlobalFlagsClear;\n    uint32_t   GlobalFlagsSet;\n    uint32_t   CriticalSectionDefaultTimeout;\n    uint32_t   DeCommitFreeBlockThreshold;\n    uint32_t   DeCommitTotalFreeThreshold;\n    uint32_t   Reserved[ 8 ];\n} IMAGE_LOAD_CONFIG_DIRECTORY, *PIMAGE_LOAD_CONFIG_DIRECTORY;\n\n\n/*\n * Function table entry format for MIPS/ALPHA images.  Function table is\n * pointed to by the IMAGE_DIRECTORY_ENTRY_EXCEPTION directory entry.\n * This definition duplicates ones in ntmips.h and ntalpha.h for use\n * by portable image file mungers.\n */\n\ntypedef struct _IMAGE_RUNTIME_FUNCTION_ENTRY {\n    uint32_t BeginAddress;\n    uint32_t EndAddress;\n    void*  ExceptionHandler;\n    void*  HandlerData;\n    uint32_t PrologEndAddress;\n} IMAGE_RUNTIME_FUNCTION_ENTRY, *PIMAGE_RUNTIME_FUNCTION_ENTRY;\n\n/*\n * Debug Format\n */\n\ntypedef struct _IMAGE_DEBUG_DIRECTORY {\n    uint32_t   Characteristics;\n    uint32_t   TimeDateStamp;\n    uint16_t    MajorVersion;\n    uint16_t    MinorVersion;\n    uint32_t   Type;\n    uint32_t   SizeOfData;\n    uint32_t   AddressOfRawData;\n    uint32_t   PointerToRawData;\n} IMAGE_DEBUG_DIRECTORY, *PIMAGE_DEBUG_DIRECTORY;\n\n#define IMAGE_DEBUG_TYPE_UNKNOWN          0\n#define IMAGE_DEBUG_TYPE_COFF             1\n#define IMAGE_DEBUG_TYPE_CODEVIEW         2\n#define IMAGE_DEBUG_TYPE_FPO              3\n#define IMAGE_DEBUG_TYPE_MISC             4\n#define IMAGE_DEBUG_TYPE_EXCEPTION        5\n#define IMAGE_DEBUG_TYPE_FIXUP            6\n#define IMAGE_DEBUG_TYPE_RESERVED6        7\n#define IMAGE_DEBUG_TYPE_RESERVED7        8\n\ntypedef struct _IMAGE_COFF_SYMBOLS_HEADER {\n    uint32_t   NumberOfSymbols;\n    uint32_t   LvaToFirstSymbol;\n    uint32_t   NumberOfLinenumbers;\n    uint32_t   LvaToFirstLinenumber;\n    uint32_t   RvaToFirstByteOfCode;\n    uint32_t   RvaToLastByteOfCode;\n    uint32_t   RvaToFirstByteOfData;\n    uint32_t   RvaToLastByteOfData;\n} IMAGE_COFF_SYMBOLS_HEADER, *PIMAGE_COFF_SYMBOLS_HEADER;\n\n#define FRAME_FPO   0\n#define FRAME_TRAP  1\n#define FRAME_TSS   2\n\n#ifdef _MSC_VER\n#pragma warning(disable:4214)\n#endif\ntypedef struct _FPO_DATA {\n    uint32_t       ulOffStart;             /* offset 1st byte of function code */\n    uint32_t       cbProcSize;             /* # bytes in function */\n    uint32_t       cdwLocals;              /* # bytes in locals/4 */\n    uint16_t        cdwParams;              /* # bytes in params/4 */\n    uint16_t        cbProlog : 8;           /* # bytes in prolog */\n    uint16_t        cbRegs   : 3;           /* # regs saved */\n    uint16_t        fHasSEH  : 1;           /* TRUE if SEH in func */\n    uint16_t        fUseBP   : 1;           /* TRUE if EBP has been allocated */\n    uint16_t        reserved : 1;           /* reserved for future use */\n    uint16_t        cbFrame  : 2;           /* frame type */\n} FPO_DATA, *PFPO_DATA;\n#define SIZEOF_RFPO_DATA 16\n#ifdef _MSC_VER\n#pragma warning(default:4214)\n#endif\n\n#define IMAGE_DEBUG_MISC_EXENAME    1\n\ntypedef struct _IMAGE_DEBUG_MISC {\n    uint32_t       DataType;               /* type of misc data, see defines */\n    uint32_t       Length;                 /* total length of record, rounded to four */\n                                        /* byte multiple. */\n    uint8_t        Unicode;                /* TRUE if data is unicode string */\n    uint8_t        Reserved[ 3 ];\n    uint8_t        Data[ 1 ];              /* Actual data */\n} IMAGE_DEBUG_MISC, *PIMAGE_DEBUG_MISC;\n\n\n/*\n * Debugging information can be stripped from an image file and placed\n * in a separate .DBG file, whose file name part is the same as the\n * image file name part (e.g. symbols for CMD.EXE could be stripped\n * and placed in CMD.DBG).  This is indicated by the IMAGE_FILE_DEBUG_STRIPPED\n * flag in the Characteristics field of the file header.  The beginning of\n * the .DBG file contains the following structure which captures certain\n * information from the image file.  This allows a debug to proceed even if\n * the original image file is not accessable.  This header is followed by\n * zero of more IMAGE_SECTION_HEADER structures, followed by zero or more\n * IMAGE_DEBUG_DIRECTORY structures.  The latter structures and those in\n * the image file contain file offsets relative to the beginning of the\n * .DBG file.\n *\n * If symbols have been stripped from an image, the IMAGE_DEBUG_MISC structure\n * is left in the image file, but not mapped.  This allows a debugger to\n * compute the name of the .DBG file, from the name of the image in the\n * IMAGE_DEBUG_MISC structure.\n */\n\ntypedef struct _IMAGE_SEPARATE_DEBUG_HEADER {\n    uint16_t       Signature;\n    uint16_t       Flags;\n    uint16_t       Machine;\n    uint16_t       Characteristics;\n    uint32_t       TimeDateStamp;\n    uint32_t       CheckSum;\n    uint32_t       ImageBase;\n    uint32_t       SizeOfImage;\n    uint32_t       NumberOfSections;\n    uint32_t       ExportedNamesSize;\n    uint32_t       DebugDirectorySize;\n    uint32_t       Reserved[ 3 ];\n} IMAGE_SEPARATE_DEBUG_HEADER, *PIMAGE_SEPARATE_DEBUG_HEADER;\n\n#define IMAGE_SEPARATE_DEBUG_SIGNATURE 0x4944\n\n#endif /* IMAGE_NT_SIGNATURE */\n\n\n#ifdef USES_COMPLUS20\n/*\n * COM+ 2.0 header structure.\n */\ntypedef struct IMAGE_COR20_HEADER\n{\n    /* Header versioning */\n    uint32_t                  cb;\n    uint16_t                  MajorRuntimeVersion;\n    uint16_t                  MinorRuntimeVersion;\n\n    /* Symbol table and startup information */\n    IMAGE_DATA_DIRECTORY    MetaData;\n    uint32_t                  Flags;\n    uint32_t                  EntryPointToken;\n\n    /* Binding information */\n    IMAGE_DATA_DIRECTORY    Resources;\n    IMAGE_DATA_DIRECTORY    StrongNameSignature;\n\n    /* Regular fixup and binding information */\n    IMAGE_DATA_DIRECTORY    CodeManagerTable;\n    IMAGE_DATA_DIRECTORY    VTableFixups;\n    IMAGE_DATA_DIRECTORY    ExportAddressTableJumps;\n\n    /* Managed Native Code */\n    IMAGE_DATA_DIRECTORY    EEInfoTable;\n    IMAGE_DATA_DIRECTORY    HelperTable;\n    IMAGE_DATA_DIRECTORY    DynamicInfo;\n    IMAGE_DATA_DIRECTORY    DelayLoadInfo;\n    IMAGE_DATA_DIRECTORY    ModuleImage;\n    IMAGE_DATA_DIRECTORY    ExternalFixups;\n    IMAGE_DATA_DIRECTORY    RidMap;\n    IMAGE_DATA_DIRECTORY    DebugMap;\n\n    /*@Todo: this is obsolete, being replaced by pdata in the PE header.*/\n    IMAGE_DATA_DIRECTORY    IPMap;\n\n} IMAGE_COR20_HEADER;\n\n#endif  /* USES_COMPLUS20 */\n\n#ifdef _MSC_VER\n#pragma pack ()\n#endif\n\n/*\n * End Image Format\n */\n"
  },
  {
    "path": "third_party/renderdoc/renderdoc_app.h",
    "content": "/******************************************************************************\n * The MIT License (MIT)\n * \n * Copyright (c) 2015-2016 Baldur Karlsson\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n ******************************************************************************/\n\n#pragma once\n\n#if !defined(RENDERDOC_NO_STDINT)\n#include <stdint.h>\n#endif\n\n#if defined(WIN32)\n\t#define RENDERDOC_CC __cdecl\n#elif defined(__linux__)\n\t#define RENDERDOC_CC\n#else\n\t#error \"Unknown platform\"\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\t\n//////////////////////////////////////////////////////////////////////////////////////////////////\n// RenderDoc capture options\n// \n\ntypedef enum\n{\n\t// Allow the application to enable vsync\n\t//\n\t// Default - enabled\n\t//\n\t// 1 - The application can enable or disable vsync at will\n\t// 0 - vsync is force disabled\n\teRENDERDOC_Option_AllowVSync = 0,\n\t\n\t// Allow the application to enable fullscreen\n\t//\n\t// Default - enabled\n\t//\n\t// 1 - The application can enable or disable fullscreen at will\n\t// 0 - fullscreen is force disabled\n\teRENDERDOC_Option_AllowFullscreen = 1,\n\n\t// Record API debugging events and messages \n\t//\n\t// Default - disabled\n\t//\n\t// 1 - Enable built-in API debugging features and records the results into\n\t//     the capture logfile, which is matched up with events on replay\n\t// 0 - no API debugging is forcibly enabled\n\teRENDERDOC_Option_DebugDeviceMode = 2,\n\t\n\t// Capture CPU callstacks for API events \n\t//\n\t// Default - disabled\n\t//\n\t// 1 - Enables capturing of callstacks\n\t// 0 - no callstacks are captured\n\teRENDERDOC_Option_CaptureCallstacks = 3,\n\t\n\t// When capturing CPU callstacks, only capture them from drawcalls.\n\t// This option does nothing without the above option being enabled\n\t//\n\t// Default - disabled\n\t//\n\t// 1 - Only captures callstacks for drawcall type API events.\n\t//     Ignored if CaptureCallstacks is disabled\n\t// 0 - Callstacks, if enabled, are captured for every event.\n\teRENDERDOC_Option_CaptureCallstacksOnlyDraws = 4,\n\n\t// Specify a delay in seconds to wait for a debugger to attach, after\n\t// creating or injecting into a process, before continuing to allow it to run.\n\t//\n\t// 0 indicates no delay, and the process will run immediately after injection\n\t//\n\t// Default - 0 seconds\n\t//\n\teRENDERDOC_Option_DelayForDebugger = 5,\n\t\n\t// Verify any writes to mapped buffers, by checking the memory after the\n\t// bounds of the returned pointer to detect any modification.\n\t//\n\t// Default - disabled\n\t//\n\t// 1 - Verify any writes to mapped buffers\n\t// 0 - No verification is performed, and overwriting bounds may cause\n\t//     crashes or corruption in RenderDoc\n\teRENDERDOC_Option_VerifyMapWrites = 6,\n\t\n\t// Hooks any system API calls that create child processes, and injects\n\t// RenderDoc into them recursively with the same options.\n\t//\n\t// Default - disabled\n\t//\n\t// 1 - Hooks into spawned child processes\n\t// 0 - Child processes are not hooked by RenderDoc\n\teRENDERDOC_Option_HookIntoChildren = 7,\n\n\t// By default RenderDoc only includes resources in the final logfile necessary\n\t// for that frame, this allows you to override that behaviour.\n\t//\n\t// Default - disabled\n\t//\n\t// 1 - all live resources at the time of capture are included in the log\n\t//     and available for inspection\n\t// 0 - only the resources referenced by the captured frame are included\n\teRENDERDOC_Option_RefAllResources = 8,\n\n\t// By default RenderDoc skips saving initial states for resources where the\n\t// previous contents don't appear to be used, assuming that writes before\n\t// reads indicate previous contents aren't used.\n\t//\n\t// Default - disabled\n\t//\n\t// 1 - initial contents at the start of each captured frame are saved, even if\n\t//     they are later overwritten or cleared before being used.\n\t// 0 - unless a read is detected, initial contents will not be saved and will\n\t//     appear as black or empty data.\n\teRENDERDOC_Option_SaveAllInitials = 9,\n\n\t// In APIs that allow for the recording of command lists to be replayed later,\n\t// RenderDoc may choose to not capture command lists before a frame capture is\n\t// triggered, to reduce overheads. This means any command lists recorded once\n\t// and replayed many times will not be available and may cause a failure to\n\t// capture.\n\t//\n\t// Note this is only true for APIs where multithreading is difficult or\n\t// discouraged. Newer APIs like Vulkan and D3D12 will ignore this option\n\t// and always capture all command lists since the API is heavily oriented\n\t// around it and the overheads have been reduced by API design.\n\t//\n\t// 1 - All command lists are captured from the start of the application\n\t// 0 - Command lists are only captured if their recording begins during\n\t//     the period when a frame capture is in progress.\n\teRENDERDOC_Option_CaptureAllCmdLists = 10,\n\n\t// Mute API debugging output when the debug device mode option is enabled \n\t//\n\t// Default - enabled\n\t//\n\t// 1 - Mute any API debug messages from being displayed or passed through\n\t// 0 - API debugging is displayed as normal\n\teRENDERDOC_Option_DebugOutputMute = 11,\n\n} RENDERDOC_CaptureOption;\n\n// Sets an option that controls how RenderDoc behaves on capture.\n//\n// Returns 1 if the option and value are valid\n// Returns 0 if either is invalid and the option is unchanged\ntypedef int (RENDERDOC_CC *pRENDERDOC_SetCaptureOptionU32)(RENDERDOC_CaptureOption opt, uint32_t val);\ntypedef int (RENDERDOC_CC *pRENDERDOC_SetCaptureOptionF32)(RENDERDOC_CaptureOption opt, float val);\n\n// Gets the current value of an option as a uint32_t\n//\n// If the option is invalid, 0xffffffff is returned\ntypedef uint32_t (RENDERDOC_CC *pRENDERDOC_GetCaptureOptionU32)(RENDERDOC_CaptureOption opt);\n\n// Gets the current value of an option as a float\n//\n// If the option is invalid, -FLT_MAX is returned\ntypedef float (RENDERDOC_CC *pRENDERDOC_GetCaptureOptionF32)(RENDERDOC_CaptureOption opt);\n\ntypedef enum\n{\n\t// '0' - '9' matches ASCII values\n\teRENDERDOC_Key_0 = 0x30,\n\teRENDERDOC_Key_1 = 0x31,\n\teRENDERDOC_Key_2 = 0x32,\n\teRENDERDOC_Key_3 = 0x33,\n\teRENDERDOC_Key_4 = 0x34,\n\teRENDERDOC_Key_5 = 0x35,\n\teRENDERDOC_Key_6 = 0x36,\n\teRENDERDOC_Key_7 = 0x37,\n\teRENDERDOC_Key_8 = 0x38,\n\teRENDERDOC_Key_9 = 0x39,\n\n\t// 'A' - 'Z' matches ASCII values\n\teRENDERDOC_Key_A = 0x41,\n\teRENDERDOC_Key_B = 0x42,\n\teRENDERDOC_Key_C = 0x43,\n\teRENDERDOC_Key_D = 0x44,\n\teRENDERDOC_Key_E = 0x45,\n\teRENDERDOC_Key_F = 0x46,\n\teRENDERDOC_Key_G = 0x47,\n\teRENDERDOC_Key_H = 0x48,\n\teRENDERDOC_Key_I = 0x49,\n\teRENDERDOC_Key_J = 0x4A,\n\teRENDERDOC_Key_K = 0x4B,\n\teRENDERDOC_Key_L = 0x4C,\n\teRENDERDOC_Key_M = 0x4D,\n\teRENDERDOC_Key_N = 0x4E,\n\teRENDERDOC_Key_O = 0x4F,\n\teRENDERDOC_Key_P = 0x50,\n\teRENDERDOC_Key_Q = 0x51,\n\teRENDERDOC_Key_R = 0x52,\n\teRENDERDOC_Key_S = 0x53,\n\teRENDERDOC_Key_T = 0x54,\n\teRENDERDOC_Key_U = 0x55,\n\teRENDERDOC_Key_V = 0x56,\n\teRENDERDOC_Key_W = 0x57,\n\teRENDERDOC_Key_X = 0x58,\n\teRENDERDOC_Key_Y = 0x59,\n\teRENDERDOC_Key_Z = 0x5A,\n\n\t// leave the rest of the ASCII range free\n\t// in case we want to use it later\n\teRENDERDOC_Key_NonPrintable = 0x100,\n\n\teRENDERDOC_Key_Divide,\n\teRENDERDOC_Key_Multiply,\n\teRENDERDOC_Key_Subtract,\n\teRENDERDOC_Key_Plus,\n\n\teRENDERDOC_Key_F1,\n\teRENDERDOC_Key_F2,\n\teRENDERDOC_Key_F3,\n\teRENDERDOC_Key_F4,\n\teRENDERDOC_Key_F5,\n\teRENDERDOC_Key_F6,\n\teRENDERDOC_Key_F7,\n\teRENDERDOC_Key_F8,\n\teRENDERDOC_Key_F9,\n\teRENDERDOC_Key_F10,\n\teRENDERDOC_Key_F11,\n\teRENDERDOC_Key_F12,\n\n\teRENDERDOC_Key_Home,\n\teRENDERDOC_Key_End,\n\teRENDERDOC_Key_Insert,\n\teRENDERDOC_Key_Delete,\n\teRENDERDOC_Key_PageUp,\n\teRENDERDOC_Key_PageDn,\n\n\teRENDERDOC_Key_Backspace,\n\teRENDERDOC_Key_Tab,\n\teRENDERDOC_Key_PrtScrn,\n\teRENDERDOC_Key_Pause,\n\n\teRENDERDOC_Key_Max,\n} RENDERDOC_InputButton;\n\n// Sets which key or keys can be used to toggle focus between multiple windows\n//\n// If keys is NULL or num is 0, toggle keys will be disabled\ntypedef void (RENDERDOC_CC *pRENDERDOC_SetFocusToggleKeys)(RENDERDOC_InputButton *keys, int num);\n\n// Sets which key or keys can be used to capture the next frame\n//\n// If keys is NULL or num is 0, captures keys will be disabled\ntypedef void (RENDERDOC_CC *pRENDERDOC_SetCaptureKeys)(RENDERDOC_InputButton *keys, int num);\n\ntypedef enum\n{\n\t// This single bit controls whether the overlay is enabled or disabled globally\n\teRENDERDOC_Overlay_Enabled = 0x1,\n\n\t// Show the average framerate over several seconds as well as min/max\n\teRENDERDOC_Overlay_FrameRate = 0x2,\n\n\t// Show the current frame number\n\teRENDERDOC_Overlay_FrameNumber = 0x4,\n\n\t// Show a list of recent captures, and how many captures have been made\n\teRENDERDOC_Overlay_CaptureList = 0x8,\n\n\t// Default values for the overlay mask\n\teRENDERDOC_Overlay_Default =\n\t       (eRENDERDOC_Overlay_Enabled|\n\t        eRENDERDOC_Overlay_FrameRate|\n\t        eRENDERDOC_Overlay_FrameNumber|\n\t        eRENDERDOC_Overlay_CaptureList),\n\n\t// Enable all bits\n\teRENDERDOC_Overlay_All = ~0U,\n\n\t// Disable all bits\n\teRENDERDOC_Overlay_None = 0,\n} RENDERDOC_OverlayBits;\n\n// returns the overlay bits that have been set\ntypedef uint32_t (RENDERDOC_CC *pRENDERDOC_GetOverlayBits)();\n// sets the overlay bits with an and & or mask\ntypedef void (RENDERDOC_CC *pRENDERDOC_MaskOverlayBits)(uint32_t And, uint32_t Or);\n\n// this function will attempt to shut down RenderDoc.\n//\n// Note: that this will only work correctly if done immediately after\n// the dll is loaded, before any API work happens. RenderDoc will remove its\n// injected hooks and shut down. Behaviour is undefined if this is called\n// after any API functions have been called.\ntypedef void (RENDERDOC_CC *pRENDERDOC_Shutdown)();\n\n// This function will unload RenderDoc's crash handler.\n//\n// If you use your own crash handler and don't want RenderDoc's handler to\n// intercede, you can call this function to unload it and any unhandled\n// exceptions will pass to the next handler.\ntypedef void (RENDERDOC_CC *pRENDERDOC_UnloadCrashHandler)();\n\n// Sets the logfile path template\n//\n// logfile is a UTF-8 string that gives a template for how captures will be named\n// and where they will be saved.\n//\n// Any extension is stripped off the path, and captures are saved in the directory\n// specified, and named with the filename and the frame number appended. If the\n// directory does not exist it will be created, including any parent directories.\n//\n// If pathtemplate is NULL, the template will remain unchanged\n//\n// Example:\n//\n// SetLogFilePathTemplate(\"my_captures/example\");\n//\n// Capture #1 -> my_captures/example_frame123.rdc\n// Capture #2 -> my_captures/example_frame456.rdc\ntypedef void (RENDERDOC_CC *pRENDERDOC_SetLogFilePathTemplate)(const char *pathtemplate);\n\n// returns the current logfile template, see SetLogFileTemplate above, as a UTF-8 string\ntypedef const char* (RENDERDOC_CC *pRENDERDOC_GetLogFilePathTemplate)();\n\n// returns the number of captures that have been made\ntypedef uint32_t (RENDERDOC_CC *pRENDERDOC_GetNumCaptures)();\n\n// This function returns the details of a capture, by index. New captures are added\n// to the end of the list.\n//\n// logfile will be filled with the absolute path to the capture file, as a UTF-8 string\n// pathlength will be written with the length in bytes of the logfile string\n// timestamp will be written with the time of the capture, in seconds since the Unix epoch\n//\n// Any of the parameters can be NULL and they'll be skipped.\n//\n// The function will return 1 if the capture index is valid, or 0 if the index is invalid\n// If the index is invalid, the values will be unchanged\n//\n// Note: when captures are deleted in the UI they will remain in this list, so the\n// logfile path may not exist anymore.\ntypedef uint32_t (RENDERDOC_CC *pRENDERDOC_GetCapture)(uint32_t idx, char *logfile, uint32_t *pathlength, uint64_t *timestamp);\n\n// capture the next frame on whichever window and API is currently considered active\ntypedef void (RENDERDOC_CC *pRENDERDOC_TriggerCapture)();\n\n// returns 1 if the RenderDoc UI is connected to this application, 0 otherwise\ntypedef uint32_t (RENDERDOC_CC *pRENDERDOC_IsRemoteAccessConnected)();\n\n// This function will launch the Replay UI associated with the RenderDoc library injected\n// into the running application.\n//\n// if connectRemoteAccess is 1, the Replay UI will be launched with a command line parameter\n// to connect to this application\n// cmdline is the rest of the command line, as a UTF-8 string. E.g. a captures to open\n// if cmdline is NULL, the command line will be empty.\n//\n// returns the PID of the replay UI if successful, 0 if not successful.\ntypedef uint32_t (RENDERDOC_CC *pRENDERDOC_LaunchReplayUI)(uint32_t connectRemoteAccess, const char *cmdline);\n\n// RenderDoc can return a higher version than requested if it's backwards compatible,\n// this function returns the actual version returned. If a parameter is NULL, it will be\n// ignored and the others will be filled out.\ntypedef void (RENDERDOC_CC *pRENDERDOC_GetAPIVersion)(int *major, int *minor, int *patch);\n\n//////////////////////////////////////////////////////////////////////////\n// Capturing functions\n//\n\n// A device pointer is a pointer to the API's root handle.\n//\n// This would be an ID3D11Device, HGLRC/GLXContext, ID3D12Device, etc\ntypedef void* RENDERDOC_DevicePointer;\n\n// A window handle is the OS's native window handle\n//\n// This would be an HWND, GLXDrawable, etc\ntypedef void* RENDERDOC_WindowHandle;\n\n// This sets the RenderDoc in-app overlay in the API/window pair as 'active' and it will\n// respond to keypresses. Neither parameter can be NULL\ntypedef void (RENDERDOC_CC *pRENDERDOC_SetActiveWindow)(RENDERDOC_DevicePointer device, RENDERDOC_WindowHandle wndHandle);\n\n// When choosing either a device pointer or a window handle to capture, you can pass NULL.\n// Passing NULL specifies a 'wildcard' match against anything. This allows you to specify\n// any API rendering to a specific window, or a specific API instance rendering to any window,\n// or in the simplest case of one window and one API, you can just pass NULL for both.\n//\n// In either case, if there are two or more possible matching (device,window) pairs it\n// is undefined which one will be captured.\n//\n// Note: for headless rendering you can pass NULL for the window handle and either specify\n// a device pointer or leave it NULL as above.\n\n// Immediately starts capturing API calls on the specified device pointer and window handle.\n//\n// If there is no matching thing to capture (e.g. no supported API has been initialised),\n// this will do nothing.\n//\n// The results are undefined (including crashes) if two captures are started overlapping,\n// even on separate devices and/oror windows.\ntypedef void (RENDERDOC_CC *pRENDERDOC_StartFrameCapture)(RENDERDOC_DevicePointer device, RENDERDOC_WindowHandle wndHandle);\n\n// Returns whether or not a frame capture is currently ongoing anywhere.\n//\n// This will return 1 if a capture is ongoing, and 0 if there is no capture running\ntypedef uint32_t (RENDERDOC_CC *pRENDERDOC_IsFrameCapturing)();\n\n// Ends capturing immediately.\n//\n// This will return 1 if the capture succeeded, and 0 if there was an error capturing.\ntypedef uint32_t (RENDERDOC_CC *pRENDERDOC_EndFrameCapture)(RENDERDOC_DevicePointer device, RENDERDOC_WindowHandle wndHandle);\n\n//////////////////////////////////////////////////////////////////////////////////////////////////\n// RenderDoc API versions\n// \n\n// RenderDoc uses semantic versioning (http://semver.org/).\n// \n// MAJOR version is incremented when incompatible API changes happen.\n// MINOR version is incremented when functionality is added in a backwards-compatible manner.\n// PATCH version is incremented when backwards-compatible bug fixes happen.\n//\n// Note that this means the API returned can be higher than the one you might have requested.\n// e.g. if you are running against a newer RenderDoc that supports 1.0.1, it will be returned\n// instead of 1.0.0. You can check this with the GetAPIVersion entry point\ntypedef enum\n{\n\teRENDERDOC_API_Version_1_0_0 = 10000, // RENDERDOC_API_1_0_0 = 1 00 00\n\teRENDERDOC_API_Version_1_0_1 = 10001, // RENDERDOC_API_1_0_1 = 1 00 01\n} RENDERDOC_Version;\n\n// API version changelog:\n//\n// 1.0.0 - initial release\n// 1.0.1 - Bugfix: IsFrameCapturing() was returning false for captures that were triggered\n//         by keypress or TriggerCapture, instead of Start/EndFrameCapture.\n\n// eRENDERDOC_API_Version_1_0_1\ntypedef struct\n{\n\tpRENDERDOC_GetAPIVersion              GetAPIVersion;\n\n\tpRENDERDOC_SetCaptureOptionU32        SetCaptureOptionU32;\n\tpRENDERDOC_SetCaptureOptionF32        SetCaptureOptionF32;\n\n\tpRENDERDOC_GetCaptureOptionU32        GetCaptureOptionU32;\n\tpRENDERDOC_GetCaptureOptionF32        GetCaptureOptionF32;\n\n\tpRENDERDOC_SetFocusToggleKeys         SetFocusToggleKeys;\n\tpRENDERDOC_SetCaptureKeys             SetCaptureKeys;\n\n\tpRENDERDOC_GetOverlayBits             GetOverlayBits;\n\tpRENDERDOC_MaskOverlayBits            MaskOverlayBits;\n\n\tpRENDERDOC_Shutdown                   Shutdown;\n\tpRENDERDOC_UnloadCrashHandler         UnloadCrashHandler;\n\n\tpRENDERDOC_SetLogFilePathTemplate     SetLogFilePathTemplate;\n\tpRENDERDOC_GetLogFilePathTemplate     GetLogFilePathTemplate;\n\n\tpRENDERDOC_GetNumCaptures             GetNumCaptures;\n\tpRENDERDOC_GetCapture                 GetCapture;\n\n\tpRENDERDOC_TriggerCapture             TriggerCapture;\n\n\tpRENDERDOC_IsRemoteAccessConnected    IsRemoteAccessConnected;\n\tpRENDERDOC_LaunchReplayUI             LaunchReplayUI;\n\n\tpRENDERDOC_SetActiveWindow            SetActiveWindow;\n\n\tpRENDERDOC_StartFrameCapture          StartFrameCapture;\n\tpRENDERDOC_IsFrameCapturing           IsFrameCapturing;\n\tpRENDERDOC_EndFrameCapture            EndFrameCapture;\n} RENDERDOC_API_1_0_1;\n\ntypedef RENDERDOC_API_1_0_1 RENDERDOC_API_1_0_0;\n\n//////////////////////////////////////////////////////////////////////////////////////////////////\n// RenderDoc API entry point\n// \n// This entry point can be obtained via GetProcAddress/dlsym if RenderDoc is available.\n// \n// The name is the same as the typedef - \"RENDERDOC_GetAPI\"\n//\n// This function is not thread safe, and should not be called on multiple threads at once.\n// Ideally, call this once as early as possible in your application's startup, before doing\n// any API work, since some configuration functionality etc has to be done also before\n// initialising any APIs.\n//\n// Parameters:\n//   version is a single value from the RENDERDOC_Version above.\n//\n//   outAPIPointers will be filled out with a pointer to the corresponding struct of function\n//   pointers.\n//\n// Returns:\n//   1 - if the outAPIPointers has been filled with a pointer to the API struct requested\n//   0 - if the requested version is not supported or the arguments are invalid.\n//\ntypedef int (RENDERDOC_CC *pRENDERDOC_GetAPI)(RENDERDOC_Version version, void **outAPIPointers);\n\n#ifdef __cplusplus\n}  // extern \"C\"\n#endif\n"
  },
  {
    "path": "third_party/snappy.lua",
    "content": "group(\"third_party\")\nproject(\"snappy\")\n  uuid(\"bb143d61-3fd4-44c2-8b7e-04cc538ba2c7\")\n  kind(\"StaticLib\")\n  language(\"C++\")\n\n  defines({\n    \"_LIB\",\n  })\n  files({\n    \"snappy/snappy-internal.h\",\n    \"snappy/snappy-sinksource.cc\",\n    \"snappy/snappy-sinksource.h\",\n    \"snappy/snappy-stubs-internal.cc\",\n    \"snappy/snappy-stubs-internal.h\",\n    \"snappy/snappy-stubs-public.h\",\n    \"snappy/snappy.cc\",\n    \"snappy/snappy.h\",\n  })\n\n  filter(\"platforms:Windows\")\n    warnings(\"Off\")  -- Too many warnings.\n"
  },
  {
    "path": "third_party/stb/stb_image.h",
    "content": "/* stb_image - v2.08 - public domain image loader - http://nothings.org/stb_image.h\n                                     no warranty implied; use at your own risk\n\n   Do this:\n      #define STB_IMAGE_IMPLEMENTATION\n   before you include this file in *one* C or C++ file to create the implementation.\n\n   // i.e. it should look like this:\n   #include ...\n   #include ...\n   #include ...\n   #define STB_IMAGE_IMPLEMENTATION\n   #include \"stb_image.h\"\n\n   You can #define STBI_ASSERT(x) before the #include to avoid using assert.h.\n   And #define STBI_MALLOC, STBI_REALLOC, and STBI_FREE to avoid using malloc,realloc,free\n\n\n   QUICK NOTES:\n      Primarily of interest to game developers and other people who can\n          avoid problematic images and only need the trivial interface\n\n      JPEG baseline & progressive (12 bpc/arithmetic not supported, same as stock IJG lib)\n      PNG 1/2/4/8-bit-per-channel (16 bpc not supported)\n\n      TGA (not sure what subset, if a subset)\n      BMP non-1bpp, non-RLE\n      PSD (composited view only, no extra channels, 8/16 bit-per-channel)\n\n      GIF (*comp always reports as 4-channel)\n      HDR (radiance rgbE format)\n      PIC (Softimage PIC)\n      PNM (PPM and PGM binary only)\n\n      Animated GIF still needs a proper API, but here's one way to do it:\n          http://gist.github.com/urraka/685d9a6340b26b830d49\n\n      - decode from memory or through FILE (define STBI_NO_STDIO to remove code)\n      - decode from arbitrary I/O callbacks\n      - SIMD acceleration on x86/x64 (SSE2) and ARM (NEON)\n\n   Full documentation under \"DOCUMENTATION\" below.\n\n\n   Revision 2.00 release notes:\n\n      - Progressive JPEG is now supported.\n\n      - PPM and PGM binary formats are now supported, thanks to Ken Miller.\n\n      - x86 platforms now make use of SSE2 SIMD instructions for\n        JPEG decoding, and ARM platforms can use NEON SIMD if requested.\n        This work was done by Fabian \"ryg\" Giesen. SSE2 is used by\n        default, but NEON must be enabled explicitly; see docs.\n\n        With other JPEG optimizations included in this version, we see\n        2x speedup on a JPEG on an x86 machine, and a 1.5x speedup\n        on a JPEG on an ARM machine, relative to previous versions of this\n        library. The same results will not obtain for all JPGs and for all\n        x86/ARM machines. (Note that progressive JPEGs are significantly\n        slower to decode than regular JPEGs.) This doesn't mean that this\n        is the fastest JPEG decoder in the land; rather, it brings it\n        closer to parity with standard libraries. If you want the fastest\n        decode, look elsewhere. (See \"Philosophy\" section of docs below.)\n\n        See final bullet items below for more info on SIMD.\n\n      - Added STBI_MALLOC, STBI_REALLOC, and STBI_FREE macros for replacing\n        the memory allocator. Unlike other STBI libraries, these macros don't\n        support a context parameter, so if you need to pass a context in to\n        the allocator, you'll have to store it in a global or a thread-local\n        variable.\n\n      - Split existing STBI_NO_HDR flag into two flags, STBI_NO_HDR and\n        STBI_NO_LINEAR.\n            STBI_NO_HDR:     suppress implementation of .hdr reader format\n            STBI_NO_LINEAR:  suppress high-dynamic-range light-linear float API\n\n      - You can suppress implementation of any of the decoders to reduce\n        your code footprint by #defining one or more of the following\n        symbols before creating the implementation.\n\n            STBI_NO_JPEG\n            STBI_NO_PNG\n            STBI_NO_BMP\n            STBI_NO_PSD\n            STBI_NO_TGA\n            STBI_NO_GIF\n            STBI_NO_HDR\n            STBI_NO_PIC\n            STBI_NO_PNM   (.ppm and .pgm)\n\n      - You can request *only* certain decoders and suppress all other ones\n        (this will be more forward-compatible, as addition of new decoders\n        doesn't require you to disable them explicitly):\n\n            STBI_ONLY_JPEG\n            STBI_ONLY_PNG\n            STBI_ONLY_BMP\n            STBI_ONLY_PSD\n            STBI_ONLY_TGA\n            STBI_ONLY_GIF\n            STBI_ONLY_HDR\n            STBI_ONLY_PIC\n            STBI_ONLY_PNM   (.ppm and .pgm)\n\n         Note that you can define multiples of these, and you will get all\n         of them (\"only x\" and \"only y\" is interpreted to mean \"only x&y\").\n\n       - If you use STBI_NO_PNG (or _ONLY_ without PNG), and you still\n         want the zlib decoder to be available, #define STBI_SUPPORT_ZLIB\n\n      - Compilation of all SIMD code can be suppressed with\n            #define STBI_NO_SIMD\n        It should not be necessary to disable SIMD unless you have issues\n        compiling (e.g. using an x86 compiler which doesn't support SSE\n        intrinsics or that doesn't support the method used to detect\n        SSE2 support at run-time), and even those can be reported as\n        bugs so I can refine the built-in compile-time checking to be\n        smarter.\n\n      - The old STBI_SIMD system which allowed installing a user-defined\n        IDCT etc. has been removed. If you need this, don't upgrade. My\n        assumption is that almost nobody was doing this, and those who\n        were will find the built-in SIMD more satisfactory anyway.\n\n      - RGB values computed for JPEG images are slightly different from\n        previous versions of stb_image. (This is due to using less\n        integer precision in SIMD.) The C code has been adjusted so\n        that the same RGB values will be computed regardless of whether\n        SIMD support is available, so your app should always produce\n        consistent results. But these results are slightly different from\n        previous versions. (Specifically, about 3% of available YCbCr values\n        will compute different RGB results from pre-1.49 versions by +-1;\n        most of the deviating values are one smaller in the G channel.)\n\n      - If you must produce consistent results with previous versions of\n        stb_image, #define STBI_JPEG_OLD and you will get the same results\n        you used to; however, you will not get the SIMD speedups for\n        the YCbCr-to-RGB conversion step (although you should still see\n        significant JPEG speedup from the other changes).\n\n        Please note that STBI_JPEG_OLD is a temporary feature; it will be\n        removed in future versions of the library. It is only intended for\n        near-term back-compatibility use.\n\n\n   Latest revision history:\n      2.08  (2015-09-13) fix to 2.07 cleanup, reading RGB PSD as RGBA\n      2.07  (2015-09-13) partial animated GIF support\n                         limited 16-bit PSD support\n                         minor bugs, code cleanup, and compiler warnings\n      2.06  (2015-04-19) fix bug where PSD returns wrong '*comp' value\n      2.05  (2015-04-19) fix bug in progressive JPEG handling, fix warning\n      2.04  (2015-04-15) try to re-enable SIMD on MinGW 64-bit\n      2.03  (2015-04-12) additional corruption checking\n                         stbi_set_flip_vertically_on_load\n                         fix NEON support; fix mingw support\n      2.02  (2015-01-19) fix incorrect assert, fix warning\n      2.01  (2015-01-17) fix various warnings\n      2.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG\n      2.00  (2014-12-25) optimize JPEG, including x86 SSE2 & ARM NEON SIMD\n                         progressive JPEG\n                         PGM/PPM support\n                         STBI_MALLOC,STBI_REALLOC,STBI_FREE\n                         STBI_NO_*, STBI_ONLY_*\n                         GIF bugfix\n      1.48  (2014-12-14) fix incorrectly-named assert()\n      1.47  (2014-12-14) 1/2/4-bit PNG support (both grayscale and paletted)\n                         optimize PNG\n                         fix bug in interlaced PNG with user-specified channel count\n\n   See end of file for full revision history.\n\n\n ============================    Contributors    =========================\n\n Image formats                                Bug fixes & warning fixes\n    Sean Barrett (jpeg, png, bmp)                Marc LeBlanc\n    Nicolas Schulz (hdr, psd)                    Christpher Lloyd\n    Jonathan Dummer (tga)                        Dave Moore\n    Jean-Marc Lienher (gif)                      Won Chun\n    Tom Seddon (pic)                             the Horde3D community\n    Thatcher Ulrich (psd)                        Janez Zemva\n    Ken Miller (pgm, ppm)                        Jonathan Blow\n    urraka@github (animated gif)                 Laurent Gomila\n                                                 Aruelien Pocheville\n                                                 Ryamond Barbiero\n                                                 David Woo\n Extensions, features                            Martin Golini\n    Jetro Lauha (stbi_info)                      Roy Eltham\n    Martin \"SpartanJ\" Golini (stbi_info)         Luke Graham\n    James \"moose2000\" Brown (iPhone PNG)         Thomas Ruf\n    Ben \"Disch\" Wenger (io callbacks)            John Bartholomew\n    Omar Cornut (1/2/4-bit PNG)                  Ken Hamada\n    Nicolas Guillemot (vertical flip)            Cort Stratton\n    Richard Mitton (16-bit PSD)                  Blazej Dariusz Roszkowski\n                                                 Thibault Reuille\n                                                 Paul Du Bois\n                                                 Guillaume George\n                                                 Jerry Jansson\n                                                 Hayaki Saito\n                                                 Johan Duparc\n                                                 Ronny Chevalier\n Optimizations & bugfixes                        Michal Cichon\n    Fabian \"ryg\" Giesen                          Tero Hanninen\n    Arseny Kapoulkine                            Sergio Gonzalez\n                                                 Cass Everitt\n                                                 Engin Manap\n  If your name should be here but                Martins Mozeiko\n  isn't, let Sean know.                          Joseph Thomson\n                                                 Phil Jordan\n                                                 Nathan Reed\n                                                 Michaelangel007@github\n                                                 Nick Verigakis\n\nLICENSE\n\nThis software is in the public domain. Where that dedication is not\nrecognized, you are granted a perpetual, irrevocable license to copy,\ndistribute, and modify this file as you see fit.\n\n*/\n\n#ifndef STBI_INCLUDE_STB_IMAGE_H\n#define STBI_INCLUDE_STB_IMAGE_H\n\n// DOCUMENTATION\n//\n// Limitations:\n//    - no 16-bit-per-channel PNG\n//    - no 12-bit-per-channel JPEG\n//    - no JPEGs with arithmetic coding\n//    - no 1-bit BMP\n//    - GIF always returns *comp=4\n//\n// Basic usage (see HDR discussion below for HDR usage):\n//    int x,y,n;\n//    unsigned char *data = stbi_load(filename, &x, &y, &n, 0);\n//    // ... process data if not NULL ...\n//    // ... x = width, y = height, n = # 8-bit components per pixel ...\n//    // ... replace '0' with '1'..'4' to force that many components per pixel\n//    // ... but 'n' will always be the number that it would have been if you said 0\n//    stbi_image_free(data)\n//\n// Standard parameters:\n//    int *x       -- outputs image width in pixels\n//    int *y       -- outputs image height in pixels\n//    int *comp    -- outputs # of image components in image file\n//    int req_comp -- if non-zero, # of image components requested in result\n//\n// The return value from an image loader is an 'unsigned char *' which points\n// to the pixel data, or NULL on an allocation failure or if the image is\n// corrupt or invalid. The pixel data consists of *y scanlines of *x pixels,\n// with each pixel consisting of N interleaved 8-bit components; the first\n// pixel pointed to is top-left-most in the image. There is no padding between\n// image scanlines or between pixels, regardless of format. The number of\n// components N is 'req_comp' if req_comp is non-zero, or *comp otherwise.\n// If req_comp is non-zero, *comp has the number of components that _would_\n// have been output otherwise. E.g. if you set req_comp to 4, you will always\n// get RGBA output, but you can check *comp to see if it's trivially opaque\n// because e.g. there were only 3 channels in the source image.\n//\n// An output image with N components has the following components interleaved\n// in this order in each pixel:\n//\n//     N=#comp     components\n//       1           grey\n//       2           grey, alpha\n//       3           red, green, blue\n//       4           red, green, blue, alpha\n//\n// If image loading fails for any reason, the return value will be NULL,\n// and *x, *y, *comp will be unchanged. The function stbi_failure_reason()\n// can be queried for an extremely brief, end-user unfriendly explanation\n// of why the load failed. Define STBI_NO_FAILURE_STRINGS to avoid\n// compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly\n// more user-friendly ones.\n//\n// Paletted PNG, BMP, GIF, and PIC images are automatically depalettized.\n//\n// ===========================================================================\n//\n// Philosophy\n//\n// stb libraries are designed with the following priorities:\n//\n//    1. easy to use\n//    2. easy to maintain\n//    3. good performance\n//\n// Sometimes I let \"good performance\" creep up in priority over \"easy to maintain\",\n// and for best performance I may provide less-easy-to-use APIs that give higher\n// performance, in addition to the easy to use ones. Nevertheless, it's important\n// to keep in mind that from the standpoint of you, a client of this library,\n// all you care about is #1 and #3, and stb libraries do not emphasize #3 above all.\n//\n// Some secondary priorities arise directly from the first two, some of which\n// make more explicit reasons why performance can't be emphasized.\n//\n//    - Portable (\"ease of use\")\n//    - Small footprint (\"easy to maintain\")\n//    - No dependencies (\"ease of use\")\n//\n// ===========================================================================\n//\n// I/O callbacks\n//\n// I/O callbacks allow you to read from arbitrary sources, like packaged\n// files or some other source. Data read from callbacks are processed\n// through a small internal buffer (currently 128 bytes) to try to reduce\n// overhead.\n//\n// The three functions you must define are \"read\" (reads some bytes of data),\n// \"skip\" (skips some bytes of data), \"eof\" (reports if the stream is at the end).\n//\n// ===========================================================================\n//\n// SIMD support\n//\n// The JPEG decoder will try to automatically use SIMD kernels on x86 when\n// supported by the compiler. For ARM Neon support, you must explicitly\n// request it.\n//\n// (The old do-it-yourself SIMD API is no longer supported in the current\n// code.)\n//\n// On x86, SSE2 will automatically be used when available based on a run-time\n// test; if not, the generic C versions are used as a fall-back. On ARM targets,\n// the typical path is to have separate builds for NEON and non-NEON devices\n// (at least this is true for iOS and Android). Therefore, the NEON support is\n// toggled by a build flag: define STBI_NEON to get NEON loops.\n//\n// The output of the JPEG decoder is slightly different from versions where\n// SIMD support was introduced (that is, for versions before 1.49). The\n// difference is only +-1 in the 8-bit RGB channels, and only on a small\n// fraction of pixels. You can force the pre-1.49 behavior by defining\n// STBI_JPEG_OLD, but this will disable some of the SIMD decoding path\n// and hence cost some performance.\n//\n// If for some reason you do not want to use any of SIMD code, or if\n// you have issues compiling it, you can disable it entirely by\n// defining STBI_NO_SIMD.\n//\n// ===========================================================================\n//\n// HDR image support   (disable by defining STBI_NO_HDR)\n//\n// stb_image now supports loading HDR images in general, and currently\n// the Radiance .HDR file format, although the support is provided\n// generically. You can still load any file through the existing interface;\n// if you attempt to load an HDR file, it will be automatically remapped to\n// LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1;\n// both of these constants can be reconfigured through this interface:\n//\n//     stbi_hdr_to_ldr_gamma(2.2f);\n//     stbi_hdr_to_ldr_scale(1.0f);\n//\n// (note, do not use _inverse_ constants; stbi_image will invert them\n// appropriately).\n//\n// Additionally, there is a new, parallel interface for loading files as\n// (linear) floats to preserve the full dynamic range:\n//\n//    float *data = stbi_loadf(filename, &x, &y, &n, 0);\n//\n// If you load LDR images through this interface, those images will\n// be promoted to floating point values, run through the inverse of\n// constants corresponding to the above:\n//\n//     stbi_ldr_to_hdr_scale(1.0f);\n//     stbi_ldr_to_hdr_gamma(2.2f);\n//\n// Finally, given a filename (or an open file or memory block--see header\n// file for details) containing image data, you can query for the \"most\n// appropriate\" interface to use (that is, whether the image is HDR or\n// not), using:\n//\n//     stbi_is_hdr(char *filename);\n//\n// ===========================================================================\n//\n// iPhone PNG support:\n//\n// By default we convert iphone-formatted PNGs back to RGB, even though\n// they are internally encoded differently. You can disable this conversion\n// by by calling stbi_convert_iphone_png_to_rgb(0), in which case\n// you will always just get the native iphone \"format\" through (which\n// is BGR stored in RGB).\n//\n// Call stbi_set_unpremultiply_on_load(1) as well to force a divide per\n// pixel to remove any premultiplied alpha *only* if the image file explicitly\n// says there's premultiplied data (currently only happens in iPhone images,\n// and only if iPhone convert-to-rgb processing is on).\n//\n\n\n#ifndef STBI_NO_STDIO\n#include <stdio.h>\n#endif // STBI_NO_STDIO\n\n#define STBI_VERSION 1\n\nenum\n{\n   STBI_default = 0, // only used for req_comp\n\n   STBI_grey       = 1,\n   STBI_grey_alpha = 2,\n   STBI_rgb        = 3,\n   STBI_rgb_alpha  = 4\n};\n\ntypedef unsigned char stbi_uc;\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifdef STB_IMAGE_STATIC\n#define STBIDEF static\n#else\n#define STBIDEF extern\n#endif\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// PRIMARY API - works on images of any type\n//\n\n//\n// load image by filename, open file, or memory buffer\n//\n\ntypedef struct\n{\n   int      (*read)  (void *user,char *data,int size);   // fill 'data' with 'size' bytes.  return number of bytes actually read\n   void     (*skip)  (void *user,int n);                 // skip the next 'n' bytes, or 'unget' the last -n bytes if negative\n   int      (*eof)   (void *user);                       // returns nonzero if we are at end of file/data\n} stbi_io_callbacks;\n\nSTBIDEF stbi_uc *stbi_load               (char              const *filename,           int *x, int *y, int *comp, int req_comp);\nSTBIDEF stbi_uc *stbi_load_from_memory   (stbi_uc           const *buffer, int len   , int *x, int *y, int *comp, int req_comp);\nSTBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk  , void *user, int *x, int *y, int *comp, int req_comp);\n\n#ifndef STBI_NO_STDIO\nSTBIDEF stbi_uc *stbi_load_from_file  (FILE *f,                  int *x, int *y, int *comp, int req_comp);\n// for stbi_load_from_file, file pointer is left pointing immediately after image\n#endif\n\n#ifndef STBI_NO_LINEAR\n   STBIDEF float *stbi_loadf                 (char const *filename,           int *x, int *y, int *comp, int req_comp);\n   STBIDEF float *stbi_loadf_from_memory     (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);\n   STBIDEF float *stbi_loadf_from_callbacks  (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp);\n\n   #ifndef STBI_NO_STDIO\n   STBIDEF float *stbi_loadf_from_file  (FILE *f,                int *x, int *y, int *comp, int req_comp);\n   #endif\n#endif\n\n#ifndef STBI_NO_HDR\n   STBIDEF void   stbi_hdr_to_ldr_gamma(float gamma);\n   STBIDEF void   stbi_hdr_to_ldr_scale(float scale);\n#endif\n\n#ifndef STBI_NO_LINEAR\n   STBIDEF void   stbi_ldr_to_hdr_gamma(float gamma);\n   STBIDEF void   stbi_ldr_to_hdr_scale(float scale);\n#endif // STBI_NO_HDR\n\n// stbi_is_hdr is always defined, but always returns false if STBI_NO_HDR\nSTBIDEF int    stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user);\nSTBIDEF int    stbi_is_hdr_from_memory(stbi_uc const *buffer, int len);\n#ifndef STBI_NO_STDIO\nSTBIDEF int      stbi_is_hdr          (char const *filename);\nSTBIDEF int      stbi_is_hdr_from_file(FILE *f);\n#endif // STBI_NO_STDIO\n\n\n// get a VERY brief reason for failure\n// NOT THREADSAFE\nSTBIDEF const char *stbi_failure_reason  (void);\n\n// free the loaded image -- this is just free()\nSTBIDEF void     stbi_image_free      (void *retval_from_stbi_load);\n\n// get image dimensions & components without fully decoding\nSTBIDEF int      stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp);\nSTBIDEF int      stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp);\n\n#ifndef STBI_NO_STDIO\nSTBIDEF int      stbi_info            (char const *filename,     int *x, int *y, int *comp);\nSTBIDEF int      stbi_info_from_file  (FILE *f,                  int *x, int *y, int *comp);\n\n#endif\n\n\n\n// for image formats that explicitly notate that they have premultiplied alpha,\n// we just return the colors as stored in the file. set this flag to force\n// unpremultiplication. results are undefined if the unpremultiply overflow.\nSTBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply);\n\n// indicate whether we should process iphone images back to canonical format,\n// or just pass them through \"as-is\"\nSTBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert);\n\n// flip the image vertically, so the first pixel in the output array is the bottom left\nSTBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip);\n\n// ZLIB client - used by PNG, available for other purposes\n\nSTBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen);\nSTBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header);\nSTBIDEF char *stbi_zlib_decode_malloc(const char *buffer, int len, int *outlen);\nSTBIDEF int   stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen);\n\nSTBIDEF char *stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int *outlen);\nSTBIDEF int   stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen);\n\n\n#ifdef __cplusplus\n}\n#endif\n\n//\n//\n////   end header file   /////////////////////////////////////////////////////\n#endif // STBI_INCLUDE_STB_IMAGE_H\n\n#ifdef STB_IMAGE_IMPLEMENTATION\n\n#if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \\\n  || defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \\\n  || defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \\\n  || defined(STBI_ONLY_ZLIB)\n   #ifndef STBI_ONLY_JPEG\n   #define STBI_NO_JPEG\n   #endif\n   #ifndef STBI_ONLY_PNG\n   #define STBI_NO_PNG\n   #endif\n   #ifndef STBI_ONLY_BMP\n   #define STBI_NO_BMP\n   #endif\n   #ifndef STBI_ONLY_PSD\n   #define STBI_NO_PSD\n   #endif\n   #ifndef STBI_ONLY_TGA\n   #define STBI_NO_TGA\n   #endif\n   #ifndef STBI_ONLY_GIF\n   #define STBI_NO_GIF\n   #endif\n   #ifndef STBI_ONLY_HDR\n   #define STBI_NO_HDR\n   #endif\n   #ifndef STBI_ONLY_PIC\n   #define STBI_NO_PIC\n   #endif\n   #ifndef STBI_ONLY_PNM\n   #define STBI_NO_PNM\n   #endif\n#endif\n\n#if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB)\n#define STBI_NO_ZLIB\n#endif\n\n\n#include <stdarg.h>\n#include <stddef.h> // ptrdiff_t on osx\n#include <stdlib.h>\n#include <string.h>\n\n#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR)\n#include <math.h>  // ldexp\n#endif\n\n#ifndef STBI_NO_STDIO\n#include <stdio.h>\n#endif\n\n#ifndef STBI_ASSERT\n#include <assert.h>\n#define STBI_ASSERT(x) assert(x)\n#endif\n\n\n#ifndef _MSC_VER\n   #ifdef __cplusplus\n   #define stbi_inline inline\n   #else\n   #define stbi_inline\n   #endif\n#else\n   #define stbi_inline __forceinline\n#endif\n\n\n#ifdef _MSC_VER\ntypedef unsigned short stbi__uint16;\ntypedef   signed short stbi__int16;\ntypedef unsigned int   stbi__uint32;\ntypedef   signed int   stbi__int32;\n#else\n#include <stdint.h>\ntypedef uint16_t stbi__uint16;\ntypedef int16_t  stbi__int16;\ntypedef uint32_t stbi__uint32;\ntypedef int32_t  stbi__int32;\n#endif\n\n// should produce compiler error if size is wrong\ntypedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1];\n\n#ifdef _MSC_VER\n#define STBI_NOTUSED(v)  (void)(v)\n#else\n#define STBI_NOTUSED(v)  (void)sizeof(v)\n#endif\n\n#ifdef _MSC_VER\n#define STBI_HAS_LROTL\n#endif\n\n#ifdef STBI_HAS_LROTL\n   #define stbi_lrot(x,y)  _lrotl(x,y)\n#else\n   #define stbi_lrot(x,y)  (((x) << (y)) | ((x) >> (32 - (y))))\n#endif\n\n#if defined(STBI_MALLOC) && defined(STBI_FREE) && defined(STBI_REALLOC)\n// ok\n#elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC)\n// ok\n#else\n#error \"Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC.\"\n#endif\n\n#ifndef STBI_MALLOC\n#define STBI_MALLOC(sz)    malloc(sz)\n#define STBI_REALLOC(p,sz) realloc(p,sz)\n#define STBI_FREE(p)       free(p)\n#endif\n\n// x86/x64 detection\n#if defined(__x86_64__) || defined(_M_X64)\n#define STBI__X64_TARGET\n#elif defined(__i386) || defined(_M_IX86)\n#define STBI__X86_TARGET\n#endif\n\n#if defined(__GNUC__) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET)) && !defined(__SSE2__) && !defined(STBI_NO_SIMD)\n// NOTE: not clear do we actually need this for the 64-bit path?\n// gcc doesn't support sse2 intrinsics unless you compile with -msse2,\n// (but compiling with -msse2 allows the compiler to use SSE2 everywhere;\n// this is just broken and gcc are jerks for not fixing it properly\n// http://www.virtualdub.org/blog/pivot/entry.php?id=363 )\n#define STBI_NO_SIMD\n#endif\n\n#if defined(__MINGW32__) && defined(STBI__X86_TARGET) && !defined(STBI_MINGW_ENABLE_SSE2) && !defined(STBI_NO_SIMD)\n// Note that __MINGW32__ doesn't actually mean 32-bit, so we have to avoid STBI__X64_TARGET\n//\n// 32-bit MinGW wants ESP to be 16-byte aligned, but this is not in the\n// Windows ABI and VC++ as well as Windows DLLs don't maintain that invariant.\n// As a result, enabling SSE2 on 32-bit MinGW is dangerous when not\n// simultaneously enabling \"-mstackrealign\".\n//\n// See https://github.com/nothings/stb/issues/81 for more information.\n//\n// So default to no SSE2 on 32-bit MinGW. If you've read this far and added\n// -mstackrealign to your build settings, feel free to #define STBI_MINGW_ENABLE_SSE2.\n#define STBI_NO_SIMD\n#endif\n\n#if !defined(STBI_NO_SIMD) && defined(STBI__X86_TARGET)\n#define STBI_SSE2\n#include <emmintrin.h>\n\n#ifdef _MSC_VER\n\n#if _MSC_VER >= 1400  // not VC6\n#include <intrin.h> // __cpuid\nstatic int stbi__cpuid3(void)\n{\n   int info[4];\n   __cpuid(info,1);\n   return info[3];\n}\n#else\nstatic int stbi__cpuid3(void)\n{\n   int res;\n   __asm {\n      mov  eax,1\n      cpuid\n      mov  res,edx\n   }\n   return res;\n}\n#endif\n\n#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name\n\nstatic int stbi__sse2_available()\n{\n   int info3 = stbi__cpuid3();\n   return ((info3 >> 26) & 1) != 0;\n}\n#else // assume GCC-style if not VC++\n#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16)))\n\nstatic int stbi__sse2_available()\n{\n#if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 // GCC 4.8 or later\n   // GCC 4.8+ has a nice way to do this\n   return __builtin_cpu_supports(\"sse2\");\n#else\n   // portable way to do this, preferably without using GCC inline ASM?\n   // just bail for now.\n   return 0;\n#endif\n}\n#endif\n#endif\n\n// ARM NEON\n#if defined(STBI_NO_SIMD) && defined(STBI_NEON)\n#undef STBI_NEON\n#endif\n\n#ifdef STBI_NEON\n#include <arm_neon.h>\n// assume GCC or Clang on ARM targets\n#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16)))\n#endif\n\n#ifndef STBI_SIMD_ALIGN\n#define STBI_SIMD_ALIGN(type, name) type name\n#endif\n\n///////////////////////////////////////////////\n//\n//  stbi__context struct and start_xxx functions\n\n// stbi__context structure is our basic context used by all images, so it\n// contains all the IO context, plus some basic image information\ntypedef struct\n{\n   stbi__uint32 img_x, img_y;\n   int img_n, img_out_n;\n\n   stbi_io_callbacks io;\n   void *io_user_data;\n\n   int read_from_callbacks;\n   int buflen;\n   stbi_uc buffer_start[128];\n\n   stbi_uc *img_buffer, *img_buffer_end;\n   stbi_uc *img_buffer_original, *img_buffer_original_end;\n} stbi__context;\n\n\nstatic void stbi__refill_buffer(stbi__context *s);\n\n// initialize a memory-decode context\nstatic void stbi__start_mem(stbi__context *s, stbi_uc const *buffer, int len)\n{\n   s->io.read = NULL;\n   s->read_from_callbacks = 0;\n   s->img_buffer = s->img_buffer_original = (stbi_uc *) buffer;\n   s->img_buffer_end = s->img_buffer_original_end = (stbi_uc *) buffer+len;\n}\n\n// initialize a callback-based context\nstatic void stbi__start_callbacks(stbi__context *s, stbi_io_callbacks *c, void *user)\n{\n   s->io = *c;\n   s->io_user_data = user;\n   s->buflen = sizeof(s->buffer_start);\n   s->read_from_callbacks = 1;\n   s->img_buffer_original = s->buffer_start;\n   stbi__refill_buffer(s);\n   s->img_buffer_original_end = s->img_buffer_end;\n}\n\n#ifndef STBI_NO_STDIO\n\nstatic int stbi__stdio_read(void *user, char *data, int size)\n{\n   return (int) fread(data,1,size,(FILE*) user);\n}\n\nstatic void stbi__stdio_skip(void *user, int n)\n{\n   fseek((FILE*) user, n, SEEK_CUR);\n}\n\nstatic int stbi__stdio_eof(void *user)\n{\n   return feof((FILE*) user);\n}\n\nstatic stbi_io_callbacks stbi__stdio_callbacks =\n{\n   stbi__stdio_read,\n   stbi__stdio_skip,\n   stbi__stdio_eof,\n};\n\nstatic void stbi__start_file(stbi__context *s, FILE *f)\n{\n   stbi__start_callbacks(s, &stbi__stdio_callbacks, (void *) f);\n}\n\n//static void stop_file(stbi__context *s) { }\n\n#endif // !STBI_NO_STDIO\n\nstatic void stbi__rewind(stbi__context *s)\n{\n   // conceptually rewind SHOULD rewind to the beginning of the stream,\n   // but we just rewind to the beginning of the initial buffer, because\n   // we only use it after doing 'test', which only ever looks at at most 92 bytes\n   s->img_buffer = s->img_buffer_original;\n   s->img_buffer_end = s->img_buffer_original_end;\n}\n\n#ifndef STBI_NO_JPEG\nstatic int      stbi__jpeg_test(stbi__context *s);\nstatic stbi_uc *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);\nstatic int      stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp);\n#endif\n\n#ifndef STBI_NO_PNG\nstatic int      stbi__png_test(stbi__context *s);\nstatic stbi_uc *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);\nstatic int      stbi__png_info(stbi__context *s, int *x, int *y, int *comp);\n#endif\n\n#ifndef STBI_NO_BMP\nstatic int      stbi__bmp_test(stbi__context *s);\nstatic stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);\nstatic int      stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp);\n#endif\n\n#ifndef STBI_NO_TGA\nstatic int      stbi__tga_test(stbi__context *s);\nstatic stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);\nstatic int      stbi__tga_info(stbi__context *s, int *x, int *y, int *comp);\n#endif\n\n#ifndef STBI_NO_PSD\nstatic int      stbi__psd_test(stbi__context *s);\nstatic stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);\nstatic int      stbi__psd_info(stbi__context *s, int *x, int *y, int *comp);\n#endif\n\n#ifndef STBI_NO_HDR\nstatic int      stbi__hdr_test(stbi__context *s);\nstatic float   *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);\nstatic int      stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp);\n#endif\n\n#ifndef STBI_NO_PIC\nstatic int      stbi__pic_test(stbi__context *s);\nstatic stbi_uc *stbi__pic_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);\nstatic int      stbi__pic_info(stbi__context *s, int *x, int *y, int *comp);\n#endif\n\n#ifndef STBI_NO_GIF\nstatic int      stbi__gif_test(stbi__context *s);\nstatic stbi_uc *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);\nstatic int      stbi__gif_info(stbi__context *s, int *x, int *y, int *comp);\n#endif\n\n#ifndef STBI_NO_PNM\nstatic int      stbi__pnm_test(stbi__context *s);\nstatic stbi_uc *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);\nstatic int      stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp);\n#endif\n\n// this is not threadsafe\nstatic const char *stbi__g_failure_reason;\n\nSTBIDEF const char *stbi_failure_reason(void)\n{\n   return stbi__g_failure_reason;\n}\n\nstatic int stbi__err(const char *str)\n{\n   stbi__g_failure_reason = str;\n   return 0;\n}\n\nstatic void *stbi__malloc(size_t size)\n{\n    return STBI_MALLOC(size);\n}\n\n// stbi__err - error\n// stbi__errpf - error returning pointer to float\n// stbi__errpuc - error returning pointer to unsigned char\n\n#ifdef STBI_NO_FAILURE_STRINGS\n   #define stbi__err(x,y)  0\n#elif defined(STBI_FAILURE_USERMSG)\n   #define stbi__err(x,y)  stbi__err(y)\n#else\n   #define stbi__err(x,y)  stbi__err(x)\n#endif\n\n#define stbi__errpf(x,y)   ((float *)(size_t) (stbi__err(x,y)?NULL:NULL))\n#define stbi__errpuc(x,y)  ((unsigned char *)(size_t) (stbi__err(x,y)?NULL:NULL))\n\nSTBIDEF void stbi_image_free(void *retval_from_stbi_load)\n{\n   STBI_FREE(retval_from_stbi_load);\n}\n\n#ifndef STBI_NO_LINEAR\nstatic float   *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp);\n#endif\n\n#ifndef STBI_NO_HDR\nstatic stbi_uc *stbi__hdr_to_ldr(float   *data, int x, int y, int comp);\n#endif\n\nstatic int stbi__vertically_flip_on_load = 0;\n\nSTBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip)\n{\n    stbi__vertically_flip_on_load = flag_true_if_should_flip;\n}\n\nstatic unsigned char *stbi__load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp)\n{\n   #ifndef STBI_NO_JPEG\n   if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp);\n   #endif\n   #ifndef STBI_NO_PNG\n   if (stbi__png_test(s))  return stbi__png_load(s,x,y,comp,req_comp);\n   #endif\n   #ifndef STBI_NO_BMP\n   if (stbi__bmp_test(s))  return stbi__bmp_load(s,x,y,comp,req_comp);\n   #endif\n   #ifndef STBI_NO_GIF\n   if (stbi__gif_test(s))  return stbi__gif_load(s,x,y,comp,req_comp);\n   #endif\n   #ifndef STBI_NO_PSD\n   if (stbi__psd_test(s))  return stbi__psd_load(s,x,y,comp,req_comp);\n   #endif\n   #ifndef STBI_NO_PIC\n   if (stbi__pic_test(s))  return stbi__pic_load(s,x,y,comp,req_comp);\n   #endif\n   #ifndef STBI_NO_PNM\n   if (stbi__pnm_test(s))  return stbi__pnm_load(s,x,y,comp,req_comp);\n   #endif\n\n   #ifndef STBI_NO_HDR\n   if (stbi__hdr_test(s)) {\n      float *hdr = stbi__hdr_load(s, x,y,comp,req_comp);\n      return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp);\n   }\n   #endif\n\n   #ifndef STBI_NO_TGA\n   // test tga last because it's a crappy test!\n   if (stbi__tga_test(s))\n      return stbi__tga_load(s,x,y,comp,req_comp);\n   #endif\n\n   return stbi__errpuc(\"unknown image type\", \"Image not of any known type, or corrupt\");\n}\n\nstatic unsigned char *stbi__load_flip(stbi__context *s, int *x, int *y, int *comp, int req_comp)\n{\n   unsigned char *result = stbi__load_main(s, x, y, comp, req_comp);\n\n   if (stbi__vertically_flip_on_load && result != NULL) {\n      int w = *x, h = *y;\n      int depth = req_comp ? req_comp : *comp;\n      int row,col,z;\n      stbi_uc temp;\n\n      // @OPTIMIZE: use a bigger temp buffer and memcpy multiple pixels at once\n      for (row = 0; row < (h>>1); row++) {\n         for (col = 0; col < w; col++) {\n            for (z = 0; z < depth; z++) {\n               temp = result[(row * w + col) * depth + z];\n               result[(row * w + col) * depth + z] = result[((h - row - 1) * w + col) * depth + z];\n               result[((h - row - 1) * w + col) * depth + z] = temp;\n            }\n         }\n      }\n   }\n\n   return result;\n}\n\n#ifndef STBI_NO_HDR\nstatic void stbi__float_postprocess(float *result, int *x, int *y, int *comp, int req_comp)\n{\n   if (stbi__vertically_flip_on_load && result != NULL) {\n      int w = *x, h = *y;\n      int depth = req_comp ? req_comp : *comp;\n      int row,col,z;\n      float temp;\n\n      // @OPTIMIZE: use a bigger temp buffer and memcpy multiple pixels at once\n      for (row = 0; row < (h>>1); row++) {\n         for (col = 0; col < w; col++) {\n            for (z = 0; z < depth; z++) {\n               temp = result[(row * w + col) * depth + z];\n               result[(row * w + col) * depth + z] = result[((h - row - 1) * w + col) * depth + z];\n               result[((h - row - 1) * w + col) * depth + z] = temp;\n            }\n         }\n      }\n   }\n}\n#endif\n\n#ifndef STBI_NO_STDIO\n\nstatic FILE *stbi__fopen(char const *filename, char const *mode)\n{\n   FILE *f;\n#if defined(_MSC_VER) && _MSC_VER >= 1400\n   if (0 != fopen_s(&f, filename, mode))\n      f=0;\n#else\n   f = fopen(filename, mode);\n#endif\n   return f;\n}\n\n\nSTBIDEF stbi_uc *stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp)\n{\n   FILE *f = stbi__fopen(filename, \"rb\");\n   unsigned char *result;\n   if (!f) return stbi__errpuc(\"can't fopen\", \"Unable to open file\");\n   result = stbi_load_from_file(f,x,y,comp,req_comp);\n   fclose(f);\n   return result;\n}\n\nSTBIDEF stbi_uc *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)\n{\n   unsigned char *result;\n   stbi__context s;\n   stbi__start_file(&s,f);\n   result = stbi__load_flip(&s,x,y,comp,req_comp);\n   if (result) {\n      // need to 'unget' all the characters in the IO buffer\n      fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR);\n   }\n   return result;\n}\n#endif //!STBI_NO_STDIO\n\nSTBIDEF stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)\n{\n   stbi__context s;\n   stbi__start_mem(&s,buffer,len);\n   return stbi__load_flip(&s,x,y,comp,req_comp);\n}\n\nSTBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp)\n{\n   stbi__context s;\n   stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user);\n   return stbi__load_flip(&s,x,y,comp,req_comp);\n}\n\n#ifndef STBI_NO_LINEAR\nstatic float *stbi__loadf_main(stbi__context *s, int *x, int *y, int *comp, int req_comp)\n{\n   unsigned char *data;\n   #ifndef STBI_NO_HDR\n   if (stbi__hdr_test(s)) {\n      float *hdr_data = stbi__hdr_load(s,x,y,comp,req_comp);\n      if (hdr_data)\n         stbi__float_postprocess(hdr_data,x,y,comp,req_comp);\n      return hdr_data;\n   }\n   #endif\n   data = stbi__load_flip(s, x, y, comp, req_comp);\n   if (data)\n      return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp);\n   return stbi__errpf(\"unknown image type\", \"Image not of any known type, or corrupt\");\n}\n\nSTBIDEF float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)\n{\n   stbi__context s;\n   stbi__start_mem(&s,buffer,len);\n   return stbi__loadf_main(&s,x,y,comp,req_comp);\n}\n\nSTBIDEF float *stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp)\n{\n   stbi__context s;\n   stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user);\n   return stbi__loadf_main(&s,x,y,comp,req_comp);\n}\n\n#ifndef STBI_NO_STDIO\nSTBIDEF float *stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp)\n{\n   float *result;\n   FILE *f = stbi__fopen(filename, \"rb\");\n   if (!f) return stbi__errpf(\"can't fopen\", \"Unable to open file\");\n   result = stbi_loadf_from_file(f,x,y,comp,req_comp);\n   fclose(f);\n   return result;\n}\n\nSTBIDEF float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)\n{\n   stbi__context s;\n   stbi__start_file(&s,f);\n   return stbi__loadf_main(&s,x,y,comp,req_comp);\n}\n#endif // !STBI_NO_STDIO\n\n#endif // !STBI_NO_LINEAR\n\n// these is-hdr-or-not is defined independent of whether STBI_NO_LINEAR is\n// defined, for API simplicity; if STBI_NO_LINEAR is defined, it always\n// reports false!\n\nSTBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len)\n{\n   #ifndef STBI_NO_HDR\n   stbi__context s;\n   stbi__start_mem(&s,buffer,len);\n   return stbi__hdr_test(&s);\n   #else\n   STBI_NOTUSED(buffer);\n   STBI_NOTUSED(len);\n   return 0;\n   #endif\n}\n\n#ifndef STBI_NO_STDIO\nSTBIDEF int      stbi_is_hdr          (char const *filename)\n{\n   FILE *f = stbi__fopen(filename, \"rb\");\n   int result=0;\n   if (f) {\n      result = stbi_is_hdr_from_file(f);\n      fclose(f);\n   }\n   return result;\n}\n\nSTBIDEF int      stbi_is_hdr_from_file(FILE *f)\n{\n   #ifndef STBI_NO_HDR\n   stbi__context s;\n   stbi__start_file(&s,f);\n   return stbi__hdr_test(&s);\n   #else\n   STBI_NOTUSED(f);\n   return 0;\n   #endif\n}\n#endif // !STBI_NO_STDIO\n\nSTBIDEF int      stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user)\n{\n   #ifndef STBI_NO_HDR\n   stbi__context s;\n   stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user);\n   return stbi__hdr_test(&s);\n   #else\n   STBI_NOTUSED(clbk);\n   STBI_NOTUSED(user);\n   return 0;\n   #endif\n}\n\nstatic float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f;\nstatic float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f;\n\n#ifndef STBI_NO_LINEAR\nSTBIDEF void   stbi_ldr_to_hdr_gamma(float gamma) { stbi__l2h_gamma = gamma; }\nSTBIDEF void   stbi_ldr_to_hdr_scale(float scale) { stbi__l2h_scale = scale; }\n#endif\n\nSTBIDEF void   stbi_hdr_to_ldr_gamma(float gamma) { stbi__h2l_gamma_i = 1/gamma; }\nSTBIDEF void   stbi_hdr_to_ldr_scale(float scale) { stbi__h2l_scale_i = 1/scale; }\n\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// Common code used by all image loaders\n//\n\nenum\n{\n   STBI__SCAN_load=0,\n   STBI__SCAN_type,\n   STBI__SCAN_header\n};\n\nstatic void stbi__refill_buffer(stbi__context *s)\n{\n   int n = (s->io.read)(s->io_user_data,(char*)s->buffer_start,s->buflen);\n   if (n == 0) {\n      // at end of file, treat same as if from memory, but need to handle case\n      // where s->img_buffer isn't pointing to safe memory, e.g. 0-byte file\n      s->read_from_callbacks = 0;\n      s->img_buffer = s->buffer_start;\n      s->img_buffer_end = s->buffer_start+1;\n      *s->img_buffer = 0;\n   } else {\n      s->img_buffer = s->buffer_start;\n      s->img_buffer_end = s->buffer_start + n;\n   }\n}\n\nstbi_inline static stbi_uc stbi__get8(stbi__context *s)\n{\n   if (s->img_buffer < s->img_buffer_end)\n      return *s->img_buffer++;\n   if (s->read_from_callbacks) {\n      stbi__refill_buffer(s);\n      return *s->img_buffer++;\n   }\n   return 0;\n}\n\nstbi_inline static int stbi__at_eof(stbi__context *s)\n{\n   if (s->io.read) {\n      if (!(s->io.eof)(s->io_user_data)) return 0;\n      // if feof() is true, check if buffer = end\n      // special case: we've only got the special 0 character at the end\n      if (s->read_from_callbacks == 0) return 1;\n   }\n\n   return s->img_buffer >= s->img_buffer_end;\n}\n\nstatic void stbi__skip(stbi__context *s, int n)\n{\n   if (n < 0) {\n      s->img_buffer = s->img_buffer_end;\n      return;\n   }\n   if (s->io.read) {\n      int blen = (int) (s->img_buffer_end - s->img_buffer);\n      if (blen < n) {\n         s->img_buffer = s->img_buffer_end;\n         (s->io.skip)(s->io_user_data, n - blen);\n         return;\n      }\n   }\n   s->img_buffer += n;\n}\n\nstatic int stbi__getn(stbi__context *s, stbi_uc *buffer, int n)\n{\n   if (s->io.read) {\n      int blen = (int) (s->img_buffer_end - s->img_buffer);\n      if (blen < n) {\n         int res, count;\n\n         memcpy(buffer, s->img_buffer, blen);\n\n         count = (s->io.read)(s->io_user_data, (char*) buffer + blen, n - blen);\n         res = (count == (n-blen));\n         s->img_buffer = s->img_buffer_end;\n         return res;\n      }\n   }\n\n   if (s->img_buffer+n <= s->img_buffer_end) {\n      memcpy(buffer, s->img_buffer, n);\n      s->img_buffer += n;\n      return 1;\n   } else\n      return 0;\n}\n\nstatic int stbi__get16be(stbi__context *s)\n{\n   int z = stbi__get8(s);\n   return (z << 8) + stbi__get8(s);\n}\n\nstatic stbi__uint32 stbi__get32be(stbi__context *s)\n{\n   stbi__uint32 z = stbi__get16be(s);\n   return (z << 16) + stbi__get16be(s);\n}\n\n#if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF)\n// nothing\n#else\nstatic int stbi__get16le(stbi__context *s)\n{\n   int z = stbi__get8(s);\n   return z + (stbi__get8(s) << 8);\n}\n#endif\n\n#ifndef STBI_NO_BMP\nstatic stbi__uint32 stbi__get32le(stbi__context *s)\n{\n   stbi__uint32 z = stbi__get16le(s);\n   return z + (stbi__get16le(s) << 16);\n}\n#endif\n\n#define STBI__BYTECAST(x)  ((stbi_uc) ((x) & 255))  // truncate int to byte without warnings\n\n\n//////////////////////////////////////////////////////////////////////////////\n//\n//  generic converter from built-in img_n to req_comp\n//    individual types do this automatically as much as possible (e.g. jpeg\n//    does all cases internally since it needs to colorspace convert anyway,\n//    and it never has alpha, so very few cases ). png can automatically\n//    interleave an alpha=255 channel, but falls back to this for other cases\n//\n//  assume data buffer is malloced, so malloc a new one and free that one\n//  only failure mode is malloc failing\n\nstatic stbi_uc stbi__compute_y(int r, int g, int b)\n{\n   return (stbi_uc) (((r*77) + (g*150) +  (29*b)) >> 8);\n}\n\nstatic unsigned char *stbi__convert_format(unsigned char *data, int img_n, int req_comp, unsigned int x, unsigned int y)\n{\n   int i,j;\n   unsigned char *good;\n\n   if (req_comp == img_n) return data;\n   STBI_ASSERT(req_comp >= 1 && req_comp <= 4);\n\n   good = (unsigned char *) stbi__malloc(req_comp * x * y);\n   if (good == NULL) {\n      STBI_FREE(data);\n      return stbi__errpuc(\"outofmem\", \"Out of memory\");\n   }\n\n   for (j=0; j < (int) y; ++j) {\n      unsigned char *src  = data + j * x * img_n   ;\n      unsigned char *dest = good + j * x * req_comp;\n\n      #define COMBO(a,b)  ((a)*8+(b))\n      #define CASE(a,b)   case COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b)\n      // convert source image with img_n components to one with req_comp components;\n      // avoid switch per pixel, so use switch per scanline and massive macros\n      switch (COMBO(img_n, req_comp)) {\n         CASE(1,2) dest[0]=src[0], dest[1]=255; break;\n         CASE(1,3) dest[0]=dest[1]=dest[2]=src[0]; break;\n         CASE(1,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=255; break;\n         CASE(2,1) dest[0]=src[0]; break;\n         CASE(2,3) dest[0]=dest[1]=dest[2]=src[0]; break;\n         CASE(2,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; break;\n         CASE(3,4) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=255; break;\n         CASE(3,1) dest[0]=stbi__compute_y(src[0],src[1],src[2]); break;\n         CASE(3,2) dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = 255; break;\n         CASE(4,1) dest[0]=stbi__compute_y(src[0],src[1],src[2]); break;\n         CASE(4,2) dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = src[3]; break;\n         CASE(4,3) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; break;\n         default: STBI_ASSERT(0);\n      }\n      #undef CASE\n   }\n\n   STBI_FREE(data);\n   return good;\n}\n\n#ifndef STBI_NO_LINEAR\nstatic float   *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp)\n{\n   int i,k,n;\n   float *output = (float *) stbi__malloc(x * y * comp * sizeof(float));\n   if (output == NULL) { STBI_FREE(data); return stbi__errpf(\"outofmem\", \"Out of memory\"); }\n   // compute number of non-alpha components\n   if (comp & 1) n = comp; else n = comp-1;\n   for (i=0; i < x*y; ++i) {\n      for (k=0; k < n; ++k) {\n         output[i*comp + k] = (float) (pow(data[i*comp+k]/255.0f, stbi__l2h_gamma) * stbi__l2h_scale);\n      }\n      if (k < comp) output[i*comp + k] = data[i*comp+k]/255.0f;\n   }\n   STBI_FREE(data);\n   return output;\n}\n#endif\n\n#ifndef STBI_NO_HDR\n#define stbi__float2int(x)   ((int) (x))\nstatic stbi_uc *stbi__hdr_to_ldr(float   *data, int x, int y, int comp)\n{\n   int i,k,n;\n   stbi_uc *output = (stbi_uc *) stbi__malloc(x * y * comp);\n   if (output == NULL) { STBI_FREE(data); return stbi__errpuc(\"outofmem\", \"Out of memory\"); }\n   // compute number of non-alpha components\n   if (comp & 1) n = comp; else n = comp-1;\n   for (i=0; i < x*y; ++i) {\n      for (k=0; k < n; ++k) {\n         float z = (float) pow(data[i*comp+k]*stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f;\n         if (z < 0) z = 0;\n         if (z > 255) z = 255;\n         output[i*comp + k] = (stbi_uc) stbi__float2int(z);\n      }\n      if (k < comp) {\n         float z = data[i*comp+k] * 255 + 0.5f;\n         if (z < 0) z = 0;\n         if (z > 255) z = 255;\n         output[i*comp + k] = (stbi_uc) stbi__float2int(z);\n      }\n   }\n   STBI_FREE(data);\n   return output;\n}\n#endif\n\n//////////////////////////////////////////////////////////////////////////////\n//\n//  \"baseline\" JPEG/JFIF decoder\n//\n//    simple implementation\n//      - doesn't support delayed output of y-dimension\n//      - simple interface (only one output format: 8-bit interleaved RGB)\n//      - doesn't try to recover corrupt jpegs\n//      - doesn't allow partial loading, loading multiple at once\n//      - still fast on x86 (copying globals into locals doesn't help x86)\n//      - allocates lots of intermediate memory (full size of all components)\n//        - non-interleaved case requires this anyway\n//        - allows good upsampling (see next)\n//    high-quality\n//      - upsampled channels are bilinearly interpolated, even across blocks\n//      - quality integer IDCT derived from IJG's 'slow'\n//    performance\n//      - fast huffman; reasonable integer IDCT\n//      - some SIMD kernels for common paths on targets with SSE2/NEON\n//      - uses a lot of intermediate memory, could cache poorly\n\n#ifndef STBI_NO_JPEG\n\n// huffman decoding acceleration\n#define FAST_BITS   9  // larger handles more cases; smaller stomps less cache\n\ntypedef struct\n{\n   stbi_uc  fast[1 << FAST_BITS];\n   // weirdly, repacking this into AoS is a 10% speed loss, instead of a win\n   stbi__uint16 code[256];\n   stbi_uc  values[256];\n   stbi_uc  size[257];\n   unsigned int maxcode[18];\n   int    delta[17];   // old 'firstsymbol' - old 'firstcode'\n} stbi__huffman;\n\ntypedef struct\n{\n   stbi__context *s;\n   stbi__huffman huff_dc[4];\n   stbi__huffman huff_ac[4];\n   stbi_uc dequant[4][64];\n   stbi__int16 fast_ac[4][1 << FAST_BITS];\n\n// sizes for components, interleaved MCUs\n   int img_h_max, img_v_max;\n   int img_mcu_x, img_mcu_y;\n   int img_mcu_w, img_mcu_h;\n\n// definition of jpeg image component\n   struct\n   {\n      int id;\n      int h,v;\n      int tq;\n      int hd,ha;\n      int dc_pred;\n\n      int x,y,w2,h2;\n      stbi_uc *data;\n      void *raw_data, *raw_coeff;\n      stbi_uc *linebuf;\n      short   *coeff;   // progressive only\n      int      coeff_w, coeff_h; // number of 8x8 coefficient blocks\n   } img_comp[4];\n\n   stbi__uint32   code_buffer; // jpeg entropy-coded buffer\n   int            code_bits;   // number of valid bits\n   unsigned char  marker;      // marker seen while filling entropy buffer\n   int            nomore;      // flag if we saw a marker so must stop\n\n   int            progressive;\n   int            spec_start;\n   int            spec_end;\n   int            succ_high;\n   int            succ_low;\n   int            eob_run;\n\n   int scan_n, order[4];\n   int restart_interval, todo;\n\n// kernels\n   void (*idct_block_kernel)(stbi_uc *out, int out_stride, short data[64]);\n   void (*YCbCr_to_RGB_kernel)(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step);\n   stbi_uc *(*resample_row_hv_2_kernel)(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs);\n} stbi__jpeg;\n\nstatic int stbi__build_huffman(stbi__huffman *h, int *count)\n{\n   int i,j,k=0,code;\n   // build size list for each symbol (from JPEG spec)\n   for (i=0; i < 16; ++i)\n      for (j=0; j < count[i]; ++j)\n         h->size[k++] = (stbi_uc) (i+1);\n   h->size[k] = 0;\n\n   // compute actual symbols (from jpeg spec)\n   code = 0;\n   k = 0;\n   for(j=1; j <= 16; ++j) {\n      // compute delta to add to code to compute symbol id\n      h->delta[j] = k - code;\n      if (h->size[k] == j) {\n         while (h->size[k] == j)\n            h->code[k++] = (stbi__uint16) (code++);\n         if (code-1 >= (1 << j)) return stbi__err(\"bad code lengths\",\"Corrupt JPEG\");\n      }\n      // compute largest code + 1 for this size, preshifted as needed later\n      h->maxcode[j] = code << (16-j);\n      code <<= 1;\n   }\n   h->maxcode[j] = 0xffffffff;\n\n   // build non-spec acceleration table; 255 is flag for not-accelerated\n   memset(h->fast, 255, 1 << FAST_BITS);\n   for (i=0; i < k; ++i) {\n      int s = h->size[i];\n      if (s <= FAST_BITS) {\n         int c = h->code[i] << (FAST_BITS-s);\n         int m = 1 << (FAST_BITS-s);\n         for (j=0; j < m; ++j) {\n            h->fast[c+j] = (stbi_uc) i;\n         }\n      }\n   }\n   return 1;\n}\n\n// build a table that decodes both magnitude and value of small ACs in\n// one go.\nstatic void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h)\n{\n   int i;\n   for (i=0; i < (1 << FAST_BITS); ++i) {\n      stbi_uc fast = h->fast[i];\n      fast_ac[i] = 0;\n      if (fast < 255) {\n         int rs = h->values[fast];\n         int run = (rs >> 4) & 15;\n         int magbits = rs & 15;\n         int len = h->size[fast];\n\n         if (magbits && len + magbits <= FAST_BITS) {\n            // magnitude code followed by receive_extend code\n            int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits);\n            int m = 1 << (magbits - 1);\n            if (k < m) k += (-1 << magbits) + 1;\n            // if the result is small enough, we can fit it in fast_ac table\n            if (k >= -128 && k <= 127)\n               fast_ac[i] = (stbi__int16) ((k << 8) + (run << 4) + (len + magbits));\n         }\n      }\n   }\n}\n\nstatic void stbi__grow_buffer_unsafe(stbi__jpeg *j)\n{\n   do {\n      int b = j->nomore ? 0 : stbi__get8(j->s);\n      if (b == 0xff) {\n         int c = stbi__get8(j->s);\n         if (c != 0) {\n            j->marker = (unsigned char) c;\n            j->nomore = 1;\n            return;\n         }\n      }\n      j->code_buffer |= b << (24 - j->code_bits);\n      j->code_bits += 8;\n   } while (j->code_bits <= 24);\n}\n\n// (1 << n) - 1\nstatic stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535};\n\n// decode a jpeg huffman value from the bitstream\nstbi_inline static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h)\n{\n   unsigned int temp;\n   int c,k;\n\n   if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);\n\n   // look at the top FAST_BITS and determine what symbol ID it is,\n   // if the code is <= FAST_BITS\n   c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);\n   k = h->fast[c];\n   if (k < 255) {\n      int s = h->size[k];\n      if (s > j->code_bits)\n         return -1;\n      j->code_buffer <<= s;\n      j->code_bits -= s;\n      return h->values[k];\n   }\n\n   // naive test is to shift the code_buffer down so k bits are\n   // valid, then test against maxcode. To speed this up, we've\n   // preshifted maxcode left so that it has (16-k) 0s at the\n   // end; in other words, regardless of the number of bits, it\n   // wants to be compared against something shifted to have 16;\n   // that way we don't need to shift inside the loop.\n   temp = j->code_buffer >> 16;\n   for (k=FAST_BITS+1 ; ; ++k)\n      if (temp < h->maxcode[k])\n         break;\n   if (k == 17) {\n      // error! code not found\n      j->code_bits -= 16;\n      return -1;\n   }\n\n   if (k > j->code_bits)\n      return -1;\n\n   // convert the huffman code to the symbol id\n   c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k];\n   STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]);\n\n   // convert the id to a symbol\n   j->code_bits -= k;\n   j->code_buffer <<= k;\n   return h->values[c];\n}\n\n// bias[n] = (-1<<n) + 1\nstatic int const stbi__jbias[16] = {0,-1,-3,-7,-15,-31,-63,-127,-255,-511,-1023,-2047,-4095,-8191,-16383,-32767};\n\n// combined JPEG 'receive' and JPEG 'extend', since baseline\n// always extends everything it receives.\nstbi_inline static int stbi__extend_receive(stbi__jpeg *j, int n)\n{\n   unsigned int k;\n   int sgn;\n   if (j->code_bits < n) stbi__grow_buffer_unsafe(j);\n\n   sgn = (stbi__int32)j->code_buffer >> 31; // sign bit is always in MSB\n   k = stbi_lrot(j->code_buffer, n);\n   STBI_ASSERT(n >= 0 && n < (int) (sizeof(stbi__bmask)/sizeof(*stbi__bmask)));\n   j->code_buffer = k & ~stbi__bmask[n];\n   k &= stbi__bmask[n];\n   j->code_bits -= n;\n   return k + (stbi__jbias[n] & ~sgn);\n}\n\n// get some unsigned bits\nstbi_inline static int stbi__jpeg_get_bits(stbi__jpeg *j, int n)\n{\n   unsigned int k;\n   if (j->code_bits < n) stbi__grow_buffer_unsafe(j);\n   k = stbi_lrot(j->code_buffer, n);\n   j->code_buffer = k & ~stbi__bmask[n];\n   k &= stbi__bmask[n];\n   j->code_bits -= n;\n   return k;\n}\n\nstbi_inline static int stbi__jpeg_get_bit(stbi__jpeg *j)\n{\n   unsigned int k;\n   if (j->code_bits < 1) stbi__grow_buffer_unsafe(j);\n   k = j->code_buffer;\n   j->code_buffer <<= 1;\n   --j->code_bits;\n   return k & 0x80000000;\n}\n\n// given a value that's at position X in the zigzag stream,\n// where does it appear in the 8x8 matrix coded as row-major?\nstatic stbi_uc stbi__jpeg_dezigzag[64+15] =\n{\n    0,  1,  8, 16,  9,  2,  3, 10,\n   17, 24, 32, 25, 18, 11,  4,  5,\n   12, 19, 26, 33, 40, 48, 41, 34,\n   27, 20, 13,  6,  7, 14, 21, 28,\n   35, 42, 49, 56, 57, 50, 43, 36,\n   29, 22, 15, 23, 30, 37, 44, 51,\n   58, 59, 52, 45, 38, 31, 39, 46,\n   53, 60, 61, 54, 47, 55, 62, 63,\n   // let corrupt input sample past end\n   63, 63, 63, 63, 63, 63, 63, 63,\n   63, 63, 63, 63, 63, 63, 63\n};\n\n// decode one 64-entry block--\nstatic int stbi__jpeg_decode_block(stbi__jpeg *j, short data[64], stbi__huffman *hdc, stbi__huffman *hac, stbi__int16 *fac, int b, stbi_uc *dequant)\n{\n   int diff,dc,k;\n   int t;\n\n   if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);\n   t = stbi__jpeg_huff_decode(j, hdc);\n   if (t < 0) return stbi__err(\"bad huffman code\",\"Corrupt JPEG\");\n\n   // 0 all the ac values now so we can do it 32-bits at a time\n   memset(data,0,64*sizeof(data[0]));\n\n   diff = t ? stbi__extend_receive(j, t) : 0;\n   dc = j->img_comp[b].dc_pred + diff;\n   j->img_comp[b].dc_pred = dc;\n   data[0] = (short) (dc * dequant[0]);\n\n   // decode AC components, see JPEG spec\n   k = 1;\n   do {\n      unsigned int zig;\n      int c,r,s;\n      if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);\n      c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);\n      r = fac[c];\n      if (r) { // fast-AC path\n         k += (r >> 4) & 15; // run\n         s = r & 15; // combined length\n         j->code_buffer <<= s;\n         j->code_bits -= s;\n         // decode into unzigzag'd location\n         zig = stbi__jpeg_dezigzag[k++];\n         data[zig] = (short) ((r >> 8) * dequant[zig]);\n      } else {\n         int rs = stbi__jpeg_huff_decode(j, hac);\n         if (rs < 0) return stbi__err(\"bad huffman code\",\"Corrupt JPEG\");\n         s = rs & 15;\n         r = rs >> 4;\n         if (s == 0) {\n            if (rs != 0xf0) break; // end block\n            k += 16;\n         } else {\n            k += r;\n            // decode into unzigzag'd location\n            zig = stbi__jpeg_dezigzag[k++];\n            data[zig] = (short) (stbi__extend_receive(j,s) * dequant[zig]);\n         }\n      }\n   } while (k < 64);\n   return 1;\n}\n\nstatic int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j, short data[64], stbi__huffman *hdc, int b)\n{\n   int diff,dc;\n   int t;\n   if (j->spec_end != 0) return stbi__err(\"can't merge dc and ac\", \"Corrupt JPEG\");\n\n   if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);\n\n   if (j->succ_high == 0) {\n      // first scan for DC coefficient, must be first\n      memset(data,0,64*sizeof(data[0])); // 0 all the ac values now\n      t = stbi__jpeg_huff_decode(j, hdc);\n      diff = t ? stbi__extend_receive(j, t) : 0;\n\n      dc = j->img_comp[b].dc_pred + diff;\n      j->img_comp[b].dc_pred = dc;\n      data[0] = (short) (dc << j->succ_low);\n   } else {\n      // refinement scan for DC coefficient\n      if (stbi__jpeg_get_bit(j))\n         data[0] += (short) (1 << j->succ_low);\n   }\n   return 1;\n}\n\n// @OPTIMIZE: store non-zigzagged during the decode passes,\n// and only de-zigzag when dequantizing\nstatic int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j, short data[64], stbi__huffman *hac, stbi__int16 *fac)\n{\n   int k;\n   if (j->spec_start == 0) return stbi__err(\"can't merge dc and ac\", \"Corrupt JPEG\");\n\n   if (j->succ_high == 0) {\n      int shift = j->succ_low;\n\n      if (j->eob_run) {\n         --j->eob_run;\n         return 1;\n      }\n\n      k = j->spec_start;\n      do {\n         unsigned int zig;\n         int c,r,s;\n         if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);\n         c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);\n         r = fac[c];\n         if (r) { // fast-AC path\n            k += (r >> 4) & 15; // run\n            s = r & 15; // combined length\n            j->code_buffer <<= s;\n            j->code_bits -= s;\n            zig = stbi__jpeg_dezigzag[k++];\n            data[zig] = (short) ((r >> 8) << shift);\n         } else {\n            int rs = stbi__jpeg_huff_decode(j, hac);\n            if (rs < 0) return stbi__err(\"bad huffman code\",\"Corrupt JPEG\");\n            s = rs & 15;\n            r = rs >> 4;\n            if (s == 0) {\n               if (r < 15) {\n                  j->eob_run = (1 << r);\n                  if (r)\n                     j->eob_run += stbi__jpeg_get_bits(j, r);\n                  --j->eob_run;\n                  break;\n               }\n               k += 16;\n            } else {\n               k += r;\n               zig = stbi__jpeg_dezigzag[k++];\n               data[zig] = (short) (stbi__extend_receive(j,s) << shift);\n            }\n         }\n      } while (k <= j->spec_end);\n   } else {\n      // refinement scan for these AC coefficients\n\n      short bit = (short) (1 << j->succ_low);\n\n      if (j->eob_run) {\n         --j->eob_run;\n         for (k = j->spec_start; k <= j->spec_end; ++k) {\n            short *p = &data[stbi__jpeg_dezigzag[k]];\n            if (*p != 0)\n               if (stbi__jpeg_get_bit(j))\n                  if ((*p & bit)==0) {\n                     if (*p > 0)\n                        *p += bit;\n                     else\n                        *p -= bit;\n                  }\n         }\n      } else {\n         k = j->spec_start;\n         do {\n            int r,s;\n            int rs = stbi__jpeg_huff_decode(j, hac); // @OPTIMIZE see if we can use the fast path here, advance-by-r is so slow, eh\n            if (rs < 0) return stbi__err(\"bad huffman code\",\"Corrupt JPEG\");\n            s = rs & 15;\n            r = rs >> 4;\n            if (s == 0) {\n               if (r < 15) {\n                  j->eob_run = (1 << r) - 1;\n                  if (r)\n                     j->eob_run += stbi__jpeg_get_bits(j, r);\n                  r = 64; // force end of block\n               } else {\n                  // r=15 s=0 should write 16 0s, so we just do\n                  // a run of 15 0s and then write s (which is 0),\n                  // so we don't have to do anything special here\n               }\n            } else {\n               if (s != 1) return stbi__err(\"bad huffman code\", \"Corrupt JPEG\");\n               // sign bit\n               if (stbi__jpeg_get_bit(j))\n                  s = bit;\n               else\n                  s = -bit;\n            }\n\n            // advance by r\n            while (k <= j->spec_end) {\n               short *p = &data[stbi__jpeg_dezigzag[k++]];\n               if (*p != 0) {\n                  if (stbi__jpeg_get_bit(j))\n                     if ((*p & bit)==0) {\n                        if (*p > 0)\n                           *p += bit;\n                        else\n                           *p -= bit;\n                     }\n               } else {\n                  if (r == 0) {\n                     *p = (short) s;\n                     break;\n                  }\n                  --r;\n               }\n            }\n         } while (k <= j->spec_end);\n      }\n   }\n   return 1;\n}\n\n// take a -128..127 value and stbi__clamp it and convert to 0..255\nstbi_inline static stbi_uc stbi__clamp(int x)\n{\n   // trick to use a single test to catch both cases\n   if ((unsigned int) x > 255) {\n      if (x < 0) return 0;\n      if (x > 255) return 255;\n   }\n   return (stbi_uc) x;\n}\n\n#define stbi__f2f(x)  ((int) (((x) * 4096 + 0.5)))\n#define stbi__fsh(x)  ((x) << 12)\n\n// derived from jidctint -- DCT_ISLOW\n#define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \\\n   int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \\\n   p2 = s2;                                    \\\n   p3 = s6;                                    \\\n   p1 = (p2+p3) * stbi__f2f(0.5411961f);       \\\n   t2 = p1 + p3*stbi__f2f(-1.847759065f);      \\\n   t3 = p1 + p2*stbi__f2f( 0.765366865f);      \\\n   p2 = s0;                                    \\\n   p3 = s4;                                    \\\n   t0 = stbi__fsh(p2+p3);                      \\\n   t1 = stbi__fsh(p2-p3);                      \\\n   x0 = t0+t3;                                 \\\n   x3 = t0-t3;                                 \\\n   x1 = t1+t2;                                 \\\n   x2 = t1-t2;                                 \\\n   t0 = s7;                                    \\\n   t1 = s5;                                    \\\n   t2 = s3;                                    \\\n   t3 = s1;                                    \\\n   p3 = t0+t2;                                 \\\n   p4 = t1+t3;                                 \\\n   p1 = t0+t3;                                 \\\n   p2 = t1+t2;                                 \\\n   p5 = (p3+p4)*stbi__f2f( 1.175875602f);      \\\n   t0 = t0*stbi__f2f( 0.298631336f);           \\\n   t1 = t1*stbi__f2f( 2.053119869f);           \\\n   t2 = t2*stbi__f2f( 3.072711026f);           \\\n   t3 = t3*stbi__f2f( 1.501321110f);           \\\n   p1 = p5 + p1*stbi__f2f(-0.899976223f);      \\\n   p2 = p5 + p2*stbi__f2f(-2.562915447f);      \\\n   p3 = p3*stbi__f2f(-1.961570560f);           \\\n   p4 = p4*stbi__f2f(-0.390180644f);           \\\n   t3 += p1+p4;                                \\\n   t2 += p2+p3;                                \\\n   t1 += p2+p4;                                \\\n   t0 += p1+p3;\n\nstatic void stbi__idct_block(stbi_uc *out, int out_stride, short data[64])\n{\n   int i,val[64],*v=val;\n   stbi_uc *o;\n   short *d = data;\n\n   // columns\n   for (i=0; i < 8; ++i,++d, ++v) {\n      // if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing\n      if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0\n           && d[40]==0 && d[48]==0 && d[56]==0) {\n         //    no shortcut                 0     seconds\n         //    (1|2|3|4|5|6|7)==0          0     seconds\n         //    all separate               -0.047 seconds\n         //    1 && 2|3 && 4|5 && 6|7:    -0.047 seconds\n         int dcterm = d[0] << 2;\n         v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm;\n      } else {\n         STBI__IDCT_1D(d[ 0],d[ 8],d[16],d[24],d[32],d[40],d[48],d[56])\n         // constants scaled things up by 1<<12; let's bring them back\n         // down, but keep 2 extra bits of precision\n         x0 += 512; x1 += 512; x2 += 512; x3 += 512;\n         v[ 0] = (x0+t3) >> 10;\n         v[56] = (x0-t3) >> 10;\n         v[ 8] = (x1+t2) >> 10;\n         v[48] = (x1-t2) >> 10;\n         v[16] = (x2+t1) >> 10;\n         v[40] = (x2-t1) >> 10;\n         v[24] = (x3+t0) >> 10;\n         v[32] = (x3-t0) >> 10;\n      }\n   }\n\n   for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) {\n      // no fast case since the first 1D IDCT spread components out\n      STBI__IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7])\n      // constants scaled things up by 1<<12, plus we had 1<<2 from first\n      // loop, plus horizontal and vertical each scale by sqrt(8) so together\n      // we've got an extra 1<<3, so 1<<17 total we need to remove.\n      // so we want to round that, which means adding 0.5 * 1<<17,\n      // aka 65536. Also, we'll end up with -128 to 127 that we want\n      // to encode as 0..255 by adding 128, so we'll add that before the shift\n      x0 += 65536 + (128<<17);\n      x1 += 65536 + (128<<17);\n      x2 += 65536 + (128<<17);\n      x3 += 65536 + (128<<17);\n      // tried computing the shifts into temps, or'ing the temps to see\n      // if any were out of range, but that was slower\n      o[0] = stbi__clamp((x0+t3) >> 17);\n      o[7] = stbi__clamp((x0-t3) >> 17);\n      o[1] = stbi__clamp((x1+t2) >> 17);\n      o[6] = stbi__clamp((x1-t2) >> 17);\n      o[2] = stbi__clamp((x2+t1) >> 17);\n      o[5] = stbi__clamp((x2-t1) >> 17);\n      o[3] = stbi__clamp((x3+t0) >> 17);\n      o[4] = stbi__clamp((x3-t0) >> 17);\n   }\n}\n\n#ifdef STBI_SSE2\n// sse2 integer IDCT. not the fastest possible implementation but it\n// produces bit-identical results to the generic C version so it's\n// fully \"transparent\".\nstatic void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64])\n{\n   // This is constructed to match our regular (generic) integer IDCT exactly.\n   __m128i row0, row1, row2, row3, row4, row5, row6, row7;\n   __m128i tmp;\n\n   // dot product constant: even elems=x, odd elems=y\n   #define dct_const(x,y)  _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y))\n\n   // out(0) = c0[even]*x + c0[odd]*y   (c0, x, y 16-bit, out 32-bit)\n   // out(1) = c1[even]*x + c1[odd]*y\n   #define dct_rot(out0,out1, x,y,c0,c1) \\\n      __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \\\n      __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \\\n      __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \\\n      __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \\\n      __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \\\n      __m128i out1##_h = _mm_madd_epi16(c0##hi, c1)\n\n   // out = in << 12  (in 16-bit, out 32-bit)\n   #define dct_widen(out, in) \\\n      __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \\\n      __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4)\n\n   // wide add\n   #define dct_wadd(out, a, b) \\\n      __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \\\n      __m128i out##_h = _mm_add_epi32(a##_h, b##_h)\n\n   // wide sub\n   #define dct_wsub(out, a, b) \\\n      __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \\\n      __m128i out##_h = _mm_sub_epi32(a##_h, b##_h)\n\n   // butterfly a/b, add bias, then shift by \"s\" and pack\n   #define dct_bfly32o(out0, out1, a,b,bias,s) \\\n      { \\\n         __m128i abiased_l = _mm_add_epi32(a##_l, bias); \\\n         __m128i abiased_h = _mm_add_epi32(a##_h, bias); \\\n         dct_wadd(sum, abiased, b); \\\n         dct_wsub(dif, abiased, b); \\\n         out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \\\n         out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \\\n      }\n\n   // 8-bit interleave step (for transposes)\n   #define dct_interleave8(a, b) \\\n      tmp = a; \\\n      a = _mm_unpacklo_epi8(a, b); \\\n      b = _mm_unpackhi_epi8(tmp, b)\n\n   // 16-bit interleave step (for transposes)\n   #define dct_interleave16(a, b) \\\n      tmp = a; \\\n      a = _mm_unpacklo_epi16(a, b); \\\n      b = _mm_unpackhi_epi16(tmp, b)\n\n   #define dct_pass(bias,shift) \\\n      { \\\n         /* even part */ \\\n         dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \\\n         __m128i sum04 = _mm_add_epi16(row0, row4); \\\n         __m128i dif04 = _mm_sub_epi16(row0, row4); \\\n         dct_widen(t0e, sum04); \\\n         dct_widen(t1e, dif04); \\\n         dct_wadd(x0, t0e, t3e); \\\n         dct_wsub(x3, t0e, t3e); \\\n         dct_wadd(x1, t1e, t2e); \\\n         dct_wsub(x2, t1e, t2e); \\\n         /* odd part */ \\\n         dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \\\n         dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \\\n         __m128i sum17 = _mm_add_epi16(row1, row7); \\\n         __m128i sum35 = _mm_add_epi16(row3, row5); \\\n         dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \\\n         dct_wadd(x4, y0o, y4o); \\\n         dct_wadd(x5, y1o, y5o); \\\n         dct_wadd(x6, y2o, y5o); \\\n         dct_wadd(x7, y3o, y4o); \\\n         dct_bfly32o(row0,row7, x0,x7,bias,shift); \\\n         dct_bfly32o(row1,row6, x1,x6,bias,shift); \\\n         dct_bfly32o(row2,row5, x2,x5,bias,shift); \\\n         dct_bfly32o(row3,row4, x3,x4,bias,shift); \\\n      }\n\n   __m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f));\n   __m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f( 0.765366865f), stbi__f2f(0.5411961f));\n   __m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f));\n   __m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f));\n   __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f( 0.298631336f), stbi__f2f(-1.961570560f));\n   __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f( 3.072711026f));\n   __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f( 2.053119869f), stbi__f2f(-0.390180644f));\n   __m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f( 1.501321110f));\n\n   // rounding biases in column/row passes, see stbi__idct_block for explanation.\n   __m128i bias_0 = _mm_set1_epi32(512);\n   __m128i bias_1 = _mm_set1_epi32(65536 + (128<<17));\n\n   // load\n   row0 = _mm_load_si128((const __m128i *) (data + 0*8));\n   row1 = _mm_load_si128((const __m128i *) (data + 1*8));\n   row2 = _mm_load_si128((const __m128i *) (data + 2*8));\n   row3 = _mm_load_si128((const __m128i *) (data + 3*8));\n   row4 = _mm_load_si128((const __m128i *) (data + 4*8));\n   row5 = _mm_load_si128((const __m128i *) (data + 5*8));\n   row6 = _mm_load_si128((const __m128i *) (data + 6*8));\n   row7 = _mm_load_si128((const __m128i *) (data + 7*8));\n\n   // column pass\n   dct_pass(bias_0, 10);\n\n   {\n      // 16bit 8x8 transpose pass 1\n      dct_interleave16(row0, row4);\n      dct_interleave16(row1, row5);\n      dct_interleave16(row2, row6);\n      dct_interleave16(row3, row7);\n\n      // transpose pass 2\n      dct_interleave16(row0, row2);\n      dct_interleave16(row1, row3);\n      dct_interleave16(row4, row6);\n      dct_interleave16(row5, row7);\n\n      // transpose pass 3\n      dct_interleave16(row0, row1);\n      dct_interleave16(row2, row3);\n      dct_interleave16(row4, row5);\n      dct_interleave16(row6, row7);\n   }\n\n   // row pass\n   dct_pass(bias_1, 17);\n\n   {\n      // pack\n      __m128i p0 = _mm_packus_epi16(row0, row1); // a0a1a2a3...a7b0b1b2b3...b7\n      __m128i p1 = _mm_packus_epi16(row2, row3);\n      __m128i p2 = _mm_packus_epi16(row4, row5);\n      __m128i p3 = _mm_packus_epi16(row6, row7);\n\n      // 8bit 8x8 transpose pass 1\n      dct_interleave8(p0, p2); // a0e0a1e1...\n      dct_interleave8(p1, p3); // c0g0c1g1...\n\n      // transpose pass 2\n      dct_interleave8(p0, p1); // a0c0e0g0...\n      dct_interleave8(p2, p3); // b0d0f0h0...\n\n      // transpose pass 3\n      dct_interleave8(p0, p2); // a0b0c0d0...\n      dct_interleave8(p1, p3); // a4b4c4d4...\n\n      // store\n      _mm_storel_epi64((__m128i *) out, p0); out += out_stride;\n      _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride;\n      _mm_storel_epi64((__m128i *) out, p2); out += out_stride;\n      _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride;\n      _mm_storel_epi64((__m128i *) out, p1); out += out_stride;\n      _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride;\n      _mm_storel_epi64((__m128i *) out, p3); out += out_stride;\n      _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p3, 0x4e));\n   }\n\n#undef dct_const\n#undef dct_rot\n#undef dct_widen\n#undef dct_wadd\n#undef dct_wsub\n#undef dct_bfly32o\n#undef dct_interleave8\n#undef dct_interleave16\n#undef dct_pass\n}\n\n#endif // STBI_SSE2\n\n#ifdef STBI_NEON\n\n// NEON integer IDCT. should produce bit-identical\n// results to the generic C version.\nstatic void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64])\n{\n   int16x8_t row0, row1, row2, row3, row4, row5, row6, row7;\n\n   int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f));\n   int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f));\n   int16x4_t rot0_2 = vdup_n_s16(stbi__f2f( 0.765366865f));\n   int16x4_t rot1_0 = vdup_n_s16(stbi__f2f( 1.175875602f));\n   int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f));\n   int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f));\n   int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f));\n   int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f));\n   int16x4_t rot3_0 = vdup_n_s16(stbi__f2f( 0.298631336f));\n   int16x4_t rot3_1 = vdup_n_s16(stbi__f2f( 2.053119869f));\n   int16x4_t rot3_2 = vdup_n_s16(stbi__f2f( 3.072711026f));\n   int16x4_t rot3_3 = vdup_n_s16(stbi__f2f( 1.501321110f));\n\n#define dct_long_mul(out, inq, coeff) \\\n   int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \\\n   int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff)\n\n#define dct_long_mac(out, acc, inq, coeff) \\\n   int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \\\n   int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff)\n\n#define dct_widen(out, inq) \\\n   int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \\\n   int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12)\n\n// wide add\n#define dct_wadd(out, a, b) \\\n   int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \\\n   int32x4_t out##_h = vaddq_s32(a##_h, b##_h)\n\n// wide sub\n#define dct_wsub(out, a, b) \\\n   int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \\\n   int32x4_t out##_h = vsubq_s32(a##_h, b##_h)\n\n// butterfly a/b, then shift using \"shiftop\" by \"s\" and pack\n#define dct_bfly32o(out0,out1, a,b,shiftop,s) \\\n   { \\\n      dct_wadd(sum, a, b); \\\n      dct_wsub(dif, a, b); \\\n      out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \\\n      out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \\\n   }\n\n#define dct_pass(shiftop, shift) \\\n   { \\\n      /* even part */ \\\n      int16x8_t sum26 = vaddq_s16(row2, row6); \\\n      dct_long_mul(p1e, sum26, rot0_0); \\\n      dct_long_mac(t2e, p1e, row6, rot0_1); \\\n      dct_long_mac(t3e, p1e, row2, rot0_2); \\\n      int16x8_t sum04 = vaddq_s16(row0, row4); \\\n      int16x8_t dif04 = vsubq_s16(row0, row4); \\\n      dct_widen(t0e, sum04); \\\n      dct_widen(t1e, dif04); \\\n      dct_wadd(x0, t0e, t3e); \\\n      dct_wsub(x3, t0e, t3e); \\\n      dct_wadd(x1, t1e, t2e); \\\n      dct_wsub(x2, t1e, t2e); \\\n      /* odd part */ \\\n      int16x8_t sum15 = vaddq_s16(row1, row5); \\\n      int16x8_t sum17 = vaddq_s16(row1, row7); \\\n      int16x8_t sum35 = vaddq_s16(row3, row5); \\\n      int16x8_t sum37 = vaddq_s16(row3, row7); \\\n      int16x8_t sumodd = vaddq_s16(sum17, sum35); \\\n      dct_long_mul(p5o, sumodd, rot1_0); \\\n      dct_long_mac(p1o, p5o, sum17, rot1_1); \\\n      dct_long_mac(p2o, p5o, sum35, rot1_2); \\\n      dct_long_mul(p3o, sum37, rot2_0); \\\n      dct_long_mul(p4o, sum15, rot2_1); \\\n      dct_wadd(sump13o, p1o, p3o); \\\n      dct_wadd(sump24o, p2o, p4o); \\\n      dct_wadd(sump23o, p2o, p3o); \\\n      dct_wadd(sump14o, p1o, p4o); \\\n      dct_long_mac(x4, sump13o, row7, rot3_0); \\\n      dct_long_mac(x5, sump24o, row5, rot3_1); \\\n      dct_long_mac(x6, sump23o, row3, rot3_2); \\\n      dct_long_mac(x7, sump14o, row1, rot3_3); \\\n      dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \\\n      dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \\\n      dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \\\n      dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \\\n   }\n\n   // load\n   row0 = vld1q_s16(data + 0*8);\n   row1 = vld1q_s16(data + 1*8);\n   row2 = vld1q_s16(data + 2*8);\n   row3 = vld1q_s16(data + 3*8);\n   row4 = vld1q_s16(data + 4*8);\n   row5 = vld1q_s16(data + 5*8);\n   row6 = vld1q_s16(data + 6*8);\n   row7 = vld1q_s16(data + 7*8);\n\n   // add DC bias\n   row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0));\n\n   // column pass\n   dct_pass(vrshrn_n_s32, 10);\n\n   // 16bit 8x8 transpose\n   {\n// these three map to a single VTRN.16, VTRN.32, and VSWP, respectively.\n// whether compilers actually get this is another story, sadly.\n#define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; }\n#define dct_trn32(x, y) { int32x4x2_t t = vtrnq_s32(vreinterpretq_s32_s16(x), vreinterpretq_s32_s16(y)); x = vreinterpretq_s16_s32(t.val[0]); y = vreinterpretq_s16_s32(t.val[1]); }\n#define dct_trn64(x, y) { int16x8_t x0 = x; int16x8_t y0 = y; x = vcombine_s16(vget_low_s16(x0), vget_low_s16(y0)); y = vcombine_s16(vget_high_s16(x0), vget_high_s16(y0)); }\n\n      // pass 1\n      dct_trn16(row0, row1); // a0b0a2b2a4b4a6b6\n      dct_trn16(row2, row3);\n      dct_trn16(row4, row5);\n      dct_trn16(row6, row7);\n\n      // pass 2\n      dct_trn32(row0, row2); // a0b0c0d0a4b4c4d4\n      dct_trn32(row1, row3);\n      dct_trn32(row4, row6);\n      dct_trn32(row5, row7);\n\n      // pass 3\n      dct_trn64(row0, row4); // a0b0c0d0e0f0g0h0\n      dct_trn64(row1, row5);\n      dct_trn64(row2, row6);\n      dct_trn64(row3, row7);\n\n#undef dct_trn16\n#undef dct_trn32\n#undef dct_trn64\n   }\n\n   // row pass\n   // vrshrn_n_s32 only supports shifts up to 16, we need\n   // 17. so do a non-rounding shift of 16 first then follow\n   // up with a rounding shift by 1.\n   dct_pass(vshrn_n_s32, 16);\n\n   {\n      // pack and round\n      uint8x8_t p0 = vqrshrun_n_s16(row0, 1);\n      uint8x8_t p1 = vqrshrun_n_s16(row1, 1);\n      uint8x8_t p2 = vqrshrun_n_s16(row2, 1);\n      uint8x8_t p3 = vqrshrun_n_s16(row3, 1);\n      uint8x8_t p4 = vqrshrun_n_s16(row4, 1);\n      uint8x8_t p5 = vqrshrun_n_s16(row5, 1);\n      uint8x8_t p6 = vqrshrun_n_s16(row6, 1);\n      uint8x8_t p7 = vqrshrun_n_s16(row7, 1);\n\n      // again, these can translate into one instruction, but often don't.\n#define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; }\n#define dct_trn8_16(x, y) { uint16x4x2_t t = vtrn_u16(vreinterpret_u16_u8(x), vreinterpret_u16_u8(y)); x = vreinterpret_u8_u16(t.val[0]); y = vreinterpret_u8_u16(t.val[1]); }\n#define dct_trn8_32(x, y) { uint32x2x2_t t = vtrn_u32(vreinterpret_u32_u8(x), vreinterpret_u32_u8(y)); x = vreinterpret_u8_u32(t.val[0]); y = vreinterpret_u8_u32(t.val[1]); }\n\n      // sadly can't use interleaved stores here since we only write\n      // 8 bytes to each scan line!\n\n      // 8x8 8-bit transpose pass 1\n      dct_trn8_8(p0, p1);\n      dct_trn8_8(p2, p3);\n      dct_trn8_8(p4, p5);\n      dct_trn8_8(p6, p7);\n\n      // pass 2\n      dct_trn8_16(p0, p2);\n      dct_trn8_16(p1, p3);\n      dct_trn8_16(p4, p6);\n      dct_trn8_16(p5, p7);\n\n      // pass 3\n      dct_trn8_32(p0, p4);\n      dct_trn8_32(p1, p5);\n      dct_trn8_32(p2, p6);\n      dct_trn8_32(p3, p7);\n\n      // store\n      vst1_u8(out, p0); out += out_stride;\n      vst1_u8(out, p1); out += out_stride;\n      vst1_u8(out, p2); out += out_stride;\n      vst1_u8(out, p3); out += out_stride;\n      vst1_u8(out, p4); out += out_stride;\n      vst1_u8(out, p5); out += out_stride;\n      vst1_u8(out, p6); out += out_stride;\n      vst1_u8(out, p7);\n\n#undef dct_trn8_8\n#undef dct_trn8_16\n#undef dct_trn8_32\n   }\n\n#undef dct_long_mul\n#undef dct_long_mac\n#undef dct_widen\n#undef dct_wadd\n#undef dct_wsub\n#undef dct_bfly32o\n#undef dct_pass\n}\n\n#endif // STBI_NEON\n\n#define STBI__MARKER_none  0xff\n// if there's a pending marker from the entropy stream, return that\n// otherwise, fetch from the stream and get a marker. if there's no\n// marker, return 0xff, which is never a valid marker value\nstatic stbi_uc stbi__get_marker(stbi__jpeg *j)\n{\n   stbi_uc x;\n   if (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none; return x; }\n   x = stbi__get8(j->s);\n   if (x != 0xff) return STBI__MARKER_none;\n   while (x == 0xff)\n      x = stbi__get8(j->s);\n   return x;\n}\n\n// in each scan, we'll have scan_n components, and the order\n// of the components is specified by order[]\n#define STBI__RESTART(x)     ((x) >= 0xd0 && (x) <= 0xd7)\n\n// after a restart interval, stbi__jpeg_reset the entropy decoder and\n// the dc prediction\nstatic void stbi__jpeg_reset(stbi__jpeg *j)\n{\n   j->code_bits = 0;\n   j->code_buffer = 0;\n   j->nomore = 0;\n   j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = 0;\n   j->marker = STBI__MARKER_none;\n   j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff;\n   j->eob_run = 0;\n   // no more than 1<<31 MCUs if no restart_interal? that's plenty safe,\n   // since we don't even allow 1<<30 pixels\n}\n\nstatic int stbi__parse_entropy_coded_data(stbi__jpeg *z)\n{\n   stbi__jpeg_reset(z);\n   if (!z->progressive) {\n      if (z->scan_n == 1) {\n         int i,j;\n         STBI_SIMD_ALIGN(short, data[64]);\n         int n = z->order[0];\n         // non-interleaved data, we just need to process one block at a time,\n         // in trivial scanline order\n         // number of blocks to do just depends on how many actual \"pixels\" this\n         // component has, independent of interleaved MCU blocking and such\n         int w = (z->img_comp[n].x+7) >> 3;\n         int h = (z->img_comp[n].y+7) >> 3;\n         for (j=0; j < h; ++j) {\n            for (i=0; i < w; ++i) {\n               int ha = z->img_comp[n].ha;\n               if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0;\n               z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data);\n               // every data block is an MCU, so countdown the restart interval\n               if (--z->todo <= 0) {\n                  if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);\n                  // if it's NOT a restart, then just bail, so we get corrupt data\n                  // rather than no data\n                  if (!STBI__RESTART(z->marker)) return 1;\n                  stbi__jpeg_reset(z);\n               }\n            }\n         }\n         return 1;\n      } else { // interleaved\n         int i,j,k,x,y;\n         STBI_SIMD_ALIGN(short, data[64]);\n         for (j=0; j < z->img_mcu_y; ++j) {\n            for (i=0; i < z->img_mcu_x; ++i) {\n               // scan an interleaved mcu... process scan_n components in order\n               for (k=0; k < z->scan_n; ++k) {\n                  int n = z->order[k];\n                  // scan out an mcu's worth of this component; that's just determined\n                  // by the basic H and V specified for the component\n                  for (y=0; y < z->img_comp[n].v; ++y) {\n                     for (x=0; x < z->img_comp[n].h; ++x) {\n                        int x2 = (i*z->img_comp[n].h + x)*8;\n                        int y2 = (j*z->img_comp[n].v + y)*8;\n                        int ha = z->img_comp[n].ha;\n                        if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0;\n                        z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data);\n                     }\n                  }\n               }\n               // after all interleaved components, that's an interleaved MCU,\n               // so now count down the restart interval\n               if (--z->todo <= 0) {\n                  if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);\n                  if (!STBI__RESTART(z->marker)) return 1;\n                  stbi__jpeg_reset(z);\n               }\n            }\n         }\n         return 1;\n      }\n   } else {\n      if (z->scan_n == 1) {\n         int i,j;\n         int n = z->order[0];\n         // non-interleaved data, we just need to process one block at a time,\n         // in trivial scanline order\n         // number of blocks to do just depends on how many actual \"pixels\" this\n         // component has, independent of interleaved MCU blocking and such\n         int w = (z->img_comp[n].x+7) >> 3;\n         int h = (z->img_comp[n].y+7) >> 3;\n         for (j=0; j < h; ++j) {\n            for (i=0; i < w; ++i) {\n               short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);\n               if (z->spec_start == 0) {\n                  if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))\n                     return 0;\n               } else {\n                  int ha = z->img_comp[n].ha;\n                  if (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha]))\n                     return 0;\n               }\n               // every data block is an MCU, so countdown the restart interval\n               if (--z->todo <= 0) {\n                  if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);\n                  if (!STBI__RESTART(z->marker)) return 1;\n                  stbi__jpeg_reset(z);\n               }\n            }\n         }\n         return 1;\n      } else { // interleaved\n         int i,j,k,x,y;\n         for (j=0; j < z->img_mcu_y; ++j) {\n            for (i=0; i < z->img_mcu_x; ++i) {\n               // scan an interleaved mcu... process scan_n components in order\n               for (k=0; k < z->scan_n; ++k) {\n                  int n = z->order[k];\n                  // scan out an mcu's worth of this component; that's just determined\n                  // by the basic H and V specified for the component\n                  for (y=0; y < z->img_comp[n].v; ++y) {\n                     for (x=0; x < z->img_comp[n].h; ++x) {\n                        int x2 = (i*z->img_comp[n].h + x);\n                        int y2 = (j*z->img_comp[n].v + y);\n                        short *data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w);\n                        if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))\n                           return 0;\n                     }\n                  }\n               }\n               // after all interleaved components, that's an interleaved MCU,\n               // so now count down the restart interval\n               if (--z->todo <= 0) {\n                  if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);\n                  if (!STBI__RESTART(z->marker)) return 1;\n                  stbi__jpeg_reset(z);\n               }\n            }\n         }\n         return 1;\n      }\n   }\n}\n\nstatic void stbi__jpeg_dequantize(short *data, stbi_uc *dequant)\n{\n   int i;\n   for (i=0; i < 64; ++i)\n      data[i] *= dequant[i];\n}\n\nstatic void stbi__jpeg_finish(stbi__jpeg *z)\n{\n   if (z->progressive) {\n      // dequantize and idct the data\n      int i,j,n;\n      for (n=0; n < z->s->img_n; ++n) {\n         int w = (z->img_comp[n].x+7) >> 3;\n         int h = (z->img_comp[n].y+7) >> 3;\n         for (j=0; j < h; ++j) {\n            for (i=0; i < w; ++i) {\n               short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);\n               stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]);\n               z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data);\n            }\n         }\n      }\n   }\n}\n\nstatic int stbi__process_marker(stbi__jpeg *z, int m)\n{\n   int L;\n   switch (m) {\n      case STBI__MARKER_none: // no marker found\n         return stbi__err(\"expected marker\",\"Corrupt JPEG\");\n\n      case 0xDD: // DRI - specify restart interval\n         if (stbi__get16be(z->s) != 4) return stbi__err(\"bad DRI len\",\"Corrupt JPEG\");\n         z->restart_interval = stbi__get16be(z->s);\n         return 1;\n\n      case 0xDB: // DQT - define quantization table\n         L = stbi__get16be(z->s)-2;\n         while (L > 0) {\n            int q = stbi__get8(z->s);\n            int p = q >> 4;\n            int t = q & 15,i;\n            if (p != 0) return stbi__err(\"bad DQT type\",\"Corrupt JPEG\");\n            if (t > 3) return stbi__err(\"bad DQT table\",\"Corrupt JPEG\");\n            for (i=0; i < 64; ++i)\n               z->dequant[t][stbi__jpeg_dezigzag[i]] = stbi__get8(z->s);\n            L -= 65;\n         }\n         return L==0;\n\n      case 0xC4: // DHT - define huffman table\n         L = stbi__get16be(z->s)-2;\n         while (L > 0) {\n            stbi_uc *v;\n            int sizes[16],i,n=0;\n            int q = stbi__get8(z->s);\n            int tc = q >> 4;\n            int th = q & 15;\n            if (tc > 1 || th > 3) return stbi__err(\"bad DHT header\",\"Corrupt JPEG\");\n            for (i=0; i < 16; ++i) {\n               sizes[i] = stbi__get8(z->s);\n               n += sizes[i];\n            }\n            L -= 17;\n            if (tc == 0) {\n               if (!stbi__build_huffman(z->huff_dc+th, sizes)) return 0;\n               v = z->huff_dc[th].values;\n            } else {\n               if (!stbi__build_huffman(z->huff_ac+th, sizes)) return 0;\n               v = z->huff_ac[th].values;\n            }\n            for (i=0; i < n; ++i)\n               v[i] = stbi__get8(z->s);\n            if (tc != 0)\n               stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th);\n            L -= n;\n         }\n         return L==0;\n   }\n   // check for comment block or APP blocks\n   if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) {\n      stbi__skip(z->s, stbi__get16be(z->s)-2);\n      return 1;\n   }\n   return 0;\n}\n\n// after we see SOS\nstatic int stbi__process_scan_header(stbi__jpeg *z)\n{\n   int i;\n   int Ls = stbi__get16be(z->s);\n   z->scan_n = stbi__get8(z->s);\n   if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (int) z->s->img_n) return stbi__err(\"bad SOS component count\",\"Corrupt JPEG\");\n   if (Ls != 6+2*z->scan_n) return stbi__err(\"bad SOS len\",\"Corrupt JPEG\");\n   for (i=0; i < z->scan_n; ++i) {\n      int id = stbi__get8(z->s), which;\n      int q = stbi__get8(z->s);\n      for (which = 0; which < z->s->img_n; ++which)\n         if (z->img_comp[which].id == id)\n            break;\n      if (which == z->s->img_n) return 0; // no match\n      z->img_comp[which].hd = q >> 4;   if (z->img_comp[which].hd > 3) return stbi__err(\"bad DC huff\",\"Corrupt JPEG\");\n      z->img_comp[which].ha = q & 15;   if (z->img_comp[which].ha > 3) return stbi__err(\"bad AC huff\",\"Corrupt JPEG\");\n      z->order[i] = which;\n   }\n\n   {\n      int aa;\n      z->spec_start = stbi__get8(z->s);\n      z->spec_end   = stbi__get8(z->s); // should be 63, but might be 0\n      aa = stbi__get8(z->s);\n      z->succ_high = (aa >> 4);\n      z->succ_low  = (aa & 15);\n      if (z->progressive) {\n         if (z->spec_start > 63 || z->spec_end > 63  || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13)\n            return stbi__err(\"bad SOS\", \"Corrupt JPEG\");\n      } else {\n         if (z->spec_start != 0) return stbi__err(\"bad SOS\",\"Corrupt JPEG\");\n         if (z->succ_high != 0 || z->succ_low != 0) return stbi__err(\"bad SOS\",\"Corrupt JPEG\");\n         z->spec_end = 63;\n      }\n   }\n\n   return 1;\n}\n\nstatic int stbi__process_frame_header(stbi__jpeg *z, int scan)\n{\n   stbi__context *s = z->s;\n   int Lf,p,i,q, h_max=1,v_max=1,c;\n   Lf = stbi__get16be(s);         if (Lf < 11) return stbi__err(\"bad SOF len\",\"Corrupt JPEG\"); // JPEG\n   p  = stbi__get8(s);            if (p != 8) return stbi__err(\"only 8-bit\",\"JPEG format not supported: 8-bit only\"); // JPEG baseline\n   s->img_y = stbi__get16be(s);   if (s->img_y == 0) return stbi__err(\"no header height\", \"JPEG format not supported: delayed height\"); // Legal, but we don't handle it--but neither does IJG\n   s->img_x = stbi__get16be(s);   if (s->img_x == 0) return stbi__err(\"0 width\",\"Corrupt JPEG\"); // JPEG requires\n   c = stbi__get8(s);\n   if (c != 3 && c != 1) return stbi__err(\"bad component count\",\"Corrupt JPEG\");    // JFIF requires\n   s->img_n = c;\n   for (i=0; i < c; ++i) {\n      z->img_comp[i].data = NULL;\n      z->img_comp[i].linebuf = NULL;\n   }\n\n   if (Lf != 8+3*s->img_n) return stbi__err(\"bad SOF len\",\"Corrupt JPEG\");\n\n   for (i=0; i < s->img_n; ++i) {\n      z->img_comp[i].id = stbi__get8(s);\n      if (z->img_comp[i].id != i+1)   // JFIF requires\n         if (z->img_comp[i].id != i)  // some version of jpegtran outputs non-JFIF-compliant files!\n            return stbi__err(\"bad component ID\",\"Corrupt JPEG\");\n      q = stbi__get8(s);\n      z->img_comp[i].h = (q >> 4);  if (!z->img_comp[i].h || z->img_comp[i].h > 4) return stbi__err(\"bad H\",\"Corrupt JPEG\");\n      z->img_comp[i].v = q & 15;    if (!z->img_comp[i].v || z->img_comp[i].v > 4) return stbi__err(\"bad V\",\"Corrupt JPEG\");\n      z->img_comp[i].tq = stbi__get8(s);  if (z->img_comp[i].tq > 3) return stbi__err(\"bad TQ\",\"Corrupt JPEG\");\n   }\n\n   if (scan != STBI__SCAN_load) return 1;\n\n   if ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err(\"too large\", \"Image too large to decode\");\n\n   for (i=0; i < s->img_n; ++i) {\n      if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h;\n      if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v;\n   }\n\n   // compute interleaved mcu info\n   z->img_h_max = h_max;\n   z->img_v_max = v_max;\n   z->img_mcu_w = h_max * 8;\n   z->img_mcu_h = v_max * 8;\n   z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w;\n   z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h;\n\n   for (i=0; i < s->img_n; ++i) {\n      // number of effective pixels (e.g. for non-interleaved MCU)\n      z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max;\n      z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max;\n      // to simplify generation, we'll allocate enough memory to decode\n      // the bogus oversized data from using interleaved MCUs and their\n      // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't\n      // discard the extra data until colorspace conversion\n      z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8;\n      z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8;\n      z->img_comp[i].raw_data = stbi__malloc(z->img_comp[i].w2 * z->img_comp[i].h2+15);\n\n      if (z->img_comp[i].raw_data == NULL) {\n         for(--i; i >= 0; --i) {\n            STBI_FREE(z->img_comp[i].raw_data);\n            z->img_comp[i].raw_data = NULL;\n         }\n         return stbi__err(\"outofmem\", \"Out of memory\");\n      }\n      // align blocks for idct using mmx/sse\n      z->img_comp[i].data = (stbi_uc*) (((size_t) z->img_comp[i].raw_data + 15) & ~15);\n      z->img_comp[i].linebuf = NULL;\n      if (z->progressive) {\n         z->img_comp[i].coeff_w = (z->img_comp[i].w2 + 7) >> 3;\n         z->img_comp[i].coeff_h = (z->img_comp[i].h2 + 7) >> 3;\n         z->img_comp[i].raw_coeff = STBI_MALLOC(z->img_comp[i].coeff_w * z->img_comp[i].coeff_h * 64 * sizeof(short) + 15);\n         z->img_comp[i].coeff = (short*) (((size_t) z->img_comp[i].raw_coeff + 15) & ~15);\n      } else {\n         z->img_comp[i].coeff = 0;\n         z->img_comp[i].raw_coeff = 0;\n      }\n   }\n\n   return 1;\n}\n\n// use comparisons since in some cases we handle more than one case (e.g. SOF)\n#define stbi__DNL(x)         ((x) == 0xdc)\n#define stbi__SOI(x)         ((x) == 0xd8)\n#define stbi__EOI(x)         ((x) == 0xd9)\n#define stbi__SOF(x)         ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2)\n#define stbi__SOS(x)         ((x) == 0xda)\n\n#define stbi__SOF_progressive(x)   ((x) == 0xc2)\n\nstatic int stbi__decode_jpeg_header(stbi__jpeg *z, int scan)\n{\n   int m;\n   z->marker = STBI__MARKER_none; // initialize cached marker to empty\n   m = stbi__get_marker(z);\n   if (!stbi__SOI(m)) return stbi__err(\"no SOI\",\"Corrupt JPEG\");\n   if (scan == STBI__SCAN_type) return 1;\n   m = stbi__get_marker(z);\n   while (!stbi__SOF(m)) {\n      if (!stbi__process_marker(z,m)) return 0;\n      m = stbi__get_marker(z);\n      while (m == STBI__MARKER_none) {\n         // some files have extra padding after their blocks, so ok, we'll scan\n         if (stbi__at_eof(z->s)) return stbi__err(\"no SOF\", \"Corrupt JPEG\");\n         m = stbi__get_marker(z);\n      }\n   }\n   z->progressive = stbi__SOF_progressive(m);\n   if (!stbi__process_frame_header(z, scan)) return 0;\n   return 1;\n}\n\n// decode image to YCbCr format\nstatic int stbi__decode_jpeg_image(stbi__jpeg *j)\n{\n   int m;\n   for (m = 0; m < 4; m++) {\n      j->img_comp[m].raw_data = NULL;\n      j->img_comp[m].raw_coeff = NULL;\n   }\n   j->restart_interval = 0;\n   if (!stbi__decode_jpeg_header(j, STBI__SCAN_load)) return 0;\n   m = stbi__get_marker(j);\n   while (!stbi__EOI(m)) {\n      if (stbi__SOS(m)) {\n         if (!stbi__process_scan_header(j)) return 0;\n         if (!stbi__parse_entropy_coded_data(j)) return 0;\n         if (j->marker == STBI__MARKER_none ) {\n            // handle 0s at the end of image data from IP Kamera 9060\n            while (!stbi__at_eof(j->s)) {\n               int x = stbi__get8(j->s);\n               if (x == 255) {\n                  j->marker = stbi__get8(j->s);\n                  break;\n               } else if (x != 0) {\n                  return stbi__err(\"junk before marker\", \"Corrupt JPEG\");\n               }\n            }\n            // if we reach eof without hitting a marker, stbi__get_marker() below will fail and we'll eventually return 0\n         }\n      } else {\n         if (!stbi__process_marker(j, m)) return 0;\n      }\n      m = stbi__get_marker(j);\n   }\n   if (j->progressive)\n      stbi__jpeg_finish(j);\n   return 1;\n}\n\n// static jfif-centered resampling (across block boundaries)\n\ntypedef stbi_uc *(*resample_row_func)(stbi_uc *out, stbi_uc *in0, stbi_uc *in1,\n                                    int w, int hs);\n\n#define stbi__div4(x) ((stbi_uc) ((x) >> 2))\n\nstatic stbi_uc *resample_row_1(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)\n{\n   STBI_NOTUSED(out);\n   STBI_NOTUSED(in_far);\n   STBI_NOTUSED(w);\n   STBI_NOTUSED(hs);\n   return in_near;\n}\n\nstatic stbi_uc* stbi__resample_row_v_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)\n{\n   // need to generate two samples vertically for every one in input\n   int i;\n   STBI_NOTUSED(hs);\n   for (i=0; i < w; ++i)\n      out[i] = stbi__div4(3*in_near[i] + in_far[i] + 2);\n   return out;\n}\n\nstatic stbi_uc*  stbi__resample_row_h_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)\n{\n   // need to generate two samples horizontally for every one in input\n   int i;\n   stbi_uc *input = in_near;\n\n   if (w == 1) {\n      // if only one sample, can't do any interpolation\n      out[0] = out[1] = input[0];\n      return out;\n   }\n\n   out[0] = input[0];\n   out[1] = stbi__div4(input[0]*3 + input[1] + 2);\n   for (i=1; i < w-1; ++i) {\n      int n = 3*input[i]+2;\n      out[i*2+0] = stbi__div4(n+input[i-1]);\n      out[i*2+1] = stbi__div4(n+input[i+1]);\n   }\n   out[i*2+0] = stbi__div4(input[w-2]*3 + input[w-1] + 2);\n   out[i*2+1] = input[w-1];\n\n   STBI_NOTUSED(in_far);\n   STBI_NOTUSED(hs);\n\n   return out;\n}\n\n#define stbi__div16(x) ((stbi_uc) ((x) >> 4))\n\nstatic stbi_uc *stbi__resample_row_hv_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)\n{\n   // need to generate 2x2 samples for every one in input\n   int i,t0,t1;\n   if (w == 1) {\n      out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);\n      return out;\n   }\n\n   t1 = 3*in_near[0] + in_far[0];\n   out[0] = stbi__div4(t1+2);\n   for (i=1; i < w; ++i) {\n      t0 = t1;\n      t1 = 3*in_near[i]+in_far[i];\n      out[i*2-1] = stbi__div16(3*t0 + t1 + 8);\n      out[i*2  ] = stbi__div16(3*t1 + t0 + 8);\n   }\n   out[w*2-1] = stbi__div4(t1+2);\n\n   STBI_NOTUSED(hs);\n\n   return out;\n}\n\n#if defined(STBI_SSE2) || defined(STBI_NEON)\nstatic stbi_uc *stbi__resample_row_hv_2_simd(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)\n{\n   // need to generate 2x2 samples for every one in input\n   int i=0,t0,t1;\n\n   if (w == 1) {\n      out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);\n      return out;\n   }\n\n   t1 = 3*in_near[0] + in_far[0];\n   // process groups of 8 pixels for as long as we can.\n   // note we can't handle the last pixel in a row in this loop\n   // because we need to handle the filter boundary conditions.\n   for (; i < ((w-1) & ~7); i += 8) {\n#if defined(STBI_SSE2)\n      // load and perform the vertical filtering pass\n      // this uses 3*x + y = 4*x + (y - x)\n      __m128i zero  = _mm_setzero_si128();\n      __m128i farb  = _mm_loadl_epi64((__m128i *) (in_far + i));\n      __m128i nearb = _mm_loadl_epi64((__m128i *) (in_near + i));\n      __m128i farw  = _mm_unpacklo_epi8(farb, zero);\n      __m128i nearw = _mm_unpacklo_epi8(nearb, zero);\n      __m128i diff  = _mm_sub_epi16(farw, nearw);\n      __m128i nears = _mm_slli_epi16(nearw, 2);\n      __m128i curr  = _mm_add_epi16(nears, diff); // current row\n\n      // horizontal filter works the same based on shifted vers of current\n      // row. \"prev\" is current row shifted right by 1 pixel; we need to\n      // insert the previous pixel value (from t1).\n      // \"next\" is current row shifted left by 1 pixel, with first pixel\n      // of next block of 8 pixels added in.\n      __m128i prv0 = _mm_slli_si128(curr, 2);\n      __m128i nxt0 = _mm_srli_si128(curr, 2);\n      __m128i prev = _mm_insert_epi16(prv0, t1, 0);\n      __m128i next = _mm_insert_epi16(nxt0, 3*in_near[i+8] + in_far[i+8], 7);\n\n      // horizontal filter, polyphase implementation since it's convenient:\n      // even pixels = 3*cur + prev = cur*4 + (prev - cur)\n      // odd  pixels = 3*cur + next = cur*4 + (next - cur)\n      // note the shared term.\n      __m128i bias  = _mm_set1_epi16(8);\n      __m128i curs = _mm_slli_epi16(curr, 2);\n      __m128i prvd = _mm_sub_epi16(prev, curr);\n      __m128i nxtd = _mm_sub_epi16(next, curr);\n      __m128i curb = _mm_add_epi16(curs, bias);\n      __m128i even = _mm_add_epi16(prvd, curb);\n      __m128i odd  = _mm_add_epi16(nxtd, curb);\n\n      // interleave even and odd pixels, then undo scaling.\n      __m128i int0 = _mm_unpacklo_epi16(even, odd);\n      __m128i int1 = _mm_unpackhi_epi16(even, odd);\n      __m128i de0  = _mm_srli_epi16(int0, 4);\n      __m128i de1  = _mm_srli_epi16(int1, 4);\n\n      // pack and write output\n      __m128i outv = _mm_packus_epi16(de0, de1);\n      _mm_storeu_si128((__m128i *) (out + i*2), outv);\n#elif defined(STBI_NEON)\n      // load and perform the vertical filtering pass\n      // this uses 3*x + y = 4*x + (y - x)\n      uint8x8_t farb  = vld1_u8(in_far + i);\n      uint8x8_t nearb = vld1_u8(in_near + i);\n      int16x8_t diff  = vreinterpretq_s16_u16(vsubl_u8(farb, nearb));\n      int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2));\n      int16x8_t curr  = vaddq_s16(nears, diff); // current row\n\n      // horizontal filter works the same based on shifted vers of current\n      // row. \"prev\" is current row shifted right by 1 pixel; we need to\n      // insert the previous pixel value (from t1).\n      // \"next\" is current row shifted left by 1 pixel, with first pixel\n      // of next block of 8 pixels added in.\n      int16x8_t prv0 = vextq_s16(curr, curr, 7);\n      int16x8_t nxt0 = vextq_s16(curr, curr, 1);\n      int16x8_t prev = vsetq_lane_s16(t1, prv0, 0);\n      int16x8_t next = vsetq_lane_s16(3*in_near[i+8] + in_far[i+8], nxt0, 7);\n\n      // horizontal filter, polyphase implementation since it's convenient:\n      // even pixels = 3*cur + prev = cur*4 + (prev - cur)\n      // odd  pixels = 3*cur + next = cur*4 + (next - cur)\n      // note the shared term.\n      int16x8_t curs = vshlq_n_s16(curr, 2);\n      int16x8_t prvd = vsubq_s16(prev, curr);\n      int16x8_t nxtd = vsubq_s16(next, curr);\n      int16x8_t even = vaddq_s16(curs, prvd);\n      int16x8_t odd  = vaddq_s16(curs, nxtd);\n\n      // undo scaling and round, then store with even/odd phases interleaved\n      uint8x8x2_t o;\n      o.val[0] = vqrshrun_n_s16(even, 4);\n      o.val[1] = vqrshrun_n_s16(odd,  4);\n      vst2_u8(out + i*2, o);\n#endif\n\n      // \"previous\" value for next iter\n      t1 = 3*in_near[i+7] + in_far[i+7];\n   }\n\n   t0 = t1;\n   t1 = 3*in_near[i] + in_far[i];\n   out[i*2] = stbi__div16(3*t1 + t0 + 8);\n\n   for (++i; i < w; ++i) {\n      t0 = t1;\n      t1 = 3*in_near[i]+in_far[i];\n      out[i*2-1] = stbi__div16(3*t0 + t1 + 8);\n      out[i*2  ] = stbi__div16(3*t1 + t0 + 8);\n   }\n   out[w*2-1] = stbi__div4(t1+2);\n\n   STBI_NOTUSED(hs);\n\n   return out;\n}\n#endif\n\nstatic stbi_uc *stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)\n{\n   // resample with nearest-neighbor\n   int i,j;\n   STBI_NOTUSED(in_far);\n   for (i=0; i < w; ++i)\n      for (j=0; j < hs; ++j)\n         out[i*hs+j] = in_near[i];\n   return out;\n}\n\n#ifdef STBI_JPEG_OLD\n// this is the same YCbCr-to-RGB calculation that stb_image has used\n// historically before the algorithm changes in 1.49\n#define float2fixed(x)  ((int) ((x) * 65536 + 0.5))\nstatic void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step)\n{\n   int i;\n   for (i=0; i < count; ++i) {\n      int y_fixed = (y[i] << 16) + 32768; // rounding\n      int r,g,b;\n      int cr = pcr[i] - 128;\n      int cb = pcb[i] - 128;\n      r = y_fixed + cr*float2fixed(1.40200f);\n      g = y_fixed - cr*float2fixed(0.71414f) - cb*float2fixed(0.34414f);\n      b = y_fixed                            + cb*float2fixed(1.77200f);\n      r >>= 16;\n      g >>= 16;\n      b >>= 16;\n      if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; }\n      if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; }\n      if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; }\n      out[0] = (stbi_uc)r;\n      out[1] = (stbi_uc)g;\n      out[2] = (stbi_uc)b;\n      out[3] = 255;\n      out += step;\n   }\n}\n#else\n// this is a reduced-precision calculation of YCbCr-to-RGB introduced\n// to make sure the code produces the same results in both SIMD and scalar\n#define float2fixed(x)  (((int) ((x) * 4096.0f + 0.5f)) << 8)\nstatic void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step)\n{\n   int i;\n   for (i=0; i < count; ++i) {\n      int y_fixed = (y[i] << 20) + (1<<19); // rounding\n      int r,g,b;\n      int cr = pcr[i] - 128;\n      int cb = pcb[i] - 128;\n      r = y_fixed +  cr* float2fixed(1.40200f);\n      g = y_fixed + (cr*-float2fixed(0.71414f)) + ((cb*-float2fixed(0.34414f)) & 0xffff0000);\n      b = y_fixed                               +   cb* float2fixed(1.77200f);\n      r >>= 20;\n      g >>= 20;\n      b >>= 20;\n      if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; }\n      if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; }\n      if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; }\n      out[0] = (stbi_uc)r;\n      out[1] = (stbi_uc)g;\n      out[2] = (stbi_uc)b;\n      out[3] = 255;\n      out += step;\n   }\n}\n#endif\n\n#if defined(STBI_SSE2) || defined(STBI_NEON)\nstatic void stbi__YCbCr_to_RGB_simd(stbi_uc *out, stbi_uc const *y, stbi_uc const *pcb, stbi_uc const *pcr, int count, int step)\n{\n   int i = 0;\n\n#ifdef STBI_SSE2\n   // step == 3 is pretty ugly on the final interleave, and i'm not convinced\n   // it's useful in practice (you wouldn't use it for textures, for example).\n   // so just accelerate step == 4 case.\n   if (step == 4) {\n      // this is a fairly straightforward implementation and not super-optimized.\n      __m128i signflip  = _mm_set1_epi8(-0x80);\n      __m128i cr_const0 = _mm_set1_epi16(   (short) ( 1.40200f*4096.0f+0.5f));\n      __m128i cr_const1 = _mm_set1_epi16( - (short) ( 0.71414f*4096.0f+0.5f));\n      __m128i cb_const0 = _mm_set1_epi16( - (short) ( 0.34414f*4096.0f+0.5f));\n      __m128i cb_const1 = _mm_set1_epi16(   (short) ( 1.77200f*4096.0f+0.5f));\n      __m128i y_bias = _mm_set1_epi8((char) (unsigned char) 128);\n      __m128i xw = _mm_set1_epi16(255); // alpha channel\n\n      for (; i+7 < count; i += 8) {\n         // load\n         __m128i y_bytes = _mm_loadl_epi64((__m128i *) (y+i));\n         __m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr+i));\n         __m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb+i));\n         __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip); // -128\n         __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip); // -128\n\n         // unpack to short (and left-shift cr, cb by 8)\n         __m128i yw  = _mm_unpacklo_epi8(y_bias, y_bytes);\n         __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased);\n         __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased);\n\n         // color transform\n         __m128i yws = _mm_srli_epi16(yw, 4);\n         __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw);\n         __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw);\n         __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1);\n         __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1);\n         __m128i rws = _mm_add_epi16(cr0, yws);\n         __m128i gwt = _mm_add_epi16(cb0, yws);\n         __m128i bws = _mm_add_epi16(yws, cb1);\n         __m128i gws = _mm_add_epi16(gwt, cr1);\n\n         // descale\n         __m128i rw = _mm_srai_epi16(rws, 4);\n         __m128i bw = _mm_srai_epi16(bws, 4);\n         __m128i gw = _mm_srai_epi16(gws, 4);\n\n         // back to byte, set up for transpose\n         __m128i brb = _mm_packus_epi16(rw, bw);\n         __m128i gxb = _mm_packus_epi16(gw, xw);\n\n         // transpose to interleave channels\n         __m128i t0 = _mm_unpacklo_epi8(brb, gxb);\n         __m128i t1 = _mm_unpackhi_epi8(brb, gxb);\n         __m128i o0 = _mm_unpacklo_epi16(t0, t1);\n         __m128i o1 = _mm_unpackhi_epi16(t0, t1);\n\n         // store\n         _mm_storeu_si128((__m128i *) (out + 0), o0);\n         _mm_storeu_si128((__m128i *) (out + 16), o1);\n         out += 32;\n      }\n   }\n#endif\n\n#ifdef STBI_NEON\n   // in this version, step=3 support would be easy to add. but is there demand?\n   if (step == 4) {\n      // this is a fairly straightforward implementation and not super-optimized.\n      uint8x8_t signflip = vdup_n_u8(0x80);\n      int16x8_t cr_const0 = vdupq_n_s16(   (short) ( 1.40200f*4096.0f+0.5f));\n      int16x8_t cr_const1 = vdupq_n_s16( - (short) ( 0.71414f*4096.0f+0.5f));\n      int16x8_t cb_const0 = vdupq_n_s16( - (short) ( 0.34414f*4096.0f+0.5f));\n      int16x8_t cb_const1 = vdupq_n_s16(   (short) ( 1.77200f*4096.0f+0.5f));\n\n      for (; i+7 < count; i += 8) {\n         // load\n         uint8x8_t y_bytes  = vld1_u8(y + i);\n         uint8x8_t cr_bytes = vld1_u8(pcr + i);\n         uint8x8_t cb_bytes = vld1_u8(pcb + i);\n         int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip));\n         int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip));\n\n         // expand to s16\n         int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4));\n         int16x8_t crw = vshll_n_s8(cr_biased, 7);\n         int16x8_t cbw = vshll_n_s8(cb_biased, 7);\n\n         // color transform\n         int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0);\n         int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0);\n         int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1);\n         int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1);\n         int16x8_t rws = vaddq_s16(yws, cr0);\n         int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1);\n         int16x8_t bws = vaddq_s16(yws, cb1);\n\n         // undo scaling, round, convert to byte\n         uint8x8x4_t o;\n         o.val[0] = vqrshrun_n_s16(rws, 4);\n         o.val[1] = vqrshrun_n_s16(gws, 4);\n         o.val[2] = vqrshrun_n_s16(bws, 4);\n         o.val[3] = vdup_n_u8(255);\n\n         // store, interleaving r/g/b/a\n         vst4_u8(out, o);\n         out += 8*4;\n      }\n   }\n#endif\n\n   for (; i < count; ++i) {\n      int y_fixed = (y[i] << 20) + (1<<19); // rounding\n      int r,g,b;\n      int cr = pcr[i] - 128;\n      int cb = pcb[i] - 128;\n      r = y_fixed + cr* float2fixed(1.40200f);\n      g = y_fixed + cr*-float2fixed(0.71414f) + ((cb*-float2fixed(0.34414f)) & 0xffff0000);\n      b = y_fixed                             +   cb* float2fixed(1.77200f);\n      r >>= 20;\n      g >>= 20;\n      b >>= 20;\n      if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; }\n      if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; }\n      if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; }\n      out[0] = (stbi_uc)r;\n      out[1] = (stbi_uc)g;\n      out[2] = (stbi_uc)b;\n      out[3] = 255;\n      out += step;\n   }\n}\n#endif\n\n// set up the kernels\nstatic void stbi__setup_jpeg(stbi__jpeg *j)\n{\n   j->idct_block_kernel = stbi__idct_block;\n   j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row;\n   j->resample_row_hv_2_kernel = stbi__resample_row_hv_2;\n\n#ifdef STBI_SSE2\n   if (stbi__sse2_available()) {\n      j->idct_block_kernel = stbi__idct_simd;\n      #ifndef STBI_JPEG_OLD\n      j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;\n      #endif\n      j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;\n   }\n#endif\n\n#ifdef STBI_NEON\n   j->idct_block_kernel = stbi__idct_simd;\n   #ifndef STBI_JPEG_OLD\n   j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;\n   #endif\n   j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;\n#endif\n}\n\n// clean up the temporary component buffers\nstatic void stbi__cleanup_jpeg(stbi__jpeg *j)\n{\n   int i;\n   for (i=0; i < j->s->img_n; ++i) {\n      if (j->img_comp[i].raw_data) {\n         STBI_FREE(j->img_comp[i].raw_data);\n         j->img_comp[i].raw_data = NULL;\n         j->img_comp[i].data = NULL;\n      }\n      if (j->img_comp[i].raw_coeff) {\n         STBI_FREE(j->img_comp[i].raw_coeff);\n         j->img_comp[i].raw_coeff = 0;\n         j->img_comp[i].coeff = 0;\n      }\n      if (j->img_comp[i].linebuf) {\n         STBI_FREE(j->img_comp[i].linebuf);\n         j->img_comp[i].linebuf = NULL;\n      }\n   }\n}\n\ntypedef struct\n{\n   resample_row_func resample;\n   stbi_uc *line0,*line1;\n   int hs,vs;   // expansion factor in each axis\n   int w_lores; // horizontal pixels pre-expansion\n   int ystep;   // how far through vertical expansion we are\n   int ypos;    // which pre-expansion row we're on\n} stbi__resample;\n\nstatic stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp, int req_comp)\n{\n   int n, decode_n;\n   z->s->img_n = 0; // make stbi__cleanup_jpeg safe\n\n   // validate req_comp\n   if (req_comp < 0 || req_comp > 4) return stbi__errpuc(\"bad req_comp\", \"Internal error\");\n\n   // load a jpeg image from whichever source, but leave in YCbCr format\n   if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z); return NULL; }\n\n   // determine actual number of components to generate\n   n = req_comp ? req_comp : z->s->img_n;\n\n   if (z->s->img_n == 3 && n < 3)\n      decode_n = 1;\n   else\n      decode_n = z->s->img_n;\n\n   // resample and color-convert\n   {\n      int k;\n      unsigned int i,j;\n      stbi_uc *output;\n      stbi_uc *coutput[4];\n\n      stbi__resample res_comp[4];\n\n      for (k=0; k < decode_n; ++k) {\n         stbi__resample *r = &res_comp[k];\n\n         // allocate line buffer big enough for upsampling off the edges\n         // with upsample factor of 4\n         z->img_comp[k].linebuf = (stbi_uc *) stbi__malloc(z->s->img_x + 3);\n         if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z); return stbi__errpuc(\"outofmem\", \"Out of memory\"); }\n\n         r->hs      = z->img_h_max / z->img_comp[k].h;\n         r->vs      = z->img_v_max / z->img_comp[k].v;\n         r->ystep   = r->vs >> 1;\n         r->w_lores = (z->s->img_x + r->hs-1) / r->hs;\n         r->ypos    = 0;\n         r->line0   = r->line1 = z->img_comp[k].data;\n\n         if      (r->hs == 1 && r->vs == 1) r->resample = resample_row_1;\n         else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2;\n         else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2;\n         else if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel;\n         else                               r->resample = stbi__resample_row_generic;\n      }\n\n      // can't error after this so, this is safe\n      output = (stbi_uc *) stbi__malloc(n * z->s->img_x * z->s->img_y + 1);\n      if (!output) { stbi__cleanup_jpeg(z); return stbi__errpuc(\"outofmem\", \"Out of memory\"); }\n\n      // now go ahead and resample\n      for (j=0; j < z->s->img_y; ++j) {\n         stbi_uc *out = output + n * z->s->img_x * j;\n         for (k=0; k < decode_n; ++k) {\n            stbi__resample *r = &res_comp[k];\n            int y_bot = r->ystep >= (r->vs >> 1);\n            coutput[k] = r->resample(z->img_comp[k].linebuf,\n                                     y_bot ? r->line1 : r->line0,\n                                     y_bot ? r->line0 : r->line1,\n                                     r->w_lores, r->hs);\n            if (++r->ystep >= r->vs) {\n               r->ystep = 0;\n               r->line0 = r->line1;\n               if (++r->ypos < z->img_comp[k].y)\n                  r->line1 += z->img_comp[k].w2;\n            }\n         }\n         if (n >= 3) {\n            stbi_uc *y = coutput[0];\n            if (z->s->img_n == 3) {\n               z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);\n            } else\n               for (i=0; i < z->s->img_x; ++i) {\n                  out[0] = out[1] = out[2] = y[i];\n                  out[3] = 255; // not used if n==3\n                  out += n;\n               }\n         } else {\n            stbi_uc *y = coutput[0];\n            if (n == 1)\n               for (i=0; i < z->s->img_x; ++i) out[i] = y[i];\n            else\n               for (i=0; i < z->s->img_x; ++i) *out++ = y[i], *out++ = 255;\n         }\n      }\n      stbi__cleanup_jpeg(z);\n      *out_x = z->s->img_x;\n      *out_y = z->s->img_y;\n      if (comp) *comp  = z->s->img_n; // report original components, not output\n      return output;\n   }\n}\n\nstatic unsigned char *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp)\n{\n   stbi__jpeg j;\n   j.s = s;\n   stbi__setup_jpeg(&j);\n   return load_jpeg_image(&j, x,y,comp,req_comp);\n}\n\nstatic int stbi__jpeg_test(stbi__context *s)\n{\n   int r;\n   stbi__jpeg j;\n   j.s = s;\n   stbi__setup_jpeg(&j);\n   r = stbi__decode_jpeg_header(&j, STBI__SCAN_type);\n   stbi__rewind(s);\n   return r;\n}\n\nstatic int stbi__jpeg_info_raw(stbi__jpeg *j, int *x, int *y, int *comp)\n{\n   if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) {\n      stbi__rewind( j->s );\n      return 0;\n   }\n   if (x) *x = j->s->img_x;\n   if (y) *y = j->s->img_y;\n   if (comp) *comp = j->s->img_n;\n   return 1;\n}\n\nstatic int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp)\n{\n   stbi__jpeg j;\n   j.s = s;\n   return stbi__jpeg_info_raw(&j, x, y, comp);\n}\n#endif\n\n// public domain zlib decode    v0.2  Sean Barrett 2006-11-18\n//    simple implementation\n//      - all input must be provided in an upfront buffer\n//      - all output is written to a single output buffer (can malloc/realloc)\n//    performance\n//      - fast huffman\n\n#ifndef STBI_NO_ZLIB\n\n// fast-way is faster to check than jpeg huffman, but slow way is slower\n#define STBI__ZFAST_BITS  9 // accelerate all cases in default tables\n#define STBI__ZFAST_MASK  ((1 << STBI__ZFAST_BITS) - 1)\n\n// zlib-style huffman encoding\n// (jpegs packs from left, zlib from right, so can't share code)\ntypedef struct\n{\n   stbi__uint16 fast[1 << STBI__ZFAST_BITS];\n   stbi__uint16 firstcode[16];\n   int maxcode[17];\n   stbi__uint16 firstsymbol[16];\n   stbi_uc  size[288];\n   stbi__uint16 value[288];\n} stbi__zhuffman;\n\nstbi_inline static int stbi__bitreverse16(int n)\n{\n  n = ((n & 0xAAAA) >>  1) | ((n & 0x5555) << 1);\n  n = ((n & 0xCCCC) >>  2) | ((n & 0x3333) << 2);\n  n = ((n & 0xF0F0) >>  4) | ((n & 0x0F0F) << 4);\n  n = ((n & 0xFF00) >>  8) | ((n & 0x00FF) << 8);\n  return n;\n}\n\nstbi_inline static int stbi__bit_reverse(int v, int bits)\n{\n   STBI_ASSERT(bits <= 16);\n   // to bit reverse n bits, reverse 16 and shift\n   // e.g. 11 bits, bit reverse and shift away 5\n   return stbi__bitreverse16(v) >> (16-bits);\n}\n\nstatic int stbi__zbuild_huffman(stbi__zhuffman *z, stbi_uc *sizelist, int num)\n{\n   int i,k=0;\n   int code, next_code[16], sizes[17];\n\n   // DEFLATE spec for generating codes\n   memset(sizes, 0, sizeof(sizes));\n   memset(z->fast, 0, sizeof(z->fast));\n   for (i=0; i < num; ++i)\n      ++sizes[sizelist[i]];\n   sizes[0] = 0;\n   for (i=1; i < 16; ++i)\n      if (sizes[i] > (1 << i))\n         return stbi__err(\"bad sizes\", \"Corrupt PNG\");\n   code = 0;\n   for (i=1; i < 16; ++i) {\n      next_code[i] = code;\n      z->firstcode[i] = (stbi__uint16) code;\n      z->firstsymbol[i] = (stbi__uint16) k;\n      code = (code + sizes[i]);\n      if (sizes[i])\n         if (code-1 >= (1 << i)) return stbi__err(\"bad codelengths\",\"Corrupt PNG\");\n      z->maxcode[i] = code << (16-i); // preshift for inner loop\n      code <<= 1;\n      k += sizes[i];\n   }\n   z->maxcode[16] = 0x10000; // sentinel\n   for (i=0; i < num; ++i) {\n      int s = sizelist[i];\n      if (s) {\n         int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s];\n         stbi__uint16 fastv = (stbi__uint16) ((s << 9) | i);\n         z->size [c] = (stbi_uc     ) s;\n         z->value[c] = (stbi__uint16) i;\n         if (s <= STBI__ZFAST_BITS) {\n            int j = stbi__bit_reverse(next_code[s],s);\n            while (j < (1 << STBI__ZFAST_BITS)) {\n               z->fast[j] = fastv;\n               j += (1 << s);\n            }\n         }\n         ++next_code[s];\n      }\n   }\n   return 1;\n}\n\n// zlib-from-memory implementation for PNG reading\n//    because PNG allows splitting the zlib stream arbitrarily,\n//    and it's annoying structurally to have PNG call ZLIB call PNG,\n//    we require PNG read all the IDATs and combine them into a single\n//    memory buffer\n\ntypedef struct\n{\n   stbi_uc *zbuffer, *zbuffer_end;\n   int num_bits;\n   stbi__uint32 code_buffer;\n\n   char *zout;\n   char *zout_start;\n   char *zout_end;\n   int   z_expandable;\n\n   stbi__zhuffman z_length, z_distance;\n} stbi__zbuf;\n\nstbi_inline static stbi_uc stbi__zget8(stbi__zbuf *z)\n{\n   if (z->zbuffer >= z->zbuffer_end) return 0;\n   return *z->zbuffer++;\n}\n\nstatic void stbi__fill_bits(stbi__zbuf *z)\n{\n   do {\n      STBI_ASSERT(z->code_buffer < (1U << z->num_bits));\n      z->code_buffer |= (unsigned int) stbi__zget8(z) << z->num_bits;\n      z->num_bits += 8;\n   } while (z->num_bits <= 24);\n}\n\nstbi_inline static unsigned int stbi__zreceive(stbi__zbuf *z, int n)\n{\n   unsigned int k;\n   if (z->num_bits < n) stbi__fill_bits(z);\n   k = z->code_buffer & ((1 << n) - 1);\n   z->code_buffer >>= n;\n   z->num_bits -= n;\n   return k;\n}\n\nstatic int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z)\n{\n   int b,s,k;\n   // not resolved by fast table, so compute it the slow way\n   // use jpeg approach, which requires MSbits at top\n   k = stbi__bit_reverse(a->code_buffer, 16);\n   for (s=STBI__ZFAST_BITS+1; ; ++s)\n      if (k < z->maxcode[s])\n         break;\n   if (s == 16) return -1; // invalid code!\n   // code size is s, so:\n   b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s];\n   STBI_ASSERT(z->size[b] == s);\n   a->code_buffer >>= s;\n   a->num_bits -= s;\n   return z->value[b];\n}\n\nstbi_inline static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z)\n{\n   int b,s;\n   if (a->num_bits < 16) stbi__fill_bits(a);\n   b = z->fast[a->code_buffer & STBI__ZFAST_MASK];\n   if (b) {\n      s = b >> 9;\n      a->code_buffer >>= s;\n      a->num_bits -= s;\n      return b & 511;\n   }\n   return stbi__zhuffman_decode_slowpath(a, z);\n}\n\nstatic int stbi__zexpand(stbi__zbuf *z, char *zout, int n)  // need to make room for n bytes\n{\n   char *q;\n   int cur, limit;\n   z->zout = zout;\n   if (!z->z_expandable) return stbi__err(\"output buffer limit\",\"Corrupt PNG\");\n   cur   = (int) (z->zout     - z->zout_start);\n   limit = (int) (z->zout_end - z->zout_start);\n   while (cur + n > limit)\n      limit *= 2;\n   q = (char *) STBI_REALLOC(z->zout_start, limit);\n   if (q == NULL) return stbi__err(\"outofmem\", \"Out of memory\");\n   z->zout_start = q;\n   z->zout       = q + cur;\n   z->zout_end   = q + limit;\n   return 1;\n}\n\nstatic int stbi__zlength_base[31] = {\n   3,4,5,6,7,8,9,10,11,13,\n   15,17,19,23,27,31,35,43,51,59,\n   67,83,99,115,131,163,195,227,258,0,0 };\n\nstatic int stbi__zlength_extra[31]=\n{ 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 };\n\nstatic int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,\n257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0};\n\nstatic int stbi__zdist_extra[32] =\n{ 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13};\n\nstatic int stbi__parse_huffman_block(stbi__zbuf *a)\n{\n   char *zout = a->zout;\n   for(;;) {\n      int z = stbi__zhuffman_decode(a, &a->z_length);\n      if (z < 256) {\n         if (z < 0) return stbi__err(\"bad huffman code\",\"Corrupt PNG\"); // error in huffman codes\n         if (zout >= a->zout_end) {\n            if (!stbi__zexpand(a, zout, 1)) return 0;\n            zout = a->zout;\n         }\n         *zout++ = (char) z;\n      } else {\n         stbi_uc *p;\n         int len,dist;\n         if (z == 256) {\n            a->zout = zout;\n            return 1;\n         }\n         z -= 257;\n         len = stbi__zlength_base[z];\n         if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]);\n         z = stbi__zhuffman_decode(a, &a->z_distance);\n         if (z < 0) return stbi__err(\"bad huffman code\",\"Corrupt PNG\");\n         dist = stbi__zdist_base[z];\n         if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]);\n         if (zout - a->zout_start < dist) return stbi__err(\"bad dist\",\"Corrupt PNG\");\n         if (zout + len > a->zout_end) {\n            if (!stbi__zexpand(a, zout, len)) return 0;\n            zout = a->zout;\n         }\n         p = (stbi_uc *) (zout - dist);\n         if (dist == 1) { // run of one byte; common in images.\n            stbi_uc v = *p;\n            if (len) { do *zout++ = v; while (--len); }\n         } else {\n            if (len) { do *zout++ = *p++; while (--len); }\n         }\n      }\n   }\n}\n\nstatic int stbi__compute_huffman_codes(stbi__zbuf *a)\n{\n   static stbi_uc length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 };\n   stbi__zhuffman z_codelength;\n   stbi_uc lencodes[286+32+137];//padding for maximum single op\n   stbi_uc codelength_sizes[19];\n   int i,n;\n\n   int hlit  = stbi__zreceive(a,5) + 257;\n   int hdist = stbi__zreceive(a,5) + 1;\n   int hclen = stbi__zreceive(a,4) + 4;\n\n   memset(codelength_sizes, 0, sizeof(codelength_sizes));\n   for (i=0; i < hclen; ++i) {\n      int s = stbi__zreceive(a,3);\n      codelength_sizes[length_dezigzag[i]] = (stbi_uc) s;\n   }\n   if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0;\n\n   n = 0;\n   while (n < hlit + hdist) {\n      int c = stbi__zhuffman_decode(a, &z_codelength);\n      if (c < 0 || c >= 19) return stbi__err(\"bad codelengths\", \"Corrupt PNG\");\n      if (c < 16)\n         lencodes[n++] = (stbi_uc) c;\n      else if (c == 16) {\n         c = stbi__zreceive(a,2)+3;\n         memset(lencodes+n, lencodes[n-1], c);\n         n += c;\n      } else if (c == 17) {\n         c = stbi__zreceive(a,3)+3;\n         memset(lencodes+n, 0, c);\n         n += c;\n      } else {\n         STBI_ASSERT(c == 18);\n         c = stbi__zreceive(a,7)+11;\n         memset(lencodes+n, 0, c);\n         n += c;\n      }\n   }\n   if (n != hlit+hdist) return stbi__err(\"bad codelengths\",\"Corrupt PNG\");\n   if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit)) return 0;\n   if (!stbi__zbuild_huffman(&a->z_distance, lencodes+hlit, hdist)) return 0;\n   return 1;\n}\n\nstatic int stbi__parse_uncomperssed_block(stbi__zbuf *a)\n{\n   stbi_uc header[4];\n   int len,nlen,k;\n   if (a->num_bits & 7)\n      stbi__zreceive(a, a->num_bits & 7); // discard\n   // drain the bit-packed data into header\n   k = 0;\n   while (a->num_bits > 0) {\n      header[k++] = (stbi_uc) (a->code_buffer & 255); // suppress MSVC run-time check\n      a->code_buffer >>= 8;\n      a->num_bits -= 8;\n   }\n   STBI_ASSERT(a->num_bits == 0);\n   // now fill header the normal way\n   while (k < 4)\n      header[k++] = stbi__zget8(a);\n   len  = header[1] * 256 + header[0];\n   nlen = header[3] * 256 + header[2];\n   if (nlen != (len ^ 0xffff)) return stbi__err(\"zlib corrupt\",\"Corrupt PNG\");\n   if (a->zbuffer + len > a->zbuffer_end) return stbi__err(\"read past buffer\",\"Corrupt PNG\");\n   if (a->zout + len > a->zout_end)\n      if (!stbi__zexpand(a, a->zout, len)) return 0;\n   memcpy(a->zout, a->zbuffer, len);\n   a->zbuffer += len;\n   a->zout += len;\n   return 1;\n}\n\nstatic int stbi__parse_zlib_header(stbi__zbuf *a)\n{\n   int cmf   = stbi__zget8(a);\n   int cm    = cmf & 15;\n   /* int cinfo = cmf >> 4; */\n   int flg   = stbi__zget8(a);\n   if ((cmf*256+flg) % 31 != 0) return stbi__err(\"bad zlib header\",\"Corrupt PNG\"); // zlib spec\n   if (flg & 32) return stbi__err(\"no preset dict\",\"Corrupt PNG\"); // preset dictionary not allowed in png\n   if (cm != 8) return stbi__err(\"bad compression\",\"Corrupt PNG\"); // DEFLATE required for png\n   // window = 1 << (8 + cinfo)... but who cares, we fully buffer output\n   return 1;\n}\n\n// @TODO: should statically initialize these for optimal thread safety\nstatic stbi_uc stbi__zdefault_length[288], stbi__zdefault_distance[32];\nstatic void stbi__init_zdefaults(void)\n{\n   int i;   // use <= to match clearly with spec\n   for (i=0; i <= 143; ++i)     stbi__zdefault_length[i]   = 8;\n   for (   ; i <= 255; ++i)     stbi__zdefault_length[i]   = 9;\n   for (   ; i <= 279; ++i)     stbi__zdefault_length[i]   = 7;\n   for (   ; i <= 287; ++i)     stbi__zdefault_length[i]   = 8;\n\n   for (i=0; i <=  31; ++i)     stbi__zdefault_distance[i] = 5;\n}\n\nstatic int stbi__parse_zlib(stbi__zbuf *a, int parse_header)\n{\n   int final, type;\n   if (parse_header)\n      if (!stbi__parse_zlib_header(a)) return 0;\n   a->num_bits = 0;\n   a->code_buffer = 0;\n   do {\n      final = stbi__zreceive(a,1);\n      type = stbi__zreceive(a,2);\n      if (type == 0) {\n         if (!stbi__parse_uncomperssed_block(a)) return 0;\n      } else if (type == 3) {\n         return 0;\n      } else {\n         if (type == 1) {\n            // use fixed code lengths\n            if (!stbi__zdefault_distance[31]) stbi__init_zdefaults();\n            if (!stbi__zbuild_huffman(&a->z_length  , stbi__zdefault_length  , 288)) return 0;\n            if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance,  32)) return 0;\n         } else {\n            if (!stbi__compute_huffman_codes(a)) return 0;\n         }\n         if (!stbi__parse_huffman_block(a)) return 0;\n      }\n   } while (!final);\n   return 1;\n}\n\nstatic int stbi__do_zlib(stbi__zbuf *a, char *obuf, int olen, int exp, int parse_header)\n{\n   a->zout_start = obuf;\n   a->zout       = obuf;\n   a->zout_end   = obuf + olen;\n   a->z_expandable = exp;\n\n   return stbi__parse_zlib(a, parse_header);\n}\n\nSTBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen)\n{\n   stbi__zbuf a;\n   char *p = (char *) stbi__malloc(initial_size);\n   if (p == NULL) return NULL;\n   a.zbuffer = (stbi_uc *) buffer;\n   a.zbuffer_end = (stbi_uc *) buffer + len;\n   if (stbi__do_zlib(&a, p, initial_size, 1, 1)) {\n      if (outlen) *outlen = (int) (a.zout - a.zout_start);\n      return a.zout_start;\n   } else {\n      STBI_FREE(a.zout_start);\n      return NULL;\n   }\n}\n\nSTBIDEF char *stbi_zlib_decode_malloc(char const *buffer, int len, int *outlen)\n{\n   return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen);\n}\n\nSTBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header)\n{\n   stbi__zbuf a;\n   char *p = (char *) stbi__malloc(initial_size);\n   if (p == NULL) return NULL;\n   a.zbuffer = (stbi_uc *) buffer;\n   a.zbuffer_end = (stbi_uc *) buffer + len;\n   if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) {\n      if (outlen) *outlen = (int) (a.zout - a.zout_start);\n      return a.zout_start;\n   } else {\n      STBI_FREE(a.zout_start);\n      return NULL;\n   }\n}\n\nSTBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, char const *ibuffer, int ilen)\n{\n   stbi__zbuf a;\n   a.zbuffer = (stbi_uc *) ibuffer;\n   a.zbuffer_end = (stbi_uc *) ibuffer + ilen;\n   if (stbi__do_zlib(&a, obuffer, olen, 0, 1))\n      return (int) (a.zout - a.zout_start);\n   else\n      return -1;\n}\n\nSTBIDEF char *stbi_zlib_decode_noheader_malloc(char const *buffer, int len, int *outlen)\n{\n   stbi__zbuf a;\n   char *p = (char *) stbi__malloc(16384);\n   if (p == NULL) return NULL;\n   a.zbuffer = (stbi_uc *) buffer;\n   a.zbuffer_end = (stbi_uc *) buffer+len;\n   if (stbi__do_zlib(&a, p, 16384, 1, 0)) {\n      if (outlen) *outlen = (int) (a.zout - a.zout_start);\n      return a.zout_start;\n   } else {\n      STBI_FREE(a.zout_start);\n      return NULL;\n   }\n}\n\nSTBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen)\n{\n   stbi__zbuf a;\n   a.zbuffer = (stbi_uc *) ibuffer;\n   a.zbuffer_end = (stbi_uc *) ibuffer + ilen;\n   if (stbi__do_zlib(&a, obuffer, olen, 0, 0))\n      return (int) (a.zout - a.zout_start);\n   else\n      return -1;\n}\n#endif\n\n// public domain \"baseline\" PNG decoder   v0.10  Sean Barrett 2006-11-18\n//    simple implementation\n//      - only 8-bit samples\n//      - no CRC checking\n//      - allocates lots of intermediate memory\n//        - avoids problem of streaming data between subsystems\n//        - avoids explicit window management\n//    performance\n//      - uses stb_zlib, a PD zlib implementation with fast huffman decoding\n\n#ifndef STBI_NO_PNG\ntypedef struct\n{\n   stbi__uint32 length;\n   stbi__uint32 type;\n} stbi__pngchunk;\n\nstatic stbi__pngchunk stbi__get_chunk_header(stbi__context *s)\n{\n   stbi__pngchunk c;\n   c.length = stbi__get32be(s);\n   c.type   = stbi__get32be(s);\n   return c;\n}\n\nstatic int stbi__check_png_header(stbi__context *s)\n{\n   static stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 };\n   int i;\n   for (i=0; i < 8; ++i)\n      if (stbi__get8(s) != png_sig[i]) return stbi__err(\"bad png sig\",\"Not a PNG\");\n   return 1;\n}\n\ntypedef struct\n{\n   stbi__context *s;\n   stbi_uc *idata, *expanded, *out;\n} stbi__png;\n\n\nenum {\n   STBI__F_none=0,\n   STBI__F_sub=1,\n   STBI__F_up=2,\n   STBI__F_avg=3,\n   STBI__F_paeth=4,\n   // synthetic filters used for first scanline to avoid needing a dummy row of 0s\n   STBI__F_avg_first,\n   STBI__F_paeth_first\n};\n\nstatic stbi_uc first_row_filter[5] =\n{\n   STBI__F_none,\n   STBI__F_sub,\n   STBI__F_none,\n   STBI__F_avg_first,\n   STBI__F_paeth_first\n};\n\nstatic int stbi__paeth(int a, int b, int c)\n{\n   int p = a + b - c;\n   int pa = abs(p-a);\n   int pb = abs(p-b);\n   int pc = abs(p-c);\n   if (pa <= pb && pa <= pc) return a;\n   if (pb <= pc) return b;\n   return c;\n}\n\nstatic stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 };\n\n// create the png data from post-deflated data\nstatic int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 raw_len, int out_n, stbi__uint32 x, stbi__uint32 y, int depth, int color)\n{\n   stbi__context *s = a->s;\n   stbi__uint32 i,j,stride = x*out_n;\n   stbi__uint32 img_len, img_width_bytes;\n   int k;\n   int img_n = s->img_n; // copy it into a local for later\n\n   STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1);\n   a->out = (stbi_uc *) stbi__malloc(x * y * out_n); // extra bytes to write off the end into\n   if (!a->out) return stbi__err(\"outofmem\", \"Out of memory\");\n\n   img_width_bytes = (((img_n * x * depth) + 7) >> 3);\n   img_len = (img_width_bytes + 1) * y;\n   if (s->img_x == x && s->img_y == y) {\n      if (raw_len != img_len) return stbi__err(\"not enough pixels\",\"Corrupt PNG\");\n   } else { // interlaced:\n      if (raw_len < img_len) return stbi__err(\"not enough pixels\",\"Corrupt PNG\");\n   }\n\n   for (j=0; j < y; ++j) {\n      stbi_uc *cur = a->out + stride*j;\n      stbi_uc *prior = cur - stride;\n      int filter = *raw++;\n      int filter_bytes = img_n;\n      int width = x;\n      if (filter > 4)\n         return stbi__err(\"invalid filter\",\"Corrupt PNG\");\n\n      if (depth < 8) {\n         STBI_ASSERT(img_width_bytes <= x);\n         cur += x*out_n - img_width_bytes; // store output to the rightmost img_len bytes, so we can decode in place\n         filter_bytes = 1;\n         width = img_width_bytes;\n      }\n\n      // if first row, use special filter that doesn't sample previous row\n      if (j == 0) filter = first_row_filter[filter];\n\n      // handle first byte explicitly\n      for (k=0; k < filter_bytes; ++k) {\n         switch (filter) {\n            case STBI__F_none       : cur[k] = raw[k]; break;\n            case STBI__F_sub        : cur[k] = raw[k]; break;\n            case STBI__F_up         : cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break;\n            case STBI__F_avg        : cur[k] = STBI__BYTECAST(raw[k] + (prior[k]>>1)); break;\n            case STBI__F_paeth      : cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(0,prior[k],0)); break;\n            case STBI__F_avg_first  : cur[k] = raw[k]; break;\n            case STBI__F_paeth_first: cur[k] = raw[k]; break;\n         }\n      }\n\n      if (depth == 8) {\n         if (img_n != out_n)\n            cur[img_n] = 255; // first pixel\n         raw += img_n;\n         cur += out_n;\n         prior += out_n;\n      } else {\n         raw += 1;\n         cur += 1;\n         prior += 1;\n      }\n\n      // this is a little gross, so that we don't switch per-pixel or per-component\n      if (depth < 8 || img_n == out_n) {\n         int nk = (width - 1)*img_n;\n         #define CASE(f) \\\n             case f:     \\\n                for (k=0; k < nk; ++k)\n         switch (filter) {\n            // \"none\" filter turns into a memcpy here; make that explicit.\n            case STBI__F_none:         memcpy(cur, raw, nk); break;\n            CASE(STBI__F_sub)          cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]); break;\n            CASE(STBI__F_up)           cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break;\n            CASE(STBI__F_avg)          cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1)); break;\n            CASE(STBI__F_paeth)        cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],prior[k],prior[k-filter_bytes])); break;\n            CASE(STBI__F_avg_first)    cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1)); break;\n            CASE(STBI__F_paeth_first)  cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],0,0)); break;\n         }\n         #undef CASE\n         raw += nk;\n      } else {\n         STBI_ASSERT(img_n+1 == out_n);\n         #define CASE(f) \\\n             case f:     \\\n                for (i=x-1; i >= 1; --i, cur[img_n]=255,raw+=img_n,cur+=out_n,prior+=out_n) \\\n                   for (k=0; k < img_n; ++k)\n         switch (filter) {\n            CASE(STBI__F_none)         cur[k] = raw[k]; break;\n            CASE(STBI__F_sub)          cur[k] = STBI__BYTECAST(raw[k] + cur[k-out_n]); break;\n            CASE(STBI__F_up)           cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break;\n            CASE(STBI__F_avg)          cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-out_n])>>1)); break;\n            CASE(STBI__F_paeth)        cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-out_n],prior[k],prior[k-out_n])); break;\n            CASE(STBI__F_avg_first)    cur[k] = STBI__BYTECAST(raw[k] + (cur[k-out_n] >> 1)); break;\n            CASE(STBI__F_paeth_first)  cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-out_n],0,0)); break;\n         }\n         #undef CASE\n      }\n   }\n\n   // we make a separate pass to expand bits to pixels; for performance,\n   // this could run two scanlines behind the above code, so it won't\n   // intefere with filtering but will still be in the cache.\n   if (depth < 8) {\n      for (j=0; j < y; ++j) {\n         stbi_uc *cur = a->out + stride*j;\n         stbi_uc *in  = a->out + stride*j + x*out_n - img_width_bytes;\n         // unpack 1/2/4-bit into a 8-bit buffer. allows us to keep the common 8-bit path optimal at minimal cost for 1/2/4-bit\n         // png guarante byte alignment, if width is not multiple of 8/4/2 we'll decode dummy trailing data that will be skipped in the later loop\n         stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1; // scale grayscale values to 0..255 range\n\n         // note that the final byte might overshoot and write more data than desired.\n         // we can allocate enough data that this never writes out of memory, but it\n         // could also overwrite the next scanline. can it overwrite non-empty data\n         // on the next scanline? yes, consider 1-pixel-wide scanlines with 1-bit-per-pixel.\n         // so we need to explicitly clamp the final ones\n\n         if (depth == 4) {\n            for (k=x*img_n; k >= 2; k-=2, ++in) {\n               *cur++ = scale * ((*in >> 4)       );\n               *cur++ = scale * ((*in     ) & 0x0f);\n            }\n            if (k > 0) *cur++ = scale * ((*in >> 4)       );\n         } else if (depth == 2) {\n            for (k=x*img_n; k >= 4; k-=4, ++in) {\n               *cur++ = scale * ((*in >> 6)       );\n               *cur++ = scale * ((*in >> 4) & 0x03);\n               *cur++ = scale * ((*in >> 2) & 0x03);\n               *cur++ = scale * ((*in     ) & 0x03);\n            }\n            if (k > 0) *cur++ = scale * ((*in >> 6)       );\n            if (k > 1) *cur++ = scale * ((*in >> 4) & 0x03);\n            if (k > 2) *cur++ = scale * ((*in >> 2) & 0x03);\n         } else if (depth == 1) {\n            for (k=x*img_n; k >= 8; k-=8, ++in) {\n               *cur++ = scale * ((*in >> 7)       );\n               *cur++ = scale * ((*in >> 6) & 0x01);\n               *cur++ = scale * ((*in >> 5) & 0x01);\n               *cur++ = scale * ((*in >> 4) & 0x01);\n               *cur++ = scale * ((*in >> 3) & 0x01);\n               *cur++ = scale * ((*in >> 2) & 0x01);\n               *cur++ = scale * ((*in >> 1) & 0x01);\n               *cur++ = scale * ((*in     ) & 0x01);\n            }\n            if (k > 0) *cur++ = scale * ((*in >> 7)       );\n            if (k > 1) *cur++ = scale * ((*in >> 6) & 0x01);\n            if (k > 2) *cur++ = scale * ((*in >> 5) & 0x01);\n            if (k > 3) *cur++ = scale * ((*in >> 4) & 0x01);\n            if (k > 4) *cur++ = scale * ((*in >> 3) & 0x01);\n            if (k > 5) *cur++ = scale * ((*in >> 2) & 0x01);\n            if (k > 6) *cur++ = scale * ((*in >> 1) & 0x01);\n         }\n         if (img_n != out_n) {\n            int q;\n            // insert alpha = 255\n            cur = a->out + stride*j;\n            if (img_n == 1) {\n               for (q=x-1; q >= 0; --q) {\n                  cur[q*2+1] = 255;\n                  cur[q*2+0] = cur[q];\n               }\n            } else {\n               STBI_ASSERT(img_n == 3);\n               for (q=x-1; q >= 0; --q) {\n                  cur[q*4+3] = 255;\n                  cur[q*4+2] = cur[q*3+2];\n                  cur[q*4+1] = cur[q*3+1];\n                  cur[q*4+0] = cur[q*3+0];\n               }\n            }\n         }\n      }\n   }\n\n   return 1;\n}\n\nstatic int stbi__create_png_image(stbi__png *a, stbi_uc *image_data, stbi__uint32 image_data_len, int out_n, int depth, int color, int interlaced)\n{\n   stbi_uc *final;\n   int p;\n   if (!interlaced)\n      return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color);\n\n   // de-interlacing\n   final = (stbi_uc *) stbi__malloc(a->s->img_x * a->s->img_y * out_n);\n   for (p=0; p < 7; ++p) {\n      int xorig[] = { 0,4,0,2,0,1,0 };\n      int yorig[] = { 0,0,4,0,2,0,1 };\n      int xspc[]  = { 8,8,4,4,2,2,1 };\n      int yspc[]  = { 8,8,8,4,4,2,2 };\n      int i,j,x,y;\n      // pass1_x[4] = 0, pass1_x[5] = 1, pass1_x[12] = 1\n      x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p];\n      y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p];\n      if (x && y) {\n         stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y;\n         if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) {\n            STBI_FREE(final);\n            return 0;\n         }\n         for (j=0; j < y; ++j) {\n            for (i=0; i < x; ++i) {\n               int out_y = j*yspc[p]+yorig[p];\n               int out_x = i*xspc[p]+xorig[p];\n               memcpy(final + out_y*a->s->img_x*out_n + out_x*out_n,\n                      a->out + (j*x+i)*out_n, out_n);\n            }\n         }\n         STBI_FREE(a->out);\n         image_data += img_len;\n         image_data_len -= img_len;\n      }\n   }\n   a->out = final;\n\n   return 1;\n}\n\nstatic int stbi__compute_transparency(stbi__png *z, stbi_uc tc[3], int out_n)\n{\n   stbi__context *s = z->s;\n   stbi__uint32 i, pixel_count = s->img_x * s->img_y;\n   stbi_uc *p = z->out;\n\n   // compute color-based transparency, assuming we've\n   // already got 255 as the alpha value in the output\n   STBI_ASSERT(out_n == 2 || out_n == 4);\n\n   if (out_n == 2) {\n      for (i=0; i < pixel_count; ++i) {\n         p[1] = (p[0] == tc[0] ? 0 : 255);\n         p += 2;\n      }\n   } else {\n      for (i=0; i < pixel_count; ++i) {\n         if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])\n            p[3] = 0;\n         p += 4;\n      }\n   }\n   return 1;\n}\n\nstatic int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette, int len, int pal_img_n)\n{\n   stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y;\n   stbi_uc *p, *temp_out, *orig = a->out;\n\n   p = (stbi_uc *) stbi__malloc(pixel_count * pal_img_n);\n   if (p == NULL) return stbi__err(\"outofmem\", \"Out of memory\");\n\n   // between here and free(out) below, exitting would leak\n   temp_out = p;\n\n   if (pal_img_n == 3) {\n      for (i=0; i < pixel_count; ++i) {\n         int n = orig[i]*4;\n         p[0] = palette[n  ];\n         p[1] = palette[n+1];\n         p[2] = palette[n+2];\n         p += 3;\n      }\n   } else {\n      for (i=0; i < pixel_count; ++i) {\n         int n = orig[i]*4;\n         p[0] = palette[n  ];\n         p[1] = palette[n+1];\n         p[2] = palette[n+2];\n         p[3] = palette[n+3];\n         p += 4;\n      }\n   }\n   STBI_FREE(a->out);\n   a->out = temp_out;\n\n   STBI_NOTUSED(len);\n\n   return 1;\n}\n\nstatic int stbi__unpremultiply_on_load = 0;\nstatic int stbi__de_iphone_flag = 0;\n\nSTBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply)\n{\n   stbi__unpremultiply_on_load = flag_true_if_should_unpremultiply;\n}\n\nSTBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert)\n{\n   stbi__de_iphone_flag = flag_true_if_should_convert;\n}\n\nstatic void stbi__de_iphone(stbi__png *z)\n{\n   stbi__context *s = z->s;\n   stbi__uint32 i, pixel_count = s->img_x * s->img_y;\n   stbi_uc *p = z->out;\n\n   if (s->img_out_n == 3) {  // convert bgr to rgb\n      for (i=0; i < pixel_count; ++i) {\n         stbi_uc t = p[0];\n         p[0] = p[2];\n         p[2] = t;\n         p += 3;\n      }\n   } else {\n      STBI_ASSERT(s->img_out_n == 4);\n      if (stbi__unpremultiply_on_load) {\n         // convert bgr to rgb and unpremultiply\n         for (i=0; i < pixel_count; ++i) {\n            stbi_uc a = p[3];\n            stbi_uc t = p[0];\n            if (a) {\n               p[0] = p[2] * 255 / a;\n               p[1] = p[1] * 255 / a;\n               p[2] =  t   * 255 / a;\n            } else {\n               p[0] = p[2];\n               p[2] = t;\n            }\n            p += 4;\n         }\n      } else {\n         // convert bgr to rgb\n         for (i=0; i < pixel_count; ++i) {\n            stbi_uc t = p[0];\n            p[0] = p[2];\n            p[2] = t;\n            p += 4;\n         }\n      }\n   }\n}\n\n#define STBI__PNG_TYPE(a,b,c,d)  (((a) << 24) + ((b) << 16) + ((c) << 8) + (d))\n\nstatic int stbi__parse_png_file(stbi__png *z, int scan, int req_comp)\n{\n   stbi_uc palette[1024], pal_img_n=0;\n   stbi_uc has_trans=0, tc[3];\n   stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0;\n   int first=1,k,interlace=0, color=0, depth=0, is_iphone=0;\n   stbi__context *s = z->s;\n\n   z->expanded = NULL;\n   z->idata = NULL;\n   z->out = NULL;\n\n   if (!stbi__check_png_header(s)) return 0;\n\n   if (scan == STBI__SCAN_type) return 1;\n\n   for (;;) {\n      stbi__pngchunk c = stbi__get_chunk_header(s);\n      switch (c.type) {\n         case STBI__PNG_TYPE('C','g','B','I'):\n            is_iphone = 1;\n            stbi__skip(s, c.length);\n            break;\n         case STBI__PNG_TYPE('I','H','D','R'): {\n            int comp,filter;\n            if (!first) return stbi__err(\"multiple IHDR\",\"Corrupt PNG\");\n            first = 0;\n            if (c.length != 13) return stbi__err(\"bad IHDR len\",\"Corrupt PNG\");\n            s->img_x = stbi__get32be(s); if (s->img_x > (1 << 24)) return stbi__err(\"too large\",\"Very large image (corrupt?)\");\n            s->img_y = stbi__get32be(s); if (s->img_y > (1 << 24)) return stbi__err(\"too large\",\"Very large image (corrupt?)\");\n            depth = stbi__get8(s);  if (depth != 1 && depth != 2 && depth != 4 && depth != 8)  return stbi__err(\"1/2/4/8-bit only\",\"PNG not supported: 1/2/4/8-bit only\");\n            color = stbi__get8(s);  if (color > 6)         return stbi__err(\"bad ctype\",\"Corrupt PNG\");\n            if (color == 3) pal_img_n = 3; else if (color & 1) return stbi__err(\"bad ctype\",\"Corrupt PNG\");\n            comp  = stbi__get8(s);  if (comp) return stbi__err(\"bad comp method\",\"Corrupt PNG\");\n            filter= stbi__get8(s);  if (filter) return stbi__err(\"bad filter method\",\"Corrupt PNG\");\n            interlace = stbi__get8(s); if (interlace>1) return stbi__err(\"bad interlace method\",\"Corrupt PNG\");\n            if (!s->img_x || !s->img_y) return stbi__err(\"0-pixel image\",\"Corrupt PNG\");\n            if (!pal_img_n) {\n               s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0);\n               if ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err(\"too large\", \"Image too large to decode\");\n               if (scan == STBI__SCAN_header) return 1;\n            } else {\n               // if paletted, then pal_n is our final components, and\n               // img_n is # components to decompress/filter.\n               s->img_n = 1;\n               if ((1 << 30) / s->img_x / 4 < s->img_y) return stbi__err(\"too large\",\"Corrupt PNG\");\n               // if SCAN_header, have to scan to see if we have a tRNS\n            }\n            break;\n         }\n\n         case STBI__PNG_TYPE('P','L','T','E'):  {\n            if (first) return stbi__err(\"first not IHDR\", \"Corrupt PNG\");\n            if (c.length > 256*3) return stbi__err(\"invalid PLTE\",\"Corrupt PNG\");\n            pal_len = c.length / 3;\n            if (pal_len * 3 != c.length) return stbi__err(\"invalid PLTE\",\"Corrupt PNG\");\n            for (i=0; i < pal_len; ++i) {\n               palette[i*4+0] = stbi__get8(s);\n               palette[i*4+1] = stbi__get8(s);\n               palette[i*4+2] = stbi__get8(s);\n               palette[i*4+3] = 255;\n            }\n            break;\n         }\n\n         case STBI__PNG_TYPE('t','R','N','S'): {\n            if (first) return stbi__err(\"first not IHDR\", \"Corrupt PNG\");\n            if (z->idata) return stbi__err(\"tRNS after IDAT\",\"Corrupt PNG\");\n            if (pal_img_n) {\n               if (scan == STBI__SCAN_header) { s->img_n = 4; return 1; }\n               if (pal_len == 0) return stbi__err(\"tRNS before PLTE\",\"Corrupt PNG\");\n               if (c.length > pal_len) return stbi__err(\"bad tRNS len\",\"Corrupt PNG\");\n               pal_img_n = 4;\n               for (i=0; i < c.length; ++i)\n                  palette[i*4+3] = stbi__get8(s);\n            } else {\n               if (!(s->img_n & 1)) return stbi__err(\"tRNS with alpha\",\"Corrupt PNG\");\n               if (c.length != (stbi__uint32) s->img_n*2) return stbi__err(\"bad tRNS len\",\"Corrupt PNG\");\n               has_trans = 1;\n               for (k=0; k < s->img_n; ++k)\n                  tc[k] = (stbi_uc) (stbi__get16be(s) & 255) * stbi__depth_scale_table[depth]; // non 8-bit images will be larger\n            }\n            break;\n         }\n\n         case STBI__PNG_TYPE('I','D','A','T'): {\n            if (first) return stbi__err(\"first not IHDR\", \"Corrupt PNG\");\n            if (pal_img_n && !pal_len) return stbi__err(\"no PLTE\",\"Corrupt PNG\");\n            if (scan == STBI__SCAN_header) { s->img_n = pal_img_n; return 1; }\n            if ((int)(ioff + c.length) < (int)ioff) return 0;\n            if (ioff + c.length > idata_limit) {\n               stbi_uc *p;\n               if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096;\n               while (ioff + c.length > idata_limit)\n                  idata_limit *= 2;\n               p = (stbi_uc *) STBI_REALLOC(z->idata, idata_limit); if (p == NULL) return stbi__err(\"outofmem\", \"Out of memory\");\n               z->idata = p;\n            }\n            if (!stbi__getn(s, z->idata+ioff,c.length)) return stbi__err(\"outofdata\",\"Corrupt PNG\");\n            ioff += c.length;\n            break;\n         }\n\n         case STBI__PNG_TYPE('I','E','N','D'): {\n            stbi__uint32 raw_len, bpl;\n            if (first) return stbi__err(\"first not IHDR\", \"Corrupt PNG\");\n            if (scan != STBI__SCAN_load) return 1;\n            if (z->idata == NULL) return stbi__err(\"no IDAT\",\"Corrupt PNG\");\n            // initial guess for decoded data size to avoid unnecessary reallocs\n            bpl = (s->img_x * depth + 7) / 8; // bytes per line, per component\n            raw_len = bpl * s->img_y * s->img_n /* pixels */ + s->img_y /* filter mode per row */;\n            z->expanded = (stbi_uc *) stbi_zlib_decode_malloc_guesssize_headerflag((char *) z->idata, ioff, raw_len, (int *) &raw_len, !is_iphone);\n            if (z->expanded == NULL) return 0; // zlib should set error\n            STBI_FREE(z->idata); z->idata = NULL;\n            if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans)\n               s->img_out_n = s->img_n+1;\n            else\n               s->img_out_n = s->img_n;\n            if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, depth, color, interlace)) return 0;\n            if (has_trans)\n               if (!stbi__compute_transparency(z, tc, s->img_out_n)) return 0;\n            if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2)\n               stbi__de_iphone(z);\n            if (pal_img_n) {\n               // pal_img_n == 3 or 4\n               s->img_n = pal_img_n; // record the actual colors we had\n               s->img_out_n = pal_img_n;\n               if (req_comp >= 3) s->img_out_n = req_comp;\n               if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n))\n                  return 0;\n            }\n            STBI_FREE(z->expanded); z->expanded = NULL;\n            return 1;\n         }\n\n         default:\n            // if critical, fail\n            if (first) return stbi__err(\"first not IHDR\", \"Corrupt PNG\");\n            if ((c.type & (1 << 29)) == 0) {\n               #ifndef STBI_NO_FAILURE_STRINGS\n               // not threadsafe\n               static char invalid_chunk[] = \"XXXX PNG chunk not known\";\n               invalid_chunk[0] = STBI__BYTECAST(c.type >> 24);\n               invalid_chunk[1] = STBI__BYTECAST(c.type >> 16);\n               invalid_chunk[2] = STBI__BYTECAST(c.type >>  8);\n               invalid_chunk[3] = STBI__BYTECAST(c.type >>  0);\n               #endif\n               return stbi__err(invalid_chunk, \"PNG not supported: unknown PNG chunk type\");\n            }\n            stbi__skip(s, c.length);\n            break;\n      }\n      // end of PNG chunk, read and skip CRC\n      stbi__get32be(s);\n   }\n}\n\nstatic unsigned char *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req_comp)\n{\n   unsigned char *result=NULL;\n   if (req_comp < 0 || req_comp > 4) return stbi__errpuc(\"bad req_comp\", \"Internal error\");\n   if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) {\n      result = p->out;\n      p->out = NULL;\n      if (req_comp && req_comp != p->s->img_out_n) {\n         result = stbi__convert_format(result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);\n         p->s->img_out_n = req_comp;\n         if (result == NULL) return result;\n      }\n      *x = p->s->img_x;\n      *y = p->s->img_y;\n      if (n) *n = p->s->img_out_n;\n   }\n   STBI_FREE(p->out);      p->out      = NULL;\n   STBI_FREE(p->expanded); p->expanded = NULL;\n   STBI_FREE(p->idata);    p->idata    = NULL;\n\n   return result;\n}\n\nstatic unsigned char *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp)\n{\n   stbi__png p;\n   p.s = s;\n   return stbi__do_png(&p, x,y,comp,req_comp);\n}\n\nstatic int stbi__png_test(stbi__context *s)\n{\n   int r;\n   r = stbi__check_png_header(s);\n   stbi__rewind(s);\n   return r;\n}\n\nstatic int stbi__png_info_raw(stbi__png *p, int *x, int *y, int *comp)\n{\n   if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) {\n      stbi__rewind( p->s );\n      return 0;\n   }\n   if (x) *x = p->s->img_x;\n   if (y) *y = p->s->img_y;\n   if (comp) *comp = p->s->img_n;\n   return 1;\n}\n\nstatic int stbi__png_info(stbi__context *s, int *x, int *y, int *comp)\n{\n   stbi__png p;\n   p.s = s;\n   return stbi__png_info_raw(&p, x, y, comp);\n}\n#endif\n\n// Microsoft/Windows BMP image\n\n#ifndef STBI_NO_BMP\nstatic int stbi__bmp_test_raw(stbi__context *s)\n{\n   int r;\n   int sz;\n   if (stbi__get8(s) != 'B') return 0;\n   if (stbi__get8(s) != 'M') return 0;\n   stbi__get32le(s); // discard filesize\n   stbi__get16le(s); // discard reserved\n   stbi__get16le(s); // discard reserved\n   stbi__get32le(s); // discard data offset\n   sz = stbi__get32le(s);\n   r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124);\n   return r;\n}\n\nstatic int stbi__bmp_test(stbi__context *s)\n{\n   int r = stbi__bmp_test_raw(s);\n   stbi__rewind(s);\n   return r;\n}\n\n\n// returns 0..31 for the highest set bit\nstatic int stbi__high_bit(unsigned int z)\n{\n   int n=0;\n   if (z == 0) return -1;\n   if (z >= 0x10000) n += 16, z >>= 16;\n   if (z >= 0x00100) n +=  8, z >>=  8;\n   if (z >= 0x00010) n +=  4, z >>=  4;\n   if (z >= 0x00004) n +=  2, z >>=  2;\n   if (z >= 0x00002) n +=  1, z >>=  1;\n   return n;\n}\n\nstatic int stbi__bitcount(unsigned int a)\n{\n   a = (a & 0x55555555) + ((a >>  1) & 0x55555555); // max 2\n   a = (a & 0x33333333) + ((a >>  2) & 0x33333333); // max 4\n   a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits\n   a = (a + (a >> 8)); // max 16 per 8 bits\n   a = (a + (a >> 16)); // max 32 per 8 bits\n   return a & 0xff;\n}\n\nstatic int stbi__shiftsigned(int v, int shift, int bits)\n{\n   int result;\n   int z=0;\n\n   if (shift < 0) v <<= -shift;\n   else v >>= shift;\n   result = v;\n\n   z = bits;\n   while (z < 8) {\n      result += v >> z;\n      z += bits;\n   }\n   return result;\n}\n\nstatic stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp)\n{\n   stbi_uc *out;\n   unsigned int mr=0,mg=0,mb=0,ma=0, all_a=255;\n   stbi_uc pal[256][4];\n   int psize=0,i,j,compress=0,width;\n   int bpp, flip_vertically, pad, target, offset, hsz;\n   if (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') return stbi__errpuc(\"not BMP\", \"Corrupt BMP\");\n   stbi__get32le(s); // discard filesize\n   stbi__get16le(s); // discard reserved\n   stbi__get16le(s); // discard reserved\n   offset = stbi__get32le(s);\n   hsz = stbi__get32le(s);\n   if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) return stbi__errpuc(\"unknown BMP\", \"BMP type not supported: unknown\");\n   if (hsz == 12) {\n      s->img_x = stbi__get16le(s);\n      s->img_y = stbi__get16le(s);\n   } else {\n      s->img_x = stbi__get32le(s);\n      s->img_y = stbi__get32le(s);\n   }\n   if (stbi__get16le(s) != 1) return stbi__errpuc(\"bad BMP\", \"bad BMP\");\n   bpp = stbi__get16le(s);\n   if (bpp == 1) return stbi__errpuc(\"monochrome\", \"BMP type not supported: 1-bit\");\n   flip_vertically = ((int) s->img_y) > 0;\n   s->img_y = abs((int) s->img_y);\n   if (hsz == 12) {\n      if (bpp < 24)\n         psize = (offset - 14 - 24) / 3;\n   } else {\n      compress = stbi__get32le(s);\n      if (compress == 1 || compress == 2) return stbi__errpuc(\"BMP RLE\", \"BMP type not supported: RLE\");\n      stbi__get32le(s); // discard sizeof\n      stbi__get32le(s); // discard hres\n      stbi__get32le(s); // discard vres\n      stbi__get32le(s); // discard colorsused\n      stbi__get32le(s); // discard max important\n      if (hsz == 40 || hsz == 56) {\n         if (hsz == 56) {\n            stbi__get32le(s);\n            stbi__get32le(s);\n            stbi__get32le(s);\n            stbi__get32le(s);\n         }\n         if (bpp == 16 || bpp == 32) {\n            mr = mg = mb = 0;\n            if (compress == 0) {\n               if (bpp == 32) {\n                  mr = 0xffu << 16;\n                  mg = 0xffu <<  8;\n                  mb = 0xffu <<  0;\n                  ma = 0xffu << 24;\n                  all_a = 0; // if all_a is 0 at end, then we loaded alpha channel but it was all 0\n               } else {\n                  mr = 31u << 10;\n                  mg = 31u <<  5;\n                  mb = 31u <<  0;\n               }\n            } else if (compress == 3) {\n               mr = stbi__get32le(s);\n               mg = stbi__get32le(s);\n               mb = stbi__get32le(s);\n               // not documented, but generated by photoshop and handled by mspaint\n               if (mr == mg && mg == mb) {\n                  // ?!?!?\n                  return stbi__errpuc(\"bad BMP\", \"bad BMP\");\n               }\n            } else\n               return stbi__errpuc(\"bad BMP\", \"bad BMP\");\n         }\n      } else {\n         STBI_ASSERT(hsz == 108 || hsz == 124);\n         mr = stbi__get32le(s);\n         mg = stbi__get32le(s);\n         mb = stbi__get32le(s);\n         ma = stbi__get32le(s);\n         stbi__get32le(s); // discard color space\n         for (i=0; i < 12; ++i)\n            stbi__get32le(s); // discard color space parameters\n         if (hsz == 124) {\n            stbi__get32le(s); // discard rendering intent\n            stbi__get32le(s); // discard offset of profile data\n            stbi__get32le(s); // discard size of profile data\n            stbi__get32le(s); // discard reserved\n         }\n      }\n      if (bpp < 16)\n         psize = (offset - 14 - hsz) >> 2;\n   }\n   s->img_n = ma ? 4 : 3;\n   if (req_comp && req_comp >= 3) // we can directly decode 3 or 4\n      target = req_comp;\n   else\n      target = s->img_n; // if they want monochrome, we'll post-convert\n   out = (stbi_uc *) stbi__malloc(target * s->img_x * s->img_y);\n   if (!out) return stbi__errpuc(\"outofmem\", \"Out of memory\");\n   if (bpp < 16) {\n      int z=0;\n      if (psize == 0 || psize > 256) { STBI_FREE(out); return stbi__errpuc(\"invalid\", \"Corrupt BMP\"); }\n      for (i=0; i < psize; ++i) {\n         pal[i][2] = stbi__get8(s);\n         pal[i][1] = stbi__get8(s);\n         pal[i][0] = stbi__get8(s);\n         if (hsz != 12) stbi__get8(s);\n         pal[i][3] = 255;\n      }\n      stbi__skip(s, offset - 14 - hsz - psize * (hsz == 12 ? 3 : 4));\n      if (bpp == 4) width = (s->img_x + 1) >> 1;\n      else if (bpp == 8) width = s->img_x;\n      else { STBI_FREE(out); return stbi__errpuc(\"bad bpp\", \"Corrupt BMP\"); }\n      pad = (-width)&3;\n      for (j=0; j < (int) s->img_y; ++j) {\n         for (i=0; i < (int) s->img_x; i += 2) {\n            int v=stbi__get8(s),v2=0;\n            if (bpp == 4) {\n               v2 = v & 15;\n               v >>= 4;\n            }\n            out[z++] = pal[v][0];\n            out[z++] = pal[v][1];\n            out[z++] = pal[v][2];\n            if (target == 4) out[z++] = 255;\n            if (i+1 == (int) s->img_x) break;\n            v = (bpp == 8) ? stbi__get8(s) : v2;\n            out[z++] = pal[v][0];\n            out[z++] = pal[v][1];\n            out[z++] = pal[v][2];\n            if (target == 4) out[z++] = 255;\n         }\n         stbi__skip(s, pad);\n      }\n   } else {\n      int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0;\n      int z = 0;\n      int easy=0;\n      stbi__skip(s, offset - 14 - hsz);\n      if (bpp == 24) width = 3 * s->img_x;\n      else if (bpp == 16) width = 2*s->img_x;\n      else /* bpp = 32 and pad = 0 */ width=0;\n      pad = (-width) & 3;\n      if (bpp == 24) {\n         easy = 1;\n      } else if (bpp == 32) {\n         if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000)\n            easy = 2;\n      }\n      if (!easy) {\n         if (!mr || !mg || !mb) { STBI_FREE(out); return stbi__errpuc(\"bad masks\", \"Corrupt BMP\"); }\n         // right shift amt to put high bit in position #7\n         rshift = stbi__high_bit(mr)-7; rcount = stbi__bitcount(mr);\n         gshift = stbi__high_bit(mg)-7; gcount = stbi__bitcount(mg);\n         bshift = stbi__high_bit(mb)-7; bcount = stbi__bitcount(mb);\n         ashift = stbi__high_bit(ma)-7; acount = stbi__bitcount(ma);\n      }\n      for (j=0; j < (int) s->img_y; ++j) {\n         if (easy) {\n            for (i=0; i < (int) s->img_x; ++i) {\n               unsigned char a;\n               out[z+2] = stbi__get8(s);\n               out[z+1] = stbi__get8(s);\n               out[z+0] = stbi__get8(s);\n               z += 3;\n               a = (easy == 2 ? stbi__get8(s) : 255);\n               all_a |= a;\n               if (target == 4) out[z++] = a;\n            }\n         } else {\n            for (i=0; i < (int) s->img_x; ++i) {\n               stbi__uint32 v = (bpp == 16 ? (stbi__uint32) stbi__get16le(s) : stbi__get32le(s));\n               int a;\n               out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount));\n               out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount));\n               out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount));\n               a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255);\n               all_a |= a;\n               if (target == 4) out[z++] = STBI__BYTECAST(a);\n            }\n         }\n         stbi__skip(s, pad);\n      }\n   }\n\n   // if alpha channel is all 0s, replace with all 255s\n   if (target == 4 && all_a == 0)\n      for (i=4*s->img_x*s->img_y-1; i >= 0; i -= 4)\n         out[i] = 255;\n\n   if (flip_vertically) {\n      stbi_uc t;\n      for (j=0; j < (int) s->img_y>>1; ++j) {\n         stbi_uc *p1 = out +      j     *s->img_x*target;\n         stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target;\n         for (i=0; i < (int) s->img_x*target; ++i) {\n            t = p1[i], p1[i] = p2[i], p2[i] = t;\n         }\n      }\n   }\n\n   if (req_comp && req_comp != target) {\n      out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y);\n      if (out == NULL) return out; // stbi__convert_format frees input on failure\n   }\n\n   *x = s->img_x;\n   *y = s->img_y;\n   if (comp) *comp = s->img_n;\n   return out;\n}\n#endif\n\n// Targa Truevision - TGA\n// by Jonathan Dummer\n#ifndef STBI_NO_TGA\nstatic int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp)\n{\n    int tga_w, tga_h, tga_comp;\n    int sz;\n    stbi__get8(s);                   // discard Offset\n    sz = stbi__get8(s);              // color type\n    if( sz > 1 ) {\n        stbi__rewind(s);\n        return 0;      // only RGB or indexed allowed\n    }\n    sz = stbi__get8(s);              // image type\n    // only RGB or grey allowed, +/- RLE\n    if ((sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11)) return 0;\n    stbi__skip(s,9);\n    tga_w = stbi__get16le(s);\n    if( tga_w < 1 ) {\n        stbi__rewind(s);\n        return 0;   // test width\n    }\n    tga_h = stbi__get16le(s);\n    if( tga_h < 1 ) {\n        stbi__rewind(s);\n        return 0;   // test height\n    }\n    sz = stbi__get8(s);               // bits per pixel\n    // only RGB or RGBA or grey allowed\n    if ((sz != 8) && (sz != 16) && (sz != 24) && (sz != 32)) {\n        stbi__rewind(s);\n        return 0;\n    }\n    tga_comp = sz;\n    if (x) *x = tga_w;\n    if (y) *y = tga_h;\n    if (comp) *comp = tga_comp / 8;\n    return 1;                   // seems to have passed everything\n}\n\nstatic int stbi__tga_test(stbi__context *s)\n{\n   int res;\n   int sz;\n   stbi__get8(s);      //   discard Offset\n   sz = stbi__get8(s);   //   color type\n   if ( sz > 1 ) return 0;   //   only RGB or indexed allowed\n   sz = stbi__get8(s);   //   image type\n   if ( (sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11) ) return 0;   //   only RGB or grey allowed, +/- RLE\n   stbi__get16be(s);      //   discard palette start\n   stbi__get16be(s);      //   discard palette length\n   stbi__get8(s);         //   discard bits per palette color entry\n   stbi__get16be(s);      //   discard x origin\n   stbi__get16be(s);      //   discard y origin\n   if ( stbi__get16be(s) < 1 ) return 0;      //   test width\n   if ( stbi__get16be(s) < 1 ) return 0;      //   test height\n   sz = stbi__get8(s);   //   bits per pixel\n   if ( (sz != 8) && (sz != 16) && (sz != 24) && (sz != 32) )\n      res = 0;\n   else\n      res = 1;\n   stbi__rewind(s);\n   return res;\n}\n\nstatic stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp)\n{\n   //   read in the TGA header stuff\n   int tga_offset = stbi__get8(s);\n   int tga_indexed = stbi__get8(s);\n   int tga_image_type = stbi__get8(s);\n   int tga_is_RLE = 0;\n   int tga_palette_start = stbi__get16le(s);\n   int tga_palette_len = stbi__get16le(s);\n   int tga_palette_bits = stbi__get8(s);\n   int tga_x_origin = stbi__get16le(s);\n   int tga_y_origin = stbi__get16le(s);\n   int tga_width = stbi__get16le(s);\n   int tga_height = stbi__get16le(s);\n   int tga_bits_per_pixel = stbi__get8(s);\n   int tga_comp = tga_bits_per_pixel / 8;\n   int tga_inverted = stbi__get8(s);\n   //   image data\n   unsigned char *tga_data;\n   unsigned char *tga_palette = NULL;\n   int i, j;\n   unsigned char raw_data[4];\n   int RLE_count = 0;\n   int RLE_repeating = 0;\n   int read_next_pixel = 1;\n\n   //   do a tiny bit of precessing\n   if ( tga_image_type >= 8 )\n   {\n      tga_image_type -= 8;\n      tga_is_RLE = 1;\n   }\n   /* int tga_alpha_bits = tga_inverted & 15; */\n   tga_inverted = 1 - ((tga_inverted >> 5) & 1);\n\n   //   error check\n   if ( //(tga_indexed) ||\n      (tga_width < 1) || (tga_height < 1) ||\n      (tga_image_type < 1) || (tga_image_type > 3) ||\n      ((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16) &&\n      (tga_bits_per_pixel != 24) && (tga_bits_per_pixel != 32))\n      )\n   {\n      return NULL; // we don't report this as a bad TGA because we don't even know if it's TGA\n   }\n\n   //   If I'm paletted, then I'll use the number of bits from the palette\n   if ( tga_indexed )\n   {\n      tga_comp = tga_palette_bits / 8;\n   }\n\n   //   tga info\n   *x = tga_width;\n   *y = tga_height;\n   if (comp) *comp = tga_comp;\n\n   tga_data = (unsigned char*)stbi__malloc( (size_t)tga_width * tga_height * tga_comp );\n   if (!tga_data) return stbi__errpuc(\"outofmem\", \"Out of memory\");\n\n   // skip to the data's starting position (offset usually = 0)\n   stbi__skip(s, tga_offset );\n\n   if ( !tga_indexed && !tga_is_RLE) {\n      for (i=0; i < tga_height; ++i) {\n         int row = tga_inverted ? tga_height -i - 1 : i;\n         stbi_uc *tga_row = tga_data + row*tga_width*tga_comp;\n         stbi__getn(s, tga_row, tga_width * tga_comp);\n      }\n   } else  {\n      //   do I need to load a palette?\n      if ( tga_indexed)\n      {\n         //   any data to skip? (offset usually = 0)\n         stbi__skip(s, tga_palette_start );\n         //   load the palette\n         tga_palette = (unsigned char*)stbi__malloc( tga_palette_len * tga_palette_bits / 8 );\n         if (!tga_palette) {\n            STBI_FREE(tga_data);\n            return stbi__errpuc(\"outofmem\", \"Out of memory\");\n         }\n         if (!stbi__getn(s, tga_palette, tga_palette_len * tga_palette_bits / 8 )) {\n            STBI_FREE(tga_data);\n            STBI_FREE(tga_palette);\n            return stbi__errpuc(\"bad palette\", \"Corrupt TGA\");\n         }\n      }\n      //   load the data\n      for (i=0; i < tga_width * tga_height; ++i)\n      {\n         //   if I'm in RLE mode, do I need to get a RLE stbi__pngchunk?\n         if ( tga_is_RLE )\n         {\n            if ( RLE_count == 0 )\n            {\n               //   yep, get the next byte as a RLE command\n               int RLE_cmd = stbi__get8(s);\n               RLE_count = 1 + (RLE_cmd & 127);\n               RLE_repeating = RLE_cmd >> 7;\n               read_next_pixel = 1;\n            } else if ( !RLE_repeating )\n            {\n               read_next_pixel = 1;\n            }\n         } else\n         {\n            read_next_pixel = 1;\n         }\n         //   OK, if I need to read a pixel, do it now\n         if ( read_next_pixel )\n         {\n            //   load however much data we did have\n            if ( tga_indexed )\n            {\n               //   read in 1 byte, then perform the lookup\n               int pal_idx = stbi__get8(s);\n               if ( pal_idx >= tga_palette_len )\n               {\n                  //   invalid index\n                  pal_idx = 0;\n               }\n               pal_idx *= tga_bits_per_pixel / 8;\n               for (j = 0; j*8 < tga_bits_per_pixel; ++j)\n               {\n                  raw_data[j] = tga_palette[pal_idx+j];\n               }\n            } else\n            {\n               //   read in the data raw\n               for (j = 0; j*8 < tga_bits_per_pixel; ++j)\n               {\n                  raw_data[j] = stbi__get8(s);\n               }\n            }\n            //   clear the reading flag for the next pixel\n            read_next_pixel = 0;\n         } // end of reading a pixel\n\n         // copy data\n         for (j = 0; j < tga_comp; ++j)\n           tga_data[i*tga_comp+j] = raw_data[j];\n\n         //   in case we're in RLE mode, keep counting down\n         --RLE_count;\n      }\n      //   do I need to invert the image?\n      if ( tga_inverted )\n      {\n         for (j = 0; j*2 < tga_height; ++j)\n         {\n            int index1 = j * tga_width * tga_comp;\n            int index2 = (tga_height - 1 - j) * tga_width * tga_comp;\n            for (i = tga_width * tga_comp; i > 0; --i)\n            {\n               unsigned char temp = tga_data[index1];\n               tga_data[index1] = tga_data[index2];\n               tga_data[index2] = temp;\n               ++index1;\n               ++index2;\n            }\n         }\n      }\n      //   clear my palette, if I had one\n      if ( tga_palette != NULL )\n      {\n         STBI_FREE( tga_palette );\n      }\n   }\n\n   // swap RGB\n   if (tga_comp >= 3)\n   {\n      unsigned char* tga_pixel = tga_data;\n      for (i=0; i < tga_width * tga_height; ++i)\n      {\n         unsigned char temp = tga_pixel[0];\n         tga_pixel[0] = tga_pixel[2];\n         tga_pixel[2] = temp;\n         tga_pixel += tga_comp;\n      }\n   }\n\n   // convert to target component count\n   if (req_comp && req_comp != tga_comp)\n      tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height);\n\n   //   the things I do to get rid of an error message, and yet keep\n   //   Microsoft's C compilers happy... [8^(\n   tga_palette_start = tga_palette_len = tga_palette_bits =\n         tga_x_origin = tga_y_origin = 0;\n   //   OK, done\n   return tga_data;\n}\n#endif\n\n// *************************************************************************************************\n// Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicolas Schulz, tweaked by STB\n\n#ifndef STBI_NO_PSD\nstatic int stbi__psd_test(stbi__context *s)\n{\n   int r = (stbi__get32be(s) == 0x38425053);\n   stbi__rewind(s);\n   return r;\n}\n\nstatic stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp)\n{\n   int   pixelCount;\n   int channelCount, compression;\n   int channel, i, count, len;\n   int bitdepth;\n   int w,h;\n   stbi_uc *out;\n\n   // Check identifier\n   if (stbi__get32be(s) != 0x38425053)   // \"8BPS\"\n      return stbi__errpuc(\"not PSD\", \"Corrupt PSD image\");\n\n   // Check file type version.\n   if (stbi__get16be(s) != 1)\n      return stbi__errpuc(\"wrong version\", \"Unsupported version of PSD image\");\n\n   // Skip 6 reserved bytes.\n   stbi__skip(s, 6 );\n\n   // Read the number of channels (R, G, B, A, etc).\n   channelCount = stbi__get16be(s);\n   if (channelCount < 0 || channelCount > 16)\n      return stbi__errpuc(\"wrong channel count\", \"Unsupported number of channels in PSD image\");\n\n   // Read the rows and columns of the image.\n   h = stbi__get32be(s);\n   w = stbi__get32be(s);\n\n   // Make sure the depth is 8 bits.\n   bitdepth = stbi__get16be(s);\n   if (bitdepth != 8 && bitdepth != 16)\n      return stbi__errpuc(\"unsupported bit depth\", \"PSD bit depth is not 8 or 16 bit\");\n\n   // Make sure the color mode is RGB.\n   // Valid options are:\n   //   0: Bitmap\n   //   1: Grayscale\n   //   2: Indexed color\n   //   3: RGB color\n   //   4: CMYK color\n   //   7: Multichannel\n   //   8: Duotone\n   //   9: Lab color\n   if (stbi__get16be(s) != 3)\n      return stbi__errpuc(\"wrong color format\", \"PSD is not in RGB color format\");\n\n   // Skip the Mode Data.  (It's the palette for indexed color; other info for other modes.)\n   stbi__skip(s,stbi__get32be(s) );\n\n   // Skip the image resources.  (resolution, pen tool paths, etc)\n   stbi__skip(s, stbi__get32be(s) );\n\n   // Skip the reserved data.\n   stbi__skip(s, stbi__get32be(s) );\n\n   // Find out if the data is compressed.\n   // Known values:\n   //   0: no compression\n   //   1: RLE compressed\n   compression = stbi__get16be(s);\n   if (compression > 1)\n      return stbi__errpuc(\"bad compression\", \"PSD has an unknown compression format\");\n\n   // Create the destination image.\n   out = (stbi_uc *) stbi__malloc(4 * w*h);\n   if (!out) return stbi__errpuc(\"outofmem\", \"Out of memory\");\n   pixelCount = w*h;\n\n   // Initialize the data to zero.\n   //memset( out, 0, pixelCount * 4 );\n\n   // Finally, the image data.\n   if (compression) {\n      // RLE as used by .PSD and .TIFF\n      // Loop until you get the number of unpacked bytes you are expecting:\n      //     Read the next source byte into n.\n      //     If n is between 0 and 127 inclusive, copy the next n+1 bytes literally.\n      //     Else if n is between -127 and -1 inclusive, copy the next byte -n+1 times.\n      //     Else if n is 128, noop.\n      // Endloop\n\n      // The RLE-compressed data is preceeded by a 2-byte data count for each row in the data,\n      // which we're going to just skip.\n      stbi__skip(s, h * channelCount * 2 );\n\n      // Read the RLE data by channel.\n      for (channel = 0; channel < 4; channel++) {\n         stbi_uc *p;\n\n         p = out+channel;\n         if (channel >= channelCount) {\n            // Fill this channel with default data.\n            for (i = 0; i < pixelCount; i++, p += 4)\n               *p = (channel == 3 ? 255 : 0);\n         } else {\n            // Read the RLE data.\n            count = 0;\n            while (count < pixelCount) {\n               len = stbi__get8(s);\n               if (len == 128) {\n                  // No-op.\n               } else if (len < 128) {\n                  // Copy next len+1 bytes literally.\n                  len++;\n                  count += len;\n                  while (len) {\n                     *p = stbi__get8(s);\n                     p += 4;\n                     len--;\n                  }\n               } else if (len > 128) {\n                  stbi_uc   val;\n                  // Next -len+1 bytes in the dest are replicated from next source byte.\n                  // (Interpret len as a negative 8-bit int.)\n                  len ^= 0x0FF;\n                  len += 2;\n                  val = stbi__get8(s);\n                  count += len;\n                  while (len) {\n                     *p = val;\n                     p += 4;\n                     len--;\n                  }\n               }\n            }\n         }\n      }\n\n   } else {\n      // We're at the raw image data.  It's each channel in order (Red, Green, Blue, Alpha, ...)\n      // where each channel consists of an 8-bit value for each pixel in the image.\n\n      // Read the data by channel.\n      for (channel = 0; channel < 4; channel++) {\n         stbi_uc *p;\n\n         p = out + channel;\n         if (channel >= channelCount) {\n            // Fill this channel with default data.\n            stbi_uc val = channel == 3 ? 255 : 0;\n            for (i = 0; i < pixelCount; i++, p += 4)\n               *p = val;\n         } else {\n            // Read the data.\n            if (bitdepth == 16) {\n               for (i = 0; i < pixelCount; i++, p += 4)\n                  *p = (stbi_uc) (stbi__get16be(s) >> 8);\n            } else {\n               for (i = 0; i < pixelCount; i++, p += 4)\n                  *p = stbi__get8(s);\n            }\n         }\n      }\n   }\n\n   if (req_comp && req_comp != 4) {\n      out = stbi__convert_format(out, 4, req_comp, w, h);\n      if (out == NULL) return out; // stbi__convert_format frees input on failure\n   }\n\n   if (comp) *comp = 4;\n   *y = h;\n   *x = w;\n\n   return out;\n}\n#endif\n\n// *************************************************************************************************\n// Softimage PIC loader\n// by Tom Seddon\n//\n// See http://softimage.wiki.softimage.com/index.php/INFO:_PIC_file_format\n// See http://ozviz.wasp.uwa.edu.au/~pbourke/dataformats/softimagepic/\n\n#ifndef STBI_NO_PIC\nstatic int stbi__pic_is4(stbi__context *s,const char *str)\n{\n   int i;\n   for (i=0; i<4; ++i)\n      if (stbi__get8(s) != (stbi_uc)str[i])\n         return 0;\n\n   return 1;\n}\n\nstatic int stbi__pic_test_core(stbi__context *s)\n{\n   int i;\n\n   if (!stbi__pic_is4(s,\"\\x53\\x80\\xF6\\x34\"))\n      return 0;\n\n   for(i=0;i<84;++i)\n      stbi__get8(s);\n\n   if (!stbi__pic_is4(s,\"PICT\"))\n      return 0;\n\n   return 1;\n}\n\ntypedef struct\n{\n   stbi_uc size,type,channel;\n} stbi__pic_packet;\n\nstatic stbi_uc *stbi__readval(stbi__context *s, int channel, stbi_uc *dest)\n{\n   int mask=0x80, i;\n\n   for (i=0; i<4; ++i, mask>>=1) {\n      if (channel & mask) {\n         if (stbi__at_eof(s)) return stbi__errpuc(\"bad file\",\"PIC file too short\");\n         dest[i]=stbi__get8(s);\n      }\n   }\n\n   return dest;\n}\n\nstatic void stbi__copyval(int channel,stbi_uc *dest,const stbi_uc *src)\n{\n   int mask=0x80,i;\n\n   for (i=0;i<4; ++i, mask>>=1)\n      if (channel&mask)\n         dest[i]=src[i];\n}\n\nstatic stbi_uc *stbi__pic_load_core(stbi__context *s,int width,int height,int *comp, stbi_uc *result)\n{\n   int act_comp=0,num_packets=0,y,chained;\n   stbi__pic_packet packets[10];\n\n   // this will (should...) cater for even some bizarre stuff like having data\n    // for the same channel in multiple packets.\n   do {\n      stbi__pic_packet *packet;\n\n      if (num_packets==sizeof(packets)/sizeof(packets[0]))\n         return stbi__errpuc(\"bad format\",\"too many packets\");\n\n      packet = &packets[num_packets++];\n\n      chained = stbi__get8(s);\n      packet->size    = stbi__get8(s);\n      packet->type    = stbi__get8(s);\n      packet->channel = stbi__get8(s);\n\n      act_comp |= packet->channel;\n\n      if (stbi__at_eof(s))          return stbi__errpuc(\"bad file\",\"file too short (reading packets)\");\n      if (packet->size != 8)  return stbi__errpuc(\"bad format\",\"packet isn't 8bpp\");\n   } while (chained);\n\n   *comp = (act_comp & 0x10 ? 4 : 3); // has alpha channel?\n\n   for(y=0; y<height; ++y) {\n      int packet_idx;\n\n      for(packet_idx=0; packet_idx < num_packets; ++packet_idx) {\n         stbi__pic_packet *packet = &packets[packet_idx];\n         stbi_uc *dest = result+y*width*4;\n\n         switch (packet->type) {\n            default:\n               return stbi__errpuc(\"bad format\",\"packet has bad compression type\");\n\n            case 0: {//uncompressed\n               int x;\n\n               for(x=0;x<width;++x, dest+=4)\n                  if (!stbi__readval(s,packet->channel,dest))\n                     return 0;\n               break;\n            }\n\n            case 1://Pure RLE\n               {\n                  int left=width, i;\n\n                  while (left>0) {\n                     stbi_uc count,value[4];\n\n                     count=stbi__get8(s);\n                     if (stbi__at_eof(s))   return stbi__errpuc(\"bad file\",\"file too short (pure read count)\");\n\n                     if (count > left)\n                        count = (stbi_uc) left;\n\n                     if (!stbi__readval(s,packet->channel,value))  return 0;\n\n                     for(i=0; i<count; ++i,dest+=4)\n                        stbi__copyval(packet->channel,dest,value);\n                     left -= count;\n                  }\n               }\n               break;\n\n            case 2: {//Mixed RLE\n               int left=width;\n               while (left>0) {\n                  int count = stbi__get8(s), i;\n                  if (stbi__at_eof(s))  return stbi__errpuc(\"bad file\",\"file too short (mixed read count)\");\n\n                  if (count >= 128) { // Repeated\n                     stbi_uc value[4];\n\n                     if (count==128)\n                        count = stbi__get16be(s);\n                     else\n                        count -= 127;\n                     if (count > left)\n                        return stbi__errpuc(\"bad file\",\"scanline overrun\");\n\n                     if (!stbi__readval(s,packet->channel,value))\n                        return 0;\n\n                     for(i=0;i<count;++i, dest += 4)\n                        stbi__copyval(packet->channel,dest,value);\n                  } else { // Raw\n                     ++count;\n                     if (count>left) return stbi__errpuc(\"bad file\",\"scanline overrun\");\n\n                     for(i=0;i<count;++i, dest+=4)\n                        if (!stbi__readval(s,packet->channel,dest))\n                           return 0;\n                  }\n                  left-=count;\n               }\n               break;\n            }\n         }\n      }\n   }\n\n   return result;\n}\n\nstatic stbi_uc *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int req_comp)\n{\n   stbi_uc *result;\n   int i, x,y;\n\n   for (i=0; i<92; ++i)\n      stbi__get8(s);\n\n   x = stbi__get16be(s);\n   y = stbi__get16be(s);\n   if (stbi__at_eof(s))  return stbi__errpuc(\"bad file\",\"file too short (pic header)\");\n   if ((1 << 28) / x < y) return stbi__errpuc(\"too large\", \"Image too large to decode\");\n\n   stbi__get32be(s); //skip `ratio'\n   stbi__get16be(s); //skip `fields'\n   stbi__get16be(s); //skip `pad'\n\n   // intermediate buffer is RGBA\n   result = (stbi_uc *) stbi__malloc(x*y*4);\n   memset(result, 0xff, x*y*4);\n\n   if (!stbi__pic_load_core(s,x,y,comp, result)) {\n      STBI_FREE(result);\n      result=0;\n   }\n   *px = x;\n   *py = y;\n   if (req_comp == 0) req_comp = *comp;\n   result=stbi__convert_format(result,4,req_comp,x,y);\n\n   return result;\n}\n\nstatic int stbi__pic_test(stbi__context *s)\n{\n   int r = stbi__pic_test_core(s);\n   stbi__rewind(s);\n   return r;\n}\n#endif\n\n// *************************************************************************************************\n// GIF loader -- public domain by Jean-Marc Lienher -- simplified/shrunk by stb\n\n#ifndef STBI_NO_GIF\ntypedef struct\n{\n   stbi__int16 prefix;\n   stbi_uc first;\n   stbi_uc suffix;\n} stbi__gif_lzw;\n\ntypedef struct\n{\n   int w,h;\n   stbi_uc *out, *old_out;             // output buffer (always 4 components)\n   int flags, bgindex, ratio, transparent, eflags, delay;\n   stbi_uc  pal[256][4];\n   stbi_uc lpal[256][4];\n   stbi__gif_lzw codes[4096];\n   stbi_uc *color_table;\n   int parse, step;\n   int lflags;\n   int start_x, start_y;\n   int max_x, max_y;\n   int cur_x, cur_y;\n   int line_size;\n} stbi__gif;\n\nstatic int stbi__gif_test_raw(stbi__context *s)\n{\n   int sz;\n   if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') return 0;\n   sz = stbi__get8(s);\n   if (sz != '9' && sz != '7') return 0;\n   if (stbi__get8(s) != 'a') return 0;\n   return 1;\n}\n\nstatic int stbi__gif_test(stbi__context *s)\n{\n   int r = stbi__gif_test_raw(s);\n   stbi__rewind(s);\n   return r;\n}\n\nstatic void stbi__gif_parse_colortable(stbi__context *s, stbi_uc pal[256][4], int num_entries, int transp)\n{\n   int i;\n   for (i=0; i < num_entries; ++i) {\n      pal[i][2] = stbi__get8(s);\n      pal[i][1] = stbi__get8(s);\n      pal[i][0] = stbi__get8(s);\n      pal[i][3] = transp == i ? 0 : 255;\n   }\n}\n\nstatic int stbi__gif_header(stbi__context *s, stbi__gif *g, int *comp, int is_info)\n{\n   stbi_uc version;\n   if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8')\n      return stbi__err(\"not GIF\", \"Corrupt GIF\");\n\n   version = stbi__get8(s);\n   if (version != '7' && version != '9')    return stbi__err(\"not GIF\", \"Corrupt GIF\");\n   if (stbi__get8(s) != 'a')                return stbi__err(\"not GIF\", \"Corrupt GIF\");\n\n   stbi__g_failure_reason = \"\";\n   g->w = stbi__get16le(s);\n   g->h = stbi__get16le(s);\n   g->flags = stbi__get8(s);\n   g->bgindex = stbi__get8(s);\n   g->ratio = stbi__get8(s);\n   g->transparent = -1;\n\n   if (comp != 0) *comp = 4;  // can't actually tell whether it's 3 or 4 until we parse the comments\n\n   if (is_info) return 1;\n\n   if (g->flags & 0x80)\n      stbi__gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1);\n\n   return 1;\n}\n\nstatic int stbi__gif_info_raw(stbi__context *s, int *x, int *y, int *comp)\n{\n   stbi__gif g;\n   if (!stbi__gif_header(s, &g, comp, 1)) {\n      stbi__rewind( s );\n      return 0;\n   }\n   if (x) *x = g.w;\n   if (y) *y = g.h;\n   return 1;\n}\n\nstatic void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code)\n{\n   stbi_uc *p, *c;\n\n   // recurse to decode the prefixes, since the linked-list is backwards,\n   // and working backwards through an interleaved image would be nasty\n   if (g->codes[code].prefix >= 0)\n      stbi__out_gif_code(g, g->codes[code].prefix);\n\n   if (g->cur_y >= g->max_y) return;\n\n   p = &g->out[g->cur_x + g->cur_y];\n   c = &g->color_table[g->codes[code].suffix * 4];\n\n   if (c[3] >= 128) {\n      p[0] = c[2];\n      p[1] = c[1];\n      p[2] = c[0];\n      p[3] = c[3];\n   }\n   g->cur_x += 4;\n\n   if (g->cur_x >= g->max_x) {\n      g->cur_x = g->start_x;\n      g->cur_y += g->step;\n\n      while (g->cur_y >= g->max_y && g->parse > 0) {\n         g->step = (1 << g->parse) * g->line_size;\n         g->cur_y = g->start_y + (g->step >> 1);\n         --g->parse;\n      }\n   }\n}\n\nstatic stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g)\n{\n   stbi_uc lzw_cs;\n   stbi__int32 len, init_code;\n   stbi__uint32 first;\n   stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear;\n   stbi__gif_lzw *p;\n\n   lzw_cs = stbi__get8(s);\n   if (lzw_cs > 12) return NULL;\n   clear = 1 << lzw_cs;\n   first = 1;\n   codesize = lzw_cs + 1;\n   codemask = (1 << codesize) - 1;\n   bits = 0;\n   valid_bits = 0;\n   for (init_code = 0; init_code < clear; init_code++) {\n      g->codes[init_code].prefix = -1;\n      g->codes[init_code].first = (stbi_uc) init_code;\n      g->codes[init_code].suffix = (stbi_uc) init_code;\n   }\n\n   // support no starting clear code\n   avail = clear+2;\n   oldcode = -1;\n\n   len = 0;\n   for(;;) {\n      if (valid_bits < codesize) {\n         if (len == 0) {\n            len = stbi__get8(s); // start new block\n            if (len == 0)\n               return g->out;\n         }\n         --len;\n         bits |= (stbi__int32) stbi__get8(s) << valid_bits;\n         valid_bits += 8;\n      } else {\n         stbi__int32 code = bits & codemask;\n         bits >>= codesize;\n         valid_bits -= codesize;\n         // @OPTIMIZE: is there some way we can accelerate the non-clear path?\n         if (code == clear) {  // clear code\n            codesize = lzw_cs + 1;\n            codemask = (1 << codesize) - 1;\n            avail = clear + 2;\n            oldcode = -1;\n            first = 0;\n         } else if (code == clear + 1) { // end of stream code\n            stbi__skip(s, len);\n            while ((len = stbi__get8(s)) > 0)\n               stbi__skip(s,len);\n            return g->out;\n         } else if (code <= avail) {\n            if (first) return stbi__errpuc(\"no clear code\", \"Corrupt GIF\");\n\n            if (oldcode >= 0) {\n               p = &g->codes[avail++];\n               if (avail > 4096)        return stbi__errpuc(\"too many codes\", \"Corrupt GIF\");\n               p->prefix = (stbi__int16) oldcode;\n               p->first = g->codes[oldcode].first;\n               p->suffix = (code == avail) ? p->first : g->codes[code].first;\n            } else if (code == avail)\n               return stbi__errpuc(\"illegal code in raster\", \"Corrupt GIF\");\n\n            stbi__out_gif_code(g, (stbi__uint16) code);\n\n            if ((avail & codemask) == 0 && avail <= 0x0FFF) {\n               codesize++;\n               codemask = (1 << codesize) - 1;\n            }\n\n            oldcode = code;\n         } else {\n            return stbi__errpuc(\"illegal code in raster\", \"Corrupt GIF\");\n         }\n      }\n   }\n}\n\nstatic void stbi__fill_gif_background(stbi__gif *g, int x0, int y0, int x1, int y1)\n{\n   int x, y;\n   stbi_uc *c = g->pal[g->bgindex];\n   for (y = y0; y < y1; y += 4 * g->w) {\n      for (x = x0; x < x1; x += 4) {\n         stbi_uc *p  = &g->out[y + x];\n         p[0] = c[2];\n         p[1] = c[1];\n         p[2] = c[0];\n         p[3] = 0;\n      }\n   }\n}\n\n// this function is designed to support animated gifs, although stb_image doesn't support it\nstatic stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, int req_comp)\n{\n   int i;\n   stbi_uc *prev_out = 0;\n\n   if (g->out == 0 && !stbi__gif_header(s, g, comp,0))\n      return 0; // stbi__g_failure_reason set by stbi__gif_header\n\n   prev_out = g->out;\n   g->out = (stbi_uc *) stbi__malloc(4 * g->w * g->h);\n   if (g->out == 0) return stbi__errpuc(\"outofmem\", \"Out of memory\");\n\n   switch ((g->eflags & 0x1C) >> 2) {\n      case 0: // unspecified (also always used on 1st frame)\n         stbi__fill_gif_background(g, 0, 0, 4 * g->w, 4 * g->w * g->h);\n         break;\n      case 1: // do not dispose\n         if (prev_out) memcpy(g->out, prev_out, 4 * g->w * g->h);\n         g->old_out = prev_out;\n         break;\n      case 2: // dispose to background\n         if (prev_out) memcpy(g->out, prev_out, 4 * g->w * g->h);\n         stbi__fill_gif_background(g, g->start_x, g->start_y, g->max_x, g->max_y);\n         break;\n      case 3: // dispose to previous\n         if (g->old_out) {\n            for (i = g->start_y; i < g->max_y; i += 4 * g->w)\n               memcpy(&g->out[i + g->start_x], &g->old_out[i + g->start_x], g->max_x - g->start_x);\n         }\n         break;\n   }\n\n   for (;;) {\n      switch (stbi__get8(s)) {\n         case 0x2C: /* Image Descriptor */\n         {\n            int prev_trans = -1;\n            stbi__int32 x, y, w, h;\n            stbi_uc *o;\n\n            x = stbi__get16le(s);\n            y = stbi__get16le(s);\n            w = stbi__get16le(s);\n            h = stbi__get16le(s);\n            if (((x + w) > (g->w)) || ((y + h) > (g->h)))\n               return stbi__errpuc(\"bad Image Descriptor\", \"Corrupt GIF\");\n\n            g->line_size = g->w * 4;\n            g->start_x = x * 4;\n            g->start_y = y * g->line_size;\n            g->max_x   = g->start_x + w * 4;\n            g->max_y   = g->start_y + h * g->line_size;\n            g->cur_x   = g->start_x;\n            g->cur_y   = g->start_y;\n\n            g->lflags = stbi__get8(s);\n\n            if (g->lflags & 0x40) {\n               g->step = 8 * g->line_size; // first interlaced spacing\n               g->parse = 3;\n            } else {\n               g->step = g->line_size;\n               g->parse = 0;\n            }\n\n            if (g->lflags & 0x80) {\n               stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1);\n               g->color_table = (stbi_uc *) g->lpal;\n            } else if (g->flags & 0x80) {\n               if (g->transparent >= 0 && (g->eflags & 0x01)) {\n                  prev_trans = g->pal[g->transparent][3];\n                  g->pal[g->transparent][3] = 0;\n               }\n               g->color_table = (stbi_uc *) g->pal;\n            } else\n               return stbi__errpuc(\"missing color table\", \"Corrupt GIF\");\n\n            o = stbi__process_gif_raster(s, g);\n            if (o == NULL) return NULL;\n\n            if (prev_trans != -1)\n               g->pal[g->transparent][3] = (stbi_uc) prev_trans;\n\n            return o;\n         }\n\n         case 0x21: // Comment Extension.\n         {\n            int len;\n            if (stbi__get8(s) == 0xF9) { // Graphic Control Extension.\n               len = stbi__get8(s);\n               if (len == 4) {\n                  g->eflags = stbi__get8(s);\n                  g->delay = stbi__get16le(s);\n                  g->transparent = stbi__get8(s);\n               } else {\n                  stbi__skip(s, len);\n                  break;\n               }\n            }\n            while ((len = stbi__get8(s)) != 0)\n               stbi__skip(s, len);\n            break;\n         }\n\n         case 0x3B: // gif stream termination code\n            return (stbi_uc *) s; // using '1' causes warning on some compilers\n\n         default:\n            return stbi__errpuc(\"unknown code\", \"Corrupt GIF\");\n      }\n   }\n\n   STBI_NOTUSED(req_comp);\n}\n\nstatic stbi_uc *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp)\n{\n   stbi_uc *u = 0;\n   stbi__gif g;\n   memset(&g, 0, sizeof(g));\n\n   u = stbi__gif_load_next(s, &g, comp, req_comp);\n   if (u == (stbi_uc *) s) u = 0;  // end of animated gif marker\n   if (u) {\n      *x = g.w;\n      *y = g.h;\n      if (req_comp && req_comp != 4)\n         u = stbi__convert_format(u, 4, req_comp, g.w, g.h);\n   }\n   else if (g.out)\n      STBI_FREE(g.out);\n\n   return u;\n}\n\nstatic int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp)\n{\n   return stbi__gif_info_raw(s,x,y,comp);\n}\n#endif\n\n// *************************************************************************************************\n// Radiance RGBE HDR loader\n// originally by Nicolas Schulz\n#ifndef STBI_NO_HDR\nstatic int stbi__hdr_test_core(stbi__context *s)\n{\n   const char *signature = \"#?RADIANCE\\n\";\n   int i;\n   for (i=0; signature[i]; ++i)\n      if (stbi__get8(s) != signature[i])\n         return 0;\n   return 1;\n}\n\nstatic int stbi__hdr_test(stbi__context* s)\n{\n   int r = stbi__hdr_test_core(s);\n   stbi__rewind(s);\n   return r;\n}\n\n#define STBI__HDR_BUFLEN  1024\nstatic char *stbi__hdr_gettoken(stbi__context *z, char *buffer)\n{\n   int len=0;\n   char c = '\\0';\n\n   c = (char) stbi__get8(z);\n\n   while (!stbi__at_eof(z) && c != '\\n') {\n      buffer[len++] = c;\n      if (len == STBI__HDR_BUFLEN-1) {\n         // flush to end of line\n         while (!stbi__at_eof(z) && stbi__get8(z) != '\\n')\n            ;\n         break;\n      }\n      c = (char) stbi__get8(z);\n   }\n\n   buffer[len] = 0;\n   return buffer;\n}\n\nstatic void stbi__hdr_convert(float *output, stbi_uc *input, int req_comp)\n{\n   if ( input[3] != 0 ) {\n      float f1;\n      // Exponent\n      f1 = (float) ldexp(1.0f, input[3] - (int)(128 + 8));\n      if (req_comp <= 2)\n         output[0] = (input[0] + input[1] + input[2]) * f1 / 3;\n      else {\n         output[0] = input[0] * f1;\n         output[1] = input[1] * f1;\n         output[2] = input[2] * f1;\n      }\n      if (req_comp == 2) output[1] = 1;\n      if (req_comp == 4) output[3] = 1;\n   } else {\n      switch (req_comp) {\n         case 4: output[3] = 1; /* fallthrough */\n         case 3: output[0] = output[1] = output[2] = 0;\n                 break;\n         case 2: output[1] = 1; /* fallthrough */\n         case 1: output[0] = 0;\n                 break;\n      }\n   }\n}\n\nstatic float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp)\n{\n   char buffer[STBI__HDR_BUFLEN];\n   char *token;\n   int valid = 0;\n   int width, height;\n   stbi_uc *scanline;\n   float *hdr_data;\n   int len;\n   unsigned char count, value;\n   int i, j, k, c1,c2, z;\n\n\n   // Check identifier\n   if (strcmp(stbi__hdr_gettoken(s,buffer), \"#?RADIANCE\") != 0)\n      return stbi__errpf(\"not HDR\", \"Corrupt HDR image\");\n\n   // Parse header\n   for(;;) {\n      token = stbi__hdr_gettoken(s,buffer);\n      if (token[0] == 0) break;\n      if (strcmp(token, \"FORMAT=32-bit_rle_rgbe\") == 0) valid = 1;\n   }\n\n   if (!valid)    return stbi__errpf(\"unsupported format\", \"Unsupported HDR format\");\n\n   // Parse width and height\n   // can't use sscanf() if we're not using stdio!\n   token = stbi__hdr_gettoken(s,buffer);\n   if (strncmp(token, \"-Y \", 3))  return stbi__errpf(\"unsupported data layout\", \"Unsupported HDR format\");\n   token += 3;\n   height = (int) strtol(token, &token, 10);\n   while (*token == ' ') ++token;\n   if (strncmp(token, \"+X \", 3))  return stbi__errpf(\"unsupported data layout\", \"Unsupported HDR format\");\n   token += 3;\n   width = (int) strtol(token, NULL, 10);\n\n   *x = width;\n   *y = height;\n\n   if (comp) *comp = 3;\n   if (req_comp == 0) req_comp = 3;\n\n   // Read data\n   hdr_data = (float *) stbi__malloc(height * width * req_comp * sizeof(float));\n\n   // Load image data\n   // image data is stored as some number of sca\n   if ( width < 8 || width >= 32768) {\n      // Read flat data\n      for (j=0; j < height; ++j) {\n         for (i=0; i < width; ++i) {\n            stbi_uc rgbe[4];\n           main_decode_loop:\n            stbi__getn(s, rgbe, 4);\n            stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp);\n         }\n      }\n   } else {\n      // Read RLE-encoded data\n      scanline = NULL;\n\n      for (j = 0; j < height; ++j) {\n         c1 = stbi__get8(s);\n         c2 = stbi__get8(s);\n         len = stbi__get8(s);\n         if (c1 != 2 || c2 != 2 || (len & 0x80)) {\n            // not run-length encoded, so we have to actually use THIS data as a decoded\n            // pixel (note this can't be a valid pixel--one of RGB must be >= 128)\n            stbi_uc rgbe[4];\n            rgbe[0] = (stbi_uc) c1;\n            rgbe[1] = (stbi_uc) c2;\n            rgbe[2] = (stbi_uc) len;\n            rgbe[3] = (stbi_uc) stbi__get8(s);\n            stbi__hdr_convert(hdr_data, rgbe, req_comp);\n            i = 1;\n            j = 0;\n            STBI_FREE(scanline);\n            goto main_decode_loop; // yes, this makes no sense\n         }\n         len <<= 8;\n         len |= stbi__get8(s);\n         if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf(\"invalid decoded scanline length\", \"corrupt HDR\"); }\n         if (scanline == NULL) scanline = (stbi_uc *) stbi__malloc(width * 4);\n\n         for (k = 0; k < 4; ++k) {\n            i = 0;\n            while (i < width) {\n               count = stbi__get8(s);\n               if (count > 128) {\n                  // Run\n                  value = stbi__get8(s);\n                  count -= 128;\n                  for (z = 0; z < count; ++z)\n                     scanline[i++ * 4 + k] = value;\n               } else {\n                  // Dump\n                  for (z = 0; z < count; ++z)\n                     scanline[i++ * 4 + k] = stbi__get8(s);\n               }\n            }\n         }\n         for (i=0; i < width; ++i)\n            stbi__hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp);\n      }\n      STBI_FREE(scanline);\n   }\n\n   return hdr_data;\n}\n\nstatic int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp)\n{\n   char buffer[STBI__HDR_BUFLEN];\n   char *token;\n   int valid = 0;\n\n   if (strcmp(stbi__hdr_gettoken(s,buffer), \"#?RADIANCE\") != 0) {\n       stbi__rewind( s );\n       return 0;\n   }\n\n   for(;;) {\n      token = stbi__hdr_gettoken(s,buffer);\n      if (token[0] == 0) break;\n      if (strcmp(token, \"FORMAT=32-bit_rle_rgbe\") == 0) valid = 1;\n   }\n\n   if (!valid) {\n       stbi__rewind( s );\n       return 0;\n   }\n   token = stbi__hdr_gettoken(s,buffer);\n   if (strncmp(token, \"-Y \", 3)) {\n       stbi__rewind( s );\n       return 0;\n   }\n   token += 3;\n   *y = (int) strtol(token, &token, 10);\n   while (*token == ' ') ++token;\n   if (strncmp(token, \"+X \", 3)) {\n       stbi__rewind( s );\n       return 0;\n   }\n   token += 3;\n   *x = (int) strtol(token, NULL, 10);\n   *comp = 3;\n   return 1;\n}\n#endif // STBI_NO_HDR\n\n#ifndef STBI_NO_BMP\nstatic int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp)\n{\n   int hsz;\n   if (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') {\n       stbi__rewind( s );\n       return 0;\n   }\n   stbi__skip(s,12);\n   hsz = stbi__get32le(s);\n   if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) {\n       stbi__rewind( s );\n       return 0;\n   }\n   if (hsz == 12) {\n      *x = stbi__get16le(s);\n      *y = stbi__get16le(s);\n   } else {\n      *x = stbi__get32le(s);\n      *y = stbi__get32le(s);\n   }\n   if (stbi__get16le(s) != 1) {\n       stbi__rewind( s );\n       return 0;\n   }\n   *comp = stbi__get16le(s) / 8;\n   return 1;\n}\n#endif\n\n#ifndef STBI_NO_PSD\nstatic int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp)\n{\n   int channelCount;\n   if (stbi__get32be(s) != 0x38425053) {\n       stbi__rewind( s );\n       return 0;\n   }\n   if (stbi__get16be(s) != 1) {\n       stbi__rewind( s );\n       return 0;\n   }\n   stbi__skip(s, 6);\n   channelCount = stbi__get16be(s);\n   if (channelCount < 0 || channelCount > 16) {\n       stbi__rewind( s );\n       return 0;\n   }\n   *y = stbi__get32be(s);\n   *x = stbi__get32be(s);\n   if (stbi__get16be(s) != 8) {\n       stbi__rewind( s );\n       return 0;\n   }\n   if (stbi__get16be(s) != 3) {\n       stbi__rewind( s );\n       return 0;\n   }\n   *comp = 4;\n   return 1;\n}\n#endif\n\n#ifndef STBI_NO_PIC\nstatic int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp)\n{\n   int act_comp=0,num_packets=0,chained;\n   stbi__pic_packet packets[10];\n\n   if (!stbi__pic_is4(s,\"\\x53\\x80\\xF6\\x34\")) {\n      stbi__rewind(s);\n      return 0;\n   }\n\n   stbi__skip(s, 88);\n\n   *x = stbi__get16be(s);\n   *y = stbi__get16be(s);\n   if (stbi__at_eof(s)) {\n      stbi__rewind( s);\n      return 0;\n   }\n   if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) {\n      stbi__rewind( s );\n      return 0;\n   }\n\n   stbi__skip(s, 8);\n\n   do {\n      stbi__pic_packet *packet;\n\n      if (num_packets==sizeof(packets)/sizeof(packets[0]))\n         return 0;\n\n      packet = &packets[num_packets++];\n      chained = stbi__get8(s);\n      packet->size    = stbi__get8(s);\n      packet->type    = stbi__get8(s);\n      packet->channel = stbi__get8(s);\n      act_comp |= packet->channel;\n\n      if (stbi__at_eof(s)) {\n          stbi__rewind( s );\n          return 0;\n      }\n      if (packet->size != 8) {\n          stbi__rewind( s );\n          return 0;\n      }\n   } while (chained);\n\n   *comp = (act_comp & 0x10 ? 4 : 3);\n\n   return 1;\n}\n#endif\n\n// *************************************************************************************************\n// Portable Gray Map and Portable Pixel Map loader\n// by Ken Miller\n//\n// PGM: http://netpbm.sourceforge.net/doc/pgm.html\n// PPM: http://netpbm.sourceforge.net/doc/ppm.html\n//\n// Known limitations:\n//    Does not support comments in the header section\n//    Does not support ASCII image data (formats P2 and P3)\n//    Does not support 16-bit-per-channel\n\n#ifndef STBI_NO_PNM\n\nstatic int      stbi__pnm_test(stbi__context *s)\n{\n   char p, t;\n   p = (char) stbi__get8(s);\n   t = (char) stbi__get8(s);\n   if (p != 'P' || (t != '5' && t != '6')) {\n       stbi__rewind( s );\n       return 0;\n   }\n   return 1;\n}\n\nstatic stbi_uc *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp)\n{\n   stbi_uc *out;\n   if (!stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n))\n      return 0;\n   *x = s->img_x;\n   *y = s->img_y;\n   *comp = s->img_n;\n\n   out = (stbi_uc *) stbi__malloc(s->img_n * s->img_x * s->img_y);\n   if (!out) return stbi__errpuc(\"outofmem\", \"Out of memory\");\n   stbi__getn(s, out, s->img_n * s->img_x * s->img_y);\n\n   if (req_comp && req_comp != s->img_n) {\n      out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y);\n      if (out == NULL) return out; // stbi__convert_format frees input on failure\n   }\n   return out;\n}\n\nstatic int      stbi__pnm_isspace(char c)\n{\n   return c == ' ' || c == '\\t' || c == '\\n' || c == '\\v' || c == '\\f' || c == '\\r';\n}\n\nstatic void     stbi__pnm_skip_whitespace(stbi__context *s, char *c)\n{\n   while (!stbi__at_eof(s) && stbi__pnm_isspace(*c))\n      *c = (char) stbi__get8(s);\n}\n\nstatic int      stbi__pnm_isdigit(char c)\n{\n   return c >= '0' && c <= '9';\n}\n\nstatic int      stbi__pnm_getinteger(stbi__context *s, char *c)\n{\n   int value = 0;\n\n   while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) {\n      value = value*10 + (*c - '0');\n      *c = (char) stbi__get8(s);\n   }\n\n   return value;\n}\n\nstatic int      stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp)\n{\n   int maxv;\n   char c, p, t;\n\n   stbi__rewind( s );\n\n   // Get identifier\n   p = (char) stbi__get8(s);\n   t = (char) stbi__get8(s);\n   if (p != 'P' || (t != '5' && t != '6')) {\n       stbi__rewind( s );\n       return 0;\n   }\n\n   *comp = (t == '6') ? 3 : 1;  // '5' is 1-component .pgm; '6' is 3-component .ppm\n\n   c = (char) stbi__get8(s);\n   stbi__pnm_skip_whitespace(s, &c);\n\n   *x = stbi__pnm_getinteger(s, &c); // read width\n   stbi__pnm_skip_whitespace(s, &c);\n\n   *y = stbi__pnm_getinteger(s, &c); // read height\n   stbi__pnm_skip_whitespace(s, &c);\n\n   maxv = stbi__pnm_getinteger(s, &c);  // read max value\n\n   if (maxv > 255)\n      return stbi__err(\"max value > 255\", \"PPM image not 8-bit\");\n   else\n      return 1;\n}\n#endif\n\nstatic int stbi__info_main(stbi__context *s, int *x, int *y, int *comp)\n{\n   #ifndef STBI_NO_JPEG\n   if (stbi__jpeg_info(s, x, y, comp)) return 1;\n   #endif\n\n   #ifndef STBI_NO_PNG\n   if (stbi__png_info(s, x, y, comp))  return 1;\n   #endif\n\n   #ifndef STBI_NO_GIF\n   if (stbi__gif_info(s, x, y, comp))  return 1;\n   #endif\n\n   #ifndef STBI_NO_BMP\n   if (stbi__bmp_info(s, x, y, comp))  return 1;\n   #endif\n\n   #ifndef STBI_NO_PSD\n   if (stbi__psd_info(s, x, y, comp))  return 1;\n   #endif\n\n   #ifndef STBI_NO_PIC\n   if (stbi__pic_info(s, x, y, comp))  return 1;\n   #endif\n\n   #ifndef STBI_NO_PNM\n   if (stbi__pnm_info(s, x, y, comp))  return 1;\n   #endif\n\n   #ifndef STBI_NO_HDR\n   if (stbi__hdr_info(s, x, y, comp))  return 1;\n   #endif\n\n   // test tga last because it's a crappy test!\n   #ifndef STBI_NO_TGA\n   if (stbi__tga_info(s, x, y, comp))\n       return 1;\n   #endif\n   return stbi__err(\"unknown image type\", \"Image not of any known type, or corrupt\");\n}\n\n#ifndef STBI_NO_STDIO\nSTBIDEF int stbi_info(char const *filename, int *x, int *y, int *comp)\n{\n    FILE *f = stbi__fopen(filename, \"rb\");\n    int result;\n    if (!f) return stbi__err(\"can't fopen\", \"Unable to open file\");\n    result = stbi_info_from_file(f, x, y, comp);\n    fclose(f);\n    return result;\n}\n\nSTBIDEF int stbi_info_from_file(FILE *f, int *x, int *y, int *comp)\n{\n   int r;\n   stbi__context s;\n   long pos = ftell(f);\n   stbi__start_file(&s, f);\n   r = stbi__info_main(&s,x,y,comp);\n   fseek(f,pos,SEEK_SET);\n   return r;\n}\n#endif // !STBI_NO_STDIO\n\nSTBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp)\n{\n   stbi__context s;\n   stbi__start_mem(&s,buffer,len);\n   return stbi__info_main(&s,x,y,comp);\n}\n\nSTBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int *x, int *y, int *comp)\n{\n   stbi__context s;\n   stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user);\n   return stbi__info_main(&s,x,y,comp);\n}\n\n#endif // STB_IMAGE_IMPLEMENTATION\n\n/*\n   revision history:\n      2.08  (2015-09-13) fix to 2.07 cleanup, reading RGB PSD as RGBA\n      2.07  (2015-09-13) fix compiler warnings\n                         partial animated GIF support\n                         limited 16-bit PSD support\n                         #ifdef unused functions\n                         bug with < 92 byte PIC,PNM,HDR,TGA\n      2.06  (2015-04-19) fix bug where PSD returns wrong '*comp' value\n      2.05  (2015-04-19) fix bug in progressive JPEG handling, fix warning\n      2.04  (2015-04-15) try to re-enable SIMD on MinGW 64-bit\n      2.03  (2015-04-12) extra corruption checking (mmozeiko)\n                         stbi_set_flip_vertically_on_load (nguillemot)\n                         fix NEON support; fix mingw support\n      2.02  (2015-01-19) fix incorrect assert, fix warning\n      2.01  (2015-01-17) fix various warnings; suppress SIMD on gcc 32-bit without -msse2\n      2.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG\n      2.00  (2014-12-25) optimize JPG, including x86 SSE2 & NEON SIMD (ryg)\n                         progressive JPEG (stb)\n                         PGM/PPM support (Ken Miller)\n                         STBI_MALLOC,STBI_REALLOC,STBI_FREE\n                         GIF bugfix -- seemingly never worked\n                         STBI_NO_*, STBI_ONLY_*\n      1.48  (2014-12-14) fix incorrectly-named assert()\n      1.47  (2014-12-14) 1/2/4-bit PNG support, both direct and paletted (Omar Cornut & stb)\n                         optimize PNG (ryg)\n                         fix bug in interlaced PNG with user-specified channel count (stb)\n      1.46  (2014-08-26)\n              fix broken tRNS chunk (colorkey-style transparency) in non-paletted PNG\n      1.45  (2014-08-16)\n              fix MSVC-ARM internal compiler error by wrapping malloc\n      1.44  (2014-08-07)\n              various warning fixes from Ronny Chevalier\n      1.43  (2014-07-15)\n              fix MSVC-only compiler problem in code changed in 1.42\n      1.42  (2014-07-09)\n              don't define _CRT_SECURE_NO_WARNINGS (affects user code)\n              fixes to stbi__cleanup_jpeg path\n              added STBI_ASSERT to avoid requiring assert.h\n      1.41  (2014-06-25)\n              fix search&replace from 1.36 that messed up comments/error messages\n      1.40  (2014-06-22)\n              fix gcc struct-initialization warning\n      1.39  (2014-06-15)\n              fix to TGA optimization when req_comp != number of components in TGA;\n              fix to GIF loading because BMP wasn't rewinding (whoops, no GIFs in my test suite)\n              add support for BMP version 5 (more ignored fields)\n      1.38  (2014-06-06)\n              suppress MSVC warnings on integer casts truncating values\n              fix accidental rename of 'skip' field of I/O\n      1.37  (2014-06-04)\n              remove duplicate typedef\n      1.36  (2014-06-03)\n              convert to header file single-file library\n              if de-iphone isn't set, load iphone images color-swapped instead of returning NULL\n      1.35  (2014-05-27)\n              various warnings\n              fix broken STBI_SIMD path\n              fix bug where stbi_load_from_file no longer left file pointer in correct place\n              fix broken non-easy path for 32-bit BMP (possibly never used)\n              TGA optimization by Arseny Kapoulkine\n      1.34  (unknown)\n              use STBI_NOTUSED in stbi__resample_row_generic(), fix one more leak in tga failure case\n      1.33  (2011-07-14)\n              make stbi_is_hdr work in STBI_NO_HDR (as specified), minor compiler-friendly improvements\n      1.32  (2011-07-13)\n              support for \"info\" function for all supported filetypes (SpartanJ)\n      1.31  (2011-06-20)\n              a few more leak fixes, bug in PNG handling (SpartanJ)\n      1.30  (2011-06-11)\n              added ability to load files via callbacks to accomidate custom input streams (Ben Wenger)\n              removed deprecated format-specific test/load functions\n              removed support for installable file formats (stbi_loader) -- would have been broken for IO callbacks anyway\n              error cases in bmp and tga give messages and don't leak (Raymond Barbiero, grisha)\n              fix inefficiency in decoding 32-bit BMP (David Woo)\n      1.29  (2010-08-16)\n              various warning fixes from Aurelien Pocheville\n      1.28  (2010-08-01)\n              fix bug in GIF palette transparency (SpartanJ)\n      1.27  (2010-08-01)\n              cast-to-stbi_uc to fix warnings\n      1.26  (2010-07-24)\n              fix bug in file buffering for PNG reported by SpartanJ\n      1.25  (2010-07-17)\n              refix trans_data warning (Won Chun)\n      1.24  (2010-07-12)\n              perf improvements reading from files on platforms with lock-heavy fgetc()\n              minor perf improvements for jpeg\n              deprecated type-specific functions so we'll get feedback if they're needed\n              attempt to fix trans_data warning (Won Chun)\n      1.23    fixed bug in iPhone support\n      1.22  (2010-07-10)\n              removed image *writing* support\n              stbi_info support from Jetro Lauha\n              GIF support from Jean-Marc Lienher\n              iPhone PNG-extensions from James Brown\n              warning-fixes from Nicolas Schulz and Janez Zemva (i.stbi__err. Janez (U+017D)emva)\n      1.21    fix use of 'stbi_uc' in header (reported by jon blow)\n      1.20    added support for Softimage PIC, by Tom Seddon\n      1.19    bug in interlaced PNG corruption check (found by ryg)\n      1.18  (2008-08-02)\n              fix a threading bug (local mutable static)\n      1.17    support interlaced PNG\n      1.16    major bugfix - stbi__convert_format converted one too many pixels\n      1.15    initialize some fields for thread safety\n      1.14    fix threadsafe conversion bug\n              header-file-only version (#define STBI_HEADER_FILE_ONLY before including)\n      1.13    threadsafe\n      1.12    const qualifiers in the API\n      1.11    Support installable IDCT, colorspace conversion routines\n      1.10    Fixes for 64-bit (don't use \"unsigned long\")\n              optimized upsampling by Fabian \"ryg\" Giesen\n      1.09    Fix format-conversion for PSD code (bad global variables!)\n      1.08    Thatcher Ulrich's PSD code integrated by Nicolas Schulz\n      1.07    attempt to fix C++ warning/errors again\n      1.06    attempt to fix C++ warning/errors again\n      1.05    fix TGA loading to return correct *comp and use good luminance calc\n      1.04    default float alpha is 1, not 255; use 'void *' for stbi_image_free\n      1.03    bugfixes to STBI_NO_STDIO, STBI_NO_HDR\n      1.02    support for (subset of) HDR files, float interface for preferred access to them\n      1.01    fix bug: possible bug in handling right-side up bmps... not sure\n              fix bug: the stbi__bmp_load() and stbi__tga_load() functions didn't work at all\n      1.00    interface to zlib that skips zlib header\n      0.99    correct handling of alpha in palette\n      0.98    TGA loader by lonesock; dynamically add loaders (untested)\n      0.97    jpeg errors on too large a file; also catch another malloc failure\n      0.96    fix detection of invalid v value - particleman@mollyrocket forum\n      0.95    during header scan, seek to markers in case of padding\n      0.94    STBI_NO_STDIO to disable stdio usage; rename all #defines the same\n      0.93    handle jpegtran output; verbose errors\n      0.92    read 4,8,16,24,32-bit BMP files of several formats\n      0.91    output 24-bit Windows 3.0 BMP files\n      0.90    fix a few more warnings; bump version number to approach 1.0\n      0.61    bugfixes due to Marc LeBlanc, Christopher Lloyd\n      0.60    fix compiling as c++\n      0.59    fix warnings: merge Dave Moore's -Wall fixes\n      0.58    fix bug: zlib uncompressed mode len/nlen was wrong endian\n      0.57    fix bug: jpg last huffman symbol before marker was >9 bits but less than 16 available\n      0.56    fix bug: zlib uncompressed mode len vs. nlen\n      0.55    fix bug: restart_interval not initialized to 0\n      0.54    allow NULL for 'int *comp'\n      0.53    fix bug in png 3->4; speedup png decoding\n      0.52    png handles req_comp=3,4 directly; minor cleanup; jpeg comments\n      0.51    obey req_comp requests, 1-component jpegs return as 1-component,\n              on 'test' only check type, not whether we support this variant\n      0.50  (2006-11-19)\n              first released version\n*/\n"
  },
  {
    "path": "third_party/stb/stb_image_write.h",
    "content": "/* stb_image_write - v1.00 - public domain - http://nothings.org/stb/stb_image_write.h\n   writes out PNG/BMP/TGA images to C stdio - Sean Barrett 2010-2015\n                                     no warranty implied; use at your own risk\n\n   Before #including,\n\n       #define STB_IMAGE_WRITE_IMPLEMENTATION\n\n   in the file that you want to have the implementation.\n\n   Will probably not work correctly with strict-aliasing optimizations.\n\nABOUT:\n\n   This header file is a library for writing images to C stdio. It could be\n   adapted to write to memory or a general streaming interface; let me know.\n\n   The PNG output is not optimal; it is 20-50% larger than the file\n   written by a decent optimizing implementation. This library is designed\n   for source code compactness and simplicity, not optimal image file size\n   or run-time performance.\n\nBUILDING:\n\n   You can #define STBIW_ASSERT(x) before the #include to avoid using assert.h.\n   You can #define STBIW_MALLOC(), STBIW_REALLOC(), and STBIW_FREE() to replace\n   malloc,realloc,free.\n   You can define STBIW_MEMMOVE() to replace memmove()\n\nUSAGE:\n\n   There are four functions, one for each image file format:\n\n     int stbi_write_png(char const *filename, int w, int h, int comp, const void *data, int stride_in_bytes);\n     int stbi_write_bmp(char const *filename, int w, int h, int comp, const void *data);\n     int stbi_write_tga(char const *filename, int w, int h, int comp, const void *data);\n     int stbi_write_hdr(char const *filename, int w, int h, int comp, const void *data);\n\n   There are also four equivalent functions that use an arbitrary write function. You are\n   expected to open/close your file-equivalent before and after calling these:\n\n     int stbi_write_png_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void  *data, int stride_in_bytes);\n     int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void  *data);\n     int stbi_write_tga_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void  *data);\n     int stbi_write_hdr_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const float *data);\n\n   where the callback is:\n      void stbi_write_func(void *context, void *data, int size);\n\n   You can define STBI_WRITE_NO_STDIO to disable the file variant of these\n   functions, so the library will not use stdio.h at all. However, this will\n   also disable HDR writing, because it requires stdio for formatted output.\n\n   Each function returns 0 on failure and non-0 on success.\n\n   The functions create an image file defined by the parameters. The image\n   is a rectangle of pixels stored from left-to-right, top-to-bottom.\n   Each pixel contains 'comp' channels of data stored interleaved with 8-bits\n   per channel, in the following order: 1=Y, 2=YA, 3=RGB, 4=RGBA. (Y is\n   monochrome color.) The rectangle is 'w' pixels wide and 'h' pixels tall.\n   The *data pointer points to the first byte of the top-left-most pixel.\n   For PNG, \"stride_in_bytes\" is the distance in bytes from the first byte of\n   a row of pixels to the first byte of the next row of pixels.\n\n   PNG creates output files with the same number of components as the input.\n   The BMP format expands Y to RGB in the file format and does not\n   output alpha.\n\n   PNG supports writing rectangles of data even when the bytes storing rows of\n   data are not consecutive in memory (e.g. sub-rectangles of a larger image),\n   by supplying the stride between the beginning of adjacent rows. The other\n   formats do not. (Thus you cannot write a native-format BMP through the BMP\n   writer, both because it is in BGR order and because it may have padding\n   at the end of the line.)\n\n   HDR expects linear float data. Since the format is always 32-bit rgb(e)\n   data, alpha (if provided) is discarded, and for monochrome data it is\n   replicated across all three channels.\n\n   TGA supports RLE or non-RLE compressed data. To use non-RLE-compressed\n   data, set the global variable 'stbi_write_tga_with_rle' to 0.\n\nCREDITS:\n\n   PNG/BMP/TGA\n      Sean Barrett\n   HDR\n      Baldur Karlsson\n   TGA monochrome:\n      Jean-Sebastien Guay\n   misc enhancements:\n      Tim Kelsey\n   TGA RLE\n      Alan Hickman\n   initial file IO callback implementation\n      Emmanuel Julien\n   bugfixes:\n      github:Chribba\n      Guillaume Chereau\n      github:jry2\n\nLICENSE\n\nThis software is in the public domain. Where that dedication is not\nrecognized, you are granted a perpetual, irrevocable license to copy,\ndistribute, and modify this file as you see fit.\n\n*/\n\n#ifndef INCLUDE_STB_IMAGE_WRITE_H\n#define INCLUDE_STB_IMAGE_WRITE_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifdef STB_IMAGE_WRITE_STATIC\n#define STBIWDEF static\n#else\n#define STBIWDEF extern\nextern int stbi_write_tga_with_rle;\n#endif\n\n#ifndef STBI_WRITE_NO_STDIO\nSTBIWDEF int stbi_write_png(char const *filename, int w, int h, int comp, const void  *data, int stride_in_bytes);\nSTBIWDEF int stbi_write_bmp(char const *filename, int w, int h, int comp, const void  *data);\nSTBIWDEF int stbi_write_tga(char const *filename, int w, int h, int comp, const void  *data);\nSTBIWDEF int stbi_write_hdr(char const *filename, int w, int h, int comp, const float *data);\n#endif\n\ntypedef void stbi_write_func(void *context, void *data, int size);\n\nSTBIWDEF int stbi_write_png_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void  *data, int stride_in_bytes);\nSTBIWDEF int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void  *data);\nSTBIWDEF int stbi_write_tga_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void  *data);\nSTBIWDEF int stbi_write_hdr_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const float *data);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif//INCLUDE_STB_IMAGE_WRITE_H\n\n#ifdef STB_IMAGE_WRITE_IMPLEMENTATION\n\n#ifdef _WIN32\n   #define _CRT_SECURE_NO_WARNINGS\n   #define _CRT_NONSTDC_NO_DEPRECATE\n#endif\n\n#ifndef STBI_WRITE_NO_STDIO\n#include <stdio.h>\n#endif // STBI_WRITE_NO_STDIO\n\n#include <stdarg.h>\n#include <stdlib.h>\n#include <string.h>\n#include <math.h>\n\n#if defined(STBIW_MALLOC) && defined(STBIW_FREE) && defined(STBIW_REALLOC)\n// ok\n#elif !defined(STBIW_MALLOC) && !defined(STBIW_FREE) && !defined(STBIW_REALLOC)\n// ok\n#else\n#error \"Must define all or none of STBIW_MALLOC, STBIW_FREE, and STBIW_REALLOC.\"\n#endif\n\n#ifndef STBIW_MALLOC\n#define STBIW_MALLOC(sz)    malloc(sz)\n#define STBIW_REALLOC(p,sz) realloc(p,sz)\n#define STBIW_FREE(p)       free(p)\n#endif\n#ifndef STBIW_MEMMOVE\n#define STBIW_MEMMOVE(a,b,sz) memmove(a,b,sz)\n#endif\n\n\n#ifndef STBIW_ASSERT\n#include <assert.h>\n#define STBIW_ASSERT(x) assert(x)\n#endif\n\ntypedef struct\n{\n   stbi_write_func *func;\n   void *context;\n} stbi__write_context;\n\n// initialize a callback-based context\nstatic void stbi__start_write_callbacks(stbi__write_context *s, stbi_write_func *c, void *context)\n{\n   s->func    = c;\n   s->context = context;\n}\n\n#ifndef STBI_WRITE_NO_STDIO\n\nstatic void stbi__stdio_write(void *context, void *data, int size)\n{\n   fwrite(data,1,size,(FILE*) context);\n}\n\nstatic int stbi__start_write_file(stbi__write_context *s, const char *filename)\n{\n   FILE *f = fopen(filename, \"wb\");\n   stbi__start_write_callbacks(s, stbi__stdio_write, (void *) f);\n   return f != NULL;\n}\n\nstatic void stbi__end_write_file(stbi__write_context *s)\n{\n   fclose((FILE *)s->context);\n}\n\n#endif // !STBI_WRITE_NO_STDIO\n\ntypedef unsigned int stbiw_uint32;\ntypedef int stb_image_write_test[sizeof(stbiw_uint32)==4 ? 1 : -1];\n\n#ifdef STB_IMAGE_WRITE_STATIC\nstatic int stbi_write_tga_with_rle = 1;\n#else\nint stbi_write_tga_with_rle = 1;\n#endif\n\nstatic void stbiw__writefv(stbi__write_context *s, const char *fmt, va_list v)\n{\n   while (*fmt) {\n      switch (*fmt++) {\n         case ' ': break;\n         case '1': { unsigned char x = (unsigned char) va_arg(v, int);\n                     s->func(s->context,&x,1);\n                     break; }\n         case '2': { int x = va_arg(v,int);\n                     unsigned char b[2];\n                     b[0] = (unsigned char) x;\n                     b[1] = (unsigned char) (x>>8);\n                     s->func(s->context,b,2);\n                     break; }\n         case '4': { stbiw_uint32 x = va_arg(v,int);\n                     unsigned char b[4];\n                     b[0]=(unsigned char)x;\n                     b[1]=(unsigned char)(x>>8);\n                     b[2]=(unsigned char)(x>>16);\n                     b[3]=(unsigned char)(x>>24);\n                     s->func(s->context,b,4);\n                     break; }\n         default:\n            STBIW_ASSERT(0);\n            return;\n      }\n   }\n}\n\nstatic void stbiw__writef(stbi__write_context *s, const char *fmt, ...)\n{\n   va_list v;\n   va_start(v, fmt);\n   stbiw__writefv(s, fmt, v);\n   va_end(v);\n}\n\nstatic void stbiw__write3(stbi__write_context *s, unsigned char a, unsigned char b, unsigned char c)\n{\n   unsigned char arr[3];\n   arr[0] = a, arr[1] = b, arr[2] = c;\n   s->func(s->context, arr, 3);\n}\n\nstatic void stbiw__write_pixel(stbi__write_context *s, int rgb_dir, int comp, int write_alpha, int expand_mono, unsigned char *d)\n{\n   unsigned char bg[3] = { 255, 0, 255}, px[3];\n   int k;\n\n   if (write_alpha < 0)\n      s->func(s->context, &d[comp - 1], 1);\n\n   switch (comp) {\n      case 1:\n         s->func(s->context,d,1);\n         break;\n      case 2:\n         if (expand_mono)\n            stbiw__write3(s, d[0], d[0], d[0]); // monochrome bmp\n         else\n            s->func(s->context, d, 1);  // monochrome TGA\n         break;\n      case 4:\n         if (!write_alpha) {\n            // composite against pink background\n            for (k = 0; k < 3; ++k)\n               px[k] = bg[k] + ((d[k] - bg[k]) * d[3]) / 255;\n            stbiw__write3(s, px[1 - rgb_dir], px[1], px[1 + rgb_dir]);\n            break;\n         }\n         /* FALLTHROUGH */\n      case 3:\n         stbiw__write3(s, d[1 - rgb_dir], d[1], d[1 + rgb_dir]);\n         break;\n   }\n   if (write_alpha > 0)\n      s->func(s->context, &d[comp - 1], 1);\n}\n\nstatic void stbiw__write_pixels(stbi__write_context *s, int rgb_dir, int vdir, int x, int y, int comp, void *data, int write_alpha, int scanline_pad, int expand_mono)\n{\n   stbiw_uint32 zero = 0;\n   int i,j, j_end;\n\n   if (y <= 0)\n      return;\n\n   if (vdir < 0)\n      j_end = -1, j = y-1;\n   else\n      j_end =  y, j = 0;\n\n   for (; j != j_end; j += vdir) {\n      for (i=0; i < x; ++i) {\n         unsigned char *d = (unsigned char *) data + (j*x+i)*comp;\n         stbiw__write_pixel(s, rgb_dir, comp, write_alpha, expand_mono, d);\n      }\n      s->func(s->context, &zero, scanline_pad);\n   }\n}\n\nstatic int stbiw__outfile(stbi__write_context *s, int rgb_dir, int vdir, int x, int y, int comp, int expand_mono, void *data, int alpha, int pad, const char *fmt, ...)\n{\n   if (y < 0 || x < 0) {\n      return 0;\n   } else {\n      va_list v;\n      va_start(v, fmt);\n      stbiw__writefv(s, fmt, v);\n      va_end(v);\n      stbiw__write_pixels(s,rgb_dir,vdir,x,y,comp,data,alpha,pad, expand_mono);\n      return 1;\n   }\n}\n\nstatic int stbi_write_bmp_core(stbi__write_context *s, int x, int y, int comp, const void *data)\n{\n   int pad = (-x*3) & 3;\n   return stbiw__outfile(s,-1,-1,x,y,comp,1,(void *) data,0,pad,\n           \"11 4 22 4\" \"4 44 22 444444\",\n           'B', 'M', 14+40+(x*3+pad)*y, 0,0, 14+40,  // file header\n            40, x,y, 1,24, 0,0,0,0,0,0);             // bitmap header\n}\n\nSTBIWDEF int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data)\n{\n   stbi__write_context s;\n   stbi__start_write_callbacks(&s, func, context);\n   return stbi_write_bmp_core(&s, x, y, comp, data);\n}\n\n#ifndef STBI_WRITE_NO_STDIO\nSTBIWDEF int stbi_write_bmp(char const *filename, int x, int y, int comp, const void *data)\n{\n   stbi__write_context s;\n   if (stbi__start_write_file(&s,filename)) {\n      int r = stbi_write_bmp_core(&s, x, y, comp, data);\n      stbi__end_write_file(&s);\n      return r;\n   } else\n      return 0;\n}\n#endif //!STBI_WRITE_NO_STDIO\n\nstatic int stbi_write_tga_core(stbi__write_context *s, int x, int y, int comp, void *data)\n{\n   int has_alpha = (comp == 2 || comp == 4);\n   int colorbytes = has_alpha ? comp-1 : comp;\n   int format = colorbytes < 2 ? 3 : 2; // 3 color channels (RGB/RGBA) = 2, 1 color channel (Y/YA) = 3\n\n   if (y < 0 || x < 0)\n      return 0;\n\n   if (!stbi_write_tga_with_rle) {\n      return stbiw__outfile(s, -1, -1, x, y, comp, 0, (void *) data, has_alpha, 0,\n         \"111 221 2222 11\", 0, 0, format, 0, 0, 0, 0, 0, x, y, (colorbytes + has_alpha) * 8, has_alpha * 8);\n   } else {\n      int i,j,k;\n\n      stbiw__writef(s, \"111 221 2222 11\", 0,0,format+8, 0,0,0, 0,0,x,y, (colorbytes + has_alpha) * 8, has_alpha * 8);\n\n      for (j = y - 1; j >= 0; --j) {\n          unsigned char *row = (unsigned char *) data + j * x * comp;\n         int len;\n\n         for (i = 0; i < x; i += len) {\n            unsigned char *begin = row + i * comp;\n            int diff = 1;\n            len = 1;\n\n            if (i < x - 1) {\n               ++len;\n               diff = memcmp(begin, row + (i + 1) * comp, comp);\n               if (diff) {\n                  const unsigned char *prev = begin;\n                  for (k = i + 2; k < x && len < 128; ++k) {\n                     if (memcmp(prev, row + k * comp, comp)) {\n                        prev += comp;\n                        ++len;\n                     } else {\n                        --len;\n                        break;\n                     }\n                  }\n               } else {\n                  for (k = i + 2; k < x && len < 128; ++k) {\n                     if (!memcmp(begin, row + k * comp, comp)) {\n                        ++len;\n                     } else {\n                        break;\n                     }\n                  }\n               }\n            }\n\n            if (diff) {\n               unsigned char header = (unsigned char) (len - 1);\n               s->func(s->context, &header, 1);\n               for (k = 0; k < len; ++k) {\n                  stbiw__write_pixel(s, -1, comp, has_alpha, 0, begin + k * comp);\n               }\n            } else {\n               unsigned char header = (unsigned char) (len - 129);\n               s->func(s->context, &header, 1);\n               stbiw__write_pixel(s, -1, comp, has_alpha, 0, begin);\n            }\n         }\n      }\n   }\n   return 1;\n}\n\nint stbi_write_tga_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data)\n{\n   stbi__write_context s;\n   stbi__start_write_callbacks(&s, func, context);\n   return stbi_write_tga_core(&s, x, y, comp, (void *) data);\n}\n\n#ifndef STBI_WRITE_NO_STDIO\nint stbi_write_tga(char const *filename, int x, int y, int comp, const void *data)\n{\n   stbi__write_context s;\n   if (stbi__start_write_file(&s,filename)) {\n      int r = stbi_write_tga_core(&s, x, y, comp, (void *) data);\n      stbi__end_write_file(&s);\n      return r;\n   } else\n      return 0;\n}\n#endif\n\n// *************************************************************************************************\n// Radiance RGBE HDR writer\n// by Baldur Karlsson\n#ifndef STBI_WRITE_NO_STDIO\n\n#define stbiw__max(a, b)  ((a) > (b) ? (a) : (b))\n\nvoid stbiw__linear_to_rgbe(unsigned char *rgbe, float *linear)\n{\n   int exponent;\n   float maxcomp = stbiw__max(linear[0], stbiw__max(linear[1], linear[2]));\n\n   if (maxcomp < 1e-32) {\n      rgbe[0] = rgbe[1] = rgbe[2] = rgbe[3] = 0;\n   } else {\n      float normalize = (float) frexp(maxcomp, &exponent) * 256.0f/maxcomp;\n\n      rgbe[0] = (unsigned char)(linear[0] * normalize);\n      rgbe[1] = (unsigned char)(linear[1] * normalize);\n      rgbe[2] = (unsigned char)(linear[2] * normalize);\n      rgbe[3] = (unsigned char)(exponent + 128);\n   }\n}\n\nvoid stbiw__write_run_data(stbi__write_context *s, int length, unsigned char databyte)\n{\n   unsigned char lengthbyte = (unsigned char) (length+128);\n   STBIW_ASSERT(length+128 <= 255);\n   s->func(s->context, &lengthbyte, 1);\n   s->func(s->context, &databyte, 1);\n}\n\nvoid stbiw__write_dump_data(stbi__write_context *s, int length, unsigned char *data)\n{\n   unsigned char lengthbyte = (unsigned char )(length & 0xff);\n   STBIW_ASSERT(length <= 128); // inconsistent with spec but consistent with official code\n   s->func(s->context, &lengthbyte, 1);\n   s->func(s->context, data, length);\n}\n\nvoid stbiw__write_hdr_scanline(stbi__write_context *s, int width, int ncomp, unsigned char *scratch, float *scanline)\n{\n   unsigned char scanlineheader[4] = { 2, 2, 0, 0 };\n   unsigned char rgbe[4];\n   float linear[3];\n   int x;\n\n   scanlineheader[2] = (width&0xff00)>>8;\n   scanlineheader[3] = (width&0x00ff);\n\n   /* skip RLE for images too small or large */\n   if (width < 8 || width >= 32768) {\n      for (x=0; x < width; x++) {\n         switch (ncomp) {\n            case 4: /* fallthrough */\n            case 3: linear[2] = scanline[x*ncomp + 2];\n                    linear[1] = scanline[x*ncomp + 1];\n                    linear[0] = scanline[x*ncomp + 0];\n                    break;\n            default:\n                    linear[0] = linear[1] = linear[2] = scanline[x*ncomp + 0];\n                    break;\n         }\n         stbiw__linear_to_rgbe(rgbe, linear);\n         s->func(s->context, rgbe, 4);\n      }\n   } else {\n      int c,r;\n      /* encode into scratch buffer */\n      for (x=0; x < width; x++) {\n         switch(ncomp) {\n            case 4: /* fallthrough */\n            case 3: linear[2] = scanline[x*ncomp + 2];\n                    linear[1] = scanline[x*ncomp + 1];\n                    linear[0] = scanline[x*ncomp + 0];\n                    break;\n            default:\n                    linear[0] = linear[1] = linear[2] = scanline[x*ncomp + 0];\n                    break;\n         }\n         stbiw__linear_to_rgbe(rgbe, linear);\n         scratch[x + width*0] = rgbe[0];\n         scratch[x + width*1] = rgbe[1];\n         scratch[x + width*2] = rgbe[2];\n         scratch[x + width*3] = rgbe[3];\n      }\n\n      s->func(s->context, scanlineheader, 4);\n\n      /* RLE each component separately */\n      for (c=0; c < 4; c++) {\n         unsigned char *comp = &scratch[width*c];\n\n         x = 0;\n         while (x < width) {\n            // find first run\n            r = x;\n            while (r+2 < width) {\n               if (comp[r] == comp[r+1] && comp[r] == comp[r+2])\n                  break;\n               ++r;\n            }\n            if (r+2 >= width)\n               r = width;\n            // dump up to first run\n            while (x < r) {\n               int len = r-x;\n               if (len > 128) len = 128;\n               stbiw__write_dump_data(s, len, &comp[x]);\n               x += len;\n            }\n            // if there's a run, output it\n            if (r+2 < width) { // same test as what we break out of in search loop, so only true if we break'd\n               // find next byte after run\n               while (r < width && comp[r] == comp[x])\n                  ++r;\n               // output run up to r\n               while (x < r) {\n                  int len = r-x;\n                  if (len > 127) len = 127;\n                  stbiw__write_run_data(s, len, comp[x]);\n                  x += len;\n               }\n            }\n         }\n      }\n   }\n}\n\nstatic int stbi_write_hdr_core(stbi__write_context *s, int x, int y, int comp, float *data)\n{\n   if (y <= 0 || x <= 0 || data == NULL)\n      return 0;\n   else {\n      // Each component is stored separately. Allocate scratch space for full output scanline.\n      unsigned char *scratch = (unsigned char *) STBIW_MALLOC(x*4);\n      int i, len;\n      char buffer[128];\n      char header[] = \"#?RADIANCE\\n# Written by stb_image_write.h\\nFORMAT=32-bit_rle_rgbe\\n\";\n      s->func(s->context, header, sizeof(header)-1);\n\n      len = sprintf(buffer, \"EXPOSURE=          1.0000000000000\\n\\n-Y %d +X %d\\n\", y, x);\n      s->func(s->context, buffer, len);\n\n      for(i=0; i < y; i++)\n         stbiw__write_hdr_scanline(s, x, comp, scratch, data + comp*i*x);\n      STBIW_FREE(scratch);\n      return 1;\n   }\n}\n\nint stbi_write_hdr_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const float *data)\n{\n   stbi__write_context s;\n   stbi__start_write_callbacks(&s, func, context);\n   return stbi_write_hdr_core(&s, x, y, comp, (float *) data);\n}\n\nint stbi_write_hdr(char const *filename, int x, int y, int comp, const float *data)\n{\n   stbi__write_context s;\n   if (stbi__start_write_file(&s,filename)) {\n      int r = stbi_write_hdr_core(&s, x, y, comp, (float *) data);\n      stbi__end_write_file(&s);\n      return r;\n   } else\n      return 0;\n}\n#endif // STBI_WRITE_NO_STDIO\n\n\n//////////////////////////////////////////////////////////////////////////////\n//\n// PNG writer\n//\n\n// stretchy buffer; stbiw__sbpush() == vector<>::push_back() -- stbiw__sbcount() == vector<>::size()\n#define stbiw__sbraw(a) ((int *) (a) - 2)\n#define stbiw__sbm(a)   stbiw__sbraw(a)[0]\n#define stbiw__sbn(a)   stbiw__sbraw(a)[1]\n\n#define stbiw__sbneedgrow(a,n)  ((a)==0 || stbiw__sbn(a)+n >= stbiw__sbm(a))\n#define stbiw__sbmaybegrow(a,n) (stbiw__sbneedgrow(a,(n)) ? stbiw__sbgrow(a,n) : 0)\n#define stbiw__sbgrow(a,n)  stbiw__sbgrowf((void **) &(a), (n), sizeof(*(a)))\n\n#define stbiw__sbpush(a, v)      (stbiw__sbmaybegrow(a,1), (a)[stbiw__sbn(a)++] = (v))\n#define stbiw__sbcount(a)        ((a) ? stbiw__sbn(a) : 0)\n#define stbiw__sbfree(a)         ((a) ? STBIW_FREE(stbiw__sbraw(a)),0 : 0)\n\nstatic void *stbiw__sbgrowf(void **arr, int increment, int itemsize)\n{\n   int m = *arr ? 2*stbiw__sbm(*arr)+increment : increment+1;\n   void *p = STBIW_REALLOC(*arr ? stbiw__sbraw(*arr) : 0, itemsize * m + sizeof(int)*2);\n   STBIW_ASSERT(p);\n   if (p) {\n      if (!*arr) ((int *) p)[1] = 0;\n      *arr = (void *) ((int *) p + 2);\n      stbiw__sbm(*arr) = m;\n   }\n   return *arr;\n}\n\nstatic unsigned char *stbiw__zlib_flushf(unsigned char *data, unsigned int *bitbuffer, int *bitcount)\n{\n   while (*bitcount >= 8) {\n      stbiw__sbpush(data, (unsigned char) *bitbuffer);\n      *bitbuffer >>= 8;\n      *bitcount -= 8;\n   }\n   return data;\n}\n\nstatic int stbiw__zlib_bitrev(int code, int codebits)\n{\n   int res=0;\n   while (codebits--) {\n      res = (res << 1) | (code & 1);\n      code >>= 1;\n   }\n   return res;\n}\n\nstatic unsigned int stbiw__zlib_countm(unsigned char *a, unsigned char *b, int limit)\n{\n   int i;\n   for (i=0; i < limit && i < 258; ++i)\n      if (a[i] != b[i]) break;\n   return i;\n}\n\nstatic unsigned int stbiw__zhash(unsigned char *data)\n{\n   stbiw_uint32 hash = data[0] + (data[1] << 8) + (data[2] << 16);\n   hash ^= hash << 3;\n   hash += hash >> 5;\n   hash ^= hash << 4;\n   hash += hash >> 17;\n   hash ^= hash << 25;\n   hash += hash >> 6;\n   return hash;\n}\n\n#define stbiw__zlib_flush() (out = stbiw__zlib_flushf(out, &bitbuf, &bitcount))\n#define stbiw__zlib_add(code,codebits) \\\n      (bitbuf |= (code) << bitcount, bitcount += (codebits), stbiw__zlib_flush())\n#define stbiw__zlib_huffa(b,c)  stbiw__zlib_add(stbiw__zlib_bitrev(b,c),c)\n// default huffman tables\n#define stbiw__zlib_huff1(n)  stbiw__zlib_huffa(0x30 + (n), 8)\n#define stbiw__zlib_huff2(n)  stbiw__zlib_huffa(0x190 + (n)-144, 9)\n#define stbiw__zlib_huff3(n)  stbiw__zlib_huffa(0 + (n)-256,7)\n#define stbiw__zlib_huff4(n)  stbiw__zlib_huffa(0xc0 + (n)-280,8)\n#define stbiw__zlib_huff(n)  ((n) <= 143 ? stbiw__zlib_huff1(n) : (n) <= 255 ? stbiw__zlib_huff2(n) : (n) <= 279 ? stbiw__zlib_huff3(n) : stbiw__zlib_huff4(n))\n#define stbiw__zlib_huffb(n) ((n) <= 143 ? stbiw__zlib_huff1(n) : stbiw__zlib_huff2(n))\n\n#define stbiw__ZHASH   16384\n\nunsigned char * stbi_zlib_compress(unsigned char *data, int data_len, int *out_len, int quality)\n{\n   static unsigned short lengthc[] = { 3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258, 259 };\n   static unsigned char  lengtheb[]= { 0,0,0,0,0,0,0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4,  4,  5,  5,  5,  5,  0 };\n   static unsigned short distc[]   = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577, 32768 };\n   static unsigned char  disteb[]  = { 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13 };\n   unsigned int bitbuf=0;\n   int i,j, bitcount=0;\n   unsigned char *out = NULL;\n   unsigned char **hash_table[stbiw__ZHASH]; // 64KB on the stack!\n   if (quality < 5) quality = 5;\n\n   stbiw__sbpush(out, 0x78);   // DEFLATE 32K window\n   stbiw__sbpush(out, 0x5e);   // FLEVEL = 1\n   stbiw__zlib_add(1,1);  // BFINAL = 1\n   stbiw__zlib_add(1,2);  // BTYPE = 1 -- fixed huffman\n\n   for (i=0; i < stbiw__ZHASH; ++i)\n      hash_table[i] = NULL;\n\n   i=0;\n   while (i < data_len-3) {\n      // hash next 3 bytes of data to be compressed\n      int h = stbiw__zhash(data+i)&(stbiw__ZHASH-1), best=3;\n      unsigned char *bestloc = 0;\n      unsigned char **hlist = hash_table[h];\n      int n = stbiw__sbcount(hlist);\n      for (j=0; j < n; ++j) {\n         if (hlist[j]-data > i-32768) { // if entry lies within window\n            int d = stbiw__zlib_countm(hlist[j], data+i, data_len-i);\n            if (d >= best) best=d,bestloc=hlist[j];\n         }\n      }\n      // when hash table entry is too long, delete half the entries\n      if (hash_table[h] && stbiw__sbn(hash_table[h]) == 2*quality) {\n         STBIW_MEMMOVE(hash_table[h], hash_table[h]+quality, sizeof(hash_table[h][0])*quality);\n         stbiw__sbn(hash_table[h]) = quality;\n      }\n      stbiw__sbpush(hash_table[h],data+i);\n\n      if (bestloc) {\n         // \"lazy matching\" - check match at *next* byte, and if it's better, do cur byte as literal\n         h = stbiw__zhash(data+i+1)&(stbiw__ZHASH-1);\n         hlist = hash_table[h];\n         n = stbiw__sbcount(hlist);\n         for (j=0; j < n; ++j) {\n            if (hlist[j]-data > i-32767) {\n               int e = stbiw__zlib_countm(hlist[j], data+i+1, data_len-i-1);\n               if (e > best) { // if next match is better, bail on current match\n                  bestloc = NULL;\n                  break;\n               }\n            }\n         }\n      }\n\n      if (bestloc) {\n         int d = (int) (data+i - bestloc); // distance back\n         STBIW_ASSERT(d <= 32767 && best <= 258);\n         for (j=0; best > lengthc[j+1]-1; ++j);\n         stbiw__zlib_huff(j+257);\n         if (lengtheb[j]) stbiw__zlib_add(best - lengthc[j], lengtheb[j]);\n         for (j=0; d > distc[j+1]-1; ++j);\n         stbiw__zlib_add(stbiw__zlib_bitrev(j,5),5);\n         if (disteb[j]) stbiw__zlib_add(d - distc[j], disteb[j]);\n         i += best;\n      } else {\n         stbiw__zlib_huffb(data[i]);\n         ++i;\n      }\n   }\n   // write out final bytes\n   for (;i < data_len; ++i)\n      stbiw__zlib_huffb(data[i]);\n   stbiw__zlib_huff(256); // end of block\n   // pad with 0 bits to byte boundary\n   while (bitcount)\n      stbiw__zlib_add(0,1);\n\n   for (i=0; i < stbiw__ZHASH; ++i)\n      (void) stbiw__sbfree(hash_table[i]);\n\n   {\n      // compute adler32 on input\n      unsigned int k=0, s1=1, s2=0;\n      int blocklen = (int) (data_len % 5552);\n      j=0;\n      while (j < data_len) {\n         for (i=0; i < blocklen; ++i) s1 += data[j+i], s2 += s1;\n         s1 %= 65521, s2 %= 65521;\n         j += blocklen;\n         blocklen = 5552;\n      }\n      stbiw__sbpush(out, (unsigned char) (s2 >> 8));\n      stbiw__sbpush(out, (unsigned char) s2);\n      stbiw__sbpush(out, (unsigned char) (s1 >> 8));\n      stbiw__sbpush(out, (unsigned char) s1);\n   }\n   *out_len = stbiw__sbn(out);\n   // make returned pointer freeable\n   STBIW_MEMMOVE(stbiw__sbraw(out), out, *out_len);\n   return (unsigned char *) stbiw__sbraw(out);\n}\n\nunsigned int stbiw__crc32(unsigned char *buffer, int len)\n{\n   static unsigned int crc_table[256];\n   unsigned int crc = ~0u;\n   int i,j;\n   if (crc_table[1] == 0)\n      for(i=0; i < 256; i++)\n         for (crc_table[i]=i, j=0; j < 8; ++j)\n            crc_table[i] = (crc_table[i] >> 1) ^ (crc_table[i] & 1 ? 0xedb88320 : 0);\n   for (i=0; i < len; ++i)\n      crc = (crc >> 8) ^ crc_table[buffer[i] ^ (crc & 0xff)];\n   return ~crc;\n}\n\n#define stbiw__wpng4(o,a,b,c,d) ((o)[0]=(unsigned char)(a),(o)[1]=(unsigned char)(b),(o)[2]=(unsigned char)(c),(o)[3]=(unsigned char)(d),(o)+=4)\n#define stbiw__wp32(data,v) stbiw__wpng4(data, (v)>>24,(v)>>16,(v)>>8,(v));\n#define stbiw__wptag(data,s) stbiw__wpng4(data, s[0],s[1],s[2],s[3])\n\nstatic void stbiw__wpcrc(unsigned char **data, int len)\n{\n   unsigned int crc = stbiw__crc32(*data - len - 4, len+4);\n   stbiw__wp32(*data, crc);\n}\n\nstatic unsigned char stbiw__paeth(int a, int b, int c)\n{\n   int p = a + b - c, pa = abs(p-a), pb = abs(p-b), pc = abs(p-c);\n   if (pa <= pb && pa <= pc) return (unsigned char) a;\n   if (pb <= pc) return (unsigned char) b;\n   return (unsigned char) c;\n}\n\nunsigned char *stbi_write_png_to_mem(unsigned char *pixels, int stride_bytes, int x, int y, int n, int *out_len)\n{\n   int ctype[5] = { -1, 0, 4, 2, 6 };\n   unsigned char sig[8] = { 137,80,78,71,13,10,26,10 };\n   unsigned char *out,*o, *filt, *zlib;\n   signed char *line_buffer;\n   int i,j,k,p,zlen;\n\n   if (stride_bytes == 0)\n      stride_bytes = x * n;\n\n   filt = (unsigned char *) STBIW_MALLOC((x*n+1) * y); if (!filt) return 0;\n   line_buffer = (signed char *) STBIW_MALLOC(x * n); if (!line_buffer) { STBIW_FREE(filt); return 0; }\n   for (j=0; j < y; ++j) {\n      static int mapping[] = { 0,1,2,3,4 };\n      static int firstmap[] = { 0,1,0,5,6 };\n      int *mymap = j ? mapping : firstmap;\n      int best = 0, bestval = 0x7fffffff;\n      for (p=0; p < 2; ++p) {\n         for (k= p?best:0; k < 5; ++k) {\n            int type = mymap[k],est=0;\n            unsigned char *z = pixels + stride_bytes*j;\n            for (i=0; i < n; ++i)\n               switch (type) {\n                  case 0: line_buffer[i] = z[i]; break;\n                  case 1: line_buffer[i] = z[i]; break;\n                  case 2: line_buffer[i] = z[i] - z[i-stride_bytes]; break;\n                  case 3: line_buffer[i] = z[i] - (z[i-stride_bytes]>>1); break;\n                  case 4: line_buffer[i] = (signed char) (z[i] - stbiw__paeth(0,z[i-stride_bytes],0)); break;\n                  case 5: line_buffer[i] = z[i]; break;\n                  case 6: line_buffer[i] = z[i]; break;\n               }\n            for (i=n; i < x*n; ++i) {\n               switch (type) {\n                  case 0: line_buffer[i] = z[i]; break;\n                  case 1: line_buffer[i] = z[i] - z[i-n]; break;\n                  case 2: line_buffer[i] = z[i] - z[i-stride_bytes]; break;\n                  case 3: line_buffer[i] = z[i] - ((z[i-n] + z[i-stride_bytes])>>1); break;\n                  case 4: line_buffer[i] = z[i] - stbiw__paeth(z[i-n], z[i-stride_bytes], z[i-stride_bytes-n]); break;\n                  case 5: line_buffer[i] = z[i] - (z[i-n]>>1); break;\n                  case 6: line_buffer[i] = z[i] - stbiw__paeth(z[i-n], 0,0); break;\n               }\n            }\n            if (p) break;\n            for (i=0; i < x*n; ++i)\n               est += abs((signed char) line_buffer[i]);\n            if (est < bestval) { bestval = est; best = k; }\n         }\n      }\n      // when we get here, best contains the filter type, and line_buffer contains the data\n      filt[j*(x*n+1)] = (unsigned char) best;\n      STBIW_MEMMOVE(filt+j*(x*n+1)+1, line_buffer, x*n);\n   }\n   STBIW_FREE(line_buffer);\n   zlib = stbi_zlib_compress(filt, y*( x*n+1), &zlen, 8); // increase 8 to get smaller but use more memory\n   STBIW_FREE(filt);\n   if (!zlib) return 0;\n\n   // each tag requires 12 bytes of overhead\n   out = (unsigned char *) STBIW_MALLOC(8 + 12+13 + 12+zlen + 12);\n   if (!out) return 0;\n   *out_len = 8 + 12+13 + 12+zlen + 12;\n\n   o=out;\n   STBIW_MEMMOVE(o,sig,8); o+= 8;\n   stbiw__wp32(o, 13); // header length\n   stbiw__wptag(o, \"IHDR\");\n   stbiw__wp32(o, x);\n   stbiw__wp32(o, y);\n   *o++ = 8;\n   *o++ = (unsigned char) ctype[n];\n   *o++ = 0;\n   *o++ = 0;\n   *o++ = 0;\n   stbiw__wpcrc(&o,13);\n\n   stbiw__wp32(o, zlen);\n   stbiw__wptag(o, \"IDAT\");\n   STBIW_MEMMOVE(o, zlib, zlen);\n   o += zlen;\n   STBIW_FREE(zlib);\n   stbiw__wpcrc(&o, zlen);\n\n   stbiw__wp32(o,0);\n   stbiw__wptag(o, \"IEND\");\n   stbiw__wpcrc(&o,0);\n\n   STBIW_ASSERT(o == out + *out_len);\n\n   return out;\n}\n\n#ifndef STBI_WRITE_NO_STDIO\nSTBIWDEF int stbi_write_png(char const *filename, int x, int y, int comp, const void *data, int stride_bytes)\n{\n   FILE *f;\n   int len;\n   unsigned char *png = stbi_write_png_to_mem((unsigned char *) data, stride_bytes, x, y, comp, &len);\n   if (png == NULL) return 0;\n   f = fopen(filename, \"wb\");\n   if (!f) { STBIW_FREE(png); return 0; }\n   fwrite(png, 1, len, f);\n   fclose(f);\n   STBIW_FREE(png);\n   return 1;\n}\n#endif\n\nSTBIWDEF int stbi_write_png_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int stride_bytes)\n{\n   int len;\n   unsigned char *png = stbi_write_png_to_mem((unsigned char *) data, stride_bytes, x, y, comp, &len);\n   if (png == NULL) return 0;\n   func(context, png, len);\n   STBIW_FREE(png);\n   return 1;\n}\n\n#endif // STB_IMAGE_WRITE_IMPLEMENTATION\n\n/* Revision history\n      1.00 (2015-09-14)\n             installable file IO function\n      0.99 (2015-09-13)\n             warning fixes; TGA rle support\n      0.98 (2015-04-08)\n             added STBIW_MALLOC, STBIW_ASSERT etc\n      0.97 (2015-01-18)\n             fixed HDR asserts, rewrote HDR rle logic\n      0.96 (2015-01-17)\n             add HDR output\n             fix monochrome BMP\n      0.95 (2014-08-17)\n           add monochrome TGA output\n      0.94 (2014-05-31)\n             rename private functions to avoid conflicts with stb_image.h\n      0.93 (2014-05-27)\n             warning fixes\n      0.92 (2010-08-01)\n             casts to unsigned char to fix warnings\n      0.91 (2010-07-17)\n             first public release\n      0.90   first internal release\n*/\n"
  },
  {
    "path": "third_party/xxhash.lua",
    "content": "group(\"third_party\")\nproject(\"xxhash\")\n  uuid(\"40d4ce21-5448-4399-9f98-589b7e1c23b1\")\n  kind(\"StaticLib\")\n  language(\"C\")\n  links({\n  })\n  defines({\n    \"_LIB\",\n  })\n  includedirs({\n    \"xxhash\",\n  })\n  files({\n    \"xxhash/xxhash.c\",\n    \"xxhash/xxhash.h\",\n  })\n"
  },
  {
    "path": "tools/build/premake",
    "content": "#!/usr/bin/env python3\n\n# Copyright 2015 Ben Vanik. All Rights Reserved.\n\n\"\"\"Premake trampoline script.\n\"\"\"\n\n__author__ = 'ben.vanik@gmail.com (Ben Vanik)'\n\n\nimport json\nimport os\nimport shutil\nimport subprocess\nimport sys\nimport re\n\n\nself_path = os.path.dirname(os.path.abspath(__file__))\nroot_path = os.path.join(self_path, '..', '..')\npremake_submodule_path = os.path.join(root_path, 'third_party', 'premake-core')\npremake_path = premake_submodule_path\n\n\ndef setup_premake_path_override():\n  global premake_path\n  premake_path = premake_submodule_path\n  if sys.platform == 'linux':\n    # On Android, the repository may be cloned to the external storage, which\n    # doesn't support executables in it.\n    # In this case, premake-core needs to be checked out in the internal\n    # storage, which supports executables, with all the permissions as set in\n    # its repository.\n    # On Termux, the home directory is in the internal storage - use it for\n    # executing.\n    # If xenia-build doesn't have execute permissions, Xenia is in the external\n    # storage now.\n    try:\n      popen = subprocess.Popen(\n          ['uname', '-o'], stdout=subprocess.PIPE, stderr=subprocess.DEVNULL,\n          universal_newlines=True)\n      if popen.communicate()[0] == 'Android\\n':\n        xb_file = os.path.join(root_path, 'xenia-build')\n        if (os.path.isfile(xb_file) and not os.access(xb_file, os.X_OK) and\n            'HOME' in os.environ):\n          premake_path = os.path.join(\n              os.environ['HOME'], '.xenia-build', 'premake-core')\n    except Exception:\n      pass\n\nsetup_premake_path_override()\n\n\ndef main():\n  # First try the freshly-built premake.\n  premake5_bin = os.path.join(premake_path, 'bin', 'release', 'premake5')\n  if not has_bin(premake5_bin):\n    # No fresh build, so fallback to checked in copy (which we may not have).\n    premake5_bin = os.path.join(self_path, 'bin', 'premake5')\n  if not has_bin(premake5_bin):\n    # Still no valid binary, so build it.\n    print('premake5 executable not found, attempting build...')\n    build_premake()\n    premake5_bin = os.path.join(premake_path, 'bin', 'release', 'premake5')\n  if not has_bin(premake5_bin):\n    # Nope, boned.\n    print('ERROR: cannot build premake5 executable.')\n    sys.exit(1)\n\n  # Ensure the submodule has been checked out.\n  if not os.path.exists(os.path.join(premake_path, 'scripts', 'package.lua')):\n    print('third_party/premake-core was not present; run xb setup...')\n    sys.exit(1)\n    return\n\n  if sys.platform == 'win32':\n    # Append the executable extension on windows.\n    premake5_bin = premake5_bin + '.exe'\n\n  return_code = shell_call([\n      premake5_bin,\n      '--scripts=%s' % (premake_path),\n      ] + sys.argv[1:],\n      throw_on_error=False)\n\n  sys.exit(return_code)\n\n\ndef build_premake():\n  \"\"\"Builds premake from source.\n  \"\"\"\n  # Ensure that on Android, premake-core is in the internal storage.\n  clone_premake_to_internal_storage()\n  cwd = os.getcwd()\n  try:\n    os.chdir(premake_path)\n    if sys.platform == 'darwin':\n      subprocess.call([\n          'make',\n          '-f', 'Bootstrap.mak',\n          'osx',\n          ], shell=False)\n    elif sys.platform == 'win32':\n      # Grab Visual Studio version and execute shell to set up environment.\n      vs_version = import_vs_environment()\n      if vs_version is None:\n        print('ERROR: Visual Studio not found!')\n        sys.exit(1)\n        return\n\n      subprocess.call([\n          'nmake',\n          '-f', 'Bootstrap.mak',\n          'windows',\n          ], shell=False)\n    else:\n      subprocess.call([\n          'make',\n          '-f', 'Bootstrap.mak',\n          'linux',\n          ], shell=False)\n  finally:\n    os.chdir(cwd)\n  pass\n\n\ndef clone_premake_to_internal_storage():\n  \"\"\"Clones premake to the Android internal storage so it can be executed.\n  \"\"\"\n  # premake_path is initialized to a value different than premake_submodule_path\n  # if running from the Android external storage, and may not exist yet.\n  if premake_path == premake_submodule_path:\n    return\n\n  # Ensure the submodule has been checked out.\n  if not os.path.exists(\n      os.path.join(premake_submodule_path, 'scripts', 'package.lua')):\n    print('third_party/premake-core was not present; run xb setup...')\n    sys.exit(1)\n    return\n\n  # Create or refresh premake-core in the internal storage.\n  print('Cloning premake5 to the internal storage...')\n  shutil.rmtree(premake_path, ignore_errors=True)\n  os.makedirs(premake_path)\n  shell_call([\n      'git',\n      'clone',\n      '--recurse-submodules',\n      premake_submodule_path,\n      premake_path,\n      ])\n\n\ndef has_bin(bin):\n  \"\"\"Checks whether the given binary is present.\n  \"\"\"\n  for path in os.environ[\"PATH\"].split(os.pathsep):\n    if sys.platform == 'win32':\n      exe_file = os.path.join(path, bin + '.exe')\n      if os.path.isfile(exe_file) and os.access(exe_file, os.X_OK):\n        return True\n    else:\n      path = path.strip('\"')\n      exe_file = os.path.join(path, bin)\n      if os.path.isfile(exe_file) and os.access(exe_file, os.X_OK):\n        return True\n  return None\n\n\ndef shell_call(command, throw_on_error=True, stdout_path=None, stderr_path=None, shell=False):\n  \"\"\"Executes a shell command.\n\n  Args:\n    command: Command to execute, as a list of parameters.\n    throw_on_error: Whether to throw an error or return the status code.\n    stdout_path: File path to write stdout output to.\n    stderr_path: File path to write stderr output to.\n\n  Returns:\n    If throw_on_error is False the status code of the call will be returned.\n  \"\"\"\n  stdout_file = None\n  if stdout_path:\n    stdout_file = open(stdout_path, 'w')\n  stderr_file = None\n  if stderr_path:\n    stderr_file = open(stderr_path, 'w')\n  result = 0\n  try:\n    if throw_on_error:\n      result = 1\n      subprocess.check_call(command, shell=shell, stdout=stdout_file, stderr=stderr_file)\n      result = 0\n    else:\n      result = subprocess.call(command, shell=shell, stdout=stdout_file, stderr=stderr_file)\n  finally:\n    if stdout_file:\n      stdout_file.close()\n    if stderr_file:\n      stderr_file.close()\n  return result\n\n\ndef import_vs_environment():\n  \"\"\"Finds the installed Visual Studio version and imports\n  interesting environment variables into os.environ.\n\n  Returns:\n  A version such as 2015 or None if no installation is found.\n  \"\"\"\n  version = 0\n  install_path = None\n  env_tool_args = None\n\n  vswhere = subprocess.check_output('tools/vswhere/vswhere.exe -version \"[15,)\" -latest -format json -utf8', shell=False, universal_newlines=True, encoding=\"utf-8\")\n  if vswhere:\n    vswhere = json.loads(vswhere)\n  if vswhere and len(vswhere) > 0:\n    version = int(vswhere[0].get(\"catalog\", {}).get(\"productLineVersion\", 2017))\n    install_path = vswhere[0].get(\"installationPath\", None)\n\n  if version < 2017:\n    if 'VS140COMNTOOLS' in os.environ:\n      version = 2015\n      vcvars_path = os.environ['VS140COMNTOOLS']\n      vcvars_path = os.path.join(tools_path, '..\\\\..\\\\vc\\\\vcvarsall.bat')\n      env_tool_args = [vcvars_path, 'x64', '&&', 'set']\n  else:\n    vsdevcmd_path = os.path.join(install_path, 'Common7\\\\Tools\\\\VsDevCmd.bat')\n    env_tool_args = [vsdevcmd_path, '-arch=amd64', '-host_arch=amd64']\n\n  if version == 0:\n    return None\n\n  import_subprocess_environment(env_tool_args)\n  os.environ['VSVERSION'] = str(version)\n  return version\n\n\ndef import_subprocess_environment(args):\n  popen = subprocess.Popen(\n      args, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True)\n  variables, _ = popen.communicate()\n  envvars_to_save = (\n      'devenvdir',\n      'include',\n      'lib',\n      'libpath',\n      'path',\n      'pathext',\n      'systemroot',\n      'temp',\n      'tmp',\n      'windowssdkdir',\n      )\n  for line in variables.splitlines():\n    for envvar in envvars_to_save:\n      if re.match(envvar + '=', line.lower()):\n        var, setting = line.split('=', 1)\n        if envvar == 'path':\n          setting = os.path.dirname(sys.executable) + os.pathsep + setting\n        os.environ[var.upper()] = setting\n        break\n\nif __name__ == '__main__':\n  main()\n"
  },
  {
    "path": "tools/build/premake5.lua",
    "content": "require(\"vstudio\")\n\ninclude(\"scripts/build_paths.lua\")\ninclude(\"scripts/force_compile_as_c.lua\")\ninclude(\"scripts/force_compile_as_cc.lua\")\ninclude(\"scripts/pkg_config.lua\")\ninclude(\"scripts/platform_files.lua\")\ninclude(\"scripts/single_library.lua\")\ninclude(\"scripts/test_suite.lua\")\n"
  },
  {
    "path": "tools/build/scripts/build_paths.lua",
    "content": "build_root = \"build\"\nbuild_bin = build_root .. \"/bin/%{cfg.platform}/%{cfg.buildcfg}\"\nbuild_gen = build_root .. \"/gen/%{cfg.platform}/%{cfg.buildcfg}\"\nbuild_obj = build_root .. \"/obj/%{cfg.platform}/%{cfg.buildcfg}\"\n\nbuild_tools = \"tools/build\"\nbuild_scripts = build_tools .. \"/scripts\"\nbuild_tools_src = build_tools .. \"/src\"\n\nif os.istarget(\"android\") then\n  platform_suffix = \"android\"\nelseif os.istarget(\"windows\") then\n  platform_suffix = \"win\"\nelse\n  platform_suffix = \"posix\"\nend\n"
  },
  {
    "path": "tools/build/scripts/force_compile_as_c.lua",
    "content": "if premake.override then\n  local forced_c_files = {}\n\n  -- Forces all of the given .c and .cc files to be compiled as if they were C.\n  function force_compile_as_c(files)\n    for _, val in ipairs(files) do\n      for _, fname in ipairs(os.matchfiles(val)) do\n        table.insert(forced_c_files, path.getabsolute(fname))\n      end\n    end\n  end\n\n  -- for gmake\n  premake.override(path, \"iscfile\", function(base, fname)\n    if table.contains(forced_c_files, fname) then\n      return true\n    else\n      return base(fname)\n    end\n  end)\n  -- for msvc\n  premake.override(premake.vstudio.vc2010, \"additionalCompileOptions\", function(base, cfg, condition)\n    if cfg.abspath and table.contains(forced_c_files, cfg.abspath) then\n      if condition == nil or condition == '' then\n        _p(3,'<CompileAs>CompileAsC</CompileAs>')\n      else\n        _p(3,'<CompileAs Condition=\"\\'$(Configuration)|$(Platform)\\'==\\'%s\\'\">CompileAsC</CompileAs>', condition)\n      end\n    end\n    return base(cfg, condition)\n  end)\nend\n"
  },
  {
    "path": "tools/build/scripts/force_compile_as_cc.lua",
    "content": "if premake.override then\n  local forced_cc_files = {}\n\n  -- Forces all of the given .c files to be compiled as if they were C++.\n  function force_compile_as_cc(files)\n    for _, val in ipairs(files) do\n      for _, fname in ipairs(os.matchfiles(val)) do\n        table.insert(forced_cc_files, path.getabsolute(fname))\n      end\n    end\n  end\n\n  -- for gmake\n  premake.override(path, \"iscfile\", function(base, fname)\n    if table.contains(forced_cc_files, fname) then\n      return false\n    else\n      return base(fname)\n    end\n  end)\n  -- for msvc\n  premake.override(premake.vstudio.vc2010, \"additionalCompileOptions\", function(base, cfg, condition)\n    if cfg.abspath and table.contains(forced_cc_files, cfg.abspath) then\n      if condition == nil or condition == '' then\n        _p(3,'<CompileAs>CompileAsCpp</CompileAs>')\n      else\n        _p(3,'<CompileAs Condition=\"\\'$(Configuration)|$(Platform)\\'==\\'%s\\'\">CompileAsCpp</CompileAs>', condition)\n      end\n    end\n    return base(cfg, condition)\n  end)\nend\n"
  },
  {
    "path": "tools/build/scripts/pkg_config.lua",
    "content": "-- Helper methods to use the system pkg-config utility\n\npkg_config = {}\n\nlocal function pkg_config_call(lib, what)\n  local result, code = os.outputof(\"pkg-config --\"..what..\" \"..lib)\n  if result then\n    return result\n  else\n    error(\"Failed to run 'pkg-config' for library '\"..lib..\"'. Are the development files installed?\")\n  end\nend\n\nfunction pkg_config.cflags(lib)\n  if not os.istarget(\"linux\") then\n    return\n  end\n  buildoptions({\n    pkg_config_call(lib, \"cflags\"),\n  })\nend\n\nfunction pkg_config.lflags(lib)\n  if not os.istarget(\"linux\") then\n    return\n  end\n  linkoptions({\n    pkg_config_call(lib, \"libs-only-L\"),\n    pkg_config_call(lib, \"libs-only-other\"),\n  })\n  -- We can't just drop the stdout of the `--libs` command in\n  -- linkoptions because library order matters\n  local output = pkg_config_call(lib, \"libs-only-l\")\n  for k, flag in next, string.explode(output, \" \") do\n    -- remove \"-l\"\n    if flag ~= \"\" then\n        links(string.sub(flag, 3))\n    end\n  end\nend\n\nfunction pkg_config.all(lib)\n    pkg_config.cflags(lib)\n    pkg_config.lflags(lib)\nend\n"
  },
  {
    "path": "tools/build/scripts/platform_files.lua",
    "content": "include(\"build_paths.lua\")\ninclude(\"util.lua\")\n\nlocal function match_platform_files(base_path, base_match)\n  files({\n    base_path..\"/\"..base_match..\".h\",\n    base_path..\"/\"..base_match..\".c\",\n    base_path..\"/\"..base_match..\".cc\",\n    base_path..\"/\"..base_match..\".cpp\",\n    base_path..\"/\"..base_match..\".inc\",\n  })\n  removefiles({base_path..\"/\"..\"**_main.cc\"})\n  removefiles({base_path..\"/\"..\"**_test.cc\"})\n  removefiles({base_path..\"/\"..\"**_posix.h\", base_path..\"/\"..\"**_posix.cc\"})\n  removefiles({base_path..\"/\"..\"**_linux.h\", base_path..\"/\"..\"**_linux.cc\"})\n  removefiles({base_path..\"/\"..\"**_gnulinux.h\",\n               base_path..\"/\"..\"**_gnulinux.cc\"})\n  removefiles({base_path..\"/\"..\"**_x11.h\", base_path..\"/\"..\"**_x11.cc\"})\n  removefiles({base_path..\"/\"..\"**_gtk.h\", base_path..\"/\"..\"**_gtk.cc\"})\n  removefiles({base_path..\"/\"..\"**_android.h\", base_path..\"/\"..\"**_android.cc\"})\n  removefiles({base_path..\"/\"..\"**_mac.h\", base_path..\"/\"..\"**_mac.cc\"})\n  removefiles({base_path..\"/\"..\"**_win.h\", base_path..\"/\"..\"**_win.cc\"})\n  filter(\"platforms:Windows\")\n    files({\n      base_path..\"/\"..base_match..\"_win.h\",\n      base_path..\"/\"..base_match..\"_win.cc\",\n    })\n  filter(\"platforms:Linux or Android-*\")\n    files({\n      base_path..\"/\"..base_match..\"_posix.h\",\n      base_path..\"/\"..base_match..\"_posix.cc\",\n      base_path..\"/\"..base_match..\"_linux.h\",\n      base_path..\"/\"..base_match..\"_linux.cc\",\n    })\n  filter(\"platforms:Linux\")\n    files({\n      base_path..\"/\"..base_match..\"_gnulinux.h\",\n      base_path..\"/\"..base_match..\"_gnulinux.cc\",\n      base_path..\"/\"..base_match..\"_x11.h\",\n      base_path..\"/\"..base_match..\"_x11.cc\",\n      base_path..\"/\"..base_match..\"_gtk.h\",\n      base_path..\"/\"..base_match..\"_gtk.cc\",\n    })\n  filter(\"platforms:Android-*\")\n    files({\n      base_path..\"/\"..base_match..\"_android.h\",\n      base_path..\"/\"..base_match..\"_android.cc\",\n    })\n  filter({})\nend\n\n-- Adds all .h and .cc files in the current path that match the current platform\n-- suffix (_win, etc).\nfunction local_platform_files(base_path)\n  match_platform_files(base_path or \".\", \"*\")\nend\n\n-- Adds all .h and .cc files in the current path and all subpaths that match\n-- the current platform suffix (_win, etc).\nfunction recursive_platform_files(base_path)\n  match_platform_files(base_path or \".\", \"**\")\nend\n"
  },
  {
    "path": "tools/build/scripts/single_library.lua",
    "content": "SINGLE_LIBRARY_PLATFORM_PATTERNS = {\n    \"Android-*\",\n};\n\nSINGLE_LIBRARY_FILTER =\n    \"platforms:\" .. table.concat(SINGLE_LIBRARY_PLATFORM_PATTERNS, \" or \");\nNOT_SINGLE_LIBRARY_FILTER = table.translate(\n    SINGLE_LIBRARY_PLATFORM_PATTERNS,\n    function(pattern)\n      return \"platforms:not \" .. pattern;\n    end);\n\nfunction single_library_windowed_app_kind()\n  filter(SINGLE_LIBRARY_FILTER);\n    kind(\"StaticLib\");\n    wholelib(\"On\");\n  filter(NOT_SINGLE_LIBRARY_FILTER);\n    kind(\"WindowedApp\");\n  filter({});\nend\n"
  },
  {
    "path": "tools/build/scripts/test_suite.lua",
    "content": "include(\"build_paths.lua\")\ninclude(\"util.lua\")\n\nnewoption({\n  trigger = \"test-suite-mode\",\n  description = \"Whether to merge all tests in a test_suite into a single project\",\n  value = \"MODE\",\n  allowed = {\n    { \"individual\", \"One binary per test.\" },\n    { \"combined\", \"One binary per test suite (default).\" },\n  },\n})\n\nlocal function combined_test_suite(test_suite_name, project_root, base_path, config)\n  group(\"tests\")\n  project(test_suite_name)\n    kind(\"ConsoleApp\")\n    language(\"C++\")\n    includedirs(merge_arrays(config[\"includedirs\"], {\n      project_root..\"/\"..build_tools,\n      project_root..\"/\"..build_tools_src,\n      project_root..\"/\"..build_tools..\"/third_party/catch/include\",\n    }))\n    libdirs(merge_arrays(config[\"libdirs\"], {\n      project_root..\"/\"..build_bin,\n    }))\n    links(config[\"links\"])\n    if config.filtered_links ~= nil then\n      for _, filtered_links in ipairs(config.filtered_links) do\n        filter(filtered_links.filter)\n        links(filtered_links.links)\n      end\n      filter({})\n    end\n    defines({\n      \"XE_TEST_SUITE_NAME=\\\"\"..test_suite_name..\"\\\"\",\n    })\n    files({\n      project_root..\"/\"..build_tools_src..\"/test_suite_main.cc\",\n      project_root..\"/src/xenia/base/console_app_main_\"..platform_suffix..\".cc\",\n      base_path..\"/**_test.cc\",\n    })\n    filter(\"toolset:msc\")\n      -- Edit and Continue in MSVC can cause the __LINE__ macro to produce\n      -- invalid values, which breaks the usability of Catch2 output on\n      -- failed tests.\n      editAndContinue(\"Off\")\nend\n\nlocal function split_test_suite(test_suite_name, project_root, base_path, config)\n  local test_paths = os.matchfiles(base_path..\"/**_test.cc\")\n  for _, file_path in pairs(test_paths) do\n    local test_name = file_path:match(\"(.*).cc\")\n    group(\"tests/\"..test_suite_name)\n    project(test_suite_name..\"-\"..test_name)\n      kind(\"ConsoleApp\")\n      language(\"C++\")\n      includedirs(merge_arrays(config[\"includedirs\"], {\n        project_root..\"/\"..build_tools,\n        project_root..\"/\"..build_tools_src,\n        project_root..\"/\"..build_tools..\"/third_party/catch/include\",\n      }))\n      libdirs(merge_arrays(config[\"libdirs\"], {\n        project_root..\"/\"..build_bin,\n      }))\n      links(config[\"links\"])\n      if config.filtered_links ~= nil then\n        for _, filtered_links in ipairs(config.filtered_links) do\n          filter(filtered_links.filter)\n          links(filtered_links.links)\n        end\n        filter({})\n      end\n      files({\n        project_root..\"/\"..build_tools_src..\"/test_suite_main.cc\",\n        file_path,\n      })\n      filter(\"toolset:msc\")\n        -- Edit and Continue in MSVC can cause the __LINE__ macro to produce\n        -- invalid values, which breaks the usability of Catch2 output on\n        -- failed tests.\n        editAndContinue(\"Off\")\n  end\nend\n\n-- Defines a test suite binary.\n-- Can either be a single binary with all tests or one binary per test based on\n-- the --test-suite-mode= option.\nfunction test_suite(\n    test_suite_name,        -- Project or group name for the entire suite.\n    project_root,           -- Project root path (with build_tools/ under it).\n    base_path,              -- Base source path to search for _test.cc files.\n    config)                 -- Include/lib directories and links for binaries.\n  if _OPTIONS[\"test-suite-mode\"] == \"individual\" then\n    split_test_suite(test_suite_name, project_root, base_path, config)\n  else\n    combined_test_suite(test_suite_name, project_root, base_path, config)\n  end\nend\n"
  },
  {
    "path": "tools/build/scripts/util.lua",
    "content": "-- Prints a table and all of its contents.\nfunction print_r(t)\n  local print_r_cache={}\n  local function sub_print_r(t, indent)\n    if (print_r_cache[tostring(t)]) then\n      print(indent..\"*\"..tostring(t))\n    else\n      print_r_cache[tostring(t)]=true\n      if (type(t)==\"table\") then\n        for pos,val in pairs(t) do\n          if (type(val)==\"table\") then\n            print(indent..\"[\"..pos..\"] => \"..tostring(t)..\" {\")\n            sub_print_r(val,indent..string.rep(\" \",string.len(pos)+8))\n            print(indent..string.rep(\" \",string.len(pos)+6)..\"}\")\n          elseif (type(val)==\"string\") then\n            print(indent..\"[\"..pos..'] => \"'..val..'\"')\n          else\n            print(indent..\"[\"..pos..\"] => \"..tostring(val))\n          end\n        end\n      else\n        print(indent..tostring(t))\n      end\n    end\n  end\n  if (type(t)==\"table\") then\n    print(tostring(t)..\" {\")\n    sub_print_r(t,\"  \")\n    print(\"}\")\n  else\n    sub_print_r(t,\"  \")\n  end\n  print()\nend\n\n-- Merges two tables and returns the resulting table.\nfunction merge_tables(t1, t2)\n  local result = {}\n  for k,v in pairs(t1 or {}) do result[k] = v end\n  for k,v in pairs(t2 or {}) do result[k] = v end\n  return result\nend\n\n-- Merges to arrays and returns the resulting array.\nfunction merge_arrays(t1, t2)\n  local result = {}\n  for k,v in pairs(t1 or {}) do result[#result + 1] = v end\n  for k,v in pairs(t2 or {}) do result[#result + 1] = v end\n  return result\nend\n"
  },
  {
    "path": "tools/build/src/test_suite_main.cc",
    "content": "/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright 2021 Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */\n\n#include <cstdlib>\n#include <cstring>\n#include <locale>\n#include <string>\n#include <vector>\n\n#include \"xenia/base/console_app_main.h\"\n#include \"xenia/base/cvar.h\"\n\n#define CATCH_CONFIG_RUNNER\n#include \"third_party/catch/single_include/catch2/catch.hpp\"\n\nnamespace xe {\nnamespace test_suite {\n\nint test_suite_main(const std::vector<std::string>& args) {\n  // Catch doesn't expose a way to pass a vector of strings, despite building a\n  // vector internally.\n  int argc = 0;\n  std::vector<const char*> argv;\n  for (const auto& arg : args) {\n    argv.push_back(arg.c_str());\n    argc++;\n  }\n\n  // Run Catch.\n  return Catch::Session().run(argc, argv.data());\n}\n\n}  // namespace test_suite\n}  // namespace xe\n\n#ifndef XE_TEST_SUITE_NAME\n#error XE_TEST_SUITE_NAME is undefined!\n#endif\n\nXE_DEFINE_CONSOLE_APP_TRANSPARENT(XE_TEST_SUITE_NAME,\n                                  xe::test_suite::test_suite_main);\n"
  },
  {
    "path": "tools/diff.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\"\"\"python diff.py file1 file2 diff\"\"\"\n\nimport difflib\nimport sys\n\ndiff = difflib.unified_diff(\n    open(sys.argv[1], encoding='utf-8').readlines(),\n    open(sys.argv[2], encoding='utf-8').readlines())\nwith open(sys.argv[3], 'w', encoding='utf-8') as f:\n    f.write(''.join(diff))\n"
  },
  {
    "path": "tools/generate_map.idc",
    "content": "#include <idc.idc>\n\nstatic is_bad_name(s)\n{\n  auto p;\n\n  if (s == \"\")\n  {\n    return 1;\n  }\n\n  p = substr(s, 0, 4);\n  if (p == \"unk_\" ||\n      p == \"loc_\" ||\n      p == \"sub_\" ||\n      p == \"off_\" ||\n      p == \"flt_\" ||\n      p == \"dbl_\")\n  {\n    return 1;\n  }\n\n  p = substr(s, 0, 5);\n  if (p == \"byte_\" ||\n      p == \"word_\")\n  {\n    return 1;\n  }\n\n  p = substr(s, 0, 6);\n  if (p == \"dword_\" ||\n      p == \"qword_\")\n  {\n    return 1;\n  }\n\n  p = substr(s, 0, 7);\n  if (p == \"locret_\" ||\n      p == \"__imp__\")\n  {\n    return 1;\n  }\n\n  p = substr(s, 0, 8);\n  if (p == \"xam_xex_\")\n  {\n    return 1;\n  }\n\n  p = substr(s, 0, 9);\n  if (p == \"xboxkrnl_\")\n  {\n    return 1;\n  }\n\n  p = substr(s, 0, 10);\n  if (p == \"j_xam_xex_\")\n  {\n    return 1;\n  }\n\n  p = substr(s, 0, 15);\n  if (p == \"j_xboxkrnl_exe_\")\n  {\n    return 1;\n  }\n\n  return 0;\n}\n\nstatic main()\n{\n  auto just_code;\n  auto seg_start, seg_end, seg_base, seg_name, seg_type;\n  auto item_start, item_end, item_flags, item_name;\n  auto path, handle;\n\n  seg_start = FirstSeg();\n  seg_end = SegEnd(seg_start);\n  if (seg_start == BADADDR ||\n      seg_end == BADADDR)\n  {\n    return;\n  }\n\n  path = AskFile(1, \"*.map\", \"Save map\");\n  if (path == \"\")\n  {\n    return;\n  }\n\n\n  just_code = AskYN(0, \"Just code?\") == 1;\n\n  handle = fopen(path, \"wb\");\n  if (!handle)\n  {\n    return;\n  }\n\n  seg_base = 0;\n  fprintf(handle, \" Start         Length     Name                   Class\\n\");\n  do\n  {\n    seg_base++;\n    seg_name = SegName(seg_start);\n    seg_type = GetSegmentAttr(seg_start, SEGATTR_TYPE);\n\n    fprintf(handle, \" %04x:%08x %08xH %-23s %s\\n\", seg_base, -1, seg_end - seg_start, seg_name, seg_type == 2 ? \"CODE\" : \"DATA\");\n\n    seg_start = NextSeg(seg_start);\n    seg_end = SegEnd(seg_start);\n  }\n  while (seg_start != BADADDR &&\n         seg_end != BADADDR);\n\n  fprintf(handle, \"\\n\");\n  fprintf(handle, \"  Address         Publics by Value              Rva+Base       Lib:Object\\n\");\n\n  seg_start = FirstSeg();\n  seg_end = SegEnd(seg_start);\n  seg_base = 0;\n  do\n  {\n    seg_base++;\n\n    item_start = seg_start;\n    while (item_start < seg_end)\n    {\n      item_end = item_start + 4;\n      if (item_end == BADADDR)\n      {\n        break;\n      }\n\n      item_name = GetTrueNameEx(BADADDR, item_start);\n      if (is_bad_name(item_name) == 0)\n      {\n        item_flags = GetFlags(item_start);\n        if (just_code == 0 || (item_flags & FF_CODE) == FF_CODE)\n        {\n          fprintf(handle, \" %04x:%08x    %-29s %08x       %s\\n\", seg_base, item_start - seg_start, item_name, item_start, \"<???>\");\n        }\n      }\n      item_start = item_start + 4;\n    }\n\n    seg_start = NextSeg(seg_start);\n    seg_end = SegEnd(seg_start);\n  }\n  while (seg_start != BADADDR &&\n         seg_end != BADADDR);\n\n  fclose(handle);\n}\n"
  },
  {
    "path": "tools/gpu-trace-diff",
    "content": "#!/usr/bin/env python3 \n\n# Copyright 2015 Ben Vanik. All Rights Reserved.\n\n\"\"\"GPU trace runner and comparison tool.\n\"\"\"\n\n__author__ = 'ben.vanik@gmail.com (Ben Vanik)'\n\n\nimport argparse\nimport hashlib\nimport math\nimport operator\nimport os\nimport shutil\nimport subprocess\nimport sys\n\nself_path = os.path.dirname(os.path.abspath(__file__))\n\n\ntry:\n  from PIL import Image, ImageChops\nexcept:\n  print 'ERROR: could not find ImageChops - install with:'\n  print '  python -m pip install Pillow'\n  sys.exit(1)\n\n\ndef main():\n  # Add self to the root search path.\n  sys.path.insert(0, os.path.abspath(os.path.dirname(__file__)))\n\n  # Check python version.\n  if not sys.version_info[:2] == (2, 7):\n    # TODO(benvanik): allow things to work with 3, but warn on clang-format.\n    print('ERROR: Python 2.7 must be installed and on PATH')\n    sys.exit(1)\n    return\n\n  # Setup main argument parser and common arguments.\n  parser = argparse.ArgumentParser(prog='gpu-trace-diff',\n                                   description='Run and diff GPU traces.')\n  parser.add_argument(\n      '-x', '--executable',\n      default='build/bin/Windows/Debug/xenia-gpu-vulkan-trace-dump.exe')\n  parser.add_argument('-t', '--trace_file', action='append')\n  parser.add_argument('-p', '--trace_path')\n  parser.add_argument('-o', '--output_path', default='')\n  parser.add_argument('-r', '--reference_path', default='')\n  parser.add_argument('-u', '--update_reference_files', action='store_true')\n  parser.add_argument('-n', '--generate_missing_reference_files',\n                      action='store_true')\n  args = vars(parser.parse_args(sys.argv[1:]))\n\n  exe_path = args['executable']\n  if not os.path.exists(exe_path):\n    print 'ERROR: executable %s not found, ensure it is built' % (exe_path)\n    sys.exit(1)\n    return\n\n  trace_files = args['trace_file'] or []\n  if args['trace_path']:\n    for child_path in os.listdir(args['trace_path']):\n      if (os.path.splitext(child_path)[1] == '.xenia_gpu_trace'):\n        trace_files.append(os.path.join(args['trace_path'], child_path))\n\n  # If the user passed no args, die nicely.\n  if not trace_files:\n    parser.print_help()\n    sys.exit(1)\n    return\n\n  output_path = args['output_path'].replace('/', os.pathsep)\n  if not os.path.exists(output_path):\n    os.makedirs(output_path)\n\n  html_path = os.path.join(output_path, 'results.html')\n  if os.path.exists(html_path):\n    os.remove(html_path)\n\n  reference_path = args['reference_path'].replace('/', os.pathsep)\n  if not os.path.exists(reference_path):\n    print('Reference path %s not found; forcing to update mode')\n    os.makedirs(reference_path)\n    args['update_reference_files'] = True\n\n  html_file = None\n  if not args['update_reference_files']:\n    html_file = open(html_path, 'w')\n    html_file.write(\"\"\"\n<html><head>\n<title>GPU Trace Comparison Results</title>\n</head><body>\n<table>\n<tr>\n<td>Output</td>\n<td>Diff</td>\n<td>Reference</td>\n</tr>\n\"\"\")\n    html_rel_path = os.path.relpath(os.getcwd(), output_path)\n    html_file.write('<base href=\"%s\">' % html_rel_path)\n\n  diff_count = 0\n  for trace_file in trace_files:\n    trace_file = trace_file.replace('/', os.pathsep)\n    base_path = os.path.dirname(trace_file)\n    file_name = os.path.basename(trace_file)\n    reference_file_path = os.path.join(reference_path, file_name + '.png')\n    output_file_path = os.path.join(output_path, file_name + '.png')\n    diff_file_path = os.path.join(output_path, file_name + '.diff.png')\n\n    if (args['generate_missing_reference_files'] and\n        os.path.exists(reference_file_path)):\n      # Only process tracess that are missing reference files.\n      continue\n\n    print '--------------------------------------------------------------------'\n    print '    Trace: %s' % (trace_file)\n    print 'Reference: %s' % (reference_file_path)\n\n    # Cleanup old files.\n    if os.path.exists(output_file_path):\n      os.remove(output_file_path)\n    if os.path.exists(diff_file_path):\n      os.remove(diff_file_path)\n\n    # Run the trace dump too to produce a new png.\n    run_args = [\n        exe_path.replace('/', os.pathsep),\n        '--target_trace_file=%s' % (trace_file.replace(os.pathsep, '/')),\n        '--trace_dump_path=%s' % (output_path.replace(os.pathsep, '/')),\n        ]\n    tries_remaining = 3\n    while tries_remaining:\n      try:\n        startupinfo = None\n        if os.name == 'nt':\n          startupinfo = subprocess.STARTUPINFO()\n          startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW\n          startupinfo.wShowWindow = 4  # SW_SHOWNOACTIVATE\n        proc = subprocess.Popen(\n            run_args,\n            shell=True,\n            startupinfo=startupinfo,\n            stdout=subprocess.PIPE,\n            stderr=subprocess.PIPE)\n        out, err = proc.communicate()\n        # print out\n        # print err\n      except Exception as e:\n        print 'ERROR: failed to run trace dump tool'\n        print run_args\n        print e\n        sys.exit(1)\n        return\n\n      # Ensure the file was generated\n      if not os.path.exists(output_file_path):\n        print 'New image not generated; died?'\n        tries_remaining -= 1\n        continue\n      else:\n        break\n\n    if not tries_remaining and not os.path.exists(output_file_path):\n      print 'Retries exceeded; aborting'\n      sys.exit(1)\n      return\n\n    # If updating references, move the output into place.\n    if args['update_reference_files']:\n      print 'Updating reference file...'\n      if not os.path.exists(os.path.dirname(reference_file_path)):\n        os.makedirs(os.path.dirname(reference_file_path))\n      shutil.copy2(output_file_path, reference_file_path)\n      continue\n\n    # If we didn't have a reference file for this and are in gen mode, just copy\n    # and ignore.\n    if (not os.path.exists(reference_file_path) and\n        args['generate_missing_reference_files']):\n      print 'Adding new reference file...'\n      if not os.path.exists(os.path.dirname(reference_file_path)):\n        os.makedirs(os.path.dirname(reference_file_path))\n      shutil.copy2(output_file_path, reference_file_path)\n      continue\n\n    # Compare files.\n    print '      New: %s' % (output_file_path)\n    reference_image = Image.open(reference_file_path)\n    reference_rgb = reference_image.convert('RGB').tobytes('raw', 'RGB')\n    reference_hash = hashlib.sha1(reference_rgb).hexdigest()\n    new_image = Image.open(output_file_path)\n    new_rgb = new_image.convert('RGB').tobytes('raw', 'RGB')\n    new_hash = hashlib.sha1(new_rgb).hexdigest()\n    is_diff = reference_hash != new_hash\n    if is_diff:\n      print 'DIFFERENCE DETECTED! %s != %s' % (reference_hash, new_hash)\n      diff_count += 1\n      diff_image = ImageChops.difference(reference_image, new_image)\n      diff_image.save(diff_file_path)\n    else:\n      print 'Matches exactly!'\n\n    if html_file:\n      html_file.write('<tr>')\n      html_file.write('<td colspan=\"3\">%s</td>' % (trace_file))\n      html_file.write('</tr>')\n      html_file.write('<tr>')\n      if is_diff:\n        html_file.write(\n            '<td><img class=\"image output-image\" src=\"%s\"></td>' % (\n                output_file_path))\n        html_file.write(\n            '<td><img class=\"image diff-image\" src=\"%s\"></td>' % (\n                diff_file_path))\n        html_file.write(\n            '<td><img class=\"image reference-image\" src=\"%s\"></td>' % (\n                reference_file_path))\n      else:\n        html_file.write(\n            '<td><img class=\"image reference-image\" src=\"%s\"></td>' % (\n                reference_file_path))\n        html_file.write('<td></td><td></td>')\n      html_file.write('</tr>')\n\n    print ''\n\n  if html_file:\n    html_file.write(\"\"\"\n</table>\n<script>\nfunction toggleSizes() {\n  [].forEach.call(document.getElementsByClassName('image'), function(el) {\n    if (el.style.width != '480px') {\n      el.style.width = '480px';\n    } else {\n      el.style.width = '';\n    }\n  });\n}\n[].forEach.call(document.getElementsByClassName('image'), function(el) {\n  el.onclick = toggleSizes;\n});\ntoggleSizes();\n</script>\n</body></html>\n\"\"\")\n    html_file.close()\n\n  if not diff_count:\n    print 'All files match!'\n    sys.exit(0)\n  else:\n    print '%s files do not match!' % (diff_count)\n    sys.exit(1)\n\nif __name__ == '__main__':\n  main()\n"
  },
  {
    "path": "tools/ppc-instructions.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<root>\n<ppc-isa name=\"6xx_pem\">\n  <!-- These match docs/ppc/core_instructions.pdf -->\n  <insn mnem=\"addx\"         opcode=\"7c000214\" form=\"XO\"       group=\"i\" desc=\"Add\">\n    <in field=\"RA\" />\n    <in field=\"RB\" />\n    <out field=\"RD\" />\n    <out field=\"OE\" conditional=\"true\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>add[OE][Rc] [RD], [RA], [RB]</disasm>\n  </insn>\n  <insn mnem=\"addcx\"        opcode=\"7c000014\" form=\"XO\"       group=\"i\" desc=\"Add Carrying\">\n    <in field=\"RA\" />\n    <in field=\"RB\" />\n    <out field=\"RD\" />\n    <out field=\"CA\" />\n    <out field=\"OE\" conditional=\"true\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>addc[OE][Rc] [RD], [RA], [RB]</disasm>\n  </insn>\n  <insn mnem=\"addex\"        opcode=\"7c000114\" form=\"XO\"       group=\"i\" desc=\"Add Extended\">\n    <in field=\"RA\" />\n    <in field=\"RB\" />\n    <in field=\"CA\" />\n    <out field=\"RD\" />\n    <out field=\"OE\" conditional=\"true\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>adde[OE][Rc] [RD], [RA], [RB]</disasm>\n  </insn>\n  <insn mnem=\"addi\"         opcode=\"38000000\" form=\"D\"        group=\"i\" desc=\"Add Immediate\">\n    <in field=\"RA0\" />\n    <in field=\"SIMM\" />\n    <out field=\"RD\" />\n    <disasm>addi [RD], [RA0], [SIMM]</disasm>\n  </insn>\n  <insn mnem=\"addic\"        opcode=\"30000000\" form=\"D\"        group=\"i\" desc=\"Add Immediate Carrying\">\n    <in field=\"RA\" />\n    <in field=\"SIMM\" />\n    <out field=\"RD\" />\n    <out field=\"CA\" />\n    <disasm>addic [RD], [RA], [SIMM]</disasm>\n  </insn>\n  <insn mnem=\"addic.\"       opcode=\"34000000\" form=\"D\"        group=\"i\" desc=\"Add Immediate Carrying and Record\">\n    <in field=\"RA\" />\n    <in field=\"SIMM\" />\n    <out field=\"RD\" />\n    <out field=\"CA\" />\n    <out field=\"CR\" />\n    <disasm>addic. [RD], [RA], [SIMM]</disasm>\n  </insn>\n  <insn mnem=\"addis\"        opcode=\"3c000000\" form=\"D\"        group=\"i\" desc=\"Add Immediate Shifted\">\n    <in field=\"RA0\" />\n    <in field=\"SIMM\" />\n    <out field=\"RD\" />\n    <disasm>addis [RD], [RA0], [SIMM]</disasm>\n  </insn>\n  <insn mnem=\"addmex\"       opcode=\"7c0001d4\" form=\"XO\"       group=\"i\" desc=\"Add to Minus One Extended\">\n    <in field=\"RA\" />\n    <in field=\"CA\" />\n    <out field=\"RD\" />\n    <out field=\"CA\" />\n    <out field=\"OE\" conditional=\"true\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>addme[OE][Rc] [RD], [RA]</disasm>\n  </insn>\n  <insn mnem=\"addzex\"       opcode=\"7c000194\" form=\"XO\"       group=\"i\" desc=\"Add to Zero Extended\">\n    <in field=\"RA\" />\n    <in field=\"CA\" />\n    <out field=\"RD\" />\n    <out field=\"CA\" />\n    <out field=\"OE\" conditional=\"true\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>addze[OE][Rc] [RD], [RA]</disasm>\n  </insn>\n  <insn mnem=\"andx\"         opcode=\"7c000038\" form=\"X\"        group=\"i\" desc=\"AND\">\n    <in field=\"RS\" />\n    <in field=\"RB\" />\n    <out field=\"RA\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>and[Rc] [RA], [RS], [RB]</disasm>\n  </insn>\n  <insn mnem=\"andcx\"        opcode=\"7c000078\" form=\"X\"        group=\"i\" desc=\"AND with Complement\">\n    <in field=\"RS\" />\n    <in field=\"RB\" />\n    <out field=\"RA\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>andc[Rc] [RA], [RS], [RB]</disasm>\n  </insn>\n  <insn mnem=\"andi.\"        opcode=\"70000000\" form=\"D\"        group=\"i\" desc=\"AND Immediate\">\n    <in field=\"RS\" />\n    <in field=\"UIMM\" />\n    <out field=\"RA\" />\n    <out field=\"CR\" />\n    <disasm>andi. [RA], [RS], [UIMM]</disasm>\n  </insn>\n  <insn mnem=\"andis.\"       opcode=\"74000000\" form=\"D\"        group=\"i\" desc=\"AND Immediate Shifted\">\n    <in field=\"RS\" />\n    <in field=\"UIMM\" />\n    <out field=\"RA\" />\n    <out field=\"CR\" />\n    <disasm>andis. [RA], [RS], [UIMM]</disasm>\n  </insn>\n  <insn mnem=\"bx\"           opcode=\"48000000\" form=\"I\"        group=\"b\" desc=\"Branch\" sync=\"true\">\n    <in field=\"LK\" />\n    <in field=\"AA\" />\n    <in field=\"ADDR\" />\n    <out field=\"LR\" conditional=\"true\" />\n    <disasm>b[LK][AA] [ADDR]</disasm>\n  </insn>\n  <insn mnem=\"bcx\"          opcode=\"40000000\" form=\"B\"        group=\"b\" desc=\"Branch Conditional\" sync=\"true\">\n    <in field=\"LK\" />\n    <in field=\"AA\" />\n    <in field=\"BO\" />\n    <in field=\"BI\" />\n    <in field=\"ADDR\" />\n    <in field=\"CR\" conditional=\"true\" />\n    <in field=\"CTR\" conditional=\"true\" />\n    <out field=\"CTR\" conditional=\"true\" />\n    <out field=\"LR\" conditional=\"true\" />\n    <disasm>bc[LK][AA] [BO], [BI], [ADDR]</disasm>\n  </insn>\n  <insn mnem=\"bcctrx\"       opcode=\"4c000420\" form=\"XL\"       group=\"b\" desc=\"Branch Conditional to Count Register\" sync=\"true\">\n    <in field=\"LK\" />\n    <in field=\"BO\" />\n    <in field=\"BI\" />\n    <in field=\"CR\" />\n    <in field=\"CTR\" />\n    <out field=\"LR\" conditional=\"true\" />\n    <disasm>bcctr[LK] [BO], [BI]</disasm>\n  </insn>\n  <insn mnem=\"bclrx\"        opcode=\"4c000020\" form=\"XL\"       group=\"b\" desc=\"Branch Conditional to Link Register\" sync=\"true\">\n    <in field=\"LK\" />\n    <in field=\"BO\" />\n    <in field=\"BI\" />\n    <in field=\"CR\" conditional=\"true\" />\n    <in field=\"CTR\" conditional=\"true\" />\n    <out field=\"CTR\" conditional=\"true\" />\n    <out field=\"LR\" conditional=\"true\" />\n    <disasm>bclr[LK] [BO], [BI]</disasm>\n  </insn>\n  <insn mnem=\"cmp\"          opcode=\"7c000000\" form=\"X\"        group=\"i\" desc=\"Compare\">\n    <in field=\"L\" />\n    <in field=\"RA\" />\n    <in field=\"RB\" />\n    <out field=\"CRFD\" />\n    <disasm>cmp [CRFD], [L], [RA], [RB]</disasm>\n  </insn>\n  <insn mnem=\"cmpi\"         opcode=\"2c000000\" form=\"D\"        group=\"i\" desc=\"Compare Immediate\">\n    <in field=\"L\" />\n    <in field=\"RA\" />\n    <in field=\"SIMM\" />\n    <out field=\"RD\" />\n    <out field=\"CRFD\" />\n    <disasm>cmpi [CRFD], [L], [RA], [SIMM]</disasm>\n  </insn>\n  <insn mnem=\"cmpl\"         opcode=\"7c000040\" form=\"X\"        group=\"i\" desc=\"Compare Logical\">\n    <in field=\"L\" />\n    <in field=\"RA\" />\n    <in field=\"RB\" />\n    <out field=\"CRFD\" />\n    <disasm>cmpl [CRFD], [L], [RA], [RB]</disasm>\n  </insn>\n  <insn mnem=\"cmpli\"        opcode=\"28000000\" form=\"D\"        group=\"i\" desc=\"Compare Logical Immediate\">\n    <in field=\"L\" />\n    <in field=\"RA\" />\n    <in field=\"UIMM\" />\n    <out field=\"CRFD\" />\n    <disasm>cmpli [CRFD], [L], [RA], [UIMM]</disasm>\n  </insn>\n  <insn mnem=\"cntlzdx\"      opcode=\"7c000074\" form=\"X\"        group=\"i\" desc=\"Count Leading Zeros Doubleword\">\n    <in field=\"RS\" />\n    <out field=\"RA\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <!-- note: rc may not be supported? -->\n    <disasm>cntlzd [RA], [RS]</disasm>\n  </insn>\n  <insn mnem=\"cntlzwx\"      opcode=\"7c000034\" form=\"X\"        group=\"i\" desc=\"Count Leading Zeros Word\">\n    <in field=\"RS\" />\n    <out field=\"RA\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>cntlzw[Rc] [RA], [RS]</disasm>\n  </insn>\n  <insn mnem=\"crand\"        opcode=\"4c000202\" form=\"XL\"       group=\"c\" desc=\"Condition Register AND\">\n    <in field=\"CRBA\" />\n    <in field=\"CRBB\" />\n    <out field=\"CRBD\" />\n    <disasm>crand [CRBD], [CRBA], [CRBB]</disasm>\n  </insn>\n  <insn mnem=\"crandc\"       opcode=\"4c000102\" form=\"XL\"       group=\"c\" desc=\"Condition Register AND with Complement\">\n    <in field=\"CRBA\" />\n    <in field=\"CRBB\" />\n    <out field=\"CRBD\" />\n    <disasm>crandc [CRBD], [CRBA], [CRBB]</disasm>\n  </insn>\n  <insn mnem=\"creqv\"        opcode=\"4c000242\" form=\"XL\"       group=\"c\" desc=\"Condition Register Equivalent\">\n    <in field=\"CRBA\" />\n    <in field=\"CRBB\" />\n    <out field=\"CRBD\" />\n    <disasm>creqv [CRBD], [CRBA], [CRBB]</disasm>\n  </insn>\n  <insn mnem=\"crnand\"       opcode=\"4c0001c2\" form=\"XL\"       group=\"c\" desc=\"Condition Register NAND\">\n    <in field=\"CRBA\" />\n    <in field=\"CRBB\" />\n    <out field=\"CRBD\" />\n    <disasm>crnand [CRBD], [CRBA], [CRBB]</disasm>\n  </insn>\n  <insn mnem=\"crnor\"        opcode=\"4c000042\" form=\"XL\"       group=\"c\" desc=\"Condition Register NOR\">\n    <in field=\"CRBA\" />\n    <in field=\"CRBB\" />\n    <out field=\"CRBD\" />\n    <disasm>crnor [CRBD], [CRBA], [CRBB]</disasm>\n  </insn>\n  <insn mnem=\"cror\"         opcode=\"4c000382\" form=\"XL\"       group=\"c\" desc=\"Condition Register OR\">\n    <in field=\"CRBA\" />\n    <in field=\"CRBB\" />\n    <out field=\"CRBD\" />\n    <disasm>cror [CRBD], [CRBA], [CRBB]</disasm>\n  </insn>\n  <insn mnem=\"crorc\"        opcode=\"4c000342\" form=\"XL\"       group=\"c\" desc=\"Condition Register OR with Complement\">\n    <in field=\"CRBA\" />\n    <in field=\"CRBB\" />\n    <out field=\"CRBD\" />\n    <disasm>crorc [CRBD], [CRBA], [CRBB]</disasm>\n  </insn>\n  <insn mnem=\"crxor\"        opcode=\"4c000182\" form=\"XL\"       group=\"c\" desc=\"Condition Register XOR\">\n    <in field=\"CRBA\" />\n    <in field=\"CRBB\" />\n    <out field=\"CRBD\" />\n    <disasm>crxor [CRBD], [CRBA], [CRBB]</disasm>\n  </insn>\n  <insn mnem=\"dcbf\"         opcode=\"7c0000ac\" form=\"X\"        group=\"m\" desc=\"Data Cache Block Flush\">\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <disasm>dcbf [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"dcbi\"         opcode=\"7c0003ac\" form=\"X\"        group=\"m\" desc=\"Data Cache Block Invalidate\">\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <disasm>dcbi [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"dcbst\"        opcode=\"7c00006c\" form=\"X\"        group=\"m\" desc=\"Data Cache Block Store\">\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <disasm>dcbst [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"dcbt\"         opcode=\"7c00022c\" form=\"X\"        group=\"m\" desc=\"Data Cache Block Touch\">\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <disasm>dcbt [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"dcbtst\"       opcode=\"7c0001ec\" form=\"X\"        group=\"m\" desc=\"Data Cache Block Touch for Store\">\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <disasm>dcbtst [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"dcbz\"         opcode=\"7c0007ec\" form=\"DCBZ\"     group=\"m\" desc=\"Data Cache Block Clear to Zero\">\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <disasm>dcbz [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"dcbz128\"      opcode=\"7c2007ec\" form=\"DCBZ\"     group=\"m\" desc=\"Data Cache Block Clear to Zero 128\">\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <disasm>dcbz128 [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"divdx\"        opcode=\"7c0003d2\" form=\"XO\"       group=\"i\" desc=\"Divide Doubleword\">\n    <in field=\"RA\" />\n    <in field=\"RB\" />\n    <out field=\"RD\" />\n    <out field=\"OE\" conditional=\"true\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>divd[OE][Rc] [RD], [RA], [RB]</disasm>\n  </insn>\n  <insn mnem=\"divdux\"       opcode=\"7c000392\" form=\"XO\"       group=\"i\" desc=\"Divide Doubleword Unsigned\">\n    <in field=\"RA\" />\n    <in field=\"RB\" />\n    <out field=\"RD\" />\n    <out field=\"OE\" conditional=\"true\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>divdu[OE][Rc] [RD], [RA], [RB]</disasm>\n  </insn>\n  <insn mnem=\"divwx\"        opcode=\"7c0003d6\" form=\"XO\"       group=\"i\" desc=\"Divide Word\">\n    <in field=\"RA\" />\n    <in field=\"RB\" />\n    <out field=\"RD\" />\n    <out field=\"OE\" conditional=\"true\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>divw[OE][Rc] [RD], [RA], [RB]</disasm>\n  </insn>\n  <insn mnem=\"divwux\"       opcode=\"7c000396\" form=\"XO\"       group=\"i\" desc=\"Divide Word Unsigned\">\n    <in field=\"RA\" />\n    <in field=\"RB\" />\n    <out field=\"RD\" />\n    <out field=\"OE\" conditional=\"true\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>divwu[OE][Rc] [RD], [RA], [RB]</disasm>\n  </insn>\n  <insn mnem=\"eieio\"        opcode=\"7c0006ac\" form=\"X\"        group=\"i\" desc=\"Enforce In-Order Execution of I/O\">\n    <disasm>eieio</disasm>\n  </insn>\n  <insn mnem=\"eqvx\"         opcode=\"7c000238\" form=\"X\"        group=\"i\" desc=\"Equivalent\">\n    <in field=\"RS\" />\n    <in field=\"RB\" />\n    <out field=\"RA\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>eqv[Rc] [RA], [RS], [RB]</disasm>\n  </insn>\n  <insn mnem=\"extsbx\"       opcode=\"7c000774\" form=\"X\"        group=\"i\" desc=\"Extend Sign Byte\">\n    <in field=\"RS\" />\n    <out field=\"RA\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>extsb[Rc] [RA], [RS]</disasm>\n  </insn>\n  <insn mnem=\"extshx\"       opcode=\"7c000734\" form=\"X\"        group=\"i\" desc=\"Extend Sign Half Word\">\n    <in field=\"RS\" />\n    <out field=\"RA\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>extsh[Rc] [RA], [RS]</disasm>\n  </insn>\n  <insn mnem=\"extswx\"       opcode=\"7c0007B4\" form=\"X\"        group=\"i\" desc=\"Extend Sign Word\">\n    <in field=\"RS\" />\n    <out field=\"RA\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>extsw[Rc] [RA], [RS]</disasm>\n  </insn>\n  <insn mnem=\"fabsx\"        opcode=\"fc000210\" form=\"X\"        group=\"f\" desc=\"Floating Absolute Value\">\n    <in field=\"FB\" />\n    <out field=\"FD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>fabs[Rc] [FD], [FB]</disasm>\n  </insn>\n  <insn mnem=\"faddx\"        opcode=\"fc00002a\" form=\"A\"        group=\"f\" desc=\"Floating Add\">\n    <in field=\"FA\" />\n    <in field=\"FB\" />\n    <out field=\"FD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <out field=\"FPSCR\" />\n    <disasm>fadd[Rc] [FD], [FA], [FB]</disasm>\n  </insn>\n  <insn mnem=\"faddsx\"       opcode=\"ec00002a\" form=\"A\"        group=\"f\" desc=\"Floating Add Single\">\n    <in field=\"FA\" />\n    <in field=\"FB\" />\n    <out field=\"FD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <out field=\"FPSCR\" />\n    <disasm>fadds[Rc] [FD], [FA], [FB]</disasm>\n  </insn>\n  <insn mnem=\"fcfidx\"       opcode=\"FC00069C\" form=\"X\"        group=\"f\" desc=\"Floating Convert From Integer Doubleword\">\n    <in field=\"FB\" />\n    <out field=\"FD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <out field=\"FPSCR\" />\n    <disasm>fcfid[Rc] [FD], [FB]</disasm>\n  </insn>\n  <insn mnem=\"fcmpo\"        opcode=\"fc000040\" form=\"X\"        group=\"f\" desc=\"Floating Compare Ordered\">\n    <in field=\"FA\" />\n    <in field=\"FB\" />\n    <out field=\"CRFD\" />\n    <out field=\"FPSCR\" />\n    <disasm>fcmpo [CRFD], [FA], [FB]</disasm>\n  </insn>\n  <insn mnem=\"fcmpu\"        opcode=\"fc000000\" form=\"X\"        group=\"f\" desc=\"Floating Compare Unordered\">\n    <in field=\"FA\" />\n    <in field=\"FB\" />\n    <out field=\"CRFD\" />\n    <out field=\"FPSCR\" />\n    <disasm>fcmpu [CRFD], [FA], [FB]</disasm>\n  </insn>\n  <insn mnem=\"fctidx\"       opcode=\"fc00065c\" form=\"X\"        group=\"f\" desc=\"Floating Convert to Integer Doubleword\">\n    <in field=\"FB\" />\n    <out field=\"FD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <out field=\"FPSCR\" />\n    <disasm>fctid[Rc] [FD], [FB]</disasm>\n  </insn>\n  <insn mnem=\"fctidzx\"      opcode=\"fc00065e\" form=\"X\"        group=\"f\" desc=\"Floating Convert to Integer Doubleword with Round Toward Zero\">\n    <in field=\"FB\" />\n    <out field=\"FD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <out field=\"FPSCR\" />\n    <disasm>fctidz[Rc] [FD], [FB]</disasm>\n  </insn>\n  <insn mnem=\"fctiwx\"       opcode=\"fc00001c\" form=\"X\"        group=\"f\" desc=\"Floating Convert to Integer Word\">\n    <in field=\"FB\" />\n    <out field=\"FD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <out field=\"FPSCR\" />\n    <disasm>fctiw[Rc] [FD], [FB]</disasm>\n  </insn>\n  <insn mnem=\"fctiwzx\"      opcode=\"fc00001e\" form=\"X\"        group=\"f\" desc=\"Floating Convert to Integer Word with Round Toward Zero\">\n    <in field=\"FB\" />\n    <out field=\"FD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <out field=\"FPSCR\" />\n    <disasm>fctiwz[Rc] [FD], [FB]</disasm>\n  </insn>\n  <insn mnem=\"fdivx\"        opcode=\"fc000024\" form=\"A\"        group=\"f\" desc=\"Floating Divide\">\n    <in field=\"FA\" />\n    <in field=\"FB\" />\n    <out field=\"FD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <out field=\"FPSCR\" />\n    <disasm>fdiv[Rc] [FD], [FA], [FB]</disasm>\n  </insn>\n  <insn mnem=\"fdivsx\"       opcode=\"ec000024\" form=\"A\"        group=\"f\" desc=\"Floating Divide Single\">\n    <in field=\"FA\" />\n    <in field=\"FB\" />\n    <out field=\"FD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <out field=\"FPSCR\" />\n    <disasm>fdivs[Rc] [FD], [FA], [FB]</disasm>\n  </insn>\n  <insn mnem=\"fmaddx\"       opcode=\"fc00003a\" form=\"A\"        group=\"f\" desc=\"Floating Multiply-Add\">\n    <in field=\"FA\" />\n    <in field=\"FC\" />\n    <in field=\"FB\" />\n    <out field=\"FD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <out field=\"FPSCR\" />\n    <disasm>fmadd[Rc] [FD], [FA], [FC], [FB]</disasm>\n  </insn>\n  <insn mnem=\"fmaddsx\"      opcode=\"ec00003a\" form=\"A\"        group=\"f\" desc=\"Floating Multiply-Add Single\">\n    <in field=\"FA\" />\n    <in field=\"FC\" />\n    <in field=\"FB\" />\n    <out field=\"FD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <out field=\"FPSCR\" />\n    <disasm>fmadds[Rc] [FD], [FA], [FC], [FB]</disasm>\n  </insn>\n  <insn mnem=\"fmrx\"         opcode=\"fc000090\" form=\"X\"        group=\"f\" desc=\"Floating Move Register\">\n    <in field=\"FB\" />\n    <out field=\"FD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>fmr[Rc] [FD], [FB]</disasm>\n  </insn>\n  <insn mnem=\"fmsubx\"       opcode=\"fc000038\" form=\"A\"        group=\"f\" desc=\"Floating Multiply-Subtract\">\n    <in field=\"FA\" />\n    <in field=\"FC\" />\n    <in field=\"FB\" />\n    <out field=\"FD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <out field=\"FPSCR\" />\n    <disasm>fmsub[Rc] [FD], [FA], [FC], [FB]</disasm>\n  </insn>\n  <insn mnem=\"fmsubsx\"      opcode=\"ec000038\" form=\"A\"        group=\"f\" desc=\"Floating Multiply-Subtract Single\">\n    <in field=\"FA\" />\n    <in field=\"FC\" />\n    <in field=\"FB\" />\n    <out field=\"FD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <out field=\"FPSCR\" />\n    <disasm>fmsubs[Rc] [FD], [FA], [FC], [FB]</disasm>\n  </insn>\n  <insn mnem=\"fmulx\"        opcode=\"fc000032\" form=\"A\"        group=\"f\" desc=\"Floating Multiply\">\n    <in field=\"FA\" />\n    <in field=\"FC\" />\n    <out field=\"FD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <out field=\"FPSCR\" />\n    <disasm>fmul[Rc] [FD], [FA], [FC]</disasm>\n  </insn>\n  <insn mnem=\"fmulsx\"       opcode=\"ec000032\" form=\"A\"        group=\"f\" desc=\"Floating Multiply Single\">\n    <in field=\"FA\" />\n    <in field=\"FC\" />\n    <out field=\"FD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <out field=\"FPSCR\" />\n    <disasm>fmuls[Rc] [FD], [FA], [FC]</disasm>\n  </insn>\n  <insn mnem=\"fnabsx\"       opcode=\"fc000110\" form=\"X\"        group=\"f\" desc=\"Floating Negative Absolute Value\">\n    <in field=\"FB\" />\n    <out field=\"FD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>fnabs[Rc] [FD], [FB]</disasm>\n  </insn>\n  <insn mnem=\"fnegx\"        opcode=\"fc000050\" form=\"X\"        group=\"f\" desc=\"Floating Negate\">\n    <in field=\"FB\" />\n    <out field=\"FD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>fneg[Rc] [FD], [FB]</disasm>\n  </insn>\n  <insn mnem=\"fnmaddx\"      opcode=\"fc00003e\" form=\"A\"        group=\"f\" desc=\"Floating Negative Multiply-Add\">\n    <in field=\"FA\" />\n    <in field=\"FC\" />\n    <in field=\"FB\" />\n    <out field=\"FD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <out field=\"FPSCR\" />\n    <disasm>fnmadd[Rc] [FD], [FA], [FC], [FB]</disasm>\n  </insn>\n  <insn mnem=\"fnmaddsx\"     opcode=\"ec00003e\" form=\"A\"        group=\"f\" desc=\"Floating Negative Multiply-Add Single\">\n    <in field=\"FA\" />\n    <in field=\"FC\" />\n    <in field=\"FB\" />\n    <out field=\"FD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <out field=\"FPSCR\" />\n    <disasm>fnmadds[Rc] [FD], [FA], [FC], [FB]</disasm>\n  </insn>\n  <insn mnem=\"fnmsubx\"      opcode=\"fc00003c\" form=\"A\"        group=\"f\" desc=\"Floating Negative Multiply-Subtract\">\n    <in field=\"FA\" />\n    <in field=\"FC\" />\n    <in field=\"FB\" />\n    <out field=\"FD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <out field=\"FPSCR\" />\n    <disasm>fnmsub[Rc] [FD], [FA], [FC], [FB]</disasm>\n  </insn>\n  <insn mnem=\"fnmsubsx\"     opcode=\"ec00003c\" form=\"A\"        group=\"f\" desc=\"Floating Negative Multiply-Subtract Single\">\n    <in field=\"FA\" />\n    <in field=\"FC\" />\n    <in field=\"FB\" />\n    <out field=\"FD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <out field=\"FPSCR\" />\n    <disasm>fnmsubs[Rc] [FD], [FA], [FC], [FB]</disasm>\n  </insn>\n  <insn mnem=\"fresx\"        opcode=\"ec000030\" form=\"A\"        group=\"f\" desc=\"Floating Reciprocal Estimate Single\">\n    <in field=\"FB\" />\n    <out field=\"FD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <out field=\"FPSCR\" />\n    <disasm>fres[Rc] [FD], [FB]</disasm>\n  </insn>\n  <insn mnem=\"frspx\"        opcode=\"fc000018\" form=\"X\"        group=\"f\" desc=\"Floating Round to Single\">\n    <in field=\"FB\" />\n    <out field=\"FD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <out field=\"FPSCR\" />\n    <disasm>frsp[Rc] [FD], [FB]</disasm>\n  </insn>\n  <insn mnem=\"frsqrtex\"     opcode=\"fc000034\" form=\"A\"        group=\"f\" desc=\"Floating Reciprocal Square Root Estimate\">\n    <in field=\"FB\" />\n    <out field=\"FD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <out field=\"FPSCR\" />\n    <disasm>frsqrte[Rc] [FD], [FB]</disasm>\n  </insn>\n  <insn mnem=\"fselx\"        opcode=\"fc00002e\" form=\"A\"        group=\"f\" desc=\"Floating Select\">\n    <in field=\"FA\" />\n    <in field=\"FC\" />\n    <in field=\"FB\" />\n    <out field=\"FD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>fsel[Rc] [FD], [FA], [FC], [FB]</disasm>\n  </insn>\n  <insn mnem=\"fsqrtx\"       opcode=\"fc00002c\" form=\"A\"        group=\"f\" desc=\"Floating Square Root\">\n    <in field=\"FB\" />\n    <out field=\"FD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <out field=\"FPSCR\" />\n    <disasm>fsqrt[Rc] [FD], [FB]</disasm>\n  </insn>\n  <insn mnem=\"fsqrtsx\"      opcode=\"ec00002c\" form=\"A\"        group=\"f\" desc=\"Floating Square Root Single\">\n    <in field=\"FB\" />\n    <out field=\"FD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <out field=\"FPSCR\" />\n    <disasm>fsqrts[Rc] [FD], [FB]</disasm>\n  </insn>\n  <insn mnem=\"fsubx\"        opcode=\"fc000028\" form=\"A\"        group=\"f\" desc=\"Floating Subtract\">\n    <in field=\"FA\" />\n    <in field=\"FB\" />\n    <out field=\"FD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <out field=\"FPSCR\" />\n    <disasm>fsub[Rc] [FD], [FA], [FB]</disasm>\n  </insn>\n  <insn mnem=\"fsubsx\"       opcode=\"ec000028\" form=\"A\"        group=\"f\" desc=\"Floating Subtract Single\">\n    <in field=\"FA\" />\n    <in field=\"FB\" />\n    <out field=\"FD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <out field=\"FPSCR\" />\n    <disasm>fsubs[Rc] [FD], [FA], [FB]</disasm>\n  </insn>\n  <insn mnem=\"icbi\"         opcode=\"7c0007ac\" form=\"X\"        group=\"m\" desc=\"Instruction Cache Block Invalidate\">\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <disasm>icbi [RA], [RB]</disasm>\n  </insn>\n  <insn mnem=\"isync\"        opcode=\"4c00012c\" form=\"XL\"       group=\"i\" desc=\"Instruction Synchronize\">\n    <disasm>isync</disasm>\n  </insn>\n  <insn mnem=\"lbz\"          opcode=\"88000000\" form=\"D\"        group=\"m\" desc=\"Load Byte and Zero\">\n    <in field=\"RA0\" />\n    <in field=\"d\" />\n    <out field=\"RD\" />\n    <disasm>lbz [RD], [d]([RA0])</disasm>\n  </insn>\n  <insn mnem=\"lbzu\"         opcode=\"8c000000\" form=\"D\"        group=\"m\" desc=\"Load Byte and Zero with Update\">\n    <in field=\"RA\" />\n    <in field=\"d\" />\n    <out field=\"RD\" />\n    <out field=\"RA\" />\n    <disasm>lbzu [RD], [d]([RA])</disasm>\n  </insn>\n  <insn mnem=\"lbzux\"        opcode=\"7c0000ee\" form=\"X\"        group=\"m\" desc=\"Load Byte and Zero with Update Indexed\">\n    <in field=\"RA\" />\n    <in field=\"RB\" />\n    <out field=\"RD\" />\n    <out field=\"RA\" />\n    <disasm>lbzux [RD], [RA], [RB]</disasm>\n  </insn>\n  <insn mnem=\"lbzx\"         opcode=\"7c0000ae\" form=\"X\"        group=\"m\" desc=\"Load Byte and Zero Indexed\">\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <out field=\"RD\" />\n    <disasm>lbzx [RD], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"ld\"           opcode=\"E8000000\" form=\"DS\"       group=\"m\" desc=\"Load Doubleword\">\n    <in field=\"RA0\" />\n    <in field=\"ds\" />\n    <out field=\"RD\" />\n    <disasm>ld [RD], [ds]([RA0])</disasm>\n  </insn>\n  <insn mnem=\"ldarx\"        opcode=\"7C0000A8\" form=\"X\"        group=\"m\" desc=\"Load Doubleword and Reserve Indexed\">\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <out field=\"RD\" />\n    <disasm>ldarx [RD], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"ldbrx\"        opcode=\"7C000428\" form=\"X\"        group=\"m\" desc=\"Load Doubleword Byte-Reverse Indexed\">\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <out field=\"RD\" />\n    <disasm>ldbrx [RD], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"ldu\"          opcode=\"E8000001\" form=\"DS\"       group=\"m\" desc=\"Load Doubleword with Update\">\n    <in field=\"RA\" />\n    <in field=\"ds\" />\n    <out field=\"RD\" />\n    <out field=\"RA\" />\n    <disasm>ldu [RD], [ds]([RA])</disasm>\n  </insn>\n  <insn mnem=\"ldux\"         opcode=\"7c00006a\" form=\"X\"        group=\"m\" desc=\"Load Doubleword with Update Indexed\">\n    <in field=\"RA\" />\n    <in field=\"RB\" />\n    <out field=\"RD\" />\n    <out field=\"RA\" />\n    <disasm>ldux [RD], [RA], [RB]</disasm>\n  </insn>\n  <insn mnem=\"ldx\"          opcode=\"7c00002a\" form=\"X\"        group=\"m\" desc=\"Load Doubleword Indexed\">\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <out field=\"RD\" />\n    <disasm>ldx [RD], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"lfd\"          opcode=\"c8000000\" form=\"D\"        group=\"m\" desc=\"Load Floating-Point Double\">\n    <in field=\"RA0\" />\n    <in field=\"d\" />\n    <out field=\"FD\" />\n    <disasm>lfd [FD], [d]([RA0])</disasm>\n  </insn>\n  <insn mnem=\"lfdu\"         opcode=\"cc000000\" form=\"D\"        group=\"m\" desc=\"Load Floating-Point Double with Update\">\n    <in field=\"RA\" />\n    <in field=\"d\" />\n    <out field=\"FD\" />\n    <out field=\"RA\" />\n    <disasm>lfdu [FD], [d]([RA])</disasm>\n  </insn>\n  <insn mnem=\"lfdux\"        opcode=\"7c0004ee\" form=\"X\"        group=\"m\" desc=\"Load Floating-Point Double with Update Indexed\">\n    <in field=\"RA\" />\n    <in field=\"RB\" />\n    <out field=\"FD\" />\n    <out field=\"RA\" />\n    <disasm>lfdux [FD], [RA], [RB]</disasm>\n  </insn>\n  <insn mnem=\"lfdx\"         opcode=\"7c0004ae\" form=\"X\"        group=\"m\" desc=\"Load Floating-Point Double Indexed\">\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <out field=\"FD\" />\n    <disasm>lfdx [FD], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"lfs\"          opcode=\"c0000000\" form=\"D\"        group=\"m\" desc=\"Load Floating-Point Single\">\n    <in field=\"RA0\" />\n    <in field=\"d\" />\n    <out field=\"FD\" />\n    <disasm>lfs [FD], [d]([RA0])</disasm>\n  </insn>\n  <insn mnem=\"lfsu\"         opcode=\"c4000000\" form=\"D\"        group=\"m\" desc=\"Load Floating-Point Single with Update\">\n    <in field=\"RA\" />\n    <in field=\"d\" />\n    <out field=\"FD\" />\n    <out field=\"RA\" />\n    <disasm>lfsu [FD], [d]([RA])</disasm>\n  </insn>\n  <insn mnem=\"lfsux\"        opcode=\"7c00046e\" form=\"X\"        group=\"m\" desc=\"Load Floating-Point Single with Update Indexed\">\n    <in field=\"RA\" />\n    <in field=\"RB\" />\n    <out field=\"FD\" />\n    <out field=\"RA\" />\n    <disasm>lfsux [FD], [RA], [RB]</disasm>\n  </insn>\n  <insn mnem=\"lfsx\"         opcode=\"7c00042e\" form=\"X\"        group=\"m\" desc=\"Load Floating-Point Single Indexed\">\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <out field=\"FD\" />\n    <disasm>lfsx [FD], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"lha\"          opcode=\"a8000000\" form=\"D\"        group=\"m\" desc=\"Load Half Word Algebraic\">\n    <in field=\"RA0\" />\n    <in field=\"d\" />\n    <out field=\"RD\" />\n    <disasm>lha [RD], [d]([RA0])</disasm>\n  </insn>\n  <insn mnem=\"lhau\"         opcode=\"ac000000\" form=\"D\"        group=\"m\" desc=\"Load Half Word Algebraic with Update\">\n    <in field=\"RA\" />\n    <in field=\"d\" />\n    <out field=\"RD\" />\n    <out field=\"RA\" />\n    <disasm>lhau [RD], [d]([RA])</disasm>\n  </insn>\n  <insn mnem=\"lhaux\"        opcode=\"7c0002ee\" form=\"X\"        group=\"m\" desc=\"Load Half Word Algebraic with Update Indexed\">\n    <in field=\"RA\" />\n    <in field=\"RB\" />\n    <out field=\"RD\" />\n    <out field=\"RA\" />\n    <disasm>lhaux [RD], [RA], [RB]</disasm>\n  </insn>\n  <insn mnem=\"lhax\"         opcode=\"7c0002ae\" form=\"X\"        group=\"m\" desc=\"Load Half Word Algebraic Indexed\">\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <out field=\"RD\" />\n    <disasm>lhax [RD], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"lhbrx\"        opcode=\"7c00062c\" form=\"X\"        group=\"m\" desc=\"Load Half Word Byte-Reverse Indexed\">\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <out field=\"RD\" />\n    <disasm>lhbrx [RD], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"lhz\"          opcode=\"a0000000\" form=\"D\"        group=\"m\" desc=\"Load Half Word and Zero\">\n    <in field=\"RA0\" />\n    <in field=\"d\" />\n    <out field=\"RD\" />\n    <disasm>lhz [RD], [d]([RA0])</disasm>\n  </insn>\n  <insn mnem=\"lhzu\"         opcode=\"a4000000\" form=\"D\"        group=\"m\" desc=\"Load Half Word and Zero with Update\">\n    <in field=\"RA\" />\n    <in field=\"d\" />\n    <out field=\"RD\" />\n    <out field=\"RA\" />\n    <disasm>lhzu [RD], [d]([RA])</disasm>\n  </insn>\n  <insn mnem=\"lhzux\"        opcode=\"7c00026e\" form=\"X\"        group=\"m\" desc=\"Load Half Word and Zero with Update Indexed\">\n    <in field=\"RA\" />\n    <in field=\"RB\" />\n    <out field=\"RD\" />\n    <out field=\"RA\" />\n    <disasm>lhzux [RD], [RA], [RB]</disasm>\n  </insn>\n  <insn mnem=\"lhzx\"         opcode=\"7c00022e\" form=\"X\"        group=\"m\" desc=\"Load Half Word and Zero Indexed\">\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <out field=\"RD\" />\n    <disasm>lhzx [RD], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"lmw\"          opcode=\"b8000000\" form=\"D\"        group=\"m\" desc=\"Load Multiple Word\">\n    <!-- ? -->\n  </insn>\n  <insn mnem=\"lswi\"         opcode=\"7c0004aa\" form=\"X\"        group=\"m\" desc=\"Load String Word Immediate\">\n    <!-- ? -->\n  </insn>\n  <insn mnem=\"lswx\"         opcode=\"7c00042a\" form=\"X\"        group=\"m\" desc=\"Load String Word Indexed\">\n    <!-- ? -->\n  </insn>\n  <insn mnem=\"lwa\"          opcode=\"e8000002\" form=\"DS\"       group=\"m\" desc=\"Load Word Algebraic\">\n    <in field=\"RA0\" />\n    <in field=\"ds\" />\n    <out field=\"RD\" />\n    <disasm>lwa [RD], [ds]([RA0])</disasm>\n  </insn>\n  <insn mnem=\"lwarx\"        opcode=\"7c000028\" form=\"X\"        group=\"m\" desc=\"Load Word and Reserve Indexed\">\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <out field=\"RD\" />\n    <disasm>lwarx [RD], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"lwaux\"        opcode=\"7c0002ea\" form=\"X\"        group=\"m\" desc=\"Load Word Algebraic with Update Indexed\">\n    <in field=\"RA\" />\n    <in field=\"RB\" />\n    <out field=\"RD\" />\n    <out field=\"RA\" />\n    <disasm>lwaux [RD], [RA], [RB]</disasm>\n  </insn>\n  <insn mnem=\"lwax\"         opcode=\"7c0002aa\" form=\"X\"        group=\"m\" desc=\"Load Word Algebraic Indexed\">\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <out field=\"RD\" />\n    <disasm>lwax [RD], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"lwbrx\"        opcode=\"7c00042c\" form=\"X\"        group=\"m\" desc=\"Load Word Byte-Reverse Indexed\">\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <out field=\"RD\" />\n    <disasm>lwbrx [RD], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"lwz\"          opcode=\"80000000\" form=\"D\"        group=\"m\" desc=\"Load Word and Zero\">\n    <in field=\"RA0\" />\n    <in field=\"d\" />\n    <out field=\"RD\" />\n    <disasm>lwz [RD], [d]([RA0])</disasm>\n  </insn>\n  <insn mnem=\"lwzu\"         opcode=\"84000000\" form=\"D\"        group=\"m\" desc=\"Load Word and Zero with Update\">\n    <in field=\"RA\" />\n    <in field=\"d\" />\n    <out field=\"RD\" />\n    <out field=\"RA\" />\n    <disasm>lwzu [RD], [d]([RA])</disasm>\n  </insn>\n  <insn mnem=\"lwzux\"        opcode=\"7c00006e\" form=\"X\"        group=\"m\" desc=\"Load Word and Zero with Update Indexed\">\n    <in field=\"RA\" />\n    <in field=\"RB\" />\n    <out field=\"RD\" />\n    <out field=\"RA\" />\n    <disasm>lwzux [RD], [RA], [RB]</disasm>\n  </insn>\n  <insn mnem=\"lwzx\"         opcode=\"7c00002e\" form=\"X\"        group=\"m\" desc=\"Load Word and Zero Indexed\">\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <out field=\"RD\" />\n    <disasm>lwzx [RD], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"mcrf\"         opcode=\"4c000000\" form=\"XL\"       group=\"c\" desc=\"Move Condition Register Field\">\n    <in field=\"CRFS\" />\n    <out field=\"CRFD\" />\n    <disasm>mcrf [CRFD], [CRFS]</disasm>\n  </insn>\n  <insn mnem=\"mcrfs\"        opcode=\"fc000080\" form=\"X\"        group=\"c\" desc=\"Move to Condition Register from FPSCR\">\n    <in field=\"CRFS\" />\n    <in field=\"FPSCR\" />\n    <out field=\"CRFD\" />\n    <out field=\"FPSCR\" />\n    <disasm>mcrfs [CRFD], [CRFS]</disasm>\n  </insn>\n  <insn mnem=\"mcrxr\"        opcode=\"7c000400\" form=\"X\"        group=\"c\" desc=\"Move to Condition Register from XER\">\n    <in field=\"CR\" />\n    <out field=\"CRFD\" />\n    <disasm>mcrxr [CRFD]</disasm>\n  </insn>\n  <insn mnem=\"mfcr\"         opcode=\"7c000026\" form=\"X\"        group=\"c\" desc=\"Move from Condition Register\">\n    <in field=\"CR\" />\n    <out field=\"RD\" />\n    <disasm>mfcr [RD]</disasm>\n  </insn>\n  <insn mnem=\"mffsx\"        opcode=\"fc00048e\" form=\"X\"        group=\"c\" desc=\"Move from FPSCR\">\n    <in field=\"FPSCR\" />\n    <out field=\"FD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>mffs[Rc] [RD]</disasm>\n  </insn>\n  <insn mnem=\"mfmsr\"        opcode=\"7c0000a6\" form=\"X\"        group=\"c\" desc=\"Move from Machine State Register\" sync=\"true\">\n    <in field=\"MSR\" />\n    <out field=\"RD\" />\n    <disasm>mfmsr [RD]</disasm>\n  </insn>\n  <insn mnem=\"mfspr\"        opcode=\"7c0002a6\" form=\"XFX\"      group=\"c\" desc=\"Move from Special-Purpose Register\">\n    <in field=\"SPR\" />\n    <out field=\"RD\" />\n    <disasm>mfspr [RD], [SPR]</disasm>\n  </insn>\n  <insn mnem=\"mftb\"         opcode=\"7c0002e6\" form=\"XFX\"      group=\"c\" desc=\"Move from Time Base\">\n    <in field=\"TBR\" />\n    <out field=\"RD\" />\n    <disasm>mftb [RD], [TBR]</disasm>\n  </insn>\n  <insn mnem=\"mtcrf\"        opcode=\"7c000120\" form=\"XFX\"      group=\"c\" desc=\"Move to Condition Register Fields\">\n    <in field=\"RS\" />\n    <out field=\"CRM\" />\n    <disasm>mtcrf [CRM], [RS]</disasm>\n  </insn>\n  <insn mnem=\"mtfsb0x\"      opcode=\"fc00008c\" form=\"X\"        group=\"c\" desc=\"Move to FPSCR Bit 0\">\n    <out field=\"FPSCRD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>mtfsb0[Rc] [FPSCRD]</disasm>\n  </insn>\n  <insn mnem=\"mtfsb1x\"      opcode=\"fc00004c\" form=\"X\"        group=\"c\" desc=\"Move to FPSCR Bit 1\">\n    <out field=\"FPSCRD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>mtfsb1[Rc] [FPSCRD]</disasm>\n  </insn>\n  <insn mnem=\"mtfsfx\"       opcode=\"fc00058e\" form=\"XFL\"      group=\"c\" desc=\"Move to FPSCR Fields\">\n    <in field=\"FM\" />\n    <in field=\"FB\" />\n    <out field=\"FPSCR\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>mtfsf[Rc] [FM], [FB]</disasm>\n  </insn>\n  <insn mnem=\"mtfsfix\"      opcode=\"fc00010c\" form=\"X\"        group=\"c\" desc=\"Move to FPSCR Field Immediate\">\n    <in field=\"IMM\" />\n    <out field=\"CRFD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>mtfsfi[Rc] [CRFD], [IMM]</disasm>\n  </insn>\n  <insn mnem=\"mtmsr\"        opcode=\"7c000124\" form=\"X\"        group=\"c\" desc=\"Move to Machine State Register\" sync=\"true\">\n    <in field=\"RS\" />\n    <out field=\"MSR\" />\n    <disasm>mtmsr [RS]</disasm>\n  </insn>\n  <insn mnem=\"mtmsrd\"       opcode=\"7c000164\" form=\"X\"        group=\"c\" desc=\"Move to Machine State Register Doubleword\" sync=\"true\">\n    <in field=\"RS\" />\n    <out field=\"MSR\" />\n    <disasm>mtmsrd [RS]</disasm>\n  </insn>\n  <insn mnem=\"mtspr\"        opcode=\"7c0003a6\" form=\"XFX\"      group=\"c\" desc=\"Move to Special-Purpose Register\">\n    <in field=\"RS\" />\n    <out field=\"SPR\" />\n    <disasm>mtspr [SPR], [RS]</disasm>\n  </insn>\n  <insn mnem=\"mulhdx\"       opcode=\"7c000092\" form=\"XO\"       group=\"i\" desc=\"Multiply High Doubleword\">\n    <in field=\"RA\" />\n    <in field=\"RB\" />\n    <out field=\"RD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>mulhd[Rc] [RD], [RA], [RB]</disasm>\n  </insn>\n  <insn mnem=\"mulhdux\"      opcode=\"7c000012\" form=\"XO\"       group=\"i\" desc=\"Multiply High Doubleword Unsigned\">\n    <in field=\"RA\" />\n    <in field=\"RB\" />\n    <out field=\"RD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>mulhdu[Rc] [RD], [RA], [RB]</disasm>\n  </insn>\n  <insn mnem=\"mulhwx\"       opcode=\"7c000096\" form=\"XO\"       group=\"i\" desc=\"Multiply High Word\">\n    <in field=\"RA\" />\n    <in field=\"RB\" />\n    <out field=\"RD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>mulhw[Rc] [RD], [RA], [RB]</disasm>\n  </insn>\n  <insn mnem=\"mulhwux\"      opcode=\"7c000016\" form=\"XO\"       group=\"i\" desc=\"Multiply High Word Unsigned\">\n    <in field=\"RA\" />\n    <in field=\"RB\" />\n    <out field=\"RD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>mulhwu[Rc] [RD], [RA], [RB]</disasm>\n  </insn>\n  <insn mnem=\"mulldx\"       opcode=\"7c0001d2\" form=\"XO\"       group=\"i\" desc=\"Multiply Low Doubleword\">\n    <in field=\"RA\" />\n    <in field=\"RB\" />\n    <out field=\"RD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <out field=\"OE\" conditional=\"true\" />\n    <disasm>mulld[OE][Rc] [RD], [RA], [RB]</disasm>\n  </insn>\n  <insn mnem=\"mulli\"        opcode=\"1c000000\" form=\"D\"        group=\"i\" desc=\"Multiply Low Immediate\">\n    <in field=\"RA\" />\n    <in field=\"SIMM\" />\n    <out field=\"RD\" />\n    <disasm>mulli [RD], [RA], [SIMM]</disasm>\n  </insn>\n  <insn mnem=\"mullwx\"       opcode=\"7c0001d6\" form=\"XO\"       group=\"i\" desc=\"Multiply Low Word\">\n    <in field=\"RA\" />\n    <in field=\"RB\" />\n    <out field=\"RD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <out field=\"OE\" conditional=\"true\" />\n    <disasm>mullw[OE][Rc] [RD], [RA], [RB]</disasm>\n  </insn>\n  <insn mnem=\"nandx\"        opcode=\"7c0003b8\" form=\"X\"        group=\"i\" desc=\"NAND\">\n    <in field=\"RS\" />\n    <in field=\"RB\" />\n    <out field=\"RA\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>nand[Rc] [RA], [RS], [RB]</disasm>\n  </insn>\n  <insn mnem=\"negx\"         opcode=\"7c0000d0\" form=\"XO\"       group=\"i\" desc=\"Negate\">\n    <in field=\"RA\" />\n    <out field=\"RD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <out field=\"OE\" conditional=\"true\" />\n    <disasm>neg[OE][Rc] [RD], [RA]</disasm>\n  </insn>\n  <insn mnem=\"norx\"         opcode=\"7c0000f8\" form=\"X\"        group=\"i\" desc=\"NOR\">\n    <in field=\"RS\" />\n    <in field=\"RB\" />\n    <out field=\"RA\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>nor[Rc] [RA], [RS], [RB]</disasm>\n  </insn>\n  <insn mnem=\"orx\"          opcode=\"7c000378\" form=\"X\"        group=\"i\" desc=\"OR\">\n    <in field=\"RS\" />\n    <in field=\"RB\" />\n    <out field=\"RA\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>or[Rc] [RA], [RS], [RB]</disasm>\n  </insn>\n  <insn mnem=\"orcx\"         opcode=\"7c000338\" form=\"X\"        group=\"i\" desc=\"OR with Complement\">\n    <in field=\"RS\" />\n    <in field=\"RB\" />\n    <out field=\"RA\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>orc[Rc] [RA], [RS], [RB]</disasm>\n  </insn>\n  <insn mnem=\"ori\"          opcode=\"60000000\" form=\"D\"        group=\"i\" desc=\"OR Immediate\">\n    <in field=\"RS\" />\n    <in field=\"UIMM\" />\n    <out field=\"RA\" />\n    <disasm>ori [RA], [RS], [UIMM]</disasm>\n  </insn>\n  <insn mnem=\"oris\"         opcode=\"64000000\" form=\"D\"        group=\"i\" desc=\"OR Immediate Shifted\">\n    <in field=\"RS\" />\n    <in field=\"UIMM\" />\n    <out field=\"RA\" />\n    <disasm>oris [RA], [RS], [UIMM]</disasm>\n  </insn>\n  <insn mnem=\"rldclx\"       opcode=\"78000010\" form=\"MDS\"      group=\"i\" desc=\"Rotate Left Doubleword then Clear Left\">\n    <in field=\"RS\" />\n    <in field=\"RB\" />\n    <in field=\"MB\" />\n    <out field=\"RA\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>rldcl[Rc] [RA], [RS], [RB], [MB]</disasm>\n  </insn>\n  <insn mnem=\"rldcrx\"       opcode=\"78000012\" form=\"MDS\"      group=\"i\" desc=\"Rotate Left Doubleword then Clear Right\">\n    <in field=\"RS\" />\n    <in field=\"RB\" />\n    <in field=\"ME\" />\n    <out field=\"RA\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>rldcr[Rc] [RA], [RS], [RB], [ME]</disasm>\n  </insn>\n  <insn mnem=\"rldicx\"       opcode=\"78000008\" form=\"MD\"       group=\"i\" desc=\"Rotate Left Doubleword Immediate then Clear\">\n    <in field=\"RS\" />\n    <in field=\"SH\" />\n    <in field=\"MB\" />\n    <out field=\"RA\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>rldic[Rc] [RA], [RS], [SH], [MB]</disasm>\n  </insn>\n  <insn mnem=\"rldiclx\"      opcode=\"78000000\" form=\"MD\"       group=\"i\" desc=\"Rotate Left Doubleword Immediate then Clear Left\">\n    <in field=\"RS\" />\n    <in field=\"SH\" />\n    <in field=\"MB\" />\n    <out field=\"RA\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>rldicl[Rc] [RA], [RS], [SH], [MB]</disasm>\n  </insn>\n  <insn mnem=\"rldicrx\"      opcode=\"78000004\" form=\"MD\"       group=\"i\" desc=\"Rotate Left Doubleword Immediate then Clear Right\">\n    <in field=\"RS\" />\n    <in field=\"SH\" />\n    <in field=\"ME\" />\n    <out field=\"RA\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>rldicr[Rc] [RA], [RS], [SH], [ME]</disasm>\n  </insn>\n  <insn mnem=\"rldimix\"      opcode=\"7800000C\" form=\"MD\"       group=\"i\" desc=\"Rotate Left Doubleword Immediate then Mask Insert\">\n    <in field=\"RS\" />\n    <in field=\"SH\" />\n    <in field=\"MB\" />\n    <out field=\"RA\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>rldimi[Rc] [RA], [RS], [SH], [MB]</disasm>\n  </insn>\n  <insn mnem=\"rlwimix\"      opcode=\"50000000\" form=\"M\"        group=\"i\" desc=\"Rotate Left Word Immediate then Mask Insert\">\n    <in field=\"RS\" />\n    <in field=\"SH\" />\n    <in field=\"MB\" />\n    <in field=\"ME\" />\n    <out field=\"RA\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>rlwimi[Rc] [RA], [RS], [SH], [MB], [ME]</disasm>\n  </insn>\n  <insn mnem=\"rlwinmx\"      opcode=\"54000000\" form=\"M\"        group=\"i\" desc=\"Rotate Left Word Immediate then AND with Mask\">\n    <in field=\"RS\" />\n    <in field=\"SH\" />\n    <in field=\"MB\" />\n    <in field=\"ME\" />\n    <out field=\"RA\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>rlwinm[Rc] [RA], [RS], [SH], [MB], [ME]</disasm>\n  </insn>\n  <insn mnem=\"rlwnmx\"       opcode=\"5c000000\" form=\"M\"        group=\"i\" desc=\"Rotate Left Word then AND with Mask\">\n    <in field=\"RS\" />\n    <in field=\"RB\" />\n    <in field=\"MB\" />\n    <in field=\"ME\" />\n    <out field=\"RA\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>rlwnm[Rc] [RA], [RS], [RB], [MB], [ME]</disasm>\n  </insn>\n  <insn mnem=\"sc\"           opcode=\"44000002\" form=\"SC\"       group=\"b\" desc=\"System Call\" sync=\"true\">\n    <in field=\"LEV\" />\n    <disasm>sc [LEV]</disasm>\n  </insn>\n  <insn mnem=\"sldx\"         opcode=\"7c000036\" form=\"X\"        group=\"i\" desc=\"Shift Left Doubleword\">\n    <in field=\"RS\" />\n    <in field=\"RB\" />\n    <out field=\"RA\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>sld[Rc] [RA], [RS], [RB]</disasm>\n  </insn>\n  <insn mnem=\"slwx\"         opcode=\"7c000030\" form=\"X\"        group=\"i\" desc=\"Shift Left Word\">\n    <in field=\"RS\" />\n    <in field=\"RB\" />\n    <out field=\"RA\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>slw[Rc] [RA], [RS], [RB]</disasm>\n  </insn>\n  <insn mnem=\"sradx\"        opcode=\"7c000634\" form=\"X\"        group=\"i\" desc=\"Shift Right Algebraic Doubleword\">\n    <in field=\"RS\" />\n    <in field=\"RB\" />\n    <out field=\"RA\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <out field=\"CA\" />\n    <disasm>srad[Rc] [RA], [RS], [RB]</disasm>\n  </insn>\n  <insn mnem=\"sradix\"       opcode=\"7c000674\" form=\"XS\"       group=\"i\" desc=\"Shift Right Algebraic Doubleword Immediate\">\n    <in field=\"RS\" />\n    <in field=\"SH\" />\n    <out field=\"RA\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <out field=\"CA\" />\n    <disasm>sradi[Rc] [RA], [RS], [SH]</disasm>\n  </insn>\n  <insn mnem=\"srawx\"        opcode=\"7c000630\" form=\"X\"        group=\"i\" desc=\"Shift Right Algebraic Word\">\n    <in field=\"RS\" />\n    <in field=\"RB\" />\n    <out field=\"RA\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <out field=\"CA\" />\n    <disasm>sraw[Rc] [RA], [RS], [RB]</disasm>\n  </insn>\n  <insn mnem=\"srawix\"       opcode=\"7c000670\" form=\"X\"        group=\"i\" desc=\"Shift Right Algebraic Word Immediate\">\n    <in field=\"RS\" />\n    <in field=\"SH\" />\n    <out field=\"RA\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <out field=\"CA\" />\n    <disasm>srawi[Rc] [RA], [RS], [SH]</disasm>\n  </insn>\n  <insn mnem=\"srdx\"         opcode=\"7c000436\" form=\"X\"        group=\"i\" desc=\"Shift Right Doubleword\">\n    <in field=\"RS\" />\n    <in field=\"RB\" />\n    <out field=\"RA\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>srd[Rc] [RA], [RS], [RB]</disasm>\n  </insn>\n  <insn mnem=\"srwx\"         opcode=\"7c000430\" form=\"X\"        group=\"i\" desc=\"Shift Right Word\">\n    <in field=\"RS\" />\n    <in field=\"RB\" />\n    <out field=\"RA\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>srw[Rc] [RA], [RS], [RB]</disasm>\n  </insn>\n  <insn mnem=\"stb\"          opcode=\"98000000\" form=\"D\"        group=\"m\" desc=\"Store Byte\">\n    <in field=\"RS\" />\n    <in field=\"RA0\" />\n    <in field=\"d\" />\n    <disasm>stb [RS], [d]([RA0])</disasm>\n  </insn>\n  <insn mnem=\"stbu\"         opcode=\"9c000000\" form=\"D\"        group=\"m\" desc=\"Store Byte with Update\">\n    <in field=\"RS\" />\n    <in field=\"RA\" />\n    <in field=\"d\" />\n    <out field=\"RA\" />\n    <disasm>stbu [RS], [d]([RA])</disasm>\n  </insn>\n  <insn mnem=\"stbux\"        opcode=\"7c0001ee\" form=\"X\"        group=\"m\" desc=\"Store Byte with Update Indexed\">\n    <in field=\"RS\" />\n    <in field=\"RA\" />\n    <in field=\"RB\" />\n    <out field=\"RA\" />\n    <disasm>stbux [RS], [RA], [RB]</disasm>\n  </insn>\n  <insn mnem=\"stbx\"         opcode=\"7c0001ae\" form=\"X\"        group=\"m\" desc=\"Store Byte Indexed\">\n    <in field=\"RS\" />\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <disasm>stbx [RS], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"std\"          opcode=\"f8000000\" form=\"DS\"       group=\"m\" desc=\"Store Doubleword\">\n    <in field=\"RS\" />\n    <in field=\"RA\" />\n    <in field=\"ds\" />\n    <disasm>std [RS], [ds]([RA0])</disasm>\n  </insn>\n  <insn mnem=\"stdbrx\"       opcode=\"7c000528\" form=\"X\"        group=\"m\" desc=\"Store Doubleword Byte-Reverse Indexed\">\n    <in field=\"RS\" />\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <disasm>stdbrx [RS], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"stdcx\"        opcode=\"7c0001ad\" form=\"X\"        group=\"m\" desc=\"Store Doubleword Conditional Indexed\">\n    <in field=\"RS\" />\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <out field=\"CR\" />\n    <disasm>stdcx. [RS], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"stdu\"         opcode=\"f8000001\" form=\"DS\"       group=\"m\" desc=\"Store Doubleword with Update\">\n    <in field=\"RS\" />\n    <in field=\"RA\" />\n    <in field=\"ds\" />\n    <out field=\"RA\" />\n    <disasm>stdu [RS], [ds]([RA])</disasm>\n  </insn>\n  <insn mnem=\"stdux\"        opcode=\"7c00016a\" form=\"X\"        group=\"m\" desc=\"Store Doubleword with Update Indexed\">\n    <in field=\"RS\" />\n    <in field=\"RA\" />\n    <in field=\"RB\" />\n    <out field=\"RA\" />\n    <disasm>stdux [RS], [RA], [RB]</disasm>\n  </insn>\n  <insn mnem=\"stdx\"         opcode=\"7c00012a\" form=\"X\"        group=\"m\" desc=\"Store Doubleword Indexed\">\n    <in field=\"RS\" />\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <disasm>stdx [RS], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"stfd\"         opcode=\"d8000000\" form=\"D\"        group=\"m\" desc=\"Store Floating-Point Double\">\n    <in field=\"FS\" />\n    <in field=\"RA0\" />\n    <in field=\"d\" />\n    <disasm>stfd [FS], [d]([RA0])</disasm>\n  </insn>\n  <insn mnem=\"stfdu\"        opcode=\"dc000000\" form=\"D\"        group=\"m\" desc=\"Store Floating-Point Double with Update\">\n    <in field=\"FS\" />\n    <in field=\"RA\" />\n    <in field=\"d\" />\n    <out field=\"RA\" />\n    <disasm>stfdu [FS], [d]([RA])</disasm>\n  </insn>\n  <insn mnem=\"stfdux\"       opcode=\"7c0005ee\" form=\"X\"        group=\"m\" desc=\"Store Floating-Point Double with Update Indexed\">\n    <in field=\"FS\" />\n    <in field=\"RA\" />\n    <in field=\"RB\" />\n    <out field=\"RA\" />\n    <disasm>stfdux [FS], [RA], [RB]</disasm>\n  </insn>\n  <insn mnem=\"stfdx\"        opcode=\"7c0005ae\" form=\"X\"        group=\"m\" desc=\"Store Floating-Point Double Indexed\">\n    <in field=\"FS\" />\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <disasm>stfdx [FS], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"stfiwx\"       opcode=\"7c0007ae\" form=\"X\"        group=\"m\" desc=\"Store Floating-Point as Integer Word Indexed\">\n    <in field=\"FS\" />\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <disasm>stfiwx [FS], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"stfs\"         opcode=\"d0000000\" form=\"D\"        group=\"m\" desc=\"Store Floating-Point Single\">\n    <in field=\"FS\" />\n    <in field=\"RA0\" />\n    <in field=\"d\" />\n    <disasm>stfs [FS], [d]([RA0])</disasm>\n  </insn>\n  <insn mnem=\"stfsu\"        opcode=\"d4000000\" form=\"D\"        group=\"m\" desc=\"Store Floating-Point Single with Update\">\n    <in field=\"FS\" />\n    <in field=\"RA\" />\n    <in field=\"d\" />\n    <out field=\"RA\" />\n    <disasm>stfsu [FS], [d]([RA])</disasm>\n  </insn>\n  <insn mnem=\"stfsux\"       opcode=\"7c00056e\" form=\"X\"        group=\"m\" desc=\"Store Floating-Point Single with Update Indexed\">\n    <in field=\"FS\" />\n    <in field=\"RA\" />\n    <in field=\"RB\" />\n    <out field=\"RA\" />\n    <disasm>stfsux [FS], [RA], [RB]</disasm>\n  </insn>\n  <insn mnem=\"stfsx\"        opcode=\"7c00052e\" form=\"X\"        group=\"m\" desc=\"Store Floating-Point Single Indexed\">\n    <in field=\"FS\" />\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <disasm>stfsx [FS], [RA], [RB]</disasm>\n  </insn>\n  <insn mnem=\"sth\"          opcode=\"b0000000\" form=\"D\"        group=\"m\" desc=\"Store Half Word\">\n    <in field=\"RS\" />\n    <in field=\"RA0\" />\n    <in field=\"d\" />\n    <disasm>sth [RS], [d]([RA0])</disasm>\n  </insn>\n  <insn mnem=\"sthbrx\"       opcode=\"7c00072c\" form=\"X\"        group=\"m\" desc=\"Store Half Word Byte-Reverse Indexed\">\n    <in field=\"RS\" />\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <disasm>sthbrx [RS], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"sthu\"         opcode=\"b4000000\" form=\"D\"        group=\"m\" desc=\"Store Half Word with Update\">\n    <in field=\"RS\" />\n    <in field=\"RA\" />\n    <in field=\"d\" />\n    <out field=\"RA\" />\n    <disasm>sthu [RS], [d]([RA])</disasm>\n  </insn>\n  <insn mnem=\"sthux\"        opcode=\"7c00036e\" form=\"X\"        group=\"m\" desc=\"Store Half Word with Update Indexed\">\n    <in field=\"RS\" />\n    <in field=\"RA\" />\n    <in field=\"RB\" />\n    <out field=\"RA\" />\n    <disasm>sthux [RS], [RA], [RB]</disasm>\n  </insn>\n  <insn mnem=\"sthx\"         opcode=\"7c00032e\" form=\"X\"        group=\"m\" desc=\"Store Half Word Indexed\">\n    <in field=\"RS\" />\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <disasm>sthx [RS], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"stmw\"         opcode=\"bc000000\" form=\"D\"        group=\"m\" desc=\"Store Multiple Word\">\n    <!-- ? -->\n  </insn>\n  <insn mnem=\"stswi\"        opcode=\"7c0005aa\" form=\"X\"        group=\"m\" desc=\"Store String Word Immediate\">\n    <!-- ? -->\n  </insn>\n  <insn mnem=\"stswx\"        opcode=\"7c00052a\" form=\"X\"        group=\"m\" desc=\"Store String Word Indexed\">\n    <!-- ? -->\n  </insn>\n  <insn mnem=\"stw\"          opcode=\"90000000\" form=\"D\"        group=\"m\" desc=\"Store Word\">\n    <in field=\"RS\" />\n    <in field=\"RA0\" />\n    <in field=\"d\" />\n    <disasm>stw [RS], [d]([RA0])</disasm>\n  </insn>\n  <insn mnem=\"stwbrx\"       opcode=\"7c00052c\" form=\"X\"        group=\"m\" desc=\"Store Word Byte-Reverse Indexed\">\n    <in field=\"RS\" />\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <disasm>stwbrx [RS], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"stwcx\"        opcode=\"7c00012d\" form=\"X\"        group=\"m\" desc=\"Store Word Conditional Indexed\">\n    <in field=\"RS\" />\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <out field=\"CR\" />\n    <disasm>stwcx. [RS], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"stwu\"         opcode=\"94000000\" form=\"D\"        group=\"m\" desc=\"Store Word with Update\">\n    <in field=\"RS\" />\n    <in field=\"RA\" />\n    <in field=\"d\" />\n    <out field=\"RA\" />\n    <disasm>stwu [RS], [d]([RA])</disasm>\n  </insn>\n  <insn mnem=\"stwux\"        opcode=\"7c00016e\" form=\"X\"        group=\"m\" desc=\"Store Word with Update Indexed\">\n    <in field=\"RS\" />\n    <in field=\"RA\" />\n    <in field=\"RB\" />\n    <out field=\"RA\" />\n    <disasm>stwux [RS], [RA], [RB]</disasm>\n  </insn>\n  <insn mnem=\"stwx\"         opcode=\"7c00012e\" form=\"X\"        group=\"m\" desc=\"Store Word Indexed\">\n    <in field=\"RS\" />\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <disasm>stwx [RS], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"subfx\"        opcode=\"7c000050\" form=\"XO\"       group=\"i\" desc=\"Subtract From\">\n    <in field=\"RA\" />\n    <in field=\"RB\" />\n    <out field=\"RD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <out field=\"OE\" conditional=\"true\" />\n    <disasm>subf[OE][Rc] [RD], [RA], [RB]</disasm>\n  </insn>\n  <insn mnem=\"subfcx\"       opcode=\"7c000010\" form=\"XO\"       group=\"i\" desc=\"Subtract From Carrying\">\n    <in field=\"RA\" />\n    <in field=\"RB\" />\n    <out field=\"RD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <out field=\"OE\" conditional=\"true\" />\n    <disasm>subfc[OE][Rc] [RD], [RA], [RB]</disasm>\n  </insn>\n  <insn mnem=\"subfex\"       opcode=\"7c000110\" form=\"XO\"       group=\"i\" desc=\"Subtract From Extended\">\n    <in field=\"RA\" />\n    <in field=\"RB\" />\n    <out field=\"RD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <out field=\"OE\" conditional=\"true\" />\n    <disasm>subfe[OE][Rc] [RD], [RA], [RB]</disasm>\n  </insn>\n  <insn mnem=\"subficx\"      opcode=\"20000000\" form=\"D\"        group=\"i\" desc=\"Subtract From Immediate Carrying\">\n    <in field=\"RA\" />\n    <in field=\"SIMM\" />\n    <out field=\"RD\" />\n    <out field=\"CA\" />\n    <disasm>subfic [RD], [RA], [SIMM]</disasm>\n  </insn>\n  <insn mnem=\"subfmex\"      opcode=\"7c0001d0\" form=\"XO\"       group=\"i\" desc=\"Subtract From Minus One Extended\">\n    <in field=\"RA\" />\n    <in field=\"CA\" />\n    <out field=\"RD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <out field=\"OE\" conditional=\"true\" />\n    <out field=\"CA\" />\n    <disasm>subfme[OE][Rc] [RD], [RA]</disasm>\n  </insn>\n  <insn mnem=\"subfzex\"      opcode=\"7c000190\" form=\"XO\"       group=\"i\" desc=\"Subtract From Zero Extended\">\n    <in field=\"RA\" />\n    <in field=\"CA\" />\n    <out field=\"RD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <out field=\"OE\" conditional=\"true\" />\n    <out field=\"CA\" />\n    <disasm>subfze[OE][Rc] [RD], [RA]</disasm>\n  </insn>\n  <insn mnem=\"sync\"         opcode=\"7c0004ac\" form=\"X\"        group=\"i\" desc=\"Synchronize\">\n    <disasm>sync</disasm>\n  </insn>\n  <insn mnem=\"td\"           opcode=\"7c000088\" form=\"X\"        group=\"b\" desc=\"Trap Doubleword\">\n    <in field=\"TO\" />\n    <in field=\"RA\" />\n    <in field=\"RB\" />\n    <disasm>td [TO], [RA], [RB]</disasm>\n  </insn>\n  <insn mnem=\"tdi\"          opcode=\"08000000\" form=\"D\"        group=\"b\" desc=\"Trap Doubleword Immediate\">\n    <in field=\"TO\" />\n    <in field=\"RA\" />\n    <in field=\"SIMM\" />\n    <disasm>tdi [TO], [RA], [SIMM]</disasm>\n  </insn>\n  <insn mnem=\"tw\"           opcode=\"7c000008\" form=\"X\"        group=\"b\" desc=\"Trap Word\">\n    <in field=\"TO\" />\n    <in field=\"RA\" />\n    <in field=\"RB\" />\n    <disasm>tw [TO], [RA], [RB]</disasm>\n  </insn>\n  <insn mnem=\"twi\"          opcode=\"0c000000\" form=\"D\"        group=\"b\" desc=\"Trap Word Immediate\">\n    <in field=\"TO\" />\n    <in field=\"RA\" />\n    <in field=\"SIMM\" />\n    <disasm>tw [TO], [RA], [SIMM]</disasm>\n  </insn>\n  <insn mnem=\"xorx\"         opcode=\"7c000278\" form=\"X\"        group=\"i\" desc=\"XOR\">\n    <in field=\"RS\" />\n    <in field=\"RB\" />\n    <out field=\"RA\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>xor[Rc] [RA], [RS], [RB]</disasm>\n  </insn>\n  <insn mnem=\"xori\"         opcode=\"68000000\" form=\"D\"        group=\"i\" desc=\"XOR Immediate\">\n    <in field=\"RS\" />\n    <in field=\"UIMM\" />\n    <out field=\"RA\" />\n    <disasm>xori [RA], [RS], [UIMM]</disasm>\n  </insn>\n  <insn mnem=\"xoris\"        opcode=\"6c000000\" form=\"D\"        group=\"i\" desc=\"XOR Immediate Shifted\">\n    <in field=\"RS\" />\n    <in field=\"UIMM\" />\n    <out field=\"RA\" />\n    <disasm>xoris [RA], [RS], [UIMM]</disasm>\n  </insn>\n</ppc-isa>\n<ppc-isa name=\"vmx\">\n  <!-- These match docs/ppc/altivec_instructions.pdf -->\n  <insn mnem=\"lvebx\"        opcode=\"7c00000e\" form=\"X\"        group=\"m\" desc=\"Load Vector Element Byte Indexed\">\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <out field=\"VD\" />\n    <disasm>lvebx [VD], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"lvehx\"        opcode=\"7c00004e\" form=\"X\"        group=\"m\" desc=\"Load Vector Element Half Word Indexed\">\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <out field=\"VD\" />\n    <disasm>lvehx [VD], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"lvewx\"        opcode=\"7c00008e\" form=\"X\"        group=\"m\" desc=\"Load Vector Element Word Indexed\">\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <out field=\"VD\" />\n    <disasm>lvewx [VD], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"lvewx128\"     opcode=\"10000083\" form=\"VX128_1\"  group=\"m\" desc=\"Load Vector Element Word Indexed 128\">\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <out field=\"VD\" />\n    <disasm>lvewx128 [VD], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"lvsl\"         opcode=\"7c00000c\" form=\"X\"        group=\"v\" desc=\"Load Vector for Shift Left Indexed\">\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <out field=\"VD\" />\n    <disasm>lvsl [VD], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"lvsl128\"      opcode=\"10000003\" form=\"VX128_1\"  group=\"v\" desc=\"Load Vector for Shift Left Indexed 128\">\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <out field=\"VD\" />\n    <disasm>lvsl128 [VD], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"lvsr\"         opcode=\"7c00004c\" form=\"X\"        group=\"v\" desc=\"Load Vector for Shift Right Indexed\">\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <out field=\"VD\" />\n    <disasm>lvsr [VD], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"lvsr128\"      opcode=\"10000043\" form=\"VX128_1\"  group=\"v\" desc=\"Load Vector for Shift Right Indexed 128\">\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <out field=\"VD\" />\n    <disasm>lvsr128 [VD], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"lvx\"          opcode=\"7c0000ce\" form=\"X\"        group=\"m\" desc=\"Load Vector Indexed\">\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <out field=\"VD\" />\n    <disasm>lvx [VD], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"lvx128\"       opcode=\"100000C3\" form=\"VX128_1\"  group=\"m\" desc=\"Load Vector Indexed 128\">\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <out field=\"VD\" />\n    <disasm>lvx128 [VD], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"lvxl\"         opcode=\"7c0002ce\" form=\"X\"        group=\"m\" desc=\"Load Vector Indexed LRU\">\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <out field=\"VD\" />\n    <disasm>lvslx [VD], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"lvxl128\"      opcode=\"100002C3\" form=\"VX128_1\"  group=\"m\" desc=\"Load Vector Indexed LRU 128\">\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <out field=\"VD\" />\n    <disasm>lvxl128 [VD], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"lvlx\"         opcode=\"7C00040E\" form=\"X\"        group=\"m\" desc=\"Load Vector Left Indexed\">\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <out field=\"VD\" />\n    <disasm>lvlx [VD], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"lvlx128\"      opcode=\"10000403\" form=\"VX128_1\"  group=\"m\" desc=\"Load Vector Left Indexed 128\">\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <out field=\"VD\" />\n    <disasm>lvlx128 [VD], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"lvlxl\"        opcode=\"7C00060E\" form=\"X\"        group=\"m\" desc=\"Load Vector Left Indexed LRU\">\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <out field=\"VD\" />\n    <disasm>lvlxl [VD], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"lvlxl128\"     opcode=\"10000603\" form=\"VX128_1\"  group=\"m\" desc=\"Load Vector Left Indexed LRU 128\">\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <out field=\"VD\" />\n    <disasm>lvlxl128 [VD], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"lvrx\"         opcode=\"7C00044E\" form=\"X\"        group=\"m\" desc=\"Load Vector Right Indexed\">\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <out field=\"VD\" />\n    <disasm>lvrx [VD], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"lvrx128\"      opcode=\"10000443\" form=\"VX128_1\"  group=\"m\" desc=\"Load Vector Right Indexed 128\">\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <out field=\"VD\" />\n    <disasm>lvrx128 [VD], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"lvrxl\"        opcode=\"7C00064E\" form=\"X\"        group=\"m\" desc=\"Load Vector Right Indexed LRU\">\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <out field=\"VD\" />\n    <disasm>lvrxl [VD], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"lvrxl128\"     opcode=\"10000643\" form=\"VX128_1\"  group=\"m\" desc=\"Load Vector Right Indexed LRU 128\">\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <out field=\"VD\" />\n    <disasm>lvrxl128 [VD], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"mfvscr\"       opcode=\"10000604\" form=\"VX\"       group=\"c\" desc=\"Move from VSCR\">\n    <in field=\"VSCR\" />\n    <out field=\"VD\" />\n  </insn>\n  <insn mnem=\"mtvscr\"       opcode=\"10000644\" form=\"VX\"       group=\"c\" desc=\"Move to VSCR\">\n    <in field=\"VB\" />\n    <out field=\"VSCR\" />\n  </insn>\n  <insn mnem=\"stvebx\"       opcode=\"7c00010e\" form=\"X\"        group=\"m\" desc=\"Store Vector Element Byte Indexed\">\n    <in field=\"VS\" />\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <disasm>stvebx [VS], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"stvehx\"       opcode=\"7c00014e\" form=\"X\"        group=\"m\" desc=\"Store Vector Element Half Word Indexed\">\n    <in field=\"VS\" />\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <disasm>stvehx [VS], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"stvewx\"       opcode=\"7c00018e\" form=\"X\"        group=\"m\" desc=\"Store Vector Element Word Indexed\">\n    <in field=\"VS\" />\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <disasm>stvewx [VS], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"stvewx128\"    opcode=\"10000183\" form=\"VX128_1\"  group=\"m\" desc=\"Store Vector Element Word Indexed 128\">\n    <in field=\"VS\" />\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <disasm>stvewx128 [VS], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"stvx\"         opcode=\"7c0001ce\" form=\"X\"        group=\"m\" desc=\"Store Vector Indexed\">\n    <in field=\"VS\" />\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <disasm>stvx [VS], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"stvx128\"      opcode=\"100001c3\" form=\"VX128_1\"  group=\"m\" desc=\"Store Vector Indexed 128\">\n    <in field=\"VS\" />\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <disasm>stvx128 [VS], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"stvxl\"        opcode=\"7c0003ce\" form=\"X\"        group=\"m\" desc=\"Store Vector Indexed LRU\">\n    <in field=\"VS\" />\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <disasm>stvxl [VS], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"stvxl128\"     opcode=\"100003c3\" form=\"VX128_1\"  group=\"m\" desc=\"Store Vector Indexed LRU 128\">\n    <in field=\"VS\" />\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <disasm>stvxl128 [VS], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"stvlx\"        opcode=\"7c00050e\" form=\"X\"        group=\"m\" desc=\"Store Vector Left Indexed\">\n    <in field=\"VS\" />\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <disasm>stvlx [VS], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"stvlx128\"     opcode=\"10000503\" form=\"VX128_1\"  group=\"m\" desc=\"Store Vector Left Indexed 128\">\n    <in field=\"VS\" />\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <disasm>stvlx128 [VS], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"stvlxl\"       opcode=\"7c00070e\" form=\"X\"        group=\"m\" desc=\"Store Vector Left Indexed LRU\">\n    <in field=\"VS\" />\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <disasm>stvlxl [VS], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"stvlxl128\"    opcode=\"10000703\" form=\"VX128_1\"  group=\"m\" desc=\"Store Vector Left Indexed LRU 128\">\n    <in field=\"VS\" />\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <disasm>stvlxl128 [VS], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"stvrx\"        opcode=\"7c00054e\" form=\"X\"        group=\"m\" desc=\"Store Vector Right Indexed\">\n    <in field=\"VS\" />\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <disasm>stvrx [VS], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"stvrx128\"     opcode=\"10000543\" form=\"VX128_1\"  group=\"m\" desc=\"Store Vector Right Indexed 128\">\n    <in field=\"VS\" />\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <disasm>stvrx128 [VS], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"stvrxl\"       opcode=\"7c00074e\" form=\"X\"        group=\"m\" desc=\"Store Vector Right Indexed LRU\">\n    <in field=\"VS\" />\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <disasm>stvrxl [VS], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"stvrxl128\"    opcode=\"10000743\" form=\"VX128_1\"  group=\"m\" desc=\"Store Vector Right Indexed LRU 128\">\n    <in field=\"VS\" />\n    <in field=\"RA0\" />\n    <in field=\"RB\" />\n    <disasm>stvrxl128 [VS], [RA0], [RB]</disasm>\n  </insn>\n  <insn mnem=\"vaddcuw\"      opcode=\"10000180\" form=\"VX\"       group=\"v\" desc=\"Vector Add Carryout Unsigned Word\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vaddcuw [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vaddfp\"       opcode=\"1000000A\" form=\"VX\"       group=\"v\" desc=\"Vector Add Floating Point\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vaddfp [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vaddfp128\"    opcode=\"14000010\" form=\"VX128\"    group=\"v\" desc=\"Vector128 Add Floating Point\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vaddfp128 [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vaddsbs\"      opcode=\"10000300\" form=\"VX\"       group=\"v\" desc=\"Vector Add Signed Byte Saturate\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <out field=\"VSCR\" />\n    <disasm>vaddsbs [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vaddshs\"      opcode=\"10000340\" form=\"VX\"       group=\"v\" desc=\"Vector Add Signed Half Word Saturate\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <out field=\"VSCR\" />\n    <disasm>vaddshs [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vaddsws\"      opcode=\"10000380\" form=\"VX\"       group=\"v\" desc=\"Vector Add Signed Word Saturate\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <out field=\"VSCR\" />\n    <disasm>vaddsws [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vaddubm\"      opcode=\"10000000\" form=\"VX\"       group=\"v\" desc=\"Vector Add Unsigned Byte Modulo\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vaddubm [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vaddubs\"      opcode=\"10000200\" form=\"VX\"       group=\"v\" desc=\"Vector Add Unsigned Byte Saturate\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <out field=\"VSCR\" />\n    <disasm>vaddubs [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vadduhm\"      opcode=\"10000040\" form=\"VX\"       group=\"v\" desc=\"Vector Add Unsigned Half Word Modulo\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vadduhm [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vadduhs\"      opcode=\"10000240\" form=\"VX\"       group=\"v\" desc=\"Vector Add Unsigned Half Word Saturate\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <out field=\"VSCR\" />\n    <disasm>vadduhs [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vadduwm\"      opcode=\"10000080\" form=\"VX\"       group=\"v\" desc=\"Vector Add Unsigned Word Modulo\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vadduwm [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vadduws\"      opcode=\"10000280\" form=\"VX\"       group=\"v\" desc=\"Vector Add Unsigned Word Saturate\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <out field=\"VSCR\" />\n    <disasm>vadduws [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vand\"         opcode=\"10000404\" form=\"VX\"       group=\"v\" desc=\"Vector Logical AND\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vand [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vand128\"      opcode=\"14000210\" form=\"VX128\"    group=\"v\" desc=\"Vector128 Logical AND\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vand128 [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vandc\"        opcode=\"10000444\" form=\"VX\"       group=\"v\" desc=\"Vector Logical AND with Complement\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vandc [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vandc128\"     opcode=\"14000250\" form=\"VX128\"    group=\"v\" desc=\"Vector128 Logical AND with Complement\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vandc128 [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vavgsb\"       opcode=\"10000502\" form=\"VX\"       group=\"v\" desc=\"Vector Average Signed Byte\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vavgsb [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vavgsh\"       opcode=\"10000542\" form=\"VX\"       group=\"v\" desc=\"Vector Average Signed Half Word\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vavgsh [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vavgsw\"       opcode=\"10000582\" form=\"VX\"       group=\"v\" desc=\"Vector Average Signed Word\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vavgsw [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vavgub\"       opcode=\"10000402\" form=\"VX\"       group=\"v\" desc=\"Vector Average Unsigned Byte\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vavgub [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vavguh\"       opcode=\"10000442\" form=\"VX\"       group=\"v\" desc=\"Vector Average Unsigned Half Word\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vavguh [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vavguw\"       opcode=\"10000482\" form=\"VX\"       group=\"v\" desc=\"Vector Average Unsigned Word\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vavguw [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vcfsx\"        opcode=\"1000034A\" form=\"VX\"       group=\"v\" desc=\"Vector Convert from Signed Fixed-Point Word\">\n    <in field=\"VB\" />\n    <in field=\"UIMM\" />\n    <out field=\"VD\" />\n    <disasm>vcfsx [VD], [VB], [UIMM]</disasm>\n  </insn>\n  <insn mnem=\"vcfux\"        opcode=\"1000030A\" form=\"VX\"       group=\"v\" desc=\"Vector Convert from Unsigned Fixed-Point Word\">\n    <in field=\"VB\" />\n    <in field=\"UIMM\" />\n    <out field=\"VD\" />\n    <disasm>vcfux [VD], [VB], [UIMM]</disasm>\n  </insn>\n  <insn mnem=\"vcmpbfp\"      opcode=\"100003C6\" form=\"VC\"       group=\"v\" desc=\"Vector Compare Bounds Floating Point\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>vcmpbfp[Rc] [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vcmpbfp128\"   opcode=\"18000180\" form=\"VX128_R\"  group=\"v\" desc=\"Vector128 Compare Bounds Floating Point\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>vcmpbfp128[Rc] [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vcmpeqfp\"     opcode=\"100000C6\" form=\"VC\"       group=\"v\" desc=\"Vector Compare Equal-to Floating Point\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>vcmpeqfp[Rc] [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vcmpeqfp128\"  opcode=\"18000000\" form=\"VX128_R\"  group=\"v\" desc=\"Vector128 Compare Equal-to Floating Point\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>vcmpeqfp128[Rc] [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vcmpequb\"     opcode=\"10000006\" form=\"VC\"       group=\"v\" desc=\"Vector Compare Equal-to Unsigned Byte\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>vcmpequb[Rc] [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vcmpequh\"     opcode=\"10000046\" form=\"VC\"       group=\"v\" desc=\"Vector Compare Equal-to Unsigned Half Word\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>vcmpequh[Rc] [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vcmpequw\"     opcode=\"10000086\" form=\"VC\"       group=\"v\" desc=\"Vector Compare Equal-to Unsigned Word\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>vcmpequw[Rc] [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vcmpequw128\"  opcode=\"18000200\" form=\"VX128_R\"  group=\"v\" desc=\"Vector128 Compare Equal-to Unsigned Word\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>vcmpequw128[Rc] [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vcmpgefp\"     opcode=\"100001C6\" form=\"VC\"       group=\"v\" desc=\"Vector Compare Greater-Than-or-Equal-to Floating Point\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>vcmpgefp[Rc] [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vcmpgefp128\"  opcode=\"18000080\" form=\"VX128_R\"  group=\"v\" desc=\"Vector128 Compare Greater-Than-or-Equal-to Floating Point\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>vcmpgefp128[Rc] [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vcmpgtfp\"     opcode=\"100002C6\" form=\"VC\"       group=\"v\" desc=\"Vector Compare Greater-Than Floating Point\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>vcmpgtfp[Rc] [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vcmpgtfp128\"  opcode=\"18000100\" form=\"VX128_R\"  group=\"v\" desc=\"Vector128 Compare Greater-Than Floating-Point\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>vcmpgtfp128[Rc] [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vcmpgtsb\"     opcode=\"10000306\" form=\"VC\"       group=\"v\" desc=\"Vector Compare Greater-Than Signed Byte\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>vcmpgtsb[Rc] [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vcmpgtsh\"     opcode=\"10000346\" form=\"VC\"       group=\"v\" desc=\"Vector Compare Greater-Than Signed Half Word\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>vcmpgtsh[Rc] [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vcmpgtsw\"     opcode=\"10000386\" form=\"VC\"       group=\"v\" desc=\"Vector Compare Greater-Than Signed Word\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>vcmpgtsw[Rc] [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vcmpgtub\"     opcode=\"10000206\" form=\"VC\"       group=\"v\" desc=\"Vector Compare Greater-Than Unsigned Byte\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>vcmpgtub[Rc] [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vcmpgtuh\"     opcode=\"10000246\" form=\"VC\"       group=\"v\" desc=\"Vector Compare Greater-Than Unsigned Half Word\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>vcmpgtuh[Rc] [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vcmpgtuw\"     opcode=\"10000286\" form=\"VC\"       group=\"v\" desc=\"Vector Compare Greater-Than Unsigned Word\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <out field=\"CR\" conditional=\"true\" />\n    <disasm>vcmpgtuw[Rc] [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vctsxs\"       opcode=\"100003CA\" form=\"VX\"       group=\"v\" desc=\"Vector Convert to Signed Fixed-Point Word Saturate\">\n    <in field=\"VB\" />\n    <in field=\"UIMM\" />\n    <out field=\"VD\" />\n    <out field=\"VSCR\" />\n    <disasm>vctsxs [VD], [VB], [UIMM]</disasm>\n  </insn>\n  <insn mnem=\"vctuxs\"       opcode=\"1000038A\" form=\"VX\"       group=\"v\" desc=\"Vector Convert to Unsigned Fixed-Point Word Saturate\">\n    <in field=\"VB\" />\n    <in field=\"UIMM\" />\n    <out field=\"VD\" />\n    <out field=\"VSCR\" />\n    <disasm>vctuxs [VD], [VB], [UIMM]</disasm>\n  </insn>\n  <insn mnem=\"vexptefp\"     opcode=\"1000018A\" form=\"VX\"       group=\"v\" desc=\"Vector 2 Raised to the Exponent Estimate Floating Point\">\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vexptefp [VD], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vexptefp128\"  opcode=\"180006B0\" form=\"VX128_3\"  group=\"v\" desc=\"Vector128 Log2 Estimate Floating Point\">\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vexptefp128 [VD], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vlogefp\"      opcode=\"100001CA\" form=\"VX\"       group=\"v\" desc=\"Vector Log2 Estimate Floating Point\">\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vlogefp [VD], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vlogefp128\"   opcode=\"180006F0\" form=\"VX128_3\"  group=\"v\" desc=\"Vector128 Log2 Estimate Floating Point\">\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vlogefp128 [VD], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vmaddfp\"      opcode=\"1000002E\" form=\"VA\"       group=\"v\" desc=\"Vector Multiply-Add Floating Point\">\n    <in field=\"VA\" />\n    <in field=\"VC\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vmaddfp [VD], [VA], [VC], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vmaddfp128\"   opcode=\"140000D0\" form=\"VX128\"    group=\"v\" desc=\"Vector128 Multiply Add Floating Point\">\n    <in field=\"VA\" />\n    <in field=\"VC\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vmaddfp128 [VD], [VA], [VB], [VD]</disasm>\n  </insn>\n  <insn mnem=\"vmaxfp\"       opcode=\"1000040A\" form=\"VX\"       group=\"v\" desc=\"Vector Maximum Floating Point\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vmaxfp [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vmaxfp128\"    opcode=\"18000280\" form=\"VX128\"    group=\"v\" desc=\"Vector128 Maximum Floating Point\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vmaxfp128 [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vmaxsb\"       opcode=\"10000102\" form=\"VX\"       group=\"v\" desc=\"Vector Maximum Signed Byte\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vmaxsb [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vmaxsh\"       opcode=\"10000142\" form=\"VX\"       group=\"v\" desc=\"Vector Maximum Signed Half Word\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vmaxsh [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vmaxsw\"       opcode=\"10000182\" form=\"VX\"       group=\"v\" desc=\"Vector Maximum Signed Word\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vmaxsw [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vmaxub\"       opcode=\"10000002\" form=\"VX\"       group=\"v\" desc=\"Vector Maximum Unsigned Byte\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vmaxub [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vmaxuh\"       opcode=\"10000042\" form=\"VX\"       group=\"v\" desc=\"Vector Maximum Unsigned Half Word\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vmaxuh [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vmaxuw\"       opcode=\"10000082\" form=\"VX\"       group=\"v\" desc=\"Vector Maximum Unsigned Word\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vmaxuw [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vmhaddshs\"    opcode=\"10000020\" form=\"VA\"       group=\"v\" desc=\"Vector Multiply-High and Add Signed Signed Half Word Saturate\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <in field=\"VC\" />\n    <out field=\"VD\" />\n    <out field=\"VSCR\" />\n    <disasm>vmhaddshs [VD], [VA], [VB], [VC]</disasm>\n  </insn>\n  <insn mnem=\"vmhraddshs\"   opcode=\"10000021\" form=\"VA\"       group=\"v\" desc=\"Vector Multiply-High Round and Add Signed Signed Half Word Saturate\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <in field=\"VC\" />\n    <out field=\"VD\" />\n    <out field=\"VSCR\" />\n    <disasm>vmhraddshs [VD], [VA], [VB], [VC]</disasm>\n  </insn>\n  <insn mnem=\"vminfp\"       opcode=\"1000044A\" form=\"VX\"       group=\"v\" desc=\"Vector Minimum Floating Point\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vminfp [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vminfp128\"    opcode=\"180002C0\" form=\"VX128\"    group=\"v\" desc=\"Vector128 Minimum Floating Point\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vminfp128 [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vminsb\"       opcode=\"10000302\" form=\"VX\"       group=\"v\" desc=\"Vector Minimum Signed Byte\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vminsb [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vminsh\"       opcode=\"10000342\" form=\"VX\"       group=\"v\" desc=\"Vector Minimum Signed Half Word\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vminsh [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vminsw\"       opcode=\"10000382\" form=\"VX\"       group=\"v\" desc=\"Vector Minimum Signed Word\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vminsw [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vminub\"       opcode=\"10000202\" form=\"VX\"       group=\"v\" desc=\"Vector Minimum Unsigned Byte\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vminub [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vminuh\"       opcode=\"10000242\" form=\"VX\"       group=\"v\" desc=\"Vector Minimum Unsigned Half Word\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vminuh [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vminuw\"       opcode=\"10000282\" form=\"VX\"       group=\"v\" desc=\"Vector Minimum Unsigned Word\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vminuw [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vmladduhm\"    opcode=\"10000022\" form=\"VA\"       group=\"v\" desc=\"Vector Multiply-Low and Add Unsigned Half Word Modulo\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <in field=\"VC\" />\n    <out field=\"VD\" />\n    <disasm>vmladduhm [VD], [VA], [VB], [VC]</disasm>\n  </insn>\n  <insn mnem=\"vmrghb\"       opcode=\"1000000C\" form=\"VX\"       group=\"v\" desc=\"Vector Merge High Byte\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vmrghb [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vmrghh\"       opcode=\"1000004C\" form=\"VX\"       group=\"v\" desc=\"Vector Merge High Half Word\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vmrghh [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vmrghw\"       opcode=\"1000008C\" form=\"VX\"       group=\"v\" desc=\"Vector Merge High Word\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vmrghw [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vmrghw128\"    opcode=\"18000300\" form=\"VX128\"    group=\"v\" desc=\"Vector128 Merge High Word\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vmrghw128 [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vmrglb\"       opcode=\"1000010C\" form=\"VX\"       group=\"v\" desc=\"Vector Merge Low Byte\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vmrglb [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vmrglh\"       opcode=\"1000014C\" form=\"VX\"       group=\"v\" desc=\"Vector Merge Low Half Word\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vmrglh [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vmrglw\"       opcode=\"1000018C\" form=\"VX\"       group=\"v\" desc=\"Vector Merge Low Word\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vmrglw [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vmrglw128\"    opcode=\"18000340\" form=\"VX128\"    group=\"v\" desc=\"Vector128 Merge Low Word\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vmrglw128 [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vmsummbm\"     opcode=\"10000025\" form=\"VA\"       group=\"v\" desc=\"Vector Multiply-Sum Mixed-Sign Byte Modulo\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <in field=\"VC\" />\n    <out field=\"VD\" />\n    <disasm>vmsummbm [VD], [VA], [VB], [VC]</disasm>\n  </insn>\n  <insn mnem=\"vmsumshm\"     opcode=\"10000028\" form=\"VA\"       group=\"v\" desc=\"Vector Multiply-Sum Signed Half Word Modulo\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <in field=\"VC\" />\n    <out field=\"VD\" />\n    <disasm>vmsumshm [VD], [VA], [VB], [VC]</disasm>\n  </insn>\n  <insn mnem=\"vmsumshs\"     opcode=\"10000029\" form=\"VA\"       group=\"v\" desc=\"Vector Multiply-Sum Signed Half Word Saturate\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <in field=\"VC\" />\n    <out field=\"VD\" />\n    <out field=\"VSCR\" />\n    <disasm>vmsumshs [VD], [VA], [VB], [VC]</disasm>\n  </insn>\n  <insn mnem=\"vmsumubm\"     opcode=\"10000024\" form=\"VA\"       group=\"v\" desc=\"Vector Multiply-Sum Unsigned Byte Modulo\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <in field=\"VC\" />\n    <out field=\"VD\" />\n    <disasm>vmsumubm [VD], [VA], [VB], [VC]</disasm>\n  </insn>\n  <insn mnem=\"vmsumuhm\"     opcode=\"10000026\" form=\"VA\"       group=\"v\" desc=\"Vector Multiply-Sum Unsigned Half Word Modulo\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <in field=\"VC\" />\n    <out field=\"VD\" />\n    <disasm>vmsumuhm [VD], [VA], [VB], [VC]</disasm>\n  </insn>\n  <insn mnem=\"vmsumuhs\"     opcode=\"10000027\" form=\"VA\"       group=\"v\" desc=\"Vector Multiply-Sum Unsigned Half Word Saturate\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <in field=\"VC\" />\n    <out field=\"VD\" />\n    <out field=\"VSCR\" />\n    <disasm>vmsumuhs [VD], [VA], [VB], [VC]</disasm>\n  </insn>\n  <insn mnem=\"vmulesb\"      opcode=\"10000308\" form=\"VX\"       group=\"v\" desc=\"Vector Multiply Even Signed Byte\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vmulesb [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vmulesh\"      opcode=\"10000348\" form=\"VX\"       group=\"v\" desc=\"Vector Multiply Even Signed Half Word\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vmulesh [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vmuleub\"      opcode=\"10000208\" form=\"VX\"       group=\"v\" desc=\"Vector Multiply Even Unsigned Byte\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vmuleub [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vmuleuh\"      opcode=\"10000248\" form=\"VX\"       group=\"v\" desc=\"Vector Multiply Even Unsigned Half Word\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vmuleuh [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vmulosb\"      opcode=\"10000108\" form=\"VX\"       group=\"v\" desc=\"Vector Multiply Odd Signed Byte\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vmulosb [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vmulosh\"      opcode=\"10000148\" form=\"VX\"       group=\"v\" desc=\"Vector Multiply Odd Signed Half Word\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vmulosh [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vmuloub\"      opcode=\"10000008\" form=\"VX\"       group=\"v\" desc=\"Vector Multiply Odd Unsigned Byte\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vmuloub [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vmulouh\"      opcode=\"10000048\" form=\"VX\"       group=\"v\" desc=\"Vector Multiply Odd Unsigned Half Word\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vmulouh [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vnmsubfp\"     opcode=\"1000002F\" form=\"VA\"       group=\"v\" desc=\"Vector Negative Multiply-Subtract Floating Point\">\n    <in field=\"VA\" />\n    <in field=\"VC\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vnmsubfp [VD], [VA], [VC], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vnmsubfp128\"  opcode=\"14000150\" form=\"VX128\"    group=\"v\" desc=\"Vector128 Negative Multiply-Subtract Floating Point\">\n    <in field=\"VA\" />\n    <in field=\"VD\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vnmsubfp128 [VD], [VA], [VD], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vnor\"         opcode=\"10000504\" form=\"VX\"       group=\"v\" desc=\"Vector Logical NOR\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vnor [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vnor128\"      opcode=\"14000290\" form=\"VX128\"    group=\"v\" desc=\"Vector128 Logical NOR\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vnor128 [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vor\"          opcode=\"10000484\" form=\"VX\"       group=\"v\" desc=\"Vector Logical OR\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vor [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vor128\"       opcode=\"140002D0\" form=\"VX128\"    group=\"v\" desc=\"Vector128 Logical OR\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vor128 [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vperm\"        opcode=\"1000002B\" form=\"VA\"       group=\"v\" desc=\"Vector Permute\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <in field=\"VC\" />\n    <out field=\"VD\" />\n    <disasm>vperm [VD], [VA], [VB], [VC]</disasm>\n  </insn>\n  <insn mnem=\"vperm128\"     opcode=\"14000000\" form=\"VX128_2\"  group=\"v\" desc=\"Vector128 Permute\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <in field=\"VC\" />\n    <out field=\"VD\" />\n    <disasm>vperm128 [VD], [VA], [VB], [VC]</disasm>\n  </insn>\n  <insn mnem=\"vpkpx\"        opcode=\"1000030E\" form=\"VX\"       group=\"v\" desc=\"Vector Pack Pixel\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vpkpx [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vpkshss\"      opcode=\"1000018E\" form=\"VX\"       group=\"v\" desc=\"Vector Pack Signed Half Word Signed Saturate\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <out field=\"VSCR\" />\n    <disasm>vpkshss [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vpkshss128\"   opcode=\"14000200\" form=\"VX128\"    group=\"v\" desc=\"Vector128 Pack Signed Half Word Signed Saturate\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <out field=\"VSCR\" />\n    <disasm>vpkshss128 [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vpkshus\"      opcode=\"1000010E\" form=\"VX\"       group=\"v\" desc=\"Vector Pack Signed Half Word Unsigned Saturate\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <out field=\"VSCR\" />\n    <disasm>vpkshus [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vpkshus128\"   opcode=\"14000240\" form=\"VX128\"    group=\"v\" desc=\"Vector128 Pack Signed Half Word Unsigned Saturate\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <out field=\"VSCR\" />\n    <disasm>vpkshus128 [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vpkswss\"      opcode=\"100001CE\" form=\"VX\"       group=\"v\" desc=\"Vector Pack Signed Word Signed Saturate\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <out field=\"VSCR\" />\n    <disasm>vpkswss [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vpkswss128\"   opcode=\"14000280\" form=\"VX128\"    group=\"v\" desc=\"Vector128 Pack Signed Word Signed Saturate\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <out field=\"VSCR\" />\n    <disasm>vpkswss128 [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vpkswus\"      opcode=\"1000014E\" form=\"VX\"       group=\"v\" desc=\"Vector Pack Signed Word Unsigned Saturate\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <out field=\"VSCR\" />\n    <disasm>vpkswus [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vpkswus128\"   opcode=\"140002C0\" form=\"VX128\"    group=\"v\" desc=\"Vector128 Pack Signed Word Unsigned Saturate\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <out field=\"VSCR\" />\n    <disasm>vpkswus128 [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vpkuhum\"      opcode=\"1000000E\" form=\"VX\"       group=\"v\" desc=\"Vector Pack Unsigned Half Word Unsigned Modulo\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vpkuhum [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vpkuhum128\"   opcode=\"14000300\" form=\"VX128\"    group=\"v\" desc=\"Vector128 Pack Unsigned Half Word Unsigned Modulo\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vpkuhum128 [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vpkuhus\"      opcode=\"1000008E\" form=\"VX\"       group=\"v\" desc=\"Vector Pack Unsigned Half Word Unsigned Saturate\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <out field=\"VSCR\" />\n    <disasm>vpkuhus [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vpkuhus128\"   opcode=\"14000340\" form=\"VX128\"    group=\"v\" desc=\"Vector128 Pack Unsigned Half Word Unsigned Saturate\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <out field=\"VSCR\" />\n    <disasm>vpkuhus128 [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vpkuwum\"      opcode=\"1000004E\" form=\"VX\"       group=\"v\" desc=\"Vector Pack Unsigned Word Unsigned Modulo\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vpkuwum [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vpkuwum128\"   opcode=\"14000380\" form=\"VX128\"    group=\"v\" desc=\"Vector128 Pack Unsigned Word Unsigned Modulo\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vpkuwum128 [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vpkuwus\"      opcode=\"100000CE\" form=\"VX\"       group=\"v\" desc=\"Vector Pack Unsigned Word Unsigned Saturate\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <out field=\"VSCR\" />\n    <disasm>vpkuwus [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vpkuwus128\"   opcode=\"140003C0\" form=\"VX128\"    group=\"v\" desc=\"Vector128 Pack Unsigned Word Unsigned Saturate\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <out field=\"VSCR\" />\n    <disasm>vpkuwus128 [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vrefp\"        opcode=\"1000010A\" form=\"VX\"       group=\"v\" desc=\"Vector Reciprocal Estimate Floating Point\">\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vrefp [VD], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vrefp128\"     opcode=\"18000630\" form=\"VX128_3\"  group=\"v\" desc=\"Vector128 Reciprocal Estimate Floating Point\">\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vrefp128 [VD], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vrfim\"        opcode=\"100002CA\" form=\"VX\"       group=\"v\" desc=\"Vector Round to Floating-Point Integer toward -Infinity\">\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vrfim [VD], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vrfim128\"     opcode=\"18000330\" form=\"VX128_3\"  group=\"v\" desc=\"Vector128 Round to Floating-Point Integer toward -Infinity\">\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vrfim128 [VD], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vrfin\"        opcode=\"1000020A\" form=\"VX\"       group=\"v\" desc=\"Vector Round to Floating-Point Integer Nearest\">\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vrfin [VD], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vrfin128\"     opcode=\"18000370\" form=\"VX128_3\"  group=\"v\" desc=\"Vector128 Round to Floating-Point Integer Nearest\">\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vrfin128 [VD], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vrfip\"        opcode=\"1000028A\" form=\"VX\"       group=\"v\" desc=\"Vector Round to Floating-Point Integer toward +Infinity\">\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vrfip [VD], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vrfip128\"     opcode=\"180003B0\" form=\"VX128_3\"  group=\"v\" desc=\"Vector128 Round to Floating-Point Integer toward +Infinity\">\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vrfip128 [VD], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vrfiz\"        opcode=\"1000024A\" form=\"VX\"       group=\"v\" desc=\"Vector Round to Floating-Point Integer toward Zero\">\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vrfiz [VD], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vrfiz128\"     opcode=\"180003F0\" form=\"VX128_3\"  group=\"v\" desc=\"Vector128 Round to Floating-Point Integer toward Zero\">\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vrfiz128 [VD], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vrlb\"         opcode=\"10000004\" form=\"VX\"       group=\"v\" desc=\"Vector Rotate Left Integer Byte\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vrlb [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vrlh\"         opcode=\"10000044\" form=\"VX\"       group=\"v\" desc=\"Vector Rotate Left Integer Half Word\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vrlh [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vrlw\"         opcode=\"10000084\" form=\"VX\"       group=\"v\" desc=\"Vector Rotate Left Integer Word\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vrlw [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vrlw128\"      opcode=\"18000050\" form=\"VX128\"    group=\"v\" desc=\"Vector128 Rotate Left Word\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vrlw128 [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vrsqrtefp\"    opcode=\"1000014A\" form=\"VX\"       group=\"v\" desc=\"Vector Reciprocal Square Root Estimate Floating Point\">\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vrsqrtefp [VD], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vrsqrtefp128\" opcode=\"18000670\" form=\"VX128_3\"  group=\"v\" desc=\"Vector128 Reciprocal Square Root Estimate Floating Point\">\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vrsqrtefp128 [VD], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vsel\"         opcode=\"1000002A\" form=\"VA\"       group=\"v\" desc=\"Vector Conditional Select\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <in field=\"VC\" />\n    <out field=\"VD\" />\n    <disasm>vsel [VD], [VA], [VB], [VC]</disasm>\n  </insn>\n  <insn mnem=\"vsel128\"      opcode=\"14000350\" form=\"VX128\"    group=\"v\" desc=\"Vector128 Conditional Select\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <in field=\"VD\" />\n    <out field=\"VD\" />\n    <disasm>vsel128 [VD], [VA], [VB], [VD]</disasm>\n  </insn>\n  <insn mnem=\"vsl\"          opcode=\"100001C4\" form=\"VX\"       group=\"v\" desc=\"Vector Shift Left\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vsl [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vslb\"         opcode=\"10000104\" form=\"VX\"       group=\"v\" desc=\"Vector Shift Left Integer Byte\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vslb [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vsldoi\"       opcode=\"1000002C\" form=\"VA\"       group=\"v\" desc=\"Vector Shift Left Double by Octet Immediate\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <in field=\"SHB\" />\n    <out field=\"VD\" />\n    <disasm>vsldoi [VD], [VA], [VB], [SHB]</disasm>\n  </insn>\n  <insn mnem=\"vsldoi128\"    opcode=\"10000010\" form=\"VX128_5\"  group=\"v\" desc=\"Vector128 Shift Left Double by Octet Immediate\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <in field=\"SHB\" />\n    <out field=\"VD\" />\n    <disasm>vsldoi128 [VD], [VA], [VB], [SHB]</disasm>\n  </insn>\n  <insn mnem=\"vslh\"         opcode=\"10000144\" form=\"VX\"       group=\"v\" desc=\"Vector Shift Left Integer Half Word\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vslh [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vslo\"         opcode=\"1000040C\" form=\"VX\"       group=\"v\" desc=\"Vector Shift Left by Octet\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vslo [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vslo128\"      opcode=\"14000390\" form=\"VX128\"    group=\"v\" desc=\"Vector128 Shift Left Octet\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vslo128 [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vslw\"         opcode=\"10000184\" form=\"VX\"       group=\"v\" desc=\"Vector Shift Left Integer Word\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vslw [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vslw128\"      opcode=\"180000D0\" form=\"VX128\"    group=\"v\" desc=\"Vector128 Shift Left Integer Word\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vslw128 [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vspltb\"       opcode=\"1000020C\" form=\"VX\"       group=\"v\" desc=\"Vector Splat Byte\">\n    <in field=\"VB\" />\n    <in field=\"UIMM\" />\n    <out field=\"VD\" />\n    <disasm>vspltb [VD], [VB], [UIMM]</disasm>\n  </insn>\n  <insn mnem=\"vsplth\"       opcode=\"1000024C\" form=\"VX\"       group=\"v\" desc=\"Vector Splat Half Word\">\n    <in field=\"VB\" />\n    <in field=\"UIMM\" />\n    <out field=\"VD\" />\n    <disasm>vsplth [VD], [VB], [UIMM]</disasm>\n  </insn>\n  <insn mnem=\"vspltisb\"     opcode=\"1000030C\" form=\"VX\"       group=\"v\" desc=\"Vector Splat Immediate Signed Byte\">\n    <in field=\"SIMM\" />\n    <out field=\"VD\" />\n    <disasm>vspltisb [VD], [SIMM]</disasm>\n  </insn>\n  <insn mnem=\"vspltish\"     opcode=\"1000034C\" form=\"VX\"       group=\"v\" desc=\"Vector Splat Immediate Signed Half Word\">\n    <in field=\"SIMM\" />\n    <out field=\"VD\" />\n    <disasm>vspltish [VD], [SIMM]</disasm>\n  </insn>\n  <insn mnem=\"vspltisw\"     opcode=\"1000038C\" form=\"VX\"       group=\"v\" desc=\"Vector Splat Immediate Signed Word\">\n    <in field=\"SIMM\" />\n    <out field=\"VD\" />\n    <disasm>vspltisw [VD], [SIMM]</disasm>\n  </insn>\n  <insn mnem=\"vspltisw128\"  opcode=\"18000770\" form=\"VX128_3\"  group=\"v\" desc=\"Vector128 Splat Immediate Signed Word\">\n    <in field=\"SIMM\" />\n    <out field=\"VD\" />\n    <disasm>vspltisw128 [VD], [SIMM]</disasm>\n  </insn>\n  <insn mnem=\"vspltw\"       opcode=\"1000028C\" form=\"VX\"       group=\"v\" desc=\"Vector Splat Word\">\n    <in field=\"VB\" />\n    <in field=\"UIMM\" />\n    <out field=\"VD\" />\n    <disasm>vspltw [VD], [VB], [UIMM]</disasm>\n  </insn>\n  <insn mnem=\"vspltw128\"    opcode=\"18000730\" form=\"VX128_3\"  group=\"v\" desc=\"Vector128 Splat Word\">\n    <in field=\"VB\" />\n    <in field=\"UIMM\" />\n    <out field=\"VD\" />\n    <disasm>vspltw128 [VD], [VB], [UIMM]</disasm>\n  </insn>\n  <insn mnem=\"vsr\"          opcode=\"100002C4\" form=\"VX\"       group=\"v\" desc=\"Vector Shift Right\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vsr [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vsrab\"        opcode=\"10000304\" form=\"VX\"       group=\"v\" desc=\"Vector Shift Right Algebraic Byte\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vsrab [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vsrah\"        opcode=\"10000344\" form=\"VX\"       group=\"v\" desc=\"Vector Shift Right Algebraic Half Word\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vsrah [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vsraw\"        opcode=\"10000384\" form=\"VX\"       group=\"v\" desc=\"Vector Shift Right Algebraic Word\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vsraw [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vsraw128\"     opcode=\"18000150\" form=\"VX128\"    group=\"v\" desc=\"Vector128 Shift Right Arithmetic Word\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vsraw128 [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vsrb\"         opcode=\"10000204\" form=\"VX\"       group=\"v\" desc=\"Vector Shift Right Byte\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vsrb [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vsrh\"         opcode=\"10000244\" form=\"VX\"       group=\"v\" desc=\"Vector Shift Right Half Word\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vsrh [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vsro\"         opcode=\"1000044C\" form=\"VX\"       group=\"v\" desc=\"Vector Shift Right Octet\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vsro [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vsro128\"      opcode=\"140003D0\" form=\"VX128\"    group=\"v\" desc=\"Vector128 Shift Right Octet\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vsro128 [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vsrw\"         opcode=\"10000284\" form=\"VX\"       group=\"v\" desc=\"Vector Shift Right Word\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vsrw [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vsrw128\"      opcode=\"180001D0\" form=\"VX128\"    group=\"v\" desc=\"Vector128 Shift Right Word\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vsrw128 [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vsubcuw\"      opcode=\"10000580\" form=\"VX\"       group=\"v\" desc=\"Vector Subtract Carryout Unsigned Word\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vsubcuw [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vsubfp\"       opcode=\"1000004A\" form=\"VX\"       group=\"v\" desc=\"Vector Subtract Floating Point\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vsubfp [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vsubfp128\"    opcode=\"14000050\" form=\"VX128\"    group=\"v\" desc=\"Vector128 Subtract Floating Point\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vsubfp128 [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vsubsbs\"      opcode=\"10000700\" form=\"VX\"       group=\"v\" desc=\"Vector Subtract Signed Byte Saturate\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <out field=\"VSCR\" />\n    <disasm>vsubsbs [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vsubshs\"      opcode=\"10000740\" form=\"VX\"       group=\"v\" desc=\"Vector Subtract Signed Half Word Saturate\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <out field=\"VSCR\" />\n    <disasm>vsubshs [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vsubsws\"      opcode=\"10000780\" form=\"VX\"       group=\"v\" desc=\"Vector Subtract Signed Word Saturate\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <out field=\"VSCR\" />\n    <disasm>vsubsws [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vsububm\"      opcode=\"10000400\" form=\"VX\"       group=\"v\" desc=\"Vector Subtract Unsigned Byte Modulo\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vsububm [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vsububs\"      opcode=\"10000600\" form=\"VX\"       group=\"v\" desc=\"Vector Subtract Unsigned Byte Saturate\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <out field=\"VSCR\" />\n    <disasm>vsububs [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vsubuhm\"      opcode=\"10000440\" form=\"VX\"       group=\"v\" desc=\"Vector Subtract Unsigned Half Word Modulo\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vsubuhm [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vsubuhs\"      opcode=\"10000640\" form=\"VX\"       group=\"v\" desc=\"Vector Subtract Unsigned Half Word Saturate\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <out field=\"VSCR\" />\n    <disasm>vsubuhs [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vsubuwm\"      opcode=\"10000480\" form=\"VX\"       group=\"v\" desc=\"Vector Subtract Unsigned Word Modulo\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vsubuwm [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vsubuws\"      opcode=\"10000680\" form=\"VX\"       group=\"v\" desc=\"Vector Subtract Unsigned Word Saturate\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <out field=\"VSCR\" />\n    <disasm>vsubuws [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vsumsws\"      opcode=\"10000788\" form=\"VX\"       group=\"v\" desc=\"Vector Sum Across Signed Word Saturate\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <out field=\"VSCR\" />\n    <disasm>vsumsws [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vsum2sws\"     opcode=\"10000688\" form=\"VX\"       group=\"v\" desc=\"Vector Sum Across Partial (1/2) Signed Word Saturate\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <out field=\"VSCR\" />\n    <disasm>vsum2sws [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vsum4sbs\"     opcode=\"10000708\" form=\"VX\"       group=\"v\" desc=\"Vector Sum Across Partial (1/4) Signed Byte Saturate\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <out field=\"VSCR\" />\n    <disasm>vsum4sbs [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vsum4shs\"     opcode=\"10000648\" form=\"VX\"       group=\"v\" desc=\"Vector Sum Across Partial (1/4) Signed Half Word Saturate\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <out field=\"VSCR\" />\n    <disasm>vsum4shs [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vsum4ubs\"     opcode=\"10000608\" form=\"VX\"       group=\"v\" desc=\"Vector Sum Across Partial (1/4) Unsigned Byte Saturate\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <out field=\"VSCR\" />\n    <disasm>vsum4ubs [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vupkhpx\"      opcode=\"1000034E\" form=\"VX\"       group=\"v\" desc=\"Vector Unpack High Pixel\">\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vupkhpx [VD], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vupkhsb\"      opcode=\"1000020E\" form=\"VX\"       group=\"v\" desc=\"Vector Unpack High Signed Byte\">\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vupkhsb [VD], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vupkhsb128\"   opcode=\"18000380\" form=\"VX128\"    group=\"v\" desc=\"Vector128 Unpack High Signed Byte\">\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vupkhsb128 [VD], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vupkhsh\"      opcode=\"1000024E\" form=\"VX\"       group=\"v\" desc=\"Vector Unpack High Signed Half Word\">\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vupkhsh [VD], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vupklpx\"      opcode=\"100003CE\" form=\"VX\"       group=\"v\" desc=\"Vector Unpack Low Pixel\">\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vupklpx [VD], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vupklsb\"      opcode=\"1000028E\" form=\"VX\"       group=\"v\" desc=\"Vector Unpack Low Signed Byte\">\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vupklsb [VD], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vupklsb128\"   opcode=\"180003C0\" form=\"VX128\"    group=\"v\" desc=\"Vector128 Unpack Low Signed Byte\">\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vupklsb128 [VD], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vupklsh\"      opcode=\"100002CE\" form=\"VX\"       group=\"v\" desc=\"Vector Unpack Low Signed Half Word\">\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vupklsh [VD], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vxor\"         opcode=\"100004C4\" form=\"VX\"       group=\"v\" desc=\"Vector Logical XOR\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vxor [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vxor128\"      opcode=\"14000310\" form=\"VX128\"    group=\"v\" desc=\"Vector128 Logical XOR\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vxor128 [VD], [VA], [VB]</disasm>\n  </insn>\n\n  <insn mnem=\"vmulfp128\"    opcode=\"14000090\" form=\"VX128\"    group=\"v\" desc=\"Vector128 Multiply Floating-Point\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vmulfp128 [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vmaddcfp128\"  opcode=\"14000110\" form=\"VX128\"    group=\"v\" desc=\"Vector128 Multiply Add Floating Point\">\n    <in field=\"VA\" />\n    <in field=\"VD\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vmaddcfp128 [VD], [VA], [VD], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vmsum3fp128\"  opcode=\"14000190\" form=\"VX128\"    group=\"v\" desc=\"Vector128 Multiply Sum 3-way Floating Point\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vmsum3fp128 [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vmsum4fp128\"  opcode=\"140001D0\" form=\"VX128\"    group=\"v\" desc=\"Vector128 Multiply Sum 4-way Floating-Point\">\n    <in field=\"VA\" />\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vmsum4fp128 [VD], [VA], [VB]</disasm>\n  </insn>\n  <insn mnem=\"vpermwi128\"   opcode=\"18000210\" form=\"VX128_P\"  group=\"v\" desc=\"Vector128 Permutate Word Immediate\">\n    <in field=\"VB\" />\n    <in field=\"UIMM\" />\n    <out field=\"VD\" />\n    <disasm>vpermwi128 [VD], [VB], [UIMM]</disasm>\n  </insn>\n  <insn mnem=\"vcfpsxws128\"  opcode=\"18000230\" form=\"VX128_3\"  group=\"v\" desc=\"Vector128 Convert From Floating-Point to Signed Fixed-Point Word Saturate\">\n    <in field=\"VB\" />\n    <in field=\"UIMM\" />\n    <out field=\"VD\" />\n    <out field=\"VSCR\" />\n    <disasm>vcfpsxws128 [VD], [VB], [UIMM]</disasm>\n  </insn>\n  <insn mnem=\"vcfpuxws128\"  opcode=\"18000270\" form=\"VX128_3\"  group=\"v\" desc=\"Vector128 Convert From Floating-Point to Unsigned Fixed-Point Word Saturate\">\n    <in field=\"VB\" />\n    <in field=\"UIMM\" />\n    <out field=\"VD\" />\n    <out field=\"VSCR\" />\n    <disasm>vcfpuxws128 [VD], [VB], [UIMM]</disasm>\n  </insn>\n  <insn mnem=\"vcsxwfp128\"   opcode=\"180002B0\" form=\"VX128_3\"  group=\"v\" desc=\"Vector128 Convert From Signed Fixed-Point Word to Floating-Point\">\n    <in field=\"VB\" />\n    <in field=\"UIMM\" />\n    <out field=\"VD\" />\n    <disasm>vcsxwfp128 [VD], [VB], [UIMM]</disasm>\n  </insn>\n  <insn mnem=\"vcuxwfp128\"   opcode=\"180002F0\" form=\"VX128_3\"  group=\"v\" desc=\"Vector128 Convert From Unsigned Fixed-Point Word to Floating-Point\">\n    <in field=\"VB\" />\n    <in field=\"UIMM\" />\n    <out field=\"VD\" />\n    <disasm>vcuxwfp128 [VD], [VB], [UIMM]</disasm>\n  </insn>\n  <insn mnem=\"vpkd3d128\"    opcode=\"18000610\" form=\"VX128_4\"  group=\"v\" desc=\"Vector128 Pack D3Dtype, Rotate Left Immediate and Mask Insert\">\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <!-- TODO(benvanik): arg types -->\n  </insn>\n  <insn mnem=\"vrlimi128\"    opcode=\"18000710\" form=\"VX128_4\"  group=\"v\" desc=\"Vector128 Rotate Left Immediate and Mask Insert\">\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <disasm>vrlimi128 [VD], [VB], [IMM], [z]</disasm>\n  </insn>\n  <insn mnem=\"vupkd3d128\"   opcode=\"180007F0\" form=\"VX128_3\"  group=\"v\" desc=\"Vector128 Unpack D3Dtype\">\n    <in field=\"VB\" />\n    <out field=\"VD\" />\n    <!-- TODO(benvanik): arg types -->\n  </insn>\n</ppc-isa>\n</root>\n"
  },
  {
    "path": "tools/ppc-table-gen",
    "content": "#!/usr/bin/env python3 \n\n# Copyright 2015 Ben Vanik & shuffle2. All Rights Reserved.\n\n\"\"\"PPC instruction table generator.\n\nGenerates various headers/sources for looking up and handling PPC instructions.\n\nThis is based on shuffle2's PPC generator:\nhttps://gist.github.com/shuffle2/10015968\n\"\"\"\n\n__author__ = 'ben.vanik@gmail.com (Ben Vanik)'\n\nimport os\nimport sys\nfrom xml.etree.ElementTree import ElementTree, Element, SubElement, tostring, dump\n\n\ncustom_disasm = ['bcx']\n\n\nself_path = os.path.dirname(os.path.abspath(__file__))\n\n\ndef bit_extract(x, leftmost, rightmost):\n  return (x >> (32 - 1 - rightmost)) & ((1 << (rightmost - leftmost + 1)) - 1)\n\n\nextended_opcode_bits = {\n    'X': [(21, 30)],\n    'XL': [(21, 30)],\n    'XFX': [(21, 30)],\n    'XFL': [(21, 30)],\n    'VX': [(21, 31)],\n    'VX128': [(22, 25), (27, 27)],\n    'VX128_1': [(21, 27), (30, 31)],\n    'VX128_2': [(22, 22), (27, 27)],\n    'VX128_3': [(21, 27)],\n    'VX128_4': [(21, 23), (26, 27)],\n    'VX128_5': [(27, 27)],\n    'VX128_R': [(22, 24), (27, 27)],\n    'VX128_P': [(21, 22), (26, 27)],\n    'VC': [(22, 31)],\n    'VA': [(26, 31)],\n    'XO': [(22, 30)],\n    'XW': [(25, 30)],\n    'A': [(26, 30)],\n    'DS': [(30, 31)],\n    'MD': [(27, 29)],\n    'MDS': [(27, 30)],\n    'XS': [(21, 29)],\n    'DCBZ': [(6, 10), (21, 30)],  # like X\n    }\n\n\ndef opcode_primary(insn):\n  return bit_extract(insn, 0, 5)\n\n\ndef opcode_extended(insn, form):\n  if form in extended_opcode_bits:\n    parts = extended_opcode_bits[form]\n    value = 0\n    shift = 0\n    for part in parts:\n      shift = max(shift, part[1])\n    for part in parts:\n      part_value = bit_extract(insn, part[0], part[1])\n      value = value | (part_value << (shift - part[1]))\n    return value\n  else:\n    return -1\n\n\nclass Insn:\n  pass\n\n\ndef parse_insns(filename):\n  root = ElementTree(file = filename)\n  insns = []\n  # Convert to python types\n  for e in root.findall('.//insn'):\n    i = Insn()\n    i.opcode = int(e.attrib['opcode'], 16)\n    i.mnem = e.attrib['mnem']\n    i.form = e.attrib['form']\n    i.group = e.attrib['group']\n    i.desc = e.attrib['desc']\n    i.type = 'General'\n    if 'sync' in e.attrib and e.attrib['sync'] == 'true':\n      i.type = 'Sync'\n    i.op_primary = opcode_primary(i.opcode)\n    i.op_extended = opcode_extended(i.opcode, i.form)\n    i.reads = []\n    i.writes = []\n    for r in e.findall('.//in'):\n      is_conditional = 'conditional' in r.attrib and r.attrib['conditional'] == 'true'\n      i.reads.append((r.attrib['field'], is_conditional))\n    for w in e.findall('.//out'):\n      is_conditional = 'conditional' in w.attrib and w.attrib['conditional'] == 'true'\n      i.writes.append((w.attrib['field'], is_conditional))\n    i.disasm_str = None\n    for d in e.findall('.//disasm'):\n      i.disasm_str = d.text\n    insns.append(i)\n  return insns\n\n\ndef c_mnem(x):\n  return x.replace('.', 'x')\n\n\ndef c_group(x):\n  return 'k' + x[0].upper() + x[1:]\n\n\ndef c_bool(x):\n  return 'true' if x else 'false'\n\n\ndef c_field(x):\n  base_name = 'k' + x[0]\n  cond_name = 'cond' if x[1] else ''\n  return base_name + cond_name\n\n\ndef generate_opcodes(insns):\n  l = []\n  TAB = ' ' * 2\n  def w0(x): l.append(x)\n  def w1(x): w0(TAB * 1 + x)\n  def w2(x): w0(TAB * 2 + x)\n  def w3(x): w0(TAB * 3 + x)\n\n  w0('// This code was autogenerated by %s. Do not modify!' % (sys.argv[0]))\n  w0('// clang-format off')\n  w0('#ifndef XENIA_CPU_PPC_PPC_OPCODE_H_')\n  w0('#define XENIA_CPU_PPC_PPC_OPCODE_H_')\n  w0('')\n  w0('#include <cstdint>')\n  w0('#include <cstdlib>')\n  w0('')\n  w0('namespace xe {')\n  w0('namespace cpu {')\n  w0('namespace ppc {')\n  w0('')\n\n  for i in insns:\n    i.mnem = c_mnem(i.mnem)\n  insns = sorted(insns, key = lambda i: i.mnem)\n\n  w0('// All PPC opcodes in the same order they appear in ppc_opcode_table.h:')\n  w0('enum class PPCOpcode : uint32_t {')\n  for i in insns:\n    w1('%s,' % (i.mnem))\n  w1('kInvalid,')\n  w0('};')\n\n  w0('')\n  w0('}  // namespace ppc')\n  w0('}  // namespace cpu')\n  w0('}  // namespace xe')\n  w0('')\n  w0('#endif  // XENIA_CPU_PPC_PPC_OPCODE_H_')\n  w0('')\n\n  return '\\n'.join(l)\n\n\ndef generate_table(insns):\n  l = []\n  TAB = ' ' * 2\n  def w0(x): l.append(x)\n  def w1(x): w0(TAB * 1 + x)\n  def w2(x): w0(TAB * 2 + x)\n  def w3(x): w0(TAB * 3 + x)\n\n  w0('// This code was autogenerated by %s. Do not modify!' % (sys.argv[0]))\n  w0('// clang-format off')\n  w0('#include <cstdint>')\n  w0('#include <cstdlib>')\n  w0('')\n  w0('#include \"xenia/base/assert.h\"')\n  w0('#include \"xenia/cpu/ppc/ppc_opcode.h\"')\n  w0('#include \"xenia/cpu/ppc/ppc_opcode_info.h\"')\n  w0('')\n  w0('namespace xe {')\n  w0('namespace cpu {')\n  w0('namespace ppc {')\n  w0('')\n\n  for i in insns:\n    i.mnem = '\"' + c_mnem(i.mnem) + '\"'\n    i.form = c_group(i.form)\n    i.group = c_group(i.group)\n    i.type = c_group(i.type)\n\n  mnem_len = len(max(insns, key = lambda i: len(i.mnem)).mnem)\n  form_len = len(max(insns, key = lambda i: len(i.form)).form)\n  group_len = len(max(insns, key = lambda i: len(i.group)).group)\n  type_len = len(max(insns, key = lambda i: len(i.type)).type)\n\n  insns = sorted(insns, key = lambda i: i.mnem)\n\n  w0('#define INSTRUCTION(opcode, mnem, form, group, type) \\\\')\n  w0('    {PPCOpcodeGroup::group, PPCOpcodeType::type, nullptr}')\n  w0('PPCOpcodeInfo ppc_opcode_table[] = {')\n  fmt = 'INSTRUCTION(' + ', '.join([\n      '0x%08x',\n      '%-' + str(mnem_len) + 's',\n      '%-' + str(form_len) + 's',\n      '%-' + str(group_len) + 's',\n      '%-' + str(type_len) + 's',\n      ]) + '),'\n  for i in insns:\n    w1(fmt % (i.opcode, i.mnem, i.form, i.group, i.type))\n  w0('};')\n  w0('static_assert(sizeof(ppc_opcode_table) / sizeof(PPCOpcodeInfo) == static_cast<int>(PPCOpcode::kInvalid), \"PPC table mismatch - rerun ppc-table-gen\");')\n  w0('')\n  w0('const PPCOpcodeInfo& GetOpcodeInfo(PPCOpcode opcode) {')\n  w1('return ppc_opcode_table[static_cast<int>(opcode)];')\n  w0('}')\n  w0('void RegisterOpcodeEmitter(PPCOpcode opcode, InstrEmitFn fn) {')\n  w1('assert_null(ppc_opcode_table[static_cast<int>(opcode)].emit);')\n  w1('ppc_opcode_table[static_cast<int>(opcode)].emit = fn;')\n  w0('}')\n\n  w0('')\n  w0('}  // namespace ppc')\n  w0('}  // namespace cpu')\n  w0('}  // namespace xe')\n  w0('')\n\n  return '\\n'.join(l)\n\n\ndef literal_mnem(x):\n  x = x.replace('.', '_')\n  x = x.replace('\"', '')\n  return x\n\ndef generate_token_append(i, token):\n  # Rc = . iff Rc=1\n  # OE = o iff OE=1\n  if token == 'Rc':\n    return 'if (d.%s.Rc()) str->Append(\\'.\\');' % (i.o_form)\n  elif token == 'OE':\n    return 'if (d.%s.OE()) str->Append(\\'o\\');' % (i.o_form)\n  elif token == 'LK':\n    return 'if (d.%s.LK()) str->Append(\\'l\\');' % (i.o_form)\n  elif token == 'AA':\n    return 'if (d.%s.AA()) str->Append(\\'a\\');' % (i.o_form)\n  elif token in ['RA', 'RA0', 'RB', 'RC', 'RT', 'RS', 'RD']:\n    return 'str->AppendFormat(\"r{}\", d.%s.%s());' % (i.o_form, token)\n  elif token in ['FA', 'FB', 'FC', 'FT', 'FS', 'FD']:\n    return 'str->AppendFormat(\"fr{}\", d.%s.%s());' % (i.o_form, token)\n  elif token in ['VA', 'VB', 'VC', 'VT', 'VS', 'VD']:\n    return 'str->AppendFormat(\"vr{}\", d.%s.%s());' % (i.o_form, token)\n  elif token in ['CRFD', 'CRFS']:\n    return 'str->AppendFormat(\"crf{}\", d.%s.%s());' % (i.o_form, token)\n  elif token in ['CRBA', 'CRBB', 'CRBD']:\n    return 'str->AppendFormat(\"crb{}\", d.%s.%s());' % (i.o_form, token)\n  elif token in ['BO', 'BI', 'TO', 'SPR', 'TBR', 'L', 'FM', 'MB', 'ME', 'SH', 'IMM', 'z']:\n    return 'str->AppendFormat(\"{}\", d.%s.%s());' % (i.o_form, token)\n  elif token == 'UIMM':\n    return 'str->AppendFormat(\"0x{:X}\", d.%s.%s());' % (i.o_form, token)\n  elif token in ['d', 'ds', 'SIMM']:\n    return 'str->AppendFormat(d.%s.%s() < 0 ? \"-0x{:X}\" : \"0x{:X}\", std::abs(d.%s.%s()));' % (i.o_form, token, i.o_form, token)\n  elif token == 'ADDR':\n    return 'str->AppendFormat(\"0x{:X}\", d.%s.%s());' % (i.o_form, token)\n  elif token == 'LEV':\n    return 'if (d.%s.%s()) str->AppendFormat(\"{}\", d.%s.%s());' % (i.o_form, token, i.o_form, token)\n  return 'str->AppendFormat(\"(UNHANDLED %s)\");' % token\n\n\ndef generate_disasm(insns):\n  l = []\n  TAB = ' ' * 2\n  def w0(x): l.append(x)\n  def w1(x): w0(TAB * 1 + x)\n  def w2(x): w0(TAB * 2 + x)\n  def w3(x): w0(TAB * 3 + x)\n\n  w0('// This code was autogenerated by %s. Do not modify!' % (sys.argv[0]))\n  w0('// clang-format off')\n  w0('#include <cstdint>')\n  w0('#include <cstdlib>')\n  w0('')\n  w0('#include \"xenia/base/assert.h\"')\n  w0('#include \"xenia/cpu/ppc/ppc_decode_data.h\"')\n  w0('#include \"xenia/cpu/ppc/ppc_opcode.h\"')\n  w0('#include \"xenia/cpu/ppc/ppc_opcode_disasm.h\"')\n  w0('#include \"xenia/cpu/ppc/ppc_opcode_info.h\"')\n  w0('')\n  w0('namespace xe {')\n  w0('namespace cpu {')\n  w0('namespace ppc {')\n  w0('')\n\n  for i in insns:\n    i.mnem = '\"' + c_mnem(i.mnem) + '\"'\n    i.o_form = i.form\n    i.form = c_group(i.form)\n    i.desc = '\"' + i.desc + '\"'\n    i.group = c_group(i.group)\n    i.type = c_group(i.type)\n\n  mnem_len = len(max(insns, key = lambda i: len(i.mnem)).mnem)\n  form_len = len(max(insns, key = lambda i: len(i.form)).form)\n  desc_len = len(max(insns, key = lambda i: len(i.desc)).desc)\n  group_len = len(max(insns, key = lambda i: len(i.group)).group)\n  type_len = len(max(insns, key = lambda i: len(i.type)).type)\n\n  insns = sorted(insns, key = lambda i: i.mnem)\n\n  # TODO(benvanik): support alts:\n  # <disasm cond=\"![RA]\">li [RD], [SIMM]</disasm>\n  for i in insns:\n    if not i.disasm_str or literal_mnem(i.mnem) in custom_disasm:\n      continue\n    w0('void PrintDisasm_%s(const PPCDecodeData& d, StringBuffer* str) {' % (literal_mnem(i.mnem)))\n    w1('// ' + i.disasm_str)\n    w1('size_t str_start = str->length();')\n    current_str = ''\n    j = 0\n    first_space = False\n    while j < len(i.disasm_str):\n      c = i.disasm_str[j]\n      if c == '[':\n        if current_str:\n          w1('str->Append(\"%s\");' % (current_str))\n          current_str = ''\n        token = i.disasm_str[j + 1 : i.disasm_str.index(']', j)]\n        j += len(token) + 1\n        w1(generate_token_append(i, token))\n      else:\n        if c == ' ' and not first_space:\n          if current_str:\n            w1('str->Append(\"%s\");' % (current_str))\n            current_str = ''\n          w1('PadStringBuffer(str, str_start, kNamePad);')\n          first_space = True\n        else:\n          current_str += c\n      j += 1\n    if current_str:\n      w1('str->Append(\"%s\");' % (current_str))\n    if not first_space:\n      w1('PadStringBuffer(str, str_start, kNamePad);')\n    w0('}')\n\n  w0('#define INIT_LIST(...) {__VA_ARGS__}')\n  w0('#define INSTRUCTION(opcode, mnem, form, group, type, desc, reads, writes, fn) \\\\')\n  w0('    {PPCOpcodeGroup::group, PPCOpcodeFormat::form, opcode, mnem, desc, INIT_LIST reads, INIT_LIST writes, fn}')\n  w0('PPCOpcodeDisasmInfo ppc_opcode_disasm_table[] = {')\n  fmt = 'INSTRUCTION(' + ', '.join([\n      '0x%08x',\n      '%-' + str(mnem_len) + 's',\n      '%-' + str(form_len) + 's',\n      '%-' + str(group_len) + 's',\n      '%-' + str(type_len) + 's',\n      '%-' + str(desc_len) + 's',\n      '(%s)',\n      '(%s)',\n      '%s',\n      ]) + '),'\n  for i in insns:\n    w1(fmt % (\n        i.opcode,\n        i.mnem,\n        i.form,\n        i.group,\n        i.type,\n        i.desc,\n        ','.join(['PPCOpcodeField::' + c_field(r) for r in i.reads]),\n        ','.join(['PPCOpcodeField::' + c_field(w) for w in i.writes]),\n        ('PrintDisasm_' + literal_mnem(i.mnem)) if i.disasm_str else 'nullptr',\n        ))\n  w0('};')\n  w0('static_assert(sizeof(ppc_opcode_disasm_table) / sizeof(PPCOpcodeDisasmInfo) == static_cast<int>(PPCOpcode::kInvalid), \"PPC table mismatch - rerun ppc-table-gen\");')\n  w0('')\n  w0('const PPCOpcodeDisasmInfo& GetOpcodeDisasmInfo(PPCOpcode opcode) {')\n  w1('return ppc_opcode_disasm_table[static_cast<int>(opcode)];')\n  w0('}')\n  w0('void RegisterOpcodeDisasm(PPCOpcode opcode, InstrDisasmFn fn) {')\n  w1('assert_null(ppc_opcode_disasm_table[static_cast<int>(opcode)].disasm);')\n  w1('ppc_opcode_disasm_table[static_cast<int>(opcode)].disasm = fn;')\n  w0('}')\n\n  w0('')\n  w0('}  // namespace ppc')\n  w0('}  // namespace cpu')\n  w0('}  // namespace xe')\n  w0('')\n\n  return '\\n'.join(l)\n\n\ndef generate_lookup(insns):\n  l = []\n  TAB = ' ' * 2\n  def w0(x): l.append(x)\n  def w1(x): w0(TAB * 1 + x)\n  def w2(x): w0(TAB * 2 + x)\n  def w3(x): w0(TAB * 3 + x)\n\n  for i in insns:\n    i.mnem = c_mnem(i.mnem)\n\n  w0('// This code was autogenerated by %s. Do not modify!' % (sys.argv[0]))\n  w0('// clang-format off')\n  w0('#include <cstdint>')\n  w0('#include <cstdlib>')\n  w0('')\n  w0('#include \"xenia/base/assert.h\"')\n  w0('#include \"xenia/cpu/ppc/ppc_opcode.h\"')\n  w0('#include \"xenia/cpu/ppc/ppc_opcode_info.h\"')\n  w0('')\n  w0('namespace xe {')\n  w0('namespace cpu {')\n  w0('namespace ppc {')\n  w0('')\n  w0('constexpr uint32_t ExtractBits(uint32_t v, uint32_t a, uint32_t b) {')\n  w0('  return (v >> (32 - 1 - b)) & ((1 << (b - a + 1)) - 1);')\n  w0('}')\n  w0('')\n  w0('#define PPC_DECODER_MISS assert_always(); return PPCOpcode::kInvalid')\n  w0('#define PPC_DECODER_HIT(name) return PPCOpcode::name;')\n  w0('')\n  w0('PPCOpcode LookupOpcode(uint32_t code) {')\n  w1('switch (ExtractBits(code, 0, 5)) {')\n\n  subtables = {}\n  for i in sorted(insns, key = lambda i: i.op_primary):\n    if i.op_primary not in subtables: subtables[i.op_primary] = []\n    subtables[i.op_primary].append(i)\n\n  for pri in sorted(subtables.iterkeys()):\n    # all the extended encodings (which we care about) end with bit 30. So we want to\n    # do the rest of the seach by bitscanning left from bit 30. This is simulated\n    # in the C switch-statement by creating leafs for each extended opcode,\n    # sorted by bitlength shortest to longest.\n\n    if len(subtables[pri]) == 1:\n      for i in subtables[pri]:\n        # the primary opcode field fully identifies the opcode\n        w1('case %i: PPC_DECODER_HIT(%s);' % (i.op_primary, i.mnem))\n      continue\n\n    extract_groups = {}\n    for i in subtables[pri]:\n      form_parts = extended_opcode_bits[i.form]\n      shift = 0\n      for form_part in form_parts:\n        shift = max(shift, form_part[1])\n      extract_parts = []\n      for form_part in form_parts:\n        extract_parts.append('(ExtractBits(code, %s, %s) << %s)' % (form_part[0], form_part[1], shift - form_part[1]))\n      extract_expression = '|'.join(extract_parts)\n      if extract_expression not in extract_groups:\n        extract_groups[extract_expression] = (i.form, extract_expression, [])\n      extract_groups[extract_expression][2].append(i)\n\n    w1('case %i:' % (pri))\n    for extract_expression in sorted(extract_groups.iterkeys()):\n      (form, extract_expression, group_insns) = extract_groups[extract_expression]\n      bit_span_low = 31\n      bit_span_high = 0\n      form_parts = extended_opcode_bits[form]\n      for form_part in form_parts:\n        bit_span_low = min(bit_span_low, form_part[0])\n        bit_span_high = max(bit_span_high, form_part[1])\n      bit_count = bit_span_high - bit_span_low + 1\n      w2('switch (%s) {' % (extract_expression))\n      for i in sorted(group_insns, key=lambda i: i.op_extended):\n        w3('case 0b%s: PPC_DECODER_HIT(%s);' % (\n            ('{:0'+str(bit_count)+'b}').format(i.op_extended),\n            i.mnem))\n      w2('}')\n    w2('PPC_DECODER_MISS;')\n\n  w1('default: PPC_DECODER_MISS;')\n\n  w1('}')\n  w0('}')\n  w0('')\n  w0('}  // namespace ppc')\n  w0('}  // namespace cpu')\n  w0('}  // namespace xe')\n  w0('')\n\n  # from this we can see some tables have bits which can be used to determine extended opcoded size:\n  # primary opcode 31:\n  # 01... = 9 bits (XO form), else 10 bits (X/XFX forms)\n  # primary opcode 63:\n  # 1.... = 7 bits (A form), else 10 bits (X/XFL forms)\n  # primary opcode 4:\n  # does not have small bit range to determine size, but you can just use the\n  # low 7 bits in order to \"guess\" the opcode. if you assume no invalid\n  # encodings are input, only the sequence ...0001000 actually *needs* the upper\n  # bits in order to differentiate the opcode (0100001000 = ps_abs, 0010001000 = ps_nabs)\n  # otherwise, the low 7bits can be used as the determinant, and a second comparison\n  # can be used against the real length of bits to fully match the extended opcode\n  #\n  # this approach can be generalized for all primary opcodes with extended opcodes of varying lengths:\n  # compare bits of smallest length, fall through to comparing larger sizes until found or failure\n  # with the optional optimization of discarding further compares for extended opcodes which\n  # share top bits with any other extended opcode (at the price of failing to detect invalid opcodes)\n\n  return '\\n'.join(l)\n\n\nif __name__ == '__main__':\n  ppc_src_path = os.path.join(self_path, '..', 'src', 'xenia', 'cpu', 'ppc')\n  insns = parse_insns(os.path.join(self_path, 'ppc-instructions.xml'))\n  with open(os.path.join(ppc_src_path, 'ppc_opcode.h'), 'w') as f:\n    f.write(generate_opcodes(insns))\n  insns = parse_insns(os.path.join(self_path, 'ppc-instructions.xml'))\n  with open(os.path.join(ppc_src_path, 'ppc_opcode_table_gen.cc'), 'w') as f:\n    f.write(generate_table(insns))\n  insns = parse_insns(os.path.join(self_path, 'ppc-instructions.xml'))\n  with open(os.path.join(ppc_src_path, 'ppc_opcode_disasm_gen.cc'), 'w') as f:\n    f.write(generate_disasm(insns))\n  insns = parse_insns(os.path.join(self_path, 'ppc-instructions.xml'))\n  with open(os.path.join(ppc_src_path, 'ppc_opcode_lookup_gen.cc'), 'w') as f:\n    f.write(generate_lookup(insns))\n"
  },
  {
    "path": "tools/shader-playground/App.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n    <startup>\n    <supportedRuntime version=\"v2.0.50727\"/></startup>\n</configuration>\n"
  },
  {
    "path": "tools/shader-playground/Editor.Designer.cs",
    "content": "﻿namespace shader_playground {\n  partial class Editor {\n    /// <summary>\n    /// Required designer variable.\n    /// </summary>\n    private System.ComponentModel.IContainer components = null;\n\n    /// <summary>\n    /// Clean up any resources being used.\n    /// </summary>\n    /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n    protected override void Dispose(bool disposing) {\n      if (disposing && (components != null)) {\n        components.Dispose();\n      }\n      base.Dispose(disposing);\n    }\n\n    #region Windows Form Designer generated code\n\n    /// <summary>\n    /// Required method for Designer support - do not modify\n    /// the contents of this method with the code editor.\n    /// </summary>\n    private void InitializeComponent() {\n      this.wordsTextBox = new System.Windows.Forms.TextBox();\n      this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();\n      this.vertexShaderComboBox = new System.Windows.Forms.ComboBox();\n      this.compilerTranslatedTextBox = new System.Windows.Forms.TextBox();\n      this.sourceCodeTextBox = new System.Windows.Forms.TextBox();\n      this.outputTextBox = new System.Windows.Forms.TextBox();\n      this.compilerUcodeTextBox = new System.Windows.Forms.TextBox();\n      this.label1 = new System.Windows.Forms.Label();\n      this.label2 = new System.Windows.Forms.Label();\n      this.label3 = new System.Windows.Forms.Label();\n      this.translationComboBox = new System.Windows.Forms.ComboBox();\n      this.tableLayoutPanel1.SuspendLayout();\n      this.SuspendLayout();\n      // \n      // wordsTextBox\n      // \n      this.wordsTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n      this.wordsTextBox.Font = new System.Drawing.Font(\"Consolas\", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\n      this.wordsTextBox.Location = new System.Drawing.Point(12, 657);\n      this.wordsTextBox.Multiline = true;\n      this.wordsTextBox.Name = \"wordsTextBox\";\n      this.wordsTextBox.ReadOnly = true;\n      this.wordsTextBox.Size = new System.Drawing.Size(1631, 137);\n      this.wordsTextBox.TabIndex = 11;\n      // \n      // tableLayoutPanel1\n      // \n      this.tableLayoutPanel1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \n            | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n      this.tableLayoutPanel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\n      this.tableLayoutPanel1.ColumnCount = 4;\n      this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F));\n      this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F));\n      this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F));\n      this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F));\n      this.tableLayoutPanel1.Controls.Add(this.vertexShaderComboBox, 3, 1);\n      this.tableLayoutPanel1.Controls.Add(this.compilerTranslatedTextBox, 3, 2);\n      this.tableLayoutPanel1.Controls.Add(this.sourceCodeTextBox, 0, 1);\n      this.tableLayoutPanel1.Controls.Add(this.outputTextBox, 1, 1);\n      this.tableLayoutPanel1.Controls.Add(this.compilerUcodeTextBox, 2, 1);\n      this.tableLayoutPanel1.Controls.Add(this.label1, 0, 0);\n      this.tableLayoutPanel1.Controls.Add(this.label2, 1, 0);\n      this.tableLayoutPanel1.Controls.Add(this.label3, 2, 0);\n      this.tableLayoutPanel1.Controls.Add(this.translationComboBox, 3, 0);\n      this.tableLayoutPanel1.Location = new System.Drawing.Point(12, 12);\n      this.tableLayoutPanel1.Name = \"tableLayoutPanel1\";\n      this.tableLayoutPanel1.RowCount = 3;\n      this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\n      this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\n      this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));\n      this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));\n      this.tableLayoutPanel1.Size = new System.Drawing.Size(1631, 639);\n      this.tableLayoutPanel1.TabIndex = 1;\n      // \n      // vertexShaderComboBox\n      // \n      this.vertexShaderComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n      this.vertexShaderComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n      this.vertexShaderComboBox.FormattingEnabled = true;\n      this.vertexShaderComboBox.Items.AddRange(new object[] {\n            \"VS to VS\",\n            \"VS to line DS with control point indices\",\n            \"VS to line DS with patch index\",\n            \"VS to triangle DS with control point indices\",\n            \"VS to triangle DS with patch index\",\n            \"VS to quad DS with control point indices\",\n            \"VS to quad DS with patch index\"});\n      this.vertexShaderComboBox.Location = new System.Drawing.Point(1224, 24);\n      this.vertexShaderComboBox.Margin = new System.Windows.Forms.Padding(3, 3, 3, 0);\n      this.vertexShaderComboBox.Name = \"vertexShaderComboBox\";\n      this.vertexShaderComboBox.Size = new System.Drawing.Size(404, 21);\n      this.vertexShaderComboBox.TabIndex = 7;\n      // \n      // compilerTranslatedTextBox\n      // \n      this.compilerTranslatedTextBox.AcceptsReturn = true;\n      this.compilerTranslatedTextBox.AcceptsTab = true;\n      this.compilerTranslatedTextBox.Dock = System.Windows.Forms.DockStyle.Fill;\n      this.compilerTranslatedTextBox.Font = new System.Drawing.Font(\"Consolas\", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\n      this.compilerTranslatedTextBox.Location = new System.Drawing.Point(1224, 48);\n      this.compilerTranslatedTextBox.Multiline = true;\n      this.compilerTranslatedTextBox.Name = \"compilerTranslatedTextBox\";\n      this.compilerTranslatedTextBox.ReadOnly = true;\n      this.compilerTranslatedTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;\n      this.compilerTranslatedTextBox.Size = new System.Drawing.Size(404, 588);\n      this.compilerTranslatedTextBox.TabIndex = 10;\n      // \n      // sourceCodeTextBox\n      // \n      this.sourceCodeTextBox.AcceptsReturn = true;\n      this.sourceCodeTextBox.AcceptsTab = true;\n      this.sourceCodeTextBox.Dock = System.Windows.Forms.DockStyle.Fill;\n      this.sourceCodeTextBox.Font = new System.Drawing.Font(\"Consolas\", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\n      this.sourceCodeTextBox.Location = new System.Drawing.Point(3, 24);\n      this.sourceCodeTextBox.Multiline = true;\n      this.sourceCodeTextBox.Name = \"sourceCodeTextBox\";\n      this.tableLayoutPanel1.SetRowSpan(this.sourceCodeTextBox, 2);\n      this.sourceCodeTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;\n      this.sourceCodeTextBox.Size = new System.Drawing.Size(401, 612);\n      this.sourceCodeTextBox.TabIndex = 5;\n      // \n      // outputTextBox\n      // \n      this.outputTextBox.AcceptsReturn = true;\n      this.outputTextBox.AcceptsTab = true;\n      this.outputTextBox.Dock = System.Windows.Forms.DockStyle.Fill;\n      this.outputTextBox.Font = new System.Drawing.Font(\"Consolas\", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\n      this.outputTextBox.Location = new System.Drawing.Point(410, 24);\n      this.outputTextBox.Multiline = true;\n      this.outputTextBox.Name = \"outputTextBox\";\n      this.outputTextBox.ReadOnly = true;\n      this.tableLayoutPanel1.SetRowSpan(this.outputTextBox, 2);\n      this.outputTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;\n      this.outputTextBox.Size = new System.Drawing.Size(401, 612);\n      this.outputTextBox.TabIndex = 8;\n      // \n      // compilerUcodeTextBox\n      // \n      this.compilerUcodeTextBox.AcceptsReturn = true;\n      this.compilerUcodeTextBox.AcceptsTab = true;\n      this.compilerUcodeTextBox.Dock = System.Windows.Forms.DockStyle.Fill;\n      this.compilerUcodeTextBox.Font = new System.Drawing.Font(\"Consolas\", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\n      this.compilerUcodeTextBox.Location = new System.Drawing.Point(817, 24);\n      this.compilerUcodeTextBox.Multiline = true;\n      this.compilerUcodeTextBox.Name = \"compilerUcodeTextBox\";\n      this.compilerUcodeTextBox.ReadOnly = true;\n      this.tableLayoutPanel1.SetRowSpan(this.compilerUcodeTextBox, 2);\n      this.compilerUcodeTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;\n      this.compilerUcodeTextBox.Size = new System.Drawing.Size(401, 612);\n      this.compilerUcodeTextBox.TabIndex = 9;\n      // \n      // label1\n      // \n      this.label1.AutoSize = true;\n      this.label1.Location = new System.Drawing.Point(3, 0);\n      this.label1.Name = \"label1\";\n      this.label1.Size = new System.Drawing.Size(78, 13);\n      this.label1.TabIndex = 2;\n      this.label1.Text = \"Input Assembly\";\n      // \n      // label2\n      // \n      this.label2.AutoSize = true;\n      this.label2.Location = new System.Drawing.Point(410, 0);\n      this.label2.Name = \"label2\";\n      this.label2.Size = new System.Drawing.Size(107, 13);\n      this.label2.TabIndex = 3;\n      this.label2.Text = \"XNA Compiler Output\";\n      // \n      // label3\n      // \n      this.label3.AutoSize = true;\n      this.label3.Location = new System.Drawing.Point(817, 0);\n      this.label3.Name = \"label3\";\n      this.label3.Size = new System.Drawing.Size(191, 13);\n      this.label3.TabIndex = 4;\n      this.label3.Text = \"xenia-gpu-shader-compiler Disassembly\";\n      // \n      // translationComboBox\n      // \n      this.translationComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) \n            | System.Windows.Forms.AnchorStyles.Right)));\n      this.translationComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n      this.translationComboBox.FormattingEnabled = true;\n      this.translationComboBox.Items.AddRange(new object[] {\n            \"DXBC (render target RB)\",\n            \"DXBC (rasterizer-ordered view RB)\",\n            \"SPIR-V (framebuffer RB)\",\n            \"SPIR-V (fragment shader interlock RB)\"});\n      this.translationComboBox.Location = new System.Drawing.Point(1224, 0);\n      this.translationComboBox.Margin = new System.Windows.Forms.Padding(3, 0, 3, 0);\n      this.translationComboBox.Name = \"translationComboBox\";\n      this.translationComboBox.Size = new System.Drawing.Size(404, 21);\n      this.translationComboBox.TabIndex = 6;\n      // \n      // Editor\n      // \n      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\n      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n      this.ClientSize = new System.Drawing.Size(1655, 806);\n      this.Controls.Add(this.tableLayoutPanel1);\n      this.Controls.Add(this.wordsTextBox);\n      this.Name = \"Editor\";\n      this.Text = \"Shader Playground\";\n      this.tableLayoutPanel1.ResumeLayout(false);\n      this.tableLayoutPanel1.PerformLayout();\n      this.ResumeLayout(false);\n      this.PerformLayout();\n\n    }\n\n    #endregion\n    private System.Windows.Forms.TextBox wordsTextBox;\n    private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;\n    private System.Windows.Forms.TextBox sourceCodeTextBox;\n    private System.Windows.Forms.TextBox outputTextBox;\n    private System.Windows.Forms.TextBox compilerUcodeTextBox;\n    private System.Windows.Forms.Label label1;\n    private System.Windows.Forms.Label label2;\n    private System.Windows.Forms.Label label3;\n    private System.Windows.Forms.TextBox compilerTranslatedTextBox;\n    private System.Windows.Forms.ComboBox translationComboBox;\n    private System.Windows.Forms.ComboBox vertexShaderComboBox;\n  }\n}\n\n"
  },
  {
    "path": "tools/shader-playground/Editor.cs",
    "content": "﻿using Microsoft.Xna.Framework.Graphics;\nusing System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Diagnostics;\nusing System.Drawing;\nusing System.IO;\nusing System.Runtime.InteropServices;\nusing System.Text;\nusing System.Windows.Forms;\n\nnamespace shader_playground {\n  public partial class Editor : Form {\n    string compilerPath_ = @\"..\\..\\..\\..\\..\\build\\bin\\Windows\\Debug\\xenia-gpu-shader-compiler.exe\";\n\n    FileSystemWatcher compilerWatcher_;\n    bool pendingTimer_ = false;\n\n    public Editor() {\n      InitializeComponent();\n\n      var scrollUpdateTimer = new Timer();\n      scrollUpdateTimer.Interval = 200;\n      scrollUpdateTimer.Tick += (object sender, EventArgs e) => {\n        UpdateScrollStates();\n      };\n      scrollUpdateTimer.Start();\n\n      var compilerBinPath = Path.Combine(Directory.GetCurrentDirectory(),\n                                         Path.GetDirectoryName(compilerPath_));\n      compilerWatcher_ = new FileSystemWatcher(compilerBinPath, \"*.exe\");\n      compilerWatcher_.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.Size;\n      compilerWatcher_.Changed += (object sender, FileSystemEventArgs e) => {\n        if (e.Name == Path.GetFileName(compilerPath_)) {\n          Invoke((MethodInvoker)delegate {\n            if (pendingTimer_) {\n              return;\n            }\n            pendingTimer_ = true;\n            var timer = new Timer();\n            timer.Interval = 1000;\n            timer.Tick += (object sender1, EventArgs e1) => {\n              pendingTimer_ = false;\n              timer.Dispose();\n              Process(sourceCodeTextBox.Text);\n            };\n            timer.Start();\n          });\n        }\n      };\n      compilerWatcher_.EnableRaisingEvents = true;\n\n      wordsTextBox.Click += (object sender, EventArgs e) => {\n        wordsTextBox.SelectAll();\n        wordsTextBox.Copy();\n      };\n\n      sourceCodeTextBox.Click += (object sender, EventArgs e) => {\n        Process(sourceCodeTextBox.Text);\n      };\n      sourceCodeTextBox.TextChanged += (object sender, EventArgs e) => {\n        Process(sourceCodeTextBox.Text);\n      };\n\n      translationComboBox.SelectedIndex = 0;\n      translationComboBox.SelectedIndexChanged += (object sender, EventArgs e) => {\n        Process(sourceCodeTextBox.Text);\n      };\n      vertexShaderComboBox.SelectedIndex = 0;\n      vertexShaderComboBox.SelectedIndexChanged += (object sender, EventArgs e) => {\n        Process(sourceCodeTextBox.Text);\n      };\n\n    sourceCodeTextBox.Text = string.Join(\n        Environment.NewLine, new string[] {\n\"xps_3_0\",\n\"dcl_texcoord1 r0\",\n\"dcl_color r1.xy\",\n\"exec\",\n\"alloc colors\",\n\"exec\",\n\"tfetch1D r2, r0.y, tf0, FetchValidOnly=false\",\n\"tfetch1D r2, r0.x, tf2\",\n\"tfetch2D r3, r3.wx, tf13\",\n\"tfetch2D r[aL+3], r[aL+5].wx, tf13, FetchValidOnly=false, UnnormalizedTextureCoords=true, MagFilter=linear, MinFilter=linear, MipFilter=point, AnisoFilter=max1to1, UseRegisterGradients=true, UseComputedLOD=false, UseRegisterLOD=true, OffsetX=-1.5, OffsetY=1.0\",\n\"tfetch3D r31.w_01, r0.xyw, tf15\",\n\"tfetchCube r5, r1.xyw, tf31\",\n\"        setTexLOD r1.z\",\n\"        setGradientH r1.zyx\",\n\"(!p0)        setGradientV r1.zyx\",\n\"        getGradients r5, r1.xy, tf3\",\n\"        mad oC0, r0, r1.yyyy, c0\",\n\"        mad oC0._, r0, r1.yyyy, c0\",\n\"        mad oC0.x1_, r0, r1.yyyy, c0\",\n\"        mad oC0.x10w, r0, r1.yyyy, c0\",\n\"        mul r4.xyz, r1.xyzz, c5.xyzz\",\n\"        mul r4.xyz, r1.xyzz, c[0 + aL].xyzz\",\n\"        mul r4.xyz, r1.xyzz, c[6 + aL].xyzz\",\n\"        mul r4.xyz, r1.xyzz, c[0 + a0].xyzz\",\n\"        mul r4.xyz, r1.xyzz, c[8 + a0].xyzz\",\n\"      + adds r5.w, r0.xz\",\n\"        cos r6.w, r0.x\",\n\"        adds r5.w, r0.zx\",\n\"        mul r4.xyz, r[aL+1].xyzz, c[8 + a0].xyzz\",\n\"        adds r5.w, r[aL+0].zx\",\n\"        jmp l5\",\n\"ccall b1, l5\",\n\"nop\",\n\"        label l5\",\n\"(!p0)        exec\",\n\"cexec b5, Yield=true\",\n\"cexec !b6\",\n\"        mulsc r3.w, c1.z, r1.w\",\n\"loop i7, L4\",\n\"   label L3\",\n\"   exec\",\n\"   setp_eq r15, c[aL].w\",\n\"   (!p0) add r0, r0, c[aL]\",\n\"(p0) endloop i7, L3\",\n\"label L4\",\n\"exece\",\n\"        mulsc r3.w, c3.z, r6.x\",\n\"        mulsc r3.w, c200.z, r31.x\",\n\"        mov oDepth.x, c3.w\",\n\"        cnop\",\n        });\n    }\n\n    class NopIncludeHandler : CompilerIncludeHandler {\n      public override Stream Open(CompilerIncludeHandlerType includeType,\n                             string filename) {\n        throw new NotImplementedException();\n      }\n    }\n\n    void Process(string shaderSourceCode) {\n      if (shaderSourceCode.IndexOf(\"xvs_3_0\") != -1 || shaderSourceCode.IndexOf(\"xps_3_0\") != -1) {\n        shaderSourceCode += \"\\ncnop\";\n        shaderSourceCode += \"\\ncnop\";\n      }\n      var preprocessorDefines = new CompilerMacro[2];\n      preprocessorDefines[0].Name = \"XBOX\";\n      preprocessorDefines[1].Name = \"XBOX360\";\n      var includeHandler = new NopIncludeHandler();\n      var options = CompilerOptions.None;\n      var compiledShader = ShaderCompiler.AssembleFromSource(\n          shaderSourceCode, preprocessorDefines, includeHandler, options,\n          Microsoft.Xna.Framework.TargetPlatform.Xbox360);\n\n      var disassembledSourceCode = compiledShader.ErrorsAndWarnings;\n      disassembledSourceCode = disassembledSourceCode.Replace(\"\\n\", Environment.NewLine);\n      if (disassembledSourceCode.IndexOf(\"// PDB hint 00000000-00000000-00000000\") == -1) {\n        UpdateTextBox(outputTextBox, disassembledSourceCode, false);\n        UpdateTextBox(compilerUcodeTextBox, \"\", false);\n        UpdateTextBox(wordsTextBox, \"\", false);\n        return;\n      }\n      var prefix = disassembledSourceCode.Substring(\n          0, disassembledSourceCode.IndexOf(\n                 ':', disassembledSourceCode.IndexOf(':') + 1));\n      disassembledSourceCode =\n          disassembledSourceCode.Replace(prefix + \": \", \"\");\n      disassembledSourceCode = disassembledSourceCode.Replace(\n          \"// PDB hint 00000000-00000000-00000000\" + Environment.NewLine, \"\");\n      var firstLine = disassembledSourceCode.IndexOf(\"//\");\n      var warnings = \"// \" +\n                     disassembledSourceCode.Substring(0, firstLine)\n                         .Replace(Environment.NewLine, Environment.NewLine + \"// \");\n      disassembledSourceCode =\n          warnings + disassembledSourceCode.Substring(firstLine + 3);\n      disassembledSourceCode = disassembledSourceCode.Trim();\n      UpdateTextBox(outputTextBox, disassembledSourceCode, true);\n\n      string shaderType =\n          shaderSourceCode.IndexOf(\"vs_\") == -1 ? \"ps\" : \"vs\";\n      var ucodeWords = ExtractAndDumpWords(shaderType, compiledShader.GetShaderCode());\n      if (ucodeWords != null) {\n        TryCompiler(shaderType, ucodeWords);\n      } else {\n        UpdateTextBox(compilerUcodeTextBox, \"\", false);\n      }\n\n      if (compilerUcodeTextBox.Text.Length > 0) {\n        var sourcePrefix = disassembledSourceCode.Substring(0, disassembledSourceCode.IndexOf(\"/*\"));\n        TryRoundTrip(sourcePrefix, compilerUcodeTextBox.Text, compiledShader.GetShaderCode());\n      }\n    }\n\n    void TryCompiler(string shaderType, uint[] ucodeWords) {\n      string ucodePath = Path.Combine(Path.GetTempPath(), \"shader_playground_ucode.bin.\" + shaderType);\n      string ucodeDisasmPath = Path.Combine(Path.GetTempPath(), \"shader_playground_disasm.ucode.txt\");\n      string translatedDisasmPath = Path.Combine(Path.GetTempPath(), \"shader_playground_disasm.translated.txt\");\n      if (File.Exists(ucodePath)) {\n        File.Delete(ucodePath);\n      }\n      if (File.Exists(ucodeDisasmPath)) {\n        File.Delete(ucodeDisasmPath);\n      }\n      if (File.Exists(translatedDisasmPath)) {\n        File.Delete(translatedDisasmPath);\n      }\n\n      byte[] ucodeBytes = new byte[ucodeWords.Length * 4];\n      Buffer.BlockCopy(ucodeWords, 0, ucodeBytes, 0, ucodeWords.Length * 4);\n      File.WriteAllBytes(ucodePath, ucodeBytes);\n\n      if (!File.Exists(compilerPath_)) {\n        UpdateTextBox(compilerUcodeTextBox, \"Compiler not found: \" + compilerPath_, false);\n        return;\n      }\n\n      var startInfo = new ProcessStartInfo(compilerPath_);\n      startInfo.Arguments = string.Join(\" \", new string[]{\n        \"--shader_input=\" + ucodePath,\n        \"--shader_input_type=\" + shaderType,\n        \"--shader_output=\" + ucodeDisasmPath,\n        \"--shader_output_type=ucode\",\n      });\n      startInfo.WindowStyle = ProcessWindowStyle.Hidden;\n      startInfo.CreateNoWindow = true;\n      try {\n        using (var process = System.Diagnostics.Process.Start(startInfo)) {\n          process.WaitForExit();\n        }\n        string disasmText = File.ReadAllText(ucodeDisasmPath);\n        UpdateTextBox(compilerUcodeTextBox, disasmText.Replace(\"\\n\", Environment.NewLine), true);\n      } catch {\n        UpdateTextBox(compilerUcodeTextBox, \"COMPILER FAILURE\", false);\n      }\n\n      string outputType = \"ucode\";\n      switch (translationComboBox.SelectedIndex) {\n        case 0:\n        case 1:\n          outputType = \"dxbctext\";\n          break;\n        case 2:\n        case 3:\n          outputType = \"spirvtext\";\n          break;\n      }\n\n      string vertexShaderType = \"vertex\";\n      switch (vertexShaderComboBox.SelectedIndex) {\n        case 1:\n          vertexShaderType = \"linedomaincp\";\n          break;\n        case 2:\n          vertexShaderType = \"linedomainpatch\";\n          break;\n        case 3:\n          vertexShaderType = \"triangledomaincp\";\n          break;\n        case 4:\n          vertexShaderType = \"triangledomainpatch\";\n          break;\n        case 5:\n          vertexShaderType = \"quaddomaincp\";\n          break;\n        case 6:\n          vertexShaderType = \"quaddomainpatch\";\n          break;\n      }\n\n      List<string> startArguments = new List<string>{\n        \"--shader_input=\" + ucodePath,\n        \"--shader_input_type=\" + shaderType,\n        \"--shader_output=\" + translatedDisasmPath,\n        \"--shader_output_type=\" + outputType,\n        \"--vertex_shader_output_type=\" + vertexShaderType,\n        \"--dxbc_source_map=true\",\n      };\n      if (translationComboBox.SelectedIndex == 1 ||\n          translationComboBox.SelectedIndex == 3) {\n        startArguments.Add(\"--shader_output_pixel_shader_interlock=true\");\n      }\n\n      startInfo = new ProcessStartInfo(compilerPath_);\n      startInfo.Arguments = string.Join(\" \", startArguments.ToArray());\n      startInfo.WindowStyle = ProcessWindowStyle.Hidden;\n      startInfo.CreateNoWindow = true;\n      try {\n        using (var process = System.Diagnostics.Process.Start(startInfo)) {\n          process.WaitForExit();\n        }\n        string disasmText = File.ReadAllText(translatedDisasmPath);\n        UpdateTextBox(compilerTranslatedTextBox, disasmText.Replace(\"\\n\", Environment.NewLine), true);\n      } catch {\n        UpdateTextBox(compilerTranslatedTextBox, \"COMPILER FAILURE\", false);\n      }\n    }\n\n    void TryRoundTrip(string sourcePrefix, string compilerSource, byte[] expectedBytes) {\n      var shaderSourceCode = sourcePrefix + compilerSource;\n      var preprocessorDefines = new CompilerMacro[2];\n      preprocessorDefines[0].Name = \"XBOX\";\n      preprocessorDefines[1].Name = \"XBOX360\";\n      var includeHandler = new NopIncludeHandler();\n      var options = CompilerOptions.None;\n      var compiledShader = ShaderCompiler.AssembleFromSource(\n          shaderSourceCode, preprocessorDefines, includeHandler, options,\n          Microsoft.Xna.Framework.TargetPlatform.Xbox360);\n      var compiledBytes = compiledShader.GetShaderCode();\n      if (compiledBytes == null ||\n          compiledBytes.Length != expectedBytes.Length ||\n          !MemCmp(compiledBytes, expectedBytes)) {\n        compilerUcodeTextBox.BackColor = System.Drawing.Color.Red;\n      } else {\n        compilerUcodeTextBox.BackColor = System.Drawing.SystemColors.Control;\n      }\n    }\n\n    void UpdateScrollStates() {\n      foreach (var handle in scrollPreserve_.Keys) {\n        if (scrollPreserve_[handle]) {\n          var scrollInfo = new ScrollInfo();\n          scrollInfo.cbSize = Marshal.SizeOf(scrollInfo);\n          scrollInfo.fMask = (uint)ScrollInfoMask.SIF_TRACKPOS;\n          bool hasScrollInfo = GetScrollInfo(handle, SB_VERT, ref scrollInfo);\n          scrollPositions_[handle] = scrollInfo.nTrackPos;\n        }\n      }\n    }\n\n    Dictionary<IntPtr, bool> scrollPreserve_ = new Dictionary<IntPtr, bool>();\n    Dictionary<IntPtr, int> scrollPositions_ = new Dictionary<IntPtr, int>();\n    void UpdateTextBox(TextBox textBox, string value, bool preserveScroll) {\n      scrollPreserve_[textBox.Handle] = preserveScroll;\n\n      textBox.Text = value;\n\n      int previousScroll;\n      if (!scrollPositions_.TryGetValue(textBox.Handle, out previousScroll)) {\n        previousScroll = 0;\n      }\n      var scrollInfo = new ScrollInfo();\n      scrollInfo.cbSize = Marshal.SizeOf(scrollInfo);\n      scrollInfo.fMask = (uint)ScrollInfoMask.SIF_TRACKPOS;\n      scrollInfo.nTrackPos = previousScroll;\n      SetScrollInfo(textBox.Handle, SB_VERT, ref scrollInfo, 1);\n\n      var ptrWparam = new IntPtr(SB_THUMBPOSITION | previousScroll << 16);\n      SendMessage(textBox.Handle, WM_VSCROLL, ptrWparam, IntPtr.Zero);\n    }\n\n    private const int SB_VERT = 1;\n    private const uint SB_THUMBPOSITION = 4;\n    private const uint WM_VSCROLL = 0x115;\n    public enum ScrollInfoMask : uint {\n      SIF_RANGE = 0x1,\n      SIF_PAGE = 0x2,\n      SIF_POS = 0x4,\n      SIF_DISABLENOSCROLL = 0x8,\n      SIF_TRACKPOS = 0x10,\n      SIF_ALL = (SIF_RANGE | SIF_PAGE | SIF_POS | SIF_TRACKPOS),\n    }\n    private struct ScrollInfo {\n      public int cbSize;\n      public uint fMask;\n      public int nMin;\n      public int nMax;\n      public int nPage;\n      public int nPos;\n      public int nTrackPos;\n    }\n    [DllImport(\"user32.dll\", SetLastError = true)]\n    private static extern bool GetScrollInfo(IntPtr hwnd, int bar, ref ScrollInfo scrollInfo);\n    [DllImport(\"user32.dll\", SetLastError = true)]\n    private static extern bool SetScrollInfo(IntPtr hwnd, int bar, ref ScrollInfo scrollInfo, int redraw);\n    [DllImport(\"user32.dll\", CharSet = CharSet.Auto)]\n    static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);\n\n    bool MemCmp(byte[] a1, byte[] b1) {\n      if (a1 == null || b1 == null) {\n        return false;\n      }\n      int length = a1.Length;\n      if (b1.Length != length) {\n        return false;\n      }\n      while (length > 0) {\n        length--;\n        if (a1[length] != b1[length]) {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    uint[] ExtractAndDumpWords(string shaderType, byte[] shaderCode) {\n      if (shaderCode == null || shaderCode.Length == 0) {\n        UpdateTextBox(wordsTextBox, \"\", false);\n        return null;\n      }\n\n      // Find shader code.\n      int byteOffset = (shaderCode[4] << 24) | (shaderCode[5] << 16) |\n                       (shaderCode[6] << 8) | (shaderCode[7] << 0);\n      int wordOffset = byteOffset / 4;\n\n      uint[] shaderDwords = new uint[(shaderCode.Length - wordOffset) / sizeof(uint)];\n      Buffer.BlockCopy(shaderCode, wordOffset * 4, shaderDwords, 0, shaderCode.Length - wordOffset * 4);\n\n      var sb = new StringBuilder();\n      sb.Append(\"const uint32_t shader_dwords[] = {\");\n      for (int i = 0; i < shaderDwords.Length; ++i) {\n        sb.AppendFormat(\"0x{0:X8}, \", SwapByte(shaderDwords[i]));\n      }\n      sb.Append(\"};\" + Environment.NewLine);\n      sb.Append(\"shader_type = ShaderType::\" + (shaderType == \"vs\" ? \"kVertex\" : \"kPixel\") + \";\" + Environment.NewLine);\n      UpdateTextBox(wordsTextBox, sb.ToString(), true);\n      wordsTextBox.SelectAll();\n\n      return shaderDwords;\n    }\n\n    uint SwapByte(uint x) {\n      return ((x & 0x000000ff) << 24) +\n             ((x & 0x0000ff00) << 8) +\n             ((x & 0x00ff0000) >> 8) +\n             ((x & 0xff000000) >> 24);\n    }\n  }\n}\n"
  },
  {
    "path": "tools/shader-playground/Editor.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "tools/shader-playground/Program.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Reflection;\nusing System.Runtime.InteropServices;\nusing System.Windows.Forms;\n\n// General Information about an assembly is controlled through the following\n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"shader-playground\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"shader-playground\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible\n// to COM components.  If you need to access a type in this assembly from\n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"05d27ad4-ef23-4fa1-ad5a-7cfd587fd093\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version\n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers\n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n\nnamespace shader_playground {\n  static class Program {\n    [STAThread]\n    static void Main() {\n      Application.EnableVisualStyles();\n      Application.SetCompatibleTextRenderingDefault(false);\n      Application.Run(new Editor());\n    }\n  }\n}\n"
  },
  {
    "path": "tools/shader-playground/README.md",
    "content": "This requires XNA Game Studio 3.1 to be installed (not just the redist):\nhttps://www.microsoft.com/en-us/download/details.aspx?id=39\n\nIt's not really compatible with modern VS', but you can open the downloaded\n`XNAGS31_setup.exe` with 7zip and run the included `redists.msi` directly.\n\nIf installed correctly you should have this file:\n`C:\\Program Files (x86)\\Microsoft XNA\\XNA Game Studio\\v3.1\\References\\Windows\\x86\\Microsoft.Xna.Framework.dll`\n\nXNA is only compatible with 32-bit x86 .NET, so ensure Visual Studio is set to\ntarget that (not `Any CPU`).\n"
  },
  {
    "path": "tools/shader-playground/shader-playground.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\r\n  <PropertyGroup>\r\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\r\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\r\n    <ProjectGuid>{05D27AD4-EF23-4FA1-AD5A-7CFD587FD093}</ProjectGuid>\r\n    <OutputType>WinExe</OutputType>\r\n    <AppDesignerFolder>Properties</AppDesignerFolder>\r\n    <RootNamespace>shader_playground</RootNamespace>\r\n    <AssemblyName>shader-playground</AssemblyName>\r\n    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>\r\n    <FileAlignment>512</FileAlignment>\r\n    <TargetFrameworkProfile />\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|x86'\">\r\n    <DebugSymbols>true</DebugSymbols>\r\n    <OutputPath>bin\\x86\\Debug\\</OutputPath>\r\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\r\n    <DebugType>full</DebugType>\r\n    <PlatformTarget>x86</PlatformTarget>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\r\n    <Prefer32Bit>true</Prefer32Bit>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|x86'\">\r\n    <OutputPath>bin\\x86\\Release\\</OutputPath>\r\n    <DefineConstants>TRACE</DefineConstants>\r\n    <Optimize>true</Optimize>\r\n    <DebugType>pdbonly</DebugType>\r\n    <PlatformTarget>x86</PlatformTarget>\r\n    <ErrorReport>prompt</ErrorReport>\r\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\r\n    <Prefer32Bit>true</Prefer32Bit>\r\n  </PropertyGroup>\r\n  <ItemGroup>\r\n    <Reference Include=\"Microsoft.Xna.Framework, Version=3.1.0.0, Culture=neutral, PublicKeyToken=6d5c3888ef60e27d, processorArchitecture=x86\" />\r\n    <Reference Include=\"System\" />\r\n    <Reference Include=\"System.Drawing\" />\r\n    <Reference Include=\"System.Windows.Forms\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Compile Include=\"Editor.cs\">\r\n      <SubType>Form</SubType>\r\n    </Compile>\r\n    <Compile Include=\"Editor.Designer.cs\">\r\n      <DependentUpon>Editor.cs</DependentUpon>\r\n    </Compile>\r\n    <Compile Include=\"Program.cs\" />\r\n    <EmbeddedResource Include=\"Editor.resx\">\r\n      <DependentUpon>Editor.cs</DependentUpon>\r\n    </EmbeddedResource>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"App.config\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Folder Include=\"Properties\\\" />\r\n  </ItemGroup>\r\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\r\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \r\n       Other similar extension points exist, see Microsoft.Common.targets.\r\n  <Target Name=\"BeforeBuild\">\r\n  </Target>\r\n  <Target Name=\"AfterBuild\">\r\n  </Target>\r\n  -->\r\n</Project>"
  },
  {
    "path": "tools/shader-playground/shader-playground.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 12.00\r\n# Visual Studio 14\r\nVisualStudioVersion = 14.0.23107.0\r\nMinimumVisualStudioVersion = 10.0.40219.1\r\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"shader-playground\", \"shader-playground.csproj\", \"{05D27AD4-EF23-4FA1-AD5A-7CFD587FD093}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|x86 = Debug|x86\r\n\t\tRelease|x86 = Release|x86\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{05D27AD4-EF23-4FA1-AD5A-7CFD587FD093}.Debug|x86.ActiveCfg = Debug|x86\r\n\t\t{05D27AD4-EF23-4FA1-AD5A-7CFD587FD093}.Debug|x86.Build.0 = Debug|x86\r\n\t\t{05D27AD4-EF23-4FA1-AD5A-7CFD587FD093}.Release|x86.ActiveCfg = Release|x86\r\n\t\t{05D27AD4-EF23-4FA1-AD5A-7CFD587FD093}.Release|x86.Build.0 = Release|x86\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "tools/vswhere/LICENSE.txt",
    "content": "The MIT License (MIT) \nCopyright (C) Microsoft Corporation. All rights reserved.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE."
  },
  {
    "path": "tools/xenosci/local_runner.py",
    "content": "#!/usr/bin/env python3\n# Copyright 2017 Justin Moore. All Rights Reserved.\nimport argparse\nimport glob\nimport itertools\nfrom multiprocessing.dummy import Pool\nimport os\nimport time\nimport subprocess\nimport sys\n\n\ndef parallel_arg_type(value):\n    ivalue = int(value)\n    if ivalue < 1:\n        raise argparse.ArgumentError(\n            \"%s is an invalid number of processes (>= 1)\" % ivalue)\n\n    return ivalue\n\n\ndef file_type(value):\n    if not os.path.isfile(value):\n        raise argparse.ArgumentError(\"%s is an invalid filename\" % value)\n\n    return value\n\n\ndef run_dumper(exe_path, input_name):\n    start_time = time.perf_counter()\n\n    p = subprocess.Popen([\n        exe_path,\n        input_name,\n        '--log_file=stdout',\n    ], stdout=subprocess.PIPE, stderr=subprocess.PIPE)\n    p.wait()\n    elapsed_time = time.perf_counter() - start_time\n    print(\"%.3f seconds, code %2d (%s)\" %\n            (elapsed_time, p.returncode, input_name))\n\n\ndef main(argv):\n    parser = argparse.ArgumentParser()\n    parser.add_argument(\n        'exepath', help='path to the trace dump executable', type=file_type)\n    parser.add_argument('files', nargs='*')\n    parser.add_argument('-j', type=parallel_arg_type,\n                        help='number of parallel processes', default=1)\n    args = parser.parse_args(argv[1:])\n    exepath = args.exepath\n\n    files = []\n    for wildcard in args.files:\n        files.extend(glob.glob(wildcard))\n\n    if len(files) == 0:\n        print(\"No input files found!\")\n        return 1\n\n    # Test the executable first.\n    valid = False\n    try:\n        p = subprocess.Popen([\n            exepath,\n            '--log_file=stdout',\n        ], stdout=subprocess.PIPE, stderr=subprocess.PIPE)\n        p.wait()\n        if p.returncode == 5:\n            # code 5 = invalid trace file / trace file unspecified\n            valid = True\n    except OSError:\n        pass\n\n    if not valid:\n        print(\"Trace executable invalid!\")\n        return 1\n\n    print(\"Processing...\")\n    pool = Pool(args.j)\n\n    start_time = time.perf_counter()\n    results = pool.starmap(run_dumper, zip(itertools.repeat(exepath), files))\n    pool.close()\n    pool.join()\n\n    elapsed_time = time.perf_counter() - start_time\n    print(\"entire runtime took %.3f seconds\" % elapsed_time)\n    return 0\n\n\nif __name__ == '__main__':\n    sys.exit(main(sys.argv))\n"
  },
  {
    "path": "xb.bat",
    "content": "@ECHO OFF\r\nREM Copyright 2022 Ben Vanik. All Rights Reserved.\r\n\r\nSET \"DIR=%~dp0\"\r\n\r\nREM ============================================================================\r\nREM Environment Validation\r\nREM ============================================================================\r\n\r\nSET \"PYTHON_MINIMUM_VERSION[0]=3\"\r\nSET \"PYTHON_MINIMUM_VERSION[1]=6\"\r\nCALL :check_python\r\nIF %_RESULT% NEQ 0 (\r\n  ECHO.\r\n  ECHO Python %PYTHON_MINIMUM_VERSION[0]%.%PYTHON_MINIMUM_VERSION[1]%+ must be installed and on PATH:\r\n  ECHO https://www.python.org/\r\n  GOTO :eof\r\n)\r\n\r\n\r\nREM ============================================================================\r\nREM Trampoline into xenia-build\r\nREM ============================================================================\r\n\r\n\"%PYTHON_EXE%\" \"%DIR%\\xenia-build\" %*\r\nEXIT /b %ERRORLEVEL%\r\n\r\n\r\nREM ============================================================================\r\nREM Utilities\r\nREM ============================================================================\r\n\r\n:check_python\r\nSETLOCAL ENABLEDELAYEDEXPANSION\r\n\r\nSET FOUND_PATH=\"\"\r\n\r\nSET \"CANDIDATE_PATHS[0]=C:\\python310\\python.exe\"\r\nSET \"CANDIDATE_PATHS[1]=C:\\python39\\python.exe\"\r\nSET \"CANDIDATE_PATHS[2]=C:\\python38\\python.exe\"\r\nSET \"CANDIDATE_PATHS[3]=C:\\python37\\python.exe\"\r\nSET \"CANDIDATE_PATHS[4]=C:\\python%PYTHON_MINIMUM_VERSION[0]%%PYTHON_MINIMUM_VERSION[1]%\\python.exe\"\r\nSET OUTPUT_INDEX=5\r\n\r\nFOR /F \"usebackq delims=\" %%L IN (`2^>NUL where python3`) DO (\r\n  IF %%~zL NEQ 0 (\r\n    SET \"CANDIDATE_PATHS[!OUTPUT_INDEX!]=%%L\"\r\n    SET /A OUTPUT_INDEX+=1\r\n  )\r\n)\r\nFOR /F \"usebackq delims=\" %%L IN (`2^>NUL where python`) DO (\r\n  IF %%~zL NEQ 0 (\r\n    SET \"CANDIDATE_PATHS[!OUTPUT_INDEX!]=%%L\"\r\n    SET /A OUTPUT_INDEX+=1\r\n  )\r\n)\r\n\r\nSET CANDIDATE_INDEX=0\r\n:check_candidate_loop\r\nIF NOT DEFINED CANDIDATE_PATHS[%CANDIDATE_INDEX%] (\r\n  GOTO :found_python\r\n)\r\nCALL SET CANDIDATE_PATH=%%CANDIDATE_PATHS[%CANDIDATE_INDEX%]%%\r\nIF NOT EXIST \"%CANDIDATE_PATH%\" (\r\n  SET /A CANDIDATE_INDEX+=1\r\n  GOTO :check_candidate_loop\r\n)\r\nSET \"FOUND_PATH=%CANDIDATE_PATH%\"\r\n\r\n:found_python\r\nIF \"%FOUND_PATH%\"==\"\" (\r\n  ECHO ERROR: no Python executable found on PATH.\r\n  ECHO Make sure you can run 'python' or 'python3' in a Command Prompt.\r\n  ENDLOCAL & SET _RESULT=1\r\n  GOTO :eof\r\n)\r\n\r\nCMD /C \"\"%FOUND_PATH%\" -c \"import sys; sys.exit(1 if not sys.version_info[:2] ^>= (%PYTHON_MINIMUM_VERSION[0]%, %PYTHON_MINIMUM_VERSION[1]%) else 0)\"\r\nIF %ERRORLEVEL% NEQ 0 (\r\n  ECHO ERROR: Python version mismatch, not at least %PYTHON_MINIMUM_VERSION[0]%.%PYTHON_MINIMUM_VERSION[1]%.\r\n  ECHO Found Python executable was \"%FOUND_PATH%\".\r\n  ENDLOCAL & SET _RESULT=1\r\n  GOTO :eof\r\n)\r\n\r\nENDLOCAL & (\r\n  SET _RESULT=0\r\n  SET \"PYTHON_EXE=%FOUND_PATH%\"\r\n)\r\nGOTO :eof\r\n"
  },
  {
    "path": "xb.ps1",
    "content": "function Write-FatalError($message) {\n    [Console]::ForegroundColor = 'red'\n    [Console]::Error.WriteLine($message)\n    [Console]::ResetColor()\n    Exit 1\n}\n\n$pythonExecutables = 'python', 'python3'\nforeach ($pythonExecutable in $pythonExecutables) {\n    if (!$pythonPath) {\n        $pythonPath = powershell -NoLogo -NonInteractive \"(Get-Command -ErrorAction SilentlyContinue $pythonexecutable).Definition\" # Hack to not give command suggestion\n    } else {\n        break\n    }\n}\n# Neither found, error and exit\n$pythonMinimumVer = 3,6\nif (!$pythonPath) {\n    Write-FatalError \"ERROR: Python $($pythonMinimumVer[0]).$($pythonMinimumVer[1])+ must be installed and on PATH:`nhttps://www.python.org/\"\n}\n\n& $pythonPath -c \"import sys; sys.exit(1 if not sys.version_info[:2] >= ($($pythonMinimumVer[0]), $($pythonMinimumVer[1])) else 0)\"\nif ($LASTEXITCODE -gt 0) {\n    Write-FatalError \"ERROR: Python version mismatch, not at least $($pythonMinimumVer[0]).$($pythonMinimumVer[1]).`nFound Python executable was `\"$($pythonPath)`\".\"\n}\n\n& $pythonPath \"$($PSScriptRoot)/xenia-build\" $args\n"
  },
  {
    "path": "xenia-build",
    "content": "#!/usr/bin/env python3\n\n# Copyright 2022 Ben Vanik. All Rights Reserved.\n\n\"\"\"Main build script and tooling for xenia.\n\nRun with --help or no arguments for possible commands.\n\"\"\"\nfrom __future__ import print_function\nfrom datetime import datetime\nfrom multiprocessing import Pool\nfrom functools import partial\nimport argparse\nimport glob\nimport json\nimport os\nimport re\nimport shutil\nimport subprocess\nimport sys\n\n__author__ = 'ben.vanik@gmail.com (Ben Vanik)'\n\n\nself_path = os.path.dirname(os.path.abspath(__file__))\n\n\n# Detect if building on Android via Termux.\nhost_linux_platform_is_android = False\nif sys.platform == 'linux':\n    try:\n        host_linux_platform_is_android = subprocess.Popen(\n            ['uname', '-o'], stdout=subprocess.PIPE, stderr=subprocess.DEVNULL,\n            universal_newlines=True).communicate()[0] == 'Android\\n'\n    except Exception:\n        pass\n\n\ndef import_subprocess_environment(args):\n    popen = subprocess.Popen(\n        args, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True)\n    variables, _ = popen.communicate()\n    envvars_to_save = (\n        'devenvdir',\n        'include',\n        'lib',\n        'libpath',\n        'path',\n        'pathext',\n        'systemroot',\n        'temp',\n        'tmp',\n        'windowssdkdir',\n        )\n    for line in variables.splitlines():\n        for envvar in envvars_to_save:\n            if re.match(envvar + '=', line.lower()):\n                var, setting = line.split('=', 1)\n                if envvar == 'path':\n                    setting = os.path.dirname(sys.executable) + os.pathsep + setting\n                os.environ[var.upper()] = setting\n                break\n\n\ndef import_vs_environment():\n    \"\"\"Finds the installed Visual Studio version and imports\n    interesting environment variables into os.environ.\n\n    Returns:\n      A version such as 2015 or None if no installation is found.\n    \"\"\"\n\n    if sys.platform != 'win32':\n        return None\n\n    version = 0\n    install_path = None\n    env_tool_args = None\n\n    vswhere = subprocess.check_output(\n        'tools/vswhere/vswhere.exe -version \"[15,)\" -latest -prerelease -format json -utf8 -products '\n        \"Microsoft.VisualStudio.Product.Enterprise \"\n        \"Microsoft.VisualStudio.Product.Professional \"\n        \"Microsoft.VisualStudio.Product.Community \"\n        \"Microsoft.VisualStudio.Product.BuildTools\",\n        shell=False,\n        universal_newlines=True,\n        encoding=\"utf-8\",\n    )\n    if vswhere:\n        vswhere = json.loads(vswhere)\n    if vswhere and len(vswhere) > 0:\n        version = int(vswhere[0].get(\"catalog\", {}).get(\"productLineVersion\", 2017))\n        install_path = vswhere[0].get(\"installationPath\", None)\n\n    if version < 2017:\n        if 'VS140COMNTOOLS' in os.environ:\n            version = 2015\n            vcvars_path = os.environ['VS140COMNTOOLS']\n            vcvars_path = os.path.join(vcvars_path, '..\\\\..\\\\vc\\\\vcvarsall.bat')\n            env_tool_args = [vcvars_path, 'x64', '&&', 'set']\n    else:\n        vsdevcmd_path = os.path.join(install_path, 'Common7\\\\Tools\\\\VsDevCmd.bat')\n        if os.path.isfile(vsdevcmd_path) and os.access(vsdevcmd_path, os.X_OK):\n            env_tool_args = [vsdevcmd_path, '-arch=amd64', '-host_arch=amd64', '&&', 'set']\n        else:\n            vcvars_path = os.path.join(install_path, 'VC\\\\Auxiliary\\\\Build\\\\vcvarsall.bat')\n            env_tool_args = [vcvars_path, 'x64', '&&', 'set']\n\n    if version == 0:\n        return None\n\n    import_subprocess_environment(env_tool_args)\n    os.environ['VSVERSION'] = str(version)\n    return version\n\n\nvs_version = import_vs_environment()\n\n\ndef main():\n    # Add self to the root search path.\n    sys.path.insert(0, self_path)\n\n    # Augment path to include our fancy things.\n    os.environ['PATH'] += os.pathsep + os.pathsep.join([\n        self_path,\n        os.path.abspath(os.path.join('tools', 'build')),\n        ])\n\n    # Check git exists.\n    if not has_bin('git'):\n        print('WARNING: Git should be installed and on PATH. Version info will be omitted from all binaries!')\n        print('')\n    elif not git_is_repository():\n        print('WARNING: The source tree is unversioned. Version info will be omitted from all binaries!')\n        print('')\n\n    # Check python version.\n    python_minimum_ver=3,6\n    if not sys.version_info[:2] >= (python_minimum_ver[0], python_minimum_ver[1]):\n        print('ERROR: Python ', python_minimum_ver[0], '.', python_minimum_ver[1], '+ must be installed and on PATH', sep='')\n        sys.exit(1)\n\n    # Grab Visual Studio version and execute shell to set up environment.\n    if sys.platform == 'win32' and vs_version is None:\n        print('WARNING: Visual Studio not found!')\n        print('Building for Windows will not be supported.')\n        print('Please refer to the building guide:')\n        print('https://github.com/xenia-project/xenia/blob/master/docs/building.md')\n\n    # Setup main argument parser and common arguments.\n    parser = argparse.ArgumentParser(prog='xenia-build')\n\n    # Grab all commands and populate the argument parser for each.\n    subparsers = parser.add_subparsers(title='subcommands',\n                                       dest='subcommand')\n    commands = discover_commands(subparsers)\n\n    # If the user passed no args, die nicely.\n    if len(sys.argv) == 1:\n        parser.print_help()\n        sys.exit(1)\n\n    # Gather any arguments that we want to pass to child processes.\n    command_args = sys.argv[1:]\n    pass_args = []\n    try:\n        pass_index = command_args.index('--')\n        pass_args = command_args[pass_index + 1:]\n        command_args = command_args[:pass_index]\n    except Exception:\n        pass\n\n    # Parse command name and dispatch.\n    args = vars(parser.parse_args(command_args))\n    command_name = args['subcommand']\n    try:\n        command = commands[command_name]\n        return_code = command.execute(args, pass_args, os.getcwd())\n    except Exception:\n        raise\n    sys.exit(return_code)\n\n\ndef print_box(msg):\n    \"\"\"Prints an important message inside a box\n    \"\"\"\n    print(\n        '┌{0:─^{2}}╖\\n'\n        '│{1: ^{2}}║\\n'\n        '╘{0:═^{2}}╝\\n'\n        .format('', msg, len(msg) + 2))\n\n\ndef has_bin(binary):\n    \"\"\"Checks whether the given binary is present.\n\n    Args:\n      binary: binary name (without .exe, etc).\n\n    Returns:\n      True if the binary exists.\n    \"\"\"\n    bin_path = get_bin(binary)\n    if not bin_path:\n        return False\n    return True\n\n\ndef get_bin(binary):\n    \"\"\"Checks whether the given binary is present and returns the path.\n\n    Args:\n      binary: binary name (without .exe, etc).\n\n    Returns:\n      Full path to the binary or None if not found.\n    \"\"\"\n    for path in os.environ['PATH'].split(os.pathsep):\n        path = path.strip('\"')\n        exe_file = os.path.join(path, binary)\n        if os.path.isfile(exe_file) and os.access(exe_file, os.X_OK):\n            return exe_file\n        exe_file += '.exe'\n        if os.path.isfile(exe_file) and os.access(exe_file, os.X_OK):\n            return exe_file\n    return None\n\n\ndef shell_call(command, throw_on_error=True, stdout_path=None, stderr_path=None, shell=False):\n    \"\"\"Executes a shell command.\n\n    Args:\n      command: Command to execute, as a list of parameters.\n      throw_on_error: Whether to throw an error or return the status code.\n      stdout_path: File path to write stdout output to.\n      stderr_path: File path to write stderr output to.\n\n    Returns:\n      If throw_on_error is False the status code of the call will be returned.\n    \"\"\"\n    stdout_file = None\n    if stdout_path:\n        stdout_file = open(stdout_path, 'w')\n    stderr_file = None\n    if stderr_path:\n        stderr_file = open(stderr_path, 'w')\n    result = 0\n    try:\n        if throw_on_error:\n            result = 1\n            subprocess.check_call(command, shell=shell, stdout=stdout_file, stderr=stderr_file)\n            result = 0\n        else:\n            result = subprocess.call(command, shell=shell, stdout=stdout_file, stderr=stderr_file)\n    finally:\n        if stdout_file:\n            stdout_file.close()\n        if stderr_file:\n            stderr_file.close()\n    return result\n\n\ndef generate_version_h():\n    \"\"\"Generates a build/version.h file that contains current git info.\n    \"\"\"\n    header_file = 'build/version.h'\n    pr_number = 0\n    pr_repo_name = \"\"\n    pr_branch_name = \"\"\n    pr_commit = \"\"\n    pr_commit_short = \"\"\n    if os.getenv('APPVEYOR') == 'True':\n      branch_name = os.getenv('APPVEYOR_REPO_BRANCH')\n      commit = os.getenv('APPVEYOR_REPO_COMMIT')\n      commit_short = commit[:9]\n      pr_number = os.getenv('APPVEYOR_PULL_REQUEST_NUMBER')\n      if not pr_number:\n        pr_number = 0\n      else:\n        pr_repo_name = os.getenv('APPVEYOR_PULL_REQUEST_HEAD_REPO_NAME')\n        pr_branch_name = os.getenv('APPVEYOR_PULL_REQUEST_HEAD_REPO_BRANCH')\n        pr_commit = os.getenv('APPVEYOR_PULL_REQUEST_HEAD_COMMIT')\n        pr_commit_short = pr_commit[:9]\n    elif git_is_repository():\n        (branch_name, commit, commit_short) = git_get_head_info()\n    else:\n        branch_name = 'tarball'\n        commit = ':(-dont-do-this'\n        commit_short = ':('\n\n    # header\n    contents_new = '''// Autogenerated by `xb premake`.\n#ifndef GENERATED_VERSION_H_\n#define GENERATED_VERSION_H_\n#define XE_BUILD_BRANCH \"{}\"\n#define XE_BUILD_COMMIT \"{}\"\n#define XE_BUILD_COMMIT_SHORT \"{}\"\n#define XE_BUILD_DATE __DATE__\n'''.format(branch_name, commit, commit_short)\n\n    # PR info (if available)\n    if pr_number != 0:\n      contents_new += '''#define XE_BUILD_IS_PR\n#define XE_BUILD_PR_NUMBER \"{}\"\n#define XE_BUILD_PR_REPO \"{}\"\n#define XE_BUILD_PR_BRANCH \"{}\"\n#define XE_BUILD_PR_COMMIT \"{}\"\n#define XE_BUILD_PR_COMMIT_SHORT \"{}\"\n'''.format(pr_number, pr_repo_name, pr_branch_name, pr_commit, pr_commit_short)\n\n    # footer\n    contents_new += '''#endif  // GENERATED_VERSION_H_\n'''\n\n    contents_old = None\n    if os.path.exists(header_file) and os.path.getsize(header_file) < 1024:\n        with open(header_file, 'r') as f:\n            contents_old = f.read()\n\n    if contents_old != contents_new:\n        with open(header_file, 'w') as f:\n            f.write(contents_new)\n\n\ndef generate_source_class(path):\n    header_path = '{}.h'.format(path)\n    source_path = '{}.cc'.format(path)\n\n    if os.path.isfile(header_path) or os.path.isfile(source_path):\n        print('ERROR: Target file already exists')\n        return 1\n\n    if generate_source_file(header_path) > 0:\n        return 1\n    if generate_source_file(source_path) > 0:\n        # remove header if source file generation failed\n        os.remove(os.path.join(source_root, header_path))\n        return 1\n\n    return 0\n\ndef generate_source_file(path):\n    \"\"\"Generates a source file at the specified path containing copyright notice\n    \"\"\"\n    copyright = '''/**\n ******************************************************************************\n * Xenia : Xbox 360 Emulator Research Project                                 *\n ******************************************************************************\n * Copyright {} Ben Vanik. All rights reserved.                             *\n * Released under the BSD license - see LICENSE in the root for more details. *\n ******************************************************************************\n */'''.format(datetime.now().year)\n\n    if os.path.isfile(path):\n        print('ERROR: Target file already exists')\n        return 1\n    try:\n        with open(path, 'w') as f:\n            f.write(copyright)\n    except Exception as e:\n        print('ERROR: Could not write to file [path {}]'.format(path))\n        return 1\n\n    return 0\n\n\n\ndef git_get_head_info():\n    \"\"\"Queries the current branch and commit checksum from git.\n\n    Returns:\n      (branch_name, commit, commit_short)\n      If the user is not on any branch the name will be 'detached'.\n    \"\"\"\n    p = subprocess.Popen([\n        'git',\n        'symbolic-ref',\n        '--short',\n        '-q',\n        'HEAD',\n        ], stdout=subprocess.PIPE, stderr=subprocess.PIPE)\n    (stdout, stderr) = p.communicate()\n    branch_name = stdout.decode('ascii').strip() or 'detached'\n    p = subprocess.Popen([\n        'git',\n        'rev-parse',\n        'HEAD',\n        ], stdout=subprocess.PIPE, stderr=subprocess.PIPE)\n    (stdout, stderr) = p.communicate()\n    commit = stdout.decode('ascii').strip() or 'unknown'\n    p = subprocess.Popen([\n        'git',\n        'rev-parse',\n        '--short',\n        'HEAD',\n        ], stdout=subprocess.PIPE, stderr=subprocess.PIPE)\n    (stdout, stderr) = p.communicate()\n    commit_short = stdout.decode('ascii').strip() or 'unknown'\n    return branch_name, commit, commit_short\n\n\ndef git_is_repository():\n    \"\"\"Checks if git is available and this source tree is versioned.\n    \"\"\"\n    if not has_bin('git'):\n        return False\n    return shell_call([\n        'git',\n        'rev-parse',\n        '--is-inside-work-tree',\n        ], throw_on_error=False, stdout_path=os.devnull, stderr_path=os.devnull) == 0\n\n\ndef git_submodule_update():\n    \"\"\"Runs a git submodule init and update.\n    \"\"\"\n    shell_call([\n        'git',\n        '-c',\n        'fetch.recurseSubmodules=on-demand',\n        'submodule',\n        'update',\n        '--init',\n        ])\n\n\ndef get_clang_format_binary():\n    \"\"\"Finds a clang-format binary. Aborts if none is found.\n\n    Returns:\n      A path to the clang-format executable.\n    \"\"\"\n    attempts = [\n        'C:\\\\Program Files\\\\LLVM\\\\bin\\\\clang-format.exe',\n        'C:\\\\Program Files (x86)\\\\LLVM\\\\bin\\\\clang-format.exe',\n        'clang-format-14',\n        'clang-format-13',\n        'clang-format',\n        ]\n    for binary in attempts:\n        if has_bin(binary):\n            return binary\n    print('ERROR: clang-format is not on PATH')\n    print('LLVM is available from https://llvm.org/releases/download.html')\n    print('At least version 13 is required.')\n    print('See docs/style_guide.md for instructions on how to get it.')\n    sys.exit(1)\n\n\ndef get_premake_target_os(target_os_override=None):\n    \"\"\"Gets the target --os to pass to premake, either for the current platform\n    or for the user-specified cross-compilation target.\n\n    Args:\n      target_os_override: override specified by the user for cross-compilation,\n        or None to target the host platform.\n\n    Returns:\n      Target --os to pass to premake. If a return value of this function valid\n      for the current configuration is passed to it again, the same value will\n      be returned.\n    \"\"\"\n    if sys.platform == 'darwin':\n        target_os = 'macosx'\n    elif sys.platform == 'win32':\n        target_os = 'windows'\n    elif host_linux_platform_is_android:\n        target_os = 'android'\n    else:\n        target_os = 'linux'\n    if target_os_override is not None and target_os_override != target_os:\n        if target_os_override == 'android':\n            target_os = target_os_override\n        else:\n            print(\n                'ERROR: cross-compilation is only supported for Android target')\n            sys.exit(0)\n    return target_os\n\n\ndef run_premake(target_os, action, cc=None):\n    \"\"\"Runs premake on the main project with the given format.\n\n    Args:\n      target_os: target --os to pass to premake.\n      action: action to preform.\n    \"\"\"\n    args = [\n        sys.executable,\n        os.path.join('tools', 'build', 'premake'),\n        '--file=premake5.lua',\n        '--os=%s' % target_os,\n        '--test-suite-mode=combined',\n        '--verbose',\n        action,\n    ]\n    if cc:\n        args.insert(4, '--cc=%s' % cc)\n\n    ret = subprocess.call(args, shell=False)\n\n    if ret == 0:\n        generate_version_h()\n\n    return ret\n\n\ndef run_platform_premake(target_os_override=None, cc='clang', devenv=None):\n    \"\"\"Runs all gyp configurations.\n    \"\"\"\n    target_os = get_premake_target_os(target_os_override)\n    if devenv is None:\n        if target_os == 'macosx':\n            devenv = 'xcode4'\n        elif target_os == 'windows':\n            vs_version = '2015'\n            if 'VSVERSION' in os.environ:\n                vs_version = os.environ['VSVERSION']\n            devenv = 'vs' + vs_version\n        elif target_os == 'android':\n            devenv = 'androidndk'\n        else:\n            devenv = 'gmake2'\n    if target_os != 'linux':\n        cc = None\n    return run_premake(target_os=target_os, action=devenv, cc=cc)\n\n\ndef get_build_bin_path(args):\n    \"\"\"Returns the path of the bin/ path with build results based on the\n    configuration specified in the parsed arguments.\n\n    Args:\n      args: Parsed arguments.\n\n    Returns:\n      A full path for the bin folder.\n    \"\"\"\n    if sys.platform == 'darwin':\n        platform = 'macosx'\n    elif sys.platform == 'win32':\n        platform = 'windows'\n    else:\n        platform = 'linux'\n    return os.path.join(self_path, 'build', 'bin', platform.capitalize(), args['config'].capitalize())\n\n\ndef create_clion_workspace():\n    \"\"\"Creates some basic workspace information inside the .idea directory for first start.\n    \"\"\"\n    if os.path.exists('.idea'):\n        # No first start\n        return False\n    print('Generating CLion workspace files...')\n    # Might become easier in the future: https://youtrack.jetbrains.com/issue/CPP-7911\n\n    # Set the location of the CMakeLists.txt\n    os.mkdir('.idea')\n    with open(os.path.join('.idea', 'misc.xml'), 'w') as f:\n        f.write(\"\"\"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"CMakeWorkspace\" PROJECT_DIR=\"$PROJECT_DIR$/build\">\n    <contentRoot DIR=\"$PROJECT_DIR$\" />\n  </component>\n</project>\n\"\"\")\n\n    # Set available configurations\n    # TODO Find a way to trigger a cmake reload\n    with open(os.path.join('.idea', 'workspace.xml'), 'w') as f:\n        f.write(\"\"\"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"CMakeSettings\">\n    <configurations>\n      <configuration PROFILE_NAME=\"Checked\" CONFIG_NAME=\"Checked\" />\n      <configuration PROFILE_NAME=\"Debug\" CONFIG_NAME=\"Debug\" />\n      <configuration PROFILE_NAME=\"Release\" CONFIG_NAME=\"Release\" />\n    </configurations>\n  </component>\n</project>\"\"\")\n\n    return True\n\n\ndef discover_commands(subparsers):\n    \"\"\"Looks for all commands and returns a dictionary of them.\n    In the future commands could be discovered on disk.\n\n    Args:\n      subparsers: Argument subparsers parent used to add command parsers.\n\n    Returns:\n      A dictionary containing name-to-Command mappings.\n    \"\"\"\n    commands = {\n        'setup': SetupCommand(subparsers),\n        'pull': PullCommand(subparsers),\n        'premake': PremakeCommand(subparsers),\n        'build': BuildCommand(subparsers),\n        'buildshaders': BuildShadersCommand(subparsers),\n        'devenv': DevenvCommand(subparsers),\n        'gentests': GenTestsCommand(subparsers),\n        'test': TestCommand(subparsers),\n        'gputest': GpuTestCommand(subparsers),\n        'clean': CleanCommand(subparsers),\n        'nuke': NukeCommand(subparsers),\n        'lint': LintCommand(subparsers),\n        'format': FormatCommand(subparsers),\n        'style': StyleCommand(subparsers),\n        'tidy': TidyCommand(subparsers),\n        'stub': StubCommand(subparsers),\n        }\n    return commands\n\n\nclass Command(object):\n    \"\"\"Base type for commands.\n    \"\"\"\n\n    def __init__(self, subparsers, name, help_short=None, help_long=None,\n                 *args, **kwargs):\n        \"\"\"Initializes a command.\n\n        Args:\n          subparsers: Argument subparsers parent used to add command parsers.\n          name: The name of the command exposed to the management script.\n          help_short: Help text printed alongside the command when queried.\n          help_long: Extended help text when viewing command help.\n        \"\"\"\n        self.name = name\n        self.help_short = help_short\n        self.help_long = help_long\n\n        self.parser = subparsers.add_parser(name,\n                                            help=help_short,\n                                            description=help_long)\n        self.parser.set_defaults(command_handler=self)\n\n    def execute(self, args, pass_args, cwd):\n        \"\"\"Executes the command.\n\n        Args:\n          args: Arguments hash for the command.\n          pass_args: Arguments list to pass to child commands.\n          cwd: Current working directory.\n\n        Returns:\n          Return code of the command.\n        \"\"\"\n        return 1\n\n\nclass SetupCommand(Command):\n    \"\"\"'setup' command.\"\"\"\n\n    def __init__(self, subparsers, *args, **kwargs):\n        super(SetupCommand, self).__init__(\n            subparsers,\n            name='setup',\n            help_short='Setup the build environment.',\n            *args, **kwargs)\n        self.parser.add_argument(\n            '--target_os', default=None,\n            help='Target OS passed to premake, for cross-compilation')\n\n    def execute(self, args, pass_args, cwd):\n        print('Setting up the build environment...')\n        print('')\n\n        # Setup submodules.\n        print('- git submodule init / update...')\n        if git_is_repository():\n            git_submodule_update()\n        else:\n            print('WARNING: Git not available or not a repository. Dependencies may be missing.')\n        print('')\n\n        print('- running premake...')\n        ret = run_platform_premake(target_os_override=args['target_os'])\n        print('')\n        print('Success!' if ret == 0 else 'Error!')\n\n        return ret\n\n\nclass PullCommand(Command):\n    \"\"\"'pull' command.\"\"\"\n\n    def __init__(self, subparsers, *args, **kwargs):\n        super(PullCommand, self).__init__(\n            subparsers,\n            name='pull',\n            help_short='Pulls the repo and all dependencies and rebases changes.',\n            *args, **kwargs)\n        self.parser.add_argument(\n            '--merge', action='store_true',\n             help='Merges on master instead of rebasing.')\n        self.parser.add_argument(\n            '--target_os', default=None,\n            help='Target OS passed to premake, for cross-compilation')\n\n    def execute(self, args, pass_args, cwd):\n        print('Pulling...')\n        print('')\n\n        print('- switching to master...')\n        shell_call([\n            'git',\n            'checkout',\n            'master',\n            ])\n        print('')\n\n        print('- pulling self...')\n        if args['merge']:\n            shell_call([\n                'git',\n                'pull',\n                ])\n        else:\n            shell_call([\n                'git',\n                'pull',\n                '--rebase',\n                ])\n        print('')\n\n        print('- pulling dependencies...')\n        git_submodule_update()\n        print('')\n\n        print('- running premake...')\n        if run_platform_premake(target_os_override=args['target_os']) == 0:\n            print('')\n            print('Success!')\n\n        return 0\n\n\nclass PremakeCommand(Command):\n    \"\"\"'premake' command.\"\"\"\n\n    def __init__(self, subparsers, *args, **kwargs):\n        super(PremakeCommand, self).__init__(\n            subparsers,\n            name='premake',\n            help_short='Runs premake to update all projects.',\n            *args, **kwargs)\n        self.parser.add_argument(\n            '--cc', default='clang', help='Compiler toolchain passed to premake')\n        self.parser.add_argument(\n            '--devenv', default=None, help='Development environment')\n        self.parser.add_argument(\n            '--target_os', default=None,\n            help='Target OS passed to premake, for cross-compilation')\n\n    def execute(self, args, pass_args, cwd):\n        # Update premake. If no binary found, it will be built from source.\n        print('Running premake...')\n        print('')\n        ret = run_platform_premake(target_os_override=args['target_os'],\n                                   cc=args['cc'], devenv=args['devenv'])\n        print('Success!' if ret == 0 else 'Error!')\n\n        return ret\n\n\nclass BaseBuildCommand(Command):\n    \"\"\"Base command for things that require building.\"\"\"\n\n    def __init__(self, subparsers, *args, **kwargs):\n        super(BaseBuildCommand, self).__init__(\n            subparsers,\n            *args, **kwargs)\n        self.parser.add_argument(\n            '--cc', default='clang', help='Compiler toolchain passed to premake')\n        self.parser.add_argument(\n            '--config', choices=['checked', 'debug', 'release'], default='debug',\n            type=str.lower, help='Chooses the build configuration.')\n        self.parser.add_argument(\n            '--target', action='append', default=[],\n            help='Builds only the given target(s).')\n        self.parser.add_argument(\n            '--force', action='store_true',\n            help='Forces a full rebuild.')\n        self.parser.add_argument(\n            '--no_premake', action='store_true',\n            help='Skips running premake before building.')\n        self.parser.add_argument(\n            '-j', default=4, type=int, help='Number of parallel threads')\n\n    def execute(self, args, pass_args, cwd):\n        if not args['no_premake']:\n            print('- running premake...')\n            run_platform_premake(cc=args['cc'])\n            print('')\n\n        threads = args['j']\n        if threads < 0:\n            threads = 0\n\n        print('- building (%s):%s...' % (\n            'all' if not len(args['target']) else ', '.join(args['target']),\n            args['config']))\n        if sys.platform == 'win32':\n            if vs_version is None:\n                print('ERROR: Visual Studio is not installed.');\n                result = 1\n            else:\n                targets = None\n                if len(args['target']):\n                    targets = '/t:' + ';'.join(\n                        target + (':Rebuild' if args['force'] else '')\n                        for target in args['target'])\n                else:\n                    targets = '/t:Rebuild' if args['force'] else None\n\n                result = subprocess.call([\n                    'msbuild',\n                    'build/xenia.sln',\n                    '/nologo',\n                    '/m',\n                    '/v:m',\n                    '/p:Configuration=' + args['config'],\n                    ] + ([targets] if targets is not None else []) + pass_args,\n                    shell=False)\n        elif sys.platform == 'darwin':\n            schemes = args['target'] if len(args['target']) else ['xenia-app']\n            nested_args = [['-scheme', scheme] for scheme in schemes]\n            scheme_args = [arg for pair in nested_args for arg in pair]\n            result = subprocess.call([\n                'xcodebuild',\n                '-workspace',\n                'build/xenia.xcworkspace',\n                '-configuration',\n                args['config']\n            ] + scheme_args + pass_args, shell=False, env=dict(os.environ))\n        else:\n            result = subprocess.call([\n                'make',\n                '-j' if threads == 0 else '-j%d' % threads,\n                '-Cbuild/',\n                'config=%s_linux' % (args['config']),\n            ] + pass_args + args['target'], shell=False, env=dict(os.environ))\n        print('')\n        if result != 0:\n            print('ERROR: build failed with one or more errors.')\n            return result\n        return 0\n\n\nclass BuildCommand(BaseBuildCommand):\n    \"\"\"'build' command.\"\"\"\n\n    def __init__(self, subparsers, *args, **kwargs):\n        super(BuildCommand, self).__init__(\n            subparsers,\n            name='build',\n            help_short='Builds the project with the default toolchain.',\n            *args, **kwargs)\n\n    def execute(self, args, pass_args, cwd):\n        print('Building %s...' % (args['config']))\n        print('')\n\n        result = super(BuildCommand, self).execute(args, pass_args, cwd)\n        if not result:\n            print('Success!')\n        return result\n\n\nclass BuildShadersCommand(Command):\n    \"\"\"'buildshaders' command.\"\"\"\n\n    def __init__(self, subparsers, *args, **kwargs):\n        super(BuildShadersCommand, self).__init__(\n            subparsers,\n            name='buildshaders',\n            help_short='Generates shader binaries for inclusion in C++ files.',\n            help_long='''\n            Generates the shader binaries under src/*/shaders/bytecode/.\n            Run after modifying any .hs/vs/ds/gs/ps/cs.glsl/hlsl/xesl files.\n            Direct3D shaders can be built only on a Windows host.\n            ''',\n            *args, **kwargs)\n        self.parser.add_argument(\n            '--target', action='append', choices=['dxbc', 'spirv'], default=[],\n            help='Builds only the given target(s).')\n\n    def execute(self, args, pass_args, cwd):\n        src_paths = [os.path.join(root, name)\n                     for root, dirs, files in os.walk('src')\n                     for name in files\n                     if (name.endswith('.glsl') or\n                         name.endswith('.hlsl') or\n                         name.endswith('.xesl'))]\n        targets = args['target']\n        all_targets = len(targets) == 0\n\n        # XeSL (\"Xenia Shading Language\") means shader files that can be\n        # compiled as multiple languages from a single file. Whenever possible,\n        # this is achieved without the involvement of the build script, using\n        # just conditionals, macros and functions in shaders, however, in some\n        # cases, that's necessary (such as to prepend `#version` in GLSL, as\n        # well as to enable `#include` in GLSL, to include `xesl.xesli` itself,\n        # without writing the same `#if` / `#extension` / `#endif` in every\n        # shader). Also, not all shading languages provide a built-in\n        # preprocessor definition for identification of them, so\n        # `SHADING_LANGUAGE_*_XE` is also defined via the build arguments.\n        # `SHADING_LANGUAGE_*_XE` is set regardless of whether the file is XeSL\n        # or a raw source file in a specific language, as XeSL headers may be\n        # used in language-specific sources.\n\n        # Direct3D DXBC.\n        if all_targets or 'dxbc' in targets:\n            if sys.platform == 'win32':\n                print('Building Direct3D 12 Shader Model 5.1 DXBC shaders...')\n\n                # Get the path to FXC from the latest Windows SDK version.\n\n                # Assume native or emulated 32-bit x86 if not one of the\n                # architectures listed here.\n                windows_sdk_architecture = 'x86'\n                processor_architecture = os.environ.get(\n                    'PROCESSOR_ARCHITECTURE')\n                if processor_architecture == 'AMD64':\n                    windows_sdk_architecture = 'x64'\n                elif processor_architecture == 'ARM64':\n                    windows_sdk_architecture = 'arm64'\n                program_files_path = os.environ.get('ProgramFiles(x86)')\n                if program_files_path is None:\n                    program_files_path = os.environ.get('ProgramFiles')\n                if (program_files_path is None or\n                    not os.path.exists(program_files_path)):\n                    print('ERROR: could not find the Program Files folder with '\n                          'the Windows SDK')\n                    return 1\n                fxc_paths = glob.glob(\n                    os.path.join(program_files_path, 'Windows Kits/10/bin/*',\n                                 windows_sdk_architecture, 'fxc.exe'))\n                if not fxc_paths:\n                    print('ERROR: could not find the Windows 10/11 SDK with '\n                          'the Effect-Compiler Tool (FXC)')\n                    return 1\n                # TODO(Triang3l): Sort by version number, not alphabetically.\n                fxc_paths.sort()\n                fxc = fxc_paths[-1]\n\n                # Build DXBC.\n\n                dxbc_stages = ['vs', 'hs', 'ds', 'gs', 'ps', 'cs']\n                for src_path in src_paths:\n                    src_name = os.path.basename(src_path)\n                    if ((not src_name.endswith('.hlsl') and\n                         not src_name.endswith('.xesl')) or\n                        len(src_name) <= 8 or src_name[-8] != '.'):\n                        continue\n                    dxbc_identifier = src_name[:-5].replace('.', '_')\n                    dxbc_stage = dxbc_identifier[-2:]\n                    if not dxbc_stage in dxbc_stages:\n                        continue\n                    print('- %s > d3d12_5_1' % (src_path))\n                    dxbc_dir_path = os.path.join(os.path.dirname(src_path),\n                                                 'bytecode/d3d12_5_1')\n                    os.makedirs(dxbc_dir_path, exist_ok=True)\n                    dxbc_file_path_base = os.path.join(dxbc_dir_path,\n                                                       dxbc_identifier)\n                    # Not enabling treating warnings as errors (/WX) because it\n                    # overrides #pragma warning, and the FXAA shader triggers a\n                    # bug in FXC causing an uninitialized variable warning if\n                    # early exit from a function is done.\n                    # FXC writes errors and warnings to stderr, not stdout, but\n                    # stdout receives generic status messages that only add\n                    # clutter in this case.\n                    if subprocess.call([\n                           fxc,\n                           '/D', 'SHADING_LANGUAGE_HLSL_XE=1',\n                           '/Fh', dxbc_file_path_base + '.h',\n                           '/T', dxbc_stage + '_5_1',\n                           '/Vn', dxbc_identifier,\n                           '/nologo',\n                           src_path,\n                           ], stdout=subprocess.DEVNULL) != 0:\n                        print('ERROR: failed to compile a DXBC shader')\n                        return 1\n            else:\n                if all_targets:\n                    print('WARNING: Direct3D DXBC shader building is supported '\n                          'only on Windows')\n                else:\n                    print('ERROR: Direct3D DXBC shader building is supported '\n                          'only on Windows')\n                    return 1\n\n        # Vulkan SPIR-V.\n        if all_targets or 'spirv' in targets:\n            print('Building Vulkan SPIR-V shaders...')\n\n            # Get the SPIR-V tool paths.\n            vulkan_sdk_path = os.environ['VULKAN_SDK']\n            if not os.path.exists(vulkan_sdk_path):\n                print('ERROR: could not find the Vulkan SDK in $VULKAN_SDK')\n                return 1\n            # bin is lowercase on Linux (even though it's uppercase on Windows).\n            vulkan_bin_path = os.path.join(vulkan_sdk_path, 'bin')\n            if not os.path.exists(vulkan_bin_path):\n                print('ERROR: could not find the Vulkan SDK binaries')\n                return 1\n            glslang = os.path.join(vulkan_bin_path, 'glslangValidator')\n            if not has_bin(glslang):\n                print('ERROR: could not find glslangValidator')\n                return 1\n            spirv_opt = os.path.join(vulkan_bin_path, 'spirv-opt')\n            if not has_bin(spirv_opt):\n                print('ERROR: could not find spirv-opt')\n                return 1\n            spirv_dis = os.path.join(vulkan_bin_path, 'spirv-dis')\n            if not has_bin(spirv_dis):\n                print('ERROR: could not find spirv-dis')\n                return 1\n\n            # Build SPIR-V.\n            spirv_stages = {\n                'vs': 'vert',\n                'hs': 'tesc',\n                'ds': 'tese',\n                'gs': 'geom',\n                'ps': 'frag',\n                'cs': 'comp',\n            }\n            # #version and extensions must be before everything else in a GLSL\n            # file, can't use a language conditional to add them. Use string\n            # interpolation to insert the file name. Using #include also\n            # preserves line numbers in error and warning messages.\n            spirv_xesl_wrapper =  \\\n                '#version 460\\n' + \\\n                '#extension GL_EXT_control_flow_attributes : require\\n' + \\\n                '#extension GL_EXT_samplerless_texture_functions : require\\n' + \\\n                '#extension GL_GOOGLE_include_directive : require\\n' + \\\n                '#include \"%s\"\\n'\n            for src_path in src_paths:\n                src_name = os.path.basename(src_path)\n                src_is_xesl = src_name.endswith('.xesl')\n                if ((not src_is_xesl and not src_name.endswith('.glsl')) or\n                    len(src_name) <= 8 or src_name[-8] != '.'):\n                    continue\n                spirv_identifier = src_name[:-5].replace('.', '_')\n                spirv_stage = spirv_stages.get(spirv_identifier[-2:], None)\n                if spirv_stage is None:\n                    continue\n                print('- %s > vulkan_spirv' % (src_path))\n                src_dir = os.path.dirname(src_path)\n                spirv_dir_path = os.path.join(src_dir, 'bytecode/vulkan_spirv')\n                os.makedirs(spirv_dir_path, exist_ok=True)\n                spirv_file_path_base = os.path.join(spirv_dir_path,\n                                                    spirv_identifier)\n                spirv_glslang_file_path = spirv_file_path_base + '.glslang.spv'\n                # --stdin must be before -S for some reason.\n                glslang_arguments = [glslang,\n                                     '--stdin' if src_is_xesl else src_path,\n                                     '-DSHADING_LANGUAGE_GLSL_XE=1',\n                                     '-S', spirv_stage,\n                                     '-o', spirv_glslang_file_path,\n                                     '-V']\n                # When compiling the code from stdin, there's no directory\n                # containing the file, add the include directory explicitly.\n                if src_is_xesl:\n                    glslang_arguments.append('-I' + src_dir)\n                if subprocess.run(\n                       glslang_arguments,\n                       input = (spirv_xesl_wrapper % src_name) if src_is_xesl\n                               else None,\n                       universal_newlines = True).returncode != 0:\n                    print('ERROR: failed to build a SPIR-V shader')\n                    return 1\n                # Optimize the shader, and then improve the compression quality\n                # for the application executable via ID canonicalization by\n                # making IDs in similar shaders more likely to be the same.\n                # Don't strip debug information such as binding and buffer\n                # structure member names, however, as it's useful for\n                # investigating issues in debuggers such as RenderDoc.\n                # spirv-opt input and output files must be different.\n                spirv_file_path = spirv_file_path_base + '.spv'\n                if subprocess.call([\n                       spirv_opt,\n                       '-O',\n                       '--canonicalize-ids',\n                       spirv_glslang_file_path,\n                       '-o', spirv_file_path,\n                       ]) != 0:\n                    print('ERROR: failed to optimize a SPIR-V shader')\n                    return 1\n                os.remove(spirv_glslang_file_path)\n                spirv_dis_file_path = spirv_file_path_base + '.txt';\n                if subprocess.call([\n                       spirv_dis,\n                       '-o', spirv_dis_file_path,\n                       spirv_file_path,\n                       ]) != 0:\n                    print('ERROR: failed to disassemble a SPIR-V shader')\n                    return 1\n                # Generate the header from the disassembly and the binary.\n                with open(spirv_file_path_base + '.h', 'w') as out_file:\n                    out_file.write(\n                        '// Generated with `xb buildshaders`.\\n#if 0\\n')\n                    with open(spirv_dis_file_path, 'r') as spirv_dis_file:\n                        spirv_dis_data = spirv_dis_file.read()\n                        if len(spirv_dis_data) > 0:\n                            out_file.write(spirv_dis_data)\n                            if spirv_dis_data[-1] != '\\n':\n                                out_file.write('\\n')\n                    out_file.write('#endif\\n\\nconst uint32_t %s[] = {' %\n                                   spirv_identifier)\n                    with open(spirv_file_path, 'rb') as spirv_file:\n                        index = 0\n                        # SPIR-V consists of host-endian 32-bit words.\n                        c = spirv_file.read(4)\n                        while len(c) != 0:\n                            if len(c) != 4:\n                                print('ERROR: a SPIR-V shader is misaligned')\n                                return 1\n                            if index % 6 == 0:\n                                out_file.write('\\n    ')\n                            else:\n                                out_file.write(' ')\n                            index += 1\n                            out_file.write(\n                                '0x%08X,' % int.from_bytes(c, sys.byteorder))\n                            c = spirv_file.read(4)\n                    out_file.write('\\n};\\n')\n                os.remove(spirv_dis_file_path)\n                os.remove(spirv_file_path)\n        return 0\n\n\nclass TestCommand(BaseBuildCommand):\n    \"\"\"'test' command.\"\"\"\n\n    def __init__(self, subparsers, *args, **kwargs):\n        super(TestCommand, self).__init__(\n            subparsers,\n            name='test',\n            help_short='Runs automated tests that have been built with `xb build`.',\n            help_long='''\n            To pass arguments to the test executables separate them with `--`.\n            For example, you can run only the instr_foo.s tests with:\n              $ xb test -- instr_foo\n            ''',\n            *args, **kwargs)\n        self.parser.add_argument(\n            '--no_build', action='store_true',\n            help='Don\\'t build before running tests.')\n        self.parser.add_argument(\n            '--continue', action='store_true',\n            help='Don\\'t stop when a test errors, but continue running all.')\n\n    def execute(self, args, pass_args, cwd):\n        print('Testing...')\n        print('')\n\n        # The test executables that will be built and run.\n        test_targets = args['target'] or [\n            'xenia-base-tests',\n            'xenia-cpu-ppc-tests'\n            ]\n        args['target'] = test_targets\n\n        # Build all targets (if desired).\n        if not args['no_build']:\n            result = super(TestCommand, self).execute(args, [], cwd)\n            if result:\n                print('Failed to build, aborting test run.')\n                return result\n\n        # Ensure all targets exist before we run.\n        test_executables = [\n            get_bin(os.path.join(get_build_bin_path(args), test_target))\n            for test_target in test_targets]\n        for i in range(0, len(test_targets)):\n            if test_executables[i] is None:\n                print('ERROR: Unable to find %s - build it.' % (test_targets[i]))\n                return 1\n\n        # Run tests.\n        any_failed = False\n        for test_executable in test_executables:\n            print('- %s' % test_executable)\n            result = shell_call([test_executable] + pass_args,\n                                throw_on_error=False)\n            if result:\n                any_failed = True\n                if args['continue']:\n                    print('ERROR: test failed but continuing due to --continue.')\n                else:\n                    print('ERROR: test failed, aborting, use --continue to keep going.')\n                    return result\n\n        if any_failed:\n            print('ERROR: one or more tests failed.')\n            result = 1\n        return result\n\n\nclass GenTestsCommand(Command):\n    \"\"\"'gentests' command.\"\"\"\n\n    def __init__(self, subparsers, *args, **kwargs):\n        super(GenTestsCommand, self).__init__(\n            subparsers,\n            name='gentests',\n            help_short='Generates test binaries.',\n            help_long='''\n            Generates test binaries (under src/xenia/cpu/ppc/testing/bin/).\n            Run after modifying test .s files.\n            ''',\n            *args, **kwargs)\n\n    def process_src_file(test_bin, ppc_as, ppc_objdump, ppc_ld, ppc_nm, src_file):\n        print('- %s' % src_file)\n\n        def make_unix_path(p):\n            \"\"\"Forces a unix path separator style, as required by binutils.\n            \"\"\"\n            return p.replace(os.sep, '/')\n\n        src_name = os.path.splitext(os.path.basename(src_file))[0]\n        obj_file = os.path.join(test_bin, src_name) + '.o'\n        shell_call([\n            ppc_as,\n            '-a32',\n            '-be',\n            '-mregnames',\n            '-mpower7',\n            '-maltivec',\n            '-mvsx',\n            '-mvmx128',\n            '-R',\n            '-o%s' % (make_unix_path(obj_file)),\n            make_unix_path(src_file),\n            ])\n        dis_file = os.path.join(test_bin, src_name) + '.dis'\n        shell_call([\n            ppc_objdump,\n            '--adjust-vma=0x100000',\n            '-Mpower7',\n            '-Mvmx128',\n            '-D',\n            '-EB',\n            make_unix_path(obj_file),\n            ], stdout_path=dis_file)\n        # Eat the first 4 lines to kill the file path that'll differ across machines.\n        with open(dis_file) as f:\n            dis_file_lines = f.readlines()\n        with open(dis_file, 'w') as f:\n            f.writelines(dis_file_lines[4:])\n        shell_call([\n            ppc_ld,\n            '-A powerpc:common32',\n            '-melf32ppc',\n            '-EB',\n            '-nostdlib',\n            '--oformat=binary',\n            '-Ttext=0x80000000',\n            '-e0x80000000',\n            '-o%s' % (make_unix_path(os.path.join(test_bin, src_name) + '.bin')),\n            make_unix_path(obj_file),\n            ])\n        shell_call([\n            ppc_nm,\n            '--numeric-sort',\n            make_unix_path(obj_file),\n            ], stdout_path=os.path.join(test_bin, src_name) + '.map')\n\n    def execute(self, args, pass_args, cwd):\n        print('Generating test binaries...')\n        print('')\n\n        binutils_path = os.path.join('third_party', 'binutils-ppc-cygwin')\n        ppc_as = os.path.join(binutils_path, 'powerpc-none-elf-as')\n        ppc_ld = os.path.join(binutils_path, 'powerpc-none-elf-ld')\n        ppc_objdump = os.path.join(binutils_path, 'powerpc-none-elf-objdump')\n        ppc_nm = os.path.join(binutils_path, 'powerpc-none-elf-nm')\n\n        test_src = os.path.join('src', 'xenia', 'cpu', 'ppc', 'testing')\n        test_bin = os.path.join(test_src, 'bin')\n\n        # Ensure the test output path exists.\n        if not os.path.exists(test_bin):\n            os.mkdir(test_bin)\n\n        src_files = [os.path.join(root, name)\n                     for root, dirs, files in os.walk('src')\n                     for name in files\n                     if (name.startswith('instr_') or name.startswith('seq_'))\n                     and name.endswith(('.s'))]\n\n        any_errors = False\n\n        pool_func = partial(GenTestsCommand.process_src_file, test_bin, ppc_as, ppc_objdump, ppc_ld, ppc_nm)\n        with Pool() as pool:\n            pool.map(pool_func, src_files)\n\n\n        if any_errors:\n            print('ERROR: failed to build one or more tests.')\n            return 1\n\n        return 0\n\n\nclass GpuTestCommand(BaseBuildCommand):\n    \"\"\"'gputest' command.\"\"\"\n\n    def __init__(self, subparsers, *args, **kwargs):\n        super(GpuTestCommand, self).__init__(\n            subparsers,\n            name='gputest',\n            help_short='Runs automated GPU diff tests against reference imagery.',\n            help_long='''\n            To pass arguments to the test executables separate them with `--`.\n            ''',\n            *args, **kwargs)\n        self.parser.add_argument(\n            '--no_build', action='store_true',\n            help='Don\\'t build before running tests.')\n        self.parser.add_argument(\n            '--update_reference_files', action='store_true',\n            help='Update all reference imagery.')\n        self.parser.add_argument(\n            '--generate_missing_reference_files', action='store_true',\n            help='Create reference files for new traces.')\n\n    def execute(self, args, pass_args, cwd):\n        print('Testinging...')\n        print('')\n\n        # The test executables that will be built and run.\n        test_targets = args['target'] or [\n            'xenia-gpu-vulkan-trace-dump',\n            ]\n        args['target'] = test_targets\n\n        # Build all targets (if desired).\n        if not args['no_build']:\n            result = super(GpuTestCommand, self).execute(args, [], cwd)\n            if result:\n                print('Failed to build, aborting test run.')\n                return result\n\n        # Ensure all targets exist before we run.\n        test_executables = [\n            get_bin(os.path.join(get_build_bin_path(args), test_target))\n            for test_target in test_targets]\n        for i in range(0, len(test_targets)):\n            if test_executables[i] is None:\n                print('ERROR: Unable to find %s - build it.' % (test_targets[i]))\n                return 1\n\n        output_path = os.path.join(self_path, 'build', 'gputest')\n        if os.path.isdir(output_path):\n            shutil.rmtree(output_path)\n        os.makedirs(output_path)\n        print('Running tests and outputting to %s...' % (output_path))\n\n        reference_trace_root = os.path.join(self_path, 'testdata',\n                                            'reference-gpu-traces')\n\n        # Run tests.\n        any_failed = False\n        result = shell_call([\n            sys.executable,\n            os.path.join(self_path, 'tools', 'gpu-trace-diff'),\n            '--executable=' + test_executables[0],\n            '--trace_path=' + os.path.join(reference_trace_root, 'traces'),\n            '--output_path=' + output_path,\n            '--reference_path=' + os.path.join(reference_trace_root, 'references'),\n            ] + (['--generate_missing_reference_files'] if args['generate_missing_reference_files'] else []) +\n                (['--update_reference_files'] if args['update_reference_files'] else []) +\n                            pass_args,\n                            throw_on_error=False)\n        if result:\n            any_failed = True\n\n        if any_failed:\n            print('ERROR: one or more tests failed.')\n            result = 1\n        print('Check %s/results.html for more details.' % (output_path))\n        return result\n\n\nclass CleanCommand(Command):\n    \"\"\"'clean' command.\"\"\"\n\n    def __init__(self, subparsers, *args, **kwargs):\n        super(CleanCommand, self).__init__(\n            subparsers,\n            name='clean',\n            help_short='Removes intermediate files and build outputs.',\n            *args, **kwargs)\n        self.parser.add_argument(\n            '--target_os', default=None,\n            help='Target OS passed to premake, for cross-compilation')\n\n    def execute(self, args, pass_args, cwd):\n        print('Cleaning build artifacts...')\n        print('')\n\n        print('- premake clean...')\n        run_premake(get_premake_target_os(args['target_os']), 'clean')\n        print('')\n\n        print('Success!')\n        return 0\n\n\nclass NukeCommand(Command):\n    \"\"\"'nuke' command.\"\"\"\n\n    def __init__(self, subparsers, *args, **kwargs):\n        super(NukeCommand, self).__init__(\n            subparsers,\n            name='nuke',\n            help_short='Removes all build/ output.',\n            *args, **kwargs)\n        self.parser.add_argument(\n            '--target_os', default=None,\n            help='Target OS passed to premake, for cross-compilation')\n\n    def execute(self, args, pass_args, cwd):\n        print('Cleaning build artifacts...')\n        print('')\n\n        print('- removing build/...')\n        if os.path.isdir('build/'):\n            shutil.rmtree('build/')\n        print('')\n\n        print('- git reset to master...')\n        shell_call([\n            'git',\n            'reset',\n            '--hard',\n            'master',\n            ])\n        print('')\n\n        print('- running premake...')\n        run_platform_premake(target_os_override=args['target_os'])\n        print('')\n\n        print('Success!')\n        return 0\n\n\ndef find_xenia_source_files():\n    \"\"\"Gets all xenia source files in the project.\n\n    Returns:\n      A list of file paths.\n    \"\"\"\n    return [os.path.join(root, name)\n            for root, dirs, files in os.walk('src')\n            for name in files\n            if name.endswith(('.cc', '.c', '.h', '.inl', '.inc'))]\n\n\ndef find_all_source_files():\n    \"\"\"Gets all interesting source files in the project.\n\n    Returns:\n      A list of file paths.\n    \"\"\"\n    return find_xenia_source_files()\n\n\nclass LintCommand(Command):\n    \"\"\"'lint' command.\"\"\"\n\n    def __init__(self, subparsers, *args, **kwargs):\n        super(LintCommand, self).__init__(\n            subparsers,\n            name='lint',\n            help_short='Checks for lint errors with clang-format.',\n            *args, **kwargs)\n        self.parser.add_argument(\n            '--all', action='store_true',\n            help='Lint all files, not just those changed.')\n        self.parser.add_argument(\n            '--origin', action='store_true',\n            help='Lints all files changed relative to origin/master.')\n\n    def execute(self, args, pass_args, cwd):\n        clang_format_binary = get_clang_format_binary()\n\n        difftemp = '.difftemp.txt'\n\n        if args['all']:\n            all_files = find_all_source_files()\n            all_files.sort()\n            print('- linting %d files' % (len(all_files)))\n            any_errors = False\n            for file_path in all_files:\n                if os.path.exists(difftemp): os.remove(difftemp)\n                ret = shell_call([\n                    clang_format_binary,\n                    '-output-replacements-xml',\n                    '-style=file',\n                    file_path,\n                    ], throw_on_error=False, stdout_path=difftemp)\n                with open(difftemp) as f:\n                    had_errors = '<replacement ' in f.read()\n                if os.path.exists(difftemp): os.remove(difftemp)\n                if had_errors:\n                    any_errors = True\n                    print('')\n                    print(file_path)\n                    shell_call([\n                        clang_format_binary,\n                        '-style=file',\n                        file_path,\n                        ], throw_on_error=False, stdout_path=difftemp)\n                    shell_call([\n                        sys.executable,\n                        'tools/diff.py',\n                        file_path,\n                        difftemp,\n                        difftemp,\n                        ])\n                    shell_call([\n                        'type' if sys.platform == 'win32' else 'cat',\n                        difftemp,\n                        ], shell=True if sys.platform == 'win32' else False)\n                    if os.path.exists(difftemp): os.remove(difftemp)\n                    print('')\n            print('')\n            if any_errors:\n                print('ERROR: 1+ diffs. Stage changes and run \\'xb format\\' to fix.')\n                return 1\n            else:\n                print('Linting completed successfully.')\n                return 0\n        else:\n            print('- git-clang-format --diff')\n            if os.path.exists(difftemp): os.remove(difftemp)\n            ret = shell_call([\n                sys.executable,\n                'third_party/clang-format/git-clang-format',\n                '--binary=%s' % (clang_format_binary),\n                '--commit=%s' % ('origin/master' if args['origin'] else 'HEAD'),\n                '--style=file',\n                '--diff',\n                ], throw_on_error=False, stdout_path=difftemp)\n            with open(difftemp) as f:\n                contents = f.read()\n                not_modified = 'no modified files' in contents\n                not_modified = not_modified or 'did not modify' in contents\n                f.close()\n            if os.path.exists(difftemp): os.remove(difftemp)\n            if not not_modified:\n                any_errors = True\n                print('')\n                shell_call([\n                    sys.executable,\n                    'third_party/clang-format/git-clang-format',\n                    '--binary=%s' % (clang_format_binary),\n                    '--commit=%s' % ('origin/master' if args['origin'] else 'HEAD'),\n                    '--style=file',\n                    '--diff',\n                    ])\n                print('ERROR: 1+ diffs. Stage changes and run \\'xb format\\' to fix.')\n                return 1\n            else:\n                print('Linting completed successfully.')\n                return 0\n\n\nclass FormatCommand(Command):\n    \"\"\"'format' command.\"\"\"\n\n    def __init__(self, subparsers, *args, **kwargs):\n        super(FormatCommand, self).__init__(\n            subparsers,\n            name='format',\n            help_short='Reformats staged code with clang-format.',\n            *args, **kwargs)\n        self.parser.add_argument(\n            '--all', action='store_true',\n            help='Format all files, not just those changed.')\n        self.parser.add_argument(\n            '--origin', action='store_true',\n            help='Formats all files changed relative to origin/master.')\n\n    def execute(self, args, pass_args, cwd):\n        clang_format_binary = get_clang_format_binary()\n\n        if args['all']:\n            all_files = find_all_source_files()\n            all_files.sort()\n            print('- clang-format [%d files]' % (len(all_files)))\n            any_errors = False\n            for file_path in all_files:\n                ret = shell_call([\n                    clang_format_binary,\n                    '-i',\n                    '-style=file',\n                    file_path,\n                    ], throw_on_error=False)\n                if ret:\n                    any_errors = True\n            print('')\n            if any_errors:\n                print('ERROR: 1+ clang-format calls failed.')\n                print('Ensure all files are staged.')\n                return 1\n            else:\n                print('Formatting completed successfully.')\n                return 0\n        else:\n            print('- git-clang-format')\n            shell_call([\n                sys.executable,\n                'third_party/clang-format/git-clang-format',\n                '--binary=%s' % (clang_format_binary),\n                '--commit=%s' % ('origin/master' if args['origin'] else 'HEAD'),\n                ])\n            print('')\n\n        return 0\n\n\n# TODO(benvanik): merge into linter, or as lint --anal?\nclass StyleCommand(Command):\n    \"\"\"'style' command.\"\"\"\n\n    def __init__(self, subparsers, *args, **kwargs):\n        super(StyleCommand, self).__init__(\n            subparsers,\n            name='style',\n            help_short='Runs the style checker on all code.',\n            *args, **kwargs)\n\n    def execute(self, args, pass_args, cwd):\n        all_files = [file_path for file_path in find_all_source_files()\n                     if not file_path.endswith('_test.cc')]\n        print('- cpplint [%d files]' % (len(all_files)))\n        ret = shell_call([\n            sys.executable,\n            'third_party/google-styleguide/cpplint/cpplint.py',\n            '--output=vs7',\n            '--linelength=80',\n            '--filter=-build/c++11,+build/include_alpha',\n            '--root=src',\n            ] + all_files, throw_on_error=False)\n        print('')\n        if ret:\n            print('ERROR: 1+ cpplint calls failed.')\n            return 1\n        else:\n            print('Style linting completed successfully.')\n            return 0\n\n\n# TODO(benvanik): merge into linter, or as lint --anal?\nclass TidyCommand(Command):\n    \"\"\"'tidy' command.\"\"\"\n\n    def __init__(self, subparsers, *args, **kwargs):\n        super(TidyCommand, self).__init__(\n            subparsers,\n            name='tidy',\n            help_short='Runs the clang-tidy checker on all code.',\n            *args, **kwargs)\n        self.parser.add_argument(\n            '--fix', action='store_true',\n            help='Applies suggested fixes, where possible.')\n        self.parser.add_argument(\n            '--target_os', default=None,\n            help='Target OS passed to premake, for cross-compilation')\n\n    def execute(self, args, pass_args, cwd):\n        # Run premake to generate our compile_commands.json file for clang to use.\n        # TODO(benvanik): only do linux? whatever clang-tidy is ok with.\n        run_premake(get_premake_target_os(args['target_os']),\n                    'export-compile-commands')\n\n        platform_name = ''\n        if sys.platform == 'darwin':\n            platform_name = 'darwin'\n        elif sys.platform == 'win32':\n            platform_name = 'windows'\n        else:\n            platform_name = 'linux'\n        tool_root = 'build/llvm_tools/debug_%s' % platform_name\n\n        all_files = [file_path for file_path in find_all_source_files()\n                     if not file_path.endswith('_test.cc')]\n        # Tidy only likes .cc files.\n        all_files = [file_path for file_path in all_files\n                     if file_path.endswith('.cc')]\n\n        any_errors = False\n        for file in all_files:\n            print('- clang-tidy %s' % (file))\n            ret = shell_call([\n                'clang-tidy',\n                '-p', tool_root,\n                '-checks=' + ','.join([\n                    'clang-analyzer-*',\n                    'google-*',\n                    'misc-*',\n                    'modernize-*'\n                    # TODO(benvanik): pick the ones we want - some are silly.\n                    # 'readability-*',\n                ]),\n                ] + (['-fix'] if args['fix'] else []) + [\n                    file,\n                ], throw_on_error=False)\n            if ret:\n                any_errors = True\n\n        print('')\n        if any_errors:\n            print('ERROR: 1+ clang-tidy calls failed.')\n            return 1\n        else:\n            print('Tidy completed successfully.')\n            return 0\n\nclass StubCommand(Command):\n    \"\"\"'stub' command.\"\"\"\n\n    def __init__(self, subparsers, *args, **kwargs):\n        super(StubCommand, self).__init__(\n            subparsers,\n            name='stub',\n            help_short='Create new file(s) in the xenia source tree and run premake',\n            *args, **kwargs)\n        self.parser.add_argument(\n            '--file', default=None,\n            help='Generate a source file at the provided location in the source tree')\n        self.parser.add_argument(\n            '--class', default=None,\n            help='Generate a class pair (.cc/.h) at the provided location in the source tree')\n        self.parser.add_argument(\n            '--target_os', default=None,\n            help='Target OS passed to premake, for cross-compilation')\n\n    def execute(self, args, pass_args, cwd):\n        root = os.path.dirname(os.path.realpath(__file__))\n        source_root = os.path.join(root, os.path.normpath('src/xenia'))\n\n        if args['class']:\n            path = os.path.normpath(os.path.join(source_root, args['class']))\n            target_dir = os.path.dirname(path)\n            class_name = os.path.basename(path)\n\n            status = generate_source_class(path)\n            if status > 0:\n                return status\n\n            print('Created class \\'{0}\\' at {1}'.format(class_name, target_dir))\n\n        elif args['file']:\n            path = os.path.normpath(os.path.join(source_root, args['file']))\n            target_dir = os.path.dirname(path)\n            file_name = os.path.basename(path)\n\n            status = generate_source_file(path)\n            if status > 0:\n                return status\n\n            print('Created file \\'{0}\\' at {1}'.format(file_name, target_dir))\n\n        else:\n            print('ERROR: Please specify a file/class to generate')\n            return 1\n\n        run_platform_premake(target_os_override=args['target_os'])\n        return 0\n\nclass DevenvCommand(Command):\n    \"\"\"'devenv' command.\"\"\"\n\n    def __init__(self, subparsers, *args, **kwargs):\n        super(DevenvCommand, self).__init__(\n            subparsers,\n            name='devenv',\n            help_short='Launches the development environment.',\n            *args, **kwargs)\n\n    def execute(self, args, pass_args, cwd):\n        devenv = None\n        show_reload_prompt = False\n        if sys.platform == 'win32':\n            if vs_version is None:\n                print('ERROR: Visual Studio is not installed.');\n                return 1\n            print('Launching Visual Studio...')\n        elif sys.platform == 'darwin':\n            print('Launching Xcode...')\n            devenv = 'xcode4'\n        elif has_bin('clion') or has_bin('clion.sh'):\n            print('Launching CLion...')\n            show_reload_prompt = create_clion_workspace()\n            devenv = 'cmake'\n        else:\n            print('Launching CodeLite...')\n            devenv = 'codelite'\n        print('')\n\n        print('- running premake...')\n        run_platform_premake(devenv=devenv)\n        print('')\n\n        print('- launching devenv...')\n        if show_reload_prompt:\n            print_box('Please run \"File ⇒ ↺ Reload CMake Project\" from inside the IDE!')\n        if sys.platform == 'win32':\n            shell_call([\n                'devenv',\n                'build\\\\xenia.sln',\n            ])\n        elif sys.platform == 'darwin':\n            shell_call([\n                'xed',\n                'build/xenia.xcworkspace',\n            ])\n        elif has_bin('clion'):\n            shell_call([\n                'clion',\n                '.',\n            ])\n        elif has_bin('clion.sh'):\n            shell_call([\n                'clion.sh',\n                '.',\n            ])\n        else:\n            shell_call([\n                'codelite',\n                'build/xenia.workspace',\n            ])\n        print('')\n\n        return 0\n\n\nif __name__ == '__main__':\n    main()\n"
  },
  {
    "path": "xeniarc",
    "content": "# Copyright 2015 Ben Vanik. All Rights Reserved.\n#\n# Useful bash aliases and completions.\n\nalias xb='python xenia-build'\n"
  }
]